ZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2N2M1NGQKLS0tIC9kZXYvbnVsbAorKysgYi8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMzEgQEAKKyMgbWF2ZW4gbm9pc2UKK3RhcmdldC8KKworIyBncmFkbGUgbm9pc2UKKy5ncmFkbGUKKworIyBvc3ggbm9pc2UKKy5EU19TdG9yZQorcHJvZmlsZQorCisjIEludGVsbGlKIElkZWEgbm9pc2UKKy5pZGVhCisqLml3cworKi5pcHIKKyouaW1sCisqLnJlbGVhc2VCYWNrdXAKK2F0bGFzc2lhbi1pZGUtcGx1Z2luLnhtbAorCisjIE5CIG5vaXNlCituYmFjdGlvbnMueG1sCituYi1jb25maWd1cmF0aW9uLnhtbAorCisjIEVjbGlwc2Ugbm9pc2UKKy5zZXR0aW5ncworLnNldHRpbmdzLyoKKy5wcm9qZWN0CisuY2xhc3NwYXRoCisKKyMgTWF2ZW4gcGx1Z2lucyBub2lzZQorZGVwZW5kZW5jeS1yZWR1Y2VkLXBvbS54bWwKK3BvbS54bWwudmVyc2lvbnNCYWNrdXAKZGlmZiAtLWdpdCBhL0NPTlRSSUJVVElORy5tZCBiL0NPTlRSSUJVVElORy5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDJiOWRiCi0tLSAvZGV2L251bGwKKysrIGIvQ09OVFJJQlVUSU5HLm1kCkBAIC0wLDAgKzEsNjQgQEAKK1svL106ICMgIiBDb3B5cmlnaHQgKGMpIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIg0KK1svL106ICMgIiAgIg0KK1svL106ICMgIiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgIg0KK1svL106ICMgIiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCAiDQorWy8vXTogIyAiIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4gIg0KK1svL106ICMgIiAgIg0KK1svL106ICMgIiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5ICINCitbLy9dOiAjICIgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZSAiDQorWy8vXTogIyAiIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCAiDQorWy8vXTogIyAiIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0ICINCitbLy9dOiAjICIgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLiAiDQorWy8vXTogIyAiICAiDQorWy8vXTogIyAiIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMCAiDQorDQorIyBDb250cmlidXRpbmcgdG8gRWNsaXBzZSBKZXJzZXkNCisNCitUaGFua3MgZm9yIHlvdXIgaW50ZXJlc3QgaW4gdGhpcyBwcm9qZWN0Lg0KKw0KKyMjIFByb2plY3QgZGVzY3JpcHRpb24NCisNCitFY2xpcHNlIEplcnNleSBpcyBhIFJFU1QgZnJhbWV3b3JrIHRoYXQgcHJvdmlkZXMgYSBKQVgtUlMgKEpTUi0zNzApIGltcGxlbWVudGF0aW9uIGFuZCBtb3JlLiANCitKZXJzZXkgcHJvdmlkZXMgaXRzIG93biBBUElzIHRoYXQgZXh0ZW5kIHRoZSBKQVgtUlMgdG9vbGtpdCB3aXRoIGFkZGl0aW9uYWwgZmVhdHVyZXMgYW5kIHV0aWxpdGllcyANCit0byBmdXJ0aGVyIHNpbXBsaWZ5IFJFU1RmdWwgc2VydmljZSBhbmQgY2xpZW50IGRldmVsb3BtZW50LiBKZXJzZXkgYWxzbyBleHBvc2VzIG51bWVyb3VzIGV4dGVuc2lvbiANCitTUElzIHNvIHRoYXQgZGV2ZWxvcGVycyBtYXkgZXh0ZW5kIEplcnNleSB0byBiZXN0IHN1aXQgdGhlaXIgbmVlZHMuDQorIA0KK0dvYWxzIG9mIEplcnNleSBwcm9qZWN0IGNhbiBiZSBzdW1tYXJpemVkIGluIHRoZSBmb2xsb3dpbmcgcG9pbnRzOg0KKyogVHJhY2sgdGhlIEpBWC1SUyBBUEkgYW5kIHByb3ZpZGUgcmVndWxhciByZWxlYXNlcyBvZiBwcm9kdWN0aW9uIHF1YWxpdHkgaW1wbGVtZW50YXRpb25zIHRoYXQgc2hpcHMgd2l0aCBHbGFzc0Zpc2g7DQorDQorKiBQcm92aWRlIEFQSXMgdG8gZXh0ZW5kIEplcnNleSAmIEJ1aWxkIGEgY29tbXVuaXR5IG9mIHVzZXJzIGFuZCBkZXZlbG9wZXJzOyBhbmQgZmluYWxseQ0KKw0KKyogTWFrZSBpdCBlYXN5IHRvIGJ1aWxkIFJFU1RmdWwgV2ViIHNlcnZpY2VzIHV0aWxpc2luZyBKYXZhIGFuZCB0aGUgSmF2YSBWaXJ0dWFsIE1hY2hpbmUuDQorDQorIyMgRGV2ZWxvcGVyIHJlc291cmNlcw0KKw0KK0luZm9ybWF0aW9uIHJlZ2FyZGluZyBzb3VyY2UgY29kZSBtYW5hZ2VtZW50LCBidWlsZHMsIGNvZGluZyBzdGFuZGFyZHMsIGFuZA0KK21vcmUuDQorDQorKiBodHRwczovL3Byb2plY3RzLmVjbGlwc2Uub3JnL3Byb2plY3RzL2VlNGouamVyc2V5L2RldmVsb3Blcg0KKw0KK1RoZSBwcm9qZWN0IG1haW50YWlucyB0aGUgZm9sbG93aW5nIHNvdXJjZSBjb2RlIHJlcG9zaXRvcmllcw0KKw0KKyogaHR0cHM6Ly9naXRodWIuY29tL2VjbGlwc2UtZWU0ai9qZXJzZXkNCisNCisjIyBFY2xpcHNlIENvbnRyaWJ1dG9yIEFncmVlbWVudA0KKw0KK0JlZm9yZSB5b3VyIGNvbnRyaWJ1dGlvbiBjYW4gYmUgYWNjZXB0ZWQgYnkgdGhlIHByb2plY3QgdGVhbSBjb250cmlidXRvcnMgbXVzdA0KK2VsZWN0cm9uaWNhbGx5IHNpZ24gdGhlIEVjbGlwc2UgQ29udHJpYnV0b3IgQWdyZWVtZW50IChFQ0EpLg0KKw0KKyogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9FQ0EucGhwDQorDQorQ29tbWl0cyB0aGF0IGFyZSBwcm92aWRlZCBieSBub24tY29tbWl0dGVycyBtdXN0IGhhdmUgYSBTaWduZWQtb2ZmLWJ5IGZpZWxkIGluDQordGhlIGZvb3RlciBpbmRpY2F0aW5nIHRoYXQgdGhlIGF1dGhvciBpcyBhd2FyZSBvZiB0aGUgdGVybXMgYnkgd2hpY2ggdGhlDQorY29udHJpYnV0aW9uIGhhcyBiZWVuIHByb3ZpZGVkIHRvIHRoZSBwcm9qZWN0LiBUaGUgbm9uLWNvbW1pdHRlciBtdXN0DQorYWRkaXRpb25hbGx5IGhhdmUgYW4gRWNsaXBzZSBGb3VuZGF0aW9uIGFjY291bnQgYW5kIG11c3QgaGF2ZSBhIHNpZ25lZCBFY2xpcHNlDQorQ29udHJpYnV0b3IgQWdyZWVtZW50IChFQ0EpIG9uIGZpbGUuDQorDQorRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBzZWUgdGhlIEVjbGlwc2UgQ29tbWl0dGVyIEhhbmRib29rOg0KK2h0dHBzOi8vd3d3LmVjbGlwc2Uub3JnL3Byb2plY3RzL2hhbmRib29rLyNyZXNvdXJjZXMtY29tbWl0DQorDQorIyMgQ29udGFjdA0KKw0KK0NvbnRhY3QgdGhlIHByb2plY3QgZGV2ZWxvcGVycyB2aWEgdGhlIHByb2plY3QncyAiZGV2IiBsaXN0Lg0KKw0KKyogaHR0cHM6Ly9kZXYuZWNsaXBzZS5vcmcvbWFpbG1hbi9saXN0aW5mby9qZXJzZXktZGV2DQpkaWZmIC0tZ2l0IGEvTElDRU5TRS5tZCBiL0xJQ0VOU0UubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ1ZmMzNwotLS0gL2Rldi9udWxsCisrKyBiL0xJQ0VOU0UubWQKQEAgLTAsMCArMSw2MzcgQEAKKyMgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSAtIHYgMi4wCisKKyAgICAgICAgVEhFIEFDQ09NUEFOWUlORyBQUk9HUkFNIElTIFBST1ZJREVEIFVOREVSIFRIRSBURVJNUyBPRiBUSElTIEVDTElQU0UKKyAgICAgICAgUFVCTElDIExJQ0VOU0UgKCJBR1JFRU1FTlQiKS4gQU5ZIFVTRSwgUkVQUk9EVUNUSU9OIE9SIERJU1RSSUJVVElPTgorICAgICAgICBPRiBUSEUgUFJPR1JBTSBDT05TVElUVVRFUyBSRUNJUElFTlQnUyBBQ0NFUFRBTkNFIE9GIFRISVMgQUdSRUVNRU5ULgorCisgICAgMS4gREVGSU5JVElPTlMKKworICAgICJDb250cmlidXRpb24iIG1lYW5zOgorCisgICAgICBhKSBpbiB0aGUgY2FzZSBvZiB0aGUgaW5pdGlhbCBDb250cmlidXRvciwgdGhlIGluaXRpYWwgY29udGVudAorICAgICAgICAgRGlzdHJpYnV0ZWQgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIGFuZAorCisgICAgICBiKSBpbiB0aGUgY2FzZSBvZiBlYWNoIHN1YnNlcXVlbnQgQ29udHJpYnV0b3I6CisgICAgICAgICBpKSBjaGFuZ2VzIHRvIHRoZSBQcm9ncmFtLCBhbmQKKyAgICAgICAgIGlpKSBhZGRpdGlvbnMgdG8gdGhlIFByb2dyYW07CisgICAgICB3aGVyZSBzdWNoIGNoYW5nZXMgYW5kL29yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSBvcmlnaW5hdGUgZnJvbQorICAgICAgYW5kIGFyZSBEaXN0cmlidXRlZCBieSB0aGF0IHBhcnRpY3VsYXIgQ29udHJpYnV0b3IuIEEgQ29udHJpYnV0aW9uCisgICAgICAib3JpZ2luYXRlcyIgZnJvbSBhIENvbnRyaWJ1dG9yIGlmIGl0IHdhcyBhZGRlZCB0byB0aGUgUHJvZ3JhbSBieQorICAgICAgc3VjaCBDb250cmlidXRvciBpdHNlbGYgb3IgYW55b25lIGFjdGluZyBvbiBzdWNoIENvbnRyaWJ1dG9yJ3MgYmVoYWxmLgorICAgICAgQ29udHJpYnV0aW9ucyBkbyBub3QgaW5jbHVkZSBjaGFuZ2VzIG9yIGFkZGl0aW9ucyB0byB0aGUgUHJvZ3JhbSB0aGF0CisgICAgICBhcmUgbm90IE1vZGlmaWVkIFdvcmtzLgorCisgICAgIkNvbnRyaWJ1dG9yIiBtZWFucyBhbnkgcGVyc29uIG9yIGVudGl0eSB0aGF0IERpc3RyaWJ1dGVzIHRoZSBQcm9ncmFtLgorCisgICAgIkxpY2Vuc2VkIFBhdGVudHMiIG1lYW4gcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlIGJ5IGEgQ29udHJpYnV0b3Igd2hpY2gKKyAgICBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZSB1c2Ugb3Igc2FsZSBvZiBpdHMgQ29udHJpYnV0aW9uIGFsb25lCisgICAgb3Igd2hlbiBjb21iaW5lZCB3aXRoIHRoZSBQcm9ncmFtLgorCisgICAgIlByb2dyYW0iIG1lYW5zIHRoZSBDb250cmlidXRpb25zIERpc3RyaWJ1dGVkIGluIGFjY29yZGFuY2Ugd2l0aCB0aGlzCisgICAgQWdyZWVtZW50LgorCisgICAgIlJlY2lwaWVudCIgbWVhbnMgYW55b25lIHdobyByZWNlaXZlcyB0aGUgUHJvZ3JhbSB1bmRlciB0aGlzIEFncmVlbWVudAorICAgIG9yIGFueSBTZWNvbmRhcnkgTGljZW5zZSAoYXMgYXBwbGljYWJsZSksIGluY2x1ZGluZyBDb250cmlidXRvcnMuCisKKyAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2UgQ29kZSBvciBvdGhlcgorICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFByb2dyYW0gYW5kIGZvciB3aGljaCB0aGUKKyAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCisgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuCisKKyAgICAiTW9kaWZpZWQgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmsgaW4gU291cmNlIENvZGUgb3Igb3RoZXIgZm9ybSB0aGF0CisgICAgcmVzdWx0cyBmcm9tIGFuIGFkZGl0aW9uIHRvLCBkZWxldGlvbiBmcm9tLCBvciBtb2RpZmljYXRpb24gb2YgdGhlCisgICAgY29udGVudHMgb2YgdGhlIFByb2dyYW0sIGluY2x1ZGluZywgZm9yIHB1cnBvc2VzIG9mIGNsYXJpdHkgYW55IG5ldyBmaWxlCisgICAgaW4gU291cmNlIENvZGUgZm9ybSB0aGF0IGNvbnRhaW5zIGFueSBjb250ZW50cyBvZiB0aGUgUHJvZ3JhbS4gTW9kaWZpZWQKKyAgICBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IGNvbnRhaW4gb25seSBkZWNsYXJhdGlvbnMsCisgICAgaW50ZXJmYWNlcywgdHlwZXMsIGNsYXNzZXMsIHN0cnVjdHVyZXMsIG9yIGZpbGVzIG9mIHRoZSBQcm9ncmFtIHNvbGVseQorICAgIGluIGVhY2ggY2FzZSBpbiBvcmRlciB0byBsaW5rIHRvLCBiaW5kIGJ5IG5hbWUsIG9yIHN1YmNsYXNzIHRoZSBQcm9ncmFtCisgICAgb3IgTW9kaWZpZWQgV29ya3MgdGhlcmVvZi4KKworICAgICJEaXN0cmlidXRlIiBtZWFucyB0aGUgYWN0cyBvZiBhKSBkaXN0cmlidXRpbmcgb3IgYikgbWFraW5nIGF2YWlsYWJsZQorICAgIGluIGFueSBtYW5uZXIgdGhhdCBlbmFibGVzIHRoZSB0cmFuc2ZlciBvZiBhIGNvcHkuCisKKyAgICAiU291cmNlIENvZGUiIG1lYW5zIHRoZSBmb3JtIG9mIGEgUHJvZ3JhbSBwcmVmZXJyZWQgZm9yIG1ha2luZworICAgIG1vZGlmaWNhdGlvbnMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsCisgICAgZG9jdW1lbnRhdGlvbiBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgorCisgICAgIlNlY29uZGFyeSBMaWNlbnNlIiBtZWFucyBlaXRoZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIFZlcnNpb24gMi4wLCBvciBhbnkgbGF0ZXIgdmVyc2lvbnMgb2YgdGhhdCBsaWNlbnNlLCBpbmNsdWRpbmcgYW55CisgICAgZXhjZXB0aW9ucyBvciBhZGRpdGlvbmFsIHBlcm1pc3Npb25zIGFzIGlkZW50aWZpZWQgYnkgdGhlIGluaXRpYWwKKyAgICBDb250cmlidXRvci4KKworICAgIDIuIEdSQU5UIE9GIFJJR0hUUworCisgICAgICBhKSBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBvZiB0aGlzIEFncmVlbWVudCwgZWFjaCBDb250cmlidXRvciBoZXJlYnkKKyAgICAgIGdyYW50cyBSZWNpcGllbnQgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZSBjb3B5cmlnaHQKKyAgICAgIGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsIHB1YmxpY2x5IGRpc3BsYXksCisgICAgICBwdWJsaWNseSBwZXJmb3JtLCBEaXN0cmlidXRlIGFuZCBzdWJsaWNlbnNlIHRoZSBDb250cmlidXRpb24gb2Ygc3VjaAorICAgICAgQ29udHJpYnV0b3IsIGlmIGFueSwgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3Jrcy4KKworICAgICAgYikgU3ViamVjdCB0byB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5CisgICAgICBncmFudHMgUmVjaXBpZW50IGEgbm9uLWV4Y2x1c2l2ZSwgd29ybGR3aWRlLCByb3lhbHR5LWZyZWUgcGF0ZW50CisgICAgICBsaWNlbnNlIHVuZGVyIExpY2Vuc2VkIFBhdGVudHMgdG8gbWFrZSwgdXNlLCBzZWxsLCBvZmZlciB0byBzZWxsLAorICAgICAgaW1wb3J0IGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIENvbnRyaWJ1dGlvbiBvZiBzdWNoIENvbnRyaWJ1dG9yLAorICAgICAgaWYgYW55LCBpbiBTb3VyY2UgQ29kZSBvciBvdGhlciBmb3JtLiBUaGlzIHBhdGVudCBsaWNlbnNlIHNoYWxsCisgICAgICBhcHBseSB0byB0aGUgY29tYmluYXRpb24gb2YgdGhlIENvbnRyaWJ1dGlvbiBhbmQgdGhlIFByb2dyYW0gaWYsIGF0CisgICAgICB0aGUgdGltZSB0aGUgQ29udHJpYnV0aW9uIGlzIGFkZGVkIGJ5IHRoZSBDb250cmlidXRvciwgc3VjaCBhZGRpdGlvbgorICAgICAgb2YgdGhlIENvbnRyaWJ1dGlvbiBjYXVzZXMgc3VjaCBjb21iaW5hdGlvbiB0byBiZSBjb3ZlcmVkIGJ5IHRoZQorICAgICAgTGljZW5zZWQgUGF0ZW50cy4gVGhlIHBhdGVudCBsaWNlbnNlIHNoYWxsIG5vdCBhcHBseSB0byBhbnkgb3RoZXIKKyAgICAgIGNvbWJpbmF0aW9ucyB3aGljaCBpbmNsdWRlIHRoZSBDb250cmlidXRpb24uIE5vIGhhcmR3YXJlIHBlciBzZSBpcworICAgICAgbGljZW5zZWQgaGVyZXVuZGVyLgorCisgICAgICBjKSBSZWNpcGllbnQgdW5kZXJzdGFuZHMgdGhhdCBhbHRob3VnaCBlYWNoIENvbnRyaWJ1dG9yIGdyYW50cyB0aGUKKyAgICAgIGxpY2Vuc2VzIHRvIGl0cyBDb250cmlidXRpb25zIHNldCBmb3J0aCBoZXJlaW4sIG5vIGFzc3VyYW5jZXMgYXJlCisgICAgICBwcm92aWRlZCBieSBhbnkgQ29udHJpYnV0b3IgdGhhdCB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBpbmZyaW5nZSB0aGUKKyAgICAgIHBhdGVudCBvciBvdGhlciBpbnRlbGxlY3R1YWwgcHJvcGVydHkgcmlnaHRzIG9mIGFueSBvdGhlciBlbnRpdHkuCisgICAgICBFYWNoIENvbnRyaWJ1dG9yIGRpc2NsYWltcyBhbnkgbGlhYmlsaXR5IHRvIFJlY2lwaWVudCBmb3IgY2xhaW1zCisgICAgICBicm91Z2h0IGJ5IGFueSBvdGhlciBlbnRpdHkgYmFzZWQgb24gaW5mcmluZ2VtZW50IG9mIGludGVsbGVjdHVhbAorICAgICAgcHJvcGVydHkgcmlnaHRzIG9yIG90aGVyd2lzZS4gQXMgYSBjb25kaXRpb24gdG8gZXhlcmNpc2luZyB0aGUKKyAgICAgIHJpZ2h0cyBhbmQgbGljZW5zZXMgZ3JhbnRlZCBoZXJldW5kZXIsIGVhY2ggUmVjaXBpZW50IGhlcmVieQorICAgICAgYXNzdW1lcyBzb2xlIHJlc3BvbnNpYmlsaXR5IHRvIHNlY3VyZSBhbnkgb3RoZXIgaW50ZWxsZWN0dWFsCisgICAgICBwcm9wZXJ0eSByaWdodHMgbmVlZGVkLCBpZiBhbnkuIEZvciBleGFtcGxlLCBpZiBhIHRoaXJkIHBhcnR5CisgICAgICBwYXRlbnQgbGljZW5zZSBpcyByZXF1aXJlZCB0byBhbGxvdyBSZWNpcGllbnQgdG8gRGlzdHJpYnV0ZSB0aGUKKyAgICAgIFByb2dyYW0sIGl0IGlzIFJlY2lwaWVudCdzIHJlc3BvbnNpYmlsaXR5IHRvIGFjcXVpcmUgdGhhdCBsaWNlbnNlCisgICAgICBiZWZvcmUgZGlzdHJpYnV0aW5nIHRoZSBQcm9ncmFtLgorCisgICAgICBkKSBFYWNoIENvbnRyaWJ1dG9yIHJlcHJlc2VudHMgdGhhdCB0byBpdHMga25vd2xlZGdlIGl0IGhhcworICAgICAgc3VmZmljaWVudCBjb3B5cmlnaHQgcmlnaHRzIGluIGl0cyBDb250cmlidXRpb24sIGlmIGFueSwgdG8gZ3JhbnQKKyAgICAgIHRoZSBjb3B5cmlnaHQgbGljZW5zZSBzZXQgZm9ydGggaW4gdGhpcyBBZ3JlZW1lbnQuCisKKyAgICAgIGUpIE5vdHdpdGhzdGFuZGluZyB0aGUgdGVybXMgb2YgYW55IFNlY29uZGFyeSBMaWNlbnNlLCBubworICAgICAgQ29udHJpYnV0b3IgbWFrZXMgYWRkaXRpb25hbCBncmFudHMgdG8gYW55IFJlY2lwaWVudCAob3RoZXIgdGhhbgorICAgICAgdGhvc2Ugc2V0IGZvcnRoIGluIHRoaXMgQWdyZWVtZW50KSBhcyBhIHJlc3VsdCBvZiBzdWNoIFJlY2lwaWVudCdzCisgICAgICByZWNlaXB0IG9mIHRoZSBQcm9ncmFtIHVuZGVyIHRoZSB0ZXJtcyBvZiBhIFNlY29uZGFyeSBMaWNlbnNlCisgICAgICAoaWYgcGVybWl0dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9uIDMpLgorCisgICAgMy4gUkVRVUlSRU1FTlRTCisKKyAgICAzLjEgSWYgYSBDb250cmlidXRvciBEaXN0cmlidXRlcyB0aGUgUHJvZ3JhbSBpbiBhbnkgZm9ybSwgdGhlbjoKKworICAgICAgYSkgdGhlIFByb2dyYW0gbXVzdCBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIGFzIFNvdXJjZSBDb2RlLCBpbgorICAgICAgYWNjb3JkYW5jZSB3aXRoIHNlY3Rpb24gMy4yLCBhbmQgdGhlIENvbnRyaWJ1dG9yIG11c3QgYWNjb21wYW55CisgICAgICB0aGUgUHJvZ3JhbSB3aXRoIGEgc3RhdGVtZW50IHRoYXQgdGhlIFNvdXJjZSBDb2RlIGZvciB0aGUgUHJvZ3JhbQorICAgICAgaXMgYXZhaWxhYmxlIHVuZGVyIHRoaXMgQWdyZWVtZW50LCBhbmQgaW5mb3JtcyBSZWNpcGllbnRzIGhvdyB0bworICAgICAgb2J0YWluIGl0IGluIGEgcmVhc29uYWJsZSBtYW5uZXIgb24gb3IgdGhyb3VnaCBhIG1lZGl1bSBjdXN0b21hcmlseQorICAgICAgdXNlZCBmb3Igc29mdHdhcmUgZXhjaGFuZ2U7IGFuZAorCisgICAgICBiKSB0aGUgQ29udHJpYnV0b3IgbWF5IERpc3RyaWJ1dGUgdGhlIFByb2dyYW0gdW5kZXIgYSBsaWNlbnNlCisgICAgICBkaWZmZXJlbnQgdGhhbiB0aGlzIEFncmVlbWVudCwgcHJvdmlkZWQgdGhhdCBzdWNoIGxpY2Vuc2U6CisgICAgICAgICBpKSBlZmZlY3RpdmVseSBkaXNjbGFpbXMgb24gYmVoYWxmIG9mIGFsbCBvdGhlciBDb250cmlidXRvcnMgYWxsCisgICAgICAgICB3YXJyYW50aWVzIGFuZCBjb25kaXRpb25zLCBleHByZXNzIGFuZCBpbXBsaWVkLCBpbmNsdWRpbmcKKyAgICAgICAgIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiB0aXRsZSBhbmQgbm9uLWluZnJpbmdlbWVudCwgYW5kCisgICAgICAgICBpbXBsaWVkIHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucyBvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MKKyAgICAgICAgIGZvciBhIHBhcnRpY3VsYXIgcHVycG9zZTsKKworICAgICAgICAgaWkpIGVmZmVjdGl2ZWx5IGV4Y2x1ZGVzIG9uIGJlaGFsZiBvZiBhbGwgb3RoZXIgQ29udHJpYnV0b3JzIGFsbAorICAgICAgICAgbGlhYmlsaXR5IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKKyAgICAgICAgIGluY2lkZW50YWwgYW5kIGNvbnNlcXVlbnRpYWwgZGFtYWdlcywgc3VjaCBhcyBsb3N0IHByb2ZpdHM7CisKKyAgICAgICAgIGlpaSkgZG9lcyBub3QgYXR0ZW1wdCB0byBsaW1pdCBvciBhbHRlciB0aGUgcmVjaXBpZW50cycgcmlnaHRzCisgICAgICAgICBpbiB0aGUgU291cmNlIENvZGUgdW5kZXIgc2VjdGlvbiAzLjI7IGFuZAorCisgICAgICAgICBpdikgcmVxdWlyZXMgYW55IHN1YnNlcXVlbnQgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5IGFueQorICAgICAgICAgcGFydHkgdG8gYmUgdW5kZXIgYSBsaWNlbnNlIHRoYXQgc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudHMKKyAgICAgICAgIG9mIHRoaXMgc2VjdGlvbiAzLgorCisgICAgMy4yIFdoZW4gdGhlIFByb2dyYW0gaXMgRGlzdHJpYnV0ZWQgYXMgU291cmNlIENvZGU6CisKKyAgICAgIGEpIGl0IG11c3QgYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsIG9yIGlmIHRoZQorICAgICAgUHJvZ3JhbSAoaSkgaXMgY29tYmluZWQgd2l0aCBvdGhlciBtYXRlcmlhbCBpbiBhIHNlcGFyYXRlIGZpbGUgb3IKKyAgICAgIGZpbGVzIG1hZGUgYXZhaWxhYmxlIHVuZGVyIGEgU2Vjb25kYXJ5IExpY2Vuc2UsIGFuZCAoaWkpIHRoZSBpbml0aWFsCisgICAgICBDb250cmlidXRvciBhdHRhY2hlZCB0byB0aGUgU291cmNlIENvZGUgdGhlIG5vdGljZSBkZXNjcmliZWQgaW4KKyAgICAgIEV4aGliaXQgQSBvZiB0aGlzIEFncmVlbWVudCwgdGhlbiB0aGUgUHJvZ3JhbSBtYXkgYmUgbWFkZSBhdmFpbGFibGUKKyAgICAgIHVuZGVyIHRoZSB0ZXJtcyBvZiBzdWNoIFNlY29uZGFyeSBMaWNlbnNlcywgYW5kCisKKyAgICAgIGIpIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCBtdXN0IGJlIGluY2x1ZGVkIHdpdGggZWFjaCBjb3B5IG9mCisgICAgICB0aGUgUHJvZ3JhbS4KKworICAgIDMuMyBDb250cmlidXRvcnMgbWF5IG5vdCByZW1vdmUgb3IgYWx0ZXIgYW55IGNvcHlyaWdodCwgcGF0ZW50LAorICAgIHRyYWRlbWFyaywgYXR0cmlidXRpb24gbm90aWNlcywgZGlzY2xhaW1lcnMgb2Ygd2FycmFudHksIG9yIGxpbWl0YXRpb25zCisgICAgb2YgbGlhYmlsaXR5ICgibm90aWNlcyIpIGNvbnRhaW5lZCB3aXRoaW4gdGhlIFByb2dyYW0gZnJvbSBhbnkgY29weSBvZgorICAgIHRoZSBQcm9ncmFtIHdoaWNoIHRoZXkgRGlzdHJpYnV0ZSwgcHJvdmlkZWQgdGhhdCBDb250cmlidXRvcnMgbWF5IGFkZAorICAgIHRoZWlyIG93biBhcHByb3ByaWF0ZSBub3RpY2VzLgorCisgICAgNC4gQ09NTUVSQ0lBTCBESVNUUklCVVRJT04KKworICAgIENvbW1lcmNpYWwgZGlzdHJpYnV0b3JzIG9mIHNvZnR3YXJlIG1heSBhY2NlcHQgY2VydGFpbiByZXNwb25zaWJpbGl0aWVzCisgICAgd2l0aCByZXNwZWN0IHRvIGVuZCB1c2VycywgYnVzaW5lc3MgcGFydG5lcnMgYW5kIHRoZSBsaWtlLiBXaGlsZSB0aGlzCisgICAgbGljZW5zZSBpcyBpbnRlbmRlZCB0byBmYWNpbGl0YXRlIHRoZSBjb21tZXJjaWFsIHVzZSBvZiB0aGUgUHJvZ3JhbSwKKyAgICB0aGUgQ29udHJpYnV0b3Igd2hvIGluY2x1ZGVzIHRoZSBQcm9ncmFtIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0CisgICAgb2ZmZXJpbmcgc2hvdWxkIGRvIHNvIGluIGEgbWFubmVyIHdoaWNoIGRvZXMgbm90IGNyZWF0ZSBwb3RlbnRpYWwKKyAgICBsaWFiaWxpdHkgZm9yIG90aGVyIENvbnRyaWJ1dG9ycy4gVGhlcmVmb3JlLCBpZiBhIENvbnRyaWJ1dG9yIGluY2x1ZGVzCisgICAgdGhlIFByb2dyYW0gaW4gYSBjb21tZXJjaWFsIHByb2R1Y3Qgb2ZmZXJpbmcsIHN1Y2ggQ29udHJpYnV0b3IKKyAgICAoIkNvbW1lcmNpYWwgQ29udHJpYnV0b3IiKSBoZXJlYnkgYWdyZWVzIHRvIGRlZmVuZCBhbmQgaW5kZW1uaWZ5IGV2ZXJ5CisgICAgb3RoZXIgQ29udHJpYnV0b3IgKCJJbmRlbW5pZmllZCBDb250cmlidXRvciIpIGFnYWluc3QgYW55IGxvc3NlcywKKyAgICBkYW1hZ2VzIGFuZCBjb3N0cyAoY29sbGVjdGl2ZWx5ICJMb3NzZXMiKSBhcmlzaW5nIGZyb20gY2xhaW1zLCBsYXdzdWl0cworICAgIGFuZCBvdGhlciBsZWdhbCBhY3Rpb25zIGJyb3VnaHQgYnkgYSB0aGlyZCBwYXJ0eSBhZ2FpbnN0IHRoZSBJbmRlbW5pZmllZAorICAgIENvbnRyaWJ1dG9yIHRvIHRoZSBleHRlbnQgY2F1c2VkIGJ5IHRoZSBhY3RzIG9yIG9taXNzaW9ucyBvZiBzdWNoCisgICAgQ29tbWVyY2lhbCBDb250cmlidXRvciBpbiBjb25uZWN0aW9uIHdpdGggaXRzIGRpc3RyaWJ1dGlvbiBvZiB0aGUgUHJvZ3JhbQorICAgIGluIGEgY29tbWVyY2lhbCBwcm9kdWN0IG9mZmVyaW5nLiBUaGUgb2JsaWdhdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGRvIG5vdAorICAgIGFwcGx5IHRvIGFueSBjbGFpbXMgb3IgTG9zc2VzIHJlbGF0aW5nIHRvIGFueSBhY3R1YWwgb3IgYWxsZWdlZAorICAgIGludGVsbGVjdHVhbCBwcm9wZXJ0eSBpbmZyaW5nZW1lbnQuIEluIG9yZGVyIHRvIHF1YWxpZnksIGFuIEluZGVtbmlmaWVkCisgICAgQ29udHJpYnV0b3IgbXVzdDogYSkgcHJvbXB0bHkgbm90aWZ5IHRoZSBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIGluCisgICAgd3JpdGluZyBvZiBzdWNoIGNsYWltLCBhbmQgYikgYWxsb3cgdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgdG8gY29udHJvbCwKKyAgICBhbmQgY29vcGVyYXRlIHdpdGggdGhlIENvbW1lcmNpYWwgQ29udHJpYnV0b3IgaW4sIHRoZSBkZWZlbnNlIGFuZCBhbnkKKyAgICByZWxhdGVkIHNldHRsZW1lbnQgbmVnb3RpYXRpb25zLiBUaGUgSW5kZW1uaWZpZWQgQ29udHJpYnV0b3IgbWF5CisgICAgcGFydGljaXBhdGUgaW4gYW55IHN1Y2ggY2xhaW0gYXQgaXRzIG93biBleHBlbnNlLgorCisgICAgRm9yIGV4YW1wbGUsIGEgQ29udHJpYnV0b3IgbWlnaHQgaW5jbHVkZSB0aGUgUHJvZ3JhbSBpbiBhIGNvbW1lcmNpYWwKKyAgICBwcm9kdWN0IG9mZmVyaW5nLCBQcm9kdWN0IFguIFRoYXQgQ29udHJpYnV0b3IgaXMgdGhlbiBhIENvbW1lcmNpYWwKKyAgICBDb250cmlidXRvci4gSWYgdGhhdCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yIHRoZW4gbWFrZXMgcGVyZm9ybWFuY2UKKyAgICBjbGFpbXMsIG9yIG9mZmVycyB3YXJyYW50aWVzIHJlbGF0ZWQgdG8gUHJvZHVjdCBYLCB0aG9zZSBwZXJmb3JtYW5jZQorICAgIGNsYWltcyBhbmQgd2FycmFudGllcyBhcmUgc3VjaCBDb21tZXJjaWFsIENvbnRyaWJ1dG9yJ3MgcmVzcG9uc2liaWxpdHkKKyAgICBhbG9uZS4gVW5kZXIgdGhpcyBzZWN0aW9uLCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciB3b3VsZCBoYXZlIHRvCisgICAgZGVmZW5kIGNsYWltcyBhZ2FpbnN0IHRoZSBvdGhlciBDb250cmlidXRvcnMgcmVsYXRlZCB0byB0aG9zZSBwZXJmb3JtYW5jZQorICAgIGNsYWltcyBhbmQgd2FycmFudGllcywgYW5kIGlmIGEgY291cnQgcmVxdWlyZXMgYW55IG90aGVyIENvbnRyaWJ1dG9yIHRvCisgICAgcGF5IGFueSBkYW1hZ2VzIGFzIGEgcmVzdWx0LCB0aGUgQ29tbWVyY2lhbCBDb250cmlidXRvciBtdXN0IHBheQorICAgIHRob3NlIGRhbWFnZXMuCisKKyAgICA1LiBOTyBXQVJSQU5UWQorCisgICAgRVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIEFORCBUTyBUSEUgRVhURU5UCisgICAgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLCBUSEUgUFJPR1JBTSBJUyBQUk9WSURFRCBPTiBBTiAiQVMgSVMiCisgICAgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUgorICAgIElNUExJRUQgSU5DTFVESU5HLCBXSVRIT1VUIExJTUlUQVRJT04sIEFOWSBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YKKyAgICBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZIE9SIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICAgIFBVUlBPU0UuIEVhY2ggUmVjaXBpZW50IGlzIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIGFuZCBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gYW5kIGFzc3VtZXMgYWxsCisgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIGl0cyBleGVyY2lzZSBvZiByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQsCisgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byB0aGUgcmlza3MgYW5kIGNvc3RzIG9mIHByb2dyYW0gZXJyb3JzLAorICAgIGNvbXBsaWFuY2Ugd2l0aCBhcHBsaWNhYmxlIGxhd3MsIGRhbWFnZSB0byBvciBsb3NzIG9mIGRhdGEsIHByb2dyYW1zCisgICAgb3IgZXF1aXBtZW50LCBhbmQgdW5hdmFpbGFiaWxpdHkgb3IgaW50ZXJydXB0aW9uIG9mIG9wZXJhdGlvbnMuCisKKyAgICA2LiBESVNDTEFJTUVSIE9GIExJQUJJTElUWQorCisgICAgRVhDRVBUIEFTIEVYUFJFU1NMWSBTRVQgRk9SVEggSU4gVEhJUyBBR1JFRU1FTlQsIEFORCBUTyBUSEUgRVhURU5UCisgICAgUEVSTUlUVEVEIEJZIEFQUExJQ0FCTEUgTEFXLCBORUlUSEVSIFJFQ0lQSUVOVCBOT1IgQU5ZIENPTlRSSUJVVE9SUworICAgIFNIQUxMIEhBVkUgQU5ZIExJQUJJTElUWSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsCisgICAgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gTE9TVAorICAgIFBST0ZJVFMpLCBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAgICBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICAgIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPUiBESVNUUklCVVRJT04gT0YgVEhFIFBST0dSQU0gT1IgVEhFCisgICAgRVhFUkNJU0UgT0YgQU5ZIFJJR0hUUyBHUkFOVEVEIEhFUkVVTkRFUiwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRQorICAgIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KKworICAgIDcuIEdFTkVSQUwKKworICAgIElmIGFueSBwcm92aXNpb24gb2YgdGhpcyBBZ3JlZW1lbnQgaXMgaW52YWxpZCBvciB1bmVuZm9yY2VhYmxlIHVuZGVyCisgICAgYXBwbGljYWJsZSBsYXcsIGl0IHNoYWxsIG5vdCBhZmZlY3QgdGhlIHZhbGlkaXR5IG9yIGVuZm9yY2VhYmlsaXR5IG9mCisgICAgdGhlIHJlbWFpbmRlciBvZiB0aGUgdGVybXMgb2YgdGhpcyBBZ3JlZW1lbnQsIGFuZCB3aXRob3V0IGZ1cnRoZXIKKyAgICBhY3Rpb24gYnkgdGhlIHBhcnRpZXMgaGVyZXRvLCBzdWNoIHByb3Zpc2lvbiBzaGFsbCBiZSByZWZvcm1lZCB0byB0aGUKKyAgICBtaW5pbXVtIGV4dGVudCBuZWNlc3NhcnkgdG8gbWFrZSBzdWNoIHByb3Zpc2lvbiB2YWxpZCBhbmQgZW5mb3JjZWFibGUuCisKKyAgICBJZiBSZWNpcGllbnQgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkKKyAgICAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUKKyAgICBQcm9ncmFtIGl0c2VsZiAoZXhjbHVkaW5nIGNvbWJpbmF0aW9ucyBvZiB0aGUgUHJvZ3JhbSB3aXRoIG90aGVyIHNvZnR3YXJlCisgICAgb3IgaGFyZHdhcmUpIGluZnJpbmdlcyBzdWNoIFJlY2lwaWVudCdzIHBhdGVudChzKSwgdGhlbiBzdWNoIFJlY2lwaWVudCdzCisgICAgcmlnaHRzIGdyYW50ZWQgdW5kZXIgU2VjdGlvbiAyKGIpIHNoYWxsIHRlcm1pbmF0ZSBhcyBvZiB0aGUgZGF0ZSBzdWNoCisgICAgbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgIEFsbCBSZWNpcGllbnQncyByaWdodHMgdW5kZXIgdGhpcyBBZ3JlZW1lbnQgc2hhbGwgdGVybWluYXRlIGlmIGl0CisgICAgZmFpbHMgdG8gY29tcGx5IHdpdGggYW55IG9mIHRoZSBtYXRlcmlhbCB0ZXJtcyBvciBjb25kaXRpb25zIG9mIHRoaXMKKyAgICBBZ3JlZW1lbnQgYW5kIGRvZXMgbm90IGN1cmUgc3VjaCBmYWlsdXJlIGluIGEgcmVhc29uYWJsZSBwZXJpb2Qgb2YKKyAgICB0aW1lIGFmdGVyIGJlY29taW5nIGF3YXJlIG9mIHN1Y2ggbm9uY29tcGxpYW5jZS4gSWYgYWxsIFJlY2lwaWVudCdzCisgICAgcmlnaHRzIHVuZGVyIHRoaXMgQWdyZWVtZW50IHRlcm1pbmF0ZSwgUmVjaXBpZW50IGFncmVlcyB0byBjZWFzZSB1c2UKKyAgICBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGFzIHNvb24gYXMgcmVhc29uYWJseSBwcmFjdGljYWJsZS4KKyAgICBIb3dldmVyLCBSZWNpcGllbnQncyBvYmxpZ2F0aW9ucyB1bmRlciB0aGlzIEFncmVlbWVudCBhbmQgYW55IGxpY2Vuc2VzCisgICAgZ3JhbnRlZCBieSBSZWNpcGllbnQgcmVsYXRpbmcgdG8gdGhlIFByb2dyYW0gc2hhbGwgY29udGludWUgYW5kIHN1cnZpdmUuCisKKyAgICBFdmVyeW9uZSBpcyBwZXJtaXR0ZWQgdG8gY29weSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhpcyBBZ3JlZW1lbnQsCisgICAgYnV0IGluIG9yZGVyIHRvIGF2b2lkIGluY29uc2lzdGVuY3kgdGhlIEFncmVlbWVudCBpcyBjb3B5cmlnaHRlZCBhbmQKKyAgICBtYXkgb25seSBiZSBtb2RpZmllZCBpbiB0aGUgZm9sbG93aW5nIG1hbm5lci4gVGhlIEFncmVlbWVudCBTdGV3YXJkCisgICAgcmVzZXJ2ZXMgdGhlIHJpZ2h0IHRvIHB1Ymxpc2ggbmV3IHZlcnNpb25zIChpbmNsdWRpbmcgcmV2aXNpb25zKSBvZgorICAgIHRoaXMgQWdyZWVtZW50IGZyb20gdGltZSB0byB0aW1lLiBObyBvbmUgb3RoZXIgdGhhbiB0aGUgQWdyZWVtZW50CisgICAgU3Rld2FyZCBoYXMgdGhlIHJpZ2h0IHRvIG1vZGlmeSB0aGlzIEFncmVlbWVudC4gVGhlIEVjbGlwc2UgRm91bmRhdGlvbgorICAgIGlzIHRoZSBpbml0aWFsIEFncmVlbWVudCBTdGV3YXJkLiBUaGUgRWNsaXBzZSBGb3VuZGF0aW9uIG1heSBhc3NpZ24gdGhlCisgICAgcmVzcG9uc2liaWxpdHkgdG8gc2VydmUgYXMgdGhlIEFncmVlbWVudCBTdGV3YXJkIHRvIGEgc3VpdGFibGUgc2VwYXJhdGUKKyAgICBlbnRpdHkuIEVhY2ggbmV3IHZlcnNpb24gb2YgdGhlIEFncmVlbWVudCB3aWxsIGJlIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcKKyAgICB2ZXJzaW9uIG51bWJlci4gVGhlIFByb2dyYW0gKGluY2x1ZGluZyBDb250cmlidXRpb25zKSBtYXkgYWx3YXlzIGJlCisgICAgRGlzdHJpYnV0ZWQgc3ViamVjdCB0byB0aGUgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IHVuZGVyIHdoaWNoIGl0IHdhcworICAgIHJlY2VpdmVkLiBJbiBhZGRpdGlvbiwgYWZ0ZXIgYSBuZXcgdmVyc2lvbiBvZiB0aGUgQWdyZWVtZW50IGlzIHB1Ymxpc2hlZCwKKyAgICBDb250cmlidXRvciBtYXkgZWxlY3QgdG8gRGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAoaW5jbHVkaW5nIGl0cworICAgIENvbnRyaWJ1dGlvbnMpIHVuZGVyIHRoZSBuZXcgdmVyc2lvbi4KKworICAgIEV4Y2VwdCBhcyBleHByZXNzbHkgc3RhdGVkIGluIFNlY3Rpb25zIDIoYSkgYW5kIDIoYikgYWJvdmUsIFJlY2lwaWVudAorICAgIHJlY2VpdmVzIG5vIHJpZ2h0cyBvciBsaWNlbnNlcyB0byB0aGUgaW50ZWxsZWN0dWFsIHByb3BlcnR5IG9mIGFueQorICAgIENvbnRyaWJ1dG9yIHVuZGVyIHRoaXMgQWdyZWVtZW50LCB3aGV0aGVyIGV4cHJlc3NseSwgYnkgaW1wbGljYXRpb24sCisgICAgZXN0b3BwZWwgb3Igb3RoZXJ3aXNlLiBBbGwgcmlnaHRzIGluIHRoZSBQcm9ncmFtIG5vdCBleHByZXNzbHkgZ3JhbnRlZAorICAgIHVuZGVyIHRoaXMgQWdyZWVtZW50IGFyZSByZXNlcnZlZC4gTm90aGluZyBpbiB0aGlzIEFncmVlbWVudCBpcyBpbnRlbmRlZAorICAgIHRvIGJlIGVuZm9yY2VhYmxlIGJ5IGFueSBlbnRpdHkgdGhhdCBpcyBub3QgYSBDb250cmlidXRvciBvciBSZWNpcGllbnQuCisgICAgTm8gdGhpcmQtcGFydHkgYmVuZWZpY2lhcnkgcmlnaHRzIGFyZSBjcmVhdGVkIHVuZGVyIHRoaXMgQWdyZWVtZW50LgorCisgICAgRXhoaWJpdCBBIC0gRm9ybSBvZiBTZWNvbmRhcnkgTGljZW5zZXMgTm90aWNlCisKKyAgICAiVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIAorICAgIFNlY29uZGFyeSBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggCisgICAgaW4gdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UsIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiB7bmFtZSBsaWNlbnNlKHMpLAorICAgIHZlcnNpb24ocyksIGFuZCBleGNlcHRpb25zIG9yIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgaGVyZX0uIgorCisgICAgICBTaW1wbHkgaW5jbHVkaW5nIGEgY29weSBvZiB0aGlzIEFncmVlbWVudCwgaW5jbHVkaW5nIHRoaXMgRXhoaWJpdCBBCisgICAgICBpcyBub3Qgc3VmZmljaWVudCB0byBsaWNlbnNlIHRoZSBTb3VyY2UgQ29kZSB1bmRlciBTZWNvbmRhcnkgTGljZW5zZXMuCisKKyAgICAgIElmIGl0IGlzIG5vdCBwb3NzaWJsZSBvciBkZXNpcmFibGUgdG8gcHV0IHRoZSBub3RpY2UgaW4gYSBwYXJ0aWN1bGFyCisgICAgICBmaWxlLCB0aGVuIFlvdSBtYXkgaW5jbHVkZSB0aGUgbm90aWNlIGluIGEgbG9jYXRpb24gKHN1Y2ggYXMgYSBMSUNFTlNFCisgICAgICBmaWxlIGluIGEgcmVsZXZhbnQgZGlyZWN0b3J5KSB3aGVyZSBhIHJlY2lwaWVudCB3b3VsZCBiZSBsaWtlbHkgdG8KKyAgICAgIGxvb2sgZm9yIHN1Y2ggYSBub3RpY2UuCisKKyAgICAgIFlvdSBtYXkgYWRkIGFkZGl0aW9uYWwgYWNjdXJhdGUgbm90aWNlcyBvZiBjb3B5cmlnaHQgb3duZXJzaGlwLgorCistLS0KKworIyMgICAgVGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIChHUEwpIFZlcnNpb24gMiwgSnVuZSAxOTkxCisKKyAgICBDb3B5cmlnaHQgKEMpIDE5ODksIDE5OTEgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisgICAgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vcgorICAgIEJvc3RvbiwgTUEgMDIxMTAtMTMzNQorICAgIFVTQQorCisgICAgRXZlcnlvbmUgaXMgcGVybWl0dGVkIHRvIGNvcHkgYW5kIGRpc3RyaWJ1dGUgdmVyYmF0aW0gY29waWVzCisgICAgb2YgdGhpcyBsaWNlbnNlIGRvY3VtZW50LCBidXQgY2hhbmdpbmcgaXQgaXMgbm90IGFsbG93ZWQuCisKKyAgICBQcmVhbWJsZQorCisgICAgVGhlIGxpY2Vuc2VzIGZvciBtb3N0IHNvZnR3YXJlIGFyZSBkZXNpZ25lZCB0byB0YWtlIGF3YXkgeW91ciBmcmVlZG9tIHRvCisgICAgc2hhcmUgYW5kIGNoYW5nZSBpdC4gQnkgY29udHJhc3QsIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBpcworICAgIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8gc2hhcmUgYW5kIGNoYW5nZSBmcmVlIHNvZnR3YXJlLS10bworICAgIG1ha2Ugc3VyZSB0aGUgc29mdHdhcmUgaXMgZnJlZSBmb3IgYWxsIGl0cyB1c2Vycy4gVGhpcyBHZW5lcmFsIFB1YmxpYworICAgIExpY2Vuc2UgYXBwbGllcyB0byBtb3N0IG9mIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24ncyBzb2Z0d2FyZSBhbmQKKyAgICB0byBhbnkgb3RoZXIgcHJvZ3JhbSB3aG9zZSBhdXRob3JzIGNvbW1pdCB0byB1c2luZyBpdC4gKFNvbWUgb3RoZXIgRnJlZQorICAgIFNvZnR3YXJlIEZvdW5kYXRpb24gc29mdHdhcmUgaXMgY292ZXJlZCBieSB0aGUgR05VIExpYnJhcnkgR2VuZXJhbAorICAgIFB1YmxpYyBMaWNlbnNlIGluc3RlYWQuKSBZb3UgY2FuIGFwcGx5IGl0IHRvIHlvdXIgcHJvZ3JhbXMsIHRvby4KKworICAgIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QgcHJpY2UuCisgICAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UgaGF2ZSB0aGUKKyAgICBmcmVlZG9tIHRvIGRpc3RyaWJ1dGUgY29waWVzIG9mIGZyZWUgc29mdHdhcmUgKGFuZCBjaGFyZ2UgZm9yIHRoaXMKKyAgICBzZXJ2aWNlIGlmIHlvdSB3aXNoKSwgdGhhdCB5b3UgcmVjZWl2ZSBzb3VyY2UgY29kZSBvciBjYW4gZ2V0IGl0IGlmIHlvdQorICAgIHdhbnQgaXQsIHRoYXQgeW91IGNhbiBjaGFuZ2UgdGhlIHNvZnR3YXJlIG9yIHVzZSBwaWVjZXMgb2YgaXQgaW4gbmV3CisgICAgZnJlZSBwcm9ncmFtczsgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCisKKyAgICBUbyBwcm90ZWN0IHlvdXIgcmlnaHRzLCB3ZSBuZWVkIHRvIG1ha2UgcmVzdHJpY3Rpb25zIHRoYXQgZm9yYmlkIGFueW9uZQorICAgIHRvIGRlbnkgeW91IHRoZXNlIHJpZ2h0cyBvciB0byBhc2sgeW91IHRvIHN1cnJlbmRlciB0aGUgcmlnaHRzLiBUaGVzZQorICAgIHJlc3RyaWN0aW9ucyB0cmFuc2xhdGUgdG8gY2VydGFpbiByZXNwb25zaWJpbGl0aWVzIGZvciB5b3UgaWYgeW91CisgICAgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZiB5b3UgbW9kaWZ5IGl0LgorCisgICAgRm9yIGV4YW1wbGUsIGlmIHlvdSBkaXN0cmlidXRlIGNvcGllcyBvZiBzdWNoIGEgcHJvZ3JhbSwgd2hldGhlciBncmF0aXMKKyAgICBvciBmb3IgYSBmZWUsIHlvdSBtdXN0IGdpdmUgdGhlIHJlY2lwaWVudHMgYWxsIHRoZSByaWdodHMgdGhhdCB5b3UgaGF2ZS4KKyAgICBZb3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGV5LCB0b28sIHJlY2VpdmUgb3IgY2FuIGdldCB0aGUgc291cmNlIGNvZGUuCisgICAgQW5kIHlvdSBtdXN0IHNob3cgdGhlbSB0aGVzZSB0ZXJtcyBzbyB0aGV5IGtub3cgdGhlaXIgcmlnaHRzLgorCisgICAgV2UgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczogKDEpIGNvcHlyaWdodCB0aGUgc29mdHdhcmUsIGFuZAorICAgICgyKSBvZmZlciB5b3UgdGhpcyBsaWNlbnNlIHdoaWNoIGdpdmVzIHlvdSBsZWdhbCBwZXJtaXNzaW9uIHRvIGNvcHksCisgICAgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IHRoZSBzb2Z0d2FyZS4KKworICAgIEFsc28sIGZvciBlYWNoIGF1dGhvcidzIHByb3RlY3Rpb24gYW5kIG91cnMsIHdlIHdhbnQgdG8gbWFrZSBjZXJ0YWluCisgICAgdGhhdCBldmVyeW9uZSB1bmRlcnN0YW5kcyB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IGZvciB0aGlzIGZyZWUKKyAgICBzb2Z0d2FyZS4gSWYgdGhlIHNvZnR3YXJlIGlzIG1vZGlmaWVkIGJ5IHNvbWVvbmUgZWxzZSBhbmQgcGFzc2VkIG9uLCB3ZQorICAgIHdhbnQgaXRzIHJlY2lwaWVudHMgdG8ga25vdyB0aGF0IHdoYXQgdGhleSBoYXZlIGlzIG5vdCB0aGUgb3JpZ2luYWwsIHNvCisgICAgdGhhdCBhbnkgcHJvYmxlbXMgaW50cm9kdWNlZCBieSBvdGhlcnMgd2lsbCBub3QgcmVmbGVjdCBvbiB0aGUgb3JpZ2luYWwKKyAgICBhdXRob3JzJyByZXB1dGF0aW9ucy4KKworICAgIEZpbmFsbHksIGFueSBmcmVlIHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlIHBhdGVudHMuCisgICAgV2Ugd2lzaCB0byBhdm9pZCB0aGUgZGFuZ2VyIHRoYXQgcmVkaXN0cmlidXRvcnMgb2YgYSBmcmVlIHByb2dyYW0gd2lsbAorICAgIGluZGl2aWR1YWxseSBvYnRhaW4gcGF0ZW50IGxpY2Vuc2VzLCBpbiBlZmZlY3QgbWFraW5nIHRoZSBwcm9ncmFtCisgICAgcHJvcHJpZXRhcnkuIFRvIHByZXZlbnQgdGhpcywgd2UgaGF2ZSBtYWRlIGl0IGNsZWFyIHRoYXQgYW55IHBhdGVudCBtdXN0CisgICAgYmUgbGljZW5zZWQgZm9yIGV2ZXJ5b25lJ3MgZnJlZSB1c2Ugb3Igbm90IGxpY2Vuc2VkIGF0IGFsbC4KKworICAgIFRoZSBwcmVjaXNlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kCisgICAgbW9kaWZpY2F0aW9uIGZvbGxvdy4KKworICAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBDT1BZSU5HLCBESVNUUklCVVRJT04gQU5EIE1PRElGSUNBVElPTgorCisgICAgMC4gVGhpcyBMaWNlbnNlIGFwcGxpZXMgdG8gYW55IHByb2dyYW0gb3Igb3RoZXIgd29yayB3aGljaCBjb250YWlucyBhCisgICAgbm90aWNlIHBsYWNlZCBieSB0aGUgY29weXJpZ2h0IGhvbGRlciBzYXlpbmcgaXQgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyCisgICAgdGhlIHRlcm1zIG9mIHRoaXMgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gVGhlICJQcm9ncmFtIiwgYmVsb3csIHJlZmVycworICAgIHRvIGFueSBzdWNoIHByb2dyYW0gb3Igd29yaywgYW5kIGEgIndvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0iIG1lYW5zCisgICAgZWl0aGVyIHRoZSBQcm9ncmFtIG9yIGFueSBkZXJpdmF0aXZlIHdvcmsgdW5kZXIgY29weXJpZ2h0IGxhdzogdGhhdCBpcworICAgIHRvIHNheSwgYSB3b3JrIGNvbnRhaW5pbmcgdGhlIFByb2dyYW0gb3IgYSBwb3J0aW9uIG9mIGl0LCBlaXRoZXIKKyAgICB2ZXJiYXRpbSBvciB3aXRoIG1vZGlmaWNhdGlvbnMgYW5kL29yIHRyYW5zbGF0ZWQgaW50byBhbm90aGVyIGxhbmd1YWdlLgorICAgIChIZXJlaW5hZnRlciwgdHJhbnNsYXRpb24gaXMgaW5jbHVkZWQgd2l0aG91dCBsaW1pdGF0aW9uIGluIHRoZSB0ZXJtCisgICAgIm1vZGlmaWNhdGlvbiIuKSBFYWNoIGxpY2Vuc2VlIGlzIGFkZHJlc3NlZCBhcyAieW91Ii4KKworICAgIEFjdGl2aXRpZXMgb3RoZXIgdGhhbiBjb3B5aW5nLCBkaXN0cmlidXRpb24gYW5kIG1vZGlmaWNhdGlvbiBhcmUgbm90CisgICAgY292ZXJlZCBieSB0aGlzIExpY2Vuc2U7IHRoZXkgYXJlIG91dHNpZGUgaXRzIHNjb3BlLiBUaGUgYWN0IG9mIHJ1bm5pbmcKKyAgICB0aGUgUHJvZ3JhbSBpcyBub3QgcmVzdHJpY3RlZCwgYW5kIHRoZSBvdXRwdXQgZnJvbSB0aGUgUHJvZ3JhbSBpcworICAgIGNvdmVyZWQgb25seSBpZiBpdHMgY29udGVudHMgY29uc3RpdHV0ZSBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0KKyAgICAoaW5kZXBlbmRlbnQgb2YgaGF2aW5nIGJlZW4gbWFkZSBieSBydW5uaW5nIHRoZSBQcm9ncmFtKS4gV2hldGhlciB0aGF0CisgICAgaXMgdHJ1ZSBkZXBlbmRzIG9uIHdoYXQgdGhlIFByb2dyYW0gZG9lcy4KKworICAgIDEuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncyBzb3VyY2UKKyAgICBjb2RlIGFzIHlvdSByZWNlaXZlIGl0LCBpbiBhbnkgbWVkaXVtLCBwcm92aWRlZCB0aGF0IHlvdSBjb25zcGljdW91c2x5CisgICAgYW5kIGFwcHJvcHJpYXRlbHkgcHVibGlzaCBvbiBlYWNoIGNvcHkgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZQorICAgIGFuZCBkaXNjbGFpbWVyIG9mIHdhcnJhbnR5OyBrZWVwIGludGFjdCBhbGwgdGhlIG5vdGljZXMgdGhhdCByZWZlciB0bworICAgIHRoaXMgTGljZW5zZSBhbmQgdG8gdGhlIGFic2VuY2Ugb2YgYW55IHdhcnJhbnR5OyBhbmQgZ2l2ZSBhbnkgb3RoZXIKKyAgICByZWNpcGllbnRzIG9mIHRoZSBQcm9ncmFtIGEgY29weSBvZiB0aGlzIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KKworICAgIFlvdSBtYXkgY2hhcmdlIGEgZmVlIGZvciB0aGUgcGh5c2ljYWwgYWN0IG9mIHRyYW5zZmVycmluZyBhIGNvcHksIGFuZAorICAgIHlvdSBtYXkgYXQgeW91ciBvcHRpb24gb2ZmZXIgd2FycmFudHkgcHJvdGVjdGlvbiBpbiBleGNoYW5nZSBmb3IgYSBmZWUuCisKKyAgICAyLiBZb3UgbWF5IG1vZGlmeSB5b3VyIGNvcHkgb3IgY29waWVzIG9mIHRoZSBQcm9ncmFtIG9yIGFueSBwb3J0aW9uIG9mCisgICAgaXQsIHRodXMgZm9ybWluZyBhIHdvcmsgYmFzZWQgb24gdGhlIFByb2dyYW0sIGFuZCBjb3B5IGFuZCBkaXN0cmlidXRlCisgICAgc3VjaCBtb2RpZmljYXRpb25zIG9yIHdvcmsgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb24gMSBhYm92ZSwgcHJvdmlkZWQKKyAgICB0aGF0IHlvdSBhbHNvIG1lZXQgYWxsIG9mIHRoZXNlIGNvbmRpdGlvbnM6CisKKyAgICAgICAgYSkgWW91IG11c3QgY2F1c2UgdGhlIG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCisgICAgICAgIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgZmlsZXMgYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuCisKKyAgICAgICAgYikgWW91IG11c3QgY2F1c2UgYW55IHdvcmsgdGhhdCB5b3UgZGlzdHJpYnV0ZSBvciBwdWJsaXNoLCB0aGF0IGluCisgICAgICAgIHdob2xlIG9yIGluIHBhcnQgY29udGFpbnMgb3IgaXMgZGVyaXZlZCBmcm9tIHRoZSBQcm9ncmFtIG9yIGFueSBwYXJ0CisgICAgICAgIHRoZXJlb2YsIHRvIGJlIGxpY2Vuc2VkIGFzIGEgd2hvbGUgYXQgbm8gY2hhcmdlIHRvIGFsbCB0aGlyZCBwYXJ0aWVzCisgICAgICAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UuCisKKyAgICAgICAgYykgSWYgdGhlIG1vZGlmaWVkIHByb2dyYW0gbm9ybWFsbHkgcmVhZHMgY29tbWFuZHMgaW50ZXJhY3RpdmVseQorICAgICAgICB3aGVuIHJ1biwgeW91IG11c3QgY2F1c2UgaXQsIHdoZW4gc3RhcnRlZCBydW5uaW5nIGZvciBzdWNoCisgICAgICAgIGludGVyYWN0aXZlIHVzZSBpbiB0aGUgbW9zdCBvcmRpbmFyeSB3YXksIHRvIHByaW50IG9yIGRpc3BsYXkgYW4KKyAgICAgICAgYW5ub3VuY2VtZW50IGluY2x1ZGluZyBhbiBhcHByb3ByaWF0ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCBhIG5vdGljZQorICAgICAgICB0aGF0IHRoZXJlIGlzIG5vIHdhcnJhbnR5IChvciBlbHNlLCBzYXlpbmcgdGhhdCB5b3UgcHJvdmlkZSBhCisgICAgICAgIHdhcnJhbnR5KSBhbmQgdGhhdCB1c2VycyBtYXkgcmVkaXN0cmlidXRlIHRoZSBwcm9ncmFtIHVuZGVyIHRoZXNlCisgICAgICAgIGNvbmRpdGlvbnMsIGFuZCB0ZWxsaW5nIHRoZSB1c2VyIGhvdyB0byB2aWV3IGEgY29weSBvZiB0aGlzIExpY2Vuc2UuCisgICAgICAgIChFeGNlcHRpb246IGlmIHRoZSBQcm9ncmFtIGl0c2VsZiBpcyBpbnRlcmFjdGl2ZSBidXQgZG9lcyBub3QKKyAgICAgICAgbm9ybWFsbHkgcHJpbnQgc3VjaCBhbiBhbm5vdW5jZW1lbnQsIHlvdXIgd29yayBiYXNlZCBvbiB0aGUgUHJvZ3JhbQorICAgICAgICBpcyBub3QgcmVxdWlyZWQgdG8gcHJpbnQgYW4gYW5ub3VuY2VtZW50LikKKworICAgIFRoZXNlIHJlcXVpcmVtZW50cyBhcHBseSB0byB0aGUgbW9kaWZpZWQgd29yayBhcyBhIHdob2xlLiBJZgorICAgIGlkZW50aWZpYWJsZSBzZWN0aW9ucyBvZiB0aGF0IHdvcmsgYXJlIG5vdCBkZXJpdmVkIGZyb20gdGhlIFByb2dyYW0sIGFuZAorICAgIGNhbiBiZSByZWFzb25hYmx5IGNvbnNpZGVyZWQgaW5kZXBlbmRlbnQgYW5kIHNlcGFyYXRlIHdvcmtzIGluCisgICAgdGhlbXNlbHZlcywgdGhlbiB0aGlzIExpY2Vuc2UsIGFuZCBpdHMgdGVybXMsIGRvIG5vdCBhcHBseSB0byB0aG9zZQorICAgIHNlY3Rpb25zIHdoZW4geW91IGRpc3RyaWJ1dGUgdGhlbSBhcyBzZXBhcmF0ZSB3b3Jrcy4gQnV0IHdoZW4geW91CisgICAgZGlzdHJpYnV0ZSB0aGUgc2FtZSBzZWN0aW9ucyBhcyBwYXJ0IG9mIGEgd2hvbGUgd2hpY2ggaXMgYSB3b3JrIGJhc2VkIG9uCisgICAgdGhlIFByb2dyYW0sIHRoZSBkaXN0cmlidXRpb24gb2YgdGhlIHdob2xlIG11c3QgYmUgb24gdGhlIHRlcm1zIG9mIHRoaXMKKyAgICBMaWNlbnNlLCB3aG9zZSBwZXJtaXNzaW9ucyBmb3Igb3RoZXIgbGljZW5zZWVzIGV4dGVuZCB0byB0aGUgZW50aXJlCisgICAgd2hvbGUsIGFuZCB0aHVzIHRvIGVhY2ggYW5kIGV2ZXJ5IHBhcnQgcmVnYXJkbGVzcyBvZiB3aG8gd3JvdGUgaXQuCisKKyAgICBUaHVzLCBpdCBpcyBub3QgdGhlIGludGVudCBvZiB0aGlzIHNlY3Rpb24gdG8gY2xhaW0gcmlnaHRzIG9yIGNvbnRlc3QKKyAgICB5b3VyIHJpZ2h0cyB0byB3b3JrIHdyaXR0ZW4gZW50aXJlbHkgYnkgeW91OyByYXRoZXIsIHRoZSBpbnRlbnQgaXMgdG8KKyAgICBleGVyY2lzZSB0aGUgcmlnaHQgdG8gY29udHJvbCB0aGUgZGlzdHJpYnV0aW9uIG9mIGRlcml2YXRpdmUgb3IKKyAgICBjb2xsZWN0aXZlIHdvcmtzIGJhc2VkIG9uIHRoZSBQcm9ncmFtLgorCisgICAgSW4gYWRkaXRpb24sIG1lcmUgYWdncmVnYXRpb24gb2YgYW5vdGhlciB3b3JrIG5vdCBiYXNlZCBvbiB0aGUgUHJvZ3JhbQorICAgIHdpdGggdGhlIFByb2dyYW0gKG9yIHdpdGggYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtKSBvbiBhIHZvbHVtZSBvZiBhCisgICAgc3RvcmFnZSBvciBkaXN0cmlidXRpb24gbWVkaXVtIGRvZXMgbm90IGJyaW5nIHRoZSBvdGhlciB3b3JrIHVuZGVyIHRoZQorICAgIHNjb3BlIG9mIHRoaXMgTGljZW5zZS4KKworICAgIDMuIFlvdSBtYXkgY29weSBhbmQgZGlzdHJpYnV0ZSB0aGUgUHJvZ3JhbSAob3IgYSB3b3JrIGJhc2VkIG9uIGl0LAorICAgIHVuZGVyIFNlY3Rpb24gMikgaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHVuZGVyIHRoZSB0ZXJtcyBvZgorICAgIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBkbyBvbmUgb2YgdGhlIGZvbGxvd2luZzoKKworICAgICAgICBhKSBBY2NvbXBhbnkgaXQgd2l0aCB0aGUgY29tcGxldGUgY29ycmVzcG9uZGluZyBtYWNoaW5lLXJlYWRhYmxlCisgICAgICAgIHNvdXJjZSBjb2RlLCB3aGljaCBtdXN0IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBTZWN0aW9ucyAxCisgICAgICAgIGFuZCAyIGFib3ZlIG9uIGEgbWVkaXVtIGN1c3RvbWFyaWx5IHVzZWQgZm9yIHNvZnR3YXJlIGludGVyY2hhbmdlOyBvciwKKworICAgICAgICBiKSBBY2NvbXBhbnkgaXQgd2l0aCBhIHdyaXR0ZW4gb2ZmZXIsIHZhbGlkIGZvciBhdCBsZWFzdCB0aHJlZQorICAgICAgICB5ZWFycywgdG8gZ2l2ZSBhbnkgdGhpcmQgcGFydHksIGZvciBhIGNoYXJnZSBubyBtb3JlIHRoYW4geW91ciBjb3N0CisgICAgICAgIG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyBzb3VyY2UgZGlzdHJpYnV0aW9uLCBhIGNvbXBsZXRlCisgICAgICAgIG1hY2hpbmUtcmVhZGFibGUgY29weSBvZiB0aGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZSwgdG8gYmUKKyAgICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIHRlcm1zIG9mIFNlY3Rpb25zIDEgYW5kIDIgYWJvdmUgb24gYSBtZWRpdW0KKyAgICAgICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2U7IG9yLAorCisgICAgICAgIGMpIEFjY29tcGFueSBpdCB3aXRoIHRoZSBpbmZvcm1hdGlvbiB5b3UgcmVjZWl2ZWQgYXMgdG8gdGhlIG9mZmVyIHRvCisgICAgICAgIGRpc3RyaWJ1dGUgY29ycmVzcG9uZGluZyBzb3VyY2UgY29kZS4gKFRoaXMgYWx0ZXJuYXRpdmUgaXMgYWxsb3dlZAorICAgICAgICBvbmx5IGZvciBub25jb21tZXJjaWFsIGRpc3RyaWJ1dGlvbiBhbmQgb25seSBpZiB5b3UgcmVjZWl2ZWQgdGhlCisgICAgICAgIHByb2dyYW0gaW4gb2JqZWN0IGNvZGUgb3IgZXhlY3V0YWJsZSBmb3JtIHdpdGggc3VjaCBhbiBvZmZlciwgaW4KKyAgICAgICAgYWNjb3JkIHdpdGggU3Vic2VjdGlvbiBiIGFib3ZlLikKKworICAgIFRoZSBzb3VyY2UgY29kZSBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yayBmb3IKKyAgICBtYWtpbmcgbW9kaWZpY2F0aW9ucyB0byBpdC4gRm9yIGFuIGV4ZWN1dGFibGUgd29yaywgY29tcGxldGUgc291cmNlIGNvZGUKKyAgICBtZWFucyBhbGwgdGhlIHNvdXJjZSBjb2RlIGZvciBhbGwgbW9kdWxlcyBpdCBjb250YWlucywgcGx1cyBhbnkKKyAgICBhc3NvY2lhdGVkIGludGVyZmFjZSBkZWZpbml0aW9uIGZpbGVzLCBwbHVzIHRoZSBzY3JpcHRzIHVzZWQgdG8gY29udHJvbAorICAgIGNvbXBpbGF0aW9uIGFuZCBpbnN0YWxsYXRpb24gb2YgdGhlIGV4ZWN1dGFibGUuIEhvd2V2ZXIsIGFzIGEgc3BlY2lhbAorICAgIGV4Y2VwdGlvbiwgdGhlIHNvdXJjZSBjb2RlIGRpc3RyaWJ1dGVkIG5lZWQgbm90IGluY2x1ZGUgYW55dGhpbmcgdGhhdCBpcworICAgIG5vcm1hbGx5IGRpc3RyaWJ1dGVkIChpbiBlaXRoZXIgc291cmNlIG9yIGJpbmFyeSBmb3JtKSB3aXRoIHRoZSBtYWpvcgorICAgIGNvbXBvbmVudHMgKGNvbXBpbGVyLCBrZXJuZWwsIGFuZCBzbyBvbikgb2YgdGhlIG9wZXJhdGluZyBzeXN0ZW0gb24KKyAgICB3aGljaCB0aGUgZXhlY3V0YWJsZSBydW5zLCB1bmxlc3MgdGhhdCBjb21wb25lbnQgaXRzZWxmIGFjY29tcGFuaWVzIHRoZQorICAgIGV4ZWN1dGFibGUuCisKKyAgICBJZiBkaXN0cmlidXRpb24gb2YgZXhlY3V0YWJsZSBvciBvYmplY3QgY29kZSBpcyBtYWRlIGJ5IG9mZmVyaW5nIGFjY2VzcworICAgIHRvIGNvcHkgZnJvbSBhIGRlc2lnbmF0ZWQgcGxhY2UsIHRoZW4gb2ZmZXJpbmcgZXF1aXZhbGVudCBhY2Nlc3MgdG8gY29weQorICAgIHRoZSBzb3VyY2UgY29kZSBmcm9tIHRoZSBzYW1lIHBsYWNlIGNvdW50cyBhcyBkaXN0cmlidXRpb24gb2YgdGhlIHNvdXJjZQorICAgIGNvZGUsIGV2ZW4gdGhvdWdoIHRoaXJkIHBhcnRpZXMgYXJlIG5vdCBjb21wZWxsZWQgdG8gY29weSB0aGUgc291cmNlCisgICAgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuCisKKyAgICA0LiBZb3UgbWF5IG5vdCBjb3B5LCBtb2RpZnksIHN1YmxpY2Vuc2UsIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0KKyAgICBleGNlcHQgYXMgZXhwcmVzc2x5IHByb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gQW55IGF0dGVtcHQgb3RoZXJ3aXNlCisgICAgdG8gY29weSwgbW9kaWZ5LCBzdWJsaWNlbnNlIG9yIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gaXMgdm9pZCwgYW5kIHdpbGwKKyAgICBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlciB0aGlzIExpY2Vuc2UuIEhvd2V2ZXIsIHBhcnRpZXMKKyAgICB3aG8gaGF2ZSByZWNlaXZlZCBjb3BpZXMsIG9yIHJpZ2h0cywgZnJvbSB5b3UgdW5kZXIgdGhpcyBMaWNlbnNlIHdpbGwKKyAgICBub3QgaGF2ZSB0aGVpciBsaWNlbnNlcyB0ZXJtaW5hdGVkIHNvIGxvbmcgYXMgc3VjaCBwYXJ0aWVzIHJlbWFpbiBpbgorICAgIGZ1bGwgY29tcGxpYW5jZS4KKworICAgIDUuIFlvdSBhcmUgbm90IHJlcXVpcmVkIHRvIGFjY2VwdCB0aGlzIExpY2Vuc2UsIHNpbmNlIHlvdSBoYXZlIG5vdAorICAgIHNpZ25lZCBpdC4gSG93ZXZlciwgbm90aGluZyBlbHNlIGdyYW50cyB5b3UgcGVybWlzc2lvbiB0byBtb2RpZnkgb3IKKyAgICBkaXN0cmlidXRlIHRoZSBQcm9ncmFtIG9yIGl0cyBkZXJpdmF0aXZlIHdvcmtzLiBUaGVzZSBhY3Rpb25zIGFyZQorICAgIHByb2hpYml0ZWQgYnkgbGF3IGlmIHlvdSBkbyBub3QgYWNjZXB0IHRoaXMgTGljZW5zZS4gVGhlcmVmb3JlLCBieQorICAgIG1vZGlmeWluZyBvciBkaXN0cmlidXRpbmcgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorICAgIFByb2dyYW0pLCB5b3UgaW5kaWNhdGUgeW91ciBhY2NlcHRhbmNlIG9mIHRoaXMgTGljZW5zZSB0byBkbyBzbywgYW5kIGFsbAorICAgIGl0cyB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW5nIG9yIG1vZGlmeWluZyB0aGUKKyAgICBQcm9ncmFtIG9yIHdvcmtzIGJhc2VkIG9uIGl0LgorCisgICAgNi4gRWFjaCB0aW1lIHlvdSByZWRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gKG9yIGFueSB3b3JrIGJhc2VkIG9uIHRoZQorICAgIFByb2dyYW0pLCB0aGUgcmVjaXBpZW50IGF1dG9tYXRpY2FsbHkgcmVjZWl2ZXMgYSBsaWNlbnNlIGZyb20gdGhlCisgICAgb3JpZ2luYWwgbGljZW5zb3IgdG8gY29weSwgZGlzdHJpYnV0ZSBvciBtb2RpZnkgdGhlIFByb2dyYW0gc3ViamVjdCB0bworICAgIHRoZXNlIHRlcm1zIGFuZCBjb25kaXRpb25zLiBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIgcmVzdHJpY3Rpb25zCisgICAgb24gdGhlIHJlY2lwaWVudHMnIGV4ZXJjaXNlIG9mIHRoZSByaWdodHMgZ3JhbnRlZCBoZXJlaW4uIFlvdSBhcmUgbm90CisgICAgcmVzcG9uc2libGUgZm9yIGVuZm9yY2luZyBjb21wbGlhbmNlIGJ5IHRoaXJkIHBhcnRpZXMgdG8gdGhpcyBMaWNlbnNlLgorCisgICAgNy4gSWYsIGFzIGEgY29uc2VxdWVuY2Ugb2YgYSBjb3VydCBqdWRnbWVudCBvciBhbGxlZ2F0aW9uIG9mIHBhdGVudAorICAgIGluZnJpbmdlbWVudCBvciBmb3IgYW55IG90aGVyIHJlYXNvbiAobm90IGxpbWl0ZWQgdG8gcGF0ZW50IGlzc3VlcyksCisgICAgY29uZGl0aW9ucyBhcmUgaW1wb3NlZCBvbiB5b3UgKHdoZXRoZXIgYnkgY291cnQgb3JkZXIsIGFncmVlbWVudCBvcgorICAgIG90aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKKyAgICBleGN1c2UgeW91IGZyb20gdGhlIGNvbmRpdGlvbnMgb2YgdGhpcyBMaWNlbnNlLiBJZiB5b3UgY2Fubm90IGRpc3RyaWJ1dGUKKyAgICBzbyBhcyB0byBzYXRpc2Z5IHNpbXVsdGFuZW91c2x5IHlvdXIgb2JsaWdhdGlvbnMgdW5kZXIgdGhpcyBMaWNlbnNlIGFuZAorICAgIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UgbWF5IG5vdAorICAgIGRpc3RyaWJ1dGUgdGhlIFByb2dyYW0gYXQgYWxsLiBGb3IgZXhhbXBsZSwgaWYgYSBwYXRlbnQgbGljZW5zZSB3b3VsZAorICAgIG5vdCBwZXJtaXQgcm95YWx0eS1mcmVlIHJlZGlzdHJpYnV0aW9uIG9mIHRoZSBQcm9ncmFtIGJ5IGFsbCB0aG9zZSB3aG8KKyAgICByZWNlaXZlIGNvcGllcyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IHRocm91Z2ggeW91LCB0aGVuIHRoZSBvbmx5IHdheSB5b3UKKyAgICBjb3VsZCBzYXRpc2Z5IGJvdGggaXQgYW5kIHRoaXMgTGljZW5zZSB3b3VsZCBiZSB0byByZWZyYWluIGVudGlyZWx5IGZyb20KKyAgICBkaXN0cmlidXRpb24gb2YgdGhlIFByb2dyYW0uCisKKyAgICBJZiBhbnkgcG9ydGlvbiBvZiB0aGlzIHNlY3Rpb24gaXMgaGVsZCBpbnZhbGlkIG9yIHVuZW5mb3JjZWFibGUgdW5kZXIKKyAgICBhbnkgcGFydGljdWxhciBjaXJjdW1zdGFuY2UsIHRoZSBiYWxhbmNlIG9mIHRoZSBzZWN0aW9uIGlzIGludGVuZGVkIHRvCisgICAgYXBwbHkgYW5kIHRoZSBzZWN0aW9uIGFzIGEgd2hvbGUgaXMgaW50ZW5kZWQgdG8gYXBwbHkgaW4gb3RoZXIKKyAgICBjaXJjdW1zdGFuY2VzLgorCisgICAgSXQgaXMgbm90IHRoZSBwdXJwb3NlIG9mIHRoaXMgc2VjdGlvbiB0byBpbmR1Y2UgeW91IHRvIGluZnJpbmdlIGFueQorICAgIHBhdGVudHMgb3Igb3RoZXIgcHJvcGVydHkgcmlnaHQgY2xhaW1zIG9yIHRvIGNvbnRlc3QgdmFsaWRpdHkgb2YgYW55CisgICAgc3VjaCBjbGFpbXM7IHRoaXMgc2VjdGlvbiBoYXMgdGhlIHNvbGUgcHVycG9zZSBvZiBwcm90ZWN0aW5nIHRoZQorICAgIGludGVncml0eSBvZiB0aGUgZnJlZSBzb2Z0d2FyZSBkaXN0cmlidXRpb24gc3lzdGVtLCB3aGljaCBpcyBpbXBsZW1lbnRlZAorICAgIGJ5IHB1YmxpYyBsaWNlbnNlIHByYWN0aWNlcy4gTWFueSBwZW9wbGUgaGF2ZSBtYWRlIGdlbmVyb3VzCisgICAgY29udHJpYnV0aW9ucyB0byB0aGUgd2lkZSByYW5nZSBvZiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB0aHJvdWdoIHRoYXQKKyAgICBzeXN0ZW0gaW4gcmVsaWFuY2Ugb24gY29uc2lzdGVudCBhcHBsaWNhdGlvbiBvZiB0aGF0IHN5c3RlbTsgaXQgaXMgdXAgdG8KKyAgICB0aGUgYXV0aG9yL2Rvbm9yIHRvIGRlY2lkZSBpZiBoZSBvciBzaGUgaXMgd2lsbGluZyB0byBkaXN0cmlidXRlCisgICAgc29mdHdhcmUgdGhyb3VnaCBhbnkgb3RoZXIgc3lzdGVtIGFuZCBhIGxpY2Vuc2VlIGNhbm5vdCBpbXBvc2UgdGhhdCBjaG9pY2UuCisKKyAgICBUaGlzIHNlY3Rpb24gaXMgaW50ZW5kZWQgdG8gbWFrZSB0aG9yb3VnaGx5IGNsZWFyIHdoYXQgaXMgYmVsaWV2ZWQgdG8gYmUKKyAgICBhIGNvbnNlcXVlbmNlIG9mIHRoZSByZXN0IG9mIHRoaXMgTGljZW5zZS4KKworICAgIDguIElmIHRoZSBkaXN0cmlidXRpb24gYW5kL29yIHVzZSBvZiB0aGUgUHJvZ3JhbSBpcyByZXN0cmljdGVkIGluCisgICAgY2VydGFpbiBjb3VudHJpZXMgZWl0aGVyIGJ5IHBhdGVudHMgb3IgYnkgY29weXJpZ2h0ZWQgaW50ZXJmYWNlcywgdGhlCisgICAgb3JpZ2luYWwgY29weXJpZ2h0IGhvbGRlciB3aG8gcGxhY2VzIHRoZSBQcm9ncmFtIHVuZGVyIHRoaXMgTGljZW5zZSBtYXkKKyAgICBhZGQgYW4gZXhwbGljaXQgZ2VvZ3JhcGhpY2FsIGRpc3RyaWJ1dGlvbiBsaW1pdGF0aW9uIGV4Y2x1ZGluZyB0aG9zZQorICAgIGNvdW50cmllcywgc28gdGhhdCBkaXN0cmlidXRpb24gaXMgcGVybWl0dGVkIG9ubHkgaW4gb3IgYW1vbmcgY291bnRyaWVzCisgICAgbm90IHRodXMgZXhjbHVkZWQuIEluIHN1Y2ggY2FzZSwgdGhpcyBMaWNlbnNlIGluY29ycG9yYXRlcyB0aGUKKyAgICBsaW1pdGF0aW9uIGFzIGlmIHdyaXR0ZW4gaW4gdGhlIGJvZHkgb2YgdGhpcyBMaWNlbnNlLgorCisgICAgOS4gVGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiBtYXkgcHVibGlzaCByZXZpc2VkIGFuZC9vciBuZXcKKyAgICB2ZXJzaW9ucyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmcm9tIHRpbWUgdG8gdGltZS4gU3VjaCBuZXcKKyAgICB2ZXJzaW9ucyB3aWxsIGJlIHNpbWlsYXIgaW4gc3Bpcml0IHRvIHRoZSBwcmVzZW50IHZlcnNpb24sIGJ1dCBtYXkKKyAgICBkaWZmZXIgaW4gZGV0YWlsIHRvIGFkZHJlc3MgbmV3IHByb2JsZW1zIG9yIGNvbmNlcm5zLgorCisgICAgRWFjaCB2ZXJzaW9uIGlzIGdpdmVuIGEgZGlzdGluZ3Vpc2hpbmcgdmVyc2lvbiBudW1iZXIuIElmIHRoZSBQcm9ncmFtCisgICAgc3BlY2lmaWVzIGEgdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBMaWNlbnNlIHdoaWNoIGFwcGxpZXMgdG8gaXQgYW5kICJhbnkKKyAgICBsYXRlciB2ZXJzaW9uIiwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiBmb2xsb3dpbmcgdGhlIHRlcm1zIGFuZAorICAgIGNvbmRpdGlvbnMgZWl0aGVyIG9mIHRoYXQgdmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkKKyAgICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbgorICAgIG51bWJlciBvZiB0aGlzIExpY2Vuc2UsIHlvdSBtYXkgY2hvb3NlIGFueSB2ZXJzaW9uIGV2ZXIgcHVibGlzaGVkIGJ5IHRoZQorICAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKworICAgIDEwLiBJZiB5b3Ugd2lzaCB0byBpbmNvcnBvcmF0ZSBwYXJ0cyBvZiB0aGUgUHJvZ3JhbSBpbnRvIG90aGVyIGZyZWUKKyAgICBwcm9ncmFtcyB3aG9zZSBkaXN0cmlidXRpb24gY29uZGl0aW9ucyBhcmUgZGlmZmVyZW50LCB3cml0ZSB0byB0aGUKKyAgICBhdXRob3IgdG8gYXNrIGZvciBwZXJtaXNzaW9uLiBGb3Igc29mdHdhcmUgd2hpY2ggaXMgY29weXJpZ2h0ZWQgYnkgdGhlCisgICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyB3ZQorICAgIHNvbWV0aW1lcyBtYWtlIGV4Y2VwdGlvbnMgZm9yIHRoaXMuIE91ciBkZWNpc2lvbiB3aWxsIGJlIGd1aWRlZCBieSB0aGUKKyAgICB0d28gZ29hbHMgb2YgcHJlc2VydmluZyB0aGUgZnJlZSBzdGF0dXMgb2YgYWxsIGRlcml2YXRpdmVzIG9mIG91ciBmcmVlCisgICAgc29mdHdhcmUgYW5kIG9mIHByb21vdGluZyB0aGUgc2hhcmluZyBhbmQgcmV1c2Ugb2Ygc29mdHdhcmUgZ2VuZXJhbGx5LgorCisgICAgTk8gV0FSUkFOVFkKKworICAgIDExLiBCRUNBVVNFIFRIRSBQUk9HUkFNIElTIExJQ0VOU0VEIEZSRUUgT0YgQ0hBUkdFLCBUSEVSRSBJUyBOTworICAgIFdBUlJBTlRZIEZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkgQVBQTElDQUJMRSBMQVcuCisgICAgRVhDRVBUIFdIRU4gT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQvT1IKKyAgICBPVEhFUiBQQVJUSUVTIFBST1ZJREUgVEhFIFBST0dSQU0gIkFTIElTIiBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELAorICAgIEVJVEhFUiBFWFBSRVNTRUQgT1IgSU1QTElFRCwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVECisgICAgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBUSEUKKyAgICBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0gSVMgV0lUSAorICAgIFlPVS4gU0hPVUxEIFRIRSBQUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRiBBTEwKKyAgICBORUNFU1NBUlkgU0VSVklDSU5HLCBSRVBBSVIgT1IgQ09SUkVDVElPTi4KKworICAgIDEyLiBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOCisgICAgV1JJVElORyBXSUxMIEFOWSBDT1BZUklHSFQgSE9MREVSLCBPUiBBTlkgT1RIRVIgUEFSVFkgV0hPIE1BWSBNT0RJRlkKKyAgICBBTkQvT1IgUkVESVNUUklCVVRFIFRIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IKKyAgICBEQU1BR0VTLCBJTkNMVURJTkcgQU5ZIEdFTkVSQUwsIFNQRUNJQUwsIElOQ0lERU5UQUwgT1IgQ09OU0VRVUVOVElBTAorICAgIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPUiBJTkFCSUxJVFkgVE8gVVNFIFRIRSBQUk9HUkFNCisgICAgKElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gTE9TUyBPRiBEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQKKyAgICBJTkFDQ1VSQVRFIE9SIExPU1NFUyBTVVNUQUlORUQgQlkgWU9VIE9SIFRISVJEIFBBUlRJRVMgT1IgQSBGQUlMVVJFIE9GCisgICAgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUiBQUk9HUkFNUyksIEVWRU4gSUYgU1VDSCBIT0xERVIgT1IKKyAgICBPVEhFUiBQQVJUWSBIQVMgQkVFTiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRVMuCisKKyAgICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKKworICAgIEhvdyB0byBBcHBseSBUaGVzZSBUZXJtcyB0byBZb3VyIE5ldyBQcm9ncmFtcworCisgICAgSWYgeW91IGRldmVsb3AgYSBuZXcgcHJvZ3JhbSwgYW5kIHlvdSB3YW50IGl0IHRvIGJlIG9mIHRoZSBncmVhdGVzdAorICAgIHBvc3NpYmxlIHVzZSB0byB0aGUgcHVibGljLCB0aGUgYmVzdCB3YXkgdG8gYWNoaWV2ZSB0aGlzIGlzIHRvIG1ha2UgaXQKKyAgICBmcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KKworICAgIFRvIGRvIHNvLCBhdHRhY2ggdGhlIGZvbGxvd2luZyBub3RpY2VzIHRvIHRoZSBwcm9ncmFtLiBJdCBpcyBzYWZlc3QgdG8KKyAgICBhdHRhY2ggdGhlbSB0byB0aGUgc3RhcnQgb2YgZWFjaCBzb3VyY2UgZmlsZSB0byBtb3N0IGVmZmVjdGl2ZWx5IGNvbnZleQorICAgIHRoZSBleGNsdXNpb24gb2Ygd2FycmFudHk7IGFuZCBlYWNoIGZpbGUgc2hvdWxkIGhhdmUgYXQgbGVhc3QgdGhlCisgICAgImNvcHlyaWdodCIgbGluZSBhbmQgYSBwb2ludGVyIHRvIHdoZXJlIHRoZSBmdWxsIG5vdGljZSBpcyBmb3VuZC4KKworICAgICAgICBPbmUgbGluZSB0byBnaXZlIHRoZSBwcm9ncmFtJ3MgbmFtZSBhbmQgYSBicmllZiBpZGVhIG9mIHdoYXQgaXQgZG9lcy4KKyAgICAgICAgQ29weXJpZ2h0IChDKSA8eWVhcj4gPG5hbWUgb2YgYXV0aG9yPgorCisgICAgICAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICAgICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgICAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgICAgICAgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgICAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICAgICAgICBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICAgICAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gU2VlIHRoZSBHTlUKKyAgICAgICAgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICAgICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgICAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgICAgICAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMzNSBVU0EKKworICAgIEFsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgorCisgICAgSWYgdGhlIHByb2dyYW0gaXMgaW50ZXJhY3RpdmUsIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQgbm90aWNlIGxpa2UgdGhpcworICAgIHdoZW4gaXQgc3RhcnRzIGluIGFuIGludGVyYWN0aXZlIG1vZGU6CisKKyAgICAgICAgR25vbW92aXNpb24gdmVyc2lvbiA2OSwgQ29weXJpZ2h0IChDKSB5ZWFyIG5hbWUgb2YgYXV0aG9yCisgICAgICAgIEdub21vdmlzaW9uIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWTsgZm9yIGRldGFpbHMgdHlwZQorICAgICAgICBgc2hvdyB3Jy4gVGhpcyBpcyBmcmVlIHNvZnR3YXJlLCBhbmQgeW91IGFyZSB3ZWxjb21lIHRvIHJlZGlzdHJpYnV0ZQorICAgICAgICBpdCB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCisKKyAgICBUaGUgaHlwb3RoZXRpY2FsIGNvbW1hbmRzIGBzaG93IHcnIGFuZCBgc2hvdyBjJyBzaG91bGQgc2hvdyB0aGUKKyAgICBhcHByb3ByaWF0ZSBwYXJ0cyBvZiB0aGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZS4gT2YgY291cnNlLCB0aGUgY29tbWFuZHMKKyAgICB5b3UgdXNlIG1heSBiZSBjYWxsZWQgc29tZXRoaW5nIG90aGVyIHRoYW4gYHNob3cgdycgYW5kIGBzaG93IGMnOyB0aGV5CisgICAgY291bGQgZXZlbiBiZSBtb3VzZS1jbGlja3Mgb3IgbWVudSBpdGVtcy0td2hhdGV2ZXIgc3VpdHMgeW91ciBwcm9ncmFtLgorCisgICAgWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHlvdXIKKyAgICBzY2hvb2wsIGlmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZgorICAgIG5lY2Vzc2FyeS4gSGVyZSBpcyBhIHNhbXBsZTsgYWx0ZXIgdGhlIG5hbWVzOgorCisgICAgICAgIFlveW9keW5lLCBJbmMuLCBoZXJlYnkgZGlzY2xhaW1zIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlCisgICAgICAgIHByb2dyYW0gYEdub21vdmlzaW9uJyAod2hpY2ggbWFrZXMgcGFzc2VzIGF0IGNvbXBpbGVycykgd3JpdHRlbiBieQorICAgICAgICBKYW1lcyBIYWNrZXIuCisKKyAgICAgICAgc2lnbmF0dXJlIG9mIFR5IENvb24sIDEgQXByaWwgMTk4OQorICAgICAgICBUeSBDb29uLCBQcmVzaWRlbnQgb2YgVmljZQorCisgICAgVGhpcyBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGRvZXMgbm90IHBlcm1pdCBpbmNvcnBvcmF0aW5nIHlvdXIgcHJvZ3JhbQorICAgIGludG8gcHJvcHJpZXRhcnkgcHJvZ3JhbXMuIElmIHlvdXIgcHJvZ3JhbSBpcyBhIHN1YnJvdXRpbmUgbGlicmFyeSwgeW91CisgICAgbWF5IGNvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucworICAgIHdpdGggdGhlIGxpYnJhcnkuIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGlicmFyeQorICAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW5zdGVhZCBvZiB0aGlzIExpY2Vuc2UuCisKKy0tLQorCisjIyBDTEFTU1BBVEggRVhDRVBUSU9OCisKKyAgICBMaW5raW5nIHRoaXMgbGlicmFyeSBzdGF0aWNhbGx5IG9yIGR5bmFtaWNhbGx5IHdpdGggb3RoZXIgbW9kdWxlcyBpcworICAgIG1ha2luZyBhIGNvbWJpbmVkIHdvcmsgYmFzZWQgb24gdGhpcyBsaWJyYXJ5LiAgVGh1cywgdGhlIHRlcm1zIGFuZAorICAgIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBjb3ZlciB0aGUgd2hvbGUKKyAgICBjb21iaW5hdGlvbi4KKworICAgIEFzIGEgc3BlY2lhbCBleGNlcHRpb24sIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZiB0aGlzIGxpYnJhcnkgZ2l2ZSB5b3UKKyAgICBwZXJtaXNzaW9uIHRvIGxpbmsgdGhpcyBsaWJyYXJ5IHdpdGggaW5kZXBlbmRlbnQgbW9kdWxlcyB0byBwcm9kdWNlIGFuCisgICAgZXhlY3V0YWJsZSwgcmVnYXJkbGVzcyBvZiB0aGUgbGljZW5zZSB0ZXJtcyBvZiB0aGVzZSBpbmRlcGVuZGVudAorICAgIG1vZHVsZXMsIGFuZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHRoZSByZXN1bHRpbmcgZXhlY3V0YWJsZSB1bmRlcgorICAgIHRlcm1zIG9mIHlvdXIgY2hvaWNlLCBwcm92aWRlZCB0aGF0IHlvdSBhbHNvIG1lZXQsIGZvciBlYWNoIGxpbmtlZAorICAgIGluZGVwZW5kZW50IG1vZHVsZSwgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBsaWNlbnNlIG9mIHRoYXQKKyAgICBtb2R1bGUuICBBbiBpbmRlcGVuZGVudCBtb2R1bGUgaXMgYSBtb2R1bGUgd2hpY2ggaXMgbm90IGRlcml2ZWQgZnJvbSBvcgorICAgIGJhc2VkIG9uIHRoaXMgbGlicmFyeS4gIElmIHlvdSBtb2RpZnkgdGhpcyBsaWJyYXJ5LCB5b3UgbWF5IGV4dGVuZCB0aGlzCisgICAgZXhjZXB0aW9uIHRvIHlvdXIgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgYnV0IHlvdSBhcmUgbm90IG9ibGlnYXRlZCB0bworICAgIGRvIHNvLiAgSWYgeW91IGRvIG5vdCB3aXNoIHRvIGRvIHNvLCBkZWxldGUgdGhpcyBleGNlcHRpb24gc3RhdGVtZW50CisgICAgZnJvbSB5b3VyIHZlcnNpb24uCmRpZmYgLS1naXQgYS9OT1RJQ0UubWQgYi9OT1RJQ0UubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhkNmIzOAotLS0gL2Rldi9udWxsCisrKyBiL05PVElDRS5tZApAQCAtMCwwICsxLDExMyBAQAorIyBOb3RpY2UgZm9yIEplcnNleSANCitUaGlzIGNvbnRlbnQgaXMgcHJvZHVjZWQgYW5kIG1haW50YWluZWQgYnkgdGhlIEVjbGlwc2UgSmVyc2V5IHByb2plY3QuDQorDQorKiAgUHJvamVjdCBob21lOiBodHRwczovL3Byb2plY3RzLmVjbGlwc2Uub3JnL3Byb2plY3RzL2VlNGouamVyc2V5DQorDQorIyMgVHJhZGVtYXJrcw0KK0VjbGlwc2UgSmVyc2V5IGlzIGEgdHJhZGVtYXJrIG9mIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24uDQorDQorIyMgQ29weXJpZ2h0DQorDQorQWxsIGNvbnRlbnQgaXMgdGhlIHByb3BlcnR5IG9mIHRoZSByZXNwZWN0aXZlIGF1dGhvcnMgb3IgdGhlaXIgZW1wbG95ZXJzLiBGb3INCittb3JlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBhdXRob3JzaGlwIG9mIGNvbnRlbnQsIHBsZWFzZSBjb25zdWx0IHRoZSBsaXN0ZWQNCitzb3VyY2UgY29kZSByZXBvc2l0b3J5IGxvZ3MuDQorDQorIyMgRGVjbGFyZWQgUHJvamVjdCBMaWNlbnNlcw0KKw0KK1RoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcw0KK29mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQNCitodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZQ0KK2F2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeSBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoDQorYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VDQorR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uIHdoaWNoIGlzDQorYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4NCisNCitTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjANCisNCisjIyBTb3VyY2UgQ29kZQ0KK1RoZSBwcm9qZWN0IG1haW50YWlucyB0aGUgZm9sbG93aW5nIHNvdXJjZSBjb2RlIHJlcG9zaXRvcmllczoNCisNCisqIGh0dHBzOi8vZ2l0aHViLmNvbS9lY2xpcHNlLWVlNGovamVyc2V5DQorDQorIyMgVGhpcmQtcGFydHkgQ29udGVudA0KKw0KK0FuZ3VsYXIgSlMsIHYxLjYuNg0KKyogTGljZW5zZSBNSVQgKGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwKQ0KKyogUHJvamVjdDogaHR0cDovL2FuZ3VsYXJqcy5vcmcNCisqIENveXJpZ2h0OiAoYykgMjAxMC0yMDE3IEdvb2dsZSwgSW5jLg0KKw0KK2FvcGFsbGlhbmNlIFZlcnNpb24gMQ0KKyogTGljZW5zZTogYWxsIHRoZSBzb3VyY2UgY29kZSBwcm92aWRlZCBieSBBT1AgQWxsaWFuY2UgaXMgUHVibGljIERvbWFpbi4NCisqIFByb2plY3Q6IGh0dHA6Ly9hb3BhbGxpYW5jZS5zb3VyY2Vmb3JnZS5uZXQNCisqIENvcHlyaWdodDogTWF0ZXJpYWwgaW4gdGhlIHB1YmxpYyBkb21haW4gaXMgbm90IHByb3RlY3RlZCBieSBjb3B5cmlnaHQNCisNCitCZWFuIFZhbGlkYXRpb24gQVBJIDEuMS4wLkZpbmFsDQorKiBMaWNlbnNlOiBBcGFjaGUgTGljZW5zZSwgMi4wDQorKiBQcm9qZWN0OiBodHRwOi8vYmVhbnZhbGlkYXRpb24ub3JnLzEuMS8NCisqIENvcHlyaWdodDogMjAwOSwgUmVkIEhhdCwgSW5jLiBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMsIGFuZCBpbmRpdmlkdWFsIGNvbnRyaWJ1dG9ycw0KKyogYnkgdGhlIEBhdXRob3JzIHRhZy4NCisNCitCb290c3RyYXAgdjMuMy43DQorKiBMaWNlbnNlOiBNSVQgbGljZW5zZSAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFzdGVyL0xJQ0VOU0UpDQorKiBQcm9qZWN0OiBodHRwOi8vZ2V0Ym9vdHN0cmFwLmNvbQ0KKyogQ29weXJpZ2h0OiAyMDExLTIwMTYgVHdpdHRlciwgSW5jDQorDQorQ0RJIEFQSSBWZXJzaW9uIDEuMQ0KKyogTGljZW5zZTogQXBhY2hlIExpY2Vuc2UsIDIuMA0KKyogUHJvamVjdDogaHR0cDovL3d3dy5zZWFtZnJhbWV3b3JrLm9yZy9XZWxkDQorKiBDb3B5cmlnaHQgMjAxMCwgUmVkIEhhdCwgSW5jLiwgYW5kIGluZGl2aWR1YWwgY29udHJpYnV0b3JzIGJ5IHRoZSBAYXV0aG9ycyB0YWcuDQorDQorR29vZ2xlIEd1YXZhIFZlcnNpb24gMTguMA0KKyogTGljZW5zZTogQXBhY2hlIExpY2Vuc2UsIDIuMA0KKyogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBHdWF2YSBBdXRob3JzDQorDQoramF2YXguaW5qZWN0IFZlcnNpb246IDENCisqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjANCisqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgSlNSLTMzMCBFeHBlcnQgR3JvdXANCisNCitKYXZhc3Npc3QgVmVyc2lvbiAzLjIyLjAtQ1IyDQorKiBMaWNlbnNlOiBBcGFjaGUgTGljZW5zZSwgMi4wDQorKiBQcm9qZWN0OiBodHRwOi8vd3d3LmphdmFzc2lzdC5vcmcvDQorKiBDb3B5cmlnaHQgKEMpIDE5OTktIFNoaWdlcnUgQ2hpYmEuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorDQorSmF2YShUTSkgRUUgSW50ZXJjZXB0b3JzIDEuMSBBUEkgVmVyc2lvbiAxLjAuMC5CZXRhMQ0KKyogTGljZW5zZTogTEdQTCAyLjENCisqIENvcHlyaWdodCAyMDA1LCBKQm9zcyBJbmMuLCBhbmQgaW5kaXZpZHVhbCBjb250cmlidXRvcnMgYXMgaW5kaWNhdGVkIGJ5IHRoZSBAYXV0aG9ycyB0YWcuDQorDQorSmFja3NvbiBKQVgtUlMgUHJvdmlkZXJzIFZlcnNpb24gMi44LjEwDQorKiBMaWNlbnNlOiBBcGFjaGUgTGljZW5zZSwgMi4wDQorKiBQcm9qZWN0OiBodHRwczovL2dpdGh1Yi5jb20vRmFzdGVyWE1ML2phY2tzb24tamF4cnMtcHJvdmlkZXJzDQorKiBDb3B5cmlnaHQ6IChjKSAyMDA5LTIwMTEgRmFzdGVyWE1MLCBMTEMuIEFsbCByaWdodHMgcmVzZXJ2ZWQgdW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQuDQorDQoralF1ZXJ5IHYxLjEyLjQNCisqIExpY2Vuc2U6IGpxdWVyeS5vcmcvbGljZW5zZQ0KKyogUHJvamVjdDoganF1ZXJ5Lm9yZw0KKyogQ29weXJpZ2h0OiAoYykgalF1ZXJ5IEZvdW5kYXRpb24NCisNCitqUXVlcnkgQmFyY29kZSBwbHVnaW4gMC4zDQorKiBMaWNlbnNlOiBNSVQgJiBHUEwgKGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwICYgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC5odG1sKQ0KKyogUHJvamVjdDogIGh0dHA6Ly93d3cucGFzZWxsYS5pdC9wcm9qZWN0cy9qUXVlcnkvYmFyY29kZQ0KKyogQ29weXJpZ2h0OiAoYykgMjAwOSBBbnRvbmVsbG8gUGFzZWxsYSBhbnRvbmVsbG8ucGFzZWxsYUBnbWFpbC5jb20NCisNCitKU1ItMTY2IEV4dGVuc2lvbiAtIEpFUCAyNjYNCisqIExpY2Vuc2U6IENDMA0KKyogTm8gY29weXJpZ2h0DQorKiBXcml0dGVuIGJ5IERvdWcgTGVhIHdpdGggYXNzaXN0YW5jZSBmcm9tIG1lbWJlcnMgb2YgSkNQIEpTUi0xNjYgRXhwZXJ0IEdyb3VwIGFuZCByZWxlYXNlZCB0byB0aGUgcHVibGljIGRvbWFpbiwgYXMgZXhwbGFpbmVkIGF0IGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL3B1YmxpY2RvbWFpbi96ZXJvLzEuMC8NCisNCitLaW5ldGljSlMsIHY0LjcuMQ0KKyogTGljZW5zZTogTUlUIGxpY2Vuc2UgKGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvbWl0LWxpY2Vuc2UucGhwKQ0KKyogUHJvamVjdDogaHR0cDovL3d3dy5raW5ldGljanMuY29tLCBodHRwczovL2dpdGh1Yi5jb20vZXJpY2Ryb3dlbGwvS2luZXRpY0pTDQorKiBDb3B5cmlnaHQ6IEVyaWMgUm93ZWxsDQorDQorb3JnLm9iamVjdHdlYi5hc20gVmVyc2lvbiA1LjAuNA0KKyogTGljZW5zZTogTW9kaWZpZWQgQlNEIChodHRwOi8vYXNtLm9iamVjdHdlYi5vcmcvbGljZW5zZS5odG1sKQ0KKyogQ29weXJpZ2h0IChjKSAyMDAwLTIwMTEgSU5SSUEsIEZyYW5jZSBUZWxlY29tLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKw0KK29yZy5vc2dpLmNvcmUgdmVyc2lvbiA0LjIuMA0KKyogTGljZW5zZTogQXBhY2hlIExpY2Vuc2UsIDIuMA0KKyogQ29weXJpZ2h0IChjKSBPU0dpIEFsbGlhbmNlICgyMDA1LCAyMDA4KS4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCisNCitvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwubW9uaXRvcmluZy5jb3JlDQorKiBMaWNlbnNlOiBBcGFjaGUgTGljZW5zZSwgMi4wDQorKiBDb3B5cmlnaHQgKGMpIDIwMTUtMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKyogQ29weXJpZ2h0IDIwMTAtMjAxMyBDb2RhIEhhbGUgYW5kIFlhbW1lciwgSW5jLg0KZGlmZiAtLWdpdCBhL1JFQURNRS5tZCBiL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzRmNmVhCi0tLSAvZGV2L251bGwKKysrIGIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNDggQEAKK1svL106ICMgIiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIg0KK1svL106ICMgIiAgIg0KK1svL106ICMgIiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgIg0KK1svL106ICMgIiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCAiDQorWy8vXTogIyAiIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4gIg0KK1svL106ICMgIiAgIg0KK1svL106ICMgIiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5ICINCitbLy9dOiAjICIgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZSAiDQorWy8vXTogIyAiIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCAiDQorWy8vXTogIyAiIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0ICINCitbLy9dOiAjICIgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLiAiDQorWy8vXTogIyAiICAiDQorWy8vXTogIyAiIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMCAiDQorDQorIyMjIEFib3V0IEplcnNleQ0KKw0KK0plcnNleSBpcyBhIFJFU1QgZnJhbWV3b3JrIHRoYXQgcHJvdmlkZXMgSkFYLVJTIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiBhbmQgbW9yZS4NCitKZXJzZXkgcHJvdmlkZXMgaXRzIG93biBbQVBJc11bamVyc2V5LWFwaV0gdGhhdCBleHRlbmQgdGhlIEpBWC1SUyB0b29sa2l0IHdpdGgNCithZGRpdGlvbmFsIGZlYXR1cmVzIGFuZCB1dGlsaXRpZXMgdG8gZnVydGhlciBzaW1wbGlmeSBSRVNUZnVsIHNlcnZpY2UgYW5kIGNsaWVudA0KK2RldmVsb3BtZW50LiBKZXJzZXkgYWxzbyBleHBvc2VzIG51bWVyb3VzIGV4dGVuc2lvbiBTUElzIHNvIHRoYXQgZGV2ZWxvcGVycyBtYXkNCitleHRlbmQgSmVyc2V5IHRvIGJlc3Qgc3VpdCB0aGVpciBuZWVkcy4NCisNCitHb2FscyBvZiBKZXJzZXkgcHJvamVjdCBjYW4gYmUgc3VtbWFyaXplZCBpbiB0aGUgZm9sbG93aW5nIHBvaW50czoNCisNCisqICAgVHJhY2sgdGhlIEpBWC1SUyBBUEkgYW5kIHByb3ZpZGUgcmVndWxhciByZWxlYXNlcyBvZiBwcm9kdWN0aW9uIHF1YWxpdHkNCisgICAgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9ucyB0aGF0IHNoaXBzIHdpdGggR2xhc3NGaXNoOw0KKyogICBQcm92aWRlIEFQSXMgdG8gZXh0ZW5kIEplcnNleSAmIEJ1aWxkIGEgY29tbXVuaXR5IG9mIHVzZXJzIGFuZCBkZXZlbG9wZXJzOw0KKyAgICBhbmQgZmluYWxseQ0KKyogICBNYWtlIGl0IGVhc3kgdG8gYnVpbGQgUkVTVGZ1bCBXZWIgc2VydmljZXMgdXRpbGlzaW5nIEphdmEgYW5kIHRoZQ0KKyAgICBKYXZhIFZpcnR1YWwgTWFjaGluZS4NCisNCisjIyMgTGljZW5zaW5nIGFuZCBHb3Zlcm5hbmNlDQorSmVyc2V5IGlzIGxpY2Vuc2VkIHVuZGVyIGEgZHVhbCBsaWNlbnNlIC0gW0VQTCAyLjAgYW5kIEdQTCAyLjAgd2l0aCBDbGFzcy1wYXRoIEV4Y2VwdGlvbl0oTElDRU5TRS5tZCkuDQorVGhhdCBtZWFucyB5b3UgY2FuIGNob29zZSB3aGljaCBvbmUgb2YgdGhlIHR3byBzdWl0cyB5b3VyIG5lZWRzIGJldHRlciBhbmQgdXNlIGl0IHVuZGVyIHRob3NlIHRlcm1zLg0KKw0KK1dlIHVzZSBbY29udHJpYnV0aW9uIHBvbGljeV0oQ09OVFJJQlVUSU5HLm1kKSwgd2hpY2ggbWVhbnMgd2UgY2FuIG9ubHkgYWNjZXB0IGNvbnRyaWJ1dGlvbnMgdW5kZXINCisgdGhlIHRlcm1zIG9mIFtFQ0FdW2VjYV0uDQorDQorIyMjIE1vcmUgSW5mbyBvbiBKZXJzZXkNCitTZWUgdGhlIFtKZXJzZXkgd2Vic2l0ZV1bamVyc2V5LXdlYl0gdG8gYWNjZXNzIEplcnNleSBkb2N1bWVudGF0aW9uLiBJZiB5b3UgcnVuIGludG8gYW55IGlzc3VlcyBvciBoYXZlIHF1ZXN0aW9ucywNCithc2sgYXQgW2plcnNleS1kZXZAZWNsaXBzZS5vcmddW2plcnNleS11c2Vyc10sIFtTdGFja092ZXJmbG93XVtqZXJzZXktc29dIG9yIGZpbGUgYW4gaXNzdWUgb24gW0plcnNleSBHaXRIdWIgUHJvamVjdF1bamVyc2V5LWlzc3Vlc10uDQorDQorW2VjYV06IGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvRUNBLnBocA0KK1tqZXJzZXktYXBpXTogaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL2FwaWRvY3MvbGF0ZXN0L2plcnNleS9pbmRleC5odG1sDQorW2plcnNleS1pc3N1ZXNdOiBodHRwczovL2dpdGh1Yi5jb20vZWNsaXBzZS1lZTRqL2plcnNleS9pc3N1ZXMNCitbamVyc2V5LXNvXTogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy90YWdnZWQvamVyc2V5DQorW2plcnNleS11c2Vyc106IG1haWx0bzpqZXJzZXktZGV2QGVjbGlwc2Uub3JnDQorW2plcnNleS13ZWJdOiBodHRwczovL3Byb2plY3RzLmVjbGlwc2Uub3JnL3Byb2plY3RzL2VlNGouamVyc2V5DQpkaWZmIC0tZ2l0IGEvYXJjaGV0eXBlcy9qZXJzZXktZXhhbXBsZS1qYXZhOC13ZWJhcHAvUkVBRE1FLk1EIGIvYXJjaGV0eXBlcy9qZXJzZXktZXhhbXBsZS1qYXZhOC13ZWJhcHAvUkVBRE1FLk1ECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMGExNTEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoZXR5cGVzL2plcnNleS1leGFtcGxlLWphdmE4LXdlYmFwcC9SRUFETUUuTUQKQEAgLTAsMCArMSw0NyBAQAorWy8vXTogIyAiIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAiCitbLy9dOiAjICIgICIKK1svL106ICMgIiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgIgorWy8vXTogIyAiIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0ICIKK1svL106ICMgIiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuICIKK1svL106ICMgIiAgIgorWy8vXTogIyAiIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkgIgorWy8vXTogIyAiIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUgIgorWy8vXTogIyAiIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCAiCitbLy9dOiAjICIgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQgIgorWy8vXTogIyAiIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4gIgorWy8vXTogIyAiICAiCitbLy9dOiAjICIgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wICIKKworSmVyc2V5IChKYXZhOCkgV2ViQXBwIEV4YW1wbGUgQXJjaGV0eXBlLgorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIG1vZHVsZSBkZWZpbmVzIHNrZWxldG9uIG1hdmVuIHByb2plY3QgKGFyY2hldHlwZSkgZm9yIGRldmVsb3BpbmcgbmV3IEphdmEgU0UtYmFzZWQgYW5kIFNlcnZsZXQtYmFzZWQgZXhhbXBsZXMgZm9yIEplcnNleS4KKworSW5zdHJ1Y3Rpb25zCistLS0tLS0tLS0tLS0KKworLSBpbnN0YWxsIHRoaXMgYXJjaGV0eXBlIGludG8geW91ciBsb2NhbCByZXBvc2l0b3J5LCBgbWF2ZW4tYXJjaGV0eXBlLXBsdWdpbmAgdXBkYXRlcyB5b3VyIGxvY2FsIGBhcmNoZXR5cGUtY2F0YWxvZy54bWxgIAord2hpY2ggaXMgbG9jYXRlZCBpbiBgLm0yYCBkaXJlY3RvcnkuCisKKz4gICAgIG12biBjbGVhbiBpbnN0YWxsCisKKy0gcnVuIGdlbmVyYXRpb24geW91ciBuZXcgcHJvamVjdCB1c2luZzoKKworPiAgICAgbXZuIGFyY2hldHlwZTpnZW5lcmF0ZSAtRGFyY2hldHlwZUNhdGFsb2c9bG9jYWwKKworLSBtYXZlbiBwcm92aWRlcyB5b3UgYSBzZXQgb2YgeW91ciBsb2NhbCBpbnN0YWxsZWQgbWF2ZW4gYXJjaGV0eXBlcywgY2hvb3NlIHRoaXMgb25lCitgb3JnLmdsYXNzZmlzaC5qZXJzZXkuYXJjaGV0eXBlczpqZXJzZXktZXhhbXBsZS1qYXZhOC13ZWJhcHBgCisKKy0gZmlsbCBpbiBhbGwgaW5wdXQgZmllbGRzIHByb3Blcmx5LCBlLmcuCisKK2BgYAorZ3JvdXBJZDogb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMgKGRlZmF1bHQgdmFsdWUpCithcnRpZmFjdElkOiBteS1leGFtcGxlCit2ZXJzaW9uOiBKdXN0IHVzZSBhIHJlbGVhc2UgdmVyc2lvbiAtIGUuZy4gIjIuMjAiCitwYWNrYWdlOiBVc2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMubXktZXhhbXBsZQorcHJvamVjdEF1dGhvcjogVXNlICJOYW1lIFN1cm5hbWUgKG5hbWUuc3VybmFtZSBhdCBteWNvbXBhbnkuY29tKSIKK3Byb2plY3REZXNjcmlwdGlvbjogIk15IE5ldyBFeGFtcGxlIHVzaW5nIEplcnNleS4iCitwcm9qZWN0TmFtZTogIk15IEplcnNleSBFeGFtcGxlIgorYGBgCisKKy0gY29uZmlybSB0aGUgcHJvamVjdCBnZW5lcmF0aW9uIGFuZCBmZWVsIGZyZWUgdG8gc3RhcnQgY29kaW5nIQpkaWZmIC0tZ2l0IGEvYXJjaGV0eXBlcy9qZXJzZXktZXhhbXBsZS1qYXZhOC13ZWJhcHAvcG9tLnhtbCBiL2FyY2hldHlwZXMvamVyc2V5LWV4YW1wbGUtamF2YTgtd2ViYXBwL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI0MmMyMwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hldHlwZXMvamVyc2V5LWV4YW1wbGUtamF2YTgtd2ViYXBwL3BvbS54bWwKQEAgLTAsMCArMSw0MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuYXJjaGV0eXBlczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmplcnNleS1leGFtcGxlLWphdmE4LXdlYmFwcDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPm1hdmVuLWFyY2hldHlwZTwvcGFja2FnaW5nPgorCisgICAgPG5hbWU+amVyc2V5LWV4YW1wbGUtamF2YTgtd2ViYXBwPC9uYW1lPgorICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgKEphdmE4KSBXZWJBcHAgRXhhbXBsZSBBcmNoZXR5cGUuPC9kZXNjcmlwdGlvbj4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHJlc291cmNlcz4KKyAgICAgICAgICAgIDxyZXNvdXJjZT4KKyAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgPGZpbHRlcmluZz50cnVlPC9maWx0ZXJpbmc+CisgICAgICAgICAgICA8L3Jlc291cmNlPgorICAgICAgICA8L3Jlc291cmNlcz4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYXJjaGV0eXBlcy9qZXJzZXktZXhhbXBsZS1qYXZhOC13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuL2FyY2hldHlwZS1tZXRhZGF0YS54bWwgYi9hcmNoZXR5cGVzL2plcnNleS1leGFtcGxlLWphdmE4LXdlYmFwcC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4vYXJjaGV0eXBlLW1ldGFkYXRhLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmYyMmYxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGV0eXBlcy9qZXJzZXktZXhhbXBsZS1qYXZhOC13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuL2FyY2hldHlwZS1tZXRhZGF0YS54bWwKQEAgLTAsMCArMSw2MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8YXJjaGV0eXBlLWRlc2NyaXB0b3IgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFyY2hldHlwZS1wbHVnaW4vYXJjaGV0eXBlLWRlc2NyaXB0b3IvMS4wLjAKKyAgICAgICAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2FyY2hldHlwZS1kZXNjcmlwdG9yLTEuMC4wLnhzZCIgbmFtZT0iamVyc2V5LWphdmE4LXdlYmFwcC1hcmNoZXR5cGUiCisgICAgICAgIHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFyY2hldHlwZS1wbHVnaW4vYXJjaGV0eXBlLWRlc2NyaXB0b3IvMS4wLjAiCisgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiPgorCisgICAgPHJlcXVpcmVkUHJvcGVydGllcz4KKyAgICAgICAgPHJlcXVpcmVkUHJvcGVydHkga2V5PSJncm91cElkIj4KKyAgICAgICAgICAgIDxkZWZhdWx0VmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2RlZmF1bHRWYWx1ZT4KKyAgICAgICAgPC9yZXF1aXJlZFByb3BlcnR5PgorICAgICAgICA8cmVxdWlyZWRQcm9wZXJ0eSBrZXk9InBhY2thZ2UiPgorICAgICAgICAgICAgPGRlZmF1bHRWYWx1ZSAvPgorICAgICAgICA8L3JlcXVpcmVkUHJvcGVydHk+CisgICAgICAgIDxyZXF1aXJlZFByb3BlcnR5IGtleT0idmVyc2lvbiI+CisgICAgICAgICAgICA8ZGVmYXVsdFZhbHVlPiR7dmVyc2lvbn08L2RlZmF1bHRWYWx1ZT4KKyAgICAgICAgPC9yZXF1aXJlZFByb3BlcnR5PgorICAgICAgICA8cmVxdWlyZWRQcm9wZXJ0eSBrZXk9InByb2plY3RBdXRob3IiIC8+CisgICAgICAgIDxyZXF1aXJlZFByb3BlcnR5IGtleT0icHJvamVjdE5hbWUiIC8+CisgICAgICAgIDxyZXF1aXJlZFByb3BlcnR5IGtleT0icHJvamVjdERlc2NyaXB0aW9uIiAvPgorICAgIDwvcmVxdWlyZWRQcm9wZXJ0aWVzPgorCisgICAgPGZpbGVTZXRzPgorICAgICAgICA8ZmlsZVNldCBmaWx0ZXJlZD0idHJ1ZSIgcGFja2FnZWQ9InRydWUiIGVuY29kaW5nPSJVVEYtOCI+CisgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2phdmE8L2RpcmVjdG9yeT4KKyAgICAgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qLmphdmE8L2luY2x1ZGU+CisgICAgICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgICA8L2ZpbGVTZXQ+CisgICAgICAgIDxmaWxlU2V0ICBlbmNvZGluZz0iVVRGLTgiPgorICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KKyAgICAgICAgPC9maWxlU2V0PgorICAgICAgICA8ZmlsZVNldCBmaWx0ZXJlZD0idHJ1ZSIgcGFja2FnZWQ9InRydWUiIGVuY29kaW5nPSJVVEYtOCI+CisgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy90ZXN0L2phdmE8L2RpcmVjdG9yeT4KKyAgICAgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi8qLmphdmE8L2luY2x1ZGU+CisgICAgICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgICA8L2ZpbGVTZXQ+CisgICAgICAgIDxmaWxlU2V0IGZpbHRlcmVkPSJ0cnVlIiBlbmNvZGluZz0iVVRGLTgiPgorICAgICAgICAgICAgPGRpcmVjdG9yeS8+CisgICAgICAgICAgICA8aW5jbHVkZXM+CisgICAgICAgICAgICAgICAgPGluY2x1ZGU+UkVBRE1FLk1EPC9pbmNsdWRlPgorICAgICAgICAgICAgPC9pbmNsdWRlcz4KKyAgICAgICAgPC9maWxlU2V0PgorICAgIDwvZmlsZVNldHM+Cis8L2FyY2hldHlwZS1kZXNjcmlwdG9yPgpkaWZmIC0tZ2l0IGEvYXJjaGV0eXBlcy9qZXJzZXktZXhhbXBsZS1qYXZhOC13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvUkVBRE1FLk1EIGIvYXJjaGV0eXBlcy9qZXJzZXktZXhhbXBsZS1qYXZhOC13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvUkVBRE1FLk1ECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZTEyODgKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoZXR5cGVzL2plcnNleS1leGFtcGxlLWphdmE4LXdlYmFwcC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9SRUFETUUuTUQKQEAgLTAsMCArMSw0NyBAQAorWy8vXTogIyAiIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAiCitbLy9dOiAjICIgICIKK1svL106ICMgIiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgIgorWy8vXTogIyAiIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0ICIKK1svL106ICMgIiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuICIKK1svL106ICMgIiAgIgorWy8vXTogIyAiIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkgIgorWy8vXTogIyAiIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUgIgorWy8vXTogIyAiIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCAiCitbLy9dOiAjICIgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQgIgorWy8vXTogIyAiIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4gIgorWy8vXTogIyAiICAiCitbLy9dOiAjICIgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wICIKKworJHtwcm9qZWN0TmFtZX0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gLi4uCisKK0NvbnRlbnRzCistLS0tLS0tLQorCitUaGUgbWFwcGluZyBvZiB0aGUgVVJJIHBhdGggc3BhY2UgaXMgcHJlc2VudGVkIGluIHRoZSBmb2xsb3dpbmcgdGFibGU6CisKK1VSSSBwYXRoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJlc291cmNlIGNsYXNzICAgICAgICAgICAgfCBIVFRQIG1ldGhvZHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLQorKipfL3Jlc291cmNlXyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgSmVyc2V5UmVzb3VyY2UgICAgICAgICAgICB8IEdFVAorCitTYW1wbGUgUmVzcG9uc2UKKy0tLS0tLS0tLS0tLS0tLQorCitgYGBqYXZhc2NyaXB0CisKK2BgYAorCitSdW5uaW5nIHRoZSBFeGFtcGxlCistLS0tLS0tLS0tLS0tLS0tLS0tCisKK1J1biB0aGUgZXhhbXBsZSB1c2luZyBbR3JpenpseV0oaHR0cDovL2dyaXp6bHkuamF2YS5uZXQvKSBjb250YWluZXIgYXMgZm9sbG93czoKKworPiAgICAgbXZuIGNsZWFuIGNvbXBpbGUgZXhlYzpqYXZhCisKK1J1biB0aGUgZXhhbXBsZSB1c2luZyBKZXR0eSBhcyBmb2xsb3dzOgorCis+ICAgICBtdm4gY2xlYW4gcGFja2FnZSBqZXR0eTpydW4KKworLSAgIDxodHRwOi8vbG9jYWxob3N0OjgwODAvYmFzZS9qZXJzZXktcmVzb3VyY2U+CmRpZmYgLS1naXQgYS9hcmNoZXR5cGVzL2plcnNleS1leGFtcGxlLWphdmE4LXdlYmFwcC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wb20ueG1sIGIvYXJjaGV0eXBlcy9qZXJzZXktZXhhbXBsZS1qYXZhOC13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2U5ZjE1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaGV0eXBlcy9qZXJzZXktZXhhbXBsZS1qYXZhOC13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcG9tLnhtbApAQCAtMCwwICsxLDExMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD53ZWJhcHAtZXhhbXBsZS1wYXJlbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vd2ViYXBwLWV4YW1wbGUtcGFyZW50L3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KKyAgICAgICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDwhLS0gVXNlIGluIHRoZSBjYXNlIHdoZW4gSmV0dHkgaXMgbm90IG5lZWRlZAorICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorICAgIC0tPgorCisgICAgPGFydGlmYWN0SWQ+JHthcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPiR7cHJvamVjdE5hbWV9PC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPiR7cHJvamVjdERlc2NyaXB0aW9ufTwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLWdyaXp6bHkyLWh0dHA8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWhrMjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhlYy1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxtYWluQ2xhc3M+JHtwYWNrYWdlfS5BcHA8L21haW5DbGFzcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKworICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c291cmNlPiR7amF2YS52ZXJzaW9ufTwvc291cmNlPgorICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PiR7amF2YS52ZXJzaW9ufTwvdGFyZ2V0PgorICAgICAgICAgICAgICAgICAgICA8c2hvd1dhcm5pbmdzPmZhbHNlPC9zaG93V2FybmluZ3M+CisgICAgICAgICAgICAgICAgICAgIDxmb3JrPmZhbHNlPC9mb3JrPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorCisgICAgICAgICAgICA8IS0tIFJ1biB0aGUgYXBwbGljYXRpb24gdXNpbmcgIm12biBqZXR0eTpydW4iIC0tPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPCEtLSBUT0RPOiBSZW1vdmUgdGhlIHZlcnNpb24gd2hlbiBKRVJTRVktMjc0MyBpcyByZXNvbHZlZC4gLS0+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+OS4yLjYudjIwMTQxMjA1PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c2NhbkludGVydmFsU2Vjb25kcz41PC9zY2FuSW50ZXJ2YWxTZWNvbmRzPgorICAgICAgICAgICAgICAgICAgICA8c3RvcFBvcnQ+OTk5OTwvc3RvcFBvcnQ+CisgICAgICAgICAgICAgICAgICAgIDxzdG9wS2V5PlNUT1A8L3N0b3BLZXk+CisgICAgICAgICAgICAgICAgICAgIDx3ZWJBcHA+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29udGV4dFBhdGg+LzwvY29udGV4dFBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICA8d2ViSW5mSW5jbHVkZUphclBhdHRlcm4+LiovLipqZXJzZXktW14vXVwuamFyJDwvd2ViSW5mSW5jbHVkZUphclBhdHRlcm4+CisgICAgICAgICAgICAgICAgICAgIDwvd2ViQXBwPgorICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydGllcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5qZXR0eS5wb3J0PC9uYW1lPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT4ke2plcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydH08L3ZhbHVlPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgICAgICA8d2FyPiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9LyR7cHJvamVjdC5idWlsZC5maW5hbE5hbWV9Lndhcjwvd2FyPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+cmVsZWFzZTwvaWQ+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnhtbC1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8amF2YS52ZXJzaW9uPjEuODwvamF2YS52ZXJzaW9uPgorICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0PjgwODA8L2plcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydD4KKyAgICA8L3Byb3BlcnRpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hcmNoZXR5cGVzL2plcnNleS1leGFtcGxlLWphdmE4LXdlYmFwcC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL0FwcC5qYXZhIGIvYXJjaGV0eXBlcy9qZXJzZXktZXhhbXBsZS1qYXZhOC13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9BcHAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjkyODUzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGV0eXBlcy9qZXJzZXktZXhhbXBsZS1qYXZhOC13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9BcHAuamF2YQpAQCAtMCwwICsxLDU5IEBACisjc2V0KCAkc3ltYm9sX3BvdW5kID0gJyMnICkKKyNzZXQoICRzeW1ib2xfZG9sbGFyID0gJyQnICkKKyNzZXQoICRzeW1ib2xfZXNjYXBlID0gJ1wnICkKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2UgJHtwYWNrYWdlfTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkyLmh0dHBzZXJ2ZXIuR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5ncml6emx5Lmh0dHAuc2VydmVyLkh0dHBTZXJ2ZXI7CisKKy8qKgorICogQGF1dGhvciAke3Byb2plY3RBdXRob3J9CisgKi8KK3B1YmxpYyBjbGFzcyBBcHAgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIEJBU0VfVVJJID0gVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2Jhc2UvIik7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST09UX1BBVEggPSAicmVzb3VyY2UtcGF0aCI7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiR7cHJvamVjdE5hbWV9Iik7CisKKyAgICAgICAgICAgIGZpbmFsIEh0dHBTZXJ2ZXIgc2VydmVyID0gR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5LmNyZWF0ZUh0dHBTZXJ2ZXIoQkFTRV9VUkksIG5ldyBNeUFwcGxpY2F0aW9uKCksIGZhbHNlKTsKKyAgICAgICAgICAgIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmFkZFNodXRkb3duSG9vayhuZXcgVGhyZWFkKHNlcnZlcjo6c2h1dGRvd25Ob3cpKTsKKyAgICAgICAgICAgIHNlcnZlci5zdGFydCgpOworCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgIkFwcGxpY2F0aW9uIHN0YXJ0ZWQuJHtzeW1ib2xfZXNjYXBlfW4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiVHJ5IG91dCAlcyVzJHtzeW1ib2xfZXNjYXBlfW4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiU3RvcCB0aGUgYXBwbGljYXRpb24gdXNpbmcgQ1RSTCtDIiwKKyAgICAgICAgICAgICAgICAgICAgQkFTRV9VUkksIFJPT1RfUEFUSCkpOworCisgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gfCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihBcHAuY2xhc3MuZ2V0TmFtZSgpKS5sb2coTGV2ZWwuU0VWRVJFLCBudWxsLCBleCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hcmNoZXR5cGVzL2plcnNleS1leGFtcGxlLWphdmE4LXdlYmFwcC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL015QXBwbGljYXRpb24uamF2YSBiL2FyY2hldHlwZXMvamVyc2V5LWV4YW1wbGUtamF2YTgtd2ViYXBwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2phdmEvTXlBcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZTA2NTUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoZXR5cGVzL2plcnNleS1leGFtcGxlLWphdmE4LXdlYmFwcC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL015QXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDM3IEBACisjc2V0KCAkc3ltYm9sX3BvdW5kID0gJyMnICkKKyNzZXQoICRzeW1ib2xfZG9sbGFyID0gJyQnICkKKyNzZXQoICRzeW1ib2xfZXNjYXBlID0gJ1wnICkKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2UgJHtwYWNrYWdlfTsKKworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmZpbHRlci5Mb2dnaW5nRmlsdGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworLyoqCisgKiBAYXV0aG9yICR7cHJvamVjdEF1dGhvcn0KKyAqLworQEFwcGxpY2F0aW9uUGF0aCgiLyIpCitwdWJsaWMgY2xhc3MgTXlBcHBsaWNhdGlvbiBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKworICAgIHB1YmxpYyBNeUFwcGxpY2F0aW9uKCkgeworICAgICAgICByZWdpc3RlcihMb2dnaW5nRmlsdGVyLmNsYXNzKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2FyY2hldHlwZXMvamVyc2V5LWhlcm9rdS13ZWJhcHAvcG9tLnhtbCBiL2FyY2hldHlwZXMvamVyc2V5LWhlcm9rdS13ZWJhcHAvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTMzNmE3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaGV0eXBlcy9qZXJzZXktaGVyb2t1LXdlYmFwcC9wb20ueG1sCkBAIC0wLDAgKzEsNTMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmFyY2hldHlwZXM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisgICAgPHBhY2thZ2luZz5tYXZlbi1hcmNoZXR5cGU8L3BhY2thZ2luZz4KKworICAgIDxhcnRpZmFjdElkPmplcnNleS1oZXJva3Utd2ViYXBwPC9hcnRpZmFjdElkPgorICAgIDxuYW1lPmplcnNleS1hcmNoZXR5cGUtaGVyb2t1LXdlYmFwcDwvbmFtZT4KKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIEFuIGFyY2hldHlwZSB3aGljaCBjb250YWlucyBhIHF1aWNrIHN0YXJ0IEplcnNleS1iYXNlZCB3ZWIgYXBwbGljYXRpb24gcHJvamVjdCBjYXBhYmxlIHRvIHJ1biBvbiBIZXJva3UuCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZXNvdXJjZXMtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuNTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGVzY2FwZVN0cmluZz5cPC9lc2NhcGVTdHJpbmc+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgPHJlc291cmNlcz4KKyAgICAgICAgICAgIDxyZXNvdXJjZT4KKyAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgPGZpbHRlcmluZz50cnVlPC9maWx0ZXJpbmc+CisgICAgICAgICAgICA8L3Jlc291cmNlPgorICAgICAgICA8L3Jlc291cmNlcz4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYXJjaGV0eXBlcy9qZXJzZXktaGVyb2t1LXdlYmFwcC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4vYXJjaGV0eXBlLW1ldGFkYXRhLnhtbCBiL2FyY2hldHlwZXMvamVyc2V5LWhlcm9rdS13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuL2FyY2hldHlwZS1tZXRhZGF0YS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFjZDg5YwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hldHlwZXMvamVyc2V5LWhlcm9rdS13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuL2FyY2hldHlwZS1tZXRhZGF0YS54bWwKQEAgLTAsMCArMSw1MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8YXJjaGV0eXBlLWRlc2NyaXB0b3IKKyAgICAgICAgbmFtZT0iamVyc2V5LWhlcm9rdS13ZWJhcHAiCisgICAgICAgIHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9wbHVnaW5zL21hdmVuLWFyY2hldHlwZS1wbHVnaW4vYXJjaGV0eXBlLWRlc2NyaXB0b3IvMS4wLjAiCisgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hcmNoZXR5cGUtcGx1Z2luL2FyY2hldHlwZS1kZXNjcmlwdG9yLzEuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hcmNoZXR5cGUtZGVzY3JpcHRvci0xLjAuMC54c2QiPgorCisgICAgPGZpbGVTZXRzPgorICAgICAgICA8ZmlsZVNldCBmaWx0ZXJlZD0idHJ1ZSIgcGFja2FnZWQ9ImZhbHNlIiBlbmNvZGluZz0iVVRGLTgiPgorICAgICAgICAgICAgPGRpcmVjdG9yeS8+CisgICAgICAgICAgICA8aW5jbHVkZXM+CisgICAgICAgICAgICAgICAgPGluY2x1ZGU+UHJvY2ZpbGU8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgPGluY2x1ZGU+c3lzdGVtLnByb3BlcnRpZXM8L2luY2x1ZGU+CisgICAgICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgICA8L2ZpbGVTZXQ+CisgICAgICAgIDxmaWxlU2V0IGZpbHRlcmVkPSJ0cnVlIiBwYWNrYWdlZD0idHJ1ZSIgZW5jb2Rpbmc9IlVURi04Ij4KKyAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vamF2YTwvZGlyZWN0b3J5PgorICAgICAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyo8L2luY2x1ZGU+CisgICAgICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgICA8L2ZpbGVTZXQ+CisgICAgICAgIDxmaWxlU2V0IGZpbHRlcmVkPSJ0cnVlIiBwYWNrYWdlZD0iZmFsc2UiIGVuY29kaW5nPSJVVEYtOCI+CisgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3dlYmFwcDwvZGlyZWN0b3J5PgorICAgICAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyo8L2luY2x1ZGU+CisgICAgICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgICA8L2ZpbGVTZXQ+CisgICAgICAgIDxmaWxlU2V0IGZpbHRlcmVkPSJ0cnVlIiBwYWNrYWdlZD0idHJ1ZSIgZW5jb2Rpbmc9IlVURi04Ij4KKyAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL3Rlc3QvamF2YTwvZGlyZWN0b3J5PgorICAgICAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqLyo8L2luY2x1ZGU+CisgICAgICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgICA8L2ZpbGVTZXQ+CisgICAgPC9maWxlU2V0cz4KKzwvYXJjaGV0eXBlLWRlc2NyaXB0b3I+CmRpZmYgLS1naXQgYS9hcmNoZXR5cGVzL2plcnNleS1oZXJva3Utd2ViYXBwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL1Byb2NmaWxlIGIvYXJjaGV0eXBlcy9qZXJzZXktaGVyb2t1LXdlYmFwcC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9Qcm9jZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWY4YmRjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGV0eXBlcy9qZXJzZXktaGVyb2t1LXdlYmFwcC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9Qcm9jZmlsZQpAQCAtMCwwICsxIEBACit3ZWI6IGphdmEgLWNwIHRhcmdldC9jbGFzc2VzOnRhcmdldC9kZXBlbmRlbmN5LyogJHtwYWNrYWdlfS5oZXJva3UuTWFpbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2FyY2hldHlwZXMvamVyc2V5LWhlcm9rdS13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcG9tLnhtbCBiL2FyY2hldHlwZXMvamVyc2V5LWhlcm9rdS13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzRkM2NlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGV0eXBlcy9qZXJzZXktaGVyb2t1LXdlYmFwcC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wb20ueG1sCkBAIC0wLDAgKzEsMTExIEBACis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisKKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8Z3JvdXBJZD5cJHtncm91cElkfTwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5cJHthcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDx2ZXJzaW9uPlwke3ZlcnNpb259PC92ZXJzaW9uPgorICAgIDxuYW1lPlwke2FydGlmYWN0SWR9PC9uYW1lPgorCisgICAgPGRlcGVuZGVuY3lNYW5hZ2VtZW50PgorICAgICAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWJvbTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj5cJHtqZXJzZXkudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPHR5cGU+cG9tPC90eXBlPgorICAgICAgICAgICAgICAgIDxzY29wZT5pbXBvcnQ8L3Njb3BlPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8L2RlcGVuZGVuY2llcz4KKyAgICA8L2RlcGVuZGVuY3lNYW5hZ2VtZW50PgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWhrMjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDwhLS0gdW5jb21tZW50IHRoaXMgdG8gZ2V0IEpTT04gc3VwcG9ydAorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLWpzb24tYmluZGluZzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PiAtLT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPlwke2pldHR5LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktd2ViYXBwPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+XCR7amV0dHkudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItYnVuZGxlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHR5cGU+cG9tPC90eXBlPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxmaW5hbE5hbWU+XCR7YXJ0aWZhY3RJZH08L2ZpbmFsTmFtZT4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi41LjE8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+MS43PC9zb3VyY2U+CisgICAgICAgICAgICAgICAgICAgIDx0YXJnZXQ+MS43PC90YXJnZXQ+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5jb3B5LWRlcGVuZGVuY2llczwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y29weS1kZXBlbmRlbmNpZXM8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGVTY29wZT5jb21waWxlPC9pbmNsdWRlU2NvcGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+XCR7amV0dHkudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxjb250ZXh0UGF0aD4vPC9jb250ZXh0UGF0aD4KKyAgICAgICAgICAgICAgICAgICAgPHdlYkFwcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb250ZXh0UGF0aD4vPC9jb250ZXh0UGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx3ZWJJbmZJbmNsdWRlSmFyUGF0dGVybj4uKi8uKmplcnNleS1bXi9dXC5qYXIkPC93ZWJJbmZJbmNsdWRlSmFyUGF0dGVybj4KKyAgICAgICAgICAgICAgICAgICAgPC93ZWJBcHA+CisgICAgICAgICAgICAgICAgICAgIDx3YXI+XCR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L1wke3Byb2plY3QuYnVpbGQuZmluYWxOYW1lfS53YXI8L3dhcj4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPGplcnNleS52ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvamVyc2V5LnZlcnNpb24+CisgICAgICAgIDxwcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPlVURi04PC9wcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPgorICAgICAgICA8amV0dHkudmVyc2lvbj45LjAuNi52MjAxMzA5MzA8L2pldHR5LnZlcnNpb24+CisgICAgPC9wcm9wZXJ0aWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYXJjaGV0eXBlcy9qZXJzZXktaGVyb2t1LXdlYmFwcC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL015UmVzb3VyY2UuamF2YSBiL2FyY2hldHlwZXMvamVyc2V5LWhlcm9rdS13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9NeVJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRhMDM5NgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hldHlwZXMvamVyc2V5LWhlcm9rdS13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9NeVJlc291cmNlLmphdmEKQEAgLTAsMCArMSwyNSBAQAorcGFja2FnZSAke3BhY2thZ2V9OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKKy8qKgorICogUm9vdCByZXNvdXJjZSAoZXhwb3NlZCBhdCAibXlyZXNvdXJjZSIgcGF0aCkKKyAqLworQFBhdGgoIm15cmVzb3VyY2UiKQorcHVibGljIGNsYXNzIE15UmVzb3VyY2UgeworCisgICAgLyoqCisgICAgICogTWV0aG9kIGhhbmRsaW5nIEhUVFAgR0VUIHJlcXVlc3RzLiBUaGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYmUgc2VudAorICAgICAqIHRvIHRoZSBjbGllbnQgYXMgInRleHQvcGxhaW4iIG1lZGlhIHR5cGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmluZyB0aGF0IHdpbGwgYmUgcmV0dXJuZWQgYXMgYSB0ZXh0L3BsYWluIHJlc3BvbnNlLgorICAgICAqLworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgcHVibGljIFN0cmluZyBnZXRJdCgpIHsKKyAgICAgICAgcmV0dXJuICJIZWxsbywgSGVyb2t1ISI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYXJjaGV0eXBlcy9qZXJzZXktaGVyb2t1LXdlYmFwcC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL2hlcm9rdS9NYWluLmphdmEgYi9hcmNoZXR5cGVzL2plcnNleS1oZXJva3Utd2ViYXBwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2phdmEvaGVyb2t1L01haW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjU5NGJmCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGV0eXBlcy9qZXJzZXktaGVyb2t1LXdlYmFwcC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL2hlcm9rdS9NYWluLmphdmEKQEAgLTAsMCArMSw0MCBAQAorcGFja2FnZSAke3BhY2thZ2V9Lmhlcm9rdTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpldHR5LnNlcnZlci5TZXJ2ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamV0dHkud2ViYXBwLldlYkFwcENvbnRleHQ7CisKKy8qKgorICogVGhpcyBjbGFzcyBsYXVuY2hlcyB0aGUgd2ViIGFwcGxpY2F0aW9uIGluIGFuIGVtYmVkZGVkIEpldHR5IGNvbnRhaW5lci4gVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgdG8geW91ciBhcHBsaWNhdGlvbi4gVGhlIEphdmEKKyAqIGNvbW1hbmQgdGhhdCBpcyB1c2VkIGZvciBsYXVuY2hpbmcgc2hvdWxkIGZpcmUgdGhpcyBtYWluIG1ldGhvZC4KKyAqLworcHVibGljIGNsYXNzIE1haW4geworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbnsKKyAgICAgICAgLy8gVGhlIHBvcnQgdGhhdCB3ZSBzaG91bGQgcnVuIG9uIGNhbiBiZSBzZXQgaW50byBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZQorICAgICAgICAvLyBMb29rIGZvciB0aGF0IHZhcmlhYmxlIGFuZCBkZWZhdWx0IHRvIDgwODAgaWYgaXQgaXNuJ3QgdGhlcmUuCisgICAgICAgIFN0cmluZyB3ZWJQb3J0ID0gU3lzdGVtLmdldGVudigiUE9SVCIpOworICAgICAgICBpZiAod2ViUG9ydCA9PSBudWxsIHx8IHdlYlBvcnQuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB3ZWJQb3J0ID0gIjgwODAiOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgU2VydmVyIHNlcnZlciA9IG5ldyBTZXJ2ZXIoSW50ZWdlci52YWx1ZU9mKHdlYlBvcnQpKTsKKyAgICAgICAgZmluYWwgV2ViQXBwQ29udGV4dCByb290ID0gbmV3IFdlYkFwcENvbnRleHQoKTsKKworICAgICAgICByb290LnNldENvbnRleHRQYXRoKCIvIik7CisgICAgICAgIC8vIFBhcmVudCBsb2FkZXIgcHJpb3JpdHkgaXMgYSBjbGFzcyBsb2FkZXIgc2V0dGluZyB0aGF0IEpldHR5IGFjY2VwdHMuCisgICAgICAgIC8vIEJ5IGRlZmF1bHQgSmV0dHkgd2lsbCBiZWhhdmUgbGlrZSBtb3N0IHdlYiBjb250YWluZXJzIGluIHRoYXQgaXQgd2lsbAorICAgICAgICAvLyBhbGxvdyB5b3VyIGFwcGxpY2F0aW9uIHRvIHJlcGxhY2Ugbm9uLXNlcnZlciBsaWJyYXJpZXMgdGhhdCBhcmUgcGFydCBvZiB0aGUKKyAgICAgICAgLy8gY29udGFpbmVyLiBTZXR0aW5nIHBhcmVudCBsb2FkZXIgcHJpb3JpdHkgdG8gdHJ1ZSBjaGFuZ2VzIHRoaXMgYmVoYXZpb3IuCisgICAgICAgIC8vIFJlYWQgbW9yZSBoZXJlOiBodHRwOi8vd2lraS5lY2xpcHNlLm9yZy9KZXR0eS9SZWZlcmVuY2UvSmV0dHlfQ2xhc3Nsb2FkaW5nCisgICAgICAgIHJvb3Quc2V0UGFyZW50TG9hZGVyUHJpb3JpdHkodHJ1ZSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHdlYmFwcERpckxvY2F0aW9uID0gInNyYy9tYWluL3dlYmFwcC8iOworICAgICAgICByb290LnNldERlc2NyaXB0b3Iod2ViYXBwRGlyTG9jYXRpb24gKyAiL1dFQi1JTkYvd2ViLnhtbCIpOworICAgICAgICByb290LnNldFJlc291cmNlQmFzZSh3ZWJhcHBEaXJMb2NhdGlvbik7CisKKyAgICAgICAgc2VydmVyLnNldEhhbmRsZXIocm9vdCk7CisKKyAgICAgICAgc2VydmVyLnN0YXJ0KCk7CisgICAgICAgIHNlcnZlci5qb2luKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYXJjaGV0eXBlcy9qZXJzZXktaGVyb2t1LXdlYmFwcC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvYXJjaGV0eXBlcy9qZXJzZXktaGVyb2t1LXdlYmFwcC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MjZhNDYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoZXR5cGVzL2plcnNleS1oZXJva3Utd2ViYXBwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwxOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzNfMC54c2QiCisgICAgICAgIHZlcnNpb249IjMuMCI+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5KZXJzZXkgV2ViIEFwcGxpY2F0aW9uPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qZXJzZXkuY29uZmlnLnNlcnZlci5wcm92aWRlci5wYWNrYWdlczwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT4ke3BhY2thZ2V9PC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5KZXJzZXkgV2ViIEFwcGxpY2F0aW9uPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9hcmNoZXR5cGVzL2plcnNleS1oZXJva3Utd2ViYXBwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy90ZXN0L2phdmEvTXlSZXNvdXJjZVRlc3QuamF2YSBiL2FyY2hldHlwZXMvamVyc2V5LWhlcm9rdS13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL3Rlc3QvamF2YS9NeVJlc291cmNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYzE0MWMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoZXR5cGVzL2plcnNleS1oZXJva3Utd2ViYXBwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy90ZXN0L2phdmEvTXlSZXNvdXJjZVRlc3QuamF2YQpAQCAtMCwwICsxLDI5IEBACitwYWNrYWdlICR7cGFja2FnZX07CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworaW1wb3J0ICR7cGFja2FnZX0uTXlSZXNvdXJjZTsKKworcHVibGljIGNsYXNzIE15UmVzb3VyY2VUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKE15UmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdG8gc2VlIHRoYXQgdGhlIG1lc3NhZ2UgIkdvdCBpdCEiIGlzIHNlbnQgaW4gdGhlIHJlc3BvbnNlLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEl0KCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzcG9uc2VNc2cgPSB0YXJnZXQoKS5wYXRoKCJteXJlc291cmNlIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscygiSGVsbG8sIEhlcm9rdSEiLCByZXNwb25zZU1zZyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYXJjaGV0eXBlcy9qZXJzZXktaGVyb2t1LXdlYmFwcC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zeXN0ZW0ucHJvcGVydGllcyBiL2FyY2hldHlwZXMvamVyc2V5LWhlcm9rdS13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3lzdGVtLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ0NmFjMAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hldHlwZXMvamVyc2V5LWhlcm9rdS13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3lzdGVtLnByb3BlcnRpZXMKQEAgLTAsMCArMSBAQAoramF2YS5ydW50aW1lLnZlcnNpb249MS43ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvYXJjaGV0eXBlcy9qZXJzZXktcXVpY2tzdGFydC1ncml6emx5Mi9wb20ueG1sIGIvYXJjaGV0eXBlcy9qZXJzZXktcXVpY2tzdGFydC1ncml6emx5Mi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMDVjZDkKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoZXR5cGVzL2plcnNleS1xdWlja3N0YXJ0LWdyaXp6bHkyL3BvbS54bWwKQEAgLTAsMCArMSw1MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5hcmNoZXR5cGVzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorICAgIDxhcnRpZmFjdElkPmplcnNleS1xdWlja3N0YXJ0LWdyaXp6bHkyPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+bWF2ZW4tYXJjaGV0eXBlPC9wYWNrYWdpbmc+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgQW4gYXJjaGV0eXBlIHdoaWNoIGNvbnRhaW5zIGEgcXVpY2sgc3RhcnQgSmVyc2V5IHByb2plY3QgYmFzZWQgb24gR3JpenpseSBjb250YWluZXIuCisgICAgPC9kZXNjcmlwdGlvbj4KKyAgICA8bmFtZT5qZXJzZXktYXJjaGV0eXBlLWdyaXp6bHkyPC9uYW1lPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cmVzb3VyY2VzPgorICAgICAgICAgICAgPHJlc291cmNlPgorICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICA8ZmlsdGVyaW5nPnRydWU8L2ZpbHRlcmluZz4KKyAgICAgICAgICAgIDwvcmVzb3VyY2U+CisgICAgICAgIDwvcmVzb3VyY2VzPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlc291cmNlcy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi41PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8ZXNjYXBlU3RyaW5nPlw8L2VzY2FwZVN0cmluZz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorCisgICAgPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FyY2hldHlwZXMvamVyc2V5LXF1aWNrc3RhcnQtZ3JpenpseTIvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2FyY2hldHlwZS54bWwgYi9hcmNoZXR5cGVzL2plcnNleS1xdWlja3N0YXJ0LWdyaXp6bHkyL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9hcmNoZXR5cGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNGY5OTcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoZXR5cGVzL2plcnNleS1xdWlja3N0YXJ0LWdyaXp6bHkyL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9hcmNoZXR5cGUueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPGFyY2hldHlwZT4KKyAgPGlkPmplcnNleS1xdWlja3N0YXJ0LWdyaXp6bHkyPC9pZD4KKyAgPHNvdXJjZXM+CisgICAgPHNvdXJjZT5zcmMvbWFpbi9qYXZhL01haW4uamF2YTwvc291cmNlPgorICAgIDxzb3VyY2U+c3JjL21haW4vamF2YS9NeVJlc291cmNlLmphdmE8L3NvdXJjZT4KKyAgPC9zb3VyY2VzPgorICA8dGVzdFNvdXJjZXM+CisgICAgPHNvdXJjZT5zcmMvdGVzdC9qYXZhL015UmVzb3VyY2VUZXN0LmphdmE8L3NvdXJjZT4KKyAgPC90ZXN0U291cmNlcz4KKzwvYXJjaGV0eXBlPgpkaWZmIC0tZ2l0IGEvYXJjaGV0eXBlcy9qZXJzZXktcXVpY2tzdGFydC1ncml6emx5Mi9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wb20ueG1sIGIvYXJjaGV0eXBlcy9qZXJzZXktcXVpY2tzdGFydC1ncml6emx5Mi9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhY2QzYmMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoZXR5cGVzL2plcnNleS1xdWlja3N0YXJ0LWdyaXp6bHkyL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwKQEAgLTAsMCArMSw4MiBAQAorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorCisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPGdyb3VwSWQ+XCR7Z3JvdXBJZH08L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+XCR7YXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8dmVyc2lvbj5cJHt2ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICA8bmFtZT5cJHthcnRpZmFjdElkfTwvbmFtZT4KKworICAgIDxkZXBlbmRlbmN5TWFuYWdlbWVudD4KKyAgICAgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1ib208L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+XCR7amVyc2V5LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgICAgICA8c2NvcGU+aW1wb3J0PC9zY29wZT4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPC9kZXBlbmRlbmNpZXM+CisgICAgPC9kZXBlbmRlbmN5TWFuYWdlbWVudD4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItZ3JpenpseTItaHR0cDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1oazI8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8IS0tIHVuY29tbWVudCB0aGlzIHRvIGdldCBKU09OIHN1cHBvcnQ6CisgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLWpzb24tYmluZGluZzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAtLT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+NC45PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuNS4xPC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c291cmNlPjEuNzwvc291cmNlPgorICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PjEuNzwvdGFyZ2V0PgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGVjLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjIuMTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXZhPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8bWFpbkNsYXNzPlwke3BhY2thZ2V9Lk1haW48L21haW5DbGFzcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPGplcnNleS52ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvamVyc2V5LnZlcnNpb24+CisgICAgICAgIDxwcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPlVURi04PC9wcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPgorICAgIDwvcHJvcGVydGllcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2FyY2hldHlwZXMvamVyc2V5LXF1aWNrc3RhcnQtZ3JpenpseTIvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9NYWluLmphdmEgYi9hcmNoZXR5cGVzL2plcnNleS1xdWlja3N0YXJ0LWdyaXp6bHkyL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2phdmEvTWFpbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5N2NmNjMKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoZXR5cGVzL2plcnNleS1xdWlja3N0YXJ0LWdyaXp6bHkyL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2phdmEvTWFpbi5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKK3BhY2thZ2UgJHBhY2thZ2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmdyaXp6bHkuaHR0cC5zZXJ2ZXIuSHR0cFNlcnZlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5Mi5odHRwc2VydmVyLkdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSSTsKKworLyoqCisgKiBNYWluIGNsYXNzLgorICoKKyAqLworcHVibGljIGNsYXNzIE1haW4geworICAgIC8vIEJhc2UgVVJJIHRoZSBHcml6emx5IEhUVFAgc2VydmVyIHdpbGwgbGlzdGVuIG9uCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTRV9VUkkgPSAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL215YXBwLyI7CisKKyAgICAvKioKKyAgICAgKiBTdGFydHMgR3JpenpseSBIVFRQIHNlcnZlciBleHBvc2luZyBKQVgtUlMgcmVzb3VyY2VzIGRlZmluZWQgaW4gdGhpcyBhcHBsaWNhdGlvbi4KKyAgICAgKiBAcmV0dXJuIEdyaXp6bHkgSFRUUCBzZXJ2ZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBIdHRwU2VydmVyIHN0YXJ0U2VydmVyKCkgeworICAgICAgICAvLyBjcmVhdGUgYSByZXNvdXJjZSBjb25maWcgdGhhdCBzY2FucyBmb3IgSkFYLVJTIHJlc291cmNlcyBhbmQgcHJvdmlkZXJzCisgICAgICAgIC8vIGluICRwYWNrYWdlIHBhY2thZ2UKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmMgPSBuZXcgUmVzb3VyY2VDb25maWcoKS5wYWNrYWdlcygiJHBhY2thZ2UiKTsKKworICAgICAgICAvLyBjcmVhdGUgYW5kIHN0YXJ0IGEgbmV3IGluc3RhbmNlIG9mIGdyaXp6bHkgaHR0cCBzZXJ2ZXIKKyAgICAgICAgLy8gZXhwb3NpbmcgdGhlIEplcnNleSBhcHBsaWNhdGlvbiBhdCBCQVNFX1VSSQorICAgICAgICByZXR1cm4gR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5LmNyZWF0ZUh0dHBTZXJ2ZXIoVVJJLmNyZWF0ZShCQVNFX1VSSSksIHJjKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYWluIG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gYXJncworICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBIdHRwU2VydmVyIHNlcnZlciA9IHN0YXJ0U2VydmVyKCk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihTdHJpbmcuZm9ybWF0KCJKZXJzZXkgYXBwIHN0YXJ0ZWQgd2l0aCBXQURMIGF2YWlsYWJsZSBhdCAiCisgICAgICAgICAgICAgICAgKyAiJXNhcHBsaWNhdGlvbi53YWRsXG5IaXQgZW50ZXIgdG8gc3RvcCBpdC4uLiIsIEJBU0VfVVJJKSk7CisgICAgICAgIFN5c3RlbS5pbi5yZWFkKCk7CisgICAgICAgIHNlcnZlci5zdG9wKCk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9hcmNoZXR5cGVzL2plcnNleS1xdWlja3N0YXJ0LWdyaXp6bHkyL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2phdmEvTXlSZXNvdXJjZS5qYXZhIGIvYXJjaGV0eXBlcy9qZXJzZXktcXVpY2tzdGFydC1ncml6emx5Mi9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL015UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2JlZWUxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGV0eXBlcy9qZXJzZXktcXVpY2tzdGFydC1ncml6emx5Mi9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL015UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDI1IEBACitwYWNrYWdlICRwYWNrYWdlOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKKy8qKgorICogUm9vdCByZXNvdXJjZSAoZXhwb3NlZCBhdCAibXlyZXNvdXJjZSIgcGF0aCkKKyAqLworQFBhdGgoIm15cmVzb3VyY2UiKQorcHVibGljIGNsYXNzIE15UmVzb3VyY2UgeworCisgICAgLyoqCisgICAgICogTWV0aG9kIGhhbmRsaW5nIEhUVFAgR0VUIHJlcXVlc3RzLiBUaGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYmUgc2VudAorICAgICAqIHRvIHRoZSBjbGllbnQgYXMgInRleHQvcGxhaW4iIG1lZGlhIHR5cGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFN0cmluZyB0aGF0IHdpbGwgYmUgcmV0dXJuZWQgYXMgYSB0ZXh0L3BsYWluIHJlc3BvbnNlLgorICAgICAqLworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgcHVibGljIFN0cmluZyBnZXRJdCgpIHsKKyAgICAgICAgcmV0dXJuICJHb3QgaXQhIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9hcmNoZXR5cGVzL2plcnNleS1xdWlja3N0YXJ0LWdyaXp6bHkyL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy90ZXN0L2phdmEvTXlSZXNvdXJjZVRlc3QuamF2YSBiL2FyY2hldHlwZXMvamVyc2V5LXF1aWNrc3RhcnQtZ3JpenpseTIvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL3Rlc3QvamF2YS9NeVJlc291cmNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ODYxMDcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoZXR5cGVzL2plcnNleS1xdWlja3N0YXJ0LWdyaXp6bHkyL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy90ZXN0L2phdmEvTXlSZXNvdXJjZVRlc3QuamF2YQpAQCAtMCwwICsxLDQ4IEBACitwYWNrYWdlICRwYWNrYWdlOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5ncml6emx5Lmh0dHAuc2VydmVyLkh0dHBTZXJ2ZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBNeVJlc291cmNlVGVzdCB7CisKKyAgICBwcml2YXRlIEh0dHBTZXJ2ZXIgc2VydmVyOworICAgIHByaXZhdGUgV2ViVGFyZ2V0IHRhcmdldDsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBzdGFydCB0aGUgc2VydmVyCisgICAgICAgIHNlcnZlciA9IE1haW4uc3RhcnRTZXJ2ZXIoKTsKKyAgICAgICAgLy8gY3JlYXRlIHRoZSBjbGllbnQKKyAgICAgICAgQ2xpZW50IGMgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpOworCisgICAgICAgIC8vIHVuY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmUgaWYgeW91IHdhbnQgdG8gZW5hYmxlCisgICAgICAgIC8vIHN1cHBvcnQgZm9yIEpTT04gaW4gdGhlIGNsaWVudCAoeW91IGFsc28gaGF2ZSB0byB1bmNvbW1lbnQKKyAgICAgICAgLy8gZGVwZW5kZW5jeSBvbiBqZXJzZXktbWVkaWEtanNvbiBtb2R1bGUgaW4gcG9tLnhtbCBhbmQgTWFpbi5zdGFydFNlcnZlcigpKQorICAgICAgICAvLyAtLQorICAgICAgICAvLyBjLmNvbmZpZ3VyYXRpb24oKS5lbmFibGUobmV3IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLmpzb24uSnNvbkpheGJGZWF0dXJlKCkpOworCisgICAgICAgIHRhcmdldCA9IGMudGFyZ2V0KE1haW4uQkFTRV9VUkkpOworICAgIH0KKworICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHNlcnZlci5zdG9wKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0byBzZWUgdGhhdCB0aGUgbWVzc2FnZSAiR290IGl0ISIgaXMgc2VudCBpbiB0aGUgcmVzcG9uc2UuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SXQoKSB7CisgICAgICAgIFN0cmluZyByZXNwb25zZU1zZyA9IHRhcmdldC5wYXRoKCJteXJlc291cmNlIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkdvdCBpdCEiLCByZXNwb25zZU1zZyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYXJjaGV0eXBlcy9qZXJzZXktcXVpY2tzdGFydC13ZWJhcHAvcG9tLnhtbCBiL2FyY2hldHlwZXMvamVyc2V5LXF1aWNrc3RhcnQtd2ViYXBwL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdlNjY2YgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hldHlwZXMvamVyc2V5LXF1aWNrc3RhcnQtd2ViYXBwL3BvbS54bWwKQEAgLTAsMCArMSw1MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5hcmNoZXR5cGVzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgICA8cGFja2FnaW5nPm1hdmVuLWFyY2hldHlwZTwvcGFja2FnaW5nPgorICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgQW4gYXJjaGV0eXBlIHdoaWNoIGNvbnRhaW5zIGEgcXVpY2sgc3RhcnQgSmVyc2V5LWJhc2VkIHdlYiBhcHBsaWNhdGlvbiBwcm9qZWN0LgorICAgIDwvZGVzY3JpcHRpb24+CisgICAgPGFydGlmYWN0SWQ+amVyc2V5LXF1aWNrc3RhcnQtd2ViYXBwPC9hcnRpZmFjdElkPgorICAgIDxuYW1lPmplcnNleS1hcmNoZXR5cGUtd2ViYXBwPC9uYW1lPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlc291cmNlcy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi41PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8ZXNjYXBlU3RyaW5nPlw8L2VzY2FwZVN0cmluZz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICA8cmVzb3VyY2VzPgorICAgICAgICAgICAgPHJlc291cmNlPgorICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICA8ZmlsdGVyaW5nPnRydWU8L2ZpbHRlcmluZz4KKyAgICAgICAgICAgIDwvcmVzb3VyY2U+CisgICAgICAgIDwvcmVzb3VyY2VzPgorICAgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9hcmNoZXR5cGVzL2plcnNleS1xdWlja3N0YXJ0LXdlYmFwcC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvYXJjaGV0eXBlLnhtbCBiL2FyY2hldHlwZXMvamVyc2V5LXF1aWNrc3RhcnQtd2ViYXBwL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9hcmNoZXR5cGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYTFlZWEKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoZXR5cGVzL2plcnNleS1xdWlja3N0YXJ0LXdlYmFwcC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvYXJjaGV0eXBlLnhtbApAQCAtMCwwICsxLDI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxhcmNoZXR5cGU+CisgIDxpZD5qZXJzZXktcXVpY2tzdGFydC13ZWJhcHA8L2lkPgorICA8c291cmNlcz4KKyAgICA8c291cmNlPnNyYy9tYWluL2phdmEvTXlSZXNvdXJjZS5qYXZhPC9zb3VyY2U+CisgIDwvc291cmNlcz4KKyAgPHJlc291cmNlcz4KKyAgICA8cmVzb3VyY2U+c3JjL21haW4vd2ViYXBwL2luZGV4LmpzcDwvcmVzb3VyY2U+CisgICAgPHJlc291cmNlPnNyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWw8L3Jlc291cmNlPgorICA8L3Jlc291cmNlcz4KKzwvYXJjaGV0eXBlPgpkaWZmIC0tZ2l0IGEvYXJjaGV0eXBlcy9qZXJzZXktcXVpY2tzdGFydC13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcG9tLnhtbCBiL2FyY2hldHlwZXMvamVyc2V5LXF1aWNrc3RhcnQtd2ViYXBwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDljOWU3ZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hldHlwZXMvamVyc2V5LXF1aWNrc3RhcnQtd2ViYXBwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwKQEAgLTAsMCArMSw2MiBAQAorPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorCisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPGdyb3VwSWQ+XCR7Z3JvdXBJZH08L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+XCR7YXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8dmVyc2lvbj5cJHt2ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICA8bmFtZT5cJHthcnRpZmFjdElkfTwvbmFtZT4KKworICAgIDxidWlsZD4KKyAgICAgICAgPGZpbmFsTmFtZT5cJHthcnRpZmFjdElkfTwvZmluYWxOYW1lPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjUuMTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHNvdXJjZT4xLjc8L3NvdXJjZT4KKyAgICAgICAgICAgICAgICAgICAgPHRhcmdldD4xLjc8L3RhcmdldD4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8ZGVwZW5kZW5jeU1hbmFnZW1lbnQ+CisgICAgICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktYm9tPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPlwke2plcnNleS52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8dHlwZT5wb208L3R5cGU+CisgICAgICAgICAgICAgICAgPHNjb3BlPmltcG9ydDwvc2NvcGU+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDwvZGVwZW5kZW5jaWVzPgorICAgIDwvZGVwZW5kZW5jeU1hbmFnZW1lbnQ+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwhLS0gdXNlIHRoZSBmb2xsb3dpbmcgYXJ0aWZhY3RJZCBpZiB5b3UgZG9uJ3QgbmVlZCBzZXJ2bGV0IDIueCBjb21wYXRpYmlsaXR5IC0tPgorICAgICAgICAgICAgPCEtLSBhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldDwvYXJ0aWZhY3RJZCAtLT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1oazI8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPCEtLSB1bmNvbW1lbnQgdGhpcyB0byBnZXQgSlNPTiBzdXBwb3J0CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtanNvbi1iaW5kaW5nPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIC0tPgorICAgIDwvZGVwZW5kZW5jaWVzPgorICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8amVyc2V5LnZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC9qZXJzZXkudmVyc2lvbj4KKyAgICAgICAgPHByb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+VVRGLTg8L3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+CisgICAgPC9wcm9wZXJ0aWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYXJjaGV0eXBlcy9qZXJzZXktcXVpY2tzdGFydC13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9NeVJlc291cmNlLmphdmEgYi9hcmNoZXR5cGVzL2plcnNleS1xdWlja3N0YXJ0LXdlYmFwcC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL015UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2JlZWUxCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGV0eXBlcy9qZXJzZXktcXVpY2tzdGFydC13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9NeVJlc291cmNlLmphdmEKQEAgLTAsMCArMSwyNSBAQAorcGFja2FnZSAkcGFja2FnZTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCisvKioKKyAqIFJvb3QgcmVzb3VyY2UgKGV4cG9zZWQgYXQgIm15cmVzb3VyY2UiIHBhdGgpCisgKi8KK0BQYXRoKCJteXJlc291cmNlIikKK3B1YmxpYyBjbGFzcyBNeVJlc291cmNlIHsKKworICAgIC8qKgorICAgICAqIE1ldGhvZCBoYW5kbGluZyBIVFRQIEdFVCByZXF1ZXN0cy4gVGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGJlIHNlbnQKKyAgICAgKiB0byB0aGUgY2xpZW50IGFzICJ0ZXh0L3BsYWluIiBtZWRpYSB0eXBlLgorICAgICAqCisgICAgICogQHJldHVybiBTdHJpbmcgdGhhdCB3aWxsIGJlIHJldHVybmVkIGFzIGEgdGV4dC9wbGFpbiByZXNwb25zZS4KKyAgICAgKi8KKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0SXQoKSB7CisgICAgICAgIHJldHVybiAiR290IGl0ISI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYXJjaGV0eXBlcy9qZXJzZXktcXVpY2tzdGFydC13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL2FyY2hldHlwZXMvamVyc2V5LXF1aWNrc3RhcnQtd2ViYXBwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M4NWIzYQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2hldHlwZXMvamVyc2V5LXF1aWNrc3RhcnQtd2ViYXBwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwxOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gVGhpcyB3ZWIueG1sIGZpbGUgaXMgbm90IHJlcXVpcmVkIHdoZW4gdXNpbmcgU2VydmxldCAzLjAgY29udGFpbmVyLAorICAgICBzZWUgaW1wbGVtZW50YXRpb24gZGV0YWlscyBodHRwOi8vamVyc2V5LmphdmEubmV0L25vbmF2L2RvY3VtZW50YXRpb24vbGF0ZXN0L2pheC1ycy5odG1sIC0tPgorPHdlYi1hcHAgdmVyc2lvbj0iMi41IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIj4KKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5KZXJzZXkgV2ViIEFwcGxpY2F0aW9uPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qZXJzZXkuY29uZmlnLnNlcnZlci5wcm92aWRlci5wYWNrYWdlczwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT4kcGFja2FnZTwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SmVyc2V5IFdlYiBBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L3dlYmFwaS8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL2FyY2hldHlwZXMvamVyc2V5LXF1aWNrc3RhcnQtd2ViYXBwL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AgYi9hcmNoZXR5cGVzL2plcnNleS1xdWlja3N0YXJ0LXdlYmFwcC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNjRiNDUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoZXR5cGVzL2plcnNleS1xdWlja3N0YXJ0LXdlYmFwcC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwCkBAIC0wLDAgKzEsOCBAQAorPGh0bWw+Cis8Ym9keT4KKyAgICA8aDI+SmVyc2V5IFJFU1RmdWwgV2ViIEFwcGxpY2F0aW9uITwvaDI+CisgICAgPHA+PGEgaHJlZj0id2ViYXBpL215cmVzb3VyY2UiPkplcnNleSByZXNvdXJjZTwvYT4KKyAgICA8cD5WaXNpdCA8YSBocmVmPSJodHRwOi8vamVyc2V5LmphdmEubmV0Ij5Qcm9qZWN0IEplcnNleSB3ZWJzaXRlPC9hPgorICAgIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIEplcnNleSEKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2FyY2hldHlwZXMvcG9tLnhtbCBiL2FyY2hldHlwZXMvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTYzYWNlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaGV0eXBlcy9wb20ueG1sCkBAIC0wLDAgKzEsODQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuYXJjaGV0eXBlczwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LWFyY2hldHlwZXM8L25hbWU+CisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBBIG1vZHVsZSBjb250YWluaW5nIGFyY2hldHlwZXMgZm9yIGdlbmVyYXRpbmcgSmVyc2V5LWJhc2VkIGFwcGxpY2F0aW9ucy4KKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPG1vZHVsZXM+CisgICAgICAgIDxtb2R1bGU+amVyc2V5LWhlcm9rdS13ZWJhcHA8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5qZXJzZXktcXVpY2tzdGFydC1ncml6emx5MjwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmplcnNleS1xdWlja3N0YXJ0LXdlYmFwcDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmplcnNleS1leGFtcGxlLWphdmE4LXdlYmFwcDwvbW9kdWxlPgorICAgIDwvbW9kdWxlcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPGV4dGVuc2lvbnM+CisgICAgICAgICAgICA8ZXh0ZW5zaW9uPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4uYXJjaGV0eXBlPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmFyY2hldHlwZS1wYWNrYWdpbmc8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHthcmNoZXR5cGUubXZuLnBsdWdpbi52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZXh0ZW5zaW9uPgorICAgICAgICA8L2V4dGVuc2lvbnM+CisKKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hcmNoZXR5cGUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7YXJjaGV0eXBlLm12bi5wbHVnaW4udmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnJlbGVhc2U8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZ3BnLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7Z3BnLm12bi5wbHVnaW4udmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+c2lnbi1hcnRpZmFjdDwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT52ZXJpZnk8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5zaWduPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2JvbS9wb20ueG1sIGIvYm9tL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBlZTJhNAotLS0gL2Rldi9udWxsCisrKyBiL2JvbS9wb20ueG1sCkBAIC0wLDAgKzEsNDU0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorCisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+bmV0LmphdmE8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPmp2bmV0LXBhcmVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+NDwvdmVyc2lvbj4KKyAgICAgICAgPHJlbGF0aXZlUGF0aCAvPgorICAgIDwvcGFyZW50PgorCisgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXk8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+amVyc2V5LWJvbTwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LWJvbTwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgQmlsbCBvZiBNYXRlcmlhbHMgKEJPTSk8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY3lNYW5hZ2VtZW50PgorICAgICAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29tbW9uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNsaWVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1zZXJ2ZXI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuYnVuZGxlczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXhycy1yaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb25uZWN0b3JzPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1hcGFjaGUtY29ubmVjdG9yPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbm5lY3RvcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWdyaXp6bHktY29ubmVjdG9yPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbm5lY3RvcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWpldHR5LWNvbm5lY3RvcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb25uZWN0b3JzPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1qZGstY29ubmVjdG9yPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbm5lY3RvcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW5ldHR5LWNvbm5lY3RvcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItamV0dHktaHR0cDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItZ3JpenpseTItaHR0cDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItZ3JpenpseTItc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItamV0dHktc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItamRrLWh0dHA8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLW5ldHR5LWh0dHA8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2ltcGxlLWh0dHA8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVycy5nbGFzc2Zpc2g8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWdmLWVqYjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWJlYW4tdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWVudGl0eS1maWx0ZXJpbmc8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZXRhaW5mLXNlcnZpY2VzPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbXZjPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbXZjLWJlYW4tdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW12Yy1mcmVlbWFya2VyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbXZjLWpzcDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW12Yy1tdXN0YWNoZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXByb3h5LWNsaWVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXNlcnZsZXQtcG9ydGFiaWxpdHk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1zcHJpbmc0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktZGVjbGFyYXRpdmUtbGlua2luZzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXdhZGwtZG9jbGV0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXdlbGQyLXNlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNkaTF4PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNkaTF4LXRyYW5zYWN0aW9uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jZGkxeC12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNkaTF4LXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY2RpMXgtYmFuLWN1c3RvbS1oazItYmluZGluZzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQucng8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXJ4LWNsaWVudC1ndWF2YTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQucng8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXJ4LWNsaWVudC1yeGphdmE8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LnJ4PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1yeC1jbGllbnQtcnhqYXZhMjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtamF4YjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtanNvbi1qYWNrc29uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1qc29uLWphY2tzb24xPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1qc29uLWpldHRpc29uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1qc29uLXByb2Nlc3Npbmc8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLWpzb24tYmluZGluZzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEta3J5bzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtbW94eTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtbXVsdGlwYXJ0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1zc2U8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VjdXJpdHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+b2F1dGgxLWNsaWVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZWN1cml0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vYXV0aDEtc2VydmVyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlY3VyaXR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm9hdXRoMS1zaWduYXR1cmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VjdXJpdHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+b2F1dGgyLWNsaWVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWhrMjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNkaTItc2U8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcms8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1idW5kbGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1ncml6emx5MjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWlubWVtb3J5PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItamRrLWh0dHA8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1zaW1wbGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1qZXR0eTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yazwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstdXRpbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDwvZGVwZW5kZW5jaWVzPgorICAgIDwvZGVwZW5kZW5jeU1hbmFnZW1lbnQ+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5NYW5hZ2VtZW50PgorICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5jb3B5cmlnaHQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmdsYXNzZmlzaC1jb3B5cmlnaHQtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjI4PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlRmlsZT5ldGMvY29uZmlnL2NvcHlyaWdodC1leGNsdWRlPC9leGNsdWRlRmlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1zdm58bWVyY3VyaWFsfGdpdCAtIGRlZmF1bHRzIHRvIHN2bi0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNjbT5naXQ8L3NjbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gdHVybiBvbi9vZmYgZGVidWdnaW5nIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPGRlYnVnPmZhbHNlPC9kZWJ1Zz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gc2tpcCBmaWxlcyBub3QgdW5kZXIgU0NNLS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2NtT25seT50cnVlPC9zY21Pbmx5PgorICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSB0dXJuIG9mZiB3YXJuaW5ncyAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx3YXJuPnRydWU8L3dhcm4+CisgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGZvciB1c2Ugd2l0aCByZXBhaXIgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8dXBkYXRlPmZhbHNlPC91cGRhdGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGNoZWNrIHRoYXQgeWVhciBpcyBjb3JyZWN0IC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlnbm9yZVllYXI+ZmFsc2U8L2lnbm9yZVllYXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGVGaWxlPmV0Yy9jb25maWcvY29weXJpZ2h0LnR4dDwvdGVtcGxhdGVGaWxlPgorICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KKyAgICA8L2J1aWxkPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5wcm9qZWN0LWluZm88L2lkPgorICAgICAgICAgICAgPGFjdGl2YXRpb24+CisgICAgICAgICAgICAgICAgPGFjdGl2ZUJ5RGVmYXVsdD5mYWxzZTwvYWN0aXZlQnlEZWZhdWx0PgorICAgICAgICAgICAgPC9hY3RpdmF0aW9uPgorCisgICAgICAgICAgICA8IS0tIHBsYWNlaG9sZGVyIHJlcXVpcmVkIGZvciBzaXRlOnN0YWdlIC0tPgorICAgICAgICAgICAgPGRpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICAgICAgPHNpdGU+CisgICAgICAgICAgICAgICAgICAgIDxpZD5sb2NhbGhvc3Q8L2lkPgorICAgICAgICAgICAgICAgICAgICA8dXJsPmh0dHA6Ly9sb2NhbGhvc3Q8L3VybD4KKyAgICAgICAgICAgICAgICA8L3NpdGU+CisgICAgICAgICAgICA8L2Rpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+cmVsZWFzZTwvaWQ+CisgICAgICAgICAgICA8YWN0aXZhdGlvbj4KKyAgICAgICAgICAgICAgICA8YWN0aXZlQnlEZWZhdWx0PmZhbHNlPC9hY3RpdmVCeURlZmF1bHQ+CisgICAgICAgICAgICA8L2FjdGl2YXRpb24+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBsb3ktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNraXA+dHJ1ZTwvc2tpcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc29uYXR5cGUucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm5leHVzLXN0YWdpbmctbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+MS42Ljc8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+ZGVmYXVsdC1kZXBsb3k8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+ZGVwbG95PC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+ZGVwbG95PC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlcnZlcklkPmp2bmV0LW5leHVzLXN0YWdpbmc8L3NlcnZlcklkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh1c1VybD5odHRwczovL21hdmVuLmphdmEubmV0LzwvbmV4dXNVcmw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICA8L3Byb2ZpbGVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9SRUFETUUgYi9idW5kbGVzL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjJhYzUxCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9SRUFETUUKQEAgLTAsMCArMSBAQAorSmVyc2V5IGRpc3RyaWJ1dGlvbiBidW5kbGVzLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2J1bmRsZXMvYXBpZG9jcy9wb20ueG1sIGIvYnVuZGxlcy9hcGlkb2NzL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAyYmI2MAotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvYXBpZG9jcy9wb20ueG1sCkBAIC0wLDAgKzEsMTQ1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5idW5kbGVzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+YXBpZG9jczwvYXJ0aWZhY3RJZD4KKyAgICA8bmFtZT5qZXJzZXktYnVuZGxlcy1hcGlkb2NzPC9uYW1lPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8IS0tIENPUkUgLS0+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1zZXJ2ZXI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNsaWVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29tbW9uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDwhLS0gbmVlZCB0byBleHBsaWNpdGx5IGluY2x1ZGUgdGhlIG9zZ2kgZGVwZW5kZW5jeSBoZXJlCisgICAgICAgICAgICAgIGFzIGl0IGlzIHNjb3BlZCBhcyBwcm92aWRlZCBpbiB0aGUgamVyc2V5LWNvbW1vbiBtb2R1bGUgLS0+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm9zZ2k8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcub3NnaS5jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDwhLS0gQ09OVEFJTkVSUyAtLT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldC1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDwhLS0gbmVlZCB0byBleHBsaWNpdGx5IGluY2x1ZGUgdGhlIHNlcnZsZXQgZGVwZW5kZW5jeSBoZXJlCisgICAgICAgICAgICAgIGFzIGl0IGlzIHNjb3BlZCBhcyBwcm92aWRlZCBpbiB0aGUgamVyc2V5LXNlcnZldCBtb2R1bGVzIC0tPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2g8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+My4xPC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2ltcGxlLWh0dHA8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1qZGstaHR0cDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLWdyaXp6bHkyLWh0dHA8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1ncml6emx5Mi1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDwhLS0gTUVESUEgLS0+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtbW94eTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLW11bHRpcGFydDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLXNzZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmphdmFkb2MtamFyPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1waGFzZT5wYWNrYWdlPC9waGFzZS0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZURlcGVuZGVuY3lTb3VyY2VzPnRydWU8L2luY2x1ZGVEZXBlbmRlbmN5U291cmNlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeVNvdXJjZUluY2x1ZGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeVNvdXJjZUluY2x1ZGU+b3JnLmdsYXNzZmlzaC5qZXJzZXkuKjoqPC9kZXBlbmRlbmN5U291cmNlSW5jbHVkZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3lTb3VyY2VJbmNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZVBhY2thZ2VOYW1lcz4qLmludGVybmFsLio8L2V4Y2x1ZGVQYWNrYWdlTmFtZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5idWlsZC1oZWxwZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmV4Y2x1ZGUtamFyPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5yZW1vdmUtcHJvamVjdC1hcnRpZmFjdDwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvZXhhbXBsZXMvcG9tLnhtbCBiL2J1bmRsZXMvZXhhbXBsZXMvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGUyNWIwCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9leGFtcGxlcy9wb20ueG1sCkBAIC0wLDAgKzEsNzM0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorCisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuYnVuZGxlczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmplcnNleS1leGFtcGxlczwvYXJ0aWZhY3RJZD4KKyAgICA8bmFtZT5qZXJzZXktYnVuZGxlcy1leGFtcGxlczwvbmFtZT4KKyAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmJlYW4tdmFsaWRhdGlvbi13ZWJhcHA8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8Y2xhc3NpZmllcj5wcm9qZWN0LXNyYzwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgIDx0eXBlPnppcDwvdHlwZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+YmVhbi12YWxpZGF0aW9uLXdlYmFwcDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxjbGFzc2lmaWVyPmdmLXByb2plY3Qtc3JjPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPHR5cGU+emlwPC90eXBlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5ib29rbWFyazwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxjbGFzc2lmaWVyPnByb2plY3Qtc3JjPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPHR5cGU+emlwPC90eXBlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5ib29rbWFyazwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxjbGFzc2lmaWVyPmdmLXByb2plY3Qtc3JjPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPHR5cGU+emlwPC90eXBlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5ib29rbWFyay1lbTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxjbGFzc2lmaWVyPnByb2plY3Qtc3JjPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPHR5cGU+emlwPC90eXBlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5ib29rbWFyay1lbTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxjbGFzc2lmaWVyPmdmLXByb2plY3Qtc3JjPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPHR5cGU+emlwPC90eXBlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5ib29rc3RvcmUtd2ViYXBwPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPGNsYXNzaWZpZXI+cHJvamVjdC1zcmM8L2NsYXNzaWZpZXI+CisgICAgICAgICAgICA8dHlwZT56aXA8L3R5cGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmJvb2tzdG9yZS13ZWJhcHA8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8Y2xhc3NpZmllcj5nZi1wcm9qZWN0LXNyYzwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgIDx0eXBlPnppcDwvdHlwZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2RpLXdlYmFwcDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxjbGFzc2lmaWVyPnByb2plY3Qtc3JjPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPHR5cGU+emlwPC90eXBlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jZGktd2ViYXBwPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPGNsYXNzaWZpZXI+Z2YtcHJvamVjdC1zcmM8L2NsYXNzaWZpZXI+CisgICAgICAgICAgICA8dHlwZT56aXA8L3R5cGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmNsaXBib2FyZDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxjbGFzc2lmaWVyPnByb2plY3Qtc3JjPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPHR5cGU+emlwPC90eXBlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jbGlwYm9hcmQtcHJvZ3JhbW1hdGljPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPGNsYXNzaWZpZXI+cHJvamVjdC1zcmM8L2NsYXNzaWZpZXI+CisgICAgICAgICAgICA8dHlwZT56aXA8L3R5cGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmRlY2xhcmF0aXZlLWxpbmtpbmc8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8Y2xhc3NpZmllcj5wcm9qZWN0LXNyYzwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgIDx0eXBlPnppcDwvdHlwZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8IS0tVW5jb21tZW50IGFzIHNvb24gYXMgd2UgYnVpbGQgSmVyc2V5IHdpdGggSmF2YTggYnkgZGVmYXVsdC0tPgorICAgICAgICA8IS0tPGRlcGVuZGVuY3k+LS0+CisgICAgICAgICAgICA8IS0tPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+LS0+CisgICAgICAgICAgICA8IS0tPGFydGlmYWN0SWQ+ZGVmYXVsdC1tZXRob2QtamF2YTgtd2ViYXBwPC9hcnRpZmFjdElkPi0tPgorICAgICAgICAgICAgPCEtLTx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4tLT4KKyAgICAgICAgICAgIDwhLS08Y2xhc3NpZmllcj5wcm9qZWN0LXNyYzwvY2xhc3NpZmllcj4tLT4KKyAgICAgICAgICAgIDwhLS08dHlwZT56aXA8L3R5cGU+LS0+CisgICAgICAgIDwhLS08L2RlcGVuZGVuY3k+LS0+CisgICAgICAgIDwhLS08ZGVwZW5kZW5jeT4tLT4KKyAgICAgICAgICAgIDwhLS08Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlczwvZ3JvdXBJZD4tLT4KKyAgICAgICAgICAgIDwhLS08YXJ0aWZhY3RJZD5kZWZhdWx0LW1ldGhvZC1qYXZhOC13ZWJhcHA8L2FydGlmYWN0SWQ+LS0+CisgICAgICAgICAgICA8IS0tPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPi0tPgorICAgICAgICAgICAgPCEtLTxjbGFzc2lmaWVyPmdmLXByb2plY3Qtc3JjPC9jbGFzc2lmaWVyPi0tPgorICAgICAgICAgICAgPCEtLTx0eXBlPnppcDwvdHlwZT4tLT4KKyAgICAgICAgPCEtLTwvZGVwZW5kZW5jeT4tLT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmVudGl0eS1maWx0ZXJpbmc8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8Y2xhc3NpZmllcj5wcm9qZWN0LXNyYzwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgIDx0eXBlPnppcDwvdHlwZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZW50aXR5LWZpbHRlcmluZy1zZWN1cml0eTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxjbGFzc2lmaWVyPnByb2plY3Qtc3JjPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPHR5cGU+emlwPC90eXBlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5lbnRpdHktZmlsdGVyaW5nLXNlbGVjdGFibGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8Y2xhc3NpZmllcj5wcm9qZWN0LXNyYzwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgIDx0eXBlPnppcDwvdHlwZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhjZXB0aW9uLW1hcHBpbmc8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8Y2xhc3NpZmllcj5wcm9qZWN0LXNyYzwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgIDx0eXBlPnppcDwvdHlwZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXh0ZW5kZWQtd2FkbC13ZWJhcHA8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8Y2xhc3NpZmllcj5wcm9qZWN0LXNyYzwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgIDx0eXBlPnppcDwvdHlwZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXh0ZW5kZWQtd2FkbC13ZWJhcHA8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8Y2xhc3NpZmllcj5nZi1wcm9qZWN0LXNyYzwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgIDx0eXBlPnppcDwvdHlwZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZnJlZW1hcmtlci13ZWJhcHA8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8Y2xhc3NpZmllcj5wcm9qZWN0LXNyYzwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgIDx0eXBlPnppcDwvdHlwZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZnJlZW1hcmtlci13ZWJhcHA8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8Y2xhc3NpZmllcj5nZi1wcm9qZWN0LXNyYzwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgIDx0eXBlPnppcDwvdHlwZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z3Jvb3Z5PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPGNsYXNzaWZpZXI+cHJvamVjdC1zcmM8L2NsYXNzaWZpZXI+CisgICAgICAgICAgICA8dHlwZT56aXA8L3R5cGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmhlbGxvd29ybGQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8Y2xhc3NpZmllcj5wcm9qZWN0LXNyYzwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgIDx0eXBlPnppcDwvdHlwZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGVsbG93b3JsZC1iZW5jaG1hcms8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8Y2xhc3NpZmllcj5wcm9qZWN0LXNyYzwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgIDx0eXBlPnppcDwvdHlwZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGVsbG93b3JsZC1wcm9ncmFtbWF0aWM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8Y2xhc3NpZmllcj5wcm9qZWN0LXNyYzwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgIDx0eXBlPnppcDwvdHlwZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGVsbG93b3JsZC1wdXJlLWpheC1yczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxjbGFzc2lmaWVyPnByb2plY3Qtc3JjPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPHR5cGU+emlwPC90eXBlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5oZWxsb3dvcmxkLXNwcmluZy1hbm5vdGF0aW9uczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxjbGFzc2lmaWVyPnByb2plY3Qtc3JjPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPHR5cGU+emlwPC90eXBlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5oZWxsb3dvcmxkLXNwcmluZy13ZWJhcHA8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8Y2xhc3NpZmllcj5wcm9qZWN0LXNyYzwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgIDx0eXBlPnppcDwvdHlwZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8IS0tIFRoZXJlIGlzIHByb2JsZW0gdG8gcnVuIFNwcmluZyBleGFtcGxlIG9uIEdGIC0gaHR0cHM6Ly9qYXZhLm5ldC9qaXJhL2Jyb3dzZS9KRVJTRVktMjAzMgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGVsbG93b3JsZC1zcHJpbmctd2ViYXBwPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPGNsYXNzaWZpZXI+Z2YtcHJvamVjdC1zcmM8L2NsYXNzaWZpZXI+CisgICAgICAgICAgICA8dHlwZT56aXA8L3R5cGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgLS0+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5oZWxsb3dvcmxkLXdlYmFwcDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxjbGFzc2lmaWVyPnByb2plY3Qtc3JjPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPHR5cGU+emlwPC90eXBlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5oZWxsb3dvcmxkLXdlYmFwcDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxjbGFzc2lmaWVyPmdmLXByb2plY3Qtc3JjPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPHR5cGU+emlwPC90eXBlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5oZWxsb3dvcmxkLXdlbGQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8Y2xhc3NpZmllcj5wcm9qZWN0LXNyYzwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgIDx0eXBlPnppcDwvdHlwZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+aHR0cC1wYXRjaDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxjbGFzc2lmaWVyPnByb2plY3Qtc3JjPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPHR5cGU+emlwPC90eXBlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5odHRwLXRyYWNlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPGNsYXNzaWZpZXI+cHJvamVjdC1zcmM8L2NsYXNzaWZpZXI+CisgICAgICAgICAgICA8dHlwZT56aXA8L3R5cGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmh0dHBzLWNsaWVudHNlcnZlci1ncml6emx5PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPGNsYXNzaWZpZXI+cHJvamVjdC1zcmM8L2NsYXNzaWZpZXI+CisgICAgICAgICAgICA8dHlwZT56aXA8L3R5cGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmh0dHBzLXNlcnZlci1nbGFzc2Zpc2g8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8Y2xhc3NpZmllcj5wcm9qZWN0LXNyYzwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgIDx0eXBlPnppcDwvdHlwZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+aHR0cHMtc2VydmVyLWdsYXNzZmlzaDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxjbGFzc2lmaWVyPmdmLXByb2plY3Qtc3JjPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPHR5cGU+emlwPC90eXBlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXhiPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPGNsYXNzaWZpZXI+cHJvamVjdC1zcmM8L2NsYXNzaWZpZXI+CisgICAgICAgICAgICA8dHlwZT56aXA8L3R5cGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmpheHJzLXR5cGVzLWluamVjdGlvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxjbGFzc2lmaWVyPnByb2plY3Qtc3JjPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPHR5cGU+emlwPC90eXBlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktZWpiPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPGNsYXNzaWZpZXI+cHJvamVjdC1zcmM8L2NsYXNzaWZpZXI+CisgICAgICAgICAgICA8dHlwZT56aXA8L3R5cGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWVqYjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxjbGFzc2lmaWVyPmdmLXByb2plY3Qtc3JjPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPHR5cGU+emlwPC90eXBlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc29uLWphY2tzb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8Y2xhc3NpZmllcj5wcm9qZWN0LXNyYzwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgIDx0eXBlPnppcDwvdHlwZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNvbi1qYWNrc29uMTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxjbGFzc2lmaWVyPnByb2plY3Qtc3JjPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPHR5cGU+emlwPC90eXBlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc29uLWpldHRpc29uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPGNsYXNzaWZpZXI+cHJvamVjdC1zcmM8L2NsYXNzaWZpZXI+CisgICAgICAgICAgICA8dHlwZT56aXA8L3R5cGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzb24tbW94eTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxjbGFzc2lmaWVyPnByb2plY3Qtc3JjPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPHR5cGU+emlwPC90eXBlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc29uLXByb2Nlc3Npbmctd2ViYXBwPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPGNsYXNzaWZpZXI+cHJvamVjdC1zcmM8L2NsYXNzaWZpZXI+CisgICAgICAgICAgICA8dHlwZT56aXA8L3R5cGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNvbi1wcm9jZXNzaW5nLXdlYmFwcDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxjbGFzc2lmaWVyPmdmLXByb2plY3Qtc3JjPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPHR5cGU+emlwPC90eXBlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc29uLXdpdGgtcGFkZGluZzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxjbGFzc2lmaWVyPnByb2plY3Qtc3JjPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPHR5cGU+emlwPC90eXBlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYW5hZ2VkLWJlYW5zLXdlYmFwcDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxjbGFzc2lmaWVyPnByb2plY3Qtc3JjPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPHR5cGU+emlwPC90eXBlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYW5hZ2VkLWJlYW5zLXdlYmFwcDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxjbGFzc2lmaWVyPmdmLXByb2plY3Qtc3JjPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPHR5cGU+emlwPC90eXBlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYW5hZ2VkLWNsaWVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxjbGFzc2lmaWVyPnByb2plY3Qtc3JjPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPHR5cGU+emlwPC90eXBlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYW5hZ2VkLWNsaWVudC1zaW1wbGUtd2ViYXBwPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPGNsYXNzaWZpZXI+cHJvamVjdC1zcmM8L2NsYXNzaWZpZXI+CisgICAgICAgICAgICA8dHlwZT56aXA8L3R5cGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hbmFnZWQtY2xpZW50LXNpbXBsZS13ZWJhcHA8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8Y2xhc3NpZmllcj5nZi1wcm9qZWN0LXNyYzwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgIDx0eXBlPnppcDwvdHlwZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWFuYWdlZC1jbGllbnQtd2ViYXBwPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPGNsYXNzaWZpZXI+cHJvamVjdC1zcmM8L2NsYXNzaWZpZXI+CisgICAgICAgICAgICA8dHlwZT56aXA8L3R5cGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hbmFnZWQtY2xpZW50LXdlYmFwcDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxjbGFzc2lmaWVyPmdmLXByb2plY3Qtc3JjPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPHR5cGU+emlwPC90eXBlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tb25pdG9yaW5nLXdlYmFwcDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxjbGFzc2lmaWVyPnByb2plY3Qtc3JjPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPHR5cGU+emlwPC90eXBlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tdWx0aXBhcnQtd2ViYXBwPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPGNsYXNzaWZpZXI+cHJvamVjdC1zcmM8L2NsYXNzaWZpZXI+CisgICAgICAgICAgICA8dHlwZT56aXA8L3R5cGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm11bHRpcGFydC13ZWJhcHA8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8Y2xhc3NpZmllcj5nZi1wcm9qZWN0LXNyYzwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgIDx0eXBlPnppcDwvdHlwZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+b2F1dGgtY2xpZW50LXR3aXR0ZXI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8Y2xhc3NpZmllcj5wcm9qZWN0LXNyYzwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgIDx0eXBlPnppcDwvdHlwZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vYXV0aDItY2xpZW50LWdvb2dsZS13ZWJhcHA8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8Y2xhc3NpZmllcj5wcm9qZWN0LXNyYzwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgIDx0eXBlPnppcDwvdHlwZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3NnaS1oZWxsb3dvcmxkLXdlYmFwcDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxjbGFzc2lmaWVyPnByb2plY3Qtc3JjPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPHR5cGU+emlwPC90eXBlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vc2dpLWh0dHAtc2VydmljZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxjbGFzc2lmaWVyPnByb2plY3Qtc3JjPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPHR5cGU+emlwPC90eXBlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5yZWxvYWQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8Y2xhc3NpZmllcj5wcm9qZWN0LXNyYzwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgIDx0eXBlPnppcDwvdHlwZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+cngtY2xpZW50LXdlYmFwcDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxjbGFzc2lmaWVyPnByb2plY3Qtc3JjPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPHR5cGU+emlwPC90eXBlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5yeC1jbGllbnQtd2ViYXBwPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPGNsYXNzaWZpZXI+Z2YtcHJvamVjdC1zcmM8L2NsYXNzaWZpZXI+CisgICAgICAgICAgICA8dHlwZT56aXA8L3R5cGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZlci1hc3luYzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxjbGFzc2lmaWVyPnByb2plY3Qtc3JjPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPHR5cGU+emlwPC90eXBlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2ZXItYXN5bmMtbWFuYWdlZDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxjbGFzc2lmaWVyPnByb2plY3Qtc3JjPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPHR5cGU+emlwPC90eXBlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2ZXItYXN5bmMtc3RhbmRhbG9uZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxjbGFzc2lmaWVyPnByb2plY3Qtc3JjPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPHR5cGU+emlwPC90eXBlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2ZXItc2VudC1ldmVudHMtamVyc2V5PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPGNsYXNzaWZpZXI+cHJvamVjdC1zcmM8L2NsYXNzaWZpZXI+CisgICAgICAgICAgICA8dHlwZT56aXA8L3R5cGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZlci1zZW50LWV2ZW50cy1qYXhyczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxjbGFzc2lmaWVyPnByb2plY3Qtc3JjPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPHR5cGU+emlwPC90eXBlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0My13ZWJhcHA8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8Y2xhc3NpZmllcj5wcm9qZWN0LXNyYzwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgIDx0eXBlPnppcDwvdHlwZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldDMtd2ViYXBwPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPGNsYXNzaWZpZXI+Z2YtcHJvamVjdC1zcmM8L2NsYXNzaWZpZXI+CisgICAgICAgICAgICA8dHlwZT56aXA8L3R5cGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnNob3J0ZW5lci13ZWJhcHA8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8Y2xhc3NpZmllcj5wcm9qZWN0LXNyYzwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgIDx0eXBlPnppcDwvdHlwZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2hvcnRlbmVyLXdlYmFwcDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxjbGFzc2lmaWVyPmdmLXByb2plY3Qtc3JjPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPHR5cGU+emlwPC90eXBlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zaW1wbGUtY29uc29sZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxjbGFzc2lmaWVyPnByb2plY3Qtc3JjPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPHR5cGU+emlwPC90eXBlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcGFya2xpbmVzPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPGNsYXNzaWZpZXI+cHJvamVjdC1zcmM8L2NsYXNzaWZpZXI+CisgICAgICAgICAgICA8dHlwZT56aXA8L3R5cGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnNzZS1pdGVtLXN0b3JlLWplcnNleS13ZWJhcHA8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8Y2xhc3NpZmllcj5wcm9qZWN0LXNyYzwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgIDx0eXBlPnppcDwvdHlwZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3NlLWl0ZW0tc3RvcmUtamF4cnMtd2ViYXBwPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPGNsYXNzaWZpZXI+cHJvamVjdC1zcmM8L2NsYXNzaWZpZXI+CisgICAgICAgICAgICA8dHlwZT56aXA8L3R5cGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnNzZS1pdGVtLXN0b3JlLWplcnNleS13ZWJhcHA8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8Y2xhc3NpZmllcj5nZi1wcm9qZWN0LXNyYzwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgIDx0eXBlPnppcDwvdHlwZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3NlLWl0ZW0tc3RvcmUtamF4cnMtd2ViYXBwPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPGNsYXNzaWZpZXI+Z2YtcHJvamVjdC1zcmM8L2NsYXNzaWZpZXI+CisgICAgICAgICAgICA8dHlwZT56aXA8L3R5cGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnNzZS10d2l0dGVyLWFnZ3JlZ2F0b3I8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8Y2xhc3NpZmllcj5wcm9qZWN0LXNyYzwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgIDx0eXBlPnppcDwvdHlwZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3lzdGVtLXByb3BlcnRpZXMtZXhhbXBsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxjbGFzc2lmaWVyPnByb2plY3Qtc3JjPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPHR5cGU+emlwPC90eXBlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD50b25lLWdlbmVyYXRvcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxjbGFzc2lmaWVyPnByb2plY3Qtc3JjPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPHR5cGU+emlwPC90eXBlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD54bWwtbW94eTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxjbGFzc2lmaWVyPnByb2plY3Qtc3JjPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPHR5cGU+emlwPC90eXBlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKworICAgIDwvZGVwZW5kZW5jaWVzPgorICAgIDxidWlsZD4KKyAgICAgICAgPGZpbmFsTmFtZT4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2ZpbmFsTmFtZT4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpZD51bnBhY2stZXhhbXBsZXM8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnByb2Nlc3Mtc291cmNlczwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrLWRlcGVuZGVuY2llczwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RyaXBWZXJzaW9uPnRydWU8L3N0cmlwVmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZUdyb3VwSWRzPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9pbmNsdWRlR3JvdXBJZHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+cHJvamVjdC1zcmM8L2NsYXNzaWZpZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHR5cGU+emlwPC90eXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vZGVwZW5kZW5jeS9leGFtcGxlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpZD51bnBhY2stZ2YtZXhhbXBsZXM8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnByb2Nlc3Mtc291cmNlczwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+dW5wYWNrLWRlcGVuZGVuY2llczwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RyaXBWZXJzaW9uPnRydWU8L3N0cmlwVmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZUdyb3VwSWRzPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9pbmNsdWRlR3JvdXBJZHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+Z2YtcHJvamVjdC1zcmM8L2NsYXNzaWZpZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHR5cGU+emlwPC90eXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmYWlsT25NaXNzaW5nQ2xhc3NpZmllckFydGlmYWN0PmZhbHNlPC9mYWlsT25NaXNzaW5nQ2xhc3NpZmllckFydGlmYWN0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vZGVwZW5kZW5jeS9nZi1leGFtcGxlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpZD51bnBhY2std2xzLWV4YW1wbGVzPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wcm9jZXNzLXNvdXJjZXM8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnVucGFjay1kZXBlbmRlbmNpZXM8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0cmlwVmVyc2lvbj50cnVlPC9zdHJpcFZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGVHcm91cElkcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlczwvaW5jbHVkZUdyb3VwSWRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc2lmaWVyPndscy1wcm9qZWN0LXNyYzwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHlwZT56aXA8L3R5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZhaWxPbk1pc3NpbmdDbGFzc2lmaWVyQXJ0aWZhY3Q+ZmFsc2U8L2ZhaWxPbk1pc3NpbmdDbGFzc2lmaWVyQXJ0aWZhY3Q+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9kZXBlbmRlbmN5L3dscy1leGFtcGxlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpZD51bnBhY2std2xzMTIxMy1leGFtcGxlczwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cHJvY2Vzcy1zb3VyY2VzPC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD51bnBhY2stZGVwZW5kZW5jaWVzPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJpcFZlcnNpb24+dHJ1ZTwvc3RyaXBWZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlR3JvdXBJZHM+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2luY2x1ZGVHcm91cElkcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj53bHMxMjEzLXByb2plY3Qtc3JjPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0eXBlPnppcDwvdHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmFpbE9uTWlzc2luZ0NsYXNzaWZpZXJBcnRpZmFjdD5mYWxzZTwvZmFpbE9uTWlzc2luZ0NsYXNzaWZpZXJBcnRpZmFjdD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2RlcGVuZGVuY3kvd2xzMTIxMy1leGFtcGxlczwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvbWFpbi9hc3NlbWJseS9leGFtcGxlcy1hc3NlbWJseS54bWw8L2Rlc2NyaXB0b3I+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvbWFpbi9hc3NlbWJseS9nZi1leGFtcGxlcy1hc3NlbWJseS54bWw8L2Rlc2NyaXB0b3I+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvbWFpbi9hc3NlbWJseS93bHMtZXhhbXBsZXMtYXNzZW1ibHkueG1sPC9kZXNjcmlwdG9yPgorICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3I+c3JjL21haW4vYXNzZW1ibHkvd2xzMTIxMy1leGFtcGxlcy1hc3NlbWJseS54bWw8L2Rlc2NyaXB0b3I+CisgICAgICAgICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlkPm1ha2UtYXNzZW1ibHk8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmF0dGFjaGVkPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9idW5kbGVzL2V4YW1wbGVzL3NyYy9tYWluL2Fzc2VtYmx5L2V4YW1wbGVzLWFzc2VtYmx5LnhtbCBiL2J1bmRsZXMvZXhhbXBsZXMvc3JjL21haW4vYXNzZW1ibHkvZXhhbXBsZXMtYXNzZW1ibHkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3Y2VmNTcKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL2V4YW1wbGVzL3NyYy9tYWluL2Fzc2VtYmx5L2V4YW1wbGVzLWFzc2VtYmx5LnhtbApAQCAtMCwwICsxLDM4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxhc3NlbWJseT4KKyAgICA8aWQ+YWxsPC9pZD4KKyAgICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgorICAgIDxmb3JtYXRzPgorICAgICAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgorICAgIDwvZm9ybWF0cz4KKyAgICA8ZmlsZVNldHM+CisgICAgICAgIDxmaWxlU2V0PgorICAgICAgICAgICAgPGRpcmVjdG9yeT50YXJnZXQvZGVwZW5kZW5jeS9leGFtcGxlczwvZGlyZWN0b3J5PgorICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT5qZXJzZXkvZXhhbXBsZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgPC9maWxlU2V0PgorICAgIDwvZmlsZVNldHM+CisgICAgPGZpbGVzPgorICAgICAgICA8ZmlsZT4KKyAgICAgICAgICAgIDxzb3VyY2U+Li4vLi4vTElDRU5TRS5tZDwvc291cmNlPgorICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT5qZXJzZXk8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgPC9maWxlPgorICAgIDwvZmlsZXM+Cis8L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9leGFtcGxlcy9zcmMvbWFpbi9hc3NlbWJseS9nZi1leGFtcGxlcy1hc3NlbWJseS54bWwgYi9idW5kbGVzL2V4YW1wbGVzL3NyYy9tYWluL2Fzc2VtYmx5L2dmLWV4YW1wbGVzLWFzc2VtYmx5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWQ3N2I5Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9leGFtcGxlcy9zcmMvbWFpbi9hc3NlbWJseS9nZi1leGFtcGxlcy1hc3NlbWJseS54bWwKQEAgLTAsMCArMSw0MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8YXNzZW1ibHk+CisgICAgPGlkPmdmPC9pZD4KKyAgICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgorICAgIDxmb3JtYXRzPgorICAgICAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgorICAgIDwvZm9ybWF0cz4KKyAgICA8ZmlsZVNldHM+CisgICAgICAgIDxmaWxlU2V0PgorICAgICAgICAgICAgPGRpcmVjdG9yeT50YXJnZXQvZGVwZW5kZW5jeS9nZi1leGFtcGxlczwvZGlyZWN0b3J5PgorICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT5nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgIDwvZmlsZVNldD4KKyAgICA8L2ZpbGVTZXRzPgorICAgIDxmaWxlcz4KKyAgICAgICAgPGZpbGU+CisgICAgICAgICAgICA8c291cmNlPi4uLy4uL0xJQ0VOU0UubWQ8L3NvdXJjZT4KKyAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Ljwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICA8L2ZpbGU+CisgICAgICAgIDxmaWxlPgorICAgICAgICAgICAgPHNvdXJjZT4uLi8uLi9MSUNFTlNFLm1kPC9zb3VyY2U+CisgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PmdsYXNzZmlzaC9qZXJzZXk8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgPC9maWxlPgorICAgIDwvZmlsZXM+Cis8L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9leGFtcGxlcy9zcmMvbWFpbi9hc3NlbWJseS93bHMtZXhhbXBsZXMtYXNzZW1ibHkueG1sIGIvYnVuZGxlcy9leGFtcGxlcy9zcmMvbWFpbi9hc3NlbWJseS93bHMtZXhhbXBsZXMtYXNzZW1ibHkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYzM3OGIKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL2V4YW1wbGVzL3NyYy9tYWluL2Fzc2VtYmx5L3dscy1leGFtcGxlcy1hc3NlbWJseS54bWwKQEAgLTAsMCArMSw0OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8YXNzZW1ibHk+CisgICAgPGlkPndsczwvaWQ+CisgICAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KKyAgICA8Zm9ybWF0cz4KKyAgICAgICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KKyAgICA8L2Zvcm1hdHM+CisgICAgPGZpbGVTZXRzPgorICAgICAgICA8ZmlsZVNldD4KKyAgICAgICAgICAgIDxkaXJlY3Rvcnk+dGFyZ2V0L2RlcGVuZGVuY3kvd2xzLWV4YW1wbGVzPC9kaXJlY3Rvcnk+CisgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5Pndscy9qZXJzZXkvZXhhbXBsZXM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgIDwhLS0gZXhjbHVkZSBleGFtcGxlcyBub3Qgd29ya2luZyBvbiBXZWJMb2dpYy0tPgorICAgICAgICAgICAgPGV4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL2Jvb2ttYXJrLyoqPC9leGNsdWRlPiAgICAgICAgICAgICAgICAgPCEtLSB1c2VzIHBlcnNpc3RlbmNlIGNvbmZpZ3VyZWQgZm9yIEdGIC0tPgorICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL2h0dHBzLXNlcnZlci1nbGFzc2Zpc2gvKio8L2V4Y2x1ZGU+ICAgPCEtLSBHRiBvbmx5LCBubyB0ZXN0cyB0byBydW4gYW55d2F5LS0+CisgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovbWFuYWdlZC1iZWFucy13ZWJhcHAvKio8L2V4Y2x1ZGU+ICAgICA8IS0tIHVzZXMgcGVyc2lzdGVuY2UgY29uZmlndXJlZCBmb3IgR0YgLS0+CisgICAgICAgICAgICA8L2V4Y2x1ZGVzPgorICAgICAgICA8L2ZpbGVTZXQ+CisgICAgPC9maWxlU2V0cz4KKyAgICA8ZmlsZXM+CisgICAgICAgIDxmaWxlPgorICAgICAgICAgICAgPHNvdXJjZT4uLi8uLi9MSUNFTlNFLm1kPC9zb3VyY2U+CisgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5Pi48L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgPC9maWxlPgorICAgICAgICA8ZmlsZT4KKyAgICAgICAgICAgIDxzb3VyY2U+Li4vLi4vTElDRU5TRS5tZDwvc291cmNlPgorICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT53bHMvamVyc2V5PC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgIDwvZmlsZT4KKyAgICA8L2ZpbGVzPgorPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvZXhhbXBsZXMvc3JjL21haW4vYXNzZW1ibHkvd2xzMTIxMy1leGFtcGxlcy1hc3NlbWJseS54bWwgYi9idW5kbGVzL2V4YW1wbGVzL3NyYy9tYWluL2Fzc2VtYmx5L3dsczEyMTMtZXhhbXBsZXMtYXNzZW1ibHkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZGI3MDUKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL2V4YW1wbGVzL3NyYy9tYWluL2Fzc2VtYmx5L3dsczEyMTMtZXhhbXBsZXMtYXNzZW1ibHkueG1sCkBAIC0wLDAgKzEsNTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPGFzc2VtYmx5PgorICAgIDxpZD53bHMxMjEzPC9pZD4KKyAgICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgorICAgIDxmb3JtYXRzPgorICAgICAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgorICAgIDwvZm9ybWF0cz4KKyAgICA8ZmlsZVNldHM+CisgICAgICAgIDxmaWxlU2V0PgorICAgICAgICAgICAgPGRpcmVjdG9yeT50YXJnZXQvZGVwZW5kZW5jeS93bHMxMjEzLWV4YW1wbGVzPC9kaXJlY3Rvcnk+CisgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PndsczEyMTMvamVyc2V5L2V4YW1wbGVzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICA8IS0tIGV4Y2x1ZGUgZXhhbXBsZXMgbm90IHdvcmtpbmcgb24gV2ViTG9naWMtLT4KKyAgICAgICAgICAgIDxleGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9ib29rbWFyay8qKjwvZXhjbHVkZT4gICAgICAgICAgICAgICAgIDwhLS0gdXNlcyBwZXJzaXN0ZW5jZSBjb25maWd1cmVkIGZvciBHRiAtLT4KKyAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9odHRwcy1zZXJ2ZXItZ2xhc3NmaXNoLyoqPC9leGNsdWRlPiAgIDwhLS0gR0Ygb25seSwgbm8gdGVzdHMgdG8gcnVuIGFueXdheSAtLT4KKyAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9tYW5hZ2VkLWJlYW5zLXdlYmFwcC8qKjwvZXhjbHVkZT4gICAgIDwhLS0gdXNlcyBwZXJzaXN0ZW5jZSBjb25maWd1cmVkIGZvciBHRiAtLT4KKyAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9yeC1jbGllbnQtamF2YTgtd2ViYXBwLyoqPC9leGNsdWRlPiAgICAgICAgIDwhLS0gSmF2YTggLS0+CisgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovZGVmYXVsdC1tZXRob2QtamF2YTgtd2ViYXBwLyoqPC9leGNsdWRlPiAgICA8IS0tIEphdmE4IC0tPgorICAgICAgICAgICAgPC9leGNsdWRlcz4KKyAgICAgICAgPC9maWxlU2V0PgorICAgIDwvZmlsZVNldHM+CisgICAgPGZpbGVzPgorICAgICAgICA8ZmlsZT4KKyAgICAgICAgICAgIDxzb3VyY2U+Li4vLi4vTElDRU5TRS5tZDwvc291cmNlPgorICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4uPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgIDwvZmlsZT4KKyAgICAgICAgPGZpbGU+CisgICAgICAgICAgICA8c291cmNlPi4uLy4uL0xJQ0VOU0UubWQ8L3NvdXJjZT4KKyAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+d2xzMTIxMy9qZXJzZXk8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgPC9maWxlPgorICAgIDwvZmlsZXM+Cis8L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9qYXhycy1yaS9wb20ueG1sIGIvYnVuZGxlcy9qYXhycy1yaS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3OGYyYTcKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL2pheHJzLXJpL3BvbS54bWwKQEAgLTAsMCArMSw0NTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmJ1bmRsZXM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qYXhycy1yaTwvYXJ0aWZhY3RJZD4KKyAgICA8bmFtZT5qZXJzZXktYnVuZGxlcy1qYXhycy1yaTwvbmFtZT4KKyAgICA8cGFja2FnaW5nPmJ1bmRsZTwvcGFja2FnaW5nPgorCisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBBIGJ1bmRsZSBwcm9qZWN0IHByb2R1Y2luZyBKQVgtUlMgUkkgYnVuZGxlcy4gVGhlIHByaW1hcnkgYXJ0aWZhY3QgaXMgYW4gImFsbC1pbi1vbmUiIE9TR2ktZmllZCBKQVgtUlMgUkkgYnVuZGxlCisgICAgICAgIChqYXhycy1yaS5qYXIpLgorICAgICAgICBBdHRhY2hlZCB0byB0aGF0IGFyZSB0d28gY29tcHJlc3NlZCBKQVgtUlMgUkkgYXJjaGl2ZXMuIFRoZSBmaXJzdCBhcmNoaXZlIChqYXhycy1yaS56aXApIGNvbnNpc3RzIG9mIGJpbmFyeSBSSSBiaXRzIGFuZAorICAgICAgICBjb250YWlucyB0aGUgQVBJIGphciAodW5kZXIgImFwaSIgZGlyZWN0b3J5KSwgUkkgbGlicmFyaWVzICh1bmRlciAibGliIiBkaXJlY3RvcnkpIGFzIHdlbGwgYXMgYWxsIGV4dGVybmFsCisgICAgICAgIFJJIGRlcGVuZGVuY2llcyAodW5kZXIgImV4dCIgZGlyZWN0b3J5KS4gVGhlIHNlY29uZGFyeSBhcmNoaXZlIChqYXhycy1yaS1zcmMuemlwKSBjb250YWlucyBidWlsZGFibGUgSkFYLVJTIFJJIHNvdXJjZQorICAgICAgICBidW5kbGUgYW5kIGNvbnRhaW5zIHRoZSBBUEkgamFyICh1bmRlciAiYXBpIiBkaXJlY3RvcnkpLCBSSSBzb3VyY2VzICh1bmRlciAic3JjIiBkaXJlY3RvcnkpIGFzIHdlbGwgYXMgYWxsIGV4dGVybmFsCisgICAgICAgIFJJIGRlcGVuZGVuY2llcyAodW5kZXIgImV4dCIgZGlyZWN0b3J5KS4gVGhlIHNlY29uZCBhcmNoaXZlIGFsc28gY29udGFpbnMgImJ1aWxkLnhtbCIgQU5UIHNjcmlwdCB0aGF0IGJ1aWxkcyB0aGUgUkkKKyAgICAgICAgc291cmNlcy4gVG8gYnVpbGQgdGhlIEpBWC1SUyBSSSBzaW1wbHkgdW56aXAgdGhlIGFyY2hpdmUsIGNkIHRvIHRoZSBjcmVhdGVkIGpheHJzLXJpIGRpcmVjdG9yeSBhbmQgaW52b2tlICJhbnQiIGZyb20KKyAgICAgICAgdGhlIGNvbW1hbmQgbGluZS4KKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPCEtLSBKQVgtUlMgQVBJIFNvdXJjZXMtLT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC53cy5yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LndzLnJzLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7amF4cnMuYXBpLmltcGwudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8Y2xhc3NpZmllcj5zb3VyY2VzPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPG9wdGlvbmFsPnRydWU8L29wdGlvbmFsPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPCEtLSBKQVgtUlMgUkkgQmluYXJpZXMgLS0+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWhrMjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29tbW9uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtamF4YjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLWpzb24tYmluZGluZzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY2xpZW50PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1zZXJ2ZXI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtc3NlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPCEtLSBKQVgtUlMgUkkgU291cmNlcyAtLT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktaGsyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPGNsYXNzaWZpZXI+c291cmNlczwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgIDxvcHRpb25hbD50cnVlPC9vcHRpb25hbD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29tbW9uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPGNsYXNzaWZpZXI+c291cmNlczwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgIDxvcHRpb25hbD50cnVlPC9vcHRpb25hbD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLWpheGI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8Y2xhc3NpZmllcj5zb3VyY2VzPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPG9wdGlvbmFsPnRydWU8L29wdGlvbmFsPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jbGllbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8Y2xhc3NpZmllcj5zb3VyY2VzPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPG9wdGlvbmFsPnRydWU8L29wdGlvbmFsPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1zZXJ2ZXI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8Y2xhc3NpZmllcj5zb3VyY2VzPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPG9wdGlvbmFsPnRydWU8L29wdGlvbmFsPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldC1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPGNsYXNzaWZpZXI+c291cmNlczwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgIDxvcHRpb25hbD50cnVlPC9vcHRpb25hbD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8Y2xhc3NpZmllcj5zb3VyY2VzPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgPG9wdGlvbmFsPnRydWU8L29wdGlvbmFsPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPCEtLSBSSSBkZXBlbmRlbmNpZXMgLS0+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5oazI8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5oazItYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guaGsyPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGsyLWxvY2F0b3I8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm9zZ2k8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcub3NnaS5jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnhtbC5iaW5kPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF4Yi1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguYW5ub3RhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LmFubm90YXRpb24tYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnZhbGlkYXRpb248L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD52YWxpZGF0aW9uLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguc2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3NlcnZsZXQzLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnBlcnNpc3RlbmNlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGVyc2lzdGVuY2UtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8ZmluYWxOYW1lPmpheHJzLXJpPC9maW5hbE5hbWU+CisgICAgICAgIDxyZXNvdXJjZXM+CisgICAgICAgICAgICA8cmVzb3VyY2U+CisgICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4ke2dlbmVyYXRlZC5zcmMuZGlyfTwvZGlyZWN0b3J5PgorICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKi5qYXZhPC9leGNsdWRlPgorICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPGZpbHRlcmluZz50cnVlPC9maWx0ZXJpbmc+CisgICAgICAgICAgICA8L3Jlc291cmNlPgorICAgICAgICA8L3Jlc291cmNlcz4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c291cmNlPiR7amF2YS52ZXJzaW9ufTwvc291cmNlPgorICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PiR7amF2YS52ZXJzaW9ufTwvdGFyZ2V0PgorICAgICAgICAgICAgICAgICAgICA8Y29tcGlsZXJBcmd1bWVudHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIERvIG5vdCB3YXJuIGFib3V0IHVzaW5nIHN1bi5taXNjLlVuc2FmZSAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxYRGlnbm9yZS5zeW1ib2wuZmlsZSAvPgorICAgICAgICAgICAgICAgICAgICA8L2NvbXBpbGVyQXJndW1lbnRzPgorICAgICAgICAgICAgICAgICAgICA8c2hvd1dhcm5pbmdzPmZhbHNlPC9zaG93V2FybmluZ3M+CisgICAgICAgICAgICAgICAgICAgIDxmb3JrPmZhbHNlPC9mb3JrPgorICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5tb2R1bGUtaW5mby5qYXZhPC9leGNsdWRlPgorICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPCEtLSBwcm9kdWNpbmcgc2luZ2xlIGphciBidW5kbGUgLS0+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJ1aWxkLWhlbHBlci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+Z2VuZXJhdGUtc291cmNlczwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+YWRkLXNvdXJjZTwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNvdXJjZT4ke2dlbmVyYXRlZC5zcmMuZGlyfTwvc291cmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc291cmNlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpZD51bnBhY2s8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPmdlbmVyYXRlLXNvdXJjZXM8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnVucGFjay1kZXBlbmRlbmNpZXM8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGVHcm91cElkcz5qYXZheC53cy5ycyxvcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlLG9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnMsb3JnLmdsYXNzZmlzaC5qZXJzZXkuamF4YixvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3Q8L2luY2x1ZGVHcm91cElkcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZUNsYXNzaWZpZXJzPnNvdXJjZXM8L2luY2x1ZGVDbGFzc2lmaWVycz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7Z2VuZXJhdGVkLnNyYy5kaXJ9PC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPioqL05PVElDRS5tZDwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmZlbGl4PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWJ1bmRsZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxpbnN0cnVjdGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8QnVuZGxlLU5hbWU+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9CdW5kbGUtTmFtZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxCdW5kbGUtU3ltYm9saWNOYW1lPiR7cHJvamVjdC5ncm91cElkfS4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L0J1bmRsZS1TeW1ib2xpY05hbWU+CisgICAgICAgICAgICAgICAgICAgICAgICA8U3BlY2lmaWNhdGlvbi1WZXJzaW9uPiR7amF4cnMuYXBpLnNwZWMudmVyc2lvbn08L1NwZWNpZmljYXRpb24tVmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxJbXBsZW1lbnRhdGlvbi1WZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7cGFyc2VkVmVyc2lvbi5tYWpvclZlcnNpb259LiR7cGFyc2VkVmVyc2lvbi5taW5vclZlcnNpb259LiR7cGFyc2VkVmVyc2lvbi5xdWFsaWZpZXJ9CisgICAgICAgICAgICAgICAgICAgICAgICA8L0ltcGxlbWVudGF0aW9uLVZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8RXh0ZW5zaW9uLU5hbWU+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9FeHRlbnNpb24tTmFtZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFeHBvcnQtUGFja2FnZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC53cy5ycy4qO3ZlcnNpb249JHtqYXhycy5hcGkuaW1wbC52ZXJzaW9ufSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZ2xhc3NmaXNoLmplcnNleS4qO3ZlcnNpb249JHtwcm9qZWN0LnZlcnNpb259LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC4qO3ZlcnNpb249JHtwcm9qZWN0LnZlcnNpb259LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGplcnNleS5yZXBhY2thZ2VkLm9yZy5vYmplY3R3ZWIuYXNtLio7dmVyc2lvbj0ke3Byb2plY3QudmVyc2lvbn0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvRXhwb3J0LVBhY2thZ2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8SW1wb3J0LVBhY2thZ2U+PCFbQ0RBVEFbCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXguc2VydmxldC5hbm5vdGF0aW9uLio7cmVzb2x1dGlvbjo9b3B0aW9uYWw7dmVyc2lvbj0iWzIuNCw1LjApIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC5zZXJ2bGV0LmRlc2NyaXB0b3IuKjtyZXNvbHV0aW9uOj1vcHRpb25hbDt2ZXJzaW9uPSJbMi40LDUuMCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnNlcnZsZXQuKjt2ZXJzaW9uPSJbMi40LDUuMCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnBlcnNpc3RlbmNlLio7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgudmFsaWRhdGlvbi4qO3Jlc29sdXRpb246PW9wdGlvbmFsO3ZlcnNpb249IiR7cmFuZ2U7Wz09LDMpOyR7amF2YXgudmFsaWRhdGlvbi5hcGkudmVyc2lvbn19IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdW4ubWlzYy4qO3Jlc29sdXRpb246PW9wdGlvbmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgICAgICAgIF1dPjwvSW1wb3J0LVBhY2thZ2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8UHJpdmF0ZS1QYWNrYWdlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbAorICAgICAgICAgICAgICAgICAgICAgICAgPC9Qcml2YXRlLVBhY2thZ2U+CisgICAgICAgICAgICAgICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgorICAgICAgICAgICAgICAgICAgICA8dW5wYWNrQnVuZGxlPnRydWU8L3VucGFja0J1bmRsZT4KKyAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVEZXBlbmRlbmNpZXM+KjtzY29wZT1jb21waWxlPC9leGNsdWRlRGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc2hhZGUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjMuMS4wPC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnNoYWRlPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXJzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsdGVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0Pio6KjwvYXJ0aWZhY3Q+IDwhLS0gamVyc2V5IGFydGlmYWN0cyAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5NRVRBLUlORi9OT1RJQ0UubWQ8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbHRlcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdD4qOio8L2FydGlmYWN0PiA8IS0tIDNyZCBwYXJ0eSBhcnRpZmFjdHMgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+TUVUQS1JTkYvREVQRU5ERU5DSUVTLnR4dDwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5NRVRBLUlORi9MSUNFTlNFLm1kPC9leGNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPmphdmF4L2Fubm90YXRpb24vKio8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+amF2YXgvZGVjb3JhdG9yLyoqPC9leGNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPmphdmF4L2VsLyoqPC9leGNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPmphdmF4L2VudGVycHJpc2UvKio8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+amF2YXgvaW50ZXJjZXB0b3IvKio8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbHRlcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbHRlcnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPCEtLSBwcm9kdWNpbmcgemlwcGVkIGFyY2hpdmVzIC0tPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlkPm1ha2UtYmluYXJ5LWFyY2hpdmU8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPiR7cHJvamVjdC5iYXNlZGlyfS9zcmMvbWFpbi9hc3NlbWJseS9hc3NlbWJseS1iaW4ueG1sPC9kZXNjcmlwdG9yPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcGVuZEFzc2VtYmx5SWQ+ZmFsc2U8L2FwcGVuZEFzc2VtYmx5SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlkPm1ha2Utc291cmNlLWFyY2hpdmU8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPiR7cHJvamVjdC5iYXNlZGlyfS9zcmMvbWFpbi9hc3NlbWJseS9hc3NlbWJseS1zcmMueG1sPC9kZXNjcmlwdG9yPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVzY3JpcHRvcnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYW50cnVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpZD54Y29weTwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFza3M+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqYXIgZGVzdGZpbGU9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9LyR7YXJ0aWZhY3RJZH0uamFyIiB1cGRhdGU9InRydWUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHppcGZpbGVzZXQgZGlyPSIuLi8uLiIgaW5jbHVkZXM9Ik5PVElDRS5tZCIgcHJlZml4PSJNRVRBLUlORiIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9qYXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqYXIgZGVzdGZpbGU9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9LyR7YXJ0aWZhY3RJZH0tc291cmNlcy5qYXIiIHVwZGF0ZT0idHJ1ZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8emlwZmlsZXNldCBkaXI9Ii4uLy4uIiBpbmNsdWRlcz0iTk9USUNFLm1kIiBwcmVmaXg9Ik1FVEEtSU5GIiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2phcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rhc2tzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+bGljZW5zZWUuc3JjLmJ1bmRsZTwvaWQ+CisgICAgICAgICAgICA8YWN0aXZhdGlvbj4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgIDxuYW1lPmxpY2Vuc2UudXJsPC9uYW1lPgorICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICA8L2FjdGl2YXRpb24+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPndhZ29uLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC1iZXRhLTQ8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Z2V0LWxpY2Vuc2U8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmRvd25sb2FkLXNpbmdsZTwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dXJsPiR7bGljZW5zZS51cmx9PC91cmw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZnJvbUZpbGU+VExEQV9TQ1NMX0xpY2Vuc2Vlc19MaWNlbnNlX05vdGljZS50eHQ8L2Zyb21GaWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRvRGlyPiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2xpY2Vuc2U8L3RvRGlyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPm1ha2UtbGljZW5zZWUtc291cmNlLWFyY2hpdmU8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmluYWxOYW1lPmpheHJzLXJpLSR7cHJvamVjdC52ZXJzaW9ufS1zcmMtbGljZW5zZWU8L2ZpbmFsTmFtZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhdHRhY2g+ZmFsc2U8L2F0dGFjaD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcHBlbmRBc3NlbWJseUlkPmZhbHNlPC9hcHBlbmRBc3NlbWJseUlkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3JzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPiR7cHJvamVjdC5iYXNlZGlyfS9zcmMvbWFpbi9hc3NlbWJseS9hc3NlbWJseS1zcmMtbGljZW5zZWUueG1sPC9kZXNjcmlwdG9yPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8Z2VuZXJhdGVkLnNyYy5kaXI+JHtiYXNlZGlyfS90YXJnZXQvdW5wYWNrZWQtc3JjL21haW4vamF2YTwvZ2VuZXJhdGVkLnNyYy5kaXI+CisgICAgPC9wcm9wZXJ0aWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9qYXhycy1yaS9zcmMvbWFpbi9hc3NlbWJseS9hc3NlbWJseS1iaW4ueG1sIGIvYnVuZGxlcy9qYXhycy1yaS9zcmMvbWFpbi9hc3NlbWJseS9hc3NlbWJseS1iaW4ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlY2VkODUKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL2pheHJzLXJpL3NyYy9tYWluL2Fzc2VtYmx5L2Fzc2VtYmx5LWJpbi54bWwKQEAgLTAsMCArMSw2OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8YXNzZW1ibHk+CisgICAgPGlkPmJpbmFyaWVzPC9pZD4KKworICAgIDxmb3JtYXRzPgorICAgICAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgorICAgICAgICA8Zm9ybWF0PnRhci5nejwvZm9ybWF0PgorICAgICAgICA8Zm9ybWF0PnRhci5iejI8L2Zvcm1hdD4KKyAgICA8L2Zvcm1hdHM+CisKKyAgICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgorCisgICAgPGNvbXBvbmVudERlc2NyaXB0b3JzPgorICAgICAgICA8Y29tcG9uZW50RGVzY3JpcHRvcj4ke3Byb2plY3QuYmFzZWRpcn0vc3JjL21haW4vYXNzZW1ibHkvY29tbW9uLWRlcGVuZGVuY2llcy54bWw8L2NvbXBvbmVudERlc2NyaXB0b3I+CisgICAgPC9jb21wb25lbnREZXNjcmlwdG9ycz4KKworICAgIDxkZXBlbmRlbmN5U2V0cz4KKyAgICAgICAgPCEtLSBKQVgtUlMgQVBJIC0tPgorICAgICAgICA8ZGVwZW5kZW5jeVNldD4KKyAgICAgICAgICAgIDx1c2VQcm9qZWN0QXJ0aWZhY3Q+ZmFsc2U8L3VzZVByb2plY3RBcnRpZmFjdD4KKyAgICAgICAgICAgIDx1c2VUcmFuc2l0aXZlRGVwZW5kZW5jaWVzPnRydWU8L3VzZVRyYW5zaXRpdmVEZXBlbmRlbmNpZXM+CisgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PmpheHJzLXJpL2FwaTwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgPGRpcmVjdG9yeU1vZGU+MDc1NTwvZGlyZWN0b3J5TW9kZT4KKyAgICAgICAgICAgIDxmaWxlTW9kZT4wNjQ0PC9maWxlTW9kZT4KKyAgICAgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZT5qYXZheC53cy5yczoqPC9pbmNsdWRlPgorICAgICAgICAgICAgPC9pbmNsdWRlcz4KKyAgICAgICAgICAgIDxleGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8ZXhjbHVkZT5qYXZheC53cy5yczoqOio6c291cmNlczoqPC9leGNsdWRlPgorICAgICAgICAgICAgPC9leGNsdWRlcz4KKyAgICAgICAgPC9kZXBlbmRlbmN5U2V0PgorICAgICAgICA8IS0tIEpBWC1SUyBSSSBCaW5hcmllcy0tPgorICAgICAgICA8ZGVwZW5kZW5jeVNldD4KKyAgICAgICAgICAgIDxvdXRwdXRGaWxlTmFtZU1hcHBpbmc+JHthcnRpZmFjdC5hcnRpZmFjdElkfS4ke2FydGlmYWN0LmV4dGVuc2lvbn08L291dHB1dEZpbGVOYW1lTWFwcGluZz4KKyAgICAgICAgICAgIDx1c2VQcm9qZWN0QXJ0aWZhY3Q+ZmFsc2U8L3VzZVByb2plY3RBcnRpZmFjdD4KKyAgICAgICAgICAgIDx1c2VUcmFuc2l0aXZlRGVwZW5kZW5jaWVzPmZhbHNlPC91c2VUcmFuc2l0aXZlRGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT5qYXhycy1yaS9saWI8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgIDxkaXJlY3RvcnlNb2RlPjA3NTU8L2RpcmVjdG9yeU1vZGU+CisgICAgICAgICAgICA8ZmlsZU1vZGU+MDY0NDwvZmlsZU1vZGU+CisgICAgICAgICAgICA8aW5jbHVkZXM+CisgICAgICAgICAgICAgICAgPGluY2x1ZGU+b3JnLmdsYXNzZmlzaC5qZXJzZXkuKjwvaW5jbHVkZT4KKyAgICAgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgICAgICA8ZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+Kjpzb3VyY2VzOio8L2V4Y2x1ZGU+CisgICAgICAgICAgICA8L2V4Y2x1ZGVzPgorICAgICAgICA8L2RlcGVuZGVuY3lTZXQ+CisgICAgPC9kZXBlbmRlbmN5U2V0cz4KKworICAgIDwhLS0gVE9ETyBhcGlkb2NzPyAtLT4KKzwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9idW5kbGVzL2pheHJzLXJpL3NyYy9tYWluL2Fzc2VtYmx5L2Fzc2VtYmx5LXNyYy1saWNlbnNlZS54bWwgYi9idW5kbGVzL2pheHJzLXJpL3NyYy9tYWluL2Fzc2VtYmx5L2Fzc2VtYmx5LXNyYy1saWNlbnNlZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM1YjUzYwotLS0gL2Rldi9udWxsCisrKyBiL2J1bmRsZXMvamF4cnMtcmkvc3JjL21haW4vYXNzZW1ibHkvYXNzZW1ibHktc3JjLWxpY2Vuc2VlLnhtbApAQCAtMCwwICsxLDcxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxhc3NlbWJseT4KKyAgICA8aWQ+c3JjPC9pZD4KKworICAgIDxmb3JtYXRzPgorICAgICAgICA8Zm9ybWF0PnppcDwvZm9ybWF0PgorICAgICAgICA8Zm9ybWF0PnRhci5nejwvZm9ybWF0PgorICAgICAgICA8Zm9ybWF0PnRhci5iejI8L2Zvcm1hdD4KKyAgICA8L2Zvcm1hdHM+CisKKyAgICA8aW5jbHVkZUJhc2VEaXJlY3Rvcnk+ZmFsc2U8L2luY2x1ZGVCYXNlRGlyZWN0b3J5PgorCisgICAgPGNvbXBvbmVudERlc2NyaXB0b3JzPgorICAgICAgICA8Y29tcG9uZW50RGVzY3JpcHRvcj4ke3Byb2plY3QuYmFzZWRpcn0vc3JjL21haW4vYXNzZW1ibHkvY29tbW9uLWRlcGVuZGVuY2llcy54bWw8L2NvbXBvbmVudERlc2NyaXB0b3I+CisgICAgPC9jb21wb25lbnREZXNjcmlwdG9ycz4KKworICAgIDxkZXBlbmRlbmN5U2V0cz4KKyAgICAgICAgPCEtLSBKQVgtUlMgUkkgU291cmNlcyAtLT4KKyAgICAgICAgPGRlcGVuZGVuY3lTZXQ+CisgICAgICAgICAgICA8dXNlUHJvamVjdEFydGlmYWN0PmZhbHNlPC91c2VQcm9qZWN0QXJ0aWZhY3Q+CisgICAgICAgICAgICA8dXNlVHJhbnNpdGl2ZURlcGVuZGVuY2llcz5mYWxzZTwvdXNlVHJhbnNpdGl2ZURlcGVuZGVuY2llcz4KKyAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+amF4cnMtcmkvc3JjPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICA8ZGlyZWN0b3J5TW9kZT4wNzU1PC9kaXJlY3RvcnlNb2RlPgorICAgICAgICAgICAgPGZpbGVNb2RlPjA2NDQ8L2ZpbGVNb2RlPgorICAgICAgICAgICAgPHVucGFjaz50cnVlPC91bnBhY2s+CisgICAgICAgICAgICA8dW5wYWNrT3B0aW9ucz4KKyAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPk1FVEEtSU5GL01BTklGRVNULk1GPC9leGNsdWRlPgorICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5NRVRBLUlORi9OT1RJQ0UubWQ8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KKyAgICAgICAgICAgIDwvdW5wYWNrT3B0aW9ucz4KKyAgICAgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZT5qYXZheC53cy5yczoqOio6c291cmNlczoqPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlPm9yZy5nbGFzc2Zpc2guamVyc2V5Lio6KjoqOnNvdXJjZXM6KjwvaW5jbHVkZT4KKyAgICAgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgIDwvZGVwZW5kZW5jeVNldD4KKyAgICA8L2RlcGVuZGVuY3lTZXRzPgorCisgICAgPGZpbGVTZXRzPgorICAgICAgICA8ZmlsZVNldD4KKyAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vbGljZW5zZTwvZGlyZWN0b3J5PgorICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT5qYXhycy1yaTwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICA8L2ZpbGVTZXQ+CisgICAgICAgIDxmaWxlU2V0PgorICAgICAgICAgICAgPGRpcmVjdG9yeT4ke3Byb2plY3QuYmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+CisgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PmpheHJzLXJpPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgIDwvZmlsZVNldD4KKyAgICAgICAgPGZpbGVTZXQ+CisgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2RlcGVuZGVuY3kvTUVUQS1JTkYvc2VydmljZXM8L2RpcmVjdG9yeT4KKyAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+amF4cnMtcmkvc3JjL01FVEEtSU5GL3NlcnZpY2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgIDwvZmlsZVNldD4KKyAgICA8L2ZpbGVTZXRzPgorPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvamF4cnMtcmkvc3JjL21haW4vYXNzZW1ibHkvYXNzZW1ibHktc3JjLnhtbCBiL2J1bmRsZXMvamF4cnMtcmkvc3JjL21haW4vYXNzZW1ibHkvYXNzZW1ibHktc3JjLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2QwMDM1Ci0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9qYXhycy1yaS9zcmMvbWFpbi9hc3NlbWJseS9hc3NlbWJseS1zcmMueG1sCkBAIC0wLDAgKzEsNjcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPGFzc2VtYmx5PgorICAgIDxpZD5zcmM8L2lkPgorCisgICAgPGZvcm1hdHM+CisgICAgICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+CisgICAgICAgIDxmb3JtYXQ+dGFyLmd6PC9mb3JtYXQ+CisgICAgICAgIDxmb3JtYXQ+dGFyLmJ6MjwvZm9ybWF0PgorICAgIDwvZm9ybWF0cz4KKworICAgIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+CisKKyAgICA8Y29tcG9uZW50RGVzY3JpcHRvcnM+CisgICAgICAgIDxjb21wb25lbnREZXNjcmlwdG9yPiR7cHJvamVjdC5iYXNlZGlyfS9zcmMvbWFpbi9hc3NlbWJseS9jb21tb24tZGVwZW5kZW5jaWVzLnhtbDwvY29tcG9uZW50RGVzY3JpcHRvcj4KKyAgICA8L2NvbXBvbmVudERlc2NyaXB0b3JzPgorCisgICAgPGRlcGVuZGVuY3lTZXRzPgorICAgICAgICA8IS0tIEpBWC1SUyBSSSBTb3VyY2VzIC0tPgorICAgICAgICA8ZGVwZW5kZW5jeVNldD4KKyAgICAgICAgICAgIDx1c2VQcm9qZWN0QXJ0aWZhY3Q+ZmFsc2U8L3VzZVByb2plY3RBcnRpZmFjdD4KKyAgICAgICAgICAgIDx1c2VUcmFuc2l0aXZlRGVwZW5kZW5jaWVzPmZhbHNlPC91c2VUcmFuc2l0aXZlRGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT5qYXhycy1yaS9zcmM8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgIDxkaXJlY3RvcnlNb2RlPjA3NTU8L2RpcmVjdG9yeU1vZGU+CisgICAgICAgICAgICA8ZmlsZU1vZGU+MDY0NDwvZmlsZU1vZGU+CisgICAgICAgICAgICA8dW5wYWNrPnRydWU8L3VucGFjaz4KKyAgICAgICAgICAgIDx1bnBhY2tPcHRpb25zPgorICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+TUVUQS1JTkYvTUFOSUZFU1QuTUY8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPk1FVEEtSU5GL05PVElDRS5tZDwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgPC91bnBhY2tPcHRpb25zPgorICAgICAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgICAgICAgIDxpbmNsdWRlPmphdmF4LndzLnJzOio6Kjpzb3VyY2VzOio8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgPGluY2x1ZGU+b3JnLmdsYXNzZmlzaC5qZXJzZXkuKjoqOio6c291cmNlczoqPC9pbmNsdWRlPgorICAgICAgICAgICAgPC9pbmNsdWRlcz4KKyAgICAgICAgPC9kZXBlbmRlbmN5U2V0PgorICAgIDwvZGVwZW5kZW5jeVNldHM+CisKKyAgICA8ZmlsZVNldHM+CisgICAgICAgIDxmaWxlU2V0PgorICAgICAgICAgICAgPGRpcmVjdG9yeT4ke3Byb2plY3QuYmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+CisgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PmpheHJzLXJpPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgIDwvZmlsZVNldD4KKyAgICAgICAgPGZpbGVTZXQ+CisgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2RlcGVuZGVuY3kvTUVUQS1JTkYvc2VydmljZXM8L2RpcmVjdG9yeT4KKyAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+amF4cnMtcmkvc3JjL01FVEEtSU5GL3NlcnZpY2VzPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgIDwvZmlsZVNldD4KKyAgICA8L2ZpbGVTZXRzPgorPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvamF4cnMtcmkvc3JjL21haW4vYXNzZW1ibHkvY29tbW9uLWRlcGVuZGVuY2llcy54bWwgYi9idW5kbGVzL2pheHJzLXJpL3NyYy9tYWluL2Fzc2VtYmx5L2NvbW1vbi1kZXBlbmRlbmNpZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZTMyZTQKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL2pheHJzLXJpL3NyYy9tYWluL2Fzc2VtYmx5L2NvbW1vbi1kZXBlbmRlbmNpZXMueG1sCkBAIC0wLDAgKzEsNjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPGNvbXBvbmVudD4KKyAgICA8ZGVwZW5kZW5jeVNldHM+CisgICAgICAgIDwhLS0gSkFYLVJTIFJJIHJ1bnRpbWUtc2NvcGVkIGRlcGVuZGVuY2llcyAtLT4KKyAgICAgICAgPGRlcGVuZGVuY3lTZXQ+CisgICAgICAgICAgICA8dXNlUHJvamVjdEFydGlmYWN0PmZhbHNlPC91c2VQcm9qZWN0QXJ0aWZhY3Q+CisgICAgICAgICAgICA8dXNlVHJhbnNpdGl2ZURlcGVuZGVuY2llcz50cnVlPC91c2VUcmFuc2l0aXZlRGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT5qYXhycy1yaS9leHQ8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgIDxkaXJlY3RvcnlNb2RlPjA3NTU8L2RpcmVjdG9yeU1vZGU+CisgICAgICAgICAgICA8ZmlsZU1vZGU+MDY0NDwvZmlsZU1vZGU+CisgICAgICAgICAgICA8ZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+amF2YXgud3MucnM6KjwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICA8ZXhjbHVkZT5vcmcuZ2xhc3NmaXNoLmplcnNleS4qOio8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgPCEtLSBDREkgQVBJIGRlcGVuZGVuY2llcyBjb21lIGZyb20geWFzc29uLCBjZGkgaXMgb3B0aW9uYWwgdGhlcmUgLS0+CisgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+amF2YXguZW50ZXJwcmlzZTpjZGktYXBpOmphcjoqPC9leGNsdWRlPgorICAgICAgICAgICAgICAgIDxleGNsdWRlPmphdmF4LmVsOmVsLWFwaTpqYXI6KjwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICA8ZXhjbHVkZT5vcmcuamJvc3Muc3BlYy5qYXZheC5pbnRlcmNlcHRvcjpqYm9zcy1pbnRlcmNlcHRvcnMtYXBpXzEuMV9zcGVjOmphcjoqPC9leGNsdWRlPgorICAgICAgICAgICAgICAgIDxleGNsdWRlPmphdmF4LmFubm90YXRpb246anNyMjUwLWFwaTpqYXI6KjwvZXhjbHVkZT4KKyAgICAgICAgICAgIDwvZXhjbHVkZXM+CisgICAgICAgIDwvZGVwZW5kZW5jeVNldD4KKyAgICAgICAgPCEtLSBKQVgtUlMgUkkgcHJvdmlkZWQgZGVwZW5kZW5jaWVzIC0tPgorICAgICAgICA8ZGVwZW5kZW5jeVNldD4KKyAgICAgICAgICAgIDx1c2VQcm9qZWN0QXJ0aWZhY3Q+ZmFsc2U8L3VzZVByb2plY3RBcnRpZmFjdD4KKyAgICAgICAgICAgIDx1c2VUcmFuc2l0aXZlRGVwZW5kZW5jaWVzPnRydWU8L3VzZVRyYW5zaXRpdmVEZXBlbmRlbmNpZXM+CisgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PmpheHJzLXJpL2V4dDwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgPGRpcmVjdG9yeU1vZGU+MDc1NTwvZGlyZWN0b3J5TW9kZT4KKyAgICAgICAgICAgIDxmaWxlTW9kZT4wNjQ0PC9maWxlTW9kZT4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeVNldD4KKyAgICA8L2RlcGVuZGVuY3lTZXRzPgorICAgIDxmaWxlcz4KKyAgICAgICAgPGZpbGU+CisgICAgICAgICAgICA8c291cmNlPi4uLy4uL0xJQ0VOU0UubWQ8L3NvdXJjZT4KKyAgICAgICAgICAgIDxkZXN0TmFtZT5KZXJzZXktTElDRU5TRS5tZDwvZGVzdE5hbWU+CisgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PmpheHJzLXJpPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgIDwvZmlsZT4KKyAgICAgICAgPGZpbGU+CisgICAgICAgICAgICA8c291cmNlPi4uLy4uL3RoaXJkLXBhcnR5LWxpY2Vuc2UtcmVhZG1lLnR4dDwvc291cmNlPgorICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT5qYXhycy1yaTwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICA8L2ZpbGU+CisgICAgICAgIDxmaWxlPgorICAgICAgICAgICAgPHNvdXJjZT4uLi8uLi9OT1RJQ0UubWQ8L3NvdXJjZT4KKyAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+amF4cnMtcmk8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgPC9maWxlPgorICAgIDwvZmlsZXM+Cis8L2NvbXBvbmVudD4KZGlmZiAtLWdpdCBhL2J1bmRsZXMvamF4cnMtcmkvc3JjL21haW4vcmVzb3VyY2VzL2J1aWxkLnhtbCBiL2J1bmRsZXMvamF4cnMtcmkvc3JjL21haW4vcmVzb3VyY2VzL2J1aWxkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjJmYmRmCi0tLSAvZGV2L251bGwKKysrIGIvYnVuZGxlcy9qYXhycy1yaS9zcmMvbWFpbi9yZXNvdXJjZXMvYnVpbGQueG1sCkBAIC0wLDAgKzEsMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzwhLS0gKioqKioqKioqKioqKioqKioqKioqKiogSkFYLVJTIFJJIGJ1aWxkIGZpbGUgKioqKioqKioqKioqKioqKioqKioqKioqKiAtLT4KKzxwcm9qZWN0IG5hbWU9ImpheC1ycy1yaSIgZGVmYXVsdD0iYnVpbGQiPgorICA8dGFyZ2V0IG5hbWU9ImJ1aWxkIj4KKyAgICA8IS0tIGNvbXBpbGUgLS0+CisgICAgPG1rZGlyIGRpcj0iYnVpbGQiLz4KKyAgICA8amF2YWMgc3JjZGlyPSJzcmMiIGRlc3RkaXI9ImJ1aWxkIj4KKyAgICAgIDxjbGFzc3BhdGg+CisgICAgICAgIDxmaWxlc2V0IGRpcj0iZXh0IiBpbmNsdWRlcz0iKiovKi5qYXIiLz4KKyAgICAgIDwvY2xhc3NwYXRoPgorICAgIDwvamF2YWM+CisgIDwvdGFyZ2V0PgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvYnVuZGxlcy9wb20ueG1sIGIvYnVuZGxlcy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNGYwZDQKLS0tIC9kZXYvbnVsbAorKysgYi9idW5kbGVzL3BvbS54bWwKQEAgLTAsMCArMSw1NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKworICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuYnVuZGxlczwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LWJ1bmRsZXM8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+SmVyc2V5IGJ1bmRsZXMgcHJvdmlkZXJzIHVtYnJlbGxhIHByb2plY3QgbW9kdWxlLjwvZGVzY3JpcHRpb24+CisKKyAgICA8bW9kdWxlcz4KKyAgICAgICAgPG1vZHVsZT5qYXhycy1yaTwvbW9kdWxlPgorICAgIDwvbW9kdWxlcz4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+cmVsZWFzZTwvaWQ+CisgICAgICAgICAgICA8YWN0aXZhdGlvbj4KKyAgICAgICAgICAgICAgICA8YWN0aXZlQnlEZWZhdWx0PmZhbHNlPC9hY3RpdmVCeURlZmF1bHQ+CisgICAgICAgICAgICA8L2FjdGl2YXRpb24+CisgICAgICAgICAgICA8bW9kdWxlcz4KKyAgICAgICAgICAgICAgICA8bW9kdWxlPmFwaWRvY3M8L21vZHVsZT4KKyAgICAgICAgICAgICAgICA8bW9kdWxlPmV4YW1wbGVzPC9tb2R1bGU+CisgICAgICAgICAgICA8L21vZHVsZXM+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICA8L3Byb2ZpbGVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2FwYWNoZS1jb25uZWN0b3IvcG9tLnhtbCBiL2Nvbm5lY3RvcnMvYXBhY2hlLWNvbm5lY3Rvci9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYzFlY2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL2FwYWNoZS1jb25uZWN0b3IvcG9tLnhtbApAQCAtMCwwICsxLDg5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb25uZWN0b3JzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LWFwYWNoZS1jb25uZWN0b3I8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktY29ubmVjdG9ycy1hcGFjaGU8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+SmVyc2V5IENsaWVudCBUcmFuc3BvcnQgdmlhIEFwYWNoZTwvZGVzY3JpcHRpb24+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPHByb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+VVRGLTg8L3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+CisgICAgPC9wcm9wZXJ0aWVzPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+aHR0cGNsaWVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItZ3JpenpseTItaHR0cDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWdyaXp6bHkyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5ndWF2YTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmd1YXZhPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLmlzdGFjazwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1pc3RhY2stY29tbW9ucy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YnVpbGQtaGVscGVyLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZmVsaXg8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYnVuZGxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9hcGFjaGUtY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvYXBhY2hlL2Nvbm5lY3Rvci9BcGFjaGVDbGllbnRQcm9wZXJ0aWVzLmphdmEgYi9jb25uZWN0b3JzL2FwYWNoZS1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9hcGFjaGUvY29ubmVjdG9yL0FwYWNoZUNsaWVudFByb3BlcnRpZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Zjg3NjI3Ci0tLSAvZGV2L251bGwKKysrIGIvY29ubmVjdG9ycy9hcGFjaGUtY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvYXBhY2hlL2Nvbm5lY3Rvci9BcGFjaGVDbGllbnRQcm9wZXJ0aWVzLmphdmEKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuYXBhY2hlLmNvbm5lY3RvcjsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlByb3BlcnRpZXNDbGFzczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlByb3BlcnRpZXNIZWxwZXI7CisKKy8qKgorICogQ29uZmlndXJhdGlvbiBvcHRpb25zIHNwZWNpZmljIHRvIHRoZSBDbGllbnQgQVBJIHRoYXQgdXRpbGl6ZXMge0BsaW5rIEFwYWNoZUNvbm5lY3RvclByb3ZpZGVyfS4KKyAqCisgKiBAYXV0aG9yIGpvcmdlbHVpc3dAbWFjLmNvbQorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgQXJ1bCBEaGVzaWFzZWVsYW4gKGFydWxkIGF0IGFjbS5vcmcpCisgKi8KK0BQcm9wZXJ0aWVzQ2xhc3MKK3B1YmxpYyBmaW5hbCBjbGFzcyBBcGFjaGVDbGllbnRQcm9wZXJ0aWVzIHsKKworICAgIC8qKgorICAgICAqIFRoZSBjcmVkZW50aWFsIHByb3ZpZGVyIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gcmV0cmlldmUKKyAgICAgKiBjcmVkZW50aWFscyBmcm9tIGEgdXNlci4gQ3JlZGVudGlhbHMgbmVlZGVkIGZvciBwcm94eSBhdXRoZW50aWNhdGlvbgorICAgICAqIGFyZSBzdG9yZWQgaGVyZSBhcyB3ZWxsLgorICAgICAqIDxwLz4KKyAgICAgKiBUaGUgdmFsdWUgTVVTVCBiZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5DcmVkZW50aWFsc1Byb3ZpZGVyfS4KKyAgICAgKiA8cC8+CisgICAgICogSWYgdGhlIHByb3BlcnR5IGlzIGFic2VudCBhIGRlZmF1bHQgcHJvdmlkZXIgd2lsbCBiZSB1c2VkLgorICAgICAqIDxwLz4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDUkVERU5USUFMU19QUk9WSURFUiA9ICJqZXJzZXkuY29uZmlnLmFwYWNoZS5jbGllbnQuY3JlZGVudGlhbHNQcm92aWRlciI7CisKKyAgICAvKioKKyAgICAgKiBBIHZhbHVlIG9mIHtAY29kZSBmYWxzZX0gaW5kaWNhdGVzIHRoZSBjbGllbnQgc2hvdWxkIGhhbmRsZSBjb29raWVzCisgICAgICogYXV0b21hdGljYWxseSB1c2luZyBIdHRwQ2xpZW50J3MgZGVmYXVsdCBjb29raWUgcG9saWN5LiBBIHZhbHVlCisgICAgICogb2Yge0Bjb2RlIHRydWV9IHdpbGwgY2F1c2UgdGhlIGNsaWVudCB0byBpZ25vcmUgYWxsIGNvb2tpZXMuCisgICAgICogPHAvPgorICAgICAqIFRoZSB2YWx1ZSBNVVNUIGJlIGFuIGluc3RhbmNlIG9mIHtAbGluayBqYXZhLmxhbmcuQm9vbGVhbn0uCisgICAgICogPHAvPgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHtAY29kZSBmYWxzZX0uCisgICAgICogPHAvPgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDx0dD57QHZhbHVlfTwvdHQ+LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVfQ09PS0lFUyA9ICJqZXJzZXkuY29uZmlnLmFwYWNoZS5jbGllbnQuaGFuZGxlQ29va2llcyI7CisKKyAgICAvKioKKyAgICAgKiBBIHZhbHVlIG9mIHtAY29kZSB0cnVlfSBpbmRpY2F0ZXMgdGhhdCBhIGNsaWVudCBzaG91bGQgc2VuZCBhbgorICAgICAqIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3QgZXZlbiBiZWZvcmUgdGhlIHNlcnZlciBnaXZlcyBhIDQwMQorICAgICAqIHJlc3BvbnNlLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgcHJvcGVydHkgbWF5IG9ubHkgYmUgc2V0IHByaW9yIHRvIGNvbnN0cnVjdGluZyBBcGFjaGUgY29ubmVjdG9yIHVzaW5nIHtAbGluayBBcGFjaGVDb25uZWN0b3JQcm92aWRlcn0uCisgICAgICogPHAvPgorICAgICAqIFRoZSB2YWx1ZSBNVVNUIGJlIGFuIGluc3RhbmNlIG9mIHtAbGluayBqYXZhLmxhbmcuQm9vbGVhbn0uCisgICAgICogPHAvPgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHtAY29kZSBmYWxzZX0uCisgICAgICogPHAvPgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDx0dD57QHZhbHVlfTwvdHQ+LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBSRUVNUFRJVkVfQkFTSUNfQVVUSEVOVElDQVRJT04gPSAiamVyc2V5LmNvbmZpZy5hcGFjaGUuY2xpZW50LnByZWVtcHRpdmVCYXNpY0F1dGhlbnRpY2F0aW9uIjsKKworICAgIC8qKgorICAgICAqIENvbm5lY3Rpb24gTWFuYWdlciB3aGljaCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHtAbGluayBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lkh0dHBDbGllbnR9LgorICAgICAqIDxwLz4KKyAgICAgKiBUaGUgdmFsdWUgTVVTVCBiZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgb3JnLmFwYWNoZS5odHRwLmNvbm4uSHR0cENsaWVudENvbm5lY3Rpb25NYW5hZ2VyfS4KKyAgICAgKiA8cC8+CisgICAgICogSWYgdGhlIHByb3BlcnR5IGlzIGFic2VudCBhIGRlZmF1bHQgQ29ubmVjdGlvbiBNYW5hZ2VyIHdpbGwgYmUgdXNlZAorICAgICAqICh7QGxpbmsgb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubi5CYXNpY0h0dHBDbGllbnRDb25uZWN0aW9uTWFuYWdlcn0pLgorICAgICAqIElmIHlvdSB3YW50IHRvIHVzZSB0aGlzIGNsaWVudCBpbiBtdWx0aS10aHJlYWRlZCBlbnZpcm9ubWVudCwgYmUgc3VyZSB5b3Ugb3ZlcnJpZGUgZGVmYXVsdCB2YWx1ZSB3aXRoCisgICAgICoge0BsaW5rIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvbm4uUG9vbGluZ0h0dHBDbGllbnRDb25uZWN0aW9uTWFuYWdlcn0gaW5zdGFuY2UuCisgICAgICogPHAvPgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDx0dD57QHZhbHVlfTwvdHQ+LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTk5FQ1RJT05fTUFOQUdFUiA9ICJqZXJzZXkuY29uZmlnLmFwYWNoZS5jbGllbnQuY29ubmVjdGlvbk1hbmFnZXIiOworCisgICAgLyoqCisgICAgICogQSB2YWx1ZSBvZiB7QGNvZGUgdHJ1ZX0gaW5kaWNhdGVzIHRoYXQgY29uZmlndXJlZCBjb25uZWN0aW9uIG1hbmFnZXIgc2hvdWxkIGJlIHNoYXJlZAorICAgICAqIGFtb25nIG11bHRpcGxlIEplcnNleSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFJ1bnRpbWV9IGluc3RhbmNlcy4gSXQgbWVhbnMgdGhhdCBjbG9zaW5nCisgICAgICogYSBwYXJ0aWN1bGFyIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UnVudGltZX0gaW5zdGFuY2UgZG9lcyBub3Qgc2h1dCBkb3duIHRoZSB1bmRlcmx5aW5nCisgICAgICogY29ubmVjdGlvbiBtYW5hZ2VyIGF1dG9tYXRpY2FsbHkuIEluIHN1Y2ggY2FzZSwgdGhlIGNvbm5lY3Rpb24gbWFuYWdlciBsaWZlLWN5Y2xlCisgICAgICogc2hvdWxkIGJlIGZ1bGx5IG1hbmFnZWQgYnkgdGhlIGFwcGxpY2F0aW9uIGNvZGUuIFRvIHJlbGVhc2UgYWxsIGFsbG9jYXRlZCByZXNvdXJjZXMsCisgICAgICogY2FsbGVyIGNvZGUgc2hvdWxkIGVzcGVjaWFsbHkgZW5zdXJlIHtAbGluayBvcmcuYXBhY2hlLmh0dHAuY29ubi5IdHRwQ2xpZW50Q29ubmVjdGlvbk1hbmFnZXIjc2h1dGRvd24oKX0gZ2V0cworICAgICAqIGludm9rZWQgZXZlbnR1YWxseS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIHByb3BlcnR5IG1heSBvbmx5IGJlIHNldCBwcmlvciB0byBjb25zdHJ1Y3RpbmcgQXBhY2hlIGNvbm5lY3RvciB1c2luZyB7QGxpbmsgQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXJ9LgorICAgICAqIDxwLz4KKyAgICAgKiBUaGUgdmFsdWUgTVVTVCBiZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgamF2YS5sYW5nLkJvb2xlYW59LgorICAgICAqIDxwLz4KKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB7QGNvZGUgZmFsc2V9LgorICAgICAqIDxwLz4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKgorICAgICAqIEBzaW5jZSAyLjE4CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVElPTl9NQU5BR0VSX1NIQVJFRCA9ICJqZXJzZXkuY29uZmlnLmFwYWNoZS5jbGllbnQuY29ubmVjdGlvbk1hbmFnZXJTaGFyZWQiOworCisgICAgLyoqCisgICAgICogUmVxdWVzdCBjb25maWd1cmF0aW9uIGZvciB0aGUge0BsaW5rIG9yZy5hcGFjaGUuaHR0cC5jbGllbnQuSHR0cENsaWVudH0uCisgICAgICogSHR0cCBwYXJhbWV0ZXJzIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUge0BsaW5rIG9yZy5hcGFjaGUuaHR0cC5jbGllbnQuSHR0cENsaWVudH0uCisgICAgICogPHAvPgorICAgICAqIFRoZSB2YWx1ZSBNVVNUIGJlIGFuIGluc3RhbmNlIG9mIHtAbGluayBvcmcuYXBhY2hlLmh0dHAuY2xpZW50LmNvbmZpZy5SZXF1ZXN0Q29uZmlnfS4KKyAgICAgKiA8cC8+CisgICAgICogSWYgdGhlIHByb3BlcnR5IGlzIGFic2VudCBkZWZhdWx0IHJlcXVlc3QgY29uZmlndXJhdGlvbiB3aWxsIGJlIHVzZWQuCisgICAgICogPHAvPgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDx0dD57QHZhbHVlfTwvdHQ+LgorICAgICAqCisgICAgICogQHNpbmNlIDIuNQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVFU1RfQ09ORklHID0gImplcnNleS5jb25maWcuYXBhY2hlLmNsaWVudC5yZXF1ZXN0Q29uZmlnIjsKKworICAgIC8qKgorICAgICAqIEh0dHBSZXF1ZXN0UmV0cnlIYW5kbGVyIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUge0BsaW5rIG9yZy5hcGFjaGUuaHR0cC5jbGllbnQuSHR0cENsaWVudH0uCisgICAgICogPHAvPgorICAgICAqIFRoZSB2YWx1ZSBNVVNUIGJlIGFuIGluc3RhbmNlIG9mIHtAbGluayBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lkh0dHBSZXF1ZXN0UmV0cnlIYW5kbGVyfS4KKyAgICAgKiA8cC8+CisgICAgICogSWYgdGhlIHByb3BlcnR5IGlzIGFic2VudCBhIGRlZmF1bHQgcmV0cnkgaGFuZGxlciB3aWxsIGJlIHVzZWQKKyAgICAgKiAoe0BsaW5rIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudC5EZWZhdWx0SHR0cFJlcXVlc3RSZXRyeUhhbmRsZXJ9KS4KKyAgICAgKiA8cC8+CisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaXMgPHR0PntAdmFsdWV9PC90dD4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVUUllfSEFORExFUiA9ICJqZXJzZXkuY29uZmlnLmFwYWNoZS5jbGllbnQucmV0cnlIYW5kbGVyIjsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIElmIHRoZSBwcm9wZXJ0eSBpcyBub3Qgc2V0IG9yIHRoZSBhY3R1YWwgcHJvcGVydHkgdmFsdWUgdHlwZSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgdHlwZSwgdGhlIG1ldGhvZCB3aWxsCisgICAgICogcmV0dXJuIHtAY29kZSBudWxsfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzICAgIE1hcCBvZiBwcm9wZXJ0aWVzIHRvIGdldCB0aGUgcHJvcGVydHkgdmFsdWUgZnJvbS4KKyAgICAgKiBAcGFyYW0ga2V5ICAgICAgICAgICBOYW1lIG9mIHRoZSBwcm9wZXJ0eS4KKyAgICAgKiBAcGFyYW0gdHlwZSAgICAgICAgICBUeXBlIHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBhcy4KKyAgICAgKiBAcGFyYW0gPFQ+ICAgICAgICAgICBUeXBlIG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIFZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBvciB7QGNvZGUgbnVsbH0uCisgICAgICoKKyAgICAgKiBAc2luY2UgMi44CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8VD4gVCBnZXRWYWx1ZShmaW5hbCBNYXA8U3RyaW5nLCA/PiBwcm9wZXJ0aWVzLCBmaW5hbCBTdHJpbmcga2V5LCBmaW5hbCBDbGFzczxUPiB0eXBlKSB7CisgICAgICAgIHJldHVybiBQcm9wZXJ0aWVzSGVscGVyLmdldFZhbHVlKHByb3BlcnRpZXMsIGtleSwgdHlwZSwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJldmVudHMgaW5zdGFudGlhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIEFwYWNoZUNsaWVudFByb3BlcnRpZXMoKSB7CisgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiTm8gaW5zdGFuY2VzIGFsbG93ZWQuIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9hcGFjaGUtY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvYXBhY2hlL2Nvbm5lY3Rvci9BcGFjaGVDb25uZWN0b3IuamF2YSBiL2Nvbm5lY3RvcnMvYXBhY2hlLWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2FwYWNoZS9jb25uZWN0b3IvQXBhY2hlQ29ubmVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU4NzRkYwotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvYXBhY2hlLWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2FwYWNoZS9jb25uZWN0b3IvQXBhY2hlQ29ubmVjdG9yLmphdmEKQEAgLTAsMCArMSw2NzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuYXBhY2hlLmNvbm5lY3RvcjsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOworaW1wb3J0IGphdmEuaW8uRmlsdGVySW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29tcGxldGFibGVGdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNMb25nOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC5uZXQuc3NsLkhvc3RuYW1lVmVyaWZpZXI7CitpbXBvcnQgamF2YXgubmV0LnNzbC5TU0xDb250ZXh0OworaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMU29ja2V0RmFjdG9yeTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuUmVxdWVzdEVudGl0eVByb2Nlc3Npbmc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnNwaS5Bc3luY0Nvbm5lY3RvckNhbGxiYWNrOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5zcGkuQ29ubmVjdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUHJvcGVydGllc0hlbHBlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkhlYWRlclV0aWxzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuT3V0Ym91bmRNZXNzYWdlQ29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLlJlYWRlcldyaXRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLlN0YXR1c2VzOworCitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkhlYWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cEVudGl0eTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cEhvc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmF1dGguQXV0aFNjb3BlOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5hdXRoLlVzZXJuYW1lUGFzc3dvcmRDcmVkZW50aWFsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50LkF1dGhDYWNoZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50LkNvb2tpZVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQuQ3JlZGVudGlhbHNQcm92aWRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lkh0dHBDbGllbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5IdHRwUmVxdWVzdFJldHJ5SGFuZGxlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50LmNvbmZpZy5Db29raWVTcGVjczsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50LmNvbmZpZy5SZXF1ZXN0Q29uZmlnOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5DbG9zZWFibGVIdHRwUmVzcG9uc2U7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzLkh0dHBVcmlSZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQubWV0aG9kcy5SZXF1ZXN0QnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50LnByb3RvY29sLkh0dHBDbGllbnRDb250ZXh0OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jb25maWcuQ29ubmVjdGlvbkNvbmZpZzsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY29uZmlnLlJlZ2lzdHJ5OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jb25maWcuUmVnaXN0cnlCdWlsZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jb25uLkh0dHBDbGllbnRDb25uZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY29ubi5NYW5hZ2VkSHR0cENsaWVudENvbm5lY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5IdHRwUm91dGU7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNvbm4uc29ja2V0LkNvbm5lY3Rpb25Tb2NrZXRGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jb25uLnNvY2tldC5MYXllcmVkQ29ubmVjdGlvblNvY2tldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNvbm4uc29ja2V0LlBsYWluQ29ubmVjdGlvblNvY2tldEZhY3Rvcnk7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNvbm4uc3NsLlNTTENvbm5lY3Rpb25Tb2NrZXRGYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jb25uLnNzbC5TU0xDb250ZXh0czsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuZW50aXR5LkFic3RyYWN0SHR0cEVudGl0eTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuZW50aXR5LkJ1ZmZlcmVkSHR0cEVudGl0eTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuZW50aXR5LkNvbnRlbnRMZW5ndGhTdHJhdGVneTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5hdXRoLkJhc2ljU2NoZW1lOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudC5CYXNpY0F1dGhDYWNoZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jbGllbnQuQmFzaWNDb29raWVTdG9yZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jbGllbnQuQmFzaWNDcmVkZW50aWFsc1Byb3ZpZGVyOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudC5DbG9zZWFibGVIdHRwQ2xpZW50OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudC5IdHRwQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLkRlZmF1bHRNYW5hZ2VkSHR0cENsaWVudENvbm5lY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmltcGwuY29ubi5NYW5hZ2VkSHR0cENsaWVudENvbm5lY3Rpb25GYWN0b3J5OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvbm4uUG9vbGluZ0h0dHBDbGllbnRDb25uZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5pby5DaHVua2VkT3V0cHV0U3RyZWFtOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pby5TZXNzaW9uT3V0cHV0QnVmZmVyOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC51dGlsLlRleHRVdGlsczsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAudXRpbC5WZXJzaW9uSW5mbzsKKworLyoqCisgKiBBIHtAbGluayBDb25uZWN0b3J9IHRoYXQgdXRpbGl6ZXMgdGhlIEFwYWNoZSBIVFRQIENsaWVudCB0byBzZW5kIGFuZCByZWNlaXZlCisgKiBIVFRQIHJlcXVlc3QgYW5kIHJlc3BvbnNlcy4KKyAqIDxwLz4KKyAqIFRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBhcmUgb25seSBzdXBwb3J0ZWQgYXQgY29uc3RydWN0aW9uIG9mIHRoaXMgY2xhc3M6CisgKiA8dWw+CisgKiA8bGk+e0BsaW5rIEFwYWNoZUNsaWVudFByb3BlcnRpZXMjQ09OTkVDVElPTl9NQU5BR0VSfTwvbGk+CisgKiA8bGk+e0BsaW5rIEFwYWNoZUNsaWVudFByb3BlcnRpZXMjUkVRVUVTVF9DT05GSUd9PC9saT4KKyAqIDxsaT57QGxpbmsgQXBhY2hlQ2xpZW50UHJvcGVydGllcyNDUkVERU5USUFMU19QUk9WSURFUn08L2xpPgorICogPGxpPntAbGluayBBcGFjaGVDbGllbnRQcm9wZXJ0aWVzI0RJU0FCTEVfQ09PS0lFU308L2xpPgorICogPGxpPntAbGluayBDbGllbnRQcm9wZXJ0aWVzI1BST1hZX1VSSX08L2xpPgorICogPGxpPntAbGluayBDbGllbnRQcm9wZXJ0aWVzI1BST1hZX1VTRVJOQU1FfTwvbGk+CisgKiA8bGk+e0BsaW5rIENsaWVudFByb3BlcnRpZXMjUFJPWFlfUEFTU1dPUkR9PC9saT4KKyAqIDxsaT57QGxpbmsgQ2xpZW50UHJvcGVydGllcyNSRVFVRVNUX0VOVElUWV9QUk9DRVNTSU5HfSAtIGRlZmF1bHQgdmFsdWUgaXMge0BsaW5rIFJlcXVlc3RFbnRpdHlQcm9jZXNzaW5nI0NIVU5LRUR9PC9saT4KKyAqIDxsaT57QGxpbmsgQXBhY2hlQ2xpZW50UHJvcGVydGllcyNQUkVFTVBUSVZFX0JBU0lDX0FVVEhFTlRJQ0FUSU9OfTwvbGk+CisgKiA8bGk+e0BsaW5rIEFwYWNoZUNsaWVudFByb3BlcnRpZXMjUkVUUllfSEFORExFUn08L2xpPgorICogPC91bD4KKyAqIDxwPgorICogVGhpcyBjb25uZWN0b3IgdXNlcyB7QGxpbmsgUmVxdWVzdEVudGl0eVByb2Nlc3NpbmcjQ0hVTktFRCBjaHVua2VkIGVuY29kaW5nfSBhcyBhIGRlZmF1bHQgc2V0dGluZy4gVGhpcyBjYW4KKyAqIGJlIG92ZXJyaWRkZW4gYnkgdGhlIHtAbGluayBDbGllbnRQcm9wZXJ0aWVzI1JFUVVFU1RfRU5USVRZX1BST0NFU1NJTkd9LiBCeSBkZWZhdWx0IHRoZQorICoge0BsaW5rIENsaWVudFByb3BlcnRpZXMjQ0hVTktFRF9FTkNPRElOR19TSVpFfSBwcm9wZXJ0eSBpcyBvbmx5IHN1cHBvcnRlZCBieSB1c2luZyBkZWZhdWx0IGNvbm5lY3Rpb24gbWFuYWdlci4gSWYgY3VzdG9tCisgKiBjb25uZWN0aW9uIG1hbmFnZXIgbmVlZHMgdG8gYmUgdXNlZCB0aGVuIGNodW5rZWQgZW5jb2Rpbmcgc2l6ZSBjYW4gYmUgc2V0IGJ5IHByb3ZpZGluZyBhIGN1c3RvbQorICoge0BsaW5rIG9yZy5hcGFjaGUuaHR0cC5IdHRwQ2xpZW50Q29ubmVjdGlvbn0gKHZpYSBjdXN0b20ge0BsaW5rIG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvbm4uTWFuYWdlZEh0dHBDbGllbnRDb25uZWN0aW9uRmFjdG9yeX0pCisgKiBhbmQgb3ZlcnJpZGluZyB7QGNvZGUgY3JlYXRlT3V0cHV0U3RyZWFtfSBtZXRob2QuCisgKiA8L3A+CisgKiA8cD4KKyAqIFVzaW5nIG9mIGF1dGhvcml6YXRpb24gaXMgZGVwZW5kZW50IG9uIHRoZSBjaHVuayBlbmNvZGluZyBzZXR0aW5nLiBJZiB0aGUgZW50aXR5CisgKiBidWZmZXJpbmcgaXMgZW5hYmxlZCwgdGhlIGVudGl0eSBpcyBidWZmZXJlZCBhbmQgYXV0aG9yaXphdGlvbiBjYW4gYmUgcGVyZm9ybWVkCisgKiBhdXRvbWF0aWNhbGx5IGluIHJlc3BvbnNlIHRvIGEgNDAxIGJ5IHNlbmRpbmcgdGhlIHJlcXVlc3QgYWdhaW4uIFdoZW4gZW50aXR5IGJ1ZmZlcmluZworICogaXMgZGlzYWJsZWQgKGNodW5rZWQgZW5jb2RpbmcgaXMgdXNlZCkgdGhlbiB0aGUgcHJvcGVydHkKKyAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5hcGFjaGUuY29ubmVjdG9yLkFwYWNoZUNsaWVudFByb3BlcnRpZXMjUFJFRU1QVElWRV9CQVNJQ19BVVRIRU5USUNBVElPTn0gbXVzdAorICogYmUgc2V0IHRvIHtAY29kZSB0cnVlfS4KKyAqIDwvcD4KKyAqIDxwPgorICogSWYgYSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFJlc3BvbnNlfSBpcyBvYnRhaW5lZCBhbmQgYW4KKyAqIGVudGl0eSBpcyBub3QgcmVhZCBmcm9tIHRoZSByZXNwb25zZSB0aGVuCisgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFJlc3BvbnNlI2Nsb3NlKCl9IE1VU1QgYmUgY2FsbGVkCisgKiBhZnRlciBwcm9jZXNzaW5nIHRoZSByZXNwb25zZSB0byByZWxlYXNlIGNvbm5lY3Rpb24tYmFzZWQgcmVzb3VyY2VzLgorICogPC9wPgorICogPHA+CisgKiBDbGllbnQgb3BlcmF0aW9ucyBhcmUgdGhyZWFkIHNhZmUsIHRoZSBIVFRQIGNvbm5lY3Rpb24gbWF5CisgKiBiZSBzaGFyZWQgYmV0d2VlbiBkaWZmZXJlbnQgdGhyZWFkcy4KKyAqIDwvcD4KKyAqIDxwPgorICogSWYgYSByZXNwb25zZSBlbnRpdHkgaXMgb2J0YWluZWQgdGhhdCBpcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgQ2xvc2VhYmxlfQorICogdGhlbiB0aGUgaW5zdGFuY2UgTVVTVCBiZSBjbG9zZWQgYWZ0ZXIgcHJvY2Vzc2luZyB0aGUgZW50aXR5IHRvIHJlbGVhc2UKKyAqIGNvbm5lY3Rpb24tYmFzZWQgcmVzb3VyY2VzLgorICogPC9wPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQ6IEhFQUQsIEdFVCwgUE9TVCwgUFVULCBERUxFVEUsIE9QVElPTlMsIFBBVENIIGFuZCBUUkFDRS4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIGpvcmdlbHVpc3dAbWFjLmNvbQorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgQXJ1bCBEaGVzaWFzZWVsYW4gKGFydWxkIGF0IGFjbS5vcmcpCisgKiBAc2VlIEFwYWNoZUNsaWVudFByb3BlcnRpZXMjQ09OTkVDVElPTl9NQU5BR0VSCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCitjbGFzcyBBcGFjaGVDb25uZWN0b3IgaW1wbGVtZW50cyBDb25uZWN0b3IgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoQXBhY2hlQ29ubmVjdG9yLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBWZXJzaW9uSW5mbyB2aTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgcmVsZWFzZTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIHZpID0gVmVyc2lvbkluZm8ubG9hZFZlcnNpb25JbmZvKCJvcmcuYXBhY2hlLmh0dHAuY2xpZW50IiwgSHR0cENsaWVudEJ1aWxkZXIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgIHJlbGVhc2UgPSAodmkgIT0gbnVsbCkgPyB2aS5nZXRSZWxlYXNlKCkgOiBWZXJzaW9uSW5mby5VTkFWQUlMQUJMRTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIENsb3NlYWJsZUh0dHBDbGllbnQgY2xpZW50OworICAgIHByaXZhdGUgZmluYWwgQ29va2llU3RvcmUgY29va2llU3RvcmU7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHByZWVtcHRpdmVCYXNpY0F1dGg7CisgICAgcHJpdmF0ZSBmaW5hbCBSZXF1ZXN0Q29uZmlnIHJlcXVlc3RDb25maWc7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgdGhlIG5ldyBBcGFjaGUgSFRUUCBDbGllbnQgY29ubmVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGNsaWVudCBKQVgtUlMgY2xpZW50IGluc3RhbmNlIGZvciB3aGljaCB0aGUgY29ubmVjdG9yIGlzIGJlaW5nIGNyZWF0ZWQuCisgICAgICogQHBhcmFtIGNvbmZpZyBjbGllbnQgY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBBcGFjaGVDb25uZWN0b3IoZmluYWwgQ2xpZW50IGNsaWVudCwgZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWcpIHsKKyAgICAgICAgZmluYWwgT2JqZWN0IGNvbm5lY3Rpb25NYW5hZ2VyID0gY29uZmlnLmdldFByb3BlcnRpZXMoKS5nZXQoQXBhY2hlQ2xpZW50UHJvcGVydGllcy5DT05ORUNUSU9OX01BTkFHRVIpOworICAgICAgICBpZiAoY29ubmVjdGlvbk1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKCEoY29ubmVjdGlvbk1hbmFnZXIgaW5zdGFuY2VvZiBIdHRwQ2xpZW50Q29ubmVjdGlvbk1hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmxvZygKKyAgICAgICAgICAgICAgICAgICAgICAgIExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGl6YXRpb25NZXNzYWdlcy5JR05PUklOR19WQUxVRV9PRl9QUk9QRVJUWSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlQ2xpZW50UHJvcGVydGllcy5DT05ORUNUSU9OX01BTkFHRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25NYW5hZ2VyLmdldENsYXNzKCkuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwQ2xpZW50Q29ubmVjdGlvbk1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKQorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBPYmplY3QgcmVxQ29uZmlnID0gY29uZmlnLmdldFByb3BlcnRpZXMoKS5nZXQoQXBhY2hlQ2xpZW50UHJvcGVydGllcy5SRVFVRVNUX0NPTkZJRyk7CisgICAgICAgIGlmIChyZXFDb25maWcgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKCEocmVxQ29uZmlnIGluc3RhbmNlb2YgUmVxdWVzdENvbmZpZykpIHsKKyAgICAgICAgICAgICAgICBMT0dHRVIubG9nKAorICAgICAgICAgICAgICAgICAgICAgICAgTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsaXphdGlvbk1lc3NhZ2VzLklHTk9SSU5HX1ZBTFVFX09GX1BST1BFUlRZKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGVDbGllbnRQcm9wZXJ0aWVzLlJFUVVFU1RfQ09ORklHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXFDb25maWcuZ2V0Q2xhc3MoKS5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RDb25maWcuY2xhc3MuZ2V0TmFtZSgpKQorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgcmVxQ29uZmlnID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFNTTENvbnRleHQgc3NsQ29udGV4dCA9IGNsaWVudC5nZXRTc2xDb250ZXh0KCk7CisgICAgICAgIGZpbmFsIEh0dHBDbGllbnRCdWlsZGVyIGNsaWVudEJ1aWxkZXIgPSBIdHRwQ2xpZW50QnVpbGRlci5jcmVhdGUoKTsKKworICAgICAgICBjbGllbnRCdWlsZGVyLnNldENvbm5lY3Rpb25NYW5hZ2VyKGdldENvbm5lY3Rpb25NYW5hZ2VyKGNsaWVudCwgY29uZmlnLCBzc2xDb250ZXh0KSk7CisgICAgICAgIGNsaWVudEJ1aWxkZXIuc2V0Q29ubmVjdGlvbk1hbmFnZXJTaGFyZWQoCisgICAgICAgICAgICAgICAgUHJvcGVydGllc0hlbHBlci5nZXRWYWx1ZShjb25maWcuZ2V0UHJvcGVydGllcygpLCBBcGFjaGVDbGllbnRQcm9wZXJ0aWVzLkNPTk5FQ1RJT05fTUFOQUdFUl9TSEFSRUQsIGZhbHNlLCBudWxsKSk7CisgICAgICAgIGNsaWVudEJ1aWxkZXIuc2V0U3NsY29udGV4dChzc2xDb250ZXh0KTsKKworICAgICAgICBmaW5hbCBSZXF1ZXN0Q29uZmlnLkJ1aWxkZXIgcmVxdWVzdENvbmZpZ0J1aWxkZXIgPSBSZXF1ZXN0Q29uZmlnLmN1c3RvbSgpOworCisgICAgICAgIGZpbmFsIE9iamVjdCBjcmVkZW50aWFsc1Byb3ZpZGVyID0gY29uZmlnLmdldFByb3BlcnR5KEFwYWNoZUNsaWVudFByb3BlcnRpZXMuQ1JFREVOVElBTFNfUFJPVklERVIpOworICAgICAgICBpZiAoY3JlZGVudGlhbHNQcm92aWRlciAhPSBudWxsICYmIChjcmVkZW50aWFsc1Byb3ZpZGVyIGluc3RhbmNlb2YgQ3JlZGVudGlhbHNQcm92aWRlcikpIHsKKyAgICAgICAgICAgIGNsaWVudEJ1aWxkZXIuc2V0RGVmYXVsdENyZWRlbnRpYWxzUHJvdmlkZXIoKENyZWRlbnRpYWxzUHJvdmlkZXIpIGNyZWRlbnRpYWxzUHJvdmlkZXIpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgT2JqZWN0IHJldHJ5SGFuZGxlciA9IGNvbmZpZy5nZXRQcm9wZXJ0aWVzKCkuZ2V0KEFwYWNoZUNsaWVudFByb3BlcnRpZXMuUkVUUllfSEFORExFUik7CisgICAgICAgIGlmIChyZXRyeUhhbmRsZXIgIT0gbnVsbCAmJiAocmV0cnlIYW5kbGVyIGluc3RhbmNlb2YgSHR0cFJlcXVlc3RSZXRyeUhhbmRsZXIpKSB7CisgICAgICAgICAgICBjbGllbnRCdWlsZGVyLnNldFJldHJ5SGFuZGxlcigoSHR0cFJlcXVlc3RSZXRyeUhhbmRsZXIpIHJldHJ5SGFuZGxlcik7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBPYmplY3QgcHJveHlVcmk7CisgICAgICAgIHByb3h5VXJpID0gY29uZmlnLmdldFByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuUFJPWFlfVVJJKTsKKyAgICAgICAgaWYgKHByb3h5VXJpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIFVSSSB1ID0gZ2V0UHJveHlVcmkocHJveHlVcmkpOworICAgICAgICAgICAgZmluYWwgSHR0cEhvc3QgcHJveHkgPSBuZXcgSHR0cEhvc3QodS5nZXRIb3N0KCksIHUuZ2V0UG9ydCgpLCB1LmdldFNjaGVtZSgpKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB1c2VyTmFtZTsKKyAgICAgICAgICAgIHVzZXJOYW1lID0gQ2xpZW50UHJvcGVydGllcy5nZXRWYWx1ZShjb25maWcuZ2V0UHJvcGVydGllcygpLCBDbGllbnRQcm9wZXJ0aWVzLlBST1hZX1VTRVJOQU1FLCBTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgaWYgKHVzZXJOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGFzc3dvcmQ7CisgICAgICAgICAgICAgICAgcGFzc3dvcmQgPSBDbGllbnRQcm9wZXJ0aWVzLmdldFZhbHVlKGNvbmZpZy5nZXRQcm9wZXJ0aWVzKCksIENsaWVudFByb3BlcnRpZXMuUFJPWFlfUEFTU1dPUkQsIFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgICAgICAgICBpZiAocGFzc3dvcmQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBDcmVkZW50aWFsc1Byb3ZpZGVyIGNyZWRzUHJvdmlkZXIgPSBuZXcgQmFzaWNDcmVkZW50aWFsc1Byb3ZpZGVyKCk7CisgICAgICAgICAgICAgICAgICAgIGNyZWRzUHJvdmlkZXIuc2V0Q3JlZGVudGlhbHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF1dGhTY29wZSh1LmdldEhvc3QoKSwgdS5nZXRQb3J0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBVc2VybmFtZVBhc3N3b3JkQ3JlZGVudGlhbHModXNlck5hbWUsIHBhc3N3b3JkKQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICBjbGllbnRCdWlsZGVyLnNldERlZmF1bHRDcmVkZW50aWFsc1Byb3ZpZGVyKGNyZWRzUHJvdmlkZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsaWVudEJ1aWxkZXIuc2V0UHJveHkocHJveHkpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgQm9vbGVhbiBwcmVlbXB0aXZlQmFzaWNBdXRoUHJvcGVydHkgPSAoQm9vbGVhbikgY29uZmlnLmdldFByb3BlcnRpZXMoKQorICAgICAgICAgICAgICAgIC5nZXQoQXBhY2hlQ2xpZW50UHJvcGVydGllcy5QUkVFTVBUSVZFX0JBU0lDX0FVVEhFTlRJQ0FUSU9OKTsKKyAgICAgICAgdGhpcy5wcmVlbXB0aXZlQmFzaWNBdXRoID0gKHByZWVtcHRpdmVCYXNpY0F1dGhQcm9wZXJ0eSAhPSBudWxsKSA/IHByZWVtcHRpdmVCYXNpY0F1dGhQcm9wZXJ0eSA6IGZhbHNlOworCisgICAgICAgIGZpbmFsIGJvb2xlYW4gaWdub3JlQ29va2llcyA9IFByb3BlcnRpZXNIZWxwZXIuaXNQcm9wZXJ0eShjb25maWcuZ2V0UHJvcGVydGllcygpLCBBcGFjaGVDbGllbnRQcm9wZXJ0aWVzLkRJU0FCTEVfQ09PS0lFUyk7CisKKyAgICAgICAgaWYgKHJlcUNvbmZpZyAhPSBudWxsKSB7CisgICAgICAgICAgICBmaW5hbCBSZXF1ZXN0Q29uZmlnLkJ1aWxkZXIgcmVxQ29uZmlnQnVpbGRlciA9IFJlcXVlc3RDb25maWcuY29weSgoUmVxdWVzdENvbmZpZykgcmVxQ29uZmlnKTsKKyAgICAgICAgICAgIGlmIChpZ25vcmVDb29raWVzKSB7CisgICAgICAgICAgICAgICAgcmVxQ29uZmlnQnVpbGRlci5zZXRDb29raWVTcGVjKENvb2tpZVNwZWNzLklHTk9SRV9DT09LSUVTKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcXVlc3RDb25maWcgPSByZXFDb25maWdCdWlsZGVyLmJ1aWxkKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoaWdub3JlQ29va2llcykgeworICAgICAgICAgICAgICAgIHJlcXVlc3RDb25maWdCdWlsZGVyLnNldENvb2tpZVNwZWMoQ29va2llU3BlY3MuSUdOT1JFX0NPT0tJRVMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVxdWVzdENvbmZpZyA9IHJlcXVlc3RDb25maWdCdWlsZGVyLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVxdWVzdENvbmZpZy5nZXRDb29raWVTcGVjKCkgPT0gbnVsbCB8fCAhcmVxdWVzdENvbmZpZy5nZXRDb29raWVTcGVjKCkuZXF1YWxzKENvb2tpZVNwZWNzLklHTk9SRV9DT09LSUVTKSkgeworICAgICAgICAgICAgdGhpcy5jb29raWVTdG9yZSA9IG5ldyBCYXNpY0Nvb2tpZVN0b3JlKCk7CisgICAgICAgICAgICBjbGllbnRCdWlsZGVyLnNldERlZmF1bHRDb29raWVTdG9yZShjb29raWVTdG9yZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLmNvb2tpZVN0b3JlID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBjbGllbnRCdWlsZGVyLnNldERlZmF1bHRSZXF1ZXN0Q29uZmlnKHJlcXVlc3RDb25maWcpOworICAgICAgICB0aGlzLmNsaWVudCA9IGNsaWVudEJ1aWxkZXIuYnVpbGQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEh0dHBDbGllbnRDb25uZWN0aW9uTWFuYWdlciBnZXRDb25uZWN0aW9uTWFuYWdlcihmaW5hbCBDbGllbnQgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNTTENvbnRleHQgc3NsQ29udGV4dCkgeworICAgICAgICBmaW5hbCBPYmplY3QgY21PYmplY3QgPSBjb25maWcuZ2V0UHJvcGVydGllcygpLmdldChBcGFjaGVDbGllbnRQcm9wZXJ0aWVzLkNPTk5FQ1RJT05fTUFOQUdFUik7CisKKyAgICAgICAgLy8gQ29ubmVjdGlvbiBtYW5hZ2VyIGZyb20gY29uZmlndXJhdGlvbi4KKyAgICAgICAgaWYgKGNtT2JqZWN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChjbU9iamVjdCBpbnN0YW5jZW9mIEh0dHBDbGllbnRDb25uZWN0aW9uTWFuYWdlcikgeworICAgICAgICAgICAgICAgIHJldHVybiAoSHR0cENsaWVudENvbm5lY3Rpb25NYW5hZ2VyKSBjbU9iamVjdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmxvZygKKyAgICAgICAgICAgICAgICAgICAgICAgIExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGl6YXRpb25NZXNzYWdlcy5JR05PUklOR19WQUxVRV9PRl9QUk9QRVJUWSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlQ2xpZW50UHJvcGVydGllcy5DT05ORUNUSU9OX01BTkFHRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtT2JqZWN0LmdldENsYXNzKCkuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwQ2xpZW50Q29ubmVjdGlvbk1hbmFnZXIuY2xhc3MuZ2V0TmFtZSgpKQorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgY3VzdG9tIGNvbm5lY3Rpb24gbWFuYWdlci4KKyAgICAgICAgcmV0dXJuIGNyZWF0ZUNvbm5lY3Rpb25NYW5hZ2VyKAorICAgICAgICAgICAgICAgIGNsaWVudCwKKyAgICAgICAgICAgICAgICBjb25maWcsCisgICAgICAgICAgICAgICAgc3NsQ29udGV4dCwKKyAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBIdHRwQ2xpZW50Q29ubmVjdGlvbk1hbmFnZXIgY3JlYXRlQ29ubmVjdGlvbk1hbmFnZXIoCisgICAgICAgICAgICBmaW5hbCBDbGllbnQgY2xpZW50LAorICAgICAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWcsCisgICAgICAgICAgICBmaW5hbCBTU0xDb250ZXh0IHNzbENvbnRleHQsCisgICAgICAgICAgICBmaW5hbCBib29sZWFuIHVzZVN5c3RlbVByb3BlcnRpZXMpIHsKKworICAgICAgICBmaW5hbCBTdHJpbmdbXSBzdXBwb3J0ZWRQcm90b2NvbHMgPSB1c2VTeXN0ZW1Qcm9wZXJ0aWVzID8gc3BsaXQoCisgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJodHRwcy5wcm90b2NvbHMiKSkgOiBudWxsOworICAgICAgICBmaW5hbCBTdHJpbmdbXSBzdXBwb3J0ZWRDaXBoZXJTdWl0ZXMgPSB1c2VTeXN0ZW1Qcm9wZXJ0aWVzID8gc3BsaXQoCisgICAgICAgICAgICAgICAgU3lzdGVtLmdldFByb3BlcnR5KCJodHRwcy5jaXBoZXJTdWl0ZXMiKSkgOiBudWxsOworCisgICAgICAgIEhvc3RuYW1lVmVyaWZpZXIgaG9zdG5hbWVWZXJpZmllciA9IGNsaWVudC5nZXRIb3N0bmFtZVZlcmlmaWVyKCk7CisKKyAgICAgICAgZmluYWwgTGF5ZXJlZENvbm5lY3Rpb25Tb2NrZXRGYWN0b3J5IHNzbFNvY2tldEZhY3Rvcnk7CisgICAgICAgIGlmIChzc2xDb250ZXh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNzbFNvY2tldEZhY3RvcnkgPSBuZXcgU1NMQ29ubmVjdGlvblNvY2tldEZhY3RvcnkoCisgICAgICAgICAgICAgICAgICAgIHNzbENvbnRleHQsIHN1cHBvcnRlZFByb3RvY29scywgc3VwcG9ydGVkQ2lwaGVyU3VpdGVzLCBob3N0bmFtZVZlcmlmaWVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICh1c2VTeXN0ZW1Qcm9wZXJ0aWVzKSB7CisgICAgICAgICAgICAgICAgc3NsU29ja2V0RmFjdG9yeSA9IG5ldyBTU0xDb25uZWN0aW9uU29ja2V0RmFjdG9yeSgKKyAgICAgICAgICAgICAgICAgICAgICAgIChTU0xTb2NrZXRGYWN0b3J5KSBTU0xTb2NrZXRGYWN0b3J5LmdldERlZmF1bHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZFByb3RvY29scywgc3VwcG9ydGVkQ2lwaGVyU3VpdGVzLCBob3N0bmFtZVZlcmlmaWVyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3NsU29ja2V0RmFjdG9yeSA9IG5ldyBTU0xDb25uZWN0aW9uU29ja2V0RmFjdG9yeSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFNTTENvbnRleHRzLmNyZWF0ZURlZmF1bHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhvc3RuYW1lVmVyaWZpZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZmluYWwgUmVnaXN0cnk8Q29ubmVjdGlvblNvY2tldEZhY3Rvcnk+IHJlZ2lzdHJ5ID0gUmVnaXN0cnlCdWlsZGVyLjxDb25uZWN0aW9uU29ja2V0RmFjdG9yeT5jcmVhdGUoKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcigiaHR0cCIsIFBsYWluQ29ubmVjdGlvblNvY2tldEZhY3RvcnkuZ2V0U29ja2V0RmFjdG9yeSgpKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcigiaHR0cHMiLCBzc2xTb2NrZXRGYWN0b3J5KQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgIGZpbmFsIEludGVnZXIgY2h1bmtTaXplID0gQ2xpZW50UHJvcGVydGllcy5nZXRWYWx1ZShjb25maWcuZ2V0UHJvcGVydGllcygpLAorICAgICAgICAgICAgICAgIENsaWVudFByb3BlcnRpZXMuQ0hVTktFRF9FTkNPRElOR19TSVpFLCBDbGllbnRQcm9wZXJ0aWVzLkRFRkFVTFRfQ0hVTktfU0laRSwgSW50ZWdlci5jbGFzcyk7CisKKyAgICAgICAgZmluYWwgUG9vbGluZ0h0dHBDbGllbnRDb25uZWN0aW9uTWFuYWdlciBjb25uZWN0aW9uTWFuYWdlciA9CisgICAgICAgICAgICAgICAgbmV3IFBvb2xpbmdIdHRwQ2xpZW50Q29ubmVjdGlvbk1hbmFnZXIocmVnaXN0cnksIG5ldyBDb25uZWN0aW9uRmFjdG9yeShjaHVua1NpemUpKTsKKworICAgICAgICBpZiAodXNlU3lzdGVtUHJvcGVydGllcykgeworICAgICAgICAgICAgU3RyaW5nIHMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImh0dHAua2VlcEFsaXZlIiwgInRydWUiKTsKKyAgICAgICAgICAgIGlmICgidHJ1ZSIuZXF1YWxzSWdub3JlQ2FzZShzKSkgeworICAgICAgICAgICAgICAgIHMgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImh0dHAubWF4Q29ubmVjdGlvbnMiLCAiNSIpOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBtYXggPSBJbnRlZ2VyLnBhcnNlSW50KHMpOworICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25NYW5hZ2VyLnNldERlZmF1bHRNYXhQZXJSb3V0ZShtYXgpOworICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25NYW5hZ2VyLnNldE1heFRvdGFsKDIgKiBtYXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25NYW5hZ2VyOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIHNwbGl0KGZpbmFsIFN0cmluZyBzKSB7CisgICAgICAgIGlmIChUZXh0VXRpbHMuaXNCbGFuayhzKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHMuc3BsaXQoIiAqLCAqIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB7QGxpbmsgSHR0cENsaWVudH0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgSHR0cENsaWVudH0uCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoIlVudXNlZERlY2xhcmF0aW9uIikKKyAgICBwdWJsaWMgSHR0cENsaWVudCBnZXRIdHRwQ2xpZW50KCkgeworICAgICAgICByZXR1cm4gY2xpZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUge0BsaW5rIENvb2tpZVN0b3JlfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBDb29raWVTdG9yZX0gaW5zdGFuY2Ugb3Ige0Bjb2RlIG51bGx9IHdoZW4ge0B2YWx1ZSBBcGFjaGVDbGllbnRQcm9wZXJ0aWVzI0RJU0FCTEVfQ09PS0lFU30gc2V0IHRvCisgICAgICoge0Bjb2RlIHRydWV9LgorICAgICAqLworICAgIHB1YmxpYyBDb29raWVTdG9yZSBnZXRDb29raWVTdG9yZSgpIHsKKyAgICAgICAgcmV0dXJuIGNvb2tpZVN0b3JlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFVSSSBnZXRQcm94eVVyaShmaW5hbCBPYmplY3QgcHJveHkpIHsKKyAgICAgICAgaWYgKHByb3h5IGluc3RhbmNlb2YgVVJJKSB7CisgICAgICAgICAgICByZXR1cm4gKFVSSSkgcHJveHk7CisgICAgICAgIH0gZWxzZSBpZiAocHJveHkgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgICAgICAgIHJldHVybiBVUkkuY3JlYXRlKChTdHJpbmcpIHByb3h5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLldST05HX1BST1hZX1VSSV9UWVBFKENsaWVudFByb3BlcnRpZXMuUFJPWFlfVVJJKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2xpZW50UmVzcG9uc2UgYXBwbHkoZmluYWwgQ2xpZW50UmVxdWVzdCBjbGllbnRSZXF1ZXN0KSB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEh0dHBVcmlSZXF1ZXN0IHJlcXVlc3QgPSBnZXRVcmlIdHRwUmVxdWVzdChjbGllbnRSZXF1ZXN0KTsKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBjbGllbnRIZWFkZXJzU25hcHNob3QgPSB3cml0ZU91dEJvdW5kSGVhZGVycyhjbGllbnRSZXF1ZXN0LmdldEhlYWRlcnMoKSwgcmVxdWVzdCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIENsb3NlYWJsZUh0dHBSZXNwb25zZSByZXNwb25zZTsKKyAgICAgICAgICAgIGZpbmFsIEh0dHBDbGllbnRDb250ZXh0IGNvbnRleHQgPSBIdHRwQ2xpZW50Q29udGV4dC5jcmVhdGUoKTsKKyAgICAgICAgICAgIGlmIChwcmVlbXB0aXZlQmFzaWNBdXRoKSB7CisgICAgICAgICAgICAgICAgZmluYWwgQXV0aENhY2hlIGF1dGhDYWNoZSA9IG5ldyBCYXNpY0F1dGhDYWNoZSgpOworICAgICAgICAgICAgICAgIGZpbmFsIEJhc2ljU2NoZW1lIGJhc2ljU2NoZW1lID0gbmV3IEJhc2ljU2NoZW1lKCk7CisgICAgICAgICAgICAgICAgYXV0aENhY2hlLnB1dChnZXRIb3N0KHJlcXVlc3QpLCBiYXNpY1NjaGVtZSk7CisgICAgICAgICAgICAgICAgY29udGV4dC5zZXRBdXRoQ2FjaGUoYXV0aENhY2hlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgYSByZXF1ZXN0LXNwZWNpZmljIENyZWRlbnRpYWxzUHJvdmlkZXIgZXhpc3RzLCB1c2UgaXQgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBvbmUKKyAgICAgICAgICAgIENyZWRlbnRpYWxzUHJvdmlkZXIgY3JlZGVudGlhbHNQcm92aWRlciA9CisgICAgICAgICAgICAgICAgICAgIGNsaWVudFJlcXVlc3QucmVzb2x2ZVByb3BlcnR5KEFwYWNoZUNsaWVudFByb3BlcnRpZXMuQ1JFREVOVElBTFNfUFJPVklERVIsIENyZWRlbnRpYWxzUHJvdmlkZXIuY2xhc3MpOworICAgICAgICAgICAgaWYgKGNyZWRlbnRpYWxzUHJvdmlkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0Q3JlZGVudGlhbHNQcm92aWRlcihjcmVkZW50aWFsc1Byb3ZpZGVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVzcG9uc2UgPSBjbGllbnQuZXhlY3V0ZShnZXRIb3N0KHJlcXVlc3QpLCByZXF1ZXN0LCBjb250ZXh0KTsKKyAgICAgICAgICAgIEhlYWRlclV0aWxzLmNoZWNrSGVhZGVyQ2hhbmdlcyhjbGllbnRIZWFkZXJzU25hcHNob3QsIGNsaWVudFJlcXVlc3QuZ2V0SGVhZGVycygpLCB0aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKworICAgICAgICAgICAgZmluYWwgUmVzcG9uc2UuU3RhdHVzVHlwZSBzdGF0dXMgPSByZXNwb25zZS5nZXRTdGF0dXNMaW5lKCkuZ2V0UmVhc29uUGhyYXNlKCkgPT0gbnVsbAorICAgICAgICAgICAgICAgICAgICA/IFN0YXR1c2VzLmZyb20ocmVzcG9uc2UuZ2V0U3RhdHVzTGluZSgpLmdldFN0YXR1c0NvZGUoKSkKKyAgICAgICAgICAgICAgICAgICAgOiBTdGF0dXNlcy5mcm9tKHJlc3BvbnNlLmdldFN0YXR1c0xpbmUoKS5nZXRTdGF0dXNDb2RlKCksIHJlc3BvbnNlLmdldFN0YXR1c0xpbmUoKS5nZXRSZWFzb25QaHJhc2UoKSk7CisKKyAgICAgICAgICAgIGZpbmFsIENsaWVudFJlc3BvbnNlIHJlc3BvbnNlQ29udGV4dCA9IG5ldyBDbGllbnRSZXNwb25zZShzdGF0dXMsIGNsaWVudFJlcXVlc3QpOworICAgICAgICAgICAgZmluYWwgTGlzdDxVUkk+IHJlZGlyZWN0TG9jYXRpb25zID0gY29udGV4dC5nZXRSZWRpcmVjdExvY2F0aW9ucygpOworICAgICAgICAgICAgaWYgKHJlZGlyZWN0TG9jYXRpb25zICE9IG51bGwgJiYgIXJlZGlyZWN0TG9jYXRpb25zLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHJlc3BvbnNlQ29udGV4dC5zZXRSZXNvbHZlZFJlcXVlc3RVcmkocmVkaXJlY3RMb2NhdGlvbnMuZ2V0KHJlZGlyZWN0TG9jYXRpb25zLnNpemUoKSAtIDEpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgSGVhZGVyW10gcmVzcEhlYWRlcnMgPSByZXNwb25zZS5nZXRBbGxIZWFkZXJzKCk7CisgICAgICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVycyA9IHJlc3BvbnNlQ29udGV4dC5nZXRIZWFkZXJzKCk7CisgICAgICAgICAgICBmb3IgKGZpbmFsIEhlYWRlciBoZWFkZXIgOiByZXNwSGVhZGVycykgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBoZWFkZXJOYW1lID0gaGVhZGVyLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gbGlzdCA9IGhlYWRlcnMuZ2V0KGhlYWRlck5hbWUpOworICAgICAgICAgICAgICAgIGlmIChsaXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsaXN0LmFkZChoZWFkZXIuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgaGVhZGVycy5wdXQoaGVhZGVyTmFtZSwgbGlzdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIEh0dHBFbnRpdHkgZW50aXR5ID0gcmVzcG9uc2UuZ2V0RW50aXR5KCk7CisKKyAgICAgICAgICAgIGlmIChlbnRpdHkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChoZWFkZXJzLmdldChIdHRwSGVhZGVycy5DT05URU5UX0xFTkdUSCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBoZWFkZXJzLmFkZChIdHRwSGVhZGVycy5DT05URU5UX0xFTkdUSCwgU3RyaW5nLnZhbHVlT2YoZW50aXR5LmdldENvbnRlbnRMZW5ndGgoKSkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZpbmFsIEhlYWRlciBjb250ZW50RW5jb2RpbmcgPSBlbnRpdHkuZ2V0Q29udGVudEVuY29kaW5nKCk7CisgICAgICAgICAgICAgICAgaWYgKGhlYWRlcnMuZ2V0KEh0dHBIZWFkZXJzLkNPTlRFTlRfRU5DT0RJTkcpID09IG51bGwgJiYgY29udGVudEVuY29kaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVycy5hZGQoSHR0cEhlYWRlcnMuQ09OVEVOVF9FTkNPRElORywgY29udGVudEVuY29kaW5nLmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuc2V0RW50aXR5U3RyZWFtKG5ldyBIdHRwQ2xpZW50UmVzcG9uc2VJbnB1dFN0cmVhbShnZXRJbnB1dFN0cmVhbShyZXNwb25zZSkpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLlNFVkVSRSwgbnVsbCwgZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiByZXNwb25zZUNvbnRleHQ7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBGdXR1cmU8Pz4gYXBwbHkoZmluYWwgQ2xpZW50UmVxdWVzdCByZXF1ZXN0LCBmaW5hbCBBc3luY0Nvbm5lY3RvckNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDbGllbnRSZXNwb25zZSByZXNwb25zZSA9IGFwcGx5KHJlcXVlc3QpOworICAgICAgICAgICAgY2FsbGJhY2sucmVzcG9uc2UocmVzcG9uc2UpOworICAgICAgICAgICAgcmV0dXJuIENvbXBsZXRhYmxlRnV0dXJlLmNvbXBsZXRlZEZ1dHVyZShyZXNwb25zZSk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBjYWxsYmFjay5mYWlsdXJlKHQpOworICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8T2JqZWN0PiBmdXR1cmUgPSBuZXcgQ29tcGxldGFibGVGdXR1cmU8PigpOworICAgICAgICAgICAgZnV0dXJlLmNvbXBsZXRlRXhjZXB0aW9uYWxseSh0KTsKKyAgICAgICAgICAgIHJldHVybiBmdXR1cmU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiAiQXBhY2hlIEh0dHBDbGllbnQgIiArIHJlbGVhc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjbGllbnQuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuRkFJTEVEX1RPX1NUT1BfQ0xJRU5UKCksIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBIdHRwSG9zdCBnZXRIb3N0KGZpbmFsIEh0dHBVcmlSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBIdHRwSG9zdChyZXF1ZXN0LmdldFVSSSgpLmdldEhvc3QoKSwgcmVxdWVzdC5nZXRVUkkoKS5nZXRQb3J0KCksIHJlcXVlc3QuZ2V0VVJJKCkuZ2V0U2NoZW1lKCkpOworICAgIH0KKworICAgIHByaXZhdGUgSHR0cFVyaVJlcXVlc3QgZ2V0VXJpSHR0cFJlcXVlc3QoZmluYWwgQ2xpZW50UmVxdWVzdCBjbGllbnRSZXF1ZXN0KSB7CisgICAgICAgIGZpbmFsIFJlcXVlc3RDb25maWcuQnVpbGRlciByZXF1ZXN0Q29uZmlnQnVpbGRlciA9IFJlcXVlc3RDb25maWcuY29weShyZXF1ZXN0Q29uZmlnKTsKKworICAgICAgICBmaW5hbCBpbnQgY29ubmVjdFRpbWVvdXQgPSBjbGllbnRSZXF1ZXN0LnJlc29sdmVQcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLkNPTk5FQ1RfVElNRU9VVCwgLTEpOworICAgICAgICBmaW5hbCBpbnQgc29ja2V0VGltZW91dCA9IGNsaWVudFJlcXVlc3QucmVzb2x2ZVByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuUkVBRF9USU1FT1VULCAtMSk7CisKKyAgICAgICAgaWYgKGNvbm5lY3RUaW1lb3V0ID49IDApIHsKKyAgICAgICAgICAgIHJlcXVlc3RDb25maWdCdWlsZGVyLnNldENvbm5lY3RUaW1lb3V0KGNvbm5lY3RUaW1lb3V0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc29ja2V0VGltZW91dCA+PSAwKSB7CisgICAgICAgICAgICByZXF1ZXN0Q29uZmlnQnVpbGRlci5zZXRTb2NrZXRUaW1lb3V0KHNvY2tldFRpbWVvdXQpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgQm9vbGVhbiByZWRpcmVjdHNFbmFibGVkID0KKyAgICAgICAgICAgICAgICBjbGllbnRSZXF1ZXN0LnJlc29sdmVQcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLkZPTExPV19SRURJUkVDVFMsIHJlcXVlc3RDb25maWcuaXNSZWRpcmVjdHNFbmFibGVkKCkpOworICAgICAgICByZXF1ZXN0Q29uZmlnQnVpbGRlci5zZXRSZWRpcmVjdHNFbmFibGVkKHJlZGlyZWN0c0VuYWJsZWQpOworCisgICAgICAgIGZpbmFsIEJvb2xlYW4gYnVmZmVyaW5nRW5hYmxlZCA9IGNsaWVudFJlcXVlc3QucmVzb2x2ZVByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuUkVRVUVTVF9FTlRJVFlfUFJPQ0VTU0lORywKKyAgICAgICAgICAgICAgICBSZXF1ZXN0RW50aXR5UHJvY2Vzc2luZy5jbGFzcykgPT0gUmVxdWVzdEVudGl0eVByb2Nlc3NpbmcuQlVGRkVSRUQ7CisgICAgICAgIGZpbmFsIEh0dHBFbnRpdHkgZW50aXR5ID0gZ2V0SHR0cEVudGl0eShjbGllbnRSZXF1ZXN0LCBidWZmZXJpbmdFbmFibGVkKTsKKworICAgICAgICByZXR1cm4gUmVxdWVzdEJ1aWxkZXIKKyAgICAgICAgICAgICAgICAuY3JlYXRlKGNsaWVudFJlcXVlc3QuZ2V0TWV0aG9kKCkpCisgICAgICAgICAgICAgICAgLnNldFVyaShjbGllbnRSZXF1ZXN0LmdldFVyaSgpKQorICAgICAgICAgICAgICAgIC5zZXRDb25maWcocmVxdWVzdENvbmZpZ0J1aWxkZXIuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuc2V0RW50aXR5KGVudGl0eSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEh0dHBFbnRpdHkgZ2V0SHR0cEVudGl0eShmaW5hbCBDbGllbnRSZXF1ZXN0IGNsaWVudFJlcXVlc3QsIGZpbmFsIGJvb2xlYW4gYnVmZmVyaW5nRW5hYmxlZCkgeworICAgICAgICBmaW5hbCBPYmplY3QgZW50aXR5ID0gY2xpZW50UmVxdWVzdC5nZXRFbnRpdHkoKTsKKworICAgICAgICBpZiAoZW50aXR5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgQWJzdHJhY3RIdHRwRW50aXR5IGh0dHBFbnRpdHkgPSBuZXcgQWJzdHJhY3RIdHRwRW50aXR5KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcGVhdGFibGUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBsb25nIGdldENvbnRlbnRMZW5ndGgoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRDb250ZW50KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgICAgICAgICAgICAgIGlmIChidWZmZXJpbmdFbmFibGVkKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBidWZmZXIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKDUxMik7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlVG8oYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShidWZmZXIudG9CeXRlQXJyYXkoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oZmluYWwgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBjbGllbnRSZXF1ZXN0LnNldFN0cmVhbVByb3ZpZGVyKG5ldyBPdXRib3VuZE1lc3NhZ2VDb250ZXh0LlN0cmVhbVByb3ZpZGVyKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oZmluYWwgaW50IGNvbnRlbnRMZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3V0cHV0U3RyZWFtOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgY2xpZW50UmVxdWVzdC53cml0ZUVudGl0eSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzU3RyZWFtaW5nKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBpZiAoYnVmZmVyaW5nRW5hYmxlZCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlcmVkSHR0cEVudGl0eShodHRwRW50aXR5KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9CVUZGRVJJTkdfRU5USVRZKCksIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGh0dHBFbnRpdHk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IHdyaXRlT3V0Qm91bmRIZWFkZXJzKGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBoZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSHR0cFVyaVJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IHN0cmluZ0hlYWRlcnMgPSBIZWFkZXJVdGlscy5hc1N0cmluZ0hlYWRlcnNTaW5nbGVWYWx1ZShoZWFkZXJzKTsKKworICAgICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZSA6IHN0cmluZ0hlYWRlcnMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgcmVxdWVzdC5hZGRIZWFkZXIoZS5nZXRLZXkoKSwgZS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RyaW5nSGVhZGVyczsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBIdHRwQ2xpZW50UmVzcG9uc2VJbnB1dFN0cmVhbSBleHRlbmRzIEZpbHRlcklucHV0U3RyZWFtIHsKKworICAgICAgICBIdHRwQ2xpZW50UmVzcG9uc2VJbnB1dFN0cmVhbShmaW5hbCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHN1cGVyKGlucHV0U3RyZWFtKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBzdXBlci5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oZmluYWwgQ2xvc2VhYmxlSHR0cFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtOworCisgICAgICAgIGlmIChyZXNwb25zZS5nZXRFbnRpdHkoKSA9PSBudWxsKSB7CisgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVswXSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBpID0gcmVzcG9uc2UuZ2V0RW50aXR5KCkuZ2V0Q29udGVudCgpOworICAgICAgICAgICAgaWYgKGkubWFya1N1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0gPSBpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKGksIFJlYWRlcldyaXRlci5CVUZGRVJfU0laRSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3IEZpbHRlcklucHV0U3RyZWFtKGlucHV0U3RyZWFtKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5jbG9zZSgpOworICAgICAgICAgICAgICAgIHN1cGVyLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29ubmVjdGlvbkZhY3RvcnkgZXh0ZW5kcyBNYW5hZ2VkSHR0cENsaWVudENvbm5lY3Rpb25GYWN0b3J5IHsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBdG9taWNMb25nIENPVU5URVIgPSBuZXcgQXRvbWljTG9uZygpOworCisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IGNodW5rU2l6ZTsKKworICAgICAgICBwcml2YXRlIENvbm5lY3Rpb25GYWN0b3J5KGZpbmFsIGludCBjaHVua1NpemUpIHsKKyAgICAgICAgICAgIHRoaXMuY2h1bmtTaXplID0gY2h1bmtTaXplOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBNYW5hZ2VkSHR0cENsaWVudENvbm5lY3Rpb24gY3JlYXRlKGZpbmFsIEh0dHBSb3V0ZSByb3V0ZSwgZmluYWwgQ29ubmVjdGlvbkNvbmZpZyBjb25maWcpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpZCA9ICJodHRwLW91dGdvaW5nLSIgKyBMb25nLnRvU3RyaW5nKENPVU5URVIuZ2V0QW5kSW5jcmVtZW50KCkpOworCisgICAgICAgICAgICByZXR1cm4gbmV3IEh0dHBDbGllbnRDb25uZWN0aW9uKGlkLCBjb25maWcuZ2V0QnVmZmVyU2l6ZSgpLCBjaHVua1NpemUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSHR0cENsaWVudENvbm5lY3Rpb24gZXh0ZW5kcyBEZWZhdWx0TWFuYWdlZEh0dHBDbGllbnRDb25uZWN0aW9uIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBjaHVua1NpemU7CisKKyAgICAgICAgcHJpdmF0ZSBIdHRwQ2xpZW50Q29ubmVjdGlvbihmaW5hbCBTdHJpbmcgaWQsIGZpbmFsIGludCBidWZmZXJzaXplLCBmaW5hbCBpbnQgY2h1bmtTaXplKSB7CisgICAgICAgICAgICBzdXBlcihpZCwgYnVmZmVyc2l6ZSk7CisKKyAgICAgICAgICAgIHRoaXMuY2h1bmtTaXplID0gY2h1bmtTaXplOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBPdXRwdXRTdHJlYW0gY3JlYXRlT3V0cHV0U3RyZWFtKGZpbmFsIGxvbmcgbGVuLCBmaW5hbCBTZXNzaW9uT3V0cHV0QnVmZmVyIG91dGJ1ZmZlcikgeworICAgICAgICAgICAgaWYgKGxlbiA9PSBDb250ZW50TGVuZ3RoU3RyYXRlZ3kuQ0hVTktFRCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2h1bmtlZE91dHB1dFN0cmVhbShjaHVua1NpemUsIG91dGJ1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuY3JlYXRlT3V0cHV0U3RyZWFtKGxlbiwgb3V0YnVmZmVyKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvYXBhY2hlLWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2FwYWNoZS9jb25uZWN0b3IvQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXIuamF2YSBiL2Nvbm5lY3RvcnMvYXBhY2hlLWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2FwYWNoZS9jb25uZWN0b3IvQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDk4OGIwCi0tLSAvZGV2L251bGwKKysrIGIvY29ubmVjdG9ycy9hcGFjaGUtY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvYXBhY2hlL2Nvbm5lY3Rvci9BcGFjaGVDb25uZWN0b3JQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmFwYWNoZS5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhYmxlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5Jbml0aWFsaXphYmxlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5zcGkuQ29ubmVjdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5zcGkuQ29ubmVjdG9yUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50LkNvb2tpZVN0b3JlOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQuSHR0cENsaWVudDsKKworLyoqCisgKiBDb25uZWN0b3IgcHJvdmlkZXIgZm9yIEplcnNleSB7QGxpbmsgQ29ubmVjdG9yIGNvbm5lY3RvcnN9IHRoYXQgdXRpbGl6ZQorICogQXBhY2hlIEhUVFAgQ2xpZW50IHRvIHNlbmQgYW5kIHJlY2VpdmUgSFRUUCByZXF1ZXN0IGFuZCByZXNwb25zZXMuCisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgY29ubmVjdG9yIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBhcmUgc3VwcG9ydGVkOgorICogPHVsPgorICogPGxpPntAbGluayBBcGFjaGVDbGllbnRQcm9wZXJ0aWVzI0NPTk5FQ1RJT05fTUFOQUdFUn08L2xpPgorICogPGxpPntAbGluayBBcGFjaGVDbGllbnRQcm9wZXJ0aWVzI1JFUVVFU1RfQ09ORklHfTwvbGk+CisgKiA8bGk+e0BsaW5rIEFwYWNoZUNsaWVudFByb3BlcnRpZXMjQ1JFREVOVElBTFNfUFJPVklERVJ9PC9saT4KKyAqIDxsaT57QGxpbmsgQXBhY2hlQ2xpZW50UHJvcGVydGllcyNESVNBQkxFX0NPT0tJRVN9PC9saT4KKyAqIDxsaT57QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXMjUFJPWFlfVVJJfTwvbGk+CisgKiA8bGk+e0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzI1BST1hZX1VTRVJOQU1FfTwvbGk+CisgKiA8bGk+e0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzI1BST1hZX1BBU1NXT1JEfTwvbGk+CisgKiA8bGk+e0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzI1JFUVVFU1RfRU5USVRZX1BST0NFU1NJTkd9CisgKiAtIGRlZmF1bHQgdmFsdWUgaXMge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5SZXF1ZXN0RW50aXR5UHJvY2Vzc2luZyNDSFVOS0VEfTwvbGk+CisgKiA8bGk+e0BsaW5rIEFwYWNoZUNsaWVudFByb3BlcnRpZXMjUFJFRU1QVElWRV9CQVNJQ19BVVRIRU5USUNBVElPTn08L2xpPgorICogPGxpPntAbGluayBBcGFjaGVDbGllbnRQcm9wZXJ0aWVzI1JFVFJZX0hBTkRMRVJ9PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKiA8cD4KKyAqIENvbm5lY3RvciBpbnN0YW5jZXMgY3JlYXRlZCB2aWEgdGhpcyBjb25uZWN0b3IgcHJvdmlkZXIgdXNlCisgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LlJlcXVlc3RFbnRpdHlQcm9jZXNzaW5nI0NIVU5LRUQgY2h1bmtlZCBlbmNvZGluZ30gYXMgYSBkZWZhdWx0IHNldHRpbmcuCisgKiBUaGlzIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXMjUkVRVUVTVF9FTlRJVFlfUFJPQ0VTU0lOR30uCisgKiBCeSBkZWZhdWx0IHRoZSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXMjQ0hVTktFRF9FTkNPRElOR19TSVpFfSBwcm9wZXJ0eSBpcyBvbmx5IHN1cHBvcnRlZAorICogd2hlbiB1c2luZyB0aGUgZGVmYXVsdCB7QGNvZGUgb3JnLmFwYWNoZS5odHRwLmNvbm4uSHR0cENsaWVudENvbm5lY3Rpb25NYW5hZ2VyfSBpbnN0YW5jZS4gSWYgY3VzdG9tCisgKiBjb25uZWN0aW9uIG1hbmFnZXIgaXMgdXNlZCwgdGhlbiBjaHVua2VkIGVuY29kaW5nIHNpemUgY2FuIGJlIHNldCBieSBwcm92aWRpbmcgYSBjdXN0b20KKyAqIHtAY29kZSBvcmcuYXBhY2hlLmh0dHAuSHR0cENsaWVudENvbm5lY3Rpb259ICh2aWEgY3VzdG9tIHtAY29kZSBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLk1hbmFnZWRIdHRwQ2xpZW50Q29ubmVjdGlvbkZhY3Rvcnl9KQorICogYW5kIG92ZXJyaWRpbmcgaXQncyB7QGNvZGUgY3JlYXRlT3V0cHV0U3RyZWFtfSBtZXRob2QuCisgKiA8L3A+CisgKiA8cD4KKyAqIFVzZSBvZiBhdXRob3JpemF0aW9uIGJ5IHRoZSBBSEMtYmFzZWQgY29ubmVjdG9ycyBpcyBkZXBlbmRlbnQgb24gdGhlIGNodW5rIGVuY29kaW5nIHNldHRpbmcuCisgKiBJZiB0aGUgZW50aXR5IGJ1ZmZlcmluZyBpcyBlbmFibGVkLCB0aGUgZW50aXR5IGlzIGJ1ZmZlcmVkIGFuZCBhdXRob3JpemF0aW9uIGNhbiBiZSBwZXJmb3JtZWQKKyAqIGF1dG9tYXRpY2FsbHkgaW4gcmVzcG9uc2UgdG8gYSA0MDEgYnkgc2VuZGluZyB0aGUgcmVxdWVzdCBhZ2Fpbi4gV2hlbiBlbnRpdHkgYnVmZmVyaW5nCisgKiBpcyBkaXNhYmxlZCAoY2h1bmtlZCBlbmNvZGluZyBpcyB1c2VkKSB0aGVuIHRoZSBwcm9wZXJ0eQorICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmFwYWNoZS5jb25uZWN0b3IuQXBhY2hlQ2xpZW50UHJvcGVydGllcyNQUkVFTVBUSVZFX0JBU0lDX0FVVEhFTlRJQ0FUSU9OfSBtdXN0CisgKiBiZSBzZXQgdG8ge0Bjb2RlIHRydWV9LgorICogPC9wPgorICogPHA+CisgKiBJZiBhIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UmVzcG9uc2V9IGlzIG9idGFpbmVkIGFuZCBhbiBlbnRpdHkgaXMgbm90IHJlYWQgZnJvbSB0aGUgcmVzcG9uc2UgdGhlbgorICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRSZXNwb25zZSNjbG9zZSgpfSBNVVNUIGJlIGNhbGxlZCBhZnRlciBwcm9jZXNzaW5nIHRoZSByZXNwb25zZSB0byByZWxlYXNlCisgKiBjb25uZWN0aW9uLWJhc2VkIHJlc291cmNlcy4KKyAqIDwvcD4KKyAqIDxwPgorICogSWYgYSByZXNwb25zZSBlbnRpdHkgaXMgb2J0YWluZWQgdGhhdCBpcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgamF2YS5pby5DbG9zZWFibGV9CisgKiB0aGVuIHRoZSBpbnN0YW5jZSBNVVNUIGJlIGNsb3NlZCBhZnRlciBwcm9jZXNzaW5nIHRoZSBlbnRpdHkgdG8gcmVsZWFzZQorICogY29ubmVjdGlvbi1iYXNlZCByZXNvdXJjZXMuCisgKiA8cC8+CisgKiA8cD4KKyAqIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZDogSEVBRCwgR0VULCBQT1NULCBQVVQsIERFTEVURSwgT1BUSU9OUywgUEFUQ0ggYW5kIFRSQUNFLgorICogPHAvPgorICoKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIEFydWwgRGhlc2lhc2VlbGFuIChhcnVsZCBhdCBhY20ub3JnKQorICogQGF1dGhvciBqb3JnZWx1aXN3IGF0IG1hYy5jb20KKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1ha3NpbSBNdWtvc2V5IChtbXVrb3NleSBhdCBnbWFpbC5jb20pCisgKiBAc2luY2UgMi41CisgKi8KK3B1YmxpYyBjbGFzcyBBcGFjaGVDb25uZWN0b3JQcm92aWRlciBpbXBsZW1lbnRzIENvbm5lY3RvclByb3ZpZGVyIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb25uZWN0b3IgZ2V0Q29ubmVjdG9yKGZpbmFsIENsaWVudCBjbGllbnQsIGZpbmFsIENvbmZpZ3VyYXRpb24gcnVudGltZUNvbmZpZykgeworICAgICAgICByZXR1cm4gbmV3IEFwYWNoZUNvbm5lY3RvcihjbGllbnQsIHJ1bnRpbWVDb25maWcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlIHRoZSB1bmRlcmx5aW5nIEFwYWNoZSB7QGxpbmsgSHR0cENsaWVudH0gaW5zdGFuY2UgZnJvbQorICAgICAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuSmVyc2V5Q2xpZW50fSBvciB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkplcnNleVdlYlRhcmdldH0KKyAgICAgKiBjb25maWd1cmVkIHRvIHVzZSB7QGNvZGUgQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXJ9LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbXBvbmVudCB7QGNvZGUgSmVyc2V5Q2xpZW50fSBvciB7QGNvZGUgSmVyc2V5V2ViVGFyZ2V0fSBpbnN0YW5jZSB0aGF0IGlzIGNvbmZpZ3VyZWQgdG8gdXNlCisgICAgICogICAgICAgICAgICAgICAgICB7QGNvZGUgQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXJ9LgorICAgICAqIEByZXR1cm4gdW5kZXJseWluZyBBcGFjaGUge0Bjb2RlIEh0dHBDbGllbnR9IGluc3RhbmNlLgorICAgICAqCisgICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGluIGNhc2UgdGhlIHtAY29kZSBjb21wb25lbnR9IGlzIG5laXRoZXIge0Bjb2RlIEplcnNleUNsaWVudH0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9yIHtAY29kZSBKZXJzZXlXZWJUYXJnZXR9IGluc3RhbmNlIG9yIGluIGNhc2UgdGhlIGNvbXBvbmVudAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBub3QgY29uZmlndXJlZCB0byB1c2UgYSB7QGNvZGUgQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXJ9LgorICAgICAqIEBzaW5jZSAyLjgKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEh0dHBDbGllbnQgZ2V0SHR0cENsaWVudChmaW5hbCBDb25maWd1cmFibGU8Pz4gY29tcG9uZW50KSB7CisgICAgICAgIHJldHVybiBnZXRDb25uZWN0b3IoY29tcG9uZW50KS5nZXRIdHRwQ2xpZW50KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIHVuZGVybHlpbmcgQXBhY2hlIHtAbGluayBDb29raWVTdG9yZX0gaW5zdGFuY2UgZnJvbQorICAgICAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuSmVyc2V5Q2xpZW50fSBvciB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkplcnNleVdlYlRhcmdldH0KKyAgICAgKiBjb25maWd1cmVkIHRvIHVzZSB7QGNvZGUgQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXJ9LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbXBvbmVudCB7QGNvZGUgSmVyc2V5Q2xpZW50fSBvciB7QGNvZGUgSmVyc2V5V2ViVGFyZ2V0fSBpbnN0YW5jZSB0aGF0IGlzIGNvbmZpZ3VyZWQgdG8gdXNlCisgICAgICogICAgICAgICAgICAgICAgICB7QGNvZGUgQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXJ9LgorICAgICAqIEByZXR1cm4gdW5kZXJseWluZyBBcGFjaGUge0Bjb2RlIENvb2tpZVN0b3JlfSBpbnN0YW5jZS4KKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW4gY2FzZSB0aGUge0Bjb2RlIGNvbXBvbmVudH0gaXMgbmVpdGhlciB7QGNvZGUgSmVyc2V5Q2xpZW50fQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3Ige0Bjb2RlIEplcnNleVdlYlRhcmdldH0gaW5zdGFuY2Ugb3IgaW4gY2FzZSB0aGUgY29tcG9uZW50CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCBjb25maWd1cmVkIHRvIHVzZSBhIHtAY29kZSBBcGFjaGVDb25uZWN0b3JQcm92aWRlcn0uCisgICAgICogQHNpbmNlIDIuMTYKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENvb2tpZVN0b3JlIGdldENvb2tpZVN0b3JlKGZpbmFsIENvbmZpZ3VyYWJsZTw/PiBjb21wb25lbnQpIHsKKyAgICAgICAgcmV0dXJuIGdldENvbm5lY3Rvcihjb21wb25lbnQpLmdldENvb2tpZVN0b3JlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQXBhY2hlQ29ubmVjdG9yIGdldENvbm5lY3RvcihmaW5hbCBDb25maWd1cmFibGU8Pz4gY29tcG9uZW50KSB7CisgICAgICAgIGlmICghKGNvbXBvbmVudCBpbnN0YW5jZW9mIEluaXRpYWxpemFibGUpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBMb2NhbGl6YXRpb25NZXNzYWdlcy5JTlZBTElEX0NPTkZJR1VSQUJMRV9DT01QT05FTlRfVFlQRShjb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIEluaXRpYWxpemFibGU8Pz4gaW5pdGlhbGl6YWJsZSA9IChJbml0aWFsaXphYmxlPD8+KSBjb21wb25lbnQ7CisgICAgICAgIENvbm5lY3RvciBjb25uZWN0b3IgPSBpbml0aWFsaXphYmxlLmdldENvbmZpZ3VyYXRpb24oKS5nZXRDb25uZWN0b3IoKTsKKyAgICAgICAgaWYgKGNvbm5lY3RvciA9PSBudWxsKSB7CisgICAgICAgICAgICBpbml0aWFsaXphYmxlLnByZUluaXRpYWxpemUoKTsKKyAgICAgICAgICAgIGNvbm5lY3RvciA9IGluaXRpYWxpemFibGUuZ2V0Q29uZmlndXJhdGlvbigpLmdldENvbm5lY3RvcigpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbm5lY3RvciBpbnN0YW5jZW9mIEFwYWNoZUNvbm5lY3RvcikgeworICAgICAgICAgICAgcmV0dXJuIChBcGFjaGVDb25uZWN0b3IpIGNvbm5lY3RvcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuRVhQRUNURURfQ09OTkVDVE9SX1BST1ZJREVSX05PVF9VU0VEKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9hcGFjaGUtY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvYXBhY2hlL2Nvbm5lY3Rvci9wYWNrYWdlLWluZm8uamF2YSBiL2Nvbm5lY3RvcnMvYXBhY2hlLWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2FwYWNoZS9jb25uZWN0b3IvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIxMDcyZAotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvYXBhY2hlLWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2FwYWNoZS9jb25uZWN0b3IvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoqCisgKiBKZXJzZXkgY2xpZW50IHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuc3BpLkNvbm5lY3RvciBjb25uZWN0b3J9IGJhc2VkIG9uIHRoZQorICogQXBhY2hlIEh0dHAgQ2xpZW50LgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmFwYWNoZS5jb25uZWN0b3I7CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2FwYWNoZS1jb25uZWN0b3Ivc3JjL21haW4vcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L2FwYWNoZS9jb25uZWN0b3IvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMgYi9jb25uZWN0b3JzL2FwYWNoZS1jb25uZWN0b3Ivc3JjL21haW4vcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L2FwYWNoZS9jb25uZWN0b3IvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk3N2Q3NgotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvYXBhY2hlLWNvbm5lY3Rvci9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvYXBhY2hlL2Nvbm5lY3Rvci9sb2NhbGl6YXRpb24ucHJvcGVydGllcwpAQCAtMCwwICsxLDI0IEBACisjCisjIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorIworIyBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisjIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyMgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisjIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyMKKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisjCisKK2Vycm9yLmJ1ZmZlcmluZy5lbnRpdHk9RXJyb3IgYnVmZmVyaW5nIHRoZSBlbnRpdHkuCitmYWlsZWQudG8uc3RvcC5jbGllbnQ9RmFpbGVkIHRvIHN0b3AgdGhlIGNsaWVudC4KKyMgezB9IC0gcHJvcGVydHkgbmFtZSwgZS5nLiBqZXJzZXkuY29uZmlnLmNsaWVudC5odHRwY2xpZW50LmNvbm5lY3Rpb25NYW5hZ2VyOyB7MX0sIHsyfSAtIGZ1bGwgY2xhc3MgbmFtZQoraWdub3JpbmcudmFsdWUub2YucHJvcGVydHk9SWdub3JpbmcgdmFsdWUgb2YgcHJvcGVydHkgInswfSIgKCJ7MX0iKSAtIG5vdCBpbnN0YW5jZSBvZiAiezJ9Ii4KKyMgezB9IC0gcHJvcGVydHkgbmFtZSAtIGplcnNleS5jb25maWcuY2xpZW50Lmh0dHBjbGllbnQucHJveHlVcmkKK3dyb25nLnByb3h5LnVyaS50eXBlPVRoZSBwcm94eSBVUkkgKCJ7MH0iKSBwcm9wZXJ0eSBNVVNUIGJlIGFuIGluc3RhbmNlIG9mIFN0cmluZyBvciBVUkkuCitpbnZhbGlkLmNvbmZpZ3VyYWJsZS5jb21wb25lbnQudHlwZT1UaGUgc3VwcGxpZWQgY29tcG9uZW50ICJ7MH0iIGlzIG5vdCBhc3NpZ25hYmxlIGZyb20gSmVyc2V5Q2xpZW50IG9yIEplcnNleVdlYlRhcmdldC4KK2V4cGVjdGVkLmNvbm5lY3Rvci5wcm92aWRlci5ub3QudXNlZD1UaGUgc3VwcGxpZWQgY29tcG9uZW50IGlzIG5vdCBjb25maWd1cmVkIHRvIHVzZSBhIEFwYWNoZUNvbm5lY3RvclByb3ZpZGVyLgpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9hcGFjaGUtY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvYXBhY2hlL2Nvbm5lY3Rvci9Bc3luY1Rlc3QuamF2YSBiL2Nvbm5lY3RvcnMvYXBhY2hlLWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2FwYWNoZS9jb25uZWN0b3IvQXN5bmNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UzODk2ZgotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvYXBhY2hlLWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2FwYWNoZS9jb25uZWN0b3IvQXN5bmNUZXN0LmphdmEKQEAgLTAsMCArMSwyNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuYXBhY2hlLmNvbm5lY3RvcjsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQXN5bmNSZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuU3VzcGVuZGVkOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5UaW1lb3V0SGFuZGxlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5oYW1jcmVzdC5NYXRjaGVyczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIEFzeW5jaHJvbm91cyBjb25uZWN0b3IgdGVzdC4KKyAqCisgKiBAYXV0aG9yIEFydWwgRGhlc2lhc2VlbGFuIChhcnVsZCBhdCBhY20ub3JnKQorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEFzeW5jVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEFzeW5jVGVzdC5jbGFzcy5nZXROYW1lKCkpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIID0gImFzeW5jIjsKKworICAgIC8qKgorICAgICAqIEFzeW5jaHJvbm91cyB0ZXN0IHJlc291cmNlLgorICAgICAqLworICAgIEBQYXRoKFBBVEgpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBc3luY1Jlc291cmNlIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFR5cGljYWwgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbiBkdXJhdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBPUEVSQVRJT05fRFVSQVRJT04gPSAxMDAwOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBMb25nLXJ1bm5pbmcgYXN5bmNocm9ub3VzIHBvc3QuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhc3luY1Jlc3BvbnNlIGFzeW5jIHJlc3BvbnNlLgorICAgICAgICAgKiBAcGFyYW0gaWQgICAgICAgICAgICBwb3N0IHJlcXVlc3QgaWQgKHJlY2VpdmVkIGFzIHJlcXVlc3QgcGF5bG9hZCkuCisgICAgICAgICAqLworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgdm9pZCBhc3luY1Bvc3QoQFN1c3BlbmRlZCBmaW5hbCBBc3luY1Jlc3BvbnNlIGFzeW5jUmVzcG9uc2UsIGZpbmFsIFN0cmluZyBpZCkgeworICAgICAgICAgICAgTE9HR0VSLmluZm8oIkxvbmcgcnVubmluZyBwb3N0IG9wZXJhdGlvbiBjYWxsZWQgd2l0aCBpZCAiICsgaWQgKyAiIG9uIHRocmVhZCAiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSB2ZXJ5RXhwZW5zaXZlT3BlcmF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIGFzeW5jUmVzcG9uc2UucmVzdW1lKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdmVyeUV4cGVuc2l2ZU9wZXJhdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4uIHZlcnkgZXhwZW5zaXZlIG9wZXJhdGlvbiB0aGF0IHR5cGljYWxseSBmaW5pc2hlcyB3aXRoaW4gMSBzZWNvbmRzLCBzaW11bGF0ZWQgdXNpbmcgc2xlZXAoKQorICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKE9QRVJBVElPTl9EVVJBVElPTik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRPTkUtIiArIGlkOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJJTlRFUlJVUFRFRC0iICsgaWQ7CisgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dHRVIuaW5mbygiTG9uZyBydW5uaW5nIHBvc3Qgb3BlcmF0aW9uIGZpbmlzaGVkIG9uIHRocmVhZCAiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwgImFzeW5jLXBvc3QtcnVubmVyLSIgKyBpZCkuc3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBMb25nLXJ1bm5pbmcgYXN5bmMgZ2V0IHJlcXVlc3QgdGhhdCB0aW1lcyBvdXQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhc3luY1Jlc3BvbnNlIGFzeW5jIHJlc3BvbnNlLgorICAgICAgICAgKi8KKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgidGltZW91dCIpCisgICAgICAgIHB1YmxpYyB2b2lkIGFzeW5jR2V0V2l0aFRpbWVvdXQoQFN1c3BlbmRlZCBmaW5hbCBBc3luY1Jlc3BvbnNlIGFzeW5jUmVzcG9uc2UpIHsKKyAgICAgICAgICAgIExPR0dFUi5pbmZvKCJBc3luYyBsb25nLXJ1bm5pbmcgZ2V0IHdpdGggdGltZW91dCBjYWxsZWQgb24gdGhyZWFkICIgKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBhc3luY1Jlc3BvbnNlLnNldFRpbWVvdXRIYW5kbGVyKG5ldyBUaW1lb3V0SGFuZGxlcigpIHsKKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZVRpbWVvdXQoQXN5bmNSZXNwb25zZSBhc3luY1Jlc3BvbnNlKSB7CisgICAgICAgICAgICAgICAgICAgIGFzeW5jUmVzcG9uc2UucmVzdW1lKFJlc3BvbnNlLnN0YXR1cyhSZXNwb25zZS5TdGF0dXMuU0VSVklDRV9VTkFWQUlMQUJMRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZW50aXR5KCJPcGVyYXRpb24gdGltZSBvdXQuIikuYnVpbGQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBhc3luY1Jlc3BvbnNlLnNldFRpbWVvdXQoMSwgVGltZVVuaXQuU0VDT05EUyk7CisKKyAgICAgICAgICAgIG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gdmVyeUV4cGVuc2l2ZU9wZXJhdGlvbigpOworICAgICAgICAgICAgICAgICAgICBhc3luY1Jlc3BvbnNlLnJlc3VtZShyZXN1bHQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByaXZhdGUgU3RyaW5nIHZlcnlFeHBlbnNpdmVPcGVyYXRpb24oKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHZlcnkgZXhwZW5zaXZlIG9wZXJhdGlvbiB0aGF0IHR5cGljYWxseSBmaW5pc2hlcyB3aXRoaW4gMSBzZWNvbmQgYnV0IGNhbiB0YWtlIHVwIHRvIDUgc2Vjb25kcywKKyAgICAgICAgICAgICAgICAgICAgLy8gc2ltdWxhdGVkIHVzaW5nIHNsZWVwKCkKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCg1ICogT1BFUkFUSU9OX0RVUkFUSU9OKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRE9ORSI7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIklOVEVSUlVQVEVEIjsKKyAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi5pbmZvKCJBc3luYyBsb25nLXJ1bm5pbmcgZ2V0IHdpdGggdGltZW91dCBmaW5pc2hlZCBvbiB0aHJlYWQgIiArIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pLnN0YXJ0KCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoQXN5bmNSZXNvdXJjZS5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIobmV3IExvZ2dpbmdGZWF0dXJlKExPR0dFUiwgTG9nZ2luZ0ZlYXR1cmUuVmVyYm9zaXR5LlBBWUxPQURfQU5ZKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKG5ldyBMb2dnaW5nRmVhdHVyZShMT0dHRVIsIExvZ2dpbmdGZWF0dXJlLlZlcmJvc2l0eS5QQVlMT0FEX0FOWSkpOworICAgICAgICBjb25maWcuY29ubmVjdG9yUHJvdmlkZXIobmV3IEFwYWNoZUNvbm5lY3RvclByb3ZpZGVyKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgYXN5bmNocm9ub3VzIFBPU1QuCisgICAgICoKKyAgICAgKiBTZW5kIDMgYXN5bmMgUE9TVCByZXF1ZXN0cyBhbmQgd2FpdCB0byByZWNlaXZlIHRoZSByZXNwb25zZXMuIENoZWNrIHRoZSByZXNwb25zZSBjb250ZW50IGFuZAorICAgICAqIGFzc2VydCB0aGF0IHRoZSBvcGVyYXRpb24gZGlkIG5vdCB0YWtlIG1vcmUgdGhhbiB0d2ljZSBhcyBsb25nIGFzIGEgc2luZ2xlIGxvbmcgb3BlcmF0aW9uIGR1cmF0aW9uCisgICAgICogKHRoaXMgZW5zdXJlcyBhc3luYyByZXF1ZXN0IGV4ZWN1dGlvbikuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGVzdCBlcnJvci4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luY1Bvc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgbG9uZyB0aWMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgICAgICAvLyBTdWJtaXQgcmVxdWVzdHMgYXN5bmNocm9ub3VzbHkuCisgICAgICAgIGZpbmFsIEZ1dHVyZTxSZXNwb25zZT4gcmYxID0gdGFyZ2V0KFBBVEgpLnJlcXVlc3QoKS5hc3luYygpLnBvc3QoRW50aXR5LnRleHQoIjEiKSk7CisgICAgICAgIGZpbmFsIEZ1dHVyZTxSZXNwb25zZT4gcmYyID0gdGFyZ2V0KFBBVEgpLnJlcXVlc3QoKS5hc3luYygpLnBvc3QoRW50aXR5LnRleHQoIjIiKSk7CisgICAgICAgIGZpbmFsIEZ1dHVyZTxSZXNwb25zZT4gcmYzID0gdGFyZ2V0KFBBVEgpLnJlcXVlc3QoKS5hc3luYygpLnBvc3QoRW50aXR5LnRleHQoIjMiKSk7CisgICAgICAgIC8vIGdldCgpIHdhaXRzIGZvciB0aGUgcmVzcG9uc2UKKworICAgICAgICAvLyB3b3JrYXJvdW5kIGZvciBBSEMgZGVmYXVsdCBjb25uZWN0aW9uIG1hbmFnZXIgbGltaXRhdGlvbiBvZgorICAgICAgICAvLyBvbmx5IDIgb3BlbiBjb25uZWN0aW9ucyBwZXIgaG9zdCB0aGF0IG1heSBpbnRlcm1pdHRlbnRseSBibG9jaworICAgICAgICAvLyB0aGUgdGVzdAorICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgzKTsKKyAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbCgzKTsKKworICAgICAgICBmaW5hbCBGdXR1cmU8U3RyaW5nPiByMSA9IGV4ZWN1dG9yLnN1Ym1pdChuZXcgQ2FsbGFibGU8U3RyaW5nPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBjYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJmMS5nZXQoKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgZmluYWwgRnV0dXJlPFN0cmluZz4gcjIgPSBleGVjdXRvci5zdWJtaXQobmV3IENhbGxhYmxlPFN0cmluZz4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgY2FsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZjIuZ2V0KCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIGZpbmFsIEZ1dHVyZTxTdHJpbmc+IHIzID0gZXhlY3V0b3Iuc3VibWl0KG5ldyBDYWxsYWJsZTxTdHJpbmc+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmYzLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIGFzc2VydFRydWUoIldhaXRpbmcgZm9yIHJlc3VsdHMgaGFzIHRpbWVkIG91dC4iLCBsYXRjaC5hd2FpdCg1ICogZ2V0QXN5bmNUaW1lb3V0TXVsdGlwbGllcigpLCBUaW1lVW5pdC5TRUNPTkRTKSk7CisgICAgICAgIGZpbmFsIGxvbmcgdG9jID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJET05FLTEiLCByMS5nZXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiRE9ORS0yIiwgcjIuZ2V0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkRPTkUtMyIsIHIzLmdldCgpKTsKKworICAgICAgICBmaW5hbCBpbnQgYXN5bmNUaW1lb3V0TXVsdGlwbGllciA9IGdldEFzeW5jVGltZW91dE11bHRpcGxpZXIoKTsKKyAgICAgICAgTE9HR0VSLmluZm8oIlVzaW5nIGFzeW5jIHRpbWVvdXQgbXVsdGlwbGllcjogIiArIGFzeW5jVGltZW91dE11bHRpcGxpZXIpOworICAgICAgICBhc3NlcnRUaGF0KCJBc3luYyBwcm9jZXNzaW5nIHRvb2sgdG9vIGxvbmcuIiwgdG9jIC0gdGljLCBNYXRjaGVycy5sZXNzVGhhbig0ICogQXN5bmNSZXNvdXJjZS5PUEVSQVRJT05fRFVSQVRJT04KKyAgICAgICAgICAgICAgICAqIGFzeW5jVGltZW91dE11bHRpcGxpZXIpKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgYWNjZXNzaW5nIGFuIG9wZXJhdGlvbiB0aGF0IHRpbWVzIG91dCBvbiB0aGUgc2VydmVyLgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRlc3QgZXJyb3IuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNHZXRXaXRoVGltZW91dCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBGdXR1cmU8UmVzcG9uc2U+IHJlc3BvbnNlRnV0dXJlID0gdGFyZ2V0KFBBVEgpLnBhdGgoInRpbWVvdXQiKS5yZXF1ZXN0KCkuYXN5bmMoKS5nZXQoKTsKKyAgICAgICAgLy8gUmVxdWVzdCBpcyBiZWluZyBwcm9jZXNzZWQgYXN5bmNocm9ub3VzbHkuCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gcmVzcG9uc2VGdXR1cmUuZ2V0KCk7CisKKyAgICAgICAgLy8gZ2V0KCkgd2FpdHMgZm9yIHRoZSByZXNwb25zZQorICAgICAgICBhc3NlcnRFcXVhbHMoNTAzLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiT3BlcmF0aW9uIHRpbWUgb3V0LiIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9hcGFjaGUtY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvYXBhY2hlL2Nvbm5lY3Rvci9BdXRoVGVzdC5qYXZhIGIvY29ubmVjdG9ycy9hcGFjaGUtY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvYXBhY2hlL2Nvbm5lY3Rvci9BdXRoVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhOTgxMzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL2FwYWNoZS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9hcGFjaGUvY29ubmVjdG9yL0F1dGhUZXN0LmphdmEKQEAgLTAsMCArMSwzNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuYXBhY2hlLmNvbm5lY3RvcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkRFTEVURTsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5hdXRoZW50aWNhdGlvbi5IdHRwQXV0aGVudGljYXRpb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuYXV0aC5BdXRoU2NvcGU7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmF1dGguVXNlcm5hbWVQYXNzd29yZENyZWRlbnRpYWxzOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQuQ3JlZGVudGlhbHNQcm92aWRlcjsKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBBcnVsIERoZXNpYXNlZWxhbiAoYXJ1bGQgYXQgYWNtLm9yZykKKyAqLworcHVibGljIGNsYXNzIEF1dGhUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFByZWVtcHRpdmVBdXRoUmVzb3VyY2UuY2xhc3MsIEF1dGhSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHJlZW1wdGl2ZUF1dGhSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldChAQ29udGV4dCBIdHRwSGVhZGVycyBoKSB7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBoLmdldFJlcXVlc3RIZWFkZXJzKCkuZ2V0Rmlyc3QoIkF1dGhvcml6YXRpb24iKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwodmFsdWUpOworICAgICAgICAgICAgcmV0dXJuICJHRVQiOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0KEBDb250ZXh0IEh0dHBIZWFkZXJzIGgsIFN0cmluZyBlKSB7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBoLmdldFJlcXVlc3RIZWFkZXJzKCkuZ2V0Rmlyc3QoIkF1dGhvcml6YXRpb24iKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwodmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVlbXB0aXZlQXV0aCgpIHsKKyAgICAgICAgQ3JlZGVudGlhbHNQcm92aWRlciBjcmVkZW50aWFsc1Byb3ZpZGVyID0gbmV3IG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudC5CYXNpY0NyZWRlbnRpYWxzUHJvdmlkZXIoKTsKKyAgICAgICAgY3JlZGVudGlhbHNQcm92aWRlci5zZXRDcmVkZW50aWFscygKKyAgICAgICAgICAgICAgICBBdXRoU2NvcGUuQU5ZLAorICAgICAgICAgICAgICAgIG5ldyBVc2VybmFtZVBhc3N3b3JkQ3JlZGVudGlhbHMoIm5hbWUiLCAicGFzc3dvcmQiKQorICAgICAgICApOworCisgICAgICAgIENsaWVudENvbmZpZyBjYyA9IG5ldyBDbGllbnRDb25maWcoKTsKKyAgICAgICAgY2MucHJvcGVydHkoQXBhY2hlQ2xpZW50UHJvcGVydGllcy5DUkVERU5USUFMU19QUk9WSURFUiwgY3JlZGVudGlhbHNQcm92aWRlcikKKyAgICAgICAgICAgICAgICAucHJvcGVydHkoQXBhY2hlQ2xpZW50UHJvcGVydGllcy5QUkVFTVBUSVZFX0JBU0lDX0FVVEhFTlRJQ0FUSU9OLCB0cnVlKTsKKyAgICAgICAgY2MuY29ubmVjdG9yUHJvdmlkZXIobmV3IEFwYWNoZUNvbm5lY3RvclByb3ZpZGVyKCkpOworICAgICAgICBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoY2MpOworCisgICAgICAgIFdlYlRhcmdldCByID0gY2xpZW50LnRhcmdldChnZXRCYXNlVXJpKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCIsIHIucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVlbXB0aXZlQXV0aFBvc3QoKSB7CisgICAgICAgIENyZWRlbnRpYWxzUHJvdmlkZXIgY3JlZGVudGlhbHNQcm92aWRlciA9IG5ldyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jbGllbnQuQmFzaWNDcmVkZW50aWFsc1Byb3ZpZGVyKCk7CisgICAgICAgIGNyZWRlbnRpYWxzUHJvdmlkZXIuc2V0Q3JlZGVudGlhbHMoCisgICAgICAgICAgICAgICAgQXV0aFNjb3BlLkFOWSwKKyAgICAgICAgICAgICAgICBuZXcgVXNlcm5hbWVQYXNzd29yZENyZWRlbnRpYWxzKCJuYW1lIiwgInBhc3N3b3JkIikKKyAgICAgICAgKTsKKworICAgICAgICBDbGllbnRDb25maWcgY2MgPSBuZXcgQ2xpZW50Q29uZmlnKCk7CisgICAgICAgIGNjLnByb3BlcnR5KEFwYWNoZUNsaWVudFByb3BlcnRpZXMuQ1JFREVOVElBTFNfUFJPVklERVIsIGNyZWRlbnRpYWxzUHJvdmlkZXIpCisgICAgICAgICAgICAgICAgLnByb3BlcnR5KEFwYWNoZUNsaWVudFByb3BlcnRpZXMuUFJFRU1QVElWRV9CQVNJQ19BVVRIRU5USUNBVElPTiwgdHJ1ZSk7CisgICAgICAgIGNjLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBBcGFjaGVDb25uZWN0b3JQcm92aWRlcigpKTsKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KGNjKTsKKworICAgICAgICBXZWJUYXJnZXQgciA9IGNsaWVudC50YXJnZXQoZ2V0QmFzZVVyaSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJQT1NUIiwgci5yZXF1ZXN0KCkucG9zdChFbnRpdHkudGV4dCgiUE9TVCIpLCBTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiL3Rlc3QiKQorICAgIEBTaW5nbGV0b24KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEF1dGhSZXNvdXJjZSB7CisKKyAgICAgICAgaW50IHJlcXVlc3RDb3VudCA9IDA7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldChAQ29udGV4dCBIdHRwSGVhZGVycyBoKSB7CisgICAgICAgICAgICByZXF1ZXN0Q291bnQrKzsKKyAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGguZ2V0UmVxdWVzdEhlYWRlcnMoKS5nZXRGaXJzdCgiQXV0aG9yaXphdGlvbiIpOworICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVxdWVzdENvdW50KTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViQXBwbGljYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBSZXNwb25zZS5zdGF0dXMoNDAxKS5oZWFkZXIoIldXVy1BdXRoZW50aWNhdGUiLCAiQmFzaWMgcmVhbG09XCJXYWxseVdvcmxkXCIiKS5idWlsZCgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXF1ZXN0Q291bnQgPiAxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuICJHRVQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiZmlsdGVyIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRGaWx0ZXIoQENvbnRleHQgSHR0cEhlYWRlcnMgaCkgeworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gaC5nZXRSZXF1ZXN0SGVhZGVycygpLmdldEZpcnN0KCJBdXRob3JpemF0aW9uIik7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlLnN0YXR1cyg0MDEpLmhlYWRlcigiV1dXLUF1dGhlbnRpY2F0ZSIsICJCYXNpYyByZWFsbT1cIldhbGx5V29ybGRcIiIpLmJ1aWxkKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gIkdFVCI7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3QoQENvbnRleHQgSHR0cEhlYWRlcnMgaCwgU3RyaW5nIGUpIHsKKyAgICAgICAgICAgIHJlcXVlc3RDb3VudCsrOworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gaC5nZXRSZXF1ZXN0SGVhZGVycygpLmdldEZpcnN0KCJBdXRob3JpemF0aW9uIik7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCByZXF1ZXN0Q291bnQpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlLnN0YXR1cyg0MDEpLmhlYWRlcigiV1dXLUF1dGhlbnRpY2F0ZSIsICJCYXNpYyByZWFsbT1cIldhbGx5V29ybGRcIiIpLmJ1aWxkKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHJlcXVlc3RDb3VudCA+IDEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJmaWx0ZXIiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3RGaWx0ZXIoQENvbnRleHQgSHR0cEhlYWRlcnMgaCwgU3RyaW5nIGUpIHsKKyAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGguZ2V0UmVxdWVzdEhlYWRlcnMoKS5nZXRGaXJzdCgiQXV0aG9yaXphdGlvbiIpOworICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViQXBwbGljYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBSZXNwb25zZS5zdGF0dXMoNDAxKS5oZWFkZXIoIldXVy1BdXRoZW50aWNhdGUiLCAiQmFzaWMgcmVhbG09XCJXYWxseVdvcmxkXCIiKS5idWlsZCgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGU7CisgICAgICAgIH0KKworICAgICAgICBAREVMRVRFCisgICAgICAgIHB1YmxpYyB2b2lkIGRlbGV0ZShAQ29udGV4dCBIdHRwSGVhZGVycyBoKSB7CisgICAgICAgICAgICByZXF1ZXN0Q291bnQrKzsKKyAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGguZ2V0UmVxdWVzdEhlYWRlcnMoKS5nZXRGaXJzdCgiQXV0aG9yaXphdGlvbiIpOworICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVxdWVzdENvdW50KTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViQXBwbGljYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBSZXNwb25zZS5zdGF0dXMoNDAxKS5oZWFkZXIoIldXVy1BdXRoZW50aWNhdGUiLCAiQmFzaWMgcmVhbG09XCJXYWxseVdvcmxkXCIiKS5idWlsZCgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZXF1ZXN0Q291bnQgPiAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBERUxFVEUKKyAgICAgICAgQFBhdGgoImZpbHRlciIpCisgICAgICAgIHB1YmxpYyB2b2lkIGRlbGV0ZUZpbHRlcihAQ29udGV4dCBIdHRwSGVhZGVycyBoKSB7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBoLmdldFJlcXVlc3RIZWFkZXJzKCkuZ2V0Rmlyc3QoIkF1dGhvcml6YXRpb24iKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2Uuc3RhdHVzKDQwMSkuaGVhZGVyKCJXV1ctQXV0aGVudGljYXRlIiwgIkJhc2ljIHJlYWxtPVwiV2FsbHlXb3JsZFwiIikuYnVpbGQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAREVMRVRFCisgICAgICAgIEBQYXRoKCJmaWx0ZXIvd2l0aEVudGl0eSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZGVsZXRlRmlsdGVyV2l0aEVudGl0eShAQ29udGV4dCBIdHRwSGVhZGVycyBoLCBTdHJpbmcgZSkgeworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gaC5nZXRSZXF1ZXN0SGVhZGVycygpLmdldEZpcnN0KCJBdXRob3JpemF0aW9uIik7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlLnN0YXR1cyg0MDEpLmhlYWRlcigiV1dXLUF1dGhlbnRpY2F0ZSIsICJCYXNpYyByZWFsbT1cIldhbGx5V29ybGRcIiIpLmJ1aWxkKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEF1dGhHZXQoKSB7CisgICAgICAgIENyZWRlbnRpYWxzUHJvdmlkZXIgY3JlZGVudGlhbHNQcm92aWRlciA9IG5ldyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jbGllbnQuQmFzaWNDcmVkZW50aWFsc1Byb3ZpZGVyKCk7CisgICAgICAgIGNyZWRlbnRpYWxzUHJvdmlkZXIuc2V0Q3JlZGVudGlhbHMoCisgICAgICAgICAgICAgICAgQXV0aFNjb3BlLkFOWSwKKyAgICAgICAgICAgICAgICBuZXcgVXNlcm5hbWVQYXNzd29yZENyZWRlbnRpYWxzKCJuYW1lIiwgInBhc3N3b3JkIikKKyAgICAgICAgKTsKKworICAgICAgICBDbGllbnRDb25maWcgY2MgPSBuZXcgQ2xpZW50Q29uZmlnKCk7CisgICAgICAgIGNjLnByb3BlcnR5KEFwYWNoZUNsaWVudFByb3BlcnRpZXMuQ1JFREVOVElBTFNfUFJPVklERVIsIGNyZWRlbnRpYWxzUHJvdmlkZXIpOworICAgICAgICBjYy5jb25uZWN0b3JQcm92aWRlcihuZXcgQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgICAgIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudChjYyk7CisgICAgICAgIFdlYlRhcmdldCByID0gY2xpZW50LnRhcmdldChnZXRCYXNlVXJpKCkpLnBhdGgoInRlc3QiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCIsIHIucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRoR2V0V2l0aFJlcXVlc3RDcmVkZW50aWFsc1Byb3ZpZGVyKCkgeworICAgICAgICBDcmVkZW50aWFsc1Byb3ZpZGVyIGNyZWRlbnRpYWxzUHJvdmlkZXIgPSBuZXcgb3JnLmFwYWNoZS5odHRwLmltcGwuY2xpZW50LkJhc2ljQ3JlZGVudGlhbHNQcm92aWRlcigpOworICAgICAgICBjcmVkZW50aWFsc1Byb3ZpZGVyLnNldENyZWRlbnRpYWxzKAorICAgICAgICAgICAgICAgIEF1dGhTY29wZS5BTlksCisgICAgICAgICAgICAgICAgbmV3IFVzZXJuYW1lUGFzc3dvcmRDcmVkZW50aWFscygibmFtZSIsICJwYXNzd29yZCIpCisgICAgICAgICk7CisKKyAgICAgICAgQ2xpZW50Q29uZmlnIGNjID0gbmV3IENsaWVudENvbmZpZygpOworICAgICAgICBjYy5jb25uZWN0b3JQcm92aWRlcihuZXcgQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgICAgIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudChjYyk7CisgICAgICAgIFdlYlRhcmdldCByID0gY2xpZW50LnRhcmdldChnZXRCYXNlVXJpKCkpLnBhdGgoInRlc3QiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCIsCisgICAgICAgICAgICAgICAgICAgICByLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShBcGFjaGVDbGllbnRQcm9wZXJ0aWVzLkNSRURFTlRJQUxTX1BST1ZJREVSLCBjcmVkZW50aWFsc1Byb3ZpZGVyKQorICAgICAgICAgICAgICAgICAgICAgIC5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0aEdldFdpdGhDbGllbnRGaWx0ZXIoKSB7CisgICAgICAgIENsaWVudENvbmZpZyBjYyA9IG5ldyBDbGllbnRDb25maWcoKTsKKyAgICAgICAgY2MuY29ubmVjdG9yUHJvdmlkZXIobmV3IEFwYWNoZUNvbm5lY3RvclByb3ZpZGVyKCkpOworICAgICAgICBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoY2MpOworICAgICAgICBjbGllbnQucmVnaXN0ZXIoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5iYXNpYygibmFtZSIsICJwYXNzd29yZCIpKTsKKyAgICAgICAgV2ViVGFyZ2V0IHIgPSBjbGllbnQudGFyZ2V0KGdldEJhc2VVcmkoKSkucGF0aCgidGVzdC9maWx0ZXIiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCIsIHIucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBJZ25vcmUoIkpFUlNFWS0xNzUwOiBDYW5ub3QgcmV0cnkgcmVxdWVzdCB3aXRoIGEgbm9uLXJlcGVhdGFibGUgcmVxdWVzdCBlbnRpdHkuIEhvdyB0byBidWZmZXIgdGhlIGVudGl0eT8iCisgICAgICAgICAgICArICIgQWxsb3cgcmVwZWF0YWJsZSB3cml0ZSBpbiBqZXJzZXk/IikKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0aFBvc3QoKSB7CisgICAgICAgIENyZWRlbnRpYWxzUHJvdmlkZXIgY3JlZGVudGlhbHNQcm92aWRlciA9IG5ldyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jbGllbnQuQmFzaWNDcmVkZW50aWFsc1Byb3ZpZGVyKCk7CisgICAgICAgIGNyZWRlbnRpYWxzUHJvdmlkZXIuc2V0Q3JlZGVudGlhbHMoCisgICAgICAgICAgICAgICAgQXV0aFNjb3BlLkFOWSwKKyAgICAgICAgICAgICAgICBuZXcgVXNlcm5hbWVQYXNzd29yZENyZWRlbnRpYWxzKCJuYW1lIiwgInBhc3N3b3JkIikKKyAgICAgICAgKTsKKworICAgICAgICBDbGllbnRDb25maWcgY2MgPSBuZXcgQ2xpZW50Q29uZmlnKCk7CisgICAgICAgIGNjLnByb3BlcnR5KEFwYWNoZUNsaWVudFByb3BlcnRpZXMuQ1JFREVOVElBTFNfUFJPVklERVIsIGNyZWRlbnRpYWxzUHJvdmlkZXIpOworICAgICAgICBjYy5jb25uZWN0b3JQcm92aWRlcihuZXcgQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgICAgIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudChjYyk7CisgICAgICAgIFdlYlRhcmdldCByID0gY2xpZW50LnRhcmdldChnZXRCYXNlVXJpKCkpLnBhdGgoInRlc3QiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIlBPU1QiLCByLnJlcXVlc3QoKS5wb3N0KEVudGl0eS50ZXh0KCJQT1NUIiksIFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEF1dGhQb3N0V2l0aENsaWVudEZpbHRlcigpIHsKKyAgICAgICAgQ2xpZW50Q29uZmlnIGNjID0gbmV3IENsaWVudENvbmZpZygpOworICAgICAgICBjYy5jb25uZWN0b3JQcm92aWRlcihuZXcgQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgICAgIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudChjYyk7CisgICAgICAgIGNsaWVudC5yZWdpc3RlcihIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLmJhc2ljKCJuYW1lIiwgInBhc3N3b3JkIikpOworICAgICAgICBXZWJUYXJnZXQgciA9IGNsaWVudC50YXJnZXQoZ2V0QmFzZVVyaSgpKS5wYXRoKCJ0ZXN0L2ZpbHRlciIpOworCisgICAgICAgIGFzc2VydEVxdWFscygiUE9TVCIsIHIucmVxdWVzdCgpLnBvc3QoRW50aXR5LnRleHQoIlBPU1QiKSwgU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0aERlbGV0ZSgpIHsKKyAgICAgICAgQ3JlZGVudGlhbHNQcm92aWRlciBjcmVkZW50aWFsc1Byb3ZpZGVyID0gbmV3IG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudC5CYXNpY0NyZWRlbnRpYWxzUHJvdmlkZXIoKTsKKyAgICAgICAgY3JlZGVudGlhbHNQcm92aWRlci5zZXRDcmVkZW50aWFscygKKyAgICAgICAgICAgICAgICBBdXRoU2NvcGUuQU5ZLAorICAgICAgICAgICAgICAgIG5ldyBVc2VybmFtZVBhc3N3b3JkQ3JlZGVudGlhbHMoIm5hbWUiLCAicGFzc3dvcmQiKQorICAgICAgICApOworICAgICAgICBDbGllbnRDb25maWcgY2MgPSBuZXcgQ2xpZW50Q29uZmlnKCk7CisgICAgICAgIGNjLnByb3BlcnR5KEFwYWNoZUNsaWVudFByb3BlcnRpZXMuQ1JFREVOVElBTFNfUFJPVklERVIsIGNyZWRlbnRpYWxzUHJvdmlkZXIpOworICAgICAgICBjYy5jb25uZWN0b3JQcm92aWRlcihuZXcgQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgICAgIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudChjYyk7CisgICAgICAgIFdlYlRhcmdldCByID0gY2xpZW50LnRhcmdldChnZXRCYXNlVXJpKCkpLnBhdGgoInRlc3QiKTsKKworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHIucmVxdWVzdCgpLmRlbGV0ZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMocmVzcG9uc2UuZ2V0U3RhdHVzKCksIDIwNCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0aERlbGV0ZVdpdGhDbGllbnRGaWx0ZXIoKSB7CisgICAgICAgIENsaWVudENvbmZpZyBjYyA9IG5ldyBDbGllbnRDb25maWcoKTsKKyAgICAgICAgY2MuY29ubmVjdG9yUHJvdmlkZXIobmV3IEFwYWNoZUNvbm5lY3RvclByb3ZpZGVyKCkpOworICAgICAgICBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoY2MpOworICAgICAgICBjbGllbnQucmVnaXN0ZXIoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5iYXNpYygibmFtZSIsICJwYXNzd29yZCIpKTsKKyAgICAgICAgV2ViVGFyZ2V0IHIgPSBjbGllbnQudGFyZ2V0KGdldEJhc2VVcmkoKSkucGF0aCgidGVzdC9maWx0ZXIiKTsKKworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHIucmVxdWVzdCgpLmRlbGV0ZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjA0LCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0aEludGVyYWN0aXZlR2V0KCkgeworICAgICAgICBDcmVkZW50aWFsc1Byb3ZpZGVyIGNyZWRlbnRpYWxzUHJvdmlkZXIgPSBuZXcgb3JnLmFwYWNoZS5odHRwLmltcGwuY2xpZW50LkJhc2ljQ3JlZGVudGlhbHNQcm92aWRlcigpOworICAgICAgICBjcmVkZW50aWFsc1Byb3ZpZGVyLnNldENyZWRlbnRpYWxzKAorICAgICAgICAgICAgICAgIEF1dGhTY29wZS5BTlksCisgICAgICAgICAgICAgICAgbmV3IFVzZXJuYW1lUGFzc3dvcmRDcmVkZW50aWFscygibmFtZSIsICJwYXNzd29yZCIpCisgICAgICAgICk7CisgICAgICAgIENsaWVudENvbmZpZyBjYyA9IG5ldyBDbGllbnRDb25maWcoKTsKKyAgICAgICAgY2MucHJvcGVydHkoQXBhY2hlQ2xpZW50UHJvcGVydGllcy5DUkVERU5USUFMU19QUk9WSURFUiwgY3JlZGVudGlhbHNQcm92aWRlcik7CisgICAgICAgIGNjLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBBcGFjaGVDb25uZWN0b3JQcm92aWRlcigpKTsKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KGNjKTsKKworICAgICAgICBXZWJUYXJnZXQgciA9IGNsaWVudC50YXJnZXQoZ2V0QmFzZVVyaSgpKS5wYXRoKCJ0ZXN0Iik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJHRVQiLCByLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBASWdub3JlKCJKRVJTRVktMTc1MDogQ2Fubm90IHJldHJ5IHJlcXVlc3Qgd2l0aCBhIG5vbi1yZXBlYXRhYmxlIHJlcXVlc3QgZW50aXR5LiBIb3cgdG8gYnVmZmVyIHRoZSBlbnRpdHk/IgorICAgICAgICAgICAgKyAiIEFsbG93IHJlcGVhdGFibGUgd3JpdGUgaW4gamVyc2V5PyIpCisgICAgcHVibGljIHZvaWQgdGVzdEF1dGhJbnRlcmFjdGl2ZVBvc3QoKSB7CisgICAgICAgIENyZWRlbnRpYWxzUHJvdmlkZXIgY3JlZGVudGlhbHNQcm92aWRlciA9IG5ldyBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jbGllbnQuQmFzaWNDcmVkZW50aWFsc1Byb3ZpZGVyKCk7CisgICAgICAgIGNyZWRlbnRpYWxzUHJvdmlkZXIuc2V0Q3JlZGVudGlhbHMoCisgICAgICAgICAgICAgICAgQXV0aFNjb3BlLkFOWSwKKyAgICAgICAgICAgICAgICBuZXcgVXNlcm5hbWVQYXNzd29yZENyZWRlbnRpYWxzKCJuYW1lIiwgInBhc3N3b3JkIikKKyAgICAgICAgKTsKKworICAgICAgICBDbGllbnRDb25maWcgY2MgPSBuZXcgQ2xpZW50Q29uZmlnKCk7CisgICAgICAgIGNjLnByb3BlcnR5KEFwYWNoZUNsaWVudFByb3BlcnRpZXMuQ1JFREVOVElBTFNfUFJPVklERVIsIGNyZWRlbnRpYWxzUHJvdmlkZXIpOworICAgICAgICBjYy5jb25uZWN0b3JQcm92aWRlcihuZXcgQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgICAgIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudChjYyk7CisgICAgICAgIFdlYlRhcmdldCByID0gY2xpZW50LnRhcmdldChnZXRCYXNlVXJpKCkpLnBhdGgoInRlc3QiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIlBPU1QiLCByLnJlcXVlc3QoKS5wb3N0KEVudGl0eS50ZXh0KCJQT1NUIiksIFN0cmluZy5jbGFzcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvYXBhY2hlLWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2FwYWNoZS9jb25uZWN0b3IvQ29va2llVGVzdC5qYXZhIGIvY29ubmVjdG9ycy9hcGFjaGUtY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvYXBhY2hlL2Nvbm5lY3Rvci9Db29raWVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM4N2ZjZQotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvYXBhY2hlLWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2FwYWNoZS9jb25uZWN0b3IvQ29va2llVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmFwYWNoZS5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db29raWU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk5ld0Nvb2tpZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuSmVyc2V5Q2xpZW50OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5KZXJzZXlDbGllbnRCdWlsZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBBcnVsIERoZXNpYXNlZWxhbiAoYXJ1bGQgYXQgYWNtLm9yZykKKyAqLworcHVibGljIGNsYXNzIENvb2tpZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvb2tpZVJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXQoQENvbnRleHQgSHR0cEhlYWRlcnMgaCkgeworICAgICAgICAgICAgQ29va2llIGMgPSBoLmdldENvb2tpZXMoKS5nZXQoIm5hbWUiKTsKKyAgICAgICAgICAgIFN0cmluZyBlID0gKGMgPT0gbnVsbCkgPyAiTk8tQ09PS0lFIiA6IGMuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vayhlKQorICAgICAgICAgICAgICAgICAgICAuY29va2llKG5ldyBOZXdDb29raWUoIm5hbWUiLCAidmFsdWUiKSkuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoQ29va2llUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvb2tpZVJlc291cmNlKCkgeworICAgICAgICBDbGllbnRDb25maWcgY2MgPSBuZXcgQ2xpZW50Q29uZmlnKCk7CisgICAgICAgIGNjLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBBcGFjaGVDb25uZWN0b3JQcm92aWRlcigpKTsKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KGNjKTsKKyAgICAgICAgV2ViVGFyZ2V0IHIgPSBjbGllbnQudGFyZ2V0KGdldEJhc2VVcmkoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJOTy1DT09LSUUiLCByLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidmFsdWUiLCByLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZWRDb29raWVzKCkgeworICAgICAgICBDbGllbnRDb25maWcgY2MgPSBuZXcgQ2xpZW50Q29uZmlnKCk7CisgICAgICAgIGNjLnByb3BlcnR5KEFwYWNoZUNsaWVudFByb3BlcnRpZXMuRElTQUJMRV9DT09LSUVTLCB0cnVlKTsKKyAgICAgICAgY2MuY29ubmVjdG9yUHJvdmlkZXIobmV3IEFwYWNoZUNvbm5lY3RvclByb3ZpZGVyKCkpOworICAgICAgICBKZXJzZXlDbGllbnQgY2xpZW50ID0gSmVyc2V5Q2xpZW50QnVpbGRlci5jcmVhdGVDbGllbnQoY2MpOworICAgICAgICBXZWJUYXJnZXQgciA9IGNsaWVudC50YXJnZXQoZ2V0QmFzZVVyaSgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIk5PLUNPT0tJRSIsIHIucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJOTy1DT09LSUUiLCByLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgZmluYWwgQXBhY2hlQ29ubmVjdG9yIGNvbm5lY3RvciA9IChBcGFjaGVDb25uZWN0b3IpIGNsaWVudC5nZXRDb25maWd1cmF0aW9uKCkuZ2V0Q29ubmVjdG9yKCk7CisgICAgICAgIGlmIChjb25uZWN0b3IuZ2V0Q29va2llU3RvcmUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGNvbm5lY3Rvci5nZXRDb29raWVTdG9yZSgpLmdldENvb2tpZXMoKS5pc0VtcHR5KCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0TnVsbChjb25uZWN0b3IuZ2V0Q29va2llU3RvcmUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb29raWVzKCkgeworICAgICAgICBDbGllbnRDb25maWcgY2MgPSBuZXcgQ2xpZW50Q29uZmlnKCk7CisgICAgICAgIGNjLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBBcGFjaGVDb25uZWN0b3JQcm92aWRlcigpKTsKKyAgICAgICAgSmVyc2V5Q2xpZW50IGNsaWVudCA9IEplcnNleUNsaWVudEJ1aWxkZXIuY3JlYXRlQ2xpZW50KGNjKTsKKyAgICAgICAgV2ViVGFyZ2V0IHIgPSBjbGllbnQudGFyZ2V0KGdldEJhc2VVcmkoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJOTy1DT09LSUUiLCByLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidmFsdWUiLCByLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgZmluYWwgQXBhY2hlQ29ubmVjdG9yIGNvbm5lY3RvciA9IChBcGFjaGVDb25uZWN0b3IpIGNsaWVudC5nZXRDb25maWd1cmF0aW9uKCkuZ2V0Q29ubmVjdG9yKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY29ubmVjdG9yLmdldENvb2tpZVN0b3JlKCkuZ2V0Q29va2llcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNvbm5lY3Rvci5nZXRDb29raWVTdG9yZSgpLmdldENvb2tpZXMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlIiwgY29ubmVjdG9yLmdldENvb2tpZVN0b3JlKCkuZ2V0Q29va2llcygpLmdldCgwKS5nZXRWYWx1ZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2FwYWNoZS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9hcGFjaGUvY29ubmVjdG9yL0N1c3RvbUxvZ2dpbmdGaWx0ZXIuamF2YSBiL2Nvbm5lY3RvcnMvYXBhY2hlLWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2FwYWNoZS9jb25uZWN0b3IvQ3VzdG9tTG9nZ2luZ0ZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2YzQyNTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL2FwYWNoZS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9hcGFjaGUvY29ubmVjdG9yL0N1c3RvbUxvZ2dpbmdGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmFwYWNoZS5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXNwb25zZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlc3BvbnNlRmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUZpbHRlcjsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBDdXN0b20gbG9nZ2luZyBmaWx0ZXIuCisgKgorICogQGF1dGhvciBTYW50aWFnbyBQZXJpY2FzLUdlZXJ0c2VuIChzYW50aWFnby5wZXJpY2FzZ2VlcnRzZW4gYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEN1c3RvbUxvZ2dpbmdGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyLCBDb250YWluZXJSZXNwb25zZUZpbHRlciwKKyAgICAgICAgQ2xpZW50UmVxdWVzdEZpbHRlciwgQ2xpZW50UmVzcG9uc2VGaWx0ZXIgeworCisgICAgc3RhdGljIGludCBwcmVGaWx0ZXJDYWxsZWQgPSAwOworICAgIHN0YXRpYyBpbnQgcG9zdEZpbHRlckNhbGxlZCA9IDA7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ2xpZW50UmVxdWVzdENvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDdXN0b21Mb2dnaW5nRmlsdGVyLnByZUZpbHRlciBjYWxsZWQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnRleHQuZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnR5KCJmb28iKSwgImJhciIpOworICAgICAgICBwcmVGaWx0ZXJDYWxsZWQrKzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ2xpZW50UmVxdWVzdENvbnRleHQgY29udGV4dCwgQ2xpZW50UmVzcG9uc2VDb250ZXh0IGNsaWVudFJlc3BvbnNlQ29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDdXN0b21Mb2dnaW5nRmlsdGVyLnBvc3RGaWx0ZXIgY2FsbGVkIik7CisgICAgICAgIGFzc2VydEVxdWFscyhjb250ZXh0LmdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0eSgiZm9vIiksICJiYXIiKTsKKyAgICAgICAgcG9zdEZpbHRlckNhbGxlZCsrOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkN1c3RvbUxvZ2dpbmdGaWx0ZXIucHJlRmlsdGVyIGNhbGxlZCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoY29udGV4dC5nZXRQcm9wZXJ0eSgiZm9vIiksICJiYXIiKTsKKyAgICAgICAgcHJlRmlsdGVyQ2FsbGVkKys7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IGNvbnRleHQsIENvbnRhaW5lclJlc3BvbnNlQ29udGV4dCBjb250YWluZXJSZXNwb25zZUNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ3VzdG9tTG9nZ2luZ0ZpbHRlci5wb3N0RmlsdGVyIGNhbGxlZCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoY29udGV4dC5nZXRQcm9wZXJ0eSgiZm9vIiksICJiYXIiKTsKKyAgICAgICAgcG9zdEZpbHRlckNhbGxlZCsrOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvYXBhY2hlLWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2FwYWNoZS9jb25uZWN0b3IvRGlzYWJsZUNvbnRlbnRFbmNvZGluZ1Rlc3QuamF2YSBiL2Nvbm5lY3RvcnMvYXBhY2hlLWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2FwYWNoZS9jb25uZWN0b3IvRGlzYWJsZUNvbnRlbnRFbmNvZGluZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmQ3MDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvY29ubmVjdG9ycy9hcGFjaGUtY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvYXBhY2hlL2Nvbm5lY3Rvci9EaXNhYmxlQ29udGVudEVuY29kaW5nVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmFwYWNoZS5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuSGVhZGVyUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5HWmlwRW5jb2RlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5jb25maWcuUmVxdWVzdENvbmZpZzsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQGF1dGhvciBPbmRyZWogS29zYXRrYSAob25kcmVqLmtvc2F0a2EgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIERpc2FibGVDb250ZW50RW5jb2RpbmdUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldChASGVhZGVyUGFyYW0oIkFjY2VwdC1FbmNvZGluZyIpIFN0cmluZyBlbmMpIHsKKyAgICAgICAgICAgIHJldHVybiBlbmM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhYmxlZEJ5UmVxdWVzdENvbmZpZygpIHsKKyAgICAgICAgQ2xpZW50Q29uZmlnIGNjID0gbmV3IENsaWVudENvbmZpZyhHWmlwRW5jb2Rlci5jbGFzcyk7CisgICAgICAgIGZpbmFsIFJlcXVlc3RDb25maWcgcmVxdWVzdENvbmZpZyA9IFJlcXVlc3RDb25maWcuY3VzdG9tKCkuc2V0Q29udGVudENvbXByZXNzaW9uRW5hYmxlZChmYWxzZSkuYnVpbGQoKTsKKyAgICAgICAgY2MucHJvcGVydHkoQXBhY2hlQ2xpZW50UHJvcGVydGllcy5SRVFVRVNUX0NPTkZJRywgcmVxdWVzdENvbmZpZyk7CisgICAgICAgIGNjLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBBcGFjaGVDb25uZWN0b3JQcm92aWRlcigpKTsKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KGNjKTsKKyAgICAgICAgV2ViVGFyZ2V0IHIgPSBjbGllbnQudGFyZ2V0KGdldEJhc2VVcmkoKSk7CisKKyAgICAgICAgU3RyaW5nIGVuYyA9IHIucmVxdWVzdCgpLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBlbmMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVuYWJsZWRCeVJlcXVlc3RDb25maWcoKSB7CisgICAgICAgIENsaWVudENvbmZpZyBjYyA9IG5ldyBDbGllbnRDb25maWcoR1ppcEVuY29kZXIuY2xhc3MpOworICAgICAgICBmaW5hbCBSZXF1ZXN0Q29uZmlnIHJlcXVlc3RDb25maWcgPSBSZXF1ZXN0Q29uZmlnLmN1c3RvbSgpLnNldENvbnRlbnRDb21wcmVzc2lvbkVuYWJsZWQodHJ1ZSkuYnVpbGQoKTsKKyAgICAgICAgY2MucHJvcGVydHkoQXBhY2hlQ2xpZW50UHJvcGVydGllcy5SRVFVRVNUX0NPTkZJRywgcmVxdWVzdENvbmZpZyk7CisgICAgICAgIGNjLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBBcGFjaGVDb25uZWN0b3JQcm92aWRlcigpKTsKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KGNjKTsKKyAgICAgICAgV2ViVGFyZ2V0IHIgPSBjbGllbnQudGFyZ2V0KGdldEJhc2VVcmkoKSk7CisKKyAgICAgICAgU3RyaW5nIGVuYyA9IHIucmVxdWVzdCgpLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnemlwLGRlZmxhdGUiLCBlbmMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRFbmNvZGluZygpIHsKKyAgICAgICAgQ2xpZW50Q29uZmlnIGNjID0gbmV3IENsaWVudENvbmZpZyhHWmlwRW5jb2Rlci5jbGFzcyk7CisgICAgICAgIGNjLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBBcGFjaGVDb25uZWN0b3JQcm92aWRlcigpKTsKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KGNjKTsKKyAgICAgICAgV2ViVGFyZ2V0IHIgPSBjbGllbnQudGFyZ2V0KGdldEJhc2VVcmkoKSk7CisKKyAgICAgICAgU3RyaW5nIGVuYyA9IHIucmVxdWVzdCgpLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnemlwLGRlZmxhdGUiLCBlbmMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRFbmNvZGluZ092ZXJyaWRkZW4oKSB7CisgICAgICAgIENsaWVudENvbmZpZyBjYyA9IG5ldyBDbGllbnRDb25maWcoR1ppcEVuY29kZXIuY2xhc3MpOworICAgICAgICBjYy5jb25uZWN0b3JQcm92aWRlcihuZXcgQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgICAgIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudChjYyk7CisgICAgICAgIFdlYlRhcmdldCByID0gY2xpZW50LnRhcmdldChnZXRCYXNlVXJpKCkpOworCisgICAgICAgIFN0cmluZyBlbmMgPSByLnJlcXVlc3QoKS5hY2NlcHRFbmNvZGluZygiZ3ppcCIpLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnemlwIiwgZW5jKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvYXBhY2hlLWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2FwYWNoZS9jb25uZWN0b3IvRm9sbG93UmVkaXJlY3RzVGVzdC5qYXZhIGIvY29ubmVjdG9ycy9hcGFjaGUtY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvYXBhY2hlL2Nvbm5lY3Rvci9Gb2xsb3dSZWRpcmVjdHNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY3ZmQ1ZAotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvYXBhY2hlLWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2FwYWNoZS9jb25uZWN0b3IvRm9sbG93UmVkaXJlY3RzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmFwYWNoZS5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVzcG9uc2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXNwb25zZUZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQXBhY2hlIGNvbm5lY3RvciBmb2xsb3cgcmVkaXJlY3QgdGVzdHMuCisgKgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKiBAYXV0aG9yIEFydWwgRGhlc2lhc2VlbGFuIChhcnVsZCBhdCBhY20ub3JnKQorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEZvbGxvd1JlZGlyZWN0c1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihUaW1lb3V0VGVzdC5jbGFzcy5nZXROYW1lKCkpOworCisgICAgQFBhdGgoIi90ZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlZGlyZWN0UmVzb3VyY2UgeworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJHRVQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgicmVkaXJlY3QiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgcmVkaXJlY3QoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc2VlT3RoZXIoVXJpQnVpbGRlci5mcm9tUmVzb3VyY2UoUmVkaXJlY3RSZXNvdXJjZS5jbGFzcykuYnVpbGQoKSkuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIFJlc291cmNlQ29uZmlnIGNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhSZWRpcmVjdFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKG5ldyBMb2dnaW5nRmVhdHVyZShMT0dHRVIsIExvZ2dpbmdGZWF0dXJlLlZlcmJvc2l0eS5QQVlMT0FEX0FOWSkpOworICAgICAgICByZXR1cm4gY29uZmlnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5jb25uZWN0b3JQcm92aWRlcihuZXcgQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVkaXJlY3RUZXN0RmlsdGVyIGltcGxlbWVudHMgQ2xpZW50UmVzcG9uc2VGaWx0ZXIgeworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPTFZFRF9VUklfSEVBREVSID0gInJlc29sdmVkLXVyaSI7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDbGllbnRSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCwgQ2xpZW50UmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChyZXNwb25zZUNvbnRleHQgaW5zdGFuY2VvZiBDbGllbnRSZXNwb25zZSkgeworICAgICAgICAgICAgICAgIENsaWVudFJlc3BvbnNlIGNsaWVudFJlc3BvbnNlID0gKENsaWVudFJlc3BvbnNlKSByZXNwb25zZUNvbnRleHQ7CisgICAgICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LmdldEhlYWRlcnMoKS5wdXRTaW5nbGUoUkVTT0xWRURfVVJJX0hFQURFUiwgY2xpZW50UmVzcG9uc2UuZ2V0UmVzb2x2ZWRSZXF1ZXN0VXJpKCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REb0ZvbGxvdygpIHsKKyAgICAgICAgUmVzcG9uc2UgciA9IHRhcmdldCgidGVzdC9yZWRpcmVjdCIpLnJlZ2lzdGVyKFJlZGlyZWN0VGVzdEZpbHRlci5jbGFzcykucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJHRVQiLCByLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICBVcmlCdWlsZGVyLmZyb21VcmkoZ2V0QmFzZVVyaSgpKS5wYXRoKFJlZGlyZWN0UmVzb3VyY2UuY2xhc3MpLmJ1aWxkKCkudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICByLmdldEhlYWRlclN0cmluZyhSZWRpcmVjdFRlc3RGaWx0ZXIuUkVTT0xWRURfVVJJX0hFQURFUikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERvbnRGb2xsb3coKSB7CisgICAgICAgIFdlYlRhcmdldCB0ID0gdGFyZ2V0KCJ0ZXN0L3JlZGlyZWN0Iik7CisgICAgICAgIHQucHJvcGVydHkoQ2xpZW50UHJvcGVydGllcy5GT0xMT1dfUkVESVJFQ1RTLCBmYWxzZSk7CisgICAgICAgIGFzc2VydEVxdWFscygzMDMsIHQucmVxdWVzdCgpLmdldCgpLmdldFN0YXR1cygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2FwYWNoZS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9hcGFjaGUvY29ubmVjdG9yL0daSVBDb250ZW50RW5jb2RpbmdUZXN0LmphdmEgYi9jb25uZWN0b3JzL2FwYWNoZS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9hcGFjaGUvY29ubmVjdG9yL0daSVBDb250ZW50RW5jb2RpbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIyNTAzZQotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvYXBhY2hlLWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2FwYWNoZS9jb25uZWN0b3IvR1pJUENvbnRlbnRFbmNvZGluZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmFwYWNoZS5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5HWmlwRW5jb2RlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIEFydWwgRGhlc2lhc2VlbGFuIChhcnVsZCBhdCBhY20ub3JnKQorICovCitwdWJsaWMgY2xhc3MgR1pJUENvbnRlbnRFbmNvZGluZ1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgYnl0ZVtdIHBvc3QoYnl0ZVtdIGNvbnRlbnQpIHsKKyAgICAgICAgICAgIHJldHVybiBjb250ZW50OworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdCgpIHsKKyAgICAgICAgQ2xpZW50Q29uZmlnIGNjID0gbmV3IENsaWVudENvbmZpZyhHWmlwRW5jb2Rlci5jbGFzcyk7CisgICAgICAgIGNjLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBBcGFjaGVDb25uZWN0b3JQcm92aWRlcigpKTsKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KGNjKTsKKyAgICAgICAgV2ViVGFyZ2V0IHIgPSBjbGllbnQudGFyZ2V0KGdldEJhc2VVcmkoKSk7CisKKyAgICAgICAgYnl0ZVtdIGNvbnRlbnQgPSBuZXcgYnl0ZVsxMDI0ICogMTAyNF07CisgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhjb250ZW50LAorICAgICAgICAgICAgICAgIHIucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShjb250ZW50LCBNZWRpYVR5cGUuQVBQTElDQVRJT05fT0NURVRfU1RSRUFNX1RZUEUpKS5yZWFkRW50aXR5KGJ5dGVbXS5jbGFzcykpKTsKKworICAgICAgICBSZXNwb25zZSBjciA9IHIucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShjb250ZW50LCBNZWRpYVR5cGUuQVBQTElDQVRJT05fT0NURVRfU1RSRUFNX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjci5oYXNFbnRpdHkoKSk7CisgICAgICAgIGNyLmNsb3NlKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdENodW5rZWQoKSB7CisgICAgICAgIENsaWVudENvbmZpZyBjYyA9IG5ldyBDbGllbnRDb25maWcoR1ppcEVuY29kZXIuY2xhc3MpOworICAgICAgICBjYy5wcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLkNIVU5LRURfRU5DT0RJTkdfU0laRSwgMTAyNCk7CisgICAgICAgIGNjLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBBcGFjaGVDb25uZWN0b3JQcm92aWRlcigpKTsKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KGNjKTsKKworICAgICAgICBXZWJUYXJnZXQgciA9IGNsaWVudC50YXJnZXQoZ2V0QmFzZVVyaSgpKTsKKworICAgICAgICBieXRlW10gY29udGVudCA9IG5ldyBieXRlWzEwMjQgKiAxMDI0XTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGNvbnRlbnQsCisgICAgICAgICAgICAgICAgci5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KGNvbnRlbnQsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9PQ1RFVF9TVFJFQU1fVFlQRSkpLnJlYWRFbnRpdHkoYnl0ZVtdLmNsYXNzKSkpOworCisgICAgICAgIFJlc3BvbnNlIGNyID0gci5yZXF1ZXN0KCkucG9zdChFbnRpdHkudGV4dCgiUE9TVCIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjci5oYXNFbnRpdHkoKSk7CisgICAgICAgIGNyLmNsb3NlKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2FwYWNoZS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9hcGFjaGUvY29ubmVjdG9yL0hlbGxvV29ybGRUZXN0LmphdmEgYi9jb25uZWN0b3JzL2FwYWNoZS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9hcGFjaGUvY29ubmVjdG9yL0hlbGxvV29ybGRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMzYmZkNgotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvYXBhY2hlLWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2FwYWNoZS9jb25uZWN0b3IvSGVsbG9Xb3JsZFRlc3QuamF2YQpAQCAtMCwwICsxLDYxNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5hcGFjaGUuY29ubmVjdG9yOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXQ7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50Lkludm9jYXRpb25DYWxsYmFjazsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMU2Vzc2lvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBDb25uZWN0aW9uTWV0cmljczsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cEVudGl0eUVuY2xvc2luZ1JlcXVlc3Q7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBIb3N0OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5IdHRwUmVxdWVzdDsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuSHR0cFJlc3BvbnNlOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jb25uLkNsaWVudENvbm5lY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jb25uLkNsaWVudENvbm5lY3Rpb25SZXF1ZXN0OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jb25uLkNvbm5lY3Rpb25Qb29sVGltZW91dEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY29ubi5IdHRwQ2xpZW50Q29ubmVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNvbm4uTWFuYWdlZENsaWVudENvbm5lY3Rpb247CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNvbm4ucm91dGluZy5IdHRwUm91dGU7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNvbm4uc2NoZW1lLlNjaGVtZVJlZ2lzdHJ5OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvbm4uQmFzaWNDbGllbnRDb25uZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLlBvb2xpbmdIdHRwQ2xpZW50Q29ubmVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLnBhcmFtcy5IdHRwUGFyYW1zOworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5wcm90b2NvbC5IdHRwQ29udGV4dDsKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEhlbGxvV29ybGRUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihIZWxsb1dvcmxkVGVzdC5jbGFzcy5nZXROYW1lKCkpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBST09UX1BBVEggPSAiaGVsbG93b3JsZCI7CisKKyAgICBAUGF0aCgiaGVsbG93b3JsZCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBIZWxsb1dvcmxkUmVzb3VyY2UgeworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMSUNIRURfTUVTU0FHRSA9ICJIZWxsbyBXb3JsZCEiOworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRIZWxsbygpIHsKKyAgICAgICAgICAgIHJldHVybiBDTElDSEVEX01FU1NBR0U7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgICAgIEBQYXRoKCJlcnJvciIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXRFcnJvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zZXJ2ZXJFcnJvcigpLmVudGl0eSgiRXJyb3IuIikuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgQFBhdGgoImVycm9yMiIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXRFcnJvcjIoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc2VydmVyRXJyb3IoKS5lbnRpdHkoIkVycm9yMi4iKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBSZXNvdXJjZUNvbmZpZyBjb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoSGVsbG9Xb3JsZFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKG5ldyBMb2dnaW5nRmVhdHVyZShMT0dHRVIsIExldmVsLklORk8sIExvZ2dpbmdGZWF0dXJlLlZlcmJvc2l0eS5QQVlMT0FEX0FOWSwKKyAgICAgICAgICAgICAgICBMb2dnaW5nRmVhdHVyZS5ERUZBVUxUX01BWF9FTlRJVFlfU0laRSkpOworICAgICAgICByZXR1cm4gY29uZmlnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5jb25uZWN0b3JQcm92aWRlcihuZXcgQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdGlvbigpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKFJPT1RfUEFUSCkucmVxdWVzdCgidGV4dC9wbGFpbiIpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xpZW50U3RyaW5nUmVzcG9uc2UoKSB7CisgICAgICAgIFN0cmluZyBzID0gdGFyZ2V0KCkucGF0aChST09UX1BBVEgpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEhlbGxvV29ybGRSZXNvdXJjZS5DTElDSEVEX01FU1NBR0UsIHMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbm5lY3Rpb25Qb29sU2hhcmluZ0VuYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RDb25uZWN0aW9uUG9vbFNoYXJpbmcodHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdGlvblBvb2xTaGFyaW5nRGlzYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RDb25uZWN0aW9uUG9vbFNoYXJpbmcoZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIF90ZXN0Q29ubmVjdGlvblBvb2xTaGFyaW5nKGZpbmFsIGJvb2xlYW4gc2hhcmluZ0VuYWJsZWQpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGZpbmFsIEh0dHBDbGllbnRDb25uZWN0aW9uTWFuYWdlciBjb25uZWN0aW9uTWFuYWdlciA9IG5ldyBQb29saW5nSHR0cENsaWVudENvbm5lY3Rpb25NYW5hZ2VyKCk7CisKKyAgICAgICAgZmluYWwgQ2xpZW50Q29uZmlnIGNjID0gbmV3IENsaWVudENvbmZpZygpOworICAgICAgICBjYy5wcm9wZXJ0eShBcGFjaGVDbGllbnRQcm9wZXJ0aWVzLkNPTk5FQ1RJT05fTUFOQUdFUiwgY29ubmVjdGlvbk1hbmFnZXIpOworICAgICAgICBjYy5wcm9wZXJ0eShBcGFjaGVDbGllbnRQcm9wZXJ0aWVzLkNPTk5FQ1RJT05fTUFOQUdFUl9TSEFSRUQsIHNoYXJpbmdFbmFibGVkKTsKKyAgICAgICAgY2MuY29ubmVjdG9yUHJvdmlkZXIobmV3IEFwYWNoZUNvbm5lY3RvclByb3ZpZGVyKCkpOworCisgICAgICAgIGZpbmFsIENsaWVudCBjbGllbnRPbmUgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudChjYyk7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSBjbGllbnRPbmUudGFyZ2V0KGdldEJhc2VVcmkoKSkucGF0aChST09UX1BBVEgpOworICAgICAgICB0YXJnZXQucmVxdWVzdCgpLmdldCgpOworICAgICAgICBjbGllbnRPbmUuY2xvc2UoKTsKKworICAgICAgICBmaW5hbCBib29sZWFuIGV4Y2VwdGlvbkV4cGVjdGVkID0gIXNoYXJpbmdFbmFibGVkOworCisgICAgICAgIGZpbmFsIENsaWVudCBjbGllbnRUd28gPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudChjYyk7CisgICAgICAgIHRhcmdldCA9IGNsaWVudFR3by50YXJnZXQoZ2V0QmFzZVVyaSgpKS5wYXRoKFJPT1RfUEFUSCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0YXJnZXQucmVxdWVzdCgpLmdldCgpOworICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbkV4cGVjdGVkKSB7CisgICAgICAgICAgICAgICAgQXNzZXJ0LmZhaWwoIkV4Y2VwdGlvbiBleHBlY3RlZCIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKCFleGNlcHRpb25FeHBlY3RlZCkgeworICAgICAgICAgICAgICAgIEFzc2VydC5mYWlsKCJFeGNlcHRpb24gbm90IGV4cGVjdGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBjbGllbnRUd28uY2xvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzaGFyaW5nRW5hYmxlZCkgeworICAgICAgICAgICAgY29ubmVjdGlvbk1hbmFnZXIuc2h1dGRvd24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFzeW5jQ2xpZW50UmVxdWVzdHMoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBIdHRwQ2xpZW50Q29ubmVjdGlvbk1hbmFnZXIgY29ubmVjdGlvbk1hbmFnZXIgPSBuZXcgUG9vbGluZ0h0dHBDbGllbnRDb25uZWN0aW9uTWFuYWdlcigpOworICAgICAgICBDbGllbnRDb25maWcgY2MgPSBuZXcgQ2xpZW50Q29uZmlnKCk7CisgICAgICAgIGNjLnByb3BlcnR5KEFwYWNoZUNsaWVudFByb3BlcnRpZXMuQ09OTkVDVElPTl9NQU5BR0VSLCBjb25uZWN0aW9uTWFuYWdlcik7CisgICAgICAgIGNjLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBBcGFjaGVDb25uZWN0b3JQcm92aWRlcigpKTsKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KGNjKTsKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IGNsaWVudC50YXJnZXQoZ2V0QmFzZVVyaSgpKTsKKyAgICAgICAgZmluYWwgaW50IFJFUVVFU1RTID0gMjA7CisgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKFJFUVVFU1RTKTsKKyAgICAgICAgZmluYWwgbG9uZyB0aWMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgZmluYWwgTWFwPEludGVnZXIsIFN0cmluZz4gcmVzdWx0cyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUkVRVUVTVFM7IGkrKykgeworICAgICAgICAgICAgZmluYWwgaW50IGlkID0gaTsKKyAgICAgICAgICAgIHRhcmdldC5wYXRoKFJPT1RfUEFUSCkucmVxdWVzdCgpLmFzeW5jKCkuZ2V0KG5ldyBJbnZvY2F0aW9uQ2FsbGJhY2s8UmVzcG9uc2U+KCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbXBsZXRlZChSZXNwb25zZSByZXNwb25zZSkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHV0KGlkLCByZXN1bHQpOworICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBmYWlsZWQoVGhyb3dhYmxlIGVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoSGVsbG9Xb3JsZFRlc3QuY2xhc3MuZ2V0TmFtZSgpKS5sb2coTGV2ZWwuU0VWRVJFLCAiRmFpbGVkIG9uIHRocm93YWJsZSIsIGVycm9yKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXQoaWQsICJlcnJvcjogIiArIGVycm9yLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUobGF0Y2guYXdhaXQoMTAgKiBnZXRBc3luY1RpbWVvdXRNdWx0aXBsaWVyKCksIFRpbWVVbml0LlNFQ09ORFMpKTsKKyAgICAgICAgZmluYWwgbG9uZyB0b2MgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihIZWxsb1dvcmxkVGVzdC5jbGFzcy5nZXROYW1lKCkpLmluZm8oIkV4ZWN1dGVkIGluOiAiICsgKHRvYyAtIHRpYykpOworCisgICAgICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0SW5mbyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJSZXN1bHRzOlxuIik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUkVRVUVTVFM7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHJlc3VsdHMuZ2V0KGkpOworICAgICAgICAgICAgcmVzdWx0SW5mby5hcHBlbmQoaSkuYXBwZW5kKCI6ICIpLmFwcGVuZChyZXN1bHQpLmFwcGVuZCgnXG4nKTsKKyAgICAgICAgfQorICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKEhlbGxvV29ybGRUZXN0LmNsYXNzLmdldE5hbWUoKSkuaW5mbyhyZXN1bHRJbmZvLnRvU3RyaW5nKCkpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUkVRVUVTVFM7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHJlc3VsdHMuZ2V0KGkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEhlbGxvV29ybGRSZXNvdXJjZS5DTElDSEVEX01FU1NBR0UsIHJlc3VsdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIZWFkKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoUk9PVF9QQVRIKS5yZXF1ZXN0KCkuaGVhZCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9vQmFyT3B0aW9ucygpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKFJPT1RfUEFUSCkucmVxdWVzdCgpLmhlYWRlcigiQWNjZXB0IiwgImZvby9iYXIiKS5vcHRpb25zKCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGFsbG93SGVhZGVyID0gcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJBbGxvdyIpOworICAgICAgICBfY2hlY2tBbGxvd0NvbnRlbnQoYWxsb3dIZWFkZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZvby9iYXIiLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKS50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHJlc3BvbnNlLmdldExlbmd0aCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUZXh0UGxhaW5PcHRpb25zKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoUk9PVF9QQVRIKS5yZXF1ZXN0KCkuaGVhZGVyKCJBY2NlcHQiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTikub3B0aW9ucygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBhbGxvd0hlYWRlciA9IHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiQWxsb3ciKTsKKyAgICAgICAgX2NoZWNrQWxsb3dDb250ZW50KGFsbG93SGVhZGVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3BvbnNlQm9keSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgX2NoZWNrQWxsb3dDb250ZW50KHJlc3BvbnNlQm9keSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF9jaGVja0FsbG93Q29udGVudChmaW5hbCBTdHJpbmcgY29udGVudCkgeworICAgICAgICBhc3NlcnRUcnVlKGNvbnRlbnQuY29udGFpbnMoIkdFVCIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb250ZW50LmNvbnRhaW5zKCJIRUFEIikpOworICAgICAgICBhc3NlcnRUcnVlKGNvbnRlbnQuY29udGFpbnMoIk9QVElPTlMiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ1Jlc291cmNlTm90Rm91bmQoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aChST09UX1BBVEggKyAiYXJiaXRyYXJ5IikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDA0LCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIHJlc3BvbnNlLmNsb3NlKCk7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKFJPT1RfUEFUSCkucGF0aCgiYXJiaXRyYXJ5IikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDA0LCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIHJlc3BvbnNlLmNsb3NlKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9nZ2luZ0ZpbHRlckNsaWVudENsYXNzKCkgeworICAgICAgICBDbGllbnQgY2xpZW50ID0gY2xpZW50KCk7CisgICAgICAgIGNsaWVudC5yZWdpc3RlcihDdXN0b21Mb2dnaW5nRmlsdGVyLmNsYXNzKS5wcm9wZXJ0eSgiZm9vIiwgImJhciIpOworICAgICAgICBDdXN0b21Mb2dnaW5nRmlsdGVyLnByZUZpbHRlckNhbGxlZCA9IEN1c3RvbUxvZ2dpbmdGaWx0ZXIucG9zdEZpbHRlckNhbGxlZCA9IDA7CisgICAgICAgIFN0cmluZyBzID0gdGFyZ2V0KCkucGF0aChST09UX1BBVEgpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEhlbGxvV29ybGRSZXNvdXJjZS5DTElDSEVEX01FU1NBR0UsIHMpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgQ3VzdG9tTG9nZ2luZ0ZpbHRlci5wcmVGaWx0ZXJDYWxsZWQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgQ3VzdG9tTG9nZ2luZ0ZpbHRlci5wb3N0RmlsdGVyQ2FsbGVkKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb2dnaW5nRmlsdGVyQ2xpZW50SW5zdGFuY2UoKSB7CisgICAgICAgIENsaWVudCBjbGllbnQgPSBjbGllbnQoKTsKKyAgICAgICAgY2xpZW50LnJlZ2lzdGVyKG5ldyBDdXN0b21Mb2dnaW5nRmlsdGVyKCkpLnByb3BlcnR5KCJmb28iLCAiYmFyIik7CisgICAgICAgIEN1c3RvbUxvZ2dpbmdGaWx0ZXIucHJlRmlsdGVyQ2FsbGVkID0gQ3VzdG9tTG9nZ2luZ0ZpbHRlci5wb3N0RmlsdGVyQ2FsbGVkID0gMDsKKyAgICAgICAgU3RyaW5nIHMgPSB0YXJnZXQoKS5wYXRoKFJPT1RfUEFUSCkucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoSGVsbG9Xb3JsZFJlc291cmNlLkNMSUNIRURfTUVTU0FHRSwgcyk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBDdXN0b21Mb2dnaW5nRmlsdGVyLnByZUZpbHRlckNhbGxlZCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBDdXN0b21Mb2dnaW5nRmlsdGVyLnBvc3RGaWx0ZXJDYWxsZWQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvZ2dpbmdGaWx0ZXJUYXJnZXRDbGFzcygpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpLnBhdGgoUk9PVF9QQVRIKTsKKyAgICAgICAgdGFyZ2V0LnJlZ2lzdGVyKEN1c3RvbUxvZ2dpbmdGaWx0ZXIuY2xhc3MpLnByb3BlcnR5KCJmb28iLCAiYmFyIik7CisgICAgICAgIEN1c3RvbUxvZ2dpbmdGaWx0ZXIucHJlRmlsdGVyQ2FsbGVkID0gQ3VzdG9tTG9nZ2luZ0ZpbHRlci5wb3N0RmlsdGVyQ2FsbGVkID0gMDsKKyAgICAgICAgU3RyaW5nIHMgPSB0YXJnZXQucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoSGVsbG9Xb3JsZFJlc291cmNlLkNMSUNIRURfTUVTU0FHRSwgcyk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBDdXN0b21Mb2dnaW5nRmlsdGVyLnByZUZpbHRlckNhbGxlZCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBDdXN0b21Mb2dnaW5nRmlsdGVyLnBvc3RGaWx0ZXJDYWxsZWQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvZ2dpbmdGaWx0ZXJUYXJnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpLnBhdGgoUk9PVF9QQVRIKTsKKyAgICAgICAgdGFyZ2V0LnJlZ2lzdGVyKG5ldyBDdXN0b21Mb2dnaW5nRmlsdGVyKCkpLnByb3BlcnR5KCJmb28iLCAiYmFyIik7CisgICAgICAgIEN1c3RvbUxvZ2dpbmdGaWx0ZXIucHJlRmlsdGVyQ2FsbGVkID0gQ3VzdG9tTG9nZ2luZ0ZpbHRlci5wb3N0RmlsdGVyQ2FsbGVkID0gMDsKKyAgICAgICAgU3RyaW5nIHMgPSB0YXJnZXQucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoSGVsbG9Xb3JsZFJlc291cmNlLkNMSUNIRURfTUVTU0FHRSwgcyk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBDdXN0b21Mb2dnaW5nRmlsdGVyLnByZUZpbHRlckNhbGxlZCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBDdXN0b21Mb2dnaW5nRmlsdGVyLnBvc3RGaWx0ZXJDYWxsZWQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbmZpZ3VyYXRpb25VcGRhdGUoKSB7CisgICAgICAgIENsaWVudCBjbGllbnQxID0gY2xpZW50KCk7CisgICAgICAgIGNsaWVudDEucmVnaXN0ZXIoQ3VzdG9tTG9nZ2luZ0ZpbHRlci5jbGFzcykucHJvcGVydHkoImZvbyIsICJiYXIiKTsKKworICAgICAgICBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoY2xpZW50MS5nZXRDb25maWd1cmF0aW9uKCkpOworICAgICAgICBDdXN0b21Mb2dnaW5nRmlsdGVyLnByZUZpbHRlckNhbGxlZCA9IEN1c3RvbUxvZ2dpbmdGaWx0ZXIucG9zdEZpbHRlckNhbGxlZCA9IDA7CisgICAgICAgIFN0cmluZyBzID0gY2xpZW50LnRhcmdldChnZXRCYXNlVXJpKCkpLnBhdGgoUk9PVF9QQVRIKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhIZWxsb1dvcmxkUmVzb3VyY2UuQ0xJQ0hFRF9NRVNTQUdFLCBzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIEN1c3RvbUxvZ2dpbmdGaWx0ZXIucHJlRmlsdGVyQ2FsbGVkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIEN1c3RvbUxvZ2dpbmdGaWx0ZXIucG9zdEZpbHRlckNhbGxlZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSkVSU0VZLTIxNTcgcmVwcm9kdWNlci4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgdGVzdCBlbnN1cmVzIHRoYXQgZW50aXRpZXMgb2YgdGhlIGVycm9yIHJlc3BvbnNlcyB3aGljaCBjYXVzZQorICAgICAqIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIGJlaW5nIHRocm93biBieSBhIEpBWC1SUyBjbGllbnQgYXJlIGJ1ZmZlcmVkCisgICAgICogYW5kIHRoYXQgdGhlIHVuZGVybHlpbmcgaW5wdXQgY29ubmVjdGlvbnMgYXJlIGF1dG9tYXRpY2FsbHkgcmVsZWFzZWQKKyAgICAgKiBpbiBzdWNoIGNhc2UuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdGlvbkNsb3NpbmdPbkV4Y2VwdGlvbnNGb3JFcnJvclJlc3BvbnNlcygpIHsKKyAgICAgICAgZmluYWwgQmFzaWNDbGllbnRDb25uZWN0aW9uTWFuYWdlciBjbSA9IG5ldyBCYXNpY0NsaWVudENvbm5lY3Rpb25NYW5hZ2VyKCk7CisgICAgICAgIGZpbmFsIEF0b21pY0ludGVnZXIgY29ubmVjdGlvbkNvdW50ZXIgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKKworICAgICAgICBmaW5hbCBDbGllbnRDb25maWcgY29uZmlnID0gbmV3IENsaWVudENvbmZpZygpLnByb3BlcnR5KEFwYWNoZUNsaWVudFByb3BlcnRpZXMuQ09OTkVDVElPTl9NQU5BR0VSLAorICAgICAgICAgICAgICAgIG5ldyBDbGllbnRDb25uZWN0aW9uTWFuYWdlcigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBTY2hlbWVSZWdpc3RyeSBnZXRTY2hlbWVSZWdpc3RyeSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbS5nZXRTY2hlbWVSZWdpc3RyeSgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBDbGllbnRDb25uZWN0aW9uUmVxdWVzdCByZXF1ZXN0Q29ubmVjdGlvbihmaW5hbCBIdHRwUm91dGUgcm91dGUsIGZpbmFsIE9iamVjdCBzdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbkNvdW50ZXIuaW5jcmVtZW50QW5kR2V0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsaWVudENvbm5lY3Rpb25SZXF1ZXN0IHdyYXBwZWRSZXF1ZXN0ID0gY20ucmVxdWVzdENvbm5lY3Rpb24ocm91dGUsIHN0YXRlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBUbyBleHBsYWluIHRoZSBmb2xsb3dpbmcgbG9uZyBwaWVjZSBvZiBjb2RlOgorICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIEFsbCB0aGUgY29kZSBkb2VzIGlzIHRvIGp1c3QgY3JlYXRlIGEgd3JhcHBlciBpbXBsZW1lbnRhdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIGZvciB0aGUgQUhDIGNvbm5lY3Rpb24gbWFuYWdlbWVudCBpbnRlcmZhY2VzLgorICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIFRoZSBvbmx5IHJlYWxseSBpbXBvcnRhbnQgcGllY2Ugb2YgY29kZSBpcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHtAbGluayBvcmcuYXBhY2hlLmh0dHAuY29ubi5NYW5hZ2VkQ2xpZW50Q29ubmVjdGlvbiNyZWxlYXNlQ29ubmVjdGlvbigpfSBpbXBsZW1lbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHdoZXJlIHRoZSBjb25uZWN0aW9uQ291bnRlciBpcyBkZWNyZW1lbnRlZCB3aGVuIGEgbWFuYWdlZCBjb25uZWN0aW9uIGluc3RhbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBpcyByZWxlYXNlZCBieSBBSEMgcnVudGltZS4gSW4gb3VyIHRlc3QsIHRoaXMgaXMgZXhwZWN0ZWQgdG8gaGFwcGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgKiBhcyBzb29uIGFzIHRoZSBleGNlcHRpb24gaXMgY3JlYXRlZCBmb3IgYW4gZXJyb3IgcmVzcG9uc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAqIChhcyB0aGUgZXJyb3IgcmVzcG9uc2UgZW50aXR5IGdldHMgYnVmZmVyZWQgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuSmVyc2V5SW52b2NhdGlvbiNjb252ZXJ0VG9FeGNlcHRpb24oamF2YXgud3MucnMuY29yZS5SZXNwb25zZSl9KS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDbGllbnRDb25uZWN0aW9uUmVxdWVzdCgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgTWFuYWdlZENsaWVudENvbm5lY3Rpb24gZ2V0Q29ubmVjdGlvbihsb25nIHRpbWVvdXQsIFRpbWVVbml0IHR1bml0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBDb25uZWN0aW9uUG9vbFRpbWVvdXRFeGNlcHRpb24geworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1hbmFnZWRDbGllbnRDb25uZWN0aW9uIHdyYXBwZWRDb25uZWN0aW9uID0gd3JhcHBlZFJlcXVlc3QuZ2V0Q29ubmVjdGlvbih0aW1lb3V0LCB0dW5pdCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNYW5hZ2VkQ2xpZW50Q29ubmVjdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTZWN1cmUoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWRDb25uZWN0aW9uLmlzU2VjdXJlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIEh0dHBSb3V0ZSBnZXRSb3V0ZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZENvbm5lY3Rpb24uZ2V0Um91dGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgU1NMU2Vzc2lvbiBnZXRTU0xTZXNzaW9uKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkQ29ubmVjdGlvbi5nZXRTU0xTZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb3BlbihIdHRwUm91dGUgcm91dGUsIEh0dHBDb250ZXh0IGNvbnRleHQsIEh0dHBQYXJhbXMgcGFyYW1zKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZWRDb25uZWN0aW9uLm9wZW4ocm91dGUsIGNvbnRleHQsIHBhcmFtcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgdHVubmVsVGFyZ2V0KGJvb2xlYW4gc2VjdXJlLCBIdHRwUGFyYW1zIHBhcmFtcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVkQ29ubmVjdGlvbi50dW5uZWxUYXJnZXQoc2VjdXJlLCBwYXJhbXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHR1bm5lbFByb3h5KEh0dHBIb3N0IG5leHQsIGJvb2xlYW4gc2VjdXJlLCBIdHRwUGFyYW1zIHBhcmFtcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVkQ29ubmVjdGlvbi50dW5uZWxQcm94eShuZXh0LCBzZWN1cmUsIHBhcmFtcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgbGF5ZXJQcm90b2NvbChIdHRwQ29udGV4dCBjb250ZXh0LCBIdHRwUGFyYW1zIHBhcmFtcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVkQ29ubmVjdGlvbi5sYXllclByb3RvY29sKGNvbnRleHQsIHBhcmFtcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgbWFya1JldXNhYmxlKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZWRDb25uZWN0aW9uLm1hcmtSZXVzYWJsZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHVubWFya1JldXNhYmxlKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZWRDb25uZWN0aW9uLnVubWFya1JldXNhYmxlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNNYXJrZWRSZXVzYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZENvbm5lY3Rpb24uaXNNYXJrZWRSZXVzYWJsZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldFN0YXRlKE9iamVjdCBzdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZWRDb25uZWN0aW9uLnNldFN0YXRlKHN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFN0YXRlKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkQ29ubmVjdGlvbi5nZXRTdGF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldElkbGVEdXJhdGlvbihsb25nIGR1cmF0aW9uLCBUaW1lVW5pdCB1bml0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZENvbm5lY3Rpb24uc2V0SWRsZUR1cmF0aW9uKGR1cmF0aW9uLCB1bml0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1Jlc3BvbnNlQXZhaWxhYmxlKGludCB0aW1lb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkQ29ubmVjdGlvbi5pc1Jlc3BvbnNlQXZhaWxhYmxlKHRpbWVvdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNlbmRSZXF1ZXN0SGVhZGVyKEh0dHBSZXF1ZXN0IHJlcXVlc3QpIHRocm93cyBIdHRwRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZENvbm5lY3Rpb24uc2VuZFJlcXVlc3RIZWFkZXIocmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VuZFJlcXVlc3RFbnRpdHkoSHR0cEVudGl0eUVuY2xvc2luZ1JlcXVlc3QgcmVxdWVzdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEh0dHBFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVkQ29ubmVjdGlvbi5zZW5kUmVxdWVzdEVudGl0eShyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgSHR0cFJlc3BvbnNlIHJlY2VpdmVSZXNwb25zZUhlYWRlcigpIHRocm93cyBIdHRwRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWRDb25uZWN0aW9uLnJlY2VpdmVSZXNwb25zZUhlYWRlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlY2VpdmVSZXNwb25zZUVudGl0eShIdHRwUmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBIdHRwRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZENvbm5lY3Rpb24ucmVjZWl2ZVJlc3BvbnNlRW50aXR5KHJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZENvbm5lY3Rpb24uZmx1c2goKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZENvbm5lY3Rpb24uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc09wZW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWRDb25uZWN0aW9uLmlzT3BlbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzU3RhbGUoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWRDb25uZWN0aW9uLmlzU3RhbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRTb2NrZXRUaW1lb3V0KGludCB0aW1lb3V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZENvbm5lY3Rpb24uc2V0U29ja2V0VGltZW91dCh0aW1lb3V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgaW50IGdldFNvY2tldFRpbWVvdXQoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWRDb25uZWN0aW9uLmdldFNvY2tldFRpbWVvdXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZENvbm5lY3Rpb24uc2h1dGRvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgSHR0cENvbm5lY3Rpb25NZXRyaWNzIGdldE1ldHJpY3MoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWRDb25uZWN0aW9uLmdldE1ldHJpY3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgSW5ldEFkZHJlc3MgZ2V0TG9jYWxBZGRyZXNzKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3cmFwcGVkQ29ubmVjdGlvbi5nZXRMb2NhbEFkZHJlc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgaW50IGdldExvY2FsUG9ydCgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZENvbm5lY3Rpb24uZ2V0TG9jYWxQb3J0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIEluZXRBZGRyZXNzIGdldFJlbW90ZUFkZHJlc3MoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWRDb25uZWN0aW9uLmdldFJlbW90ZUFkZHJlc3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgaW50IGdldFJlbW90ZVBvcnQoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWRDb25uZWN0aW9uLmdldFJlbW90ZVBvcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCByZWxlYXNlQ29ubmVjdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbkNvdW50ZXIuZGVjcmVtZW50QW5kR2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlZENvbm5lY3Rpb24ucmVsZWFzZUNvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhYm9ydENvbm5lY3Rpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZWRDb25uZWN0aW9uLmFib3J0Q29ubmVjdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWRDb25uZWN0aW9uLmdldElkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYmluZChTb2NrZXQgc29ja2V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZWRDb25uZWN0aW9uLmJpbmQoc29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgU29ja2V0IGdldFNvY2tldCgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZENvbm5lY3Rpb24uZ2V0U29ja2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWJvcnRSZXF1ZXN0KCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cmFwcGVkUmVxdWVzdC5hYm9ydFJlcXVlc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbGVhc2VDb25uZWN0aW9uKE1hbmFnZWRDbGllbnRDb25uZWN0aW9uIGNvbm4sIGxvbmcga2VlcGFsaXZlLCBUaW1lVW5pdCB0dW5pdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY20ucmVsZWFzZUNvbm5lY3Rpb24oY29ubiwga2VlcGFsaXZlLCB0dW5pdCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY2xvc2VFeHBpcmVkQ29ubmVjdGlvbnMoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjbS5jbG9zZUV4cGlyZWRDb25uZWN0aW9ucygpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlSWRsZUNvbm5lY3Rpb25zKGxvbmcgaWRsZXRpbWUsIFRpbWVVbml0IHR1bml0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjbS5jbG9zZUlkbGVDb25uZWN0aW9ucyhpZGxldGltZSwgdHVuaXQpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNodXRkb3duKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY20uc2h1dGRvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICBjb25maWcuY29ubmVjdG9yUHJvdmlkZXIobmV3IEFwYWNoZUNvbm5lY3RvclByb3ZpZGVyKCkpOworCisgICAgICAgIGZpbmFsIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudChjb25maWcpOworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgcm9vdFRhcmdldCA9IGNsaWVudC50YXJnZXQoZ2V0QmFzZVVyaSgpKS5wYXRoKFJPT1RfUEFUSCk7CisKKyAgICAgICAgLy8gVGVzdCB0aGF0IGNvbm5lY3Rpb24gaXMgZ2V0dGluZyBjbG9zZWQgcHJvcGVybHkgZm9yIGVycm9yIHJlc3BvbnNlcy4KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZXNwb25zZSA9IHJvb3RUYXJnZXQucGF0aCgiZXJyb3IiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZXhwZWN0ZWQuIFJlY2VpdmVkOiAiICsgcmVzcG9uc2UpOworICAgICAgICB9IGNhdGNoIChJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uIGlzZWUpIHsKKyAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcgLSBjb25uZWN0aW9uIHNob3VsZCBiZSBjbG9zZWQgcHJvcGVybHkgYnkgbm93CisgICAgICAgIH0KKworICAgICAgICAvLyBGYWlsIGlmIHRoZSBwcmV2aW91cyBjb25uZWN0aW9uIGhhcyBub3QgYmVlbiBjbG9zZWQgYXV0b21hdGljYWxseS4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGNvbm5lY3Rpb25Db3VudGVyLmdldCgpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJlc3BvbnNlID0gcm9vdFRhcmdldC5wYXRoKCJlcnJvcjIiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gZXhwZWN0ZWQuIFJlY2VpdmVkOiAiICsgcmVzcG9uc2UpOworICAgICAgICB9IGNhdGNoIChJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uIGlzZWUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiUmVjZWl2ZWQgdW5leHBlY3RlZCBkYXRhLiIsICJFcnJvcjIuIiwgaXNlZS5nZXRSZXNwb25zZSgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgICAgICAvLyBUZXN0IGJ1ZmZlcmluZzoKKyAgICAgICAgICAgIC8vIHNlY29uZCByZWFkIHdvdWxkIGZhaWwgaWYgZW50aXR5IHdhcyBub3QgYnVmZmVyZWQKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBkYXRhIGluIHRoZSBlbnRpdHkgYnVmZmVyLiIsICJFcnJvcjIuIiwgaXNlZS5nZXRSZXNwb25zZSgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY29ubmVjdGlvbkNvdW50ZXIuZ2V0KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvYXBhY2hlLWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2FwYWNoZS9jb25uZWN0b3IvSHR0cEhlYWRlcnNUZXN0LmphdmEgYi9jb25uZWN0b3JzL2FwYWNoZS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9hcGFjaGUvY29ubmVjdG9yL0h0dHBIZWFkZXJzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMDJiZWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL2FwYWNoZS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9hcGFjaGUvY29ubmVjdG9yL0h0dHBIZWFkZXJzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmFwYWNoZS5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5IZWFkZXJQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBBcnVsIERoZXNpYXNlZWxhbiAoYXJ1bGQgYXQgYWNtLm9yZykKKyAqLworcHVibGljIGNsYXNzIEh0dHBIZWFkZXJzVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoSHR0cEhlYWRlcnNUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBAUGF0aCgiL3Rlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSHR0cE1ldGhvZFJlc291cmNlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3QoCisgICAgICAgICAgICAgICAgQEhlYWRlclBhcmFtKCJUcmFuc2Zlci1FbmNvZGluZyIpIFN0cmluZyB0cmFuc2ZlckVuY29kaW5nLAorICAgICAgICAgICAgICAgIEBIZWFkZXJQYXJhbSgiWC1DTElFTlQiKSBTdHJpbmcgeENsaWVudCwKKyAgICAgICAgICAgICAgICBASGVhZGVyUGFyYW0oIlgtV1JJVEVSIikgU3RyaW5nIHhXcml0ZXIsCisgICAgICAgICAgICAgICAgU3RyaW5nIGVudGl0eSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJjbGllbnQiLCB4Q2xpZW50KTsKKyAgICAgICAgICAgIGlmICh0cmFuc2ZlckVuY29kaW5nID09IG51bGwgfHwgIXRyYW5zZmVyRW5jb2RpbmcuZXF1YWxzKCJjaHVua2VkIikpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIndyaXRlciIsIHhXcml0ZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGVudGl0eTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBIZWFkZXJXcml0ZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVdyaXRlcjxTdHJpbmc+IHsKKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlID09IFN0cmluZy5jbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBsb25nIGdldFNpemUoU3RyaW5nIHQsIENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbyhTdHJpbmcgdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgaHR0cEhlYWRlcnMuYWRkKCJYLVdSSVRFUiIsICJ3cml0ZXIiKTsKKyAgICAgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZSh0LmdldEJ5dGVzKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKTsKKworICAgICAgICBSZXNvdXJjZUNvbmZpZyBjb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoSHR0cE1ldGhvZFJlc291cmNlLmNsYXNzLCBIZWFkZXJXcml0ZXIuY2xhc3MpOworICAgICAgICBjb25maWcucmVnaXN0ZXIobmV3IExvZ2dpbmdGZWF0dXJlKExPR0dFUiwgTG9nZ2luZ0ZlYXR1cmUuVmVyYm9zaXR5LlBBWUxPQURfQU5ZKSk7CisgICAgICAgIHJldHVybiBjb25maWc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuUkVBRF9USU1FT1VULCAxMDAwKS5jb25uZWN0b3JQcm92aWRlcihuZXcgQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdCgpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHIgPSB0YXJnZXQoInRlc3QiKTsKKworICAgICAgICBSZXNwb25zZSBjciA9IHIucmVxdWVzdCgpLmhlYWRlcigiWC1DTElFTlQiLCAiY2xpZW50IikucG9zdChFbnRpdHkudGV4dCgiUE9TVCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgY3IuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRUcnVlKGNyLmhhc0VudGl0eSgpKTsKKyAgICAgICAgY3IuY2xvc2UoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0Q2h1bmtlZCgpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHIgPSB0YXJnZXQoInRlc3QiKTsKKworICAgICAgICBSZXNwb25zZSBjciA9IHIucmVxdWVzdCgpLmhlYWRlcigiWC1DTElFTlQiLCAiY2xpZW50IikucG9zdChFbnRpdHkudGV4dCgiUE9TVCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgY3IuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRUcnVlKGNyLmhhc0VudGl0eSgpKTsKKyAgICAgICAgY3IuY2xvc2UoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2FwYWNoZS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9hcGFjaGUvY29ubmVjdG9yL0h0dHBNZXRob2RUZXN0LmphdmEgYi9jb25uZWN0b3JzL2FwYWNoZS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9hcGFjaGUvY29ubmVjdG9yL0h0dHBNZXRob2RUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VkYWJlYgotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvYXBhY2hlLWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2FwYWNoZS9jb25uZWN0b3IvSHR0cE1ldGhvZFRlc3QuamF2YQpAQCAtMCwwICsxLDMwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5hcGFjaGUuY29ubmVjdG9yOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5DbGllbnRFcnJvckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5ERUxFVEU7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLkh0dHBNZXRob2Q7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QVVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLlBvb2xpbmdIdHRwQ2xpZW50Q29ubmVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBBcnVsIERoZXNpYXNlZWxhbiAoYXJ1bGQgYXQgYWNtLm9yZykKKyAqLworcHVibGljIGNsYXNzIEh0dHBNZXRob2RUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEh0dHBNZXRob2RSZXNvdXJjZS5jbGFzcywgRXJyb3JSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIENsaWVudCBjcmVhdGVDbGllbnQoKSB7CisgICAgICAgIENsaWVudENvbmZpZyBjYyA9IG5ldyBDbGllbnRDb25maWcoKTsKKyAgICAgICAgY2MuY29ubmVjdG9yUHJvdmlkZXIobmV3IEFwYWNoZUNvbm5lY3RvclByb3ZpZGVyKCkpOworICAgICAgICByZXR1cm4gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoY2MpOworICAgIH0KKworICAgIHByb3RlY3RlZCBDbGllbnQgY3JlYXRlUG9vbGluZ0NsaWVudCgpIHsKKyAgICAgICAgQ2xpZW50Q29uZmlnIGNjID0gbmV3IENsaWVudENvbmZpZygpOworICAgICAgICBQb29saW5nSHR0cENsaWVudENvbm5lY3Rpb25NYW5hZ2VyIGNvbm5lY3Rpb25NYW5hZ2VyID0gbmV3IFBvb2xpbmdIdHRwQ2xpZW50Q29ubmVjdGlvbk1hbmFnZXIoKTsKKyAgICAgICAgY29ubmVjdGlvbk1hbmFnZXIuc2V0TWF4VG90YWwoMTAwKTsKKyAgICAgICAgY29ubmVjdGlvbk1hbmFnZXIuc2V0RGVmYXVsdE1heFBlclJvdXRlKDEwMCk7CisgICAgICAgIGNjLnByb3BlcnR5KEFwYWNoZUNsaWVudFByb3BlcnRpZXMuQ09OTkVDVElPTl9NQU5BR0VSLCBjb25uZWN0aW9uTWFuYWdlcik7CisgICAgICAgIGNjLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBBcGFjaGVDb25uZWN0b3JQcm92aWRlcigpKTsKKyAgICAgICAgcmV0dXJuIENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KGNjKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFdlYlRhcmdldCBnZXRXZWJUYXJnZXQoZmluYWwgQ2xpZW50IGNsaWVudCkgeworICAgICAgICByZXR1cm4gY2xpZW50LnRhcmdldChnZXRCYXNlVXJpKCkpLnBhdGgoInRlc3QiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFdlYlRhcmdldCBnZXRXZWJUYXJnZXQoKSB7CisgICAgICAgIHJldHVybiBnZXRXZWJUYXJnZXQoY3JlYXRlQ2xpZW50KCkpOworICAgIH0KKworICAgIEBUYXJnZXQoe0VsZW1lbnRUeXBlLk1FVEhPRH0pCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgICBASHR0cE1ldGhvZCgiUEFUQ0giKQorICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBBVENIIHsKKyAgICB9CisKKyAgICBAUGF0aCgiL3Rlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSHR0cE1ldGhvZFJlc291cmNlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiR0VUIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdChTdHJpbmcgZW50aXR5KSB7CisgICAgICAgICAgICByZXR1cm4gZW50aXR5OworICAgICAgICB9CisKKyAgICAgICAgQFBVVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHB1dChTdHJpbmcgZW50aXR5KSB7CisgICAgICAgICAgICByZXR1cm4gZW50aXR5OworICAgICAgICB9CisKKyAgICAgICAgQERFTEVURQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRlbGV0ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAiREVMRVRFIjsKKyAgICAgICAgfQorCisgICAgICAgIEBERUxFVEUKKyAgICAgICAgQFBhdGgoIndpdGhlbnRpdHkiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRlbGV0ZShTdHJpbmcgZW50aXR5KSB7CisgICAgICAgICAgICByZXR1cm4gZW50aXR5OworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoIm5vcHJvZHVjZSIpCisgICAgICAgIHB1YmxpYyB2b2lkIHBvc3ROb1Byb2R1Y2UoU3RyaW5nIGVudGl0eSkgeworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoIm5vY29uc3VtZXByb2R1Y2UiKQorICAgICAgICBwdWJsaWMgdm9pZCBwb3N0Tm9Db25zdW1lUHJvZHVjZSgpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBQQVRDSAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBhdGNoKFN0cmluZyBlbnRpdHkpIHsKKyAgICAgICAgICAgIHJldHVybiBlbnRpdHk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIZWFkKCkgeworICAgICAgICBXZWJUYXJnZXQgciA9IGdldFdlYlRhcmdldCgpOworICAgICAgICBSZXNwb25zZSBjciA9IHIucmVxdWVzdCgpLmhlYWQoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY3IuaGFzRW50aXR5KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9wdGlvbnMoKSB7CisgICAgICAgIFdlYlRhcmdldCByID0gZ2V0V2ViVGFyZ2V0KCk7CisgICAgICAgIFJlc3BvbnNlIGNyID0gci5yZXF1ZXN0KCkub3B0aW9ucygpOworICAgICAgICBhc3NlcnRUcnVlKGNyLmhhc0VudGl0eSgpKTsKKyAgICAgICAgY3IuY2xvc2UoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXQoKSB7CisgICAgICAgIFdlYlRhcmdldCByID0gZ2V0V2ViVGFyZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiR0VUIiwgci5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworCisgICAgICAgIFJlc3BvbnNlIGNyID0gci5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRydWUoY3IuaGFzRW50aXR5KCkpOworICAgICAgICBjci5jbG9zZSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc3QoKSB7CisgICAgICAgIFdlYlRhcmdldCByID0gZ2V0V2ViVGFyZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiUE9TVCIsIHIucmVxdWVzdCgpLnBvc3QoRW50aXR5LnRleHQoIlBPU1QiKSwgU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgUmVzcG9uc2UgY3IgPSByLnJlcXVlc3QoKS5wb3N0KEVudGl0eS50ZXh0KCJQT1NUIikpOworICAgICAgICBhc3NlcnRUcnVlKGNyLmhhc0VudGl0eSgpKTsKKyAgICAgICAgY3IuY2xvc2UoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0Q2h1bmtlZCgpIHsKKyAgICAgICAgQ2xpZW50Q29uZmlnIGNjID0gbmV3IENsaWVudENvbmZpZygpCisgICAgICAgICAgICAgICAgLnByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuQ0hVTktFRF9FTkNPRElOR19TSVpFLCAxMDI0KQorICAgICAgICAgICAgICAgIC5jb25uZWN0b3JQcm92aWRlcihuZXcgQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgICAgIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudChjYyk7CisgICAgICAgIFdlYlRhcmdldCByID0gZ2V0V2ViVGFyZ2V0KGNsaWVudCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJQT1NUIiwgci5yZXF1ZXN0KCkucG9zdChFbnRpdHkudGV4dCgiUE9TVCIpLCBTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICBSZXNwb25zZSBjciA9IHIucmVxdWVzdCgpLnBvc3QoRW50aXR5LnRleHQoIlBPU1QiKSk7CisgICAgICAgIGFzc2VydFRydWUoY3IuaGFzRW50aXR5KCkpOworICAgICAgICBjci5jbG9zZSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc3RWb2lkKCkgeworICAgICAgICBXZWJUYXJnZXQgciA9IGdldFdlYlRhcmdldChjcmVhdGVQb29saW5nQ2xpZW50KCkpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKyAgICAgICAgICAgIHIucmVxdWVzdCgpLnBvc3QoRW50aXR5LnRleHQoIlBPU1QiKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0Tm9Qcm9kdWNlKCkgeworICAgICAgICBXZWJUYXJnZXQgciA9IGdldFdlYlRhcmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjA0LCByLnBhdGgoIm5vcHJvZHVjZSIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS50ZXh0KCJQT1NUIikpLmdldFN0YXR1cygpKTsKKworICAgICAgICBSZXNwb25zZSBjciA9IHIucGF0aCgibm9wcm9kdWNlIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LnRleHQoIlBPU1QiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGNyLmhhc0VudGl0eSgpKTsKKyAgICAgICAgY3IuY2xvc2UoKTsKKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc3ROb0NvbnN1bWVQcm9kdWNlKCkgeworICAgICAgICBXZWJUYXJnZXQgciA9IGdldFdlYlRhcmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjA0LCByLnBhdGgoIm5vY29uc3VtZXByb2R1Y2UiKS5yZXF1ZXN0KCkucG9zdChudWxsKS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgUmVzcG9uc2UgY3IgPSByLnBhdGgoIm5vY29uc3VtZXByb2R1Y2UiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkudGV4dCgiUE9TVCIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY3IuaGFzRW50aXR5KCkpOworICAgICAgICBjci5jbG9zZSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFB1dCgpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHIgPSBnZXRXZWJUYXJnZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJQVVQiLCByLnJlcXVlc3QoKS5wdXQoRW50aXR5LnRleHQoIlBVVCIpLCBTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICBSZXNwb25zZSBjciA9IHIucmVxdWVzdCgpLnB1dChFbnRpdHkudGV4dCgiUFVUIikpOworICAgICAgICBhc3NlcnRUcnVlKGNyLmhhc0VudGl0eSgpKTsKKyAgICAgICAgY3IuY2xvc2UoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZWxldGUoKSB7CisgICAgICAgIFdlYlRhcmdldCByID0gZ2V0V2ViVGFyZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiREVMRVRFIiwgci5yZXF1ZXN0KCkuZGVsZXRlKFN0cmluZy5jbGFzcykpOworCisgICAgICAgIFJlc3BvbnNlIGNyID0gci5yZXF1ZXN0KCkuZGVsZXRlKCk7CisgICAgICAgIGFzc2VydFRydWUoY3IuaGFzRW50aXR5KCkpOworICAgICAgICBjci5jbG9zZSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhdGNoKCkgeworICAgICAgICBXZWJUYXJnZXQgciA9IGdldFdlYlRhcmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlBBVENIIiwgci5yZXF1ZXN0KCkubWV0aG9kKCJQQVRDSCIsIEVudGl0eS50ZXh0KCJQQVRDSCIpLCBTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICBSZXNwb25zZSBjciA9IHIucmVxdWVzdCgpLm1ldGhvZCgiUEFUQ0giLCBFbnRpdHkudGV4dCgiUEFUQ0giKSk7CisgICAgICAgIGFzc2VydFRydWUoY3IuaGFzRW50aXR5KCkpOworICAgICAgICBjci5jbG9zZSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFsbCgpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHIgPSBnZXRXZWJUYXJnZXQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCIsIHIucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIlBPU1QiLCByLnJlcXVlc3QoKS5wb3N0KEVudGl0eS50ZXh0KCJQT1NUIiksIFN0cmluZy5jbGFzcykpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDQsIHIucGF0aCgibm9wcm9kdWNlIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LnRleHQoIlBPU1QiKSkuZ2V0U3RhdHVzKCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDQsIHIucGF0aCgibm9jb25zdW1lcHJvZHVjZSIpLnJlcXVlc3QoKS5wb3N0KG51bGwpLmdldFN0YXR1cygpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIlBVVCIsIHIucmVxdWVzdCgpLnBvc3QoRW50aXR5LnRleHQoIlBVVCIpLCBTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIkRFTEVURSIsIHIucmVxdWVzdCgpLmRlbGV0ZShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKworICAgIEBQYXRoKCIvZXJyb3IiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXJyb3JSZXNvdXJjZSB7CisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBwb3N0KFN0cmluZyBlbnRpdHkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zZXJ2ZXJFcnJvcigpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiZW50aXR5IikKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHBvc3RXaXRoRW50aXR5KFN0cmluZyBlbnRpdHkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zZXJ2ZXJFcnJvcigpLmVudGl0eSgiZXJyb3IiKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdEVycm9yKCkgeworICAgICAgICBXZWJUYXJnZXQgciA9IGNyZWF0ZUNsaWVudCgpLnRhcmdldChnZXRCYXNlVXJpKCkpLnBhdGgoImVycm9yIik7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSBwb3N0ID0gci5yZXF1ZXN0KCkucG9zdChFbnRpdHkudGV4dCgiUE9TVCIpKTsKKyAgICAgICAgICAgICAgICBwb3N0LmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChDbGllbnRFcnJvckV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdEVycm9yV2l0aEVudGl0eSgpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHIgPSBjcmVhdGVQb29saW5nQ2xpZW50KCkudGFyZ2V0KGdldEJhc2VVcmkoKSkucGF0aCgiZXJyb3IvZW50aXR5Iik7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByLnJlcXVlc3QoKS5wb3N0KEVudGl0eS50ZXh0KCJQT1NUIikpOworICAgICAgICAgICAgfSBjYXRjaCAoQ2xpZW50RXJyb3JFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgcyA9IGV4LmdldFJlc3BvbnNlKCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiZXJyb3IiLCBzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvYXBhY2hlLWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2FwYWNoZS9jb25uZWN0b3IvSHR0cE1ldGhvZFdpdGhDbGllbnRGaWx0ZXJUZXN0LmphdmEgYi9jb25uZWN0b3JzL2FwYWNoZS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9hcGFjaGUvY29ubmVjdG9yL0h0dHBNZXRob2RXaXRoQ2xpZW50RmlsdGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MWZiMWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL2FwYWNoZS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9hcGFjaGUvY29ubmVjdG9yL0h0dHBNZXRob2RXaXRoQ2xpZW50RmlsdGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuYXBhY2hlLmNvbm5lY3RvcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CisKKy8qKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBBcnVsIERoZXNpYXNlZWxhbiAoYXJ1bGQgYXQgYWNtLm9yZykKKyAqLworcHVibGljIGNsYXNzIEh0dHBNZXRob2RXaXRoQ2xpZW50RmlsdGVyVGVzdCBleHRlbmRzIEh0dHBNZXRob2RUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBDbGllbnQgY3JlYXRlQ2xpZW50KCkgeworICAgICAgICBDbGllbnRDb25maWcgY2MgPSBuZXcgQ2xpZW50Q29uZmlnKCkKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpCisgICAgICAgICAgICAgICAgLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBBcGFjaGVDb25uZWN0b3JQcm92aWRlcigpKTsKKyAgICAgICAgcmV0dXJuIENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KGNjKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvYXBhY2hlLWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2FwYWNoZS9jb25uZWN0b3IvTGFyZ2VEYXRhVGVzdC5qYXZhIGIvY29ubmVjdG9ycy9hcGFjaGUtY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvYXBhY2hlL2Nvbm5lY3Rvci9MYXJnZURhdGFUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ4MzIwMwotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvYXBhY2hlLWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2FwYWNoZS9jb25uZWN0b3IvTGFyZ2VEYXRhVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmFwYWNoZS5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlNlcnZlckVycm9yRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZS5TdGF0dXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5TdHJlYW1pbmdPdXRwdXQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGhlIExhcmdlRGF0YVRlc3QgcmVwcm9kdWNlcyBhIHByb2JsZW0gd2hlbiBieXRlcyBvZiBsYXJnZSBkYXRhIHNlbnQgYXJlIGluY29ycmVjdGx5IHNlbnQuCisgKiBBcyBhIHJlc3VsdCwgdGhlIHJlcXVlc3QgYm9keSBpcyBkaWZmZXJlbnQgdGhhbiB3aGF0IHdhcyBzZW50IGJ5IHRoZSBjbGllbnQuCisgKiA8cD4KKyAqIEluIG9yZGVyIHRvIGJlIGFibGUgdG8gaW5zcGVjdCB0aGUgcmVxdWVzdCBib2R5LCB0aGUgZ2VuZXJhdGVkIGRhdGEgaXMgYSBzZXF1ZW5jZSBvZiBudW1iZXJzCisgKiBkZWxpbWl0ZWQgd2l0aCBuZXcgbGluZXMuIFN1Y2ggYXMKKyAqIDxwcmU+PGNvZGU+CisgKiAgICAgMQorICogICAgIDIKKyAqICAgICAzCisgKgorICogICAgIC4uLgorICoKKyAqICAgICA1NzIzNAorICogICAgIDU3MjM1CisgKiAgICAgNTcyMzYKKyAqCisgKiAgICAgLi4uCisgKiA8L2NvZGU+PC9wcmU+CisgKiBJdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHNlbmQgdGhlIGRhdGEgdG8gbmV0Y2F0OiB7QGNvZGUgbmMgLWwgODA4MH0gYW5kIHZlcmlmeSB0aGUgcHJvYmxlbSBpcworICogb24gdGhlIGNsaWVudCBzaWRlLgorICoKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBMYXJnZURhdGFUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihMYXJnZURhdGFUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IExPTkdfREFUQV9TSVpFID0gMV8wMDBfMDAwOyAgLy8gZm9yIGxhcmdlIHNldCBhcm91bmQgNUdCLCB0cnkgZS5nLjogNTM2Xzg3MF85MTI7CisgICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgVGhyb3dhYmxlIGV4Y2VwdGlvbjsKKworICAgIHByaXZhdGUgc3RhdGljIFN0cmVhbWluZ091dHB1dCBsb25nRGF0YShsb25nIHNlcXVlbmNlKSB7CisgICAgICAgIHJldHVybiBvdXQgLT4geworICAgICAgICAgICAgbG9uZyBvZmZzZXQgPSAwOworICAgICAgICAgICAgd2hpbGUgKG9mZnNldCA8IHNlcXVlbmNlKSB7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlKExvbmcudG9TdHJpbmcob2Zmc2V0KS5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGUoJ1xuJyk7CisgICAgICAgICAgICAgICAgb2Zmc2V0Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgUmVzb3VyY2VDb25maWcgY29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKEh0dHBNZXRob2RSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihuZXcgTG9nZ2luZ0ZlYXR1cmUoTE9HR0VSLCBMb2dnaW5nRmVhdHVyZS5WZXJib3NpdHkuSEVBREVSU19PTkxZKSk7CisgICAgICAgIHJldHVybiBjb25maWc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBBcGFjaGVDb25uZWN0b3JQcm92aWRlcigpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHBvc3RXaXRoTGFyZ2VEYXRhKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIFdlYlRhcmdldCB3ZWJUYXJnZXQgPSB0YXJnZXQoInRlc3QiKTsKKworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHdlYlRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KGxvbmdEYXRhKExPTkdfREFUQV9TSVpFKSwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoZXhjZXB0aW9uICE9IG51bGwpIHsKKworICAgICAgICAgICAgICAgIC8vIHRoZSByZWFzb24gdG8gdGhyb3cgdGhlIGV4Y2VwdGlvbiBpcyB0aGF0IEludGVsbGlKIGdpdmVzIHlvdSBhbiBvcHRpb24gdG8gY29tcGFyZSB0aGUgZXhwZWN0ZWQgd2l0aCB0aGUgYWN0dWFsCisgICAgICAgICAgICAgICAgdGhyb3cgZXhjZXB0aW9uOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGVycm9yOiAiICsgcmVzcG9uc2UuZ2V0U3RhdHVzKCksCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cy5GYW1pbHkuU1VDQ0VTU0ZVTCwKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZ2V0U3RhdHVzSW5mbygpLmdldEZhbWlseSgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHJlc3BvbnNlLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL3Rlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSHR0cE1ldGhvZFJlc291cmNlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgcG9zdChJbnB1dFN0cmVhbSBjb250ZW50KSB7CisgICAgICAgICAgICB0cnkgeworCisgICAgICAgICAgICAgICAgbG9uZ0RhdGEoTE9OR19EQVRBX1NJWkUpLndyaXRlKG5ldyBPdXRwdXRTdHJlYW0oKSB7CisKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBsb25nIHBvc2l0aW9uID0gMDsKKy8vICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGxvbmcgbWJSZWFkID0gMDsKKworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoZmluYWwgaW50IGdlbmVyYXRlZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWNlaXZlZCA9IGNvbnRlbnQucmVhZCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVjZWl2ZWQgIT0gZ2VuZXJhdGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJCeXRlcyBkb24ndCBtYXRjaCBhdCBwb3NpdGlvbiAiICsgcG9zaXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIjogcmVjZWl2ZWQ9IiArIHJlY2VpdmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGdlbmVyYXRlZD0iICsgZ2VuZXJhdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24rKzsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uICUgKDEwMjQgKiAxMDI0KSA9PSAwKSB7CisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYlJlYWQrKzsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTUIgcmVhZDogIiArIG1iUmVhZCk7CisvLyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiA9IGU7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZlckVycm9yRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpLCA1MDAsIGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2FwYWNoZS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9hcGFjaGUvY29ubmVjdG9yL01hbmFnZWRDbGllbnRUZXN0LmphdmEgYi9jb25uZWN0b3JzL2FwYWNoZS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9hcGFjaGUvY29ubmVjdG9yL01hbmFnZWRDbGllbnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYxZjFjMwotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvYXBhY2hlLWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2FwYWNoZS9jb25uZWN0b3IvTWFuYWdlZENsaWVudFRlc3QuamF2YQpAQCAtMCwwICsxLDI2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5hcGFjaGUuY29ubmVjdG9yOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuRHluYW1pY0ZlYXR1cmU7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlJlc291cmNlSW5mbzsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ2xpZW50QmluZGluZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlVyaTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogSmVyc2V5IHByb2dyYW1tYXRpYyBtYW5hZ2VkIGNsaWVudCB0ZXN0CisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIE1hbmFnZWRDbGllbnRUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihNYW5hZ2VkQ2xpZW50VGVzdC5jbGFzcy5nZXROYW1lKCkpOworCisgICAgLyoqCisgICAgICogTWFuYWdlZCBjbGllbnQgY29uZmlndXJhdGlvbiBmb3IgY2xpZW50IEEuCisgICAgICoKKyAgICAgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICAgICAqLworICAgIEBDbGllbnRCaW5kaW5nKGNvbmZpZ0NsYXNzID0gTXlDbGllbnRBQ29uZmlnLmNsYXNzKQorICAgIEBEb2N1bWVudGVkCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgICBAVGFyZ2V0KHtFbGVtZW50VHlwZS5GSUVMRCwgRWxlbWVudFR5cGUuUEFSQU1FVEVSfSkKKyAgICBwdWJsaWMgc3RhdGljIEBpbnRlcmZhY2UgQ2xpZW50QSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFuYWdlZCBjbGllbnQgY29uZmlndXJhdGlvbiBmb3IgY2xpZW50IEIuCisgICAgICoKKyAgICAgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICAgICAqLworICAgIEBDbGllbnRCaW5kaW5nKGNvbmZpZ0NsYXNzID0gTXlDbGllbnRCQ29uZmlnLmNsYXNzKQorICAgIEBEb2N1bWVudGVkCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgICBAVGFyZ2V0KHtFbGVtZW50VHlwZS5GSUVMRCwgRWxlbWVudFR5cGUuUEFSQU1FVEVSfSkKKyAgICBwdWJsaWMgQGludGVyZmFjZSBDbGllbnRCIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEeW5hbWljIGZlYXR1cmUgdGhhdCBhcHBlbmRzIGEgcHJvcGVybHkgY29uZmlndXJlZCB7QGxpbmsgQ3VzdG9tSGVhZGVyRmlsdGVyfSBpbnN0YW5jZQorICAgICAqIHRvIGV2ZXJ5IG1ldGhvZCB0aGF0IGlzIGFubm90YXRlZCB3aXRoIHtAbGluayBSZXF1aXJlICYjNjQ7UmVxdWlyZX0gaW50ZXJuYWwgZmVhdHVyZQorICAgICAqIGFubm90YXRpb24uCisgICAgICoKKyAgICAgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ3VzdG9tSGVhZGVyRmVhdHVyZSBpbXBsZW1lbnRzIER5bmFtaWNGZWF0dXJlIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogQSBtZXRob2QgYW5ub3RhdGlvbiB0byBiZSBwbGFjZWQgb24gdGhvc2UgcmVzb3VyY2UgbWV0aG9kcyB0byB3aGljaCBhIHZhbGlkYXRpbmcKKyAgICAgICAgICoge0BsaW5rIEN1c3RvbUhlYWRlckZpbHRlcn0gaW5zdGFuY2Ugc2hvdWxkIGJlIGFkZGVkLgorICAgICAgICAgKi8KKyAgICAgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgICAgICAgQERvY3VtZW50ZWQKKyAgICAgICAgQFRhcmdldChFbGVtZW50VHlwZS5NRVRIT0QpCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQGludGVyZmFjZSBSZXF1aXJlIHsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBFeHBlY3RlZCBjdXN0b20gaGVhZGVyIG5hbWUgdG8gYmUgdmFsaWRhdGVkIGJ5IHRoZSB7QGxpbmsgQ3VzdG9tSGVhZGVyRmlsdGVyfS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIFN0cmluZyBoZWFkZXJOYW1lKCk7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogRXhwZWN0ZWQgY3VzdG9tIGhlYWRlciB2YWx1ZSB0byBiZSB2YWxpZGF0ZWQgYnkgdGhlIHtAbGluayBDdXN0b21IZWFkZXJGaWx0ZXJ9LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGhlYWRlclZhbHVlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY29uZmlndXJlKFJlc291cmNlSW5mbyByZXNvdXJjZUluZm8sIEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIGZpbmFsIFJlcXVpcmUgdmEgPSByZXNvdXJjZUluZm8uZ2V0UmVzb3VyY2VNZXRob2QoKS5nZXRBbm5vdGF0aW9uKFJlcXVpcmUuY2xhc3MpOworICAgICAgICAgICAgaWYgKHZhICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKG5ldyBDdXN0b21IZWFkZXJGaWx0ZXIodmEuaGVhZGVyTmFtZSgpLCB2YS5oZWFkZXJWYWx1ZSgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGZpbHRlciBmb3IgYXBwZW5kaW5nIGFuZCB2YWxpZGF0aW5nIGN1c3RvbSBoZWFkZXJzLgorICAgICAqIDxwPgorICAgICAqIE9uIHRoZSBjbGllbnQgc2lkZSwgYXBwZW5kcyBhIG5ldyBjdXN0b20gcmVxdWVzdCBoZWFkZXIgd2l0aCBhIGNvbmZpZ3VyZWQgbmFtZSBhbmQgdmFsdWUgdG8gZWFjaCBvdXRnb2luZyByZXF1ZXN0LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBPbiB0aGUgc2VydmVyIHNpZGUsIHZhbGlkYXRlcyB0aGF0IGVhY2ggcmVxdWVzdCBoYXMgYSBjdXN0b20gaGVhZGVyIHdpdGggYSBjb25maWd1cmVkIG5hbWUgYW5kIHZhbHVlLgorICAgICAqIElmIHRoZSB2YWxpZGF0aW9uIGZhaWxzIGEgSFRUUCA0MDMgcmVzcG9uc2UgaXMgcmV0dXJuZWQuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEN1c3RvbUhlYWRlckZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIsIENsaWVudFJlcXVlc3RGaWx0ZXIgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGhlYWRlck5hbWU7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGhlYWRlclZhbHVlOworCisgICAgICAgIHB1YmxpYyBDdXN0b21IZWFkZXJGaWx0ZXIoU3RyaW5nIGhlYWRlck5hbWUsIFN0cmluZyBoZWFkZXJWYWx1ZSkgeworICAgICAgICAgICAgaWYgKGhlYWRlck5hbWUgPT0gbnVsbCB8fCBoZWFkZXJWYWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSGVhZGVyIG5hbWUgYW5kIHZhbHVlIG11c3Qgbm90IGJlIG51bGwuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLmhlYWRlck5hbWUgPSBoZWFkZXJOYW1lOworICAgICAgICAgICAgdGhpcy5oZWFkZXJWYWx1ZSA9IGhlYWRlclZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCBjdHgpIHRocm93cyBJT0V4Y2VwdGlvbiB7IC8vIHZhbGlkYXRlCisgICAgICAgICAgICBpZiAoIWhlYWRlclZhbHVlLmVxdWFscyhjdHguZ2V0SGVhZGVyU3RyaW5nKGhlYWRlck5hbWUpKSkgeworICAgICAgICAgICAgICAgIGN0eC5hYm9ydFdpdGgoUmVzcG9uc2Uuc3RhdHVzKFJlc3BvbnNlLlN0YXR1cy5GT1JCSURERU4pCisgICAgICAgICAgICAgICAgICAgICAgICAudHlwZShNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5lbnRpdHkoU3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JtYXQoIkV4cGVjdGVkIGhlYWRlciAnJXMnIG5vdCBwcmVzZW50IG9yIHZhbHVlIG5vdCBlcXVhbCB0byAnJXMnIiwgaGVhZGVyTmFtZSwgaGVhZGVyVmFsdWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDbGllbnRSZXF1ZXN0Q29udGV4dCBjdHgpIHRocm93cyBJT0V4Y2VwdGlvbiB7IC8vIGFwcGVuZAorICAgICAgICAgICAgY3R4LmdldEhlYWRlcnMoKS5wdXRTaW5nbGUoaGVhZGVyTmFtZSwgaGVhZGVyVmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgcmVzb3VyY2UgYWNjZXNzZWQgZnJvbSB0aGUgbWFuYWdlZCBjbGllbnQgcmVzb3VyY2UuCisgICAgICoKKyAgICAgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICAgICAqLworICAgIEBQYXRoKCJpbnRlcm5hbCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbnRlcm5hbFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJhIikKKyAgICAgICAgQEN1c3RvbUhlYWRlckZlYXR1cmUuUmVxdWlyZShoZWFkZXJOYW1lID0gImN1c3RvbS1oZWFkZXIiLCBoZWFkZXJWYWx1ZSA9ICJhIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRBKCkgeworICAgICAgICAgICAgcmV0dXJuICJhIjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImIiKQorICAgICAgICBAQ3VzdG9tSGVhZGVyRmVhdHVyZS5SZXF1aXJlKGhlYWRlck5hbWUgPSAiY3VzdG9tLWhlYWRlciIsIGhlYWRlclZhbHVlID0gImIiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEIoKSB7CisgICAgICAgICAgICByZXR1cm4gImIiOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSByZXNvdXJjZSB0aGF0IHVzZXMgbWFuYWdlZCBjbGllbnRzIHRvIHJldHJpZXZlIHZhbHVlcyBvZiBpbnRlcm5hbAorICAgICAqIHJlc291cmNlcyAnQScgYW5kICdCJywgd2hpY2ggYXJlIHByb3RlY3RlZCBieSBhIHtAbGluayBDdXN0b21IZWFkZXJGaWx0ZXJ9CisgICAgICogYW5kIHJlcXVpcmUgYSBzcGVjaWZpYyBjdXN0b20gaGVhZGVyIGluIGEgcmVxdWVzdCB0byBiZSBzZXQgdG8gYSBzcGVjaWZpYyB2YWx1ZS4KKyAgICAgKiA8cD4KKyAgICAgKiBQcm9wZXJseSBjb25maWd1cmVkIG1hbmFnZWQgY2xpZW50cyBoYXZlIGEge0Bjb2RlIEN1c3RvbUhlYWRlckZpbHRlcn0gaW5zdGFuY2UKKyAgICAgKiBjb25maWd1cmVkIHRvIGluc2VydCB0aGUge0BsaW5rIEN1c3RvbUhlYWRlckZlYXR1cmUuUmVxdWlyZSByZXF1aXJlZH0gY3VzdG9tIGhlYWRlcgorICAgICAqIHdpdGggYSBwcm9wZXIgdmFsdWUgaW50byB0aGUgb3V0Z29pbmcgY2xpZW50IHJlcXVlc3RzLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgICAgICovCisgICAgQFBhdGgoInB1YmxpYyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQdWJsaWNSZXNvdXJjZSB7CisKKyAgICAgICAgQFVyaSgiYSIpCisgICAgICAgIEBDbGllbnRBIC8vIHJlc29sdmVzIHRvIDxiYXNlPi9pbnRlcm5hbC9hCisgICAgICAgIHByaXZhdGUgV2ViVGFyZ2V0IHRhcmdldEE7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgICAgICBAUGF0aCgiYSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0QSgpIHsKKyAgICAgICAgICAgIHJldHVybiB0YXJnZXRBLnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfUExBSU4pLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgICAgICBAUGF0aCgiYiIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXRUYXJnZXRCKEBVcmkoImludGVybmFsL2IiKSBAQ2xpZW50QiBXZWJUYXJnZXQgdGFyZ2V0QikgeworICAgICAgICAgICAgcmV0dXJuIHRhcmdldEIucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9QTEFJTikuZ2V0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBSZXNvdXJjZUNvbmZpZyBjb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoUHVibGljUmVzb3VyY2UuY2xhc3MsIEludGVybmFsUmVzb3VyY2UuY2xhc3MsIEN1c3RvbUhlYWRlckZlYXR1cmUuY2xhc3MpCisgICAgICAgICAgICAgICAgLnByb3BlcnR5KENsaWVudEEuY2xhc3MuZ2V0TmFtZSgpICsgIi5iYXNlVXJpIiwgdGhpcy5nZXRCYXNlVXJpKCkudG9TdHJpbmcoKSArICJpbnRlcm5hbCIpOworICAgICAgICBjb25maWcucmVnaXN0ZXIobmV3IExvZ2dpbmdGZWF0dXJlKExPR0dFUiwgTG9nZ2luZ0ZlYXR1cmUuVmVyYm9zaXR5LlBBWUxPQURfQU5ZKSk7CisgICAgICAgIHJldHVybiBjb25maWc7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUNsaWVudEFDb25maWcgZXh0ZW5kcyBDbGllbnRDb25maWcgeworCisgICAgICAgIHB1YmxpYyBNeUNsaWVudEFDb25maWcoKSB7CisgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyKG5ldyBDdXN0b21IZWFkZXJGaWx0ZXIoImN1c3RvbS1oZWFkZXIiLCAiYSIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlDbGllbnRCQ29uZmlnIGV4dGVuZHMgQ2xpZW50Q29uZmlnIHsKKworICAgICAgICBwdWJsaWMgTXlDbGllbnRCQ29uZmlnKCkgeworICAgICAgICAgICAgdGhpcy5yZWdpc3RlcihuZXcgQ3VzdG9tSGVhZGVyRmlsdGVyKCJjdXN0b20taGVhZGVyIiwgImIiKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcuY29ubmVjdG9yUHJvdmlkZXIobmV3IEFwYWNoZUNvbm5lY3RvclByb3ZpZGVyKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCBhIGNvbm5lY3Rpb24gdmlhIG1hbmFnZWQgY2xpZW50cyB3b3JrcyBwcm9wZXJseS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGluIGNhc2Ugb2YgdGVzdCBmYWlsdXJlLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hbmFnZWRDbGllbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHJlc291cmNlID0gdGFyZ2V0KCkucGF0aCgicHVibGljIikucGF0aCgie25hbWV9Iik7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlOworCisgICAgICAgIHJlc3BvbnNlID0gcmVzb3VyY2UucmVzb2x2ZVRlbXBsYXRlKCJuYW1lIiwgImEiKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworCisgICAgICAgIHJlc3BvbnNlID0gcmVzb3VyY2UucmVzb2x2ZVRlbXBsYXRlKCJuYW1lIiwgImIiKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImIiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9hcGFjaGUtY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvYXBhY2hlL2Nvbm5lY3Rvci9Ob0VudGl0eVRlc3QuamF2YSBiL2Nvbm5lY3RvcnMvYXBhY2hlLWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2FwYWNoZS9jb25uZWN0b3IvTm9FbnRpdHlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE2MmUxNAotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvYXBhY2hlLWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2FwYWNoZS9jb25uZWN0b3IvTm9FbnRpdHlUZXN0LmphdmEKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuYXBhY2hlLmNvbm5lY3RvcjsKKworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZS5TdGF0dXM7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgQXJ1bCBEaGVzaWFzZWVsYW4gKGFydWxkIGF0IGFjbS5vcmcpCisgKi8KK3B1YmxpYyBjbGFzcyBOb0VudGl0eVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihOb0VudGl0eVRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIEBQYXRoKCIvdGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBIdHRwTWV0aG9kUmVzb3VyY2UgeworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKFN0YXR1cy5DT05GTElDVCkuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyB2b2lkIHBvc3QoU3RyaW5nIGVudGl0eSkgeworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgUmVzb3VyY2VDb25maWcgY29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKEh0dHBNZXRob2RSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihuZXcgTG9nZ2luZ0ZlYXR1cmUoTE9HR0VSLCBMb2dnaW5nRmVhdHVyZS5WZXJib3NpdHkuUEFZTE9BRF9BTlkpKTsKKyAgICAgICAgcmV0dXJuIGNvbmZpZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcuY29ubmVjdG9yUHJvdmlkZXIobmV3IEFwYWNoZUNvbm5lY3RvclByb3ZpZGVyKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldCgpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHIgPSB0YXJnZXQoInRlc3QiKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgeworICAgICAgICAgICAgUmVzcG9uc2UgY3IgPSByLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgICAgIGNyLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRXaXRoQ2xvc2UoKSB7CisgICAgICAgIFdlYlRhcmdldCByID0gdGFyZ2V0KCJ0ZXN0Iik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7CisgICAgICAgICAgICBSZXNwb25zZSBjciA9IHIucmVxdWVzdCgpLmdldCgpOworICAgICAgICAgICAgY3IuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc3QoKSB7CisgICAgICAgIFdlYlRhcmdldCByID0gdGFyZ2V0KCJ0ZXN0Iik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7CisgICAgICAgICAgICBSZXNwb25zZSBjciA9IHIucmVxdWVzdCgpLnBvc3QobnVsbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0V2l0aENsb3NlKCkgeworICAgICAgICBXZWJUYXJnZXQgciA9IHRhcmdldCgidGVzdCIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgeworICAgICAgICAgICAgUmVzcG9uc2UgY3IgPSByLnJlcXVlc3QoKS5wb3N0KG51bGwpOworICAgICAgICAgICAgY3IuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvYXBhY2hlLWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2FwYWNoZS9jb25uZWN0b3IvUmV0cnlIYW5kbGVyVGVzdC5qYXZhIGIvY29ubmVjdG9ycy9hcGFjaGUtY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvYXBhY2hlL2Nvbm5lY3Rvci9SZXRyeUhhbmRsZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc3OWQxMgotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvYXBhY2hlLWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2FwYWNoZS9jb25uZWN0b3IvUmV0cnlIYW5kbGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmFwYWNoZS5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuUmVxdWVzdEVudGl0eVByb2Nlc3Npbmc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQuSHR0cFJlcXVlc3RSZXRyeUhhbmRsZXI7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitwdWJsaWMgY2xhc3MgUmV0cnlIYW5kbGVyVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRUFEX1RJTUVPVVRfTVMgPSAxMDA7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJldHJ5SGFuZGxlclJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXRyeUhhbmRsZXJSZXNvdXJjZSB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIGludCBwb3N0UmVxdWVzdE51bWJlciA9IDA7CisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIGludCBnZXRSZXF1ZXN0TnVtYmVyID0gMDsKKworICAgICAgICAvLyBDYXVzZSBhIHRpbWVvdXQgb24gdGhlIGZpcnN0IEdFVCBhbmQgUE9TVCByZXF1ZXN0CisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoQENvbnRleHQgSHR0cEhlYWRlcnMgaCkgeworICAgICAgICAgICAgaWYgKGdldFJlcXVlc3ROdW1iZXIrKyA9PSAwKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFJFQURfVElNRU9VVF9NUyAqIDEwKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gIkdFVCI7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3QoQENvbnRleHQgSHR0cEhlYWRlcnMgaCwgU3RyaW5nIGUpIHsKKyAgICAgICAgICAgIGlmIChwb3N0UmVxdWVzdE51bWJlcisrID09IDApIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoUkVBRF9USU1FT1VUX01TICogMTApOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAiUE9TVCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXRyeUdldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIENsaWVudENvbmZpZyBjYyA9IG5ldyBDbGllbnRDb25maWcoKTsKKyAgICAgICAgY2MuY29ubmVjdG9yUHJvdmlkZXIobmV3IEFwYWNoZUNvbm5lY3RvclByb3ZpZGVyKCkpOworICAgICAgICBjYy5wcm9wZXJ0eShBcGFjaGVDbGllbnRQcm9wZXJ0aWVzLlJFVFJZX0hBTkRMRVIsCisgICAgICAgICAgICAgICAgKEh0dHBSZXF1ZXN0UmV0cnlIYW5kbGVyKSAoZXhjZXB0aW9uLCBleGVjdXRpb25Db3VudCwgY29udGV4dCkgLT4gdHJ1ZSk7CisgICAgICAgIGNjLnByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuUkVBRF9USU1FT1VULCBSRUFEX1RJTUVPVVRfTVMpOworICAgICAgICBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoY2MpOworCisgICAgICAgIFdlYlRhcmdldCByID0gY2xpZW50LnRhcmdldChnZXRCYXNlVXJpKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCIsIHIucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXRyeVBvc3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBDbGllbnRDb25maWcgY2MgPSBuZXcgQ2xpZW50Q29uZmlnKCk7CisgICAgICAgIGNjLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBBcGFjaGVDb25uZWN0b3JQcm92aWRlcigpKTsKKyAgICAgICAgY2MucHJvcGVydHkoQXBhY2hlQ2xpZW50UHJvcGVydGllcy5SRVRSWV9IQU5ETEVSLAorICAgICAgICAgICAgICAgIChIdHRwUmVxdWVzdFJldHJ5SGFuZGxlcikgKGV4Y2VwdGlvbiwgZXhlY3V0aW9uQ291bnQsIGNvbnRleHQpIC0+IHRydWUpOworICAgICAgICBjYy5wcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLlJFQURfVElNRU9VVCwgUkVBRF9USU1FT1VUX01TKTsKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KGNjKTsKKworICAgICAgICBXZWJUYXJnZXQgciA9IGNsaWVudC50YXJnZXQoZ2V0QmFzZVVyaSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJQT1NUIiwgci5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLlJFUVVFU1RfRU5USVRZX1BST0NFU1NJTkcsIFJlcXVlc3RFbnRpdHlQcm9jZXNzaW5nLkJVRkZFUkVEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LnRleHQoIlBPU1QiKSwgU3RyaW5nLmNsYXNzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9hcGFjaGUtY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvYXBhY2hlL2Nvbm5lY3Rvci9TcGVjaWFsSGVhZGVyVGVzdC5qYXZhIGIvY29ubmVjdG9ycy9hcGFjaGUtY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvYXBhY2hlL2Nvbm5lY3Rvci9TcGVjaWFsSGVhZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YmZhZGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL2FwYWNoZS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9hcGFjaGUvY29ubmVjdG9yL1NwZWNpYWxIZWFkZXJUZXN0LmphdmEKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5hcGFjaGUuY29ubmVjdG9yOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5HWmlwRW5jb2RlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBTcGVjaWFsSGVhZGVyVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoTXlSZXNvdXJjZS5jbGFzcywgR1ppcEVuY29kZXIuY2xhc3MsIExvZ2dpbmdGZWF0dXJlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAUGF0aCgicmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlSZXNvdXJjZSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgQFBhdGgoImVuY29kZWQiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0RW5jb2RlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygiZ2V0IikuaGVhZGVyKEh0dHBIZWFkZXJzLkNPTlRFTlRfRU5DT0RJTkcsICJnemlwIikuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgQFBhdGgoIm5vbi1lbmNvZGVkIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldE5vcm1hbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygiZ2V0IikuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5jb25uZWN0b3JQcm92aWRlcihuZXcgQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgfQorCisKKyAgICBAVGVzdAorICAgIEBJZ25vcmUoIkFwYWNoZSBjb25uZWN0b3IgZG9lcyBub3QgcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCBlbmNvZGluZyBmb3IgZ3ppcCBhbmQgZGVmbGF0ZSBlbmNvZGluZyIpCisgICAgcHVibGljIHZvaWQgdGVzdEVuY29kZWQoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UvZW5jb2RlZCIpLnJlcXVlc3QoInRleHQvcGxhaW4iKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiZ2V0IiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiZ3ppcCIsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5DT05URU5UX0VOQ09ESU5HKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInRleHQvcGxhaW4iLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoSHR0cEhlYWRlcnMuQ09OVEVOVF9UWVBFKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMywgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKEh0dHBIZWFkZXJzLkNPTlRFTlRfTEVOR1RIKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uRW5jb2RlZCgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZS9ub24tZW5jb2RlZCIpLnJlcXVlc3QoInRleHQvcGxhaW4iKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiZ2V0IiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydE51bGwocmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKEh0dHBIZWFkZXJzLkNPTlRFTlRfRU5DT0RJTkcpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygidGV4dC9wbGFpbiIsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5DT05URU5UX1RZUEUpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiMyIsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5DT05URU5UX0xFTkdUSCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvYXBhY2hlLWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2FwYWNoZS9jb25uZWN0b3IvU3RyZWFtaW5nVGVzdC5qYXZhIGIvY29ubmVjdG9ycy9hcGFjaGUtY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvYXBhY2hlL2Nvbm5lY3Rvci9TdHJlYW1pbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ2YzJjMwotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvYXBhY2hlLWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2FwYWNoZS9jb25uZWN0b3IvU3RyZWFtaW5nVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuYXBhY2hlLmNvbm5lY3RvcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5DaHVua2VkT3V0cHV0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQGF1dGhvciBQZXRyIEphbm91Y2ggKHBldHIuamFub3VjaCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgU3RyZWFtaW5nVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgLyoqCisgICAgICogVGVzdCB0aGF0IGEgZGF0YSBzdHJlYW0gY2FuIGJlIHRlcm1pbmF0ZWQgZnJvbSB0aGUgY2xpZW50IHNpZGUuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjbGllbnRDbG9zZVRlc3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBzdGFydCBzdHJlYW1pbmcKKyAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSB0YXJnZXQoKS5wYXRoKCIvc3RyZWFtaW5nRW5kcG9pbnQiKS5yZXF1ZXN0KCkuZ2V0KElucHV0U3RyZWFtLmNsYXNzKTsKKworICAgICAgICBXZWJUYXJnZXQgc2VuZFRhcmdldCA9IHRhcmdldCgpLnBhdGgoIi9zdHJlYW1pbmdFbmRwb2ludC9zZW5kIik7CisgICAgICAgIC8vIHRyaWdnZXIgc2VuZGluZyAnQScgdG8gdGhlIHN0cmVhbTsgT0sgaXMgc2VudCBpZiBldmVyeXRoaW5nIG9uIHRoZSBzZXJ2ZXIgd2FzIE9LCisgICAgICAgIGFzc2VydEVxdWFscygiT0siLCBzZW5kVGFyZ2V0LnJlcXVlc3QoKS5nZXQoKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICAvLyBjaGVjayAnQScgaGFzIGJlZW4gc2VudAorICAgICAgICBhc3NlcnRFcXVhbHMoJ0EnLCBpbnB1dFN0cmVhbS5yZWFkKCkpOworICAgICAgICAvLyBjbG9zaW5nIHRoZSBzdHJlYW0gc2hvdWxkIHRlYXIgZG93biB0aGUgY29ubmVjdGlvbgorICAgICAgICBpbnB1dFN0cmVhbS5jbG9zZSgpOworICAgICAgICAvLyB0cmlnZ2VyIHNlbmRpbmcgYW5vdGhlciAnQScgdG8gdGhlIHN0cmVhbTsgaXQgc2hvdWxkIGZhaWwKKyAgICAgICAgLy8gKGluZGljYXRpbmcgdGhhdCB0aGUgc3RyZWFtaW5nIGhhcyBiZWVuIHRlcm1pbmF0ZWQgb24gdGhlIHNlcnZlcikKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJOT0siLCBzZW5kVGFyZ2V0LnJlcXVlc3QoKS5nZXQoKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5jb25uZWN0b3JQcm92aWRlcihuZXcgQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhTdHJlYW1pbmdFbmRwb2ludC5jbGFzcyk7CisgICAgfQorCisgICAgQFNpbmdsZXRvbgorICAgIEBQYXRoKCJzdHJlYW1pbmdFbmRwb2ludCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdHJlYW1pbmdFbmRwb2ludCB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDaHVua2VkT3V0cHV0PFN0cmluZz4gb3V0cHV0ID0gbmV3IENodW5rZWRPdXRwdXQ8PihTdHJpbmcuY2xhc3MpOworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInNlbmQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHNlbmRFdmVudCgpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgb3V0cHV0LndyaXRlKCJBIik7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJOT0siOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gIk9LIjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgICAgICBwdWJsaWMgQ2h1bmtlZE91dHB1dDxTdHJpbmc+IGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2FwYWNoZS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9hcGFjaGUvY29ubmVjdG9yL1RpbWVvdXRUZXN0LmphdmEgYi9jb25uZWN0b3JzL2FwYWNoZS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9hcGFjaGUvY29ubmVjdG9yL1RpbWVvdXRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY4NjBjZgotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvYXBhY2hlLWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2FwYWNoZS9jb25uZWN0b3IvVGltZW91dFRlc3QuamF2YQpAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5hcGFjaGUuY29ubmVjdG9yOworCitpbXBvcnQgamF2YS5uZXQuU29ja2V0VGltZW91dEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaW5zdGFuY2VPZjsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCisvKioKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICogQGF1dGhvciBBcnVsIERoZXNpYXNlZWxhbiAoYXJ1bGQgYXQgYWNtLm9yZykKKyAqLworcHVibGljIGNsYXNzIFRpbWVvdXRUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoVGltZW91dFRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIEBQYXRoKCIvdGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUaW1lb3V0UmVzb3VyY2UgeworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJHRVQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgidGltZW91dCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGltZW91dCgpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDIwMDApOworICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gIkdFVCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyBjb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoVGltZW91dFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKG5ldyBMb2dnaW5nRmVhdHVyZShMT0dHRVIsIExvZ2dpbmdGZWF0dXJlLlZlcmJvc2l0eS5QQVlMT0FEX0FOWSkpOworICAgICAgICByZXR1cm4gY29uZmlnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChmaW5hbCBDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5wcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLlJFQURfVElNRU9VVCwgMTAwMCk7CisgICAgICAgIGNvbmZpZy5jb25uZWN0b3JQcm92aWRlcihuZXcgQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmFzdCgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgciA9IHRhcmdldCgidGVzdCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgci5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiR0VUIiwgci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNsb3coKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0YXJnZXQoInRlc3QvdGltZW91dCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgICAgIGZhaWwoIlRpbWVvdXQgZXhwZWN0ZWQuIik7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFByb2Nlc3NpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VGhhdCgiVW5leHBlY3RlZCBwcm9jZXNzaW5nIGV4Y2VwdGlvbiBjYXVzZSIsCisgICAgICAgICAgICAgICAgICAgIGUuZ2V0Q2F1c2UoKSwgaW5zdGFuY2VPZihTb2NrZXRUaW1lb3V0RXhjZXB0aW9uLmNsYXNzKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQZXJSZXF1ZXN0VGltZW91dCgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgciA9IHRhcmdldCgidGVzdC90aW1lb3V0IikucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLnByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuUkVBRF9USU1FT1VULCAzMDAwKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgci5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiR0VUIiwgci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvYXBhY2hlLWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2FwYWNoZS9jb25uZWN0b3IvVHJhY2VTdXBwb3J0VGVzdC5qYXZhIGIvY29ubmVjdG9ycy9hcGFjaGUtY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvYXBhY2hlL2Nvbm5lY3Rvci9UcmFjZVN1cHBvcnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY5MWJiOQotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvYXBhY2hlLWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2FwYWNoZS9jb25uZWN0b3IvVHJhY2VTdXBwb3J0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMjM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmFwYWNoZS5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkh0dHBNZXRob2Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlcXVlc3Q7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLkluZmxlY3RvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICogVGhpcyB2ZXJ5IGJhc2ljIHJlc291cmNlIHNob3djYXNlcyBzdXBwb3J0IG9mIGEgSFRUUCBUUkFDRSBtZXRob2QsCisgKiBub3QgZGlyZWN0bHkgc3VwcG9ydGVkIGJ5IEpBWC1SUyBBUEkuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFRyYWNlU3VwcG9ydFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFRyYWNlU3VwcG9ydFRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIC8qKgorICAgICAqIFByb2dyYW1tYXRpYyB0cmFjaW5nIHJvb3QgcmVzb3VyY2UgcGF0aC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST09UX1BBVEhfUFJPR1JBTU1BVElDID0gInRyYWNpbmcvcHJvZ3JhbW1hdGljIjsKKworICAgIC8qKgorICAgICAqIEFubm90YXRlZCBjbGFzcy1iYXNlZCB0cmFjaW5nIHJvb3QgcmVzb3VyY2UgcGF0aC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST09UX1BBVEhfQU5OT1RBVEVEID0gInRyYWNpbmcvYW5ub3RhdGVkIjsKKworICAgIEBIdHRwTWV0aG9kKFRSQUNFLk5BTUUpCisgICAgQFRhcmdldChFbGVtZW50VHlwZS5NRVRIT0QpCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgICBwdWJsaWMgQGludGVyZmFjZSBUUkFDRSB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAiVFJBQ0UiOworICAgIH0KKworICAgIEBQYXRoKFJPT1RfUEFUSF9BTk5PVEFURUQpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUcmFjaW5nUmVzb3VyY2UgeworCisgICAgICAgIEBUUkFDRQorICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRyYWNlKFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICAgICAgcmV0dXJuIHN0cmluZ2lmeSgoQ29udGFpbmVyUmVxdWVzdCkgcmVxdWVzdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBSZXNvdXJjZUNvbmZpZyBjb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoVHJhY2luZ1Jlc291cmNlLmNsYXNzKTsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKG5ldyBMb2dnaW5nRmVhdHVyZShMT0dHRVIsIExvZ2dpbmdGZWF0dXJlLlZlcmJvc2l0eS5QQVlMT0FEX0FOWSkpOworICAgICAgICBmaW5hbCBSZXNvdXJjZS5CdWlsZGVyIHJlc291cmNlQnVpbGRlciA9IFJlc291cmNlLmJ1aWxkZXIoUk9PVF9QQVRIX1BST0dSQU1NQVRJQyk7CisgICAgICAgIHJlc291cmNlQnVpbGRlci5hZGRNZXRob2QoVFJBQ0UuTkFNRSkuaGFuZGxlZEJ5KG5ldyBJbmZsZWN0b3I8Q29udGFpbmVyUmVxdWVzdENvbnRleHQsIFJlc3BvbnNlPigpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgUmVzcG9uc2UgYXBwbHkoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdCkgeworICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm5vQ29udGVudCgpLmJ1aWxkKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKHN0cmluZ2lmeSgoQ29udGFpbmVyUmVxdWVzdCkgcmVxdWVzdCksIE1lZGlhVHlwZS5URVhUX1BMQUlOKS5idWlsZCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgcmV0dXJuIGNvbmZpZy5yZWdpc3RlclJlc291cmNlcyhyZXNvdXJjZUJ1aWxkZXIuYnVpbGQoKSk7CisKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZ1tdIGV4cGVjdGVkRnJhZ21lbnRzUHJvZ3JhbW1hdGljID0gbmV3IFN0cmluZ1tdeworICAgICAgICAgICAgIlRSQUNFIGh0dHA6Ly9sb2NhbGhvc3Q6IiArIHRoaXMuZ2V0UG9ydCgpICsgIi90cmFjaW5nL3Byb2dyYW1tYXRpYyIKKyAgICB9OworICAgIHByaXZhdGUgU3RyaW5nW10gZXhwZWN0ZWRGcmFnbWVudHNBbm5vdGF0ZWQgPSBuZXcgU3RyaW5nW117CisgICAgICAgICAgICAiVFJBQ0UgaHR0cDovL2xvY2FsaG9zdDoiICsgdGhpcy5nZXRQb3J0KCkgKyAiL3RyYWNpbmcvYW5ub3RhdGVkIgorICAgIH07CisKKyAgICBwcml2YXRlIFdlYlRhcmdldCBwcmVwYXJlVGFyZ2V0KFN0cmluZyBwYXRoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKTsKKyAgICAgICAgdGFyZ2V0LnJlZ2lzdGVyKExvZ2dpbmdGZWF0dXJlLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIHRhcmdldC5wYXRoKHBhdGgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByb2dyYW1tYXRpY0FwcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHByZXBhcmVUYXJnZXQoUk9PVF9QQVRIX1BST0dSQU1NQVRJQykucmVxdWVzdCgidGV4dC9wbGFpbiIpLm1ldGhvZChUUkFDRS5OQU1FKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoUmVzcG9uc2UuU3RhdHVzLk9LLmdldFN0YXR1c0NvZGUoKSwgcmVzcG9uc2UuZ2V0U3RhdHVzSW5mbygpLmdldFN0YXR1c0NvZGUoKSk7CisKKyAgICAgICAgU3RyaW5nIHJlc3BvbnNlRW50aXR5ID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBmb3IgKFN0cmluZyBleHBlY3RlZEZyYWdtZW50IDogZXhwZWN0ZWRGcmFnbWVudHNQcm9ncmFtbWF0aWMpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkIGZyYWdtZW50ICciICsgZXhwZWN0ZWRGcmFnbWVudCArICInIG5vdCBmb3VuZCBpbiByZXNwb25zZTpcbiIgKyByZXNwb25zZUVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgLy8gdG9Mb3dlckNhc2UgLSBodHRwIGhlYWRlciBmaWVsZCBuYW1lcyBhcmUgY2FzZSBpbnNlbnNpdGl2ZQorICAgICAgICAgICAgICAgICAgICByZXNwb25zZUVudGl0eS5jb250YWlucyhleHBlY3RlZEZyYWdtZW50KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0ZWRBcHAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSBwcmVwYXJlVGFyZ2V0KFJPT1RfUEFUSF9BTk5PVEFURUQpLnJlcXVlc3QoInRleHQvcGxhaW4iKS5tZXRob2QoVFJBQ0UuTkFNRSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJlc3BvbnNlLlN0YXR1cy5PSy5nZXRTdGF0dXNDb2RlKCksIHJlc3BvbnNlLmdldFN0YXR1c0luZm8oKS5nZXRTdGF0dXNDb2RlKCkpOworCisgICAgICAgIFN0cmluZyByZXNwb25zZUVudGl0eSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgZm9yIChTdHJpbmcgZXhwZWN0ZWRGcmFnbWVudCA6IGV4cGVjdGVkRnJhZ21lbnRzQW5ub3RhdGVkKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCBmcmFnbWVudCAnIiArIGV4cGVjdGVkRnJhZ21lbnQgKyAiJyBub3QgZm91bmQgaW4gcmVzcG9uc2U6XG4iICsgcmVzcG9uc2VFbnRpdHksCisgICAgICAgICAgICAgICAgICAgIC8vIHRvTG93ZXJDYXNlIC0gaHR0cCBoZWFkZXIgZmllbGQgbmFtZXMgYXJlIGNhc2UgaW5zZW5zaXRpdmUKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VFbnRpdHkuY29udGFpbnMoZXhwZWN0ZWRGcmFnbWVudCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhY2VXaXRoRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0VHJhY2VXaXRoRW50aXR5KGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNUcmFjZVdpdGhFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RUcmFjZVdpdGhFbnRpdHkodHJ1ZSwgZmFsc2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRyYWNlV2l0aEVudGl0eUFwYWNoZUNvbm5lY3RvcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdFRyYWNlV2l0aEVudGl0eShmYWxzZSwgdHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNUcmFjZVdpdGhFbnRpdHlBcGFjaGVDb25uZWN0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RUcmFjZVdpdGhFbnRpdHkodHJ1ZSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0VHJhY2VXaXRoRW50aXR5KGZpbmFsIGJvb2xlYW4gaXNBc3luYywgZmluYWwgYm9vbGVhbiB1c2VBcGFjaGVDb25uZWN0aW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB1c2VBcGFjaGVDb25uZWN0aW9uID8gZ2V0QXBhY2hlQ2xpZW50KCkudGFyZ2V0KHRhcmdldCgpLmdldFVyaSgpKSA6IHRhcmdldCgpOworICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhdGgoUk9PVF9QQVRIX0FOTk9UQVRFRCk7CisKKyAgICAgICAgICAgIGZpbmFsIEVudGl0eTxTdHJpbmc+IGVudGl0eSA9IEVudGl0eS5lbnRpdHkoInRyYWNlIiwgTWVkaWFUeXBlLldJTERDQVJEX1RZUEUpOworCisgICAgICAgICAgICBSZXNwb25zZSByZXNwb25zZTsKKyAgICAgICAgICAgIGlmICghaXNBc3luYykgeworICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5tZXRob2QoVFJBQ0UuTkFNRSwgZW50aXR5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLmFzeW5jKCkubWV0aG9kKFRSQUNFLk5BTUUsIGVudGl0eSkuZ2V0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZhaWwoIkEgVFJBQ0UgcmVxdWVzdCBNVVNUIE5PVCBpbmNsdWRlIGFuIGVudGl0eS4gKHJlc3BvbnNlPSIgKyByZXNwb25zZSArICIpIik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBPSworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBDbGllbnQgZ2V0QXBhY2hlQ2xpZW50KCkgeworICAgICAgICByZXR1cm4gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQobmV3IENsaWVudENvbmZpZygpLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBBcGFjaGVDb25uZWN0b3JQcm92aWRlcigpKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBzdHJpbmdpZnkoQ29udGFpbmVyUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworICAgICAgICBwcmludFJlcXVlc3RMaW5lKGJ1ZmZlciwgcmVxdWVzdCk7CisgICAgICAgIHByaW50UHJlZml4ZWRIZWFkZXJzKGJ1ZmZlciwgcmVxdWVzdC5nZXRIZWFkZXJzKCkpOworCisgICAgICAgIGlmIChyZXF1ZXN0Lmhhc0VudGl0eSgpKSB7CisgICAgICAgICAgICBidWZmZXIuYXBwZW5kKHJlcXVlc3QucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKS5hcHBlbmQoIlxuIik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludFJlcXVlc3RMaW5lKFN0cmluZ0J1aWxkZXIgYnVmZmVyLCBDb250YWluZXJSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgYnVmZmVyLmFwcGVuZChyZXF1ZXN0LmdldE1ldGhvZCgpKS5hcHBlbmQoIiAiKS5hcHBlbmQocmVxdWVzdC5nZXRVcmlJbmZvKCkuZ2V0UmVxdWVzdFVyaSgpLnRvQVNDSUlTdHJpbmcoKSkuYXBwZW5kKCJcbiIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnRQcmVmaXhlZEhlYWRlcnMoU3RyaW5nQnVpbGRlciBidWZmZXIsIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gaGVhZGVycykgeworICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZSA6IGhlYWRlcnMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHZhbCA9IGUuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIFN0cmluZyBoZWFkZXIgPSBlLmdldEtleSgpOworCisgICAgICAgICAgICBpZiAodmFsLnNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChoZWFkZXIpLmFwcGVuZCgiOiAiKS5hcHBlbmQodmFsLmdldCgwKSkuYXBwZW5kKCJcbiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICBib29sZWFuIGFkZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHMgOiB2YWwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFkZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCcsJyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYWRkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGhlYWRlcikuYXBwZW5kKCI6ICIpLmFwcGVuZChzYi50b1N0cmluZygpKS5hcHBlbmQoIlxuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2FwYWNoZS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9hcGFjaGUvY29ubmVjdG9yL1VuZGVybHlpbmdDb29raWVTdG9yZUFjY2Vzc1Rlc3QuamF2YSBiL2Nvbm5lY3RvcnMvYXBhY2hlLWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2FwYWNoZS9jb25uZWN0b3IvVW5kZXJseWluZ0Nvb2tpZVN0b3JlQWNjZXNzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMzhjODEKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL2FwYWNoZS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9hcGFjaGUvY29ubmVjdG9yL1VuZGVybHlpbmdDb29raWVTdG9yZUFjY2Vzc1Rlc3QuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmFwYWNoZS5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworCitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5Db29raWVTdG9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7CisKKy8qKgorICogVGVzdCBvZiBhY2Nlc3MgdG8gdGhlIHVuZGVybHlpbmcgQ29va2llU3RvcmUgaW5zdGFuY2UgdXNlZCBieSB0aGUgY29ubmVjdG9yLgorICoKKyAqIEBhdXRob3IgTWFrc2ltIE11a29zZXkgKG1tdWtvc2V5IGF0IGdtYWlsLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFVuZGVybHlpbmdDb29raWVTdG9yZUFjY2Vzc1Rlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29va2llU3RvcmVJbnN0YW5jZUFjY2VzcygpIHsKKyAgICAgICAgZmluYWwgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KG5ldyBDbGllbnRDb25maWcoKS5jb25uZWN0b3JQcm92aWRlcihuZXcgQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXIoKSkpOworICAgICAgICBmaW5hbCBDb29raWVTdG9yZSBjc09uQ2xpZW50ID0gQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXIuZ2V0Q29va2llU3RvcmUoY2xpZW50KTsKKyAgICAgICAgLy8gaW1wb3J0YW50OiB0aGUgd2ViIHRhcmdldCBpbnN0YW5jZSBpbiB0aGlzIHRlc3QgbXVzdCBiZSBvbmx5IGNyZWF0ZWQgQUZURVIgdGhlIGNsaWVudCBoYXMgYmVlbiBwcmUtaW5pdGlhbGl6ZWQKKyAgICAgICAgLy8gKHNlZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuSW5pdGlhbGl6YWJsZS5wcmVJbml0aWFsaXplIG1ldGhvZCkuIFRoaXMgaXMgaGVyZSBhY2hpZXZlZCBieSBjYWxsaW5nIHRoZQorICAgICAgICAvLyBjb25uZWN0b3IgcHJvdmlkZXIncyBzdGF0aWMgZ2V0Q29va2llU3RvcmUgbWV0aG9kIGFib3ZlLgorICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gY2xpZW50LnRhcmdldCgiaHR0cDovL2xvY2FsaG9zdC8iKTsKKyAgICAgICAgZmluYWwgQ29va2llU3RvcmUgY3NPblRhcmdldCA9IEFwYWNoZUNvbm5lY3RvclByb3ZpZGVyLmdldENvb2tpZVN0b3JlKHRhcmdldCk7CisKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiQ29va2llU3RvcmUgaW5zdGFuY2Ugc2V0IG9uIEplcnNleUNsaWVudCBzaG91bGQgbm90IGJlIG51bGwuIiwgY3NPbkNsaWVudCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIkNvb2tpZVN0b3JlIGluc3RhbmNlIHNldCBvbiBKZXJzZXlXZWJUYXJnZXQgc2hvdWxkIG5vdCBiZSBudWxsLiIsIGNzT25UYXJnZXQpOworICAgICAgICBhc3NlcnRTYW1lKCJDb29raWVTdG9yZSBpbnN0YW5jZSBzZXQgb24gSmVyc2V5Q2xpZW50IHNob3VsZCBiZSB0aGUgc2FtZSBpbnN0YW5jZSBhcyB0aGUgb25lIHNldCBvbiBKZXJzZXlXZWJUYXJnZXQiCisgICAgICAgICAgICAgICAgKyAiKHByb3ZpZGVkIHRoZSB0YXJnZXQgaW5zdGFuY2UgaGFzIG5vdCBiZWVuIGZ1cnRoZXIgY29uZmlndXJlZCkuIiwgY3NPbkNsaWVudCwgY3NPblRhcmdldCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9hcGFjaGUtY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvYXBhY2hlL2Nvbm5lY3Rvci9VbmRlcmx5aW5nSHR0cENsaWVudEFjY2Vzc1Rlc3QuamF2YSBiL2Nvbm5lY3RvcnMvYXBhY2hlLWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2FwYWNoZS9jb25uZWN0b3IvVW5kZXJseWluZ0h0dHBDbGllbnRBY2Nlc3NUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVhMDI5OQotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvYXBhY2hlLWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2FwYWNoZS9jb25uZWN0b3IvVW5kZXJseWluZ0h0dHBDbGllbnRBY2Nlc3NUZXN0LmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5hcGFjaGUuY29ubmVjdG9yOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKKworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5jbGllbnQuSHR0cENsaWVudDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7CisKKy8qKgorICogVGVzdCBvZiBhY2Nlc3MgdG8gdGhlIHVuZGVybHlpbmcgSFRUUCBjbGllbnQgaW5zdGFuY2UgdXNlZCBieSB0aGUgY29ubmVjdG9yLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBVbmRlcmx5aW5nSHR0cENsaWVudEFjY2Vzc1Rlc3QgeworCisgICAgLyoqCisgICAgICogVmVyaWZpZXIgb2YgSkVSU0VZLTI0MjQgZml4LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEh0dHBDbGllbnRJbnN0YW5jZUFjY2VzcygpIHsKKyAgICAgICAgZmluYWwgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KG5ldyBDbGllbnRDb25maWcoKS5jb25uZWN0b3JQcm92aWRlcihuZXcgQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXIoKSkpOworICAgICAgICBmaW5hbCBIdHRwQ2xpZW50IGhjT25DbGllbnQgPSBBcGFjaGVDb25uZWN0b3JQcm92aWRlci5nZXRIdHRwQ2xpZW50KGNsaWVudCk7CisgICAgICAgIC8vIGltcG9ydGFudDogdGhlIHdlYiB0YXJnZXQgaW5zdGFuY2UgaW4gdGhpcyB0ZXN0IG11c3QgYmUgb25seSBjcmVhdGVkIEFGVEVSIHRoZSBjbGllbnQgaGFzIGJlZW4gcHJlLWluaXRpYWxpemVkCisgICAgICAgIC8vIChzZWUgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkluaXRpYWxpemFibGUucHJlSW5pdGlhbGl6ZSBtZXRob2QpLiBUaGlzIGlzIGhlcmUgYWNoaWV2ZWQgYnkgY2FsbGluZyB0aGUKKyAgICAgICAgLy8gY29ubmVjdG9yIHByb3ZpZGVyJ3Mgc3RhdGljIGdldEh0dHBDbGllbnQgbWV0aG9kIGFib3ZlLgorICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gY2xpZW50LnRhcmdldCgiaHR0cDovL2xvY2FsaG9zdC8iKTsKKyAgICAgICAgZmluYWwgSHR0cENsaWVudCBoY09uVGFyZ2V0ID0gQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXIuZ2V0SHR0cENsaWVudCh0YXJnZXQpOworCisgICAgICAgIGFzc2VydE5vdE51bGwoIkhUVFAgY2xpZW50IGluc3RhbmNlIHNldCBvbiBKZXJzZXlDbGllbnQgc2hvdWxkIG5vdCBiZSBudWxsLiIsIGhjT25DbGllbnQpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJIVFRQIGNsaWVudCBpbnN0YW5jZSBzZXQgb24gSmVyc2V5V2ViVGFyZ2V0IHNob3VsZCBub3QgYmUgbnVsbC4iLCBoY09uVGFyZ2V0KTsKKyAgICAgICAgYXNzZXJ0U2FtZSgiSFRUUCBjbGllbnQgaW5zdGFuY2Ugc2V0IG9uIEplcnNleUNsaWVudCBzaG91bGQgYmUgdGhlIHNhbWUgaW5zdGFuY2UgYXMgdGhlIG9uZSBzZXQgb24gSmVyc2V5V2ViVGFyZ2V0IgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiKHByb3ZpZGVkIHRoZSB0YXJnZXQgaW5zdGFuY2UgaGFzIG5vdCBiZWVuIGZ1cnRoZXIgY29uZmlndXJlZCkuIiwKKyAgICAgICAgICAgICAgICBoY09uQ2xpZW50LCBoY09uVGFyZ2V0CisgICAgICAgICk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9ncml6emx5LWNvbm5lY3Rvci9wb20ueG1sIGIvY29ubmVjdG9ycy9ncml6emx5LWNvbm5lY3Rvci9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNGRlYTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL2dyaXp6bHktY29ubmVjdG9yL3BvbS54bWwKQEAgLTAsMCArMSw4MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29ubmVjdG9yczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmplcnNleS1ncml6emx5LWNvbm5lY3RvcjwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS1jb25uZWN0b3JzLWdyaXp6bHk8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+SmVyc2V5IENsaWVudCBUcmFuc3BvcnQgdmlhIEdyaXp6bHk8L2Rlc2NyaXB0aW9uPgorCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxwcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPlVURi04PC9wcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPgorICAgIDwvcHJvcGVydGllcz4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5ncml6emx5PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z3JpenpseS1odHRwLWNsaWVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guZ3JpenpseTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmdyaXp6bHktd2Vic29ja2V0czwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guZ3JpenpseTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbm5lY3Rpb24tcG9vbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi5pc3RhY2s8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4taXN0YWNrLWNvbW1vbnMtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJ1aWxkLWhlbHBlci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9ncml6emx5LWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2dyaXp6bHkvY29ubmVjdG9yL0dyaXp6bHlDb25uZWN0b3IuamF2YSBiL2Nvbm5lY3RvcnMvZ3JpenpseS1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9ncml6emx5L2Nvbm5lY3Rvci9Hcml6emx5Q29ubmVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIzYTNiYwotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvZ3JpenpseS1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9ncml6emx5L2Nvbm5lY3Rvci9Hcml6emx5Q29ubmVjdG9yLmphdmEKQEAgLTAsMCArMSw0NzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseS5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbXBsZXRhYmxlRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKKworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5SZXF1ZXN0RW50aXR5UHJvY2Vzc2luZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuc3BpLkFzeW5jQ29ubmVjdG9yQ2FsbGJhY2s7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnNwaS5Db25uZWN0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuVmVyc2lvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uQnl0ZUJ1ZmZlcklucHV0U3RyZWFtOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5Ob25CbG9ja2luZ0lucHV0U3RyZWFtOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuSGVhZGVyVXRpbHM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5PdXRib3VuZE1lc3NhZ2VDb250ZXh0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5ncml6emx5Lm1lbW9yeS5CdWZmZXJzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guZ3JpenpseS5tZW1vcnkuTWVtb3J5TWFuYWdlcjsKKworaW1wb3J0IGNvbS5uaW5nLmh0dHAuY2xpZW50LkFzeW5jSGFuZGxlcjsKK2ltcG9ydCBjb20ubmluZy5odHRwLmNsaWVudC5Bc3luY0h0dHBDbGllbnQ7CitpbXBvcnQgY29tLm5pbmcuaHR0cC5jbGllbnQuQXN5bmNIdHRwQ2xpZW50Q29uZmlnOworaW1wb3J0IGNvbS5uaW5nLmh0dHAuY2xpZW50Lkh0dHBSZXNwb25zZUJvZHlQYXJ0OworaW1wb3J0IGNvbS5uaW5nLmh0dHAuY2xpZW50Lkh0dHBSZXNwb25zZUhlYWRlcnM7CitpbXBvcnQgY29tLm5pbmcuaHR0cC5jbGllbnQuSHR0cFJlc3BvbnNlU3RhdHVzOworaW1wb3J0IGNvbS5uaW5nLmh0dHAuY2xpZW50LlByb3h5U2VydmVyU2VsZWN0b3I7CitpbXBvcnQgY29tLm5pbmcuaHR0cC5jbGllbnQuUmVxdWVzdDsKK2ltcG9ydCBjb20ubmluZy5odHRwLmNsaWVudC5SZXF1ZXN0QnVpbGRlcjsKK2ltcG9ydCBjb20ubmluZy5odHRwLmNsaWVudC5wcm92aWRlcnMuZ3JpenpseS5GZWVkYWJsZUJvZHlHZW5lcmF0b3I7CitpbXBvcnQgY29tLm5pbmcuaHR0cC5jbGllbnQucHJvdmlkZXJzLmdyaXp6bHkuR3JpenpseUFzeW5jSHR0cFByb3ZpZGVyOworaW1wb3J0IGNvbS5uaW5nLmh0dHAudXRpbC5Qcm94eVV0aWxzOworCisvKioKKyAqIFRoZSB0cmFuc3BvcnQgdXNpbmcgdGhlIEFzeW5jSHR0cENsaWVudC4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBLb3ByaXZhCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitjbGFzcyBHcml6emx5Q29ubmVjdG9yIGltcGxlbWVudHMgQ29ubmVjdG9yIHsKKworICAgIHByaXZhdGUgZmluYWwgQXN5bmNIdHRwQ2xpZW50IGdyaXp6bHlDbGllbnQ7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IGNvbm5lY3RvciBiYXNlZCBvbiBHcml6emx5IGFzeW5jaHJvbm91cyBjbGllbnQgbGlicmFyeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGllbnQgICAgICAgICAgICAgICAgSmVyc2V5IGNsaWVudCBpbnN0YW5jZSB0byBjcmVhdGUgdGhlIGNvbm5lY3RvciBmb3IuCisgICAgICogQHBhcmFtIGNvbmZpZyAgICAgICAgICAgICAgICBKZXJzZXkgY2xpZW50IHJ1bnRpbWUgY29uZmlndXJhdGlvbiB0byBiZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgY29ubmVjdG9yIHBhcmFtZXRlcnMuCisgICAgICogQHBhcmFtIGFzeW5jQ2xpZW50Q3VzdG9taXplciBBc3luYyBIVFRQIENsaWVudCBjb25maWd1cmF0aW9uIGJ1aWxkZXIgY3VzdG9taXplci4KKyAgICAgKi8KKyAgICBHcml6emx5Q29ubmVjdG9yKGZpbmFsIENsaWVudCBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb25maWd1cmF0aW9uIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEdyaXp6bHlDb25uZWN0b3JQcm92aWRlci5Bc3luY0NsaWVudEN1c3RvbWl6ZXIgYXN5bmNDbGllbnRDdXN0b21pemVyKSB7CisgICAgICAgIEFzeW5jSHR0cENsaWVudENvbmZpZy5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgQXN5bmNIdHRwQ2xpZW50Q29uZmlnLkJ1aWxkZXIoKTsKKworICAgICAgICBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlOworICAgICAgICBpZiAoY29uZmlnICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIE9iamVjdCB0aHJlYWRQb29sU2l6ZSA9IGNvbmZpZy5nZXRQcm9wZXJ0aWVzKCkuZ2V0KENsaWVudFByb3BlcnRpZXMuQVNZTkNfVEhSRUFEUE9PTF9TSVpFKTsKKworICAgICAgICAgICAgaWYgKHRocmVhZFBvb2xTaXplICE9IG51bGwgJiYgdGhyZWFkUG9vbFNpemUgaW5zdGFuY2VvZiBJbnRlZ2VyICYmIChJbnRlZ2VyKSB0aHJlYWRQb29sU2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBleGVjdXRvclNlcnZpY2UgPSBFeGVjdXRvcnMubmV3Rml4ZWRUaHJlYWRQb29sKChJbnRlZ2VyKSB0aHJlYWRQb29sU2l6ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGV4ZWN1dG9yU2VydmljZSA9IEV4ZWN1dG9ycy5uZXdDYWNoZWRUaHJlYWRQb29sKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJ1aWxkZXIgPSBidWlsZGVyLnNldEV4ZWN1dG9yU2VydmljZShleGVjdXRvclNlcnZpY2UpOworCisgICAgICAgICAgICBidWlsZGVyLnNldENvbm5lY3RUaW1lb3V0KENsaWVudFByb3BlcnRpZXMuZ2V0VmFsdWUoY29uZmlnLmdldFByb3BlcnRpZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRQcm9wZXJ0aWVzLkNPTk5FQ1RfVElNRU9VVCwgMTAwMDApKTsKKworICAgICAgICAgICAgYnVpbGRlci5zZXRSZXF1ZXN0VGltZW91dChDbGllbnRQcm9wZXJ0aWVzLmdldFZhbHVlKGNvbmZpZy5nZXRQcm9wZXJ0aWVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50UHJvcGVydGllcy5SRUFEX1RJTUVPVVQsIDEwMDAwKSk7CisKKyAgICAgICAgICAgIE9iamVjdCBwcm94eVVyaTsKKyAgICAgICAgICAgIHByb3h5VXJpID0gY29uZmlnLmdldFByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuUFJPWFlfVVJJKTsKKyAgICAgICAgICAgIGlmIChwcm94eVVyaSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgVVJJIHUgPSBnZXRQcm94eVVyaShwcm94eVVyaSk7CisgICAgICAgICAgICAgICAgZmluYWwgUHJvcGVydGllcyBwcm94eVByb3BlcnRpZXMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICAgICAgICAgIHByb3h5UHJvcGVydGllcy5zZXRQcm9wZXJ0eShQcm94eVV0aWxzLlBST1hZX1BST1RPQ09MLCB1LmdldFNjaGVtZSgpKTsKKyAgICAgICAgICAgICAgICBwcm94eVByb3BlcnRpZXMuc2V0UHJvcGVydHkoUHJveHlVdGlscy5QUk9YWV9IT1NULCB1LmdldEhvc3QoKSk7CisgICAgICAgICAgICAgICAgcHJveHlQcm9wZXJ0aWVzLnNldFByb3BlcnR5KFByb3h5VXRpbHMuUFJPWFlfUE9SVCwgU3RyaW5nLnZhbHVlT2YodS5nZXRQb3J0KCkpKTsKKworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB1c2VyTmFtZSA9IENsaWVudFByb3BlcnRpZXMuZ2V0VmFsdWUoCisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuZ2V0UHJvcGVydGllcygpLCBDbGllbnRQcm9wZXJ0aWVzLlBST1hZX1VTRVJOQU1FLCBTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgICAgIGlmICh1c2VyTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHByb3h5UHJvcGVydGllcy5zZXRQcm9wZXJ0eShQcm94eVV0aWxzLlBST1hZX1VTRVIsIHVzZXJOYW1lKTsKKworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGFzc3dvcmQgPSBDbGllbnRQcm9wZXJ0aWVzLmdldFZhbHVlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5nZXRQcm9wZXJ0aWVzKCksIENsaWVudFByb3BlcnRpZXMuUFJPWFlfUEFTU1dPUkQsIFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXNzd29yZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm94eVByb3BlcnRpZXMuc2V0UHJvcGVydHkoUHJveHlVdGlscy5QUk9YWV9QQVNTV09SRCwgcGFzc3dvcmQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFByb3h5U2VydmVyU2VsZWN0b3IgcHJveHlTZXJ2ZXJTZWxlY3RvciA9IFByb3h5VXRpbHMuY3JlYXRlUHJveHlTZXJ2ZXJTZWxlY3Rvcihwcm94eVByb3BlcnRpZXMpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0UHJveHlTZXJ2ZXJTZWxlY3Rvcihwcm94eVNlcnZlclNlbGVjdG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGV4ZWN1dG9yU2VydmljZSA9IEV4ZWN1dG9ycy5uZXdDYWNoZWRUaHJlYWRQb29sKCk7CisgICAgICAgICAgICBidWlsZGVyLnNldEV4ZWN1dG9yU2VydmljZShleGVjdXRvclNlcnZpY2UpOworICAgICAgICB9CisKKyAgICAgICAgYnVpbGRlci5zZXRBbGxvd1Bvb2xpbmdDb25uZWN0aW9ucyh0cnVlKTsKKyAgICAgICAgaWYgKGNsaWVudC5nZXRTc2xDb250ZXh0KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgYnVpbGRlci5zZXRTU0xDb250ZXh0KGNsaWVudC5nZXRTc2xDb250ZXh0KCkpOworICAgICAgICB9CisgICAgICAgIGlmIChjbGllbnQuZ2V0SG9zdG5hbWVWZXJpZmllcigpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuc2V0SG9zdG5hbWVWZXJpZmllcihjbGllbnQuZ2V0SG9zdG5hbWVWZXJpZmllcigpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhc3luY0NsaWVudEN1c3RvbWl6ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgYnVpbGRlciA9IGFzeW5jQ2xpZW50Q3VzdG9taXplci5jdXN0b21pemUoY2xpZW50LCBjb25maWcsIGJ1aWxkZXIpOworICAgICAgICB9CisKKyAgICAgICAgQXN5bmNIdHRwQ2xpZW50Q29uZmlnIGFzeW5jQ2xpZW50Q29uZmlnID0gYnVpbGRlci5idWlsZCgpOworCisgICAgICAgIHRoaXMuZ3JpenpseUNsaWVudCA9IG5ldyBBc3luY0h0dHBDbGllbnQobmV3IEdyaXp6bHlBc3luY0h0dHBQcm92aWRlcihhc3luY0NsaWVudENvbmZpZyksIGFzeW5jQ2xpZW50Q29uZmlnKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiQ2hhaW5PZkluc3RhbmNlb2ZDaGVja3MiKQorICAgIHByaXZhdGUgc3RhdGljIFVSSSBnZXRQcm94eVVyaShmaW5hbCBPYmplY3QgcHJveHkpIHsKKyAgICAgICAgaWYgKHByb3h5IGluc3RhbmNlb2YgVVJJKSB7CisgICAgICAgICAgICByZXR1cm4gKFVSSSkgcHJveHk7CisgICAgICAgIH0gZWxzZSBpZiAocHJveHkgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgICAgICAgIHJldHVybiBVUkkuY3JlYXRlKChTdHJpbmcpIHByb3h5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLldST05HX1BST1hZX1VSSV9UWVBFKENsaWVudFByb3BlcnRpZXMuUFJPWFlfVVJJKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHVuZGVybHlpbmcgR3JpenpseSB7QGxpbmsgY29tLm5pbmcuaHR0cC5jbGllbnQuQXN5bmNIdHRwQ2xpZW50fSBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdW5kZXJseWluZyBHcml6emx5IHtAbGluayBjb20ubmluZy5odHRwLmNsaWVudC5Bc3luY0h0dHBDbGllbnR9IGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBBc3luY0h0dHBDbGllbnQgZ2V0R3JpenpseUNsaWVudCgpIHsKKyAgICAgICAgcmV0dXJuIGdyaXp6bHlDbGllbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VuZHMgdGhlIHtAbGluayBqYXZheC53cy5ycy5jb3JlLlJlcXVlc3R9IHZpYSBHcml6emx5IHRyYW5zcG9ydCBhbmQgcmV0dXJucyB0aGUge0BsaW5rIGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2V9LgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgSmVyc2V5IGNsaWVudCByZXF1ZXN0IHRvIGJlIHNlbnQuCisgICAgICogQHJldHVybiByZWNlaXZlZCByZXNwb25zZS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2xpZW50UmVzcG9uc2UgYXBwbHkoZmluYWwgQ2xpZW50UmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIGZpbmFsIFJlcXVlc3QgY29ubmVjdG9yUmVxdWVzdCA9IHRyYW5zbGF0ZShyZXF1ZXN0KTsKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBjbGllbnRIZWFkZXJzU25hcHNob3QgPSB3cml0ZU91dEJvdW5kSGVhZGVycyhyZXF1ZXN0LmdldEhlYWRlcnMoKSwgY29ubmVjdG9yUmVxdWVzdCk7CisKKyAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8Q2xpZW50UmVzcG9uc2U+IHJlc3BvbnNlRnV0dXJlID0gbmV3IENvbXBsZXRhYmxlRnV0dXJlPD4oKTsKKyAgICAgICAgZmluYWwgQnl0ZUJ1ZmZlcklucHV0U3RyZWFtIGVudGl0eVN0cmVhbSA9IG5ldyBCeXRlQnVmZmVySW5wdXRTdHJlYW0oKTsKKyAgICAgICAgZmluYWwgQXRvbWljQm9vbGVhbiBmdXR1cmVTZXQgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGdyaXp6bHlDbGllbnQuZXhlY3V0ZVJlcXVlc3QoY29ubmVjdG9yUmVxdWVzdCwgbmV3IEFzeW5jSGFuZGxlcjxWb2lkPigpIHsKKyAgICAgICAgICAgICAgICBwcml2YXRlIHZvbGF0aWxlIEh0dHBSZXNwb25zZVN0YXR1cyBzdGF0dXMgPSBudWxsOworCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIFNUQVRFIG9uU3RhdHVzUmVjZWl2ZWQoZmluYWwgSHR0cFJlc3BvbnNlU3RhdHVzIHJlc3BvbnNlU3RhdHVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gcmVzcG9uc2VTdGF0dXM7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBTVEFURS5DT05USU5VRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgU1RBVEUgb25IZWFkZXJzUmVjZWl2ZWQoSHR0cFJlc3BvbnNlSGVhZGVycyBoZWFkZXJzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmdXR1cmVTZXQuY29tcGFyZUFuZFNldChmYWxzZSwgdHJ1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTVEFURS5BQk9SVDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEhlYWRlclV0aWxzLmNoZWNrSGVhZGVyQ2hhbmdlcyhjbGllbnRIZWFkZXJzU25hcHNob3QsIHJlcXVlc3QuZ2V0SGVhZGVycygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JpenpseUNvbm5lY3Rvci50aGlzLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKworICAgICAgICAgICAgICAgICAgICByZXNwb25zZUZ1dHVyZS5jb21wbGV0ZSh0cmFuc2xhdGUocmVxdWVzdCwgdGhpcy5zdGF0dXMsIGhlYWRlcnMsIGVudGl0eVN0cmVhbSkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1RBVEUuQ09OVElOVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIFNUQVRFIG9uQm9keVBhcnRSZWNlaXZlZChIdHRwUmVzcG9uc2VCb2R5UGFydCBib2R5UGFydCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIGVudGl0eVN0cmVhbS5wdXQoYm9keVBhcnQuZ2V0Qm9keUJ5dGVCdWZmZXIoKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBTVEFURS5DT05USU5VRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgVm9pZCBvbkNvbXBsZXRlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICBlbnRpdHlTdHJlYW0uY2xvc2VRdWV1ZSgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblRocm93YWJsZShUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICBlbnRpdHlTdHJlYW0uY2xvc2VRdWV1ZSh0KTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoZnV0dXJlU2V0LmNvbXBhcmVBbmRTZXQoZmFsc2UsIHRydWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0ID0gdCBpbnN0YW5jZW9mIElPRXhjZXB0aW9uID8gbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24odC5nZXRNZXNzYWdlKCksIHQpIDogdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlRnV0dXJlLmNvbXBsZXRlRXhjZXB0aW9uYWxseSh0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VGdXR1cmUuZ2V0KCk7CisgICAgICAgIH0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgVGhyb3dhYmxlIGUgPSBleC5nZXRDYXVzZSgpID09IG51bGwgPyBleCA6IGV4LmdldENhdXNlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbihleC5nZXRNZXNzYWdlKCksIGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBGdXR1cmU8Pz4gYXBwbHkoZmluYWwgQ2xpZW50UmVxdWVzdCByZXF1ZXN0LCBmaW5hbCBBc3luY0Nvbm5lY3RvckNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIGZpbmFsIFJlcXVlc3QgY29ubmVjdG9yUmVxdWVzdCA9IHRyYW5zbGF0ZShyZXF1ZXN0KTsKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBjbGllbnRIZWFkZXJzU25hcHNob3QgPSB3cml0ZU91dEJvdW5kSGVhZGVycyhyZXF1ZXN0LmdldEhlYWRlcnMoKSwgY29ubmVjdG9yUmVxdWVzdCk7CisgICAgICAgIGZpbmFsIEJ5dGVCdWZmZXJJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0gPSBuZXcgQnl0ZUJ1ZmZlcklucHV0U3RyZWFtKCk7CisgICAgICAgIGZpbmFsIEF0b21pY0Jvb2xlYW4gY2FsbGJhY2tJbnZva2VkID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOworCisgICAgICAgIFRocm93YWJsZSBmYWlsdXJlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGdyaXp6bHlDbGllbnQuZXhlY3V0ZVJlcXVlc3QoY29ubmVjdG9yUmVxdWVzdCwgbmV3IEFzeW5jSGFuZGxlcjxWb2lkPigpIHsKKyAgICAgICAgICAgICAgICBwcml2YXRlIHZvbGF0aWxlIEh0dHBSZXNwb25zZVN0YXR1cyBzdGF0dXMgPSBudWxsOworCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIFNUQVRFIG9uU3RhdHVzUmVjZWl2ZWQoZmluYWwgSHR0cFJlc3BvbnNlU3RhdHVzIHJlc3BvbnNlU3RhdHVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gcmVzcG9uc2VTdGF0dXM7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBTVEFURS5DT05USU5VRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgU1RBVEUgb25IZWFkZXJzUmVjZWl2ZWQoSHR0cFJlc3BvbnNlSGVhZGVycyBoZWFkZXJzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFjYWxsYmFja0ludm9rZWQuY29tcGFyZUFuZFNldChmYWxzZSwgdHJ1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTVEFURS5BQk9SVDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEhlYWRlclV0aWxzLmNoZWNrSGVhZGVyQ2hhbmdlcyhjbGllbnRIZWFkZXJzU25hcHNob3QsIHJlcXVlc3QuZ2V0SGVhZGVycygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyaXp6bHlDb25uZWN0b3IudGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIC8vIGhhbmQtb2ZmIHRvIGdyaXp6bHkncyBhcHBsaWNhdGlvbiB0aHJlYWQgcG9vbCBmb3IgcmVzcG9uc2UgcHJvY2Vzc2luZworICAgICAgICAgICAgICAgICAgICBwcm9jZXNzUmVzcG9uc2UobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sucmVzcG9uc2UodHJhbnNsYXRlKHJlcXVlc3QsIHN0YXR1cywgaGVhZGVycywgZW50aXR5U3RyZWFtKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1RBVEUuQ09OVElOVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIFNUQVRFIG9uQm9keVBhcnRSZWNlaXZlZChIdHRwUmVzcG9uc2VCb2R5UGFydCBib2R5UGFydCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIGVudGl0eVN0cmVhbS5wdXQoYm9keVBhcnQuZ2V0Qm9keUJ5dGVCdWZmZXIoKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBTVEFURS5DT05USU5VRTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgVm9pZCBvbkNvbXBsZXRlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICBlbnRpdHlTdHJlYW0uY2xvc2VRdWV1ZSgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblRocm93YWJsZShUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICBlbnRpdHlTdHJlYW0uY2xvc2VRdWV1ZSh0KTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tJbnZva2VkLmNvbXBhcmVBbmRTZXQoZmFsc2UsIHRydWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0ID0gdCBpbnN0YW5jZW9mIElPRXhjZXB0aW9uID8gbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24odC5nZXRNZXNzYWdlKCksIHQpIDogdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmZhaWx1cmUodCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGZhaWx1cmUgPSB0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNhbGxiYWNrSW52b2tlZC5jb21wYXJlQW5kU2V0KGZhbHNlLCB0cnVlKSkgeworICAgICAgICAgICAgY2FsbGJhY2suZmFpbHVyZShmYWlsdXJlKTsKKyAgICAgICAgfQorICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxPYmplY3Q+IGZ1dHVyZSA9IG5ldyBDb21wbGV0YWJsZUZ1dHVyZTw+KCk7CisgICAgICAgIGZ1dHVyZS5jb21wbGV0ZUV4Y2VwdGlvbmFsbHkoZmFpbHVyZSk7CisgICAgICAgIHJldHVybiBmdXR1cmU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIGdyaXp6bHlDbGllbnQuY2xvc2UoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIENsaWVudFJlc3BvbnNlIHRyYW5zbGF0ZShmaW5hbCBDbGllbnRSZXF1ZXN0IHJlcXVlc3RDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEh0dHBSZXNwb25zZVN0YXR1cyBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSHR0cFJlc3BvbnNlSGVhZGVycyBoZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE5vbkJsb2NraW5nSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB7CisKKyAgICAgICAgZmluYWwgQ2xpZW50UmVzcG9uc2UgcmVzcG9uc2VDb250ZXh0ID0gbmV3IENsaWVudFJlc3BvbnNlKG5ldyBSZXNwb25zZS5TdGF0dXNUeXBlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgaW50IGdldFN0YXR1c0NvZGUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1cy5nZXRTdGF0dXNDb2RlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFJlc3BvbnNlLlN0YXR1cy5GYW1pbHkgZ2V0RmFtaWx5KCkgeworICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5TdGF0dXMuRmFtaWx5LmZhbWlseU9mKHN0YXR1cy5nZXRTdGF0dXNDb2RlKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVhc29uUGhyYXNlKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXMuZ2V0U3RhdHVzVGV4dCgpOworICAgICAgICAgICAgfQorICAgICAgICB9LCByZXF1ZXN0Q29udGV4dCk7CisKKyAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGVudHJ5IDogaGVhZGVycy5nZXRIZWFkZXJzKCkuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgZm9yIChTdHJpbmcgdmFsdWUgOiBlbnRyeS5nZXRWYWx1ZSgpKSB7CisgICAgICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LmdldEhlYWRlcnMoKS5hZGQoZW50cnkuZ2V0S2V5KCksIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJlc3BvbnNlQ29udGV4dC5zZXRFbnRpdHlTdHJlYW0oZW50aXR5U3RyZWFtKTsKKworICAgICAgICByZXR1cm4gcmVzcG9uc2VDb250ZXh0OworICAgIH0KKworICAgIHByaXZhdGUgY29tLm5pbmcuaHR0cC5jbGllbnQuUmVxdWVzdCB0cmFuc2xhdGUoZmluYWwgQ2xpZW50UmVxdWVzdCByZXF1ZXN0Q29udGV4dCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgc3RyTWV0aG9kID0gcmVxdWVzdENvbnRleHQuZ2V0TWV0aG9kKCk7CisgICAgICAgIGZpbmFsIFVSSSB1cmkgPSByZXF1ZXN0Q29udGV4dC5nZXRVcmkoKTsKKworICAgICAgICBSZXF1ZXN0QnVpbGRlciBidWlsZGVyID0gbmV3IFJlcXVlc3RCdWlsZGVyKHN0ck1ldGhvZCkuc2V0VXJsKHVyaS50b1N0cmluZygpKTsKKworICAgICAgICBidWlsZGVyLnNldEZvbGxvd1JlZGlyZWN0cyhyZXF1ZXN0Q29udGV4dC5yZXNvbHZlUHJvcGVydHkoQ2xpZW50UHJvcGVydGllcy5GT0xMT1dfUkVESVJFQ1RTLCB0cnVlKSk7CisKKyAgICAgICAgaWYgKHJlcXVlc3RDb250ZXh0Lmhhc0VudGl0eSgpKSB7CisKKyAgICAgICAgICAgIGZpbmFsIFJlcXVlc3RFbnRpdHlQcm9jZXNzaW5nIGVudGl0eVByb2Nlc3NpbmcgPQorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5yZXNvbHZlUHJvcGVydHkoQ2xpZW50UHJvcGVydGllcy5SRVFVRVNUX0VOVElUWV9QUk9DRVNTSU5HLCBSZXF1ZXN0RW50aXR5UHJvY2Vzc2luZy5jbGFzcyk7CisKKyAgICAgICAgICAgIGlmIChlbnRpdHlQcm9jZXNzaW5nID09IFJlcXVlc3RFbnRpdHlQcm9jZXNzaW5nLkJVRkZFUkVEKSB7CisgICAgICAgICAgICAgICAgYnl0ZVtdIGVudGl0eUJ5dGVzID0gYnVmZmVyRW50aXR5KHJlcXVlc3RDb250ZXh0KTsKKyAgICAgICAgICAgICAgICBidWlsZGVyID0gYnVpbGRlci5zZXRCb2R5KGVudGl0eUJ5dGVzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZmluYWwgRmVlZGFibGVCb2R5R2VuZXJhdG9yIGJvZHlHZW5lcmF0b3IgPSBuZXcgRmVlZGFibGVCb2R5R2VuZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgZmluYWwgSW50ZWdlciBjaHVua1NpemUgPSByZXF1ZXN0Q29udGV4dC5yZXNvbHZlUHJvcGVydHkoCisgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRQcm9wZXJ0aWVzLkNIVU5LRURfRU5DT0RJTkdfU0laRSwgQ2xpZW50UHJvcGVydGllcy5ERUZBVUxUX0NIVU5LX1NJWkUpOworICAgICAgICAgICAgICAgIGJvZHlHZW5lcmF0b3Iuc2V0TWF4UGVuZGluZ0J5dGVzKGNodW5rU2l6ZSk7CisgICAgICAgICAgICAgICAgZmluYWwgRmVlZGFibGVCb2R5R2VuZXJhdG9yLkZlZWRlciBmZWVkZXIgPSBuZXcgRmVlZGFibGVCb2R5R2VuZXJhdG9yLlNpbXBsZUZlZWRlcihib2R5R2VuZXJhdG9yKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC53cml0ZUVudGl0eSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5zZXRTdHJlYW1Qcm92aWRlcihuZXcgT3V0Ym91bmRNZXNzYWdlQ29udGV4dC5TdHJlYW1Qcm92aWRlcigpIHsKKworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oaW50IGNvbnRlbnRMZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZlZWRlckFkYXB0ZXIoZmVlZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIGJvZHlHZW5lcmF0b3Iuc2V0RmVlZGVyKGZlZWRlcik7CisgICAgICAgICAgICAgICAgYnVpbGRlci5zZXRCb2R5KGJvZHlHZW5lcmF0b3IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZmluYWwgR3JpenpseUNvbm5lY3RvclByb3ZpZGVyLlJlcXVlc3RDdXN0b21pemVyIHJlcXVlc3RDdXN0b21pemVyID0gcmVxdWVzdENvbnRleHQucmVzb2x2ZVByb3BlcnR5KAorICAgICAgICAgICAgICAgIEdyaXp6bHlDb25uZWN0b3JQcm92aWRlci5SRVFVRVNUX0NVU1RPTUlaRVIsCisgICAgICAgICAgICAgICAgR3JpenpseUNvbm5lY3RvclByb3ZpZGVyLlJlcXVlc3RDdXN0b21pemVyLmNsYXNzKTsKKyAgICAgICAgaWYgKHJlcXVlc3RDdXN0b21pemVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJ1aWxkZXIgPSByZXF1ZXN0Q3VzdG9taXplci5jdXN0b21pemUocmVxdWVzdENvbnRleHQsIGJ1aWxkZXIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdWJtaXRzIHRoZSByZXNwb25zZSBwcm9jZXNzaW5nIG9uIEdyaXp6bHkgY2xpZW50J3MgYXBwbGljYXRpb24gdGhyZWFkIHBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2VUYXNrIHRhc2sgdG8gYmUgcHJvY2Vzc2VkIG9uIGFwcGxpY2F0aW9uIHRocmVhZCBwb29sLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzUmVzcG9uc2UoUnVubmFibGUgcmVzcG9uc2VUYXNrKSB7CisgICAgICAgIHRoaXMuZ3JpenpseUNsaWVudC5nZXRDb25maWcoKS5leGVjdXRvclNlcnZpY2UoKS5zdWJtaXQocmVzcG9uc2VUYXNrKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IE91dHB1dFN0cmVhbSBpbXBsZW1lbnRhdGlvbiB0aGF0IGNhbiBmZWVkIEdyaXp6bHkgY2h1bmstZW5jb2RlZCBib2R5IGdlbmVyYXRvci4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIEZlZWRlckFkYXB0ZXIgZXh0ZW5kcyBPdXRwdXRTdHJlYW0geworCisgICAgICAgIGZpbmFsIEZlZWRhYmxlQm9keUdlbmVyYXRvci5GZWVkZXIgZGVsZWdhdGU7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBtZSBhIG5ldyBhZGFwdGVyIGZvciBnaXZlbiBmZWVkZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBib2R5RmVlZGVyIGFkYXB0ZWUgdG8gZ2V0IGZlZCBhcyBhbiBvdXRwdXQgc3RyZWFtLgorICAgICAgICAgKi8KKyAgICAgICAgRmVlZGVyQWRhcHRlcihGZWVkYWJsZUJvZHlHZW5lcmF0b3IuRmVlZGVyIGJvZHlGZWVkZXIpIHsKKyAgICAgICAgICAgIHRoaXMuZGVsZWdhdGUgPSBib2R5RmVlZGVyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzFdOworICAgICAgICAgICAgYnVmZmVyWzBdID0gKGJ5dGUpIGI7CisgICAgICAgICAgICBkZWxlZ2F0ZS5mZWVkKEJ1ZmZlcnMud3JhcChNZW1vcnlNYW5hZ2VyLkRFRkFVTFRfTUVNT1JZX01BTkFHRVIsIGJ1ZmZlciksIGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGRlbGVnYXRlLmZlZWQoQnVmZmVycy53cmFwKE1lbW9yeU1hbmFnZXIuREVGQVVMVF9NRU1PUllfTUFOQUdFUiwgYiksIGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGRlbGVnYXRlLmZlZWQoQnVmZmVycy53cmFwKE1lbW9yeU1hbmFnZXIuREVGQVVMVF9NRU1PUllfTUFOQUdFUiwgYiwgb2ZmLCBsZW4pLCBmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgZGVsZWdhdGUuZmVlZChCdWZmZXJzLkVNUFRZX0JVRkZFUiwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiTWFnaWNOdW1iZXIiKQorICAgIHByaXZhdGUgYnl0ZVtdIGJ1ZmZlckVudGl0eShDbGllbnRSZXF1ZXN0IHJlcXVlc3RDb250ZXh0KSB7CisgICAgICAgIGZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSg1MTIpOworICAgICAgICByZXF1ZXN0Q29udGV4dC5zZXRTdHJlYW1Qcm92aWRlcihuZXcgT3V0Ym91bmRNZXNzYWdlQ29udGV4dC5TdHJlYW1Qcm92aWRlcigpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbShpbnQgY29udGVudExlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYmFvczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC53cml0ZUVudGl0eSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9CVUZGRVJJTkdfRU5USVRZKCksIGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBiYW9zLnRvQnl0ZUFycmF5KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiB3cml0ZU91dEJvdW5kSGVhZGVycyhmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGNvbS5uaW5nLmh0dHAuY2xpZW50LlJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHN0cmluZ0hlYWRlcnMgPSBIZWFkZXJVdGlscy5hc1N0cmluZ0hlYWRlcnNTaW5nbGVWYWx1ZShoZWFkZXJzKTsKKworICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZSA6IHN0cmluZ0hlYWRlcnMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgcmVxdWVzdC5nZXRIZWFkZXJzKCkuYWRkKGUuZ2V0S2V5KCksIGUuZ2V0VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0cmluZ0hlYWRlcnM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiQXN5bmMgSFRUUCBHcml6emx5IENvbm5lY3RvciAlcyIsIFZlcnNpb24uZ2V0VmVyc2lvbigpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2dyaXp6bHktY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZ3JpenpseS9jb25uZWN0b3IvR3JpenpseUNvbm5lY3RvclByb3ZpZGVyLmphdmEgYi9jb25uZWN0b3JzL2dyaXp6bHktY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZ3JpenpseS9jb25uZWN0b3IvR3JpenpseUNvbm5lY3RvclByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIzOTg1NwotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvZ3JpenpseS1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9ncml6emx5L2Nvbm5lY3Rvci9Hcml6emx5Q29ubmVjdG9yUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDI3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5LmNvbm5lY3RvcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50Lkludm9jYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmFibGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UmVxdWVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuSW5pdGlhbGl6YWJsZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuc3BpLkNvbm5lY3RvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuc3BpLkNvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUHJvcGVydHk7CisKK2ltcG9ydCBjb20ubmluZy5odHRwLmNsaWVudC5Bc3luY0h0dHBDbGllbnQ7CitpbXBvcnQgY29tLm5pbmcuaHR0cC5jbGllbnQuQXN5bmNIdHRwQ2xpZW50Q29uZmlnOworaW1wb3J0IGNvbS5uaW5nLmh0dHAuY2xpZW50LlJlcXVlc3RCdWlsZGVyOworCisvKioKKyAqIENvbm5lY3RvciBwcm92aWRlciBmb3IgSmVyc2V5IHtAbGluayBDb25uZWN0b3IgY29ubmVjdG9yc30gdGhhdCB1dGlsaXplCisgKiBHcml6emx5IEFzeW5jaHJvbm91cyBIVFRQIENsaWVudCB0byBzZW5kIGFuZCByZWNlaXZlIEhUVFAgcmVxdWVzdCBhbmQgcmVzcG9uc2VzLgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGNvbm5lY3RvciBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqIDxsaT57QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXMjQ09OTkVDVF9USU1FT1VUfTwvbGk+CisgKiA8bGk+e0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzI1JFQURfVElNRU9VVH08L2xpPgorICogPGxpPntAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllcyNSRVFVRVNUX0VOVElUWV9QUk9DRVNTSU5HfQorICogLSBkZWZhdWx0IHZhbHVlIGlzIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuUmVxdWVzdEVudGl0eVByb2Nlc3NpbmcjQ0hVTktFRH08L2xpPgorICogPGxpPntAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllcyNQUk9YWV9VUkl9PC9saT4KKyAqIDxsaT57QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXMjUFJPWFlfVVNFUk5BTUV9PC9saT4KKyAqIDxsaT57QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXMjUFJPWFlfUEFTU1dPUkR9PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKiA8cD4KKyAqIENvbm5lY3RvciBpbnN0YW5jZXMgY3JlYXRlZCB2aWEgdGhpcyBjb25uZWN0b3IgcHJvdmlkZXIgdXNlCisgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LlJlcXVlc3RFbnRpdHlQcm9jZXNzaW5nI0NIVU5LRUQgY2h1bmtlZCBlbmNvZGluZ30gYXMgYSBkZWZhdWx0IHNldHRpbmcuCisgKiBUaGlzIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHRoZSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXMjUkVRVUVTVF9FTlRJVFlfUFJPQ0VTU0lOR30uCisgKiA8L3A+CisgKiA8cD4KKyAqIElmIGEge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRSZXNwb25zZX0gaXMgb2J0YWluZWQgYW5kIGFuIGVudGl0eSBpcyBub3QgcmVhZCBmcm9tIHRoZSByZXNwb25zZSB0aGVuCisgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFJlc3BvbnNlI2Nsb3NlKCl9IE1VU1QgYmUgY2FsbGVkIGFmdGVyIHByb2Nlc3NpbmcgdGhlIHJlc3BvbnNlIHRvIHJlbGVhc2UKKyAqIGNvbm5lY3Rpb24tYmFzZWQgcmVzb3VyY2VzLgorICogPC9wPgorICogPHA+CisgKiBJZiBhIHJlc3BvbnNlIGVudGl0eSBpcyBvYnRhaW5lZCB0aGF0IGlzIGFuIGluc3RhbmNlIG9mIHtAbGluayBqYXZhLmlvLkNsb3NlYWJsZX0gIHRoZW4gdGhlIGluc3RhbmNlIE1VU1QKKyAqIGJlIGNsb3NlZCBhZnRlciBwcm9jZXNzaW5nIHRoZSBlbnRpdHkgdG8gcmVsZWFzZSBjb25uZWN0aW9uLWJhc2VkIHJlc291cmNlcy4KKyAqIDxwLz4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSBjdXJyZW50bHkgc3VwcG9ydGVkOiBIRUFELCBHRVQsIFBPU1QsIFBVVCwgREVMRVRFLCBPUFRJT05TLCBQQVRDSCBhbmQgVFJBQ0UuCisgKiA8cC8+CisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqIEBzaW5jZSAyLjUKKyAqLworcHVibGljIGNsYXNzIEdyaXp6bHlDb25uZWN0b3JQcm92aWRlciBpbXBsZW1lbnRzIENvbm5lY3RvclByb3ZpZGVyIHsKKyAgICAvKioKKyAgICAgKiBBIHtAbGluayBHcml6emx5Q29ubmVjdG9yUHJvdmlkZXIuUmVxdWVzdEN1c3RvbWl6ZXIgcmVxdWVzdCBjdXN0b21pemVyfSBpbnN0YW5jZSB0byBiZSB1c2VkIHRvIGN1c3RvbWl6ZSB0aGUKKyAgICAgKiByZXF1ZXN0LgorICAgICAqCisgICAgICogVGhlIHZhbHVlIE1VU1QgYmUgYW4gaW5zdGFuY2UgaW1wbGVtZW50aW5nIHRoZSAge0BsaW5rIEdyaXp6bHlDb25uZWN0b3JQcm92aWRlci5SZXF1ZXN0Q3VzdG9taXplcn0gU1BJLgorICAgICAqIDxwPgorICAgICAqIEEgZGVmYXVsdCB2YWx1ZSBpcyBub3Qgc2V0IChpcyB7QGNvZGUgbnVsbH0pLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAc2VlICNyZWdpc3RlcihJbnZvY2F0aW9uLkJ1aWxkZXIsIEdyaXp6bHlDb25uZWN0b3JQcm92aWRlci5SZXF1ZXN0Q3VzdG9taXplcikKKyAgICAgKiBAc2VlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkuY29ubmVjdG9yLkdyaXp6bHlDb25uZWN0b3JQcm92aWRlci5SZXF1ZXN0Q3VzdG9taXplcgorICAgICAqLworICAgIEBQcm9wZXJ0eQorICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUVTVF9DVVNUT01JWkVSID0gImplcnNleS5jb25maWcuZ3JpenpseS5jbGllbnQucmVxdWVzdC5jdXN0b21pemVyIjsKKworICAgIHByaXZhdGUgZmluYWwgQXN5bmNDbGllbnRDdXN0b21pemVyIGFzeW5jQ2xpZW50Q3VzdG9taXplcjsKKworICAgIC8qKgorICAgICAqIEEgY3VzdG9taXphdGlvbiBTUEkgZm9yIHRoZSBhc3luYyBjbGllbnQgaW5zdGFuY2UgdW5kZXJseWluZyBHcml6emx5IGNvbm5lY3RvcnMuCisgICAgICogPHA+CisgICAgICogQW4gaW1wbGVtZW50YXRpb24gb2YgYXN5bmMgY2xpZW50IGN1c3RvbWl6ZXIgY2FuIGJlCisgICAgICogcmVnaXN0ZXJlZCBpbiBhIHtAY29kZSBHcml6emx5Q29ubmVjdG9yUHJvdmlkZXJ9CisgICAgICoge0BsaW5rIEdyaXp6bHlDb25uZWN0b3JQcm92aWRlciNHcml6emx5Q29ubmVjdG9yUHJvdmlkZXIoR3JpenpseUNvbm5lY3RvclByb3ZpZGVyLkFzeW5jQ2xpZW50Q3VzdG9taXplcikgY29uc3RydWN0b3J9LgorICAgICAqIFdoZW4gYSBjb25uZWN0b3IgaW5zdGFuY2UgaXMgdGhlbiBjcmVhdGVkLCB0aGUgY3VzdG9taXplciBpcyBpbnZva2VkIHRvIHVwZGF0ZSB0aGUKKyAgICAgKiB7QGxpbmsgY29tLm5pbmcuaHR0cC5jbGllbnQuQXN5bmNIdHRwQ2xpZW50Q29uZmlnLkJ1aWxkZXIgdW5kZXJseWluZyBhc3luYyBjbGllbnQgY29uZmlndXJhdGlvbiBidWlsZGVyfSBiZWZvcmUgdGhlIGFjdHVhbAorICAgICAqIGNvbmZpZ3VyYXRpb24gaW5zdGFuY2UgaXMgYnVpbHQgYW5kIHVzZWQgdG8gY3JlYXRlIHRoZSBhc3luYyBjbGllbnQgaW5zdGFuY2UuCisgICAgICogVGhlIGN1c3RvbWl6ZXIgdGh1cyBwcm92aWRlcyBhIHdheSBob3cgdG8gY29uZmlndXJlIHBhcnRzIG9mIHRoZSB1bmRlcmx5aW5nIGFzeW5jIGNsaWVudCBTUEkgdGhhdCBhcmUgbm90IGRpcmVjdGx5CisgICAgICogZXhwb3NlZCBpbiB0aGUge0Bjb2RlIEdyaXp6bHlDb25uZWN0b3JQcm92aWRlcn0gQVBJLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseS5jb25uZWN0b3IuR3JpenpseUNvbm5lY3RvclByb3ZpZGVyLlJlcXVlc3RDdXN0b21pemVyCisgICAgICogQHNpbmNlIDIuMTAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBBc3luY0NsaWVudEN1c3RvbWl6ZXIgeworICAgICAgICAvKioKKyAgICAgICAgICogQ3VzdG9taXplIHRoZSB1bmRlcmx5aW5nIGFzeW5jaHJvbm91cyBjbGllbnQgY29uZmlndXJhdGlvbiBidWlsZGVyLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhlIGNvbmZpZ3VyYXRpb24gYnVpbGRlciBpbnN0YW5jZSBpbnN0YW5jZSByZXR1cm5lZCBmcm9tIHRoZSBtZXRob2Qgd2lsbCBiZSBzdWJzZXF1ZW50bHkgdXNlZCB0byBidWlsZCB0aGUKKyAgICAgICAgICogY29uZmlndXJhdGlvbiBvYmplY3QgdGhhdCBjb25maWd1cmVzIGJvdGggdGhlIHtAbGluayBjb20ubmluZy5odHRwLmNsaWVudC5wcm92aWRlcnMuZ3JpenpseS5Hcml6emx5QXN5bmNIdHRwUHJvdmlkZXJ9CisgICAgICAgICAqIEdyaXp6bHkgYXN5bmMgY2xpZW50IHByb3ZpZGVyfSBhcyB3ZWxsIGFzIHRoZSB1bmRlcmx5aW5nIHtAbGluayBjb20ubmluZy5odHRwLmNsaWVudC5Bc3luY0h0dHBDbGllbnQgYXN5bmMgSFRUUAorICAgICAgICAgKiBjbGllbnR9IGluc3RhbmNlIGl0c2VsZi4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogTm90ZSB0aGF0IGFueSBKQVgtUlMgYW5kIEplcnNleSBzcGVjaWZpYyBjb25maWd1cmF0aW9uIHVwZGF0ZXMgb24gdGhlIGNvbmZpZ3VyYXRpb24gYnVpbGRlciBoYXBwZW4gYmVmb3JlIHRoaXMgbWV0aG9kCisgICAgICAgICAqIGlzIGludm9rZWQuIEFzIHN1Y2gsIGNoYW5nZXMgbWFkZSB0byB0aGUgY29uZmlndXJhdGlvbiBidWlsZGVyIG1heSBvdmVycmlkZSBvciBjYW5jZWwgdGhlIGVmZmVjdCBvZiB0aGUgSkFYLVJTIGFuZAorICAgICAgICAgKiBKZXJzZXkgc3BlY2lmaWMgY29uZmlndXJhdGlvbiBjaGFuZ2VzLiBBcyBzdWNoIGFueSBjb25maWd1cmF0aW9uIGNoYW5nZXMgc2hvdWxkIGJlIG1hZGUgd2l0aCBjYXJlIGFuZCBpbXBsZW1lbnRlcnMKKyAgICAgICAgICogc2hvdWxkIGJlIGF3YXJlIG9mIHBvc3NpYmxlIHNpZGUgZWZmZWN0IG9mIHRoZWlyIGNoYW5nZXMuCisgICAgICAgICAqIDwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNsaWVudCAgICAgICAgSkFYLVJTIGNsaWVudCBmb3Igd2hpY2ggdGhlIGNvbm5lY3RvciBpcyBiZWluZyBjcmVhdGVkLgorICAgICAgICAgKiBAcGFyYW0gY29uZmlnICAgICAgICBKQVgtUlMgY29uZmlndXJhdGlvbiB0aGF0IHdhcyB1c2VkIHRvIGluaXRpYWxpemUgY29ubmVjdG9yJ3MgY29uZmlndXJhdGlvbi4KKyAgICAgICAgICogQHBhcmFtIGNvbmZpZ0J1aWxkZXIgQXN5bmMgSFRUUCBDbGllbnQgY29uZmlndXJhdGlvbiBidWlsZGVyIHRoYXQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYmFzZWQgb24gdGhlIEpBWC1SUworICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLgorICAgICAgICAgKiBAcmV0dXJuIEFzeW5jIEhUVFAgQ2xpZW50IGJ1aWxkZXIgaW5zdGFuY2UgdG8gYmUgdXNlZCB0byBjb25maWd1cmUgdGhlIHVuZGVybHlpbmcgR3JpenpseSBwcm92aWRlciBhbmQgYXN5bmMgSFRUUAorICAgICAgICAgKiBjbGllbnQgaW5zdGFuY2UuIFR5cGljYWxseSwgdGhlIG1ldGhvZCByZXR1cm5zIHRoZSBzYW1lIHtAY29kZSBjb25maWdCdWlsZGVyfSBpbnN0YW5jZSB0aGF0IGhhcyBiZWVuIHBhc3NlZCBpbnRvCisgICAgICAgICAqIHRoZSBtZXRob2QgYXMgYW4gaW5wdXQgcGFyYW1ldGVyLCBidXQgaXQgaXMgbm90IHJlcXVpcmVkIHRvIGRvIHNvLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEFzeW5jSHR0cENsaWVudENvbmZpZy5CdWlsZGVyIGN1c3RvbWl6ZShmaW5hbCBDbGllbnQgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFzeW5jSHR0cENsaWVudENvbmZpZy5CdWlsZGVyIGNvbmZpZ0J1aWxkZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgY3VzdG9taXphdGlvbiBTUEkgZm9yIHRoZSBhc3luYyBjbGllbnQgcmVxdWVzdCBpbnN0YW5jZXMuCisgICAgICoKKyAgICAgKiBBIHJlcXVlc3QgY3VzdG9taXplciBjYW4gYmUgdXNlZCB0byBjb25maWd1cmUgQXN5bmMgSFRUUCBDbGllbnQgc3BlY2lmaWMgZGV0YWlscyBvZiB0aGUgcmVxdWVzdCwgd2hpY2ggYXJlIG5vdCBkaXJlY3RseQorICAgICAqIGV4cG9zZWQgdmlhIHRoZSBKQVgtUlMsIEplcnNleSBvciBHcml6emx5IGNvbm5lY3RvciBwcm92aWRlciBBUEkuCisgICAgICogPHA+CisgICAgICogQmVmb3JlIGEgcmVxdWVzdCBpcyBidWlsdCBhbmQgc2VudCBmb3IgZXhlY3V0aW9uLCBhIHJlZ2lzdGVyZWQgcmVxdWVzdCBjdXN0b21pemVyCisgICAgICogaW1wbGVtZW50YXRpb24gY2FuIHVwZGF0ZSB0aGUgQXN5bmMgSFRUUCBDbGllbnQge0BsaW5rIGNvbS5uaW5nLmh0dHAuY2xpZW50LlJlcXVlc3RCdWlsZGVyIHJlcXVlc3QgYnVpbGRlcn0gdXNlZAorICAgICAqIHRvIGJ1aWxkIHRoZSByZXF1ZXN0IGluc3RhbmNlIHVsdGltYXRlbHkgc2VudCBmb3IgcHJvY2Vzc2luZy4KKyAgICAgKiBBbiBpbnN0YW5jZSBvZiB0aGUgcmVxdWVzdCBjdXN0b21pemVyIGNhbiBiZSBlaXRoZXIge0BsaW5rICNyZWdpc3RlcihDbGllbnRDb25maWcsIFJlcXVlc3RDdXN0b21pemVyKSByZWdpc3RlcmVkIGdsb2JhbGx5fQorICAgICAqIGZvciBhbGwgcmVxdWVzdHMgYnkgcmVnaXN0ZXJpbmcgdGhlIGN1c3RvbWl6ZXIgaW4gdGhlIEplcnNleSBjbGllbnQgY29uZmlndXJhdGlvbiwgb3IgaXQgY2FuIGJlIGluZGl2aWR1YWxseQorICAgICAqIHtAbGluayAjcmVnaXN0ZXIoSW52b2NhdGlvbi5CdWlsZGVyLCBSZXF1ZXN0Q3VzdG9taXplcikgcmVnaXN0ZXJlZCBwZXIgcmVxdWVzdH0sIGJ5IHJlZ2lzdGVyaW5nIGl0IGludG8gYSBzcGVjaWZpYworICAgICAqIGludm9jYXRpb24gYnVpbGRlciBpbnN0YW5jZS4gSW4gY2FzZSBvZiBhIGNvbmZsaWN0IHdoZW4gb25lIGluc3RhbmNlIGlzIHJlZ2lzdGVyZWQgZ2xvYmFsbHkgYW5kIGFub3RoZXIgcGVyIHJlcXVlc3QsIHRoZQorICAgICAqIHBlciByZXF1ZXN0IHJlZ2lzdGVyZWQgY3VzdG9taXplciB0YWtlcyBwcmVjZWRlbmNlIGFuZCB0aGUgZ2xvYmFsIGN1c3RvbWl6ZXIgd2lsbCBiZSBpZ25vcmVkLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseS5jb25uZWN0b3IuR3JpenpseUNvbm5lY3RvclByb3ZpZGVyLkFzeW5jQ2xpZW50Q3VzdG9taXplcgorICAgICAqIEBzZWUgI3JlZ2lzdGVyKG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWcsIEdyaXp6bHlDb25uZWN0b3JQcm92aWRlci5SZXF1ZXN0Q3VzdG9taXplcikKKyAgICAgKiBAc2VlICNyZWdpc3RlcihJbnZvY2F0aW9uLkJ1aWxkZXIsIEdyaXp6bHlDb25uZWN0b3JQcm92aWRlci5SZXF1ZXN0Q3VzdG9taXplcikKKyAgICAgKiBAc2luY2UgMi4xMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFJlcXVlc3RDdXN0b21pemVyIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEN1c3RvbWl6ZSB0aGUgdW5kZXJseWluZyBBc3luYyBIVFRQIENsaWVudCByZXF1ZXN0IGJ1aWxkZXIgYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWMgSmVyc2V5IGNsaWVudCByZXF1ZXN0LgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhlIHJlcXVlc3QgYnVpbGRlciBpbnN0YW5jZSByZXR1cm5lZCBmcm9tIHRoZSBtZXRob2Qgd2lsbCBiZSBzdWJzZXF1ZW50bHkgdXNlZCB0byBidWlsZCB0aGUgYWN0dWFsIEFzeW5jIEhUVFAgQ2xpZW50CisgICAgICAgICAqIHJlcXVlc3QgaW5zdGFuY2Ugc2VudCBmb3IgZXhlY3V0aW9uLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBOb3RlIHRoYXQgYW55IEpBWC1SUyBhbmQgSmVyc2V5IHNwZWNpZmljIHJlcXVlc3QgY29uZmlndXJhdGlvbiB1cGRhdGVzIG9uIHRoZSByZXF1ZXN0IGJ1aWxkZXIgaGFwcGVuIGJlZm9yZSB0aGlzCisgICAgICAgICAqIG1ldGhvZCBpcyBpbnZva2VkLiBBcyBzdWNoLCBjaGFuZ2VzIG1hZGUgdG8gdGhlIHJlcXVlc3QgYnVpbGRlciBtYXkgb3ZlcnJpZGUgb3IgY2FuY2VsIHRoZSBlZmZlY3Qgb2YgdGhlIEpBWC1SUyBhbmQKKyAgICAgICAgICogSmVyc2V5IHNwZWNpZmljIHJlcXVlc3QgY29uZmlndXJhdGlvbiBjaGFuZ2VzLiBBcyBzdWNoIGFueSByZXF1ZXN0IGJ1aWxkZXIgY2hhbmdlcyBzaG91bGQgYmUgbWFkZSB3aXRoIGNhcmUgYW5kCisgICAgICAgICAqIGltcGxlbWVudGVycyBzaG91bGQgYmUgYXdhcmUgb2YgcG9zc2libGUgc2lkZSBlZmZlY3Qgb2YgdGhlaXIgY2hhbmdlcy4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcmVxdWVzdENvbnRleHQgSmVyc2V5IGNsaWVudCByZXF1ZXN0IGluc3RhbmNlIGZvciB3aGljaCB0aGUgQXN5bmMgSFRUUCBDbGllbnQgcmVxdWVzdCBpcyBiZWluZyBidWlsdC4KKyAgICAgICAgICogQHBhcmFtIHJlcXVlc3RCdWlsZGVyIEFzeW5jIEhUVFAgQ2xpZW50IHJlcXVlc3QgYnVpbGRlciBmb3IgdGhlIEplcnNleSByZXF1ZXN0LgorICAgICAgICAgKiBAcmV0dXJuIEFzeW5jIEhUVFAgQ2xpZW50IHJlcXVlc3QgYnVpbGRlciBpbnN0YW5jZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBidWlsZCB0aGUgYWN0dWFsIEFzeW5jIEhUVFAgQ2xpZW50CisgICAgICAgICAqIHJlcXVlc3QgaW5zdGFuY2Ugc2VudCBmb3IgZXhlY3V0aW9uLiBUeXBpY2FsbHksIHRoZSBtZXRob2QgcmV0dXJucyB0aGUgc2FtZSB7QGNvZGUgcmVxdWVzdEJ1aWxkZXJ9IGluc3RhbmNlIHRoYXQKKyAgICAgICAgICogaGFzIGJlZW4gcGFzc2VkIGludG8gdGhlIG1ldGhvZCBhcyBhbiBpbnB1dCBwYXJhbWV0ZXIsIGJ1dCBpdCBpcyBub3QgcmVxdWlyZWQgdG8gZG8gc28uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgUmVxdWVzdEJ1aWxkZXIgY3VzdG9taXplKGZpbmFsIENsaWVudFJlcXVlc3QgcmVxdWVzdENvbnRleHQsIGZpbmFsIFJlcXVlc3RCdWlsZGVyIHJlcXVlc3RCdWlsZGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IEdyaXp6bHkgQXN5bmMgSFRUUCBDbGllbnQgY29ubmVjdG9yIHByb3ZpZGVyLgorICAgICAqLworICAgIHB1YmxpYyBHcml6emx5Q29ubmVjdG9yUHJvdmlkZXIoKSB7CisgICAgICAgIHRoaXMuYXN5bmNDbGllbnRDdXN0b21pemVyID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IEdyaXp6bHkgQXN5bmMgSFRUUCBDbGllbnQgY29ubmVjdG9yIHByb3ZpZGVyIHdpdGggYSBjdXN0b20gY2xpZW50IGNvbmZpZ3VyYXRpb24gY3VzdG9taXplci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhc3luY0NsaWVudEN1c3RvbWl6ZXIgQXN5bmMgSFRUUCBDbGllbnQgY29uZmlndXJhdGlvbiBjdXN0b21pemVyLgorICAgICAqIEBzaW5jZSAyLjEwCisgICAgICovCisgICAgcHVibGljIEdyaXp6bHlDb25uZWN0b3JQcm92aWRlcihmaW5hbCBBc3luY0NsaWVudEN1c3RvbWl6ZXIgYXN5bmNDbGllbnRDdXN0b21pemVyKSB7CisgICAgICAgIHRoaXMuYXN5bmNDbGllbnRDdXN0b21pemVyID0gYXN5bmNDbGllbnRDdXN0b21pemVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb25uZWN0b3IgZ2V0Q29ubmVjdG9yKENsaWVudCBjbGllbnQsIENvbmZpZ3VyYXRpb24gY29uZmlnKSB7CisgICAgICAgIHJldHVybiBuZXcgR3JpenpseUNvbm5lY3RvcihjbGllbnQsIGNvbmZpZywgYXN5bmNDbGllbnRDdXN0b21pemVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSB0aGUgdW5kZXJseWluZyBHcml6emx5IHtAbGluayBBc3luY0h0dHBDbGllbnR9IGluc3RhbmNlIGZyb20KKyAgICAgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkplcnNleUNsaWVudH0gb3Ige0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5KZXJzZXlXZWJUYXJnZXR9CisgICAgICogY29uZmlndXJlZCB0byB1c2Uge0Bjb2RlIEdyaXp6bHlDb25uZWN0b3JQcm92aWRlcn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tcG9uZW50IHtAY29kZSBKZXJzZXlDbGllbnR9IG9yIHtAY29kZSBKZXJzZXlXZWJUYXJnZXR9IGluc3RhbmNlIHRoYXQgaXMgY29uZmlndXJlZCB0byB1c2UKKyAgICAgKiAgICAgICAgICAgICAgICAgIHtAY29kZSBHcml6emx5Q29ubmVjdG9yUHJvdmlkZXJ9LgorICAgICAqIEByZXR1cm4gdW5kZXJseWluZyBHcml6emx5IHtAY29kZSBBc3luY0h0dHBDbGllbnR9IGluc3RhbmNlLgorICAgICAqCisgICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGluIGNhc2UgdGhlIHtAY29kZSBjb21wb25lbnR9IGlzIG5laXRoZXIge0Bjb2RlIEplcnNleUNsaWVudH0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9yIHtAY29kZSBKZXJzZXlXZWJUYXJnZXR9IGluc3RhbmNlIG9yIGluIGNhc2UgdGhlIGNvbXBvbmVudAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBub3QgY29uZmlndXJlZCB0byB1c2UgYSB7QGNvZGUgR3JpenpseUNvbm5lY3RvclByb3ZpZGVyfS4KKyAgICAgKiBAc2luY2UgMi44CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBBc3luY0h0dHBDbGllbnQgZ2V0SHR0cENsaWVudChDb25maWd1cmFibGU8Pz4gY29tcG9uZW50KSB7CisgICAgICAgIGlmICghKGNvbXBvbmVudCBpbnN0YW5jZW9mIEluaXRpYWxpemFibGUpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBMb2NhbGl6YXRpb25NZXNzYWdlcy5JTlZBTElEX0NPTkZJR1VSQUJMRV9DT01QT05FTlRfVFlQRShjb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIEluaXRpYWxpemFibGU8Pz4gaW5pdGlhbGl6YWJsZSA9IChJbml0aWFsaXphYmxlPD8+KSBjb21wb25lbnQ7CisgICAgICAgIENvbm5lY3RvciBjb25uZWN0b3IgPSBpbml0aWFsaXphYmxlLmdldENvbmZpZ3VyYXRpb24oKS5nZXRDb25uZWN0b3IoKTsKKyAgICAgICAgaWYgKGNvbm5lY3RvciA9PSBudWxsKSB7CisgICAgICAgICAgICBpbml0aWFsaXphYmxlLnByZUluaXRpYWxpemUoKTsKKyAgICAgICAgICAgIGNvbm5lY3RvciA9IGluaXRpYWxpemFibGUuZ2V0Q29uZmlndXJhdGlvbigpLmdldENvbm5lY3RvcigpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbm5lY3RvciBpbnN0YW5jZW9mIEdyaXp6bHlDb25uZWN0b3IpIHsKKyAgICAgICAgICAgIHJldHVybiAoKEdyaXp6bHlDb25uZWN0b3IpIGNvbm5lY3RvcikuZ2V0R3JpenpseUNsaWVudCgpOworICAgICAgICB9CisKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5FWFBFQ1RFRF9DT05ORUNUT1JfUFJPVklERVJfTk9UX1VTRUQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgYSByZXF1ZXN0IGN1c3RvbWl6ZXIgZm9yIGEgc2luZ2xlIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBBIHJlZ2lzdGVyZWQgY3VzdG9taXplciB3aWxsIGJlIHVzZWQgdG8gY3VzdG9taXplIHRoZSB1bmRlcmx5aW5nIEFzeW5jIEhUVFAgQ2xpZW50IHJlcXVlc3QgYnVpbGRlci4KKyAgICAgKiA8cD4KKyAgICAgKiBJbnZva2luZyB0aGlzIG1ldGhvZCBvbiBhbiBpbnN0YW5jZSB0aGF0IGlzIG5vdCBjb25maWd1cmVkIHRvIHVzZSBHcml6emx5IEFzeW5jIEhUVFAgQ2xpZW50CisgICAgICogY29ubmVjdG9yIGRvZXMgbm90IGhhdmUgYW55IGVmZmVjdC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVpbGRlciAgICBKQVgtUlMgcmVxdWVzdCBpbnZvY2F0aW9uIGJ1aWxkZXIuCisgICAgICogQHBhcmFtIGN1c3RvbWl6ZXIgcmVxdWVzdCBjdXN0b21pemVyIHRvIGJlIHJlZ2lzdGVyZWQuCisgICAgICogQHJldHVybiB1cGRhdGVkIEplcnNleSBjbGllbnQgY29uZmlnIHdpdGggdGhlIEdyaXp6bHkKKyAgICAgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseS5jb25uZWN0b3IuR3JpenpseUNvbm5lY3RvclByb3ZpZGVyLlJlcXVlc3RDdXN0b21pemVyfSBhdHRhY2hlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEludm9jYXRpb24uQnVpbGRlciByZWdpc3RlcihJbnZvY2F0aW9uLkJ1aWxkZXIgYnVpbGRlciwgUmVxdWVzdEN1c3RvbWl6ZXIgY3VzdG9taXplcikgeworICAgICAgICByZXR1cm4gYnVpbGRlci5wcm9wZXJ0eShSRVFVRVNUX0NVU1RPTUlaRVIsIGN1c3RvbWl6ZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGEgcmVxdWVzdCBjdXN0b21pemVyIGZvciBhIGFsbCByZXF1ZXN0cyBleGVjdXRlZCBieSBhIGNsaWVudCBpbnN0YW5jZSBjb25maWd1cmVkIHdpdGggdGhpcyBjbGllbnQgY29uZmlnLgorICAgICAqCisgICAgICogQSByZWdpc3RlcmVkIGN1c3RvbWl6ZXIgd2lsbCBiZSB1c2VkIHRvIGN1c3RvbWl6ZSB1bmRlcmx5aW5nIEFzeW5jIEhUVFAgQ2xpZW50IHJlcXVlc3QgYnVpbGRlcnMgZm9yIGFsbCByZXF1ZXN0cyBjcmVhdGVkCisgICAgICogdXNpbmcgdGhlIEplcnNleSBjbGllbnQgaW5zdGFuY2UgY29uZmlndXJlZCB3aXRoIHRoaXMgY2xpZW50IGNvbmZpZy4KKyAgICAgKiA8cD4KKyAgICAgKiBJbnZva2luZyB0aGlzIG1ldGhvZCBvbiBhbiBpbnN0YW5jZSB0aGF0IGlzIG5vdCBjb25maWd1cmVkIHRvIHVzZSBHcml6emx5IEFzeW5jIEhUVFAgQ2xpZW50CisgICAgICogY29ubmVjdG9yIGRvZXMgbm90IGhhdmUgYW55IGVmZmVjdC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uZmlnICAgICBKZXJzZXkgY2xpZW50IGNvbmZpZ3VyYXRpb24uCisgICAgICogQHBhcmFtIGN1c3RvbWl6ZXIgQXN5bmMgSFRUUCBDbGllbnQgY29uZmlndXJhdGlvbiBjdXN0b21pemVyLgorICAgICAqIEByZXR1cm4gdXBkYXRlZCBKQVgtUlMgY2xpZW50IGludm9jYXRpb24gYnVpbGRlciB3aXRoIHRoZSBHcml6emx5CisgICAgICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkuY29ubmVjdG9yLkdyaXp6bHlDb25uZWN0b3JQcm92aWRlci5SZXF1ZXN0Q3VzdG9taXplciBSZXF1ZXN0Q3VzdG9taXplcn0gYXR0YWNoZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDbGllbnRDb25maWcgcmVnaXN0ZXIoQ2xpZW50Q29uZmlnIGNvbmZpZywgUmVxdWVzdEN1c3RvbWl6ZXIgY3VzdG9taXplcikgeworICAgICAgICByZXR1cm4gY29uZmlnLnByb3BlcnR5KFJFUVVFU1RfQ1VTVE9NSVpFUiwgY3VzdG9taXplcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9ncml6emx5LWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2dyaXp6bHkvY29ubmVjdG9yL3BhY2thZ2UtaW5mby5qYXZhIGIvY29ubmVjdG9ycy9ncml6emx5LWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2dyaXp6bHkvY29ubmVjdG9yL3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlODliMDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL2dyaXp6bHktY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZ3JpenpseS9jb25uZWN0b3IvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoqCisgKiBKZXJzZXkgY2xpZW50IHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuc3BpLkNvbm5lY3RvciBjb25uZWN0b3J9IGJhc2VkIG9uIHRoZQorICogR3JpenpseSBBc3luYyBDbGllbnQuCisgKi8KK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseS5jb25uZWN0b3I7CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2dyaXp6bHktY29ubmVjdG9yL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9ncml6emx5L2Nvbm5lY3Rvci9sb2NhbGl6YXRpb24ucHJvcGVydGllcyBiL2Nvbm5lY3RvcnMvZ3JpenpseS1jb25uZWN0b3Ivc3JjL21haW4vcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L2dyaXp6bHkvY29ubmVjdG9yL2xvY2FsaXphdGlvbi5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYjA1MGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL2dyaXp6bHktY29ubmVjdG9yL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9ncml6emx5L2Nvbm5lY3Rvci9sb2NhbGl6YXRpb24ucHJvcGVydGllcwpAQCAtMCwwICsxLDIwIEBACisjCisjIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorIworIyBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisjIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyMgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisjIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyMKKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisjCisKK2Vycm9yLmJ1ZmZlcmluZy5lbnRpdHk9RXJyb3IgYnVmZmVyaW5nIHRoZSBlbnRpdHkuCitleHBlY3RlZC5jb25uZWN0b3IucHJvdmlkZXIubm90LnVzZWQ9VGhlIHN1cHBsaWVkIGNvbXBvbmVudCBpcyBub3QgY29uZmlndXJlZCB0byB1c2UgYSBHcml6emx5Q29ubmVjdG9yUHJvdmlkZXIuCitpbnZhbGlkLmNvbmZpZ3VyYWJsZS5jb21wb25lbnQudHlwZT1UaGUgc3VwcGxpZWQgY29tcG9uZW50ICJ7MH0iIGlzIG5vdCBhc3NpZ25hYmxlIGZyb20gSmVyc2V5Q2xpZW50IG9yIEplcnNleVdlYlRhcmdldC4KK3dyb25nLnByb3h5LnVyaS50eXBlPVRoZSBwcm94eSBVUkkgKCJ7MH0iKSBwcm9wZXJ0eSBNVVNUIGJlIGFuIGluc3RhbmNlIG9mIFN0cmluZyBvciBVUkkuCmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2dyaXp6bHktY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZ3JpenpseS9jb25uZWN0b3IvQXN5bmNUZXN0LmphdmEgYi9jb25uZWN0b3JzL2dyaXp6bHktY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZ3JpenpseS9jb25uZWN0b3IvQXN5bmNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgyOThmYwotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvZ3JpenpseS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9ncml6emx5L2Nvbm5lY3Rvci9Bc3luY1Rlc3QuamF2YQpAQCAtMCwwICsxLDIwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5LmNvbm5lY3RvcjsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkFzeW5jUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlN1c3BlbmRlZDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuVGltZW91dEhhbmRsZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnM7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogQXN5bmNocm9ub3VzIGNvbm5lY3RvciB0ZXN0LgorICoKKyAqIEBhdXRob3IgQXJ1bCBEaGVzaWFzZWVsYW4gKGFydWxkIGF0IGFjbS5vcmcpCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQXN5bmNUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihBc3luY1Rlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSCA9ICJhc3luYyI7CisKKyAgICAvKioKKyAgICAgKiBBc3luY2hyb25vdXMgdGVzdCByZXNvdXJjZS4KKyAgICAgKi8KKyAgICBAUGF0aChQQVRIKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQXN5bmNSZXNvdXJjZSB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFR5cGljYWwgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbiBkdXJhdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBPUEVSQVRJT05fRFVSQVRJT04gPSAxMDAwOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBMb25nLXJ1bm5pbmcgYXN5bmNocm9ub3VzIHBvc3QuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhc3luY1Jlc3BvbnNlIGFzeW5jIHJlc3BvbnNlLgorICAgICAgICAgKiBAcGFyYW0gaWQgICAgICAgICAgICBwb3N0IHJlcXVlc3QgaWQgKHJlY2VpdmVkIGFzIHJlcXVlc3QgcGF5bG9hZCkuCisgICAgICAgICAqLworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgdm9pZCBhc3luY1Bvc3QoQFN1c3BlbmRlZCBmaW5hbCBBc3luY1Jlc3BvbnNlIGFzeW5jUmVzcG9uc2UsIGZpbmFsIFN0cmluZyBpZCkgeworICAgICAgICAgICAgTE9HR0VSLmluZm8oIkxvbmcgcnVubmluZyBwb3N0IG9wZXJhdGlvbiBjYWxsZWQgd2l0aCBpZCAiICsgaWQgKyAiIG9uIHRocmVhZCAiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQgPSB2ZXJ5RXhwZW5zaXZlT3BlcmF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIGFzeW5jUmVzcG9uc2UucmVzdW1lKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdmVyeUV4cGVuc2l2ZU9wZXJhdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4uIHZlcnkgZXhwZW5zaXZlIG9wZXJhdGlvbiB0aGF0IHR5cGljYWxseSBmaW5pc2hlcyB3aXRoaW4gMSBzZWNvbmRzLCBzaW11bGF0ZWQgdXNpbmcgc2xlZXAoKQorICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKE9QRVJBVElPTl9EVVJBVElPTik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRPTkUtIiArIGlkOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJJTlRFUlJVUFRFRC0iICsgaWQ7CisgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dHRVIuaW5mbygiTG9uZyBydW5uaW5nIHBvc3Qgb3BlcmF0aW9uIGZpbmlzaGVkIG9uIHRocmVhZCAiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwgImFzeW5jLXBvc3QtcnVubmVyLSIgKyBpZCkuc3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBMb25nLXJ1bm5pbmcgYXN5bmMgZ2V0IHJlcXVlc3QgdGhhdCB0aW1lcyBvdXQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhc3luY1Jlc3BvbnNlIGFzeW5jIHJlc3BvbnNlLgorICAgICAgICAgKi8KKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgidGltZW91dCIpCisgICAgICAgIHB1YmxpYyB2b2lkIGFzeW5jR2V0V2l0aFRpbWVvdXQoQFN1c3BlbmRlZCBmaW5hbCBBc3luY1Jlc3BvbnNlIGFzeW5jUmVzcG9uc2UpIHsKKyAgICAgICAgICAgIExPR0dFUi5pbmZvKCJBc3luYyBsb25nLXJ1bm5pbmcgZ2V0IHdpdGggdGltZW91dCBjYWxsZWQgb24gdGhyZWFkICIgKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBhc3luY1Jlc3BvbnNlLnNldFRpbWVvdXRIYW5kbGVyKG5ldyBUaW1lb3V0SGFuZGxlcigpIHsKKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZVRpbWVvdXQoZmluYWwgQXN5bmNSZXNwb25zZSBhc3luY1Jlc3BvbnNlKSB7CisgICAgICAgICAgICAgICAgICAgIGFzeW5jUmVzcG9uc2UucmVzdW1lKFJlc3BvbnNlLnN0YXR1cyhSZXNwb25zZS5TdGF0dXMuU0VSVklDRV9VTkFWQUlMQUJMRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZW50aXR5KCJPcGVyYXRpb24gdGltZSBvdXQuIikuYnVpbGQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBhc3luY1Jlc3BvbnNlLnNldFRpbWVvdXQoMSwgVGltZVVuaXQuU0VDT05EUyk7CisKKyAgICAgICAgICAgIG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVzdWx0ID0gdmVyeUV4cGVuc2l2ZU9wZXJhdGlvbigpOworICAgICAgICAgICAgICAgICAgICBhc3luY1Jlc3BvbnNlLnJlc3VtZShyZXN1bHQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByaXZhdGUgU3RyaW5nIHZlcnlFeHBlbnNpdmVPcGVyYXRpb24oKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHZlcnkgZXhwZW5zaXZlIG9wZXJhdGlvbiB0aGF0IHR5cGljYWxseSBmaW5pc2hlcyB3aXRoaW4gMSBzZWNvbmQgYnV0IGNhbiB0YWtlIHVwIHRvIDUgc2Vjb25kcywKKyAgICAgICAgICAgICAgICAgICAgLy8gc2ltdWxhdGVkIHVzaW5nIHNsZWVwKCkKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCg1ICogT1BFUkFUSU9OX0RVUkFUSU9OKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRE9ORSI7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIklOVEVSUlVQVEVEIjsKKyAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi5pbmZvKCJBc3luYyBsb25nLXJ1bm5pbmcgZ2V0IHdpdGggdGltZW91dCBmaW5pc2hlZCBvbiB0aHJlYWQgIiArIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pLnN0YXJ0KCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoQXN5bmNSZXNvdXJjZS5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIobmV3IExvZ2dpbmdGZWF0dXJlKExPR0dFUiwgTG9nZ2luZ0ZlYXR1cmUuVmVyYm9zaXR5LlBBWUxPQURfQU5ZKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KGZpbmFsIENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKG5ldyBMb2dnaW5nRmVhdHVyZShMT0dHRVIsIExvZ2dpbmdGZWF0dXJlLlZlcmJvc2l0eS5QQVlMT0FEX0FOWSkpOworICAgICAgICBjb25maWcuY29ubmVjdG9yUHJvdmlkZXIobmV3IEdyaXp6bHlDb25uZWN0b3JQcm92aWRlcigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGFzeW5jaHJvbm91cyBQT1NULgorICAgICAqIDxwLz4KKyAgICAgKiBTZW5kIDMgYXN5bmMgUE9TVCByZXF1ZXN0cyBhbmQgd2FpdCB0byByZWNlaXZlIHRoZSByZXNwb25zZXMuIENoZWNrIHRoZSByZXNwb25zZSBjb250ZW50IGFuZAorICAgICAqIGFzc2VydCB0aGF0IHRoZSBvcGVyYXRpb24gZGlkIG5vdCB0YWtlIG1vcmUgdGhhbiB0d2ljZSBhcyBsb25nIGFzIGEgc2luZ2xlIGxvbmcgb3BlcmF0aW9uIGR1cmF0aW9uCisgICAgICogKHRoaXMgZW5zdXJlcyBhc3luYyByZXF1ZXN0IGV4ZWN1dGlvbikuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGVzdCBlcnJvci4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luY1Bvc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgbG9uZyB0aWMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgICAgICAvLyBTdWJtaXQgcmVxdWVzdHMgYXN5bmNocm9ub3VzbHkuCisgICAgICAgIGZpbmFsIEZ1dHVyZTxSZXNwb25zZT4gcmYxID0gdGFyZ2V0KFBBVEgpLnJlcXVlc3QoKS5hc3luYygpLnBvc3QoRW50aXR5LnRleHQoIjEiKSk7CisgICAgICAgIGZpbmFsIEZ1dHVyZTxSZXNwb25zZT4gcmYyID0gdGFyZ2V0KFBBVEgpLnJlcXVlc3QoKS5hc3luYygpLnBvc3QoRW50aXR5LnRleHQoIjIiKSk7CisgICAgICAgIGZpbmFsIEZ1dHVyZTxSZXNwb25zZT4gcmYzID0gdGFyZ2V0KFBBVEgpLnJlcXVlc3QoKS5hc3luYygpLnBvc3QoRW50aXR5LnRleHQoIjMiKSk7CisgICAgICAgIC8vIGdldCgpIHdhaXRzIGZvciB0aGUgcmVzcG9uc2UKKyAgICAgICAgZmluYWwgU3RyaW5nIHIxID0gcmYxLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHIyID0gcmYyLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHIzID0gcmYzLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBmaW5hbCBsb25nIHRvYyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgICAgIGFzc2VydEVxdWFscygiRE9ORS0xIiwgcjEpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkRPTkUtMiIsIHIyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJET05FLTMiLCByMyk7CisKKyAgICAgICAgYXNzZXJ0VGhhdCgiQXN5bmMgcHJvY2Vzc2luZyB0b29rIHRvbyBsb25nLiIsIHRvYyAtIHRpYywgTWF0Y2hlcnMubGVzc1RoYW4oMyAqIEFzeW5jUmVzb3VyY2UuT1BFUkFUSU9OX0RVUkFUSU9OKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBhY2Nlc3NpbmcgYW4gb3BlcmF0aW9uIHRoYXQgdGltZXMgb3V0IG9uIHRoZSBzZXJ2ZXIuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGVzdCBlcnJvci4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luY0dldFdpdGhUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEZ1dHVyZTxSZXNwb25zZT4gcmVzcG9uc2VGdXR1cmUgPSB0YXJnZXQoUEFUSCkucGF0aCgidGltZW91dCIpLnJlcXVlc3QoKS5hc3luYygpLmdldCgpOworICAgICAgICAvLyBSZXF1ZXN0IGlzIGJlaW5nIHByb2Nlc3NlZCBhc3luY2hyb25vdXNseS4KKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSByZXNwb25zZUZ1dHVyZS5nZXQoKTsKKworICAgICAgICAvLyBnZXQoKSB3YWl0cyBmb3IgdGhlIHJlc3BvbnNlCisgICAgICAgIGFzc2VydEVxdWFscyg1MDMsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJPcGVyYXRpb24gdGltZSBvdXQuIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2dyaXp6bHktY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZ3JpenpseS9jb25uZWN0b3IvQ3VzdG9taXplcnNUZXN0LmphdmEgYi9jb25uZWN0b3JzL2dyaXp6bHktY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZ3JpenpseS9jb25uZWN0b3IvQ3VzdG9taXplcnNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI4YWFlNQotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvZ3JpenpseS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9ncml6emx5L2Nvbm5lY3Rvci9DdXN0b21pemVyc1Rlc3QuamF2YQpAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5LmNvbm5lY3RvcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkhlYWRlclBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5JbnZvY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBzdGF0aWMgamF2YXgud3MucnMuY2xpZW50LkVudGl0eS50ZXh0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UmVxdWVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK2ltcG9ydCBjb20ubmluZy5odHRwLmNsaWVudC5Bc3luY0h0dHBDbGllbnRDb25maWc7CitpbXBvcnQgY29tLm5pbmcuaHR0cC5jbGllbnQuUmVxdWVzdEJ1aWxkZXI7CitpbXBvcnQgY29tLm5pbmcuaHR0cC5jbGllbnQuZmlsdGVyLkZpbHRlckNvbnRleHQ7CitpbXBvcnQgY29tLm5pbmcuaHR0cC5jbGllbnQuZmlsdGVyLkZpbHRlckV4Y2VwdGlvbjsKK2ltcG9ydCBjb20ubmluZy5odHRwLmNsaWVudC5maWx0ZXIuUmVxdWVzdEZpbHRlcjsKKworLyoqCisgKiBBc3luYyBIVFRQIENsaWVudCBDb25maWcgYW5kIFJlcXVlc3QgY3VzdG9taXplcnMgdW5pdCB0ZXN0cy4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQ3VzdG9taXplcnNUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAUGF0aCgiL3Rlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRWNob1Jlc291cmNlIHsKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHBvc3QoQEhlYWRlclBhcmFtKCJYLVRlc3QtQ29uZmlnIikgU3RyaW5nIHRlc3RDb25maWdIZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBASGVhZGVyUGFyYW0oIlgtVGVzdC1SZXF1ZXN0IikgU3RyaW5nIHRlc3RSZXF1ZXN0SGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVudGl0eSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCJQT1NUZWQgIiArIGVudGl0eSkKKyAgICAgICAgICAgICAgICAgICAgLmhlYWRlcigiWC1UZXN0LUNvbmZpZyIsIHRlc3RDb25maWdIZWFkZXIpCisgICAgICAgICAgICAgICAgICAgIC5oZWFkZXIoIlgtVGVzdC1SZXF1ZXN0IiwgdGVzdFJlcXVlc3RIZWFkZXIpCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhFY2hvUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGZpbmFsIEdyaXp6bHlDb25uZWN0b3JQcm92aWRlciBjb25uZWN0b3JQcm92aWRlciA9IG5ldyBHcml6emx5Q29ubmVjdG9yUHJvdmlkZXIoCisgICAgICAgICAgICAgICAgbmV3IEdyaXp6bHlDb25uZWN0b3JQcm92aWRlci5Bc3luY0NsaWVudEN1c3RvbWl6ZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgQXN5bmNIdHRwQ2xpZW50Q29uZmlnLkJ1aWxkZXIgY3VzdG9taXplKENsaWVudCBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXN5bmNIdHRwQ2xpZW50Q29uZmlnLkJ1aWxkZXIgY29uZmlnQnVpbGRlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ0J1aWxkZXIuYWRkUmVxdWVzdEZpbHRlcihuZXcgUmVxdWVzdEZpbHRlcigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgRmlsdGVyQ29udGV4dCBmaWx0ZXIoRmlsdGVyQ29udGV4dCBmaWx0ZXJDb250ZXh0KSB0aHJvd3MgRmlsdGVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyQ29udGV4dC5nZXRSZXF1ZXN0KCkuZ2V0SGVhZGVycygpLmFkZCgiWC1UZXN0LUNvbmZpZyIsICJ0ZXN0ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlckNvbnRleHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgY29uZmlnLmNvbm5lY3RvclByb3ZpZGVyKGNvbm5lY3RvclByb3ZpZGVyKTsKKyAgICAgICAgR3JpenpseUNvbm5lY3RvclByb3ZpZGVyLnJlZ2lzdGVyKGNvbmZpZywgbmV3IEdyaXp6bHlDb25uZWN0b3JQcm92aWRlci5SZXF1ZXN0Q3VzdG9taXplcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFJlcXVlc3RCdWlsZGVyIGN1c3RvbWl6ZShDbGllbnRSZXF1ZXN0IHJlcXVlc3RDb250ZXh0LCBSZXF1ZXN0QnVpbGRlciByZXF1ZXN0QnVpbGRlcikgeworICAgICAgICAgICAgICAgIHJlcXVlc3RCdWlsZGVyLmFkZEhlYWRlcigiWC1UZXN0LVJlcXVlc3QiLCAidGVzdGVkLWdsb2JhbCIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXF1ZXN0QnVpbGRlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSmVyc2V5LTI1NDAgcmVsYXRlZCB0ZXN0LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbWl6ZXJzKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZTsKKworICAgICAgICAvLyBub3cgdXNpbmcgZ2xvYmFsIHJlcXVlc3QgY3VzdG9taXplcgorICAgICAgICByZXNwb25zZSA9IHRhcmdldCgidGVzdCIpLnJlcXVlc3QoKS5wb3N0KHRleHQoImVjaG8iKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiUE9TVGVkIGVjaG8iLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3RlZCIsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiWC1UZXN0LUNvbmZpZyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0ZWQtZ2xvYmFsIiwgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJYLVRlc3QtUmVxdWVzdCIpKTsKKworCisgICAgICAgIC8vIG5vdyB1c2luZyByZXF1ZXN0LXNwZWNpZmljIHJlcXVlc3QgY3VzdG9taXplcgorICAgICAgICBmaW5hbCBJbnZvY2F0aW9uLkJ1aWxkZXIgYnVpbGRlciA9IHRhcmdldCgidGVzdCIpLnJlcXVlc3QoKTsKKyAgICAgICAgR3JpenpseUNvbm5lY3RvclByb3ZpZGVyLnJlZ2lzdGVyKGJ1aWxkZXIsIG5ldyBHcml6emx5Q29ubmVjdG9yUHJvdmlkZXIuUmVxdWVzdEN1c3RvbWl6ZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBSZXF1ZXN0QnVpbGRlciBjdXN0b21pemUoQ2xpZW50UmVxdWVzdCByZXF1ZXN0Q29udGV4dCwgUmVxdWVzdEJ1aWxkZXIgcmVxdWVzdEJ1aWxkZXIpIHsKKyAgICAgICAgICAgICAgICByZXF1ZXN0QnVpbGRlci5hZGRIZWFkZXIoIlgtVGVzdC1SZXF1ZXN0IiwgInRlc3RlZC1wZXItcmVxdWVzdCIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXF1ZXN0QnVpbGRlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHJlc3BvbnNlID0gYnVpbGRlci5wb3N0KHRleHQoImVjaG8iKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiUE9TVGVkIGVjaG8iLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3RlZCIsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiWC1UZXN0LUNvbmZpZyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0ZWQtcGVyLXJlcXVlc3QiLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIlgtVGVzdC1SZXF1ZXN0IikpOworCisKKyAgICAgICAgLy8gbm93IHVzaW5nIGdsb2JhbCByZXF1ZXN0IGN1c3RvbWl6ZXIgYWdhaW4KKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQoInRlc3QiKS5yZXF1ZXN0KCkucG9zdCh0ZXh0KCJlY2hvIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlBPU1RlZCBlY2hvIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0ZWQiLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIlgtVGVzdC1Db25maWciKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdGVkLWdsb2JhbCIsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiWC1UZXN0LVJlcXVlc3QiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9ncml6emx5LWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2dyaXp6bHkvY29ubmVjdG9yL0ZvbGxvd1JlZGlyZWN0c1Rlc3QuamF2YSBiL2Nvbm5lY3RvcnMvZ3JpenpseS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9ncml6emx5L2Nvbm5lY3Rvci9Gb2xsb3dSZWRpcmVjdHNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M5YzQxNwotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvZ3JpenpseS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9ncml6emx5L2Nvbm5lY3Rvci9Gb2xsb3dSZWRpcmVjdHNUZXN0LmphdmEKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseS5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXNwb25zZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlc3BvbnNlRmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogR3JpenpseSBjb25uZWN0b3IgZm9sbG93IHJlZGlyZWN0IHRlc3RzLgorICoKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEZvbGxvd1JlZGlyZWN0c1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKyAgICBAUGF0aCgiL3Rlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVkaXJlY3RSZXNvdXJjZSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gIkdFVCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJyZWRpcmVjdCIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSByZWRpcmVjdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zZWVPdGhlcihVcmlCdWlsZGVyLmZyb21SZXNvdXJjZShSZWRpcmVjdFJlc291cmNlLmNsYXNzKS5idWlsZCgpKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZWRpcmVjdFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcuY29ubmVjdG9yUHJvdmlkZXIobmV3IEdyaXp6bHlDb25uZWN0b3JQcm92aWRlcigpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSZWRpcmVjdFRlc3RGaWx0ZXIgaW1wbGVtZW50cyBDbGllbnRSZXNwb25zZUZpbHRlciB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09MVkVEX1VSSV9IRUFERVIgPSAicmVzb2x2ZWQtdXJpIjsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENsaWVudFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LCBDbGllbnRSZXNwb25zZUNvbnRleHQgcmVzcG9uc2VDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKHJlc3BvbnNlQ29udGV4dCBpbnN0YW5jZW9mIENsaWVudFJlc3BvbnNlKSB7CisgICAgICAgICAgICAgICAgQ2xpZW50UmVzcG9uc2UgY2xpZW50UmVzcG9uc2UgPSAoQ2xpZW50UmVzcG9uc2UpIHJlc3BvbnNlQ29udGV4dDsKKyAgICAgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuZ2V0SGVhZGVycygpLnB1dFNpbmdsZShSRVNPTFZFRF9VUklfSEVBREVSLCBjbGllbnRSZXNwb25zZS5nZXRSZXNvbHZlZFJlcXVlc3RVcmkoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERvRm9sbG93KCkgeworICAgICAgICBSZXNwb25zZSByID0gdGFyZ2V0KCJ0ZXN0L3JlZGlyZWN0IikKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoUmVkaXJlY3RUZXN0RmlsdGVyLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHIuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCIsIHIucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKy8vIFRPRE8gdW5jb21tZW50IGFzIHBhcnQgb2YgSkVSU0VZLTIzODggZml4LgorLy8gICAgICAgIGFzc2VydEVxdWFscygKKy8vICAgICAgICAgICAgICAgIFVyaUJ1aWxkZXIuZnJvbVVyaShnZXRCYXNlVXJpKCkpLnBhdGgoUmVkaXJlY3RSZXNvdXJjZS5jbGFzcykuYnVpbGQoKS50b1N0cmluZygpLAorLy8gICAgICAgICAgICAgICAgci5nZXRIZWFkZXJTdHJpbmcoUmVkaXJlY3RUZXN0RmlsdGVyLlJFU09MVkVEX1VSSV9IRUFERVIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REb250Rm9sbG93KCkgeworICAgICAgICBXZWJUYXJnZXQgdCA9IHRhcmdldCgidGVzdC9yZWRpcmVjdCIpOworICAgICAgICB0LnByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuRk9MTE9XX1JFRElSRUNUUywgZmFsc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoMzAzLCB0LnJlcXVlc3QoKS5nZXQoKS5nZXRTdGF0dXMoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9ncml6emx5LWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2dyaXp6bHkvY29ubmVjdG9yL0h0dHBIZWFkZXJzVGVzdC5qYXZhIGIvY29ubmVjdG9ycy9ncml6emx5LWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2dyaXp6bHkvY29ubmVjdG9yL0h0dHBIZWFkZXJzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzOGY0ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL2dyaXp6bHktY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZ3JpenpseS9jb25uZWN0b3IvSHR0cEhlYWRlcnNUZXN0LmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5LmNvbm5lY3RvcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkhlYWRlclBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBUZXN0cyB0aGUgaGVhZGVycy4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBLb3ByaXZhCisgKi8KK3B1YmxpYyBjbGFzcyBIdHRwSGVhZGVyc1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0eworICAgIEBQYXRoKCIvdGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBIdHRwTWV0aG9kUmVzb3VyY2UgeworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3QoCisgICAgICAgICAgICAgICAgQEhlYWRlclBhcmFtKCJUcmFuc2Zlci1FbmNvZGluZyIpIFN0cmluZyB0cmFuc2ZlckVuY29kaW5nLAorICAgICAgICAgICAgICAgIEBIZWFkZXJQYXJhbSgiWC1DTElFTlQiKSBTdHJpbmcgeENsaWVudCwKKyAgICAgICAgICAgICAgICBASGVhZGVyUGFyYW0oIlgtV1JJVEVSIikgU3RyaW5nIHhXcml0ZXIsCisgICAgICAgICAgICAgICAgU3RyaW5nIGVudGl0eSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJjbGllbnQiLCB4Q2xpZW50KTsKKyAgICAgICAgICAgIHJldHVybiAiUE9TVCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEh0dHBIZWFkZXJzVGVzdC5IdHRwTWV0aG9kUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5jb25uZWN0b3JQcm92aWRlcihuZXcgR3JpenpseUNvbm5lY3RvclByb3ZpZGVyKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc3QoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJ0ZXN0IikucmVxdWVzdCgpLmhlYWRlcigiWC1DTElFTlQiLCAiY2xpZW50IikucG9zdChudWxsKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuaGFzRW50aXR5KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvZ3JpenpseS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9ncml6emx5L2Nvbm5lY3Rvci9Ob0VudGl0eVRlc3QuamF2YSBiL2Nvbm5lY3RvcnMvZ3JpenpseS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9ncml6emx5L2Nvbm5lY3Rvci9Ob0VudGl0eVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWNmNmVkCi0tLSAvZGV2L251bGwKKysrIGIvY29ubmVjdG9ycy9ncml6emx5LWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2dyaXp6bHkvY29ubmVjdG9yL05vRW50aXR5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkuY29ubmVjdG9yOworCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlLlN0YXR1czsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBBcnVsIERoZXNpYXNlZWxhbiAoYXJ1bGQgYXQgYWNtLm9yZykKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBOb0VudGl0eVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihOb0VudGl0eVRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIEBQYXRoKCIvdGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBIdHRwTWV0aG9kUmVzb3VyY2UgeworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKFN0YXR1cy5DT05GTElDVCkuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyB2b2lkIHBvc3QoU3RyaW5nIGVudGl0eSkgeworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgUmVzb3VyY2VDb25maWcgY29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKEh0dHBNZXRob2RSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihuZXcgTG9nZ2luZ0ZlYXR1cmUoTE9HR0VSLCBMb2dnaW5nRmVhdHVyZS5WZXJib3NpdHkuUEFZTE9BRF9BTlkpKTsKKyAgICAgICAgcmV0dXJuIGNvbmZpZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcuY29ubmVjdG9yUHJvdmlkZXIobmV3IEdyaXp6bHlDb25uZWN0b3JQcm92aWRlcigpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXQoKSB7CisgICAgICAgIFdlYlRhcmdldCByID0gdGFyZ2V0KCJ0ZXN0Iik7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKKyAgICAgICAgICAgIFJlc3BvbnNlIGNyID0gci5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgICAgICBjci5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0V2l0aENsb3NlKCkgeworICAgICAgICBXZWJUYXJnZXQgciA9IHRhcmdldCgidGVzdCIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgeworICAgICAgICAgICAgUmVzcG9uc2UgY3IgPSByLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgICAgIGNyLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0KCkgeworICAgICAgICBXZWJUYXJnZXQgciA9IHRhcmdldCgidGVzdCIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgeworICAgICAgICAgICAgUmVzcG9uc2UgY3IgPSByLnJlcXVlc3QoKS5wb3N0KG51bGwpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdFdpdGhDbG9zZSgpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHIgPSB0YXJnZXQoInRlc3QiKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKKyAgICAgICAgICAgIFJlc3BvbnNlIGNyID0gci5yZXF1ZXN0KCkucG9zdChudWxsKTsKKyAgICAgICAgICAgIGNyLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2dyaXp6bHktY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZ3JpenpseS9jb25uZWN0b3IvUGFyYWxsZWxUZXN0LmphdmEgYi9jb25uZWN0b3JzL2dyaXp6bHktY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZ3JpenpseS9jb25uZWN0b3IvUGFyYWxsZWxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNkNDhiYQotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvZ3JpenpseS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9ncml6emx5L2Nvbm5lY3Rvci9QYXJhbGxlbFRlc3QuamF2YQpAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5LmNvbm5lY3RvcjsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkJyb2tlbkJhcnJpZXJFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ3ljbGljQmFycmllcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIFRlc3RzIHRoZSBwYXJhbGxlbCBleGVjdXRpb24gb2YgbXVsdGlwbGUgcmVxdWVzdHMuCisgKgorICogQGF1dGhvciBTdGVwYW4gS29wcml2YQorICovCitwdWJsaWMgY2xhc3MgUGFyYWxsZWxUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoUGFyYWxsZWxUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEFSQUxMRUxfQ0xJRU5UUyA9IDEwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIID0gInRlc3QiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEF0b21pY0ludGVnZXIgcmVjZWl2ZWRDb3VudGVyID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXRvbWljSW50ZWdlciByZXNvdXJjZUNvdW50ZXIgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDeWNsaWNCYXJyaWVyIHN0YXJ0QmFycmllciA9IG5ldyBDeWNsaWNCYXJyaWVyKFBBUkFMTEVMX0NMSUVOVFMgKyAxKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb3VudERvd25MYXRjaCBkb25lTGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goUEFSQUxMRUxfQ0xJRU5UUyk7CisKKyAgICBAUGF0aChQQVRIKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHNsZWVwKCk7CisgICAgICAgICAgICByZXNvdXJjZUNvdW50ZXIuYWRkQW5kR2V0KDEpOworICAgICAgICAgICAgcmV0dXJuICJHRVQiOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHNsZWVwKCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTApOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKFBhcmFsbGVsVGVzdC5jbGFzcy5nZXROYW1lKCkpLmxvZyhMZXZlbC5TRVZFUkUsIG51bGwsIGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUGFyYWxsZWxUZXN0Lk15UmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5jb25uZWN0b3JQcm92aWRlcihuZXcgR3JpenpseUNvbm5lY3RvclByb3ZpZGVyKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhcmFsbGVsKCkgdGhyb3dzIEJyb2tlbkJhcnJpZXJFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld1NjaGVkdWxlZFRocmVhZFBvb2woUEFSQUxMRUxfQ0xJRU5UUyk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IFBBUkFMTEVMX0NMSUVOVFM7IGkrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBpZCA9IGk7CisgICAgICAgICAgICAgICAgZXhlY3V0b3Iuc3VibWl0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRCYXJyaWVyLmF3YWl0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQucGF0aChQQVRIKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJHRVQiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkQ291bnRlci5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLldBUk5JTkcsICJDbGllbnQgdGhyZWFkICIgKyBpZCArICIgaW50ZXJydXB0ZWQuIiwgZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoQnJva2VuQmFycmllckV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuSU5GTywgIkNsaWVudCB0aHJlYWQgIiArIGlkICsgIiBmYWlsZWQgb24gYnJva2VuIGJhcnJpZXIuIiwgZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuV0FSTklORywgIkNsaWVudCB0aHJlYWQgIiArIGlkICsgIiBmYWlsZWQgb24gdW5leHBlY3RlZCBleGNlcHRpb24uIiwgdCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbmVMYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGFydEJhcnJpZXIuYXdhaXQoMSwgVGltZVVuaXQuU0VDT05EUyk7CisKKyAgICAgICAgICAgIGFzc2VydFRydWUoIldhaXRpbmcgZm9yIGNsaWVudHMgdG8gZmluaXNoIGhhcyB0aW1lZCBvdXQuIiwgZG9uZUxhdGNoLmF3YWl0KDUgKiBnZXRBc3luY1RpbWVvdXRNdWx0aXBsaWVyKCksCisgICAgICAgICAgICAgICAgICAgIFRpbWVVbml0LlNFQ09ORFMpKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXNvdXJjZSBjb3VudGVyIiwgUEFSQUxMRUxfQ0xJRU5UUywgcmVzb3VyY2VDb3VudGVyLmdldCgpKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZWNlaXZlZCBjb3VudGVyIiwgUEFSQUxMRUxfQ0xJRU5UUywgcmVjZWl2ZWRDb3VudGVyLmdldCgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGV4ZWN1dG9yLnNodXRkb3duTm93KCk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiRXhlY3V0b3IgdGVybWluYXRpb24iLCBleGVjdXRvci5hd2FpdFRlcm1pbmF0aW9uKDUsIFRpbWVVbml0LlNFQ09ORFMpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvZ3JpenpseS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9ncml6emx5L2Nvbm5lY3Rvci9UaW1lb3V0VGVzdC5qYXZhIGIvY29ubmVjdG9ycy9ncml6emx5LWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2dyaXp6bHkvY29ubmVjdG9yL1RpbWVvdXRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkyMGJkNwotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvZ3JpenpseS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9ncml6emx5L2Nvbm5lY3Rvci9UaW1lb3V0VGVzdC5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseS5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lb3V0RXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pbnN0YW5jZU9mOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK3B1YmxpYyBjbGFzcyBUaW1lb3V0VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworICAgIEBQYXRoKCIvdGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUaW1lb3V0UmVzb3VyY2UgeworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJHRVQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgidGltZW91dCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGltZW91dCgpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDIwMDApOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gIkdFVCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFRpbWVvdXRSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuUkVBRF9USU1FT1VULCAxMDAwKTsKKyAgICAgICAgY29uZmlnLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBHcml6emx5Q29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmFzdCgpIHsKKyAgICAgICAgUmVzcG9uc2UgciA9IHRhcmdldCgidGVzdCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgci5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiR0VUIiwgci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNsb3coKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0YXJnZXQoInRlc3QvdGltZW91dCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgICAgIGZhaWwoIlRpbWVvdXQgZXhwZWN0ZWQuIik7CisgICAgICAgIH0gY2F0Y2ggKFByb2Nlc3NpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VGhhdCgiVW5leHBlY3RlZCBwcm9jZXNzaW5nIGV4Y2VwdGlvbiBjYXVzZSIsCisgICAgICAgICAgICAgICAgICAgIGUuZ2V0Q2F1c2UoKSwgaW5zdGFuY2VPZihUaW1lb3V0RXhjZXB0aW9uLmNsYXNzKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2dyaXp6bHktY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZ3JpenpseS9jb25uZWN0b3IvVHJhY2VTdXBwb3J0VGVzdC5qYXZhIGIvY29ubmVjdG9ycy9ncml6emx5LWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2dyaXp6bHkvY29ubmVjdG9yL1RyYWNlU3VwcG9ydFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTEzMmVmCi0tLSAvZGV2L251bGwKKysrIGIvY29ubmVjdG9ycy9ncml6emx5LWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2dyaXp6bHkvY29ubmVjdG9yL1RyYWNlU3VwcG9ydFRlc3QuamF2YQpAQCAtMCwwICsxLDIzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5LmNvbm5lY3RvcjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuSHR0cE1ldGhvZDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVxdWVzdDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuSW5mbGVjdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiBUaGlzIHZlcnkgYmFzaWMgcmVzb3VyY2Ugc2hvd2Nhc2VzIHN1cHBvcnQgb2YgYSBIVFRQIFRSQUNFIG1ldGhvZCwKKyAqIG5vdCBkaXJlY3RseSBzdXBwb3J0ZWQgYnkgSkFYLVJTIEFQSS4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgVHJhY2VTdXBwb3J0VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoVHJhY2VTdXBwb3J0VGVzdC5jbGFzcy5nZXROYW1lKCkpOworCisgICAgLyoqCisgICAgICogUHJvZ3JhbW1hdGljIHRyYWNpbmcgcm9vdCByZXNvdXJjZSBwYXRoLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RfUEFUSF9QUk9HUkFNTUFUSUMgPSAidHJhY2luZy9wcm9ncmFtbWF0aWMiOworCisgICAgLyoqCisgICAgICogQW5ub3RhdGVkIGNsYXNzLWJhc2VkIHRyYWNpbmcgcm9vdCByZXNvdXJjZSBwYXRoLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RfUEFUSF9BTk5PVEFURUQgPSAidHJhY2luZy9hbm5vdGF0ZWQiOworCisgICAgQEh0dHBNZXRob2QoVFJBQ0UuTkFNRSkKKyAgICBAVGFyZ2V0KEVsZW1lbnRUeXBlLk1FVEhPRCkKKyAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRSQUNFIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJUUkFDRSI7CisgICAgfQorCisgICAgQFBhdGgoUk9PVF9QQVRIX0FOTk9UQVRFRCkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRyYWNpbmdSZXNvdXJjZSB7CisKKyAgICAgICAgQFRSQUNFCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdHJhY2UoUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgICAgICByZXR1cm4gc3RyaW5naWZ5KChDb250YWluZXJSZXF1ZXN0KSByZXF1ZXN0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIFJlc291cmNlQ29uZmlnIGNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhUcmFjaW5nUmVzb3VyY2UuY2xhc3MpOworICAgICAgICBjb25maWcucmVnaXN0ZXIobmV3IExvZ2dpbmdGZWF0dXJlKExPR0dFUiwgTG9nZ2luZ0ZlYXR1cmUuVmVyYm9zaXR5LlBBWUxPQURfQU5ZKSk7CisgICAgICAgIGZpbmFsIFJlc291cmNlLkJ1aWxkZXIgcmVzb3VyY2VCdWlsZGVyID0gUmVzb3VyY2UuYnVpbGRlcihST09UX1BBVEhfUFJPR1JBTU1BVElDKTsKKyAgICAgICAgcmVzb3VyY2VCdWlsZGVyLmFkZE1ldGhvZChUUkFDRS5OQU1FKS5oYW5kbGVkQnkobmV3IEluZmxlY3RvcjxDb250YWluZXJSZXF1ZXN0Q29udGV4dCwgUmVzcG9uc2U+KCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBSZXNwb25zZSBhcHBseShDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0KSB7CisgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uubm9Db250ZW50KCkuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soc3RyaW5naWZ5KChDb250YWluZXJSZXF1ZXN0KSByZXF1ZXN0KSwgTWVkaWFUeXBlLlRFWFRfUExBSU4pLmJ1aWxkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICByZXR1cm4gY29uZmlnLnJlZ2lzdGVyUmVzb3VyY2VzKHJlc291cmNlQnVpbGRlci5idWlsZCgpKTsKKworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nW10gZXhwZWN0ZWRGcmFnbWVudHNQcm9ncmFtbWF0aWMgPSBuZXcgU3RyaW5nW117CisgICAgICAgICAgICAiVFJBQ0UgaHR0cDovL2xvY2FsaG9zdDoiICsgdGhpcy5nZXRQb3J0KCkgKyAiL3RyYWNpbmcvcHJvZ3JhbW1hdGljIgorICAgIH07CisgICAgcHJpdmF0ZSBTdHJpbmdbXSBleHBlY3RlZEZyYWdtZW50c0Fubm90YXRlZCA9IG5ldyBTdHJpbmdbXXsKKyAgICAgICAgICAgICJUUkFDRSBodHRwOi8vbG9jYWxob3N0OiIgKyB0aGlzLmdldFBvcnQoKSArICIvdHJhY2luZy9hbm5vdGF0ZWQiCisgICAgfTsKKworICAgIHByaXZhdGUgV2ViVGFyZ2V0IHByZXBhcmVUYXJnZXQoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpOworICAgICAgICB0YXJnZXQucmVnaXN0ZXIoTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpOworICAgICAgICByZXR1cm4gdGFyZ2V0LnBhdGgocGF0aCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvZ3JhbW1hdGljQXBwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gcHJlcGFyZVRhcmdldChST09UX1BBVEhfUFJPR1JBTU1BVElDKS5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikubWV0aG9kKFRSQUNFLk5BTUUpOworCisgICAgICAgIGFzc2VydEVxdWFscyhSZXNwb25zZS5TdGF0dXMuT0suZ2V0U3RhdHVzQ29kZSgpLCByZXNwb25zZS5nZXRTdGF0dXNJbmZvKCkuZ2V0U3RhdHVzQ29kZSgpKTsKKworICAgICAgICBTdHJpbmcgcmVzcG9uc2VFbnRpdHkgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGZvciAoU3RyaW5nIGV4cGVjdGVkRnJhZ21lbnQgOiBleHBlY3RlZEZyYWdtZW50c1Byb2dyYW1tYXRpYykgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZnJhZ21lbnQgJyIgKyBleHBlY3RlZEZyYWdtZW50ICsgIicgbm90IGZvdW5kIGluIHJlc3BvbnNlOlxuIiArIHJlc3BvbnNlRW50aXR5LAorICAgICAgICAgICAgICAgICAgICAvLyB0b0xvd2VyQ2FzZSAtIGh0dHAgaGVhZGVyIGZpZWxkIG5hbWVzIGFyZSBjYXNlIGluc2Vuc2l0aXZlCisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlRW50aXR5LmNvbnRhaW5zKGV4cGVjdGVkRnJhZ21lbnQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFubm90YXRlZEFwcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHByZXBhcmVUYXJnZXQoUk9PVF9QQVRIX0FOTk9UQVRFRCkucmVxdWVzdCgidGV4dC9wbGFpbiIpLm1ldGhvZChUUkFDRS5OQU1FKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoUmVzcG9uc2UuU3RhdHVzLk9LLmdldFN0YXR1c0NvZGUoKSwgcmVzcG9uc2UuZ2V0U3RhdHVzSW5mbygpLmdldFN0YXR1c0NvZGUoKSk7CisKKyAgICAgICAgU3RyaW5nIHJlc3BvbnNlRW50aXR5ID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBmb3IgKFN0cmluZyBleHBlY3RlZEZyYWdtZW50IDogZXhwZWN0ZWRGcmFnbWVudHNBbm5vdGF0ZWQpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkIGZyYWdtZW50ICciICsgZXhwZWN0ZWRGcmFnbWVudCArICInIG5vdCBmb3VuZCBpbiByZXNwb25zZTpcbiIgKyByZXNwb25zZUVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgLy8gdG9Mb3dlckNhc2UgLSBodHRwIGhlYWRlciBmaWVsZCBuYW1lcyBhcmUgY2FzZSBpbnNlbnNpdGl2ZQorICAgICAgICAgICAgICAgICAgICByZXNwb25zZUVudGl0eS5jb250YWlucyhleHBlY3RlZEZyYWdtZW50KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFjZVdpdGhFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RUcmFjZVdpdGhFbnRpdHkoZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luY1RyYWNlV2l0aEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdFRyYWNlV2l0aEVudGl0eSh0cnVlLCBmYWxzZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhY2VXaXRoRW50aXR5QXBhY2hlQ29ubmVjdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0VHJhY2VXaXRoRW50aXR5KGZhbHNlLCB0cnVlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luY1RyYWNlV2l0aEVudGl0eUFwYWNoZUNvbm5lY3RvcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdFRyYWNlV2l0aEVudGl0eSh0cnVlLCB0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3RUcmFjZVdpdGhFbnRpdHkoZmluYWwgYm9vbGVhbiBpc0FzeW5jLCBmaW5hbCBib29sZWFuIHVzZUdyaXp6bHlDb25uZWN0b3IpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHVzZUdyaXp6bHlDb25uZWN0b3IgPyBjcmVhdGVHcml6emx5Q2xpZW50KCkudGFyZ2V0KHRhcmdldCgpLmdldFVyaSgpKSA6IHRhcmdldCgpOworICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhdGgoUk9PVF9QQVRIX0FOTk9UQVRFRCk7CisKKyAgICAgICAgICAgIGZpbmFsIEVudGl0eTxTdHJpbmc+IGVudGl0eSA9IEVudGl0eS5lbnRpdHkoInRyYWNlIiwgTWVkaWFUeXBlLldJTERDQVJEX1RZUEUpOworCisgICAgICAgICAgICBSZXNwb25zZSByZXNwb25zZTsKKyAgICAgICAgICAgIGlmICghaXNBc3luYykgeworICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5tZXRob2QoVFJBQ0UuTkFNRSwgZW50aXR5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLmFzeW5jKCkubWV0aG9kKFRSQUNFLk5BTUUsIGVudGl0eSkuZ2V0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZhaWwoIkEgVFJBQ0UgcmVxdWVzdCBNVVNUIE5PVCBpbmNsdWRlIGFuIGVudGl0eS4gKHJlc3BvbnNlPSIgKyByZXNwb25zZSArICIpIik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBPSworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBDbGllbnQgY3JlYXRlR3JpenpseUNsaWVudCgpIHsKKyAgICAgICAgcmV0dXJuIENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KG5ldyBDbGllbnRDb25maWcoKS5jb25uZWN0b3JQcm92aWRlcihuZXcgR3JpenpseUNvbm5lY3RvclByb3ZpZGVyKCkpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmluZ2lmeShDb250YWluZXJSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisgICAgICAgIHByaW50UmVxdWVzdExpbmUoYnVmZmVyLCByZXF1ZXN0KTsKKyAgICAgICAgcHJpbnRQcmVmaXhlZEhlYWRlcnMoYnVmZmVyLCByZXF1ZXN0LmdldEhlYWRlcnMoKSk7CisKKyAgICAgICAgaWYgKHJlcXVlc3QuaGFzRW50aXR5KCkpIHsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQocmVxdWVzdC5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50UmVxdWVzdExpbmUoU3RyaW5nQnVpbGRlciBidWZmZXIsIENvbnRhaW5lclJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICBidWZmZXIuYXBwZW5kKHJlcXVlc3QuZ2V0TWV0aG9kKCkpLmFwcGVuZCgiICIpLmFwcGVuZChyZXF1ZXN0LmdldFVyaUluZm8oKS5nZXRSZXF1ZXN0VXJpKCkudG9BU0NJSVN0cmluZygpKS5hcHBlbmQoIlxuIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludFByZWZpeGVkSGVhZGVycyhTdHJpbmdCdWlsZGVyIGJ1ZmZlciwgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBoZWFkZXJzKSB7CisgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTGlzdDxTdHJpbmc+PiBlIDogaGVhZGVycy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBMaXN0PFN0cmluZz4gdmFsID0gZS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgU3RyaW5nIGhlYWRlciA9IGUuZ2V0S2V5KCk7CisKKyAgICAgICAgICAgIGlmICh2YWwuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGhlYWRlcikuYXBwZW5kKCI6ICIpLmFwcGVuZCh2YWwuZ2V0KDApKS5hcHBlbmQoIlxuIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gYWRkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgcyA6IHZhbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYWRkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJywnKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhZGQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQocyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoaGVhZGVyKS5hcHBlbmQoIjogIikuYXBwZW5kKHNiLnRvU3RyaW5nKCkpLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvZ3JpenpseS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9ncml6emx5L2Nvbm5lY3Rvci9VbmRlcmx5aW5nSHR0cENsaWVudEFjY2Vzc1Rlc3QuamF2YSBiL2Nvbm5lY3RvcnMvZ3JpenpseS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9ncml6emx5L2Nvbm5lY3Rvci9VbmRlcmx5aW5nSHR0cENsaWVudEFjY2Vzc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzU2NjMwCi0tLSAvZGV2L251bGwKKysrIGIvY29ubmVjdG9ycy9ncml6emx5LWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2dyaXp6bHkvY29ubmVjdG9yL1VuZGVybHlpbmdIdHRwQ2xpZW50QWNjZXNzVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseS5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRTYW1lOworCitpbXBvcnQgY29tLm5pbmcuaHR0cC5jbGllbnQuQXN5bmNIdHRwQ2xpZW50OworCisvKioKKyAqIFRlc3Qgb2YgYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIEhUVFAgY2xpZW50IGluc3RhbmNlIHVzZWQgYnkgdGhlIGNvbm5lY3Rvci4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgVW5kZXJseWluZ0h0dHBDbGllbnRBY2Nlc3NUZXN0IHsKKworICAgIC8qKgorICAgICAqIFZlcmlmaWVyIG9mIEpFUlNFWS0yNDI0IGZpeC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIdHRwQ2xpZW50SW5zdGFuY2VBY2Nlc3MoKSB7CisgICAgICAgIGZpbmFsIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudChuZXcgQ2xpZW50Q29uZmlnKCkuY29ubmVjdG9yUHJvdmlkZXIobmV3IEdyaXp6bHlDb25uZWN0b3JQcm92aWRlcigpKSk7CisgICAgICAgIGZpbmFsIEFzeW5jSHR0cENsaWVudCBoY09uQ2xpZW50ID0gR3JpenpseUNvbm5lY3RvclByb3ZpZGVyLmdldEh0dHBDbGllbnQoY2xpZW50KTsKKyAgICAgICAgLy8gaW1wb3J0YW50OiB0aGUgd2ViIHRhcmdldCBpbnN0YW5jZSBpbiB0aGlzIHRlc3QgbXVzdCBiZSBvbmx5IGNyZWF0ZWQgQUZURVIgdGhlIGNsaWVudCBoYXMgYmVlbiBwcmUtaW5pdGlhbGl6ZWQKKyAgICAgICAgLy8gKHNlZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuSW5pdGlhbGl6YWJsZS5wcmVJbml0aWFsaXplIG1ldGhvZCkuIFRoaXMgaXMgaGVyZSBhY2hpZXZlZCBieSBjYWxsaW5nIHRoZQorICAgICAgICAvLyBjb25uZWN0b3IgcHJvdmlkZXIncyBzdGF0aWMgZ2V0SHR0cENsaWVudCBtZXRob2QgYWJvdmUuCisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSBjbGllbnQudGFyZ2V0KCJodHRwOi8vbG9jYWxob3N0LyIpOworICAgICAgICBmaW5hbCBBc3luY0h0dHBDbGllbnQgaGNPblRhcmdldCA9IEdyaXp6bHlDb25uZWN0b3JQcm92aWRlci5nZXRIdHRwQ2xpZW50KHRhcmdldCk7CisKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiSFRUUCBjbGllbnQgaW5zdGFuY2Ugc2V0IG9uIEplcnNleUNsaWVudCBzaG91bGQgbm90IGJlIG51bGwuIiwgaGNPbkNsaWVudCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIkhUVFAgY2xpZW50IGluc3RhbmNlIHNldCBvbiBKZXJzZXlXZWJUYXJnZXQgc2hvdWxkIG5vdCBiZSBudWxsLiIsIGhjT25UYXJnZXQpOworICAgICAgICBhc3NlcnRTYW1lKCJIVFRQIGNsaWVudCBpbnN0YW5jZSBzZXQgb24gSmVyc2V5Q2xpZW50IHNob3VsZCBiZSB0aGUgc2FtZSBpbnN0YW5jZSBhcyB0aGUgb25lIHNldCBvbiBKZXJzZXlXZWJUYXJnZXQiCisgICAgICAgICAgICAgICAgICAgICAgICArICIocHJvdmlkZWQgdGhlIHRhcmdldCBpbnN0YW5jZSBoYXMgbm90IGJlZW4gZnVydGhlciBjb25maWd1cmVkKS4iLAorICAgICAgICAgICAgICAgIGhjT25DbGllbnQsIGhjT25UYXJnZXQKKyAgICAgICAgKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2pkay1jb25uZWN0b3IvcG9tLnhtbCBiL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMTYwNjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL2pkay1jb25uZWN0b3IvcG9tLnhtbApAQCAtMCwwICsxLDc5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb25uZWN0b3JzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LWpkay1jb25uZWN0b3I8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktY29ubmVjdG9ycy1qZGs8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+SmVyc2V5IENsaWVudCBUcmFuc3BvcnQgdmlhIEpESyBjb25uZWN0b3I8L2Rlc2NyaXB0aW9uPgorCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxwcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPlVURi04PC9wcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPgorICAgIDwvcHJvcGVydGllcz4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItZ3JpenpseTItaHR0cDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWdyaXp6bHkyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLmlzdGFjazwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1pc3RhY2stY29tbW9ucy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YnVpbGQtaGVscGVyLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZmVsaXg8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYnVuZGxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9KZGtDb25uZWN0b3JQcm9wZXJ0aWVzLmphdmEgYi9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL0pka0Nvbm5lY3RvclByb3BlcnRpZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTYwMmQwCi0tLSAvZGV2L251bGwKKysrIGIvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9KZGtDb25uZWN0b3JQcm9wZXJ0aWVzLmphdmEKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamRrLmNvbm5lY3RvcjsKKworaW1wb3J0IGphdmEubmV0LkNvb2tpZVBvbGljeTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5Qcm9wZXJ0aWVzQ2xhc3M7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5Qcm9wZXJ0aWVzSGVscGVyOworCisvKioKKyAqIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBzcGVjaWZpYyB0byB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamRrLmNvbm5lY3Rvci5pbnRlcm5hbC5KZGtDb25uZWN0b3J9LgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworQFByb3BlcnRpZXNDbGFzcworcHVibGljIGZpbmFsIGNsYXNzIEpka0Nvbm5lY3RvclByb3BlcnRpZXMgeworCisgICAgLyoqCisgICAgICogQ29uZmlndXJhdGlvbiBvZiB0aGUgY29ubmVjdG9yIHRocmVhZCBwb29sLgorICAgICAqIDxwLz4KKyAgICAgKiBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamRrLmNvbm5lY3Rvci5pbnRlcm5hbC5UaHJlYWRQb29sQ29uZmlnfSBpcyBleHBlY3RlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBXT1JLRVJfVEhSRUFEX1BPT0xfQ09ORklHID0gImplcnNleS5jb25maWcuY2xpZW50Lkpka0Nvbm5lY3RvclByb3ZpZGVyLndvcmtlclRocmVhZFBvb2xDb25maWciOworCisgICAgLyoqCisgICAgICogQ29udGFpbmVyIGlkbGUgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgKHtAbGluayBJbnRlZ2VyfSB2YWx1ZSkuCisgICAgICogPHAvPgorICAgICAqIFdoZW4gdGhlIHRpbWVvdXQgZWxhcHNlcywgdGhlIHNoYXJlZCB0aHJlYWQgcG9vbCB3aWxsIGJlIGRlc3Ryb3llZC4KKyAgICAgKiA8cC8+CisgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMge0B2YWx1ZSAjREVGQVVMVF9DT05ORUNUSU9OX0NMT1NFX1dBSVR9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEFJTkVSX0lETEVfVElNRU9VVCA9ICJqZXJzZXkuY29uZmlnLmNsaWVudC5KZGtDb25uZWN0b3JQcm92aWRlci5jb250YWluZXJJZGxlVGltZW91dCI7CisKKyAgICAvKioKKyAgICAgKiBBIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0eSBvZiBIVFRQIHBhcnNlci4gSXQgZGVmaW5lcyB0aGUgbWF4aW1hbCBhY2NlcHRhYmxlIHNpemUgb2YgSFRUUCByZXNwb25zZSBpbml0aWFsIGxpbmUsCisgICAgICogZWFjaCBoZWFkZXIgYW5kIGNodW5rIGhlYWRlci4KKyAgICAgKiA8cC8+CisgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMge0B2YWx1ZSAjREVGQVVMVF9NQVhfSEVBREVSX1NJWkV9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFYX0hFQURFUl9TSVpFID0gImplcnNleS5jb25maWcuY2xpZW50Lkpka0Nvbm5lY3RvclByb3ZpZGVyLm1heEhlYWRlclNpemUiOworCisgICAgLyoqCisgICAgICogVGhlIG1heGltYWwgbnVtYmVyIG9mIHJlZGlyZWN0cyBkdXJpbmcgc2luZ2xlIHJlcXVlc3QuCisgICAgICogPHAvPgorICAgICAqIFZhbHVlIGlzIGV4cGVjdGVkIHRvIGJlIHBvc2l0aXZlIHtAbGluayBJbnRlZ2VyfS4gRGVmYXVsdCB2YWx1ZSBpcyB7QHZhbHVlICNERUZBVUxUX01BWF9SRURJUkVDVFN9LgorICAgICAqIDxwLz4KKyAgICAgKiBIVFRQIHJlZGlyZWN0aW9uIG11c3QgYmUgZW5hYmxlZCBieSBwcm9wZXJ0eSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXMjRk9MTE9XX1JFRElSRUNUU30sCisgICAgICogb3RoZXJ3aXNlIHtAY29kZSBNQVhfSEVBREVSX1NJWkV9IGlzIG5vdCBhcHBsaWVkLgorICAgICAqCisgICAgICogQHNlZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllcyNGT0xMT1dfUkVESVJFQ1RTCisgICAgICogQHNlZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZGsuY29ubmVjdG9yLmludGVybmFsLlJlZGlyZWN0RXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFYX1JFRElSRUNUUyA9ICJqZXJzZXkuY29uZmlnLmNsaWVudC5KZGtDb25uZWN0b3JQcm92aWRlci5tYXhSZWRpcmVjdHMiOworCisgICAgLyoqCisgICAgICogVG8gc2V0IHRoZSBjb29raWUgcG9saWN5IG9mIHRoaXMgY29va2llIG1hbmFnZXIuCisgICAgICogPHAvPgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIEFDQ0VQVF9PUklHSU5BTF9TRVJWRVIuCisgICAgICoKKyAgICAgKiBAc2VlIGphdmEubmV0LkNvb2tpZU1hbmFnZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT09LSUVfUE9MSUNZID0gImplcnNleS5jb25maWcuY2xpZW50Lkpka0Nvbm5lY3RvclByb3ZpZGVyLmNvb2tpZVBvbGljeSI7CisKKyAgICAvKioKKyAgICAgKiBBIG1heGltYWwgbnVtYmVyIG9mIG9wZW4gY29ubmVjdGlvbiB0byBlYWNoIGRlc3RpbmF0aW9uLiBBIGRlc3RpbmF0aW9uIGlzIGRldGVybWluZWQgYnkgdGhlIGZvbGxvd2luZyB0cmlwbGU6CisgICAgICogPHVsPgorICAgICAqIDxsaT5ob3N0PC9saT4KKyAgICAgKiA8bGk+cG9ydDwvbGk+CisgICAgICogPGxpPnByb3RvY29sIChIVFRQL0hUVFBTKTwvbGk+CisgICAgICogPHVsLz4KKyAgICAgKiA8cC8+CisgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMge0B2YWx1ZSAjREVGQVVMVF9NQVhfQ09OTkVDVElPTlNfUEVSX0RFU1RJTkFUSU9OfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1BWF9DT05ORUNUSU9OU19QRVJfREVTVElOQVRJT04gPSAiamVyc2V5LmNvbmZpZy5jbGllbnQuSmRrQ29ubmVjdG9yUHJvdmlkZXIiCisgICAgICAgICAgICArICIubWF4Q29ubmVjdGlvbnNQZXJEZXN0aW5hdGlvbiI7CisKKyAgICAvKioKKyAgICAgKiBBbiBhbW91bnQgb2YgdGltZSBpbiBtaWxsaXNlY29uZHMgKHtAbGluayBJbnRlZ2VyfSB2YWx1ZSkgZHVyaW5nIHdoaWNoIGFuIGlkbGUgY29ubmVjdGlvbiB3aWxsIGJlIGtlcHQgb3Blbi4KKyAgICAgKiA8cC8+CisgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMge0B2YWx1ZSAjREVGQVVMVF9DT05ORUNUSU9OX0lETEVfVElNRU9VVH0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUSU9OX0lETEVfVElNRU9VVCA9ICJqZXJzZXkuY29uZmlnLmNsaWVudC5KZGtDb25uZWN0b3JQcm92aWRlci5jb25uZWN0aW9uSWRsZVRpbWVvdXQiOworCisgICAgLyoqCisgICAgICogRGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllcyNDSFVOS0VEX0VOQ09ESU5HX1NJWkV9IHByb3BlcnR5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfSFRUUF9DSFVOS19TSVpFID0gNDA5NjsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgdmFsdWUgZm9yIHRoZSB7QGxpbmsgI01BWF9IRUFERVJfU0laRX0gcHJvcGVydHkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9NQVhfSEVBREVSX1NJWkUgPSA4MTkyOworCisgICAgLyoqCisgICAgICogRGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHtAbGluayAjTUFYX1JFRElSRUNUU30gcHJvcGVydHkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9NQVhfUkVESVJFQ1RTID0gNTsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgdmFsdWUgZm9yIHRoZSB7QGxpbmsgI0NPT0tJRV9QT0xJQ1l9IHByb3BlcnR5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29va2llUG9saWN5IERFRkFVTFRfQ09PS0lFX1BPTElDWSA9IENvb2tpZVBvbGljeS5BQ0NFUFRfT1JJR0lOQUxfU0VSVkVSOworCisgICAgLyoqCisgICAgICogRGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHtAbGluayAjTUFYX0NPTk5FQ1RJT05TX1BFUl9ERVNUSU5BVElPTn0gcHJvcGVydHkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9NQVhfQ09OTkVDVElPTlNfUEVSX0RFU1RJTkFUSU9OID0gMjA7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IHZhbHVlIGZvciB0aGUge0BsaW5rICNDT05ORUNUSU9OX0lETEVfVElNRU9VVH0gcHJvcGVydHkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9DT05ORUNUSU9OX0lETEVfVElNRU9VVCA9IDEwMDAwMDA7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IHZhbHVlIGZvciB0aGUge0BsaW5rICNDT05UQUlORVJfSURMRV9USU1FT1VUfSBwcm9wZXJ0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0NPTk5FQ1RJT05fQ0xPU0VfV0FJVCA9IDMwXzAwMDsKKworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFQgZ2V0VmFsdWUoZmluYWwgTWFwPFN0cmluZywgPz4gcHJvcGVydGllcywgZmluYWwgU3RyaW5nIGtleSwgZmluYWwgQ2xhc3M8VD4gdHlwZSkgeworICAgICAgICByZXR1cm4gUHJvcGVydGllc0hlbHBlci5nZXRWYWx1ZShwcm9wZXJ0aWVzLCBrZXksIHR5cGUsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFQgZ2V0VmFsdWUoZmluYWwgTWFwPFN0cmluZywgPz4gcHJvcGVydGllcywgZmluYWwgU3RyaW5nIGtleSwgVCBkZWZhdWx0VmFsdWUsIGZpbmFsIENsYXNzPFQ+IHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIFByb3BlcnRpZXNIZWxwZXIuZ2V0VmFsdWUocHJvcGVydGllcywga2V5LCBkZWZhdWx0VmFsdWUsIHR5cGUsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByZXZlbnRzIGluc3RhbnRpYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBKZGtDb25uZWN0b3JQcm9wZXJ0aWVzKCkgeworICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIk5vIGluc3RhbmNlcyBhbGxvd2VkLiIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvSmRrQ29ubmVjdG9yUHJvdmlkZXIuamF2YSBiL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvSmRrQ29ubmVjdG9yUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjA1MDA4Ci0tLSAvZGV2L251bGwKKysrIGIvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9KZGtDb25uZWN0b3JQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamRrLmNvbm5lY3RvcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnNwaS5Db25uZWN0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnNwaS5Db25uZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZGsuY29ubmVjdG9yLmludGVybmFsLkpka0Nvbm5lY3RvcjsKKworLyoqCisgKiBAYXV0aG9yIFBldHIgSmFub3VjaCAocGV0ci5qYW5vdWNoIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBKZGtDb25uZWN0b3JQcm92aWRlciBpbXBsZW1lbnRzIENvbm5lY3RvclByb3ZpZGVyIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29ubmVjdG9yIGdldENvbm5lY3RvcihDbGllbnQgY2xpZW50LCBDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICByZXR1cm4gbmV3IEpka0Nvbm5lY3RvcihjbGllbnQsIGNvbmZpZyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9Bc3luY2hyb25vdXNCb2R5SW5wdXRTdHJlYW0uamF2YSBiL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvQXN5bmNocm9ub3VzQm9keUlucHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM2YWM1MgotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvQXN5bmNocm9ub3VzQm9keUlucHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSw0MjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamRrLmNvbm5lY3Rvci5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuRGVxdWU7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLkJ5dGVCdWZmZXJJbnB1dFN0cmVhbTsKKworLyoqCisgKiBUT0RPIFNvbWUgb2YgdGhlIG9wZXJhdGlvbnMgYWRkZWQgZm9yIGFzeW5jLiBzdXBwb3J0IChlLmcuKSBjYW4gYmUgYWxzbyBzdXBwb3J0ZWQgaW4gc3luYy4gbW9kZQorICogPHAvPgorICogQm9keSBzdHJlYW0gdGhhdCBjYW4gb3BlcmF0ZSBlaXRoZXIgc3luY2hyb25vdXNseSBvciBhc3luY2hyb25vdXNseS4gU2VlIHtAbGluayBCb2R5SW5wdXRTdHJlYW19IGZvciBkZXRhaWxzLgorICoKKyAqIEBhdXRob3IgUGV0ciBKYW5vdWNoIChwZXRyLmphbm91Y2ggYXQgb3JhY2xlLmNvbSkKKyAqLworY2xhc3MgQXN5bmNocm9ub3VzQm9keUlucHV0U3RyZWFtIGV4dGVuZHMgQm9keUlucHV0U3RyZWFtIHsKKworICAgIC8vIG1hcmtlciBvZiB0aGUgZW5kIG9mIGRhdGEgc3RyZWFtCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQnl0ZUJ1ZmZlciBFT0YgPSBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbXSB7fSk7CisgICAgLy8gbWFya2VyIG9mIGFuIGVycm9yIGluIHRoZSBkYXRhIHN0cmVhbQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJ5dGVCdWZmZXIgRVJST1IgPSBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbXSB7fSk7CisKKyAgICAvLyBtb2RlIHRoaXMgc3RyZWFtIG9wZXJhdGVzIGluCisgICAgcHJpdmF0ZSBNb2RlIG1vZGUgPSBNb2RlLlVOREVDSURFRDsKKyAgICBwcml2YXRlIFJlYWRMaXN0ZW5lciByZWFkTGlzdGVuZXIgPSBudWxsOworICAgIC8vIHJlYWQgbGlzdGVuZXIgaXMgbm90IGNhbGxlZCBhbHdheXMgd2hlbiBkYXRhIGJlY29tZSBhdmFpbGFibGUKKyAgICAvLyBpdCBtdXN0IGJlIGNhbGxlZCBmb3IgdGhlIGZpcnN0IHRpbWUgb3IgYWZ0ZXIgaXNSZWFkeSByZXR1cm5lZCBmYWxzZQorICAgIHByaXZhdGUgYm9vbGVhbiBjYWxsUmVhZExpc3RlbmVyID0gZmFsc2U7CisgICAgLy8gZXhjZXB0aW9uIHN0b3JlZCB1bnRpbCB3ZSBjb21lIHRvIEVSUk9SIG1hcmtlciBpbiB0aGUgaW5wdXQgc3RyZWFtCisgICAgcHJpdmF0ZSBUaHJvd2FibGUgdCA9IG51bGw7CisgICAgLy8gbWFya2VyIHRoYXQgdGhlIHN0cmVhbSBkb2VzIG5vdCBhZG1pdCBtb3JlIGRhdGEvZXJyb3JzL3N0cmVhbS1lbmQgbm90aWZpY2F0aW9ucworICAgIHByaXZhdGUgYm9vbGVhbiBjbG9zZWRGb3JJbnB1dCA9IGZhbHNlOworICAgIC8vIGJ5IGRlZmF1bHQgcmVhZExpc3RlbmVyIGlzIGludm9rZWQgb24gSU8vd29ya2VyIHRocmVhZHMKKyAgICAvLyB0aGlzIG1pZ2h0IGRlYWRsb2NrIHRoZSBlbnRpcmUgY29ubmVjdG9yIGlmIGEgYmxvY2tpbmcgb3BlcmF0aW9ucyBhcmUgdXNlZCBpbnNpZGUgdGhlIGxpc3RlbmVyIGltcGxlbWVudGF0aW9ucworICAgIC8vIHRoZSByZWFkTGlzdGVuZXIgd2lsbCBiZSBpbnZva2VkIHVzaW5nIHRoaXMgZXhlY3V0b3IgaWYgcHJlc2VudAorICAgIHByaXZhdGUgRXhlY3V0b3JTZXJ2aWNlIGxpc3RlbmVyRXhlY3V0b3IgPSBudWxsOworICAgIC8vIGEgbGlzdGVuZXIgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBjb25uZWN0b3IKKyAgICBwcml2YXRlIFN0YXRlQ2hhbmdlTGlzdGVyIHN0YXRlQ2hhbmdlTGlzdGVyOworCisgICAgLy8gaWYgaW4gc3luY2hyb25vdXMgbW9kZSwgdGhpcyBzdHJlYW0gZGVsZWdhdGVzIHRvIHN5bmNocm9ub3VzU3RyZWFtCisgICAgcHJpdmF0ZSBCeXRlQnVmZmVySW5wdXRTdHJlYW0gc3luY2hyb25vdXNTdHJlYW0gPSBudWxsOworICAgIC8vIGRhdGEgdG8gYmUgcmVhZAorICAgIHByaXZhdGUgRGVxdWU8Qnl0ZUJ1ZmZlcj4gZGF0YSA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKworICAgIHN5bmNocm9uaXplZCB2b2lkIHNldExpc3RlbmVyRXhlY3V0b3IoRXhlY3V0b3JTZXJ2aWNlIGxpc3RlbmVyRXhlY3V0b3IpIHsKKyAgICAgICAgYXNzZXJ0QXN5bmNocm9ub3VzT3BlcmF0aW9uKCk7CisgICAgICAgIHRoaXMubGlzdGVuZXJFeGVjdXRvciA9IGxpc3RlbmVyRXhlY3V0b3I7CisgICAgICAgIGNvbW1pdFRvTW9kZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc1JlYWR5KCkgeworICAgICAgICBhc3NlcnRBc3luY2hyb25vdXNPcGVyYXRpb24oKTsKKworICAgICAgICAvLyByZXR1cm4gZmFsc2UgaWYgdGhpcyBzdHJlYW0gaGFzIG5vdCBiZWVuIGluaXRpYWxpc2VkCisgICAgICAgIGlmIChtb2RlID09IE1vZGUuVU5ERUNJREVEKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBCeXRlQnVmZmVyIGhlYWRCdWZmZXIgPSBkYXRhLnBlZWsoKTsKKyAgICAgICAgYm9vbGVhbiByZWFkeSA9IHRydWU7CisKKyAgICAgICAgaWYgKGhlYWRCdWZmZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmVhZHkgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChoZWFkQnVmZmVyID09IEVSUk9SKSB7CisgICAgICAgICAgICByZWFkeSA9IGZhbHNlOworICAgICAgICAgICAgY2FsbE9uRXJyb3IodCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaGVhZEJ1ZmZlciA9PSBFT0YpIHsKKyAgICAgICAgICAgIHJlYWR5ID0gZmFsc2U7CisgICAgICAgICAgICBjYWxsT25BbGxEYXRhUmVhZCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFyZWFkeSkgeworICAgICAgICAgICAgLy8gcmV0dXJuaW5nIGZhbHNlIGF1dG9tYXRpY2FsbHkgZW5hYmxlcyBsaXN0ZW5lcgorICAgICAgICAgICAgY2FsbFJlYWRMaXN0ZW5lciA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVhZHk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFJlYWRMaXN0ZW5lcihSZWFkTGlzdGVuZXIgcmVhZExpc3RlbmVyKSB7CisgICAgICAgIGlmICh0aGlzLnJlYWRMaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlJFQURfTElTVEVORVJfU0VUX09OTFlfT05DRSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBhcmUgbm90IGFscmVhZHkgaW4gc3luY2hyb25vdXMgbW9kZQorICAgICAgICBhc3NlcnRBc3luY2hyb25vdXNPcGVyYXRpb24oKTsKKworICAgICAgICB0aGlzLnJlYWRMaXN0ZW5lciA9IHJlYWRMaXN0ZW5lcjsKKyAgICAgICAgY29tbWl0VG9Nb2RlKCk7CisKKyAgICAgICAgLy8gaWYgdGhlcmUgaXMgYW4gZXJyb3Igb3IgRU9GIGF0IHRoZSBoZWFkIG9mIHRoZSBkYXRhIHF1ZXVlLCBpc1JlYWR5IHdpbGwgaGFuZGxlIGl0CisgICAgICAgIGlmIChpc1JlYWR5KCkpIHsKKyAgICAgICAgICAgIGNhbGxEYXRhQXZhaWxhYmxlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjb21taXRUb01vZGUoKTsKKworICAgICAgICBpZiAobW9kZSA9PSBNb2RlLlNZTkNIUk9OT1VTKSB7CisgICAgICAgICAgICByZXR1cm4gc3luY2hyb25vdXNTdHJlYW0ucmVhZCgpOworICAgICAgICB9CisKKyAgICAgICAgdmFsaWRhdGVTdGF0ZSgpOworICAgICAgICByZXR1cm4gZG9SZWFkKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjb21taXRUb01vZGUoKTsKKyAgICAgICAgaWYgKG1vZGUgPT0gTW9kZS5TWU5DSFJPTk9VUykgeworICAgICAgICAgICAgcmV0dXJuIHN5bmNocm9ub3VzU3RyZWFtLnJlYWQoYiwgb2ZmLCBsZW4pOworICAgICAgICB9CisKKyAgICAgICAgLy8gc29tZSB2YWxpZGF0aW9uIGJvcnJvd2VkIGZyb20gSW5wdXRTdHJlYW0KKyAgICAgICAgaWYgKGIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgICAgIH0gZWxzZSBpZiAob2ZmIDwgMCB8fCBsZW4gPCAwIHx8IGxlbiA+IGIubGVuZ3RoIC0gb2ZmKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICB9IGVsc2UgaWYgKGxlbiA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIHZhbGlkYXRlU3RhdGUoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIWhhc0RhdGFUb1JlYWQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBiW29mZiArIGldID0gZG9SZWFkKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiB3ZSBhcmUgaGVyZSB3ZSB3ZXJlIGFibGUgdG8gZmlsbCB0aGUgZW50aXJlIGJ1ZmZlcgorICAgICAgICByZXR1cm4gbGVuOworICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIGJ5dGUgZG9SZWFkKCkgeworICAgICAgICAvLyBpZiB3ZSBhcmUgaGVyZSB3ZSBwYXNzZWQgYWxsIHRoZSB2YWxpZGF0aW9uLCBzbyB0aGVyZSBtdXN0IGJlIHNvbWV0aGluZyB0byByZWFkCisgICAgICAgIEJ5dGVCdWZmZXIgaGVhZEJ1ZmZlciA9IGRhdGEucGVlaygpOworICAgICAgICBieXRlIGIgPSBoZWFkQnVmZmVyLmdldCgpOworCisgICAgICAgIGlmICghaGVhZEJ1ZmZlci5oYXNSZW1haW5pbmcoKSkgeworICAgICAgICAgICAgLy8gcmVtb3ZlIGVtcHR5IGJ1ZmZlcgorICAgICAgICAgICAgZGF0YS5wb2xsKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGF2YWlsYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNvbW1pdFRvTW9kZSgpOworICAgICAgICAvLyBUT0RPIHRoaXMgY291bGQgYmUgYWxzbyBzdXBwb3J0ZWQgaW4gYXN5bmMgbW9kZQorICAgICAgICBhc3NlcnRTeW5jaHJvbm91c09wZXJhdGlvbigpOworICAgICAgICByZXR1cm4gc3luY2hyb25vdXNTdHJlYW0uYXZhaWxhYmxlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgc2tpcChsb25nIG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNvbW1pdFRvTW9kZSgpOworICAgICAgICAvLyBUT0RPIHRoaXMgY291bGQgYmUgYWxzbyBzdXBwb3J0ZWQgaW4gYXN5bmMgbW9kZQorICAgICAgICBhc3NlcnRTeW5jaHJvbm91c09wZXJhdGlvbigpOworICAgICAgICByZXR1cm4gc3luY2hyb25vdXNTdHJlYW0uc2tpcChuKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHRyeVJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjb21taXRUb01vZGUoKTsKKyAgICAgICAgYXNzZXJ0U3luY2hyb25vdXNPcGVyYXRpb24oKTsKKyAgICAgICAgcmV0dXJuIHN5bmNocm9ub3VzU3RyZWFtLnRyeVJlYWQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHRyeVJlYWQoYnl0ZVtdIGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNvbW1pdFRvTW9kZSgpOworICAgICAgICBhc3NlcnRTeW5jaHJvbm91c09wZXJhdGlvbigpOworICAgICAgICByZXR1cm4gc3luY2hyb25vdXNTdHJlYW0udHJ5UmVhZChiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHRyeVJlYWQoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNvbW1pdFRvTW9kZSgpOworICAgICAgICBhc3NlcnRTeW5jaHJvbm91c09wZXJhdGlvbigpOworICAgICAgICByZXR1cm4gc3luY2hyb25vdXNTdHJlYW0udHJ5UmVhZChiLCBvZmYsIGxlbik7CisgICAgfQorCisgICAgc3luY2hyb25pemVkIHZvaWQgbm90aWZ5RGF0YUF2YWlsYWJsZShCeXRlQnVmZmVyIGF2YWlsYWJsZURhdGEpIHsKKyAgICAgICAgYXNzZXJ0Q2xvc2VkRm9ySW5wdXQoKTsKKworICAgICAgICBpZiAoIWF2YWlsYWJsZURhdGEuaGFzUmVtYWluaW5nKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtb2RlID09IE1vZGUuU1lOQ0hST05PVVMpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25vdXNTdHJlYW0ucHV0KGF2YWlsYWJsZURhdGEpOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHN5bmNocm9ub3VzU3RyZWFtLmNsb3NlUXVldWUoZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBkYXRhLmFkZChhdmFpbGFibGVEYXRhKTsKKworICAgICAgICBpZiAocmVhZExpc3RlbmVyICE9IG51bGwgJiYgY2FsbFJlYWRMaXN0ZW5lcikgeworICAgICAgICAgICAgY2FsbERhdGFBdmFpbGFibGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG1vZGUgPT0gTW9kZS5TWU5DSFJPTk9VUykgeworICAgICAgICAgICAgc3luY2hyb25vdXNTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN5bmNocm9uaXplZCB2b2lkIG5vdGlmeUVycm9yKFRocm93YWJsZSB0KSB7CisgICAgICAgIGFzc2VydENsb3NlZEZvcklucHV0KCk7CisKKyAgICAgICAgaWYgKHN0YXRlQ2hhbmdlTGlzdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN0YXRlQ2hhbmdlTGlzdGVyLm9uRXJyb3IodCk7CisgICAgICAgIH0KKworICAgICAgICBjbG9zZWRGb3JJbnB1dCA9IHRydWU7CisKKyAgICAgICAgaWYgKG1vZGUgPT0gTW9kZS5TWU5DSFJPTk9VUykgeworICAgICAgICAgICAgc3luY2hyb25vdXNTdHJlYW0uY2xvc2VRdWV1ZSh0KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHdlIHN0b3JlIHRoZSBlcnJvciBhbmQgcHV0IGEgbWFya2VyIGluIHRoZSBzdHJlYW0sIHNvIHRoYXQgdGhlIHVzZXIgY2FuIHJlYWQgYWxsIGRhdGEgdGhhdAorICAgICAgICAvLyB3ZXJlIHN1Y2Nlc3NmdWxseSByZWNlaXZlZCB1cCB0byB0aGUgZXJyb3IuCisgICAgICAgIHRoaXMudCA9IHQ7CisgICAgICAgIGRhdGEuYWRkKEVSUk9SKTsKKworICAgICAgICBpZiAobW9kZSA9PSBNb2RlLkFTWU5DSFJPTk9VUyAmJiBjYWxsUmVhZExpc3RlbmVyKSB7CisgICAgICAgICAgICBjYWxsT25FcnJvcih0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN5bmNocm9uaXplZCB2b2lkIG5vdGlmeUFsbERhdGFSZWFkKCkgeworICAgICAgICBhc3NlcnRDbG9zZWRGb3JJbnB1dCgpOworCisgICAgICAgIGlmIChzdGF0ZUNoYW5nZUxpc3RlciAhPSBudWxsKSB7CisgICAgICAgICAgICBzdGF0ZUNoYW5nZUxpc3Rlci5vbkFsbERhdGFSZWFkKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobW9kZSA9PSBNb2RlLlNZTkNIUk9OT1VTKSB7CisgICAgICAgICAgICBzeW5jaHJvbm91c1N0cmVhbS5jbG9zZVF1ZXVlKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBkYXRhLmFkZChFT0YpOworCisgICAgICAgIGlmIChtb2RlID09IE1vZGUuQVNZTkNIUk9OT1VTICYmIGNhbGxSZWFkTGlzdGVuZXIpIHsKKyAgICAgICAgICAgIGNhbGxPbkFsbERhdGFSZWFkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGNvbW1pdFRvTW9kZSgpIHsKKyAgICAgICAgLy8gcmV0dXJuIGlmIHRoZSBtb2RlIGhhcyBhbHJlYWR5IGJlZW4gY29tbWl0dGVkCisgICAgICAgIGlmIChtb2RlICE9IE1vZGUuVU5ERUNJREVEKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBnbyBhc3luY2hyb25vdXMsIGlmIHRoZSB1c2VyIGhhcyBtYWRlIGFueSBtb3ZlIHN1Z2dlc3RpbmcgYXN5bmNocm9ub3VzIG1vZGUKKyAgICAgICAgaWYgKHJlYWRMaXN0ZW5lciAhPSBudWxsIHx8IGxpc3RlbmVyRXhlY3V0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgbW9kZSA9IE1vZGUuQVNZTkNIUk9OT1VTOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gZ28gc3luY2hyb25vdXMsIGlmIHRoZSB1c2VyIGhhcyBub3QgbWFkZSBhbnkgbW92ZSBzdWdnZXN0aW5nIGFzeW5jaHJvbm91cyBtb2RlCisgICAgICAgIG1vZGUgPSBNb2RlLlNZTkNIUk9OT1VTOworICAgICAgICBzeW5jaHJvbm91c1N0cmVhbSA9IG5ldyBCeXRlQnVmZmVySW5wdXRTdHJlYW0oKTsKKyAgICAgICAgLy8gbW92ZSBhbGwgYnVmZmVyZWQgZGF0YSB0byBzeW5jaHJvbm91cyBzdHJlYW0KKyAgICAgICAgZm9yIChCeXRlQnVmZmVyIGIgOiBkYXRhKSB7CisgICAgICAgICAgICBpZiAoYiA9PSBFT0YpIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbm91c1N0cmVhbS5jbG9zZVF1ZXVlKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGIgPT0gRVJST1IpIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbm91c1N0cmVhbS5jbG9zZVF1ZXVlKHQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbm91c1N0cmVhbS5wdXQoYik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbm91c1N0cmVhbS5jbG9zZVF1ZXVlKGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRBc3luY2hyb25vdXNPcGVyYXRpb24oKSB7CisgICAgICAgIGlmIChtb2RlID09IE1vZGUuU1lOQ0hST05PVVMpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5BU1lOQ19PUEVSQVRJT05fTk9UX1NVUFBPUlRFRCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRTeW5jaHJvbm91c09wZXJhdGlvbigpIHsKKyAgICAgICAgaWYgKG1vZGUgPT0gTW9kZS5BU1lOQ0hST05PVVMpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5TWU5DX09QRVJBVElPTl9OT1RfU1VQUE9SVEVEKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlU3RhdGUoKSB7CisgICAgICAgIGlmIChtb2RlID09IE1vZGUuQVNZTkNIUk9OT1VTICYmICFoYXNEYXRhVG9SZWFkKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuV1JJVEVfV0hFTl9OT1RfUkVBRFkoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0Q2xvc2VkRm9ySW5wdXQoKSB7CisgICAgICAgIGlmIChjbG9zZWRGb3JJbnB1dCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5TVFJFQU1fQ0xPU0VEX0ZPUl9JTlBVVCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBoYXNEYXRhVG9SZWFkKCkgeworICAgICAgICBCeXRlQnVmZmVyIGhlYWRCdWZmZXIgPSBkYXRhLnBlZWsoKTsKKyAgICAgICAgaWYgKGhlYWRCdWZmZXIgPT0gbnVsbCB8fCBoZWFkQnVmZmVyID09IEVPRiB8fCBoZWFkQnVmZmVyID09IEVSUk9SIHx8ICFoZWFkQnVmZmVyLmhhc1JlbWFpbmluZygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2FsbERhdGFBdmFpbGFibGUoKSB7CisgICAgICAgIGNhbGxSZWFkTGlzdGVuZXIgPSBmYWxzZTsKKyAgICAgICAgaWYgKGxpc3RlbmVyRXhlY3V0b3IgPT0gbnVsbCkgeworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlYWRMaXN0ZW5lci5vbkRhdGFBdmFpbGFibGUoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICByZWFkTGlzdGVuZXIub25FcnJvcihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxpc3RlbmVyRXhlY3V0b3Iuc3VibWl0KCgpIC0+IHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZWFkTGlzdGVuZXIub25EYXRhQXZhaWxhYmxlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICByZWFkTGlzdGVuZXIub25FcnJvcihlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjYWxsT25FcnJvcihmaW5hbCBUaHJvd2FibGUgdCkgeworICAgICAgICBpZiAobGlzdGVuZXJFeGVjdXRvciA9PSBudWxsKSB7CisgICAgICAgICAgICByZWFkTGlzdGVuZXIub25FcnJvcih0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxpc3RlbmVyRXhlY3V0b3Iuc3VibWl0KCgpIC0+IHJlYWRMaXN0ZW5lci5vbkVycm9yKHQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjYWxsT25BbGxEYXRhUmVhZCgpIHsKKyAgICAgICAgaWYgKGxpc3RlbmVyRXhlY3V0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZWFkTGlzdGVuZXIub25BbGxEYXRhUmVhZCgpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHJlYWRMaXN0ZW5lci5vbkVycm9yKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGlzdGVuZXJFeGVjdXRvci5zdWJtaXQoKCkgLT4geworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJlYWRMaXN0ZW5lci5vbkFsbERhdGFSZWFkKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICByZWFkTGlzdGVuZXIub25FcnJvcihlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN5bmNocm9uaXplZCB2b2lkIHNldFN0YXRlQ2hhbmdlTGlzdGVyKFN0YXRlQ2hhbmdlTGlzdGVyIHN0YXRlQ2hhbmdlTGlzdGVyKSB7CisgICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VMaXN0ZXIgPSBzdGF0ZUNoYW5nZUxpc3RlcjsKKworICAgICAgICBpZiAoIWRhdGEuaXNFbXB0eSgpICYmIGRhdGEuZ2V0TGFzdCgpID09IEVPRikgeworICAgICAgICAgICAgc3RhdGVDaGFuZ2VMaXN0ZXIub25BbGxEYXRhUmVhZCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFkYXRhLmlzRW1wdHkoKSAmJiBkYXRhLmdldExhc3QoKSA9PSBFUlJPUikgeworICAgICAgICAgICAgc3RhdGVDaGFuZ2VMaXN0ZXIub25FcnJvcih0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZW51bSBNb2RlIHsKKyAgICAgICAgU1lOQ0hST05PVVMsCisgICAgICAgIEFTWU5DSFJPTk9VUywKKyAgICAgICAgVU5ERUNJREVECisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgbGlzdGVuZXIsIHNvIHRoYXQgdGhlIGNvbm5lY3Rpb24gcG9vbCBrbm93cyB3aGVuIHRoZSBib2R5IGhhcyBiZWVuIHJlYWQsCisgICAgICogc28gaXQgY2FuIHJldXNlL2Nsb3NlIHRoZSBjb25uZWN0aW9uLgorICAgICAqLworICAgIGludGVyZmFjZSBTdGF0ZUNoYW5nZUxpc3RlciB7CisKKyAgICAgICAgdm9pZCBvbkVycm9yKFRocm93YWJsZSB0KTsKKworICAgICAgICB2b2lkIG9uQWxsRGF0YVJlYWQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL0JvZHlJbnB1dFN0cmVhbS5qYXZhIGIvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9Cb2R5SW5wdXRTdHJlYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzc5NDI1Ci0tLSAvZGV2L251bGwKKysrIGIvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9Cb2R5SW5wdXRTdHJlYW0uamF2YQpAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lmpkay5jb25uZWN0b3IuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uTm9uQmxvY2tpbmdJbnB1dFN0cmVhbTsKKworLyoqCisgKiBUT0RPIGNvbnNpZGVyIGV4cG9zaW5nIHRoZSBtb2RlIGFzIHBhcnQgb2YgdGhlIEFQSSwgc28gdGhlIHVzZXIgY2FuIG1ha2UgZGVjaXNpb25zIGJhc2VkIG9uIHRoZSBtb2RlCisgKiA8cC8+CisgKiBBbiBleHRlbnNpb24gb2Yge0BsaW5rIE5vbkJsb2NraW5nSW5wdXRTdHJlYW19IHRoYXQgYWRkcyBtZXRob2RzIHRoYXQgZW5hYmxlIHVzaW5nIHRoZSBzdHJlYW0gYXN5bmNocm9ub3VzbHkuCisgKiBUaGUgYXN5bmNocm9ub3VzIG1vZGUgaXMgaW5zcGlyZWQgYnkgYW5kIHdvcmtzIGluIGEgdmVyeSBzaW1pbGFyIHdheSBhcyBTZXJ2bGV0IGFzeW5jaHJvbm91cyBzdHJlYW1zIGludHJvZHVjZWQgaW4gU2VydmxldAorICogMy4xLgorICogPHAvPgorICogVGhlIHN0cmVhbSBzdXBwb3J0cyAyIG1vZGVzIG9mIG9wZXJhdGlvbiBTWU5DSFJPTk9VUyBhbmQgQVNZTkNIUk9OT1VTLgorICogVGhlIHN0cmVhbSBpcyBvbmUgb2YgdGhlIGZvbGxvd2luZyAzIHN0YXRlczoKKyAqIDx1bD4KKyAqIDxsaT5VTkRFQ0lERUQ8L2xpPgorICogPGxpPlNZTkNIUk9OT1VTPC9saT4KKyAqIDxsaT5BU1lOQ0hST05PVVM8L2xpPgorICogPC91bD4KKyAqIFVOREVDSURFRCBpcyBhbiBpbml0aWFsIG1vZGUgYW5kIGl0IGNvbW1pdHMgZWl0aGVyIHRvIFNZTkNIUk9OT1VTIG9yIEFTWU5DSFJPTk9VUy4gT25jZSBpdCBjb21taXRzIHRvIG9uZSBvZiB0aGVzZQorICogMiBtb2RlcyBpdCBjYW5ub3QgY2hhbmdlIHRvIHRoZSBvdGhlci4gVGhlIG1vZGUgaXQgY29tbWl0cyB0byBpcyBkZWNpZGVkIGJhc2VkIG9uIHRoZSBmaXJzdCB1c2Ugb2YgdGUgc3RyZWFtLgorICogSWYge0BsaW5rICNzZXRSZWFkTGlzdGVuZXIoUmVhZExpc3RlbmVyKX0gaXMgaW52b2tlZCBiZWZvcmUgYW55IG9mIHRoZSByZWFkIG9yIHRyeVJlYWQgbWV0aG9kcywgaXQgY29tbWl0cyB0byBBU1lOQ0hST05PVVMKKyAqIG1vZGUgYW5kIHNpbWlsYXJseSBpZiBhbnkgb2YgdGhlIHJlYWQgb3IgdHJ5UmVhZCBtZXRob2RzIGlzIGludm9rZWQgYmVmb3JlIHtAbGluayAjc2V0UmVhZExpc3RlbmVyKFJlYWRMaXN0ZW5lcil9LAorICogaXQgY29tbWl0cyB0byBTWU5DSFJPTk9VUyBtb2RlLgorICovCithYnN0cmFjdCBjbGFzcyBCb2R5SW5wdXRTdHJlYW0gZXh0ZW5kcyBOb25CbG9ja2luZ0lucHV0U3RyZWFtIHsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiBkYXRhIGNhbiBiZSByZWFkIHdpdGhvdXQgYmxvY2tpbmcgZWxzZSByZXR1cm5zCisgICAgICogZmFsc2UuCisgICAgICogPHAvPgorICAgICAqIElmIHRoZSBzdHJlYW0gaXMgaW4gQVNZTkNIUk9OT1VTIG1vZGUgYW5kIHRoZSB1c2VyIGF0dGVtcHRzIHRvIHJlYWQgZnJvbSBpdCBldmVuIHRob3VnaCB0aGlzIG1ldGhvZCByZXR1cm5zCisgICAgICogZmFsc2UsIGFuIHtAbGluayBJbGxlZ2FsU3RhdGVFeGNlcHRpb259IGlzIHRocm93bi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZGF0YSBjYW4gYmUgb2J0YWluZWQgd2l0aG91dCBibG9ja2luZywKKyAgICAgKiBvdGhlcndpc2UgcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNSZWFkeSgpOworCisgICAgLyoqCisgICAgICogSW5zdHJ1Y3RzIHRoZSBzdHJlYW0gdG8gaW52b2tlIHRoZSBwcm92aWRlZCB7QGxpbmsgUmVhZExpc3RlbmVyfSB3aGVuIGl0IGlzIHBvc3NpYmxlIHRvIHJlYWQuCisgICAgICogPHAvPgorICAgICAqIElmIHRoZSBzdHJlYW0gaXMgaW4gVU5ERUNJREVEIHN0YXRlLCBpbnZva2luZyB0aGlzIG1ldGhvZCB3aWxsIGNvbW1pdCB0aGUgc3RyZWFtIHRvIEFTWU5DSFJPTk9VUyBtb2RlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlYWRMaXN0ZW5lciB0aGUge0BsaW5rIFJlYWRMaXN0ZW5lcn0gdGhhdCBzaG91bGQgYmUgbm90aWZpZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIHdoZW4gaXQncyBwb3NzaWJsZSB0byByZWFkLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaXMgdHJ1ZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bD4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGk+dGhlIHN0cmVhbSBoYXMgYWxyZWFkeSBjb21taXR0ZWQgdG8gIFNZTkNIUk9OT1VTIG1vZGUuIDxsaS8+CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpPnNldFJlYWRMaXN0ZW5lciBpcyBjYWxsZWQgbW9yZSB0aGFuIG9uY2Ugd2l0aGluIHRoZSBzY29wZSBvZiB0aGUgc2FtZSByZXF1ZXN0LiA8bGkvPgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiAgaWYgcmVhZExpc3RlbmVyIGlzIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRSZWFkTGlzdGVuZXIoUmVhZExpc3RlbmVyIHJlYWRMaXN0ZW5lcik7Cit9CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL0JvZHlPdXRwdXRTdHJlYW0uamF2YSBiL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvQm9keU91dHB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMzU1MWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL0JvZHlPdXRwdXRTdHJlYW0uamF2YQpAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lmpkay5jb25uZWN0b3IuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKKworLyoqCisgKiBUT0RPIGNvbnNpZGVyIGV4cG9zaW5nIHRoZSBtb2RlIGFzIHBhcnQgb2YgdGhlIEFQSSwgc28gdGhlIHVzZXIgY2FuIG1ha2UgZGVjaXNpb25zIGJhc2VkIG9uIHRoZSBtb2RlCisgKiA8cC8+CisgKiBBbiBleHRlbnNpb24gb2Yge0BsaW5rIE91dHB1dFN0cmVhbX0gdGhhdCBhZGRzIG1ldGhvZCB0aGF0IGFsbG93IHRvIHVzZSB0aGUgc3RyZWFtIGFzeW5jaHJvbm91c2x5LgorICogSXQgaXMgaW5zcGlyZWQgYnkgYW5kIHdvcmtzIGluIGEgdmVyeSBzaW1pbGFyIHdheSBhcyBTZXJ2bGV0IGFzeW5jaHJvbm91cyBzdHJlYW1zIGludHJvZHVjZWQgaW4gU2VydmxldCAzLjEuCisgKiA8cC8+CisgKiBUaGUgc3RyZWFtIHN1cHBvcnRzIDIgbW9kZXMgU1lOQ0hST05PVVMgYW5kIEFTWU5DSFJPTk9VUy4KKyAqIFRoZSBzdHJlYW0gaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgMyBzdGF0ZXM6CisgKiA8dWw+CisgKiA8bGk+VU5ERUNJREVEPC9saT4KKyAqIDxsaT5TWU5DSFJPTk9VUzwvbGk+CisgKiA8bGk+QVNZTkNIUk9OT1VTPC9saT4KKyAqIDwvdWw+CisgKiBVTkRFQ0lERUQgaXMgYW4gaW5pdGlhbCBtb2RlIGFuZCBpdCBjb21taXRzIGVpdGhlciB0byBTWU5DSFJPTk9VUyBvciBBU1lOQ0hST05PVVMuIE9uY2UgaXQgY29tbWl0cyB0byBvbmUgb2YgdGhlc2UKKyAqIDIgbW9kZXMgaXQgY2Fubm90IGNoYW5nZSB0byB0aGUgb3RoZXIuIFRoZSBtb2RlIGl0IGNvbW1pdHMgdG8gaXMgZGVjaWRlZCBiYXNlZCBvbiB0aGUgZmlyc3QgdXNlIG9mIHRoZSBzdHJlYW0uCisgKiBJZiB7QGxpbmsgI3NldFdyaXRlTGlzdGVuZXIoV3JpdGVMaXN0ZW5lcil9IGlzIGludm9rZWQgYmVmb3JlIGFueSBvZiB0aGUgd3JpdGUgbWV0aG9kcywgaXQgY29tbWl0cyB0byBBU1lOQ0hST05PVVMKKyAqIG1vZGUgYW5kIHNpbWlsYXJseSBpZiBhbnkgb2YgdGhlIHdyaXRlIG1ldGhvZHMgaXMgaW52b2tlZCBiZWZvcmUge0BsaW5rICNzZXRXcml0ZUxpc3RlbmVyKFdyaXRlTGlzdGVuZXIpfSwKKyAqIGl0IGNvbW1pdHMgdG8gU1lOQ0hST05PVVMgbW9kZS4KKyAqLworYWJzdHJhY3QgY2xhc3MgQm9keU91dHB1dFN0cmVhbSBleHRlbmRzIE91dHB1dFN0cmVhbSB7CisKKyAgICAvKioKKyAgICAgKiBJbnN0cnVjdHMgdGhlIHN0cmVhbSB0byBpbnZva2UgdGhlIHByb3ZpZGVkIHtAbGluayBXcml0ZUxpc3RlbmVyfSB3aGVuIGl0IGlzIHBvc3NpYmxlIHRvIHdyaXRlLgorICAgICAqIDxwLz4KKyAgICAgKiBJZiB0aGUgc3RyZWFtIGlzIGluIFVOREVDSURFRCBzdGF0ZSwgaW52b2tpbmcgdGhpcyBtZXRob2Qgd2lsbCBjb21taXQgdGhlIHN0cmVhbSB0byBBU1lOQ0hST05PVVMgbW9kZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3cml0ZUxpc3RlbmVyIHRoZSB7QGxpbmsgV3JpdGVMaXN0ZW5lcn0gdGhhdCBzaG91bGQgYmUgbm90aWZpZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB3aGVuIGl0J3MgcG9zc2libGUgdG8gd3JpdGUuCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgb25lIG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBpcyB0cnVlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVsPgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT50aGUgc3RyZWFtIGhhcyBhbHJlYWR5IGNvbW1pdHRlZCB0byBTWU5DSFJPTk9VUyBtb2RlLiA8bGkvPgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5zZXRXcml0ZUxpc3RlbmVyIGlzIGNhbGxlZCBtb3JlIHRoYW4gb25jZSB3aXRoaW4gdGhlIHNjb3BlIG9mIHRoZSBzYW1lIHJlcXVlc3QuIDxsaS8+CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC91bD4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uICBpZiB3cml0ZUxpc3RlbmVyIGlzIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBzZXRXcml0ZUxpc3RlbmVyKFdyaXRlTGlzdGVuZXIgd3JpdGVMaXN0ZW5lcik7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgZGF0YSBjYW4gYmUgd3JpdHRlbiB3aXRob3V0IGJsb2NraW5nIGVsc2UgcmV0dXJucworICAgICAqIGZhbHNlLgorICAgICAqIDxwLz4KKyAgICAgKiBJZiB0aGUgc3RyZWFtIGlzIGluIEFTWU5DSFJPTk9VUyBtb2RlIGFuZCB0aGUgdXNlciBhdHRlbXB0cyB0byB3cml0ZSB0byBpdCBldmVuIHRob3VnaCB0aGlzIG1ldGhvZCByZXR1cm5zCisgICAgICogZmFsc2UsIGFuIHtAbGluayBJbGxlZ2FsU3RhdGVFeGNlcHRpb259IGlzIHRocm93bi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgZGF0YSBjYW4gYmUgb2J0YWluZWQgd2l0aG91dCBibG9ja2luZywKKyAgICAgKiBvdGhlcndpc2UgcmV0dXJucyA8Y29kZT5mYWxzZTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaXNSZWFkeSgpOworfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9CdWZmZXJlZEJvZHlPdXRwdXRTdHJlYW0uamF2YSBiL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvQnVmZmVyZWRCb2R5T3V0cHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMzMjU4ZQotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvQnVmZmVyZWRCb2R5T3V0cHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZGsuY29ubmVjdG9yLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworCisvKioKKyAqIEBhdXRob3IgUGV0ciBKYW5vdWNoIChwZXRyLmphbm91Y2ggYXQgb3JhY2xlLmNvbSkKKyAqLworY2xhc3MgQnVmZmVyZWRCb2R5T3V0cHV0U3RyZWFtIGV4dGVuZHMgQm9keU91dHB1dFN0cmVhbSB7CisKKyAgICBwcml2YXRlIGZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBidWZmZXIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisKKyAgICAvKiBUaGlzIHdob2xlIG1vZGUgc3R1ZmYgaXMgdG90YWxseSBwb2ludGxlc3MgaWYgd2UgYnVmZmVyIHRoZSByZXF1ZXN0IGJvZHksCisgICAgaXQgaXMgaGVyZSBvbmx5IGluIGNhc2Ugc29tZW9uZSBjb21wbGFpbmVkIHRoYXQgdGhpcyBzdHJlYW0gZG9lcyBub3QgYmVoYXZlIGFzIEJvZHlPdXRwdXRTdHJlYW0gc2F5cyBpdCBzaG91bGQgKi8KKyAgICBwcml2YXRlIHZvbGF0aWxlIE1vZGUgbW9kZSA9IE1vZGUuVU5ERUNJREVEOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0V3JpdGVMaXN0ZW5lcihXcml0ZUxpc3RlbmVyIHdyaXRlTGlzdGVuZXIpIHsKKyAgICAgICAgaWYgKG1vZGUgPT0gTW9kZS5BU1lOQ0hST05PVVMpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuV1JJVEVfTElTVEVORVJfU0VUX09OTFlfT05DRSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtb2RlID09IE1vZGUuU1lOQ0hST05PVVMpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5BU1lOQ19PUEVSQVRJT05fTk9UX1NVUFBPUlRFRCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIG1vZGUgPSBNb2RlLkFTWU5DSFJPTk9VUzsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdyaXRlTGlzdGVuZXIub25Xcml0ZVBvc3NpYmxlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHdyaXRlTGlzdGVuZXIub25FcnJvcihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZHkoKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAobW9kZSA9PSBNb2RlLlVOREVDSURFRCkgeworICAgICAgICAgICAgbW9kZSA9IE1vZGUuU1lOQ0hST05PVVM7CisgICAgICAgIH0KKworICAgICAgICBidWZmZXIud3JpdGUoYik7CisgICAgfQorCisgICAgQnl0ZUJ1ZmZlciB0b0J1ZmZlcigpIHsKKyAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXIud3JhcChidWZmZXIudG9CeXRlQXJyYXkoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBlbnVtIE1vZGUgeworICAgICAgICBVTkRFQ0lERUQsCisgICAgICAgIEFTWU5DSFJPTk9VUywKKyAgICAgICAgU1lOQ0hST05PVVMKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL0NodW5rZWRCb2R5T3V0cHV0U3RyZWFtLmphdmEgYi9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL0NodW5rZWRCb2R5T3V0cHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNmOWMzMQotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvQ2h1bmtlZEJvZHlPdXRwdXRTdHJlYW0uamF2YQpAQCAtMCwwICsxLDM2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZGsuY29ubmVjdG9yLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7CisKKworLyoqCisgKiBCb2R5IHN0cmVhbSB0aGF0IGNhbiBvcGVyYXRlIGVpdGhlciBzeW5jaHJvbm91c2x5IG9yIGFzeW5jaHJvbm91c2x5LiBTZWUge0BsaW5rIEJvZHlPdXRwdXRTdHJlYW19IGZvciBkZXRhaWxzLgorICoKKyAqIEBhdXRob3IgUGV0ciBKYW5vdWNoIChwZXRyLmphbm91Y2ggYXQgb3JhY2xlLmNvbSkKKyAqLworY2xhc3MgQ2h1bmtlZEJvZHlPdXRwdXRTdHJlYW0gZXh0ZW5kcyBCb2R5T3V0cHV0U3RyZWFtIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJ5dGVCdWZmZXIgRU1QVFlfQlVGRkVSID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgwKTsKKworICAgIHByaXZhdGUgZmluYWwgaW50IGNodW5rU2l6ZTsKKyAgICBwcml2YXRlIGZpbmFsIGludCBlbmNvZGVkRnVsbENodW5rU2l6ZTsKKworICAgIC8vIHRoaXMgc3RyZWFtIGlzIGJ1ZmZlcmluZyBieSBkZWZhdWx0OyBpdCBoYXMgcGVuZGluZyBkYXRhIHVwIHRvIGRhdGFCdWZmZXIuY2FwYWNpdHkoKQorICAgIHByaXZhdGUgZmluYWwgQnl0ZUJ1ZmZlciBkYXRhQnVmZmVyOworCisgICAgLy8gaW4gc3luYy4gbW9kZSwgdGhlIHdyaXRlIG9wZXJhdGlvbnMgd2lsbCBibG9jayB1bnRpbCB0aGUgc3RyZWFtIGlzIG9wZW5lZCBmb3IgZGF0YQorICAgIHByaXZhdGUgZmluYWwgQ291bnREb3duTGF0Y2ggaW5pdGlhbEJsb2NraW5nTGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisKKyAgICBwcml2YXRlIHZvbGF0aWxlIEZpbHRlcjxCeXRlQnVmZmVyLCA/LCA/LCA/PiBkb3duc3RyZWFtRmlsdGVyOworICAgIHByaXZhdGUgdm9sYXRpbGUgV3JpdGVMaXN0ZW5lciB3cml0ZUxpc3RlbmVyID0gbnVsbDsKKyAgICAvLyBhbiBpbnRlcm5hbCBsaXN0ZW5lciwgc28gdGhlIGNvbm5lY3RvciBjYW4gYmUgbm90aWZpZWQgd2hlbiB0aGUgc3RyZWFtIGhhcyBiZWVuIGNsb3NlZCAoPWJvZHkgaGFzIGJlZW4gc2VudCkKKyAgICBwcml2YXRlIHZvbGF0aWxlIExpc3RlbmVyIGNsb3NlTGlzdGVuZXI7CisgICAgLy8gbW9kZSB0aGlzIHN0cmVhbSBvcGVyYXRlcyBpbgorICAgIHByaXZhdGUgdm9sYXRpbGUgTW9kZSBtb2RlID0gTW9kZS5VTkRFQ0lERUQ7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIHJlYWR5ID0gZmFsc2U7CisgICAgLy8gZmxhZyB0byBtYWtlIHN1cmUgdGhhdCBhIGxpc3RlbmVyIGlzIGNhbGxlZCBvbmx5IGZvciB0aGUgZmlyc3QgdGltZSBvciBhZnRlciBpc1JlYWR5KCkgcmV0dXJuZWQgZmFsc2UKKyAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gY2FsbExpc3RlbmVyID0gdHJ1ZTsKKworICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBjbG9zZWQgPSBmYWxzZTsKKworICAgIENodW5rZWRCb2R5T3V0cHV0U3RyZWFtKGludCBjaHVua1NpemUpIHsKKyAgICAgICAgdGhpcy5jaHVua1NpemUgPSBjaHVua1NpemU7CisgICAgICAgIHRoaXMuZGF0YUJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoY2h1bmtTaXplKTsKKyAgICAgICAgdGhpcy5lbmNvZGVkRnVsbENodW5rU2l6ZSA9IEh0dHBSZXF1ZXN0RW5jb2Rlci5nZXRDaHVua1NpemUoY2h1bmtTaXplKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0V3JpdGVMaXN0ZW5lcihXcml0ZUxpc3RlbmVyIHdyaXRlTGlzdGVuZXIpIHsKKyAgICAgICAgaWYgKHRoaXMud3JpdGVMaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLldSSVRFX0xJU1RFTkVSX1NFVF9PTkxZX09OQ0UoKSk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRBc3luY2hyb25vdXNPcGVyYXRpb24oKTsKKyAgICAgICAgdGhpcy53cml0ZUxpc3RlbmVyID0gd3JpdGVMaXN0ZW5lcjsKKyAgICAgICAgY29tbWl0VG9Nb2RlKCk7CisKKyAgICAgICAgaWYgKHJlYWR5ICYmIGNhbGxMaXN0ZW5lcikgeworICAgICAgICAgICAgY2FsbE9uV3JpdGVQb3NzaWJsZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNvbW1pdFRvTW9kZSgpOworCisgICAgICAgIC8vIGlucHV0IHZhbGlkYXRpb24gYm9ycm93ZWQgZnJvbSBPdXRwdXRTdHJlYW0KKyAgICAgICAgaWYgKGIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgICAgIH0gZWxzZSBpZiAoKG9mZiA8IDApIHx8IChvZmYgPiBiLmxlbmd0aCkgfHwgKGxlbiA8IDApCisgICAgICAgICAgICAgICAgfHwgKChvZmYgKyBsZW4pID4gYi5sZW5ndGgpIHx8ICgob2ZmICsgbGVuKSA8IDApKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICB9IGVsc2UgaWYgKGxlbiA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRWYWxpZFN0YXRlKCk7CisgICAgICAgIGRvSW5pdGlhbEJsb2NraW5nKCk7CisKKyAgICAgICAgaWYgKGxlbiA8IGRhdGFCdWZmZXIucmVtYWluaW5nKCkpIHsKKyAgICAgICAgICAgIC8vIGlmIHRoZSBkYXRhIGZpdCBpbnRvIHRoZSBidWZmZXIsIHVzZSB3cml0ZSBwZXIgYnl0ZQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IG9mZjsgaSA8IG9mZiArIGxlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgd3JpdGUoYltpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBpZiB0aGUgZGF0YSBvdmVyZmxvdyB0aGUgYnVmZmVyLCBzZW5kIGEgbXVsdGlwbGUgb2YgdGhlIGJ1ZmZlciBzaXplIGFuZCBidWZmZXIgdGhlIHJlbWFpbmRlcgorICAgICAgICAgICAgaW50IGN1cnJlbnREYXRhTGVuZ3RoID0gZGF0YUJ1ZmZlci5wb3NpdGlvbigpICsgbGVuOworICAgICAgICAgICAgaW50IHJlbWFpbmRlciA9IGN1cnJlbnREYXRhTGVuZ3RoICUgZGF0YUJ1ZmZlci5jYXBhY2l0eSgpOworICAgICAgICAgICAgLy8gYnVmZmVyIHRoYXQgd2lsbCBiZSBzZW5kCisgICAgICAgICAgICBCeXRlQnVmZmVyIGJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoY3VycmVudERhdGFMZW5ndGggLSByZW1haW5kZXIpOworICAgICAgICAgICAgZGF0YUJ1ZmZlci5mbGlwKCk7CisgICAgICAgICAgICAvLyBwdXQgY3VycmVudGx5IGJ1ZmZlcmVkIGRhdGEKKyAgICAgICAgICAgIGJ1ZmZlci5wdXQoZGF0YUJ1ZmZlcik7CisgICAgICAgICAgICAvLyBmaWxsIHRoZSByZXN0IHdpdGggcGFzc2VkIGRhdGEKKyAgICAgICAgICAgIGJ1ZmZlci5wdXQoYiwgb2ZmLCBsZW4gLSByZW1haW5kZXIpOworICAgICAgICAgICAgYnVmZmVyLmZsaXAoKTsKKyAgICAgICAgICAgIGRhdGFCdWZmZXIuY2xlYXIoKTsKKyAgICAgICAgICAgIC8vIGJ1ZmZlciByZW1haW5pbmcgZGF0YQorICAgICAgICAgICAgZGF0YUJ1ZmZlci5wdXQoYiwgb2ZmICsgbGVuIC0gcmVtYWluZGVyLCByZW1haW5kZXIpOworICAgICAgICAgICAgLy8gc2VuZCB0aGUgdG8tYmUtd3JpdHRlbiBidWZmZXIKKyAgICAgICAgICAgIHdyaXRlKGJ1ZmZlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLmZsdXNoKCk7CisgICAgICAgIGlmIChtb2RlID09IE1vZGUuVU5ERUNJREVEKSB7CisgICAgICAgICAgICAvLyBpZiB3ZSBhcmUgbm90IGNvbW1pdHRlZCB0byBhbnkgbW9kZSwgYW55IG9mIHRoZSB3cml0ZSBvcGVyYXRpb25zIGhhcyBub3QgYmVlbiBpbnZva2VkIHlldAorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1vZGUgPT0gTW9kZS5BU1lOQ0hST05PVVMpIHsKKyAgICAgICAgICAgIGFzc2VydFZhbGlkU3RhdGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkYXRhQnVmZmVyLnBvc2l0aW9uKCkgPT0gMCkgeworICAgICAgICAgICAgLy8gdGhlcmUgaXMgbm90aGluZyBidWZmZXJlZCwgc28gZG9uJ3QgYm90aGVyCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBkYXRhQnVmZmVyLmZsaXAoKTsKKyAgICAgICAgd3JpdGUoZGF0YUJ1ZmZlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNvbW1pdFRvTW9kZSgpOworICAgICAgICBhc3NlcnRWYWxpZFN0YXRlKCk7CisgICAgICAgIGRvSW5pdGlhbEJsb2NraW5nKCk7CisKKyAgICAgICAgZGF0YUJ1ZmZlci5wdXQoKGJ5dGUpIGIpOworICAgICAgICBpZiAoIWRhdGFCdWZmZXIuaGFzUmVtYWluaW5nKCkpIHsKKyAgICAgICAgICAgIC8vIHNlbmQgdGhlIGJ1ZmZlciBpZiB3ZSBoYXZlIGp1c3QgZmlsbGVkIGl0LgorICAgICAgICAgICAgZGF0YUJ1ZmZlci5mbGlwKCk7CisgICAgICAgICAgICB3cml0ZShkYXRhQnVmZmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZHkoKSB7CisgICAgICAgIC8vIFRPRE8gd2UgbWlnaHQgc3VwcG9ydCB0aGlzIGluIHN5bmNocm9ub3VzIG1vZGUgdG9vCisgICAgICAgIGFzc2VydEFzeW5jaHJvbm91c09wZXJhdGlvbigpOworCisgICAgICAgIGlmICghcmVhZHkpIHsKKyAgICAgICAgICAgIGNhbGxMaXN0ZW5lciA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVhZHk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFZhbGlkU3RhdGUoKSB7CisgICAgICAgIGlmIChjbG9zZWQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuU1RSRUFNX0NMT1NFRCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtb2RlID09IE1vZGUuQVNZTkNIUk9OT1VTICYmICFyZWFkeSkgeworICAgICAgICAgICAgLy8gd2UgYXJlIGluIGFzeW5jaHJvbm91cyBtb2RlLCBidXQgdGhlIHVzZXIgY2FsbGVkIHdyaXRlIHdoZW4gdGhlIHN0cmVhbSBpbiBub24tcmVhZHkgc3RhdGUKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuV1JJVEVfV0hFTl9OT1RfUkVBRFkoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZShmaW5hbCBCeXRlQnVmZmVyIGJ5dGVCdWZmZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIGRvIHRyYW5zcG9ydCBlbmNvZGluZyBvbiB0aGUgcmF3IGRhdGEKKyAgICAgICAgQnl0ZUJ1ZmZlciBodHRwQ2h1bmsgPSBlbmNvZGVUb0h0dHAoYnl0ZUJ1ZmZlcik7CisKKyAgICAgICAgaWYgKG1vZGUgPT0gTW9kZS5TWU5DSFJPTk9VUykgeworICAgICAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggd3JpdGVMYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgICAgIGZpbmFsIEF0b21pY1JlZmVyZW5jZTxUaHJvd2FibGU+IGVycm9yID0gbmV3IEF0b21pY1JlZmVyZW5jZTw+KCk7CisgICAgICAgICAgICBkb3duc3RyZWFtRmlsdGVyLndyaXRlKGh0dHBDaHVuaywgbmV3IENvbXBsZXRpb25IYW5kbGVyPEJ5dGVCdWZmZXI+KCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbXBsZXRlZChCeXRlQnVmZmVyIHJlc3VsdCkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZUxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZhaWxlZChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICBlcnJvci5zZXQodCk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlTGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gYmxvY2sgdW50aWwgdGhlIG9wZXJhdGlvbiBoYXMgY29tcGxldGVkCisgICAgICAgICAgICAgICAgd3JpdGVMYXRjaC5hd2FpdCgpOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5XUklUSU5HX0ZBSUxFRCgpLCBlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnl0ZUJ1ZmZlci5jbGVhcigpOworCisgICAgICAgICAgICBUaHJvd2FibGUgdCA9IGVycm9yLmdldCgpOworICAgICAgICAgICAgLy8gY2hlY2sgZm8gYW55IGVycm9ycworICAgICAgICAgICAgaWYgKHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5XUklUSU5HX0ZBSUxFRCgpLCB0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlYWR5ID0gZmFsc2U7CisgICAgICAgICAgICBkb3duc3RyZWFtRmlsdGVyLndyaXRlKGh0dHBDaHVuaywgbmV3IENvbXBsZXRpb25IYW5kbGVyPEJ5dGVCdWZmZXI+KCkgeworCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY29tcGxldGVkKEJ5dGVCdWZmZXIgcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgICAgIHJlYWR5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnl0ZUJ1ZmZlci5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbExpc3RlbmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYWxsT25Xcml0ZVBvc3NpYmxlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBmYWlsZWQoVGhyb3dhYmxlIHRocm93YWJsZSkgeworICAgICAgICAgICAgICAgICAgICByZWFkeSA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB3cml0ZUxpc3RlbmVyLm9uRXJyb3IodGhyb3dhYmxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN5bmNocm9uaXplZCB2b2lkIG9wZW4oRmlsdGVyPEJ5dGVCdWZmZXIsID8sID8sID8+IGRvd25zdHJlYW1GaWx0ZXIpIHsKKyAgICAgICAgdGhpcy5kb3duc3RyZWFtRmlsdGVyID0gZG93bnN0cmVhbUZpbHRlcjsKKyAgICAgICAgaW5pdGlhbEJsb2NraW5nTGF0Y2guY291bnREb3duKCk7CisgICAgICAgIHJlYWR5ID0gdHJ1ZTsKKworICAgICAgICBpZiAobW9kZSA9PSBNb2RlLkFTWU5DSFJPTk9VUyAmJiB3cml0ZUxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNhbGxPbldyaXRlUG9zc2libGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGRvSW5pdGlhbEJsb2NraW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG1vZGUgIT0gTW9kZS5TWU5DSFJPTk9VUyB8fCBkb3duc3RyZWFtRmlsdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbml0aWFsQmxvY2tpbmdMYXRjaC5hd2FpdCgpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgY29tbWl0VG9Nb2RlKCkgeworICAgICAgICAvLyByZXR1cm4gaWYgdGhlIG1vZGUgaGFzIGFscmVhZHkgYmVlbiBjb21taXR0ZWQKKyAgICAgICAgaWYgKG1vZGUgIT0gTW9kZS5VTkRFQ0lERUQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGdvIGFzeW5jaHJvbm91cywgaWYgdGhlIHVzZXIgaGFzIG1hZGUgYW55IG1vdmUgc3VnZ2VzdGluZyBhc3luY2hyb25vdXMgbW9kZQorICAgICAgICBpZiAod3JpdGVMaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICBtb2RlID0gTW9kZS5BU1lOQ0hST05PVVM7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBnbyBzeW5jaHJvbm91cywgaWYgdGhlIHVzZXIgaGFzIG5vdCBtYWRlIGFueSBzdWdnZXN0aW5nIGFzeW5jaHJvbm91cyBtb2RlCisgICAgICAgIG1vZGUgPSBNb2RlLlNZTkNIUk9OT1VTOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRBc3luY2hyb25vdXNPcGVyYXRpb24oKSB7CisgICAgICAgIGlmIChtb2RlID09IE1vZGUuU1lOQ0hST05PVVMpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5BU1lOQ19PUEVSQVRJT05fTk9UX1NVUFBPUlRFRCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjYWxsT25Xcml0ZVBvc3NpYmxlKCkgeworICAgICAgICBjYWxsTGlzdGVuZXIgPSBmYWxzZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdyaXRlTGlzdGVuZXIub25Xcml0ZVBvc3NpYmxlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHdyaXRlTGlzdGVuZXIub25FcnJvcihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBhIGNsb3NlIGxpc3RlbmVyIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIHVzZXIgY2xvc2VzIHRoZSBzdHJlYW0uCisgICAgICogPHAvPgorICAgICAqIFRoaXMgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBib2R5IGhhcyBiZWVuIGNvbXBsZXRlbHkgd3JpdHRlbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbG9zZUxpc3RlbmVyIGNsb3NlIGxpc3RlbmVyLgorICAgICAqLworICAgIHN5bmNocm9uaXplZCB2b2lkIHNldENsb3NlTGlzdGVuZXIoTGlzdGVuZXIgY2xvc2VMaXN0ZW5lcikgeworICAgICAgICB0aGlzLmNsb3NlTGlzdGVuZXIgPSBjbG9zZUxpc3RlbmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyYW5zZm9ybSByYXcgYXBwbGljYXRpb24gZGF0YSBpbnRvIEhUVFAgYm9keS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBieXRlQnVmZmVyIGFwcGxpY2F0aW9uIGRhdGEuCisgICAgICogQHJldHVybiBodHRwIGJvZHkgcGFydC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQnl0ZUJ1ZmZlciBlbmNvZGVUb0h0dHAoQnl0ZUJ1ZmZlciBieXRlQnVmZmVyKSB7CisgICAgICAgIC8vIHdlIGV4cGVjdCB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIHRvIGJlIGVpdGhlciBhIG11bHRpcGxlIG9mIGNodW5rU2l6ZQorICAgICAgICAvLyBvciBzbWFsbGVyIHRoYW4gY2h1bmtTaXplIGluIGNhc2Ugb2YgdGhlIGxhc3QgY29udGVudC1jYXJyeWluZyBjaHVuayBhbmQgY2xvc2luZyBjaHVuayAodGhlIG9uZSBzZW50IGJ5IGNsb3NlKCkpCisgICAgICAgIGlmIChieXRlQnVmZmVyLnJlbWFpbmluZygpIDwgY2h1bmtTaXplKSB7CisgICAgICAgICAgICByZXR1cm4gSHR0cFJlcXVlc3RFbmNvZGVyLmVuY29kZUNodW5rKGJ5dGVCdWZmZXIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGJ5dGVCdWZmZXIucmVtYWluaW5nKCkgJSBjaHVua1NpemUgIT0gMCkgeworICAgICAgICAgICAgLy8gdGhlIGJ1ZmZlciBpcyBuZWl0aGVyIGEgbXVsdGlwbGUgb2YgY2h1bmtTaXplIG5vciBzbWFsbGVyIHRoYW4gY2h1bmtTaXplCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLkJVRkZFUl9JTkNPUlJFQ1RfTEVOR1RIKCkpOworICAgICAgICB9CisKKyAgICAgICAgaW50IG51bWJlck9mQ2h1bmtzID0gYnl0ZUJ1ZmZlci5yZW1haW5pbmcoKSAvIGNodW5rU2l6ZTsKKyAgICAgICAgQnl0ZUJ1ZmZlciBlbmNvZGVkQ2h1bmtzID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShudW1iZXJPZkNodW5rcyAqIGVuY29kZWRGdWxsQ2h1bmtTaXplKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mQ2h1bmtzOyBpKyspIHsKKyAgICAgICAgICAgIGJ5dGVCdWZmZXIucG9zaXRpb24oaSAqIGNodW5rU2l6ZSk7CisgICAgICAgICAgICBieXRlQnVmZmVyLmxpbWl0KGkgKiBjaHVua1NpemUgKyBjaHVua1NpemUpOworICAgICAgICAgICAgQnl0ZUJ1ZmZlciBlbmNvZGVDaHVuayA9IEh0dHBSZXF1ZXN0RW5jb2Rlci5lbmNvZGVDaHVuayhieXRlQnVmZmVyKTsKKyAgICAgICAgICAgIGVuY29kZWRDaHVua3MucHV0KGVuY29kZUNodW5rKTsKKyAgICAgICAgfQorCisgICAgICAgIGVuY29kZWRDaHVua3MuZmxpcCgpOworICAgICAgICByZXR1cm4gZW5jb2RlZENodW5rczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjbG9zZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgICAgICBjb21taXRUb01vZGUoKTsKKyAgICAgICAgICAgIC8vIGp1c3QgaW4gY2FzZSBjbG9zZSBpcyBpbnZva2VkIHdpdGhvdXQgYW55IGRhdGEgYmVpbmcgd3JpdHRlbgorICAgICAgICAgICAgZG9Jbml0aWFsQmxvY2tpbmcoKTsKKyAgICAgICAgICAgIGZsdXNoKCk7CisgICAgICAgICAgICAvLyBjaHVuay1lbmNvZGVkIG1lc3NhZ2UgaXMgZmluaXNoZWQgd2l0aCBhbiBlbXB0eSBjaHVuaworICAgICAgICAgICAgd3JpdGUoRU1QVFlfQlVGRkVSKTsKKyAgICAgICAgICAgIHN1cGVyLmNsb3NlKCk7CisKKyAgICAgICAgY2xvc2VkID0gdHJ1ZTsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpZiAoY2xvc2VMaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY2xvc2VMaXN0ZW5lci5vbkNsb3NlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGEgY2xvc2UgbGlzdGVuZXIgd2hpY2ggd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgdXNlciBjbG9zZXMgdGhlIHN0cmVhbS4KKyAgICAgKiA8cC8+CisgICAgICogVGhpcyBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIGJvZHkgaGFzIGJlZW4gY29tcGxldGVseSB3cml0dGVuLgorICAgICAqLworICAgIGludGVyZmFjZSBMaXN0ZW5lciB7CisKKyAgICAgICAgdm9pZCBvbkNsb3NlZCgpOworICAgIH0KKworICAgIHByaXZhdGUgZW51bSBNb2RlIHsKKyAgICAgICAgU1lOQ0hST05PVVMsCisgICAgICAgIEFTWU5DSFJPTk9VUywKKyAgICAgICAgVU5ERUNJREVECisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9Db21wbGV0aW9uSGFuZGxlci5qYXZhIGIvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9Db21wbGV0aW9uSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyOTcxMDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL0NvbXBsZXRpb25IYW5kbGVyLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZGsuY29ubmVjdG9yLmludGVybmFsOworCisvKioKKyAqIEEgY2FsbGJhY2sgdG8gbm90aWZ5IGFib3V0IGFzeW5jaHJvbm91cyBJL08gb3BlcmF0aW9ucyBzdGF0dXMgdXBkYXRlcy4KKyAqCisgKiBAYXV0aG9yIEFsZXhleSBTdGFzaG9rCisgKi8KK2Fic3RyYWN0IGNsYXNzIENvbXBsZXRpb25IYW5kbGVyPEU+IHsKKworICAgIC8qKgorICAgICAqIFRoZSBvcGVyYXRpb24gaGFzIGZhaWxlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aHJvd2FibGUgZXJyb3IsIHdoaWNoIG9jY3VycmVkIGR1cmluZyBvcGVyYXRpb24gZXhlY3V0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZhaWxlZChUaHJvd2FibGUgdGhyb3dhYmxlKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG9wZXJhdGlvbiBoYXMgY29tcGxldGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc3VsdCB0aGUgb3BlcmF0aW9uIHJlc3VsdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb21wbGV0ZWQoRSByZXN1bHQpIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL0Nvbm5lY3RvckNvbmZpZ3VyYXRpb24uamF2YSBiL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvQ29ubmVjdG9yQ29uZmlndXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzYTU3MWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL0Nvbm5lY3RvckNvbmZpZ3VyYXRpb24uamF2YQpAQCAtMCwwICsxLDI0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZGsuY29ubmVjdG9yLmludGVybmFsOworCitpbXBvcnQgamF2YS5uZXQuQ29va2llUG9saWN5OworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworCitpbXBvcnQgamF2YXgubmV0LnNzbC5Ib3N0bmFtZVZlcmlmaWVyOworaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMQ29udGV4dDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LlNzbENvbmZpZ3VyYXRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZGsuY29ubmVjdG9yLkpka0Nvbm5lY3RvclByb3BlcnRpZXM7CisKKy8qKgorICogQSBjb250YWluZXIgZm9yIGNvbm5lY3RvciBjb25maWd1cmF0aW9uIHRvIG1ha2UgaXQgZWFzaWVyIHRvIG1vdmUgYXJvdW5kLgorICogPHAvPgorICogVGhpcyBpcyBpbnRlcm5hbCB0byB0aGUgY29ubmVjdG9yIGFuZCBpcyBub3QgdXNlZCBieSB0aGUgdXNlciBmb3IgY29uZmlndXJhdGlvbi4KKyAqCisgKiBAYXV0aG9yIFBldHIgSmFub3VjaCAocGV0ci5qYW5vdWNoIGF0IG9yYWNsZS5jb20pCisgKi8KK2NsYXNzIENvbm5lY3RvckNvbmZpZ3VyYXRpb24geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoQ29ubmVjdG9yQ29uZmlndXJhdGlvbi5jbGFzcy5nZXROYW1lKCkpOworCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgY2h1bmtTaXplOworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBmb2xsb3dSZWRpcmVjdHM7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbWF4UmVkaXJlY3RzOworICAgIHByaXZhdGUgZmluYWwgVGhyZWFkUG9vbENvbmZpZyB0aHJlYWRQb29sQ29uZmlnOworICAgIHByaXZhdGUgZmluYWwgaW50IGNvbnRhaW5lcklkbGVUaW1lb3V0OworICAgIHByaXZhdGUgZmluYWwgaW50IG1heEhlYWRlclNpemU7CisgICAgcHJpdmF0ZSBmaW5hbCBDb29raWVQb2xpY3kgY29va2llUG9saWN5OworICAgIHByaXZhdGUgZmluYWwgaW50IG1heENvbm5lY3Rpb25zUGVyRGVzdGluYXRpb247CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgY29ubmVjdGlvbklkbGVUaW1lb3V0OworICAgIHByaXZhdGUgZmluYWwgU1NMQ29udGV4dCBzc2xDb250ZXh0OworICAgIHByaXZhdGUgZmluYWwgSG9zdG5hbWVWZXJpZmllciBob3N0bmFtZVZlcmlmaWVyOworICAgIHByaXZhdGUgZmluYWwgaW50IHJlc3BvbnNlVGltZW91dDsKKyAgICBwcml2YXRlIGZpbmFsIGludCBjb25uZWN0VGltZW91dDsKKyAgICBwcml2YXRlIGZpbmFsIFByb3h5Q29uZmlndXJhdGlvbiBwcm94eUNvbmZpZ3VyYXRpb247CisKKyAgICBDb25uZWN0b3JDb25maWd1cmF0aW9uKENsaWVudCBjbGllbnQsIENvbmZpZ3VyYXRpb24gY29uZmlnKSB7CisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IGNvbmZpZy5nZXRQcm9wZXJ0aWVzKCk7CisKKyAgICAgICAgaW50IHByb3Bvc2VkQ2h1bmtTaXplID0gSmRrQ29ubmVjdG9yUHJvcGVydGllcy5nZXRWYWx1ZShwcm9wZXJ0aWVzLCBDbGllbnRQcm9wZXJ0aWVzLkNIVU5LRURfRU5DT0RJTkdfU0laRSwKKyAgICAgICAgICAgICAgICBKZGtDb25uZWN0b3JQcm9wZXJ0aWVzLkRFRkFVTFRfSFRUUF9DSFVOS19TSVpFLCBJbnRlZ2VyLmNsYXNzKTsKKyAgICAgICAgaWYgKHByb3Bvc2VkQ2h1bmtTaXplIDwgMCkgeworICAgICAgICAgICAgTE9HR0VSLndhcm5pbmcoTG9jYWxpemF0aW9uTWVzc2FnZXMuTkVHQVRJVkVfQ0hVTktfU0laRShwcm9wb3NlZENodW5rU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgSmRrQ29ubmVjdG9yUHJvcGVydGllcy5ERUZBVUxUX0hUVFBfQ0hVTktfU0laRSkpOworICAgICAgICAgICAgcHJvcG9zZWRDaHVua1NpemUgPSBKZGtDb25uZWN0b3JQcm9wZXJ0aWVzLkRFRkFVTFRfSFRUUF9DSFVOS19TSVpFOworICAgICAgICB9CisKKyAgICAgICAgY2h1bmtTaXplID0gcHJvcG9zZWRDaHVua1NpemU7CisKKyAgICAgICAgdGhyZWFkUG9vbENvbmZpZyA9IEpka0Nvbm5lY3RvclByb3BlcnRpZXMuZ2V0VmFsdWUocHJvcGVydGllcywgSmRrQ29ubmVjdG9yUHJvcGVydGllcy5XT1JLRVJfVEhSRUFEX1BPT0xfQ09ORklHLAorICAgICAgICAgICAgICAgIFRocmVhZFBvb2xDb25maWcuZGVmYXVsdENvbmZpZygpLCBUaHJlYWRQb29sQ29uZmlnLmNsYXNzKTsKKyAgICAgICAgdGhyZWFkUG9vbENvbmZpZy5zZXRDb3JlUG9vbFNpemUoQ2xpZW50UHJvcGVydGllcy5nZXRWYWx1ZShwcm9wZXJ0aWVzLCBDbGllbnRQcm9wZXJ0aWVzLkFTWU5DX1RIUkVBRFBPT0xfU0laRSwKKyAgICAgICAgICAgICAgICB0aHJlYWRQb29sQ29uZmlnLmdldENvcmVQb29sU2l6ZSgpLCBJbnRlZ2VyLmNsYXNzKSk7CisgICAgICAgIGNvbnRhaW5lcklkbGVUaW1lb3V0ID0gSmRrQ29ubmVjdG9yUHJvcGVydGllcy5nZXRWYWx1ZShwcm9wZXJ0aWVzLCBKZGtDb25uZWN0b3JQcm9wZXJ0aWVzLkNPTlRBSU5FUl9JRExFX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgSmRrQ29ubmVjdG9yUHJvcGVydGllcy5ERUZBVUxUX0NPTk5FQ1RJT05fQ0xPU0VfV0FJVCwgSW50ZWdlci5jbGFzcyk7CisKKyAgICAgICAgbWF4SGVhZGVyU2l6ZSA9IEpka0Nvbm5lY3RvclByb3BlcnRpZXMuZ2V0VmFsdWUocHJvcGVydGllcywgSmRrQ29ubmVjdG9yUHJvcGVydGllcy5NQVhfSEVBREVSX1NJWkUsCisgICAgICAgICAgICAgICAgSmRrQ29ubmVjdG9yUHJvcGVydGllcy5ERUZBVUxUX01BWF9IRUFERVJfU0laRSwgSW50ZWdlci5jbGFzcyk7CisgICAgICAgIGZvbGxvd1JlZGlyZWN0cyA9IENsaWVudFByb3BlcnRpZXMuZ2V0VmFsdWUocHJvcGVydGllcywgQ2xpZW50UHJvcGVydGllcy5GT0xMT1dfUkVESVJFQ1RTLCB0cnVlLCBCb29sZWFuLmNsYXNzKTsKKworICAgICAgICBjb29raWVQb2xpY3kgPSBKZGtDb25uZWN0b3JQcm9wZXJ0aWVzLmdldFZhbHVlKHByb3BlcnRpZXMsIEpka0Nvbm5lY3RvclByb3BlcnRpZXMuQ09PS0lFX1BPTElDWSwKKyAgICAgICAgICAgICAgICBKZGtDb25uZWN0b3JQcm9wZXJ0aWVzLkRFRkFVTFRfQ09PS0lFX1BPTElDWSwgQ29va2llUG9saWN5LmNsYXNzKTsKKyAgICAgICAgbWF4UmVkaXJlY3RzID0gSmRrQ29ubmVjdG9yUHJvcGVydGllcy5nZXRWYWx1ZShwcm9wZXJ0aWVzLCBKZGtDb25uZWN0b3JQcm9wZXJ0aWVzLk1BWF9SRURJUkVDVFMsCisgICAgICAgICAgICAgICAgSmRrQ29ubmVjdG9yUHJvcGVydGllcy5ERUZBVUxUX01BWF9SRURJUkVDVFMsIEludGVnZXIuY2xhc3MpOworCisgICAgICAgIG1heENvbm5lY3Rpb25zUGVyRGVzdGluYXRpb24gPSBKZGtDb25uZWN0b3JQcm9wZXJ0aWVzLmdldFZhbHVlKHByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgSmRrQ29ubmVjdG9yUHJvcGVydGllcy5NQVhfQ09OTkVDVElPTlNfUEVSX0RFU1RJTkFUSU9OLAorICAgICAgICAgICAgICAgIEpka0Nvbm5lY3RvclByb3BlcnRpZXMuREVGQVVMVF9NQVhfQ09OTkVDVElPTlNfUEVSX0RFU1RJTkFUSU9OLCBJbnRlZ2VyLmNsYXNzKTsKKworICAgICAgICBjb25uZWN0aW9uSWRsZVRpbWVvdXQgPSBKZGtDb25uZWN0b3JQcm9wZXJ0aWVzCisgICAgICAgICAgICAgICAgLmdldFZhbHVlKHByb3BlcnRpZXMsIEpka0Nvbm5lY3RvclByb3BlcnRpZXMuQ09OTkVDVElPTl9JRExFX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgICAgICAgICBKZGtDb25uZWN0b3JQcm9wZXJ0aWVzLkRFRkFVTFRfQ09OTkVDVElPTl9JRExFX1RJTUVPVVQsIEludGVnZXIuY2xhc3MpOworCisgICAgICAgIHJlc3BvbnNlVGltZW91dCA9IENsaWVudFByb3BlcnRpZXMuZ2V0VmFsdWUocHJvcGVydGllcywgQ2xpZW50UHJvcGVydGllcy5SRUFEX1RJTUVPVVQsIDAsIEludGVnZXIuY2xhc3MpOworCisgICAgICAgIGNvbm5lY3RUaW1lb3V0ID0gQ2xpZW50UHJvcGVydGllcy5nZXRWYWx1ZShwcm9wZXJ0aWVzLCBDbGllbnRQcm9wZXJ0aWVzLkNPTk5FQ1RfVElNRU9VVCwgMCwgSW50ZWdlci5jbGFzcyk7CisKKyAgICAgICAgaWYgKGNsaWVudC5nZXRTc2xDb250ZXh0KCkgPT0gbnVsbCkgeworICAgICAgICAgICAgc3NsQ29udGV4dCA9IFNzbENvbmZpZ3VyYXRvci5nZXREZWZhdWx0Q29udGV4dCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3NsQ29udGV4dCA9IGNsaWVudC5nZXRTc2xDb250ZXh0KCk7CisgICAgICAgIH0KKworICAgICAgICBob3N0bmFtZVZlcmlmaWVyID0gY2xpZW50LmdldEhvc3RuYW1lVmVyaWZpZXIoKTsKKworICAgICAgICBwcm94eUNvbmZpZ3VyYXRpb24gPSBuZXcgUHJveHlDb25maWd1cmF0aW9uKHByb3BlcnRpZXMpOworCisgICAgICAgIGlmIChMT0dHRVIuaXNMb2dnYWJsZShMZXZlbC5GSU5FU1QpKSB7CisgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLkZJTkVTVCwgTG9jYWxpemF0aW9uTWVzc2FnZXMuQ09OTkVDVE9SX0NPTkZJR1VSQVRJT04odG9TdHJpbmcoKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgaW50IGdldENodW5rU2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIGNodW5rU2l6ZTsKKyAgICB9CisKKyAgICBib29sZWFuIGdldEZvbGxvd1JlZGlyZWN0cygpIHsKKyAgICAgICAgcmV0dXJuIGZvbGxvd1JlZGlyZWN0czsKKyAgICB9CisKKyAgICBpbnQgZ2V0TWF4UmVkaXJlY3RzKCkgeworICAgICAgICByZXR1cm4gbWF4UmVkaXJlY3RzOworICAgIH0KKworICAgIFRocmVhZFBvb2xDb25maWcgZ2V0VGhyZWFkUG9vbENvbmZpZygpIHsKKyAgICAgICAgcmV0dXJuIHRocmVhZFBvb2xDb25maWc7CisgICAgfQorCisgICAgaW50IGdldENvbnRhaW5lcklkbGVUaW1lb3V0KCkgeworICAgICAgICByZXR1cm4gY29udGFpbmVySWRsZVRpbWVvdXQ7CisgICAgfQorCisgICAgaW50IGdldE1heEhlYWRlclNpemUoKSB7CisgICAgICAgIHJldHVybiBtYXhIZWFkZXJTaXplOworICAgIH0KKworICAgIENvb2tpZVBvbGljeSBnZXRDb29raWVQb2xpY3koKSB7CisgICAgICAgIHJldHVybiBjb29raWVQb2xpY3k7CisgICAgfQorCisgICAgaW50IGdldE1heENvbm5lY3Rpb25zUGVyRGVzdGluYXRpb24oKSB7CisgICAgICAgIHJldHVybiBtYXhDb25uZWN0aW9uc1BlckRlc3RpbmF0aW9uOworICAgIH0KKworICAgIGludCBnZXRDb25uZWN0aW9uSWRsZVRpbWVvdXQoKSB7CisgICAgICAgIHJldHVybiBjb25uZWN0aW9uSWRsZVRpbWVvdXQ7CisgICAgfQorCisgICAgU1NMQ29udGV4dCBnZXRTc2xDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gc3NsQ29udGV4dDsKKyAgICB9CisKKyAgICBIb3N0bmFtZVZlcmlmaWVyIGdldEhvc3RuYW1lVmVyaWZpZXIoKSB7CisgICAgICAgIHJldHVybiBob3N0bmFtZVZlcmlmaWVyOworICAgIH0KKworICAgIGludCBnZXRSZXNwb25zZVRpbWVvdXQoKSB7CisgICAgICAgIHJldHVybiByZXNwb25zZVRpbWVvdXQ7CisgICAgfQorCisgICAgaW50IGdldENvbm5lY3RUaW1lb3V0KCkgeworICAgICAgICByZXR1cm4gY29ubmVjdFRpbWVvdXQ7CisgICAgfQorCisgICAgcHVibGljIFByb3h5Q29uZmlndXJhdGlvbiBnZXRQcm94eUNvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBwcm94eUNvbmZpZ3VyYXRpb247CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJDb25uZWN0b3JDb25maWd1cmF0aW9ueyIKKyAgICAgICAgICAgICAgICArICIsIGNodW5rU2l6ZT0iICsgY2h1bmtTaXplCisgICAgICAgICAgICAgICAgKyAiLCBmb2xsb3dSZWRpcmVjdHM9IiArIGZvbGxvd1JlZGlyZWN0cworICAgICAgICAgICAgICAgICsgIiwgbWF4UmVkaXJlY3RzPSIgKyBtYXhSZWRpcmVjdHMKKyAgICAgICAgICAgICAgICArICIsIHRocmVhZFBvb2xDb25maWc9IiArIHRocmVhZFBvb2xDb25maWcKKyAgICAgICAgICAgICAgICArICIsIGNvbnRhaW5lcklkbGVUaW1lb3V0PSIgKyBjb250YWluZXJJZGxlVGltZW91dAorICAgICAgICAgICAgICAgICsgIiwgbWF4SGVhZGVyU2l6ZT0iICsgbWF4SGVhZGVyU2l6ZQorICAgICAgICAgICAgICAgICsgIiwgY29va2llUG9saWN5PSIgKyBjb29raWVQb2xpY3kKKyAgICAgICAgICAgICAgICArICIsIG1heENvbm5lY3Rpb25zUGVyRGVzdGluYXRpb249IiArIG1heENvbm5lY3Rpb25zUGVyRGVzdGluYXRpb24KKyAgICAgICAgICAgICAgICArICIsIGNvbm5lY3Rpb25JZGxlVGltZW91dD0iICsgY29ubmVjdGlvbklkbGVUaW1lb3V0CisgICAgICAgICAgICAgICAgKyAiLCBzc2xDb250ZXh0PSIgKyBzc2xDb250ZXh0CisgICAgICAgICAgICAgICAgKyAiLCBob3N0bmFtZVZlcmlmaWVyPSIgKyBob3N0bmFtZVZlcmlmaWVyCisgICAgICAgICAgICAgICAgKyAiLCByZXNwb25zZVRpbWVvdXQ9IiArIHJlc3BvbnNlVGltZW91dAorICAgICAgICAgICAgICAgICsgIiwgY29ubmVjdFRpbWVvdXQ9IiArIGNvbm5lY3RUaW1lb3V0CisgICAgICAgICAgICAgICAgKyAiLCBwcm94eUNvbmZpZ3VyYXRpb249IiArIHByb3h5Q29uZmlndXJhdGlvbi50b1N0cmluZygpCisgICAgICAgICAgICAgICAgKyAnfSc7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFByb3h5Q29uZmlndXJhdGlvbiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGNvbmZpZ3VyZWQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGhvc3Q7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IHBvcnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHVzZXJOYW1lOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBwYXNzd29yZDsKKworICAgICAgICBwcml2YXRlIFByb3h5Q29uZmlndXJhdGlvbihNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpIHsKKyAgICAgICAgICAgIFN0cmluZyB1cmlTdHIgPSBDbGllbnRQcm9wZXJ0aWVzLmdldFZhbHVlKHByb3BlcnRpZXMsIENsaWVudFByb3BlcnRpZXMuUFJPWFlfVVJJLCBTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgaWYgKHVyaVN0ciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29uZmlndXJlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGhvc3QgPSBudWxsOworICAgICAgICAgICAgICAgIHBvcnQgPSAtMTsKKyAgICAgICAgICAgICAgICB1c2VyTmFtZSA9IG51bGw7CisgICAgICAgICAgICAgICAgcGFzc3dvcmQgPSBudWxsOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29uZmlndXJlZCA9IHRydWU7CisgICAgICAgICAgICBVUkkgcHJveHlVcmkgPSBVUkkuY3JlYXRlKHVyaVN0cik7CisgICAgICAgICAgICBob3N0ID0gcHJveHlVcmkuZ2V0SG9zdCgpOworCisgICAgICAgICAgICBpZiAocHJveHlVcmkuZ2V0UG9ydCgpID09IC0xKSB7CisgICAgICAgICAgICAgICAgcG9ydCA9IDgwODA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBvcnQgPSBwcm94eVVyaS5nZXRQb3J0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHVzZXJOYW1lID0gSmRrQ29ubmVjdG9yUHJvcGVydGllcy5nZXRWYWx1ZShwcm9wZXJ0aWVzLCBDbGllbnRQcm9wZXJ0aWVzLlBST1hZX1VTRVJOQU1FLCBTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgcGFzc3dvcmQgPSBKZGtDb25uZWN0b3JQcm9wZXJ0aWVzLmdldFZhbHVlKHByb3BlcnRpZXMsIENsaWVudFByb3BlcnRpZXMuUFJPWFlfUEFTU1dPUkQsIFN0cmluZy5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGlzQ29uZmlndXJlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBjb25maWd1cmVkOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGdldEhvc3QoKSB7CisgICAgICAgICAgICByZXR1cm4gaG9zdDsKKyAgICAgICAgfQorCisgICAgICAgIGludCBnZXRQb3J0KCkgeworICAgICAgICAgICAgcmV0dXJuIHBvcnQ7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgZ2V0VXNlck5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdXNlck5hbWU7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgZ2V0UGFzc3dvcmQoKSB7CisgICAgICAgICAgICByZXR1cm4gcGFzc3dvcmQ7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL0NvbnN0YW50cy5qYXZhIGIvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9Db25zdGFudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjNiOGUzCi0tLSAvZGV2L251bGwKKysrIGIvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9Db25zdGFudHMuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lmpkay5jb25uZWN0b3IuaW50ZXJuYWw7CisKKy8qKgorICogQGF1dGhvciBQZXRyIEphbm91Y2ggKHBldHIuamFub3VjaCBhdCBvcmFjbGUuY29tKQorICovCitjbGFzcyBDb25zdGFudHMgeworCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUSU9OID0gIkNvbm5lY3Rpb24iOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVElPTl9DTE9TRSA9ICJDbG9zZSI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBIVFRQUyA9ICJodHRwcyI7CisgICAgc3RhdGljIFN0cmluZyBUUkFOU0ZFUl9FTkNPRElOR19IRUFERVIgPSAiVHJhbnNmZXItRW5jb2RpbmciOworICAgIHN0YXRpYyBTdHJpbmcgVFJBTlNGRVJfRU5DT0RJTkdfQ0hVTktFRCA9ICJjaHVua2VkIjsKKyAgICBzdGF0aWMgU3RyaW5nIENPTlRFTlRfTEVOR1RIID0gIkNvbnRlbnQtTGVuZ3RoIjsKKyAgICBzdGF0aWMgU3RyaW5nIEhPU1QgPSAiSG9zdCI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFEID0gIkhFQUQiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OTkVDVCA9ICJDT05ORUNUIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEdFVCA9ICJHRVQiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1dXX0FVVEhFTlRJQ0FURSA9ICJXV1ctQXV0aGVudGljYXRlIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX0FVVEhFTlRJQ0FURSA9ICJQcm94eS1BdXRoZW50aWNhdGUiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPWFlfQVVUSE9SSVpBVElPTiA9ICJQcm94eS1BdXRob3JpemF0aW9uIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX0NPTk5FQ1RJT04gPSAiUHJveHlDb25uZWN0aW9uIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFRVBfQUxJVkUgPSAia2VlcC1hbGl2ZSI7CisgICAgLyoqCisgICAgICogQmFzaWMgYXV0aGVudGljYXRpb24gc2NoZW1lIGtleS4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0lDID0gIkJhc2ljIjsKKworICAgIC8qKgorICAgICAqIERpZ2VzdCBhdXRoZW50aWNhdGlvbiBzY2hlbWUga2V5LgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElHRVNUID0gIkRpZ2VzdCI7Cit9CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL0Rlc3RpbmF0aW9uQ29ubmVjdGlvblBvb2wuamF2YSBiL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvRGVzdGluYXRpb25Db25uZWN0aW9uUG9vbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YTlhZWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL0Rlc3RpbmF0aW9uQ29ubmVjdGlvblBvb2wuamF2YQpAQCAtMCwwICsxLDQ1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZGsuY29ubmVjdG9yLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5Db29raWVNYW5hZ2VyOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUXVldWU7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TGlua2VkRGVxdWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlOworCisvKioKKyAqIEBhdXRob3IgUGV0ciBKYW5vdWNoIChwZXRyLmphbm91Y2ggYXQgb3JhY2xlLmNvbSkKKyAqLworY2xhc3MgRGVzdGluYXRpb25Db25uZWN0aW9uUG9vbCB7CisKKyAgICBwcml2YXRlIGZpbmFsIENvbm5lY3RvckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbjsKKyAgICBwcml2YXRlIGZpbmFsIFF1ZXVlPEh0dHBDb25uZWN0aW9uPiBpZGxlQ29ubmVjdGlvbnMgPSBuZXcgQ29uY3VycmVudExpbmtlZERlcXVlPD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIFNldDxIdHRwQ29ubmVjdGlvbj4gY29ubmVjdGlvbnMgPSBDb2xsZWN0aW9ucy5uZXdTZXRGcm9tTWFwKG5ldyBDb25jdXJyZW50SGFzaE1hcDw+KCkpOworICAgIHByaXZhdGUgZmluYWwgUXVldWU8UmVxdWVzdFJlY29yZD4gcGVuZGluZ1JlcXVlc3RzID0gbmV3IENvbmN1cnJlbnRMaW5rZWREZXF1ZTw+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8SHR0cENvbm5lY3Rpb24sIFJlcXVlc3RSZWNvcmQ+IHJlcXVlc3RzSW5Qcm9ncmVzcyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIENvb2tpZU1hbmFnZXIgY29va2llTWFuYWdlcjsKKyAgICBwcml2YXRlIGZpbmFsIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSBzY2hlZHVsZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBDb25uZWN0aW9uU3RhdGVMaXN0ZW5lciBjb25uZWN0aW9uU3RhdGVMaXN0ZW5lcjsKKworICAgIHByaXZhdGUgdm9sYXRpbGUgQ29ubmVjdGlvbkNsb3NlTGlzdGVuZXIgY29ubmVjdGlvbkNsb3NlTGlzdGVuZXI7CisKKyAgICBwcml2YXRlIGludCBjb25uZWN0aW9uQ291bnRlciA9IDA7CisgICAgcHJpdmF0ZSBib29sZWFuIGNsb3NlZCA9IGZhbHNlOworCisgICAgRGVzdGluYXRpb25Db25uZWN0aW9uUG9vbChDb25uZWN0b3JDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb29raWVNYW5hZ2VyIGNvb2tpZU1hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2Ugc2NoZWR1bGVyKSB7CisgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247CisgICAgICAgIHRoaXMuY29va2llTWFuYWdlciA9IGNvb2tpZU1hbmFnZXI7CisgICAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyOworICAgICAgICB0aGlzLmNvbm5lY3Rpb25TdGF0ZUxpc3RlbmVyID0gbmV3IENvbm5lY3Rpb25TdGF0ZUxpc3RlbmVyKCk7CisgICAgfQorCisgICAgdm9pZCBzZXRDb25uZWN0aW9uQ2xvc2VMaXN0ZW5lcihDb25uZWN0aW9uQ2xvc2VMaXN0ZW5lciBjb25uZWN0aW9uQ2xvc2VMaXN0ZW5lcikgeworICAgICAgICB0aGlzLmNvbm5lY3Rpb25DbG9zZUxpc3RlbmVyID0gY29ubmVjdGlvbkNsb3NlTGlzdGVuZXI7CisgICAgfQorCisgICAgdm9pZCBzZW5kKEh0dHBSZXF1ZXN0IGh0dHBSZXF1ZXN0LCBDb21wbGV0aW9uSGFuZGxlcjxIdHRwUmVzcG9uc2U+IGNvbXBsZXRpb25IYW5kbGVyKSB7CisgICAgICAgIHBlbmRpbmdSZXF1ZXN0cy5hZGQobmV3IFJlcXVlc3RSZWNvcmQoaHR0cFJlcXVlc3QsIGNvbXBsZXRpb25IYW5kbGVyKSk7CisgICAgICAgIHByb2Nlc3NQZW5kaW5nUmVxdWVzdHMoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1BlbmRpbmdSZXF1ZXN0cyhIdHRwQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7CisgICAgICAgIEh0dHBSZXF1ZXN0IGh0dHBSZXF1ZXN0OworICAgICAgICBDb21wbGV0aW9uSGFuZGxlcjxIdHRwUmVzcG9uc2U+IGNvbXBsZXRpb25IYW5kbGVyOworCisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAvKiB0aGlzIGlzIHN5bmNocm9uaXplZCBzbyB0aGF0IGFub3RoZXIgdGhyZWFkIGRvZXMgbm90IHN0ZWFsIHRoZSBwZW5kaW5nIHJlcXVlc3QgYXQgdGhlIGhlYWQgb2YgdGhlIHF1ZXVlCisgICAgICAgICAgIHdoaWxlIHdlIGludmVzdGlnYXRlIGlmIHdlIGNhbiBleGVjdXRlIGl0LiAqLworICAgICAgICAgICAgUmVxdWVzdFJlY29yZCBwZW5kaW5nSGVhZCA9IHBlbmRpbmdSZXF1ZXN0cy5wb2xsKCk7CisgICAgICAgICAgICBpZiAocGVuZGluZ0hlYWQgPT0gbnVsbCkgeworCisgICAgICAgICAgICAgICAgaWRsZUNvbm5lY3Rpb25zLmFkZChjb25uZWN0aW9uKTsKKworICAgICAgICAgICAgICAgIC8vIG5vIHBlbmRpbmcgcmVxdWVzdHMKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGh0dHBSZXF1ZXN0ID0gcGVuZGluZ0hlYWQucmVxdWVzdDsKKyAgICAgICAgICAgIGNvbXBsZXRpb25IYW5kbGVyID0gcGVuZGluZ0hlYWQuY29tcGxldGlvbkhhbmRsZXI7CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiB0aGVyZSB3YXMgYSBjb25uZWN0aW9uIGF2YWlsYWJsZSBqdXN0IHVzZSBpdAorICAgICAgICByZXF1ZXN0c0luUHJvZ3Jlc3MucHV0KGNvbm5lY3Rpb24sIG5ldyBSZXF1ZXN0UmVjb3JkKGh0dHBSZXF1ZXN0LCBjb21wbGV0aW9uSGFuZGxlcikpOworICAgICAgICBjb25uZWN0aW9uLnNlbmQoaHR0cFJlcXVlc3QpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzUGVuZGluZ1JlcXVlc3RzKCkgeworICAgICAgICBIdHRwQ29ubmVjdGlvbiBjb25uZWN0aW9uOworICAgICAgICBIdHRwUmVxdWVzdCBodHRwUmVxdWVzdDsKKyAgICAgICAgQ29tcGxldGlvbkhhbmRsZXI8SHR0cFJlc3BvbnNlPiBjb21wbGV0aW9uSGFuZGxlcjsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIC8qIHRoaXMgaXMgc3luY2hyb25pemVkIHNvIHRoYXQgYW5vdGhlciB0aHJlYWQgZG9lcyBub3Qgc3RlYWwgdGhlIHBlbmRpbmcgcmVxdWVzdCBhdCB0aGUgaGVhZCBvZiB0aGUgcXVldWUKKyAgICAgICAgICAgIHdoaWxlIHdlIGludmVzdGlnYXRlIGlmIHdlIGNhbiBleGVjdXRlIGl0LiAqLworICAgICAgICAgICAgUmVxdWVzdFJlY29yZCBwZW5kaW5nSGVhZCA9IHBlbmRpbmdSZXF1ZXN0cy5wZWVrKCk7CisgICAgICAgICAgICBpZiAocGVuZGluZ0hlYWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIG5vIHBlbmRpbmcgcmVxdWVzdHMKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGh0dHBSZXF1ZXN0ID0gcGVuZGluZ0hlYWQucmVxdWVzdDsKKyAgICAgICAgICAgIGNvbXBsZXRpb25IYW5kbGVyID0gcGVuZGluZ0hlYWQuY29tcGxldGlvbkhhbmRsZXI7CisKKyAgICAgICAgICAgIGNvbm5lY3Rpb24gPSBpZGxlQ29ubmVjdGlvbnMucG9sbCgpOworICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHBlbmRpbmdSZXF1ZXN0cy5wb2xsKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29ubmVjdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBpZiB0aGVyZSB3YXMgYSBjb25uZWN0aW9uIGF2YWlsYWJsZSBqdXN0IHVzZSBpdAorICAgICAgICAgICAgcmVxdWVzdHNJblByb2dyZXNzLnB1dChjb25uZWN0aW9uLCBuZXcgUmVxdWVzdFJlY29yZChodHRwUmVxdWVzdCwgY29tcGxldGlvbkhhbmRsZXIpKTsKKyAgICAgICAgICAgIGNvbm5lY3Rpb24uc2VuZChodHRwUmVxdWVzdCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiB0aGVyZSB3YXMgbm90IGEgY29ubmVjdGlvbiBhdmFpbGFibGUga2VlcCB0aGlzIHJlcXVlc3RzIGluIHBlbmRpbmcgbGlzdCBhbmQgdHJ5IHRvIGNyZWF0ZSBhIGNvbm5lY3Rpb24KKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAvLyBzeW5jaHJvbml6ZWQgYmVjYXVzZSBvdGhlciB0aHJlYWQgbWlnaHQgb3Blbi9jbG9zZSBjb25uZWN0aW9ucywgc28gd2UgaGF2ZSB0byBtYWtlIHN1cmUgd2UgZ2V0IHRoZSBsaW1pdHMgcmlnaHQuCisKKyAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uLmdldE1heENvbm5lY3Rpb25zUGVyRGVzdGluYXRpb24oKSA9PSBjb25uZWN0aW9uQ291bnRlcikgeworICAgICAgICAgICAgICAgIC8vIHdlIGFyZSBhdCB0aGUgbGltaXQgZm9yIHRoaXMgZGVzdGluYXRpb24sIGp1c3Qgd2FpdCBmb3IgYSBjb25uZWN0aW9uIHRvIGJlY29tZSBpZGxlIG9yIGNsb3NlCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjcmVhdGUgYSBjb25uZWN0aW9uCisgICAgICAgICAgICBjb25uZWN0aW9uID0gbmV3IEh0dHBDb25uZWN0aW9uKGh0dHBSZXF1ZXN0LmdldFVyaSgpLCBjb29raWVNYW5hZ2VyLCBjb25maWd1cmF0aW9uLCBzY2hlZHVsZXIsCisgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25TdGF0ZUxpc3RlbmVyKTsKKyAgICAgICAgICAgIGNvbm5lY3Rpb25zLmFkZChjb25uZWN0aW9uKTsKKyAgICAgICAgICAgIGNvbm5lY3Rpb25Db3VudGVyKys7CisgICAgICAgIH0KKworICAgICAgICAvLyB3ZSBkb24ndCB3YW50IHRvIGNvbm5lY3QgaW5zaWRlIHRoZSBzeW5jaHJvbml6ZWQgYmxvY2sKKyAgICAgICAgY29ubmVjdGlvbi5jb25uZWN0KCk7CisgICAgfQorCisgICAgc3luY2hyb25pemVkIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIGlmIChjbG9zZWQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGNsb3NlZCA9IHRydWU7CisKKyAgICAgICAgY29ubmVjdGlvbnMuZm9yRWFjaChIdHRwQ29ubmVjdGlvbjo6Y2xvc2UpOworICAgIH0KKworICAgIHByaXZhdGUgUmVxdWVzdFJlY29yZCBnZXRSZXF1ZXN0KEh0dHBDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKKyAgICAgICAgUmVxdWVzdFJlY29yZCByZXF1ZXN0UmVjb3JkID0gcmVxdWVzdHNJblByb2dyZXNzLmdldChjb25uZWN0aW9uKTsKKyAgICAgICAgaWYgKHJlcXVlc3RSZWNvcmQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUmVxdWVzdCBub3QgZm91bmQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXF1ZXN0UmVjb3JkOworICAgIH0KKworICAgIHByaXZhdGUgUmVxdWVzdFJlY29yZCByZW1vdmVSZXF1ZXN0KEh0dHBDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKKyAgICAgICAgUmVxdWVzdFJlY29yZCByZXF1ZXN0UmVjb3JkID0gcmVxdWVzdHNJblByb2dyZXNzLmdldChjb25uZWN0aW9uKTsKKyAgICAgICAgaWYgKHJlcXVlc3RSZWNvcmQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUmVxdWVzdCBub3QgZm91bmQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXF1ZXN0UmVjb3JkOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjbGVhbkNsb3NlZENvbm5lY3Rpb24oSHR0cENvbm5lY3Rpb24gY29ubmVjdGlvbikgeworICAgICAgICBpZiAoY2xvc2VkKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBSZXF1ZXN0UmVjb3JkIHBlbmRpbmdSZXF1ZXN0OworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlkbGVDb25uZWN0aW9ucy5yZW1vdmUoY29ubmVjdGlvbik7CisgICAgICAgICAgICBjb25uZWN0aW9ucy5yZW1vdmUoY29ubmVjdGlvbik7CisgICAgICAgICAgICBjb25uZWN0aW9uQ291bnRlci0tOworCisgICAgICAgICAgICBwZW5kaW5nUmVxdWVzdCA9IHBlbmRpbmdSZXF1ZXN0cy5wZWVrKCk7CisgICAgICAgICAgICBpZiAocGVuZGluZ1JlcXVlc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChjb25uZWN0aW9uQ291bnRlciA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25DbG9zZUxpc3RlbmVyLm9uTGFzdENvbm5lY3Rpb25DbG9zZWQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvY2Vzc1BlbmRpbmdSZXF1ZXN0cygpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBoYW5kbGVJbGxlZ2FsU3RhdGVUcmFuc2l0aW9uKEh0dHBDb25uZWN0aW9uLlN0YXRlIG9sZFN0YXRlLCBIdHRwQ29ubmVjdGlvbi5TdGF0ZSBuZXdTdGF0ZSkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJbGxlZ2FsIHN0YXRlIHRyYW5zaXRpb24sIG9sZCBzdGF0ZTogIiArIG9sZFN0YXRlICsgIiBuZXcgc3RhdGU6ICIgKyBuZXdTdGF0ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCByZW1vdmVBbGxQZW5kaW5nV2l0aEVycm9yKFRocm93YWJsZSB0KSB7CisgICAgICAgIGZvciAoUmVxdWVzdFJlY29yZCByZXF1ZXN0UmVjb3JkIDogcGVuZGluZ1JlcXVlc3RzKSB7CisgICAgICAgICAgICByZXF1ZXN0UmVjb3JkLmNvbXBsZXRpb25IYW5kbGVyLmZhaWxlZCh0KTsKKyAgICAgICAgfQorCisgICAgICAgIHBlbmRpbmdSZXF1ZXN0cy5jbGVhcigpOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgQ29ubmVjdGlvblN0YXRlTGlzdGVuZXIgaW1wbGVtZW50cyBIdHRwQ29ubmVjdGlvbi5TdGF0ZUNoYW5nZUxpc3RlbmVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TdGF0ZUNoYW5nZWQoSHR0cENvbm5lY3Rpb24gY29ubmVjdGlvbiwgSHR0cENvbm5lY3Rpb24uU3RhdGUgb2xkU3RhdGUsIEh0dHBDb25uZWN0aW9uLlN0YXRlIG5ld1N0YXRlKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG5ld1N0YXRlKSB7CisKKyAgICAgICAgICAgICAgICBjYXNlIElETEU6IHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChvbGRTdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSRUNFSVZFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVElORzogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NQZW5kaW5nUmVxdWVzdHMoY29ubmVjdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlSWxsZWdhbFN0YXRlVHJhbnNpdGlvbihvbGRTdGF0ZSwgbmV3U3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgUkVDRUlWRUQ6IHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChvbGRTdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSRUNFSVZJTkdfSEVBREVSOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdFJlY29yZCByZXF1ZXN0ID0gcmVtb3ZlUmVxdWVzdChjb25uZWN0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmNvbXBsZXRpb25IYW5kbGVyLmNvbXBsZXRlZChjb25uZWN0aW9uLmdldEh0dFJlc3BvbnNlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSRUNFSVZJTkdfQk9EWTogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZVJlcXVlc3QoY29ubmVjdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlSWxsZWdhbFN0YXRlVHJhbnNpdGlvbihvbGRTdGF0ZSwgbmV3U3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgUkVDRUlWSU5HX0JPRFk6IHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChvbGRTdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSRUNFSVZJTkdfSEVBREVSOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdFJlY29yZCByZXF1ZXN0ID0gZ2V0UmVxdWVzdChjb25uZWN0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LnJlc3BvbnNlID0gY29ubmVjdGlvbi5nZXRIdHRSZXNwb25zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuY29tcGxldGlvbkhhbmRsZXIuY29tcGxldGVkKGNvbm5lY3Rpb24uZ2V0SHR0UmVzcG9uc2UoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlSWxsZWdhbFN0YXRlVHJhbnNpdGlvbihvbGRTdGF0ZSwgbmV3U3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgRVJST1I6IHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChvbGRTdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTRU5ESU5HX1JFUVVFU1Q6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0UmVjb3JkIHJlcXVlc3QgPSByZW1vdmVSZXF1ZXN0KGNvbm5lY3Rpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuY29tcGxldGlvbkhhbmRsZXIuZmFpbGVkKGNvbm5lY3Rpb24uZ2V0RXJyb3IoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJFQ0VJVklOR19IRUFERVI6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0UmVjb3JkIHJlcXVlc3QgPSByZW1vdmVSZXF1ZXN0KGNvbm5lY3Rpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuY29tcGxldGlvbkhhbmRsZXIuZmFpbGVkKGNvbm5lY3Rpb24uZ2V0RXJyb3IoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJFQ0VJVklOR19CT0RZOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdHNJblByb2dyZXNzLnJlbW92ZShjb25uZWN0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVElORzogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUFsbFBlbmRpbmdXaXRoRXJyb3IoY29ubmVjdGlvbi5nZXRFcnJvcigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLmdldEVycm9yKCkucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlSWxsZWdhbFN0YXRlVHJhbnNpdGlvbihvbGRTdGF0ZSwgbmV3U3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgUkVTUE9OU0VfVElNRU9VVDogeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG9sZFN0YXRlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFJFQ0VJVklOR19IRUFERVI6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0UmVjb3JkIHJlcXVlc3QgPSByZW1vdmVSZXF1ZXN0KGNvbm5lY3Rpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuY29tcGxldGlvbkhhbmRsZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mYWlsZWQobmV3IElPRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlRJTUVPVVRfUkVDRUlWSU5HX1JFU1BPTlNFKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUkVDRUlWSU5HX0JPRFk6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0UmVjb3JkIHJlcXVlc3QgPSByZXF1ZXN0c0luUHJvZ3Jlc3MucmVtb3ZlKGNvbm5lY3Rpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QucmVzcG9uc2UuZ2V0Qm9keVN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubm90aWZ5RXJyb3IobmV3IElPRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlRJTUVPVVRfUkVDRUlWSU5HX1JFU1BPTlNFX0JPRFkoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUlsbGVnYWxTdGF0ZVRyYW5zaXRpb24ob2xkU3RhdGUsIG5ld1N0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIENMT1NFRF9CWV9TRVJWRVI6IHsKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChvbGRTdGF0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTRU5ESU5HX1JFUVVFU1Q6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0UmVjb3JkIHJlcXVlc3QgPSByZW1vdmVSZXF1ZXN0KGNvbm5lY3Rpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuY29tcGxldGlvbkhhbmRsZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mYWlsZWQobmV3IElPRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLkNMT1NFRF9XSElMRV9TRU5ESU5HX1JFUVVFU1QoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSRUNFSVZJTkdfSEVBREVSOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdFJlY29yZCByZXF1ZXN0ID0gcmVtb3ZlUmVxdWVzdChjb25uZWN0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmNvbXBsZXRpb25IYW5kbGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmFpbGVkKG5ldyBJT0V4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5DTE9TRURfV0hJTEVfUkVDRUlWSU5HX1JFU1BPTlNFKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uZ2V0RXJyb3IoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSRUNFSVZJTkdfQk9EWTogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RSZWNvcmQgcmVxdWVzdCA9IHJlcXVlc3RzSW5Qcm9ncmVzcy5yZW1vdmUoY29ubmVjdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5yZXNwb25zZS5nZXRCb2R5U3RyZWFtKCkubm90aWZ5RXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSU9FeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuQ0xPU0VEX1dISUxFX1JFQ0VJVklOR19CT0RZKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uZ2V0RXJyb3IoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDT05ORUNUSU5HOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQWxsUGVuZGluZ1dpdGhFcnJvcihuZXcgSU9FeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuQ09OTkVDVElPTl9DTE9TRUQoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQ0xPU0VEOiB7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAob2xkU3RhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU0VORElOR19SRVFVRVNUOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdFJlY29yZCByZXF1ZXN0ID0gcmVtb3ZlUmVxdWVzdChjb25uZWN0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmNvbXBsZXRpb25IYW5kbGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmFpbGVkKG5ldyBJT0V4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5DTE9TRURfQllfQ0xJRU5UX1dISUxFX1NFTkRJTkcoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFuQ2xvc2VkQ29ubmVjdGlvbihjb25uZWN0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgUkVDRUlWSU5HX0hFQURFUjogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RSZWNvcmQgcmVxdWVzdCA9IHJlbW92ZVJlcXVlc3QoY29ubmVjdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5jb21wbGV0aW9uSGFuZGxlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZhaWxlZChuZXcgSU9FeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuQ0xPU0VEX1dISUxFX1JFQ0VJVklOR19SRVNQT05TRSgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW5DbG9zZWRDb25uZWN0aW9uKGNvbm5lY3Rpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBSRUNFSVZJTkdfQk9EWTogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RSZWNvcmQgcmVxdWVzdCA9IHJlcXVlc3RzSW5Qcm9ncmVzcy5yZW1vdmUoY29ubmVjdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5yZXNwb25zZS5nZXRCb2R5U3RyZWFtKCkubm90aWZ5RXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSU9FeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuQ0xPU0VEX0JZX0NMSUVOVF9XSElMRV9SRUNFSVZJTkdfQk9EWSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLmdldEVycm9yKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhbkNsb3NlZENvbm5lY3Rpb24oY29ubmVjdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW5DbG9zZWRDb25uZWN0aW9uKGNvbm5lY3Rpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVF9USU1FT1VUOiB7CisgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAob2xkU3RhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09OTkVDVElORzogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUFsbFBlbmRpbmdXaXRoRXJyb3IobmV3IElPRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLkNPTk5FQ1RJT05fVElNRU9VVCgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW5DbG9zZWRDb25uZWN0aW9uKGNvbm5lY3Rpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVxdWVzdFJlY29yZCB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBIdHRwUmVxdWVzdCByZXF1ZXN0OworICAgICAgICBwcml2YXRlIGZpbmFsIENvbXBsZXRpb25IYW5kbGVyPEh0dHBSZXNwb25zZT4gY29tcGxldGlvbkhhbmRsZXI7CisgICAgICAgIHByaXZhdGUgSHR0cFJlc3BvbnNlIHJlc3BvbnNlOworCisgICAgICAgIFJlcXVlc3RSZWNvcmQoSHR0cFJlcXVlc3QgcmVxdWVzdCwgQ29tcGxldGlvbkhhbmRsZXI8SHR0cFJlc3BvbnNlPiBjb21wbGV0aW9uSGFuZGxlcikgeworICAgICAgICAgICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDsKKyAgICAgICAgICAgIHRoaXMuY29tcGxldGlvbkhhbmRsZXIgPSBjb21wbGV0aW9uSGFuZGxlcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBEZXN0aW5hdGlvbktleSB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaG9zdDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgcG9ydDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHNlY3VyZTsKKworICAgICAgICBEZXN0aW5hdGlvbktleShVUkkgdXJpKSB7CisgICAgICAgICAgICBob3N0ID0gdXJpLmdldEhvc3QoKTsKKyAgICAgICAgICAgIHBvcnQgPSBVdGlscy5nZXRQb3J0KHVyaSk7CisgICAgICAgICAgICBzZWN1cmUgPSBDb25zdGFudHMuSFRUUFMuZXF1YWxzSWdub3JlQ2FzZSh1cmkuZ2V0U2NoZW1lKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICAgICAgaWYgKHRoaXMgPT0gbykgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRGVzdGluYXRpb25LZXkgdGhhdCA9IChEZXN0aW5hdGlvbktleSkgbzsKKworICAgICAgICAgICAgcmV0dXJuIHBvcnQgPT0gdGhhdC5wb3J0ICYmIHNlY3VyZSA9PSB0aGF0LnNlY3VyZSAmJiBob3N0LmVxdWFscyh0aGF0Lmhvc3QpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICBpbnQgcmVzdWx0ID0gaG9zdC5oYXNoQ29kZSgpOworICAgICAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyBwb3J0OworICAgICAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyAoc2VjdXJlID8gMSA6IDApOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGludGVyZmFjZSBDb25uZWN0aW9uQ2xvc2VMaXN0ZW5lciB7CisKKyAgICAgICAgdm9pZCBvbkxhc3RDb25uZWN0aW9uQ2xvc2VkKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9GaWx0ZXIuamF2YSBiL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQyZTY4YQotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvRmlsdGVyLmphdmEKQEAgLTAsMCArMSwyMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamRrLmNvbm5lY3Rvci5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEubmV0LlNvY2tldEFkZHJlc3M7CisKKy8qKgorICogQSBmaWx0ZXIgY2FuIGFkZCBmdW5jdGlvbmFsaXR5IHRvIEpESyBjbGllbnQgdHJhbnNwb3J0LiBGaWx0ZXJzIGFyZSBjb21wb3NlZCB0b2dldGhlciB0bworICogY3JlYXRlIEpESyBjbGllbnQgdHJhbnNwb3J0LgorICoKKyAqIEBhdXRob3IgUGV0ciBKYW5vdWNoIChwZXRyLmphbm91Y2ggYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK2NsYXNzIEZpbHRlcjxVUF9JTiwgVVBfT1VULCBET1dOX09VVCwgRE9XTl9JTj4geworCisgICAgcHJvdGVjdGVkIHZvbGF0aWxlIEZpbHRlcjw/LCA/LCBVUF9JTiwgVVBfT1VUPiB1cHN0cmVhbUZpbHRlciA9IG51bGw7CisgICAgcHJvdGVjdGVkIGZpbmFsIEZpbHRlcjxET1dOX09VVCwgRE9XTl9JTiwgPywgPz4gZG93bnN0cmVhbUZpbHRlcjsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGRvd25zdHJlYW1GaWx0ZXIgZG93bnN0cmVhbSBmaWx0ZXIuIEFjY2Vzc2libGUgZGlyZWN0bHkgYXMge0BsaW5rICNkb3duc3RyZWFtRmlsdGVyfSBwcm90ZWN0ZWQgZmllbGQuCisgICAgICovCisgICAgRmlsdGVyKEZpbHRlcjxET1dOX09VVCwgRE9XTl9JTiwgPywgPz4gZG93bnN0cmVhbUZpbHRlcikgeworICAgICAgICB0aGlzLmRvd25zdHJlYW1GaWx0ZXIgPSBkb3duc3RyZWFtRmlsdGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm0gd3JpdGUgb3BlcmF0aW9uIGZvciB0aGlzIGZpbHRlciBhbmQgaW52b2tlcyB3cml0ZSBtZXRob2Qgb24gdGhlIG5leHQgZmlsdGVyIGluIHRoZSBmaWx0ZXIgY2hhaW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGF0YSAgICAgICAgICAgICAgb24gd2hpY2ggd3JpdGUgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZC4KKyAgICAgKiBAcGFyYW0gY29tcGxldGlvbkhhbmRsZXIgd2lsbCBiZSBpbnZva2VkIHdoZW4gdGhlIHdyaXRlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWQgb3IgaGFzIGZhaWxlZC4KKyAgICAgKi8KKyAgICB2b2lkIHdyaXRlKFVQX0lOIGRhdGEsIENvbXBsZXRpb25IYW5kbGVyPFVQX0lOPiBjb21wbGV0aW9uSGFuZGxlcikgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlIHRoZSBmaWx0ZXIsIGludm9rZXMgY2xvc2Ugb3BlcmF0aW9uIG9uIHRoZSBuZXh0IGZpbHRlciBpbiB0aGUgZmlsdGVyIGNoYWluLgorICAgICAqIDxwLz4KKyAgICAgKiBUaGUgZmlsdGVyIGlzIGV4cGVjdGVkIHRvIGNsZWFuIHVwIGFueSBhbGxvY2F0ZWQgcmVzb3VyY2VzIGFuZCBwYXNzIHRoZSBpbnZvY2F0aW9uIHRvIGRvd25zdHJlYW0gZmlsdGVyLgorICAgICAqLworICAgIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIGlmIChkb3duc3RyZWFtRmlsdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRvd25zdHJlYW1GaWx0ZXIuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNpZ25hbCB0byB0dXJuIG9uIFNTTCwgaXQgaXMgcGFzc2VkIG9uIGluIHRoZSBmaWx0ZXIgY2hhaW4gdW50aWwgYSBmaWx0ZXIgcmVzcG9uc2libGUgZm9yIFNTTCBpcyByZWFjaGVkLgorICAgICAqLworICAgIHZvaWQgc3RhcnRTc2woKSB7CisgICAgICAgIGlmIChkb3duc3RyZWFtRmlsdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRvd25zdHJlYW1GaWx0ZXIuc3RhcnRTc2woKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYXRlIGNvbm5lY3QuCisgICAgICogPHAvPgorICAgICAqIElmIHRoZSB7QGxpbmsgRmlsdGVyfSBuZWVkcyB0byBkbyBzb21ldGhpbmcgZHVyaW5nIHRoaXMgcGhhc2UsIGl0IG11c3QgaW1wbGVtZW50IHtAbGluaworICAgICAqICNoYW5kbGVDb25uZWN0KFNvY2tldEFkZHJlc3MsIEZpbHRlcil9CisgICAgICogbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIGFkZHJlc3MgICAgICAgIGFuIGFkZHJlc3Mgd2hlcmUgdG8gY29ubmVjdCAoc2VydmVyIG9yIHByb3h5KS4KKyAgICAgKiBAcGFyYW0gdXBzdHJlYW1GaWx0ZXIgYSBmaWx0ZXIgcG9zaXRpb25lZCB1cHN0cmVhbS4KKyAgICAgKi8KKyAgICB2b2lkIGNvbm5lY3QoU29ja2V0QWRkcmVzcyBhZGRyZXNzLCBGaWx0ZXI8PywgPywgVVBfSU4sIFVQX09VVD4gdXBzdHJlYW1GaWx0ZXIpIHsKKyAgICAgICAgdGhpcy51cHN0cmVhbUZpbHRlciA9IHVwc3RyZWFtRmlsdGVyOworCisgICAgICAgIGhhbmRsZUNvbm5lY3QoYWRkcmVzcywgdXBzdHJlYW1GaWx0ZXIpOworCisgICAgICAgIGlmIChkb3duc3RyZWFtRmlsdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGRvd25zdHJlYW1GaWx0ZXIuY29ubmVjdChhZGRyZXNzLCB0aGlzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgaXMgY2FsbGVkIHdoZW4gYSBjb25uZWN0aW9uIGlzIHNldCB1cC4KKyAgICAgKiBUaGlzIGV2ZW50IHRyYXZlbHMgdXAgaW4gdGhlIGZpbHRlciBjaGFpbi4KKyAgICAgKiA8cC8+CisgICAgICogSWYgdGhlIHtAbGluayBGaWx0ZXJ9IG5lZWRzIHRvIHByb2Nlc3MgdGhpcyBldmVudCwgaXQgbXVzdCBpbXBsZW1lbnQge0BsaW5rICNwcm9jZXNzQ29ubmVjdCgpfSBtZXRob2QuCisgICAgICovCisgICAgdm9pZCBvbkNvbm5lY3QoKSB7CisgICAgICAgIHByb2Nlc3NDb25uZWN0KCk7CisKKyAgICAgICAgaWYgKHVwc3RyZWFtRmlsdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHVwc3RyZWFtRmlsdGVyLm9uQ29ubmVjdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBpcyBjYWxsZWQgd2hlbiBzb21lIGRhdGEgaXMgcmVhZC4KKyAgICAgKiA8cC8+CisgICAgICogSWYgdGhlIHtAbGluayBGaWx0ZXJ9IG5lZWRzIHRvIHByb2Nlc3MgdGhpcyBldmVudCwgaXQgbXVzdCBpbXBsZW1lbnQge0BsaW5rICNvblJlYWQoT2JqZWN0KX0gKCl9IG1ldGhvZC4KKyAgICAgKiBJZiB0aGUgbWV0aG9kIHJldHVybnMge0Bjb2RlIHRydWV9LCB0aGUgcHJvY2Vzc2luZyB3aWxsIGNvbnRpbnVlIHdpdGggdXBzdHJlYW0gZmlsdGVyczsgaWYgdGhlIG1ldGhvZCBpbnZvY2F0aW9uCisgICAgICogcmV0dXJucyB7QGNvZGUgZmFsc2V9LCB0aGUgcHJvY2Vzc2luZyB3b24ndCBjb250aW51ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRhIHRoYXQgaGFzIGJlZW4gcmVhZC4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBmaW5hbCB2b2lkIG9uUmVhZChET1dOX0lOIGRhdGEpIHsKKyAgICAgICAgaWYgKHByb2Nlc3NSZWFkKGRhdGEpKSB7CisgICAgICAgICAgICBpZiAodXBzdHJlYW1GaWx0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFVQX09VVCBfZGF0YTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBfZGF0YSA9IChVUF9PVVQpIGRhdGE7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2Fubm90IHBhc3MgbWVzc2FnZSBvZiBkaWZmZXJlbnQgdHlwZSBmcm9tIGZpbHRlciBpbnB1dCB0byBmaWx0ZXIgb3V0cHV0Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHVwc3RyZWFtRmlsdGVyLm9uUmVhZChfZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbiBldmVudCBsaXN0ZW5lciB0aGF0IGlzIGNhbGxlZCB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZCBieSB0aGUgcGVlci4KKyAgICAgKiA8cC8+CisgICAgICogSWYgdGhlIHtAbGluayBGaWx0ZXJ9IG5lZWRzIHRvIHByb2Nlc3MgdGhpcyBldmVudCwgaXQgbXVzdCBpbXBsZW1lbnQge0BsaW5rICNwcm9jZXNzQ29ubmVjdGlvbkNsb3NlZCgpfSBtZXRob2QuCisgICAgICovCisgICAgZmluYWwgdm9pZCBvbkNvbm5lY3Rpb25DbG9zZWQoKSB7CisgICAgICAgIHByb2Nlc3NDb25uZWN0aW9uQ2xvc2VkKCk7CisKKyAgICAgICAgaWYgKHVwc3RyZWFtRmlsdGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHVwc3RyZWFtRmlsdGVyLm9uQ29ubmVjdGlvbkNsb3NlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQW4gZXZlbnQgbGlzdGVuZXIgdGhhdCBpcyBjYWxsZWQsIHdoZW4gU1NMIGNvbXBsZXRlcyBpdHMgaGFuZHNoYWtlLgorICAgICAqIDxwLz4KKyAgICAgKiBJZiB0aGUge0BsaW5rIEZpbHRlcn0gbmVlZHMgdG8gcHJvY2VzcyB0aGlzIGV2ZW50LCBpdCBtdXN0IGltcGxlbWVudCB7QGxpbmsgI3Byb2Nlc3NTc2xIYW5kc2hha2VDb21wbGV0ZWQoKX0gbWV0aG9kLgorICAgICAqLworICAgIGZpbmFsIHZvaWQgb25Tc2xIYW5kc2hha2VDb21wbGV0ZWQoKSB7CisgICAgICAgIHByb2Nlc3NTc2xIYW5kc2hha2VDb21wbGV0ZWQoKTsKKworICAgICAgICBpZiAodXBzdHJlYW1GaWx0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdXBzdHJlYW1GaWx0ZXIub25Tc2xIYW5kc2hha2VDb21wbGV0ZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFuIGV2ZW50IGxpc3RlbmVyIHRoYXQgaXMgY2FsbGVkIHdoZW4gYW4gZXJyb3IgaGFzIG9jY3VycmVkLgorICAgICAqIDxwLz4KKyAgICAgKiBFcnJvcnMgdHJhdmVsIGluIGRpcmVjdGlvbiBmcm9tIGRvd25zdHJlYW0gZmlsdGVyIHRvIHVwc3RyZWFtIGZpbHRlci4KKyAgICAgKiA8cC8+CisgICAgICogSWYgdGhlIHtAbGluayBGaWx0ZXJ9IG5lZWRzIHRvIHByb2Nlc3MgdGhpcyBldmVudCwgaXQgbXVzdCBpbXBsZW1lbnQge0BsaW5rICNwcm9jZXNzRXJyb3IoVGhyb3dhYmxlKX0gbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIHQgYW4gZXJyb3IgdGhhdCBoYXMgb2NjdXJyZWQuCisgICAgICovCisgICAgZmluYWwgdm9pZCBvbkVycm9yKFRocm93YWJsZSB0KSB7CisgICAgICAgIHByb2Nlc3NFcnJvcih0KTsKKworICAgICAgICBpZiAodXBzdHJlYW1GaWx0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgdXBzdHJlYW1GaWx0ZXIub25FcnJvcih0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEhhbmRsZSB7QGxpbmsgI2Nvbm5lY3QoU29ja2V0QWRkcmVzcywgRmlsdGVyKX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRkcmVzcyAgICAgICAgYW4gYWRkcmVzcyB3aGVyZSB0byBjb25uZWN0IChzZXJ2ZXIgb3IgcHJveHkpLgorICAgICAqIEBwYXJhbSB1cHN0cmVhbUZpbHRlciBhIGZpbHRlciBwb3NpdGlvbmVkIHVwc3RyZWFtLgorICAgICAqIEBzZWUgI2Nvbm5lY3QoU29ja2V0QWRkcmVzcywgRmlsdGVyKQorICAgICAqLworICAgIHZvaWQgaGFuZGxlQ29ubmVjdChTb2NrZXRBZGRyZXNzIGFkZHJlc3MsIEZpbHRlciB1cHN0cmVhbUZpbHRlcikgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2Nlc3Mge0BsaW5rICNvbkNvbm5lY3QoKX0uCisgICAgICoKKyAgICAgKiBAc2VlICNvbkNvbm5lY3QoKQorICAgICAqLworICAgIHZvaWQgcHJvY2Vzc0Nvbm5lY3QoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvY2VzcyB7QGxpbmsgI29uUmVhZChPYmplY3QpfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRhIHJlYWQgZGF0YS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZGF0YSBzaG91bGQgYmUgc2VudCB0byBwcm9jZXNzaW5nIHRvIHVwcGVyIGZpbHRlciBpbiB0aGUgY2hhaW4sIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEBzZWUgI29uUmVhZChPYmplY3QpLgorICAgICAqLworICAgIGJvb2xlYW4gcHJvY2Vzc1JlYWQoRE9XTl9JTiBkYXRhKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2Nlc3Mge0BsaW5rICNvbkNvbm5lY3Rpb25DbG9zZWQoKX0uCisgICAgICoKKyAgICAgKiBAc2VlICNvbkNvbm5lY3Rpb25DbG9zZWQoKQorICAgICAqLworICAgIHZvaWQgcHJvY2Vzc0Nvbm5lY3Rpb25DbG9zZWQoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvY2VzcyB7QGxpbmsgI29uU3NsSGFuZHNoYWtlQ29tcGxldGVkKCl9LgorICAgICAqCisgICAgICogQHNlZSAjb25Tc2xIYW5kc2hha2VDb21wbGV0ZWQoKQorICAgICAqLworICAgIHZvaWQgcHJvY2Vzc1NzbEhhbmRzaGFrZUNvbXBsZXRlZCgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHtAbGluayAjb25FcnJvcihUaHJvd2FibGUpfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0IGFuIGVycm9yIHRoYXQgaGFzIG9jY3VycmVkLgorICAgICAqIEBzZWUgI29uRXJyb3IoVGhyb3dhYmxlKQorICAgICAqLworICAgIHZvaWQgcHJvY2Vzc0Vycm9yKFRocm93YWJsZSB0KSB7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL0h0dHBDb25uZWN0aW9uLmphdmEgYi9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL0h0dHBDb25uZWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ2YzNiNAotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvSHR0cENvbm5lY3Rpb24uamF2YQpAQCAtMCwwICsxLDQ1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZGsuY29ubmVjdG9yLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5Db29raWVNYW5hZ2VyOworaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC5uZXQuc3NsLlNTTENvbnRleHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5Tc2xDb25maWd1cmF0b3I7CisKKy8qKgorICogQGF1dGhvciBQZXRyIEphbm91Y2ggKHBldHIuamFub3VjaCBhdCBvcmFjbGUuY29tKQorICovCitjbGFzcyBIdHRwQ29ubmVjdGlvbiB7CisKKyAgICAvKioKKyAgICAgKiBJbnB1dCBidWZmZXIgdGhhdCBpcyB1c2VkIGJ5IHtAbGluayBUcmFuc3BvcnRGaWx0ZXJ9IHdoZW4gU1NMIGlzIHR1cm5lZCBvbi4KKyAgICAgKiBUaGUgc2l6ZSBjYW5ub3QgYmUgc21hbGxlciB0aGFuIGEgbWF4aW1hbCBzaXplIG9mIGEgU1NMIHBhY2tldCwgd2hpY2ggaXMgMTZrQiBmb3IgcGF5bG9hZCArIGhlYWRlciwgYmVjYXVzZQorICAgICAqIHtAbGluayBTc2xGaWx0ZXJ9IGRvZXMgbm90IGhhdmUgaXRzIG93biBidWZmZXIgZm9yIGJ1ZmZlcmluZyBpbmNvbWluZworICAgICAqIGRhdGEgYW5kIHRoZXJlZm9yZSB0aGUgZW50aXJlIFNTTCBwYWNrZXQgbXVzdCBmaXQgaW50byB7QGxpbmsgU3NsRmlsdGVyfQorICAgICAqIGlucHV0IGJ1ZmZlci4KKyAgICAgKiA8cC8+CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNTTF9JTlBVVF9CVUZGRVJfU0laRSA9IDE3XzAwMDsKKyAgICAvKioKKyAgICAgKiBJbnB1dCBidWZmZXIgdGhhdCBpcyB1c2VkIGJ5IHtAbGluayBUcmFuc3BvcnRGaWx0ZXJ9IHdoZW4gU1NMIGlzIG5vdCB0dXJuZWQgb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOUFVUX0JVRkZFUl9TSVpFID0gMjA0ODsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEh0dHBDb25uZWN0aW9uLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBwcml2YXRlIGZpbmFsIEZpbHRlcjxIdHRwUmVxdWVzdCwgSHR0cFJlc3BvbnNlLCBIdHRwUmVxdWVzdCwgSHR0cFJlc3BvbnNlPiBmaWx0ZXJDaGFpbjsKKyAgICBwcml2YXRlIGZpbmFsIENvb2tpZU1hbmFnZXIgY29va2llTWFuYWdlcjsKKyAgICAvLyB3ZSBhcmUgaW50ZXJlc3RlZCBvbmx5IGluIGhvc3QtcG9ydCBwYWlyLCBidXQgVVJJIGlzIGEgY29udmVuaWVudCBob2xkZXIgZm9yIGl0CisgICAgcHJpdmF0ZSBmaW5hbCBVUkkgdXJpOworICAgIHByaXZhdGUgZmluYWwgU3RhdGVDaGFuZ2VMaXN0ZW5lciBzdGF0ZUxpc3RlbmVyOworICAgIHByaXZhdGUgZmluYWwgU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlIHNjaGVkdWxlcjsKKyAgICBwcml2YXRlIGZpbmFsIENvbm5lY3RvckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbjsKKworICAgIHByaXZhdGUgSHR0cFJlcXVlc3QgaHR0cFJlcXVlc3Q7CisgICAgcHJpdmF0ZSBIdHRwUmVzcG9uc2UgaHR0UmVzcG9uc2U7CisgICAgcHJpdmF0ZSBUaHJvd2FibGUgZXJyb3I7CisgICAgdm9sYXRpbGUgU3RhdGUgc3RhdGUgPSBTdGF0ZS5DUkVBVEVEOworCisgICAgLy8gYnkgZGVmYXVsdCB3ZSB0cmVhdCBhbGwgY29ubmVjdGlvbiBhcyBwZXJzaXN0ZW50CisgICAgLy8gdGhpcyBmbGFnIHdpbGwgY2hhbmdlIHRvIGZhbHNlIGlmIHdlIHJlY2VpdmUgIkNvbm5lY3Rpb246IENsb3NlIiBoZWFkZXIKKyAgICBwcml2YXRlIGJvb2xlYW4gcGVyc2lzdGVudENvbm5lY3Rpb24gPSB0cnVlOworCisgICAgcHJpdmF0ZSBGdXR1cmU8Pz4gcmVzcG9uc2VUaW1lb3V0OworICAgIHByaXZhdGUgRnV0dXJlPD8+IGlkbGVUaW1lb3V0OworICAgIHByaXZhdGUgRnV0dXJlPD8+IGNvbm5lY3RUaW1lb3V0OworCisgICAgSHR0cENvbm5lY3Rpb24oVVJJIHVyaSwKKyAgICAgICAgICAgICAgICAgICBDb29raWVNYW5hZ2VyIGNvb2tpZU1hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgQ29ubmVjdG9yQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSBzY2hlZHVsZXIsCisgICAgICAgICAgICAgICAgICAgU3RhdGVDaGFuZ2VMaXN0ZW5lciBzdGF0ZUxpc3RlbmVyKSB7CisgICAgICAgIHRoaXMudXJpID0gdXJpOworICAgICAgICB0aGlzLmNvb2tpZU1hbmFnZXIgPSBjb29raWVNYW5hZ2VyOworICAgICAgICB0aGlzLnN0YXRlTGlzdGVuZXIgPSBzdGF0ZUxpc3RlbmVyOworICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uOworICAgICAgICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjsKKyAgICAgICAgZmlsdGVyQ2hhaW4gPSBjcmVhdGVGaWx0ZXJDaGFpbih1cmksIGNvbmZpZ3VyYXRpb24pOworICAgIH0KKworICAgIHN5bmNocm9uaXplZCB2b2lkIGNvbm5lY3QoKSB7CisgICAgICAgIGlmIChzdGF0ZSAhPSBTdGF0ZS5DUkVBVEVEKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLkhUVFBfQ09OTkVDVElPTl9FU1RBQkxJU0hJTkdfSUxMRUdBTF9TVEFURShzdGF0ZSkpOworICAgICAgICB9CisgICAgICAgIGNoYW5nZVN0YXRlKFN0YXRlLkNPTk5FQ1RJTkcpOworICAgICAgICBzY2hlZHVsZUNvbm5lY3RUaW1lb3V0KCk7CisgICAgICAgIGZpbHRlckNoYWluLmNvbm5lY3QobmV3IEluZXRTb2NrZXRBZGRyZXNzKHVyaS5nZXRIb3N0KCksIFV0aWxzLmdldFBvcnQodXJpKSksIG51bGwpOworICAgIH0KKworICAgIHN5bmNocm9uaXplZCB2b2lkIHNlbmQoZmluYWwgSHR0cFJlcXVlc3QgaHR0cFJlcXVlc3QpIHsKKyAgICAgICAgaWYgKHN0YXRlICE9IFN0YXRlLklETEUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJIdHRwIHJlcXVlc3QgY2Fubm90IGJlIHNlbnQgb3ZlciBhIGNvbm5lY3Rpb24gdGhhdCBpcyBpbiBvdGhlciBzdGF0ZSB0aGFuIElETEUuIEN1cnJlbnQgc3RhdGU6ICIgKyBzdGF0ZSk7CisgICAgICAgIH0KKworICAgICAgICBjYW5jZWxJZGxlVGltZW91dCgpOworCisgICAgICAgIHRoaXMuaHR0cFJlcXVlc3QgPSBodHRwUmVxdWVzdDsKKyAgICAgICAgLy8gY2xlYW4gc3RhdGUgbGVmdCBieSBwcmV2aW91cyByZXF1ZXN0CisgICAgICAgIGh0dFJlc3BvbnNlID0gbnVsbDsKKyAgICAgICAgZXJyb3IgPSBudWxsOworICAgICAgICBwZXJzaXN0ZW50Q29ubmVjdGlvbiA9IHRydWU7CisgICAgICAgIGNoYW5nZVN0YXRlKFN0YXRlLlNFTkRJTkdfUkVRVUVTVCk7CisKKyAgICAgICAgYWRkUmVxdWVzdEhlYWRlcnMoKTsKKworICAgICAgICBmaWx0ZXJDaGFpbi53cml0ZShodHRwUmVxdWVzdCwgbmV3IENvbXBsZXRpb25IYW5kbGVyPEh0dHBSZXF1ZXN0PigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgZmFpbGVkKFRocm93YWJsZSB0aHJvd2FibGUpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcih0aHJvd2FibGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbXBsZXRlZChIdHRwUmVxdWVzdCByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVIZWFkZXJTZW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHN5bmNocm9uaXplZCB2b2lkIGNsb3NlKCkgeworICAgICAgICBpZiAoc3RhdGUgPT0gU3RhdGUuQ0xPU0VEKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBjYW5jZWxBbGxUaW1lb3V0cygpOworICAgICAgICBmaWx0ZXJDaGFpbi5jbG9zZSgpOworICAgICAgICBjaGFuZ2VTdGF0ZShTdGF0ZS5DTE9TRUQpOworICAgIH0KKworICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgaGFuZGxlSGVhZGVyU2VudCgpIHsKKyAgICAgICAgaWYgKHN0YXRlICE9IFN0YXRlLlNFTkRJTkdfUkVRVUVTVCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgc2NoZWR1bGVSZXNwb25zZVRpbWVvdXQoKTsKKworICAgICAgICBpZiAoaHR0cFJlcXVlc3QuZ2V0Qm9keU1vZGUoKSA9PSBIdHRwUmVxdWVzdC5Cb2R5TW9kZS5OT05FCisgICAgICAgICAgICAgICAgfHwgaHR0cFJlcXVlc3QuZ2V0Qm9keU1vZGUoKSA9PSBIdHRwUmVxdWVzdC5Cb2R5TW9kZS5CVUZGRVJFRCkgeworICAgICAgICAgICAgY2hhbmdlU3RhdGUoU3RhdGUuUkVDRUlWSU5HX0hFQURFUik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDaHVua2VkQm9keU91dHB1dFN0cmVhbSBib2R5U3RyZWFtID0gKENodW5rZWRCb2R5T3V0cHV0U3RyZWFtKSBodHRwUmVxdWVzdC5nZXRCb2R5U3RyZWFtKCk7CisgICAgICAgICAgICBib2R5U3RyZWFtLnNldENsb3NlTGlzdGVuZXIoKCkgLT4geworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoSHR0cENvbm5lY3Rpb24udGhpcykgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgIT0gU3RhdGUuU0VORElOR19SRVFVRVNUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2hhbmdlU3RhdGUoU3RhdGUuUkVDRUlWSU5HX0hFQURFUik7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhZGRSZXF1ZXN0SGVhZGVycygpIHsKKyAgICAgICAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBjb29raWVzOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29va2llcyA9IGNvb2tpZU1hbmFnZXIuZ2V0KGh0dHBSZXF1ZXN0LmdldFVyaSgpLCBodHRwUmVxdWVzdC5nZXRIZWFkZXJzKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBoYW5kbGVFcnJvcihlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHVuZm9ydHVuYXRlbHkgQ29va2llTWFuYWdlciByZXR1cm5zICIiQ29va2llIiAtPiBlbXB0eSBsaXN0IiBwYWlyIGlmIHRoZSBjb29raWUgaXMgbm90IHNldAorICAgICAgICBjb29raWVzLmVudHJ5U2V0KCkuc3RyZWFtKCkuZmlsdGVyKGNvb2tpZUhlYWRlciAtPiBjb29raWVIZWFkZXIuZ2V0VmFsdWUoKSAhPSBudWxsICYmICFjb29raWVIZWFkZXIuZ2V0VmFsdWUoKS5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgLmZvckVhY2goY29va2llSGVhZGVyIC0+IGh0dHBSZXF1ZXN0LmdldEhlYWRlcnMoKS5wdXQoY29va2llSGVhZGVyLmdldEtleSgpLCBjb29raWVIZWFkZXIuZ2V0VmFsdWUoKSkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzUmVzcG9uc2VIZWFkZXJzKEh0dHBSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY29va2llTWFuYWdlci5wdXQoaHR0cFJlcXVlc3QuZ2V0VXJpKCksIGh0dFJlc3BvbnNlLmdldEhlYWRlcnMoKSk7CisgICAgICAgIExpc3Q8U3RyaW5nPiBjb25uZWN0aW9uVmFsdWVzID0gcmVzcG9uc2UuZ2V0SGVhZGVyKENvbnN0YW50cy5DT05ORUNUSU9OKTsKKyAgICAgICAgaWYgKGNvbm5lY3Rpb25WYWx1ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgY29ubmVjdGlvblZhbHVlcy5zdHJlYW0oKS5maWx0ZXIoY29ubmVjdGlvblZhbHVlIC0+IGNvbm5lY3Rpb25WYWx1ZS5lcXVhbHNJZ25vcmVDYXNlKENvbnN0YW50cy5DT05ORUNUSU9OX0NMT1NFKSkKKyAgICAgICAgICAgICAgICAgICAgLmZvckVhY2goY29ubmVjdGlvblZhbHVlIC0+IHBlcnNpc3RlbnRDb25uZWN0aW9uID0gZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIEZpbHRlcjxIdHRwUmVxdWVzdCwgSHR0cFJlc3BvbnNlLCBIdHRwUmVxdWVzdCwgSHR0cFJlc3BvbnNlPiBjcmVhdGVGaWx0ZXJDaGFpbihVUkkgdXJpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdG9yQ29uZmlndXJhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uKSB7CisgICAgICAgIGJvb2xlYW4gc2VjdXJlID0gQ29uc3RhbnRzLkhUVFBTLmVxdWFscyh1cmkuZ2V0U2NoZW1lKCkpOworICAgICAgICBGaWx0ZXI8Qnl0ZUJ1ZmZlciwgQnl0ZUJ1ZmZlciwgPywgPz4gc29ja2V0OworCisgICAgICAgIGlmIChzZWN1cmUpIHsKKyAgICAgICAgICAgIFNTTENvbnRleHQgc3NsQ29udGV4dCA9IGNvbmZpZ3VyYXRpb24uZ2V0U3NsQ29udGV4dCgpOworICAgICAgICAgICAgVHJhbnNwb3J0RmlsdGVyIHRyYW5zcG9ydEZpbHRlciA9IG5ldyBUcmFuc3BvcnRGaWx0ZXIoU1NMX0lOUFVUX0JVRkZFUl9TSVpFLCBjb25maWd1cmF0aW9uLmdldFRocmVhZFBvb2xDb25maWcoKSwKKyAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbi5nZXRDb250YWluZXJJZGxlVGltZW91dCgpKTsKKworICAgICAgICAgICAgaWYgKHNzbENvbnRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNzbENvbnRleHQgPSBTc2xDb25maWd1cmF0b3IuZ2V0RGVmYXVsdENvbnRleHQoKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzb2NrZXQgPSBuZXcgU3NsRmlsdGVyKHRyYW5zcG9ydEZpbHRlciwgc3NsQ29udGV4dCwgdXJpLmdldEhvc3QoKSwgY29uZmlndXJhdGlvbi5nZXRIb3N0bmFtZVZlcmlmaWVyKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc29ja2V0ID0gbmV3IFRyYW5zcG9ydEZpbHRlcihJTlBVVF9CVUZGRVJfU0laRSwgY29uZmlndXJhdGlvbi5nZXRUaHJlYWRQb29sQ29uZmlnKCksCisgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uZ2V0Q29udGFpbmVySWRsZVRpbWVvdXQoKSk7CisgICAgICAgIH0KKworICAgICAgICBpbnQgbWF4SGVhZGVyU2l6ZSA9IGNvbmZpZ3VyYXRpb24uZ2V0TWF4SGVhZGVyU2l6ZSgpOworICAgICAgICBIdHRwRmlsdGVyIGh0dHBGaWx0ZXIgPSBuZXcgSHR0cEZpbHRlcihzb2NrZXQsIG1heEhlYWRlclNpemUsIG1heEhlYWRlclNpemUgKyBJTlBVVF9CVUZGRVJfU0laRSk7CisKKyAgICAgICAgQ29ubmVjdG9yQ29uZmlndXJhdGlvbi5Qcm94eUNvbmZpZ3VyYXRpb24gcHJveHlDb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbi5nZXRQcm94eUNvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgaWYgKHByb3h5Q29uZmlndXJhdGlvbi5pc0NvbmZpZ3VyZWQoKSkgeworICAgICAgICAgICAgUHJveHlGaWx0ZXIgcHJveHlGaWx0ZXIgPSBuZXcgUHJveHlGaWx0ZXIoaHR0cEZpbHRlciwgcHJveHlDb25maWd1cmF0aW9uKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ29ubmVjdGlvbkZpbHRlcihwcm94eUZpbHRlcik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3IENvbm5lY3Rpb25GaWx0ZXIoaHR0cEZpbHRlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoYW5nZVN0YXRlKFN0YXRlIG5ld1N0YXRlKSB7CisgICAgICAgIFN0YXRlIG9sZCA9IHN0YXRlOworICAgICAgICBzdGF0ZSA9IG5ld1N0YXRlOworCisgICAgICAgIGlmIChMT0dHRVIuaXNMb2dnYWJsZShMZXZlbC5GSU5FU1QpKSB7CisgICAgICAgICAgICBMT0dHRVIuZmluZXN0KExvY2FsaXphdGlvbk1lc3NhZ2VzLkNPTk5FQ1RJT05fQ0hBTkdJTkdfU1RBVEUodXJpLmdldEhvc3QoKSwgdXJpLmdldFBvcnQoKSwgb2xkLCBuZXdTdGF0ZSkpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGVMaXN0ZW5lci5vblN0YXRlQ2hhbmdlZCh0aGlzLCBvbGQsIG5ld1N0YXRlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2NoZWR1bGVSZXNwb25zZVRpbWVvdXQoKSB7CisgICAgICAgIGlmIChjb25maWd1cmF0aW9uLmdldFJlc3BvbnNlVGltZW91dCgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3BvbnNlVGltZW91dCA9IHNjaGVkdWxlci5zY2hlZHVsZSgoKSAtPiB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKEh0dHBDb25uZWN0aW9uLnRoaXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUgIT0gU3RhdGUuUkVDRUlWSU5HX0hFQURFUiAmJiBzdGF0ZSAhPSBTdGF0ZS5SRUNFSVZJTkdfQk9EWSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmVzcG9uc2VUaW1lb3V0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBjaGFuZ2VTdGF0ZShTdGF0ZS5SRVNQT05TRV9USU1FT1VUKTsKKyAgICAgICAgICAgICAgICBjbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9LCBjb25maWd1cmF0aW9uLmdldFJlc3BvbnNlVGltZW91dCgpLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjYW5jZWxSZXNwb25zZVRpbWVvdXQoKSB7CisgICAgICAgIGlmIChyZXNwb25zZVRpbWVvdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVzcG9uc2VUaW1lb3V0LmNhbmNlbCh0cnVlKTsKKyAgICAgICAgICAgIHJlc3BvbnNlVGltZW91dCA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2NoZWR1bGVDb25uZWN0VGltZW91dCgpIHsKKyAgICAgICAgaWYgKGNvbmZpZ3VyYXRpb24uZ2V0Q29ubmVjdFRpbWVvdXQoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBjb25uZWN0VGltZW91dCA9IHNjaGVkdWxlci5zY2hlZHVsZSgoKSAtPiB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKEh0dHBDb25uZWN0aW9uLnRoaXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUgIT0gU3RhdGUuQ09OTkVDVElORykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29ubmVjdFRpbWVvdXQgPSBudWxsOworICAgICAgICAgICAgICAgIGNoYW5nZVN0YXRlKFN0YXRlLkNPTk5FQ1RfVElNRU9VVCk7CisgICAgICAgICAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwgY29uZmlndXJhdGlvbi5nZXRDb25uZWN0VGltZW91dCgpLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjYW5jZWxDb25uZWN0VGltZW91dCgpIHsKKyAgICAgICAgaWYgKGNvbm5lY3RUaW1lb3V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbm5lY3RUaW1lb3V0LmNhbmNlbCh0cnVlKTsKKyAgICAgICAgICAgIGNvbm5lY3RUaW1lb3V0ID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzY2hlZHVsZUlkbGVUaW1lb3V0KCkgeworICAgICAgICBpZiAoY29uZmlndXJhdGlvbi5nZXRDb25uZWN0aW9uSWRsZVRpbWVvdXQoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZGxlVGltZW91dCA9IHNjaGVkdWxlci5zY2hlZHVsZSgoKSAtPiB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKEh0dHBDb25uZWN0aW9uLnRoaXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUgIT0gU3RhdGUuSURMRSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlkbGVUaW1lb3V0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBjaGFuZ2VTdGF0ZShTdGF0ZS5JRExFX1RJTUVPVVQpOworICAgICAgICAgICAgICAgIGNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sIGNvbmZpZ3VyYXRpb24uZ2V0Q29ubmVjdGlvbklkbGVUaW1lb3V0KCksIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNhbmNlbElkbGVUaW1lb3V0KCkgeworICAgICAgICBpZiAoaWRsZVRpbWVvdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgaWRsZVRpbWVvdXQuY2FuY2VsKHRydWUpOworICAgICAgICAgICAgaWRsZVRpbWVvdXQgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNhbmNlbEFsbFRpbWVvdXRzKCkgeworICAgICAgICBjYW5jZWxDb25uZWN0VGltZW91dCgpOworICAgICAgICBjYW5jZWxJZGxlVGltZW91dCgpOworICAgICAgICBjYW5jZWxSZXNwb25zZVRpbWVvdXQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGhhbmRsZUVycm9yKFRocm93YWJsZSB0KSB7CisgICAgICAgIGNhbmNlbEFsbFRpbWVvdXRzKCk7CisgICAgICAgIGVycm9yID0gdDsKKyAgICAgICAgY2hhbmdlU3RhdGUoU3RhdGUuRVJST1IpOworICAgICAgICBjbG9zZSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGFuZ2VTdGF0ZVRvSWRsZSgpIHsKKyAgICAgICAgc2NoZWR1bGVJZGxlVGltZW91dCgpOworICAgICAgICBjaGFuZ2VTdGF0ZShTdGF0ZS5JRExFKTsKKyAgICB9CisKKyAgICBUaHJvd2FibGUgZ2V0RXJyb3IoKSB7CisgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICB9CisKKyAgICBIdHRwUmVzcG9uc2UgZ2V0SHR0UmVzcG9uc2UoKSB7CisgICAgICAgIHJldHVybiBodHRSZXNwb25zZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGhhbmRsZVJlc3BvbnNlUmVhZCgpIHsKKyAgICAgICAgY2FuY2VsUmVzcG9uc2VUaW1lb3V0KCk7CisgICAgICAgIGNoYW5nZVN0YXRlKFN0YXRlLlJFQ0VJVkVEKTsKKyAgICAgICAgaWYgKCFwZXJzaXN0ZW50Q29ubmVjdGlvbikgeworICAgICAgICAgICAgY2hhbmdlU3RhdGUoU3RhdGUuQ0xPU0VEKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBjaGFuZ2VTdGF0ZVRvSWRsZSgpOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgQ29ubmVjdGlvbkZpbHRlciBleHRlbmRzIEZpbHRlcjxIdHRwUmVxdWVzdCwgSHR0cFJlc3BvbnNlLCBIdHRwUmVxdWVzdCwgSHR0cFJlc3BvbnNlPiB7CisKKyAgICAgICAgQ29ubmVjdGlvbkZpbHRlcihGaWx0ZXI8SHR0cFJlcXVlc3QsIEh0dHBSZXNwb25zZSwgPywgPz4gZG93bnN0cmVhbUZpbHRlcikgeworICAgICAgICAgICAgc3VwZXIoZG93bnN0cmVhbUZpbHRlcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgYm9vbGVhbiBwcm9jZXNzUmVhZChIdHRwUmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoSHR0cENvbm5lY3Rpb24udGhpcykgeworICAgICAgICAgICAgICAgIGlmIChzdGF0ZSAhPSBTdGF0ZS5SRUNFSVZJTkdfSEVBREVSICYmIHN0YXRlICE9IFN0YXRlLlNFTkRJTkdfUkVRVUVTVCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IFN0YXRlLlNFTkRJTkdfUkVRVUVTVCkgeworICAgICAgICAgICAgICAgICAgICAvLyBncmVhdCB3ZSByZWNlaXZlZCByZXNwb25zZSBoZWFkZXIgc28gZmFzdCB0aGF0IHdlIGRpZCBub3QgZXZlbiBzd2l0Y2ggaW50byAicmVjZWl2aW5nIGhlYWRlciIgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgIC8vIGRvIGl0IG5vdyB0byBjb21wbGV0ZSB0aGUgZm9ybWFsIGxpZmVjeWNsZQorICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGhhcHBlbnMgd2hlbiB3cml0ZSBjb21wbGV0aW9uIGxpc3RlbmVyIGlzIG92ZXJ0YWtlbiBieSAicmVhZCBldmVudCIKKyAgICAgICAgICAgICAgICAgICAgY2hhbmdlU3RhdGUoU3RhdGUuUkVDRUlWSU5HX0hFQURFUik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaHR0UmVzcG9uc2UgPSByZXNwb25zZTsKKworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NSZXNwb25zZUhlYWRlcnMocmVzcG9uc2UpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChyZXNwb25zZS5nZXRIYXNDb250ZW50KCkpIHsKKyAgICAgICAgICAgICAgICBBc3luY2hyb25vdXNCb2R5SW5wdXRTdHJlYW0gYm9keVN0cmVhbSA9IGh0dFJlc3BvbnNlLmdldEJvZHlTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICBjaGFuZ2VTdGF0ZShTdGF0ZS5SRUNFSVZJTkdfQk9EWSk7CisgICAgICAgICAgICAgICAgYm9keVN0cmVhbS5zZXRTdGF0ZUNoYW5nZUxpc3RlcihuZXcgQXN5bmNocm9ub3VzQm9keUlucHV0U3RyZWFtLlN0YXRlQ2hhbmdlTGlzdGVyKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IodCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbGxEYXRhUmVhZCgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVJlc3BvbnNlUmVhZCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaGFuZGxlUmVzcG9uc2VSZWFkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgdm9pZCBwcm9jZXNzQ29ubmVjdCgpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoSHR0cENvbm5lY3Rpb24udGhpcykgeworICAgICAgICAgICAgICAgIGlmIChzdGF0ZSAhPSBTdGF0ZS5DT05ORUNUSU5HKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkb3duc3RyZWFtRmlsdGVyLnN0YXJ0U3NsKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgdm9pZCBwcm9jZXNzU3NsSGFuZHNoYWtlQ29tcGxldGVkKCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChIdHRwQ29ubmVjdGlvbi50aGlzKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlICE9IFN0YXRlLkNPTk5FQ1RJTkcpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhbmNlbENvbm5lY3RUaW1lb3V0KCk7CisgICAgICAgICAgICAgICAgY2hhbmdlU3RhdGVUb0lkbGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICB2b2lkIHByb2Nlc3NDb25uZWN0aW9uQ2xvc2VkKCkgeworICAgICAgICAgICAgY2FuY2VsQWxsVGltZW91dHMoKTsKKyAgICAgICAgICAgIGNoYW5nZVN0YXRlKFN0YXRlLkNMT1NFRF9CWV9TRVJWRVIpOworICAgICAgICAgICAgSHR0cENvbm5lY3Rpb24udGhpcy5jbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHZvaWQgcHJvY2Vzc0Vycm9yKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBoYW5kbGVFcnJvcih0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICB2b2lkIHdyaXRlKEh0dHBSZXF1ZXN0IGRhdGEsIENvbXBsZXRpb25IYW5kbGVyPEh0dHBSZXF1ZXN0PiBjb21wbGV0aW9uSGFuZGxlcikgeworICAgICAgICAgICAgZG93bnN0cmVhbUZpbHRlci53cml0ZShkYXRhLCBjb21wbGV0aW9uSGFuZGxlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlbnVtIFN0YXRlIHsKKyAgICAgICAgQ1JFQVRFRCwKKyAgICAgICAgQ09OTkVDVElORywKKyAgICAgICAgQ09OTkVDVF9USU1FT1VULAorICAgICAgICBJRExFLAorICAgICAgICBTRU5ESU5HX1JFUVVFU1QsCisgICAgICAgIFJFQ0VJVklOR19IRUFERVIsCisgICAgICAgIFJFQ0VJVklOR19CT0RZLAorICAgICAgICBSRUNFSVZFRCwKKyAgICAgICAgUkVTUE9OU0VfVElNRU9VVCwKKyAgICAgICAgQ0xPU0VEX0JZX1NFUlZFUiwKKyAgICAgICAgQ0xPU0VELAorICAgICAgICBFUlJPUiwKKyAgICAgICAgSURMRV9USU1FT1VUCisgICAgfQorCisgICAgaW50ZXJmYWNlIFN0YXRlQ2hhbmdlTGlzdGVuZXIgeworCisgICAgICAgIHZvaWQgb25TdGF0ZUNoYW5nZWQoSHR0cENvbm5lY3Rpb24gY29ubmVjdGlvbiwgU3RhdGUgb2xkU3RhdGUsIFN0YXRlIG5ld1N0YXRlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL0h0dHBDb25uZWN0aW9uUG9vbC5qYXZhIGIvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9IdHRwQ29ubmVjdGlvblBvb2wuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Njg0MmM0Ci0tLSAvZGV2L251bGwKKysrIGIvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9IdHRwQ29ubmVjdGlvblBvb2wuamF2YQpAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lmpkay5jb25uZWN0b3IuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLm5ldC5Db29raWVNYW5hZ2VyOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZTsKKworLyoqCisgKiBAYXV0aG9yIFBldHIgSmFub3VjaCAocGV0ci5qYW5vdWNoIGF0IG9yYWNsZS5jb20pCisgKi8KK2NsYXNzIEh0dHBDb25uZWN0aW9uUG9vbCB7CisKKyAgICAvLyBUT0RPIGJldHRlciBzb2x1dGlvbiwgY29udGFpbmVycyB3b24ndCBsaWtlIHRoaXMKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2Ugc2NoZWR1bGVyID0gRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZFNjaGVkdWxlZEV4ZWN1dG9yKHIgLT4geworICAgICAgICBUaHJlYWQgdGhyZWFkID0gbmV3IFRocmVhZChyKTsKKyAgICAgICAgdGhyZWFkLnNldERhZW1vbih0cnVlKTsKKyAgICAgICAgcmV0dXJuIHRocmVhZDsKKyAgICB9KTsKKworICAgIHByaXZhdGUgZmluYWwgQ29ubmVjdG9yQ29uZmlndXJhdGlvbiBjb25uZWN0b3JDb25maWd1cmF0aW9uOworICAgIHByaXZhdGUgZmluYWwgQ29va2llTWFuYWdlciBjb29raWVNYW5hZ2VyOworICAgIHByaXZhdGUgZmluYWwgTWFwPERlc3RpbmF0aW9uQ29ubmVjdGlvblBvb2wuRGVzdGluYXRpb25LZXksIERlc3RpbmF0aW9uQ29ubmVjdGlvblBvb2w+IGRlc3RpbmF0aW9uUG9vbHMgPSBuZXcKKyAgICAgICAgICAgIENvbmN1cnJlbnRIYXNoTWFwPD4oKTsKKworICAgIEh0dHBDb25uZWN0aW9uUG9vbChDb25uZWN0b3JDb25maWd1cmF0aW9uIGNvbm5lY3RvckNvbmZpZ3VyYXRpb24sIENvb2tpZU1hbmFnZXIgY29va2llTWFuYWdlcikgeworICAgICAgICB0aGlzLmNvbm5lY3RvckNvbmZpZ3VyYXRpb24gPSBjb25uZWN0b3JDb25maWd1cmF0aW9uOworICAgICAgICB0aGlzLmNvb2tpZU1hbmFnZXIgPSBjb29raWVNYW5hZ2VyOworICAgIH0KKworICAgIHZvaWQgc2VuZChIdHRwUmVxdWVzdCBodHRwUmVxdWVzdCwgQ29tcGxldGlvbkhhbmRsZXI8SHR0cFJlc3BvbnNlPiBjb21wbGV0aW9uSGFuZGxlcikgeworICAgICAgICBmaW5hbCBEZXN0aW5hdGlvbkNvbm5lY3Rpb25Qb29sLkRlc3RpbmF0aW9uS2V5IGRlc3RpbmF0aW9uS2V5ID0gbmV3IERlc3RpbmF0aW9uQ29ubmVjdGlvblBvb2wuRGVzdGluYXRpb25LZXkoCisgICAgICAgICAgICAgICAgaHR0cFJlcXVlc3QuZ2V0VXJpKCkpOworICAgICAgICBEZXN0aW5hdGlvbkNvbm5lY3Rpb25Qb29sIGRlc3RpbmF0aW9uQ29ubmVjdGlvblBvb2wgPSBkZXN0aW5hdGlvblBvb2xzLmdldChkZXN0aW5hdGlvbktleSk7CisKKyAgICAgICAgaWYgKGRlc3RpbmF0aW9uQ29ubmVjdGlvblBvb2wgPT0gbnVsbCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgLy8gY2hlY2sgYWdhaW4gd2hpbGUgaG9sZGluZyB0aGUgbG9jaworICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uQ29ubmVjdGlvblBvb2wgPSBkZXN0aW5hdGlvblBvb2xzLmdldChkZXN0aW5hdGlvbktleSk7CisKKyAgICAgICAgICAgICAgICBpZiAoZGVzdGluYXRpb25Db25uZWN0aW9uUG9vbCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIERlc3RpbmF0aW9uQ29ubmVjdGlvblBvb2wgcG9vbCA9IG5ldyBEZXN0aW5hdGlvbkNvbm5lY3Rpb25Qb29sKGNvbm5lY3RvckNvbmZpZ3VyYXRpb24sIGNvb2tpZU1hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVyKTsKKyAgICAgICAgICAgICAgICAgICAgcG9vbC5zZXRDb25uZWN0aW9uQ2xvc2VMaXN0ZW5lcigoKSAtPiB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGVyZSBpcyBhIHBvdGVudGlhbCByYWNlIHdoZW4gdGhlcmUgaXMgYSByZXF1ZXN0IGp1c3QgYWJvdXQgdG8gYmUgc3VibWl0dGVkIHRvIHRoZSBwb29sCisgICAgICAgICAgICAgICAgICAgICAgICB3ZSBhcmUganVzdCByZW1vdmluZy4gU3VjaCByZXF1ZXN0IHdpbGwgYmUgZXhlY3V0ZWQgb24gdGhlIHJlbW92ZWQgcG9vbCB3aXRob3V0IGFueSBwcm9ibGVtcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBvbmx5IGlzc3VlIGlzIHRoYXQgdGhpcyBsaXN0ZW5lciB3aWxsIGJlIGNhbGxlZCBmb3IgdGhlIHNlY29uZCB0aW1lIGluIHN1Y2ggYSBjYXNlLCBzbyB3ZQorICAgICAgICAgICAgICAgICAgICAgICAgaGF2ZSB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgcmVtb3ZlIGEgbmV3IHBvb2wgdGhhdCBtaWdodCBoYXZlIGJlZW4gY3JlYXRlZCBpbiB0aGUgbWVhbnRpbWUuICovCisgICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblBvb2xzLnJlbW92ZShkZXN0aW5hdGlvbktleSwgcG9vbCk7CisgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uQ29ubmVjdGlvblBvb2wgPSBwb29sOworICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblBvb2xzLnB1dChkZXN0aW5hdGlvbktleSwgZGVzdGluYXRpb25Db25uZWN0aW9uUG9vbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZGVzdGluYXRpb25Db25uZWN0aW9uUG9vbC5zZW5kKGh0dHBSZXF1ZXN0LCBjb21wbGV0aW9uSGFuZGxlcik7CisgICAgfQorCisgICAgc3luY2hyb25pemVkIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIGRlc3RpbmF0aW9uUG9vbHMudmFsdWVzKCkuZm9yRWFjaChEZXN0aW5hdGlvbkNvbm5lY3Rpb25Qb29sOjpjbG9zZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9IdHRwRmlsdGVyLmphdmEgYi9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL0h0dHBGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjNkZGE4Ci0tLSAvZGV2L251bGwKKysrIGIvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9IdHRwRmlsdGVyLmphdmEKQEAgLTAsMCArMSwxMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamRrLmNvbm5lY3Rvci5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKKworLyoqCisgKiBAYXV0aG9yIFBldHIgSmFub3VjaCAocGV0ci5qYW5vdWNoIGF0IG9yYWNsZS5jb20pCisgKi8KK2NsYXNzIEh0dHBGaWx0ZXIgZXh0ZW5kcyBGaWx0ZXI8SHR0cFJlcXVlc3QsIEh0dHBSZXNwb25zZSwgQnl0ZUJ1ZmZlciwgQnl0ZUJ1ZmZlcj4geworCisgICAgcHJpdmF0ZSBmaW5hbCBIdHRwUGFyc2VyIGh0dHBQYXJzZXI7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkb3duc3RyZWFtRmlsdGVyIGRvd25zdHJlYW0gZmlsdGVyLiBBY2Nlc3NpYmxlIGRpcmVjdGx5IGFzIHtAbGluayAjZG93bnN0cmVhbUZpbHRlcn0gcHJvdGVjdGVkIGZpZWxkLgorICAgICAqLworICAgIEh0dHBGaWx0ZXIoRmlsdGVyPEJ5dGVCdWZmZXIsIEJ5dGVCdWZmZXIsID8sID8+IGRvd25zdHJlYW1GaWx0ZXIsIGludCBtYXhIZWFkZXJTaXplLCBpbnQgbWF4QnVmZmVyU2l6ZSkgeworICAgICAgICBzdXBlcihkb3duc3RyZWFtRmlsdGVyKTsKKyAgICAgICAgdGhpcy5odHRwUGFyc2VyID0gbmV3IEh0dHBQYXJzZXIobWF4SGVhZGVyU2l6ZSwgbWF4QnVmZmVyU2l6ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgdm9pZCB3cml0ZShmaW5hbCBIdHRwUmVxdWVzdCBodHRwUmVxdWVzdCwgZmluYWwgQ29tcGxldGlvbkhhbmRsZXI8SHR0cFJlcXVlc3Q+IGNvbXBsZXRpb25IYW5kbGVyKSB7CisgICAgICAgIGFkZFRyYW5zcG9ydEhlYWRlcnMoaHR0cFJlcXVlc3QpOworCisgICAgICAgIEJ5dGVCdWZmZXIgaGVhZGVyID0gSHR0cFJlcXVlc3RFbmNvZGVyLmVuY29kZUhlYWRlcihodHRwUmVxdWVzdCk7CisgICAgICAgIHByZXBhcmVGb3JSZXBseShodHRwUmVxdWVzdCwgY29tcGxldGlvbkhhbmRsZXIpOworICAgICAgICBkb3duc3RyZWFtRmlsdGVyLndyaXRlKGhlYWRlciwgbmV3IENvbXBsZXRpb25IYW5kbGVyPEJ5dGVCdWZmZXI+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBmYWlsZWQoVGhyb3dhYmxlIHRocm93YWJsZSkgeworICAgICAgICAgICAgICAgIGNvbXBsZXRpb25IYW5kbGVyLmZhaWxlZCh0aHJvd2FibGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbXBsZXRlZChCeXRlQnVmZmVyIHJlc3VsdCkgeworICAgICAgICAgICAgICAgIHdyaXRlQm9keShodHRwUmVxdWVzdCwgY29tcGxldGlvbkhhbmRsZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgd3JpdGVCb2R5KGZpbmFsIEh0dHBSZXF1ZXN0IGh0dHBSZXF1ZXN0LCBmaW5hbCBDb21wbGV0aW9uSGFuZGxlcjxIdHRwUmVxdWVzdD4gY29tcGxldGlvbkhhbmRsZXIpIHsKKyAgICAgICAgc3dpdGNoIChodHRwUmVxdWVzdC5nZXRCb2R5TW9kZSgpKSB7CisKKyAgICAgICAgICAgIGNhc2UgQ0hVTktFRDogeworICAgICAgICAgICAgICAgIENodW5rZWRCb2R5T3V0cHV0U3RyZWFtIGJvZHlTdHJlYW0gPSAoQ2h1bmtlZEJvZHlPdXRwdXRTdHJlYW0pIGh0dHBSZXF1ZXN0LmdldEJvZHlTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICBib2R5U3RyZWFtLm9wZW4oZG93bnN0cmVhbUZpbHRlcik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgQlVGRkVSRUQ6IHsKKyAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGJvZHkgPSBodHRwUmVxdWVzdC5nZXRCdWZmZXJlZEJvZHkoKTsKKyAgICAgICAgICAgICAgICBkb3duc3RyZWFtRmlsdGVyLndyaXRlKGJvZHksIG5ldyBDb21wbGV0aW9uSGFuZGxlcjxCeXRlQnVmZmVyPigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZhaWxlZChUaHJvd2FibGUgdGhyb3dhYmxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uSGFuZGxlci5mYWlsZWQodGhyb3dhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJlcGFyZUZvclJlcGx5KEh0dHBSZXF1ZXN0IGh0dHBSZXF1ZXN0LCBDb21wbGV0aW9uSGFuZGxlcjxIdHRwUmVxdWVzdD4gY29tcGxldGlvbkhhbmRsZXIpIHsKKyAgICAgICAgY29tcGxldGlvbkhhbmRsZXIuY29tcGxldGVkKGh0dHBSZXF1ZXN0KTsKKworICAgICAgICBib29sZWFuIGV4cGVjdFJlc3BvbnNlQm9keSA9IHRydWU7CisKKyAgICAgICAgaWYgKENvbnN0YW50cy5IRUFELmVxdWFscyhodHRwUmVxdWVzdC5nZXRNZXRob2QoKSkgfHwgQ29uc3RhbnRzLkNPTk5FQ1QuZXF1YWxzKGh0dHBSZXF1ZXN0LmdldE1ldGhvZCgpKSkgeworICAgICAgICAgICAgZXhwZWN0UmVzcG9uc2VCb2R5ID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBodHRwUGFyc2VyLnJlc2V0KGV4cGVjdFJlc3BvbnNlQm9keSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgYm9vbGVhbiBwcm9jZXNzUmVhZChCeXRlQnVmZmVyIGRhdGEpIHsKKyAgICAgICAgYm9vbGVhbiBoZWFkZXJQYXJzZWQgPSBodHRwUGFyc2VyLmlzSGVhZGVyUGFyc2VkKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBodHRwUGFyc2VyLnBhcnNlKGRhdGEpOworICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBvbkVycm9yKGUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFoZWFkZXJQYXJzZWQgJiYgaHR0cFBhcnNlci5pc0hlYWRlclBhcnNlZCgpKSB7CisgICAgICAgICAgICBIdHRwUmVzcG9uc2UgaHR0cFJlc3BvbnNlID0gaHR0cFBhcnNlci5nZXRIdHRwUmVzcG9uc2UoKTsKKyAgICAgICAgICAgIHVwc3RyZWFtRmlsdGVyLm9uUmVhZChodHRwUmVzcG9uc2UpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhZGRUcmFuc3BvcnRIZWFkZXJzKEh0dHBSZXF1ZXN0IGh0dHBSZXF1ZXN0KSB7CisgICAgICAgIGlmIChodHRwUmVxdWVzdC5nZXRCb2R5TW9kZSgpID09IEh0dHBSZXF1ZXN0LkJvZHlNb2RlLkJVRkZFUkVEKSB7CisgICAgICAgICAgICBodHRwUmVxdWVzdC5hZGRIZWFkZXJJZk5vdFByZXNlbnQoQ29uc3RhbnRzLkNPTlRFTlRfTEVOR1RILCBJbnRlZ2VyLnRvU3RyaW5nKGh0dHBSZXF1ZXN0LmdldEJvZHlTaXplKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIFVSSSB1cmkgPSBodHRwUmVxdWVzdC5nZXRVcmkoKTsKKyAgICAgICAgaW50IHBvcnQgPSBVdGlscy5nZXRQb3J0KHVyaSk7CisgICAgICAgIGh0dHBSZXF1ZXN0LmFkZEhlYWRlcklmTm90UHJlc2VudChDb25zdGFudHMuSE9TVCwgdXJpLmdldEhvc3QoKSArICI6IiArIHBvcnQpOworCisgICAgICAgIGlmIChodHRwUmVxdWVzdC5nZXRCb2R5TW9kZSgpID09IEh0dHBSZXF1ZXN0LkJvZHlNb2RlLkNIVU5LRUQpIHsKKyAgICAgICAgICAgIGh0dHBSZXF1ZXN0LmFkZEhlYWRlcklmTm90UHJlc2VudChDb25zdGFudHMuVFJBTlNGRVJfRU5DT0RJTkdfSEVBREVSLCBDb25zdGFudHMuVFJBTlNGRVJfRU5DT0RJTkdfQ0hVTktFRCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaHR0cFJlcXVlc3QuZ2V0Qm9keU1vZGUoKSA9PSBIdHRwUmVxdWVzdC5Cb2R5TW9kZS5OT05FKSB7CisgICAgICAgICAgICBodHRwUmVxdWVzdC5hZGRIZWFkZXJJZk5vdFByZXNlbnQoSHR0cEhlYWRlcnMuQ09OVEVOVF9MRU5HVEgsIEludGVnZXIudG9TdHJpbmcoMCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9IdHRwUGFyc2VyLmphdmEgYi9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL0h0dHBQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTcwZTA2Ci0tLSAvZGV2L251bGwKKysrIGIvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9IdHRwUGFyc2VyLmphdmEKQEAgLTAsMCArMSw2MTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamRrLmNvbm5lY3Rvci5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKKworLyoqCisgKiBAYXV0aG9yIEFsZXhleSBTdGFzaG9rCisgKiBAYXV0aG9yIFBldHIgSmFub3VjaCAocGV0ci5qYW5vdWNoIGF0IG9yYWNsZS5jb20pCisgKi8KK2NsYXNzIEh0dHBQYXJzZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQ09ESU5HID0gIklTTy04ODU5LTEiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TVEVQX1NJWkUgPSAyNTY7CisgICAgLy8gdGhpcyBpcyBwYWNrYWdlIHByaXZhdGUgYmVjYXVzZSBvZiB0aGUgdGVzdAorICAgIHN0YXRpYyBmaW5hbCBpbnQgSU5JVF9CVUZGRVJfU0laRSA9IDEwMjQ7CisKKyAgICBwcml2YXRlIGZpbmFsIEh0dHBQYXJzZXJVdGlscy5IZWFkZXJQYXJzaW5nU3RhdGUgaGVhZGVyUGFyc2luZ1N0YXRlOworICAgIHByaXZhdGUgZmluYWwgaW50IGJ1ZmZlck1heFNpemU7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbWF4SGVhZGVyU2l6ZTsKKworICAgIHByaXZhdGUgdm9sYXRpbGUgQnl0ZUJ1ZmZlciBidWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKElOSVRfQlVGRkVSX1NJWkUpOworICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBoZWFkZXJQYXJzZWQ7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGV4cGVjdENvbnRlbnQ7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBTdHJpbmcgcHJvdG9jb2xWZXJzaW9uOworICAgIHByaXZhdGUgdm9sYXRpbGUgaW50IGNvZGU7CisKKyAgICBwcml2YXRlIHZvbGF0aWxlIEh0dHBSZXNwb25zZSBodHRwUmVzcG9uc2U7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBUcmFuc2ZlckVuY29kaW5nUGFyc2VyIHRyYW5zZmVyRW5jb2RpbmdQYXJzZXI7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGNvbXBsZXRlOworCisgICAgSHR0cFBhcnNlcihpbnQgbWF4SGVhZGVyU2l6ZSwgaW50IGJ1ZmZlck1heFNpemUpIHsKKyAgICAgICAgaGVhZGVyUGFyc2luZ1N0YXRlID0gbmV3IEh0dHBQYXJzZXJVdGlscy5IZWFkZXJQYXJzaW5nU3RhdGUobWF4SGVhZGVyU2l6ZSk7CisgICAgICAgIHRoaXMuYnVmZmVyTWF4U2l6ZSA9IGJ1ZmZlck1heFNpemU7CisgICAgICAgIHRoaXMubWF4SGVhZGVyU2l6ZSA9IG1heEhlYWRlclNpemU7CisgICAgfQorCisgICAgdm9pZCByZXNldChib29sZWFuIGV4cGVjdENvbnRlbnQpIHsKKyAgICAgICAgdGhpcy5leHBlY3RDb250ZW50ID0gZXhwZWN0Q29udGVudDsKKyAgICAgICAgaGVhZGVyUGFyc2VkID0gZmFsc2U7CisgICAgICAgIGJ1ZmZlci5jbGVhcigpOworICAgICAgICBidWZmZXIuZmxpcCgpOworICAgICAgICBjb21wbGV0ZSA9IGZhbHNlOworICAgICAgICBoZWFkZXJQYXJzaW5nU3RhdGUucmVjeWNsZSgpOworICAgIH0KKworICAgIGJvb2xlYW4gaXNIZWFkZXJQYXJzZWQoKSB7CisgICAgICAgIHJldHVybiBoZWFkZXJQYXJzZWQ7CisgICAgfQorCisgICAgYm9vbGVhbiBpc0NvbXBsZXRlKCkgeworICAgICAgICByZXR1cm4gY29tcGxldGU7CisgICAgfQorCisgICAgSHR0cFJlc3BvbnNlIGdldEh0dHBSZXNwb25zZSgpIHsKKyAgICAgICAgcmV0dXJuIGh0dHBSZXNwb25zZTsKKyAgICB9CisKKyAgICB2b2lkIHBhcnNlKEJ5dGVCdWZmZXIgaW5wdXQpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChidWZmZXIucmVtYWluaW5nKCkgPiAwKSB7CisgICAgICAgICAgICBpbnB1dCA9IFV0aWxzLmFwcGVuZEJ1ZmZlcnMoYnVmZmVyLCBpbnB1dCwgYnVmZmVyTWF4U2l6ZSwgQlVGRkVSX1NURVBfU0laRSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWhlYWRlclBhcnNlZCAmJiAhcGFyc2VIZWFkZXIoaW5wdXQpKSB7CisgICAgICAgICAgICBzYXZlUmVtYWluaW5nKGlucHV0KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGh0dHBSZXNwb25zZS5zZXRIYXNDb250ZW50KGV4cGVjdENvbnRlbnQpOworICAgICAgICBpZiAoZXhwZWN0Q29udGVudCkgeworICAgICAgICAgICAgaWYgKHRyYW5zZmVyRW5jb2RpbmdQYXJzZXIucGFyc2UoaW5wdXQpKSB7CisgICAgICAgICAgICAgICAgY29tcGxldGUgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzYXZlUmVtYWluaW5nKGlucHV0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFdlIGRvbid0IGV4cGVjdCBjb250ZW50CisgICAgICAgICAgICBjb21wbGV0ZSA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29tcGxldGUgJiYgaW5wdXQuaGFzUmVtYWluaW5nKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5VTkVYUEVDVEVEX0RBVEFfSU5fQlVGRkVSKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbXBsZXRlKSB7CisgICAgICAgICAgICBodHRwUmVzcG9uc2UuZ2V0Qm9keVN0cmVhbSgpLm5vdGlmeUFsbERhdGFSZWFkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2F2ZVJlbWFpbmluZyhCeXRlQnVmZmVyIGlucHV0KSB7CisKKyAgICAgICAgLy8gc29tZSBvZiB0aGUgZmllbGRzIHVzZSAwIG5hZCAtMSBhcyBhIHNwZWNpYWwgc3RhdGUgLT4gaWYgdGhlIGZpZWxkIGlzIDw9IDAsIGp1c3QgbGV0IGl0IGJlCisgICAgICAgIGhlYWRlclBhcnNpbmdTdGF0ZS5zdGFydCA9CisgICAgICAgICAgICAgICAgaGVhZGVyUGFyc2luZ1N0YXRlLnN0YXJ0ID4gMCA/IGhlYWRlclBhcnNpbmdTdGF0ZS5zdGFydCAtIGlucHV0LnBvc2l0aW9uKCkgOiBoZWFkZXJQYXJzaW5nU3RhdGUuc3RhcnQ7CisgICAgICAgIGhlYWRlclBhcnNpbmdTdGF0ZS5vZmZzZXQgPQorICAgICAgICAgICAgICAgIGhlYWRlclBhcnNpbmdTdGF0ZS5vZmZzZXQgPiAwID8gaGVhZGVyUGFyc2luZ1N0YXRlLm9mZnNldCAtIGlucHV0LnBvc2l0aW9uKCkgOiBoZWFkZXJQYXJzaW5nU3RhdGUub2Zmc2V0OworICAgICAgICBoZWFkZXJQYXJzaW5nU3RhdGUucGFja2V0TGltaXQgPSBoZWFkZXJQYXJzaW5nU3RhdGUucGFja2V0TGltaXQgPiAwID8gaGVhZGVyUGFyc2luZ1N0YXRlLnBhY2tldExpbWl0IC0gaW5wdXQucG9zaXRpb24oKQorICAgICAgICAgICAgICAgIDogaGVhZGVyUGFyc2luZ1N0YXRlLnBhY2tldExpbWl0OworICAgICAgICBoZWFkZXJQYXJzaW5nU3RhdGUuY2hlY2twb2ludCA9IGhlYWRlclBhcnNpbmdTdGF0ZS5jaGVja3BvaW50ID4gMCA/IGhlYWRlclBhcnNpbmdTdGF0ZS5jaGVja3BvaW50IC0gaW5wdXQucG9zaXRpb24oKQorICAgICAgICAgICAgICAgIDogaGVhZGVyUGFyc2luZ1N0YXRlLmNoZWNrcG9pbnQ7CisgICAgICAgIGhlYWRlclBhcnNpbmdTdGF0ZS5jaGVja3BvaW50MiA9IGhlYWRlclBhcnNpbmdTdGF0ZS5jaGVja3BvaW50MiA+IDAgPyBoZWFkZXJQYXJzaW5nU3RhdGUuY2hlY2twb2ludDIgLSBpbnB1dC5wb3NpdGlvbigpCisgICAgICAgICAgICAgICAgOiBoZWFkZXJQYXJzaW5nU3RhdGUuY2hlY2twb2ludDI7CisKKyAgICAgICAgaWYgKGlucHV0Lmhhc1JlbWFpbmluZygpKSB7CisgICAgICAgICAgICBpZiAoaW5wdXQgIT0gYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgYnVmZmVyLmZsaXAoKTsKKyAgICAgICAgICAgICAgICBidWZmZXIgPSBVdGlscy5hcHBlbmRCdWZmZXJzKGJ1ZmZlciwgaW5wdXQsIGJ1ZmZlck1heFNpemUsIEJVRkZFUl9TVEVQX1NJWkUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBidWZmZXIuY29tcGFjdCgpOworICAgICAgICAgICAgICAgIGJ1ZmZlci5mbGlwKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUYWtlbiB3aXRoIHNtYWxsIG1vZGlmaWNhdGlvbnMgZnJvbSBHcml6emx5IEh0dHBDb2RlY0ZpbHRlci5wYXJzZUhlYWRlckZyb21CdWZmZXIKKyAgICAvLyAoY2hhbmdlOiBvcGVyYXRpb25zIGluIHBoYXNlIDIgYXJlIHRyYW5zbGF0ZWQgdG8gZml0IHRoaXMgcGFyc2VyKQorICAgIHByaXZhdGUgYm9vbGVhbiBwYXJzZUhlYWRlcihCeXRlQnVmZmVyIGlucHV0KSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGhlYWRlclBhcnNpbmdTdGF0ZS5zdGF0ZSkgeworICAgICAgICAgICAgICAgIGNhc2UgMDogeyAvLyBwYXJzaW5nIGluaXRpYWwgbGluZQorICAgICAgICAgICAgICAgICAgICBpZiAoIWRlY29kZUluaXRpYWxMaW5lRnJvbUJ1ZmZlcihpbnB1dCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlclBhcnNpbmdTdGF0ZS5jaGVja092ZXJmbG93KExvY2FsaXphdGlvbk1lc3NhZ2VzLkhUVFBfSU5JVElBTF9MSU5FX09WRVJGTE9XKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyUGFyc2luZ1N0YXRlLnN0YXRlKys7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgMTogeyAvLyBwYXJzaW5nIGhlYWRlcnMKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZUhlYWRlcnNGcm9tQnVmZmVyKGlucHV0LCBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlclBhcnNpbmdTdGF0ZS5jaGVja092ZXJmbG93KExvY2FsaXphdGlvbk1lc3NhZ2VzLkhUVFBfUEFDS0VUX0hFQURFUl9PVkVSRkxPVygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGhlYWRlclBhcnNpbmdTdGF0ZS5zdGF0ZSsrOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIDI6IHsgLy8gSGVhZGVycyBhcmUgcmVhZHkKKyAgICAgICAgICAgICAgICAgICAgaW5wdXQucG9zaXRpb24oaGVhZGVyUGFyc2luZ1N0YXRlLm9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIC8vIGlmIGhlYWRlcnMgZ2V0IHBhcnNlZCAtIHNldCB0aGUgZmxhZworICAgICAgICAgICAgICAgICAgICBoZWFkZXJQYXJzZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBkZWNpZGVUcmFuc2ZlckVuY29kaW5nKCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVjeWNsZSBoZWFkZXIgcGFyc2luZyBzdGF0ZQorICAgICAgICAgICAgICAgICAgICBoZWFkZXJQYXJzaW5nU3RhdGUucmVjeWNsZSgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUYWtlbiB1bm1vZGlmaWVkIGZyb20gR3JpenpseSBIdHRwQ2xpZW50RmlsdGVyLmRlY29kZUluaXRpYWxMaW5lRnJvbUJ1ZmZlcgorICAgIHByaXZhdGUgYm9vbGVhbiBkZWNvZGVJbml0aWFsTGluZUZyb21CdWZmZXIoZmluYWwgQnl0ZUJ1ZmZlciBpbnB1dCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKworICAgICAgICBmaW5hbCBpbnQgcGFja2V0TGltaXQgPSBoZWFkZXJQYXJzaW5nU3RhdGUucGFja2V0TGltaXQ7CisKKyAgICAgICAgLy9ub2luc3BlY3Rpb24gTG9vcFN0YXRlbWVudFRoYXREb2VzbnRMb29wCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpbnQgc3ViU3RhdGUgPSBoZWFkZXJQYXJzaW5nU3RhdGUuc3ViU3RhdGU7CisKKyAgICAgICAgICAgIHN3aXRjaCAoc3ViU3RhdGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6IHsgLy8gSFRUUCBwcm90b2NvbAorICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc3BhY2VJZHggPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRTcGFjZShpbnB1dCwgaGVhZGVyUGFyc2luZ1N0YXRlLm9mZnNldCwgcGFja2V0TGltaXQpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3BhY2VJZHggPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlclBhcnNpbmdTdGF0ZS5vZmZzZXQgPSBpbnB1dC5saW1pdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcHJvdG9jb2xWZXJzaW9uID0gcGFyc2VTdHJpbmcoaW5wdXQsIGhlYWRlclBhcnNpbmdTdGF0ZS5zdGFydCwgc3BhY2VJZHgpOworCisgICAgICAgICAgICAgICAgICAgIGhlYWRlclBhcnNpbmdTdGF0ZS5zdGFydCA9IC0xOworICAgICAgICAgICAgICAgICAgICBoZWFkZXJQYXJzaW5nU3RhdGUub2Zmc2V0ID0gc3BhY2VJZHg7CisKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyUGFyc2luZ1N0YXRlLnN1YlN0YXRlKys7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgMTogeyAvLyBza2lwIHNwYWNlcyBhZnRlciB0aGUgSFRUUCBwcm90b2NvbAorICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbm9uU3BhY2VJZHggPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBQYXJzZXJVdGlscy5za2lwU3BhY2VzKGlucHV0LCBoZWFkZXJQYXJzaW5nU3RhdGUub2Zmc2V0LCBwYWNrZXRMaW1pdCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChub25TcGFjZUlkeCA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyUGFyc2luZ1N0YXRlLm9mZnNldCA9IGlucHV0LmxpbWl0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBoZWFkZXJQYXJzaW5nU3RhdGUuc3RhcnQgPSBub25TcGFjZUlkeDsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyUGFyc2luZ1N0YXRlLm9mZnNldCA9IG5vblNwYWNlSWR4ICsgMTsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyUGFyc2luZ1N0YXRlLnN1YlN0YXRlKys7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgMjogeyAvLyBwYXJzZSB0aGUgc3RhdHVzIGNvZGUKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhlYWRlclBhcnNpbmdTdGF0ZS5vZmZzZXQgKyAzID4gaW5wdXQubGltaXQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY29kZSA9IHBhcnNlSW50KGlucHV0LCBoZWFkZXJQYXJzaW5nU3RhdGUuc3RhcnQsIGhlYWRlclBhcnNpbmdTdGF0ZS5zdGFydCArIDMpOworCisgICAgICAgICAgICAgICAgICAgIGhlYWRlclBhcnNpbmdTdGF0ZS5zdGFydCA9IC0xOworICAgICAgICAgICAgICAgICAgICBoZWFkZXJQYXJzaW5nU3RhdGUub2Zmc2V0ICs9IDM7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlclBhcnNpbmdTdGF0ZS5zdWJTdGF0ZSsrOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIDM6IHsgLy8gc2tpcCBzcGFjZXMgYWZ0ZXIgdGhlIHN0YXR1cyBjb2RlCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBub25TcGFjZUlkeCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFBhcnNlclV0aWxzLnNraXBTcGFjZXMoaW5wdXQsIGhlYWRlclBhcnNpbmdTdGF0ZS5vZmZzZXQsIHBhY2tldExpbWl0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5vblNwYWNlSWR4ID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJQYXJzaW5nU3RhdGUub2Zmc2V0ID0gaW5wdXQubGltaXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGhlYWRlclBhcnNpbmdTdGF0ZS5zdGFydCA9IG5vblNwYWNlSWR4OworICAgICAgICAgICAgICAgICAgICBoZWFkZXJQYXJzaW5nU3RhdGUub2Zmc2V0ID0gbm9uU3BhY2VJZHg7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlclBhcnNpbmdTdGF0ZS5zdWJTdGF0ZSsrOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIDQ6IHsgLy8gSFRUUCByZXNwb25zZSByZWFzb24tcGhyYXNlCisgICAgICAgICAgICAgICAgICAgIGlmICghZmluZEVPTChpbnB1dCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlclBhcnNpbmdTdGF0ZS5vZmZzZXQgPSBpbnB1dC5saW1pdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlYXNvblBocmFzZSA9IHBhcnNlU3RyaW5nKGlucHV0LCBoZWFkZXJQYXJzaW5nU3RhdGUuc3RhcnQsIGhlYWRlclBhcnNpbmdTdGF0ZS5jaGVja3BvaW50KTsKKworICAgICAgICAgICAgICAgICAgICBoZWFkZXJQYXJzaW5nU3RhdGUuc3ViU3RhdGUgPSAwOworICAgICAgICAgICAgICAgICAgICBoZWFkZXJQYXJzaW5nU3RhdGUuc3RhcnQgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyUGFyc2luZ1N0YXRlLmNoZWNrcG9pbnQgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgaHR0cFJlc3BvbnNlID0gbmV3IEh0dHBSZXNwb25zZShwcm90b2NvbFZlcnNpb24sIGNvZGUsIHJlYXNvblBocmFzZSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGh0dHBSZXNwb25zZS5nZXRTdGF0dXNDb2RlKCkgPT0gMTAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNldCB0aGUgcGFyc2luZyBzdGF0ZSBpbiBwcmVwYXJhdGlvbiB0byBwYXJzZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5vdGhlciBpbml0aWFsIGxpbmUgd2hpY2ggcmVwcmVzZW50cyB0aGUgZmluYWwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlciBhZnRlciBpdCBoYXMgc2VudCBhCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAxMDAtQ29udGludWUuCisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJQYXJzaW5nU3RhdGUub2Zmc2V0ICs9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJQYXJzaW5nU3RhdGUuc3RhcnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucG9zaXRpb24oaGVhZGVyUGFyc2luZ1N0YXRlLm9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb21wYWN0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJQYXJzaW5nU3RhdGUub2Zmc2V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRha2VuIHVubW9kaWZpZWQgZnJvbSBHcml6emx5IGZyb20gSHR0cENvZGVjRmlsdGVyLnBhcnNlSGVhZGVyc0Zyb21CdWZmZXIKKyAgICBib29sZWFuIHBhcnNlSGVhZGVyc0Zyb21CdWZmZXIoZmluYWwgQnl0ZUJ1ZmZlciBpbnB1dCwgYm9vbGVhbiBwYXJzaW5nVHJhaWxlckhlYWRlcnMpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGlmIChoZWFkZXJQYXJzaW5nU3RhdGUuc3ViU3RhdGUgPT0gMCkgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBlb2wgPSBjaGVja0VPTChpbnB1dCk7CisgICAgICAgICAgICAgICAgaWYgKGVvbCA9PSAwKSB7IC8vIEVPTAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVvbCA9PSAtMikgeyAvLyBub3QgZW5vdWdoIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFwYXJzZUhlYWRlckZyb21CdWZmZXIoaW5wdXQsIHBhcnNpbmdUcmFpbGVySGVhZGVycykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisgICAgfQorCisgICAgLy8gVGFrZW4gdW5tb2RpZmllZCBmcm9tIEdyaXp6bHkgSHR0cENvZGVjRmlsdGVyLnBhcnNlSGVhZGVyRnJvbUJ1ZmZlcgorICAgIHByaXZhdGUgYm9vbGVhbiBwYXJzZUhlYWRlckZyb21CdWZmZXIoZmluYWwgQnl0ZUJ1ZmZlciBpbnB1dCwgYm9vbGVhbiBwYXJzaW5nVHJhaWxlckhlYWRlcnMpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBzdWJTdGF0ZSA9IGhlYWRlclBhcnNpbmdTdGF0ZS5zdWJTdGF0ZTsKKworICAgICAgICAgICAgc3dpdGNoIChzdWJTdGF0ZSkgeworICAgICAgICAgICAgICAgIGNhc2UgMDogeyAvLyBzdGFydCB0byBwYXJzZSB0aGUgaGVhZGVyCisgICAgICAgICAgICAgICAgICAgIGhlYWRlclBhcnNpbmdTdGF0ZS5zdGFydCA9IGhlYWRlclBhcnNpbmdTdGF0ZS5vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlclBhcnNpbmdTdGF0ZS5zdWJTdGF0ZSsrOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSAxOiB7IC8vIHBhcnNlIGhlYWRlciBuYW1lCisgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VIZWFkZXJOYW1lKGlucHV0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyUGFyc2luZ1N0YXRlLnN1YlN0YXRlKys7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlclBhcnNpbmdTdGF0ZS5zdGFydCA9IC0xOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIDI6IHsgLy8gc2tpcCB2YWx1ZSBwcmVjZWRpbmcgc3BhY2VzCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBub25TcGFjZUlkeCA9IEh0dHBQYXJzZXJVdGlscworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5za2lwU3BhY2VzKGlucHV0LCBoZWFkZXJQYXJzaW5nU3RhdGUub2Zmc2V0LCBoZWFkZXJQYXJzaW5nU3RhdGUucGFja2V0TGltaXQpOworICAgICAgICAgICAgICAgICAgICBpZiAobm9uU3BhY2VJZHggPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlclBhcnNpbmdTdGF0ZS5vZmZzZXQgPSBpbnB1dC5saW1pdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyUGFyc2luZ1N0YXRlLnN1YlN0YXRlKys7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlclBhcnNpbmdTdGF0ZS5vZmZzZXQgPSBub25TcGFjZUlkeDsKKworICAgICAgICAgICAgICAgICAgICBpZiAoaGVhZGVyUGFyc2luZ1N0YXRlLnN0YXJ0ID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGFydGluZyB0byBwYXJzZSBoZWFkZXIgKHdpbGwgYmUgY2FsbGVkIG9ubHkgZm9yIHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBtdWx0aSBsaW5lIGhlYWRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlclBhcnNpbmdTdGF0ZS5zdGFydCA9IG5vblNwYWNlSWR4OworICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyUGFyc2luZ1N0YXRlLmNoZWNrcG9pbnQgPSBub25TcGFjZUlkeDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlclBhcnNpbmdTdGF0ZS5jaGVja3BvaW50MiA9IG5vblNwYWNlSWR4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgMzogeyAvLyBwYXJzZSBoZWFkZXIgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHJlc3VsdCA9IHBhcnNlSGVhZGVyVmFsdWUoaW5wdXQsIHBhcnNpbmdUcmFpbGVySGVhZGVycyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgPT0gLTIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE11bHRpbGluZSBoZWFkZXIgZGV0ZWN0ZWQuIFNraXAgcHJlY2VkaW5nIHNwYWNlcworICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyUGFyc2luZ1N0YXRlLnN1YlN0YXRlID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyUGFyc2luZ1N0YXRlLnN1YlN0YXRlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyUGFyc2luZ1N0YXRlLnN0YXJ0ID0gLTE7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gVGFrZW4gd2l0aCBzbWFsbCBtb2RpZmljYXRpb25zIGZyb20gR3JpenpseSBIdHRwQ29kZWNGaWx0ZXIucGFyc2VIZWFkZXJOYW1lCisgICAgLy8gKGNoYW5nZTogR3JpenpseSBhbHNvIGluaXRpYWxpemVzIHZhbHVlIHN0b3JlKQorICAgIHByaXZhdGUgYm9vbGVhbiBwYXJzZUhlYWRlck5hbWUoZmluYWwgQnl0ZUJ1ZmZlciBpbnB1dCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgaW50IGxpbWl0ID0gTWF0aC5taW4oaW5wdXQubGltaXQoKSwgaGVhZGVyUGFyc2luZ1N0YXRlLnBhY2tldExpbWl0KTsKKyAgICAgICAgZmluYWwgaW50IHN0YXJ0ID0gaGVhZGVyUGFyc2luZ1N0YXRlLnN0YXJ0OworICAgICAgICBpbnQgb2Zmc2V0ID0gaGVhZGVyUGFyc2luZ1N0YXRlLm9mZnNldDsKKworICAgICAgICB3aGlsZSAob2Zmc2V0IDwgbGltaXQpIHsKKyAgICAgICAgICAgIGJ5dGUgYiA9IGlucHV0LmdldChvZmZzZXQpOworICAgICAgICAgICAgaWYgKGIgPT0gSHR0cFBhcnNlclV0aWxzLkNPTE9OKSB7CisKKyAgICAgICAgICAgICAgICBoZWFkZXJQYXJzaW5nU3RhdGUuaGVhZGVyTmFtZSA9IHBhcnNlU3RyaW5nKGlucHV0LCBzdGFydCwgb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBoZWFkZXJQYXJzaW5nU3RhdGUub2Zmc2V0ID0gb2Zmc2V0ICsgMTsKKworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmICgoYiA+PSBIdHRwUGFyc2VyVXRpbHMuQSkgJiYgKGIgPD0gSHR0cFBhcnNlclV0aWxzLlopKSB7CisgICAgICAgICAgICAgICAgYiAtPSBIdHRwUGFyc2VyVXRpbHMuTENfT0ZGU0VUOworICAgICAgICAgICAgICAgIGlucHV0LnB1dChvZmZzZXQsIGIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvZmZzZXQrKzsKKyAgICAgICAgfQorCisgICAgICAgIGhlYWRlclBhcnNpbmdTdGF0ZS5vZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBUYWtlbiB3aXRoIHNtYWxsIG1vZGlmaWNhdGlvbnMgZnJvbSBHcml6emx5IEh0dHBDb2RlY0ZpbHRlci5wYXJzZUhlYWRlclZhbHVlCisgICAgLy8gKGNoYW5nZTogR3JpenpseSBzYXZlcyB0ZWggdmFsdWUgYXMgYSBidWZmZXIsIHdlIHNwbGl0IGl0IGFuZCBhZGQgdG8gcmVzcG9uc2UpCisgICAgcHJpdmF0ZSBpbnQgcGFyc2VIZWFkZXJWYWx1ZShCeXRlQnVmZmVyIGlucHV0LCBib29sZWFuIHBhcnNpbmdUcmFpbGVySGVhZGVycykgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKworICAgICAgICBmaW5hbCBpbnQgbGltaXQgPSBNYXRoLm1pbihpbnB1dC5saW1pdCgpLCBoZWFkZXJQYXJzaW5nU3RhdGUucGFja2V0TGltaXQpOworCisgICAgICAgIGludCBvZmZzZXQgPSBoZWFkZXJQYXJzaW5nU3RhdGUub2Zmc2V0OworCisgICAgICAgIGZpbmFsIGJvb2xlYW4gaGFzU2hpZnQgPSAob2Zmc2V0ICE9IGhlYWRlclBhcnNpbmdTdGF0ZS5jaGVja3BvaW50KTsKKworICAgICAgICB3aGlsZSAob2Zmc2V0IDwgbGltaXQpIHsKKyAgICAgICAgICAgIGZpbmFsIGJ5dGUgYiA9IGlucHV0LmdldChvZmZzZXQpOworICAgICAgICAgICAgLyogVGhpcyBpZiBpcyBub3QgaW4gR3JpenpseSwgaXQgaXMgdXNlZCBmb3IgcGFyc2luZyBjb21tYSBzZXBhcmF0ZWQgdmFsdWVzLgorICAgICAgICAgICAgIEdyaXp6bHkgc2VwYXJhdGVzIHRoZSBoZWFkZXIgaW4gSGVhZGVyIGNsYXNzLiAqLworICAgICAgICAgICAgaWYgKGIgPT0gSHR0cFBhcnNlclV0aWxzLkNPTU1BICYmICFpc0luc2VwYXJhYmxlSGVhZGVyKCkpIHsKKyAgICAgICAgICAgICAgICBoZWFkZXJQYXJzaW5nU3RhdGUub2Zmc2V0ID0gb2Zmc2V0ICsgMTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBwYXJzZVN0cmluZyhpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlclBhcnNpbmdTdGF0ZS5zdGFydCwgaGVhZGVyUGFyc2luZ1N0YXRlLmNoZWNrcG9pbnQyKTsKKyAgICAgICAgICAgICAgICBodHRwUmVzcG9uc2UuYWRkSGVhZGVyKGhlYWRlclBhcnNpbmdTdGF0ZS5oZWFkZXJOYW1lLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgaGVhZGVyUGFyc2luZ1N0YXRlLnN0YXJ0ID0gaGVhZGVyUGFyc2luZ1N0YXRlLmNoZWNrcG9pbnQyOworICAgICAgICAgICAgICAgIHJldHVybiAtMjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGIgPT0gSHR0cFBhcnNlclV0aWxzLkNSKSB7CisgICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZworICAgICAgICAgICAgfSBlbHNlIGlmIChiID09IEh0dHBQYXJzZXJVdGlscy5MRikgeworICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGl0J3Mgbm90IG11bHRpIGxpbmUgaGVhZGVyCisgICAgICAgICAgICAgICAgaWYgKG9mZnNldCArIDEgPCBsaW1pdCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBieXRlIGIyID0gaW5wdXQuZ2V0KG9mZnNldCArIDEpOworICAgICAgICAgICAgICAgICAgICBpZiAoYjIgPT0gSHR0cFBhcnNlclV0aWxzLlNQIHx8IGIyID09IEh0dHBQYXJzZXJVdGlscy5IVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucHV0KGhlYWRlclBhcnNpbmdTdGF0ZS5jaGVja3BvaW50KyssIGIyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlclBhcnNpbmdTdGF0ZS5vZmZzZXQgPSBvZmZzZXQgKyAyOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0yOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyUGFyc2luZ1N0YXRlLm9mZnNldCA9IG9mZnNldCArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBwYXJzZVN0cmluZyhpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyUGFyc2luZ1N0YXRlLnN0YXJ0LCBoZWFkZXJQYXJzaW5nU3RhdGUuY2hlY2twb2ludDIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNpbmdUcmFpbGVySGVhZGVycykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBSZXNwb25zZS5hZGRUcmFpbGVySGVhZGVyKGhlYWRlclBhcnNpbmdTdGF0ZS5oZWFkZXJOYW1lLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBSZXNwb25zZS5hZGRIZWFkZXIoaGVhZGVyUGFyc2luZ1N0YXRlLmhlYWRlck5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaGVhZGVyUGFyc2luZ1N0YXRlLm9mZnNldCA9IG9mZnNldDsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGIgPT0gSHR0cFBhcnNlclV0aWxzLlNQKSB7CisgICAgICAgICAgICAgICAgaWYgKGhhc1NoaWZ0KSB7CisgICAgICAgICAgICAgICAgICAgIGlucHV0LnB1dChoZWFkZXJQYXJzaW5nU3RhdGUuY2hlY2twb2ludCsrLCBiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBoZWFkZXJQYXJzaW5nU3RhdGUuY2hlY2twb2ludCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGhhc1NoaWZ0KSB7CisgICAgICAgICAgICAgICAgICAgIGlucHV0LnB1dChoZWFkZXJQYXJzaW5nU3RhdGUuY2hlY2twb2ludCsrLCBiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBoZWFkZXJQYXJzaW5nU3RhdGUuY2hlY2twb2ludCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBoZWFkZXJQYXJzaW5nU3RhdGUuY2hlY2twb2ludDIgPSBoZWFkZXJQYXJzaW5nU3RhdGUuY2hlY2twb2ludDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb2Zmc2V0Kys7CisgICAgICAgIH0KKworICAgICAgICBoZWFkZXJQYXJzaW5nU3RhdGUub2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzSW5zZXBhcmFibGVIZWFkZXIoKSB7CisgICAgICAgIC8qIEF1dGhlbnRpY2F0ZSBoZWFkZXJzIGNvbnRhaW4gY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgcHJvcGVydGllcywgd2hpY2ggd291bGQgYmUgbm9ybWFsbHkgdHJlYXRlZCBhcyBzZXBhcmF0ZSBoZWFkZXIKKyAgICAgICAgIHZhbHVlcyAqLworICAgICAgICByZXR1cm4gQ29uc3RhbnRzLldXV19BVVRIRU5USUNBVEUuZXF1YWxzSWdub3JlQ2FzZShoZWFkZXJQYXJzaW5nU3RhdGUuaGVhZGVyTmFtZSkKKyAgICAgICAgICAgICAgICB8fCBDb25zdGFudHMuUFJPWFlfQVVUSEVOVElDQVRFLmVxdWFsc0lnbm9yZUNhc2UoaGVhZGVyUGFyc2luZ1N0YXRlLmhlYWRlck5hbWUpOworCisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRlY2lkZVRyYW5zZmVyRW5jb2RpbmcoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworCisgICAgICAgIGludCBzdGF0dXNDb2RlID0gaHR0cFJlc3BvbnNlLmdldFN0YXR1c0NvZGUoKTsKKyAgICAgICAgaWYgKHN0YXR1c0NvZGUgPT0gMjA0IHx8IHN0YXR1c0NvZGUgPT0gMjA1IHx8IHN0YXR1c0NvZGUgPT0gMzA0KSB7CisgICAgICAgICAgICBleHBlY3RDb250ZW50ID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaHR0cFJlc3BvbnNlLmdldEhlYWRlcnMoKS5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgZXhwZWN0Q29udGVudCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgTGlzdDxTdHJpbmc+IHRyYW5zZmVyRW5jb2RpbmdzID0gaHR0cFJlc3BvbnNlLmdldEhlYWRlcihDb25zdGFudHMuVFJBTlNGRVJfRU5DT0RJTkdfSEVBREVSKTsKKworICAgICAgICBpZiAodHJhbnNmZXJFbmNvZGluZ3MgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIHRyYW5zZmVyRW5jb2RpbmcgPSB0cmFuc2ZlckVuY29kaW5ncy5nZXQoMCk7CisgICAgICAgICAgICBpZiAoQ29uc3RhbnRzLlRSQU5TRkVSX0VOQ09ESU5HX0NIVU5LRUQuZXF1YWxzSWdub3JlQ2FzZSh0cmFuc2ZlckVuY29kaW5nKSkgeworICAgICAgICAgICAgICAgIHRyYW5zZmVyRW5jb2RpbmdQYXJzZXIgPSBUcmFuc2ZlckVuY29kaW5nUGFyc2VyCisgICAgICAgICAgICAgICAgICAgICAgICAuY3JlYXRlQ2h1bmtQYXJzZXIoaHR0cFJlc3BvbnNlLmdldEJvZHlTdHJlYW0oKSwgdGhpcywgbWF4SGVhZGVyU2l6ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIExpc3Q8U3RyaW5nPiBjb250ZW50TGVuZ3RocyA9IGh0dHBSZXNwb25zZS5nZXRIZWFkZXIoSHR0cEhlYWRlcnMuQ09OVEVOVF9MRU5HVEgpOworCisgICAgICAgIGlmIChjb250ZW50TGVuZ3RocyAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGludCBib2R5TGVuZ3RoID0gSW50ZWdlci5wYXJzZUludChjb250ZW50TGVuZ3Rocy5nZXQoMCkpOworICAgICAgICAgICAgICAgIGlmIChib2R5TGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0Q29udGVudCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGJvZHlMZW5ndGggPD0gMCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuSFRUUF9ORUdBVElWRV9DT05URU5UX0xFTkdUSCgpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0cmFuc2ZlckVuY29kaW5nUGFyc2VyID0gVHJhbnNmZXJFbmNvZGluZ1BhcnNlcgorICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZUZpeGVkTGVuZ3RoUGFyc2VyKGh0dHBSZXNwb25zZS5nZXRCb2R5U3RyZWFtKCksIGJvZHlMZW5ndGgpOworCisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5IVFRQX0lOVkFMSURfQ09OVEVOVF9MRU5HVEgoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE8gd2hhdCBub3c/IEV4cGVjdCBubyBjb250ZW50IG9yIGZhaWwgbG91ZGx5PworICAgIH0KKworICAgIC8vIFRha2VuIHVubW9kaWZpZWQgZnJvbSBHcml6emx5IEh0dHBDb2RlY1V0aWxzLmZpbmRTcGFjZQorICAgIHByaXZhdGUgaW50IGZpbmRTcGFjZShmaW5hbCBCeXRlQnVmZmVyIGlucHV0LCBpbnQgb2Zmc2V0LCBmaW5hbCBpbnQgcGFja2V0TGltaXQpIHsKKyAgICAgICAgZmluYWwgaW50IGxpbWl0ID0gTWF0aC5taW4oaW5wdXQubGltaXQoKSwgcGFja2V0TGltaXQpOworICAgICAgICB3aGlsZSAob2Zmc2V0IDwgbGltaXQpIHsKKyAgICAgICAgICAgIGZpbmFsIGJ5dGUgYiA9IGlucHV0LmdldChvZmZzZXQpOworICAgICAgICAgICAgaWYgKEh0dHBQYXJzZXJVdGlscy5pc1NwYWNlT3JUYWIoYikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gb2Zmc2V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvZmZzZXQrKzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvLyBUYWtlbiB1bm1vZGlmaWVkIGZyb20gR3JpenpseSBIdHRwQ29kZWNVdGlscy5maW5kRU9MCisgICAgcHJpdmF0ZSBib29sZWFuIGZpbmRFT0woZmluYWwgQnl0ZUJ1ZmZlciBpbnB1dCkgeworICAgICAgICBpbnQgb2Zmc2V0ID0gaGVhZGVyUGFyc2luZ1N0YXRlLm9mZnNldDsKKyAgICAgICAgZmluYWwgaW50IGxpbWl0ID0gTWF0aC5taW4oaW5wdXQubGltaXQoKSwgaGVhZGVyUGFyc2luZ1N0YXRlLnBhY2tldExpbWl0KTsKKworICAgICAgICB3aGlsZSAob2Zmc2V0IDwgbGltaXQpIHsKKyAgICAgICAgICAgIGZpbmFsIGJ5dGUgYiA9IGlucHV0LmdldChvZmZzZXQpOworICAgICAgICAgICAgaWYgKGIgPT0gSHR0cFBhcnNlclV0aWxzLkNSKSB7CisgICAgICAgICAgICAgICAgaGVhZGVyUGFyc2luZ1N0YXRlLmNoZWNrcG9pbnQgPSBvZmZzZXQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGIgPT0gSHR0cFBhcnNlclV0aWxzLkxGKSB7CisgICAgICAgICAgICAgICAgaWYgKGhlYWRlclBhcnNpbmdTdGF0ZS5jaGVja3BvaW50ID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlclBhcnNpbmdTdGF0ZS5jaGVja3BvaW50ID0gb2Zmc2V0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGhlYWRlclBhcnNpbmdTdGF0ZS5vZmZzZXQgPSBvZmZzZXQgKyAxOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvZmZzZXQrKzsKKyAgICAgICAgfQorCisgICAgICAgIGhlYWRlclBhcnNpbmdTdGF0ZS5vZmZzZXQgPSBvZmZzZXQ7CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIFRha2VuIHVubW9kaWZpZWQgZnJvbSBHcml6emx5IEh0dHBDb2RlY1V0aWxzLmNoZWNrRU9MCisgICAgcHJpdmF0ZSBpbnQgY2hlY2tFT0woZmluYWwgQnl0ZUJ1ZmZlciBpbnB1dCkgeworICAgICAgICBmaW5hbCBpbnQgb2Zmc2V0ID0gaGVhZGVyUGFyc2luZ1N0YXRlLm9mZnNldDsKKyAgICAgICAgZmluYWwgaW50IGF2YWlsID0gaW5wdXQubGltaXQoKSAtIG9mZnNldDsKKworICAgICAgICBmaW5hbCBieXRlIGIxOworICAgICAgICBmaW5hbCBieXRlIGIyOworCisgICAgICAgIGlmIChhdmFpbCA+PSAyKSB7IC8vIGlmIG1vcmUgdGhhbiAyIGJ5dGVzIGF2YWlsYWJsZQorICAgICAgICAgICAgZmluYWwgc2hvcnQgcyA9IGlucHV0LmdldFNob3J0KG9mZnNldCk7CisgICAgICAgICAgICBiMSA9IChieXRlKSAocyA+Pj4gOCk7CisgICAgICAgICAgICBiMiA9IChieXRlKSAocyAmIDB4RkYpOworICAgICAgICB9IGVsc2UgaWYgKGF2YWlsID09IDEpIHsgIC8vIGlmIG9uZSBieXRlIGF2YWlsYWJsZQorICAgICAgICAgICAgYjEgPSBpbnB1dC5nZXQob2Zmc2V0KTsKKyAgICAgICAgICAgIGIyID0gLTE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gLTI7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY2hlY2tDUkxGKGIxLCBiMik7CisgICAgfQorCisgICAgLy8gVGFrZW4gdW5tb2RpZmllZCBmcm9tIEdyaXp6bHkgSHR0cENvZGVjVXRpbHMuY2hlY2tDUkxGCisgICAgcHJpdmF0ZSBpbnQgY2hlY2tDUkxGKGJ5dGUgYjEsIGJ5dGUgYjIpIHsKKyAgICAgICAgaWYgKGIxID09IEh0dHBQYXJzZXJVdGlscy5DUikgeworICAgICAgICAgICAgaWYgKGIyID09IEh0dHBQYXJzZXJVdGlscy5MRikgeworICAgICAgICAgICAgICAgIGhlYWRlclBhcnNpbmdTdGF0ZS5vZmZzZXQgKz0gMjsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYjIgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTI7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoYjEgPT0gSHR0cFBhcnNlclV0aWxzLkxGKSB7CisgICAgICAgICAgICBoZWFkZXJQYXJzaW5nU3RhdGUub2Zmc2V0Kys7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBIdHRwUGFyc2VyVXRpbHMuSGVhZGVyUGFyc2luZ1N0YXRlIGdldEhlYWRlclBhcnNpbmdTdGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIGhlYWRlclBhcnNpbmdTdGF0ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBwYXJzZVN0cmluZyhCeXRlQnVmZmVyIGlucHV0LCBpbnQgc3RhcnRJZHgsIGludCBlbmRJZHgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2VuZElkeCAtIHN0YXJ0SWR4XTsKKyAgICAgICAgaW5wdXQucG9zaXRpb24oc3RhcnRJZHgpOworICAgICAgICBpbnB1dC5nZXQoYnl0ZXMsIDAsIGVuZElkeCAtIHN0YXJ0SWR4KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJ5dGVzLCBFTkNPRElORyk7CisgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBlbmNvZGluZzogIiArIEVOQ09ESU5HLCBlKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgcGFyc2VJbnQoQnl0ZUJ1ZmZlciBpbnB1dCwgaW50IHN0YXJ0SWR4LCBpbnQgZW5kSWR4KSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgdmFsdWUgPSBwYXJzZVN0cmluZyhpbnB1dCwgc3RhcnRJZHgsIGVuZElkeCk7CisgICAgICAgIHJldHVybiBJbnRlZ2VyLnZhbHVlT2YodmFsdWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvSHR0cFBhcnNlclV0aWxzLmphdmEgYi9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL0h0dHBQYXJzZXJVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNzE3N2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL0h0dHBQYXJzZXJVdGlscy5qYXZhCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lmpkay5jb25uZWN0b3IuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworCisvKioKKyAqIEBhdXRob3IgQWxleGV5IFN0YXNob2sKKyAqIEBhdXRob3IgUGV0ciBKYW5vdWNoIChwZXRyLmphbm91Y2ggYXQgb3JhY2xlLmNvbSkKKyAqLworY2xhc3MgSHR0cFBhcnNlclV0aWxzIHsKKworICAgIHN0YXRpYyBmaW5hbCBieXRlIENSID0gKGJ5dGUpICdccic7CisgICAgc3RhdGljIGZpbmFsIGJ5dGUgTEYgPSAoYnl0ZSkgJ1xuJzsKKyAgICBzdGF0aWMgZmluYWwgYnl0ZSBTUCA9IChieXRlKSAnICc7CisgICAgc3RhdGljIGZpbmFsIGJ5dGUgSFQgPSAoYnl0ZSkgJ1x0JzsKKyAgICBzdGF0aWMgZmluYWwgYnl0ZSBDT01NQSA9IChieXRlKSAnLCc7CisgICAgc3RhdGljIGZpbmFsIGJ5dGUgQ09MT04gPSAoYnl0ZSkgJzonOworICAgIHN0YXRpYyBmaW5hbCBieXRlIFNFTUlfQ09MT04gPSAoYnl0ZSkgJzsnOworICAgIHN0YXRpYyBmaW5hbCBieXRlIEEgPSAoYnl0ZSkgJ0EnOworICAgIHN0YXRpYyBmaW5hbCBieXRlIFogPSAoYnl0ZSkgJ1onOworICAgIHN0YXRpYyBmaW5hbCBieXRlIGEgPSAoYnl0ZSkgJ2EnOworICAgIHN0YXRpYyBmaW5hbCBieXRlIExDX09GRlNFVCA9IEEgLSBhOworCisgICAgc3RhdGljIGludCBza2lwU3BhY2VzKEJ5dGVCdWZmZXIgaW5wdXQsIGludCBvZmZzZXQsIGludCBwYWNrZXRMaW1pdCkgeworICAgICAgICBmaW5hbCBpbnQgbGltaXQgPSBNYXRoLm1pbihpbnB1dC5saW1pdCgpLCBwYWNrZXRMaW1pdCk7CisgICAgICAgIHdoaWxlIChvZmZzZXQgPCBsaW1pdCkgeworICAgICAgICAgICAgZmluYWwgYnl0ZSBiID0gaW5wdXQuZ2V0KG9mZnNldCk7CisgICAgICAgICAgICBpZiAoaXNOb3RTcGFjZUFuZFRhYihiKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG9mZnNldCsrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHN0YXRpYyBib29sZWFuIGlzTm90U3BhY2VBbmRUYWIoYnl0ZSBiKSB7CisgICAgICAgIHJldHVybiAhaXNTcGFjZU9yVGFiKGIpOworICAgIH0KKworICAgIHN0YXRpYyBib29sZWFuIGlzU3BhY2VPclRhYihieXRlIGIpIHsKKyAgICAgICAgcmV0dXJuIChiID09IEh0dHBQYXJzZXJVdGlscy5TUCB8fCBiID09IEh0dHBQYXJzZXJVdGlscy5IVCk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIEhlYWRlclBhcnNpbmdTdGF0ZSB7CisKKyAgICAgICAgZmluYWwgaW50IG1heEhlYWRlclNpemU7CisgICAgICAgIGludCBwYWNrZXRMaW1pdDsKKworICAgICAgICBpbnQgc3RhdGU7CisgICAgICAgIGludCBzdWJTdGF0ZTsKKworICAgICAgICBpbnQgc3RhcnQ7CisgICAgICAgIGludCBvZmZzZXQ7CisgICAgICAgIGludCBjaGVja3BvaW50ID0gLTE7IC8vIGV4dHJhIHBhcnNpbmcgc3RhdGUgZmllbGQKKyAgICAgICAgaW50IGNoZWNrcG9pbnQyID0gLTE7IC8vIGV4dHJhIHBhcnNpbmcgc3RhdGUgZmllbGQKKworICAgICAgICBTdHJpbmcgaGVhZGVyTmFtZTsKKworICAgICAgICBsb25nIHBhcnNpbmdOdW1lcmljVmFsdWU7CisKKyAgICAgICAgaW50IGNvbnRlbnRMZW5ndGhIZWFkZXJzQ291bnQ7ICAgLy8gbnVtYmVyIG9mIENvbnRlbnQtTGVuZ3RoIGhlYWRlcnMgaW4gdGhlIEhUVFAgaGVhZGVyCisgICAgICAgIGJvb2xlYW4gY29udGVudExlbmd0aHNEaWZmZXI7CisKKyAgICAgICAgSGVhZGVyUGFyc2luZ1N0YXRlKGludCBtYXhIZWFkZXJTaXplKSB7CisgICAgICAgICAgICB0aGlzLm1heEhlYWRlclNpemUgPSBtYXhIZWFkZXJTaXplOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCByZWN5Y2xlKCkgeworICAgICAgICAgICAgc3RhdGUgPSAwOworICAgICAgICAgICAgc3ViU3RhdGUgPSAwOworICAgICAgICAgICAgc3RhcnQgPSAwOworICAgICAgICAgICAgb2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIGNoZWNrcG9pbnQgPSAtMTsKKyAgICAgICAgICAgIGNoZWNrcG9pbnQyID0gLTE7CisgICAgICAgICAgICBwYXJzaW5nTnVtZXJpY1ZhbHVlID0gMDsKKyAgICAgICAgICAgIGNvbnRlbnRMZW5ndGhIZWFkZXJzQ291bnQgPSAwOworICAgICAgICAgICAgY29udGVudExlbmd0aHNEaWZmZXIgPSBmYWxzZTsKKyAgICAgICAgICAgIGhlYWRlck5hbWUgPSBudWxsOworICAgICAgICAgICAgcGFja2V0TGltaXQgPSBtYXhIZWFkZXJTaXplOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBjaGVja092ZXJmbG93KFN0cmluZyBlcnJvckRlc2NyaXB0aW9uSWZPdmVyZmxvdykgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPCBwYWNrZXRMaW1pdCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKGVycm9yRGVzY3JpcHRpb25JZk92ZXJmbG93KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBDb250ZW50UGFyc2luZ1N0YXRlIHsKKworICAgICAgICBib29sZWFuIGlzTGFzdENodW5rOworICAgICAgICBpbnQgY2h1bmtDb250ZW50U3RhcnQgPSAtMTsKKyAgICAgICAgbG9uZyBjaHVua0xlbmd0aCA9IC0xOworICAgICAgICBsb25nIGNodW5rUmVtYWluZGVyID0gLTE7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9IdHRwUmVxdWVzdC5qYXZhIGIvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9IdHRwUmVxdWVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZWE4MjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL0h0dHBSZXF1ZXN0LmphdmEKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamRrLmNvbm5lY3Rvci5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBAYXV0aG9yIFBldHIgSmFub3VjaCAocGV0ci5qYW5vdWNoIGF0IG9yYWNsZS5jb20pCisgKi8KK2NsYXNzIEh0dHBSZXF1ZXN0IHsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1ldGhvZDsKKyAgICBwcml2YXRlIGZpbmFsIFVSSSB1cmk7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGhlYWRlcnMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBCb2R5TW9kZSBib2R5TW9kZTsKKyAgICBwcml2YXRlIGZpbmFsIEJvZHlPdXRwdXRTdHJlYW0gYm9keVN0cmVhbTsKKworICAgIHByaXZhdGUgSHR0cFJlcXVlc3QoU3RyaW5nIG1ldGhvZCwgVVJJIHVyaSwgQm9keU1vZGUgYm9keU1vZGUsIEJvZHlPdXRwdXRTdHJlYW0gYm9keVN0cmVhbSkgeworICAgICAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZDsKKyAgICAgICAgdGhpcy51cmkgPSB1cmk7CisgICAgICAgIHRoaXMuYm9keU1vZGUgPSBib2R5TW9kZTsKKyAgICAgICAgdGhpcy5ib2R5U3RyZWFtID0gYm9keVN0cmVhbTsKKyAgICB9CisKKyAgICBzdGF0aWMgSHR0cFJlcXVlc3QgY3JlYXRlQm9keWxlc3MoU3RyaW5nIG1ldGhvZCwgVVJJIHVyaSkgeworICAgICAgICBIdHRwUmVxdWVzdCBodHRwUmVxdWVzdCA9IG5ldyBIdHRwUmVxdWVzdChtZXRob2QsIHVyaSwgQm9keU1vZGUuTk9ORSwgbnVsbCk7CisgICAgICAgIHJldHVybiBodHRwUmVxdWVzdDsKKyAgICB9CisKKyAgICBzdGF0aWMgSHR0cFJlcXVlc3QgY3JlYXRlQ2h1bmtlZChTdHJpbmcgbWV0aG9kLCBVUkkgdXJpLCBpbnQgY2h1bmtTaXplKSB7CisgICAgICAgIENodW5rZWRCb2R5T3V0cHV0U3RyZWFtIGJvZHlTdHJlYW0gPSBuZXcgQ2h1bmtlZEJvZHlPdXRwdXRTdHJlYW0oY2h1bmtTaXplKTsKKyAgICAgICAgcmV0dXJuIG5ldyBIdHRwUmVxdWVzdChtZXRob2QsIHVyaSwgQm9keU1vZGUuQ0hVTktFRCwgYm9keVN0cmVhbSk7CisgICAgfQorCisgICAgc3RhdGljIEh0dHBSZXF1ZXN0IGNyZWF0ZUJ1ZmZlcmVkKFN0cmluZyBtZXRob2QsIFVSSSB1cmkpIHsKKyAgICAgICAgQnVmZmVyZWRCb2R5T3V0cHV0U3RyZWFtIGJvZHlPdXRwdXRTdHJlYW0gPSBuZXcgQnVmZmVyZWRCb2R5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIHJldHVybiBuZXcgSHR0cFJlcXVlc3QobWV0aG9kLCB1cmksIEJvZHlNb2RlLkJVRkZFUkVELCBib2R5T3V0cHV0U3RyZWFtKTsKKyAgICB9CisKKyAgICBTdHJpbmcgZ2V0TWV0aG9kKCkgeworICAgICAgICByZXR1cm4gbWV0aG9kOworICAgIH0KKworICAgIFVSSSBnZXRVcmkoKSB7CisgICAgICAgIHJldHVybiB1cmk7CisgICAgfQorCisgICAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBnZXRIZWFkZXJzKCkgeworICAgICAgICByZXR1cm4gaGVhZGVyczsKKyAgICB9CisKKyAgICBCb2R5TW9kZSBnZXRCb2R5TW9kZSgpIHsKKyAgICAgICAgcmV0dXJuIGJvZHlNb2RlOworICAgIH0KKworICAgIEJvZHlPdXRwdXRTdHJlYW0gZ2V0Qm9keVN0cmVhbSgpIHsKKyAgICAgICAgaWYgKEJvZHlNb2RlLk5PTkUgPT0gYm9keU1vZGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuSFRUUF9SRVFVRVNUX05PX0JPRFkoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYm9keVN0cmVhbTsKKyAgICB9CisKKyAgICB2b2lkIGFkZEhlYWRlcklmTm90UHJlc2VudChTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIExpc3Q8U3RyaW5nPiB2YWx1ZXMgPSBoZWFkZXJzLmdldChuYW1lKTsKKyAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7CisgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0PD4oMSk7CisgICAgICAgICAgICBoZWFkZXJzLnB1dChuYW1lLCB2YWx1ZXMpOworICAgICAgICAgICAgdmFsdWVzLmFkZCh2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBCeXRlQnVmZmVyIGdldEJ1ZmZlcmVkQm9keSgpIHsKKyAgICAgICAgaWYgKEJvZHlNb2RlLkJVRkZFUkVEICE9IGJvZHlNb2RlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLkhUVFBfUkVRVUVTVF9OT19CVUZGRVJFRF9CT0RZKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICgoQnVmZmVyZWRCb2R5T3V0cHV0U3RyZWFtKSBib2R5U3RyZWFtKS50b0J1ZmZlcigpOworICAgIH0KKworICAgIGludCBnZXRCb2R5U2l6ZSgpIHsKKyAgICAgICAgaWYgKGJvZHlNb2RlID09IEJvZHlNb2RlLkNIVU5LRUQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuSFRUUF9SRVFVRVNUX0JPRFlfU0laRV9OT1RfQVZBSUxBQkxFKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICgoQnVmZmVyZWRCb2R5T3V0cHV0U3RyZWFtKSBib2R5U3RyZWFtKS50b0J1ZmZlcigpLnJlbWFpbmluZygpOworICAgIH0KKworICAgIGVudW0gQm9keU1vZGUgeworICAgICAgICBOT05FLAorICAgICAgICBDSFVOS0VELAorICAgICAgICBCVUZGRVJFRAorICAgIH0KK30KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvSHR0cFJlcXVlc3RFbmNvZGVyLmphdmEgYi9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL0h0dHBSZXF1ZXN0RW5jb2Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMjljMTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL0h0dHBSZXF1ZXN0RW5jb2Rlci5qYXZhCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lmpkay5jb25uZWN0b3IuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBAYXV0aG9yIFBldHIgSmFub3VjaCAocGV0ci5qYW5vdWNoIGF0IG9yYWNsZS5jb20pCisgKi8KK2NsYXNzIEh0dHBSZXF1ZXN0RW5jb2RlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5DT0RJTkcgPSAiSVNPLTg4NTktMSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExJTkVfU0VQQVJBVE9SID0gIlxyXG4iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBMSU5FX1NFUEFSQVRPUl9CWVRFUyA9IExJTkVfU0VQQVJBVE9SLmdldEJ5dGVzKENoYXJzZXQuZm9yTmFtZShFTkNPRElORykpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBMQVNUX0NIVU5LID0gIjBcclxuXHJcbiIuZ2V0Qnl0ZXMoQ2hhcnNldC5mb3JOYW1lKEVOQ09ESU5HKSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfVkVSU0lPTiA9ICJIVFRQLzEuMSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFwcGVuZFVwZ3JhZGVIZWFkZXJzKFN0cmluZ0J1aWxkZXIgcmVxdWVzdCwgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBoZWFkZXJzKSB7CisgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTGlzdDxTdHJpbmc+PiBoZWFkZXIgOiBoZWFkZXJzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgdmFsdWUgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgZm9yIChTdHJpbmcgdmFsdWVQYXJ0IDogaGVhZGVyLmdldFZhbHVlKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoKCkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZS5hcHBlbmQoIiwiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdmFsdWUuYXBwZW5kKHZhbHVlUGFydCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhcHBlbmRIZWFkZXIocmVxdWVzdCwgaGVhZGVyLmdldEtleSgpLCB2YWx1ZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlcXVlc3QuYXBwZW5kKExJTkVfU0VQQVJBVE9SKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFwcGVuZEhlYWRlcihTdHJpbmdCdWlsZGVyIHJlcXVlc3QsIFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgeworICAgICAgICByZXF1ZXN0LmFwcGVuZChrZXkpOworICAgICAgICByZXF1ZXN0LmFwcGVuZCgiOiAiKTsKKyAgICAgICAgcmVxdWVzdC5hcHBlbmQodmFsdWUpOworICAgICAgICByZXF1ZXN0LmFwcGVuZChMSU5FX1NFUEFSQVRPUik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhcHBlbmRGaXJzdExpbmUoU3RyaW5nQnVpbGRlciByZXF1ZXN0LCBIdHRwUmVxdWVzdCBodHRwUmVxdWVzdCkgeworICAgICAgICByZXF1ZXN0LmFwcGVuZChodHRwUmVxdWVzdC5nZXRNZXRob2QoKSk7CisgICAgICAgIHJlcXVlc3QuYXBwZW5kKCIgIik7CisgICAgICAgIGlmIChodHRwUmVxdWVzdC5nZXRNZXRob2QoKS5lcXVhbHMoQ29uc3RhbnRzLkNPTk5FQ1QpKSB7CisgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZChodHRwUmVxdWVzdC5nZXRVcmkoKS50b1N0cmluZygpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFVSSSB1cmkgPSBodHRwUmVxdWVzdC5nZXRVcmkoKTsKKyAgICAgICAgICAgIFN0cmluZyBwYXRoID0gdXJpLmdldFJhd1BhdGgoKTsKKyAgICAgICAgICAgIGlmIChwYXRoID09IG51bGwgfHwgcGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBwYXRoID0gIi8iOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodXJpLmdldFJhd1F1ZXJ5KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHBhdGggKz0gIj8iICsgdXJpLmdldFJhd1F1ZXJ5KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKHBhdGgpOworICAgICAgICB9CisgICAgICAgIHJlcXVlc3QuYXBwZW5kKCIgIik7CisgICAgICAgIHJlcXVlc3QuYXBwZW5kKEhUVFBfVkVSU0lPTik7CisgICAgICAgIHJlcXVlc3QuYXBwZW5kKExJTkVfU0VQQVJBVE9SKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQnl0ZUJ1ZmZlciBlbmNvZGVIZWFkZXIoSHR0cFJlcXVlc3QgaHR0cFJlcXVlc3QpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciByZXF1ZXN0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgYXBwZW5kRmlyc3RMaW5lKHJlcXVlc3QsIGh0dHBSZXF1ZXN0KTsKKyAgICAgICAgYXBwZW5kVXBncmFkZUhlYWRlcnMocmVxdWVzdCwgaHR0cFJlcXVlc3QuZ2V0SGVhZGVycygpKTsKKyAgICAgICAgU3RyaW5nIHJlcXVlc3RTdHIgPSByZXF1ZXN0LnRvU3RyaW5nKCk7CisgICAgICAgIGJ5dGVbXSBieXRlcyA9IHJlcXVlc3RTdHIuZ2V0Qnl0ZXMoQ2hhcnNldC5mb3JOYW1lKEVOQ09ESU5HKSk7CisgICAgICAgIHJldHVybiBCeXRlQnVmZmVyLndyYXAoYnl0ZXMpOworICAgIH0KKworICAgIHN0YXRpYyBCeXRlQnVmZmVyIGVuY29kZUNodW5rKEJ5dGVCdWZmZXIgZGF0YSkgeworICAgICAgICBpZiAoZGF0YS5yZW1haW5pbmcoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlci53cmFwKExBU1RfQ0hVTkspOworICAgICAgICB9CisKKyAgICAgICAgYnl0ZVtdIHN0YXJ0Qnl0ZXMgPSBnZXRDaHVua0hlYWRlckJ5dGVzKGRhdGEucmVtYWluaW5nKCkpOworICAgICAgICBCeXRlQnVmZmVyIGNodW5rQnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShzdGFydEJ5dGVzLmxlbmd0aCArIGRhdGEucmVtYWluaW5nKCkgKyAyKTsKKyAgICAgICAgY2h1bmtCdWZmZXIucHV0KHN0YXJ0Qnl0ZXMpOworICAgICAgICBjaHVua0J1ZmZlci5wdXQoZGF0YSk7CisgICAgICAgIGNodW5rQnVmZmVyLnB1dChMSU5FX1NFUEFSQVRPUl9CWVRFUyk7CisgICAgICAgIGNodW5rQnVmZmVyLmZsaXAoKTsKKworICAgICAgICByZXR1cm4gY2h1bmtCdWZmZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGdldENodW5rSGVhZGVyQnl0ZXMoaW50IGRhdGFMZW5ndGgpIHsKKyAgICAgICAgU3RyaW5nIGNodW5rU3RhcnQgPSBJbnRlZ2VyLnRvSGV4U3RyaW5nKGRhdGFMZW5ndGgpICsgTElORV9TRVBBUkFUT1I7CisgICAgICAgIHJldHVybiBjaHVua1N0YXJ0LmdldEJ5dGVzKENoYXJzZXQuZm9yTmFtZShFTkNPRElORykpOworICAgIH0KKworICAgIHN0YXRpYyBpbnQgZ2V0Q2h1bmtTaXplKGludCBkYXRhTGVuZ3RoKSB7CisgICAgICAgIGlmIChkYXRhTGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBMQVNUX0NIVU5LLmxlbmd0aDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBnZXRDaHVua0hlYWRlckJ5dGVzKGRhdGFMZW5ndGgpLmxlbmd0aCArIGRhdGFMZW5ndGggKyAyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvSHR0cFJlc3BvbnNlLmphdmEgYi9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL0h0dHBSZXNwb25zZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYWE3ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL0h0dHBSZXNwb25zZS5qYXZhCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lmpkay5jb25uZWN0b3IuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogQGF1dGhvciBQZXRyIEphbm91Y2ggKHBldHIuamFub3VjaCBhdCBvcmFjbGUuY29tKQorICovCitjbGFzcyBIdHRwUmVzcG9uc2UgeworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcHJvdG9jb2xWZXJzaW9uOworICAgIHByaXZhdGUgZmluYWwgaW50IHN0YXR1c0NvZGU7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcmVhc29uUGhyYXNlOworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBoZWFkZXJzID0gbmV3IEhhc2hNYXA8PigpOworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiB0cmFpbGVySGVhZGVycyA9IG5ldyBIYXNoTWFwPD4oMCk7CisgICAgcHJpdmF0ZSBmaW5hbCBBc3luY2hyb25vdXNCb2R5SW5wdXRTdHJlYW0gYm9keVN0cmVhbTsKKyAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gaGFzQ29udGVudCA9IHRydWU7CisKKyAgICBIdHRwUmVzcG9uc2UoU3RyaW5nIHByb3RvY29sVmVyc2lvbiwgaW50IHN0YXR1c0NvZGUsIFN0cmluZyByZWFzb25QaHJhc2UpIHsKKyAgICAgICAgdGhpcy5wcm90b2NvbFZlcnNpb24gPSBwcm90b2NvbFZlcnNpb247CisgICAgICAgIHRoaXMuc3RhdHVzQ29kZSA9IHN0YXR1c0NvZGU7CisgICAgICAgIHRoaXMucmVhc29uUGhyYXNlID0gcmVhc29uUGhyYXNlOworICAgICAgICBib2R5U3RyZWFtID0gbmV3IEFzeW5jaHJvbm91c0JvZHlJbnB1dFN0cmVhbSgpOworICAgIH0KKworICAgIFN0cmluZyBnZXRQcm90b2NvbFZlcnNpb24oKSB7CisgICAgICAgIHJldHVybiBwcm90b2NvbFZlcnNpb247CisgICAgfQorCisgICAgaW50IGdldFN0YXR1c0NvZGUoKSB7CisgICAgICAgIHJldHVybiBzdGF0dXNDb2RlOworICAgIH0KKworICAgIFN0cmluZyBnZXRSZWFzb25QaHJhc2UoKSB7CisgICAgICAgIHJldHVybiByZWFzb25QaHJhc2U7CisgICAgfQorCisgICAgdm9pZCBzZXRIYXNDb250ZW50KGJvb2xlYW4gaGFzQ29udGVudCkgeworICAgICAgICB0aGlzLmhhc0NvbnRlbnQgPSBoYXNDb250ZW50OworICAgIH0KKworICAgIGJvb2xlYW4gZ2V0SGFzQ29udGVudCgpIHsKKyAgICAgICAgcmV0dXJuIGhhc0NvbnRlbnQ7CisgICAgfQorCisgICAgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBnZXRIZWFkZXJzKCkgeworICAgICAgICByZXR1cm4gaGVhZGVyczsKKyAgICB9CisKKyAgICBMaXN0PFN0cmluZz4gZ2V0SGVhZGVyKFN0cmluZyBuYW1lKSB7CisgICAgICAgIGZvciAoU3RyaW5nIGhlYWRlck5hbWUgOiBoZWFkZXJzLmtleVNldCgpKSB7CisgICAgICAgICAgICBpZiAoaGVhZGVyTmFtZS5lcXVhbHNJZ25vcmVDYXNlKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGhlYWRlcnMuZ2V0KGhlYWRlck5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgdm9pZCBhZGRIZWFkZXIoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBMaXN0PFN0cmluZz4gdmFsdWVzID0gZ2V0SGVhZGVyKG5hbWUpOworICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8PigxKTsKKyAgICAgICAgICAgIGhlYWRlcnMucHV0KG5hbWUsIHZhbHVlcyk7CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZXMuYWRkKHZhbHVlKTsKKyAgICB9CisKKyAgICBMaXN0PFN0cmluZz4gZ2V0VHJhaWxlckhlYWRlcihTdHJpbmcgbmFtZSkgeworICAgICAgICBmb3IgKFN0cmluZyBoZWFkZXJOYW1lIDogdHJhaWxlckhlYWRlcnMua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIGlmIChoZWFkZXJOYW1lLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJhaWxlckhlYWRlcnMuZ2V0KGhlYWRlck5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgdm9pZCBhZGRUcmFpbGVySGVhZGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHZhbHVlcyA9IGdldFRyYWlsZXJIZWFkZXIobmFtZSk7CisgICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgdmFsdWVzID0gbmV3IEFycmF5TGlzdDw+KDEpOworICAgICAgICAgICAgdHJhaWxlckhlYWRlcnMucHV0KG5hbWUsIHZhbHVlcyk7CisgICAgICAgIH0KKworICAgICAgICB2YWx1ZXMuYWRkKHZhbHVlKTsKKyAgICB9CisKKyAgICBBc3luY2hyb25vdXNCb2R5SW5wdXRTdHJlYW0gZ2V0Qm9keVN0cmVhbSgpIHsKKyAgICAgICAgcmV0dXJuIGJvZHlTdHJlYW07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9JbnRlcmNlcHRpbmdPdXRwdXRTdHJlYW0uamF2YSBiL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvSW50ZXJjZXB0aW5nT3V0cHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFkMTg0MAotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvSW50ZXJjZXB0aW5nT3V0cHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZGsuY29ubmVjdG9yLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKKworLyoqCisgKiBBIHN0cmVhbSB0aGF0IGludm9rZXMge0BsaW5rIEZpcnN0Q2FsbExpc3RlbmVyfSB3aGVuIGFueSBvcGVyYXRpb24gaXMgaW52b2tlZC4KKyAqIHtAbGluayBGaXJzdENhbGxMaXN0ZW5lcn0gaXMgaW52b2tlZCBvbmx5IG9uY2UgaW4gdGhlIHN0cmVhbSBsaWZldGltZS4KKyAqCisgKiBAYXV0aG9yIFBldHIgSmFub3VjaCAocGV0ci5qYW5vdWNoIGF0IG9yYWNsZS5jb20pCisgKi8KK2NsYXNzIEludGVyY2VwdGluZ091dHB1dFN0cmVhbSBleHRlbmRzIE91dHB1dFN0cmVhbSB7CisKKyAgICBwcml2YXRlIGZpbmFsIE91dHB1dFN0cmVhbSB3cmFwcGVkU3RyZWFtOworICAgIHByaXZhdGUgZmluYWwgRmlyc3RDYWxsTGlzdGVuZXIgZmlyc3RDYWxsTGlzdGVuZXI7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGxpc3RlbmVySW52b2tlZCA9IGZhbHNlOworCisgICAgSW50ZXJjZXB0aW5nT3V0cHV0U3RyZWFtKE91dHB1dFN0cmVhbSB3cmFwcGVkU3RyZWFtLCBGaXJzdENhbGxMaXN0ZW5lciBmaXJzdENhbGxMaXN0ZW5lcikgeworICAgICAgICB0aGlzLndyYXBwZWRTdHJlYW0gPSB3cmFwcGVkU3RyZWFtOworICAgICAgICB0aGlzLmZpcnN0Q2FsbExpc3RlbmVyID0gZmlyc3RDYWxsTGlzdGVuZXI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeUludm9raW5nTGlzdGVuZXIoKTsKKyAgICAgICAgd3JhcHBlZFN0cmVhbS53cml0ZShiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5SW52b2tpbmdMaXN0ZW5lcigpOworICAgICAgICB3cmFwcGVkU3RyZWFtLndyaXRlKGIsIG9mZiwgbGVuKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeUludm9raW5nTGlzdGVuZXIoKTsKKyAgICAgICAgd3JhcHBlZFN0cmVhbS5mbHVzaCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5SW52b2tpbmdMaXN0ZW5lcigpOworICAgICAgICB3cmFwcGVkU3RyZWFtLmNsb3NlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeUludm9raW5nTGlzdGVuZXIoKTsKKyAgICAgICAgd3JhcHBlZFN0cmVhbS53cml0ZShiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdHJ5SW52b2tpbmdMaXN0ZW5lcigpIHsKKyAgICAgICAgaWYgKCFsaXN0ZW5lckludm9rZWQpIHsKKyAgICAgICAgICAgIGxpc3RlbmVySW52b2tlZCA9IHRydWU7CisgICAgICAgICAgICB0aGlzLmZpcnN0Q2FsbExpc3RlbmVyLm9uSW52b2tlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgaW50ZXJmYWNlIEZpcnN0Q2FsbExpc3RlbmVyIHsKKworICAgICAgICB2b2lkIG9uSW52b2tlZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvSmRrQ29ubmVjdG9yLmphdmEgYi9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL0pka0Nvbm5lY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNzIzYTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL0pka0Nvbm5lY3Rvci5qYXZhCkBAIC0wLDAgKzEsMjQ4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lmpkay5jb25uZWN0b3IuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LkNvb2tpZU1hbmFnZXI7CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db21wbGV0YWJsZUZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOworCitpbXBvcnQgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5SZXF1ZXN0RW50aXR5UHJvY2Vzc2luZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuc3BpLkFzeW5jQ29ubmVjdG9yQ2FsbGJhY2s7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnNwaS5Db25uZWN0b3I7CisKKy8qKgorICogQGF1dGhvciBQZXRyIEphbm91Y2ggKHBldHIuamFub3VjaCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSmRrQ29ubmVjdG9yIGltcGxlbWVudHMgQ29ubmVjdG9yIHsKKworICAgIHByaXZhdGUgZmluYWwgSHR0cENvbm5lY3Rpb25Qb29sIGh0dHBDb25uZWN0aW9uUG9vbDsKKyAgICBwcml2YXRlIGZpbmFsIENvbm5lY3RvckNvbmZpZ3VyYXRpb24gY29ubmVjdG9yQ29uZmlndXJhdGlvbjsKKworICAgIHB1YmxpYyBKZGtDb25uZWN0b3IoQ2xpZW50IGNsaWVudCwgQ29uZmlndXJhdGlvbiBjb25maWcpIHsKKyAgICAgICAgY29ubmVjdG9yQ29uZmlndXJhdGlvbiA9IG5ldyBDb25uZWN0b3JDb25maWd1cmF0aW9uKGNsaWVudCwgY29uZmlnKTsKKyAgICAgICAgQ29va2llTWFuYWdlciBjb29raWVNYW5hZ2VyID0gbmV3IENvb2tpZU1hbmFnZXIoKTsKKyAgICAgICAgY29va2llTWFuYWdlci5zZXRDb29raWVQb2xpY3koY29ubmVjdG9yQ29uZmlndXJhdGlvbi5nZXRDb29raWVQb2xpY3koKSk7CisgICAgICAgIGh0dHBDb25uZWN0aW9uUG9vbCA9IG5ldyBIdHRwQ29ubmVjdGlvblBvb2woY29ubmVjdG9yQ29uZmlndXJhdGlvbiwgY29va2llTWFuYWdlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENsaWVudFJlc3BvbnNlIGFwcGx5KENsaWVudFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIEZ1dHVyZTw/PiBmdXR1cmUgPSBhcHBseShyZXF1ZXN0LCBuZXcgQXN5bmNDb25uZWN0b3JDYWxsYmFjaygpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcmVzcG9uc2UoQ2xpZW50UmVzcG9uc2UgcmVzcG9uc2UpIHsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZhaWx1cmUoVGhyb3dhYmxlIGZhaWx1cmUpIHsKKworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIChDbGllbnRSZXNwb25zZSkgZnV0dXJlLmdldCgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24odW53cmFwRXhlY3V0aW9uRXhjZXB0aW9uKGUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgVGhyb3dhYmxlIHVud3JhcEV4ZWN1dGlvbkV4Y2VwdGlvbihUaHJvd2FibGUgZmFpbHVyZSkgeworICAgICAgICByZXR1cm4gKGZhaWx1cmUgIT0gbnVsbCAmJiBmYWlsdXJlIGluc3RhbmNlb2YgRXhlY3V0aW9uRXhjZXB0aW9uKSA/IGZhaWx1cmUuZ2V0Q2F1c2UoKSA6IGZhaWx1cmU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEZ1dHVyZTw/PiBhcHBseShmaW5hbCBDbGllbnRSZXF1ZXN0IHJlcXVlc3QsIGZpbmFsIEFzeW5jQ29ubmVjdG9yQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8Q2xpZW50UmVzcG9uc2U+IHJlc3BvbnNlRnV0dXJlID0gbmV3IENvbXBsZXRhYmxlRnV0dXJlPD4oKTsKKyAgICAgICAgLy8ganVzdCBzbyB3ZSBkb24ndCBoYXZlIHRvIGRyYWcgYXJvdW5kIGJvdGggdGhlIGZ1dHVyZSBhbmQgY2FsbGJhY2sKKyAgICAgICAgZmluYWwgQXN5bmNDb25uZWN0b3JDYWxsYmFjayBpbnRlcm5hbENhbGxiYWNrID0gbmV3IEFzeW5jQ29ubmVjdG9yQ2FsbGJhY2soKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlc3BvbnNlKENsaWVudFJlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgICAgICAgICAgICAgY2FsbGJhY2sucmVzcG9uc2UocmVzcG9uc2UpOworICAgICAgICAgICAgICAgIHJlc3BvbnNlRnV0dXJlLmNvbXBsZXRlKHJlc3BvbnNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBmYWlsdXJlKFRocm93YWJsZSBmYWlsdXJlKSB7CisgICAgICAgICAgICAgICAgVGhyb3dhYmxlIGFjdHVhbEZhaWx1cmUgPSB1bndyYXBFeGVjdXRpb25FeGNlcHRpb24oZmFpbHVyZSk7CisgICAgICAgICAgICAgICAgY2FsbGJhY2suZmFpbHVyZShhY3R1YWxGYWlsdXJlKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZUZ1dHVyZS5jb21wbGV0ZUV4Y2VwdGlvbmFsbHkoYWN0dWFsRmFpbHVyZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgZmluYWwgSHR0cFJlcXVlc3QgaHR0cFJlcXVlc3QgPSBjcmVhdGVIdHRwUmVxdWVzdChyZXF1ZXN0KTsKKworICAgICAgICBpZiAoaHR0cFJlcXVlc3QuZ2V0Qm9keU1vZGUoKSA9PSBIdHRwUmVxdWVzdC5Cb2R5TW9kZS5CVUZGRVJFRCkgeworICAgICAgICAgICAgd3JpdGVCdWZmZXJlZEVudGl0eShyZXF1ZXN0LCBodHRwUmVxdWVzdCwgaW50ZXJuYWxDYWxsYmFjayk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaHR0cFJlcXVlc3QuZ2V0Qm9keU1vZGUoKSA9PSBIdHRwUmVxdWVzdC5Cb2R5TW9kZS5CVUZGRVJFRAorICAgICAgICAgICAgICAgIHx8IGh0dHBSZXF1ZXN0LmdldEJvZHlNb2RlKCkgPT0gSHR0cFJlcXVlc3QuQm9keU1vZGUuTk9ORSkgeworICAgICAgICAgICAgc2VuZChyZXF1ZXN0LCBodHRwUmVxdWVzdCwgaW50ZXJuYWxDYWxsYmFjayk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaHR0cFJlcXVlc3QuZ2V0Qm9keU1vZGUoKSA9PSBIdHRwUmVxdWVzdC5Cb2R5TW9kZS5DSFVOS0VEKSB7CisKKyAgICAgICAgICAgIC8qIFdlIHdhaXQgd2l0aCBzZW5kaW5nIHRoZSByZXF1ZXN0IGhlYWRlciB1bnRpbCB0aGUgYm9keSBzdHJlYW0gaGFzIGJlZW4gdG91Y2hlZC4KKyAgICAgICAgICAgICBUaGlzIGlzIGJlY2F1c2Ugb2YgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyLCB3aGljaCBzYXlzOgorCisgICAgICAgICAgICAgIlRoZSBtZXNzYWdlIGhlYWRlciBtYXAgaXMgbXV0YWJsZSBidXQgYW55IGNoYW5nZXMgbXVzdCBiZSBtYWRlIGJlZm9yZSB3cml0aW5nIHRvIHRoZSBvdXRwdXQgc3RyZWFtIHNpbmNlCisgICAgICAgICAgICAgIHRoZSBoZWFkZXJzIHdpbGwgYmUgZmx1c2hlZCBwcmlvciB0byB3cml0aW5nIHRoZSBtZXNzYWdlIGJvZHkiCisKKyAgICAgICAgICAgICAgVGhpcyBtZWFucyB0aGF0IHRoZSBoZWFkZXJzIGNhbiBjaGFuZ2UgdW50aWwgYm9keSBvdXRwdXQgc3RyZWFtIGlzIHVzZWQuCisgICAgICAgICAgICAgICovCisgICAgICAgICAgICBmaW5hbCBJbnRlcmNlcHRpbmdPdXRwdXRTdHJlYW0gYm9keVN0cmVhbSA9IG5ldyBJbnRlcmNlcHRpbmdPdXRwdXRTdHJlYW0oaHR0cFJlcXVlc3QuZ2V0Qm9keVN0cmVhbSgpLAorICAgICAgICAgICAgICAgICAgICAvLyBzZW5kIHRoZSBwcmVwYXJlZCByZXF1ZXN0IHdoZW4gdGhlIHN0cmVhbSBpcyB0b3VjaGVkIGZvciB0aGUgZmlyc3QgdGltZQorICAgICAgICAgICAgICAgICAgICAoKSAtPiBzZW5kKHJlcXVlc3QsIGh0dHBSZXF1ZXN0LCBpbnRlcm5hbENhbGxiYWNrKSk7CisKKyAgICAgICAgICAgIHJlcXVlc3Quc2V0U3RyZWFtUHJvdmlkZXIoY29udGVudExlbmd0aCAtPiBib2R5U3RyZWFtKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmVxdWVzdC53cml0ZUVudGl0eSgpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGludGVybmFsQ2FsbGJhY2suZmFpbHVyZShlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXNwb25zZUZ1dHVyZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgd3JpdGVCdWZmZXJlZEVudGl0eShDbGllbnRSZXF1ZXN0IHJlcXVlc3QsIGZpbmFsIEh0dHBSZXF1ZXN0IGh0dHBSZXF1ZXN0LCBBc3luY0Nvbm5lY3RvckNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIHJlcXVlc3Quc2V0U3RyZWFtUHJvdmlkZXIoY29udGVudExlbmd0aCAtPiBodHRwUmVxdWVzdC5nZXRCb2R5U3RyZWFtKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVxdWVzdC53cml0ZUVudGl0eSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBjYWxsYmFjay5mYWlsdXJlKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNlbmQoZmluYWwgQ2xpZW50UmVxdWVzdCByZXF1ZXN0LCBmaW5hbCBIdHRwUmVxdWVzdCBodHRwUmVxdWVzdCwgZmluYWwgQXN5bmNDb25uZWN0b3JDYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICB0cmFuc2xhdGVIZWFkZXJzKHJlcXVlc3QsIGh0dHBSZXF1ZXN0KTsKKyAgICAgICAgZmluYWwgUmVkaXJlY3RIYW5kbGVyIHJlZGlyZWN0SGFuZGxlciA9IG5ldyBSZWRpcmVjdEhhbmRsZXIoaHR0cENvbm5lY3Rpb25Qb29sLCBodHRwUmVxdWVzdCwgY29ubmVjdG9yQ29uZmlndXJhdGlvbik7CisgICAgICAgIGh0dHBDb25uZWN0aW9uUG9vbC5zZW5kKGh0dHBSZXF1ZXN0LCBuZXcgQ29tcGxldGlvbkhhbmRsZXI8SHR0cFJlc3BvbnNlPigpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBmYWlsZWQoVGhyb3dhYmxlIHRocm93YWJsZSkgeworICAgICAgICAgICAgICAgIGNhbGxiYWNrLmZhaWx1cmUodGhyb3dhYmxlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBjb21wbGV0ZWQoSHR0cFJlc3BvbnNlIHJlc3VsdCkgeworICAgICAgICAgICAgICAgIHJlZGlyZWN0SGFuZGxlci5oYW5kbGVSZWRpcmVjdHMocmVzdWx0LCBuZXcgQ29tcGxldGlvbkhhbmRsZXI8SHR0cFJlc3BvbnNlPigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZhaWxlZChUaHJvd2FibGUgdGhyb3dhYmxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUaHJvd2FibGUgYWN0dWFsRmFpbHVyZSA9IHVud3JhcEV4ZWN1dGlvbkV4Y2VwdGlvbih0aHJvd2FibGUpOworICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suZmFpbHVyZShhY3R1YWxGYWlsdXJlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBjb21wbGV0ZWQoSHR0cFJlc3BvbnNlIHJlc3VsdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50UmVzcG9uc2UgcmVzcG9uc2UgPSB0cmFuc2xhdGVSZXNwb25zZShyZXF1ZXN0LCByZXN1bHQsIHJlZGlyZWN0SGFuZGxlci5nZXRMYXN0UmVxdWVzdFVyaSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLnJlc3BvbnNlKHJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwcml2YXRlIEh0dHBSZXF1ZXN0IGNyZWF0ZUh0dHBSZXF1ZXN0KENsaWVudFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICBPYmplY3QgZW50aXR5ID0gcmVxdWVzdC5nZXRFbnRpdHkoKTsKKworICAgICAgICBpZiAoZW50aXR5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBIdHRwUmVxdWVzdC5jcmVhdGVCb2R5bGVzcyhyZXF1ZXN0LmdldE1ldGhvZCgpLCByZXF1ZXN0LmdldFVyaSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIFJlcXVlc3RFbnRpdHlQcm9jZXNzaW5nIGVudGl0eVByb2Nlc3NpbmcgPSByZXF1ZXN0LnJlc29sdmVQcm9wZXJ0eSgKKyAgICAgICAgICAgICAgICBDbGllbnRQcm9wZXJ0aWVzLlJFUVVFU1RfRU5USVRZX1BST0NFU1NJTkcsIFJlcXVlc3RFbnRpdHlQcm9jZXNzaW5nLmNsYXNzKTsKKworICAgICAgICBIdHRwUmVxdWVzdCBodHRwUmVxdWVzdDsKKyAgICAgICAgaWYgKGVudGl0eVByb2Nlc3NpbmcgIT0gbnVsbCAmJiBlbnRpdHlQcm9jZXNzaW5nID09IFJlcXVlc3RFbnRpdHlQcm9jZXNzaW5nLkNIVU5LRUQpIHsKKyAgICAgICAgICAgIGh0dHBSZXF1ZXN0ID0gSHR0cFJlcXVlc3QuY3JlYXRlQ2h1bmtlZChyZXF1ZXN0LmdldE1ldGhvZCgpLCByZXF1ZXN0LmdldFVyaSgpLCBjb25uZWN0b3JDb25maWd1cmF0aW9uLmdldENodW5rU2l6ZSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGh0dHBSZXF1ZXN0ID0gSHR0cFJlcXVlc3QuY3JlYXRlQnVmZmVyZWQocmVxdWVzdC5nZXRNZXRob2QoKSwgcmVxdWVzdC5nZXRVcmkoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gaHR0cFJlcXVlc3Q7CisgICAgfQorCisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IHRyYW5zbGF0ZUhlYWRlcnMoQ2xpZW50UmVxdWVzdCBjbGllbnRSZXF1ZXN0LCBIdHRwUmVxdWVzdCBodHRwUmVxdWVzdCkgeworICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGhlYWRlcnMgPSBodHRwUmVxdWVzdC5nZXRIZWFkZXJzKCk7CisgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTGlzdDxTdHJpbmc+PiBoZWFkZXIgOiBjbGllbnRSZXF1ZXN0LmdldFN0cmluZ0hlYWRlcnMoKS5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBMaXN0PFN0cmluZz4gdmFsdWVzID0gbmV3IEFycmF5TGlzdDw+KGhlYWRlci5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIGhlYWRlcnMucHV0KGhlYWRlci5nZXRLZXkoKSwgdmFsdWVzKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBoZWFkZXJzOworICAgIH0KKworICAgIHByaXZhdGUgQ2xpZW50UmVzcG9uc2UgdHJhbnNsYXRlUmVzcG9uc2UoZmluYWwgQ2xpZW50UmVxdWVzdCByZXF1ZXN0Q29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEh0dHBSZXNwb25zZSBodHRwUmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkkgcmVxdWVzdFVyaSkgeworCisgICAgICAgIFJlc3BvbnNlLlN0YXR1c1R5cGUgc3RhdHVzVHlwZSA9IG5ldyBSZXNwb25zZS5TdGF0dXNUeXBlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgaW50IGdldFN0YXR1c0NvZGUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGh0dHBSZXNwb25zZS5nZXRTdGF0dXNDb2RlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFJlc3BvbnNlLlN0YXR1cy5GYW1pbHkgZ2V0RmFtaWx5KCkgeworICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5TdGF0dXMuRmFtaWx5LmZhbWlseU9mKGh0dHBSZXNwb25zZS5nZXRTdGF0dXNDb2RlKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVhc29uUGhyYXNlKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBodHRwUmVzcG9uc2UuZ2V0UmVhc29uUGhyYXNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgQ2xpZW50UmVzcG9uc2UgcmVzcG9uc2VDb250ZXh0ID0gbmV3IENsaWVudFJlc3BvbnNlKHN0YXR1c1R5cGUsIHJlcXVlc3RDb250ZXh0LCByZXF1ZXN0VXJpKTsKKworICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGhlYWRlcnMgPSBodHRwUmVzcG9uc2UuZ2V0SGVhZGVycygpOworICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZW50cnkgOiBoZWFkZXJzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIHZhbHVlIDogZW50cnkuZ2V0VmFsdWUoKSkgeworICAgICAgICAgICAgICAgIHJlc3BvbnNlQ29udGV4dC5nZXRIZWFkZXJzKCkuYWRkKGVudHJ5LmdldEtleSgpLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXNwb25zZUNvbnRleHQuc2V0RW50aXR5U3RyZWFtKGh0dHBSZXNwb25zZS5nZXRCb2R5U3RyZWFtKCkpOworICAgICAgICByZXR1cm4gcmVzcG9uc2VDb250ZXh0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICJKREsgY29ubmVjdG9yIjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgaHR0cENvbm5lY3Rpb25Qb29sLmNsb3NlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9QYXJzZUV4Y2VwdGlvbi5qYXZhIGIvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9QYXJzZUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZGFiNjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL1BhcnNlRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZGsuY29ubmVjdG9yLmludGVybmFsOworCisvKioKKyAqIEBhdXRob3IgUGV0ciBKYW5vdWNoIChwZXRyLmphbm91Y2ggYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFBhcnNlRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDY4OTUyNjQ4MzEzNzc4OTU3OEw7CisKKyAgICBQYXJzZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICBzdXBlcihtZXNzYWdlKTsKKyAgICB9CisKKyAgICBQYXJzZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL1Byb3h5QXV0aGVudGljYXRpb25FeGNlcHRpb24uamF2YSBiL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvUHJveHlBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5YTg1ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL1Byb3h5QXV0aGVudGljYXRpb25FeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDI3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lmpkay5jb25uZWN0b3IuaW50ZXJuYWw7CisKKy8qKgorICogQGF1dGhvciBQZXRyIEphbm91Y2ggKHBldHIuamFub3VjaCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgUHJveHlBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisKKyAgICBQcm94eUF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIHN1cGVyKG1lc3NhZ2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvUHJveHlCYXNpY0F1dGhlbnRpY2F0b3IuamF2YSBiL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvUHJveHlCYXNpY0F1dGhlbnRpY2F0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2Q3Nzc3Ci0tLSAvZGV2L251bGwKKysrIGIvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9Qcm94eUJhc2ljQXV0aGVudGljYXRvci5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamRrLmNvbm5lY3Rvci5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuQmFzZTY0OworCisvKioKKyAqIEBhdXRob3IgT25kcmVqIEtvc2F0a2EgKG9uZHJlai5rb3NhdGthIGF0IG9yYWNsZS5jb20pCisgKi8KK2NsYXNzIFByb3h5QmFzaWNBdXRoZW50aWNhdG9yIHsKKworICAgIC8qKgorICAgICAqIEVuY29kaW5nIHVzZWQgZm9yIGF1dGhlbnRpY2F0aW9uIGNhbGN1bGF0aW9ucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDaGFyc2V0IENIQVJBQ1RFUl9TRVQgPSBDaGFyc2V0LmZvck5hbWUoImlzby04ODU5LTEiKTsKKworICAgIHN0YXRpYyBTdHJpbmcgZ2VuZXJhdGVBdXRob3JpemF0aW9uSGVhZGVyKFN0cmluZyB1c2VyTmFtZSwgU3RyaW5nIHBhc3N3b3JkKSB0aHJvd3MgUHJveHlBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGlmICh1c2VyTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUHJveHlBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5QUk9YWV9VU0VSX05BTUVfTUlTU0lORygpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwYXNzd29yZCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUHJveHlBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5QUk9YWV9QQVNTV09SRF9NSVNTSU5HKCkpOworICAgICAgICB9CisKKyAgICAgICAgYnl0ZVtdIHByZWZpeCA9ICh1c2VyTmFtZSArICI6IikuZ2V0Qnl0ZXMoQ0hBUkFDVEVSX1NFVCk7CisgICAgICAgIGJ5dGVbXSBwYXNzd29yZEJ5dGVzID0gcGFzc3dvcmQuZ2V0Qnl0ZXMoQ0hBUkFDVEVSX1NFVCk7CisgICAgICAgIGJ5dGVbXSB1c2VybmFtZVBhc3N3b3JkID0gbmV3IGJ5dGVbcHJlZml4Lmxlbmd0aCArIHBhc3N3b3JkQnl0ZXMubGVuZ3RoXTsKKworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHByZWZpeCwgMCwgdXNlcm5hbWVQYXNzd29yZCwgMCwgcHJlZml4Lmxlbmd0aCk7CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkocGFzc3dvcmRCeXRlcywgMCwgdXNlcm5hbWVQYXNzd29yZCwgcHJlZml4Lmxlbmd0aCwgcGFzc3dvcmRCeXRlcy5sZW5ndGgpOworCisgICAgICAgIHJldHVybiAiQmFzaWMgIiArIEJhc2U2NC5lbmNvZGVBc1N0cmluZyh1c2VybmFtZVBhc3N3b3JkKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL1Byb3h5RGlnZXN0QXV0aGVudGljYXRvci5qYXZhIGIvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9Qcm94eURpZ2VzdEF1dGhlbnRpY2F0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODVlZWI1Ci0tLSAvZGV2L251bGwKKysrIGIvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9Qcm94eURpZ2VzdEF1dGhlbnRpY2F0b3IuamF2YQpAQCAtMCwwICsxLDM5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZGsuY29ubmVjdG9yLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OworaW1wb3J0IGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKKy8qKgorICogR2VuZXJhdGVzIGEgdmFsdWUgb2Yge0Bjb2RlIEF1dGhvcml6YXRpb259IGhlYWRlciBvZiBIVFRQIHJlcXVlc3QgZm9yIERpZ2VzdCBIdHRwIEF1dGhlbnRpY2F0aW9uIHNjaGVtZSAoUkZDIDI2MTcpLgorICoKKyAqIEBhdXRob3IgcmFwaGFlbC5qb2xpdmV0QGdtYWlsLmNvbQorICogQGF1dGhvciBTdGVmYW4gS2F0ZXJrYW1wIChzdGVmYW5Aa2F0ZXJrYW1wLmRlKQorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYSAobWlyb3NsYXYuZnVrc2EgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgT25kcmVqIEtvc2F0a2EgKG9uZHJlai5rb3NhdGthIGF0IG9yYWNsZS5jb20pCisgKi8KK2NsYXNzIFByb3h5RGlnZXN0QXV0aGVudGljYXRvciB7CisKKyAgICAvKioKKyAgICAgKiBFbmNvZGluZyB1c2VkIGZvciBhdXRoZW50aWNhdGlvbiBjYWxjdWxhdGlvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2hhcnNldCBDSEFSQUNURVJfU0VUID0gQ2hhcnNldC5mb3JOYW1lKCJpc28tODg1OS0xIik7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihQcm94eURpZ2VzdEF1dGhlbnRpY2F0b3IuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBIRVhfQVJSQVkgPQorICAgICAgICAgICAgeycwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJ2EnLCAnYicsICdjJywgJ2QnLCAnZScsICdmJ307CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBLRVlfVkFMVUVfUEFJUl9QQVRURVJOID0KKyAgICAgICAgICAgIFBhdHRlcm4uY29tcGlsZSgiKFxcdyspXFxzKj1cXHMqKFwiKFteXCJdKylcInwoXFx3KykpXFxzKiw/XFxzKiIpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDTElFTlRfTk9OQ0VfQllURV9DT1VOVCA9IDQ7CisKKyAgICBwcml2YXRlIFNlY3VyZVJhbmRvbSByYW5kb21HZW5lcmF0b3I7CisKKyAgICBQcm94eURpZ2VzdEF1dGhlbnRpY2F0b3IoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByYW5kb21HZW5lcmF0b3IgPSBTZWN1cmVSYW5kb20uZ2V0SW5zdGFuY2UoIlNIQTFQUk5HIik7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2dnZXIuY29uZmlnKCJObyBzdWNoIGFsZ29yaXRobSB0byBnZW5lcmF0ZSBhdXRob3JpemF0aW9uIGRpZ2VzdCBodHRwIGhlYWRlci4iICsgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTdHJpbmcgZ2VuZXJhdGVBdXRob3JpemF0aW9uSGVhZGVyKFVSSSB1cmksIFN0cmluZyBtZXRob2QsIFN0cmluZyBhdXRoZW50aWNhdGVIZWFkZXIsIFN0cmluZyB1c2VyTmFtZSwgU3RyaW5nIHBhc3N3b3JkKQorICAgICAgICAgICAgdGhyb3dzIFByb3h5QXV0aGVudGljYXRpb25FeGNlcHRpb24geworICAgICAgICBpZiAodXNlck5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFByb3h5QXV0aGVudGljYXRpb25FeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuUFJPWFlfVVNFUl9OQU1FX01JU1NJTkcoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocGFzc3dvcmQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFByb3h5QXV0aGVudGljYXRpb25FeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuUFJPWFlfUEFTU1dPUkRfTUlTU0lORygpKTsKKyAgICAgICAgfQorICAgICAgICBEaWdlc3RTY2hlbWUgZGlnZXN0U2NoZW1lOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZGlnZXN0U2NoZW1lID0gcGFyc2VBdXRoSGVhZGVycyhhdXRoZW50aWNhdGVIZWFkZXIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUHJveHlBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRpZ2VzdFNjaGVtZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUHJveHlBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5QUk9YWV9GQUlMX0FVVEhfSEVBREVSKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNyZWF0ZU5leHRBdXRoVG9rZW4oZGlnZXN0U2NoZW1lLCB1cmkudG9TdHJpbmcoKSwgbWV0aG9kLCB1c2VyTmFtZSwgcGFzc3dvcmQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIGRpZ2VzdCBoZWFkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXV0aEhlYWRlciB2YWx1ZSBvZiB7QGNvZGUgV1dXLUF1dGhlbnRpY2F0ZX0gaGVhZGVyCisgICAgICogQHJldHVybiBEaWdlc3RTY2hlbWUgb3Ige0Bjb2RlIG51bGx9IGlmIG5vIGRpZ2VzdCBoZWFkZXIgZXhpc3RzLgorICAgICAqLworICAgIHByaXZhdGUgRGlnZXN0U2NoZW1lIHBhcnNlQXV0aEhlYWRlcnMoZmluYWwgU3RyaW5nIGF1dGhIZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGF1dGhIZWFkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmdbXSBwYXJ0cyA9IGF1dGhIZWFkZXIudHJpbSgpLnNwbGl0KCJcXHMrIiwgMik7CisKKyAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCAhPSAyKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXBhcnRzWzBdLnRvTG93ZXJDYXNlKCkuZXF1YWxzKCJkaWdlc3QiKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcmVhbG0gPSBudWxsOworICAgICAgICBTdHJpbmcgbm9uY2UgPSBudWxsOworICAgICAgICBTdHJpbmcgb3BhcXVlID0gbnVsbDsKKyAgICAgICAgUU9QIHFvcCA9IFFPUC5VTlNQRUNJRklFRDsKKyAgICAgICAgQWxnb3JpdGhtIGFsZ29yaXRobSA9IEFsZ29yaXRobS5VTlNQRUNJRklFRDsKKyAgICAgICAgYm9vbGVhbiBzdGFsZSA9IGZhbHNlOworCisgICAgICAgIE1hdGNoZXIgbWF0Y2ggPSBLRVlfVkFMVUVfUEFJUl9QQVRURVJOLm1hdGNoZXIocGFydHNbMV0pOworICAgICAgICB3aGlsZSAobWF0Y2guZmluZCgpKSB7CisgICAgICAgICAgICAvLyBleHBlY3QgNCBncm91cHMgKGtleSk9KCIodmFsKSIgfCAodmFsKSkKKyAgICAgICAgICAgIGludCBuYkdyb3VwcyA9IG1hdGNoLmdyb3VwQ291bnQoKTsKKyAgICAgICAgICAgIGlmIChuYkdyb3VwcyAhPSA0KSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcga2V5ID0gbWF0Y2guZ3JvdXAoMSk7CisgICAgICAgICAgICBTdHJpbmcgdmFsTm9RdW90ZXMgPSBtYXRjaC5ncm91cCgzKTsKKyAgICAgICAgICAgIFN0cmluZyB2YWxRdW90ZXMgPSBtYXRjaC5ncm91cCg0KTsKKyAgICAgICAgICAgIFN0cmluZyB2YWwgPSAodmFsTm9RdW90ZXMgPT0gbnVsbCkgPyB2YWxRdW90ZXMgOiB2YWxOb1F1b3RlczsKKyAgICAgICAgICAgIGlmIChrZXkuZXF1YWxzKCJxb3AiKSkgeworICAgICAgICAgICAgICAgIHFvcCA9IFFPUC5wYXJzZSh2YWwpOworICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkuZXF1YWxzKCJyZWFsbSIpKSB7CisgICAgICAgICAgICAgICAgcmVhbG0gPSB2YWw7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGtleS5lcXVhbHMoIm5vbmNlIikpIHsKKyAgICAgICAgICAgICAgICBub25jZSA9IHZhbDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoa2V5LmVxdWFscygib3BhcXVlIikpIHsKKyAgICAgICAgICAgICAgICBvcGFxdWUgPSB2YWw7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGtleS5lcXVhbHMoInN0YWxlIikpIHsKKyAgICAgICAgICAgICAgICBzdGFsZSA9IEJvb2xlYW4ucGFyc2VCb29sZWFuKHZhbCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGtleS5lcXVhbHMoImFsZ29yaXRobSIpKSB7CisgICAgICAgICAgICAgICAgYWxnb3JpdGhtID0gQWxnb3JpdGhtLnBhcnNlKHZhbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBEaWdlc3RTY2hlbWUocmVhbG0sIG5vbmNlLCBvcGFxdWUsIHFvcCwgYWxnb3JpdGhtLCBzdGFsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBkaWdlc3Qgc3RyaW5nIGluY2x1ZGluZyBjb3VudGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGRzICBEaWdlc3RTY2hlbWUgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gdXJpIGNsaWVudCByZXF1ZXN0IHVyaQorICAgICAqIEByZXR1cm4gZGlnZXN0IGF1dGhlbnRpY2F0aW9uIHRva2VuIHN0cmluZworICAgICAqIEB0aHJvd3MgUHJveHlBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbiBpZiBNRDUgaGFzaCBmYWlscworICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGNyZWF0ZU5leHRBdXRoVG9rZW4oZmluYWwgRGlnZXN0U2NoZW1lIGRzLCBTdHJpbmcgdXJpLCBTdHJpbmcgbWV0aG9kLCBTdHJpbmcgdXNlck5hbWUsIFN0cmluZyBwYXNzd29yZCkgdGhyb3dzCisgICAgICAgICAgICBQcm94eUF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDEwMCk7CisgICAgICAgIHNiLmFwcGVuZCgiRGlnZXN0ICIpOworICAgICAgICBhcHBlbmQoc2IsICJ1c2VybmFtZSIsIHVzZXJOYW1lKTsKKyAgICAgICAgYXBwZW5kKHNiLCAicmVhbG0iLCBkcy5nZXRSZWFsbSgpKTsKKyAgICAgICAgYXBwZW5kKHNiLCAibm9uY2UiLCBkcy5nZXROb25jZSgpKTsKKyAgICAgICAgYXBwZW5kKHNiLCAib3BhcXVlIiwgZHMuZ2V0T3BhcXVlKCkpOworICAgICAgICBhcHBlbmQoc2IsICJhbGdvcml0aG0iLCBkcy5nZXRBbGdvcml0aG0oKS50b1N0cmluZygpLCBmYWxzZSk7CisgICAgICAgIGFwcGVuZChzYiwgInFvcCIsIGRzLmdldFFvcCgpLnRvU3RyaW5nKCksIGZhbHNlKTsKKworICAgICAgICBhcHBlbmQoc2IsICJ1cmkiLCB1cmkpOworCisgICAgICAgIFN0cmluZyBoYTE7CisgICAgICAgIGlmIChkcy5nZXRBbGdvcml0aG0oKS5lcXVhbHMoQWxnb3JpdGhtLk1ENV9TRVNTKSkgeworICAgICAgICAgICAgaGExID0gbWQ1KG1kNSh1c2VyTmFtZSwgZHMuZ2V0UmVhbG0oKSwgcGFzc3dvcmQpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGhhMSA9IG1kNSh1c2VyTmFtZSwgZHMuZ2V0UmVhbG0oKSwgcGFzc3dvcmQpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGhhMiA9IG1kNShtZXRob2QsIHVyaSk7CisKKyAgICAgICAgU3RyaW5nIHJlc3BvbnNlOworICAgICAgICBpZiAoZHMuZ2V0UW9wKCkuZXF1YWxzKFFPUC5VTlNQRUNJRklFRCkpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlID0gbWQ1KGhhMSwgZHMuZ2V0Tm9uY2UoKSwgaGEyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN0cmluZyBjbm9uY2UgPSByYW5kb21CeXRlcyhDTElFTlRfTk9OQ0VfQllURV9DT1VOVCk7IC8vIGNsaWVudCBub25jZQorICAgICAgICAgICAgYXBwZW5kKHNiLCAiY25vbmNlIiwgY25vbmNlKTsKKyAgICAgICAgICAgIFN0cmluZyBuYyA9IFN0cmluZy5mb3JtYXQoIiUwOHgiLCBkcy5pbmNyZW1lbnRDb3VudGVyKCkpOyAvLyBjb3VudGVyCisgICAgICAgICAgICBhcHBlbmQoc2IsICJuYyIsIG5jLCBmYWxzZSk7CisgICAgICAgICAgICByZXNwb25zZSA9IG1kNShoYTEsIGRzLmdldE5vbmNlKCksIG5jLCBjbm9uY2UsIGRzLmdldFFvcCgpLnRvU3RyaW5nKCksIGhhMik7CisgICAgICAgIH0KKyAgICAgICAgYXBwZW5kKHNiLCAicmVzcG9uc2UiLCByZXNwb25zZSk7CisKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwZW5kIGNvbW1hIHNlcGFyYXRlZCBrZXk9dmFsdWUgdG9rZW4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzYiAgICAgICBzdHJpbmcgYnVpbGRlciBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBrZXkgICAgICBrZXkgc3RyaW5nCisgICAgICogQHBhcmFtIHZhbHVlICAgIHZhbHVlIHN0cmluZworICAgICAqIEBwYXJhbSB1c2VRdW90ZSB0cnVlIGlmIHZhbHVlIG5lZWRzIHRvIGJlIGVuY2xvc2VkIGluIHF1b3RlcworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXBwZW5kKFN0cmluZ0J1aWxkZXIgc2IsIFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSwgYm9vbGVhbiB1c2VRdW90ZSkgeworCisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNiLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgaWYgKHNiLmNoYXJBdChzYi5sZW5ndGgoKSAtIDEpICE9ICcgJykgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQoa2V5KTsKKyAgICAgICAgc2IuYXBwZW5kKCc9Jyk7CisgICAgICAgIGlmICh1c2VRdW90ZSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCciJyk7CisgICAgICAgIH0KKyAgICAgICAgc2IuYXBwZW5kKHZhbHVlKTsKKyAgICAgICAgaWYgKHVzZVF1b3RlKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoJyInKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFwcGVuZCBjb21tYSBzZXBhcmF0ZWQga2V5PXZhbHVlIHRva2VuLiBUaGUgdmFsdWUgZ2V0cyBlbmNsb3NlZCBpbiBxdW90ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2IgICAgc3RyaW5nIGJ1aWxkZXIgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0ga2V5ICAga2V5IHN0cmluZworICAgICAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSBzdHJpbmcKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFwcGVuZChTdHJpbmdCdWlsZGVyIHNiLCBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgYXBwZW5kKHNiLCBrZXksIHZhbHVlLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGJ5dGVzIGFycmF5IHRvIGhleCBzdHJpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnl0ZXMgYXJyYXkgb2YgYnl0ZXMKKyAgICAgKiBAcmV0dXJuIGhleCBzdHJpbmcKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYnl0ZXNUb0hleChieXRlW10gYnl0ZXMpIHsKKyAgICAgICAgY2hhcltdIGhleENoYXJzID0gbmV3IGNoYXJbYnl0ZXMubGVuZ3RoICogMl07CisgICAgICAgIGludCB2OworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGJ5dGVzLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICB2ID0gYnl0ZXNbal0gJiAweEZGOworICAgICAgICAgICAgaGV4Q2hhcnNbaiAqIDJdID0gSEVYX0FSUkFZW3YgPj4+IDRdOworICAgICAgICAgICAgaGV4Q2hhcnNbaiAqIDIgKyAxXSA9IEhFWF9BUlJBWVt2ICYgMHgwRl07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoaGV4Q2hhcnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbG9uIHNlcGFyYXRlZCB2YWx1ZSBNRDUgaGFzaC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0b2tlbnMgb25lIG9yIG1vcmUgc3RyaW5ncworICAgICAqIEByZXR1cm4gTTUgaGFzaCBzdHJpbmcKKyAgICAgKiBAdGhyb3dzIFByb3h5QXV0aGVudGljYXRpb25FeGNlcHRpb24gaWYgTUQ1IGFsZ29yaXRobSBjYW5ub3QgYmUgaW5zdGFudGlhdGVkCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG1kNShTdHJpbmcuLi4gdG9rZW5zKSB0aHJvd3MgUHJveHlBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigxMDApOworICAgICAgICBmb3IgKFN0cmluZyB0b2tlbiA6IHRva2VucykgeworICAgICAgICAgICAgaWYgKHNiLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnOicpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2IuYXBwZW5kKHRva2VuKTsKKyAgICAgICAgfQorCisgICAgICAgIE1lc3NhZ2VEaWdlc3QgbWQ7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtZCA9IE1lc3NhZ2VEaWdlc3QuZ2V0SW5zdGFuY2UoIk1ENSIpOworICAgICAgICB9IGNhdGNoIChOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBQcm94eUF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uKGV4LmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgbWQudXBkYXRlKHNiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoQ0hBUkFDVEVSX1NFVCksIDAsIHNiLmxlbmd0aCgpKTsKKyAgICAgICAgYnl0ZVtdIG1kNWhhc2ggPSBtZC5kaWdlc3QoKTsKKyAgICAgICAgcmV0dXJuIGJ5dGVzVG9IZXgobWQ1aGFzaCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGUgYSByYW5kb20gc2VxdWVuY2Ugb2YgYnl0ZXMgYW5kIHJldHVybiBpdHMgaGV4IHJlcHJlc2VudGF0aW9uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmJCeXRlcyBudW1iZXIgb2YgYnl0ZXMgdG8gZ2VuZXJhdGUKKyAgICAgKiBAcmV0dXJuIGhleCBzdHJpbmcKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyByYW5kb21CeXRlcyhpbnQgbmJCeXRlcykgeworICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtuYkJ5dGVzXTsKKyAgICAgICAgcmFuZG9tR2VuZXJhdG9yLm5leHRCeXRlcyhieXRlcyk7CisgICAgICAgIHJldHVybiBieXRlc1RvSGV4KGJ5dGVzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGVudW0gUU9QIHsKKworICAgICAgICBVTlNQRUNJRklFRChudWxsKSwKKyAgICAgICAgQVVUSCgiYXV0aCIpOworCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHFvcDsKKworICAgICAgICBRT1AoU3RyaW5nIHFvcCkgeworICAgICAgICAgICAgdGhpcy5xb3AgPSBxb3A7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBxb3A7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIFFPUCBwYXJzZShTdHJpbmcgdmFsKSB7CisgICAgICAgICAgICBpZiAodmFsID09IG51bGwgfHwgdmFsLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBRT1AuVU5TUEVDSUZJRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodmFsLmNvbnRhaW5zKCJhdXRoIikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUU9QLkFVVEg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuUFJPWFlfUU9QX05PX1NVUFBPUlRFRCh2YWwpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGVudW0gQWxnb3JpdGhtIHsKKworICAgICAgICBVTlNQRUNJRklFRChudWxsKSwKKyAgICAgICAgTUQ1KCJNRDUiKSwKKyAgICAgICAgTUQ1X1NFU1MoIk1ENS1zZXNzIik7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1kOworCisgICAgICAgIEFsZ29yaXRobShTdHJpbmcgbWQpIHsKKyAgICAgICAgICAgIHRoaXMubWQgPSBtZDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIG1kOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBBbGdvcml0aG0gcGFyc2UoU3RyaW5nIHZhbCkgeworICAgICAgICAgICAgaWYgKHZhbCA9PSBudWxsIHx8IHZhbC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQWxnb3JpdGhtLlVOU1BFQ0lGSUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmFsID0gdmFsLnRyaW0oKTsKKyAgICAgICAgICAgIGlmICh2YWwuY29udGFpbnMoTUQ1X1NFU1MubWQpIHx8IHZhbC5jb250YWlucyhNRDVfU0VTUy5tZC50b0xvd2VyQ2FzZSgpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBNRDVfU0VTUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBNRDU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaWdlc3Qgc2NoZW1lIFBPSk8KKyAgICAgKi8KKyAgICBmaW5hbCBjbGFzcyBEaWdlc3RTY2hlbWUgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHJlYWxtOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBub25jZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgb3BhcXVlOworICAgICAgICBwcml2YXRlIGZpbmFsIEFsZ29yaXRobSBhbGdvcml0aG07CisgICAgICAgIHByaXZhdGUgZmluYWwgUU9QIHFvcDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHN0YWxlOworICAgICAgICBwcml2YXRlIHZvbGF0aWxlIGludCBuYzsKKworICAgICAgICBEaWdlc3RTY2hlbWUoU3RyaW5nIHJlYWxtLAorICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG5vbmNlLAorICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG9wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgIFFPUCBxb3AsCisgICAgICAgICAgICAgICAgICAgICBBbGdvcml0aG0gYWxnb3JpdGhtLAorICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzdGFsZSkgeworICAgICAgICAgICAgdGhpcy5yZWFsbSA9IHJlYWxtOworICAgICAgICAgICAgdGhpcy5ub25jZSA9IG5vbmNlOworICAgICAgICAgICAgdGhpcy5vcGFxdWUgPSBvcGFxdWU7CisgICAgICAgICAgICB0aGlzLnFvcCA9IHFvcDsKKyAgICAgICAgICAgIHRoaXMuYWxnb3JpdGhtID0gYWxnb3JpdGhtOworICAgICAgICAgICAgdGhpcy5zdGFsZSA9IHN0YWxlOworICAgICAgICAgICAgdGhpcy5uYyA9IDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGluY3JlbWVudENvdW50ZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gKytuYzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tm9uY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gbm9uY2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFJlYWxtKCkgeworICAgICAgICAgICAgcmV0dXJuIHJlYWxtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRPcGFxdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gb3BhcXVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEFsZ29yaXRobSBnZXRBbGdvcml0aG0oKSB7CisgICAgICAgICAgICByZXR1cm4gYWxnb3JpdGhtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFFPUCBnZXRRb3AoKSB7CisgICAgICAgICAgICByZXR1cm4gcW9wOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTdGFsZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGFsZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0TmMoKSB7CisgICAgICAgICAgICByZXR1cm4gbmM7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL1Byb3h5RmlsdGVyLmphdmEgYi9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL1Byb3h5RmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBmNzRiZAotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvUHJveHlGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDE3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZGsuY29ubmVjdG9yLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBAYXV0aG9yIFBldHIgSmFub3VjaCAocGV0ci5qYW5vdWNoIGF0IG9yYWNsZS5jb20pCisgKi8KK2NsYXNzIFByb3h5RmlsdGVyIGV4dGVuZHMgRmlsdGVyPEh0dHBSZXF1ZXN0LCBIdHRwUmVzcG9uc2UsIEh0dHBSZXF1ZXN0LCBIdHRwUmVzcG9uc2U+IHsKKworICAgIHByaXZhdGUgZmluYWwgQ29ubmVjdG9yQ29uZmlndXJhdGlvbi5Qcm94eUNvbmZpZ3VyYXRpb24gcHJveHlDb25maWd1cmF0aW9uOworICAgIHByaXZhdGUgZmluYWwgUHJveHlEaWdlc3RBdXRoZW50aWNhdG9yIHByb3h5RGlnZXN0QXV0aGVudGljYXRvciA9IG5ldyBQcm94eURpZ2VzdEF1dGhlbnRpY2F0b3IoKTsKKyAgICBwcml2YXRlIHZvbGF0aWxlIFN0YXRlIHN0YXRlID0gU3RhdGUuQ09OTkVDVElORzsKKyAgICBwcml2YXRlIHZvbGF0aWxlIEluZXRTb2NrZXRBZGRyZXNzIG9yaWdpbmFsRGVzdGluYXRpb25BZGRyZXNzOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZG93bnN0cmVhbUZpbHRlciBkb3duc3RyZWFtIGZpbHRlci4gQWNjZXNzaWJsZSBkaXJlY3RseSBhcyB7QGxpbmsgI2Rvd25zdHJlYW1GaWx0ZXJ9IHByb3RlY3RlZCBmaWVsZC4KKyAgICAgKi8KKyAgICBQcm94eUZpbHRlcihmaW5hbCBGaWx0ZXI8SHR0cFJlcXVlc3QsIEh0dHBSZXNwb25zZSwgPywgPz4gZG93bnN0cmVhbUZpbHRlciwKKyAgICAgICAgICAgICAgICBDb25uZWN0b3JDb25maWd1cmF0aW9uLlByb3h5Q29uZmlndXJhdGlvbiBwcm94eUNvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgc3VwZXIoZG93bnN0cmVhbUZpbHRlcik7CisgICAgICAgIHRoaXMucHJveHlDb25maWd1cmF0aW9uID0gcHJveHlDb25maWd1cmF0aW9uOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHZvaWQgY29ubmVjdChmaW5hbCBTb2NrZXRBZGRyZXNzIGFkZHJlc3MsIGZpbmFsIEZpbHRlcjw/LCA/LCBIdHRwUmVxdWVzdCwgSHR0cFJlc3BvbnNlPiB1cHN0cmVhbUZpbHRlcikgeworICAgICAgICB0aGlzLnVwc3RyZWFtRmlsdGVyID0gdXBzdHJlYW1GaWx0ZXI7CisgICAgICAgIHRoaXMub3JpZ2luYWxEZXN0aW5hdGlvbkFkZHJlc3MgPSAoSW5ldFNvY2tldEFkZHJlc3MpIGFkZHJlc3M7CisgICAgICAgIGRvd25zdHJlYW1GaWx0ZXIuY29ubmVjdChuZXcgSW5ldFNvY2tldEFkZHJlc3MocHJveHlDb25maWd1cmF0aW9uLmdldEhvc3QoKSwgcHJveHlDb25maWd1cmF0aW9uLmdldFBvcnQoKSksIHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHZvaWQgb25Db25uZWN0KCkgeworICAgICAgICBIdHRwUmVxdWVzdCBjb25uZWN0ID0gY3JlYXRlQ29ubmVjdFJlcXVlc3QoKTsKKyAgICAgICAgZG93bnN0cmVhbUZpbHRlci53cml0ZShjb25uZWN0LCBuZXcgQ29tcGxldGlvbkhhbmRsZXI8SHR0cFJlcXVlc3Q+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBmYWlsZWQoZmluYWwgVGhyb3dhYmxlIHRocm93YWJsZSkgeworICAgICAgICAgICAgICAgIHVwc3RyZWFtRmlsdGVyLnByb2Nlc3NFcnJvcih0aHJvd2FibGUpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBib29sZWFuIHByb2Nlc3NSZWFkKEh0dHBSZXNwb25zZSBodHRwUmVzcG9uc2UpIHsKKyAgICAgICAgaWYgKHN0YXRlID09IFN0YXRlLkNPTk5FQ1RFRCkgeworICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBzdG9wIHRoZSBjb25uZWN0aW9uIHBoYXNlLCBqdXN0IHBhc3MgdGhyb3VnaAorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGh0dHBSZXNwb25zZS5nZXRTdGF0dXNDb2RlKCkpIHsKKworICAgICAgICAgICAgY2FzZSAyMDA6IHsKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IFN0YXRlLkNPTk5FQ1RFRDsKKyAgICAgICAgICAgICAgICB1cHN0cmVhbUZpbHRlci5vbkNvbm5lY3QoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSA0MDc6IHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gU3RhdGUuQVVUSEVOVElDQVRFRCkgeworICAgICAgICAgICAgICAgICAgICB1cHN0cmVhbUZpbHRlci5vbkVycm9yKG5ldyBQcm94eUF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlBST1hZXzQwN19UV0lDRSgpKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFN0YXRlLkFVVEhFTlRJQ0FURUQ7CisgICAgICAgICAgICAgICAgICAgIEh0dHBSZXF1ZXN0IGF1dGhlbnRpY2F0aW5nUmVxdWVzdCA9IGNyZWF0ZUF1dGhlbnRpY2F0aW5nUmVxdWVzdChodHRwUmVzcG9uc2UpOworICAgICAgICAgICAgICAgICAgICBkb3duc3RyZWFtRmlsdGVyLndyaXRlKGF1dGhlbnRpY2F0aW5nUmVxdWVzdCwgbmV3IENvbXBsZXRpb25IYW5kbGVyPEh0dHBSZXF1ZXN0PigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZmFpbGVkKGZpbmFsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHN0cmVhbUZpbHRlci5wcm9jZXNzRXJyb3IodGhyb3dhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUHJveHlBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKGUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcihuZXcgSU9FeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuUFJPWFlfQ09OTkVDVF9GQUlMKGh0dHBSZXNwb25zZS5nZXRTdGF0dXNDb2RlKCkpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgdm9pZCB3cml0ZShmaW5hbCBIdHRwUmVxdWVzdCBkYXRhLCBmaW5hbCBDb21wbGV0aW9uSGFuZGxlcjxIdHRwUmVxdWVzdD4gY29tcGxldGlvbkhhbmRsZXIpIHsKKyAgICAgICAgZG93bnN0cmVhbUZpbHRlci53cml0ZShkYXRhLCBjb21wbGV0aW9uSGFuZGxlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUVycm9yKFRocm93YWJsZSB0KSB7CisgICAgICAgIHVwc3RyZWFtRmlsdGVyLm9uRXJyb3IodCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBIdHRwUmVxdWVzdCBjcmVhdGVBdXRoZW50aWNhdGluZ1JlcXVlc3QoSHR0cFJlc3BvbnNlIGh0dHBSZXNwb25zZSkgdGhyb3dzIFByb3h5QXV0aGVudGljYXRpb25FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgYXV0aGVudGljYXRlSGVhZGVyID0gbnVsbDsKKyAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGF1dGhIZWFkZXIgPSBodHRwUmVzcG9uc2UuZ2V0SGVhZGVyKENvbnN0YW50cy5QUk9YWV9BVVRIRU5USUNBVEUpOworICAgICAgICBpZiAoYXV0aEhlYWRlciAhPSBudWxsICYmICFhdXRoSGVhZGVyLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgYXV0aGVudGljYXRlSGVhZGVyID0gYXV0aEhlYWRlci5nZXQoMCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYXV0aGVudGljYXRlSGVhZGVyID09IG51bGwgfHwgYXV0aGVudGljYXRlSGVhZGVyLmVxdWFscygiIikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBQcm94eUF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlBST1hZX01JU1NJTkdfQVVUSF9IRUFERVIoKSk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBTdHJpbmdbXSB0b2tlbnMgPSBhdXRoZW50aWNhdGVIZWFkZXIudHJpbSgpLnNwbGl0KCJcXHMrIiwgMik7CisgICAgICAgIGZpbmFsIFN0cmluZyBzY2hlbWUgPSB0b2tlbnNbMF07CisKKyAgICAgICAgU3RyaW5nIGF1dGhvcml6YXRpb25IZWFkZXI7CisgICAgICAgIGlmIChDb25zdGFudHMuQkFTSUMuZXF1YWxzKHNjaGVtZSkpIHsKKyAgICAgICAgICAgIGF1dGhvcml6YXRpb25IZWFkZXIgPSBQcm94eUJhc2ljQXV0aGVudGljYXRvcgorICAgICAgICAgICAgICAgICAgICAuZ2VuZXJhdGVBdXRob3JpemF0aW9uSGVhZGVyKHByb3h5Q29uZmlndXJhdGlvbi5nZXRVc2VyTmFtZSgpLCBwcm94eUNvbmZpZ3VyYXRpb24uZ2V0UGFzc3dvcmQoKSk7CisgICAgICAgIH0gZWxzZSBpZiAoQ29uc3RhbnRzLkRJR0VTVC5lcXVhbHMoc2NoZW1lKSkgeworICAgICAgICAgICAgU3RyaW5nIG9yaWdpbmFsRGVzdGluYXRpb25VcmkgPSBnZXRPcmlnaW5hbERlc3RpbmF0aW9uVXJpKCk7CisgICAgICAgICAgICBVUkkgdXJpID0gVVJJLmNyZWF0ZShvcmlnaW5hbERlc3RpbmF0aW9uVXJpKTsKKyAgICAgICAgICAgIGF1dGhvcml6YXRpb25IZWFkZXIgPSBwcm94eURpZ2VzdEF1dGhlbnRpY2F0b3IKKyAgICAgICAgICAgICAgICAgICAgLmdlbmVyYXRlQXV0aG9yaXphdGlvbkhlYWRlcih1cmksIENvbnN0YW50cy5DT05ORUNULCBhdXRoZW50aWNhdGVIZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlDb25maWd1cmF0aW9uLmdldFVzZXJOYW1lKCksIHByb3h5Q29uZmlndXJhdGlvbi5nZXRQYXNzd29yZCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBQcm94eUF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlBST1hZX1VOU1VQUE9SVEVEX1NDSEVNRShzY2hlbWUpKTsKKyAgICAgICAgfQorCisgICAgICAgIEh0dHBSZXF1ZXN0IGNvbm5lY3RSZXF1ZXN0ID0gY3JlYXRlQ29ubmVjdFJlcXVlc3QoKTsKKyAgICAgICAgY29ubmVjdFJlcXVlc3QuYWRkSGVhZGVySWZOb3RQcmVzZW50KENvbnN0YW50cy5QUk9YWV9BVVRIT1JJWkFUSU9OLCBhdXRob3JpemF0aW9uSGVhZGVyKTsKKyAgICAgICAgcmV0dXJuIGNvbm5lY3RSZXF1ZXN0OworICAgIH0KKworICAgIHByaXZhdGUgSHR0cFJlcXVlc3QgY3JlYXRlQ29ubmVjdFJlcXVlc3QoKSB7CisgICAgICAgIFN0cmluZyBvcmlnaW5hbERlc3RpbmF0aW9uVXJpID0gZ2V0T3JpZ2luYWxEZXN0aW5hdGlvblVyaSgpOworICAgICAgICBVUkkgdXJpID0gVVJJLmNyZWF0ZShvcmlnaW5hbERlc3RpbmF0aW9uVXJpKTsKKyAgICAgICAgSHR0cFJlcXVlc3QgY29ubmVjdCA9IEh0dHBSZXF1ZXN0LmNyZWF0ZUJvZHlsZXNzKENvbnN0YW50cy5DT05ORUNULCB1cmkpOworICAgICAgICBjb25uZWN0LmFkZEhlYWRlcklmTm90UHJlc2VudChDb25zdGFudHMuSE9TVCwgb3JpZ2luYWxEZXN0aW5hdGlvblVyaSk7CisgICAgICAgIGNvbm5lY3QuYWRkSGVhZGVySWZOb3RQcmVzZW50KENvbnN0YW50cy5QUk9YWV9DT05ORUNUSU9OLCBDb25zdGFudHMuS0VFUF9BTElWRSk7CisgICAgICAgIHJldHVybiBjb25uZWN0OworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldE9yaWdpbmFsRGVzdGluYXRpb25VcmkoKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlczolZCIsIG9yaWdpbmFsRGVzdGluYXRpb25BZGRyZXNzLmdldEhvc3RTdHJpbmcoKSwgb3JpZ2luYWxEZXN0aW5hdGlvbkFkZHJlc3MuZ2V0UG9ydCgpKTsKKyAgICB9CisKKyAgICBlbnVtIFN0YXRlIHsKKyAgICAgICAgQ09OTkVDVElORywKKyAgICAgICAgQVVUSEVOVElDQVRFRCwKKyAgICAgICAgQ09OTkVDVEVECisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9SZWFkTGlzdGVuZXIuamF2YSBiL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvUmVhZExpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI5MjczMgotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvUmVhZExpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZGsuY29ubmVjdG9yLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiA8cD4KKyAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGNhbGwtYmFjayBtZWNoYW5pc20gdGhhdCB3aWxsIG5vdGlmeSBpbXBsZW1lbnRhdGlvbnMKKyAqIGFzIEhUVFAgcmVxdWVzdCBkYXRhIGJlY29tZXMgYXZhaWxhYmxlIHRvIGJlIHJlYWQgd2l0aG91dCBibG9ja2luZy4KKyAqIDwvcD4KKyAqIDxwLz4KKyAqIFRha2VuIGZyb20gU2VydmxldCAzLjEKKyAqLworaW50ZXJmYWNlIFJlYWRMaXN0ZW5lciB7CisKKyAgICAvKioKKyAgICAgKiBXaGVuIGFuIGluc3RhbmNlIG9mIHRoZSA8Y29kZT5SZWFkTGlzdGVuZXI8L2NvZGU+IGlzIHJlZ2lzdGVyZWQgd2l0aCBhIHtAbGluayBCb2R5SW5wdXRTdHJlYW19LAorICAgICAqIHRoaXMgbWV0aG9kIHdpbGwgYmUgaW52b2tlZCBieSB0aGUgY29udGFpbmVyIHRoZSBmaXJzdCB0aW1lIHdoZW4gaXQgaXMgcG9zc2libGUKKyAgICAgKiB0byByZWFkIGRhdGEuIFN1YnNlcXVlbnRseSB0aGUgY29udGFpbmVyIHdpbGwgaW52b2tlIHRoaXMgbWV0aG9kIGlmIGFuZCBvbmx5CisgICAgICogaWYge0BsaW5rIEJvZHlJbnB1dFN0cmVhbSNpc1JlYWR5KCl9IG1ldGhvZAorICAgICAqIGhhcyBiZWVuIGNhbGxlZCBhbmQgaGFzIHJldHVybmVkIDxjb2RlPmZhbHNlPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSS9PIHJlbGF0ZWQgZXJyb3IgaGFzIG9jY3VycmVkIGR1cmluZyBwcm9jZXNzaW5nCisgICAgICovCisgICAgdm9pZCBvbkRhdGFBdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBJbnZva2VkIHdoZW4gYWxsIGRhdGEgZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QgaGFzIGJlZW4gcmVhZC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSS9PIHJlbGF0ZWQgZXJyb3IgaGFzIG9jY3VycmVkIGR1cmluZyBwcm9jZXNzaW5nCisgICAgICovCisKKyAgICB2b2lkIG9uQWxsRGF0YVJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBJbnZva2VkIHdoZW4gYW4gZXJyb3Igb2NjdXJzIHByb2Nlc3NpbmcgdGhlIHJlcXVlc3QuCisgICAgICovCisgICAgdm9pZCBvbkVycm9yKFRocm93YWJsZSB0KTsKK30KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvUmVkaXJlY3RFeGNlcHRpb24uamF2YSBiL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvUmVkaXJlY3RFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGM4YzY1Ci0tLSAvZGV2L251bGwKKysrIGIvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9SZWRpcmVjdEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamRrLmNvbm5lY3Rvci5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzOworCisvKioKKyAqIFRoaXMgRXhjZXB0aW9uIGlzIHVzZWQgb25seSBpZiB7QGxpbmsgQ2xpZW50UHJvcGVydGllcyNGT0xMT1dfUkVESVJFQ1RTfSBpcyBzZXQgdG8ge0Bjb2RlIHRydWV9LgorICogPHAvPgorICogVGhpcyBleGNlcHRpb24gaXMgdGhyb3duIHdoZW4gYW55IG9mIHRoZSBSZWRpcmVjdCBIVFRQIHJlc3BvbnNlIHN0YXR1cyBjb2RlcyAoMzAxLCAzMDIsIDMwMywgMzA3LCAzMDgpIGlzIHJlY2VpdmVkIGFuZDoKKyAqIDx1bD4KKyAqIDxsaT4KKyAqIHRoZSBjaGFpbmVkIHJlZGlyZWN0aW9uIGNvdW50IGV4Y2VlZHMgdGhlIHZhbHVlIG9mCisgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50Lkpka0Nvbm5lY3RvclByb3ZpZGVyI01BWF9SRURJUkVDVFN9CisgKiA8L2xpPgorICogPGxpPgorICogb3IgYW4gaW5maW5pdGUgcmVkaXJlY3Rpb24gbG9vcCBpcyBkZXRlY3RlZAorICogPC9saT4KKyAqIDxsaT4KKyAqIG9yIExvY2F0aW9uIHJlc3BvbnNlIGhlYWRlciBpcyBtaXNzaW5nLCBlbXB0eSBvciBkb2VzIG5vdCBjb250YWluIGEgdmFsaWQge0BsaW5rIGphdmEubmV0LlVSSX0uCisgKiA8L2xpPgorICogPC91bD4KKyAqCisgKiBAYXV0aG9yIE9uZHJlaiBLb3NhdGthIChvbmRyZWoua29zYXRrYSBhdCBvcmFjbGUuY29tKQorICogQHNlZSBSZWRpcmVjdEhhbmRsZXIKKyAqLworcHVibGljIGNsYXNzIFJlZGlyZWN0RXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQzNTc3MjQzMDA0ODY4MDEyOTRMOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgZGV0YWlsIG1lc3NhZ2UuIFRoZSBkZXRhaWwgbWVzc2FnZSBpcyBzYXZlZCBmb3IKKyAgICAgKiAgICAgICAgICAgICAgICBsYXRlciByZXRyaWV2YWwgYnkgdGhlIHtAbGluayAjZ2V0TWVzc2FnZSgpfSBtZXRob2QuCisgICAgICovCisgICAgcHVibGljIFJlZGlyZWN0RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIHN1cGVyKG1lc3NhZ2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIGRldGFpbCBtZXNzYWdlLiBUaGUgZGV0YWlsIG1lc3NhZ2UgaXMgc2F2ZWQgZm9yCisgICAgICogICAgICAgICAgICAgICAgbGF0ZXIgcmV0cmlldmFsIGJ5IHRoZSB7QGxpbmsgI2dldE1lc3NhZ2UoKX0gbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyBSZWRpcmVjdEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgc3VwZXIobWVzc2FnZSwgdCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9SZWRpcmVjdEhhbmRsZXIuamF2YSBiL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvUmVkaXJlY3RIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzllMTk3MwotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvUmVkaXJlY3RIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwxODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamRrLmNvbm5lY3Rvci5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogQGF1dGhvciBQZXRyIEphbm91Y2ggKHBldHIuamFub3VjaCBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBPbmRyZWogS29zYXRrYSAob25kcmVqLmtvc2F0a2EgYXQgb3JhY2xlLmNvbSkKKyAqLworY2xhc3MgUmVkaXJlY3RIYW5kbGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxJbnRlZ2VyPiBSRURJUkVDVF9TVEFUVVNfQ09ERVMgPSBDb2xsZWN0aW9ucworICAgICAgICAgICAgLnVubW9kaWZpYWJsZVNldChuZXcgSGFzaFNldDw+KEFycmF5cy5hc0xpc3QoMzAxLCAzMDIsIDMwMywgMzA3LCAzMDgpKSk7CisKKyAgICBwcml2YXRlIGZpbmFsIGludCBtYXhSZWRpcmVjdHM7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGZvbGxvd1JlZGlyZWN0czsKKyAgICBwcml2YXRlIGZpbmFsIFNldDxVUkk+IHJlZGlyZWN0VXJpSGlzdG9yeTsKKyAgICBwcml2YXRlIGZpbmFsIEh0dHBDb25uZWN0aW9uUG9vbCBodHRwQ29ubmVjdGlvblBvb2w7CisgICAgcHJpdmF0ZSBmaW5hbCBIdHRwUmVxdWVzdCBvcmlnaW5hbEh0dHBSZXF1ZXN0OworCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBVUkkgbGFzdFJlcXVlc3RVcmkgPSBudWxsOworCisgICAgUmVkaXJlY3RIYW5kbGVyKEh0dHBDb25uZWN0aW9uUG9vbCBodHRwQ29ubmVjdGlvblBvb2wsIEh0dHBSZXF1ZXN0IG9yaWdpbmFsSHR0cFJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgIENvbm5lY3RvckNvbmZpZ3VyYXRpb24gY29ubmVjdG9yQ29uZmlndXJhdGlvbikgeworICAgICAgICB0aGlzLmZvbGxvd1JlZGlyZWN0cyA9IGNvbm5lY3RvckNvbmZpZ3VyYXRpb24uZ2V0Rm9sbG93UmVkaXJlY3RzKCk7CisgICAgICAgIHRoaXMubWF4UmVkaXJlY3RzID0gY29ubmVjdG9yQ29uZmlndXJhdGlvbi5nZXRNYXhSZWRpcmVjdHMoKTsKKyAgICAgICAgdGhpcy5odHRwQ29ubmVjdGlvblBvb2wgPSBodHRwQ29ubmVjdGlvblBvb2w7CisgICAgICAgIHRoaXMub3JpZ2luYWxIdHRwUmVxdWVzdCA9IG9yaWdpbmFsSHR0cFJlcXVlc3Q7CisgICAgICAgIHRoaXMucmVkaXJlY3RVcmlIaXN0b3J5ID0gbmV3IEhhc2hTZXQ8PihtYXhSZWRpcmVjdHMpOworICAgICAgICB0aGlzLmxhc3RSZXF1ZXN0VXJpID0gb3JpZ2luYWxIdHRwUmVxdWVzdC5nZXRVcmkoKTsKKyAgICB9CisKKyAgICB2b2lkIGhhbmRsZVJlZGlyZWN0cyhmaW5hbCBIdHRwUmVzcG9uc2UgaHR0cFJlc3BvbnNlLCBmaW5hbCBDb21wbGV0aW9uSGFuZGxlcjxIdHRwUmVzcG9uc2U+IGNvbXBsZXRpb25IYW5kbGVyKSB7CisgICAgICAgIGlmICghZm9sbG93UmVkaXJlY3RzKSB7CisgICAgICAgICAgICBjb21wbGV0aW9uSGFuZGxlci5jb21wbGV0ZWQoaHR0cFJlc3BvbnNlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghUkVESVJFQ1RfU1RBVFVTX0NPREVTLmNvbnRhaW5zKGh0dHBSZXNwb25zZS5nZXRTdGF0dXNDb2RlKCkpKSB7CisgICAgICAgICAgICBjb21wbGV0aW9uSGFuZGxlci5jb21wbGV0ZWQoaHR0cFJlc3BvbnNlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChodHRwUmVzcG9uc2UuZ2V0U3RhdHVzQ29kZSgpICE9IDMwMykgeworICAgICAgICAgICAgLy8gd2Ugc3VwcG9ydCBvdGhlciBtZXRob2RzIHRoYW4gR0VUIGFuZCBIRUFEIG9ubHkgd2l0aCAzMDMKKyAgICAgICAgICAgIGlmICghQ29uc3RhbnRzLkhFQUQuZXF1YWxzKG9yaWdpbmFsSHR0cFJlcXVlc3QuZ2V0TWV0aG9kKCkpICYmICFDb25zdGFudHMuR0VUCisgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMob3JpZ2luYWxIdHRwUmVxdWVzdC5nZXRNZXRob2QoKSkpIHsKKyAgICAgICAgICAgICAgICBjb21wbGV0aW9uSGFuZGxlci5jb21wbGV0ZWQoaHR0cFJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyByZWFkaW5nIHRoZSBib2R5IGlzIG5vdCBuZWNlc3NhcnksIGJ1dCBpZiB3ZSB3YWl0IHVudGlsIHRoZSBlbnRpcmUgYm9keSBoYXMgYXJyaXZlZCwgd2UgY2FuIHJldXNlIHRoZSBzYW1lIGNvbm5lY3Rpb24KKyAgICAgICAgY29uc3VtZUJvZHlJZlByZXNlbnQoaHR0cFJlc3BvbnNlLCBuZXcgQ29tcGxldGlvbkhhbmRsZXI8Vm9pZD4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZhaWxlZChUaHJvd2FibGUgdGhyb3dhYmxlKSB7CisgICAgICAgICAgICAgICAgY29tcGxldGlvbkhhbmRsZXIuZmFpbGVkKHRocm93YWJsZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgY29tcGxldGVkKFZvaWQgcikgeworICAgICAgICAgICAgICAgIGRvUmVkaXJlY3QoaHR0cFJlc3BvbnNlLCBuZXcgQ29tcGxldGlvbkhhbmRsZXI8SHR0cFJlc3BvbnNlPigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZhaWxlZChUaHJvd2FibGUgdGhyb3dhYmxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uSGFuZGxlci5mYWlsZWQodGhyb3dhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBjb21wbGV0ZWQoSHR0cFJlc3BvbnNlIHJlc3VsdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlUmVkaXJlY3RzKHJlc3VsdCwgY29tcGxldGlvbkhhbmRsZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb1JlZGlyZWN0KGZpbmFsIEh0dHBSZXNwb25zZSBodHRwUmVzcG9uc2UsIGZpbmFsIENvbXBsZXRpb25IYW5kbGVyPEh0dHBSZXNwb25zZT4gY29tcGxldGlvbkhhbmRsZXIpIHsKKworICAgICAgICAvLyBnZXQgbG9jYXRpb24gaGVhZGVyCisgICAgICAgIFN0cmluZyBsb2NhdGlvblN0cmluZyA9IG51bGw7CisgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBsb2NhdGlvbkhlYWRlciA9IGh0dHBSZXNwb25zZS5nZXRIZWFkZXIoIkxvY2F0aW9uIik7CisgICAgICAgIGlmIChsb2NhdGlvbkhlYWRlciAhPSBudWxsICYmICFsb2NhdGlvbkhlYWRlci5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGxvY2F0aW9uU3RyaW5nID0gbG9jYXRpb25IZWFkZXIuZ2V0KDApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxvY2F0aW9uU3RyaW5nID09IG51bGwgfHwgbG9jYXRpb25TdHJpbmcuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBjb21wbGV0aW9uSGFuZGxlci5mYWlsZWQobmV3IFJlZGlyZWN0RXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlJFRElSRUNUX05PX0xPQ0FUSU9OKCkpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFVSSSBsb2NhdGlvbjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxvY2F0aW9uID0gbmV3IFVSSShsb2NhdGlvblN0cmluZyk7CisKKyAgICAgICAgICAgIGlmICghbG9jYXRpb24uaXNBYnNvbHV0ZSgpKSB7CisgICAgICAgICAgICAgICAgLy8gbG9jYXRpb24gaXMgbm90IGFic29sdXRlLCB3ZSBuZWVkIHRvIHJlc29sdmUgaXQuCisgICAgICAgICAgICAgICAgVVJJIGJhc2VVcmkgPSBsYXN0UmVxdWVzdFVyaTsKKyAgICAgICAgICAgICAgICBsb2NhdGlvbiA9IGJhc2VVcmkucmVzb2x2ZShsb2NhdGlvbi5ub3JtYWxpemUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBjb21wbGV0aW9uSGFuZGxlci5mYWlsZWQobmV3IFJlZGlyZWN0RXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlJFRElSRUNUX0VSUk9SX0RFVEVSTUlOSU5HX0xPQ0FUSU9OKCksIGUpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGluZmluaXRlIGxvb3AgZGV0ZWN0aW9uCisgICAgICAgIGJvb2xlYW4gYWxyZWFkeVJlcXVlc3RlZCA9ICFyZWRpcmVjdFVyaUhpc3RvcnkuYWRkKGxvY2F0aW9uKTsKKyAgICAgICAgaWYgKGFscmVhZHlSZXF1ZXN0ZWQpIHsKKyAgICAgICAgICAgIGNvbXBsZXRpb25IYW5kbGVyLmZhaWxlZChuZXcgUmVkaXJlY3RFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuUkVESVJFQ1RfSU5GSU5JVEVfTE9PUCgpKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBtYXhpbWFsIG51bWJlciBvZiByZWRpcmVjdGlvbgorICAgICAgICBpZiAocmVkaXJlY3RVcmlIaXN0b3J5LnNpemUoKSA+IG1heFJlZGlyZWN0cykgeworICAgICAgICAgICAgY29tcGxldGlvbkhhbmRsZXIuZmFpbGVkKG5ldyBSZWRpcmVjdEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5SRURJUkVDVF9MSU1JVF9SRUFDSEVEKG1heFJlZGlyZWN0cykpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBtZXRob2QgPSBvcmlnaW5hbEh0dHBSZXF1ZXN0LmdldE1ldGhvZCgpOworICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGhlYWRlcnMgPSBvcmlnaW5hbEh0dHBSZXF1ZXN0LmdldEhlYWRlcnMoKTsKKyAgICAgICAgaWYgKGh0dHBSZXNwb25zZS5nZXRTdGF0dXNDb2RlKCkgPT0gMzAzICYmICFtZXRob2QuZXF1YWxzKENvbnN0YW50cy5IRUFEKSkgeworICAgICAgICAgICAgLy8gaW4gY2FzZSBvZiAzMDMgd2UgcmV3cml0ZSBldmVyeSBtZXRob2QgZXhjZXB0IEhFQUQgdG8gR0VUCisgICAgICAgICAgICBtZXRob2QgPSBDb25zdGFudHMuR0VUOworICAgICAgICAgICAgLy8gcmVtb3ZlIGVudGl0eS10cmFuc3BvcnQgaGVhZGVycyBpZiBwcmVzZW50CisgICAgICAgICAgICBoZWFkZXJzLnJlbW92ZShDb25zdGFudHMuQ09OVEVOVF9MRU5HVEgpOworICAgICAgICAgICAgaGVhZGVycy5yZW1vdmUoQ29uc3RhbnRzLlRSQU5TRkVSX0VOQ09ESU5HX0hFQURFUik7CisgICAgICAgIH0KKworICAgICAgICBIdHRwUmVxdWVzdCBodHRwUmVxdWVzdCA9IEh0dHBSZXF1ZXN0LmNyZWF0ZUJvZHlsZXNzKG1ldGhvZCwgbG9jYXRpb24pOworICAgICAgICBodHRwUmVxdWVzdC5nZXRIZWFkZXJzKCkucHV0QWxsKGhlYWRlcnMpOworICAgICAgICBsYXN0UmVxdWVzdFVyaSA9IGxvY2F0aW9uOworCisgICAgICAgIGh0dHBDb25uZWN0aW9uUG9vbC5zZW5kKGh0dHBSZXF1ZXN0LCBjb21wbGV0aW9uSGFuZGxlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNvbnN1bWVCb2R5SWZQcmVzZW50KEh0dHBSZXNwb25zZSByZXNwb25zZSwgZmluYWwgQ29tcGxldGlvbkhhbmRsZXI8Vm9pZD4gY29tcGxldGlvbkhhbmRsZXIpIHsKKyAgICAgICAgZmluYWwgQXN5bmNocm9ub3VzQm9keUlucHV0U3RyZWFtIGJvZHlTdHJlYW0gPSByZXNwb25zZS5nZXRCb2R5U3RyZWFtKCk7CisgICAgICAgIGJvZHlTdHJlYW0uc2V0UmVhZExpc3RlbmVyKG5ldyBSZWFkTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRGF0YUF2YWlsYWJsZSgpIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoYm9keVN0cmVhbS5pc1JlYWR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvZHlTdHJlYW0ucmVhZCgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uSGFuZGxlci5mYWlsZWQoZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbGxEYXRhUmVhZCgpIHsKKyAgICAgICAgICAgICAgICBjb21wbGV0aW9uSGFuZGxlci5jb21wbGV0ZWQobnVsbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIGNvbXBsZXRpb25IYW5kbGVyLmZhaWxlZCh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgVVJJIGdldExhc3RSZXF1ZXN0VXJpKCkgeworICAgICAgICByZXR1cm4gbGFzdFJlcXVlc3RVcmk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9Tc2xGaWx0ZXIuamF2YSBiL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvU3NsRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ2M2M0YQotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvU3NsRmlsdGVyLmphdmEKQEAgLTAsMCArMSw3MDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamRrLmNvbm5lY3Rvci5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLlF1ZXVlOworCitpbXBvcnQgamF2YXgubmV0LnNzbC5Ib3N0bmFtZVZlcmlmaWVyOworaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMQ29udGV4dDsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLlNTTEVuZ2luZTsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLlNTTEVuZ2luZVJlc3VsdDsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLlNTTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLlNTTFBhcmFtZXRlcnM7CisKKworLyoqCisgKiBAYXV0aG9yIFBldHIgSmFub3VjaCAocGV0ci5qYW5vdWNoIGF0IG9yYWNsZS5jb20pCisgKi8KK2NsYXNzIFNzbEZpbHRlciBleHRlbmRzIEZpbHRlcjxCeXRlQnVmZmVyLCBCeXRlQnVmZmVyLCBCeXRlQnVmZmVyLCBCeXRlQnVmZmVyPiB7CisKKy8qIFNZTkNIUk9OSVpBVElPTiBOT1RFOiBTU0xFbmdpbmUjd3JhcCBhbmQgU1NMRW5naW5lI3Vud3JhcCBjYW4gYmUgZG9uZSBjb25jdXJyZW50bHkgKG9uZSB0aHJlYWQgZG9pbmcgd3JhcAorICAgIGFuZCBhbm90aGVyIGRvaW5nIHVud3JhcCkuIFRoZSBzYW1lIG9wZXJhdGlvbiBjYW5ub3QgYmUgZG9uZSBjb25jdXJyZW50bHkgKDIgdGhyZWFkcyBkb2luZyB3cmFwKS4KKworICAgIE1ldGhvZCBkb0hhbmRzaGFrZVN0ZXAgbXVzdCBiZSBzeW5jaHJvbml6ZWQsIGJlY2F1c2UgaXQgbWlnaHQgYmUgZW50ZXJlZCBib3RoIGJ5IHdyaXRpbmcgYW5kIHJlYWRpbmcgdGhyZWFkCisgICAgZHVyaW5nIHJlLWhhbmRzaGFrZS4gV3JpdGUsIGNsb3NlIGFuZCByZS1oYW5kc2hha2UgY2Fubm90IGJlIGRvbmUgY29uY3VycmVudGx5LCBiZWNhdXNlIGFsbCB0aG9zZSBvcGVyYXRpb25zIG1pZ2h0CisgICAgZG8gU1NMRW5naW5lI3dyYXAuIFJlYWQgY2FuIGJlIGJlIGRvbmUgY29uY3VycmVudGx5IHdpdGggYW55IG90aGVyIG9wZXJhdGlvbiwgYmVjYXVzZSBldmVuIHRob3VnaHQgcmUtaGFuZHNoYWtlCisgICAgY2FuIGRvIFNTTEVuZ2luZSN1bndyYXAsIGl0IHdvbid0IGRvIHNvIGlmIGl0IHdhcyBlbnRlcmVkIGZyb20gd3JpdGUgb3BlcmF0aW9uLgorCisgICAgT3BlcmF0aW9ucyB1cHN0cmVhbUZpbHRlciNvblJlYWQgY2Fubm90IGJlIGRvbmUgd2hpbGUgaG9sZGluZyBhIGxvY2sgb2YgdGhpcyBjbGFzcy4gRG9pbmcgc28gbWlnaHQgbGVhZCB0byBhIGRlYWRsb2NrLiBBbgorICAgIGV4YW1wbGUgb2YgZGVhZGxvY2sgd291bGQgYmUgaWYgYSB0aHJlYWQgaG9sZGluZyBhIGxvY2sgaW4gdXBzdHJlYW1GaWx0ZXIjb25SZWFkIHdyaXRlcyBhIHJlc3BvbnNlIHN5bmNocm9ub3VzbHkgKGJsb2NrcworICAgIGFuZCB3YWl0cyBmb3Igd3JpdGUgY29tcGxldGlvbiBoYW5kbGVyKS4gVGhlIHdyaXRlIGNvbXBsZXRpb24gaGFuZGxlciBtaWdodCBiZSBleGVjdXRlZCBieSBhbm90aGVyIHRocmVhZCB3aGljaCB3aWxsIG5vdCBiZQorICAgIGFibGUgdG8gb2J0YWluIGEgbG9jayBmb3IgdGhpcyBjbGFzcy4qLworCisgICAgLyogU29tZSBvcGVyYXRpb25zIG9uIFNTTCBlbmdpbmUgcmVxdWlyZSBhIGJ1ZmZlciBhcyBhIHBhcmFtZXRlciBldmVuIGlmIHRoZXkgZG9uJ3QgbmVlZCBhbnkgZGF0YS4KKyAgICBUaGlzIGJ1ZmZlciBpcyBmb3IgdGhhdCBwdXJwb3NlLiAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJ5dGVCdWZmZXIgZW1wdHlCdWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKDApOworCisgICAgLy8gYnVmZmVyIGZvciBwYXNzaW5nIGRhdGEgdG8gdGhlIHVwcGVyIGZpbHRlcgorICAgIHByaXZhdGUgZmluYWwgQnl0ZUJ1ZmZlciBhcHBsaWNhdGlvbklucHV0QnVmZmVyOworICAgIC8vIGJ1ZmZlciBmb3IgcGFzc2luZyBkYXRhIHRvIHRoZSB0cmFuc3BvcnQgZmlsdGVyCisgICAgcHJpdmF0ZSBmaW5hbCBCeXRlQnVmZmVyIG5ldHdvcmtPdXRwdXRCdWZmZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBTU0xFbmdpbmUgc3NsRW5naW5lOworICAgIHByaXZhdGUgZmluYWwgSG9zdG5hbWVWZXJpZmllciBjdXN0b21Ib3N0bmFtZVZlcmlmaWVyOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHNlcnZlckhvc3Q7CisgICAgcHJpdmF0ZSBmaW5hbCBXcml0ZVF1ZXVlIHdyaXRlUXVldWUgPSBuZXcgV3JpdGVRdWV1ZSgpOworCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBTdGF0ZSBzdGF0ZSA9IFN0YXRlLk5PVF9TVEFSVEVEOworICAgIC8qCisgICAgICogUGVuZGluZyB3cml0ZSBvcGVyYXRpb24gc3RvcmVkIHdoZW4gd3JpdGluZyBkYXRhIHdhcyBub3QgcG9zc2libGUuIEl0IHdpbGwgYmUgcmVzdW1lZCB3aGVuIHdyaXRlIG9wZXJhdGlvbiBpcworICAgICAqIGF2YWlsYWJsZSBhZ2Fpbi4gT25seSBvbmUgd3JpdGUgb3BlcmF0aW9uIGNhbiBiZSBpbiBwcm9ncmVzcyBhdCBhIHRpbWUuIFRyeWluZyB0byBzdG9yZSBtb3JlIHRoYW4gb25lIHBlbmRpbmcKKyAgICAgKiBhcHBsaWNhdGlvbiB3cml0ZSBpbmRpY2F0ZXMgdGhhdCBhbiB1cHBlciBzdGFjayBjYWxsZWQgd3JpdGUgd2l0aG91dCB3YWl0aW5nIGZvciB0aGUgY29tcGxldGlvbiBoYW5kbGVyCisgICAgICogb2YgdGhlIHByZXZpb3VzIHdyaXRlLgorICAgICAqIEN1cnJlbnRseSB0aGlzIGlzIHVzZWQgb25seSBkdXJpbmcgcmUtaGFuZHNoYWtlLgorICAgICAqLworICAgIHByaXZhdGUgUnVubmFibGUgcGVuZGluZ0FwcGxpY2F0aW9uV3JpdGUgPSBudWxsOworCisgICAgLyoqCisgICAgICogU1NMIEZpbHRlciBjb25zdHJ1Y3RvciwgdGFrZXMgdXBzdHJlYW0gZmlsdGVyIGFzIGEgcGFyYW1ldGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGRvd25zdHJlYW1GaWx0ZXIgICAgICAgYSBmaWx0ZXIgdGhhdCBpcyBwb3NpdGlvbmVkIHVuZGVyIHRoZSBTU0wgZmlsdGVyLgorICAgICAqIEBwYXJhbSBzc2xDb250ZXh0ICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gb2YgU1NMIGVuZ2luZS4KKyAgICAgKiBAcGFyYW0gc2VydmVySG9zdCAgICAgICAgICAgICBzZXJ2ZXIgaG9zdCAoaG9zdG5hbWUgb3IgSVAgYWRkcmVzcyksIHdoaWNoIHdpbGwgYmUgdXNlZCB0byB2ZXJpZnkgYXV0aGVudGljaXR5IG9mCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHNlcnZlciAodGhlIHByb3ZpZGVkIGhvc3Qgd2lsbCBiZSBjb21wYXJlZCBhZ2FpbnN0IHRoZSBob3N0IGluIHRoZSBjZXJ0aWZpY2F0ZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVkIGJ5IHRoZSBzZXJ2ZXIpLiBJUCBhZGRyZXNzIGFuZCBob3N0bmFtZSBjYW5ub3QgYmUgdXNlZCBpbnRlcmNoYW5nZWFibHkgLQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGEgY2VydGlmaWNhdGUgY29udGFpbnMgaG9zdG5hbWUgYW5kIGFuIElQIGFkZHJlc3Mgb2YgdGhlIHNlcnZlciBpcyBwcm92aWRlZCBoZXJlLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB2ZXJpZmljYXRpb24gd2lsbCBmYWlsLgorICAgICAqIEBwYXJhbSBjdXN0b21Ib3N0bmFtZVZlcmlmaWVyIGhvc3RuYW1lIHZlcmlmaWVyIHRoYXQgd2lsbCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgb25lLgorICAgICAqLworICAgIFNzbEZpbHRlcihGaWx0ZXI8Qnl0ZUJ1ZmZlciwgQnl0ZUJ1ZmZlciwgPywgPz4gZG93bnN0cmVhbUZpbHRlciwKKyAgICAgICAgICAgICAgU1NMQ29udGV4dCBzc2xDb250ZXh0LAorICAgICAgICAgICAgICBTdHJpbmcgc2VydmVySG9zdCwKKyAgICAgICAgICAgICAgSG9zdG5hbWVWZXJpZmllciBjdXN0b21Ib3N0bmFtZVZlcmlmaWVyKSB7CisgICAgICAgIHN1cGVyKGRvd25zdHJlYW1GaWx0ZXIpOworICAgICAgICB0aGlzLnNlcnZlckhvc3QgPSBzZXJ2ZXJIb3N0OworICAgICAgICBzc2xFbmdpbmUgPSBzc2xDb250ZXh0LmNyZWF0ZVNTTEVuZ2luZShzZXJ2ZXJIb3N0LCAtMSk7CisgICAgICAgIHNzbEVuZ2luZS5zZXRVc2VDbGllbnRNb2RlKHRydWUpOworICAgICAgICB0aGlzLmN1c3RvbUhvc3RuYW1lVmVyaWZpZXIgPSBjdXN0b21Ib3N0bmFtZVZlcmlmaWVyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBFbmFibGUgc2VydmVyIGhvc3QgdmVyaWZpY2F0aW9uLgorICAgICAgICAgKiBUaGlzIGNhbiBiZSBtb3ZlZCB0byB7QGxpbmsgU3NsRW5naW5lQ29uZmlndXJhdG9yfSB3aXRoIHRoZSByZXN0IG9mIHtAbGluayBTU0xFbmdpbmV9IGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICogd2hlbiB7QGxpbmsgU3NsRW5naW5lQ29uZmlndXJhdG9yfSBzdXBwb3J0cyBKYXZhIDcuCisgICAgICAgICAqLworICAgICAgICBpZiAoY3VzdG9tSG9zdG5hbWVWZXJpZmllciA9PSBudWxsKSB7CisgICAgICAgICAgICBTU0xQYXJhbWV0ZXJzIHNzbFBhcmFtZXRlcnMgPSBzc2xFbmdpbmUuZ2V0U1NMUGFyYW1ldGVycygpOworICAgICAgICAgICAgc3NsUGFyYW1ldGVycy5zZXRFbmRwb2ludElkZW50aWZpY2F0aW9uQWxnb3JpdGhtKCJIVFRQUyIpOworICAgICAgICAgICAgc3NsRW5naW5lLnNldFNTTFBhcmFtZXRlcnMoc3NsUGFyYW1ldGVycyk7CisgICAgICAgIH0KKworICAgICAgICBhcHBsaWNhdGlvbklucHV0QnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShzc2xFbmdpbmUuZ2V0U2Vzc2lvbigpLmdldEFwcGxpY2F0aW9uQnVmZmVyU2l6ZSgpKTsKKyAgICAgICAgbmV0d29ya091dHB1dEJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoc3NsRW5naW5lLmdldFNlc3Npb24oKS5nZXRQYWNrZXRCdWZmZXJTaXplKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHN5bmNocm9uaXplZCB2b2lkIHdyaXRlKGZpbmFsIEJ5dGVCdWZmZXIgYXBwbGljYXRpb25EYXRhLCBmaW5hbCBDb21wbGV0aW9uSGFuZGxlcjxCeXRlQnVmZmVyPiBjb21wbGV0aW9uSGFuZGxlcikgeworICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgICAgICAvLyBiZWZvcmUgU1NMIGlzIHN0YXJ0ZWQsIHdyaXRlIGp1c3QgcGFzc2VzIHRocm91Z2gKKyAgICAgICAgICAgIGNhc2UgTk9UX1NUQVJURUQ6IHsKKyAgICAgICAgICAgICAgICB3cml0ZVF1ZXVlLndyaXRlKGFwcGxpY2F0aW9uRGF0YSwgY29tcGxldGlvbkhhbmRsZXIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogVE9ETzoKKyAgICAgICAgICAgICBUaGUgY3VycmVudCBtb2RlbCBkb2VzIG5vdCBwZXJtaXQgY2FsbGluZyB3cml0ZSBiZWZvcmUgU1NMIGhhbmRzaGFrZSBoYXMgY29tcGxldGVkLCBpZiB3ZSBhbGxvdyB0aGlzCisgICAgICAgICAgICAgd2UgY291bGQgZWFzaWx5IGdldCByaWQgb2YgdGhlIG9uU3NsSGFuZHNoYWtlQ29tcGxldGVkIGV2ZW50LiBUaGUgU1NMIGZpbHRlciBjYW4gc2ltcGx5IHN0b3JlIHRoZSB3cml0ZSB1bnRpbAorICAgICAgICAgICAgIHRoZSBoYW5kc2hha2UgaGFzIGNvbXBsZXRlZCBsaWtlIGR1cmluZyByZS1oYW5kc2hha2UuIFdpdGggc3VjaCBhIGNoYW5nZSBIQU5EU0hBS0lORyBhbmQgUkVIQU5EU0hBS0lORyBjb3VsZAorICAgICAgICAgICAgIGJlIGNvbGxhcHNlZCBpbnRvIG9uZSBzdGF0ZS4gKi8KKyAgICAgICAgICAgIGNhc2UgSEFORFNIQUtJTkc6IHsKKyAgICAgICAgICAgICAgICBjb21wbGV0aW9uSGFuZGxlci5mYWlsZWQobmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2Fubm90IHdyaXRlIHVudGlsIFNTTCBoYW5kc2hha2UgaGFzIGJlZW4gY29tcGxldGVkIikpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBTdXNwZW5kIGFsbCB3cml0ZXMgdW50aWwgdGhlIHJlLWhhbmRzaGFraW5nIGlzIGRvbmUuIERhdGEgYXJlIHBlcm1pdHRlZCBkdXJpbmcgcmUtaGFuZHNoYWtlIGluIFNTTCwgYnV0IHRoaXMKKyAgICAgICAgICAgICB3b3VsZCBvbmx5IGNvbXBsaWNhdGUgdGhpbmdzICovCisgICAgICAgICAgICBjYXNlIFJFSEFORFNIQUtJTkc6IHsKKyAgICAgICAgICAgICAgICBzdG9yZVBlbmRpbmdBcHBsaWNhdGlvbldyaXRlKGFwcGxpY2F0aW9uRGF0YSwgY29tcGxldGlvbkhhbmRsZXIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIERBVEE6IHsKKyAgICAgICAgICAgICAgICBoYW5kbGVXcml0ZShhcHBsaWNhdGlvbkRhdGEsIGNvbXBsZXRpb25IYW5kbGVyKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBDTE9TRUQ6IHsKKyAgICAgICAgICAgICAgICAvLyB0aGUgZW5naW5lIGlzIGNsb3NlZCBqdXN0IGFib3J0IHdpdGggZmFpbHVyZQorICAgICAgICAgICAgICAgIGNvbXBsZXRpb25IYW5kbGVyLmZhaWxlZChuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlNTTF9TRVNTSU9OX0NMT1NFRCgpKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaGFuZGxlV3JpdGUoZmluYWwgQnl0ZUJ1ZmZlciBhcHBsaWNhdGlvbkRhdGEsIGZpbmFsIENvbXBsZXRpb25IYW5kbGVyPEJ5dGVCdWZmZXI+IGNvbXBsZXRpb25IYW5kbGVyKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyB0cmFuc3BvcnQgYnVmZmVyIGFsd2F5cyB3cml0ZXMgYWxsIGRhdGEsIHNvIHRoZXJlIGFyZSBub3QgbGVmdG92ZXJzIGluIHRoZSBuZXR3b3JrT3V0cHV0QnVmZmVyCisgICAgICAgICAgICBuZXR3b3JrT3V0cHV0QnVmZmVyLmNsZWFyKCk7CisgICAgICAgICAgICBTU0xFbmdpbmVSZXN1bHQgcmVzdWx0ID0gc3NsRW5naW5lLndyYXAoYXBwbGljYXRpb25EYXRhLCBuZXR3b3JrT3V0cHV0QnVmZmVyKTsKKworICAgICAgICAgICAgc3dpdGNoIChyZXN1bHQuZ2V0U3RhdHVzKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJVRkZFUl9PVkVSRkxPVzogeworICAgICAgICAgICAgICAgICAgICAvKiB0aGlzIG1lYW5zIHRoYXQgdGhlIGNvbnRlbnQgb2YgdGhlIHNzbCBwYWNrZXQgKG1heCAxNmtCKSBkaWQgbm90IGZpdCBpbnRvCisgICAgICAgICAgICAgICAgICAgICAgIG5ldHdvcmtPdXRwdXRCdWZmZXIsIHdlIG1ha2Ugc3VyZSB0byBzZXQgbmV0d29ya091dHB1dEJ1ZmZlciA+IG1heCAxNmtCICsgU1NMIGhlYWRlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgd2hlbiBpbml0aWFsaXppbmcgdGhpcyBmaWx0ZXIuIFRoaXMgaW5kaWNhdGVzIGEgYnVnLiAqLworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJTU0wgcGFja2V0IGRvZXMgbm90IGZpdCBpbnRvIHRoZSBuZXR3b3JrIGJ1ZmZlcjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbmV0d29ya091dHB1dEJ1ZmZlciArICJcbiIgKyBnZXREZWJ1Z1N0YXRlKCkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQlVGRkVSX1VOREVSRkxPVzogeworICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIGJhc2ljYWxseSBzYXlzIHRoYXQgdGhlcmUgaXMgbm90IGVub3VnaCBkYXRhIHRvIGNyZWF0ZSBhbiBTU0wgcGFja2V0LiBKYXZhZG9jIHN1Z2dlc3RzIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgQlVGRkVSX1VOREVSRkxPVyBjYW4gb2NjdXIgb25seSBhZnRlciB1bndyYXAoKSwgYnV0IHRvIGJlIDEwMCUgc3VyZSB3ZSBoYW5kbGUgYWxsIHBvc3NpYmxlIGVycm9yIHN0YXRlczogKi8KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiU1NMIGVuZ2luZSB1bmRlcmZsb3cgd2l0aCB0aGUgZm9sbG93aW5nIGFwcGxpY2F0aW9uIGlucHV0OiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhcHBsaWNhdGlvbkRhdGEgKyAiXG4iICsgZ2V0RGVidWdTdGF0ZSgpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIENMT1NFRDogeworICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFN0YXRlLkNMT1NFRDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBPSzogeworICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB3ZSBzdGFydGVkIHJlLWhhbmRzaGFraW5nCisgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZ2V0SGFuZHNoYWtlU3RhdHVzKCkgIT0gU1NMRW5naW5lUmVzdWx0LkhhbmRzaGFrZVN0YXR1cy5OT1RfSEFORFNIQUtJTkcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU3RhdGUuUkVIQU5EU0hBS0lORzsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIG5ldHdvcmtPdXRwdXRCdWZmZXIuZmxpcCgpOworICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZSBvbmx5IGlmIHNvbWV0aGluZyB3YXMgd3JpdHRlbiB0byB0aGUgb3V0cHV0IGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICBpZiAobmV0d29ya091dHB1dEJ1ZmZlci5oYXNSZW1haW5pbmcoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVRdWV1ZS53cml0ZShuZXR3b3JrT3V0cHV0QnVmZmVyLCBuZXcgQ29tcGxldGlvbkhhbmRsZXI8Qnl0ZUJ1ZmZlcj4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY29tcGxldGVkKEJ5dGVCdWZmZXIgcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVBvc3RXcml0ZShhcHBsaWNhdGlvbkRhdGEsIGNvbXBsZXRpb25IYW5kbGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBmYWlsZWQoVGhyb3dhYmxlIHRocm93YWJsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uSGFuZGxlci5mYWlsZWQodGhyb3dhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVBvc3RXcml0ZShhcHBsaWNhdGlvbkRhdGEsIGNvbXBsZXRpb25IYW5kbGVyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoU1NMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGhhbmRsZVNzbEVycm9yKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBoYW5kbGVQb3N0V3JpdGUoZmluYWwgQnl0ZUJ1ZmZlciBhcHBsaWNhdGlvbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29tcGxldGlvbkhhbmRsZXI8Qnl0ZUJ1ZmZlcj4gY29tcGxldGlvbkhhbmRsZXIpIHsKKyAgICAgICAgaWYgKHN0YXRlID09IFN0YXRlLlJFSEFORFNIQUtJTkcpIHsKKyAgICAgICAgICAgIGlmIChhcHBsaWNhdGlvbkRhdGEuaGFzUmVtYWluaW5nKCkpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGUgcmVtYWluaW5nIGRhdGEgd2lsbCBiZSBzZW50IGFmdGVyIHJlLWhhbmRzaGFrZQorICAgICAgICAgICAgICAgIHN0b3JlUGVuZGluZ0FwcGxpY2F0aW9uV3JpdGUoYXBwbGljYXRpb25EYXRhLCBjb21wbGV0aW9uSGFuZGxlcik7CisgICAgICAgICAgICAgICAgLy8gc3RhcnQgcmUtaGFuZHNoYWtpbmcKKyAgICAgICAgICAgICAgICBkb0hhbmRzaGFrZVN0ZXAoZW1wdHlCdWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGFwcGxpY2F0aW9uRGF0YS5oYXNSZW1haW5pbmcoKSkgeworICAgICAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0byBlbXB0eSB0aGUgYXBwbGljYXRpb24gb3V0cHV0IGJ1ZmZlcgorICAgICAgICAgICAgICAgIGhhbmRsZVdyaXRlKGFwcGxpY2F0aW9uRGF0YSwgY29tcGxldGlvbkhhbmRsZXIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb21wbGV0aW9uSGFuZGxlci5jb21wbGV0ZWQoYXBwbGljYXRpb25EYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdG9yZVBlbmRpbmdBcHBsaWNhdGlvbldyaXRlKGZpbmFsIEJ5dGVCdWZmZXIgYXBwbGljYXRpb25EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbXBsZXRpb25IYW5kbGVyPEJ5dGVCdWZmZXI+IGNvbXBsZXRpb25IYW5kbGVyKSB7CisgICAgICAgIC8vIHN0b3JlIHRoZSB3cml0ZSB1bnRpbCByZS1oYW5kc2hha2luZyBpcyBjb21wbGV0ZWQKKyAgICAgICAgaWYgKHBlbmRpbmdBcHBsaWNhdGlvbldyaXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8qIElmIHRoaXMgaGFwcGVucyBpdCBtZWFucyBhIGJ1ZyBpbiB0aGlzIGNsYXNzIG9yIHVwcGVyIGxheWVyIGNhbGxlZCBhbm90aGVyIHdyaXRlKCkgd2l0aG91dCB3YWl0aW5nCisgICAgICAgICAgICAgZm9yIGEgY29tcGxldGlvbiBoYW5kbGVyIG9mIHRoZSBwcmV2aW91cyBvbmUuICovCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJPbmx5IG9uZSB3cml0ZSBvcGVyYXRpb24gY2FuIGJlIGluIHByb2dyZXNzXG4iICsgZ2V0RGVidWdTdGF0ZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHBlbmRpbmdBcHBsaWNhdGlvbldyaXRlID0gKCkgLT4geworICAgICAgICAgICAgLy8gZ28gYWdhaW4gdGhyb3VnaCB0aGUgZW50aXJlIHdyaXRlIHByb2NlZHVyZSBsaWtlIHRoaXMgZGF0YSBjYW1lIGRpcmVjdGx5IGZyb20gdGhlIGFwcGxpY2F0aW9uCisgICAgICAgICAgICB3cml0ZShhcHBsaWNhdGlvbkRhdGEsIGNvbXBsZXRpb25IYW5kbGVyKTsKKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBzeW5jaHJvbml6ZWQgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgaWYgKHN0YXRlID09IFN0YXRlLk5PVF9TVEFSVEVEKSB7CisgICAgICAgICAgICBkb3duc3RyZWFtRmlsdGVyLmNsb3NlKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBzc2xFbmdpbmUuY2xvc2VPdXRib3VuZCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgTGF6eUJ1ZmZlciBsYXp5QnVmZmVyID0gbmV3IExhenlCdWZmZXIoKTsKKworICAgICAgICAgICAgd2hpbGUgKHNzbEVuZ2luZS5nZXRIYW5kc2hha2VTdGF0dXMoKSA9PSBTU0xFbmdpbmVSZXN1bHQuSGFuZHNoYWtlU3RhdHVzLk5FRURfV1JBUCkgeworICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgYnVmZmVyID0gbGF6eUJ1ZmZlci5nZXQoKTsKKyAgICAgICAgICAgICAgICBTU0xFbmdpbmVSZXN1bHQgcmVzdWx0ID0gc3NsRW5naW5lLndyYXAoZW1wdHlCdWZmZXIsIGJ1ZmZlcik7CisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHJlc3VsdC5nZXRTdGF0dXMoKSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEJVRkZFUl9PVkVSRkxPVzogeworICAgICAgICAgICAgICAgICAgICAgICAgbGF6eUJ1ZmZlci5yZXNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCVUZGRVJfVU5ERVJGTE9XOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIGJhc2ljYWxseSBzYXlzIHRoYXQgdGhlcmUgaXMgbm90IGVub3VnaCBkYXRhIHRvIGNyZWF0ZSBhbiBTU0wgcGFja2V0LiBKYXZhZG9jIHN1Z2dlc3RzIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgIEJVRkZFUl9VTkRFUkZMT1cgY2FuIG9jY3VyIG9ubHkgYWZ0ZXIgdW53cmFwKCksIGJ1dCB0byBiZSAxMDAlIHN1cmUgd2UgaGFuZGxlIGFsbCBwb3NzaWJsZSBlcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVzOiAqLworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiU1NMIGVuZ2luZSB1bmRlcmZsb3cgd2hpbGUgY2xvc2Ugb3BlcmF0aW9uIFxuIiArIGdldERlYnVnU3RhdGUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBDTE9TRSBvciBPSyBhcmUgZXhwZWN0ZWQgb3V0Y29tZXMKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxhenlCdWZmZXIuaXNBbGxvY2F0ZWQoKSkgeworICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgYnVmZmVyID0gbGF6eUJ1ZmZlci5nZXQoKTsKKyAgICAgICAgICAgICAgICBidWZmZXIuZmxpcCgpOworICAgICAgICAgICAgICAgIHdyaXRlUXVldWUud3JpdGUoYnVmZmVyLCBuZXcgQ29tcGxldGlvbkhhbmRsZXI8Qnl0ZUJ1ZmZlcj4oKSB7CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbXBsZXRlZChCeXRlQnVmZmVyIHJlc3VsdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZG93bnN0cmVhbUZpbHRlci5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZhaWxlZChUaHJvd2FibGUgdGhyb3dhYmxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkb3duc3RyZWFtRmlsdGVyLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGNsb3NlIGV2ZW4gaWYgU1NMIGhhZCBub3RoaW5nIHRvIHNlbmQKKyAgICAgICAgICAgICAgICBkb3duc3RyZWFtRmlsdGVyLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBoYW5kbGVTc2xFcnJvcihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIGJvb2xlYW4gcHJvY2Vzc1JlYWQoQnl0ZUJ1ZmZlciBuZXR3b3JrRGF0YSkgeworICAgICAgICAvKiBBIGZsYWcgaW5kaWNhdGluZyBpZiB3ZSBzaG91bGQga2VlcCByZWFkaW5nIGZyb20gdGhlIG5ldHdvcmsgYnVmZmVyLgorICAgICAgICBJZiBmYWxzZSwgdGhlIGJ1ZmZlciBjb250YWlucyBhbiB1bmNvbXBsZXRlZCBwYWNrZXQgLT4gc3RvcCByZWFkaW5nLCBTU0wgZW5naW5lIGFjY2VwdHMgb25seSB3aG9sZSBwYWNrZXRzICovCisgICAgICAgIGJvb2xlYW4gcmVhZE1vcmUgPSB0cnVlOworCisgICAgICAgIHdoaWxlIChuZXR3b3JrRGF0YS5oYXNSZW1haW5pbmcoKSAmJiByZWFkTW9yZSkgeworICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICAgICAgICAgIC8vIGJlZm9yZSBTU0wgaXMgc3RhcnRlZCB3cml0ZSBqdXN0IHBhc3NlcyB0aHJvdWdoCisgICAgICAgICAgICAgICAgY2FzZSBOT1RfU1RBUlRFRDogeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIEhBTkRTSEFLSU5HOgorICAgICAgICAgICAgICAgIGNhc2UgUkVIQU5EU0hBS0lORzogeworICAgICAgICAgICAgICAgICAgICByZWFkTW9yZSA9IGRvSGFuZHNoYWtlU3RlcChuZXR3b3JrRGF0YSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgREFUQTogeworICAgICAgICAgICAgICAgICAgICByZWFkTW9yZSA9IGhhbmRsZVJlYWQobmV0d29ya0RhdGEpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjYXNlIENMT1NFRDogeworICAgICAgICAgICAgICAgICAgICAvLyBkcm9wIGFueSBkYXRhIHRoYXQgYXJyaXZlIGFmdGVyIHRoZSBTU0wgaGFzIGJlZW4gY2xvc2VkCisgICAgICAgICAgICAgICAgICAgIG5ldHdvcmtEYXRhLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIHJlYWRNb3JlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBoYW5kbGVSZWFkKEJ5dGVCdWZmZXIgbmV0d29ya0RhdGEpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFwcGxpY2F0aW9uSW5wdXRCdWZmZXIuY2xlYXIoKTsKKyAgICAgICAgICAgIFNTTEVuZ2luZVJlc3VsdCByZXN1bHQgPSBzc2xFbmdpbmUudW53cmFwKG5ldHdvcmtEYXRhLCBhcHBsaWNhdGlvbklucHV0QnVmZmVyKTsKKworICAgICAgICAgICAgc3dpdGNoIChyZXN1bHQuZ2V0U3RhdHVzKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEJVRkZFUl9PVkVSRkxPVzogeworICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIG1lYW5zIHRoYXQgdGhlIGNvbnRlbnQgb2YgdGhlIHNzbCBwYWNrZXQgKG1heCAxNmtCKSBkaWQgbm90IGZpdCBpbnRvCisgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uSW5wdXRCdWZmZXIsIGJ1dCB3ZSBtYWtlIHN1cmUgdG8gc2V0IGFwcGxpY2F0aW9uSW5wdXRCdWZmZXIgPiBtYXggMTZrQgorICAgICAgICAgICAgICAgICAgICAgICB3aGVuIGluaXRpYWxpemluZyB0aGlzIGZpbHRlci4gVGhpcyBpbmRpY2F0ZXMgYSBidWcuKi8KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ29udGVudHMgb2YgYSBTU0wgcGFja2V0IGRpZCBub3QgZml0IGludG8gYnVmZmVyOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBhcHBsaWNhdGlvbklucHV0QnVmZmVyICsgIlxuIiArIGdldERlYnVnU3RhdGUoKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBCVUZGRVJfVU5ERVJGTE9XOiB7CisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzc2wgcGFja2V0IGlzIG5vdCBmdWxsLCByZXR1cm4gYW5kIGluZGljYXRlIHRoYXQgd2Ugd29uJ3QgZ2V0IG1vcmUgZnJvbSB0aGlzIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBDTE9TRUQ6CisgICAgICAgICAgICAgICAgY2FzZSBPSzogeworICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmJ5dGVzUHJvZHVjZWQoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uSW5wdXRCdWZmZXIuZmxpcCgpOworICAgICAgICAgICAgICAgICAgICAgICAgdXBzdHJlYW1GaWx0ZXIub25SZWFkKGFwcGxpY2F0aW9uSW5wdXRCdWZmZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JbnB1dEJ1ZmZlci5jb21wYWN0KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoc3NsRW5naW5lLmlzSW5ib3VuZERvbmUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogd2UgaGF2ZSBqdXN0IHJlY2VpdmVkIGEgY2xvc2UgYWxlcnQgZnJvbSBvdXIgcGVlciwgc28gd2UgYXJlIGRvbmUuIElmIHRoZXJlIGlzIHNvbWV0aGluZworICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nIGluIHRoZSBpbnB1dCBidWZmZXIsIGp1c3QgZHJvcCBpdC4gKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2lnbmFsIHRoYXQgdGhlcmUgaXMgbm90aGluZyB1c2VmdWwgbGVmdCBpbiB0aGlzIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gd2Ugc3RhcnRlZCByZS1oYW5kc2hha2luZworICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmdldEhhbmRzaGFrZVN0YXR1cygpICE9IFNTTEVuZ2luZVJlc3VsdC5IYW5kc2hha2VTdGF0dXMuTk9UX0hBTkRTSEFLSU5HCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGRvbid0IGNvbmZ1c2UgcmUtaGFuZHNoYWtlIHdpdGggY2xvc2luZyBoYW5kc2hha2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhc3NsRW5naW5lLmlzT3V0Ym91bmREb25lKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU3RhdGUuUkVIQU5EU0hBS0lORzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkb0hhbmRzaGFrZVN0ZXAobmV0d29ya0RhdGEpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChTU0xFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaGFuZGxlU3NsRXJyb3IoZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gZG9IYW5kc2hha2VTdGVwKEJ5dGVCdWZmZXIgbmV0d29ya0RhdGEpIHsKKyAgICAgICAgLyogQnVmZmVyIHVzZWQgdG8gc3RvcmUgYXBwbGljYXRpb24gZGF0YSByZWFkIGR1cmluZyB0aGlzIGhhbmRzaGFrZSBzdGVwLgorICAgICAgICBBcHBsaWNhdGlvbiBkYXRhIGNhbiBiZSBpbnRlcmxlYXZlZCB3aXRoIGhhbmRzaGFrZSBtZXNzYWdlcyBvbmx5IGR1cmluZyByZS1oYW5kc2hha2UuCisgICAgICAgIFdlIGRvbid0IHVzZSBhcHBsaWNhdGlvbklucHV0QnVmZmVyLCBiZWNhdXNlIHdlIG1pZ2h0IHdhbnQgdG8gc3RvcmUgbW9yZSB0aGFuIG9uZSBwYWNrZXQgKi8KKyAgICAgICAgTGF6eUJ1ZmZlciBpbnB1dEJ1ZmZlciA9IG5ldyBMYXp5QnVmZmVyKCk7CisgICAgICAgIGJvb2xlYW4gaGFuZHNoYWtlRmluaXNoZWQgPSBmYWxzZTsKKworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGlmIChTU0xFbmdpbmVSZXN1bHQuSGFuZHNoYWtlU3RhdHVzLk5PVF9IQU5EU0hBS0lORy5lcXVhbHMoc3NsRW5naW5lLmdldEhhbmRzaGFrZVN0YXR1cygpKSkgeworICAgICAgICAgICAgICAgIC8vIHdlIHN0b3BwZWQgaGFuZHNoYWtpbmcgd2hpbGUgd2FpdGluZyBmb3IgdGhlIGxvY2sKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvKiB3ZSBkb24ndCB1c2UgbmV0d29ya091dHB1dEJ1ZmZlciwgYmVjYXVzZSB0aGVyZSBtaWdodCBiZSBhIHdyaXRlIG9wZXJhdGlvbiBzdGlsbCBpbiBwcm9ncmVzcyAtPgorICAgICAgICAgICAgICAgIHdlIGRvbid0IHdhbnQgdG8gY29ycnVwdCB0aGUgYnVmZmVyIGl0IGlzIHVzaW5nICovCisgICAgICAgICAgICAgICAgTGF6eUJ1ZmZlciBvdXRwdXRCdWZmZXIgPSBuZXcgTGF6eUJ1ZmZlcigpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gc3RlcEZpbmlzaGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgd2hpbGUgKCFzdGVwRmluaXNoZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgU1NMRW5naW5lUmVzdWx0LkhhbmRzaGFrZVN0YXR1cyBocyA9IHNzbEVuZ2luZS5nZXRIYW5kc2hha2VTdGF0dXMoKTsKKworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGhzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE5PVF9IQU5EU0hBS0lORzogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbi4gSWYgd2UgYXJlIGhlcmUgYW5kIG5vdCBoYW5kc2hha2luZywgaXQgbWVhbnMgYSBidWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgc3RhdGUgbWFjaGluZSBvZiB0aGlzIGNsYXNzLCBiZWNhdXNlIHdlIHN0b3BwZWQgaGFuZHNoYWtpbmcgYW5kIGRpZCBub3QgZXhpdCB0aGlzIHdoaWxlIGxvb3AuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGNvdWxkIGJlIGNhdXNlZCBlaXRoZXIgYnkgb3Zlcmxvb2tpbmcgRklOSVNIRUQgc3RhdGUgb3IgaW5jb3JyZWN0bHkgdHJlYXRpbmcgYW4gZXJyb3IuICovCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUcnlpbmcgdG8gaGFuZHNoYWtlLCBidXQgU1NMIGVuZ2luZSBub3QgaW4gSEFORFNIQUtJTkcgc3RhdGUuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiU1NMIGZpbHRlciBzdGF0ZTogXG4iICsgZ2V0RGVidWdTdGF0ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGSU5JU0hFRDogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFjY29yZGluZyB0byBTU0xFbmdpbmUgamF2YWRvYyBGSU5JU0hFRCBzdGF0dXMgY2FuIGJlIHJldHVybmVkIG9ubHkgaW4gU1NMRW5naW5lUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1dCBqdXN0IHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBlbmQgdXAgaW4gYW4gaW5maW5pdGUgbG9vcCB3aGVuIHByZXNlbnRlZCB3aXRoIGFuIFNTTEVuZ2luZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIHRoYXQgZG9lcyBub3QgcmVzcGVjdCB0aGlzOiovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcEZpbmlzaGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kc2hha2VGaW5pc2hlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkcyB0byB3cml0ZSBkYXRhIHRvIHRoZSBuZXR3b3JrCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE5FRURfV1JBUDogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgYnl0ZUJ1ZmZlciA9IG91dHB1dEJ1ZmZlci5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0xFbmdpbmVSZXN1bHQgcmVzdWx0ID0gc3NsRW5naW5lLndyYXAoZW1wdHlCdWZmZXIsIGJ5dGVCdWZmZXIpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5nZXRIYW5kc2hha2VTdGF0dXMoKSA9PSBTU0xFbmdpbmVSZXN1bHQuSGFuZHNoYWtlU3RhdHVzLkZJTklTSEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBGaW5pc2hlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRzaGFrZUZpbmlzaGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHJlc3VsdC5nZXRTdGF0dXMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJVRkZFUl9PVkVSRkxPVzogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyLnJlc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJVRkZFUl9VTkRFUkZMT1c6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoaXMgYmFzaWNhbGx5IHNheXMgdGhhdCB0aGVyZSBpcyBub3QgZW5vdWdoIGRhdGEgdG8gY3JlYXRlIGFuIFNTTCBwYWNrZXQuIEphdmFkb2Mgc3VnZ2VzdHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgQlVGRkVSX1VOREVSRkxPVyBjYW4gb2NjdXIgb25seSBhZnRlciB1bndyYXAoKSwgYnV0IHRvIGJlIDEwMCUgc3VyZSB3ZSBoYW5kbGUgYWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZSBlcnJvciBzdGF0ZXM6ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJTU0wgZW5naW5lIHVuZGVyZmxvdyB3aXRoIHRoZSBmb2xsb3dpbmcgU1NMIGZpbHRlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInN0YXRlOiBcbiIgKyBnZXREZWJ1Z1N0YXRlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDTE9TRUQ6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBGaW5pc2hlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFN0YXRlLkNMT1NFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTkVFRF9VTldSQVA6IHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNTTEVuZ2luZVJlc3VsdCByZXN1bHQgPSBzc2xFbmdpbmUudW53cmFwKG5ldHdvcmtEYXRhLCBhcHBsaWNhdGlvbklucHV0QnVmZmVyKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uSW5wdXRCdWZmZXIuZmxpcCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcHBsaWNhdGlvbklucHV0QnVmZmVyLmhhc1JlbWFpbmluZygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRhdGEgY2FuIGZsb3cgZHVyaW5nIHJlLWhhbmRzaGFrZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlci5hcHBlbmQoYXBwbGljYXRpb25JbnB1dEJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uSW5wdXRCdWZmZXIuY29tcGFjdCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5nZXRIYW5kc2hha2VTdGF0dXMoKSA9PSBTU0xFbmdpbmVSZXN1bHQuSGFuZHNoYWtlU3RhdHVzLkZJTklTSEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBGaW5pc2hlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRzaGFrZUZpbmlzaGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHJlc3VsdC5nZXRTdGF0dXMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJVRkZFUl9PVkVSRkxPVzogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBtZWFucyB0aGF0IHRoZSBjb250ZW50IG9mIHRoZSBzc2wgcGFja2V0IChtYXggMTZrQikgZGlkIG5vdCBmaXQgaW50bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25JbnB1dEJ1ZmZlciwgYnV0IHdlIG1ha2Ugc3VyZSB0byBzZXQgYXBwbGljYXRpb25JbnB1dEJ1ZmZlciA+IG1heCAxNmtCCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIGluaXRpYWxpemluZyB0aGlzIGZpbHRlci4gVGhpcyBpbmRpY2F0ZXMgYSBidWcuICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJTU0wgcGFja2V0IGRvZXMgbm90IGZpdCBpbnRvIHRoZSBuZXR3b3JrIGJ1ZmZlcjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGdldERlYnVnU3RhdGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEJVRkZFUl9VTkRFUkZMT1c6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZGljYXRlIHRoYXQgd2Ugd29uJ3QgZ2V0IG1vcmUgZnJvbSB0aGlzIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcEZpbmlzaGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDTE9TRUQ6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBGaW5pc2hlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFN0YXRlLkNMT1NFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkcyB0byBleGVjdXRlIGxvbmcgcnVubmluZyB0YXNrIChmb3IgaW5zdGFuY2UgdmFsaWRhdGluZyBjZXJ0aWZpY2F0ZXMpCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE5FRURfVEFTSzogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bm5hYmxlIGRlbGVnYXRlZFRhc2s7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChkZWxlZ2F0ZWRUYXNrID0gc3NsRW5naW5lLmdldERlbGVnYXRlZFRhc2soKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZWRUYXNrLnJ1bigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIG5vdyB3cml0ZSB0aGUgc3RvcmVkIHdyYXAoKSByZXN1bHRzCisgICAgICAgICAgICAgICAgaWYgKG91dHB1dEJ1ZmZlci5pc0FsbG9jYXRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgYnVmZmVyID0gb3V0cHV0QnVmZmVyLmdldCgpOworICAgICAgICAgICAgICAgICAgICBidWZmZXIuZmxpcCgpOworICAgICAgICAgICAgICAgICAgICB3cml0ZVF1ZXVlLndyaXRlKGJ1ZmZlciwgbnVsbCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGhhbmRsZVNzbEVycm9yKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyogSGFuZGxlIGFueSByZWFkIGRhdGEuCisgICAgICAgIFdlIGhhdmUgdG8gZXhlY3V0ZSB1cHN0cmVhbUZpbHRlci5vblJlYWQgYWZ0ZXIgcmVsZWFzaW5nIHRoZSBsb2NrLiBTZWUgdGhlIHN5bmNocm9uaXphdGlvbiBub3RlIG9uIHRvcC4KKyAgICAgICAgT25seSBvbmUgcmVhZCBvcGVyYXRpb24gY2FuIGJlIGluIHByb2dyZXNzIGF0IGEgdGltZSwgc28gZXZlbiB0aG91Z2ggd2UgaGF2ZSByZWxlYXNlZCB0aGUgbG9jaywgbm8gb3RoZXIKKyAgICAgICAgU1NsRW5naW5lI3Vud3JhcCBjYW4gYmUgcGVyZm9ybWVkIHVudGlsIHRoaXMgbWV0aG9kIHJldHVybnMuIFNvIHRoZXJlIGlzIG5vIGNoYW5jZSBvZiB0aGUgcmVhZCBkYXRhCisgICAgICAgIGJlaW5nIG1peGVkIHVwICovCisgICAgICAgIGlmIChpbnB1dEJ1ZmZlci5pc0FsbG9jYXRlZCgpKSB7CisgICAgICAgICAgICBCeXRlQnVmZmVyIGJ1ZmZlciA9IGlucHV0QnVmZmVyLmdldCgpOworICAgICAgICAgICAgdXBzdHJlYW1GaWx0ZXIub25SZWFkKGJ1ZmZlcik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaGFuZHNoYWtlRmluaXNoZWQpIHsKKyAgICAgICAgICAgIGhhbmRsZUhhbmRzaGFrZUZpbmlzaGVkKCk7CisgICAgICAgICAgICAvLyBpbmRpY2F0ZSB0aGF0IHRoZXJlIHN0aWxsIG1pZ2h0IGJlIHVzYWJsZSBkYXRhIGluIHRoZSBpbnB1dCBidWZmZXIKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLyogaWYgd2UgYXJlIGhlcmUsIGl0IG1lYW5zIHRoYXQgd2UgYXJlIHdhaXRpbmcgZm9yIG1vcmUgZGF0YSAtPiBpbmRpY2F0ZSB0aGF0IHRoZXJlIGlzIG5vdGhpbmcgdXNhYmxlIGluIHRoZQorICAgICAgICBpbnB1dCBidWZmZXIgbGVmdCAqLworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUhhbmRzaGFrZUZpbmlzaGVkKCkgeworICAgICAgICAvLyBBcHBseSBhIGN1c3RvbSBob3N0IHZlcmlmaWVyIGlmIHByZXNlbnQuIERvIGl0IGZvciBib3RoIGhhbmRzaGFraW5nIGFuZCByZS1oYW5kc2hha2luZy4KKyAgICAgICAgaWYgKGN1c3RvbUhvc3RuYW1lVmVyaWZpZXIgIT0gbnVsbCAmJiAhY3VzdG9tSG9zdG5hbWVWZXJpZmllci52ZXJpZnkoc2VydmVySG9zdCwgc3NsRW5naW5lLmdldFNlc3Npb24oKSkpIHsKKyAgICAgICAgICAgIGhhbmRsZVNzbEVycm9yKG5ldyBTU0xFeGNlcHRpb24oIlNlcnZlciBob3N0IG5hbWUgdmVyaWZpY2F0aW9uIHVzaW5nICIgKyBjdXN0b21Ib3N0bmFtZVZlcmlmaWVyCisgICAgICAgICAgICAgICAgICAgIC5nZXRDbGFzcygpICsgIiBoYXMgZmFpbGVkIikpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0YXRlID09IFN0YXRlLkhBTkRTSEFLSU5HKSB7CisgICAgICAgICAgICBzdGF0ZSA9IFN0YXRlLkRBVEE7CisgICAgICAgICAgICB1cHN0cmVhbUZpbHRlci5vblNzbEhhbmRzaGFrZUNvbXBsZXRlZCgpOworICAgICAgICB9IGVsc2UgaWYgKHN0YXRlID09IFN0YXRlLlJFSEFORFNIQUtJTkcpIHsKKyAgICAgICAgICAgIHN0YXRlID0gU3RhdGUuREFUQTsKKyAgICAgICAgICAgIGlmIChwZW5kaW5nQXBwbGljYXRpb25Xcml0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgUnVubmFibGUgd3JpdGUgPSBwZW5kaW5nQXBwbGljYXRpb25Xcml0ZTsKKyAgICAgICAgICAgICAgICAvLyBzZXQgcGVuZGluZyB3cml0ZSB0byBudWxsIHRvIGNvdmVyIHRoZSBleHRyZW1lbHkgaW1wcm9iYWJsZSBjYXNlIHRoYXQgd2Ugc3RhcnQgcmUtaGFuZHNoYWtpbmcgYWdhaW4KKyAgICAgICAgICAgICAgICBwZW5kaW5nQXBwbGljYXRpb25Xcml0ZSA9IG51bGw7CisKKyAgICAgICAgICAgICAgICB3cml0ZS5ydW4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBoYW5kbGVTc2xFcnJvcihUaHJvd2FibGUgdCkgeworICAgICAgICBvbkVycm9yKHQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHZvaWQgc3RhcnRTc2woKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdGF0ZSA9IFN0YXRlLkhBTkRTSEFLSU5HOworICAgICAgICAgICAgc3NsRW5naW5lLmJlZ2luSGFuZHNoYWtlKCk7CisgICAgICAgICAgICBkb0hhbmRzaGFrZVN0ZXAoZW1wdHlCdWZmZXIpOworICAgICAgICB9IGNhdGNoIChTU0xFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaGFuZGxlU3NsRXJyb3IoZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPbmx5IGZvciB0ZXN0LgorICAgICAqLworICAgIHZvaWQgcmVoYW5kc2hha2UoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzc2xFbmdpbmUuYmVnaW5IYW5kc2hha2UoKTsKKyAgICAgICAgfSBjYXRjaCAoU1NMRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGhhbmRsZVNzbEVycm9yKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHByaW50ZWQgY3VycmVudCBzdGF0ZSBvZiB0aGUgU3NsRmlsdGVyIHRoYXQgY291bGQgYmUgaGVscGZ1bCBmb3IgdHJvdWJsZXNob290aW5nLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdldERlYnVnU3RhdGUoKSB7CisgICAgICAgIHJldHVybiAiU3NsRmlsdGVyeyIKKyAgICAgICAgICAgICAgICArICJcbmFwcGxpY2F0aW9uSW5wdXRCdWZmZXI9IiArIGFwcGxpY2F0aW9uSW5wdXRCdWZmZXIKKyAgICAgICAgICAgICAgICArICIsXG5uZXR3b3JrT3V0cHV0QnVmZmVyPSIgKyBuZXR3b3JrT3V0cHV0QnVmZmVyCisgICAgICAgICAgICAgICAgKyAiLFxuc3NsRW5naW5lU3RhdHVzPSIgKyBzc2xFbmdpbmUuZ2V0SGFuZHNoYWtlU3RhdHVzKCkKKyAgICAgICAgICAgICAgICArICIsXG5zc2xTZXNzaW9uPSIgKyBzc2xFbmdpbmUuZ2V0U2Vzc2lvbigpCisgICAgICAgICAgICAgICAgKyAiLFxuc3RhdGU9IiArIHN0YXRlCisgICAgICAgICAgICAgICAgKyAiLFxucGVuZGluZ0FwcGxpY2F0aW9uV3JpdGU9IiArIHBlbmRpbmdBcHBsaWNhdGlvbldyaXRlCisgICAgICAgICAgICAgICAgKyAiLFxucGVuZGluZ1dyaXRlc1NpemU9IiArIHdyaXRlUXVldWUKKyAgICAgICAgICAgICAgICArICd9JzsKKyAgICB9CisKKyAgICBwcml2YXRlIGVudW0gU3RhdGUgeworICAgICAgICBOT1RfU1RBUlRFRCwKKyAgICAgICAgSEFORFNIQUtJTkcsCisgICAgICAgIFJFSEFORFNIQUtJTkcsCisgICAgICAgIERBVEEsCisgICAgICAgIENMT1NFRAorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgTGF6eUJ1ZmZlciB7CisKKyAgICAgICAgcHJpdmF0ZSBCeXRlQnVmZmVyIGJ1ZmZlciA9IG51bGw7CisKKyAgICAgICAgQnl0ZUJ1ZmZlciBnZXQoKSB7CisgICAgICAgICAgICBpZiAoYnVmZmVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBidWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKHNzbEVuZ2luZS5nZXRTZXNzaW9uKCkuZ2V0UGFja2V0QnVmZmVyU2l6ZSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gaXNBbGxvY2F0ZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gYnVmZmVyICE9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHJlc2l6ZSgpIHsKKyAgICAgICAgICAgIGludCBpbmNyZW1lbnQgPSBzc2xFbmdpbmUuZ2V0U2Vzc2lvbigpLmdldFBhY2tldEJ1ZmZlclNpemUoKTsKKyAgICAgICAgICAgIGludCBuZXdTaXplID0gYnVmZmVyLnBvc2l0aW9uKCkgKyBpbmNyZW1lbnQ7CisgICAgICAgICAgICBCeXRlQnVmZmVyIG5ld0J1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUobmV3U2l6ZSk7CisgICAgICAgICAgICBidWZmZXIuZmxpcCgpOworICAgICAgICAgICAgbmV3QnVmZmVyLmZsaXAoKTsKKyAgICAgICAgICAgIGJ1ZmZlciA9IFV0aWxzLmFwcGVuZEJ1ZmZlcnMobmV3QnVmZmVyLCBidWZmZXIsIG5ld0J1ZmZlci5saW1pdCgpLCA1MCk7CisgICAgICAgICAgICBidWZmZXIuY29tcGFjdCgpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBhcHBlbmQoQnl0ZUJ1ZmZlciBiKSB7CisgICAgICAgICAgICBpZiAoYnVmZmVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBidWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKGIucmVtYWluaW5nKCkpOworICAgICAgICAgICAgICAgIGJ1ZmZlci5mbGlwKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgbmV3U2l6ZSA9IGJ1ZmZlci5saW1pdCgpICsgYi5yZW1haW5pbmcoKTsKKyAgICAgICAgICAgIGJ1ZmZlciA9IFV0aWxzLmFwcGVuZEJ1ZmZlcnMoYnVmZmVyLCBiLCBuZXdTaXplLCA1MCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBzeW5jaHJvbml6ZWQgb24gdGhlIG91dGVyIGNsYXNzLCBiZWNhdXNlIHRoZXJlIGlzIGEgZGFuZ2VyIG9mIGRlYWRsb2NrIGlmIHRoaXMgaGFzIGl0cyBvd24gbG9jaworICAgIHByaXZhdGUgY2xhc3MgV3JpdGVRdWV1ZSB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBRdWV1ZTxSdW5uYWJsZT4gcGVuZGluZ1dyaXRlcyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKworICAgICAgICB2b2lkIHdyaXRlKGZpbmFsIEJ5dGVCdWZmZXIgZGF0YSwgZmluYWwgQ29tcGxldGlvbkhhbmRsZXI8Qnl0ZUJ1ZmZlcj4gY29tcGxldGlvbkhhbmRsZXIpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoU3NsRmlsdGVyLnRoaXMpIHsKKyAgICAgICAgICAgICAgICBSdW5uYWJsZSByID0gKCkgLT4gZG93bnN0cmVhbUZpbHRlci53cml0ZShkYXRhLCBuZXcgQ29tcGxldGlvbkhhbmRsZXI8Qnl0ZUJ1ZmZlcj4oKSB7CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbXBsZXRlZChCeXRlQnVmZmVyIHJlc3VsdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBsZXRpb25IYW5kbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uSGFuZGxlci5jb21wbGV0ZWQocmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgb25Xcml0ZUNvbXBsZXRlZCgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZhaWxlZChUaHJvd2FibGUgdGhyb3dhYmxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGxldGlvbkhhbmRsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25IYW5kbGVyLmZhaWxlZCh0aHJvd2FibGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBvbldyaXRlQ29tcGxldGVkKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgIHBlbmRpbmdXcml0ZXMub2ZmZXIocik7CisgICAgICAgICAgICAgICAgLy8gaWYgb3VyIHRhc2sgaXMgdGhlIGZpcnN0IG9uZSBpbiB0aGUgcXVldWUsIHRoZXJlIGlzIG5vIG90aGVyIHdyaXRlIHRhc2sgaW4gcHJvZ3Jlc3MgLT4gcHJvY2VzcyBpdAorICAgICAgICAgICAgICAgIGlmIChwZW5kaW5nV3JpdGVzLnBlZWsoKSA9PSByKSB7CisgICAgICAgICAgICAgICAgICAgIHIucnVuKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIG9uV3JpdGVDb21wbGV0ZWQoKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKFNzbEZpbHRlci50aGlzKSB7CisgICAgICAgICAgICAgICAgLy8gdGFzayBpbiBwcm9ncmVzcyBpcyBhdCB0aGUgaGVhZCBvZiB0aGUgcXVldWUgLT4gcmVtb3ZlIGl0CisgICAgICAgICAgICAgICAgcGVuZGluZ1dyaXRlcy5wb2xsKCk7CisgICAgICAgICAgICAgICAgUnVubmFibGUgbmV4dCA9IHBlbmRpbmdXcml0ZXMucGVlaygpOworCisgICAgICAgICAgICAgICAgaWYgKG5leHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBuZXh0LnJ1bigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChTc2xGaWx0ZXIudGhpcykgeworICAgICAgICAgICAgICAgIHJldHVybiAiV3JpdGVRdWV1ZXsiCisgICAgICAgICAgICAgICAgICAgICAgICArICJwZW5kaW5nV3JpdGVzPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgcGVuZGluZ1dyaXRlcy5zaXplKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgJ30nOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9UaHJlYWRQb29sQ29uZmlnLmphdmEgYi9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL1RocmVhZFBvb2xDb25maWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjAyMjkwCi0tLSAvZGV2L251bGwKKysrIGIvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9UaHJlYWRQb29sQ29uZmlnLmphdmEKQEAgLTAsMCArMSw0NTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamRrLmNvbm5lY3Rvci5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudXRpbC5RdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRGYWN0b3J5OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCisvKioKKyAqIENsaWVudCB0aHJlYWQgcG9vbCBjb25maWd1cmF0aW9uLCB3aGljaCBtaWdodCBiZSB1c2VkIHRvIGN1c3RvbWl6ZSBjbGllbnQgdGhyZWFkIHBvb2wuCisgKiA8cC8+CisgKiBPbmUgY2FuIGdldCBhIGRlZmF1bHQgPHR0PlRocmVhZFBvb2xDb25maWc8L3R0PiB1c2luZyB7QGxpbmsgVGhyZWFkUG9vbENvbmZpZyNkZWZhdWx0Q29uZmlnKCl9CisgKiBhbmQgY3VzdG9taXplIGl0IGFjY29yZGluZyB0byB0aGUgYXBwbGljYXRpb24gc3BlY2lmaWMgcmVxdWlyZW1lbnRzLgorICogPHAvPgorICogQSA8dHQ+VGhyZWFkUG9vbENvbmZpZzwvdHQ+IG9iamVjdCBtaWdodCBiZSBjdXN0b21pemVkIGluIGEgIkJ1aWxkZXIiLWxpa2UgZmFzaGlvbjoKKyAqIDxwcmU+CisgKiAgICAgIFRocmVhZFBvb2xDb25maWcuZGVmYXVsdENvbmZpZygpCisgKiAgICAgICAgICAgICAgIC5zZXRQb29sTmFtZSgiQXBwMVBvb2wiKQorICogICAgICAgICAgICAgICAuc2V0Q29yZVBvb2xTaXplKDUpCisgKiAgICAgICAgICAgICAgIC5zZXRNYXhQb29sU2l6ZSgxMCk7CisgKiA8L3ByZT4KKyAqCisgKiBAYXV0aG9yIE9sZWtzaXkgU3Rhc2hvaworICogQGF1dGhvciBndXN0YXYgdHJlZGUKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFRocmVhZFBvb2xDb25maWcgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQ09SRV9QT09MX1NJWkUgPSAxOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX01BWF9QT09MX1NJWkUgPSBNYXRoLm1heChSdW50aW1lLmdldFJ1bnRpbWUoKS5hdmFpbGFibGVQcm9jZXNzb3JzKCksIDUwKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9NQVhfUVVFVUVfU0laRSA9IC0xOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0lETEVfVEhSRUFEX0tFRVBfQUxJVkVfVElNRU9VVCA9IDEwOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGhyZWFkUG9vbENvbmZpZyBERUZBVUxUID0gbmV3IFRocmVhZFBvb2xDb25maWcoCisgICAgICAgICAgICAiamRrLWNvbm5lY3RvciIsIERFRkFVTFRfQ09SRV9QT09MX1NJWkUsCisgICAgICAgICAgICBERUZBVUxUX01BWF9QT09MX1NJWkUsCisgICAgICAgICAgICBudWxsLCBERUZBVUxUX01BWF9RVUVVRV9TSVpFLAorICAgICAgICAgICAgREVGQVVMVF9JRExFX1RIUkVBRF9LRUVQX0FMSVZFX1RJTUVPVVQsCisgICAgICAgICAgICBUaW1lVW5pdC5TRUNPTkRTLAorICAgICAgICAgICAgbnVsbCwgVGhyZWFkLk5PUk1fUFJJT1JJVFksIHRydWUsIG51bGwpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyBjbGllbnQgdGhyZWFkIHBvb2wgY29uZmlndXJhdGlvbiBpbnN0YW5jZS4gVGhlIHJldHVybmVkIDx0dD5UaHJlYWRQb29sQ29uZmlnPC90dD4gaW5zdGFuY2Ugd2lsbCBiZQorICAgICAqIHByZS1jb25maWd1cmVkIHdpdGggYSBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gY2xpZW50IHRocmVhZCBwb29sIGNvbmZpZ3VyYXRpb24gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBUaHJlYWRQb29sQ29uZmlnIGRlZmF1bHRDb25maWcoKSB7CisgICAgICAgIHJldHVybiBERUZBVUxULmNvcHkoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBwb29sTmFtZTsKKyAgICBwcml2YXRlIGludCBjb3JlUG9vbFNpemU7CisgICAgcHJpdmF0ZSBpbnQgbWF4UG9vbFNpemU7CisgICAgcHJpdmF0ZSBRdWV1ZTxSdW5uYWJsZT4gcXVldWU7CisgICAgcHJpdmF0ZSBpbnQgcXVldWVMaW1pdCA9IC0xOworICAgIHByaXZhdGUgbG9uZyBrZWVwQWxpdmVUaW1lTWlsbGlzOworICAgIHByaXZhdGUgVGhyZWFkRmFjdG9yeSB0aHJlYWRGYWN0b3J5OworICAgIHByaXZhdGUgaW50IHByaW9yaXR5ID0gVGhyZWFkLk1BWF9QUklPUklUWTsKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNEYWVtb247CisgICAgcHJpdmF0ZSBDbGFzc0xvYWRlciBpbml0aWFsQ2xhc3NMb2FkZXI7CisKKyAgICBwcml2YXRlIFRocmVhZFBvb2xDb25maWcoU3RyaW5nIHBvb2xOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29yZVBvb2xTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4UG9vbFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1ZXVlPFJ1bm5hYmxlPiBxdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHF1ZXVlTGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcga2VlcEFsaXZlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQgdGltZVVuaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzRGFlbW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBpbml0aWFsQ2xhc3NMb2FkZXIpIHsKKyAgICAgICAgdGhpcy5wb29sTmFtZSA9IHBvb2xOYW1lOworICAgICAgICB0aGlzLmNvcmVQb29sU2l6ZSA9IGNvcmVQb29sU2l6ZTsKKyAgICAgICAgdGhpcy5tYXhQb29sU2l6ZSA9IG1heFBvb2xTaXplOworICAgICAgICB0aGlzLnF1ZXVlID0gcXVldWU7CisgICAgICAgIHRoaXMucXVldWVMaW1pdCA9IHF1ZXVlTGltaXQ7CisgICAgICAgIGlmIChrZWVwQWxpdmVUaW1lID4gMCkgeworICAgICAgICAgICAgdGhpcy5rZWVwQWxpdmVUaW1lTWlsbGlzID0KKyAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQuTUlMTElTRUNPTkRTLmNvbnZlcnQoa2VlcEFsaXZlVGltZSwgdGltZVVuaXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAga2VlcEFsaXZlVGltZU1pbGxpcyA9IGtlZXBBbGl2ZVRpbWU7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLnRocmVhZEZhY3RvcnkgPSB0aHJlYWRGYWN0b3J5OworICAgICAgICB0aGlzLnByaW9yaXR5ID0gcHJpb3JpdHk7CisgICAgICAgIHRoaXMuaXNEYWVtb24gPSBpc0RhZW1vbjsKKyAgICAgICAgdGhpcy5pbml0aWFsQ2xhc3NMb2FkZXIgPSBpbml0aWFsQ2xhc3NMb2FkZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBUaHJlYWRQb29sQ29uZmlnKFRocmVhZFBvb2xDb25maWcgY2ZnKSB7CisgICAgICAgIHRoaXMucXVldWUgPSBjZmcucXVldWU7CisgICAgICAgIHRoaXMudGhyZWFkRmFjdG9yeSA9IGNmZy50aHJlYWRGYWN0b3J5OworICAgICAgICB0aGlzLnBvb2xOYW1lID0gY2ZnLnBvb2xOYW1lOworICAgICAgICB0aGlzLnByaW9yaXR5ID0gY2ZnLnByaW9yaXR5OworICAgICAgICB0aGlzLmlzRGFlbW9uID0gY2ZnLmlzRGFlbW9uOworICAgICAgICB0aGlzLm1heFBvb2xTaXplID0gY2ZnLm1heFBvb2xTaXplOworICAgICAgICB0aGlzLnF1ZXVlTGltaXQgPSBjZmcucXVldWVMaW1pdDsKKyAgICAgICAgdGhpcy5jb3JlUG9vbFNpemUgPSBjZmcuY29yZVBvb2xTaXplOworICAgICAgICB0aGlzLmtlZXBBbGl2ZVRpbWVNaWxsaXMgPSBjZmcua2VlcEFsaXZlVGltZU1pbGxpczsKKyAgICAgICAgdGhpcy5pbml0aWFsQ2xhc3NMb2FkZXIgPSBjZmcuaW5pdGlhbENsYXNzTG9hZGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGNvcHkgb2YgdGhpcyB0aHJlYWQgcG9vbCBjb25maWcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgY29weSBvZiB0aGlzIHRocmVhZCBwb29sIGNvbmZpZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGhyZWFkUG9vbENvbmZpZyBjb3B5KCkgeworICAgICAgICByZXR1cm4gbmV3IFRocmVhZFBvb2xDb25maWcodGhpcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgcXVldWUgdGhhdCB3aWxsIGJlIHVzZWQgdG8gdGVtcG9yYXJpbHkgc3RvcmUgdGFza3Mgd2hlbiBhbGwgdGhyZWFkcyBpbiB0aGUgdGhyZWFkIHBvb2wgYXJlIGJ1c3kuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHF1ZXVlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHRlbXBvcmFyaWx5IHN0b3JlIHRhc2tzIHdoZW4gYWxsIHRocmVhZHMgaW4gdGhlIHRocmVhZCBwb29sIGFyZSBidXN5LgorICAgICAqLworICAgIHB1YmxpYyBRdWV1ZTxSdW5uYWJsZT4gZ2V0UXVldWUoKSB7CisgICAgICAgIHJldHVybiBxdWV1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBxdWV1ZSBpbXBsZW1lbnRhdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB0byB0ZW1wb3JhcmlseSBzdG9yZSB0YXNrcyB3aGVuIGFsbCB0aHJlYWRzIGluIHRoZSB0aHJlYWQgcG9vbCBhcmUgYnVzeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBxdWV1ZSBxdWV1ZSBpbXBsZW1lbnRhdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB0byB0ZW1wb3JhcmlseSBzdG9yZSB0YXNrcyB3aGVuIGFsbCB0aHJlYWRzIGluIHRoZSB0aHJlYWQgcG9vbCBhcmUKKyAgICAgKiAgICAgICAgICAgICAgYnVzeS4KKyAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgVGhyZWFkUG9vbENvbmZpZ30gd2l0aCB0aGUgbmV3IHtAbGluayBRdWV1ZX0gaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIFRocmVhZFBvb2xDb25maWcgc2V0UXVldWUoUXVldWU8UnVubmFibGU+IHF1ZXVlKSB7CisgICAgICAgIHRoaXMucXVldWUgPSBxdWV1ZTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHtAbGluayBUaHJlYWRGYWN0b3J5fSB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhyZWFkIHBvb2wgdGhyZWFkcy4KKyAgICAgKiA8cC8+CisgICAgICogSWYge0BsaW5rIFRocmVhZEZhY3Rvcnl9IGlzIHNldCwgdGhlbiB7QGxpbmsgI3ByaW9yaXR5fSwge0BsaW5rICNpc0RhZW1vbn0sCisgICAgICoge0BsaW5rICNwb29sTmFtZX0gc2V0dGluZ3Mgd2lsbCBub3QgYmUgY29uc2lkZXJlZCB3aGVuIGNyZWF0aW5nIG5ldyB0aHJlYWRzLgorICAgICAqCisgICAgICogQHJldHVybiB7QGxpbmsgVGhyZWFkRmFjdG9yeX0gdGhhdCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlIHRocmVhZCBwb29sIHRocmVhZHMuCisgICAgICovCisgICAgcHVibGljIFRocmVhZEZhY3RvcnkgZ2V0VGhyZWFkRmFjdG9yeSgpIHsKKyAgICAgICAgcmV0dXJuIHRocmVhZEZhY3Rvcnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHtAbGluayBUaHJlYWRGYWN0b3J5fSB0aGF0IHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhyZWFkIHBvb2wgdGhyZWFkcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aHJlYWRGYWN0b3J5IGN1c3RvbSB7QGxpbmsgVGhyZWFkRmFjdG9yeX0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBJZiB7QGxpbmsgVGhyZWFkRmFjdG9yeX0gaXMgc2V0LCB0aGVuIHtAbGluayAjcHJpb3JpdHl9LCB7QGxpbmsgI2lzRGFlbW9ufSwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB7QGxpbmsgI3Bvb2xOYW1lfSBzZXR0aW5ncyB3aWxsIG5vdCBiZSBjb25zaWRlcmVkIHdoZW4gY3JlYXRpbmcgbmV3IHRocmVhZHMuCisgICAgICogQHJldHVybiB0aGUge0BsaW5rIFRocmVhZFBvb2xDb25maWd9IHdpdGggdGhlIG5ldyB7QGxpbmsgVGhyZWFkRmFjdG9yeX0KKyAgICAgKi8KKyAgICBwdWJsaWMgVGhyZWFkUG9vbENvbmZpZyBzZXRUaHJlYWRGYWN0b3J5KFRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeSkgeworICAgICAgICB0aGlzLnRocmVhZEZhY3RvcnkgPSB0aHJlYWRGYWN0b3J5OworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhyZWFkIHBvb2wgbmFtZS4gVGhlIGRlZmF1bHQgaXMgIlR5cnVzLWNsaWVudCIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSB0aHJlYWQgcG9vbCBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UG9vbE5hbWUoKSB7CisgICAgICAgIHJldHVybiBwb29sTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhyZWFkIHBvb2wgbmFtZS4gVGhlIGRlZmF1bHQgaXMgIlR5cnVzLWNsaWVudCIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcG9vbE5hbWUgdGhlIHRocmVhZCBwb29sIG5hbWUuCisgICAgICogQHJldHVybiB0aGUge0BsaW5rIFRocmVhZFBvb2xDb25maWd9IHdpdGggdGhlIG5ldyB0aHJlYWQgcG9vbCBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBUaHJlYWRQb29sQ29uZmlnIHNldFBvb2xOYW1lKFN0cmluZyBwb29sTmFtZSkgeworICAgICAgICB0aGlzLnBvb2xOYW1lID0gcG9vbE5hbWU7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBwcmlvcml0eSBvZiB0aGUgdGhyZWFkcyBpbiB0aHJlYWQgcG9vbC4gVGhlIGRlZmF1bHQgaXMge0BsaW5rIFRocmVhZCNOT1JNX1BSSU9SSVRZfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gcHJpb3JpdHkgb2YgdGhlIHRocmVhZHMgaW4gdGhyZWFkIHBvb2wuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRQcmlvcml0eSgpIHsKKyAgICAgICAgcmV0dXJuIHByaW9yaXR5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBwcmlvcml0eSBvZiB0aGUgdGhyZWFkcyBpbiB0aHJlYWQgcG9vbC4gVGhlIGRlZmF1bHQgaXMge0BsaW5rIFRocmVhZCNOT1JNX1BSSU9SSVRZfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcmlvcml0eSBvZiB0aGUgdGhyZWFkcyBpbiB0aHJlYWQgcG9vbC4KKyAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgVGhyZWFkUG9vbENvbmZpZ30gd2l0aCB0aGUgbmV3IHRocmVhZCBwcmlvcml0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGhyZWFkUG9vbENvbmZpZyBzZXRQcmlvcml0eShpbnQgcHJpb3JpdHkpIHsKKyAgICAgICAgdGhpcy5wcmlvcml0eSA9IHByaW9yaXR5OworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRocmVhZCBwb29sIHRocmVhZHMgYXJlIGRhZW1vbnMuIFRoZSBkZWZhdWx0IGlzIHtAY29kZSB0cnVlfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRocmVhZCBwb29sIHRocmVhZHMgYXJlIGRhZW1vbnMuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNEYWVtb24oKSB7CisgICAgICAgIHJldHVybiBpc0RhZW1vbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQge0Bjb2RlIHRydWV9IGlmIHRocmVhZCBwb29sIHRocmVhZHMgYXJlIGRhZW1vbnMuIFRoZSBkZWZhdWx0IGlzIHtAY29kZSB0cnVlfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpc0RhZW1vbiB7QGNvZGUgdHJ1ZX0gaWYgdGhyZWFkIHBvb2wgdGhyZWFkcyBhcmUgZGFlbW9ucy4KKyAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgVGhyZWFkUG9vbENvbmZpZ30gd2l0aCB0aGUgZGFlbW9uIHByb3BlcnR5IHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGhyZWFkUG9vbENvbmZpZyBzZXREYWVtb24oYm9vbGVhbiBpc0RhZW1vbikgeworICAgICAgICB0aGlzLmlzRGFlbW9uID0gaXNEYWVtb247CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBtYXggdGhyZWFkIHBvb2wgc2l6ZS4gVGhlIGRlZmF1bHQgaXMge0Bjb2RlIE1hdGgubWF4KFJ1bnRpbWUuZ2V0UnVudGltZSgpLmF2YWlsYWJsZVByb2Nlc3NvcnMoKSwgMjApfQorICAgICAqCisgICAgICogQHJldHVybiBtYXggdGhyZWFkIHBvb2wgc2l6ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE1heFBvb2xTaXplKCkgeworICAgICAgICByZXR1cm4gbWF4UG9vbFNpemU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IG1heCB0aHJlYWQgcG9vbCBzaXplLiBUaGUgZGVmYXVsdCBpcyBUaGUgZGVmYXVsdCBpcyB7QGNvZGUgTWF0aC5tYXgoUnVudGltZS5nZXRSdW50aW1lKCkuYXZhaWxhYmxlUHJvY2Vzc29ycygpLCAyMCl9LgorICAgICAqIDxwLz4KKyAgICAgKiBDYW5ub3QgYmUgc21hbGxlciB0aGFuIDMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWF4UG9vbFNpemUgdGhlIG1heCB0aHJlYWQgcG9vbCBzaXplLgorICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBUaHJlYWRQb29sQ29uZmlnfSB3aXRoIHRoZSBuZXcgbWF4IHBvb2wgc2l6ZSBzZXQuCisgICAgICovCisgICAgcHVibGljIFRocmVhZFBvb2xDb25maWcgc2V0TWF4UG9vbFNpemUoaW50IG1heFBvb2xTaXplKSB7CisgICAgICAgIGlmIChtYXhQb29sU2l6ZSA8IDMpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuVEhSRUFEX1BPT0xfTUFYX1NJWkVfVE9PX1NNQUxMKCkpOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5tYXhQb29sU2l6ZSA9IG1heFBvb2xTaXplOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNvcmUgdGhyZWFkIHBvb2wgc2l6ZSAtIHRoZSBzaXplIG9mIHRoZSB0aHJlYWQgcG9vbCB3aWxsIG5ldmVyIGJlZSBzbWFsbGVyIHRoYW4gdGhpcy4KKyAgICAgKiA8cC8+CisgICAgICogVGhlIGRlZmF1bHQgaXMgMS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGNvcmUgdGhyZWFkIHBvb2wgc2l6ZSAtIHRoZSBzaXplIG9mIHRoZSB0aHJlYWQgcG9vbCB3aWxsIG5ldmVyIGJlZSBzbWFsbGVyIHRoYW4gdGhpcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldENvcmVQb29sU2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIGNvcmVQb29sU2l6ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvcmUgdGhyZWFkIHBvb2wgc2l6ZSAtIHRoZSBzaXplIG9mIHRoZSB0aHJlYWQgcG9vbCB3aWxsIG5ldmVyIGJlZSBzbWFsbGVyIHRoYW4gdGhpcy4KKyAgICAgKiA8cC8+CisgICAgICogVGhlIGRlZmF1bHQgaXMgMS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb3JlUG9vbFNpemUgdGhlIGNvcmUgdGhyZWFkIHBvb2wgc2l6ZSAtIHRoZSBzaXplIG9mIHRoZSB0aHJlYWQgcG9vbCB3aWxsIG5ldmVyIGJlZSBzbWFsbGVyIHRoYW4gdGhpcy4KKyAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgVGhyZWFkUG9vbENvbmZpZ30gd2l0aCB0aGUgbmV3IGNvcmUgcG9vbCBzaXplIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGhyZWFkUG9vbENvbmZpZyBzZXRDb3JlUG9vbFNpemUoaW50IGNvcmVQb29sU2l6ZSkgeworICAgICAgICBpZiAoY29yZVBvb2xTaXplIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5USFJFQURfUE9PTF9DT1JFX1NJWkVfVE9PX1NNQUxMKCkpOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5jb3JlUG9vbFNpemUgPSBjb3JlUG9vbFNpemU7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbGltaXQgb2YgdGhlIHF1ZXVlLCB3aGVyZSB0YXNrcyBhcmUgdGVtcG9yYXJpbHkgc3RvcmVkIHdoZW4gYWxsIHRocmVhZHMgYXJlIGJ1c3kuCisgICAgICogPHAvPgorICAgICAqIFZhbHVlIGxlc3MgdGhhbiAwIG1lYW5zIHVubGltaXRlZCBxdWV1ZS4gVGhlIGRlZmF1bHQgaXMgLTEuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSB0aHJlYWQtcG9vbCBxdWV1ZSBsaW1pdC4gVGhlIHF1ZXVlIGxpbWl0CisgICAgICovCisgICAgcHVibGljIGludCBnZXRRdWV1ZUxpbWl0KCkgeworICAgICAgICByZXR1cm4gcXVldWVMaW1pdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGxpbWl0IG9mIHRoZSBxdWV1ZSwgd2hlcmUgdGFza3MgYXJlIHRlbXBvcmFyaWx5IHN0b3JlZCB3aGVuIGFsbCB0aHJlYWRzIGFyZSBidXN5LgorICAgICAqIDxwLz4KKyAgICAgKiBWYWx1ZSBsZXNzIHRoYW4gMCBtZWFucyB1bmxpbWl0ZWQgcXVldWUuIFRoZSBkZWZhdWx0IGlzIC0xLgorICAgICAqCisgICAgICogQHBhcmFtIHF1ZXVlTGltaXQgdGhlIHRocmVhZCBwb29sIHF1ZXVlIGxpbWl0LiBUaGUgPHR0PnF1ZXVlTGltaXQ8L3R0PiB2YWx1ZSBsZXNzIHRoYW4gMCBtZWFucyB1bmxpbWl0ZWQgcXVldWUuCisgICAgICogQHJldHVybiB0aGUge0BsaW5rIFRocmVhZFBvb2xDb25maWd9IHdpdGggdGhlIG5ldyBxdWV1ZSBsaW1pdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGhyZWFkUG9vbENvbmZpZyBzZXRRdWV1ZUxpbWl0KGludCBxdWV1ZUxpbWl0KSB7CisgICAgICAgIGlmIChxdWV1ZUxpbWl0IDwgMCkgeworICAgICAgICAgICAgdGhpcy5xdWV1ZUxpbWl0ID0gLTE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLnF1ZXVlTGltaXQgPSBxdWV1ZUxpbWl0OworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBtYXggcGVyaW9kIG9mIHRpbWUgYSB0aHJlYWQgd2lsbCB3YWl0IGZvciBhIG5ldyB0YXNrIHRvIHByb2Nlc3MuCisgICAgICogPHAvPgorICAgICAqIElmIHRoZSB0aW1lb3V0IGV4cGlyZXMgYW5kIHRoZSB0aHJlYWQgaXMgbm90IGEgY29yZSBvbmUgKHNlZSB7QGxpbmsgI3NldENvcmVQb29sU2l6ZShpbnQpfSwge0BsaW5rICNzZXRNYXhQb29sU2l6ZShpbnQpfSkKKyAgICAgKiAtIHRoZW4gdGhlIHRocmVhZCB3aWxsIGJlIHRlcm1pbmF0ZWQgYW5kIHJlbW92ZWQgZnJvbSB0aGUgdGhyZWFkIHBvb2wuCisgICAgICogPHAvPgorICAgICAqIFRoZSBkZWZhdWx0IGlzIDEwcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aW1lIG1heCBrZWVwIGFsaXZlIHRpbWVvdXQuIFRoZSB2YWx1ZSBsZXNzIHRoYW4gMCBtZWFucyBubyB0aW1lb3V0LgorICAgICAqIEBwYXJhbSB1bml0IHRpbWUgdW5pdC4KKyAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgVGhyZWFkUG9vbENvbmZpZ30gd2l0aCB0aGUgbmV3IGtlZXAgYWxpdmUgdGltZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGhyZWFkUG9vbENvbmZpZyBzZXRLZWVwQWxpdmVUaW1lKGxvbmcgdGltZSwgVGltZVVuaXQgdW5pdCkgeworICAgICAgICBpZiAodGltZSA8IDApIHsKKyAgICAgICAgICAgIGtlZXBBbGl2ZVRpbWVNaWxsaXMgPSAtMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGtlZXBBbGl2ZVRpbWVNaWxsaXMgPSBUaW1lVW5pdC5NSUxMSVNFQ09ORFMuY29udmVydCh0aW1lLCB1bml0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG1heCBwZXJpb2Qgb2YgdGltZSBhIHRocmVhZCB3aWxsIHdhaXQgZm9yIGEgbmV3IHRhc2sgdG8gcHJvY2Vzcy4KKyAgICAgKiA8cC8+CisgICAgICogSWYgdGhlIHRpbWVvdXQgZXhwaXJlcyBhbmQgdGhlIHRocmVhZCBpcyBub3QgYSBjb3JlIG9uZSAoc2VlIHtAbGluayAjc2V0Q29yZVBvb2xTaXplKGludCl9LCB7QGxpbmsgI3NldE1heFBvb2xTaXplKGludCl9KQorICAgICAqIC0gdGhlbiB0aGUgdGhyZWFkIHdpbGwgYmUgdGVybWluYXRlZCBhbmQgcmVtb3ZlZCBmcm9tIHRoZSB0aHJlYWQgcG9vbC4KKyAgICAgKiA8cC8+CisgICAgICogVGhlIGRlZmF1bHQgaXMgMTBzLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUga2VlcC1hbGl2ZSB0aW1lb3V0LCB0aGUgdmFsdWUgbGVzcyB0aGFuIDAgbWVhbnMgbm8gdGltZW91dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRLZWVwQWxpdmVUaW1lKFRpbWVVbml0IHRpbWVVbml0KSB7CisgICAgICAgIGlmIChrZWVwQWxpdmVUaW1lTWlsbGlzID09IC0xKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdGltZVVuaXQuY29udmVydChrZWVwQWxpdmVUaW1lTWlsbGlzLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY2xhc3MgbG9hZGVyIChpZiBhbnkpIHRvIGJlIGluaXRpYWxseSBleHBvc2VkIGJ5IHRocmVhZHMgZnJvbSB0aGlzIHBvb2wuCisgICAgICogPHAvPgorICAgICAqIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBjbGFzcyBsb2FkZXIgb2YgdGhlIHBhcmVudCB0aHJlYWQgdGhhdCBpbml0aWFsaXplZCB0aGUgcG9vbCB3aWxsIGJlIHVzZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjbGFzcyBsb2FkZXIgKGlmIGFueSkgdG8gYmUgaW5pdGlhbGx5IGV4cG9zZWQgYnkgdGhyZWFkcyBmcm9tIHRoaXMgcG9vbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgZ2V0SW5pdGlhbENsYXNzTG9hZGVyKCkgeworICAgICAgICByZXR1cm4gaW5pdGlhbENsYXNzTG9hZGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB0aGUgY29udGV4dCBjbGFzcyBsb2FkZXIgdGhhdCB3aWxsIGJlIHVzZWQgYnkgdGhyZWFkcyBpbiB0aGlzIHBvb2wuCisgICAgICogPHAvPgorICAgICAqIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBjbGFzcyBsb2FkZXIgb2YgdGhlIHBhcmVudCB0aHJlYWQgdGhhdCBpbml0aWFsaXplZCB0aGUgcG9vbCB3aWxsIGJlIHVzZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5pdGlhbENsYXNzTG9hZGVyIHRoZSBjbGFzcyBsb2FkZXIgdG8gYmUgZXhwb3NlZCBieSB0aHJlYWRzIG9mIHRoaXMgcG9vbC4KKyAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgVGhyZWFkUG9vbENvbmZpZ30gd2l0aCB0aGUgY2xhc3MgbG9hZGVyIHNldC4KKyAgICAgKiBAc2VlIFRocmVhZCNnZXRDb250ZXh0Q2xhc3NMb2FkZXIoKQorICAgICAqLworICAgIHB1YmxpYyBUaHJlYWRQb29sQ29uZmlnIHNldEluaXRpYWxDbGFzc0xvYWRlcihmaW5hbCBDbGFzc0xvYWRlciBpbml0aWFsQ2xhc3NMb2FkZXIpIHsKKyAgICAgICAgdGhpcy5pbml0aWFsQ2xhc3NMb2FkZXIgPSBpbml0aWFsQ2xhc3NMb2FkZXI7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBUaHJlYWRQb29sQ29uZmlnLmNsYXNzLmdldFNpbXBsZU5hbWUoKSArICIgOlxyXG4iCisgICAgICAgICAgICAgICAgKyAiICBwb29sTmFtZTogIiArIHBvb2xOYW1lICsgIlxyXG4iCisgICAgICAgICAgICAgICAgKyAiICBjb3JlUG9vbFNpemU6ICIgKyBjb3JlUG9vbFNpemUgKyAiXHJcbiIKKyAgICAgICAgICAgICAgICArICIgIG1heFBvb2xTaXplOiAiICsgbWF4UG9vbFNpemUgKyAiXHJcbiIKKyAgICAgICAgICAgICAgICArICIgIHF1ZXVlOiAiICsgKHF1ZXVlICE9IG51bGwgPyBxdWV1ZS5nZXRDbGFzcygpIDogInVuZGVmaW5lZCIpICsgIlxyXG4iCisgICAgICAgICAgICAgICAgKyAiICBxdWV1ZUxpbWl0OiAiICsgcXVldWVMaW1pdCArICJcclxuIgorICAgICAgICAgICAgICAgICsgIiAga2VlcEFsaXZlVGltZSAobWlsbGlzKTogIiArIGtlZXBBbGl2ZVRpbWVNaWxsaXMgKyAiXHJcbiIKKyAgICAgICAgICAgICAgICArICIgIHRocmVhZEZhY3Rvcnk6ICIgKyB0aHJlYWRGYWN0b3J5ICsgIlxyXG4iCisgICAgICAgICAgICAgICAgKyAiICBwcmlvcml0eTogIiArIHByaW9yaXR5ICsgIlxyXG4iCisgICAgICAgICAgICAgICAgKyAiICBpc0RhZW1vbjogIiArIGlzRGFlbW9uICsgIlxyXG4iCisgICAgICAgICAgICAgICAgKyAiICBpbml0aWFsQ2xhc3NMb2FkZXI6ICIgKyBpbml0aWFsQ2xhc3NMb2FkZXI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmICh0aGlzID09IG8pIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgVGhyZWFkUG9vbENvbmZpZyB0aGF0ID0gKFRocmVhZFBvb2xDb25maWcpIG87CisKKyAgICAgICAgaWYgKGNvcmVQb29sU2l6ZSAhPSB0aGF0LmNvcmVQb29sU2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChpc0RhZW1vbiAhPSB0aGF0LmlzRGFlbW9uKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGtlZXBBbGl2ZVRpbWVNaWxsaXMgIT0gdGhhdC5rZWVwQWxpdmVUaW1lTWlsbGlzKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1heFBvb2xTaXplICE9IHRoYXQubWF4UG9vbFNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJpb3JpdHkgIT0gdGhhdC5wcmlvcml0eSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChxdWV1ZUxpbWl0ICE9IHRoYXQucXVldWVMaW1pdCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChpbml0aWFsQ2xhc3NMb2FkZXIgIT0gbnVsbCA/ICFpbml0aWFsQ2xhc3NMb2FkZXIuZXF1YWxzKHRoYXQuaW5pdGlhbENsYXNzTG9hZGVyKSA6IHRoYXQuaW5pdGlhbENsYXNzTG9hZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocG9vbE5hbWUgIT0gbnVsbCA/ICFwb29sTmFtZS5lcXVhbHModGhhdC5wb29sTmFtZSkgOiB0aGF0LnBvb2xOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocXVldWUgIT0gbnVsbCA/ICFxdWV1ZS5lcXVhbHModGhhdC5xdWV1ZSkgOiB0aGF0LnF1ZXVlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhyZWFkRmFjdG9yeSAhPSBudWxsID8gIXRocmVhZEZhY3RvcnkuZXF1YWxzKHRoYXQudGhyZWFkRmFjdG9yeSkgOiB0aGF0LnRocmVhZEZhY3RvcnkgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCByZXN1bHQgPSBwb29sTmFtZSAhPSBudWxsID8gcG9vbE5hbWUuaGFzaENvZGUoKSA6IDA7CisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgY29yZVBvb2xTaXplOworICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIG1heFBvb2xTaXplOworICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIChxdWV1ZSAhPSBudWxsID8gcXVldWUuaGFzaENvZGUoKSA6IDApOworICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIHF1ZXVlTGltaXQ7CisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgKGludCkgKGtlZXBBbGl2ZVRpbWVNaWxsaXMgXiAoa2VlcEFsaXZlVGltZU1pbGxpcyA+Pj4gMzIpKTsKKyAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyAodGhyZWFkRmFjdG9yeSAhPSBudWxsID8gdGhyZWFkRmFjdG9yeS5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgcHJpb3JpdHk7CisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgKGlzRGFlbW9uID8gMSA6IDApOworICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIChpbml0aWFsQ2xhc3NMb2FkZXIgIT0gbnVsbCA/IGluaXRpYWxDbGFzc0xvYWRlci5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9UcmFuc2ZlckVuY29kaW5nUGFyc2VyLmphdmEgYi9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL1RyYW5zZmVyRW5jb2RpbmdQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjdiNDgyCi0tLSAvZGV2L251bGwKKysrIGIvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9UcmFuc2ZlckVuY29kaW5nUGFyc2VyLmphdmEKQEAgLTAsMCArMSwyOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamRrLmNvbm5lY3Rvci5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamRrLmNvbm5lY3Rvci5pbnRlcm5hbC5IdHRwUGFyc2VyVXRpbHMuc2tpcFNwYWNlczsKK2ltcG9ydCBzdGF0aWMgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamRrLmNvbm5lY3Rvci5pbnRlcm5hbC5IdHRwUGFyc2VyVXRpbHMuaXNTcGFjZU9yVGFiOworCisKKy8qKgorICogQGF1dGhvciBBbGV4ZXkgU3Rhc2hvaworICogQGF1dGhvciBQZXRyIEphbm91Y2ggKHBldHIuamFub3VjaCBhdCBvcmFjbGUuY29tKQorICovCithYnN0cmFjdCBjbGFzcyBUcmFuc2ZlckVuY29kaW5nUGFyc2VyIHsKKworICAgIGFic3RyYWN0IGJvb2xlYW4gcGFyc2UoQnl0ZUJ1ZmZlciBpbnB1dCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uOworCisgICAgc3RhdGljIFRyYW5zZmVyRW5jb2RpbmdQYXJzZXIgY3JlYXRlRml4ZWRMZW5ndGhQYXJzZXIoQXN5bmNocm9ub3VzQm9keUlucHV0U3RyZWFtIHJlc3BvbnNlQm9keSwgaW50IGV4cGVjdGVkTGVuZ3RoKSB7CisgICAgICAgIHJldHVybiBuZXcgRml4ZWRMZW5ndGhFbmNvZGluZ1BhcnNlcihyZXNwb25zZUJvZHksIGV4cGVjdGVkTGVuZ3RoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgVHJhbnNmZXJFbmNvZGluZ1BhcnNlciBjcmVhdGVDaHVua1BhcnNlcihBc3luY2hyb25vdXNCb2R5SW5wdXRTdHJlYW0gcmVzcG9uc2VCb2R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEh0dHBQYXJzZXIgaHR0cFBhcnNlciwgaW50IG1heEhlYWRlcnNTaXplKSB7CisgICAgICAgIHJldHVybiBuZXcgQ2h1bmtlZEVuY29kaW5nUGFyc2VyKHJlc3BvbnNlQm9keSwgaHR0cFBhcnNlciwgbWF4SGVhZGVyc1NpemUpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEZpeGVkTGVuZ3RoRW5jb2RpbmdQYXJzZXIgZXh0ZW5kcyBUcmFuc2ZlckVuY29kaW5nUGFyc2VyIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBleHBlY3RlZExlbmd0aDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBc3luY2hyb25vdXNCb2R5SW5wdXRTdHJlYW0gcmVzcG9uc2VCb2R5OworICAgICAgICBwcml2YXRlIHZvbGF0aWxlIGludCBjb25zdW1lZExlbmd0aCA9IDA7CisKKyAgICAgICAgRml4ZWRMZW5ndGhFbmNvZGluZ1BhcnNlcihBc3luY2hyb25vdXNCb2R5SW5wdXRTdHJlYW0gcmVzcG9uc2VCb2R5LCBpbnQgZXhwZWN0ZWRMZW5ndGgpIHsKKyAgICAgICAgICAgIHRoaXMuZXhwZWN0ZWRMZW5ndGggPSBleHBlY3RlZExlbmd0aDsKKyAgICAgICAgICAgIHRoaXMucmVzcG9uc2VCb2R5ID0gcmVzcG9uc2VCb2R5OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIGJvb2xlYW4gcGFyc2UoQnl0ZUJ1ZmZlciBpbnB1dCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChpbnB1dC5yZW1haW5pbmcoKSArIGNvbnN1bWVkTGVuZ3RoID4gZXhwZWN0ZWRMZW5ndGgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuSFRUUF9CT0RZX1NJWkVfT1ZFUkZMT1coKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbaW5wdXQucmVtYWluaW5nKCldOworICAgICAgICAgICAgaW5wdXQuZ2V0KGRhdGEpOworICAgICAgICAgICAgQnl0ZUJ1ZmZlciBwYXJzZWQgPSBCeXRlQnVmZmVyLndyYXAoZGF0YSk7CisgICAgICAgICAgICByZXNwb25zZUJvZHkubm90aWZ5RGF0YUF2YWlsYWJsZShwYXJzZWQpOworICAgICAgICAgICAgY29uc3VtZWRMZW5ndGggKz0gZGF0YS5sZW5ndGg7CisKKyAgICAgICAgICAgIHJldHVybiBjb25zdW1lZExlbmd0aCA9PSBleHBlY3RlZExlbmd0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENodW5rZWRFbmNvZGluZ1BhcnNlciBleHRlbmRzIFRyYW5zZmVyRW5jb2RpbmdQYXJzZXIgeworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfSFRUUF9DSFVOS19TSVpFX0xFTkdUSCA9IDE2OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIENIVU5LX1NJWkVfT1ZFUkZMT1cgPSBMb25nLk1BWF9WQUxVRSA+PiA0OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDSFVOS19MRU5HVEhfUEFSU0VEX1NUQVRFID0gMzsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBERUMgPSB7CisgICAgICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAgICAgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsCisgICAgICAgICAgICAgICAgMDAsIDAxLCAwMiwgMDMsIDA0LCAwNSwgMDYsIDA3LCA4LCA5LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgICAgIC0xLCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgICAgIC0xLCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1LCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICAgICAgICAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLAorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgZmluYWwgSHR0cFBhcnNlclV0aWxzLkNvbnRlbnRQYXJzaW5nU3RhdGUgY29udGVudFBhcnNpbmdTdGF0ZSA9IG5ldyBIdHRwUGFyc2VyVXRpbHMKKyAgICAgICAgICAgICAgICAuQ29udGVudFBhcnNpbmdTdGF0ZSgpOworICAgICAgICBwcml2YXRlIGZpbmFsIEh0dHBQYXJzZXJVdGlscy5IZWFkZXJQYXJzaW5nU3RhdGUgaGVhZGVyUGFyc2luZ1N0YXRlOworICAgICAgICBwcml2YXRlIGZpbmFsIEFzeW5jaHJvbm91c0JvZHlJbnB1dFN0cmVhbSByZXNwb25zZUJvZHk7CisgICAgICAgIHByaXZhdGUgZmluYWwgSHR0cFBhcnNlciBodHRwUGFyc2VyOworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtYXhIZWFkZXJzU2l6ZTsKKworICAgICAgICBDaHVua2VkRW5jb2RpbmdQYXJzZXIoQXN5bmNocm9ub3VzQm9keUlucHV0U3RyZWFtIHJlc3BvbnNlQm9keSwgSHR0cFBhcnNlciBodHRwUGFyc2VyLCBpbnQgbWF4SGVhZGVyc1NpemUpIHsKKyAgICAgICAgICAgIHRoaXMucmVzcG9uc2VCb2R5ID0gcmVzcG9uc2VCb2R5OworICAgICAgICAgICAgdGhpcy5odHRwUGFyc2VyID0gaHR0cFBhcnNlcjsKKyAgICAgICAgICAgIHRoaXMuaGVhZGVyUGFyc2luZ1N0YXRlID0gaHR0cFBhcnNlci5nZXRIZWFkZXJQYXJzaW5nU3RhdGUoKTsKKyAgICAgICAgICAgIHRoaXMubWF4SGVhZGVyc1NpemUgPSBtYXhIZWFkZXJzU2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRha2VuIHdpdGggc21hbGwgbW9kaWZpY2F0aW9ucyBmcm9tIEdyaXp6bHkgQ2h1bmtlZFRyYW5zZmVyRW5jb2RpbmcucGFyc2VQYWNrZXQKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIGJvb2xlYW4gcGFyc2UoQnl0ZUJ1ZmZlciBpbnB1dCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgd2hpbGUgKGlucHV0Lmhhc1JlbWFpbmluZygpKSB7CisKKyAgICAgICAgICAgICAgICBib29sZWFuIGlzTGFzdENodW5rID0gY29udGVudFBhcnNpbmdTdGF0ZS5pc0xhc3RDaHVuazsKKyAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiBIVFRQIGNodW5rIGxlbmd0aCB3YXMgcGFyc2VkCisgICAgICAgICAgICAgICAgaWYgKCFpc0xhc3RDaHVuayAmJiBjb250ZW50UGFyc2luZ1N0YXRlLmNodW5rUmVtYWluZGVyIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZVRyYWlsZXJDUkxGKGlucHV0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZUh0dHBDaHVua0xlbmd0aChpbnB1dCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vdCBhIEhFQUQgcmVxdWVzdCBhbmQgd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggZGF0YSB0bworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyc2UgY2h1bmsgbGVuZ3RoIC0gc2h1dGRvd25Ob3cgZXhlY3V0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBIVFRQIGNvbnRlbnQgc3RhcnRzIGZyb20gcG9zaXRpb24gMCBpbiB0aGUgaW5wdXQgQnVmZmVyIChIVFRQIGNodW5rIGhlYWRlciBpcyBub3QgcGFydCBvZiB0aGUgaW5wdXQgQnVmZmVyKQorICAgICAgICAgICAgICAgICAgICAvL2NvbnRlbnRQYXJzaW5nU3RhdGUuY2h1bmtDb250ZW50U3RhcnQgPSAwOworICAgICAgICAgICAgICAgICAgICBjb250ZW50UGFyc2luZ1N0YXRlLmNodW5rQ29udGVudFN0YXJ0ID0gaW5wdXQucG9zaXRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIHBvc2l0aW9uIGluIHRoZSBpbnB1dCBCdWZmZXIsIHdoZXJlIGFjdHVhbCBIVFRQIGNvbnRlbnQgc3RhcnRzCisgICAgICAgICAgICAgICAgaW50IGNodW5rQ29udGVudFN0YXJ0ID0gY29udGVudFBhcnNpbmdTdGF0ZS5jaHVua0NvbnRlbnRTdGFydDsKKworICAgICAgICAgICAgICAgIGlmIChjb250ZW50UGFyc2luZ1N0YXRlLmNodW5rTGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgaXQncyB0aGUgbGFzdCBIVFRQIGNodW5rCisgICAgICAgICAgICAgICAgICAgIGlmICghaXNMYXN0Q2h1bmspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBpdCdzIHRoZSBsYXN0IGNodW5rCisgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50UGFyc2luZ1N0YXRlLmlzTGFzdENodW5rID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzTGFzdENodW5rID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0IHRyYWlsZXIgcGFyc2luZworICAgICAgICAgICAgICAgICAgICAgICAgaW5pdFRyYWlsZXJQYXJzaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0cmFpbGVyIGlzIHByZXNlbnQKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZUxhc3RDaHVua1RyYWlsZXIoaW5wdXQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB5ZXMgLSBhbmQgdGhlcmUgaXMgbm90IGVub3VnaCBpbnB1dCBkYXRhIC0gc2h1dGRvd25Ob3cgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBmaWx0ZXJjaGFpbiBwcm9jZXNzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIHRoZSBjb250ZW50IHN0YXJ0IHBvc2l0aW9uIGFmdGVyIHRyYWlsZXIgcGFyc2luZworICAgICAgICAgICAgICAgICAgICBjaHVua0NvbnRlbnRTdGFydCA9IGhlYWRlclBhcnNpbmdTdGF0ZS5vZmZzZXQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGlzTGFzdENodW5rKSB7CisgICAgICAgICAgICAgICAgICAgIGlucHV0LnBvc2l0aW9uKGNodW5rQ29udGVudFN0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVtYWluaW5nIGluIHRoZSBjdXJyZW50IGNodW5rCisgICAgICAgICAgICAgICAgZmluYWwgbG9uZyB0aGlzUGFja2V0UmVtYWluaW5nID0gY29udGVudFBhcnNpbmdTdGF0ZS5jaHVua1JlbWFpbmRlcjsKKyAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIG51bWJlciBvZiBjb250ZW50IGJ5dGVzIGF2YWlsYWJsZSBpbiB0aGUgY3VycmVudCBpbnB1dCBCdWZmZXIKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY29udGVudEF2YWlsYWJsZSA9IGlucHV0LmxpbWl0KCkgLSBjaHVua0NvbnRlbnRTdGFydDsKKworICAgICAgICAgICAgICAgIGlucHV0LnBvc2l0aW9uKGNodW5rQ29udGVudFN0YXJ0KTsKKyAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGRhdGE7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnRBdmFpbGFibGUgPiB0aGlzUGFja2V0UmVtYWluaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIElmIGlucHV0IEJ1ZmZlciBoYXMgcGFydCBvZiB0aGUgbmV4dCBtZXNzYWdlIC0gc2xpY2UgaXQKKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IFV0aWxzLnNwbGl0KGlucHV0LCAoaW50KSAoY2h1bmtDb250ZW50U3RhcnQgKyB0aGlzUGFja2V0UmVtYWluaW5nKSk7CisKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkYXRhID0gVXRpbHMuc3BsaXQoaW5wdXQsIGNodW5rQ29udGVudFN0YXJ0ICsgaW5wdXQucmVtYWluaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNvbnRlbnRQYXJzaW5nU3RhdGUuY2h1bmtSZW1haW5kZXIgLT0gZGF0YS5yZW1haW5pbmcoKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZUJvZHkubm90aWZ5RGF0YUF2YWlsYWJsZShkYXRhKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGFrZW4gd2l0aCBzbWFsbCBtb2RpZmljYXRpb25zIGZyb20gR3JpenpseSBDaHVua2VkVHJhbnNmZXJFbmNvZGluZy5wYXJzZUh0dHBDaHVua0xlbmd0aAorICAgICAgICBwcml2YXRlIGJvb2xlYW4gcGFyc2VIdHRwQ2h1bmtMZW5ndGgoZmluYWwgQnl0ZUJ1ZmZlciBpbnB1dCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChoZWFkZXJQYXJzaW5nU3RhdGUuc3RhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiB7Ly8gSW5pdGlhbGl6ZSBjaHVuayBwYXJzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcG9zID0gaW5wdXQucG9zaXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlclBhcnNpbmdTdGF0ZS5zdGFydCA9IHBvczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlclBhcnNpbmdTdGF0ZS5vZmZzZXQgPSBwb3M7CisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJQYXJzaW5nU3RhdGUucGFja2V0TGltaXQgPSBwb3MgKyBNQVhfSFRUUF9DSFVOS19TSVpFX0xFTkdUSDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlclBhcnNpbmdTdGF0ZS5zdGF0ZSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNhc2UgMTogeyAvLyBTa2lwIGhlYWRpbmcgc3BhY2VzIChpdCdzIG5vdCBhbGxvd2VkIGJ5IHRoZSBzcGVjLCBidXQgc29tZSBzZXJ2ZXJzIHB1dCBpdCB0aGVyZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBub25TcGFjZUlkeCA9IHNraXBTcGFjZXMoaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlclBhcnNpbmdTdGF0ZS5vZmZzZXQsIGhlYWRlclBhcnNpbmdTdGF0ZS5wYWNrZXRMaW1pdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9uU3BhY2VJZHggPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJQYXJzaW5nU3RhdGUub2Zmc2V0ID0gaW5wdXQubGltaXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJQYXJzaW5nU3RhdGUuc3RhdGUgPSAxOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyUGFyc2luZ1N0YXRlLmNoZWNrT3ZlcmZsb3coTG9jYWxpemF0aW9uTWVzc2FnZXMuSFRUUF9DSFVOS19FTkNPRElOR19QUkVGSVhfT1ZFUkZMT1coKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJQYXJzaW5nU3RhdGUub2Zmc2V0ID0gbm9uU3BhY2VJZHg7CisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJQYXJzaW5nU3RhdGUuc3RhdGUgPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjYXNlIDI6IHsgLy8gU2NhbiBjaHVuayBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gaGVhZGVyUGFyc2luZ1N0YXRlLm9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW1pdCA9IE1hdGgubWluKGhlYWRlclBhcnNpbmdTdGF0ZS5wYWNrZXRMaW1pdCwgaW5wdXQubGltaXQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsb25nIHZhbHVlID0gaGVhZGVyUGFyc2luZ1N0YXRlLnBhcnNpbmdOdW1lcmljVmFsdWU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChvZmZzZXQgPCBsaW1pdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJ5dGUgYiA9IGlucHV0LmdldChvZmZzZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1NwYWNlT3JUYWIoYikgfHwgLyp0cmFpbGluZyBzcGFjZXMgYXJlIG5vdCBhbGxvd2VkIGJ5IHRoZSBzcGVjLCBidXQgc29tZSBzZXJ2ZXIgcHV0IGl0IHRoZXJlKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGIgPT0gSHR0cFBhcnNlclV0aWxzLkNSIHx8IGIgPT0gSHR0cFBhcnNlclV0aWxzLlNFTUlfQ09MT04pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyUGFyc2luZ1N0YXRlLmNoZWNrcG9pbnQgPSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiID09IEh0dHBQYXJzZXJVdGlscy5MRikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50UGFyc2luZ1N0YXRlLmNodW5rQ29udGVudFN0YXJ0ID0gb2Zmc2V0ICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudFBhcnNpbmdTdGF0ZS5jaHVua0xlbmd0aCA9IHZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50UGFyc2luZ1N0YXRlLmNodW5rUmVtYWluZGVyID0gdmFsdWU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyUGFyc2luZ1N0YXRlLnN0YXRlID0gQ0hVTktfTEVOR1RIX1BBUlNFRF9TVEFURTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhlYWRlclBhcnNpbmdTdGF0ZS5jaGVja3BvaW50ID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUNbYiAmIDB4RkZdICE9IC0xICYmIGNoZWNrT3ZlcmZsb3codmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICh2YWx1ZSA8PCA0KSArIChERUNbYiAmIDB4RkZdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxpemF0aW9uTWVzc2FnZXMuSFRUUF9JTlZBTElEX0NIVU5LX1NJWkVfSEVYX1ZBTFVFKGIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5IVFRQX1VORVhQRUNURURfQ0hVTktfSEVBREVSKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCsrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJQYXJzaW5nU3RhdGUucGFyc2luZ051bWVyaWNWYWx1ZSA9IHZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyUGFyc2luZ1N0YXRlLm9mZnNldCA9IG9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlclBhcnNpbmdTdGF0ZS5jaGVja092ZXJmbG93KExvY2FsaXphdGlvbk1lc3NhZ2VzLkhUVFBfQ0hVTktfRU5DT0RJTkdfUFJFRklYX09WRVJGTE9XKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVGFrZW4gd2l0aCBzbWFsbCBtb2RpZmljYXRpb25zIGZyb20gR3JpenpseSBDaHVua2VkVHJhbnNmZXJFbmNvZGluZy5wYXJzZVRyYWlsZXJDUkxGCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBwYXJzZVRyYWlsZXJDUkxGKEJ5dGVCdWZmZXIgaW5wdXQpIHsKKyAgICAgICAgICAgIGlmIChoZWFkZXJQYXJzaW5nU3RhdGUuc3RhdGUgPT0gQ0hVTktfTEVOR1RIX1BBUlNFRF9TVEFURSkgeworICAgICAgICAgICAgICAgIHdoaWxlIChpbnB1dC5oYXNSZW1haW5pbmcoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQuZ2V0KCkgPT0gSHR0cFBhcnNlclV0aWxzLkxGKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJQYXJzaW5nU3RhdGUucmVjeWNsZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0Lmhhc1JlbWFpbmluZygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIDx0dD5mYWxzZTwvdHQ+IGlmIG5leHQgbGVmdCBiaXQtc2hpZnQgYnkgNCBiaXRzIHdpbGwgY2F1c2Ugb3ZlcmZsb3csCisgICAgICAgICAqIG9yIDx0dD50cnVlPC90dD4gb3RoZXJ3aXNlCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tPdmVyZmxvdyhmaW5hbCBsb25nIGNodW5rTGVuZ3RoKSB7CisgICAgICAgICAgICByZXR1cm4gY2h1bmtMZW5ndGggPD0gQ0hVTktfU0laRV9PVkVSRkxPVzsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBpbml0VHJhaWxlclBhcnNpbmcoKSB7CisgICAgICAgICAgICBoZWFkZXJQYXJzaW5nU3RhdGUuc3ViU3RhdGUgPSAwOworICAgICAgICAgICAgZmluYWwgaW50IHN0YXJ0ID0gY29udGVudFBhcnNpbmdTdGF0ZS5jaHVua0NvbnRlbnRTdGFydDsKKyAgICAgICAgICAgIGhlYWRlclBhcnNpbmdTdGF0ZS5zdGFydCA9IHN0YXJ0OworICAgICAgICAgICAgaGVhZGVyUGFyc2luZ1N0YXRlLm9mZnNldCA9IHN0YXJ0OworICAgICAgICAgICAgaGVhZGVyUGFyc2luZ1N0YXRlLnBhY2tldExpbWl0ID0gc3RhcnQgKyBtYXhIZWFkZXJzU2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRha2VuIHdpdGggc21hbGwgbW9kaWZpY2F0aW9ucyBmcm9tIEdyaXp6bHkgQ2h1bmtlZFRyYW5zZmVyRW5jb2RpbmcucGFyc2VMYXN0Q2h1bmtUcmFpbGVyCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBwYXJzZUxhc3RDaHVua1RyYWlsZXIoZmluYWwgQnl0ZUJ1ZmZlciBpbnB1dCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gaHR0cFBhcnNlci5wYXJzZUhlYWRlcnNGcm9tQnVmZmVyKGlucHV0LCB0cnVlKTsKKyAgICAgICAgICAgIGlmICghcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgaGVhZGVyUGFyc2luZ1N0YXRlLmNoZWNrT3ZlcmZsb3coTG9jYWxpemF0aW9uTWVzc2FnZXMuSFRUUF9UUkFJTEVSX0hFQURFUl9PVkVSRkxPVygpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvVHJhbnNwb3J0RmlsdGVyLmphdmEgYi9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL1RyYW5zcG9ydEZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwODdhNTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL1RyYW5zcG9ydEZpbHRlci5qYXZhCkBAIC0wLDAgKzEsNDg2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lmpkay5jb25uZWN0b3IuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlNvY2tldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Bc3luY2hyb25vdXNDaGFubmVsR3JvdXA7CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuQXN5bmNocm9ub3VzQ2xvc2VFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhbm5lbHMuQXN5bmNocm9ub3VzU29ja2V0Q2hhbm5lbDsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Db21wbGV0aW9uSGFuZGxlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5RdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkxpbmtlZEJsb2NraW5nRGVxdWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TeW5jaHJvbm91c1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZEZhY3Rvcnk7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLyoqCisgKiBXcml0ZXMgYW5kIHJlYWRzIGRhdGEgdG8gYW5kIGZyb20gYSBzb2NrZXQuIE9ubHkgb25lIHtAbGluayAjd3JpdGUoQnl0ZUJ1ZmZlciwKKyAqIG9yZy5nbGFzc2Zpc2guamVyc2V5Lmpkay5jb25uZWN0b3IuaW50ZXJuYWwuQ29tcGxldGlvbkhhbmRsZXIpfQorICogbWV0aG9kIGNhbGwgY2FuIGJlIHByb2Nlc3NlZCBhdCBhIHRpbWUuIE9ubHkgb25lIHtAbGluayAjX3JlYWQoQnl0ZUJ1ZmZlcil9IG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQgYXQgYSB0aW1lLAorICogYW5vdGhlciBvbmUgaXMgc3RhcnRlZCBvbmx5IGFmdGVyIHRoZSBwcmV2aW91cyBvbmUgaGFzIGNvbXBsZXRlZC4gQmxvY2tpbmcgaW4ge0BsaW5rICNvblJlYWQoT2JqZWN0KX0KKyAqIG9yIHtAbGluayAjb25Db25uZWN0KCl9IG1ldGhvZCB3aWxsIHJlc3VsdCBpbiBkYXRhIG5vdCBiZWluZyByZWFkIGZyb20gYSBzb2NrZXQgdW50aWwgdGhlc2UgbWV0aG9kcyBoYXZlIGNvbXBsZXRlZC4KKyAqCisgKiBAYXV0aG9yIFBldHIgSmFub3VjaCAocGV0ci5qYW5vdWNoIGF0IG9yYWNsZS5jb20pCisgKi8KK2NsYXNzIFRyYW5zcG9ydEZpbHRlciBleHRlbmRzIEZpbHRlcjxCeXRlQnVmZmVyLCBCeXRlQnVmZmVyLCBWb2lkLCBCeXRlQnVmZmVyPiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihUcmFuc3BvcnRGaWx0ZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBdG9taWNJbnRlZ2VyIG9wZW5lZENvbm5lY3Rpb25zID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlIGNvbm5lY3Rpb25DbG9zZVNjaGVkdWxlciA9IEV4ZWN1dG9ycy5uZXdTaW5nbGVUaHJlYWRTY2hlZHVsZWRFeGVjdXRvcihyIC0+IHsKKyAgICAgICAgVGhyZWFkIHRocmVhZCA9IG5ldyBUaHJlYWQocik7CisgICAgICAgIHRocmVhZC5zZXROYW1lKCJqZGstY29ubmVjdG9yLWNvbnRhaW5lci1pZGxlLXRpbWVvdXQiKTsKKyAgICAgICAgdGhyZWFkLnNldERhZW1vbih0cnVlKTsKKyAgICAgICAgcmV0dXJuIHRocmVhZDsKKyAgICB9KTsKKworICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIEFzeW5jaHJvbm91c0NoYW5uZWxHcm91cCBjaGFubmVsR3JvdXA7CisgICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgU2NoZWR1bGVkRnV0dXJlPD8+IGNsb3NlV2FpdFRhc2s7CisKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgVGhyZWFkUG9vbENvbmZpZ30gY3VycmVudCB7QGxpbmsgI2NoYW5uZWxHcm91cH0gaGFzIGJlZW4gY3JlYXRlZCB3aXRoLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIFRocmVhZFBvb2xDb25maWcgY3VycmVudFRocmVhZFBvb2xDb25maWc7CisgICAgLyoqCisgICAgICogSWRsZSB0aW1lb3V0IHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4gY2xvc2luZyBjdXJyZW50IHtAbGluayAjY2hhbm5lbEdyb3VwfQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIEludGVnZXIgY3VycmVudENvbnRhaW5lcklkbGVUaW1lb3V0OworCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgaW5wdXRCdWZmZXJTaXplOworICAgIHByaXZhdGUgZmluYWwgVGhyZWFkUG9vbENvbmZpZyB0aHJlYWRQb29sQ29uZmlnOworICAgIHByaXZhdGUgZmluYWwgaW50IGNvbnRhaW5lcklkbGVUaW1lb3V0OworCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBBc3luY2hyb25vdXNTb2NrZXRDaGFubmVsIHNvY2tldENoYW5uZWw7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgKiA8cC8+CisgICAgICogSWYgdGhlIGNoYW5uZWwgZ3JvdXAgaXMgbm90IGFjdGl2ZSAoYWxsIGNvbm5lY3Rpb25zIGhhdmUgYmVlbiBjbG9zZWQgYW5kIHRoZSBzaHV0ZG93biB0aW1lb3V0IGlzIHJ1bm5pbmcpIGFuZCBhIG5ldworICAgICAqIHRyYW5zcG9ydCBpcyBjcmVhdGVkIHdpdGggdHJlYWQgcG9vbCBjb25maWd1cmF0aW9uIGRpZmZlcmVudCBmcm9tIHRoZSBvbmUgb2YgdGhlIGN1cnJlbnQgdGhyZWFkIHBvb2wsIHRoZSBjdXJyZW50CisgICAgICogdGhyZWFkIHBvb2wgd2lsbCBiZSBzaHV0IGRvd24gYW5kIGEgbmV3IG9uZSBjcmVhdGVkIHdpdGggdGhlIG5ldyBjb25maWd1cmF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGlucHV0QnVmZmVyU2l6ZSAgICAgIHNpemUgb2YgYnVmZmVyIHRvIGJlIGFsbG9jYXRlZCBmb3IgcmVhZGluZyBkYXRhIGZyb20gYSBzb2NrZXQuCisgICAgICogQHBhcmFtIHRocmVhZFBvb2xDb25maWcgICAgIHRocmVhZCBwb29sIGNvbmZpZ3VyYXRpb24gdXNlZCBmb3IgY3JlYXRpbmcgdGhyZWFkIHBvb2wuCisgICAgICogQHBhcmFtIGNvbnRhaW5lcklkbGVUaW1lb3V0IGlkbGUgdGltZSBhZnRlciB3aGljaCB0aGUgc2hhcmVkIHRocmVhZCBwb29sIHdpbGwgYmUgZGVzdHJveWVkLgorICAgICAqLworICAgIFRyYW5zcG9ydEZpbHRlcihpbnQgaW5wdXRCdWZmZXJTaXplLCBUaHJlYWRQb29sQ29uZmlnIHRocmVhZFBvb2xDb25maWcsIGludCBjb250YWluZXJJZGxlVGltZW91dCkgeworICAgICAgICBzdXBlcihudWxsKTsKKyAgICAgICAgdGhpcy5pbnB1dEJ1ZmZlclNpemUgPSBpbnB1dEJ1ZmZlclNpemU7CisgICAgICAgIHRoaXMudGhyZWFkUG9vbENvbmZpZyA9IHRocmVhZFBvb2xDb25maWc7CisgICAgICAgIHRoaXMuY29udGFpbmVySWRsZVRpbWVvdXQgPSBjb250YWluZXJJZGxlVGltZW91dDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICB2b2lkIHdyaXRlKEJ5dGVCdWZmZXIgZGF0YSwKKyAgICAgICAgICAgICAgIGZpbmFsIG9yZy5nbGFzc2Zpc2guamVyc2V5Lmpkay5jb25uZWN0b3IuaW50ZXJuYWwuQ29tcGxldGlvbkhhbmRsZXI8Qnl0ZUJ1ZmZlcj4gY29tcGxldGlvbkhhbmRsZXIpIHsKKyAgICAgICAgc29ja2V0Q2hhbm5lbC5pc09wZW4oKTsKKyAgICAgICAgc29ja2V0Q2hhbm5lbC53cml0ZShkYXRhLCBkYXRhLCBuZXcgQ29tcGxldGlvbkhhbmRsZXI8SW50ZWdlciwgQnl0ZUJ1ZmZlcj4oKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgY29tcGxldGVkKEludGVnZXIgcmVzdWx0LCBCeXRlQnVmZmVyIGJ1ZmZlcikgeworICAgICAgICAgICAgICAgIGlmIChidWZmZXIuaGFzUmVtYWluaW5nKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGUoYnVmZmVyLCBjb21wbGV0aW9uSGFuZGxlcik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29tcGxldGlvbkhhbmRsZXIuY29tcGxldGVkKGJ1ZmZlcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgZmFpbGVkKFRocm93YWJsZSBleGMsIEJ5dGVCdWZmZXIgYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgY29tcGxldGlvbkhhbmRsZXIuZmFpbGVkKGV4Yyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIGlmIChzb2NrZXRDaGFubmVsID09IG51bGwgfHwgIXNvY2tldENoYW5uZWwuaXNPcGVuKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgc29ja2V0Q2hhbm5lbC5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLklORk8sIExvY2FsaXphdGlvbk1lc3NhZ2VzLlRSQU5TUE9SVF9DT05ORUNUSU9OX05PVF9DTE9TRUQoKSwgZSk7CisgICAgICAgIH0KKyAgICAgICAgc3luY2hyb25pemVkIChUcmFuc3BvcnRGaWx0ZXIuY2xhc3MpIHsKKyAgICAgICAgICAgIG9wZW5lZENvbm5lY3Rpb25zLmRlY3JlbWVudEFuZEdldCgpOworICAgICAgICAgICAgaWYgKG9wZW5lZENvbm5lY3Rpb25zLmdldCgpID09IDAgJiYgY2hhbm5lbEdyb3VwICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzY2hlZHVsZUNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICB2b2lkIHN0YXJ0U3NsKCkgeworICAgICAgICBvblNzbEhhbmRzaGFrZUNvbXBsZXRlZCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGhhbmRsZUNvbm5lY3QoU29ja2V0QWRkcmVzcyBzZXJ2ZXJBZGRyZXNzLCBGaWx0ZXIgdXBzdHJlYW1GaWx0ZXIpIHsKKyAgICAgICAgdGhpcy51cHN0cmVhbUZpbHRlciA9IHVwc3RyZWFtRmlsdGVyOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKFRyYW5zcG9ydEZpbHRlci5jbGFzcykgeworICAgICAgICAgICAgICAgIHVwZGF0ZVRocmVhZFBvb2xDb25maWcoKTsKKyAgICAgICAgICAgICAgICBpbml0aWFsaXplQ2hhbm5lbEdyb3VwKCk7CisgICAgICAgICAgICAgICAgc29ja2V0Q2hhbm5lbCA9IEFzeW5jaHJvbm91c1NvY2tldENoYW5uZWwub3BlbihjaGFubmVsR3JvdXApOworICAgICAgICAgICAgICAgIG9wZW5lZENvbm5lY3Rpb25zLmluY3JlbWVudEFuZEdldCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBvbkVycm9yKGUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgc29ja2V0Q2hhbm5lbC5jb25uZWN0KHNlcnZlckFkZHJlc3MsIG51bGwsIG5ldyBDb21wbGV0aW9uSGFuZGxlcjxWb2lkLCBWb2lkPigpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBjb21wbGV0ZWQoVm9pZCByZXN1bHQsIFZvaWQgbm90aGluZykgeworICAgICAgICAgICAgICAgIGZpbmFsIEJ5dGVCdWZmZXIgaW5wdXRCdWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKGlucHV0QnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgb25Db25uZWN0KCk7CisgICAgICAgICAgICAgICAgX3JlYWQoaW5wdXRCdWZmZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZhaWxlZChUaHJvd2FibGUgZXhjLCBWb2lkIG5vdGhpbmcpIHsKKyAgICAgICAgICAgICAgICBvbkVycm9yKGV4Yyk7CisKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzb2NrZXRDaGFubmVsLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLkZJTkUsIExvY2FsaXphdGlvbk1lc3NhZ2VzLlRSQU5TUE9SVF9DT05ORUNUSU9OX05PVF9DTE9TRUQoKSwgZXhjLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlVGhyZWFkUG9vbENvbmZpZygpIHsKKworICAgICAgICAvLyB0aGUgY2hhbm5lbCBncm91cCBpcyBhY3RpdmUsIG5vIGNoYW5nZSBpbiBjb25maWd1cmF0aW9uCisgICAgICAgIGlmIChvcGVuZWRDb25uZWN0aW9ucy5nZXQoKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBjaGVjayBpZiB0aGUgbmV3IGNvbmZpZ3VyYXRpb24gaXMgZGlmZmVyZW50IGZyb20gdGhlIG9uZSBvZiB0aGUgY3VycmVudCBjb250YWluZXIKKyAgICAgICAgaWYgKCF0aHJlYWRQb29sQ29uZmlnLmVxdWFscyhjdXJyZW50VGhyZWFkUG9vbENvbmZpZykgfHwgY29udGFpbmVySWRsZVRpbWVvdXQgIT0gY3VycmVudENvbnRhaW5lcklkbGVUaW1lb3V0KSB7CisKKyAgICAgICAgICAgIGN1cnJlbnRUaHJlYWRQb29sQ29uZmlnID0gdGhyZWFkUG9vbENvbmZpZzsKKyAgICAgICAgICAgIGN1cnJlbnRDb250YWluZXJJZGxlVGltZW91dCA9IGNvbnRhaW5lcklkbGVUaW1lb3V0OworCisgICAgICAgICAgICBpZiAoY2hhbm5lbEdyb3VwID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGUgY2hhbm5lbCBncm91cCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgKHRoaXMgaXMgYSBmaXJzdCBjbGllbnQpIC0gbm8gbmVlZCB0byBzaHV0IGl0IGRvd24KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsb3NlV2FpdFRhc2suY2FuY2VsKHRydWUpOworICAgICAgICAgICAgY2xvc2VXYWl0VGFzayA9IG51bGw7CisgICAgICAgICAgICBjaGFubmVsR3JvdXAuc2h1dGRvd24oKTsKKyAgICAgICAgICAgIGNoYW5uZWxHcm91cCA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUNoYW5uZWxHcm91cCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjbG9zZVdhaXRUYXNrICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNsb3NlV2FpdFRhc2suY2FuY2VsKHRydWUpOworICAgICAgICAgICAgY2xvc2VXYWl0VGFzayA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2hhbm5lbEdyb3VwID09IG51bGwpIHsKKyAgICAgICAgICAgIFRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeSA9IHRocmVhZFBvb2xDb25maWcuZ2V0VGhyZWFkRmFjdG9yeSgpOworICAgICAgICAgICAgaWYgKHRocmVhZEZhY3RvcnkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocmVhZEZhY3RvcnkgPSBuZXcgVHJhbnNwb3J0VGhyZWFkRmFjdG9yeSh0aHJlYWRQb29sQ29uZmlnKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yOworICAgICAgICAgICAgaWYgKHRocmVhZFBvb2xDb25maWcuZ2V0UXVldWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZXhlY3V0b3IgPSBuZXcgUXVldWluZ0V4ZWN1dG9yKHRocmVhZFBvb2xDb25maWcuZ2V0Q29yZVBvb2xTaXplKCksIHRocmVhZFBvb2xDb25maWcuZ2V0TWF4UG9vbFNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFBvb2xDb25maWcuZ2V0S2VlcEFsaXZlVGltZShUaW1lVW5pdC5NSUxMSVNFQ09ORFMpLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMsCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRQb29sQ29uZmlnLmdldFF1ZXVlKCksIGZhbHNlLCB0aHJlYWRGYWN0b3J5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IHRhc2tRdWV1ZUxpbWl0ID0gdGhyZWFkUG9vbENvbmZpZy5nZXRRdWV1ZUxpbWl0KCk7CisgICAgICAgICAgICAgICAgaWYgKHRhc2tRdWV1ZUxpbWl0ID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIHRhc2tRdWV1ZUxpbWl0ID0gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZXhlY3V0b3IgPSBuZXcgUXVldWluZ0V4ZWN1dG9yKHRocmVhZFBvb2xDb25maWcuZ2V0Q29yZVBvb2xTaXplKCksIHRocmVhZFBvb2xDb25maWcuZ2V0TWF4UG9vbFNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZFBvb2xDb25maWcuZ2V0S2VlcEFsaXZlVGltZShUaW1lVW5pdC5NSUxMSVNFQ09ORFMpLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTGlua2VkQmxvY2tpbmdEZXF1ZTw+KHRhc2tRdWV1ZUxpbWl0KSwgdHJ1ZSwgdGhyZWFkRmFjdG9yeSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRocmVhZCBwb29sIGlzIG93bmVkIGJ5IHRoZSBjaGFubmVsIGdyb3VwIGFuZCB3aWxsIGJlIHNodXQgZG93biB3aGVuIGNoYW5uZWwgZ3JvdXAgaXMgc2h1dCBkb3duCisgICAgICAgICAgICBjaGFubmVsR3JvdXAgPSBBc3luY2hyb25vdXNDaGFubmVsR3JvdXAud2l0aENhY2hlZFRocmVhZFBvb2woZXhlY3V0b3IsIHRocmVhZFBvb2xDb25maWcuZ2V0Q29yZVBvb2xTaXplKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF9yZWFkKGZpbmFsIEJ5dGVCdWZmZXIgaW5wdXRCdWZmZXIpIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEl0IG11c3QgYmUgY2hlY2tlZCB0aGF0IHRoZSBjaGFubmVsIGhhcyBub3QgYmVlbiBjbG9zZWQgYnkge0BsaW5rICNjbG9zZSgpfSBtZXRob2QuCisgICAgICAgICAqLworICAgICAgICBpZiAoIXNvY2tldENoYW5uZWwuaXNPcGVuKCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHNvY2tldENoYW5uZWwucmVhZChpbnB1dEJ1ZmZlciwgbnVsbCwgbmV3IENvbXBsZXRpb25IYW5kbGVyPEludGVnZXIsIFZvaWQ+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBjb21wbGV0ZWQoSW50ZWdlciBieXRlc1JlYWQsIFZvaWQgcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgLy8gY29ubmVjdGlvbiBjbG9zZWQgYnkgdGhlIHNlcnZlcgorICAgICAgICAgICAgICAgIGlmIChieXRlc1JlYWQgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2xvc2Ugd2lsbCBzZXQgVHJhbnNwb3J0RmlsdGVyLnRoaXMudXBzdHJlYW1GaWx0ZXIgdG8gbnVsbAorICAgICAgICAgICAgICAgICAgICBGaWx0ZXIgdXBzdHJlYW1GaWx0ZXIgPSBUcmFuc3BvcnRGaWx0ZXIudGhpcy51cHN0cmVhbUZpbHRlcjsKKyAgICAgICAgICAgICAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgdXBzdHJlYW1GaWx0ZXIub25Db25uZWN0aW9uQ2xvc2VkKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlci5mbGlwKCk7CisgICAgICAgICAgICAgICAgb25SZWFkKGlucHV0QnVmZmVyKTsKKyAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlci5jb21wYWN0KCk7CisgICAgICAgICAgICAgICAgX3JlYWQoaW5wdXRCdWZmZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZhaWxlZChUaHJvd2FibGUgZXhjLCBWb2lkIHJlc3VsdCkgeworICAgICAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICAgICAqIFJlYWRpbmcgZnJvbSB0aGUgY2hhbm5lbCB3aWxsIGZhaWwgaWYgaXQgaXMgY2xvc2luZy4gSW4gc3VjaCBjYXNlcyB7QGxpbmsgamF2YS5uaW8uY2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgKiAuQXN5bmNocm9ub3VzQ2xvc2VFeGNlcHRpb259CisgICAgICAgICAgICAgICAgICogaXMgdGhyb3duLiBUaGlzIHNob3VsZCBub3QgYmUgbG9nZ2VkIGFuZCBubyBhY3Rpb24gdW5kZXJ0YWtlbi4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAoZXhjIGluc3RhbmNlb2YgQXN5bmNocm9ub3VzQ2xvc2VFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG9uRXJyb3IoZXhjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNjaGVkdWxlQ2xvc2UoKSB7CisgICAgICAgIGNsb3NlV2FpdFRhc2sgPSBjb25uZWN0aW9uQ2xvc2VTY2hlZHVsZXIuc2NoZWR1bGUoKCkgLT4geworICAgICAgICAgICAgc3luY2hyb25pemVkIChUcmFuc3BvcnRGaWx0ZXIuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xvc2VXYWl0VGFzayA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2hhbm5lbEdyb3VwLnNodXRkb3duKCk7CisgICAgICAgICAgICAgICAgY2hhbm5lbEdyb3VwID0gbnVsbDsKKyAgICAgICAgICAgICAgICBjbG9zZVdhaXRUYXNrID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwgY3VycmVudENvbnRhaW5lcklkbGVUaW1lb3V0LCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgZGVmYXVsdCB0aHJlYWQgZmFjdG9yeSB0aGF0IGdldHMgdXNlZCBpZiB7QGxpbmsgVGhyZWFkUG9vbENvbmZpZyNnZXRUaHJlYWRGYWN0b3J5KCl9CisgICAgICogaXMgbm90IHNwZWNpZmllZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUcmFuc3BvcnRUaHJlYWRGYWN0b3J5IGltcGxlbWVudHMgVGhyZWFkRmFjdG9yeSB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRIUkVBRF9OQU1FX0JBU0UgPSAiamRrLWNvbm5lY3Rvci0iOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBdG9taWNJbnRlZ2VyIHRocmVhZENvdW50ZXIgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFRocmVhZFBvb2xDb25maWcgdGhyZWFkUG9vbENvbmZpZzsKKworICAgICAgICBUcmFuc3BvcnRUaHJlYWRGYWN0b3J5KFRocmVhZFBvb2xDb25maWcgdGhyZWFkUG9vbENvbmZpZykgeworICAgICAgICAgICAgdGhpcy50aHJlYWRQb29sQ29uZmlnID0gdGhyZWFkUG9vbENvbmZpZzsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVGhyZWFkIG5ld1RocmVhZChSdW5uYWJsZSByKSB7CisgICAgICAgICAgICBmaW5hbCBUaHJlYWQgdGhyZWFkID0gbmV3IFRocmVhZChyKTsKKyAgICAgICAgICAgIHRocmVhZC5zZXROYW1lKFRIUkVBRF9OQU1FX0JBU0UgKyB0aHJlYWRDb3VudGVyLmluY3JlbWVudEFuZEdldCgpKTsKKyAgICAgICAgICAgIHRocmVhZC5zZXRQcmlvcml0eSh0aHJlYWRQb29sQ29uZmlnLmdldFByaW9yaXR5KCkpOworICAgICAgICAgICAgdGhyZWFkLnNldERhZW1vbih0aHJlYWRQb29sQ29uZmlnLmlzRGFlbW9uKCkpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uPFZvaWQ+KCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIFZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRocmVhZFBvb2xDb25maWcuZ2V0SW5pdGlhbENsYXNzTG9hZGVyKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZC5zZXRDb250ZXh0Q2xhc3NMb2FkZXIodGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlYWQuc2V0Q29udGV4dENsYXNzTG9hZGVyKHRocmVhZFBvb2xDb25maWcuZ2V0SW5pdGlhbENsYXNzTG9hZGVyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgLy8ganVzdCBsb2cgLSBjbGllbnQgc3RpbGwgY2FuIHdvcmsgd2l0aG91dCBzZXR0aW5nIGNvbnRleHQgY2xhc3MgbG9hZGVyCisgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5XQVJOSU5HLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5UUkFOU1BPUlRfU0VUX0NMQVNTX0xPQURFUl9GQUlMRUQoKSwgdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB0aHJlYWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHRocmVhZCBwb29sIGV4ZWN1dG9yIHRoYXQgcHJlZmVycyBjcmVhdGluZyBuZXcgd29ya2VyIHRocmVhZHMgb3ZlciBxdWV1ZWluZyB0YXNrcyB1bnRpbCB0aGUgbWF4aW11bSBwb2xsIHNpemUKKyAgICAgKiBoYXMgYmVlbiByZWFjaGVkLCBhZnRlciB3aGljaCBpdCB3aWxsIHN0YXJ0IHF1ZXVlaW5nIHRhc2tzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFF1ZXVpbmdFeGVjdXRvciBleHRlbmRzIFRocmVhZFBvb2xFeGVjdXRvciB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBRdWV1ZTxSdW5uYWJsZT4gdGFza1F1ZXVlOworICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gdGhyZWFkU2FmZVF1ZXVlOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHRocmVhZFNhZmVRdWV1ZSBpbmRpY2F0ZXMgaWYge0BsaW5rICN0YXNrUXVldWV9IGlzIHRocmVhZCBzYWZlIG9yIG5vdC4KKyAgICAgICAgICovCisgICAgICAgIFF1ZXVpbmdFeGVjdXRvcihpbnQgY29yZVBvb2xTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heGltdW1Qb29sU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcga2VlcEFsaXZlVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVVbml0IHVuaXQsCisgICAgICAgICAgICAgICAgICAgICAgICBRdWV1ZTxSdW5uYWJsZT4gdGFza1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB0aHJlYWRTYWZlUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWRGYWN0b3J5IHRocmVhZEZhY3RvcnkpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvcmVQb29sU2l6ZSwgbWF4aW11bVBvb2xTaXplLCBrZWVwQWxpdmVUaW1lLCB1bml0LCBuZXcgSGFuZE9mZlF1ZXVlKHRhc2tRdWV1ZSwgdGhyZWFkU2FmZVF1ZXVlKSwKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkRmFjdG9yeSk7CisgICAgICAgICAgICB0aGlzLnRhc2tRdWV1ZSA9IHRhc2tRdWV1ZTsKKyAgICAgICAgICAgIHRoaXMudGhyZWFkU2FmZVF1ZXVlID0gdGhyZWFkU2FmZVF1ZXVlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFN1Ym1pdCBhIHRhc2sgZm9yIGV4ZWN1dGlvbiwgaWYgdGhlIG1heGltdW0gdGhyZWFkIGxpbWl0IGhhcyBiZWVuIHJlYWNoZWQgYW5kIGFsbCB0aGUgdGhyZWFkcyBhcmUgb2NjdXBpZWQsCisgICAgICAgICAqIGVucXVldWUgdGhlIHRhc2suIFRoZSB0YXNrIGlzIG5vdCBleGVjdXRlZCBieSB0aGUgY3VycmVudCB0aHJlYWQsIGJ1dCBieSBhIHRocmVhZCBmcm9tIHRoZSB0aHJlYWQgcG9vbC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHRhc2sgdG8gYmUgZXhlY3V0ZWQuCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZShSdW5uYWJsZSB0YXNrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHN1cGVyLmV4ZWN1dGUodGFzayk7CisgICAgICAgICAgICB9IGNhdGNoIChSZWplY3RlZEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7CisKKyAgICAgICAgICAgICAgICAvKiBleGVjdXRpb24gaGFzIGJlZW4gcmVqZWN0ZWQgZWl0aGVyIGJlY2F1c2UgdGhlIGV4ZWN1dG9yIGhhcyBiZWVuIHNodXQgZG93biBvciBhbGwgd29ya2VyIHRocmVhZHMgYXJlCisgICAgICAgICAgICAgICAgICogYnVzeSAtIGNoZWNrIHRoZSBmb3JtZXIgb25lCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKGlzU2h1dGRvd24oKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuVFJBTlNQT1JUX0VYRUNVVE9SX0NMT1NFRCgpLCBlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvKiBBbGwgdGhyZWFkcyBhcmUgb2NjdXBpZWQsIHRyeSBlbnF1ZXVpbmcgdGhlIHRhc2suCisgICAgICAgICAgICAgICAgICogRWFjaCB3b3JrZXIgdGhyZWFkIGNoZWNrcyB0aGUgcXVldWUgYWZ0ZXIgaXQgaGFzIGZpbmlzaGVkIGV4ZWN1dGluZyBpdHMgdGFzay4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAodGhyZWFkU2FmZVF1ZXVlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghdGFza1F1ZXVlLm9mZmVyKHRhc2spKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuVFJBTlNQT1JUX0VYRUNVVE9SX1FVRVVFX0xJTUlUX1JFQUNIRUQoKSwgZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRhc2tRdWV1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YXNrUXVldWUub2ZmZXIodGFzaykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuVFJBTlNQT1JUX0VYRUNVVE9SX1FVRVVFX0xJTUlUX1JFQUNIRUQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICogVGhlcmUgaXMgYSBzbWFsbCB0aW1lIGludGVydmFsIGJldHdlZW4gYSB3b3JrZXIgdGhyZWFkIGNoZWNrcyB7QGxpbmsgI3Rhc2tRdWV1ZX0gYW5kIGl0IHN0YXJ0cyB0byBibG9jaworICAgICAgICAgICAgICAgICAqIHdhaXRpbmcgZm9yIGEgbmV3IHRhc2tzIHRvIGJlIHN1Ym1pdHRlZCAoSWRlYWxseSBjaGVja2luZyB0aGF0IHRoZSB7QGxpbmsgI3Rhc2tRdWV1ZX0gaXMgZW1wdHkgYW5kIHN0YXJ0aW5nIHRvCisgICAgICAgICAgICAgICAgICogYmxvY2sgYXQgdGhlIHRhc2sgaGFuZCBvZmYgcXVldWUgd291bGQgYmUgYXRvbWljKS4gVGhpcyBjYW4gYmUgZGV0ZWN0ZWQgYnkgdGhlIHNpdHVhdGlvbiB3aGVuIGEgdGhyZWFkCisgICAgICAgICAgICAgICAgICogc3VibWl0dGluZworICAgICAgICAgICAgICAgICAqIGEgbmV3IHRhc2tzIGhhcyBiZWVuIHJlamVjdGVkLCBidXQgbm90IGFsbCB3b3JrZXIgdGhyZWFkcyBhcmUgYWN0aXZlIChIb3dldmVyIHRoaXMgZG9lcyBub3QgaW5kaWNhdGUKKyAgICAgICAgICAgICAgICAgKiBleGNsdXNpdmVseQorICAgICAgICAgICAgICAgICAqIHRoZSBwcm9ibGVtYXRpYyBzaXR1YXRpb24pLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChnZXRBY3RpdmVDb3VudCgpIDwgZ2V0TWF4aW11bVBvb2xTaXplKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogVGhlcmUgaXMgbm8gZ3VhcmFudGVlIHRoYXQgdGhlIHNhbWUgdGFza3MgdGhhdCBoYXMgYmVlbiBlbnF1ZXVlZCBhYm92ZSB3aWxsIGJlIGRlcXVldWVkLAorICAgICAgICAgICAgICAgICAgICAgKiBidXQgdHJ5aW5nIHRvIGV4ZWN1dGUgb25lIGFyYml0cmFyeSB0YXNrIGJ5IGV2ZXJ5b25lIGluIHRoaXMgc2l0dWF0aW9uIGlzIGVub3VnaCB0byBjbGVhciB0aGUgcXVldWUuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBSdW5uYWJsZSBkZXF1ZXVlZFRhc2s7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlYWRTYWZlUXVldWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlcXVldWVkVGFzayA9IHRhc2tRdWV1ZS5wb2xsKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRhc2tRdWV1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcXVldWVkVGFzayA9IHRhc2tRdWV1ZS5wb2xsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgdGFzayBoYXMgbm90IGJlZW4gY29uc3VtZWQgYnkgYSB3b3JrZXIgdGhyZWFkIGFmdGVyIGFsbAorICAgICAgICAgICAgICAgICAgICBpZiAoZGVxdWV1ZWRUYXNrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGUoZGVxdWV1ZWRUYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTeW5jaHJvbm91cyBxdWV1ZSB0aGF0IHRyaWVzIHRvIGVtcHR5IHtAbGluayAjdGFza1F1ZXVlfSBiZWZvcmUgaXQgYmxvY2tzIHdhaXRpbmcgZm9yIG5ldyB0YXNrcyB0byBiZSBzdWJtaXR0ZWQuCisgICAgICAgICAqIEl0IGlzIHBhc3NlZCB0byB7QGxpbmsgVGhyZWFkUG9vbEV4ZWN1dG9yfSwgd2hlcmUgaXQgaXMgdXNlZCB1c2VkIHRvIGhhbmQgb2ZmIHRhc2tzIGZyb20gdGFzay1zdWJtaXR0aW5nCisgICAgICAgICAqIHRocmVhZCB0byB3b3JrZXIgdGhyZWFkcy4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEhhbmRPZmZRdWV1ZSBleHRlbmRzIFN5bmNocm9ub3VzUXVldWU8UnVubmFibGU+IHsKKworICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTE2MDcwNjQ2NjE4Mjg4MzQ4NDdMOworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBRdWV1ZTxSdW5uYWJsZT4gdGFza1F1ZXVlOworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHRocmVhZFNhZmVRdWV1ZTsKKworICAgICAgICAgICAgcHJpdmF0ZSBIYW5kT2ZmUXVldWUoUXVldWU8UnVubmFibGU+IHRhc2tRdWV1ZSwgYm9vbGVhbiB0aHJlYWRTYWZlUXVldWUpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnRhc2tRdWV1ZSA9IHRhc2tRdWV1ZTsKKyAgICAgICAgICAgICAgICB0aGlzLnRocmVhZFNhZmVRdWV1ZSA9IHRocmVhZFNhZmVRdWV1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgUnVubmFibGUgdGFrZSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgLy8gdHJ5IHRvIGVtcHR5IHRoZSB0YXNrIHF1ZXVlCisgICAgICAgICAgICAgICAgUnVubmFibGUgdGFzazsKKyAgICAgICAgICAgICAgICBpZiAodGhyZWFkU2FmZVF1ZXVlKSB7CisgICAgICAgICAgICAgICAgICAgIHRhc2sgPSB0YXNrUXVldWUucG9sbCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGFza1F1ZXVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0YXNrID0gdGFza1F1ZXVlLnBvbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodGFzayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXNrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGJsb2NrIGFuZCB3YWl0IGZvciBhIHRhc2sgdG8gYmUgc3VibWl0dGVkCisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnRha2UoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgUnVubmFibGUgcG9sbChsb25nIHRpbWVvdXQsIFRpbWVVbml0IHVuaXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgLy8gdHJ5IHRvIGVtcHR5IHRoZSB0YXNrIHF1ZXVlCisgICAgICAgICAgICAgICAgUnVubmFibGUgdGFzazsKKyAgICAgICAgICAgICAgICBpZiAodGhyZWFkU2FmZVF1ZXVlKSB7CisgICAgICAgICAgICAgICAgICAgIHRhc2sgPSB0YXNrUXVldWUucG9sbCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGFza1F1ZXVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0YXNrID0gdGFza1F1ZXVlLnBvbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodGFzayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXNrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGJsb2NrIGFuZCB3YWl0IGZvciBhIHRhc2sgdG8gYmUgc3VibWl0dGVkCisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnBvbGwodGltZW91dCwgdW5pdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL1V0aWxzLmphdmEgYi9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL1V0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk0ODQyZQotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvVXRpbHMuamF2YQpAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lmpkay5jb25uZWN0b3IuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKworLyoqCisgKiBAYXV0aG9yIFBldHIgSmFub3VjaCAocGV0ci5qYW5vdWNoIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBVdGlscyB7CisKKyAgICAvKioKKyAgICAgKiBDb25jYXRlbmF0ZXMgdHdvIGJ1ZmZlcnMgaW50byBvbmUuIElmIGJ1ZmZlciBnaXZlbiBhcyBmaXJzdCBhcmd1bWVudCBoYXMgZW5vdWdoIHNwYWNlIGZvciBwdXR0aW5nCisgICAgICogdGhlIG90aGVyIG9uZSwgaXQgd2lsbCBiZSBkb25lIGFuZCB0aGUgb3JpZ2luYWwgYnVmZmVyIHdpbGwgYmUgcmV0dXJuZWQuIE90aGVyd2lzZSBuZXcgYnVmZmVyIHdpbGwKKyAgICAgKiBiZSBjcmVhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGJ1ZmZlciAgZmlyc3QgYnVmZmVyLgorICAgICAqIEBwYXJhbSBidWZmZXIxIHNlY29uZCBidWZmZXIuCisgICAgICogQHJldHVybiBjb25jYXRlbmF0aW9uLgorICAgICAqLworICAgIHN0YXRpYyBCeXRlQnVmZmVyIGFwcGVuZEJ1ZmZlcnMoQnl0ZUJ1ZmZlciBidWZmZXIsIEJ5dGVCdWZmZXIgYnVmZmVyMSwgaW50IGluY29taW5nQnVmZmVyU2l6ZSwgaW50IEJVRkZFUl9TVEVQX1NJWkUpIHsKKworICAgICAgICBmaW5hbCBpbnQgbGltaXQgPSBidWZmZXIubGltaXQoKTsKKyAgICAgICAgZmluYWwgaW50IGNhcGFjaXR5ID0gYnVmZmVyLmNhcGFjaXR5KCk7CisgICAgICAgIGZpbmFsIGludCByZW1haW5pbmcgPSBidWZmZXIucmVtYWluaW5nKCk7CisgICAgICAgIGZpbmFsIGludCBsZW4gPSBidWZmZXIxLnJlbWFpbmluZygpOworCisgICAgICAgIC8vIGJ1ZmZlcjEgd2lsbCBiZSBhcHBlbmRlZCB0byBidWZmZXIKKyAgICAgICAgaWYgKGxlbiA8IChjYXBhY2l0eSAtIGxpbWl0KSkgeworCisgICAgICAgICAgICBidWZmZXIubWFyaygpOworICAgICAgICAgICAgYnVmZmVyLnBvc2l0aW9uKGxpbWl0KTsKKyAgICAgICAgICAgIGJ1ZmZlci5saW1pdChjYXBhY2l0eSk7CisgICAgICAgICAgICBidWZmZXIucHV0KGJ1ZmZlcjEpOworICAgICAgICAgICAgYnVmZmVyLmxpbWl0KGxpbWl0ICsgbGVuKTsKKyAgICAgICAgICAgIGJ1ZmZlci5yZXNldCgpOworICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgICAgICAgICAgIC8vIFJlbWFpbmluZyBkYXRhIGlzIG1vdmVkIHRvIGxlZnQuIFRoZW4gbmV3IGRhdGEgaXMgYXBwZW5kZWQKKyAgICAgICAgfSBlbHNlIGlmIChyZW1haW5pbmcgKyBsZW4gPCBjYXBhY2l0eSkgeworICAgICAgICAgICAgYnVmZmVyLmNvbXBhY3QoKTsKKyAgICAgICAgICAgIGJ1ZmZlci5wdXQoYnVmZmVyMSk7CisgICAgICAgICAgICBidWZmZXIuZmxpcCgpOworICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBuZXcgYnVmZmVyCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgbmV3U2l6ZSA9IHJlbWFpbmluZyArIGxlbjsKKyAgICAgICAgICAgIGlmIChuZXdTaXplID4gaW5jb21pbmdCdWZmZXJTaXplKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQnVmZmVyIG92ZXJmbG93Iik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCByb3VuZGVkU2l6ZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAobmV3U2l6ZSAlIEJVRkZFUl9TVEVQX1NJWkUpID4gMCA/ICgobmV3U2l6ZSAvIEJVRkZFUl9TVEVQX1NJWkUpICsgMSkgKiBCVUZGRVJfU1RFUF9TSVpFIDogbmV3U2l6ZTsKKyAgICAgICAgICAgICAgICBmaW5hbCBCeXRlQnVmZmVyIHJlc3VsdCA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUocm91bmRlZFNpemUgPiBpbmNvbWluZ0J1ZmZlclNpemUgPyBuZXdTaXplIDogcm91bmRlZFNpemUpOworICAgICAgICAgICAgICAgIHJlc3VsdC5wdXQoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICByZXN1bHQucHV0KGJ1ZmZlcjEpOworICAgICAgICAgICAgICAgIHJlc3VsdC5mbGlwKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBCeXRlQnVmZmVyIHNwbGl0KEJ5dGVCdWZmZXIgYnVmZmVyLCBpbnQgcG9zaXRpb24pIHsKKyAgICAgICAgaW50IGJ5dGVzTGVuZ3RoID0gcG9zaXRpb24gLSBidWZmZXIucG9zaXRpb24oKTsKKyAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbYnl0ZXNMZW5ndGhdOworICAgICAgICBidWZmZXIuZ2V0KGJ5dGVzKTsKKyAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXIud3JhcChieXRlcyk7CisgICAgfQorCisgICAgc3RhdGljIGludCBnZXRQb3J0KFVSSSB1cmkpIHsKKyAgICAgICAgaWYgKHVyaS5nZXRQb3J0KCkgIT0gLTEpIHsKKyAgICAgICAgICAgIHJldHVybiB1cmkuZ2V0UG9ydCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCJodHRwcyIuZXF1YWxzKHVyaS5nZXRTY2hlbWUoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiA0NDM7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gODA7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9Xcml0ZUxpc3RlbmVyLmphdmEgYi9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL1dyaXRlTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWRkZDZmCi0tLSAvZGV2L251bGwKKysrIGIvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9Xcml0ZUxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZGsuY29ubmVjdG9yLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBDYWxsYmFjayBub3RpZmljYXRpb24gbWVjaGFuaXNtIHRoYXQgc2lnbmFscyB0byB0aGUgZGV2ZWxvcGVyIGl0J3MgcG9zc2libGUKKyAqIHRvIHdyaXRlIGNvbnRlbnQgd2l0aG91dCBibG9ja2luZy4KKyAqIDxwLz4KKyAqIEJhc2VkIG9uIFNlcnZsZXQgMy4xCisgKi8KK2ludGVyZmFjZSBXcml0ZUxpc3RlbmVyIHsKKworICAgIC8qKgorICAgICAqIFdoZW4gYW4gaW5zdGFuY2Ugb2YgdGhlIFdyaXRlTGlzdGVuZXIgaXMgcmVnaXN0ZXJlZCB3aXRoIGEge0BsaW5rIEJvZHlPdXRwdXRTdHJlYW19LAorICAgICAqIHRoaXMgbWV0aG9kIHdpbGwgYmUgaW52b2tlZCBieSB0aGUgY29udGFpbmVyIHRoZSBmaXJzdCB0aW1lIHdoZW4gaXQgaXMgcG9zc2libGUKKyAgICAgKiB0byB3cml0ZSBkYXRhLiBTdWJzZXF1ZW50bHkgdGhlIGNvbnRhaW5lciB3aWxsIGludm9rZSB0aGlzIG1ldGhvZCBpZiBhbmQgb25seQorICAgICAqIGlmIHtAbGluayBCb2R5T3V0cHV0U3RyZWFtI2lzUmVhZHkoKX0gbWV0aG9kCisgICAgICogaGFzIGJlZW4gY2FsbGVkIGFuZCBoYXMgcmV0dXJuZWQgPGNvZGU+ZmFsc2U8L2NvZGU+LgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJL08gcmVsYXRlZCBlcnJvciBoYXMgb2NjdXJyZWQgZHVyaW5nIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICB2b2lkIG9uV3JpdGVQb3NzaWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIEludm9rZWQgd2hlbiBhbiBlcnJvciBvY2N1cnMgd3JpdGluZyBkYXRhIHVzaW5nIHRoZSBub24tYmxvY2tpbmcgQVBJcy4KKyAgICAgKi8KKyAgICB2b2lkIG9uRXJyb3IoZmluYWwgVGhyb3dhYmxlIHQpOworfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9wYWNrYWdlLWluZm8uamF2YSBiL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UyNDlmNwotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoqCisgKiBKZXJzZXkgSmRrIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuc3BpLkNvbm5lY3RvciBjb25uZWN0b3J9IGludGVybmFsIGNsYXNzZXMuCisgKi8KK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamRrLmNvbm5lY3Rvci5pbnRlcm5hbDsKZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvcGFja2FnZS1pbmZvLmphdmEgYi9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3MGIwNWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKKy8qKgorICogSmVyc2V5IGNsaWVudCB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnNwaS5Db25uZWN0b3IgY29ubmVjdG9yfSBiYXNlZCBvbiBKREsgTklPIGZyYW1ld29yay4KKyAqLworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZGsuY29ubmVjdG9yOwpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL2xvY2FsaXphdGlvbi5wcm9wZXJ0aWVzIGIvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL2xvY2FsaXphdGlvbi5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZjAzNDIKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL21haW4vcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMKQEAgLTAsMCArMSw3MyBAQAorIworIyBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisjIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyMKKyMgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorIyBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisjIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorIyB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisjCisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorIworCityZWFkLmxpc3RlbmVyLnNldC5vbmx5Lm9uY2U9IlJlYWQgbGlzdGVuZXIgY2FuIGJlIHNldCBvbmx5IG9uY2UuIgorYXN5bmMub3BlcmF0aW9uLm5vdC5zdXBwb3J0ZWQ9Ik9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkIGluIHN5bmNocm9ub3VzIG1vZGUuIgorc3luYy5vcGVyYXRpb24ubm90LnN1cHBvcnRlZD0iT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgaW4gYXN5bmNocm9ub3VzIG1vZGUuIgord3JpdGUud2hlbi5ub3QucmVhZHk9IkFzeW5jaHJvbm91cyB3cml0ZSBjYWxsZWQgd2hlbiBzdHJlYW0gaXMgaW4gbm9uLXJlYWR5IHN0YXRlLiIKK3N0cmVhbS5jbG9zZWQuZm9yLmlucHV0PSJUaGlzIHN0cmVhbSBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZCBmb3IgaW5wdXQuIgord3JpdGUubGlzdGVuZXIuc2V0Lm9ubHkub25jZT0iV3JpdGUgbGlzdGVuZXIgY2FuIGJlIHNldCBvbmx5IG9uY2UuIgorc3RyZWFtLmNsb3NlZD0iVGhlIHN0cmVhbSBoYXMgYmVlbiBjbG9zZWQuIgord3JpdGluZy5mYWlsZWQ9IldyaXRpbmcgZGF0YSBmYWlsZWQiCitidWZmZXIuaW5jb3JyZWN0Lmxlbmd0aD0iQnVmZmVyIHBhc3NlZCBmb3IgZW5jb2RpbmcgaXMgbmVpdGhlciBhIG11bHRpcGxlIG9mIGNodW5rU2l6ZSBub3Igc21hbGxlciB0aGFuIGNodW5rU2l6ZS4iCitjb25uZWN0b3IuY29uZmlndXJhdGlvbj0iQ29ubmVjdG9yIGNvbmZpZ3VyYXRpb246IHswfS4iCituZWdhdGl2ZS5jaHVuay5zaXplPSJDb25maWd1cmVkIGNodW5rIHNpemUgaXMgbmVnYXRpdmU6IHswfSwgdXNpbmcgZGVmYXVsdCB2YWx1ZTogezF9LiIKK3RpbWVvdXQucmVjZWl2aW5nLnJlc3BvbnNlPSJUaW1lb3V0IHJlY2VpdmluZyByZXNwb25zZS4iCit0aW1lb3V0LnJlY2VpdmluZy5yZXNwb25zZS5ib2R5PSJUaW1lb3V0IHJlY2VpdmluZyByZXNwb25zZSBib2R5LiIKK2Nsb3NlZC53aGlsZS5zZW5kaW5nLnJlcXVlc3Q9IkNvbm5lY3Rpb24gY2xvc2VkIGJ5IHRoZSBzZXJ2ZXIgd2hpbGUgc2VuZGluZyByZXF1ZXN0Ii4KK2Nsb3NlZC53aGlsZS5yZWNlaXZpbmcucmVzcG9uc2U9IkNvbm5lY3Rpb24gY2xvc2VkIGJ5IHRoZSBzZXJ2ZXIgd2hpbGUgcmVjZWl2aW5nIHJlc3BvbnNlLiIKK2Nsb3NlZC53aGlsZS5yZWNlaXZpbmcuYm9keT0iQ29ubmVjdGlvbiBjbG9zZWQgYnkgdGhlIHNlcnZlciB3aGlsZSByZWNlaXZpbmcgcmVzcG9uc2UgYm9keS4iCitjb25uZWN0aW9uLmNsb3NlZD0iQ29ubmVjdGlvbiBjbG9zZWQgYnkgdGhlIHNlcnZlci4iCitjbG9zZWQuYnkuY2xpZW50LndoaWxlLnNlbmRpbmc9IkNvbm5lY3Rpb24gY2xvc2VkIGJ5IHRoZSBjbGllbnQgd2hpbGUgc2VuZGluZyByZXF1ZXN0LiIKK2Nsb3NlZC5ieS5jbGllbnQud2hpbGUucmVjZWl2aW5nPSJDb25uZWN0aW9uIGNsb3NlZCBieSB0aGUgY2xpZW50IHdoaWxlIHJlY2VpdmluZyByZXNwb25zZS4iCitjbG9zZWQuYnkuY2xpZW50LndoaWxlLnJlY2VpdmluZy5ib2R5PSJDb25uZWN0aW9uIGNsb3NlZCBieSB0aGUgY2xpZW50IHdoaWxlIHJlY2VpdmluZyByZXNwb25zZSBib2R5LiIKK2Nvbm5lY3Rpb24udGltZW91dD0iQ29ubmVjdGlvbiB0aW1lZCBvdXQuIgorY29ubmVjdGlvbi5jaGFuZ2luZy5zdGF0ZT0iSFRUUCBjb25uZWN0aW9uIHswfTp7MX0gY2hhbmdpbmcgc3RhdGUgezJ9IC0+IHszfS4iCit1bmV4cGVjdGVkLmRhdGEuaW4uYnVmZmVyPSJVbmV4cGVjdGVkIGRhdGEgcmVtYWluIGluIHRoZSBidWZmZXIgYWZ0ZXIgdGhlIEhUVFAgcmVzcG9uc2UgaGFzIGJlZW4gcGFyc2VkLiIKK2h0dHAuaW5pdGlhbC5saW5lLm92ZXJmbG93PSJIVFRQIHBhY2tldCBpbml0aWFsIGxpbmUgaXMgdG9vIGxhcmdlLiIKK2h0dHAucGFja2V0LmhlYWRlci5vdmVyZmxvdz0iSFRUUCBwYWNrZXQgaGVhZGVyIGlzIHRvbyBsYXJnZS4iCitodHRwLm5lZ2F0aXZlLmNvbnRlbnQubGVuZ3RoPSJDb250ZW50IGxlbmd0aCBjYW5ub3QgYmUgbGVzcyB0aGFuIDAuIgoraHR0cC5pbnZhbGlkLmNvbnRlbnQubGVuZ3RoPSJJbnZhbGlkIGZvcm1hdCBvZiBjb250ZW50IGxlbmd0aCBjb2RlLiIKK2h0dHAucmVxdWVzdC5uby5ib2R5PSJUaGlzIEhUVFAgcmVxdWVzdCBkb2VzIG5vdCBoYXZlIGEgYm9keS4iCitodHRwLnJlcXVlc3Qubm8uYnVmZmVyZWQuYm9keT0iQnVmZmVyZWQgYm9keSBpcyBhdmFpbGFibGUgb25seSBpbiBidWZmZXJlZCBib2R5IG1vZGUuIgoraHR0cC5yZXF1ZXN0LmJvZHkuc2l6ZS5ub3QuYXZhaWxhYmxlPSJCb2R5IHNpemUgaXMgbm90IGF2YWlsYWJsZSBpbiBjaHVua2VkIGJvZHkgbW9kZS4iCitwcm94eS51c2VyLm5hbWUubWlzc2luZz0iVXNlciBuYW1lIGlzIG1pc3NpbmciCitwcm94eS5wYXNzd29yZC5taXNzaW5nPSJQYXNzd29yZCBpcyBtaXNzaW5nIgorcHJveHkucW9wLm5vLnN1cHBvcnRlZD0iVGhlICdxb3AnIChxdWFsaXR5IG9mIHByb3RlY3Rpb24pID0gezB9IGV4dGVuc2lvbiByZXF1ZXN0ZWQgYnkgdGhlIHNlcnZlciBpcyBub3Qgc3VwcG9ydGVkLiBDYW5ub3QgYXV0aGVudGljYXRlIGFnYWluc3QgdGhlIHNlcnZlciB1c2luZyBIdHRwIERpZ2VzdCBBdXRoZW50aWNhdGlvbi4iCitwcm94eS40MDcudHdpY2U9IlJlY2VpdmVkIDQwNyBmb3IgdGhlIHNlY29uZCB0aW1lLiIKK3Byb3h5LmZhaWwuYXV0aC5oZWFkZXI9IkNyZWF0aW5nIGF1dGhvcml6YXRpb24gaGVhZGVyIGZhaWxlZC4iCitwcm94eS5jb25uZWN0LmZhaWw9IkNvbm5lY3RpbmcgdG8gcHJveHkgZmFpbGVkIHdpdGggc3RhdHVzIHswfS4iCitwcm94eS5taXNzaW5nLmF1dGguaGVhZGVyPSJQcm94eS1BdXRoZW50aWNhdGUgaGVhZGVyIHZhbHVlIGlzIG1pc3Npbmcgb3IgZW1wdHkuIgorcHJveHkudW5zdXBwb3J0ZWQuc2NoZW1lPSJVbnN1cHBvcnRlZCBzY2hlbWU6IHswfS4iCityZWRpcmVjdC5uby5sb2NhdGlvbj0iUmVjZWl2ZWQgcmVkaXJlY3QgdGhhdCBkb2VzIG5vdCBjb250YWluIGEgbG9jYXRpb24gb3IgdGhlIGxvY2F0aW9uIGlzIGVtcHR5LiIKK3JlZGlyZWN0LmVycm9yLmRldGVybWluaW5nLmxvY2F0aW9uPSJFcnJvciBkZXRlcm1pbmluZyByZWRpcmVjdCBsb2NhdGlvbi4iCityZWRpcmVjdC5pbmZpbml0ZS5sb29wPSJJbmZpbml0ZSBsb29wIGluIGNoYWluZWQgcmVkaXJlY3RzIGRldGVjdGVkLiIKK3JlZGlyZWN0LmxpbWl0LnJlYWNoZWQ9Ik1heCBjaGFpbmVkIHJlZGlyZWN0IGxpbWl0ICh7MH0pIGV4Y2VlZGVkLiIKK3NzbC5zZXNzaW9uLmNsb3NlZD0iU1NMIHNlc3Npb24gaGFzIGJlZW4gY2xvc2VkLiIKK2h0dHAuYm9keS5zaXplLm92ZXJmbG93PSJCb2R5IHNpemUgZXhjZWVkcyBkZWNsYXJlZCBzaXplIgoraHR0cC5pbnZhbGlkLmNodW5rLnNpemUuaGV4LnZhbHVlPSJJbnZhbGlkIGJ5dGUgcmVwcmVzZW50aW5nIGEgaGV4IHZhbHVlIHdpdGhpbiBhIGNodW5rIGxlbmd0aCBlbmNvdW50ZXJlZCA6IHswfSIKK2h0dHAudW5leHBlY3RlZC5jaHVuay5oZWFkZXI9IlVuZXhwZWN0ZWQgSFRUUCBjaHVuayBoZWFkZXIuIgoraHR0cC5jaHVuay5lbmNvZGluZy5wcmVmaXgub3ZlcmZsb3c9IlRoZSBjaHVua2VkIGVuY29kaW5nIGxlbmd0aCBwcmVmaXggaXMgdG9vIGxhcmdlLiIKK2h0dHAudHJhaWxlci5oZWFkZXIub3ZlcmZsb3c9IlRoZSBjaHVua2VkIGVuY29kaW5nIHRyYWlsZXIgaGVhZGVyIGlzIHRvbyBsYXJnZS4iCit0cmFuc3BvcnQuY29ubmVjdGlvbi5ub3QuY2xvc2VkPSJDb3VsZCBub3QgY2xvc2UgYSBjb25uZWN0aW9uLiIKK3RyYW5zcG9ydC5zZXQuY2xhc3MubG9hZGVyLmZhaWxlZD0iQ2Fubm90IHNldCB0aHJlYWQgY29udGV4dCBjbGFzcyBsb2FkZXIuIgordHJhbnNwb3J0LmV4ZWN1dG9yLmNsb3NlZD0iQ2Fubm90IHNldCB0aHJlYWQgY29udGV4dCBjbGFzcyBsb2FkZXIuIgordHJhbnNwb3J0LmV4ZWN1dG9yLnF1ZXVlLmxpbWl0LnJlYWNoZWQ9IkEgbGltaXQgb2YgY2xpZW50IHRocmVhZCBwb29sIHF1ZXVlIGhhcyBiZWVuIHJlYWNoZWQuIgordGhyZWFkLnBvb2wubWF4LnNpemUudG9vLnNtYWxsPSJNYXggdGhyZWFkIHBvb2wgc2l6ZSBjYW5ub3QgYmUgc21hbGxlciB0aGFuIDMuIgordGhyZWFkLnBvb2wuY29yZS5zaXplLnRvby5zbWFsbD0iQ29yZSB0aHJlYWQgcG9vbCBzaXplIGNhbm5vdCBiZSBzbWFsbGVyIHRoYW4gMC4iCitodHRwLmNvbm5lY3Rpb24uZXN0YWJsaXNoaW5nLmlsbGVnYWwuc3RhdGU9IkNhbm5vdCB0cnkgdG8gZXN0YWJsaXNoIGNvbm5lY3Rpb24gaWYgdGhlIGNvbm5lY3Rpb24gaXMgaW4gb3RoZXIgdGhhbiBDUkVBVEVEIHN0YXRlXAorICAuIEN1cnJlbnQgc3RhdGU6IHswfS4KK2h0dHAuY29ubmVjdGlvbi5ub3QuaWRsZT0iSHR0cCByZXF1ZXN0IGNhbm5vdCBiZSBzZW50IG92ZXIgYSBjb25uZWN0aW9uIHRoYXQgaXMgaW4gb3RoZXIgc3RhdGUgdGhhbiBJRExFLiBDdXJyZW50IHN0YXRlOiB7MH0iIApkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9Bc3luY2hyb25vdXNCb2R5SW5wdXRTdHJlYW1UZXN0LmphdmEgYi9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL0FzeW5jaHJvbm91c0JvZHlJbnB1dFN0cmVhbVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDlmNjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9Bc3luY2hyb25vdXNCb2R5SW5wdXRTdHJlYW1UZXN0LmphdmEKQEAgLTAsMCArMSw0MDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamRrLmNvbm5lY3Rvci5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UuYXNzZXJ0TnVsbDsKKworLyoqCisgKiBAYXV0aG9yIFBldHIgSmFub3VjaCAocGV0ci5qYW5vdWNoIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBBc3luY2hyb25vdXNCb2R5SW5wdXRTdHJlYW1UZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJhc2ljQXN5bmNSZWFkKCkgeworICAgICAgICBBc3luY2hyb25vdXNCb2R5SW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEFzeW5jaHJvbm91c0JvZHlJbnB1dFN0cmVhbSgpOworICAgICAgICBkb1Rlc3RCYXNpY0FzeW5jUmVhZChzdHJlYW0sIG5ldyBUZXN0UmVhZExpc3RlbmVyKHN0cmVhbSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJhc2ljQXN5bmNBcnJheVJlYWQoKSB7CisgICAgICAgIEFzeW5jaHJvbm91c0JvZHlJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQXN5bmNocm9ub3VzQm9keUlucHV0U3RyZWFtKCk7CisgICAgICAgIGRvVGVzdEJhc2ljQXN5bmNSZWFkKHN0cmVhbSwgbmV3IFRlc3RSZWFkTGlzdGVuZXIoc3RyZWFtLCAxNSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJhc2ljQXN5bmNSZWFkV2l0aEV4Y2VwdGlvbigpIHsKKyAgICAgICAgQXN5bmNocm9ub3VzQm9keUlucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBBc3luY2hyb25vdXNCb2R5SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgZG9UZXN0QmFzaWNBc3luY1JlYWRXaXRoRXhjZXB0aW9uKHN0cmVhbSwgbmV3IFRlc3RSZWFkTGlzdGVuZXIoc3RyZWFtKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFzaWNBc3luY0FycmF5UmVhZFdpdGhFeGNlcHRpb24oKSB7CisgICAgICAgIEFzeW5jaHJvbm91c0JvZHlJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQXN5bmNocm9ub3VzQm9keUlucHV0U3RyZWFtKCk7CisgICAgICAgIGRvVGVzdEJhc2ljQXN5bmNSZWFkV2l0aEV4Y2VwdGlvbihzdHJlYW0sIG5ldyBUZXN0UmVhZExpc3RlbmVyKHN0cmVhbSwgMTUpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0ZW5lckV4ZWN1dG9yKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQXN5bmNocm9ub3VzQm9keUlucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBBc3luY2hyb25vdXNCb2R5SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yKCk7CisgICAgICAgIFRocmVhZCBtYWluVGhyZWFkID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKKyAgICAgICAgZmluYWwgQXRvbWljUmVmZXJlbmNlPFRocmVhZD4gZGF0YUF2YWlsYWJsZVRocmVhZCA9IG5ldyBBdG9taWNSZWZlcmVuY2U8PigpOworICAgICAgICBmaW5hbCBBdG9taWNSZWZlcmVuY2U8VGhyZWFkPiBhbGxEYXRhUmVhZFRocmVhZCA9IG5ldyBBdG9taWNSZWZlcmVuY2U8PigpOworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN0cmVhbS5zZXRMaXN0ZW5lckV4ZWN1dG9yKGV4ZWN1dG9yKTsKKyAgICAgICAgICAgIHN0cmVhbS5zZXRSZWFkTGlzdGVuZXIobmV3IFJlYWRMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkRhdGFBdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICBkYXRhQXZhaWxhYmxlVGhyZWFkLnNldChUaHJlYWQuY3VycmVudFRocmVhZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHN0cmVhbS5pc1JlYWR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5yZWFkKCk7CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQWxsRGF0YVJlYWQoKSB7CisgICAgICAgICAgICAgICAgICAgIGFsbERhdGFSZWFkVGhyZWFkLnNldChUaHJlYWQuY3VycmVudFRocmVhZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihUaHJvd2FibGUgdCkgeworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIHN0cmVhbS5ub3RpZnlEYXRhQXZhaWxhYmxlKHN0cmluZ1RvQnVmZmVyKCJNZXNzYWdlIikpOworICAgICAgICAgICAgc3RyZWFtLm5vdGlmeUFsbERhdGFSZWFkKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGxhdGNoLmF3YWl0KDUsIFRpbWVVbml0LlNFQ09ORFMpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGV4ZWN1dG9yLnNodXRkb3duTm93KCk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnROb3RFcXVhbHMobWFpblRocmVhZCwgZGF0YUF2YWlsYWJsZVRocmVhZC5nZXQoKSk7CisgICAgICAgIGFzc2VydE5vdEVxdWFscyhtYWluVGhyZWFkLCBhbGxEYXRhUmVhZFRocmVhZC5nZXQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGF0YUJlZm9yZUFzeW5jTW9kZUNvbW1pdCgpIHsKKyAgICAgICAgQXN5bmNocm9ub3VzQm9keUlucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBBc3luY2hyb25vdXNCb2R5SW5wdXRTdHJlYW0oKTsKKworICAgICAgICBTdHJpbmcgbXNnMSA9ICJBQUFBQUFBQUFBQUFBQUFBQUFBQSI7CisgICAgICAgIFN0cmluZyBtc2cyID0gIkJCQkJCQkJCQkJCQkIiOworICAgICAgICBTdHJpbmcgbXNnMyA9ICJDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0MiOworICAgICAgICBTdHJpbmcgbXNnNCA9ICJERERERCI7CisKKyAgICAgICAgc3RyZWFtLm5vdGlmeURhdGFBdmFpbGFibGUoc3RyaW5nVG9CdWZmZXIobXNnMSkpOworICAgICAgICBzdHJlYW0ubm90aWZ5RGF0YUF2YWlsYWJsZShzdHJpbmdUb0J1ZmZlcihtc2cyKSk7CisKKyAgICAgICAgVGVzdFJlYWRMaXN0ZW5lciByZWFkTGlzdGVuZXIgPSBuZXcgVGVzdFJlYWRMaXN0ZW5lcihzdHJlYW0pOworICAgICAgICBzdHJlYW0uc2V0UmVhZExpc3RlbmVyKHJlYWRMaXN0ZW5lcik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1zZzEgKyBtc2cyLCByZWFkTGlzdGVuZXIuZ2V0UmVjZWl2ZWREYXRhKCkpOworCisgICAgICAgIHN0cmVhbS5ub3RpZnlEYXRhQXZhaWxhYmxlKHN0cmluZ1RvQnVmZmVyKG1zZzMpKTsKKyAgICAgICAgc3RyZWFtLm5vdGlmeURhdGFBdmFpbGFibGUoc3RyaW5nVG9CdWZmZXIobXNnNCkpOworCisgICAgICAgIHN0cmVhbS5ub3RpZnlBbGxEYXRhUmVhZCgpOworCisgICAgICAgIGFzc2VydEVxdWFscyhtc2cxICsgbXNnMiArIG1zZzMgKyBtc2c0LCByZWFkTGlzdGVuZXIuZ2V0UmVjZWl2ZWREYXRhKCkpOworICAgICAgICBhc3NlcnRUcnVlKHJlYWRMaXN0ZW5lci5pc0FsbERhdGFSZWFkKCkpOworICAgICAgICBhc3NlcnROdWxsKHJlYWRMaXN0ZW5lci5nZXRFcnJvcigpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REYXRhQmVmb3JlU3luY01vZGVDb21taXQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBBc3luY2hyb25vdXNCb2R5SW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEFzeW5jaHJvbm91c0JvZHlJbnB1dFN0cmVhbSgpOworCisgICAgICAgIFN0cmluZyBtc2cxID0gIkFBQUFBQUFBQUFBQUFBQUFBQUFBIjsKKyAgICAgICAgU3RyaW5nIG1zZzIgPSAiQkJCQkJCQkJCQkJCQiI7CisgICAgICAgIFN0cmluZyBtc2czID0gIkNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQyI7CisgICAgICAgIFN0cmluZyBtc2c0ID0gIkREREREIjsKKworICAgICAgICBzdHJlYW0ubm90aWZ5RGF0YUF2YWlsYWJsZShzdHJpbmdUb0J1ZmZlcihtc2cxKSk7CisgICAgICAgIHN0cmVhbS5ub3RpZnlEYXRhQXZhaWxhYmxlKHN0cmluZ1RvQnVmZmVyKG1zZzIpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoKG1zZzEgKyBtc2cyKS5sZW5ndGgoKSwgc3RyZWFtLmF2YWlsYWJsZSgpKTsKKworICAgICAgICBzdHJlYW0ubm90aWZ5RGF0YUF2YWlsYWJsZShzdHJpbmdUb0J1ZmZlcihtc2czKSk7CisgICAgICAgIHN0cmVhbS5ub3RpZnlEYXRhQXZhaWxhYmxlKHN0cmluZ1RvQnVmZmVyKG1zZzQpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoKG1zZzEgKyBtc2cyICsgbXNnMyArIG1zZzQpLmxlbmd0aCgpLCBzdHJlYW0uYXZhaWxhYmxlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFsbERhdGFCZWZvcmVBc3luY01vZGVDb21taXQoKSB7CisgICAgICAgIEFzeW5jaHJvbm91c0JvZHlJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQXN5bmNocm9ub3VzQm9keUlucHV0U3RyZWFtKCk7CisKKyAgICAgICAgU3RyaW5nIG1zZzEgPSAiQUFBQUFBQUFBQUFBQUFBQUFBQUEiOworICAgICAgICBTdHJpbmcgbXNnMiA9ICJCQkJCQkJCQkJCQkJCIjsKKworICAgICAgICBzdHJlYW0ubm90aWZ5RGF0YUF2YWlsYWJsZShzdHJpbmdUb0J1ZmZlcihtc2cxKSk7CisgICAgICAgIHN0cmVhbS5ub3RpZnlEYXRhQXZhaWxhYmxlKHN0cmluZ1RvQnVmZmVyKG1zZzIpKTsKKworICAgICAgICBzdHJlYW0ubm90aWZ5QWxsRGF0YVJlYWQoKTsKKworICAgICAgICBUZXN0UmVhZExpc3RlbmVyIHJlYWRMaXN0ZW5lciA9IG5ldyBUZXN0UmVhZExpc3RlbmVyKHN0cmVhbSk7CisgICAgICAgIHN0cmVhbS5zZXRSZWFkTGlzdGVuZXIocmVhZExpc3RlbmVyKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMobXNnMSArIG1zZzIsIHJlYWRMaXN0ZW5lci5nZXRSZWNlaXZlZERhdGEoKSk7CisgICAgICAgIGFzc2VydFRydWUocmVhZExpc3RlbmVyLmlzQWxsRGF0YVJlYWQoKSk7CisgICAgICAgIGFzc2VydE51bGwocmVhZExpc3RlbmVyLmdldEVycm9yKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFsbERhdGFCZWZvcmVTeW5jTW9kZUNvbW1pdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEFzeW5jaHJvbm91c0JvZHlJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQXN5bmNocm9ub3VzQm9keUlucHV0U3RyZWFtKCk7CisKKyAgICAgICAgU3RyaW5nIG1zZzEgPSAiQUFBQUFBQUFBQUFBQUFBQUFBQUEiOworICAgICAgICBTdHJpbmcgbXNnMiA9ICJCQkJCQkJCQkJCQkJCIjsKKworICAgICAgICBzdHJlYW0ubm90aWZ5RGF0YUF2YWlsYWJsZShzdHJpbmdUb0J1ZmZlcihtc2cxKSk7CisgICAgICAgIHN0cmVhbS5ub3RpZnlEYXRhQXZhaWxhYmxlKHN0cmluZ1RvQnVmZmVyKG1zZzIpKTsKKworICAgICAgICBzdHJlYW0ubm90aWZ5QWxsRGF0YVJlYWQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoKG1zZzEgKyBtc2cyKS5sZW5ndGgoKSwgc3RyZWFtLmF2YWlsYWJsZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFcnJvckJlZm9yZUFzeW5jTW9kZUNvbW1pdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEFzeW5jaHJvbm91c0JvZHlJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQXN5bmNocm9ub3VzQm9keUlucHV0U3RyZWFtKCk7CisKKyAgICAgICAgU3RyaW5nIG1zZzEgPSAiQUFBQUFBQUFBQUFBQUFBQUFBQUEiOworICAgICAgICBTdHJpbmcgbXNnMiA9ICJCQkJCQkJCQkJCQkJCIjsKKworICAgICAgICBzdHJlYW0ubm90aWZ5RGF0YUF2YWlsYWJsZShzdHJpbmdUb0J1ZmZlcihtc2cxKSk7CisgICAgICAgIHN0cmVhbS5ub3RpZnlEYXRhQXZhaWxhYmxlKHN0cmluZ1RvQnVmZmVyKG1zZzIpKTsKKworICAgICAgICBUaHJvd2FibGUgdCA9IG5ldyBUaHJvd2FibGUoKTsKKyAgICAgICAgc3RyZWFtLm5vdGlmeUVycm9yKHQpOworCisgICAgICAgIFRlc3RSZWFkTGlzdGVuZXIgcmVhZExpc3RlbmVyID0gbmV3IFRlc3RSZWFkTGlzdGVuZXIoc3RyZWFtKTsKKyAgICAgICAgc3RyZWFtLnNldFJlYWRMaXN0ZW5lcihyZWFkTGlzdGVuZXIpOworCisgICAgICAgIGFzc2VydEVxdWFscyhtc2cxICsgbXNnMiwgcmVhZExpc3RlbmVyLmdldFJlY2VpdmVkRGF0YSgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocmVhZExpc3RlbmVyLmlzQWxsRGF0YVJlYWQoKSk7CisgICAgICAgIGFzc2VydFRydWUocmVhZExpc3RlbmVyLmdldEVycm9yKCkgPT0gdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXJyb3JCZWZvcmVTeW5jTW9kZUNvbW1pdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEFzeW5jaHJvbm91c0JvZHlJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQXN5bmNocm9ub3VzQm9keUlucHV0U3RyZWFtKCk7CisKKyAgICAgICAgU3RyaW5nIG1zZzEgPSAiQUFBQUFBQUFBQUFBQUFBQUFBQUEiOworICAgICAgICBTdHJpbmcgbXNnMiA9ICJCQkJCQkJCQkJCQkJCIjsKKworICAgICAgICBzdHJlYW0ubm90aWZ5RGF0YUF2YWlsYWJsZShzdHJpbmdUb0J1ZmZlcihtc2cxKSk7CisgICAgICAgIHN0cmVhbS5ub3RpZnlEYXRhQXZhaWxhYmxlKHN0cmluZ1RvQnVmZmVyKG1zZzIpKTsKKworICAgICAgICBUaHJvd2FibGUgdCA9IG5ldyBUaHJvd2FibGUoKTsKKyAgICAgICAgc3RyZWFtLm5vdGlmeUVycm9yKHQpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdHJlYW0uYXZhaWxhYmxlKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGUuZ2V0Q2F1c2UoKSA9PSB0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVuc3VwcG9ydGVkU3luYygpIHsKKyAgICAgICAgZmluYWwgQXN5bmNocm9ub3VzQm9keUlucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBBc3luY2hyb25vdXNCb2R5SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIHRvdWNoIHRoaXMgc3RyZWFtIHRvIG1ha2UgaXQgc3luY2hyb25vdXMKKyAgICAgICAgICAgIHN0cmVhbS50cnlSZWFkKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRVbnN1cHBvcnRlZCgoKSAtPiB7CisgICAgICAgICAgICBzdHJlYW0uaXNSZWFkeSgpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0pOworCisgICAgICAgIGFzc2VydFVuc3VwcG9ydGVkKCgpIC0+IHsKKyAgICAgICAgICAgIHN0cmVhbS5zZXRSZWFkTGlzdGVuZXIobmV3IFRlc3RSZWFkTGlzdGVuZXIoc3RyZWFtKSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSk7CisKKyAgICAgICAgYXNzZXJ0VW5zdXBwb3J0ZWQoKCkgLT4geworICAgICAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yU2VydmljZSA9IEV4ZWN1dG9ycy5uZXdTaW5nbGVUaHJlYWRFeGVjdXRvcigpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzdHJlYW0uc2V0TGlzdGVuZXJFeGVjdXRvcihleGVjdXRvclNlcnZpY2UpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBleGVjdXRvclNlcnZpY2Uuc2h1dGRvd25Ob3coKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVbnN1cHBvcnRlZEFzeW5jKCkgeworICAgICAgICBmaW5hbCBBc3luY2hyb25vdXNCb2R5SW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEFzeW5jaHJvbm91c0JvZHlJbnB1dFN0cmVhbSgpOworICAgICAgICBzdHJlYW0uc2V0UmVhZExpc3RlbmVyKG5ldyBUZXN0UmVhZExpc3RlbmVyKHN0cmVhbSkpOworCisgICAgICAgIGFzc2VydFVuc3VwcG9ydGVkKCgpIC0+IHsKKyAgICAgICAgICAgIHN0cmVhbS50cnlSZWFkKCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSk7CisKKyAgICAgICAgYXNzZXJ0VW5zdXBwb3J0ZWQoKCkgLT4geworICAgICAgICAgICAgc3RyZWFtLnRyeVJlYWQobmV3IGJ5dGVbMTBdKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9KTsKKworICAgICAgICBhc3NlcnRVbnN1cHBvcnRlZCgoKSAtPiB7CisgICAgICAgICAgICBzdHJlYW0udHJ5UmVhZChuZXcgYnl0ZVsxMF0sIDAsIDEwKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9KTsKKworICAgICAgICBhc3NlcnRVbnN1cHBvcnRlZCgoKSAtPiBzdHJlYW0uc2tpcCgxMCkpOworCisgICAgICAgIGFzc2VydFVuc3VwcG9ydGVkKCgpIC0+IHN0cmVhbS5hdmFpbGFibGUoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvVGVzdEJhc2ljQXN5bmNSZWFkKEFzeW5jaHJvbm91c0JvZHlJbnB1dFN0cmVhbSBzdHJlYW0sIFRlc3RSZWFkTGlzdGVuZXIgcmVhZExpc3RlbmVyKSB7CisgICAgICAgIHN0cmVhbS5zZXRSZWFkTGlzdGVuZXIocmVhZExpc3RlbmVyKTsKKworICAgICAgICBTdHJpbmcgbXNnMSA9ICJBQUFBQUFBQUFBQUFBQUFBQUFBQSI7CisgICAgICAgIFN0cmluZyBtc2cyID0gIkJCQkJCQkJCQkJCQkIiOworICAgICAgICBTdHJpbmcgbXNnMyA9ICJDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0MiOworICAgICAgICBzdHJlYW0ubm90aWZ5RGF0YUF2YWlsYWJsZShzdHJpbmdUb0J1ZmZlcihtc2cxKSk7CisgICAgICAgIHN0cmVhbS5ub3RpZnlEYXRhQXZhaWxhYmxlKHN0cmluZ1RvQnVmZmVyKG1zZzIpKTsKKyAgICAgICAgc3RyZWFtLm5vdGlmeURhdGFBdmFpbGFibGUoc3RyaW5nVG9CdWZmZXIobXNnMykpOworICAgICAgICBzdHJlYW0ubm90aWZ5QWxsRGF0YVJlYWQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMobXNnMSArIG1zZzIgKyBtc2czLCByZWFkTGlzdGVuZXIuZ2V0UmVjZWl2ZWREYXRhKCkpOworICAgICAgICBhc3NlcnRUcnVlKHJlYWRMaXN0ZW5lci5pc0FsbERhdGFSZWFkKCkpOworICAgICAgICBhc3NlcnROdWxsKHJlYWRMaXN0ZW5lci5nZXRFcnJvcigpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9UZXN0QmFzaWNBc3luY1JlYWRXaXRoRXhjZXB0aW9uKEFzeW5jaHJvbm91c0JvZHlJbnB1dFN0cmVhbSBzdHJlYW0sIFRlc3RSZWFkTGlzdGVuZXIgcmVhZExpc3RlbmVyKSB7CisgICAgICAgIHN0cmVhbS5zZXRSZWFkTGlzdGVuZXIocmVhZExpc3RlbmVyKTsKKworICAgICAgICBTdHJpbmcgbXNnMSA9ICJBQUFBQUFBQUFBQUFBQUFBQUFBQSI7CisgICAgICAgIFN0cmluZyBtc2cyID0gIkJCQkJCQkJCQkJCQkIiOworICAgICAgICBTdHJpbmcgbXNnMyA9ICJDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0MiOworICAgICAgICBzdHJlYW0ubm90aWZ5RGF0YUF2YWlsYWJsZShzdHJpbmdUb0J1ZmZlcihtc2cxKSk7CisgICAgICAgIHN0cmVhbS5ub3RpZnlEYXRhQXZhaWxhYmxlKHN0cmluZ1RvQnVmZmVyKG1zZzIpKTsKKyAgICAgICAgc3RyZWFtLm5vdGlmeURhdGFBdmFpbGFibGUoc3RyaW5nVG9CdWZmZXIobXNnMykpOworICAgICAgICBUaHJvd2FibGUgdCA9IG5ldyBUaHJvd2FibGUoKTsKKyAgICAgICAgc3RyZWFtLm5vdGlmeUVycm9yKHQpOworCisgICAgICAgIGFzc2VydEVxdWFscyhtc2cxICsgbXNnMiArIG1zZzMsIHJlYWRMaXN0ZW5lci5nZXRSZWNlaXZlZERhdGEoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHJlYWRMaXN0ZW5lci5pc0FsbERhdGFSZWFkKCkpOworICAgICAgICBhc3NlcnRUcnVlKHJlYWRMaXN0ZW5lci5nZXRFcnJvcigpID09IHQpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0VW5zdXBwb3J0ZWQoQ2FsbGFibGUgdW5zdXBwb3J0ZWQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHVuc3VwcG9ydGVkLmNhbGwoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBCeXRlQnVmZmVyIHN0cmluZ1RvQnVmZmVyKFN0cmluZyBzdHIpIHsKKyAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXIud3JhcChzdHIuZ2V0Qnl0ZXMoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGVzdFJlYWRMaXN0ZW5lciBpbXBsZW1lbnRzIFJlYWRMaXN0ZW5lciB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcmVjZWl2ZWREYXRhID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBwcml2YXRlIGZpbmFsIEFzeW5jaHJvbm91c0JvZHlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgaW5wdXRBcnJheVNpemU7CisKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBUaHJvd2FibGUgZXJyb3IgPSBudWxsOworICAgICAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gYWxsRGF0YVJlYWQgPSBmYWxzZTsKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGxpc3RlbmVyQ2FsbEV4cGVjdGVkID0gdHJ1ZTsKKworICAgICAgICBwdWJsaWMgVGVzdFJlYWRMaXN0ZW5lcihBc3luY2hyb25vdXNCb2R5SW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIGludCBpbnB1dEFycmF5U2l6ZSkgeworICAgICAgICAgICAgdGhpcy5pbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtOworICAgICAgICAgICAgdGhpcy5pbnB1dEFycmF5U2l6ZSA9IGlucHV0QXJyYXlTaXplOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRlc3RSZWFkTGlzdGVuZXIoQXN5bmNocm9ub3VzQm9keUlucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7CisgICAgICAgICAgICB0aGlzLmlucHV0U3RyZWFtID0gaW5wdXRTdHJlYW07CisgICAgICAgICAgICB0aGlzLmlucHV0QXJyYXlTaXplID0gLTE7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25EYXRhQXZhaWxhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmICghbGlzdGVuZXJDYWxsRXhwZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxpc3RlbmVyQ2FsbEV4cGVjdGVkID0gZmFsc2U7CisgICAgICAgICAgICB3aGlsZSAoaW5wdXRTdHJlYW0uaXNSZWFkeSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dEFycmF5U2l6ZSA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWREYXRhLndyaXRlKGlucHV0U3RyZWFtLnJlYWQoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gaW5wdXRBcnJheSA9IG5ldyBieXRlW2lucHV0QXJyYXlTaXplXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWFkID0gaW5wdXRTdHJlYW0ucmVhZChpbnB1dEFycmF5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkRGF0YS53cml0ZShpbnB1dEFycmF5LCAwLCByZWFkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsaXN0ZW5lckNhbGxFeHBlY3RlZCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25BbGxEYXRhUmVhZCgpIHsKKyAgICAgICAgICAgIGFsbERhdGFSZWFkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBlcnJvciA9IHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0FsbERhdGFSZWFkKCkgeworICAgICAgICAgICAgcmV0dXJuIGFsbERhdGFSZWFkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRocm93YWJsZSBnZXRFcnJvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVjZWl2ZWREYXRhKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcocmVjZWl2ZWREYXRhLnRvQnl0ZUFycmF5KCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9Bc3luY2hyb25vdXNCb2R5T3V0cHV0U3RyZWFtVGVzdC5qYXZhIGIvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9Bc3luY2hyb25vdXNCb2R5T3V0cHV0U3RyZWFtVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZTIxYmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL0FzeW5jaHJvbm91c0JvZHlPdXRwdXRTdHJlYW1UZXN0LmphdmEKQEAgLTAsMCArMSw2MDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamRrLmNvbm5lY3Rvci5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5Xcml0ZVBlbmRpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLlF1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lb3V0RXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LmFzc2VydE5vdE51bGw7CisKKy8qKgorICogQGF1dGhvciBQZXRyIEphbm91Y2ggKHBldHIuamFub3VjaCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQXN5bmNocm9ub3VzQm9keU91dHB1dFN0cmVhbVRlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFzaWNBc3luY1dyaXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZG9UZXN0QXN5bmNXcml0ZShmYWxzZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFzaWNBc3luY0FycmF5V3JpdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBkb1Rlc3RBc3luY1dyaXRlKHRydWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNldExpc3RlbmVyQWZ0ZXJPcGVuaW5nU3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgVGVzdFN0cmVhbSBzdHJlYW0gPSBuZXcgVGVzdFN0cmVhbSg2KTsKKyAgICAgICAgTW9ja1RyYW5zcG9ydEZpbHRlciB0cmFuc3BvcnRGaWx0ZXIgPSBuZXcgTW9ja1RyYW5zcG9ydEZpbHRlcigpOworICAgICAgICBTdHJpbmcgbXNnMSA9ICJBQUFBQUFBQUFBQUFBQUFBQUFBQSI7CisgICAgICAgIFN0cmluZyBtc2cyID0gIkJCQkJCQkJCQkJCQkIiOworICAgICAgICBTdHJpbmcgbXNnMyA9ICJDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0MiOworCisgICAgICAgIFRlc3RXcml0ZUxpc3RlbmVyIHdyaXRlTGlzdGVuZXIgPSBuZXcgVGVzdFdyaXRlTGlzdGVuZXIoc3RyZWFtLCAtMSk7CisgICAgICAgIHdyaXRlTGlzdGVuZXIud3JpdGUobXNnMSk7CisgICAgICAgIHN0cmVhbS5vcGVuKHRyYW5zcG9ydEZpbHRlcik7CisgICAgICAgIHN0cmVhbS5zZXRXcml0ZUxpc3RlbmVyKHdyaXRlTGlzdGVuZXIpOworICAgICAgICB3cml0ZUxpc3RlbmVyLndyaXRlKG1zZzIpOworICAgICAgICB3cml0ZUxpc3RlbmVyLndyaXRlKG1zZzMpOworICAgICAgICBzdHJlYW0uY2xvc2UoKTsKKworICAgICAgICBpZiAod3JpdGVMaXN0ZW5lci5nZXRFcnJvcigpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdyaXRlTGlzdGVuZXIuZ2V0RXJyb3IoKS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMobXNnMSArIG1zZzIgKyBtc2czLCB0cmFuc3BvcnRGaWx0ZXIuZ2V0V3JpdHRlbkRhdGEoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGVzdEFzeW5jV3JpdGVXaXRoRGVsYXkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBkb1Rlc3RBc3luY1dyaXRlV2l0aERlbGF5KGZhbHNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUZXN0QXN5bmNXcml0ZUFycmF5V2l0aERlbGF5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZG9UZXN0QXN5bmNXcml0ZVdpdGhEZWxheSh0cnVlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luY0ZsdXNoKCkgeworICAgICAgICBUZXN0U3RyZWFtIHN0cmVhbSA9IG5ldyBUZXN0U3RyZWFtKDYpOworICAgICAgICBTdHJpbmcgbXNnMSA9ICJBQUFBQUFBQUFBQUFBQUFBQUFBQSI7CisgICAgICAgIFN0cmluZyBtc2cyID0gIkJCQkJCQkJCQkJCQkIiOworICAgICAgICBTdHJpbmcgbXNnMyA9ICJDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0MiOworICAgICAgICBTdHJpbmcgbXNnNCA9ICJEREREREREIjsKKyAgICAgICAgVGVzdFdyaXRlTGlzdGVuZXIgd3JpdGVMaXN0ZW5lciA9IG5ldyBUZXN0V3JpdGVMaXN0ZW5lcihzdHJlYW0sIC0xKTsKKyAgICAgICAgc3RyZWFtLnNldFdyaXRlTGlzdGVuZXIod3JpdGVMaXN0ZW5lcik7CisKKyAgICAgICAgTW9ja1RyYW5zcG9ydEZpbHRlciB0cmFuc3BvcnRGaWx0ZXIgPSBuZXcgTW9ja1RyYW5zcG9ydEZpbHRlcigpOworICAgICAgICB3cml0ZUxpc3RlbmVyLndyaXRlKG1zZzEpOworICAgICAgICB0cmFuc3BvcnRGaWx0ZXIuYmxvY2soKTsKKyAgICAgICAgc3RyZWFtLm9wZW4odHJhbnNwb3J0RmlsdGVyKTsKKyAgICAgICAgd3JpdGVMaXN0ZW5lci5mbHVzaCgpOworICAgICAgICAvLyB0ZXN0IHNvbWVvbmUgZ29pbmcgY3Jhenkgd2l0aCBmbHVzaAorICAgICAgICB3cml0ZUxpc3RlbmVyLmZsdXNoKCk7CisgICAgICAgIHRyYW5zcG9ydEZpbHRlci51bmJsb2NrKCk7CisgICAgICAgIHRyYW5zcG9ydEZpbHRlci5ibG9jaygpOworICAgICAgICB3cml0ZUxpc3RlbmVyLndyaXRlKG1zZzIpOworICAgICAgICB0cmFuc3BvcnRGaWx0ZXIudW5ibG9jaygpOworICAgICAgICB3cml0ZUxpc3RlbmVyLmZsdXNoKCk7CisgICAgICAgIHRyYW5zcG9ydEZpbHRlci5ibG9jaygpOworICAgICAgICB3cml0ZUxpc3RlbmVyLndyaXRlKG1zZzMpOworICAgICAgICB3cml0ZUxpc3RlbmVyLmZsdXNoKCk7CisgICAgICAgIHdyaXRlTGlzdGVuZXIud3JpdGUobXNnNCk7CisKKyAgICAgICAgd3JpdGVMaXN0ZW5lci5mbHVzaCgpOworICAgICAgICB3cml0ZUxpc3RlbmVyLmNsb3NlKCk7CisgICAgICAgIHRyYW5zcG9ydEZpbHRlci51bmJsb2NrKCk7CisKKyAgICAgICAgaWYgKHdyaXRlTGlzdGVuZXIuZ2V0RXJyb3IoKSAhPSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZUxpc3RlbmVyLmdldEVycm9yKCkucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRFcXVhbHMobXNnMSArIG1zZzIgKyBtc2czICsgbXNnNCwgdHJhbnNwb3J0RmlsdGVyLmdldFdyaXR0ZW5EYXRhKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFzeW5jRXhjZXB0aW9uKCkgeworICAgICAgICBUZXN0U3RyZWFtIHN0cmVhbSA9IG5ldyBUZXN0U3RyZWFtKDYpOworICAgICAgICBTdHJpbmcgbXNnMSA9ICJBQUFBQUFBQUFBQUFBQUFBQUFBQSI7CisKKyAgICAgICAgVGVzdFdyaXRlTGlzdGVuZXIgd3JpdGVMaXN0ZW5lciA9IG5ldyBUZXN0V3JpdGVMaXN0ZW5lcihzdHJlYW0sIC0xKTsKKyAgICAgICAgc3RyZWFtLnNldFdyaXRlTGlzdGVuZXIod3JpdGVMaXN0ZW5lcik7CisKKyAgICAgICAgTW9ja1RyYW5zcG9ydEZpbHRlciB0cmFuc3BvcnRGaWx0ZXIgPSBuZXcgTW9ja1RyYW5zcG9ydEZpbHRlcigpOworICAgICAgICBzdHJlYW0ub3Blbih0cmFuc3BvcnRGaWx0ZXIpOworICAgICAgICBUaHJvd2FibGUgdCA9IG5ldyBUaHJvd2FibGUoKTsKKyAgICAgICAgdHJhbnNwb3J0RmlsdGVyLnNldEV4Y2VwdGlvbih0KTsKKyAgICAgICAgd3JpdGVMaXN0ZW5lci53cml0ZShtc2cxKTsKKworICAgICAgICBhc3NlcnROb3ROdWxsKHdyaXRlTGlzdGVuZXIuZ2V0RXJyb3IoKSk7CisgICAgICAgIGFzc2VydFRydWUodCA9PSB3cml0ZUxpc3RlbmVyLmdldEVycm9yKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJhc2ljU3luY1dyaXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgZG9UZXN0U3luY1dyaXRlKGZhbHNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCYXNpY1N5bmNBcnJheVdyaXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgZG9UZXN0U3luY1dyaXRlKHRydWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN5bmNXcml0ZVdpdGhEZWxheSgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGRvVGVzdFN5bmNXcml0ZVdpdGhEZWxheShmYWxzZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3luY0FycmF5V3JpdGVXaXRoRGVsYXkoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24geworICAgICAgICBkb1Rlc3RTeW5jV3JpdGVXaXRoRGVsYXkodHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNXcml0ZVdoZW5Ob3RSZWFkeSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFRlc3RTdHJlYW0gc3RyZWFtID0gbmV3IFRlc3RTdHJlYW0oNik7CisgICAgICAgIFRlc3RXcml0ZUxpc3RlbmVyIHdyaXRlTGlzdGVuZXIgPSBuZXcgVGVzdFdyaXRlTGlzdGVuZXIoc3RyZWFtLCAtMSk7CisgICAgICAgIHN0cmVhbS5zZXRXcml0ZUxpc3RlbmVyKHdyaXRlTGlzdGVuZXIpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdHJlYW0ud3JpdGUoKGJ5dGUpICdhJyk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5zdXBwb3J0ZWRTeW5jKCkgeworICAgICAgICBmaW5hbCBUZXN0U3RyZWFtIHN0cmVhbSA9IG5ldyBUZXN0U3RyZWFtKDEwKTsKKyAgICAgICAgc3RyZWFtLm9wZW4obmV3IE1vY2tUcmFuc3BvcnRGaWx0ZXIoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyB0b3VjaCB0aGlzIHN0cmVhbSB0byBtYWtlIGl0IHN5bmNocm9ub3VzCisgICAgICAgICAgICBzdHJlYW0ud3JpdGUoKGJ5dGUpICdhJyk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRVbnN1cHBvcnRlZCgoKSAtPiB7CisgICAgICAgICAgICBzdHJlYW0uaXNSZWFkeSgpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0pOworCisgICAgICAgIGFzc2VydFVuc3VwcG9ydGVkKCgpIC0+IHsKKyAgICAgICAgICAgIHN0cmVhbS5zZXRXcml0ZUxpc3RlbmVyKG5ldyBUZXN0V3JpdGVMaXN0ZW5lcihzdHJlYW0pKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTeW5jRXhjZXB0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgVGVzdFN0cmVhbSBzdHJlYW0gPSBuZXcgVGVzdFN0cmVhbSgxKTsKKworICAgICAgICBNb2NrVHJhbnNwb3J0RmlsdGVyIHRyYW5zcG9ydEZpbHRlciA9IG5ldyBNb2NrVHJhbnNwb3J0RmlsdGVyKCk7CisgICAgICAgIHN0cmVhbS5vcGVuKHRyYW5zcG9ydEZpbHRlcik7CisgICAgICAgIFRocm93YWJsZSB0ID0gbmV3IFRocm93YWJsZSgpOworICAgICAgICB0cmFuc3BvcnRGaWx0ZXIuc2V0RXhjZXB0aW9uKHQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3RyZWFtLndyaXRlKCJhYWEiLmdldEJ5dGVzKCkpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHQgPT0gZS5nZXRDYXVzZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb1Rlc3RTeW5jV3JpdGUoZmluYWwgYm9vbGVhbiB1c2VBcnJheSkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIFRlc3RTdHJlYW0gc3RyZWFtID0gbmV3IFRlc3RTdHJlYW0oNik7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnMSA9ICJBQUFBQUFBQUFBQUFBQUFBQUFBQSI7CisgICAgICAgICAgICBTdHJpbmcgbXNnMiA9ICJCQkJCQkJCQkJCQkJCIjsKKyAgICAgICAgICAgIFN0cmluZyBtc2czID0gIkNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQyI7CisKKyAgICAgICAgICAgIE1vY2tUcmFuc3BvcnRGaWx0ZXIgdHJhbnNwb3J0RmlsdGVyID0gbmV3IE1vY2tUcmFuc3BvcnRGaWx0ZXIoKTsKKyAgICAgICAgICAgIEZ1dHVyZTxCb29sZWFuPiBmdXR1cmUgPSBleGVjdXRvci5zdWJtaXQoKCkgLT4geworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlVG9TdHJlYW0oc3RyZWFtLCBtc2cxLCB1c2VBcnJheSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgLy8gdGVzdCB0aGF0IHN5bmNocm9ub3VzIHdyaXRlIHJlYWxseSBibG9ja3MgdW50aWwgdGhlIHN0cmVhbSBpcyBvcGVuZWQKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGZ1dHVyZS5pc0RvbmUoKSk7CisgICAgICAgICAgICBzdHJlYW0ub3Blbih0cmFuc3BvcnRGaWx0ZXIpOworCisgICAgICAgICAgICBhc3NlcnRUcnVlKGZ1dHVyZS5nZXQoMzAwLCBUaW1lVW5pdC5TRUNPTkRTKSk7CisgICAgICAgICAgICB3cml0ZVRvU3RyZWFtKHN0cmVhbSwgbXNnMiwgdXNlQXJyYXkpOworICAgICAgICAgICAgd3JpdGVUb1N0cmVhbShzdHJlYW0sIG1zZzMsIHVzZUFycmF5KTsKKyAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG1zZzEgKyBtc2cyICsgbXNnMywgdHJhbnNwb3J0RmlsdGVyLmdldFdyaXR0ZW5EYXRhKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZXhlY3V0b3Iuc2h1dGRvd25Ob3coKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb1Rlc3RBc3luY1dyaXRlV2l0aERlbGF5KGJvb2xlYW4gdXNlQXJyYXkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGludCBhcnJheVNpemUgPSAtMTsKKyAgICAgICAgaWYgKHVzZUFycmF5KSB7CisgICAgICAgICAgICBhcnJheVNpemUgPSAxMDsKKyAgICAgICAgfQorCisgICAgICAgIFRlc3RTdHJlYW0gc3RyZWFtID0gbmV3IFRlc3RTdHJlYW0oNik7CisgICAgICAgIFN0cmluZyBtc2cxID0gIkFBQUFBQUFBQUFBQUFBQUFBQUFBIjsKKyAgICAgICAgU3RyaW5nIG1zZzIgPSAiQkJCQkJCQkJCQkJCQiI7CisgICAgICAgIFN0cmluZyBtc2czID0gIkNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQyI7CisgICAgICAgIFN0cmluZyBtc2c0ID0gIkREREREREQiOworICAgICAgICBUZXN0V3JpdGVMaXN0ZW5lciB3cml0ZUxpc3RlbmVyID0gbmV3IFRlc3RXcml0ZUxpc3RlbmVyKHN0cmVhbSwgYXJyYXlTaXplKTsKKyAgICAgICAgc3RyZWFtLnNldFdyaXRlTGlzdGVuZXIod3JpdGVMaXN0ZW5lcik7CisKKyAgICAgICAgTW9ja1RyYW5zcG9ydEZpbHRlciB0cmFuc3BvcnRGaWx0ZXIgPSBuZXcgTW9ja1RyYW5zcG9ydEZpbHRlcigpOworICAgICAgICB3cml0ZUxpc3RlbmVyLndyaXRlKG1zZzEpOworICAgICAgICB0cmFuc3BvcnRGaWx0ZXIuYmxvY2soKTsKKyAgICAgICAgc3RyZWFtLm9wZW4odHJhbnNwb3J0RmlsdGVyKTsKKyAgICAgICAgdHJhbnNwb3J0RmlsdGVyLnVuYmxvY2soKTsKKyAgICAgICAgdHJhbnNwb3J0RmlsdGVyLmJsb2NrKCk7CisgICAgICAgIHdyaXRlTGlzdGVuZXIud3JpdGUobXNnMik7CisgICAgICAgIHRyYW5zcG9ydEZpbHRlci51bmJsb2NrKCk7CisgICAgICAgIHRyYW5zcG9ydEZpbHRlci5ibG9jaygpOworICAgICAgICB3cml0ZUxpc3RlbmVyLndyaXRlKG1zZzMpOworICAgICAgICB3cml0ZUxpc3RlbmVyLndyaXRlKG1zZzQpOworCisgICAgICAgIHdyaXRlTGlzdGVuZXIuY2xvc2UoKTsKKyAgICAgICAgdHJhbnNwb3J0RmlsdGVyLnVuYmxvY2soKTsKKworICAgICAgICBpZiAod3JpdGVMaXN0ZW5lci5nZXRFcnJvcigpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdyaXRlTGlzdGVuZXIuZ2V0RXJyb3IoKS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydEVxdWFscyhtc2cxICsgbXNnMiArIG1zZzMgKyBtc2c0LCB0cmFuc3BvcnRGaWx0ZXIuZ2V0V3JpdHRlbkRhdGEoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlVG9TdHJlYW0oVGVzdFN0cmVhbSBzdHJlYW0sIFN0cmluZyBtc2csIGJvb2xlYW4gdXNlQXJyYXkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICh1c2VBcnJheSkgeworICAgICAgICAgICAgc3RyZWFtLndyaXRlKG1zZy5nZXRCeXRlcygpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IG1zZy5nZXRCeXRlcygpOworICAgICAgICAgICAgZm9yIChieXRlIGIgOiBieXRlcykgeworICAgICAgICAgICAgICAgIHN0cmVhbS53cml0ZShiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb1Rlc3RTeW5jV3JpdGVXaXRoRGVsYXkoZmluYWwgYm9vbGVhbiB1c2VBcnJheSkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvciA9IEV4ZWN1dG9ycy5uZXdTaW5nbGVUaHJlYWRFeGVjdXRvcigpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBUZXN0U3RyZWFtIHN0cmVhbSA9IG5ldyBUZXN0U3RyZWFtKDYpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZzEgPSAiQUFBQUFBQUFBQUFBQUFBQUFBQUEiOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZzIgPSAiQkJCQkJCQkJCQkJCQiI7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnMyA9ICJDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0MiOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZzQgPSAiRERERERERCI7CisKKyAgICAgICAgICAgIE1vY2tUcmFuc3BvcnRGaWx0ZXIgdHJhbnNwb3J0RmlsdGVyID0gbmV3IE1vY2tUcmFuc3BvcnRGaWx0ZXIoKTsKKyAgICAgICAgICAgIHN0cmVhbS5vcGVuKHRyYW5zcG9ydEZpbHRlcik7CisKKyAgICAgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGJsb2NrTGF0Y2gxID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgICAgICAgdHJhbnNwb3J0RmlsdGVyLmJsb2NrKGJsb2NrTGF0Y2gxKTsKKworICAgICAgICAgICAgRnV0dXJlPEJvb2xlYW4+IGZ1dHVyZSA9IGV4ZWN1dG9yLnN1Ym1pdCgoKSAtPiB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVUb1N0cmVhbShzdHJlYW0sIG1zZzEsIHVzZUFycmF5KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBhc3NlcnRUcnVlKGJsb2NrTGF0Y2gxLmF3YWl0KDUsIFRpbWVVbml0LlNFQ09ORFMpKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGZ1dHVyZS5pc0RvbmUoKSk7CisKKyAgICAgICAgICAgIHRyYW5zcG9ydEZpbHRlci51bmJsb2NrKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGZ1dHVyZS5nZXQoNSwgVGltZVVuaXQuU0VDT05EUykpOworCisgICAgICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBibG9ja0xhdGNoMiA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgICAgIHRyYW5zcG9ydEZpbHRlci5ibG9jayhibG9ja0xhdGNoMik7CisKKyAgICAgICAgICAgIGZ1dHVyZSA9IGV4ZWN1dG9yLnN1Ym1pdCgoKSAtPiB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVUb1N0cmVhbShzdHJlYW0sIG1zZzIsIHVzZUFycmF5KTsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVUb1N0cmVhbShzdHJlYW0sIG1zZzMsIHVzZUFycmF5KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBhc3NlcnRUcnVlKGJsb2NrTGF0Y2gyLmF3YWl0KDUsIFRpbWVVbml0LlNFQ09ORFMpKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGZ1dHVyZS5pc0RvbmUoKSk7CisgICAgICAgICAgICB0cmFuc3BvcnRGaWx0ZXIudW5ibG9jaygpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmdXR1cmUuZ2V0KDUsIFRpbWVVbml0LlNFQ09ORFMpKTsKKworICAgICAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggYmxvY2tMYXRjaDMgPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgICAgICB0cmFuc3BvcnRGaWx0ZXIuYmxvY2soYmxvY2tMYXRjaDMpOworCisgICAgICAgICAgICBmdXR1cmUgPSBleGVjdXRvci5zdWJtaXQoKCkgLT4geworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlVG9TdHJlYW0oc3RyZWFtLCBtc2c0LCB1c2VBcnJheSk7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIGFzc2VydFRydWUoYmxvY2tMYXRjaDMuYXdhaXQoNSwgVGltZVVuaXQuU0VDT05EUykpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoZnV0dXJlLmlzRG9uZSgpKTsKKyAgICAgICAgICAgIHRyYW5zcG9ydEZpbHRlci51bmJsb2NrKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGZ1dHVyZS5nZXQoNSwgVGltZVVuaXQuU0VDT05EUykpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobXNnMSArIG1zZzIgKyBtc2czICsgbXNnNCwgdHJhbnNwb3J0RmlsdGVyLmdldFdyaXR0ZW5EYXRhKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZXhlY3V0b3Iuc2h1dGRvd25Ob3coKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb1Rlc3RBc3luY1dyaXRlKGJvb2xlYW4gdXNlQXJyYXkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGludCBhcnJheVNpemUgPSAtMTsKKyAgICAgICAgaWYgKHVzZUFycmF5KSB7CisgICAgICAgICAgICBhcnJheVNpemUgPSAxMDsKKyAgICAgICAgfQorCisgICAgICAgIFRlc3RTdHJlYW0gc3RyZWFtID0gbmV3IFRlc3RTdHJlYW0oNik7CisgICAgICAgIFN0cmluZyBtc2cxID0gIkFBQUFBQUFBQUFBQUFBQUFBQUFBIjsKKyAgICAgICAgU3RyaW5nIG1zZzIgPSAiQkJCQkJCQkJCQkJCQiI7CisgICAgICAgIFN0cmluZyBtc2czID0gIkNDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDQyI7CisgICAgICAgIFRlc3RXcml0ZUxpc3RlbmVyIHdyaXRlTGlzdGVuZXIgPSBuZXcgVGVzdFdyaXRlTGlzdGVuZXIoc3RyZWFtLCBhcnJheVNpemUpOworICAgICAgICBzdHJlYW0uc2V0V3JpdGVMaXN0ZW5lcih3cml0ZUxpc3RlbmVyKTsKKworICAgICAgICBNb2NrVHJhbnNwb3J0RmlsdGVyIHRyYW5zcG9ydEZpbHRlciA9IG5ldyBNb2NrVHJhbnNwb3J0RmlsdGVyKCk7CisgICAgICAgIHdyaXRlTGlzdGVuZXIud3JpdGUobXNnMSk7CisgICAgICAgIHN0cmVhbS5vcGVuKHRyYW5zcG9ydEZpbHRlcik7CisgICAgICAgIHdyaXRlTGlzdGVuZXIud3JpdGUobXNnMik7CisgICAgICAgIHdyaXRlTGlzdGVuZXIud3JpdGUobXNnMyk7CisgICAgICAgIHN0cmVhbS5jbG9zZSgpOworCisgICAgICAgIGlmICh3cml0ZUxpc3RlbmVyLmdldEVycm9yKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgd3JpdGVMaXN0ZW5lci5nZXRFcnJvcigpLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscyhtc2cxICsgbXNnMiArIG1zZzMsIHRyYW5zcG9ydEZpbHRlci5nZXRXcml0dGVuRGF0YSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydFVuc3VwcG9ydGVkKENhbGxhYmxlIHVuc3VwcG9ydGVkKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB1bnN1cHBvcnRlZC5jYWxsKCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGVzdFdyaXRlTGlzdGVuZXIgaW1wbGVtZW50cyBXcml0ZUxpc3RlbmVyIHsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCeXRlQnVmZmVyIENMT1NFID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgwKTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQnl0ZUJ1ZmZlciBGTFVTSCA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoMCk7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDaHVua2VkQm9keU91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW07CisgICAgICAgIHByaXZhdGUgZmluYWwgUXVldWU8Qnl0ZUJ1ZmZlcj4gbWVzc2FnZSA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgb3V0cHV0QXJyYXlTaXplOworCisgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBsaXN0ZW5lckNhbGxFeHBlY3RlZCA9IHRydWU7CisgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgVGhyb3dhYmxlIGVycm9yOworCisgICAgICAgIFRlc3RXcml0ZUxpc3RlbmVyKENodW5rZWRCb2R5T3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkgeworICAgICAgICAgICAgdGhpcyhvdXRwdXRTdHJlYW0sIC0xKTsKKyAgICAgICAgfQorCisgICAgICAgIFRlc3RXcml0ZUxpc3RlbmVyKENodW5rZWRCb2R5T3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSwgaW50IG91dHB1dEFycmF5U2l6ZSkgeworICAgICAgICAgICAgdGhpcy5vdXRwdXRTdHJlYW0gPSBvdXRwdXRTdHJlYW07CisKKyAgICAgICAgICAgIHRoaXMub3V0cHV0QXJyYXlTaXplID0gb3V0cHV0QXJyYXlTaXplOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCB3cml0ZShTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbWVzc2FnZS5nZXRCeXRlcygpOworICAgICAgICAgICAgdGhpcy5tZXNzYWdlLmFkZChCeXRlQnVmZmVyLndyYXAoYnl0ZXMpKTsKKyAgICAgICAgICAgIGRvV3JpdGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgY2xvc2UoKSB7CisgICAgICAgICAgICBtZXNzYWdlLmFkZChDTE9TRSk7CisgICAgICAgICAgICBkb1dyaXRlKCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGZsdXNoKCkgeworICAgICAgICAgICAgbWVzc2FnZS5hZGQoRkxVU0gpOworICAgICAgICAgICAgZG9Xcml0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uV3JpdGVQb3NzaWJsZSgpIHsKKyAgICAgICAgICAgIGlmICghbGlzdGVuZXJDYWxsRXhwZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxpc3RlbmVyQ2FsbEV4cGVjdGVkID0gZmFsc2U7CisgICAgICAgICAgICBkb1dyaXRlKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgZG9Xcml0ZSgpIHsKKworICAgICAgICAgICAgd2hpbGUgKG1lc3NhZ2UucGVlaygpICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgJiYgKG91dHB1dFN0cmVhbS5pc1JlYWR5KCkgfHwgbWVzc2FnZS5wZWVrKCkgPT0gQ0xPU0UgfHwgbWVzc2FnZS5wZWVrKCkgPT0gRkxVU0gpKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGhlYWRCdWZmZXIgPSBtZXNzYWdlLnBlZWsoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoaGVhZEJ1ZmZlciA9PSBDTE9TRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBvbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhlYWRCdWZmZXIgPT0gRkxVU0gpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS5mbHVzaCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5wb2xsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXRBcnJheVNpemUgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS53cml0ZShoZWFkQnVmZmVyLmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcnJheVNpemUgPSBvdXRwdXRBcnJheVNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGVhZEJ1ZmZlci5yZW1haW5pbmcoKSA8IGFycmF5U2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5U2l6ZSA9IGhlYWRCdWZmZXIucmVtYWluaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBvdXRwdXRBcnJheSA9IG5ldyBieXRlW2FycmF5U2l6ZV07CisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkQnVmZmVyLmdldChvdXRwdXRBcnJheSk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0ud3JpdGUob3V0cHV0QXJyYXkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFoZWFkQnVmZmVyLmhhc1JlbWFpbmluZygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnBvbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFvdXRwdXRTdHJlYW0uaXNSZWFkeSgpKSB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXJDYWxsRXhwZWN0ZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGVycm9yID0gdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUaHJvd2FibGUgZ2V0RXJyb3IoKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUZXN0U3RyZWFtIGV4dGVuZHMgQ2h1bmtlZEJvZHlPdXRwdXRTdHJlYW0geworCisgICAgICAgIFRlc3RTdHJlYW0oaW50IGJ1ZmZlclNpemUpIHsKKyAgICAgICAgICAgIHN1cGVyKGJ1ZmZlclNpemUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBCeXRlQnVmZmVyIGVuY29kZVRvSHR0cChCeXRlQnVmZmVyIGJ5dGVCdWZmZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBieXRlQnVmZmVyOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTW9ja1RyYW5zcG9ydEZpbHRlciBleHRlbmRzIEZpbHRlcjxCeXRlQnVmZmVyLCBWb2lkLCBWb2lkLCBWb2lkPiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gd3JpdHRlbkRhdGEgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIHBlbmRpbmdXcml0ZSA9IGZhbHNlOworICAgICAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gYmxvY2sgPSBmYWxzZTsKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBDb3VudERvd25MYXRjaCBibG9ja0xhdGNoOworICAgICAgICBwcml2YXRlIHZvbGF0aWxlIENvbXBsZXRpb25IYW5kbGVyPEJ5dGVCdWZmZXI+IGNvbXBsZXRpb25IYW5kbGVyOworICAgICAgICBwcml2YXRlIHZvbGF0aWxlIFRocm93YWJsZSBleGNlcHRpb247CisKKyAgICAgICAgTW9ja1RyYW5zcG9ydEZpbHRlcigpIHsKKyAgICAgICAgICAgIHN1cGVyKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHZvaWQgd3JpdGUoQnl0ZUJ1ZmZlciBkYXRhLCBDb21wbGV0aW9uSGFuZGxlcjxCeXRlQnVmZmVyPiBjb21wbGV0aW9uSGFuZGxlcikgeworICAgICAgICAgICAgaWYgKHBlbmRpbmdXcml0ZSkgeworICAgICAgICAgICAgICAgIGNvbXBsZXRpb25IYW5kbGVyLmZhaWxlZChuZXcgV3JpdGVQZW5kaW5nRXhjZXB0aW9uKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwZW5kaW5nV3JpdGUgPSB0cnVlOworCisgICAgICAgICAgICB3aGlsZSAoZGF0YS5oYXNSZW1haW5pbmcoKSkgeworICAgICAgICAgICAgICAgIHdyaXR0ZW5EYXRhLndyaXRlKGRhdGEuZ2V0KCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYmxvY2spIHsKKyAgICAgICAgICAgICAgICB0aGlzLmNvbXBsZXRpb25IYW5kbGVyID0gY29tcGxldGlvbkhhbmRsZXI7CisgICAgICAgICAgICAgICAgaWYgKGJsb2NrTGF0Y2ggIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBibG9ja0xhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBlbmRpbmdXcml0ZSA9IGZhbHNlOworICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29tcGxldGlvbkhhbmRsZXIuY29tcGxldGVkKGRhdGEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb21wbGV0aW9uSGFuZGxlci5mYWlsZWQoZXhjZXB0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBnZXRXcml0dGVuRGF0YSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKHdyaXR0ZW5EYXRhLnRvQnl0ZUFycmF5KCkpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBibG9jayhDb3VudERvd25MYXRjaCBibG9ja0xhdGNoKSB7CisgICAgICAgICAgICB0aGlzLmJsb2NrTGF0Y2ggPSBibG9ja0xhdGNoOworICAgICAgICAgICAgYmxvY2sgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBibG9jaygpIHsKKyAgICAgICAgICAgIGJsb2NrID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgdW5ibG9jaygpIHsKKyAgICAgICAgICAgIGJsb2NrID0gZmFsc2U7CisgICAgICAgICAgICBwZW5kaW5nV3JpdGUgPSBmYWxzZTsKKyAgICAgICAgICAgIGNvbXBsZXRpb25IYW5kbGVyLmNvbXBsZXRlZChudWxsKTsKKyAgICAgICAgICAgIGNvbXBsZXRpb25IYW5kbGVyID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEV4Y2VwdGlvbihUaHJvd2FibGUgZXhjZXB0aW9uKSB7CisgICAgICAgICAgICB0aGlzLmV4Y2VwdGlvbiA9IGV4Y2VwdGlvbjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvQ2h1bmtlZEJvZHlPdXRwdXRTdHJlYW1UZXN0LmphdmEgYi9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL0NodW5rZWRCb2R5T3V0cHV0U3RyZWFtVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NmYwNWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL0NodW5rZWRCb2R5T3V0cHV0U3RyZWFtVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQ2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lmpkay5jb25uZWN0b3IuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlLmZhaWw7CisKKy8qKgorICogQGF1dGhvciBQZXRyIEphbm91Y2ggKHBldHIuamFub3VjaCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQ2h1bmtlZEJvZHlPdXRwdXRTdHJlYW1UZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJhc2ljKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQXN5bmNocm9ub3VzQm9keUlucHV0U3RyZWFtIHJlc3BvbnNlQm9keSA9IG5ldyBBc3luY2hyb25vdXNCb2R5SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgQ2h1bmtlZEJvZHlPdXRwdXRTdHJlYW0gY2h1bmtlZFN0cmVhbSA9IGdldE91dHB1dFN0cmVhbShyZXNwb25zZUJvZHksIDIxKTsKKworICAgICAgICBTdHJpbmcgc2VudEJvZHkgPSBUZXN0VXRpbHMuZ2VuZXJhdGVCb2R5KDUwMCk7CisgICAgICAgIGJ5dGVbXSBzZW50Qnl0ZXMgPSBzZW50Qm9keS5nZXRCeXRlcygpOworICAgICAgICBmb3IgKGJ5dGUgYiA6IHNlbnRCeXRlcykgeworICAgICAgICAgICAgY2h1bmtlZFN0cmVhbS53cml0ZShiKTsKKyAgICAgICAgfQorCisgICAgICAgIGNodW5rZWRTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgdmVyaWZ5UmVjZWl2ZWRNZXNzYWdlKHNlbnRCb2R5LCByZXNwb25zZUJvZHkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENodW5rU2l6ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGRvVGVzdENodW5rU2l6ZSgxKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDaHVua1NpemVXaXRoQXJyYXkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBkb1Rlc3RDaHVua1NpemUoOCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvVGVzdENodW5rU2l6ZShpbnQgYmF0Y2hTaXplKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBpbnQgY2h1bmtTaXplID0gMjE7CisgICAgICAgIEFzeW5jaHJvbm91c0JvZHlJbnB1dFN0cmVhbSByZXNwb25zZUJvZHkgPSBuZXcgQXN5bmNocm9ub3VzQm9keUlucHV0U3RyZWFtKCkgeworCisgICAgICAgICAgICBwcml2YXRlIGJvb2xlYW4gcmVjZWl2ZWRMZXNzID0gZmFsc2U7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgc3luY2hyb25pemVkIHZvaWQgbm90aWZ5RGF0YUF2YWlsYWJsZShCeXRlQnVmZmVyIGF2YWlsYWJsZURhdGEpIHsKKyAgICAgICAgICAgICAgICBpZiAoYXZhaWxhYmxlRGF0YS5yZW1haW5pbmcoKSA+IGNodW5rU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGF2YWlsYWJsZURhdGEucmVtYWluaW5nKCkgPCBjaHVua1NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RmFsc2UocmVjZWl2ZWRMZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWRMZXNzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzdXBlci5ub3RpZnlEYXRhQXZhaWxhYmxlKGF2YWlsYWJsZURhdGEpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIENodW5rZWRCb2R5T3V0cHV0U3RyZWFtIGNodW5rZWRTdHJlYW0gPSBnZXRPdXRwdXRTdHJlYW0ocmVzcG9uc2VCb2R5LCBjaHVua1NpemUpOworCisgICAgICAgIFN0cmluZyBzZW50Qm9keSA9IFRlc3RVdGlscy5nZW5lcmF0ZUJvZHkoMTAwKTsKKyAgICAgICAgYnl0ZVtdIHNlbnRCeXRlcyA9IHNlbnRCb2R5LmdldEJ5dGVzKCk7CisgICAgICAgIGlmIChiYXRjaFNpemUgPiAxKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlbnRCeXRlcy5sZW5ndGg7IGkgKz0gOCkgeworICAgICAgICAgICAgICAgIGNodW5rZWRTdHJlYW0ud3JpdGUoc2VudEJ5dGVzLCBpLCBNYXRoLm1pbihzZW50Qnl0ZXMubGVuZ3RoIC0gaSwgOCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChieXRlIGIgOiBzZW50Qnl0ZXMpIHsKKyAgICAgICAgICAgICAgICBjaHVua2VkU3RyZWFtLndyaXRlKGIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2h1bmtlZFN0cmVhbS5jbG9zZSgpOworICAgICAgICB2ZXJpZnlSZWNlaXZlZE1lc3NhZ2Uoc2VudEJvZHksIHJlc3BvbnNlQm9keSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBDaHVua2VkQm9keU91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oQXN5bmNocm9ub3VzQm9keUlucHV0U3RyZWFtIHJlc3BvbnNlQm9keSwgaW50IGNodW5rU2l6ZSkgeworICAgICAgICBDaHVua2VkQm9keU91dHB1dFN0cmVhbSBjaHVua2VkU3RyZWFtID0gbmV3IENodW5rZWRCb2R5T3V0cHV0U3RyZWFtKGNodW5rU2l6ZSk7CisgICAgICAgIEZpbHRlcjxCeXRlQnVmZmVyLCA/LCA/LCA/PiBtb2NrVHJhbnNwb3J0RmlsdGVyID0gY3JlYXRlTW9ja1RyYW5zcG9ydEZpbHRlcihyZXNwb25zZUJvZHkpOworICAgICAgICBjaHVua2VkU3RyZWFtLm9wZW4obW9ja1RyYW5zcG9ydEZpbHRlcik7CisgICAgICAgIHJldHVybiBjaHVua2VkU3RyZWFtOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlSZWNlaXZlZE1lc3NhZ2UoU3RyaW5nIHNlbnRCb2R5LCBBc3luY2hyb25vdXNCb2R5SW5wdXRTdHJlYW0gcmVzcG9uc2VCb2R5KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBieXRlW10gc2VudEJ5dGVzID0gc2VudEJvZHkuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgYnl0ZVtdIHJlY2VpdmVkQnl0ZXMgPSBuZXcgYnl0ZVtzZW50Qnl0ZXMubGVuZ3RoXTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlbnRCeXRlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaW50IGIgPSByZXNwb25zZUJvZHkudHJ5UmVhZCgpOworICAgICAgICAgICAgaWYgKGIgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlY2VpdmVkQnl0ZXNbaV0gPSAoYnl0ZSkgYjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXNwb25zZUJvZHkudHJ5UmVhZCgpICE9IC0xKSB7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcmVjZWl2ZWRCb2R5ID0gbmV3IFN0cmluZyhyZWNlaXZlZEJ5dGVzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNlbnRCb2R5LCByZWNlaXZlZEJvZHkpOworICAgIH0KKworICAgIEZpbHRlcjxCeXRlQnVmZmVyLCA/LCA/LCA/PiBjcmVhdGVNb2NrVHJhbnNwb3J0RmlsdGVyKGZpbmFsIEFzeW5jaHJvbm91c0JvZHlJbnB1dFN0cmVhbSByZXNwb25zZUJvZHkpIHsKKyAgICAgICAgSHR0cFBhcnNlciBwYXJzZXIgPSBuZXcgSHR0cFBhcnNlcihJbnRlZ2VyLk1BWF9WQUxVRSwgSW50ZWdlci5NQVhfVkFMVUUpOworICAgICAgICBwYXJzZXIucmVzZXQodHJ1ZSk7CisgICAgICAgIGZpbmFsIFRyYW5zZmVyRW5jb2RpbmdQYXJzZXIgdHJhbnNmZXJFbmNvZGluZ1BhcnNlciA9IFRyYW5zZmVyRW5jb2RpbmdQYXJzZXIKKyAgICAgICAgICAgICAgICAuY3JlYXRlQ2h1bmtQYXJzZXIocmVzcG9uc2VCb2R5LCBwYXJzZXIsIDEwMDApOworICAgICAgICByZXR1cm4gbmV3IEZpbHRlcjxCeXRlQnVmZmVyLCBWb2lkLCBWb2lkLCBWb2lkPihudWxsKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoQnl0ZUJ1ZmZlciBjaHVuaywgQ29tcGxldGlvbkhhbmRsZXI8Qnl0ZUJ1ZmZlcj4gY29tcGxldGlvbkhhbmRsZXIpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNmZXJFbmNvZGluZ1BhcnNlci5wYXJzZShjaHVuaykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlQm9keS5ub3RpZnlBbGxEYXRhUmVhZCgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkhhbmRsZXIuY29tcGxldGVkKGNodW5rKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25IYW5kbGVyLmZhaWxlZChlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9Db25uZWN0aW9uUG9vbFRlc3QuamF2YSBiL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvQ29ubmVjdGlvblBvb2xUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU5ZDI2MQotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvQ29ubmVjdGlvblBvb2xUZXN0LmphdmEKQEAgLTAsMCArMSwyNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamRrLmNvbm5lY3Rvci5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5TZXJ2ZXJTb2NrZXQ7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0OworaW1wb3J0IGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50Lkludm9jYXRpb25DYWxsYmFjazsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgamF2YXgubmV0LlNlcnZlclNvY2tldEZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lmpkay5jb25uZWN0b3IuSmRrQ29ubmVjdG9yUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZGsuY29ubmVjdG9yLkpka0Nvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBAYXV0aG9yIFBldHIgSmFub3VjaCAocGV0ci5qYW5vdWNoIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBDb25uZWN0aW9uUG9vbFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJhc2ljKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIG1zZzEgPSAibWVzc2FnZSAxIjsKKyAgICAgICAgU3RyaW5nIG1zZzIgPSAibWVzc2FnZSAyIjsKKyAgICAgICAgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMik7CisgICAgICAgIHNlbmRNZXNzYWdlVG9KZXJzZXkobXNnMSwgbGF0Y2gpOworICAgICAgICBzZW5kTWVzc2FnZVRvSmVyc2V5KG1zZzIsIGxhdGNoKTsKKworICAgICAgICAvKiB0aGUgaWRsZSB0aW1lb3V0IGlzIDEwcyBhbmQgb25seSAxIGNvbm5lY3Rpb24gaXMgYWxsb3dlZCwgc28gdGhlIHRlc3Qgc2hvdWxkIGZhaWwgdW5sZXNzIHRoZSBwb29sIHJldXNlcworICAgICAgICB0aGUgY29ubmVjdGlvbiBmb3IgYm90aCByZXF1ZXN0cyAqLworICAgICAgICBhc3NlcnRUcnVlKGxhdGNoLmF3YWl0KDUsIFRpbWVVbml0LlNFQ09ORFMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2VuZE1lc3NhZ2VUb0plcnNleShTdHJpbmcgbWVzc2FnZSwgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2gpIHsKKyAgICAgICAgdGFyZ2V0KCJlY2hvIikucmVxdWVzdCgpLmFzeW5jKCkucG9zdChFbnRpdHkuZW50aXR5KG1lc3NhZ2UsIE1lZGlhVHlwZS5URVhUX1BMQUlOKSwgbmV3IEludm9jYXRpb25DYWxsYmFjazxTdHJpbmc+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBjb21wbGV0ZWQoU3RyaW5nIHJlc3BvbnNlKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIjUmVjZWl2ZWQ6ICIgKyByZXNwb25zZSk7CisgICAgICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgZmFpbGVkKFRocm93YWJsZSB0aHJvd2FibGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvd2FibGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBlcnNpc3RlbnRDb25uZWN0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIFRlc3RTZXJ2ZXIgdGVzdFNlcnZlciA9IG5ldyBUZXN0U2VydmVyKHRydWUpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0ZXN0U2VydmVyLnN0YXJ0KCk7CisgICAgICAgICAgICBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgyKTsKKyAgICAgICAgICAgIEF0b21pY0ludGVnZXIgcmVzdWx0MSA9IG5ldyBBdG9taWNJbnRlZ2VyKC0xKTsKKyAgICAgICAgICAgIHNlbmRHZXRUb1Rlc3RTZXJ2ZXIocmVzdWx0MSwgbGF0Y2gpOworICAgICAgICAgICAgQXRvbWljSW50ZWdlciByZXN1bHQyID0gbmV3IEF0b21pY0ludGVnZXIoLTEpOworICAgICAgICAgICAgc2VuZEdldFRvVGVzdFNlcnZlcihyZXN1bHQyLCBsYXRjaCk7CisKKyAgICAgICAgICAgIGFzc2VydFRydWUobGF0Y2guYXdhaXQoNSwgVGltZVVuaXQuU0VDT05EUykpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVzdWx0MS5nZXQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVzdWx0Mi5nZXQoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0ZXN0U2VydmVyLnN0b3AoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vblBlcnNpc3RlbnRDb25uZWN0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIFRlc3RTZXJ2ZXIgdGVzdFNlcnZlciA9IG5ldyBUZXN0U2VydmVyKGZhbHNlKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGVzdFNlcnZlci5zdGFydCgpOworICAgICAgICAgICAgQ291bnREb3duTGF0Y2ggbGF0Y2gxID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgICAgICAgQXRvbWljSW50ZWdlciByZXN1bHQxID0gbmV3IEF0b21pY0ludGVnZXIoLTEpOworICAgICAgICAgICAgc2VuZEdldFRvVGVzdFNlcnZlcihyZXN1bHQxLCBsYXRjaDEpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsYXRjaDEuYXdhaXQoNSwgVGltZVVuaXQuU0VDT05EUykpOworICAgICAgICAgICAgQ291bnREb3duTGF0Y2ggbGF0Y2gyID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworCisgICAgICAgICAgICBBdG9taWNJbnRlZ2VyIHJlc3VsdDIgPSBuZXcgQXRvbWljSW50ZWdlcigtMSk7CisgICAgICAgICAgICBzZW5kR2V0VG9UZXN0U2VydmVyKHJlc3VsdDIsIGxhdGNoMik7CisKKyAgICAgICAgICAgIGFzc2VydFRydWUobGF0Y2gyLmF3YWl0KDUsIFRpbWVVbml0LlNFQ09ORFMpKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlc3VsdDEuZ2V0KCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHJlc3VsdDIuZ2V0KCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdGVzdFNlcnZlci5zdG9wKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2VuZEdldFRvVGVzdFNlcnZlcihmaW5hbCBBdG9taWNJbnRlZ2VyIHJlc3VsdCwgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2gpIHsKKyAgICAgICAgZ2V0Q2xpZW50KCkudGFyZ2V0KCJodHRwOi8vbG9jYWxob3N0OiIgKyBUZXN0U2VydmVyLlBPUlQpLnJlcXVlc3QoKS5hc3luYygpLmdldChuZXcgSW52b2NhdGlvbkNhbGxiYWNrPEludGVnZXI+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBjb21wbGV0ZWQoSW50ZWdlciByZXNwb25zZSkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiI1JlY2VpdmVkOiAiICsgcmVzcG9uc2UpOworICAgICAgICAgICAgICAgIHJlc3VsdC5zZXQocmVzcG9uc2UpOworICAgICAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZhaWxlZChUaHJvd2FibGUgdGhyb3dhYmxlKSB7CisgICAgICAgICAgICAgICAgdGhyb3dhYmxlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEVjaG9SZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBKZGtDb25uZWN0b3JQcm92aWRlcigpKTsKKyAgICAgICAgY29uZmlnLnByb3BlcnR5KEpka0Nvbm5lY3RvclByb3BlcnRpZXMuTUFYX0NPTk5FQ1RJT05TX1BFUl9ERVNUSU5BVElPTiwgMSk7CisgICAgICAgIGNvbmZpZy5wcm9wZXJ0eShKZGtDb25uZWN0b3JQcm9wZXJ0aWVzLkNPTk5FQ1RJT05fSURMRV9USU1FT1VULCAxMF8wMDApOworICAgIH0KKworICAgIEBQYXRoKCIvZWNobyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFY2hvUmVzb3VyY2UgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdChTdHJpbmcgZW50aXR5KSB7CisgICAgICAgICAgICByZXR1cm4gZW50aXR5OworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGVzdFNlcnZlciB7CisKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBQT1JUID0gODMyMTsKKworICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gcGVyc2lzdGVudENvbm5lY3Rpb247CisgICAgICAgIHByaXZhdGUgZmluYWwgU2VydmVyU29ja2V0IHNlcnZlclNvY2tldDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlID0gRXhlY3V0b3JzLm5ld0NhY2hlZFRocmVhZFBvb2woKTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNJbnRlZ2VyIGNvbm5lY3Rpb25zQ291bnQgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKKworICAgICAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gc3RvcHBlZCA9IGZhbHNlOworCisgICAgICAgIFRlc3RTZXJ2ZXIoYm9vbGVhbiBwZXJzaXN0ZW50Q29ubmVjdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRoaXMucGVyc2lzdGVudENvbm5lY3Rpb24gPSBwZXJzaXN0ZW50Q29ubmVjdGlvbjsKKyAgICAgICAgICAgIFNlcnZlclNvY2tldEZhY3Rvcnkgc29ja2V0RmFjdG9yeSA9IFNlcnZlclNvY2tldEZhY3RvcnkuZ2V0RGVmYXVsdCgpOworICAgICAgICAgICAgc2VydmVyU29ja2V0ID0gc29ja2V0RmFjdG9yeS5jcmVhdGVTZXJ2ZXJTb2NrZXQoUE9SVCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHN0YXJ0KCkgeworICAgICAgICAgICAgZXhlY3V0b3JTZXJ2aWNlLmV4ZWN1dGUoKCkgLT4geworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICghc3RvcHBlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU29ja2V0IHNvY2tldCA9IHNlcnZlclNvY2tldC5hY2NlcHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25zQ291bnQuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRvclNlcnZpY2Uuc3VibWl0KCgpIC0+IGhhbmRsZUNvbm5lY3Rpb24oc29ja2V0KSk7CisKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy9kbyBub3RoaW5nCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlQ29ubmVjdGlvbihTb2NrZXQgc29ja2V0KSB7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBzb2NrZXQuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcmVjZWl2ZWRNZXNzYWdlID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCisgICAgICAgICAgICAgICAgd2hpbGUgKCFzdG9wcGVkICYmICFzb2NrZXQuaXNDbG9zZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gaW5wdXRTdHJlYW0ucmVhZCgpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICByZWNlaXZlZE1lc3NhZ2Uud3JpdGUoKGJ5dGUpIHJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtc2cgPSBuZXcgU3RyaW5nKHJlY2VpdmVkTWVzc2FnZS50b0J5dGVBcnJheSgpLCAiQVNDSUkiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5jb250YWlucygiXHJcblxyXG4iKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWRNZXNzYWdlID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IHNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXNwb25zZSA9ICJIVFRQLzEuMSAyMDAgT0tcclxuQ29udGVudC1MZW5ndGg6IDFcclxuQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluXHJcbiI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBlcnNpc3RlbnRDb25uZWN0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgKz0gIkNvbm5lY3Rpb246IENsb3NlXHJcbiI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSArPSAiXHJcbiIgKyBjb25uZWN0aW9uc0NvdW50LmdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLndyaXRlKHJlc3BvbnNlLmdldEJ5dGVzKCJBU0NJSSIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS5mbHVzaCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGlmICghZS5nZXRDbGFzcygpLmVxdWFscyhTb2NrZXRFeGNlcHRpb24uY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzb2NrZXQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzdG9wKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGV4ZWN1dG9yU2VydmljZS5zaHV0ZG93bigpOworICAgICAgICAgICAgc2VydmVyU29ja2V0LmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL0Nvb2tpZVRlc3QuamF2YSBiL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvQ29va2llVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMjY0NWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL0Nvb2tpZVRlc3QuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lmpkay5jb25uZWN0b3IuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLm5ldC5Db29raWVQb2xpY3k7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29va2llOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5OZXdDb29raWU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamRrLmNvbm5lY3Rvci5KZGtDb25uZWN0b3JQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lmpkay5jb25uZWN0b3IuSmRrQ29ubmVjdG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3ogKHBhdWwuc2FuZG96IGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIEFydWwgRGhlc2lhc2VlbGFuIChhcnVsZCBhdCBhY20ub3JnKQorICovCitwdWJsaWMgY2xhc3MgQ29va2llVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQFBhdGgoIi9Db29raWVSZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb29raWVSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0KEBDb250ZXh0IEh0dHBIZWFkZXJzIGgpIHsKKyAgICAgICAgICAgIENvb2tpZSBjID0gaC5nZXRDb29raWVzKCkuZ2V0KCJuYW1lIik7CisgICAgICAgICAgICBTdHJpbmcgZSA9IChjID09IG51bGwpID8gIk5PLUNPT0tJRSIgOiBjLmdldFZhbHVlKCk7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soZSkuY29va2llKG5ldyBOZXdDb29raWUoIm5hbWUiLCAidmFsdWUiKSkuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoQ29va2llUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5jb25uZWN0b3JQcm92aWRlcihuZXcgSmRrQ29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29va2llUmVzb3VyY2UoKSB7CisgICAgICAgIC8vIHRoZSBkZWZhdWx0IGNvb2tpZSBwb2xpY3kgZG9lcyBub3QgbGlrZSBjb29raWVzIGZyb20gbG9jYWxob3N0CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoIkNvb2tpZVJlc291cmNlIikucHJvcGVydHkoSmRrQ29ubmVjdG9yUHJvcGVydGllcy5DT09LSUVfUE9MSUNZLCBDb29raWVQb2xpY3kuQUNDRVBUX0FMTCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJOTy1DT09LSUUiLCB0YXJnZXQucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZSIsIHRhcmdldC5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERpc2FibGVkQ29va2llcygpIHsKKyAgICAgICAgLy8gdGhlIGRlZmF1bHQgY29va2llIHBvbGljeSBkb2VzIG5vdCBsaWtlIGNvb2tpZXMgZnJvbSBsb2NhbGhvc3QKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiQ29va2llUmVzb3VyY2UiKS5wcm9wZXJ0eShKZGtDb25uZWN0b3JQcm9wZXJ0aWVzLkNPT0tJRV9QT0xJQ1ksIENvb2tpZVBvbGljeS5BQ0NFUFRfTk9ORSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJOTy1DT09LSUUiLCB0YXJnZXQucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJOTy1DT09LSUUiLCB0YXJnZXQucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL0VudGl0eVdyaXRlVGVzdC5qYXZhIGIvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9FbnRpdHlXcml0ZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTM3YWE5Ci0tLSAvZGV2L251bGwKKysrIGIvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9FbnRpdHlXcml0ZVRlc3QuamF2YQpAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lmpkay5jb25uZWN0b3IuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5SZXF1ZXN0RW50aXR5UHJvY2Vzc2luZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZGsuY29ubmVjdG9yLkpka0Nvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQGF1dGhvciBQZXRyIEphbm91Y2ggKHBldHIuamFub3VjaCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgRW50aXR5V3JpdGVUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgdGFyZ2V0ID0gImVudGl0eVdyaXRlIjsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoRWNob1Jlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcucHJvcGVydHkoQ2xpZW50UHJvcGVydGllcy5DSFVOS0VEX0VOQ09ESU5HX1NJWkUsIDIwKTsKKyAgICAgICAgY29uZmlnLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBKZGtDb25uZWN0b3JQcm92aWRlcigpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCdWZmZXJlZCgpIHsKKyAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBUZXN0VXRpbHMuZ2VuZXJhdGVCb2R5KDUwMDApOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCh0YXJnZXQpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobWVzc2FnZSwgTWVkaWFUeXBlLlRFWFRfUExBSU4pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2h1bmtlZCgpIHsKKyAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBUZXN0VXRpbHMuZ2VuZXJhdGVCb2R5KDUwMDApOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCh0YXJnZXQpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLlJFUVVFU1RfRU5USVRZX1BST0NFU1NJTkcsIFJlcXVlc3RFbnRpdHlQcm9jZXNzaW5nLkNIVU5LRUQpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eShtZXNzYWdlLCBNZWRpYVR5cGUuVEVYVF9QTEFJTikpOworICAgICAgICBhc3NlcnRFcXVhbHMobWVzc2FnZSwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiL2VudGl0eVdyaXRlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEVjaG9SZXNvdXJjZSB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0KFN0cmluZyBlbnRpdHkpIHsKKyAgICAgICAgICAgIHJldHVybiBlbnRpdHk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL0h0dHBDb25uZWN0aW9uVGVzdC5qYXZhIGIvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9IdHRwQ29ubmVjdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTEyNGUyCi0tLSAvZGV2L251bGwKKysrIGIvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9IdHRwQ29ubmVjdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDMxMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZGsuY29ubmVjdG9yLmludGVybmFsOworCitpbXBvcnQgamF2YS5uZXQuQ29va2llTWFuYWdlcjsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlF1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRFeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZGsuY29ubmVjdG9yLkpka0Nvbm5lY3RvclByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamRrLmNvbm5lY3Rvci5KZGtDb25uZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5Lmpkay5jb25uZWN0b3IuaW50ZXJuYWwuSHR0cENvbm5lY3Rpb24uU3RhdGUuQ0xPU0VEOworaW1wb3J0IHN0YXRpYyBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZGsuY29ubmVjdG9yLmludGVybmFsLkh0dHBDb25uZWN0aW9uLlN0YXRlLkNPTk5FQ1RJTkc7CitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5Lmpkay5jb25uZWN0b3IuaW50ZXJuYWwuSHR0cENvbm5lY3Rpb24uU3RhdGUuQ09OTkVDVF9USU1FT1VUOworaW1wb3J0IHN0YXRpYyBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZGsuY29ubmVjdG9yLmludGVybmFsLkh0dHBDb25uZWN0aW9uLlN0YXRlLkVSUk9SOworaW1wb3J0IHN0YXRpYyBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZGsuY29ubmVjdG9yLmludGVybmFsLkh0dHBDb25uZWN0aW9uLlN0YXRlLklETEU7CitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5Lmpkay5jb25uZWN0b3IuaW50ZXJuYWwuSHR0cENvbm5lY3Rpb24uU3RhdGUuSURMRV9USU1FT1VUOworaW1wb3J0IHN0YXRpYyBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZGsuY29ubmVjdG9yLmludGVybmFsLkh0dHBDb25uZWN0aW9uLlN0YXRlLlJFQ0VJVkVEOworaW1wb3J0IHN0YXRpYyBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZGsuY29ubmVjdG9yLmludGVybmFsLkh0dHBDb25uZWN0aW9uLlN0YXRlLlJFQ0VJVklOR19CT0RZOworaW1wb3J0IHN0YXRpYyBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZGsuY29ubmVjdG9yLmludGVybmFsLkh0dHBDb25uZWN0aW9uLlN0YXRlLlJFQ0VJVklOR19IRUFERVI7CitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5Lmpkay5jb25uZWN0b3IuaW50ZXJuYWwuSHR0cENvbm5lY3Rpb24uU3RhdGUuUkVTUE9OU0VfVElNRU9VVDsKK2ltcG9ydCBzdGF0aWMgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamRrLmNvbm5lY3Rvci5pbnRlcm5hbC5IdHRwQ29ubmVjdGlvbi5TdGF0ZS5TRU5ESU5HX1JFUVVFU1Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogQGF1dGhvciBQZXRyIEphbm91Y2ggKHBldHIuamFub3VjaCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSHR0cENvbm5lY3Rpb25UZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2Ugc2NoZWR1bGVyID0gRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZFNjaGVkdWxlZEV4ZWN1dG9yKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGhyb3dhYmxlIHRlc3RFcnJvciA9IG5ldyBUaHJvd2FibGUoKTsKKworICAgIEBBZnRlckNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNsZWFuVXAoKSB7CisgICAgICAgIHNjaGVkdWxlci5zaHV0ZG93bk5vdygpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJhc2ljKCkgeworICAgICAgICBIdHRwQ29ubmVjdGlvbi5TdGF0ZVtdIGV4cGVjdGVkU3RhdGVzID0gbmV3IEh0dHBDb25uZWN0aW9uLlN0YXRlW10ge0NPTk5FQ1RJTkcsIElETEUsIFNFTkRJTkdfUkVRVUVTVCwKKyAgICAgICAgICAgICAgICBSRUNFSVZJTkdfSEVBREVSLCBSRUNFSVZJTkdfQk9EWSwgUkVDRUlWRUQsIElETEV9OworICAgICAgICBIdHRwUmVxdWVzdCByZXF1ZXN0ID0gSHR0cFJlcXVlc3QuY3JlYXRlQm9keWxlc3MoIkdFVCIsIHRhcmdldCgiaGVsbG8iKS5nZXRVcmkoKSk7CisgICAgICAgIGRvVGVzdChFUlJPUl9TVEFURS5OT05FLCBleHBlY3RlZFN0YXRlcywgcmVxdWVzdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVSZXF1ZXN0cygpIHsKKyAgICAgICAgSHR0cENvbm5lY3Rpb24uU3RhdGVbXSBleHBlY3RlZFN0YXRlcyA9IG5ldyBIdHRwQ29ubmVjdGlvbi5TdGF0ZVtdIHtDT05ORUNUSU5HLCBJRExFLCBTRU5ESU5HX1JFUVVFU1QsCisgICAgICAgICAgICAgICAgUkVDRUlWSU5HX0hFQURFUiwgUkVDRUlWSU5HX0JPRFksIFJFQ0VJVkVELCBJRExFLCBTRU5ESU5HX1JFUVVFU1QsIFJFQ0VJVklOR19IRUFERVIsIFJFQ0VJVklOR19CT0RZLCBSRUNFSVZFRCwKKyAgICAgICAgICAgICAgICBJRExFfTsKKyAgICAgICAgSHR0cFJlcXVlc3QgcmVxdWVzdCA9IEh0dHBSZXF1ZXN0LmNyZWF0ZUJvZHlsZXNzKCJHRVQiLCB0YXJnZXQoImhlbGxvIikuZ2V0VXJpKCkpOworICAgICAgICBkb1Rlc3QoRVJST1JfU1RBVEUuTk9ORSwgZXhwZWN0ZWRTdGF0ZXMsIHJlcXVlc3QsIHJlcXVlc3QpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVycm9yU2VuZGluZygpIHsKKyAgICAgICAgSHR0cENvbm5lY3Rpb24uU3RhdGVbXSBleHBlY3RlZFN0YXRlcyA9IG5ldyBIdHRwQ29ubmVjdGlvbi5TdGF0ZVtdIHtDT05ORUNUSU5HLCBJRExFLCBTRU5ESU5HX1JFUVVFU1QsIEVSUk9SLCBDTE9TRUR9OworICAgICAgICBIdHRwUmVxdWVzdCByZXF1ZXN0ID0gSHR0cFJlcXVlc3QuY3JlYXRlQm9keWxlc3MoIkdFVCIsIHRhcmdldCgiaGVsbG8iKS5nZXRVcmkoKSk7CisgICAgICAgIGRvVGVzdChFUlJPUl9TVEFURS5TRU5ESU5HLCBleHBlY3RlZFN0YXRlcywgcmVxdWVzdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXJyb3JSZWNlaXZpbmcoKSB7CisgICAgICAgIEh0dHBDb25uZWN0aW9uLlN0YXRlW10gZXhwZWN0ZWRTdGF0ZXMgPSBuZXcgSHR0cENvbm5lY3Rpb24uU3RhdGVbXSB7Q09OTkVDVElORywgSURMRSwgU0VORElOR19SRVFVRVNULAorICAgICAgICAgICAgICAgIFJFQ0VJVklOR19IRUFERVIsIEVSUk9SLCBDTE9TRUR9OworICAgICAgICBIdHRwUmVxdWVzdCByZXF1ZXN0ID0gSHR0cFJlcXVlc3QuY3JlYXRlQm9keWxlc3MoIkdFVCIsIHRhcmdldCgiaGVsbG8iKS5nZXRVcmkoKSk7CisgICAgICAgIGRvVGVzdChFUlJPUl9TVEFURS5SRUNFSVZJTkdfSEVBREVSLCBleHBlY3RlZFN0YXRlcywgcmVxdWVzdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZW91dENvbm5lY3RpbmcoKSB7CisgICAgICAgIEh0dHBDb25uZWN0aW9uLlN0YXRlW10gZXhwZWN0ZWRTdGF0ZXMgPSBuZXcgSHR0cENvbm5lY3Rpb24uU3RhdGVbXSB7Q09OTkVDVElORywgQ09OTkVDVF9USU1FT1VULCBDTE9TRUR9OworICAgICAgICBIdHRwUmVxdWVzdCByZXF1ZXN0ID0gSHR0cFJlcXVlc3QuY3JlYXRlQm9keWxlc3MoIkdFVCIsIHRhcmdldCgiaGVsbG8iKS5nZXRVcmkoKSk7CisgICAgICAgIENvbm5lY3RvckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IG5ldyBDb25uZWN0b3JDb25maWd1cmF0aW9uKGNsaWVudCgpLCBjbGllbnQoKS5nZXRDb25maWd1cmF0aW9uKCkpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgaW50IGdldENvbm5lY3RUaW1lb3V0KCkgeworICAgICAgICAgICAgICAgIHJldHVybiAxMDA7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGRvVGVzdChFUlJPUl9TVEFURS5MT1NUX0NPTk5FQ1QsIGNvbmZpZ3VyYXRpb24sIGV4cGVjdGVkU3RhdGVzLCByZXF1ZXN0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNwb25zZVRpbWVvdXQoKSB7CisgICAgICAgIEh0dHBDb25uZWN0aW9uLlN0YXRlW10gZXhwZWN0ZWRTdGF0ZXMgPSBuZXcgSHR0cENvbm5lY3Rpb24uU3RhdGVbXSB7Q09OTkVDVElORywgSURMRSwgU0VORElOR19SRVFVRVNULAorICAgICAgICAgICAgICAgIFJFQ0VJVklOR19IRUFERVIsIFJFU1BPTlNFX1RJTUVPVVQsIENMT1NFRH07CisgICAgICAgIEh0dHBSZXF1ZXN0IHJlcXVlc3QgPSBIdHRwUmVxdWVzdC5jcmVhdGVCb2R5bGVzcygiR0VUIiwgdGFyZ2V0KCJoZWxsbyIpLmdldFVyaSgpKTsKKyAgICAgICAgQ29ubmVjdG9yQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uID0gbmV3IENvbm5lY3RvckNvbmZpZ3VyYXRpb24oY2xpZW50KCksIGNsaWVudCgpLmdldENvbmZpZ3VyYXRpb24oKSkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIGludCBnZXRSZXNwb25zZVRpbWVvdXQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDEwMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBkb1Rlc3QoRVJST1JfU1RBVEUuTE9TVF9SRVFVRVNULCBjb25maWd1cmF0aW9uLCBleHBlY3RlZFN0YXRlcywgcmVxdWVzdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SWRsZVRpbWVvdXQoKSB7CisgICAgICAgIEh0dHBDb25uZWN0aW9uLlN0YXRlW10gZXhwZWN0ZWRTdGF0ZXMgPSBuZXcgSHR0cENvbm5lY3Rpb24uU3RhdGVbXSB7Q09OTkVDVElORywgSURMRSwgU0VORElOR19SRVFVRVNULAorICAgICAgICAgICAgICAgIFJFQ0VJVklOR19IRUFERVIsIFJFQ0VJVklOR19CT0RZLCBSRUNFSVZFRCwgSURMRSwgSURMRV9USU1FT1VULCBDTE9TRUR9OworICAgICAgICBIdHRwUmVxdWVzdCByZXF1ZXN0ID0gSHR0cFJlcXVlc3QuY3JlYXRlQm9keWxlc3MoIkdFVCIsIHRhcmdldCgiaGVsbG8iKS5nZXRVcmkoKSk7CisgICAgICAgIENvbm5lY3RvckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IG5ldyBDb25uZWN0b3JDb25maWd1cmF0aW9uKGNsaWVudCgpLCBjbGllbnQoKS5nZXRDb25maWd1cmF0aW9uKCkpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBpbnQgZ2V0Q29ubmVjdGlvbklkbGVUaW1lb3V0KCkgeworICAgICAgICAgICAgICAgIHJldHVybiA1MDA7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgZG9UZXN0KEVSUk9SX1NUQVRFLk5PTkUsIGNvbmZpZ3VyYXRpb24sIGV4cGVjdGVkU3RhdGVzLCByZXF1ZXN0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9UZXN0KEVSUk9SX1NUQVRFIGVycm9yU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0b3JDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBIdHRwQ29ubmVjdGlvbi5TdGF0ZVtdIGV4cGVjdGVkU3RhdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgSHR0cFJlcXVlc3QuLi4gaHR0cFJlcXVlc3RzKSB7CisgICAgICAgIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgICBUZXN0U3RhdGVMaXN0ZW5lciBzdGF0ZUxpc3RlbmVyID0gbmV3IFRlc3RTdGF0ZUxpc3RlbmVyKGV4cGVjdGVkU3RhdGVzLCBsYXRjaCwgaHR0cFJlcXVlc3RzKTsKKyAgICAgICAgSHR0cENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IGNyZWF0ZUNvbm5lY3Rpb24oaHR0cFJlcXVlc3RzWzBdLmdldFVyaSgpLCBzdGF0ZUxpc3RlbmVyLCBlcnJvclN0YXRlLCBjb25maWd1cmF0aW9uKTsKKyAgICAgICAgY29ubmVjdGlvbi5jb25uZWN0KCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFzc2VydFRydWUobGF0Y2guYXdhaXQoNSwgVGltZVVuaXQuU0VDT05EUykpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgLy8gY29udGludWUKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KGV4cGVjdGVkU3RhdGVzKSwgc3RhdGVMaXN0ZW5lci5nZXRPYnNlcnZlZFN0YXRlcygpKTsKKworICAgICAgICBpZiAoZXJyb3JTdGF0ZSA9PSBFUlJPUl9TVEFURS5TRU5ESU5HIHx8IGVycm9yU3RhdGUgPT0gRVJST1JfU1RBVEUuQ09OTkVDVElORworICAgICAgICAgICAgICAgIHx8IGVycm9yU3RhdGUgPT0gRVJST1JfU1RBVEUuUkVDRUlWSU5HX0hFQURFUikgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0ZXN0RXJyb3IgPT0gY29ubmVjdGlvbi5nZXRFcnJvcigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb1Rlc3QoRVJST1JfU1RBVEUgZXJyb3JTdGF0ZSwgSHR0cENvbm5lY3Rpb24uU3RhdGVbXSBleHBlY3RlZFN0YXRlcywgSHR0cFJlcXVlc3QuLi4gaHR0cFJlcXVlc3RzKSB7CisgICAgICAgIENvbm5lY3RvckNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IG5ldyBDb25uZWN0b3JDb25maWd1cmF0aW9uKGNsaWVudCgpLCBjbGllbnQoKS5nZXRDb25maWd1cmF0aW9uKCkpOworICAgICAgICBkb1Rlc3QoZXJyb3JTdGF0ZSwgY29uZmlndXJhdGlvbiwgZXhwZWN0ZWRTdGF0ZXMsIGh0dHBSZXF1ZXN0cyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhFY2hvUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5wcm9wZXJ0eShKZGtDb25uZWN0b3JQcm9wZXJ0aWVzLkNPTk5FQ1RJT05fSURMRV9USU1FT1VULCAzMF8wMDApOworICAgICAgICBjb25maWcuY29ubmVjdG9yUHJvdmlkZXIobmV3IEpka0Nvbm5lY3RvclByb3ZpZGVyKCkpOworICAgIH0KKworICAgIEBQYXRoKCIvaGVsbG8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRWNob1Jlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SGVsbG8oKSB7CisgICAgICAgICAgICByZXR1cm4gIkhlbGxvIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgSHR0cENvbm5lY3Rpb24gY3JlYXRlQ29ubmVjdGlvbihVUkkgdXJpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0U3RhdGVMaXN0ZW5lciBzdGF0ZUxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBFUlJPUl9TVEFURSBlcnJvclN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0b3JDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgcmV0dXJuIG5ldyBIdHRwQ29ubmVjdGlvbih1cmksIG5ldyBDb29raWVNYW5hZ2VyKCksIGNvbmZpZ3VyYXRpb24sIHNjaGVkdWxlciwgc3RhdGVMaXN0ZW5lcikgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgRmlsdGVyPEh0dHBSZXF1ZXN0LCBIdHRwUmVzcG9uc2UsIEh0dHBSZXF1ZXN0LCBIdHRwUmVzcG9uc2U+IGNyZWF0ZUZpbHRlckNoYWluKFVSSSB1cmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3RvckNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uKSB7CisgICAgICAgICAgICAgICAgRmlsdGVyPEh0dHBSZXF1ZXN0LCBIdHRwUmVzcG9uc2UsIEh0dHBSZXF1ZXN0LCBIdHRwUmVzcG9uc2U+IGZpbHRlckNoYWluID0gc3VwZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVGaWx0ZXJDaGFpbih1cmksIGNvbmZpZ3VyYXRpb24pOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW50ZXJjZXB0b3JGaWx0ZXIoZmlsdGVyQ2hhaW4sIGVycm9yU3RhdGUpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRlc3RTdGF0ZUxpc3RlbmVyIGltcGxlbWVudHMgSHR0cENvbm5lY3Rpb24uU3RhdGVDaGFuZ2VMaXN0ZW5lciB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEh0dHBDb25uZWN0aW9uLlN0YXRlPiBvYnNlcnZlZFN0YXRlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBwcml2YXRlIGZpbmFsIEh0dHBSZXF1ZXN0W10gaHR0cFJlcXVlc3RzOworICAgICAgICBwcml2YXRlIGZpbmFsIEF0b21pY0ludGVnZXIgc2VudFJlcXVlc3RzID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CisgICAgICAgIHByaXZhdGUgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2g7CisgICAgICAgIHByaXZhdGUgZmluYWwgUXVldWU8SHR0cENvbm5lY3Rpb24uU3RhdGU+IGV4cGVjdGVkU3RhdGVzOworCisgICAgICAgIHB1YmxpYyBUZXN0U3RhdGVMaXN0ZW5lcihIdHRwQ29ubmVjdGlvbi5TdGF0ZVtdIGV4cGVjdGVkU3RhdGVzLCBDb3VudERvd25MYXRjaCBsYXRjaCwgSHR0cFJlcXVlc3QuLi4gaHR0cFJlcXVlc3RzKSB7CisgICAgICAgICAgICB0aGlzLmh0dHBSZXF1ZXN0cyA9IGh0dHBSZXF1ZXN0czsKKyAgICAgICAgICAgIHRoaXMubGF0Y2ggPSBsYXRjaDsKKyAgICAgICAgICAgIHRoaXMuZXhwZWN0ZWRTdGF0ZXMgPSBuZXcgTGlua2VkTGlzdDw+KEFycmF5cy5hc0xpc3QoZXhwZWN0ZWRTdGF0ZXMpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXRlQ2hhbmdlZChIdHRwQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBIdHRwQ29ubmVjdGlvbi5TdGF0ZSBvbGRTdGF0ZSwgSHR0cENvbm5lY3Rpb24uU3RhdGUgbmV3U3RhdGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRmKCJDb25uZWN0aW9uIFslc10gc3RhdGUgY2hhbmdlOiAlcyAtPiAlc1xuIiwgY29ubmVjdGlvbiwgb2xkU3RhdGUsIG5ld1N0YXRlKTsKKworICAgICAgICAgICAgb2JzZXJ2ZWRTdGF0ZXMuYWRkKG5ld1N0YXRlKTsKKworICAgICAgICAgICAgSHR0cENvbm5lY3Rpb24uU3RhdGUgZXhwZWN0ZWRTdGF0ZSA9IGV4cGVjdGVkU3RhdGVzLnBvbGwoKTsKKyAgICAgICAgICAgIGlmIChleHBlY3RlZFN0YXRlICE9IG5ld1N0YXRlKSB7CisgICAgICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChuZXdTdGF0ZSA9PSBJRExFICYmIGh0dHBSZXF1ZXN0cy5sZW5ndGggPiBzZW50UmVxdWVzdHMuZ2V0KCkpIHsKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnNlbmQoaHR0cFJlcXVlc3RzW3NlbnRSZXF1ZXN0cy5nZXQoKV0pOworICAgICAgICAgICAgICAgIHNlbnRSZXF1ZXN0cy5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGV4cGVjdGVkU3RhdGVzLnBlZWsoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTGlzdDxIdHRwQ29ubmVjdGlvbi5TdGF0ZT4gZ2V0T2JzZXJ2ZWRTdGF0ZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gb2JzZXJ2ZWRTdGF0ZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJbnRlcmNlcHRvckZpbHRlciBleHRlbmRzIEZpbHRlcjxIdHRwUmVxdWVzdCwgSHR0cFJlc3BvbnNlLCBIdHRwUmVxdWVzdCwgSHR0cFJlc3BvbnNlPiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBFUlJPUl9TVEFURSBlcnJvclN0YXRlOworCisgICAgICAgIEludGVyY2VwdG9yRmlsdGVyKEZpbHRlcjxIdHRwUmVxdWVzdCwgSHR0cFJlc3BvbnNlLCBIdHRwUmVxdWVzdCwgSHR0cFJlc3BvbnNlPiBkb3duc3RyZWFtRmlsdGVyLCBFUlJPUl9TVEFURSBlcnJyb1N0YXRlKSB7CisgICAgICAgICAgICBzdXBlcihkb3duc3RyZWFtRmlsdGVyKTsKKyAgICAgICAgICAgIHRoaXMuZXJyb3JTdGF0ZSA9IGVycnJvU3RhdGU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgdm9pZCB3cml0ZShIdHRwUmVxdWVzdCBkYXRhLCBmaW5hbCBDb21wbGV0aW9uSGFuZGxlcjxIdHRwUmVxdWVzdD4gY29tcGxldGlvbkhhbmRsZXIpIHsKKyAgICAgICAgICAgIGlmIChlcnJvclN0YXRlID09IEVSUk9SX1NUQVRFLkxPU1RfUkVRVUVTVCkgeworICAgICAgICAgICAgICAgIGNvbXBsZXRpb25IYW5kbGVyLmNvbXBsZXRlZChkYXRhKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChlcnJvclN0YXRlID09IEVSUk9SX1NUQVRFLlNFTkRJTkcpIHsKKyAgICAgICAgICAgICAgICBjb21wbGV0aW9uSGFuZGxlci5mYWlsZWQodGVzdEVycm9yKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChlcnJvclN0YXRlID09IEVSUk9SX1NUQVRFLlJFQ0VJVklOR19IRUFERVIpIHsKKyAgICAgICAgICAgICAgICBkb3duc3RyZWFtRmlsdGVyLndyaXRlKGRhdGEsIG5ldyBDb21wbGV0aW9uSGFuZGxlcjxIdHRwUmVxdWVzdD4oKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBjb21wbGV0ZWQoSHR0cFJlcXVlc3QgcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uSGFuZGxlci5jb21wbGV0ZWQocmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIGRvd25zdHJlYW1GaWx0ZXIub25FcnJvcih0ZXN0RXJyb3IpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZG93bnN0cmVhbUZpbHRlci53cml0ZShkYXRhLCBjb21wbGV0aW9uSGFuZGxlcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgdm9pZCBjb25uZWN0KFNvY2tldEFkZHJlc3MgYWRkcmVzcywgRmlsdGVyPD8sID8sIEh0dHBSZXF1ZXN0LCBIdHRwUmVzcG9uc2U+IHVwc3RyZWFtRmlsdGVyKSB7CisgICAgICAgICAgICBpZiAoZXJyb3JTdGF0ZSA9PSBFUlJPUl9TVEFURS5MT1NUX0NPTk5FQ1QpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChlcnJvclN0YXRlID09IEVSUk9SX1NUQVRFLkNPTk5FQ1RJTkcpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN1cGVyLmNvbm5lY3QoYWRkcmVzcywgdXBzdHJlYW1GaWx0ZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBlbnVtIEVSUk9SX1NUQVRFIHsKKyAgICAgICAgTk9ORSwKKyAgICAgICAgQ09OTkVDVElORywKKyAgICAgICAgU0VORElORywKKyAgICAgICAgUkVDRUlWSU5HX0hFQURFUiwKKyAgICAgICAgTE9TVF9SRVFVRVNULAorICAgICAgICBMT1NUX0NPTk5FQ1QKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL0h0dHBQYXJzZXJUZXN0LmphdmEgYi9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL0h0dHBQYXJzZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjczYThiYgotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvSHR0cFBhcnNlclRlc3QuamF2YQpAQCAtMCwwICsxLDUyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZGsuY29ubmVjdG9yLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiBAYXV0aG9yIFBldHIgSmFub3VjaCAocGV0ci5qYW5vdWNoIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBIdHRwUGFyc2VyVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDaGFyc2V0IHJlc3BvbnNlRW5jb2RpbmcgPSBDaGFyc2V0LmZvck5hbWUoIklTTy04ODU5LTEiKTsKKworICAgIHByaXZhdGUgSHR0cFBhcnNlciBodHRwUGFyc2VyOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHByZXBhcmUoKSB7CisgICAgICAgIGh0dHBQYXJzZXIgPSBuZXcgSHR0cFBhcnNlcigxMDAwLCAxMDAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNwb25zZUxpbmVJbk9uZVBpZWNlKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdFJlc3BvbnNlTGluZShJbnRlZ2VyLk1BWF9WQUxVRSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzcG9uc2VMaW5lU2VnbWVudGVkKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdFJlc3BvbnNlTGluZSgyMCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RSZXNwb25zZUxpbmUoaW50IHNlZ21lbnRTaXplKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICBodHRwUGFyc2VyLnJlc2V0KGZhbHNlKTsKKyAgICAgICAgZmVlZFBhcnNlcigiSFRUUC8xLjEgMTIzIEEgbWVhbmluZ2Z1bCBjb2RlXHJcblxyXG4iLCBzZWdtZW50U2l6ZSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShodHRwUGFyc2VyLmlzSGVhZGVyUGFyc2VkKCkpOworICAgICAgICBhc3NlcnRUcnVlKGh0dHBQYXJzZXIuaXNDb21wbGV0ZSgpKTsKKworICAgICAgICBIdHRwUmVzcG9uc2UgaHR0cFJlc3BvbnNlID0gaHR0cFBhcnNlci5nZXRIdHRwUmVzcG9uc2UoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChodHRwUmVzcG9uc2UpOworCisgICAgICAgIGFzc2VydEVxdWFscygiSFRUUC8xLjEiLCBodHRwUmVzcG9uc2UuZ2V0UHJvdG9jb2xWZXJzaW9uKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTIzLCBodHRwUmVzcG9uc2UuZ2V0U3RhdHVzQ29kZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBIG1lYW5pbmdmdWwgY29kZSIsIGh0dHBSZXNwb25zZS5nZXRSZWFzb25QaHJhc2UoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVhZGVyc0luT25lUGllY2UoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICB0ZXN0SGVhZGVycyhJbnRlZ2VyLk1BWF9WQUxVRSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVhZGVyc1NlZ21lbnRlZCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RIZWFkZXJzKDIwKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdEhlYWRlcnMoaW50IHNlZ21lbnRTaXplKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICBodHRwUGFyc2VyLnJlc2V0KGZhbHNlKTsKKyAgICAgICAgU3RyaW5nQnVpbGRlciByZXF1ZXN0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgcmVxdWVzdC5hcHBlbmQoIkhUVFAvMS4xIDEyMyBBIG1lYW5pbmdmdWwgY29kZVxyXG4iKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoIm5hbWUxOiB2YWx1ZTFcclxuIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJuYW1lMjogdmFsdWUyXHJcblxyXG4iKTsKKyAgICAgICAgZmVlZFBhcnNlcihyZXF1ZXN0LnRvU3RyaW5nKCksIHNlZ21lbnRTaXplKTsKKworICAgICAgICBhc3NlcnRUcnVlKGh0dHBQYXJzZXIuaXNIZWFkZXJQYXJzZWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoaHR0cFBhcnNlci5pc0NvbXBsZXRlKCkpOworCisgICAgICAgIHZlcmlmeUhlYWRlclZhbHVlKCJuYW1lMSIsICJ2YWx1ZTEiKTsKKyAgICAgICAgdmVyaWZ5SGVhZGVyVmFsdWUoIm5hbWUyIiwgInZhbHVlMiIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlIZWFkZXJWYWx1ZShTdHJpbmcgbmFtZSwgU3RyaW5nLi4uIGV4cGVjdGVkVmFsdWVzKSB7CisgICAgICAgIHZlcmlmeUhlYWRlclZhbHVlKG5hbWUsIGZhbHNlLCBleHBlY3RlZFZhbHVlcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZlcmlmeVRyYWlsZXJIZWFkZXJWYWx1ZShTdHJpbmcgbmFtZSwgU3RyaW5nLi4uIGV4cGVjdGVkVmFsdWVzKSB7CisgICAgICAgIHZlcmlmeUhlYWRlclZhbHVlKG5hbWUsIHRydWUsIGV4cGVjdGVkVmFsdWVzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5SGVhZGVyVmFsdWUoU3RyaW5nIG5hbWUsIGJvb2xlYW4gdHJhaWxlckhlYWRlciwgU3RyaW5nLi4uIGV4cGVjdGVkVmFsdWVzKSB7CisgICAgICAgIEh0dHBSZXNwb25zZSBodHRwUmVzcG9uc2UgPSBodHRwUGFyc2VyLmdldEh0dHBSZXNwb25zZSgpOworICAgICAgICBMaXN0PFN0cmluZz4gcmVjZWl2ZWRWYWx1ZXM7CisKKyAgICAgICAgaWYgKHRyYWlsZXJIZWFkZXIpIHsKKyAgICAgICAgICAgIHJlY2VpdmVkVmFsdWVzID0gaHR0cFJlc3BvbnNlLmdldFRyYWlsZXJIZWFkZXIobmFtZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZWNlaXZlZFZhbHVlcyA9IGh0dHBSZXNwb25zZS5nZXRIZWFkZXIobmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnROb3ROdWxsKHJlY2VpdmVkVmFsdWVzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVmFsdWVzLmxlbmd0aCwgcmVjZWl2ZWRWYWx1ZXMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChTdHJpbmcgZXhwZWN0ZWRWYWx1ZSA6IGV4cGVjdGVkVmFsdWVzKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHJlY2VpdmVkVmFsdWVzLmNvbnRhaW5zKGV4cGVjdGVkVmFsdWUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpeGVkTGVuZ3RoQm9keUluT25lUGllY2UoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdEZpeGVkTGVuZ3RoQm9keShJbnRlZ2VyLk1BWF9WQUxVRSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rml4ZWRMZW5ndGhCb2R5U2VnbWVudGVkKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RGaXhlZExlbmd0aEJvZHkoMjApOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0Rml4ZWRMZW5ndGhCb2R5KGludCBzZWdtZW50U2l6ZSkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGh0dHBQYXJzZXIucmVzZXQodHJ1ZSk7CisKKyAgICAgICAgU3RyaW5nQnVpbGRlciByZXF1ZXN0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgcmVxdWVzdC5hcHBlbmQoIkhUVFAvMS4xIDEyMyBBIG1lYW5pbmdmdWwgY29kZVxyXG4iKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoIm5hbWUxOiB2YWx1ZTFcclxuIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJuYW1lMjogdmFsdWUyXHJcbiIpCisgICAgICAgICAgICAgICAgLmFwcGVuZCgiQ29udGVudC1MZW5ndGg6IDU2XHJcblxyXG4iKTsKKworICAgICAgICBTdHJpbmdCdWlsZGVyIGJvZHlCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDg7IGkrKykgeworICAgICAgICAgICAgYm9keUJ1aWxkZXIuYXBwZW5kKCJBQkNERUZHIik7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgYm9keSA9IGJvZHlCdWlsZGVyLnRvU3RyaW5nKCk7CisgICAgICAgIHJlcXVlc3QuYXBwZW5kKGJvZHkpOworCisgICAgICAgIGZlZWRQYXJzZXIocmVxdWVzdC50b1N0cmluZygpLCBzZWdtZW50U2l6ZSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShodHRwUGFyc2VyLmlzSGVhZGVyUGFyc2VkKCkpOworICAgICAgICBhc3NlcnRUcnVlKGh0dHBQYXJzZXIuaXNDb21wbGV0ZSgpKTsKKworICAgICAgICB2ZXJpZnlSZWNlaXZlZEJvZHkoYm9keSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2h1bmtlZEJvZHlJbk9uZVBpZWNlKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RDaHVua2VkQm9keShJbnRlZ2VyLk1BWF9WQUxVRSwgMjUsIGdlbmVyYXRlQm9keSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDaHVua2VkQm9keVNlZ21lbnRlZFdpdGhTbWFsbENodW5rKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RDaHVua2VkQm9keSgyMCwgMTUsIGdlbmVyYXRlQm9keSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDaHVua2VkQm9keVNlZ21lbnRlZFdpdGhMYXJnZXJDaHVuaygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICB0ZXN0Q2h1bmtlZEJvZHkoMjAsIDIzLCBnZW5lcmF0ZUJvZHkoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlDaHVua2VkQm9keSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICB0ZXN0Q2h1bmtlZEJvZHkoSW50ZWdlci5NQVhfVkFMVUUsIDI1LCAiIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RDaHVua2VkQm9keShpbnQgc2VnbWVudFNpemUsIGludCBjaHVua1NpemUsIFN0cmluZyByZXNwb25zZUJvZHkpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBodHRwUGFyc2VyLnJlc2V0KHRydWUpOworCisgICAgICAgIFN0cmluZ0J1aWxkZXIgcmVxdWVzdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJIVFRQLzEuMSAxMjMgQSBtZWFuaW5nZnVsIGNvZGVcclxuIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJuYW1lMTogdmFsdWUxXHJcbiIpCisgICAgICAgICAgICAgICAgLmFwcGVuZCgibmFtZTI6IHZhbHVlMlxyXG4iKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoIlRyYW5zZmVyLWVuY29kaW5nOiBjaHVua2VkXHJcblxyXG4iKTsKKworICAgICAgICBTdHJpbmcgY2h1bmtlZEJvZHkgPSBlbmNvZGVDaHVuayhyZXNwb25zZUJvZHksIGNodW5rU2l6ZSwgbmV3IEhhc2hNYXA8PigpKTsKKyAgICAgICAgcmVxdWVzdC5hcHBlbmQoY2h1bmtlZEJvZHkpOworCisgICAgICAgIGZlZWRQYXJzZXIocmVxdWVzdC50b1N0cmluZygpLCBzZWdtZW50U2l6ZSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShodHRwUGFyc2VyLmlzSGVhZGVyUGFyc2VkKCkpOworICAgICAgICBhc3NlcnRUcnVlKGh0dHBQYXJzZXIuaXNDb21wbGV0ZSgpKTsKKworICAgICAgICB2ZXJpZnlSZWNlaXZlZEJvZHkocmVzcG9uc2VCb2R5KTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBlbmNvZGVDaHVuayhTdHJpbmcgbWVzc2FnZSwgaW50IGNodW5rU2l6ZSwgTWFwPFN0cmluZywgU3RyaW5nPiB0cmFpbGVySGVhZGVycykKKyAgICAgICAgICAgIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IG1lc3NhZ2VMZW5ndGggPSBtZXNzYWdlLmdldEJ5dGVzKCJBU0NJSSIpLmxlbmd0aDsKKyAgICAgICAgaW50IGNodW5rU3RhcnRJZHggPSAwOworCisgICAgICAgIFN0cmluZ0J1aWxkZXIgYm9keSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIHdoaWxlIChjaHVua1N0YXJ0SWR4IDwgbWVzc2FnZUxlbmd0aCkgeworICAgICAgICAgICAgaW50IGNodW5rTGVuZ3RoID0gY2h1bmtTdGFydElkeCArIGNodW5rU2l6ZSA8IG1lc3NhZ2VMZW5ndGggLSAxID8gY2h1bmtTaXplIDogbWVzc2FnZUxlbmd0aCAtIGNodW5rU3RhcnRJZHg7CisgICAgICAgICAgICBib2R5LmFwcGVuZChJbnRlZ2VyLnRvSGV4U3RyaW5nKGNodW5rTGVuZ3RoKSkuYXBwZW5kKCJcclxuIik7CisgICAgICAgICAgICBib2R5LmFwcGVuZChtZXNzYWdlLnN1YnN0cmluZyhjaHVua1N0YXJ0SWR4LCBjaHVua1N0YXJ0SWR4ICsgY2h1bmtMZW5ndGgpKTsKKyAgICAgICAgICAgIGJvZHkuYXBwZW5kKCJcclxuIik7CisgICAgICAgICAgICBjaHVua1N0YXJ0SWR4ICs9IGNodW5rTGVuZ3RoOworICAgICAgICB9CisKKyAgICAgICAgYm9keS5hcHBlbmQoIjAiKS5hcHBlbmQoIlxyXG4iKTsKKworICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gaGVhZGVyIDogdHJhaWxlckhlYWRlcnMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgYm9keS5hcHBlbmQoaGVhZGVyLmdldEtleSgpKS5hcHBlbmQoIjogIikuYXBwZW5kKGhlYWRlci5nZXRWYWx1ZSgpKS5hcHBlbmQoIlxyXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGJvZHkuYXBwZW5kKCJcclxuIik7CisKKyAgICAgICAgcmV0dXJuIGJvZHkudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aWxpbmVIZWFkZXJJbk9uZVBpZWNlKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdE11bHRpbGluZUhlYWRlcihJbnRlZ2VyLk1BWF9WQUxVRSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlsaW5lSGVhZGVyU2VnbWVudGVkKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdE11bHRpbGluZUhlYWRlcigxMCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RNdWx0aWxpbmVIZWFkZXIoaW50IHNlZ21lbnRTaXplKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICBodHRwUGFyc2VyLnJlc2V0KGZhbHNlKTsKKyAgICAgICAgU3RyaW5nQnVpbGRlciByZXF1ZXN0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgcmVxdWVzdC5hcHBlbmQoIkhUVFAvMS4xIDEyMyBBIG1lYW5pbmdmdWwgY29kZVxyXG4iKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoIm5hbWUxOiB2YWx1ZTFcclxuIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJtdWx0aS1saW5lOiBmaXJzdFxyXG4gICAgICAgICAgc2Vjb25kXHJcbiAgICAgICB0aGlyZFxyXG4iKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoIm5hbWUyOiB2YWx1ZTJcclxuXHJcbiIpOworICAgICAgICBmZWVkUGFyc2VyKHJlcXVlc3QudG9TdHJpbmcoKSwgc2VnbWVudFNpemUpOworCisgICAgICAgIGFzc2VydFRydWUoaHR0cFBhcnNlci5pc0hlYWRlclBhcnNlZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShodHRwUGFyc2VyLmlzQ29tcGxldGUoKSk7CisKKyAgICAgICAgdmVyaWZ5SGVhZGVyVmFsdWUoIm5hbWUxIiwgInZhbHVlMSIpOworICAgICAgICB2ZXJpZnlIZWFkZXJWYWx1ZSgibmFtZTIiLCAidmFsdWUyIik7CisgICAgICAgIHZlcmlmeUhlYWRlclZhbHVlKCJtdWx0aS1saW5lIiwgImZpcnN0IHNlY29uZCB0aGlyZCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpbGluZUhlYWRlck5Jbk9uZVBpZWNlKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdE11bHRpbGluZUhlYWRlck4oSW50ZWdlci5NQVhfVkFMVUUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpbGluZUhlYWRlck5TZWdtZW50ZWQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICB0ZXN0TXVsdGlsaW5lSGVhZGVyTigxMCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RNdWx0aWxpbmVIZWFkZXJOKGludCBzZWdtZW50U2l6ZSkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgaHR0cFBhcnNlci5yZXNldChmYWxzZSk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgcmVxdWVzdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJIVFRQLzEuMSAxMjMgQSBtZWFuaW5nZnVsIGNvZGVcclxuIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJuYW1lMTogdmFsdWUxXHJcbiIpCisgICAgICAgICAgICAgICAgLmFwcGVuZCgibXVsdGktbGluZTogZmlyc3RcbiAgICAgICAgICBzZWNvbmRcbiAgICAgICB0aGlyZFxyXG4iKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoIm5hbWUyOiB2YWx1ZTJcclxuXHJcbiIpOworICAgICAgICBmZWVkUGFyc2VyKHJlcXVlc3QudG9TdHJpbmcoKSwgc2VnbWVudFNpemUpOworCisgICAgICAgIGFzc2VydFRydWUoaHR0cFBhcnNlci5pc0hlYWRlclBhcnNlZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShodHRwUGFyc2VyLmlzQ29tcGxldGUoKSk7CisKKyAgICAgICAgdmVyaWZ5SGVhZGVyVmFsdWUoIm5hbWUxIiwgInZhbHVlMSIpOworICAgICAgICB2ZXJpZnlIZWFkZXJWYWx1ZSgibmFtZTIiLCAidmFsdWUyIik7CisgICAgICAgIHZlcmlmeUhlYWRlclZhbHVlKCJtdWx0aS1saW5lIiwgImZpcnN0IHNlY29uZCB0aGlyZCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE92ZXJmbG93UHJvdG9jb2woKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0ZXN0T3ZlcmZsb3coIkhUVFAvMS4wIDQwNCBOb3QgZm91bmRcblxuIiwgMik7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUodHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPdmVyZmxvd0NvZGUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0ZXN0T3ZlcmZsb3coIkhUVFAvMS4wIDQwNCBOb3QgZm91bmRcblxuIiwgMTEpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3ZlcmZsb3dQaHJhc2UoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0ZXN0T3ZlcmZsb3coIkhUVFAvMS4wIDQwNCBOb3QgZm91bmRcblxuIiwgMTkpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3ZlcmZsb3dIZWFkZXIoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0ZXN0T3ZlcmZsb3coIkhUVFAvMS4wIDQwNCBOb3QgZm91bmRcbkhlYWRlcjE6IHNvbWV2YWx1ZVxuXG4iLCAzMCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUodHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFpbGVySGVhZGVyc0luT25lUGllY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdFRyYWlsZXJIZWFkZXJzKEludGVnZXIuTUFYX1ZBTFVFLCAxNSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhaWxlckhlYWRlcnNTZWdtZW50ZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdFRyYWlsZXJIZWFkZXJzKDIwLCAxNSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3BhY2VzSW5DaHVua1NpemVIZWFkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaHR0cFBhcnNlci5yZXNldCh0cnVlKTsKKworICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3BvbnNlID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgcmVzcG9uc2UuYXBwZW5kKCJIVFRQLzEuMSAxMjMgQSBtZWFuaW5nZnVsIGNvZGVcclxuIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZFxyXG5cclxuIik7CisKKyAgICAgICAgU3RyaW5nIGJvZHkgPSAiQUJDREUiOworICAgICAgICBTdHJpbmcgYm9keUxlbiA9IEludGVnZXIudG9IZXhTdHJpbmcoYm9keS5sZW5ndGgoKSk7CisgICAgICAgIHJlc3BvbnNlLmFwcGVuZCgiICAiKS5hcHBlbmQoYm9keUxlbikuYXBwZW5kKCIgICIpLmFwcGVuZCgiXHJcbiIpLmFwcGVuZChib2R5KS5hcHBlbmQoIlxyXG4iKTsKKyAgICAgICAgcmVzcG9uc2UuYXBwZW5kKCIgIDAgICIpLmFwcGVuZCgiXHJcbiIpLmFwcGVuZCgiXHJcbiIpOworCisgICAgICAgIGZlZWRQYXJzZXIocmVzcG9uc2UudG9TdHJpbmcoKSwgSW50ZWdlci5NQVhfVkFMVUUpOworCisgICAgICAgIGFzc2VydFRydWUoaHR0cFBhcnNlci5pc0hlYWRlclBhcnNlZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShodHRwUGFyc2VyLmlzQ29tcGxldGUoKSk7CisgICAgICAgIHZlcmlmeVJlY2VpdmVkQm9keShib2R5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHNlZW1zIHRvIGJlIGJyb2tlbiBpbiBHcml6emx5IHBhcnNlcgorICAgICAqLworICAgIEBJZ25vcmUKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDaHVua0V4dGVuc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBodHRwUGFyc2VyLnJlc2V0KHRydWUpOworCisgICAgICAgIFN0cmluZ0J1aWxkZXIgcmVzcG9uc2UgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICByZXNwb25zZS5hcHBlbmQoIkhUVFAvMS4xIDEyMyBBIG1lYW5pbmdmdWwgY29kZVxyXG4iKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoIlRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkXHJcblxyXG4iKTsKKworICAgICAgICBTdHJpbmcgYm9keSA9ICJBQkNERSI7CisgICAgICAgIFN0cmluZyBib2R5TGVuID0gSW50ZWdlci50b0hleFN0cmluZyhib2R5Lmxlbmd0aCgpKTsKKyAgICAgICAgcmVzcG9uc2UuYXBwZW5kKGJvZHlMZW4pLmFwcGVuZCgiO2V4dE5hbWU9ZXh0VmFsdWUiKS5hcHBlbmQoIlxyXG4iKS5hcHBlbmQoYm9keSkuYXBwZW5kKCJcclxuIik7CisgICAgICAgIHJlc3BvbnNlLmFwcGVuZCgiMDtleHROYW1lMj1leHRWYWx1ZTIiKS5hcHBlbmQoIlxyXG4iKS5hcHBlbmQoIlxyXG4iKTsKKworICAgICAgICBmZWVkUGFyc2VyKHJlc3BvbnNlLnRvU3RyaW5nKCksIEludGVnZXIuTUFYX1ZBTFVFKTsKKworICAgICAgICBhc3NlcnRUcnVlKGh0dHBQYXJzZXIuaXNIZWFkZXJQYXJzZWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoaHR0cFBhcnNlci5pc0NvbXBsZXRlKCkpOworICAgICAgICB2ZXJpZnlSZWNlaXZlZEJvZHkoYm9keSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2FtZUhlYWRlcnMoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICBodHRwUGFyc2VyLnJlc2V0KGZhbHNlKTsKKyAgICAgICAgU3RyaW5nQnVpbGRlciByZXF1ZXN0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgcmVxdWVzdC5hcHBlbmQoIkhUVFAvMS4xIDEyMyBBIG1lYW5pbmdmdWwgY29kZVxyXG4iKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoIm5hbWUxOiB2YWx1ZTFcclxuIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJuYW1lMjogdmFsdWUyXHJcbiIpCisgICAgICAgICAgICAgICAgLmFwcGVuZCgibmFtZTM6IHZhbHVlM1xyXG4iKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoIm5hbWUyOiB2YWx1ZTRcclxuXHJcbiIpOworICAgICAgICBmZWVkUGFyc2VyKHJlcXVlc3QudG9TdHJpbmcoKSwgSW50ZWdlci5NQVhfVkFMVUUpOworCisgICAgICAgIGFzc2VydFRydWUoaHR0cFBhcnNlci5pc0hlYWRlclBhcnNlZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShodHRwUGFyc2VyLmlzQ29tcGxldGUoKSk7CisKKyAgICAgICAgdmVyaWZ5SGVhZGVyVmFsdWUoIm5hbWUxIiwgInZhbHVlMSIpOworICAgICAgICB2ZXJpZnlIZWFkZXJWYWx1ZSgibmFtZTIiLCAidmFsdWUyIiwgInZhbHVlMiIpOworICAgICAgICB2ZXJpZnlIZWFkZXJWYWx1ZSgibmFtZTMiLCAidmFsdWUzIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2FtZUhlYWRlcnNDb21tYVNlcGFyYXRlZCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIGh0dHBQYXJzZXIucmVzZXQoZmFsc2UpOworICAgICAgICBTdHJpbmdCdWlsZGVyIHJlcXVlc3QgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICByZXF1ZXN0LmFwcGVuZCgiSFRUUC8xLjEgMTIzIEEgbWVhbmluZ2Z1bCBjb2RlXHJcbiIpCisgICAgICAgICAgICAgICAgLmFwcGVuZCgibmFtZTE6IHZhbHVlMVxyXG4iKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoIm5hbWUyOiB2YWx1ZTIsIHZhbHVlNFxyXG4iKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoIm5hbWUzOiB2YWx1ZTNcclxuXHJcbiIpOworICAgICAgICBmZWVkUGFyc2VyKHJlcXVlc3QudG9TdHJpbmcoKSwgSW50ZWdlci5NQVhfVkFMVUUpOworCisgICAgICAgIGFzc2VydFRydWUoaHR0cFBhcnNlci5pc0hlYWRlclBhcnNlZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShodHRwUGFyc2VyLmlzQ29tcGxldGUoKSk7CisKKyAgICAgICAgdmVyaWZ5SGVhZGVyVmFsdWUoIm5hbWUxIiwgInZhbHVlMSIpOworICAgICAgICB2ZXJpZnlIZWFkZXJWYWx1ZSgibmFtZTIiLCAidmFsdWUyIiwgInZhbHVlNCIpOworICAgICAgICB2ZXJpZnlIZWFkZXJWYWx1ZSgibmFtZTMiLCAidmFsdWUzIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zZXBhcmFibGVIZWFkZXJzKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgaHR0cFBhcnNlci5yZXNldChmYWxzZSk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgcmVxdWVzdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJIVFRQLzEuMSAxMjMgQSBtZWFuaW5nZnVsIGNvZGVcclxuIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJuYW1lMTogdmFsdWUxXHJcbiIpCisgICAgICAgICAgICAgICAgLmFwcGVuZCgiV1dXLUF1dGhlbnRpY2F0ZTogdmFsdWUyLCB2YWx1ZTRcclxuIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJuYW1lMzogdmFsdWUzLCB2YWx1ZTVcclxuXHJcbiIpOworICAgICAgICBmZWVkUGFyc2VyKHJlcXVlc3QudG9TdHJpbmcoKSwgSW50ZWdlci5NQVhfVkFMVUUpOworCisgICAgICAgIGFzc2VydFRydWUoaHR0cFBhcnNlci5pc0hlYWRlclBhcnNlZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShodHRwUGFyc2VyLmlzQ29tcGxldGUoKSk7CisKKyAgICAgICAgdmVyaWZ5SGVhZGVyVmFsdWUoIm5hbWUxIiwgInZhbHVlMSIpOworICAgICAgICB2ZXJpZnlIZWFkZXJWYWx1ZSgiV1dXLUF1dGhlbnRpY2F0ZSIsICJ2YWx1ZTIsIHZhbHVlNCIpOworICAgICAgICB2ZXJpZnlIZWFkZXJWYWx1ZSgibmFtZTMiLCAidmFsdWUzIiwgInZhbHVlNSIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0VHJhaWxlckhlYWRlcnMoaW50IHNlZ21lbnRTaXplLCBpbnQgY2h1bmtTaXplKSB0aHJvd3MgSU9FeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgaHR0cFBhcnNlci5yZXNldCh0cnVlKTsKKworICAgICAgICBTdHJpbmdCdWlsZGVyIHJlcXVlc3QgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICByZXF1ZXN0LmFwcGVuZCgiSFRUUC8xLjEgMTIzIEEgbWVhbmluZ2Z1bCBjb2RlXHJcbiIpCisgICAgICAgICAgICAgICAgLmFwcGVuZCgibmFtZTE6IHZhbHVlMVxyXG4iKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoIm5hbWUyOiB2YWx1ZTJcclxuIikKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJUcmFuc2Zlci1FbmNvZGluZzogY2h1bmtlZFxyXG5cclxuIik7CisKKyAgICAgICAgU3RyaW5nQnVpbGRlciBib2R5QnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgICAgIGJvZHlCdWlsZGVyLmFwcGVuZCgiQUJDREVGRyIpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGJvZHkgPSBib2R5QnVpbGRlci50b1N0cmluZygpOworCisgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gdHJhaWxlckhlYWRlcnMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIHRyYWlsZXJIZWFkZXJzLnB1dCgibmFtZTMiLCAidmFsdWUzIik7CisgICAgICAgIHRyYWlsZXJIZWFkZXJzLnB1dCgibmFtZTIiLCAidmFsdWU0Iik7CisKKyAgICAgICAgU3RyaW5nIGNodW5rZWRCb2R5ID0gZW5jb2RlQ2h1bmsoYm9keSwgY2h1bmtTaXplLCB0cmFpbGVySGVhZGVycyk7CisgICAgICAgIHJlcXVlc3QuYXBwZW5kKGNodW5rZWRCb2R5KTsKKworICAgICAgICBmZWVkUGFyc2VyKHJlcXVlc3QudG9TdHJpbmcoKSwgc2VnbWVudFNpemUpOworCisgICAgICAgIGFzc2VydFRydWUoaHR0cFBhcnNlci5pc0hlYWRlclBhcnNlZCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShodHRwUGFyc2VyLmlzQ29tcGxldGUoKSk7CisKKyAgICAgICAgdmVyaWZ5SGVhZGVyVmFsdWUoIm5hbWUxIiwgInZhbHVlMSIpOworICAgICAgICB2ZXJpZnlIZWFkZXJWYWx1ZSgibmFtZTIiLCAidmFsdWUyIik7CisgICAgICAgIHZlcmlmeVRyYWlsZXJIZWFkZXJWYWx1ZSgibmFtZTMiLCAidmFsdWUzIik7CisgICAgICAgIHZlcmlmeVRyYWlsZXJIZWFkZXJWYWx1ZSgibmFtZTIiLCAidmFsdWU0Iik7CisKKyAgICAgICAgdmVyaWZ5UmVjZWl2ZWRCb2R5KGJvZHkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0T3ZlcmZsb3coU3RyaW5nIHJlc3BvbnNlLCBpbnQgbWF4SGVhZGVyU2l6ZSkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgaHR0cFBhcnNlciA9IG5ldyBIdHRwUGFyc2VyKG1heEhlYWRlclNpemUsIEludGVnZXIuTUFYX1ZBTFVFKTsKKyAgICAgICAgaHR0cFBhcnNlci5yZXNldChmYWxzZSk7CisgICAgICAgIGZlZWRQYXJzZXIocmVzcG9uc2UsIEludGVnZXIuTUFYX1ZBTFVFKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmVyaWZ5UmVjZWl2ZWRCb2R5KFN0cmluZyBzZW50TWVzc2FnZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSHR0cFJlc3BvbnNlIGh0dHBSZXNwb25zZSA9IGh0dHBQYXJzZXIuZ2V0SHR0cFJlc3BvbnNlKCk7CisgICAgICAgIEFzeW5jaHJvbm91c0JvZHlJbnB1dFN0cmVhbSBib2R5U3RyZWFtID0gaHR0cFJlc3BvbnNlLmdldEJvZHlTdHJlYW0oKTsKKworICAgICAgICBieXRlW10gcmVjZWl2ZWRCeXRlcyA9IG5ldyBieXRlW3NlbnRNZXNzYWdlLmdldEJ5dGVzKCJBU0NJSSIpLmxlbmd0aF07CisgICAgICAgIGludCB3cml0ZUlkeCA9IDA7CisKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGJ5dGUgYiA9IChieXRlKSBib2R5U3RyZWFtLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChiID09IChieXRlKSAtMSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAod3JpdGVJZHggPT0gcmVjZWl2ZWRCeXRlcy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlY2VpdmVkQnl0ZXNbd3JpdGVJZHhdID0gYjsKKyAgICAgICAgICAgIHdyaXRlSWR4Kys7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcmVjZWl2ZWRNZXNzYWdlID0gbmV3IFN0cmluZyhyZWNlaXZlZEJ5dGVzLCAiQVNDSUkiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNlbnRNZXNzYWdlLCByZWNlaXZlZE1lc3NhZ2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBmZWVkUGFyc2VyKFN0cmluZyByZXF1ZXN0LCBpbnQgc2VnbWVudFNpemUpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIExpc3Q8Qnl0ZUJ1ZmZlcj4gc2VyaWFsaXplZFJlc3BvbnNlID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGJ5dGVbXSBieXRlcyA9IHJlcXVlc3QuZ2V0Qnl0ZXMocmVzcG9uc2VFbmNvZGluZyk7CisgICAgICAgIEJ5dGVCdWZmZXIgYnVmZmVyZWRSZXNwb25zZSA9IEJ5dGVCdWZmZXIud3JhcChieXRlcyk7CisgICAgICAgIGludCBzZWdtZW50U3RhcnRJZHggPSAwOworICAgICAgICB3aGlsZSAoc2VnbWVudFN0YXJ0SWR4IDwgYnl0ZXMubGVuZ3RoIC0gMSkgeworICAgICAgICAgICAgaW50IHNlZ21lbnRMZW5ndGggPSBzZWdtZW50U3RhcnRJZHggKyBzZWdtZW50U2l6ZSA8IGJ5dGVzLmxlbmd0aCAtIDEgPyBzZWdtZW50U2l6ZSA6IGJ5dGVzLmxlbmd0aCAtIHNlZ21lbnRTdGFydElkeDsKKyAgICAgICAgICAgIGJ5dGVbXSBzZWdtZW50Qnl0ZXMgPSBuZXcgYnl0ZVtzZWdtZW50TGVuZ3RoXTsKKyAgICAgICAgICAgIGJ1ZmZlcmVkUmVzcG9uc2UuZ2V0KHNlZ21lbnRCeXRlcyk7CisgICAgICAgICAgICBCeXRlQnVmZmVyIHNlZ21lbnQgPSBCeXRlQnVmZmVyLndyYXAoc2VnbWVudEJ5dGVzKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRSZXNwb25zZS5hZGQoc2VnbWVudCk7CisgICAgICAgICAgICBzZWdtZW50U3RhcnRJZHggKz0gc2VnbWVudExlbmd0aDsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoQnl0ZUJ1ZmZlciBpbnB1dCA6IHNlcmlhbGl6ZWRSZXNwb25zZSkgeworICAgICAgICAgICAgaHR0cFBhcnNlci5wYXJzZShpbnB1dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZW5lcmF0ZUJvZHkoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYm9keUJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgICAgICBib2R5QnVpbGRlci5hcHBlbmQoIkFCQ0RFRkciKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBib2R5QnVpbGRlci50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvTW9kaWZ5SGVhZGVySW5Cb2R5V3JpdGVyVGVzdC5qYXZhIGIvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9Nb2RpZnlIZWFkZXJJbkJvZHlXcml0ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNlNjc3MgotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvTW9kaWZ5SGVhZGVySW5Cb2R5V3JpdGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lmpkay5jb25uZWN0b3IuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKKworaW1wb3J0IGphdmF4LndzLnJzLkhlYWRlclBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5SZXF1ZXN0RW50aXR5UHJvY2Vzc2luZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZGsuY29ubmVjdG9yLkpka0Nvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQGF1dGhvciBQZXRyIEphbm91Y2ggKHBldHIuamFub3VjaCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgTW9kaWZ5SGVhZGVySW5Cb2R5V3JpdGVyVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdSSVRFX0JZVEVTID0gIndyaXRlIGJ5dGVzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgV1JJVEVfQllURSA9ICJieXRlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX05BTUUgPSAibXlIZWFkZXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfVkFMVUUgPSAibXlIZWFkZXJWYWx1ZSI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzLCBIZWFkZXJNb2RpZnlpbmdXcml0ZXIuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihIZWFkZXJNb2RpZnlpbmdXcml0ZXIuY2xhc3MpOworICAgICAgICBjb25maWcuY29ubmVjdG9yUHJvdmlkZXIobmV3IEpka0Nvbm5lY3RvclByb3ZpZGVyKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ1ZmZlcmVkV3JpdGVCeXRlcygpIHsKKyAgICAgICAgZG9UZXN0V3JpdGVCeXRlcyhSZXF1ZXN0RW50aXR5UHJvY2Vzc2luZy5CVUZGRVJFRCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2h1bmtlZFdyaXRlQnl0ZXMoKSB7CisgICAgICAgIGRvVGVzdFdyaXRlQnl0ZXMoUmVxdWVzdEVudGl0eVByb2Nlc3NpbmcuQ0hVTktFRCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvVGVzdFdyaXRlQnl0ZXMoUmVxdWVzdEVudGl0eVByb2Nlc3NpbmcgcmVxdWVzdEVudGl0eVByb2Nlc3NpbmcpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImVjaG8iKS5yZXF1ZXN0KCkucHJvcGVydHkoQ2xpZW50UHJvcGVydGllcy5SRVFVRVNUX0VOVElUWV9QUk9DRVNTSU5HLCByZXF1ZXN0RW50aXR5UHJvY2Vzc2luZykKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KFdSSVRFX0JZVEVTLCBNZWRpYVR5cGUuVEVYVF9QTEFJTikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhIRUFERVJfVkFMVUUsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZyhIRUFERVJfTkFNRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoV1JJVEVfQllURVMsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnVmZmVyZWRXcml0ZUJ5dGUoKSB7CisgICAgICAgIGRvVGVzdFdyaXRlQnl0ZShSZXF1ZXN0RW50aXR5UHJvY2Vzc2luZy5CVUZGRVJFRCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2h1bmtlZFdyaXRlQnl0ZSgpIHsKKyAgICAgICAgZG9UZXN0V3JpdGVCeXRlKFJlcXVlc3RFbnRpdHlQcm9jZXNzaW5nLkNIVU5LRUQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb1Rlc3RXcml0ZUJ5dGUoUmVxdWVzdEVudGl0eVByb2Nlc3NpbmcgcmVxdWVzdEVudGl0eVByb2Nlc3NpbmcpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImVjaG8iKS5yZXF1ZXN0KCkucHJvcGVydHkoQ2xpZW50UHJvcGVydGllcy5SRVFVRVNUX0VOVElUWV9QUk9DRVNTSU5HLCByZXF1ZXN0RW50aXR5UHJvY2Vzc2luZykKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KFdSSVRFX0JZVEUsIE1lZGlhVHlwZS5URVhUX1BMQUlOKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEhFQURFUl9WQUxVRSwgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKEhFQURFUl9OQU1FKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhXUklURV9CWVRFLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ1ZmZlcmVkV3JpdGVOb3RoaW5nKCkgeworICAgICAgICBkb1Rlc3RXcml0ZU5vdGhpbmcoUmVxdWVzdEVudGl0eVByb2Nlc3NpbmcuQlVGRkVSRUQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENodW5rZWRXcml0ZU5vdGhpbmcoKSB7CisgICAgICAgIGRvVGVzdFdyaXRlTm90aGluZyhSZXF1ZXN0RW50aXR5UHJvY2Vzc2luZy5DSFVOS0VEKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9UZXN0V3JpdGVOb3RoaW5nKFJlcXVlc3RFbnRpdHlQcm9jZXNzaW5nIHJlcXVlc3RFbnRpdHlQcm9jZXNzaW5nKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJlY2hvIikucmVxdWVzdCgpLnByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuUkVRVUVTVF9FTlRJVFlfUFJPQ0VTU0lORywgcmVxdWVzdEVudGl0eVByb2Nlc3NpbmcpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eSgiIiwgTWVkaWFUeXBlLlRFWFRfUExBSU4pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoSEVBREVSX1ZBTFVFLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoSEVBREVSX05BTUUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBIZWFkZXJNb2RpZnlpbmdXcml0ZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVdyaXRlcjxTdHJpbmc+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoCisgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gdHlwZSwKKyAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSBTdHJpbmcuY2xhc3M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0U2l6ZSgKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdCwKKyAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgICAgIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKAorICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0LAorICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIGh0dHBIZWFkZXJzLnB1dFNpbmdsZShIRUFERVJfTkFNRSwgSEVBREVSX1ZBTFVFKTsKKworICAgICAgICAgICAgaWYgKFdSSVRFX0JZVEVTLmVxdWFscyh0KSkgeworICAgICAgICAgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZSh0LmdldEJ5dGVzKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoV1JJVEVfQllURS5lcXVhbHModCkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGJ5dGUgYiA6IHQuZ2V0Qnl0ZXMoKSkgeworICAgICAgICAgICAgICAgICAgICBlbnRpdHlTdHJlYW0ud3JpdGUoYik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBQYXRoKCJlY2hvIikKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L2h0bWwiKQorICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZWNobyhTdHJpbmcgbXNnLCBASGVhZGVyUGFyYW0oSEVBREVSX05BTUUpIFN0cmluZyBoZWFkZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygpLmVudGl0eShtc2cpLmhlYWRlcihIRUFERVJfTkFNRSwgSEVBREVSX1ZBTFVFKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9NdWx0aVZhbHVlSGVhZGVyVGVzdC5qYXZhIGIvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9NdWx0aVZhbHVlSGVhZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MWNlZDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL011bHRpVmFsdWVIZWFkZXJUZXN0LmphdmEKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZGsuY29ubmVjdG9yLmludGVybmFsOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZGsuY29ubmVjdG9yLkpka0Nvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIE11bHRpVmFsdWVIZWFkZXJUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAUGF0aCgidGVzdFJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RSZXNvdXJjZSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldChAQ29udGV4dCBIdHRwSGVhZGVycyBoKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaGVhZGVyU3RyaW5nID0gaC5nZXRIZWFkZXJTdHJpbmcoInRvb2xzIik7CisgICAgICAgICAgICBpZiAoImhhbW1lcixheGUsc2hvdmVsLGRyaWxsIi5lcXVhbHMoaGVhZGVyU3RyaW5nKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vayhoZWFkZXJTdHJpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAuaGVhZGVyKCJhbmltYWxzIiwgIm1vbGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmhlYWRlcigiYW5pbWFscyIsICJoZWRnZWhvZyIpCisgICAgICAgICAgICAgICAgICAgICAgICAuaGVhZGVyKCJhbmltYWxzIiwgImJhdCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuaGVhZGVyKCJhbmltYWxzIiwgInJhYmJpdCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnNlcnZlckVycm9yKCkuZW50aXR5KGhlYWRlclN0cmluZykuYnVpbGQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoVGVzdFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcuY29ubmVjdG9yUHJvdmlkZXIobmV3IEpka0Nvbm5lY3RvclByb3ZpZGVyKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvb2tpZVJlc291cmNlKCkgeworICAgICAgICAvLyB0aGUgZGVmYXVsdCBjb29raWUgcG9saWN5IGRvZXMgbm90IGxpa2UgY29va2llcyBmcm9tIGxvY2FsaG9zdAorICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgidGVzdFJlc291cmNlIikucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLmhlYWRlcigidG9vbHMiLCAiaGFtbWVyIikKKyAgICAgICAgICAgICAgICAuaGVhZGVyKCJ0b29scyIsICJheGUiKQorICAgICAgICAgICAgICAgIC5oZWFkZXIoInRvb2xzIiwgInNob3ZlbCIpCisgICAgICAgICAgICAgICAgLmhlYWRlcigidG9vbHMiLCAiZHJpbGwiKQorICAgICAgICAgICAgICAgIC5nZXQoKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworCisgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZXMgPSByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoImFuaW1hbHMiKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygibW9sZSxoZWRnZWhvZyxiYXQscmFiYml0IiwgdmFsdWVzKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvUHJveHlUZXN0LmphdmEgYi9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL1Byb3h5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxYTBhNzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL1Byb3h5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMzIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lmpkay5jb25uZWN0b3IuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50Lkludm9jYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5CYXNlNjQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamRrLmNvbm5lY3Rvci5KZGtDb25uZWN0b3JQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lmpkay5jb25uZWN0b3IuSmRrQ29ubmVjdG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guZ3JpenpseS5odHRwLnNlcnZlci5IdHRwSGFuZGxlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmdyaXp6bHkuaHR0cC5zZXJ2ZXIuSHR0cFNlcnZlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmdyaXp6bHkuaHR0cC5zZXJ2ZXIuUmVxdWVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmdyaXp6bHkuaHR0cC5zZXJ2ZXIuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCisvKioKKyAqIEBhdXRob3IgUGV0ciBKYW5vdWNoIChwZXRyLmphbm91Y2ggYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFByb3h5VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2hhcnNldCBDSEFSQUNURVJfU0VUID0gQ2hhcnNldC5mb3JOYW1lKCJpc28tODg1OS0xIik7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPWFlfSE9TVCA9ICJsb2NhbGhvc3QiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUk9YWV9QT1JUID0gODMyMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPWFlfVVNFUl9OQU1FID0gInBldHIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9YWV9QQVNTV09SRCA9ICJteSBzZWNyZXQgcGFzc3dvcmQiOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGRvVGVzdChQcm94eS5BdXRoZW50aWNhdGlvbi5OT05FKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCYXNpY0F1dGhlbnRpY2F0aW9uKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZG9UZXN0KFByb3h5LkF1dGhlbnRpY2F0aW9uLkJBU0lDKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REaWdlc3RBdXRoZW50aWNhdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGRvVGVzdChQcm94eS5BdXRoZW50aWNhdGlvbi5ESUdFU1QpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkb1Rlc3QoUHJveHkuQXV0aGVudGljYXRpb24gYXV0aGVudGljYXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFByb3h5IHByb3h5ID0gbmV3IFByb3h5KGF1dGhlbnRpY2F0aW9uKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByb3h5LnN0YXJ0KCk7CisgICAgICAgICAgICBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJyZXNvdXJjZSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiT0siLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShwcm94eS5nZXRQcm94eUhpdCgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHByb3h5LnN0b3AoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYXV0aGVudGljYXRpb25GYWlsVGVzdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFByb3h5IHByb3h5ID0gbmV3IFByb3h5KFByb3h5LkF1dGhlbnRpY2F0aW9uLkJBU0lDKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHByb3h5LnN0YXJ0KCk7CisgICAgICAgICAgICBwcm94eS5zZXRBdXRoZXJudGljYXRpb25GYWlsKHRydWUpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB0YXJnZXQoInJlc291cmNlIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFByb3h5QXV0aGVudGljYXRpb25FeGNlcHRpb24uY2xhc3MsIGUuZ2V0Q2F1c2UoKS5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShwcm94eS5nZXRQcm94eUhpdCgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHByb3h5LnN0b3AoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChmaW5hbCBDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5wcm9wZXJ0eShKZGtDb25uZWN0b3JQcm9wZXJ0aWVzLk1BWF9DT05ORUNUSU9OU19QRVJfREVTVElOQVRJT04sIDEpOworICAgICAgICBjb25maWcucHJvcGVydHkoQ2xpZW50UHJvcGVydGllcy5QUk9YWV9VUkksICJodHRwOi8vIiArIFBST1hZX0hPU1QgKyAiOiIgKyBQUk9YWV9QT1JUKTsKKyAgICAgICAgY29uZmlnLnByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuUFJPWFlfVVNFUk5BTUUsIFBST1hZX1VTRVJfTkFNRSk7CisgICAgICAgIGNvbmZpZy5wcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLlBST1hZX1BBU1NXT1JELCBQUk9YWV9QQVNTV09SRCk7CisgICAgICAgIGNvbmZpZy5jb25uZWN0b3JQcm92aWRlcihuZXcgSmRrQ29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgfQorCisgICAgQFBhdGgoIi9yZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiT0siOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJveHkgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgSHR0cFNlcnZlciBzZXJ2ZXIgPSBIdHRwU2VydmVyLmNyZWF0ZVNpbXBsZVNlcnZlcigiLyIsIFBST1hZX0hPU1QsIFBST1hZX1BPUlQpOworICAgICAgICBwcml2YXRlIHZvbGF0aWxlIFN0cmluZyBkZXN0aW5hdGlvblVyaSA9IG51bGw7CisgICAgICAgIHByaXZhdGUgZmluYWwgQXV0aGVudGljYXRpb24gYXV0aGVudGljYXRpb247CisgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBwcm94eUhpdCA9IGZhbHNlOworICAgICAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gYXV0aGVudGljYXRpb25GYWlsID0gZmFsc2U7CisKKyAgICAgICAgUHJveHkoQXV0aGVudGljYXRpb24gYXV0aGVudGljYXRpb24pIHsKKyAgICAgICAgICAgIHRoaXMuYXV0aGVudGljYXRpb24gPSBhdXRoZW50aWNhdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gZ2V0UHJveHlIaXQoKSB7CisgICAgICAgICAgICByZXR1cm4gcHJveHlIaXQ7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNldEF1dGhlcm50aWNhdGlvbkZhaWwoYm9vbGVhbiBhdXRoZW50aWNhdGlvbkZhaWwpIHsKKyAgICAgICAgICAgIHRoaXMuYXV0aGVudGljYXRpb25GYWlsID0gYXV0aGVudGljYXRpb25GYWlsOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzdGFydCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBzZXJ2ZXIuZ2V0U2VydmVyQ29uZmlndXJhdGlvbigpLmFkZEh0dHBIYW5kbGVyKG5ldyBIdHRwSGFuZGxlcigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXJ2aWNlKFJlcXVlc3QgcmVxdWVzdCwgUmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWVzdC5nZXRNZXRob2QoKS5nZXRNZXRob2RTdHJpbmcoKS5lcXVhbHMoIkNPTk5FQ1QiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlIaXQgPSB0cnVlOworCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXV0aG9yaXphdGlvbkhlYWRlciA9IHJlcXVlc3QuZ2V0SGVhZGVyKCJQcm94eS1BdXRob3JpemF0aW9uIik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdXRoZW50aWNhdGlvbiAhPSBBdXRoZW50aWNhdGlvbi5OT05FICYmIGF1dGhvcml6YXRpb25IZWFkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIG5lZWQgYXV0aGVudGljYXRpb24gYW5kIHJlY2VpdmUgQ09OTkVDVCB3aXRoIG5vIFByb3h5LWF1dGhvcml6YXRpb24gaGVhZGVyLCBzZW5kIDQwNworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmQ0MDcocmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF1dGhlbnRpY2F0aW9uRmFpbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmQ0MDcocmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF1dGhlbnRpY2F0aW9uID09IEF1dGhlbnRpY2F0aW9uLkJBU0lDKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2ZXJpZnlCYXNpY0F1dGhvcml6YXRpb25IZWFkZXIocmVzcG9uc2UsIGF1dGhvcml6YXRpb25IZWFkZXIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBzdWNjZXNzIGNvbnRpbnVlCisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXV0aGVudGljYXRpb24gPT0gQXV0aGVudGljYXRpb24uRElHRVNUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF2ZXJpZnlEaWdlc3RBdXRob3JpemF0aW9uSGVhZGVyKHJlc3BvbnNlLCBhdXRob3JpemF0aW9uSGVhZGVyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgc3VjY2VzcyBjb250aW51ZQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGF0IGJvdGggSG9zdCBoZWFkZXIgYW5kIFVSSSBjb250YWluIGhvc3Q6cG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlcXVlc3RVUkkgPSByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBob3N0ID0gcmVxdWVzdC5nZXRIZWFkZXIoIkhvc3QiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVxdWVzdFVSSS5lcXVhbHMoaG9zdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoNDAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlcXVlc3QgVVJJOiAiICsgcmVxdWVzdFVSSSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJIb3N0IGhlYWRlcjogIiArIGhvc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSB0aGUgZGVzdGluYXRpb24gd2hlcmUgYSBub3JtYWwgcHJveHkgd291bGQgb3BlbiBhIGNvbm5lY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uVXJpID0gImh0dHA6Ly8iICsgcmVxdWVzdFVSSTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cygyMDApOworICAgICAgICAgICAgICAgICAgICAgICAgaGFja0dyaXp6bHlDb25uZWN0KHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGhhbmRsZVRyYWZmaWNBZnRlckNvbm5lY3QocmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBzZXJ2ZXIuc3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBzZW5kNDA3KFJlcXVlc3QgcmVxdWVzdCwgUmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyg0MDcpOworCisgICAgICAgICAgICBpZiAoYXV0aGVudGljYXRpb24gPT0gQXV0aGVudGljYXRpb24uQkFTSUMpIHsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoIlByb3h5LUF1dGhlbnRpY2F0ZSIsICJCYXNpYyIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoIlByb3h5LUF1dGhlbnRpY2F0ZSIsICJEaWdlc3QgcmVhbG09XCJteS1yZWFsbVwiLCBkb21haW49XCJcIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAibm9uY2U9XCJuOWl2M01lU05rRWZNM3VKdDJnbkJVYVdVYktBbGp4cFwiLCBhbGdvcml0aG09TUQ1LCBcIlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgXCJxb3A9XCJhdXRoXCIsIHN0YWxlPWZhbHNlIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoYWNrR3JpenpseUNvbm5lY3QocmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIHZlcmlmeUJhc2ljQXV0aG9yaXphdGlvbkhlYWRlcihSZXNwb25zZSByZXNwb25zZSwgU3RyaW5nIGF1dGhvcml6YXRpb25IZWFkZXIpIHsKKyAgICAgICAgICAgIGlmICghYXV0aG9yaXphdGlvbkhlYWRlci5zdGFydHNXaXRoKCJCYXNpYyIpKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAorICAgICAgICAgICAgICAgICAgICAgICAgIkF1dGhvcml6YXRpb24gaGVhZGVyIGR1cmluZyBCYXNpYyBhdXRoZW50aWNhdGlvbiBkb2VzIG5vdCBzdGFydCB3aXRoIFwiQmFzaWNcIiIpOworICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyg0MDApOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZyBkZWNvZGVkID0gbmV3IFN0cmluZyhCYXNlNjQuZGVjb2RlKGF1dGhvcml6YXRpb25IZWFkZXIuc3Vic3RyaW5nKDYpLmdldEJ5dGVzKCkpLAorICAgICAgICAgICAgICAgICAgICBDSEFSQUNURVJfU0VUKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIHNwbGl0ID0gZGVjb2RlZC5zcGxpdCgiOiIpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHVzZXJuYW1lID0gc3BsaXRbMF07CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGFzc3dvcmQgPSBzcGxpdFsxXTsKKworICAgICAgICAgICAgaWYgKCF1c2VybmFtZS5lcXVhbHMoUFJPWFlfVVNFUl9OQU1FKSkgeworICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyg0MDApOworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRm91bmQgdW5leHBlY3RlZCB1c2VybmFtZTogIiArIHVzZXJuYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghcGFzc3dvcmQuZXF1YWxzKFBST1hZX1BBU1NXT1JEKSkgeworICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyg0MDApOworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRm91bmQgdW5leHBlY3RlZCBwYXNzd29yZDogIiArIHVzZXJuYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIHZlcmlmeURpZ2VzdEF1dGhvcml6YXRpb25IZWFkZXIoUmVzcG9uc2UgcmVzcG9uc2UsIFN0cmluZyBhdXRob3JpemF0aW9uSGVhZGVyKSB7CisgICAgICAgICAgICBpZiAoIWF1dGhvcml6YXRpb25IZWFkZXIuc3RhcnRzV2l0aCgiRGlnZXN0IikpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCisgICAgICAgICAgICAgICAgICAgICAgICAiQXV0aG9yaXphdGlvbiBoZWFkZXIgZHVyaW5nIERpZ2VzdCBhdXRoZW50aWNhdGlvbiBkb2VzIG5vdCBzdGFydCB3aXRoIFwiRGlnZXN0XCIiKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoNDAwKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIE1hdGNoZXIgbWF0Y2ggPSBQYXR0ZXJuLmNvbXBpbGUoInVzZXJuYW1lPVwiKFteXCJdKylcIiIpLm1hdGNoZXIoYXV0aG9yaXphdGlvbkhlYWRlcik7CisgICAgICAgICAgICBpZiAoIW1hdGNoLmZpbmQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB1c2VybmFtZSA9IG1hdGNoLmdyb3VwKDEpOworICAgICAgICAgICAgaWYgKCF1c2VybmFtZS5lcXVhbHMoUFJPWFlfVVNFUl9OQU1FKSkgeworICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyg0MDApOworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRm91bmQgdW5leHBlY3RlZCB1c2VybmFtZTogIiArIHVzZXJuYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGhhY2tHcml6emx5Q29ubmVjdChSZXF1ZXN0IHJlcXVlc3QsIFJlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgICAgICAgICAvLyBHcml6emx5IGRvZXMgbm90IGxpa2UgQ09OTkVDVCBtZXRob2QgYW5kIHNldHMga2VlcCBhbGl2ZSB0byBmYWxzZQorICAgICAgICAgICAgLy8gVGhpcyBoYWNrcyBHcml6emx5LCBzbyBpdCB3aWxsIGtlZXAgdGhlIGNvbm5lY3Rpb24gb3BlbgorICAgICAgICAgICAgcmVzcG9uc2UuZ2V0UmVzcG9uc2UoKS5nZXRQcm9jZXNzaW5nU3RhdGUoKS5zZXRLZWVwQWxpdmUodHJ1ZSk7CisgICAgICAgICAgICByZXNwb25zZS5nZXRSZXNwb25zZSgpLnNldENvbnRlbnRMZW5ndGgoMCk7CisgICAgICAgICAgICByZXF1ZXN0LnNldE1ldGhvZCgiR0VUIik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlVHJhZmZpY0FmdGVyQ29ubmVjdChSZXF1ZXN0IHJlcXVlc3QsIFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKGRlc3RpbmF0aW9uVXJpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBJdCBzZWVtcyB0aGF0IENPTk5FQ1QgaGFzIG5vdCBiZWVuIGNhbGxlZAorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVjZWl2ZWQgbm9uLUNPTk5FQ1Qgd2l0aG91dCByZWNlaXZpbmcgQ09OTkVDVCBmaXJzdCIpOworICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyg0MDApOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY3JlYXRlIGEgY2xpZW50IGFuZCByZWxheSB0aGUgcmVxdWVzdCB0byB0aGUgZmluYWwgZGVzdGluYXRpb24KKyAgICAgICAgICAgIENsaWVudENvbmZpZyBjbGllbnRDb25maWcgPSBuZXcgQ2xpZW50Q29uZmlnKCk7CisgICAgICAgICAgICBjbGllbnRDb25maWcuY29ubmVjdG9yUHJvdmlkZXIobmV3IEpka0Nvbm5lY3RvclByb3ZpZGVyKCkpOworICAgICAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KGNsaWVudENvbmZpZyk7CisKKyAgICAgICAgICAgIEludm9jYXRpb24uQnVpbGRlciBkZXN0aW5hdGlvblJlcXVlc3QgPSBjbGllbnQudGFyZ2V0KGRlc3RpbmF0aW9uVXJpKS5wYXRoKHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpKS5yZXF1ZXN0KCk7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBoZWFkZXJOYW1lIDogcmVxdWVzdC5nZXRIZWFkZXJOYW1lcygpKSB7CisgICAgICAgICAgICAgICAgZGVzdGluYXRpb25SZXF1ZXN0LmhlYWRlcihoZWFkZXJOYW1lLCByZXF1ZXN0LmdldEhlYWRlcihoZWFkZXJOYW1lKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2UgZGVzdGluYXRpb25SZXNwb25zZSA9IGRlc3RpbmF0aW9uUmVxdWVzdAorICAgICAgICAgICAgICAgICAgICAubWV0aG9kKHJlcXVlc3QuZ2V0TWV0aG9kKCkuZ2V0TWV0aG9kU3RyaW5nKCkpOworCisgICAgICAgICAgICAvLyB0cmFuc2xhdGUgdGhlIHJlY2VpdmVkIHJlc3BvbnNlIGludG8gdGhlIHByb3h5IHJlc3BvbnNlCisgICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoZGVzdGluYXRpb25SZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gcmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICBTdHJpbmcgYm9keSA9IGRlc3RpbmF0aW9uUmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgb3V0cHV0U3RyZWFtLndyaXRlKGJvZHkuZ2V0Qnl0ZXMoKSk7CisgICAgICAgICAgICBjbGllbnQuY2xvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgICAgIHNlcnZlci5zaHV0ZG93bigpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBlbnVtIEF1dGhlbnRpY2F0aW9uIHsKKyAgICAgICAgICAgIE5PTkUsCisgICAgICAgICAgICBCQVNJQywKKyAgICAgICAgICAgIERJR0VTVAorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9QdWJsaWNTaXRlc1Rlc3QuamF2YSBiL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvUHVibGljU2l0ZXNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ3NzkzOQotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvUHVibGljU2l0ZXNUZXN0LmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZGsuY29ubmVjdG9yLmludGVybmFsOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZGsuY29ubmVjdG9yLkpka0Nvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogQGF1dGhvciBQZXRyIEphbm91Y2ggKHBldHIuamFub3VjaCBhdCBvcmFjbGUuY29tKQorICovCitASWdub3JlCitwdWJsaWMgY2xhc3MgUHVibGljU2l0ZXNUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHb29sZ2VDb20oKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBkb1Rlc3QoImh0dHBzOi8vd3d3Lmdvb2dsZS5jb20iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXpuYW0oKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBkb1Rlc3QoImh0dHBzOi8vd3d3LnNlem5hbS5jeiIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdvb2dsZVVLKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZG9UZXN0KCJodHRwczovL3d3dy5nb29nbGUuY28udWsiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaWtpcGVkaWEoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBkb1Rlc3QoImh0dHA6Ly93d3cud2lraXBlZGlhLmNvbSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEphdmFOZXQoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBkb1Rlc3QoImh0dHA6Ly93d3cuamF2YS5uZXQiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUaGVHdWFyZGlhbigpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGRvVGVzdCgiaHR0cDovL3d3dy50aGVndWFyZGlhbi5jb20iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCYmNVaygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGRvVGVzdCgiaHR0cDovL3d3dy5iYmMuY28udWsiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2aXMyNCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGRvVGVzdCgiaHR0cHM6Ly93d3cuc2VydmlzMjQuY3oiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9UZXN0KFN0cmluZyB1cmwpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSBjbGllbnQoKS50YXJnZXQodXJsKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIFN0cmluZyBodG1sUGFnZSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRUcnVlKGh0bWxQYWdlLmNvbnRhaW5zKCI8aHRtbCIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShodG1sUGFnZS5jb250YWlucygiPC9odG1sPiIpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcuY29ubmVjdG9yUHJvdmlkZXIobmV3IEpka0Nvbm5lY3RvclByb3ZpZGVyKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL1JlYWRDaHVua2VkRW50aXR5LmphdmEgYi9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL1JlYWRDaHVua2VkRW50aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJlOTQ0YgotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvUmVhZENodW5rZWRFbnRpdHkuamF2YQpAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZGsuY29ubmVjdG9yLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LlJlcXVlc3RFbnRpdHlQcm9jZXNzaW5nOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lmpkay5jb25uZWN0b3IuSmRrQ29ubmVjdG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNodW5rZWRPdXRwdXQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIFBldHIgSmFub3VjaCAocGV0ci5qYW5vdWNoIGF0IG9yYWNsZS5jb20pCisgKgorICogVE9ETyBJIGhhdmUgYSBzdHJvbmcgZmVlbGluZyBhIGdvdCBpbnNwaXJlZCBzb21ld2hlcmUsIGJ1dCBmb3Jnb3Qgd2hlcmUuCisgKi8KK3B1YmxpYyBjbGFzcyBSZWFkQ2h1bmtlZEVudGl0eSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQFBhdGgoIi9jaHVua2VkRW50aXR5IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENodW5rZWRSZXNvdXJjZSB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIENodW5rZWRPdXRwdXQ8U3RyaW5nPiBnZXQoZmluYWwgU3RyaW5nIGVudGl0eSkgeworICAgICAgICAgICAgZmluYWwgQ2h1bmtlZE91dHB1dDxTdHJpbmc+IG91dHB1dCA9IG5ldyBDaHVua2VkT3V0cHV0PD4oU3RyaW5nLmNsYXNzKTsKKworICAgICAgICAgICAgbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRJZHggPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlbWFpbmluZyA9IGVudGl0eS5sZW5ndGgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChyZW1haW5pbmcgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaHVua0xlbmd0aCA9IDEwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbmRJZHggPSBzdGFydElkeCArIGNodW5rTGVuZ3RoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbmRJZHggPiBlbnRpdHkubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kSWR4ID0gZW50aXR5Lmxlbmd0aCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2h1bmsgPSBlbnRpdHkuc3Vic3RyaW5nKHN0YXJ0SWR4LCBlbmRJZHgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC53cml0ZShjaHVuayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nIC09IGNodW5rTGVuZ3RoOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0SWR4ID0gZW5kSWR4OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LnN0YXJ0KCk7CisKKyAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKENodW5rZWRSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2h1bmtlZCgpIHsKKyAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSBUZXN0VXRpbHMuZ2VuZXJhdGVCb2R5KDUwMCk7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJjaHVua2VkRW50aXR5IikucHJvcGVydHkoQ2xpZW50UHJvcGVydGllcy5SRVFVRVNUX0VOVElUWV9QUk9DRVNTSU5HLAorICAgICAgICAgICAgICAgIFJlcXVlc3RFbnRpdHlQcm9jZXNzaW5nLkNIVU5LRUQpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobWVzc2FnZSwgTWVkaWFUeXBlLlRFWFRfUExBSU4pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuQ0hVTktFRF9FTkNPRElOR19TSVpFLCAyMCk7CisgICAgICAgIGNvbmZpZy5jb25uZWN0b3JQcm92aWRlcihuZXcgSmRrQ29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9SZWRpcmVjdFRlc3QuamF2YSBiL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvUmVkaXJlY3RUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZiMzFlYgotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvUmVkaXJlY3RUZXN0LmphdmEKQEAgLTAsMCArMSwyMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamRrLmNvbm5lY3Rvci5pbnRlcm5hbDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5IRUFEOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lmpkay5jb25uZWN0b3IuSmRrQ29ubmVjdG9yUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZGsuY29ubmVjdG9yLkpka0Nvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICogQGF1dGhvciBQZXRyIEphbm91Y2ggKHBldHIuamFub3VjaCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgUmVkaXJlY3RUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgVEFSR0VUX0dFVF9NU0cgPSAiWW91IGhhdmUgcmVhY2hlZCB0aGUgdGFyZ2V0IjsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVkaXJlY3RpbmdSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBKZGtDb25uZWN0b3JQcm92aWRlcigpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhYmxlUmVkaXJlY3QoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJyZWRpcmVjdGluZy8zMDMiKS5wcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLkZPTExPV19SRURJUkVDVFMsIGZhbHNlKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygzMDMsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXQzMDMoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJyZWRpcmVjdGluZy8zMDMiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRBUkdFVF9HRVRfTVNHLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc3QzMDMoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJyZWRpcmVjdGluZy8zMDMiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KCJNeSBhd2Vzb21lIG1lc3NhZ2UiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhUQVJHRVRfR0VUX01TRywgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIZWFkMzAzKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgicmVkaXJlY3RpbmcvMzAzIikucmVxdWVzdCgpLmhlYWQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKS5pc0VtcHR5KCkpOworICAgIH0KKworICAgIC8vIGluIHRoaXMgaW1wbGVtZW50YXRpb247IDMwMSwgMzA3IGFuZCAzMDggd29yayBleGFjdGx5IHRoZSBzYW1lCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0MzA3KCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgicmVkaXJlY3RpbmcvMzA3IikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhUQVJHRVRfR0VUX01TRywgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICAvLyBpbiB0aGlzIGltcGxlbWVudGF0aW9uOyAzMDEsIDMwNyBhbmQgMzA4IHdvcmsgZXhhY3RseSB0aGUgc2FtZQorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc3QzMDcoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJyZWRpcmVjdGluZy8zMDciKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KCJNeSBhd2Vzb21lIG1lc3NhZ2UiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMzA3LCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgLy8gaW4gdGhpcyBpbXBsZW1lbnRhdGlvbjsgMzAxLCAzMDcgYW5kIDMwOCB3b3JrIGV4YWN0bHkgdGhlIHNhbWUKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIZWFkMzA3KCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgicmVkaXJlY3RpbmcvMzA3IikucmVxdWVzdCgpLmhlYWQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKS5pc0VtcHR5KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEN5Y2xlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGFyZ2V0KCJyZWRpcmVjdGluZy9jeWNsZSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhSZWRpcmVjdEV4Y2VwdGlvbi5jbGFzcy5nZXROYW1lKCksIHQuZ2V0Q2F1c2UoKS5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXhSZWRpcmVjdHNTdWNjZXNzKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgicmVkaXJlY3RpbmcvbWF4UmVkaXJlY3QiKS5wcm9wZXJ0eShKZGtDb25uZWN0b3JQcm9wZXJ0aWVzLk1BWF9SRURJUkVDVFMsIDIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoVEFSR0VUX0dFVF9NU0csIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWF4UmVkaXJlY3RzRmFpbCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRhcmdldCgicmVkaXJlY3RpbmcvbWF4UmVkaXJlY3QiKS5wcm9wZXJ0eShKZGtDb25uZWN0b3JQcm9wZXJ0aWVzLk1BWF9SRURJUkVDVFMsIDEpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhSZWRpcmVjdEV4Y2VwdGlvbi5jbGFzcy5nZXROYW1lKCksIHQuZ2V0Q2F1c2UoKS5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL3JlZGlyZWN0aW5nIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlZGlyZWN0aW5nUmVzb3VyY2UgeworCisgICAgICAgIHByaXZhdGUgUmVzcG9uc2UgZ2V0MzAzUmVkaXJlY3RUb1RhcmdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zZWVPdGhlcihVcmlCdWlsZGVyLmZyb21SZXNvdXJjZShSZWRpcmVjdGluZ1Jlc291cmNlLmNsYXNzKS5wYXRoKCJ0YXJnZXQiKS5idWlsZCgpKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBSZXNwb25zZSBnZXQzMDdSZWRpcmVjdFRvVGFyZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnRlbXBvcmFyeVJlZGlyZWN0KFVyaUJ1aWxkZXIuZnJvbVJlc291cmNlKFJlZGlyZWN0aW5nUmVzb3VyY2UuY2xhc3MpLnBhdGgoInRhcmdldCIpLmJ1aWxkKCkpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiMzAzIikKKyAgICAgICAgQEhFQUQKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGhlYWQzMDMoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0MzAzUmVkaXJlY3RUb1RhcmdldCgpOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoIjMwMyIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldDMwMygpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXQzMDNSZWRpcmVjdFRvVGFyZ2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiMzAzIikKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHBvc3QzMDMoU3RyaW5nIGVudGl0eSkgeworICAgICAgICAgICAgcmV0dXJuIGdldDMwM1JlZGlyZWN0VG9UYXJnZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCIzMDciKQorICAgICAgICBASEVBRAorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgaGVhZDMwNygpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXQzMDdSZWRpcmVjdFRvVGFyZ2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiMzA3IikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0MzA3KCkgeworICAgICAgICAgICAgcmV0dXJuIGdldDMwN1JlZGlyZWN0VG9UYXJnZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCIzMDciKQorICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgcG9zdDMwNyhTdHJpbmcgZW50aXR5KSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0MzA3UmVkaXJlY3RUb1RhcmdldCgpOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInRhcmdldCIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyB0YXJnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gVEFSR0VUX0dFVF9NU0c7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgidGFyZ2V0IikKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyB0YXJnZXQoU3RyaW5nIGVudGl0eSkgeworICAgICAgICAgICAgcmV0dXJuIGVudGl0eTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJjeWNsZSIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGN5Y2xlKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnNlZU90aGVyKFVyaUJ1aWxkZXIuZnJvbVJlc291cmNlKFJlZGlyZWN0aW5nUmVzb3VyY2UuY2xhc3MpLnBhdGgoImN5Y2xlTm9kZTIiKS5idWlsZCgpKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImN5Y2xlTm9kZTIiKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBjeWNsZU5vZGUyKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnNlZU90aGVyKFVyaUJ1aWxkZXIuZnJvbVJlc291cmNlKFJlZGlyZWN0aW5nUmVzb3VyY2UuY2xhc3MpLnBhdGgoImN5Y2xlTm9kZTMiKS5idWlsZCgpKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImN5Y2xlTm9kZTMiKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBjeWNsZU5vZGUzKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnNlZU90aGVyKFVyaUJ1aWxkZXIuZnJvbVJlc291cmNlKFJlZGlyZWN0aW5nUmVzb3VyY2UuY2xhc3MpLnBhdGgoImN5Y2xlIikuYnVpbGQoKSkuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJtYXhSZWRpcmVjdCIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIG1heFJlZGlyZWN0KCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnNlZU90aGVyKFVyaUJ1aWxkZXIuZnJvbVJlc291cmNlKFJlZGlyZWN0aW5nUmVzb3VyY2UuY2xhc3MpLnBhdGgoIm1heFJlZGlyZWN0Tm9kZTIiKS5idWlsZCgpKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoIm1heFJlZGlyZWN0Tm9kZTIiKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBtYXhSZWRpcmVjdE5vZGUyKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnNlZU90aGVyKFVyaUJ1aWxkZXIuZnJvbVJlc291cmNlKFJlZGlyZWN0aW5nUmVzb3VyY2UuY2xhc3MpLnBhdGgoInRhcmdldCIpLmJ1aWxkKCkpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL1NzbEZpbHRlclRlc3QuamF2YSBiL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvU3NsRmlsdGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5OWMyM2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGsvY29ubmVjdG9yL2ludGVybmFsL1NzbEZpbHRlclRlc3QuamF2YQpAQCAtMCwwICsxLDUzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZGsuY29ubmVjdG9yLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuU2VydmVyU29ja2V0OworaW1wb3J0IGphdmEubmV0LlNvY2tldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZTsKKworaW1wb3J0IGphdmF4Lm5ldC5TZXJ2ZXJTb2NrZXRGYWN0b3J5OworaW1wb3J0IGphdmF4Lm5ldC5zc2wuSG9zdG5hbWVWZXJpZmllcjsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLlNTTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLlNTTFNlcnZlclNvY2tldDsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLlNTTFNlcnZlclNvY2tldEZhY3Rvcnk7CitpbXBvcnQgamF2YXgubmV0LnNzbC5TU0xTZXNzaW9uOworaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMU29ja2V0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuU3NsQ29uZmlndXJhdG9yOworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCisvKioKKyAqIEBhdXRob3IgUGV0ciBKYW5vdWNoIChwZXRyLmphbm91Y2ggYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFNzbEZpbHRlclRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBPUlQgPSA4MzIxOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIGJlZm9yZVRlc3QoKSB7CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC5rZXlTdG9yZSIsIHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiL2tleXN0b3JlX3NlcnZlciIpLmdldFBhdGgoKSk7CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YXgubmV0LnNzbC5rZXlTdG9yZVBhc3N3b3JkIiwgImFzZGZnaCIpOworICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZSIsIHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiL3RydXN0c3RvcmVfc2VydmVyIikuZ2V0UGF0aCgpKTsKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJqYXZheC5uZXQuc3NsLnRydXN0U3RvcmVQYXNzd29yZCIsICJhc2RmZ2giKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCYXNpY0VjaG8oKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgIFNzbEVjaG9TZXJ2ZXIgc2VydmVyID0gbmV3IFNzbEVjaG9TZXJ2ZXIoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNlcnZlci5zdGFydCgpOworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiSGVsbG8gd29ybGRcbiI7CisgICAgICAgICAgICBCeXRlQnVmZmVyIHJlYWRCdWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKG1lc3NhZ2UubGVuZ3RoKCkpOworICAgICAgICAgICAgRmlsdGVyPEJ5dGVCdWZmZXIsIEJ5dGVCdWZmZXIsIEJ5dGVCdWZmZXIsIEJ5dGVCdWZmZXI+IGNsaWVudFNvY2tldCA9IG9wZW5DbGllbnRTb2NrZXQoImxvY2FsaG9zdCIsIHJlYWRCdWZmZXIsIGxhdGNoLAorICAgICAgICAgICAgICAgICAgICBudWxsKTsKKworICAgICAgICAgICAgY2xpZW50U29ja2V0LndyaXRlKHN0cmluZ1RvQnVmZmVyKG1lc3NhZ2UpLCBuZXcgQ29tcGxldGlvbkhhbmRsZXI8Qnl0ZUJ1ZmZlcj4oKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZmFpbGVkKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgIHQucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIGFzc2VydFRydWUobGF0Y2guYXdhaXQoNSwgVGltZVVuaXQuU0VDT05EUykpOworICAgICAgICAgICAgY2xpZW50U29ja2V0LmNsb3NlKCk7CisgICAgICAgICAgICByZWFkQnVmZmVyLmZsaXAoKTsKKyAgICAgICAgICAgIFN0cmluZyByZWNlaXZlZCA9IGJ1ZmZlclRvU3RyaW5nKHJlYWRCdWZmZXIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIHJlY2VpdmVkKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHNlcnZlci5zdG9wKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFY2hvMTAwaygpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgU3NsRWNob1NlcnZlciBzZXJ2ZXIgPSBuZXcgU3NsRWNob1NlcnZlcigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VydmVyLnN0YXJ0KCk7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9IHNiLnRvU3RyaW5nKCkgKyAiXG4iOworICAgICAgICAgICAgQnl0ZUJ1ZmZlciByZWFkQnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShtZXNzYWdlLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIEZpbHRlcjxCeXRlQnVmZmVyLCBCeXRlQnVmZmVyLCBCeXRlQnVmZmVyLCBCeXRlQnVmZmVyPiBjbGllbnRTb2NrZXQgPSBvcGVuQ2xpZW50U29ja2V0KCJsb2NhbGhvc3QiLCByZWFkQnVmZmVyLCBsYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCk7CisKKyAgICAgICAgICAgIGNsaWVudFNvY2tldC53cml0ZShzdHJpbmdUb0J1ZmZlcihtZXNzYWdlKSwgbmV3IENvbXBsZXRpb25IYW5kbGVyPEJ5dGVCdWZmZXI+KCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZhaWxlZChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICB0LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBhc3NlcnRUcnVlKGxhdGNoLmF3YWl0KDUsIFRpbWVVbml0LlNFQ09ORFMpKTsKKyAgICAgICAgICAgIGNsaWVudFNvY2tldC5jbG9zZSgpOworICAgICAgICAgICAgcmVhZEJ1ZmZlci5mbGlwKCk7CisgICAgICAgICAgICBTdHJpbmcgcmVjZWl2ZWQgPSBidWZmZXJUb1N0cmluZyhyZWFkQnVmZmVyKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLCByZWNlaXZlZCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzZXJ2ZXIuc3RvcCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTGlrZSB7QGxpbmsgI3Rlc3RCYXNpY0VjaG8oKX0sIGJ1dCB0aGUgY29udmVyc2F0aW9uIGlzIHRlcm1pbmF0ZWQgYnkgdGhlIHNlcnZlci4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZVNlcnZlcigpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgU3NsRWNob1NlcnZlciBzZXJ2ZXIgPSBuZXcgU3NsRWNob1NlcnZlcigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VydmVyLnN0YXJ0KCk7CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZSA9ICJIZWxsbyB3b3JsZFxuIjsKKyAgICAgICAgICAgIEJ5dGVCdWZmZXIgcmVhZEJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUobWVzc2FnZS5sZW5ndGgoKSk7CisgICAgICAgICAgICBGaWx0ZXI8Qnl0ZUJ1ZmZlciwgQnl0ZUJ1ZmZlciwgQnl0ZUJ1ZmZlciwgQnl0ZUJ1ZmZlcj4gY2xpZW50U29ja2V0ID0gb3BlbkNsaWVudFNvY2tldCgibG9jYWxob3N0IiwgcmVhZEJ1ZmZlciwgbGF0Y2gsCisgICAgICAgICAgICAgICAgICAgIG51bGwpOworCisgICAgICAgICAgICBjbGllbnRTb2NrZXQud3JpdGUoc3RyaW5nVG9CdWZmZXIobWVzc2FnZSksIG5ldyBDb21wbGV0aW9uSGFuZGxlcjxCeXRlQnVmZmVyPigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBmYWlsZWQoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgdC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShsYXRjaC5hd2FpdCg1LCBUaW1lVW5pdC5TRUNPTkRTKSk7CisgICAgICAgICAgICBzZXJ2ZXIuc3RvcCgpOworICAgICAgICAgICAgcmVhZEJ1ZmZlci5mbGlwKCk7CisgICAgICAgICAgICBTdHJpbmcgcmVjZWl2ZWQgPSBidWZmZXJUb1N0cmluZyhyZWFkQnVmZmVyKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLCByZWNlaXZlZCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzZXJ2ZXIuc3RvcCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBTU0wgcmUtaGFuZHNoYWtlIHRyaWdnZXJlZCBieSB0aGUgc2VydmVyLgorICAgICAqIDxwLz4KKyAgICAgKiBTZW5kcyBhIHNob3J0IG1lc3NhZ2UuIFdoZW4gdGhlIG1lc3NhZ2UgaGFzIGJlZW4gc2VudCBieSB0aGUgY2xpZW50LCB0aGUgc2VydmVyIHRyaWdnZXJzIHJlLWhhbmRzaGFrZQorICAgICAqIGFuZCB0aGUgY2xpZW50IHNlbmQgYSBsb25nIG1lc3NhZ2UgdG8gbWFrZSBzdXJlIHRoZSByZS1oYW5kc2hha2UgaXMgcGVyZm9ybWVkIGR1cmluZyBhcHBsaWNhdGlvbiBkYXRhIGZsb3cuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVoYW5kc2hha2VTZXJ2ZXIoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgIGZpbmFsIFNzbEVjaG9TZXJ2ZXIgc2VydmVyID0gbmV3IFNzbEVjaG9TZXJ2ZXIoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNlcnZlci5zdGFydCgpOworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDA7IGkrKykgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UxID0gIkhlbGxvIjsKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlMiA9IHNiLnRvU3RyaW5nKCkgKyAiXG4iOworICAgICAgICAgICAgQnl0ZUJ1ZmZlciByZWFkQnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShtZXNzYWdlMS5sZW5ndGgoKSArIG1lc3NhZ2UyLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIG1lc3NhZ2UxTGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgICAgICBGaWx0ZXI8Qnl0ZUJ1ZmZlciwgQnl0ZUJ1ZmZlciwgQnl0ZUJ1ZmZlciwgQnl0ZUJ1ZmZlcj4gY2xpZW50U29ja2V0ID0gb3BlbkNsaWVudFNvY2tldCgibG9jYWxob3N0IiwgcmVhZEJ1ZmZlciwgbGF0Y2gsCisgICAgICAgICAgICAgICAgICAgIG51bGwpOworCisgICAgICAgICAgICBjbGllbnRTb2NrZXQud3JpdGUoc3RyaW5nVG9CdWZmZXIobWVzc2FnZTEpLCBuZXcgQ29tcGxldGlvbkhhbmRsZXI8Qnl0ZUJ1ZmZlcj4oKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZmFpbGVkKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgIHQucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY29tcGxldGVkKEJ5dGVCdWZmZXIgcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlMUxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyLnJlaGFuZHNoYWtlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBhc3NlcnRUcnVlKG1lc3NhZ2UxTGF0Y2guYXdhaXQoNSwgVGltZVVuaXQuU0VDT05EUykpOworCisgICAgICAgICAgICBjbGllbnRTb2NrZXQud3JpdGUoc3RyaW5nVG9CdWZmZXIobWVzc2FnZTIpLCBuZXcgQ29tcGxldGlvbkhhbmRsZXI8Qnl0ZUJ1ZmZlcj4oKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZmFpbGVkKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgIHQucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIGFzc2VydFRydWUobGF0Y2guYXdhaXQoNSwgVGltZVVuaXQuU0VDT05EUykpOworICAgICAgICAgICAgY2xpZW50U29ja2V0LmNsb3NlKCk7CisgICAgICAgICAgICByZWFkQnVmZmVyLmZsaXAoKTsKKyAgICAgICAgICAgIFN0cmluZyByZWNlaXZlZCA9IGJ1ZmZlclRvU3RyaW5nKHJlYWRCdWZmZXIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2UxICsgbWVzc2FnZTIsIHJlY2VpdmVkKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHNlcnZlci5zdG9wKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IFNTTCByZS1oYW5kc2hha2UgdHJpZ2dlcmVkIGJ5IHRoZSBjbGllbnQuCisgICAgICogPHAvPgorICAgICAqIFRoZSBzYW1lIGFzIHtAbGluayAjdGVzdFJlaGFuZHNoYWtlU2VydmVyKCl9IGV4Y2VwdCwgdGhlIGNsaWVudCBzdGFydHMgcmUtaGFuZHNoYWtlIHRoaXMgdGltZS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWhhbmRzaGFrZUNsaWVudCgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgZmluYWwgU3NsRWNob1NlcnZlciBzZXJ2ZXIgPSBuZXcgU3NsRWNob1NlcnZlcigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VydmVyLnN0YXJ0KCk7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZTEgPSAiSGVsbG8iOworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UyID0gc2IudG9TdHJpbmcoKSArICJcbiI7CisgICAgICAgICAgICBCeXRlQnVmZmVyIHJlYWRCdWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKG1lc3NhZ2UxLmxlbmd0aCgpICsgbWVzc2FnZTIubGVuZ3RoKCkpOworICAgICAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbWVzc2FnZTFMYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgICAgIGZpbmFsIEZpbHRlcjxCeXRlQnVmZmVyLCBCeXRlQnVmZmVyLCBCeXRlQnVmZmVyLCBCeXRlQnVmZmVyPiBjbGllbnRTb2NrZXQgPSBvcGVuQ2xpZW50U29ja2V0KCJsb2NhbGhvc3QiLCByZWFkQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICBsYXRjaCwgbnVsbCk7CisKKyAgICAgICAgICAgIGNsaWVudFNvY2tldC53cml0ZShzdHJpbmdUb0J1ZmZlcihtZXNzYWdlMSksIG5ldyBDb21wbGV0aW9uSGFuZGxlcjxCeXRlQnVmZmVyPigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBmYWlsZWQoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgdC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBjb21wbGV0ZWQoQnl0ZUJ1ZmZlciByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTFMYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gc3RhcnRTc2wgaXMgb3ZlcmxvYWRlZCBpbiB0aGUgdGVzdCBzbyBpdCB3aWxsIHN0YXJ0IHJlLWhhbmRzaGFrZSwgY2FsbGluZyBzdGFydFNzbCBvbiBhIGZpbHRlcgorICAgICAgICAgICAgICAgICAgICAvLyBmb3IgYSBzZWNvbmQgdGltZSB3aWxsIG5vdCBub3JtYWxseSBjYXVzZSBhIHJlLWhhbmRzaGFrZQorICAgICAgICAgICAgICAgICAgICBjbGllbnRTb2NrZXQuc3RhcnRTc2woKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlMUxhdGNoLmF3YWl0KDUsIFRpbWVVbml0LlNFQ09ORFMpKTsKKworICAgICAgICAgICAgY2xpZW50U29ja2V0LndyaXRlKHN0cmluZ1RvQnVmZmVyKG1lc3NhZ2UyKSwgbmV3IENvbXBsZXRpb25IYW5kbGVyPEJ5dGVCdWZmZXI+KCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZhaWxlZChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICB0LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBhc3NlcnRUcnVlKGxhdGNoLmF3YWl0KDUsIFRpbWVVbml0LlNFQ09ORFMpKTsKKyAgICAgICAgICAgIGNsaWVudFNvY2tldC5jbG9zZSgpOworICAgICAgICAgICAgcmVhZEJ1ZmZlci5mbGlwKCk7CisgICAgICAgICAgICBTdHJpbmcgcmVjZWl2ZWQgPSBidWZmZXJUb1N0cmluZyhyZWFkQnVmZmVyKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhtZXNzYWdlMSArIG1lc3NhZ2UyLCByZWNlaXZlZCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzZXJ2ZXIuc3RvcCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SG9zdGFtZVZlcmlmaWNhdGlvbkZhaWwoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgIFNzbEVjaG9TZXJ2ZXIgc2VydmVyID0gbmV3IFNzbEVjaG9TZXJ2ZXIoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNlcnZlci5zdGFydCgpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCI9PT0gU1NMSGFuZHNoYWtlRXhjZXB0aW9uIChjZXJ0aWZpY2F0ZV91bmtub3duKSBvbiB0aGUgc2VydmVyIGV4cGVjdGVkID09PSIpOworICAgICAgICAgICAgb3BlbkNsaWVudFNvY2tldCgiMTI3LjAuMC4xIiwgQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgwKSwgbGF0Y2gsIG51bGwpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChTU0xFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHNlcnZlci5zdG9wKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21Ib3N0YW1lVmVyaWZpY2F0aW9uRmFpbCgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgU3NsRWNob1NlcnZlciBzZXJ2ZXIgPSBuZXcgU3NsRWNob1NlcnZlcigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VydmVyLnN0YXJ0KCk7CisgICAgICAgICAgICBIb3N0bmFtZVZlcmlmaWVyIHZlcmlmaWVyID0gbmV3IEhvc3RuYW1lVmVyaWZpZXIoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gdmVyaWZ5KFN0cmluZyBzLCBTU0xTZXNzaW9uIHNzbFNlc3Npb24pIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIG9wZW5DbGllbnRTb2NrZXQoImxvY2FsaG9zdCIsIEJ5dGVCdWZmZXIuYWxsb2NhdGUoMCksIGxhdGNoLCB2ZXJpZmllcik7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKFNTTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc2VydmVyLnN0b3AoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbUhvc3RhbWVWZXJpZmljYXRpb25QYXNzKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgICBTc2xFY2hvU2VydmVyIHNlcnZlciA9IG5ldyBTc2xFY2hvU2VydmVyKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZXJ2ZXIuc3RhcnQoKTsKKyAgICAgICAgICAgIEhvc3RuYW1lVmVyaWZpZXIgdmVyaWZpZXIgPSBuZXcgSG9zdG5hbWVWZXJpZmllcigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB2ZXJpZnkoU3RyaW5nIHMsIFNTTFNlc3Npb24gc3NsU2Vzc2lvbikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBvcGVuQ2xpZW50U29ja2V0KCIxMjcuMC4wLjEiLCBCeXRlQnVmZmVyLmFsbG9jYXRlKDApLCBsYXRjaCwgdmVyaWZpZXIpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc2VydmVyLnN0b3AoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsaWVudEF1dGhlbnRpY2F0aW9uKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgICBTc2xFY2hvU2VydmVyIHNlcnZlciA9IG5ldyBTc2xFY2hvU2VydmVyKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZXJ2ZXIuc2V0Q2xpZW50QXV0aGVudGljYXRpb24oKTsKKyAgICAgICAgICAgIHNlcnZlci5zdGFydCgpOworICAgICAgICAgICAgU3RyaW5nIG1lc3NhZ2UgPSAiSGVsbG8gd29ybGRcbiI7CisgICAgICAgICAgICBCeXRlQnVmZmVyIHJlYWRCdWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKG1lc3NhZ2UubGVuZ3RoKCkpOworICAgICAgICAgICAgZmluYWwgRmlsdGVyPEJ5dGVCdWZmZXIsIEJ5dGVCdWZmZXIsIEJ5dGVCdWZmZXIsIEJ5dGVCdWZmZXI+IGNsaWVudFNvY2tldCA9IG9wZW5DbGllbnRTb2NrZXQoImxvY2FsaG9zdCIsIHJlYWRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgIGxhdGNoLCBudWxsKTsKKworICAgICAgICAgICAgY2xpZW50U29ja2V0LndyaXRlKHN0cmluZ1RvQnVmZmVyKG1lc3NhZ2UpLCBuZXcgQ29tcGxldGlvbkhhbmRsZXI8Qnl0ZUJ1ZmZlcj4oKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZmFpbGVkKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgIHQucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIGFzc2VydFRydWUobGF0Y2guYXdhaXQoNSwgVGltZVVuaXQuU0VDT05EUykpOworICAgICAgICAgICAgY2xpZW50U29ja2V0LmNsb3NlKCk7CisgICAgICAgICAgICByZWFkQnVmZmVyLmZsaXAoKTsKKyAgICAgICAgICAgIFN0cmluZyByZWNlaXZlZCA9IGJ1ZmZlclRvU3RyaW5nKHJlYWRCdWZmZXIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIHJlY2VpdmVkKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHNlcnZlci5zdG9wKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBidWZmZXJUb1N0cmluZyhCeXRlQnVmZmVyIGJ1ZmZlcikgeworICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtidWZmZXIucmVtYWluaW5nKCldOworICAgICAgICBidWZmZXIuZ2V0KGJ5dGVzKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnl0ZXMpOworICAgIH0KKworICAgIHByaXZhdGUgQnl0ZUJ1ZmZlciBzdHJpbmdUb0J1ZmZlcihTdHJpbmcgc3RyaW5nKSB7CisgICAgICAgIGJ5dGVbXSBieXRlcyA9IHN0cmluZy5nZXRCeXRlcygpOworICAgICAgICByZXR1cm4gQnl0ZUJ1ZmZlci53cmFwKGJ5dGVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIFNTTCBjbGllbnQuIFJldHVybnMgd2hlbiBTU0wgaGFuZHNoYWtlIGhhcyBiZWVuIGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb21wbGV0aW9uTGF0Y2ggbGF0Y2ggdGhhdCB3aWxsIGJlIHRyaWdnZXJlZCB3aGVuIHRoZSBleHBlY3RlZCBudW1iZXIgb2YgYnl0ZXMgaGFzIGJlZW4gcmVjZWl2ZWQuCisgICAgICogQHBhcmFtIHJlYWRCdWZmZXIgICAgICBidWZmZXIgd2hlcmUgcmVjZWl2ZWQgbWVzc2FnZSB3aWxsIGJlIHdyaXR0ZW4uIE11c3QgYmUgdGhlIHNpemUgb2YgdGhlIGV4cGVjdGVkIG1lc3NhZ2UsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICBiZWNhdXNlIHdoZW4gaXQgaXMgZmlsbGVkIHtAY29kZSBjb21wbGV0aW9uTGF0Y2h9IHdpbGwgYmUgdHJpZ2dlcmVkLgorICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlIGFueSBleGNlcHRpb24gdGhhdCBvY2N1cnMgdW50aWwgU1NMIGhhbmRzaGFrZSBoYXMgY29tcGxldGVkLgorICAgICAqLworICAgIHByaXZhdGUgRmlsdGVyPEJ5dGVCdWZmZXIsIEJ5dGVCdWZmZXIsIEJ5dGVCdWZmZXIsIEJ5dGVCdWZmZXI+IG9wZW5DbGllbnRTb2NrZXQoU3RyaW5nIGhvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBCeXRlQnVmZmVyIHJlYWRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBjb21wbGV0aW9uTGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIb3N0bmFtZVZlcmlmaWVyIGN1c3RvbUhvc3RuYW1lVmVyaWZpZXIpCisgICAgICAgICAgICB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgU3NsQ29uZmlndXJhdG9yIHNzbENvbmZpZyA9IFNzbENvbmZpZ3VyYXRvci5uZXdJbnN0YW5jZSgpCisgICAgICAgICAgICAgICAgLnRydXN0U3RvcmVGaWxlKHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgiL3RydXN0c3RvcmVfY2xpZW50IikuZ2V0UGF0aCgpKQorICAgICAgICAgICAgICAgIC50cnVzdFN0b3JlUGFzc3dvcmQoImFzZGZnaCIpCisgICAgICAgICAgICAgICAgLmtleVN0b3JlRmlsZSh0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2UoIi9rZXlzdG9yZV9jbGllbnQiKS5nZXRQYXRoKCkpCisgICAgICAgICAgICAgICAgLmtleVN0b3JlUGFzc3dvcmQoImFzZGZnaCIpOworCisgICAgICAgIFRyYW5zcG9ydEZpbHRlciB0cmFuc3BvcnRGaWx0ZXIgPSBuZXcgVHJhbnNwb3J0RmlsdGVyKDE3XzAwMCwgVGhyZWFkUG9vbENvbmZpZy5kZWZhdWx0Q29uZmlnKCksIDEwMF8wMDApOworICAgICAgICBmaW5hbCBTc2xGaWx0ZXIgc3NsRmlsdGVyID0gbmV3IFNzbEZpbHRlcih0cmFuc3BvcnRGaWx0ZXIsIHNzbENvbmZpZy5jcmVhdGVTU0xDb250ZXh0KCksIGhvc3QsIGN1c3RvbUhvc3RuYW1lVmVyaWZpZXIpOworCisgICAgICAgIC8vIGV4Y2VwdGlvbnMgZXJyb3JzIHRoYXQgb2NjdXIgYmVmb3JlIFNTTCBoYW5kc2hha2UgaGFzIGZpbmlzaGVkIGFyZSB0aHJvd24gZnJvbSB0aGlzIG1ldGhvZAorICAgICAgICBmaW5hbCBBdG9taWNSZWZlcmVuY2U8VGhyb3dhYmxlPiBleGNlcHRpb24gPSBuZXcgQXRvbWljUmVmZXJlbmNlPD4oKTsKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggY29ubmVjdExhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBzdGFydFNzbExhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgICBGaWx0ZXI8Qnl0ZUJ1ZmZlciwgQnl0ZUJ1ZmZlciwgQnl0ZUJ1ZmZlciwgQnl0ZUJ1ZmZlcj4gY2xpZW50U29ja2V0ID0gbmV3IEZpbHRlcjxCeXRlQnVmZmVyLCBCeXRlQnVmZmVyLCBCeXRlQnVmZmVyLAorICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXI+KAorICAgICAgICAgICAgICAgIHNzbEZpbHRlcikgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHZvaWQgcHJvY2Vzc0Nvbm5lY3QoKSB7CisgICAgICAgICAgICAgICAgY29ubmVjdExhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIGJvb2xlYW4gcHJvY2Vzc1JlYWQoQnl0ZUJ1ZmZlciBkYXRhKSB7CisgICAgICAgICAgICAgICAgcmVhZEJ1ZmZlci5wdXQoZGF0YSk7CisgICAgICAgICAgICAgICAgaWYgKCFyZWFkQnVmZmVyLmhhc1JlbWFpbmluZygpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25MYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHZvaWQgc3RhcnRTc2woKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXJ0U3NsTGF0Y2guZ2V0Q291bnQoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIGRvd25zdHJlYW1GaWx0ZXIuc3RhcnRTc2woKTsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0U3NsTGF0Y2guYXdhaXQoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNzbEZpbHRlci5yZWhhbmRzaGFrZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICB2b2lkIHByb2Nlc3NTc2xIYW5kc2hha2VDb21wbGV0ZWQoKSB7CisgICAgICAgICAgICAgICAgc3RhcnRTc2xMYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICB2b2lkIHByb2Nlc3NFcnJvcihUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIGlmIChjb25uZWN0TGF0Y2guZ2V0Q291bnQoKSA9PSAxIHx8IHN0YXJ0U3NsTGF0Y2guZ2V0Q291bnQoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbi5zZXQodCk7CisgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RMYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRTc2xMYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgdm9pZCB3cml0ZShCeXRlQnVmZmVyIGRhdGEsIENvbXBsZXRpb25IYW5kbGVyPEJ5dGVCdWZmZXI+IGNvbXBsZXRpb25IYW5kbGVyKSB7CisgICAgICAgICAgICAgICAgZG93bnN0cmVhbUZpbHRlci53cml0ZShkYXRhLCBjb21wbGV0aW9uSGFuZGxlcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgdm9pZCBwcm9jZXNzQ29ubmVjdGlvbkNsb3NlZCgpIHsKKyAgICAgICAgICAgICAgICBkb3duc3RyZWFtRmlsdGVyLmNsb3NlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgICAgICAgICBkb3duc3RyZWFtRmlsdGVyLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgY2xpZW50U29ja2V0LmNvbm5lY3QobmV3IEluZXRTb2NrZXRBZGRyZXNzKGhvc3QsIFBPUlQpLCBudWxsKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbm5lY3RMYXRjaC5hd2FpdCgpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICAgICAgY2xpZW50U29ja2V0LnN0YXJ0U3NsKCk7CisgICAgICAgIGlmIChleGNlcHRpb24uZ2V0KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgY2xpZW50U29ja2V0LmNsb3NlKCk7CisgICAgICAgICAgICB0aHJvdyBleGNlcHRpb24uZ2V0KCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY2xpZW50U29ja2V0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNTTCBlY2hvIHNlcnZlci4gSXQgZXhwZWN0cyBhIG1lc3NhZ2UgdG8gYmUgdGVybWluYXRlZCB3aXRoIFxuLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNzbEVjaG9TZXJ2ZXIgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgU2VydmVyU29ja2V0IHNlcnZlclNvY2tldDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlID0gRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yKCk7CisKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBTU0xTb2NrZXQgc29ja2V0OworICAgICAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gc3RvcHBlZCA9IGZhbHNlOworCisgICAgICAgIFNzbEVjaG9TZXJ2ZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgU2VydmVyU29ja2V0RmFjdG9yeSBzb2NrZXRGYWN0b3J5ID0gU1NMU2VydmVyU29ja2V0RmFjdG9yeS5nZXREZWZhdWx0KCk7CisgICAgICAgICAgICBzZXJ2ZXJTb2NrZXQgPSBzb2NrZXRGYWN0b3J5LmNyZWF0ZVNlcnZlclNvY2tldChQT1JUKTsKKworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzZXRDbGllbnRBdXRoZW50aWNhdGlvbigpIHsKKyAgICAgICAgICAgICgoU1NMU2VydmVyU29ja2V0KSBzZXJ2ZXJTb2NrZXQpLnNldE5lZWRDbGllbnRBdXRoKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzdGFydCgpIHsKKyAgICAgICAgICAgIGV4ZWN1dG9yU2VydmljZS5leGVjdXRlKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQgPSAoU1NMU29ja2V0KSBzZXJ2ZXJTb2NrZXQuYWNjZXB0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IHNvY2tldC5nZXRJbnB1dFN0cmVhbSgpOworCisgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKHNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKSwgMTAwKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFzdG9wcGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9IGlucHV0U3RyZWFtLnJlYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLndyaXRlKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gJ1xuJyBpbmRpY2F0ZXMgZW5kIG9mIHRoZSBjbGllbnQgbWVzc2FnZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gJ1xuJykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdHJlYW0uZmx1c2goKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWUuZ2V0Q2xhc3MoKS5lcXVhbHMoU29ja2V0RXhjZXB0aW9uLmNsYXNzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc3RvcCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBleGVjdXRvclNlcnZpY2Uuc2h1dGRvd24oKTsKKyAgICAgICAgICAgIHNlcnZlclNvY2tldC5jbG9zZSgpOworICAgICAgICAgICAgaWYgKHNvY2tldCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc29ja2V0LmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHJlaGFuZHNoYWtlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHNvY2tldC5zdGFydEhhbmRzaGFrZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRrL2Nvbm5lY3Rvci9pbnRlcm5hbC9UZXN0VXRpbHMuamF2YSBiL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvVGVzdFV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMxMmE0OAotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pkay9jb25uZWN0b3IvaW50ZXJuYWwvVGVzdFV0aWxzLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZGsuY29ubmVjdG9yLmludGVybmFsOworCisvKioKKyAqIEBhdXRob3IgUGV0ciBKYW5vdWNoIChwZXRyLmphbm91Y2ggYXQgb3JhY2xlLmNvbSkKKyAqLworY2xhc3MgVGVzdFV0aWxzIHsKKworICAgIHN0YXRpYyBTdHJpbmcgZ2VuZXJhdGVCb2R5KGludCBzaXplKSB7CisgICAgICAgIFN0cmluZyBwYXR0ZXJuID0gIkFCQ0RFRkciOworICAgICAgICBTdHJpbmdCdWlsZGVyIGJvZHlCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworICAgICAgICBpbnQgZnVsbEl0ZXJhdGlvbnMgPSBzaXplIC8gcGF0dGVybi5sZW5ndGgoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmdWxsSXRlcmF0aW9uczsgaSsrKSB7CisgICAgICAgICAgICBib2R5QnVpbGRlci5hcHBlbmQocGF0dGVybik7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcmVtYWluaW5nID0gcGF0dGVybi5zdWJzdHJpbmcoMCwgc2l6ZSAtIHBhdHRlcm4ubGVuZ3RoKCkgKiBmdWxsSXRlcmF0aW9ucyk7CisgICAgICAgIGJvZHlCdWlsZGVyLmFwcGVuZChyZW1haW5pbmcpOworICAgICAgICByZXR1cm4gYm9keUJ1aWxkZXIudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL2NsaWVudC5jZXJ0IGIvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy90ZXN0L3Jlc291cmNlcy9jbGllbnQuY2VydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDNkODhiCi0tLSAvZGV2L251bGwKKysrIGIvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy90ZXN0L3Jlc291cmNlcy9jbGllbnQuY2VydApAQCAtMCwwICsxLDE3IEBACistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSURKVENDQXVPZ0F3SUJBZ0lFVDVaeVlqQUxCZ2NxaGtqT09BUURCUUF3ZGpFTE1Ba0dBMVVFQmhNQ1Exb3hGekFWQmdOVkJBZ1QKK0RrTjZaV05vSUZKbGNIVmliR2xqTVE4d0RRWURWUVFIRXdaUWNtRm5kV1V4R3pBWkJnTlZCQW9URWs5eVlXTnNaU0JEYjNKd2IzSmgKK2RHbHZiakVQTUEwR0ExVUVDeE1HU21WeWMyVjVNUTh3RFFZRFZRUURFd1pEYkdsbGJuUXdIaGNOTVRJd05ESTBNRGt5T1RBMldoY04KK01USXdOekl6TURreU9UQTJXakIyTVFzd0NRWURWUVFHRXdKRFdqRVhNQlVHQTFVRUNCTU9RM3BsWTJnZ1VtVndkV0pzYVdNeER6QU4KK0JnTlZCQWNUQmxCeVlXZDFaVEViTUJrR0ExVUVDaE1TVDNKaFkyeGxJRU52Y25CdmNtRjBhVzl1TVE4d0RRWURWUVFMRXdaS1pYSnoKK1pYa3hEekFOQmdOVkJBTVRCa05zYVdWdWREQ0NBYmN3Z2dFc0JnY3Foa2pPT0FRQk1JSUJId0tCZ1FEOWYxT0JIWFVTS1ZMZlNwd3UKKzdPVG45aEczVWp6dlJBRERIaitBdGxFbWFVVmRRQ0pSKzFrOWpWajZ2OFgxdWpEMnk1dFZiTmVCTzRBZE5HL3labUMzYTVsUXBhU2YKK24rZ0VleEFpd2srN3FkZit0OFliK0R0WDU4YW9waFVQQlB1RDl0UEZIc01DTlZRVFdoYVJNdloxODY0cllkY3E3L0lpQXhtZDBVZ0IKK3h3SVZBSmRnVUk4Vkl3dk1zcEs1Z3FMcmhBdndXQnoxQW9HQkFQZmhvSVhXbXozZXk3eXJYRGE0VjdsNWxLKzcranJxZ3ZsWFRBczkKK0I0Sm5VVmxYanJyVVdVL21jUWNRZ1lDMFNSWnhJK2hNS0JZVHQ4OEpNb3pJcHVFOEZucUxWSHlOS09DanJoNHJzNloxa1c2amZ3djYKK0lUVmk4ZnRpZWdFa084eWs4YjZvVVpDSnFJUGY0VnJsbndhU2kyWmVnSHRWSldRQlREdit6MGtxQTRHRUFBS0JnQm1ITkFDRGsxYXcKK3ZVWmpzUmVjTVNCbGtrQ1Nxci9jQ3JZT3NOd3BmbGVRS3NNNnJkT29mdWpBTlVWZW9VRmhYOGU4SzQ1RmtueEVxQXVnbWhHUTlOUm4KK3VNZW5ydlYrWHVwQzBWMnVHSDBPY2lYZUF6SGJmZUl0QkNibUpjdk1kUFcvcStJMnZGY2h2NithakVpTkhvZ0JyQ2MzcXdTTWh5VlEKK3VnMmZYSG1KTUFzR0J5cUdTTTQ0QkFNRkFBTXZBREFzQWhRWXpuWW1IMGhyY0xuaTRFcVgzT3ZhYytwTkpnSVVlaG5FYVcxVjVkam4KK2RoWUJBWVVrU3ljRVRsND0KKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvdGVzdC9yZXNvdXJjZXMva2V5c3RvcmVfY2xpZW50IGIvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy90ZXN0L3Jlc291cmNlcy9rZXlzdG9yZV9jbGllbnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAxNmZkMgotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvdGVzdC9yZXNvdXJjZXMva2V5c3RvcmVfY2xpZW50CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvdGVzdC9yZXNvdXJjZXMva2V5c3RvcmVfc2VydmVyIGIvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy90ZXN0L3Jlc291cmNlcy9rZXlzdG9yZV9zZXJ2ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdjOTNmYwotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvdGVzdC9yZXNvdXJjZXMva2V5c3RvcmVfc2VydmVyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvamRrLWNvbm5lY3Rvci9zcmMvdGVzdC9yZXNvdXJjZXMvc2VydmVyLmNlcnQgYi9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL3NlcnZlci5jZXJ0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMDg0MWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL3NlcnZlci5jZXJ0CkBAIC0wLDAgKzEsMTcgQEAKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJREt6Q0NBdW1nQXdJQkFnSUVUNVp5empBTEJnY3Foa2pPT0FRREJRQXdlVEVMTUFrR0ExVUVCaE1DUTFveEZ6QVZCZ05WQkFnVAorRGtONlpXTm9JRkpsY0hWaWJHbGpNUTh3RFFZRFZRUUhFd1pRY21GbmRXVXhHekFaQmdOVkJBb1RFazl5WVdOc1pTQkRiM0p3YjNKaAorZEdsdmJqRVBNQTBHQTFVRUN4TUdTbVZ5YzJWNU1SSXdFQVlEVlFRREV3bHNiMk5oYkdodmMzUXdIaGNOTVRJd05ESTBNRGt6TURVMAorV2hjTk1USXdOekl6TURrek1EVTBXakI1TVFzd0NRWURWUVFHRXdKRFdqRVhNQlVHQTFVRUNCTU9RM3BsWTJnZ1VtVndkV0pzYVdNeAorRHpBTkJnTlZCQWNUQmxCeVlXZDFaVEViTUJrR0ExVUVDaE1TVDNKaFkyeGxJRU52Y25CdmNtRjBhVzl1TVE4d0RRWURWUVFMRXdaSworWlhKelpYa3hFakFRQmdOVkJBTVRDV3h2WTJGc2FHOXpkRENDQWJjd2dnRXNCZ2NxaGtqT09BUUJNSUlCSHdLQmdRRDlmMU9CSFhVUworS1ZMZlNwd3U3T1RuOWhHM1VqenZSQURESGorQXRsRW1hVVZkUUNKUisxazlqVmo2djhYMXVqRDJ5NXRWYk5lQk80QWRORy95Wm1DMworYTVsUXBhU2ZuK2dFZXhBaXdrKzdxZGYrdDhZYitEdFg1OGFvcGhVUEJQdUQ5dFBGSHNNQ05WUVRXaGFSTXZaMTg2NHJZZGNxNy9JaQorQXhtZDBVZ0J4d0lWQUpkZ1VJOFZJd3ZNc3BLNWdxTHJoQXZ3V0J6MUFvR0JBUGZob0lYV216M2V5N3lyWERhNFY3bDVsSys3K2pycQorZ3ZsWFRBczlCNEpuVVZsWGpyclVXVS9tY1FjUWdZQzBTUlp4SStoTUtCWVR0ODhKTW96SXB1RThGbnFMVkh5TktPQ2pyaDRyczZaMQora1c2amZ3djZJVFZpOGZ0aWVnRWtPOHlrOGI2b1VaQ0pxSVBmNFZybG53YVNpMlplZ0h0VkpXUUJURHYrejBrcUE0R0VBQUtCZ0dJcworVlRvN2RPRHA2aU95SEZMK21rT1ZsT2xvWmN5bXlXbEhVWlh6S3FydkFpNWpJU3B0WlpNK0FvSmNVVWxVV0VPOXV3VlR2WDBNQ2srNAordml3bFB3dCtYaGFQTTBrcWZGY3gxSVMwN0JBeDd6OWNYUkVmWVFwb0ZTc0ZXN3BVczZjZHZ1MHJqajhJcDZCbkhBTHhRRGdhQms0MAorelhNMzlrQjlMZEdCdDR1RE1Bc0dCeXFHU000NEJBTUZBQU12QURBc0FoUUU0UW9RUDR4UGliam5vem84eDVPUkpxQnVDQUlVVGtMUQorMnVkWjJEZWtud1BZWHAvek1rWVhMTjQ9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL3RydXN0c3RvcmVfY2xpZW50IGIvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy90ZXN0L3Jlc291cmNlcy90cnVzdHN0b3JlX2NsaWVudApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDc4NGZiCi0tLSAvZGV2L251bGwKKysrIGIvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy90ZXN0L3Jlc291cmNlcy90cnVzdHN0b3JlX2NsaWVudApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2pkay1jb25uZWN0b3Ivc3JjL3Rlc3QvcmVzb3VyY2VzL3RydXN0c3RvcmVfc2VydmVyIGIvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy90ZXN0L3Jlc291cmNlcy90cnVzdHN0b3JlX3NlcnZlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjI2Y2U0Ci0tLSAvZGV2L251bGwKKysrIGIvY29ubmVjdG9ycy9qZGstY29ubmVjdG9yL3NyYy90ZXN0L3Jlc291cmNlcy90cnVzdHN0b3JlX3NlcnZlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2pldHR5LWNvbm5lY3Rvci9wb20ueG1sIGIvY29ubmVjdG9ycy9qZXR0eS1jb25uZWN0b3IvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmUyOGJhCi0tLSAvZGV2L251bGwKKysrIGIvY29ubmVjdG9ycy9qZXR0eS1jb25uZWN0b3IvcG9tLnhtbApAQCAtMCwwICsxLDEwMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29ubmVjdG9yczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmplcnNleS1qZXR0eS1jb25uZWN0b3I8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktY29ubmVjdG9ycy1qZXR0eTwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgQ2xpZW50IFRyYW5zcG9ydCB2aWEgSmV0dHk8L2Rlc2NyaXB0aW9uPgorCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxwcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPlVURi04PC9wcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPgorICAgIDwvcHJvcGVydGllcz4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1jbGllbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLWpldHR5LWh0dHA8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1qc29uLWphY2tzb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItamV0dHk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmd1YXZhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z3VhdmE8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4uaXN0YWNrPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWlzdGFjay1jb21tb25zLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5idWlsZC1oZWxwZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnRlc3RzU2tpcEpkazY8L2lkPgorICAgICAgICAgICAgPGFjdGl2YXRpb24+CisgICAgICAgICAgICAgICAgPGpkaz4xLjY8L2pkaz4KKyAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KKyAgICAgICAgICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgIDxza2lwLnRlc3RzPnRydWU8L3NraXAudGVzdHM+CisgICAgICAgICAgICA8L3Byb3BlcnRpZXM+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICA8L3Byb2ZpbGVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2pldHR5LWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHR5L2Nvbm5lY3Rvci9KZXR0eUNsaWVudFByb3BlcnRpZXMuamF2YSBiL2Nvbm5lY3RvcnMvamV0dHktY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamV0dHkvY29ubmVjdG9yL0pldHR5Q2xpZW50UHJvcGVydGllcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzOGZiYjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL2pldHR5LWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHR5L2Nvbm5lY3Rvci9KZXR0eUNsaWVudFByb3BlcnRpZXMuamF2YQpAQCAtMCwwICsxLDk1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHR5LmNvbm5lY3RvcjsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlByb3BlcnRpZXNDbGFzczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlByb3BlcnRpZXNIZWxwZXI7CisKKy8qKgorICogQ29uZmlndXJhdGlvbiBvcHRpb25zIHNwZWNpZmljIHRvIHRoZSBDbGllbnQgQVBJIHRoYXQgdXRpbGl6ZXMge0BsaW5rIEpldHR5Q29ubmVjdG9yUHJvdmlkZXJ9LgorICoKKyAqIEBhdXRob3IgQXJ1bCBEaGVzaWFzZWVsYW4gKGFydWxkIGF0IGFjbS5vcmcpCisgKi8KK0BQcm9wZXJ0aWVzQ2xhc3MKK3B1YmxpYyBmaW5hbCBjbGFzcyBKZXR0eUNsaWVudFByb3BlcnRpZXMgeworCisgICAgLyoqCisgICAgICogUHJldmVudHMgaW5zdGFudGlhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIEpldHR5Q2xpZW50UHJvcGVydGllcygpIHsKKyAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJObyBpbnN0YW5jZXMgYWxsb3dlZC4iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHZhbHVlIG9mIHtAY29kZSBmYWxzZX0gaW5kaWNhdGVzIHRoZSBjbGllbnQgc2hvdWxkIGhhbmRsZSBjb29raWVzCisgICAgICogYXV0b21hdGljYWxseSB1c2luZyBIdHRwQ2xpZW50J3MgZGVmYXVsdCBjb29raWUgcG9saWN5LiBBIHZhbHVlCisgICAgICogb2Yge0Bjb2RlIGZhbHNlfSB3aWxsIGNhdXNlIHRoZSBjbGllbnQgdG8gaWdub3JlIGFsbCBjb29raWVzLgorICAgICAqIDxwLz4KKyAgICAgKiBUaGUgdmFsdWUgTVVTVCBiZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgamF2YS5sYW5nLkJvb2xlYW59LgorICAgICAqIElmIHRoZSBwcm9wZXJ0eSBpcyBhYnNlbnQgdGhlIGRlZmF1bHQgdmFsdWUgaXMge0Bjb2RlIGZhbHNlfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVfQ09PS0lFUyA9CisgICAgICAgICAgICAiamVyc2V5LmNvbmZpZy5qZXR0eS5jbGllbnQuZGlzYWJsZUNvb2tpZXMiOworCisgICAgLyoqCisgICAgICogVGhlIGNyZWRlbnRpYWwgcHJvdmlkZXIgdGhhdCBzaG91bGQgYmUgdXNlZCB0byByZXRyaWV2ZQorICAgICAqIGNyZWRlbnRpYWxzIGZyb20gYSB1c2VyLgorICAgICAqCisgICAgICogSWYgYW4ge0BsaW5rIG9yZy5lY2xpcHNlLmpldHR5LmNsaWVudC5hcGkuQXV0aGVudGljYXRpb259IG1lY2hhbmlzbSBpcyBmb3VuZCwKKyAgICAgKiBpdCBpcyB0aGVuIHVzZWQgZm9yIHRoZSBnaXZlbiByZXF1ZXN0LCByZXR1cm5pbmcgYW4ge0BsaW5rIG9yZy5lY2xpcHNlLmpldHR5LmNsaWVudC5hcGkuQXV0aGVudGljYXRpb24uUmVzdWx0fSwKKyAgICAgKiB3aGljaCBpcyB0aGVuIHN0b3JlZCBpbiB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpldHR5LmNsaWVudC5hcGkuQXV0aGVudGljYXRpb25TdG9yZX0KKyAgICAgKiBzbyB0aGF0IHN1YnNlcXVlbnQgcmVxdWVzdHMgY2FuIGJlIHByZWVtcHRpdmVseSBhdXRoZW50aWNhdGVkLgorCisgICAgICogPHAvPgorICAgICAqIFRoZSB2YWx1ZSBNVVNUIGJlIGFuIGluc3RhbmNlIG9mIHtAbGluaworICAgICAqIG9yZy5lY2xpcHNlLmpldHR5LmNsaWVudC51dGlsLkJhc2ljQXV0aGVudGljYXRpb259LiAgSWYKKyAgICAgKiB0aGUgcHJvcGVydHkgaXMgYWJzZW50IGEgZGVmYXVsdCBwcm92aWRlciB3aWxsIGJlIHVzZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRU1QVElWRV9CQVNJQ19BVVRIRU5USUNBVElPTiA9CisgICAgICAgICAgICAiamVyc2V5LmNvbmZpZy5qZXR0eS5jbGllbnQucHJlZW1wdGl2ZUJhc2ljQXV0aGVudGljYXRpb24iOworCisgICAgLyoqCisgICAgICogQSB2YWx1ZSBvZiB7QGNvZGUgZmFsc2V9IGluZGljYXRlcyB0aGUgY2xpZW50IGRpc2FibGUgYSBob3N0bmFtZSB2ZXJpZmljYXRpb24KKyAgICAgKiBkdXJpbmcgU1NMIEhhbmRzaGFrZS4gQSBjbGllbnQgd2lsbCBpZ25vcmUgQ04gdmFsdWUgZGVmaW5lZCBpbiBhIGNlcnRpZmljYXRlCisgICAgICogdGhhdCBpcyBzdG9yZWQgaW4gYSB0cnVzdHN0b3JlLgorICAgICAqIDxwLz4KKyAgICAgKiBUaGUgdmFsdWUgTVVTVCBiZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgamF2YS5sYW5nLkJvb2xlYW59LgorICAgICAqIElmIHRoZSBwcm9wZXJ0eSBpcyBhYnNlbnQgdGhlIGRlZmF1bHQgdmFsdWUgaXMge0Bjb2RlIHRydWV9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5BQkxFX1NTTF9IT1NUTkFNRV9WRVJJRklDQVRJT04gPQorICAgICAgICAgICAgImplcnNleS5jb25maWcuamV0dHkuY2xpZW50LmVuYWJsZVNzbEhvc3RuYW1lVmVyaWZpY2F0aW9uIjsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIElmIHRoZSBwcm9wZXJ0eSBpcyBub3Qgc2V0IG9yIHRoZSByZWFsIHZhbHVlIHR5cGUgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlIHR5cGUsIHJldHVybnMge0Bjb2RlIG51bGx9LgorICAgICAqCisgICAgICogQHBhcmFtIHByb3BlcnRpZXMgIE1hcCBvZiBwcm9wZXJ0aWVzIHRvIGdldCB0aGUgcHJvcGVydHkgdmFsdWUgZnJvbS4KKyAgICAgKiBAcGFyYW0ga2V5ICAgICAgICAgTmFtZSBvZiB0aGUgcHJvcGVydHkuCisgICAgICogQHBhcmFtIHR5cGUgICAgICAgIFR5cGUgdG8gcmV0cmlldmUgdGhlIHZhbHVlIGFzLgorICAgICAqIEBwYXJhbSA8VD4gICAgICAgICBUeXBlIG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIFZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBvciB7QGNvZGUgbnVsbH0uCisgICAgICoKKyAgICAgKiBAc2luY2UgMi44CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8VD4gVCBnZXRWYWx1ZShmaW5hbCBNYXA8U3RyaW5nLCA/PiBwcm9wZXJ0aWVzLCBmaW5hbCBTdHJpbmcga2V5LCBmaW5hbCBDbGFzczxUPiB0eXBlKSB7CisgICAgICAgIHJldHVybiBQcm9wZXJ0aWVzSGVscGVyLmdldFZhbHVlKHByb3BlcnRpZXMsIGtleSwgdHlwZSwgbnVsbCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2pldHR5LWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHR5L2Nvbm5lY3Rvci9KZXR0eUNvbm5lY3Rvci5qYXZhIGIvY29ubmVjdG9ycy9qZXR0eS1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0eS9jb25uZWN0b3IvSmV0dHlDb25uZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODg4NmU3Ci0tLSAvZGV2L251bGwKKysrIGIvY29ubmVjdG9ycy9qZXR0eS1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0eS9jb25uZWN0b3IvSmV0dHlDb25uZWN0b3IuamF2YQpAQCAtMCwwICsxLDQ2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0eS5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsdGVySW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LkNvb2tpZVN0b3JlOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYW5jZWxsYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29tcGxldGFibGVGdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworCitpbXBvcnQgamF2YXgubmV0LnNzbC5TU0xDb250ZXh0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5zcGkuQXN5bmNDb25uZWN0b3JDYWxsYmFjazsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuc3BpLkNvbm5lY3RvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uQnl0ZUJ1ZmZlcklucHV0U3RyZWFtOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5Ob25CbG9ja2luZ0lucHV0U3RyZWFtOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuSGVhZGVyVXRpbHM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5PdXRib3VuZE1lc3NhZ2VDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuU3RhdHVzZXM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZXR0eS5jbGllbnQuSHR0cENsaWVudDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZXR0eS5jbGllbnQuSHR0cFByb3h5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpldHR5LmNsaWVudC5Qcm94eUNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamV0dHkuY2xpZW50LmFwaS5BdXRoZW50aWNhdGlvblN0b3JlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpldHR5LmNsaWVudC5hcGkuQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpldHR5LmNsaWVudC5hcGkuQ29udGVudFJlc3BvbnNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpldHR5LmNsaWVudC5hcGkuUmVxdWVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZXR0eS5jbGllbnQuYXBpLlJlc3BvbnNlOworaW1wb3J0IG9yZy5lY2xpcHNlLmpldHR5LmNsaWVudC5hcGkuUmVzdWx0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpldHR5LmNsaWVudC51dGlsLkJhc2ljQXV0aGVudGljYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamV0dHkuY2xpZW50LnV0aWwuQnl0ZXNDb250ZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamV0dHkuY2xpZW50LnV0aWwuT3V0cHV0U3RyZWFtQ29udGVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpldHR5Lmh0dHAuSHR0cEZpZWxkOworaW1wb3J0IG9yZy5lY2xpcHNlLmpldHR5Lmh0dHAuSHR0cEZpZWxkczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZXR0eS5odHRwLkh0dHBIZWFkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamV0dHkudXRpbC5IdHRwQ29va2llU3RvcmU7CitpbXBvcnQgb3JnLmVjbGlwc2UuamV0dHkudXRpbC5KZXR0eTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZXR0eS51dGlsLnNzbC5Tc2xDb250ZXh0RmFjdG9yeTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZXR0eS51dGlsLnRocmVhZC5RdWV1ZWRUaHJlYWRQb29sOworCisvKioKKyAqIEEge0BsaW5rIENvbm5lY3Rvcn0gdGhhdCB1dGlsaXplcyB0aGUgSmV0dHkgSFRUUCBDbGllbnQgdG8gc2VuZCBhbmQgcmVjZWl2ZQorICogSFRUUCByZXF1ZXN0IGFuZCByZXNwb25zZXMuCisgKiA8cC8+CisgKiBUaGUgZm9sbG93aW5nIHByb3BlcnRpZXMgYXJlIG9ubHkgc3VwcG9ydGVkIGF0IGNvbnN0cnVjdGlvbiBvZiB0aGlzIGNsYXNzOgorICogPHVsPgorICogPGxpPntAbGluayBDbGllbnRQcm9wZXJ0aWVzI0FTWU5DX1RIUkVBRFBPT0xfU0laRX08L2xpPgorICogPGxpPntAbGluayBDbGllbnRQcm9wZXJ0aWVzI0NPTk5FQ1RfVElNRU9VVH08L2xpPgorICogPGxpPntAbGluayBDbGllbnRQcm9wZXJ0aWVzI0ZPTExPV19SRURJUkVDVFN9PC9saT4KKyAqIDxsaT57QGxpbmsgQ2xpZW50UHJvcGVydGllcyNQUk9YWV9VUkl9PC9saT4KKyAqIDxsaT57QGxpbmsgQ2xpZW50UHJvcGVydGllcyNQUk9YWV9VU0VSTkFNRX08L2xpPgorICogPGxpPntAbGluayBDbGllbnRQcm9wZXJ0aWVzI1BST1hZX1BBU1NXT1JEfTwvbGk+CisgKiA8bGk+e0BsaW5rIENsaWVudFByb3BlcnRpZXMjUFJPWFlfUEFTU1dPUkR9PC9saT4KKyAqIDxsaT57QGxpbmsgSmV0dHlDbGllbnRQcm9wZXJ0aWVzI1BSRUVNUFRJVkVfQkFTSUNfQVVUSEVOVElDQVRJT059PC9saT4KKyAqIDxsaT57QGxpbmsgSmV0dHlDbGllbnRQcm9wZXJ0aWVzI0RJU0FCTEVfQ09PS0lFU308L2xpPgorICogPC91bD4KKyAqIDxwLz4KKyAqIFRoaXMgdHJhbnNwb3J0IHN1cHBvcnRzIGJvdGggc3luY2hyb25vdXMgYW5kIGFzeW5jaHJvbm91cyBwcm9jZXNzaW5nIG9mIGNsaWVudCByZXF1ZXN0cy4KKyAqIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgc3VwcG9ydGVkOiBHRVQsIFBPU1QsIFBVVCwgREVMRVRFLCBIRUFELCBPUFRJT05TLCBUUkFDRSwgQ09OTkVDVCBhbmQgTU9WRS4KKyAqIDxwLz4KKyAqIFR5cGljYWwgdXNhZ2U6CisgKiA8cC8+CisgKiA8cHJlPgorICoge0Bjb2RlCisgKiBDbGllbnRDb25maWcgY29uZmlnID0gbmV3IENsaWVudENvbmZpZygpOworICogQ29ubmVjdG9yIGNvbm5lY3RvciA9IG5ldyBKZXR0eUNvbm5lY3Rvcihjb25maWcpOworICogY29uZmlnLmNvbm5lY3Rvcihjb25uZWN0b3IpOworICogQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KGNvbmZpZyk7CisgKgorICogLy8gYXN5bmMgcmVxdWVzdAorICogV2ViVGFyZ2V0IHRhcmdldCA9IGNsaWVudC50YXJnZXQoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCIpOworICogRnV0dXJlPFJlc3BvbnNlPiBmdXR1cmUgPSB0YXJnZXQucGF0aCgicmVzb3VyY2UiKS5yZXF1ZXN0KCkuYXN5bmMoKS5nZXQoKTsKKyAqCisgKiAvLyB3YWl0IGZvciAzIHNlY29uZHMKKyAqIFJlc3BvbnNlIHJlc3BvbnNlID0gZnV0dXJlLmdldCgzLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAqIFN0cmluZyBlbnRpdHkgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgKiBjbGllbnQuY2xvc2UoKTsKKyAqIH0KKyAqIDwvcHJlPgorICogPHA+CisgKiBUaGlzIGNvbm5lY3RvciBzdXBwb3J0cyBvbmx5IHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuUmVxdWVzdEVudGl0eVByb2Nlc3NpbmcjQlVGRkVSRUQgZW50aXR5IGJ1ZmZlcmluZ30uCisgKiBEZWZpbmluZyB0aGUgcHJvcGVydHkge0BsaW5rIENsaWVudFByb3BlcnRpZXMjUkVRVUVTVF9FTlRJVFlfUFJPQ0VTU0lOR30gaGFzIG5vIGVmZmVjdCBvbiB0aGlzIGNvbm5lY3Rvci4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIEFydWwgRGhlc2lhc2VlbGFuIChhcnVsZCBhdCBhY20ub3JnKQorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworY2xhc3MgSmV0dHlDb25uZWN0b3IgaW1wbGVtZW50cyBDb25uZWN0b3IgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoSmV0dHlDb25uZWN0b3IuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIHByaXZhdGUgZmluYWwgSHR0cENsaWVudCBjbGllbnQ7CisgICAgcHJpdmF0ZSBmaW5hbCBDb29raWVTdG9yZSBjb29raWVTdG9yZTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSB0aGUgbmV3IEpldHR5IGNsaWVudCBjb25uZWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gamF4cnNDbGllbnQgSkFYLVJTIGNsaWVudCBpbnN0YW5jZSwgZm9yIHdoaWNoIHRoZSBjb25uZWN0b3IgaXMgY3JlYXRlZC4KKyAgICAgKiBAcGFyYW0gY29uZmlnIGNsaWVudCBjb25maWd1cmF0aW9uLgorICAgICAqLworICAgIEpldHR5Q29ubmVjdG9yKGZpbmFsIENsaWVudCBqYXhyc0NsaWVudCwgZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWcpIHsKKyAgICAgICAgZmluYWwgU1NMQ29udGV4dCBzc2xDb250ZXh0ID0gamF4cnNDbGllbnQuZ2V0U3NsQ29udGV4dCgpOworICAgICAgICBmaW5hbCBTc2xDb250ZXh0RmFjdG9yeSBzc2xDb250ZXh0RmFjdG9yeSA9IG5ldyBTc2xDb250ZXh0RmFjdG9yeSgpOworICAgICAgICBzc2xDb250ZXh0RmFjdG9yeS5zZXRTc2xDb250ZXh0KHNzbENvbnRleHQpOworCisgICAgICAgIEJvb2xlYW4gZW5hYmxlSG9zdG5hbWVWZXJpZmljYXRpb24gPSAoQm9vbGVhbikgY29uZmlnLmdldFByb3BlcnRpZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoSmV0dHlDbGllbnRQcm9wZXJ0aWVzLkVOQUJMRV9TU0xfSE9TVE5BTUVfVkVSSUZJQ0FUSU9OKTsKKyAgICAgICAgaWYgKGVuYWJsZUhvc3RuYW1lVmVyaWZpY2F0aW9uICE9IG51bGwgJiYgZW5hYmxlSG9zdG5hbWVWZXJpZmljYXRpb24pIHsKKyAgICAgICAgICAgIHNzbENvbnRleHRGYWN0b3J5LnNldEVuZHBvaW50SWRlbnRpZmljYXRpb25BbGdvcml0aG0oImh0dHBzIik7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmNsaWVudCA9IG5ldyBIdHRwQ2xpZW50KHNzbENvbnRleHRGYWN0b3J5KTsKKworICAgICAgICBmaW5hbCBPYmplY3QgY29ubmVjdFRpbWVvdXQgPSBjb25maWcuZ2V0UHJvcGVydGllcygpLmdldChDbGllbnRQcm9wZXJ0aWVzLkNPTk5FQ1RfVElNRU9VVCk7CisgICAgICAgIGlmIChjb25uZWN0VGltZW91dCAhPSBudWxsICYmIGNvbm5lY3RUaW1lb3V0IGluc3RhbmNlb2YgSW50ZWdlciAmJiAoSW50ZWdlcikgY29ubmVjdFRpbWVvdXQgPiAwKSB7CisgICAgICAgICAgICBjbGllbnQuc2V0Q29ubmVjdFRpbWVvdXQoKEludGVnZXIpIGNvbm5lY3RUaW1lb3V0KTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBPYmplY3QgdGhyZWFkUG9vbFNpemUgPSBjb25maWcuZ2V0UHJvcGVydGllcygpLmdldChDbGllbnRQcm9wZXJ0aWVzLkFTWU5DX1RIUkVBRFBPT0xfU0laRSk7CisgICAgICAgIGlmICh0aHJlYWRQb29sU2l6ZSAhPSBudWxsICYmIHRocmVhZFBvb2xTaXplIGluc3RhbmNlb2YgSW50ZWdlciAmJiAoSW50ZWdlcikgdGhyZWFkUG9vbFNpemUgPiAwKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IEh0dHBDbGllbnQuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgIkAiICsgaGFzaENvZGUoKTsKKyAgICAgICAgICAgIGZpbmFsIFF1ZXVlZFRocmVhZFBvb2wgdGhyZWFkUG9vbCA9IG5ldyBRdWV1ZWRUaHJlYWRQb29sKChJbnRlZ2VyKSB0aHJlYWRQb29sU2l6ZSk7CisgICAgICAgICAgICB0aHJlYWRQb29sLnNldE5hbWUobmFtZSk7CisgICAgICAgICAgICBjbGllbnQuc2V0RXhlY3V0b3IodGhyZWFkUG9vbCk7CisgICAgICAgIH0KKyAgICAgICAgQm9vbGVhbiBkaXNhYmxlQ29va2llcyA9IChCb29sZWFuKSBjb25maWcuZ2V0UHJvcGVydGllcygpLmdldChKZXR0eUNsaWVudFByb3BlcnRpZXMuRElTQUJMRV9DT09LSUVTKTsKKyAgICAgICAgZGlzYWJsZUNvb2tpZXMgPSAoZGlzYWJsZUNvb2tpZXMgIT0gbnVsbCkgPyBkaXNhYmxlQ29va2llcyA6IGZhbHNlOworCisgICAgICAgIGZpbmFsIEF1dGhlbnRpY2F0aW9uU3RvcmUgYXV0aCA9IGNsaWVudC5nZXRBdXRoZW50aWNhdGlvblN0b3JlKCk7CisgICAgICAgIGZpbmFsIE9iamVjdCBiYXNpY0F1dGhQcm92aWRlciA9IGNvbmZpZy5nZXRQcm9wZXJ0eShKZXR0eUNsaWVudFByb3BlcnRpZXMuUFJFRU1QVElWRV9CQVNJQ19BVVRIRU5USUNBVElPTik7CisgICAgICAgIGlmIChiYXNpY0F1dGhQcm92aWRlciAhPSBudWxsICYmIChiYXNpY0F1dGhQcm92aWRlciBpbnN0YW5jZW9mIEJhc2ljQXV0aGVudGljYXRpb24pKSB7CisgICAgICAgICAgICBhdXRoLmFkZEF1dGhlbnRpY2F0aW9uKChCYXNpY0F1dGhlbnRpY2F0aW9uKSBiYXNpY0F1dGhQcm92aWRlcik7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBPYmplY3QgcHJveHlVcmkgPSBjb25maWcuZ2V0UHJvcGVydGllcygpLmdldChDbGllbnRQcm9wZXJ0aWVzLlBST1hZX1VSSSk7CisgICAgICAgIGlmIChwcm94eVVyaSAhPSBudWxsKSB7CisgICAgICAgICAgICBmaW5hbCBVUkkgdSA9IGdldFByb3h5VXJpKHByb3h5VXJpKTsKKyAgICAgICAgICAgIGZpbmFsIFByb3h5Q29uZmlndXJhdGlvbiBwcm94eUNvbmZpZyA9IGNsaWVudC5nZXRQcm94eUNvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgICAgIHByb3h5Q29uZmlnLmdldFByb3hpZXMoKS5hZGQobmV3IEh0dHBQcm94eSh1LmdldEhvc3QoKSwgdS5nZXRQb3J0KCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkaXNhYmxlQ29va2llcykgeworICAgICAgICAgICAgY2xpZW50LnNldENvb2tpZVN0b3JlKG5ldyBIdHRwQ29va2llU3RvcmUuRW1wdHkoKSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2xpZW50LnN0YXJ0KCk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbigiRmFpbGVkIHRvIHN0YXJ0IHRoZSBjbGllbnQuIiwgZSk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5jb29raWVTdG9yZSA9IGNsaWVudC5nZXRDb29raWVTdG9yZSgpOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJDaGFpbk9mSW5zdGFuY2VvZkNoZWNrcyIpCisgICAgcHJpdmF0ZSBzdGF0aWMgVVJJIGdldFByb3h5VXJpKGZpbmFsIE9iamVjdCBwcm94eSkgeworICAgICAgICBpZiAocHJveHkgaW5zdGFuY2VvZiBVUkkpIHsKKyAgICAgICAgICAgIHJldHVybiAoVVJJKSBwcm94eTsKKyAgICAgICAgfSBlbHNlIGlmIChwcm94eSBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgcmV0dXJuIFVSSS5jcmVhdGUoKFN0cmluZykgcHJveHkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuV1JPTkdfUFJPWFlfVVJJX1RZUEUoQ2xpZW50UHJvcGVydGllcy5QUk9YWV9VUkkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUge0BsaW5rIEh0dHBDbGllbnR9LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUge0BsaW5rIEh0dHBDbGllbnR9LgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJVbnVzZWREZWNsYXJhdGlvbiIpCisgICAgcHVibGljIEh0dHBDbGllbnQgZ2V0SHR0cENsaWVudCgpIHsKKyAgICAgICAgcmV0dXJuIGNsaWVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHtAbGluayBDb29raWVTdG9yZX0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgQ29va2llU3RvcmV9IGluc3RhbmNlIG9yIG51bGwgd2hlbgorICAgICAqIEpldHR5Q2xpZW50UHJvcGVydGllcy5ESVNBQkxFX0NPT0tJRVMgc2V0IHRvIHRydWUuCisgICAgICovCisgICAgcHVibGljIENvb2tpZVN0b3JlIGdldENvb2tpZVN0b3JlKCkgeworICAgICAgICByZXR1cm4gY29va2llU3RvcmU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENsaWVudFJlc3BvbnNlIGFwcGx5KGZpbmFsIENsaWVudFJlcXVlc3QgamVyc2V5UmVxdWVzdCkgdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXF1ZXN0IGpldHR5UmVxdWVzdCA9IHRyYW5zbGF0ZVJlcXVlc3QoamVyc2V5UmVxdWVzdCk7CisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gY2xpZW50SGVhZGVyc1NuYXBzaG90ID0gd3JpdGVPdXRCb3VuZEhlYWRlcnMoamVyc2V5UmVxdWVzdC5nZXRIZWFkZXJzKCksIGpldHR5UmVxdWVzdCk7CisgICAgICAgIGZpbmFsIENvbnRlbnRQcm92aWRlciBlbnRpdHkgPSBnZXRCeXRlc1Byb3ZpZGVyKGplcnNleVJlcXVlc3QpOworICAgICAgICBpZiAoZW50aXR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGpldHR5UmVxdWVzdC5jb250ZW50KGVudGl0eSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgQ29udGVudFJlc3BvbnNlIGpldHR5UmVzcG9uc2UgPSBqZXR0eVJlcXVlc3Quc2VuZCgpOworICAgICAgICAgICAgSGVhZGVyVXRpbHMuY2hlY2tIZWFkZXJDaGFuZ2VzKGNsaWVudEhlYWRlcnNTbmFwc2hvdCwgamVyc2V5UmVxdWVzdC5nZXRIZWFkZXJzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmV0dHlDb25uZWN0b3IudGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisKKyAgICAgICAgICAgIGZpbmFsIGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2UuU3RhdHVzVHlwZSBzdGF0dXMgPSBqZXR0eVJlc3BvbnNlLmdldFJlYXNvbigpID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgPyBTdGF0dXNlcy5mcm9tKGpldHR5UmVzcG9uc2UuZ2V0U3RhdHVzKCkpCisgICAgICAgICAgICAgICAgICAgIDogU3RhdHVzZXMuZnJvbShqZXR0eVJlc3BvbnNlLmdldFN0YXR1cygpLCBqZXR0eVJlc3BvbnNlLmdldFJlYXNvbigpKTsKKworICAgICAgICAgICAgZmluYWwgQ2xpZW50UmVzcG9uc2UgamVyc2V5UmVzcG9uc2UgPSBuZXcgQ2xpZW50UmVzcG9uc2Uoc3RhdHVzLCBqZXJzZXlSZXF1ZXN0KTsKKyAgICAgICAgICAgIHByb2Nlc3NSZXNwb25zZUhlYWRlcnMoamV0dHlSZXNwb25zZS5nZXRIZWFkZXJzKCksIGplcnNleVJlc3BvbnNlKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgamVyc2V5UmVzcG9uc2Uuc2V0RW50aXR5U3RyZWFtKG5ldyBIdHRwQ2xpZW50UmVzcG9uc2VJbnB1dFN0cmVhbShqZXR0eVJlc3BvbnNlKSk7CisgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5TRVZFUkUsIG51bGwsIGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gamVyc2V5UmVzcG9uc2U7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJvY2Vzc1Jlc3BvbnNlSGVhZGVycyhmaW5hbCBIdHRwRmllbGRzIHJlc3BIZWFkZXJzLCBmaW5hbCBDbGllbnRSZXNwb25zZSBqZXJzZXlSZXNwb25zZSkgeworICAgICAgICBmb3IgKGZpbmFsIEh0dHBGaWVsZCBoZWFkZXIgOiByZXNwSGVhZGVycykgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGhlYWRlck5hbWUgPSBoZWFkZXIuZ2V0TmFtZSgpOworICAgICAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMgPSBqZXJzZXlSZXNwb25zZS5nZXRIZWFkZXJzKCk7CisgICAgICAgICAgICBMaXN0PFN0cmluZz4gbGlzdCA9IGhlYWRlcnMuZ2V0KGhlYWRlck5hbWUpOworICAgICAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpc3QuYWRkKGhlYWRlci5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIGhlYWRlcnMucHV0KGhlYWRlck5hbWUsIGxpc3QpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgSHR0cENsaWVudFJlc3BvbnNlSW5wdXRTdHJlYW0gZXh0ZW5kcyBGaWx0ZXJJbnB1dFN0cmVhbSB7CisKKyAgICAgICAgSHR0cENsaWVudFJlc3BvbnNlSW5wdXRTdHJlYW0oZmluYWwgQ29udGVudFJlc3BvbnNlIGpldHR5UmVzcG9uc2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBzdXBlcihnZXRJbnB1dFN0cmVhbShqZXR0eVJlc3BvbnNlKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShmaW5hbCBDb250ZW50UmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocmVzcG9uc2UuZ2V0Q29udGVudCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgUmVxdWVzdCB0cmFuc2xhdGVSZXF1ZXN0KGZpbmFsIENsaWVudFJlcXVlc3QgY2xpZW50UmVxdWVzdCkgeworCisgICAgICAgIGZpbmFsIFVSSSB1cmkgPSBjbGllbnRSZXF1ZXN0LmdldFVyaSgpOworICAgICAgICBmaW5hbCBSZXF1ZXN0IHJlcXVlc3QgPSBjbGllbnQubmV3UmVxdWVzdCh1cmkpOworICAgICAgICByZXF1ZXN0Lm1ldGhvZChjbGllbnRSZXF1ZXN0LmdldE1ldGhvZCgpKTsKKworICAgICAgICByZXF1ZXN0LmZvbGxvd1JlZGlyZWN0cyhjbGllbnRSZXF1ZXN0LnJlc29sdmVQcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLkZPTExPV19SRURJUkVDVFMsIHRydWUpKTsKKyAgICAgICAgZmluYWwgT2JqZWN0IHJlYWRUaW1lb3V0ID0gY2xpZW50UmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UHJvcGVydGllcygpLmdldChDbGllbnRQcm9wZXJ0aWVzLlJFQURfVElNRU9VVCk7CisgICAgICAgIGlmIChyZWFkVGltZW91dCAhPSBudWxsICYmIHJlYWRUaW1lb3V0IGluc3RhbmNlb2YgSW50ZWdlciAmJiAoSW50ZWdlcikgcmVhZFRpbWVvdXQgPiAwKSB7CisgICAgICAgICAgICByZXF1ZXN0LnRpbWVvdXQoKEludGVnZXIpIHJlYWRUaW1lb3V0LCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXF1ZXN0OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gd3JpdGVPdXRCb3VuZEhlYWRlcnMoZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGhlYWRlcnMsIGZpbmFsIFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IHN0cmluZ0hlYWRlcnMgPSBIZWFkZXJVdGlscy5hc1N0cmluZ0hlYWRlcnNTaW5nbGVWYWx1ZShoZWFkZXJzKTsKKworICAgICAgICAvLyByZW1vdmUgVXNlci1hZ2VudCBoZWFkZXIgc2V0IGJ5IEpldHR5OyBKZXJzZXkgYWxyZWFkeSBzZXRzIHRoaXMgaW4gaXRzIHJlcXVlc3QgKGluY2wuIEpldHR5IHZlcnNpb24pCisgICAgICAgIHJlcXVlc3QuZ2V0SGVhZGVycygpLnJlbW92ZShIdHRwSGVhZGVyLlVTRVJfQUdFTlQpOworICAgICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZSA6IHN0cmluZ0hlYWRlcnMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgcmVxdWVzdC5nZXRIZWFkZXJzKCkuYWRkKGUuZ2V0S2V5KCksIGUuZ2V0VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0cmluZ0hlYWRlcnM7CisgICAgfQorCisgICAgcHJpdmF0ZSBDb250ZW50UHJvdmlkZXIgZ2V0Qnl0ZXNQcm92aWRlcihmaW5hbCBDbGllbnRSZXF1ZXN0IGNsaWVudFJlcXVlc3QpIHsKKyAgICAgICAgZmluYWwgT2JqZWN0IGVudGl0eSA9IGNsaWVudFJlcXVlc3QuZ2V0RW50aXR5KCk7CisKKyAgICAgICAgaWYgKGVudGl0eSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIGNsaWVudFJlcXVlc3Quc2V0U3RyZWFtUHJvdmlkZXIobmV3IE91dGJvdW5kTWVzc2FnZUNvbnRleHQuU3RyZWFtUHJvdmlkZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKGZpbmFsIGludCBjb250ZW50TGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIHJldHVybiBvdXRwdXRTdHJlYW07CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjbGllbnRSZXF1ZXN0LndyaXRlRW50aXR5KCk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKCJGYWlsZWQgdG8gd3JpdGUgcmVxdWVzdCBlbnRpdHkuIiwgZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBCeXRlc0NvbnRlbnRQcm92aWRlcihvdXRwdXRTdHJlYW0udG9CeXRlQXJyYXkoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBDb250ZW50UHJvdmlkZXIgZ2V0U3RyZWFtUHJvdmlkZXIoZmluYWwgQ2xpZW50UmVxdWVzdCBjbGllbnRSZXF1ZXN0KSB7CisgICAgICAgIGZpbmFsIE9iamVjdCBlbnRpdHkgPSBjbGllbnRSZXF1ZXN0LmdldEVudGl0eSgpOworCisgICAgICAgIGlmIChlbnRpdHkgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW1Db250ZW50UHJvdmlkZXIgc3RyZWFtQ29udGVudFByb3ZpZGVyID0gbmV3IE91dHB1dFN0cmVhbUNvbnRlbnRQcm92aWRlcigpOworICAgICAgICBjbGllbnRSZXF1ZXN0LnNldFN0cmVhbVByb3ZpZGVyKG5ldyBPdXRib3VuZE1lc3NhZ2VDb250ZXh0LlN0cmVhbVByb3ZpZGVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbShmaW5hbCBpbnQgY29udGVudExlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RyZWFtQ29udGVudFByb3ZpZGVyLmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIHN0cmVhbUNvbnRlbnRQcm92aWRlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0NvbnRlbnQoZmluYWwgQ2xpZW50UmVxdWVzdCBjbGllbnRSZXF1ZXN0LCBmaW5hbCBDb250ZW50UHJvdmlkZXIgZW50aXR5KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoZW50aXR5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbUNvbnRlbnRQcm92aWRlciBzdHJlYW1Db250ZW50UHJvdmlkZXIgPSAoT3V0cHV0U3RyZWFtQ29udGVudFByb3ZpZGVyKSBlbnRpdHk7CisgICAgICAgIHRyeSAoZmluYWwgT3V0cHV0U3RyZWFtIG91dHB1dCA9IHN0cmVhbUNvbnRlbnRQcm92aWRlci5nZXRPdXRwdXRTdHJlYW0oKSkgeworICAgICAgICAgICAgY2xpZW50UmVxdWVzdC53cml0ZUVudGl0eSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEZ1dHVyZTw/PiBhcHBseShmaW5hbCBDbGllbnRSZXF1ZXN0IGplcnNleVJlcXVlc3QsIGZpbmFsIEFzeW5jQ29ubmVjdG9yQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgZmluYWwgUmVxdWVzdCBqZXR0eVJlcXVlc3QgPSB0cmFuc2xhdGVSZXF1ZXN0KGplcnNleVJlcXVlc3QpOworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IGNsaWVudEhlYWRlcnNTbmFwc2hvdCA9IHdyaXRlT3V0Qm91bmRIZWFkZXJzKGplcnNleVJlcXVlc3QuZ2V0SGVhZGVycygpLCBqZXR0eVJlcXVlc3QpOworICAgICAgICBmaW5hbCBDb250ZW50UHJvdmlkZXIgZW50aXR5ID0gZ2V0U3RyZWFtUHJvdmlkZXIoamVyc2V5UmVxdWVzdCk7CisgICAgICAgIGlmIChlbnRpdHkgIT0gbnVsbCkgeworICAgICAgICAgICAgamV0dHlSZXF1ZXN0LmNvbnRlbnQoZW50aXR5KTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBBdG9taWNCb29sZWFuIGNhbGxiYWNrSW52b2tlZCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKyAgICAgICAgZmluYWwgVGhyb3dhYmxlIGZhaWx1cmU7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTxDbGllbnRSZXNwb25zZT4gcmVzcG9uc2VGdXR1cmUgPQorICAgICAgICAgICAgICAgICAgICBuZXcgQ29tcGxldGFibGVGdXR1cmU8Q2xpZW50UmVzcG9uc2U+KCkud2hlbkNvbXBsZXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGllbnRSZXNwb25zZSwgdGhyb3dhYmxlKSAtPiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aHJvd2FibGUgIT0gbnVsbCAmJiB0aHJvd2FibGUgaW5zdGFuY2VvZiBDYW5jZWxsYXRpb25FeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRha2UgY2FyZSBvZiBmdXR1cmUgY2FuY2VsbGF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZXR0eVJlcXVlc3QuYWJvcnQodGhyb3dhYmxlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIGZpbmFsIEF0b21pY1JlZmVyZW5jZTxDbGllbnRSZXNwb25zZT4gamVyc2V5UmVzcG9uc2UgPSBuZXcgQXRvbWljUmVmZXJlbmNlPD4oKTsKKyAgICAgICAgICAgIGZpbmFsIEJ5dGVCdWZmZXJJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0gPSBuZXcgQnl0ZUJ1ZmZlcklucHV0U3RyZWFtKCk7CisgICAgICAgICAgICBqZXR0eVJlcXVlc3Quc2VuZChuZXcgUmVzcG9uc2UuTGlzdGVuZXIuQWRhcHRlcigpIHsKKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSGVhZGVycyhmaW5hbCBSZXNwb25zZSBqZXR0eVJlc3BvbnNlKSB7CisgICAgICAgICAgICAgICAgICAgIEhlYWRlclV0aWxzLmNoZWNrSGVhZGVyQ2hhbmdlcyhjbGllbnRIZWFkZXJzU25hcHNob3QsIGplcnNleVJlcXVlc3QuZ2V0SGVhZGVycygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmV0dHlDb25uZWN0b3IudGhpcy5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlRnV0dXJlLmlzRG9uZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNhbGxiYWNrSW52b2tlZC5jb21wYXJlQW5kU2V0KGZhbHNlLCB0cnVlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGllbnRSZXNwb25zZSByZXNwb25zZSA9IHRyYW5zbGF0ZVJlc3BvbnNlKGplcnNleVJlcXVlc3QsIGpldHR5UmVzcG9uc2UsIGVudGl0eVN0cmVhbSk7CisgICAgICAgICAgICAgICAgICAgIGplcnNleVJlc3BvbnNlLnNldChyZXNwb25zZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25Db250ZW50KGZpbmFsIFJlc3BvbnNlIGpldHR5UmVzcG9uc2UsIGZpbmFsIEJ5dGVCdWZmZXIgY29udGVudCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGVudCBtdXN0IGJlIGNvbnN1bWVkIGJlZm9yZSByZXR1cm5pbmcgZnJvbSB0aGlzIG1ldGhvZC4KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQuaGFzQXJyYXkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBhcnJheSA9IGNvbnRlbnQuYXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gYnVmZiA9IG5ldyBieXRlW2NvbnRlbnQucmVtYWluaW5nKCldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYXJyYXksIGNvbnRlbnQuYXJyYXlPZmZzZXQoKSwgYnVmZiwgMCwgY29udGVudC5yZW1haW5pbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5U3RyZWFtLnB1dChCeXRlQnVmZmVyLndyYXAoYnVmZikpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gYnVmZiA9IG5ldyBieXRlW2NvbnRlbnQucmVtYWluaW5nKCldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQuZ2V0KGJ1ZmYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eVN0cmVhbS5wdXQoQnl0ZUJ1ZmZlci53cmFwKGJ1ZmYpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFByb2Nlc3NpbmdFeGNlcHRpb24gcGUgPSBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbihleCk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHlTdHJlYW0uY2xvc2VRdWV1ZShwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnkgdG8gY29tcGxldGUgdGhlIGZ1dHVyZSB3aXRoIGFuIGV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VGdXR1cmUuY29tcGxldGVFeGNlcHRpb25hbGx5KHBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKGZpbmFsIFJlc3VsdCByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICAgICAgZW50aXR5U3RyZWFtLmNsb3NlUXVldWUoKTsKKyAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sucmVzcG9uc2UoamVyc2V5UmVzcG9uc2UuZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICByZXNwb25zZUZ1dHVyZS5jb21wbGV0ZShqZXJzZXlSZXNwb25zZS5nZXQoKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25GYWlsdXJlKGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlLCBmaW5hbCBUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICBlbnRpdHlTdHJlYW0uY2xvc2VRdWV1ZSh0KTsKKyAgICAgICAgICAgICAgICAgICAgLy8gdHJ5IHRvIGNvbXBsZXRlIHRoZSBmdXR1cmUgd2l0aCBhbiBleGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VGdXR1cmUuY29tcGxldGVFeGNlcHRpb25hbGx5KHQpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2tJbnZva2VkLmNvbXBhcmVBbmRTZXQoZmFsc2UsIHRydWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5mYWlsdXJlKHQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBwcm9jZXNzQ29udGVudChqZXJzZXlSZXF1ZXN0LCBlbnRpdHkpOworICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlRnV0dXJlOworICAgICAgICB9IGNhdGNoIChmaW5hbCBUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgZmFpbHVyZSA9IHQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2FsbGJhY2tJbnZva2VkLmNvbXBhcmVBbmRTZXQoZmFsc2UsIHRydWUpKSB7CisgICAgICAgICAgICBjYWxsYmFjay5mYWlsdXJlKGZhaWx1cmUpOworICAgICAgICB9CisgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPE9iamVjdD4gZnV0dXJlID0gbmV3IENvbXBsZXRhYmxlRnV0dXJlPD4oKTsKKyAgICAgICAgZnV0dXJlLmNvbXBsZXRlRXhjZXB0aW9uYWxseShmYWlsdXJlKTsKKyAgICAgICAgcmV0dXJuIGZ1dHVyZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBDbGllbnRSZXNwb25zZSB0cmFuc2xhdGVSZXNwb25zZShmaW5hbCBDbGllbnRSZXF1ZXN0IGplcnNleVJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmVjbGlwc2UuamV0dHkuY2xpZW50LmFwaS5SZXNwb25zZSBqZXR0eVJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE5vbkJsb2NraW5nSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB7CisgICAgICAgIGZpbmFsIENsaWVudFJlc3BvbnNlIGplcnNleVJlc3BvbnNlID0gbmV3IENsaWVudFJlc3BvbnNlKFN0YXR1c2VzLmZyb20oamV0dHlSZXNwb25zZS5nZXRTdGF0dXMoKSksIGplcnNleVJlcXVlc3QpOworICAgICAgICBwcm9jZXNzUmVzcG9uc2VIZWFkZXJzKGpldHR5UmVzcG9uc2UuZ2V0SGVhZGVycygpLCBqZXJzZXlSZXNwb25zZSk7CisgICAgICAgIGplcnNleVJlc3BvbnNlLnNldEVudGl0eVN0cmVhbShlbnRpdHlTdHJlYW0pOworICAgICAgICByZXR1cm4gamVyc2V5UmVzcG9uc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gIkpldHR5IEh0dHBDbGllbnQgIiArIEpldHR5LlZFUlNJT047CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjbGllbnQuc3RvcCgpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oIkZhaWxlZCB0byBzdG9wIHRoZSBjbGllbnQuIiwgZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2pldHR5LWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHR5L2Nvbm5lY3Rvci9KZXR0eUNvbm5lY3RvclByb3ZpZGVyLmphdmEgYi9jb25uZWN0b3JzL2pldHR5LWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHR5L2Nvbm5lY3Rvci9KZXR0eUNvbm5lY3RvclByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJmYjA1NAotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvamV0dHktY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamV0dHkvY29ubmVjdG9yL0pldHR5Q29ubmVjdG9yUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0eS5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhYmxlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5Jbml0aWFsaXphYmxlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5zcGkuQ29ubmVjdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5zcGkuQ29ubmVjdG9yUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZXR0eS5jbGllbnQuSHR0cENsaWVudDsKKworLyoqCisgKiBBIHtAbGluayBDb25uZWN0b3JQcm92aWRlcn0gZm9yIEplcnNleSB7QGxpbmsgQ29ubmVjdG9yIGNvbm5lY3Rvcn0KKyAqIGluc3RhbmNlcyB0aGF0IHV0aWxpemUgdGhlIEpldHR5IEhUVFAgQ2xpZW50IHRvIHNlbmQgYW5kIHJlY2VpdmUKKyAqIEhUVFAgcmVxdWVzdCBhbmQgcmVzcG9uc2VzLgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGNvbm5lY3RvciBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgYXJlIHN1cHBvcnRlZDoKKyAqIDx1bD4KKyAqIDxsaT57QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXMjQVNZTkNfVEhSRUFEUE9PTF9TSVpFfTwvbGk+CisgKiA8bGk+e0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzI0NPTk5FQ1RfVElNRU9VVH08L2xpPgorICogPGxpPntAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllcyNGT0xMT1dfUkVESVJFQ1RTfTwvbGk+CisgKiA8bGk+e0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzI1BST1hZX1VSSX08L2xpPgorICogPGxpPntAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllcyNQUk9YWV9VU0VSTkFNRX08L2xpPgorICogPGxpPntAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllcyNQUk9YWV9QQVNTV09SRH08L2xpPgorICogPGxpPntAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllcyNQUk9YWV9QQVNTV09SRH08L2xpPgorICogPGxpPntAbGluayBKZXR0eUNsaWVudFByb3BlcnRpZXMjUFJFRU1QVElWRV9CQVNJQ19BVVRIRU5USUNBVElPTn08L2xpPgorICogPGxpPntAbGluayBKZXR0eUNsaWVudFByb3BlcnRpZXMjRElTQUJMRV9DT09LSUVTfTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICogPHA+CisgKiBUaGlzIHRyYW5zcG9ydCBzdXBwb3J0cyBib3RoIHN5bmNocm9ub3VzIGFuZCBhc3luY2hyb25vdXMgcHJvY2Vzc2luZyBvZiBjbGllbnQgcmVxdWVzdHMuCisgKiBUaGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIHN1cHBvcnRlZDogR0VULCBQT1NULCBQVVQsIERFTEVURSwgSEVBRCwgT1BUSU9OUywgVFJBQ0UsIENPTk5FQ1QgYW5kIE1PVkUuCisgKiA8L3A+CisgKiA8cD4KKyAqIFR5cGljYWwgdXNhZ2U6CisgKiA8L3A+CisgKiA8cHJlPgorICoge0Bjb2RlCisgKiBDbGllbnRDb25maWcgY29uZmlnID0gbmV3IENsaWVudENvbmZpZygpOworICogY29uZmlnLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBKZXR0eUNvbm5lY3RvclByb3ZpZGVyKCkpOworICogQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KGNvbmZpZyk7CisgKgorICogLy8gYXN5bmMgcmVxdWVzdAorICogV2ViVGFyZ2V0IHRhcmdldCA9IGNsaWVudC50YXJnZXQoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCIpOworICogRnV0dXJlPFJlc3BvbnNlPiBmdXR1cmUgPSB0YXJnZXQucGF0aCgicmVzb3VyY2UiKS5yZXF1ZXN0KCkuYXN5bmMoKS5nZXQoKTsKKyAqCisgKiAvLyB3YWl0IGZvciAzIHNlY29uZHMKKyAqIFJlc3BvbnNlIHJlc3BvbnNlID0gZnV0dXJlLmdldCgzLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAqIFN0cmluZyBlbnRpdHkgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgKiBjbGllbnQuY2xvc2UoKTsKKyAqIH0KKyAqIDwvcHJlPgorICogPHA+CisgKiBDb25uZWN0b3IgaW5zdGFuY2VzIGNyZWF0ZWQgdmlhIEpldHR5IEhUVFAgQ2xpZW50LWJhc2VkIGNvbm5lY3RvciBwcm92aWRlciBzdXBwb3J0IG9ubHkKKyAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuUmVxdWVzdEVudGl0eVByb2Nlc3NpbmcjQlVGRkVSRUQgZW50aXR5IGJ1ZmZlcmluZ30uCisgKiBEZWZpbmluZyB0aGUgcHJvcGVydHkge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzI1JFUVVFU1RfRU5USVRZX1BST0NFU1NJTkd9IGhhcyBubworICogZWZmZWN0IG9uIEpldHR5IEhUVFAgQ2xpZW50LWJhc2VkIGNvbm5lY3RvcnMuCisgKiA8L3A+CisgKgorICogQGF1dGhvciBBcnVsIERoZXNpYXNlZWxhbiAoYXJ1bGQgYXQgYWNtLm9yZykKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKiBAc2luY2UgMi41CisgKi8KK3B1YmxpYyBjbGFzcyBKZXR0eUNvbm5lY3RvclByb3ZpZGVyIGltcGxlbWVudHMgQ29ubmVjdG9yUHJvdmlkZXIgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENvbm5lY3RvciBnZXRDb25uZWN0b3IoQ2xpZW50IGNsaWVudCwgQ29uZmlndXJhdGlvbiBydW50aW1lQ29uZmlnKSB7CisgICAgICAgIHJldHVybiBuZXcgSmV0dHlDb25uZWN0b3IoY2xpZW50LCBydW50aW1lQ29uZmlnKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSB0aGUgdW5kZXJseWluZyBKZXR0eSB7QGxpbmsgb3JnLmVjbGlwc2UuamV0dHkuY2xpZW50Lkh0dHBDbGllbnR9IGluc3RhbmNlIGZyb20KKyAgICAgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkplcnNleUNsaWVudH0gb3Ige0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5KZXJzZXlXZWJUYXJnZXR9CisgICAgICogY29uZmlndXJlZCB0byB1c2Uge0Bjb2RlIEpldHR5Q29ubmVjdG9yUHJvdmlkZXJ9LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbXBvbmVudCB7QGNvZGUgSmVyc2V5Q2xpZW50fSBvciB7QGNvZGUgSmVyc2V5V2ViVGFyZ2V0fSBpbnN0YW5jZSB0aGF0IGlzIGNvbmZpZ3VyZWQgdG8gdXNlCisgICAgICogICAgICAgICAgICAgICAgICB7QGNvZGUgSmV0dHlDb25uZWN0b3JQcm92aWRlcn0uCisgICAgICogQHJldHVybiB1bmRlcmx5aW5nIEpldHR5IHtAY29kZSBIdHRwQ2xpZW50fSBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbiBjYXNlIHRoZSB7QGNvZGUgY29tcG9uZW50fSBpcyBuZWl0aGVyIHtAY29kZSBKZXJzZXlDbGllbnR9CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vciB7QGNvZGUgSmVyc2V5V2ViVGFyZ2V0fSBpbnN0YW5jZSBvciBpbiBjYXNlIHRoZSBjb21wb25lbnQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbm90IGNvbmZpZ3VyZWQgdG8gdXNlIGEge0Bjb2RlIEpldHR5Q29ubmVjdG9yUHJvdmlkZXJ9LgorICAgICAqIEBzaW5jZSAyLjgKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEh0dHBDbGllbnQgZ2V0SHR0cENsaWVudChDb25maWd1cmFibGU8Pz4gY29tcG9uZW50KSB7CisgICAgICAgIGlmICghKGNvbXBvbmVudCBpbnN0YW5jZW9mIEluaXRpYWxpemFibGUpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBMb2NhbGl6YXRpb25NZXNzYWdlcy5JTlZBTElEX0NPTkZJR1VSQUJMRV9DT01QT05FTlRfVFlQRShjb21wb25lbnQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIEluaXRpYWxpemFibGU8Pz4gaW5pdGlhbGl6YWJsZSA9IChJbml0aWFsaXphYmxlPD8+KSBjb21wb25lbnQ7CisgICAgICAgIENvbm5lY3RvciBjb25uZWN0b3IgPSBpbml0aWFsaXphYmxlLmdldENvbmZpZ3VyYXRpb24oKS5nZXRDb25uZWN0b3IoKTsKKyAgICAgICAgaWYgKGNvbm5lY3RvciA9PSBudWxsKSB7CisgICAgICAgICAgICBpbml0aWFsaXphYmxlLnByZUluaXRpYWxpemUoKTsKKyAgICAgICAgICAgIGNvbm5lY3RvciA9IGluaXRpYWxpemFibGUuZ2V0Q29uZmlndXJhdGlvbigpLmdldENvbm5lY3RvcigpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbm5lY3RvciBpbnN0YW5jZW9mIEpldHR5Q29ubmVjdG9yKSB7CisgICAgICAgICAgICByZXR1cm4gKChKZXR0eUNvbm5lY3RvcikgY29ubmVjdG9yKS5nZXRIdHRwQ2xpZW50KCk7CisgICAgICAgIH0KKworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLkVYUEVDVEVEX0NPTk5FQ1RPUl9QUk9WSURFUl9OT1RfVVNFRCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2pldHR5LWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHR5L2Nvbm5lY3Rvci9wYWNrYWdlLWluZm8uamF2YSBiL2Nvbm5lY3RvcnMvamV0dHktY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamV0dHkvY29ubmVjdG9yL3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYjZhYzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL2pldHR5LWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHR5L2Nvbm5lY3Rvci9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDIxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvKioKKyAqIEplcnNleSBjbGllbnQge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5zcGkuQ29ubmVjdG9yIGNvbm5lY3Rvcn0gYmFzZWQgb24gdGhlCisgKiBKZXR0eSBDbGllbnQuCisgKi8KK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dHkuY29ubmVjdG9yOwpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9qZXR0eS1jb25uZWN0b3Ivc3JjL21haW4vcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHR5L2Nvbm5lY3Rvci9sb2NhbGl6YXRpb24ucHJvcGVydGllcyBiL2Nvbm5lY3RvcnMvamV0dHktY29ubmVjdG9yL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0eS9jb25uZWN0b3IvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVkOTcwOAotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvamV0dHktY29ubmVjdG9yL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0eS9jb25uZWN0b3IvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyMiBAQAorIworIyBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisjIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyMKKyMgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorIyBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisjIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorIyB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisjCisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorIworCisjIHswfSAtIEhUVFAgbWV0aG9kLCBlLmcuIEdFVCwgREVMRVRFCittZXRob2Qubm90LnN1cHBvcnRlZD1NZXRob2QgezB9IG5vdCBzdXBwb3J0ZWQuCisjIHswfSAtIHByb3BlcnR5IG5hbWUgLSBqZXJzZXkuY29uZmlnLmNsaWVudC5wcm94eVVyaQord3JvbmcucHJveHkudXJpLnR5cGU9VGhlIHByb3h5IFVSSSAoInswfSIpIHByb3BlcnR5IE1VU1QgYmUgYW4gaW5zdGFuY2Ugb2YgU3RyaW5nIG9yIFVSSS4KK2ludmFsaWQuY29uZmlndXJhYmxlLmNvbXBvbmVudC50eXBlPVRoZSBzdXBwbGllZCBjb21wb25lbnQgInswfSIgaXMgbm90IGFzc2lnbmFibGUgZnJvbSBKZXJzZXlDbGllbnQgb3IgSmVyc2V5V2ViVGFyZ2V0LgorZXhwZWN0ZWQuY29ubmVjdG9yLnByb3ZpZGVyLm5vdC51c2VkPVRoZSBzdXBwbGllZCBjb21wb25lbnQgaXMgbm90IGNvbmZpZ3VyZWQgdG8gdXNlIGEgSmV0dHlDb25uZWN0b3JQcm92aWRlci4KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvamV0dHktY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamV0dHkvY29ubmVjdG9yL0FzeW5jVGVzdC5qYXZhIGIvY29ubmVjdG9ycy9qZXR0eS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0eS9jb25uZWN0b3IvQXN5bmNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q2Mjg4MQotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvamV0dHktY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamV0dHkvY29ubmVjdG9yL0FzeW5jVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTk5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHR5LmNvbm5lY3RvcjsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkFzeW5jUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlN1c3BlbmRlZDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuVGltZW91dEhhbmRsZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnM7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogQXN5bmNocm9ub3VzIGNvbm5lY3RvciB0ZXN0LgorICoKKyAqIEBhdXRob3IgQXJ1bCBEaGVzaWFzZWVsYW4gKGFydWxkIGF0IGFjbS5vcmcpCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQXN5bmNUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoQXN5bmNUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEggPSAiYXN5bmMiOworCisgICAgLyoqCisgICAgICogQXN5bmNocm9ub3VzIHRlc3QgcmVzb3VyY2UuCisgICAgICovCisgICAgQFBhdGgoUEFUSCkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFzeW5jUmVzb3VyY2UgeworICAgICAgICAvKioKKyAgICAgICAgICogVHlwaWNhbCBsb25nLXJ1bm5pbmcgb3BlcmF0aW9uIGR1cmF0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIE9QRVJBVElPTl9EVVJBVElPTiA9IDEwMDA7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIExvbmctcnVubmluZyBhc3luY2hyb25vdXMgcG9zdC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFzeW5jUmVzcG9uc2UgYXN5bmMgcmVzcG9uc2UuCisgICAgICAgICAqIEBwYXJhbSBpZCAgICAgICAgICAgIHBvc3QgcmVxdWVzdCBpZCAocmVjZWl2ZWQgYXMgcmVxdWVzdCBwYXlsb2FkKS4KKyAgICAgICAgICovCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyB2b2lkIGFzeW5jUG9zdChAU3VzcGVuZGVkIGZpbmFsIEFzeW5jUmVzcG9uc2UgYXN5bmNSZXNwb25zZSwgZmluYWwgU3RyaW5nIGlkKSB7CisgICAgICAgICAgICBMT0dHRVIuaW5mbygiTG9uZyBydW5uaW5nIHBvc3Qgb3BlcmF0aW9uIGNhbGxlZCB3aXRoIGlkICIgKyBpZCArICIgb24gdGhyZWFkICIgKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHZlcnlFeHBlbnNpdmVPcGVyYXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgYXN5bmNSZXNwb25zZS5yZXN1bWUocmVzdWx0KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcml2YXRlIFN0cmluZyB2ZXJ5RXhwZW5zaXZlT3BlcmF0aW9uKCkgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi4gdmVyeSBleHBlbnNpdmUgb3BlcmF0aW9uIHRoYXQgdHlwaWNhbGx5IGZpbmlzaGVzIHdpdGhpbiAxIHNlY29uZHMsIHNpbXVsYXRlZCB1c2luZyBzbGVlcCgpCisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoT1BFUkFUSU9OX0RVUkFUSU9OKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRE9ORS0iICsgaWQ7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIklOVEVSUlVQVEVELSIgKyBpZDsKKyAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi5pbmZvKCJMb25nIHJ1bm5pbmcgcG9zdCBvcGVyYXRpb24gZmluaXNoZWQgb24gdGhyZWFkICIgKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9LCAiYXN5bmMtcG9zdC1ydW5uZXItIiArIGlkKS5zdGFydCgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIExvbmctcnVubmluZyBhc3luYyBnZXQgcmVxdWVzdCB0aGF0IHRpbWVzIG91dC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFzeW5jUmVzcG9uc2UgYXN5bmMgcmVzcG9uc2UuCisgICAgICAgICAqLworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJ0aW1lb3V0IikKKyAgICAgICAgcHVibGljIHZvaWQgYXN5bmNHZXRXaXRoVGltZW91dChAU3VzcGVuZGVkIGZpbmFsIEFzeW5jUmVzcG9uc2UgYXN5bmNSZXNwb25zZSkgeworICAgICAgICAgICAgTE9HR0VSLmluZm8oIkFzeW5jIGxvbmctcnVubmluZyBnZXQgd2l0aCB0aW1lb3V0IGNhbGxlZCBvbiB0aHJlYWQgIiArIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGFzeW5jUmVzcG9uc2Uuc2V0VGltZW91dEhhbmRsZXIobmV3IFRpbWVvdXRIYW5kbGVyKCkgeworCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlVGltZW91dChBc3luY1Jlc3BvbnNlIGFzeW5jUmVzcG9uc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgYXN5bmNSZXNwb25zZS5yZXN1bWUoUmVzcG9uc2Uuc3RhdHVzKFJlc3BvbnNlLlN0YXR1cy5TRVJWSUNFX1VOQVZBSUxBQkxFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lbnRpdHkoIk9wZXJhdGlvbiB0aW1lIG91dC4iKS5idWlsZCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGFzeW5jUmVzcG9uc2Uuc2V0VGltZW91dCgxLCBUaW1lVW5pdC5TRUNPTkRTKTsKKworICAgICAgICAgICAgbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSB2ZXJ5RXhwZW5zaXZlT3BlcmF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIGFzeW5jUmVzcG9uc2UucmVzdW1lKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdmVyeUV4cGVuc2l2ZU9wZXJhdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdmVyeSBleHBlbnNpdmUgb3BlcmF0aW9uIHRoYXQgdHlwaWNhbGx5IGZpbmlzaGVzIHdpdGhpbiAxIHNlY29uZCBidXQgY2FuIHRha2UgdXAgdG8gNSBzZWNvbmRzLAorICAgICAgICAgICAgICAgICAgICAvLyBzaW11bGF0ZWQgdXNpbmcgc2xlZXAoKQorICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUgKiBPUEVSQVRJT05fRFVSQVRJT04pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJET05FIjsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiSU5URVJSVVBURUQiOworICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmluZm8oIkFzeW5jIGxvbmctcnVubmluZyBnZXQgd2l0aCB0aW1lb3V0IGZpbmlzaGVkIG9uIHRocmVhZCAiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkuc3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhBc3luY1Jlc291cmNlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihuZXcgTG9nZ2luZ0ZlYXR1cmUoTE9HR0VSLCBMb2dnaW5nRmVhdHVyZS5WZXJib3NpdHkuUEFZTE9BRF9BTlkpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICAvLyBUT0RPOiBmYWlscyB3aXRoIHRydWUgb24gcmVxdWVzdCAtIHNob3VsZCBiZSBmaXhlZCBieSByZXNvbHZpbmcgSkVSU0VZLTIyNzMKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKG5ldyBMb2dnaW5nRmVhdHVyZShMT0dHRVIsIExvZ2dpbmdGZWF0dXJlLlZlcmJvc2l0eS5IRUFERVJTX09OTFkpKTsKKyAgICAgICAgY29uZmlnLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBKZXR0eUNvbm5lY3RvclByb3ZpZGVyKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgYXN5bmNocm9ub3VzIFBPU1QuCisgICAgICoKKyAgICAgKiBTZW5kIDMgYXN5bmMgUE9TVCByZXF1ZXN0cyBhbmQgd2FpdCB0byByZWNlaXZlIHRoZSByZXNwb25zZXMuIENoZWNrIHRoZSByZXNwb25zZSBjb250ZW50IGFuZAorICAgICAqIGFzc2VydCB0aGF0IHRoZSBvcGVyYXRpb24gZGlkIG5vdCB0YWtlIG1vcmUgdGhhbiB0d2ljZSBhcyBsb25nIGFzIGEgc2luZ2xlIGxvbmcgb3BlcmF0aW9uIGR1cmF0aW9uCisgICAgICogKHRoaXMgZW5zdXJlcyBhc3luYyByZXF1ZXN0IGV4ZWN1dGlvbikuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGVzdCBlcnJvci4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luY1Bvc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgbG9uZyB0aWMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgICAgICAvLyBTdWJtaXQgcmVxdWVzdHMgYXN5bmNocm9ub3VzbHkuCisgICAgICAgIGZpbmFsIEZ1dHVyZTxSZXNwb25zZT4gcmYxID0gdGFyZ2V0KFBBVEgpLnJlcXVlc3QoKS5hc3luYygpLnBvc3QoRW50aXR5LnRleHQoIjEiKSk7CisgICAgICAgIGZpbmFsIEZ1dHVyZTxSZXNwb25zZT4gcmYyID0gdGFyZ2V0KFBBVEgpLnJlcXVlc3QoKS5hc3luYygpLnBvc3QoRW50aXR5LnRleHQoIjIiKSk7CisgICAgICAgIGZpbmFsIEZ1dHVyZTxSZXNwb25zZT4gcmYzID0gdGFyZ2V0KFBBVEgpLnJlcXVlc3QoKS5hc3luYygpLnBvc3QoRW50aXR5LnRleHQoIjMiKSk7CisgICAgICAgIC8vIGdldCgpIHdhaXRzIGZvciB0aGUgcmVzcG9uc2UKKyAgICAgICAgZmluYWwgU3RyaW5nIHIxID0gcmYxLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHIyID0gcmYyLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHIzID0gcmYzLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBmaW5hbCBsb25nIHRvYyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgICAgIGFzc2VydEVxdWFscygiRE9ORS0xIiwgcjEpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkRPTkUtMiIsIHIyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJET05FLTMiLCByMyk7CisKKyAgICAgICAgYXNzZXJ0VGhhdCgiQXN5bmMgcHJvY2Vzc2luZyB0b29rIHRvbyBsb25nLiIsIHRvYyAtIHRpYywgTWF0Y2hlcnMubGVzc1RoYW4oMyAqIEFzeW5jUmVzb3VyY2UuT1BFUkFUSU9OX0RVUkFUSU9OKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBhY2Nlc3NpbmcgYW4gb3BlcmF0aW9uIHRoYXQgdGltZXMgb3V0IG9uIHRoZSBzZXJ2ZXIuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGVzdCBlcnJvci4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luY0dldFdpdGhUaW1lb3V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEZ1dHVyZTxSZXNwb25zZT4gcmVzcG9uc2VGdXR1cmUgPSB0YXJnZXQoUEFUSCkucGF0aCgidGltZW91dCIpLnJlcXVlc3QoKS5hc3luYygpLmdldCgpOworICAgICAgICAvLyBSZXF1ZXN0IGlzIGJlaW5nIHByb2Nlc3NlZCBhc3luY2hyb25vdXNseS4KKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSByZXNwb25zZUZ1dHVyZS5nZXQoKTsKKworICAgICAgICAvLyBnZXQoKSB3YWl0cyBmb3IgdGhlIHJlc3BvbnNlCisgICAgICAgIGFzc2VydEVxdWFscyg1MDMsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJPcGVyYXRpb24gdGltZSBvdXQuIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2pldHR5LWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHR5L2Nvbm5lY3Rvci9BdXRoRmlsdGVyVGVzdC5qYXZhIGIvY29ubmVjdG9ycy9qZXR0eS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0eS9jb25uZWN0b3IvQXV0aEZpbHRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2M5MGY3Ci0tLSAvZGV2L251bGwKKysrIGIvY29ubmVjdG9ycy9qZXR0eS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0eS9jb25uZWN0b3IvQXV0aEZpbHRlclRlc3QuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHR5LmNvbm5lY3RvcjsKKworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuYXV0aGVudGljYXRpb24uSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBBcnVsIERoZXNpYXNlZWxhbiAoYXJ1bGQgYXQgYWNtLm9yZykKKyAqLworcHVibGljIGNsYXNzIEF1dGhGaWx0ZXJUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihBdXRoRmlsdGVyVGVzdC5jbGFzcy5nZXROYW1lKCkpOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgUmVzb3VyY2VDb25maWcgY29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKEF1dGhUZXN0LkF1dGhSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihuZXcgTG9nZ2luZ0ZlYXR1cmUoTE9HR0VSLCBMb2dnaW5nRmVhdHVyZS5WZXJib3NpdHkuUEFZTE9BRF9BTlkpKTsKKyAgICAgICAgcmV0dXJuIGNvbmZpZzsKKyAgICB9CisKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5jb25uZWN0b3JQcm92aWRlcihuZXcgSmV0dHlDb25uZWN0b3JQcm92aWRlcigpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRoR2V0V2l0aENsaWVudEZpbHRlcigpIHsKKyAgICAgICAgY2xpZW50KCkucmVnaXN0ZXIoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5iYXNpYygibmFtZSIsICJwYXNzd29yZCIpKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoInRlc3QvZmlsdGVyIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0aFBvc3RXaXRoQ2xpZW50RmlsdGVyKCkgeworICAgICAgICBjbGllbnQoKS5yZWdpc3RlcihIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLmJhc2ljKCJuYW1lIiwgInBhc3N3b3JkIikpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgidGVzdC9maWx0ZXIiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkudGV4dCgiUE9TVCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJQT1NUIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEF1dGhEZWxldGVXaXRoQ2xpZW50RmlsdGVyKCkgeworICAgICAgICBjbGllbnQoKS5yZWdpc3RlcihIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLmJhc2ljKCJuYW1lIiwgInBhc3N3b3JkIikpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgidGVzdC9maWx0ZXIiKS5yZXF1ZXN0KCkuZGVsZXRlKCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDQsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvamV0dHktY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamV0dHkvY29ubmVjdG9yL0F1dGhUZXN0LmphdmEgYi9jb25uZWN0b3JzL2pldHR5LWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHR5L2Nvbm5lY3Rvci9BdXRoVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMDhkOWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL2pldHR5LWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHR5L2Nvbm5lY3Rvci9BdXRoVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTk3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHR5LmNvbm5lY3RvcjsKKworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkRFTEVURTsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZXR0eS5jbGllbnQudXRpbC5CYXNpY0F1dGhlbnRpY2F0aW9uOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgQXJ1bCBEaGVzaWFzZWVsYW4gKGFydWxkIGF0IGFjbS5vcmcpCisgKi8KK3B1YmxpYyBjbGFzcyBBdXRoVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoQXV0aFRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSCA9ICJ0ZXN0IjsKKworICAgIEBQYXRoKCIvdGVzdCIpCisgICAgQFNpbmdsZXRvbgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQXV0aFJlc291cmNlIHsKKworICAgICAgICBpbnQgcmVxdWVzdENvdW50ID0gMDsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KEBDb250ZXh0IEh0dHBIZWFkZXJzIGgpIHsKKyAgICAgICAgICAgIHJlcXVlc3RDb3VudCsrOworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gaC5nZXRSZXF1ZXN0SGVhZGVycygpLmdldEZpcnN0KCJBdXRob3JpemF0aW9uIik7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCByZXF1ZXN0Q291bnQpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlLnN0YXR1cyg0MDEpLmhlYWRlcigiV1dXLUF1dGhlbnRpY2F0ZSIsICJCYXNpYyByZWFsbT1cIldhbGx5V29ybGRcIiIpLmJ1aWxkKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHJlcXVlc3RDb3VudCA+IDEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gIkdFVCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJmaWx0ZXIiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEZpbHRlcihAQ29udGV4dCBIdHRwSGVhZGVycyBoKSB7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBoLmdldFJlcXVlc3RIZWFkZXJzKCkuZ2V0Rmlyc3QoIkF1dGhvcml6YXRpb24iKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2Uuc3RhdHVzKDQwMSkuaGVhZGVyKCJXV1ctQXV0aGVudGljYXRlIiwgIkJhc2ljIHJlYWxtPVwiV2FsbHlXb3JsZFwiIikuYnVpbGQoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiAiR0VUIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdChAQ29udGV4dCBIdHRwSGVhZGVycyBoLCBTdHJpbmcgZSkgeworICAgICAgICAgICAgcmVxdWVzdENvdW50Kys7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBoLmdldFJlcXVlc3RIZWFkZXJzKCkuZ2V0Rmlyc3QoIkF1dGhvcml6YXRpb24iKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlcXVlc3RDb3VudCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2Uuc3RhdHVzKDQwMSkuaGVhZGVyKCJXV1ctQXV0aGVudGljYXRlIiwgIkJhc2ljIHJlYWxtPVwiV2FsbHlXb3JsZFwiIikuYnVpbGQoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFzc2VydFRydWUocmVxdWVzdENvdW50ID4gMSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBlOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoImZpbHRlciIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdEZpbHRlcihAQ29udGV4dCBIdHRwSGVhZGVycyBoLCBTdHJpbmcgZSkgeworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gaC5nZXRSZXF1ZXN0SGVhZGVycygpLmdldEZpcnN0KCJBdXRob3JpemF0aW9uIik7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlLnN0YXR1cyg0MDEpLmhlYWRlcigiV1dXLUF1dGhlbnRpY2F0ZSIsICJCYXNpYyByZWFsbT1cIldhbGx5V29ybGRcIiIpLmJ1aWxkKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZTsKKyAgICAgICAgfQorCisgICAgICAgIEBERUxFVEUKKyAgICAgICAgcHVibGljIHZvaWQgZGVsZXRlKEBDb250ZXh0IEh0dHBIZWFkZXJzIGgpIHsKKyAgICAgICAgICAgIHJlcXVlc3RDb3VudCsrOworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gaC5nZXRSZXF1ZXN0SGVhZGVycygpLmdldEZpcnN0KCJBdXRob3JpemF0aW9uIik7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCByZXF1ZXN0Q291bnQpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlLnN0YXR1cyg0MDEpLmhlYWRlcigiV1dXLUF1dGhlbnRpY2F0ZSIsICJCYXNpYyByZWFsbT1cIldhbGx5V29ybGRcIiIpLmJ1aWxkKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHJlcXVlc3RDb3VudCA+IDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQERFTEVURQorICAgICAgICBAUGF0aCgiZmlsdGVyIikKKyAgICAgICAgcHVibGljIHZvaWQgZGVsZXRlRmlsdGVyKEBDb250ZXh0IEh0dHBIZWFkZXJzIGgpIHsKKyAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGguZ2V0UmVxdWVzdEhlYWRlcnMoKS5nZXRGaXJzdCgiQXV0aG9yaXphdGlvbiIpOworICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViQXBwbGljYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBSZXNwb25zZS5zdGF0dXMoNDAxKS5oZWFkZXIoIldXVy1BdXRoZW50aWNhdGUiLCAiQmFzaWMgcmVhbG09XCJXYWxseVdvcmxkXCIiKS5idWlsZCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBERUxFVEUKKyAgICAgICAgQFBhdGgoImZpbHRlci93aXRoRW50aXR5IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkZWxldGVGaWx0ZXJXaXRoRW50aXR5KEBDb250ZXh0IEh0dHBIZWFkZXJzIGgsIFN0cmluZyBlKSB7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBoLmdldFJlcXVlc3RIZWFkZXJzKCkuZ2V0Rmlyc3QoIkF1dGhvcml6YXRpb24iKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2Uuc3RhdHVzKDQwMSkuaGVhZGVyKCJXV1ctQXV0aGVudGljYXRlIiwgIkJhc2ljIHJlYWxtPVwiV2FsbHlXb3JsZFwiIikuYnVpbGQoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBlOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgUmVzb3VyY2VDb25maWcgY29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKEF1dGhSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihuZXcgTG9nZ2luZ0ZlYXR1cmUoTE9HR0VSLCBMb2dnaW5nRmVhdHVyZS5WZXJib3NpdHkuUEFZTE9BRF9BTlkpKTsKKyAgICAgICAgcmV0dXJuIGNvbmZpZzsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRoR2V0KCkgeworICAgICAgICBDbGllbnRDb25maWcgY29uZmlnID0gbmV3IENsaWVudENvbmZpZygpOworICAgICAgICBjb25maWcucHJvcGVydHkoSmV0dHlDbGllbnRQcm9wZXJ0aWVzLlBSRUVNUFRJVkVfQkFTSUNfQVVUSEVOVElDQVRJT04sCisgICAgICAgICAgICAgICAgbmV3IEJhc2ljQXV0aGVudGljYXRpb24oZ2V0QmFzZVVyaSgpLCAiV2FsbHlXb3JsZCIsICJuYW1lIiwgInBhc3N3b3JkIikpOworICAgICAgICBjb25maWcuY29ubmVjdG9yUHJvdmlkZXIobmV3IEpldHR5Q29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgICAgIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudChjb25maWcpOworCisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gY2xpZW50LnRhcmdldChnZXRCYXNlVXJpKCkpLnBhdGgoUEFUSCkucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGNsaWVudC5jbG9zZSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEF1dGhQb3N0KCkgeworICAgICAgICBDbGllbnRDb25maWcgY29uZmlnID0gbmV3IENsaWVudENvbmZpZygpOworICAgICAgICBjb25maWcucHJvcGVydHkoSmV0dHlDbGllbnRQcm9wZXJ0aWVzLlBSRUVNUFRJVkVfQkFTSUNfQVVUSEVOVElDQVRJT04sCisgICAgICAgICAgICAgICAgbmV3IEJhc2ljQXV0aGVudGljYXRpb24oZ2V0QmFzZVVyaSgpLCAiV2FsbHlXb3JsZCIsICJuYW1lIiwgInBhc3N3b3JkIikpOworICAgICAgICBjb25maWcuY29ubmVjdG9yUHJvdmlkZXIobmV3IEpldHR5Q29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgICAgIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudChjb25maWcpOworCisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gY2xpZW50LnRhcmdldChnZXRCYXNlVXJpKCkpLnBhdGgoUEFUSCkucmVxdWVzdCgpLnBvc3QoRW50aXR5LnRleHQoIlBPU1QiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiUE9TVCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGNsaWVudC5jbG9zZSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEF1dGhEZWxldGUoKSB7CisgICAgICAgIENsaWVudENvbmZpZyBjb25maWcgPSBuZXcgQ2xpZW50Q29uZmlnKCk7CisgICAgICAgIGNvbmZpZy5wcm9wZXJ0eShKZXR0eUNsaWVudFByb3BlcnRpZXMuUFJFRU1QVElWRV9CQVNJQ19BVVRIRU5USUNBVElPTiwKKyAgICAgICAgICAgICAgICBuZXcgQmFzaWNBdXRoZW50aWNhdGlvbihnZXRCYXNlVXJpKCksICJXYWxseVdvcmxkIiwgIm5hbWUiLCAicGFzc3dvcmQiKSk7CisgICAgICAgIGNvbmZpZy5jb25uZWN0b3JQcm92aWRlcihuZXcgSmV0dHlDb25uZWN0b3JQcm92aWRlcigpKTsKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KGNvbmZpZyk7CisKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSBjbGllbnQudGFyZ2V0KGdldEJhc2VVcmkoKSkucGF0aChQQVRIKS5yZXF1ZXN0KCkuZGVsZXRlKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhyZXNwb25zZS5nZXRTdGF0dXMoKSwgMjA0KTsKKyAgICAgICAgY2xpZW50LmNsb3NlKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2pldHR5LWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHR5L2Nvbm5lY3Rvci9Db29raWVUZXN0LmphdmEgYi9jb25uZWN0b3JzL2pldHR5LWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHR5L2Nvbm5lY3Rvci9Db29raWVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZjYjZmMQotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvamV0dHktY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamV0dHkvY29ubmVjdG9yL0Nvb2tpZVRlc3QuamF2YQpAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0eS5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db29raWU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk5ld0Nvb2tpZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuSmVyc2V5Q2xpZW50OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5KZXJzZXlDbGllbnRCdWlsZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIEFydWwgRGhlc2lhc2VlbGFuIChhcnVsZCBhdCBhY20ub3JnKQorICovCitwdWJsaWMgY2xhc3MgQ29va2llVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoQ29va2llVGVzdC5jbGFzcy5nZXROYW1lKCkpOworCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29va2llUmVzb3VyY2UgeworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXQoQENvbnRleHQgSHR0cEhlYWRlcnMgaCkgeworICAgICAgICAgICAgQ29va2llIGMgPSBoLmdldENvb2tpZXMoKS5nZXQoIm5hbWUiKTsKKyAgICAgICAgICAgIFN0cmluZyBlID0gKGMgPT0gbnVsbCkgPyAiTk8tQ09PS0lFIiA6IGMuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vayhlKQorICAgICAgICAgICAgICAgICAgICAuY29va2llKG5ldyBOZXdDb29raWUoIm5hbWUiLCAidmFsdWUiKSkuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIFJlc291cmNlQ29uZmlnIGNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhDb29raWVSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihuZXcgTG9nZ2luZ0ZlYXR1cmUoTE9HR0VSLCBMb2dnaW5nRmVhdHVyZS5WZXJib3NpdHkuUEFZTE9BRF9BTlkpKTsKKyAgICAgICAgcmV0dXJuIGNvbmZpZzsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb29raWVSZXNvdXJjZSgpIHsKKyAgICAgICAgQ2xpZW50Q29uZmlnIGNvbmZpZyA9IG5ldyBDbGllbnRDb25maWcoKTsKKyAgICAgICAgY29uZmlnLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBKZXR0eUNvbm5lY3RvclByb3ZpZGVyKCkpOworICAgICAgICBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoY29uZmlnKTsKKyAgICAgICAgV2ViVGFyZ2V0IHIgPSBjbGllbnQudGFyZ2V0KGdldEJhc2VVcmkoKSk7CisKKworICAgICAgICBhc3NlcnRFcXVhbHMoIk5PLUNPT0tJRSIsIHIucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZSIsIHIucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgY2xpZW50LmNsb3NlKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZWRDb29raWVzKCkgeworICAgICAgICBDbGllbnRDb25maWcgY2MgPSBuZXcgQ2xpZW50Q29uZmlnKCk7CisgICAgICAgIGNjLnByb3BlcnR5KEpldHR5Q2xpZW50UHJvcGVydGllcy5ESVNBQkxFX0NPT0tJRVMsIHRydWUpOworICAgICAgICBjYy5jb25uZWN0b3JQcm92aWRlcihuZXcgSmV0dHlDb25uZWN0b3JQcm92aWRlcigpKTsKKyAgICAgICAgSmVyc2V5Q2xpZW50IGNsaWVudCA9IEplcnNleUNsaWVudEJ1aWxkZXIuY3JlYXRlQ2xpZW50KGNjKTsKKyAgICAgICAgV2ViVGFyZ2V0IHIgPSBjbGllbnQudGFyZ2V0KGdldEJhc2VVcmkoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJOTy1DT09LSUUiLCByLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiTk8tQ09PS0lFIiwgci5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworCisgICAgICAgIGZpbmFsIEpldHR5Q29ubmVjdG9yIGNvbm5lY3RvciA9IChKZXR0eUNvbm5lY3RvcikgY2xpZW50LmdldENvbmZpZ3VyYXRpb24oKS5nZXRDb25uZWN0b3IoKTsKKyAgICAgICAgaWYgKGNvbm5lY3Rvci5nZXRDb29raWVTdG9yZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoY29ubmVjdG9yLmdldENvb2tpZVN0b3JlKCkuZ2V0Q29va2llcygpLmlzRW1wdHkoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhc3NlcnROdWxsKGNvbm5lY3Rvci5nZXRDb29raWVTdG9yZSgpKTsKKyAgICAgICAgfQorICAgICAgICBjbGllbnQuY2xvc2UoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb29raWVzKCkgeworICAgICAgICBDbGllbnRDb25maWcgY2MgPSBuZXcgQ2xpZW50Q29uZmlnKCk7CisgICAgICAgIGNjLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBKZXR0eUNvbm5lY3RvclByb3ZpZGVyKCkpOworICAgICAgICBKZXJzZXlDbGllbnQgY2xpZW50ID0gSmVyc2V5Q2xpZW50QnVpbGRlci5jcmVhdGVDbGllbnQoY2MpOworICAgICAgICBXZWJUYXJnZXQgciA9IGNsaWVudC50YXJnZXQoZ2V0QmFzZVVyaSgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIk5PLUNPT0tJRSIsIHIucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZSIsIHIucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICBmaW5hbCBKZXR0eUNvbm5lY3RvciBjb25uZWN0b3IgPSAoSmV0dHlDb25uZWN0b3IpIGNsaWVudC5nZXRDb25maWd1cmF0aW9uKCkuZ2V0Q29ubmVjdG9yKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY29ubmVjdG9yLmdldENvb2tpZVN0b3JlKCkuZ2V0Q29va2llcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNvbm5lY3Rvci5nZXRDb29raWVTdG9yZSgpLmdldENvb2tpZXMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlIiwgY29ubmVjdG9yLmdldENvb2tpZVN0b3JlKCkuZ2V0Q29va2llcygpLmdldCgwKS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgY2xpZW50LmNsb3NlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9qZXR0eS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0eS9jb25uZWN0b3IvQ3VzdG9tTG9nZ2luZ0ZpbHRlci5qYXZhIGIvY29ubmVjdG9ycy9qZXR0eS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0eS9jb25uZWN0b3IvQ3VzdG9tTG9nZ2luZ0ZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYjY0NmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL2pldHR5LWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHR5L2Nvbm5lY3Rvci9DdXN0b21Mb2dnaW5nRmlsdGVyLmphdmEKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0eS5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXNwb25zZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlc3BvbnNlRmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUZpbHRlcjsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBDdXN0b20gbG9nZ2luZyBmaWx0ZXIuCisgKgorICogQGF1dGhvciBTYW50aWFnbyBQZXJpY2FzLUdlZXJ0c2VuIChzYW50aWFnby5wZXJpY2FzZ2VlcnRzZW4gYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEN1c3RvbUxvZ2dpbmdGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyLCBDb250YWluZXJSZXNwb25zZUZpbHRlciwKKyAgICAgICAgQ2xpZW50UmVxdWVzdEZpbHRlciwgQ2xpZW50UmVzcG9uc2VGaWx0ZXIgeworCisgICAgc3RhdGljIGludCBwcmVGaWx0ZXJDYWxsZWQgPSAwOworICAgIHN0YXRpYyBpbnQgcG9zdEZpbHRlckNhbGxlZCA9IDA7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ2xpZW50UmVxdWVzdENvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDdXN0b21Mb2dnaW5nRmlsdGVyLnByZUZpbHRlciBjYWxsZWQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnRleHQuZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnR5KCJmb28iKSwgImJhciIpOworICAgICAgICBwcmVGaWx0ZXJDYWxsZWQrKzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ2xpZW50UmVxdWVzdENvbnRleHQgY29udGV4dCwgQ2xpZW50UmVzcG9uc2VDb250ZXh0IGNsaWVudFJlc3BvbnNlQ29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDdXN0b21Mb2dnaW5nRmlsdGVyLnBvc3RGaWx0ZXIgY2FsbGVkIik7CisgICAgICAgIGFzc2VydEVxdWFscyhjb250ZXh0LmdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0eSgiZm9vIiksICJiYXIiKTsKKyAgICAgICAgcG9zdEZpbHRlckNhbGxlZCsrOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkN1c3RvbUxvZ2dpbmdGaWx0ZXIucHJlRmlsdGVyIGNhbGxlZCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoY29udGV4dC5nZXRQcm9wZXJ0eSgiZm9vIiksICJiYXIiKTsKKyAgICAgICAgcHJlRmlsdGVyQ2FsbGVkKys7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IGNvbnRleHQsIENvbnRhaW5lclJlc3BvbnNlQ29udGV4dCBjb250YWluZXJSZXNwb25zZUNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ3VzdG9tTG9nZ2luZ0ZpbHRlci5wb3N0RmlsdGVyIGNhbGxlZCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoY29udGV4dC5nZXRQcm9wZXJ0eSgiZm9vIiksICJiYXIiKTsKKyAgICAgICAgcG9zdEZpbHRlckNhbGxlZCsrOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvamV0dHktY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamV0dHkvY29ubmVjdG9yL0VudGl0eVRlc3QuamF2YSBiL2Nvbm5lY3RvcnMvamV0dHktY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamV0dHkvY29ubmVjdG9yL0VudGl0eVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWFhMTI2Ci0tLSAvZGV2L251bGwKKysrIGIvY29ubmVjdG9ycy9qZXR0eS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0eS9jb25uZWN0b3IvRW50aXR5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTU4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHR5LmNvbm5lY3RvcjsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lb3V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uSmFja3NvbkZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0cyB0aGUgSHR0cCBjb250ZW50IG5lZ290aWF0aW9uLgorICoKKyAqIEBhdXRob3IgQXJ1bCBEaGVzaWFzZWVsYW4gKGFydWxkIGF0IGFjbS5vcmcpCisgKi8KK3B1YmxpYyBjbGFzcyBFbnRpdHlUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihFbnRpdHlUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSCA9ICJ0ZXN0IjsKKworICAgIEBQYXRoKCIvdGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFbnRpdHlSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgUGVyc29uIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUGVyc29uKCJKb2huIiwgIkRvZSIpOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFBlcnNvbiBwb3N0KFBlcnNvbiBlbnRpdHkpIHsKKyAgICAgICAgICAgIHJldHVybiBlbnRpdHk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIEBYbWxSb290RWxlbWVudAorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGVyc29uIHsKKworICAgICAgICBwcml2YXRlIFN0cmluZyBmaXJzdE5hbWU7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIGxhc3ROYW1lOworCisgICAgICAgIHB1YmxpYyBQZXJzb24oKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUGVyc29uKFN0cmluZyBmaXJzdE5hbWUsIFN0cmluZyBsYXN0TmFtZSkgeworICAgICAgICAgICAgdGhpcy5maXJzdE5hbWUgPSBmaXJzdE5hbWU7CisgICAgICAgICAgICB0aGlzLmxhc3ROYW1lID0gbGFzdE5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEZpcnN0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBmaXJzdE5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRGaXJzdE5hbWUoU3RyaW5nIGZpcnN0TmFtZSkgeworICAgICAgICAgICAgdGhpcy5maXJzdE5hbWUgPSBmaXJzdE5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldExhc3ROYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIGxhc3ROYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0TGFzdE5hbWUoU3RyaW5nIGxhc3ROYW1lKSB7CisgICAgICAgICAgICB0aGlzLmxhc3ROYW1lID0gbGFzdE5hbWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBmaXJzdE5hbWUgKyAiICIgKyBsYXN0TmFtZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIFJlc291cmNlQ29uZmlnIGNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhFbnRpdHlSZXNvdXJjZS5jbGFzcywgSmFja3NvbkZlYXR1cmUuY2xhc3MpOworICAgICAgICBjb25maWcucmVnaXN0ZXIobmV3IExvZ2dpbmdGZWF0dXJlKExPR0dFUiwgTG9nZ2luZ0ZlYXR1cmUuVmVyYm9zaXR5LlBBWUxPQURfQU5ZKSk7CisgICAgICAgIHJldHVybiBjb25maWc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBKZXR0eUNvbm5lY3RvclByb3ZpZGVyKCkpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKEphY2tzb25GZWF0dXJlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXQoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KFBBVEgpLnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTF9UWVBFKS5nZXQoKTsKKyAgICAgICAgUGVyc29uIHBlcnNvbiA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoUGVyc29uLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJKb2huIERvZSIsIHBlcnNvbi50b1N0cmluZygpKTsKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQoUEFUSCkucmVxdWVzdChNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFKS5nZXQoKTsKKyAgICAgICAgcGVyc29uID0gcmVzcG9uc2UucmVhZEVudGl0eShQZXJzb24uY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkpvaG4gRG9lIiwgcGVyc29uLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEFzeW5jKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldChQQVRIKS5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUxfVFlQRSkuYXN5bmMoKS5nZXQoKS5nZXQoKTsKKyAgICAgICAgUGVyc29uIHBlcnNvbiA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoUGVyc29uLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJKb2huIERvZSIsIHBlcnNvbi50b1N0cmluZygpKTsKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQoUEFUSCkucmVxdWVzdChNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFKS5hc3luYygpLmdldCgpLmdldCgpOworICAgICAgICBwZXJzb24gPSByZXNwb25zZS5yZWFkRW50aXR5KFBlcnNvbi5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiSm9obiBEb2UiLCBwZXJzb24udG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdCgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoUEFUSCkucmVxdWVzdChNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MX1RZUEUpLnBvc3QoRW50aXR5LnhtbChuZXcgUGVyc29uKCJKb2huIiwgIkRvZSIpKSk7CisgICAgICAgIFBlcnNvbiBwZXJzb24gPSByZXNwb25zZS5yZWFkRW50aXR5KFBlcnNvbi5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiSm9obiBEb2UiLCBwZXJzb24udG9TdHJpbmcoKSk7CisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KFBBVEgpLnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSkucG9zdChFbnRpdHkueG1sKG5ldyBQZXJzb24oIkpvaG4iLCAiRG9lIikpKTsKKyAgICAgICAgcGVyc29uID0gcmVzcG9uc2UucmVhZEVudGl0eShQZXJzb24uY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkpvaG4gRG9lIiwgcGVyc29uLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc3RBc3luYygpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoUEFUSCkucmVxdWVzdChNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MX1RZUEUpLmFzeW5jKCkKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkueG1sKG5ldyBQZXJzb24oIkpvaG4iLCAiRG9lIikpKS5nZXQoKTsKKyAgICAgICAgUGVyc29uIHBlcnNvbiA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoUGVyc29uLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJKb2huIERvZSIsIHBlcnNvbi50b1N0cmluZygpKTsKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQoUEFUSCkucmVxdWVzdChNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFKS5hc3luYygpLnBvc3QoRW50aXR5LnhtbChuZXcgUGVyc29uKCJKb2huIiwgIkRvZSIpKSkKKyAgICAgICAgICAgICAgICAuZ2V0KCk7CisgICAgICAgIHBlcnNvbiA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoUGVyc29uLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJKb2huIERvZSIsIHBlcnNvbi50b1N0cmluZygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2pldHR5LWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHR5L2Nvbm5lY3Rvci9FcnJvclRlc3QuamF2YSBiL2Nvbm5lY3RvcnMvamV0dHktY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamV0dHkvY29ubmVjdG9yL0Vycm9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MjVmNjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL2pldHR5LWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHR5L2Nvbm5lY3Rvci9FcnJvclRlc3QuamF2YQpAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0eS5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5DbGllbnRFcnJvckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgQXJ1bCBEaGVzaWFzZWVsYW4gKGFydWxkIGF0IGFjbS5vcmcpCisgKi8KK3B1YmxpYyBjbGFzcyBFcnJvclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEVycm9yVGVzdC5jbGFzcy5nZXROYW1lKCkpOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgUmVzb3VyY2VDb25maWcgY29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKEVycm9yUmVzb3VyY2UuY2xhc3MpOworICAgICAgICBjb25maWcucmVnaXN0ZXIobmV3IExvZ2dpbmdGZWF0dXJlKExPR0dFUiwgTG9nZ2luZ0ZlYXR1cmUuVmVyYm9zaXR5LlBBWUxPQURfQU5ZKSk7CisgICAgICAgIHJldHVybiBjb25maWc7CisgICAgfQorCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcuY29ubmVjdG9yUHJvdmlkZXIobmV3IEpldHR5Q29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgfQorCisKKyAgICBAUGF0aCgiL3Rlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXJyb3JSZXNvdXJjZSB7CisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBwb3N0KFN0cmluZyBlbnRpdHkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zZXJ2ZXJFcnJvcigpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiZW50aXR5IikKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHBvc3RXaXRoRW50aXR5KFN0cmluZyBlbnRpdHkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zZXJ2ZXJFcnJvcigpLmVudGl0eSgiZXJyb3IiKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdEVycm9yKCkgeworICAgICAgICBXZWJUYXJnZXQgciA9IHRhcmdldCgidGVzdCIpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgci5yZXF1ZXN0KCkucG9zdChFbnRpdHkudGV4dCgiUE9TVCIpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENsaWVudEVycm9yRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0RXJyb3JXaXRoRW50aXR5KCkgeworICAgICAgICBXZWJUYXJnZXQgciA9IHRhcmdldCgidGVzdCIpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyBpKyspIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgci5yZXF1ZXN0KCkucG9zdChFbnRpdHkudGV4dCgiUE9TVCIpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENsaWVudEVycm9yRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSBleC5nZXRSZXNwb25zZSgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImVycm9yIiwgcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0RXJyb3JBc3luYygpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHIgPSB0YXJnZXQoInRlc3QiKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgaSsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHIucmVxdWVzdCgpLmFzeW5jKCkucG9zdChFbnRpdHkudGV4dCgiUE9TVCIpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENsaWVudEVycm9yRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0RXJyb3JXaXRoRW50aXR5QXN5bmMoKSB7CisgICAgICAgIFdlYlRhcmdldCByID0gdGFyZ2V0KCJ0ZXN0Iik7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByLnJlcXVlc3QoKS5hc3luYygpLnBvc3QoRW50aXR5LnRleHQoIlBPU1QiKSk7CisgICAgICAgICAgICB9IGNhdGNoIChDbGllbnRFcnJvckV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBzID0gZXguZ2V0UmVzcG9uc2UoKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJlcnJvciIsIHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9qZXR0eS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0eS9jb25uZWN0b3IvRm9sbG93UmVkaXJlY3RzVGVzdC5qYXZhIGIvY29ubmVjdG9ycy9qZXR0eS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0eS9jb25uZWN0b3IvRm9sbG93UmVkaXJlY3RzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZGRhN2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL2pldHR5LWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHR5L2Nvbm5lY3Rvci9Gb2xsb3dSZWRpcmVjdHNUZXN0LmphdmEKQEAgLTAsMCArMSwxNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dHkuY29ubmVjdG9yOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlc3BvbnNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVzcG9uc2VGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UmVzcG9uc2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEpldHR5IGNvbm5lY3RvciBmb2xsb3cgcmVkaXJlY3QgdGVzdHMuCisgKgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKiBAYXV0aG9yIEFydWwgRGhlc2lhc2VlbGFuIChhcnVsZCBhdCBhY20ub3JnKQorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEZvbGxvd1JlZGlyZWN0c1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEZvbGxvd1JlZGlyZWN0c1Rlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIEBQYXRoKCIvdGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZWRpcmVjdFJlc291cmNlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiR0VUIjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInJlZGlyZWN0IikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHJlZGlyZWN0KCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnNlZU90aGVyKFVyaUJ1aWxkZXIuZnJvbVJlc291cmNlKFJlZGlyZWN0UmVzb3VyY2UuY2xhc3MpLmJ1aWxkKCkpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBSZXNvdXJjZUNvbmZpZyBjb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoUmVkaXJlY3RSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihuZXcgTG9nZ2luZ0ZlYXR1cmUoTE9HR0VSLCBMb2dnaW5nRmVhdHVyZS5WZXJib3NpdHkuUEFZTE9BRF9BTlkpKTsKKyAgICAgICAgcmV0dXJuIGNvbmZpZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcucHJvcGVydHkoQ2xpZW50UHJvcGVydGllcy5GT0xMT1dfUkVESVJFQ1RTLCBmYWxzZSk7CisgICAgICAgIGNvbmZpZy5jb25uZWN0b3JQcm92aWRlcihuZXcgSmV0dHlDb25uZWN0b3JQcm92aWRlcigpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSZWRpcmVjdFRlc3RGaWx0ZXIgaW1wbGVtZW50cyBDbGllbnRSZXNwb25zZUZpbHRlciB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09MVkVEX1VSSV9IRUFERVIgPSAicmVzb2x2ZWQtdXJpIjsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENsaWVudFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LCBDbGllbnRSZXNwb25zZUNvbnRleHQgcmVzcG9uc2VDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKHJlc3BvbnNlQ29udGV4dCBpbnN0YW5jZW9mIENsaWVudFJlc3BvbnNlKSB7CisgICAgICAgICAgICAgICAgQ2xpZW50UmVzcG9uc2UgY2xpZW50UmVzcG9uc2UgPSAoQ2xpZW50UmVzcG9uc2UpIHJlc3BvbnNlQ29udGV4dDsKKyAgICAgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuZ2V0SGVhZGVycygpLnB1dFNpbmdsZShSRVNPTFZFRF9VUklfSEVBREVSLCBjbGllbnRSZXNwb25zZS5nZXRSZXNvbHZlZFJlcXVlc3RVcmkoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERvRm9sbG93KCkgeworICAgICAgICBmaW5hbCBVUkkgdSA9IHRhcmdldCgpLmdldFVyaSgpOworICAgICAgICBDbGllbnRDb25maWcgY29uZmlnID0gbmV3IENsaWVudENvbmZpZygpLnByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuRk9MTE9XX1JFRElSRUNUUywgdHJ1ZSk7CisgICAgICAgIGNvbmZpZy5jb25uZWN0b3JQcm92aWRlcihuZXcgSmV0dHlDb25uZWN0b3JQcm92aWRlcigpKTsKKyAgICAgICAgQ2xpZW50IGMgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudChjb25maWcpOworICAgICAgICBXZWJUYXJnZXQgdCA9IGMudGFyZ2V0KHUpOworICAgICAgICBSZXNwb25zZSByID0gdC5wYXRoKCJ0ZXN0L3JlZGlyZWN0IikKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoUmVkaXJlY3RUZXN0RmlsdGVyLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHIuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCIsIHIucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKy8vIFRPRE8gdW5jb21tZW50IGFzIHBhcnQgb2YgSkVSU0VZLTIzODggZml4LgorLy8gICAgICAgIGFzc2VydEVxdWFscygKKy8vICAgICAgICAgICAgICAgIFVyaUJ1aWxkZXIuZnJvbVVyaShnZXRCYXNlVXJpKCkpLnBhdGgoUmVkaXJlY3RSZXNvdXJjZS5jbGFzcykuYnVpbGQoKS50b1N0cmluZygpLAorLy8gICAgICAgICAgICAgICAgci5nZXRIZWFkZXJTdHJpbmcoUmVkaXJlY3RUZXN0RmlsdGVyLlJFU09MVkVEX1VSSV9IRUFERVIpKTsKKworICAgICAgICBjLmNsb3NlKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG9Gb2xsb3dQZXJSZXF1ZXN0T3ZlcnJpZGUoKSB7CisgICAgICAgIFdlYlRhcmdldCB0ID0gdGFyZ2V0KCJ0ZXN0L3JlZGlyZWN0Iik7CisgICAgICAgIHQucHJvcGVydHkoQ2xpZW50UHJvcGVydGllcy5GT0xMT1dfUkVESVJFQ1RTLCB0cnVlKTsKKyAgICAgICAgUmVzcG9uc2UgciA9IHQucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJHRVQiLCByLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG9udEZvbGxvdygpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHQgPSB0YXJnZXQoInRlc3QvcmVkaXJlY3QiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMwMywgdC5yZXF1ZXN0KCkuZ2V0KCkuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERvbnRGb2xsb3dQZXJSZXF1ZXN0T3ZlcnJpZGUoKSB7CisgICAgICAgIGZpbmFsIFVSSSB1ID0gdGFyZ2V0KCkuZ2V0VXJpKCk7CisgICAgICAgIENsaWVudENvbmZpZyBjb25maWcgPSBuZXcgQ2xpZW50Q29uZmlnKCkucHJvcGVydHkoQ2xpZW50UHJvcGVydGllcy5GT0xMT1dfUkVESVJFQ1RTLCB0cnVlKTsKKyAgICAgICAgY29uZmlnLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBKZXR0eUNvbm5lY3RvclByb3ZpZGVyKCkpOworICAgICAgICBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoY29uZmlnKTsKKyAgICAgICAgV2ViVGFyZ2V0IHQgPSBjbGllbnQudGFyZ2V0KHUpOworICAgICAgICB0LnByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuRk9MTE9XX1JFRElSRUNUUywgZmFsc2UpOworICAgICAgICBSZXNwb25zZSByID0gdC5wYXRoKCJ0ZXN0L3JlZGlyZWN0IikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMzAzLCByLmdldFN0YXR1cygpKTsKKyAgICAgICAgY2xpZW50LmNsb3NlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9qZXR0eS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0eS9jb25uZWN0b3IvR1pJUENvbnRlbnRFbmNvZGluZ1Rlc3QuamF2YSBiL2Nvbm5lY3RvcnMvamV0dHktY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamV0dHkvY29ubmVjdG9yL0daSVBDb250ZW50RW5jb2RpbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVjYjBhYQotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvamV0dHktY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamV0dHkvY29ubmVjdG9yL0daSVBDb250ZW50RW5jb2RpbmdUZXN0LmphdmEKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dHkuY29ubmVjdG9yOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuR1ppcEVuY29kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBBcnVsIERoZXNpYXNlZWxhbiAoYXJ1bGQgYXQgYWNtLm9yZykKKyAqLworcHVibGljIGNsYXNzIEdaSVBDb250ZW50RW5jb2RpbmdUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihFbnRpdHlUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIGJ5dGVbXSBwb3N0KGJ5dGVbXSBjb250ZW50KSB7CisgICAgICAgICAgICByZXR1cm4gY29udGVudDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIFJlc291cmNlQ29uZmlnIGNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihuZXcgTG9nZ2luZ0ZlYXR1cmUoTE9HR0VSLCBMb2dnaW5nRmVhdHVyZS5WZXJib3NpdHkuUEFZTE9BRF9BTlkpKTsKKyAgICAgICAgcmV0dXJuIGNvbmZpZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcucmVnaXN0ZXIoR1ppcEVuY29kZXIuY2xhc3MpOworICAgICAgICBjb25maWcuY29ubmVjdG9yUHJvdmlkZXIobmV3IEpldHR5Q29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdCgpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHIgPSB0YXJnZXQoKTsKKyAgICAgICAgYnl0ZVtdIGNvbnRlbnQgPSBuZXcgYnl0ZVsxMDI0ICogMTAyNF07CisgICAgICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhjb250ZW50LAorICAgICAgICAgICAgICAgIHIucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShjb250ZW50LCBNZWRpYVR5cGUuQVBQTElDQVRJT05fT0NURVRfU1RSRUFNX1RZUEUpKS5yZWFkRW50aXR5KGJ5dGVbXS5jbGFzcykpKTsKKworICAgICAgICBSZXNwb25zZSBjciA9IHIucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShjb250ZW50LCBNZWRpYVR5cGUuQVBQTElDQVRJT05fT0NURVRfU1RSRUFNX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjci5oYXNFbnRpdHkoKSk7CisgICAgICAgIGNyLmNsb3NlKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdENodW5rZWQoKSB7CisgICAgICAgIENsaWVudENvbmZpZyBjb25maWcgPSBuZXcgQ2xpZW50Q29uZmlnKCk7CisgICAgICAgIGNvbmZpZy5wcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLkNIVU5LRURfRU5DT0RJTkdfU0laRSwgMTAyNCk7CisgICAgICAgIGNvbmZpZy5jb25uZWN0b3JQcm92aWRlcihuZXcgSmV0dHlDb25uZWN0b3JQcm92aWRlcigpKTsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKG5ldyBMb2dnaW5nRmVhdHVyZShMT0dHRVIsIExvZ2dpbmdGZWF0dXJlLlZlcmJvc2l0eS5QQVlMT0FEX0FOWSkpOworCisgICAgICAgIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudChjb25maWcpOworICAgICAgICBXZWJUYXJnZXQgciA9IGNsaWVudC50YXJnZXQoZ2V0QmFzZVVyaSgpKTsKKworICAgICAgICBieXRlW10gY29udGVudCA9IG5ldyBieXRlWzEwMjQgKiAxMDI0XTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGNvbnRlbnQsCisgICAgICAgICAgICAgICAgci5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KGNvbnRlbnQsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9PQ1RFVF9TVFJFQU1fVFlQRSkpLnJlYWRFbnRpdHkoYnl0ZVtdLmNsYXNzKSkpOworCisgICAgICAgIFJlc3BvbnNlIGNyID0gci5yZXF1ZXN0KCkucG9zdChFbnRpdHkudGV4dCgiUE9TVCIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjci5oYXNFbnRpdHkoKSk7CisgICAgICAgIGNyLmNsb3NlKCk7CisKKyAgICAgICAgY2xpZW50LmNsb3NlKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2pldHR5LWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHR5L2Nvbm5lY3Rvci9IZWxsb1dvcmxkVGVzdC5qYXZhIGIvY29ubmVjdG9ycy9qZXR0eS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0eS9jb25uZWN0b3IvSGVsbG9Xb3JsZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzcwNjc1Ci0tLSAvZGV2L251bGwKKysrIGIvY29ubmVjdG9ycy9qZXR0eS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0eS9jb25uZWN0b3IvSGVsbG9Xb3JsZFRlc3QuamF2YQpAQCAtMCwwICsxLDIyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0eS5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5JbnZvY2F0aW9uQ2FsbGJhY2s7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEhlbGxvV29ybGRUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RfUEFUSCA9ICJoZWxsb3dvcmxkIjsKKworICAgIEBQYXRoKCJoZWxsb3dvcmxkIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEhlbGxvV29ybGRSZXNvdXJjZSB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMSUNIRURfTUVTU0FHRSA9ICJIZWxsbyBXb3JsZCEiOworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRIZWxsbygpIHsKKyAgICAgICAgICAgIHJldHVybiBDTElDSEVEX01FU1NBR0U7CisgICAgICAgIH0KKworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIFJlc291cmNlQ29uZmlnIGNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhIZWxsb1dvcmxkUmVzb3VyY2UuY2xhc3MpOworICAgICAgICBjb25maWcucmVnaXN0ZXIobmV3IExvZ2dpbmdGZWF0dXJlKExPR0dFUiwgTG9nZ2luZ0ZlYXR1cmUuVmVyYm9zaXR5LlBBWUxPQURfQU5ZKSk7CisgICAgICAgIHJldHVybiBjb25maWc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuQVNZTkNfVEhSRUFEUE9PTF9TSVpFLCAyMCk7CisgICAgICAgIGNvbmZpZy5jb25uZWN0b3JQcm92aWRlcihuZXcgSmV0dHlDb25uZWN0b3JQcm92aWRlcigpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25uZWN0aW9uKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoUk9PVF9QQVRIKS5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbGllbnRTdHJpbmdSZXNwb25zZSgpIHsKKyAgICAgICAgU3RyaW5nIHMgPSB0YXJnZXQoKS5wYXRoKFJPT1RfUEFUSCkucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoSGVsbG9Xb3JsZFJlc291cmNlLkNMSUNIRURfTUVTU0FHRSwgcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNDbGllbnRSZXF1ZXN0cygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGludCBSRVFVRVNUUyA9IDIwOworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaChSRVFVRVNUUyk7CisgICAgICAgIGZpbmFsIGxvbmcgdGljID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUkVRVUVTVFM7IGkrKykgeworICAgICAgICAgICAgZmluYWwgaW50IGlkID0gaTsKKyAgICAgICAgICAgIHRhcmdldCgpLnBhdGgoUk9PVF9QQVRIKS5yZXF1ZXN0KCkuYXN5bmMoKS5nZXQobmV3IEludm9jYXRpb25DYWxsYmFjazxSZXNwb25zZT4oKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY29tcGxldGVkKFJlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVzdWx0ID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEhlbGxvV29ybGRSZXNvdXJjZS5DTElDSEVEX01FU1NBR0UsIHJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZhaWxlZChUaHJvd2FibGUgZXJyb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3IucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICAgIGxhdGNoLmF3YWl0KDEwICogZ2V0QXN5bmNUaW1lb3V0TXVsdGlwbGllcigpLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgICAgZmluYWwgbG9uZyB0b2MgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihIZWxsb1dvcmxkVGVzdC5jbGFzcy5nZXROYW1lKCkpLmluZm8oIkV4ZWN1dGVkIGluOiAiICsgKHRvYyAtIHRpYykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhlYWQoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aChST09UX1BBVEgpLnJlcXVlc3QoKS5oZWFkKCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGb29CYXJPcHRpb25zKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoUk9PVF9QQVRIKS5yZXF1ZXN0KCkuaGVhZGVyKCJBY2NlcHQiLCAiZm9vL2JhciIpLm9wdGlvbnMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBmaW5hbCBTdHJpbmcgYWxsb3dIZWFkZXIgPSByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIkFsbG93Iik7CisgICAgICAgIF9jaGVja0FsbG93Q29udGVudChhbGxvd0hlYWRlcik7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9vL2JhciIsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcmVzcG9uc2UuZ2V0TGVuZ3RoKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRleHRQbGFpbk9wdGlvbnMoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aChST09UX1BBVEgpLnJlcXVlc3QoKS5oZWFkZXIoIkFjY2VwdCIsIE1lZGlhVHlwZS5URVhUX1BMQUlOKS5vcHRpb25zKCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGFsbG93SGVhZGVyID0gcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJBbGxvdyIpOworICAgICAgICBfY2hlY2tBbGxvd0NvbnRlbnQoYWxsb3dIZWFkZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSwgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkpOworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzcG9uc2VCb2R5ID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBfY2hlY2tBbGxvd0NvbnRlbnQocmVzcG9uc2VCb2R5KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX2NoZWNrQWxsb3dDb250ZW50KGZpbmFsIFN0cmluZyBjb250ZW50KSB7CisgICAgICAgIGFzc2VydFRydWUoY29udGVudC5jb250YWlucygiR0VUIikpOworICAgICAgICBhc3NlcnRUcnVlKGNvbnRlbnQuY29udGFpbnMoIkhFQUQiKSk7CisgICAgICAgIGFzc2VydFRydWUoY29udGVudC5jb250YWlucygiT1BUSU9OUyIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNaXNzaW5nUmVzb3VyY2VOb3RGb3VuZCgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2U7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKFJPT1RfUEFUSCArICJhcmJpdHJhcnkiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDQsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgcmVzcG9uc2UuY2xvc2UoKTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoUk9PVF9QQVRIKS5wYXRoKCJhcmJpdHJhcnkiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDQsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgcmVzcG9uc2UuY2xvc2UoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb2dnaW5nRmlsdGVyQ2xpZW50Q2xhc3MoKSB7CisgICAgICAgIENsaWVudCBjbGllbnQgPSBjbGllbnQoKTsKKyAgICAgICAgY2xpZW50LnJlZ2lzdGVyKEN1c3RvbUxvZ2dpbmdGaWx0ZXIuY2xhc3MpLnByb3BlcnR5KCJmb28iLCAiYmFyIik7CisgICAgICAgIEN1c3RvbUxvZ2dpbmdGaWx0ZXIucHJlRmlsdGVyQ2FsbGVkID0gQ3VzdG9tTG9nZ2luZ0ZpbHRlci5wb3N0RmlsdGVyQ2FsbGVkID0gMDsKKyAgICAgICAgU3RyaW5nIHMgPSB0YXJnZXQoKS5wYXRoKFJPT1RfUEFUSCkucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoSGVsbG9Xb3JsZFJlc291cmNlLkNMSUNIRURfTUVTU0FHRSwgcyk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBDdXN0b21Mb2dnaW5nRmlsdGVyLnByZUZpbHRlckNhbGxlZCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBDdXN0b21Mb2dnaW5nRmlsdGVyLnBvc3RGaWx0ZXJDYWxsZWQpOworICAgICAgICBjbGllbnQuY2xvc2UoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb2dnaW5nRmlsdGVyQ2xpZW50SW5zdGFuY2UoKSB7CisgICAgICAgIENsaWVudCBjbGllbnQgPSBjbGllbnQoKTsKKyAgICAgICAgY2xpZW50LnJlZ2lzdGVyKG5ldyBDdXN0b21Mb2dnaW5nRmlsdGVyKCkpLnByb3BlcnR5KCJmb28iLCAiYmFyIik7CisgICAgICAgIEN1c3RvbUxvZ2dpbmdGaWx0ZXIucHJlRmlsdGVyQ2FsbGVkID0gQ3VzdG9tTG9nZ2luZ0ZpbHRlci5wb3N0RmlsdGVyQ2FsbGVkID0gMDsKKyAgICAgICAgU3RyaW5nIHMgPSB0YXJnZXQoKS5wYXRoKFJPT1RfUEFUSCkucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoSGVsbG9Xb3JsZFJlc291cmNlLkNMSUNIRURfTUVTU0FHRSwgcyk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBDdXN0b21Mb2dnaW5nRmlsdGVyLnByZUZpbHRlckNhbGxlZCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBDdXN0b21Mb2dnaW5nRmlsdGVyLnBvc3RGaWx0ZXJDYWxsZWQpOworICAgICAgICBjbGllbnQuY2xvc2UoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb2dnaW5nRmlsdGVyVGFyZ2V0Q2xhc3MoKSB7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKS5wYXRoKFJPT1RfUEFUSCk7CisgICAgICAgIHRhcmdldC5yZWdpc3RlcihDdXN0b21Mb2dnaW5nRmlsdGVyLmNsYXNzKS5wcm9wZXJ0eSgiZm9vIiwgImJhciIpOworICAgICAgICBDdXN0b21Mb2dnaW5nRmlsdGVyLnByZUZpbHRlckNhbGxlZCA9IEN1c3RvbUxvZ2dpbmdGaWx0ZXIucG9zdEZpbHRlckNhbGxlZCA9IDA7CisgICAgICAgIFN0cmluZyBzID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEhlbGxvV29ybGRSZXNvdXJjZS5DTElDSEVEX01FU1NBR0UsIHMpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgQ3VzdG9tTG9nZ2luZ0ZpbHRlci5wcmVGaWx0ZXJDYWxsZWQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgQ3VzdG9tTG9nZ2luZ0ZpbHRlci5wb3N0RmlsdGVyQ2FsbGVkKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb2dnaW5nRmlsdGVyVGFyZ2V0SW5zdGFuY2UoKSB7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKS5wYXRoKFJPT1RfUEFUSCk7CisgICAgICAgIHRhcmdldC5yZWdpc3RlcihuZXcgQ3VzdG9tTG9nZ2luZ0ZpbHRlcigpKS5wcm9wZXJ0eSgiZm9vIiwgImJhciIpOworICAgICAgICBDdXN0b21Mb2dnaW5nRmlsdGVyLnByZUZpbHRlckNhbGxlZCA9IEN1c3RvbUxvZ2dpbmdGaWx0ZXIucG9zdEZpbHRlckNhbGxlZCA9IDA7CisgICAgICAgIFN0cmluZyBzID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEhlbGxvV29ybGRSZXNvdXJjZS5DTElDSEVEX01FU1NBR0UsIHMpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgQ3VzdG9tTG9nZ2luZ0ZpbHRlci5wcmVGaWx0ZXJDYWxsZWQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgQ3VzdG9tTG9nZ2luZ0ZpbHRlci5wb3N0RmlsdGVyQ2FsbGVkKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25maWd1cmF0aW9uVXBkYXRlKCkgeworICAgICAgICBDbGllbnQgY2xpZW50MSA9IGNsaWVudCgpOworICAgICAgICBjbGllbnQxLnJlZ2lzdGVyKEN1c3RvbUxvZ2dpbmdGaWx0ZXIuY2xhc3MpLnByb3BlcnR5KCJmb28iLCAiYmFyIik7CisKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KGNsaWVudDEuZ2V0Q29uZmlndXJhdGlvbigpKTsKKyAgICAgICAgQ3VzdG9tTG9nZ2luZ0ZpbHRlci5wcmVGaWx0ZXJDYWxsZWQgPSBDdXN0b21Mb2dnaW5nRmlsdGVyLnBvc3RGaWx0ZXJDYWxsZWQgPSAwOworICAgICAgICBTdHJpbmcgcyA9IHRhcmdldCgpLnBhdGgoUk9PVF9QQVRIKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhIZWxsb1dvcmxkUmVzb3VyY2UuQ0xJQ0hFRF9NRVNTQUdFLCBzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIEN1c3RvbUxvZ2dpbmdGaWx0ZXIucHJlRmlsdGVyQ2FsbGVkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIEN1c3RvbUxvZ2dpbmdGaWx0ZXIucG9zdEZpbHRlckNhbGxlZCk7CisgICAgICAgIGNsaWVudC5jbG9zZSgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9qZXR0eS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0eS9jb25uZWN0b3IvSHR0cEhlYWRlcnNUZXN0LmphdmEgYi9jb25uZWN0b3JzL2pldHR5LWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHR5L2Nvbm5lY3Rvci9IdHRwSGVhZGVyc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmUzZWM4Ci0tLSAvZGV2L251bGwKKysrIGIvY29ubmVjdG9ycy9qZXR0eS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0eS9jb25uZWN0b3IvSHR0cEhlYWRlcnNUZXN0LmphdmEKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dHkuY29ubmVjdG9yOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLkhlYWRlclBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKworLyoqCisgKiBUZXN0cyB0aGUgaGVhZGVycy4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBLb3ByaXZhCisgKi8KK3B1YmxpYyBjbGFzcyBIdHRwSGVhZGVyc1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEh0dHBIZWFkZXJzVGVzdC5jbGFzcy5nZXROYW1lKCkpOworCisgICAgQFBhdGgoIi90ZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEh0dHBNZXRob2RSZXNvdXJjZSB7CisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdCgKKyAgICAgICAgICAgICAgICBASGVhZGVyUGFyYW0oIlRyYW5zZmVyLUVuY29kaW5nIikgU3RyaW5nIHRyYW5zZmVyRW5jb2RpbmcsCisgICAgICAgICAgICAgICAgQEhlYWRlclBhcmFtKCJYLUNMSUVOVCIpIFN0cmluZyB4Q2xpZW50LAorICAgICAgICAgICAgICAgIEBIZWFkZXJQYXJhbSgiWC1XUklURVIiKSBTdHJpbmcgeFdyaXRlciwKKyAgICAgICAgICAgICAgICBTdHJpbmcgZW50aXR5KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImNsaWVudCIsIHhDbGllbnQpOworICAgICAgICAgICAgcmV0dXJuICJQT1NUIjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyB0ZXN0VXNlckFnZW50KEBDb250ZXh0IEh0dHBIZWFkZXJzIGh0dHBIZWFkZXJzKSB7CisgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcmVxdWVzdEhlYWRlciA9IGh0dHBIZWFkZXJzLmdldFJlcXVlc3RIZWFkZXIoSHR0cEhlYWRlcnMuVVNFUl9BR0VOVCk7CisgICAgICAgICAgICBpZiAocmVxdWVzdEhlYWRlci5zaXplKCkgIT0gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiAiRkFJTCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVxdWVzdEhlYWRlci5nZXQoMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBSZXNvdXJjZUNvbmZpZyBjb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoSHR0cE1ldGhvZFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKG5ldyBMb2dnaW5nRmVhdHVyZShMT0dHRVIsIExvZ2dpbmdGZWF0dXJlLlZlcmJvc2l0eS5QQVlMT0FEX0FOWSkpOworICAgICAgICByZXR1cm4gY29uZmlnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5jb25uZWN0b3JQcm92aWRlcihuZXcgSmV0dHlDb25uZWN0b3JQcm92aWRlcigpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0KCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInRlc3QiKS5yZXF1ZXN0KCkuaGVhZGVyKCJYLUNMSUVOVCIsICJjbGllbnQiKS5wb3N0KG51bGwpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5oYXNFbnRpdHkoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCwgdGhhdCB7QGNvZGUgVXNlci1hZ2VudH0gaGVhZGVyIGlzIGFzIHNldCBieSBKZXJzZXksIG5vdCBieSB1bmRlcmx5aW5nIEpldHR5IGNsaWVudC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVc2VyQWdlbnQoKSB7CisgICAgICAgIFN0cmluZyByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInRlc3QiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRydWUoIlVzZXItYWdlbnQgaGVhZGVyIHNob3VsZCBzdGFydCB3aXRoICdKZXJzZXknLCBidXQgd2FzICIgKyByZXNwb25zZSwgcmVzcG9uc2Uuc3RhcnRzV2l0aCgiSmVyc2V5IikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvamV0dHktY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamV0dHkvY29ubmVjdG9yL01hbmFnZWRDbGllbnRUZXN0LmphdmEgYi9jb25uZWN0b3JzL2pldHR5LWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHR5L2Nvbm5lY3Rvci9NYW5hZ2VkQ2xpZW50VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMWNlNjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL2pldHR5LWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHR5L2Nvbm5lY3Rvci9NYW5hZ2VkQ2xpZW50VGVzdC5qYXZhCkBAIC0wLDAgKzEsMjU2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHR5LmNvbm5lY3RvcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkR5bmFtaWNGZWF0dXJlOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5SZXNvdXJjZUluZm87CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmVDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNsaWVudEJpbmRpbmc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Vcmk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEplcnNleSBwcm9ncmFtbWF0aWMgbWFuYWdlZCBjbGllbnQgdGVzdAorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBNYW5hZ2VkQ2xpZW50VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoTWFuYWdlZENsaWVudFRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIC8qKgorICAgICAqIE1hbmFnZWQgY2xpZW50IGNvbmZpZ3VyYXRpb24gZm9yIGNsaWVudCBBLgorICAgICAqLworICAgIEBDbGllbnRCaW5kaW5nKGNvbmZpZ0NsYXNzID0gTXlDbGllbnRBQ29uZmlnLmNsYXNzKQorICAgIEBEb2N1bWVudGVkCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgICBAVGFyZ2V0KHtFbGVtZW50VHlwZS5GSUVMRCwgRWxlbWVudFR5cGUuUEFSQU1FVEVSfSkKKyAgICBwdWJsaWMgc3RhdGljIEBpbnRlcmZhY2UgQ2xpZW50QSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFuYWdlZCBjbGllbnQgY29uZmlndXJhdGlvbiBmb3IgY2xpZW50IEIuCisgICAgICovCisgICAgQENsaWVudEJpbmRpbmcoY29uZmlnQ2xhc3MgPSBNeUNsaWVudEJDb25maWcuY2xhc3MpCisgICAgQERvY3VtZW50ZWQKKyAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorICAgIEBUYXJnZXQoe0VsZW1lbnRUeXBlLkZJRUxELCBFbGVtZW50VHlwZS5QQVJBTUVURVJ9KQorICAgIHB1YmxpYyBAaW50ZXJmYWNlIENsaWVudEIgeworICAgIH0KKworICAgIC8qKgorICAgICAqIER5bmFtaWMgZmVhdHVyZSB0aGF0IGFwcGVuZHMgYSBwcm9wZXJseSBjb25maWd1cmVkIHtAbGluayBDdXN0b21IZWFkZXJGaWx0ZXJ9IGluc3RhbmNlCisgICAgICogdG8gZXZlcnkgbWV0aG9kIHRoYXQgaXMgYW5ub3RhdGVkIHdpdGgge0BsaW5rIFJlcXVpcmUgJiM2NDtSZXF1aXJlfSBpbnRlcm5hbCBmZWF0dXJlCisgICAgICogYW5ub3RhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEN1c3RvbUhlYWRlckZlYXR1cmUgaW1wbGVtZW50cyBEeW5hbWljRmVhdHVyZSB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEEgbWV0aG9kIGFubm90YXRpb24gdG8gYmUgcGxhY2VkIG9uIHRob3NlIHJlc291cmNlIG1ldGhvZHMgdG8gd2hpY2ggYSB2YWxpZGF0aW5nCisgICAgICAgICAqIHtAbGluayBDdXN0b21IZWFkZXJGaWx0ZXJ9IGluc3RhbmNlIHNob3VsZCBiZSBhZGRlZC4KKyAgICAgICAgICovCisgICAgICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCisgICAgICAgIEBEb2N1bWVudGVkCisgICAgICAgIEBUYXJnZXQoRWxlbWVudFR5cGUuTUVUSE9EKQorICAgICAgICBwdWJsaWMgc3RhdGljIEBpbnRlcmZhY2UgUmVxdWlyZSB7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogRXhwZWN0ZWQgY3VzdG9tIGhlYWRlciBuYW1lIHRvIGJlIHZhbGlkYXRlZCBieSB0aGUge0BsaW5rIEN1c3RvbUhlYWRlckZpbHRlcn0uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgaGVhZGVyTmFtZSgpOworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIEV4cGVjdGVkIGN1c3RvbSBoZWFkZXIgdmFsdWUgdG8gYmUgdmFsaWRhdGVkIGJ5IHRoZSB7QGxpbmsgQ3VzdG9tSGVhZGVyRmlsdGVyfS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIFN0cmluZyBoZWFkZXJWYWx1ZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShSZXNvdXJjZUluZm8gcmVzb3VyY2VJbmZvLCBGZWF0dXJlQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBmaW5hbCBSZXF1aXJlIHZhID0gcmVzb3VyY2VJbmZvLmdldFJlc291cmNlTWV0aG9kKCkuZ2V0QW5ub3RhdGlvbihSZXF1aXJlLmNsYXNzKTsKKyAgICAgICAgICAgIGlmICh2YSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihuZXcgQ3VzdG9tSGVhZGVyRmlsdGVyKHZhLmhlYWRlck5hbWUoKSwgdmEuaGVhZGVyVmFsdWUoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBmaWx0ZXIgZm9yIGFwcGVuZGluZyBhbmQgdmFsaWRhdGluZyBjdXN0b20gaGVhZGVycy4KKyAgICAgKiA8cD4KKyAgICAgKiBPbiB0aGUgY2xpZW50IHNpZGUsIGFwcGVuZHMgYSBuZXcgY3VzdG9tIHJlcXVlc3QgaGVhZGVyIHdpdGggYSBjb25maWd1cmVkIG5hbWUgYW5kIHZhbHVlIHRvIGVhY2ggb3V0Z29pbmcgcmVxdWVzdC4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogT24gdGhlIHNlcnZlciBzaWRlLCB2YWxpZGF0ZXMgdGhhdCBlYWNoIHJlcXVlc3QgaGFzIGEgY3VzdG9tIGhlYWRlciB3aXRoIGEgY29uZmlndXJlZCBuYW1lIGFuZCB2YWx1ZS4KKyAgICAgKiBJZiB0aGUgdmFsaWRhdGlvbiBmYWlscyBhIEhUVFAgNDAzIHJlc3BvbnNlIGlzIHJldHVybmVkLgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEN1c3RvbUhlYWRlckZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIsIENsaWVudFJlcXVlc3RGaWx0ZXIgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGhlYWRlck5hbWU7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGhlYWRlclZhbHVlOworCisgICAgICAgIHB1YmxpYyBDdXN0b21IZWFkZXJGaWx0ZXIoU3RyaW5nIGhlYWRlck5hbWUsIFN0cmluZyBoZWFkZXJWYWx1ZSkgeworICAgICAgICAgICAgaWYgKGhlYWRlck5hbWUgPT0gbnVsbCB8fCBoZWFkZXJWYWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSGVhZGVyIG5hbWUgYW5kIHZhbHVlIG11c3Qgbm90IGJlIG51bGwuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLmhlYWRlck5hbWUgPSBoZWFkZXJOYW1lOworICAgICAgICAgICAgdGhpcy5oZWFkZXJWYWx1ZSA9IGhlYWRlclZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCBjdHgpIHRocm93cyBJT0V4Y2VwdGlvbiB7IC8vIHZhbGlkYXRlCisgICAgICAgICAgICBpZiAoIWhlYWRlclZhbHVlLmVxdWFscyhjdHguZ2V0SGVhZGVyU3RyaW5nKGhlYWRlck5hbWUpKSkgeworICAgICAgICAgICAgICAgIGN0eC5hYm9ydFdpdGgoUmVzcG9uc2Uuc3RhdHVzKFJlc3BvbnNlLlN0YXR1cy5GT1JCSURERU4pCisgICAgICAgICAgICAgICAgICAgICAgICAudHlwZShNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5lbnRpdHkoU3RyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mb3JtYXQoIkV4cGVjdGVkIGhlYWRlciAnJXMnIG5vdCBwcmVzZW50IG9yIHZhbHVlIG5vdCBlcXVhbCB0byAnJXMnIiwgaGVhZGVyTmFtZSwgaGVhZGVyVmFsdWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDbGllbnRSZXF1ZXN0Q29udGV4dCBjdHgpIHRocm93cyBJT0V4Y2VwdGlvbiB7IC8vIGFwcGVuZAorICAgICAgICAgICAgY3R4LmdldEhlYWRlcnMoKS5wdXRTaW5nbGUoaGVhZGVyTmFtZSwgaGVhZGVyVmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJuYWwgcmVzb3VyY2UgYWNjZXNzZWQgZnJvbSB0aGUgbWFuYWdlZCBjbGllbnQgcmVzb3VyY2UuCisgICAgICovCisgICAgQFBhdGgoImludGVybmFsIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEludGVybmFsUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImEiKQorICAgICAgICBAQ3VzdG9tSGVhZGVyRmVhdHVyZS5SZXF1aXJlKGhlYWRlck5hbWUgPSAiY3VzdG9tLWhlYWRlciIsIGhlYWRlclZhbHVlID0gImEiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEEoKSB7CisgICAgICAgICAgICByZXR1cm4gImEiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiYiIpCisgICAgICAgIEBDdXN0b21IZWFkZXJGZWF0dXJlLlJlcXVpcmUoaGVhZGVyTmFtZSA9ICJjdXN0b20taGVhZGVyIiwgaGVhZGVyVmFsdWUgPSAiYiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QigpIHsKKyAgICAgICAgICAgIHJldHVybiAiYiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHJlc291cmNlIHRoYXQgdXNlcyBtYW5hZ2VkIGNsaWVudHMgdG8gcmV0cmlldmUgdmFsdWVzIG9mIGludGVybmFsCisgICAgICogcmVzb3VyY2VzICdBJyBhbmQgJ0InLCB3aGljaCBhcmUgcHJvdGVjdGVkIGJ5IGEge0BsaW5rIEN1c3RvbUhlYWRlckZpbHRlcn0KKyAgICAgKiBhbmQgcmVxdWlyZSBhIHNwZWNpZmljIGN1c3RvbSBoZWFkZXIgaW4gYSByZXF1ZXN0IHRvIGJlIHNldCB0byBhIHNwZWNpZmljIHZhbHVlLgorICAgICAqIDxwPgorICAgICAqIFByb3Blcmx5IGNvbmZpZ3VyZWQgbWFuYWdlZCBjbGllbnRzIGhhdmUgYSB7QGNvZGUgQ3VzdG9tSGVhZGVyRmlsdGVyfSBpbnN0YW5jZQorICAgICAqIGNvbmZpZ3VyZWQgdG8gaW5zZXJ0IHRoZSB7QGxpbmsgQ3VzdG9tSGVhZGVyRmVhdHVyZS5SZXF1aXJlIHJlcXVpcmVkfSBjdXN0b20gaGVhZGVyCisgICAgICogd2l0aCBhIHByb3BlciB2YWx1ZSBpbnRvIHRoZSBvdXRnb2luZyBjbGllbnQgcmVxdWVzdHMuCisgICAgICogPC9wPgorICAgICAqLworICAgIEBQYXRoKCJwdWJsaWMiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHVibGljUmVzb3VyY2UgeworCisgICAgICAgIEBVcmkoImEiKQorICAgICAgICBAQ2xpZW50QSAvLyByZXNvbHZlcyB0byA8YmFzZT4vaW50ZXJuYWwvYQorICAgICAgICBwcml2YXRlIFdlYlRhcmdldCB0YXJnZXRBOworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgQFBhdGgoImEiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRhcmdldEEoKSB7CisgICAgICAgICAgICByZXR1cm4gdGFyZ2V0QS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgQFBhdGgoImIiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0VGFyZ2V0QihAVXJpKCJpbnRlcm5hbC9iIikgQENsaWVudEIgV2ViVGFyZ2V0IHRhcmdldEIpIHsKKyAgICAgICAgICAgIHJldHVybiB0YXJnZXRCLnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfUExBSU4pLmdldCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgUmVzb3VyY2VDb25maWcgY29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKFB1YmxpY1Jlc291cmNlLmNsYXNzLCBJbnRlcm5hbFJlc291cmNlLmNsYXNzLCBDdXN0b21IZWFkZXJGZWF0dXJlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShDbGllbnRBLmNsYXNzLmdldE5hbWUoKSArICIuYmFzZVVyaSIsIHRoaXMuZ2V0QmFzZVVyaSgpLnRvU3RyaW5nKCkgKyAiaW50ZXJuYWwiKTsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKG5ldyBMb2dnaW5nRmVhdHVyZShMT0dHRVIsIExvZ2dpbmdGZWF0dXJlLlZlcmJvc2l0eS5QQVlMT0FEX0FOWSkpOworICAgICAgICByZXR1cm4gY29uZmlnOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlDbGllbnRBQ29uZmlnIGV4dGVuZHMgQ2xpZW50Q29uZmlnIHsKKworICAgICAgICBwdWJsaWMgTXlDbGllbnRBQ29uZmlnKCkgeworICAgICAgICAgICAgdGhpcy5yZWdpc3RlcihuZXcgQ3VzdG9tSGVhZGVyRmlsdGVyKCJjdXN0b20taGVhZGVyIiwgImEiKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15Q2xpZW50QkNvbmZpZyBleHRlbmRzIENsaWVudENvbmZpZyB7CisKKyAgICAgICAgcHVibGljIE15Q2xpZW50QkNvbmZpZygpIHsKKyAgICAgICAgICAgIHRoaXMucmVnaXN0ZXIobmV3IEN1c3RvbUhlYWRlckZpbHRlcigiY3VzdG9tLWhlYWRlciIsICJiIikpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBKZXR0eUNvbm5lY3RvclByb3ZpZGVyKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCBhIGNvbm5lY3Rpb24gdmlhIG1hbmFnZWQgY2xpZW50cyB3b3JrcyBwcm9wZXJseS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGluIGNhc2Ugb2YgdGVzdCBmYWlsdXJlLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hbmFnZWRDbGllbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHJlc291cmNlID0gdGFyZ2V0KCkucGF0aCgicHVibGljIikucGF0aCgie25hbWV9Iik7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlOworCisgICAgICAgIHJlc3BvbnNlID0gcmVzb3VyY2UucmVzb2x2ZVRlbXBsYXRlKCJuYW1lIiwgImEiKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworCisgICAgICAgIHJlc3BvbnNlID0gcmVzb3VyY2UucmVzb2x2ZVRlbXBsYXRlKCJuYW1lIiwgImIiKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImIiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9qZXR0eS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0eS9jb25uZWN0b3IvTWV0aG9kVGVzdC5qYXZhIGIvY29ubmVjdG9ycy9qZXR0eS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0eS9jb25uZWN0b3IvTWV0aG9kVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MzkzZWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL2pldHR5LWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHR5L2Nvbm5lY3Rvci9NZXRob2RUZXN0LmphdmEKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dHkuY29ubmVjdG9yOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkRFTEVURTsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUEFUQ0g7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QVVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3RzIHRoZSBIdHRwIG1ldGhvZHMuCisgKgorICogQGF1dGhvciBTdGVwYW4gS29wcml2YQorICogQGF1dGhvciBBcnVsIERoZXNpYXNlZWxhbiAoYXJ1bGQgYXQgYWNtLm9yZykKKyAqLworcHVibGljIGNsYXNzIE1ldGhvZFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKE1ldGhvZFRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIID0gInRlc3QiOworCisgICAgQFBhdGgoIi90ZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEh0dHBNZXRob2RSZXNvdXJjZSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gIkdFVCI7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3QoU3RyaW5nIGVudGl0eSkgeworICAgICAgICAgICAgcmV0dXJuIGVudGl0eTsKKyAgICAgICAgfQorCisgICAgICAgIEBQVVQKKyAgICAgICAgcHVibGljIFN0cmluZyBwdXQoU3RyaW5nIGVudGl0eSkgeworICAgICAgICAgICAgcmV0dXJuIGVudGl0eTsKKyAgICAgICAgfQorCisgICAgICAgIEBQQVRDSAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBhdGNoKFN0cmluZyBlbnRpdHkpIHsKKyAgICAgICAgICAgIHJldHVybiBlbnRpdHk7CisgICAgICAgIH0KKworICAgICAgICBAREVMRVRFCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZGVsZXRlKCkgeworICAgICAgICAgICAgcmV0dXJuICJERUxFVEUiOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgUmVzb3VyY2VDb25maWcgY29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKEh0dHBNZXRob2RSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihuZXcgTG9nZ2luZ0ZlYXR1cmUoTE9HR0VSLCBMb2dnaW5nRmVhdHVyZS5WZXJib3NpdHkuUEFZTE9BRF9BTlkpKTsKKyAgICAgICAgcmV0dXJuIGNvbmZpZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcuY29ubmVjdG9yUHJvdmlkZXIobmV3IEpldHR5Q29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldChQQVRIKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiR0VUIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBc3luYygpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoUEFUSCkucmVxdWVzdCgpLmFzeW5jKCkuZ2V0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiR0VUIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0KCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldChQQVRIKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KCJQT1NUIiwgTWVkaWFUeXBlLlRFWFRfUExBSU4pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJQT1NUIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0QXN5bmMoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KFBBVEgpLnJlcXVlc3QoKS5hc3luYygpLnBvc3QoRW50aXR5LmVudGl0eSgiUE9TVCIsIE1lZGlhVHlwZS5URVhUX1BMQUlOKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiUE9TVCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0KCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldChQQVRIKS5yZXF1ZXN0KCkucHV0KEVudGl0eS5lbnRpdHkoIlBVVCIsIE1lZGlhVHlwZS5URVhUX1BMQUlOKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiUFVUIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQdXRBc3luYygpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoUEFUSCkucmVxdWVzdCgpLmFzeW5jKCkucHV0KEVudGl0eS5lbnRpdHkoIlBVVCIsIE1lZGlhVHlwZS5URVhUX1BMQUlOKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiUFVUIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZWxldGUoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KFBBVEgpLnJlcXVlc3QoKS5kZWxldGUoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJERUxFVEUiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlbGV0ZUFzeW5jKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldChQQVRIKS5yZXF1ZXN0KCkuYXN5bmMoKS5kZWxldGUoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJERUxFVEUiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhdGNoKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldChQQVRIKS5yZXF1ZXN0KCkubWV0aG9kKCJQQVRDSCIsIEVudGl0eS5lbnRpdHkoIlBBVENIIiwgTWVkaWFUeXBlLlRFWFRfUExBSU4pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJQQVRDSCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9qZXR0eS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0eS9jb25uZWN0b3IvTm9FbnRpdHlUZXN0LmphdmEgYi9jb25uZWN0b3JzL2pldHR5LWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHR5L2Nvbm5lY3Rvci9Ob0VudGl0eVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWNhNDM2Ci0tLSAvZGV2L251bGwKKysrIGIvY29ubmVjdG9ycy9qZXR0eS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0eS9jb25uZWN0b3IvTm9FbnRpdHlUZXN0LmphdmEKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dHkuY29ubmVjdG9yOworCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlLlN0YXR1czsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBBcnVsIERoZXNpYXNlZWxhbiAoYXJ1bGQgYXQgYWNtLm9yZykKKyAqLworcHVibGljIGNsYXNzIE5vRW50aXR5VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKE5vRW50aXR5VGVzdC5jbGFzcy5nZXROYW1lKCkpOworCisgICAgQFBhdGgoIi90ZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEh0dHBNZXRob2RSZXNvdXJjZSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoU3RhdHVzLkNPTkZMSUNUKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIHZvaWQgcG9zdChTdHJpbmcgZW50aXR5KSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBSZXNvdXJjZUNvbmZpZyBjb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoSHR0cE1ldGhvZFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKG5ldyBMb2dnaW5nRmVhdHVyZShMT0dHRVIsIExvZ2dpbmdGZWF0dXJlLlZlcmJvc2l0eS5QQVlMT0FEX0FOWSkpOworICAgICAgICByZXR1cm4gY29uZmlnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5jb25uZWN0b3JQcm92aWRlcihuZXcgSmV0dHlDb25uZWN0b3JQcm92aWRlcigpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXQoKSB7CisgICAgICAgIFdlYlRhcmdldCByID0gdGFyZ2V0KCJ0ZXN0Iik7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKKyAgICAgICAgICAgIFJlc3BvbnNlIGNyID0gci5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgICAgICBjci5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0V2l0aENsb3NlKCkgeworICAgICAgICBXZWJUYXJnZXQgciA9IHRhcmdldCgidGVzdCIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgeworICAgICAgICAgICAgUmVzcG9uc2UgY3IgPSByLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgICAgIGNyLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0KCkgeworICAgICAgICBXZWJUYXJnZXQgciA9IHRhcmdldCgidGVzdCIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgeworICAgICAgICAgICAgUmVzcG9uc2UgY3IgPSByLnJlcXVlc3QoKS5wb3N0KG51bGwpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdFdpdGhDbG9zZSgpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHIgPSB0YXJnZXQoInRlc3QiKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKKyAgICAgICAgICAgIFJlc3BvbnNlIGNyID0gci5yZXF1ZXN0KCkucG9zdChudWxsKTsKKyAgICAgICAgICAgIGNyLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL2pldHR5LWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHR5L2Nvbm5lY3Rvci9UaW1lb3V0VGVzdC5qYXZhIGIvY29ubmVjdG9ycy9qZXR0eS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0eS9jb25uZWN0b3IvVGltZW91dFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjkyNDRmCi0tLSAvZGV2L251bGwKKysrIGIvY29ubmVjdG9ycy9qZXR0eS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0eS9jb25uZWN0b3IvVGltZW91dFRlc3QuamF2YQpAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0eS5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZW91dEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmluc3RhbmNlT2Y7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqIEBhdXRob3IgQXJ1bCBEaGVzaWFzZWVsYW4gKGFydWxkIGF0IGFjbS5vcmcpCisgKi8KK3B1YmxpYyBjbGFzcyBUaW1lb3V0VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFRpbWVvdXRUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBAUGF0aCgiL3Rlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGltZW91dFJlc291cmNlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiR0VUIjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInRpbWVvdXQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRpbWVvdXQoKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgyMDAwKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICJHRVQiOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgUmVzb3VyY2VDb25maWcgY29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKFRpbWVvdXRSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihuZXcgTG9nZ2luZ0ZlYXR1cmUoTE9HR0VSLCBMb2dnaW5nRmVhdHVyZS5WZXJib3NpdHkuUEFZTE9BRF9BTlkpKTsKKyAgICAgICAgcmV0dXJuIGNvbmZpZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcuY29ubmVjdG9yUHJvdmlkZXIobmV3IEpldHR5Q29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmFzdCgpIHsKKyAgICAgICAgUmVzcG9uc2UgciA9IHRhcmdldCgidGVzdCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgci5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiR0VUIiwgci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNsb3coKSB7CisgICAgICAgIGZpbmFsIFVSSSB1ID0gdGFyZ2V0KCkuZ2V0VXJpKCk7CisgICAgICAgIENsaWVudENvbmZpZyBjb25maWcgPSBuZXcgQ2xpZW50Q29uZmlnKCkucHJvcGVydHkoQ2xpZW50UHJvcGVydGllcy5SRUFEX1RJTUVPVVQsIDEwMDApOworICAgICAgICBjb25maWcuY29ubmVjdG9yUHJvdmlkZXIobmV3IEpldHR5Q29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgICAgIENsaWVudCBjID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoY29uZmlnKTsKKyAgICAgICAgV2ViVGFyZ2V0IHQgPSBjLnRhcmdldCh1KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHQucGF0aCgidGVzdC90aW1lb3V0IikucmVxdWVzdCgpLmdldCgpOworICAgICAgICAgICAgZmFpbCgiVGltZW91dCBleHBlY3RlZC4iKTsKKyAgICAgICAgfSBjYXRjaCAoUHJvY2Vzc2luZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUaGF0KCJVbmV4cGVjdGVkIHByb2Nlc3NpbmcgZXhjZXB0aW9uIGNhdXNlIiwKKyAgICAgICAgICAgICAgICAgICAgZS5nZXRDYXVzZSgpLCBpbnN0YW5jZU9mKFRpbWVvdXRFeGNlcHRpb24uY2xhc3MpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvamV0dHktY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamV0dHkvY29ubmVjdG9yL1RyYWNlU3VwcG9ydFRlc3QuamF2YSBiL2Nvbm5lY3RvcnMvamV0dHktY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamV0dHkvY29ubmVjdG9yL1RyYWNlU3VwcG9ydFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2NhYzIxCi0tLSAvZGV2L251bGwKKysrIGIvY29ubmVjdG9ycy9qZXR0eS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0eS9jb25uZWN0b3IvVHJhY2VTdXBwb3J0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMjM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHR5LmNvbm5lY3RvcjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuSHR0cE1ldGhvZDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVxdWVzdDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuSW5mbGVjdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiBUaGlzIHZlcnkgYmFzaWMgcmVzb3VyY2Ugc2hvd2Nhc2VzIHN1cHBvcnQgb2YgYSBIVFRQIFRSQUNFIG1ldGhvZCwKKyAqIG5vdCBkaXJlY3RseSBzdXBwb3J0ZWQgYnkgSkFYLVJTIEFQSS4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgVHJhY2VTdXBwb3J0VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoVHJhY2VTdXBwb3J0VGVzdC5jbGFzcy5nZXROYW1lKCkpOworCisgICAgLyoqCisgICAgICogUHJvZ3JhbW1hdGljIHRyYWNpbmcgcm9vdCByZXNvdXJjZSBwYXRoLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RfUEFUSF9QUk9HUkFNTUFUSUMgPSAidHJhY2luZy9wcm9ncmFtbWF0aWMiOworCisgICAgLyoqCisgICAgICogQW5ub3RhdGVkIGNsYXNzLWJhc2VkIHRyYWNpbmcgcm9vdCByZXNvdXJjZSBwYXRoLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RfUEFUSF9BTk5PVEFURUQgPSAidHJhY2luZy9hbm5vdGF0ZWQiOworCisgICAgQEh0dHBNZXRob2QoVFJBQ0UuTkFNRSkKKyAgICBAVGFyZ2V0KEVsZW1lbnRUeXBlLk1FVEhPRCkKKyAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRSQUNFIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJUUkFDRSI7CisgICAgfQorCisgICAgQFBhdGgoUk9PVF9QQVRIX0FOTk9UQVRFRCkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRyYWNpbmdSZXNvdXJjZSB7CisKKyAgICAgICAgQFRSQUNFCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdHJhY2UoUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgICAgICByZXR1cm4gc3RyaW5naWZ5KChDb250YWluZXJSZXF1ZXN0KSByZXF1ZXN0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIFJlc291cmNlQ29uZmlnIGNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhUcmFjaW5nUmVzb3VyY2UuY2xhc3MpOworICAgICAgICBjb25maWcucmVnaXN0ZXIobmV3IExvZ2dpbmdGZWF0dXJlKExPR0dFUiwgTG9nZ2luZ0ZlYXR1cmUuVmVyYm9zaXR5LlBBWUxPQURfQU5ZKSk7CisgICAgICAgIGZpbmFsIFJlc291cmNlLkJ1aWxkZXIgcmVzb3VyY2VCdWlsZGVyID0gUmVzb3VyY2UuYnVpbGRlcihST09UX1BBVEhfUFJPR1JBTU1BVElDKTsKKyAgICAgICAgcmVzb3VyY2VCdWlsZGVyLmFkZE1ldGhvZChUUkFDRS5OQU1FKS5oYW5kbGVkQnkobmV3IEluZmxlY3RvcjxDb250YWluZXJSZXF1ZXN0Q29udGV4dCwgUmVzcG9uc2U+KCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBSZXNwb25zZSBhcHBseShDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0KSB7CisgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uubm9Db250ZW50KCkuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soc3RyaW5naWZ5KChDb250YWluZXJSZXF1ZXN0KSByZXF1ZXN0KSwgTWVkaWFUeXBlLlRFWFRfUExBSU4pLmJ1aWxkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICByZXR1cm4gY29uZmlnLnJlZ2lzdGVyUmVzb3VyY2VzKHJlc291cmNlQnVpbGRlci5idWlsZCgpKTsKKworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nW10gZXhwZWN0ZWRGcmFnbWVudHNQcm9ncmFtbWF0aWMgPSBuZXcgU3RyaW5nW117CisgICAgICAgICAgICAiVFJBQ0UgaHR0cDovL2xvY2FsaG9zdDoiICsgdGhpcy5nZXRQb3J0KCkgKyAiL3RyYWNpbmcvcHJvZ3JhbW1hdGljIgorICAgIH07CisgICAgcHJpdmF0ZSBTdHJpbmdbXSBleHBlY3RlZEZyYWdtZW50c0Fubm90YXRlZCA9IG5ldyBTdHJpbmdbXXsKKyAgICAgICAgICAgICJUUkFDRSBodHRwOi8vbG9jYWxob3N0OiIgKyB0aGlzLmdldFBvcnQoKSArICIvdHJhY2luZy9hbm5vdGF0ZWQiCisgICAgfTsKKworICAgIHByaXZhdGUgV2ViVGFyZ2V0IHByZXBhcmVUYXJnZXQoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpOworICAgICAgICB0YXJnZXQucmVnaXN0ZXIoTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpOworICAgICAgICByZXR1cm4gdGFyZ2V0LnBhdGgocGF0aCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvZ3JhbW1hdGljQXBwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gcHJlcGFyZVRhcmdldChST09UX1BBVEhfUFJPR1JBTU1BVElDKS5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikubWV0aG9kKFRSQUNFLk5BTUUpOworCisgICAgICAgIGFzc2VydEVxdWFscyhSZXNwb25zZS5TdGF0dXMuT0suZ2V0U3RhdHVzQ29kZSgpLCByZXNwb25zZS5nZXRTdGF0dXNJbmZvKCkuZ2V0U3RhdHVzQ29kZSgpKTsKKworICAgICAgICBTdHJpbmcgcmVzcG9uc2VFbnRpdHkgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGZvciAoU3RyaW5nIGV4cGVjdGVkRnJhZ21lbnQgOiBleHBlY3RlZEZyYWdtZW50c1Byb2dyYW1tYXRpYykgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZnJhZ21lbnQgJyIgKyBleHBlY3RlZEZyYWdtZW50ICsgIicgbm90IGZvdW5kIGluIHJlc3BvbnNlOlxuIiArIHJlc3BvbnNlRW50aXR5LAorICAgICAgICAgICAgICAgICAgICAvLyB0b0xvd2VyQ2FzZSAtIGh0dHAgaGVhZGVyIGZpZWxkIG5hbWVzIGFyZSBjYXNlIGluc2Vuc2l0aXZlCisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlRW50aXR5LmNvbnRhaW5zKGV4cGVjdGVkRnJhZ21lbnQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFubm90YXRlZEFwcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHByZXBhcmVUYXJnZXQoUk9PVF9QQVRIX0FOTk9UQVRFRCkucmVxdWVzdCgidGV4dC9wbGFpbiIpLm1ldGhvZChUUkFDRS5OQU1FKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoUmVzcG9uc2UuU3RhdHVzLk9LLmdldFN0YXR1c0NvZGUoKSwgcmVzcG9uc2UuZ2V0U3RhdHVzSW5mbygpLmdldFN0YXR1c0NvZGUoKSk7CisKKyAgICAgICAgU3RyaW5nIHJlc3BvbnNlRW50aXR5ID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBmb3IgKFN0cmluZyBleHBlY3RlZEZyYWdtZW50IDogZXhwZWN0ZWRGcmFnbWVudHNBbm5vdGF0ZWQpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkIGZyYWdtZW50ICciICsgZXhwZWN0ZWRGcmFnbWVudCArICInIG5vdCBmb3VuZCBpbiByZXNwb25zZTpcbiIgKyByZXNwb25zZUVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgLy8gdG9Mb3dlckNhc2UgLSBodHRwIGhlYWRlciBmaWVsZCBuYW1lcyBhcmUgY2FzZSBpbnNlbnNpdGl2ZQorICAgICAgICAgICAgICAgICAgICByZXNwb25zZUVudGl0eS5jb250YWlucyhleHBlY3RlZEZyYWdtZW50KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFjZVdpdGhFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RUcmFjZVdpdGhFbnRpdHkoZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luY1RyYWNlV2l0aEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdFRyYWNlV2l0aEVudGl0eSh0cnVlLCBmYWxzZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhY2VXaXRoRW50aXR5SmV0dHlDb25uZWN0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RUcmFjZVdpdGhFbnRpdHkoZmFsc2UsIHRydWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFzeW5jVHJhY2VXaXRoRW50aXR5SmV0dHlDb25uZWN0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RUcmFjZVdpdGhFbnRpdHkodHJ1ZSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0VHJhY2VXaXRoRW50aXR5KGZpbmFsIGJvb2xlYW4gaXNBc3luYywgZmluYWwgYm9vbGVhbiB1c2VKZXR0eUNvbm5lY3Rpb24pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHVzZUpldHR5Q29ubmVjdGlvbiA/IGdldEpldHR5Q2xpZW50KCkudGFyZ2V0KHRhcmdldCgpLmdldFVyaSgpKSA6IHRhcmdldCgpOworICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhdGgoUk9PVF9QQVRIX0FOTk9UQVRFRCk7CisKKyAgICAgICAgICAgIGZpbmFsIEVudGl0eTxTdHJpbmc+IGVudGl0eSA9IEVudGl0eS5lbnRpdHkoInRyYWNlIiwgTWVkaWFUeXBlLldJTERDQVJEX1RZUEUpOworCisgICAgICAgICAgICBSZXNwb25zZSByZXNwb25zZTsKKyAgICAgICAgICAgIGlmICghaXNBc3luYykgeworICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5tZXRob2QoVFJBQ0UuTkFNRSwgZW50aXR5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLmFzeW5jKCkubWV0aG9kKFRSQUNFLk5BTUUsIGVudGl0eSkuZ2V0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZhaWwoIkEgVFJBQ0UgcmVxdWVzdCBNVVNUIE5PVCBpbmNsdWRlIGFuIGVudGl0eS4gKHJlc3BvbnNlPSIgKyByZXNwb25zZSArICIpIik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBPSworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBDbGllbnQgZ2V0SmV0dHlDbGllbnQoKSB7CisgICAgICAgIHJldHVybiBDbGllbnRCdWlsZGVyLm5ld0NsaWVudChuZXcgQ2xpZW50Q29uZmlnKCkuY29ubmVjdG9yUHJvdmlkZXIobmV3IEpldHR5Q29ubmVjdG9yUHJvdmlkZXIoKSkpOworICAgIH0KKworCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaW5naWZ5KENvbnRhaW5lclJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKyAgICAgICAgcHJpbnRSZXF1ZXN0TGluZShidWZmZXIsIHJlcXVlc3QpOworICAgICAgICBwcmludFByZWZpeGVkSGVhZGVycyhidWZmZXIsIHJlcXVlc3QuZ2V0SGVhZGVycygpKTsKKworICAgICAgICBpZiAocmVxdWVzdC5oYXNFbnRpdHkoKSkgeworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChyZXF1ZXN0LnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSkuYXBwZW5kKCJcbiIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJpbnRSZXF1ZXN0TGluZShTdHJpbmdCdWlsZGVyIGJ1ZmZlciwgQ29udGFpbmVyUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIGJ1ZmZlci5hcHBlbmQocmVxdWVzdC5nZXRNZXRob2QoKSkuYXBwZW5kKCIgIikuYXBwZW5kKHJlcXVlc3QuZ2V0VXJpSW5mbygpLmdldFJlcXVlc3RVcmkoKS50b0FTQ0lJU3RyaW5nKCkpLmFwcGVuZCgiXG4iKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50UHJlZml4ZWRIZWFkZXJzKFN0cmluZ0J1aWxkZXIgYnVmZmVyLCBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGhlYWRlcnMpIHsKKyAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGUgOiBoZWFkZXJzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiB2YWwgPSBlLmdldFZhbHVlKCk7CisgICAgICAgICAgICBTdHJpbmcgaGVhZGVyID0gZS5nZXRLZXkoKTsKKworICAgICAgICAgICAgaWYgKHZhbC5zaXplKCkgPT0gMSkgeworICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoaGVhZGVyKS5hcHBlbmQoIjogIikuYXBwZW5kKHZhbC5nZXQoMCkpLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBhZGQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBzIDogdmFsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChhZGQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnLCcpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGFkZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnVmZmVyLmFwcGVuZChoZWFkZXIpLmFwcGVuZCgiOiAiKS5hcHBlbmQoc2IudG9TdHJpbmcoKSkuYXBwZW5kKCJcbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9qZXR0eS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0eS9jb25uZWN0b3IvVW5kZXJseWluZ0h0dHBDbGllbnRBY2Nlc3NUZXN0LmphdmEgYi9jb25uZWN0b3JzL2pldHR5LWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHR5L2Nvbm5lY3Rvci9VbmRlcmx5aW5nSHR0cENsaWVudEFjY2Vzc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2VmYzJiCi0tLSAvZGV2L251bGwKKysrIGIvY29ubmVjdG9ycy9qZXR0eS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0eS9jb25uZWN0b3IvVW5kZXJseWluZ0h0dHBDbGllbnRBY2Nlc3NUZXN0LmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0eS5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamV0dHkuY2xpZW50Lkh0dHBDbGllbnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRTYW1lOworCisvKioKKyAqIFRlc3Qgb2YgYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIEhUVFAgY2xpZW50IGluc3RhbmNlIHVzZWQgYnkgdGhlIGNvbm5lY3Rvci4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgVW5kZXJseWluZ0h0dHBDbGllbnRBY2Nlc3NUZXN0IHsKKworICAgIC8qKgorICAgICAqIFZlcmlmaWVyIG9mIEpFUlNFWS0yNDI0IGZpeC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIdHRwQ2xpZW50SW5zdGFuY2VBY2Nlc3MoKSB7CisgICAgICAgIGZpbmFsIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudChuZXcgQ2xpZW50Q29uZmlnKCkuY29ubmVjdG9yUHJvdmlkZXIobmV3IEpldHR5Q29ubmVjdG9yUHJvdmlkZXIoKSkpOworICAgICAgICBmaW5hbCBIdHRwQ2xpZW50IGhjT25DbGllbnQgPSBKZXR0eUNvbm5lY3RvclByb3ZpZGVyLmdldEh0dHBDbGllbnQoY2xpZW50KTsKKyAgICAgICAgLy8gaW1wb3J0YW50OiB0aGUgd2ViIHRhcmdldCBpbnN0YW5jZSBpbiB0aGlzIHRlc3QgbXVzdCBiZSBvbmx5IGNyZWF0ZWQgQUZURVIgdGhlIGNsaWVudCBoYXMgYmVlbiBwcmUtaW5pdGlhbGl6ZWQKKyAgICAgICAgLy8gKHNlZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuSW5pdGlhbGl6YWJsZS5wcmVJbml0aWFsaXplIG1ldGhvZCkuIFRoaXMgaXMgaGVyZSBhY2hpZXZlZCBieSBjYWxsaW5nIHRoZQorICAgICAgICAvLyBjb25uZWN0b3IgcHJvdmlkZXIncyBzdGF0aWMgZ2V0SHR0cENsaWVudCBtZXRob2QgYWJvdmUuCisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSBjbGllbnQudGFyZ2V0KCJodHRwOi8vbG9jYWxob3N0LyIpOworICAgICAgICBmaW5hbCBIdHRwQ2xpZW50IGhjT25UYXJnZXQgPSBKZXR0eUNvbm5lY3RvclByb3ZpZGVyLmdldEh0dHBDbGllbnQodGFyZ2V0KTsKKworICAgICAgICBhc3NlcnROb3ROdWxsKCJIVFRQIGNsaWVudCBpbnN0YW5jZSBzZXQgb24gSmVyc2V5Q2xpZW50IHNob3VsZCBub3QgYmUgbnVsbC4iLCBoY09uQ2xpZW50KTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiSFRUUCBjbGllbnQgaW5zdGFuY2Ugc2V0IG9uIEplcnNleVdlYlRhcmdldCBzaG91bGQgbm90IGJlIG51bGwuIiwgaGNPblRhcmdldCk7CisgICAgICAgIGFzc2VydFNhbWUoIkhUVFAgY2xpZW50IGluc3RhbmNlIHNldCBvbiBKZXJzZXlDbGllbnQgc2hvdWxkIGJlIHRoZSBzYW1lIGluc3RhbmNlIGFzIHRoZSBvbmUgc2V0IG9uIEplcnNleVdlYlRhcmdldCIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIihwcm92aWRlZCB0aGUgdGFyZ2V0IGluc3RhbmNlIGhhcyBub3QgYmVlbiBmdXJ0aGVyIGNvbmZpZ3VyZWQpLiIsCisgICAgICAgICAgICAgICAgaGNPbkNsaWVudCwgaGNPblRhcmdldAorICAgICAgICApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvbmV0dHktY29ubmVjdG9yL3BvbS54bWwgYi9jb25uZWN0b3JzL25ldHR5LWNvbm5lY3Rvci9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNmZjNmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL25ldHR5LWNvbm5lY3Rvci9wb20ueG1sCkBAIC0wLDAgKzEsNzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE2LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbm5lY3RvcnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbmV0dHktY29ubmVjdG9yPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LWNvbm5lY3RvcnMtbmV0dHk8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+SmVyc2V5IENsaWVudCBUcmFuc3BvcnQgdmlhIE5ldHR5PC9kZXNjcmlwdGlvbj4KKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8cHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz5VVEYtODwvcHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz4KKyAgICA8L3Byb3BlcnRpZXM+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmlvLm5ldHR5PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bmV0dHktYWxsPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8IS0tIGNhbm5vdCBiZSBuZXR0eSwgc2luY2UgbmV0dHkgY29udGFpbmVyIGRlcGVuZHMgb24gbmV0dHkgY29ubmVjdG9yLiAtLT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1ncml6emx5MjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZ3VhdmE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5ndWF2YTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi5pc3RhY2s8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4taXN0YWNrLWNvbW1vbnMtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJ1aWxkLWhlbHBlci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9uZXR0eS1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9uZXR0eS9jb25uZWN0b3IvSmVyc2V5Q2xpZW50SGFuZGxlci5qYXZhIGIvY29ubmVjdG9ycy9uZXR0eS1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9uZXR0eS9jb25uZWN0b3IvSmVyc2V5Q2xpZW50SGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZTc4ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL25ldHR5LWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L25ldHR5L2Nvbm5lY3Rvci9KZXJzZXlDbGllbnRIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubmV0dHkuY29ubmVjdG9yOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db21wbGV0YWJsZUZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5MaW5rZWRCbG9ja2luZ0RlcXVlOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuc3BpLkFzeW5jQ29ubmVjdG9yQ2FsbGJhY2s7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubmV0dHkuY29ubmVjdG9yLmludGVybmFsLk5ldHR5SW5wdXRTdHJlYW07CisKK2ltcG9ydCBpby5uZXR0eS5idWZmZXIuQnl0ZUJ1ZjsKK2ltcG9ydCBpby5uZXR0eS5jaGFubmVsLkNoYW5uZWxIYW5kbGVyQ29udGV4dDsKK2ltcG9ydCBpby5uZXR0eS5jaGFubmVsLlNpbXBsZUNoYW5uZWxJbmJvdW5kSGFuZGxlcjsKK2ltcG9ydCBpby5uZXR0eS5oYW5kbGVyLmNvZGVjLmh0dHAuSHR0cENvbnRlbnQ7CitpbXBvcnQgaW8ubmV0dHkuaGFuZGxlci5jb2RlYy5odHRwLkh0dHBIZWFkZXJOYW1lczsKK2ltcG9ydCBpby5uZXR0eS5oYW5kbGVyLmNvZGVjLmh0dHAuSHR0cE9iamVjdDsKK2ltcG9ydCBpby5uZXR0eS5oYW5kbGVyLmNvZGVjLmh0dHAuSHR0cFJlc3BvbnNlOworaW1wb3J0IGlvLm5ldHR5LmhhbmRsZXIuY29kZWMuaHR0cC5IdHRwVXRpbDsKK2ltcG9ydCBpby5uZXR0eS5oYW5kbGVyLmNvZGVjLmh0dHAuTGFzdEh0dHBDb250ZW50OworaW1wb3J0IGlvLm5ldHR5LnV0aWwuY29uY3VycmVudC5GdXR1cmU7CitpbXBvcnQgaW8ubmV0dHkudXRpbC5jb25jdXJyZW50LkdlbmVyaWNGdXR1cmVMaXN0ZW5lcjsKKworLyoqCisgKiBKZXJzZXkgaW1wbGVtZW50YXRpb24gb2YgTmV0dHkgY2hhbm5lbCBoYW5kbGVyLgorICoKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK2NsYXNzIEplcnNleUNsaWVudEhhbmRsZXIgZXh0ZW5kcyBTaW1wbGVDaGFubmVsSW5ib3VuZEhhbmRsZXI8SHR0cE9iamVjdD4geworCisgICAgcHJpdmF0ZSBmaW5hbCBOZXR0eUNvbm5lY3RvciBjb25uZWN0b3I7CisgICAgcHJpdmF0ZSBmaW5hbCBMaW5rZWRCbG9ja2luZ0RlcXVlPElucHV0U3RyZWFtPiBpc0xpc3QgPSBuZXcgTGlua2VkQmxvY2tpbmdEZXF1ZTw+KCk7CisKKyAgICBwcml2YXRlIGZpbmFsIEFzeW5jQ29ubmVjdG9yQ2FsbGJhY2sgYXN5bmNDb25uZWN0b3JDYWxsYmFjazsKKyAgICBwcml2YXRlIGZpbmFsIENsaWVudFJlcXVlc3QgamVyc2V5UmVxdWVzdDsKKyAgICBwcml2YXRlIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlIGZ1dHVyZTsKKworICAgIEplcnNleUNsaWVudEhhbmRsZXIoTmV0dHlDb25uZWN0b3IgbmV0dHlDb25uZWN0b3IsIENsaWVudFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFzeW5jQ29ubmVjdG9yQ2FsbGJhY2sgY2FsbGJhY2ssIENvbXBsZXRhYmxlRnV0dXJlIGZ1dHVyZSkgeworICAgICAgICB0aGlzLmNvbm5lY3RvciA9IG5ldHR5Q29ubmVjdG9yOworICAgICAgICB0aGlzLmFzeW5jQ29ubmVjdG9yQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICAgICAgdGhpcy5qZXJzZXlSZXF1ZXN0ID0gcmVxdWVzdDsKKyAgICAgICAgdGhpcy5mdXR1cmUgPSBmdXR1cmU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2hhbm5lbFJlYWQwKENoYW5uZWxIYW5kbGVyQ29udGV4dCBjdHgsIEh0dHBPYmplY3QgbXNnKSB7CisgICAgICAgIGlmIChtc2cgaW5zdGFuY2VvZiBIdHRwUmVzcG9uc2UpIHsKKyAgICAgICAgICAgIGZpbmFsIEh0dHBSZXNwb25zZSByZXNwb25zZSA9IChIdHRwUmVzcG9uc2UpIG1zZzsKKworICAgICAgICAgICAgZmluYWwgQ2xpZW50UmVzcG9uc2UgamVyc2V5UmVzcG9uc2UgPSBuZXcgQ2xpZW50UmVzcG9uc2UobmV3IFJlc3BvbnNlLlN0YXR1c1R5cGUoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGludCBnZXRTdGF0dXNDb2RlKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2Uuc3RhdHVzKCkuY29kZSgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBSZXNwb25zZS5TdGF0dXMuRmFtaWx5IGdldEZhbWlseSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLlN0YXR1cy5GYW1pbHkuZmFtaWx5T2YocmVzcG9uc2Uuc3RhdHVzKCkuY29kZSgpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFJlYXNvblBocmFzZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnN0YXR1cygpLnJlYXNvblBocmFzZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sIGplcnNleVJlcXVlc3QpOworCisgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZW50cnkgOiByZXNwb25zZS5oZWFkZXJzKCkuZW50cmllcygpKSB7CisgICAgICAgICAgICAgICAgamVyc2V5UmVzcG9uc2UuZ2V0SGVhZGVycygpLmFkZChlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHJlcXVlc3QgZW50aXR5IGhhbmRsaW5nLgorICAgICAgICAgICAgaWYgKChyZXNwb25zZS5oZWFkZXJzKCkuY29udGFpbnMoSHR0cEhlYWRlck5hbWVzLkNPTlRFTlRfTEVOR1RIKSAmJiBIdHRwVXRpbC5nZXRDb250ZW50TGVuZ3RoKHJlc3BvbnNlKSA+IDApCisgICAgICAgICAgICAgICAgICAgIHx8IEh0dHBVdGlsLmlzVHJhbnNmZXJFbmNvZGluZ0NodW5rZWQocmVzcG9uc2UpKSB7CisKKyAgICAgICAgICAgICAgICBjdHguY2hhbm5lbCgpLmNsb3NlRnV0dXJlKCkuYWRkTGlzdGVuZXIobmV3IEdlbmVyaWNGdXR1cmVMaXN0ZW5lcjxGdXR1cmU8PyBzdXBlciBWb2lkPj4oKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvcGVyYXRpb25Db21wbGV0ZShGdXR1cmU8PyBzdXBlciBWb2lkPiBmdXR1cmUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICAgICAgaXNMaXN0LmFkZChOZXR0eUlucHV0U3RyZWFtLkVORF9PRl9JTlBVVF9FUlJPUik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgIGplcnNleVJlc3BvbnNlLnNldEVudGl0eVN0cmVhbShuZXcgTmV0dHlJbnB1dFN0cmVhbShpc0xpc3QpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgamVyc2V5UmVzcG9uc2Uuc2V0RW50aXR5U3RyZWFtKG5ldyBJbnB1dFN0cmVhbSgpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGFzeW5jQ29ubmVjdG9yQ2FsbGJhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvbm5lY3Rvci5leGVjdXRvclNlcnZpY2UuZXhlY3V0ZShuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3luY0Nvbm5lY3RvckNhbGxiYWNrLnJlc3BvbnNlKGplcnNleVJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1dHVyZS5jb21wbGV0ZShqZXJzZXlSZXNwb25zZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgICAgIGlmIChtc2cgaW5zdGFuY2VvZiBIdHRwQ29udGVudCkgeworCisgICAgICAgICAgICBIdHRwQ29udGVudCBodHRwQ29udGVudCA9IChIdHRwQ29udGVudCkgbXNnOworCisgICAgICAgICAgICBCeXRlQnVmIGNvbnRlbnQgPSBodHRwQ29udGVudC5jb250ZW50KCk7CisKKyAgICAgICAgICAgIGlmIChjb250ZW50LmlzUmVhZGFibGUoKSkgeworICAgICAgICAgICAgICAgIC8vIGNvcHkgYnl0ZXMgLSB3aGVuIG5ldHR5IHJlYWRzIGxhc3QgY2h1bmssIGl0IGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBjaGFubmVsLCB3aGljaCBpbnZhbGlkYXRlcyBhbGwKKyAgICAgICAgICAgICAgICAvLyByZWxhdGVzIEJ5dGVCdWZmcy4KKyAgICAgICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtjb250ZW50LnJlYWRhYmxlQnl0ZXMoKV07CisgICAgICAgICAgICAgICAgY29udGVudC5nZXRCeXRlcyhjb250ZW50LnJlYWRlckluZGV4KCksIGJ5dGVzKTsKKyAgICAgICAgICAgICAgICBpc0xpc3QuYWRkKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcykpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobXNnIGluc3RhbmNlb2YgTGFzdEh0dHBDb250ZW50KSB7CisgICAgICAgICAgICAgICAgaXNMaXN0LmFkZChOZXR0eUlucHV0U3RyZWFtLkVORF9PRl9JTlBVVCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBleGNlcHRpb25DYXVnaHQoQ2hhbm5lbEhhbmRsZXJDb250ZXh0IGN0eCwgZmluYWwgVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgICAgIGlmIChhc3luY0Nvbm5lY3RvckNhbGxiYWNrICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbm5lY3Rvci5leGVjdXRvclNlcnZpY2UuZXhlY3V0ZShuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBhc3luY0Nvbm5lY3RvckNhbGxiYWNrLmZhaWx1cmUoY2F1c2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICAgIGZ1dHVyZS5jb21wbGV0ZUV4Y2VwdGlvbmFsbHkoY2F1c2UpOworICAgICAgICBpc0xpc3QuYWRkKE5ldHR5SW5wdXRTdHJlYW0uRU5EX09GX0lOUFVUX0VSUk9SKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL25ldHR5LWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L25ldHR5L2Nvbm5lY3Rvci9OZXR0eUNvbm5lY3Rvci5qYXZhIGIvY29ubmVjdG9ycy9uZXR0eS1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9uZXR0eS9jb25uZWN0b3IvTmV0dHlDb25uZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjdjNTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvY29ubmVjdG9ycy9uZXR0eS1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9uZXR0eS9jb25uZWN0b3IvTmV0dHlDb25uZWN0b3IuamF2YQpAQCAtMCwwICsxLDMwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5uZXR0eS5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbXBsZXRhYmxlRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlOworCitpbXBvcnQgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKKworaW1wb3J0IGlvLm5ldHR5LmJvb3RzdHJhcC5Cb290c3RyYXA7CitpbXBvcnQgaW8ubmV0dHkuY2hhbm5lbC5DaGFubmVsOworaW1wb3J0IGlvLm5ldHR5LmNoYW5uZWwuQ2hhbm5lbEluaXRpYWxpemVyOworaW1wb3J0IGlvLm5ldHR5LmNoYW5uZWwuQ2hhbm5lbE9wdGlvbjsKK2ltcG9ydCBpby5uZXR0eS5jaGFubmVsLkNoYW5uZWxQaXBlbGluZTsKK2ltcG9ydCBpby5uZXR0eS5jaGFubmVsLkV2ZW50TG9vcEdyb3VwOworaW1wb3J0IGlvLm5ldHR5LmNoYW5uZWwubmlvLk5pb0V2ZW50TG9vcEdyb3VwOworaW1wb3J0IGlvLm5ldHR5LmNoYW5uZWwuc29ja2V0LlNvY2tldENoYW5uZWw7CitpbXBvcnQgaW8ubmV0dHkuY2hhbm5lbC5zb2NrZXQubmlvLk5pb1NvY2tldENoYW5uZWw7CitpbXBvcnQgaW8ubmV0dHkuaGFuZGxlci5jb2RlYy5odHRwLkRlZmF1bHRGdWxsSHR0cFJlcXVlc3Q7CitpbXBvcnQgaW8ubmV0dHkuaGFuZGxlci5jb2RlYy5odHRwLkRlZmF1bHRIdHRwUmVxdWVzdDsKK2ltcG9ydCBpby5uZXR0eS5oYW5kbGVyLmNvZGVjLmh0dHAuSHR0cENodW5rZWRJbnB1dDsKK2ltcG9ydCBpby5uZXR0eS5oYW5kbGVyLmNvZGVjLmh0dHAuSHR0cENsaWVudENvZGVjOworaW1wb3J0IGlvLm5ldHR5LmhhbmRsZXIuY29kZWMuaHR0cC5IdHRwQ29udGVudERlY29tcHJlc3NvcjsKK2ltcG9ydCBpby5uZXR0eS5oYW5kbGVyLmNvZGVjLmh0dHAuSHR0cEhlYWRlck5hbWVzOworaW1wb3J0IGlvLm5ldHR5LmhhbmRsZXIuY29kZWMuaHR0cC5IdHRwTWV0aG9kOworaW1wb3J0IGlvLm5ldHR5LmhhbmRsZXIuY29kZWMuaHR0cC5IdHRwUmVxdWVzdDsKK2ltcG9ydCBpby5uZXR0eS5oYW5kbGVyLmNvZGVjLmh0dHAuSHR0cFV0aWw7CitpbXBvcnQgaW8ubmV0dHkuaGFuZGxlci5jb2RlYy5odHRwLkh0dHBWZXJzaW9uOworaW1wb3J0IGlvLm5ldHR5LmhhbmRsZXIucHJveHkuSHR0cFByb3h5SGFuZGxlcjsKK2ltcG9ydCBpby5uZXR0eS5oYW5kbGVyLnNzbC5DbGllbnRBdXRoOworaW1wb3J0IGlvLm5ldHR5LmhhbmRsZXIuc3NsLkpka1NzbENvbnRleHQ7CitpbXBvcnQgaW8ubmV0dHkuaGFuZGxlci5zdHJlYW0uQ2h1bmtlZFdyaXRlSGFuZGxlcjsKK2ltcG9ydCBpby5uZXR0eS51dGlsLmNvbmN1cnJlbnQuR2VuZXJpY0Z1dHVyZUxpc3RlbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuc3BpLkFzeW5jQ29ubmVjdG9yQ2FsbGJhY2s7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnNwaS5Db25uZWN0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5PdXRib3VuZE1lc3NhZ2VDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm5ldHR5LmNvbm5lY3Rvci5pbnRlcm5hbC5KZXJzZXlDaHVua2VkSW5wdXQ7CisKKy8qKgorICogTmV0dHkgY29ubmVjdG9yIGltcGxlbWVudGF0aW9uLgorICoKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK2NsYXNzIE5ldHR5Q29ubmVjdG9yIGltcGxlbWVudHMgQ29ubmVjdG9yIHsKKworICAgIGZpbmFsIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvclNlcnZpY2U7CisgICAgZmluYWwgRXZlbnRMb29wR3JvdXAgZ3JvdXA7CisgICAgZmluYWwgQ2xpZW50IGNsaWVudDsKKworICAgIE5ldHR5Q29ubmVjdG9yKENsaWVudCBjbGllbnQpIHsKKworICAgICAgICBmaW5hbCBPYmplY3QgdGhyZWFkUG9vbFNpemUgPSBjbGllbnQuZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnRpZXMoKS5nZXQoQ2xpZW50UHJvcGVydGllcy5BU1lOQ19USFJFQURQT09MX1NJWkUpOworCisgICAgICAgIGlmICh0aHJlYWRQb29sU2l6ZSAhPSBudWxsICYmIHRocmVhZFBvb2xTaXplIGluc3RhbmNlb2YgSW50ZWdlciAmJiAoSW50ZWdlcikgdGhyZWFkUG9vbFNpemUgPiAwKSB7CisgICAgICAgICAgICBleGVjdXRvclNlcnZpY2UgPSBFeGVjdXRvcnMubmV3Rml4ZWRUaHJlYWRQb29sKChJbnRlZ2VyKSB0aHJlYWRQb29sU2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBleGVjdXRvclNlcnZpY2UgPSBFeGVjdXRvcnMubmV3Q2FjaGVkVGhyZWFkUG9vbCgpOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5ncm91cCA9IG5ldyBOaW9FdmVudExvb3BHcm91cCgpOworICAgICAgICB0aGlzLmNsaWVudCA9IGNsaWVudDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2xpZW50UmVzcG9uc2UgYXBwbHkoQ2xpZW50UmVxdWVzdCBqZXJzZXlSZXF1ZXN0KSB7CisKKyAgICAgICAgZmluYWwgQXRvbWljUmVmZXJlbmNlPENsaWVudFJlc3BvbnNlPiBzeW5jUmVzcG9uc2UgPSBuZXcgQXRvbWljUmVmZXJlbmNlPD4obnVsbCk7CisgICAgICAgIGZpbmFsIEF0b21pY1JlZmVyZW5jZTxUaHJvd2FibGU+IHN5bmNFeGNlcHRpb24gPSBuZXcgQXRvbWljUmVmZXJlbmNlPD4obnVsbCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZ1dHVyZTw/PiByZXN1bHRGdXR1cmUgPSBhcHBseShqZXJzZXlSZXF1ZXN0LCBuZXcgQXN5bmNDb25uZWN0b3JDYWxsYmFjaygpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCByZXNwb25zZShDbGllbnRSZXNwb25zZSByZXNwb25zZSkgeworICAgICAgICAgICAgICAgICAgICBzeW5jUmVzcG9uc2Uuc2V0KHJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBmYWlsdXJlKFRocm93YWJsZSBmYWlsdXJlKSB7CisgICAgICAgICAgICAgICAgICAgIHN5bmNFeGNlcHRpb24uc2V0KGZhaWx1cmUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBJbnRlZ2VyIHRpbWVvdXQgPSBDbGllbnRQcm9wZXJ0aWVzLmdldFZhbHVlKGplcnNleVJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnRpZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50UHJvcGVydGllcy5SRUFEX1RJTUVPVVQsIDApOworCisgICAgICAgICAgICBpZiAodGltZW91dCAhPSBudWxsICYmIHRpbWVvdXQgPiAwKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0RnV0dXJlLmdldCh0aW1lb3V0LCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXN1bHRGdXR1cmUuZ2V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgVGhyb3dhYmxlIGUgPSBleC5nZXRDYXVzZSgpID09IG51bGwgPyBleCA6IGV4LmdldENhdXNlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oZXguZ2V0TWVzc2FnZSgpLCBleCk7CisgICAgICAgIH0KKworICAgICAgICBUaHJvd2FibGUgdGhyb3dhYmxlID0gc3luY0V4Y2VwdGlvbi5nZXQoKTsKKyAgICAgICAgaWYgKHRocm93YWJsZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gc3luY1Jlc3BvbnNlLmdldCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24odGhyb3dhYmxlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBGdXR1cmU8Pz4gYXBwbHkoZmluYWwgQ2xpZW50UmVxdWVzdCBqZXJzZXlSZXF1ZXN0LCBmaW5hbCBBc3luY0Nvbm5lY3RvckNhbGxiYWNrIGplcnNleUNhbGxiYWNrKSB7CisKKyAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8T2JqZWN0PiBzZXR0YWJsZUZ1dHVyZSA9IG5ldyBDb21wbGV0YWJsZUZ1dHVyZTw+KCk7CisKKyAgICAgICAgZmluYWwgVVJJIHJlcXVlc3RVcmkgPSBqZXJzZXlSZXF1ZXN0LmdldFVyaSgpOworICAgICAgICBTdHJpbmcgaG9zdCA9IHJlcXVlc3RVcmkuZ2V0SG9zdCgpOworICAgICAgICBpbnQgcG9ydCA9IHJlcXVlc3RVcmkuZ2V0UG9ydCgpICE9IC0xID8gcmVxdWVzdFVyaS5nZXRQb3J0KCkgOiAiaHR0cHMiLmVxdWFscyhyZXF1ZXN0VXJpLmdldFNjaGVtZSgpKSA/IDQ0MyA6IDgwOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBCb290c3RyYXAgYiA9IG5ldyBCb290c3RyYXAoKTsKKyAgICAgICAgICAgIGIuZ3JvdXAoZ3JvdXApCisgICAgICAgICAgICAgLmNoYW5uZWwoTmlvU29ja2V0Q2hhbm5lbC5jbGFzcykKKyAgICAgICAgICAgICAuaGFuZGxlcihuZXcgQ2hhbm5lbEluaXRpYWxpemVyPFNvY2tldENoYW5uZWw+KCkgeworICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgaW5pdENoYW5uZWwoU29ja2V0Q2hhbm5lbCBjaCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgICBDaGFubmVsUGlwZWxpbmUgcCA9IGNoLnBpcGVsaW5lKCk7CisKKyAgICAgICAgICAgICAgICAgICAgIC8vIEVuYWJsZSBIVFRQUyBpZiBuZWNlc3NhcnkuCisgICAgICAgICAgICAgICAgICAgICBpZiAoImh0dHBzIi5lcXVhbHMocmVxdWVzdFVyaS5nZXRTY2hlbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYWtpbmcgY2xpZW50IGF1dGhlbnRpY2F0aW9uIG9wdGlvbmFsIGZvciBub3c7IGl0IGNvdWxkIGJlIGV4dHJhY3RlZCB0byBjb25maWd1cmFibGUgcHJvcGVydHkKKyAgICAgICAgICAgICAgICAgICAgICAgICBKZGtTc2xDb250ZXh0IGpka1NzbENvbnRleHQgPSBuZXcgSmRrU3NsQ29udGV4dChjbGllbnQuZ2V0U3NsQ29udGV4dCgpLCB0cnVlLCBDbGllbnRBdXRoLk5PTkUpOworICAgICAgICAgICAgICAgICAgICAgICAgIHAuYWRkTGFzdChqZGtTc2xDb250ZXh0Lm5ld0hhbmRsZXIoY2guYWxsb2MoKSkpOworICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAvLyBodHRwIHByb3h5CisgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uIGNvbmZpZyA9IGplcnNleVJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHByb3h5VXJpID0gY29uZmlnLmdldFByb3BlcnRpZXMoKS5nZXQoQ2xpZW50UHJvcGVydGllcy5QUk9YWV9VUkkpOworICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3h5VXJpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBVUkkgdSA9IGdldFByb3h5VXJpKHByb3h5VXJpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB1c2VyTmFtZSA9IENsaWVudFByb3BlcnRpZXMuZ2V0VmFsdWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuZ2V0UHJvcGVydGllcygpLCBDbGllbnRQcm9wZXJ0aWVzLlBST1hZX1VTRVJOQU1FLCBTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwYXNzd29yZCA9IENsaWVudFByb3BlcnRpZXMuZ2V0VmFsdWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuZ2V0UHJvcGVydGllcygpLCBDbGllbnRQcm9wZXJ0aWVzLlBST1hZX1BBU1NXT1JELCBTdHJpbmcuY2xhc3MpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgcC5hZGRMYXN0KG5ldyBIdHRwUHJveHlIYW5kbGVyKG5ldyBJbmV0U29ja2V0QWRkcmVzcyh1LmdldEhvc3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHUuZ2V0UG9ydCgpID09IC0xID8gODA4MCA6IHUuZ2V0UG9ydCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlck5hbWUsIHBhc3N3b3JkKSk7CisgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgIHAuYWRkTGFzdChuZXcgSHR0cENsaWVudENvZGVjKCkpOworICAgICAgICAgICAgICAgICAgICAgcC5hZGRMYXN0KG5ldyBDaHVua2VkV3JpdGVIYW5kbGVyKCkpOworICAgICAgICAgICAgICAgICAgICAgcC5hZGRMYXN0KG5ldyBIdHRwQ29udGVudERlY29tcHJlc3NvcigpKTsKKyAgICAgICAgICAgICAgICAgICAgIHAuYWRkTGFzdChuZXcgSmVyc2V5Q2xpZW50SGFuZGxlcihOZXR0eUNvbm5lY3Rvci50aGlzLCBqZXJzZXlSZXF1ZXN0LCBqZXJzZXlDYWxsYmFjaywgc2V0dGFibGVGdXR1cmUpKTsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAvLyBjb25uZWN0IHRpbWVvdXQKKyAgICAgICAgICAgIEludGVnZXIgY29ubmVjdFRpbWVvdXQgPSBDbGllbnRQcm9wZXJ0aWVzLmdldFZhbHVlKGplcnNleVJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnRpZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudFByb3BlcnRpZXMuQ09OTkVDVF9USU1FT1VULCAwKTsKKyAgICAgICAgICAgIGlmIChjb25uZWN0VGltZW91dCA+IDApIHsKKyAgICAgICAgICAgICAgICBiLm9wdGlvbihDaGFubmVsT3B0aW9uLkNPTk5FQ1RfVElNRU9VVF9NSUxMSVMsIGNvbm5lY3RUaW1lb3V0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gTWFrZSB0aGUgY29ubmVjdGlvbiBhdHRlbXB0LgorICAgICAgICAgICAgZmluYWwgQ2hhbm5lbCBjaCA9IGIuY29ubmVjdChob3N0LCBwb3J0KS5zeW5jKCkuY2hhbm5lbCgpOworCisgICAgICAgICAgICAvLyBndWFyZCBhZ2FpbnN0IHByZW1hdHVyZWx5IGNsb3NlZCBjaGFubmVsCisgICAgICAgICAgICBmaW5hbCBHZW5lcmljRnV0dXJlTGlzdGVuZXI8aW8ubmV0dHkudXRpbC5jb25jdXJyZW50LkZ1dHVyZTw/IHN1cGVyIFZvaWQ+PiBjbG9zZUxpc3RlbmVyID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IEdlbmVyaWNGdXR1cmVMaXN0ZW5lcjxpby5uZXR0eS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlPD8gc3VwZXIgVm9pZD4+KCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvcGVyYXRpb25Db21wbGV0ZShpby5uZXR0eS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlPD8gc3VwZXIgVm9pZD4gZnV0dXJlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNldHRhYmxlRnV0dXJlLmlzRG9uZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldHRhYmxlRnV0dXJlLmNvbXBsZXRlRXhjZXB0aW9uYWxseShuZXcgSU9FeGNlcHRpb24oIkNoYW5uZWwgY2xvc2VkLiIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGNoLmNsb3NlRnV0dXJlKCkuYWRkTGlzdGVuZXIoY2xvc2VMaXN0ZW5lcik7CisKKyAgICAgICAgICAgIEh0dHBSZXF1ZXN0IG5ldHR5UmVxdWVzdDsKKworICAgICAgICAgICAgaWYgKGplcnNleVJlcXVlc3QuaGFzRW50aXR5KCkpIHsKKyAgICAgICAgICAgICAgICBuZXR0eVJlcXVlc3QgPSBuZXcgRGVmYXVsdEh0dHBSZXF1ZXN0KEh0dHBWZXJzaW9uLkhUVFBfMV8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSHR0cE1ldGhvZC52YWx1ZU9mKGplcnNleVJlcXVlc3QuZ2V0TWV0aG9kKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFVyaS5nZXRSYXdQYXRoKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBuZXR0eVJlcXVlc3QgPSBuZXcgRGVmYXVsdEZ1bGxIdHRwUmVxdWVzdChIdHRwVmVyc2lvbi5IVFRQXzFfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwTWV0aG9kLnZhbHVlT2YoamVyc2V5UmVxdWVzdC5nZXRNZXRob2QoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFVyaS5nZXRSYXdQYXRoKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBoZWFkZXJzCisgICAgICAgICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZSA6IGplcnNleVJlcXVlc3QuZ2V0U3RyaW5nSGVhZGVycygpLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBuZXR0eVJlcXVlc3QuaGVhZGVycygpLmFkZChlLmdldEtleSgpLCBlLmdldFZhbHVlKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBob3N0IGhlYWRlciAtIGh0dHAgMS4xCisgICAgICAgICAgICBuZXR0eVJlcXVlc3QuaGVhZGVycygpLmFkZChIdHRwSGVhZGVyTmFtZXMuSE9TVCwgamVyc2V5UmVxdWVzdC5nZXRVcmkoKS5nZXRIb3N0KCkpOworCisgICAgICAgICAgICBpZiAoamVyc2V5UmVxdWVzdC5oYXNFbnRpdHkoKSkgeworICAgICAgICAgICAgICAgIGlmIChqZXJzZXlSZXF1ZXN0LmdldExlbmd0aExvbmcoKSA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBIdHRwVXRpbC5zZXRUcmFuc2ZlckVuY29kaW5nQ2h1bmtlZChuZXR0eVJlcXVlc3QsIHRydWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG5ldHR5UmVxdWVzdC5oZWFkZXJzKCkuYWRkKEh0dHBIZWFkZXJOYW1lcy5DT05URU5UX0xFTkdUSCwgamVyc2V5UmVxdWVzdC5nZXRMZW5ndGhMb25nKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGplcnNleVJlcXVlc3QuaGFzRW50aXR5KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBTZW5kIHRoZSBIVFRQIHJlcXVlc3QuCisgICAgICAgICAgICAgICAgY2gud3JpdGVBbmRGbHVzaChuZXR0eVJlcXVlc3QpOworCisgICAgICAgICAgICAgICAgZmluYWwgSmVyc2V5Q2h1bmtlZElucHV0IGplcnNleUNodW5rZWRJbnB1dCA9IG5ldyBKZXJzZXlDaHVua2VkSW5wdXQoY2gpOworICAgICAgICAgICAgICAgIGplcnNleVJlcXVlc3Quc2V0U3RyZWFtUHJvdmlkZXIobmV3IE91dGJvdW5kTWVzc2FnZUNvbnRleHQuU3RyZWFtUHJvdmlkZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbShpbnQgY29udGVudExlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBqZXJzZXlDaHVua2VkSW5wdXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgIGlmIChIdHRwVXRpbC5pc1RyYW5zZmVyRW5jb2RpbmdDaHVua2VkKG5ldHR5UmVxdWVzdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2gud3JpdGUobmV3IEh0dHBDaHVua2VkSW5wdXQoamVyc2V5Q2h1bmtlZElucHV0KSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY2gud3JpdGUoamVyc2V5Q2h1bmtlZElucHV0KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBleGVjdXRvclNlcnZpY2UuZXhlY3V0ZShuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjbG9zZSBsaXN0ZW5lciBpcyBub3QgbmVlZGVkIGFueSBtb3JlLgorICAgICAgICAgICAgICAgICAgICAgICAgY2guY2xvc2VGdXR1cmUoKS5yZW1vdmVMaXN0ZW5lcihjbG9zZUxpc3RlbmVyKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqZXJzZXlSZXF1ZXN0LndyaXRlRW50aXR5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgamVyc2V5Q2FsbGJhY2suZmFpbHVyZShlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0YWJsZUZ1dHVyZS5jb21wbGV0ZUV4Y2VwdGlvbmFsbHkoZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgIGNoLmZsdXNoKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGNsb3NlIGxpc3RlbmVyIGlzIG5vdCBuZWVkZWQgYW55IG1vcmUuCisgICAgICAgICAgICAgICAgY2guY2xvc2VGdXR1cmUoKS5yZW1vdmVMaXN0ZW5lcihjbG9zZUxpc3RlbmVyKTsKKworICAgICAgICAgICAgICAgIC8vIFNlbmQgdGhlIEhUVFAgcmVxdWVzdC4KKyAgICAgICAgICAgICAgICBjaC53cml0ZUFuZEZsdXNoKG5ldHR5UmVxdWVzdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgc2V0dGFibGVGdXR1cmUuY29tcGxldGVFeGNlcHRpb25hbGx5KGUpOworICAgICAgICAgICAgcmV0dXJuIHNldHRhYmxlRnV0dXJlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNldHRhYmxlRnV0dXJlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICJOZXR0eSA0LjEueCI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIGdyb3VwLnNodXRkb3duR3JhY2VmdWxseSgpOworICAgICAgICBleGVjdXRvclNlcnZpY2Uuc2h1dGRvd24oKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiQ2hhaW5PZkluc3RhbmNlb2ZDaGVja3MiKQorICAgIHByaXZhdGUgc3RhdGljIFVSSSBnZXRQcm94eVVyaShmaW5hbCBPYmplY3QgcHJveHkpIHsKKyAgICAgICAgaWYgKHByb3h5IGluc3RhbmNlb2YgVVJJKSB7CisgICAgICAgICAgICByZXR1cm4gKFVSSSkgcHJveHk7CisgICAgICAgIH0gZWxzZSBpZiAocHJveHkgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgICAgICAgIHJldHVybiBVUkkuY3JlYXRlKChTdHJpbmcpIHByb3h5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLldST05HX1BST1hZX1VSSV9UWVBFKENsaWVudFByb3BlcnRpZXMuUFJPWFlfVVJJKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL25ldHR5LWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L25ldHR5L2Nvbm5lY3Rvci9OZXR0eUNvbm5lY3RvclByb3ZpZGVyLmphdmEgYi9jb25uZWN0b3JzL25ldHR5LWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L25ldHR5L2Nvbm5lY3Rvci9OZXR0eUNvbm5lY3RvclByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDcxNmY2NwotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvbmV0dHktY29ubmVjdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbmV0dHkvY29ubmVjdG9yL05ldHR5Q29ubmVjdG9yUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm5ldHR5LmNvbm5lY3RvcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuQmV0YTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuc3BpLkNvbm5lY3RvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuc3BpLkNvbm5lY3RvclByb3ZpZGVyOworCisvKioKKyAqIE5ldHR5IHByb3ZpZGVyIGZvciBKZXJzZXkge0BsaW5rIENvbm5lY3RvciBjb25uZWN0b3JzfS4KKyAqIDxwPgorICogVGhlIGZvbGxvd2luZyBjb25uZWN0b3IgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGFyZSBzdXBwb3J0ZWQ6CisgKiA8dWw+CisgKiA8bGk+e0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzI0NPTk5FQ1RfVElNRU9VVH08L2xpPgorICogPGxpPntAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllcyNSRUFEX1RJTUVPVVR9PC9saT4KKyAqIDxsaT57QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXMjUFJPWFlfVVJJfTwvbGk+CisgKiA8bGk+e0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzI1BST1hZX1VTRVJOQU1FfTwvbGk+CisgKiA8bGk+e0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzI1BST1hZX1BBU1NXT1JEfTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICogPHA+CisgKiBJZiBhIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UmVzcG9uc2V9IGlzIG9idGFpbmVkIGFuZCBhbiBlbnRpdHkgaXMgbm90IHJlYWQgZnJvbSB0aGUgcmVzcG9uc2UgdGhlbgorICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRSZXNwb25zZSNjbG9zZSgpfSBNVVNUIGJlIGNhbGxlZCBhZnRlciBwcm9jZXNzaW5nIHRoZSByZXNwb25zZSB0byByZWxlYXNlCisgKiBjb25uZWN0aW9uLWJhc2VkIHJlc291cmNlcy4KKyAqIDwvcD4KKyAqIDxwPgorICogSWYgYSByZXNwb25zZSBlbnRpdHkgaXMgb2J0YWluZWQgdGhhdCBpcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgamF2YS5pby5DbG9zZWFibGV9ICB0aGVuIHRoZSBpbnN0YW5jZSBNVVNUCisgKiBiZSBjbG9zZWQgYWZ0ZXIgcHJvY2Vzc2luZyB0aGUgZW50aXR5IHRvIHJlbGVhc2UgY29ubmVjdGlvbi1iYXNlZCByZXNvdXJjZXMuCisgKiA8cC8+CisgKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBzaW5jZSAyLjI0CisgKi8KK0BCZXRhCitwdWJsaWMgY2xhc3MgTmV0dHlDb25uZWN0b3JQcm92aWRlciBpbXBsZW1lbnRzIENvbm5lY3RvclByb3ZpZGVyIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb25uZWN0b3IgZ2V0Q29ubmVjdG9yKENsaWVudCBjbGllbnQsIENvbmZpZ3VyYXRpb24gcnVudGltZUNvbmZpZykgeworICAgICAgICByZXR1cm4gbmV3IE5ldHR5Q29ubmVjdG9yKGNsaWVudCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9uZXR0eS1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9uZXR0eS9jb25uZWN0b3IvaW50ZXJuYWwvSmVyc2V5Q2h1bmtlZElucHV0LmphdmEgYi9jb25uZWN0b3JzL25ldHR5LWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L25ldHR5L2Nvbm5lY3Rvci9pbnRlcm5hbC9KZXJzZXlDaHVua2VkSW5wdXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWE5NjkzCi0tLSAvZGV2L251bGwKKysrIGIvY29ubmVjdG9ycy9uZXR0eS1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9uZXR0eS9jb25uZWN0b3IvaW50ZXJuYWwvSmVyc2V5Q2h1bmtlZElucHV0LmphdmEKQEAgLTAsMCArMSwyMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubmV0dHkuY29ubmVjdG9yLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkxpbmtlZEJsb2NraW5nRGVxdWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBpby5uZXR0eS5idWZmZXIuQnl0ZUJ1ZjsKK2ltcG9ydCBpby5uZXR0eS5idWZmZXIuQnl0ZUJ1ZkFsbG9jYXRvcjsKK2ltcG9ydCBpby5uZXR0eS5idWZmZXIuVW5wb29sZWQ7CitpbXBvcnQgaW8ubmV0dHkuY2hhbm5lbC5DaGFubmVsOworaW1wb3J0IGlvLm5ldHR5LmNoYW5uZWwuQ2hhbm5lbEZ1dHVyZTsKK2ltcG9ydCBpby5uZXR0eS5jaGFubmVsLkNoYW5uZWxGdXR1cmVMaXN0ZW5lcjsKK2ltcG9ydCBpby5uZXR0eS5jaGFubmVsLkNoYW5uZWxIYW5kbGVyQ29udGV4dDsKK2ltcG9ydCBpby5uZXR0eS5oYW5kbGVyLnN0cmVhbS5DaHVua2VkSW5wdXQ7CisKKy8qKgorICogTmV0dHkge0BsaW5rIENodW5rZWRJbnB1dH0gaW1wbGVtZW50YXRpb24gd2hpY2ggYWxzbyBzZXJ2ZXMgYXMgYW4gb3V0cHV0CisgKiBzdHJlYW0gdG8gSmVyc2V5IHtAbGluayBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0fS4KKyAqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSmVyc2V5Q2h1bmtlZElucHV0IGV4dGVuZHMgT3V0cHV0U3RyZWFtIGltcGxlbWVudHMgQ2h1bmtlZElucHV0PEJ5dGVCdWY+LCBDaGFubmVsRnV0dXJlTGlzdGVuZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQnl0ZUJ1ZmZlciBWT0lEID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgwKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0FQQUNJVFkgPSA4OworICAgIC8vIFRPRE8gdGhpcyBuZWVkcyB0byBiZSBjb25maWd1cmFibGUsIHNlZSBKRVJTRVktMzIyOAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXUklURV9USU1FT1VUID0gMTAwMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFQURfVElNRU9VVCA9IDEwMDAwOworCisgICAgcHJpdmF0ZSBmaW5hbCBMaW5rZWRCbG9ja2luZ0RlcXVlPEJ5dGVCdWZmZXI+IHF1ZXVlID0gbmV3IExpbmtlZEJsb2NraW5nRGVxdWU8PihDQVBBQ0lUWSk7CisgICAgcHJpdmF0ZSBmaW5hbCBDaGFubmVsIGN0eDsKKyAgICBwcml2YXRlIGZpbmFsIENoYW5uZWxGdXR1cmUgZnV0dXJlOworCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIG9wZW4gPSB0cnVlOworICAgIHByaXZhdGUgdm9sYXRpbGUgbG9uZyBvZmZzZXQgPSAwOworCisgICAgcHVibGljIEplcnNleUNodW5rZWRJbnB1dChDaGFubmVsIGN0eCkgeworICAgICAgICB0aGlzLmN0eCA9IGN0eDsKKyAgICAgICAgdGhpcy5mdXR1cmUgPSBjdHguY2xvc2VGdXR1cmUoKTsKKyAgICAgICAgdGhpcy5mdXR1cmUuYWRkTGlzdGVuZXIodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNFbmRPZklucHV0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghb3BlbikgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBCeXRlQnVmZmVyIHBlZWsgPSBxdWV1ZS5wZWVrKCk7CisKKyAgICAgICAgaWYgKChwZWVrICE9IG51bGwgJiYgcGVlayA9PSBWT0lEKSkgeworICAgICAgICAgICAgcXVldWUucmVtb3ZlKCk7IC8vIFZPSUQgZnJvbSB0aGUgdG9wLgorICAgICAgICAgICAgb3BlbiA9IGZhbHNlOworICAgICAgICAgICAgcmVtb3ZlQ2xvc2VMaXN0ZW5lcigpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb3BlcmF0aW9uQ29tcGxldGUoQ2hhbm5lbEZ1dHVyZSBmKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gZm9yY2libHkgY2xvc2VkIGNvbm5lY3Rpb24uCisgICAgICAgIG9wZW4gPSBmYWxzZTsKKyAgICAgICAgcXVldWUuY2xlYXIoKTsKKworICAgICAgICBjbG9zZSgpOworICAgICAgICByZW1vdmVDbG9zZUxpc3RlbmVyKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlbW92ZUNsb3NlTGlzdGVuZXIoKSB7CisgICAgICAgIGlmIChmdXR1cmUgIT0gbnVsbCkgeworICAgICAgICAgICAgZnV0dXJlLnJlbW92ZUxpc3RlbmVyKHRoaXMpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgQnl0ZUJ1ZiByZWFkQ2h1bmsoQ2hhbm5lbEhhbmRsZXJDb250ZXh0IGN0eCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiByZWFkQ2h1bmsoY3R4LmFsbG9jKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCeXRlQnVmIHJlYWRDaHVuayhCeXRlQnVmQWxsb2NhdG9yIGFsbG9jYXRvcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKCFvcGVuKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEJ5dGVCdWZmZXIgdG9wID0gcXVldWUucG9sbChSRUFEX1RJTUVPVVQsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisKKyAgICAgICAgaWYgKHRvcCA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyByZXR1cm5pbmcgZW1wdHkgYnVmZmVyIGluc3RlYWQgb2YgbnVsbCBjYXVzZXMgZmx1c2ggKHdoaWNoIGlzIG5lZWRlZCBmb3IgQnJvYWRjYXN0ZXJUZXN0IGFuZCBvdGhlcnMuLikuCisgICAgICAgICAgICByZXR1cm4gVW5wb29sZWQuRU1QVFlfQlVGRkVSOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRvcCA9PSBWT0lEKSB7CisgICAgICAgICAgICBvcGVuID0gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGludCB0b3BSZW1haW5pbmcgPSB0b3AucmVtYWluaW5nKCk7CisgICAgICAgIEJ5dGVCdWYgYnVmZmVyID0gYWxsb2NhdG9yLmJ1ZmZlcih0b3BSZW1haW5pbmcpOworCisgICAgICAgIGJ1ZmZlci5zZXRCeXRlcygwLCB0b3ApOworICAgICAgICBidWZmZXIuc2V0SW5kZXgoMCwgdG9wUmVtYWluaW5nKTsKKworICAgICAgICBpZiAodG9wLnJlbWFpbmluZygpID4gMCkgeworICAgICAgICAgICAgcXVldWUuYWRkRmlyc3QodG9wKTsKKyAgICAgICAgfQorCisgICAgICAgIG9mZnNldCArPSB0b3BSZW1haW5pbmc7CisKKyAgICAgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBsZW5ndGgoKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBwcm9ncmVzcygpIHsKKyAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKHF1ZXVlLnNpemUoKSA9PSBDQVBBQ0lUWSkgeworICAgICAgICAgICAgYm9vbGVhbiBvZmZlciA9IGZhbHNlOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG9mZmVyID0gcXVldWUub2ZmZXIoVk9JRCwgV1JJVEVfVElNRU9VVCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBpZ25vcmUuCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghb2ZmZXIpIHsKKyAgICAgICAgICAgICAgICBxdWV1ZS5yZW1vdmVMYXN0KCk7CisgICAgICAgICAgICAgICAgcXVldWUuYWRkKFZPSUQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcXVldWUuYWRkKFZPSUQpOworICAgICAgICB9CisKKyAgICAgICAgY3R4LmZsdXNoKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGUoZmluYWwgaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgd3JpdGUobmV3IFByb3ZpZGVyPEJ5dGVCdWZmZXI+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJ5dGVCdWZmZXIud3JhcChuZXcgYnl0ZVtdeyhieXRlKSBifSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlKGZpbmFsIGJ5dGVbXSBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB3cml0ZShiLCAwLCBiLmxlbmd0aCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGUoZmluYWwgYnl0ZVtdIGIsIGZpbmFsIGludCBvZmYsIGZpbmFsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgZmluYWwgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbbGVuXTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShiLCBvZmYsIGJ5dGVzLCAwLCBsZW4pOworCisgICAgICAgIHdyaXRlKG5ldyBQcm92aWRlcjxCeXRlQnVmZmVyPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEJ5dGVCdWZmZXIgZ2V0KCkgeworICAgICAgICAgICAgICAgIHJldHVybiBCeXRlQnVmZmVyLndyYXAoYnl0ZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGN0eC5mbHVzaCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB3cml0ZShQcm92aWRlcjxCeXRlQnVmZmVyPiBidWZmZXJTdXBwbGllcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBjaGVja0Nsb3NlZCgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBib29sZWFuIHF1ZXVlZCA9IHF1ZXVlLm9mZmVyKGJ1ZmZlclN1cHBsaWVyLmdldCgpLCBXUklURV9USU1FT1VULCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICAgICAgaWYgKCFxdWV1ZWQpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkJ1ZmZlciBvdmVyZmxvdy4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tDbG9zZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoIW9wZW4pIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiU3RyZWFtIGFscmVhZHkgY2xvc2VkLiIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9uZXR0eS1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9uZXR0eS9jb25uZWN0b3IvaW50ZXJuYWwvTmV0dHlJbnB1dFN0cmVhbS5qYXZhIGIvY29ubmVjdG9ycy9uZXR0eS1jb25uZWN0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9uZXR0eS9jb25uZWN0b3IvaW50ZXJuYWwvTmV0dHlJbnB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmZjQ3ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL25ldHR5LWNvbm5lY3Rvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L25ldHR5L2Nvbm5lY3Rvci9pbnRlcm5hbC9OZXR0eUlucHV0U3RyZWFtLmphdmEKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubmV0dHkuY29ubmVjdG9yLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkxpbmtlZEJsb2NraW5nRGVxdWU7CisKKy8qKgorICogSW5wdXQgc3RyZWFtIHdoaWNoIHNlcnZlcnMgYXMgUmVxdWVzdCBlbnRpdHkgaW5wdXQuCisgKiA8cD4KKyAqIENvbnZlcnRzIE5ldHR5IE5JTyBidWZmZXJzIHRvIGFuIGlucHV0IHN0cmVhbXMgYW5kIHN0b3JlcyB0aGVtIGluIHRoZSBxdWV1ZSwKKyAqIHdhaXRpbmcgZm9yIEplcnNleSB0byBwcm9jZXNzIGl0LgorICoKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBOZXR0eUlucHV0U3RyZWFtIGV4dGVuZHMgSW5wdXRTdHJlYW0geworCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGVuZCA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogRW5kIG9mIGlucHV0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgSW5wdXRTdHJlYW0gRU5EX09GX0lOUFVUID0gbmV3IElucHV0U3RyZWFtKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIkVORF9PRl9JTlBVVCAiICsgc3VwZXIudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBVbmV4cGVjdGVkIGVuZCBvZiBpbnB1dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIElucHV0U3RyZWFtIEVORF9PRl9JTlBVVF9FUlJPUiA9IG5ldyBJbnB1dFN0cmVhbSgpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJFTkRfT0ZfSU5QVVRfRVJST1IgIiArIHN1cGVyLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBmaW5hbCBMaW5rZWRCbG9ja2luZ0RlcXVlPElucHV0U3RyZWFtPiBpc0xpc3Q7CisKKyAgICBwdWJsaWMgTmV0dHlJbnB1dFN0cmVhbShMaW5rZWRCbG9ja2luZ0RlcXVlPElucHV0U3RyZWFtPiBpc0xpc3QpIHsKKyAgICAgICAgdGhpcy5pc0xpc3QgPSBpc0xpc3Q7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGlmIChlbmQpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIElucHV0U3RyZWFtIHRha2U7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0YWtlID0gaXNMaXN0LnRha2UoKTsKKworICAgICAgICAgICAgaWYgKGNoZWNrRW5kT2ZJbnB1dCh0YWtlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IHJlYWQgPSB0YWtlLnJlYWQoYiwgb2ZmLCBsZW4pOworCisgICAgICAgICAgICBpZiAodGFrZS5hdmFpbGFibGUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBpc0xpc3QuYWRkRmlyc3QodGFrZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiByZWFkOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkludGVycnVwdGVkLiIsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoZW5kKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgSW5wdXRTdHJlYW0gdGFrZSA9IGlzTGlzdC50YWtlKCk7CisKKyAgICAgICAgICAgIGlmIChjaGVja0VuZE9mSW5wdXQodGFrZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCByZWFkID0gdGFrZS5yZWFkKCk7CisKKyAgICAgICAgICAgIGlmICh0YWtlLmF2YWlsYWJsZSgpID4gMCkgeworICAgICAgICAgICAgICAgIGlzTGlzdC5hZGRGaXJzdCh0YWtlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHJlYWQ7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiSW50ZXJydXB0ZWQuIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGF2YWlsYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIElucHV0U3RyZWFtIHBlZWsgPSBpc0xpc3QucGVlaygpOworICAgICAgICBpZiAocGVlayAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gcGVlay5hdmFpbGFibGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja0VuZE9mSW5wdXQoSW5wdXRTdHJlYW0gdGFrZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHRha2UgPT0gRU5EX09GX0lOUFVUKSB7CisgICAgICAgICAgICBlbmQgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAodGFrZSA9PSBFTkRfT0ZfSU5QVVRfRVJST1IpIHsKKyAgICAgICAgICAgIGVuZCA9IHRydWU7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkNvbm5lY3Rpb24gd2FzIGNsb3NlZCBwcmVtYXR1cmVseS4iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9uZXR0eS1jb25uZWN0b3Ivc3JjL21haW4vcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L25ldHR5L2Nvbm5lY3Rvci9sb2NhbGl6YXRpb24ucHJvcGVydGllcyBiL2Nvbm5lY3RvcnMvbmV0dHktY29ubmVjdG9yL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9uZXR0eS9jb25uZWN0b3IvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQwMzMwNwotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvbmV0dHktY29ubmVjdG9yL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9uZXR0eS9jb25uZWN0b3IvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNyBAQAorIworIyBDb3B5cmlnaHQgKGMpIDIwMTYsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisjIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyMKKyMgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorIyBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisjIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorIyB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisjCisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorIworCit3cm9uZy5wcm94eS51cmkudHlwZT1UaGUgcHJveHkgVVJJICgiezB9IikgcHJvcGVydHkgTVVTVCBiZSBhbiBpbnN0YW5jZSBvZiBTdHJpbmcgb3IgVVJJLgpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9uZXR0eS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9uZXR0eS9jb25uZWN0b3IvQXN5bmNUZXN0LmphdmEgYi9jb25uZWN0b3JzL25ldHR5LWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L25ldHR5L2Nvbm5lY3Rvci9Bc3luY1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjM3Nzg0Ci0tLSAvZGV2L251bGwKKysrIGIvY29ubmVjdG9ycy9uZXR0eS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9uZXR0eS9jb25uZWN0b3IvQXN5bmNUZXN0LmphdmEKQEAgLTAsMCArMSwxOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubmV0dHkuY29ubmVjdG9yOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQXN5bmNSZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuU3VzcGVuZGVkOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5UaW1lb3V0SGFuZGxlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnM7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogQXN5bmNocm9ub3VzIGNvbm5lY3RvciB0ZXN0LgorICoKKyAqIEBhdXRob3IgQXJ1bCBEaGVzaWFzZWVsYW4gKGFydWxkIGF0IGFjbS5vcmcpCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQXN5bmNUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihBc3luY1Rlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSCA9ICJhc3luYyI7CisKKyAgICAvKioKKyAgICAgKiBBc3luY2hyb25vdXMgdGVzdCByZXNvdXJjZS4KKyAgICAgKi8KKyAgICBAUGF0aChQQVRIKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQXN5bmNSZXNvdXJjZSB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFR5cGljYWwgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbiBkdXJhdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBPUEVSQVRJT05fRFVSQVRJT04gPSAxMDAwOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBMb25nLXJ1bm5pbmcgYXN5bmNocm9ub3VzIHBvc3QuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhc3luY1Jlc3BvbnNlIGFzeW5jIHJlc3BvbnNlLgorICAgICAgICAgKiBAcGFyYW0gaWQgICAgICAgICAgICBwb3N0IHJlcXVlc3QgaWQgKHJlY2VpdmVkIGFzIHJlcXVlc3QgcGF5bG9hZCkuCisgICAgICAgICAqLworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgdm9pZCBhc3luY1Bvc3QoQFN1c3BlbmRlZCBmaW5hbCBBc3luY1Jlc3BvbnNlIGFzeW5jUmVzcG9uc2UsIGZpbmFsIFN0cmluZyBpZCkgeworICAgICAgICAgICAgTE9HR0VSLmluZm8oIkxvbmcgcnVubmluZyBwb3N0IG9wZXJhdGlvbiBjYWxsZWQgd2l0aCBpZCAiICsgaWQgKyAiIG9uIHRocmVhZCAiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQgPSB2ZXJ5RXhwZW5zaXZlT3BlcmF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIGFzeW5jUmVzcG9uc2UucmVzdW1lKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdmVyeUV4cGVuc2l2ZU9wZXJhdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4uIHZlcnkgZXhwZW5zaXZlIG9wZXJhdGlvbiB0aGF0IHR5cGljYWxseSBmaW5pc2hlcyB3aXRoaW4gMSBzZWNvbmRzLCBzaW11bGF0ZWQgdXNpbmcgc2xlZXAoKQorICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKE9QRVJBVElPTl9EVVJBVElPTik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRPTkUtIiArIGlkOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJJTlRFUlJVUFRFRC0iICsgaWQ7CisgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dHRVIuaW5mbygiTG9uZyBydW5uaW5nIHBvc3Qgb3BlcmF0aW9uIGZpbmlzaGVkIG9uIHRocmVhZCAiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwgImFzeW5jLXBvc3QtcnVubmVyLSIgKyBpZCkuc3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBMb25nLXJ1bm5pbmcgYXN5bmMgZ2V0IHJlcXVlc3QgdGhhdCB0aW1lcyBvdXQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhc3luY1Jlc3BvbnNlIGFzeW5jIHJlc3BvbnNlLgorICAgICAgICAgKi8KKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgidGltZW91dCIpCisgICAgICAgIHB1YmxpYyB2b2lkIGFzeW5jR2V0V2l0aFRpbWVvdXQoQFN1c3BlbmRlZCBmaW5hbCBBc3luY1Jlc3BvbnNlIGFzeW5jUmVzcG9uc2UpIHsKKyAgICAgICAgICAgIExPR0dFUi5pbmZvKCJBc3luYyBsb25nLXJ1bm5pbmcgZ2V0IHdpdGggdGltZW91dCBjYWxsZWQgb24gdGhyZWFkICIgKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBhc3luY1Jlc3BvbnNlLnNldFRpbWVvdXRIYW5kbGVyKG5ldyBUaW1lb3V0SGFuZGxlcigpIHsKKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZVRpbWVvdXQoZmluYWwgQXN5bmNSZXNwb25zZSBhc3luY1Jlc3BvbnNlKSB7CisgICAgICAgICAgICAgICAgICAgIGFzeW5jUmVzcG9uc2UucmVzdW1lKFJlc3BvbnNlLnN0YXR1cyhSZXNwb25zZS5TdGF0dXMuU0VSVklDRV9VTkFWQUlMQUJMRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZW50aXR5KCJPcGVyYXRpb24gdGltZSBvdXQuIikuYnVpbGQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBhc3luY1Jlc3BvbnNlLnNldFRpbWVvdXQoMSwgVGltZVVuaXQuU0VDT05EUyk7CisKKyAgICAgICAgICAgIG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVzdWx0ID0gdmVyeUV4cGVuc2l2ZU9wZXJhdGlvbigpOworICAgICAgICAgICAgICAgICAgICBhc3luY1Jlc3BvbnNlLnJlc3VtZShyZXN1bHQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByaXZhdGUgU3RyaW5nIHZlcnlFeHBlbnNpdmVPcGVyYXRpb24oKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHZlcnkgZXhwZW5zaXZlIG9wZXJhdGlvbiB0aGF0IHR5cGljYWxseSBmaW5pc2hlcyB3aXRoaW4gMSBzZWNvbmQgYnV0IGNhbiB0YWtlIHVwIHRvIDUgc2Vjb25kcywKKyAgICAgICAgICAgICAgICAgICAgLy8gc2ltdWxhdGVkIHVzaW5nIHNsZWVwKCkKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCg1ICogT1BFUkFUSU9OX0RVUkFUSU9OKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRE9ORSI7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIklOVEVSUlVQVEVEIjsKKyAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi5pbmZvKCJBc3luYyBsb25nLXJ1bm5pbmcgZ2V0IHdpdGggdGltZW91dCBmaW5pc2hlZCBvbiB0aHJlYWQgIiArIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pLnN0YXJ0KCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoQXN5bmNSZXNvdXJjZS5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIobmV3IExvZ2dpbmdGZWF0dXJlKExPR0dFUiwgTG9nZ2luZ0ZlYXR1cmUuVmVyYm9zaXR5LlBBWUxPQURfQU5ZKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KGZpbmFsIENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKG5ldyBMb2dnaW5nRmVhdHVyZShMT0dHRVIsIExvZ2dpbmdGZWF0dXJlLlZlcmJvc2l0eS5QQVlMT0FEX0FOWSkpOworICAgICAgICBjb25maWcuY29ubmVjdG9yUHJvdmlkZXIobmV3IE5ldHR5Q29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBhc3luY2hyb25vdXMgUE9TVC4KKyAgICAgKiA8cC8+CisgICAgICogU2VuZCAzIGFzeW5jIFBPU1QgcmVxdWVzdHMgYW5kIHdhaXQgdG8gcmVjZWl2ZSB0aGUgcmVzcG9uc2VzLiBDaGVjayB0aGUgcmVzcG9uc2UgY29udGVudCBhbmQKKyAgICAgKiBhc3NlcnQgdGhhdCB0aGUgb3BlcmF0aW9uIGRpZCBub3QgdGFrZSBtb3JlIHRoYW4gdHdpY2UgYXMgbG9uZyBhcyBhIHNpbmdsZSBsb25nIG9wZXJhdGlvbiBkdXJhdGlvbgorICAgICAqICh0aGlzIGVuc3VyZXMgYXN5bmMgcmVxdWVzdCBleGVjdXRpb24pLgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRlc3QgZXJyb3IuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNQb3N0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGxvbmcgdGljID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKyAgICAgICAgLy8gU3VibWl0IHJlcXVlc3RzIGFzeW5jaHJvbm91c2x5LgorICAgICAgICBmaW5hbCBGdXR1cmU8UmVzcG9uc2U+IHJmMSA9IHRhcmdldChQQVRIKS5yZXF1ZXN0KCkuYXN5bmMoKS5wb3N0KEVudGl0eS50ZXh0KCIxIikpOworICAgICAgICBmaW5hbCBGdXR1cmU8UmVzcG9uc2U+IHJmMiA9IHRhcmdldChQQVRIKS5yZXF1ZXN0KCkuYXN5bmMoKS5wb3N0KEVudGl0eS50ZXh0KCIyIikpOworICAgICAgICBmaW5hbCBGdXR1cmU8UmVzcG9uc2U+IHJmMyA9IHRhcmdldChQQVRIKS5yZXF1ZXN0KCkuYXN5bmMoKS5wb3N0KEVudGl0eS50ZXh0KCIzIikpOworICAgICAgICAvLyBnZXQoKSB3YWl0cyBmb3IgdGhlIHJlc3BvbnNlCisgICAgICAgIGZpbmFsIFN0cmluZyByMSA9IHJmMS5nZXQoKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGZpbmFsIFN0cmluZyByMiA9IHJmMi5nZXQoKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGZpbmFsIFN0cmluZyByMyA9IHJmMy5nZXQoKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgZmluYWwgbG9uZyB0b2MgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIkRPTkUtMSIsIHIxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJET05FLTIiLCByMik7CisgICAgICAgIGFzc2VydEVxdWFscygiRE9ORS0zIiwgcjMpOworCisgICAgICAgIGFzc2VydFRoYXQoIkFzeW5jIHByb2Nlc3NpbmcgdG9vayB0b28gbG9uZy4iLCB0b2MgLSB0aWMsIE1hdGNoZXJzLmxlc3NUaGFuKDMgKiBBc3luY1Jlc291cmNlLk9QRVJBVElPTl9EVVJBVElPTikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgYWNjZXNzaW5nIGFuIG9wZXJhdGlvbiB0aGF0IHRpbWVzIG91dCBvbiB0aGUgc2VydmVyLgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRlc3QgZXJyb3IuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNHZXRXaXRoVGltZW91dCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBGdXR1cmU8UmVzcG9uc2U+IHJlc3BvbnNlRnV0dXJlID0gdGFyZ2V0KFBBVEgpLnBhdGgoInRpbWVvdXQiKS5yZXF1ZXN0KCkuYXN5bmMoKS5nZXQoKTsKKyAgICAgICAgLy8gUmVxdWVzdCBpcyBiZWluZyBwcm9jZXNzZWQgYXN5bmNocm9ub3VzbHkuCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gcmVzcG9uc2VGdXR1cmUuZ2V0KCk7CisKKyAgICAgICAgLy8gZ2V0KCkgd2FpdHMgZm9yIHRoZSByZXNwb25zZQorICAgICAgICBhc3NlcnRFcXVhbHMoNTAzLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiT3BlcmF0aW9uIHRpbWUgb3V0LiIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9uZXR0eS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9uZXR0eS9jb25uZWN0b3IvQ3VzdG9tTG9nZ2luZ0ZpbHRlci5qYXZhIGIvY29ubmVjdG9ycy9uZXR0eS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9uZXR0eS9jb25uZWN0b3IvQ3VzdG9tTG9nZ2luZ0ZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZGJjMmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL25ldHR5LWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L25ldHR5L2Nvbm5lY3Rvci9DdXN0b21Mb2dnaW5nRmlsdGVyLmphdmEKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5uZXR0eS5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVzcG9uc2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXNwb25zZUZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlc3BvbnNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQ3VzdG9tIGxvZ2dpbmcgZmlsdGVyLgorICoKKyAqIEBhdXRob3IgU2FudGlhZ28gUGVyaWNhcy1HZWVydHNlbiAoc2FudGlhZ28ucGVyaWNhc2dlZXJ0c2VuIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBDdXN0b21Mb2dnaW5nRmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciwgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXIsCisgICAgICAgIENsaWVudFJlcXVlc3RGaWx0ZXIsIENsaWVudFJlc3BvbnNlRmlsdGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEN1c3RvbUxvZ2dpbmdGaWx0ZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIHN0YXRpYyBpbnQgcHJlRmlsdGVyQ2FsbGVkID0gMDsKKyAgICBzdGF0aWMgaW50IHBvc3RGaWx0ZXJDYWxsZWQgPSAwOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZmlsdGVyKENsaWVudFJlcXVlc3RDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIExPR0dFUi5pbmZvKCJDdXN0b21Mb2dnaW5nRmlsdGVyLnByZUZpbHRlciBjYWxsZWQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnRleHQuZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnR5KCJmb28iKSwgImJhciIpOworICAgICAgICBwcmVGaWx0ZXJDYWxsZWQrKzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ2xpZW50UmVxdWVzdENvbnRleHQgY29udGV4dCwgQ2xpZW50UmVzcG9uc2VDb250ZXh0IGNsaWVudFJlc3BvbnNlQ29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgTE9HR0VSLmluZm8oIkN1c3RvbUxvZ2dpbmdGaWx0ZXIucG9zdEZpbHRlciBjYWxsZWQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnRleHQuZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnR5KCJmb28iKSwgImJhciIpOworICAgICAgICBwb3N0RmlsdGVyQ2FsbGVkKys7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIExPR0dFUi5pbmZvKCJDdXN0b21Mb2dnaW5nRmlsdGVyLnByZUZpbHRlciBjYWxsZWQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnRleHQuZ2V0UHJvcGVydHkoImZvbyIpLCAiYmFyIik7CisgICAgICAgIHByZUZpbHRlckNhbGxlZCsrOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCBjb250ZXh0LCBDb250YWluZXJSZXNwb25zZUNvbnRleHQgY29udGFpbmVyUmVzcG9uc2VDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBMT0dHRVIuaW5mbygiQ3VzdG9tTG9nZ2luZ0ZpbHRlci5wb3N0RmlsdGVyIGNhbGxlZCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoY29udGV4dC5nZXRQcm9wZXJ0eSgiZm9vIiksICJiYXIiKTsKKyAgICAgICAgcG9zdEZpbHRlckNhbGxlZCsrOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvbmV0dHktY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbmV0dHkvY29ubmVjdG9yL0hlbGxvV29ybGRUZXN0LmphdmEgYi9jb25uZWN0b3JzL25ldHR5LWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L25ldHR5L2Nvbm5lY3Rvci9IZWxsb1dvcmxkVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NjA1MzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL25ldHR5LWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L25ldHR5L2Nvbm5lY3Rvci9IZWxsb1dvcmxkVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjI1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm5ldHR5LmNvbm5lY3RvcjsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50Lkludm9jYXRpb25DYWxsYmFjazsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoSGVsbG9Xb3JsZFRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVF9QQVRIID0gImhlbGxvd29ybGQiOworCisgICAgQFBhdGgoImhlbGxvd29ybGQiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSGVsbG9Xb3JsZFJlc291cmNlIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJQ0hFRF9NRVNTQUdFID0gIkhlbGxvIFdvcmxkISI7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEhlbGxvKCkgeworICAgICAgICAgICAgcmV0dXJuIENMSUNIRURfTUVTU0FHRTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgUmVzb3VyY2VDb25maWcgY29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKEhlbGxvV29ybGRSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihuZXcgTG9nZ2luZ0ZlYXR1cmUoTE9HR0VSLCBMb2dnaW5nRmVhdHVyZS5WZXJib3NpdHkuUEFZTE9BRF9BTlkpKTsKKyAgICAgICAgcmV0dXJuIGNvbmZpZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcucHJvcGVydHkoQ2xpZW50UHJvcGVydGllcy5BU1lOQ19USFJFQURQT09MX1NJWkUsIDIwKTsKKyAgICAgICAgY29uZmlnLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBOZXR0eUNvbm5lY3RvclByb3ZpZGVyKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbm5lY3Rpb24oKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aChST09UX1BBVEgpLnJlcXVlc3QoInRleHQvcGxhaW4iKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsaWVudFN0cmluZ1Jlc3BvbnNlKCkgeworICAgICAgICBTdHJpbmcgcyA9IHRhcmdldCgpLnBhdGgoUk9PVF9QQVRIKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhIZWxsb1dvcmxkUmVzb3VyY2UuQ0xJQ0hFRF9NRVNTQUdFLCBzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luY0NsaWVudFJlcXVlc3RzKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgaW50IFJFUVVFU1RTID0gMjA7CisgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKFJFUVVFU1RTKTsKKyAgICAgICAgZmluYWwgbG9uZyB0aWMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBSRVFVRVNUUzsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgaWQgPSBpOworICAgICAgICAgICAgdGFyZ2V0KCkucGF0aChST09UX1BBVEgpLnJlcXVlc3QoKS5hc3luYygpLmdldChuZXcgSW52b2NhdGlvbkNhbGxiYWNrPFJlc3BvbnNlPigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBjb21wbGV0ZWQoUmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoSGVsbG9Xb3JsZFJlc291cmNlLkNMSUNIRURfTUVTU0FHRSwgcmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZmFpbGVkKFRocm93YWJsZSBlcnJvcikgeworICAgICAgICAgICAgICAgICAgICBlcnJvci5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZShsYXRjaC5hd2FpdCgxMCAqIGdldEFzeW5jVGltZW91dE11bHRpcGxpZXIoKSwgVGltZVVuaXQuU0VDT05EUykpOworICAgICAgICBmaW5hbCBsb25nIHRvYyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKEhlbGxvV29ybGRUZXN0LmNsYXNzLmdldE5hbWUoKSkuaW5mbygiRXhlY3V0ZWQgaW46ICIgKyAodG9jIC0gdGljKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVhZCgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKFJPT1RfUEFUSCkucmVxdWVzdCgpLmhlYWQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSwgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZvb0Jhck9wdGlvbnMoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aChST09UX1BBVEgpLnJlcXVlc3QoKS5oZWFkZXIoIkFjY2VwdCIsICJmb28vYmFyIikub3B0aW9ucygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBhbGxvd0hlYWRlciA9IHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiQWxsb3ciKTsKKyAgICAgICAgX2NoZWNrQWxsb3dDb250ZW50KGFsbG93SGVhZGVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28vYmFyIiwgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCByZXNwb25zZS5nZXRMZW5ndGgoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGV4dFBsYWluT3B0aW9ucygpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKFJPT1RfUEFUSCkucmVxdWVzdCgpLmhlYWRlcigiQWNjZXB0IiwgTWVkaWFUeXBlLlRFWFRfUExBSU4pLm9wdGlvbnMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBmaW5hbCBTdHJpbmcgYWxsb3dIZWFkZXIgPSByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIkFsbG93Iik7CisgICAgICAgIF9jaGVja0FsbG93Q29udGVudChhbGxvd0hlYWRlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXNwb25zZUJvZHkgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIF9jaGVja0FsbG93Q29udGVudChyZXNwb25zZUJvZHkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfY2hlY2tBbGxvd0NvbnRlbnQoZmluYWwgU3RyaW5nIGNvbnRlbnQpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb250ZW50LmNvbnRhaW5zKCJHRVQiKSk7CisgICAgICAgIGFzc2VydFRydWUoY29udGVudC5jb250YWlucygiSEVBRCIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb250ZW50LmNvbnRhaW5zKCJPUFRJT05TIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1pc3NpbmdSZXNvdXJjZU5vdEZvdW5kKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoUk9PVF9QQVRIICsgImFyYml0cmFyeSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwNCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICByZXNwb25zZS5jbG9zZSgpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aChST09UX1BBVEgpLnBhdGgoImFyYml0cmFyeSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwNCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICByZXNwb25zZS5jbG9zZSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvZ2dpbmdGaWx0ZXJDbGllbnRDbGFzcygpIHsKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IGNsaWVudCgpOworICAgICAgICBjbGllbnQucmVnaXN0ZXIoQ3VzdG9tTG9nZ2luZ0ZpbHRlci5jbGFzcykucHJvcGVydHkoImZvbyIsICJiYXIiKTsKKyAgICAgICAgQ3VzdG9tTG9nZ2luZ0ZpbHRlci5wcmVGaWx0ZXJDYWxsZWQgPSBDdXN0b21Mb2dnaW5nRmlsdGVyLnBvc3RGaWx0ZXJDYWxsZWQgPSAwOworICAgICAgICBTdHJpbmcgcyA9IHRhcmdldCgpLnBhdGgoUk9PVF9QQVRIKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhIZWxsb1dvcmxkUmVzb3VyY2UuQ0xJQ0hFRF9NRVNTQUdFLCBzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIEN1c3RvbUxvZ2dpbmdGaWx0ZXIucHJlRmlsdGVyQ2FsbGVkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIEN1c3RvbUxvZ2dpbmdGaWx0ZXIucG9zdEZpbHRlckNhbGxlZCk7CisgICAgICAgIGNsaWVudC5jbG9zZSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvZ2dpbmdGaWx0ZXJDbGllbnRJbnN0YW5jZSgpIHsKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IGNsaWVudCgpOworICAgICAgICBjbGllbnQucmVnaXN0ZXIobmV3IEN1c3RvbUxvZ2dpbmdGaWx0ZXIoKSkucHJvcGVydHkoImZvbyIsICJiYXIiKTsKKyAgICAgICAgQ3VzdG9tTG9nZ2luZ0ZpbHRlci5wcmVGaWx0ZXJDYWxsZWQgPSBDdXN0b21Mb2dnaW5nRmlsdGVyLnBvc3RGaWx0ZXJDYWxsZWQgPSAwOworICAgICAgICBTdHJpbmcgcyA9IHRhcmdldCgpLnBhdGgoUk9PVF9QQVRIKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhIZWxsb1dvcmxkUmVzb3VyY2UuQ0xJQ0hFRF9NRVNTQUdFLCBzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIEN1c3RvbUxvZ2dpbmdGaWx0ZXIucHJlRmlsdGVyQ2FsbGVkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIEN1c3RvbUxvZ2dpbmdGaWx0ZXIucG9zdEZpbHRlckNhbGxlZCk7CisgICAgICAgIGNsaWVudC5jbG9zZSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvZ2dpbmdGaWx0ZXJUYXJnZXRDbGFzcygpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpLnBhdGgoUk9PVF9QQVRIKTsKKyAgICAgICAgdGFyZ2V0LnJlZ2lzdGVyKEN1c3RvbUxvZ2dpbmdGaWx0ZXIuY2xhc3MpLnByb3BlcnR5KCJmb28iLCAiYmFyIik7CisgICAgICAgIEN1c3RvbUxvZ2dpbmdGaWx0ZXIucHJlRmlsdGVyQ2FsbGVkID0gQ3VzdG9tTG9nZ2luZ0ZpbHRlci5wb3N0RmlsdGVyQ2FsbGVkID0gMDsKKyAgICAgICAgU3RyaW5nIHMgPSB0YXJnZXQucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoSGVsbG9Xb3JsZFJlc291cmNlLkNMSUNIRURfTUVTU0FHRSwgcyk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBDdXN0b21Mb2dnaW5nRmlsdGVyLnByZUZpbHRlckNhbGxlZCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBDdXN0b21Mb2dnaW5nRmlsdGVyLnBvc3RGaWx0ZXJDYWxsZWQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvZ2dpbmdGaWx0ZXJUYXJnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpLnBhdGgoUk9PVF9QQVRIKTsKKyAgICAgICAgdGFyZ2V0LnJlZ2lzdGVyKG5ldyBDdXN0b21Mb2dnaW5nRmlsdGVyKCkpLnByb3BlcnR5KCJmb28iLCAiYmFyIik7CisgICAgICAgIEN1c3RvbUxvZ2dpbmdGaWx0ZXIucHJlRmlsdGVyQ2FsbGVkID0gQ3VzdG9tTG9nZ2luZ0ZpbHRlci5wb3N0RmlsdGVyQ2FsbGVkID0gMDsKKyAgICAgICAgU3RyaW5nIHMgPSB0YXJnZXQucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoSGVsbG9Xb3JsZFJlc291cmNlLkNMSUNIRURfTUVTU0FHRSwgcyk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBDdXN0b21Mb2dnaW5nRmlsdGVyLnByZUZpbHRlckNhbGxlZCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBDdXN0b21Mb2dnaW5nRmlsdGVyLnBvc3RGaWx0ZXJDYWxsZWQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbmZpZ3VyYXRpb25VcGRhdGUoKSB7CisgICAgICAgIENsaWVudCBjbGllbnQxID0gY2xpZW50KCk7CisgICAgICAgIGNsaWVudDEucmVnaXN0ZXIoQ3VzdG9tTG9nZ2luZ0ZpbHRlci5jbGFzcykucHJvcGVydHkoImZvbyIsICJiYXIiKTsKKworICAgICAgICBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoY2xpZW50MS5nZXRDb25maWd1cmF0aW9uKCkpOworICAgICAgICBDdXN0b21Mb2dnaW5nRmlsdGVyLnByZUZpbHRlckNhbGxlZCA9IEN1c3RvbUxvZ2dpbmdGaWx0ZXIucG9zdEZpbHRlckNhbGxlZCA9IDA7CisgICAgICAgIFN0cmluZyBzID0gdGFyZ2V0KCkucGF0aChST09UX1BBVEgpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEhlbGxvV29ybGRSZXNvdXJjZS5DTElDSEVEX01FU1NBR0UsIHMpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgQ3VzdG9tTG9nZ2luZ0ZpbHRlci5wcmVGaWx0ZXJDYWxsZWQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgQ3VzdG9tTG9nZ2luZ0ZpbHRlci5wb3N0RmlsdGVyQ2FsbGVkKTsKKyAgICAgICAgY2xpZW50LmNsb3NlKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL25ldHR5LWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L25ldHR5L2Nvbm5lY3Rvci9IdHRwSGVhZGVyc1Rlc3QuamF2YSBiL2Nvbm5lY3RvcnMvbmV0dHktY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbmV0dHkvY29ubmVjdG9yL0h0dHBIZWFkZXJzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwY2ZhMTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL25ldHR5LWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L25ldHR5L2Nvbm5lY3Rvci9IdHRwSGVhZGVyc1Rlc3QuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm5ldHR5LmNvbm5lY3RvcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkhlYWRlclBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogVGVzdHMgdGhlIGhlYWRlcnMuCisgKgorICogQGF1dGhvciBTdGVwYW4gS29wcml2YQorICovCitwdWJsaWMgY2xhc3MgSHR0cEhlYWRlcnNUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisgICAgQFBhdGgoIi90ZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEh0dHBNZXRob2RSZXNvdXJjZSB7CisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdCgKKyAgICAgICAgICAgICAgICBASGVhZGVyUGFyYW0oIlRyYW5zZmVyLUVuY29kaW5nIikgU3RyaW5nIHRyYW5zZmVyRW5jb2RpbmcsCisgICAgICAgICAgICAgICAgQEhlYWRlclBhcmFtKCJYLUNMSUVOVCIpIFN0cmluZyB4Q2xpZW50LAorICAgICAgICAgICAgICAgIEBIZWFkZXJQYXJhbSgiWC1XUklURVIiKSBTdHJpbmcgeFdyaXRlciwKKyAgICAgICAgICAgICAgICBTdHJpbmcgZW50aXR5KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImNsaWVudCIsIHhDbGllbnQpOworICAgICAgICAgICAgcmV0dXJuICJQT1NUIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoSHR0cEhlYWRlcnNUZXN0Lkh0dHBNZXRob2RSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBOZXR0eUNvbm5lY3RvclByb3ZpZGVyKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc3QoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJ0ZXN0IikucmVxdWVzdCgpLmhlYWRlcigiWC1DTElFTlQiLCAiY2xpZW50IikucG9zdChudWxsKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuaGFzRW50aXR5KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvbmV0dHktY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbmV0dHkvY29ubmVjdG9yL0h1Z2VFbnRpdHlUZXN0LmphdmEgYi9jb25uZWN0b3JzL25ldHR5LWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L25ldHR5L2Nvbm5lY3Rvci9IdWdlRW50aXR5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYzVmYWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL25ldHR5LWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L25ldHR5L2Nvbm5lY3Rvci9IdWdlRW50aXR5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTg4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm5ldHR5LmNvbm5lY3RvcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOworCitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuUmVxdWVzdEVudGl0eVByb2Nlc3Npbmc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIFRlc3QgdG8gbWFrZSBzdXJlIGh1Z2UgZW50aXR5IGdldHMgY2h1bmstZW5jb2RlZC4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSHVnZUVudGl0eVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfTEVOR1RIID0gMTAyNCAqIDEwMjQ7IC8vIDFNCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBIVUdFX0RBVEFfTEVOR1RIID0gMjBMICogMTAyNEwgKiAxMDI0TCAqIDEwMjRMOyAvLyAyMEcgc2VlbXMgc3VmZmljaWVudAorCisgICAgLyoqCisgICAgICogSkVSU0VZLTIzMzcgcmVwcm9kdWNlci4gVGhlIHJlc291cmNlIGlzIHVzZWQgdG8gY2hlY2sgdGhlIHJpZ2h0IGFtb3VudCBvZiBkYXRhCisgICAgICogaXMgYmVpbmcgcmVjZWl2ZWQgZnJvbSB0aGUgY2xpZW50IGFuZCBhbHNvIGdpdmVzIHVzIGFiaWxpdHkgdG8gY2hlY2sgd2UgcmVjZWl2ZQorICAgICAqIGNvcnJlY3QgZGF0YS4KKyAgICAgKi8KKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb25zdW1lclJlc291cmNlIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIGJhY2sgdGhlIGNvdW50IG9mIGJ5dGVzIHJlY2VpdmVkLgorICAgICAgICAgKiBUaGlzIHdheSwgd2Ugc2hvdWxkIGJlIGFibGUgdG8gY29uc3VtZSBhIGh1Z2UgYW1vdW50IG9mIGRhdGEuCisgICAgICAgICAqLworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgic2l6ZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdChJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgbG9uZyB0b3RhbEJ5dGVzUmVhZCA9IDBMOworCisgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbQlVGRkVSX0xFTkdUSF07CisgICAgICAgICAgICBpbnQgcmVhZDsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICByZWFkID0gaW4ucmVhZChidWZmZXIpOworICAgICAgICAgICAgICAgIGlmIChyZWFkID4gMCkgeworICAgICAgICAgICAgICAgICAgICB0b3RhbEJ5dGVzUmVhZCArPSByZWFkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHJlYWQgIT0gLTEpOworCisgICAgICAgICAgICByZXR1cm4gU3RyaW5nLnZhbHVlT2YodG90YWxCeXRlc1JlYWQpOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoImVjaG8iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGVjaG8oU3RyaW5nIHMpIHsKKyAgICAgICAgICAgIHJldHVybiBzOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhDb25zdW1lclJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcucmVnaXN0ZXIoVGVzdEVudGl0eVdyaXRlci5jbGFzcyk7CisgICAgICAgIGNvbmZpZy5wcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLlJFUVVFU1RfRU5USVRZX1BST0NFU1NJTkcsIFJlcXVlc3RFbnRpdHlQcm9jZXNzaW5nLkNIVU5LRUQpOworICAgICAgICBjb25maWcuY29ubmVjdG9yUHJvdmlkZXIobmV3IE5ldHR5Q29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0RW50aXR5IHsKKworICAgICAgICBmaW5hbCBsb25nIHNpemU7CisKKyAgICAgICAgcHVibGljIFRlc3RFbnRpdHkobG9uZyBzaXplKSB7CisgICAgICAgICAgICB0aGlzLnNpemUgPSBzaXplOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXRpbGl0eSB3cml0ZXIgdGhhdCBnZW5lcmF0ZXMgdGhhdCBtYW55IHplcm8gYnl0ZXMgYXMgZ2l2ZW4gYnkgdGhlIGlucHV0IGVudGl0eSBzaXplIGZpZWxkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdEVudGl0eVdyaXRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5V3JpdGVyPFRlc3RFbnRpdHk+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSBUZXN0RW50aXR5LmNsYXNzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldFNpemUoVGVzdEVudGl0eSB0LCBDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsgLy8gbm8gbWF0dGVyIHdoYXQgd2UgcmV0dXJuIGhlcmUsIHRoZSBvdXRwdXQgd2lsbCBnZXQgY2h1bmstZW5jb2RlZAorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oVGVzdEVudGl0eSB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIGZpbmFsIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtCVUZGRVJfTEVOR1RIXTsKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgYnVmZmVyQ291bnQgPSB0LnNpemUgLyBCVUZGRVJfTEVOR1RIOworICAgICAgICAgICAgZmluYWwgaW50IHJlbWFpbmRlciA9IChpbnQpICh0LnNpemUgJSBCVUZGRVJfTEVOR1RIKTsKKworICAgICAgICAgICAgZm9yIChsb25nIGIgPSAwOyBiIDwgYnVmZmVyQ291bnQ7IGIrKykgeworICAgICAgICAgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZShidWZmZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocmVtYWluZGVyID4gMCkgeworICAgICAgICAgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZShidWZmZXIsIDAsIHJlbWFpbmRlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBKRVJTRVktMjMzNyByZXByb2R1Y2VyLiBXZSBhcmUgZ29pbmcgdG8gc2VuZCBodWdlIGFtb3VudCBvZiBkYXRhIG92ZXIgdGhlIHdpcmUuCisgICAgICogU2hvdWxkIG5vdCB0aGUgZGF0YSBoYXZlIGJlZW4gY2h1bmstZW5jb2RlZCwgd2Ugd291bGQgZWFzaWx5IHJ1biBvdXQgb2YgbWVtb3J5LgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRlc3QgZXJyb3IuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiL3NpemUiKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KG5ldyBUZXN0RW50aXR5KEhVR0VfREFUQV9MRU5HVEgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX09DVEVUX1NUUkVBTV9UWVBFKSk7CisgICAgICAgIFN0cmluZyBjb250ZW50ID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KExvbmcucGFyc2VMb25nKGNvbnRlbnQpLCBlcXVhbFRvKEhVR0VfREFUQV9MRU5HVEgpKTsKKworICAgICAgICAvLyBqdXN0IHRvIGNoZWNrIHRoZSByaWdodCBkYXRhIGhhdmUgYmVlbiB0cmFuc2ZlcmVkLgorICAgICAgICByZXNwb25zZSA9IHRhcmdldCgiL2VjaG8iKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkudGV4dCgiSGV5IFN5bmMhIikpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbygiSGV5IFN5bmMhIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEpFUlNFWS0yMzM3IHJlcHJvZHVjZXIuIFdlIGFyZSBnb2luZyB0byBzZW5kIGh1Z2UgYW1vdW50IG9mIGRhdGEgb3ZlciB0aGUgd2lyZS4gVGhpcyB0aW1lIGluIGFuIGFzeW5jIGZhc2hpb24uCisgICAgICogU2hvdWxkIG5vdCB0aGUgZGF0YSBoYXZlIGJlZW4gY2h1bmstZW5jb2RlZCwgd2Ugd291bGQgZWFzaWx5IHJ1biBvdXQgb2YgbWVtb3J5LgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRlc3QgZXJyb3IuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNQb3N0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEZ1dHVyZTxSZXNwb25zZT4gcmVzcG9uc2UgPSB0YXJnZXQoIi9zaXplIikucmVxdWVzdCgpLmFzeW5jKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkobmV3IFRlc3RFbnRpdHkoSFVHRV9EQVRBX0xFTkdUSCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9PQ1RFVF9TVFJFQU1fVFlQRSkpOworICAgICAgICBmaW5hbCBTdHJpbmcgY29udGVudCA9IHJlc3BvbnNlLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VGhhdChMb25nLnBhcnNlTG9uZyhjb250ZW50KSwgZXF1YWxUbyhIVUdFX0RBVEFfTEVOR1RIKSk7CisKKyAgICAgICAgLy8ganVzdCB0byBjaGVjayB0aGUgcmlnaHQgZGF0YSBoYXZlIGJlZW4gdHJhbnNmZXJlZC4KKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQoIi9lY2hvIikucmVxdWVzdCgpLmFzeW5jKCkucG9zdChFbnRpdHkudGV4dCgiSGV5IEFzeW5jISIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXQoKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGVxdWFsVG8oIkhleSBBc3luYyEiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9uZXR0eS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9uZXR0eS9jb25uZWN0b3IvTWV0aG9kVGVzdC5qYXZhIGIvY29ubmVjdG9ycy9uZXR0eS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9uZXR0eS9jb25uZWN0b3IvTWV0aG9kVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzN2NmMzUKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL25ldHR5LWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L25ldHR5L2Nvbm5lY3Rvci9NZXRob2RUZXN0LmphdmEKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubmV0dHkuY29ubmVjdG9yOworCitpbXBvcnQgamF2YXgud3MucnMuREVMRVRFOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBVVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0cyB0aGUgSHR0cCBtZXRob2RzLgorICoKKyAqIEBhdXRob3IgU3RlcGFuIEtvcHJpdmEKKyAqLworcHVibGljIGNsYXNzIE1ldGhvZFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVRIID0gInRlc3QiOworCisgICAgQFBhdGgoIi90ZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEh0dHBNZXRob2RSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiR0VUIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdChTdHJpbmcgZW50aXR5KSB7CisgICAgICAgICAgICByZXR1cm4gZW50aXR5OworICAgICAgICB9CisKKyAgICAgICAgQFBVVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHB1dChTdHJpbmcgZW50aXR5KSB7CisgICAgICAgICAgICByZXR1cm4gZW50aXR5OworICAgICAgICB9CisKKyAgICAgICAgQERFTEVURQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRlbGV0ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAiREVMRVRFIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoSHR0cE1ldGhvZFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcuY29ubmVjdG9yUHJvdmlkZXIobmV3IE5ldHR5Q29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldChQQVRIKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiR0VUIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0KCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldChQQVRIKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KCJQT1NUIiwgTWVkaWFUeXBlLlRFWFRfUExBSU4pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJQT1NUIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQdXQoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KFBBVEgpLnJlcXVlc3QoKS5wdXQoRW50aXR5LmVudGl0eSgiUFVUIiwgTWVkaWFUeXBlLlRFWFRfUExBSU4pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJQVVQiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlbGV0ZSgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoUEFUSCkucmVxdWVzdCgpLmRlbGV0ZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkRFTEVURSIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29ubmVjdG9ycy9uZXR0eS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9uZXR0eS9jb25uZWN0b3IvTm9FbnRpdHlUZXN0LmphdmEgYi9jb25uZWN0b3JzL25ldHR5LWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L25ldHR5L2Nvbm5lY3Rvci9Ob0VudGl0eVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTcwYjAyCi0tLSAvZGV2L251bGwKKysrIGIvY29ubmVjdG9ycy9uZXR0eS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9uZXR0eS9jb25uZWN0b3IvTm9FbnRpdHlUZXN0LmphdmEKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubmV0dHkuY29ubmVjdG9yOworCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgQXJ1bCBEaGVzaWFzZWVsYW4gKGFydWxkIGF0IGFjbS5vcmcpCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgTm9FbnRpdHlUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoTm9FbnRpdHlUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBAUGF0aCgiL3Rlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSHR0cE1ldGhvZFJlc291cmNlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyhSZXNwb25zZS5TdGF0dXMuQ09ORkxJQ1QpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgdm9pZCBwb3N0KFN0cmluZyBlbnRpdHkpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIFJlc291cmNlQ29uZmlnIGNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhIdHRwTWV0aG9kUmVzb3VyY2UuY2xhc3MpOworICAgICAgICBjb25maWcucmVnaXN0ZXIobmV3IExvZ2dpbmdGZWF0dXJlKExPR0dFUiwgTG9nZ2luZ0ZlYXR1cmUuVmVyYm9zaXR5LlBBWUxPQURfQU5ZKSk7CisgICAgICAgIHJldHVybiBjb25maWc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBOZXR0eUNvbm5lY3RvclByb3ZpZGVyKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldCgpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHIgPSB0YXJnZXQoInRlc3QiKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgeworICAgICAgICAgICAgUmVzcG9uc2UgY3IgPSByLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgICAgIGNyLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRXaXRoQ2xvc2UoKSB7CisgICAgICAgIFdlYlRhcmdldCByID0gdGFyZ2V0KCJ0ZXN0Iik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7CisgICAgICAgICAgICBSZXNwb25zZSBjciA9IHIucmVxdWVzdCgpLmdldCgpOworICAgICAgICAgICAgY3IuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc3QoKSB7CisgICAgICAgIFdlYlRhcmdldCByID0gdGFyZ2V0KCJ0ZXN0Iik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7CisgICAgICAgICAgICBSZXNwb25zZSBjciA9IHIucmVxdWVzdCgpLnBvc3QobnVsbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0V2l0aENsb3NlKCkgeworICAgICAgICBXZWJUYXJnZXQgciA9IHRhcmdldCgidGVzdCIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgeworICAgICAgICAgICAgUmVzcG9uc2UgY3IgPSByLnJlcXVlc3QoKS5wb3N0KG51bGwpOworICAgICAgICAgICAgY3IuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvbmV0dHktY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbmV0dHkvY29ubmVjdG9yL1BhcmFsbGVsVGVzdC5qYXZhIGIvY29ubmVjdG9ycy9uZXR0eS1jb25uZWN0b3Ivc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9uZXR0eS9jb25uZWN0b3IvUGFyYWxsZWxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ1N2IzMQotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvbmV0dHktY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbmV0dHkvY29ubmVjdG9yL1BhcmFsbGVsVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm5ldHR5LmNvbm5lY3RvcjsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkJyb2tlbkJhcnJpZXJFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ3ljbGljQmFycmllcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBUZXN0cyB0aGUgcGFyYWxsZWwgZXhlY3V0aW9uIG9mIG11bHRpcGxlIHJlcXVlc3RzLgorICoKKyAqIEBhdXRob3IgU3RlcGFuIEtvcHJpdmEKKyAqLworcHVibGljIGNsYXNzIFBhcmFsbGVsVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFBhcmFsbGVsVGVzdC5jbGFzcy5nZXROYW1lKCkpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBBUkFMTEVMX0NMSUVOVFMgPSAxMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSCA9ICJ0ZXN0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBdG9taWNJbnRlZ2VyIHJlY2VpdmVkQ291bnRlciA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEF0b21pY0ludGVnZXIgcmVzb3VyY2VDb3VudGVyID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ3ljbGljQmFycmllciBzdGFydEJhcnJpZXIgPSBuZXcgQ3ljbGljQmFycmllcihQQVJBTExFTF9DTElFTlRTICsgMSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ291bnREb3duTGF0Y2ggZG9uZUxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKFBBUkFMTEVMX0NMSUVOVFMpOworCisgICAgQFBhdGgoUEFUSCkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15UmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICBzbGVlcCgpOworICAgICAgICAgICAgcmVzb3VyY2VDb3VudGVyLmFkZEFuZEdldCgxKTsKKyAgICAgICAgICAgIHJldHVybiAiR0VUIjsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBzbGVlcCgpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihQYXJhbGxlbFRlc3QuY2xhc3MuZ2V0TmFtZSgpKS5sb2coTGV2ZWwuU0VWRVJFLCBudWxsLCBleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFBhcmFsbGVsVGVzdC5NeVJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcuY29ubmVjdG9yUHJvdmlkZXIobmV3IE5ldHR5Q29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyYWxsZWwoKSB0aHJvd3MgQnJva2VuQmFycmllckV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3IgPSBFeGVjdXRvcnMubmV3U2NoZWR1bGVkVGhyZWFkUG9vbChQQVJBTExFTF9DTElFTlRTKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gUEFSQUxMRUxfQ0xJRU5UUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGlkID0gaTsKKyAgICAgICAgICAgICAgICBleGVjdXRvci5zdWJtaXQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydEJhcnJpZXIuYXdhaXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNwb25zZSByZXNwb25zZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IHRhcmdldC5wYXRoKFBBVEgpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWRDb3VudGVyLmluY3JlbWVudEFuZEdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuV0FSTklORywgIkNsaWVudCB0aHJlYWQgIiArIGlkICsgIiBpbnRlcnJ1cHRlZC4iLCBleCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChCcm9rZW5CYXJyaWVyRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5JTkZPLCAiQ2xpZW50IHRocmVhZCAiICsgaWQgKyAiIGZhaWxlZCBvbiBicm9rZW4gYmFycmllci4iLCBleCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5XQVJOSU5HLCAiQ2xpZW50IHRocmVhZCAiICsgaWQgKyAiIGZhaWxlZCBvbiB1bmV4cGVjdGVkIGV4Y2VwdGlvbi4iLCB0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZUxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXJ0QmFycmllci5hd2FpdCgxLCBUaW1lVW5pdC5TRUNPTkRTKTsKKworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiV2FpdGluZyBmb3IgY2xpZW50cyB0byBmaW5pc2ggaGFzIHRpbWVkIG91dC4iLCBkb25lTGF0Y2guYXdhaXQoNSAqIGdldEFzeW5jVGltZW91dE11bHRpcGxpZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVVbml0LlNFQ09ORFMpKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXNvdXJjZSBjb3VudGVyIiwgUEFSQUxMRUxfQ0xJRU5UUywgcmVzb3VyY2VDb3VudGVyLmdldCgpKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZWNlaXZlZCBjb3VudGVyIiwgUEFSQUxMRUxfQ0xJRU5UUywgcmVjZWl2ZWRDb3VudGVyLmdldCgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGV4ZWN1dG9yLnNodXRkb3duTm93KCk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiRXhlY3V0b3IgdGVybWluYXRpb24iLCBleGVjdXRvci5hd2FpdFRlcm1pbmF0aW9uKDUsIFRpbWVVbml0LlNFQ09ORFMpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvbmV0dHktY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbmV0dHkvY29ubmVjdG9yL1RpbWVvdXRUZXN0LmphdmEgYi9jb25uZWN0b3JzL25ldHR5LWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L25ldHR5L2Nvbm5lY3Rvci9UaW1lb3V0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMzVkODMKLS0tIC9kZXYvbnVsbAorKysgYi9jb25uZWN0b3JzL25ldHR5LWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L25ldHR5L2Nvbm5lY3Rvci9UaW1lb3V0VGVzdC5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubmV0dHkuY29ubmVjdG9yOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZW91dEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmluc3RhbmNlT2Y7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIFRpbWVvdXRUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisgICAgQFBhdGgoIi90ZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRpbWVvdXRSZXNvdXJjZSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gIkdFVCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJ0aW1lb3V0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRUaW1lb3V0KCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMjAwMCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAiR0VUIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoVGltZW91dFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcucHJvcGVydHkoQ2xpZW50UHJvcGVydGllcy5SRUFEX1RJTUVPVVQsIDEwMDApOworICAgICAgICBjb25maWcuY29ubmVjdG9yUHJvdmlkZXIobmV3IE5ldHR5Q29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmFzdCgpIHsKKyAgICAgICAgUmVzcG9uc2UgciA9IHRhcmdldCgidGVzdCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgci5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiR0VUIiwgci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNsb3coKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0YXJnZXQoInRlc3QvdGltZW91dCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgICAgIGZhaWwoIlRpbWVvdXQgZXhwZWN0ZWQuIik7CisgICAgICAgIH0gY2F0Y2ggKFByb2Nlc3NpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0VGhhdCgiVW5leHBlY3RlZCBwcm9jZXNzaW5nIGV4Y2VwdGlvbiBjYXVzZSIsCisgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0Q2F1c2UoKSwgaW5zdGFuY2VPZihUaW1lb3V0RXhjZXB0aW9uLmNsYXNzKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb25uZWN0b3JzL25ldHR5LWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L25ldHR5L2Nvbm5lY3Rvci9UcmFjZVN1cHBvcnRUZXN0LmphdmEgYi9jb25uZWN0b3JzL25ldHR5LWNvbm5lY3Rvci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L25ldHR5L2Nvbm5lY3Rvci9UcmFjZVN1cHBvcnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ4YmYzMwotLS0gL2Rldi9udWxsCisrKyBiL2Nvbm5lY3RvcnMvbmV0dHktY29ubmVjdG9yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbmV0dHkvY29ubmVjdG9yL1RyYWNlU3VwcG9ydFRlc3QuamF2YQpAQCAtMCwwICsxLDIzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5uZXR0eS5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkh0dHBNZXRob2Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlcXVlc3Q7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLkluZmxlY3RvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCisvKioKKyAqIFRoaXMgdmVyeSBiYXNpYyByZXNvdXJjZSBzaG93Y2FzZXMgc3VwcG9ydCBvZiBhIEhUVFAgVFJBQ0UgbWV0aG9kLAorICogbm90IGRpcmVjdGx5IHN1cHBvcnRlZCBieSBKQVgtUlMgQVBJLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBUcmFjZVN1cHBvcnRUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihUcmFjZVN1cHBvcnRUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICAvKioKKyAgICAgKiBQcm9ncmFtbWF0aWMgdHJhY2luZyByb290IHJlc291cmNlIHBhdGguCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVF9QQVRIX1BST0dSQU1NQVRJQyA9ICJ0cmFjaW5nL3Byb2dyYW1tYXRpYyI7CisKKyAgICAvKioKKyAgICAgKiBBbm5vdGF0ZWQgY2xhc3MtYmFzZWQgdHJhY2luZyByb290IHJlc291cmNlIHBhdGguCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVF9QQVRIX0FOTk9UQVRFRCA9ICJ0cmFjaW5nL2Fubm90YXRlZCI7CisKKyAgICBASHR0cE1ldGhvZChUUkFDRS5OQU1FKQorICAgIEBUYXJnZXQoRWxlbWVudFR5cGUuTUVUSE9EKQorICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCisgICAgcHVibGljIEBpbnRlcmZhY2UgVFJBQ0UgeworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIlRSQUNFIjsKKyAgICB9CisKKyAgICBAUGF0aChST09UX1BBVEhfQU5OT1RBVEVEKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVHJhY2luZ1Jlc291cmNlIHsKKworICAgICAgICBAVFJBQ0UKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgcHVibGljIFN0cmluZyB0cmFjZShSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgICAgIHJldHVybiBzdHJpbmdpZnkoKENvbnRhaW5lclJlcXVlc3QpIHJlcXVlc3QpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgUmVzb3VyY2VDb25maWcgY29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKFRyYWNpbmdSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihuZXcgTG9nZ2luZ0ZlYXR1cmUoTE9HR0VSLCBMb2dnaW5nRmVhdHVyZS5WZXJib3NpdHkuUEFZTE9BRF9BTlkpKTsKKyAgICAgICAgZmluYWwgUmVzb3VyY2UuQnVpbGRlciByZXNvdXJjZUJ1aWxkZXIgPSBSZXNvdXJjZS5idWlsZGVyKFJPT1RfUEFUSF9QUk9HUkFNTUFUSUMpOworICAgICAgICByZXNvdXJjZUJ1aWxkZXIuYWRkTWV0aG9kKFRSQUNFLk5BTUUpLmhhbmRsZWRCeShuZXcgSW5mbGVjdG9yPENvbnRhaW5lclJlcXVlc3RDb250ZXh0LCBSZXNwb25zZT4oKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFJlc3BvbnNlIGFwcGx5KENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3QpIHsKKyAgICAgICAgICAgICAgICBpZiAocmVxdWVzdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5ub0NvbnRlbnQoKS5idWlsZCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vayhzdHJpbmdpZnkoKENvbnRhaW5lclJlcXVlc3QpIHJlcXVlc3QpLCBNZWRpYVR5cGUuVEVYVF9QTEFJTikuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIHJldHVybiBjb25maWcucmVnaXN0ZXJSZXNvdXJjZXMocmVzb3VyY2VCdWlsZGVyLmJ1aWxkKCkpOworCisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmdbXSBleHBlY3RlZEZyYWdtZW50c1Byb2dyYW1tYXRpYyA9IG5ldyBTdHJpbmdbXXsKKyAgICAgICAgICAgICJUUkFDRSBodHRwOi8vbG9jYWxob3N0OiIgKyB0aGlzLmdldFBvcnQoKSArICIvdHJhY2luZy9wcm9ncmFtbWF0aWMiCisgICAgfTsKKyAgICBwcml2YXRlIFN0cmluZ1tdIGV4cGVjdGVkRnJhZ21lbnRzQW5ub3RhdGVkID0gbmV3IFN0cmluZ1tdeworICAgICAgICAgICAgIlRSQUNFIGh0dHA6Ly9sb2NhbGhvc3Q6IiArIHRoaXMuZ2V0UG9ydCgpICsgIi90cmFjaW5nL2Fubm90YXRlZCIKKyAgICB9OworCisgICAgcHJpdmF0ZSBXZWJUYXJnZXQgcHJlcGFyZVRhcmdldChTdHJpbmcgcGF0aCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCk7CisgICAgICAgIHRhcmdldC5yZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIHJldHVybiB0YXJnZXQucGF0aChwYXRoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9ncmFtbWF0aWNBcHAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSBwcmVwYXJlVGFyZ2V0KFJPT1RfUEFUSF9QUk9HUkFNTUFUSUMpLnJlcXVlc3QoInRleHQvcGxhaW4iKS5tZXRob2QoVFJBQ0UuTkFNRSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJlc3BvbnNlLlN0YXR1cy5PSy5nZXRTdGF0dXNDb2RlKCksIHJlc3BvbnNlLmdldFN0YXR1c0luZm8oKS5nZXRTdGF0dXNDb2RlKCkpOworCisgICAgICAgIFN0cmluZyByZXNwb25zZUVudGl0eSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgZm9yIChTdHJpbmcgZXhwZWN0ZWRGcmFnbWVudCA6IGV4cGVjdGVkRnJhZ21lbnRzUHJvZ3JhbW1hdGljKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCBmcmFnbWVudCAnIiArIGV4cGVjdGVkRnJhZ21lbnQgKyAiJyBub3QgZm91bmQgaW4gcmVzcG9uc2U6XG4iICsgcmVzcG9uc2VFbnRpdHksCisgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvTG93ZXJDYXNlIC0gaHR0cCBoZWFkZXIgZmllbGQgbmFtZXMgYXJlIGNhc2UgaW5zZW5zaXRpdmUKKyAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VFbnRpdHkuY29udGFpbnMoZXhwZWN0ZWRGcmFnbWVudCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGVkQXBwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gcHJlcGFyZVRhcmdldChST09UX1BBVEhfQU5OT1RBVEVEKS5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikubWV0aG9kKFRSQUNFLk5BTUUpOworCisgICAgICAgIGFzc2VydEVxdWFscyhSZXNwb25zZS5TdGF0dXMuT0suZ2V0U3RhdHVzQ29kZSgpLCByZXNwb25zZS5nZXRTdGF0dXNJbmZvKCkuZ2V0U3RhdHVzQ29kZSgpKTsKKworICAgICAgICBTdHJpbmcgcmVzcG9uc2VFbnRpdHkgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGZvciAoU3RyaW5nIGV4cGVjdGVkRnJhZ21lbnQgOiBleHBlY3RlZEZyYWdtZW50c0Fubm90YXRlZCkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZnJhZ21lbnQgJyIgKyBleHBlY3RlZEZyYWdtZW50ICsgIicgbm90IGZvdW5kIGluIHJlc3BvbnNlOlxuIiArIHJlc3BvbnNlRW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAvLyB0b0xvd2VyQ2FzZSAtIGh0dHAgaGVhZGVyIGZpZWxkIG5hbWVzIGFyZSBjYXNlIGluc2Vuc2l0aXZlCisgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlRW50aXR5LmNvbnRhaW5zKGV4cGVjdGVkRnJhZ21lbnQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRyYWNlV2l0aEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdFRyYWNlV2l0aEVudGl0eShmYWxzZSwgZmFsc2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFzeW5jVHJhY2VXaXRoRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0VHJhY2VXaXRoRW50aXR5KHRydWUsIGZhbHNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFjZVdpdGhFbnRpdHlBcGFjaGVDb25uZWN0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RUcmFjZVdpdGhFbnRpdHkoZmFsc2UsIHRydWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFzeW5jVHJhY2VXaXRoRW50aXR5QXBhY2hlQ29ubmVjdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0VHJhY2VXaXRoRW50aXR5KHRydWUsIHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfdGVzdFRyYWNlV2l0aEVudGl0eShmaW5hbCBib29sZWFuIGlzQXN5bmMsIGZpbmFsIGJvb2xlYW4gdXNlR3JpenpseUNvbm5lY3RvcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdXNlR3JpenpseUNvbm5lY3RvciA/IGNyZWF0ZUdyaXp6bHlDbGllbnQoKS50YXJnZXQodGFyZ2V0KCkuZ2V0VXJpKCkpIDogdGFyZ2V0KCk7CisgICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQucGF0aChST09UX1BBVEhfQU5OT1RBVEVEKTsKKworICAgICAgICAgICAgZmluYWwgRW50aXR5PFN0cmluZz4gZW50aXR5ID0gRW50aXR5LmVudGl0eSgidHJhY2UiLCBNZWRpYVR5cGUuV0lMRENBUkRfVFlQRSk7CisKKyAgICAgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlOworICAgICAgICAgICAgaWYgKCFpc0FzeW5jKSB7CisgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLm1ldGhvZChUUkFDRS5OQU1FLCBlbnRpdHkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkuYXN5bmMoKS5tZXRob2QoVFJBQ0UuTkFNRSwgZW50aXR5KS5nZXQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmFpbCgiQSBUUkFDRSByZXF1ZXN0IE1VU1QgTk9UIGluY2x1ZGUgYW4gZW50aXR5LiAocmVzcG9uc2U9IiArIHJlc3BvbnNlICsgIikiKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIE9LCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIENsaWVudCBjcmVhdGVHcml6emx5Q2xpZW50KCkgeworICAgICAgICByZXR1cm4gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQobmV3IENsaWVudENvbmZpZygpLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBOZXR0eUNvbm5lY3RvclByb3ZpZGVyKCkpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmluZ2lmeShDb250YWluZXJSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisgICAgICAgIHByaW50UmVxdWVzdExpbmUoYnVmZmVyLCByZXF1ZXN0KTsKKyAgICAgICAgcHJpbnRQcmVmaXhlZEhlYWRlcnMoYnVmZmVyLCByZXF1ZXN0LmdldEhlYWRlcnMoKSk7CisKKyAgICAgICAgaWYgKHJlcXVlc3QuaGFzRW50aXR5KCkpIHsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQocmVxdWVzdC5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50UmVxdWVzdExpbmUoU3RyaW5nQnVpbGRlciBidWZmZXIsIENvbnRhaW5lclJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICBidWZmZXIuYXBwZW5kKHJlcXVlc3QuZ2V0TWV0aG9kKCkpLmFwcGVuZCgiICIpLmFwcGVuZChyZXF1ZXN0LmdldFVyaUluZm8oKS5nZXRSZXF1ZXN0VXJpKCkudG9BU0NJSVN0cmluZygpKS5hcHBlbmQoIlxuIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludFByZWZpeGVkSGVhZGVycyhTdHJpbmdCdWlsZGVyIGJ1ZmZlciwgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBoZWFkZXJzKSB7CisgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTGlzdDxTdHJpbmc+PiBlIDogaGVhZGVycy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBMaXN0PFN0cmluZz4gdmFsID0gZS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgU3RyaW5nIGhlYWRlciA9IGUuZ2V0S2V5KCk7CisKKyAgICAgICAgICAgIGlmICh2YWwuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGhlYWRlcikuYXBwZW5kKCI6ICIpLmFwcGVuZCh2YWwuZ2V0KDApKS5hcHBlbmQoIlxuIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gYWRkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgcyA6IHZhbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYWRkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJywnKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhZGQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQocyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoaGVhZGVyKS5hcHBlbmQoIjogIikuYXBwZW5kKHNiLnRvU3RyaW5nKCkpLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2Nvbm5lY3RvcnMvcG9tLnhtbCBiL2Nvbm5lY3RvcnMvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDhmY2I3Ci0tLSAvZGV2L251bGwKKysrIGIvY29ubmVjdG9ycy9wb20ueG1sCkBAIC0wLDAgKzEsNzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXk8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb25uZWN0b3JzPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktY29ubmVjdG9yczwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgY2xpZW50IGNvbm5lY3Rpb24gcHJvdmlkZXJzIHVtYnJlbGxhIHByb2plY3QgbW9kdWxlPC9kZXNjcmlwdGlvbj4KKworICAgIDxtb2R1bGVzPgorICAgICAgICA8bW9kdWxlPmFwYWNoZS1jb25uZWN0b3I8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5ncml6emx5LWNvbm5lY3RvcjwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmpkay1jb25uZWN0b3I8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5qZXR0eS1jb25uZWN0b3I8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5uZXR0eS1jb25uZWN0b3I8L21vZHVsZT4KKyAgICA8L21vZHVsZXM+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29tbW9uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jbGllbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LndzLnJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXgud3MucnMtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmhhbWNyZXN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGFtY3Jlc3QtbGlicmFyeTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1oazI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lcnMvZ2xhc3NmaXNoL2plcnNleS1nZi1lamIvcG9tLnhtbCBiL2NvbnRhaW5lcnMvZ2xhc3NmaXNoL2plcnNleS1nZi1lamIvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDM4Y2U3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVycy9nbGFzc2Zpc2gvamVyc2V5LWdmLWVqYi9wb20ueG1sCkBAIC0wLDAgKzEsMTM0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnMuZ2xhc3NmaXNoPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LWdmLWVqYjwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS1nZi1lamI8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+SmVyc2V5IEVKQiBmb3IgR2xhc3NGaXNoIGludGVncmF0aW9uPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jZGkxeDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lamI8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5lamItYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtlamIudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguaW50ZXJjZXB0b3I8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5pbnRlcmNlcHRvci1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke2phdmF4LmludGVyY2VwdG9yLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guaGsyLmV4dGVybmFsPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguaW5qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktc2VydmVyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2gubWFpbi5lamI8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5lamItY29udGFpbmVyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2gubWFpbi5jb21tb248L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb250YWluZXItY29tbW9uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPCEtLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2x1ZGluZyBvbmx5ICoudGVzdHMuKiBwYWNrYWdlcyBmb3IgdGhpcyBtb2R1bGUuIEF0IGxlYXN0IG9uZSBjbGFzcyBoYXMgdG8gZXhpc3QgaW4gbm9uLWV4Y2x1ZGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZXMgdG8gZ2VuZXJhdGUgcHJvcGVyIC1qYXZhZG9jLmphciBmaWxlLiBTZWUgaHR0cHM6Ly9qaXJhLmNvZGVoYXVzLm9yZy9icm93c2UvTUpBVkFET0MtMzI5CisgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVQYWNrYWdlTmFtZXM+Ki50ZXN0cy4qPC9leGNsdWRlUGFja2FnZU5hbWVzPgorICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4uaXN0YWNrPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWlzdGFjay1jb21tb25zLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5idWlsZC1oZWxwZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZmVsaXg8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYnVuZGxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8ZXh0ZW5zaW9ucz50cnVlPC9leHRlbnNpb25zPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8aW5zdHJ1Y3Rpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFeHBsaWNpdGx5IHNldCB2ZXJzaW9ucyBmb3IgcGFja2FnZXMgZnJvbSBHbGFzc0Zpc2ggdG8gYWxsb3cgZnV0dXJlIHVwdGFrZSBvZiBHbGFzc0Zpc2ggNS54LS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8SW1wb3J0LVBhY2thZ2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tLnN1bi4qO3ZlcnNpb249Ils0LjAsNikiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5nbGFzc2Zpc2guZWpiLio7dmVyc2lvbj0iWzQuMCw2KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmdsYXNzZmlzaC5pbnRlcm5hbC4qO3ZlcnNpb249Ils0LjAsNikiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvSW1wb3J0LVBhY2thZ2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8X3ZlcnNpb25wb2xpY3k+WyQodmVyc2lvbjs9PTskKEApKSwkKHZlcnNpb247KzskKEApKSk8L192ZXJzaW9ucG9saWN5PgorICAgICAgICAgICAgICAgICAgICAgICAgPF9ub2RlZmF1bHR2ZXJzaW9uPmZhbHNlPC9fbm9kZWZhdWx0dmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9pbnN0cnVjdGlvbnM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlkPm9zZ2ktYnVuZGxlPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5idW5kbGU8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lcnMvZ2xhc3NmaXNoL2plcnNleS1nZi1lamIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9nZi9lamIvaW50ZXJuYWwvRWpiQ29tcG9uZW50SW50ZXJjZXB0b3IuamF2YSBiL2NvbnRhaW5lcnMvZ2xhc3NmaXNoL2plcnNleS1nZi1lamIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9nZi9lamIvaW50ZXJuYWwvRWpiQ29tcG9uZW50SW50ZXJjZXB0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmU2ZThiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVycy9nbGFzc2Zpc2gvamVyc2V5LWdmLWVqYi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2dmL2VqYi9pbnRlcm5hbC9FamJDb21wb25lbnRJbnRlcmNlcHRvci5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ2YuZWpiLmludGVybmFsOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0OworaW1wb3J0IGphdmF4LmludGVyY2VwdG9yLkludm9jYXRpb25Db250ZXh0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTF4LmludGVybmFsLkNkaUNvbXBvbmVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworCisvKioKKyAqIEVKQiBpbnRlcmNlcHRvciB0byBpbmplY3QgSmVyc2V5IHNwZWNpZmljIHN0dWZmIGludG8gRUpCIGJlYW5zLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBFamJDb21wb25lbnRJbnRlcmNlcHRvciB7CisKKyAgICBwcml2YXRlIGZpbmFsIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlcjsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgRUpCIGNvbXBvbmVudCBpbmplY3Rpb24gbWFuYWdlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbiBtYW5hZ2VyLgorICAgICAqLworICAgIHB1YmxpYyBFamJDb21wb25lbnRJbnRlcmNlcHRvcihmaW5hbCBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIpIHsKKyAgICAgICAgdGhpcy5pbmplY3Rpb25NYW5hZ2VyID0gaW5qZWN0aW9uTWFuYWdlcjsKKyAgICB9CisKKyAgICBAUG9zdENvbnN0cnVjdAorICAgIHByaXZhdGUgdm9pZCBpbmplY3QoZmluYWwgSW52b2NhdGlvbkNvbnRleHQgY29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgZmluYWwgT2JqZWN0IGJlYW5JbnN0YW5jZSA9IGNvbnRleHQuZ2V0VGFyZ2V0KCk7CisgICAgICAgIGluamVjdGlvbk1hbmFnZXIuaW5qZWN0KGJlYW5JbnN0YW5jZSwgQ2RpQ29tcG9uZW50UHJvdmlkZXIuQ0RJX0NMQVNTX0FOQUxZWkVSKTsKKworICAgICAgICAvLyBJbnZva2UgbmV4dCBpbnRlcmNlcHRvciBpbiBjaGFpbgorICAgICAgICBjb250ZXh0LnByb2NlZWQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXJzL2dsYXNzZmlzaC9qZXJzZXktZ2YtZWpiL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZ2YvZWpiL2ludGVybmFsL0VqYkNvbXBvbmVudFByb3ZpZGVyLmphdmEgYi9jb250YWluZXJzL2dsYXNzZmlzaC9qZXJzZXktZ2YtZWpiL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZ2YvZWpiL2ludGVybmFsL0VqYkNvbXBvbmVudFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE2NTJlMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lcnMvZ2xhc3NmaXNoL2plcnNleS1nZi1lamIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9nZi9lamIvaW50ZXJuYWwvRWpiQ29tcG9uZW50UHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDQxNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5nZi5lamIuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25IYW5kbGVyOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvcHlPbldyaXRlQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuRXhjZXB0aW9uTWFwcGVyOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qcmlvcml0eTsKK2ltcG9ydCBqYXZheC5lamIuTG9jYWw7CitpbXBvcnQgamF2YXguZWpiLlJlbW90ZTsKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworaW1wb3J0IGphdmF4Lm5hbWluZy5Jbml0aWFsQ29udGV4dDsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkFic3RyYWN0QmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5CaW5kaW5nOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5CaW5kaW5nczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5zdGFuY2VCaW5kaW5nOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLkludm9jYWJsZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbXBvbmVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuaW50ZXJuYWwuUmVzb3VyY2VNZXRob2RJbnZvY2F0aW9uSGFuZGxlclByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5lamIuZGVwbG95bWVudC5kZXNjcmlwdG9yLkVqYkJ1bmRsZURlc2NyaXB0b3JJbXBsOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guZWpiLmRlcGxveW1lbnQuZGVzY3JpcHRvci5FamJEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaW50ZXJuYWwuZGF0YS5BcHBsaWNhdGlvbkluZm87CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5pbnRlcm5hbC5kYXRhLkFwcGxpY2F0aW9uUmVnaXN0cnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5pbnRlcm5hbC5kYXRhLk1vZHVsZUluZm87CisKK2ltcG9ydCBjb20uc3VuLmVqYi5jb250YWluZXJzLkJhc2VDb250YWluZXI7CitpbXBvcnQgY29tLnN1bi5lamIuY29udGFpbmVycy5FamJDb250YWluZXJVdGlsOworaW1wb3J0IGNvbS5zdW4uZWpiLmNvbnRhaW5lcnMuRWpiQ29udGFpbmVyVXRpbEltcGw7CitpbXBvcnQgY29tLnN1bi5lbnRlcnByaXNlLmNvbmZpZy5zZXJ2ZXJiZWFucy5BcHBsaWNhdGlvbjsKK2ltcG9ydCBjb20uc3VuLmVudGVycHJpc2UuY29uZmlnLnNlcnZlcmJlYW5zLkFwcGxpY2F0aW9uczsKKworLyoqCisgKiBFSkIgY29tcG9uZW50IHByb3ZpZGVyLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQcmlvcml0eSgzMDApCitAU3VwcHJlc3NXYXJuaW5ncygiVW51c2VkRGVjbGFyYXRpb24iKQorcHVibGljIGZpbmFsIGNsYXNzIEVqYkNvbXBvbmVudFByb3ZpZGVyIGltcGxlbWVudHMgQ29tcG9uZW50UHJvdmlkZXIsIFJlc291cmNlTWV0aG9kSW52b2NhdGlvbkhhbmRsZXJQcm92aWRlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihFamJDb21wb25lbnRQcm92aWRlci5jbGFzcy5nZXROYW1lKCkpOworCisgICAgcHJpdmF0ZSBJbml0aWFsQ29udGV4dCBpbml0aWFsQ29udGV4dDsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8U3RyaW5nPiBsaWJOYW1lcyA9IG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdDw+KCk7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gZWpiSW50ZXJjZXB0b3JSZWdpc3RlcmVkID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBISzIgZmFjdG9yeSB0byBwcm92aWRlIEVKQiBjb21wb25lbnRzIG9idGFpbmVkIHZpYSBKTkRJIGxvb2t1cC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBFamJGYWN0b3J5PFQ+IGltcGxlbWVudHMgU3VwcGxpZXI8VD4geworCisgICAgICAgIGZpbmFsIEluaXRpYWxDb250ZXh0IGN0eDsKKyAgICAgICAgZmluYWwgQ2xhc3M8VD4gY2xheno7CisgICAgICAgIGZpbmFsIEVqYkNvbXBvbmVudFByb3ZpZGVyIGVqYlByb3ZpZGVyOworCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFQgZ2V0KCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKFQpIGxvb2t1cChjdHgsIGNsYXp6LCBjbGF6ei5nZXRTaW1wbGVOYW1lKCksIGVqYlByb3ZpZGVyKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoQXBwbGljYXRpb25IYW5kbGVyLmNsYXNzLmdldE5hbWUoKSkubG9nKExldmVsLlNFVkVSRSwgbnVsbCwgZXgpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEVqYkZhY3RvcnkoQ2xhc3M8VD4gcmF3VHlwZSwgSW5pdGlhbENvbnRleHQgY3R4LCBFamJDb21wb25lbnRQcm92aWRlciBlamJQcm92aWRlcikgeworICAgICAgICAgICAgdGhpcy5jbGF6eiA9IHJhd1R5cGU7CisgICAgICAgICAgICB0aGlzLmN0eCA9IGN0eDsKKyAgICAgICAgICAgIHRoaXMuZWpiUHJvdmlkZXIgPSBlamJQcm92aWRlcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEFubm90YXRpb25zIHRvIGRldGVybWluZSBFSkIgY29tcG9uZW50cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBFamJDb21wb25lbnRBbm5vdGF0aW9ucyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChuZXcgSGFzaFNldDxTdHJpbmc+KCkge3sKKyAgICAgICAgYWRkKCJqYXZheC5lamIuU3RhdGVmdWwiKTsKKyAgICAgICAgYWRkKCJqYXZheC5lamIuU3RhdGVsZXNzIik7CisgICAgICAgIGFkZCgiamF2YXguZWpiLlNpbmdsZXRvbiIpOworICAgIH19KTsKKworICAgIHByaXZhdGUgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyID0gbnVsbDsKKworICAgIC8vIENvbXBvbmVudFByb3ZpZGVyCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShmaW5hbCBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIpIHsKKyAgICAgICAgdGhpcy5pbmplY3Rpb25NYW5hZ2VyID0gaW5qZWN0aW9uTWFuYWdlcjsKKworICAgICAgICBJbnN0YW5jZUJpbmRpbmc8RWpiQ29tcG9uZW50UHJvdmlkZXI+IGRlc2NyaXB0b3IgPSBCaW5kaW5ncy5zZXJ2aWNlKEVqYkNvbXBvbmVudFByb3ZpZGVyLnRoaXMpCisgICAgICAgICAgICAgICAgLnRvKFJlc291cmNlTWV0aG9kSW52b2NhdGlvbkhhbmRsZXJQcm92aWRlci5jbGFzcyk7CisgICAgICAgIHRoaXMuaW5qZWN0aW9uTWFuYWdlci5yZWdpc3RlcihkZXNjcmlwdG9yKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEFwcGxpY2F0aW9uSW5mbyBnZXRBcHBsaWNhdGlvbkluZm8oRWpiQ29udGFpbmVyVXRpbCBlamJVdGlsKSB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgQXBwbGljYXRpb25SZWdpc3RyeSBhcHBSZWdpc3RyeSA9IGVqYlV0aWwuZ2V0U2VydmljZXMoKS5nZXRTZXJ2aWNlKEFwcGxpY2F0aW9uUmVnaXN0cnkuY2xhc3MpOworICAgICAgICBBcHBsaWNhdGlvbnMgYXBwbGljYXRpb25zID0gZWpiVXRpbC5nZXRTZXJ2aWNlcygpLmdldFNlcnZpY2UoQXBwbGljYXRpb25zLmNsYXNzKTsKKyAgICAgICAgU3RyaW5nIGFwcE5hbWVQcmVmaXggPSAoU3RyaW5nKSBpbml0aWFsQ29udGV4dC5sb29rdXAoImphdmE6YXBwL0FwcE5hbWUiKTsKKyAgICAgICAgU2V0PFN0cmluZz4gYXBwTmFtZXMgPSBhcHBSZWdpc3RyeS5nZXRBbGxBcHBsaWNhdGlvbk5hbWVzKCk7CisgICAgICAgIFNldDxTdHJpbmc+IGRpc2FibGVkQXBwcyA9IG5ldyBUcmVlU2V0PD4oKTsKKyAgICAgICAgZm9yIChTdHJpbmcgYXBwTmFtZSA6IGFwcE5hbWVzKSB7CisgICAgICAgICAgICBpZiAoYXBwTmFtZS5zdGFydHNXaXRoKGFwcE5hbWVQcmVmaXgpKSB7CisgICAgICAgICAgICAgICAgQXBwbGljYXRpb24gYXBwRGVzYyA9IGFwcGxpY2F0aW9ucy5nZXRBcHBsaWNhdGlvbihhcHBOYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAoYXBwRGVzYyAhPSBudWxsICYmICFlamJVdGlsLmdldERlcGxveW1lbnQoKS5pc0FwcEVuYWJsZWQoYXBwRGVzYykpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc2tpcCBkaXNhYmxlZCB2ZXJzaW9uIG9mIHRoZSBhcHAKKyAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWRBcHBzLmFkZChhcHBOYW1lKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWpiVXRpbC5nZXREZXBsb3ltZW50KCkuZ2V0KGFwcE5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGdyYWIgdGhlIGxhdGVzdCBvbmUsIHRoZXJlIGlzIG5vIHdheSB0byBtYWtlCisgICAgICAgIC8vIHN1cmUgd2hpY2ggb25lIHRoZSB1c2VyIGlzIGFjdHVhbGx5IGVuYWJsaW5nLAorICAgICAgICAvLyBzbyB1c2UgdGhlIGJlc3QgY2FzZSwgaS5lLiB1cGdyYWRlCisgICAgICAgIEl0ZXJhdG9yPFN0cmluZz4gaXQgPSBkaXNhYmxlZEFwcHMuaXRlcmF0b3IoKTsKKyAgICAgICAgU3RyaW5nIGxhc3REaXNhYmxlZEFwcCA9IG51bGw7CisgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIGxhc3REaXNhYmxlZEFwcCA9IGl0Lm5leHQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobGFzdERpc2FibGVkQXBwICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBlamJVdGlsLmdldERlcGxveW1lbnQoKS5nZXQobGFzdERpc2FibGVkQXBwKTsKKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBOYW1pbmdFeGNlcHRpb24oIkFwcGxpY2F0aW9uIEluZm9ybWF0aW9uIE5vdCBGb3VuZCIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWdpc3RlckVqYkludGVyY2VwdG9yKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgT2JqZWN0IGludGVyY2VwdG9yID0gbmV3IEVqYkNvbXBvbmVudEludGVyY2VwdG9yKGluamVjdGlvbk1hbmFnZXIpOworICAgICAgICAgICAgaW5pdGlhbENvbnRleHQgPSBnZXRJbml0aWFsQ29udGV4dCgpOworICAgICAgICAgICAgZmluYWwgRWpiQ29udGFpbmVyVXRpbCBlamJVdGlsID0gRWpiQ29udGFpbmVyVXRpbEltcGwuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uSW5mbyBhcHBJbmZvID0gZ2V0QXBwbGljYXRpb25JbmZvKGVqYlV0aWwpOworICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHRlbXBMaWJOYW1lcyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICAgICAgICAgIGZvciAoTW9kdWxlSW5mbyBtb2R1bGVJbmZvIDogYXBwSW5mby5nZXRNb2R1bGVJbmZvcygpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGphck5hbWUgPSBtb2R1bGVJbmZvLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoamFyTmFtZS5lbmRzV2l0aCgiLmphciIpIHx8IGphck5hbWUuZW5kc1dpdGgoIi53YXIiKSkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbW9kdWxlTmFtZSA9IGphck5hbWUuc3Vic3RyaW5nKDAsIGphck5hbWUubGVuZ3RoKCkgLSA0KTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcExpYk5hbWVzLmFkZChtb2R1bGVOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGJ1bmRsZURlc2NyaXB0b3IgPSBtb2R1bGVJbmZvLmdldE1ldGFEYXRhKEVqYkJ1bmRsZURlc2NyaXB0b3JJbXBsLmNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChidW5kbGVEZXNjcmlwdG9yIGluc3RhbmNlb2YgRWpiQnVuZGxlRGVzY3JpcHRvckltcGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbGxlY3Rpb248RWpiRGVzY3JpcHRvcj4gZWpicyA9ICgoRWpiQnVuZGxlRGVzY3JpcHRvckltcGwpIGJ1bmRsZURlc2NyaXB0b3IpLmdldEVqYnMoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChmaW5hbCBFamJEZXNjcmlwdG9yIGVqYiA6IGVqYnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBCYXNlQ29udGFpbmVyIGVqYkNvbnRhaW5lciA9IEVqYkNvbnRhaW5lclV0aWxJbXBsLmdldEluc3RhbmNlKCkuZ2V0Q29udGFpbmVyKGVqYi5nZXRVbmlxdWVJZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZXRob2QgcmVnaXN0ZXJJbnRlcmNlcHRvck1ldGhvZCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlQ29udGFpbmVyLmNsYXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREZWNsYXJlZE1ldGhvZCgicmVnaXN0ZXJTeXN0ZW1JbnRlcmNlcHRvciIsIGphdmEubGFuZy5PYmplY3QuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVySW50ZXJjZXB0b3JNZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVySW50ZXJjZXB0b3JNZXRob2QuaW52b2tlKGVqYkNvbnRhaW5lciwgaW50ZXJjZXB0b3IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIHBhZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUaHJvd2FibGUgY2F1c2UgPSBwYWUuZ2V0Q2F1c2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsaXphdGlvbk1lc3NhZ2VzLkVKQl9JTlRFUkNFUFRPUl9CSU5ESU5HX1dBUk5JTkcoZWpiLmdldEVqYkNsYXNzTmFtZSgpKSwgY2F1c2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpYk5hbWVzLmFkZEFsbCh0ZW1wTGliTmFtZXMpOworICAgICAgICAgICAgZmluYWwgT2JqZWN0IGludGVyY2VwdG9yQmluZGVyID0gaW5pdGlhbENvbnRleHQubG9va3VwKCJqYXZhOm9yZy5nbGFzc2Zpc2guZWpiLmNvbnRhaW5lci5pbnRlcmNlcHRvcl9iaW5kaW5nX3NwaSIpOworICAgICAgICAgICAgLy8gU29tZSBpbXBsZW1lbnRhdGlvbnMgb2YgSW5pdGlhbENvbnRleHQgcmV0dXJuIG51bGwgaW5zdGVhZCBvZgorICAgICAgICAgICAgLy8gdGhyb3dpbmcgTmFtaW5nRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIE9iamVjdCBhc3NvY2lhdGVkIHdpdGgKKyAgICAgICAgICAgIC8vIHRoZSBuYW1lCisgICAgICAgICAgICBpZiAoaW50ZXJjZXB0b3JCaW5kZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuRUpCX0lOVEVSQ0VQVE9SX0JJTkRfQVBJX05PVF9BVkFJTEFCTEUoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kIGludGVyY2VwdG9yQmluZGVyTWV0aG9kID0gaW50ZXJjZXB0b3JCaW5kZXIuZ2V0Q2xhc3MoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TWV0aG9kKCJyZWdpc3RlckludGVyY2VwdG9yIiwgamF2YS5sYW5nLk9iamVjdC5jbGFzcyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVyY2VwdG9yQmluZGVyTWV0aG9kLmludm9rZShpbnRlcmNlcHRvckJpbmRlciwgaW50ZXJjZXB0b3IpOworICAgICAgICAgICAgICAgICAgICAgICAgRWpiQ29tcG9uZW50UHJvdmlkZXIudGhpcy5lamJJbnRlcmNlcHRvclJlZ2lzdGVyZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5DT05GSUcsIExvY2FsaXphdGlvbk1lc3NhZ2VzLkVKQl9JTlRFUkNFUFRPUl9CT1VORCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9IGNhdGNoIChQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIHBhZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuRUpCX0lOVEVSQ0VQVE9SX0NPTkZJR19FUlJPUigpLCBwYWUuZ2V0Q2F1c2UoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLkVKQl9JTlRFUkNFUFRPUl9CSU5EX0FQSV9OT1RfQVZBSUxBQkxFKCksIGV4KTsKKyAgICAgICAgfSBjYXRjaCAoTGlua2FnZUVycm9yIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLkVKQl9JTlRFUkNFUFRPUl9DT05GSUdfTElOS0FHRV9FUlJPUigpLCBleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDb21wb25lbnRQcm92aWRlcgorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGJpbmQoQ2xhc3M8Pz4gY29tcG9uZW50LCBTZXQ8Q2xhc3M8Pz4+IHByb3ZpZGVyQ29udHJhY3RzKSB7CisKKyAgICAgICAgaWYgKExPR0dFUi5pc0xvZ2dhYmxlKExldmVsLkZJTkUpKSB7CisgICAgICAgICAgICBMT0dHRVIuZmluZShMb2NhbGl6YXRpb25NZXNzYWdlcy5FSkJfQ0xBU1NfQkVJTkdfQ0hFQ0tFRChjb21wb25lbnQpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbmplY3Rpb25NYW5hZ2VyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuRUpCX0NPTVBPTkVOVF9QUk9WSURFUl9OT1RfSU5JVElBTElaRURfUFJPUEVSTFkoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWlzRWpiQ29tcG9uZW50KGNvbXBvbmVudCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghZWpiSW50ZXJjZXB0b3JSZWdpc3RlcmVkKSB7CisgICAgICAgICAgICByZWdpc3RlckVqYkludGVyY2VwdG9yKCk7CisgICAgICAgIH0KKworICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSBCaW5kaW5ncy5zdXBwbGllcihuZXcgRWpiRmFjdG9yeShjb21wb25lbnQsIGluaXRpYWxDb250ZXh0LCBFamJDb21wb25lbnRQcm92aWRlci50aGlzKSkKKyAgICAgICAgICAgICAgICAudG8oY29tcG9uZW50KQorICAgICAgICAgICAgICAgIC50byhwcm92aWRlckNvbnRyYWN0cyk7CisgICAgICAgIGluamVjdGlvbk1hbmFnZXIucmVnaXN0ZXIoYmluZGluZyk7CisKKyAgICAgICAgaWYgKExPR0dFUi5pc0xvZ2dhYmxlKExldmVsLkNPTkZJRykpIHsKKyAgICAgICAgICAgIExPR0dFUi5jb25maWcoTG9jYWxpemF0aW9uTWVzc2FnZXMuRUpCX0NMQVNTX0JPVU5EX1dJVEhfQ0RJKGNvbXBvbmVudCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZG9uZSgpIHsKKyAgICAgICAgcmVnaXN0ZXJFamJFeGNlcHRpb25NYXBwZXIoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVnaXN0ZXJFamJFeGNlcHRpb25NYXBwZXIoKSB7CisgICAgICAgIGluamVjdGlvbk1hbmFnZXIucmVnaXN0ZXIobmV3IEFic3RyYWN0QmluZGVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgICAgICAgICAgYmluZChFamJFeGNlcHRpb25NYXBwZXIuY2xhc3MpLnRvKEV4Y2VwdGlvbk1hcHBlci5jbGFzcykuaW4oU2luZ2xldG9uLmNsYXNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzRWpiQ29tcG9uZW50KENsYXNzPD8+IGNvbXBvbmVudCkgeworICAgICAgICBmb3IgKEFubm90YXRpb24gYSA6IGNvbXBvbmVudC5nZXRBbm5vdGF0aW9ucygpKSB7CisgICAgICAgICAgICBpZiAoRWpiQ29tcG9uZW50QW5ub3RhdGlvbnMuY29udGFpbnMoYS5hbm5vdGF0aW9uVHlwZSgpLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEludm9jYXRpb25IYW5kbGVyIGNyZWF0ZShJbnZvY2FibGUgbWV0aG9kKSB7CisKKyAgICAgICAgZmluYWwgQ2xhc3M8Pz4gcmVzb3VyY2VDbGFzcyA9IG1ldGhvZC5nZXRIYW5kbGVyKCkuZ2V0SGFuZGxlckNsYXNzKCk7CisKKyAgICAgICAgaWYgKHJlc291cmNlQ2xhc3MgPT0gbnVsbCB8fCAhaXNFamJDb21wb25lbnQocmVzb3VyY2VDbGFzcykpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgTWV0aG9kIGhhbmRsaW5nTWV0aG9kID0gbWV0aG9kLmdldERlZmluaXRpb25NZXRob2QoKTsKKworICAgICAgICBmb3IgKENsYXNzIGlGYWNlIDogcmVtb3RlQW5kTG9jYWxJZmFjZXMocmVzb3VyY2VDbGFzcykpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZmluYWwgTWV0aG9kIGlGYWNlTWV0aG9kID0gaUZhY2UuZ2V0RGVjbGFyZWRNZXRob2QoaGFuZGxpbmdNZXRob2QuZ2V0TmFtZSgpLCBoYW5kbGluZ01ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpKTsKKyAgICAgICAgICAgICAgICBpZiAoaUZhY2VNZXRob2QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEludm9jYXRpb25IYW5kbGVyKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGludm9rZShPYmplY3QgdGFyZ2V0LCBNZXRob2QgaWdub3JlZCwgT2JqZWN0W10gYXJncykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlGYWNlTWV0aG9kLmludm9rZSh0YXJnZXQsIGFyZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB8IFNlY3VyaXR5RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgbG9nTG9va3VwRXhjZXB0aW9uKGhhbmRsaW5nTWV0aG9kLCByZXNvdXJjZUNsYXNzLCBpRmFjZSwgZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBsb2dMb29rdXBFeGNlcHRpb24oZmluYWwgTWV0aG9kIG1ldGhvZCwgZmluYWwgQ2xhc3M8Pz4gY29tcG9uZW50LCBDbGFzczw/PiBpRmFjZSwgRXhjZXB0aW9uIGV4KSB7CisgICAgICAgIExPR0dFUi5sb2coCisgICAgICAgICAgICAgICAgTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICBMb2NhbGl6YXRpb25NZXNzYWdlcy5FSkJfSU5URVJGQUNFX0hBTkRMSU5HX01FVEhPRF9MT09LVVBfRVhDRVBUSU9OKG1ldGhvZCwgY29tcG9uZW50LCBpRmFjZSksIGV4KTsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8Q2xhc3M+IHJlbW90ZUFuZExvY2FsSWZhY2VzKGZpbmFsIENsYXNzPD8+IHJlc291cmNlQ2xhc3MpIHsKKyAgICAgICAgZmluYWwgTGlzdDxDbGFzcz4gYWxsTG9jYWxPclJlbW90ZUlmYWNlcyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICAgICAgaWYgKHJlc291cmNlQ2xhc3MuaXNBbm5vdGF0aW9uUHJlc2VudChSZW1vdGUuY2xhc3MpKSB7CisgICAgICAgICAgICBhbGxMb2NhbE9yUmVtb3RlSWZhY2VzLmFkZEFsbChBcnJheXMuYXNMaXN0KHJlc291cmNlQ2xhc3MuZ2V0QW5ub3RhdGlvbihSZW1vdGUuY2xhc3MpLnZhbHVlKCkpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVzb3VyY2VDbGFzcy5pc0Fubm90YXRpb25QcmVzZW50KExvY2FsLmNsYXNzKSkgeworICAgICAgICAgICAgYWxsTG9jYWxPclJlbW90ZUlmYWNlcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChyZXNvdXJjZUNsYXNzLmdldEFubm90YXRpb24oTG9jYWwuY2xhc3MpLnZhbHVlKCkpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKENsYXNzPD8+IGkgOiByZXNvdXJjZUNsYXNzLmdldEludGVyZmFjZXMoKSkgeworICAgICAgICAgICAgaWYgKGkuaXNBbm5vdGF0aW9uUHJlc2VudChSZW1vdGUuY2xhc3MpIHx8IGkuaXNBbm5vdGF0aW9uUHJlc2VudChMb2NhbC5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICBhbGxMb2NhbE9yUmVtb3RlSWZhY2VzLmFkZChpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWxsTG9jYWxPclJlbW90ZUlmYWNlczsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBJbml0aWFsQ29udGV4dCBnZXRJbml0aWFsQ29udGV4dCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIERlcGxveW1lbnQgb24gR29vZ2xlIEFwcCBFbmdpbmUgd2lsbAorICAgICAgICAgICAgLy8gcmVzdWx0IGluIGEgTGlua2FnZUVycm9yCisgICAgICAgICAgICByZXR1cm4gbmV3IEluaXRpYWxDb250ZXh0KCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5JTklUSUFMX0NPTlRFWFRfTk9UX0FWQUlMQUJMRSgpLCBleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBPYmplY3QgbG9va3VwKEluaXRpYWxDb250ZXh0IGljLCBDbGFzczw/PiBjLCBTdHJpbmcgbmFtZSwgRWpiQ29tcG9uZW50UHJvdmlkZXIgcHJvdmlkZXIpCisgICAgICAgICAgICB0aHJvd3MgTmFtaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBsb29rdXBTaW1wbGVGb3JtKGljLCBuYW1lLCBwcm92aWRlcik7CisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5XQVJOSU5HLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5FSkJfQ0xBU1NfU0lNUExFX0xPT0tVUF9GQUlMRUQoYy5nZXROYW1lKCkpLCBleCk7CisKKyAgICAgICAgICAgIHJldHVybiBsb29rdXBGdWxseVF1YWxpZmllZEZvcm0oaWMsIGMsIG5hbWUsIHByb3ZpZGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBsb29rdXBTaW1wbGVGb3JtKEluaXRpYWxDb250ZXh0IGljLCBTdHJpbmcgbmFtZSwgRWpiQ29tcG9uZW50UHJvdmlkZXIgcHJvdmlkZXIpIHRocm93cyBOYW1pbmdFeGNlcHRpb24geworICAgICAgICBpZiAocHJvdmlkZXIubGliTmFtZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBTdHJpbmcgam5kaU5hbWUgPSAiamF2YTptb2R1bGUvIiArIG5hbWU7CisgICAgICAgICAgICByZXR1cm4gaWMubG9va3VwKGpuZGlOYW1lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE5hbWluZ0V4Y2VwdGlvbiBuZSA9IG51bGw7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBtb2R1bGVOYW1lIDogcHJvdmlkZXIubGliTmFtZXMpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgam5kaU5hbWUgPSAiamF2YTphcHAvIiArIG1vZHVsZU5hbWUgKyAiLyIgKyBuYW1lOworICAgICAgICAgICAgICAgIE9iamVjdCByZXN1bHQ7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gaWMubG9va3VwKGpuZGlOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbmUgPSBlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IChuZSAhPSBudWxsKSA/IG5lIDogbmV3IE5hbWluZ0V4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGxvb2t1cEZ1bGx5UXVhbGlmaWVkRm9ybShJbml0aWFsQ29udGV4dCBpYywgQ2xhc3M8Pz4gYywgU3RyaW5nIG5hbWUsIEVqYkNvbXBvbmVudFByb3ZpZGVyIHByb3ZpZGVyKQorICAgICAgICAgICAgdGhyb3dzIE5hbWluZ0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChwcm92aWRlci5saWJOYW1lcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIFN0cmluZyBqbmRpTmFtZSA9ICJqYXZhOm1vZHVsZS8iICsgbmFtZSArICIhIiArIGMuZ2V0TmFtZSgpOworICAgICAgICAgICAgcmV0dXJuIGljLmxvb2t1cChqbmRpTmFtZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBOYW1pbmdFeGNlcHRpb24gbmUgPSBudWxsOworICAgICAgICAgICAgZm9yIChTdHJpbmcgbW9kdWxlTmFtZSA6IHByb3ZpZGVyLmxpYk5hbWVzKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIGpuZGlOYW1lID0gImphdmE6YXBwLyIgKyBtb2R1bGVOYW1lICsgIi8iICsgbmFtZSArICIhIiArIGMuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIE9iamVjdCByZXN1bHQ7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gaWMubG9va3VwKGpuZGlOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTmFtaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbmUgPSBlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IChuZSAhPSBudWxsKSA/IG5lIDogbmV3IE5hbWluZ0V4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVycy9nbGFzc2Zpc2gvamVyc2V5LWdmLWVqYi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2dmL2VqYi9pbnRlcm5hbC9FamJFeGNlcHRpb25NYXBwZXIuamF2YSBiL2NvbnRhaW5lcnMvZ2xhc3NmaXNoL2plcnNleS1nZi1lamIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9nZi9lamIvaW50ZXJuYWwvRWpiRXhjZXB0aW9uTWFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEyMWM0MQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lcnMvZ2xhc3NmaXNoL2plcnNleS1nZi1lamIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9nZi9lamIvaW50ZXJuYWwvRWpiRXhjZXB0aW9uTWFwcGVyLmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5nZi5lamIuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5FeGNlcHRpb25NYXBwZXI7CisKK2ltcG9ydCBqYXZheC5lamIuRUpCRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLkV4Y2VwdGlvbk1hcHBlcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLkV4dGVuZGVkRXhjZXB0aW9uTWFwcGVyOworCisvKioKKyAqIEhlbHBlciBjbGFzcyB0byBoYW5kbGUgZXhjZXB0aW9ucyB3cmFwcGVkIGJ5IHRoZSBFSkIgY29udGFpbmVyIHdpdGggRUpCRXhjZXB0aW9uLgorICogSWYgdGhpcyBtYXBwZXIgd2FzIG5vdCByZWdpc3RlcmVkLCBubyB7QGxpbmsgV2ViQXBwbGljYXRpb25FeGNlcHRpb259CisgKiB3b3VsZCBlbmQgdXAgbWFwcGVkIHRvIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBFamJFeGNlcHRpb25NYXBwZXIgaW1wbGVtZW50cyBFeHRlbmRlZEV4Y2VwdGlvbk1hcHBlcjxFSkJFeGNlcHRpb24+IHsKKworICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8RXhjZXB0aW9uTWFwcGVycz4gbWFwcGVyczsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgRUpCIGV4Y2VwdGlvbiBtYXBwZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGVycyB1dGlsaXR5IHRvIGZpbmQgbWFwcGVyIGRlbGVnYXRlLgorICAgICAqLworICAgIEBJbmplY3QKKyAgICBwdWJsaWMgRWpiRXhjZXB0aW9uTWFwcGVyKFByb3ZpZGVyPEV4Y2VwdGlvbk1hcHBlcnM+IG1hcHBlcnMpIHsKKyAgICAgICAgdGhpcy5tYXBwZXJzID0gbWFwcGVyczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzcG9uc2UgdG9SZXNwb25zZShFSkJFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgIHJldHVybiBjYXVzZVRvUmVzcG9uc2UoZXhjZXB0aW9uKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc01hcHBhYmxlKEVKQkV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiAoY2F1c2VUb1Jlc3BvbnNlKGV4Y2VwdGlvbikgIT0gbnVsbCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBpZ25vcmVkKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFJlc3BvbnNlIGNhdXNlVG9SZXNwb25zZShFSkJFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisKKyAgICAgICAgZmluYWwgRXhjZXB0aW9uIGNhdXNlID0gZXhjZXB0aW9uLmdldENhdXNlZEJ5RXhjZXB0aW9uKCk7CisKKyAgICAgICAgaWYgKGNhdXNlICE9IG51bGwpIHsKKworICAgICAgICAgICAgZmluYWwgRXhjZXB0aW9uTWFwcGVyIG1hcHBlciA9IG1hcHBlcnMuZ2V0KCkuZmluZE1hcHBpbmcoY2F1c2UpOworICAgICAgICAgICAgaWYgKG1hcHBlciAhPSBudWxsICYmIG1hcHBlciAhPSB0aGlzKSB7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gbWFwcGVyLnRvUmVzcG9uc2UoY2F1c2UpOworCisgICAgICAgICAgICB9IGVsc2UgaWYgKGNhdXNlIGluc3RhbmNlb2YgV2ViQXBwbGljYXRpb25FeGNlcHRpb24pIHsKKworICAgICAgICAgICAgICAgIHJldHVybiAoKFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKSBjYXVzZSkuZ2V0UmVzcG9uc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXJzL2dsYXNzZmlzaC9qZXJzZXktZ2YtZWpiL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZ2YvZWpiL2ludGVybmFsL3BhY2thZ2UtaW5mby5qYXZhIGIvY29udGFpbmVycy9nbGFzc2Zpc2gvamVyc2V5LWdmLWVqYi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2dmL2VqYi9pbnRlcm5hbC9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDBjZmU3Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVycy9nbGFzc2Zpc2gvamVyc2V5LWdmLWVqYi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2dmL2VqYi9pbnRlcm5hbC9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvKioKKyAqIEplcnNleSBpbnRlcm5hbCBwYWNrYWdlIHN1cHBvcnRpbmcgSmVyc2V5IEVKQiBpbmplY3Rpb25zIGluIEdsYXNzZmlzaCA0IGVudmlyb25tZW50LgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmdmLmVqYi5pbnRlcm5hbDsKZGlmZiAtLWdpdCBhL2NvbnRhaW5lcnMvZ2xhc3NmaXNoL2plcnNleS1nZi1lamIvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29tcG9uZW50UHJvdmlkZXIgYi9jb250YWluZXJzL2dsYXNzZmlzaC9qZXJzZXktZ2YtZWpiL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbXBvbmVudFByb3ZpZGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYjEzYjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXJzL2dsYXNzZmlzaC9qZXJzZXktZ2YtZWpiL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbXBvbmVudFByb3ZpZGVyCkBAIC0wLDAgKzEgQEAKK29yZy5nbGFzc2Zpc2guamVyc2V5LmdmLmVqYi5pbnRlcm5hbC5FamJDb21wb25lbnRQcm92aWRlcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVycy9nbGFzc2Zpc2gvamVyc2V5LWdmLWVqYi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZ2YvZWpiL2ludGVybmFsL2xvY2FsaXphdGlvbi5wcm9wZXJ0aWVzIGIvY29udGFpbmVycy9nbGFzc2Zpc2gvamVyc2V5LWdmLWVqYi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZ2YvZWpiL2ludGVybmFsL2xvY2FsaXphdGlvbi5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1YmJmMWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXJzL2dsYXNzZmlzaC9qZXJzZXktZ2YtZWpiL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9nZi9lamIvaW50ZXJuYWwvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyOSBAQAorIworIyBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisjIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyMKKyMgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorIyBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisjIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorIyB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisjCisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorIworCitpbml0aWFsLmNvbnRleHQubm90LmF2YWlsYWJsZT1Jbml0aWFsQ29udGV4dCBub3QgZm91bmQuIEpBWC1SUyBFSkIgc3VwcG9ydCBpcyBub3QgYXZhaWxhYmxlLgorZWpiLmludGVyY2VwdG9yLmJpbmQuYXBpLm5vdC5hdmFpbGFibGU9VGhlIEVKQiBpbnRlcmNlcHRvciBiaW5kaW5nIEFQSSBpcyBub3QgYXZhaWxhYmxlLiBKQVgtUlMgRUpCIGludGVncmF0aW9uIGNhbiBub3QgYmUgc3VwcG9ydGVkLgorZWpiLmludGVyY2VwdG9yLmJpbmQuYXBpLm5vbi5jb25mb3JtYW50PVRoZSBFSkIgaW50ZXJjZXB0b3IgYmluZGluZyBBUEkgZG9lcyBub3QgY29uZm9ybSB0byB3aGF0IGlzIGV4cGVjdGVkLiBKQVgtUlMgRUpCIGludGVncmF0aW9uIGNhbiBub3QgYmUgc3VwcG9ydGVkLgorZWpiLmludGVyY2VwdG9yLmJpbmRpbmcud2FybmluZz1Db3VsZCBub3QgYmluZCBFSkIgaW50ZXJjZXRvciBmb3IgY2xhc3MsIHswfS4KK2VqYi5pbnRlcmNlcHRvci5ib3VuZD1UaGUgSmVyc2V5IEVKQiBpbnRlcmNlcHRvciBpcyBib3VuZC4gSkFYLVJTIEVKQiBpbnRlZ3JhdGlvbiBzdXBwb3J0IGlzIGVuYWJsZWQuCitlamIuaW50ZXJjZXB0b3IuY29uZmlnLmVycm9yPUVycm9yIHdoZW4gY29uZmlndXJpbmcgdG8gdXNlIHRoZSBFSkIgaW50ZXJjZXB0b3IgYmluZGluZyBBUEkuIEpBWC1SUyBFSkIgaW50ZWdyYXRpb24gY2FuIG5vdCBiZSBzdXBwb3J0ZWQuCitlamIuaW50ZXJjZXB0b3IuY29uZmlnLnNlY3VyaXR5LmVycm9yPVNlY3VyaXR5IGlzc3VlIHdoZW4gY29uZmlndXJpbmcgdG8gdXNlIHRoZSBFSkIgaW50ZXJjZXB0b3IgYmluZGluZyBBUEkuIEpBWC1SUyBFSkIgc3VwcG9ydCBpcyBub3QgYXZhaWxhYmxlLgorZWpiLmludGVyY2VwdG9yLmNvbmZpZy5saW5rYWdlLmVycm9yPUxpbmthZ2UgZXJyb3Igd2hlbiBjb25maWd1cmluZyB0byB1c2UgdGhlIEVKQiBpbnRlcmNlcHRvciBiaW5kaW5nIEFQSS4gSkFYLVJTIEVKQiBpbnRlZ3JhdGlvbiBjYW4gbm90IGJlIHN1cHBvcnRlZC4KK2VqYi5jb21wb25lbnQucHJvdmlkZXIubm90LmluaXRpYWxpemVkLnByb3Blcmx5PUVKQiBjb21wb25lbnQgcHJvdmlkZXIgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIHByb3Blcmx5LgorZWpiLmNsYXNzLnNpbXBsZS5sb29rdXAuZmFpbGVkPUFuIGluc3RhbmNlIG9mIEVKQiBjbGFzcywgezB9LCBjb3VsZCBub3QgYmUgbG9va2VkIHVwIHVzaW5nIHNpbXBsZSBmb3JtIG5hbWUuIEF0dGVtcHRpbmcgdG8gbG9vayB1cCB1c2luZyB0aGUgZnVsbHktcXVhbGlmaWVkIGZvcm0gbmFtZS4KK2VqYi5pbnRlcmZhY2UuaGFuZGxpbmcubWV0aG9kLmxvb2t1cC5leGNlcHRpb249RXhjZXB0aW9uIHRocm93biB3aGVuIHRyeWluZyB0byBsb29rdXAgYWN0dWFsIGhhbmRsaW5nIG1ldGhvZCwgezB9LCBmb3IgRUpCIHR5cGUsIHsxfSwgdXNpbmcgaW50ZXJmYWNlIHsyfS4KK2VqYi5jbGFzcy5iZWluZy5jaGVja2VkPUNsYXNzLCB7MH0sIGlzIGJlaW5nIGNoZWNrZWQgd2l0aCBKZXJzZXkgRUpCIGNvbXBvbmVudCBwcm92aWRlci4KK2VqYi5jbGFzcy5ib3VuZC53aXRoLmNkaT1DbGFzcywgezB9LCBoYXMgYmVlbiBib3VuZCBieSBKZXJzZXkgRUpCIGNvbXBvbmVudCBwcm92aWRlci4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lcnMvZ2xhc3NmaXNoL3BvbS54bWwgYi9jb250YWluZXJzL2dsYXNzZmlzaC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMGQ5MmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXJzL2dsYXNzZmlzaC9wb20ueG1sCkBAIC0wLDAgKzEsNDAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnMuZ2xhc3NmaXNoPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktZ2xhc3NmaXNoLXN1cHBvcnQ8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+SmVyc2V5IEdsYXNzRmlzaCBjb250YWluZXIgcHJvdmlkZXJzIHVtYnJlbGxhIHByb2plY3QgbW9kdWxlPC9kZXNjcmlwdGlvbj4KKworICAgIDxtb2R1bGVzPgorICAgICAgICA8bW9kdWxlPmplcnNleS1nZi1lamI8L21vZHVsZT4KKyAgICA8L21vZHVsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lcnMvZ3JpenpseTItaHR0cC9wb20ueG1sIGIvY29udGFpbmVycy9ncml6emx5Mi1odHRwL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDllNzVlNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lcnMvZ3JpenpseTItaHR0cC9wb20ueG1sCkBAIC0wLDAgKzEsNzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItZ3JpenpseTItaHR0cDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS1jb250YWluZXItZ3JpenpseTItaHR0cDwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5Hcml6emx5IDIgSHR0cCBDb250YWluZXIuPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5oazIuZXh0ZXJuYWw8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5pbmplY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmdyaXp6bHk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5ncml6emx5LWh0dHAtc2VydmVyPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLmlzdGFjazwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1pc3RhY2stY29tbW9ucy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YnVpbGQtaGVscGVyLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmZlbGl4PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWJ1bmRsZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorCisgICAgICAgIDxyZXNvdXJjZXM+CisgICAgICAgICAgICA8cmVzb3VyY2U+CisgICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL2phdmE8L2RpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZXM+CisgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPk1FVEEtSU5GLyoqLyo8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KKyAgICAgICAgICAgIDwvcmVzb3VyY2U+CisgICAgICAgICAgICA8cmVzb3VyY2U+CisgICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgorICAgICAgICAgICAgICAgIDxmaWx0ZXJpbmc+dHJ1ZTwvZmlsdGVyaW5nPgorICAgICAgICAgICAgPC9yZXNvdXJjZT4KKyAgICAgICAgPC9yZXNvdXJjZXM+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVycy9ncml6emx5Mi1odHRwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZ3JpenpseTIvaHR0cHNlcnZlci9Hcml6emx5SHR0cENvbnRhaW5lci5qYXZhIGIvY29udGFpbmVycy9ncml6emx5Mi1odHRwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZ3JpenpseTIvaHR0cHNlcnZlci9Hcml6emx5SHR0cENvbnRhaW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjOTgxNWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXJzL2dyaXp6bHkyLWh0dHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9ncml6emx5Mi9odHRwc2VydmVyL0dyaXp6bHlIdHRwQ29udGFpbmVyLmphdmEKQEAgLTAsMCArMSw0ODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseTIuaHR0cHNlcnZlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkdlbmVyaWNUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuU2VjdXJpdHlDb250ZXh0OworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5Mi5odHRwc2VydmVyLmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5BYnN0cmFjdEJpbmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuUmVmZXJlbmNpbmdGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuRXh0ZW5kZWRMb2dnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLlJlZjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLmludGVybmFsLlJlcXVlc3RTY29wZWQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLkNvbnRhaW5lclV0aWxzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29udGFpbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29udGFpbmVyUmVzcG9uc2VXcml0ZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmdyaXp6bHkuQ29tcGxldGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5ncml6emx5Lmh0dHAuc2VydmVyLkh0dHBIYW5kbGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guZ3JpenpseS5odHRwLnNlcnZlci5SZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guZ3JpenpseS5odHRwLnNlcnZlci5SZXNwb25zZTsKKworLyoqCisgKiBKZXJzZXkge0Bjb2RlIENvbnRhaW5lcn0gaW1wbGVtZW50YXRpb24gYmFzZWQgb24gR3JpenpseSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5ncml6emx5Lmh0dHAuc2VydmVyLkh0dHBIYW5kbGVyfS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBHcml6emx5SHR0cENvbnRhaW5lciBleHRlbmRzIEh0dHBIYW5kbGVyIGltcGxlbWVudHMgQ29udGFpbmVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEV4dGVuZGVkTG9nZ2VyIGxvZ2dlciA9CisgICAgICAgICAgICBuZXcgRXh0ZW5kZWRMb2dnZXIoTG9nZ2VyLmdldExvZ2dlcihHcml6emx5SHR0cENvbnRhaW5lci5jbGFzcy5nZXROYW1lKCkpLCBMZXZlbC5GSU5FU1QpOworCisgICAgcHJpdmF0ZSBmaW5hbCBUeXBlIFJlcXVlc3RUWVBFID0gKG5ldyBHZW5lcmljVHlwZTxSZWY8UmVxdWVzdD4+KCkgeyB9KS5nZXRUeXBlKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBUeXBlIFJlc3BvbnNlVFlQRSA9IChuZXcgR2VuZXJpY1R5cGU8UmVmPFJlc3BvbnNlPj4oKSB7IH0pLmdldFR5cGUoKTsKKworICAgIC8qKgorICAgICAqIENhY2hlZCB2YWx1ZSBvZiBjb25maWd1cmF0aW9uIHByb3BlcnR5CisgICAgICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzI1JFU1BPTlNFX1NFVF9TVEFUVVNfT1ZFUl9TRU5EX0VSUk9SfS4KKyAgICAgKiBJZiB7QGNvZGUgdHJ1ZX0gbWV0aG9kIHtAbGluayBvcmcuZ2xhc3NmaXNoLmdyaXp6bHkuaHR0cC5zZXJ2ZXIuUmVzcG9uc2Ujc2V0U3RhdHVzfSBpcyB1c2VkIG92ZXIKKyAgICAgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5ncml6emx5Lmh0dHAuc2VydmVyLlJlc3BvbnNlI3NlbmRFcnJvcn0uCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGNvbmZpZ1NldFN0YXR1c092ZXJTZW5kRXJyb3I7CisKKyAgICAvKioKKyAgICAgKiBDYWNoZWQgdmFsdWUgb2YgY29uZmlndXJhdGlvbiBwcm9wZXJ0eQorICAgICAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcyNSRURVQ0VfQ09OVEVYVF9QQVRIX1NMQVNIRVNfRU5BQkxFRH0uCisgICAgICogSWYge0Bjb2RlIHRydWV9IG1ldGhvZCB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseTIuaHR0cHNlcnZlci5Hcml6emx5SHR0cENvbnRhaW5lciNnZXRSZXF1ZXN0VXJpKFJlcXVlc3QpfQorICAgICAqIHdpbGwgcmVkdWNlIHRoZSBvZiBsZWFkaW5nIGNvbnRleHQtcGF0aCBzbGFzaGVzIHRvIG9ubHkgb25lLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBjb25maWdSZWR1Y2VDb250ZXh0UGF0aFNsYXNoZXNFbmFibGVkOworCisgICAgLyoqCisgICAgICogUmVmZXJlbmNpbmcgZmFjdG9yeSBmb3IgR3JpenpseSByZXF1ZXN0LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEdyaXp6bHlSZXF1ZXN0UmVmZXJlbmNpbmdGYWN0b3J5IGV4dGVuZHMgUmVmZXJlbmNpbmdGYWN0b3J5PFJlcXVlc3Q+IHsKKworICAgICAgICBASW5qZWN0CisgICAgICAgIHB1YmxpYyBHcml6emx5UmVxdWVzdFJlZmVyZW5jaW5nRmFjdG9yeShmaW5hbCBQcm92aWRlcjxSZWY8UmVxdWVzdD4+IHJlZmVyZW5jZUZhY3RvcnkpIHsKKyAgICAgICAgICAgIHN1cGVyKHJlZmVyZW5jZUZhY3RvcnkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVmZXJlbmNpbmcgZmFjdG9yeSBmb3IgR3JpenpseSByZXNwb25zZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBHcml6emx5UmVzcG9uc2VSZWZlcmVuY2luZ0ZhY3RvcnkgZXh0ZW5kcyBSZWZlcmVuY2luZ0ZhY3Rvcnk8UmVzcG9uc2U+IHsKKworICAgICAgICBASW5qZWN0CisgICAgICAgIHB1YmxpYyBHcml6emx5UmVzcG9uc2VSZWZlcmVuY2luZ0ZhY3RvcnkoZmluYWwgUHJvdmlkZXI8UmVmPFJlc3BvbnNlPj4gcmVmZXJlbmNlRmFjdG9yeSkgeworICAgICAgICAgICAgc3VwZXIocmVmZXJlbmNlRmFjdG9yeSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbiBpbnRlcm5hbCBiaW5kZXIgdG8gZW5hYmxlIEdyaXp6bHkgSFRUUCBjb250YWluZXIgc3BlY2lmaWMgdHlwZXMgaW5qZWN0aW9uLgorICAgICAqIDxwLz4KKyAgICAgKiBUaGlzIGJpbmRlciBhbGxvd3MgdG8gaW5qZWN0IHVuZGVybHlpbmcgR3JpenpseSBIVFRQIHJlcXVlc3QgYW5kIHJlc3BvbnNlIGluc3RhbmNlcy4KKyAgICAgKiBOb3RlIHRoYXQgc2luY2UgR3JpenpseSB7QGNvZGUgUmVxdWVzdH0gY2xhc3MgaXMgbm90IHByb3hpYWJsZSBhcyBpdCBkb2VzIG5vdCBleHBvc2UgYW4gZW1wdHkgY29uc3RydWN0b3IsCisgICAgICogdGhlIGluamVjdGlvbiBvZiBHcml6emx5IHJlcXVlc3QgaW5zdGFuY2UgaW50byBzaW5nbGV0b24gSkFYLVJTIGFuZCBKZXJzZXkgcHJvdmlkZXJzIGlzIG9ubHkgc3VwcG9ydGVkIHZpYQorICAgICAqIHtAbGluayBqYXZheC5pbmplY3QuUHJvdmlkZXIgaW5qZWN0aW9uIHByb3ZpZGVyfS4KKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgR3JpenpseUJpbmRlciBleHRlbmRzIEFic3RyYWN0QmluZGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICAgICAgYmluZEZhY3RvcnkoR3JpenpseVJlcXVlc3RSZWZlcmVuY2luZ0ZhY3RvcnkuY2xhc3MpLnRvKFJlcXVlc3QuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIC5wcm94eShmYWxzZSkuaW4oUmVxdWVzdFNjb3BlZC5jbGFzcyk7CisgICAgICAgICAgICBiaW5kRmFjdG9yeShSZWZlcmVuY2luZ0ZhY3RvcnkuPFJlcXVlc3Q+cmVmZXJlbmNlRmFjdG9yeSgpKS50byhuZXcgR2VuZXJpY1R5cGU8UmVmPFJlcXVlc3Q+PigpIHt9KQorICAgICAgICAgICAgICAgICAgICAuaW4oUmVxdWVzdFNjb3BlZC5jbGFzcyk7CisKKyAgICAgICAgICAgIGJpbmRGYWN0b3J5KEdyaXp6bHlSZXNwb25zZVJlZmVyZW5jaW5nRmFjdG9yeS5jbGFzcykudG8oUmVzcG9uc2UuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIC5wcm94eSh0cnVlKS5wcm94eUZvclNhbWVTY29wZShmYWxzZSkuaW4oUmVxdWVzdFNjb3BlZC5jbGFzcyk7CisgICAgICAgICAgICBiaW5kRmFjdG9yeShSZWZlcmVuY2luZ0ZhY3RvcnkuPFJlc3BvbnNlPnJlZmVyZW5jZUZhY3RvcnkoKSkudG8obmV3IEdlbmVyaWNUeXBlPFJlZjxSZXNwb25zZT4+KCkge30pCisgICAgICAgICAgICAgICAgICAgIC5pbihSZXF1ZXN0U2NvcGVkLmNsYXNzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbXBsZXRpb25IYW5kbGVyPFJlc3BvbnNlPiBFTVBUWV9DT01QTEVUSU9OX0hBTkRMRVIgPSBuZXcgQ29tcGxldGlvbkhhbmRsZXI8UmVzcG9uc2U+KCkgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjYW5jZWxsZWQoKSB7CisgICAgICAgICAgICAvLyBuby1vcAorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZhaWxlZChmaW5hbCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7CisgICAgICAgICAgICAvLyBuby1vcAorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNvbXBsZXRlZChmaW5hbCBSZXNwb25zZSByZXN1bHQpIHsKKyAgICAgICAgICAgIC8vIG5vLW9wCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlZChmaW5hbCBSZXNwb25zZSByZXN1bHQpIHsKKyAgICAgICAgICAgIC8vIG5vLW9wCisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVzcG9uc2VXcml0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXNwb25zZVdyaXRlciB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZXNwb25zZSBncml6emx5UmVzcG9uc2U7CisgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBjb25maWdTZXRTdGF0dXNPdmVyU2VuZEVycm9yOworCisgICAgICAgIFJlc3BvbnNlV3JpdGVyKGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlLCBmaW5hbCBib29sZWFuIGNvbmZpZ1NldFN0YXR1c092ZXJTZW5kRXJyb3IpIHsKKyAgICAgICAgICAgIHRoaXMuZ3JpenpseVJlc3BvbnNlID0gcmVzcG9uc2U7CisgICAgICAgICAgICB0aGlzLmNvbmZpZ1NldFN0YXR1c092ZXJTZW5kRXJyb3IgPSBjb25maWdTZXRTdGF0dXNPdmVyU2VuZEVycm9yOworCisgICAgICAgICAgICBpZiAobG9nZ2VyLmlzRGVidWdMb2dnYWJsZSgpKSB7CisgICAgICAgICAgICAgICAgdGhpcy5uYW1lID0gIlJlc3BvbnNlV3JpdGVyIHsiICsgImlkPSIgKyBVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpICsgIiwgZ3JpenpseVJlc3BvbnNlPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgZ3JpenpseVJlc3BvbnNlLmhhc2hDb2RlKCkgKyAnfSc7CisgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnTG9nKCJ7MH0gLSBpbml0IiwgbmFtZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9ICJSZXNwb25zZVdyaXRlciI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNvbW1pdCgpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKGdyaXp6bHlSZXNwb25zZS5pc1N1c3BlbmRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGdyaXp6bHlSZXNwb25zZS5yZXN1bWUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1Z0xvZygiezB9IC0gY29tbWl0KCkgY2FsbGVkIiwgbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gc3VzcGVuZChmaW5hbCBsb25nIHRpbWVPdXQsIGZpbmFsIFRpbWVVbml0IHRpbWVVbml0LCBmaW5hbCBUaW1lb3V0SGFuZGxlciB0aW1lb3V0SGFuZGxlcikgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBncml6emx5UmVzcG9uc2Uuc3VzcGVuZCh0aW1lT3V0LCB0aW1lVW5pdCwgRU1QVFlfQ09NUExFVElPTl9IQU5ETEVSLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IG9yZy5nbGFzc2Zpc2guZ3JpenpseS5odHRwLnNlcnZlci5UaW1lb3V0SGFuZGxlcigpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIG9uVGltZW91dChmaW5hbCBSZXNwb25zZSByZXNwb25zZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGltZW91dEhhbmRsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dEhhbmRsZXIub25UaW1lb3V0KFJlc3BvbnNlV3JpdGVyLnRoaXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyBzaG91bGQgd2UgcmV0dXJuIHRydWUgaW4gc29tZSBjYXNlcyBpbnN0ZWFkPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm5pbmcgZmFsc2UgcmVsaWVzIG9uIHRoZSBmYWN0IHRoYXQgdGhlIHRpbWVvdXRIYW5kbGVyIHdpbGwgcmVzdW1lIHRoZSByZXNwb25zZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWdMb2coInswfSAtIHN1c3BlbmQoLi4uKSBjYWxsZWQiLCBuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRTdXNwZW5kVGltZW91dChmaW5hbCBsb25nIHRpbWVPdXQsIGZpbmFsIFRpbWVVbml0IHRpbWVVbml0KSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZ3JpenpseVJlc3BvbnNlLmdldFN1c3BlbmRDb250ZXh0KCkuc2V0VGltZW91dCh0aW1lT3V0LCB0aW1lVW5pdCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1Z0xvZygiezB9IC0gc2V0VGltZW91dCguLi4pIGNhbGxlZCIsIG5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gd3JpdGVSZXNwb25zZVN0YXR1c0FuZEhlYWRlcnMoZmluYWwgbG9uZyBjb250ZW50TGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIGNvbnRleHQpCisgICAgICAgICAgICAgICAgdGhyb3dzIENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2UuU3RhdHVzVHlwZSBzdGF0dXNJbmZvID0gY29udGV4dC5nZXRTdGF0dXNJbmZvKCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1c0luZm8uZ2V0UmVhc29uUGhyYXNlKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBncml6emx5UmVzcG9uc2Uuc2V0U3RhdHVzKHN0YXR1c0luZm8uZ2V0U3RhdHVzQ29kZSgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBncml6emx5UmVzcG9uc2Uuc2V0U3RhdHVzKHN0YXR1c0luZm8uZ2V0U3RhdHVzQ29kZSgpLCBzdGF0dXNJbmZvLmdldFJlYXNvblBocmFzZSgpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBncml6emx5UmVzcG9uc2Uuc2V0Q29udGVudExlbmd0aExvbmcoY29udGVudExlbmd0aCk7CisKKyAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZSA6IGNvbnRleHQuZ2V0U3RyaW5nSGVhZGVycygpLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgdmFsdWUgOiBlLmdldFZhbHVlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyaXp6bHlSZXNwb25zZS5hZGRIZWFkZXIoZS5nZXRLZXkoKSwgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIGdyaXp6bHlSZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnTG9nKCJ7MH0gLSB3cml0ZVJlc3BvbnNlU3RhdHVzQW5kSGVhZGVycygpIGNhbGxlZCIsIG5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJNYWdpY051bWJlciIpCisgICAgICAgIHB1YmxpYyB2b2lkIGZhaWx1cmUoZmluYWwgVGhyb3dhYmxlIGVycm9yKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmICghZ3JpenpseVJlc3BvbnNlLmlzQ29tbWl0dGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWdTZXRTdGF0dXNPdmVyU2VuZEVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JpenpseVJlc3BvbnNlLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JpenpseVJlc3BvbnNlLnNldFN0YXR1cyg1MDAsICJSZXF1ZXN0IGZhaWxlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JpenpseVJlc3BvbnNlLnNlbmRFcnJvcig1MDAsICJSZXF1ZXN0IGZhaWxlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhIHJhY2UgY29uZGl0aW9uIGV4dGVybmFsbHkgY29tbWl0dGluZyB0aGUgcmVzcG9uc2UgY2FuIHN0aWxsIG9jY3VyLi4uCisgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIubG9nKExldmVsLkZJTkVSLCAiVW5hYmxlIHRvIHJlc2V0IGZhaWxlZCByZXNwb25zZS4iLCBleCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29udGFpbmVyRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGl6YXRpb25NZXNzYWdlcy5FWENFUFRJT05fU0VORElOR19FUlJPUl9SRVNQT05TRSg1MDAsICJSZXF1ZXN0IGZhaWxlZC4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWdMb2coInswfSAtIGZhaWx1cmUoLi4uKSBjYWxsZWQiLCBuYW1lKTsKKyAgICAgICAgICAgICAgICByZXRocm93KGVycm9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVSZXNwb25zZUJ1ZmZlcmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldGhyb3cgdGhlIG9yaWdpbmFsIGV4Y2VwdGlvbiBhcyByZXF1aXJlZCBieSBKQVgtUlMsIDMuMy40CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBlcnJvciB0aHJvd2FibGUgdG8gYmUgcmUtdGhyb3duCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgcmV0aHJvdyhmaW5hbCBUaHJvd2FibGUgZXJyb3IpIHsKKyAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbikgZXJyb3I7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb250YWluZXJFeGNlcHRpb24oZXJyb3IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwSGFuZGxlcjsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBHcml6emx5IEhUVFAgY29udGFpbmVyLgorICAgICAqCisgICAgICogQHBhcmFtIGFwcGxpY2F0aW9uIEpBWC1SUyAvIEplcnNleSBhcHBsaWNhdGlvbiB0byBiZSBkZXBsb3llZCBvbiBHcml6emx5IEhUVFAgY29udGFpbmVyLgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gR3JpenpseUh0dHBDb250YWluZXIoZmluYWwgQXBwbGljYXRpb24gYXBwbGljYXRpb24pIHsKKyAgICAgICAgdGhpcy5hcHBIYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihhcHBsaWNhdGlvbiwgbmV3IEdyaXp6bHlCaW5kZXIoKSk7CisgICAgICAgIGNhY2hlQ29uZmlnU2V0U3RhdHVzT3ZlclNlbmRFcnJvcigpOworICAgICAgICBjYWNoZUNvbmZpZ0VuYWJsZUxlYWRpbmdDb250ZXh0UGF0aFNsYXNoZXMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgR3JpenpseSBIVFRQIGNvbnRhaW5lci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcHBsaWNhdGlvbiAgIEpBWC1SUyAvIEplcnNleSBhcHBsaWNhdGlvbiB0byBiZSBkZXBsb3llZCBvbiBHcml6emx5IEhUVFAgY29udGFpbmVyLgorICAgICAqIEBwYXJhbSBwYXJlbnRDb250ZXh0IERJIHByb3ZpZGVyIHNwZWNpZmljIGNvbnRleHQgd2l0aCBhcHBsaWNhdGlvbidzIHJlZ2lzdGVyZWQgYmluZGluZ3MuCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBHcml6emx5SHR0cENvbnRhaW5lcihmaW5hbCBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiwgZmluYWwgT2JqZWN0IHBhcmVudENvbnRleHQpIHsKKyAgICAgICAgdGhpcy5hcHBIYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihhcHBsaWNhdGlvbiwgbmV3IEdyaXp6bHlCaW5kZXIoKSwgcGFyZW50Q29udGV4dCk7CisgICAgICAgIGNhY2hlQ29uZmlnU2V0U3RhdHVzT3ZlclNlbmRFcnJvcigpOworICAgICAgICBjYWNoZUNvbmZpZ0VuYWJsZUxlYWRpbmdDb250ZXh0UGF0aFNsYXNoZXMoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKKyAgICAgICAgc3VwZXIuc3RhcnQoKTsKKyAgICAgICAgYXBwSGFuZGxlci5vblN0YXJ0dXAodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2VydmljZShmaW5hbCBSZXF1ZXN0IHJlcXVlc3QsIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlV3JpdGVyIHJlc3BvbnNlV3JpdGVyID0gbmV3IFJlc3BvbnNlV3JpdGVyKHJlc3BvbnNlLCBjb25maWdTZXRTdGF0dXNPdmVyU2VuZEVycm9yKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1Z0xvZygiR3JpenpseUh0dHBDb250YWluZXIuc2VydmljZSguLi4pIHN0YXJ0ZWQiKTsKKyAgICAgICAgICAgIFVSSSBiYXNlVXJpID0gZ2V0QmFzZVVyaShyZXF1ZXN0KTsKKyAgICAgICAgICAgIFVSSSByZXF1ZXN0VXJpID0gZ2V0UmVxdWVzdFVyaShyZXF1ZXN0KTsKKyAgICAgICAgICAgIGZpbmFsIENvbnRhaW5lclJlcXVlc3QgcmVxdWVzdENvbnRleHQgPSBuZXcgQ29udGFpbmVyUmVxdWVzdChiYXNlVXJpLAorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VXJpLCByZXF1ZXN0LmdldE1ldGhvZCgpLmdldE1ldGhvZFN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICBnZXRTZWN1cml0eUNvbnRleHQocmVxdWVzdCksIG5ldyBHcml6emx5UmVxdWVzdFByb3BlcnRpZXNEZWxlZ2F0ZShyZXF1ZXN0KSk7CisgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5zZXRFbnRpdHlTdHJlYW0ocmVxdWVzdC5nZXRJbnB1dFN0cmVhbSgpKTsKKyAgICAgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIGhlYWRlck5hbWUgOiByZXF1ZXN0LmdldEhlYWRlck5hbWVzKCkpIHsKKyAgICAgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5oZWFkZXJzKGhlYWRlck5hbWUsIHJlcXVlc3QuZ2V0SGVhZGVycyhoZWFkZXJOYW1lKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5zZXRXcml0ZXIocmVzcG9uc2VXcml0ZXIpOworCisgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5zZXRSZXF1ZXN0U2NvcGVkSW5pdGlhbGl6ZXIoaW5qZWN0aW9uTWFuYWdlciAtPiB7CisgICAgICAgICAgICAgICAgaW5qZWN0aW9uTWFuYWdlci48UmVmPFJlcXVlc3Q+PmdldEluc3RhbmNlKFJlcXVlc3RUWVBFKS5zZXQocmVxdWVzdCk7CisgICAgICAgICAgICAgICAgaW5qZWN0aW9uTWFuYWdlci48UmVmPFJlc3BvbnNlPj5nZXRJbnN0YW5jZShSZXNwb25zZVRZUEUpLnNldChyZXNwb25zZSk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGFwcEhhbmRsZXIuaGFuZGxlKHJlcXVlc3RDb250ZXh0KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGxvZ2dlci5kZWJ1Z0xvZygiR3JpenpseUh0dHBDb250YWluZXIuc2VydmljZSguLi4pIGZpbmlzaGVkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gY29udGFpbnNDb250ZXh0UGF0aChSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSAhPSBudWxsICYmIHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKS5sZW5ndGgoKSA+IDA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc291cmNlQ29uZmlnIGdldENvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBhcHBIYW5kbGVyLmdldENvbmZpZ3VyYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZWxvYWQoKSB7CisgICAgICAgIHJlbG9hZChhcHBIYW5kbGVyLmdldENvbmZpZ3VyYXRpb24oKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVsb2FkKGZpbmFsIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgYXBwSGFuZGxlci5vblNodXRkb3duKHRoaXMpOworCisgICAgICAgIGFwcEhhbmRsZXIgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKGNvbmZpZ3VyYXRpb24sIG5ldyBHcml6emx5QmluZGVyKCkpOworICAgICAgICBhcHBIYW5kbGVyLm9uUmVsb2FkKHRoaXMpOworICAgICAgICBhcHBIYW5kbGVyLm9uU3RhcnR1cCh0aGlzKTsKKyAgICAgICAgY2FjaGVDb25maWdTZXRTdGF0dXNPdmVyU2VuZEVycm9yKCk7CisgICAgICAgIGNhY2hlQ29uZmlnRW5hYmxlTGVhZGluZ0NvbnRleHRQYXRoU2xhc2hlcygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBcHBsaWNhdGlvbkhhbmRsZXIgZ2V0QXBwbGljYXRpb25IYW5kbGVyKCkgeworICAgICAgICByZXR1cm4gYXBwSGFuZGxlcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgeworICAgICAgICBzdXBlci5kZXN0cm95KCk7CisgICAgICAgIGFwcEhhbmRsZXIub25TaHV0ZG93bih0aGlzKTsKKyAgICAgICAgYXBwSGFuZGxlciA9IG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBTZWN1cml0eUNvbnRleHQgZ2V0U2VjdXJpdHlDb250ZXh0KGZpbmFsIFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICByZXR1cm4gbmV3IFNlY3VyaXR5Q29udGV4dCgpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1VzZXJJblJvbGUoZmluYWwgU3RyaW5nIHJvbGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTZWN1cmUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3QuaXNTZWN1cmUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgUHJpbmNpcGFsIGdldFVzZXJQcmluY2lwYWwoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0VXNlclByaW5jaXBhbCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXV0aGVudGljYXRpb25TY2hlbWUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0QXV0aFR5cGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBwcml2YXRlIFVSSSBnZXRCYXNlVXJpKGZpbmFsIFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkkocmVxdWVzdC5nZXRTY2hlbWUoKSwgbnVsbCwgcmVxdWVzdC5nZXRTZXJ2ZXJOYW1lKCksCisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0U2VydmVyUG9ydCgpLCBnZXRCYXNlUGF0aChyZXF1ZXN0KSwgbnVsbCwgbnVsbCk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFVSSVN5bnRheEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRCYXNlUGF0aChmaW5hbCBSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGNvbnRleHRQYXRoID0gcmVxdWVzdC5nZXRDb250ZXh0UGF0aCgpOworCisgICAgICAgIGlmIChjb250ZXh0UGF0aCA9PSBudWxsIHx8IGNvbnRleHRQYXRoLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuICIvIjsKKyAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0UGF0aC5jaGFyQXQoY29udGV4dFBhdGgubGVuZ3RoKCkgLSAxKSAhPSAnLycpIHsKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0UGF0aCArICIvIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0UGF0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgVVJJIGdldFJlcXVlc3RVcmkoZmluYWwgUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc2VydmVyQWRkcmVzcyA9IGdldFNlcnZlckFkZHJlc3MocmVxdWVzdCk7CisKKyAgICAgICAgICAgIFN0cmluZyB1cmk7CisgICAgICAgICAgICBpZiAoY29uZmlnUmVkdWNlQ29udGV4dFBhdGhTbGFzaGVzRW5hYmxlZCAmJiBjb250YWluc0NvbnRleHRQYXRoKHJlcXVlc3QpKSB7CisgICAgICAgICAgICAgICAgdXJpID0gQ29udGFpbmVyVXRpbHMucmVkdWNlTGVhZGluZ1NsYXNoZXMocmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB1cmkgPSByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHF1ZXJ5U3RyaW5nID0gcmVxdWVzdC5nZXRRdWVyeVN0cmluZygpOworICAgICAgICAgICAgaWYgKHF1ZXJ5U3RyaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB1cmkgPSB1cmkgKyAiPyIgKyBDb250YWluZXJVdGlscy5lbmNvZGVVbnNhZmVDaGFyYWN0ZXJzKHF1ZXJ5U3RyaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkkoc2VydmVyQWRkcmVzcyArIHVyaSk7CisgICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRTZXJ2ZXJBZGRyZXNzKGZpbmFsIFJlcXVlc3QgcmVxdWVzdCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgVVJJKHJlcXVlc3QuZ2V0U2NoZW1lKCksIG51bGwsICByZXF1ZXN0LmdldFNlcnZlck5hbWUoKSwgcmVxdWVzdC5nZXRTZXJ2ZXJQb3J0KCksIG51bGwsIG51bGwsIG51bGwpLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG1ldGhvZCByZWFkcyBhbmQgY2FjaGVzIHZhbHVlIG9mIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkKKyAgICAgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMjUkVTUE9OU0VfU0VUX1NUQVRVU19PVkVSX1NFTkRfRVJST1J9IGZvciBmdXR1cmUgcHVycG9zZXMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNhY2hlQ29uZmlnU2V0U3RhdHVzT3ZlclNlbmRFcnJvcigpIHsKKyAgICAgICAgdGhpcy5jb25maWdTZXRTdGF0dXNPdmVyU2VuZEVycm9yID0gU2VydmVyUHJvcGVydGllcy5nZXRWYWx1ZShnZXRDb25maWd1cmF0aW9uKCkuZ2V0UHJvcGVydGllcygpLAorICAgICAgICAgICAgICAgIFNlcnZlclByb3BlcnRpZXMuUkVTUE9OU0VfU0VUX1NUQVRVU19PVkVSX1NFTkRfRVJST1IsIGZhbHNlLCBCb29sZWFuLmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWV0aG9kIHJlYWRzIGFuZCBjYWNoZXMgdmFsdWUgb2YgY29uZmlndXJhdGlvbiBwcm9wZXJ0eQorICAgICAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcyNSRURVQ0VfQ09OVEVYVF9QQVRIX1NMQVNIRVNfRU5BQkxFRH0gZm9yIGZ1dHVyZSBwdXJwb3Nlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY2FjaGVDb25maWdFbmFibGVMZWFkaW5nQ29udGV4dFBhdGhTbGFzaGVzKCkgeworICAgICAgICB0aGlzLmNvbmZpZ1JlZHVjZUNvbnRleHRQYXRoU2xhc2hlc0VuYWJsZWQgPSBTZXJ2ZXJQcm9wZXJ0aWVzLmdldFZhbHVlKGdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0aWVzKCksCisgICAgICAgICAgICAgICAgU2VydmVyUHJvcGVydGllcy5SRURVQ0VfQ09OVEVYVF9QQVRIX1NMQVNIRVNfRU5BQkxFRCwgZmFsc2UsIEJvb2xlYW4uY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lcnMvZ3JpenpseTItaHR0cC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2dyaXp6bHkyL2h0dHBzZXJ2ZXIvR3JpenpseUh0dHBDb250YWluZXJQcm92aWRlci5qYXZhIGIvY29udGFpbmVycy9ncml6emx5Mi1odHRwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZ3JpenpseTIvaHR0cHNlcnZlci9Hcml6emx5SHR0cENvbnRhaW5lclByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQxNDIyNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lcnMvZ3JpenpseTItaHR0cC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2dyaXp6bHkyL2h0dHBzZXJ2ZXIvR3JpenpseUh0dHBDb250YWluZXJQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseTIuaHR0cHNlcnZlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29udGFpbmVyUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmdyaXp6bHkuaHR0cC5zZXJ2ZXIuSHR0cEhhbmRsZXI7CisKKy8qKgorICogQ29udGFpbmVyIHByb3ZpZGVyIGZvciBjb250YWluZXJzIGJhc2VkIG9uIEdyaXp6bHkge0BsaW5rIG9yZy5nbGFzc2Zpc2guZ3JpenpseS5odHRwLnNlcnZlci5IdHRwSGFuZGxlcn0uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBHcml6emx5SHR0cENvbnRhaW5lclByb3ZpZGVyIGltcGxlbWVudHMgQ29udGFpbmVyUHJvdmlkZXIgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxUPiBUIGNyZWF0ZUNvbnRhaW5lcihDbGFzczxUPiB0eXBlLCBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbikgdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24geworICAgICAgICBpZiAoSHR0cEhhbmRsZXIuY2xhc3MgPT0gdHlwZSB8fCBHcml6emx5SHR0cENvbnRhaW5lci5jbGFzcyA9PSB0eXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZS5jYXN0KG5ldyBHcml6emx5SHR0cENvbnRhaW5lcihhcHBsaWNhdGlvbikpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVycy9ncml6emx5Mi1odHRwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZ3JpenpseTIvaHR0cHNlcnZlci9Hcml6emx5SHR0cFNlcnZlckZhY3RvcnkuamF2YSBiL2NvbnRhaW5lcnMvZ3JpenpseTItaHR0cC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2dyaXp6bHkyL2h0dHBzZXJ2ZXIvR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVkM2VjNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lcnMvZ3JpenpseTItaHR0cC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2dyaXp6bHkyL2h0dHBzZXJ2ZXIvR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwyODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseTIuaHR0cHNlcnZlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJOworCitpbXBvcnQgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkyLmh0dHBzZXJ2ZXIuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmEuVGhyZWFkRmFjdG9yeUJ1aWxkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5KZXJzZXlQcm9jZXNzaW5nVW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29udGFpbmVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5ncml6emx5Lmh0dHAuc2VydmVyLkh0dHBIYW5kbGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guZ3JpenpseS5odHRwLnNlcnZlci5IdHRwSGFuZGxlclJlZ2lzdHJhdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmdyaXp6bHkuaHR0cC5zZXJ2ZXIuSHR0cFNlcnZlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmdyaXp6bHkuaHR0cC5zZXJ2ZXIuTmV0d29ya0xpc3RlbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guZ3JpenpseS5odHRwLnNlcnZlci5TZXJ2ZXJDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guZ3JpenpseS5zc2wuU1NMRW5naW5lQ29uZmlndXJhdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guZ3JpenpseS51dGlscy5DaGFyc2V0czsKKworLyoqCisgKiBGYWN0b3J5IGZvciBjcmVhdGluZyBHcml6emx5IEh0dHAgU2VydmVyLgorICogPHA+CisgKiBTaG91bGQgeW91IG5lZWQgdG8gZmluZSB0dW5lIHRoZSB1bmRlcmx5aW5nIEdyaXp6bHkgdHJhbnNwb3J0IGxheWVyLCB5b3UgY2FuIG9idGFpbiBkaXJlY3QgYWNjZXNzIHRvIHRoZSBjb3JyZXNwb25kaW5nCisgKiBHcml6emx5IHN0cnVjdHVyZXMgd2l0aCA8dHQ+c2VydmVyLmdldExpc3RlbmVyKCJncml6emx5IikuZ2V0VHJhbnNwb3J0KCk8L3R0Pi4gVG8gbWFrZSBjZXJ0YWluIG9wdGlvbnMgdGFrZSBlZmZlY3QsCisgKiB5b3UgbmVlZCB0byB3b3JrIHdpdGggYW4gaW5hY3RpdmUgSHR0cFNlcnZlciBpbnN0YW5jZSAodGhhdCBpcyB0aGUgb25lIHRoYXQgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQgeWV0KS4KKyAqIFRvIG9idGFpbiBzdWNoIGFuIGluc3RhbmNlLCB1c2Ugb25lIG9mIHRoZSBiZWxvdyBmYWN0b3J5IG1ldGhvZHMgd2l0aCB7QGNvZGUgc3RhcnR9IHBhcmFtZXRlciBzZXQgdG8ge0Bjb2RlIGZhbHNlfS4KKyAqIFdoZW4gdGhlIHtAY29kZSBzdGFydH0gcGFyYW1ldGVyIGlzIG5vdCBwcmVzZW50LCB0aGUgZmFjdG9yeSBtZXRob2QgcmV0dXJucyBhbiBhbHJlYWR5IHN0YXJ0ZWQgaW5zdGFuY2UuCisgKiA8L3A+CisgKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICogQHNlZSBIdHRwU2VydmVyCisgKiBAc2VlIEdyaXp6bHlIdHRwQ29udGFpbmVyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBHcml6emx5SHR0cFNlcnZlckZhY3RvcnkgeworCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyB7QGxpbmsgSHR0cFNlcnZlcn0gaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpIHVyaSBvbiB3aGljaCB0aGUge0BsaW5rIEFwcGxpY2F0aW9uSGFuZGxlcn0gd2lsbCBiZSBkZXBsb3llZC4gT25seSBmaXJzdCBwYXRoIHNlZ21lbnQgd2lsbCBiZSB1c2VkIGFzCisgICAgICogICAgICAgICAgICBjb250ZXh0IHBhdGgsIHRoZSByZXN0IHdpbGwgYmUgaWdub3JlZC4KKyAgICAgKiBAcmV0dXJuIG5ld2x5IGNyZWF0ZWQge0Bjb2RlIEh0dHBTZXJ2ZXJ9LgorICAgICAqIEB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiBpbiBjYXNlIG9mIGFueSBmYWlsdXJlIHdoZW4gY3JlYXRpbmcgYSBuZXcge0Bjb2RlIEh0dHBTZXJ2ZXJ9IGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgSHR0cFNlcnZlciBjcmVhdGVIdHRwU2VydmVyKGZpbmFsIFVSSSB1cmkpIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUh0dHBTZXJ2ZXIodXJpLCAoR3JpenpseUh0dHBDb250YWluZXIpIG51bGwsIGZhbHNlLCBudWxsLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IHtAbGluayBIdHRwU2VydmVyfSBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgICB1cmkgb24gd2hpY2ggdGhlIHtAbGluayBBcHBsaWNhdGlvbkhhbmRsZXJ9IHdpbGwgYmUgZGVwbG95ZWQuIE9ubHkgZmlyc3QgcGF0aCBzZWdtZW50IHdpbGwgYmUgdXNlZAorICAgICAqICAgICAgICAgICAgICBhcyBjb250ZXh0IHBhdGgsIHRoZSByZXN0IHdpbGwgYmUgaWdub3JlZC4KKyAgICAgKiBAcGFyYW0gc3RhcnQgaWYgc2V0IHRvIGZhbHNlLCBzZXJ2ZXIgd2lsbCBub3QgZ2V0IHN0YXJ0ZWQsIHdoaWNoIGFsbG93cyB0byBjb25maWd1cmUgdGhlIHVuZGVybHlpbmcgdHJhbnNwb3J0CisgICAgICogICAgICAgICAgICAgIGxheWVyLCBzZWUgYWJvdmUgZm9yIGRldGFpbHMuCisgICAgICogQHJldHVybiBuZXdseSBjcmVhdGVkIHtAY29kZSBIdHRwU2VydmVyfS4KKyAgICAgKiBAdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24gaW4gY2FzZSBvZiBhbnkgZmFpbHVyZSB3aGVuIGNyZWF0aW5nIGEgbmV3IHtAY29kZSBIdHRwU2VydmVyfSBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEh0dHBTZXJ2ZXIgY3JlYXRlSHR0cFNlcnZlcihmaW5hbCBVUkkgdXJpLCBmaW5hbCBib29sZWFuIHN0YXJ0KSB7CisgICAgICAgIHJldHVybiBjcmVhdGVIdHRwU2VydmVyKHVyaSwgKEdyaXp6bHlIdHRwQ29udGFpbmVyKSBudWxsLCBmYWxzZSwgbnVsbCwgc3RhcnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcge0BsaW5rIEh0dHBTZXJ2ZXJ9IGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHVyaSAgICAgICAgICAgVVJJIG9uIHdoaWNoIHRoZSBKZXJzZXkgd2ViIGFwcGxpY2F0aW9uIHdpbGwgYmUgZGVwbG95ZWQuIE9ubHkgZmlyc3QgcGF0aCBzZWdtZW50IHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB1c2VkIGFzIGNvbnRleHQgcGF0aCwgdGhlIHJlc3Qgd2lsbCBiZSBpZ25vcmVkLgorICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uIHdlYiBhcHBsaWNhdGlvbiBjb25maWd1cmF0aW9uLgorICAgICAqIEByZXR1cm4gbmV3bHkgY3JlYXRlZCB7QGNvZGUgSHR0cFNlcnZlcn0uCisgICAgICogQHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uIGluIGNhc2Ugb2YgYW55IGZhaWx1cmUgd2hlbiBjcmVhdGluZyBhIG5ldyB7QGNvZGUgSHR0cFNlcnZlcn0gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBIdHRwU2VydmVyIGNyZWF0ZUh0dHBTZXJ2ZXIoZmluYWwgVVJJIHVyaSwgZmluYWwgUmVzb3VyY2VDb25maWcgY29uZmlndXJhdGlvbikgeworICAgICAgICByZXR1cm4gY3JlYXRlSHR0cFNlcnZlcigKKyAgICAgICAgICAgICAgICB1cmksCisgICAgICAgICAgICAgICAgbmV3IEdyaXp6bHlIdHRwQ29udGFpbmVyKGNvbmZpZ3VyYXRpb24pLAorICAgICAgICAgICAgICAgIGZhbHNlLAorICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgdHJ1ZQorICAgICAgICApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcge0BsaW5rIEh0dHBTZXJ2ZXJ9IGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHVyaSAgICAgICAgICAgVVJJIG9uIHdoaWNoIHRoZSBKZXJzZXkgd2ViIGFwcGxpY2F0aW9uIHdpbGwgYmUgZGVwbG95ZWQuIE9ubHkgZmlyc3QgcGF0aCBzZWdtZW50IHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB1c2VkIGFzIGNvbnRleHQgcGF0aCwgdGhlIHJlc3Qgd2lsbCBiZSBpZ25vcmVkLgorICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uIHdlYiBhcHBsaWNhdGlvbiBjb25maWd1cmF0aW9uLgorICAgICAqIEBwYXJhbSBzdGFydCAgICAgICAgIGlmIHNldCB0byBmYWxzZSwgc2VydmVyIHdpbGwgbm90IGdldCBzdGFydGVkLCB3aGljaCBhbGxvd3MgdG8gY29uZmlndXJlIHRoZSB1bmRlcmx5aW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0IGxheWVyLCBzZWUgYWJvdmUgZm9yIGRldGFpbHMuCisgICAgICogQHJldHVybiBuZXdseSBjcmVhdGVkIHtAY29kZSBIdHRwU2VydmVyfS4KKyAgICAgKiBAdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24gaW4gY2FzZSBvZiBhbnkgZmFpbHVyZSB3aGVuIGNyZWF0aW5nIGEgbmV3IHtAY29kZSBIdHRwU2VydmVyfSBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEh0dHBTZXJ2ZXIgY3JlYXRlSHR0cFNlcnZlcihmaW5hbCBVUkkgdXJpLCBmaW5hbCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmF0aW9uLCBmaW5hbCBib29sZWFuIHN0YXJ0KSB7CisgICAgICAgIHJldHVybiBjcmVhdGVIdHRwU2VydmVyKAorICAgICAgICAgICAgICAgIHVyaSwKKyAgICAgICAgICAgICAgICBuZXcgR3JpenpseUh0dHBDb250YWluZXIoY29uZmlndXJhdGlvbiksCisgICAgICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICBzdGFydCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyB7QGxpbmsgSHR0cFNlcnZlcn0gaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpICAgICAgICAgICAgICAgICAgIFVSSSBvbiB3aGljaCB0aGUgSmVyc2V5IHdlYiBhcHBsaWNhdGlvbiB3aWxsIGJlIGRlcGxveWVkLiBPbmx5IGZpcnN0IHBhdGggc2VnbWVudAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSB1c2VkIGFzIGNvbnRleHQgcGF0aCwgdGhlIHJlc3Qgd2lsbCBiZSBpZ25vcmVkLgorICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uICAgICAgICAgd2ViIGFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24uCisgICAgICogQHBhcmFtIHNlY3VyZSAgICAgICAgICAgICAgICB1c2VkIGZvciBjYWxsIHtAbGluayBOZXR3b3JrTGlzdGVuZXIjc2V0U2VjdXJlKGJvb2xlYW4pfS4KKyAgICAgKiBAcGFyYW0gc3NsRW5naW5lQ29uZmlndXJhdG9yIFNzbCBzZXR0aW5ncyB0byBiZSBwYXNzZWQgdG8ge0BsaW5rIE5ldHdvcmtMaXN0ZW5lciNzZXRTU0xFbmdpbmVDb25maWd9LgorICAgICAqIEByZXR1cm4gbmV3bHkgY3JlYXRlZCB7QGNvZGUgSHR0cFNlcnZlcn0uCisgICAgICogQHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uIGluIGNhc2Ugb2YgYW55IGZhaWx1cmUgd2hlbiBjcmVhdGluZyBhIG5ldyB7QGNvZGUgSHR0cFNlcnZlcn0gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBIdHRwU2VydmVyIGNyZWF0ZUh0dHBTZXJ2ZXIoZmluYWwgVVJJIHVyaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gc2VjdXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNTTEVuZ2luZUNvbmZpZ3VyYXRvciBzc2xFbmdpbmVDb25maWd1cmF0b3IpIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUh0dHBTZXJ2ZXIoCisgICAgICAgICAgICAgICAgdXJpLAorICAgICAgICAgICAgICAgIG5ldyBHcml6emx5SHR0cENvbnRhaW5lcihjb25maWd1cmF0aW9uKSwKKyAgICAgICAgICAgICAgICBzZWN1cmUsCisgICAgICAgICAgICAgICAgc3NsRW5naW5lQ29uZmlndXJhdG9yLAorICAgICAgICAgICAgICAgIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcge0BsaW5rIEh0dHBTZXJ2ZXJ9IGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHVyaSAgICAgICAgICAgICAgICAgICBVUkkgb24gd2hpY2ggdGhlIEplcnNleSB3ZWIgYXBwbGljYXRpb24gd2lsbCBiZSBkZXBsb3llZC4gT25seSBmaXJzdCBwYXRoIHNlZ21lbnQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgdXNlZCBhcyBjb250ZXh0IHBhdGgsIHRoZSByZXN0IHdpbGwgYmUgaWdub3JlZC4KKyAgICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbiAgICAgICAgIHdlYiBhcHBsaWNhdGlvbiBjb25maWd1cmF0aW9uLgorICAgICAqIEBwYXJhbSBzZWN1cmUgICAgICAgICAgICAgICAgdXNlZCBmb3IgY2FsbCB7QGxpbmsgTmV0d29ya0xpc3RlbmVyI3NldFNlY3VyZShib29sZWFuKX0uCisgICAgICogQHBhcmFtIHNzbEVuZ2luZUNvbmZpZ3VyYXRvciBTc2wgc2V0dGluZ3MgdG8gYmUgcGFzc2VkIHRvIHtAbGluayBOZXR3b3JrTGlzdGVuZXIjc2V0U1NMRW5naW5lQ29uZmlnfS4KKyAgICAgKiBAcGFyYW0gc3RhcnQgICAgICAgICAgICAgICAgIGlmIHNldCB0byBmYWxzZSwgc2VydmVyIHdpbGwgbm90IGdldCBzdGFydGVkLCB3aGljaCBhbGxvd3MgdG8gY29uZmlndXJlIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXJseWluZyB0cmFuc3BvcnQsIHNlZSBhYm92ZSBmb3IgZGV0YWlscy4KKyAgICAgKiBAcmV0dXJuIG5ld2x5IGNyZWF0ZWQge0Bjb2RlIEh0dHBTZXJ2ZXJ9LgorICAgICAqIEB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiBpbiBjYXNlIG9mIGFueSBmYWlsdXJlIHdoZW4gY3JlYXRpbmcgYSBuZXcge0Bjb2RlIEh0dHBTZXJ2ZXJ9IGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgSHR0cFNlcnZlciBjcmVhdGVIdHRwU2VydmVyKGZpbmFsIFVSSSB1cmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgY29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHNlY3VyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTU0xFbmdpbmVDb25maWd1cmF0b3Igc3NsRW5naW5lQ29uZmlndXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gc3RhcnQpIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUh0dHBTZXJ2ZXIoCisgICAgICAgICAgICAgICAgdXJpLAorICAgICAgICAgICAgICAgIG5ldyBHcml6emx5SHR0cENvbnRhaW5lcihjb25maWd1cmF0aW9uKSwKKyAgICAgICAgICAgICAgICBzZWN1cmUsCisgICAgICAgICAgICAgICAgc3NsRW5naW5lQ29uZmlndXJhdG9yLAorICAgICAgICAgICAgICAgIHN0YXJ0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IHtAbGluayBIdHRwU2VydmVyfSBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgICAgICAgICAgICAgICAgICAgdXJpIG9uIHdoaWNoIHRoZSB7QGxpbmsgQXBwbGljYXRpb25IYW5kbGVyfSB3aWxsIGJlIGRlcGxveWVkLiBPbmx5IGZpcnN0IHBhdGgKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQgd2lsbCBiZSB1c2VkIGFzIGNvbnRleHQgcGF0aCwgdGhlIHJlc3Qgd2lsbCBiZSBpZ25vcmVkLgorICAgICAqIEBwYXJhbSBjb25maWcgICAgICAgICAgICAgICAgd2ViIGFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24uCisgICAgICogQHBhcmFtIHNlY3VyZSAgICAgICAgICAgICAgICB1c2VkIGZvciBjYWxsIHtAbGluayBOZXR3b3JrTGlzdGVuZXIjc2V0U2VjdXJlKGJvb2xlYW4pfS4KKyAgICAgKiBAcGFyYW0gc3NsRW5naW5lQ29uZmlndXJhdG9yIFNzbCBzZXR0aW5ncyB0byBiZSBwYXNzZWQgdG8ge0BsaW5rIE5ldHdvcmtMaXN0ZW5lciNzZXRTU0xFbmdpbmVDb25maWd9LgorICAgICAqIEBwYXJhbSBwYXJlbnRDb250ZXh0ICAgICAgICAgREkgcHJvdmlkZXIgc3BlY2lmaWMgY29udGV4dCB3aXRoIGFwcGxpY2F0aW9uJ3MgcmVnaXN0ZXJlZCBiaW5kaW5ncy4KKyAgICAgKiBAcmV0dXJuIG5ld2x5IGNyZWF0ZWQge0Bjb2RlIEh0dHBTZXJ2ZXJ9LgorICAgICAqIEB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiBpbiBjYXNlIG9mIGFueSBmYWlsdXJlIHdoZW4gY3JlYXRpbmcgYSBuZXcge0Bjb2RlIEh0dHBTZXJ2ZXJ9IGluc3RhbmNlLgorICAgICAqIEBzZWUgR3JpenpseUh0dHBDb250YWluZXIKKyAgICAgKiBAc2luY2UgMi4xMgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgSHR0cFNlcnZlciBjcmVhdGVIdHRwU2VydmVyKGZpbmFsIFVSSSB1cmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gc2VjdXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNTTEVuZ2luZUNvbmZpZ3VyYXRvciBzc2xFbmdpbmVDb25maWd1cmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHBhcmVudENvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUh0dHBTZXJ2ZXIodXJpLCBuZXcgR3JpenpseUh0dHBDb250YWluZXIoY29uZmlnLCBwYXJlbnRDb250ZXh0KSwgc2VjdXJlLCBzc2xFbmdpbmVDb25maWd1cmF0b3IsCisgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyB7QGxpbmsgSHR0cFNlcnZlcn0gaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpICAgICAgICAgICB1cmkgb24gd2hpY2ggdGhlIHtAbGluayBBcHBsaWNhdGlvbkhhbmRsZXJ9IHdpbGwgYmUgZGVwbG95ZWQuIE9ubHkgZmlyc3QgcGF0aAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQgd2lsbCBiZSB1c2VkIGFzIGNvbnRleHQgcGF0aCwgdGhlIHJlc3Qgd2lsbCBiZSBpZ25vcmVkLgorICAgICAqIEBwYXJhbSBjb25maWcgICAgICAgIHdlYiBhcHBsaWNhdGlvbiBjb25maWd1cmF0aW9uLgorICAgICAqIEBwYXJhbSBwYXJlbnRDb250ZXh0IERJIHByb3ZpZGVyIHNwZWNpZmljIGNvbnRleHQgd2l0aCBhcHBsaWNhdGlvbidzIHJlZ2lzdGVyZWQgYmluZGluZ3MuCisgICAgICogQHJldHVybiBuZXdseSBjcmVhdGVkIHtAY29kZSBIdHRwU2VydmVyfS4KKyAgICAgKiBAdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24gaW4gY2FzZSBvZiBhbnkgZmFpbHVyZSB3aGVuIGNyZWF0aW5nIGEgbmV3IHtAY29kZSBIdHRwU2VydmVyfSBpbnN0YW5jZS4KKyAgICAgKiBAc2VlIEdyaXp6bHlIdHRwQ29udGFpbmVyCisgICAgICogQHNpbmNlIDIuMTIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEh0dHBTZXJ2ZXIgY3JlYXRlSHR0cFNlcnZlcihmaW5hbCBVUkkgdXJpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgcGFyZW50Q29udGV4dCkgeworICAgICAgICByZXR1cm4gY3JlYXRlSHR0cFNlcnZlcih1cmksIG5ldyBHcml6emx5SHR0cENvbnRhaW5lcihjb25maWcsIHBhcmVudENvbnRleHQpLCBmYWxzZSwgbnVsbCwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyB7QGxpbmsgSHR0cFNlcnZlcn0gaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpICAgICAgICAgICAgICAgICAgIHVyaSBvbiB3aGljaCB0aGUge0BsaW5rIEFwcGxpY2F0aW9uSGFuZGxlcn0gd2lsbCBiZSBkZXBsb3llZC4gT25seSBmaXJzdCBwYXRoCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50IHdpbGwgYmUgdXNlZCBhcyBjb250ZXh0IHBhdGgsIHRoZSByZXN0IHdpbGwgYmUgaWdub3JlZC4KKyAgICAgKiBAcGFyYW0gaGFuZGxlciAgICAgICAgICAgICAgIHtAbGluayBIdHRwSGFuZGxlcn0gaW5zdGFuY2UuCisgICAgICogQHBhcmFtIHNlY3VyZSAgICAgICAgICAgICAgICB1c2VkIGZvciBjYWxsIHtAbGluayBOZXR3b3JrTGlzdGVuZXIjc2V0U2VjdXJlKGJvb2xlYW4pfS4KKyAgICAgKiBAcGFyYW0gc3NsRW5naW5lQ29uZmlndXJhdG9yIFNzbCBzZXR0aW5ncyB0byBiZSBwYXNzZWQgdG8ge0BsaW5rIE5ldHdvcmtMaXN0ZW5lciNzZXRTU0xFbmdpbmVDb25maWd9LgorICAgICAqIEBwYXJhbSBzdGFydCAgICAgICAgICAgICAgICAgaWYgc2V0IHRvIGZhbHNlLCBzZXJ2ZXIgd2lsbCBub3QgZ2V0IHN0YXJ0ZWQsIHRoaXMgYWxsb3dzIGVuZCB1c2VycyB0byBzZXQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWwgcHJvcGVydGllcyBvbiB0aGUgdW5kZXJseWluZyBsaXN0ZW5lci4KKyAgICAgKiBAcmV0dXJuIG5ld2x5IGNyZWF0ZWQge0Bjb2RlIEh0dHBTZXJ2ZXJ9LgorICAgICAqIEB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiBpbiBjYXNlIG9mIGFueSBmYWlsdXJlIHdoZW4gY3JlYXRpbmcgYSBuZXcge0Bjb2RlIEh0dHBTZXJ2ZXJ9IGluc3RhbmNlLgorICAgICAqIEBzZWUgR3JpenpseUh0dHBDb250YWluZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEh0dHBTZXJ2ZXIgY3JlYXRlSHR0cFNlcnZlcihmaW5hbCBVUkkgdXJpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEdyaXp6bHlIdHRwQ29udGFpbmVyIGhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBzZWN1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU1NMRW5naW5lQ29uZmlndXJhdG9yIHNzbEVuZ2luZUNvbmZpZ3VyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHN0YXJ0KSB7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGhvc3QgPSAodXJpLmdldEhvc3QoKSA9PSBudWxsKSA/IE5ldHdvcmtMaXN0ZW5lci5ERUZBVUxUX05FVFdPUktfSE9TVCA6IHVyaS5nZXRIb3N0KCk7CisgICAgICAgIGZpbmFsIGludCBwb3J0ID0gKHVyaS5nZXRQb3J0KCkgPT0gLTEpCisgICAgICAgICAgICAgICAgPyAoc2VjdXJlID8gQ29udGFpbmVyLkRFRkFVTFRfSFRUUFNfUE9SVCA6IENvbnRhaW5lci5ERUZBVUxUX0hUVFBfUE9SVCkKKyAgICAgICAgICAgICAgICA6IHVyaS5nZXRQb3J0KCk7CisKKyAgICAgICAgZmluYWwgTmV0d29ya0xpc3RlbmVyIGxpc3RlbmVyID0gbmV3IE5ldHdvcmtMaXN0ZW5lcigiZ3JpenpseSIsIGhvc3QsIHBvcnQpOworCisgICAgICAgIGxpc3RlbmVyLmdldFRyYW5zcG9ydCgpLmdldFdvcmtlclRocmVhZFBvb2xDb25maWcoKS5zZXRUaHJlYWRGYWN0b3J5KG5ldyBUaHJlYWRGYWN0b3J5QnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldE5hbWVGb3JtYXQoImdyaXp6bHktaHR0cC1zZXJ2ZXItJWQiKQorICAgICAgICAgICAgICAgIC5zZXRVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIobmV3IEplcnNleVByb2Nlc3NpbmdVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIoKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgbGlzdGVuZXIuc2V0U2VjdXJlKHNlY3VyZSk7CisgICAgICAgIGlmIChzc2xFbmdpbmVDb25maWd1cmF0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgbGlzdGVuZXIuc2V0U1NMRW5naW5lQ29uZmlnKHNzbEVuZ2luZUNvbmZpZ3VyYXRvcik7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBIdHRwU2VydmVyIHNlcnZlciA9IG5ldyBIdHRwU2VydmVyKCk7CisgICAgICAgIHNlcnZlci5hZGRMaXN0ZW5lcihsaXN0ZW5lcik7CisKKyAgICAgICAgLy8gTWFwIHRoZSBwYXRoIHRvIHRoZSBwcm9jZXNzb3IuCisgICAgICAgIGZpbmFsIFNlcnZlckNvbmZpZ3VyYXRpb24gY29uZmlnID0gc2VydmVyLmdldFNlcnZlckNvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgaWYgKGhhbmRsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBhdGggPSB1cmkuZ2V0UGF0aCgpLnJlcGxhY2VBbGwoIi97Mix9IiwgIi8iKTsKKworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNvbnRleHRQYXRoID0gcGF0aC5lbmRzV2l0aCgiLyIpID8gcGF0aC5zdWJzdHJpbmcoMCwgcGF0aC5sZW5ndGgoKSAtIDEpIDogcGF0aDsKKyAgICAgICAgICAgIGNvbmZpZy5hZGRIdHRwSGFuZGxlcihoYW5kbGVyLCBIdHRwSGFuZGxlclJlZ2lzdHJhdGlvbi5idWxkZXIoKS5jb250ZXh0UGF0aChjb250ZXh0UGF0aCkuYnVpbGQoKSk7CisgICAgICAgIH0KKworICAgICAgICBjb25maWcuc2V0UGFzc1RyYWNlUmVxdWVzdCh0cnVlKTsKKyAgICAgICAgY29uZmlnLnNldERlZmF1bHRRdWVyeUVuY29kaW5nKENoYXJzZXRzLlVURjhfQ0hBUlNFVCk7CisKKyAgICAgICAgaWYgKHN0YXJ0KSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIFN0YXJ0IHRoZSBzZXJ2ZXIuCisgICAgICAgICAgICAgICAgc2VydmVyLnN0YXJ0KCk7CisgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHNlcnZlci5zaHV0ZG93bk5vdygpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLkZBSUxFRF9UT19TVEFSVF9TRVJWRVIoZXguZ2V0TWVzc2FnZSgpKSwgZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNlcnZlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmV2ZW50cyBpbnN0YW50aWF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5KCkgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lcnMvZ3JpenpseTItaHR0cC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2dyaXp6bHkyL2h0dHBzZXJ2ZXIvR3JpenpseVJlcXVlc3RQcm9wZXJ0aWVzRGVsZWdhdGUuamF2YSBiL2NvbnRhaW5lcnMvZ3JpenpseTItaHR0cC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2dyaXp6bHkyL2h0dHBzZXJ2ZXIvR3JpenpseVJlcXVlc3RQcm9wZXJ0aWVzRGVsZWdhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTQ5MTdmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVycy9ncml6emx5Mi1odHRwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZ3JpenpseTIvaHR0cHNlcnZlci9Hcml6emx5UmVxdWVzdFByb3BlcnRpZXNEZWxlZ2F0ZS5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseTIuaHR0cHNlcnZlcjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuUHJvcGVydGllc0RlbGVnYXRlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5ncml6emx5Lmh0dHAuc2VydmVyLlJlcXVlc3Q7CisKKy8qKgorICogR3JpenpseSBjb250YWluZXIge0BsaW5rIFByb3BlcnRpZXNEZWxlZ2F0ZSBwcm9wZXJ0aWVzIGRlbGVnYXRlfS4KKyAqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworY2xhc3MgR3JpenpseVJlcXVlc3RQcm9wZXJ0aWVzRGVsZWdhdGUgaW1wbGVtZW50cyBQcm9wZXJ0aWVzRGVsZWdhdGUgeworICAgIHByaXZhdGUgZmluYWwgUmVxdWVzdCByZXF1ZXN0OworCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyBHcml6emx5IGNvbnRhaW5lciBwcm9wZXJ0aWVzIGRlbGVnYXRlIGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgZ3JpenpseSBIVFRQIHJlcXVlc3QuCisgICAgICovCisgICAgR3JpenpseVJlcXVlc3RQcm9wZXJ0aWVzRGVsZWdhdGUoUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRBdHRyaWJ1dGUobmFtZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENvbGxlY3Rpb248U3RyaW5nPiBnZXRQcm9wZXJ0eU5hbWVzKCkgeworICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRBdHRyaWJ1dGVOYW1lcygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJlcXVlc3QucmVtb3ZlQXR0cmlidXRlKG5hbWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lcnMvZ3JpenpseTItaHR0cC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2dyaXp6bHkyL2h0dHBzZXJ2ZXIvcGFja2FnZS1pbmZvLmphdmEgYi9jb250YWluZXJzL2dyaXp6bHkyLWh0dHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9ncml6emx5Mi9odHRwc2VydmVyL3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1Y2YzODkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXJzL2dyaXp6bHkyLWh0dHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9ncml6emx5Mi9odHRwc2VydmVyL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKKy8qKgorICogSmVyc2V5IEdyaXp6bHkgMi54IGNvbnRhaW5lciBjbGFzc2VzLgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkyLmh0dHBzZXJ2ZXI7CmRpZmYgLS1naXQgYS9jb250YWluZXJzL2dyaXp6bHkyLWh0dHAvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29udGFpbmVyUHJvdmlkZXIgYi9jb250YWluZXJzL2dyaXp6bHkyLWh0dHAvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29udGFpbmVyUHJvdmlkZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdmNDA1ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lcnMvZ3JpenpseTItaHR0cC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5Db250YWluZXJQcm92aWRlcgpAQCAtMCwwICsxIEBACitvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5Mi5odHRwc2VydmVyLkdyaXp6bHlIdHRwQ29udGFpbmVyUHJvdmlkZXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXJzL2dyaXp6bHkyLWh0dHAvc3JjL21haW4vcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L2dyaXp6bHkyL2h0dHBzZXJ2ZXIvaW50ZXJuYWwvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMgYi9jb250YWluZXJzL2dyaXp6bHkyLWh0dHAvc3JjL21haW4vcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L2dyaXp6bHkyL2h0dHBzZXJ2ZXIvaW50ZXJuYWwvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNjZTQzOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lcnMvZ3JpenpseTItaHR0cC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZ3JpenpseTIvaHR0cHNlcnZlci9pbnRlcm5hbC9sb2NhbGl6YXRpb24ucHJvcGVydGllcwpAQCAtMCwwICsxLDIwIEBACisjCisjIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorIworIyBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisjIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyMgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisjIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyMKKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisjCisKKyMgezB9IC0gc3RhdHVzIGNvZGU7IHsxfSAtIHN0YXR1cyByZWFzb24gbWVzc2FnZQorZXhjZXB0aW9uLnNlbmRpbmcuZXJyb3IucmVzcG9uc2U9SS9PIGV4Y2VwdGlvbiBvY2N1cnJlZCB3aGlsZSBzZW5kaW5nICJ7MH0vezF9IiBlcnJvciByZXNwb25zZS4KKyMgezB9IC0gZXhjZXB0aW9uIG1lc3NhZ2UKK2ZhaWxlZC50by5zdGFydC5zZXJ2ZXI9RmFpbGVkIHRvIHN0YXJ0IEdyaXp6bHkgSFRUUCBzZXJ2ZXI6IHswfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVycy9ncml6emx5Mi1zZXJ2bGV0L3BvbS54bWwgYi9jb250YWluZXJzL2dyaXp6bHkyLXNlcnZsZXQvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWVlNjY4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVycy9ncml6emx5Mi1zZXJ2bGV0L3BvbS54bWwKQEAgLTAsMCArMSw5MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1ncml6emx5Mi1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LWNvbnRhaW5lci1ncml6emx5Mi1zZXJ2bGV0PC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPkdyaXp6bHkgMiBTZXJ2bGV0IENvbnRhaW5lci48L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguc2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3NlcnZsZXQ0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1ncml6emx5Mi1odHRwPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5ncml6emx5PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z3JpenpseS1odHRwLXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHJlc291cmNlcz4KKyAgICAgICAgICAgIDxyZXNvdXJjZT4KKyAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vamF2YTwvZGlyZWN0b3J5PgorICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TUVUQS1JTkYvKiovKjwvaW5jbHVkZT4KKyAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgICAgICAgPC9yZXNvdXJjZT4KKyAgICAgICAgICAgIDxyZXNvdXJjZT4KKyAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgPGZpbHRlcmluZz50cnVlPC9maWx0ZXJpbmc+CisgICAgICAgICAgICA8L3Jlc291cmNlPgorICAgICAgICA8L3Jlc291cmNlcz4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5mZWxpeDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1idW5kbGUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgICAgIDxleHRlbnNpb25zPnRydWU8L2V4dGVuc2lvbnM+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxpbnN0cnVjdGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8SW1wb3J0LVBhY2thZ2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXguc2VydmxldC4qO3ZlcnNpb249IlsyLjQsNS4wKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICAgICAgICAgPC9JbXBvcnQtUGFja2FnZT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbnN0cnVjdGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDx1bnBhY2tCdW5kbGU+dHJ1ZTwvdW5wYWNrQnVuZGxlPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lcnMvZ3JpenpseTItc2VydmxldC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2dyaXp6bHkyL3NlcnZsZXQvR3JpenpseVdlYkNvbnRhaW5lckZhY3RvcnkuamF2YSBiL2NvbnRhaW5lcnMvZ3JpenpseTItc2VydmxldC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2dyaXp6bHkyL3NlcnZsZXQvR3JpenpseVdlYkNvbnRhaW5lckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjk2OWRkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVycy9ncml6emx5Mi1zZXJ2bGV0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZ3JpenpseTIvc2VydmxldC9Hcml6emx5V2ViQ29udGFpbmVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMjg2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkyLnNlcnZsZXQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseTIuaHR0cHNlcnZlci5Hcml6emx5SHR0cFNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnVyaS5VcmlDb21wb25lbnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmdyaXp6bHkuaHR0cC5zZXJ2ZXIuSHR0cFNlcnZlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmdyaXp6bHkuc2VydmxldC5TZXJ2bGV0UmVnaXN0cmF0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guZ3JpenpseS5zZXJ2bGV0LldlYmFwcENvbnRleHQ7CisKKy8qKgorICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgYW5kIHN0YXJ0aW5nIEdyaXp6bHkgMiB7QGxpbmsgSHR0cFNlcnZlcn0gaW5zdGFuY2VzCisgKiBmb3IgZGVwbG95aW5nIGEge0Bjb2RlIFNlcnZsZXR9LgorICogPHAvPgorICogVGhlIGRlZmF1bHQgZGVwbG95ZWQgc2VydmVyIGlzIGFuIGluc3RhbmNlIG9mIHtAbGluayBTZXJ2bGV0Q29udGFpbmVyfS4KKyAqIDxwLz4KKyAqIElmIG5vIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgYXJlIGRlY2xhcmVkIChvciBpcyBudWxsKSB0aGVuIHJvb3QKKyAqIHJlc291cmNlIGFuZCBwcm92aWRlciBjbGFzc2VzIHdpbGwgYmUgZm91bmQgYnkgc2VhcmNoaW5nIHRoZSBjbGFzc2VzCisgKiByZWZlcmVuY2VkIGluIHRoZSBqYXZhIGNsYXNzcGF0aC4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgR3JpenpseVdlYkNvbnRhaW5lckZhY3RvcnkgeworCisgICAgcHJpdmF0ZSBHcml6emx5V2ViQ29udGFpbmVyRmFjdG9yeSgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSB7QGxpbmsgSHR0cFNlcnZlcn0gdGhhdCByZWdpc3RlcnMgdGhlIHtAbGluayBTZXJ2bGV0Q29udGFpbmVyfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1IHRoZSBVUkkgdG8gY3JlYXRlIHRoZSBodHRwIHNlcnZlci4gVGhlIFVSSSBzY2hlbWUgbXVzdCBiZQorICAgICAqICAgICAgICAgIGVxdWFsIHRvICJodHRwIi4gVGhlIFVSSSB1c2VyIGluZm9ybWF0aW9uIGFuZCBob3N0CisgICAgICogICAgICAgICAgYXJlIGlnbm9yZWQgSWYgdGhlIFVSSSBwb3J0IGlzIG5vdCBwcmVzZW50IHRoZW4gcG9ydCA4MCB3aWxsIGJlCisgICAgICogICAgICAgICAgdXNlZC4gVGhlIFVSSSBxdWVyeSBhbmQgZnJhZ21lbnQgY29tcG9uZW50cyBhcmUgaWdub3JlZC4gT25seSBmaXJzdCBwYXRoIHNlZ21lbnQgd2lsbCBiZSB1c2VkCisgICAgICogICAgICAgICAgYXMgY29udGV4dCBwYXRoLCB0aGUgcmVzdCB3aWxsIGJlIGlnbm9yZWQuCisgICAgICogQHJldHVybiB0aGUgaHR0cCBzZXJ2ZXIsIHdpdGggdGhlIGVuZHBvaW50IHN0YXJ0ZWQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gICAgICBpZiBhbiBlcnJvciBvY2N1cnMgY3JlYXRpbmcgdGhlIGNvbnRhaW5lci4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB7QGNvZGUgdX0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgSHR0cFNlcnZlciBjcmVhdGUoU3RyaW5nIHUpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICh1ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBVUkkgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNyZWF0ZShVUkkuY3JlYXRlKHUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSB7QGxpbmsgSHR0cFNlcnZlcn0gdGhhdCByZWdpc3RlcnMgdGhlIHtAbGluayBTZXJ2bGV0Q29udGFpbmVyfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1ICAgICAgICAgIHRoZSBVUkkgdG8gY3JlYXRlIHRoZSBodHRwIHNlcnZlci4gVGhlIFVSSSBzY2hlbWUgbXVzdCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgIGVxdWFsIHRvICJodHRwIi4gVGhlIFVSSSB1c2VyIGluZm9ybWF0aW9uIGFuZCBob3N0CisgICAgICogICAgICAgICAgICAgICAgICAgYXJlIGlnbm9yZWQgSWYgdGhlIFVSSSBwb3J0IGlzIG5vdCBwcmVzZW50IHRoZW4gcG9ydCA4MCB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICAgICAgdXNlZC4gVGhlIFVSSSBxdWVyeSBhbmQgZnJhZ21lbnQgY29tcG9uZW50cyBhcmUgaWdub3JlZC4gT25seSBmaXJzdCBwYXRoIHNlZ21lbnQgd2lsbCBiZSB1c2VkCisgICAgICogICAgICAgICAgICAgICAgICAgYXMgY29udGV4dCBwYXRoLCB0aGUgcmVzdCB3aWxsIGJlIGlnbm9yZWQuCisgICAgICogQHBhcmFtIGluaXRQYXJhbXMgdGhlIHNlcnZsZXQgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycy4KKyAgICAgKiBAcmV0dXJuIHRoZSBodHRwIHNlcnZlciwgd2l0aCB0aGUgZW5kcG9pbnQgc3RhcnRlZC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBjcmVhdGluZyB0aGUgY29udGFpbmVyLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHtAY29kZSB1fSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBIdHRwU2VydmVyIGNyZWF0ZShTdHJpbmcgdSwgTWFwPFN0cmluZywgU3RyaW5nPiBpbml0UGFyYW1zKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgICAgICBpZiAodSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgVVJJIG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjcmVhdGUoVVJJLmNyZWF0ZSh1KSwgaW5pdFBhcmFtcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEge0BsaW5rIEh0dHBTZXJ2ZXJ9IHRoYXQgcmVnaXN0ZXJzIHRoZSB7QGxpbmsgU2VydmxldENvbnRhaW5lcn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdSB0aGUgVVJJIHRvIGNyZWF0ZSB0aGUgaHR0cCBzZXJ2ZXIuIFRoZSBVUkkgc2NoZW1lIG11c3QgYmUKKyAgICAgKiAgICAgICAgICBlcXVhbCB0byAiaHR0cCIuIFRoZSBVUkkgdXNlciBpbmZvcm1hdGlvbiBhbmQgaG9zdAorICAgICAqICAgICAgICAgIGFyZSBpZ25vcmVkIElmIHRoZSBVUkkgcG9ydCBpcyBub3QgcHJlc2VudCB0aGVuIHBvcnQgODAgd2lsbCBiZQorICAgICAqICAgICAgICAgIHVzZWQuIFRoZSBVUkkgcXVlcnkgYW5kIGZyYWdtZW50IGNvbXBvbmVudHMgYXJlIGlnbm9yZWQuIE9ubHkgZmlyc3QgcGF0aCBzZWdtZW50IHdpbGwgYmUgdXNlZAorICAgICAqICAgICAgICAgIGFzIGNvbnRleHQgcGF0aCwgdGhlIHJlc3Qgd2lsbCBiZSBpZ25vcmVkLgorICAgICAqIEByZXR1cm4gdGhlIGh0dHAgc2VydmVyLCB3aXRoIHRoZSBlbmRwb2ludCBzdGFydGVkLgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAgICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGNyZWF0aW5nIHRoZSBjb250YWluZXIuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYge0Bjb2RlIHV9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEh0dHBTZXJ2ZXIgY3JlYXRlKFVSSSB1KQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gY3JlYXRlKHUsIFNlcnZsZXRDb250YWluZXIuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHtAbGluayBIdHRwU2VydmVyfSB0aGF0IHJlZ2lzdGVycyB0aGUge0BsaW5rIFNlcnZsZXRDb250YWluZXJ9LgorICAgICAqCisgICAgICogQHBhcmFtIHUgICAgICAgICAgdGhlIFVSSSB0byBjcmVhdGUgdGhlIGh0dHAgc2VydmVyLiBUaGUgVVJJIHNjaGVtZSBtdXN0IGJlCisgICAgICogICAgICAgICAgICAgICAgICAgZXF1YWwgdG8gImh0dHAiLiBUaGUgVVJJIHVzZXIgaW5mb3JtYXRpb24gYW5kIGhvc3QKKyAgICAgKiAgICAgICAgICAgICAgICAgICBhcmUgaWdub3JlZCBJZiB0aGUgVVJJIHBvcnQgaXMgbm90IHByZXNlbnQgdGhlbiBwb3J0IDgwIHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICB1c2VkLiBUaGUgVVJJIHF1ZXJ5IGFuZCBmcmFnbWVudCBjb21wb25lbnRzIGFyZSBpZ25vcmVkLiBPbmx5IGZpcnN0IHBhdGggc2VnbWVudCB3aWxsIGJlIHVzZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICBhcyBjb250ZXh0IHBhdGgsIHRoZSByZXN0IHdpbGwgYmUgaWdub3JlZC4KKyAgICAgKiBAcGFyYW0gaW5pdFBhcmFtcyB0aGUgc2VydmxldCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzLgorICAgICAqIEByZXR1cm4gdGhlIGh0dHAgc2VydmVyLCB3aXRoIHRoZSBlbmRwb2ludCBzdGFydGVkLgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAgICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGNyZWF0aW5nIHRoZSBjb250YWluZXIuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYge0Bjb2RlIHV9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEh0dHBTZXJ2ZXIgY3JlYXRlKFVSSSB1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBpbml0UGFyYW1zKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gY3JlYXRlKHUsIFNlcnZsZXRDb250YWluZXIuY2xhc3MsIGluaXRQYXJhbXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHtAbGluayBIdHRwU2VydmVyfSB0aGF0IHJlZ2lzdGVycyB0aGUgZGVjbGFyZWQKKyAgICAgKiBzZXJ2bGV0IGNsYXNzLgorICAgICAqCisgICAgICogQHBhcmFtIHUgdGhlIFVSSSB0byBjcmVhdGUgdGhlIGh0dHAgc2VydmVyLiBUaGUgVVJJIHNjaGVtZSBtdXN0IGJlCisgICAgICogICAgICAgICAgZXF1YWwgdG8gImh0dHAiLiBUaGUgVVJJIHVzZXIgaW5mb3JtYXRpb24gYW5kIGhvc3QKKyAgICAgKiAgICAgICAgICBhcmUgaWdub3JlZCBJZiB0aGUgVVJJIHBvcnQgaXMgbm90IHByZXNlbnQgdGhlbiBwb3J0IDgwIHdpbGwgYmUKKyAgICAgKiAgICAgICAgICB1c2VkLiBUaGUgVVJJIHF1ZXJ5IGFuZCBmcmFnbWVudCBjb21wb25lbnRzIGFyZSBpZ25vcmVkLiBPbmx5IGZpcnN0IHBhdGggc2VnbWVudCB3aWxsIGJlIHVzZWQKKyAgICAgKiAgICAgICAgICBhcyBjb250ZXh0IHBhdGgsIHRoZSByZXN0IHdpbGwgYmUgaWdub3JlZC4KKyAgICAgKiBAcGFyYW0gYyB0aGUgc2VydmxldCBjbGFzcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBodHRwIHNlcnZlciwgd2l0aCB0aGUgZW5kcG9pbnQgc3RhcnRlZC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBjcmVhdGluZyB0aGUgY29udGFpbmVyLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHtAY29kZSB1fSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBIdHRwU2VydmVyIGNyZWF0ZShTdHJpbmcgdSwgQ2xhc3M8PyBleHRlbmRzIFNlcnZsZXQ+IGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICh1ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBVUkkgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNyZWF0ZShVUkkuY3JlYXRlKHUpLCBjKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSB7QGxpbmsgSHR0cFNlcnZlcn0gdGhhdCByZWdpc3RlcnMgdGhlIGRlY2xhcmVkCisgICAgICogc2VydmxldCBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1ICAgICAgICAgIHRoZSBVUkkgdG8gY3JlYXRlIHRoZSBodHRwIHNlcnZlci4gVGhlIFVSSSBzY2hlbWUgbXVzdCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgIGVxdWFsIHRvICJodHRwIi4gVGhlIFVSSSB1c2VyIGluZm9ybWF0aW9uIGFuZCBob3N0CisgICAgICogICAgICAgICAgICAgICAgICAgYXJlIGlnbm9yZWQgSWYgdGhlIFVSSSBwb3J0IGlzIG5vdCBwcmVzZW50IHRoZW4gcG9ydCA4MCB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICAgICAgdXNlZC4gVGhlIFVSSSBxdWVyeSBhbmQgZnJhZ21lbnQgY29tcG9uZW50cyBhcmUgaWdub3JlZC4gT25seSBmaXJzdCBwYXRoIHNlZ21lbnQgd2lsbCBiZSB1c2VkCisgICAgICogICAgICAgICAgICAgICAgICAgYXMgY29udGV4dCBwYXRoLCB0aGUgcmVzdCB3aWxsIGJlIGlnbm9yZWQuCisgICAgICogQHBhcmFtIGMgICAgICAgICAgdGhlIHNlcnZsZXQgY2xhc3MuCisgICAgICogQHBhcmFtIGluaXRQYXJhbXMgdGhlIHNlcnZsZXQgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycy4KKyAgICAgKiBAcmV0dXJuIHRoZSBodHRwIHNlcnZlciwgd2l0aCB0aGUgZW5kcG9pbnQgc3RhcnRlZC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBjcmVhdGluZyB0aGUgY29udGFpbmVyLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHtAY29kZSB1fSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBIdHRwU2VydmVyIGNyZWF0ZShTdHJpbmcgdSwgQ2xhc3M8PyBleHRlbmRzIFNlcnZsZXQ+IGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGluaXRQYXJhbXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICh1ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBVUkkgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNyZWF0ZShVUkkuY3JlYXRlKHUpLCBjLCBpbml0UGFyYW1zKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSB7QGxpbmsgSHR0cFNlcnZlcn0gdGhhdCByZWdpc3RlcnMgdGhlIGRlY2xhcmVkCisgICAgICogc2VydmxldCBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1IHRoZSBVUkkgdG8gY3JlYXRlIHRoZSBodHRwIHNlcnZlci4gVGhlIFVSSSBzY2hlbWUgbXVzdCBiZQorICAgICAqICAgICAgICAgIGVxdWFsIHRvICJodHRwIi4gVGhlIFVSSSB1c2VyIGluZm9ybWF0aW9uIGFuZCBob3N0CisgICAgICogICAgICAgICAgYXJlIGlnbm9yZWQgSWYgdGhlIFVSSSBwb3J0IGlzIG5vdCBwcmVzZW50IHRoZW4gcG9ydCA4MCB3aWxsIGJlCisgICAgICogICAgICAgICAgdXNlZC4gVGhlIFVSSSBxdWVyeSBhbmQgZnJhZ21lbnQgY29tcG9uZW50cyBhcmUgaWdub3JlZC4gT25seSBmaXJzdCBwYXRoIHNlZ21lbnQgd2lsbCBiZSB1c2VkCisgICAgICogICAgICAgICAgYXMgY29udGV4dCBwYXRoLCB0aGUgcmVzdCB3aWxsIGJlIGlnbm9yZWQuCisgICAgICogQHBhcmFtIGMgdGhlIHNlcnZsZXQgY2xhc3MKKyAgICAgKiBAcmV0dXJuIHRoZSBodHRwIHNlcnZlciwgd2l0aCB0aGUgZW5kcG9pbnQgc3RhcnRlZC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBjcmVhdGluZyB0aGUgY29udGFpbmVyLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHtAY29kZSB1fSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBIdHRwU2VydmVyIGNyZWF0ZShVUkkgdSwgQ2xhc3M8PyBleHRlbmRzIFNlcnZsZXQ+IGMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjcmVhdGUodSwgYywgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEge0BsaW5rIEh0dHBTZXJ2ZXJ9IHRoYXQgcmVnaXN0ZXJzIHRoZSBkZWNsYXJlZAorICAgICAqIHNlcnZsZXQgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdSAgICAgICAgICB0aGUgVVJJIHRvIGNyZWF0ZSB0aGUgaHR0cCBzZXJ2ZXIuIFRoZSBVUkkgc2NoZW1lIG11c3QgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICBlcXVhbCB0byAiaHR0cCIuIFRoZSBVUkkgdXNlciBpbmZvcm1hdGlvbiBhbmQgaG9zdAorICAgICAqICAgICAgICAgICAgICAgICAgIGFyZSBpZ25vcmVkIElmIHRoZSBVUkkgcG9ydCBpcyBub3QgcHJlc2VudCB0aGVuIHBvcnQgODAgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgIHVzZWQuIFRoZSBVUkkgcXVlcnkgYW5kIGZyYWdtZW50IGNvbXBvbmVudHMgYXJlIGlnbm9yZWQuIE9ubHkgZmlyc3QgcGF0aCBzZWdtZW50IHdpbGwgYmUgdXNlZAorICAgICAqICAgICAgICAgICAgICAgICAgIGFzIGNvbnRleHQgcGF0aCwgdGhlIHJlc3Qgd2lsbCBiZSBpZ25vcmVkLgorICAgICAqIEBwYXJhbSBjICAgICAgICAgIHRoZSBzZXJ2bGV0IGNsYXNzCisgICAgICogQHBhcmFtIGluaXRQYXJhbXMgdGhlIHNlcnZsZXQgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycy4KKyAgICAgKiBAcmV0dXJuIHRoZSBodHRwIHNlcnZlciwgd2l0aCB0aGUgZW5kcG9pbnQgc3RhcnRlZC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBjcmVhdGluZyB0aGUgY29udGFpbmVyLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHtAY29kZSB1fSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBIdHRwU2VydmVyIGNyZWF0ZShVUkkgdSwgQ2xhc3M8PyBleHRlbmRzIFNlcnZsZXQ+IGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGluaXRQYXJhbXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjcmVhdGUodSwgYywgbnVsbCwgaW5pdFBhcmFtcywgbnVsbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgSHR0cFNlcnZlciBjcmVhdGUoVVJJIHUsIENsYXNzPD8gZXh0ZW5kcyBTZXJ2bGV0PiBjLCBTZXJ2bGV0IHNlcnZsZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBpbml0UGFyYW1zLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGNvbnRleHRJbml0UGFyYW1zKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIFVSSSBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcGF0aCA9IHUuZ2V0UGF0aCgpOworICAgICAgICBpZiAocGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgVVJJIHBhdGgsIG9mIHRoZSBVUkkgIiArIHUgKyAiLCBtdXN0IGJlIG5vbi1udWxsIik7CisgICAgICAgIH0gZWxzZSBpZiAocGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBVUkkgcGF0aCwgb2YgdGhlIFVSSSAiICsgdSArICIsIG11c3QgYmUgcHJlc2VudCIpOworICAgICAgICB9IGVsc2UgaWYgKHBhdGguY2hhckF0KDApICE9ICcvJykgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIFVSSSBwYXRoLCBvZiB0aGUgVVJJICIgKyB1ICsgIi4gbXVzdCBzdGFydCB3aXRoIGEgJy8nIik7CisgICAgICAgIH0KKworICAgICAgICBwYXRoID0gU3RyaW5nLmZvcm1hdCgiLyVzIiwgVXJpQ29tcG9uZW50LmRlY29kZVBhdGgodS5nZXRQYXRoKCksIHRydWUpLmdldCgxKS50b1N0cmluZygpKTsKKworICAgICAgICBXZWJhcHBDb250ZXh0IGNvbnRleHQgPSBuZXcgV2ViYXBwQ29udGV4dCgiR3JpenpseUNvbnRleHQiLCBwYXRoKTsKKyAgICAgICAgU2VydmxldFJlZ2lzdHJhdGlvbiByZWdpc3RyYXRpb247CisgICAgICAgIGlmIChjICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlZ2lzdHJhdGlvbiA9IGNvbnRleHQuYWRkU2VydmxldChjLmdldE5hbWUoKSwgYyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZWdpc3RyYXRpb24gPSBjb250ZXh0LmFkZFNlcnZsZXQoc2VydmxldC5nZXRDbGFzcygpLmdldE5hbWUoKSwgc2VydmxldCk7CisgICAgICAgIH0KKyAgICAgICAgcmVnaXN0cmF0aW9uLmFkZE1hcHBpbmcoIi8qIik7CisKKyAgICAgICAgaWYgKGNvbnRleHRJbml0UGFyYW1zICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBlIDogY29udGV4dEluaXRQYXJhbXMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0SW5pdFBhcmFtZXRlcihlLmdldEtleSgpLCBlLmdldFZhbHVlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGluaXRQYXJhbXMgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVnaXN0cmF0aW9uLnNldEluaXRQYXJhbWV0ZXJzKGluaXRQYXJhbXMpOworICAgICAgICB9CisKKyAgICAgICAgSHR0cFNlcnZlciBzZXJ2ZXIgPSBHcml6emx5SHR0cFNlcnZlckZhY3RvcnkuY3JlYXRlSHR0cFNlcnZlcih1KTsKKyAgICAgICAgY29udGV4dC5kZXBsb3koc2VydmVyKTsKKyAgICAgICAgcmV0dXJuIHNlcnZlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSB7QGxpbmsgSHR0cFNlcnZlcn0gdGhhdCByZWdpc3RlcnMgdGhlIGRlY2xhcmVkIHNlcnZsZXQgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdSAgICAgICAgICAgICAgICAgdGhlIFVSSSB0byBjcmVhdGUgdGhlIGh0dHAgc2VydmVyLiBUaGUgVVJJIHNjaGVtZSBtdXN0IGJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGVxdWFsIHRvICJodHRwIi4gVGhlIFVSSSB1c2VyIGluZm9ybWF0aW9uIGFuZCBob3N0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBpZ25vcmVkIElmIHRoZSBVUkkgcG9ydCBpcyBub3QgcHJlc2VudCB0aGVuIHBvcnQgODAgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkLiBUaGUgVVJJIHF1ZXJ5IGFuZCBmcmFnbWVudCBjb21wb25lbnRzIGFyZSBpZ25vcmVkLiBPbmx5IGZpcnN0IHBhdGggc2VnbWVudCB3aWxsIGJlIHVzZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgY29udGV4dCBwYXRoLCB0aGUgcmVzdCB3aWxsIGJlIGlnbm9yZWQuCisgICAgICogQHBhcmFtIHNlcnZsZXQgICAgICAgICAgIHRoZSBzZXJ2bGV0IGluc3RhbmNlLgorICAgICAqIEBwYXJhbSBpbml0UGFyYW1zICAgICAgICB0aGUgc2VydmxldCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzLgorICAgICAqIEBwYXJhbSBjb250ZXh0SW5pdFBhcmFtcyB0aGUgc2VydmxldCBjb250ZXh0IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMuCisgICAgICogQHJldHVybiB0aGUgaHR0cCBzZXJ2ZXIsIHdpdGggdGhlIGVuZHBvaW50IHN0YXJ0ZWQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uICAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgY3JlYXRpbmcgdGhlIGNvbnRhaW5lci4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB7QGNvZGUgdX0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgSHR0cFNlcnZlciBjcmVhdGUoVVJJIHUsIFNlcnZsZXQgc2VydmxldCwgTWFwPFN0cmluZywgU3RyaW5nPiBpbml0UGFyYW1zLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGNvbnRleHRJbml0UGFyYW1zKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHNlcnZsZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIHNlcnZsZXQgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjcmVhdGUodSwgbnVsbCwgc2VydmxldCwgaW5pdFBhcmFtcywgY29udGV4dEluaXRQYXJhbXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lcnMvZ3JpenpseTItc2VydmxldC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2dyaXp6bHkyL3NlcnZsZXQvcGFja2FnZS1pbmZvLmphdmEgYi9jb250YWluZXJzL2dyaXp6bHkyLXNlcnZsZXQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9ncml6emx5Mi9zZXJ2bGV0L3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYTdlNTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXJzL2dyaXp6bHkyLXNlcnZsZXQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9ncml6emx5Mi9zZXJ2bGV0L3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKKy8qKgorICogSmVyc2V5IEdyaXp6bHkgMi54IFNlcnZsZXQgY29udGFpbmVyIGNsYXNzZXMuCisgKi8KK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseTIuc2VydmxldDsKZGlmZiAtLWdpdCBhL2NvbnRhaW5lcnMvamRrLWh0dHAvcG9tLnhtbCBiL2NvbnRhaW5lcnMvamRrLWh0dHAvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWM4N2JkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVycy9qZGstaHR0cC9wb20ueG1sCkBAIC0wLDAgKzEsMTEzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLWpkay1odHRwPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LWNvbnRhaW5lci1qZGstaHR0cDwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KREsgSHR0cCBDb250YWluZXI8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmd1YXZhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z3VhdmE8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4uaXN0YWNrPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWlzdGFjay1jb21tb25zLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorCisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJ1aWxkLWhlbHBlci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKworICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmZlbGl4PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWJ1bmRsZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKworICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKworICAgICAgICA8cmVzb3VyY2VzPgorICAgICAgICAgICAgPHJlc291cmNlPgorICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9qYXZhPC9kaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5NRVRBLUlORi8qKi8qPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgICAgICA8L3Jlc291cmNlPgorICAgICAgICAgICAgPHJlc291cmNlPgorICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICA8ZmlsdGVyaW5nPnRydWU8L2ZpbHRlcmluZz4KKyAgICAgICAgICAgIDwvcmVzb3VyY2U+CisgICAgICAgIDwvcmVzb3VyY2VzPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPndpbmRvd3M8L2lkPgorICAgICAgICAgICAgPGFjdGl2YXRpb24+CisgICAgICAgICAgICAgICAgPG9zPgorICAgICAgICAgICAgICAgICAgICA8ZmFtaWx5PndpbmRvd3M8L2ZhbWlseT4KKyAgICAgICAgICAgICAgICA8L29zPgorICAgICAgICAgICAgPC9hY3RpdmF0aW9uPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBFeGNsdWRlIHVuaXQgdGVzdHMgcmVnYXJkaW5nIEpESyBIVFRQIFNlcnZlciBiZWNhdXNlIG9mIGZhaWxpbmcgYSBzZXJ2ZXIgc2h1dGRvd24gaW4gYSBjbGFzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggc2V2ZXJhbCB0ZXN0cy4gImphdmEubmV0LkJpbmRFeGNlcHRpb246IEFkZHJlc3MgYWxyZWFkeSBpbiB1c2U6IGJpbmQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVnIHJlcG9ydGVkIG9uIGh0dHBzOi8vYnVncy5vcGVuamRrLmphdmEubmV0L2Jyb3dzZS9KREstODAxNTY5MiAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPm9yZy9nbGFzc2Zpc2gvamVyc2V5L2pka2h0dHAvQmFzaWNKZGtIdHRwU2VydmVyVGVzdC5qYXZhPC9leGNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGtodHRwL0pka0h0dHBQYWNrYWdlVGVzdC5qYXZhPC9leGNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGtodHRwL0pka0h0dHBzU2VydmVyVGVzdC5qYXZhPC9leGNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGtodHRwL0xpZmVjeWNsZUxpc3RlbmVyVGVzdC5qYXZhPC9leGNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICA8L3Byb2ZpbGVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb250YWluZXJzL2pkay1odHRwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRraHR0cC9KZGtIdHRwSGFuZGxlckNvbnRhaW5lci5qYXZhIGIvY29udGFpbmVycy9qZGstaHR0cC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pka2h0dHAvSmRrSHR0cEhhbmRsZXJDb250YWluZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTFjNWNhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVycy9qZGstaHR0cC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pka2h0dHAvSmRrSHR0cEhhbmRsZXJDb250YWluZXIuamF2YQpAQCAtMCwwICsxLDM1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZGtodHRwOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5TZWN1cml0eUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuTWFwUHJvcGVydGllc0RlbGVnYXRlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lmpka2h0dHAuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5Db250YWluZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5Db250YWluZXJSZXNwb25zZVdyaXRlcjsKKworaW1wb3J0IGNvbS5zdW4ubmV0Lmh0dHBzZXJ2ZXIuSGVhZGVyczsKK2ltcG9ydCBjb20uc3VuLm5ldC5odHRwc2VydmVyLkh0dHBFeGNoYW5nZTsKK2ltcG9ydCBjb20uc3VuLm5ldC5odHRwc2VydmVyLkh0dHBIYW5kbGVyOworaW1wb3J0IGNvbS5zdW4ubmV0Lmh0dHBzZXJ2ZXIuSHR0cFNlcnZlcjsKK2ltcG9ydCBjb20uc3VuLm5ldC5odHRwc2VydmVyLkh0dHBzRXhjaGFuZ2U7CisKKy8qKgorICogSmVyc2V5IHtAY29kZSBDb250YWluZXJ9IGltcGxlbWVudGF0aW9uIGJhc2VkIG9uIEphdmEgU0Uge0BsaW5rIEh0dHBTZXJ2ZXJ9LgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBKZGtIdHRwSGFuZGxlckNvbnRhaW5lciBpbXBsZW1lbnRzIEh0dHBIYW5kbGVyLCBDb250YWluZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoSmRrSHR0cEhhbmRsZXJDb250YWluZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIHByaXZhdGUgdm9sYXRpbGUgQXBwbGljYXRpb25IYW5kbGVyIGFwcEhhbmRsZXI7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IGxpZ2h0d2VpZ2h0IEphdmEgU0XCoEhUVFAgc2VydmVyIGNvbnRhaW5lci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcHBsaWNhdGlvbiBKQVgtUlMgLyBKZXJzZXkgYXBwbGljYXRpb24gdG8gYmUgZGVwbG95ZWQgb24gdGhlIGNvbnRhaW5lci4KKyAgICAgKi8KKyAgICBKZGtIdHRwSGFuZGxlckNvbnRhaW5lcihmaW5hbCBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbikgeworICAgICAgICB0aGlzLmFwcEhhbmRsZXIgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKGFwcGxpY2F0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IGxpZ2h0d2VpZ2h0IEphdmEgU0XCoEhUVFAgc2VydmVyIGNvbnRhaW5lci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcHBsaWNhdGlvbiAgIEpBWC1SUyAvIEplcnNleSBhcHBsaWNhdGlvbiB0byBiZSBkZXBsb3llZCBvbiB0aGUgY29udGFpbmVyLgorICAgICAqIEBwYXJhbSBwYXJlbnRDb250ZXh0IERJIHByb3ZpZGVyIHNwZWNpZmljIGNvbnRleHQgd2l0aCBhcHBsaWNhdGlvbidzIHJlZ2lzdGVyZWQgYmluZGluZ3MuCisgICAgICovCisgICAgSmRrSHR0cEhhbmRsZXJDb250YWluZXIoZmluYWwgQXBwbGljYXRpb24gYXBwbGljYXRpb24sIGZpbmFsIE9iamVjdCBwYXJlbnRDb250ZXh0KSB7CisgICAgICAgIHRoaXMuYXBwSGFuZGxlciA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIoYXBwbGljYXRpb24sIG51bGwsIHBhcmVudENvbnRleHQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGhhbmRsZShmaW5hbCBIdHRwRXhjaGFuZ2UgZXhjaGFuZ2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIGlzIGEgVVJJIHRoYXQgY29udGFpbnMgdGhlIHBhdGgsIHF1ZXJ5IGFuZCBmcmFnbWVudCBjb21wb25lbnRzLgorICAgICAgICAgKi8KKyAgICAgICAgVVJJIGV4Y2hhbmdlVXJpID0gZXhjaGFuZ2UuZ2V0UmVxdWVzdFVSSSgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgYmFzZSBwYXRoIHNwZWNpZmllZCBieSB0aGUgSFRUUCBjb250ZXh0IG9mIHRoZSBIVFRQIGhhbmRsZXIuIEl0CisgICAgICAgICAqIGlzIGluIGRlY29kZWQgZm9ybS4KKyAgICAgICAgICovCisgICAgICAgIFN0cmluZyBkZWNvZGVkQmFzZVBhdGggPSBleGNoYW5nZS5nZXRIdHRwQ29udGV4dCgpLmdldFBhdGgoKTsKKworICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgYmFzZSBwYXRoIGVuZHMgd2l0aCBhICcvJworICAgICAgICBpZiAoIWRlY29kZWRCYXNlUGF0aC5lbmRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICBpZiAoZGVjb2RlZEJhc2VQYXRoLmVxdWFscyhleGNoYW5nZVVyaS5nZXRQYXRoKCkpKSB7CisgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICogVGhpcyBpcyBhbiBlZGdlIGNhc2Ugd2hlcmUgdGhlIHJlcXVlc3QgcGF0aCBkb2VzIG5vdCBlbmQgaW4gYQorICAgICAgICAgICAgICAgICAqICcvJyBhbmQgaXMgZXF1YWwgdG8gdGhlIGNvbnRleHQgcGF0aCBvZiB0aGUgSFRUUCBoYW5kbGVyLgorICAgICAgICAgICAgICAgICAqIEJvdGggdGhlIHJlcXVlc3QgcGF0aCBhbmQgYmFzZSBwYXRoIG5lZWQgdG8gZW5kIGluIGEgJy8nCisgICAgICAgICAgICAgICAgICogQ3VycmVudGx5IHRoZSByZXF1ZXN0IHBhdGggaXMgbW9kaWZpZWQuCisgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgKiBUT0RPIHN1cHBvcnQgcmVkaXJlY3Rpb24gaW4gYWNjb3JkYW5jZSB3aXRoIHJlc291cmNlIGNvbmZpZ3VyYXRpb24gZmVhdHVyZS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBleGNoYW5nZVVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaShleGNoYW5nZVVyaSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5wYXRoKCIvIikuYnVpbGQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlY29kZWRCYXNlUGF0aCArPSAiLyI7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBUaGUgZm9sbG93aW5nIGlzIG1hZG5lc3MsIHRoZXJlIGlzIG5vIGVhc3kgd2F5IHRvIGdldCB0aGUgY29tcGxldGUKKyAgICAgICAgICogVVJJIG9mIHRoZSBIVFRQIHJlcXVlc3QhIQorICAgICAgICAgKgorICAgICAgICAgKiBUT0RPIHRoaXMgaXMgbWlzc2luZyB0aGUgdXNlciBpbmZvcm1hdGlvbiBjb21wb25lbnQsIGhvdyBjYW4gdGhpcyBiZSBvYnRhaW5lZD8KKyAgICAgICAgICovCisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNTZWN1cmUgPSBleGNoYW5nZSBpbnN0YW5jZW9mIEh0dHBzRXhjaGFuZ2U7CisgICAgICAgIGZpbmFsIFN0cmluZyBzY2hlbWUgPSBpc1NlY3VyZSA/ICJodHRwcyIgOiAiaHR0cCI7CisKKyAgICAgICAgZmluYWwgVVJJIGJhc2VVcmkgPSBnZXRCYXNlVXJpKGV4Y2hhbmdlLCBkZWNvZGVkQmFzZVBhdGgsIHNjaGVtZSk7CisgICAgICAgIGZpbmFsIFVSSSByZXF1ZXN0VXJpID0gZ2V0UmVxdWVzdFVyaShleGNoYW5nZSwgYmFzZVVyaSk7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2VXcml0ZXIgcmVzcG9uc2VXcml0ZXIgPSBuZXcgUmVzcG9uc2VXcml0ZXIoZXhjaGFuZ2UpOworICAgICAgICBmaW5hbCBDb250YWluZXJSZXF1ZXN0IHJlcXVlc3RDb250ZXh0ID0gbmV3IENvbnRhaW5lclJlcXVlc3QoYmFzZVVyaSwgcmVxdWVzdFVyaSwKKyAgICAgICAgICAgICAgICBleGNoYW5nZS5nZXRSZXF1ZXN0TWV0aG9kKCksIGdldFNlY3VyaXR5Q29udGV4dChleGNoYW5nZS5nZXRQcmluY2lwYWwoKSwgaXNTZWN1cmUpLAorICAgICAgICAgICAgICAgIG5ldyBNYXBQcm9wZXJ0aWVzRGVsZWdhdGUoKSk7CisgICAgICAgIHJlcXVlc3RDb250ZXh0LnNldEVudGl0eVN0cmVhbShleGNoYW5nZS5nZXRSZXF1ZXN0Qm9keSgpKTsKKyAgICAgICAgcmVxdWVzdENvbnRleHQuZ2V0SGVhZGVycygpLnB1dEFsbChleGNoYW5nZS5nZXRSZXF1ZXN0SGVhZGVycygpKTsKKyAgICAgICAgcmVxdWVzdENvbnRleHQuc2V0V3JpdGVyKHJlc3BvbnNlV3JpdGVyKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFwcEhhbmRsZXIuaGFuZGxlKHJlcXVlc3RDb250ZXh0KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vIGlmIHRoZSByZXNwb25zZSB3YXMgbm90IGNvbW1pdHRlZCB5ZXQgYnkgdGhlIEplcnNleUFwcGxpY2F0aW9uCisgICAgICAgICAgICAvLyB0aGVuIGNvbW1pdCBpdCBhbmQgbG9nIHdhcm5pbmcKKyAgICAgICAgICAgIHJlc3BvbnNlV3JpdGVyLmNsb3NlQW5kTG9nV2FybmluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBVUkkgZ2V0QmFzZVVyaShmaW5hbCBIdHRwRXhjaGFuZ2UgZXhjaGFuZ2UsIGZpbmFsIFN0cmluZyBkZWNvZGVkQmFzZVBhdGgsIGZpbmFsIFN0cmluZyBzY2hlbWUpIHsKKyAgICAgICAgZmluYWwgVVJJIGJhc2VVcmk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gaG9zdEhlYWRlciA9IGV4Y2hhbmdlLmdldFJlcXVlc3RIZWFkZXJzKCkuZ2V0KCJIb3N0Iik7CisgICAgICAgICAgICBpZiAoaG9zdEhlYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYmFzZVVyaSA9IG5ldyBVUkkoc2NoZW1lICsgIjovLyIgKyBob3N0SGVhZGVyLmdldCgwKSArIGRlY29kZWRCYXNlUGF0aCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZpbmFsIEluZXRTb2NrZXRBZGRyZXNzIGFkZHIgPSBleGNoYW5nZS5nZXRMb2NhbEFkZHJlc3MoKTsKKyAgICAgICAgICAgICAgICBiYXNlVXJpID0gbmV3IFVSSShzY2hlbWUsIG51bGwsIGFkZHIuZ2V0SG9zdE5hbWUoKSwgYWRkci5nZXRQb3J0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVkQmFzZVBhdGgsIG51bGwsIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChmaW5hbCBVUklTeW50YXhFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZXgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBiYXNlVXJpOworICAgIH0KKworICAgIHByaXZhdGUgVVJJIGdldFJlcXVlc3RVcmkoZmluYWwgSHR0cEV4Y2hhbmdlIGV4Y2hhbmdlLCBmaW5hbCBVUkkgYmFzZVVyaSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkkoZ2V0U2VydmVyQWRkcmVzcyhiYXNlVXJpKSArIGV4Y2hhbmdlLmdldFJlcXVlc3RVUkkoKSk7CisgICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRTZXJ2ZXJBZGRyZXNzKGZpbmFsIFVSSSBiYXNlVXJpKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBVUkkoYmFzZVVyaS5nZXRTY2hlbWUoKSwgbnVsbCwgIGJhc2VVcmkuZ2V0SG9zdCgpLCBiYXNlVXJpLmdldFBvcnQoKSwgbnVsbCwgbnVsbCwgbnVsbCkudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFNlY3VyaXR5Q29udGV4dCBnZXRTZWN1cml0eUNvbnRleHQoZmluYWwgUHJpbmNpcGFsIHByaW5jaXBhbCwgZmluYWwgYm9vbGVhbiBpc1NlY3VyZSkgeworICAgICAgICByZXR1cm4gbmV3IFNlY3VyaXR5Q29udGV4dCgpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1VzZXJJblJvbGUoZmluYWwgU3RyaW5nIHJvbGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTZWN1cmUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGlzU2VjdXJlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBQcmluY2lwYWwgZ2V0VXNlclByaW5jaXBhbCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcHJpbmNpcGFsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXV0aGVudGljYXRpb25TY2hlbWUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc291cmNlQ29uZmlnIGdldENvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBhcHBIYW5kbGVyLmdldENvbmZpZ3VyYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZWxvYWQoKSB7CisgICAgICAgIHJlbG9hZChnZXRDb25maWd1cmF0aW9uKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlbG9hZChmaW5hbCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmF0aW9uKSB7CisgICAgICAgIGFwcEhhbmRsZXIub25TaHV0ZG93bih0aGlzKTsKKworICAgICAgICBhcHBIYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihjb25maWd1cmF0aW9uKTsKKyAgICAgICAgYXBwSGFuZGxlci5vblJlbG9hZCh0aGlzKTsKKyAgICAgICAgYXBwSGFuZGxlci5vblN0YXJ0dXAodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFwcGxpY2F0aW9uSGFuZGxlciBnZXRBcHBsaWNhdGlvbkhhbmRsZXIoKSB7CisgICAgICAgIHJldHVybiBhcHBIYW5kbGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZm9ybSB0aGlzIGNvbnRhaW5lciB0aGF0IHRoZSBzZXJ2ZXIgaGFzIGJlZW4gc3RhcnRlZC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIG11c3QgYmUgaW1wbGljaXRseSBjYWxsZWQgYWZ0ZXIgdGhlIHNlcnZlciBjb250YWluaW5nIHRoaXMgY29udGFpbmVyIGlzIHN0YXJ0ZWQuCisgICAgICovCisgICAgdm9pZCBvblNlcnZlclN0YXJ0KCkgeworICAgICAgICB0aGlzLmFwcEhhbmRsZXIub25TdGFydHVwKHRoaXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZm9ybSB0aGlzIGNvbnRhaW5lciB0aGF0IHRoZSBzZXJ2ZXIgaXMgYmVpbmcgc3RvcHBlZC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIG11c3QgYmUgaW1wbGljaXRseSBjYWxsZWQgYmVmb3JlIHRoZSBzZXJ2ZXIgY29udGFpbmluZyB0aGlzIGNvbnRhaW5lciBpcyBzdG9wcGVkLgorICAgICAqLworICAgIHZvaWQgb25TZXJ2ZXJTdG9wKCkgeworICAgICAgICB0aGlzLmFwcEhhbmRsZXIub25TaHV0ZG93bih0aGlzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNwb25zZVdyaXRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlc3BvbnNlV3JpdGVyIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIEh0dHBFeGNoYW5nZSBleGNoYW5nZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNCb29sZWFuIGNsb3NlZDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBSZXNwb25zZVdyaXRlciBmb3IgZ2l2ZW4ge0BsaW5rIEh0dHBFeGNoYW5nZSBIVFRQIEV4Y2hhbmdlfS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGV4Y2hhbmdlIEV4Y2hhbmdlIG9mIHRoZSB7QGxpbmsgSHR0cFNlcnZlciBKREsgSHR0cCBTZXJ2ZXJ9CisgICAgICAgICAqLworICAgICAgICBSZXNwb25zZVdyaXRlcihmaW5hbCBIdHRwRXhjaGFuZ2UgZXhjaGFuZ2UpIHsKKyAgICAgICAgICAgIHRoaXMuZXhjaGFuZ2UgPSBleGNoYW5nZTsKKyAgICAgICAgICAgIHRoaXMuY2xvc2VkID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gd3JpdGVSZXNwb25zZVN0YXR1c0FuZEhlYWRlcnMoZmluYWwgbG9uZyBjb250ZW50TGVuZ3RoLCBmaW5hbCBDb250YWluZXJSZXNwb25zZSBjb250ZXh0KQorICAgICAgICAgICAgICAgIHRocm93cyBDb250YWluZXJFeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IHJlc3BvbnNlSGVhZGVycyA9IGNvbnRleHQuZ2V0U3RyaW5nSGVhZGVycygpOworICAgICAgICAgICAgZmluYWwgSGVhZGVycyBzZXJ2ZXJIZWFkZXJzID0gZXhjaGFuZ2UuZ2V0UmVzcG9uc2VIZWFkZXJzKCk7CisgICAgICAgICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZSA6IHJlc3BvbnNlSGVhZGVycy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgdmFsdWUgOiBlLmdldFZhbHVlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2VydmVySGVhZGVycy5hZGQoZS5nZXRLZXkoKSwgdmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5nZXRTdGF0dXMoKSA9PSBSZXNwb25zZS5TdGF0dXMuTk9fQ09OVEVOVC5nZXRTdGF0dXNDb2RlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gV29yayBhcm91bmQgYnVnIGluIExXIEhUVFAgc2VydmVyCisgICAgICAgICAgICAgICAgICAgIC8vIGh0dHA6Ly9idWdzLnN1bi5jb20vYnVnZGF0YWJhc2Uvdmlld19idWcuZG8/YnVnX2lkPTY4ODY0MzYKKyAgICAgICAgICAgICAgICAgICAgZXhjaGFuZ2Uuc2VuZFJlc3BvbnNlSGVhZGVycyhjb250ZXh0LmdldFN0YXR1cygpLCAtMSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZXhjaGFuZ2Uuc2VuZFJlc3BvbnNlSGVhZGVycyhjb250ZXh0LmdldFN0YXR1cygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlc3BvbnNlTGVuZ3RoKGNvbnRlbnRMZW5ndGgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29udGFpbmVyRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX1JFU1BPTlNFV1JJVEVSX1dSSVRJTkdfSEVBREVSUygpLCBpb2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZXhjaGFuZ2UuZ2V0UmVzcG9uc2VCb2R5KCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGxvbmcgZ2V0UmVzcG9uc2VMZW5ndGgoZmluYWwgbG9uZyBjb250ZW50TGVuZ3RoKSB7CisgICAgICAgICAgICBpZiAoY29udGVudExlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNvbnRlbnRMZW5ndGggPCAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY29udGVudExlbmd0aDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBzdXNwZW5kKGZpbmFsIGxvbmcgdGltZU91dCwgZmluYWwgVGltZVVuaXQgdGltZVVuaXQsIGZpbmFsIFRpbWVvdXRIYW5kbGVyIHRpbWVvdXRIYW5kbGVyKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk1ldGhvZCBzdXNwZW5kIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGNvbnRhaW5lci4iKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRTdXNwZW5kVGltZW91dChmaW5hbCBsb25nIHRpbWVPdXQsIGZpbmFsIFRpbWVVbml0IHRpbWVVbml0KSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTWV0aG9kIHNldFN1c3BlbmRUaW1lb3V0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGNvbnRhaW5lci4iKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmYWlsdXJlKGZpbmFsIFRocm93YWJsZSBlcnJvcikgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBleGNoYW5nZS5zZW5kUmVzcG9uc2VIZWFkZXJzKFJlc3BvbnNlLlN0YXR1cy5JTlRFUk5BTF9TRVJWRVJfRVJST1IuZ2V0U3RhdHVzQ29kZSgpLCBnZXRSZXNwb25zZUxlbmd0aCgwKSk7CisgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5XQVJOSU5HLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9SRVNQT05TRVdSSVRFUl9TRU5ESU5HX0ZBSUxVUkVfUkVTUE9OU0UoKSwgZSk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGNvbW1pdCgpOworICAgICAgICAgICAgICAgIHJldGhyb3coZXJyb3IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZVJlc3BvbnNlQnVmZmVyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY29tbWl0KCkgeworICAgICAgICAgICAgaWYgKGNsb3NlZC5jb21wYXJlQW5kU2V0KGZhbHNlLCB0cnVlKSkgeworICAgICAgICAgICAgICAgIGV4Y2hhbmdlLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0aHJvdyB0aGUgb3JpZ2luYWwgZXhjZXB0aW9uIGFzIHJlcXVpcmVkIGJ5IEpBWC1SUywgMy4zLjQKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGVycm9yIHRocm93YWJsZSB0byBiZSByZS10aHJvd24KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCByZXRocm93KGZpbmFsIFRocm93YWJsZSBlcnJvcikgeworICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKSBlcnJvcjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbnRhaW5lckV4Y2VwdGlvbihlcnJvcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ29tbWl0cyB0aGUgcmVzcG9uc2UgYW5kIGxvZ3MgYSB3YXJuaW5nIG1lc3NhZ2UuCisgICAgICAgICAqCisgICAgICAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgYnkgdGhlIGNvbnRhaW5lciBhdCB0aGUgZW5kIG9mIHRoZQorICAgICAgICAgKiBoYW5kbGUgbWV0aG9kIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBSZXNwb25zZVdyaXRlciB3YXMgY29tbWl0dGVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSB2b2lkIGNsb3NlQW5kTG9nV2FybmluZygpIHsKKyAgICAgICAgICAgIGlmIChjbG9zZWQuY29tcGFyZUFuZFNldChmYWxzZSwgdHJ1ZSkpIHsKKyAgICAgICAgICAgICAgICBleGNoYW5nZS5jbG9zZSgpOworICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuV0FSTklORywgTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfUkVTUE9OU0VXUklURVJfUkVTUE9OU0VfVU5DT01NSVRFRCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lcnMvamRrLWh0dHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGtodHRwL0pka0h0dHBIYW5kbGVyQ29udGFpbmVyUHJvdmlkZXIuamF2YSBiL2NvbnRhaW5lcnMvamRrLWh0dHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGtodHRwL0pka0h0dHBIYW5kbGVyQ29udGFpbmVyUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDYzMDZkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVycy9qZGstaHR0cC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pka2h0dHAvSmRrSHR0cEhhbmRsZXJDb250YWluZXJQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamRraHR0cDsKKworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29udGFpbmVyUHJvdmlkZXI7CisKK2ltcG9ydCBjb20uc3VuLm5ldC5odHRwc2VydmVyLkh0dHBIYW5kbGVyOworCisvKioKKyAqIENvbnRhaW5lciBwcm92aWRlciBmb3IgY29udGFpbmVycyBiYXNlZCBvbiBsaWdodHdlaWdodCBKYXZhIFNFIEhUVFAgU2VydmVyJ3Mge0BsaW5rIEh0dHBIYW5kbGVyfS4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBKZGtIdHRwSGFuZGxlckNvbnRhaW5lclByb3ZpZGVyIGltcGxlbWVudHMgQ29udGFpbmVyUHJvdmlkZXIgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxUPiBUIGNyZWF0ZUNvbnRhaW5lcihDbGFzczxUPiB0eXBlLCBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbikgdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24geworICAgICAgICBpZiAodHlwZSAhPSBIdHRwSGFuZGxlci5jbGFzcyAmJiB0eXBlICE9IEpka0h0dHBIYW5kbGVyQ29udGFpbmVyLmNsYXNzKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHlwZS5jYXN0KG5ldyBKZGtIdHRwSGFuZGxlckNvbnRhaW5lcihhcHBsaWNhdGlvbikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lcnMvamRrLWh0dHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGtodHRwL0pka0h0dHBTZXJ2ZXJGYWN0b3J5LmphdmEgYi9jb250YWluZXJzL2pkay1odHRwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRraHR0cC9KZGtIdHRwU2VydmVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMWZiYjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXJzL2pkay1odHRwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRraHR0cC9KZGtIdHRwU2VydmVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzg2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lmpka2h0dHA7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMQ29udGV4dDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhLlRocmVhZEZhY3RvcnlCdWlsZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lmpka2h0dHAuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5KZXJzZXlQcm9jZXNzaW5nVW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbnRhaW5lcjsKKworaW1wb3J0IGNvbS5zdW4ubmV0Lmh0dHBzZXJ2ZXIuSHR0cENvbnRleHQ7CitpbXBvcnQgY29tLnN1bi5uZXQuaHR0cHNlcnZlci5IdHRwSGFuZGxlcjsKK2ltcG9ydCBjb20uc3VuLm5ldC5odHRwc2VydmVyLkh0dHBTZXJ2ZXI7CitpbXBvcnQgY29tLnN1bi5uZXQuaHR0cHNlcnZlci5IdHRwc0NvbmZpZ3VyYXRvcjsKK2ltcG9ydCBjb20uc3VuLm5ldC5odHRwc2VydmVyLkh0dHBzU2VydmVyOworCisvKioKKyAqIEZhY3RvcnkgZm9yIGNyZWF0aW5nIHtAbGluayBIdHRwU2VydmVyIEpESyBIdHRwU2VydmVyfSBpbnN0YW5jZXMgdG8gcnVuIEplcnNleSBhcHBsaWNhdGlvbnMuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEpka0h0dHBTZXJ2ZXJGYWN0b3J5IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKEpka0h0dHBTZXJ2ZXJGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW5kIHN0YXJ0IHRoZSB7QGxpbmsgSHR0cFNlcnZlciBKREsgSHR0cFNlcnZlcn0gd2l0aCB0aGUgSmVyc2V5IGFwcGxpY2F0aW9uIGRlcGxveWVkCisgICAgICogYXQgdGhlIGdpdmVuIHtAbGluayBVUkl9LgorICAgICAqIDxwPgorICAgICAqIFRoZSByZXR1cm5lZCB7QGxpbmsgSHR0cFNlcnZlciBKREsgSHR0cFNlcnZlcn0gaXMgc3RhcnRlZC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpICAgICAgICAgICB0aGUge0BsaW5rIFVSSSB1cml9IG9uIHdoaWNoIHRoZSBKZXJzZXkgYXBwbGljYXRpb24gd2lsbCBiZSBkZXBsb3llZC4KKyAgICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbiB0aGUgSmVyc2V5IHNlcnZlci1zaWRlIGFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24uCisgICAgICogQHJldHVybiBOZXdseSBjcmVhdGVkIHtAbGluayBIdHRwU2VydmVyfS4KKyAgICAgKiBAdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24gdGhyb3duIHdoZW4gcHJvYmxlbXMgZHVyaW5nIHNlcnZlciBjcmVhdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBIdHRwU2VydmVyIGNyZWF0ZUh0dHBTZXJ2ZXIoZmluYWwgVVJJIHVyaSwgZmluYWwgUmVzb3VyY2VDb25maWcgY29uZmlndXJhdGlvbikgeworICAgICAgICByZXR1cm4gY3JlYXRlSHR0cFNlcnZlcih1cmksIGNvbmZpZ3VyYXRpb24sIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSAoYW5kIHBvc3NpYmx5IHN0YXJ0KSB0aGUge0BsaW5rIEh0dHBTZXJ2ZXIgSkRLIEh0dHBTZXJ2ZXJ9IHdpdGggdGhlIEpBWC1SUyAvIEplcnNleSBhcHBsaWNhdGlvbiBkZXBsb3llZAorICAgICAqIG9uIHRoZSBnaXZlbiB7QGxpbmsgVVJJfS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUge0Bjb2RlIHN0YXJ0fSBmbGFnIGNvbnRyb2xzIHdoZXRoZXIgb3Igbm90IHRoZSByZXR1cm5lZCB7QGxpbmsgSHR0cFNlcnZlciBKREsgSHR0cFNlcnZlcn0gaXMgc3RhcnRlZC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpICAgICAgICAgICB0aGUge0BsaW5rIFVSSSB1cml9IG9uIHdoaWNoIHRoZSBKZXJzZXkgYXBwbGljYXRpb24gd2lsbCBiZSBkZXBsb3llZC4KKyAgICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbiB0aGUgSmVyc2V5IHNlcnZlci1zaWRlIGFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24uCisgICAgICogQHBhcmFtIHN0YXJ0ICAgICAgICAgaWYgc2V0IHRvIHtAY29kZSBmYWxzZX0sIHRoZSBjcmVhdGVkIHNlcnZlciB3aWxsIG5vdCBiZSBhdXRvbWF0aWNhbGx5IHN0YXJ0ZWQuCisgICAgICogQHJldHVybiBOZXdseSBjcmVhdGVkIHtAbGluayBIdHRwU2VydmVyfS4KKyAgICAgKiBAdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24gdGhyb3duIHdoZW4gcHJvYmxlbXMgZHVyaW5nIHNlcnZlciBjcmVhdGlvbiBvY2N1cnMuCisgICAgICogQHNpbmNlIDIuOAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgSHR0cFNlcnZlciBjcmVhdGVIdHRwU2VydmVyKGZpbmFsIFVSSSB1cmksIGZpbmFsIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyYXRpb24sIGZpbmFsIGJvb2xlYW4gc3RhcnQpIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUh0dHBTZXJ2ZXIodXJpLCBuZXcgSmRrSHR0cEhhbmRsZXJDb250YWluZXIoY29uZmlndXJhdGlvbiksIHN0YXJ0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgKGFuZCBwb3NzaWJseSBzdGFydCkgdGhlIHtAbGluayBIdHRwU2VydmVyIEpESyBIdHRwU2VydmVyfSB3aXRoIHRoZSBKQVgtUlMgLyBKZXJzZXkgYXBwbGljYXRpb24gZGVwbG95ZWQKKyAgICAgKiBvbiB0aGUgZ2l2ZW4ge0BsaW5rIFVSSX0uCisgICAgICogPHAvPgorICAgICAqCisgICAgICogQHBhcmFtIHVyaSAgICAgICAgICAgdGhlIHtAbGluayBVUkkgdXJpfSBvbiB3aGljaCB0aGUgSmVyc2V5IGFwcGxpY2F0aW9uIHdpbGwgYmUgZGVwbG95ZWQuCisgICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gdGhlIEplcnNleSBzZXJ2ZXItc2lkZSBhcHBsaWNhdGlvbiBjb25maWd1cmF0aW9uLgorICAgICAqIEBwYXJhbSBwYXJlbnRDb250ZXh0IERJIHByb3ZpZGVyIHNwZWNpZmljIGNvbnRleHQgd2l0aCBhcHBsaWNhdGlvbidzIHJlZ2lzdGVyZWQgYmluZGluZ3MuCisgICAgICogQHJldHVybiBOZXdseSBjcmVhdGVkIHtAbGluayBIdHRwU2VydmVyfS4KKyAgICAgKiBAdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24gdGhyb3duIHdoZW4gcHJvYmxlbXMgZHVyaW5nIHNlcnZlciBjcmVhdGlvbiBvY2N1cnMuCisgICAgICogQHNlZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZGtodHRwLkpka0h0dHBIYW5kbGVyQ29udGFpbmVyCisgICAgICogQHNpbmNlIDIuMTIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEh0dHBTZXJ2ZXIgY3JlYXRlSHR0cFNlcnZlcihmaW5hbCBVUkkgdXJpLCBmaW5hbCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBwYXJlbnRDb250ZXh0KSB7CisgICAgICAgIHJldHVybiBjcmVhdGVIdHRwU2VydmVyKHVyaSwgbmV3IEpka0h0dHBIYW5kbGVyQ29udGFpbmVyKGNvbmZpZ3VyYXRpb24sIHBhcmVudENvbnRleHQpLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW5kIHN0YXJ0IHRoZSB7QGxpbmsgSHR0cFNlcnZlciBKREsgSHR0cFNlcnZlcn0sIGV2ZW50dWFsbHkge0Bjb2RlIEh0dHBTZXJ2ZXJ9J3Mgc3ViY2xhc3MKKyAgICAgKiB7QGxpbmsgSHR0cHNTZXJ2ZXIgSkRLIEh0dHBzU2VydmVyfSB3aXRoIHRoZSBKQVgtUlMgLyBKZXJzZXkgYXBwbGljYXRpb24gZGVwbG95ZWQgb24gdGhlIGdpdmVuIHtAbGluayBVUkl9LgorICAgICAqIDxwPgorICAgICAqIFRoZSByZXR1cm5lZCB7QGxpbmsgSHR0cFNlcnZlciBKREsgSHR0cFNlcnZlcn0gaXMgc3RhcnRlZC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpICAgICAgICAgICB0aGUge0BsaW5rIFVSSSB1cml9IG9uIHdoaWNoIHRoZSBKZXJzZXkgYXBwbGljYXRpb24gd2lsbCBiZSBkZXBsb3llZC4KKyAgICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbiB0aGUgSmVyc2V5IHNlcnZlci1zaWRlIGFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24uCisgICAgICogQHBhcmFtIHNzbENvbnRleHQgICAgY3VzdG9tIHtAbGluayBTU0xDb250ZXh0fSB0byBiZSBwYXNzZWQgdG8gdGhlIHNlcnZlcgorICAgICAqIEByZXR1cm4gTmV3bHkgY3JlYXRlZCB7QGxpbmsgSHR0cFNlcnZlcn0uCisgICAgICogQHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uIHRocm93biB3aGVuIHByb2JsZW1zIGR1cmluZyBzZXJ2ZXIgY3JlYXRpb24gb2NjdXJzLgorICAgICAqIEBzaW5jZSAyLjE4CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBIdHRwU2VydmVyIGNyZWF0ZUh0dHBTZXJ2ZXIoZmluYWwgVVJJIHVyaSwgZmluYWwgUmVzb3VyY2VDb25maWcgY29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTU0xDb250ZXh0IHNzbENvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUh0dHBTZXJ2ZXIodXJpLCBuZXcgSmRrSHR0cEhhbmRsZXJDb250YWluZXIoY29uZmlndXJhdGlvbiksCisgICAgICAgICAgICAgICAgc3NsQ29udGV4dCwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIChhbmQgcG9zc2libHkgc3RhcnQpIHRoZSB7QGxpbmsgSHR0cFNlcnZlciBKREsgSHR0cFNlcnZlcn0sIGV2ZW50dWFsbHkge0Bjb2RlIEh0dHBTZXJ2ZXJ9J3Mgc3ViY2xhc3MKKyAgICAgKiB7QGxpbmsgSHR0cHNTZXJ2ZXIgSkRLIEh0dHBzU2VydmVyfSB3aXRoIHRoZSBKQVgtUlMgLyBKZXJzZXkgYXBwbGljYXRpb24gZGVwbG95ZWQgb24gdGhlIGdpdmVuIHtAbGluayBVUkl9LgorICAgICAqIDxwPgorICAgICAqIFRoZSB7QGNvZGUgc3RhcnR9IGZsYWcgY29udHJvbHMgd2hldGhlciBvciBub3QgdGhlIHJldHVybmVkIHtAbGluayBIdHRwU2VydmVyIEpESyBIdHRwU2VydmVyfSBpcyBzdGFydGVkLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgICAgICAgICAgIHRoZSB7QGxpbmsgVVJJIHVyaX0gb24gd2hpY2ggdGhlIEplcnNleSBhcHBsaWNhdGlvbiB3aWxsIGJlIGRlcGxveWVkLgorICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uIHRoZSBKZXJzZXkgc2VydmVyLXNpZGUgYXBwbGljYXRpb24gY29uZmlndXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gc3NsQ29udGV4dCAgICBjdXN0b20ge0BsaW5rIFNTTENvbnRleHR9IHRvIGJlIHBhc3NlZCB0byB0aGUgc2VydmVyCisgICAgICogQHBhcmFtIHN0YXJ0ICAgICAgICAgaWYgc2V0IHRvIHtAY29kZSBmYWxzZX0sIHRoZSBjcmVhdGVkIHNlcnZlciB3aWxsIG5vdCBiZSBhdXRvbWF0aWNhbGx5IHN0YXJ0ZWQuCisgICAgICogQHJldHVybiBOZXdseSBjcmVhdGVkIHtAbGluayBIdHRwU2VydmVyfS4KKyAgICAgKiBAdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24gdGhyb3duIHdoZW4gcHJvYmxlbXMgZHVyaW5nIHNlcnZlciBjcmVhdGlvbiBvY2N1cnMuCisgICAgICogQHNpbmNlIDIuMTcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEh0dHBTZXJ2ZXIgY3JlYXRlSHR0cFNlcnZlcihmaW5hbCBVUkkgdXJpLCBmaW5hbCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNTTENvbnRleHQgc3NsQ29udGV4dCwgZmluYWwgYm9vbGVhbiBzdGFydCkgeworICAgICAgICByZXR1cm4gY3JlYXRlSHR0cFNlcnZlcih1cmksCisgICAgICAgICAgICAgICAgbmV3IEpka0h0dHBIYW5kbGVyQ29udGFpbmVyKGNvbmZpZ3VyYXRpb24pLAorICAgICAgICAgICAgICAgIHNzbENvbnRleHQsCisgICAgICAgICAgICAgICAgc3RhcnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSAoYW5kIHBvc3NpYmx5IHN0YXJ0KSB0aGUge0BsaW5rIEh0dHBTZXJ2ZXIgSkRLIEh0dHBTZXJ2ZXJ9LCBldmVudHVhbGx5IHtAY29kZSBIdHRwU2VydmVyfSdzIHN1YmNsYXNzCisgICAgICoge0BsaW5rIEh0dHBzU2VydmVyfSB3aXRoIHRoZSBKQVgtUlMgLyBKZXJzZXkgYXBwbGljYXRpb24gZGVwbG95ZWQgb24gdGhlIGdpdmVuIHtAbGluayBVUkl9LgorICAgICAqIDxwPgorICAgICAqIFRoZSB7QGNvZGUgc3RhcnR9IGZsYWcgY29udHJvbHMgd2hldGhlciBvciBub3QgdGhlIHJldHVybmVkIHtAbGluayBIdHRwU2VydmVyIEpESyBIdHRwU2VydmVyfSBpcyBzdGFydGVkLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgICAgICAgICAgIHRoZSB7QGxpbmsgVVJJIHVyaX0gb24gd2hpY2ggdGhlIEplcnNleSBhcHBsaWNhdGlvbiB3aWxsIGJlIGRlcGxveWVkLgorICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uIHRoZSBKZXJzZXkgc2VydmVyLXNpZGUgYXBwbGljYXRpb24gY29uZmlndXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gcGFyZW50Q29udGV4dCBESSBwcm92aWRlciBzcGVjaWZpYyBjb250ZXh0IHdpdGggYXBwbGljYXRpb24ncyByZWdpc3RlcmVkIGJpbmRpbmdzLgorICAgICAqIEBwYXJhbSBzc2xDb250ZXh0ICAgIGN1c3RvbSB7QGxpbmsgU1NMQ29udGV4dH0gdG8gYmUgcGFzc2VkIHRvIHRoZSBzZXJ2ZXIKKyAgICAgKiBAcGFyYW0gc3RhcnQgICAgICAgICBpZiBzZXQgdG8ge0Bjb2RlIGZhbHNlfSwgdGhlIGNyZWF0ZWQgc2VydmVyIHdpbGwgbm90IGJlIGF1dG9tYXRpY2FsbHkgc3RhcnRlZC4KKyAgICAgKiBAcmV0dXJuIE5ld2x5IGNyZWF0ZWQge0BsaW5rIEh0dHBTZXJ2ZXJ9LgorICAgICAqIEB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiB0aHJvd24gd2hlbiBwcm9ibGVtcyBkdXJpbmcgc2VydmVyIGNyZWF0aW9uIG9jY3Vycy4KKyAgICAgKiBAc2luY2UgMi4xOAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgSHR0cFNlcnZlciBjcmVhdGVIdHRwU2VydmVyKGZpbmFsIFVSSSB1cmksIGZpbmFsIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHBhcmVudENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU1NMQ29udGV4dCBzc2xDb250ZXh0LCBmaW5hbCBib29sZWFuIHN0YXJ0KSB7CisgICAgICAgIHJldHVybiBjcmVhdGVIdHRwU2VydmVyKHVyaSwKKyAgICAgICAgICAgICAgICBuZXcgSmRrSHR0cEhhbmRsZXJDb250YWluZXIoY29uZmlndXJhdGlvbiwgcGFyZW50Q29udGV4dCksCisgICAgICAgICAgICAgICAgc3NsQ29udGV4dCwKKyAgICAgICAgICAgICAgICBzdGFydAorICAgICAgICApOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEh0dHBTZXJ2ZXIgY3JlYXRlSHR0cFNlcnZlcihmaW5hbCBVUkkgdXJpLCBmaW5hbCBKZGtIdHRwSGFuZGxlckNvbnRhaW5lciBoYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHN0YXJ0KSB7CisgICAgICAgIHJldHVybiBjcmVhdGVIdHRwU2VydmVyKHVyaSwgaGFuZGxlciwgbnVsbCwgc3RhcnQpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEh0dHBTZXJ2ZXIgY3JlYXRlSHR0cFNlcnZlcihmaW5hbCBVUkkgdXJpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBKZGtIdHRwSGFuZGxlckNvbnRhaW5lciBoYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTU0xDb250ZXh0IHNzbENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gc3RhcnQpIHsKKyAgICAgICAgaWYgKHVyaSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX0NPTlRBSU5FUl9VUklfTlVMTCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFN0cmluZyBzY2hlbWUgPSB1cmkuZ2V0U2NoZW1lKCk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNIdHRwID0gImh0dHAiLmVxdWFsc0lnbm9yZUNhc2Uoc2NoZW1lKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpc0h0dHBzID0gImh0dHBzIi5lcXVhbHNJZ25vcmVDYXNlKHNjaGVtZSk7CisgICAgICAgIGZpbmFsIEh0dHBzQ29uZmlndXJhdG9yIGh0dHBzQ29uZmlndXJhdG9yID0gc3NsQ29udGV4dCAhPSBudWxsID8gbmV3IEh0dHBzQ29uZmlndXJhdG9yKHNzbENvbnRleHQpIDogbnVsbDsKKworICAgICAgICBpZiAoaXNIdHRwKSB7CisgICAgICAgICAgICBpZiAoaHR0cHNDb25maWd1cmF0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIGF0dGVtcHQgdG8gdXNlIGh0dHBzIHdpdGggaHR0cCBzY2hlbWUKKyAgICAgICAgICAgICAgICBMT0cud2FybmluZyhMb2NhbGl6YXRpb25NZXNzYWdlcy5XQVJOSU5HX0NPTlRBSU5FUl9VUklfU0NIRU1FX1NFQ1VSRUQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoaXNIdHRwcykgeworICAgICAgICAgICAgaWYgKGh0dHBzQ29uZmlndXJhdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIFNTTENvbnRleHQgKHZpYSBIdHRwc0NvbmZpZ3VyYXRvcikgaGFzIHRvIGJlIHNldCBiZWZvcmUgdGhlIHNlcnZlciBzdGFydHMuCisgICAgICAgICAgICAgICAgICAgIC8vIFN0YXJ0aW5nIGh0dHBzIHNlcnZlciB3L28gU1NMIGlzIGludmFsaWQsIGl0IHdpbGwgbGVhZCB0byBlcnJvciBhbnl3YXkuCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfQ09OVEFJTkVSX0hUVFBTX05PX1NTTCgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGluZyB0aGUgaHR0cHMgc2VydmVyIHcvbyBTU0wgY29udGV4dCwgYnV0IG5vdCBzdGFydGluZyBpdCBpcyB2YWxpZC4KKyAgICAgICAgICAgICAgICAgICAgLy8gSG93ZXZlciwgc2VydmVyLnNldEh0dHBzQ29uZmlndXJhdG9yKCkgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBzdGFydC4KKyAgICAgICAgICAgICAgICAgICAgTE9HLmluZm8oTG9jYWxpemF0aW9uTWVzc2FnZXMuSU5GT19DT05UQUlORVJfSFRUUFNfTk9fU1NMKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfQ09OVEFJTkVSX1VSSV9TQ0hFTUVfVU5LTk9XTih1cmkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFN0cmluZyBwYXRoID0gdXJpLmdldFBhdGgoKTsKKyAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9DT05UQUlORVJfVVJJX1BBVEhfTlVMTCh1cmkpKTsKKyAgICAgICAgfSBlbHNlIGlmIChwYXRoLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9DT05UQUlORVJfVVJJX1BBVEhfRU1QVFkodXJpKSk7CisgICAgICAgIH0gZWxzZSBpZiAocGF0aC5jaGFyQXQoMCkgIT0gJy8nKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX0NPTlRBSU5FUl9VUklfUEFUSF9TVEFSVCh1cmkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGludCBwb3J0ID0gKHVyaS5nZXRQb3J0KCkgPT0gLTEpCisgICAgICAgICAgICAgICAgPyAoaXNIdHRwID8gQ29udGFpbmVyLkRFRkFVTFRfSFRUUF9QT1JUIDogQ29udGFpbmVyLkRFRkFVTFRfSFRUUFNfUE9SVCkKKyAgICAgICAgICAgICAgICA6IHVyaS5nZXRQb3J0KCk7CisKKyAgICAgICAgZmluYWwgSHR0cFNlcnZlciBzZXJ2ZXI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZXJ2ZXIgPSBpc0h0dHAKKyAgICAgICAgICAgICAgICAgICAgPyBIdHRwU2VydmVyLmNyZWF0ZShuZXcgSW5ldFNvY2tldEFkZHJlc3MocG9ydCksIDApCisgICAgICAgICAgICAgICAgICAgIDogSHR0cHNTZXJ2ZXIuY3JlYXRlKG5ldyBJbmV0U29ja2V0QWRkcmVzcyhwb3J0KSwgMCk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfQ09OVEFJTkVSX0VYQ0VQVElPTl9JTygpLCBpb2UpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzSHR0cHMgJiYgaHR0cHNDb25maWd1cmF0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgKChIdHRwc1NlcnZlcikgc2VydmVyKS5zZXRIdHRwc0NvbmZpZ3VyYXRvcihodHRwc0NvbmZpZ3VyYXRvcik7CisgICAgICAgIH0KKworICAgICAgICBzZXJ2ZXIuc2V0RXhlY3V0b3IoRXhlY3V0b3JzLm5ld0NhY2hlZFRocmVhZFBvb2wobmV3IFRocmVhZEZhY3RvcnlCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0TmFtZUZvcm1hdCgiamRrLWh0dHAtc2VydmVyLSVkIikKKyAgICAgICAgICAgICAgICAuc2V0VW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyKG5ldyBKZXJzZXlQcm9jZXNzaW5nVW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyKCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpKTsKKyAgICAgICAgc2VydmVyLmNyZWF0ZUNvbnRleHQocGF0aCwgaGFuZGxlcik7CisKKyAgICAgICAgZmluYWwgSHR0cFNlcnZlciB3cmFwcGVyID0gaXNIdHRwCisgICAgICAgICAgICAgICAgPyBjcmVhdGVIdHRwU2VydmVyV3JhcHBlcihzZXJ2ZXIsIGhhbmRsZXIpCisgICAgICAgICAgICAgICAgOiBjcmVhdGVIdHRwc1NlcnZlcldyYXBwZXIoKEh0dHBzU2VydmVyKSBzZXJ2ZXIsIGhhbmRsZXIpOworCisgICAgICAgIGlmIChzdGFydCkgeworICAgICAgICAgICAgd3JhcHBlci5zdGFydCgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHdyYXBwZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgSHR0cFNlcnZlciBjcmVhdGVIdHRwc1NlcnZlcldyYXBwZXIoZmluYWwgSHR0cHNTZXJ2ZXIgZGVsZWdhdGUsIGZpbmFsIEpka0h0dHBIYW5kbGVyQ29udGFpbmVyIGhhbmRsZXIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBIdHRwc1NlcnZlcigpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRIdHRwc0NvbmZpZ3VyYXRvcihmaW5hbCBIdHRwc0NvbmZpZ3VyYXRvciBodHRwc0NvbmZpZ3VyYXRvcikgeworICAgICAgICAgICAgICAgIGRlbGVnYXRlLnNldEh0dHBzQ29uZmlndXJhdG9yKGh0dHBzQ29uZmlndXJhdG9yKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgSHR0cHNDb25maWd1cmF0b3IgZ2V0SHR0cHNDb25maWd1cmF0b3IoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldEh0dHBzQ29uZmlndXJhdG9yKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgYmluZChmaW5hbCBJbmV0U29ja2V0QWRkcmVzcyBpbmV0U29ja2V0QWRkcmVzcywgZmluYWwgaW50IGkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgZGVsZWdhdGUuYmluZChpbmV0U29ja2V0QWRkcmVzcywgaSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgc3RhcnQoKSB7CisgICAgICAgICAgICAgICAgZGVsZWdhdGUuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICBoYW5kbGVyLm9uU2VydmVyU3RhcnQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRFeGVjdXRvcihmaW5hbCBFeGVjdXRvciBleGVjdXRvcikgeworICAgICAgICAgICAgICAgIGRlbGVnYXRlLnNldEV4ZWN1dG9yKGV4ZWN1dG9yKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgRXhlY3V0b3IgZ2V0RXhlY3V0b3IoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldEV4ZWN1dG9yKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgc3RvcChmaW5hbCBpbnQgaSkgeworICAgICAgICAgICAgICAgIGhhbmRsZXIub25TZXJ2ZXJTdG9wKCk7CisgICAgICAgICAgICAgICAgZGVsZWdhdGUuc3RvcChpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgSHR0cENvbnRleHQgY3JlYXRlQ29udGV4dChmaW5hbCBTdHJpbmcgcywgZmluYWwgSHR0cEhhbmRsZXIgaHR0cEhhbmRsZXIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuY3JlYXRlQ29udGV4dChzLCBodHRwSGFuZGxlcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEh0dHBDb250ZXh0IGNyZWF0ZUNvbnRleHQoZmluYWwgU3RyaW5nIHMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuY3JlYXRlQ29udGV4dChzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmVDb250ZXh0KGZpbmFsIFN0cmluZyBzKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBkZWxlZ2F0ZS5yZW1vdmVDb250ZXh0KHMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZUNvbnRleHQoZmluYWwgSHR0cENvbnRleHQgaHR0cENvbnRleHQpIHsKKyAgICAgICAgICAgICAgICBkZWxlZ2F0ZS5yZW1vdmVDb250ZXh0KGh0dHBDb250ZXh0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgSW5ldFNvY2tldEFkZHJlc3MgZ2V0QWRkcmVzcygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0QWRkcmVzcygpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEh0dHBTZXJ2ZXIgY3JlYXRlSHR0cFNlcnZlcldyYXBwZXIoZmluYWwgSHR0cFNlcnZlciBkZWxlZ2F0ZSwgZmluYWwgSmRrSHR0cEhhbmRsZXJDb250YWluZXIgaGFuZGxlcikgeworICAgICAgICByZXR1cm4gbmV3IEh0dHBTZXJ2ZXIoKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgYmluZChmaW5hbCBJbmV0U29ja2V0QWRkcmVzcyBpbmV0U29ja2V0QWRkcmVzcywgZmluYWwgaW50IGkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgZGVsZWdhdGUuYmluZChpbmV0U29ja2V0QWRkcmVzcywgaSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgc3RhcnQoKSB7CisgICAgICAgICAgICAgICAgZGVsZWdhdGUuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICBoYW5kbGVyLm9uU2VydmVyU3RhcnQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRFeGVjdXRvcihmaW5hbCBFeGVjdXRvciBleGVjdXRvcikgeworICAgICAgICAgICAgICAgIGRlbGVnYXRlLnNldEV4ZWN1dG9yKGV4ZWN1dG9yKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgRXhlY3V0b3IgZ2V0RXhlY3V0b3IoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldEV4ZWN1dG9yKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgc3RvcChmaW5hbCBpbnQgaSkgeworICAgICAgICAgICAgICAgIGhhbmRsZXIub25TZXJ2ZXJTdG9wKCk7CisgICAgICAgICAgICAgICAgZGVsZWdhdGUuc3RvcChpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgSHR0cENvbnRleHQgY3JlYXRlQ29udGV4dChmaW5hbCBTdHJpbmcgcywgZmluYWwgSHR0cEhhbmRsZXIgaHR0cEhhbmRsZXIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuY3JlYXRlQ29udGV4dChzLCBodHRwSGFuZGxlcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEh0dHBDb250ZXh0IGNyZWF0ZUNvbnRleHQoZmluYWwgU3RyaW5nIHMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuY3JlYXRlQ29udGV4dChzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmVDb250ZXh0KGZpbmFsIFN0cmluZyBzKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBkZWxlZ2F0ZS5yZW1vdmVDb250ZXh0KHMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZUNvbnRleHQoZmluYWwgSHR0cENvbnRleHQgaHR0cENvbnRleHQpIHsKKyAgICAgICAgICAgICAgICBkZWxlZ2F0ZS5yZW1vdmVDb250ZXh0KGh0dHBDb250ZXh0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgSW5ldFNvY2tldEFkZHJlc3MgZ2V0QWRkcmVzcygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0QWRkcmVzcygpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIFByZXZlbnRzIGluc3RhbnRpYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBKZGtIdHRwU2VydmVyRmFjdG9yeSgpIHsKKyAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJJbnN0YW50aWF0aW9uIG5vdCBhbGxvd2VkLiIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lcnMvamRrLWh0dHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGtodHRwL3BhY2thZ2UtaW5mby5qYXZhIGIvY29udGFpbmVycy9qZGstaHR0cC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pka2h0dHAvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYwZWM2ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lcnMvamRrLWh0dHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGtodHRwL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKKy8qKgorICogVGhlIGNvbnRhaW5lciBhZGFwdGVyIGJldHdlZW4ge0BsaW5rIGNvbS5zdW4ubmV0Lmh0dHBzZXJ2ZXIuSHR0cFNlcnZlciBKREsgSFRUUCBzZXJ2ZXJ9CisgKiBhbmQgSmVyc2V5IHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyIEplcnNleSBhcHBsaWNhdGlvbiBoYW5kbGVyfQorICogY2xhc3Nlcy4KKyAqLworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZGtodHRwOwpkaWZmIC0tZ2l0IGEvY29udGFpbmVycy9qZGstaHR0cC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5Db250YWluZXJQcm92aWRlciBiL2NvbnRhaW5lcnMvamRrLWh0dHAvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29udGFpbmVyUHJvdmlkZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZkZjk0ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lcnMvamRrLWh0dHAvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29udGFpbmVyUHJvdmlkZXIKQEAgLTAsMCArMSBAQAorb3JnLmdsYXNzZmlzaC5qZXJzZXkuamRraHR0cC5KZGtIdHRwSGFuZGxlckNvbnRhaW5lclByb3ZpZGVyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVycy9qZGstaHR0cC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRraHR0cC9pbnRlcm5hbC9sb2NhbGl6YXRpb24ucHJvcGVydGllcyBiL2NvbnRhaW5lcnMvamRrLWh0dHAvc3JjL21haW4vcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pka2h0dHAvaW50ZXJuYWwvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ1YzQ5NAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lcnMvamRrLWh0dHAvc3JjL21haW4vcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pka2h0dHAvaW50ZXJuYWwvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMKQEAgLTAsMCArMSwzMCBAQAorIworIyBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisjIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyMKKyMgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorIyBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisjIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorIyB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisjCisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorIworCitlcnJvci5jb250YWluZXIuZXhjZXB0aW9uLmlvPUlPRXhjZXB0aW9uIHRocm93biB3aGVuIGNyZWF0aW5nIHRoZSBKREsgSHR0cFNlcnZlci4KK2Vycm9yLmNvbnRhaW5lci51cmkubnVsbD1UaGUgVVJJIG11c3Qgbm90IGJlIG51bGwuCitlcnJvci5jb250YWluZXIudXJpLnBhdGguZW1wdHk9VGhlIFVSSSBwYXRoLCBvZiB0aGUgVVJJIHswfSBtdXN0IGJlIHByZXNlbnQgKG5vdCBhbiBlbXB0eSBzdHJpbmcpLgorZXJyb3IuY29udGFpbmVyLnVyaS5wYXRoLm51bGw9VGhlIFVSSSBwYXRoLCBvZiB0aGUgVVJJIHswfSBtdXN0IGJlIG5vbi1udWxsLgorZXJyb3IuY29udGFpbmVyLnVyaS5wYXRoLnN0YXJ0PVRoZSBVUkkgcGF0aCwgb2YgdGhlIFVSSSB7MH0gbXVzdCBzdGFydCB3aXRoIGEgJy8nLgorZXJyb3IuY29udGFpbmVyLnVyaS5zY2hlbWUudW5rbm93bj1UaGUgVVJJIHNjaGVtZSwgb2YgdGhlIFVSSSB7MH0gbXVzdCBiZSBlcXVhbCAoaWdub3JpbmcgY2FzZSkgdG8gJ2h0dHAnIG9yICdodHRwcycuCitlcnJvci5jb250YWluZXIuaHR0cHMubm8uc3NsPUF0dGVtcHQgdG8gc3RhcnQgYSBIVFRQUyBzZXJ2ZXIgd2l0aCBubyBTU0wgY29udGV4dCBkZWZpbmVkLgorZXJyb3IucmVzcG9uc2V3cml0ZXIucmVzcG9uc2UudW5jb21taXRlZD1SZXNwb25zZVdyaXRlciB3YXMgbm90IGNvbW1pdGVkIHlldC4gQ29tbWl0dGluZyB0aGUgUmVzcG9uc2Ugbm93LgorZXJyb3IucmVzcG9uc2V3cml0ZXIuc2VuZGluZy5mYWlsdXJlLnJlc3BvbnNlPVVuYWJsZSB0byBzZW5kIGEgZmFpbHVyZSByZXNwb25zZS4KK2Vycm9yLnJlc3BvbnNld3JpdGVyLndyaXRpbmcuaGVhZGVycz1FcnJvciB3cml0aW5nIG91dCB0aGUgcmVzcG9uc2UgaGVhZGVycy4KK2luZm8uY29udGFpbmVyLmh0dHBzLm5vLnNzbD1IVFRQUyBzZXJ2ZXIgd2lsbCBiZSBjcmVhdGVkIHdpdGggbm8gU1NMIGNvbnRleHQgZGVmaW5lZC4gSHR0cHNDb25maWd1cmF0b3IgbXVzdCBiZSBcCisgIHNldCBiZWZvcmUgdGhlIHNlcnZlciBpcyBzdGFydGVkLgord2FybmluZy5jb250YWluZXIudXJpLnNjaGVtZS5zZWN1cmVkPVNTTENvbnRleHQgaXMgc2V0LCBidXQgaHR0cCBzY2hlbWUgd2FzIHVzZWQgaW5zdGVhZCBvZiBodHRwcy4gVGhlIFNTTENvbnRleHQgd2lsbCBcCisgIGJlIGlnbm9yZWQuCmRpZmYgLS1naXQgYS9jb250YWluZXJzL2pkay1odHRwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRraHR0cC9BYnN0cmFjdEpka0h0dHBTZXJ2ZXJUZXN0ZXIuamF2YSBiL2NvbnRhaW5lcnMvamRrLWh0dHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGtodHRwL0Fic3RyYWN0SmRrSHR0cFNlcnZlclRlc3Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0OTk4ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXJzL2pkay1odHRwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRraHR0cC9BYnN0cmFjdEpka0h0dHBTZXJ2ZXJUZXN0ZXIuamF2YQpAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZGtodHRwOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBjb20uc3VuLm5ldC5odHRwc2VydmVyLkh0dHBTZXJ2ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5Qcm9wZXJ0aWVzSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKKworLyoqCisgKiBBYnN0cmFjdCBKREsgSFRUUCBTZXJ2ZXIgdW5pdCB0ZXN0ZXIuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmRrSHR0cFNlcnZlclRlc3RlciB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URVhUID0gIiI7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgREVGQVVMVF9QT1JUID0gOTk5ODsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEFic3RyYWN0SmRrSHR0cFNlcnZlclRlc3Rlci5jbGFzcy5nZXROYW1lKCkpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBwb3J0IHRvIGJlIHVzZWQgZm9yIHRlc3QgYXBwbGljYXRpb24gZGVwbG95bWVudHMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBIVFRQIHBvcnQgb2YgdGhlIFVSSQorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCBpbnQgZ2V0UG9ydCgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlID0KKyAgICAgICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChQcm9wZXJ0aWVzSGVscGVyLmdldFN5c3RlbVByb3BlcnR5KCJqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQiKSk7CisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGkgPSBJbnRlZ2VyLnBhcnNlSW50KHZhbHVlKTsKKyAgICAgICAgICAgICAgICBpZiAoaSA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oIlZhbHVlIG5vdCBwb3NpdGl2ZS4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuQ09ORklHLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mICdqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQnIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgcHJvcGVydHkgaXMgbm90IGEgdmFsaWQgcG9zaXRpdmUgaW50ZWdlciBbIiArIHZhbHVlICsgIl0uIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgUmV2ZXJ0aW5nIHRvIGRlZmF1bHQgWyIgKyBERUZBVUxUX1BPUlQgKyAiXS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIERFRkFVTFRfUE9SVDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvbGF0aWxlIEh0dHBTZXJ2ZXIgc2VydmVyOworCisgICAgcHVibGljIFVyaUJ1aWxkZXIgZ2V0VXJpKCkgeworICAgICAgICByZXR1cm4gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0IikucG9ydChnZXRQb3J0KCkpLnBhdGgoQ09OVEVYVCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RhcnRTZXJ2ZXIoQ2xhc3MuLi4gcmVzb3VyY2VzKSB7CisgICAgICAgIFJlc291cmNlQ29uZmlnIGNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhyZXNvdXJjZXMpOworICAgICAgICBjb25maWcucmVnaXN0ZXIoTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpOworICAgICAgICBmaW5hbCBVUkkgYmFzZVVyaSA9IGdldEJhc2VVcmkoKTsKKyAgICAgICAgc2VydmVyID0gSmRrSHR0cFNlcnZlckZhY3RvcnkuY3JlYXRlSHR0cFNlcnZlcihiYXNlVXJpLCBjb25maWcpOworICAgICAgICBMT0dHRVIubG9nKExldmVsLklORk8sICJqZGstaHR0cCBzZXJ2ZXIgc3RhcnRlZCBvbiBiYXNlIHVyaTogIiArIGJhc2VVcmkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0YXJ0U2VydmVyKFJlc291cmNlQ29uZmlnIGNvbmZpZykgeworICAgICAgICBmaW5hbCBVUkkgYmFzZVVyaSA9IGdldEJhc2VVcmkoKTsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKExvZ2dpbmdGZWF0dXJlLmNsYXNzKTsKKyAgICAgICAgc2VydmVyID0gSmRrSHR0cFNlcnZlckZhY3RvcnkuY3JlYXRlSHR0cFNlcnZlcihiYXNlVXJpLCBjb25maWcpOworICAgICAgICBMT0dHRVIubG9nKExldmVsLklORk8sICJqZGstaHR0cCBzZXJ2ZXIgc3RhcnRlZCBvbiBiYXNlIHVyaTogIiArIGJhc2VVcmkpOworICAgIH0KKworICAgIHB1YmxpYyBVUkkgZ2V0QmFzZVVyaSgpIHsKKyAgICAgICAgcmV0dXJuIFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdC8iKS5wb3J0KGdldFBvcnQoKSkuYnVpbGQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9wU2VydmVyKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VydmVyLnN0b3AoMyk7CisgICAgICAgICAgICBzZXJ2ZXIgPSBudWxsOworICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5JTkZPLCAiU2ltcGxlLWh0dHAgc2VydmVyIHN0b3BwZWQuIik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICBpZiAoc2VydmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN0b3BTZXJ2ZXIoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lcnMvamRrLWh0dHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGtodHRwL0Jhc2ljSmRrSHR0cFNlcnZlclRlc3QuamF2YSBiL2NvbnRhaW5lcnMvamRrLWh0dHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGtodHRwL0Jhc2ljSmRrSHR0cFNlcnZlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmEzNDRkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVycy9qZGstaHR0cC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pka2h0dHAvQmFzaWNKZGtIdHRwU2VydmVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamRraHR0cDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pbnN0YW5jZU9mOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLm5vdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKKworaW1wb3J0IGNvbS5zdW4ubmV0Lmh0dHBzZXJ2ZXIuSHR0cFNlcnZlcjsKK2ltcG9ydCBjb20uc3VuLm5ldC5odHRwc2VydmVyLkh0dHBzU2VydmVyOworCisvKioKKyAqIEpkayBIdHRwIFNlcnZlciBiYXNpYyB0ZXN0cy4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEJhc2ljSmRrSHR0cFNlcnZlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdEpka0h0dHBTZXJ2ZXJUZXN0ZXIgeworCisgICAgcHJpdmF0ZSBIdHRwU2VydmVyIHNlcnZlcjsKKworICAgIEBQYXRoKCIvdGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0UmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gInRlc3QiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlSHR0cFNlcnZlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzZXJ2ZXIgPSBKZGtIdHRwU2VydmVyRmFjdG9yeS5jcmVhdGVIdHRwU2VydmVyKAorICAgICAgICAgICAgICAgIFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdC8iKS5wb3J0KGdldFBvcnQoKSkuYnVpbGQoKSwgbmV3IFJlc291cmNlQ29uZmlnKFRlc3RSZXNvdXJjZS5jbGFzcykpOworCisgICAgICAgIGFzc2VydFRoYXQoc2VydmVyLCBpbnN0YW5jZU9mKEh0dHBTZXJ2ZXIuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzZXJ2ZXIsIG5vdChpbnN0YW5jZU9mKEh0dHBzU2VydmVyLmNsYXNzKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUh0dHBzU2VydmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHNlcnZlciA9IEpka0h0dHBTZXJ2ZXJGYWN0b3J5LmNyZWF0ZUh0dHBTZXJ2ZXIoCisgICAgICAgICAgICAgICAgVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwczovL2xvY2FsaG9zdC8iKS5wb3J0KGdldFBvcnQoKSkuYnVpbGQoKSwKKyAgICAgICAgICAgICAgICBuZXcgUmVzb3VyY2VDb25maWcoVGVzdFJlc291cmNlLmNsYXNzKSwKKyAgICAgICAgICAgICAgICBmYWxzZSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChzZXJ2ZXIsIGluc3RhbmNlT2YoSHR0cHNTZXJ2ZXIuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgaWYgKHNlcnZlciAhPSBudWxsKSB7CisgICAgICAgICAgICBzZXJ2ZXIuc3RvcCgzKTsKKyAgICAgICAgICAgIHNlcnZlciA9IG51bGw7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXJzL2pkay1odHRwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRraHR0cC9KZGtIdHRwUGFja2FnZVRlc3QuamF2YSBiL2NvbnRhaW5lcnMvamRrLWh0dHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGtodHRwL0pka0h0dHBQYWNrYWdlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NWJiYWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXJzL2pkay1odHRwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRraHR0cC9KZGtIdHRwUGFja2FnZVRlc3QuamF2YQpAQCAtMCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lmpka2h0dHA7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogSmRrIEh0dHAgQ29udGFpbmVyIHBhY2thZ2Ugc2Nhbm5pbmcgdGVzdC4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSmRrSHR0cFBhY2thZ2VUZXN0IGV4dGVuZHMgQWJzdHJhY3RKZGtIdHRwU2VydmVyVGVzdGVyIHsKKworICAgIEBQYXRoKCIvcGFja2FnZVRlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFJlc291cmNlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAidGVzdCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJzdWIiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFN1YigpIHsKKyAgICAgICAgICAgIHJldHVybiAidGVzdC1zdWIiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SmRrSHR0cFBhY2thZ2UoKSB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJjID0gbmV3IFJlc291cmNlQ29uZmlnKCk7CisgICAgICAgIHJjLnBhY2thZ2VzKHRoaXMuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKKworICAgICAgICBzdGFydFNlcnZlcihyYyk7CisKKyAgICAgICAgV2ViVGFyZ2V0IHIgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpLnRhcmdldChnZXRVcmkoKS5wYXRoKCIvIikuYnVpbGQoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0Iiwgci5wYXRoKCJwYWNrYWdlVGVzdCIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdC1zdWIiLCByLnBhdGgoInBhY2thZ2VUZXN0L3N1YiIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDQsIHIucGF0aCgid3JvbmciKS5yZXF1ZXN0KCkuZ2V0KFJlc3BvbnNlLmNsYXNzKS5nZXRTdGF0dXMoKSk7CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXJzL2pkay1odHRwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRraHR0cC9KZGtIdHRwc1NlcnZlclRlc3QuamF2YSBiL2NvbnRhaW5lcnMvamRrLWh0dHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGtodHRwL0pka0h0dHBzU2VydmVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MGYyYmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXJzL2pkay1odHRwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRraHR0cC9KZGtIdHRwc1NlcnZlclRlc3QuamF2YQpAQCAtMCwwICsxLDIxNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZGtodHRwOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LlVSSTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBqYXZheC5uZXQuc3NsLlNTTENvbnRleHQ7CitpbXBvcnQgamF2YXgubmV0LnNzbC5TU0xIYW5kc2hha2VFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5Tc2xDb25maWd1cmF0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uaW8uQnl0ZVN0cmVhbXM7CisKK2ltcG9ydCBjb20uc3VuLm5ldC5odHRwc2VydmVyLkh0dHBTZXJ2ZXI7CitpbXBvcnQgY29tLnN1bi5uZXQuaHR0cHNlcnZlci5IdHRwc0NvbmZpZ3VyYXRvcjsKK2ltcG9ydCBjb20uc3VuLm5ldC5odHRwc2VydmVyLkh0dHBzU2VydmVyOworCitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaW5zdGFuY2VPZjsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5ub3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEpkayBIdHRwcyBTZXJ2ZXIgdGVzdHMuCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSmRrSHR0cHNTZXJ2ZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RKZGtIdHRwU2VydmVyVGVzdGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUlVTVFNUT1JFX0NMSUVOVF9GSUxFID0gIi4vdHJ1c3RzdG9yZV9jbGllbnQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUlVTVFNUT1JFX0NMSUVOVF9QV0QgPSAiYXNkZmdoIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZU1RPUkVfQ0xJRU5UX0ZJTEUgPSAiLi9rZXlzdG9yZV9jbGllbnQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlTVE9SRV9DTElFTlRfUFdEID0gImFzZGZnaCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZU1RPUkVfU0VSVkVSX0ZJTEUgPSAiLi9rZXlzdG9yZV9zZXJ2ZXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlTVE9SRV9TRVJWRVJfUFdEID0gImFzZGZnaCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSVVNUU1RPUkVfU0VSVkVSX0ZJTEUgPSAiLi90cnVzdHN0b3JlX3NlcnZlciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSVVNUU1RPUkVfU0VSVkVSX1BXRCA9ICJhc2RmZ2giOworCisgICAgcHJpdmF0ZSBIdHRwU2VydmVyIHNlcnZlcjsKKyAgICBwcml2YXRlIGZpbmFsIFVSSSBodHRwc1VyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cHM6Ly9sb2NhbGhvc3QvIikucG9ydChnZXRQb3J0KCkpLmJ1aWxkKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBVUkkgaHR0cFVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdC8iKS5wb3J0KGdldFBvcnQoKSkuYnVpbGQoKTsKKyAgICBwcml2YXRlIGZpbmFsIFJlc291cmNlQ29uZmlnIHJjID0gbmV3IFJlc291cmNlQ29uZmlnKFRlc3RSZXNvdXJjZS5jbGFzcyk7CisKKyAgICBAUGF0aCgiL3Rlc3RIdHRwcyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0UmVzb3VyY2UgeworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJ0ZXN0IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QsIHRoYXQge0BsaW5rIEh0dHBzU2VydmVyfSBpbnN0YW5jZSBpcyByZXR1cm5lZCB3aGVuIHByb3ZpZGluZyBlbXB0eSBTU0xDb250ZXh0IChidXQgbm90IHN0YXJ0aW5nKS4KKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUh0dHBzU2VydmVyTm9Tc2xDb250ZXh0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHNlcnZlciA9IEpka0h0dHBTZXJ2ZXJGYWN0b3J5LmNyZWF0ZUh0dHBTZXJ2ZXIoaHR0cHNVcmksIHJjLCBudWxsLCBmYWxzZSk7CisgICAgICAgIGFzc2VydFRoYXQoc2VydmVyLCBpbnN0YW5jZU9mKEh0dHBzU2VydmVyLmNsYXNzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCwgdGhhdCBleGNlcHRpb24gaXMgdGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBzdGFydCBhIHtAbGluayBIdHRwc1NlcnZlcn0gd2l0aCBlbXB0eSBTU0xDb250ZXh0LgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdFN0YXJ0SHR0cFNlcnZlck5vU3NsQ29udGV4dCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzZXJ2ZXIgPSBKZGtIdHRwU2VydmVyRmFjdG9yeS5jcmVhdGVIdHRwU2VydmVyKGh0dHBzVXJpLCByYywgbnVsbCwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCwgdGhhdCB7QGxpbmsgamF2YXgubmV0LnNzbC5TU0xIYW5kc2hha2VFeGNlcHRpb259IGlzIHRocm93biB3aGVuIGF0dGVwbXRpbmcgdG8gY29ubmVjdCB0byBzZXJ2ZXIgd2l0aCBjbGllbnQKKyAgICAgKiBub3QgY29uZmlndXJlZCBjb3JyZWN0bHkuCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdChleHBlY3RlZCA9IFNTTEhhbmRzaGFrZUV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlSHR0cHNTZXJ2ZXJEZWZhdWx0U3NsQ29udGV4dCgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBzZXJ2ZXIgPSBKZGtIdHRwU2VydmVyRmFjdG9yeS5jcmVhdGVIdHRwU2VydmVyKGh0dHBzVXJpLCByYywgU1NMQ29udGV4dC5nZXREZWZhdWx0KCksIHRydWUpOworICAgICAgICBhc3NlcnRUaGF0KHNlcnZlciwgaW5zdGFuY2VPZihIdHRwc1NlcnZlci5jbGFzcykpOworCisgICAgICAgIC8vIGFjY2VzcyB0aGUgaHR0cHMgc2VydmVyIHdpdGggbm90IGNvbmZpZ3VyZWQgY2xpZW50CisgICAgICAgIGZpbmFsIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0J1aWxkZXIoKS5uZXdDbGllbnQoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNsaWVudC50YXJnZXQoaHR0cHNVcmkpLnBhdGgoInRlc3RIdHRwcyIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgUHJvY2Vzc2luZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBlLmdldENhdXNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0LCB0aGF0IHtAbGluayBIdHRwc1NlcnZlcn0gY2FuIGJlIG1hbnVhbGx5IHN0YXJ0ZWQgZXZlbiB3aXRoIChlbXB0eSkgU1NMQ29udGV4dCwgYnV0IHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uCisgICAgICogb24gcmVxdWVzdC4KKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIEBUZXN0KGV4cGVjdGVkID0gSU9FeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdEh0dHBzU2VydmVyTm9Tc2xDb250ZXh0RGVsYXllZFN0YXJ0KCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHNlcnZlciA9IEpka0h0dHBTZXJ2ZXJGYWN0b3J5LmNyZWF0ZUh0dHBTZXJ2ZXIoaHR0cHNVcmksIHJjLCBudWxsLCBmYWxzZSk7CisgICAgICAgIGFzc2VydFRoYXQoc2VydmVyLCBpbnN0YW5jZU9mKEh0dHBzU2VydmVyLmNsYXNzKSk7CisgICAgICAgIHNlcnZlci5zdGFydCgpOworCisgICAgICAgIGZpbmFsIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0J1aWxkZXIoKS5uZXdDbGllbnQoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNsaWVudC50YXJnZXQoaHR0cHNVcmkpLnBhdGgoInRlc3RIdHRwcyIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgUHJvY2Vzc2luZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBlLmdldENhdXNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0LCB0aGF0IHtAbGluayBIdHRwc1NlcnZlcn0gY2Fubm90IGJlIGNvbmZpZ3VyZWQgd2l0aCB7QGxpbmsgSHR0cHNDb25maWd1cmF0b3J9IGFmdGVyIGl0IGhhcyBzdGFydGVkLgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsU3RhdGVFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdENvbmZpZ3VyZVNzbENvbnRleHRBZnRlclN0YXJ0KCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHNlcnZlciA9IEpka0h0dHBTZXJ2ZXJGYWN0b3J5LmNyZWF0ZUh0dHBTZXJ2ZXIoaHR0cHNVcmksIHJjLCBudWxsLCBmYWxzZSk7CisgICAgICAgIGFzc2VydFRoYXQoc2VydmVyLCBpbnN0YW5jZU9mKEh0dHBzU2VydmVyLmNsYXNzKSk7CisgICAgICAgIHNlcnZlci5zdGFydCgpOworICAgICAgICAoKEh0dHBzU2VydmVyKSBzZXJ2ZXIpLnNldEh0dHBzQ29uZmlndXJhdG9yKG5ldyBIdHRwc0NvbmZpZ3VyYXRvcihnZXRTZXJ2ZXJTc2xDb250ZXh0KCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBhIGNsaWVudCB0byBzZXJ2ZXIgcm91bmR0cmlwIHdpdGggY29ycmVjdGx5IGNvbmZpZ3VyZWQgU1NMIG9uIGJvdGggc2lkZXMuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUh0dHBzU2VydmVyUm91bmRUcmlwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU1NMQ29udGV4dCBzZXJ2ZXJTc2xDb250ZXh0ID0gZ2V0U2VydmVyU3NsQ29udGV4dCgpOworCisgICAgICAgIHNlcnZlciA9IEpka0h0dHBTZXJ2ZXJGYWN0b3J5LmNyZWF0ZUh0dHBTZXJ2ZXIoaHR0cHNVcmksIHJjLCBzZXJ2ZXJTc2xDb250ZXh0LCB0cnVlKTsKKworICAgICAgICBmaW5hbCBTU0xDb250ZXh0IGZvdW5kQ29udGV4dCA9ICgoSHR0cHNTZXJ2ZXIpIHNlcnZlcikuZ2V0SHR0cHNDb25maWd1cmF0b3IoKS5nZXRTU0xDb250ZXh0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhzZXJ2ZXJTc2xDb250ZXh0LCBmb3VuZENvbnRleHQpOworCisgICAgICAgIGZpbmFsIFNTTENvbnRleHQgY2xpZW50U3NsQ29udGV4dCA9IGdldENsaWVudFNzbENvbnRleHQoKTsKKyAgICAgICAgZmluYWwgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3QnVpbGRlcigpLnNzbENvbnRleHQoY2xpZW50U3NsQ29udGV4dCkuYnVpbGQoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3BvbnNlID0gY2xpZW50LnRhcmdldChodHRwc1VyaSkucGF0aCgidGVzdEh0dHBzIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscygidGVzdCIsIHJlc3BvbnNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0LCB0aGF0IGlmIFVSSSB1c2VzIGh0dHAgc2NoZW1lIGluc3RlYWQgb2YgaHR0cHMsIFNTTENvbnRleHQgaXMgaWdub3JlZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SHR0cFdpdGhTc2woKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBzZXJ2ZXIgPSBKZGtIdHRwU2VydmVyRmFjdG9yeS5jcmVhdGVIdHRwU2VydmVyKGh0dHBVcmksIHJjLCBnZXRTZXJ2ZXJTc2xDb250ZXh0KCksIHRydWUpOworICAgICAgICBhc3NlcnRUaGF0KHNlcnZlciwgaW5zdGFuY2VPZihIdHRwU2VydmVyLmNsYXNzKSk7CisgICAgICAgIGFzc2VydFRoYXQoc2VydmVyLCBub3QoaW5zdGFuY2VPZihIdHRwc1NlcnZlci5jbGFzcykpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFNTTENvbnRleHQgZ2V0Q2xpZW50U3NsQ29udGV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIHRydXN0U3RvcmUgPSBKZGtIdHRwc1NlcnZlclRlc3QuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbShUUlVTVFNUT1JFX0NMSUVOVF9GSUxFKTsKKyAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0ga2V5U3RvcmUgPSBKZGtIdHRwc1NlcnZlclRlc3QuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbShLRVlTVE9SRV9DTElFTlRfRklMRSk7CisKKworICAgICAgICBmaW5hbCBTc2xDb25maWd1cmF0b3Igc3NsQ29uZmlnQ2xpZW50ID0gU3NsQ29uZmlndXJhdG9yLm5ld0luc3RhbmNlKCkKKyAgICAgICAgICAgICAgICAudHJ1c3RTdG9yZUJ5dGVzKEJ5dGVTdHJlYW1zLnRvQnl0ZUFycmF5KHRydXN0U3RvcmUpKQorICAgICAgICAgICAgICAgIC50cnVzdFN0b3JlUGFzc3dvcmQoVFJVU1RTVE9SRV9DTElFTlRfUFdEKQorICAgICAgICAgICAgICAgIC5rZXlTdG9yZUJ5dGVzKEJ5dGVTdHJlYW1zLnRvQnl0ZUFycmF5KGtleVN0b3JlKSkKKyAgICAgICAgICAgICAgICAua2V5UGFzc3dvcmQoS0VZU1RPUkVfQ0xJRU5UX1BXRCk7CisKKyAgICAgICAgcmV0dXJuIHNzbENvbmZpZ0NsaWVudC5jcmVhdGVTU0xDb250ZXh0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTU0xDb250ZXh0IGdldFNlcnZlclNzbENvbnRleHQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSB0cnVzdFN0b3JlID0gSmRrSHR0cHNTZXJ2ZXJUZXN0LmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oVFJVU1RTVE9SRV9TRVJWRVJfRklMRSk7CisgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGtleVN0b3JlID0gSmRrSHR0cHNTZXJ2ZXJUZXN0LmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oS0VZU1RPUkVfU0VSVkVSX0ZJTEUpOworCisgICAgICAgIGZpbmFsIFNzbENvbmZpZ3VyYXRvciBzc2xDb25maWdTZXJ2ZXIgPSBTc2xDb25maWd1cmF0b3IubmV3SW5zdGFuY2UoKQorICAgICAgICAgICAgICAgIC5rZXlTdG9yZUJ5dGVzKEJ5dGVTdHJlYW1zLnRvQnl0ZUFycmF5KGtleVN0b3JlKSkKKyAgICAgICAgICAgICAgICAua2V5UGFzc3dvcmQoS0VZU1RPUkVfU0VSVkVSX1BXRCkKKyAgICAgICAgICAgICAgICAudHJ1c3RTdG9yZUJ5dGVzKEJ5dGVTdHJlYW1zLnRvQnl0ZUFycmF5KHRydXN0U3RvcmUpKQorICAgICAgICAgICAgICAgIC50cnVzdFN0b3JlUGFzc3dvcmQoVFJVU1RTVE9SRV9TRVJWRVJfUFdEKTsKKworICAgICAgICByZXR1cm4gc3NsQ29uZmlnU2VydmVyLmNyZWF0ZVNTTENvbnRleHQoKTsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgaWYgKHNlcnZlciAhPSBudWxsKSB7CisgICAgICAgICAgICBzZXJ2ZXIuc3RvcCgwKTsKKyAgICAgICAgICAgIHNlcnZlciA9IG51bGw7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXJzL2pkay1odHRwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRraHR0cC9MaWZlY3ljbGVMaXN0ZW5lclRlc3QuamF2YSBiL2NvbnRhaW5lcnMvamRrLWh0dHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGtodHRwL0xpZmVjeWNsZUxpc3RlbmVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyOTA1OGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXJzL2pkay1odHRwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRraHR0cC9MaWZlY3ljbGVMaXN0ZW5lclRlc3QuamF2YQpAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZGtodHRwOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQWJzdHJhY3RDb250YWluZXJMaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbnRhaW5lcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBSZWxvYWQgYW5kIENvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyIHN1cHBvcnQgdGVzdC4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgTGlmZWN5Y2xlTGlzdGVuZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RKZGtIdHRwU2VydmVyVGVzdGVyIHsKKworICAgIEBQYXRoKCIvb25lIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE9uZSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gIm9uZSI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJzdWIiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFN1YigpIHsKKyAgICAgICAgICAgIHJldHVybiAib25lLXN1YiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL3R3byIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUd28geworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJ0d28iOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZWxvYWRlciBleHRlbmRzIEFic3RyYWN0Q29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXIgeworICAgICAgICBDb250YWluZXIgY29udGFpbmVyOworCisgICAgICAgIHB1YmxpYyB2b2lkIHJlbG9hZChSZXNvdXJjZUNvbmZpZyBuZXdDb25maWcpIHsKKyAgICAgICAgICAgIGNvbnRhaW5lci5yZWxvYWQobmV3Q29uZmlnKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlbG9hZCgpIHsKKyAgICAgICAgICAgIGNvbnRhaW5lci5yZWxvYWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0dXAoQ29udGFpbmVyIGNvbnRhaW5lcikgeworICAgICAgICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWxvYWQoKSB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJjID0gbmV3IFJlc291cmNlQ29uZmlnKE9uZS5jbGFzcyk7CisKKyAgICAgICAgUmVsb2FkZXIgcmVsb2FkZXIgPSBuZXcgUmVsb2FkZXIoKTsKKyAgICAgICAgcmMucmVnaXN0ZXJJbnN0YW5jZXMocmVsb2FkZXIpOworCisgICAgICAgIHN0YXJ0U2VydmVyKHJjKTsKKworICAgICAgICBXZWJUYXJnZXQgciA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KCkudGFyZ2V0KGdldFVyaSgpLnBhdGgoIi8iKS5idWlsZCgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIm9uZSIsIHIucGF0aCgib25lIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJvbmUtc3ViIiwgci5wYXRoKCJvbmUvc3ViIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwNCwgci5wYXRoKCJ0d28iKS5yZXF1ZXN0KCkuZ2V0KFJlc3BvbnNlLmNsYXNzKS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgLy8gYWRkIFR3byByZXNvdXJjZQorICAgICAgICByZWxvYWRlci5yZWxvYWQobmV3IFJlc291cmNlQ29uZmlnKE9uZS5jbGFzcywgVHdvLmNsYXNzKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJvbmUiLCByLnBhdGgoIm9uZSIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygib25lLXN1YiIsIHIucGF0aCgib25lL3N1YiIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidHdvIiwgci5wYXRoKCJ0d28iKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBTdGFydFN0b3BMaXN0ZW5lciBleHRlbmRzIEFic3RyYWN0Q29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXIgeworICAgICAgICB2b2xhdGlsZSBib29sZWFuIHN0YXJ0ZWQ7CisgICAgICAgIHZvbGF0aWxlIGJvb2xlYW4gc3RvcHBlZDsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TdGFydHVwKENvbnRhaW5lciBjb250YWluZXIpIHsKKyAgICAgICAgICAgIHN0YXJ0ZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2h1dGRvd24oQ29udGFpbmVyIGNvbnRhaW5lcikgeworICAgICAgICAgICAgc3RvcHBlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFydHVwU2h1dGRvd25Ib29rcygpIHsKKyAgICAgICAgZmluYWwgU3RhcnRTdG9wTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgU3RhcnRTdG9wTGlzdGVuZXIoKTsKKworICAgICAgICBzdGFydFNlcnZlcihuZXcgUmVzb3VyY2VDb25maWcoT25lLmNsYXNzKS5yZWdpc3RlcihsaXN0ZW5lcikpOworCisgICAgICAgIFdlYlRhcmdldCByID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKS50YXJnZXQoZ2V0VXJpKCkucGF0aCgiLyIpLmJ1aWxkKCkpOworCisgICAgICAgIGFzc2VydFRoYXQoci5wYXRoKCJvbmUiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyksIGVxdWFsVG8oIm9uZSIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyLnBhdGgoInR3byIpLnJlcXVlc3QoKS5nZXQoUmVzcG9uc2UuY2xhc3MpLmdldFN0YXR1cygpLCBlcXVhbFRvKDQwNCkpOworCisgICAgICAgIHN0b3BTZXJ2ZXIoKTsKKworICAgICAgICBhc3NlcnRUcnVlKCJDb250YWluZXJMaWZlY3ljbGVMaXN0ZW5lci5vblN0YXJ0dXAgaGFzIG5vdCBiZWVuIGNhbGxlZC4iLCBsaXN0ZW5lci5zdGFydGVkKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQ29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXIub25TaHV0ZG93biBoYXMgbm90IGJlZW4gY2FsbGVkLiIsIGxpc3RlbmVyLnN0b3BwZWQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lcnMvamRrLWh0dHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGtodHRwL1J1bnRpbWVEZWxlZ2F0ZVRlc3QuamF2YSBiL2NvbnRhaW5lcnMvamRrLWh0dHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGtodHRwL1J1bnRpbWVEZWxlZ2F0ZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmFiZDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVycy9qZGstaHR0cC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pka2h0dHAvUnVudGltZURlbGVnYXRlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamRraHR0cDsKKworaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUnVudGltZURlbGVnYXRlOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworaW1wb3J0IGNvbS5zdW4ubmV0Lmh0dHBzZXJ2ZXIuSHR0cEhhbmRsZXI7CitpbXBvcnQgY29tLnN1bi5uZXQuaHR0cHNlcnZlci5IdHRwU2VydmVyOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgUnVudGltZURlbGVnYXRlVGVzdCB7CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiZ2V0IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZldGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEh0dHBTZXJ2ZXIgc2VydmVyID0gSHR0cFNlcnZlci5jcmVhdGUobmV3IEluZXRTb2NrZXRBZGRyZXNzKDApLCAwKTsKKyAgICAgICAgZmluYWwgSHR0cEhhbmRsZXIgaGFuZGxlciA9IFJ1bnRpbWVEZWxlZ2F0ZS5nZXRJbnN0YW5jZSgpLmNyZWF0ZUVuZHBvaW50KG5ldyBBcHBsaWNhdGlvbigpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy48Q2xhc3M8Pz4+c2luZ2xldG9uKFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwgSHR0cEhhbmRsZXIuY2xhc3MpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZXJ2ZXIuY3JlYXRlQ29udGV4dCgiLyIsIGhhbmRsZXIpOworICAgICAgICAgICAgc2VydmVyLnN0YXJ0KCk7CisKKyAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKQorICAgICAgICAgICAgICAgICAgICAudGFyZ2V0KFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdC8iKS5wb3J0KHNlcnZlci5nZXRBZGRyZXNzKCkuZ2V0UG9ydCgpKS5idWlsZCgpKQorICAgICAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgICAgIC5nZXQoKTsKKworICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGlzKCJnZXQiKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzZXJ2ZXIuc3RvcCgwKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lcnMvamRrLWh0dHAvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pka2h0dHAva2V5c3RvcmVfY2xpZW50IGIvY29udGFpbmVycy9qZGstaHR0cC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRraHR0cC9rZXlzdG9yZV9jbGllbnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAxNmZkMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lcnMvamRrLWh0dHAvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pka2h0dHAva2V5c3RvcmVfY2xpZW50CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRhaW5lcnMvamRrLWh0dHAvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pka2h0dHAva2V5c3RvcmVfc2VydmVyIGIvY29udGFpbmVycy9qZGstaHR0cC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamRraHR0cC9rZXlzdG9yZV9zZXJ2ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdjOTNmYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lcnMvamRrLWh0dHAvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pka2h0dHAva2V5c3RvcmVfc2VydmVyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRhaW5lcnMvamRrLWh0dHAvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pka2h0dHAvdHJ1c3RzdG9yZV9jbGllbnQgYi9jb250YWluZXJzL2pkay1odHRwL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGtodHRwL3RydXN0c3RvcmVfY2xpZW50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0Nzg0ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXJzL2pkay1odHRwL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGtodHRwL3RydXN0c3RvcmVfY2xpZW50CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRhaW5lcnMvamRrLWh0dHAvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pka2h0dHAvdHJ1c3RzdG9yZV9zZXJ2ZXIgYi9jb250YWluZXJzL2pkay1odHRwL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGtodHRwL3RydXN0c3RvcmVfc2VydmVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMjZjZTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXJzL2pkay1odHRwL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZGtodHRwL3RydXN0c3RvcmVfc2VydmVyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2NvbnRhaW5lcnMvamVyc2V5LXNlcnZsZXQtY29yZS9wb20ueG1sIGIvY29udGFpbmVycy9qZXJzZXktc2VydmxldC1jb3JlL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJjNTcwMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lcnMvamVyc2V5LXNlcnZsZXQtY29yZS9wb20ueG1sCkBAIC0wLDAgKzEsODYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldC1jb3JlPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+SmVyc2V5IGNvcmUgU2VydmxldCAyLnggaW1wbGVtZW50YXRpb248L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3NlcnZsZXQyLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnBlcnNpc3RlbmNlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGVyc2lzdGVuY2UtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5oazIuZXh0ZXJuYWw8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5pbmplY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4uaXN0YWNrPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWlzdGFjay1jb21tb25zLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5idWlsZC1oZWxwZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZmVsaXg8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYnVuZGxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KKyAgICAgICAgICAgICAgICA8ZXh0ZW5zaW9ucz50cnVlPC9leHRlbnNpb25zPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8aW5zdHJ1Y3Rpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBOb3RlOiBXaGVuIHlvdSdyZSBjaGFuZ2luZyB0aGVzZSBwcm9wZXJ0aWVzIGNoYW5nZSB0aGVtIGFsc28gaW4gYnVuZGxlcy9qYXgtcnMtcmkvYnVuZGxlL3BvbS54bWwuIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPEltcG9ydC1QYWNrYWdlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnBlcnNpc3RlbmNlLio7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXguc2VydmxldC4qO3ZlcnNpb249IlsyLjQsNS4wKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXguYW5ub3RhdGlvbi4qO3ZlcnNpb249ISwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICAgICAgICA8L0ltcG9ydC1QYWNrYWdlPgorICAgICAgICAgICAgICAgICAgICAgICAgPEV4cG9ydC1QYWNrYWdlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuKjwvRXhwb3J0LVBhY2thZ2U+CisgICAgICAgICAgICAgICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgorICAgICAgICAgICAgICAgICAgICA8dW5wYWNrQnVuZGxlPnRydWU8L3VucGFja0J1bmRsZT4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVycy9qZXJzZXktc2VydmxldC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmxldC9TZXJ2bGV0Q29udGFpbmVyLmphdmEgYi9jb250YWluZXJzL2plcnNleS1zZXJ2bGV0LWNvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2bGV0L1NlcnZsZXRDb250YWluZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTRmYzAwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVycy9qZXJzZXktc2VydmxldC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmxldC9TZXJ2bGV0Q29udGFpbmVyLmphdmEKQEAgLTAsMCArMSw2ODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm5TeW50YXhFeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlckV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ2hhaW47CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXJDb25maWc7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5Qcm92aWRlcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5FeHRlbmRlZExvZ2dlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uVmFsdWU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLkNvbnRhaW5lclV0aWxzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29udGFpbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LmludGVybmFsLlJlc3BvbnNlV3JpdGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuc3BpLkZpbHRlclVybE1hcHBpbmdzUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudXJpLlVyaUNvbXBvbmVudDsKKworLyoqCisgKiBBIHtAbGluayBqYXZheC5zZXJ2bGV0LlNlcnZsZXR9IG9yIHtAbGluayBGaWx0ZXJ9IGZvciBkZXBsb3lpbmcgcm9vdCByZXNvdXJjZSBjbGFzc2VzLgorICogPHAgLz4KKyAqIFRoZSBmb2xsb3dpbmcgc2VjdGlvbnMgbWFrZSByZWZlcmVuY2UgdG8gaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycy4gVW5sZXNzCisgKiBvdGhlcndpc2Ugc3BlY2lmaWVkIHRoZSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzIGFwcGx5IHRvIGJvdGggc2VydmVyCisgKiBhbmQgZmlsdGVyIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMuCisgKiA8cCAvPgorICogVGhlIHNlcnZsZXQgb3IgZmlsdGVyIG1heSBiZSBjb25maWd1cmVkIHRvIGhhdmUgYW4gaW5pdGlhbGl6YXRpb24KKyAqIHBhcmFtZXRlciB7QHZhbHVlIFNlcnZsZXRQcm9wZXJ0aWVzI0pBWFJTX0FQUExJQ0FUSU9OX0NMQVNTfQorICogKHNlZSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0UHJvcGVydGllcyNKQVhSU19BUFBMSUNBVElPTl9DTEFTU30pIGFuZCB3aG9zZSB2YWx1ZSBpcyBhCisgKiBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhIGNsYXNzIHRoYXQgaW1wbGVtZW50cyB7QGxpbmsgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbn0uCisgKiBUaGUgY2xhc3MgaXMgaW5zdGFudGlhdGVkIGFzIGEgc2luZ2xldG9uIGNvbXBvbmVudAorICogbWFuYWdlZCBieSB0aGUgcnVudGltZSwgYW5kIGluamVjdGlvbiBtYXkgYmUgcGVyZm9ybWVkICh0aGUgYXJ0aWZhY3RzIHRoYXQKKyAqIG1heSBiZSBpbmplY3RlZCBhcmUgbGltaXRlZCB0byBpbmplY3RhYmxlIHByb3ZpZGVycyByZWdpc3RlcmVkIHdoZW4KKyAqIHRoZSBzZXJ2bGV0IG9yIGZpbHRlciBpcyBjb25maWd1cmVkKS4KKyAqIDxwIC8+CisgKiBJZiB0aGUgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIHtAdmFsdWUgU2VydmxldFByb3BlcnRpZXMjSkFYUlNfQVBQTElDQVRJT05fQ0xBU1N9CisgKiBpcyBub3QgcHJlc2VudCBhbmQgYSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIge0B2YWx1ZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcyNQUk9WSURFUl9QQUNLQUdFU30KKyAqIGlzIHByZXNlbnQgKHNlZSB7QGxpbmsgU2VydmVyUHJvcGVydGllcyNQUk9WSURFUl9QQUNLQUdFU30pIGEgbmV3IGluc3RhbmNlIG9mCisgKiB7QGxpbmsgUmVzb3VyY2VDb25maWd9IHdpdGggdGhpcyBjb25maWd1cmF0aW9uIGlzIGNyZWF0ZWQuIFRoZSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIKKyAqIHtAdmFsdWUgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMjUFJPVklERVJfUEFDS0FHRVN9IE1VU1QgYmUgc2V0IHRvIHByb3ZpZGUgb25lIG9yCisgKiBtb3JlIHBhY2thZ2UgbmFtZXMuIEVhY2ggcGFja2FnZSBuYW1lIE1VU1QgYmUgc2VwYXJhdGVkIGJ5ICc7Jy4KKyAqIDxwIC8+CisgKiBJZiBub25lIG9mIHRoZSBhYm92ZSByZXNvdXJjZSBjb25maWd1cmF0aW9uIHJlbGF0ZWQgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycworICogYXJlIHByZXNlbnQgYSBuZXcgaW5zdGFuY2Ugb2Yge0BsaW5rIFJlc291cmNlQ29uZmlnfSB3aXRoIHtAbGluayBXZWJBcHBSZXNvdXJjZXNTY2FubmVyfQorICogaXMgY3JlYXRlZC4gVGhlIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciB7QHZhbHVlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzI1BST1ZJREVSX0NMQVNTUEFUSH0KKyAqIGlzIHByZXNlbnQgKHNlZSB7QGxpbmsgU2VydmVyUHJvcGVydGllcyNQUk9WSURFUl9DTEFTU1BBVEh9KSBNQVkgYmUKKyAqIHNldCB0byBwcm92aWRlIG9uZSBvciBtb3JlIHJlc291cmNlIHBhdGhzLiBFYWNoIHBhdGggTVVTVCBiZSBzZXBhcmF0ZWQgYnkgJzsnLgorICogSWYgdGhlIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciBpcyBub3QgcHJlc2VudCB0aGVuIHRoZSBmb2xsb3dpbmcgcmVzb3VyY2UKKyAqIHBhdGhzIGFyZSB1dGlsaXplZDoge0Bjb2RlICIvV0VCLUlORi9saWIifSBhbmQge0Bjb2RlICIvV0VCLUlORi9jbGFzc2VzIn0uCisgKiA8cCAvPgorICogQWxsIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgYXJlIGFkZGVkIGFzIHByb3BlcnRpZXMgb2YgdGhlIGNyZWF0ZWQKKyAqIHtAbGluayBSZXNvdXJjZUNvbmZpZ30uCisgKiA8cCAvPgorICogQSBuZXcge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXJ9IGluc3RhbmNlIHdpbGwgYmUgY3JlYXRlZCBhbmQgY29uZmlndXJlZCBzdWNoCisgKiB0aGF0IHRoZSBmb2xsb3dpbmcgY2xhc3NlcyBtYXkgYmUgaW5qZWN0ZWQgb250byBhIHJvb3QgcmVzb3VyY2UsIHByb3ZpZGVyCisgKiBhbmQge0BsaW5rIGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb259IGNsYXNzZXMgdXNpbmcge0BsaW5rIGphdmF4LndzLnJzLmNvcmUuQ29udGV4dAorICogJiM2NDtDb250ZXh0fSBhbm5vdGF0aW9uOgorICoge0BsaW5rIEh0dHBTZXJ2bGV0UmVxdWVzdH0sIHtAbGluayBIdHRwU2VydmxldFJlc3BvbnNlfSwKKyAqIHtAbGluayBTZXJ2bGV0Q29udGV4dH0sIHtAbGluayBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb25maWd9IGFuZCB7QGxpbmsgV2ViQ29uZmlnfS4KKyAqIElmIHRoaXMgY2xhc3MgaXMgdXNlZCBhcyBhIFNlcnZsZXQgdGhlbiB0aGUge0BsaW5rIGphdmF4LnNlcnZsZXQuU2VydmxldENvbmZpZ30gY2xhc3MgbWF5CisgKiBiZSBpbmplY3RlZC4gSWYgdGhpcyBjbGFzcyBpcyB1c2VkIGFzIGEgc2VydmxldCBmaWx0ZXIgdGhlbiB0aGUge0BsaW5rIEZpbHRlckNvbmZpZ30KKyAqIGNsYXNzIG1heSBiZSBpbmplY3RlZC4ge0BsaW5rIFdlYkNvbmZpZ30gbWF5IGJlIGluamVjdGVkIHRvIGFic3RyYWN0CisgKiBzZXJ2bGV0IG9yIGZpbHRlciBkZXBsb3ltZW50LgorICogPHAgLz4KKyAqIFBlcnNpc3RlbmNlIHVuaXRzIHRoYXQgbWF5IGJlIGluamVjdGVkIG11c3QgYmUgY29uZmlndXJlZCBpbiB3ZWIueG1sCisgKiBpbiB0aGUgbm9ybWFsIHdheSBwbHVzIGFuIGFkZGl0aW9uYWwgc2VydmxldCBwYXJhbWV0ZXIgdG8gZW5hYmxlIHRoZQorICogSmVyc2V5IHNlcnZsZXQgdG8gbG9jYXRlIHRoZW0gaW4gSk5ESS4gRS5nLiB3aXRoIHRoZSBmb2xsb3dpbmcKKyAqIHBlcnNpc3RlbmNlIHVuaXQgY29uZmlndXJhdGlvbjoKKyAqIDxwcmU+e0Bjb2RlCisgKiA8cGVyc2lzdGVuY2UtdW5pdC1yZWY+CisgKiAgICAgPHBlcnNpc3RlbmNlLXVuaXQtcmVmLW5hbWU+cGVyc2lzdGVuY2Uvd2lkZ2V0PC9wZXJzaXN0ZW5jZS11bml0LXJlZi1uYW1lPgorICogICAgIDxwZXJzaXN0ZW5jZS11bml0LW5hbWU+V2lkZ2V0UFU8L3BlcnNpc3RlbmNlLXVuaXQtbmFtZT4KKyAqIDwvcGVyc2lzdGVuY2UtdW5pdC1yZWY+CisgKiB9PC9wcmU+CisgKiB0aGUgSmVyc2V5IHNlcnZsZXQgcmVxdWlyZXMgYW4gYWRkaXRpb25hbCBzZXJ2bGV0IHBhcmFtZXRlciBhcworICogZm9sbG93czoKKyAqIDxwcmU+e0Bjb2RlCisgKiA8aW5pdC1wYXJhbT4KKyAqICAgICA8cGFyYW0tbmFtZT51bml0OldpZGdldFBVPC9wYXJhbS1uYW1lPgorICogICAgIDxwYXJhbS12YWx1ZT5wZXJzaXN0ZW5jZS93aWRnZXQ8L3BhcmFtLXZhbHVlPgorICogPC9pbml0LXBhcmFtPgorICogfTwvcHJlPgorICogR2l2ZW4gdGhlIGFib3ZlLCBKZXJzZXkgd2lsbCBpbmplY3QgdGhlIHtAbGluayBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHlNYW5hZ2VyRmFjdG9yeSBFbnRpdHlNYW5hZ2VyRmFjdG9yeX0gZm91bmQKKyAqIGF0IHtAY29kZSBqYXZhOmNvbXAvZW52L3BlcnNpc3RlbmNlL3dpZGdldH0gaW4gSk5ESSB3aGVuIGVuY291bnRlcmluZyBhCisgKiBmaWVsZCBvciBwYXJhbWV0ZXIgYW5ub3RhdGVkIHdpdGgge0Bjb2RlIEBQZXJzaXN0ZW5jZVVuaXQodW5pdE5hbWU9IldpZGdldFBVIil9LgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBTZXJ2bGV0Q29udGFpbmVyIGV4dGVuZHMgSHR0cFNlcnZsZXQgaW1wbGVtZW50cyBGaWx0ZXIsIENvbnRhaW5lciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzOTMyMDQ3MDY2Njg2MDY1MjE5TDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBFeHRlbmRlZExvZ2dlciBMT0dHRVIgPQorICAgICAgICAgICAgbmV3IEV4dGVuZGVkTG9nZ2VyKExvZ2dlci5nZXRMb2dnZXIoU2VydmxldENvbnRhaW5lci5jbGFzcy5nZXROYW1lKCkpLCBMZXZlbC5GSU5FU1QpOworCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgRmlsdGVyQ29uZmlnIGZpbHRlckNvbmZpZzsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBXZWJDb21wb25lbnQgd2ViQ29tcG9uZW50OworICAgIHByaXZhdGUgdHJhbnNpZW50IFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnOworICAgIHByaXZhdGUgdHJhbnNpZW50IFBhdHRlcm4gc3RhdGljQ29udGVudFBhdHRlcm47CisgICAgcHJpdmF0ZSB0cmFuc2llbnQgU3RyaW5nIGZpbHRlckNvbnRleHRQYXRoOworICAgIHByaXZhdGUgdHJhbnNpZW50IExpc3Q8U3RyaW5nPiBmaWx0ZXJVcmxNYXBwaW5nczsKKworICAgIHByaXZhdGUgdHJhbnNpZW50IHZvbGF0aWxlIENvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyIGNvbnRhaW5lckxpc3RlbmVyOworCisgICAgLyoqCisgICAgICogSW5pdGlhdGUgdGhlIFdlYiBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd2ViQ29uZmlnIHRoZSBXZWIgY29uZmlndXJhdGlvbi4KKyAgICAgKiBAdGhyb3dzIGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGFuIGluaXRpYWxpemF0aW9uIGZhaWx1cmUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBpbml0KGZpbmFsIFdlYkNvbmZpZyB3ZWJDb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgd2ViQ29tcG9uZW50ID0gbmV3IFdlYkNvbXBvbmVudCh3ZWJDb25maWcsIHJlc291cmNlQ29uZmlnKTsKKyAgICAgICAgY29udGFpbmVyTGlzdGVuZXIgPSB3ZWJDb21wb25lbnQuYXBwSGFuZGxlcjsKKyAgICAgICAgY29udGFpbmVyTGlzdGVuZXIub25TdGFydHVwKHRoaXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBKZXJzZXkgU2VydmxldCBjb250YWluZXIuCisgICAgICovCisgICAgcHVibGljIFNlcnZsZXRDb250YWluZXIoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIEplcnNleSBTZXJ2bGV0IGNvbnRhaW5lci4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZUNvbmZpZyBjb250YWluZXIgY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2VydmxldENvbnRhaW5lcihmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZykgeworICAgICAgICB0aGlzLnJlc291cmNlQ29uZmlnID0gcmVzb3VyY2VDb25maWc7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGlzcGF0Y2hlcyBjbGllbnQgcmVxdWVzdHMgdG8gdGhlIHByb3RlY3RlZAorICAgICAqIHtAY29kZSBzZXJ2aWNlfSBtZXRob2QuIFRoZXJlJ3Mgbm8gbmVlZCB0bworICAgICAqIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcSB0aGUge0BsaW5rIEh0dHBTZXJ2bGV0UmVxdWVzdH0gb2JqZWN0IHRoYXQKKyAgICAgKiAgICAgICAgICAgIGNvbnRhaW5zIHRoZSByZXF1ZXN0IHRoZSBjbGllbnQgbWFkZSBvZgorICAgICAqICAgICAgICAgICAgdGhlIHNlcnZsZXQKKyAgICAgKiBAcGFyYW0gcmVzIHRoZSB7QGxpbmsgSHR0cFNlcnZsZXRSZXNwb25zZX0gb2JqZWN0IHRoYXQKKyAgICAgKiAgICAgICAgICAgIGNvbnRhaW5zIHRoZSByZXNwb25zZSB0aGUgc2VydmxldCByZXR1cm5zCisgICAgICogICAgICAgICAgICB0byB0aGUgY2xpZW50CisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAgICAgIGlmIGFuIGlucHV0IG9yIG91dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgdGhlIHNlcnZsZXQgaXMgaGFuZGxpbmcgdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFAgcmVxdWVzdAorICAgICAqIEB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiBpZiB0aGUgSFRUUCByZXF1ZXN0IGNhbm5vdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBoYW5kbGVkCisgICAgICogQHNlZSBqYXZheC5zZXJ2bGV0LlNlcnZsZXQjc2VydmljZQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNlcnZpY2UoZmluYWwgU2VydmxldFJlcXVlc3QgcmVxLCBmaW5hbCBTZXJ2bGV0UmVzcG9uc2UgcmVzKQorICAgICAgICAgICAgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3Q7CisgICAgICAgIGZpbmFsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2U7CisKKyAgICAgICAgaWYgKCEocmVxIGluc3RhbmNlb2YgSHR0cFNlcnZsZXRSZXF1ZXN0ICYmIHJlcyBpbnN0YW5jZW9mIEh0dHBTZXJ2bGV0UmVzcG9uc2UpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbigibm9uLUhUVFAgcmVxdWVzdCBvciByZXNwb25zZSIpOworICAgICAgICB9CisKKyAgICAgICAgcmVxdWVzdCA9IChIdHRwU2VydmxldFJlcXVlc3QpIHJlcTsKKyAgICAgICAgcmVzcG9uc2UgPSAoSHR0cFNlcnZsZXRSZXNwb25zZSkgcmVzOworCisgICAgICAgIHNlcnZpY2UocmVxdWVzdCwgcmVzcG9uc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlY2VpdmVzIHN0YW5kYXJkIEhUVFAgcmVxdWVzdHMgZnJvbSB0aGUgcHVibGljIHtAY29kZSBzZXJ2aWNlfSBtZXRob2QgYW5kIGRpc3BhdGNoZXMKKyAgICAgKiB0aGVtIHRvIHRoZSB7QGNvZGUgZG99PGk+WFhYPC9pPiBtZXRob2RzIGRlZmluZWQgaW4KKyAgICAgKiB0aGlzIGNsYXNzLiBUaGlzIG1ldGhvZCBpcyBhbiBIVFRQLXNwZWNpZmljIHZlcnNpb24gb2YgdGhlCisgICAgICoge0BsaW5rIGphdmF4LnNlcnZsZXQuU2VydmxldCNzZXJ2aWNlfSBtZXRob2QuIFRoZXJlJ3Mgbm8KKyAgICAgKiBuZWVkIHRvIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgIHRoZSB7QGxpbmsgSHR0cFNlcnZsZXRSZXF1ZXN0fSBvYmplY3QgdGhhdAorICAgICAqICAgICAgICAgICAgICAgICBjb250YWlucyB0aGUgcmVxdWVzdCB0aGUgY2xpZW50IG1hZGUgb2YKKyAgICAgKiAgICAgICAgICAgICAgICAgdGhlIHNlcnZsZXQKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgdGhlIHtAbGluayBIdHRwU2VydmxldFJlc3BvbnNlfSBvYmplY3QgdGhhdAorICAgICAqICAgICAgICAgICAgICAgICBjb250YWlucyB0aGUgcmVzcG9uc2UgdGhlIHNlcnZsZXQgcmV0dXJucworICAgICAqICAgICAgICAgICAgICAgICB0byB0aGUgY2xpZW50CisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAgICAgIGlmIGFuIGlucHV0IG9yIG91dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgdGhlIHNlcnZsZXQgaXMgaGFuZGxpbmcgdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFAgcmVxdWVzdAorICAgICAqIEB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiBpZiB0aGUgSFRUUCByZXF1ZXN0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGNhbm5vdCBiZSBoYW5kbGVkCisgICAgICogQHNlZSBqYXZheC5zZXJ2bGV0LlNlcnZsZXQjc2VydmljZQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHNlcnZpY2UoZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIGZpbmFsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpCisgICAgICAgICAgICB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICAvKioKKyAgICAgICAgICogVGhlcmUgaXMgYW4gYW5ub3lpbmcgZWRnZSBjYXNlIHdoZXJlIHRoZSBzZXJ2aWNlIG1ldGhvZCBpcworICAgICAgICAgKiBpbnZva2VkIGZvciB0aGUgY2FzZSB3aGVuIHRoZSBVUkkgaXMgZXF1YWwgdG8gdGhlIGRlcGxveW1lbnQgVVJMCisgICAgICAgICAqIG1pbnVzIHRoZSAnLycsIGZvciBleGFtcGxlIGh0dHA6Ly9sb2NhaG9zdDo4MDgwL0hlbGxvV29ybGRXZWJBcHAKKyAgICAgICAgICovCisgICAgICAgIGZpbmFsIFN0cmluZyBzZXJ2bGV0UGF0aCA9IHJlcXVlc3QuZ2V0U2VydmxldFBhdGgoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nQnVmZmVyIHJlcXVlc3RVcmwgPSByZXF1ZXN0LmdldFJlcXVlc3RVUkwoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlcXVlc3RVUkkgPSByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKworICAgICAgICAvLyAgICAgICAgZmluYWwgU3RyaW5nIHBhdGhJbmZvID0gcmVxdWVzdC5nZXRQYXRoSW5mbygpOworICAgICAgICAvLyAgICAgICAgZmluYWwgYm9vbGVhbiBjaGVja1BhdGhJbmZvID0gcGF0aEluZm8gPT0gbnVsbCB8fCBwYXRoSW5mby5pc0VtcHR5KCkgfHwgcGF0aEluZm8uZXF1YWxzKCIvIik7CisgICAgICAgIC8vICAgICAgICBpZiAoY2hlY2tQYXRoSW5mbyAmJiAhcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkuZW5kc1dpdGgoIi8iKSkgeworICAgICAgICAvLyBPbmx5IGRvIHRoaXMgaWYgdGhlIGxhc3Qgc2VnbWVudCBvZiB0aGUgc2VydmxldCBwYXRoIGRvZXMgbm90IGNvbnRhaW4gJy4nCisgICAgICAgIC8vIFRoaXMgaGFuZGxlcyB0aGUgY2FzZSB3aGVuIHRoZSBleHRlbnNpb24gbWFwcGluZyBpcyB1c2VkIHdpdGggdGhlIHNlcnZsZXQKKyAgICAgICAgLy8gc2VlIGlzc3VlIDUwNgorICAgICAgICAvLyBUaGlzIHNvbHV0aW9uIGRvZXMgbm90IHJlcXVpcmUgcGFyc2luZyB0aGUgZGVwbG95bWVudCBkZXNjcmlwdG9yLAorICAgICAgICAvLyBob3dldmVyIHN0aWxsIGxlYXZlcyBpdCBicm9rZW4gZm9yIHRoZSB2ZXJ5IHJhcmUgY2FzZSBpZiBhIHN0YW5kYXJkIHBhdGgKKyAgICAgICAgLy8gc2VydmxldCBtYXBwaW5nIHdvdWxkIGluY2x1ZGUgZG90IGluIHRoZSBsYXN0IHNlZ21lbnQgKGUuZy4gLy53ZWJyZXNvdXJjZXMvKikKKyAgICAgICAgLy8gYW5kIHNvbWVib2R5IHdvdWxkIHdhbnQgdG8gaGl0IHRoZSByb290IHJlc291cmNlIHdpdGhvdXQgdGhlIHRyYWlsaW5nIHNsYXNoCisgICAgICAgIC8vICAgICAgICAgICAgZmluYWwgaW50IGkgPSBzZXJ2bGV0UGF0aC5sYXN0SW5kZXhPZignLycpOworICAgICAgICAvLyAgICAgICAgICAgIGlmIChzZXJ2bGV0UGF0aC5zdWJzdHJpbmcoaSArIDEpLmluZGV4T2YoJy4nKSA8IDApIHsKKyAgICAgICAgLy8gVE9ETyAoKyBoYW5kbGUgcmVxdWVzdCBVUkwgd2l0aCBpbnZhbGlkIGNoYXJhY3RlcnMgLSBzZWUgdGhlIGNyZWF0aW9uIG9mIGFic29sdXRlVXJpQnVpbGRlciBiZWxvdykKKyAgICAgICAgLy8gICAgICAgICAgICAgICAgaWYgKHdlYkNvbXBvbmVudC5nZXRSZXNvdXJjZUNvbmZpZygpLmdldEZlYXR1cmUoUmVzb3VyY2VDb25maWcuRkVBVFVSRV9SRURJUkVDVCkpIHsKKyAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgIFVSSSBsID0gVXJpQnVpbGRlci5mcm9tVXJpKHJlcXVlc3QuZ2V0UmVxdWVzdFVSTCgpLnRvU3RyaW5nKCkpLgorICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoKCIvIikuCisgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VRdWVyeShyZXF1ZXN0LmdldFF1ZXJ5U3RyaW5nKCkpLmJ1aWxkKCk7CisgICAgICAgIC8vCisgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoMzA3KTsKKyAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldEhlYWRlcigiTG9jYXRpb24iLCBsLnRvQVNDSUlTdHJpbmcoKSk7CisgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIC8vICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vICAgICAgICAgICAgICAgIHBhdGhJbmZvID0gIi8iOworICAgICAgICAvLyAgICAgICAgICAgICAgICByZXF1ZXN0VVJMLmFwcGVuZCgiLyIpOworICAgICAgICAvLyAgICAgICAgICAgICAgICByZXF1ZXN0VVJJICs9ICIvIjsKKyAgICAgICAgLy8gICAgICAgICAgICAgICAgfQorICAgICAgICAvLyAgICAgICAgICAgIH0KKyAgICAgICAgLy8gICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIEh0dHBTZXJ2bGV0UmVxdWVzdC5nZXRSZXF1ZXN0VVJMKCkgY29udGFpbnMgdGhlIGNvbXBsZXRlIFVSSQorICAgICAgICAgKiBtaW51cyB0aGUgcXVlcnkgYW5kIGZyYWdtZW50IGNvbXBvbmVudHMuCisgICAgICAgICAqLworICAgICAgICBmaW5hbCBVcmlCdWlsZGVyIGFic29sdXRlVXJpQnVpbGRlcjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFic29sdXRlVXJpQnVpbGRlciA9IFVyaUJ1aWxkZXIuZnJvbVVyaShyZXF1ZXN0VXJsLnRvU3RyaW5nKCkpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7CisgICAgICAgICAgICBzZXRSZXNwb25zZUZvckludmFsaWRVcmkocmVzcG9uc2UsIGlhZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIEh0dHBTZXJ2bGV0UmVxdWVzdC5nZXRQYXRoSW5mbygpIGFuZAorICAgICAgICAgKiBIdHRwU2VydmxldFJlcXVlc3QuZ2V0U2VydmxldFBhdGgoKSBhcmUgaW4gZGVjb2RlZCBmb3JtLgorICAgICAgICAgKgorICAgICAgICAgKiBPbiBzb21lIHNlcnZsZXQgaW1wbGVtZW50YXRpb25zIHRoZSBnZXRQYXRoSW5mbygpIHJlbW92ZWQKKyAgICAgICAgICogY29udGlndW91cyAnLycgY2hhcmFjdGVycy4gVGhpcyBpcyBwcm9ibGVtYXRpYyBpZiBVUklzCisgICAgICAgICAqIGFyZSBlbWJlZGRlZCwgZm9yIGV4YW1wbGUgYXMgdGhlIGxhc3QgcGF0aCBzZWdtZW50LgorICAgICAgICAgKiBXZSBuZWVkIHRvIHdvcmsgYXJvdW5kIHRoaXMgYW5kIG5vdCB1c2UgZ2V0UGF0aEluZm8KKyAgICAgICAgICogZm9yIHRoZSBkZWNvZGVkUGF0aC4KKyAgICAgICAgICovCisgICAgICAgIGZpbmFsIFN0cmluZyBkZWNvZGVkQmFzZVBhdGggPSByZXF1ZXN0LmdldENvbnRleHRQYXRoKCkgKyBzZXJ2bGV0UGF0aCArICIvIjsKKworICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZEJhc2VQYXRoID0gVXJpQ29tcG9uZW50LmVuY29kZShkZWNvZGVkQmFzZVBhdGgsCisgICAgICAgICAgICAgICAgVXJpQ29tcG9uZW50LlR5cGUuUEFUSCk7CisKKyAgICAgICAgaWYgKCFkZWNvZGVkQmFzZVBhdGguZXF1YWxzKGVuY29kZWRCYXNlUGF0aCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKCJUaGUgc2VydmxldCBjb250ZXh0IHBhdGggYW5kL29yIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICsgInNlcnZsZXQgcGF0aCBjb250YWluIGNoYXJhY3RlcnMgdGhhdCBhcmUgcGVyY2VudCBlbmNvZGVkIik7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBVUkkgYmFzZVVyaTsKKyAgICAgICAgZmluYWwgVVJJIHJlcXVlc3RVcmk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBiYXNlVXJpID0gYWJzb2x1dGVVcmlCdWlsZGVyLnJlcGxhY2VQYXRoKGVuY29kZWRCYXNlUGF0aCkuYnVpbGQoKTsKKyAgICAgICAgICAgIFN0cmluZyBxdWVyeVBhcmFtZXRlcnMgPSBDb250YWluZXJVdGlscy5lbmNvZGVVbnNhZmVDaGFyYWN0ZXJzKHJlcXVlc3QuZ2V0UXVlcnlTdHJpbmcoKSk7CisgICAgICAgICAgICBpZiAocXVlcnlQYXJhbWV0ZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBxdWVyeVBhcmFtZXRlcnMgPSAiIjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVxdWVzdFVyaSA9IGFic29sdXRlVXJpQnVpbGRlci5yZXBsYWNlUGF0aChyZXF1ZXN0VVJJKQorICAgICAgICAgICAgICAgICAgICAucmVwbGFjZVF1ZXJ5KHF1ZXJ5UGFyYW1ldGVycykKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFVyaUJ1aWxkZXJFeGNlcHRpb24gfCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHNldFJlc3BvbnNlRm9ySW52YWxpZFVyaShyZXNwb25zZSwgZXgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgc2VydmljZShiYXNlVXJpLCByZXF1ZXN0VXJpLCByZXF1ZXN0LCByZXNwb25zZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldFJlc3BvbnNlRm9ySW52YWxpZFVyaShmaW5hbCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBmaW5hbCBUaHJvd2FibGUgdGhyb3dhYmxlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBMT0dHRVIubG9nKExldmVsLkZJTkVSLCAiRXJyb3Igd2hpbGUgcHJvY2Vzc2luZyByZXF1ZXN0LiIsIHRocm93YWJsZSk7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UuU3RhdHVzIGJhZFJlcXVlc3QgPSBSZXNwb25zZS5TdGF0dXMuQkFEX1JFUVVFU1Q7CisgICAgICAgIGlmICh3ZWJDb21wb25lbnQuY29uZmlnU2V0U3RhdHVzT3ZlclNlbmRFcnJvcikgeworICAgICAgICAgICAgcmVzcG9uc2UucmVzZXQoKTsKKyAgICAgICAgICAgIC8vbm9pbnNwZWN0aW9uIGRlcHJlY2F0aW9uCisgICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoYmFkUmVxdWVzdC5nZXRTdGF0dXNDb2RlKCksIGJhZFJlcXVlc3QuZ2V0UmVhc29uUGhyYXNlKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKGJhZFJlcXVlc3QuZ2V0U3RhdHVzQ29kZSgpLCBiYWRSZXF1ZXN0LmdldFJlYXNvblBocmFzZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CisgICAgICAgIHN1cGVyLmRlc3Ryb3koKTsKKworICAgICAgICBmaW5hbCBDb250YWluZXJMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lciA9IGNvbnRhaW5lckxpc3RlbmVyOworICAgICAgICBpZiAobGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbGlzdGVuZXIub25TaHV0ZG93bih0aGlzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGluaXQoKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXQobmV3IFdlYlNlcnZsZXRDb25maWcodGhpcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc3BhdGNoIGNsaWVudCByZXF1ZXN0cyB0byBhIHJlc291cmNlIGNsYXNzLgorICAgICAqCisgICAgICogQHBhcmFtIGJhc2VVcmkgICAgdGhlIGJhc2UgVVJJIG9mIHRoZSByZXF1ZXN0LgorICAgICAqIEBwYXJhbSByZXF1ZXN0VXJpIHRoZSBVUkkgb2YgdGhlIHJlcXVlc3QuCisgICAgICogQHBhcmFtIHJlcXVlc3QgICAgdGhlIHtAbGluayBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0fSBvYmplY3QgdGhhdCBjb250YWlucyB0aGUgcmVxdWVzdCB0aGUgY2xpZW50IG1hZGUgdG8KKyAgICAgKiAgICAgICAgICAgICAgICAgICB0aGUgV2ViIGNvbXBvbmVudC4KKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgICB0aGUge0BsaW5rIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlfSBvYmplY3QgdGhhdCBjb250YWlucyB0aGUgcmVzcG9uc2UgdGhlIFdlYiBjb21wb25lbnQKKyAgICAgKiAgICAgICAgICAgICAgICAgICByZXR1cm5zIHRvIHRoZSBjbGllbnQuCisgICAgICogQHJldHVybiBsYXppbHkgaW5pdGlhbGl6ZWQgcmVzcG9uc2Ugc3RhdHVzIGNvZGUge0BsaW5rIFZhbHVlIHZhbHVlIHByb3ZpZGVyfS4gSWYgbm90IHJlc29sdmVkIGluIHRoZSBtb21lbnQgb2YgY2FsbCB0bworICAgICAqIHtAbGluayBWYWx1ZSNnZXQoKX0sIHtAY29kZSAtMX0gaXMgcmV0dXJuZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAgICAgIGlmIGFuIGlucHV0IG9yIG91dHB1dCBlcnJvciBvY2N1cnMgd2hpbGUgdGhlIFdlYiBjb21wb25lbnQgaXMgaGFuZGxpbmcgdGhlIEhUVFAgcmVxdWVzdC4KKyAgICAgKiBAdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24gaWYgdGhlIEhUVFAgcmVxdWVzdCBjYW5ub3QgYmUgaGFuZGxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVmFsdWU8SW50ZWdlcj4gc2VydmljZShmaW5hbCBVUkkgYmFzZVVyaSwgZmluYWwgVVJJIHJlcXVlc3RVcmksIGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiB3ZWJDb21wb25lbnQuc2VydmljZShiYXNlVXJpLCByZXF1ZXN0VXJpLCByZXF1ZXN0LCByZXNwb25zZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGlzcGF0Y2ggY2xpZW50IHJlcXVlc3RzIHRvIGEgcmVzb3VyY2UgY2xhc3MgYW5kIHJldHVybnMge0BsaW5rIFJlc3BvbnNlV3JpdGVyfSwKKyAgICAgKiBTZXJ2bGV0J3Mge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29udGFpbmVyUmVzcG9uc2VXcml0ZXJ9IGltcGxlbWVudGF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGJhc2VVcmkgICAgdGhlIGJhc2UgVVJJIG9mIHRoZSByZXF1ZXN0LgorICAgICAqIEBwYXJhbSByZXF1ZXN0VXJpIHRoZSBVUkkgb2YgdGhlIHJlcXVlc3QuCisgICAgICogQHBhcmFtIHJlcXVlc3QgICAgdGhlIHtAbGluayBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0fSBvYmplY3QgdGhhdCBjb250YWlucyB0aGUgcmVxdWVzdCB0aGUgY2xpZW50IG1hZGUgdG8KKyAgICAgKiAgICAgICAgICAgICAgICAgICB0aGUgV2ViIGNvbXBvbmVudC4KKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgICB0aGUge0BsaW5rIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlfSBvYmplY3QgdGhhdCBjb250YWlucyB0aGUgcmVzcG9uc2UgdGhlIFdlYiBjb21wb25lbnQKKyAgICAgKiAgICAgICAgICAgICAgICAgICByZXR1cm5zIHRvIHRoZSBjbGllbnQuCisgICAgICogQHJldHVybiByZXR1cm5zIHtAbGluayBSZXNwb25zZVdyaXRlcn0sIFNlcnZsZXQncyB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5Db250YWluZXJSZXNwb25zZVdyaXRlcn0KKyAgICAgKiAgICAgICAgIGltcGxlbWVudGF0aW9uLCBpbnRvIHdoaWNoIHByb2Nlc3NlZCByZXF1ZXN0IHJlc3BvbnNlIHdhcyB3cml0dGVuIHRvLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gICAgICBpZiBhbiBpbnB1dCBvciBvdXRwdXQgZXJyb3Igb2NjdXJzIHdoaWxlIHRoZSBXZWIgY29tcG9uZW50IGlzIGhhbmRsaW5nIHRoZSBIVFRQIHJlcXVlc3QuCisgICAgICogQHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIGlmIHRoZSBIVFRQIHJlcXVlc3QgY2Fubm90IGJlIGhhbmRsZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBSZXNwb25zZVdyaXRlciBzZXJ2aWNlSW1wbChmaW5hbCBVUkkgYmFzZVVyaSwgZmluYWwgVVJJIHJlcXVlc3RVcmksIGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHdlYkNvbXBvbmVudC5zZXJ2aWNlSW1wbChiYXNlVXJpLCByZXF1ZXN0VXJpLCByZXF1ZXN0LCByZXNwb25zZSk7CisgICAgfQorCisgICAgLy8gRmlsdGVyCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaW5pdChmaW5hbCBGaWx0ZXJDb25maWcgZmlsdGVyQ29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMuZmlsdGVyQ29uZmlnID0gZmlsdGVyQ29uZmlnOworICAgICAgICBpbml0KG5ldyBXZWJGaWx0ZXJDb25maWcoZmlsdGVyQ29uZmlnKSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlZ2V4ID0gKFN0cmluZykgZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnR5KFNlcnZsZXRQcm9wZXJ0aWVzLkZJTFRFUl9TVEFUSUNfQ09OVEVOVF9SRUdFWCk7CisgICAgICAgIGlmIChyZWdleCAhPSBudWxsICYmICFyZWdleC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3RhdGljQ29udGVudFBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUocmVnZXgpOworICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgUGF0dGVyblN5bnRheEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb250YWluZXJFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuSU5JVF9QQVJBTV9SRUdFWF9TWU5UQVhfSU5WQUxJRCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2V4LCBTZXJ2bGV0UHJvcGVydGllcy5GSUxURVJfU1RBVElDX0NPTlRFTlRfUkVHRVgpLCBleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmZpbHRlckNvbnRleHRQYXRoID0gZmlsdGVyQ29uZmlnLmdldEluaXRQYXJhbWV0ZXIoU2VydmxldFByb3BlcnRpZXMuRklMVEVSX0NPTlRFWFRfUEFUSCk7CisgICAgICAgIGlmIChmaWx0ZXJDb250ZXh0UGF0aCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoZmlsdGVyQ29udGV4dFBhdGguaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgZmlsdGVyQ29udGV4dFBhdGggPSBudWxsOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoIWZpbHRlckNvbnRleHRQYXRoLnN0YXJ0c1dpdGgoIi8iKSkgeworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJDb250ZXh0UGF0aCA9ICcvJyArIGZpbHRlckNvbnRleHRQYXRoOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZmlsdGVyQ29udGV4dFBhdGguZW5kc1dpdGgoIi8iKSkgeworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJDb250ZXh0UGF0aCA9IGZpbHRlckNvbnRleHRQYXRoLnN1YnN0cmluZygwLCBmaWx0ZXJDb250ZXh0UGF0aC5sZW5ndGgoKSAtIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGdldCB0aGUgdXJsLXBhdHRlcm4gZGVmaW5lZCAoZS5nLikgaW4gdGhlIGZpbHRlci1tYXBwaW5nIHNlY3Rpb24gb2Ygd2ViLnhtbAorICAgICAgICBmaW5hbCBGaWx0ZXJVcmxNYXBwaW5nc1Byb3ZpZGVyIGZpbHRlclVybE1hcHBpbmdzUHJvdmlkZXIgPSBnZXRGaWx0ZXJVcmxNYXBwaW5nc1Byb3ZpZGVyKCk7CisgICAgICAgIGlmIChmaWx0ZXJVcmxNYXBwaW5nc1Byb3ZpZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbHRlclVybE1hcHBpbmdzID0gZmlsdGVyVXJsTWFwcGluZ3NQcm92aWRlci5nZXRGaWx0ZXJVcmxNYXBwaW5ncyhmaWx0ZXJDb25maWcpOworICAgICAgICB9CisKKyAgICAgICAgLy8gd2UgbmVlZCBlaXRoZXIgdGhlIHVybC1wYXR0ZXJuIGZyb20gdGhlIGZpbHRlciBtYXBwaW5nIChpbiBjYXNlIG9mIFNlcnZsZXQgMykgb3Igc3BlY2lmaWMgaW5pdC1wYXJhbSB0bworICAgICAgICAvLyBkZXRlcm1pbmUgdGhlIGJhc2VVcmkgYW5kIHJlcXVlc3QgcmVsYXRpdmUgVVJJLiBJZiB3ZSBkbyBub3QgaGF2ZSBlaXRoZXIgb25lLCB0aGUgYXBwIHdpbGwgbW9zdCBsaWtlbHkKKyAgICAgICAgLy8gbm90IHdvcmsgKHdvbid0IGJlIGFjY2Vzc2libGUpCisgICAgICAgIGlmIChmaWx0ZXJVcmxNYXBwaW5ncyA9PSBudWxsICYmIGZpbHRlckNvbnRleHRQYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIExPR0dFUi53YXJuaW5nKExvY2FsaXphdGlvbk1lc3NhZ2VzLkZJTFRFUl9DT05URVhUX1BBVEhfTUlTU0lORygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRvRmlsdGVyKGZpbmFsIFNlcnZsZXRSZXF1ZXN0IHNlcnZsZXRSZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNlcnZsZXRSZXNwb25zZSBzZXJ2bGV0UmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsdGVyQ2hhaW4gZmlsdGVyQ2hhaW4pCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgZG9GaWx0ZXIoKEh0dHBTZXJ2bGV0UmVxdWVzdCkgc2VydmxldFJlcXVlc3QsIChIdHRwU2VydmxldFJlc3BvbnNlKSBzZXJ2bGV0UmVzcG9uc2UsIGZpbHRlckNoYWluKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKCJub24tSFRUUCByZXF1ZXN0IG9yIHJlc3BvbnNlIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHNlcnZsZXQgY29udGV4dCBmb3IgdGhlIHNlcnZsZXQgb3IgZmlsdGVyLCBkZXBlbmRpbmcgb24KKyAgICAgKiBob3cgdGhpcyBjbGFzcyBpcyByZWdpc3RlcmVkLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgc2VydmxldCBjb250ZXh0IGZvciB0aGUgc2VydmxldCBvciBmaWx0ZXIuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNlcnZsZXRDb250ZXh0IGdldFNlcnZsZXRDb250ZXh0KCkgeworICAgICAgICBpZiAoZmlsdGVyQ29uZmlnICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmaWx0ZXJDb25maWcuZ2V0U2VydmxldENvbnRleHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzdXBlci5nZXRTZXJ2bGV0Q29udGV4dCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc3BhdGNoZXMgY2xpZW50IHJlcXVlc3RzIHRvIHRoZQorICAgICAqIHtAbGluayAjc2VydmljZShVUkksIFVSSSwgSHR0cFNlcnZsZXRSZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlKX0gbWV0aG9kLgorICAgICAqIDxwIC8+CisgICAgICogSWYgdGhlIHNlcnZsZXQgcGF0aCBtYXRjaGVzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gZGVjbGFyZWQgYnkgdGhlCisgICAgICogcHJvcGVydHkge0BsaW5rIFNlcnZsZXRQcm9wZXJ0aWVzI0ZJTFRFUl9TVEFUSUNfQ09OVEVOVF9SRUdFWH0gdGhlbiB0aGUKKyAgICAgKiByZXF1ZXN0IGlzIGZvcndhcmRlZCB0byB0aGUgbmV4dCBmaWx0ZXIgaW4gdGhlIGZpbHRlciBjaGFpbiBzbyB0aGF0IHRoZQorICAgICAqIHVuZGVybHlpbmcgc2VydmxldCBlbmdpbmUgY2FuIHByb2Nlc3MgdGhlIHJlcXVlc3Qgb3RoZXJ3aXNlIEplcnNleQorICAgICAqIHdpbGwgcHJvY2VzcyB0aGUgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0ICB0aGUge0BsaW5rIEh0dHBTZXJ2bGV0UmVxdWVzdH0gb2JqZWN0IHRoYXQKKyAgICAgKiAgICAgICAgICAgICAgICAgY29udGFpbnMgdGhlIHJlcXVlc3QgdGhlIGNsaWVudCBtYWRlIHRvCisgICAgICogICAgICAgICAgICAgICAgIHRoZSBzZXJ2bGV0LgorICAgICAqIEBwYXJhbSByZXNwb25zZSB0aGUge0BsaW5rIEh0dHBTZXJ2bGV0UmVzcG9uc2V9IG9iamVjdCB0aGF0CisgICAgICogICAgICAgICAgICAgICAgIGNvbnRhaW5zIHRoZSByZXNwb25zZSB0aGUgc2VydmxldCByZXR1cm5zCisgICAgICogICAgICAgICAgICAgICAgIHRvIHRoZSBjbGllbnQuCisgICAgICogQHBhcmFtIGNoYWluICAgIHRoZSBjaGFpbiBvZiBmaWx0ZXJzIGZyb20gd2hpY2ggdGhlIG5leHQgZmlsdGVyIGNhbiBiZSBpbnZva2VkLgorICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiAgICAgICAgICAgIGluIGNhc2Ugb2YgYW4gSS9PIGVycm9yLgorICAgICAqIEB0aHJvd3MgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uIGluIGNhc2Ugb2YgYW4gZXJyb3Igd2hpbGUgZXhlY3V0aW5nIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciBjaGFpbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkb0ZpbHRlcihmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgZmluYWwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwgZmluYWwgRmlsdGVyQ2hhaW4gY2hhaW4pCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICBpZiAocmVxdWVzdC5nZXRBdHRyaWJ1dGUoImphdmF4LnNlcnZsZXQuaW5jbHVkZS5yZXF1ZXN0X3VyaSIpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpbmNsdWRlUmVxdWVzdFVSSSA9IChTdHJpbmcpIHJlcXVlc3QuZ2V0QXR0cmlidXRlKCJqYXZheC5zZXJ2bGV0LmluY2x1ZGUucmVxdWVzdF91cmkiKTsKKworICAgICAgICAgICAgaWYgKCFpbmNsdWRlUmVxdWVzdFVSSS5lcXVhbHMocmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCkpKSB7CisgICAgICAgICAgICAgICAgZG9GaWx0ZXIocmVxdWVzdCwgcmVzcG9uc2UsIGNoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZVJlcXVlc3RVUkksCisgICAgICAgICAgICAgICAgICAgICAgICAoU3RyaW5nKSByZXF1ZXN0LmdldEF0dHJpYnV0ZSgiamF2YXguc2VydmxldC5pbmNsdWRlLnNlcnZsZXRfcGF0aCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgcmVxdWVzdC5nZXRBdHRyaWJ1dGUoImphdmF4LnNlcnZsZXQuaW5jbHVkZS5xdWVyeV9zdHJpbmciKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEpFUlNFWS04ODAgLSBXQVMgaW50ZXJwcmV0cyBIdHRwU2VydmxldFJlcXVlc3QjZ2V0U2VydmxldFBhdGgoKSBhbmQgSHR0cFNlcnZsZXRSZXF1ZXN0I2dldFBhdGhJbmZvKCkKKyAgICAgICAgICogZGlmZmVyZW50bHkgd2hlbiBhY2Nlc3NpbmcgYSBzdGF0aWMgcmVzb3VyY2UuCisgICAgICAgICAqLworICAgICAgICBmaW5hbCBTdHJpbmcgc2VydmxldFBhdGggPSByZXF1ZXN0LmdldFNlcnZsZXRQYXRoKCkKKyAgICAgICAgICAgICAgICArIChyZXF1ZXN0LmdldFBhdGhJbmZvKCkgPT0gbnVsbCA/ICIiIDogcmVxdWVzdC5nZXRQYXRoSW5mbygpKTsKKworICAgICAgICBkb0ZpbHRlcihyZXF1ZXN0LCByZXNwb25zZSwgY2hhaW4sCisgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRSZXF1ZXN0VVJJKCksCisgICAgICAgICAgICAgICAgc2VydmxldFBhdGgsCisgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRRdWVyeVN0cmluZygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZG9GaWx0ZXIoZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIGZpbmFsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsIGZpbmFsIEZpbHRlckNoYWluIGNoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVxdWVzdFVSSSwgZmluYWwgU3RyaW5nIHNlcnZsZXRQYXRoLCBmaW5hbCBTdHJpbmcgcXVlcnlTdHJpbmcpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICAvLyBpZiB3ZSBtYXRjaCB0aGUgc3RhdGljIGNvbnRlbnQgcmVndWxhciBleHByZXNzaW9uIGxldHMgZGVsZWdhdGUgdG8KKyAgICAgICAgLy8gdGhlIGZpbHRlciBjaGFpbiB0byB1c2UgdGhlIGRlZmF1bHQgY29udGFpbmVyIHNlcnZsZXRzICYgaGFuZGxlcnMKKyAgICAgICAgZmluYWwgUGF0dGVybiBwID0gZ2V0U3RhdGljQ29udGVudFBhdHRlcm4oKTsKKyAgICAgICAgaWYgKHAgIT0gbnVsbCAmJiBwLm1hdGNoZXIoc2VydmxldFBhdGgpLm1hdGNoZXMoKSkgeworICAgICAgICAgICAgY2hhaW4uZG9GaWx0ZXIocmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZpbHRlckNvbnRleHRQYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICghc2VydmxldFBhdGguc3RhcnRzV2l0aChmaWx0ZXJDb250ZXh0UGF0aCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29udGFpbmVyRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlNFUlZMRVRfUEFUSF9NSVNNQVRDSChzZXJ2bGV0UGF0aCwgZmlsdGVyQ29udGV4dFBhdGgpKTsKKyAgICAgICAgICAgICAgICAvL1RPRE86CisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICB9IGVsc2UgaWYgKHNlcnZsZXRQYXRoLmxlbmd0aCgpID09IGZpbHRlckNvbnRleHRQYXRoLmxlbmd0aCgpKSB7CisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgLy8gUGF0aCBkb2VzIG5vdCBlbmQgaW4gYSBzbGFzaCwgbWF5IG5lZWQgdG8gcmVkaXJlY3QKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICBpZiAod2ViQ29tcG9uZW50LmdldFJlc291cmNlQ29uZmlnKCkuZ2V0RmVhdHVyZShSZXNvdXJjZUNvbmZpZy5GRUFUVVJFX1JFRElSRUNUKSkgeworICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICBVUkkgbCA9IFVyaUJ1aWxkZXIuZnJvbVVyaShyZXF1ZXN0LmdldFJlcXVlc3RVUkwoKS50b1N0cmluZygpKS4KKyAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoKCIvIikuCisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZVF1ZXJ5KHF1ZXJ5U3RyaW5nKS5idWlsZCgpOworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cygzMDcpOworICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoIkxvY2F0aW9uIiwgbC50b0FTQ0lJU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFVSSSArPSAiLyI7CisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZmluYWwgVVJJIGJhc2VVcmk7CisgICAgICAgIGZpbmFsIFVSSSByZXF1ZXN0VXJpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgVXJpQnVpbGRlciBhYnNvbHV0ZVVyaUJ1aWxkZXIgPSBVcmlCdWlsZGVyLmZyb21VcmkocmVxdWVzdC5nZXRSZXF1ZXN0VVJMKCkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgICAgIC8vIGRlcGVuZGluZyBvbiBjaXJjdW1zdGFuY2VzLCB1c2UgdGhlIGNvcnJlY3QgcGF0aCB0byByZXBsYWNlIGluIHRoZSBhYnNvbHV0ZSByZXF1ZXN0IFVSSQorICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBpY2tlZFVybE1hcHBpbmcgPSBwaWNrVXJsTWFwcGluZyhyZXF1ZXN0LmdldFJlcXVlc3RVUkwoKS50b1N0cmluZygpLCBmaWx0ZXJVcmxNYXBwaW5ncyk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVwbGFjaW5nUGF0aCA9IHBpY2tlZFVybE1hcHBpbmcgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICA/IHBpY2tlZFVybE1hcHBpbmcKKyAgICAgICAgICAgICAgICAgICAgOiAoZmlsdGVyQ29udGV4dFBhdGggIT0gbnVsbCA/IGZpbHRlckNvbnRleHRQYXRoIDogIiIpOworCisgICAgICAgICAgICBiYXNlVXJpID0gYWJzb2x1dGVVcmlCdWlsZGVyLnJlcGxhY2VQYXRoKHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKSkucGF0aChyZXBsYWNpbmdQYXRoKS5wYXRoKCIvIikuYnVpbGQoKTsKKworCisgICAgICAgICAgICByZXF1ZXN0VXJpID0gYWJzb2x1dGVVcmlCdWlsZGVyLnJlcGxhY2VQYXRoKHJlcXVlc3RVUkkpCisgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlUXVlcnkoQ29udGFpbmVyVXRpbHMuZW5jb2RlVW5zYWZlQ2hhcmFjdGVycyhxdWVyeVN0cmluZykpCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7CisgICAgICAgICAgICBzZXRSZXNwb25zZUZvckludmFsaWRVcmkocmVzcG9uc2UsIGlhZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBSZXNwb25zZVdyaXRlciByZXNwb25zZVdyaXRlciA9IHNlcnZpY2VJbXBsKGJhc2VVcmksIHJlcXVlc3RVcmksIHJlcXVlc3QsIHJlc3BvbnNlKTsKKworICAgICAgICAvLyBJZiBmb3J3YXJkaW5nIGlzIGNvbmZpZ3VyZWQgYW5kIHJlc3BvbnNlIGlzIGEgNDA0IHdpdGggbm8gZW50aXR5CisgICAgICAgIC8vIGJvZHkgdGhlbiBjYWxsIHRoZSBuZXh0IGZpbHRlciBpbiB0aGUgY2hhaW4KKworICAgICAgICBpZiAod2ViQ29tcG9uZW50LmZvcndhcmRPbjQwNCAmJiAhcmVzcG9uc2UuaXNDb21taXR0ZWQoKSkgeworICAgICAgICAgICAgYm9vbGVhbiBoYXNFbnRpdHkgPSBmYWxzZTsKKyAgICAgICAgICAgIFJlc3BvbnNlLlN0YXR1c1R5cGUgc3RhdHVzID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChyZXNwb25zZVdyaXRlci5yZXNwb25zZUNvbnRleHRSZXNvbHZlZCgpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2VDb250ZXh0ID0gcmVzcG9uc2VXcml0ZXIuZ2V0UmVzcG9uc2VDb250ZXh0KCk7CisgICAgICAgICAgICAgICAgaGFzRW50aXR5ID0gcmVzcG9uc2VDb250ZXh0Lmhhc0VudGl0eSgpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHJlc3BvbnNlQ29udGV4dC5nZXRTdGF0dXNJbmZvKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWhhc0VudGl0eSAmJiBzdGF0dXMgPT0gUmVzcG9uc2UuU3RhdHVzLk5PVF9GT1VORCkgeworICAgICAgICAgICAgICAgIC8vIGxldHMgY2xlYXIgdGhlIHJlc3BvbnNlIHRvIE9LIGJlZm9yZSB3ZSBmb3J3YXJkIHRvIHRoZSBuZXh0IGluIHRoZSBjaGFpbgorICAgICAgICAgICAgICAgIC8vIGFzIE9LIGlzIHRoZSBkZWZhdWx0IHNldCBieSBzZXJ2bGV0IGNvbnRhaW5lcnMgYmVmb3JlIGZpbHRlcnMvc2VydmxldHMgZG8gYW55IHdvcmsKKyAgICAgICAgICAgICAgICAvLyBzbyBsZXRzIGhpZGUgb3VyIGZvb3RzdGVwcyBhbmQgcHJldGVuZCB3ZSB3ZXJlIG5ldmVyIGluIHRoZSBjaGFpbiBhdCBhbGwgYW5kIGxldCB0aGUKKyAgICAgICAgICAgICAgICAvLyBuZXh0IGZpbHRlciBvciBzZXJ2bGV0IHJldHVybiB0aGUgNDA0IGlmIHRoZXkgY2FuJ3QgZmluZCBhbnl0aGluZyB0byByZXR1cm4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIFdlIGNvdWxkIGFkZCBhbiBvcHRpb25hbCBmbGFnIHRvIGRpc2FibGUgdGhpcyBzdGVwIGlmIGFueW9uZSBjYW4gZXZlciBmaW5kIGEgY2FzZSB3aGVyZQorICAgICAgICAgICAgICAgIC8vIHRoaXMgY2F1c2VzIGEgcHJvYmxlbSwgdGhvdWdoIEkgc3VzcGVjdCBhbnkgcHJvYmxlbXMgd2lsbCByZWFsbHkgYmUgd2l0aCBkb3duc3RyZWFtCisgICAgICAgICAgICAgICAgLy8gc2VydmxldHMgbm90IGNvcnJlY3RseSBzZXR0aW5nIGFuIGVycm9yIHN0YXR1cyBpZiB0aGV5IGNhbm5vdCBmaW5kIHNvbWV0aGluZyB0byByZXR1cm4KKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFNlcnZsZXRSZXNwb25zZS5TQ19PSyk7CisgICAgICAgICAgICAgICAgY2hhaW4uZG9GaWx0ZXIocmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGlja3MgdGhlIG1vc3Qgc3VpdGFibGUgdXJsIG1hcHBpbmcgKGluIGNhc2UgbW9yZSB0aGFuIG9uZSBpcyBkZWZpbmVkKSBiYXNlZCBvbiB0aGUgcmVxdWVzdCBVUkkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdFVyaSBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlcXVlc3QgVVJJCisgICAgICogQHBhcmFtIGZpbHRlclVybE1hcHBpbmdzIHNldCBvZiBjb25maWd1cmVkIGZpbHRlciB1cmwtcGF0dGVybnMKKyAgICAgKiBAcmV0dXJuIHRoZSBtb3N0IHN1aXRhYmxlIGNvbnRleHQgcGF0aCwgb3Ige0Bjb2RlIG51bGx9IGlmIGVtcHR5CisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcGlja1VybE1hcHBpbmcoZmluYWwgU3RyaW5nIHJlcXVlc3RVcmksIGZpbmFsIExpc3Q8U3RyaW5nPiBmaWx0ZXJVcmxNYXBwaW5ncykgeworICAgICAgICBpZiAoZmlsdGVyVXJsTWFwcGluZ3MgPT0gbnVsbCB8fCBmaWx0ZXJVcmxNYXBwaW5ncy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZpbHRlclVybE1hcHBpbmdzLnNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICByZXR1cm4gZmlsdGVyVXJsTWFwcGluZ3MuZ2V0KDApOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgcGF0dGVybiA6IGZpbHRlclVybE1hcHBpbmdzKSB7CisgICAgICAgICAgICBpZiAocmVxdWVzdFVyaS5jb250YWlucyhwYXR0ZXJuKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBwYXR0ZXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzb2x2ZSB0aGUge0BsaW5rIEZpbHRlclVybE1hcHBpbmdzUHJvdmlkZXJ9IHNlcnZpY2UgdmlhIGhrMi4KKyAgICAgKgorICAgICAqIFdpbGwgb25seSB3b3JrIGluIFNlcnZsZXQgMyBjb250YWluZXIsIGFzIHRoZSBvbGRlciBBUEkgdmVyc2lvbgorICAgICAqIGRvZXMgbm90IHByb3ZpZGUgYWNjZXNzIHRvIHRoZSBmaWx0ZXIgbWFwcGluZyBzdHJ1Y3R1cmUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSBGaWx0ZXJDb250ZXh0UGF0aH0gaW5zdGFuY2UsIGlmIGF2YWlsYWJsZSwge0Bjb2RlIG51bGx9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIEZpbHRlclVybE1hcHBpbmdzUHJvdmlkZXIgZ2V0RmlsdGVyVXJsTWFwcGluZ3NQcm92aWRlcigpIHsKKyAgICAgICAgRmlsdGVyVXJsTWFwcGluZ3NQcm92aWRlciBmaWx0ZXJVcmxNYXBwaW5nc1Byb3ZpZGVyID0gbnVsbDsKKyAgICAgICAgZmluYWwgSXRlcmF0b3I8RmlsdGVyVXJsTWFwcGluZ3NQcm92aWRlcj4gcHJvdmlkZXJzID0gUHJvdmlkZXJzLmdldEFsbFByb3ZpZGVycygKKyAgICAgICAgICAgICAgICBnZXRBcHBsaWNhdGlvbkhhbmRsZXIoKS5nZXRJbmplY3Rpb25NYW5hZ2VyKCksIEZpbHRlclVybE1hcHBpbmdzUHJvdmlkZXIuY2xhc3MpLml0ZXJhdG9yKCk7CisgICAgICAgIGlmIChwcm92aWRlcnMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgZmlsdGVyVXJsTWFwcGluZ3NQcm92aWRlciA9IHByb3ZpZGVycy5uZXh0KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZpbHRlclVybE1hcHBpbmdzUHJvdmlkZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBzdGF0aWMgY29udGVudCBwYXRoIHBhdHRlcm4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgUGF0dGVybn0gY29tcGlsZWQgZnJvbSBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IGlzCisgICAgICogICAgICAgICB0aGUgcHJvcGVydHkgdmFsdWUgb2Yge0BsaW5rIFNlcnZsZXRQcm9wZXJ0aWVzI0ZJTFRFUl9TVEFUSUNfQ09OVEVOVF9SRUdFWH0uCisgICAgICogICAgICAgICBBIHtAY29kZSBudWxsfSB2YWx1ZSB3aWxsIGJlIHJldHVybmVkIGlmIHRoZSBwcm9wZXJ0eSBpcyBub3Qgc2V0IG9yIGlzCisgICAgICogICAgICAgICBhbiBlbXB0eSBTdHJpbmcuCisgICAgICovCisgICAgcHJvdGVjdGVkIFBhdHRlcm4gZ2V0U3RhdGljQ29udGVudFBhdHRlcm4oKSB7CisgICAgICAgIHJldHVybiBzdGF0aWNDb250ZW50UGF0dGVybjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb3VyY2VDb25maWcgZ2V0Q29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHdlYkNvbXBvbmVudC5hcHBIYW5kbGVyLmdldENvbmZpZ3VyYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZWxvYWQoKSB7CisgICAgICAgIHJlbG9hZChnZXRDb25maWd1cmF0aW9uKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlbG9hZChmaW5hbCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmF0aW9uKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb250YWluZXJMaXN0ZW5lci5vblNodXRkb3duKHRoaXMpOworCisgICAgICAgICAgICB3ZWJDb21wb25lbnQgPSBuZXcgV2ViQ29tcG9uZW50KHdlYkNvbXBvbmVudC53ZWJDb25maWcsIGNvbmZpZ3VyYXRpb24pOworICAgICAgICAgICAgY29udGFpbmVyTGlzdGVuZXIgPSB3ZWJDb21wb25lbnQuYXBwSGFuZGxlcjsKKyAgICAgICAgICAgIGNvbnRhaW5lckxpc3RlbmVyLm9uUmVsb2FkKHRoaXMpOworICAgICAgICAgICAgY29udGFpbmVyTGlzdGVuZXIub25TdGFydHVwKHRoaXMpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBTZXJ2bGV0RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLlNFVkVSRSwgIlJlbG9hZCBmYWlsZWQiLCBleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQXBwbGljYXRpb25IYW5kbGVyIGdldEFwcGxpY2F0aW9uSGFuZGxlcigpIHsKKyAgICAgICAgcmV0dXJuIHdlYkNvbXBvbmVudC5hcHBIYW5kbGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB7QGxpbmsgV2ViQ29tcG9uZW50fSB1c2VkIGJ5IHRoaXMgc2VydmxldCBjb250YWluZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSB3ZWIgY29tcG9uZW50LgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJVbnVzZWREZWNsYXJhdGlvbiIpCisgICAgcHVibGljIFdlYkNvbXBvbmVudCBnZXRXZWJDb21wb25lbnQoKSB7CisgICAgICAgIHJldHVybiB3ZWJDb21wb25lbnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVycy9qZXJzZXktc2VydmxldC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmxldC9TZXJ2bGV0UHJvcGVydGllcy5qYXZhIGIvY29udGFpbmVycy9qZXJzZXktc2VydmxldC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmxldC9TZXJ2bGV0UHJvcGVydGllcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZWE1NGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXJzL2plcnNleS1zZXJ2bGV0LWNvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2bGV0L1NlcnZsZXRQcm9wZXJ0aWVzLmphdmEKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUHJvcGVydGllc0NsYXNzOworCisvKioKKyAqIEplcnNleSBzZXJ2bGV0IGNvbnRhaW5lciBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQFByb3BlcnRpZXNDbGFzcworcHVibGljIGZpbmFsIGNsYXNzIFNlcnZsZXRQcm9wZXJ0aWVzIHsKKworICAgIC8qKgorICAgICAqIElmIHNldCwgaW5kaWNhdGVzIHRoZSBVUkwgcGF0dGVybiBvZiB0aGUgSmVyc2V5IHNlcnZsZXQgZmlsdGVyIGNvbnRleHQgcGF0aC4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgVVJMIHBhdHRlcm4gb2YgYSBmaWx0ZXIgaXMgc2V0IHRvIGEgYmFzZSBwYXRoIGFuZCBhIHdpbGRjYXJkLAorICAgICAqIHN1Y2ggYXMgIi9iYXNlLyoiLCB0aGVuIHRoaXMgcHJvcGVydHkgY2FuIGJlIHVzZWQgdG8gZGVjbGFyZSBhIGZpbHRlcgorICAgICAqIGNvbnRleHQgcGF0aCB0aGF0IGJlaGF2ZXMgaW4gdGhlIHNhbWUgbWFubmVyIGFzIHRoZSBTZXJ2bGV0IGNvbnRleHQKKyAgICAgKiBwYXRoIGZvciBkZXRlcm1pbmluZyB0aGUgYmFzZSBVUkkgb2YgdGhlIGFwcGxpY2F0aW9uLiAoTm90ZSB0aGF0IHdpdGgKKyAgICAgKiB0aGUgU2VydmxldCAyLnggQVBJIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBkZXRlcm1pbmUgdGhlIFVSTCBwYXR0ZXJuCisgICAgICogd2l0aG91dCBwYXJzaW5nIHRoZSB7QGNvZGUgd2ViLnhtbH0sIGhlbmNlIHdoeSB0aGlzIHByb3BlcnR5IGlzIG5lY2Vzc2FyeS4pCisgICAgICogPHA+CisgICAgICogVGhlIHByb3BlcnR5IGlzIG9ubHkgYXBwbGljYWJsZSB3aGVuIHtAbGluayBTZXJ2bGV0Q29udGFpbmVyIEplcnNleSBzZXJ2bGV0CisgICAgICogY29udGFpbmVyfSBpcyBjb25maWd1cmVkIHRvIHJ1biBhcyBhIHtAbGluayBqYXZheC5zZXJ2bGV0LkZpbHRlcn0sIG90aGVyd2lzZSB0aGlzIHByb3BlcnR5CisgICAgICogd2lsbCBiZSBpZ25vcmVkLgorICAgICAqIDxwPgorICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgbWF5IGNvbnNpc3Qgb2Ygb25lIG9yIG1vcmUgcGF0aCBzZWdtZW50cyBzZXBhcmF0ZSBieQorICAgICAqIHtAY29kZSAnLyd9LgorICAgICAqIDxwPjwvcD4KKyAgICAgKiBBIGRlZmF1bHQgdmFsdWUgaXMgbm90IHNldC4KKyAgICAgKiA8cD48L3A+CisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaXMgPHR0PntAdmFsdWV9PC90dD4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMVEVSX0NPTlRFWFRfUEFUSCA9ICJqZXJzZXkuY29uZmlnLnNlcnZsZXQuZmlsdGVyLmNvbnRleHRQYXRoIjsKKworICAgIC8qKgorICAgICAqIElmIHNldCB0byB7QGNvZGUgdHJ1ZX0gYW5kIGEgNDA0IHJlc3BvbnNlIHdpdGggbm8gZW50aXR5IGJvZHkgaXMgcmV0dXJuZWQKKyAgICAgKiBmcm9tIGVpdGhlciB0aGUgcnVudGltZSBvciB0aGUgYXBwbGljYXRpb24gdGhlbiB0aGUgcnVudGltZSBmb3J3YXJkcyB0aGUKKyAgICAgKiByZXF1ZXN0IHRvIHRoZSBuZXh0IGZpbHRlciBpbiB0aGUgZmlsdGVyIGNoYWluLiBUaGlzIGVuYWJsZXMgYW5vdGhlciBmaWx0ZXIKKyAgICAgKiBvciB0aGUgdW5kZXJseWluZyBzZXJ2bGV0IGVuZ2luZSB0byBwcm9jZXNzIHRoZSByZXF1ZXN0LiBCZWZvcmUgdGhlIHJlcXVlc3QKKyAgICAgKiBpcyBmb3J3YXJkZWQgdGhlIHJlc3BvbnNlIHN0YXR1cyBpcyBzZXQgdG8gMjAwLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgcHJvcGVydHkgaXMgYW4gYWx0ZXJuYXRpdmUgdG8gc2V0dGluZyBhIHtAbGluayAjRklMVEVSX1NUQVRJQ19DT05URU5UX1JFR0VYCisgICAgICogc3RhdGljIGNvbnRlbnQgcmVndWxhciBleHByZXNzaW9ufSBhbmQgcmVxdWlyZXMgbGVzcyBjb25maWd1cmF0aW9uLiBIb3dldmVyLAorICAgICAqIGFwcGxpY2F0aW9uIGNvZGUsIHN1Y2ggYXMgbWV0aG9kcyBjb3JyZXNwb25kaW5nIHRvIHN1Yi1yZXNvdXJjZSBsb2NhdG9ycywKKyAgICAgKiBtYXkgYmUgaW52b2tlZCB3aGVuIHRoaXMgZmVhdHVyZSBpcyBlbmFibGVkLgorICAgICAqIDxwPjwvcD4KKyAgICAgKiBUaGUgcHJvcGVydHkgaXMgb25seSBhcHBsaWNhYmxlIHdoZW4ge0BsaW5rIFNlcnZsZXRDb250YWluZXIgSmVyc2V5IHNlcnZsZXQKKyAgICAgKiBjb250YWluZXJ9IGlzIGNvbmZpZ3VyZWQgdG8gcnVuIGFzIGEge0BsaW5rIGphdmF4LnNlcnZsZXQuRmlsdGVyfSwgb3RoZXJ3aXNlCisgICAgICogdGhpcyBwcm9wZXJ0eSB3aWxsIGJlIGlnbm9yZWQuCisgICAgICogPHA+PC9wPgorICAgICAqIEFwcGxpY2F0aW9uIGNvZGUsIHN1Y2ggYXMgbWV0aG9kcyBjb3JyZXNwb25kaW5nIHRvIHN1Yi1yZXNvdXJjZSBsb2NhdG9ycworICAgICAqIG1heSBiZSBpbnZva2VkIHdoZW4gdGhpcyBmZWF0dXJlIGlzIGVuYWJsZWQuCisgICAgICogPHA+CisgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMge0Bjb2RlIGZhbHNlfS4KKyAgICAgKiA8cD48L3A+CisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaXMgPHR0PntAdmFsdWV9PC90dD4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMVEVSX0ZPUldBUkRfT05fNDA0ID0gImplcnNleS5jb25maWcuc2VydmxldC5maWx0ZXIuZm9yd2FyZE9uNDA0IjsKKworICAgIC8qKgorICAgICAqIElmIHNldCB0aGUgcmVndWxhciBleHByZXNzaW9uIGlzIHVzZWQgdG8gbWF0Y2ggYW4gaW5jb21pbmcgc2VydmxldCBwYXRoIFVSSQorICAgICAqIHRvIHNvbWUgd2ViIHBhZ2UgY29udGVudCBzdWNoIGFzIHN0YXRpYyByZXNvdXJjZXMgb3IgSlNQcyB0byBiZSBoYW5kbGVkCisgICAgICogYnkgdGhlIHVuZGVybHlpbmcgc2VydmxldCBlbmdpbmUuCisgICAgICogPHA+PC9wPgorICAgICAqIFRoZSBwcm9wZXJ0eSBpcyBvbmx5IGFwcGxpY2FibGUgd2hlbiB7QGxpbmsgU2VydmxldENvbnRhaW5lciBKZXJzZXkgc2VydmxldAorICAgICAqIGNvbnRhaW5lcn0gaXMgY29uZmlndXJlZCB0byBydW4gYXMgYSB7QGxpbmsgamF2YXguc2VydmxldC5GaWx0ZXJ9LCBvdGhlcndpc2UKKyAgICAgKiB0aGlzIHByb3BlcnR5IHdpbGwgYmUgaWdub3JlZC4gSWYgYSBzZXJ2bGV0IHBhdGggbWF0Y2hlcyB0aGlzIHJlZ3VsYXIKKyAgICAgKiBleHByZXNzaW9uIHRoZW4gdGhlIGZpbHRlciBmb3J3YXJkcyB0aGUgcmVxdWVzdCB0byB0aGUgbmV4dCBmaWx0ZXIgaW4gdGhlCisgICAgICogZmlsdGVyIGNoYWluIHNvIHRoYXQgdGhlIHVuZGVybHlpbmcgc2VydmxldCBlbmdpbmUgY2FuIHByb2Nlc3MgdGhlIHJlcXVlc3QKKyAgICAgKiBvdGhlcndpc2UgSmVyc2V5IHdpbGwgcHJvY2VzcyB0aGUgcmVxdWVzdC4gRm9yIGV4YW1wbGUgaWYgeW91IHNldCB0aGUgdmFsdWUKKyAgICAgKiB0byB7QGNvZGUgLyhpbWFnZXxjc3MpLy4qfSB0aGVuIHlvdSBjYW4gc2VydmUgdXAgaW1hZ2VzIGFuZCBDU1MgZmlsZXMKKyAgICAgKiBmb3IgeW91ciBJbXBsaWNpdCBvciBFeHBsaWNpdCBWaWV3cyB3aGlsZSBzdGlsbCBwcm9jZXNzaW5nIHlvdXIgSkFYLVJTCisgICAgICogcmVzb3VyY2VzLgorICAgICAqIDxwPjwvcD4KKyAgICAgKiBUaGUgdHlwZSBvZiB0aGlzIHByb3BlcnR5IG11c3QgYmUgYSBTdHJpbmcgYW5kIHRoZSB2YWx1ZSBtdXN0IGJlIGEgdmFsaWQKKyAgICAgKiByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICogPHA+PC9wPgorICAgICAqIEEgZGVmYXVsdCB2YWx1ZSBpcyBub3Qgc2V0LgorICAgICAqIDxwPjwvcD4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxURVJfU1RBVElDX0NPTlRFTlRfUkVHRVggPSAiamVyc2V5LmNvbmZpZy5zZXJ2bGV0LmZpbHRlci5zdGF0aWNDb250ZW50UmVnZXgiOworCisgICAgLyoqCisgICAgICogQXBwbGljYXRpb24gY29uZmlndXJhdGlvbiBpbml0aWFsaXphdGlvbiBwcm9wZXJ0eSB3aG9zZSB2YWx1ZSBpcyBhIGZ1bGx5CisgICAgICogcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgYSBjbGFzcyB0aGF0IGltcGxlbWVudHMge0BsaW5rIGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb259LgorICAgICAqIDxwPjwvcD4KKyAgICAgKiBBIGRlZmF1bHQgdmFsdWUgaXMgbm90IHNldC4KKyAgICAgKiA8cD48L3A+CisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaXMgPHR0PntAdmFsdWV9PC90dD4uCisgICAgICovCisgICAgLy8gVE9ETyBpbXBsZW1lbnQgZ2VuZXJpYyBzdXBwb3J0CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkFYUlNfQVBQTElDQVRJT05fQ0xBU1MgPSAiamF2YXgud3MucnMuQXBwbGljYXRpb24iOworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHRoYXQgSmVyc2V5IHNob3VsZCBzY2FuIHRoZSB3aG9sZSB3ZWIgYXBwIGZvciBhcHBsaWNhdGlvbi1zcGVjaWZpYyByZXNvdXJjZXMgYW5kCisgICAgICogcHJvdmlkZXJzLiBJZiB0aGUgcHJvcGVydHkgaXMgcHJlc2VudCBhbmQgdGhlIHZhbHVlIGlzIG5vdCB7QGNvZGUgZmFsc2V9LCB0aGUgd2hvbGUgd2ViIGFwcAorICAgICAqIHdpbGwgYmUgc2Nhbm5lZCBmb3IgSkFYLVJTIHJvb3QgcmVzb3VyY2VzIChhbm5vdGF0ZWQgd2l0aCB7QGxpbmsgamF2YXgud3MucnMuUGF0aCBAUGF0aH0pCisgICAgICogYW5kIHByb3ZpZGVycyAoYW5ub3RhdGVkIHdpdGgge0BsaW5rIGphdmF4LndzLnJzLmV4dC5Qcm92aWRlciBAUHJvdmlkZXJ9KS4KKyAgICAgKiA8cD48L3A+CisgICAgICogVGhlIHByb3BlcnR5IHZhbHVlIE1VU1QgYmUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFN0cmluZ30uIFRoZSBhbGxvd2VkIHZhbHVlcyBhcmUge0Bjb2RlIHRydWV9CisgICAgICogYW5kIHtAY29kZSBmYWxzZX0uCisgICAgICogPHA+PC9wPgorICAgICAqIEEgZGVmYXVsdCB2YWx1ZSBpcyBub3Qgc2V0LgorICAgICAqIDxwPjwvcD4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9WSURFUl9XRUJfQVBQID0gImplcnNleS5jb25maWcuc2VydmxldC5wcm92aWRlci53ZWJhcHAiOworCisgICAgLyoqCisgICAgICogSWYge0Bjb2RlIHRydWV9IHRoZW4gcXVlcnkgcGFyYW1ldGVycyB3aWxsIG5vdCBiZSB0cmVhdGVkIGFzIGZvcm0gcGFyYW1ldGVycyAoZS5nLiBpbmplY3RhYmxlIHVzaW5nCisgICAgICoge0BsaW5rIGphdmF4LndzLnJzLkZvcm1QYXJhbX0pIGluIGNhc2UgYSBGb3JtIHJlcXVlc3QgaXMgcHJvY2Vzc2VkIGJ5IHNlcnZlci4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB7QGNvZGUgZmFsc2V9LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAc2luY2UgMi4xNgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVJZX1BBUkFNU19BU19GT1JNX1BBUkFNU19ESVNBQkxFRCA9ICJqZXJzZXkuY29uZmlnLnNlcnZsZXQuZm9ybS5xdWVyeVBhcmFtcy5kaXNhYmxlZCI7CisKKyAgICAvKioKKyAgICAgKiBJZGVudGlmaWVzIHRoZSBvYmplY3QgdGhhdCB3aWxsIGJlIHVzZWQgYXMgYSBwYXJlbnQge0Bjb2RlIEhLMiBTZXJ2aWNlTG9jYXRvcn0gaW4gdGhlIEplcnNleQorICAgICAqIHtAbGluayBXZWJDb21wb25lbnR9LgorICAgICAqIDxwPjwvcD4KKyAgICAgKiBUaGlzIHByb3BlcnR5IGdpdmVzIGEgcG9zc2liaWxpdHkgdG8gdXNlIEhLMiBzZXJ2aWNlcyB0aGF0IGFyZSByZWdpc3RlcmVkIGFuZC9vciBjcmVhdGVkCisgICAgICogb3V0c2lkZSBvZiB0aGUgSmVyc2V5IHNlcnZlciBjb250ZXh0LgorICAgICAqIDxwPjwvcD4KKyAgICAgKiBCeSBkZWZhdWx0IHRoaXMgcHJvcGVydHkgaXMgbm90IHNldC4KKyAgICAgKiA8cD48L3A+CisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaXMgPHR0PntAdmFsdWV9PC90dD4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9MT0NBVE9SID0gImplcnNleS5jb25maWcuc2VydmxldC5jb250ZXh0LnNlcnZpY2VMb2NhdG9yIjsKKworICAgIHByaXZhdGUgU2VydmxldFByb3BlcnRpZXMoKSB7CisgICAgICAgIC8vIHByZXZlbnRzIGluc3RhbnRpYXRpb24KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXJzL2plcnNleS1zZXJ2bGV0LWNvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2bGV0L1NlcnZsZXRQcm9wZXJ0aWVzRGVsZWdhdGUuamF2YSBiL2NvbnRhaW5lcnMvamVyc2V5LXNlcnZsZXQtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZsZXQvU2VydmxldFByb3BlcnRpZXNEZWxlZ2F0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMTc1MjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXJzL2plcnNleS1zZXJ2bGV0LWNvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2bGV0L1NlcnZsZXRQcm9wZXJ0aWVzRGVsZWdhdGUuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuUHJvcGVydGllc0RlbGVnYXRlOworCisvKioKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitjbGFzcyBTZXJ2bGV0UHJvcGVydGllc0RlbGVnYXRlIGltcGxlbWVudHMgUHJvcGVydGllc0RlbGVnYXRlIHsKKyAgICBwcml2YXRlIGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0OworCisgICAgcHVibGljIFNlcnZsZXRQcm9wZXJ0aWVzRGVsZWdhdGUoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiByZXF1ZXN0LmdldEF0dHJpYnV0ZShuYW1lKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxTdHJpbmc+IGdldFByb3BlcnR5TmFtZXMoKSB7CisgICAgICAgIC8vbm9pbnNwZWN0aW9uIHVuY2hlY2tlZAorICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMubGlzdChyZXF1ZXN0LmdldEF0dHJpYnV0ZU5hbWVzKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBuYW1lLCBPYmplY3Qgb2JqZWN0KSB7CisgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKG5hbWUsIG9iamVjdCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHkoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmVxdWVzdC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVycy9qZXJzZXktc2VydmxldC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmxldC9XZWJBcHBSZXNvdXJjZXNTY2FubmVyLmphdmEgYi9jb250YWluZXJzL2plcnNleS1zZXJ2bGV0LWNvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2bGV0L1dlYkFwcFJlc291cmNlc1NjYW5uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODA0NjRhCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVycy9qZXJzZXktc2VydmxldC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmxldC9XZWJBcHBSZXNvdXJjZXNTY2FubmVyLmphdmEKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuRGVxdWU7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuQWJzdHJhY3RSZXNvdXJjZUZpbmRlckFkYXB0ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLnNjYW5uaW5nLkphckZpbGVTY2FubmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5zY2FubmluZy5SZXNvdXJjZUZpbmRlckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuc2Nhbm5pbmcuQ29tcG9zaXRlUmVzb3VyY2VGaW5kZXI7CisKKy8qKgorICogQSBzY2FubmVyIHRoYXQgcmVjdXJzaXZlbHkgc2NhbnMgcmVzb3VyY2VzIHdpdGhpbiBhIFdlYiBhcHBsaWNhdGlvbi4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKi8KK2ZpbmFsIGNsYXNzIFdlYkFwcFJlc291cmNlc1NjYW5uZXIgZXh0ZW5kcyBBYnN0cmFjdFJlc291cmNlRmluZGVyQWRhcHRlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBwYXRocyA9IG5ldyBTdHJpbmdbXSB7Ii9XRUItSU5GL2xpYi8iLCAiL1dFQi1JTkYvY2xhc3Nlcy8ifTsKKworICAgIHByaXZhdGUgZmluYWwgU2VydmxldENvbnRleHQgc2M7CisgICAgcHJpdmF0ZSBDb21wb3NpdGVSZXNvdXJjZUZpbmRlciBjb21wb3NpdGVSZXNvdXJjZUZpbmRlciA9IG5ldyBDb21wb3NpdGVSZXNvdXJjZUZpbmRlcigpOworCisgICAgLyoqCisgICAgICogU2NhbiBmcm9tIGEgc2V0IG9mIHdlYiByZXNvdXJjZSBwYXRocy4KKyAgICAgKiA8cC8+CisgICAgICoKKyAgICAgKiBAcGFyYW0gc2Mge0BsaW5rIFNlcnZsZXRDb250ZXh0fS4KKyAgICAgKi8KKyAgICBXZWJBcHBSZXNvdXJjZXNTY2FubmVyKGZpbmFsIFNlcnZsZXRDb250ZXh0IHNjKSB7CisgICAgICAgIHRoaXMuc2MgPSBzYzsKKworICAgICAgICBwcm9jZXNzUGF0aHMocGF0aHMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzUGF0aHMoZmluYWwgU3RyaW5nLi4uIHBhdGhzKSB7CisgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIHBhdGggOiBwYXRocykgeworCisgICAgICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiByZXNvdXJjZVBhdGhzID0gc2MuZ2V0UmVzb3VyY2VQYXRocyhwYXRoKTsKKyAgICAgICAgICAgIGlmIChyZXNvdXJjZVBhdGhzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29tcG9zaXRlUmVzb3VyY2VGaW5kZXIucHVzaChuZXcgQWJzdHJhY3RSZXNvdXJjZUZpbmRlckFkYXB0ZXIoKSB7CisKKyAgICAgICAgICAgICAgICBwcml2YXRlIGZpbmFsIERlcXVlPFN0cmluZz4gcmVzb3VyY2VQYXRoc1N0YWNrID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPigpIHsKKworICAgICAgICAgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMTA5MjU2NzczMjE4MTYwNDg1TDsKKworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyByZXNvdXJjZVBhdGggOiByZXNvdXJjZVBhdGhzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaChyZXNvdXJjZVBhdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIHByaXZhdGUgU3RyaW5nIGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbmV4dDsKKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChuZXh0ID09IG51bGwgJiYgIXJlc291cmNlUGF0aHNTdGFjay5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSByZXNvdXJjZVBhdGhzU3RhY2sucG9wKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0LmVuZHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzUGF0aHMobmV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5leHQuZW5kc1dpdGgoIi5qYXIiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZVJlc291cmNlRmluZGVyLnB1c2gobmV3IEphckZpbGVTY2FubmVyKHNjLmdldFJlc291cmNlQXNTdHJlYW0obmV4dCksICIiLCB0cnVlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZXNvdXJjZUZpbmRlckV4Y2VwdGlvbihpb2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXh0ICE9IG51bGw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBuZXh0KCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCAhPSBudWxsIHx8IGhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IG5leHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50OworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgSW5wdXRTdHJlYW0gb3BlbigpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNjLmdldFJlc291cmNlQXNTdHJlYW0oY3VycmVudCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICByZXR1cm4gY29tcG9zaXRlUmVzb3VyY2VGaW5kZXIuaGFzTmV4dCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgbmV4dCgpIHsKKyAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZVJlc291cmNlRmluZGVyLm5leHQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSW5wdXRTdHJlYW0gb3BlbigpIHsKKyAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZVJlc291cmNlRmluZGVyLm9wZW4oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgY29tcG9zaXRlUmVzb3VyY2VGaW5kZXIuY2xvc2UoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgY29tcG9zaXRlUmVzb3VyY2VGaW5kZXIgPSBuZXcgQ29tcG9zaXRlUmVzb3VyY2VGaW5kZXIoKTsKKyAgICAgICAgcHJvY2Vzc1BhdGhzKHBhdGhzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXJzL2plcnNleS1zZXJ2bGV0LWNvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2bGV0L1dlYkNvbXBvbmVudC5qYXZhIGIvY29udGFpbmVycy9qZXJzZXktc2VydmxldC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmxldC9XZWJDb21wb25lbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDk2MmJlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVycy9qZXJzZXktc2VydmxldC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmxldC9XZWJDb21wb25lbnQuamF2YQpAQCAtMCwwICsxLDY0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgamF2YXgud3MucnMuUnVudGltZVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Gb3JtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY1R5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuU2VjdXJpdHlDb250ZXh0OworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlckNvbmZpZzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb25maWc7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLlNlcnZpY2VGaW5kZXJCaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkFic3RyYWN0QmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5Qcm92aWRlcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LlJlZmVyZW5jaW5nRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlJlZmxlY3Rpb25IZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLlJlZjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uVmFsdWU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLlZhbHVlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkhlYWRlclZhbHVlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuTWVkaWFUeXBlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLmludGVybmFsLlJlcXVlc3RTY29wZWQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQmFja2dyb3VuZFNjaGVkdWxlckxpdGVyYWw7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5JbnRlcm5hbFNlcnZlclByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5SZXF1ZXN0U2NvcGVkSW5pdGlhbGl6ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LmludGVybmFsLlBlcnNpc3RlbmNlVW5pdEJpbmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LmludGVybmFsLlJlc3BvbnNlV3JpdGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuaW50ZXJuYWwuU2VydmxldENvbnRhaW5lclByb3ZpZGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LmludGVybmFsLlV0aWxzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuaW50ZXJuYWwuc3BpLkV4dGVuZGVkU2VydmxldENvbnRhaW5lclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuaW50ZXJuYWwuc3BpLlJlcXVlc3RDb250ZXh0UHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5pbnRlcm5hbC5zcGkuUmVxdWVzdFNjb3BlZEluaXRpYWxpemVyUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5pbnRlcm5hbC5zcGkuU2VydmxldENvbnRhaW5lclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuc3BpLkFzeW5jQ29udGV4dERlbGVnYXRlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuc3BpLkFzeW5jQ29udGV4dERlbGVnYXRlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5zcGkuRmlsdGVyVXJsTWFwcGluZ3NQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS51cmkuVXJpQ29tcG9uZW50OworCisvKioKKyAqIEFuIGNvbW1vbiBKZXJzZXkgd2ViIGNvbXBvbmVudCB0aGF0IG1heSBiZSBleHRlbmRlZCBieSBhIFNlcnZsZXQgYW5kL29yCisgKiBGaWx0ZXIgaW1wbGVtZW50YXRpb24sIG9yIGVuY2Fwc3VsYXRlZCBieSBhIFNlcnZsZXQgb3IgRmlsdGVyIGltcGxlbWVudGF0aW9uLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgV2ViQ29tcG9uZW50IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFdlYkNvbXBvbmVudC5jbGFzcy5nZXROYW1lKCkpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHlwZSBSRVFVRVNUX1RZUEUgPSAobmV3IEdlbmVyaWNUeXBlPFJlZjxIdHRwU2VydmxldFJlcXVlc3Q+PigpIHt9KS5nZXRUeXBlKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHlwZSBSRVNQT05TRV9UWVBFID0gKG5ldyBHZW5lcmljVHlwZTxSZWY8SHR0cFNlcnZsZXRSZXNwb25zZT4+KCkge30pLmdldFR5cGUoKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFzeW5jQ29udGV4dERlbGVnYXRlIERFRkFVTFRfQVNZTkNfREVMRUdBVEUgPSBuZXcgQXN5bmNDb250ZXh0RGVsZWdhdGUoKSB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHN1c3BlbmQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5BU1lOQ19QUk9DRVNTSU5HX05PVF9TVVBQT1JURUQoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY29tcGxldGUoKSB7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBmaW5hbCBSZXF1ZXN0U2NvcGVkSW5pdGlhbGl6ZXJQcm92aWRlciByZXF1ZXN0U2NvcGVkSW5pdGlhbGl6ZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHJlcXVlc3RSZXNwb25zZUJpbmRpbmdFeHRlcm5hbGl6ZWQ7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXF1ZXN0U2NvcGVkSW5pdGlhbGl6ZXJQcm92aWRlciBERUZBVUxUX1JFUVVFU1RfU0NPUEVfSU5JVElBTElaRVJfUFJPVklERVIgPQorICAgICAgICAgICAgY29udGV4dCAtPiAoUmVxdWVzdFNjb3BlZEluaXRpYWxpemVyKSBpbmplY3Rpb25NYW5hZ2VyIC0+IHsKKyAgICAgICAgICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLjxSZWY8SHR0cFNlcnZsZXRSZXF1ZXN0Pj5nZXRJbnN0YW5jZShSRVFVRVNUX1RZUEUpLnNldChjb250ZXh0LmdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpKTsKKyAgICAgICAgICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLjxSZWY8SHR0cFNlcnZsZXRSZXNwb25zZT4+Z2V0SW5zdGFuY2UoUkVTUE9OU0VfVFlQRSkuc2V0KGNvbnRleHQuZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpKTsKKyAgICAgICAgICAgIH07CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGZpcnN0IGZvdW5kIHtAbGluayBBc3luY0NvbnRleHREZWxlZ2F0ZVByb3ZpZGVyfQorICAgICAqICh2aWEge0BsaW5rIFByb3ZpZGVycyNnZXRBbGxQcm92aWRlcnMoSW5qZWN0aW9uTWFuYWdlciwgQ2xhc3MpfSkgb3Ige0Bjb2RlICNERUZBVUxUX0FTWU5DX0RFTEVHQVRFfSBpZgorICAgICAqIG90aGVyIGRlbGVnYXRlIGNhbm5vdCBiZSBmb3VuZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBub24tbnVsbCBBc3luY0NvbnRleHREZWxlZ2F0ZVByb3ZpZGVyLgorICAgICAqLworICAgIHByaXZhdGUgQXN5bmNDb250ZXh0RGVsZWdhdGVQcm92aWRlciBnZXRBc3luY0V4dGVuc2lvbkRlbGVnYXRlKCkgeworICAgICAgICBmaW5hbCBJdGVyYXRvcjxBc3luY0NvbnRleHREZWxlZ2F0ZVByb3ZpZGVyPiBwcm92aWRlcnMgPSBQcm92aWRlcnMuZ2V0QWxsUHJvdmlkZXJzKGFwcEhhbmRsZXIuZ2V0SW5qZWN0aW9uTWFuYWdlcigpLAorICAgICAgICAgICAgICAgIEFzeW5jQ29udGV4dERlbGVnYXRlUHJvdmlkZXIuY2xhc3MpLml0ZXJhdG9yKCk7CisgICAgICAgIGlmIChwcm92aWRlcnMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICByZXR1cm4gcHJvdmlkZXJzLm5leHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAocmVxdWVzdCwgcmVzcG9uc2UpIC0+IERFRkFVTFRfQVNZTkNfREVMRUdBVEU7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoIkphdmFEb2MiKQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEh0dHBTZXJ2bGV0UmVxdWVzdFJlZmVyZW5jaW5nRmFjdG9yeSBleHRlbmRzIFJlZmVyZW5jaW5nRmFjdG9yeTxIdHRwU2VydmxldFJlcXVlc3Q+IHsKKworICAgICAgICBASW5qZWN0CisgICAgICAgIHB1YmxpYyBIdHRwU2VydmxldFJlcXVlc3RSZWZlcmVuY2luZ0ZhY3RvcnkoZmluYWwgUHJvdmlkZXI8UmVmPEh0dHBTZXJ2bGV0UmVxdWVzdD4+IHJlZmVyZW5jZUZhY3RvcnkpIHsKKyAgICAgICAgICAgIHN1cGVyKHJlZmVyZW5jZUZhY3RvcnkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoIkphdmFEb2MiKQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEh0dHBTZXJ2bGV0UmVzcG9uc2VSZWZlcmVuY2luZ0ZhY3RvcnkgZXh0ZW5kcyBSZWZlcmVuY2luZ0ZhY3Rvcnk8SHR0cFNlcnZsZXRSZXNwb25zZT4geworCisgICAgICAgIEBJbmplY3QKKyAgICAgICAgcHVibGljIEh0dHBTZXJ2bGV0UmVzcG9uc2VSZWZlcmVuY2luZ0ZhY3RvcnkoZmluYWwgUHJvdmlkZXI8UmVmPEh0dHBTZXJ2bGV0UmVzcG9uc2U+PiByZWZlcmVuY2VGYWN0b3J5KSB7CisgICAgICAgICAgICBzdXBlcihyZWZlcmVuY2VGYWN0b3J5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgY2xhc3MgV2ViQ29tcG9uZW50QmluZGVyIGV4dGVuZHMgQWJzdHJhY3RCaW5kZXIgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBhcHBsaWNhdGlvblByb3BlcnRpZXM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBiaW5kZXIgZm9yIHtAbGluayBXZWJDb21wb25lbnR9IHBhc3NpbmcgYSBtYXAgb2YgcHJvcGVydGllcyB0byBkZXRlcm1pbmUgd2hldGhlciBjZXJ0YWluIGZlYXR1cmVzIGFyZSBhbGxvd2VkCisgICAgICAgICAqIG9yCisgICAgICAgICAqIG5vdC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFwcGxpY2F0aW9uUHJvcGVydGllcyBtYXAgb2YgcHJvcGVydGllcyB0byBkZXRlcm1pbmUgd2hldGhlciBjZXJ0YWluIGZlYXR1cmVzIGFyZSBhbGxvd2VkIG9yIG5vdC4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgV2ViQ29tcG9uZW50QmluZGVyKGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gYXBwbGljYXRpb25Qcm9wZXJ0aWVzKSB7CisgICAgICAgICAgICB0aGlzLmFwcGxpY2F0aW9uUHJvcGVydGllcyA9IGFwcGxpY2F0aW9uUHJvcGVydGllczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisKKyAgICAgICAgICAgIGlmICghcmVxdWVzdFJlc3BvbnNlQmluZGluZ0V4dGVybmFsaXplZCkgeworCisgICAgICAgICAgICAgICAgLy8gcmVxdWVzdAorICAgICAgICAgICAgICAgIGJpbmRGYWN0b3J5KEh0dHBTZXJ2bGV0UmVxdWVzdFJlZmVyZW5jaW5nRmFjdG9yeS5jbGFzcykudG8oSHR0cFNlcnZsZXRSZXF1ZXN0LmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgLnByb3h5KHRydWUpLnByb3h5Rm9yU2FtZVNjb3BlKGZhbHNlKS5pbihSZXF1ZXN0U2NvcGVkLmNsYXNzKTsKKworICAgICAgICAgICAgICAgIGJpbmRGYWN0b3J5KFJlZmVyZW5jaW5nRmFjdG9yeS5yZWZlcmVuY2VGYWN0b3J5KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAudG8obmV3IEdlbmVyaWNUeXBlPFJlZjxIdHRwU2VydmxldFJlcXVlc3Q+PigpIHt9KS5pbihSZXF1ZXN0U2NvcGVkLmNsYXNzKTsKKworICAgICAgICAgICAgICAgIC8vIHJlc3BvbnNlCisgICAgICAgICAgICAgICAgYmluZEZhY3RvcnkoSHR0cFNlcnZsZXRSZXNwb25zZVJlZmVyZW5jaW5nRmFjdG9yeS5jbGFzcykudG8oSHR0cFNlcnZsZXRSZXNwb25zZS5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5wcm94eSh0cnVlKS5wcm94eUZvclNhbWVTY29wZShmYWxzZSkuaW4oUmVxdWVzdFNjb3BlZC5jbGFzcyk7CisgICAgICAgICAgICAgICAgYmluZEZhY3RvcnkoUmVmZXJlbmNpbmdGYWN0b3J5LnJlZmVyZW5jZUZhY3RvcnkoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC50byhuZXcgR2VuZXJpY1R5cGU8UmVmPEh0dHBTZXJ2bGV0UmVzcG9uc2U+PigpIHt9KS5pbihSZXF1ZXN0U2NvcGVkLmNsYXNzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmluZEZhY3Rvcnkod2ViQ29uZmlnOjpnZXRTZXJ2bGV0Q29udGV4dCkudG8oU2VydmxldENvbnRleHQuY2xhc3MpLmluKFNpbmdsZXRvbi5jbGFzcyk7CisKKyAgICAgICAgICAgIGZpbmFsIFNlcnZsZXRDb25maWcgc2VydmxldENvbmZpZyA9IHdlYkNvbmZpZy5nZXRTZXJ2bGV0Q29uZmlnKCk7CisgICAgICAgICAgICBpZiAod2ViQ29uZmlnLmdldENvbmZpZ1R5cGUoKSA9PSBXZWJDb25maWcuQ29uZmlnVHlwZS5TZXJ2bGV0Q29uZmlnKSB7CisgICAgICAgICAgICAgICAgYmluZEZhY3RvcnkoKCkgLT4gc2VydmxldENvbmZpZykudG8oU2VydmxldENvbmZpZy5jbGFzcykuaW4oU2luZ2xldG9uLmNsYXNzKTsKKworICAgICAgICAgICAgICAgIC8vIEBQZXJzaXN0ZW5jZVVuaXQKKyAgICAgICAgICAgICAgICBmaW5hbCBFbnVtZXJhdGlvbiBpbml0UGFyYW1zID0gc2VydmxldENvbmZpZy5nZXRJbml0UGFyYW1ldGVyTmFtZXMoKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaW5pdFBhcmFtcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaW5pdFBhcmFtTmFtZSA9IChTdHJpbmcpIGluaXRQYXJhbXMubmV4dEVsZW1lbnQoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoaW5pdFBhcmFtTmFtZS5zdGFydHNXaXRoKFBlcnNpc3RlbmNlVW5pdEJpbmRlci5QRVJTSVNURU5DRV9VTklUX1BSRUZJWCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbGwobmV3IFBlcnNpc3RlbmNlVW5pdEJpbmRlcihzZXJ2bGV0Q29uZmlnKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYmluZEZhY3Rvcnkod2ViQ29uZmlnOjpnZXRGaWx0ZXJDb25maWcpLnRvKEZpbHRlckNvbmZpZy5jbGFzcykuaW4oU2luZ2xldG9uLmNsYXNzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYmluZEZhY3RvcnkoKCkgLT4gd2ViQ29uZmlnKS50byhXZWJDb25maWcuY2xhc3MpLmluKFNpbmdsZXRvbi5jbGFzcyk7CisKKyAgICAgICAgICAgIGluc3RhbGwobmV3IFNlcnZpY2VGaW5kZXJCaW5kZXI8PihBc3luY0NvbnRleHREZWxlZ2F0ZVByb3ZpZGVyLmNsYXNzLCBhcHBsaWNhdGlvblByb3BlcnRpZXMsIFJ1bnRpbWVUeXBlLlNFUlZFUikpOworICAgICAgICAgICAgaW5zdGFsbChuZXcgU2VydmljZUZpbmRlckJpbmRlcjw+KEZpbHRlclVybE1hcHBpbmdzUHJvdmlkZXIuY2xhc3MsIGFwcGxpY2F0aW9uUHJvcGVydGllcywgUnVudGltZVR5cGUuU0VSVkVSKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBKZXJzZXkgYXBwbGljYXRpb24gaGFuZGxlci4KKyAgICAgKi8KKyAgICBmaW5hbCBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwSGFuZGxlcjsKKworICAgIC8qKgorICAgICAqIEplcnNleSBiYWNrZ3JvdW5kIHRhc2sgc2NoZWR1bGVyIC0gdXNlZCBmb3Igc2NoZWR1bGluZyByZXF1ZXN0IHRpbWVvdXQgZXZlbnQgaGFuZGxpbmcgdGFza3MuCisgICAgICovCisgICAgZmluYWwgU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlIGJhY2tncm91bmRUYXNrU2NoZWR1bGVyOworCisgICAgLyoqCisgICAgICogV2ViIGNvbXBvbmVudCBjb25maWd1cmF0aW9uLgorICAgICAqLworICAgIGZpbmFsIFdlYkNvbmZpZyB3ZWJDb25maWc7CisKKyAgICAvKioKKyAgICAgKiBJZiB7QGNvZGUgdHJ1ZX0gYW5kIGRlcGxveWVkIGFzIGZpbHRlciwgdGhlIHVubWF0Y2hlZCByZXF1ZXN0cyB3aWxsIGJlIGZvcndhcmRlZC4KKyAgICAgKi8KKyAgICBmaW5hbCBib29sZWFuIGZvcndhcmRPbjQwNDsKKworICAgIC8qKgorICAgICAqIENhY2hlZCB2YWx1ZSBvZiBjb25maWd1cmF0aW9uIHByb3BlcnR5CisgICAgICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzI1JFU1BPTlNFX1NFVF9TVEFUVVNfT1ZFUl9TRU5EX0VSUk9SfS4KKyAgICAgKiBJZiB7QGNvZGUgdHJ1ZX0gbWV0aG9kIHtAbGluayBIdHRwU2VydmxldFJlc3BvbnNlI3NldFN0YXR1c30gaXMgdXNlZCBvdmVyIHtAbGluayBIdHRwU2VydmxldFJlc3BvbnNlI3NlbmRFcnJvcn0uCisgICAgICovCisgICAgZmluYWwgYm9vbGVhbiBjb25maWdTZXRTdGF0dXNPdmVyU2VuZEVycm9yOworCisgICAgLyoqCisgICAgICogQXN5bmNocm9ub3VzIGNvbnRleHQgZGVsZWdhdGUgcHJvdmlkZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBBc3luY0NvbnRleHREZWxlZ2F0ZVByb3ZpZGVyIGFzeW5jRXh0ZW5zaW9uRGVsZWdhdGU7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIHdoZXRoZXIgcXVlcnkgcGFyYW1ldGVycyBzaG91bGQgYmUga2VwdCBhcyBlbnRpdHkgZm9ybSBwYXJhbXMgaWYgYSBzZXJ2bGV0IGZpbHRlciBjb25zdW1lcyBlbnRpdHkgYW5kCisgICAgICogSmVyc2V5IGhhcyB0byByZXRyaWV2ZSBmb3JtIHBhcmFtcyBmcm9tIHNlcnZsZXQgcmVxdWVzdCBwYXJhbWV0ZXJzLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBxdWVyeVBhcmFtc0FzRm9ybVBhcmFtczsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbmQgaW5pdGlhbGl6ZSBuZXcgd2ViIGNvbXBvbmVudCBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3ZWJDb25maWcgICAgICB3ZSBjb21wb25lbnQgY29uZmlndXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VDb25maWcgSmVyc2V5IGFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24uCisgICAgICogQHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIGluIGNhc2UgdGhlIEplcnNleSBhcHBsaWNhdGlvbiBjYW5ub3QgYmUgY3JlYXRlZCBmcm9tIHRoZSBzdXBwbGllZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZSBjb25maWd1cmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBXZWJDb21wb25lbnQoZmluYWwgV2ViQ29uZmlnIHdlYkNvbmZpZywgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICB0aGlzLndlYkNvbmZpZyA9IHdlYkNvbmZpZzsKKworICAgICAgICBpZiAocmVzb3VyY2VDb25maWcgPT0gbnVsbCkgeworICAgICAgICAgICAgcmVzb3VyY2VDb25maWcgPSBjcmVhdGVSZXNvdXJjZUNvbmZpZyh3ZWJDb25maWcpOworICAgICAgICB9CisKKworICAgICAgICBmaW5hbCBTZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXJbXSBhbGxTZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXJzID0KKyAgICAgICAgICAgICAgICBTZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXJGYWN0b3J5LmdldEFsbFNlcnZsZXRDb250YWluZXJQcm92aWRlcnMoKTsKKworICAgICAgICAvLyBTUEkvZXh0ZW5zaW9uIGhvb2sgdG8gY29uZmlndXJlIFJlc291cmNlQ29uZmlnCisgICAgICAgIGNvbmZpZ3VyZShyZXNvdXJjZUNvbmZpZywgYWxsU2VydmxldENvbnRhaW5lclByb3ZpZGVycyk7CisKKyAgICAgICAgYm9vbGVhbiBycmJFeHRlcm5hbGl6ZWQgPSBmYWxzZTsKKyAgICAgICAgUmVxdWVzdFNjb3BlZEluaXRpYWxpemVyUHJvdmlkZXIgcnNpUHJvdmlkZXIgPSBudWxsOworCisgICAgICAgIGZvciAoZmluYWwgU2VydmxldENvbnRhaW5lclByb3ZpZGVyIHNlcnZsZXRDb250YWluZXJQcm92aWRlciA6IGFsbFNlcnZsZXRDb250YWluZXJQcm92aWRlcnMpIHsKKyAgICAgICAgICAgIGlmIChzZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXIgaW5zdGFuY2VvZiBFeHRlbmRlZFNlcnZsZXRDb250YWluZXJQcm92aWRlcikgeworICAgICAgICAgICAgICAgIGZpbmFsIEV4dGVuZGVkU2VydmxldENvbnRhaW5lclByb3ZpZGVyIGV4dGVuZGVkUHJvdmlkZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgKEV4dGVuZGVkU2VydmxldENvbnRhaW5lclByb3ZpZGVyKSBzZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXI7CisKKyAgICAgICAgICAgICAgICBpZiAoZXh0ZW5kZWRQcm92aWRlci5iaW5kc1NlcnZsZXRSZXF1ZXN0UmVzcG9uc2UoKSkgeworICAgICAgICAgICAgICAgICAgICBycmJFeHRlcm5hbGl6ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocnNpUHJvdmlkZXIgPT0gbnVsbCkgeyAvLyB0cnkgdG8gdGFrZSB0aGUgZmlyc3Qgbm9uLW51bGwgcHJvdmlkZXIKKyAgICAgICAgICAgICAgICAgICAgcnNpUHJvdmlkZXIgPSBleHRlbmRlZFByb3ZpZGVyLmdldFJlcXVlc3RTY29wZWRJbml0aWFsaXplclByb3ZpZGVyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmVxdWVzdFNjb3BlZEluaXRpYWxpemVyID0gcnNpUHJvdmlkZXIgIT0gbnVsbCA/IHJzaVByb3ZpZGVyIDogREVGQVVMVF9SRVFVRVNUX1NDT1BFX0lOSVRJQUxJWkVSX1BST1ZJREVSOworICAgICAgICByZXF1ZXN0UmVzcG9uc2VCaW5kaW5nRXh0ZXJuYWxpemVkID0gcnJiRXh0ZXJuYWxpemVkOworCisgICAgICAgIGZpbmFsIEFic3RyYWN0QmluZGVyIHdlYkNvbXBvbmVudEJpbmRlciA9IG5ldyBXZWJDb21wb25lbnRCaW5kZXIocmVzb3VyY2VDb25maWcuZ2V0UHJvcGVydGllcygpKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucmVnaXN0ZXIod2ViQ29tcG9uZW50QmluZGVyKTsKKworICAgICAgICBmaW5hbCBPYmplY3QgbG9jYXRvciA9IHdlYkNvbmZpZy5nZXRTZXJ2bGV0Q29udGV4dCgpCisgICAgICAgICAgICAgICAgLmdldEF0dHJpYnV0ZShTZXJ2bGV0UHJvcGVydGllcy5TRVJWSUNFX0xPQ0FUT1IpOworCisgICAgICAgIHRoaXMuYXBwSGFuZGxlciA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIocmVzb3VyY2VDb25maWcsIHdlYkNvbXBvbmVudEJpbmRlciwgbG9jYXRvcik7CisKKyAgICAgICAgdGhpcy5hc3luY0V4dGVuc2lvbkRlbGVnYXRlID0gZ2V0QXN5bmNFeHRlbnNpb25EZWxlZ2F0ZSgpOworICAgICAgICB0aGlzLmZvcndhcmRPbjQwNCA9IHdlYkNvbmZpZy5nZXRDb25maWdUeXBlKCkgPT0gV2ViQ29uZmlnLkNvbmZpZ1R5cGUuRmlsdGVyQ29uZmlnCisgICAgICAgICAgICAgICAgJiYgcmVzb3VyY2VDb25maWcuaXNQcm9wZXJ0eShTZXJ2bGV0UHJvcGVydGllcy5GSUxURVJfRk9SV0FSRF9PTl80MDQpOworICAgICAgICB0aGlzLnF1ZXJ5UGFyYW1zQXNGb3JtUGFyYW1zID0gIXJlc291cmNlQ29uZmlnLmlzUHJvcGVydHkoU2VydmxldFByb3BlcnRpZXMuUVVFUllfUEFSQU1TX0FTX0ZPUk1fUEFSQU1TX0RJU0FCTEVEKTsKKyAgICAgICAgdGhpcy5jb25maWdTZXRTdGF0dXNPdmVyU2VuZEVycm9yID0gU2VydmVyUHJvcGVydGllcy5nZXRWYWx1ZShyZXNvdXJjZUNvbmZpZy5nZXRQcm9wZXJ0aWVzKCksCisgICAgICAgICAgICAgICAgU2VydmVyUHJvcGVydGllcy5SRVNQT05TRV9TRVRfU1RBVFVTX09WRVJfU0VORF9FUlJPUiwgZmFsc2UsIEJvb2xlYW4uY2xhc3MpOworICAgICAgICB0aGlzLmJhY2tncm91bmRUYXNrU2NoZWR1bGVyID0gYXBwSGFuZGxlci5nZXRJbmplY3Rpb25NYW5hZ2VyKCkKKyAgICAgICAgICAgICAgICAuZ2V0SW5zdGFuY2UoU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlLmNsYXNzLCBCYWNrZ3JvdW5kU2NoZWR1bGVyTGl0ZXJhbC5JTlNUQU5DRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGlzcGF0Y2ggY2xpZW50IHJlcXVlc3RzIHRvIGEgcmVzb3VyY2UgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmFzZVVyaSAgICAgICAgIHRoZSBiYXNlIFVSSSBvZiB0aGUgcmVxdWVzdC4KKyAgICAgKiBAcGFyYW0gcmVxdWVzdFVyaSAgICAgIHRoZSBVUkkgb2YgdGhlIHJlcXVlc3QuCisgICAgICogQHBhcmFtIHNlcnZsZXRSZXF1ZXN0ICB0aGUge0BsaW5rIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3R9IG9iamVjdCB0aGF0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICBjb250YWlucyB0aGUgcmVxdWVzdCB0aGUgY2xpZW50IG1hZGUgdG8KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBXZWIgY29tcG9uZW50LgorICAgICAqIEBwYXJhbSBzZXJ2bGV0UmVzcG9uc2UgdGhlIHtAbGluayBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZX0gb2JqZWN0IHRoYXQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIHRoZSByZXNwb25zZSB0aGUgV2ViIGNvbXBvbmVudCByZXR1cm5zCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgY2xpZW50LgorICAgICAqIEByZXR1cm4gbGF6aWx5IGluaXRpYWxpemVkIHJlc3BvbnNlIHN0YXR1cyBjb2RlIHtAbGluayBWYWx1ZSB2YWx1ZSBwcm92aWRlcn0uIElmIG5vdCByZXNvbHZlZCBpbiB0aGUgbW9tZW50IG9mIGNhbGwgdG8KKyAgICAgKiB7QGxpbmsgVmFsdWUjZ2V0KCl9LCB7QGNvZGUgLTF9IGlzIHJldHVybmVkLgorICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiAgICAgICAgICAgIGlmIGFuIGlucHV0IG9yIG91dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSB0aGUgV2ViIGNvbXBvbmVudCBpcyBoYW5kbGluZyB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVFRQIHJlcXVlc3QuCisgICAgICogQHRocm93cyBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb24gaWYgdGhlIEhUVFAgcmVxdWVzdCBjYW5ub3QgYmUgaGFuZGxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVmFsdWU8SW50ZWdlcj4gc2VydmljZSgKKyAgICAgICAgICAgIGZpbmFsIFVSSSBiYXNlVXJpLAorICAgICAgICAgICAgZmluYWwgVVJJIHJlcXVlc3RVcmksCisgICAgICAgICAgICBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3Qgc2VydmxldFJlcXVlc3QsCisgICAgICAgICAgICBmaW5hbCBIdHRwU2VydmxldFJlc3BvbnNlIHNlcnZsZXRSZXNwb25zZSkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2VXcml0ZXIgcmVzcG9uc2VXcml0ZXIgPSBzZXJ2aWNlSW1wbChiYXNlVXJpLCByZXF1ZXN0VXJpLCBzZXJ2bGV0UmVxdWVzdCwgc2VydmxldFJlc3BvbnNlKTsKKyAgICAgICAgcmV0dXJuIFZhbHVlcy5sYXp5KG5ldyBWYWx1ZTxJbnRlZ2VyPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEludGVnZXIgZ2V0KCkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZVdyaXRlci5yZXNwb25zZUNvbnRleHRSZXNvbHZlZCgpID8gcmVzcG9uc2VXcml0ZXIuZ2V0UmVzcG9uc2VTdGF0dXMoKSA6IC0xOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNwYXRjaCBjbGllbnQgcmVxdWVzdHMgdG8gYSByZXNvdXJjZSBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiYXNlVXJpICAgICAgICAgdGhlIGJhc2UgVVJJIG9mIHRoZSByZXF1ZXN0LgorICAgICAqIEBwYXJhbSByZXF1ZXN0VXJpICAgICAgdGhlIFVSSSBvZiB0aGUgcmVxdWVzdC4KKyAgICAgKiBAcGFyYW0gc2VydmxldFJlcXVlc3QgIHRoZSB7QGxpbmsgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdH0gb2JqZWN0IHRoYXQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIHRoZSByZXF1ZXN0IHRoZSBjbGllbnQgbWFkZSB0bworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgdGhlIFdlYiBjb21wb25lbnQuCisgICAgICogQHBhcmFtIHNlcnZsZXRSZXNwb25zZSB0aGUge0BsaW5rIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlfSBvYmplY3QgdGhhdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgdGhlIHJlc3BvbnNlIHRoZSBXZWIgY29tcG9uZW50IHJldHVybnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBjbGllbnQuCisgICAgICogQHJldHVybiByZXR1cm5zIHtAbGluayBSZXNwb25zZVdyaXRlcn0sIFNlcnZsZXQncyB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5Db250YWluZXJSZXNwb25zZVdyaXRlcn0KKyAgICAgKiAgICAgICAgIGltcGxlbWVudGF0aW9uLCBpbnRvIHdoaWNoIHByb2Nlc3NlZCByZXF1ZXN0IHJlc3BvbnNlIHdhcyB3cml0dGVuIHRvLgorICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiAgICAgICAgICAgIGlmIGFuIGlucHV0IG9yIG91dHB1dCBlcnJvciBvY2N1cnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSB0aGUgV2ViIGNvbXBvbmVudCBpcyBoYW5kbGluZyB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVFRQIHJlcXVlc3QuCisgICAgICogQHRocm93cyBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb24gaWYgdGhlIEhUVFAgcmVxdWVzdCBjYW5ub3QgYmUgaGFuZGxlZC4KKyAgICAgKi8KKyAgICAgLyogcGFja2FnZSAqLyBSZXNwb25zZVdyaXRlciBzZXJ2aWNlSW1wbCgKKyAgICAgICAgICAgIGZpbmFsIFVSSSBiYXNlVXJpLAorICAgICAgICAgICAgZmluYWwgVVJJIHJlcXVlc3RVcmksCisgICAgICAgICAgICBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3Qgc2VydmxldFJlcXVlc3QsCisgICAgICAgICAgICBmaW5hbCBIdHRwU2VydmxldFJlc3BvbnNlIHNlcnZsZXRSZXNwb25zZSkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKworICAgICAgICBmaW5hbCBSZXNwb25zZVdyaXRlciByZXNwb25zZVdyaXRlciA9IG5ldyBSZXNwb25zZVdyaXRlcigKKyAgICAgICAgICAgICAgICBmb3J3YXJkT240MDQsCisgICAgICAgICAgICAgICAgY29uZmlnU2V0U3RhdHVzT3ZlclNlbmRFcnJvciwKKyAgICAgICAgICAgICAgICBzZXJ2bGV0UmVzcG9uc2UsCisgICAgICAgICAgICAgICAgYXN5bmNFeHRlbnNpb25EZWxlZ2F0ZS5jcmVhdGVEZWxlZ2F0ZShzZXJ2bGV0UmVxdWVzdCwgc2VydmxldFJlc3BvbnNlKSwKKyAgICAgICAgICAgICAgICBiYWNrZ3JvdW5kVGFza1NjaGVkdWxlcik7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIENvbnRhaW5lclJlcXVlc3QgcmVxdWVzdENvbnRleHQgPSBuZXcgQ29udGFpbmVyUmVxdWVzdChiYXNlVXJpLCByZXF1ZXN0VXJpLCBzZXJ2bGV0UmVxdWVzdC5nZXRNZXRob2QoKSwKKyAgICAgICAgICAgICAgICAgICAgZ2V0U2VjdXJpdHlDb250ZXh0KHNlcnZsZXRSZXF1ZXN0KSwgbmV3IFNlcnZsZXRQcm9wZXJ0aWVzRGVsZWdhdGUoc2VydmxldFJlcXVlc3QpKTsKKworICAgICAgICAgICAgaW5pdENvbnRhaW5lclJlcXVlc3QocmVxdWVzdENvbnRleHQsIHNlcnZsZXRSZXF1ZXN0LCBzZXJ2bGV0UmVzcG9uc2UsIHJlc3BvbnNlV3JpdGVyKTsKKworICAgICAgICAgICAgYXBwSGFuZGxlci5oYW5kbGUocmVxdWVzdENvbnRleHQpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBIZWFkZXJWYWx1ZUV4Y2VwdGlvbiBodmUpIHsKKyAgICAgICAgICAgIGlmIChMT0dHRVIuaXNMb2dnYWJsZShMZXZlbC5GSU5FKSkgeworICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuRklORSwgTG9jYWxpemF0aW9uTWVzc2FnZXMuSEVBREVSX1ZBTFVFX1JFQURfRkFJTEVEKCksIGh2ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlLlN0YXR1cyBzdGF0dXMgPSBSZXNwb25zZS5TdGF0dXMuQkFEX1JFUVVFU1Q7CisKKyAgICAgICAgICAgIGlmIChjb25maWdTZXRTdGF0dXNPdmVyU2VuZEVycm9yKSB7CisgICAgICAgICAgICAgICAgc2VydmxldFJlc3BvbnNlLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgLy9ub2luc3BlY3Rpb24gZGVwcmVjYXRpb24KKyAgICAgICAgICAgICAgICBzZXJ2bGV0UmVzcG9uc2Uuc2V0U3RhdHVzKHN0YXR1cy5nZXRTdGF0dXNDb2RlKCksIHN0YXR1cy5nZXRSZWFzb25QaHJhc2UoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNlcnZsZXRSZXNwb25zZS5zZW5kRXJyb3Ioc3RhdHVzLmdldFN0YXR1c0NvZGUoKSwgc3RhdHVzLmdldFJlYXNvblBocmFzZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXNwb25zZVdyaXRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHtAY29kZSBDb250YWluZXJSZXF1ZXN0fSBpbnN0YW5jZSB0byB1c2VkIHVzZWQgdG8gaGFuZGxlIHtAY29kZSBzZXJ2bGV0UmVxdWVzdH0uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGluaXRDb250YWluZXJSZXF1ZXN0KAorICAgICAgICAgICAgZmluYWwgQ29udGFpbmVyUmVxdWVzdCByZXF1ZXN0Q29udGV4dCwKKyAgICAgICAgICAgIGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCBzZXJ2bGV0UmVxdWVzdCwKKyAgICAgICAgICAgIGZpbmFsIEh0dHBTZXJ2bGV0UmVzcG9uc2Ugc2VydmxldFJlc3BvbnNlLAorICAgICAgICAgICAgZmluYWwgUmVzcG9uc2VXcml0ZXIgcmVzcG9uc2VXcml0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgcmVxdWVzdENvbnRleHQuc2V0RW50aXR5U3RyZWFtKHNlcnZsZXRSZXF1ZXN0LmdldElucHV0U3RyZWFtKCkpOworICAgICAgICByZXF1ZXN0Q29udGV4dC5zZXRSZXF1ZXN0U2NvcGVkSW5pdGlhbGl6ZXIocmVxdWVzdFNjb3BlZEluaXRpYWxpemVyLmdldChuZXcgUmVxdWVzdENvbnRleHRQcm92aWRlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEh0dHBTZXJ2bGV0UmVxdWVzdCBnZXRIdHRwU2VydmxldFJlcXVlc3QoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZsZXRSZXF1ZXN0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgSHR0cFNlcnZsZXRSZXNwb25zZSBnZXRIdHRwU2VydmxldFJlc3BvbnNlKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2bGV0UmVzcG9uc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0pKTsKKyAgICAgICAgcmVxdWVzdENvbnRleHQuc2V0V3JpdGVyKHJlc3BvbnNlV3JpdGVyKTsKKworICAgICAgICBhZGRSZXF1ZXN0SGVhZGVycyhzZXJ2bGV0UmVxdWVzdCwgcmVxdWVzdENvbnRleHQpOworICAgICAgICAvLyBDaGVjayBpZiBhbnkgc2VydmxldCBmaWx0ZXJzIGhhdmUgY29uc3VtZWQgYSByZXF1ZXN0IGVudGl0eQorICAgICAgICAvLyBvZiB0aGUgbWVkaWEgdHlwZSBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQKKyAgICAgICAgLy8gVGhpcyBjYW4gaGFwcGVuIGlmIGEgZmlsdGVyIGNhbGxzIHJlcXVlc3QuZ2V0UGFyYW1ldGVyKC4uLikKKyAgICAgICAgZmlsdGVyRm9ybVBhcmFtZXRlcnMoc2VydmxldFJlcXVlc3QsIHJlcXVlc3RDb250ZXh0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgZGVmYXVsdCB7QGxpbmsgamF2YXgud3MucnMuY29yZS5TZWN1cml0eUNvbnRleHR9IGZvciBnaXZlbiB7QGNvZGUgcmVxdWVzdH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBodHRwIHNlcnZsZXQgcmVxdWVzdCB0byBjcmVhdGUgYSBzZWN1cml0eSBjb250ZXh0IGZvci4KKyAgICAgKiBAcmV0dXJuIGEgbm9uLW51bGwgc2VjdXJpdHkgY29udGV4dCBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTZWN1cml0eUNvbnRleHQgZ2V0U2VjdXJpdHlDb250ZXh0KGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIHJldHVybiBuZXcgU2VjdXJpdHlDb250ZXh0KCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBQcmluY2lwYWwgZ2V0VXNlclByaW5jaXBhbCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRVc2VyUHJpbmNpcGFsKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNVc2VySW5Sb2xlKGZpbmFsIFN0cmluZyByb2xlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3QuaXNVc2VySW5Sb2xlKHJvbGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzU2VjdXJlKCkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXF1ZXN0LmlzU2VjdXJlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRBdXRoZW50aWNhdGlvblNjaGVtZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRBdXRoVHlwZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHtAbGluayBSZXNvdXJjZUNvbmZpZ30gaW5zdGFuY2UgZnJvbSBnaXZlbiB7QGxpbmsgV2ViQ29uZmlnfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25maWcgd2ViIGNvbmZpZyB0byBjcmVhdGUgcmVzb3VyY2UgY29uZmlnIGZyb20uCisgICAgICogQHJldHVybiByZXNvdXJjZSBjb25maWcgaW5zdGFuY2UuCisgICAgICogQHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIGlmIGFuIGVycm9yIGhhcyBvY2N1cnJlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUNvbmZpZyBjcmVhdGVSZXNvdXJjZUNvbmZpZyhmaW5hbCBXZWJDb25maWcgY29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFNlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0ID0gY29uZmlnLmdldFNlcnZsZXRDb250ZXh0KCk7CisKKyAgICAgICAgLy8gY2hlY2sgaWYgUmVzb3VyY2VDb25maWcgaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkLCBpZiBzbyB1c2UgaXQKKyAgICAgICAgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBVdGlscy5yZXRyaWV2ZShjb25maWcuZ2V0U2VydmxldENvbnRleHQoKSwgY29uZmlnLmdldE5hbWUoKSk7CisgICAgICAgIGlmIChyZXNvdXJjZUNvbmZpZyAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzb3VyY2VDb25maWc7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IGluaXRQYXJhbXMgPSBnZXRJbml0UGFyYW1zKGNvbmZpZyk7CisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gY29udGV4dFBhcmFtcyA9IFV0aWxzLmdldENvbnRleHRQYXJhbXMoc2VydmxldENvbnRleHQpOworCisgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBKQVgtUlMgYXBwbGljYXRpb24gY29uZmlnIGNsYXNzIHByb3BlcnR5IGlzIHByZXNlbnQKKyAgICAgICAgZmluYWwgU3RyaW5nIGpheHJzQXBwbGljYXRpb25DbGFzc05hbWUgPSBjb25maWcuZ2V0SW5pdFBhcmFtZXRlcihTZXJ2bGV0UHJvcGVydGllcy5KQVhSU19BUFBMSUNBVElPTl9DTEFTUyk7CisKKyAgICAgICAgaWYgKGpheHJzQXBwbGljYXRpb25DbGFzc05hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gSWYgbm8gcmVzb3VyY2UgY29uZmlnIGNsYXNzIHByb3BlcnR5IGlzIHByZXNlbnQsIGNyZWF0ZSBkZWZhdWx0IGNvbmZpZworICAgICAgICAgICAgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoKS5hZGRQcm9wZXJ0aWVzKGluaXRQYXJhbXMpLmFkZFByb3BlcnRpZXMoY29udGV4dFBhcmFtcyk7CisKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB3ZWJBcHAgPSBjb25maWcuZ2V0SW5pdFBhcmFtZXRlcihTZXJ2bGV0UHJvcGVydGllcy5QUk9WSURFUl9XRUJfQVBQKTsKKyAgICAgICAgICAgIGlmICh3ZWJBcHAgIT0gbnVsbCAmJiAhImZhbHNlIi5lcXVhbHMod2ViQXBwKSkgeworICAgICAgICAgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVyRmluZGVyKG5ldyBXZWJBcHBSZXNvdXJjZXNTY2FubmVyKHNlcnZsZXRDb250ZXh0KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzb3VyY2VDb25maWc7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb24+IGpheHJzQXBwbGljYXRpb25DbGFzcyA9IEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAorICAgICAgICAgICAgICAgICAgICBSZWZsZWN0aW9uSGVscGVyLjxqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uPmNsYXNzRm9yTmFtZVdpdGhFeGNlcHRpb25QRUEoamF4cnNBcHBsaWNhdGlvbkNsYXNzTmFtZSkKKyAgICAgICAgICAgICk7CisKKyAgICAgICAgICAgIGlmIChqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oamF4cnNBcHBsaWNhdGlvbkNsYXNzKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBSZXNvdXJjZUNvbmZpZy5mb3JBcHBsaWNhdGlvbkNsYXNzKGpheHJzQXBwbGljYXRpb25DbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRQcm9wZXJ0aWVzKGluaXRQYXJhbXMpLmFkZFByb3BlcnRpZXMoY29udGV4dFBhcmFtcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlJFU09VUkNFX0NPTkZJR19QQVJFTlRfQ0xBU1NfSU5WQUxJRCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGpheHJzQXBwbGljYXRpb25DbGFzc05hbWUsIGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb24uY2xhc3MpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoZmluYWwgUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmxldEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgTG9jYWxpemF0aW9uTWVzc2FnZXMuUkVTT1VSQ0VfQ09ORklHX1VOQUJMRV9UT19MT0FEKGpheHJzQXBwbGljYXRpb25DbGFzc05hbWUpLCBlLmdldENhdXNlKCkpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2bGV0RXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlJFU09VUkNFX0NPTkZJR19VTkFCTEVfVE9fTE9BRChqYXhyc0FwcGxpY2F0aW9uQ2xhc3NOYW1lKSwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTUEkvZXh0ZW5zaW9uIGhvb2sgdG8gY29uZmlndXJlIFJlc291cmNlQ29uZmlnLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlQ29uZmlnIEplcnNleSBhcHBsaWNhdGlvbiBjb25maWd1cmF0aW9uLgorICAgICAqIEB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBoYXMgb2NjdXJyZWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZShmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNlcnZsZXRDb250YWluZXJQcm92aWRlcltdIGFsbFNlcnZsZXRDb250YWluZXJQcm92aWRlcnMpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICBmb3IgKGZpbmFsIFNlcnZsZXRDb250YWluZXJQcm92aWRlciBzZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXIgOiBhbGxTZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXJzKSB7CisgICAgICAgICAgICBzZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXIuY29uZmlndXJlKHJlc291cmNlQ29uZmlnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvcHkgcmVxdWVzdCBoZWFkZXJzIHByZXNlbnQgaW4ge0Bjb2RlIHJlcXVlc3R9IGludG8ge0Bjb2RlIHJlcXVlc3RDb250ZXh0fSBpZ25vcmluZyB7QGNvZGUgbnVsbH0gdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgICAgICAgIGh0dHAgc2VydmxldCByZXF1ZXN0IHRvIGNvcHkgaGVhZGVycyBmcm9tLgorICAgICAqIEBwYXJhbSByZXF1ZXN0Q29udGV4dCBjb250YWluZXIgcmVxdWVzdCB0byBjb3B5IGhlYWRlcnMgdG8uCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHJpdmF0ZSB2b2lkIGFkZFJlcXVlc3RIZWFkZXJzKGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBmaW5hbCBDb250YWluZXJSZXF1ZXN0IHJlcXVlc3RDb250ZXh0KSB7CisgICAgICAgIGZpbmFsIEVudW1lcmF0aW9uPFN0cmluZz4gbmFtZXMgPSByZXF1ZXN0LmdldEhlYWRlck5hbWVzKCk7CisgICAgICAgIHdoaWxlIChuYW1lcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSBuYW1lcy5uZXh0RWxlbWVudCgpOworCisgICAgICAgICAgICBmaW5hbCBFbnVtZXJhdGlvbjxTdHJpbmc+IHZhbHVlcyA9IHJlcXVlc3QuZ2V0SGVhZGVycyhuYW1lKTsKKyAgICAgICAgICAgIHdoaWxlICh2YWx1ZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUgPSB2YWx1ZXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeyAvLyBmaWx0ZXIgb3V0IG51bGwgdmFsdWVzCisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LmhlYWRlcihuYW1lLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRXh0cmFjdCBpbml0IHBhcmFtcyBmcm9tIHtAbGluayBXZWJDb25maWd9LgorICAgICAqCisgICAgICogQHBhcmFtIHdlYkNvbmZpZyBhY3R1YWwgc2VydmxldCBjb250ZXh0LgorICAgICAqIEByZXR1cm4gbWFwIHJlcHJlc2VudGluZyBjdXJyZW50IGluaXQgcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldEluaXRQYXJhbXMoZmluYWwgV2ViQ29uZmlnIHdlYkNvbmZpZykgeworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BzID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBmaW5hbCBFbnVtZXJhdGlvbiBuYW1lcyA9IHdlYkNvbmZpZy5nZXRJbml0UGFyYW1ldGVyTmFtZXMoKTsKKyAgICAgICAgd2hpbGUgKG5hbWVzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIG5hbWVzLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBwcm9wcy5wdXQobmFtZSwgd2ViQ29uZmlnLmdldEluaXRQYXJhbWV0ZXIobmFtZSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwcm9wczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeHRyYWN0IHBhcmFtZXRlcnMgY29udGFpbmVkIGluIHtAbGluayBIdHRwU2VydmxldFJlcXVlc3Qgc2VydmxldCByZXF1ZXN0fSBhbmQgcHV0IHRoZW0gaW50bworICAgICAqIHtAbGluayBDb250YWluZXJSZXF1ZXN0IGNvbnRhaW5lciByZXF1ZXN0fSB1bmRlcgorICAgICAqIHtAdmFsdWUgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLkludGVybmFsU2VydmVyUHJvcGVydGllcyNGT1JNX0RFQ09ERURfUFJPUEVSVFl9IHByb3BlcnR5IChhcyB7QGxpbmsgRm9ybX0KKyAgICAgKiBpbnN0YW5jZSkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VydmxldFJlcXVlc3QgICBodHRwIHNlcnZsZXQgcmVxdWVzdCB0byBleHRyYWN0IHBhcmFtcyBmcm9tLgorICAgICAqIEBwYXJhbSBjb250YWluZXJSZXF1ZXN0IGNvbnRhaW5lciByZXF1ZXN0IHRvIHB1dCB7QGxpbmsgRm9ybX0gcHJvcGVydHkgdG8uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGZpbHRlckZvcm1QYXJhbWV0ZXJzKGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCBzZXJ2bGV0UmVxdWVzdCwgZmluYWwgQ29udGFpbmVyUmVxdWVzdCBjb250YWluZXJSZXF1ZXN0KSB7CisgICAgICAgIGlmIChNZWRpYVR5cGVzLnR5cGVFcXVhbChNZWRpYVR5cGUuQVBQTElDQVRJT05fRk9STV9VUkxFTkNPREVEX1RZUEUsIGNvbnRhaW5lclJlcXVlc3QuZ2V0TWVkaWFUeXBlKCkpCisgICAgICAgICAgICAgICAgJiYgIWNvbnRhaW5lclJlcXVlc3QuaGFzRW50aXR5KCkpIHsKKyAgICAgICAgICAgIGZpbmFsIEZvcm0gZm9ybSA9IG5ldyBGb3JtKCk7CisgICAgICAgICAgICBmaW5hbCBFbnVtZXJhdGlvbiBwYXJhbWV0ZXJOYW1lcyA9IHNlcnZsZXRSZXF1ZXN0LmdldFBhcmFtZXRlck5hbWVzKCk7CisKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBxdWVyeVN0cmluZyA9IHNlcnZsZXRSZXF1ZXN0LmdldFF1ZXJ5U3RyaW5nKCk7CisgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcXVlcnlQYXJhbXMgPSBxdWVyeVN0cmluZyAhPSBudWxsID8gZ2V0RGVjb2RlZFF1ZXJ5UGFyYW1MaXN0KHF1ZXJ5U3RyaW5nKQorICAgICAgICAgICAgICAgICAgICA6IENvbGxlY3Rpb25zLjxTdHJpbmc+ZW1wdHlMaXN0KCk7CisKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4ga2VlcFF1ZXJ5UGFyYW1zID0gcXVlcnlQYXJhbXNBc0Zvcm1QYXJhbXMgfHwgcXVlcnlQYXJhbXMuaXNFbXB0eSgpOworICAgICAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGZvcm1NYXAgPSBmb3JtLmFzTWFwKCk7CisKKyAgICAgICAgICAgIHdoaWxlIChwYXJhbWV0ZXJOYW1lcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gKFN0cmluZykgcGFyYW1ldGVyTmFtZXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gdmFsdWVzID0gQXJyYXlzLmFzTGlzdChzZXJ2bGV0UmVxdWVzdC5nZXRQYXJhbWV0ZXJWYWx1ZXMobmFtZSkpOworCisgICAgICAgICAgICAgICAgZm9ybU1hcC5wdXQobmFtZSwga2VlcFF1ZXJ5UGFyYW1zID8gdmFsdWVzIDogZmlsdGVyUXVlcnlQYXJhbXMobmFtZSwgdmFsdWVzLCBxdWVyeVBhcmFtcykpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWZvcm1NYXAuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgY29udGFpbmVyUmVxdWVzdC5zZXRQcm9wZXJ0eShJbnRlcm5hbFNlcnZlclByb3BlcnRpZXMuRk9STV9ERUNPREVEX1BST1BFUlRZLCBmb3JtKTsKKworICAgICAgICAgICAgICAgIGlmIChMT0dHRVIuaXNMb2dnYWJsZShMZXZlbC5XQVJOSU5HKSkgeworICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLldBUk5JTkcsIExvY2FsaXphdGlvbk1lc3NhZ2VzLkZPUk1fUEFSQU1fQ09OU1VNRUQoY29udGFpbmVyUmVxdWVzdC5nZXRSZXF1ZXN0VXJpKCkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBnZXREZWNvZGVkUXVlcnlQYXJhbUxpc3QoZmluYWwgU3RyaW5nIHF1ZXJ5U3RyaW5nKSB7CisgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBwYXJhbXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgcGFyYW0gOiBxdWVyeVN0cmluZy5zcGxpdCgiJiIpKSB7CisgICAgICAgICAgICBwYXJhbXMuYWRkKFVyaUNvbXBvbmVudC5kZWNvZGUocGFyYW0sIFVyaUNvbXBvbmVudC5UeXBlLlFVRVJZX1BBUkFNKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhcmFtczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGcm9tIGdpdmVuIGxpc3Qgb2YgdmFsdWVzIHJlbW92ZSB2YWx1ZXMgdGhhdCByZXByZXNlbnRzIHZhbHVlcyBvZiBxdWVyeSBwYXJhbXMgb2YgdGhlIHNhbWUgbmFtZSBhcyB0aGUgcHJvY2Vzc2VkIGZvcm0KKyAgICAgKiBwYXJhbWV0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSAgIG5hbWUgb2YgZm9ybS9xdWVyeSBwYXJhbWV0ZXIuCisgICAgICogQHBhcmFtIHZhbHVlcyB2YWx1ZXMgb2YgZm9ybS9xdWVyeSBwYXJhbWV0ZXIuCisgICAgICogQHBhcmFtIHBhcmFtcyBjb2xsZWN0aW9uIG9mIHVucHJvY2Vzc2VkIHF1ZXJ5IHBhcmFtZXRlcnMuCisgICAgICogQHJldHVybiBsaXN0IG9mIGZvcm0gcGFyYW0gdmFsdWVzIGZvciBnaXZlbiBuYW1lIHdpdGhvdXQgdmFsdWVzIG9mIHF1ZXJ5IHBhcmFtIG9mIHRoZSBzYW1lIG5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZmlsdGVyUXVlcnlQYXJhbXMoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIExpc3Q8U3RyaW5nPiB2YWx1ZXMsIGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiBwYXJhbXMpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlcy5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihzIC0+ICFwYXJhbXMucmVtb3ZlKG5hbWUgKyAiPSIgKyBzKSAmJiAhcGFyYW1zLnJlbW92ZShuYW1lICsgIltdPSIgKyBzKSkKKyAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB7QGxpbmsgQXBwbGljYXRpb25IYW5kbGVyfSB1c2VkIGJ5IHRoaXMgd2ViIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGFwcGxpY2F0aW9uIGhhbmRsZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgQXBwbGljYXRpb25IYW5kbGVyIGdldEFwcEhhbmRsZXIoKSB7CisgICAgICAgIHJldHVybiBhcHBIYW5kbGVyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lcnMvamVyc2V5LXNlcnZsZXQtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZsZXQvV2ViQ29uZmlnLmphdmEgYi9jb250YWluZXJzL2plcnNleS1zZXJ2bGV0LWNvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2bGV0L1dlYkNvbmZpZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNDY5YzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXJzL2plcnNleS1zZXJ2bGV0LWNvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2bGV0L1dlYkNvbmZpZy5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldDsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ29uZmlnOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbmZpZzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworCisvKioKKyAqIFRoZSBXZWIgY29uZmlndXJhdGlvbiBmb3IgYWNjZXNzaW5nIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgb2YgYSBXZWIKKyAqIGNvbXBvbmVudCBhbmQgdGhlIHtAbGluayBTZXJ2bGV0Q29udGV4dH0uCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitwdWJsaWMgaW50ZXJmYWNlIFdlYkNvbmZpZyB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgd2ViIGNvbmZpZ3VyYXRpb24gdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGVudW0gQ29uZmlnVHlwZSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBBIGNvbmZpZ3VyYXRpb24gdHlwZSBvZiBzZXJ2bGV0IGNvbmZpZ3VyYXRpb24uCisgICAgICAgICAqLworICAgICAgICBTZXJ2bGV0Q29uZmlnLAorICAgICAgICAvKioKKyAgICAgICAgICogQSBjb25maWd1cmF0aW9uIHR5cGUgb2YgZmlsdGVyIGNvbmZpZ3VyYXRpb24uCisgICAgICAgICAqLworICAgICAgICBGaWx0ZXJDb25maWcKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNvbmZpZ3VyYXRpb24gdHlwZSBvZiB0aGlzIGNvbmZpZy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGNvbmZpZ3VyYXRpb24gdHlwZS4KKyAgICAgKi8KKyAgICBDb25maWdUeXBlIGdldENvbmZpZ1R5cGUoKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY29ycmVzcG9uZGluZyBTZXJ2bGV0Q29uZmlnIGlmIHRoaXMgV2ViQ29uZmlnIHJlcHJlc2VudHMgYSB7QGxpbmsgU2VydmxldENvbmZpZ30KKyAgICAgKgorICAgICAqIEByZXR1cm4gc2VydmxldCBjb25maWcgb3IgbnVsbAorICAgICAqLworICAgIFNlcnZsZXRDb25maWcgZ2V0U2VydmxldENvbmZpZygpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjb3JyZXNwb25kaW5nIEZpbHRlckNvbmZpZyBpZiB0aGlzIFdlYkNvbmZpZyByZXByZXNlbnRzIGEge0BsaW5rIEZpbHRlckNvbmZpZ30KKyAgICAgKgorICAgICAqIEByZXR1cm4gZmlsdGVyIGNvbmZpZyBvciBudWxsCisgICAgICovCisgICAgRmlsdGVyQ29uZmlnIGdldEZpbHRlckNvbmZpZygpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBuYW1lIG9mIHRoZSBXZWIgY29tcG9uZW50LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgV2ViIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBTdHJpbmcgZ2V0TmFtZSgpOworCisgICAgLyoqCisgICAgICogR2V0IGFuIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBwYXJhbWV0ZXIgbmFtZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBwYXJhbWV0ZXIgdmFsdWUsIG9yIG51bGwgaWYgdGhlIHBhcmFtZXRlciBpcyBub3QgcHJlc2VudC4KKyAgICAgKi8KKyAgICBTdHJpbmcgZ2V0SW5pdFBhcmFtZXRlcihTdHJpbmcgbmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGVudW1lcmF0aW9uIG9mIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciBuYW1lcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGVudW1lcmF0aW9uIG9mIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlciBuYW1lcy4KKyAgICAgKi8KKyAgICBFbnVtZXJhdGlvbiBnZXRJbml0UGFyYW1ldGVyTmFtZXMoKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUge0BsaW5rIFNlcnZsZXRDb250ZXh0fS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBTZXJ2bGV0Q29udGV4dH0uCisgICAgICovCisgICAgU2VydmxldENvbnRleHQgZ2V0U2VydmxldENvbnRleHQoKTsKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lcnMvamVyc2V5LXNlcnZsZXQtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZsZXQvV2ViRmlsdGVyQ29uZmlnLmphdmEgYi9jb250YWluZXJzL2plcnNleS1zZXJ2bGV0LWNvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2bGV0L1dlYkZpbHRlckNvbmZpZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNzViODUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXJzL2plcnNleS1zZXJ2bGV0LWNvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2bGV0L1dlYkZpbHRlckNvbmZpZy5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldDsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ29uZmlnOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbmZpZzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworCisvKioKKyAqIEEgZmlsdGVyIGJhc2VkIHdlYiBjb25maWcuIERlbGVnYXRlcyBhbGwgaW52b2NhdGlvbnMgdG8gdGhlIGZpbHRlcgorICogY29uZmlndXJhdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IGFwaS4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIEd1aWxoZXJtZSBTaWx2ZWlyYQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgV2ViRmlsdGVyQ29uZmlnIGltcGxlbWVudHMgV2ViQ29uZmlnIHsKKworICAgIHByaXZhdGUgZmluYWwgRmlsdGVyQ29uZmlnIGZpbHRlckNvbmZpZzsKKworICAgIHB1YmxpYyBXZWJGaWx0ZXJDb25maWcoZmluYWwgRmlsdGVyQ29uZmlnIGZpbHRlckNvbmZpZykgeworICAgICAgICB0aGlzLmZpbHRlckNvbmZpZyA9IGZpbHRlckNvbmZpZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgV2ViQ29uZmlnLkNvbmZpZ1R5cGUgZ2V0Q29uZmlnVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIFdlYkNvbmZpZy5Db25maWdUeXBlLkZpbHRlckNvbmZpZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2VydmxldENvbmZpZyBnZXRTZXJ2bGV0Q29uZmlnKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRmlsdGVyQ29uZmlnIGdldEZpbHRlckNvbmZpZygpIHsKKyAgICAgICAgcmV0dXJuIGZpbHRlckNvbmZpZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBmaWx0ZXJDb25maWcuZ2V0RmlsdGVyTmFtZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5pdFBhcmFtZXRlcihmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gZmlsdGVyQ29uZmlnLmdldEluaXRQYXJhbWV0ZXIobmFtZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEVudW1lcmF0aW9uIGdldEluaXRQYXJhbWV0ZXJOYW1lcygpIHsKKyAgICAgICAgcmV0dXJuIGZpbHRlckNvbmZpZy5nZXRJbml0UGFyYW1ldGVyTmFtZXMoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2VydmxldENvbnRleHQgZ2V0U2VydmxldENvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBmaWx0ZXJDb25maWcuZ2V0U2VydmxldENvbnRleHQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXJzL2plcnNleS1zZXJ2bGV0LWNvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2bGV0L1dlYlNlcnZsZXRDb25maWcuamF2YSBiL2NvbnRhaW5lcnMvamVyc2V5LXNlcnZsZXQtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZsZXQvV2ViU2VydmxldENvbmZpZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMmE3YTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXJzL2plcnNleS1zZXJ2bGV0LWNvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2bGV0L1dlYlNlcnZsZXRDb25maWcuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlckNvbmZpZzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb25maWc7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKKworLyoqCisgKiBBIHNlcnZsZXQgYmFzZWQgd2ViIGNvbmZpZy4gRGVsZWdhdGVzIGFsbCBpbnZvY2F0aW9ucyB0byB0aGUgc2VydmxldAorICogY29uZmlndXJhdGlvbiBmcm9tIHRoZSBzZXJ2bGV0IGFwaS4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIGd1aWxoZXJtZSBzaWx2ZWlyYQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgV2ViU2VydmxldENvbmZpZyBpbXBsZW1lbnRzIFdlYkNvbmZpZyB7CisKKyAgICBwcml2YXRlIGZpbmFsIFNlcnZsZXRDb250YWluZXIgc2VydmxldDsKKworICAgIHB1YmxpYyBXZWJTZXJ2bGV0Q29uZmlnKGZpbmFsIFNlcnZsZXRDb250YWluZXIgc2VydmxldCkgeworICAgICAgICB0aGlzLnNlcnZsZXQgPSBzZXJ2bGV0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBXZWJDb25maWcuQ29uZmlnVHlwZSBnZXRDb25maWdUeXBlKCkgeworICAgICAgICByZXR1cm4gV2ViQ29uZmlnLkNvbmZpZ1R5cGUuU2VydmxldENvbmZpZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2VydmxldENvbmZpZyBnZXRTZXJ2bGV0Q29uZmlnKCkgeworICAgICAgICByZXR1cm4gc2VydmxldC5nZXRTZXJ2bGV0Q29uZmlnKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEZpbHRlckNvbmZpZyBnZXRGaWx0ZXJDb25maWcoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHNlcnZsZXQuZ2V0U2VydmxldE5hbWUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldEluaXRQYXJhbWV0ZXIoZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIHNlcnZsZXQuZ2V0SW5pdFBhcmFtZXRlcihuYW1lKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0SW5pdFBhcmFtZXRlck5hbWVzKCkgeworICAgICAgICByZXR1cm4gc2VydmxldC5nZXRJbml0UGFyYW1ldGVyTmFtZXMoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2VydmxldENvbnRleHQgZ2V0U2VydmxldENvbnRleHQoKSB7CisgICAgICAgIHJldHVybiBzZXJ2bGV0LmdldFNlcnZsZXRDb250ZXh0KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVycy9qZXJzZXktc2VydmxldC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmxldC9pbnRlcm5hbC9QZXJzaXN0ZW5jZVVuaXRCaW5kZXIuamF2YSBiL2NvbnRhaW5lcnMvamVyc2V5LXNlcnZsZXQtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZsZXQvaW50ZXJuYWwvUGVyc2lzdGVuY2VVbml0QmluZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE3OTVjNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lcnMvamVyc2V5LXNlcnZsZXQtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZsZXQvaW50ZXJuYWwvUGVyc2lzdGVuY2VVbml0QmluZGVyLmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlByb3h5OworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljVHlwZTsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW50aXR5TWFuYWdlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbmZpZzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5BYnN0cmFjdEJpbmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0ZWU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvblJlc29sdmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJFeGNlcHRpb247CisKKy8qKgorICoge0BsaW5rIFBlcnNpc3RlbmNlVW5pdCBQZXJzaXN0ZW5jZSB1bml0fSBpbmplY3Rpb24gYmluZGVyLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgUGVyc2lzdGVuY2VVbml0QmluZGVyIGV4dGVuZHMgQWJzdHJhY3RCaW5kZXIgeworCisgICAgcHJpdmF0ZSBmaW5hbCBTZXJ2bGV0Q29uZmlnIHNlcnZsZXRDb25maWc7CisKKyAgICAvKioKKyAgICAgKiBQcmVmaXggb2YgdGhlIHBlcnNpc3RlbmNlIHVuaXQgaW5pdCBwYXJhbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQRVJTSVNURU5DRV9VTklUX1BSRUZJWCA9ICJ1bml0OiI7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGJpbmRlciBmb3Ige0BsaW5rIFBlcnNpc3RlbmNlVW5pdEluamVjdGlvblJlc29sdmVyfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2bGV0Q29uZmlnIHNlcnZsZXQgY29uZmlnIHRvIGZpbmQgcGVyc2lzdGVuY2UgdW5pdHMuCisgICAgICovCisgICAgcHVibGljIFBlcnNpc3RlbmNlVW5pdEJpbmRlcihTZXJ2bGV0Q29uZmlnIHNlcnZsZXRDb25maWcpIHsKKyAgICAgICAgdGhpcy5zZXJ2bGV0Q29uZmlnID0gc2VydmxldENvbmZpZzsKKyAgICB9CisKKyAgICBAU2luZ2xldG9uCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGVyc2lzdGVuY2VVbml0SW5qZWN0aW9uUmVzb2x2ZXIgaW1wbGVtZW50cyBJbmplY3Rpb25SZXNvbHZlcjxQZXJzaXN0ZW5jZVVuaXQ+IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gcGVyc2lzdGVuY2VVbml0cyA9IG5ldyBIYXNoTWFwPD4oKTsKKworICAgICAgICBwcml2YXRlIFBlcnNpc3RlbmNlVW5pdEluamVjdGlvblJlc29sdmVyKFNlcnZsZXRDb25maWcgc2VydmxldENvbmZpZykgeworICAgICAgICAgICAgZm9yIChmaW5hbCBFbnVtZXJhdGlvbiBwYXJhbWV0ZXJOYW1lcyA9IHNlcnZsZXRDb25maWcuZ2V0SW5pdFBhcmFtZXRlck5hbWVzKCk7IHBhcmFtZXRlck5hbWVzLmhhc01vcmVFbGVtZW50cygpOyApIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcga2V5ID0gKFN0cmluZykgcGFyYW1ldGVyTmFtZXMubmV4dEVsZW1lbnQoKTsKKworICAgICAgICAgICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChQRVJTSVNURU5DRV9VTklUX1BSRUZJWCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcGVyc2lzdGVuY2VVbml0cy5wdXQoa2V5LnN1YnN0cmluZyhQRVJTSVNURU5DRV9VTklUX1BSRUZJWC5sZW5ndGgoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImphdmE6Y29tcC9lbnYvIiArIHNlcnZsZXRDb25maWcuZ2V0SW5pdFBhcmFtZXRlcihrZXkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE9iamVjdCByZXNvbHZlKEluamVjdGVlIGluamVjdGVlKSB7CisgICAgICAgICAgICBpZiAoIWluamVjdGVlLmdldFJlcXVpcmVkVHlwZSgpLmVxdWFscyhFbnRpdHlNYW5hZ2VyRmFjdG9yeS5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgUGVyc2lzdGVuY2VVbml0IGFubm90YXRpb24gPSBpbmplY3RlZS5nZXRQYXJlbnQoKS5nZXRBbm5vdGF0aW9uKFBlcnNpc3RlbmNlVW5pdC5jbGFzcyk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdW5pdE5hbWUgPSBhbm5vdGF0aW9uLnVuaXROYW1lKCk7CisKKyAgICAgICAgICAgIGlmICghcGVyc2lzdGVuY2VVbml0cy5jb250YWluc0tleSh1bml0TmFtZSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29udGFpbmVyRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlBFUlNJU1RFTkNFX1VOSVRfTk9UX0NPTkZJR1VSRUQodW5pdE5hbWUpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIFByb3h5Lm5ld1Byb3h5SW5zdGFuY2UoCisgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLAorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXSB7RW50aXR5TWFuYWdlckZhY3RvcnkuY2xhc3N9LAorICAgICAgICAgICAgICAgICAgICBuZXcgVGhyZWFkTG9jYWxOYW1lZEludm9rZXI8RW50aXR5TWFuYWdlckZhY3Rvcnk+KHBlcnNpc3RlbmNlVW5pdHMuZ2V0KHVuaXROYW1lKSkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ29uc3RydWN0b3JQYXJhbWV0ZXJJbmRpY2F0b3IoKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNNZXRob2RQYXJhbWV0ZXJJbmRpY2F0b3IoKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENsYXNzPFBlcnNpc3RlbmNlVW5pdD4gZ2V0QW5ub3RhdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBQZXJzaXN0ZW5jZVVuaXQuY2xhc3M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgIGJpbmQobmV3IFBlcnNpc3RlbmNlVW5pdEluamVjdGlvblJlc29sdmVyKHNlcnZsZXRDb25maWcpKQorICAgICAgICAgICAgICAgIC50byhuZXcgR2VuZXJpY1R5cGU8SW5qZWN0aW9uUmVzb2x2ZXI8UGVyc2lzdGVuY2VVbml0Pj4oKSB7fSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVycy9qZXJzZXktc2VydmxldC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmxldC9pbnRlcm5hbC9SZXNwb25zZVdyaXRlci5qYXZhIGIvY29udGFpbmVycy9qZXJzZXktc2VydmxldC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmxldC9pbnRlcm5hbC9SZXNwb25zZVdyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NmViYjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXJzL2plcnNleS1zZXJ2bGV0LWNvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2bGV0L2ludGVybmFsL1Jlc3BvbnNlV3JpdGVyLmphdmEKQEAgLTAsMCArMSwzMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29tcGxldGFibGVGdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5KZXJzZXlSZXF1ZXN0VGltZW91dEhhbmRsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5Db250YWluZXJSZXNwb25zZVdyaXRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LnNwaS5Bc3luY0NvbnRleHREZWxlZ2F0ZTsKKworLyoqCisgKiBBbiBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgQ29udGFpbmVyUmVzcG9uc2VXcml0ZXJ9IGZvciBTZXJ2bGV0IGNvbnRhaW5lcnMuCisgKiBUaGUgd3JpdGVyIGRlcGVuZHMgb24gcHJvdmlkZWQge0BsaW5rIEFzeW5jQ29udGV4dERlbGVnYXRlfSB0byBzdXBwb3J0IGFzeW5jIGZ1bmN0aW9uYWxpdHkuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFJlc3BvbnNlV3JpdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVzcG9uc2VXcml0ZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoUmVzcG9uc2VXcml0ZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIHByaXZhdGUgZmluYWwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZTsKKyAgICAvKioKKyAgICAgKiBDYWNoZWQgdmFsdWUgb2YgY29uZmlndXJhdGlvbiBwcm9wZXJ0eQorICAgICAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRQcm9wZXJ0aWVzI0ZJTFRFUl9GT1JXQVJEX09OXzQwNH0uCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHVzZVNldFN0YXR1c09uNDA0OworICAgIC8qKgorICAgICAqIENhY2hlZCB2YWx1ZSBvZiBjb25maWd1cmF0aW9uIHByb3BlcnR5CisgICAgICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzI1JFU1BPTlNFX1NFVF9TVEFUVVNfT1ZFUl9TRU5EX0VSUk9SfS4KKyAgICAgKiBJZiB7QGNvZGUgdHJ1ZX0gbWV0aG9kIHtAbGluayBIdHRwU2VydmxldFJlc3BvbnNlI3NldFN0YXR1c30gaXMgdXNlZCBvdmVyIHtAbGluayBIdHRwU2VydmxldFJlc3BvbnNlI3NlbmRFcnJvcn0uCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGNvbmZpZ1NldFN0YXR1c092ZXJTZW5kRXJyb3I7CisgICAgcHJpdmF0ZSBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTxDb250YWluZXJSZXNwb25zZT4gcmVzcG9uc2VDb250ZXh0OworICAgIHByaXZhdGUgZmluYWwgQXN5bmNDb250ZXh0RGVsZWdhdGUgYXN5bmNFeHQ7CisKKyAgICBwcml2YXRlIGZpbmFsIEplcnNleVJlcXVlc3RUaW1lb3V0SGFuZGxlciByZXF1ZXN0VGltZW91dEhhbmRsZXI7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIHRvIHdyaXRlIGEgc2luZ2xlIEplcnNleSByZXNwb25zZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VTZXRTdGF0dXNPbjQwNCAgICAgICAgICAgIHRydWUgaWYgc3RhdHVzIHNob3VsZCBiZSB3cml0dGVuIGV4cGxpY2l0bHkgd2hlbiA0MDQgaXMgcmV0dXJuZWQKKyAgICAgKiBAcGFyYW0gY29uZmlnU2V0U3RhdHVzT3ZlclNlbmRFcnJvciBpZiB7QGNvZGUgdHJ1ZX0gbWV0aG9kIHtAbGluayBIdHRwU2VydmxldFJlc3BvbnNlI3NldFN0YXR1c30gaXMgdXNlZCBvdmVyCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0BsaW5rIEh0dHBTZXJ2bGV0UmVzcG9uc2Ujc2VuZEVycm9yfQorICAgICAqIEBwYXJhbSByZXNwb25zZSAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsIEh0dHBSZXNwb25zZVJlcXVlc3QKKyAgICAgKiBAcGFyYW0gYXN5bmNFeHQgICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZSB0byB1c2UgZm9yIGFzeW5jIGZlYXR1cmVzIGltcGxlbWVudGF0aW9uCisgICAgICogQHBhcmFtIHRpbWVvdXRUYXNrRXhlY3V0b3IgICAgICAgICAgSmVyc2V5IHJ1bnRpbWUgZXhlY3V0b3IgdXNlZCBmb3IgYmFja2dyb3VuZCBleGVjdXRpb24gb2YgdGltZW91dAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsaW5nIHRhc2tzLgorICAgICAqLworICAgIHB1YmxpYyBSZXNwb25zZVdyaXRlcihmaW5hbCBib29sZWFuIHVzZVNldFN0YXR1c09uNDA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGNvbmZpZ1NldFN0YXR1c092ZXJTZW5kRXJyb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFzeW5jQ29udGV4dERlbGVnYXRlIGFzeW5jRXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UgdGltZW91dFRhc2tFeGVjdXRvcikgeworICAgICAgICB0aGlzLnVzZVNldFN0YXR1c09uNDA0ID0gdXNlU2V0U3RhdHVzT240MDQ7CisgICAgICAgIHRoaXMuY29uZmlnU2V0U3RhdHVzT3ZlclNlbmRFcnJvciA9IGNvbmZpZ1NldFN0YXR1c092ZXJTZW5kRXJyb3I7CisgICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTsKKyAgICAgICAgdGhpcy5hc3luY0V4dCA9IGFzeW5jRXh0OworICAgICAgICB0aGlzLnJlc3BvbnNlQ29udGV4dCA9IG5ldyBDb21wbGV0YWJsZUZ1dHVyZTw+KCk7CisKKyAgICAgICAgdGhpcy5yZXF1ZXN0VGltZW91dEhhbmRsZXIgPSBuZXcgSmVyc2V5UmVxdWVzdFRpbWVvdXRIYW5kbGVyKHRoaXMsIHRpbWVvdXRUYXNrRXhlY3V0b3IpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHN1c3BlbmQoZmluYWwgbG9uZyB0aW1lT3V0LCBmaW5hbCBUaW1lVW5pdCB0aW1lVW5pdCwgZmluYWwgVGltZW91dEhhbmRsZXIgdGltZW91dEhhbmRsZXIpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIFN1c3BlbmQgdGhlIHNlcnZsZXQuCisgICAgICAgICAgICBhc3luY0V4dC5zdXNwZW5kKCk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5XQVJOSU5HLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5TRVJWTEVUX1JFUVVFU1RfU1VTUEVORF9GQUlMRUQoKSwgZXgpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIC8vIFN1c3BlbmQgdGhlIGludGVybmFsIHJlcXVlc3QgdGltZW91dCBoYW5kbGVyLgorICAgICAgICByZXR1cm4gcmVxdWVzdFRpbWVvdXRIYW5kbGVyLnN1c3BlbmQodGltZU91dCwgdGltZVVuaXQsIHRpbWVvdXRIYW5kbGVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRTdXNwZW5kVGltZW91dChmaW5hbCBsb25nIHRpbWVPdXQsIGZpbmFsIFRpbWVVbml0IHRpbWVVbml0KSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgcmVxdWVzdFRpbWVvdXRIYW5kbGVyLnNldFN1c3BlbmRUaW1lb3V0KHRpbWVPdXQsIHRpbWVVbml0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIHdyaXRlUmVzcG9uc2VTdGF0dXNBbmRIZWFkZXJzKGZpbmFsIGxvbmcgY29udGVudExlbmd0aCwgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2VDb250ZXh0KQorICAgICAgICAgICAgdGhyb3dzIENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMucmVzcG9uc2VDb250ZXh0LmNvbXBsZXRlKHJlc3BvbnNlQ29udGV4dCk7CisKKyAgICAgICAgLy8gZmlyc3Qgc2V0IHRoZSBjb250ZW50IGxlbmd0aCwgc28gdGhhdCBpZiBoZWFkZXJzIGhhdmUgYW4gZXhwbGljaXQgdmFsdWUsIGl0IHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGlzIG9uZQorICAgICAgICBpZiAocmVzcG9uc2VDb250ZXh0Lmhhc0VudGl0eSgpICYmIGNvbnRlbnRMZW5ndGggIT0gLTEgJiYgY29udGVudExlbmd0aCA8IEludGVnZXIuTUFYX1ZBTFVFKSB7CisgICAgICAgICAgICByZXNwb25zZS5zZXRDb250ZW50TGVuZ3RoKChpbnQpIGNvbnRlbnRMZW5ndGgpOworICAgICAgICB9CisgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgd3JpdGluZyBvZiBoZWFkZXJzIE1VU1QgYmUgcGVyZm9ybWVkIGJlZm9yZQorICAgICAgICAvLyB0aGUgaW52b2NhdGlvbiBvZiBzZW5kRXJyb3IgYXMgb24gc29tZSBTZXJ2bGV0IGltcGxlbWVudGF0aW9ucworICAgICAgICAvLyBtb2RpZmljYXRpb24gb2YgdGhlIHJlc3BvbnNlIGhlYWRlcnMgd2lsbCBoYXZlIG5vIGVmZmVjdAorICAgICAgICAvLyBhZnRlciB0aGUgaW52b2NhdGlvbiBvZiBzZW5kRXJyb3IuCisgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzID0gZ2V0UmVzcG9uc2VDb250ZXh0KCkuZ2V0U3RyaW5nSGVhZGVycygpOworICAgICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZSA6IGhlYWRlcnMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgZmluYWwgSXRlcmF0b3I8U3RyaW5nPiBpdCA9IGUuZ2V0VmFsdWUoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgaWYgKCFpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBoZWFkZXIgPSBlLmdldEtleSgpOworICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmNvbnRhaW5zSGVhZGVyKGhlYWRlcikpIHsKKyAgICAgICAgICAgICAgICAvLyByZXBsYWNlIGFueSBoZWFkZXJzIHByZXZpb3VzbHkgc2V0IHdpdGggdmFsdWVzIGZyb20gSmVyc2V5IGNvbnRhaW5lciByZXNwb25zZS4KKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoaGVhZGVyLCBpdC5uZXh0KCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgcmVzcG9uc2UuYWRkSGVhZGVyKGhlYWRlciwgaXQubmV4dCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFN0cmluZyByZWFzb25QaHJhc2UgPSByZXNwb25zZUNvbnRleHQuZ2V0U3RhdHVzSW5mbygpLmdldFJlYXNvblBocmFzZSgpOworICAgICAgICBpZiAocmVhc29uUGhyYXNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhyZXNwb25zZUNvbnRleHQuZ2V0U3RhdHVzKCksIHJlYXNvblBocmFzZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMocmVzcG9uc2VDb250ZXh0LmdldFN0YXR1cygpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghcmVzcG9uc2VDb250ZXh0Lmhhc0VudGl0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpOworCisgICAgICAgICAgICAgICAgLy8gZGVsZWdhdGluZyBvdXRwdXQgc3RyZWFtIHByZXZlbnRzIGNsb3NpbmcgdGhlIHVuZGVybHlpbmcgc2VydmxldCBvdXRwdXQgc3RyZWFtLAorICAgICAgICAgICAgICAgIC8vIHNvIHRoYXQgYW55IFNlcnZsZXQgZmlsdGVycyBpbiB0aGUgY2hhaW4gY2FuIHN0aWxsIHdyaXRlIHRvIHRoZSByZXNwb25zZSBhZnRlciB1cy4KKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE5vbkNsb3NlYWJsZU91dHB1dFN0cmVhbVdyYXBwZXIob3V0cHV0U3RyZWFtKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29udGFpbmVyRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY29tbWl0KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2FsbFNlbmRFcnJvcigpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcmVxdWVzdFRpbWVvdXRIYW5kbGVyLmNsb3NlKCk7CisgICAgICAgICAgICBhc3luY0V4dC5jb21wbGV0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWNjb3JkaW5nIHRvIGNvbmZpZ3VyYXRpb24gYW5kIHJlc3BvbnNlIHByb2Nlc3Npbmcgc3RhdHVzIGl0IGNhbGxzIHtAbGluayBIdHRwU2VydmxldFJlc3BvbnNlI3NlbmRFcnJvcihpbnQsIFN0cmluZyl9IG92ZXIKKyAgICAgKiBjb21tb24ge0BsaW5rIEh0dHBTZXJ2bGV0UmVzcG9uc2Ujc2V0U3RhdHVzKGludCl9LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjYWxsU2VuZEVycm9yKCkgeworICAgICAgICAvLyBjYWxsIEh0dHBTZXJ2bGV0UmVzcG9uc2Uuc2VuZEVycm9yIGluIGNhc2U6CisgICAgICAgIC8vIC0gcHJvcGVydHkgU2VydmVyUHJvcGVydGllcyNSRVNQT05TRV9TRVRfU1RBVFVTX09WRVJfU0VORF9FUlJPUiA9PSBmYWxzZSAoZGVmYXVsdCkKKyAgICAgICAgLy8gLSByZXNwb25zZSBOT1QgeWV0IGNvbW1pdHRlZAorICAgICAgICAvLyAtIHJlc3BvbnNlIGVudGl0eSBOT1Qgc2V0CisgICAgICAgIC8vIC0gcmVzcG9uc2Ugc3RhdHVzIGNvZGUgaXMgNHh4IG9yIDV4eAorICAgICAgICAvLyBwbHVzIGluIGNhc2Ugb2YgSmVyc2V5IGFzIGEgRmlsdGVyIChKYWFGKToKKyAgICAgICAgLy8gLSByZXNwb25zZSBzdGF0dXMgY29kZSBpcyA0MDQgKE5vdCBGb3VuZCkKKyAgICAgICAgLy8gLSBwcm9wZXJ0eSBTZXJ2bGV0UHJvcGVydGllcyNGSUxURVJfRk9SV0FSRF9PTl80MDQgPT0gZmFsc2UgKGRlZmF1bHQpCisgICAgICAgIGlmICghY29uZmlnU2V0U3RhdHVzT3ZlclNlbmRFcnJvciAmJiAhcmVzcG9uc2UuaXNDb21taXR0ZWQoKSkgeworICAgICAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2VDb250ZXh0ID0gZ2V0UmVzcG9uc2VDb250ZXh0KCk7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGhhc0VudGl0eSA9IHJlc3BvbnNlQ29udGV4dC5oYXNFbnRpdHkoKTsKKyAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlLlN0YXR1c1R5cGUgc3RhdHVzID0gcmVzcG9uc2VDb250ZXh0LmdldFN0YXR1c0luZm8oKTsKKyAgICAgICAgICAgIGlmICghaGFzRW50aXR5ICYmIHN0YXR1cyAhPSBudWxsICYmIHN0YXR1cy5nZXRTdGF0dXNDb2RlKCkgPj0gNDAwCisgICAgICAgICAgICAgICAgJiYgISh1c2VTZXRTdGF0dXNPbjQwNCAmJiBzdGF0dXMgPT0gUmVzcG9uc2UuU3RhdHVzLk5PVF9GT1VORCkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVhc29uID0gc3RhdHVzLmdldFJlYXNvblBocmFzZSgpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZWFzb24gPT0gbnVsbCB8fCByZWFzb24uaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3Ioc3RhdHVzLmdldFN0YXR1c0NvZGUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3Ioc3RhdHVzLmdldFN0YXR1c0NvZGUoKSwgcmVhc29uKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb250YWluZXJFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxpemF0aW9uTWVzc2FnZXMuRVhDRVBUSU9OX1NFTkRJTkdfRVJST1JfUkVTUE9OU0Uoc3RhdHVzLCByZWFzb24gIT0gbnVsbCA/IHJlYXNvbiA6ICItLSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmYWlsdXJlKGZpbmFsIFRocm93YWJsZSBlcnJvcikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5pc0NvbW1pdHRlZCgpKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZ1NldFN0YXR1c092ZXJTZW5kRXJyb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvL25vaW5zcGVjdGlvbiBkZXByZWNhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzKFJlc3BvbnNlLlN0YXR1cy5JTlRFUk5BTF9TRVJWRVJfRVJST1IuZ2V0U3RhdHVzQ29kZSgpLCAiUmVxdWVzdCBmYWlsZWQuIik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoUmVzcG9uc2UuU3RhdHVzLklOVEVSTkFMX1NFUlZFUl9FUlJPUi5nZXRTdGF0dXNDb2RlKCksICJSZXF1ZXN0IGZhaWxlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAvLyBhIHJhY2UgY29uZGl0aW9uIGV4dGVybmFsbHkgY29tbWl0dGluZyB0aGUgcmVzcG9uc2UgY2FuIHN0aWxsIG9jY3VyLi4uCisgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuRklORVIsICJVbmFibGUgdG8gcmVzZXQgZmFpbGVkIHJlc3BvbnNlLiIsIGV4KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29udGFpbmVyRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLkVYQ0VQVElPTl9TRU5ESU5HX0VSUk9SX1JFU1BPTlNFKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlLlN0YXR1cy5JTlRFUk5BTF9TRVJWRVJfRVJST1IuZ2V0U3RhdHVzQ29kZSgpLCAiUmVxdWVzdCBmYWlsZWQuIiksIGV4KTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBhc3luY0V4dC5jb21wbGV0ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHJlcXVlc3RUaW1lb3V0SGFuZGxlci5jbG9zZSgpOworICAgICAgICAgICAgcmV0aHJvdyhlcnJvcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVSZXNwb25zZUJ1ZmZlcmluZygpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0aHJvdyB0aGUgb3JpZ2luYWwgZXhjZXB0aW9uIGFzIHJlcXVpcmVkIGJ5IEpBWC1SUywgMy4zLjQKKyAgICAgKgorICAgICAqIEBwYXJhbSBlcnJvciB0aHJvd2FibGUgdG8gYmUgcmUtdGhyb3duCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJldGhyb3coZmluYWwgVGhyb3dhYmxlIGVycm9yKSB7CisgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKKyAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKSBlcnJvcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDb250YWluZXJFeGNlcHRpb24oZXJyb3IpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvdmlkZXMgcmVzcG9uc2Ugc3RhdHVzIGNhcHR1cmVkIHdoZW4KKyAgICAgKiB7QGxpbmsgI3dyaXRlUmVzcG9uc2VTdGF0dXNBbmRIZWFkZXJzKGxvbmcsIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXNwb25zZSl9IGhhcyBiZWVuIGludm9rZWQuCisgICAgICogVGhlIG1ldGhvZCB3aWxsIGJsb2NrIGlmIHRoZSB3cml0ZSBtZXRob2QgaGFzIG5vdCBiZWVuIGNhbGxlZCB5ZXQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHJlc3BvbnNlIHN0YXR1cworICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0UmVzcG9uc2VTdGF0dXMoKSB7CisgICAgICAgIHJldHVybiBnZXRSZXNwb25zZUNvbnRleHQoKS5nZXRTdGF0dXMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiByZXNwb25zZUNvbnRleHRSZXNvbHZlZCgpIHsKKyAgICAgICAgcmV0dXJuIHJlc3BvbnNlQ29udGV4dC5pc0RvbmUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29udGFpbmVyUmVzcG9uc2UgZ2V0UmVzcG9uc2VDb250ZXh0KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlQ29udGV4dC5nZXQoKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gfCBFeGVjdXRpb25FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDb250YWluZXJFeGNlcHRpb24oZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm9uQ2xvc2VhYmxlT3V0cHV0U3RyZWFtV3JhcHBlciBleHRlbmRzIE91dHB1dFN0cmVhbSB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBPdXRwdXRTdHJlYW0gZGVsZWdhdGU7CisKKyAgICAgICAgcHVibGljIE5vbkNsb3NlYWJsZU91dHB1dFN0cmVhbVdyYXBwZXIoZmluYWwgT3V0cHV0U3RyZWFtIGRlbGVnYXRlKSB7CisgICAgICAgICAgICB0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoZmluYWwgaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBkZWxlZ2F0ZS53cml0ZShiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShmaW5hbCBieXRlW10gYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGRlbGVnYXRlLndyaXRlKGIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKGZpbmFsIGJ5dGVbXSBiLCBmaW5hbCBpbnQgb2ZmLCBmaW5hbCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgZGVsZWdhdGUud3JpdGUoYiwgb2ZmLCBsZW4pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGRlbGVnYXRlLmZsdXNoKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgLy8gZG8gbm90IGNsb3NlIC0gbGV0IHRoZSBzZXJ2bGV0IGNvbnRhaW5lciBjbG9zZSB0aGUgc3RyZWFtCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXJzL2plcnNleS1zZXJ2bGV0LWNvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2bGV0L2ludGVybmFsL1NlcnZsZXRDb250YWluZXJQcm92aWRlckZhY3RvcnkuamF2YSBiL2NvbnRhaW5lcnMvamVyc2V5LXNlcnZsZXQtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZsZXQvaW50ZXJuYWwvU2VydmxldENvbnRhaW5lclByb3ZpZGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYmViODAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXJzL2plcnNleS1zZXJ2bGV0LWNvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2bGV0L2ludGVybmFsL1NlcnZsZXRDb250YWluZXJQcm92aWRlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5TZXJ2aWNlRmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuaW50ZXJuYWwuc3BpLlNlcnZsZXRDb250YWluZXJQcm92aWRlcjsKKworLyoqCisgKiBGYWN0b3J5IGNsYXNzIHRvIGdldCBhbGwgInJlZ2lzdGVyZWQiIGltcGxlbWVudGF0aW9ucyBvZiB7QGxpbmsgU2VydmxldENvbnRhaW5lclByb3ZpZGVyfS4KKyAqIE1lbnRpb25lZCBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzIGFyZSByZWdpc3RlcmVkIGJ5IHtAY29kZSBNRVRBLUlORi9zZXJ2aWNlc30uCisgKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqIEBzaW5jZSAyLjEKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNlcnZsZXRDb250YWluZXJQcm92aWRlckZhY3RvcnkgeworCisgICAgcHJpdmF0ZSBTZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXJGYWN0b3J5KCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYXJyYXkgb2YgYWxsICJyZWdpc3RlcmVkIiBpbXBsZW1lbnRhdGlvbnMgb2Yge0BsaW5rIFNlcnZsZXRDb250YWluZXJQcm92aWRlcn0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEFycmF5IG9mIHJlZ2lzdGVyZWQgcHJvdmlkZXJzLiBOZXZlciByZXR1cm5zIHtAY29kZSBudWxsfS4KKyAgICAgKiAgICAgICAgIElmIHRoZXJlIGlzIG5vIGltcGxlbWVudGF0aW9uIHJlZ2lzdGVyZWQgZW1wdHkgYXJyYXkgaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXJbXSBnZXRBbGxTZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXJzKCkgeworICAgICAgICAvLyBUT0RPIEluc3RhbmNlcyBvZiBTZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXIgY291bGQgYmUgY2FjaGVkLCBtYXliZS4gPz8/CisgICAgICAgIC8vIFRPRE8gQ2hlY2sgaWYgTUVUQS1JTkYvc2VydmljZXMgbG9va3VwIGlzIGVuYWJsZWQuID8/PworICAgICAgICByZXR1cm4gU2VydmljZUZpbmRlci5maW5kKFNlcnZsZXRDb250YWluZXJQcm92aWRlci5jbGFzcykudG9BcnJheSgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVycy9qZXJzZXktc2VydmxldC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmxldC9pbnRlcm5hbC9UaHJlYWRMb2NhbEludm9rZXIuamF2YSBiL2NvbnRhaW5lcnMvamVyc2V5LXNlcnZsZXQtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZsZXQvaW50ZXJuYWwvVGhyZWFkTG9jYWxJbnZva2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVmNDcyNAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lcnMvamVyc2V5LXNlcnZsZXQtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZsZXQvaW50ZXJuYWwvVGhyZWFkTG9jYWxJbnZva2VyLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LmludGVybmFsOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvbkhhbmRsZXI7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKKy8qKgorICogQSBwcm94eSBpbnZvY2F0aW9uIGhhbmRsZXIgdGhhdCBkZWxlZ2F0ZXMgYWxsIG1ldGhvZHMgdG8gYSB0aHJlYWQgbG9jYWwgaW5zdGFuY2UuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitwdWJsaWMgY2xhc3MgVGhyZWFkTG9jYWxJbnZva2VyPFQ+IGltcGxlbWVudHMgSW52b2NhdGlvbkhhbmRsZXIgeworCisgICAgcHJpdmF0ZSBUaHJlYWRMb2NhbDxUPiB0aHJlYWRMb2NhbEluc3RhbmNlID0gbmV3IFRocmVhZExvY2FsPD4oKTsKKworICAgIHB1YmxpYyB2b2lkIHNldChmaW5hbCBUIHRocmVhZExvY2FsSW5zdGFuY2UpIHsKKyAgICAgICAgdGhpcy50aHJlYWRMb2NhbEluc3RhbmNlLnNldCh0aHJlYWRMb2NhbEluc3RhbmNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVCBnZXQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnRocmVhZExvY2FsSW5zdGFuY2UuZ2V0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdCBpbnZva2UoZmluYWwgT2JqZWN0IHByb3h5LCBmaW5hbCBNZXRob2QgbWV0aG9kLCBmaW5hbCBPYmplY3RbXSBhcmdzKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgaWYgKHRocmVhZExvY2FsSW5zdGFuY2UuZ2V0KCkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5QRVJTSVNURU5DRV9VTklUX05PVF9DT05GSUdVUkVEKHByb3h5LmdldENsYXNzKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbWV0aG9kLmludm9rZSh0aHJlYWRMb2NhbEluc3RhbmNlLmdldCgpLCBhcmdzKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihleCk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IGV4LmdldFRhcmdldEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVycy9qZXJzZXktc2VydmxldC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmxldC9pbnRlcm5hbC9UaHJlYWRMb2NhbE5hbWVkSW52b2tlci5qYXZhIGIvY29udGFpbmVycy9qZXJzZXktc2VydmxldC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmxldC9pbnRlcm5hbC9UaHJlYWRMb2NhbE5hbWVkSW52b2tlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YWNjOTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXJzL2plcnNleS1zZXJ2bGV0LWNvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2bGV0L2ludGVybmFsL1RocmVhZExvY2FsTmFtZWRJbnZva2VyLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LmludGVybmFsOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworCitpbXBvcnQgamF2YXgubmFtaW5nLkNvbnRleHQ7CitpbXBvcnQgamF2YXgubmFtaW5nLkluaXRpYWxDb250ZXh0OworCisvKioKKyAqIEEgcHJveHkgaW52b2NhdGlvbiBoYW5kbGVyIHRoYXQgZGVsZWdhdGVzIGFsbCBtZXRob2RzIHRvIGEgdGhyZWFkIGxvY2FsIGluc3RhbmNlIGZyb20gSk5ESS4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKi8KK3B1YmxpYyBjbGFzcyBUaHJlYWRMb2NhbE5hbWVkSW52b2tlcjxUPiBleHRlbmRzIFRocmVhZExvY2FsSW52b2tlcjxUPiB7CisKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIEpOREkgbmFtZSBhdCB3aGljaCBhbiBpbnN0YW5jZSBvZiBUIGNhbiBiZSBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGhyZWFkTG9jYWxOYW1lZEludm9rZXIoZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IGludm9rZShPYmplY3QgcHJveHksIE1ldGhvZCBtZXRob2QsIE9iamVjdFtdIGFyZ3MpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICAvLyBpZiBubyBpbnN0YW5jZSB5ZXQgZXhpc3RzIGZvciB0aGUgY3VycmVudCB0aHJlYWQgdGhlbiBsb29rIG9uZSB1cCBhbmQgc3Rhc2ggaXQKKyAgICAgICAgaWYgKHRoaXMuZ2V0KCkgPT0gbnVsbCkgeworICAgICAgICAgICAgQ29udGV4dCBjdHggPSBuZXcgSW5pdGlhbENvbnRleHQoKTsKKyAgICAgICAgICAgIFQgdCA9IChUKSBjdHgubG9va3VwKG5hbWUpOworICAgICAgICAgICAgdGhpcy5zZXQodCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cGVyLmludm9rZShwcm94eSwgbWV0aG9kLCBhcmdzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXJzL2plcnNleS1zZXJ2bGV0LWNvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2bGV0L2ludGVybmFsL1V0aWxzLmphdmEgYi9jb250YWluZXJzL2plcnNleS1zZXJ2bGV0LWNvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2bGV0L2ludGVybmFsL1V0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEyNTExNgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lcnMvamVyc2V5LXNlcnZsZXQtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZsZXQvaW50ZXJuYWwvVXRpbHMuamF2YQpAQCAtMCwwICsxLDkyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKKy8qKgorICogVXRpbGl0eSBjbGFzcy4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFV0aWxzIHsKKworICAgIC8qKgorICAgICAqIEludGVybmFsIHtAbGluayBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0IHNlcnZsZXQgY29udGV4dH0gYXR0cmlidXRlIG5hbWUgdW5kZXIgd2hpY2ggYW4gaW5zdGFuY2Ugb2YKKyAgICAgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnIHJlc291cmNlIGNvbmZpZ30gY2FuIGJlIHN0b3JlZC4gVGhlIGluc3RhbmNlIGlzIGxhdGVyIHVzZWQgdG8gaW5pdGlhbGl6ZQorICAgICAqIHNlcnZsZXQgaW4ge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuV2ViQ29uZmlnfSBpbnN0ZWFkIG9mIGNyZWF0aW5nIGEgbmV3IG9uZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfQ09ORklHID0gImplcnNleS5jb25maWcuc2VydmxldC5pbnRlcm5hbC5yZXNvdXJjZUNvbmZpZyI7CisKKyAgICAvKioKKyAgICAgKiBTdG9yZSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnIHJlc291cmNlIGNvbmZpZ30gYXMgYW4gYXR0cmlidXRlIG9mIGdpdmVuCisgICAgICoge0BsaW5rIGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQgc2VydmxldCBjb250ZXh0fS4gSWYge0Bjb2RlIGNvbmZpZ30gaXMge0Bjb2RlIG51bGx9IHRoZW4gdGhlIHByZXZpb3VzbHkgc3RvcmVkIHZhbHVlCisgICAgICogKGlmIGFueSkgaXMgcmVtb3ZlZC4gVGhlIHtAY29kZSBjb25maWdOYW1lfSBpcyB1c2VkIGFzIGFuIGF0dHJpYnV0ZSBuYW1lIHN1ZmZpeC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25maWcgcmVzb3VyY2UgY29uZmlnIHRvIGJlIHN0b3JlZC4KKyAgICAgKiBAcGFyYW0gY29udGV4dCBzZXJ2bGV0IGNvbnRleHQgdG8gc3RvcmUgdGhlIGNvbmZpZyBpbi4KKyAgICAgKiBAcGFyYW0gY29uZmlnTmFtZSBuYW1lIG9yIGlkIG9mIHRoZSByZXNvdXJjZSBjb25maWcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHN0b3JlKGZpbmFsIFJlc291cmNlQ29uZmlnIGNvbmZpZywgZmluYWwgU2VydmxldENvbnRleHQgY29udGV4dCwgZmluYWwgU3RyaW5nIGNvbmZpZ05hbWUpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGF0dHJpYnV0ZU5hbWUgPSBSRVNPVVJDRV9DT05GSUcgKyAiXyIgKyBjb25maWdOYW1lOworICAgICAgICBjb250ZXh0LnNldEF0dHJpYnV0ZShhdHRyaWJ1dGVOYW1lLCBjb25maWcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvYWQge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZyByZXNvdXJjZSBjb25maWd9IGZyb20gZ2l2ZW4KKyAgICAgKiB7QGxpbmsgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dCBzZXJ2bGV0IGNvbnRleHR9LiBJZiBmb3VuZCB0aGVuIHRoZSByZXNvdXJjZSBjb25maWcgaXMgYWxzbyByZW1vdmVkIGZyb20gc2VydmxldAorICAgICAqIGNvbnRleHQuIFRoZSB7QGNvZGUgY29uZmlnTmFtZX0gaXMgdXNlZCBhcyBhbiBhdHRyaWJ1dGUgbmFtZSBzdWZmaXguCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBzZXJ2bGV0IGNvbnRleHQgdG8gbG9hZCByZXNvdXJjZSBjb25maWcgZnJvbS4KKyAgICAgKiBAcGFyYW0gY29uZmlnTmFtZSBuYW1lIG9yIGlkIG9mIHRoZSByZXNvdXJjZSBjb25maWcuCisgICAgICogQHJldHVybiBwcmV2aW91c2x5IHN0b3JlZCByZXNvdXJjZSBjb25maWcgb3Ige0Bjb2RlIG51bGx9IGlmIG5vIHJlc291cmNlIGNvbmZpZyBoYXMgYmVlbiBzdG9yZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZUNvbmZpZyByZXRyaWV2ZShmaW5hbCBTZXJ2bGV0Q29udGV4dCBjb250ZXh0LCBmaW5hbCBTdHJpbmcgY29uZmlnTmFtZSkgeworICAgICAgICBmaW5hbCBTdHJpbmcgYXR0cmlidXRlTmFtZSA9IFJFU09VUkNFX0NPTkZJRyArICJfIiArIGNvbmZpZ05hbWU7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIGNvbmZpZyA9IChSZXNvdXJjZUNvbmZpZykgY29udGV4dC5nZXRBdHRyaWJ1dGUoYXR0cmlidXRlTmFtZSk7CisgICAgICAgIGNvbnRleHQucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZU5hbWUpOworICAgICAgICByZXR1cm4gY29uZmlnOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4dHJhY3QgY29udGV4dCBwYXJhbXMgZnJvbSB7QGxpbmsgU2VydmxldENvbnRleHR9LgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZsZXRDb250ZXh0IGFjdHVhbCBzZXJ2bGV0IGNvbnRleHQuCisgICAgICogQHJldHVybiBtYXAgcmVwcmVzZW50aW5nIGN1cnJlbnQgY29udGV4dCBwYXJhbWV0ZXJzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRDb250ZXh0UGFyYW1zKGZpbmFsIFNlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0KSB7CisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcHMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIGZpbmFsIEVudW1lcmF0aW9uIG5hbWVzID0gc2VydmxldENvbnRleHQuZ2V0QXR0cmlidXRlTmFtZXMoKTsKKyAgICAgICAgd2hpbGUgKG5hbWVzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIG5hbWVzLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICBwcm9wcy5wdXQobmFtZSwgc2VydmxldENvbnRleHQuZ2V0QXR0cmlidXRlKG5hbWUpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcHJvcHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJldmVudHMgaW5zdGFudGlhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFV0aWxzKCkgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lcnMvamVyc2V5LXNlcnZsZXQtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZsZXQvaW50ZXJuYWwvcGFja2FnZS1pbmZvLmphdmEgYi9jb250YWluZXJzL2plcnNleS1zZXJ2bGV0LWNvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2bGV0L2ludGVybmFsL3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNWQzMmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXJzL2plcnNleS1zZXJ2bGV0LWNvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2bGV0L2ludGVybmFsL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKKy8qKgorICogSmVyc2V5IGludGVybmFsIFNlcnZsZXQgQVBJLgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuaW50ZXJuYWw7CmRpZmYgLS1naXQgYS9jb250YWluZXJzL2plcnNleS1zZXJ2bGV0LWNvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2bGV0L2ludGVybmFsL3NwaS9FeHRlbmRlZFNlcnZsZXRDb250YWluZXJQcm92aWRlci5qYXZhIGIvY29udGFpbmVycy9qZXJzZXktc2VydmxldC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmxldC9pbnRlcm5hbC9zcGkvRXh0ZW5kZWRTZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWZhMTliCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVycy9qZXJzZXktc2VydmxldC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmxldC9pbnRlcm5hbC9zcGkvRXh0ZW5kZWRTZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuaW50ZXJuYWwuc3BpOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLlJlcXVlc3RTY29wZWRJbml0aWFsaXplcjsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbnMgY291bGQgcHJvdmlkZSB0aGVpciBvd24ge0BsaW5rIEh0dHBTZXJ2bGV0UmVxdWVzdH0gYW5kIHtAbGluayBIdHRwU2VydmxldFJlc3BvbnNlfQorICogYmluZGluZyBpbXBsZW1lbnRhdGlvbiBpbiBISzIgbG9jYXRvciBhbmQgYWxzbyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgUmVxdWVzdFNjb3BlZEluaXRpYWxpemVyfQorICogdGhhdCBpcyB1c2VkIHRvIHNldCBhY3R1YWwgcmVxdWVzdC9yZXNwb25zZSByZWZlcmVuY2VzIGluIGluamVjdGlvbiBtYW5hZ2VyIHdpdGhpbiBlYWNoIHJlcXVlc3QuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBzaW5jZSAyLjIxCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRXh0ZW5kZWRTZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXIgZXh0ZW5kcyBTZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXIgeworCisgICAgLyoqCisgICAgICogR2l2ZSBtZSBhIHtAbGluayBSZXF1ZXN0U2NvcGVkSW5pdGlhbGl6ZXJQcm92aWRlcn0gaW5zdGFuY2UsIHRoYXQgd2lsbCBiZSB1dGlsaXplZAorICAgICAqIGF0IHJ1bnRpbWUgdG8gc2V0IHRoZSBhY3R1YWwgSFRUUCBTZXJ2bGV0IHJlcXVlc3QgYW5kIHJlc3BvbnNlLgorICAgICAqCisgICAgICogVGhlIHByb3ZpZGVyIHJldHVybmVkIHdpbGwgYmUgdXNlZCBhdCBydW50aW1lIGZvciBldmVyeSBhbmQgZWFjaCBpbmNvbWluZyByZXF1ZXN0CisgICAgICogc28gdGhhdCB0aGUgYWN0dWFsIHJlcXVlc3QvcmVzcG9uc2UgaW5zdGFuY2VzIGNvdWxkIGJlIG1hZGUgYWNjZXNzaWJsZQorICAgICAqIGZyb20gSmVyc2V5IGluamVjdGlvbiBtYW5hZ2VyLgorICAgICAqCisgICAgICogQHJldHVybiByZXF1ZXN0IHNjb3BlZCBpbml0aWFsaXplciBwcm92aWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVxdWVzdFNjb3BlZEluaXRpYWxpemVyUHJvdmlkZXIgZ2V0UmVxdWVzdFNjb3BlZEluaXRpYWxpemVyUHJvdmlkZXIoKTsKKworICAgIC8qKgorICAgICAqIFVzZWQgYnkgSmVyc2V5IHJ1bnRpbWUgdG8gdGVsbCBpZiB0aGUgZXh0ZW5zaW9uIGNvdmVycyBIVFRQIFNlcnZsZXQgcmVxdWVzdCByZXNwb25zZQorICAgICAqIGhhbmRsaW5nIHdpdGggcmVzcGVjdCB0byB1bmRlcmx5aW5nIGluamVjdGlvbiBtYW5hZ2VyLgorICAgICAqCisgICAgICogUmV0dXJuIHtAY29kZSB0cnVlfSwgaWYgeW91ciBpbXBsZW1lbnRhdGlvbiBjb25maWd1cmVzIEhLMiBiaW5kaW5ncworICAgICAqIGZvciB7QGxpbmsgSHR0cFNlcnZsZXRSZXF1ZXN0fSBhbmQge0BsaW5rIEh0dHBTZXJ2bGV0UmVzcG9uc2V9CisgICAgICogaW4ge0BsaW5rICNjb25maWd1cmUoUmVzb3VyY2VDb25maWcpfSBtZXRob2QKKyAgICAgKiBhbmQgYWxzbyBwcm92aWRlcyBhIHtAbGluayBSZXF1ZXN0U2NvcGVkSW5pdGlhbGl6ZXJ9IGltcGxlbWVudGF0aW9uCisgICAgICogdmlhIHtAbGluayAjZ2V0UmVxdWVzdFNjb3BlZEluaXRpYWxpemVyUHJvdmlkZXIoKX0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZXh0ZW5zaW9uIGZ1bGx5IGNvdmVycyBIVFRQIHJlcXVlc3QvcmVzcG9uc2UgaGFuZGxpbmcuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gYmluZHNTZXJ2bGV0UmVxdWVzdFJlc3BvbnNlKCk7Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXJzL2plcnNleS1zZXJ2bGV0LWNvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2bGV0L2ludGVybmFsL3NwaS9Ob09wU2VydmxldENvbnRhaW5lclByb3ZpZGVyLmphdmEgYi9jb250YWluZXJzL2plcnNleS1zZXJ2bGV0LWNvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2bGV0L2ludGVybmFsL3NwaS9Ob09wU2VydmxldENvbnRhaW5lclByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQxNDdkOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lcnMvamVyc2V5LXNlcnZsZXQtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZsZXQvaW50ZXJuYWwvc3BpL05vT3BTZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuaW50ZXJuYWwuc3BpOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljVHlwZTsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uUmVmOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworLyoqCisgKiBCYXNpYyB7QGxpbmsgRXh0ZW5kZWRTZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXJ9IHRoYXQgcHJvdmlkZXMKKyAqIGR1bW15IG5vLW9wIG1ldGhvZCBpbXBsZW1lbnRhdGlvbi4gSXQgc2hvdWxkIGJlIGNvbnZlbmllbnQgdG8gZXh0ZW5kIGlmIHlvdSBvbmx5IG5lZWQgdG8gaW1wbGVtZW50CisgKiBhIHN1YnNldCBvZiB0aGUgb3JpZ2luYWwgU1BJIG1ldGhvZHMuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIE5vT3BTZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXIgaW1wbGVtZW50cyBFeHRlbmRlZFNlcnZsZXRDb250YWluZXJQcm92aWRlciB7CisKKyAgICBwdWJsaWMgZmluYWwgVHlwZSBIVFRQX1NFUlZMRVRfUkVRVUVTVF9UWVBFID0gKG5ldyBHZW5lcmljVHlwZTxSZWY8SHR0cFNlcnZsZXRSZXF1ZXN0Pj4oKSB7IH0pLmdldFR5cGUoKTsKKyAgICBwdWJsaWMgZmluYWwgVHlwZSBIVFRQX1NFUlZMRVRfUkVTUE9OU0VfVFlQRSA9IChuZXcgR2VuZXJpY1R5cGU8UmVmPEh0dHBTZXJ2bGV0UmVzcG9uc2U+PigpIHsgfSkuZ2V0VHlwZSgpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcHJlSW5pdChmaW5hbCBTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCwgZmluYWwgU2V0PENsYXNzPD8+PiBjbGFzc2VzKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIG5vLW9wCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcG9zdEluaXQoCisgICAgICAgICAgICBmaW5hbCBTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCwgZmluYWwgU2V0PENsYXNzPD8+PiBjbGFzc2VzLCBmaW5hbCBTZXQ8U3RyaW5nPiBzZXJ2bGV0TmFtZXMpIHsKKyAgICAgICAgLy8gbm8tb3AKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblJlZ2lzdGVyKAorICAgICAgICAgICAgZmluYWwgU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQsIGZpbmFsIFNldDxTdHJpbmc+IHNlcnZsZXROYW1lcykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICAvLyBuby1vcAorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICAvLyBuby1vcAorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGJpbmRzU2VydmxldFJlcXVlc3RSZXNwb25zZSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXF1ZXN0U2NvcGVkSW5pdGlhbGl6ZXJQcm92aWRlciBnZXRSZXF1ZXN0U2NvcGVkSW5pdGlhbGl6ZXJQcm92aWRlcigpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVycy9qZXJzZXktc2VydmxldC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmxldC9pbnRlcm5hbC9zcGkvUmVxdWVzdENvbnRleHRQcm92aWRlci5qYXZhIGIvY29udGFpbmVycy9qZXJzZXktc2VydmxldC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmxldC9pbnRlcm5hbC9zcGkvUmVxdWVzdENvbnRleHRQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MDQ5ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXJzL2plcnNleS1zZXJ2bGV0LWNvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2bGV0L2ludGVybmFsL3NwaS9SZXF1ZXN0Q29udGV4dFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LmludGVybmFsLnNwaTsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKKy8qKgorICogUHJvdmlkZSBhY2Nlc3MgdG8gdGhlIGFjdHVhbCBzZXJ2bGV0IHJlcXVlc3QvcmVzcG9uc2UuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBzZWUge0BsaW5rIFJlcXVlc3RTY29wZWRJbml0aWFsaXplclByb3ZpZGVyfQorICovCitwdWJsaWMgaW50ZXJmYWNlIFJlcXVlc3RDb250ZXh0UHJvdmlkZXIgeworCisgICAgLyoqCisgICAgICogR2V0IG1lIHRoZSBhY3R1YWwgSFRUUCBTZXJ2bGV0IHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFjdHVhbCBIVFRQIFNlcnZsZXQgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgSHR0cFNlcnZsZXRSZXF1ZXN0IGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpOworCisgICAgLyoqCisgICAgICogR2V0IG1lIHRoZSBhY3R1YWwgSFRUUCBTZXJ2bGV0IHJlc3BvbnNlLgorICAgICAqCisgICAgICogQHJldHVybiBhY3R1YWwgSFRUUCBTZXJ2bGV0IHJlc3BvbnNlLgorICAgICAqLworICAgIHB1YmxpYyBIdHRwU2VydmxldFJlc3BvbnNlIGdldEh0dHBTZXJ2bGV0UmVzcG9uc2UoKTsKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lcnMvamVyc2V5LXNlcnZsZXQtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZsZXQvaW50ZXJuYWwvc3BpL1JlcXVlc3RTY29wZWRJbml0aWFsaXplclByb3ZpZGVyLmphdmEgYi9jb250YWluZXJzL2plcnNleS1zZXJ2bGV0LWNvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2bGV0L2ludGVybmFsL3NwaS9SZXF1ZXN0U2NvcGVkSW5pdGlhbGl6ZXJQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMTg2MjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXJzL2plcnNleS1zZXJ2bGV0LWNvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2bGV0L2ludGVybmFsL3NwaS9SZXF1ZXN0U2NvcGVkSW5pdGlhbGl6ZXJQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5pbnRlcm5hbC5zcGk7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLlJlcXVlc3RTY29wZWRJbml0aWFsaXplcjsKKworLyoqCisgKiBQcm9kdWNlcyB7QGxpbmsgUmVxdWVzdFNjb3BlZEluaXRpYWxpemVyfQorICogYmFzZWQgb24gcHJvdmlkZWQge0BsaW5rIFJlcXVlc3RDb250ZXh0UHJvdmlkZXJ9LgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUmVxdWVzdFNjb3BlZEluaXRpYWxpemVyUHJvdmlkZXIgeworCisgICAgLyoqCisgICAgICogR2l2ZSBtZSBhIHJlcXVlc3Qgc2NvcGUgaW5pdGlhbGl6ZXIgdGhhdCBjb3VsZCBiZSB1dGlsaXplZAorICAgICAqIHRvIHNldCB0aGUgYWN0dWFsIFNlcnZsZXQgcmVxdWVzdCBkYXRhIGluIGluamVjdGlvbiBtYW5hZ2VyLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgb2YgdGhlIGFjdHVhbCByZXF1ZXN0LgorICAgICAqIEByZXR1cm4gaW5pdGlhbGl6ZXIgdG8gYmUgaW52b2tlZCBhdCB0aGUgc3RhcnQgb2YgcmVxdWVzdCBwcm9jZXNzaW5nLgorICAgICAqLworICAgIHB1YmxpYyBSZXF1ZXN0U2NvcGVkSW5pdGlhbGl6ZXIgZ2V0KFJlcXVlc3RDb250ZXh0UHJvdmlkZXIgY29udGV4dCk7Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXJzL2plcnNleS1zZXJ2bGV0LWNvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2bGV0L2ludGVybmFsL3NwaS9TZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXIuamF2YSBiL2NvbnRhaW5lcnMvamVyc2V5LXNlcnZsZXQtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZsZXQvaW50ZXJuYWwvc3BpL1NlcnZsZXRDb250YWluZXJQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlOWI2OTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXJzL2plcnNleS1zZXJ2bGV0LWNvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2bGV0L2ludGVybmFsL3NwaS9TZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LmludGVybmFsLnNwaTsKKworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuUmVxdWVzdFNjb3BlZEluaXRpYWxpemVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjsKKworLyoqCisgKiBUaGlzIGlzIGludGVybmFsIEplcnNleSBTUEkgdG8gaG9vayB0byBKZXJzZXkgc2VydmxldCBpbml0aWFsaXphdGlvbiBwcm9jZXNzIGRyaXZlbiBieQorICoge0Bjb2RlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuaW5pdC5KZXJzZXlTZXJ2bGV0Q29udGFpbmVySW5pdGlhbGl6ZXJ9LgorICogVGhlIHByb3ZpZGVyIGltcGxlbWVudGF0aW9uIGNsYXNzIGlzIHJlZ2lzdGVyZWQgdmlhIHtAY29kZSBNRVRBLUlORi9zZXJ2aWNlc30uCisgKgorICoKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKiBAc2luY2UgMi40LjEKKyAqLworcHVibGljIGludGVyZmFjZSBTZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXIgeworCisgICAgLyoqCisgICAgICogRG8geW91ciBwcmUtaW5pdGlhbGl6YXRpb24gam9iIGJlZm9yZSBKZXJzZXkgc3RhcnRzIGl0cyBzZXJ2bGV0IGluaXRpYWxpemF0aW9uLgorICAgICAqCisgICAgICogSXQgaXMgYWxsb3dlZCB0byBjb25maWd1cmUge0BsaW5rIFNlcnZsZXRDb250ZXh0fSBvciBhZGQvcmVtb3ZlIHNlcnZsZXQgcmVnaXN0cmF0aW9ucy4KKyAgICAgKiBQYXJhbWV0ZXIge0Bjb2RlIHNlcnZsZXROYW1lc30gY29udGFpbnMgbGlzdCBvZiBuYW1lcyBvZiBjdXJyZW50bHkgcmVnaXN0ZXJlZCBKZXJzZXkgc2VydmxldHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VydmxldENvbnRleHQgdGhlIHtAY29kZSBTZXJ2bGV0Q29udGV4dH0gb2YgdGhlIEpBWC1SUy9KZXJzZXkgd2ViIGFwcGxpY2F0aW9uIHRoYXQgaXMgYmVpbmcgc3RhcnRlZC4KKyAgICAgKiBAcGFyYW0gY2xhc3NlcyAgICAgICAgdGhlIG11dGFibGUgU2V0IG9mIGFwcGxpY2F0aW9uIGNsYXNzZXMgdGhhdCBleHRlbmQge0BsaW5rIGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb259LAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnQsIG9yIGhhdmUgYmVlbiBhbm5vdGF0ZWQgd2l0aCB0aGUgY2xhc3MgdHlwZXMge0BsaW5rIGphdmF4LndzLnJzLlBhdGh9LAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICB7QGxpbmsgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyfSBvciB7QGxpbmsgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRofS4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgTWF5IGJlIGVtcHR5LCBuZXZlciB7QGNvZGUgbnVsbH0uCisgICAgICogQHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIGlmIGFuIGVycm9yIGhhcyBvY2N1cnJlZC4ge0Bjb2RlIGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRhaW5lckluaXRpYWxpemVyLm9uU3RhcnR1cH0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgaW50ZXJydXB0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJlSW5pdChTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCwgU2V0PENsYXNzPD8+PiBjbGFzc2VzKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIERvIHlvdXIgcG9zdC1pbml0aWFsaXphdGlvbiBqb2IgYWZ0ZXIgSmVyc2V5IGZpbmlzaGVkIGl0cyBzZXJ2bGV0IGluaXRpYWxpemF0aW9uLgorICAgICAqCisgICAgICogSXQgaXMgYWxsb3dlZCB0byBjb25maWd1cmUge0BsaW5rIFNlcnZsZXRDb250ZXh0fSBvciBhZGQvcmVtb3ZlIHNlcnZsZXQgcmVnaXN0cmF0aW9ucy4KKyAgICAgKiBQYXJhbWV0ZXIge0Bjb2RlIHNlcnZsZXROYW1lc30gY29udGFpbnMgbGlzdCBvZiBuYW1lcyBvZiBjdXJyZW50bHkgcmVnaXN0ZXJlZCBKZXJzZXkgc2VydmxldHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VydmxldENvbnRleHQgdGhlIHtAY29kZSBTZXJ2bGV0Q29udGV4dH0gb2YgdGhlIEpBWC1SUy9KZXJzZXkgd2ViIGFwcGxpY2F0aW9uIHRoYXQgaXMgYmVpbmcgc3RhcnRlZC4KKyAgICAgKiBAcGFyYW0gY2xhc3NlcyAgICAgICAgdGhlIG11dGFibGUgU2V0IG9mIGFwcGxpY2F0aW9uIGNsYXNzZXMgdGhhdCBleHRlbmQge0BsaW5rIGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb259LAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnQsIG9yIGhhdmUgYmVlbiBhbm5vdGF0ZWQgd2l0aCB0aGUgY2xhc3MgdHlwZXMge0BsaW5rIGphdmF4LndzLnJzLlBhdGh9LAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICB7QGxpbmsgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyfSBvciB7QGxpbmsgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRofS4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgTWF5IGJlIGVtcHR5LCBuZXZlciB7QGNvZGUgbnVsbH0uCisgICAgICogQHBhcmFtIHNlcnZsZXROYW1lcyAgIHRoZSBJbW11dGFibGUgc2V0IG9mIEplcnNleSdzIFNlcnZsZXRDb250YWluZXIgbmFtZXMuIE1heSBiZSBlbXB0eSwgbmV2ZXIge0Bjb2RlIG51bGx9LgorICAgICAqIEB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiBpZiBhbiBlcnJvciBoYXMgb2NjdXJyZWQuIHtAY29kZSBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXJJbml0aWFsaXplci5vblN0YXJ0dXB9CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGludGVycnVwdGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHBvc3RJbml0KFNlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0LCBTZXQ8Q2xhc3M8Pz4+IGNsYXNzZXMsIGZpbmFsIFNldDxTdHJpbmc+IHNlcnZsZXROYW1lcykKKyAgICAgICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogTm90aWZpZXMgdGhlIHByb3ZpZGVyIGFib3V0IGFsbCByZWdpc3RlcmVkIEplcnNleSBzZXJ2bGV0cyBieSBpdHMgbmFtZXMuCisgICAgICoKKyAgICAgKiBJdCBpcyBhbGxvd2VkIHRvIGNvbmZpZ3VyZSB7QGxpbmsgU2VydmxldENvbnRleHR9LiBEbyBub3QgYWRkL3JlbW92ZSBhbnkgc2VydmxldCByZWdpc3RyYXRpb25zIGhlcmUuCisgICAgICoKKyAgICAgKiBQYXJhbWV0ZXIge0Bjb2RlIHNlcnZsZXROYW1lc30gY29udGFpbnMgbGlzdCBvZiBuYW1lcyBvZiByZWdpc3RlcmVkIEplcnNleSBzZXJ2bGV0cy4KKyAgICAgKiBDdXJyZW50bHkgaXQgaXMge0BsaW5rIFNlcnZsZXRDb250YWluZXJ9IG9yCisgICAgICoge0Bjb2RlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQucG9ydGFiaWxpdHkuUG9ydGFibGVTZXJ2bGV0Q29udGFpbmVyfSBzZXJ2bGV0cy4KKyAgICAgKgorICAgICAqIEl0IGRvZXMgbm90IG1hdHRlciBzZXJ2bGV0IGNvbnRhaW5lciBpcyBjb25maWd1cmVkIGluIHtAY29kZSB3ZWIueG1sfSwKKyAgICAgKiBieSB7QGNvZGUgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5pbml0LkplcnNleVNlcnZsZXRDb250YWluZXJJbml0aWFsaXplcn0KKyAgICAgKiBvciBieSBjdXN0b21lciBkaXJlY3QgU2VydmxldCBBUEkgY2FsbHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VydmxldENvbnRleHQgdGhlIHtAY29kZSBTZXJ2bGV0Q29udGV4dH0gb2YgdGhlIEpBWC1SUy9KZXJzZXkgd2ViIGFwcGxpY2F0aW9uIHRoYXQgaXMgYmVpbmcgc3RhcnRlZC4KKyAgICAgKiBAcGFyYW0gc2VydmxldE5hbWVzICAgdGhlIEltbXV0YWJsZSBzZXQgb2YgSmVyc2V5J3MgU2VydmxldENvbnRhaW5lciBuYW1lcy4gTWF5IGJlIGVtcHR5LCBuZXZlciB7QGNvZGUgbnVsbH0uCisgICAgICogQHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIGlmIGFuIGVycm9yIGhhcyBvY2N1cnJlZC4ge0Bjb2RlIGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRhaW5lckluaXRpYWxpemVyLm9uU3RhcnR1cH0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgaW50ZXJydXB0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25SZWdpc3RlcihTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCwgZmluYWwgU2V0PFN0cmluZz4gc2VydmxldE5hbWVzKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBmb3IgZWFjaCB7QGxpbmsgU2VydmxldENvbnRhaW5lcn0gaW5zdGFuY2UgaW5pdGlhbGl6YXRpb24sCisgICAgICogaS5lLiBkdXJpbmcge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuV2ViQ29tcG9uZW50fSBpbml0aWFsaXphdGlvbi4KKyAgICAgKgorICAgICAqIFRoZSBtZXRob2QgaXMgYWxzbyBjYWxsZWQgZHVyaW5nIHtAbGluayBTZXJ2bGV0Q29udGFpbmVyI3JlbG9hZCgpfSBvcgorICAgICAqIHtAbGluayBTZXJ2bGV0Q29udGFpbmVyI3JlbG9hZChSZXNvdXJjZUNvbmZpZyl9IG1ldGhvZHMgaW52b2NhdGlvbi4KKyAgICAgKgorICAgICAqIEl0IGRvZXMgbm90IG1hdHRlciBzZXJ2bGV0IGNvbnRhaW5lciBpcyBjb25maWd1cmVkIGluIHtAY29kZSB3ZWIueG1sfSwKKyAgICAgKiBieSB7QGNvZGUgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5pbml0LkplcnNleVNlcnZsZXRDb250YWluZXJJbml0aWFsaXplcn0KKyAgICAgKiBvciBieSBjdXN0b21lciBkaXJlY3QgU2VydmxldCBBUEkgY2FsbHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VDb25maWcgSmVyc2V5IGFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24uCisgICAgICogQHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIGlmIGFuIGVycm9yIGhhcyBvY2N1cnJlZC4ge0Bjb2RlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuV2ViQ29tcG9uZW50fSBjb25zdHJ1Y3Rpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgaW50ZXJydXB0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY29uZmlndXJlKFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lcnMvamVyc2V5LXNlcnZsZXQtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZsZXQvaW50ZXJuYWwvc3BpL3BhY2thZ2UtaW5mby5qYXZhIGIvY29udGFpbmVycy9qZXJzZXktc2VydmxldC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmxldC9pbnRlcm5hbC9zcGkvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA4NzVjYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lcnMvamVyc2V5LXNlcnZsZXQtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZsZXQvaW50ZXJuYWwvc3BpL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKKy8qKgorICogSmVyc2V5IGludGVybmFsIFNlcnZsZXQgU1BJLgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuaW50ZXJuYWwuc3BpOwpkaWZmIC0tZ2l0IGEvY29udGFpbmVycy9qZXJzZXktc2VydmxldC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmxldC9wYWNrYWdlLWluZm8uamF2YSBiL2NvbnRhaW5lcnMvamVyc2V5LXNlcnZsZXQtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZsZXQvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU5OWUyOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lcnMvamVyc2V5LXNlcnZsZXQtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZsZXQvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoqCisgKiBKZXJzZXkgZ2VuZXJpYyBTZXJ2bGV0IGNvbnRhaW5lciBpbnRlZ3JhdGlvbiBjbGFzc2VzLgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQ7CmRpZmYgLS1naXQgYS9jb250YWluZXJzL2plcnNleS1zZXJ2bGV0LWNvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2bGV0L3NwaS9Bc3luY0NvbnRleHREZWxlZ2F0ZS5qYXZhIGIvY29udGFpbmVycy9qZXJzZXktc2VydmxldC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmxldC9zcGkvQXN5bmNDb250ZXh0RGVsZWdhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWEwMmE4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVycy9qZXJzZXktc2VydmxldC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmxldC9zcGkvQXN5bmNDb250ZXh0RGVsZWdhdGUuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuc3BpOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5Db250YWluZXJSZXNwb25zZVdyaXRlcjsKKworLyoqCisgKiBVdGlsaXplZCBieSB0aGUgU2VydmxldCBjb250YWluZXIgcmVzcG9uc2Ugd3JpdGVyIHRvIGRlYWwgd2l0aCB0aGUgY29udGFpbmVyIGFzeW5jIGZlYXR1cmVzLgorICogSW5kaXZpZHVhbCBpbnN0YW5jZXMgYXJlIGNyZWF0ZWQgYnkge0BsaW5rIEFzeW5jQ29udGV4dERlbGVnYXRlUHJvdmlkZXJ9LgorICoKKyAqIEBzZWUgQXN5bmNDb250ZXh0RGVsZWdhdGVQcm92aWRlcgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQXN5bmNDb250ZXh0RGVsZWdhdGUgeworCisgICAgLyoqCisgICAgICogSW52b2tlZCBieSB0aGUgc3VwZXJpb3Ige0BsaW5rIENvbnRhaW5lclJlc3BvbnNlV3JpdGVyfSByZXNwb25zaWJsZSBmb3Igd3JpdGluZyB0aGUgcmVzcG9uc2Ugd2hlbiBwcm9jZXNzaW5nIGlzIHRvIGJlCisgICAgICogc3VzcGVuZGVkLiBBbiBpbXBsZW1lbnRhdGlvbiBjYW4gdGhyb3cgYW4ge0BsaW5rIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufSBpZiBzdXNwZW5kIGlzIG5vdCBzdXBwb3J0ZWQgKHRoZSBkZWZhdWx0CisgICAgICogYmVoYXZpb3IpLgorICAgICAqCisgICAgICogQHNlZSBDb250YWluZXJSZXNwb25zZVdyaXRlciNzdXNwZW5kKGxvbmcsIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0LCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbnRhaW5lclJlc3BvbnNlV3JpdGVyLlRpbWVvdXRIYW5kbGVyKQorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHVuZGVybHlpbmcge0BsaW5rIGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3Qgc2VydmxldCByZXF1ZXN0fSB0aHJvd3MgYW4gZXhjZXB0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN1c3BlbmQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogSW52b2tlZCB1cG9uIGEgcmVzcG9uc2Ugd3JpdGluZyBjb21wbGV0aW9uIHdoZW4gdGhlIHJlc3BvbnNlIHdyaXRlIGlzIGVpdGhlciBjb21taXR0ZWQgb3IgY2FuY2VsZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY29tcGxldGUoKTsKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lcnMvamVyc2V5LXNlcnZsZXQtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZsZXQvc3BpL0FzeW5jQ29udGV4dERlbGVnYXRlUHJvdmlkZXIuamF2YSBiL2NvbnRhaW5lcnMvamVyc2V5LXNlcnZsZXQtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZsZXQvc3BpL0FzeW5jQ29udGV4dERlbGVnYXRlUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTAzZmYxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVycy9qZXJzZXktc2VydmxldC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmxldC9zcGkvQXN5bmNDb250ZXh0RGVsZWdhdGVQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5zcGk7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCisvKioKKyAqIEZhY3RvcnkgdG8gY3JlYXRlIHtAbGluayBBc3luY0NvbnRleHREZWxlZ2F0ZX0gdG8gZGVhbCB3aXRoIGFzeW5jaHJvbm91cworICogZmVhdHVyZXMgYWRkZWQgaW4gU2VydmxldCB2ZXJzaW9uIDMuMC4KKyAqIElmIG5vIHN1Y2ggYSBmYWN0b3J5IGlzIHJlZ2lzdGVyZWQgdmlhIHRoZSB7QGNvZGUgTUVUQS1JTkYvc2VydmljZXN9IG1lY2hhbmlzbQorICogYSBkZWZhdWx0IGZhY3RvcnkgZm9yIFNlcnZsZXQgdmVyc2lvbnMgcHJpb3IgdG8gMy4wIHdpbGwgYmUgdXRpbGl6ZWQgd2l0aCBubyBhc3luYyBzdXBwb3J0LgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQXN5bmNDb250ZXh0RGVsZWdhdGVQcm92aWRlciB7CisKKyAgICAvKioKKyAgICAgKiBGYWN0b3J5IG1ldGhvZCB0byBjcmVhdGUgaW5zdGFuY2VzIG9mIFNlcnZsZXQgY29udGFpbmVyIHJlc3BvbnNlIHdyaXRlciBleHRlbnNpb24sCisgICAgICoge0BsaW5rIEFzeW5jQ29udGV4dERlbGVnYXRlfSwgZm9yIHJlc3BvbnNlIHByb2Nlc3NpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBvcmlnaW5hbCByZXF1ZXN0LgorICAgICAqIEBwYXJhbSByZXNwb25zZSBvcmlnaW5hbCByZXNwb25zZS4KKyAgICAgKiBAcmV0dXJuIGFuIGluc3RhbmNlIHRvIGJlIHVzZWQgdGhyb3VnaG91dCBhIHNpbmdsZSByZXNwb25zZSB3cml0ZSBwcm9jZXNzaW5nLgorICAgICAqLworICAgIHB1YmxpYyBBc3luY0NvbnRleHREZWxlZ2F0ZSBjcmVhdGVEZWxlZ2F0ZShmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgZmluYWwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSk7Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXJzL2plcnNleS1zZXJ2bGV0LWNvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2bGV0L3NwaS9GaWx0ZXJVcmxNYXBwaW5nc1Byb3ZpZGVyLmphdmEgYi9jb250YWluZXJzL2plcnNleS1zZXJ2bGV0LWNvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2bGV0L3NwaS9GaWx0ZXJVcmxNYXBwaW5nc1Byb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY4YjVlYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lcnMvamVyc2V5LXNlcnZsZXQtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZsZXQvc3BpL0ZpbHRlclVybE1hcHBpbmdzUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuc3BpOworCitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXJDb25maWc7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogUHJvdmlkZXMgYW4gYWNjZXNzIHRvIGNvbnRleHQgcGF0aCBmcm9tIHRoZSBmaWx0ZXIgY29uZmlndXJhdGlvbi4KKyAqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRmlsdGVyVXJsTWFwcGluZ3NQcm92aWRlciB7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gY29uZmlndXJlZCBjb250ZXh0IHBhdGggZnJvbSB0aGUgZmlsdGVyIGNvbmZpZ3VyYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsdGVyQ29uZmlnIHRoZSB7QGxpbmsgRmlsdGVyQ29uZmlnfSBvYmplY3QKKyAgICAgKiBAcmV0dXJucyB0aGUge0Bjb2RlIExpc3R9IG9mIHVybC1wYXR0ZXJucworICAgICAqLworICAgIExpc3Q8U3RyaW5nPiBnZXRGaWx0ZXJVcmxNYXBwaW5ncyhmaW5hbCBGaWx0ZXJDb25maWcgZmlsdGVyQ29uZmlnKTsKK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lcnMvamVyc2V5LXNlcnZsZXQtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZsZXQvc3BpL3BhY2thZ2UtaW5mby5qYXZhIGIvY29udGFpbmVycy9qZXJzZXktc2VydmxldC1jb3JlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmxldC9zcGkvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhhMTgyNQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lcnMvamVyc2V5LXNlcnZsZXQtY29yZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZsZXQvc3BpL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKKy8qKgorICogU1BJIGZvciBKZXJzZXkgZ2VuZXJpYyBTZXJ2bGV0IGNvbnRhaW5lciBzdXBwb3J0LgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuc3BpOwpkaWZmIC0tZ2l0IGEvY29udGFpbmVycy9qZXJzZXktc2VydmxldC1jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2bGV0L2ludGVybmFsL2xvY2FsaXphdGlvbi5wcm9wZXJ0aWVzIGIvY29udGFpbmVycy9qZXJzZXktc2VydmxldC1jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2bGV0L2ludGVybmFsL2xvY2FsaXphdGlvbi5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyNTBhNjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXJzL2plcnNleS1zZXJ2bGV0LWNvcmUvc3JjL21haW4vcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZsZXQvaW50ZXJuYWwvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMKQEAgLTAsMCArMSwzNCBAQAorIworIyBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisjIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyMKKyMgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorIyBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisjIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorIyB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisjCisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorIworCithc3luYy5wcm9jZXNzaW5nLm5vdC5zdXBwb3J0ZWQ9QXN5bmNocm9ub3VzIHByb2Nlc3Npbmcgbm90IHN1cHBvcnRlZCBvbiBTZXJ2bGV0IDIueCBjb250YWluZXIuCisjIHswfSAtIHN0YXR1cyBjb2RlOyB7MX0gLSBzdGF0dXMgcmVhc29uIG1lc3NhZ2UKK2V4Y2VwdGlvbi5zZW5kaW5nLmVycm9yLnJlc3BvbnNlPUkvTyBleGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgc2VuZGluZyAiezB9L3sxfSIgZXJyb3IgcmVzcG9uc2UuCitmb3JtLnBhcmFtLmNvbnN1bWVkPUEgc2VydmxldCByZXF1ZXN0IHRvIHRoZSBVUkkgezB9IGNvbnRhaW5zIGZvcm0gcGFyYW1ldGVycyBpbiB0aGUgcmVxdWVzdCBib2R5IGJ1dCB0aGUgcmVxdWVzdCBib2R5IGhhcyBiZWVuIGNvbnN1bWVkIGJ5IHRoZSBzZXJ2bGV0IG9yIGEgc2VydmxldCBmaWx0ZXIgYWNjZXNzaW5nIHRoZSByZXF1ZXN0IHBhcmFtZXRlcnMuIE9ubHkgcmVzb3VyY2UgbWV0aG9kcyB1c2luZyBARm9ybVBhcmFtIHdpbGwgd29yayBhcyBleHBlY3RlZC4gUmVzb3VyY2UgbWV0aG9kcyBjb25zdW1pbmcgdGhlIHJlcXVlc3QgYm9keSBieSBvdGhlciBtZWFucyB3aWxsIG5vdCB3b3JrIGFzIGV4cGVjdGVkLgoraW5pdC5wYXJhbS5yZWdleC5zeW50YXguaW52YWxpZD1UaGUgc3ludGF4IGlzIGludmFsaWQgZm9yIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gInswfSIgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXIgInsxfSIuCisjIHswfSAtIG5hbWUgKGUuZy4gJ0Jvb2ttYXJrUFUnKQorcGVyc2lzdGVuY2UudW5pdC5ub3QuY29uZmlndXJlZD1QZXJzaXN0ZW5jZSB1bml0ICJ7MH0iIGlzIG5vdCBjb25maWd1cmVkIGFzIGEgc2VydmxldCBwYXJhbWV0ZXIgaW4gd2ViLnhtbC4KKyMgezB9IC0gY2xhc3MgbmFtZQorbm8udGhyZWFkLmxvY2FsLnZhbHVlPU5vIHRocmVhZCBsb2NhbCB2YWx1ZSBpbiBzY29wZSBmb3IgcHJveHkgb2YgezB9LgorcmVzb3VyY2UuY29uZmlnLnBhcmVudC5jbGFzcy5pbnZhbGlkPVJlc291cmNlIGNvbmZpZ3VyYXRpb24gY2xhc3MgezB9IGlzIG5vdCBhIHN1YmNsYXNzIG9mIHsxfS4KK3Jlc291cmNlLmNvbmZpZy51bmFibGUudG8ubG9hZD1SZXNvdXJjZSBjb25maWd1cmF0aW9uIGNsYXNzIHswfSBjb3VsZCBub3QgYmUgbG9hZGVkLgorc2VydmxldC5wYXRoLm1pc21hdGNoPVRoZSBzZXJ2bGV0IHBhdGggezB9IGRvZXMgbm90IHN0YXJ0IHdpdGggdGhlIGZpbHRlciBjb250ZXh0IHBhdGggezF9Lgorc2VydmxldC5yZXF1ZXN0LnN1c3BlbmQuZmFpbGVkPUF0dGVtcHQgdG8gcHV0IHNlcnZsZXQgcmVxdWVzdCBpbnRvIGFzeW5jaHJvbm91cyBtb2RlIGhhcyBmYWlsZWQuIFBsZWFzZSBjaGVjayB5b3VyIHNlcnZsZXQgY29uZmlndXJhdGlvbiBcCisgIC0gYWxsIFNlcnZsZXQgaW5zdGFuY2VzIGFuZCBTZXJ2bGV0IGZpbHRlcnMgaW52b2x2ZWQgaW4gdGhlIHJlcXVlc3QgcHJvY2Vzc2luZyBtdXN0IGV4cGxpY2l0bHkgZGVjbGFyZSBzdXBwb3J0IGZvciBhc3luY2hyb25vdXMgcmVxdWVzdCBwcm9jZXNzaW5nLgoraGVhZGVyLnZhbHVlLnJlYWQuZmFpbGVkPUF0dGVtcHQgdG8gcmVhZCB0aGUgaGVhZGVyIHZhbHVlIGZhaWxlZC4KK2ZpbHRlci5jb250ZXh0LnBhdGgubWlzc2luZz1UaGUgcm9vdCBvZiB0aGUgYXBwIHdhcyBub3QgcHJvcGVybHkgZGVmaW5lZC4gRWl0aGVyIHVzZSBhIFNlcnZsZXQgMy54IGNvbnRhaW5lciBvciBhZGQgXAorICBhbiBpbml0LXBhcmFtICdqZXJzZXkuY29uZmlnLnNlcnZsZXQuZmlsdGVyLmNvbnRleHRQYXRoJyB0byB0aGUgZmlsdGVyIGNvbmZpZ3VyYXRpb24uIER1ZSB0byBTZXJ2bGV0IDIueCBBUEksIEplcnNleSBjYW5ub3QgXAorICBkZXRlcm1pbmUgdGhlIHJlcXVlc3QgYmFzZSBVUkkgc29sZWx5IGZyb20gdGhlIFNlcnZsZXRDb250ZXh0LiBUaGUgYXBwbGljYXRpb24gd2lsbCBtb3N0IGxpa2VseSBub3Qgd29yay4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lcnMvamVyc2V5LXNlcnZsZXQtY29yZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZsZXQvaW50ZXJuYWwvVGhyZWFkTG9jYWxJbnZva2VyVGVzdC5qYXZhIGIvY29udGFpbmVycy9qZXJzZXktc2VydmxldC1jb3JlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmxldC9pbnRlcm5hbC9UaHJlYWRMb2NhbEludm9rZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ0NzZmYwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lcnMvamVyc2V5LXNlcnZsZXQtY29yZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZsZXQvaW50ZXJuYWwvVGhyZWFkTG9jYWxJbnZva2VyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Qcm94eTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgVGhyZWFkTG9jYWxJbnZva2VyVGVzdCB7CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENoZWNrZWRFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgWCB7CisKKyAgICAgICAgcHVibGljIFN0cmluZyBjaGVja2VkKCkgdGhyb3dzIENoZWNrZWRFeGNlcHRpb247CisKKyAgICAgICAgcHVibGljIFN0cmluZyBydW50aW1lKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SWxsZWdhbFN0YXRlKCkgeworICAgICAgICBmaW5hbCBUaHJlYWRMb2NhbEludm9rZXI8WD4gdGxpID0gbmV3IFRocmVhZExvY2FsSW52b2tlcjw+KCk7CisKKyAgICAgICAgZmluYWwgWCB4ID0gKFgpIFByb3h5Lm5ld1Byb3h5SW5zdGFuY2UodGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCksIG5ldyBDbGFzc1tde1guY2xhc3N9LCB0bGkpOworCisgICAgICAgIGJvb2xlYW4gY2F1Z2h0ID0gZmFsc2U7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB4LmNoZWNrZWQoKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBjYXVnaHQgPSB0cnVlOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5jbGFzcywgZXguZ2V0Q2xhc3MoKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZShjYXVnaHQpOworCisgICAgICAgIGNhdWdodCA9IGZhbHNlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgeC5ydW50aW1lKCk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgY2F1Z2h0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhJbGxlZ2FsU3RhdGVFeGNlcHRpb24uY2xhc3MsIGV4LmdldENsYXNzKCkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoY2F1Z2h0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeGNlcHRpb25zKCkgeworICAgICAgICBmaW5hbCBUaHJlYWRMb2NhbEludm9rZXI8WD4gdGxpID0gbmV3IFRocmVhZExvY2FsSW52b2tlcjw+KCk7CisKKyAgICAgICAgZmluYWwgWCB4ID0gKFgpIFByb3h5Lm5ld1Byb3h5SW5zdGFuY2UodGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCksIG5ldyBDbGFzc1tde1guY2xhc3N9LCB0bGkpOworCisgICAgICAgIHRsaS5zZXQobmV3IFgoKSB7CisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGNoZWNrZWQoKSB0aHJvd3MgQ2hlY2tlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENoZWNrZWRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFN0cmluZyBydW50aW1lKCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIGJvb2xlYW4gY2F1Z2h0ID0gZmFsc2U7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB4LmNoZWNrZWQoKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBjYXVnaHQgPSB0cnVlOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKENoZWNrZWRFeGNlcHRpb24uY2xhc3MsIGV4LmdldENsYXNzKCkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoY2F1Z2h0KTsKKworICAgICAgICBjYXVnaHQgPSBmYWxzZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHgucnVudGltZSgpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGNhdWdodCA9IHRydWU7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoUnVudGltZUV4Y2VwdGlvbi5jbGFzcywgZXguZ2V0Q2xhc3MoKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VHJ1ZShjYXVnaHQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lcnMvamVyc2V5LXNlcnZsZXQvcG9tLnhtbCBiL2NvbnRhaW5lcnMvamVyc2V5LXNlcnZsZXQvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWE2NjM0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVycy9qZXJzZXktc2VydmxldC9wb20ueG1sCkBAIC0wLDAgKzEsODggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS1jb250YWluZXItc2VydmxldDwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgY29yZSBTZXJ2bGV0IDMueCBpbXBsZW1lbnRhdGlvbjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7c2VydmxldDMudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi5pc3RhY2s8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4taXN0YWNrLWNvbW1vbnMtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJ1aWxkLWhlbHBlci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5mZWxpeDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1idW5kbGUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgICAgIDxleHRlbnNpb25zPnRydWU8L2V4dGVuc2lvbnM+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxpbnN0cnVjdGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIE5vdGU6IFdoZW4geW91J3JlIGNoYW5naW5nIHRoZXNlIHByb3BlcnRpZXMgY2hhbmdlIHRoZW0gYWxzbyBpbiBidW5kbGVzL2pheC1ycy1yaS9idW5kbGUvcG9tLnhtbC4gLS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8SW1wb3J0LVBhY2thZ2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXguc2VydmxldC4qO3ZlcnNpb249IlszLjAsNS4wKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXguYW5ub3RhdGlvbi4qO3ZlcnNpb249ISwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICAgICAgICA8L0ltcG9ydC1QYWNrYWdlPgorICAgICAgICAgICAgICAgICAgICA8L2luc3RydWN0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPHVucGFja0J1bmRsZT50cnVlPC91bnBhY2tCdW5kbGU+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lcnMvamVyc2V5LXNlcnZsZXQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2bGV0L2FzeW5jL0FzeW5jQ29udGV4dERlbGVnYXRlUHJvdmlkZXJJbXBsLmphdmEgYi9jb250YWluZXJzL2plcnNleS1zZXJ2bGV0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmxldC9hc3luYy9Bc3luY0NvbnRleHREZWxlZ2F0ZVByb3ZpZGVySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YWQyODMKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXJzL2plcnNleS1zZXJ2bGV0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmxldC9hc3luYy9Bc3luY0NvbnRleHREZWxlZ2F0ZVByb3ZpZGVySW1wbC5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuYXN5bmM7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuQXN5bmNDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LmluaXQuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5zcGkuQXN5bmNDb250ZXh0RGVsZWdhdGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5zcGkuQXN5bmNDb250ZXh0RGVsZWdhdGVQcm92aWRlcjsKKworLyoqCisgKiBTZXJ2bGV0IDMueCBjb250YWluZXIgcmVzcG9uc2Ugd3JpdGVyIGFzeW5jIGV4dGVuc2lvbiBhbmQgcmVsYXRlZCBleHRlbnNpb24gZmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEFzeW5jQ29udGV4dERlbGVnYXRlUHJvdmlkZXJJbXBsIGltcGxlbWVudHMgQXN5bmNDb250ZXh0RGVsZWdhdGVQcm92aWRlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihBc3luY0NvbnRleHREZWxlZ2F0ZVByb3ZpZGVySW1wbC5jbGFzcy5nZXROYW1lKCkpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZpbmFsIEFzeW5jQ29udGV4dERlbGVnYXRlIGNyZWF0ZURlbGVnYXRlKGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBmaW5hbCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZW5zaW9uSW1wbChyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgRXh0ZW5zaW9uSW1wbCBpbXBsZW1lbnRzIEFzeW5jQ29udGV4dERlbGVnYXRlIHsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTkVWRVJfVElNRU9VVF9WQUxVRSA9IC0xOworCisgICAgICAgIHByaXZhdGUgZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3Q7CisgICAgICAgIHByaXZhdGUgZmluYWwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNSZWZlcmVuY2U8QXN5bmNDb250ZXh0PiBhc3luY0NvbnRleHRSZWY7CisgICAgICAgIHByaXZhdGUgZmluYWwgQXRvbWljQm9vbGVhbiBjb21wbGV0ZWQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhIFNlcnZsZXQgMy54IHtAbGluayBBc3luY0NvbnRleHREZWxlZ2F0ZX0gd2l0aCBnaXZlbiB7QGNvZGUgcmVxdWVzdH0gYW5kIHtAY29kZSByZXNwb25zZX0uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSByZXF1ZXN0ICByZXF1ZXN0IHRvIGNyZWF0ZSB7QGxpbmsgQXN5bmNDb250ZXh0fSBmb3IuCisgICAgICAgICAqIEBwYXJhbSByZXNwb25zZSByZXNwb25zZSB0byBjcmVhdGUge0BsaW5rIEFzeW5jQ29udGV4dH0gZm9yLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBFeHRlbnNpb25JbXBsKGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBmaW5hbCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgICAgICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OworICAgICAgICAgICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlOworICAgICAgICAgICAgdGhpcy5hc3luY0NvbnRleHRSZWYgPSBuZXcgQXRvbWljUmVmZXJlbmNlPD4oKTsKKyAgICAgICAgICAgIHRoaXMuY29tcGxldGVkID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHN1c3BlbmQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIC8vIFN1c3BlbmQgb25seSBpZiBub3QgY29tcGxldGVkIGFuZCBub3Qgc3VzcGVuZGVkIGJlZm9yZS4KKyAgICAgICAgICAgIGlmICghY29tcGxldGVkLmdldCgpICYmIGFzeW5jQ29udGV4dFJlZi5nZXQoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgYXN5bmNDb250ZXh0UmVmLnNldChnZXRBc3luY0NvbnRleHQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEFzeW5jQ29udGV4dCBnZXRBc3luY0NvbnRleHQoKSB7CisgICAgICAgICAgICBmaW5hbCBBc3luY0NvbnRleHQgYXN5bmNDb250ZXh0OworICAgICAgICAgICAgaWYgKHJlcXVlc3QuaXNBc3luY1N0YXJ0ZWQoKSkgeworICAgICAgICAgICAgICAgIGFzeW5jQ29udGV4dCA9IHJlcXVlc3QuZ2V0QXN5bmNDb250ZXh0KCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgYXN5bmNDb250ZXh0LnNldFRpbWVvdXQoTkVWRVJfVElNRU9VVF9WQUxVRSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIExldCdzIGhvcGUgdGhlIHRpbWUgb3V0IGlzIHNldCBwcm9wZXJseSwgb3RoZXJ3aXNlIEpBWC1SUyBBc3luY1Jlc3BvbnNlIHRpbWUtb3V0IHN1cHBvcnQKKyAgICAgICAgICAgICAgICAgICAgLy8gbWF5IG5vdCB3b3JrIGFzIGV4cGVjdGVkLi4uIEF0IGxlYXN0IHdlIGNhbiBsb2cgdGhpcyBhdCBmaW5lIGxldmVsLi4uCisgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuRklORSwgTG9jYWxpemF0aW9uTWVzc2FnZXMuU0VSVkxFVF9BU1lOQ19DT05URVhUX0FMUkVBRFlfU1RBUlRFRCgpLCBleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhc3luY0NvbnRleHQgPSByZXF1ZXN0LnN0YXJ0QXN5bmMocmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICAgICAgICAgIC8vIFRlbGwgdW5kZXJseWluZyBhc3luY0NvbnRleHQgdG8gbmV2ZXIgdGltZSBvdXQuCisgICAgICAgICAgICAgICAgYXN5bmNDb250ZXh0LnNldFRpbWVvdXQoTkVWRVJfVElNRU9VVF9WQUxVRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYXN5bmNDb250ZXh0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNvbXBsZXRlKCkgeworICAgICAgICAgICAgY29tcGxldGVkLnNldCh0cnVlKTsKKworICAgICAgICAgICAgZmluYWwgQXN5bmNDb250ZXh0IGFzeW5jQ29udGV4dCA9IGFzeW5jQ29udGV4dFJlZi5nZXRBbmRTZXQobnVsbCk7CisgICAgICAgICAgICBpZiAoYXN5bmNDb250ZXh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhc3luY0NvbnRleHQuY29tcGxldGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lcnMvamVyc2V5LXNlcnZsZXQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2bGV0L2FzeW5jL3BhY2thZ2UtaW5mby5qYXZhIGIvY29udGFpbmVycy9qZXJzZXktc2VydmxldC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZsZXQvYXN5bmMvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUwMmFmOQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lcnMvamVyc2V5LXNlcnZsZXQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2bGV0L2FzeW5jL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKKy8qKgorICogSmVyc2V5IHNlcnZsZXQgY29udGFpbmVyIGFzeW5jaHJvbm91cyBzdXBwb3J0IGNsYXNzZXMuCisgKi8KK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5hc3luYzsKZGlmZiAtLWdpdCBhL2NvbnRhaW5lcnMvamVyc2V5LXNlcnZsZXQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2bGV0L2luaXQvRmlsdGVyVXJsTWFwcGluZ3NQcm92aWRlckltcGwuamF2YSBiL2NvbnRhaW5lcnMvamVyc2V5LXNlcnZsZXQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2bGV0L2luaXQvRmlsdGVyVXJsTWFwcGluZ3NQcm92aWRlckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjMyZjcyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVycy9qZXJzZXktc2VydmxldC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZsZXQvaW5pdC9GaWx0ZXJVcmxNYXBwaW5nc1Byb3ZpZGVySW1wbC5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5pbml0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5zcGkuRmlsdGVyVXJsTWFwcGluZ3NQcm92aWRlcjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ29uZmlnOworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyUmVnaXN0cmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogUHJvdmlkZSBhbGwgY29uZmlndXJlZCBjb250ZXh0IHBhdGhzICh1cmwgbWFwcGluZ3MpIG9mIHRoZSBhcHBsaWNhdGlvbiBkZXBsb3llZCB1c2luZyBmaWx0ZXIuCisgKiA8cD4KKyAqIFRoZSB1cmwgcGF0dGVybnMgYXJlIHJldHVybmVkIHdpdGhvdXQgdGhlIGV2ZW50dWFsIHRyYWlsaW5nIGFzdGVyaXNrLgorICogPHA+CisgKiBUaGUgZnVuY3Rpb25hbGl0eSBpcyBhdmFpbGFibGUgaW4gU2VydmxldCAzLnggZW52aXJvbm1lbnQgb25seSwgc28gdGhpcworICogaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIEZpbHRlclVybE1hcHBpbmdzUHJvdmlkZXJ9IGludGVyZmFjZSBpcyBTZXJ2bGV0IDMgc3BlY2lmaWMuCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgRmlsdGVyVXJsTWFwcGluZ3NQcm92aWRlckltcGwgaW1wbGVtZW50cyBGaWx0ZXJVcmxNYXBwaW5nc1Byb3ZpZGVyIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEZpbHRlclVybE1hcHBpbmdzKEZpbHRlckNvbmZpZyBmaWx0ZXJDb25maWcpIHsKKyAgICAgICAgRmlsdGVyUmVnaXN0cmF0aW9uIGZpbHRlclJlZ2lzdHJhdGlvbiA9CisgICAgICAgICAgZmlsdGVyQ29uZmlnLmdldFNlcnZsZXRDb250ZXh0KCkuZ2V0RmlsdGVyUmVnaXN0cmF0aW9uKGZpbHRlckNvbmZpZy5nZXRGaWx0ZXJOYW1lKCkpOworCisgICAgICAgIENvbGxlY3Rpb248U3RyaW5nPiB1cmxQYXR0ZXJuTWFwcGluZ3MgPSBmaWx0ZXJSZWdpc3RyYXRpb24uZ2V0VXJsUGF0dGVybk1hcHBpbmdzKCk7CisgICAgICAgIExpc3Q8U3RyaW5nPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgICAgICBmb3IgKFN0cmluZyBwYXR0ZXJuIDogdXJsUGF0dGVybk1hcHBpbmdzKSB7CisgICAgICAgICAgICByZXN1bHQuYWRkKHBhdHRlcm4uZW5kc1dpdGgoIioiKSA/IHBhdHRlcm4uc3Vic3RyaW5nKDAsIHBhdHRlcm4ubGVuZ3RoKCkgLSAxKSA6IHBhdHRlcm4pOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXJzL2plcnNleS1zZXJ2bGV0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmxldC9pbml0L0plcnNleVNlcnZsZXRDb250YWluZXJJbml0aWFsaXplci5qYXZhIGIvY29udGFpbmVycy9qZXJzZXktc2VydmxldC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZsZXQvaW5pdC9KZXJzZXlTZXJ2bGV0Q29udGFpbmVySW5pdGlhbGl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDU4NzMwCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVycy9qZXJzZXktc2VydmxldC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZsZXQvaW5pdC9KZXJzZXlTZXJ2bGV0Q29udGFpbmVySW5pdGlhbGl6ZXIuamF2YQpAQCAtMCwwICsxLDM3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LmluaXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlJlZ2lzdHJhdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXJJbml0aWFsaXplcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZWdpc3RyYXRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5hbm5vdGF0aW9uLkhhbmRsZXNUeXBlczsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LmluaXQuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5pbnRlcm5hbC5TZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuaW50ZXJuYWwuVXRpbHM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5pbnRlcm5hbC5zcGkuU2VydmxldENvbnRhaW5lclByb3ZpZGVyOworCisvKgorIEl0IGlzIFJFQ09NTUVOREVEIHRoYXQgaW1wbGVtZW50YXRpb25zIHN1cHBvcnQgdGhlIFNlcnZsZXQgMyBmcmFtZXdvcmsKKyBwbHVnZ2FiaWxpdHkgbWVjaGFuaXNtIHRvIGVuYWJsZSBwb3J0YWJpbGl0eSBiZXR3ZWVuIGNvbnRhaW5lcnMgYW5kIHRvIGF2YWlsCisgdGhlbXNlbHZlcyBvZiBjb250YWluZXItc3VwcGxpZWQgY2xhc3Mgc2Nhbm5pbmcgZmFjaWxpdGllcy4KKyBXaGVuIHVzaW5nIHRoZSBwbHVnZ2FiaWxpdHkgbWVjaGFuaXNtIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBNVVNUIGJlIG1ldDoKKworIC0gSWYgbm8gQXBwbGljYXRpb24gc3ViY2xhc3MgaXMgcHJlc2VudCB0aGUgYWRkZWQgc2VydmxldCBNVVNUIGJlCisgbmFtZWQgImphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb24iIGFuZCBhbGwgcm9vdCByZXNvdXJjZSBjbGFzc2VzIGFuZAorIHByb3ZpZGVycyBwYWNrYWdlZCBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uIE1VU1QgYmUgaW5jbHVkZWQgaW4gdGhlIHB1Ymxpc2hlZAorIEpBWC1SUyBhcHBsaWNhdGlvbi4gVGhlIGFwcGxpY2F0aW9uIE1VU1QgYmUgcGFja2FnZWQgd2l0aCBhIHdlYi54bWwgdGhhdAorIHNwZWNpZmllcyBhIHNlcnZsZXQgbWFwcGluZyBmb3IgdGhlIGFkZGVkIHNlcnZsZXQuCisKKyAtIElmIGFuIEFwcGxpY2F0aW9uIHN1YmNsYXNzIGlzIHByZXNlbnQgYW5kIHRoZXJlIGlzIGFscmVhZHkgYSBzZXJ2bGV0IGRlZmluZWQKKyB0aGF0IGhhcyBhIHNlcnZsZXQgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyIG5hbWVkICJqYXZheC53cy5ycy5BcHBsaWNhdGlvbiIKKyB3aG9zZSB2YWx1ZSBpcyB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEFwcGxpY2F0aW9uIHN1YmNsYXNzIHRoZW4gbm8KKyBzZXJ2bGV0IHNob3VsZCBiZSBhZGRlZCBieSB0aGUgSkFYLVJTIGltcGxlbWVudGF0aW9uJ3MgQ29udGFpbmVySW5pdGlhbGl6ZXIKKyBzaW5jZSB0aGUgYXBwbGljYXRpb24gaXMgYWxyZWFkeSBiZWluZyBoYW5kbGVkIGJ5IGFuIGV4aXN0aW5nIHNlcnZsZXQuCisKKyAtIElmIGFuIGFwcGxpY2F0aW9uIHN1YmNsYXNzIGlzIHByZXNlbnQgdGhhdCBpcyBub3QgYmVpbmcgaGFuZGxlZCBieSBhbgorIGV4aXN0aW5nIHNlcnZsZXQgdGhlbiB0aGUgc2VydmxldCBhZGRlZCBieSB0aGUgQ29udGFpbmVySW5pdGlhbGl6ZXIgTVVTVCBiZQorIG5hbWVkIHdpdGggdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBBcHBsaWNhdGlvbiBzdWJjbGFzcy4gIElmIHRoZQorIEFwcGxpY2F0aW9uIHN1YmNsYXNzIGlzIGFubm90YXRlZCB3aXRoIEBQYXRoUHJlZml4IGFuZCBubyBzZXJ2bGV0LW1hcHBpbmcKKyBleGlzdHMgZm9yIHRoZSBhZGRlZCBzZXJ2bGV0IHRoZW4gYSBuZXcgc2VydmxldCBtYXBwaW5nIGlzIGFkZGVkIHdpdGggdGhlCisgdmFsdWUgb2YgdGhlIEBQYXRoUHJlZml4ICBhbm5vdGF0aW9uIHdpdGggIi8qIiBhcHBlbmRlZCBvdGhlcndpc2UgdGhlIGV4aXN0aW5nCisgbWFwcGluZyBpcyB1c2VkLiBJZiB0aGUgQXBwbGljYXRpb24gc3ViY2xhc3MgaXMgbm90IGFubm90YXRlZCB3aXRoIEBQYXRoUHJlZml4CisgdGhlbiB0aGUgYXBwbGljYXRpb24gTVVTVCBiZSBwYWNrYWdlZCB3aXRoIGEgd2ViLnhtbCB0aGF0IHNwZWNpZmllcyBhIHNlcnZsZXQKKyBtYXBwaW5nIGZvciB0aGUgYWRkZWQgc2VydmxldC4gSXQgaXMgYW4gZXJyb3IgZm9yIG1vcmUgdGhhbiBvbmUgQXBwbGljYXRpb24KKyB0byBiZSBkZXBsb3llZCBhdCB0aGUgc2FtZSBlZmZlY3RpdmUgc2VydmxldCBtYXBwaW5nLgorCisgSW4gZWl0aGVyIG9mIHRoZSBsYXR0ZXIgdHdvIGNhc2VzLCBpZiBib3RoIEFwcGxpY2F0aW9uI2dldENsYXNzZXMgYW5kCisgQXBwbGljYXRpb24jZ2V0U2luZ2xldG9ucyByZXR1cm4gYW4gZW1wdHkgbGlzdCB0aGVuIGFsbCByb290IHJlc291cmNlIGNsYXNzZXMKKyBhbmQgcHJvdmlkZXJzIHBhY2thZ2VkIGluIHRoZSB3ZWIgYXBwbGljYXRpb24gTVVTVCBiZSBpbmNsdWRlZCBpbiB0aGUKKyBwdWJsaXNoZWQgSkFYLVJTIGFwcGxpY2F0aW9uLiBJZiBlaXRoZXIgZ2V0Q2xhc3NlcyBvciBnZXRTaW5nbGV0b25zIHJldHVybiBhCisgbm9uLWVtcHR5IGxpc3QgdGhlbiBvbmx5IHRob3NlIGNsYXNzZXMgb3Igc2luZ2xldG9ucyByZXR1cm5lZCBNVVNUIGJlIGluY2x1ZGVkCisgaW4gdGhlIHB1Ymxpc2hlZCBKQVgtUlMgYXBwbGljYXRpb24uCisKKyBJZiBub3QgdXNpbmcgdGhlIFNlcnZsZXQgMyBmcmFtZXdvcmsgcGx1Z2dhYmlsaXR5IG1lY2hhbmlzbQorIChlLmcuIGluIGEgcHJlLVNlcnZsZXQgMy4wIGNvbnRhaW5lciksIHRoZSBzZXJ2bGV0LWNsYXNzIG9yIGZpbHRlci1jbGFzcworIGVsZW1lbnQgb2YgdGhlIHdlYi54bWwgZGVzY3JpcHRvciBTSE9VTEQgbmFtZSB0aGUgSkFYLVJTCisgaW1wbGVtZW50YXRpb24tc3VwcGxpZWQgU2VydmxldCBvciBGaWx0ZXIgY2xhc3MgcmVzcGVjdGl2ZWx5LiBUaGUKKyBhcHBsaWNhdGlvbi1zdXBwbGllZCBzdWJjbGFzcyBvZiBBcHBsaWNhdGlvbiBTSE9VTEQgYmUgaWRlbnRpZmllZCB1c2luZyBhbgorIGluaXQtcGFyYW0gd2l0aCBhIHBhcmFtLW5hbWUgb2YgamF2YXgud3MucnMuQXBwbGljYXRpb24uCisgKi8KKworLyoqCisgKiB7QGxpbmsgU2VydmxldENvbnRhaW5lckluaXRpYWxpemVyfSBpbXBsZW1lbnRhdGlvbiB1c2VkIGZvciBTZXJ2bGV0IDMueCBkZXBsb3ltZW50LgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworQEhhbmRsZXNUeXBlcyh7IFBhdGguY2xhc3MsIFByb3ZpZGVyLmNsYXNzLCBBcHBsaWNhdGlvbi5jbGFzcywgQXBwbGljYXRpb25QYXRoLmNsYXNzIH0pCitwdWJsaWMgZmluYWwgY2xhc3MgSmVyc2V5U2VydmxldENvbnRhaW5lckluaXRpYWxpemVyIGltcGxlbWVudHMgU2VydmxldENvbnRhaW5lckluaXRpYWxpemVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEplcnNleVNlcnZsZXRDb250YWluZXJJbml0aWFsaXplci5jbGFzcy5nZXROYW1lKCkpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TdGFydHVwKFNldDxDbGFzczw/Pj4gY2xhc3NlcywgZmluYWwgU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU2VydmxldENvbnRhaW5lclByb3ZpZGVyW10gYWxsU2VydmxldENvbnRhaW5lclByb3ZpZGVycyA9CisgICAgICAgICAgICAgICAgU2VydmxldENvbnRhaW5lclByb3ZpZGVyRmFjdG9yeS5nZXRBbGxTZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXJzKCk7CisKKyAgICAgICAgaWYgKGNsYXNzZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgY2xhc3NlcyA9IENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gUFJFIElOSVQKKyAgICAgICAgZm9yIChmaW5hbCBTZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXIgc2VydmxldENvbnRhaW5lclByb3ZpZGVyIDogYWxsU2VydmxldENvbnRhaW5lclByb3ZpZGVycykgeworICAgICAgICAgICAgc2VydmxldENvbnRhaW5lclByb3ZpZGVyLnByZUluaXQoc2VydmxldENvbnRleHQsIGNsYXNzZXMpOworICAgICAgICB9CisgICAgICAgIC8vIElOSVQgSU1QTAorICAgICAgICBvblN0YXJ0dXBJbXBsKGNsYXNzZXMsIHNlcnZsZXRDb250ZXh0KTsKKyAgICAgICAgLy8gUE9TVCBJTklUCisgICAgICAgIGZvciAoZmluYWwgU2VydmxldENvbnRhaW5lclByb3ZpZGVyIHNlcnZsZXRDb250YWluZXJQcm92aWRlciA6IGFsbFNlcnZsZXRDb250YWluZXJQcm92aWRlcnMpIHsKKyAgICAgICAgICAgIHNlcnZsZXRDb250YWluZXJQcm92aWRlci5wb3N0SW5pdChzZXJ2bGV0Q29udGV4dCwgY2xhc3NlcywgZmluZEplcnNleVNlcnZsZXROYW1lcyhzZXJ2bGV0Q29udGV4dCkpOworICAgICAgICB9CisgICAgICAgIC8vIE9OIFJFR0lTVEVSCisgICAgICAgIGZvciAoZmluYWwgU2VydmxldENvbnRhaW5lclByb3ZpZGVyIHNlcnZsZXRDb250YWluZXJQcm92aWRlciA6IGFsbFNlcnZsZXRDb250YWluZXJQcm92aWRlcnMpIHsKKyAgICAgICAgICAgIHNlcnZsZXRDb250YWluZXJQcm92aWRlci5vblJlZ2lzdGVyKHNlcnZsZXRDb250ZXh0LCBmaW5kSmVyc2V5U2VydmxldE5hbWVzKHNlcnZsZXRDb250ZXh0KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb25TdGFydHVwSW1wbChmaW5hbCBTZXQ8Q2xhc3M8Pz4+IGNsYXNzZXMsIGZpbmFsIFNlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0KSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGZpcnN0IHNlZSBpZiB0aGVyZSBhcmUgYW55IGFwcGxpY2F0aW9uIGNsYXNzZXMgaW4gdGhlIHdlYiBhcHAKKyAgICAgICAgZm9yIChmaW5hbCBDbGFzczw/IGV4dGVuZHMgQXBwbGljYXRpb24+IGFwcGxpY2F0aW9uQ2xhc3MgOiBnZXRBcHBsaWNhdGlvbkNsYXNzZXMoY2xhc3NlcykpIHsKKyAgICAgICAgICAgIGZpbmFsIFNlcnZsZXRSZWdpc3RyYXRpb24gc2VydmxldFJlZ2lzdHJhdGlvbiA9IHNlcnZsZXRDb250ZXh0LmdldFNlcnZsZXRSZWdpc3RyYXRpb24oYXBwbGljYXRpb25DbGFzcy5nZXROYW1lKCkpOworCisgICAgICAgICAgICBpZiAoc2VydmxldFJlZ2lzdHJhdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYWRkU2VydmxldFdpdGhFeGlzdGluZ1JlZ2lzdHJhdGlvbihzZXJ2bGV0Q29udGV4dCwgc2VydmxldFJlZ2lzdHJhdGlvbiwgYXBwbGljYXRpb25DbGFzcywgY2xhc3Nlcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFNlcnZsZXQgaXMgbm90IHJlZ2lzdGVyZWQgd2l0aCBhcHAgbmFtZSBvciB0aGUgYXBwIG5hbWUgaXMgdXNlZCB0byByZWdpc3RlciBhIGRpZmZlcmVudCBzZXJ2bGV0CisgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgc29tZSBzZXJ2bGV0IGRlZmluZXMgdGhlIGFwcCBpbiBpbml0IHBhcmFtcworICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8UmVnaXN0cmF0aW9uPiBzcnMgPSBnZXRJbml0UGFyYW1EZWNsYXJlZFJlZ2lzdHJhdGlvbnMoc2VydmxldENvbnRleHQsIGFwcGxpY2F0aW9uQ2xhc3MpOworICAgICAgICAgICAgICAgIGlmICghc3JzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBhcHAgaGFuZGxlZCBieSBhdCBsZWFzdCBvbmUgc2VydmxldCBvciBmaWx0ZXIKKyAgICAgICAgICAgICAgICAgICAgLy8gZml4IHRoZSByZWdpc3RyYXRpb25zIGlmIG5lZWRlZCAoaS5lLiBhZGQgc2VydmxldCBjbGFzcykKKyAgICAgICAgICAgICAgICAgICAgZm9yIChmaW5hbCBSZWdpc3RyYXRpb24gc3IgOiBzcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzciBpbnN0YW5jZW9mIFNlcnZsZXRSZWdpc3RyYXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRTZXJ2bGV0V2l0aEV4aXN0aW5nUmVnaXN0cmF0aW9uKHNlcnZsZXRDb250ZXh0LCAoU2VydmxldFJlZ2lzdHJhdGlvbikgc3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbkNsYXNzLCBjbGFzc2VzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGFwcCBub3QgaGFuZGxlZCBieSBhbnkgc2VydmxldC9maWx0ZXIgLT4gYWRkIGl0CisgICAgICAgICAgICAgICAgICAgIGFkZFNlcnZsZXRXaXRoQXBwbGljYXRpb24oc2VydmxldENvbnRleHQsIGFwcGxpY2F0aW9uQ2xhc3MsIGNsYXNzZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGNoZWNrIGZvciBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uIHJlZ2lzdHJhdGlvbgorICAgICAgICBhZGRTZXJ2bGV0V2l0aERlZmF1bHRDb25maWd1cmF0aW9uKHNlcnZsZXRDb250ZXh0LCBjbGFzc2VzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIG5hbWVzIG9mIGFsbCByZWdpc3RlcmVkIEplcnNleSBzZXJ2bGV0cy4KKyAgICAgKgorICAgICAqIFNlcnZsZXRzIGFyZSBjb25maWd1cmVkIGluIHtAY29kZSB3ZWIueG1sfSBvciBtYW5hZ2VkIHZpYSBTZXJ2bGV0IEFQSS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2bGV0Q29udGV4dCB0aGUge0BsaW5rIFNlcnZsZXRDb250ZXh0fSBvZiB0aGUgd2ViIGFwcGxpY2F0aW9uIHRoYXQgaXMgYmVpbmcgc3RhcnRlZAorICAgICAqIEByZXR1cm4gbGlzdCBvZiBKZXJzZXkgc2VydmxldCBuYW1lcyBvciBlbXB0eSBhcnJheSwgbmV2ZXIgcmV0dXJucyB7QGNvZGUgbnVsbH0KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTZXQ8U3RyaW5nPiBmaW5kSmVyc2V5U2VydmxldE5hbWVzKGZpbmFsIFNlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0KSB7CisgICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IGplcnNleVNlcnZsZXROYW1lcyA9IG5ldyBIYXNoU2V0PD4oKTsKKworICAgICAgICBmb3IgKGZpbmFsIFNlcnZsZXRSZWdpc3RyYXRpb24gc2VydmxldFJlZ2lzdHJhdGlvbiA6IHNlcnZsZXRDb250ZXh0LmdldFNlcnZsZXRSZWdpc3RyYXRpb25zKCkudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIGlmIChpc0plcnNleVNlcnZsZXQoc2VydmxldFJlZ2lzdHJhdGlvbi5nZXRDbGFzc05hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICBqZXJzZXlTZXJ2bGV0TmFtZXMuYWRkKHNlcnZsZXRSZWdpc3RyYXRpb24uZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KGplcnNleVNlcnZsZXROYW1lcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgdGhlIHtAY29kZSBjbGFzc05hbWV9IGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIGEgSmVyc2V5IFNlcnZsZXQgY29udGFpbmVyLgorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGNsYXNzIGlzIGEgSmVyc2V5IHNlcnZsZXQgY29udGFpbmVyIGNsYXNzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSmVyc2V5U2VydmxldChmaW5hbCBTdHJpbmcgY2xhc3NOYW1lKSB7CisgICAgICAgIHJldHVybiBTZXJ2bGV0Q29udGFpbmVyLmNsYXNzLmdldE5hbWUoKS5lcXVhbHMoY2xhc3NOYW1lKQorICAgICAgICAgICAgICAgIHx8ICJvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LnBvcnRhYmlsaXR5LlBvcnRhYmxlU2VydmxldENvbnRhaW5lciIuZXF1YWxzKGNsYXNzTmFtZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxSZWdpc3RyYXRpb24+IGdldEluaXRQYXJhbURlY2xhcmVkUmVnaXN0cmF0aW9ucyhmaW5hbCBTZXJ2bGV0Q29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIEFwcGxpY2F0aW9uPiBjbGF6eikgeworICAgICAgICBmaW5hbCBMaXN0PFJlZ2lzdHJhdGlvbj4gcmVnaXN0cmF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBjb2xsZWN0SmF4UnNSZWdpc3RyYXRpb25zKGNvbnRleHQuZ2V0U2VydmxldFJlZ2lzdHJhdGlvbnMoKSwgcmVnaXN0cmF0aW9ucywgY2xhenopOworICAgICAgICBjb2xsZWN0SmF4UnNSZWdpc3RyYXRpb25zKGNvbnRleHQuZ2V0RmlsdGVyUmVnaXN0cmF0aW9ucygpLCByZWdpc3RyYXRpb25zLCBjbGF6eik7CisgICAgICAgIHJldHVybiByZWdpc3RyYXRpb25zOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY29sbGVjdEpheFJzUmVnaXN0cmF0aW9ucyhmaW5hbCBNYXA8U3RyaW5nLCA/IGV4dGVuZHMgUmVnaXN0cmF0aW9uPiByZWdpc3RyYXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PFJlZ2lzdHJhdGlvbj4gY29sbGVjdGVkLCBmaW5hbCBDbGFzczw/IGV4dGVuZHMgQXBwbGljYXRpb24+IGEpIHsKKyAgICAgICAgZm9yIChmaW5hbCBSZWdpc3RyYXRpb24gc3IgOiByZWdpc3RyYXRpb25zLnZhbHVlcygpKSB7CisgICAgICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IGlwcyA9IHNyLmdldEluaXRQYXJhbWV0ZXJzKCk7CisgICAgICAgICAgICBpZiAoaXBzLmNvbnRhaW5zS2V5KFNlcnZsZXRQcm9wZXJ0aWVzLkpBWFJTX0FQUExJQ0FUSU9OX0NMQVNTKSkgeworICAgICAgICAgICAgICAgIGlmIChpcHMuZ2V0KFNlcnZsZXRQcm9wZXJ0aWVzLkpBWFJTX0FQUExJQ0FUSU9OX0NMQVNTKS5lcXVhbHMoYS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbGxlY3RlZC5hZGQoc3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEVuaGFuY2UgZGVmYXVsdCBzZXJ2bGV0IChuYW1lZCB7QGxpbmsgQXBwbGljYXRpb259KSBjb25maWd1cmF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkU2VydmxldFdpdGhEZWZhdWx0Q29uZmlndXJhdGlvbihmaW5hbCBTZXJ2bGV0Q29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IGNsYXNzZXMpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgICAgICBTZXJ2bGV0UmVnaXN0cmF0aW9uIHJlZ2lzdHJhdGlvbiA9IGNvbnRleHQuZ2V0U2VydmxldFJlZ2lzdHJhdGlvbihBcHBsaWNhdGlvbi5jbGFzcy5nZXROYW1lKCkpOworCisgICAgICAgIGlmIChyZWdpc3RyYXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgU2V0PENsYXNzPD8+PiBhcHBDbGFzc2VzID0gZ2V0Um9vdFJlc291cmNlQW5kUHJvdmlkZXJDbGFzc2VzKGNsYXNzZXMpOworICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBSZXNvdXJjZUNvbmZpZy5mb3JBcHBsaWNhdGlvbkNsYXNzKFJlc291cmNlQ29uZmlnLmNsYXNzLCBhcHBDbGFzc2VzKQorICAgICAgICAgICAgICAgICAgICAuYWRkUHJvcGVydGllcyhnZXRJbml0UGFyYW1zKHJlZ2lzdHJhdGlvbikpCisgICAgICAgICAgICAgICAgICAgIC5hZGRQcm9wZXJ0aWVzKFV0aWxzLmdldENvbnRleHRQYXJhbXMoY29udGV4dCkpOworCisgICAgICAgICAgICBpZiAocmVnaXN0cmF0aW9uLmdldENsYXNzTmFtZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBjbGFzcyBuYW1lIHByZXNlbnQgLSBjb21wbGV0ZSBzZXJ2bGV0IHJlZ2lzdHJhdGlvbiBmcm9tIGNvbnRhaW5lciBwb2ludCBvZiB2aWV3CisgICAgICAgICAgICAgICAgVXRpbHMuc3RvcmUocmVzb3VyY2VDb25maWcsIGNvbnRleHQsIHJlZ2lzdHJhdGlvbi5nZXROYW1lKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBubyBjbGFzcyBuYW1lIC0gbm8gY29tcGxldGUgc2VydmxldCByZWdpc3RyYXRpb24gZnJvbSBjb250YWluZXIgcG9pbnQgb2YgdmlldworICAgICAgICAgICAgICAgIGZpbmFsIFNlcnZsZXRDb250YWluZXIgc2VydmxldCA9IG5ldyBTZXJ2bGV0Q29udGFpbmVyKHJlc291cmNlQ29uZmlnKTsKKyAgICAgICAgICAgICAgICByZWdpc3RyYXRpb24gPSBjb250ZXh0LmFkZFNlcnZsZXQocmVnaXN0cmF0aW9uLmdldE5hbWUoKSwgc2VydmxldCk7CisgICAgICAgICAgICAgICAgKChTZXJ2bGV0UmVnaXN0cmF0aW9uLkR5bmFtaWMpIHJlZ2lzdHJhdGlvbikuc2V0TG9hZE9uU3RhcnR1cCgxKTsKKworICAgICAgICAgICAgICAgIGlmIChyZWdpc3RyYXRpb24uZ2V0TWFwcGluZ3MoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5XQVJOSU5HLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5KRVJTRVlfQVBQX05PX01BUFBJTkcocmVnaXN0cmF0aW9uLmdldE5hbWUoKSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuQ09ORklHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsaXphdGlvbk1lc3NhZ2VzLkpFUlNFWV9BUFBfUkVHSVNURVJFRF9DTEFTU0VTKHJlZ2lzdHJhdGlvbi5nZXROYW1lKCksIGFwcENsYXNzZXMpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgbmV3IHNlcnZsZXQgYWNjb3JkaW5nIHRvIHtAbGluayBBcHBsaWNhdGlvbn0gc3ViY2xhc3Mgd2l0aCB7QGxpbmsgQXBwbGljYXRpb25QYXRofSBhbm5vdGF0aW9uIG9yIGV4aXN0aW5nCisgICAgICoge0Bjb2RlIHNlcnZsZXQtbWFwcGluZ30uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhZGRTZXJ2bGV0V2l0aEFwcGxpY2F0aW9uKGZpbmFsIFNlcnZsZXRDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBBcHBsaWNhdGlvbj4gY2xhenosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNldDxDbGFzczw/Pj4gZGVmYXVsdENsYXNzZXMpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQXBwbGljYXRpb25QYXRoIGFwID0gY2xhenouZ2V0QW5ub3RhdGlvbihBcHBsaWNhdGlvblBhdGguY2xhc3MpOworICAgICAgICBpZiAoYXAgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gQXBwIGlzIGFubm90YXRlZCB3aXRoIEFwcGxpY2F0aW9uUGF0aAorICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBSZXNvdXJjZUNvbmZpZy5mb3JBcHBsaWNhdGlvbkNsYXNzKGNsYXp6LCBkZWZhdWx0Q2xhc3NlcykKKyAgICAgICAgICAgICAgICAgICAgLmFkZFByb3BlcnRpZXMoVXRpbHMuZ2V0Q29udGV4dFBhcmFtcyhjb250ZXh0KSk7CisgICAgICAgICAgICBmaW5hbCBTZXJ2bGV0Q29udGFpbmVyIHMgPSBuZXcgU2VydmxldENvbnRhaW5lcihyZXNvdXJjZUNvbmZpZyk7CisgICAgICAgICAgICBmaW5hbCBTZXJ2bGV0UmVnaXN0cmF0aW9uLkR5bmFtaWMgZHNyID0gY29udGV4dC5hZGRTZXJ2bGV0KGNsYXp6LmdldE5hbWUoKSwgcyk7CisgICAgICAgICAgICBkc3Iuc2V0QXN5bmNTdXBwb3J0ZWQodHJ1ZSk7CisgICAgICAgICAgICBkc3Iuc2V0TG9hZE9uU3RhcnR1cCgxKTsKKworICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1hcHBpbmcgPSBjcmVhdGVNYXBwaW5nUGF0aChhcCk7CisgICAgICAgICAgICBpZiAoIW1hcHBpbmdFeGlzdHMoY29udGV4dCwgbWFwcGluZykpIHsKKyAgICAgICAgICAgICAgICBkc3IuYWRkTWFwcGluZyhtYXBwaW5nKTsKKworICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuQ09ORklHLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5KRVJTRVlfQVBQX1JFR0lTVEVSRURfTUFQUElORyhjbGF6ei5nZXROYW1lKCksIG1hcHBpbmcpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5XQVJOSU5HLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5KRVJTRVlfQVBQX01BUFBJTkdfQ09ORkxJQ1QoY2xhenouZ2V0TmFtZSgpLCBtYXBwaW5nKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmhhbmNlIGV4aXN0aW5nIHNlcnZsZXQgY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFNlcnZsZXRXaXRoRXhpc3RpbmdSZWdpc3RyYXRpb24oZmluYWwgU2VydmxldENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmxldFJlZ2lzdHJhdGlvbiByZWdpc3RyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBBcHBsaWNhdGlvbj4gY2xhenosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNldDxDbGFzczw/Pj4gY2xhc3NlcykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICAvLyBjcmVhdGUgYSBuZXcgc2VydmxldCBjb250YWluZXIgZm9yIGEgZ2l2ZW4gYXBwLgorICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IFJlc291cmNlQ29uZmlnLmZvckFwcGxpY2F0aW9uQ2xhc3MoY2xhenosIGNsYXNzZXMpCisgICAgICAgICAgICAgICAgLmFkZFByb3BlcnRpZXMoZ2V0SW5pdFBhcmFtcyhyZWdpc3RyYXRpb24pKQorICAgICAgICAgICAgICAgIC5hZGRQcm9wZXJ0aWVzKFV0aWxzLmdldENvbnRleHRQYXJhbXMoY29udGV4dCkpOworCisgICAgICAgIGlmIChyZWdpc3RyYXRpb24uZ2V0Q2xhc3NOYW1lKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gY2xhc3MgbmFtZSBwcmVzZW50IC0gY29tcGxldGUgc2VydmxldCByZWdpc3RyYXRpb24gZnJvbSBjb250YWluZXIgcG9pbnQgb2YgdmlldworICAgICAgICAgICAgVXRpbHMuc3RvcmUocmVzb3VyY2VDb25maWcsIGNvbnRleHQsIHJlZ2lzdHJhdGlvbi5nZXROYW1lKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gbm8gY2xhc3MgbmFtZSAtIG5vIGNvbXBsZXRlIHNlcnZsZXQgcmVnaXN0cmF0aW9uIGZyb20gY29udGFpbmVyIHBvaW50IG9mIHZpZXcKKyAgICAgICAgICAgIGZpbmFsIFNlcnZsZXRDb250YWluZXIgc2VydmxldCA9IG5ldyBTZXJ2bGV0Q29udGFpbmVyKHJlc291cmNlQ29uZmlnKTsKKyAgICAgICAgICAgIGZpbmFsIFNlcnZsZXRSZWdpc3RyYXRpb24uRHluYW1pYyBkeW5hbWljUmVnaXN0cmF0aW9uID0gY29udGV4dC5hZGRTZXJ2bGV0KGNsYXp6LmdldE5hbWUoKSwgc2VydmxldCk7CisgICAgICAgICAgICBkeW5hbWljUmVnaXN0cmF0aW9uLnNldEFzeW5jU3VwcG9ydGVkKHRydWUpOworICAgICAgICAgICAgZHluYW1pY1JlZ2lzdHJhdGlvbi5zZXRMb2FkT25TdGFydHVwKDEpOworICAgICAgICAgICAgcmVnaXN0cmF0aW9uID0gZHluYW1pY1JlZ2lzdHJhdGlvbjsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVnaXN0cmF0aW9uLmdldE1hcHBpbmdzKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBmaW5hbCBBcHBsaWNhdGlvblBhdGggYXAgPSBjbGF6ei5nZXRBbm5vdGF0aW9uKEFwcGxpY2F0aW9uUGF0aC5jbGFzcyk7CisgICAgICAgICAgICBpZiAoYXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtYXBwaW5nID0gY3JlYXRlTWFwcGluZ1BhdGgoYXApOworICAgICAgICAgICAgICAgIGlmICghbWFwcGluZ0V4aXN0cyhjb250ZXh0LCBtYXBwaW5nKSkgeworICAgICAgICAgICAgICAgICAgICByZWdpc3RyYXRpb24uYWRkTWFwcGluZyhtYXBwaW5nKTsKKworICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLkNPTkZJRywgTG9jYWxpemF0aW9uTWVzc2FnZXMuSkVSU0VZX0FQUF9SRUdJU1RFUkVEX01BUFBJTkcoY2xhenouZ2V0TmFtZSgpLCBtYXBwaW5nKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5XQVJOSU5HLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5KRVJTRVlfQVBQX01BUFBJTkdfQ09ORkxJQ1QoY2xhenouZ2V0TmFtZSgpLCBtYXBwaW5nKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBFcnJvcgorICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuV0FSTklORywgTG9jYWxpemF0aW9uTWVzc2FnZXMuSkVSU0VZX0FQUF9OT19NQVBQSU5HX09SX0FOTk9UQVRJT04oY2xhenouZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgQXBwbGljYXRpb25QYXRoLmNsYXNzLmdldFNpbXBsZU5hbWUoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5DT05GSUcsIExvY2FsaXphdGlvbk1lc3NhZ2VzLkpFUlNFWV9BUFBfUkVHSVNURVJFRF9BUFBMSUNBVElPTihjbGF6ei5nZXROYW1lKCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0SW5pdFBhcmFtcyhmaW5hbCBTZXJ2bGV0UmVnaXN0cmF0aW9uIHNyKSB7CisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gaW5pdFBhcmFtcyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGVudHJ5IDogc3IuZ2V0SW5pdFBhcmFtZXRlcnMoKS5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBpbml0UGFyYW1zLnB1dChlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGluaXRQYXJhbXM7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtYXBwaW5nRXhpc3RzKGZpbmFsIFNlcnZsZXRDb250ZXh0IHNjLCBmaW5hbCBTdHJpbmcgbWFwcGluZykgeworICAgICAgICBmb3IgKGZpbmFsIFNlcnZsZXRSZWdpc3RyYXRpb24gc3IgOiBzYy5nZXRTZXJ2bGV0UmVnaXN0cmF0aW9ucygpLnZhbHVlcygpKSB7CisgICAgICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBkZWNsYXJlZE1hcHBpbmcgOiBzci5nZXRNYXBwaW5ncygpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1hcHBpbmcuZXF1YWxzKGRlY2xhcmVkTWFwcGluZykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworCisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgY3JlYXRlTWFwcGluZ1BhdGgoZmluYWwgQXBwbGljYXRpb25QYXRoIGFwKSB7CisgICAgICAgIFN0cmluZyBwYXRoID0gYXAudmFsdWUoKTsKKyAgICAgICAgaWYgKCFwYXRoLnN0YXJ0c1dpdGgoIi8iKSkgeworICAgICAgICAgICAgcGF0aCA9ICIvIiArIHBhdGg7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXBhdGguZW5kc1dpdGgoIi8qIikpIHsKKyAgICAgICAgICAgIGlmIChwYXRoLmVuZHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgICAgICBwYXRoICs9ICIqIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcGF0aCArPSAiLyoiOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHBhdGg7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU2V0PENsYXNzPD8gZXh0ZW5kcyBBcHBsaWNhdGlvbj4+IGdldEFwcGxpY2F0aW9uQ2xhc3NlcyhmaW5hbCBTZXQ8Q2xhc3M8Pz4+IGNsYXNzZXMpIHsKKyAgICAgICAgZmluYWwgU2V0PENsYXNzPD8gZXh0ZW5kcyBBcHBsaWNhdGlvbj4+IHMgPSBuZXcgTGlua2VkSGFzaFNldDw+KCk7CisgICAgICAgIGZvciAoZmluYWwgQ2xhc3M8Pz4gYyA6IGNsYXNzZXMpIHsKKyAgICAgICAgICAgIGlmIChBcHBsaWNhdGlvbi5jbGFzcyAhPSBjICYmIEFwcGxpY2F0aW9uLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oYykpIHsKKyAgICAgICAgICAgICAgICBzLmFkZChjLmFzU3ViY2xhc3MoQXBwbGljYXRpb24uY2xhc3MpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFNldDxDbGFzczw/Pj4gZ2V0Um9vdFJlc291cmNlQW5kUHJvdmlkZXJDbGFzc2VzKGZpbmFsIFNldDxDbGFzczw/Pj4gY2xhc3NlcykgeworICAgICAgICAvLyBUT0RPIGZpbHRlciBvdXQgYW55IGNsYXNzZXMgZnJvbSB0aGUgSmVyc2V5IGphcnMKKyAgICAgICAgZmluYWwgU2V0PENsYXNzPD8+PiBzID0gbmV3IExpbmtlZEhhc2hTZXQ8PigpOworICAgICAgICBmb3IgKGZpbmFsIENsYXNzPD8+IGMgOiBjbGFzc2VzKSB7CisgICAgICAgICAgICBpZiAoYy5pc0Fubm90YXRpb25QcmVzZW50KFBhdGguY2xhc3MpIHx8IGMuaXNBbm5vdGF0aW9uUHJlc2VudChQcm92aWRlci5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICBzLmFkZChjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVycy9qZXJzZXktc2VydmxldC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZsZXQvaW5pdC9wYWNrYWdlLWluZm8uamF2YSBiL2NvbnRhaW5lcnMvamVyc2V5LXNlcnZsZXQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2bGV0L2luaXQvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE5ODExZAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lcnMvamVyc2V5LXNlcnZsZXQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2bGV0L2luaXQvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoqCisgKiBKZXJzZXkgc2VydmxldCBjb250YWluZXIgaW5pdGlhbGl6YXRpb24gY2xhc3Nlcy4KKyAqLworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LmluaXQ7CmRpZmYgLS1naXQgYS9jb250YWluZXJzL2plcnNleS1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9qYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXJJbml0aWFsaXplciBiL2NvbnRhaW5lcnMvamVyc2V5LXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL2phdmF4LnNlcnZsZXQuU2VydmxldENvbnRhaW5lckluaXRpYWxpemVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwNTJlNzQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXJzL2plcnNleS1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9qYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXJJbml0aWFsaXplcgpAQCAtMCwwICsxIEBACitvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LmluaXQuSmVyc2V5U2VydmxldENvbnRhaW5lckluaXRpYWxpemVyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVycy9qZXJzZXktc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5zcGkuQXN5bmNDb250ZXh0RGVsZWdhdGVQcm92aWRlciBiL2NvbnRhaW5lcnMvamVyc2V5LXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuc3BpLkFzeW5jQ29udGV4dERlbGVnYXRlUHJvdmlkZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU5ZWM3YwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lcnMvamVyc2V5LXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuc3BpLkFzeW5jQ29udGV4dERlbGVnYXRlUHJvdmlkZXIKQEAgLTAsMCArMSBAQAorb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5hc3luYy5Bc3luY0NvbnRleHREZWxlZ2F0ZVByb3ZpZGVySW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lcnMvamVyc2V5LXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuc3BpLkZpbHRlclVybE1hcHBpbmdzUHJvdmlkZXIgYi9jb250YWluZXJzL2plcnNleS1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LnNwaS5GaWx0ZXJVcmxNYXBwaW5nc1Byb3ZpZGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMTU2ODkKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXJzL2plcnNleS1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LnNwaS5GaWx0ZXJVcmxNYXBwaW5nc1Byb3ZpZGVyCkBAIC0wLDAgKzEgQEAKK29yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuaW5pdC5GaWx0ZXJVcmxNYXBwaW5nc1Byb3ZpZGVySW1wbApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvbnRhaW5lcnMvamVyc2V5LXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZsZXQvaW5pdC9pbnRlcm5hbC9sb2NhbGl6YXRpb24ucHJvcGVydGllcyBiL2NvbnRhaW5lcnMvamVyc2V5LXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZsZXQvaW5pdC9pbnRlcm5hbC9sb2NhbGl6YXRpb24ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjFiMDc0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVycy9qZXJzZXktc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmxldC9pbml0L2ludGVybmFsL2xvY2FsaXphdGlvbi5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjQgQEAKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisjCisjIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyMgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorIyBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyMgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorIworIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyMKKworamVyc2V5LmFwcC5tYXBwaW5nLmNvbmZsaWN0PU1hcHBpbmcgY29uZmxpY3QuIEEgU2VydmxldCByZWdpc3RyYXRpb24gZXhpc3RzIHdpdGggc2FtZSBtYXBwaW5nIGFzIHRoZSBKZXJzZXkgc2VydmxldCBhcHBsaWNhdGlvbiwgbmFtZWQgezB9LCBhdCB0aGUgc2VydmxldCBtYXBwaW5nLCB7MX0uCitqZXJzZXkuYXBwLm5vLm1hcHBpbmc9VGhlIEplcnNleSBzZXJ2bGV0IGFwcGxpY2F0aW9uLCBuYW1lZCB7MH0sIGhhcyBubyBzZXJ2bGV0IG1hcHBpbmcuCitqZXJzZXkuYXBwLm5vLm1hcHBpbmcub3IuYW5ub3RhdGlvbj1UaGUgSmVyc2V5IHNlcnZsZXQgYXBwbGljYXRpb24sIG5hbWVkIHswfSwgaXMgbm90IGFubm90YXRlZCB3aXRoIHsxfSBhbmQgaGFzIG5vIHNlcnZsZXQgbWFwcGluZy4KK2plcnNleS5hcHAucmVnaXN0ZXJlZC5jbGFzc2VzPVJlZ2lzdGVyaW5nIHRoZSBKZXJzZXkgc2VydmxldCBhcHBsaWNhdGlvbiwgbmFtZWQgezB9LCB3aXRoIHRoZSBmb2xsb3dpbmcgcm9vdCByZXNvdXJjZSBhbmQgcHJvdmlkZXIgY2xhc3NlczogezF9CitqZXJzZXkuYXBwLnJlZ2lzdGVyZWQubWFwcGluZz1SZWdpc3RlcmluZyB0aGUgSmVyc2V5IHNlcnZsZXQgYXBwbGljYXRpb24sIG5hbWVkIHswfSwgYXQgdGhlIHNlcnZsZXQgbWFwcGluZyB7MX0sIHdpdGggdGhlIEFwcGxpY2F0aW9uIGNsYXNzIG9mIHRoZSBzYW1lIG5hbWUuCitqZXJzZXkuYXBwLnJlZ2lzdGVyZWQuYXBwbGljYXRpb249UmVnaXN0ZXJpbmcgdGhlIEplcnNleSBzZXJ2bGV0IGFwcGxpY2F0aW9uLCBuYW1lZCB7MH0sIHdpdGggdGhlIEFwcGxpY2F0aW9uIGNsYXNzIG9mIHRoZSBzYW1lIG5hbWUuCitzZXJ2bGV0LmFzeW5jLmNvbnRleHQuYWxyZWFkeS5zdGFydGVkPVNlcnZsZXQgcmVxdWVzdCBoYXMgYmVlbiBwdXQgaW50byBhc3luY2hyb25vdXMgbW9kZSBieSBhbiBleHRlcm5hbCBmb3JjZS4gXAorICBQcm9jZWVkaW5nIHdpdGggdGhlIGV4aXN0aW5nIEFzeW5jQ29udGV4dCBpbnN0YW5jZSwgYnV0IGNhbm5vdCBndWFyYW50ZWUgdGhlIGNvcnJlY3QgYmVoYXZpb3Igb2YgSkFYLVJTIEFzeW5jUmVzcG9uc2UgdGltZS1vdXQgc3VwcG9ydC4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lcnMvamV0dHktaHR0cC9wb20ueG1sIGIvY29udGFpbmVycy9qZXR0eS1odHRwL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIzZDBiOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lcnMvamV0dHktaHR0cC9wb20ueG1sCkBAIC0wLDAgKzEsMTAxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLWpldHR5LWh0dHA8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktY29udGFpbmVyLWpldHR5LWh0dHA8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+SmV0dHkgSHR0cCBDb250YWluZXI8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmhrMi5leHRlcm5hbDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LmluamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1zZXJ2ZXI8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LXV0aWw8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LWNvbnRpbnVhdGlvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi5pc3RhY2s8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4taXN0YWNrLWNvbW1vbnMtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJ1aWxkLWhlbHBlci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5mZWxpeDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1idW5kbGUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisKKyAgICAgICAgPC9wbHVnaW5zPgorCisgICAgICAgIDxyZXNvdXJjZXM+CisgICAgICAgICAgICA8cmVzb3VyY2U+CisgICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL2phdmE8L2RpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZXM+CisgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPk1FVEEtSU5GLyoqLyo8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KKyAgICAgICAgICAgIDwvcmVzb3VyY2U+CisgICAgICAgICAgICA8cmVzb3VyY2U+CisgICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgorICAgICAgICAgICAgICAgIDxmaWx0ZXJpbmc+dHJ1ZTwvZmlsdGVyaW5nPgorICAgICAgICAgICAgPC9yZXNvdXJjZT4KKyAgICAgICAgPC9yZXNvdXJjZXM+CisgICAgPC9idWlsZD4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+dGVzdHNTa2lwSmRrNjwvaWQ+CisgICAgICAgICAgICA8YWN0aXZhdGlvbj4KKyAgICAgICAgICAgICAgICA8amRrPjEuNjwvamRrPgorICAgICAgICAgICAgPC9hY3RpdmF0aW9uPgorICAgICAgICAgICAgPHByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgPHNraXAudGVzdHM+dHJ1ZTwvc2tpcC50ZXN0cz4KKyAgICAgICAgICAgIDwvcHJvcGVydGllcz4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2NvbnRhaW5lcnMvamV0dHktaHR0cC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHR5L0pldHR5SHR0cENvbnRhaW5lci5qYXZhIGIvY29udGFpbmVycy9qZXR0eS1odHRwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamV0dHkvSmV0dHlIdHRwQ29udGFpbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE5Mzc3NQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lcnMvamV0dHktaHR0cC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHR5L0pldHR5SHR0cENvbnRhaW5lci5qYXZhCkBAIC0wLDAgKzEsNDU5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHR5OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkdlbmVyaWNUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuU2VjdXJpdHlDb250ZXh0OworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5NYXBQcm9wZXJ0aWVzRGVsZWdhdGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkFic3RyYWN0QmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5SZWZlcmVuY2luZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5FeHRlbmRlZExvZ2dlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uUmVmOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHR5LmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWwuUmVxdWVzdFNjb3BlZDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuQ29udGFpbmVyVXRpbHM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5Db250YWluZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5Db250YWluZXJSZXNwb25zZVdyaXRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLmpldHR5LmNvbnRpbnVhdGlvbi5Db250aW51YXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamV0dHkuY29udGludWF0aW9uLkNvbnRpbnVhdGlvbkxpc3RlbmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpldHR5LmNvbnRpbnVhdGlvbi5Db250aW51YXRpb25TdXBwb3J0OworaW1wb3J0IG9yZy5lY2xpcHNlLmpldHR5Lmh0dHAuSHR0cFN0YXR1czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZXR0eS5zZXJ2ZXIuUmVxdWVzdDsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZXR0eS5zZXJ2ZXIuUmVzcG9uc2U7CitpbXBvcnQgb3JnLmVjbGlwc2UuamV0dHkuc2VydmVyLmhhbmRsZXIuQWJzdHJhY3RIYW5kbGVyOworCisvKioKKyAqIEplcnNleSB7QGNvZGUgQ29udGFpbmVyfSBpbXBsZW1lbnRhdGlvbiBiYXNlZCBvbiBKZXR0eSB7QGxpbmsgb3JnLmVjbGlwc2UuamV0dHkuc2VydmVyLkhhbmRsZXJ9LgorICoKKyAqIEBhdXRob3IgQXJ1bCBEaGVzaWFzZWVsYW4gKGFydWxkQGFjbS5vcmcpCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEpldHR5SHR0cENvbnRhaW5lciBleHRlbmRzIEFic3RyYWN0SGFuZGxlciBpbXBsZW1lbnRzIENvbnRhaW5lciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBFeHRlbmRlZExvZ2dlciBMT0dHRVIgPQorICAgICAgICAgICAgbmV3IEV4dGVuZGVkTG9nZ2VyKExvZ2dlci5nZXRMb2dnZXIoSmV0dHlIdHRwQ29udGFpbmVyLmNsYXNzLmdldE5hbWUoKSksIExldmVsLkZJTkVTVCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUeXBlIFJFUVVFU1RfVFlQRSA9IChuZXcgR2VuZXJpY1R5cGU8UmVmPFJlcXVlc3Q+PigpIHt9KS5nZXRUeXBlKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHlwZSBSRVNQT05TRV9UWVBFID0gKG5ldyBHZW5lcmljVHlwZTxSZWY8UmVzcG9uc2U+PigpIHt9KS5nZXRUeXBlKCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJOQUxfU0VSVkVSX0VSUk9SID0gamF2YXgud3MucnMuY29yZS5SZXNwb25zZS5TdGF0dXMuSU5URVJOQUxfU0VSVkVSX0VSUk9SLmdldFN0YXR1c0NvZGUoKTsKKworICAgIC8qKgorICAgICAqIENhY2hlZCB2YWx1ZSBvZiBjb25maWd1cmF0aW9uIHByb3BlcnR5CisgICAgICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzI1JFU1BPTlNFX1NFVF9TVEFUVVNfT1ZFUl9TRU5EX0VSUk9SfS4KKyAgICAgKiBJZiB7QGNvZGUgdHJ1ZX0gbWV0aG9kIHtAbGluayBIdHRwU2VydmxldFJlc3BvbnNlI3NldFN0YXR1c30gaXMgdXNlZCBvdmVyIHtAbGluayBIdHRwU2VydmxldFJlc3BvbnNlI3NlbmRFcnJvcn0uCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGNvbmZpZ1NldFN0YXR1c092ZXJTZW5kRXJyb3I7CisKKyAgICAvKioKKyAgICAgKiBSZWZlcmVuY2luZyBmYWN0b3J5IGZvciBKZXR0eSByZXF1ZXN0LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEpldHR5UmVxdWVzdFJlZmVyZW5jaW5nRmFjdG9yeSBleHRlbmRzIFJlZmVyZW5jaW5nRmFjdG9yeTxSZXF1ZXN0PiB7CisgICAgICAgIEBJbmplY3QKKyAgICAgICAgcHVibGljIEpldHR5UmVxdWVzdFJlZmVyZW5jaW5nRmFjdG9yeShmaW5hbCBQcm92aWRlcjxSZWY8UmVxdWVzdD4+IHJlZmVyZW5jZUZhY3RvcnkpIHsKKyAgICAgICAgICAgIHN1cGVyKHJlZmVyZW5jZUZhY3RvcnkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVmZXJlbmNpbmcgZmFjdG9yeSBmb3IgSmV0dHkgcmVzcG9uc2UuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSmV0dHlSZXNwb25zZVJlZmVyZW5jaW5nRmFjdG9yeSBleHRlbmRzIFJlZmVyZW5jaW5nRmFjdG9yeTxSZXNwb25zZT4geworICAgICAgICBASW5qZWN0CisgICAgICAgIHB1YmxpYyBKZXR0eVJlc3BvbnNlUmVmZXJlbmNpbmdGYWN0b3J5KGZpbmFsIFByb3ZpZGVyPFJlZjxSZXNwb25zZT4+IHJlZmVyZW5jZUZhY3RvcnkpIHsKKyAgICAgICAgICAgIHN1cGVyKHJlZmVyZW5jZUZhY3RvcnkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQW4gaW50ZXJuYWwgYmluZGVyIHRvIGVuYWJsZSBKZXR0eSBIVFRQIGNvbnRhaW5lciBzcGVjaWZpYyB0eXBlcyBpbmplY3Rpb24uCisgICAgICogVGhpcyBiaW5kZXIgYWxsb3dzIHRvIGluamVjdCB1bmRlcmx5aW5nIEpldHR5IEhUVFAgcmVxdWVzdCBhbmQgcmVzcG9uc2UgaW5zdGFuY2VzLgorICAgICAqIE5vdGUgdGhhdCBzaW5jZSBKZXR0eSB7QGNvZGUgUmVxdWVzdH0gY2xhc3MgaXMgbm90IHByb3hpYWJsZSBhcyBpdCBkb2VzIG5vdCBleHBvc2UgYW4gZW1wdHkgY29uc3RydWN0b3IsCisgICAgICogdGhlIGluamVjdGlvbiBvZiBKZXR0eSByZXF1ZXN0IGluc3RhbmNlIGludG8gc2luZ2xldG9uIEpBWC1SUyBhbmQgSmVyc2V5IHByb3ZpZGVycyBpcyBvbmx5IHN1cHBvcnRlZCB2aWEKKyAgICAgKiB7QGxpbmsgamF2YXguaW5qZWN0LlByb3ZpZGVyIGluamVjdGlvbiBwcm92aWRlcn0uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSmV0dHlCaW5kZXIgZXh0ZW5kcyBBYnN0cmFjdEJpbmRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIGJpbmRGYWN0b3J5KEpldHR5UmVxdWVzdFJlZmVyZW5jaW5nRmFjdG9yeS5jbGFzcykudG8oUmVxdWVzdC5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgLnByb3h5KGZhbHNlKS5pbihSZXF1ZXN0U2NvcGVkLmNsYXNzKTsKKyAgICAgICAgICAgIGJpbmRGYWN0b3J5KFJlZmVyZW5jaW5nRmFjdG9yeS48UmVxdWVzdD5yZWZlcmVuY2VGYWN0b3J5KCkpLnRvKG5ldyBHZW5lcmljVHlwZTxSZWY8UmVxdWVzdD4+KCkge30pCisgICAgICAgICAgICAgICAgICAgIC5pbihSZXF1ZXN0U2NvcGVkLmNsYXNzKTsKKworICAgICAgICAgICAgYmluZEZhY3RvcnkoSmV0dHlSZXNwb25zZVJlZmVyZW5jaW5nRmFjdG9yeS5jbGFzcykudG8oUmVzcG9uc2UuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIC5wcm94eShmYWxzZSkuaW4oUmVxdWVzdFNjb3BlZC5jbGFzcyk7CisgICAgICAgICAgICBiaW5kRmFjdG9yeShSZWZlcmVuY2luZ0ZhY3RvcnkuPFJlc3BvbnNlPnJlZmVyZW5jZUZhY3RvcnkoKSkudG8obmV3IEdlbmVyaWNUeXBlPFJlZjxSZXNwb25zZT4+KCkge30pCisgICAgICAgICAgICAgICAgICAgIC5pbihSZXF1ZXN0U2NvcGVkLmNsYXNzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9sYXRpbGUgQXBwbGljYXRpb25IYW5kbGVyIGFwcEhhbmRsZXI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBoYW5kbGUoZmluYWwgU3RyaW5nIHRhcmdldCwgZmluYWwgUmVxdWVzdCByZXF1ZXN0LCBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgaHR0cFNlcnZsZXRSZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBIdHRwU2VydmxldFJlc3BvbnNlIGh0dHBTZXJ2bGV0UmVzcG9uc2UpIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSByZXF1ZXN0LmdldFJlc3BvbnNlKCk7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlV3JpdGVyIHJlc3BvbnNlV3JpdGVyID0gbmV3IFJlc3BvbnNlV3JpdGVyKHJlcXVlc3QsIHJlc3BvbnNlLCBjb25maWdTZXRTdGF0dXNPdmVyU2VuZEVycm9yKTsKKyAgICAgICAgZmluYWwgVVJJIGJhc2VVcmkgPSBnZXRCYXNlVXJpKHJlcXVlc3QpOworICAgICAgICBmaW5hbCBVUkkgcmVxdWVzdFVyaSA9IGdldFJlcXVlc3RVcmkocmVxdWVzdCwgYmFzZVVyaSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBDb250YWluZXJSZXF1ZXN0IHJlcXVlc3RDb250ZXh0ID0gbmV3IENvbnRhaW5lclJlcXVlc3QoCisgICAgICAgICAgICAgICAgICAgIGJhc2VVcmksCisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RVcmksCisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0TWV0aG9kKCksCisgICAgICAgICAgICAgICAgICAgIGdldFNlY3VyaXR5Q29udGV4dChyZXF1ZXN0KSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IE1hcFByb3BlcnRpZXNEZWxlZ2F0ZSgpKTsKKyAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LnNldEVudGl0eVN0cmVhbShyZXF1ZXN0LmdldElucHV0U3RyZWFtKCkpOworICAgICAgICAgICAgZmluYWwgRW51bWVyYXRpb248U3RyaW5nPiBoZWFkZXJOYW1lcyA9IHJlcXVlc3QuZ2V0SGVhZGVyTmFtZXMoKTsKKyAgICAgICAgICAgIHdoaWxlIChoZWFkZXJOYW1lcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBoZWFkZXJOYW1lID0gaGVhZGVyTmFtZXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgaGVhZGVyVmFsdWUgPSByZXF1ZXN0LmdldEhlYWRlcihoZWFkZXJOYW1lKTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5oZWFkZXJzKGhlYWRlck5hbWUsIGhlYWRlclZhbHVlID09IG51bGwgPyAiIiA6IGhlYWRlclZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LnNldFdyaXRlcihyZXNwb25zZVdyaXRlcik7CisgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5zZXRSZXF1ZXN0U2NvcGVkSW5pdGlhbGl6ZXIoaW5qZWN0aW9uTWFuYWdlciAtPiB7CisgICAgICAgICAgICAgICAgaW5qZWN0aW9uTWFuYWdlci48UmVmPFJlcXVlc3Q+PmdldEluc3RhbmNlKFJFUVVFU1RfVFlQRSkuc2V0KHJlcXVlc3QpOworICAgICAgICAgICAgICAgIGluamVjdGlvbk1hbmFnZXIuPFJlZjxSZXNwb25zZT4+Z2V0SW5zdGFuY2UoUkVTUE9OU0VfVFlQRSkuc2V0KHJlc3BvbnNlKTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAvLyBNYXJrIHRoZSByZXF1ZXN0IGFzIGhhbmRsZWQgYmVmb3JlIGdlbmVyYXRpbmcgdGhlIGJvZHkgb2YgdGhlIHJlc3BvbnNlCisgICAgICAgICAgICByZXF1ZXN0LnNldEhhbmRsZWQodHJ1ZSk7CisgICAgICAgICAgICBhcHBIYW5kbGVyLmhhbmRsZShyZXF1ZXN0Q29udGV4dCk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwcml2YXRlIFVSSSBnZXRSZXF1ZXN0VXJpKGZpbmFsIFJlcXVlc3QgcmVxdWVzdCwgZmluYWwgVVJJIGJhc2VVcmkpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzZXJ2ZXJBZGRyZXNzID0gZ2V0U2VydmVyQWRkcmVzcyhiYXNlVXJpKTsKKyAgICAgICAgICAgIFN0cmluZyB1cmkgPSByZXF1ZXN0LmdldFJlcXVlc3RVUkkoKTsKKworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHF1ZXJ5U3RyaW5nID0gcmVxdWVzdC5nZXRRdWVyeVN0cmluZygpOworICAgICAgICAgICAgaWYgKHF1ZXJ5U3RyaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB1cmkgPSB1cmkgKyAiPyIgKyBDb250YWluZXJVdGlscy5lbmNvZGVVbnNhZmVDaGFyYWN0ZXJzKHF1ZXJ5U3RyaW5nKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkkoc2VydmVyQWRkcmVzcyArIHVyaSk7CisgICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRTZXJ2ZXJBZGRyZXNzKFVSSSBiYXNlVXJpKSB7CisgICAgICAgIFN0cmluZyBzZXJ2ZXJBZGRyZXNzID0gYmFzZVVyaS50b1N0cmluZygpOworICAgICAgICBpZiAoc2VydmVyQWRkcmVzcy5jaGFyQXQoc2VydmVyQWRkcmVzcy5sZW5ndGgoKSAtIDEpID09ICcvJykgeworICAgICAgICAgICAgcmV0dXJuIHNlcnZlckFkZHJlc3Muc3Vic3RyaW5nKDAsIHNlcnZlckFkZHJlc3MubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2VydmVyQWRkcmVzczsKKyAgICB9CisKKyAgICBwcml2YXRlIFNlY3VyaXR5Q29udGV4dCBnZXRTZWN1cml0eUNvbnRleHQoZmluYWwgUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIHJldHVybiBuZXcgU2VjdXJpdHlDb250ZXh0KCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzVXNlckluUm9sZShmaW5hbCBTdHJpbmcgcm9sZSkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXF1ZXN0LmlzVXNlckluUm9sZShyb2xlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1NlY3VyZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5pc1NlY3VyZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBQcmluY2lwYWwgZ2V0VXNlclByaW5jaXBhbCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRVc2VyUHJpbmNpcGFsKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRBdXRoZW50aWNhdGlvblNjaGVtZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRBdXRoVHlwZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworCisgICAgcHJpdmF0ZSBVUkkgZ2V0QmFzZVVyaShmaW5hbCBSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVVJJKHJlcXVlc3QuZ2V0U2NoZW1lKCksIG51bGwsIHJlcXVlc3QuZ2V0U2VydmVyTmFtZSgpLAorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmdldFNlcnZlclBvcnQoKSwgZ2V0QmFzZVBhdGgocmVxdWVzdCksIG51bGwsIG51bGwpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBVUklTeW50YXhFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QmFzZVBhdGgoZmluYWwgUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBjb250ZXh0UGF0aCA9IHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKTsKKworICAgICAgICBpZiAoY29udGV4dFBhdGggPT0gbnVsbCB8fCBjb250ZXh0UGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiAiLyI7CisgICAgICAgIH0gZWxzZSBpZiAoY29udGV4dFBhdGguY2hhckF0KGNvbnRleHRQYXRoLmxlbmd0aCgpIC0gMSkgIT0gJy8nKSB7CisgICAgICAgICAgICByZXR1cm4gY29udGV4dFBhdGggKyAiLyI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gY29udGV4dFBhdGg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXNwb25zZVdyaXRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlc3BvbnNlV3JpdGVyIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlOworICAgICAgICBwcml2YXRlIGZpbmFsIENvbnRpbnVhdGlvbiBjb250aW51YXRpb247CisgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBjb25maWdTZXRTdGF0dXNPdmVyU2VuZEVycm9yOworCisgICAgICAgIFJlc3BvbnNlV3JpdGVyKGZpbmFsIFJlcXVlc3QgcmVxdWVzdCwgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UsIGZpbmFsIGJvb2xlYW4gY29uZmlnU2V0U3RhdHVzT3ZlclNlbmRFcnJvcikgeworICAgICAgICAgICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlOworICAgICAgICAgICAgdGhpcy5jb250aW51YXRpb24gPSBDb250aW51YXRpb25TdXBwb3J0LmdldENvbnRpbnVhdGlvbihyZXF1ZXN0KTsKKyAgICAgICAgICAgIHRoaXMuY29uZmlnU2V0U3RhdHVzT3ZlclNlbmRFcnJvciA9IGNvbmZpZ1NldFN0YXR1c092ZXJTZW5kRXJyb3I7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE91dHB1dFN0cmVhbSB3cml0ZVJlc3BvbnNlU3RhdHVzQW5kSGVhZGVycyhmaW5hbCBsb25nIGNvbnRlbnRMZW5ndGgsIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIGNvbnRleHQpCisgICAgICAgICAgICAgICAgdGhyb3dzIENvbnRhaW5lckV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIGZpbmFsIGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2UuU3RhdHVzVHlwZSBzdGF0dXNJbmZvID0gY29udGV4dC5nZXRTdGF0dXNJbmZvKCk7CisKKyAgICAgICAgICAgIGZpbmFsIGludCBjb2RlID0gc3RhdHVzSW5mby5nZXRTdGF0dXNDb2RlKCk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVhc29uID0gc3RhdHVzSW5mby5nZXRSZWFzb25QaHJhc2UoKSA9PSBudWxsCisgICAgICAgICAgICAgICAgICAgID8gSHR0cFN0YXR1cy5nZXRNZXNzYWdlKGNvZGUpIDogc3RhdHVzSW5mby5nZXRSZWFzb25QaHJhc2UoKTsKKworICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RhdHVzV2l0aFJlYXNvbihjb2RlLCByZWFzb24pOworCisgICAgICAgICAgICBpZiAoY29udGVudExlbmd0aCAhPSAtMSAmJiBjb250ZW50TGVuZ3RoIDwgSW50ZWdlci5NQVhfVkFMVUUpIHsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRDb250ZW50TGVuZ3RoKChpbnQpIGNvbnRlbnRMZW5ndGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGUgOiBjb250ZXh0LmdldFN0cmluZ0hlYWRlcnMoKS5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgdmFsdWUgOiBlLmdldFZhbHVlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuYWRkSGVhZGVyKGUuZ2V0S2V5KCksIHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbnRhaW5lckV4Y2VwdGlvbigiRXJyb3IgZHVyaW5nIHdyaXRpbmcgb3V0IHRoZSByZXNwb25zZSBoZWFkZXJzLiIsIGlvZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gc3VzcGVuZChmaW5hbCBsb25nIHRpbWVPdXQsIGZpbmFsIFRpbWVVbml0IHRpbWVVbml0LCBmaW5hbCBUaW1lb3V0SGFuZGxlciB0aW1lb3V0SGFuZGxlcikgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAodGltZU91dCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyB0aW1lb3V0TWlsbGlzID0gVGltZVVuaXQuTUlMTElTRUNPTkRTLmNvbnZlcnQodGltZU91dCwgdGltZVVuaXQpOworICAgICAgICAgICAgICAgICAgICBjb250aW51YXRpb24uc2V0VGltZW91dCh0aW1lb3V0TWlsbGlzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGludWF0aW9uLmFkZENvbnRpbnVhdGlvbkxpc3RlbmVyKG5ldyBDb250aW51YXRpb25MaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUoZmluYWwgQ29udGludWF0aW9uIGNvbnRpbnVhdGlvbikgeworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVGltZW91dChmaW5hbCBDb250aW51YXRpb24gY29udGludWF0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGltZW91dEhhbmRsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXRIYW5kbGVyLm9uVGltZW91dChSZXNwb25zZVdyaXRlci50aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIGNvbnRpbnVhdGlvbi5zdXNwZW5kKHJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRTdXNwZW5kVGltZW91dChmaW5hbCBsb25nIHRpbWVPdXQsIGZpbmFsIFRpbWVVbml0IHRpbWVVbml0KSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmICh0aW1lT3V0ID4gMCkgeworICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgdGltZW91dE1pbGxpcyA9IFRpbWVVbml0Lk1JTExJU0VDT05EUy5jb252ZXJ0KHRpbWVPdXQsIHRpbWVVbml0KTsKKyAgICAgICAgICAgICAgICBjb250aW51YXRpb24uc2V0VGltZW91dCh0aW1lb3V0TWlsbGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjb21taXQoKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlc3BvbnNlLmNsb3NlT3V0cHV0KCk7CisgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5XQVJOSU5HLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5VTkFCTEVfVE9fQ0xPU0VfUkVTUE9OU0UoKSwgZSk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChjb250aW51YXRpb24uaXNTdXNwZW5kZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51YXRpb24uY29tcGxldGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5GSU5FU1QsICJjb21taXQoKSBjYWxsZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmYWlsdXJlKGZpbmFsIFRocm93YWJsZSBlcnJvcikgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlLmlzQ29tbWl0dGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWdTZXRTdGF0dXNPdmVyU2VuZEVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UucmVzZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL25vaW5zcGVjdGlvbiBkZXByZWNhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhJTlRFUk5BTF9TRVJWRVJfRVJST1IsICJSZXF1ZXN0IGZhaWxlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKElOVEVSTkFMX1NFUlZFUl9FUlJPUiwgIlJlcXVlc3QgZmFpbGVkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGEgcmFjZSBjb25kaXRpb24gZXh0ZXJuYWxseSBjb21taXR0aW5nIHRoZSByZXNwb25zZSBjYW4gc3RpbGwgb2NjdXIuLi4KKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuRklORVIsICJVbmFibGUgdG8gcmVzZXQgZmFpbGVkIHJlc3BvbnNlLiIsIGV4KTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb250YWluZXJFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuRVhDRVBUSU9OX1NFTkRJTkdfRVJST1JfUkVTUE9OU0UoSU5URVJOQUxfU0VSVkVSX0VSUk9SLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVxdWVzdCBmYWlsZWQuIiksIGV4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5GSU5FU1QsICJmYWlsdXJlKC4uLikgY2FsbGVkIik7CisgICAgICAgICAgICAgICAgY29tbWl0KCk7CisgICAgICAgICAgICAgICAgcmV0aHJvdyhlcnJvcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZW5hYmxlUmVzcG9uc2VCdWZmZXJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0aHJvdyB0aGUgb3JpZ2luYWwgZXhjZXB0aW9uIGFzIHJlcXVpcmVkIGJ5IEpBWC1SUywgMy4zLjQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBlcnJvciB0aHJvd2FibGUgdG8gYmUgcmUtdGhyb3duCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgcmV0aHJvdyhmaW5hbCBUaHJvd2FibGUgZXJyb3IpIHsKKyAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbikgZXJyb3I7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb250YWluZXJFeGNlcHRpb24oZXJyb3IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb3VyY2VDb25maWcgZ2V0Q29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGFwcEhhbmRsZXIuZ2V0Q29uZmlndXJhdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlbG9hZCgpIHsKKyAgICAgICAgcmVsb2FkKGdldENvbmZpZ3VyYXRpb24oKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVsb2FkKGZpbmFsIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgYXBwSGFuZGxlci5vblNodXRkb3duKHRoaXMpOworCisgICAgICAgIGFwcEhhbmRsZXIgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKGNvbmZpZ3VyYXRpb24ucmVnaXN0ZXIobmV3IEpldHR5QmluZGVyKCkpKTsKKyAgICAgICAgYXBwSGFuZGxlci5vblJlbG9hZCh0aGlzKTsKKyAgICAgICAgYXBwSGFuZGxlci5vblN0YXJ0dXAodGhpcyk7CisgICAgICAgIGNhY2hlQ29uZmlnU2V0U3RhdHVzT3ZlclNlbmRFcnJvcigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBcHBsaWNhdGlvbkhhbmRsZXIgZ2V0QXBwbGljYXRpb25IYW5kbGVyKCkgeworICAgICAgICByZXR1cm4gYXBwSGFuZGxlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmZvcm0gdGhpcyBjb250YWluZXIgdGhhdCB0aGUgc2VydmVyIGhhcyBiZWVuIHN0YXJ0ZWQuCisgICAgICogVGhpcyBtZXRob2QgbXVzdCBiZSBpbXBsaWNpdGx5IGNhbGxlZCBhZnRlciB0aGUgc2VydmVyIGNvbnRhaW5pbmcgdGhpcyBjb250YWluZXIgaXMgc3RhcnRlZC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiBpZiBhIHByb2JsZW0gb2NjdXJyZWQgZHVyaW5nIHNlcnZlciBzdGFydHVwLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGRvU3RhcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuZG9TdGFydCgpOworICAgICAgICBhcHBIYW5kbGVyLm9uU3RhcnR1cCh0aGlzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmZvcm0gdGhpcyBjb250YWluZXIgdGhhdCB0aGUgc2VydmVyIGlzIGJlaW5nIHN0b3BwZWQuCisgICAgICogVGhpcyBtZXRob2QgbXVzdCBiZSBpbXBsaWNpdGx5IGNhbGxlZCBiZWZvcmUgdGhlIHNlcnZlciBjb250YWluaW5nIHRoaXMgY29udGFpbmVyIGlzIHN0b3BwZWQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5FeGNlcHRpb24gaWYgYSBwcm9ibGVtIG9jY3VycmVkIGR1cmluZyBzZXJ2ZXIgc2h1dGRvd24uCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZG9TdG9wKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLmRvU3RvcCgpOworICAgICAgICBhcHBIYW5kbGVyLm9uU2h1dGRvd24odGhpcyk7CisgICAgICAgIGFwcEhhbmRsZXIgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBKZXR0eSBIVFRQIGNvbnRhaW5lci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcHBsaWNhdGlvbiAgIEpBWC1SUyAvIEplcnNleSBhcHBsaWNhdGlvbiB0byBiZSBkZXBsb3llZCBvbiBKZXR0eSBIVFRQIGNvbnRhaW5lci4KKyAgICAgKiBAcGFyYW0gcGFyZW50Q29udGV4dCBESSBwcm92aWRlciBzcGVjaWZpYyBjb250ZXh0IHdpdGggYXBwbGljYXRpb24ncyByZWdpc3RlcmVkIGJpbmRpbmdzLgorICAgICAqLworICAgIEpldHR5SHR0cENvbnRhaW5lcihmaW5hbCBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiwgZmluYWwgT2JqZWN0IHBhcmVudENvbnRleHQpIHsKKyAgICAgICAgdGhpcy5hcHBIYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihhcHBsaWNhdGlvbiwgbmV3IEpldHR5QmluZGVyKCksIHBhcmVudENvbnRleHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBKZXR0eSBIVFRQIGNvbnRhaW5lci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcHBsaWNhdGlvbiBKQVgtUlMgLyBKZXJzZXkgYXBwbGljYXRpb24gdG8gYmUgZGVwbG95ZWQgb24gSmV0dHkgSFRUUCBjb250YWluZXIuCisgICAgICovCisgICAgSmV0dHlIdHRwQ29udGFpbmVyKGZpbmFsIEFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uKSB7CisgICAgICAgIHRoaXMuYXBwSGFuZGxlciA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIoYXBwbGljYXRpb24sIG5ldyBKZXR0eUJpbmRlcigpKTsKKworICAgICAgICBjYWNoZUNvbmZpZ1NldFN0YXR1c092ZXJTZW5kRXJyb3IoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWV0aG9kIHJlYWRzIGFuZCBjYWNoZXMgdmFsdWUgb2YgY29uZmlndXJhdGlvbiBwcm9wZXJ0eQorICAgICAqIHtAbGluayBTZXJ2ZXJQcm9wZXJ0aWVzI1JFU1BPTlNFX1NFVF9TVEFUVVNfT1ZFUl9TRU5EX0VSUk9SfSBmb3IgZnV0dXJlIHB1cnBvc2VzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjYWNoZUNvbmZpZ1NldFN0YXR1c092ZXJTZW5kRXJyb3IoKSB7CisgICAgICAgIHRoaXMuY29uZmlnU2V0U3RhdHVzT3ZlclNlbmRFcnJvciA9IFNlcnZlclByb3BlcnRpZXMuZ2V0VmFsdWUoZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnRpZXMoKSwKKyAgICAgICAgICAgICAgICBTZXJ2ZXJQcm9wZXJ0aWVzLlJFU1BPTlNFX1NFVF9TVEFUVVNfT1ZFUl9TRU5EX0VSUk9SLCBmYWxzZSwgQm9vbGVhbi5jbGFzcyk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXJzL2pldHR5LWh0dHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0eS9KZXR0eUh0dHBDb250YWluZXJGYWN0b3J5LmphdmEgYi9jb250YWluZXJzL2pldHR5LWh0dHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0eS9KZXR0eUh0dHBDb250YWluZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE1NWVhNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lcnMvamV0dHktaHR0cC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHR5L0pldHR5SHR0cENvbnRhaW5lckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDMwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0eTsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRGYWN0b3J5OworCitpbXBvcnQgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhLlRocmVhZEZhY3RvcnlCdWlsZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHR5LmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuSmVyc2V5UHJvY2Vzc2luZ1VuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5Db250YWluZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZXR0eS5zZXJ2ZXIuQ29ubmVjdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpldHR5LnNlcnZlci5IdHRwQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZXR0eS5zZXJ2ZXIuSHR0cENvbm5lY3Rpb25GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpldHR5LnNlcnZlci5TZWN1cmVSZXF1ZXN0Q3VzdG9taXplcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZXR0eS5zZXJ2ZXIuU2VydmVyOworaW1wb3J0IG9yZy5lY2xpcHNlLmpldHR5LnNlcnZlci5TZXJ2ZXJDb25uZWN0b3I7CitpbXBvcnQgb3JnLmVjbGlwc2UuamV0dHkuc2VydmVyLlNzbENvbm5lY3Rpb25GYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpldHR5LnV0aWwuc3NsLlNzbENvbnRleHRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLmpldHR5LnV0aWwudGhyZWFkLlF1ZXVlZFRocmVhZFBvb2w7CisKKy8qKgorICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgYW5kIHN0YXJ0aW5nIEpldHR5IHNlcnZlciBoYW5kbGVycy4gVGhpcyByZXR1cm5zCisgKiBhIGhhbmRsZSB0byB0aGUgc3RhcnRlZCBzZXJ2ZXIgYXMge0BsaW5rIFNlcnZlcn0gaW5zdGFuY2VzLCB3aGljaCBhbGxvd3MKKyAqIHRoZSBzZXJ2ZXIgdG8gYmUgc3RvcHBlZCBieSBpbnZva2luZyB0aGUge0BsaW5rIG9yZy5lY2xpcHNlLmpldHR5LnNlcnZlci5TZXJ2ZXIjc3RvcCgpfSBtZXRob2QuCisgKiA8cC8+CisgKiBUbyBzdGFydCB0aGUgc2VydmVyIGluIEhUVFBTIG1vZGUgYW4ge0BsaW5rIFNzbENvbnRleHRGYWN0b3J5fSBjYW4gYmUgcHJvdmlkZWQuCisgKiBUaGlzIHdpbGwgYmUgdXNlZCB0byBkZWNyeXB0IGFuZCBlbmNyeXB0IGluZm9ybWF0aW9uIHNlbnQgb3ZlciB0aGUKKyAqIGNvbm5lY3RlZCBUQ1Agc29ja2V0IGNoYW5uZWwuCisgKgorICogQGF1dGhvciBBcnVsIERoZXNpYXNlZWxhbiAoYXJ1bGRAYWNtLm9yZykKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBKZXR0eUh0dHBDb250YWluZXJGYWN0b3J5IHsKKworICAgIHByaXZhdGUgSmV0dHlIdHRwQ29udGFpbmVyRmFjdG9yeSgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEge0BsaW5rIFNlcnZlcn0gaW5zdGFuY2UgdGhhdCByZWdpc3RlcnMgYW4ge0BsaW5rIG9yZy5lY2xpcHNlLmpldHR5LnNlcnZlci5IYW5kbGVyfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgdXJpIG9uIHdoaWNoIHRoZSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlcn0gd2lsbCBiZSBkZXBsb3llZC4gT25seSBmaXJzdCBwYXRoCisgICAgICogICAgICAgICAgICBzZWdtZW50IHdpbGwgYmUgdXNlZCBhcyBjb250ZXh0IHBhdGgsIHRoZSByZXN0IHdpbGwgYmUgaWdub3JlZC4KKyAgICAgKiBAcmV0dXJuIG5ld2x5IGNyZWF0ZWQge0BsaW5rIFNlcnZlcn0uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24gICAgICBpbiBjYXNlIG9mIGFueSBmYWlsdXJlIHdoZW4gY3JlYXRpbmcgYSBuZXcgSmV0dHkge0Bjb2RlIFNlcnZlcn0gaW5zdGFuY2UuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYge0Bjb2RlIHVyaX0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU2VydmVyIGNyZWF0ZVNlcnZlcihmaW5hbCBVUkkgdXJpKSB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjcmVhdGVTZXJ2ZXIodXJpLCBudWxsLCBudWxsLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEge0BsaW5rIFNlcnZlcn0gaW5zdGFuY2UgdGhhdCByZWdpc3RlcnMgYW4ge0BsaW5rIG9yZy5lY2xpcHNlLmpldHR5LnNlcnZlci5IYW5kbGVyfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgICB1cmkgb24gd2hpY2ggdGhlIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyfSB3aWxsIGJlIGRlcGxveWVkLiBPbmx5IGZpcnN0IHBhdGgKKyAgICAgKiAgICAgICAgICAgICAgc2VnbWVudCB3aWxsIGJlIHVzZWQgYXMgY29udGV4dCBwYXRoLCB0aGUgcmVzdCB3aWxsIGJlIGlnbm9yZWQuCisgICAgICogQHBhcmFtIHN0YXJ0IGlmIHNldCB0byBmYWxzZSwgc2VydmVyIHdpbGwgbm90IGdldCBzdGFydGVkLCB3aGljaCBhbGxvd3MgdG8gY29uZmlndXJlIHRoZSB1bmRlcmx5aW5nIHRyYW5zcG9ydAorICAgICAqICAgICAgICAgICAgICBsYXllciwgc2VlIGFib3ZlIGZvciBkZXRhaWxzLgorICAgICAqIEByZXR1cm4gbmV3bHkgY3JlYXRlZCB7QGxpbmsgU2VydmVyfS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiAgICAgIGluIGNhc2Ugb2YgYW55IGZhaWx1cmUgd2hlbiBjcmVhdGluZyBhIG5ldyBKZXR0eSB7QGNvZGUgU2VydmVyfSBpbnN0YW5jZS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB7QGNvZGUgdXJpfSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTZXJ2ZXIgY3JlYXRlU2VydmVyKGZpbmFsIFVSSSB1cmksIGZpbmFsIGJvb2xlYW4gc3RhcnQpIHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZVNlcnZlcih1cmksIG51bGwsIG51bGwsIHN0YXJ0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSB7QGxpbmsgU2VydmVyfSB0aGF0IHJlZ2lzdGVycyBhbiB7QGxpbmsgb3JnLmVjbGlwc2UuamV0dHkuc2VydmVyLkhhbmRsZXJ9IHRoYXQKKyAgICAgKiBpbiB0dXJuIG1hbmFnZXMgYWxsIHJvb3QgcmVzb3VyY2UgYW5kIHByb3ZpZGVyIGNsYXNzZXMgZGVjbGFyZWQgYnkgdGhlCisgICAgICogcmVzb3VyY2UgY29uZmlndXJhdGlvbi4KKyAgICAgKiA8cC8+CisgICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBkZWZlcnMgdG8gdGhlCisgICAgICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJGYWN0b3J5I2NyZWF0ZUNvbnRhaW5lcihDbGFzcywgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbil9IG1ldGhvZAorICAgICAqIGZvciBjcmVhdGluZyBhbiBDb250YWluZXIgdGhhdCBtYW5hZ2VzIHRoZSByb290IHJlc291cmNlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgICAgdGhlIFVSSSB0byBjcmVhdGUgdGhlIGh0dHAgc2VydmVyLiBUaGUgVVJJIHNjaGVtZSBtdXN0IGJlCisgICAgICogICAgICAgICAgICAgICBlcXVhbCB0byAiaHR0cCIuIFRoZSBVUkkgdXNlciBpbmZvcm1hdGlvbiBhbmQgaG9zdAorICAgICAqICAgICAgICAgICAgICAgYXJlIGlnbm9yZWQgSWYgdGhlIFVSSSBwb3J0IGlzIG5vdCBwcmVzZW50IHRoZW4gcG9ydCA4MCB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICB1c2VkLiBUaGUgVVJJIHBhdGgsIHF1ZXJ5IGFuZCBmcmFnbWVudCBjb21wb25lbnRzIGFyZSBpZ25vcmVkLgorICAgICAqIEBwYXJhbSBjb25maWcgdGhlIHJlc291cmNlIGNvbmZpZ3VyYXRpb24uCisgICAgICogQHJldHVybiBuZXdseSBjcmVhdGVkIHtAbGluayBTZXJ2ZXJ9LgorICAgICAqCisgICAgICogQHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uICAgICAgaW4gY2FzZSBvZiBhbnkgZmFpbHVyZSB3aGVuIGNyZWF0aW5nIGEgbmV3IEpldHR5IHtAY29kZSBTZXJ2ZXJ9IGluc3RhbmNlLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHtAY29kZSB1cml9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNlcnZlciBjcmVhdGVTZXJ2ZXIoZmluYWwgVVJJIHVyaSwgZmluYWwgUmVzb3VyY2VDb25maWcgY29uZmlnKQorICAgICAgICAgICAgdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24geworCisgICAgICAgIGZpbmFsIEpldHR5SHR0cENvbnRhaW5lciBjb250YWluZXIgPSBDb250YWluZXJGYWN0b3J5LmNyZWF0ZUNvbnRhaW5lcihKZXR0eUh0dHBDb250YWluZXIuY2xhc3MsIGNvbmZpZyk7CisgICAgICAgIHJldHVybiBjcmVhdGVTZXJ2ZXIodXJpLCBudWxsLCBjb250YWluZXIsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHtAbGluayBTZXJ2ZXJ9IHRoYXQgcmVnaXN0ZXJzIGFuIHtAbGluayBvcmcuZWNsaXBzZS5qZXR0eS5zZXJ2ZXIuSGFuZGxlcn0gdGhhdAorICAgICAqIGluIHR1cm4gbWFuYWdlcyBhbGwgcm9vdCByZXNvdXJjZSBhbmQgcHJvdmlkZXIgY2xhc3NlcyBkZWNsYXJlZCBieSB0aGUKKyAgICAgKiByZXNvdXJjZSBjb25maWd1cmF0aW9uLgorICAgICAqIDxwLz4KKyAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGRlZmVycyB0byB0aGUKKyAgICAgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lckZhY3RvcnkjY3JlYXRlQ29udGFpbmVyKENsYXNzLCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uKX0gbWV0aG9kCisgICAgICogZm9yIGNyZWF0aW5nIGFuIENvbnRhaW5lciB0aGF0IG1hbmFnZXMgdGhlIHJvb3QgcmVzb3VyY2VzLgorICAgICAqCisgICAgICogQHBhcmFtIHVyaSAgICAgICAgICAgVVJJIG9uIHdoaWNoIHRoZSBKZXJzZXkgd2ViIGFwcGxpY2F0aW9uIHdpbGwgYmUgZGVwbG95ZWQuIE9ubHkgZmlyc3QgcGF0aCBzZWdtZW50IHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB1c2VkIGFzIGNvbnRleHQgcGF0aCwgdGhlIHJlc3Qgd2lsbCBiZSBpZ25vcmVkLgorICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uIHdlYiBhcHBsaWNhdGlvbiBjb25maWd1cmF0aW9uLgorICAgICAqIEBwYXJhbSBzdGFydCAgICAgICAgIGlmIHNldCB0byBmYWxzZSwgc2VydmVyIHdpbGwgbm90IGdldCBzdGFydGVkLCB3aGljaCBhbGxvd3MgdG8gY29uZmlndXJlIHRoZSB1bmRlcmx5aW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgdHJhbnNwb3J0IGxheWVyLCBzZWUgYWJvdmUgZm9yIGRldGFpbHMuCisgICAgICogQHJldHVybiBuZXdseSBjcmVhdGVkIHtAbGluayBTZXJ2ZXJ9LgorICAgICAqCisgICAgICogQHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uICAgICAgaW4gY2FzZSBvZiBhbnkgZmFpbHVyZSB3aGVuIGNyZWF0aW5nIGEgbmV3IEpldHR5IHtAY29kZSBTZXJ2ZXJ9IGluc3RhbmNlLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHtAY29kZSB1cml9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNlcnZlciBjcmVhdGVTZXJ2ZXIoZmluYWwgVVJJIHVyaSwgZmluYWwgUmVzb3VyY2VDb25maWcgY29uZmlndXJhdGlvbiwgZmluYWwgYm9vbGVhbiBzdGFydCkKKyAgICAgICAgICAgIHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZVNlcnZlcih1cmksIG51bGwsIENvbnRhaW5lckZhY3RvcnkuY3JlYXRlQ29udGFpbmVyKEpldHR5SHR0cENvbnRhaW5lci5jbGFzcywgY29uZmlndXJhdGlvbiksIHN0YXJ0KTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHtAbGluayBTZXJ2ZXJ9IHRoYXQgcmVnaXN0ZXJzIGFuIHtAbGluayBvcmcuZWNsaXBzZS5qZXR0eS5zZXJ2ZXIuSGFuZGxlcn0gdGhhdAorICAgICAqIGluIHR1cm4gbWFuYWdlcyBhbGwgcm9vdCByZXNvdXJjZSBhbmQgcHJvdmlkZXIgY2xhc3NlcyBkZWNsYXJlZCBieSB0aGUKKyAgICAgKiByZXNvdXJjZSBjb25maWd1cmF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHVyaSAgICAgICAgICAgdGhlIFVSSSB0byBjcmVhdGUgdGhlIGh0dHAgc2VydmVyLiBUaGUgVVJJIHNjaGVtZSBtdXN0IGJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgZXF1YWwgdG8gImh0dHBzIi4gVGhlIFVSSSB1c2VyIGluZm9ybWF0aW9uIGFuZCBob3N0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgYXJlIGlnbm9yZWQgSWYgdGhlIFVSSSBwb3J0IGlzIG5vdCBwcmVzZW50IHRoZW4gcG9ydCAxNDMgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHVzZWQuIFRoZSBVUkkgcGF0aCwgcXVlcnkgYW5kIGZyYWdtZW50IGNvbXBvbmVudHMgYXJlIGlnbm9yZWQuCisgICAgICogQHBhcmFtIGNvbmZpZyAgICAgICAgdGhlIHJlc291cmNlIGNvbmZpZ3VyYXRpb24uCisgICAgICogQHBhcmFtIHBhcmVudENvbnRleHQgREkgcHJvdmlkZXIgc3BlY2lmaWMgY29udGV4dCB3aXRoIGFwcGxpY2F0aW9uJ3MgcmVnaXN0ZXJlZCBiaW5kaW5ncy4KKyAgICAgKiBAcGFyYW0gc3RhcnQgICAgICAgICBpZiBzZXQgdG8gZmFsc2UsIHNlcnZlciB3aWxsIG5vdCBnZXQgc3RhcnRlZCwgdGhpcyBhbGxvd3MgZW5kIHVzZXJzIHRvIHNldAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWwgcHJvcGVydGllcyBvbiB0aGUgdW5kZXJseWluZyBsaXN0ZW5lci4KKyAgICAgKiBAcmV0dXJuIG5ld2x5IGNyZWF0ZWQge0BsaW5rIFNlcnZlcn0uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24gICAgICBpbiBjYXNlIG9mIGFueSBmYWlsdXJlIHdoZW4gY3JlYXRpbmcgYSBuZXcgSmV0dHkge0Bjb2RlIFNlcnZlcn0gaW5zdGFuY2UuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYge0Bjb2RlIHVyaX0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEBzZWUgSmV0dHlIdHRwQ29udGFpbmVyCisgICAgICogQHNpbmNlIDIuMTIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNlcnZlciBjcmVhdGVTZXJ2ZXIoZmluYWwgVVJJIHVyaSwgZmluYWwgUmVzb3VyY2VDb25maWcgY29uZmlnLCBmaW5hbCBib29sZWFuIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgcGFyZW50Q29udGV4dCkgeworICAgICAgICByZXR1cm4gY3JlYXRlU2VydmVyKHVyaSwgbnVsbCwgbmV3IEpldHR5SHR0cENvbnRhaW5lcihjb25maWcsIHBhcmVudENvbnRleHQpLCBzdGFydCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSB7QGxpbmsgU2VydmVyfSB0aGF0IHJlZ2lzdGVycyBhbiB7QGxpbmsgb3JnLmVjbGlwc2UuamV0dHkuc2VydmVyLkhhbmRsZXJ9IHRoYXQKKyAgICAgKiBpbiB0dXJuIG1hbmFnZXMgYWxsIHJvb3QgcmVzb3VyY2UgYW5kIHByb3ZpZGVyIGNsYXNzZXMgZGVjbGFyZWQgYnkgdGhlCisgICAgICogcmVzb3VyY2UgY29uZmlndXJhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgICAgICAgICAgIHRoZSBVUkkgdG8gY3JlYXRlIHRoZSBodHRwIHNlcnZlci4gVGhlIFVSSSBzY2hlbWUgbXVzdCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGVxdWFsIHRvICJodHRwcyIuIFRoZSBVUkkgdXNlciBpbmZvcm1hdGlvbiBhbmQgaG9zdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFyZSBpZ25vcmVkIElmIHRoZSBVUkkgcG9ydCBpcyBub3QgcHJlc2VudCB0aGVuIHBvcnQgMTQzIHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB1c2VkLiBUaGUgVVJJIHBhdGgsIHF1ZXJ5IGFuZCBmcmFnbWVudCBjb21wb25lbnRzIGFyZSBpZ25vcmVkLgorICAgICAqIEBwYXJhbSBjb25maWcgICAgICAgIHRoZSByZXNvdXJjZSBjb25maWd1cmF0aW9uLgorICAgICAqIEBwYXJhbSBwYXJlbnRDb250ZXh0IERJIHByb3ZpZGVyIHNwZWNpZmljIGNvbnRleHQgd2l0aCBhcHBsaWNhdGlvbidzIHJlZ2lzdGVyZWQgYmluZGluZ3MuCisgICAgICogQHJldHVybiBuZXdseSBjcmVhdGVkIHtAbGluayBTZXJ2ZXJ9LgorICAgICAqCisgICAgICogQHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uICAgICAgaW4gY2FzZSBvZiBhbnkgZmFpbHVyZSB3aGVuIGNyZWF0aW5nIGEgbmV3IEpldHR5IHtAY29kZSBTZXJ2ZXJ9IGluc3RhbmNlLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHtAY29kZSB1cml9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2VlIEpldHR5SHR0cENvbnRhaW5lcgorICAgICAqIEBzaW5jZSAyLjEyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTZXJ2ZXIgY3JlYXRlU2VydmVyKGZpbmFsIFVSSSB1cmksIGZpbmFsIFJlc291cmNlQ29uZmlnIGNvbmZpZywgZmluYWwgT2JqZWN0IHBhcmVudENvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZVNlcnZlcih1cmksIG51bGwsIG5ldyBKZXR0eUh0dHBDb250YWluZXIoY29uZmlnLCBwYXJlbnRDb250ZXh0KSwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEge0BsaW5rIFNlcnZlcn0gdGhhdCByZWdpc3RlcnMgYW4ge0BsaW5rIG9yZy5lY2xpcHNlLmpldHR5LnNlcnZlci5IYW5kbGVyfSB0aGF0CisgICAgICogaW4gdHVybiBtYW5hZ2VzIGFsbCByb290IHJlc291cmNlIGFuZCBwcm92aWRlciBjbGFzc2VzIGRlY2xhcmVkIGJ5IHRoZQorICAgICAqIHJlc291cmNlIGNvbmZpZ3VyYXRpb24uCisgICAgICogPHAvPgorICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gZGVmZXJzIHRvIHRoZQorICAgICAqIHtAbGluayBDb250YWluZXJGYWN0b3J5I2NyZWF0ZUNvbnRhaW5lcihDbGFzcywgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbil9IG1ldGhvZAorICAgICAqIGZvciBjcmVhdGluZyBhbiBDb250YWluZXIgdGhhdCBtYW5hZ2VzIHRoZSByb290IHJlc291cmNlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgICAgICAgICAgICAgICB0aGUgVVJJIHRvIGNyZWF0ZSB0aGUgaHR0cCBzZXJ2ZXIuIFRoZSBVUkkgc2NoZW1lIG11c3QgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZXF1YWwgdG8ge0Bjb2RlIGh0dHBzfS4gVGhlIFVSSSB1c2VyIGluZm9ybWF0aW9uIGFuZCBob3N0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBpZ25vcmVkLiBJZiB0aGUgVVJJIHBvcnQgaXMgbm90IHByZXNlbnQgdGhlbiBwb3J0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHtAdmFsdWUgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5Db250YWluZXIjREVGQVVMVF9IVFRQU19QT1JUfSB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQuIFRoZSBVUkkgcGF0aCwgcXVlcnkgYW5kIGZyYWdtZW50IGNvbXBvbmVudHMgYXJlIGlnbm9yZWQuCisgICAgICogQHBhcmFtIHNzbENvbnRleHRGYWN0b3J5IHRoaXMgaXMgdGhlIFNTTCBjb250ZXh0IGZhY3RvcnkgdXNlZCB0byBjb25maWd1cmUgU1NMIGNvbm5lY3RvcgorICAgICAqIEBwYXJhbSBjb25maWcgICAgICAgICAgICB0aGUgcmVzb3VyY2UgY29uZmlndXJhdGlvbi4KKyAgICAgKiBAcmV0dXJuIG5ld2x5IGNyZWF0ZWQge0BsaW5rIFNlcnZlcn0uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24gICAgICBpbiBjYXNlIG9mIGFueSBmYWlsdXJlIHdoZW4gY3JlYXRpbmcgYSBuZXcgSmV0dHkge0Bjb2RlIFNlcnZlcn0gaW5zdGFuY2UuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYge0Bjb2RlIHVyaX0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU2VydmVyIGNyZWF0ZVNlcnZlcihmaW5hbCBVUkkgdXJpLCBmaW5hbCBTc2xDb250ZXh0RmFjdG9yeSBzc2xDb250ZXh0RmFjdG9yeSwgZmluYWwgUmVzb3VyY2VDb25maWcgY29uZmlnKQorICAgICAgICAgICAgdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24geworICAgICAgICBmaW5hbCBKZXR0eUh0dHBDb250YWluZXIgY29udGFpbmVyID0gQ29udGFpbmVyRmFjdG9yeS5jcmVhdGVDb250YWluZXIoSmV0dHlIdHRwQ29udGFpbmVyLmNsYXNzLCBjb25maWcpOworICAgICAgICByZXR1cm4gY3JlYXRlU2VydmVyKHVyaSwgc3NsQ29udGV4dEZhY3RvcnksIGNvbnRhaW5lciwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEge0BsaW5rIFNlcnZlcn0gdGhhdCByZWdpc3RlcnMgYW4ge0BsaW5rIG9yZy5lY2xpcHNlLmpldHR5LnNlcnZlci5IYW5kbGVyfSB0aGF0CisgICAgICogaW4gdHVybiBtYW5hZ2VzIGFsbCByb290IHJlc291cmNlIGFuZCBwcm92aWRlciBjbGFzc2VzIGZvdW5kIGJ5IHNlYXJjaGluZyB0aGUKKyAgICAgKiBjbGFzc2VzIHJlZmVyZW5jZWQgaW4gdGhlIGphdmEgY2xhc3NwYXRoLgorICAgICAqCisgICAgICogQHBhcmFtIHVyaSAgICAgICAgICAgICAgIHRoZSBVUkkgdG8gY3JlYXRlIHRoZSBodHRwIHNlcnZlci4gVGhlIFVSSSBzY2hlbWUgbXVzdCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBlcXVhbCB0byB7QGNvZGUgaHR0cHN9LiBUaGUgVVJJIHVzZXIgaW5mb3JtYXRpb24gYW5kIGhvc3QKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIGlnbm9yZWQuIElmIHRoZSBVUkkgcG9ydCBpcyBub3QgcHJlc2VudCB0aGVuIHBvcnQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAge0B2YWx1ZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbnRhaW5lciNERUZBVUxUX0hUVFBTX1BPUlR9IHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZC4gVGhlIFVSSSBwYXRoLCBxdWVyeSBhbmQgZnJhZ21lbnQgY29tcG9uZW50cyBhcmUgaWdub3JlZC4KKyAgICAgKiBAcGFyYW0gc3NsQ29udGV4dEZhY3RvcnkgdGhpcyBpcyB0aGUgU1NMIGNvbnRleHQgZmFjdG9yeSB1c2VkIHRvIGNvbmZpZ3VyZSBTU0wgY29ubmVjdG9yCisgICAgICogQHBhcmFtIGhhbmRsZXIgICAgICAgICAgIHRoZSBjb250YWluZXIgdGhhdCBoYW5kbGVzIGFsbCBIVFRQIHJlcXVlc3RzCisgICAgICogQHBhcmFtIHN0YXJ0ICAgICAgICAgICAgIGlmIHNldCB0byBmYWxzZSwgc2VydmVyIHdpbGwgbm90IGdldCBzdGFydGVkLCB0aGlzIGFsbG93cyBlbmQgdXNlcnMgdG8gc2V0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWwgcHJvcGVydGllcyBvbiB0aGUgdW5kZXJseWluZyBsaXN0ZW5lci4KKyAgICAgKiBAcmV0dXJuIG5ld2x5IGNyZWF0ZWQge0BsaW5rIFNlcnZlcn0uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24gICAgICBpbiBjYXNlIG9mIGFueSBmYWlsdXJlIHdoZW4gY3JlYXRpbmcgYSBuZXcgSmV0dHkge0Bjb2RlIFNlcnZlcn0gaW5zdGFuY2UuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYge0Bjb2RlIHVyaX0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEBzZWUgSmV0dHlIdHRwQ29udGFpbmVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTZXJ2ZXIgY3JlYXRlU2VydmVyKGZpbmFsIFVSSSB1cmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNzbENvbnRleHRGYWN0b3J5IHNzbENvbnRleHRGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBKZXR0eUh0dHBDb250YWluZXIgaGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBzdGFydCkgeworICAgICAgICBpZiAodXJpID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuVVJJX0NBTk5PVF9CRV9OVUxMKCkpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFN0cmluZyBzY2hlbWUgPSB1cmkuZ2V0U2NoZW1lKCk7CisgICAgICAgIGludCBkZWZhdWx0UG9ydCA9IENvbnRhaW5lci5ERUZBVUxUX0hUVFBfUE9SVDsKKworICAgICAgICBpZiAoc3NsQ29udGV4dEZhY3RvcnkgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKCEiaHR0cCIuZXF1YWxzSWdub3JlQ2FzZShzY2hlbWUpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5XUk9OR19TQ0hFTUVfV0hFTl9VU0lOR19IVFRQKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCEiaHR0cHMiLmVxdWFsc0lnbm9yZUNhc2Uoc2NoZW1lKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuV1JPTkdfU0NIRU1FX1dIRU5fVVNJTkdfSFRUUFMoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0UG9ydCA9IENvbnRhaW5lci5ERUZBVUxUX0hUVFBTX1BPUlQ7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgaW50IHBvcnQgPSAodXJpLmdldFBvcnQoKSA9PSAtMSkgPyBkZWZhdWx0UG9ydCA6IHVyaS5nZXRQb3J0KCk7CisKKyAgICAgICAgZmluYWwgU2VydmVyIHNlcnZlciA9IG5ldyBTZXJ2ZXIobmV3IEpldHR5Q29ubmVjdG9yVGhyZWFkUG9vbCgpKTsKKyAgICAgICAgZmluYWwgSHR0cENvbmZpZ3VyYXRpb24gY29uZmlnID0gbmV3IEh0dHBDb25maWd1cmF0aW9uKCk7CisgICAgICAgIGlmIChzc2xDb250ZXh0RmFjdG9yeSAhPSBudWxsKSB7CisgICAgICAgICAgICBjb25maWcuc2V0U2VjdXJlU2NoZW1lKCJodHRwcyIpOworICAgICAgICAgICAgY29uZmlnLnNldFNlY3VyZVBvcnQocG9ydCk7CisgICAgICAgICAgICBjb25maWcuYWRkQ3VzdG9taXplcihuZXcgU2VjdXJlUmVxdWVzdEN1c3RvbWl6ZXIoKSk7CisKKyAgICAgICAgICAgIGZpbmFsIFNlcnZlckNvbm5lY3RvciBodHRwcyA9IG5ldyBTZXJ2ZXJDb25uZWN0b3Ioc2VydmVyLAorICAgICAgICAgICAgICAgICAgICBuZXcgU3NsQ29ubmVjdGlvbkZhY3Rvcnkoc3NsQ29udGV4dEZhY3RvcnksICJodHRwLzEuMSIpLAorICAgICAgICAgICAgICAgICAgICBuZXcgSHR0cENvbm5lY3Rpb25GYWN0b3J5KGNvbmZpZykpOworICAgICAgICAgICAgaHR0cHMuc2V0UG9ydChwb3J0KTsKKyAgICAgICAgICAgIHNlcnZlci5zZXRDb25uZWN0b3JzKG5ldyBDb25uZWN0b3JbXXtodHRwc30pOworCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaW5hbCBTZXJ2ZXJDb25uZWN0b3IgaHR0cCA9IG5ldyBTZXJ2ZXJDb25uZWN0b3Ioc2VydmVyLCBuZXcgSHR0cENvbm5lY3Rpb25GYWN0b3J5KGNvbmZpZykpOworICAgICAgICAgICAgaHR0cC5zZXRQb3J0KHBvcnQpOworICAgICAgICAgICAgc2VydmVyLnNldENvbm5lY3RvcnMobmV3IENvbm5lY3Rvcltde2h0dHB9KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaGFuZGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICBzZXJ2ZXIuc2V0SGFuZGxlcihoYW5kbGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdGFydCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyBTdGFydCB0aGUgc2VydmVyLgorICAgICAgICAgICAgICAgIHNlcnZlci5zdGFydCgpOworICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9XSEVOX0NSRUFUSU5HX1NFUlZFUigpLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2VydmVyOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEpldHR5Q29ubmVjdG9yVGhyZWFkUG9vbCBleHRlbmRzIFF1ZXVlZFRocmVhZFBvb2wgeworICAgICAgICBwcml2YXRlIGZpbmFsIFRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeSA9IG5ldyBUaHJlYWRGYWN0b3J5QnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldE5hbWVGb3JtYXQoImpldHR5LWh0dHAtc2VydmVyLSVkIikKKyAgICAgICAgICAgICAgICAuc2V0VW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyKG5ldyBKZXJzZXlQcm9jZXNzaW5nVW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyKCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBUaHJlYWQgbmV3VGhyZWFkKFJ1bm5hYmxlIHJ1bm5hYmxlKSB7CisgICAgICAgICAgICByZXR1cm4gdGhyZWFkRmFjdG9yeS5uZXdUaHJlYWQocnVubmFibGUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVycy9qZXR0eS1odHRwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamV0dHkvSmV0dHlIdHRwQ29udGFpbmVyUHJvdmlkZXIuamF2YSBiL2NvbnRhaW5lcnMvamV0dHktaHR0cC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHR5L0pldHR5SHR0cENvbnRhaW5lclByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVhZmNiZgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lcnMvamV0dHktaHR0cC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHR5L0pldHR5SHR0cENvbnRhaW5lclByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0eTsKKworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29udGFpbmVyUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZXR0eS5zZXJ2ZXIuSGFuZGxlcjsKKworLyoqCisgKiBDb250YWluZXIgcHJvdmlkZXIgZm9yIGNvbnRhaW5lcnMgYmFzZWQgb24gSmV0dHkgU2VydmVyIHtAbGluayBvcmcuZWNsaXBzZS5qZXR0eS5zZXJ2ZXIuSGFuZGxlcn0uCisgKgorICogQGF1dGhvciBBcnVsIERoZXNpYXNlZWxhbiAoYXJ1bGRAYWNtLm9yZykKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBKZXR0eUh0dHBDb250YWluZXJQcm92aWRlciBpbXBsZW1lbnRzIENvbnRhaW5lclByb3ZpZGVyIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gVCBjcmVhdGVDb250YWluZXIoZmluYWwgQ2xhc3M8VD4gdHlwZSwgZmluYWwgQXBwbGljYXRpb24gYXBwbGljYXRpb24pIHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKEhhbmRsZXIuY2xhc3MgPT0gdHlwZSB8fCBKZXR0eUh0dHBDb250YWluZXIuY2xhc3MgPT0gdHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHR5cGUuY2FzdChuZXcgSmV0dHlIdHRwQ29udGFpbmVyKGFwcGxpY2F0aW9uKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXJzL2pldHR5LWh0dHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0eS9wYWNrYWdlLWluZm8uamF2YSBiL2NvbnRhaW5lcnMvamV0dHktaHR0cC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHR5L3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYTE0YmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXJzL2pldHR5LWh0dHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0eS9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvKioKKyAqIEplcnNleSBKZXR0eSBjb250YWluZXIgY2xhc3Nlcy4KKyAqLworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0eTsKZGlmZiAtLWdpdCBhL2NvbnRhaW5lcnMvamV0dHktaHR0cC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5Db250YWluZXJQcm92aWRlciBiL2NvbnRhaW5lcnMvamV0dHktaHR0cC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5Db250YWluZXJQcm92aWRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDk2ZWRiCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVycy9qZXR0eS1odHRwL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbnRhaW5lclByb3ZpZGVyCkBAIC0wLDAgKzEgQEAKK29yZy5nbGFzc2Zpc2guamVyc2V5LmpldHR5LkpldHR5SHR0cENvbnRhaW5lclByb3ZpZGVyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29udGFpbmVycy9qZXR0eS1odHRwL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0eS9pbnRlcm5hbC9sb2NhbGl6YXRpb24ucHJvcGVydGllcyBiL2NvbnRhaW5lcnMvamV0dHktaHR0cC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamV0dHkvaW50ZXJuYWwvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE1MjhmOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lcnMvamV0dHktaHR0cC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamV0dHkvaW50ZXJuYWwvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyMyBAQAorIworIyBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisjIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyMKKyMgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorIyBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisjIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorIyB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisjCisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorIworCisjIHswfSAtIHN0YXR1cyBjb2RlOyB7MX0gLSBzdGF0dXMgcmVhc29uIG1lc3NhZ2UKK2V4Y2VwdGlvbi5zZW5kaW5nLmVycm9yLnJlc3BvbnNlPUkvTyBleGNlcHRpb24gb2NjdXJyZWQgd2hpbGUgc2VuZGluZyAiezB9L3sxfSIgZXJyb3IgcmVzcG9uc2UuCitlcnJvci53aGVuLmNyZWF0aW5nLnNlcnZlcj1FeGNlcHRpb24gdGhyb3duIHdoZW4gdHJ5aW5nIHRvIGNyZWF0ZSBqZXR0eSBzZXJ2ZXIuCit1bmFibGUudG8uY2xvc2UucmVzcG9uc2U9VW5hYmxlIHRvIGNsb3NlIHJlc3BvbnNlIG91dHB1dC4KK3VyaS5jYW5ub3QuYmUubnVsbD1UaGUgVVJJIG11c3Qgbm90IGJlIG51bGwuCit3cm9uZy5zY2hlbWUud2hlbi51c2luZy5odHRwPVRoZSBVUkkgc2NoZW1lIHNob3VsZCBiZSAnaHR0cCcgd2hlbiBub3QgdXNpbmcgU1NMLgord3Jvbmcuc2NoZW1lLndoZW4udXNpbmcuaHR0cHM9VGhlIFVSSSBzY2hlbWUgc2hvdWxkIGJlICdodHRwcycgd2hlbiB1c2luZyBTU0wuCmRpZmYgLS1naXQgYS9jb250YWluZXJzL2pldHR5LWh0dHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0eS9BYnN0cmFjdEpldHR5U2VydmVyVGVzdGVyLmphdmEgYi9jb250YWluZXJzL2pldHR5LWh0dHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0eS9BYnN0cmFjdEpldHR5U2VydmVyVGVzdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNmZTRiNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lcnMvamV0dHktaHR0cC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHR5L0Fic3RyYWN0SmV0dHlTZXJ2ZXJUZXN0ZXIuamF2YQpAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0eTsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlByb3BlcnRpZXNIZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCitpbXBvcnQgb3JnLmVjbGlwc2UuamV0dHkuc2VydmVyLlNlcnZlcjsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CisKKy8qKgorICogQWJzdHJhY3QgSmV0dHkgU2VydmVyIHVuaXQgdGVzdGVyLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgQXJ1bCBEaGVzaWFzZWVsYW4gKGFydWxkIGF0IGFjbS5vcmcpCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEpldHR5U2VydmVyVGVzdGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEFic3RyYWN0SmV0dHlTZXJ2ZXJUZXN0ZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFWFQgPSAiIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9QT1JUID0gOTk5ODsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcG9ydCB0byBiZSB1c2VkIGZvciB0ZXN0IGFwcGxpY2F0aW9uIGRlcGxveW1lbnRzLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgSFRUUCBwb3J0IG9mIHRoZSBVUkkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgaW50IGdldFBvcnQoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSA9IEFjY2Vzc0NvbnRyb2xsZXIKKyAgICAgICAgICAgICAgICAuZG9Qcml2aWxlZ2VkKFByb3BlcnRpZXNIZWxwZXIuZ2V0U3lzdGVtUHJvcGVydHkoImplcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydCIpKTsKKyAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaSA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpOworICAgICAgICAgICAgICAgIGlmIChpIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigiVmFsdWUgbm90IHBvc2l0aXZlLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5DT05GSUcsCisgICAgICAgICAgICAgICAgICAgICAgICAiVmFsdWUgb2YgJ2plcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydCciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBwcm9wZXJ0eSBpcyBub3QgYSB2YWxpZCBwb3NpdGl2ZSBpbnRlZ2VyIFsiICsgdmFsdWUgKyAiXS4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBSZXZlcnRpbmcgdG8gZGVmYXVsdCBbIiArIERFRkFVTFRfUE9SVCArICJdLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gREVGQVVMVF9QT1JUOworICAgIH0KKworICAgIHByaXZhdGUgdm9sYXRpbGUgU2VydmVyIHNlcnZlcjsKKworICAgIHB1YmxpYyBVcmlCdWlsZGVyIGdldFVyaSgpIHsKKyAgICAgICAgcmV0dXJuIFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdCIpLnBvcnQoZ2V0UG9ydCgpKS5wYXRoKENPTlRFWFQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0YXJ0U2VydmVyKENsYXNzLi4uIHJlc291cmNlcykgeworICAgICAgICBSZXNvdXJjZUNvbmZpZyBjb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcocmVzb3VyY2VzKTsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKG5ldyBMb2dnaW5nRmVhdHVyZShMT0dHRVIsIExvZ2dpbmdGZWF0dXJlLlZlcmJvc2l0eS5QQVlMT0FEX0FOWSkpOworICAgICAgICBmaW5hbCBVUkkgYmFzZVVyaSA9IGdldEJhc2VVcmkoKTsKKyAgICAgICAgc2VydmVyID0gSmV0dHlIdHRwQ29udGFpbmVyRmFjdG9yeS5jcmVhdGVTZXJ2ZXIoYmFzZVVyaSwgY29uZmlnKTsKKyAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5JTkZPLCAiSmV0dHktaHR0cCBzZXJ2ZXIgc3RhcnRlZCBvbiBiYXNlIHVyaTogIiArIGJhc2VVcmkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0YXJ0U2VydmVyKFJlc291cmNlQ29uZmlnIGNvbmZpZykgeworICAgICAgICBmaW5hbCBVUkkgYmFzZVVyaSA9IGdldEJhc2VVcmkoKTsKKyAgICAgICAgc2VydmVyID0gSmV0dHlIdHRwQ29udGFpbmVyRmFjdG9yeS5jcmVhdGVTZXJ2ZXIoYmFzZVVyaSwgY29uZmlnKTsKKyAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5JTkZPLCAiSmV0dHktaHR0cCBzZXJ2ZXIgc3RhcnRlZCBvbiBiYXNlIHVyaTogIiArIGJhc2VVcmkpOworICAgIH0KKworICAgIHB1YmxpYyBVUkkgZ2V0QmFzZVVyaSgpIHsKKyAgICAgICAgcmV0dXJuIFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdC8iKS5wb3J0KGdldFBvcnQoKSkuYnVpbGQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9wU2VydmVyKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VydmVyLnN0b3AoKTsKKyAgICAgICAgICAgIHNlcnZlciA9IG51bGw7CisgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLklORk8sICJKZXR0eS1odHRwIHNlcnZlciBzdG9wcGVkLiIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgaWYgKHNlcnZlciAhPSBudWxsKSB7CisgICAgICAgICAgICBzdG9wU2VydmVyKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXJzL2pldHR5LWh0dHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0eS9Bc3luY1Rlc3QuamF2YSBiL2NvbnRhaW5lcnMvamV0dHktaHR0cC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHR5L0FzeW5jVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZDZiODEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXJzL2pldHR5LWh0dHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0eS9Bc3luY1Rlc3QuamF2YQpAQCAtMCwwICsxLDE2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0eTsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZW91dEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkFzeW5jUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlN1c3BlbmRlZDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuVGltZW91dEhhbmRsZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIEBhdXRob3IgQXJ1bCBEaGVzaWFzZWVsYW4gKGFydWxkIGF0IGFjbS5vcmcpCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEFzeW5jVGVzdCBleHRlbmRzIEFic3RyYWN0SmV0dHlTZXJ2ZXJUZXN0ZXIgeworCisgICAgQFBhdGgoIi9hc3luYyIpCisgICAgQFN1cHByZXNzV2FybmluZ3MoIlZvaWRNZXRob2RBbm5vdGF0ZWRXaXRoR0VUIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFzeW5jUmVzb3VyY2UgeworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQXRvbWljSW50ZWdlciBJTlZPQ0FUSU9OX0NPVU5UID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgdm9pZCBhc3luY0dldChAU3VzcGVuZGVkIGZpbmFsIEFzeW5jUmVzcG9uc2UgYXN5bmNSZXNwb25zZSkgeworICAgICAgICAgICAgbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQgPSB2ZXJ5RXhwZW5zaXZlT3BlcmF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIGFzeW5jUmVzcG9uc2UucmVzdW1lKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdmVyeUV4cGVuc2l2ZU9wZXJhdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4uIHZlcnkgZXhwZW5zaXZlIG9wZXJhdGlvbiB0aGF0IHR5cGljYWxseSBmaW5pc2hlcyB3aXRoaW4gNSBzZWNvbmRzLCBzaW11bGF0ZWQgdXNpbmcgc2xlZXAoKQorICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwMDApOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRPTkUiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pLnN0YXJ0KCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJ0aW1lb3V0IikKKyAgICAgICAgcHVibGljIHZvaWQgYXN5bmNHZXRXaXRoVGltZW91dChAU3VzcGVuZGVkIGZpbmFsIEFzeW5jUmVzcG9uc2UgYXN5bmNSZXNwb25zZSkgeworICAgICAgICAgICAgYXN5bmNSZXNwb25zZS5zZXRUaW1lb3V0SGFuZGxlcihuZXcgVGltZW91dEhhbmRsZXIoKSB7CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVUaW1lb3V0KGZpbmFsIEFzeW5jUmVzcG9uc2UgYXN5bmNSZXNwb25zZSkgeworICAgICAgICAgICAgICAgICAgICBhc3luY1Jlc3BvbnNlLnJlc3VtZShSZXNwb25zZS5zdGF0dXMoUmVzcG9uc2UuU3RhdHVzLlNFUlZJQ0VfVU5BVkFJTEFCTEUpLmVudGl0eSgiT3BlcmF0aW9uIHRpbWUgb3V0LiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgYXN5bmNSZXNwb25zZS5zZXRUaW1lb3V0KDMsIFRpbWVVbml0LlNFQ09ORFMpOworCisgICAgICAgICAgICBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IHZlcnlFeHBlbnNpdmVPcGVyYXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgYXN5bmNSZXNwb25zZS5yZXN1bWUocmVzdWx0KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcml2YXRlIFN0cmluZyB2ZXJ5RXhwZW5zaXZlT3BlcmF0aW9uKCkgeworICAgICAgICAgICAgICAgICAgICAvLyAuLi4gdmVyeSBleHBlbnNpdmUgb3BlcmF0aW9uIHRoYXQgdHlwaWNhbGx5IGZpbmlzaGVzIHdpdGhpbiAxMCBzZWNvbmRzLCBzaW11bGF0ZWQgdXNpbmcgc2xlZXAoKQorICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDcwMDApOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRPTkUiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pLnN0YXJ0KCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJtdWx0aXBsZS1pbnZvY2F0aW9ucyIpCisgICAgICAgIHB1YmxpYyB2b2lkIGFzeW5jTXVsdGlwbGVJbnZvY2F0aW9ucyhAU3VzcGVuZGVkIGZpbmFsIEFzeW5jUmVzcG9uc2UgYXN5bmNSZXNwb25zZSkgeworICAgICAgICAgICAgSU5WT0NBVElPTl9DT1VOVC5pbmNyZW1lbnRBbmRHZXQoKTsKKworICAgICAgICAgICAgbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBhc3luY1Jlc3BvbnNlLnJlc3VtZSgiT0siKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KS5zdGFydCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBDbGllbnQgY2xpZW50OworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN0YXJ0U2VydmVyKEFzeW5jUmVzb3VyY2UuY2xhc3MpOworICAgICAgICBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgICAgICBjbGllbnQgPSBudWxsOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFzeW5jR2V0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBGdXR1cmU8UmVzcG9uc2U+IHJlc3BvbnNlRnV0dXJlID0gY2xpZW50LnRhcmdldChnZXRVcmkoKS5wYXRoKCIvYXN5bmMiKSkucmVxdWVzdCgpLmFzeW5jKCkuZ2V0KCk7CisgICAgICAgIC8vIFJlcXVlc3QgaXMgYmVpbmcgcHJvY2Vzc2VkIGFzeW5jaHJvbm91c2x5LgorICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHJlc3BvbnNlRnV0dXJlLmdldCgpOworICAgICAgICAvLyBnZXQoKSB3YWl0cyBmb3IgdGhlIHJlc3BvbnNlCisgICAgICAgIGFzc2VydEVxdWFscygiRE9ORSIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNHZXRXaXRoVGltZW91dCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgRnV0dXJlPFJlc3BvbnNlPiByZXNwb25zZUZ1dHVyZSA9IGNsaWVudC50YXJnZXQoZ2V0VXJpKCkucGF0aCgiL2FzeW5jL3RpbWVvdXQiKSkucmVxdWVzdCgpLmFzeW5jKCkuZ2V0KCk7CisgICAgICAgIC8vIFJlcXVlc3QgaXMgYmVpbmcgcHJvY2Vzc2VkIGFzeW5jaHJvbm91c2x5LgorICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHJlc3BvbnNlRnV0dXJlLmdldCgpOworCisgICAgICAgIC8vIGdldCgpIHdhaXRzIGZvciB0aGUgcmVzcG9uc2UKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUwMywgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk9wZXJhdGlvbiB0aW1lIG91dC4iLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEpFUlNFWS0yNjE2IHJlcHJvZHVjZXIuIE1ha2Ugc3VyZSByZXNvdXJjZSBtZXRob2QgaXMgb25seSBpbnZva2VkIG9uY2UgcGVyIG9uZSByZXF1ZXN0LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFzeW5jTXVsdGlwbGVJbnZvY2F0aW9ucygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IGNsaWVudC50YXJnZXQoZ2V0VXJpKCkucGF0aCgiL2FzeW5jL211bHRpcGxlLWludm9jYXRpb25zIikpLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRUaGF0KEFzeW5jUmVzb3VyY2UuSU5WT0NBVElPTl9DT1VOVC5nZXQoKSwgaXMoMSkpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoIk9LIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lcnMvamV0dHktaHR0cC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHR5L0V4Y2VwdGlvblRlc3QuamF2YSBiL2NvbnRhaW5lcnMvamV0dHktaHR0cC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHR5L0V4Y2VwdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTM0ZTZlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVycy9qZXR0eS1odHRwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamV0dHkvRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dHk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitwdWJsaWMgY2xhc3MgRXhjZXB0aW9uVGVzdCBleHRlbmRzIEFic3RyYWN0SmV0dHlTZXJ2ZXJUZXN0ZXIgeworICAgIEBQYXRoKCJ7c3RhdHVzfSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeGNlcHRpb25SZXNvdXJjZSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoQFBhdGhQYXJhbSgic3RhdHVzIikgaW50IHN0YXR1cykgeworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKHN0YXR1cyk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdDQwMFN0YXR1c0NvZGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBzdGFydFNlcnZlcihFeGNlcHRpb25SZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpOworICAgICAgICBXZWJUYXJnZXQgciA9IGNsaWVudC50YXJnZXQoZ2V0VXJpKCkucGF0aCgiNDAwIikuYnVpbGQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIHIucmVxdWVzdCgpLmdldChSZXNwb25zZS5jbGFzcykuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdDUwMFN0YXR1c0NvZGUoKSB7CisgICAgICAgIHN0YXJ0U2VydmVyKEV4Y2VwdGlvblJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KCk7CisgICAgICAgIFdlYlRhcmdldCByID0gY2xpZW50LnRhcmdldChnZXRVcmkoKS5wYXRoKCI1MDAiKS5idWlsZCgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNTAwLCByLnJlcXVlc3QoKS5nZXQoUmVzcG9uc2UuY2xhc3MpLmdldFN0YXR1cygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXJzL2pldHR5LWh0dHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0eS9MaWZlY3ljbGVMaXN0ZW5lclRlc3QuamF2YSBiL2NvbnRhaW5lcnMvamV0dHktaHR0cC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHR5L0xpZmVjeWNsZUxpc3RlbmVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNzdiODgKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXJzL2pldHR5LWh0dHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0eS9MaWZlY3ljbGVMaXN0ZW5lclRlc3QuamF2YQpAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0eTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkFic3RyYWN0Q29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5Db250YWluZXI7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworCisvKioKKyAqIFJlbG9hZCBhbmQgQ29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXIgc3VwcG9ydCB0ZXN0LgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBMaWZlY3ljbGVMaXN0ZW5lclRlc3QgZXh0ZW5kcyBBYnN0cmFjdEpldHR5U2VydmVyVGVzdGVyIHsKKworICAgIEBQYXRoKCIvb25lIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE9uZSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gIm9uZSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL3R3byIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUd28geworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJ0d28iOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZWxvYWRlciBleHRlbmRzIEFic3RyYWN0Q29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXIgeworICAgICAgICBDb250YWluZXIgY29udGFpbmVyOworCisgICAgICAgIHB1YmxpYyB2b2lkIHJlbG9hZChSZXNvdXJjZUNvbmZpZyBuZXdDb25maWcpIHsKKyAgICAgICAgICAgIGNvbnRhaW5lci5yZWxvYWQobmV3Q29uZmlnKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlbG9hZCgpIHsKKyAgICAgICAgICAgIGNvbnRhaW5lci5yZWxvYWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0dXAoQ29udGFpbmVyIGNvbnRhaW5lcikgeworICAgICAgICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7CisgICAgICAgIH0KKworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlbG9hZCgpIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmMgPSBuZXcgUmVzb3VyY2VDb25maWcoT25lLmNsYXNzKTsKKworICAgICAgICBSZWxvYWRlciByZWxvYWRlciA9IG5ldyBSZWxvYWRlcigpOworICAgICAgICByYy5yZWdpc3Rlckluc3RhbmNlcyhyZWxvYWRlcik7CisKKyAgICAgICAgc3RhcnRTZXJ2ZXIocmMpOworCisgICAgICAgIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpOworICAgICAgICBXZWJUYXJnZXQgciA9IGNsaWVudC50YXJnZXQoZ2V0VXJpKCkucGF0aCgiLyIpLmJ1aWxkKCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygib25lIiwgci5wYXRoKCJvbmUiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDA0LCByLnBhdGgoInR3byIpLnJlcXVlc3QoKS5nZXQoUmVzcG9uc2UuY2xhc3MpLmdldFN0YXR1cygpKTsKKworICAgICAgICAvLyBhZGQgVHdvIHJlc291cmNlCisgICAgICAgIHJlbG9hZGVyLnJlbG9hZChuZXcgUmVzb3VyY2VDb25maWcoT25lLmNsYXNzLCBUd28uY2xhc3MpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIm9uZSIsIHIucGF0aCgib25lIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0d28iLCByLnBhdGgoInR3byIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFN0YXJ0U3RvcExpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RDb250YWluZXJMaWZlY3ljbGVMaXN0ZW5lciB7CisgICAgICAgIHZvbGF0aWxlIGJvb2xlYW4gc3RhcnRlZDsKKyAgICAgICAgdm9sYXRpbGUgYm9vbGVhbiBzdG9wcGVkOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0dXAoQ29udGFpbmVyIGNvbnRhaW5lcikgeworICAgICAgICAgICAgc3RhcnRlZCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TaHV0ZG93bihDb250YWluZXIgY29udGFpbmVyKSB7CisgICAgICAgICAgICBzdG9wcGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YXJ0dXBTaHV0ZG93bkhvb2tzKCkgeworICAgICAgICBmaW5hbCBTdGFydFN0b3BMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTdGFydFN0b3BMaXN0ZW5lcigpOworCisgICAgICAgIHN0YXJ0U2VydmVyKG5ldyBSZXNvdXJjZUNvbmZpZyhPbmUuY2xhc3MpLnJlZ2lzdGVyKGxpc3RlbmVyKSk7CisKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KCk7CisgICAgICAgIFdlYlRhcmdldCByID0gY2xpZW50LnRhcmdldChnZXRVcmkoKS5wYXRoKCIvIikuYnVpbGQoKSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyLnBhdGgoIm9uZSIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbygib25lIikpOworICAgICAgICBhc3NlcnRUaGF0KHIucGF0aCgidHdvIikucmVxdWVzdCgpLmdldChSZXNwb25zZS5jbGFzcykuZ2V0U3RhdHVzKCksIGVxdWFsVG8oNDA0KSk7CisKKyAgICAgICAgc3RvcFNlcnZlcigpOworCisgICAgICAgIGFzc2VydFRydWUoIkNvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyLm9uU3RhcnR1cCBoYXMgbm90IGJlZW4gY2FsbGVkLiIsIGxpc3RlbmVyLnN0YXJ0ZWQpOworICAgICAgICBhc3NlcnRUcnVlKCJDb250YWluZXJMaWZlY3ljbGVMaXN0ZW5lci5vblNodXRkb3duIGhhcyBub3QgYmVlbiBjYWxsZWQuIiwgbGlzdGVuZXIuc3RvcHBlZCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVycy9qZXR0eS1odHRwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamV0dHkvT3B0aW9uc1Rlc3QuamF2YSBiL2NvbnRhaW5lcnMvamV0dHktaHR0cC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHR5L09wdGlvbnNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg2NmMzMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lcnMvamV0dHktaHR0cC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHR5L09wdGlvbnNUZXN0LmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0eTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK3B1YmxpYyBjbGFzcyBPcHRpb25zVGVzdCBleHRlbmRzIEFic3RyYWN0SmV0dHlTZXJ2ZXJUZXN0ZXIgeworCisgICAgQFBhdGgoImhlbGxvd29ybGQiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSGVsbG9Xb3JsZFJlc291cmNlIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJQ0hFRF9NRVNTQUdFID0gIkhlbGxvIFdvcmxkISI7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEhlbGxvKCkgeworICAgICAgICAgICAgcmV0dXJuIENMSUNIRURfTUVTU0FHRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZvb0Jhck9wdGlvbnMoKSB7CisgICAgICAgIHN0YXJ0U2VydmVyKEhlbGxvV29ybGRSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IGNsaWVudC50YXJnZXQoZ2V0VXJpKCkpLnBhdGgoImhlbGxvd29ybGQiKS5yZXF1ZXN0KCkuaGVhZGVyKCJBY2NlcHQiLCAiZm9vL2JhciIpLm9wdGlvbnMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBmaW5hbCBTdHJpbmcgYWxsb3dIZWFkZXIgPSByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIkFsbG93Iik7CisgICAgICAgIF9jaGVja0FsbG93Q29udGVudChhbGxvd0hlYWRlcik7CisgICAgICAgIGFzc2VydEVxdWFscygwLCByZXNwb25zZS5nZXRMZW5ndGgoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9vL2JhciIsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfY2hlY2tBbGxvd0NvbnRlbnQoZmluYWwgU3RyaW5nIGNvbnRlbnQpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb250ZW50LmNvbnRhaW5zKCJHRVQiKSk7CisgICAgICAgIGFzc2VydFRydWUoY29udGVudC5jb250YWlucygiSEVBRCIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb250ZW50LmNvbnRhaW5zKCJPUFRJT05TIikpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVycy9qZXR0eS1zZXJ2bGV0L3BvbS54bWwgYi9jb250YWluZXJzL2pldHR5LXNlcnZsZXQvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGRmN2I0Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVycy9qZXR0eS1zZXJ2bGV0L3BvbS54bWwKQEAgLTAsMCArMSw4NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1qZXR0eS1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LWNvbnRhaW5lci1qZXR0eS1zZXJ2bGV0PC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPkpldHR5IFNlcnZsZXQgQ29udGFpbmVyPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItamV0dHktaHR0cDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS13ZWJhcHA8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHJlc291cmNlcz4KKyAgICAgICAgICAgIDxyZXNvdXJjZT4KKyAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vamF2YTwvZGlyZWN0b3J5PgorICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TUVUQS1JTkYvKiovKjwvaW5jbHVkZT4KKyAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgICAgICAgPC9yZXNvdXJjZT4KKyAgICAgICAgICAgIDxyZXNvdXJjZT4KKyAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgPGZpbHRlcmluZz50cnVlPC9maWx0ZXJpbmc+CisgICAgICAgICAgICA8L3Jlc291cmNlPgorICAgICAgICA8L3Jlc291cmNlcz4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZmVsaXg8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYnVuZGxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KKyAgICAgICAgICAgICAgICA8ZXh0ZW5zaW9ucz50cnVlPC9leHRlbnNpb25zPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8aW5zdHJ1Y3Rpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgPEltcG9ydC1QYWNrYWdlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnNlcnZsZXQuKjt2ZXJzaW9uPSJbMi40LDUuMCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvSW1wb3J0LVBhY2thZ2U+CisgICAgICAgICAgICAgICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgorICAgICAgICAgICAgICAgICAgICA8dW5wYWNrQnVuZGxlPnRydWU8L3VucGFja0J1bmRsZT4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb250YWluZXJzL2pldHR5LXNlcnZsZXQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0eS9zZXJ2bGV0L0pldHR5V2ViQ29udGFpbmVyRmFjdG9yeS5qYXZhIGIvY29udGFpbmVycy9qZXR0eS1zZXJ2bGV0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamV0dHkvc2VydmxldC9KZXR0eVdlYkNvbnRhaW5lckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDU4NWNlCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVycy9qZXR0eS1zZXJ2bGV0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamV0dHkvc2VydmxldC9KZXR0eVdlYkNvbnRhaW5lckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDI4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0eS5zZXJ2bGV0OworCitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0eS5KZXR0eUh0dHBDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS51cmkuVXJpQ29tcG9uZW50OworCitpbXBvcnQgb3JnLmVjbGlwc2UuamV0dHkuc2VydmVyLlNlcnZlcjsKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZXR0eS5zZXJ2bGV0LlNlcnZsZXRIb2xkZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamV0dHkud2ViYXBwLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmVjbGlwc2UuamV0dHkud2ViYXBwLldlYkFwcENvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UuamV0dHkud2ViYXBwLldlYlhtbENvbmZpZ3VyYXRpb247CisKKy8qKgorICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgYW5kIHN0YXJ0aW5nIEpldHR5IHtAbGluayBTZXJ2ZXJ9IGluc3RhbmNlcworICogZm9yIGRlcGxveWluZyBhIFNlcnZsZXQuCisgKiA8cC8+CisgKiBUaGUgZGVmYXVsdCBkZXBsb3llZCBzZXJ2ZXIgaXMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFNlcnZsZXRDb250YWluZXJ9LgorICogPHAvPgorICogSWYgbm8gaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyBhcmUgZGVjbGFyZWQgKG9yIGlzIG51bGwpIHRoZW4gcm9vdAorICogcmVzb3VyY2UgYW5kIHByb3ZpZGVyIGNsYXNzZXMgd2lsbCBiZSBmb3VuZCBieSBzZWFyY2hpbmcgdGhlIGNsYXNzZXMKKyAqIHJlZmVyZW5jZWQgaW4gdGhlIGphdmEgY2xhc3NwYXRoLgorICoKKyAqIEBhdXRob3IgQXJ1bCBEaGVzaWFzZWVsYW4gKGFydWxkIGF0IGFjbS5vcmcpCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBKZXR0eVdlYkNvbnRhaW5lckZhY3RvcnkgeworCisgICAgcHJpdmF0ZSBKZXR0eVdlYkNvbnRhaW5lckZhY3RvcnkoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEge0BsaW5rIFNlcnZlcn0gdGhhdCByZWdpc3RlcnMgdGhlIHtAbGluayBTZXJ2bGV0Q29udGFpbmVyfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1IHRoZSBVUkkgdG8gY3JlYXRlIHRoZSBodHRwIHNlcnZlci4gVGhlIFVSSSBzY2hlbWUgbXVzdCBiZQorICAgICAqICAgICAgICAgIGVxdWFsIHRvICJodHRwIi4gVGhlIFVSSSB1c2VyIGluZm9ybWF0aW9uIGFuZCBob3N0CisgICAgICogICAgICAgICAgYXJlIGlnbm9yZWQgSWYgdGhlIFVSSSBwb3J0IGlzIG5vdCBwcmVzZW50IHRoZW4gcG9ydCA4MCB3aWxsIGJlCisgICAgICogICAgICAgICAgdXNlZC4gVGhlIFVSSSBxdWVyeSBhbmQgZnJhZ21lbnQgY29tcG9uZW50cyBhcmUgaWdub3JlZC4gT25seSBmaXJzdCBwYXRoIHNlZ21lbnQgd2lsbCBiZSB1c2VkCisgICAgICogICAgICAgICAgYXMgY29udGV4dCBwYXRoLCB0aGUgcmVzdCB3aWxsIGJlIGlnbm9yZWQuCisgICAgICogQHJldHVybiB0aGUgaHR0cCBzZXJ2ZXIsIHdpdGggdGhlIGVuZHBvaW50IHN0YXJ0ZWQuCisgICAgICogQHRocm93cyBFeGNlcHRpb24gICAgICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGNyZWF0aW5nIHRoZSBjb250YWluZXIuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgSFRUUCBzZXJ2ZXIgVVJJIGlzIHtAY29kZSBudWxsfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNlcnZlciBjcmVhdGUoU3RyaW5nIHUpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIFVSSSBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY3JlYXRlKFVSSS5jcmVhdGUodSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHtAbGluayBTZXJ2ZXJ9IHRoYXQgcmVnaXN0ZXJzIHRoZSB7QGxpbmsgU2VydmxldENvbnRhaW5lcn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdSAgICAgICAgICB0aGUgVVJJIHRvIGNyZWF0ZSB0aGUgaHR0cCBzZXJ2ZXIuIFRoZSBVUkkgc2NoZW1lIG11c3QgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICBlcXVhbCB0byAiaHR0cCIuIFRoZSBVUkkgdXNlciBpbmZvcm1hdGlvbiBhbmQgaG9zdAorICAgICAqICAgICAgICAgICAgICAgICAgIGFyZSBpZ25vcmVkIElmIHRoZSBVUkkgcG9ydCBpcyBub3QgcHJlc2VudCB0aGVuIHBvcnQgODAgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgIHVzZWQuIFRoZSBVUkkgcXVlcnkgYW5kIGZyYWdtZW50IGNvbXBvbmVudHMgYXJlIGlnbm9yZWQuIE9ubHkgZmlyc3QgcGF0aCBzZWdtZW50IHdpbGwgYmUgdXNlZAorICAgICAqICAgICAgICAgICAgICAgICAgIGFzIGNvbnRleHQgcGF0aCwgdGhlIHJlc3Qgd2lsbCBiZSBpZ25vcmVkLgorICAgICAqIEBwYXJhbSBpbml0UGFyYW1zIHRoZSBzZXJ2bGV0IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMuCisgICAgICogQHJldHVybiB0aGUgaHR0cCBzZXJ2ZXIsIHdpdGggdGhlIGVuZHBvaW50IHN0YXJ0ZWQuCisgICAgICogQHRocm93cyBFeGNlcHRpb24gICAgICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGNyZWF0aW5nIHRoZSBjb250YWluZXIuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgSFRUUCBzZXJ2ZXIgVVJJIGlzIHtAY29kZSBudWxsfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNlcnZlciBjcmVhdGUoU3RyaW5nIHUsIE1hcDxTdHJpbmcsIFN0cmluZz4gaW5pdFBhcmFtcykKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAodSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgVVJJIG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjcmVhdGUoVVJJLmNyZWF0ZSh1KSwgaW5pdFBhcmFtcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEge0BsaW5rIFNlcnZlcn0gdGhhdCByZWdpc3RlcnMgdGhlIHtAbGluayBTZXJ2bGV0Q29udGFpbmVyfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1IHRoZSBVUkkgdG8gY3JlYXRlIHRoZSBodHRwIHNlcnZlci4gVGhlIFVSSSBzY2hlbWUgbXVzdCBiZQorICAgICAqICAgICAgICAgIGVxdWFsIHRvICJodHRwIi4gVGhlIFVSSSB1c2VyIGluZm9ybWF0aW9uIGFuZCBob3N0CisgICAgICogICAgICAgICAgYXJlIGlnbm9yZWQgSWYgdGhlIFVSSSBwb3J0IGlzIG5vdCBwcmVzZW50IHRoZW4gcG9ydCA4MCB3aWxsIGJlCisgICAgICogICAgICAgICAgdXNlZC4gVGhlIFVSSSBxdWVyeSBhbmQgZnJhZ21lbnQgY29tcG9uZW50cyBhcmUgaWdub3JlZC4gT25seSBmaXJzdCBwYXRoIHNlZ21lbnQgd2lsbCBiZSB1c2VkCisgICAgICogICAgICAgICAgYXMgY29udGV4dCBwYXRoLCB0aGUgcmVzdCB3aWxsIGJlIGlnbm9yZWQuCisgICAgICogQHJldHVybiB0aGUgaHR0cCBzZXJ2ZXIsIHdpdGggdGhlIGVuZHBvaW50IHN0YXJ0ZWQuCisgICAgICogQHRocm93cyBFeGNlcHRpb24gICAgICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGNyZWF0aW5nIHRoZSBjb250YWluZXIuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgSFRUUCBzZXJ2ZXIgVVJJIGlzIHtAY29kZSBudWxsfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNlcnZlciBjcmVhdGUoVVJJIHUpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZSh1LCBTZXJ2bGV0Q29udGFpbmVyLmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSB7QGxpbmsgU2VydmVyfSB0aGF0IHJlZ2lzdGVycyB0aGUge0BsaW5rIFNlcnZsZXRDb250YWluZXJ9LgorICAgICAqCisgICAgICogQHBhcmFtIHUgICAgICAgICAgdGhlIFVSSSB0byBjcmVhdGUgdGhlIGh0dHAgc2VydmVyLiBUaGUgVVJJIHNjaGVtZSBtdXN0IGJlCisgICAgICogICAgICAgICAgICAgICAgICAgZXF1YWwgdG8gImh0dHAiLiBUaGUgVVJJIHVzZXIgaW5mb3JtYXRpb24gYW5kIGhvc3QKKyAgICAgKiAgICAgICAgICAgICAgICAgICBhcmUgaWdub3JlZCBJZiB0aGUgVVJJIHBvcnQgaXMgbm90IHByZXNlbnQgdGhlbiBwb3J0IDgwIHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICB1c2VkLiBUaGUgVVJJIHF1ZXJ5IGFuZCBmcmFnbWVudCBjb21wb25lbnRzIGFyZSBpZ25vcmVkLiBPbmx5IGZpcnN0IHBhdGggc2VnbWVudCB3aWxsIGJlIHVzZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICBhcyBjb250ZXh0IHBhdGgsIHRoZSByZXN0IHdpbGwgYmUgaWdub3JlZC4KKyAgICAgKiBAcGFyYW0gaW5pdFBhcmFtcyB0aGUgc2VydmxldCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzLgorICAgICAqIEByZXR1cm4gdGhlIGh0dHAgc2VydmVyLCB3aXRoIHRoZSBlbmRwb2ludCBzdGFydGVkLgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uICAgICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBjcmVhdGluZyB0aGUgY29udGFpbmVyLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIEhUVFAgc2VydmVyIFVSSSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTZXJ2ZXIgY3JlYXRlKFVSSSB1LCBNYXA8U3RyaW5nLCBTdHJpbmc+IGluaXRQYXJhbXMpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZSh1LCBTZXJ2bGV0Q29udGFpbmVyLmNsYXNzLCBpbml0UGFyYW1zKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSB7QGxpbmsgU2VydmVyfSB0aGF0IHJlZ2lzdGVycyB0aGUgZGVjbGFyZWQKKyAgICAgKiBzZXJ2bGV0IGNsYXNzLgorICAgICAqCisgICAgICogQHBhcmFtIHUgdGhlIFVSSSB0byBjcmVhdGUgdGhlIGh0dHAgc2VydmVyLiBUaGUgVVJJIHNjaGVtZSBtdXN0IGJlCisgICAgICogICAgICAgICAgZXF1YWwgdG8gImh0dHAiLiBUaGUgVVJJIHVzZXIgaW5mb3JtYXRpb24gYW5kIGhvc3QKKyAgICAgKiAgICAgICAgICBhcmUgaWdub3JlZCBJZiB0aGUgVVJJIHBvcnQgaXMgbm90IHByZXNlbnQgdGhlbiBwb3J0IDgwIHdpbGwgYmUKKyAgICAgKiAgICAgICAgICB1c2VkLiBUaGUgVVJJIHF1ZXJ5IGFuZCBmcmFnbWVudCBjb21wb25lbnRzIGFyZSBpZ25vcmVkLiBPbmx5IGZpcnN0IHBhdGggc2VnbWVudCB3aWxsIGJlIHVzZWQKKyAgICAgKiAgICAgICAgICBhcyBjb250ZXh0IHBhdGgsIHRoZSByZXN0IHdpbGwgYmUgaWdub3JlZC4KKyAgICAgKiBAcGFyYW0gYyB0aGUgc2VydmxldCBjbGFzcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBodHRwIHNlcnZlciwgd2l0aCB0aGUgZW5kcG9pbnQgc3RhcnRlZC4KKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiAgICAgICAgICAgICAgICBpZiBhbiBlcnJvciBvY2N1cnMgY3JlYXRpbmcgdGhlIGNvbnRhaW5lci4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBIVFRQIHNlcnZlciBVUkkgaXMge0Bjb2RlIG51bGx9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU2VydmVyIGNyZWF0ZShTdHJpbmcgdSwgQ2xhc3M8PyBleHRlbmRzIFNlcnZsZXQ+IGMpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIFVSSSBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY3JlYXRlKFVSSS5jcmVhdGUodSksIGMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHtAbGluayBTZXJ2ZXJ9IHRoYXQgcmVnaXN0ZXJzIHRoZSBkZWNsYXJlZAorICAgICAqIHNlcnZsZXQgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdSAgICAgICAgICB0aGUgVVJJIHRvIGNyZWF0ZSB0aGUgaHR0cCBzZXJ2ZXIuIFRoZSBVUkkgc2NoZW1lIG11c3QgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICBlcXVhbCB0byAiaHR0cCIuIFRoZSBVUkkgdXNlciBpbmZvcm1hdGlvbiBhbmQgaG9zdAorICAgICAqICAgICAgICAgICAgICAgICAgIGFyZSBpZ25vcmVkIElmIHRoZSBVUkkgcG9ydCBpcyBub3QgcHJlc2VudCB0aGVuIHBvcnQgODAgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgIHVzZWQuIFRoZSBVUkkgcXVlcnkgYW5kIGZyYWdtZW50IGNvbXBvbmVudHMgYXJlIGlnbm9yZWQuIE9ubHkgZmlyc3QgcGF0aCBzZWdtZW50IHdpbGwgYmUgdXNlZAorICAgICAqICAgICAgICAgICAgICAgICAgIGFzIGNvbnRleHQgcGF0aCwgdGhlIHJlc3Qgd2lsbCBiZSBpZ25vcmVkLgorICAgICAqIEBwYXJhbSBjICAgICAgICAgIHRoZSBzZXJ2bGV0IGNsYXNzLgorICAgICAqIEBwYXJhbSBpbml0UGFyYW1zIHRoZSBzZXJ2bGV0IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMuCisgICAgICogQHJldHVybiB0aGUgaHR0cCBzZXJ2ZXIsIHdpdGggdGhlIGVuZHBvaW50IHN0YXJ0ZWQuCisgICAgICogQHRocm93cyBFeGNlcHRpb24gICAgICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGNyZWF0aW5nIHRoZSBjb250YWluZXIuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgSFRUUCBzZXJ2ZXIgVVJJIGlzIHtAY29kZSBudWxsfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNlcnZlciBjcmVhdGUoU3RyaW5nIHUsIENsYXNzPD8gZXh0ZW5kcyBTZXJ2bGV0PiBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGluaXRQYXJhbXMpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIFVSSSBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY3JlYXRlKFVSSS5jcmVhdGUodSksIGMsIGluaXRQYXJhbXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHtAbGluayBTZXJ2ZXJ9IHRoYXQgcmVnaXN0ZXJzIHRoZSBkZWNsYXJlZAorICAgICAqIHNlcnZsZXQgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdSB0aGUgVVJJIHRvIGNyZWF0ZSB0aGUgaHR0cCBzZXJ2ZXIuIFRoZSBVUkkgc2NoZW1lIG11c3QgYmUKKyAgICAgKiAgICAgICAgICBlcXVhbCB0byAiaHR0cCIuIFRoZSBVUkkgdXNlciBpbmZvcm1hdGlvbiBhbmQgaG9zdAorICAgICAqICAgICAgICAgIGFyZSBpZ25vcmVkIElmIHRoZSBVUkkgcG9ydCBpcyBub3QgcHJlc2VudCB0aGVuIHBvcnQgODAgd2lsbCBiZQorICAgICAqICAgICAgICAgIHVzZWQuIFRoZSBVUkkgcXVlcnkgYW5kIGZyYWdtZW50IGNvbXBvbmVudHMgYXJlIGlnbm9yZWQuIE9ubHkgZmlyc3QgcGF0aCBzZWdtZW50IHdpbGwgYmUgdXNlZAorICAgICAqICAgICAgICAgIGFzIGNvbnRleHQgcGF0aCwgdGhlIHJlc3Qgd2lsbCBiZSBpZ25vcmVkLgorICAgICAqIEBwYXJhbSBjIHRoZSBzZXJ2bGV0IGNsYXNzLgorICAgICAqIEByZXR1cm4gdGhlIGh0dHAgc2VydmVyLCB3aXRoIHRoZSBlbmRwb2ludCBzdGFydGVkLgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uICAgICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBjcmVhdGluZyB0aGUgY29udGFpbmVyLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIEhUVFAgc2VydmVyIFVSSSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTZXJ2ZXIgY3JlYXRlKFVSSSB1LCBDbGFzczw/IGV4dGVuZHMgU2VydmxldD4gYykKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXR1cm4gY3JlYXRlKHUsIGMsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHtAbGluayBTZXJ2ZXJ9IHRoYXQgcmVnaXN0ZXJzIHRoZSBkZWNsYXJlZAorICAgICAqIHNlcnZsZXQgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdSAgICAgICAgICB0aGUgVVJJIHRvIGNyZWF0ZSB0aGUgaHR0cCBzZXJ2ZXIuIFRoZSBVUkkgc2NoZW1lIG11c3QgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICBlcXVhbCB0byAiaHR0cCIuIFRoZSBVUkkgdXNlciBpbmZvcm1hdGlvbiBhbmQgaG9zdAorICAgICAqICAgICAgICAgICAgICAgICAgIGFyZSBpZ25vcmVkIElmIHRoZSBVUkkgcG9ydCBpcyBub3QgcHJlc2VudCB0aGVuIHBvcnQgODAgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgIHVzZWQuIFRoZSBVUkkgcXVlcnkgYW5kIGZyYWdtZW50IGNvbXBvbmVudHMgYXJlIGlnbm9yZWQuIE9ubHkgZmlyc3QgcGF0aCBzZWdtZW50IHdpbGwgYmUgdXNlZAorICAgICAqICAgICAgICAgICAgICAgICAgIGFzIGNvbnRleHQgcGF0aCwgdGhlIHJlc3Qgd2lsbCBiZSBpZ25vcmVkLgorICAgICAqIEBwYXJhbSBjICAgICAgICAgIHRoZSBzZXJ2bGV0IGNsYXNzLgorICAgICAqIEBwYXJhbSBpbml0UGFyYW1zIHRoZSBzZXJ2bGV0IGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMuCisgICAgICogQHJldHVybiB0aGUgaHR0cCBzZXJ2ZXIsIHdpdGggdGhlIGVuZHBvaW50IHN0YXJ0ZWQuCisgICAgICogQHRocm93cyBFeGNlcHRpb24gICAgICAgICAgICAgICAgaWYgYW4gZXJyb3Igb2NjdXJzIGNyZWF0aW5nIHRoZSBjb250YWluZXIuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgSFRUUCBzZXJ2ZXIgVVJJIGlzIHtAY29kZSBudWxsfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNlcnZlciBjcmVhdGUoVVJJIHUsIENsYXNzPD8gZXh0ZW5kcyBTZXJ2bGV0PiBjLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGluaXRQYXJhbXMpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZSh1LCBjLCBudWxsLCBpbml0UGFyYW1zLCBudWxsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTZXJ2ZXIgY3JlYXRlKFVSSSB1LCBDbGFzczw/IGV4dGVuZHMgU2VydmxldD4gYywgU2VydmxldCBzZXJ2bGV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBpbml0UGFyYW1zLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGNvbnRleHRJbml0UGFyYW1zKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICh1ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBVUkkgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHBhdGggPSB1LmdldFBhdGgoKTsKKyAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIFVSSSBwYXRoLCBvZiB0aGUgVVJJICIgKyB1ICsgIiwgbXVzdCBiZSBub24tbnVsbCIpOworICAgICAgICB9IGVsc2UgaWYgKHBhdGguaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgVVJJIHBhdGgsIG9mIHRoZSBVUkkgIiArIHUgKyAiLCBtdXN0IGJlIHByZXNlbnQiKTsKKyAgICAgICAgfSBlbHNlIGlmIChwYXRoLmNoYXJBdCgwKSAhPSAnLycpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBVUkkgcGF0aCwgb2YgdGhlIFVSSSAiICsgdSArICIuIG11c3Qgc3RhcnQgd2l0aCBhICcvJyIpOworICAgICAgICB9CisKKyAgICAgICAgcGF0aCA9IFN0cmluZy5mb3JtYXQoIi8lcyIsIFVyaUNvbXBvbmVudC5kZWNvZGVQYXRoKHUuZ2V0UGF0aCgpLCB0cnVlKS5nZXQoMSkudG9TdHJpbmcoKSk7CisgICAgICAgIFdlYkFwcENvbnRleHQgY29udGV4dCA9IG5ldyBXZWJBcHBDb250ZXh0KCk7CisgICAgICAgIGNvbnRleHQuc2V0RGlzcGxheU5hbWUoIkpldHR5Q29udGV4dCIpOworICAgICAgICBjb250ZXh0LnNldENvbnRleHRQYXRoKHBhdGgpOworICAgICAgICBjb250ZXh0LnNldENvbmZpZ3VyYXRpb25zKG5ldyBDb25maWd1cmF0aW9uW117bmV3IFdlYlhtbENvbmZpZ3VyYXRpb24oKX0pOworICAgICAgICBTZXJ2bGV0SG9sZGVyIGhvbGRlcjsKKyAgICAgICAgaWYgKGMgIT0gbnVsbCkgeworICAgICAgICAgICAgaG9sZGVyID0gY29udGV4dC5hZGRTZXJ2bGV0KGMsICIvKiIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaG9sZGVyID0gbmV3IFNlcnZsZXRIb2xkZXIoc2VydmxldCk7CisgICAgICAgICAgICBjb250ZXh0LmFkZFNlcnZsZXQoaG9sZGVyLCAiLyoiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb250ZXh0SW5pdFBhcmFtcyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZSA6IGNvbnRleHRJbml0UGFyYW1zLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LnNldEluaXRQYXJhbWV0ZXIoZS5nZXRLZXkoKSwgZS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbml0UGFyYW1zICE9IG51bGwpIHsKKyAgICAgICAgICAgIGhvbGRlci5zZXRJbml0UGFyYW1ldGVycyhpbml0UGFyYW1zKTsKKyAgICAgICAgfQorCisgICAgICAgIFNlcnZlciBzZXJ2ZXIgPSBKZXR0eUh0dHBDb250YWluZXJGYWN0b3J5LmNyZWF0ZVNlcnZlcih1LCBmYWxzZSk7CisgICAgICAgIHNlcnZlci5zZXRIYW5kbGVyKGNvbnRleHQpOworICAgICAgICBzZXJ2ZXIuc3RhcnQoKTsKKyAgICAgICAgcmV0dXJuIHNlcnZlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSB7QGxpbmsgU2VydmVyfSB0aGF0IHJlZ2lzdGVycyB0aGUgZGVjbGFyZWQKKyAgICAgKiBzZXJ2bGV0IGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHUgICAgICAgICAgICAgICAgIHRoZSBVUkkgdG8gY3JlYXRlIHRoZSBIVFRQIHNlcnZlci4gVGhlIFVSSSBzY2hlbWUgbXVzdCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBlcXVhbCB0byAiaHR0cCIuIFRoZSBVUkkgdXNlciBpbmZvcm1hdGlvbiBhbmQgaG9zdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgaWdub3JlZCBJZiB0aGUgVVJJIHBvcnQgaXMgbm90IHByZXNlbnQgdGhlbiBwb3J0IDgwIHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlZC4gVGhlIFVSSSBxdWVyeSBhbmQgZnJhZ21lbnQgY29tcG9uZW50cyBhcmUgaWdub3JlZC4gT25seSBmaXJzdCBwYXRoIHNlZ21lbnQgd2lsbCBiZSB1c2VkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGFzIGNvbnRleHQgcGF0aCwgdGhlIHJlc3Qgd2lsbCBiZSBpZ25vcmVkLgorICAgICAqIEBwYXJhbSBzZXJ2bGV0ICAgICAgICAgICB0aGUgc2VydmxldCBpbnN0YW5jZS4KKyAgICAgKiBAcGFyYW0gaW5pdFBhcmFtcyAgICAgICAgdGhlIHNlcnZsZXQgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycy4KKyAgICAgKiBAcGFyYW0gY29udGV4dEluaXRQYXJhbXMgdGhlIHNlcnZsZXQgY29udGV4dCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzLgorICAgICAqIEByZXR1cm4gdGhlIGh0dHAgc2VydmVyLCB3aXRoIHRoZSBlbmRwb2ludCBzdGFydGVkLgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uICAgICAgICAgICAgICAgIGlmIGFuIGVycm9yIG9jY3VycyBjcmVhdGluZyB0aGUgY29udGFpbmVyLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIEhUVFAgc2VydmVyIFVSSSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTZXJ2ZXIgY3JlYXRlKFVSSSB1LCBTZXJ2bGV0IHNlcnZsZXQsIE1hcDxTdHJpbmcsIFN0cmluZz4gaW5pdFBhcmFtcywgTWFwPFN0cmluZywgU3RyaW5nPiBjb250ZXh0SW5pdFBhcmFtcykKKyAgICAgICAgICAgIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoc2VydmxldCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgc2VydmxldCBtdXN0IG5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNyZWF0ZSh1LCBudWxsLCBzZXJ2bGV0LCBpbml0UGFyYW1zLCBjb250ZXh0SW5pdFBhcmFtcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVycy9qZXR0eS1zZXJ2bGV0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamV0dHkvc2VydmxldC9wYWNrYWdlLWluZm8uamF2YSBiL2NvbnRhaW5lcnMvamV0dHktc2VydmxldC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHR5L3NlcnZsZXQvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE2NDNjMwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lcnMvamV0dHktc2VydmxldC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHR5L3NlcnZsZXQvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoqCisgKiBKZXJzZXkgSmV0dHkgU2VydmxldCBjb250YWluZXIgY2xhc3Nlcy4KKyAqLworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0eS5zZXJ2bGV0OwpkaWZmIC0tZ2l0IGEvY29udGFpbmVycy9uZXR0eS1odHRwL3BvbS54bWwgYi9jb250YWluZXJzL25ldHR5LWh0dHAvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWIwNTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVycy9uZXR0eS1odHRwL3BvbS54bWwKQEAgLTAsMCArMSw2NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1uZXR0eS1odHRwPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LWNvbnRhaW5lci1uZXR0eS1odHRwPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPk5ldHR5IEh0dHAgQ29udGFpbmVyLjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guaGsyLmV4dGVybmFsPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguaW5qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29ubmVjdG9yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1uZXR0eS1jb25uZWN0b3I8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4uaXN0YWNrPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWlzdGFjay1jb21tb25zLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5idWlsZC1oZWxwZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZmVsaXg8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYnVuZGxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY29udGFpbmVycy9uZXR0eS1odHRwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbmV0dHkvaHR0cHNlcnZlci9IdHRwVmVyc2lvbkNob29zZXIuamF2YSBiL2NvbnRhaW5lcnMvbmV0dHktaHR0cC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L25ldHR5L2h0dHBzZXJ2ZXIvSHR0cFZlcnNpb25DaG9vc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI2NjBlMgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lcnMvbmV0dHktaHR0cC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L25ldHR5L2h0dHBzZXJ2ZXIvSHR0cFZlcnNpb25DaG9vc2VyLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5uZXR0eS5odHRwc2VydmVyOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworCitpbXBvcnQgaW8ubmV0dHkuY2hhbm5lbC5DaGFubmVsSGFuZGxlckNvbnRleHQ7CitpbXBvcnQgaW8ubmV0dHkuaGFuZGxlci5jb2RlYy5odHRwLkh0dHBTZXJ2ZXJDb2RlYzsKK2ltcG9ydCBpby5uZXR0eS5oYW5kbGVyLmNvZGVjLmh0dHAyLkh0dHAyQ29kZWM7CitpbXBvcnQgaW8ubmV0dHkuaGFuZGxlci5zc2wuQXBwbGljYXRpb25Qcm90b2NvbE5hbWVzOworaW1wb3J0IGlvLm5ldHR5LmhhbmRsZXIuc3NsLkFwcGxpY2F0aW9uUHJvdG9jb2xOZWdvdGlhdGlvbkhhbmRsZXI7CitpbXBvcnQgaW8ubmV0dHkuaGFuZGxlci5zdHJlYW0uQ2h1bmtlZFdyaXRlSGFuZGxlcjsKKworLyoqCisgKiBDaG9vc2UgdGhlIGhhbmRsZXIgaW1wbGVtZW50YXRpb24gYmFzZWQgb24gSHR0cCBwcm90b2NvbC4KKyAqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitjbGFzcyBIdHRwVmVyc2lvbkNob29zZXIgZXh0ZW5kcyBBcHBsaWNhdGlvblByb3RvY29sTmVnb3RpYXRpb25IYW5kbGVyIHsKKworICAgIHByaXZhdGUgZmluYWwgVVJJIGJhc2VVcmk7CisgICAgcHJpdmF0ZSBmaW5hbCBOZXR0eUh0dHBDb250YWluZXIgY29udGFpbmVyOworCisgICAgSHR0cFZlcnNpb25DaG9vc2VyKFVSSSBiYXNlVXJpLCBOZXR0eUh0dHBDb250YWluZXIgY29udGFpbmVyKSB7CisgICAgICAgIHN1cGVyKEFwcGxpY2F0aW9uUHJvdG9jb2xOYW1lcy5IVFRQXzFfMSk7CisKKyAgICAgICAgdGhpcy5iYXNlVXJpID0gYmFzZVVyaTsKKyAgICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlUGlwZWxpbmUoQ2hhbm5lbEhhbmRsZXJDb250ZXh0IGN0eCwgU3RyaW5nIHByb3RvY29sKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKEFwcGxpY2F0aW9uUHJvdG9jb2xOYW1lcy5IVFRQXzIuZXF1YWxzKHByb3RvY29sKSkgeworICAgICAgICAgICAgY3R4LnBpcGVsaW5lKCkuYWRkTGFzdChuZXcgSHR0cDJDb2RlYyh0cnVlLCBuZXcgSmVyc2V5SHR0cDJTZXJ2ZXJIYW5kbGVyKGJhc2VVcmksIGNvbnRhaW5lcikpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChBcHBsaWNhdGlvblByb3RvY29sTmFtZXMuSFRUUF8xXzEuZXF1YWxzKHByb3RvY29sKSkgeworICAgICAgICAgICAgY3R4LnBpcGVsaW5lKCkuYWRkTGFzdChuZXcgSHR0cFNlcnZlckNvZGVjKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDaHVua2VkV3JpdGVIYW5kbGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBKZXJzZXlTZXJ2ZXJIYW5kbGVyKGJhc2VVcmksIGNvbnRhaW5lcikpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5rbm93biBwcm90b2NvbDogIiArIHByb3RvY29sKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXJzL25ldHR5LWh0dHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9uZXR0eS9odHRwc2VydmVyL0plcnNleUh0dHAyU2VydmVySGFuZGxlci5qYXZhIGIvY29udGFpbmVycy9uZXR0eS1odHRwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbmV0dHkvaHR0cHNlcnZlci9KZXJzZXlIdHRwMlNlcnZlckhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGIxMDg5Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVycy9uZXR0eS1odHRwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbmV0dHkvaHR0cHNlcnZlci9KZXJzZXlIdHRwMlNlcnZlckhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDIxOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5uZXR0eS5odHRwc2VydmVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuTGlua2VkQmxvY2tpbmdEZXF1ZTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuU2VjdXJpdHlDb250ZXh0OworCitpbXBvcnQgaW8ubmV0dHkuYnVmZmVyLkJ5dGVCdWZJbnB1dFN0cmVhbTsKK2ltcG9ydCBpby5uZXR0eS5jaGFubmVsLkNoYW5uZWxEdXBsZXhIYW5kbGVyOworaW1wb3J0IGlvLm5ldHR5LmNoYW5uZWwuQ2hhbm5lbEhhbmRsZXI7CitpbXBvcnQgaW8ubmV0dHkuY2hhbm5lbC5DaGFubmVsSGFuZGxlckNvbnRleHQ7CitpbXBvcnQgaW8ubmV0dHkuaGFuZGxlci5jb2RlYy5odHRwLkh0dHBSZXF1ZXN0OworaW1wb3J0IGlvLm5ldHR5LmhhbmRsZXIuY29kZWMuaHR0cDIuSHR0cDJEYXRhRnJhbWU7CitpbXBvcnQgaW8ubmV0dHkuaGFuZGxlci5jb2RlYy5odHRwMi5IdHRwMkhlYWRlcnNGcmFtZTsKK2ltcG9ydCBpby5uZXR0eS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOworaW1wb3J0IGlvLm5ldHR5LnV0aWwuY29uY3VycmVudC5HZW5lcmljRnV0dXJlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuUHJvcGVydGllc0RlbGVnYXRlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm5ldHR5LmNvbm5lY3Rvci5pbnRlcm5hbC5OZXR0eUlucHV0U3RyZWFtOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5Db250YWluZXJVdGlsczsKKworLyoqCisgKiBKZXJzZXkgTmV0dHkgSFRUUC8yIGhhbmRsZXIuCisgKiA8cD4KKyAqIE5vdGUgdGhhdCB0aGlzIGltcGxlbWVudGF0aW9uIGNhbm5vdCBiZSBtb3JlIGV4cGVyaW1lbnRhbC4gQW55IGNvbnRyaWJ1dGlvbnMgLyBmZWVkYmFjayBpcyB3ZWxjb21lZC4KKyAqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitAQ2hhbm5lbEhhbmRsZXIuU2hhcmFibGUKK2NsYXNzIEplcnNleUh0dHAyU2VydmVySGFuZGxlciBleHRlbmRzIENoYW5uZWxEdXBsZXhIYW5kbGVyIHsKKworICAgIHByaXZhdGUgZmluYWwgVVJJIGJhc2VVcmk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaW5rZWRCbG9ja2luZ0RlcXVlPElucHV0U3RyZWFtPiBpc0xpc3QgPSBuZXcgTGlua2VkQmxvY2tpbmdEZXF1ZTw+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBOZXR0eUh0dHBDb250YWluZXIgY29udGFpbmVyOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmFzZVVyaSAgIGJhc2Uge0BsaW5rIFVSSX0gb2YgdGhlIGNvbnRhaW5lciAoaW5jbHVkZXMgY29udGV4dCBwYXRoLCBpZiBhbnkpLgorICAgICAqIEBwYXJhbSBjb250YWluZXIgTmV0dHkgY29udGFpbmVyIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIEplcnNleUh0dHAyU2VydmVySGFuZGxlcihVUkkgYmFzZVVyaSwgTmV0dHlIdHRwQ29udGFpbmVyIGNvbnRhaW5lcikgeworICAgICAgICB0aGlzLmJhc2VVcmkgPSBiYXNlVXJpOworICAgICAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBleGNlcHRpb25DYXVnaHQoQ2hhbm5lbEhhbmRsZXJDb250ZXh0IGN0eCwgVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgICAgIGN0eC5jbG9zZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNoYW5uZWxSZWFkKENoYW5uZWxIYW5kbGVyQ29udGV4dCBjdHgsIE9iamVjdCBtc2cpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAobXNnIGluc3RhbmNlb2YgSHR0cDJIZWFkZXJzRnJhbWUpIHsKKyAgICAgICAgICAgIG9uSGVhZGVyc1JlYWQoY3R4LCAoSHR0cDJIZWFkZXJzRnJhbWUpIG1zZyk7CisgICAgICAgIH0gZWxzZSBpZiAobXNnIGluc3RhbmNlb2YgSHR0cDJEYXRhRnJhbWUpIHsKKyAgICAgICAgICAgIG9uRGF0YVJlYWQoY3R4LCAoSHR0cDJEYXRhRnJhbWUpIG1zZyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdXBlci5jaGFubmVsUmVhZChjdHgsIG1zZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIGluY29taW5nIGRhdGEuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIG9uRGF0YVJlYWQoQ2hhbm5lbEhhbmRsZXJDb250ZXh0IGN0eCwgSHR0cDJEYXRhRnJhbWUgZGF0YSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlzTGlzdC5hZGQobmV3IEJ5dGVCdWZJbnB1dFN0cmVhbShkYXRhLmNvbnRlbnQoKSkpOworICAgICAgICBpZiAoZGF0YS5pc0VuZFN0cmVhbSgpKSB7CisgICAgICAgICAgICBpc0xpc3QuYWRkKE5ldHR5SW5wdXRTdHJlYW0uRU5EX09GX0lOUFVUKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgaW5jb21pbmcgcmVxdWVzdCAoanVzdCBhIGhlYWRlcnMgaW4gdGhpcyBjYXNlLCBlbnRpdHkgaXMgcHJvY2Vzc2VkIHNlcGFyYXRlbHkpLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBvbkhlYWRlcnNSZWFkKENoYW5uZWxIYW5kbGVyQ29udGV4dCBjdHgsIEh0dHAySGVhZGVyc0ZyYW1lIGhlYWRlcnMpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlcXVlc3QgcmVxdWVzdENvbnRleHQgPSBjcmVhdGVDb250YWluZXJSZXF1ZXN0KGN0eCwgaGVhZGVycyk7CisKKyAgICAgICAgcmVxdWVzdENvbnRleHQuc2V0V3JpdGVyKG5ldyBOZXR0eUh0dHAyUmVzcG9uc2VXcml0ZXIoY3R4LCBoZWFkZXJzLCBjb250YWluZXIpKTsKKworICAgICAgICAvLyBtdXN0IGJlIGxpa2UgdGhpcywgc2luY2UgdGhlcmUgaXMgYSBibG9ja2luZyByZWFkIGZyb20gSmVyc2V5CisgICAgICAgIGNvbnRhaW5lci5nZXRFeGVjdXRvclNlcnZpY2UoKS5leGVjdXRlKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIGNvbnRhaW5lci5nZXRBcHBsaWNhdGlvbkhhbmRsZXIoKS5oYW5kbGUocmVxdWVzdENvbnRleHQpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgSmVyc2V5IHtAbGluayBDb250YWluZXJSZXF1ZXN0fSBiYXNlZCBvbiBOZXR0eSB7QGxpbmsgSHR0cFJlcXVlc3R9LgorICAgICAqCisgICAgICogQHBhcmFtIGN0eCAgICAgICAgICBOZXR0eSBjaGFubmVsIGNvbnRleHQuCisgICAgICogQHBhcmFtIGh0dHAySGVhZGVycyBOZXR0eSBIdHRwLzIgaGVhZGVycy4KKyAgICAgKiBAcmV0dXJuIGNyZWF0ZWQgSmVyc2V5IENvbnRhaW5lciBSZXF1ZXN0LgorICAgICAqLworICAgIHByaXZhdGUgQ29udGFpbmVyUmVxdWVzdCBjcmVhdGVDb250YWluZXJSZXF1ZXN0KENoYW5uZWxIYW5kbGVyQ29udGV4dCBjdHgsIEh0dHAySGVhZGVyc0ZyYW1lIGh0dHAySGVhZGVycykgeworCisgICAgICAgIFN0cmluZyBwYXRoID0gaHR0cDJIZWFkZXJzLmhlYWRlcnMoKS5wYXRoKCkudG9TdHJpbmcoKTsKKworICAgICAgICBTdHJpbmcgcyA9IHBhdGguc3RhcnRzV2l0aCgiLyIpID8gcGF0aC5zdWJzdHJpbmcoMSkgOiBwYXRoOworICAgICAgICBVUkkgcmVxdWVzdFVyaSA9IFVSSS5jcmVhdGUoYmFzZVVyaSArIENvbnRhaW5lclV0aWxzLmVuY29kZVVuc2FmZUNoYXJhY3RlcnMocykpOworCisgICAgICAgIENvbnRhaW5lclJlcXVlc3QgcmVxdWVzdENvbnRleHQgPSBuZXcgQ29udGFpbmVyUmVxdWVzdCgKKyAgICAgICAgICAgICAgICBiYXNlVXJpLCByZXF1ZXN0VXJpLCBodHRwMkhlYWRlcnMuaGVhZGVycygpLm1ldGhvZCgpLnRvU3RyaW5nKCksIGdldFNlY3VyaXR5Q29udGV4dCgpLAorICAgICAgICAgICAgICAgIG5ldyBQcm9wZXJ0aWVzRGVsZWdhdGUoKSB7CisKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0aWVzLmdldChuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgQ29sbGVjdGlvbjxTdHJpbmc+IGdldFByb3BlcnR5TmFtZXMoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvcGVydGllcy5rZXlTZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSwgT2JqZWN0IG9iamVjdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5wdXQobmFtZSwgb2JqZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eShTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5yZW1vdmUobmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAvLyByZXF1ZXN0IGVudGl0eSBoYW5kbGluZy4KKyAgICAgICAgaWYgKCFodHRwMkhlYWRlcnMuaXNFbmRTdHJlYW0oKSkgeworCisgICAgICAgICAgICBjdHguY2hhbm5lbCgpLmNsb3NlRnV0dXJlKCkuYWRkTGlzdGVuZXIobmV3IEdlbmVyaWNGdXR1cmVMaXN0ZW5lcjxGdXR1cmU8PyBzdXBlciBWb2lkPj4oKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb3BlcmF0aW9uQ29tcGxldGUoRnV0dXJlPD8gc3VwZXIgVm9pZD4gZnV0dXJlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgaXNMaXN0LmFkZChOZXR0eUlucHV0U3RyZWFtLkVORF9PRl9JTlBVVF9FUlJPUik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LnNldEVudGl0eVN0cmVhbShuZXcgTmV0dHlJbnB1dFN0cmVhbShpc0xpc3QpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LnNldEVudGl0eVN0cmVhbShuZXcgSW5wdXRTdHJlYW0oKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gY29weWluZyBoZWFkZXJzIGZyb20gbmV0dHkgcmVxdWVzdCB0byBqZXJzZXkgY29udGFpbmVyIHJlcXVlc3QgY29udGV4dC4KKyAgICAgICAgZm9yIChDaGFyU2VxdWVuY2UgbmFtZSA6IGh0dHAySGVhZGVycy5oZWFkZXJzKCkubmFtZXMoKSkgeworICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuaGVhZGVycyhuYW1lLnRvU3RyaW5nKCksIG1hcFRvU3RyaW5nKGh0dHAySGVhZGVycy5oZWFkZXJzKCkuZ2V0QWxsKG5hbWUpKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVxdWVzdENvbnRleHQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbWFwVG9TdHJpbmcoTGlzdDxDaGFyU2VxdWVuY2U+IGxpc3QpIHsKKyAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KGxpc3Quc2l6ZSgpKTsKKworICAgICAgICBmb3IgKENoYXJTZXF1ZW5jZSBzZXF1ZW5jZSA6IGxpc3QpIHsKKyAgICAgICAgICAgIHJlc3VsdC5hZGQoc2VxdWVuY2UudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHByaXZhdGUgU2VjdXJpdHlDb250ZXh0IGdldFNlY3VyaXR5Q29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTZWN1cml0eUNvbnRleHQoKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNVc2VySW5Sb2xlKGZpbmFsIFN0cmluZyByb2xlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzU2VjdXJlKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgUHJpbmNpcGFsIGdldFVzZXJQcmluY2lwYWwoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRBdXRoZW50aWNhdGlvblNjaGVtZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXJzL25ldHR5LWh0dHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9uZXR0eS9odHRwc2VydmVyL0plcnNleVNlcnZlckhhbmRsZXIuamF2YSBiL2NvbnRhaW5lcnMvbmV0dHktaHR0cC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L25ldHR5L2h0dHBzZXJ2ZXIvSmVyc2V5U2VydmVySGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNDM3ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXJzL25ldHR5LWh0dHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9uZXR0eS9odHRwc2VydmVyL0plcnNleVNlcnZlckhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDIwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5uZXR0eS5odHRwc2VydmVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkxpbmtlZEJsb2NraW5nRGVxdWU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlNlY3VyaXR5Q29udGV4dDsKKworaW1wb3J0IGlvLm5ldHR5LmJ1ZmZlci5CeXRlQnVmOworaW1wb3J0IGlvLm5ldHR5LmJ1ZmZlci5CeXRlQnVmSW5wdXRTdHJlYW07CitpbXBvcnQgaW8ubmV0dHkuY2hhbm5lbC5DaGFubmVsSGFuZGxlckNvbnRleHQ7CitpbXBvcnQgaW8ubmV0dHkuY2hhbm5lbC5DaGFubmVsSW5ib3VuZEhhbmRsZXJBZGFwdGVyOworaW1wb3J0IGlvLm5ldHR5LmhhbmRsZXIuY29kZWMuaHR0cC5EZWZhdWx0RnVsbEh0dHBSZXNwb25zZTsKK2ltcG9ydCBpby5uZXR0eS5oYW5kbGVyLmNvZGVjLmh0dHAuSHR0cENvbnRlbnQ7CitpbXBvcnQgaW8ubmV0dHkuaGFuZGxlci5jb2RlYy5odHRwLkh0dHBIZWFkZXJOYW1lczsKK2ltcG9ydCBpby5uZXR0eS5oYW5kbGVyLmNvZGVjLmh0dHAuSHR0cFJlcXVlc3Q7CitpbXBvcnQgaW8ubmV0dHkuaGFuZGxlci5jb2RlYy5odHRwLkh0dHBSZXNwb25zZVN0YXR1czsKK2ltcG9ydCBpby5uZXR0eS5oYW5kbGVyLmNvZGVjLmh0dHAuSHR0cFV0aWw7CitpbXBvcnQgaW8ubmV0dHkuaGFuZGxlci5jb2RlYy5odHRwLkh0dHBWZXJzaW9uOworaW1wb3J0IGlvLm5ldHR5LmhhbmRsZXIuY29kZWMuaHR0cC5MYXN0SHR0cENvbnRlbnQ7CitpbXBvcnQgaW8ubmV0dHkudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKK2ltcG9ydCBpby5uZXR0eS51dGlsLmNvbmN1cnJlbnQuR2VuZXJpY0Z1dHVyZUxpc3RlbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLlByb3BlcnRpZXNEZWxlZ2F0ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5uZXR0eS5jb25uZWN0b3IuaW50ZXJuYWwuTmV0dHlJbnB1dFN0cmVhbTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuQ29udGFpbmVyVXRpbHM7CisKKy8qKgorICoge0BsaW5rIGlvLm5ldHR5LmNoYW5uZWwuQ2hhbm5lbEluYm91bmRIYW5kbGVyfSB3aGljaCBzZXJ2ZXJzIGFzIGEgYnJpZGdlCisgKiBiZXR3ZWVuIE5ldHR5IGFuZCBKZXJzZXkuCisgKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworY2xhc3MgSmVyc2V5U2VydmVySGFuZGxlciBleHRlbmRzIENoYW5uZWxJbmJvdW5kSGFuZGxlckFkYXB0ZXIgeworCisgICAgcHJpdmF0ZSBmaW5hbCBVUkkgYmFzZVVyaTsKKyAgICBwcml2YXRlIGZpbmFsIExpbmtlZEJsb2NraW5nRGVxdWU8SW5wdXRTdHJlYW0+IGlzTGlzdCA9IG5ldyBMaW5rZWRCbG9ja2luZ0RlcXVlPD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIE5ldHR5SHR0cENvbnRhaW5lciBjb250YWluZXI7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiYXNlVXJpICAgYmFzZSB7QGxpbmsgVVJJfSBvZiB0aGUgY29udGFpbmVyIChpbmNsdWRlcyBjb250ZXh0IHBhdGgsIGlmIGFueSkuCisgICAgICogQHBhcmFtIGNvbnRhaW5lciBOZXR0eSBjb250YWluZXIgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIEplcnNleVNlcnZlckhhbmRsZXIoVVJJIGJhc2VVcmksIE5ldHR5SHR0cENvbnRhaW5lciBjb250YWluZXIpIHsKKyAgICAgICAgdGhpcy5iYXNlVXJpID0gYmFzZVVyaTsKKyAgICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2hhbm5lbFJlYWQoZmluYWwgQ2hhbm5lbEhhbmRsZXJDb250ZXh0IGN0eCwgT2JqZWN0IG1zZykgeworCisgICAgICAgIGlmIChtc2cgaW5zdGFuY2VvZiBIdHRwUmVxdWVzdCkgeworICAgICAgICAgICAgZmluYWwgSHR0cFJlcXVlc3QgcmVxID0gKEh0dHBSZXF1ZXN0KSBtc2c7CisKKyAgICAgICAgICAgIGlmIChIdHRwVXRpbC5pczEwMENvbnRpbnVlRXhwZWN0ZWQocmVxKSkgeworICAgICAgICAgICAgICAgIGN0eC53cml0ZShuZXcgRGVmYXVsdEZ1bGxIdHRwUmVzcG9uc2UoSHR0cFZlcnNpb24uSFRUUF8xXzEsIEh0dHBSZXNwb25zZVN0YXR1cy5DT05USU5VRSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpc0xpc3QuY2xlYXIoKTsgLy8gY2xlYXJpbmcgdGhlIGNvbnRlbnQgLSBwb3NzaWJsZSBsZWZ0b3ZlciBmcm9tIHByZXZpb3VzIHJlcXVlc3QgcHJvY2Vzc2luZy4KKyAgICAgICAgICAgIGZpbmFsIENvbnRhaW5lclJlcXVlc3QgcmVxdWVzdENvbnRleHQgPSBjcmVhdGVDb250YWluZXJSZXF1ZXN0KGN0eCwgcmVxKTsKKworICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuc2V0V3JpdGVyKG5ldyBOZXR0eVJlc3BvbnNlV3JpdGVyKGN0eCwgcmVxLCBjb250YWluZXIpKTsKKworICAgICAgICAgICAgLy8gbXVzdCBiZSBsaWtlIHRoaXMsIHNpbmNlIHRoZXJlIGlzIGEgYmxvY2tpbmcgcmVhZCBmcm9tIEplcnNleQorICAgICAgICAgICAgY29udGFpbmVyLmdldEV4ZWN1dG9yU2VydmljZSgpLmV4ZWN1dGUobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLmdldEFwcGxpY2F0aW9uSGFuZGxlcigpLmhhbmRsZShyZXF1ZXN0Q29udGV4dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobXNnIGluc3RhbmNlb2YgSHR0cENvbnRlbnQpIHsKKyAgICAgICAgICAgIEh0dHBDb250ZW50IGh0dHBDb250ZW50ID0gKEh0dHBDb250ZW50KSBtc2c7CisKKyAgICAgICAgICAgIEJ5dGVCdWYgY29udGVudCA9IGh0dHBDb250ZW50LmNvbnRlbnQoKTsKKworICAgICAgICAgICAgaWYgKGNvbnRlbnQuaXNSZWFkYWJsZSgpKSB7CisgICAgICAgICAgICAgICAgaXNMaXN0LmFkZChuZXcgQnl0ZUJ1ZklucHV0U3RyZWFtKGNvbnRlbnQpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1zZyBpbnN0YW5jZW9mIExhc3RIdHRwQ29udGVudCkgeworICAgICAgICAgICAgICAgIGlzTGlzdC5hZGQoTmV0dHlJbnB1dFN0cmVhbS5FTkRfT0ZfSU5QVVQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIEplcnNleSB7QGxpbmsgQ29udGFpbmVyUmVxdWVzdH0gYmFzZWQgb24gTmV0dHkge0BsaW5rIEh0dHBSZXF1ZXN0fS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjdHggTmV0dHkgY2hhbm5lbCBjb250ZXh0LgorICAgICAqIEBwYXJhbSByZXEgTmV0dHkgSHR0cCByZXF1ZXN0LgorICAgICAqIEByZXR1cm4gY3JlYXRlZCBKZXJzZXkgQ29udGFpbmVyIFJlcXVlc3QuCisgICAgICovCisgICAgcHJpdmF0ZSBDb250YWluZXJSZXF1ZXN0IGNyZWF0ZUNvbnRhaW5lclJlcXVlc3QoQ2hhbm5lbEhhbmRsZXJDb250ZXh0IGN0eCwgSHR0cFJlcXVlc3QgcmVxKSB7CisKKyAgICAgICAgU3RyaW5nIHMgPSByZXEudXJpKCkuc3RhcnRzV2l0aCgiLyIpID8gcmVxLnVyaSgpLnN1YnN0cmluZygxKSA6IHJlcS51cmkoKTsKKyAgICAgICAgVVJJIHJlcXVlc3RVcmkgPSBVUkkuY3JlYXRlKGJhc2VVcmkgKyBDb250YWluZXJVdGlscy5lbmNvZGVVbnNhZmVDaGFyYWN0ZXJzKHMpKTsKKworICAgICAgICBDb250YWluZXJSZXF1ZXN0IHJlcXVlc3RDb250ZXh0ID0gbmV3IENvbnRhaW5lclJlcXVlc3QoCisgICAgICAgICAgICAgICAgYmFzZVVyaSwgcmVxdWVzdFVyaSwgcmVxLm1ldGhvZCgpLm5hbWUoKSwgZ2V0U2VjdXJpdHlDb250ZXh0KCksCisgICAgICAgICAgICAgICAgbmV3IFByb3BlcnRpZXNEZWxlZ2F0ZSgpIHsKKworICAgICAgICAgICAgICAgICAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPD4oKTsKKworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3BlcnRpZXMuZ2V0KG5hbWUpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0UHJvcGVydHlOYW1lcygpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0aWVzLmtleVNldCgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBuYW1lLCBPYmplY3Qgb2JqZWN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLnB1dChuYW1lLCBvYmplY3QpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5KFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLnJlbW92ZShuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgIC8vIHJlcXVlc3QgZW50aXR5IGhhbmRsaW5nLgorICAgICAgICBpZiAoKHJlcS5oZWFkZXJzKCkuY29udGFpbnMoSHR0cEhlYWRlck5hbWVzLkNPTlRFTlRfTEVOR1RIKSAmJiBIdHRwVXRpbC5nZXRDb250ZW50TGVuZ3RoKHJlcSkgPiAwKQorICAgICAgICAgICAgICAgIHx8IEh0dHBVdGlsLmlzVHJhbnNmZXJFbmNvZGluZ0NodW5rZWQocmVxKSkgeworCisgICAgICAgICAgICBjdHguY2hhbm5lbCgpLmNsb3NlRnV0dXJlKCkuYWRkTGlzdGVuZXIobmV3IEdlbmVyaWNGdXR1cmVMaXN0ZW5lcjxGdXR1cmU8PyBzdXBlciBWb2lkPj4oKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb3BlcmF0aW9uQ29tcGxldGUoRnV0dXJlPD8gc3VwZXIgVm9pZD4gZnV0dXJlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgaXNMaXN0LmFkZChOZXR0eUlucHV0U3RyZWFtLkVORF9PRl9JTlBVVF9FUlJPUik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LnNldEVudGl0eVN0cmVhbShuZXcgTmV0dHlJbnB1dFN0cmVhbShpc0xpc3QpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LnNldEVudGl0eVN0cmVhbShuZXcgSW5wdXRTdHJlYW0oKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gY29weWluZyBoZWFkZXJzIGZyb20gbmV0dHkgcmVxdWVzdCB0byBqZXJzZXkgY29udGFpbmVyIHJlcXVlc3QgY29udGV4dC4KKyAgICAgICAgZm9yIChTdHJpbmcgbmFtZSA6IHJlcS5oZWFkZXJzKCkubmFtZXMoKSkgeworICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuaGVhZGVycyhuYW1lLCByZXEuaGVhZGVycygpLmdldEFsbChuYW1lKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVxdWVzdENvbnRleHQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBTZWN1cml0eUNvbnRleHQgZ2V0U2VjdXJpdHlDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gbmV3IFNlY3VyaXR5Q29udGV4dCgpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1VzZXJJblJvbGUoZmluYWwgU3RyaW5nIHJvbGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTZWN1cmUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBQcmluY2lwYWwgZ2V0VXNlclByaW5jaXBhbCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEF1dGhlbnRpY2F0aW9uU2NoZW1lKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGV4Y2VwdGlvbkNhdWdodChDaGFubmVsSGFuZGxlckNvbnRleHQgY3R4LCBUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgICAgY3R4LmNsb3NlKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXJzL25ldHR5LWh0dHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9uZXR0eS9odHRwc2VydmVyL0plcnNleVNlcnZlckluaXRpYWxpemVyLmphdmEgYi9jb250YWluZXJzL25ldHR5LWh0dHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9uZXR0eS9odHRwc2VydmVyL0plcnNleVNlcnZlckluaXRpYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZhNmNlMAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lcnMvbmV0dHktaHR0cC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L25ldHR5L2h0dHBzZXJ2ZXIvSmVyc2V5U2VydmVySW5pdGlhbGl6ZXIuamF2YQpAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5uZXR0eS5odHRwc2VydmVyOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworCitpbXBvcnQgaW8ubmV0dHkuY2hhbm5lbC5DaGFubmVsSGFuZGxlckNvbnRleHQ7CitpbXBvcnQgaW8ubmV0dHkuY2hhbm5lbC5DaGFubmVsSW5pdGlhbGl6ZXI7CitpbXBvcnQgaW8ubmV0dHkuY2hhbm5lbC5DaGFubmVsUGlwZWxpbmU7CitpbXBvcnQgaW8ubmV0dHkuY2hhbm5lbC5TaW1wbGVDaGFubmVsSW5ib3VuZEhhbmRsZXI7CitpbXBvcnQgaW8ubmV0dHkuY2hhbm5lbC5zb2NrZXQuU29ja2V0Q2hhbm5lbDsKK2ltcG9ydCBpby5uZXR0eS5oYW5kbGVyLmNvZGVjLmh0dHAuSHR0cE1lc3NhZ2U7CitpbXBvcnQgaW8ubmV0dHkuaGFuZGxlci5jb2RlYy5odHRwLkh0dHBTZXJ2ZXJDb2RlYzsKK2ltcG9ydCBpby5uZXR0eS5oYW5kbGVyLmNvZGVjLmh0dHAuSHR0cFNlcnZlclVwZ3JhZGVIYW5kbGVyOworaW1wb3J0IGlvLm5ldHR5LmhhbmRsZXIuY29kZWMuaHR0cDIuSHR0cDJDb2RlYzsKK2ltcG9ydCBpby5uZXR0eS5oYW5kbGVyLmNvZGVjLmh0dHAyLkh0dHAyQ29kZWNVdGlsOworaW1wb3J0IGlvLm5ldHR5LmhhbmRsZXIuY29kZWMuaHR0cDIuSHR0cDJTZXJ2ZXJVcGdyYWRlQ29kZWM7CitpbXBvcnQgaW8ubmV0dHkuaGFuZGxlci5zc2wuU3NsQ29udGV4dDsKK2ltcG9ydCBpby5uZXR0eS5oYW5kbGVyLnN0cmVhbS5DaHVua2VkV3JpdGVIYW5kbGVyOworaW1wb3J0IGlvLm5ldHR5LnV0aWwuQXNjaWlTdHJpbmc7CisKKy8qKgorICogSmVyc2V5IHtAbGluayBDaGFubmVsSW5pdGlhbGl6ZXJ9LgorICogPHA+CisgKiBBZGRzIHtAbGluayBIdHRwU2VydmVyQ29kZWN9LCB7QGxpbmsgQ2h1bmtlZFdyaXRlSGFuZGxlcn0gYW5kIHtAbGluayBKZXJzZXlTZXJ2ZXJIYW5kbGVyfSB0byB0aGUgY2hhbm5lbHMgcGlwZWxpbmUuCisgKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworY2xhc3MgSmVyc2V5U2VydmVySW5pdGlhbGl6ZXIgZXh0ZW5kcyBDaGFubmVsSW5pdGlhbGl6ZXI8U29ja2V0Q2hhbm5lbD4geworCisgICAgcHJpdmF0ZSBmaW5hbCBVUkkgYmFzZVVyaTsKKyAgICBwcml2YXRlIGZpbmFsIFNzbENvbnRleHQgc3NsQ3R4OworICAgIHByaXZhdGUgZmluYWwgTmV0dHlIdHRwQ29udGFpbmVyIGNvbnRhaW5lcjsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaHR0cDI7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiYXNlVXJpICAgYmFzZSB7QGxpbmsgVVJJfSBvZiB0aGUgY29udGFpbmVyIChpbmNsdWRlcyBjb250ZXh0IHBhdGgsIGlmIGFueSkuCisgICAgICogQHBhcmFtIHNzbEN0eCAgICBTU0wgY29udGV4dC4KKyAgICAgKiBAcGFyYW0gY29udGFpbmVyIE5ldHR5IGNvbnRhaW5lciBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgSmVyc2V5U2VydmVySW5pdGlhbGl6ZXIoVVJJIGJhc2VVcmksIFNzbENvbnRleHQgc3NsQ3R4LCBOZXR0eUh0dHBDb250YWluZXIgY29udGFpbmVyKSB7CisgICAgICAgIHRoaXMoYmFzZVVyaSwgc3NsQ3R4LCBjb250YWluZXIsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiYXNlVXJpICAgYmFzZSB7QGxpbmsgVVJJfSBvZiB0aGUgY29udGFpbmVyIChpbmNsdWRlcyBjb250ZXh0IHBhdGgsIGlmIGFueSkuCisgICAgICogQHBhcmFtIHNzbEN0eCAgICBTU0wgY29udGV4dC4KKyAgICAgKiBAcGFyYW0gY29udGFpbmVyIE5ldHR5IGNvbnRhaW5lciBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiBAcGFyYW0gaHR0cDIgICAgIEh0dHAvMiBwcm90b2NvbCBzdXBwb3J0LgorICAgICAqLworICAgIHB1YmxpYyBKZXJzZXlTZXJ2ZXJJbml0aWFsaXplcihVUkkgYmFzZVVyaSwgU3NsQ29udGV4dCBzc2xDdHgsIE5ldHR5SHR0cENvbnRhaW5lciBjb250YWluZXIsIGJvb2xlYW4gaHR0cDIpIHsKKyAgICAgICAgdGhpcy5iYXNlVXJpID0gYmFzZVVyaTsKKyAgICAgICAgdGhpcy5zc2xDdHggPSBzc2xDdHg7CisgICAgICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyOworICAgICAgICB0aGlzLmh0dHAyID0gaHR0cDI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaW5pdENoYW5uZWwoU29ja2V0Q2hhbm5lbCBjaCkgeworICAgICAgICBpZiAoaHR0cDIpIHsKKworICAgICAgICAgICAgaWYgKHNzbEN0eCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29uZmlndXJlU3NsKGNoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29uZmlndXJlQ2xlYXJUZXh0KGNoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQ2hhbm5lbFBpcGVsaW5lIHAgPSBjaC5waXBlbGluZSgpOworICAgICAgICAgICAgaWYgKHNzbEN0eCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcC5hZGRMYXN0KHNzbEN0eC5uZXdIYW5kbGVyKGNoLmFsbG9jKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHAuYWRkTGFzdChuZXcgSHR0cFNlcnZlckNvZGVjKCkpOworICAgICAgICAgICAgcC5hZGRMYXN0KG5ldyBDaHVua2VkV3JpdGVIYW5kbGVyKCkpOworICAgICAgICAgICAgcC5hZGRMYXN0KG5ldyBKZXJzZXlTZXJ2ZXJIYW5kbGVyKGJhc2VVcmksIGNvbnRhaW5lcikpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uZmlndXJlIHRoZSBwaXBlbGluZSBmb3IgVExTIE5QTiBuZWdvdGlhdGlvbiB0byBIVFRQLzIuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZVNzbChTb2NrZXRDaGFubmVsIGNoKSB7CisgICAgICAgIGNoLnBpcGVsaW5lKCkuYWRkTGFzdChzc2xDdHgubmV3SGFuZGxlcihjaC5hbGxvYygpKSwgbmV3IEh0dHBWZXJzaW9uQ2hvb3NlcihiYXNlVXJpLCBjb250YWluZXIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmUgdGhlIHBpcGVsaW5lIGZvciBhIGNsZWFydGV4dCB1cGdyYWRlIGZyb20gSFRUUCB0byBIVFRQLzIuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZUNsZWFyVGV4dChTb2NrZXRDaGFubmVsIGNoKSB7CisgICAgICAgIGZpbmFsIENoYW5uZWxQaXBlbGluZSBwID0gY2gucGlwZWxpbmUoKTsKKyAgICAgICAgZmluYWwgSHR0cFNlcnZlckNvZGVjIHNvdXJjZUNvZGVjID0gbmV3IEh0dHBTZXJ2ZXJDb2RlYygpOworCisgICAgICAgIHAuYWRkTGFzdChzb3VyY2VDb2RlYyk7CisgICAgICAgIHAuYWRkTGFzdChuZXcgSHR0cFNlcnZlclVwZ3JhZGVIYW5kbGVyKHNvdXJjZUNvZGVjLCBuZXcgSHR0cFNlcnZlclVwZ3JhZGVIYW5kbGVyLlVwZ3JhZGVDb2RlY0ZhY3RvcnkoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBIdHRwU2VydmVyVXBncmFkZUhhbmRsZXIuVXBncmFkZUNvZGVjIG5ld1VwZ3JhZGVDb2RlYyhDaGFyU2VxdWVuY2UgcHJvdG9jb2wpIHsKKyAgICAgICAgICAgICAgICBpZiAoQXNjaWlTdHJpbmcuY29udGVudEVxdWFscyhIdHRwMkNvZGVjVXRpbC5IVFRQX1VQR1JBREVfUFJPVE9DT0xfTkFNRSwgcHJvdG9jb2wpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSHR0cDJTZXJ2ZXJVcGdyYWRlQ29kZWMobmV3IEh0dHAyQ29kZWModHJ1ZSwgbmV3IEplcnNleUh0dHAyU2VydmVySGFuZGxlcihiYXNlVXJpLCBjb250YWluZXIpKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KSk7CisgICAgICAgIHAuYWRkTGFzdChuZXcgU2ltcGxlQ2hhbm5lbEluYm91bmRIYW5kbGVyPEh0dHBNZXNzYWdlPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgY2hhbm5lbFJlYWQwKENoYW5uZWxIYW5kbGVyQ29udGV4dCBjdHgsIEh0dHBNZXNzYWdlIG1zZykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBoYW5kbGVyIGlzIGhpdCB0aGVuIG5vIHVwZ3JhZGUgaGFzIGJlZW4gYXR0ZW1wdGVkIGFuZCB0aGUgY2xpZW50IGlzIGp1c3QgdGFsa2luZyBIVFRQLgorICAgICAgICAgICAgICAgIC8vICJEaXJlY3RseSB0YWxraW5nOiAiICsgbXNnLnByb3RvY29sVmVyc2lvbigpICsgIiAobm8gdXBncmFkZSB3YXMgYXR0ZW1wdGVkKSIpOworCisgICAgICAgICAgICAgICAgQ2hhbm5lbFBpcGVsaW5lIHBpcGVsaW5lID0gY3R4LnBpcGVsaW5lKCk7CisgICAgICAgICAgICAgICAgQ2hhbm5lbEhhbmRsZXJDb250ZXh0IHRoaXNDdHggPSBwaXBlbGluZS5jb250ZXh0KHRoaXMpOworICAgICAgICAgICAgICAgIHBpcGVsaW5lLmFkZEFmdGVyKHRoaXNDdHgubmFtZSgpLCBudWxsLCBuZXcgSmVyc2V5U2VydmVySGFuZGxlcihiYXNlVXJpLCBjb250YWluZXIpKTsKKyAgICAgICAgICAgICAgICBwaXBlbGluZS5yZXBsYWNlKHRoaXMsIG51bGwsIG5ldyBDaHVua2VkV3JpdGVIYW5kbGVyKCkpOworICAgICAgICAgICAgICAgIGN0eC5maXJlQ2hhbm5lbFJlYWQobXNnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVycy9uZXR0eS1odHRwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbmV0dHkvaHR0cHNlcnZlci9OZXR0eUh0dHAyUmVzcG9uc2VXcml0ZXIuamF2YSBiL2NvbnRhaW5lcnMvbmV0dHktaHR0cC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L25ldHR5L2h0dHBzZXJ2ZXIvTmV0dHlIdHRwMlJlc3BvbnNlV3JpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI3ZDg5NAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lcnMvbmV0dHktaHR0cC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L25ldHR5L2h0dHBzZXJ2ZXIvTmV0dHlIdHRwMlJlc3BvbnNlV3JpdGVyLmphdmEKQEAgLTAsMCArMSwxNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubmV0dHkuaHR0cHNlcnZlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRGdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbnRhaW5lclJlc3BvbnNlV3JpdGVyOworCitpbXBvcnQgaW8ubmV0dHkuYnVmZmVyLkJ5dGVCdWY7CitpbXBvcnQgaW8ubmV0dHkuY2hhbm5lbC5DaGFubmVsRnV0dXJlTGlzdGVuZXI7CitpbXBvcnQgaW8ubmV0dHkuY2hhbm5lbC5DaGFubmVsSGFuZGxlckNvbnRleHQ7CitpbXBvcnQgaW8ubmV0dHkuaGFuZGxlci5jb2RlYy5odHRwLkRlZmF1bHRGdWxsSHR0cFJlc3BvbnNlOworaW1wb3J0IGlvLm5ldHR5LmhhbmRsZXIuY29kZWMuaHR0cC5IdHRwSGVhZGVyTmFtZXM7CitpbXBvcnQgaW8ubmV0dHkuaGFuZGxlci5jb2RlYy5odHRwLkh0dHBNZXRob2Q7CitpbXBvcnQgaW8ubmV0dHkuaGFuZGxlci5jb2RlYy5odHRwLkh0dHBSZXNwb25zZVN0YXR1czsKK2ltcG9ydCBpby5uZXR0eS5oYW5kbGVyLmNvZGVjLmh0dHAyLkRlZmF1bHRIdHRwMkRhdGFGcmFtZTsKK2ltcG9ydCBpby5uZXR0eS5oYW5kbGVyLmNvZGVjLmh0dHAyLkRlZmF1bHRIdHRwMkhlYWRlcnM7CitpbXBvcnQgaW8ubmV0dHkuaGFuZGxlci5jb2RlYy5odHRwMi5EZWZhdWx0SHR0cDJIZWFkZXJzRnJhbWU7CitpbXBvcnQgaW8ubmV0dHkuaGFuZGxlci5jb2RlYy5odHRwMi5IdHRwMkhlYWRlcnNGcmFtZTsKKworLyoqCisgKiBOZXR0eSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgQ29udGFpbmVyUmVzcG9uc2VXcml0ZXJ9LgorICoKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK2NsYXNzIE5ldHR5SHR0cDJSZXNwb25zZVdyaXRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlc3BvbnNlV3JpdGVyIHsKKworICAgIHByaXZhdGUgZmluYWwgQ2hhbm5lbEhhbmRsZXJDb250ZXh0IGN0eDsKKyAgICBwcml2YXRlIGZpbmFsIEh0dHAySGVhZGVyc0ZyYW1lIGhlYWRlcnNGcmFtZTsKKyAgICBwcml2YXRlIGZpbmFsIE5ldHR5SHR0cENvbnRhaW5lciBjb250YWluZXI7CisKKyAgICBwcml2YXRlIHZvbGF0aWxlIFNjaGVkdWxlZEZ1dHVyZTw/PiBzdXNwZW5kVGltZW91dEZ1dHVyZTsKKyAgICBwcml2YXRlIHZvbGF0aWxlIFJ1bm5hYmxlIHN1c3BlbmRUaW1lb3V0SGFuZGxlcjsKKworICAgIE5ldHR5SHR0cDJSZXNwb25zZVdyaXRlcihDaGFubmVsSGFuZGxlckNvbnRleHQgY3R4LCBIdHRwMkhlYWRlcnNGcmFtZSBoZWFkZXJzRnJhbWUsIE5ldHR5SHR0cENvbnRhaW5lciBjb250YWluZXIpIHsKKyAgICAgICAgdGhpcy5jdHggPSBjdHg7CisgICAgICAgIHRoaXMuaGVhZGVyc0ZyYW1lID0gaGVhZGVyc0ZyYW1lOworICAgICAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIHdyaXRlUmVzcG9uc2VTdGF0dXNBbmRIZWFkZXJzKGxvbmcgY29udGVudExlbmd0aCwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2VDb250ZXh0KQorICAgICAgICAgICAgdGhyb3dzIENvbnRhaW5lckV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIHJlYXNvblBocmFzZSA9IHJlc3BvbnNlQ29udGV4dC5nZXRTdGF0dXNJbmZvKCkuZ2V0UmVhc29uUGhyYXNlKCk7CisgICAgICAgIGludCBzdGF0dXNDb2RlID0gcmVzcG9uc2VDb250ZXh0LmdldFN0YXR1cygpOworCisgICAgICAgIEh0dHBSZXNwb25zZVN0YXR1cyBzdGF0dXMgPSByZWFzb25QaHJhc2UgPT0gbnVsbAorICAgICAgICAgICAgICAgID8gSHR0cFJlc3BvbnNlU3RhdHVzLnZhbHVlT2Yoc3RhdHVzQ29kZSkKKyAgICAgICAgICAgICAgICA6IG5ldyBIdHRwUmVzcG9uc2VTdGF0dXMoc3RhdHVzQ29kZSwgcmVhc29uUGhyYXNlKTsKKworICAgICAgICBEZWZhdWx0SHR0cDJIZWFkZXJzIHJlc3BvbnNlID0gbmV3IERlZmF1bHRIdHRwMkhlYWRlcnMoKTsKKyAgICAgICAgcmVzcG9uc2Uuc3RhdHVzKEludGVnZXIudG9TdHJpbmcocmVzcG9uc2VDb250ZXh0LmdldFN0YXR1cygpKSk7CisKKyAgICAgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGUgOiByZXNwb25zZUNvbnRleHQuZ2V0U3RyaW5nSGVhZGVycygpLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlLmFkZChlLmdldEtleSgpLnRvTG93ZXJDYXNlKCksIGUuZ2V0VmFsdWUoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXNwb25zZS5zZXQoSHR0cEhlYWRlck5hbWVzLkNPTlRFTlRfTEVOR1RILCBMb25nLnRvU3RyaW5nKGNvbnRlbnRMZW5ndGgpKTsKKworICAgICAgICBjdHgud3JpdGVBbmRGbHVzaChuZXcgRGVmYXVsdEh0dHAySGVhZGVyc0ZyYW1lKHJlc3BvbnNlKSk7CisKKyAgICAgICAgaWYgKCFoZWFkZXJzRnJhbWUuaGVhZGVycygpLm1ldGhvZCgpLmVxdWFscyhIdHRwTWV0aG9kLkhFQUQuYXNjaWlOYW1lKCkpCisgICAgICAgICAgICAmJiAoY29udGVudExlbmd0aCA+IDAgfHwgY29udGVudExlbmd0aCA9PSAtMSkpIHsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyBPdXRwdXRTdHJlYW0oKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlKG5ldyBieXRlW117KGJ5dGUpIGJ9KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGUoYiwgMCwgYi5sZW5ndGgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgICAgICAgICAgICAgIEJ5dGVCdWYgYnVmZmVyID0gY3R4LmFsbG9jKCkuYnVmZmVyKGxlbik7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci53cml0ZUJ5dGVzKGIsIG9mZiwgbGVuKTsKKworICAgICAgICAgICAgICAgICAgICBjdHgud3JpdGVBbmRGbHVzaChuZXcgRGVmYXVsdEh0dHAyRGF0YUZyYW1lKGJ1ZmZlciwgZmFsc2UpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIGN0eC5mbHVzaCgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgY3R4LndyaXRlKG5ldyBEZWZhdWx0SHR0cDJEYXRhRnJhbWUodHJ1ZSkpLmFkZExpc3RlbmVyKE5ldHR5UmVzcG9uc2VXcml0ZXIuRkxVU0hfRlVUVVJFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjdHgud3JpdGVBbmRGbHVzaChuZXcgRGVmYXVsdEh0dHAyRGF0YUZyYW1lKHRydWUpKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gc3VzcGVuZChsb25nIHRpbWVPdXQsIFRpbWVVbml0IHRpbWVVbml0LCBmaW5hbCBDb250YWluZXJSZXNwb25zZVdyaXRlci5UaW1lb3V0SGFuZGxlcgorICAgICAgICAgICAgdGltZW91dEhhbmRsZXIpIHsKKworICAgICAgICBzdXNwZW5kVGltZW91dEhhbmRsZXIgPSBuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICB0aW1lb3V0SGFuZGxlci5vblRpbWVvdXQoTmV0dHlIdHRwMlJlc3BvbnNlV3JpdGVyLnRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIGlmICh0aW1lT3V0IDw9IDApIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgc3VzcGVuZFRpbWVvdXRGdXR1cmUgPQorICAgICAgICAgICAgICAgIGNvbnRhaW5lci5nZXRTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UoKS5zY2hlZHVsZShzdXNwZW5kVGltZW91dEhhbmRsZXIsIHRpbWVPdXQsIHRpbWVVbml0KTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRTdXNwZW5kVGltZW91dChsb25nIHRpbWVPdXQsIFRpbWVVbml0IHRpbWVVbml0KSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBzdXNwZW5kKDAsIC4uLCAuLikgd2FzIGNhbGxlZCwgc28gc3VzcGVuZFRpbWVvdXRGdXR1cmUgaXMgbnVsbC4KKyAgICAgICAgaWYgKHN1c3BlbmRUaW1lb3V0RnV0dXJlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN1c3BlbmRUaW1lb3V0RnV0dXJlLmNhbmNlbCh0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0aW1lT3V0IDw9IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHN1c3BlbmRUaW1lb3V0RnV0dXJlID0KKyAgICAgICAgICAgICAgICBjb250YWluZXIuZ2V0U2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlKCkuc2NoZWR1bGUoc3VzcGVuZFRpbWVvdXRIYW5kbGVyLCB0aW1lT3V0LCB0aW1lVW5pdCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY29tbWl0KCkgeworICAgICAgICBjdHguZmx1c2goKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmYWlsdXJlKFRocm93YWJsZSBlcnJvcikgeworICAgICAgICBjdHgud3JpdGVBbmRGbHVzaChuZXcgRGVmYXVsdEh0dHAySGVhZGVycygpLnN0YXR1cyhIdHRwUmVzcG9uc2VTdGF0dXMuSU5URVJOQUxfU0VSVkVSX0VSUk9SLmNvZGVBc1RleHQoKSkpCisgICAgICAgICAgIC5hZGRMaXN0ZW5lcihDaGFubmVsRnV0dXJlTGlzdGVuZXIuQ0xPU0UpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZVJlc3BvbnNlQnVmZmVyaW5nKCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXJzL25ldHR5LWh0dHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9uZXR0eS9odHRwc2VydmVyL05ldHR5SHR0cENvbnRhaW5lci5qYXZhIGIvY29udGFpbmVycy9uZXR0eS1odHRwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbmV0dHkvaHR0cHNlcnZlci9OZXR0eUh0dHBDb250YWluZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODI1YTgyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVycy9uZXR0eS1odHRwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbmV0dHkvaHR0cHNlcnZlci9OZXR0eUh0dHBDb250YWluZXIuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm5ldHR5Lmh0dHBzZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29udGFpbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5FeGVjdXRvclNlcnZpY2VQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXI7CisKKy8qKgorICogTmV0dHkgYmFzZWQgaW1wbGVtZW50YXRpb24gb2YgYSB7QGxpbmsgQ29udGFpbmVyfS4KKyAqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitjbGFzcyBOZXR0eUh0dHBDb250YWluZXIgaW1wbGVtZW50cyBDb250YWluZXIgeworCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwSGFuZGxlcjsKKworICAgIHB1YmxpYyBOZXR0eUh0dHBDb250YWluZXIoQXBwbGljYXRpb24gYXBwbGljYXRpb24pIHsKKyAgICAgICAgdGhpcy5hcHBIYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihhcHBsaWNhdGlvbik7CisgICAgICAgIHRoaXMuYXBwSGFuZGxlci5vblN0YXJ0dXAodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc291cmNlQ29uZmlnIGdldENvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBhcHBIYW5kbGVyLmdldENvbmZpZ3VyYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQXBwbGljYXRpb25IYW5kbGVyIGdldEFwcGxpY2F0aW9uSGFuZGxlcigpIHsKKyAgICAgICAgcmV0dXJuIGFwcEhhbmRsZXI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVsb2FkKCkgeworICAgICAgICByZWxvYWQoYXBwSGFuZGxlci5nZXRDb25maWd1cmF0aW9uKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlbG9hZChSZXNvdXJjZUNvbmZpZyBjb25maWd1cmF0aW9uKSB7CisgICAgICAgIGFwcEhhbmRsZXIub25TaHV0ZG93bih0aGlzKTsKKworICAgICAgICBhcHBIYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihjb25maWd1cmF0aW9uKTsKKyAgICAgICAgYXBwSGFuZGxlci5vblJlbG9hZCh0aGlzKTsKKyAgICAgICAgYXBwSGFuZGxlci5vblN0YXJ0dXAodGhpcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHtAbGluayBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2V9LgorICAgICAqCisgICAgICogQHJldHVybiBFeGVjdXRvciBzZXJ2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbnRhaW5lci4KKyAgICAgKi8KKyAgICBFeGVjdXRvclNlcnZpY2UgZ2V0RXhlY3V0b3JTZXJ2aWNlKCkgeworICAgICAgICByZXR1cm4gYXBwSGFuZGxlci5nZXRJbmplY3Rpb25NYW5hZ2VyKCkuZ2V0SW5zdGFuY2UoRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXIuY2xhc3MpLmdldEV4ZWN1dG9yU2VydmljZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB7QGxpbmsgU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gU2NoZWR1bGVkIGV4ZWN1dG9yIHNlcnZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29udGFpbmVyLgorICAgICAqLworICAgIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSBnZXRTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UoKSB7CisgICAgICAgIHJldHVybiBhcHBIYW5kbGVyLmdldEluamVjdGlvbk1hbmFnZXIoKS5nZXRJbnN0YW5jZShTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2VQcm92aWRlci5jbGFzcykuZ2V0RXhlY3V0b3JTZXJ2aWNlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVycy9uZXR0eS1odHRwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbmV0dHkvaHR0cHNlcnZlci9OZXR0eUh0dHBDb250YWluZXJQcm92aWRlci5qYXZhIGIvY29udGFpbmVycy9uZXR0eS1odHRwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbmV0dHkvaHR0cHNlcnZlci9OZXR0eUh0dHBDb250YWluZXJQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNGIzNmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXJzL25ldHR5LWh0dHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9uZXR0eS9odHRwc2VydmVyL05ldHR5SHR0cENvbnRhaW5lclByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubmV0dHkuaHR0cHNlcnZlcjsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKKworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IGlvLm5ldHR5LmJvb3RzdHJhcC5TZXJ2ZXJCb290c3RyYXA7CitpbXBvcnQgaW8ubmV0dHkuY2hhbm5lbC5DaGFubmVsOworaW1wb3J0IGlvLm5ldHR5LmNoYW5uZWwuQ2hhbm5lbE9wdGlvbjsKK2ltcG9ydCBpby5uZXR0eS5jaGFubmVsLkV2ZW50TG9vcEdyb3VwOworaW1wb3J0IGlvLm5ldHR5LmNoYW5uZWwubmlvLk5pb0V2ZW50TG9vcEdyb3VwOworaW1wb3J0IGlvLm5ldHR5LmNoYW5uZWwuc29ja2V0Lm5pby5OaW9TZXJ2ZXJTb2NrZXRDaGFubmVsOworaW1wb3J0IGlvLm5ldHR5LmhhbmRsZXIuc3NsLlNzbENvbnRleHQ7CitpbXBvcnQgaW8ubmV0dHkudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKK2ltcG9ydCBpby5uZXR0eS51dGlsLmNvbmN1cnJlbnQuR2VuZXJpY0Z1dHVyZUxpc3RlbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LkJldGE7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29udGFpbmVyUHJvdmlkZXI7CisKKy8qKgorICogTmV0dHkgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIENvbnRhaW5lclByb3ZpZGVyfS4KKyAqIDxwPgorICogVGhlcmUgaXMgYWxzbyBhIGZldyAiZmFjdG9yeSIgbWV0aG9kcyBmb3IgY3JlYXRpbmcgTmV0dHkgc2VydmVyLgorICoKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKiBAc2luY2UgMi4yNAorICovCitAQmV0YQorcHVibGljIGNsYXNzIE5ldHR5SHR0cENvbnRhaW5lclByb3ZpZGVyIGltcGxlbWVudHMgQ29udGFpbmVyUHJvdmlkZXIgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxUPiBUIGNyZWF0ZUNvbnRhaW5lcihDbGFzczxUPiB0eXBlLCBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbikgdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24geworICAgICAgICBpZiAoTmV0dHlIdHRwQ29udGFpbmVyLmNsYXNzID09IHR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlLmNhc3QobmV3IE5ldHR5SHR0cENvbnRhaW5lcihhcHBsaWNhdGlvbikpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuZCBzdGFydCBOZXR0eSBzZXJ2ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmFzZVVyaSAgICAgICBiYXNlIHVyaS4KKyAgICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbiBKZXJzZXkgY29uZmlndXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gc3NsQ29udGV4dCAgICBOZXR0eSBTU0wgY29udGV4dCAoY2FuIGJlIG51bGwpLgorICAgICAqIEBwYXJhbSBibG9jayAgICAgICAgIHdoZW4ge0Bjb2RlIHRydWV9LCB0aGlzIG1ldGhvZCB3aWxsIGJsb2NrIHVudGlsIHRoZSBzZXJ2ZXIgaXMgc3RvcHBlZC4gV2hlbiB7QGNvZGUgZmFsc2V9LCB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb24gd2lsbAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGVuZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgc2VydmVyIGlzIHN0YXJ0ZWQuCisgICAgICogQHJldHVybiBOZXR0eSBjaGFubmVsIGluc3RhbmNlLgorICAgICAqIEB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiB3aGVuIHRoZXJlIGlzIGFuIGlzc3VlIHdpdGggY3JlYXRpbmcgbmV3IGNvbnRhaW5lci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENoYW5uZWwgY3JlYXRlU2VydmVyKGZpbmFsIFVSSSBiYXNlVXJpLCBmaW5hbCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmF0aW9uLCBTc2xDb250ZXh0IHNzbENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGJsb2NrKQorICAgICAgICAgICAgdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24geworCisgICAgICAgIC8vIENvbmZpZ3VyZSB0aGUgc2VydmVyLgorICAgICAgICBmaW5hbCBFdmVudExvb3BHcm91cCBib3NzR3JvdXAgPSBuZXcgTmlvRXZlbnRMb29wR3JvdXAoMSk7CisgICAgICAgIGZpbmFsIEV2ZW50TG9vcEdyb3VwIHdvcmtlckdyb3VwID0gbmV3IE5pb0V2ZW50TG9vcEdyb3VwKCk7CisgICAgICAgIGZpbmFsIE5ldHR5SHR0cENvbnRhaW5lciBjb250YWluZXIgPSBuZXcgTmV0dHlIdHRwQ29udGFpbmVyKGNvbmZpZ3VyYXRpb24pOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTZXJ2ZXJCb290c3RyYXAgYiA9IG5ldyBTZXJ2ZXJCb290c3RyYXAoKTsKKyAgICAgICAgICAgIGIub3B0aW9uKENoYW5uZWxPcHRpb24uU09fQkFDS0xPRywgMTAyNCk7CisgICAgICAgICAgICBiLmdyb3VwKGJvc3NHcm91cCwgd29ya2VyR3JvdXApCisgICAgICAgICAgICAgLmNoYW5uZWwoTmlvU2VydmVyU29ja2V0Q2hhbm5lbC5jbGFzcykKKyAgICAgICAgICAgICAuY2hpbGRIYW5kbGVyKG5ldyBKZXJzZXlTZXJ2ZXJJbml0aWFsaXplcihiYXNlVXJpLCBzc2xDb250ZXh0LCBjb250YWluZXIpKTsKKworICAgICAgICAgICAgaW50IHBvcnQgPSBnZXRQb3J0KGJhc2VVcmkpOworCisgICAgICAgICAgICBDaGFubmVsIGNoID0gYi5iaW5kKHBvcnQpLnN5bmMoKS5jaGFubmVsKCk7CisKKyAgICAgICAgICAgIGNoLmNsb3NlRnV0dXJlKCkuYWRkTGlzdGVuZXIobmV3IEdlbmVyaWNGdXR1cmVMaXN0ZW5lcjxGdXR1cmU8PyBzdXBlciBWb2lkPj4oKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb3BlcmF0aW9uQ29tcGxldGUoRnV0dXJlPD8gc3VwZXIgVm9pZD4gZnV0dXJlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLmdldEFwcGxpY2F0aW9uSGFuZGxlcigpLm9uU2h1dGRvd24oY29udGFpbmVyKTsKKworICAgICAgICAgICAgICAgICAgICBib3NzR3JvdXAuc2h1dGRvd25HcmFjZWZ1bGx5KCk7CisgICAgICAgICAgICAgICAgICAgIHdvcmtlckdyb3VwLnNodXRkb3duR3JhY2VmdWxseSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBpZiAoYmxvY2spIHsKKyAgICAgICAgICAgICAgICBjaC5jbG9zZUZ1dHVyZSgpLnN5bmMoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2g7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBjaDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW5kIHN0YXJ0IE5ldHR5IHNlcnZlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiYXNlVXJpICAgICAgIGJhc2UgdXJpLgorICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uIEplcnNleSBjb25maWd1cmF0aW9uLgorICAgICAqIEBwYXJhbSBibG9jayAgICAgICAgIHdoZW4ge0Bjb2RlIHRydWV9LCB0aGlzIG1ldGhvZCB3aWxsIGJsb2NrIHVudGlsIHRoZSBzZXJ2ZXIgaXMgc3RvcHBlZC4gV2hlbiB7QGNvZGUgZmFsc2V9LCB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBleGVjdXRpb24gd2lsbAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGVuZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgc2VydmVyIGlzIHN0YXJ0ZWQuCisgICAgICogQHJldHVybiBOZXR0eSBjaGFubmVsIGluc3RhbmNlLgorICAgICAqIEB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiB3aGVuIHRoZXJlIGlzIGFuIGlzc3VlIHdpdGggY3JlYXRpbmcgbmV3IGNvbnRhaW5lci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENoYW5uZWwgY3JlYXRlU2VydmVyKGZpbmFsIFVSSSBiYXNlVXJpLCBmaW5hbCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmF0aW9uLCBmaW5hbCBib29sZWFuIGJsb2NrKQorICAgICAgICAgICAgdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24geworCisgICAgICAgIHJldHVybiBjcmVhdGVTZXJ2ZXIoYmFzZVVyaSwgY29uZmlndXJhdGlvbiwgbnVsbCwgYmxvY2spOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbmQgc3RhcnQgTmV0dHkgSFRUUC8yIHNlcnZlci4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgc2VydmVyIGlzIGNhcGFibGUgb2YgY29ubmVjdGlvbiB1cGdyYWRlIHRvIEhUVFAvMi4gSFRUUC8xLnggcmVxdWVzdCB3aWxsIGJlIHNlcnZlciBhcyB0aGV5IHdlcmUgdXNlZCB0by4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlIHRoYXQgdGhpcyBpbXBsZW1lbnRhdGlvbiBjYW5ub3QgYmUgbW9yZSBleHBlcmltZW50YWwuIEFueSBjb250cmlidXRpb25zIC8gZmVlZGJhY2sgaXMgd2VsY29tZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmFzZVVyaSAgICAgICBiYXNlIHVyaS4KKyAgICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbiBKZXJzZXkgY29uZmlndXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gc3NsQ29udGV4dCAgICBOZXR0eSB7QGxpbmsgU3NsQ29udGV4dH0uCisgICAgICogQHJldHVybiBOZXR0eSBjaGFubmVsIGluc3RhbmNlLgorICAgICAqIEB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiB3aGVuIHRoZXJlIGlzIGFuIGlzc3VlIHdpdGggY3JlYXRpbmcgbmV3IGNvbnRhaW5lci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENoYW5uZWwgY3JlYXRlSHR0cDJTZXJ2ZXIoZmluYWwgVVJJIGJhc2VVcmksIGZpbmFsIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyYXRpb24sIFNzbENvbnRleHQgc3NsQ29udGV4dCkgdGhyb3dzCisgICAgICAgICAgICBQcm9jZXNzaW5nRXhjZXB0aW9uIHsKKworICAgICAgICBmaW5hbCBFdmVudExvb3BHcm91cCBib3NzR3JvdXAgPSBuZXcgTmlvRXZlbnRMb29wR3JvdXAoMSk7CisgICAgICAgIGZpbmFsIEV2ZW50TG9vcEdyb3VwIHdvcmtlckdyb3VwID0gbmV3IE5pb0V2ZW50TG9vcEdyb3VwKCk7CisgICAgICAgIGZpbmFsIE5ldHR5SHR0cENvbnRhaW5lciBjb250YWluZXIgPSBuZXcgTmV0dHlIdHRwQ29udGFpbmVyKGNvbmZpZ3VyYXRpb24pOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTZXJ2ZXJCb290c3RyYXAgYiA9IG5ldyBTZXJ2ZXJCb290c3RyYXAoKTsKKyAgICAgICAgICAgIGIub3B0aW9uKENoYW5uZWxPcHRpb24uU09fQkFDS0xPRywgMTAyNCk7CisgICAgICAgICAgICBiLmdyb3VwKGJvc3NHcm91cCwgd29ya2VyR3JvdXApCisgICAgICAgICAgICAgLmNoYW5uZWwoTmlvU2VydmVyU29ja2V0Q2hhbm5lbC5jbGFzcykKKyAgICAgICAgICAgICAuY2hpbGRIYW5kbGVyKG5ldyBKZXJzZXlTZXJ2ZXJJbml0aWFsaXplcihiYXNlVXJpLCBzc2xDb250ZXh0LCBjb250YWluZXIsIHRydWUpKTsKKworICAgICAgICAgICAgaW50IHBvcnQgPSBnZXRQb3J0KGJhc2VVcmkpOworCisgICAgICAgICAgICBDaGFubmVsIGNoID0gYi5iaW5kKHBvcnQpLnN5bmMoKS5jaGFubmVsKCk7CisKKyAgICAgICAgICAgIGNoLmNsb3NlRnV0dXJlKCkuYWRkTGlzdGVuZXIobmV3IEdlbmVyaWNGdXR1cmVMaXN0ZW5lcjxGdXR1cmU8PyBzdXBlciBWb2lkPj4oKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb3BlcmF0aW9uQ29tcGxldGUoRnV0dXJlPD8gc3VwZXIgVm9pZD4gZnV0dXJlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLmdldEFwcGxpY2F0aW9uSGFuZGxlcigpLm9uU2h1dGRvd24oY29udGFpbmVyKTsKKworICAgICAgICAgICAgICAgICAgICBib3NzR3JvdXAuc2h1dGRvd25HcmFjZWZ1bGx5KCk7CisgICAgICAgICAgICAgICAgICAgIHdvcmtlckdyb3VwLnNodXRkb3duR3JhY2VmdWxseSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICByZXR1cm4gY2g7CisKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0UG9ydChVUkkgdXJpKSB7CisgICAgICAgIGlmICh1cmkuZ2V0UG9ydCgpID09IC0xKSB7CisgICAgICAgICAgICBpZiAoImh0dHAiLmVxdWFsc0lnbm9yZUNhc2UodXJpLmdldFNjaGVtZSgpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiA4MDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoImh0dHBzIi5lcXVhbHNJZ25vcmVDYXNlKHVyaS5nZXRTY2hlbWUoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gNDQzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVUkkgc2NoZW1lIG11c3QgYmUgJ2h0dHAnIG9yICdodHRwcycuIik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdXJpLmdldFBvcnQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXJzL25ldHR5LWh0dHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9uZXR0eS9odHRwc2VydmVyL05ldHR5UmVzcG9uc2VXcml0ZXIuamF2YSBiL2NvbnRhaW5lcnMvbmV0dHktaHR0cC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L25ldHR5L2h0dHBzZXJ2ZXIvTmV0dHlSZXNwb25zZVdyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MGQ4NzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXJzL25ldHR5LWh0dHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9uZXR0eS9odHRwc2VydmVyL05ldHR5UmVzcG9uc2VXcml0ZXIuamF2YQpAQCAtMCwwICsxLDE4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5uZXR0eS5odHRwc2VydmVyOworCitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRGdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubmV0dHkuY29ubmVjdG9yLmludGVybmFsLkplcnNleUNodW5rZWRJbnB1dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbnRhaW5lclJlc3BvbnNlV3JpdGVyOworCitpbXBvcnQgaW8ubmV0dHkuY2hhbm5lbC5DaGFubmVsRnV0dXJlOworaW1wb3J0IGlvLm5ldHR5LmNoYW5uZWwuQ2hhbm5lbEZ1dHVyZUxpc3RlbmVyOworaW1wb3J0IGlvLm5ldHR5LmNoYW5uZWwuQ2hhbm5lbEhhbmRsZXJDb250ZXh0OworaW1wb3J0IGlvLm5ldHR5LmhhbmRsZXIuY29kZWMuaHR0cC5EZWZhdWx0RnVsbEh0dHBSZXNwb25zZTsKK2ltcG9ydCBpby5uZXR0eS5oYW5kbGVyLmNvZGVjLmh0dHAuRGVmYXVsdEh0dHBSZXNwb25zZTsKK2ltcG9ydCBpby5uZXR0eS5oYW5kbGVyLmNvZGVjLmh0dHAuSHR0cENodW5rZWRJbnB1dDsKK2ltcG9ydCBpby5uZXR0eS5oYW5kbGVyLmNvZGVjLmh0dHAuSHR0cEhlYWRlck5hbWVzOworaW1wb3J0IGlvLm5ldHR5LmhhbmRsZXIuY29kZWMuaHR0cC5IdHRwSGVhZGVyVmFsdWVzOworaW1wb3J0IGlvLm5ldHR5LmhhbmRsZXIuY29kZWMuaHR0cC5IdHRwTWV0aG9kOworaW1wb3J0IGlvLm5ldHR5LmhhbmRsZXIuY29kZWMuaHR0cC5IdHRwUmVxdWVzdDsKK2ltcG9ydCBpby5uZXR0eS5oYW5kbGVyLmNvZGVjLmh0dHAuSHR0cFJlc3BvbnNlU3RhdHVzOworaW1wb3J0IGlvLm5ldHR5LmhhbmRsZXIuY29kZWMuaHR0cC5IdHRwVXRpbDsKK2ltcG9ydCBpby5uZXR0eS5oYW5kbGVyLmNvZGVjLmh0dHAuTGFzdEh0dHBDb250ZW50OworCisvKioKKyAqIE5ldHR5IGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBDb250YWluZXJSZXNwb25zZVdyaXRlcn0uCisgKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworY2xhc3MgTmV0dHlSZXNwb25zZVdyaXRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlc3BvbnNlV3JpdGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKE5ldHR5UmVzcG9uc2VXcml0ZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIHN0YXRpYyBmaW5hbCBDaGFubmVsRnV0dXJlTGlzdGVuZXIgRkxVU0hfRlVUVVJFID0gbmV3IENoYW5uZWxGdXR1cmVMaXN0ZW5lcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9wZXJhdGlvbkNvbXBsZXRlKENoYW5uZWxGdXR1cmUgZnV0dXJlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZ1dHVyZS5jaGFubmVsKCkuZmx1c2goKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIGZpbmFsIENoYW5uZWxIYW5kbGVyQ29udGV4dCBjdHg7CisgICAgcHJpdmF0ZSBmaW5hbCBIdHRwUmVxdWVzdCByZXE7CisgICAgcHJpdmF0ZSBmaW5hbCBOZXR0eUh0dHBDb250YWluZXIgY29udGFpbmVyOworCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBTY2hlZHVsZWRGdXR1cmU8Pz4gc3VzcGVuZFRpbWVvdXRGdXR1cmU7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBSdW5uYWJsZSBzdXNwZW5kVGltZW91dEhhbmRsZXI7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gcmVzcG9uc2VXcml0dGVuID0gZmFsc2U7CisKKyAgICBOZXR0eVJlc3BvbnNlV3JpdGVyKENoYW5uZWxIYW5kbGVyQ29udGV4dCBjdHgsIEh0dHBSZXF1ZXN0IHJlcSwgTmV0dHlIdHRwQ29udGFpbmVyIGNvbnRhaW5lcikgeworICAgICAgICB0aGlzLmN0eCA9IGN0eDsKKyAgICAgICAgdGhpcy5yZXEgPSByZXE7CisgICAgICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgT3V0cHV0U3RyZWFtIHdyaXRlUmVzcG9uc2VTdGF0dXNBbmRIZWFkZXJzKGxvbmcgY29udGVudExlbmd0aCwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2VDb250ZXh0KQorICAgICAgICAgICAgdGhyb3dzIENvbnRhaW5lckV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKHJlc3BvbnNlV3JpdHRlbikgeworICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5GSU5FLCAiUmVzcG9uc2UgYWxyZWFkeSB3cml0dGVuLiIpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICByZXNwb25zZVdyaXR0ZW4gPSB0cnVlOworCisgICAgICAgIFN0cmluZyByZWFzb25QaHJhc2UgPSByZXNwb25zZUNvbnRleHQuZ2V0U3RhdHVzSW5mbygpLmdldFJlYXNvblBocmFzZSgpOworICAgICAgICBpbnQgc3RhdHVzQ29kZSA9IHJlc3BvbnNlQ29udGV4dC5nZXRTdGF0dXMoKTsKKworICAgICAgICBIdHRwUmVzcG9uc2VTdGF0dXMgc3RhdHVzID0gcmVhc29uUGhyYXNlID09IG51bGwKKyAgICAgICAgICAgICAgICA/IEh0dHBSZXNwb25zZVN0YXR1cy52YWx1ZU9mKHN0YXR1c0NvZGUpCisgICAgICAgICAgICAgICAgOiBuZXcgSHR0cFJlc3BvbnNlU3RhdHVzKHN0YXR1c0NvZGUsIHJlYXNvblBocmFzZSk7CisKKyAgICAgICAgRGVmYXVsdEh0dHBSZXNwb25zZSByZXNwb25zZTsKKyAgICAgICAgaWYgKGNvbnRlbnRMZW5ndGggPT0gMCkgeworICAgICAgICAgICAgcmVzcG9uc2UgPSBuZXcgRGVmYXVsdEZ1bGxIdHRwUmVzcG9uc2UocmVxLnByb3RvY29sVmVyc2lvbigpLCBzdGF0dXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzcG9uc2UgPSBuZXcgRGVmYXVsdEh0dHBSZXNwb25zZShyZXEucHJvdG9jb2xWZXJzaW9uKCksIHN0YXR1cyk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZSA6IHJlc3BvbnNlQ29udGV4dC5nZXRTdHJpbmdIZWFkZXJzKCkuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgcmVzcG9uc2UuaGVhZGVycygpLmFkZChlLmdldEtleSgpLCBlLmdldFZhbHVlKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbnRlbnRMZW5ndGggPT0gLTEpIHsKKyAgICAgICAgICAgIEh0dHBVdGlsLnNldFRyYW5zZmVyRW5jb2RpbmdDaHVua2VkKHJlc3BvbnNlLCB0cnVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc3BvbnNlLmhlYWRlcnMoKS5zZXQoSHR0cEhlYWRlck5hbWVzLkNPTlRFTlRfTEVOR1RILCBjb250ZW50TGVuZ3RoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChIdHRwVXRpbC5pc0tlZXBBbGl2ZShyZXEpKSB7CisgICAgICAgICAgICByZXNwb25zZS5oZWFkZXJzKCkuc2V0KEh0dHBIZWFkZXJOYW1lcy5DT05ORUNUSU9OLCBIdHRwSGVhZGVyVmFsdWVzLktFRVBfQUxJVkUpOworICAgICAgICB9CisKKyAgICAgICAgY3R4LndyaXRlQW5kRmx1c2gocmVzcG9uc2UpOworCisgICAgICAgIGlmIChyZXEubWV0aG9kKCkgIT0gSHR0cE1ldGhvZC5IRUFEICYmIChjb250ZW50TGVuZ3RoID4gMCB8fCBjb250ZW50TGVuZ3RoID09IC0xKSkgeworCisgICAgICAgICAgICBKZXJzZXlDaHVua2VkSW5wdXQgamVyc2V5Q2h1bmtlZElucHV0ID0gbmV3IEplcnNleUNodW5rZWRJbnB1dChjdHguY2hhbm5lbCgpKTsKKworICAgICAgICAgICAgaWYgKEh0dHBVdGlsLmlzVHJhbnNmZXJFbmNvZGluZ0NodW5rZWQocmVzcG9uc2UpKSB7CisgICAgICAgICAgICAgICAgY3R4LndyaXRlKG5ldyBIdHRwQ2h1bmtlZElucHV0KGplcnNleUNodW5rZWRJbnB1dCkpLmFkZExpc3RlbmVyKEZMVVNIX0ZVVFVSRSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGN0eC53cml0ZShuZXcgSHR0cENodW5rZWRJbnB1dChqZXJzZXlDaHVua2VkSW5wdXQpKS5hZGRMaXN0ZW5lcihGTFVTSF9GVVRVUkUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGplcnNleUNodW5rZWRJbnB1dDsKKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY3R4LndyaXRlQW5kRmx1c2goTGFzdEh0dHBDb250ZW50LkVNUFRZX0xBU1RfQ09OVEVOVCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHN1c3BlbmQobG9uZyB0aW1lT3V0LCBUaW1lVW5pdCB0aW1lVW5pdCwgZmluYWwgQ29udGFpbmVyUmVzcG9uc2VXcml0ZXIuVGltZW91dEhhbmRsZXIKKyAgICAgICAgICAgIHRpbWVvdXRIYW5kbGVyKSB7CisKKyAgICAgICAgc3VzcGVuZFRpbWVvdXRIYW5kbGVyID0gbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgdGltZW91dEhhbmRsZXIub25UaW1lb3V0KE5ldHR5UmVzcG9uc2VXcml0ZXIudGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgaWYgKHRpbWVPdXQgPD0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBzdXNwZW5kVGltZW91dEZ1dHVyZSA9CisgICAgICAgICAgICAgICAgY29udGFpbmVyLmdldFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSgpLnNjaGVkdWxlKHN1c3BlbmRUaW1lb3V0SGFuZGxlciwgdGltZU91dCwgdGltZVVuaXQpOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFN1c3BlbmRUaW1lb3V0KGxvbmcgdGltZU91dCwgVGltZVVuaXQgdGltZVVuaXQpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworCisgICAgICAgIC8vIHN1c3BlbmQoMCwgLi4sIC4uKSB3YXMgY2FsbGVkLCBzbyBzdXNwZW5kVGltZW91dEZ1dHVyZSBpcyBudWxsLgorICAgICAgICBpZiAoc3VzcGVuZFRpbWVvdXRGdXR1cmUgIT0gbnVsbCkgeworICAgICAgICAgICAgc3VzcGVuZFRpbWVvdXRGdXR1cmUuY2FuY2VsKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRpbWVPdXQgPD0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgc3VzcGVuZFRpbWVvdXRGdXR1cmUgPQorICAgICAgICAgICAgICAgIGNvbnRhaW5lci5nZXRTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UoKS5zY2hlZHVsZShzdXNwZW5kVGltZW91dEhhbmRsZXIsIHRpbWVPdXQsIHRpbWVVbml0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjb21taXQoKSB7CisgICAgICAgIGN0eC5mbHVzaCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZhaWx1cmUoVGhyb3dhYmxlIGVycm9yKSB7CisgICAgICAgIGN0eC53cml0ZUFuZEZsdXNoKG5ldyBEZWZhdWx0RnVsbEh0dHBSZXNwb25zZShyZXEucHJvdG9jb2xWZXJzaW9uKCksIEh0dHBSZXNwb25zZVN0YXR1cy5JTlRFUk5BTF9TRVJWRVJfRVJST1IpKQorICAgICAgICAgICAuYWRkTGlzdGVuZXIoQ2hhbm5lbEZ1dHVyZUxpc3RlbmVyLkNMT1NFKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVSZXNwb25zZUJ1ZmZlcmluZygpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVycy9uZXR0eS1odHRwL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbnRhaW5lclByb3ZpZGVyIGIvY29udGFpbmVycy9uZXR0eS1odHRwL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbnRhaW5lclByb3ZpZGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZWU5MjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXJzL25ldHR5LWh0dHAvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29udGFpbmVyUHJvdmlkZXIKQEAgLTAsMCArMSBAQAorb3JnLmdsYXNzZmlzaC5qZXJzZXkubmV0dHkuaHR0cHNlcnZlci5OZXR0eUh0dHBDb250YWluZXJQcm92aWRlcgpkaWZmIC0tZ2l0IGEvY29udGFpbmVycy9wb20ueG1sIGIvY29udGFpbmVycy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNDZhMTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXJzL3BvbS54bWwKQEAgLTAsMCArMSw3OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleTwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS1jb250YWluZXJzPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPkplcnNleSBjb250YWluZXIgcHJvdmlkZXJzIHVtYnJlbGxhIHByb2plY3QgbW9kdWxlPC9kZXNjcmlwdGlvbj4KKworICAgIDxtb2R1bGVzPgorICAgICAgICA8bW9kdWxlPmdsYXNzZmlzaDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmdyaXp6bHkyLWh0dHA8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5ncml6emx5Mi1zZXJ2bGV0PC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+amRrLWh0dHA8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5qZXJzZXktc2VydmxldC1jb3JlPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+amVyc2V5LXNlcnZsZXQ8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5qZXR0eS1odHRwPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+amV0dHktc2VydmxldDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPm5ldHR5LWh0dHA8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5zaW1wbGUtaHR0cDwvbW9kdWxlPgorICAgIDwvbW9kdWxlcz4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb21tb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXNlcnZlcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgud3MucnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC53cy5ycy1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktaGsyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb250YWluZXJzL3NpbXBsZS1odHRwL3BvbS54bWwgYi9jb250YWluZXJzL3NpbXBsZS1odHRwL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNiZmIzOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lcnMvc2ltcGxlLWh0dHAvcG9tLnhtbApAQCAtMCwwICsxLDg3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNpbXBsZS1odHRwPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LWNvbnRhaW5lci1zaW1wbGUtaHR0cDwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5TaW1wbGUgSHR0cCBDb250YWluZXI8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmhrMi5leHRlcm5hbDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LmluamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5zaW1wbGVmcmFtZXdvcms8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zaW1wbGUtaHR0cDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5zaW1wbGVmcmFtZXdvcms8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zaW1wbGUtdHJhbnNwb3J0PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNpbXBsZWZyYW1ld29yazwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnNpbXBsZS1jb21tb248L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4uaXN0YWNrPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWlzdGFjay1jb21tb25zLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5idWlsZC1oZWxwZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZmVsaXg8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYnVuZGxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisKKyAgICAgICAgPHJlc291cmNlcz4KKyAgICAgICAgICAgIDxyZXNvdXJjZT4KKyAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vamF2YTwvZGlyZWN0b3J5PgorICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+TUVUQS1JTkYvKiovKjwvaW5jbHVkZT4KKyAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgICAgICAgPC9yZXNvdXJjZT4KKyAgICAgICAgICAgIDxyZXNvdXJjZT4KKyAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgPGZpbHRlcmluZz50cnVlPC9maWx0ZXJpbmc+CisgICAgICAgICAgICA8L3Jlc291cmNlPgorICAgICAgICA8L3Jlc291cmNlcz4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb250YWluZXJzL3NpbXBsZS1odHRwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2ltcGxlL1NpbXBsZUNvbnRhaW5lci5qYXZhIGIvY29udGFpbmVycy9zaW1wbGUtaHR0cC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NpbXBsZS9TaW1wbGVDb250YWluZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTk5NjJmCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVycy9zaW1wbGUtaHR0cC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NpbXBsZS9TaW1wbGVDb250YWluZXIuamF2YQpAQCAtMCwwICsxLDQ2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zaW1wbGU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRGdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkdlbmVyaWNUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuU2VjdXJpdHlDb250ZXh0OworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5NYXBQcm9wZXJ0aWVzRGVsZWdhdGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkFic3RyYWN0QmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5SZWZlcmVuY2luZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5FeHRlbmRlZExvZ2dlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uUmVmOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWwuUmVxdWVzdFNjb3BlZDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuQ29udGFpbmVyVXRpbHM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5Db250YWluZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5Db250YWluZXJSZXNwb25zZVdyaXRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbnRhaW5lclJlc3BvbnNlV3JpdGVyLlRpbWVvdXRIYW5kbGVyOworCitpbXBvcnQgb3JnLnNpbXBsZWZyYW1ld29yay5jb21tb24udGhyZWFkLkRhZW1vbkZhY3Rvcnk7CitpbXBvcnQgb3JnLnNpbXBsZWZyYW1ld29yay5odHRwLkFkZHJlc3M7CitpbXBvcnQgb3JnLnNpbXBsZWZyYW1ld29yay5odHRwLlJlcXVlc3Q7CitpbXBvcnQgb3JnLnNpbXBsZWZyYW1ld29yay5odHRwLlJlc3BvbnNlOworaW1wb3J0IG9yZy5zaW1wbGVmcmFtZXdvcmsuaHR0cC5TdGF0dXM7CisKKy8qKgorICogSmVyc2V5IHtAY29kZSBDb250YWluZXJ9IGltcGxlbWVudGF0aW9uIGJhc2VkIG9uIFNpbXBsZSBmcmFtZXdvcmsKKyAqIHtAbGluayBvcmcuc2ltcGxlZnJhbWV3b3JrLmh0dHAuY29yZS5Db250YWluZXJ9LgorICoKKyAqIEBhdXRob3IgQXJ1bCBEaGVzaWFzZWVsYW4gKGFydWxkQGFjbS5vcmcpCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgU2ltcGxlQ29udGFpbmVyIGltcGxlbWVudHMgb3JnLnNpbXBsZWZyYW1ld29yay5odHRwLmNvcmUuQ29udGFpbmVyLCBDb250YWluZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXh0ZW5kZWRMb2dnZXIgbG9nZ2VyID0KKyAgICAgICAgICAgIG5ldyBFeHRlbmRlZExvZ2dlcihMb2dnZXIuZ2V0TG9nZ2VyKFNpbXBsZUNvbnRhaW5lci5jbGFzcy5nZXROYW1lKCkpLCBMZXZlbC5GSU5FU1QpOworCisgICAgcHJpdmF0ZSBmaW5hbCBUeXBlIFJlcXVlc3RUWVBFID0gKG5ldyBHZW5lcmljVHlwZTxSZWY8UmVxdWVzdD4+KCkgeyB9KS5nZXRUeXBlKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBUeXBlIFJlc3BvbnNlVFlQRSA9IChuZXcgR2VuZXJpY1R5cGU8UmVmPFJlc3BvbnNlPj4oKSB7IH0pLmdldFR5cGUoKTsKKworICAgIC8qKgorICAgICAqIFJlZmVyZW5jaW5nIGZhY3RvcnkgZm9yIFNpbXBsZSByZXF1ZXN0LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNpbXBsZVJlcXVlc3RSZWZlcmVuY2luZ0ZhY3RvcnkgZXh0ZW5kcyBSZWZlcmVuY2luZ0ZhY3Rvcnk8UmVxdWVzdD4geworCisgICAgICAgIEBJbmplY3QKKyAgICAgICAgcHVibGljIFNpbXBsZVJlcXVlc3RSZWZlcmVuY2luZ0ZhY3RvcnkoZmluYWwgUHJvdmlkZXI8UmVmPFJlcXVlc3Q+PiByZWZlcmVuY2VGYWN0b3J5KSB7CisgICAgICAgICAgICBzdXBlcihyZWZlcmVuY2VGYWN0b3J5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZmVyZW5jaW5nIGZhY3RvcnkgZm9yIFNpbXBsZSByZXNwb25zZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTaW1wbGVSZXNwb25zZVJlZmVyZW5jaW5nRmFjdG9yeSBleHRlbmRzIFJlZmVyZW5jaW5nRmFjdG9yeTxSZXNwb25zZT4geworCisgICAgICAgIEBJbmplY3QKKyAgICAgICAgcHVibGljIFNpbXBsZVJlc3BvbnNlUmVmZXJlbmNpbmdGYWN0b3J5KGZpbmFsIFByb3ZpZGVyPFJlZjxSZXNwb25zZT4+IHJlZmVyZW5jZUZhY3RvcnkpIHsKKyAgICAgICAgICAgIHN1cGVyKHJlZmVyZW5jZUZhY3RvcnkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQW4gaW50ZXJuYWwgYmluZGVyIHRvIGVuYWJsZSBTaW1wbGUgSFRUUCBjb250YWluZXIgc3BlY2lmaWMgdHlwZXMgaW5qZWN0aW9uLiBUaGlzIGJpbmRlciBhbGxvd3MKKyAgICAgKiB0byBpbmplY3QgdW5kZXJseWluZyBHcml6emx5IEhUVFAgcmVxdWVzdCBhbmQgcmVzcG9uc2UgaW5zdGFuY2VzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNpbXBsZUJpbmRlciBleHRlbmRzIEFic3RyYWN0QmluZGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICAgICAgYmluZEZhY3RvcnkoU2ltcGxlUmVxdWVzdFJlZmVyZW5jaW5nRmFjdG9yeS5jbGFzcykudG8oUmVxdWVzdC5jbGFzcykucHJveHkodHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByb3h5Rm9yU2FtZVNjb3BlKGZhbHNlKS5pbihSZXF1ZXN0U2NvcGVkLmNsYXNzKTsKKyAgICAgICAgICAgIGJpbmRGYWN0b3J5KFJlZmVyZW5jaW5nRmFjdG9yeS48UmVxdWVzdD5yZWZlcmVuY2VGYWN0b3J5KCkpCisgICAgICAgICAgICAgICAgICAgIC50byhuZXcgR2VuZXJpY1R5cGU8UmVmPFJlcXVlc3Q+PigpIHsKKyAgICAgICAgICAgICAgICAgICAgfSkuaW4oUmVxdWVzdFNjb3BlZC5jbGFzcyk7CisKKyAgICAgICAgICAgIGJpbmRGYWN0b3J5KFNpbXBsZVJlc3BvbnNlUmVmZXJlbmNpbmdGYWN0b3J5LmNsYXNzKS50byhSZXNwb25zZS5jbGFzcykucHJveHkodHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm94eUZvclNhbWVTY29wZShmYWxzZSkuaW4oUmVxdWVzdFNjb3BlZC5jbGFzcyk7CisgICAgICAgICAgICBiaW5kRmFjdG9yeShSZWZlcmVuY2luZ0ZhY3RvcnkuPFJlc3BvbnNlPnJlZmVyZW5jZUZhY3RvcnkoKSkKKyAgICAgICAgICAgICAgICAgICAgLnRvKG5ldyBHZW5lcmljVHlwZTxSZWY8UmVzcG9uc2U+PigpIHsKKyAgICAgICAgICAgICAgICAgICAgfSkuaW4oUmVxdWVzdFNjb3BlZC5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvbGF0aWxlIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSBzY2hlZHVsZXI7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwSGFuZGxlcjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlc3BvbnNlV3JpdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVzcG9uc2VXcml0ZXIgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgQXRvbWljUmVmZXJlbmNlPFRpbWVvdXRUaW1lcj4gcmVmZXJlbmNlOworICAgICAgICBwcml2YXRlIGZpbmFsIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSBzY2hlZHVsZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2U7CisKKyAgICAgICAgUmVzcG9uc2VXcml0ZXIoZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UsIGZpbmFsIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSBzY2hlZHVsZXIpIHsKKyAgICAgICAgICAgIHRoaXMucmVmZXJlbmNlID0gbmV3IEF0b21pY1JlZmVyZW5jZTxUaW1lb3V0VGltZXI+KCk7CisgICAgICAgICAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7CisgICAgICAgICAgICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIHdyaXRlUmVzcG9uc2VTdGF0dXNBbmRIZWFkZXJzKGZpbmFsIGxvbmcgY29udGVudExlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb250YWluZXJSZXNwb25zZSBjb250ZXh0KSB0aHJvd3MgQ29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2UuU3RhdHVzVHlwZSBzdGF0dXNJbmZvID0gY29udGV4dC5nZXRTdGF0dXNJbmZvKCk7CisKKyAgICAgICAgICAgIGZpbmFsIGludCBjb2RlID0gc3RhdHVzSW5mby5nZXRTdGF0dXNDb2RlKCk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVhc29uID0gc3RhdHVzSW5mby5nZXRSZWFzb25QaHJhc2UoKSA9PSBudWxsCisgICAgICAgICAgICAgICAgICAgID8gU3RhdHVzLmdldERlc2NyaXB0aW9uKGNvZGUpCisgICAgICAgICAgICAgICAgICAgIDogc3RhdHVzSW5mby5nZXRSZWFzb25QaHJhc2UoKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNldENvZGUoY29kZSk7CisgICAgICAgICAgICByZXNwb25zZS5zZXREZXNjcmlwdGlvbihyZWFzb24pOworCisgICAgICAgICAgICBpZiAoY29udGVudExlbmd0aCAhPSAtMSkgeworICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRMZW5ndGgoY29udGVudExlbmd0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZSA6IGNvbnRleHQuZ2V0U3RyaW5nSGVhZGVycygpLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyB2YWx1ZSA6IGUuZ2V0VmFsdWUoKSkgeworICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5hZGRWYWx1ZShlLmdldEtleSgpLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBDb250YWluZXJFeGNlcHRpb24oIkVycm9yIGR1cmluZyB3cml0aW5nIG91dCB0aGUgcmVzcG9uc2UgaGVhZGVycy4iLCBpb2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHN1c3BlbmQoZmluYWwgbG9uZyB0aW1lT3V0LCBmaW5hbCBUaW1lVW5pdCB0aW1lVW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUaW1lb3V0SGFuZGxlciB0aW1lb3V0SGFuZGxlcikgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBUaW1lb3V0VGltZXIgdGltZXIgPSByZWZlcmVuY2UuZ2V0KCk7CisKKyAgICAgICAgICAgICAgICBpZiAodGltZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBUaW1lb3V0RGlzcGF0Y2hlciB0YXNrID0gbmV3IFRpbWVvdXREaXNwYXRjaGVyKHRoaXMsIHRpbWVvdXRIYW5kbGVyKTsKKyAgICAgICAgICAgICAgICAgICAgU2NoZWR1bGVkRnV0dXJlPD8+IGZ1dHVyZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVyLnNjaGVkdWxlKHRhc2ssIHRpbWVPdXQgPT0gMCA/IEludGVnZXIuTUFYX1ZBTFVFIDogdGltZU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVPdXQgPT0gMCA/IFRpbWVVbml0LlNFQ09ORFMgOiB0aW1lVW5pdCk7CisgICAgICAgICAgICAgICAgICAgIHRpbWVyID0gbmV3IFRpbWVvdXRUaW1lcihzY2hlZHVsZXIsIGZ1dHVyZSwgdGFzayk7CisgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZS5zZXQodGltZXIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWdMb2coInN1c3BlbmQoLi4uKSBjYWxsZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRTdXNwZW5kVGltZW91dChmaW5hbCBsb25nIHRpbWVPdXQsIGZpbmFsIFRpbWVVbml0IHRpbWVVbml0KQorICAgICAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBUaW1lb3V0VGltZXIgdGltZXIgPSByZWZlcmVuY2UuZ2V0KCk7CisKKyAgICAgICAgICAgICAgICBpZiAodGltZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJSZXNwb25zZSBoYXMgbm90IGJlZW4gc3VzcGVuZGVkIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRpbWVyLnJlc2NoZWR1bGUodGltZU91dCwgdGltZVVuaXQpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWdMb2coInNldFRpbWVvdXQoLi4uKSBjYWxsZWQiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjb21taXQoKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlc3BvbnNlLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhMZXZlbC5TRVZFUkUsICJVbmFibGUgdG8gc2VuZCA1MDAgZXJyb3IgcmVzcG9uc2UuIiwgZSk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1Z0xvZygiY29tbWl0KCkgY2FsbGVkIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1N1c3BlbmRlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiByZWZlcmVuY2UuZ2V0KCkgIT0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmYWlsdXJlKGZpbmFsIFRocm93YWJsZSBlcnJvcikgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlLmlzQ29tbWl0dGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0Q29kZShqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlLlN0YXR1cy5JTlRFUk5BTF9TRVJWRVJfRVJST1IuZ2V0U3RhdHVzQ29kZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0RGVzY3JpcHRpb24oZXJyb3IuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1Z0xvZygiZmFpbHVyZSguLi4pIGNhbGxlZCIpOworICAgICAgICAgICAgICAgIGNvbW1pdCgpOworICAgICAgICAgICAgICAgIHJldGhyb3coZXJyb3IpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZW5hYmxlUmVzcG9uc2VCdWZmZXJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0aHJvdyB0aGUgb3JpZ2luYWwgZXhjZXB0aW9uIGFzIHJlcXVpcmVkIGJ5IEpBWC1SUywgMy4zLjQKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGVycm9yIHRocm93YWJsZSB0byBiZSByZS10aHJvd24KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCByZXRocm93KGZpbmFsIFRocm93YWJsZSBlcnJvcikgeworICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKSBlcnJvcjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbnRhaW5lckV4Y2VwdGlvbihlcnJvcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFRpbWVvdXRUaW1lciB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNSZWZlcmVuY2U8U2NoZWR1bGVkRnV0dXJlPD8+PiByZWZlcmVuY2U7CisgICAgICAgIHByaXZhdGUgZmluYWwgU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlIHNlcnZpY2U7CisgICAgICAgIHByaXZhdGUgZmluYWwgVGltZW91dERpc3BhdGNoZXIgdGFzazsKKworICAgICAgICBwdWJsaWMgVGltZW91dFRpbWVyKFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSBzZXJ2aWNlLCBTY2hlZHVsZWRGdXR1cmU8Pz4gZnV0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVvdXREaXNwYXRjaGVyIHRhc2spIHsKKyAgICAgICAgICAgIHRoaXMucmVmZXJlbmNlID0gbmV3IEF0b21pY1JlZmVyZW5jZTxTY2hlZHVsZWRGdXR1cmU8Pz4+KCk7CisgICAgICAgICAgICB0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlOworICAgICAgICAgICAgdGhpcy50YXNrID0gdGFzazsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlc2NoZWR1bGUobG9uZyB0aW1lT3V0LCBUaW1lVW5pdCB0aW1lVW5pdCkgeworICAgICAgICAgICAgU2NoZWR1bGVkRnV0dXJlPD8+IGZ1dHVyZSA9IHJlZmVyZW5jZS5nZXRBbmRTZXQobnVsbCk7CisKKyAgICAgICAgICAgIGlmIChmdXR1cmUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChmdXR1cmUuY2FuY2VsKGZhbHNlKSkgeworICAgICAgICAgICAgICAgICAgICBmdXR1cmUgPSBzZXJ2aWNlLnNjaGVkdWxlKHRhc2ssIHRpbWVPdXQgPT0gMCA/IEludGVnZXIuTUFYX1ZBTFVFIDogdGltZU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lT3V0ID09IDAgPyBUaW1lVW5pdC5TRUNPTkRTIDogdGltZVVuaXQpOworICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2Uuc2V0KGZ1dHVyZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmdXR1cmUgPSBzZXJ2aWNlLnNjaGVkdWxlKHRhc2ssIHRpbWVPdXQgPT0gMCA/IEludGVnZXIuTUFYX1ZBTFVFIDogdGltZU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVPdXQgPT0gMCA/IFRpbWVVbml0LlNFQ09ORFMgOiB0aW1lVW5pdCk7CisgICAgICAgICAgICAgICAgcmVmZXJlbmNlLnNldChmdXR1cmUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgVGltZW91dERpc3BhdGNoZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZXNwb25zZVdyaXRlciB3cml0ZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgVGltZW91dEhhbmRsZXIgaGFuZGxlcjsKKworICAgICAgICBwdWJsaWMgVGltZW91dERpc3BhdGNoZXIoUmVzcG9uc2VXcml0ZXIgd3JpdGVyLCBUaW1lb3V0SGFuZGxlciBoYW5kbGVyKSB7CisgICAgICAgICAgICB0aGlzLndyaXRlciA9IHdyaXRlcjsKKyAgICAgICAgICAgIHRoaXMuaGFuZGxlciA9IGhhbmRsZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGhhbmRsZXIub25UaW1lb3V0KHdyaXRlcik7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZ2dlci5sb2coTGV2ZWwuSU5GTywgIkZhaWxlZCB0byBjYWxsIHRpbWVvdXQgaGFuZGxlciIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaGFuZGxlKGZpbmFsIFJlcXVlc3QgcmVxdWVzdCwgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2VXcml0ZXIgcmVzcG9uc2VXcml0ZXIgPSBuZXcgUmVzcG9uc2VXcml0ZXIocmVzcG9uc2UsIHNjaGVkdWxlcik7CisgICAgICAgIGZpbmFsIFVSSSBiYXNlVXJpID0gZ2V0QmFzZVVyaShyZXF1ZXN0KTsKKyAgICAgICAgZmluYWwgVVJJIHJlcXVlc3RVcmkgPSBnZXRSZXF1ZXN0VXJpKHJlcXVlc3QsIGJhc2VVcmkpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBDb250YWluZXJSZXF1ZXN0IHJlcXVlc3RDb250ZXh0ID0gbmV3IENvbnRhaW5lclJlcXVlc3QoYmFzZVVyaSwgcmVxdWVzdFVyaSwKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRNZXRob2QoKSwgZ2V0U2VjdXJpdHlDb250ZXh0KHJlcXVlc3QpLCBuZXcgTWFwUHJvcGVydGllc0RlbGVnYXRlKCkpOworICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuc2V0RW50aXR5U3RyZWFtKHJlcXVlc3QuZ2V0SW5wdXRTdHJlYW0oKSk7CisgICAgICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBoZWFkZXJOYW1lIDogcmVxdWVzdC5nZXROYW1lcygpKSB7CisgICAgICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuaGVhZGVycyhoZWFkZXJOYW1lLCByZXF1ZXN0LmdldFZhbHVlKGhlYWRlck5hbWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LnNldFdyaXRlcihyZXNwb25zZVdyaXRlcik7CisgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5zZXRSZXF1ZXN0U2NvcGVkSW5pdGlhbGl6ZXIoaW5qZWN0aW9uTWFuYWdlciAtPiB7CisgICAgICAgICAgICAgICAgaW5qZWN0aW9uTWFuYWdlci48UmVmPFJlcXVlc3Q+PmdldEluc3RhbmNlKFJlcXVlc3RUWVBFKS5zZXQocmVxdWVzdCk7CisgICAgICAgICAgICAgICAgaW5qZWN0aW9uTWFuYWdlci48UmVmPFJlc3BvbnNlPj5nZXRJbnN0YW5jZShSZXNwb25zZVRZUEUpLnNldChyZXNwb25zZSk7CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgYXBwSGFuZGxlci5oYW5kbGUocmVxdWVzdENvbnRleHQpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmICghcmVzcG9uc2VXcml0ZXIuaXNTdXNwZW5kZWQoKSkgeworICAgICAgICAgICAgICAgIGNsb3NlKHJlc3BvbnNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgVVJJIGdldFJlcXVlc3RVcmkoZmluYWwgUmVxdWVzdCByZXF1ZXN0LCBmaW5hbCBVUkkgYmFzZVVyaSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHNlcnZlckFkZHJlc3MgPSBnZXRTZXJ2ZXJBZGRyZXNzKGJhc2VVcmkpOworICAgICAgICAgICAgU3RyaW5nIHVyaSA9IENvbnRhaW5lclV0aWxzLmdldEhhbmRsZXJQYXRoKHJlcXVlc3QuZ2V0VGFyZ2V0KCkpOworCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcXVlcnlTdHJpbmcgPSByZXF1ZXN0LmdldFF1ZXJ5KCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGlmIChxdWVyeVN0cmluZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdXJpID0gdXJpICsgIj8iICsgQ29udGFpbmVyVXRpbHMuZW5jb2RlVW5zYWZlQ2hhcmFjdGVycyhxdWVyeVN0cmluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgVVJJKHNlcnZlckFkZHJlc3MgKyB1cmkpOworICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0U2VydmVyQWRkcmVzcyhmaW5hbCBVUkkgYmFzZVVyaSkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgVVJJKGJhc2VVcmkuZ2V0U2NoZW1lKCksIG51bGwsIGJhc2VVcmkuZ2V0SG9zdCgpLCBiYXNlVXJpLmdldFBvcnQoKSwgbnVsbCwgbnVsbCwKKyAgICAgICAgICAgICAgICBudWxsKS50b1N0cmluZygpOworICAgIH0KKworICAgIHByaXZhdGUgVVJJIGdldEJhc2VVcmkoZmluYWwgUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaG9zdEhlYWRlciA9IHJlcXVlc3QuZ2V0VmFsdWUoIkhvc3QiKTsKKworICAgICAgICAgICAgaWYgKGhvc3RIZWFkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzY2hlbWUgPSByZXF1ZXN0LmlzU2VjdXJlKCkgPyAiaHR0cHMiIDogImh0dHAiOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVVJJKHNjaGVtZSArICI6Ly8iICsgaG9zdEhlYWRlciArICIvIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZpbmFsIEFkZHJlc3MgYWRkcmVzcyA9IHJlcXVlc3QuZ2V0QWRkcmVzcygpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVVJJKGFkZHJlc3MuZ2V0U2NoZW1lKCksIG51bGwsIGFkZHJlc3MuZ2V0RG9tYWluKCksIGFkZHJlc3MuZ2V0UG9ydCgpLCAiLyIsIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoZmluYWwgVVJJU3ludGF4RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU2VjdXJpdHlDb250ZXh0IGdldFNlY3VyaXR5Q29udGV4dChmaW5hbCBSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTZWN1cml0eUNvbnRleHQoKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNVc2VySW5Sb2xlKGZpbmFsIFN0cmluZyByb2xlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzU2VjdXJlKCkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXF1ZXN0LmlzU2VjdXJlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFByaW5jaXBhbCBnZXRVc2VyUHJpbmNpcGFsKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXV0aGVudGljYXRpb25TY2hlbWUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNsb3NlKGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXNwb25zZS5jbG9zZSgpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvdXJjZUNvbmZpZyBnZXRDb25maWd1cmF0aW9uKCkgeworICAgICAgICByZXR1cm4gYXBwSGFuZGxlci5nZXRDb25maWd1cmF0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVsb2FkKCkgeworICAgICAgICByZWxvYWQoZ2V0Q29uZmlndXJhdGlvbigpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZWxvYWQoZmluYWwgUmVzb3VyY2VDb25maWcgY29uZmlndXJhdGlvbikgeworICAgICAgICBhcHBIYW5kbGVyLm9uU2h1dGRvd24odGhpcyk7CisKKyAgICAgICAgYXBwSGFuZGxlciA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIoY29uZmlndXJhdGlvbi5yZWdpc3RlcihuZXcgU2ltcGxlQmluZGVyKCkpKTsKKyAgICAgICAgc2NoZWR1bGVyID0gbmV3IFNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvcigyLCBuZXcgRGFlbW9uRmFjdG9yeShUaW1lb3V0RGlzcGF0Y2hlci5jbGFzcykpOworICAgICAgICBhcHBIYW5kbGVyLm9uUmVsb2FkKHRoaXMpOworICAgICAgICBhcHBIYW5kbGVyLm9uU3RhcnR1cCh0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQXBwbGljYXRpb25IYW5kbGVyIGdldEFwcGxpY2F0aW9uSGFuZGxlcigpIHsKKyAgICAgICAgcmV0dXJuIGFwcEhhbmRsZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5mb3JtIHRoaXMgY29udGFpbmVyIHRoYXQgdGhlIHNlcnZlciBoYXMgYmVlbiBzdGFydGVkLgorICAgICAqIDxwLz4KKyAgICAgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGltcGxpY2l0bHkgY2FsbGVkIGFmdGVyIHRoZSBzZXJ2ZXIgY29udGFpbmluZyB0aGlzIGNvbnRhaW5lciBpcyBzdGFydGVkLgorICAgICAqLworICAgIHZvaWQgb25TZXJ2ZXJTdGFydCgpIHsKKyAgICAgICAgYXBwSGFuZGxlci5vblN0YXJ0dXAodGhpcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5mb3JtIHRoaXMgY29udGFpbmVyIHRoYXQgdGhlIHNlcnZlciBpcyBiZWluZyBzdG9wcGVkLgorICAgICAqIDxwLz4KKyAgICAgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGltcGxpY2l0bHkgY2FsbGVkIGJlZm9yZSB0aGUgc2VydmVyIGNvbnRhaW5pbmcgdGhpcyBjb250YWluZXIgaXMgc3RvcHBlZC4KKyAgICAgKi8KKyAgICB2b2lkIG9uU2VydmVyU3RvcCgpIHsKKyAgICAgICAgYXBwSGFuZGxlci5vblNodXRkb3duKHRoaXMpOworICAgICAgICBzY2hlZHVsZXIuc2h1dGRvd24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgU2ltcGxlIGZyYW1ld29yayBIVFRQIGNvbnRhaW5lci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcHBsaWNhdGlvbiAgIEpBWC1SUyAvIEplcnNleSBhcHBsaWNhdGlvbiB0byBiZSBkZXBsb3llZCBvbiBTaW1wbGUgZnJhbWV3b3JrIEhUVFAgY29udGFpbmVyLgorICAgICAqIEBwYXJhbSBwYXJlbnRDb250ZXh0IERJIHByb3ZpZGVyIHNwZWNpZmljIGNvbnRleHQgd2l0aCBhcHBsaWNhdGlvbidzIHJlZ2lzdGVyZWQgYmluZGluZ3MuCisgICAgICovCisgICAgU2ltcGxlQ29udGFpbmVyKGZpbmFsIEFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uLCBmaW5hbCBPYmplY3QgcGFyZW50Q29udGV4dCkgeworICAgICAgICB0aGlzLmFwcEhhbmRsZXIgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKGFwcGxpY2F0aW9uLCBuZXcgU2ltcGxlQmluZGVyKCksIHBhcmVudENvbnRleHQpOworICAgICAgICB0aGlzLnNjaGVkdWxlciA9IG5ldyBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IoMiwgbmV3IERhZW1vbkZhY3RvcnkoVGltZW91dERpc3BhdGNoZXIuY2xhc3MpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgU2ltcGxlIGZyYW1ld29yayBIVFRQIGNvbnRhaW5lci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcHBsaWNhdGlvbiBKQVgtUlMgLyBKZXJzZXkgYXBwbGljYXRpb24gdG8gYmUgZGVwbG95ZWQgb24gU2ltcGxlIGZyYW1ld29yayBIVFRQCisgICAgICogICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci4KKyAgICAgKi8KKyAgICBTaW1wbGVDb250YWluZXIoZmluYWwgQXBwbGljYXRpb24gYXBwbGljYXRpb24pIHsKKyAgICAgICAgdGhpcy5hcHBIYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihhcHBsaWNhdGlvbiwgbmV3IFNpbXBsZUJpbmRlcigpKTsKKyAgICAgICAgdGhpcy5zY2hlZHVsZXIgPSBuZXcgU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yKDIsIG5ldyBEYWVtb25GYWN0b3J5KFRpbWVvdXREaXNwYXRjaGVyLmNsYXNzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVycy9zaW1wbGUtaHR0cC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NpbXBsZS9TaW1wbGVDb250YWluZXJGYWN0b3J5LmphdmEgYi9jb250YWluZXJzL3NpbXBsZS1odHRwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2ltcGxlL1NpbXBsZUNvbnRhaW5lckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWRjNDZkCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVycy9zaW1wbGUtaHR0cC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NpbXBsZS9TaW1wbGVDb250YWluZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwyNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2ltcGxlOworCitpbXBvcnQgamF2YS5pby5DbG9zZWFibGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0U29ja2V0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5Tb2NrZXRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LlVSSTsKKworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC5uZXQuc3NsLlNTTENvbnRleHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uVW5zYWZlVmFsdWU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNpbXBsZS5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKKworaW1wb3J0IG9yZy5zaW1wbGVmcmFtZXdvcmsuaHR0cC5jb3JlLkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuc2ltcGxlZnJhbWV3b3JrLmh0dHAuY29yZS5Db250YWluZXJTb2NrZXRQcm9jZXNzb3I7CitpbXBvcnQgb3JnLnNpbXBsZWZyYW1ld29yay50cmFuc3BvcnQuU29ja2V0UHJvY2Vzc29yOworaW1wb3J0IG9yZy5zaW1wbGVmcmFtZXdvcmsudHJhbnNwb3J0LmNvbm5lY3QuQ29ubmVjdGlvbjsKK2ltcG9ydCBvcmcuc2ltcGxlZnJhbWV3b3JrLnRyYW5zcG9ydC5jb25uZWN0LlNvY2tldENvbm5lY3Rpb247CisKKy8qKgorICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgYW5kIHN0YXJ0aW5nIFNpbXBsZSBzZXJ2ZXIgY29udGFpbmVycy4gVGhpcyByZXR1cm5zIGEgaGFuZGxlIHRvIHRoZSBzdGFydGVkCisgKiBzZXJ2ZXIgYXMge0BsaW5rIENsb3NlYWJsZX0gaW5zdGFuY2VzLCB3aGljaCBhbGxvd3MgdGhlIHNlcnZlciB0byBiZSBzdG9wcGVkIGJ5IGludm9raW5nIHRoZQorICoge0BsaW5rIENsb3NlYWJsZSNjbG9zZX0gbWV0aG9kLgorICogPHAvPgorICogVG8gc3RhcnQgdGhlIHNlcnZlciBpbiBIVFRQUyBtb2RlIGFuIHtAbGluayBTU0xDb250ZXh0fSBjYW4gYmUgcHJvdmlkZWQuIFRoaXMgd2lsbCBiZSB1c2VkIHRvCisgKiBkZWNyeXB0IGFuZCBlbmNyeXB0IGluZm9ybWF0aW9uIHNlbnQgb3ZlciB0aGUgY29ubmVjdGVkIFRDUCBzb2NrZXQgY2hhbm5lbC4KKyAqCisgKiBAYXV0aG9yIEFydWwgRGhlc2lhc2VlbGFuIChhcnVsZCBhdCBhY20ub3JnKQorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNpbXBsZUNvbnRhaW5lckZhY3RvcnkgeworCisgICAgcHJpdmF0ZSBTaW1wbGVDb250YWluZXJGYWN0b3J5KCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHtAbGluayBDbG9zZWFibGV9IHRoYXQgcmVnaXN0ZXJzIGFuIHtAbGluayBDb250YWluZXJ9IHRoYXQgaW4gdHVybiBtYW5hZ2VzIGFsbCByb290CisgICAgICogcmVzb3VyY2UgYW5kIHByb3ZpZGVyIGNsYXNzZXMgZGVjbGFyZWQgYnkgdGhlIHJlc291cmNlIGNvbmZpZ3VyYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRkcmVzcyB0aGUgVVJJIHRvIGNyZWF0ZSB0aGUgaHR0cCBzZXJ2ZXIuIFRoZSBVUkkgc2NoZW1lIG11c3QgYmUgZXF1YWwgdG8gImh0dHAiLiBUaGUKKyAgICAgKiAgICAgICAgICAgICAgICBVUkkgdXNlciBpbmZvcm1hdGlvbiBhbmQgaG9zdCBhcmUgaWdub3JlZCBJZiB0aGUgVVJJIHBvcnQgaXMgbm90IHByZXNlbnQgdGhlbiBwb3J0IDgwCisgICAgICogICAgICAgICAgICAgICAgd2lsbCBiZSB1c2VkLiBUaGUgVVJJIHBhdGgsIHF1ZXJ5IGFuZCBmcmFnbWVudCBjb21wb25lbnRzIGFyZSBpZ25vcmVkLgorICAgICAqIEBwYXJhbSBjb25maWcgIHRoZSByZXNvdXJjZSBjb25maWd1cmF0aW9uLgorICAgICAqIEByZXR1cm4gdGhlIGNsb3NlYWJsZSBjb25uZWN0aW9uLCB3aXRoIHRoZSBlbmRwb2ludCBzdGFydGVkLgorICAgICAqIEB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiAgICAgIHRocm93biB3aGVuIHByb2JsZW1zIGR1cmluZyBzZXJ2ZXIgY3JlYXRpb24uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYge0Bjb2RlIGFkZHJlc3N9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNpbXBsZVNlcnZlciBjcmVhdGUoZmluYWwgVVJJIGFkZHJlc3MsIGZpbmFsIFJlc291cmNlQ29uZmlnIGNvbmZpZykgeworICAgICAgICByZXR1cm4gY3JlYXRlKGFkZHJlc3MsIG51bGwsIG5ldyBTaW1wbGVDb250YWluZXIoY29uZmlnKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEge0BsaW5rIENsb3NlYWJsZX0gdGhhdCByZWdpc3RlcnMgYW4ge0BsaW5rIENvbnRhaW5lcn0gdGhhdCBpbiB0dXJuIG1hbmFnZXMgYWxsIHJvb3QKKyAgICAgKiByZXNvdXJjZSBhbmQgcHJvdmlkZXIgY2xhc3NlcyBkZWNsYXJlZCBieSB0aGUgcmVzb3VyY2UgY29uZmlndXJhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZGRyZXNzIHRoZSBVUkkgdG8gY3JlYXRlIHRoZSBodHRwIHNlcnZlci4gVGhlIFVSSSBzY2hlbWUgbXVzdCBiZSBlcXVhbCB0byAiaHR0cCIuIFRoZQorICAgICAqICAgICAgICAgICAgICAgIFVSSSB1c2VyIGluZm9ybWF0aW9uIGFuZCBob3N0IGFyZSBpZ25vcmVkIElmIHRoZSBVUkkgcG9ydCBpcyBub3QgcHJlc2VudCB0aGVuIHBvcnQgODAKKyAgICAgKiAgICAgICAgICAgICAgICB3aWxsIGJlIHVzZWQuIFRoZSBVUkkgcGF0aCwgcXVlcnkgYW5kIGZyYWdtZW50IGNvbXBvbmVudHMgYXJlIGlnbm9yZWQuCisgICAgICogQHBhcmFtIGNvbmZpZyAgdGhlIHJlc291cmNlIGNvbmZpZ3VyYXRpb24uCisgICAgICogQHBhcmFtIGNvdW50ICAgdGhpcyBpcyB0aGUgbnVtYmVyIG9mIHRocmVhZHMgdG8gYmUgdXNlZC4KKyAgICAgKiBAcGFyYW0gc2VsZWN0ICB0aGlzIGlzIHRoZSBudW1iZXIgb2Ygc2VsZWN0b3IgdGhyZWFkcyB0byB1c2UuCisgICAgICogQHJldHVybiB0aGUgY2xvc2VhYmxlIGNvbm5lY3Rpb24sIHdpdGggdGhlIGVuZHBvaW50IHN0YXJ0ZWQuCisgICAgICogQHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uICAgICAgdGhyb3duIHdoZW4gcHJvYmxlbXMgZHVyaW5nIHNlcnZlciBjcmVhdGlvbi4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB7QGNvZGUgYWRkcmVzc30gaXMge0Bjb2RlIG51bGx9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU2ltcGxlU2VydmVyIGNyZWF0ZShmaW5hbCBVUkkgYWRkcmVzcywgZmluYWwgUmVzb3VyY2VDb25maWcgY29uZmlnLCBmaW5hbCBpbnQgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBzZWxlY3QpIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZShhZGRyZXNzLCBudWxsLCBuZXcgU2ltcGxlQ29udGFpbmVyKGNvbmZpZyksIGNvdW50LCBzZWxlY3QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHtAbGluayBDbG9zZWFibGV9IHRoYXQgcmVnaXN0ZXJzIGFuIHtAbGluayBDb250YWluZXJ9IHRoYXQgaW4gdHVybiBtYW5hZ2VzIGFsbCByb290CisgICAgICogcmVzb3VyY2UgYW5kIHByb3ZpZGVyIGNsYXNzZXMgZGVjbGFyZWQgYnkgdGhlIHJlc291cmNlIGNvbmZpZ3VyYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRkcmVzcyB0aGUgVVJJIHRvIGNyZWF0ZSB0aGUgaHR0cCBzZXJ2ZXIuIFRoZSBVUkkgc2NoZW1lIG11c3QgYmUgZXF1YWwgdG8ge0Bjb2RlIGh0dHBzfQorICAgICAqICAgICAgICAgICAgICAgIC4gVGhlIFVSSSB1c2VyIGluZm9ybWF0aW9uIGFuZCBob3N0IGFyZSBpZ25vcmVkLiBJZiB0aGUgVVJJIHBvcnQgaXMgbm90IHByZXNlbnQgdGhlbgorICAgICAqICAgICAgICAgICAgICAgIHBvcnQge0B2YWx1ZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbnRhaW5lciNERUZBVUxUX0hUVFBTX1BPUlR9IHdpbGwgYmUgdXNlZC4KKyAgICAgKiAgICAgICAgICAgICAgICBUaGUgVVJJIHBhdGgsIHF1ZXJ5IGFuZCBmcmFnbWVudCBjb21wb25lbnRzIGFyZSBpZ25vcmVkLgorICAgICAqIEBwYXJhbSBjb250ZXh0IHRoaXMgaXMgdGhlIFNTTCBjb250ZXh0IHVzZWQgZm9yIFNTTCBjb25uZWN0aW9ucy4KKyAgICAgKiBAcGFyYW0gY29uZmlnICB0aGUgcmVzb3VyY2UgY29uZmlndXJhdGlvbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBjbG9zZWFibGUgY29ubmVjdGlvbiwgd2l0aCB0aGUgZW5kcG9pbnQgc3RhcnRlZC4KKyAgICAgKiBAdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24gICAgICB0aHJvd24gd2hlbiBwcm9ibGVtcyBkdXJpbmcgc2VydmVyIGNyZWF0aW9uLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHtAY29kZSBhZGRyZXNzfSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTaW1wbGVTZXJ2ZXIgY3JlYXRlKGZpbmFsIFVSSSBhZGRyZXNzLCBmaW5hbCBTU0xDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIGNvbmZpZykgeworICAgICAgICByZXR1cm4gY3JlYXRlKGFkZHJlc3MsIGNvbnRleHQsIG5ldyBTaW1wbGVDb250YWluZXIoY29uZmlnKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEge0BsaW5rIENsb3NlYWJsZX0gdGhhdCByZWdpc3RlcnMgYW4ge0BsaW5rIENvbnRhaW5lcn0gdGhhdCBpbiB0dXJuIG1hbmFnZXMgYWxsIHJvb3QKKyAgICAgKiByZXNvdXJjZSBhbmQgcHJvdmlkZXIgY2xhc3NlcyBkZWNsYXJlZCBieSB0aGUgcmVzb3VyY2UgY29uZmlndXJhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZGRyZXNzIHRoZSBVUkkgdG8gY3JlYXRlIHRoZSBodHRwIHNlcnZlci4gVGhlIFVSSSBzY2hlbWUgbXVzdCBiZSBlcXVhbCB0byB7QGNvZGUgaHR0cHN9CisgICAgICogICAgICAgICAgICAgICAgLiBUaGUgVVJJIHVzZXIgaW5mb3JtYXRpb24gYW5kIGhvc3QgYXJlIGlnbm9yZWQuIElmIHRoZSBVUkkgcG9ydCBpcyBub3QgcHJlc2VudCB0aGVuCisgICAgICogICAgICAgICAgICAgICAgcG9ydCB7QHZhbHVlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29udGFpbmVyI0RFRkFVTFRfSFRUUFNfUE9SVH0gd2lsbCBiZSB1c2VkLgorICAgICAqICAgICAgICAgICAgICAgIFRoZSBVUkkgcGF0aCwgcXVlcnkgYW5kIGZyYWdtZW50IGNvbXBvbmVudHMgYXJlIGlnbm9yZWQuCisgICAgICogQHBhcmFtIGNvbnRleHQgdGhpcyBpcyB0aGUgU1NMIGNvbnRleHQgdXNlZCBmb3IgU1NMIGNvbm5lY3Rpb25zLgorICAgICAqIEBwYXJhbSBjb25maWcgIHRoZSByZXNvdXJjZSBjb25maWd1cmF0aW9uLgorICAgICAqIEBwYXJhbSBjb3VudCAgIHRoaXMgaXMgdGhlIG51bWJlciBvZiB0aHJlYWRzIHRvIGJlIHVzZWQuCisgICAgICogQHBhcmFtIHNlbGVjdCAgdGhpcyBpcyB0aGUgbnVtYmVyIG9mIHNlbGVjdG9yIHRocmVhZHMgdG8gdXNlLgorICAgICAqIEByZXR1cm4gdGhlIGNsb3NlYWJsZSBjb25uZWN0aW9uLCB3aXRoIHRoZSBlbmRwb2ludCBzdGFydGVkLgorICAgICAqIEB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiAgICAgIHRocm93biB3aGVuIHByb2JsZW1zIGR1cmluZyBzZXJ2ZXIgY3JlYXRpb24uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYge0Bjb2RlIGFkZHJlc3N9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNpbXBsZVNlcnZlciBjcmVhdGUoZmluYWwgVVJJIGFkZHJlc3MsIGZpbmFsIFNTTENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgY29uZmlnLCBmaW5hbCBpbnQgY291bnQsIGZpbmFsIGludCBzZWxlY3QpIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZShhZGRyZXNzLCBjb250ZXh0LCBuZXcgU2ltcGxlQ29udGFpbmVyKGNvbmZpZyksIGNvdW50LCBzZWxlY3QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHtAbGluayBDbG9zZWFibGV9IHRoYXQgcmVnaXN0ZXJzIGFuIHtAbGluayBDb250YWluZXJ9IHRoYXQgaW4gdHVybiBtYW5hZ2VzIGFsbCByb290CisgICAgICogcmVzb3VyY2UgYW5kIHByb3ZpZGVyIGNsYXNzZXMgZm91bmQgYnkgc2VhcmNoaW5nIHRoZSBjbGFzc2VzIHJlZmVyZW5jZWQgaW4gdGhlIGphdmEgY2xhc3NwYXRoLgorICAgICAqCisgICAgICogQHBhcmFtIGFkZHJlc3MgICB0aGUgVVJJIHRvIGNyZWF0ZSB0aGUgaHR0cCBzZXJ2ZXIuIFRoZSBVUkkgc2NoZW1lIG11c3QgYmUgZXF1YWwgdG8ge0Bjb2RlIGh0dHBzfQorICAgICAqICAgICAgICAgICAgICAgICAgLiBUaGUgVVJJIHVzZXIgaW5mb3JtYXRpb24gYW5kIGhvc3QgYXJlIGlnbm9yZWQuIElmIHRoZSBVUkkgcG9ydCBpcyBub3QgcHJlc2VudCB0aGVuCisgICAgICogICAgICAgICAgICAgICAgICBwb3J0IHtAdmFsdWUgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5Db250YWluZXIjREVGQVVMVF9IVFRQU19QT1JUfSB3aWxsIGJlIHVzZWQuCisgICAgICogICAgICAgICAgICAgICAgICBUaGUgVVJJIHBhdGgsIHF1ZXJ5IGFuZCBmcmFnbWVudCBjb21wb25lbnRzIGFyZSBpZ25vcmVkLgorICAgICAqIEBwYXJhbSBjb250ZXh0ICAgdGhpcyBpcyB0aGUgU1NMIGNvbnRleHQgdXNlZCBmb3IgU1NMIGNvbm5lY3Rpb25zLgorICAgICAqIEBwYXJhbSBjb250YWluZXIgdGhlIGNvbnRhaW5lciB0aGF0IGhhbmRsZXMgYWxsIEhUVFAgcmVxdWVzdHMuCisgICAgICogQHJldHVybiB0aGUgY2xvc2VhYmxlIGNvbm5lY3Rpb24sIHdpdGggdGhlIGVuZHBvaW50IHN0YXJ0ZWQuCisgICAgICogQHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uICAgICAgdGhyb3duIHdoZW4gcHJvYmxlbXMgZHVyaW5nIHNlcnZlciBjcmVhdGlvbi4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB7QGNvZGUgYWRkcmVzc30gaXMge0Bjb2RlIG51bGx9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU2ltcGxlU2VydmVyIGNyZWF0ZShmaW5hbCBVUkkgYWRkcmVzcywgZmluYWwgU1NMQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTaW1wbGVDb250YWluZXIgY29udGFpbmVyKSB7CisgICAgICAgIHJldHVybiBfY3JlYXRlKGFkZHJlc3MsIGNvbnRleHQsIGNvbnRhaW5lciwgbmV3IFVuc2FmZVZhbHVlPFNvY2tldFByb2Nlc3NvciwgSU9FeGNlcHRpb24+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU29ja2V0UHJvY2Vzc29yIGdldCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb250YWluZXJTb2NrZXRQcm9jZXNzb3IoY29udGFpbmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEge0BsaW5rIENsb3NlYWJsZX0gdGhhdCByZWdpc3RlcnMgYW4ge0BsaW5rIENvbnRhaW5lcn0gdGhhdCBpbiB0dXJuIG1hbmFnZXMgYWxsIHJvb3QKKyAgICAgKiByZXNvdXJjZSBhbmQgcHJvdmlkZXIgY2xhc3NlcyBkZWNsYXJlZCBieSB0aGUgcmVzb3VyY2UgY29uZmlndXJhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZGRyZXNzICAgICAgIHRoZSBVUkkgdG8gY3JlYXRlIHRoZSBodHRwIHNlcnZlci4gVGhlIFVSSSBzY2hlbWUgbXVzdCBiZSBlcXVhbCB0byB7QGNvZGUgaHR0cHN9CisgICAgICogICAgICAgICAgICAgICAgICAgICAgLiBUaGUgVVJJIHVzZXIgaW5mb3JtYXRpb24gYW5kIGhvc3QgYXJlIGlnbm9yZWQuIElmIHRoZSBVUkkgcG9ydCBpcyBub3QgcHJlc2VudCB0aGVuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcG9ydCB7QHZhbHVlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29udGFpbmVyI0RFRkFVTFRfSFRUUFNfUE9SVH0gd2lsbCBiZSB1c2VkLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBVUkkgcGF0aCwgcXVlcnkgYW5kIGZyYWdtZW50IGNvbXBvbmVudHMgYXJlIGlnbm9yZWQuCisgICAgICogQHBhcmFtIGNvbnRleHQgICAgICAgdGhpcyBpcyB0aGUgU1NMIGNvbnRleHQgdXNlZCBmb3IgU1NMIGNvbm5lY3Rpb25zLgorICAgICAqIEBwYXJhbSBjb25maWcgICAgICAgIHRoZSByZXNvdXJjZSBjb25maWd1cmF0aW9uLgorICAgICAqIEBwYXJhbSBwYXJlbnRDb250ZXh0IERJIHByb3ZpZGVyIHNwZWNpZmljIGNvbnRleHQgd2l0aCBhcHBsaWNhdGlvbidzIHJlZ2lzdGVyZWQgYmluZGluZ3MuCisgICAgICogQHBhcmFtIGNvdW50ICAgICAgICAgdGhpcyBpcyB0aGUgbnVtYmVyIG9mIHRocmVhZHMgdG8gYmUgdXNlZC4KKyAgICAgKiBAcGFyYW0gc2VsZWN0ICAgICAgICB0aGlzIGlzIHRoZSBudW1iZXIgb2Ygc2VsZWN0b3IgdGhyZWFkcyB0byB1c2UuCisgICAgICogQHJldHVybiB0aGUgY2xvc2VhYmxlIGNvbm5lY3Rpb24sIHdpdGggdGhlIGVuZHBvaW50IHN0YXJ0ZWQuCisgICAgICogQHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uICAgICAgdGhyb3duIHdoZW4gcHJvYmxlbXMgZHVyaW5nIHNlcnZlciBjcmVhdGlvbi4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB7QGNvZGUgYWRkcmVzc30gaXMge0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSAyLjEyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTaW1wbGVTZXJ2ZXIgY3JlYXRlKGZpbmFsIFVSSSBhZGRyZXNzLCBmaW5hbCBTU0xDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIGNvbmZpZywgZmluYWwgT2JqZWN0IHBhcmVudENvbnRleHQsIGZpbmFsIGludCBjb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHNlbGVjdCkgeworICAgICAgICByZXR1cm4gY3JlYXRlKGFkZHJlc3MsIGNvbnRleHQsIG5ldyBTaW1wbGVDb250YWluZXIoY29uZmlnLCBwYXJlbnRDb250ZXh0KSwgY291bnQsIHNlbGVjdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEge0BsaW5rIENsb3NlYWJsZX0gdGhhdCByZWdpc3RlcnMgYW4ge0BsaW5rIENvbnRhaW5lcn0gdGhhdCBpbiB0dXJuIG1hbmFnZXMgYWxsIHJvb3QKKyAgICAgKiByZXNvdXJjZSBhbmQgcHJvdmlkZXIgY2xhc3NlcyBmb3VuZCBieSBzZWFyY2hpbmcgdGhlIGNsYXNzZXMgcmVmZXJlbmNlZCBpbiB0aGUgamF2YSBjbGFzc3BhdGguCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRkcmVzcyAgIHRoZSBVUkkgdG8gY3JlYXRlIHRoZSBodHRwIHNlcnZlci4gVGhlIFVSSSBzY2hlbWUgbXVzdCBiZSBlcXVhbCB0byB7QGNvZGUgaHR0cHN9CisgICAgICogICAgICAgICAgICAgICAgICAuIFRoZSBVUkkgdXNlciBpbmZvcm1hdGlvbiBhbmQgaG9zdCBhcmUgaWdub3JlZC4gSWYgdGhlIFVSSSBwb3J0IGlzIG5vdCBwcmVzZW50IHRoZW4KKyAgICAgKiAgICAgICAgICAgICAgICAgIHBvcnQge0B2YWx1ZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbnRhaW5lciNERUZBVUxUX0hUVFBTX1BPUlR9IHdpbGwgYmUgdXNlZC4KKyAgICAgKiAgICAgICAgICAgICAgICAgIFRoZSBVUkkgcGF0aCwgcXVlcnkgYW5kIGZyYWdtZW50IGNvbXBvbmVudHMgYXJlIGlnbm9yZWQuCisgICAgICogQHBhcmFtIGNvbnRleHQgICB0aGlzIGlzIHRoZSBTU0wgY29udGV4dCB1c2VkIGZvciBTU0wgY29ubmVjdGlvbnMuCisgICAgICogQHBhcmFtIGNvbnRhaW5lciB0aGUgY29udGFpbmVyIHRoYXQgaGFuZGxlcyBhbGwgSFRUUCByZXF1ZXN0cy4KKyAgICAgKiBAcGFyYW0gY291bnQgICAgIHRoaXMgaXMgdGhlIG51bWJlciBvZiB0aHJlYWRzIHRvIGJlIHVzZWQuCisgICAgICogQHBhcmFtIHNlbGVjdCAgICB0aGlzIGlzIHRoZSBudW1iZXIgb2Ygc2VsZWN0b3IgdGhyZWFkcyB0byB1c2UuCisgICAgICogQHJldHVybiB0aGUgY2xvc2VhYmxlIGNvbm5lY3Rpb24sIHdpdGggdGhlIGVuZHBvaW50IHN0YXJ0ZWQuCisgICAgICogQHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uICAgICAgdGhyb3duIHdoZW4gcHJvYmxlbXMgZHVyaW5nIHNlcnZlciBjcmVhdGlvbi4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB7QGNvZGUgYWRkcmVzc30gaXMge0Bjb2RlIG51bGx9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU2ltcGxlU2VydmVyIGNyZWF0ZShmaW5hbCBVUkkgYWRkcmVzcywgZmluYWwgU1NMQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTaW1wbGVDb250YWluZXIgY29udGFpbmVyLCBmaW5hbCBpbnQgY291bnQsIGZpbmFsIGludCBzZWxlY3QpCisgICAgICAgICAgICB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiB7CisKKyAgICAgICAgcmV0dXJuIF9jcmVhdGUoYWRkcmVzcywgY29udGV4dCwgY29udGFpbmVyLCBuZXcgVW5zYWZlVmFsdWU8U29ja2V0UHJvY2Vzc29yLCBJT0V4Y2VwdGlvbj4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTb2NrZXRQcm9jZXNzb3IgZ2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbnRhaW5lclNvY2tldFByb2Nlc3Nvcihjb250YWluZXIsIGNvdW50LCBzZWxlY3QpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTaW1wbGVTZXJ2ZXIgX2NyZWF0ZShmaW5hbCBVUkkgYWRkcmVzcywgZmluYWwgU1NMQ29udGV4dCBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNpbXBsZUNvbnRhaW5lciBjb250YWluZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVW5zYWZlVmFsdWU8U29ja2V0UHJvY2Vzc29yLCBJT0V4Y2VwdGlvbj4gc2VydmVyUHJvdmlkZXIpCisgICAgICAgICAgICB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChhZGRyZXNzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuVVJJX0NBTk5PVF9CRV9OVUxMKCkpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFN0cmluZyBzY2hlbWUgPSBhZGRyZXNzLmdldFNjaGVtZSgpOworICAgICAgICBpbnQgZGVmYXVsdFBvcnQgPSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbnRhaW5lci5ERUZBVUxUX0hUVFBfUE9SVDsKKworICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAoIXNjaGVtZS5lcXVhbHNJZ25vcmVDYXNlKCJodHRwIikpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLldST05HX1NDSEVNRV9XSEVOX1VTSU5HX0hUVFAoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIXNjaGVtZS5lcXVhbHNJZ25vcmVDYXNlKCJodHRwcyIpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5XUk9OR19TQ0hFTUVfV0hFTl9VU0lOR19IVFRQUygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHRQb3J0ID0gb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5Db250YWluZXIuREVGQVVMVF9IVFRQU19QT1JUOworICAgICAgICB9CisgICAgICAgIGludCBwb3J0ID0gYWRkcmVzcy5nZXRQb3J0KCk7CisKKyAgICAgICAgaWYgKHBvcnQgPT0gLTEpIHsKKyAgICAgICAgICAgIHBvcnQgPSBkZWZhdWx0UG9ydDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBJbmV0U29ja2V0QWRkcmVzcyBsaXN0ZW4gPSBuZXcgSW5ldFNvY2tldEFkZHJlc3MocG9ydCk7CisgICAgICAgIGZpbmFsIENvbm5lY3Rpb24gY29ubmVjdGlvbjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIFNpbXBsZVRyYWNlQW5hbHl6ZXIgYW5hbHl6ZXIgPSBuZXcgU2ltcGxlVHJhY2VBbmFseXplcigpOworICAgICAgICAgICAgZmluYWwgU29ja2V0UHJvY2Vzc29yIHNlcnZlciA9IHNlcnZlclByb3ZpZGVyLmdldCgpOworICAgICAgICAgICAgY29ubmVjdGlvbiA9IG5ldyBTb2NrZXRDb25uZWN0aW9uKHNlcnZlciwgYW5hbHl6ZXIpOworCisKKyAgICAgICAgICAgIGZpbmFsIFNvY2tldEFkZHJlc3Mgc29ja2V0QWRkciA9IGNvbm5lY3Rpb24uY29ubmVjdChsaXN0ZW4sIGNvbnRleHQpOworICAgICAgICAgICAgY29udGFpbmVyLm9uU2VydmVyU3RhcnQoKTsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVTZXJ2ZXIoKSB7CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lci5vblNlcnZlclN0b3AoKTsKKyAgICAgICAgICAgICAgICAgICAgYW5hbHl6ZXIuc3RvcCgpOworICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGludCBnZXRQb3J0KCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKChJbmV0U29ja2V0QWRkcmVzcykgc29ja2V0QWRkcikuZ2V0UG9ydCgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRGVidWcoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhbmFseXplci5pc0FjdGl2ZSgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldERlYnVnKGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbmFibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuYWx5emVyLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbmFseXplci5zdG9wKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfV0hFTl9DUkVBVElOR19TRVJWRVIoKSwgZXgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVycy9zaW1wbGUtaHR0cC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NpbXBsZS9TaW1wbGVDb250YWluZXJQcm92aWRlci5qYXZhIGIvY29udGFpbmVycy9zaW1wbGUtaHR0cC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NpbXBsZS9TaW1wbGVDb250YWluZXJQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZjhmMGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXJzL3NpbXBsZS1odHRwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2ltcGxlL1NpbXBsZUNvbnRhaW5lclByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zaW1wbGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbnRhaW5lclByb3ZpZGVyOworCitpbXBvcnQgb3JnLnNpbXBsZWZyYW1ld29yay5odHRwLmNvcmUuQ29udGFpbmVyOworCisvKioKKyAqIENvbnRhaW5lciBwcm92aWRlciBmb3IgY29udGFpbmVycyBiYXNlZCBvbiBTaW1wbGUgSFRUUCBTZXJ2ZXIKKyAqIHtAbGluayBvcmcuc2ltcGxlZnJhbWV3b3JrLmh0dHAuY29yZS5Db250YWluZXJ9LgorICoKKyAqIEBhdXRob3IgTWFyYyBIYWRsZXkKKyAqIEBhdXRob3IgQXJ1bCBEaGVzaWFzZWVsYW4gKGFydWxkQGFjbS5vcmcpCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgU2ltcGxlQ29udGFpbmVyUHJvdmlkZXIgaW1wbGVtZW50cyBDb250YWluZXJQcm92aWRlciB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFQ+IFQgY3JlYXRlQ29udGFpbmVyKENsYXNzPFQ+IHR5cGUsIEFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uKSB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChDb250YWluZXIuY2xhc3MgPT0gdHlwZSB8fCBTaW1wbGVDb250YWluZXIuY2xhc3MgPT0gdHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHR5cGUuY2FzdChuZXcgU2ltcGxlQ29udGFpbmVyKGFwcGxpY2F0aW9uKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb250YWluZXJzL3NpbXBsZS1odHRwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2ltcGxlL1NpbXBsZVNlcnZlci5qYXZhIGIvY29udGFpbmVycy9zaW1wbGUtaHR0cC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NpbXBsZS9TaW1wbGVTZXJ2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmFlYzc1Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVycy9zaW1wbGUtaHR0cC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NpbXBsZS9TaW1wbGVTZXJ2ZXIuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNpbXBsZTsKKworaW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOworCisvKioKKyAqIFNpbXBsZSBzZXJ2ZXIgZmFjYWRlIHByb3ZpZGluZyBjb252ZW5pZW50IG1ldGhvZHMgdG8gb2J0YWluIGluZm8gYWJvdXQgdGhlIHNlcnZlciAoaS5lLiBwb3J0KS4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqIEBzaW5jZSAyLjkKKyAqLworcHVibGljIGludGVyZmFjZSBTaW1wbGVTZXJ2ZXIgZXh0ZW5kcyBDbG9zZWFibGUgeworCisgICAgLyoqCisgICAgICogVGhlIHBvcnQgdGhlIHNlcnZlciBpcyBsaXN0ZW5pbmcgdG8gZm9yIGluY29tbWluZyBIVFRQIGNvbm5lY3Rpb25zLiBJZiB0aGUgcG9ydCBpcyBub3QKKyAgICAgKiBzcGVjaWZpZWQgdGhlIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbnRhaW5lci5ERUZBVUxUX1BPUlR9IGlzIHVzZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBwb3J0IHRoZSBzZXJ2ZXIgaXMgbGlzdGVuaW5nIG9uCisgICAgICovCisgICAgcHVibGljIGludCBnZXRQb3J0KCk7CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGlzIGlzIHRydWUgdGhlbiB2ZXJ5IGxvdyBsZXZlbCBJL08gb3BlcmF0aW9ucyBhcmUgbG9nZ2VkLiBUeXBpY2FsbHkgdGhpcyBpcyB1c2VkIHRvIGRlYnVnCisgICAgICogSS9PIGlzc3VlcyBzdWNoIGFzIEhUVFBTIGhhbmRzaGFrZXMgb3IgcGVyZm9ybWFuY2UgaXNzdWVzIGJ5IGFuYWx5c2luZyB0aGUgdmFyaW91cyBsYXRlbmNpZXMKKyAgICAgKiBpbnZvbHZlZCBpbiB0aGUgSFRUUCBjb252ZXJzYXRpb24uCisgICAgICogPHAvPgorICAgICAqIFRoZXJlIGlzIGEgbWluaW1hbCBwZXJmb3JtYW5jZSBwZW5hbHR5IGlmIHRoaXMgaXMgZW5hYmxlZCBhbmQgaXQgaXMgcGVyZmVjdGx5IHN1aXRlZCB0byBiZWluZworICAgICAqIGVuYWJsZWQgaW4gYSBwcm9kdWN0aW9uIGVudmlyb25tZW50LCBhdCB0aGUgY29zdCBvZiBsb2dnaW5nIG92ZXJoZWFkLgorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgZGVidWcgaXMgZW5hYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEBzaW5jZSAyLjIzCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNEZWJ1ZygpOworCisgICAgLyoqCisgICAgICogVG8gZW5hYmxlIHZlcnkgbG93IGxldmVsIGxvZ2dpbmcgdGhpcyBjYW4gYmUgZW5hYmxlZC4gVGhpcyBnb2VzIGZhciBiZXlvbmQgbG9nZ2luZyBpc3N1ZXMgc3VjaAorICAgICAqIGFzIGNvbm5lY3Rpb24gZXN0YWJsaXNobWVudCBvZiByZXF1ZXN0IGRpc3BhdGNoLCBpdCBjYW4gdHJhY2UgdGhlIFRDUCBvcGVyYXRpb25zIGxhdGVuY2llcworICAgICAqIGludm9sdmVkLgorICAgICAqCisgICAgICogQHBhcmFtIGVuYWJsZSBpZiB7QGNvZGUgdHJ1ZX0gZGVidWcgdHJhY2luZyB3aWxsIGJlIGVuYWJsZWQuCisgICAgICogQHNpbmNlIDIuMjMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZWJ1Zyhib29sZWFuIGVuYWJsZSk7Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXJzL3NpbXBsZS1odHRwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2ltcGxlL1NpbXBsZVRyYWNlQW5hbHl6ZXIuamF2YSBiL2NvbnRhaW5lcnMvc2ltcGxlLWh0dHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zaW1wbGUvU2ltcGxlVHJhY2VBbmFseXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NzNkYTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXJzL3NpbXBsZS1odHRwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2ltcGxlL1NpbXBsZVRyYWNlQW5hbHl6ZXIuamF2YQpAQCAtMCwwICsxLDIwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zaW1wbGU7CisKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEubmlvLmNoYW5uZWxzLlNlbGVjdGFibGVDaGFubmVsOworaW1wb3J0IGphdmEudXRpbC5RdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TGlua2VkUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkRmFjdG9yeTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljTG9uZzsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLkV4dGVuZGVkTG9nZ2VyOworCitpbXBvcnQgb3JnLnNpbXBsZWZyYW1ld29yay5jb21tb24udGhyZWFkLkRhZW1vbkZhY3Rvcnk7CitpbXBvcnQgb3JnLnNpbXBsZWZyYW1ld29yay50cmFuc3BvcnQudHJhY2UuVHJhY2U7CitpbXBvcnQgb3JnLnNpbXBsZWZyYW1ld29yay50cmFuc3BvcnQudHJhY2UuVHJhY2VBbmFseXplcjsKKworLyoqCisgKiBUcmFjaW5nIGF0IGEgdmVyeSBsb3cgbGV2ZWwgY2FuIGJlIHBlcmZvcm1lZCB3aXRoIGEge0BsaW5rIFRyYWNlQW5hbHl6ZXJ9LiBUaGlzIHByb3ZpZGVzIG11Y2gKKyAqIG1vcmUgdXNlZnVsIGluZm9ybWF0aW9uIHRoYW4gdGhlIGNvbnZlbnRpb25hbCB7QGxpbmsgTG9nZ2luZ0ZpbHRlcn0gaW4gdGhhdCBpdCBwcm92aWRlcyBkZXRhaWxzCisgKiBhdCBhIHZlcnkgbG93IGxldmVsLiBUaGlzIGlzIHZlcnkgdXNlZnVsIHdoZW4gbW9uaXRvcmluZyBwZXJmb3JtYW5jZSBpbnRlcmFjdGlvbnMgYXQgdGhlIFRDUAorICogbGV2ZWwgYmV0d2VlbiBjbGllbnRzIGFuZCBzZXJ2ZXJzLgorICogPHAvPgorICogUGVyZm9ybWFuY2Ugb3ZlcmhlYWQgZm9yIHRoZSBzZXJ2ZXIgaXMgbWluaW1hbCBhcyBldmVudHMgYXJlIHB1bXBlZCBvdXQgaW4gYmF0Y2hlcy4gVGhlIGFtb3VudCBvZgorICogbG9nZ2luZyBpbmZvcm1hdGlvbiB3aWxsIGluY3JlYXNlIHF1aXRlIHNpZ25pZmljYW50bHkgdGhvdWdoLgorICoKKyAqIEBhdXRob3IgTmlhbGwgR2FsbGFnaGVyCisgKi8KK3B1YmxpYyBjbGFzcyBTaW1wbGVUcmFjZUFuYWx5emVyIGltcGxlbWVudHMgVHJhY2VBbmFseXplciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBFeHRlbmRlZExvZ2dlciBsb2dnZXIgPQorICAgICAgICAgICAgbmV3IEV4dGVuZGVkTG9nZ2VyKExvZ2dlci5nZXRMb2dnZXIoU2ltcGxlVHJhY2VBbmFseXplci5jbGFzcy5nZXROYW1lKCkpLCBMZXZlbC5GSU5FU1QpOworCisgICAgcHJpdmF0ZSBmaW5hbCBUcmFjZUNvbnN1bWVyIGNvbnN1bWVyOworICAgIHByaXZhdGUgZmluYWwgVGhyZWFkRmFjdG9yeSBmYWN0b3J5OworICAgIHByaXZhdGUgZmluYWwgQXRvbWljQm9vbGVhbiBhY3RpdmU7CisgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNMb25nIGNvdW50OworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBhc3luY2hyb25vdXMgdHJhY2UgZXZlbnQgbG9nZ2VyLgorICAgICAqLworICAgIHB1YmxpYyBTaW1wbGVUcmFjZUFuYWx5emVyKCkgeworICAgICAgICB0aGlzLmZhY3RvcnkgPSBuZXcgRGFlbW9uRmFjdG9yeShUcmFjZUNvbnN1bWVyLmNsYXNzKTsKKyAgICAgICAgdGhpcy5jb25zdW1lciA9IG5ldyBUcmFjZUNvbnN1bWVyKCk7CisgICAgICAgIHRoaXMuYWN0aXZlID0gbmV3IEF0b21pY0Jvb2xlYW4oKTsKKyAgICAgICAgdGhpcy5jb3VudCA9IG5ldyBBdG9taWNMb25nKCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNBY3RpdmUoKSB7CisgICAgICAgIHJldHVybiBhY3RpdmUuZ2V0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRyYWNlIGF0dGFjaChTZWxlY3RhYmxlQ2hhbm5lbCBjaGFubmVsKSB7CisgICAgICAgIGxvbmcgc2VxdWVuY2UgPSBjb3VudC5nZXRBbmRJbmNyZW1lbnQoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBUcmFjZUZlZWRlcihjaGFubmVsLCBzZXF1ZW5jZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQmVnaW4gbG9nZ2luZyB0cmFjZSBldmVudHMgdG8gdGhlIHVuZGVybHlpbmcgbG9nZ2VyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgeworICAgICAgICBpZiAoYWN0aXZlLmNvbXBhcmVBbmRTZXQoZmFsc2UsIHRydWUpKSB7CisgICAgICAgICAgICBUaHJlYWQgdGhyZWFkID0gZmFjdG9yeS5uZXdUaHJlYWQoY29uc3VtZXIpOworICAgICAgICAgICAgdGhyZWFkLnN0YXJ0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgeworICAgICAgICBhY3RpdmUuc2V0KGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFRyYWNlQ29uc3VtZXIgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBRdWV1ZTxUcmFjZVJlY29yZD4gcXVldWU7CisKKyAgICAgICAgcHVibGljIFRyYWNlQ29uc3VtZXIoKSB7CisgICAgICAgICAgICB0aGlzLnF1ZXVlID0gbmV3IENvbmN1cnJlbnRMaW5rZWRRdWV1ZTxUcmFjZVJlY29yZD4oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNvbnN1bWUoVHJhY2VSZWNvcmQgcmVjb3JkKSB7CisgICAgICAgICAgICBxdWV1ZS5vZmZlcihyZWNvcmQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoYWN0aXZlLmdldCgpKSB7CisgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKKyAgICAgICAgICAgICAgICAgICAgZHJhaW4oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJUcmFjZSBhbmFseXplciBlcnJvciIpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBkcmFpbigpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJUcmFjZSBhbmFseXplciBjb3VsZCBub3QgZHJhaW4gcXVldWUiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYWN0aXZlLnNldChmYWxzZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBkcmFpbigpIHsKKyAgICAgICAgICAgIHdoaWxlICghcXVldWUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgVHJhY2VSZWNvcmQgcmVjb3JkID0gcXVldWUucG9sbCgpOworCisgICAgICAgICAgICAgICAgaWYgKHJlY29yZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gcmVjb3JkLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgVHJhY2VGZWVkZXIgaW1wbGVtZW50cyBUcmFjZSB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZWxlY3RhYmxlQ2hhbm5lbCBjaGFubmVsOworICAgICAgICBwcml2YXRlIGZpbmFsIGxvbmcgc2VxdWVuY2U7CisKKyAgICAgICAgcHVibGljIFRyYWNlRmVlZGVyKFNlbGVjdGFibGVDaGFubmVsIGNoYW5uZWwsIGxvbmcgc2VxdWVuY2UpIHsKKyAgICAgICAgICAgIHRoaXMuc2VxdWVuY2UgPSBzZXF1ZW5jZTsKKyAgICAgICAgICAgIHRoaXMuY2hhbm5lbCA9IGNoYW5uZWw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdHJhY2UoT2JqZWN0IGV2ZW50KSB7CisgICAgICAgICAgICB0cmFjZShldmVudCwgbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdHJhY2UoT2JqZWN0IGV2ZW50LCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgICAgIGlmIChhY3RpdmUuZ2V0KCkpIHsKKyAgICAgICAgICAgICAgICBUcmFjZVJlY29yZCByZWNvcmQgPSBuZXcgVHJhY2VSZWNvcmQoY2hhbm5lbCwgZXZlbnQsIHZhbHVlLCBzZXF1ZW5jZSk7CisgICAgICAgICAgICAgICAgY29uc3VtZXIuY29uc3VtZShyZWNvcmQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFRyYWNlUmVjb3JkIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFNlbGVjdGFibGVDaGFubmVsIGNoYW5uZWw7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHRocmVhZDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgZXZlbnQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IHZhbHVlOworICAgICAgICBwcml2YXRlIGZpbmFsIGxvbmcgc2VxdWVuY2U7CisKKyAgICAgICAgcHVibGljIFRyYWNlUmVjb3JkKFNlbGVjdGFibGVDaGFubmVsIGNoYW5uZWwsIE9iamVjdCBldmVudCwgT2JqZWN0IHZhbHVlLCBsb25nIHNlcXVlbmNlKSB7CisgICAgICAgICAgICB0aGlzLnRocmVhZCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpOworICAgICAgICAgICAgdGhpcy5zZXF1ZW5jZSA9IHNlcXVlbmNlOworICAgICAgICAgICAgdGhpcy5jaGFubmVsID0gY2hhbm5lbDsKKyAgICAgICAgICAgIHRoaXMuZXZlbnQgPSBldmVudDsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICBTdHJpbmdXcml0ZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgICAgIFByaW50V3JpdGVyIHdyaXRlciA9IG5ldyBQcmludFdyaXRlcihidWlsZGVyKTsKKworICAgICAgICAgICAgd3JpdGVyLnByaW50KHNlcXVlbmNlKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludCgiICIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KGNoYW5uZWwpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgKCIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KHRocmVhZCk7CisgICAgICAgICAgICB3cml0ZXIucHJpbnQoIik6ICIpOworICAgICAgICAgICAgd3JpdGVyLnByaW50KGV2ZW50KTsKKworICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBUaHJvd2FibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgLT4gIik7CisgICAgICAgICAgICAgICAgICAgICgoVGhyb3dhYmxlKSB2YWx1ZSkucHJpbnRTdGFja1RyYWNlKHdyaXRlcik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyLnByaW50KCIgLT4gIik7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci5wcmludCh2YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGVyLmNsb3NlKCk7CisgICAgICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVycy9zaW1wbGUtaHR0cC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NpbXBsZS9wYWNrYWdlLWluZm8uamF2YSBiL2NvbnRhaW5lcnMvc2ltcGxlLWh0dHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zaW1wbGUvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdhNGQzOAotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lcnMvc2ltcGxlLWh0dHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zaW1wbGUvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoqCisgKiBKZXJzZXkgU2ltcGxlIDYueCBjb250YWluZXIgY2xhc3Nlcy4KKyAqLworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zaW1wbGU7CmRpZmYgLS1naXQgYS9jb250YWluZXJzL3NpbXBsZS1odHRwL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbnRhaW5lclByb3ZpZGVyIGIvY29udGFpbmVycy9zaW1wbGUtaHR0cC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5Db250YWluZXJQcm92aWRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGE0OTgxCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVycy9zaW1wbGUtaHR0cC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5Db250YWluZXJQcm92aWRlcgpAQCAtMCwwICsxIEBACitvcmcuZ2xhc3NmaXNoLmplcnNleS5zaW1wbGUuU2ltcGxlQ29udGFpbmVyUHJvdmlkZXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb250YWluZXJzL3NpbXBsZS1odHRwL3NyYy9tYWluL3Jlc291cmNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5zaW1wbGUuaW50ZXJuYWwvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMgYi9jb250YWluZXJzL3NpbXBsZS1odHRwL3NyYy9tYWluL3Jlc291cmNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5zaW1wbGUuaW50ZXJuYWwvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM4ZmE1YgotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lcnMvc2ltcGxlLWh0dHAvc3JjL21haW4vcmVzb3VyY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LnNpbXBsZS5pbnRlcm5hbC9sb2NhbGl6YXRpb24ucHJvcGVydGllcwpAQCAtMCwwICsxLDIwIEBACisjCisjIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorIworIyBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisjIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyMgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisjIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyMKKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisjCisKK2Vycm9yLndoZW4uY3JlYXRpbmcuc2VydmVyPUlPRXhjZXB0aW9uIHRocm93biB3aGVuIHRyeWluZyB0byBjcmVhdGUgc2ltcGxlIHNlcnZlci4KK3VyaS5jYW5ub3QuYmUubnVsbD1UaGUgVVJJIG11c3Qgbm90IGJlIG51bGwuCit3cm9uZy5zY2hlbWUud2hlbi51c2luZy5odHRwPVRoZSBVUkkgc2NoZW1lIHNob3VsZCBiZSAnaHR0cCcgd2hlbiBub3QgdXNpbmcgU1NMLgord3Jvbmcuc2NoZW1lLndoZW4udXNpbmcuaHR0cHM9VGhlIFVSSSBzY2hlbWUgc2hvdWxkIGJlICdodHRwcycgd2hlbiB1c2luZyBTU0wuCmRpZmYgLS1naXQgYS9jb250YWluZXJzL3NpbXBsZS1odHRwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2ltcGxlL0Fic3RyYWN0U2ltcGxlU2VydmVyVGVzdGVyLmphdmEgYi9jb250YWluZXJzL3NpbXBsZS1odHRwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2ltcGxlL0Fic3RyYWN0U2ltcGxlU2VydmVyVGVzdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI2NTNjYQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lcnMvc2ltcGxlLWh0dHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zaW1wbGUvQWJzdHJhY3RTaW1wbGVTZXJ2ZXJUZXN0ZXIuamF2YQpAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zaW1wbGU7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUHJvcGVydGllc0hlbHBlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKKworLyoqCisgKiBBYnN0cmFjdCBTaW1wbGUgSFRUUCBTZXJ2ZXIgdW5pdCB0ZXN0ZXIuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBBcnVsIERoZXNpYXNlZWxhbiAoYXJ1bGQgYXQgYWNtLm9yZykKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2ltcGxlU2VydmVyVGVzdGVyIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFWFQgPSAiIjsKKyAgICBwcml2YXRlIGZpbmFsIGludCBERUZBVUxUX1BPUlQgPSA5OTk4OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoQWJzdHJhY3RTaW1wbGVTZXJ2ZXJUZXN0ZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcG9ydCB0byBiZSB1c2VkIGZvciB0ZXN0IGFwcGxpY2F0aW9uIGRlcGxveW1lbnRzLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgSFRUUCBwb3J0IG9mIHRoZSBVUkkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgaW50IGdldFBvcnQoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSA9IEFjY2Vzc0NvbnRyb2xsZXIKKyAgICAgICAgICAgICAgICAuZG9Qcml2aWxlZ2VkKFByb3BlcnRpZXNIZWxwZXIuZ2V0U3lzdGVtUHJvcGVydHkoImplcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydCIpKTsKKyAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaSA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpOworICAgICAgICAgICAgICAgIGlmIChpIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bWJlckZvcm1hdEV4Y2VwdGlvbigiVmFsdWUgbm90IHBvc2l0aXZlLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmxvZygKKyAgICAgICAgICAgICAgICAgICAgICAgIExldmVsLkNPTkZJRywKKyAgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSBvZiAnamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0JyIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBwcm9wZXJ0eSBpcyBub3QgYSB2YWxpZCBwb3NpdGl2ZSBpbnRlZ2VyIFsiICsgdmFsdWUgKyAiXS4iCisgICAgICAgICAgICAgICAgICAgICAgICArICIgUmV2ZXJ0aW5nIHRvIGRlZmF1bHQgWyIgKyBERUZBVUxUX1BPUlQgKyAiXS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gREVGQVVMVF9QT1JUOworICAgIH0KKworICAgIHByaXZhdGUgdm9sYXRpbGUgU2ltcGxlU2VydmVyIHNlcnZlcjsKKworICAgIHB1YmxpYyBVcmlCdWlsZGVyIGdldFVyaSgpIHsKKyAgICAgICAgcmV0dXJuIFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdCIpLnBvcnQoZ2V0UG9ydCgpKS5wYXRoKENPTlRFWFQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHN0YXJ0U2VydmVyKENsYXNzLi4uIHJlc291cmNlcykgeworICAgICAgICBSZXNvdXJjZUNvbmZpZyBjb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcocmVzb3VyY2VzKTsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKExvZ2dpbmdGZWF0dXJlLmNsYXNzKTsKKyAgICAgICAgZmluYWwgVVJJIGJhc2VVcmkgPSBnZXRCYXNlVXJpKCk7CisgICAgICAgIHNlcnZlciA9IFNpbXBsZUNvbnRhaW5lckZhY3RvcnkuY3JlYXRlKGJhc2VVcmksIGNvbmZpZyk7CisgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuSU5GTywgIlNpbXBsZS1odHRwIHNlcnZlciBzdGFydGVkIG9uIGJhc2UgdXJpOiAiICsgYmFzZVVyaSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RhcnRTZXJ2ZXJOb0xvZ2dpbmdGaWx0ZXIoQ2xhc3MuLi4gcmVzb3VyY2VzKSB7CisgICAgICAgIFJlc291cmNlQ29uZmlnIGNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhyZXNvdXJjZXMpOworICAgICAgICBmaW5hbCBVUkkgYmFzZVVyaSA9IGdldEJhc2VVcmkoKTsKKyAgICAgICAgc2VydmVyID0gU2ltcGxlQ29udGFpbmVyRmFjdG9yeS5jcmVhdGUoYmFzZVVyaSwgY29uZmlnKTsKKyAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5JTkZPLCAiU2ltcGxlLWh0dHAgc2VydmVyIHN0YXJ0ZWQgb24gYmFzZSB1cmk6ICIgKyBiYXNlVXJpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdGFydFNlcnZlcihSZXNvdXJjZUNvbmZpZyBjb25maWcpIHsKKyAgICAgICAgZmluYWwgVVJJIGJhc2VVcmkgPSBnZXRCYXNlVXJpKCk7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIHNlcnZlciA9IFNpbXBsZUNvbnRhaW5lckZhY3RvcnkuY3JlYXRlKGJhc2VVcmksIGNvbmZpZyk7CisgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuSU5GTywgIlNpbXBsZS1odHRwIHNlcnZlciBzdGFydGVkIG9uIGJhc2UgdXJpOiAiICsgYmFzZVVyaSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc3RhcnRTZXJ2ZXIoUmVzb3VyY2VDb25maWcgY29uZmlnLCBpbnQgY291bnQsIGludCBzZWxlY3QpIHsKKyAgICAgICAgZmluYWwgVVJJIGJhc2VVcmkgPSBnZXRCYXNlVXJpKCk7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIHNlcnZlciA9IFNpbXBsZUNvbnRhaW5lckZhY3RvcnkuY3JlYXRlKGJhc2VVcmksIGNvbmZpZywgY291bnQsIHNlbGVjdCk7CisgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuSU5GTywgIlNpbXBsZS1odHRwIHNlcnZlciBzdGFydGVkIG9uIGJhc2UgdXJpOiAiICsgYmFzZVVyaSk7CisgICAgfQorCisgICAgcHVibGljIFVSSSBnZXRCYXNlVXJpKCkgeworICAgICAgICByZXR1cm4gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0LyIpLnBvcnQoZ2V0UG9ydCgpKS5idWlsZCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERlYnVnKGJvb2xlYW4gZW5hYmxlKSB7CisgICAgICAgIGlmIChzZXJ2ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgc2VydmVyLnNldERlYnVnKGVuYWJsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzdG9wU2VydmVyKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2VydmVyLmNsb3NlKCk7CisgICAgICAgICAgICBzZXJ2ZXIgPSBudWxsOworICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5JTkZPLCAiU2ltcGxlLWh0dHAgc2VydmVyIHN0b3BwZWQuIik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICBpZiAoc2VydmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN0b3BTZXJ2ZXIoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvbnRhaW5lcnMvc2ltcGxlLWh0dHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zaW1wbGUvQXN5bmNUZXN0LmphdmEgYi9jb250YWluZXJzL3NpbXBsZS1odHRwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2ltcGxlL0FzeW5jVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ODdiMDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXJzL3NpbXBsZS1odHRwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2ltcGxlL0FzeW5jVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTc1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNpbXBsZTsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZW91dEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkFzeW5jUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlN1c3BlbmRlZDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuVGltZW91dEhhbmRsZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIEBhdXRob3IgQXJ1bCBEaGVzaWFzZWVsYW4gKGFydWxkIGF0IGFjbS5vcmcpCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEFzeW5jVGVzdCBleHRlbmRzIEFic3RyYWN0U2ltcGxlU2VydmVyVGVzdGVyIHsKKworICAgIEBQYXRoKCIvYXN5bmMiKQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJWb2lkTWV0aG9kQW5ub3RhdGVkV2l0aEdFVCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBc3luY1Jlc291cmNlIHsKKworICAgICAgICBwdWJsaWMgc3RhdGljIEF0b21pY0ludGVnZXIgSU5WT0NBVElPTl9DT1VOVCA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIHZvaWQgYXN5bmNHZXQoQFN1c3BlbmRlZCBmaW5hbCBBc3luY1Jlc3BvbnNlIGFzeW5jUmVzcG9uc2UpIHsKKyAgICAgICAgICAgIG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVzdWx0ID0gdmVyeUV4cGVuc2l2ZU9wZXJhdGlvbigpOworICAgICAgICAgICAgICAgICAgICBhc3luY1Jlc3BvbnNlLnJlc3VtZShyZXN1bHQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByaXZhdGUgU3RyaW5nIHZlcnlFeHBlbnNpdmVPcGVyYXRpb24oKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uLiB2ZXJ5IGV4cGVuc2l2ZSBvcGVyYXRpb24gdGhhdCB0eXBpY2FsbHkgZmluaXNoZXMgd2l0aGluIDUgc2Vjb25kcywgc2ltdWxhdGVkIHVzaW5nCisgICAgICAgICAgICAgICAgICAgIC8vIHNsZWVwKCkKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCg1MDAwKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJET05FIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KS5zdGFydCgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgidGltZW91dCIpCisgICAgICAgIHB1YmxpYyB2b2lkIGFzeW5jR2V0V2l0aFRpbWVvdXQoQFN1c3BlbmRlZCBmaW5hbCBBc3luY1Jlc3BvbnNlIGFzeW5jUmVzcG9uc2UpIHsKKyAgICAgICAgICAgIGFzeW5jUmVzcG9uc2Uuc2V0VGltZW91dEhhbmRsZXIobmV3IFRpbWVvdXRIYW5kbGVyKCkgeworCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlVGltZW91dChmaW5hbCBBc3luY1Jlc3BvbnNlIGFzeW5jUmVzcG9uc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgYXN5bmNSZXNwb25zZS5yZXN1bWUoUmVzcG9uc2Uuc3RhdHVzKFJlc3BvbnNlLlN0YXR1cy5TRVJWSUNFX1VOQVZBSUxBQkxFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lbnRpdHkoIk9wZXJhdGlvbiB0aW1lIG91dC4iKS5idWlsZCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGFzeW5jUmVzcG9uc2Uuc2V0VGltZW91dCgzLCBUaW1lVW5pdC5TRUNPTkRTKTsKKworICAgICAgICAgICAgbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQgPSB2ZXJ5RXhwZW5zaXZlT3BlcmF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIGFzeW5jUmVzcG9uc2UucmVzdW1lKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdmVyeUV4cGVuc2l2ZU9wZXJhdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4uIHZlcnkgZXhwZW5zaXZlIG9wZXJhdGlvbiB0aGF0IHR5cGljYWxseSBmaW5pc2hlcyB3aXRoaW4gMTAgc2Vjb25kcywgc2ltdWxhdGVkIHVzaW5nCisgICAgICAgICAgICAgICAgICAgIC8vIHNsZWVwKCkKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCg3MDAwKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJET05FIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KS5zdGFydCgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgibXVsdGlwbGUtaW52b2NhdGlvbnMiKQorICAgICAgICBwdWJsaWMgdm9pZCBhc3luY011bHRpcGxlSW52b2NhdGlvbnMoQFN1c3BlbmRlZCBmaW5hbCBBc3luY1Jlc3BvbnNlIGFzeW5jUmVzcG9uc2UpIHsKKyAgICAgICAgICAgIElOVk9DQVRJT05fQ09VTlQuaW5jcmVtZW50QW5kR2V0KCk7CisKKyAgICAgICAgICAgIG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgYXN5bmNSZXNwb25zZS5yZXN1bWUoIk9LIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkuc3RhcnQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgQ2xpZW50IGNsaWVudDsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdGFydFNlcnZlcihBc3luY1Jlc291cmNlLmNsYXNzKTsKKyAgICAgICAgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICAgICAgY2xpZW50ID0gbnVsbDsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luY0dldCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgRnV0dXJlPFJlc3BvbnNlPiByZXNwb25zZUZ1dHVyZSA9CisgICAgICAgICAgICAgICAgY2xpZW50LnRhcmdldChnZXRVcmkoKS5wYXRoKCIvYXN5bmMiKSkucmVxdWVzdCgpLmFzeW5jKCkuZ2V0KCk7CisgICAgICAgIC8vIFJlcXVlc3QgaXMgYmVpbmcgcHJvY2Vzc2VkIGFzeW5jaHJvbm91c2x5LgorICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHJlc3BvbnNlRnV0dXJlLmdldCgpOworICAgICAgICAvLyBnZXQoKSB3YWl0cyBmb3IgdGhlIHJlc3BvbnNlCisgICAgICAgIGFzc2VydEVxdWFscygiRE9ORSIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNHZXRXaXRoVGltZW91dCgpCisgICAgICAgICAgICB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgVGltZW91dEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEZ1dHVyZTxSZXNwb25zZT4gcmVzcG9uc2VGdXR1cmUgPQorICAgICAgICAgICAgICAgIGNsaWVudC50YXJnZXQoZ2V0VXJpKCkucGF0aCgiL2FzeW5jL3RpbWVvdXQiKSkucmVxdWVzdCgpLmFzeW5jKCkuZ2V0KCk7CisgICAgICAgIC8vIFJlcXVlc3QgaXMgYmVpbmcgcHJvY2Vzc2VkIGFzeW5jaHJvbm91c2x5LgorICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHJlc3BvbnNlRnV0dXJlLmdldCgpOworCisgICAgICAgIC8vIGdldCgpIHdhaXRzIGZvciB0aGUgcmVzcG9uc2UKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUwMywgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk9wZXJhdGlvbiB0aW1lIG91dC4iLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEpFUlNFWS0yNjE2IHJlcHJvZHVjZXIuIE1ha2Ugc3VyZSByZXNvdXJjZSBtZXRob2QgaXMgb25seSBpbnZva2VkIG9uY2UgcGVyIG9uZSByZXF1ZXN0LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFzeW5jTXVsdGlwbGVJbnZvY2F0aW9ucygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9CisgICAgICAgICAgICAgICAgY2xpZW50LnRhcmdldChnZXRVcmkoKS5wYXRoKCIvYXN5bmMvbXVsdGlwbGUtaW52b2NhdGlvbnMiKSkucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydFRoYXQoQXN5bmNSZXNvdXJjZS5JTlZPQ0FUSU9OX0NPVU5ULmdldCgpLCBpcygxKSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBpcygiT0siKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVycy9zaW1wbGUtaHR0cC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NpbXBsZS9FeGNlcHRpb25UZXN0LmphdmEgYi9jb250YWluZXJzL3NpbXBsZS1odHRwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2ltcGxlL0V4Y2VwdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWU3YjI4Ci0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVycy9zaW1wbGUtaHR0cC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NpbXBsZS9FeGNlcHRpb25UZXN0LmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zaW1wbGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitwdWJsaWMgY2xhc3MgRXhjZXB0aW9uVGVzdCBleHRlbmRzIEFic3RyYWN0U2ltcGxlU2VydmVyVGVzdGVyIHsKKyAgICBAUGF0aCgie3N0YXR1c30iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXhjZXB0aW9uUmVzb3VyY2UgeworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KEBQYXRoUGFyYW0oInN0YXR1cyIpIGludCBzdGF0dXMpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbihzdGF0dXMpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3Q0MDBTdGF0dXNDb2RlKCkgeworICAgICAgICBzdGFydFNlcnZlcihFeGNlcHRpb25SZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpOworICAgICAgICBXZWJUYXJnZXQgciA9IGNsaWVudC50YXJnZXQoZ2V0VXJpKCkucGF0aCgiNDAwIikuYnVpbGQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIHIucmVxdWVzdCgpLmdldChSZXNwb25zZS5jbGFzcykuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdDUwMFN0YXR1c0NvZGUoKSB7CisgICAgICAgIHN0YXJ0U2VydmVyKEV4Y2VwdGlvblJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KCk7CisgICAgICAgIFdlYlRhcmdldCByID0gY2xpZW50LnRhcmdldChnZXRVcmkoKS5wYXRoKCI1MDAiKS5idWlsZCgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNTAwLCByLnJlcXVlc3QoKS5nZXQoUmVzcG9uc2UuY2xhc3MpLmdldFN0YXR1cygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb250YWluZXJzL3NpbXBsZS1odHRwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2ltcGxlL0xpZmVjeWNsZUxpc3RlbmVyVGVzdC5qYXZhIGIvY29udGFpbmVycy9zaW1wbGUtaHR0cC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NpbXBsZS9MaWZlY3ljbGVMaXN0ZW5lclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzliN2QyCi0tLSAvZGV2L251bGwKKysrIGIvY29udGFpbmVycy9zaW1wbGUtaHR0cC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NpbXBsZS9MaWZlY3ljbGVMaXN0ZW5lclRlc3QuamF2YQpAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zaW1wbGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5BYnN0cmFjdENvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29udGFpbmVyOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisKKy8qKgorICogUmVsb2FkIGFuZCBDb250YWluZXJMaWZlY3ljbGVMaXN0ZW5lciBzdXBwb3J0IHRlc3QuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIExpZmVjeWNsZUxpc3RlbmVyVGVzdCBleHRlbmRzIEFic3RyYWN0U2ltcGxlU2VydmVyVGVzdGVyIHsKKworICAgIEBQYXRoKCIvb25lIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE9uZSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gIm9uZSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL3R3byIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUd28geworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJ0d28iOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZWxvYWRlciBleHRlbmRzIEFic3RyYWN0Q29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXIgeworICAgICAgICBDb250YWluZXIgY29udGFpbmVyOworCisgICAgICAgIHB1YmxpYyB2b2lkIHJlbG9hZChSZXNvdXJjZUNvbmZpZyBuZXdDb25maWcpIHsKKyAgICAgICAgICAgIGNvbnRhaW5lci5yZWxvYWQobmV3Q29uZmlnKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHJlbG9hZCgpIHsKKyAgICAgICAgICAgIGNvbnRhaW5lci5yZWxvYWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0dXAoQ29udGFpbmVyIGNvbnRhaW5lcikgeworICAgICAgICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7CisgICAgICAgIH0KKworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlbG9hZCgpIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmMgPSBuZXcgUmVzb3VyY2VDb25maWcoT25lLmNsYXNzKTsKKworICAgICAgICBSZWxvYWRlciByZWxvYWRlciA9IG5ldyBSZWxvYWRlcigpOworICAgICAgICByYy5yZWdpc3Rlckluc3RhbmNlcyhyZWxvYWRlcik7CisKKyAgICAgICAgc3RhcnRTZXJ2ZXIocmMpOworCisgICAgICAgIFdlYlRhcmdldCByID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKS50YXJnZXQoZ2V0VXJpKCkucGF0aCgiLyIpLmJ1aWxkKCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygib25lIiwgci5wYXRoKCJvbmUiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDA0LCByLnBhdGgoInR3byIpLnJlcXVlc3QoKS5nZXQoUmVzcG9uc2UuY2xhc3MpLmdldFN0YXR1cygpKTsKKworICAgICAgICAvLyBhZGQgVHdvIHJlc291cmNlCisgICAgICAgIHJlbG9hZGVyLnJlbG9hZChuZXcgUmVzb3VyY2VDb25maWcoT25lLmNsYXNzLCBUd28uY2xhc3MpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIm9uZSIsIHIucGF0aCgib25lIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0d28iLCByLnBhdGgoInR3byIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFN0YXJ0U3RvcExpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RDb250YWluZXJMaWZlY3ljbGVMaXN0ZW5lciB7CisgICAgICAgIHZvbGF0aWxlIGJvb2xlYW4gc3RhcnRlZDsKKyAgICAgICAgdm9sYXRpbGUgYm9vbGVhbiBzdG9wcGVkOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0dXAoQ29udGFpbmVyIGNvbnRhaW5lcikgeworICAgICAgICAgICAgc3RhcnRlZCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TaHV0ZG93bihDb250YWluZXIgY29udGFpbmVyKSB7CisgICAgICAgICAgICBzdG9wcGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YXJ0dXBTaHV0ZG93bkhvb2tzKCkgeworICAgICAgICBmaW5hbCBTdGFydFN0b3BMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBTdGFydFN0b3BMaXN0ZW5lcigpOworCisgICAgICAgIHN0YXJ0U2VydmVyKG5ldyBSZXNvdXJjZUNvbmZpZyhPbmUuY2xhc3MpLnJlZ2lzdGVyKGxpc3RlbmVyKSk7CisKKyAgICAgICAgV2ViVGFyZ2V0IHIgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpLnRhcmdldChnZXRVcmkoKS5wYXRoKCIvIikuYnVpbGQoKSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyLnBhdGgoIm9uZSIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbygib25lIikpOworICAgICAgICBhc3NlcnRUaGF0KHIucGF0aCgidHdvIikucmVxdWVzdCgpLmdldChSZXNwb25zZS5jbGFzcykuZ2V0U3RhdHVzKCksIGVxdWFsVG8oNDA0KSk7CisKKyAgICAgICAgc3RvcFNlcnZlcigpOworCisgICAgICAgIGFzc2VydFRydWUoIkNvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyLm9uU3RhcnR1cCBoYXMgbm90IGJlZW4gY2FsbGVkLiIsIGxpc3RlbmVyLnN0YXJ0ZWQpOworICAgICAgICBhc3NlcnRUcnVlKCJDb250YWluZXJMaWZlY3ljbGVMaXN0ZW5lci5vblNodXRkb3duIGhhcyBub3QgYmVlbiBjYWxsZWQuIiwgbGlzdGVuZXIuc3RvcHBlZCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVycy9zaW1wbGUtaHR0cC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NpbXBsZS9PcHRpb25zVGVzdC5qYXZhIGIvY29udGFpbmVycy9zaW1wbGUtaHR0cC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NpbXBsZS9PcHRpb25zVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMTJiMWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb250YWluZXJzL3NpbXBsZS1odHRwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2ltcGxlL09wdGlvbnNUZXN0LmphdmEKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zaW1wbGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworcHVibGljIGNsYXNzIE9wdGlvbnNUZXN0IGV4dGVuZHMgQWJzdHJhY3RTaW1wbGVTZXJ2ZXJUZXN0ZXIgeworCisgICAgQFBhdGgoImhlbGxvd29ybGQiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSGVsbG9Xb3JsZFJlc291cmNlIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJQ0hFRF9NRVNTQUdFID0gIkhlbGxvIFdvcmxkISI7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEhlbGxvKCkgeworICAgICAgICAgICAgcmV0dXJuIENMSUNIRURfTUVTU0FHRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvdXNlcnMiKQorICAgIHB1YmxpYyBjbGFzcyBVc2VyUmVzb3VyY2UgeworCisgICAgICAgIEBQYXRoKCIvY3VycmVudCIpCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDdXJyZW50VXNlcigpIHsKKyAgICAgICAgICAgIHJldHVybiAiY3VycmVudCB1c2VyIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgQ2xpZW50IGNsaWVudDsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdGFydFNlcnZlcihIZWxsb1dvcmxkUmVzb3VyY2UuY2xhc3MsIFVzZXJSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgICAgIGNsaWVudCA9IG51bGw7CisgICAgfQorCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGb29CYXJPcHRpb25zKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9CisgICAgICAgICAgICAgICAgY2xpZW50LnRhcmdldChnZXRVcmkoKSkucGF0aCgiaGVsbG93b3JsZCIpLnJlcXVlc3QoKS5oZWFkZXIoIkFjY2VwdCIsICJmb28vYmFyIikub3B0aW9ucygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBhbGxvd0hlYWRlciA9IHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiQWxsb3ciKTsKKyAgICAgICAgX2NoZWNrQWxsb3dDb250ZW50KGFsbG93SGVhZGVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHJlc3BvbnNlLmdldExlbmd0aCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28vYmFyIiwgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF9jaGVja0FsbG93Q29udGVudChmaW5hbCBTdHJpbmcgY29udGVudCkgeworICAgICAgICBhc3NlcnRUcnVlKGNvbnRlbnQuY29udGFpbnMoIkdFVCIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb250ZW50LmNvbnRhaW5zKCJIRUFEIikpOworICAgICAgICBhc3NlcnRUcnVlKGNvbnRlbnQuY29udGFpbnMoIk9QVElPTlMiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9EZWZhdWx0TWV0aG9kKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IGNsaWVudC50YXJnZXQoZ2V0VXJpKCkpLnBhdGgoIi91c2VycyIpLnJlcXVlc3QoKS5vcHRpb25zKCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDQwNCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVycy9zaW1wbGUtaHR0cC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NpbXBsZS9QYXJhbGxlbFRlc3QuamF2YSBiL2NvbnRhaW5lcnMvc2ltcGxlLWh0dHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zaW1wbGUvUGFyYWxsZWxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBiNjYxMQotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lcnMvc2ltcGxlLWh0dHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zaW1wbGUvUGFyYWxsZWxUZXN0LmphdmEKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2ltcGxlOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3RzIHRoZSBwYXJhbGxlbCBleGVjdXRpb24gb2YgbXVsdGlwbGUgcmVxdWVzdHMuCisgKgorICogQGF1dGhvciBTdGVwYW4gS29wcml2YQorICogQGF1dGhvciBBcnVsIERoZXNpYXNlZWxhbiAoYXJ1bGQgYXQgYWNtLm9yZykKKyAqLworcHVibGljIGNsYXNzIFBhcmFsbGVsVGVzdCBleHRlbmRzIEFic3RyYWN0U2ltcGxlU2VydmVyVGVzdGVyIHsKKworICAgIC8vIFNlcnZlci1zaWRlIGRpc3BhdGNoZXIgYW5kIHNlbGVjdG9yIHBvb2wgY29uZmlndXJhdGlvbgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBzZWxlY3RvclRocmVhZHMgPSBSdW50aW1lLmdldFJ1bnRpbWUoKS5hdmFpbGFibGVQcm9jZXNzb3JzKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGRpc3BhdGNoZXJUaHJlYWRzID0gTWF0aC5tYXgoOCwgc2VsZWN0b3JUaHJlYWRzICogMik7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgbnVtYmVyT2ZUaHJlYWRzID0gMTAwOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBVEggPSAidGVzdCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgQXRvbWljSW50ZWdlciByZWNlaXZlZENvdW50ZXIgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKKyAgICBwcml2YXRlIHN0YXRpYyBBdG9taWNJbnRlZ2VyIHJlc291cmNlQ291bnRlciA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOworICAgIHByaXZhdGUgc3RhdGljIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKG51bWJlck9mVGhyZWFkcyk7CisKKyAgICBAUGF0aChQQVRIKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHRoaXMuc2xlZXAoKTsKKyAgICAgICAgICAgIHJlc291cmNlQ291bnRlci5hZGRBbmRHZXQoMSk7CisgICAgICAgICAgICByZXR1cm4gIkdFVCI7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgc2xlZXAoKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoUGFyYWxsZWxUZXN0LmNsYXNzLmdldE5hbWUoKSkubG9nKExldmVsLlNFVkVSRSwgbnVsbCwgZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBSZXNvdXJjZVRocmVhZCBleHRlbmRzIFRocmVhZCB7CisKKyAgICAgICAgcHJpdmF0ZSBXZWJUYXJnZXQgdGFyZ2V0OworICAgICAgICBwcml2YXRlIFN0cmluZyBwYXRoOworCisgICAgICAgIHB1YmxpYyBSZXNvdXJjZVRocmVhZChXZWJUYXJnZXQgdGFyZ2V0LCBTdHJpbmcgcGF0aCkgeworICAgICAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7CisgICAgICAgICAgICB0aGlzLnBhdGggPSBwYXRoOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiR0VUIiwgdGFyZ2V0LnBhdGgocGF0aCkucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgICAgIHJlY2VpdmVkQ291bnRlci5hZGRBbmRHZXQoMSk7CisgICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhcmFsbGVsKCkgeworICAgICAgICBSZXNvdXJjZUNvbmZpZyBjb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoTXlSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHN0YXJ0U2VydmVyKGNvbmZpZywgZGlzcGF0Y2hlclRocmVhZHMsIHNlbGVjdG9yVGhyZWFkcyk7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpLnRhcmdldChnZXRVcmkoKS5wYXRoKCIvIikuYnVpbGQoKSk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbnVtYmVyT2ZUaHJlYWRzOyBpKyspIHsKKyAgICAgICAgICAgIFJlc291cmNlVGhyZWFkIHJ0ID0gbmV3IFJlc291cmNlVGhyZWFkKHRhcmdldCwgUEFUSCk7CisgICAgICAgICAgICBydC5zdGFydCgpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxhdGNoLmF3YWl0KDgwMDAsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKFBhcmFsbGVsVGVzdC5jbGFzcy5nZXROYW1lKCkpLmxvZyhMZXZlbC5TRVZFUkUsIG51bGwsIGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIGludCByZXN1bHQgPSByZWNlaXZlZENvdW50ZXIuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhudW1iZXJPZlRocmVhZHMsIHJlc3VsdCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29udGFpbmVycy9zaW1wbGUtaHR0cC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NpbXBsZS9UcmFjZVRlc3QuamF2YSBiL2NvbnRhaW5lcnMvc2ltcGxlLWh0dHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zaW1wbGUvVHJhY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUyZDczNwotLS0gL2Rldi9udWxsCisrKyBiL2NvbnRhaW5lcnMvc2ltcGxlLWh0dHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zaW1wbGUvVHJhY2VUZXN0LmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2ltcGxlOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK3B1YmxpYyBjbGFzcyBUcmFjZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFNpbXBsZVNlcnZlclRlc3RlciB7CisKKyAgICBAUGF0aCgiaGVsbG93b3JsZCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBIZWxsb1dvcmxkUmVzb3VyY2UgeworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTElDSEVEX01FU1NBR0UgPSAiSGVsbG8gV29ybGQhIjsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SGVsbG8oKSB7CisgICAgICAgICAgICByZXR1cm4gQ0xJQ0hFRF9NRVNTQUdFOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi91c2VycyIpCisgICAgcHVibGljIGNsYXNzIFVzZXJSZXNvdXJjZSB7CisKKyAgICAgICAgQFBhdGgoIi9jdXJyZW50IikKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEN1cnJlbnRVc2VyKCkgeworICAgICAgICAgICAgcmV0dXJuICJjdXJyZW50IHVzZXIiOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBDbGllbnQgY2xpZW50OworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN0YXJ0U2VydmVyTm9Mb2dnaW5nRmlsdGVyKEhlbGxvV29ybGRSZXNvdXJjZS5jbGFzcywgVXNlclJlc291cmNlLmNsYXNzKTsgLy8gZGlzYWJsZSBjcnVkZQorICAgICAgICAvLyBMb2dnaW5nRmlsdGVyCisgICAgICAgIHNldERlYnVnKHRydWUpOworICAgICAgICBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgICAgICBjbGllbnQgPSBudWxsOworICAgIH0KKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9vQmFyT3B0aW9ucygpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgeworICAgICAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSBjbGllbnQudGFyZ2V0KGdldFVyaSgpKS5wYXRoKCJoZWxsb3dvcmxkIikucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5oZWFkZXIoIkFjY2VwdCIsICJmb28vYmFyIikub3B0aW9ucygpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFsbG93SGVhZGVyID0gcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJBbGxvdyIpOworICAgICAgICAgICAgX2NoZWNrQWxsb3dDb250ZW50KGFsbG93SGVhZGVyKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCByZXNwb25zZS5nZXRMZW5ndGgoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImZvby9iYXIiLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKS50b1N0cmluZygpKTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTApOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF9jaGVja0FsbG93Q29udGVudChmaW5hbCBTdHJpbmcgY29udGVudCkgeworICAgICAgICBhc3NlcnRUcnVlKGNvbnRlbnQuY29udGFpbnMoIkdFVCIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb250ZW50LmNvbnRhaW5zKCJIRUFEIikpOworICAgICAgICBhc3NlcnRUcnVlKGNvbnRlbnQuY29udGFpbnMoIk9QVElPTlMiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9EZWZhdWx0TWV0aG9kKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IGNsaWVudC50YXJnZXQoZ2V0VXJpKCkpLnBhdGgoIi91c2VycyIpLnJlcXVlc3QoKS5vcHRpb25zKCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDQwNCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY2xpZW50L3BvbS54bWwgYi9jb3JlLWNsaWVudC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYjVlYWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNsaWVudC9wb20ueG1sCkBAIC0wLDAgKzEsMTYyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZTwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY2xpZW50PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LWNvcmUtY2xpZW50PC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPkplcnNleSBjb3JlIGNsaWVudCBpbXBsZW1lbnRhdGlvbjwvZGVzY3JpcHRpb24+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLmlzdGFjazwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1pc3RhY2stY29tbW9ucy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YnVpbGQtaGVscGVyLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHNvdXJjZT4ke2phdmEudmVyc2lvbn08L3NvdXJjZT4KKyAgICAgICAgICAgICAgICAgICAgPHRhcmdldD4ke2phdmEudmVyc2lvbn08L3RhcmdldD4KKyAgICAgICAgICAgICAgICAgICAgPGNvbXBpbGVyQXJndW1lbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEbyBub3Qgd2FybiBhYm91dCB1c2luZyBzdW4ubWlzYy5VbnNhZmUgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8WERpZ25vcmUuc3ltYm9sLmZpbGUgLz4KKyAgICAgICAgICAgICAgICAgICAgPC9jb21waWxlckFyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICAgICAgPHNob3dXYXJuaW5ncz5mYWxzZTwvc2hvd1dhcm5pbmdzPgorICAgICAgICAgICAgICAgICAgICA8Zm9yaz5mYWxzZTwvZm9yaz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPCEtLSBFeGVjdXRlIHRlc3QgY2xhc3NlcyBpbiBwYXJhbGxlbCAtIDEgdGhyZWFkIHBlciBDUFUgY29yZS4gLS0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhbGxlbD5jbGFzc2VzQW5kTWV0aG9kczwvcGFyYWxsZWw+CisgICAgICAgICAgICAgICAgICAgIDxwZXJDb3JlVGhyZWFkQ291bnQ+dHJ1ZTwvcGVyQ29yZVRocmVhZENvdW50PgorICAgICAgICAgICAgICAgICAgICA8dGhyZWFkQ291bnQ+MTwvdGhyZWFkQ291bnQ+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisKKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+ZGVmYXVsdC1qYXI8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmZlbGl4PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWJ1bmRsZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LndzLnJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXgud3MucnMtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbW1vbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5oazIuZXh0ZXJuYWw8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5pbmplY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5oYW1jcmVzdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmhhbWNyZXN0LWxpYnJhcnk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5tb2NraXRvPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bW9ja2l0by1hbGw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1oazI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+c29uYXI8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBkaXNhYmxlICdyZXVzZUZvcmtzJyBiZWNhdXNlICdBdXRvRGlzY292ZXJhYmxlQ2xpZW50VGVzdC50ZXN0QXV0b0Rpc2NvdmVyYWJsZUNsb3NpbmcnIHRlc3QgZmFpbHMgaWYgZXhlY3V0ZWQgdG9nZXRoZXIgd2l0aCBKYUNvQ28gYWdlbnQgd2l0aCBvdGhlciB0ZXN0cyBpbiBhIHNpbmdsZSBKVk0gLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJldXNlRm9ya3M+ZmFsc2U8L3JldXNlRm9ya3M+CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGRpc2FibGUgSmFDb0NvIGxpc3RlbmVyIGJlY2F1c2Ugd2l0aCBzd2l0Y2hlZCAncmV1c2VGb3JrcycgdG8gJ2ZhbHNlJyAoZHVlIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9qaXJhLnNvbmFyc291cmNlLmNvbS9icm93c2UvU09OQVJKQVZBLTcyOCAoaHR0cHM6Ly9naXRodWIuY29tL1NvbmFyU291cmNlL3NvbmFyLWphdmEvcHVsbC8zMjQpIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0aWVzIGNvbWJpbmUuc2VsZj0ib3ZlcnJpZGUiIC8+CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHBhcmFsbGVsIGV4ZWN1dGlvbiBkb2Vzbid0IG5lZWQgdG8gYmUgZGlzYWJsZWQgc2luY2UgSmFDb0NvIGxpc3RlbmVyIGlzIGRpc2FibGVkIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvY29yZS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvQWJvcnRFeGNlcHRpb24uamF2YSBiL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0Fib3J0RXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE4MWFmZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0Fib3J0RXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworCisvKioKKyAqIEludGVybmFsIGV4Y2VwdGlvbiBpbmRpY2F0aW5nIHRoYXQgcmVxdWVzdCBwcm9jZXNzaW5nIGhhcyBiZWVuIGFib3J0ZWQKKyAqIGluIHRoZSByZXF1ZXN0IGZpbHRlciBwcm9jZXNzaW5nIGNoYWluLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKgorICogQHNlZSBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdENvbnRleHQjYWJvcnRXaXRoKGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2UpCisgKi8KK2NsYXNzIEFib3J0RXhjZXB0aW9uIGV4dGVuZHMgUHJvY2Vzc2luZ0V4Y2VwdGlvbiB7CisgICAgcHJpdmF0ZSBmaW5hbCB0cmFuc2llbnQgQ2xpZW50UmVzcG9uc2UgYWJvcnRSZXNwb25zZTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgYWJvcnQgZXhjZXB0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGFib3J0UmVzcG9uc2UgYWJvcnQgcmVzcG9uc2UuCisgICAgICovCisgICAgQWJvcnRFeGNlcHRpb24oQ2xpZW50UmVzcG9uc2UgYWJvcnRSZXNwb25zZSkgeworICAgICAgICBzdXBlcigiUmVxdWVzdCBwcm9jZXNzaW5nIGhhcyBiZWVuIGFib3J0ZWQiKTsKKyAgICAgICAgdGhpcy5hYm9ydFJlc3BvbnNlID0gYWJvcnRSZXNwb25zZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGFib3J0IHJlc3BvbnNlIHRoYXQgY2F1c2VkIHRoaXMgZXhjZXB0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBhYm9ydCByZXNwb25zZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xpZW50UmVzcG9uc2UgZ2V0QWJvcnRSZXNwb25zZSgpIHsKKyAgICAgICAgcmV0dXJuIGFib3J0UmVzcG9uc2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvQWJzdHJhY3RSeEludm9rZXIuamF2YSBiL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0Fic3RyYWN0UnhJbnZva2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGViNGJkMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0Fic3RyYWN0UnhJbnZva2VyLmphdmEKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50OworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuUnhJbnZva2VyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5TeW5jSW52b2tlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkdlbmVyaWNUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKKy8qKgorICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgamF2YXgud3MucnMuY2xpZW50LnJ4LlJ4SW52b2tlciByZWFjdGl2ZSBpbnZva2VyfS4gRXh0ZW5zaW9ucyBvZiB0aGlzIGNsYXNzIGFyZQorICogc3VwcG9zZWQgdG8gaW1wbGVtZW50IHtAbGluayAjbWV0aG9kKFN0cmluZywgRW50aXR5LCBDbGFzcyl9IGFuZAorICoge0BsaW5rICNtZXRob2QoU3RyaW5nLCBFbnRpdHksIEdlbmVyaWNUeXBlKX0gbWV0aG9kcyB0byB3aGljaCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIHJlc3QKKyAqIG9mIHRoZSBtZXRob2RzIGZyb20gdGhlIGNvbnRyYWN0IGRlbGVnYXRlIHRvLgorICoKKyAqIEBwYXJhbSA8VD4gdGhlIGFzeW5jaHJvbm91cy9ldmVudC1iYXNlZCBjb21wbGV0aW9uIGF3YXJlIHR5cGUuIFRoZSBnaXZlbiB0eXBlIHNob3VsZCBiZSBwYXJhbWV0cml6ZWQgd2l0aCB0aGUgYWN0dWFsCisgKiAgICAgICAgICAgIHJlc3BvbnNlIHR5cGUuCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqIEBzaW5jZSAyLjI2CisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJ4SW52b2tlcjxUPiBpbXBsZW1lbnRzIFJ4SW52b2tlcjxUPiB7CisKKyAgICBwcml2YXRlIGZpbmFsIFN5bmNJbnZva2VyIHN5bmNJbnZva2VyOworICAgIHByaXZhdGUgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yU2VydmljZTsKKworICAgIHB1YmxpYyBBYnN0cmFjdFJ4SW52b2tlcihmaW5hbCBTeW5jSW52b2tlciBzeW5jSW52b2tlciwgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yKSB7CisgICAgICAgIGlmIChzeW5jSW52b2tlciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZvY2F0aW9uIGJ1aWxkZXIgY2Fubm90IGJlIG51bGwuIik7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLnN5bmNJbnZva2VyID0gc3luY0ludm9rZXI7CisgICAgICAgIHRoaXMuZXhlY3V0b3JTZXJ2aWNlID0gZXhlY3V0b3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGludm9jYXRpb24gYnVpbGRlciB0aGlzIHJlYWN0aXZlIGludm9rZXIgd2FzIGluaXRpYWxpemVkIHdpdGguCisgICAgICoKKyAgICAgKiBAcmV0dXJuIG5vbi1udWxsIGludm9jYXRpb24gYnVpbGRlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3luY0ludm9rZXIgZ2V0U3luY0ludm9rZXIoKSB7CisgICAgICAgIHJldHVybiBzeW5jSW52b2tlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gZXhlY3V0b3JTZXJ2aWNlIHNlcnZpY2UgdGhpcyByZWFjdGl2ZSBpbnZva2VyIHdhcyBpbml0aWFsaXplZCB3aXRoLgorICAgICAqCisgICAgICogQHJldHVybiBleGVjdXRvclNlcnZpY2Ugc2VydmljZSBpbnN0YW5jZSBvciB7QGNvZGUgbnVsbH0uCisgICAgICovCisgICAgcHJvdGVjdGVkIEV4ZWN1dG9yU2VydmljZSBnZXRFeGVjdXRvclNlcnZpY2UoKSB7CisgICAgICAgIHJldHVybiBleGVjdXRvclNlcnZpY2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFQgZ2V0KCkgeworICAgICAgICByZXR1cm4gbWV0aG9kKCJHRVQiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFI+IFQgZ2V0KGZpbmFsIENsYXNzPFI+IHJlc3BvbnNlVHlwZSkgeworICAgICAgICByZXR1cm4gbWV0aG9kKCJHRVQiLCByZXNwb25zZVR5cGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8Uj4gVCBnZXQoZmluYWwgR2VuZXJpY1R5cGU8Uj4gcmVzcG9uc2VUeXBlKSB7CisgICAgICAgIHJldHVybiBtZXRob2QoIkdFVCIsIHJlc3BvbnNlVHlwZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFQgcHV0KGZpbmFsIEVudGl0eTw/PiBlbnRpdHkpIHsKKyAgICAgICAgcmV0dXJuIG1ldGhvZCgiUFVUIiwgZW50aXR5KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFI+IFQgcHV0KGZpbmFsIEVudGl0eTw/PiBlbnRpdHksIGZpbmFsIENsYXNzPFI+IGNsYXp6KSB7CisgICAgICAgIHJldHVybiBtZXRob2QoIlBVVCIsIGVudGl0eSwgY2xhenopOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8Uj4gVCBwdXQoZmluYWwgRW50aXR5PD8+IGVudGl0eSwgZmluYWwgR2VuZXJpY1R5cGU8Uj4gdHlwZSkgeworICAgICAgICByZXR1cm4gbWV0aG9kKCJQVVQiLCBlbnRpdHksIHR5cGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUIHBvc3QoZmluYWwgRW50aXR5PD8+IGVudGl0eSkgeworICAgICAgICByZXR1cm4gbWV0aG9kKCJQT1NUIiwgZW50aXR5KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFI+IFQgcG9zdChmaW5hbCBFbnRpdHk8Pz4gZW50aXR5LCBmaW5hbCBDbGFzczxSPiBjbGF6eikgeworICAgICAgICByZXR1cm4gbWV0aG9kKCJQT1NUIiwgZW50aXR5LCBjbGF6eik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxSPiBUIHBvc3QoZmluYWwgRW50aXR5PD8+IGVudGl0eSwgZmluYWwgR2VuZXJpY1R5cGU8Uj4gdHlwZSkgeworICAgICAgICByZXR1cm4gbWV0aG9kKCJQT1NUIiwgZW50aXR5LCB0eXBlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVCBkZWxldGUoKSB7CisgICAgICAgIHJldHVybiBtZXRob2QoIkRFTEVURSIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8Uj4gVCBkZWxldGUoZmluYWwgQ2xhc3M8Uj4gcmVzcG9uc2VUeXBlKSB7CisgICAgICAgIHJldHVybiBtZXRob2QoIkRFTEVURSIsIHJlc3BvbnNlVHlwZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxSPiBUIGRlbGV0ZShmaW5hbCBHZW5lcmljVHlwZTxSPiByZXNwb25zZVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIG1ldGhvZCgiREVMRVRFIiwgcmVzcG9uc2VUeXBlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVCBoZWFkKCkgeworICAgICAgICByZXR1cm4gbWV0aG9kKCJIRUFEIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFQgb3B0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIG1ldGhvZCgiT1BUSU9OUyIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8Uj4gVCBvcHRpb25zKGZpbmFsIENsYXNzPFI+IHJlc3BvbnNlVHlwZSkgeworICAgICAgICByZXR1cm4gbWV0aG9kKCJPUFRJT05TIiwgcmVzcG9uc2VUeXBlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFI+IFQgb3B0aW9ucyhmaW5hbCBHZW5lcmljVHlwZTxSPiByZXNwb25zZVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIG1ldGhvZCgiT1BUSU9OUyIsIHJlc3BvbnNlVHlwZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFQgdHJhY2UoKSB7CisgICAgICAgIHJldHVybiBtZXRob2QoIlRSQUNFIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxSPiBUIHRyYWNlKGZpbmFsIENsYXNzPFI+IHJlc3BvbnNlVHlwZSkgeworICAgICAgICByZXR1cm4gbWV0aG9kKCJUUkFDRSIsIHJlc3BvbnNlVHlwZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxSPiBUIHRyYWNlKGZpbmFsIEdlbmVyaWNUeXBlPFI+IHJlc3BvbnNlVHlwZSkgeworICAgICAgICByZXR1cm4gbWV0aG9kKCJUUkFDRSIsIHJlc3BvbnNlVHlwZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFQgbWV0aG9kKGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBtZXRob2QobmFtZSwgUmVzcG9uc2UuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8Uj4gVCBtZXRob2QoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIENsYXNzPFI+IHJlc3BvbnNlVHlwZSkgeworICAgICAgICByZXR1cm4gbWV0aG9kKG5hbWUsIG51bGwsIHJlc3BvbnNlVHlwZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxSPiBUIG1ldGhvZChmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgR2VuZXJpY1R5cGU8Uj4gcmVzcG9uc2VUeXBlKSB7CisgICAgICAgIHJldHVybiBtZXRob2QobmFtZSwgbnVsbCwgcmVzcG9uc2VUeXBlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVCBtZXRob2QoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIEVudGl0eTw/PiBlbnRpdHkpIHsKKyAgICAgICAgcmV0dXJuIG1ldGhvZChuYW1lLCBlbnRpdHksIFJlc3BvbnNlLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9DaHVua1BhcnNlci5qYXZhIGIvY29yZS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvQ2h1bmtQYXJzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWEzY2E3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvQ2h1bmtQYXJzZXIuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworLyoqCisgKiBDaHVuayBkYXRhIHBhcnNlci4KKyAqCisgKiBJbXBsZW1lbnRhdGlvbnMgb2YgdGhpcyBpbnRlcmZhY2UgYXJlIHVzZWQgYnkgYSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNodW5rZWRJbnB1dH0KKyAqIGluc3RhbmNlIGZvciBwYXJzaW5nIHJlc3BvbnNlIGVudGl0eSBpbnB1dCBzdHJlYW0gaW50byBjaHVua3MuCisgKiA8cD4KKyAqIENodW5rIHBhcnNlcnMgYXJlIGV4cGVjdGVkIHRvIHJlYWQgZGF0YSBmcm9tIHRoZSByZXNwb25zZSBlbnRpdHkgaW5wdXQgc3RyZWFtCisgKiB1bnRpbCBhIG5vbi1lbXB0eSBkYXRhIGNodW5rIGlzIGZ1bGx5IHJlYWQgYW5kIHRoZW4gcmV0dXJuIHRoZSBjaHVuayBkYXRhIGJhY2sKKyAqIHRvIHRoZSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNodW5rZWRJbnB1dH0gaW5zdGFuY2UgZm9yIGZ1cnRoZXIKKyAqIHByb2Nlc3NpbmcgKGkuZS4gY29udmVyc2lvbiBpbnRvIGEgc3BlY2lmaWMgSmF2YSB0eXBlKS4KKyAqIDwvcD4KKyAqIDxwPgorICogQ2h1bmsgcGFyc2VycyBhcmUgdHlwaWNhbGx5IGV4cGVjdGVkIHRvIHNraXAgYW55IGVtcHR5IGNodW5rcyAodGhlIGNodW5rcyB0aGF0IGRvCisgKiBub3QgY29udGFpbiBhbnkgZGF0YSkgb3IgYW55IGNvbnRyb2wgbWV0YS1kYXRhIGFzc29jaWF0ZWQgd2l0aCBjaHVua3MsIGhvd2V2ZXIgaXQKKyAqIGlzIG5vdCBhIGhhcmQgcmVxdWlyZW1lbnQgdG8gZG8gc28uIFRoZSBkZWNpc2lvbiBkZXBlbmRzIG9uIHRoZSBrbm93bGVkZ2Ugb2Ygd2hpY2gKKyAqIHtAbGluayBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXJ9IGltcGxlbWVudGF0aW9uIGlzIHNlbGVjdGVkIGZvciBkZS1zZXJpYWxpemF0aW9uCisgKiBvZiB0aGUgY2h1bmsgZGF0YS4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgaW50ZXJmYWNlIENodW5rUGFyc2VyIHsKKyAgICAvKioKKyAgICAgKiBJbnZva2VkIGJ5IHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2h1bmtlZElucHV0fSB0byBnZXQgdGhlIGRhdGEgZm9yCisgICAgICogdGhlIG5leHQgY2h1bmsuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2VTdHJlYW0gcmVzcG9uc2UgZW50aXR5IGlucHV0IHN0cmVhbS4KKyAgICAgKiBAcmV0dXJuIG5leHQgY2h1bmsgZGF0YSByZXByZXNlbnRlZCBhcyBhbiBhcnJheSBvZiBieXRlcywgb3Ige0Bjb2RlIG51bGx9CisgICAgICogICAgICAgICBpZiBubyBtb3JlIGNodW5rcyBhcmUgYXZhaWxhYmxlLgorICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiBpbiBjYXNlIHJlYWRpbmcgZnJvbSB0aGUgcmVzcG9uc2UgZW50aXR5IGZhaWxzLgorICAgICAqLworICAgIHB1YmxpYyBieXRlW10gcmVhZENodW5rKElucHV0U3RyZWFtIHJlc3BvbnNlU3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9DaHVua2VkSW5wdXQuamF2YSBiL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0NodW5rZWRJbnB1dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MTAxYzUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9DaHVua2VkSW5wdXQuamF2YQpAQCAtMCwwICsxLDQ5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQ7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkdlbmVyaWNUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJlYWRlckludGVyY2VwdG9yOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLlByb3BlcnRpZXNEZWxlZ2F0ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLk1lc3NhZ2VCb2R5V29ya2VyczsKKworLyoqCisgKiBSZXNwb25zZSBlbnRpdHkgdHlwZSB1c2VkIGZvciByZWNlaXZpbmcgbWVzc2FnZXMgaW4gInR5cGVkIiBjaHVua3MuCisgKiA8cC8+CisgKiBUaGlzIGRhdGEgdHlwZSBpcyB1c2VmdWwgZm9yIGNvbnN1bWluZyBwYXJ0aWFsIHJlc3BvbnNlcyBmcm9tIGxhcmdlIG9yIGNvbnRpbnVvdXMgZGF0YQorICogaW5wdXQgc3RyZWFtcy4KKyAqCisgKiBAcGFyYW0gPFQ+IGNodW5rIHR5cGUuCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitAU3VwcHJlc3NXYXJuaW5ncygiVW51c2VkRGVjbGFyYXRpb24iKQorcHVibGljIGNsYXNzIENodW5rZWRJbnB1dDxUPiBleHRlbmRzIEdlbmVyaWNUeXBlPFQ+IGltcGxlbWVudHMgQ2xvc2VhYmxlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKENodW5rZWRJbnB1dC5jbGFzcy5nZXROYW1lKCkpOworCisgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNCb29sZWFuIGNsb3NlZCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKyAgICBwcml2YXRlIENodW5rUGFyc2VyIHBhcnNlciA9IGNyZWF0ZVBhcnNlcigiXHJcbiIpOworICAgIHByaXZhdGUgTWVkaWFUeXBlIG1lZGlhVHlwZTsKKworICAgIHByaXZhdGUgZmluYWwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW07CisgICAgcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnM7CisgICAgcHJpdmF0ZSBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyczsKKyAgICBwcml2YXRlIGZpbmFsIE1lc3NhZ2VCb2R5V29ya2VycyBtZXNzYWdlQm9keVdvcmtlcnM7CisgICAgcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0aWVzRGVsZWdhdGUgcHJvcGVydGllc0RlbGVnYXRlOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyBjaHVuayBwYXJzZXIgdGhhdCB3aWxsIHNwbGl0IHRoZSByZXNwb25zZSBlbnRpdHkgaW5wdXQgc3RyZWFtCisgICAgICogYmFzZWQgb24gYSBmaXhlZCBib3VuZGFyeSBzdHJpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYm91bmRhcnkgY2h1bmsgYm91bmRhcnkuCisgICAgICogQHJldHVybiBuZXcgZml4ZWQgYm91bmRhcnkgc3RyaW5nLWJhc2VkIGNodW5rIHBhcnNlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENodW5rUGFyc2VyIGNyZWF0ZVBhcnNlcihmaW5hbCBTdHJpbmcgYm91bmRhcnkpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGaXhlZEJvdW5kYXJ5UGFyc2VyKGJvdW5kYXJ5LmdldEJ5dGVzKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgY2h1bmsgcGFyc2VyIHRoYXQgd2lsbCBzcGxpdCB0aGUgcmVzcG9uc2UgZW50aXR5IGlucHV0IHN0cmVhbQorICAgICAqIGJhc2VkIG9uIGEgZml4ZWQgYm91bmRhcnkgc2VxdWVuY2Ugb2YgYnl0ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYm91bmRhcnkgY2h1bmsgYm91bmRhcnkuCisgICAgICogQHJldHVybiBuZXcgZml4ZWQgYm91bmRhcnkgc2VxdWVuY2UtYmFzZWQgY2h1bmsgcGFyc2VyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ2h1bmtQYXJzZXIgY3JlYXRlUGFyc2VyKGZpbmFsIGJ5dGVbXSBib3VuZGFyeSkgeworICAgICAgICByZXR1cm4gbmV3IEZpeGVkQm91bmRhcnlQYXJzZXIoYm91bmRhcnkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBjaHVuayBtdWx0aS1wYXJzZXIgdGhhdCB3aWxsIHNwbGl0IHRoZSByZXNwb25zZSBlbnRpdHkgaW5wdXQgc3RyZWFtCisgICAgICogYmFzZWQgb24gbXVsdGlwbGUgZml4ZWQgYm91bmRhcnkgc3RyaW5ncy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBib3VuZGFyaWVzIGNodW5rIGJvdW5kYXJpZXMuCisgICAgICogQHJldHVybiBuZXcgZml4ZWQgYm91bmRhcnkgc3RyaW5nLWJhc2VkIGNodW5rIHBhcnNlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENodW5rUGFyc2VyIGNyZWF0ZU11bHRpUGFyc2VyKGZpbmFsIFN0cmluZy4uLiBib3VuZGFyaWVzKSB7CisgICAgICAgIHJldHVybiBuZXcgRml4ZWRNdWx0aUJvdW5kYXJ5UGFyc2VyKGJvdW5kYXJpZXMpOworICAgIH0KKworICAgIHByaXZhdGUgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIEFic3RyYWN0Qm91bmRhcnlQYXJzZXIgaW1wbGVtZW50cyBDaHVua1BhcnNlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBieXRlW10gcmVhZENodW5rKGZpbmFsIElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ1ZmZlciA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIGJ5dGVbXSBkZWxpbWl0ZXJCdWZmZXIgPSBuZXcgYnl0ZVtnZXREZWxpbWl0ZXJCdWZmZXJTaXplKCldOworCisgICAgICAgICAgICBpbnQgZGF0YTsKKyAgICAgICAgICAgIGludCBkUG9zOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGRQb3MgPSAwOworICAgICAgICAgICAgICAgIHdoaWxlICgoZGF0YSA9IGluLnJlYWQoKSkgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgYnl0ZSBiID0gKGJ5dGUpIGRhdGE7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBkZWxpbWl0ZXIgPSBnZXREZWxpbWl0ZXIoYiwgZFBvcywgZGVsaW1pdGVyQnVmZmVyKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBsYXN0IHJlYWQgYnl0ZSBpcyBwYXJ0IG9mIHRoZSBjaHVuayBkZWxpbWl0ZXIKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRlbGltaXRlciAhPSBudWxsICYmIGIgPT0gZGVsaW1pdGVyW2RQb3NdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWxpbWl0ZXJCdWZmZXJbZFBvcysrXSA9IGI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZFBvcyA9PSBkZWxpbWl0ZXIubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm91bmQgY2h1bmsgZGVsaW1pdGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZFBvcyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbGltaXRlciA9IGdldERlbGltaXRlcihkUG9zIC0gMSwgZGVsaW1pdGVyQnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbGltaXRlckJ1ZmZlcltkUG9zXSA9IGI7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXRjaGVkID0gbWF0Y2hUYWlsKGRlbGltaXRlckJ1ZmZlciwgMSwgZFBvcywgZGVsaW1pdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaGVkID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmbHVzaCBkZWxpbWl0ZXIgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLndyaXRlKGRlbGltaXRlckJ1ZmZlciwgMCwgZFBvcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLndyaXRlKGIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRQb3MgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtYXRjaGVkID09IGRlbGltaXRlci5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZCBjaHVuayBkZWxpbWl0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb25lIG9yIG1vcmUgZWxlbWVudHMgb2YgYSBwcmV2aW91cyBidWZmZXJlZCBkZWxpbWl0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcmUgcGFydHMgb2YgYSBjdXJyZW50IGJ1ZmZlcmVkIGRlbGltaXRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci53cml0ZShkZWxpbWl0ZXJCdWZmZXIsIDAsIGRQb3MgKyAxIC0gbWF0Y2hlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZFBvcyA9IG1hdGNoZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIud3JpdGUoYik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0gd2hpbGUgKGRhdGEgIT0gLTEgJiYgYnVmZmVyLnNpemUoKSA9PSAwKTsgLy8gc2tpcCBhbiBlbXB0eSBjaHVuaworCisgICAgICAgICAgICBpZiAoZFBvcyA+IDAgJiYgZFBvcyAhPSBnZXREZWxpbWl0ZXIoZFBvcyAtIDEsIGRlbGltaXRlckJ1ZmZlcikubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgLy8gZmx1c2ggdGhlIGRlbGltaXRlciBidWZmZXIsIGlmIG5vdCBlbXB0eSAtIHBhcnNpbmcgZmluaXNoZWQgaW4gdGhlIG1pZGRsZSBvZiBhIHBvdGVudGlhbCBkZWxpbWl0ZXIgc2VxdWVuY2UKKyAgICAgICAgICAgICAgICBidWZmZXIud3JpdGUoZGVsaW1pdGVyQnVmZmVyLCAwLCBkUG9zKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIChidWZmZXIuc2l6ZSgpID4gMCkgPyBidWZmZXIudG9CeXRlQXJyYXkoKSA6IG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2VsZWN0cyBhIGRlbGltaXRlciB3aGljaCBjb3JyZXNwb25kcyB0byBkZWxpbWl0ZXIgYnVmZmVyLiBNZXRob2QgYXV0b21hdGljYWxseSBhcHBlbmRzIHtAY29kZSBifSBwYXJhbSBvbiB0aGUKKyAgICAgICAgICoge0Bjb2RlIHBvc30gcG9zaXRpb24gb2Yge0Bjb2RlIGRlbGltaXRlckJ1ZmZlcn0gYXJyYXkgYW5kIHRoZW4gc3RhcnRzIHRoZSBzZWxlY3Rpb24gcHJvY2VzcyB3aXRoIGEgbmV3bHkgY3JlYXRlZCBhcnJheS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGIgICAgICAgICAgICAgICBieXRlIHdoaWNoIHdpbGwgYmUgYWRkZWQgb24gdGhlIHtAY29kZSBwb3N9IHBvc2l0aW9uIG9mIHtAY29kZSBkZWxpbWl0ZXJCdWZmZXJ9IGFycmF5CisgICAgICAgICAqIEBwYXJhbSBwb3MgICAgICAgICAgICAgbnVtYmVyIG9mIGJ5dGVzIGZyb20gdGhlIGRlbGltaXRlciBidWZmZXIgd2hpY2ggd2lsbCBiZSB1c2VkIGluIHByb2Nlc3NpbmcKKyAgICAgICAgICogQHBhcmFtIGRlbGltaXRlckJ1ZmZlciBjdXJyZW50IGNvbnRlbnQgb2YgdGhlIGRlbGltaXRlciBidWZmZXIKKyAgICAgICAgICogQHJldHVybiBkZWxpbWl0ZXIgd2hpY2ggY29ycmVzcG9uZHMgdG8gZGVsaW1pdGVyQnVmZmVyCisgICAgICAgICAqLworICAgICAgICBhYnN0cmFjdCBieXRlW10gZ2V0RGVsaW1pdGVyKGJ5dGUgYiwgaW50IHBvcywgYnl0ZVtdIGRlbGltaXRlckJ1ZmZlcik7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNlbGVjdHMgYSBkZWxpbWl0ZXIgd2hpY2ggY29ycmVzcG9uZHMgdG8gZGVsaW1pdGVyIGJ1ZmZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHBvcyAgICAgICAgICAgICBwb3NpdGlvbiBvZiB0aGUgbGFzdCByZWFkIGJ5dGUKKyAgICAgICAgICogQHBhcmFtIGRlbGltaXRlckJ1ZmZlciBudW1iZXIgb2YgYnl0ZXMgZnJvbSB0aGUgZGVsaW1pdGVyIGJ1ZmZlciB3aGljaCB3aWxsIGJlIHVzZWQgaW4gcHJvY2Vzc2luZworICAgICAgICAgKiBAcmV0dXJuIGRlbGltaXRlciB3aGljaCBjb3JyZXNwb25kcyB0byBkZWxpbWl0ZXJCdWZmZXIKKyAgICAgICAgICovCisgICAgICAgIGFic3RyYWN0IGJ5dGVbXSBnZXREZWxpbWl0ZXIoaW50IHBvcywgYnl0ZVtdIGRlbGltaXRlckJ1ZmZlcik7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgYSBkZWxpbWl0ZXIgYnVmZmVyIHNpemUgZGVwZW5kaW5nIG9uIHRoZSBzZWxlY3RlZCBzdHJhdGVneS4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIElmIGEgc3RyYXRlZ3kgaGFzIG11bHRpcGxlIHJlZ2lzdGVyZWQgZGVsaW1pdGVycywgdGhlbiB0aGUgZGVsaW1pdGVyIGJ1ZmZlciBzaG91bGQgYmUgYSBsZW5ndGggb2YgdGhlIGxvbmdlc3QKKyAgICAgICAgICogZGVsaW1pdGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIGxlbmd0aCBvZiB0aGUgZGVsaW1pdGVyIGJ1ZmZlcgorICAgICAgICAgKi8KKyAgICAgICAgYWJzdHJhY3QgaW50IGdldERlbGltaXRlckJ1ZmZlclNpemUoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVHJpZXMgdG8gZmluZCBhbiBlbGVtZW50IGludGVyc2VjdGlvbiBiZXR3ZWVuIHR3byBhcnJheXMgaW4gYSB3YXkgdGhhdCBpbnRlcnNlY3RpbmcgZWxlbWVudHMgbXVzdCBiZQorICAgICAgICAgKiBhdCB0aGUgdGFpbCBvZiB0aGUgZmlyc3QgYXJyYXkgYW5kIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlY29uZCBhcnJheS4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIEZvciBleGFtcGxlLCBjb25zaWRlciB0aGUgZm9sbG93aW5nIHR3byBhcnJheXM6CisgICAgICAgICAqIDxwcmU+CisgICAgICAgICAqIGExOiB7YSwgYiwgYywgZCwgZX0KKyAgICAgICAgICogYTI6IHtkLCBlLCBmLCBnfQorICAgICAgICAgKiA8L3ByZT4KKyAgICAgICAgICogSW4gdGhpcyBleGFtcGxlLCB0aGUgaW50ZXJzZWN0aW9uIG9mIHRhaWwgb2Yge0Bjb2RlIGExfSB3aXRoIGhlYWQgb2Yge0Bjb2RlIGEyfSBpcyA8dHQ+e2QsIGV9PC90dD4KKyAgICAgICAgICogYW5kIGNvbnNpc3RzIG9mIDIgb3ZlcmxhcHBpbmcgZWxlbWVudHMuCisgICAgICAgICAqIDwvcD4KKyAgICAgICAgICogVGhlIG1ldGhvZCB0YWtlcyB0aGUgZmlyc3QgYXJyYXkgcmVwcmVzZW50ZWQgYXMgYSBzdWItYXJyYXkgaW4gYnVmZmVyIGRlbWFyY2F0ZWQgYnkgYW4gb2Zmc2V0IGFuZCBsZW5ndGguCisgICAgICAgICAqIFRoZSBzZWNvbmQgYXJyYXkgaXMgYSBmaXhlZCBwYXR0ZXJuIHRvIGJlIG1hdGNoZWQuIFRoZSBtZXRob2QgdGhlbiBjb21wYXJlcyB0aGUgdGFpbCBvZiB0aGUKKyAgICAgICAgICogYXJyYXkgaW4gdGhlIGJ1ZmZlciB3aXRoIHRoZSBoZWFkIG9mIHRoZSBwYXR0ZXJuIGFuZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgaW50ZXJzZWN0aW5nIGVsZW1lbnRzLAorICAgICAgICAgKiBvciB6ZXJvIGluIGNhc2UgdGhlIHR3byBhcnJheXMgZG8gbm90IGludGVyc2VjdCB0YWlsIHRvIGhlYWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBidWZmZXIgIGJ5dGUgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGFycmF5IHdob3NlIHRhaWwgdG8gaW50ZXJzZWN0LgorICAgICAgICAgKiBAcGFyYW0gb2Zmc2V0ICBzdGFydCBvZiB0aGUgYXJyYXkgdG8gYmUgdGFpbC1tYXRjaGVkIGluIHRoZSB7QGNvZGUgYnVmZmVyfS4KKyAgICAgICAgICogQHBhcmFtIGxlbmd0aCAgbGVuZ3RoIG9mIHRoZSBhcnJheSB0byBiZSB0YWlsLW1hdGNoZWQuCisgICAgICAgICAqIEBwYXJhbSBwYXR0ZXJuIHBhdHRlcm4gdG8gYmUgaGVhZC1tYXRjaGVkLgorICAgICAgICAgKiBAcmV0dXJuIHtAY29kZSAwfSBpZiBhbnkgcGFydCBvZiB0aGUgdGFpbCBvZiB0aGUgYXJyYXkgaW4gdGhlIGJ1ZmZlciBkb2VzIG5vdCBtYXRjaAorICAgICAgICAgKiBhbnkgcGFydCBvZiB0aGUgaGVhZCBvZiB0aGUgcGF0dGVybiwgb3RoZXJ3aXNlIHJldHVybnMgbnVtYmVyIG9mIG92ZXJsYXBwaW5nIGVsZW1lbnRzLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IG1hdGNoVGFpbChieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoLCBieXRlW10gcGF0dGVybikgeworICAgICAgICAgICAgaWYgKHBhdHRlcm4gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdXRlcjoKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdGFpbExlbmd0aCA9IGxlbmd0aCAtIGk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB0YWlsTGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlcltvZmZzZXQgKyBpICsgal0gIT0gcGF0dGVybltqXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWlzbWF0Y2ggLSBjb250aW51ZSB3aXRoIHNob3J0ZXIgdGFpbAorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUgb3V0ZXI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBmb3VuZCB0aGUgbG9uZ2VzdCBtYXRjaGluZyB0YWlsCisgICAgICAgICAgICAgICAgcmV0dXJuIHRhaWxMZW5ndGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEZpeGVkQm91bmRhcnlQYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdEJvdW5kYXJ5UGFyc2VyIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBkZWxpbWl0ZXI7CisKKyAgICAgICAgcHVibGljIEZpeGVkQm91bmRhcnlQYXJzZXIoZmluYWwgYnl0ZVtdIGJvdW5kYXJ5KSB7CisgICAgICAgICAgICBkZWxpbWl0ZXIgPSBBcnJheXMuY29weU9mKGJvdW5kYXJ5LCBib3VuZGFyeS5sZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIGJ5dGVbXSBnZXREZWxpbWl0ZXIoYnl0ZSBiLCBpbnQgcG9zLCBieXRlW10gZGVsaW1pdGVyQnVmZmVyKSB7CisgICAgICAgICAgICByZXR1cm4gZGVsaW1pdGVyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIGJ5dGVbXSBnZXREZWxpbWl0ZXIoaW50IHBvcywgYnl0ZVtdIGRlbGltaXRlckJ1ZmZlcikgeworICAgICAgICAgICAgcmV0dXJuIGRlbGltaXRlcjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBpbnQgZ2V0RGVsaW1pdGVyQnVmZmVyU2l6ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBkZWxpbWl0ZXIubGVuZ3RoOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRml4ZWRNdWx0aUJvdW5kYXJ5UGFyc2VyIGV4dGVuZHMgQWJzdHJhY3RCb3VuZGFyeVBhcnNlciB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PGJ5dGVbXT4gZGVsaW1pdGVycyA9IG5ldyBBcnJheUxpc3Q8Ynl0ZVtdPigpOworCisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IGxvbmdlc3REZWxpbWl0ZXJMZW5ndGg7CisKKyAgICAgICAgcHVibGljIEZpeGVkTXVsdGlCb3VuZGFyeVBhcnNlcihTdHJpbmcuLi4gYm91bmRhcmllcykgeworICAgICAgICAgICAgZm9yIChTdHJpbmcgYm91bmRhcnk6IGJvdW5kYXJpZXMpIHsKKyAgICAgICAgICAgICAgICBieXRlW10gYm91bmRhcnlCeXRlcyA9IGJvdW5kYXJ5LmdldEJ5dGVzKCk7CisgICAgICAgICAgICAgICAgZGVsaW1pdGVycy5hZGQoQXJyYXlzLmNvcHlPZihib3VuZGFyeUJ5dGVzLCBib3VuZGFyeUJ5dGVzLmxlbmd0aCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGRlbGltaXRlcnMsIG5ldyBDb21wYXJhdG9yPGJ5dGVbXT4oKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlKGJ5dGVbXSBvMSwgYnl0ZVtdIG8yKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLmNvbXBhcmUobzEubGVuZ3RoLCBvMi5sZW5ndGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBieXRlW10gbG9uZ2VzdERlbGltaXRlciA9IGRlbGltaXRlcnMuZ2V0KGRlbGltaXRlcnMuc2l6ZSgpIC0gMSk7CisgICAgICAgICAgICB0aGlzLmxvbmdlc3REZWxpbWl0ZXJMZW5ndGggPSBsb25nZXN0RGVsaW1pdGVyLmxlbmd0aDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBieXRlW10gZ2V0RGVsaW1pdGVyKGJ5dGUgYiwgaW50IHBvcywgYnl0ZVtdIGRlbGltaXRlckJ1ZmZlcikgeworICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IEFycmF5cy5jb3B5T2YoZGVsaW1pdGVyQnVmZmVyLCBkZWxpbWl0ZXJCdWZmZXIubGVuZ3RoKTsKKyAgICAgICAgICAgIGJ1ZmZlcltwb3NdID0gYjsKKworICAgICAgICAgICAgcmV0dXJuIGdldERlbGltaXRlcihwb3MsIGJ1ZmZlcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgYnl0ZVtdIGdldERlbGltaXRlcihpbnQgcG9zLCBieXRlW10gZGVsaW1pdGVyQnVmZmVyKSB7CisgICAgICAgICAgICBvdXRlcjoKKyAgICAgICAgICAgIGZvciAoYnl0ZVtdIGRlbGltaXRlcjogZGVsaW1pdGVycykgeworICAgICAgICAgICAgICAgIGlmIChwb3MgPiBkZWxpbWl0ZXIubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IHBvcyAmJiBpIDwgZGVsaW1pdGVyLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZWxpbWl0ZXJbaV0gIT0gZGVsaW1pdGVyQnVmZmVyW2ldKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwb3MgPT0gaSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGltaXRlcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgaW50IGdldERlbGltaXRlckJ1ZmZlclNpemUoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5sb25nZXN0RGVsaW1pdGVyTGVuZ3RoOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFja2FnZS1wcml2YXRlIGNvbnN0cnVjdG9yIHVzZWQgYnkgdGhlIHtAbGluayBDaHVua2VkSW5wdXRSZWFkZXJ9LgorICAgICAqCisgICAgICogQHBhcmFtIGNodW5rVHlwZSAgICAgICAgICBjaHVuayB0eXBlLgorICAgICAqIEBwYXJhbSBpbnB1dFN0cmVhbSAgICAgICAgcmVzcG9uc2UgaW5wdXQgc3RyZWFtLgorICAgICAqIEBwYXJhbSBhbm5vdGF0aW9ucyAgICAgICAgYW5ub3RhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIHJlc3BvbnNlIGVudGl0eS4KKyAgICAgKiBAcGFyYW0gbWVkaWFUeXBlICAgICAgICAgIHJlc3BvbnNlIGVudGl0eSBtZWRpYSB0eXBlLgorICAgICAqIEBwYXJhbSBoZWFkZXJzICAgICAgICAgICAgcmVzcG9uc2UgaGVhZGVycy4KKyAgICAgKiBAcGFyYW0gbWVzc2FnZUJvZHlXb3JrZXJzIG1lc3NhZ2UgYm9keSB3b3JrZXJzLgorICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzRGVsZWdhdGUgcHJvcGVydGllcyBkZWxlZ2F0ZSBmb3IgdGhpcyByZXF1ZXN0L3Jlc3BvbnNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBDaHVua2VkSW5wdXQoCisgICAgICAgICAgICBmaW5hbCBUeXBlIGNodW5rVHlwZSwKKyAgICAgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLAorICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzLAorICAgICAgICAgICAgZmluYWwgTWVzc2FnZUJvZHlXb3JrZXJzIG1lc3NhZ2VCb2R5V29ya2VycywKKyAgICAgICAgICAgIGZpbmFsIFByb3BlcnRpZXNEZWxlZ2F0ZSBwcm9wZXJ0aWVzRGVsZWdhdGUpIHsKKyAgICAgICAgc3VwZXIoY2h1bmtUeXBlKTsKKworICAgICAgICB0aGlzLmlucHV0U3RyZWFtID0gaW5wdXRTdHJlYW07CisgICAgICAgIHRoaXMuYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uczsKKyAgICAgICAgdGhpcy5tZWRpYVR5cGUgPSBtZWRpYVR5cGU7CisgICAgICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnM7CisgICAgICAgIHRoaXMubWVzc2FnZUJvZHlXb3JrZXJzID0gbWVzc2FnZUJvZHlXb3JrZXJzOworICAgICAgICB0aGlzLnByb3BlcnRpZXNEZWxlZ2F0ZSA9IHByb3BlcnRpZXNEZWxlZ2F0ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHVuZGVybHlpbmcgY2h1bmsgcGFyc2VyLgorICAgICAqIDxwPgorICAgICAqIE5vdGU6IEFjY2VzcyB0byBpbnRlcm5hbCBjaHVuayBwYXJzZXIgaXMgbm90IGEgdGhyZWFkLXNhZmUgb3BlcmF0aW9uIGFuZCBoYXMgdG8gYmUgZXhwbGljaXRseSBzeW5jaHJvbml6ZWQKKyAgICAgKiBpbiBjYXNlIHRoZSBjaHVua2VkIGlucHV0IGlzIHVzZWQgZnJvbSBtdWx0aXBsZSB0aHJlYWRzLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdW5kZXJseWluZyBjaHVuayBwYXJzZXIuCisgICAgICovCisgICAgcHVibGljIENodW5rUGFyc2VyIGdldFBhcnNlcigpIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgbmV3IGNodW5rIHBhcnNlci4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlOiBBY2Nlc3MgdG8gaW50ZXJuYWwgY2h1bmsgcGFyc2VyIGlzIG5vdCBhIHRocmVhZC1zYWZlIG9wZXJhdGlvbiBhbmQgaGFzIHRvIGJlIGV4cGxpY2l0bHkgc3luY2hyb25pemVkCisgICAgICogaW4gY2FzZSB0aGUgY2h1bmtlZCBpbnB1dCBpcyB1c2VkIGZyb20gbXVsdGlwbGUgdGhyZWFkcy4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyc2VyIG5ldyBjaHVuayBwYXJzZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFyc2VyKGZpbmFsIENodW5rUGFyc2VyIHBhcnNlcikgeworICAgICAgICB0aGlzLnBhcnNlciA9IHBhcnNlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgY2h1bmsgZGF0YSBtZWRpYSB0eXBlLgorICAgICAqIDxwLz4KKyAgICAgKiBEZWZhdWx0IGNodW5rIGRhdGEgbWVkaWEgdHlwZSBpcyBkZXJpdmVkIGZyb20gdGhlIHZhbHVlIG9mIHRoZSByZXNwb25zZQorICAgICAqIDx0dD57QHZhbHVlIGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnMjQ09OVEVOVF9UWVBFfTwvdHQ+IGhlYWRlciBmaWVsZC4KKyAgICAgKiBUaGlzIGRlZmF1bHQgdmFsdWUgbWF5IGJlIG1hbnVhbGx5IG92ZXJyaWRkZW4gYnkge0BsaW5rICNzZXRDaHVua1R5cGUoamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGUpIHNldHRpbmd9CisgICAgICogYSBjdXN0b20gbm9uLXtAY29kZSBudWxsfSBjaHVuayBtZWRpYSB0eXBlIHZhbHVlLgorICAgICAqIDxwPgorICAgICAqIE5vdGU6IEFjY2VzcyB0byBpbnRlcm5hbCBjaHVuayBtZWRpYSB0eXBlIGlzIG5vdCBhIHRocmVhZC1zYWZlIG9wZXJhdGlvbiBhbmQgaGFzIHRvCisgICAgICogYmUgZXhwbGljaXRseSBzeW5jaHJvbml6ZWQgaW4gY2FzZSB0aGUgY2h1bmtlZCBpbnB1dCBpcyB1c2VkIGZyb20gbXVsdGlwbGUgdGhyZWFkcy4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIG1lZGlhIHR5cGUgc3BlY2lmaWMgdG8gZWFjaCBjaHVuayBvZiBkYXRhLgorICAgICAqLworICAgIHB1YmxpYyBNZWRpYVR5cGUgZ2V0Q2h1bmtUeXBlKCkgeworICAgICAgICByZXR1cm4gbWVkaWFUeXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBjdXN0b20gY2h1bmsgZGF0YSBtZWRpYSB0eXBlLgorICAgICAqIDxwLz4KKyAgICAgKiBCeSBkZWZhdWx0LCBjaHVuayBkYXRhIG1lZGlhIHR5cGUgaXMgZGVyaXZlZCBmcm9tIHRoZSB2YWx1ZSBvZiB0aGUgcmVzcG9uc2UKKyAgICAgKiA8dHQ+e0B2YWx1ZSBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzI0NPTlRFTlRfVFlQRX08L3R0PiBoZWFkZXIgZmllbGQuCisgICAgICogVXNpbmcgdGhpcyBtZXRob2RzIHdpbGwgb3ZlcnJpZGUgdGhlIGRlZmF1bHQgY2h1bmsgbWVkaWEgdHlwZSB2YWx1ZSBhbmQgc2V0IGl0CisgICAgICogdG8gYSBjdXN0b20gbm9uLXtAY29kZSBudWxsfSBjaHVuayBtZWRpYSB0eXBlLiBPbmNlIHRoaXMgbWV0aG9kIGlzIGludm9rZWQsCisgICAgICogYWxsIHN1YnNlcXVlbnQge0BsaW5rICNyZWFkIGNodW5rIHJlYWRzfSB3aWxsIHVzZSB0aGUgbmV3bHkgc2V0IGNodW5rIG1lZGlhCisgICAgICogdHlwZSB3aGVuIHNlbGVjdGluZyB0aGUgcHJvcGVyIHtAbGluayBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXJ9IGZvcgorICAgICAqIGNodW5rIGRlLXNlcmlhbGl6YXRpb24uCisgICAgICogPHA+CisgICAgICogTm90ZTogQWNjZXNzIHRvIGludGVybmFsIGNodW5rIG1lZGlhIHR5cGUgaXMgbm90IGEgdGhyZWFkLXNhZmUgb3BlcmF0aW9uIGFuZCBoYXMgdG8KKyAgICAgKiBiZSBleHBsaWNpdGx5IHN5bmNocm9uaXplZCBpbiBjYXNlIHRoZSBjaHVua2VkIGlucHV0IGlzIHVzZWQgZnJvbSBtdWx0aXBsZSB0aHJlYWRzLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZWRpYVR5cGUgY3VzdG9tIGNodW5rIGRhdGEgbWVkaWEgdHlwZS4gTXVzdCBub3QgYmUge0Bjb2RlIG51bGx9LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGluIGNhc2UgdGhlIHtAY29kZSBtZWRpYVR5cGV9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDaHVua1R5cGUoZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChtZWRpYVR5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5DSFVOS0VEX0lOUFVUX01FRElBX1RZUEVfTlVMTCgpKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLm1lZGlhVHlwZSA9IG1lZGlhVHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgY3VzdG9tIGNodW5rIGRhdGEgbWVkaWEgdHlwZSBmcm9tIGEgc3RyaW5nIHZhbHVlLgorICAgICAqIDxwPgorICAgICAqIE5vdGU6IEFjY2VzcyB0byBpbnRlcm5hbCBjaHVuayBtZWRpYSB0eXBlIGlzIG5vdCBhIHRocmVhZC1zYWZlIG9wZXJhdGlvbiBhbmQgaGFzIHRvCisgICAgICogYmUgZXhwbGljaXRseSBzeW5jaHJvbml6ZWQgaW4gY2FzZSB0aGUgY2h1bmtlZCBpbnB1dCBpcyB1c2VkIGZyb20gbXVsdGlwbGUgdGhyZWFkcy4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVkaWFUeXBlIGN1c3RvbSBjaHVuayBkYXRhIG1lZGlhIHR5cGUuIE11c3Qgbm90IGJlIHtAY29kZSBudWxsfS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbiBjYXNlIHRoZSB7QGNvZGUgbWVkaWFUeXBlfSBjYW5ub3QgYmUgcGFyc2VkIGludG8KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIHZhbGlkIHtAbGluayBNZWRpYVR5cGV9IGluc3RhbmNlIG9yIGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2VlICNzZXRDaHVua1R5cGUoamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGUpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q2h1bmtUeXBlKGZpbmFsIFN0cmluZyBtZWRpYVR5cGUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgICAgICB0aGlzLm1lZGlhVHlwZSA9IE1lZGlhVHlwZS52YWx1ZU9mKG1lZGlhVHlwZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIGlmIChjbG9zZWQuY29tcGFyZUFuZFNldChmYWxzZSwgdHJ1ZSkpIHsKKyAgICAgICAgICAgIGlmIChpbnB1dFN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuRklORSwgTG9jYWxpemF0aW9uTWVzc2FnZXMuQ0hVTktFRF9JTlBVVF9TVFJFQU1fQ0xPU0lOR19FUlJPUigpLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiB0aGUgY2h1bmtlZCBpbnB1dCBoYXMgYmVlbiBjbG9zZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIGNodW5rZWQgaW5wdXQgaGFzIGJlZW4gY2xvc2VkLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Nsb3NlZCgpIHsKKyAgICAgICAgcmV0dXJuIGNsb3NlZC5nZXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIG5leHQgY2h1bmsgZnJvbSB0aGUgcmVzcG9uc2Ugc3RyZWFtIGFuZCBjb252ZXJ0IGl0IHRvIGEgSmF2YSBpbnN0YW5jZQorICAgICAqIHVzaW5nIHRoZSB7QGxpbmsgI2dldENodW5rVHlwZSgpIGNodW5rIG1lZGlhIHR5cGV9LiBUaGUgbWV0aG9kIHJldHVybnMge0Bjb2RlIG51bGx9CisgICAgICogaWYgdGhlIHVuZGVybHlpbmcgZW50aXR5IGlucHV0IHN0cmVhbSBoYXMgYmVlbiBjbG9zZWQgKGVpdGhlciBpbXBsaWNpdGx5IG9yIGV4cGxpY2l0bHkKKyAgICAgKiBieSBjYWxsaW5nIHRoZSB7QGxpbmsgI2Nsb3NlKCl9IG1ldGhvZCkuCisgICAgICogPHA+CisgICAgICogTm90ZTogQWNjZXNzIHRvIGludGVybmFsIGNodW5rIHBhcnNlciBpcyBub3QgYSB0aHJlYWQtc2FmZSBvcGVyYXRpb24gYW5kIGhhcyB0byBiZSBleHBsaWNpdGx5CisgICAgICogc3luY2hyb25pemVkIGluIGNhc2UgdGhlIGNodW5rZWQgaW5wdXQgaXMgdXNlZCBmcm9tIG11bHRpcGxlIHRocmVhZHMuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHJldHVybiBuZXh0IHN0cmVhbWVkIGNodW5rIG9yIHtAY29kZSBudWxsfSBpZiB0aGUgdW5kZXJseWluZyBlbnRpdHkgaW5wdXQgc3RyZWFtCisgICAgICogaGFzIGJlZW4gY2xvc2VkIHdoaWxlIHJlYWRpbmcgbmV4dCBjaHVuayBkYXRhLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGluIGNhc2UgdGhpcyBjaHVua2VkIGlucHV0IGhhcyBiZWVuIGNsb3NlZC4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgVCByZWFkKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjbG9zZWQuZ2V0KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuQ0hVTktFRF9JTlBVVF9DTE9TRUQoKSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgYnl0ZVtdIGNodW5rID0gcGFyc2VyLnJlYWRDaHVuayhpbnB1dFN0cmVhbSk7CisgICAgICAgICAgICBpZiAoY2h1bmsgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNsb3NlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZpbmFsIEJ5dGVBcnJheUlucHV0U3RyZWFtIGNodW5rU3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNodW5rKTsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBhZGQgaW50ZXJjZXB0b3JzOiBpbnRlcmNlcHRvcnMgYXJlIHVzZWQgaW4gQ2h1bmtlZE91dHB1dCwgc28gdGhlIHN0cmVhbSBzaG91bGQKKyAgICAgICAgICAgICAgICAvLyBiZSBpbnRlcmNlcHRlZCBpbiB0aGUgQ2h1bmtlZElucHV0IHRvby4gSW50ZXJjZXB0b3JzIGNhbm5vdCBiZSBlYXNpbHkgYWRkZWQgdG8gdGhlIHJlYWRGcm9tCisgICAgICAgICAgICAgICAgLy8gbWV0aG9kIGFzIHRoZXkgc2hvdWxkIHdyYXAgdGhlIHN0cmVhbSBiZWZvcmUgaXQgaXMgcHJvY2Vzc2VkIGJ5IENodW5rUGFyc2VyLiBBbHNvIHBsZWFzZSBjaGVjayB0b2RvCisgICAgICAgICAgICAgICAgLy8gaW4gQ2h1bmtlZElucHV0ICh0aGlzIHNob3VsZCBiZSBmaXhlZCB0b2dldGhlciB3aXRoIHRoaXMgdG9kbykKKyAgICAgICAgICAgICAgICAvLyBpc3N1ZTogSkVSU0VZLTE4MDkKKyAgICAgICAgICAgICAgICByZXR1cm4gKFQpIG1lc3NhZ2VCb2R5V29ya2Vycy5yZWFkRnJvbSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFJhd1R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXNEZWxlZ2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuPFJlYWRlckludGVyY2VwdG9yPmVtcHR5TGlzdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpLmxvZyhMZXZlbC5GSU5FLCBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgICAgICBjbG9zZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0NodW5rZWRJbnB1dFJlYWRlci5qYXZhIGIvY29yZS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvQ2h1bmtlZElucHV0UmVhZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI0YTlhZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0NodW5rZWRJbnB1dFJlYWRlci5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN0cmFpbmVkVG87CitpbXBvcnQgamF2YXgud3MucnMuUnVudGltZVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLlByb3BlcnRpZXNEZWxlZ2F0ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlJlZmxlY3Rpb25IZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5NZXNzYWdlQm9keVdvcmtlcnM7CisKKy8qKgorICoge0BsaW5rIGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcn0gZm9yIHtAbGluayBDaHVua2VkSW5wdXR9LgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK0BDb25zdHJhaW5lZFRvKFJ1bnRpbWVUeXBlLkNMSUVOVCkKK2NsYXNzIENodW5rZWRJbnB1dFJlYWRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5UmVhZGVyPENodW5rZWRJbnB1dD4geworCisgICAgQEluamVjdAorICAgIHByaXZhdGUgUHJvdmlkZXI8TWVzc2FnZUJvZHlXb3JrZXJzPiBtZXNzYWdlQm9keVdvcmtlcnM7CisgICAgQEluamVjdAorICAgIHByaXZhdGUgUHJvdmlkZXI8UHJvcGVydGllc0RlbGVnYXRlPiBwcm9wZXJ0aWVzRGVsZWdhdGVQcm92aWRlcjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoQ2xhc3M8Pz4gYUNsYXNzLCBUeXBlIHR5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICByZXR1cm4gYUNsYXNzLmVxdWFscyhDaHVua2VkSW5wdXQuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDaHVua2VkSW5wdXQgcmVhZEZyb20oQ2xhc3M8Q2h1bmtlZElucHV0PiBjaHVua2VkSW5wdXRDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgZmluYWwgVHlwZSBjaHVua1R5cGUgPSBSZWZsZWN0aW9uSGVscGVyLmdldFR5cGVBcmd1bWVudCh0eXBlLCAwKTsKKworICAgICAgICByZXR1cm4gbmV3IENodW5rZWRJbnB1dCgKKyAgICAgICAgICAgICAgICBjaHVua1R5cGUsCisgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0sCisgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgIGhlYWRlcnMsCisgICAgICAgICAgICAgICAgbWVzc2FnZUJvZHlXb3JrZXJzLmdldCgpLAorICAgICAgICAgICAgICAgIHByb3BlcnRpZXNEZWxlZ2F0ZVByb3ZpZGVyLmdldCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9DbGllbnRBc3luY0V4ZWN1dG9yLmphdmEgYi9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9DbGllbnRBc3luY0V4ZWN1dG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q4NWViYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0NsaWVudEFzeW5jRXhlY3V0b3IuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudDsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uSW5oZXJpdGVkOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCitpbXBvcnQgamF2YXguaW5qZWN0LlF1YWxpZmllcjsKKworLyoqCisgKiBJbmplY3Rpb24gcXVhbGlmaWVyIHRoYXQgY2FuIGJlIHVzZWQgdG8gaW5qZWN0IGFuIHtAbGluayBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2V9CisgKiBpbnN0YW5jZSB1c2VkIGJ5IEplcnNleSBjbGllbnQgcnVudGltZSB0byBleGVjdXRlIHtAbGluayBqYXZheC53cy5ycy5jbGllbnQuSW52b2NhdGlvbi5CdWlsZGVyI2FzeW5jKCkgYXN5bmNocm9ub3VzfQorICogY2xpZW50IHJlcXVlc3RzLgorICogPHA+CisgKiBUaGUgYXN5bmNocm9ub3VzIGNsaWVudCByZXF1ZXN0IGV4ZWN1dG9yIHNlcnZpY2UgaW5zdGFuY2UgaW5qZWN0ZWQgdXNpbmcgdGhpcyBpbmplY3Rpb24gcXVhbGlmaWVyIGNhbiBiZSBjdXN0b21pemVkCisgKiBieSByZWdpc3RlcmluZyBhIGN1c3RvbSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLkV4ZWN1dG9yU2VydmljZVByb3ZpZGVyfSBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzIGl0c2VsZiBhbm5vdGF0ZWQKKyAqIHdpdGggdGhlIHtAY29kZSAmIzY0O0NsaWVudEFzeW5jRXhlY3V0b3J9IGFubm90YXRpb24uCisgKiA8L3A+CisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqIEBzZWUgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudEFzeW5jRXhlY3V0b3JMaXRlcmFsCisgKiBAc2luY2UgMi4xOAorICovCitAVGFyZ2V0KHtFbGVtZW50VHlwZS5QQVJBTUVURVIsIEVsZW1lbnRUeXBlLkZJRUxELCBFbGVtZW50VHlwZS5NRVRIT0QsIEVsZW1lbnRUeXBlLlRZUEV9KQorQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BEb2N1bWVudGVkCitASW5oZXJpdGVkCitAUXVhbGlmaWVyCitwdWJsaWMgQGludGVyZmFjZSBDbGllbnRBc3luY0V4ZWN1dG9yIHsKKworfQpkaWZmIC0tZ2l0IGEvY29yZS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvQ2xpZW50QXN5bmNFeGVjdXRvckxpdGVyYWwuamF2YSBiL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0NsaWVudEFzeW5jRXhlY3V0b3JMaXRlcmFsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg2NDYwYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0NsaWVudEFzeW5jRXhlY3V0b3JMaXRlcmFsLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQW5ub3RhdGlvbkxpdGVyYWw7CisKKy8qKgorICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRBc3luY0V4ZWN1dG9yfSBhbm5vdGF0aW9uIGxpdGVyYWwuCisgKiA8cD4KKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSB7QGxpbmsgI0lOU1RBTkNFIGNvbnN0YW50IGluc3RhbmNlfSBvZiB0aGUge0Bjb2RlIEBDbGllbnRBc3luY0V4ZWN1dG9yfSBhbm5vdGF0aW9uIHRvIGJlIHVzZWQKKyAqIGluIG1ldGhvZCBjYWxscyB0aGF0IHJlcXVpcmUgdXNlIG9mIGFubm90YXRpb24gaW5zdGFuY2VzLgorICogPC9wPgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKiBAc2luY2UgMi4xOAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiQ2xhc3NFeHBsaWNpdGx5QW5ub3RhdGlvbiIpCitwdWJsaWMgZmluYWwgY2xhc3MgQ2xpZW50QXN5bmNFeGVjdXRvckxpdGVyYWwgZXh0ZW5kcyBBbm5vdGF0aW9uTGl0ZXJhbDxDbGllbnRBc3luY0V4ZWN1dG9yPiBpbXBsZW1lbnRzIENsaWVudEFzeW5jRXhlY3V0b3IgeworCisgICAgLyoqCisgICAgICogQW4ge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRBc3luY0V4ZWN1dG9yfSBhbm5vdGF0aW9uIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ2xpZW50QXN5bmNFeGVjdXRvciBJTlNUQU5DRSA9IG5ldyBDbGllbnRBc3luY0V4ZWN1dG9yTGl0ZXJhbCgpOworCisgICAgcHJpdmF0ZSBDbGllbnRBc3luY0V4ZWN1dG9yTGl0ZXJhbCgpIHsKKyAgICAgICAgLy8gcHJldmVudHMgaW5zdGFudGlhdGlvbiBmcm9tIHRoZSBvdXRzaWRlLgorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0NsaWVudEJhY2tncm91bmRTY2hlZHVsZXIuamF2YSBiL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0NsaWVudEJhY2tncm91bmRTY2hlZHVsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDFmMDY2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvQ2xpZW50QmFja2dyb3VuZFNjaGVkdWxlci5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50OworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Jbmhlcml0ZWQ7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuUXVhbGlmaWVyOworCisvKioKKyAqIEluamVjdGlvbiBxdWFsaWZpZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBpbmplY3QgYW4ge0BsaW5rIGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZX0KKyAqIGluc3RhbmNlIHVzZWQgYnkgSmVyc2V5IGNsaWVudCBydW50aW1lIHRvIHNjaGVkdWxlIGJhY2tncm91bmQgdGFza3MuCisgKiA8cD4KKyAqIFRoZSBzY2hlZHVsZWQgZXhlY3V0b3Igc2VydmljZSBpbnN0YW5jZSBpbmplY3RlZCB1c2luZyB0aGlzIGluamVjdGlvbiBxdWFsaWZpZXIgY2FuIGJlIGN1c3RvbWl6ZWQKKyAqIGJ5IHJlZ2lzdGVyaW5nIGEgY3VzdG9tIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXJ9IGltcGxlbWVudGF0aW9uIHRoYXQgaXMgaXRzZWxmCisgKiBhbm5vdGF0ZWQgd2l0aCB0aGUge0Bjb2RlICYjNjQ7Q2xpZW50QXN5bmNFeGVjdXRvcn0gYW5ub3RhdGlvbi4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKiBAc2VlIENsaWVudEJhY2tncm91bmRTY2hlZHVsZXJMaXRlcmFsCisgKiBAc2luY2UgMi4yNgorICovCitAVGFyZ2V0KHtFbGVtZW50VHlwZS5QQVJBTUVURVIsIEVsZW1lbnRUeXBlLkZJRUxELCBFbGVtZW50VHlwZS5NRVRIT0QsIEVsZW1lbnRUeXBlLlRZUEV9KQorQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BEb2N1bWVudGVkCitASW5oZXJpdGVkCitAUXVhbGlmaWVyCitwdWJsaWMgQGludGVyZmFjZSBDbGllbnRCYWNrZ3JvdW5kU2NoZWR1bGVyIHsKKworfQpkaWZmIC0tZ2l0IGEvY29yZS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvQ2xpZW50QmFja2dyb3VuZFNjaGVkdWxlckxpdGVyYWwuamF2YSBiL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0NsaWVudEJhY2tncm91bmRTY2hlZHVsZXJMaXRlcmFsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWViNDg2MAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0NsaWVudEJhY2tncm91bmRTY2hlZHVsZXJMaXRlcmFsLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQW5ub3RhdGlvbkxpdGVyYWw7CisKKy8qKgorICoge0BsaW5rIENsaWVudEJhY2tncm91bmRTY2hlZHVsZXJ9IGFubm90YXRpb24gbGl0ZXJhbC4KKyAqIDxwPgorICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIHtAbGluayAjSU5TVEFOQ0UgY29uc3RhbnQgaW5zdGFuY2V9IG9mIHRoZSB7QGNvZGUgQENsaWVudEJhY2tncm91bmRTY2hlZHVsZXJ9IGFubm90YXRpb24gdG8gYmUgdXNlZAorICogaW4gbWV0aG9kIGNhbGxzIHRoYXQgcmVxdWlyZSB1c2Ugb2YgYW5ub3RhdGlvbiBpbnN0YW5jZXMuCisgKiA8L3A+CisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICogQHNpbmNlIDIuMjYKKyAqLworQFN1cHByZXNzV2FybmluZ3MoIkNsYXNzRXhwbGljaXRseUFubm90YXRpb24iKQorcHVibGljIGZpbmFsIGNsYXNzIENsaWVudEJhY2tncm91bmRTY2hlZHVsZXJMaXRlcmFsIGV4dGVuZHMgQW5ub3RhdGlvbkxpdGVyYWw8Q2xpZW50QmFja2dyb3VuZFNjaGVkdWxlcj4KKyAgICAgICAgaW1wbGVtZW50cyBDbGllbnRCYWNrZ3JvdW5kU2NoZWR1bGVyIHsKKworICAgIC8qKgorICAgICAqIEFuIHtAbGluayBDbGllbnRCYWNrZ3JvdW5kU2NoZWR1bGVyfSBhbm5vdGF0aW9uIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ2xpZW50QmFja2dyb3VuZFNjaGVkdWxlciBJTlNUQU5DRSA9IG5ldyBDbGllbnRCYWNrZ3JvdW5kU2NoZWR1bGVyTGl0ZXJhbCgpOworCisgICAgcHJpdmF0ZSBDbGllbnRCYWNrZ3JvdW5kU2NoZWR1bGVyTGl0ZXJhbCgpIHsKKyAgICAgICAgLy8gcHJldmVudHMgaW5zdGFudGlhdGlvbiBmcm9tIHRoZSBvdXRzaWRlLgorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0NsaWVudEJpbmRlci5qYXZhIGIvY29yZS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvQ2xpZW50QmluZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMwYTI1OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0NsaWVudEJpbmRlci5qYXZhCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOworCitpbXBvcnQgamF2YXgud3MucnMuUnVudGltZVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkdlbmVyaWNUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcjsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Qcm9wZXJ0aWVzRGVsZWdhdGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkFic3RyYWN0QmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5SZWZlcmVuY2luZ0ZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLlJlZjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLk1lc3NhZ2luZ0JpbmRlcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5pbnRlcm5hbC5SZXF1ZXN0U2NvcGVkOworCisvKioKKyAqIFJlZ2lzdGVycyBhbGwgYmluZGVycyBuZWNlc3NhcnkgZm9yIHtAbGluayBDbGllbnR9IHJ1bnRpbWUuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitjbGFzcyBDbGllbnRCaW5kZXIgZXh0ZW5kcyBBYnN0cmFjdEJpbmRlciB7CisKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gY2xpZW50UnVudGltZVByb3BlcnRpZXM7CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSZXF1ZXN0Q29udGV4dEluamVjdGlvbkZhY3RvcnkgZXh0ZW5kcyBSZWZlcmVuY2luZ0ZhY3Rvcnk8Q2xpZW50UmVxdWVzdD4geworCisgICAgICAgIEBJbmplY3QKKyAgICAgICAgcHVibGljIFJlcXVlc3RDb250ZXh0SW5qZWN0aW9uRmFjdG9yeShQcm92aWRlcjxSZWY8Q2xpZW50UmVxdWVzdD4+IHJlZmVyZW5jZUZhY3RvcnkpIHsKKyAgICAgICAgICAgIHN1cGVyKHJlZmVyZW5jZUZhY3RvcnkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJvcGVydGllc0RlbGVnYXRlRmFjdG9yeSBpbXBsZW1lbnRzIFN1cHBsaWVyPFByb3BlcnRpZXNEZWxlZ2F0ZT4geworCisgICAgICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8Q2xpZW50UmVxdWVzdD4gcmVxdWVzdFByb3ZpZGVyOworCisgICAgICAgIEBJbmplY3QKKyAgICAgICAgcHJpdmF0ZSBQcm9wZXJ0aWVzRGVsZWdhdGVGYWN0b3J5KFByb3ZpZGVyPENsaWVudFJlcXVlc3Q+IHJlcXVlc3RQcm92aWRlcikgeworICAgICAgICAgICAgdGhpcy5yZXF1ZXN0UHJvdmlkZXIgPSByZXF1ZXN0UHJvdmlkZXI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFByb3BlcnRpZXNEZWxlZ2F0ZSBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gcmVxdWVzdFByb3ZpZGVyLmdldCgpLmdldFByb3BlcnRpZXNEZWxlZ2F0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyBjbGllbnQgYmluZGVyIGZvciBhIG5ldyBjbGllbnQgcnVudGltZSBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGllbnRSdW50aW1lUHJvcGVydGllcyBtYXAgb2YgY2xpZW50IHJ1bnRpbWUgcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICBDbGllbnRCaW5kZXIoTWFwPFN0cmluZywgT2JqZWN0PiBjbGllbnRSdW50aW1lUHJvcGVydGllcykgeworICAgICAgICB0aGlzLmNsaWVudFJ1bnRpbWVQcm9wZXJ0aWVzID0gY2xpZW50UnVudGltZVByb3BlcnRpZXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICBpbnN0YWxsKG5ldyBNZXNzYWdpbmdCaW5kZXJzLk1lc3NhZ2VCb2R5UHJvdmlkZXJzKGNsaWVudFJ1bnRpbWVQcm9wZXJ0aWVzLCBSdW50aW1lVHlwZS5DTElFTlQpLAorICAgICAgICAgICAgICAgIG5ldyBNZXNzYWdpbmdCaW5kZXJzLkhlYWRlckRlbGVnYXRlUHJvdmlkZXJzKCkpOworCisgICAgICAgIGJpbmRGYWN0b3J5KFJlZmVyZW5jaW5nRmFjdG9yeS5yZWZlcmVuY2VGYWN0b3J5KCkpLnRvKG5ldyBHZW5lcmljVHlwZTxSZWY8Q2xpZW50Q29uZmlnPj4oKSB7CisgICAgICAgIH0pLmluKFJlcXVlc3RTY29wZWQuY2xhc3MpOworCisgICAgICAgIGJpbmRGYWN0b3J5KFJlcXVlc3RDb250ZXh0SW5qZWN0aW9uRmFjdG9yeS5jbGFzcykKKyAgICAgICAgICAgICAgICAudG8oQ2xpZW50UmVxdWVzdC5jbGFzcykKKyAgICAgICAgICAgICAgICAuaW4oUmVxdWVzdFNjb3BlZC5jbGFzcyk7CisKKyAgICAgICAgYmluZEZhY3RvcnkoUmVmZXJlbmNpbmdGYWN0b3J5LnJlZmVyZW5jZUZhY3RvcnkoKSkudG8obmV3IEdlbmVyaWNUeXBlPFJlZjxDbGllbnRSZXF1ZXN0Pj4oKSB7CisgICAgICAgIH0pLmluKFJlcXVlc3RTY29wZWQuY2xhc3MpOworCisgICAgICAgIGJpbmRGYWN0b3J5KFByb3BlcnRpZXNEZWxlZ2F0ZUZhY3RvcnkuY2xhc3MsIFNpbmdsZXRvbi5jbGFzcykudG8oUHJvcGVydGllc0RlbGVnYXRlLmNsYXNzKS5pbihSZXF1ZXN0U2NvcGVkLmNsYXNzKTsKKworICAgICAgICAvLyBDaHVua2VkSW5wdXQgZW50aXR5IHN1cHBvcnQKKyAgICAgICAgYmluZChDaHVua2VkSW5wdXRSZWFkZXIuY2xhc3MpLnRvKE1lc3NhZ2VCb2R5UmVhZGVyLmNsYXNzKS5pbihTaW5nbGV0b24uY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0NsaWVudENvbmZpZy5qYXZhIGIvY29yZS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvQ2xpZW50Q29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIyZWE0NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0NsaWVudENvbmZpZy5qYXZhCkBAIC0wLDAgKzEsODY2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZTsKKworaW1wb3J0IGphdmF4LndzLnJzLlJ1bnRpbWVUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhYmxlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5Db21tb25Qcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LkV4dGVuZGVkQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuc3BpLkNvbm5lY3RvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuc3BpLkNvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkF1dG9EaXNjb3ZlcmFibGVDb25maWd1cmF0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuQm9vdHN0cmFwQmFnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkJvb3RzdHJhcENvbmZpZ3VyYXRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Db250ZXh0UmVzb2x2ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkV4Y2VwdGlvbk1hcHBlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuSmF4cnNQcm92aWRlcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuU2VydmljZUZpbmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQmluZGluZ3M7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LlByb3ZpZGVyQmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnNwaS5BdXRvRGlzY292ZXJhYmxlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5MYXp5VmFsdWU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLlZhbHVlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5WYWx1ZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5NZXNzYWdlQm9keUZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW9kZWwuaW50ZXJuYWwuQ29tbW9uQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1vZGVsLmludGVybmFsLkNvbXBvbmVudEJhZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb2RlbC5pbnRlcm5hbC5NYW5hZ2VkT2JqZWN0c0ZpbmFsaXplcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLmludGVybmFsLlJlcXVlc3RTY29wZTsKKworLyoqCisgKiBKZXJzZXkgZXh0ZXJuYWxpemVkIGltcGxlbWVudGF0aW9uIG9mIGNsaWVudC1zaWRlIEpBWC1SUyB7QGxpbmsgamF2YXgud3MucnMuY29yZS5Db25maWd1cmFibGUKKyAqIGNvbmZpZ3VyYWJsZX0gY29udHJhY3QuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIENsaWVudENvbmZpZyBpbXBsZW1lbnRzIENvbmZpZ3VyYWJsZTxDbGllbnRDb25maWc+LCBFeHRlbmRlZENvbmZpZyB7CisgICAgLyoqCisgICAgICogSW50ZXJuYWwgY29uZmlndXJhdGlvbiBzdGF0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0YXRlIHN0YXRlOworCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUnVudGltZUNvbmZpZ0NvbmZpZ3VyYXRvciBpbXBsZW1lbnRzIEJvb3RzdHJhcENvbmZpZ3VyYXRvciB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdGF0ZSBydW50aW1lQ29uZmlnOworCisgICAgICAgIHByaXZhdGUgUnVudGltZUNvbmZpZ0NvbmZpZ3VyYXRvcihTdGF0ZSBydW50aW1lQ29uZmlnKSB7CisgICAgICAgICAgICB0aGlzLnJ1bnRpbWVDb25maWcgPSBydW50aW1lQ29uZmlnOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGluaXQoSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyLCBCb290c3RyYXBCYWcgYm9vdHN0cmFwQmFnKSB7CisgICAgICAgICAgICBib290c3RyYXBCYWcuc2V0Q29uZmlndXJhdGlvbihydW50aW1lQ29uZmlnKTsKKyAgICAgICAgICAgIGluamVjdGlvbk1hbmFnZXIucmVnaXN0ZXIoQmluZGluZ3Muc2VydmljZShydW50aW1lQ29uZmlnKS50byhDb25maWd1cmF0aW9uLmNsYXNzKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGVuY2Fwc3VsYXRpb24gb2YgdGhlIGludGVybmFsIGNvbmZpZ3VyYXRpb24gc3RhdGUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3RhdGUgaW1wbGVtZW50cyBDb25maWd1cmFibGU8U3RhdGU+LCBFeHRlbmRlZENvbmZpZyB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFN0cmF0ZWd5IHRoYXQgcmV0dXJucyB0aGUgc2FtZSBzdGF0ZSBpbnN0YW5jZS4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0YXRlQ2hhbmdlU3RyYXRlZ3kgSURFTlRJVFkgPSBzdGF0ZSAtPiBzdGF0ZTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFN0cmF0ZWd5IHRoYXQgcmV0dXJucyBhIGNvcHkgb2YgdGhlIHN0YXRlIGluc3RhbmNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RhdGVDaGFuZ2VTdHJhdGVneSBDT1BZX09OX0NIQU5HRSA9IFN0YXRlOjpjb3B5OworCisgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgU3RhdGVDaGFuZ2VTdHJhdGVneSBzdHJhdGVneTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb21tb25Db25maWcgY29tbW9uQ29uZmlnOworICAgICAgICBwcml2YXRlIGZpbmFsIEplcnNleUNsaWVudCBjbGllbnQ7CisgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgQ29ubmVjdG9yUHJvdmlkZXIgY29ubmVjdG9yUHJvdmlkZXI7CisgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yU2VydmljZTsKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2Ugc2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlOworCisgICAgICAgIHByaXZhdGUgZmluYWwgTGF6eVZhbHVlPENsaWVudFJ1bnRpbWU+IHJ1bnRpbWUgPSBWYWx1ZXMubGF6eSgoVmFsdWU8Q2xpZW50UnVudGltZT4pIHRoaXM6OmluaXRSdW50aW1lKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29uZmlndXJhdGlvbiBzdGF0ZSBjaGFuZ2Ugc3RyYXRlZ3kuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGludGVyZmFjZSBTdGF0ZUNoYW5nZVN0cmF0ZWd5IHsKKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBJbnZva2VkIHdoZW5ldmVyIGEgbXV0YXRvciBtZXRob2QgaXMgY2FsbGVkIGluIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uCisgICAgICAgICAgICAgKiBzdGF0ZS4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBAcGFyYW0gc3RhdGUgY29uZmlndXJhdGlvbiBzdGF0ZSB0byBiZSBtdXRhdGVkLgorICAgICAgICAgICAgICogQHJldHVybiBzdGF0ZSBpbnN0YW5jZSB0aGF0IHdpbGwgYmUgbXV0YXRlZCBhbmQgcmV0dXJuZWQgZnJvbSB0aGUKKyAgICAgICAgICAgICAqIGludm9rZWQgY29uZmlndXJhdGlvbiBzdGF0ZSBtdXRhdG9yIG1ldGhvZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgU3RhdGUgb25DaGFuZ2UoZmluYWwgU3RhdGUgc3RhdGUpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIERlZmF1bHQgY29uZmlndXJhdGlvbiBzdGF0ZSBjb25zdHJ1Y3RvciB3aXRoIHtAbGluayBTdGF0ZUNoYW5nZVN0cmF0ZWd5ICJpZGVudGl0eSJ9CisgICAgICAgICAqIHN0YXRlIGNoYW5nZSBzdHJhdGVneS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNsaWVudCBib3VuZCBwYXJlbnQgSmVyc2V5IGNsaWVudC4KKyAgICAgICAgICovCisgICAgICAgIFN0YXRlKGZpbmFsIEplcnNleUNsaWVudCBjbGllbnQpIHsKKyAgICAgICAgICAgIHRoaXMuc3RyYXRlZ3kgPSBJREVOVElUWTsKKyAgICAgICAgICAgIHRoaXMuY29tbW9uQ29uZmlnID0gbmV3IENvbW1vbkNvbmZpZyhSdW50aW1lVHlwZS5DTElFTlQsIENvbXBvbmVudEJhZy5FWENMVURFX0VNUFRZKTsKKyAgICAgICAgICAgIHRoaXMuY2xpZW50ID0gY2xpZW50OworICAgICAgICAgICAgZmluYWwgSXRlcmF0b3I8Q29ubmVjdG9yUHJvdmlkZXI+IGl0ZXJhdG9yID0gU2VydmljZUZpbmRlci5maW5kKENvbm5lY3RvclByb3ZpZGVyLmNsYXNzKS5pdGVyYXRvcigpOworICAgICAgICAgICAgaWYgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdG9yUHJvdmlkZXIgPSBpdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdG9yUHJvdmlkZXIgPSBuZXcgSHR0cFVybENvbm5lY3RvclByb3ZpZGVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ29weSB0aGUgb3JpZ2luYWwgY29uZmlndXJhdGlvbiBzdGF0ZSB3aGlsZSB1c2luZyB0aGUgZGVmYXVsdCBzdGF0ZSBjaGFuZ2UKKyAgICAgICAgICogc3RyYXRlZ3kuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjbGllbnQgICBuZXcgSmVyc2V5IGNsaWVudCBwYXJlbnQgZm9yIHRoZSBzdGF0ZS4KKyAgICAgICAgICogQHBhcmFtIG9yaWdpbmFsIGNvbmZpZ3VyYXRpb24gc3RyYXRlZ3kgdG8gYmUgY29waWVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBTdGF0ZShmaW5hbCBKZXJzZXlDbGllbnQgY2xpZW50LCBmaW5hbCBTdGF0ZSBvcmlnaW5hbCkgeworICAgICAgICAgICAgdGhpcy5zdHJhdGVneSA9IElERU5USVRZOworICAgICAgICAgICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7CisgICAgICAgICAgICB0aGlzLmNvbW1vbkNvbmZpZyA9IG5ldyBDb21tb25Db25maWcob3JpZ2luYWwuY29tbW9uQ29uZmlnKTsKKyAgICAgICAgICAgIHRoaXMuY29ubmVjdG9yUHJvdmlkZXIgPSBvcmlnaW5hbC5jb25uZWN0b3JQcm92aWRlcjsKKyAgICAgICAgICAgIHRoaXMuZXhlY3V0b3JTZXJ2aWNlID0gb3JpZ2luYWwuZXhlY3V0b3JTZXJ2aWNlOworICAgICAgICAgICAgdGhpcy5zY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UgPSBvcmlnaW5hbC5zY2hlZHVsZWRFeGVjdXRvclNlcnZpY2U7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGEgY29weSBvZiB0aGUgY29uZmlndXJhdGlvbiBzdGF0ZSB3aXRoaW4gdGhlIHNhbWUgcGFyZW50IEplcnNleQorICAgICAgICAgKiBjbGllbnQgaW5zdGFuY2Ugc2NvcGUuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gY29uZmlndXJhdGlvbiBzdGF0ZSBjb3B5LgorICAgICAgICAgKi8KKyAgICAgICAgU3RhdGUgY29weSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RhdGUodGhpcy5jbGllbnQsIHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhIGNvcHkgb2YgdGhlIGNvbmZpZ3VyYXRpb24gc3RhdGUgaW4gYSBzY29wZSBvZiB0aGUgZ2l2ZW4KKyAgICAgICAgICogcGFyZW50IEplcnNleSBjbGllbnQgaW5zdGFuY2UuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjbGllbnQgcGFyZW50IEplcnNleSBjbGllbnQgaW5zdGFuY2UuCisgICAgICAgICAqIEByZXR1cm4gY29uZmlndXJhdGlvbiBzdGF0ZSBjb3B5LgorICAgICAgICAgKi8KKyAgICAgICAgU3RhdGUgY29weShmaW5hbCBKZXJzZXlDbGllbnQgY2xpZW50KSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0YXRlKGNsaWVudCwgdGhpcyk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIG1hcmtBc1NoYXJlZCgpIHsKKyAgICAgICAgICAgIHN0cmF0ZWd5ID0gQ09QWV9PTl9DSEFOR0U7CisgICAgICAgIH0KKworICAgICAgICBTdGF0ZSBwcmVJbml0aWFsaXplKCkgeworICAgICAgICAgICAgZmluYWwgU3RhdGUgc3RhdGUgPSBzdHJhdGVneS5vbkNoYW5nZSh0aGlzKTsKKyAgICAgICAgICAgIHN0YXRlLnN0cmF0ZWd5ID0gQ09QWV9PTl9DSEFOR0U7CisgICAgICAgICAgICBzdGF0ZS5ydW50aW1lLmdldCgpLnByZUluaXRpYWxpemUoKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0ZTsKKworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdGF0ZSBwcm9wZXJ0eShmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgICAgICBmaW5hbCBTdGF0ZSBzdGF0ZSA9IHN0cmF0ZWd5Lm9uQ2hhbmdlKHRoaXMpOworICAgICAgICAgICAgc3RhdGUuY29tbW9uQ29uZmlnLnByb3BlcnR5KG5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdGF0ZSBsb2FkRnJvbShmaW5hbCBDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICAgICAgZmluYWwgU3RhdGUgc3RhdGUgPSBzdHJhdGVneS5vbkNoYW5nZSh0aGlzKTsKKyAgICAgICAgICAgIHN0YXRlLmNvbW1vbkNvbmZpZy5sb2FkRnJvbShjb25maWcpOworICAgICAgICAgICAgcmV0dXJuIHN0YXRlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdGF0ZSByZWdpc3RlcihmaW5hbCBDbGFzczw/PiBwcm92aWRlckNsYXNzKSB7CisgICAgICAgICAgICBmaW5hbCBTdGF0ZSBzdGF0ZSA9IHN0cmF0ZWd5Lm9uQ2hhbmdlKHRoaXMpOworICAgICAgICAgICAgc3RhdGUuY29tbW9uQ29uZmlnLnJlZ2lzdGVyKHByb3ZpZGVyQ2xhc3MpOworICAgICAgICAgICAgcmV0dXJuIHN0YXRlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdGF0ZSByZWdpc3RlcihmaW5hbCBPYmplY3QgcHJvdmlkZXIpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0YXRlIHN0YXRlID0gc3RyYXRlZ3kub25DaGFuZ2UodGhpcyk7CisgICAgICAgICAgICBzdGF0ZS5jb21tb25Db25maWcucmVnaXN0ZXIocHJvdmlkZXIpOworICAgICAgICAgICAgcmV0dXJuIHN0YXRlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdGF0ZSByZWdpc3RlcihmaW5hbCBDbGFzczw/PiBwcm92aWRlckNsYXNzLCBmaW5hbCBpbnQgYmluZGluZ1ByaW9yaXR5KSB7CisgICAgICAgICAgICBmaW5hbCBTdGF0ZSBzdGF0ZSA9IHN0cmF0ZWd5Lm9uQ2hhbmdlKHRoaXMpOworICAgICAgICAgICAgc3RhdGUuY29tbW9uQ29uZmlnLnJlZ2lzdGVyKHByb3ZpZGVyQ2xhc3MsIGJpbmRpbmdQcmlvcml0eSk7CisgICAgICAgICAgICByZXR1cm4gc3RhdGU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0YXRlIHJlZ2lzdGVyKGZpbmFsIENsYXNzPD8+IHByb3ZpZGVyQ2xhc3MsIGZpbmFsIENsYXNzPD8+Li4uIGNvbnRyYWN0cykgeworICAgICAgICAgICAgZmluYWwgU3RhdGUgc3RhdGUgPSBzdHJhdGVneS5vbkNoYW5nZSh0aGlzKTsKKyAgICAgICAgICAgIHN0YXRlLmNvbW1vbkNvbmZpZy5yZWdpc3Rlcihwcm92aWRlckNsYXNzLCBjb250cmFjdHMpOworICAgICAgICAgICAgcmV0dXJuIHN0YXRlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdGF0ZSByZWdpc3RlcihmaW5hbCBDbGFzczw/PiBwcm92aWRlckNsYXNzLCBmaW5hbCBNYXA8Q2xhc3M8Pz4sIEludGVnZXI+IGNvbnRyYWN0cykgeworICAgICAgICAgICAgZmluYWwgU3RhdGUgc3RhdGUgPSBzdHJhdGVneS5vbkNoYW5nZSh0aGlzKTsKKyAgICAgICAgICAgIHN0YXRlLmNvbW1vbkNvbmZpZy5yZWdpc3Rlcihwcm92aWRlckNsYXNzLCBjb250cmFjdHMpOworICAgICAgICAgICAgcmV0dXJuIHN0YXRlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdGF0ZSByZWdpc3RlcihmaW5hbCBPYmplY3QgcHJvdmlkZXIsIGZpbmFsIGludCBiaW5kaW5nUHJpb3JpdHkpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0YXRlIHN0YXRlID0gc3RyYXRlZ3kub25DaGFuZ2UodGhpcyk7CisgICAgICAgICAgICBzdGF0ZS5jb21tb25Db25maWcucmVnaXN0ZXIocHJvdmlkZXIsIGJpbmRpbmdQcmlvcml0eSk7CisgICAgICAgICAgICByZXR1cm4gc3RhdGU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0YXRlIHJlZ2lzdGVyKGZpbmFsIE9iamVjdCBwcm92aWRlciwgZmluYWwgQ2xhc3M8Pz4uLi4gY29udHJhY3RzKSB7CisgICAgICAgICAgICBmaW5hbCBTdGF0ZSBzdGF0ZSA9IHN0cmF0ZWd5Lm9uQ2hhbmdlKHRoaXMpOworICAgICAgICAgICAgc3RhdGUuY29tbW9uQ29uZmlnLnJlZ2lzdGVyKHByb3ZpZGVyLCBjb250cmFjdHMpOworICAgICAgICAgICAgcmV0dXJuIHN0YXRlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdGF0ZSByZWdpc3RlcihmaW5hbCBPYmplY3QgcHJvdmlkZXIsIGZpbmFsIE1hcDxDbGFzczw/PiwgSW50ZWdlcj4gY29udHJhY3RzKSB7CisgICAgICAgICAgICBmaW5hbCBTdGF0ZSBzdGF0ZSA9IHN0cmF0ZWd5Lm9uQ2hhbmdlKHRoaXMpOworICAgICAgICAgICAgc3RhdGUuY29tbW9uQ29uZmlnLnJlZ2lzdGVyKHByb3ZpZGVyLCBjb250cmFjdHMpOworICAgICAgICAgICAgcmV0dXJuIHN0YXRlOworICAgICAgICB9CisKKyAgICAgICAgU3RhdGUgY29ubmVjdG9yUHJvdmlkZXIoZmluYWwgQ29ubmVjdG9yUHJvdmlkZXIgcHJvdmlkZXIpIHsKKyAgICAgICAgICAgIGlmIChwcm92aWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLk5VTExfQ09OTkVDVE9SX1BST1ZJREVSKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgU3RhdGUgc3RhdGUgPSBzdHJhdGVneS5vbkNoYW5nZSh0aGlzKTsKKyAgICAgICAgICAgIHN0YXRlLmNvbm5lY3RvclByb3ZpZGVyID0gcHJvdmlkZXI7CisgICAgICAgICAgICByZXR1cm4gc3RhdGU7CisgICAgICAgIH0KKworICAgICAgICBTdGF0ZSBleGVjdXRvclNlcnZpY2UoZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yU2VydmljZSkgeworICAgICAgICAgICAgaWYgKGV4ZWN1dG9yU2VydmljZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLk5VTExfRVhFQ1VUT1JfU0VSVklDRSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIFN0YXRlIHN0YXRlID0gc3RyYXRlZ3kub25DaGFuZ2UodGhpcyk7CisgICAgICAgICAgICBzdGF0ZS5leGVjdXRvclNlcnZpY2UgPSBleGVjdXRvclNlcnZpY2U7CisgICAgICAgICAgICByZXR1cm4gc3RhdGU7CisgICAgICAgIH0KKworICAgICAgICBTdGF0ZSBzY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UoZmluYWwgU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlIHNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSkgeworICAgICAgICAgICAgaWYgKHNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLk5VTExfU0NIRURVTEVEX0VYRUNVVE9SX1NFUlZJQ0UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBTdGF0ZSBzdGF0ZSA9IHN0cmF0ZWd5Lm9uQ2hhbmdlKHRoaXMpOworICAgICAgICAgICAgc3RhdGUuc2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlID0gc2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlOworICAgICAgICAgICAgcmV0dXJuIHN0YXRlOworICAgICAgICB9CisKKyAgICAgICAgQ29ubmVjdG9yIGdldENvbm5lY3RvcigpIHsKKyAgICAgICAgICAgIC8vIEdldCB0aGUgY29ubmVjdG9yIG9ubHkgaWYgdGhlIHJ1bnRpbWUgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCisgICAgICAgICAgICByZXR1cm4gKHJ1bnRpbWUuaXNJbml0aWFsaXplZCgpKSA/IHJ1bnRpbWUuZ2V0KCkuZ2V0Q29ubmVjdG9yKCkgOiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQ29ubmVjdG9yUHJvdmlkZXIgZ2V0Q29ubmVjdG9yUHJvdmlkZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gY29ubmVjdG9yUHJvdmlkZXI7CisgICAgICAgIH0KKworICAgICAgICBFeGVjdXRvclNlcnZpY2UgZ2V0RXhlY3V0b3JTZXJ2aWNlKCkgeworICAgICAgICAgICAgcmV0dXJuIGV4ZWN1dG9yU2VydmljZTsKKyAgICAgICAgfQorCisgICAgICAgIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSBnZXRTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gc2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlOworICAgICAgICB9CisKKyAgICAgICAgSmVyc2V5Q2xpZW50IGdldENsaWVudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBjbGllbnQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0YXRlIGdldENvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUnVudGltZVR5cGUgZ2V0UnVudGltZVR5cGUoKSB7CisgICAgICAgICAgICByZXR1cm4gY29tbW9uQ29uZmlnLmdldENvbmZpZ3VyYXRpb24oKS5nZXRSdW50aW1lVHlwZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFByb3BlcnRpZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gY29tbW9uQ29uZmlnLmdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0aWVzKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIGNvbW1vbkNvbmZpZy5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UHJvcGVydHkobmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENvbGxlY3Rpb248U3RyaW5nPiBnZXRQcm9wZXJ0eU5hbWVzKCkgeworICAgICAgICAgICAgcmV0dXJuIGNvbW1vbkNvbmZpZy5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UHJvcGVydHlOYW1lcygpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUHJvcGVydHkoZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIHJldHVybiBjb21tb25Db25maWcuZ2V0Q29uZmlndXJhdGlvbigpLmlzUHJvcGVydHkobmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKGZpbmFsIEZlYXR1cmUgZmVhdHVyZSkgeworICAgICAgICAgICAgcmV0dXJuIGNvbW1vbkNvbmZpZy5nZXRDb25maWd1cmF0aW9uKCkuaXNFbmFibGVkKGZlYXR1cmUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChmaW5hbCBDbGFzczw/IGV4dGVuZHMgRmVhdHVyZT4gZmVhdHVyZUNsYXNzKSB7CisgICAgICAgICAgICByZXR1cm4gY29tbW9uQ29uZmlnLmdldENvbmZpZ3VyYXRpb24oKS5pc0VuYWJsZWQoZmVhdHVyZUNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlZ2lzdGVyZWQoZmluYWwgT2JqZWN0IGNvbXBvbmVudCkgeworICAgICAgICAgICAgcmV0dXJuIGNvbW1vbkNvbmZpZy5nZXRDb25maWd1cmF0aW9uKCkuaXNSZWdpc3RlcmVkKGNvbXBvbmVudCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZWdpc3RlcmVkKGZpbmFsIENsYXNzPD8+IGNvbXBvbmVudENsYXNzKSB7CisgICAgICAgICAgICByZXR1cm4gY29tbW9uQ29uZmlnLmdldENvbmZpZ3VyYXRpb24oKS5pc1JlZ2lzdGVyZWQoY29tcG9uZW50Q2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBNYXA8Q2xhc3M8Pz4sIEludGVnZXI+IGdldENvbnRyYWN0cyhmaW5hbCBDbGFzczw/PiBjb21wb25lbnRDbGFzcykgeworICAgICAgICAgICAgcmV0dXJuIGNvbW1vbkNvbmZpZy5nZXRDb25maWd1cmF0aW9uKCkuZ2V0Q29udHJhY3RzKGNvbXBvbmVudENsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICAgICAgcmV0dXJuIGNvbW1vbkNvbmZpZy5nZXRDb25maWd1cmF0aW9uKCkuZ2V0Q2xhc3NlcygpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTZXQ8T2JqZWN0PiBnZXRJbnN0YW5jZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gY29tbW9uQ29uZmlnLmdldENvbmZpZ3VyYXRpb24oKS5nZXRJbnN0YW5jZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZUF1dG9EaXNjb3ZlcmFibGVQcm92aWRlcnMoSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8QXV0b0Rpc2NvdmVyYWJsZT4gYXV0b0Rpc2NvdmVyYWJsZXMpIHsKKyAgICAgICAgICAgIGNvbW1vbkNvbmZpZy5jb25maWd1cmVBdXRvRGlzY292ZXJhYmxlUHJvdmlkZXJzKGluamVjdGlvbk1hbmFnZXIsIGF1dG9EaXNjb3ZlcmFibGVzLCBmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBjb25maWd1cmVGb3JjZWRBdXRvRGlzY292ZXJhYmxlUHJvdmlkZXJzKEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlcikgeworICAgICAgICAgICAgY29tbW9uQ29uZmlnLmNvbmZpZ3VyZUF1dG9EaXNjb3ZlcmFibGVQcm92aWRlcnMoaW5qZWN0aW9uTWFuYWdlciwgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCksIHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgY29uZmlndXJlTWV0YVByb3ZpZGVycyhJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIsIE1hbmFnZWRPYmplY3RzRmluYWxpemVyIGZpbmFsaXplcikgeworICAgICAgICAgICAgY29tbW9uQ29uZmlnLmNvbmZpZ3VyZU1ldGFQcm92aWRlcnMoaW5qZWN0aW9uTWFuYWdlciwgZmluYWxpemVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb21wb25lbnRCYWcgZ2V0Q29tcG9uZW50QmFnKCkgeworICAgICAgICAgICAgcmV0dXJuIGNvbW1vbkNvbmZpZy5nZXRDb21wb25lbnRCYWcoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbml0aWFsaXplIHRoZSBuZXdseSBjb25zdHJ1Y3RlZCBjbGllbnQgaW5zdGFuY2UuCisgICAgICAgICAqLworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygiTWV0aG9kT25seVVzZWRGcm9tSW5uZXJDbGFzcyIpCisgICAgICAgIHByaXZhdGUgQ2xpZW50UnVudGltZSBpbml0UnVudGltZSgpIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBFbnN1cmUgdGhhdCBhbnkgYXR0ZW1wdCB0byBhZGQgYSBuZXcgcHJvdmlkZXIsIGZlYXR1cmUsIGJpbmRlciBvciBtb2RpZnkgdGhlIGNvbm5lY3RvcgorICAgICAgICAgICAgICogd2lsbCBjYXVzZSBhIGNvcHkgb2YgdGhlIGN1cnJlbnQgc3RhdGUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIG1hcmtBc1NoYXJlZCgpOworCisgICAgICAgICAgICBmaW5hbCBTdGF0ZSBydW50aW1lQ2ZnU3RhdGUgPSB0aGlzLmNvcHkoKTsKKyAgICAgICAgICAgIHJ1bnRpbWVDZmdTdGF0ZS5tYXJrQXNTaGFyZWQoKTsKKworICAgICAgICAgICAgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyID0gSW5qZWN0aW9ucy5jcmVhdGVJbmplY3Rpb25NYW5hZ2VyKCk7CisgICAgICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyKG5ldyBDbGllbnRCaW5kZXIocnVudGltZUNmZ1N0YXRlLmdldFByb3BlcnRpZXMoKSkpOworCisgICAgICAgICAgICBCb290c3RyYXBCYWcgYm9vdHN0cmFwQmFnID0gbmV3IEJvb3RzdHJhcEJhZygpOworICAgICAgICAgICAgYm9vdHN0cmFwQmFnLnNldE1hbmFnZWRPYmplY3RzRmluYWxpemVyKG5ldyBNYW5hZ2VkT2JqZWN0c0ZpbmFsaXplcihpbmplY3Rpb25NYW5hZ2VyKSk7CisgICAgICAgICAgICBMaXN0PEJvb3RzdHJhcENvbmZpZ3VyYXRvcj4gYm9vdHN0cmFwQ29uZmlndXJhdG9ycyA9IEFycmF5cy5hc0xpc3QoCisgICAgICAgICAgICAgICAgICAgIG5ldyBSZXF1ZXN0U2NvcGUuUmVxdWVzdFNjb3BlQ29uZmlndXJhdG9yKCksCisgICAgICAgICAgICAgICAgICAgIG5ldyBSdW50aW1lQ29uZmlnQ29uZmlndXJhdG9yKHJ1bnRpbWVDZmdTdGF0ZSksCisgICAgICAgICAgICAgICAgICAgIG5ldyBDb250ZXh0UmVzb2x2ZXJGYWN0b3J5LkNvbnRleHRSZXNvbHZlcnNDb25maWd1cmF0b3IoKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IE1lc3NhZ2VCb2R5RmFjdG9yeS5NZXNzYWdlQm9keVdvcmtlcnNDb25maWd1cmF0b3IoKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IEV4Y2VwdGlvbk1hcHBlckZhY3RvcnkuRXhjZXB0aW9uTWFwcGVyc0NvbmZpZ3VyYXRvcigpLAorICAgICAgICAgICAgICAgICAgICBuZXcgSmF4cnNQcm92aWRlcnMuUHJvdmlkZXJzQ29uZmlndXJhdG9yKCksCisgICAgICAgICAgICAgICAgICAgIG5ldyBBdXRvRGlzY292ZXJhYmxlQ29uZmlndXJhdG9yKFJ1bnRpbWVUeXBlLkNMSUVOVCkpOworICAgICAgICAgICAgYm9vdHN0cmFwQ29uZmlndXJhdG9ycy5mb3JFYWNoKGNvbmZpZ3VyYXRvciAtPiBjb25maWd1cmF0b3IuaW5pdChpbmplY3Rpb25NYW5hZ2VyLCBib290c3RyYXBCYWcpKTsKKworICAgICAgICAgICAgLy8gQXV0b0Rpc2NvdmVyYWJsZS4KKyAgICAgICAgICAgIGlmICghQ29tbW9uUHJvcGVydGllcy5nZXRWYWx1ZShydW50aW1lQ2ZnU3RhdGUuZ2V0UHJvcGVydGllcygpLCBSdW50aW1lVHlwZS5DTElFTlQsCisgICAgICAgICAgICAgICAgICAgIENvbW1vblByb3BlcnRpZXMuRkVBVFVSRV9BVVRPX0RJU0NPVkVSWV9ESVNBQkxFLCBCb29sZWFuLkZBTFNFLCBCb29sZWFuLmNsYXNzKSkgeworICAgICAgICAgICAgICAgIHJ1bnRpbWVDZmdTdGF0ZS5jb25maWd1cmVBdXRvRGlzY292ZXJhYmxlUHJvdmlkZXJzKGluamVjdGlvbk1hbmFnZXIsIGJvb3RzdHJhcEJhZy5nZXRBdXRvRGlzY292ZXJhYmxlcygpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcnVudGltZUNmZ1N0YXRlLmNvbmZpZ3VyZUZvcmNlZEF1dG9EaXNjb3ZlcmFibGVQcm92aWRlcnMoaW5qZWN0aW9uTWFuYWdlcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENvbmZpZ3VyZSBiaW5kZXJzIGFuZCBmZWF0dXJlcy4KKyAgICAgICAgICAgIHJ1bnRpbWVDZmdTdGF0ZS5jb25maWd1cmVNZXRhUHJvdmlkZXJzKGluamVjdGlvbk1hbmFnZXIsIGJvb3RzdHJhcEJhZy5nZXRNYW5hZ2VkT2JqZWN0c0ZpbmFsaXplcigpKTsKKworICAgICAgICAgICAgLy8gQmluZCBwcm92aWRlcnMuCisgICAgICAgICAgICBQcm92aWRlckJpbmRlci5iaW5kUHJvdmlkZXJzKHJ1bnRpbWVDZmdTdGF0ZS5nZXRDb21wb25lbnRCYWcoKSwgUnVudGltZVR5cGUuQ0xJRU5ULCBudWxsLCBpbmplY3Rpb25NYW5hZ2VyKTsKKworICAgICAgICAgICAgQ2xpZW50RXhlY3V0b3JQcm92aWRlcnNDb25maWd1cmF0b3IgZXhlY3V0b3JQcm92aWRlcnNDb25maWd1cmF0b3IgPQorICAgICAgICAgICAgICAgICAgICBuZXcgQ2xpZW50RXhlY3V0b3JQcm92aWRlcnNDb25maWd1cmF0b3IocnVudGltZUNmZ1N0YXRlLmdldENvbXBvbmVudEJhZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVDZmdTdGF0ZS5jbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5leGVjdXRvclNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UpOworICAgICAgICAgICAgZXhlY3V0b3JQcm92aWRlcnNDb25maWd1cmF0b3IuaW5pdChpbmplY3Rpb25NYW5hZ2VyLCBib290c3RyYXBCYWcpOworCisgICAgICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLmNvbXBsZXRlUmVnaXN0cmF0aW9uKCk7CisKKyAgICAgICAgICAgIGJvb3RzdHJhcENvbmZpZ3VyYXRvcnMuZm9yRWFjaChjb25maWd1cmF0b3IgLT4gY29uZmlndXJhdG9yLnBvc3RJbml0KGluamVjdGlvbk1hbmFnZXIsIGJvb3RzdHJhcEJhZykpOworCisgICAgICAgICAgICBmaW5hbCBDbGllbnRDb25maWcgY29uZmlndXJhdGlvbiA9IG5ldyBDbGllbnRDb25maWcocnVudGltZUNmZ1N0YXRlKTsKKyAgICAgICAgICAgIGZpbmFsIENvbm5lY3RvciBjb25uZWN0b3IgPSBjb25uZWN0b3JQcm92aWRlci5nZXRDb25uZWN0b3IoY2xpZW50LCBjb25maWd1cmF0aW9uKTsKKyAgICAgICAgICAgIGZpbmFsIENsaWVudFJ1bnRpbWUgY3J0ID0gbmV3IENsaWVudFJ1bnRpbWUoY29uZmlndXJhdGlvbiwgY29ubmVjdG9yLCBpbmplY3Rpb25NYW5hZ2VyLCBib290c3RyYXBCYWcpOworCisgICAgICAgICAgICBjbGllbnQucmVnaXN0ZXJTaHV0ZG93bkhvb2soY3J0KTsKKyAgICAgICAgICAgIHJldHVybiBjcnQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvKSB7CisgICAgICAgICAgICBpZiAodGhpcyA9PSBvKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBTdGF0ZSBzdGF0ZSA9IChTdGF0ZSkgbzsKKworICAgICAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsID8gIWNsaWVudC5lcXVhbHMoc3RhdGUuY2xpZW50KSA6IHN0YXRlLmNsaWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFjb21tb25Db25maWcuZXF1YWxzKHN0YXRlLmNvbW1vbkNvbmZpZykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY29ubmVjdG9yUHJvdmlkZXIgPT0gbnVsbCA/IHN0YXRlLmNvbm5lY3RvclByb3ZpZGVyID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgOiBjb25uZWN0b3JQcm92aWRlci5lcXVhbHMoc3RhdGUuY29ubmVjdG9yUHJvdmlkZXIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICBpbnQgcmVzdWx0ID0gY29tbW9uQ29uZmlnLmhhc2hDb2RlKCk7CisgICAgICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIChjbGllbnQgIT0gbnVsbCA/IGNsaWVudC5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIChjb25uZWN0b3JQcm92aWRlciAhPSBudWxsID8gY29ubmVjdG9yUHJvdmlkZXIuaGFzaENvZGUoKSA6IDApOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBKZXJzZXkgY29uZmlndXJhdGlvbiBpbnN0YW5jZSB3aXRoIHRoZSBkZWZhdWx0IGZlYXR1cmVzCisgICAgICogYW5kIHByb3BlcnR5IHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xpZW50Q29uZmlnKCkgeworICAgICAgICB0aGlzLnN0YXRlID0gbmV3IFN0YXRlKG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBKZXJzZXkgY29uZmlndXJhdGlvbiBpbnN0YW5jZSBhbmQgcmVnaXN0ZXIgdGhlIHByb3ZpZGVkIGxpc3Qgb2YgcHJvdmlkZXIgY2xhc3Nlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm92aWRlckNsYXNzZXMgcHJvdmlkZXIgY2xhc3NlcyB0byBiZSByZWdpc3RlcmVkIHdpdGggdGhpcyBjbGllbnQgY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xpZW50Q29uZmlnKGZpbmFsIENsYXNzPD8+Li4uIHByb3ZpZGVyQ2xhc3NlcykgeworICAgICAgICB0aGlzKCk7CisgICAgICAgIGZvciAoZmluYWwgQ2xhc3M8Pz4gcHJvdmlkZXJDbGFzcyA6IHByb3ZpZGVyQ2xhc3NlcykgeworICAgICAgICAgICAgc3RhdGUucmVnaXN0ZXIocHJvdmlkZXJDbGFzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgSmVyc2V5IGNvbmZpZ3VyYXRpb24gaW5zdGFuY2UgYW5kIHJlZ2lzdGVyIHRoZSBwcm92aWRlZCBsaXN0IG9mIHByb3ZpZGVyIGluc3RhbmNlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm92aWRlcnMgcHJvdmlkZXIgaW5zdGFuY2VzIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIGNsaWVudCBjb25maWd1cmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBDbGllbnRDb25maWcoZmluYWwgT2JqZWN0Li4uIHByb3ZpZGVycykgeworICAgICAgICB0aGlzKCk7CisgICAgICAgIGZvciAoZmluYWwgT2JqZWN0IHByb3ZpZGVyIDogcHJvdmlkZXJzKSB7CisgICAgICAgICAgICBzdGF0ZS5yZWdpc3Rlcihwcm92aWRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgSmVyc2V5IGNvbmZpZ3VyYXRpb24gaW5zdGFuY2Ugd2l0aCB0aGUgZmVhdHVyZXMgYXMgd2VsbCBhcworICAgICAqIHByb3BlcnR5IHZhbHVlcyBjb3BpZWQgZnJvbSB0aGUgc3VwcGxpZWQgSkFYLVJTIGNvbmZpZ3VyYXRpb24gaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50IHBhcmVudCBKZXJzZXkgY2xpZW50IGluc3RhbmNlLgorICAgICAqLworICAgIENsaWVudENvbmZpZyhmaW5hbCBKZXJzZXlDbGllbnQgcGFyZW50KSB7CisgICAgICAgIHRoaXMuc3RhdGUgPSBuZXcgU3RhdGUocGFyZW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgSmVyc2V5IGNvbmZpZ3VyYXRpb24gaW5zdGFuY2Ugd2l0aCB0aGUgZmVhdHVyZXMgYXMgd2VsbCBhcworICAgICAqIHByb3BlcnR5IHZhbHVlcyBjb3BpZWQgZnJvbSB0aGUgc3VwcGxpZWQgSkFYLVJTIGNvbmZpZ3VyYXRpb24gaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50IHBhcmVudCBKZXJzZXkgY2xpZW50IGluc3RhbmNlLgorICAgICAqIEBwYXJhbSB0aGF0ICAgb3JpZ2luYWwge0BsaW5rIGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbn0uCisgICAgICovCisgICAgQ2xpZW50Q29uZmlnKGZpbmFsIEplcnNleUNsaWVudCBwYXJlbnQsIGZpbmFsIENvbmZpZ3VyYXRpb24gdGhhdCkgeworICAgICAgICBpZiAodGhhdCBpbnN0YW5jZW9mIENsaWVudENvbmZpZykgeworICAgICAgICAgICAgc3RhdGUgPSAoKENsaWVudENvbmZpZykgdGhhdCkuc3RhdGUuY29weShwYXJlbnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RhdGUgPSBuZXcgU3RhdGUocGFyZW50KTsKKyAgICAgICAgICAgIHN0YXRlLmxvYWRGcm9tKHRoYXQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IEplcnNleSBjb25maWd1cmF0aW9uIGluc3RhbmNlIHVzaW5nIHRoZSBzdXBwbGllZCBzdGF0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGF0ZSB0byBiZSByZWZlcmVuY2VkIGZyb20gdGhlIG5ldyBjb25maWd1cmF0aW9uIGluc3RhbmNlLgorICAgICAqLworICAgIHByaXZhdGUgQ2xpZW50Q29uZmlnKGZpbmFsIFN0YXRlIHN0YXRlKSB7CisgICAgICAgIHRoaXMuc3RhdGUgPSBzdGF0ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUYWtlIGEgc25hcHNob3Qgb2YgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBhbmQgaXRzIGludGVybmFsIHN0YXRlLgorICAgICAqIDxwLz4KKyAgICAgKiBUaGUgcmV0dXJuZWQgY29uZmlndXJhdGlvbiBvYmplY3QgaXMgYW4gbmV3IGluc3RhbmNlIGRpZmZlcmVudCBmcm9tIHRoZQorICAgICAqIG9yaWdpbmFsIG9uZSwgaG93ZXZlciB0aGUgY2xvbmluZyBvZiB0aGUgaW50ZXJuYWwgY29uZmlndXJhdGlvbiBzdGF0ZSBpcworICAgICAqIGxhemlseSBkZWZlcnJlZCB1bnRpbCBlaXRoZXIgb3JpZ2luYWwgb3IgdGhlIHNuYXBzaG90IGNvbmZpZ3VyYXRpb24gaXMKKyAgICAgKiBtb2RpZmllZCBmb3IgdGhlIGZpcnN0IHRpbWUgc2luY2UgdGhlIHNuYXBzaG90IHdhcyB0YWtlbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gc25hcHNob3Qgb2YgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBDbGllbnRDb25maWcgc25hcHNob3QoKSB7CisgICAgICAgIHN0YXRlLm1hcmtBc1NoYXJlZCgpOworICAgICAgICByZXR1cm4gbmV3IENsaWVudENvbmZpZyhzdGF0ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZCB0aGUgaW50ZXJuYWwgY29uZmlndXJhdGlvbiBzdGF0ZSBmcm9tIGFuIGV4dGVybmFsbHkgcHJvdmlkZWQgY29uZmlndXJhdGlvbiBzdGF0ZS4KKyAgICAgKiA8cD4KKyAgICAgKiBDYWxsaW5nIHRoaXMgbWV0aG9kIGVmZmVjdGl2ZWx5IHJlcGxhY2VzIGV4aXN0aW5nIGNvbmZpZ3VyYXRpb24gc3RhdGUgb2YgdGhlIGluc3RhbmNlCisgICAgICogd2l0aCB0aGUgc3RhdGUgcmVwcmVzZW50ZWQgYnkgdGhlIGV4dGVybmFsbHkgcHJvdmlkZWQgY29uZmlndXJhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25maWcgZXh0ZXJuYWwgY29uZmlndXJhdGlvbiBzdGF0ZSB0byByZXBsYWNlIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoaXMgY29uZmlndXJhYmxlCisgICAgICogICAgICAgICAgICAgICBpbnN0YW5jZS4KKyAgICAgKiBAcmV0dXJuIHRoZSB1cGRhdGVkIGNsaWVudCBjb25maWd1cmF0aW9uIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBDbGllbnRDb25maWcgbG9hZEZyb20oZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWcpIHsKKyAgICAgICAgaWYgKGNvbmZpZyBpbnN0YW5jZW9mIENsaWVudENvbmZpZykgeworICAgICAgICAgICAgc3RhdGUgPSAoKENsaWVudENvbmZpZykgY29uZmlnKS5zdGF0ZS5jb3B5KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0ZS5sb2FkRnJvbShjb25maWcpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDbGllbnRDb25maWcgcmVnaXN0ZXIoZmluYWwgQ2xhc3M8Pz4gcHJvdmlkZXJDbGFzcykgeworICAgICAgICBzdGF0ZSA9IHN0YXRlLnJlZ2lzdGVyKHByb3ZpZGVyQ2xhc3MpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2xpZW50Q29uZmlnIHJlZ2lzdGVyKGZpbmFsIE9iamVjdCBwcm92aWRlcikgeworICAgICAgICBzdGF0ZSA9IHN0YXRlLnJlZ2lzdGVyKHByb3ZpZGVyKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENsaWVudENvbmZpZyByZWdpc3RlcihmaW5hbCBDbGFzczw/PiBwcm92aWRlckNsYXNzLCBmaW5hbCBpbnQgYmluZGluZ1ByaW9yaXR5KSB7CisgICAgICAgIHN0YXRlID0gc3RhdGUucmVnaXN0ZXIocHJvdmlkZXJDbGFzcywgYmluZGluZ1ByaW9yaXR5KTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENsaWVudENvbmZpZyByZWdpc3RlcihmaW5hbCBDbGFzczw/PiBwcm92aWRlckNsYXNzLCBmaW5hbCBDbGFzczw/Pi4uLiBjb250cmFjdHMpIHsKKyAgICAgICAgc3RhdGUgPSBzdGF0ZS5yZWdpc3Rlcihwcm92aWRlckNsYXNzLCBjb250cmFjdHMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2xpZW50Q29uZmlnIHJlZ2lzdGVyKGZpbmFsIENsYXNzPD8+IHByb3ZpZGVyQ2xhc3MsIGZpbmFsIE1hcDxDbGFzczw/PiwgSW50ZWdlcj4gY29udHJhY3RzKSB7CisgICAgICAgIHN0YXRlID0gc3RhdGUucmVnaXN0ZXIocHJvdmlkZXJDbGFzcywgY29udHJhY3RzKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENsaWVudENvbmZpZyByZWdpc3RlcihmaW5hbCBPYmplY3QgcHJvdmlkZXIsIGZpbmFsIGludCBiaW5kaW5nUHJpb3JpdHkpIHsKKyAgICAgICAgc3RhdGUgPSBzdGF0ZS5yZWdpc3Rlcihwcm92aWRlciwgYmluZGluZ1ByaW9yaXR5KTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENsaWVudENvbmZpZyByZWdpc3RlcihmaW5hbCBPYmplY3QgcHJvdmlkZXIsIGZpbmFsIENsYXNzPD8+Li4uIGNvbnRyYWN0cykgeworICAgICAgICBzdGF0ZSA9IHN0YXRlLnJlZ2lzdGVyKHByb3ZpZGVyLCBjb250cmFjdHMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2xpZW50Q29uZmlnIHJlZ2lzdGVyKGZpbmFsIE9iamVjdCBwcm92aWRlciwgZmluYWwgTWFwPENsYXNzPD8+LCBJbnRlZ2VyPiBjb250cmFjdHMpIHsKKyAgICAgICAgc3RhdGUgPSBzdGF0ZS5yZWdpc3Rlcihwcm92aWRlciwgY29udHJhY3RzKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENsaWVudENvbmZpZyBwcm9wZXJ0eShmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIHN0YXRlID0gc3RhdGUucHJvcGVydHkobmFtZSwgdmFsdWUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2xpZW50Q29uZmlnIGdldENvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSdW50aW1lVHlwZSBnZXRSdW50aW1lVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRlLmdldFJ1bnRpbWVUeXBlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0UHJvcGVydGllcygpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRlLmdldFByb3BlcnRpZXMoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBzdGF0ZS5nZXRQcm9wZXJ0eShuYW1lKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxTdHJpbmc+IGdldFByb3BlcnR5TmFtZXMoKSB7CisgICAgICAgIHJldHVybiBzdGF0ZS5nZXRQcm9wZXJ0eU5hbWVzKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eShmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gc3RhdGUuaXNQcm9wZXJ0eShuYW1lKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoZmluYWwgRmVhdHVyZSBmZWF0dXJlKSB7CisgICAgICAgIHJldHVybiBzdGF0ZS5pc0VuYWJsZWQoZmVhdHVyZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBGZWF0dXJlPiBmZWF0dXJlQ2xhc3MpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRlLmlzRW5hYmxlZChmZWF0dXJlQ2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzUmVnaXN0ZXJlZChmaW5hbCBPYmplY3QgY29tcG9uZW50KSB7CisgICAgICAgIHJldHVybiBzdGF0ZS5pc1JlZ2lzdGVyZWQoY29tcG9uZW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWFwPENsYXNzPD8+LCBJbnRlZ2VyPiBnZXRDb250cmFjdHMoZmluYWwgQ2xhc3M8Pz4gY29tcG9uZW50Q2xhc3MpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRlLmdldENvbnRyYWN0cyhjb21wb25lbnRDbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNSZWdpc3RlcmVkKGZpbmFsIENsYXNzPD8+IGNvbXBvbmVudENsYXNzKSB7CisgICAgICAgIHJldHVybiBzdGF0ZS5pc1JlZ2lzdGVyZWQoY29tcG9uZW50Q2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgIHJldHVybiBzdGF0ZS5nZXRDbGFzc2VzKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxPYmplY3Q+IGdldEluc3RhbmNlcygpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRlLmdldEluc3RhbmNlcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGEgY3VzdG9tIEplcnNleSBjbGllbnQgY29ubmVjdG9yIHByb3ZpZGVyLgorICAgICAqIDxwPgorICAgICAqIFRoZSByZWdpc3RlcmVkIHtAY29kZSBDb25uZWN0b3JQcm92aWRlcn0gaW5zdGFuY2Ugd2lsbCBwcm92aWRlIGEKKyAgICAgKiBKZXJzZXkgY2xpZW50IHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuc3BpLkNvbm5lY3Rvcn0KKyAgICAgKiBmb3IgdGhlIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuSmVyc2V5Q2xpZW50fSBpbnN0YW5jZQorICAgICAqIGNyZWF0ZWQgd2l0aCB0aGlzIGNsaWVudCBjb25maWd1cmF0aW9uLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0b3JQcm92aWRlciBjdXN0b20gY29ubmVjdG9yIHByb3ZpZGVyLiBNdXN0IG5vdCBiZSB7QGNvZGUgbnVsbH0uCisgICAgICogQHJldHVybiB0aGlzIGNsaWVudCBjb25maWcgaW5zdGFuY2UuCisgICAgICogQHRocm93cyBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gY2FzZSB0aGUge0Bjb2RlIGNvbm5lY3RvclByb3ZpZGVyfSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIDIuNQorICAgICAqLworICAgIHB1YmxpYyBDbGllbnRDb25maWcgY29ubmVjdG9yUHJvdmlkZXIoZmluYWwgQ29ubmVjdG9yUHJvdmlkZXIgY29ubmVjdG9yUHJvdmlkZXIpIHsKKyAgICAgICAgc3RhdGUgPSBzdGF0ZS5jb25uZWN0b3JQcm92aWRlcihjb25uZWN0b3JQcm92aWRlcik7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGN1c3RvbSBKZXJzZXkgY2xpZW50IGFzeW5jIGV4ZWN1dG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGV4ZWN1dG9yU2VydmljZSBjdXN0b20gZXhlY3V0b3Igc2VydmljZSBpbnN0YW5jZQorICAgICAqIEByZXR1cm4gdGhpcyBjbGllbnQgY29uZmlnIGluc3RhbmNlCisgICAgICovCisgICAgcHVibGljIENsaWVudENvbmZpZyBleGVjdXRvclNlcnZpY2UoZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yU2VydmljZSkgeworICAgICAgICBzdGF0ZSA9IHN0YXRlLmV4ZWN1dG9yU2VydmljZShleGVjdXRvclNlcnZpY2UpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBjdXN0b20gSmVyc2V5IGNsaWVudCBzY2hlZHVsZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlIGN1c3RvbSBzY2hlZHVsZWQgZXhlY3V0b3Igc2VydmljZSBpbnN0YW5jZQorICAgICAqIEByZXR1cm4gdGhpcyBjbGllbnQgY29uZmlnIGluc3RhbmNlCisgICAgICovCisgICAgcHVibGljIENsaWVudENvbmZpZyBzY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UoZmluYWwgU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlIHNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSkgeworICAgICAgICBzdGF0ZSA9IHN0YXRlLnNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZShzY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNsaWVudCB0cmFuc3BvcnQgY29ubmVjdG9yLgorICAgICAqIDxwPgorICAgICAqIE1heSByZXR1cm4ge0Bjb2RlIG51bGx9IGlmIG5vIGNvbm5lY3RvciBoYXMgYmVlbiBzZXQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGNsaWVudCB0cmFuc3BvcnQgY29ubmVjdG9yIG9yIHtjb2RlIG51bGx9IGlmIG5vdCBzZXQuCisgICAgICovCisgICAgcHVibGljIENvbm5lY3RvciBnZXRDb25uZWN0b3IoKSB7CisgICAgICAgIHJldHVybiBzdGF0ZS5nZXRDb25uZWN0b3IoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNsaWVudCB0cmFuc3BvcnQgY29ubmVjdG9yIHByb3ZpZGVyLgorICAgICAqIDxwPgorICAgICAqIElmIG5vIGN1c3RvbSBjb25uZWN0b3IgcHJvdmlkZXIgaGFzIGJlZW4gc2V0LAorICAgICAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuSHR0cFVybENvbm5lY3RvclByb3ZpZGVyIGRlZmF1bHQgY29ubmVjdG9yIHByb3ZpZGVyfQorICAgICAqIGluc3RhbmNlIGlzIHJldHVybmVkLgorICAgICAqCisgICAgICogQHJldHVybiBjb25maWd1cmVkIGNsaWVudCB0cmFuc3BvcnQgY29ubmVjdG9yIHByb3ZpZGVyLgorICAgICAqIEBzaW5jZSAyLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29ubmVjdG9yUHJvdmlkZXIgZ2V0Q29ubmVjdG9yUHJvdmlkZXIoKSB7CisgICAgICAgIHJldHVybiBzdGF0ZS5nZXRDb25uZWN0b3JQcm92aWRlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBjdXN0b20gY2xpZW50IGV4ZWN1dG9yIHNlcnZpY2UuCisgICAgICogPHA+CisgICAgICogTWF5IHJldHVybiBudWxsIGlmIG5vIGN1c3RvbSBleGVjdXRvciBzZXJ2aWNlIGhhcyBiZWVuIHNldC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gY3VzdG9tIGV4ZWN1dG9yIHNlcnZpY2UgaW5zdGFuY2Ugb3Ige0Bjb2RlIG51bGx9IGlmIG5vdCBzZXQuCisgICAgICogQHNpbmNlIDIuMjYKKyAgICAgKi8KKyAgICBwdWJsaWMgRXhlY3V0b3JTZXJ2aWNlIGdldEV4ZWN1dG9yU2VydmljZSgpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRlLmdldEV4ZWN1dG9yU2VydmljZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBjdXN0b20gY2xpZW50IHNjaGVkdWxlZCBleGVjdXRvciBzZXJ2aWNlLgorICAgICAqIDxwPgorICAgICAqIE1heSByZXR1cm4gbnVsbCBpZiBubyBjdXN0b20gc2NoZWR1bGVkIGV4ZWN1dG9yIHNlcnZpY2UgaGFzIGJlZW4gc2V0LgorICAgICAqCisgICAgICogQHJldHVybiBjdXN0b20gZXhlY3V0b3Igc2VydmljZSBpbnN0YW5jZSBvciB7QGNvZGUgbnVsbH0gaWYgbm90IHNldC4KKyAgICAgKiBAc2luY2UgMi4yNgorICAgICAqLworICAgIHB1YmxpYyBTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UgZ2V0U2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlKCkgeworICAgICAgICByZXR1cm4gc3RhdGUuZ2V0U2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjb25maWd1cmVkIHJ1bnRpbWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGNvbmZpZ3VyZWQgcnVudGltZS4KKyAgICAgKi8KKyAgICBDbGllbnRSdW50aW1lIGdldFJ1bnRpbWUoKSB7CisgICAgICAgIHJldHVybiBzdGF0ZS5ydW50aW1lLmdldCgpOworICAgIH0KKworICAgIHB1YmxpYyBDbGllbnRFeGVjdXRvciBnZXRDbGllbnRFeGVjdXRvcigpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRlLnJ1bnRpbWUuZ2V0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBwYXJlbnQgSmVyc2V5IGNsaWVudCB0aGlzIGNvbmZpZ3VyYXRpb24gaXMgYm91bmQgdG8uCisgICAgICogPHA+CisgICAgICogTWF5IHJldHVybiB7QGNvZGUgbnVsbH0gaWYgbm8gcGFyZW50IGNsaWVudCBoYXMgYmVlbiBib3VuZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYm91bmQgcGFyZW50IEplcnNleSBjbGllbnQgb3Ige0Bjb2RlIG51bGx9IGlmIG5vdCBib3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgSmVyc2V5Q2xpZW50IGdldENsaWVudCgpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRlLmdldENsaWVudCgpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUHJlIGluaXRpYWxpemVzIHRoaXMgY29uZmlndXJhdGlvbiBieSBpbml0aWFsaXppbmcge0BsaW5rIENsaWVudFJ1bnRpbWUgY2xpZW50IHJ1bnRpbWV9CisgICAgICogaW5jbHVkaW5nIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLk1lc3NhZ2VCb2R5V29ya2VycyBtZXNzYWdlIGJvZHkgd29ya2Vyc30uCisgICAgICogT25jZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgbm8gb3RoZXIgbWV0aG9kIGltcGxlbWVudGluZyB7QGxpbmsgQ29uZmlndXJhYmxlfSBzaG91bGQgYmUgY2FsbGVkCisgICAgICogb24gdGhpcyBwcmUgaW5pdGlhbGl6ZWQgY29uZmlndXJhdGlvbiBvdGhlcndpc2UgY29uZmlndXJhdGlvbiB3aWxsIGNoYW5nZSBiYWNrIHRvIHVuaW5pdGlhbGl6ZWQuCisgICAgICogPHAvPgorICAgICAqIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBvbmx5IHdoZW4gY29uZmlndXJhdGlvbiBpcyBhdHRhY2hlZCB0byB0aGUgY2xpZW50LgorICAgICAqCisgICAgICogQHJldHVybiBDbGllbnQgY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBDbGllbnRDb25maWcgcHJlSW5pdGlhbGl6ZSgpIHsKKyAgICAgICAgc3RhdGUgPSBzdGF0ZS5wcmVJbml0aWFsaXplKCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIHRoYXQgdGhlIGNvbmZpZ3VyYXRpb24gaW5zdGFuY2UgaGFzIGEgcGFyZW50IGNsaWVudCBzZXQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpbiBjYXNlIG5vIHBhcmVudCBKZXJzZXkgY2xpZW50IGhhcyBiZWVuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmQgdG8gdGhlIGNvbmZpZ3VyYXRpb24gaW5zdGFuY2UgeWV0LgorICAgICAqLworICAgIHZvaWQgY2hlY2tDbGllbnQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGdldENsaWVudCgpID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNsaWVudCBjb25maWd1cmF0aW9uIGRvZXMgbm90IGNvbnRhaW4gYSBwYXJlbnQgY2xpZW50IGluc3RhbmNlLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBDbGllbnRDb25maWcgb3RoZXIgPSAoQ2xpZW50Q29uZmlnKSBvYmo7CisgICAgICAgIHJldHVybiB0aGlzLnN0YXRlID09IG90aGVyLnN0YXRlIHx8ICh0aGlzLnN0YXRlICE9IG51bGwgJiYgdGhpcy5zdGF0ZS5lcXVhbHMob3RoZXIuc3RhdGUpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IDc7CisgICAgICAgIGhhc2ggPSA0NyAqIGhhc2ggKyAodGhpcy5zdGF0ZSAhPSBudWxsID8gdGhpcy5zdGF0ZS5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIHJldHVybiBoYXNoOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0NsaWVudEV4ZWN1dG9yLmphdmEgYi9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9DbGllbnRFeGVjdXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxY2RlMWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9DbGllbnRFeGVjdXRvci5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50OworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworLyoqCisgKiBFeGVjdXRvciBmb3IgY2xpZW50IGFzeW5jIHByb2Nlc3NpbmcgYW5kIGJhY2tncm91bmQgdGFzayBzY2hlZHVsaW5nLgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqIEBzaW5jZSAyLjI2CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ2xpZW50RXhlY3V0b3IgeworICAgIC8qKgorICAgICAqIFN1Ym1pdHMgYSB2YWx1ZS1yZXR1cm5pbmcgdGFzayBmb3IgZXhlY3V0aW9uIGFuZCByZXR1cm5zIGEge0BsaW5rIEZ1dHVyZX0gcmVwcmVzZW50aW5nIHRoZSBwZW5kaW5nIHJlc3VsdHMgb2YgdGhlIHRhc2suCisgICAgICogVGhlIEZ1dHVyZSdzIHtAY29kZSBnZXQoKX0gbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSB0YXNrJ3MgcmVzdWx0IHVwb24gc3VjY2Vzc2Z1bCBjb21wbGV0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHRhc2sgdGFzayB0byBzdWJtaXQKKyAgICAgKiBAcGFyYW0gPFQ+ICB0YXNrJ3MgcmV0dXJuIHR5cGUKKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIEZ1dHVyZX0gcmVwcmVzZW50aW5nIHBlbmRpbmcgY29tcGxldGlvbiBvZiB0aGUgdGFzaworICAgICAqIEB0aHJvd3Mge0BsaW5rIGphdmEudXRpbC5jb25jdXJyZW50LlJlamVjdGVkRXhlY3V0aW9uRXhjZXB0aW9ufSBpZiB0aGUgdGFzayBjYW5ub3QgYmUgc2NoZWR1bGVkIGZvciBleGVjdXRpb24KKyAgICAgKiBAdGhyb3dzIHtAbGluayBOdWxsUG9pbnRlckV4Y2VwdGlvbn0gaWYgdGhlIHRhc2sgaXMgbnVsbAorICAgICAqLworICAgIDxUPiBGdXR1cmU8VD4gc3VibWl0KENhbGxhYmxlPFQ+IHRhc2spOworCisgICAgLyoqCisgICAgICogU3VibWl0cyBhIHtAbGluayBSdW5uYWJsZX0gdGFzayBmb3IgZXhlY3V0aW9uIGFuZCByZXR1cm5zIGEge0BsaW5rIEZ1dHVyZX0gcmVwcmVzZW50aW5nIHRoYXQgdGFzay4gVGhlIEZ1dHVyZSdzIHtAY29kZQorICAgICAqIGdldCgpfSBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIGdpdmVuIHJlc3VsdCB1cG9uIHN1Y2Nlc3NmdWwgY29tcGxldGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YXNrIHRoZSB0YXNrIHRvIHN1Ym1pdAorICAgICAqIEByZXR1cm4gYSAge0Bjb2RlIEZ1dHVyZX0gcmVwcmVzZW50aW5nIHBlbmRpbmcgY29tcGxldGlvbiBvZiB0aGUgdGFzaworICAgICAqIEB0aHJvd3Mge0BsaW5rIGphdmEudXRpbC5jb25jdXJyZW50LlJlamVjdGVkRXhlY3V0aW9uRXhjZXB0aW9ufSBpZiB0aGUgdGFzayBjYW5ub3QgYmUgc2NoZWR1bGVkIGZvciBleGVjdXRpb24KKyAgICAgKiBAdGhyb3dzIHtAbGluayBOdWxsUG9pbnRlckV4Y2VwdGlvbn0gaWYgdGhlIHRhc2sgaXMgbnVsbAorICAgICAqLworICAgIEZ1dHVyZTw/PiBzdWJtaXQoUnVubmFibGUgdGFzayk7CisKKyAgICAvKioKKyAgICAgKiBTdWJtaXRzIGEge0BsaW5rIFJ1bm5hYmxlfSB0YXNrIGZvciBleGVjdXRpb24gYW5kIHJldHVybnMgYSB7QGxpbmsgRnV0dXJlfSByZXByZXNlbnRpbmcgdGhhdCB0YXNrLiBUaGUgRnV0dXJlJ3Mge0Bjb2RlCisgICAgICogZ2V0KCl9IG1ldGhvZCB3aWxsIHJldHVybiB0aGUgZ2l2ZW4gcmVzdWx0IHVwb24gc3VjY2Vzc2Z1bCBjb21wbGV0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHRhc2sgICB0aGUgdGFzayB0byBzdWJtaXQKKyAgICAgKiBAcGFyYW0gcmVzdWx0IHRoZSByZXN1bHQgdG8gcmV0dXJuCisgICAgICogQHBhcmFtIDxUPiAgICByZXN1bHQgdHlwZQorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgRnV0dXJlfSByZXByZXNlbnRpbmcgcGVuZGluZyBjb21wbGV0aW9uIG9mIHRoZSB0YXNrCisgICAgICogQHRocm93cyB7QGxpbmsgamF2YS51dGlsLmNvbmN1cnJlbnQuUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb259IGlmIHRoZSB0YXNrIGNhbm5vdCBiZSBzY2hlZHVsZWQgZm9yIGV4ZWN1dGlvbgorICAgICAqIEB0aHJvd3Mge0BsaW5rIE51bGxQb2ludGVyRXhjZXB0aW9ufSBpZiB0aGUgdGFzayBpcyBudWxsCisgICAgICovCisgICAgPFQ+IEZ1dHVyZTxUPiBzdWJtaXQoUnVubmFibGUgdGFzaywgVCByZXN1bHQpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbmQgZXhlY3V0ZXMgYSB7QGxpbmsgU2NoZWR1bGVkRnV0dXJlfSB0aGF0IGJlY29tZXMgZW5hYmxlZCBhZnRlciB0aGUgZ2l2ZW4gZGVsYXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2FsbGFibGUgdGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUKKyAgICAgKiBAcGFyYW0gZGVsYXkgICAgdGhlIHRpbWUgZnJvbSBub3cgdG8gZGVsYXkgZXhlY3V0aW9uCisgICAgICogQHBhcmFtIHVuaXQgICAgIHRoZSB0aW1lIHVuaXQgb2YgdGhlIGRlbGF5IHBhcmFtZXRlcgorICAgICAqIEBwYXJhbSA8VD4gICAgICByZXR1cm4gdHlwZSBvZiB0aGUgZnVuY3Rpb24KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIFNjaGVkdWxlZEZ1dHVyZX0gdGhhdCBjYW4gYmUgdXNlZCB0byBleHRyYWN0IHJlc3VsdCBvciBjYW5jZWwKKyAgICAgKiBAdGhyb3dzIHtAbGluayBqYXZhLnV0aWwuY29uY3VycmVudC5SZWplY3RlZEV4ZWN1dGlvbkV4Y2VwdGlvbn0gaWYgdGhlIHRhc2sgY2Fubm90IGJlIHNjaGVkdWxlZCBmb3IgZXhlY3V0aW9uCisgICAgICogQHRocm93cyB7QGxpbmsgTnVsbFBvaW50ZXJFeGNlcHRpb259IGlmIGNhbGxhYmxlIGlzIG51bGwKKyAgICAgKi8KKyAgICA8VD4gU2NoZWR1bGVkRnV0dXJlPFQ+IHNjaGVkdWxlKENhbGxhYmxlPFQ+IGNhbGxhYmxlLCBsb25nIGRlbGF5LCBUaW1lVW5pdCB1bml0KTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW5kIGV4ZWN1dGVzIGEgb25lLXNob3QgYWN0aW9uIHRoYXQgYmVjb21lcyBlbmFibGVkIGFmdGVyIHRoZSBnaXZlbiBkZWxheS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb21tYW5kIHRoZSB0YXNrIHRvIGV4ZWN1dGUKKyAgICAgKiBAcGFyYW0gZGVsYXkgICB0aGUgdGltZSBmcm9tIG5vdyB0byBkZWxheSBleGVjdXRpb24KKyAgICAgKiBAcGFyYW0gdW5pdCAgICB0aGUgdGltZSB1bml0IG9mIHRoZSBkYWx5IHBhcmFtZXRlcgorICAgICAqIEByZXR1cm4gYSBzY2hlZHVsZWRGdXR1cmUgcmVwcmVzZW50aW5nIHBlbmRpbmcgY29tcGxldGlvbiBvZiB0aGUgdGFzayBhbmQgd2hvc2Uge0Bjb2RlIGdldCgpfSBtZXRob2Qgd2lsbCByZXR1cm4ge0Bjb2RlCisgICAgICogbnVsbH0gdXBvbiBjb21wbGV0aW9uCisgICAgICovCisgICAgU2NoZWR1bGVkRnV0dXJlPD8+IHNjaGVkdWxlKFJ1bm5hYmxlIGNvbW1hbmQsIGxvbmcgZGVsYXksIFRpbWVVbml0IHVuaXQpOworCisKK30KZGlmZiAtLWdpdCBhL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0NsaWVudEV4ZWN1dG9yUHJvdmlkZXJzQ29uZmlndXJhdG9yLmphdmEgYi9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9DbGllbnRFeGVjdXRvclByb3ZpZGVyc0NvbmZpZ3VyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMGY0ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9DbGllbnRFeGVjdXRvclByb3ZpZGVyc0NvbmZpZ3VyYXRvci5qYXZhCkBAIC0wLDAgKzEsMjI2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkJvb3RzdHJhcEJhZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQmluZGluZ3M7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0Lkluc3RhbmNlQmluZGluZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlJlZmxlY3Rpb25IZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLlZhbHVlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5WYWx1ZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW9kZWwuaW50ZXJuYWwuQ29tcG9uZW50QmFnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1vZGVsLmludGVybmFsLk1hbmFnZWRPYmplY3RzRmluYWxpemVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWwuQWJzdHJhY3RFeGVjdXRvclByb3ZpZGVyc0NvbmZpZ3VyYXRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLlNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyOworCisvKioKKyAqIENvbmZpZ3VyYXRvciB3aGljaCBpbml0aWFsaXplcyBhbmQgcmVnaXN0ZXIge0BsaW5rIEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyfSBhbmQKKyAqIHtAbGluayBTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2VQcm92aWRlcn0uCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK2NsYXNzIENsaWVudEV4ZWN1dG9yUHJvdmlkZXJzQ29uZmlndXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RFeGVjdXRvclByb3ZpZGVyc0NvbmZpZ3VyYXRvciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihDbGllbnRFeGVjdXRvclByb3ZpZGVyc0NvbmZpZ3VyYXRvci5jbGFzcy5nZXROYW1lKCkpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEV4ZWN1dG9yU2VydmljZSBNQU5BR0VEX0VYRUNVVE9SX1NFUlZJQ0UgPSBsb29rdXBNYW5hZ2VkRXhlY3V0b3JTZXJ2aWNlKCk7CisKKyAgICBwcml2YXRlIGZpbmFsIENvbXBvbmVudEJhZyBjb21wb25lbnRCYWc7CisgICAgcHJpdmF0ZSBmaW5hbCBKZXJzZXlDbGllbnQgY2xpZW50OworICAgIHByaXZhdGUgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGN1c3RvbUV4ZWN1dG9yU2VydmljZTsKKyAgICBwcml2YXRlIGZpbmFsIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSBjdXN0b21TY2hlZHVsZWRFeGVjdXRvclNlcnZpY2U7CisKKyAgICBDbGllbnRFeGVjdXRvclByb3ZpZGVyc0NvbmZpZ3VyYXRvcihDb21wb25lbnRCYWcgY29tcG9uZW50QmFnLCBKZXJzZXlDbGllbnQgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4ZWN1dG9yU2VydmljZSBjdXN0b21FeGVjdXRvclNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlIGN1c3RvbVNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSkgeworICAgICAgICB0aGlzLmNvbXBvbmVudEJhZyA9IGNvbXBvbmVudEJhZzsKKyAgICAgICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7CisgICAgICAgIHRoaXMuY3VzdG9tRXhlY3V0b3JTZXJ2aWNlID0gY3VzdG9tRXhlY3V0b3JTZXJ2aWNlOworICAgICAgICB0aGlzLmN1c3RvbVNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSA9IGN1c3RvbVNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBpbml0KEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciwgQm9vdHN0cmFwQmFnIGJvb3RzdHJhcEJhZykgeworICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJ1bnRpbWVQcm9wZXJ0aWVzID0gYm9vdHN0cmFwQmFnLmdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0aWVzKCk7CisgICAgICAgIE1hbmFnZWRPYmplY3RzRmluYWxpemVyIGZpbmFsaXplciA9IGJvb3RzdHJhcEJhZy5nZXRNYW5hZ2VkT2JqZWN0c0ZpbmFsaXplcigpOworCisgICAgICAgIEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyIGRlZmF1bHRBc3luY0V4ZWN1dG9yUHJvdmlkZXI7CisgICAgICAgIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyIGRlZmF1bHRTY2hlZHVsZWRFeGVjdXRvclByb3ZpZGVyOworCisgICAgICAgIGZpbmFsIEV4ZWN1dG9yU2VydmljZSBjbGllbnRFeGVjdXRvclNlcnZpY2UgPSBjbGllbnQuZ2V0RXhlY3V0b3JTZXJ2aWNlKCkgPT0gbnVsbAorICAgICAgICAgICAgICAgIC8vIGN1c3RvbSBleGVjdXRvciBzZXJ2aWNlIGNhbiBiZSBhbHNvIHNldCB2aWEgbWFuYWdlZCBjbGllbnQgY29uZmlnIGNsYXNzLCBpbiB0aGF0IGNhc2UsIGl0IGVuZHMgdXAgaW4gdGhlCisgICAgICAgICAgICAgICAgLy8gY3VzdG9tRXhlY3V0b3JTZXJ2aWNlIGZpZWxkIChzaW1pbGFyIGZvciBzY2hlZHVsZWQgdmVyc2lvbikKKyAgICAgICAgICAgICAgICA/IGN1c3RvbUV4ZWN1dG9yU2VydmljZQorICAgICAgICAgICAgICAgIDogY2xpZW50LmdldEV4ZWN1dG9yU2VydmljZSgpOworCisgICAgICAgIC8vIGlmIHRoZXJlIGlzIGEgdXNlcnMgcHJvdmlkZWQgZXhlY3V0b3Igc2VydmljZSwgdXNlIGl0CisgICAgICAgIGlmIChjbGllbnRFeGVjdXRvclNlcnZpY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgZGVmYXVsdEFzeW5jRXhlY3V0b3JQcm92aWRlciA9IG5ldyBDbGllbnRFeGVjdXRvclNlcnZpY2VQcm92aWRlcihjbGllbnRFeGVjdXRvclNlcnZpY2UpOworICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCBjaGVjayBmb3IgQ2xpZW50UHJvcGVydGllcy5BU1lOQ19USFJFQURQT09MX1NJWkUgLSBpZiB0aGF0IGlzIHNldCwgSmVyc2V5IHdpbGwgY3JlYXRlIHRoZQorICAgICAgICAgICAgLy8gRXhlY3V0b3JTZXJ2aWNlIHRvIGJlIHVzZWQuIElmIG5vdCBhbmQgcnVubmluZyBvbiBKYXZhIEVFIGNvbnRhaW5lciwgTWFuYWdlZEV4ZWN1dG9yU2VydmljZSB3aWxsIGJlIHVzZWQuCisgICAgICAgICAgICAvLyBGaW5hbCBmYWxsYmFjayBpcyBEZWZhdWx0Q2xpZW50QXN5bmNFeGVjdXRvclByb3ZpZGVyIHdpdGggZGVmaW5lZCBkZWZhdWx0LgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gRGVmYXVsdCBhc3luYyByZXF1ZXN0IGV4ZWN1dG9ycyBzdXBwb3J0CisgICAgICAgICAgICBJbnRlZ2VyIGFzeW5jVGhyZWFkUG9vbFNpemUgPSBDbGllbnRQcm9wZXJ0aWVzCisgICAgICAgICAgICAgICAgICAgIC5nZXRWYWx1ZShydW50aW1lUHJvcGVydGllcywgQ2xpZW50UHJvcGVydGllcy5BU1lOQ19USFJFQURQT09MX1NJWkUsIEludGVnZXIuY2xhc3MpOworCisgICAgICAgICAgICBpZiAoYXN5bmNUaHJlYWRQb29sU2l6ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogRG8gd2UgbmVlZCB0byByZWdpc3RlciBERUZBVUxUIEV4ZWN1dG9yIGFuZCBTY2hlZHVsZWRFeGVjdXRvciB0byBJbmplY3Rpb25NYW5hZ2VyPworICAgICAgICAgICAgICAgIGFzeW5jVGhyZWFkUG9vbFNpemUgPSAoYXN5bmNUaHJlYWRQb29sU2l6ZSA8IDApID8gMCA6IGFzeW5jVGhyZWFkUG9vbFNpemU7CisgICAgICAgICAgICAgICAgSW5zdGFuY2VCaW5kaW5nPEludGVnZXI+IGFzeW5jVGhyZWFkUG9vbFNpemVCaW5kaW5nID0gQmluZGluZ3MKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXJ2aWNlKGFzeW5jVGhyZWFkUG9vbFNpemUpCisgICAgICAgICAgICAgICAgICAgICAgICAubmFtZWQoIkNsaWVudEFzeW5jVGhyZWFkUG9vbFNpemUiKTsKKyAgICAgICAgICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyKGFzeW5jVGhyZWFkUG9vbFNpemVCaW5kaW5nKTsKKworICAgICAgICAgICAgICAgIGRlZmF1bHRBc3luY0V4ZWN1dG9yUHJvdmlkZXIgPSBuZXcgRGVmYXVsdENsaWVudEFzeW5jRXhlY3V0b3JQcm92aWRlcihhc3luY1RocmVhZFBvb2xTaXplKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKE1BTkFHRURfRVhFQ1VUT1JfU0VSVklDRSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRBc3luY0V4ZWN1dG9yUHJvdmlkZXIgPSBuZXcgQ2xpZW50RXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXIoTUFOQUdFRF9FWEVDVVRPUl9TRVJWSUNFKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0QXN5bmNFeGVjdXRvclByb3ZpZGVyID0gbmV3IERlZmF1bHRDbGllbnRBc3luY0V4ZWN1dG9yUHJvdmlkZXIoMCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgSW5zdGFuY2VCaW5kaW5nPEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyPiBleGVjdXRvckJpbmRpbmcgPSBCaW5kaW5ncworICAgICAgICAgICAgICAgIC5zZXJ2aWNlKGRlZmF1bHRBc3luY0V4ZWN1dG9yUHJvdmlkZXIpCisgICAgICAgICAgICAgICAgLnRvKEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyLmNsYXNzKTsKKworICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyKGV4ZWN1dG9yQmluZGluZyk7CisgICAgICAgIGZpbmFsaXplci5yZWdpc3RlckZvclByZURlc3Ryb3lDYWxsKGRlZmF1bHRBc3luY0V4ZWN1dG9yUHJvdmlkZXIpOworCisgICAgICAgIGZpbmFsIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSBjbGllbnRTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UgPSBjbGllbnQuZ2V0U2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlKCkgPT0gbnVsbAorICAgICAgICAgICAgICAgIC8vIHNjaGVkdWxlZCBleGVjdXRvciBzZXJ2aWNlIHNldCBmcm9tIHtAbGluayBDbGllbnRDb25maWd9LgorICAgICAgICAgICAgICAgID8gY3VzdG9tU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlCisgICAgICAgICAgICAgICAgOiBjbGllbnQuZ2V0U2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlKCk7CisKKyAgICAgICAgaWYgKGNsaWVudFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSAhPSBudWxsKSB7CisgICAgICAgICAgICBkZWZhdWx0U2NoZWR1bGVkRXhlY3V0b3JQcm92aWRlciA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBDbGllbnRTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2VQcm92aWRlcihWYWx1ZXMub2YoY2xpZW50U2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2Ugc2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlID0gbG9va3VwTWFuYWdlZFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSgpOworICAgICAgICAgICAgZGVmYXVsdFNjaGVkdWxlZEV4ZWN1dG9yUHJvdmlkZXIgPQorICAgICAgICAgICAgICAgIHNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSA9PSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWZhdWx0IGNsaWVudCBiYWNrZ3JvdW5kIHNjaGVkdWxlciBkaXNwb3NlcyB0aGUgZXhlY3V0b3Igc2VydmljZSB3aGVuIGNsaWVudCBpcyBjbG9zZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCBuZWVkIHRvIGRvIHRoYXQgZm9yIHVzZXIgcHJvdmlkZWQgKHZpYSBDbGllbnRCdWlsZGVyKSBvciBtYW5hZ2VkIGV4ZWN1dG9yIHNlcnZpY2UuCisgICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBEZWZhdWx0Q2xpZW50QmFja2dyb3VuZFNjaGVkdWxlclByb3ZpZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IENsaWVudFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyKFZhbHVlcy5vZihzY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UpKTsKKyAgICAgICAgfQorCisgICAgICAgIEluc3RhbmNlQmluZGluZzxTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2VQcm92aWRlcj4gc2NoZWR1bGVyQmluZGluZyA9IEJpbmRpbmdzCisgICAgICAgICAgICAgICAgLnNlcnZpY2UoZGVmYXVsdFNjaGVkdWxlZEV4ZWN1dG9yUHJvdmlkZXIpCisgICAgICAgICAgICAgICAgLnRvKFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyLmNsYXNzKTsKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5yZWdpc3RlcihzY2hlZHVsZXJCaW5kaW5nKTsKKyAgICAgICAgZmluYWxpemVyLnJlZ2lzdGVyRm9yUHJlRGVzdHJveUNhbGwoZGVmYXVsdFNjaGVkdWxlZEV4ZWN1dG9yUHJvdmlkZXIpOworCisgICAgICAgIHJlZ2lzdGVyRXhlY3V0b3JzKGluamVjdGlvbk1hbmFnZXIsIGNvbXBvbmVudEJhZywgZGVmYXVsdEFzeW5jRXhlY3V0b3JQcm92aWRlciwgZGVmYXVsdFNjaGVkdWxlZEV4ZWN1dG9yUHJvdmlkZXIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEV4ZWN1dG9yU2VydmljZSBsb29rdXBNYW5hZ2VkRXhlY3V0b3JTZXJ2aWNlKCkgeworICAgICAgICAvLyBHZXQgdGhlIGRlZmF1bHQgTWFuYWdlZEV4ZWN1dG9yU2VydmljZSwgaWYgYXZhaWxhYmxlCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBBbmRyb2lkIGFuZCBzb21lIG90aGVyIGVudmlyb25tZW50cyBkb24ndCBoYXZlIEluaXRpYWxDb250ZXh0IGNsYXNzIGF2YWlsYWJsZS4KKyAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IGFDbGFzcyA9CisgICAgICAgICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKFJlZmxlY3Rpb25IZWxwZXIuY2xhc3NGb3JOYW1lUEEoImphdmF4Lm5hbWluZy5Jbml0aWFsQ29udGV4dCIpKTsKKworICAgICAgICAgICAgZmluYWwgT2JqZWN0IGluaXRpYWxDb250ZXh0ID0gYUNsYXNzLm5ld0luc3RhbmNlKCk7CisKKyAgICAgICAgICAgIGZpbmFsIE1ldGhvZCBsb29rdXBNZXRob2QgPSBhQ2xhc3MuZ2V0TWV0aG9kKCJsb29rdXAiLCBTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgcmV0dXJuIChFeGVjdXRvclNlcnZpY2UpIGxvb2t1cE1ldGhvZC5pbnZva2UoaW5pdGlhbENvbnRleHQsICJqYXZhOmNvbXAvRGVmYXVsdE1hbmFnZWRFeGVjdXRvclNlcnZpY2UiKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgaWYgKExPR0dFUi5pc0xvZ2dhYmxlKExldmVsLkZJTkUpKSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5GSU5FLCBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKExpbmthZ2VFcnJvciBlcnJvcikgeworICAgICAgICAgICAgLy8gaWdub3JlIC0gSkRLOCBjb21wYWN0MiBwcm9maWxlIC0gaHR0cDovL29wZW5qZGsuamF2YS5uZXQvamVwcy8xNjEKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlIGxvb2t1cE1hbmFnZWRTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBBbmRyb2lkIGFuZCBzb21lIG90aGVyIGVudmlyb25tZW50cyBkb24ndCBoYXZlIEluaXRpYWxDb250ZXh0IGNsYXNzIGF2YWlsYWJsZS4KKyAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IGFDbGFzcyA9CisgICAgICAgICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKFJlZmxlY3Rpb25IZWxwZXIuY2xhc3NGb3JOYW1lUEEoImphdmF4Lm5hbWluZy5Jbml0aWFsQ29udGV4dCIpKTsKKyAgICAgICAgICAgIGZpbmFsIE9iamVjdCBpbml0aWFsQ29udGV4dCA9IGFDbGFzcy5uZXdJbnN0YW5jZSgpOworCisgICAgICAgICAgICBmaW5hbCBNZXRob2QgbG9va3VwTWV0aG9kID0gYUNsYXNzLmdldE1ldGhvZCgibG9va3VwIiwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgIHJldHVybiAoU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlKSBsb29rdXBNZXRob2QKKyAgICAgICAgICAgICAgICAgICAgLmludm9rZShpbml0aWFsQ29udGV4dCwgImphdmE6Y29tcC9EZWZhdWx0TWFuYWdlZFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSIpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICBpZiAoTE9HR0VSLmlzTG9nZ2FibGUoTGV2ZWwuRklORSkpIHsKKyAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLkZJTkUsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoTGlua2FnZUVycm9yIGVycm9yKSB7CisgICAgICAgICAgICAvLyBpZ25vcmUgLSBKREs4IGNvbXBhY3QyIHByb2ZpbGUgLSBodHRwOi8vb3Blbmpkay5qYXZhLm5ldC9qZXBzLzE2MQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQENsaWVudEFzeW5jRXhlY3V0b3IKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENsaWVudEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyIGltcGxlbWVudHMgRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXIgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yU2VydmljZTsKKworICAgICAgICBDbGllbnRFeGVjdXRvclNlcnZpY2VQcm92aWRlcihFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlKSB7CisgICAgICAgICAgICB0aGlzLmV4ZWN1dG9yU2VydmljZSA9IGV4ZWN1dG9yU2VydmljZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRXhlY3V0b3JTZXJ2aWNlIGdldEV4ZWN1dG9yU2VydmljZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBleGVjdXRvclNlcnZpY2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZShFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlKSB7CisKKyAgICAgICAgfQorICAgIH0KKworICAgIEBDbGllbnRCYWNrZ3JvdW5kU2NoZWR1bGVyCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDbGllbnRTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2VQcm92aWRlciBpbXBsZW1lbnRzIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFZhbHVlPFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZT4gZXhlY3V0b3JTZXJ2aWNlOworCisgICAgICAgIENsaWVudFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyKFZhbHVlPFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZT4gZXhlY3V0b3JTZXJ2aWNlKSB7CisgICAgICAgICAgICB0aGlzLmV4ZWN1dG9yU2VydmljZSA9IGV4ZWN1dG9yU2VydmljZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlIGdldEV4ZWN1dG9yU2VydmljZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBleGVjdXRvclNlcnZpY2UuZ2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZShFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlKSB7CisKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0NsaWVudEZpbHRlcmluZ1N0YWdlcy5qYXZhIGIvY29yZS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvQ2xpZW50RmlsdGVyaW5nU3RhZ2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I3ZWZhMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0NsaWVudEZpbHRlcmluZ1N0YWdlcy5qYXZhCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXNwb25zZUZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuUmVzcG9uc2VQcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuUHJvdmlkZXJzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1vZGVsLmludGVybmFsLlJhbmtlZENvbXBhcmF0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5pbnRlcm5hbC5BYnN0cmFjdENoYWluYWJsZVN0YWdlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWwuQ2hhaW5hYmxlU3RhZ2U7CisKKy8qKgorICogQ2xpZW50IGZpbHRlcmluZyBzdGFnZSBmYWN0b3J5LgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK2NsYXNzIENsaWVudEZpbHRlcmluZ1N0YWdlcyB7CisKKyAgICBwcml2YXRlIENsaWVudEZpbHRlcmluZ1N0YWdlcygpIHsKKyAgICAgICAgLy8gUHJldmVudHMgaW5zdGFudGlhdGlvbgorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBjbGllbnQgcmVxdWVzdCBmaWx0ZXJpbmcgc3RhZ2UgdXNpbmcgdGhlIGluamVjdGlvbiBtYW5hZ2VyLiBNYXkgcmV0dXJuIHtAY29kZSBudWxsfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbiBtYW5hZ2VyIHRvIGJlIHVzZWQuCisgICAgICogQHJldHVybiBjb25maWd1cmVkIHJlcXVlc3QgZmlsdGVyaW5nIHN0YWdlLCBvciB7QGNvZGUgbnVsbH0gaW4gY2FzZSB0aGVyZSBhcmUgbm8KKyAgICAgKiAgICAgICAgIHtAbGluayBDbGllbnRSZXF1ZXN0RmlsdGVyIGNsaWVudCByZXF1ZXN0IGZpbHRlcnN9IHJlZ2lzdGVyZWQgaW4gdGhlIGluamVjdGlvbiBtYW5hZ2VyLgorICAgICAqLworICAgIHN0YXRpYyBDaGFpbmFibGVTdGFnZTxDbGllbnRSZXF1ZXN0PiBjcmVhdGVSZXF1ZXN0RmlsdGVyaW5nU3RhZ2UoSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyKSB7CisgICAgICAgIFJhbmtlZENvbXBhcmF0b3I8Q2xpZW50UmVxdWVzdEZpbHRlcj4gY29tcGFyYXRvciA9IG5ldyBSYW5rZWRDb21wYXJhdG9yPD4oUmFua2VkQ29tcGFyYXRvci5PcmRlci5BU0NFTkRJTkcpOworICAgICAgICBJdGVyYWJsZTxDbGllbnRSZXF1ZXN0RmlsdGVyPiByZXF1ZXN0RmlsdGVycyA9CisgICAgICAgICAgICAgICAgUHJvdmlkZXJzLmdldEFsbFByb3ZpZGVycyhpbmplY3Rpb25NYW5hZ2VyLCBDbGllbnRSZXF1ZXN0RmlsdGVyLmNsYXNzLCBjb21wYXJhdG9yKTsKKyAgICAgICAgcmV0dXJuIHJlcXVlc3RGaWx0ZXJzLml0ZXJhdG9yKCkuaGFzTmV4dCgpID8gbmV3IFJlcXVlc3RGaWx0ZXJpbmdTdGFnZShyZXF1ZXN0RmlsdGVycykgOiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBjbGllbnQgcmVzcG9uc2UgZmlsdGVyaW5nIHN0YWdlIHVzaW5nIHRoZSBpbmplY3Rpb24gbWFuYWdlci4gTWF5IHJldHVybiB7QGNvZGUgbnVsbH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb24gbWFuYWdlciB0byBiZSB1c2VkLgorICAgICAqIEByZXR1cm4gY29uZmlndXJlZCByZXNwb25zZSBmaWx0ZXJpbmcgc3RhZ2UsIG9yIHtAY29kZSBudWxsfSBpbiBjYXNlIHRoZXJlIGFyZSBubworICAgICAqICAgICAgICAge0BsaW5rIENsaWVudFJlc3BvbnNlRmlsdGVyIGNsaWVudCByZXNwb25zZSBmaWx0ZXJzfSByZWdpc3RlcmVkIGluIHRoZSBpbmplY3Rpb24gbWFuYWdlci4KKyAgICAgKi8KKyAgICBzdGF0aWMgQ2hhaW5hYmxlU3RhZ2U8Q2xpZW50UmVzcG9uc2U+IGNyZWF0ZVJlc3BvbnNlRmlsdGVyaW5nU3RhZ2UoSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyKSB7CisgICAgICAgIFJhbmtlZENvbXBhcmF0b3I8Q2xpZW50UmVzcG9uc2VGaWx0ZXI+IGNvbXBhcmF0b3IgPSBuZXcgUmFua2VkQ29tcGFyYXRvcjw+KFJhbmtlZENvbXBhcmF0b3IuT3JkZXIuREVTQ0VORElORyk7CisgICAgICAgIEl0ZXJhYmxlPENsaWVudFJlc3BvbnNlRmlsdGVyPiByZXNwb25zZUZpbHRlcnMgPQorICAgICAgICAgICAgICAgIFByb3ZpZGVycy5nZXRBbGxQcm92aWRlcnMoaW5qZWN0aW9uTWFuYWdlciwgQ2xpZW50UmVzcG9uc2VGaWx0ZXIuY2xhc3MsIGNvbXBhcmF0b3IpOworICAgICAgICByZXR1cm4gcmVzcG9uc2VGaWx0ZXJzLml0ZXJhdG9yKCkuaGFzTmV4dCgpID8gbmV3IFJlc3BvbnNlRmlsdGVyU3RhZ2UocmVzcG9uc2VGaWx0ZXJzKSA6IG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVxdWVzdEZpbHRlcmluZ1N0YWdlIGV4dGVuZHMgQWJzdHJhY3RDaGFpbmFibGVTdGFnZTxDbGllbnRSZXF1ZXN0PiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBJdGVyYWJsZTxDbGllbnRSZXF1ZXN0RmlsdGVyPiByZXF1ZXN0RmlsdGVyczsKKworICAgICAgICBwcml2YXRlIFJlcXVlc3RGaWx0ZXJpbmdTdGFnZShmaW5hbCBJdGVyYWJsZTxDbGllbnRSZXF1ZXN0RmlsdGVyPiByZXF1ZXN0RmlsdGVycykgeworICAgICAgICAgICAgdGhpcy5yZXF1ZXN0RmlsdGVycyA9IHJlcXVlc3RGaWx0ZXJzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDb250aW51YXRpb248Q2xpZW50UmVxdWVzdD4gYXBwbHkoQ2xpZW50UmVxdWVzdCByZXF1ZXN0Q29udGV4dCkgeworICAgICAgICAgICAgZm9yIChDbGllbnRSZXF1ZXN0RmlsdGVyIGZpbHRlciA6IHJlcXVlc3RGaWx0ZXJzKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyLmZpbHRlcihyZXF1ZXN0Q29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlIGFib3J0UmVzcG9uc2UgPSByZXF1ZXN0Q29udGV4dC5nZXRBYm9ydFJlc3BvbnNlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhYm9ydFJlc3BvbnNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBYm9ydEV4Y2VwdGlvbihuZXcgQ2xpZW50UmVzcG9uc2UocmVxdWVzdENvbnRleHQsIGFib3J0UmVzcG9uc2UpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQ29udGludWF0aW9uLm9mKHJlcXVlc3RDb250ZXh0LCBnZXREZWZhdWx0TmV4dCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJlc3BvbnNlRmlsdGVyU3RhZ2UgZXh0ZW5kcyBBYnN0cmFjdENoYWluYWJsZVN0YWdlPENsaWVudFJlc3BvbnNlPiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBJdGVyYWJsZTxDbGllbnRSZXNwb25zZUZpbHRlcj4gZmlsdGVyczsKKworICAgICAgICBwcml2YXRlIFJlc3BvbnNlRmlsdGVyU3RhZ2UoSXRlcmFibGU8Q2xpZW50UmVzcG9uc2VGaWx0ZXI+IGZpbHRlcnMpIHsKKyAgICAgICAgICAgIHRoaXMuZmlsdGVycyA9IGZpbHRlcnM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENvbnRpbnVhdGlvbjxDbGllbnRSZXNwb25zZT4gYXBwbHkoQ2xpZW50UmVzcG9uc2UgcmVzcG9uc2VDb250ZXh0KSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZvciAoQ2xpZW50UmVzcG9uc2VGaWx0ZXIgZmlsdGVyIDogZmlsdGVycykgeworICAgICAgICAgICAgICAgICAgICBmaWx0ZXIuZmlsdGVyKHJlc3BvbnNlQ29udGV4dC5nZXRSZXF1ZXN0Q29udGV4dCgpLCByZXNwb25zZUNvbnRleHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgSW5ib3VuZEpheHJzUmVzcG9uc2UgcmVzcG9uc2UgPSBuZXcgSW5ib3VuZEpheHJzUmVzcG9uc2UocmVzcG9uc2VDb250ZXh0LCBudWxsKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVzcG9uc2VQcm9jZXNzaW5nRXhjZXB0aW9uKHJlc3BvbnNlLCBleCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBDb250aW51YXRpb24ub2YocmVzcG9uc2VDb250ZXh0LCBnZXREZWZhdWx0TmV4dCgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0NsaWVudExpZmVjeWNsZUxpc3RlbmVyLmphdmEgYi9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9DbGllbnRMaWZlY3ljbGVMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYWY4N2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9DbGllbnRMaWZlY3ljbGVMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50OworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3RyYWluZWRUbzsKK2ltcG9ydCBqYXZheC53cy5ycy5SdW50aW1lVHlwZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5Db250cmFjdDsKKworLyoqCisgKiBKZXJzZXkgY2xpZW50IGxpZmVjeWNsZSBsaXN0ZW5lciBjb250cmFjdC4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICogQHNpbmNlIDIuMTEKKyAqLworQENvbnRyYWN0CitAQ29uc3RyYWluZWRUbyhSdW50aW1lVHlwZS5DTElFTlQpCitwdWJsaWMgaW50ZXJmYWNlIENsaWVudExpZmVjeWNsZUxpc3RlbmVyIHsKKworICAgIC8qKgorICAgICAqIEludm9rZWQgd2hlbiBhIG5ldyBydW50aW1lIGlzIGluaXRpYWxpemVkIGZvciB0aGUgY2xpZW50IGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uSW5pdCgpOworCisgICAgLyoqCisgICAgICogSW52b2tlZCB3aGVuIHRoZSBjbGllbnQgaW5zdGFuY2UgaXMgY2xvc2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uQ2xvc2UoKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0NsaWVudFByb3BlcnRpZXMuamF2YSBiL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0NsaWVudFByb3BlcnRpZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2IyNzJmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvQ2xpZW50UHJvcGVydGllcy5qYXZhCkBAIC0wLDAgKzEsNDY1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5Db21tb25Qcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5pbnRlcm5hbC5IdHRwVXJsQ29ubmVjdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUHJvcGVydGllc0NsYXNzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUHJvcGVydGllc0hlbHBlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlByb3BlcnR5QWxpYXM7CisKKy8qKgorICogSmVyc2V5IGNsaWVudCBpbXBsZW1lbnRhdGlvbiBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQcm9wZXJ0aWVzQ2xhc3MKK3B1YmxpYyBmaW5hbCBjbGFzcyBDbGllbnRQcm9wZXJ0aWVzIHsKKworICAgIC8qKgorICAgICAqIEF1dG9tYXRpYyByZWRpcmVjdGlvbi4gQSB2YWx1ZSBvZiB7QGNvZGUgdHJ1ZX0gZGVjbGFyZXMgdGhhdCB0aGUgY2xpZW50CisgICAgICogd2lsbCBhdXRvbWF0aWNhbGx5IHJlZGlyZWN0IHRvIHRoZSBVUkkgZGVjbGFyZWQgaW4gM3h4IHJlc3BvbnNlcy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgdmFsdWUgTVVTVCBiZSBhbiBpbnN0YW5jZSBjb252ZXJ0aWJsZSB0byB7QGxpbmsgamF2YS5sYW5nLkJvb2xlYW59LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB7QGNvZGUgdHJ1ZX0uCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDx0dD57QHZhbHVlfTwvdHQ+LgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT0xMT1dfUkVESVJFQ1RTID0gImplcnNleS5jb25maWcuY2xpZW50LmZvbGxvd1JlZGlyZWN0cyI7CisKKyAgICAvKioKKyAgICAgKiBSZWFkIHRpbWVvdXQgaW50ZXJ2YWwsIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgdmFsdWUgTVVTVCBiZSBhbiBpbnN0YW5jZSBjb252ZXJ0aWJsZSB0byB7QGxpbmsgamF2YS5sYW5nLkludGVnZXJ9LiBBCisgICAgICogdmFsdWUgb2YgemVybyAoMCkgaXMgZXF1aXZhbGVudCB0byBhbiBpbnRlcnZhbCBvZiBpbmZpbml0eS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgaW5maW5pdHkgKDApLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBRF9USU1FT1VUID0gImplcnNleS5jb25maWcuY2xpZW50LnJlYWRUaW1lb3V0IjsKKworICAgIC8qKgorICAgICAqIENvbm5lY3QgdGltZW91dCBpbnRlcnZhbCwgaW4gbWlsbGlzZWNvbmRzLgorICAgICAqIDxwPgorICAgICAqIFRoZSB2YWx1ZSBNVVNUIGJlIGFuIGluc3RhbmNlIGNvbnZlcnRpYmxlIHRvIHtAbGluayBqYXZhLmxhbmcuSW50ZWdlcn0uIEEKKyAgICAgKiB2YWx1ZSBvZiB6ZXJvICgwKSBpcyBlcXVpdmFsZW50IHRvIGFuIGludGVydmFsIG9mIGluZmluaXR5LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBpbmZpbml0eSAoMCkuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDx0dD57QHZhbHVlfTwvdHQ+LgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05ORUNUX1RJTUVPVVQgPSAiamVyc2V5LmNvbmZpZy5jbGllbnQuY29ubmVjdFRpbWVvdXQiOworCisgICAgLyoqCisgICAgICogVGhlIHZhbHVlIE1VU1QgYmUgYW4gaW5zdGFuY2UgY29udmVydGlibGUgdG8ge0BsaW5rIGphdmEubGFuZy5JbnRlZ2VyfS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgcHJvcGVydHkgZGVmaW5lcyB0aGUgc2l6ZSBvZiB0aGUgY2h1bmsgaW4gYnl0ZXMuIFRoZSBwcm9wZXJ0eSBkb2VzIG5vdCBlbmFibGUKKyAgICAgKiBjaHVua2VkIGVuY29kaW5nIChpdCBpcyBjb250cm9sbGVkIGJ5IHtAbGluayAjUkVRVUVTVF9FTlRJVFlfUFJPQ0VTU0lOR30gcHJvcGVydHkpLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBBIGRlZmF1bHQgdmFsdWUgaXMge0B2YWx1ZSAjREVGQVVMVF9DSFVOS19TSVpFfSAoc2luY2UgSmVyc2V5IDIuMTYpLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0hVTktFRF9FTkNPRElOR19TSVpFID0gImplcnNleS5jb25maWcuY2xpZW50LmNodW5rZWRFbmNvZGluZ1NpemUiOworICAgIC8qKgorICAgICAqIERlZmF1bHQgY2h1bmsgc2l6ZSBpbiBIVFRQIGNodW5rLWVuY29kZWQgbWVzc2FnZXMuCisgICAgICoKKyAgICAgKiBAc2luY2UgMi4xNgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQ0hVTktfU0laRSA9IDQwOTY7CisKKyAgICAvKioKKyAgICAgKiBBc3luY2hyb25vdXMgdGhyZWFkIHBvb2wgc2l6ZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgdmFsdWUgTVVTVCBiZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgamF2YS5sYW5nLkludGVnZXJ9LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgcHJvcGVydHkgaXMgYWJzZW50IHRoZW4gdGhyZWFkIHBvb2wgdXNlZCBmb3IgYXN5bmMgcmVxdWVzdHMgd2lsbAorICAgICAqIGJlIGluaXRpYWxpemVkIGFzIGRlZmF1bHQgY2FjaGVkIHRocmVhZCBwb29sLCB3aGljaCBjcmVhdGVzIG5ldyB0aHJlYWQKKyAgICAgKiBmb3IgZXZlcnkgbmV3IHJlcXVlc3QsIHNlZSB7QGxpbmsgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzfS4gV2hlbiBhCisgICAgICogdmFsdWUgJmd0OyZuYnNwOzAgaXMgcHJvdmlkZWQsIHRoZSBjcmVhdGVkIGNhY2hlZCB0aHJlYWQgcG9vbCBsaW1pdGVkIHRvIHRoYXQKKyAgICAgKiBudW1iZXIgb2YgdGhyZWFkcyB3aWxsIGJlIHV0aWxpemVkLiBaZXJvIG9yIG5lZ2F0aXZlIHZhbHVlcyB3aWxsIGJlIGlnbm9yZWQuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIE5vdGUgdGhhdCB0aGUgcHJvcGVydHkgbWF5IGJlIGlnbm9yZWQgaWYgYSBjdXN0b20ge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5FeGVjdXRvclNlcnZpY2VQcm92aWRlcn0KKyAgICAgKiBpcyBjb25maWd1cmVkIHRvIGV4ZWN1dGUgYXN5bmNocm9ub3VzIHJlcXVlc3RzIGluIHRoZSBjbGllbnQgcnVudGltZSAoc2VlCisgICAgICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRBc3luY0V4ZWN1dG9yfSkuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIEEgZGVmYXVsdCB2YWx1ZSBpcyBub3Qgc2V0LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNZTkNfVEhSRUFEUE9PTF9TSVpFID0gImplcnNleS5jb25maWcuY2xpZW50LmFzeW5jLnRocmVhZFBvb2xTaXplIjsKKworICAgIC8qKgorICAgICAqIFNjaGVkdWxlciB0aHJlYWQgcG9vbCBzaXplLgorICAgICAqIDxwPgorICAgICAqIFRoZSB2YWx1ZSBNVVNUIGJlIGFuIGluc3RhbmNlIG9mIHtAbGluayBqYXZhLmxhbmcuSW50ZWdlcn0uCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSBwcm9wZXJ0eSBpcyBhYnNlbnQgdGhlbiB0aHJlYWQgcG9vbCB1c2VkIGZvciBiYWNrZ3JvdW5kIHRhc2sgc2NoZWR1bGluZyB3aWxsCisgICAgICogYmUgaW5pdGlhbGl6ZWQgYXMgZGVmYXVsdCBzY2hlZHVsZWQgdGhyZWFkIHBvb2wgZXhlY3V0b3IsIHdoaWNoIGNyZWF0ZXMgbmV3IHRocmVhZAorICAgICAqIGZvciBldmVyeSBuZXcgcmVxdWVzdCwgc2VlIHtAbGluayBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnN9LiBXaGVuIGEKKyAgICAgKiB2YWx1ZSAmZ3Q7Jm5ic3A7MCBpcyBwcm92aWRlZCwgdGhlIGNyZWF0ZWQgc2NoZWR1bGVkIHRocmVhZCBwb29sIGV4ZWN1dG9yIGxpbWl0ZWQgdG8gdGhhdAorICAgICAqIG51bWJlciBvZiB0aHJlYWRzIHdpbGwgYmUgdXRpbGl6ZWQuIFplcm8gb3IgbmVnYXRpdmUgdmFsdWVzIHdpbGwgYmUgaWdub3JlZC4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogTm90ZSB0aGF0IHRoZSBwcm9wZXJ0eSBtYXkgYmUgaWdub3JlZCBpZiBhIGN1c3RvbSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLkV4ZWN1dG9yU2VydmljZVByb3ZpZGVyfQorICAgICAqIGlzIGNvbmZpZ3VyZWQgdG8gZXhlY3V0ZSBiYWNrZ3JvdW5kIHRhc2tzIHNjaGVkdWxpbmcgaW4gdGhlIGNsaWVudCBydW50aW1lIChzZWUKKyAgICAgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudEJhY2tncm91bmRTY2hlZHVsZXJ9KS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogQSBkZWZhdWx0IHZhbHVlIGlzIG5vdCBzZXQuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDx0dD57QHZhbHVlfTwvdHQ+LgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQUNLR1JPVU5EX1NDSEVEVUxFUl9USFJFQURQT09MX1NJWkUgPSAiamVyc2V5LmNvbmZpZy5jbGllbnQuYmFja2dyb3VuZFNjaGVkdWxlci50aHJlYWRQb29sU2l6ZSI7CisKKyAgICAvKioKKyAgICAgKiBJZiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LmZpbHRlci5FbmNvZGluZ0ZpbHRlcn0gaXMKKyAgICAgKiByZWdpc3RlcmVkLCB0aGlzIHByb3BlcnR5IGluZGljYXRlcyB0aGUgdmFsdWUgb2YgQ29udGVudC1FbmNvZGluZworICAgICAqIHByb3BlcnR5IHRoZSBmaWx0ZXIgc2hvdWxkIGJlIGFkZGluZy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgdmFsdWUgTVVTVCBiZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgU3RyaW5nfS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMge0Bjb2RlIG51bGx9LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVNFX0VOQ09ESU5HID0gImplcnNleS5jb25maWcuY2xpZW50LnVzZUVuY29kaW5nIjsKKworICAgIC8qKgorICAgICAqIElmIHtAY29kZSB0cnVlfSB0aGVuIGRpc2FibGUgYXV0by1kaXNjb3Zlcnkgb24gdGhlIGNsaWVudC4KKyAgICAgKiA8cD4KKyAgICAgKiBCeSBkZWZhdWx0IGF1dG8tZGlzY292ZXJ5IG9uIGNsaWVudCBpcyBhdXRvbWF0aWNhbGx5IGVuYWJsZWQgaWYgZ2xvYmFsCisgICAgICogcHJvcGVydHkKKyAgICAgKiB7QHZhbHVlIG9yZy5nbGFzc2Zpc2guamVyc2V5LkNvbW1vblByb3BlcnRpZXMjRkVBVFVSRV9BVVRPX0RJU0NPVkVSWV9ESVNBQkxFfQorICAgICAqIGlzIG5vdCBkaXNhYmxlZC4gSWYgc2V0IHRoZW4gdGhlIGNsaWVudCBwcm9wZXJ0eSB2YWx1ZSBvdmVycmlkZXMgdGhlCisgICAgICogZ2xvYmFsIHByb3BlcnR5IHZhbHVlLgorICAgICAqIDxwPgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHtAY29kZSBmYWxzZX0uCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDx0dD57QHZhbHVlfTwvdHQ+LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD5UaGlzIGNvbnN0YW50IGlzIGFuIGFsaWFzIGZvciB7QGxpbmsgQ29tbW9uUHJvcGVydGllcyNGRUFUVVJFX0FVVE9fRElTQ09WRVJZX0RJU0FCTEVfQ0xJRU5UfS48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIG9yZy5nbGFzc2Zpc2guamVyc2V5LkNvbW1vblByb3BlcnRpZXMjRkVBVFVSRV9BVVRPX0RJU0NPVkVSWV9ESVNBQkxFCisgICAgICovCisgICAgQFByb3BlcnR5QWxpYXMKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX0FVVE9fRElTQ09WRVJZX0RJU0FCTEUgPSBDb21tb25Qcm9wZXJ0aWVzLkZFQVRVUkVfQVVUT19ESVNDT1ZFUllfRElTQUJMRV9DTElFTlQ7CisKKyAgICAvKioKKyAgICAgKiBBbiBpbnRlZ2VyIHZhbHVlIHRoYXQgZGVmaW5lcyB0aGUgYnVmZmVyIHNpemUgdXNlZCB0byBidWZmZXIgY2xpZW50LXNpZGUKKyAgICAgKiByZXF1ZXN0IGVudGl0eSBpbiBvcmRlciB0byBkZXRlcm1pbmUgaXRzIHNpemUgYW5kIHNldCB0aGUgdmFsdWUgb2YgSFRUUAorICAgICAqIDx0dD57QHZhbHVlIGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnMjQ09OVEVOVF9MRU5HVEh9PC90dD4gaGVhZGVyLgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSBlbnRpdHkgc2l6ZSBleGNlZWRzIHRoZSBjb25maWd1cmVkIGJ1ZmZlciBzaXplLCB0aGUgYnVmZmVyaW5nCisgICAgICogd291bGQgYmUgY2FuY2VsbGVkIGFuZCB0aGUgZW50aXR5IHNpemUgd291bGQgbm90IGJlIGRldGVybWluZWQuIFZhbHVlCisgICAgICogbGVzcyBvciBlcXVhbCB0byB6ZXJvIGRpc2FibGUgdGhlIGJ1ZmZlcmluZyBvZiB0aGUgZW50aXR5IGF0IGFsbC4KKyAgICAgKiA8L3A+CisgICAgICogVGhpcyBwcm9wZXJ0eSBjYW4gYmUgdXNlZCBvbiB0aGUgY2xpZW50IHNpZGUgdG8gb3ZlcnJpZGUgdGhlIG91dGJvdW5kCisgICAgICogbWVzc2FnZSBidWZmZXIgc2l6ZSB2YWx1ZSAtIGRlZmF1bHQgb3IgdGhlIGdsb2JhbCBjdXN0b20gdmFsdWUgc2V0IHVzaW5nCisgICAgICogdGhlCisgICAgICoge0B2YWx1ZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5Db21tb25Qcm9wZXJ0aWVzI09VVEJPVU5EX0NPTlRFTlRfTEVOR1RIX0JVRkZFUn0KKyAgICAgKiBnbG9iYWwgcHJvcGVydHkuCisgICAgICogPHA+CisgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMKKyAgICAgKiA8dHQ+ODE5MjwvdHQ+LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKiA8L3A+CisgICAgICogPHA+VGhpcyBjb25zdGFudCBpcyBhbiBhbGlhcyBmb3Ige0BsaW5rIENvbW1vblByb3BlcnRpZXMjT1VUQk9VTkRfQ09OVEVOVF9MRU5HVEhfQlVGRkVSX0NMSUVOVH0uPC9wPgorICAgICAqCisgICAgICogQHNpbmNlIDIuMgorICAgICAqLworICAgIEBQcm9wZXJ0eUFsaWFzCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUQk9VTkRfQ09OVEVOVF9MRU5HVEhfQlVGRkVSID0gQ29tbW9uUHJvcGVydGllcy5PVVRCT1VORF9DT05URU5UX0xFTkdUSF9CVUZGRVJfQ0xJRU5UOworCisgICAgLyoqCisgICAgICogSWYge0Bjb2RlIHRydWV9IHRoZW4gZGlzYWJsZSBjb25maWd1cmF0aW9uIG9mIEpzb24gUHJvY2Vzc2luZyAoSlNSLTM1MykKKyAgICAgKiBmZWF0dXJlIG9uIGNsaWVudC4KKyAgICAgKiA8cD4KKyAgICAgKiBCeSBkZWZhdWx0IEpzb24gUHJvY2Vzc2luZyBvbiBjbGllbnQgaXMgYXV0b21hdGljYWxseSBlbmFibGVkIGlmIGdsb2JhbAorICAgICAqIHByb3BlcnR5CisgICAgICoge0B2YWx1ZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5Db21tb25Qcm9wZXJ0aWVzI0pTT05fUFJPQ0VTU0lOR19GRUFUVVJFX0RJU0FCTEV9CisgICAgICogaXMgbm90IGRpc2FibGVkLiBJZiBzZXQgdGhlbiB0aGUgY2xpZW50IHByb3BlcnR5IHZhbHVlIG92ZXJyaWRlcyB0aGUKKyAgICAgKiBnbG9iYWwgcHJvcGVydHkgdmFsdWUuCisgICAgICogPHA+CisgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMge0Bjb2RlIGZhbHNlfS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaXMgPHR0PntAdmFsdWV9PC90dD4uCisgICAgICogPC9wPgorICAgICAqIDxwPlRoaXMgY29uc3RhbnQgaXMgYW4gYWxpYXMgZm9yIHtAbGluayBDb21tb25Qcm9wZXJ0aWVzI0pTT05fUFJPQ0VTU0lOR19GRUFUVVJFX0RJU0FCTEVfQ0xJRU5UfS48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIG9yZy5nbGFzc2Zpc2guamVyc2V5LkNvbW1vblByb3BlcnRpZXMjSlNPTl9QUk9DRVNTSU5HX0ZFQVRVUkVfRElTQUJMRQorICAgICAqLworICAgIEBQcm9wZXJ0eUFsaWFzCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9QUk9DRVNTSU5HX0ZFQVRVUkVfRElTQUJMRSA9IENvbW1vblByb3BlcnRpZXMuSlNPTl9QUk9DRVNTSU5HX0ZFQVRVUkVfRElTQUJMRV9DTElFTlQ7CisKKyAgICAvKioKKyAgICAgKiBJZiB7QGNvZGUgdHJ1ZX0gdGhlbiBkaXNhYmxlIE1FVEEtSU5GL3NlcnZpY2VzIGxvb2t1cCBvbiBjbGllbnQuCisgICAgICogPHA+CisgICAgICogQnkgZGVmYXVsdCBKZXJzZXkgbG9va3MgdXAgU1BJIGltcGxlbWVudGF0aW9ucyBkZXNjcmliZWQgYnkge0Bjb2RlIE1FVEEtSU5GL3NlcnZpY2VzLyp9IGZpbGVzLgorICAgICAqIFRoZW4geW91IGNhbiByZWdpc3RlciBhcHByb3ByaWF0ZSBwcm92aWRlciAgY2xhc3NlcyBieSB7QGxpbmsgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbn0uCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHtAY29kZSBmYWxzZX0uCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDx0dD57QHZhbHVlfTwvdHQ+LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD5UaGlzIGNvbnN0YW50IGlzIGFuIGFsaWFzIGZvciB7QGxpbmsgQ29tbW9uUHJvcGVydGllcyNNRVRBSU5GX1NFUlZJQ0VTX0xPT0tVUF9ESVNBQkxFX0NMSUVOVH0uPC9wPgorICAgICAqCisgICAgICogQHNlZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5Db21tb25Qcm9wZXJ0aWVzI01FVEFJTkZfU0VSVklDRVNfTE9PS1VQX0RJU0FCTEUKKyAgICAgKi8KKyAgICBAUHJvcGVydHlBbGlhcworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFJTkZfU0VSVklDRVNfTE9PS1VQX0RJU0FCTEUgPSBDb21tb25Qcm9wZXJ0aWVzLk1FVEFJTkZfU0VSVklDRVNfTE9PS1VQX0RJU0FCTEVfQ0xJRU5UOworCisgICAgLyoqCisgICAgICogSWYge0Bjb2RlIHRydWV9IHRoZW4gZGlzYWJsZSBjb25maWd1cmF0aW9uIG9mIE1PWHkgSnNvbiBmZWF0dXJlIG9uCisgICAgICogY2xpZW50LgorICAgICAqIDxwPgorICAgICAqIEJ5IGRlZmF1bHQgTU9YeSBKc29uIG9uIGNsaWVudCBpcyBhdXRvbWF0aWNhbGx5IGVuYWJsZWQgaWYgZ2xvYmFsCisgICAgICogcHJvcGVydHkKKyAgICAgKiB7QHZhbHVlIG9yZy5nbGFzc2Zpc2guamVyc2V5LkNvbW1vblByb3BlcnRpZXMjTU9YWV9KU09OX0ZFQVRVUkVfRElTQUJMRX0KKyAgICAgKiBpcyBub3QgZGlzYWJsZWQuIElmIHNldCB0aGVuIHRoZSBjbGllbnQgcHJvcGVydHkgdmFsdWUgb3ZlcnJpZGVzIHRoZQorICAgICAqIGdsb2JhbCBwcm9wZXJ0eSB2YWx1ZS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMge0Bjb2RlIGZhbHNlfS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaXMgPHR0PntAdmFsdWV9PC90dD4uCisgICAgICogPC9wPgorICAgICAqIDxwPlRoaXMgY29uc3RhbnQgaXMgYW4gYWxpYXMgZm9yIHtAbGluayBDb21tb25Qcm9wZXJ0aWVzI01PWFlfSlNPTl9GRUFUVVJFX0RJU0FCTEVfQ0xJRU5UfS48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIG9yZy5nbGFzc2Zpc2guamVyc2V5LkNvbW1vblByb3BlcnRpZXMjTU9YWV9KU09OX0ZFQVRVUkVfRElTQUJMRQorICAgICAqIEBzaW5jZSAyLjEKKyAgICAgKi8KKyAgICBAUHJvcGVydHlBbGlhcworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PWFlfSlNPTl9GRUFUVVJFX0RJU0FCTEUgPSBDb21tb25Qcm9wZXJ0aWVzLk1PWFlfSlNPTl9GRUFUVVJFX0RJU0FCTEVfQ0xJRU5UOworCisgICAgLyoqCisgICAgICogSWYge0Bjb2RlIHRydWV9LCB0aGUgc3RyaWN0IHZhbGlkYXRpb24gb2YgSFRUUCBzcGVjaWZpY2F0aW9uIGNvbXBsaWFuY2UKKyAgICAgKiB3aWxsIGJlIHN1cHByZXNzZWQuCisgICAgICogPHA+CisgICAgICogQnkgZGVmYXVsdCwgSmVyc2V5IGNsaWVudCBydW50aW1lIHBlcmZvcm1zIGNlcnRhaW4gSFRUUCBjb21wbGlhbmNlIGNoZWNrcworICAgICAqIChzdWNoIGFzIHdoaWNoIEhUVFAgbWV0aG9kcyBjYW4gZmFjaWxpdGF0ZSBub24tZW1wdHkgcmVxdWVzdCBlbnRpdGllcworICAgICAqIGV0Yy4pIGluIG9yZGVyIHRvIGZhaWwgZmFzdCB3aXRoIGFuIGV4Y2VwdGlvbiB3aGVuIHVzZXIgdHJpZXMgdG8KKyAgICAgKiBlc3RhYmxpc2ggYSBjb21tdW5pY2F0aW9uIG5vbi1jb21wbGlhbnQgd2l0aCBIVFRQIHNwZWNpZmljYXRpb24uIFVzZXJzCisgICAgICogd2hvIG5lZWQgdG8gb3ZlcnJpZGUgdGhlc2UgY29tcGxpYW5jZSBjaGVja3MgYW5kIGF2b2lkIHRoZSBleGNlcHRpb25zCisgICAgICogYmVpbmcgdGhyb3duIGJ5IEplcnNleSBjbGllbnQgcnVudGltZSBmb3Igc29tZSByZWFzb24sIGNhbiBzZXQgdGhpcworICAgICAqIHByb3BlcnR5IHRvIHtAY29kZSB0cnVlfS4gQXMgYSByZXN1bHQsIHRoZSBjb21wbGlhbmNlIGlzc3VlcyB3aWxsIGJlCisgICAgICogbWVyZWx5IHJlcG9ydGVkIGluIGEgbG9nIGFuZCBubyBleGNlcHRpb25zIHdpbGwgYmUgdGhyb3duLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlIHRoYXQgdGhlIHByb3BlcnR5IHN1cHByZXNzZXMgdGhlIEplcnNleSBsYXllciBleGNlcHRpb25zLiBDaGFuY2VzCisgICAgICogYXJlIHRoYXQgdGhlIG5vbi1jb21wbGlhbnQgYmVoYXZpb3Igd2lsbCBjYXVzZSBkaWZmZXJlbnQgc2V0IG9mCisgICAgICogZXhjZXB0aW9ucyBiZWluZyByYWlzZWQgaW4gdGhlIHVuZGVybHlpbmcgSS9PIGNvbm5lY3RvciBsYXllci4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhpcyBwcm9wZXJ0eSBjYW4gYmUgY29uZmlndXJlZCBpbiBhIGNsaWVudCBydW50aW1lIGNvbmZpZ3VyYXRpb24gb3IKKyAgICAgKiBkaXJlY3RseSBvbiBhbiBpbmRpdmlkdWFsIHJlcXVlc3QuIEluIGNhc2Ugb2YgY29uZmxpY3QsIHJlcXVlc3Qtc3BlY2lmaWMKKyAgICAgKiBwcm9wZXJ0eSB2YWx1ZSB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdmFsdWUgY29uZmlndXJlZCBpbiB0aGUgcnVudGltZQorICAgICAqIGNvbmZpZ3VyYXRpb24uCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHtAY29kZSBmYWxzZX0uCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDx0dD57QHZhbHVlfTwvdHQ+LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBzaW5jZSAyLjIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVVBQUkVTU19IVFRQX0NPTVBMSUFOQ0VfVkFMSURBVElPTiA9CisgICAgICAgICAgICAiamVyc2V5LmNvbmZpZy5jbGllbnQuc3VwcHJlc3NIdHRwQ29tcGxpYW5jZVZhbGlkYXRpb24iOworCisgICAgLyoqCisgICAgICogVGhlIHByb3BlcnR5IGRlZmluZXMgdGhlIHNpemUgb2YgZGlnZXN0IGNhY2hlIGluIHRoZQorICAgICAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuYXV0aGVudGljYXRpb24uSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZSNkaWdlc3QoKX0gIGRpZ2VzdCBmaWx0ZXJ9LgorICAgICAqIENhY2hlIGNvbnRhaW5zIGF1dGhlbnRpY2F0aW9uCisgICAgICogc2NoZW1lcyBmb3IgZGlmZmVyZW50IHJlcXVlc3QgVVJJcy4KKyAgICAgKiA8cFw+CisgICAgICogVGhlIHZhbHVlIE1VU1QgYmUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIGphdmEubGFuZy5JbnRlZ2VyfSBhbmQgaXQgbXVzdCBiZQorICAgICAqIGhpZ2hlciBvciBlcXVhbCB0byAxLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB7QGNvZGUgMTAwMH0uCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDx0dD57QHZhbHVlfTwvdHQ+LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBzaW5jZSAyLjMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBESUdFU1RBVVRIX1VSSV9DQUNIRV9TSVpFTElNSVQgPSAiamVyc2V5LmNvbmZpZy5jbGllbnQuZGlnZXN0QXV0aFVyaUNhY2hlU2l6ZUxpbWl0IjsKKworICAgIC8vIFRPRE8gTmVlZCB0byBpbXBsZW1lbnQgc3VwcG9ydCBmb3IgUFJPWFktKiBwcm9wZXJ0aWVzIGluIG90aGVyIGNvbm5lY3RvcnMKKyAgICAvKioKKyAgICAgKiBUaGUgcHJvcGVydHkgZGVmaW5lcyBhIFVSSSBvZiBhIEhUVFAgcHJveHkgdGhlIGNsaWVudCBjb25uZWN0b3Igc2hvdWxkIHVzZS4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgcG9ydCBjb21wb25lbnQgb2YgdGhlIFVSSSBpcyBhYnNlbnQgdGhlbiBhIGRlZmF1bHQgcG9ydCBvZiB7QGNvZGUgODA4MH0gaXMgYXNzdW1lZC4KKyAgICAgKiBJZiB0aGUgcHJvcGVydHkgYWJzZW50IHRoZW4gbm8gcHJveHkgd2lsbCBiZSB1dGlsaXplZC4KKyAgICAgKiA8L3A+CisgICAgICogPHA+VGhlIHZhbHVlIE1VU1QgYmUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFN0cmluZ30uPC9wPgorICAgICAqIDxwPlRoZSBkZWZhdWx0IHZhbHVlIGlzIHtAY29kZSBudWxsfS48L3A+CisgICAgICogPHA+VGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaXMgPHR0PntAdmFsdWV9PC90dD4uPC9wPgorICAgICAqCisgICAgICogQHNpbmNlIDIuNQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1hZX1VSSSA9ICJqZXJzZXkuY29uZmlnLmNsaWVudC5wcm94eS51cmkiOworCisgICAgLyoqCisgICAgICogVGhlIHByb3BlcnR5IGRlZmluZXMgYSB1c2VyIG5hbWUgd2hpY2ggd2lsbCBiZSB1c2VkIGZvciBIVFRQIHByb3h5IGF1dGhlbnRpY2F0aW9uLgorICAgICAqIDxwPgorICAgICAqIFRoZSBwcm9wZXJ0eSBpcyBpZ25vcmVkIGlmIG5vIHtAbGluayAjUFJPWFlfVVJJIEhUVFAgcHJveHkgVVJJfSBoYXMgYmVlbiBzZXQuCisgICAgICogSWYgdGhlIHByb3BlcnR5IGFic2VudCB0aGVuIG5vIHByb3h5IGF1dGhlbnRpY2F0aW9uIHdpbGwgYmUgdXRpbGl6ZWQuCisgICAgICogPC9wPgorICAgICAqIDxwPlRoZSB2YWx1ZSBNVVNUIGJlIGFuIGluc3RhbmNlIG9mIHtAbGluayBTdHJpbmd9LjwvcD4KKyAgICAgKiA8cD5UaGUgZGVmYXVsdCB2YWx1ZSBpcyB7QGNvZGUgbnVsbH0uPC9wPgorICAgICAqIDxwPlRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDx0dD57QHZhbHVlfTwvdHQ+LjwvcD4KKyAgICAgKgorICAgICAqIEBzaW5jZSAyLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9YWV9VU0VSTkFNRSA9ICJqZXJzZXkuY29uZmlnLmNsaWVudC5wcm94eS51c2VybmFtZSI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcHJvcGVydHkgZGVmaW5lcyBhIHVzZXIgcGFzc3dvcmQgd2hpY2ggd2lsbCBiZSB1c2VkIGZvciBIVFRQIHByb3h5IGF1dGhlbnRpY2F0aW9uLgorICAgICAqIDxwPgorICAgICAqIFRoZSBwcm9wZXJ0eSBpcyBpZ25vcmVkIGlmIG5vIHtAbGluayAjUFJPWFlfVVJJIEhUVFAgcHJveHkgVVJJfSBoYXMgYmVlbiBzZXQuCisgICAgICogSWYgdGhlIHByb3BlcnR5IGFic2VudCB0aGVuIG5vIHByb3h5IGF1dGhlbnRpY2F0aW9uIHdpbGwgYmUgdXRpbGl6ZWQuCisgICAgICogPC9wPgorICAgICAqIDxwPlRoZSB2YWx1ZSBNVVNUIGJlIGFuIGluc3RhbmNlIG9mIHtAbGluayBTdHJpbmd9LjwvcD4KKyAgICAgKiA8cD5UaGUgZGVmYXVsdCB2YWx1ZSBpcyB7QGNvZGUgbnVsbH0uPC9wPgorICAgICAqIDxwPlRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDx0dD57QHZhbHVlfTwvdHQ+LjwvcD4KKyAgICAgKgorICAgICAqIEBzaW5jZSAyLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9YWV9QQVNTV09SRCA9ICJqZXJzZXkuY29uZmlnLmNsaWVudC5wcm94eS5wYXNzd29yZCI7CisgICAgLyoqCisgICAgICogVGhlIHByb3BlcnR5IHNwZWNpZmllZCBob3cgdGhlIGVudGl0eSBzaG91bGQgYmUgc2VyaWFsaXplZCB0byB0aGUgb3V0cHV0IHN0cmVhbSBieSB0aGUKKyAgICAgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnNwaS5Db25uZWN0b3IgY29ubmVjdG9yfTsgaWYgdGhlIGJ1ZmZlcmluZworICAgICAqIHNob3VsZCBiZSB1c2VkIG9yIHRoZSBlbnRpdHkgaXMgc3RyZWFtZWQgaW4gY2h1bmtlZCBlbmNvZGluZy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgdmFsdWUgTVVTVCBiZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgU3RyaW5nfSBvciBhbiBlbnVtIHZhbHVlIHtAbGluayBSZXF1ZXN0RW50aXR5UHJvY2Vzc2luZ30gaW4gdGhlIGNhc2UKKyAgICAgKiBvZiBwcm9ncmFtbWF0aWMgZGVmaW5pdGlvbiBvZiB0aGUgcHJvcGVydHkuIEFsbG93ZWQgdmFsdWVzIGFyZToKKyAgICAgKiA8dWw+CisgICAgICogPGxpPjxiPntAY29kZSBCVUZGRVJFRH08L2I+OiB0aGUgZW50aXR5IHdpbGwgYmUgYnVmZmVyZWQgYW5kIGNvbnRlbnQgbGVuZ3RoIHdpbGwgYmUgc2VuZCBpbiBDb250ZW50LWxlbmd0aCBoZWFkZXIuPC9saT4KKyAgICAgKiA8bGk+PGI+e0Bjb2RlIENIVU5LRUR9PC9iPjogY2h1bmtlZCBlbmNvZGluZyB3aWxsIGJlIHVzZWQgYW5kIGVudGl0eSB3aWxsIGJlIHN0cmVhbWVkLjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogRGVmYXVsdCB2YWx1ZSBpcyB7QGNvZGUgQ0hVTktFRH0uIEhvd2V2ZXIsIGR1ZSB0byBsaW1pdGF0aW9ucyBzb21lIGNvbm5lY3RvcnMgY2FuIGRlZmluZSBkaWZmZXJlbnQKKyAgICAgKiBkZWZhdWx0IHZhbHVlICh1c3VhbGx5IGlmIHRoZSBjaHVua2VkIGVuY29kaW5nIGNhbm5vdCBiZSBwcm9wZXJseSBzdXBwb3J0ZWQgb24gdGhlIHtAY29kZSBDb25uZWN0b3J9KS4KKyAgICAgKiBUaGlzIGRldGFpbCBzaG91bGQgYmUgc3BlY2lmaWVkIGluIHRoZSBqYXZhZG9jIG9mIHBhcnRpY3VsYXIgY29ubmVjdG9yLiBGb3IgZXhhbXBsZSwge0BsaW5rIEh0dHBVcmxDb25uZWN0b3J9CisgICAgICogdXNlIGJ1ZmZlcmluZyBhcyB0aGUgZGVmYXVsdCBtb2RlLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAc2luY2UgMi41CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUVTVF9FTlRJVFlfUFJPQ0VTU0lORyA9ICJqZXJzZXkuY29uZmlnLmNsaWVudC5yZXF1ZXN0LmVudGl0eS5wcm9jZXNzaW5nIjsKKworICAgIHByaXZhdGUgQ2xpZW50UHJvcGVydGllcygpIHsKKyAgICAgICAgLy8gcHJldmVudHMgaW5zdGFudGlhdGlvbgorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eS4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgcHJvcGVydHkgaXMgbm90IHNldCBvciB0aGUgcmVhbCB2YWx1ZSB0eXBlIGlzIG5vdCBjb21wYXRpYmxlIHdpdGgKKyAgICAgKiB7QGNvZGUgZGVmYXVsdFZhbHVlfSB0eXBlLCB0aGUgc3BlY2lmaWVkIHtAY29kZSBkZWZhdWx0VmFsdWV9IGlzIHJldHVybmVkLiBDYWxsaW5nIHRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZworICAgICAqIDx0dD5DbGllbnRQcm9wZXJ0aWVzLmdldFZhbHVlKHByb3BlcnRpZXMsIGtleSwgZGVmYXVsdFZhbHVlLCAoQ2xhc3MmbHQ7VCZndDspIGRlZmF1bHRWYWx1ZS5nZXRDbGFzcygpKTwvdHQ+LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzICAgTWFwIG9mIHByb3BlcnRpZXMgdG8gZ2V0IHRoZSBwcm9wZXJ0eSB2YWx1ZSBmcm9tLgorICAgICAqIEBwYXJhbSBrZXkgICAgICAgICAgTmFtZSBvZiB0aGUgcHJvcGVydHkuCisgICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBEZWZhdWx0IHZhbHVlIGlmIHByb3BlcnR5IGlzIG5vdCByZWdpc3RlcmVkCisgICAgICogQHBhcmFtIDxUPiAgICAgICAgICBUeXBlIG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIFZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBvciB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIDIuOAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFQgZ2V0VmFsdWUoZmluYWwgTWFwPFN0cmluZywgPz4gcHJvcGVydGllcywgZmluYWwgU3RyaW5nIGtleSwgZmluYWwgVCBkZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIFByb3BlcnRpZXNIZWxwZXIuZ2V0VmFsdWUocHJvcGVydGllcywga2V5LCBkZWZhdWx0VmFsdWUsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eS4KKyAgICAgKiA8cC8+CisgICAgICogSWYgdGhlIHByb3BlcnR5IGlzIG5vdCBzZXQgb3IgdGhlIHJlYWwgdmFsdWUgdHlwZSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUgdHlwZSwKKyAgICAgKiByZXR1cm5zIHtAY29kZSBkZWZhdWx0VmFsdWV9LgorICAgICAqCisgICAgICogQHBhcmFtIHByb3BlcnRpZXMgICBNYXAgb2YgcHJvcGVydGllcyB0byBnZXQgdGhlIHByb3BlcnR5IHZhbHVlIGZyb20uCisgICAgICogQHBhcmFtIGtleSAgICAgICAgICBOYW1lIG9mIHRoZSBwcm9wZXJ0eS4KKyAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIERlZmF1bHQgdmFsdWUgaWYgcHJvcGVydHkgaXMgbm90IHJlZ2lzdGVyZWQKKyAgICAgKiBAcGFyYW0gdHlwZSAgICAgICAgIFR5cGUgdG8gcmV0cmlldmUgdGhlIHZhbHVlIGFzLgorICAgICAqIEBwYXJhbSA8VD4gICAgICAgICAgVHlwZSBvZiB0aGUgcHJvcGVydHkgdmFsdWUuCisgICAgICogQHJldHVybiBWYWx1ZSBvZiB0aGUgcHJvcGVydHkgb3Ige0Bjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSAyLjgKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUPiBUIGdldFZhbHVlKGZpbmFsIE1hcDxTdHJpbmcsID8+IHByb3BlcnRpZXMsIGZpbmFsIFN0cmluZyBrZXksIGZpbmFsIFQgZGVmYXVsdFZhbHVlLCBmaW5hbCBDbGFzczxUPiB0eXBlKSB7CisgICAgICAgIHJldHVybiBQcm9wZXJ0aWVzSGVscGVyLmdldFZhbHVlKHByb3BlcnRpZXMsIGtleSwgZGVmYXVsdFZhbHVlLCB0eXBlLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuCisgICAgICogPHAvPgorICAgICAqIElmIHRoZSBwcm9wZXJ0eSBpcyBub3Qgc2V0IG9yIHRoZSBhY3R1YWwgcHJvcGVydHkgdmFsdWUgdHlwZSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgdHlwZSwgdGhlIG1ldGhvZCB3aWxsCisgICAgICogcmV0dXJuIHtAY29kZSBudWxsfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzIE1hcCBvZiBwcm9wZXJ0aWVzIHRvIGdldCB0aGUgcHJvcGVydHkgdmFsdWUgZnJvbS4KKyAgICAgKiBAcGFyYW0ga2V5ICAgICAgICBOYW1lIG9mIHRoZSBwcm9wZXJ0eS4KKyAgICAgKiBAcGFyYW0gdHlwZSAgICAgICBUeXBlIHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBhcy4KKyAgICAgKiBAcGFyYW0gPFQ+ICAgICAgICBUeXBlIG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIFZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBvciB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIDIuOAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFQgZ2V0VmFsdWUoZmluYWwgTWFwPFN0cmluZywgPz4gcHJvcGVydGllcywgZmluYWwgU3RyaW5nIGtleSwgZmluYWwgQ2xhc3M8VD4gdHlwZSkgeworICAgICAgICByZXR1cm4gUHJvcGVydGllc0hlbHBlci5nZXRWYWx1ZShwcm9wZXJ0aWVzLCBrZXksIHR5cGUsIG51bGwpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0NsaWVudFJlcXVlc3QuamF2YSBiL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0NsaWVudFJlcXVlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNThjYmI1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvQ2xpZW50UmVxdWVzdC5qYXZhCkBAIC0wLDAgKzEsNjE4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ2FjaGVDb250cm9sOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvb2tpZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkdlbmVyaWNUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVmFyaWFudDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUmVhZGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLk1hcFByb3BlcnRpZXNEZWxlZ2F0ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Qcm9wZXJ0aWVzRGVsZWdhdGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmEuUHJlY29uZGl0aW9uczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlclN1cHBsaWVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuRXhjZXB0aW9uVXRpbHM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5Qcm9wZXJ0aWVzSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuTWVzc2FnZUJvZHlXb3JrZXJzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuT3V0Ym91bmRNZXNzYWdlQ29udGV4dDsKKworLyoqCisgKiBKZXJzZXkgY2xpZW50IHJlcXVlc3QgY29udGV4dC4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQ2xpZW50UmVxdWVzdCBleHRlbmRzIE91dGJvdW5kTWVzc2FnZUNvbnRleHQgaW1wbGVtZW50cyBDbGllbnRSZXF1ZXN0Q29udGV4dCwgSW5qZWN0aW9uTWFuYWdlclN1cHBsaWVyIHsKKworICAgIC8vIFJlcXVlc3Qtc2NvcGVkIGNvbmZpZ3VyYXRpb24gaW5zdGFuY2UKKyAgICBwcml2YXRlIGZpbmFsIENsaWVudENvbmZpZyBjbGllbnRDb25maWc7CisgICAgLy8gUmVxdWVzdC1zY29wZWQgcHJvcGVydGllcyBkZWxlZ2F0ZQorICAgIHByaXZhdGUgZmluYWwgUHJvcGVydGllc0RlbGVnYXRlIHByb3BlcnRpZXNEZWxlZ2F0ZTsKKyAgICAvLyBBYnNvbHV0ZSByZXF1ZXN0IFVSSQorICAgIHByaXZhdGUgVVJJIHJlcXVlc3RVcmk7CisgICAgLy8gUmVxdWVzdCBtZXRob2QKKyAgICBwcml2YXRlIFN0cmluZyBodHRwTWV0aG9kOworICAgIC8vIFJlcXVlc3QgZmlsdGVyIGNoYWluIGV4ZWN1dGlvbiBhYm9ydGluZyByZXNwb25zZQorICAgIHByaXZhdGUgUmVzcG9uc2UgYWJvcnRSZXNwb25zZTsKKyAgICAvLyBFbnRpdHkgcHJvdmlkZXJzCisgICAgcHJpdmF0ZSBNZXNzYWdlQm9keVdvcmtlcnMgd29ya2VyczsKKyAgICAvLyBGbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgcmVxdWVzdCBpcyBhc3luY2hyb25vdXMKKyAgICBwcml2YXRlIGJvb2xlYW4gYXN5bmNocm9ub3VzOworICAgIC8vIHRydWUgaWYgd3JpdGVFbnRpdHkoKSB3YXMgYWxyZWFkeSBjYWxsZWQKKyAgICBwcml2YXRlIGJvb2xlYW4gZW50aXR5V3JpdHRlbjsKKyAgICAvLyB3cml0ZXIgaW50ZXJjZXB0b3JzIHVzZWQgdG8gd3JpdGUgdGhlIHJlcXVlc3QKKyAgICBwcml2YXRlIEl0ZXJhYmxlPFdyaXRlckludGVyY2VwdG9yPiB3cml0ZXJJbnRlcmNlcHRvcnM7CisgICAgLy8gcmVhZGVyIGludGVyY2VwdG9ycyB1c2VkIHRvIHdyaXRlIHRoZSByZXF1ZXN0CisgICAgcHJpdmF0ZSBJdGVyYWJsZTxSZWFkZXJJbnRlcmNlcHRvcj4gcmVhZGVySW50ZXJjZXB0b3JzOworICAgIC8vIGRvIG5vdCBhZGQgdXNlci1hZ2VudCBoZWFkZXIgKGlmIG5vdCBkaXJlY3RseSBzZXQpIHRvIHRoZSByZXF1ZXN0LgorICAgIHByaXZhdGUgYm9vbGVhbiBpZ25vcmVVc2VyQWdlbnQ7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihDbGllbnRSZXF1ZXN0LmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IEplcnNleSBjbGllbnQgcmVxdWVzdCBjb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3RVcmkgICAgICAgICByZXF1ZXN0IFVyaS4KKyAgICAgKiBAcGFyYW0gY2xpZW50Q29uZmlnICAgICAgcmVxdWVzdCBjb25maWd1cmF0aW9uLgorICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzRGVsZWdhdGUgcHJvcGVydGllcyBkZWxlZ2F0ZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ2xpZW50UmVxdWVzdCgKKyAgICAgICAgICAgIGZpbmFsIFVSSSByZXF1ZXN0VXJpLCBmaW5hbCBDbGllbnRDb25maWcgY2xpZW50Q29uZmlnLCBmaW5hbCBQcm9wZXJ0aWVzRGVsZWdhdGUgcHJvcGVydGllc0RlbGVnYXRlKSB7CisgICAgICAgIGNsaWVudENvbmZpZy5jaGVja0NsaWVudCgpOworCisgICAgICAgIHRoaXMucmVxdWVzdFVyaSA9IHJlcXVlc3RVcmk7CisgICAgICAgIHRoaXMuY2xpZW50Q29uZmlnID0gY2xpZW50Q29uZmlnOworICAgICAgICB0aGlzLnByb3BlcnRpZXNEZWxlZ2F0ZSA9IHByb3BlcnRpZXNEZWxlZ2F0ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb3B5IGNvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIG9yaWdpbmFsIG9yaWdpbmFsIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBDbGllbnRSZXF1ZXN0KGZpbmFsIENsaWVudFJlcXVlc3Qgb3JpZ2luYWwpIHsKKyAgICAgICAgc3VwZXIob3JpZ2luYWwpOworICAgICAgICB0aGlzLnJlcXVlc3RVcmkgPSBvcmlnaW5hbC5yZXF1ZXN0VXJpOworICAgICAgICB0aGlzLmh0dHBNZXRob2QgPSBvcmlnaW5hbC5odHRwTWV0aG9kOworICAgICAgICB0aGlzLndvcmtlcnMgPSBvcmlnaW5hbC53b3JrZXJzOworICAgICAgICB0aGlzLmNsaWVudENvbmZpZyA9IG9yaWdpbmFsLmNsaWVudENvbmZpZy5zbmFwc2hvdCgpOworICAgICAgICB0aGlzLmFzeW5jaHJvbm91cyA9IG9yaWdpbmFsLmlzQXN5bmNocm9ub3VzKCk7CisgICAgICAgIHRoaXMucmVhZGVySW50ZXJjZXB0b3JzID0gb3JpZ2luYWwucmVhZGVySW50ZXJjZXB0b3JzOworICAgICAgICB0aGlzLndyaXRlckludGVyY2VwdG9ycyA9IG9yaWdpbmFsLndyaXRlckludGVyY2VwdG9yczsKKyAgICAgICAgdGhpcy5wcm9wZXJ0aWVzRGVsZWdhdGUgPSBuZXcgTWFwUHJvcGVydGllc0RlbGVnYXRlKG9yaWdpbmFsLnByb3BlcnRpZXNEZWxlZ2F0ZSk7CisgICAgICAgIHRoaXMuaWdub3JlVXNlckFnZW50ID0gb3JpZ2luYWwuaWdub3JlVXNlckFnZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc29sdmUgYSBwcm9wZXJ0eSB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSB7QGNvZGUgbmFtZX0uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbWV0aG9kIHJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSByZWdpc3RlcmVkIGluIHRoZSByZXF1ZXN0LXNwZWNpZmljCisgICAgICogcHJvcGVydHkgYmFnLCBpZiBhdmFpbGFibGUuIElmIG5vIHByb3BlcnR5IGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkgbmFtZSBpcyBmb3VuZAorICAgICAqIGluIHRoZSByZXF1ZXN0LXNwZWNpZmljIHByb3BlcnR5IGJhZywgdGhlIG1ldGhvZCBsb29rcyBhdCB0aGUgcHJvcGVydGllcyBzdG9yZWQKKyAgICAgKiBpbiB0aGUge0BsaW5rICNnZXRDb25maWd1cmF0aW9uKCkgZ2xvYmFsIGNsaWVudC1ydW50aW1lIGNvbmZpZ3VyYXRpb259IHRoaXMgcmVxdWVzdAorICAgICAqIGJlbG9uZ3MgdG8uIElmIHRoZXJlIGlzIGEgdmFsdWUgZGVmaW5lZCBpbiB0aGUgY2xpZW50LXJ1bnRpbWUgY29uZmlndXJhdGlvbiwKKyAgICAgKiBpdCBpcyByZXR1cm5lZCwgb3RoZXJ3aXNlIHRoZSBtZXRob2QgcmV0dXJucyB7QGNvZGUgbnVsbH0gaWYgbm8gc3VjaCBwcm9wZXJ0eSBpcworICAgICAqIHJlZ2lzdGVyZWQgbmVpdGhlciBpbiB0aGUgY2xpZW50IHJ1bnRpbWUgbm9yIGluIHRoZSByZXF1ZXN0LXNwZWNpZmljIHByb3BlcnR5IGJhZy4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBwcm9wZXJ0eSBuYW1lLgorICAgICAqIEBwYXJhbSB0eXBlIGV4cGVjdGVkIHByb3BlcnR5IGNsYXNzIHR5cGUuCisgICAgICogQHBhcmFtIDxUPiBwcm9wZXJ0eSBKYXZhIHR5cGUuCisgICAgICogQHJldHVybiByZXNvbHZlZCBwcm9wZXJ0eSB2YWx1ZSBvciB7QGNvZGUgbnVsbH0gaWYgbm8gc3VjaCBwcm9wZXJ0eSBpcyByZWdpc3RlcmVkLgorICAgICAqLworICAgIHB1YmxpYyA8VD4gVCByZXNvbHZlUHJvcGVydHkoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIENsYXNzPFQ+IHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHJlc29sdmVQcm9wZXJ0eShuYW1lLCBudWxsLCB0eXBlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNvbHZlIGEgcHJvcGVydHkgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkge0Bjb2RlIG5hbWV9LgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhlIG1ldGhvZCByZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgcmVnaXN0ZXJlZCBpbiB0aGUgcmVxdWVzdC1zcGVjaWZpYworICAgICAqIHByb3BlcnR5IGJhZywgaWYgYXZhaWxhYmxlLiBJZiBubyBwcm9wZXJ0eSBmb3IgdGhlIGdpdmVuIHByb3BlcnR5IG5hbWUgaXMgZm91bmQKKyAgICAgKiBpbiB0aGUgcmVxdWVzdC1zcGVjaWZpYyBwcm9wZXJ0eSBiYWcsIHRoZSBtZXRob2QgbG9va3MgYXQgdGhlIHByb3BlcnRpZXMgc3RvcmVkCisgICAgICogaW4gdGhlIHtAbGluayAjZ2V0Q29uZmlndXJhdGlvbigpIGdsb2JhbCBjbGllbnQtcnVudGltZSBjb25maWd1cmF0aW9ufSB0aGlzIHJlcXVlc3QKKyAgICAgKiBiZWxvbmdzIHRvLiBJZiB0aGVyZSBpcyBhIHZhbHVlIGRlZmluZWQgaW4gdGhlIGNsaWVudC1ydW50aW1lIGNvbmZpZ3VyYXRpb24sCisgICAgICogaXQgaXMgcmV0dXJuZWQsIG90aGVyd2lzZSB0aGUgbWV0aG9kIHJldHVybnMge0Bjb2RlIGRlZmF1bHRWYWx1ZX0gaWYgbm8gc3VjaCBwcm9wZXJ0eSBpcworICAgICAqIHJlZ2lzdGVyZWQgbmVpdGhlciBpbiB0aGUgY2xpZW50IHJ1bnRpbWUgbm9yIGluIHRoZSByZXF1ZXN0LXNwZWNpZmljIHByb3BlcnR5IGJhZy4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBwcm9wZXJ0eSBuYW1lLgorICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgZGVmYXVsdCB2YWx1ZSB0byByZXR1cm4gaWYgdGhlIHByb3BlcnR5IGlzIG5vdCByZWdpc3RlcmVkLgorICAgICAqIEBwYXJhbSA8VD4gcHJvcGVydHkgSmF2YSB0eXBlLgorICAgICAqIEByZXR1cm4gcmVzb2x2ZWQgcHJvcGVydHkgdmFsdWUgb3Ige0Bjb2RlIGRlZmF1bHRWYWx1ZX0gaWYgbm8gc3VjaCBwcm9wZXJ0eSBpcyByZWdpc3RlcmVkLgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyA8VD4gVCByZXNvbHZlUHJvcGVydHkoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFQgZGVmYXVsdFZhbHVlKSB7CisgICAgICAgIHJldHVybiByZXNvbHZlUHJvcGVydHkobmFtZSwgZGVmYXVsdFZhbHVlLCAoQ2xhc3M8VD4pIGRlZmF1bHRWYWx1ZS5nZXRDbGFzcygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIDxUPiBUIHJlc29sdmVQcm9wZXJ0eShmaW5hbCBTdHJpbmcgbmFtZSwgT2JqZWN0IGRlZmF1bHRWYWx1ZSwgZmluYWwgQ2xhc3M8VD4gdHlwZSkgeworICAgICAgICAvLyBDaGVjayBydW50aW1lIGNvbmZpZ3VyYXRpb24gZmlyc3QKKyAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGNsaWVudENvbmZpZy5nZXRQcm9wZXJ0eShuYW1lKTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7CisgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayByZXF1ZXN0IHByb3BlcnRpZXMgbmV4dAorICAgICAgICByZXN1bHQgPSBwcm9wZXJ0aWVzRGVsZWdhdGUuZ2V0UHJvcGVydHkobmFtZSk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmVzdWx0ID0gZGVmYXVsdFZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChyZXN1bHQgPT0gbnVsbCkgPyBudWxsIDogUHJvcGVydGllc0hlbHBlci5jb252ZXJ0VmFsdWUocmVzdWx0LCB0eXBlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBwcm9wZXJ0aWVzRGVsZWdhdGUuZ2V0UHJvcGVydHkobmFtZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENvbGxlY3Rpb248U3RyaW5nPiBnZXRQcm9wZXJ0eU5hbWVzKCkgeworICAgICAgICByZXR1cm4gcHJvcGVydGllc0RlbGVnYXRlLmdldFByb3BlcnR5TmFtZXMoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgT2JqZWN0IG9iamVjdCkgeworICAgICAgICBwcm9wZXJ0aWVzRGVsZWdhdGUuc2V0UHJvcGVydHkobmFtZSwgb2JqZWN0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eShmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICBwcm9wZXJ0aWVzRGVsZWdhdGUucmVtb3ZlUHJvcGVydHkobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB1bmRlcmx5aW5nIHByb3BlcnRpZXMgZGVsZWdhdGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHVuZGVybHlpbmcgcHJvcGVydGllcyBkZWxlZ2F0ZS4KKyAgICAgKi8KKyAgICBQcm9wZXJ0aWVzRGVsZWdhdGUgZ2V0UHJvcGVydGllc0RlbGVnYXRlKCkgeworICAgICAgICByZXR1cm4gcHJvcGVydGllc0RlbGVnYXRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdW5kZXJseWluZyBjbGllbnQgcnVudGltZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdW5kZXJseWluZyBjbGllbnQgcnVudGltZS4KKyAgICAgKi8KKyAgICBDbGllbnRSdW50aW1lIGdldENsaWVudFJ1bnRpbWUoKSB7CisgICAgICAgIHJldHVybiBjbGllbnRDb25maWcuZ2V0UnVudGltZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBVUkkgZ2V0VXJpKCkgeworICAgICAgICByZXR1cm4gcmVxdWVzdFVyaTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcmkoZmluYWwgVVJJIHVyaSkgeworICAgICAgICB0aGlzLnJlcXVlc3RVcmkgPSB1cmk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRNZXRob2QoKSB7CisgICAgICAgIHJldHVybiBodHRwTWV0aG9kOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldE1ldGhvZChmaW5hbCBTdHJpbmcgbWV0aG9kKSB7CisgICAgICAgIHRoaXMuaHR0cE1ldGhvZCA9IG1ldGhvZDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmVyc2V5Q2xpZW50IGdldENsaWVudCgpIHsKKyAgICAgICAgcmV0dXJuIGNsaWVudENvbmZpZy5nZXRDbGllbnQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhYm9ydFdpdGgoZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgdGhpcy5hYm9ydFJlc3BvbnNlID0gcmVzcG9uc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSByZXF1ZXN0IGZpbHRlciBjaGFpbiBhYm9ydGluZyByZXNwb25zZSBpZiBzZXQsIG9yIHtAY29kZSBudWxsfSBvdGhlcndpc2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHJlcXVlc3QgZmlsdGVyIGNoYWluIGFib3J0aW5nIHJlc3BvbnNlIGlmIHNldCwgb3Ige0Bjb2RlIG51bGx9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0QWJvcnRSZXNwb25zZSgpIHsKKyAgICAgICAgcmV0dXJuIGFib3J0UmVzcG9uc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENvbmZpZ3VyYXRpb24gZ2V0Q29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGNsaWVudENvbmZpZy5nZXRSdW50aW1lKCkuZ2V0Q29uZmlnKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGludGVybmFsIGNsaWVudCBjb25maWd1cmF0aW9uIHN0YXRlLgorICAgICAqCisgICAgICogQHJldHVybiBpbnRlcm5hbCBjbGllbnQgY29uZmlndXJhdGlvbiBzdGF0ZS4KKyAgICAgKi8KKyAgICBDbGllbnRDb25maWcgZ2V0Q2xpZW50Q29uZmlnKCkgeworICAgICAgICByZXR1cm4gY2xpZW50Q29uZmlnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBDb29raWU+IGdldENvb2tpZXMoKSB7CisgICAgICAgIHJldHVybiBzdXBlci5nZXRSZXF1ZXN0Q29va2llcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbWVzc2FnZSBib2R5IHdvcmtlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0LgorICAgICAqCisgICAgICogQHJldHVybiBtZXNzYWdlIGJvZHkgd29ya2Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVzc2FnZUJvZHlXb3JrZXJzIGdldFdvcmtlcnMoKSB7CisgICAgICAgIHJldHVybiB3b3JrZXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbWVzc2FnZSBib2R5IHdvcmtlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHdvcmtlcnMgbWVzc2FnZSBib2R5IHdvcmtlcnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0V29ya2VycyhmaW5hbCBNZXNzYWdlQm9keVdvcmtlcnMgd29ya2VycykgeworICAgICAgICB0aGlzLndvcmtlcnMgPSB3b3JrZXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBuZXcgYWNjZXB0ZWQgdHlwZXMgdG8gdGhlIG1lc3NhZ2UgaGVhZGVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlcyBhY2NlcHRlZCB0eXBlcyB0byBiZSBhZGRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhY2NlcHQoZmluYWwgTWVkaWFUeXBlLi4uIHR5cGVzKSB7CisgICAgICAgIGdldEhlYWRlcnMoKS5hZGRBbGwoSHR0cEhlYWRlcnMuQUNDRVBULCAoT2JqZWN0W10pIHR5cGVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgbmV3IGFjY2VwdGVkIHR5cGVzIHRvIHRoZSBtZXNzYWdlIGhlYWRlcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZXMgYWNjZXB0ZWQgdHlwZXMgdG8gYmUgYWRkZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWNjZXB0KGZpbmFsIFN0cmluZy4uLiB0eXBlcykgeworICAgICAgICBnZXRIZWFkZXJzKCkuYWRkQWxsKEh0dHBIZWFkZXJzLkFDQ0VQVCwgKE9iamVjdFtdKSB0eXBlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIG5ldyBhY2NlcHRlZCBsYW5ndWFnZXMgdG8gdGhlIG1lc3NhZ2UgaGVhZGVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2NhbGVzIGFjY2VwdGVkIGxhbmd1YWdlcyB0byBiZSBhZGRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhY2NlcHRMYW5ndWFnZShmaW5hbCBMb2NhbGUuLi4gbG9jYWxlcykgeworICAgICAgICBnZXRIZWFkZXJzKCkuYWRkQWxsKEh0dHBIZWFkZXJzLkFDQ0VQVF9MQU5HVUFHRSwgKE9iamVjdFtdKSBsb2NhbGVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgbmV3IGFjY2VwdGVkIGxhbmd1YWdlcyB0byB0aGUgbWVzc2FnZSBoZWFkZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIGxvY2FsZXMgYWNjZXB0ZWQgbGFuZ3VhZ2VzIHRvIGJlIGFkZGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFjY2VwdExhbmd1YWdlKGZpbmFsIFN0cmluZy4uLiBsb2NhbGVzKSB7CisgICAgICAgIGdldEhlYWRlcnMoKS5hZGRBbGwoSHR0cEhlYWRlcnMuQUNDRVBUX0xBTkdVQUdFLCAoT2JqZWN0W10pIGxvY2FsZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBuZXcgY29va2llIHRvIHRoZSBtZXNzYWdlIGhlYWRlcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29va2llIGNvb2tpZSB0byBiZSBhZGRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb29raWUoZmluYWwgQ29va2llIGNvb2tpZSkgeworICAgICAgICBnZXRIZWFkZXJzKCkuYWRkKEh0dHBIZWFkZXJzLkNPT0tJRSwgY29va2llKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgbmV3IGNhY2hlIGNvbnRyb2wgZW50cnkgdG8gdGhlIG1lc3NhZ2UgaGVhZGVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYWNoZUNvbnRyb2wgY2FjaGUgY29udHJvbCBlbnRyeSB0byBiZSBhZGRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjYWNoZUNvbnRyb2woZmluYWwgQ2FjaGVDb250cm9sIGNhY2hlQ29udHJvbCkgeworICAgICAgICBnZXRIZWFkZXJzKCkuYWRkKEh0dHBIZWFkZXJzLkNBQ0hFX0NPTlRST0wsIGNhY2hlQ29udHJvbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IG1lc3NhZ2UgZW5jb2RpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW5jb2RpbmcgbWVzc2FnZSBlbmNvZGluZyB0byBiZSBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZW5jb2RpbmcoZmluYWwgU3RyaW5nIGVuY29kaW5nKSB7CisgICAgICAgIGlmIChlbmNvZGluZyA9PSBudWxsKSB7CisgICAgICAgICAgICBnZXRIZWFkZXJzKCkucmVtb3ZlKEh0dHBIZWFkZXJzLkNPTlRFTlRfRU5DT0RJTkcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2V0SGVhZGVycygpLnB1dFNpbmdsZShIdHRwSGVhZGVycy5DT05URU5UX0VOQ09ESU5HLCBlbmNvZGluZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgbWVzc2FnZSBsYW5ndWFnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsYW5ndWFnZSBtZXNzYWdlIGxhbmd1YWdlIHRvIGJlIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBsYW5ndWFnZShmaW5hbCBTdHJpbmcgbGFuZ3VhZ2UpIHsKKyAgICAgICAgaWYgKGxhbmd1YWdlID09IG51bGwpIHsKKyAgICAgICAgICAgIGdldEhlYWRlcnMoKS5yZW1vdmUoSHR0cEhlYWRlcnMuQ09OVEVOVF9MQU5HVUFHRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnZXRIZWFkZXJzKCkucHV0U2luZ2xlKEh0dHBIZWFkZXJzLkNPTlRFTlRfTEFOR1VBR0UsIGxhbmd1YWdlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBtZXNzYWdlIGxhbmd1YWdlLgorICAgICAqCisgICAgICogQHBhcmFtIGxhbmd1YWdlIG1lc3NhZ2UgbGFuZ3VhZ2UgdG8gYmUgc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGxhbmd1YWdlKGZpbmFsIExvY2FsZSBsYW5ndWFnZSkgeworICAgICAgICBpZiAobGFuZ3VhZ2UgPT0gbnVsbCkgeworICAgICAgICAgICAgZ2V0SGVhZGVycygpLnJlbW92ZShIdHRwSGVhZGVycy5DT05URU5UX0xBTkdVQUdFKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdldEhlYWRlcnMoKS5wdXRTaW5nbGUoSHR0cEhlYWRlcnMuQ09OVEVOVF9MQU5HVUFHRSwgbGFuZ3VhZ2UpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IG1lc3NhZ2UgY29udGVudCB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgbWVzc2FnZSBjb250ZW50IHR5cGUgdG8gYmUgc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHR5cGUoZmluYWwgTWVkaWFUeXBlIHR5cGUpIHsKKyAgICAgICAgc2V0TWVkaWFUeXBlKHR5cGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBtZXNzYWdlIGNvbnRlbnQgdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIG1lc3NhZ2UgY29udGVudCB0eXBlIHRvIGJlIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0eXBlKGZpbmFsIFN0cmluZyB0eXBlKSB7CisgICAgICAgIHR5cGUodHlwZSA9PSBudWxsID8gbnVsbCA6IE1lZGlhVHlwZS52YWx1ZU9mKHR5cGUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgbWVzc2FnZSBjb250ZW50IHZhcmlhbnQgKHR5cGUsIGxhbmd1YWdlIGFuZCBlbmNvZGluZykuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFyaWFudCBtZXNzYWdlIGNvbnRlbnQgY29udGVudCB2YXJpYW50ICh0eXBlLCBsYW5ndWFnZSBhbmQgZW5jb2RpbmcpCisgICAgICogICAgICAgICAgICAgICAgdG8gYmUgc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZhcmlhbnQoZmluYWwgVmFyaWFudCB2YXJpYW50KSB7CisgICAgICAgIGlmICh2YXJpYW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIHR5cGUoKE1lZGlhVHlwZSkgbnVsbCk7CisgICAgICAgICAgICBsYW5ndWFnZSgoU3RyaW5nKSBudWxsKTsKKyAgICAgICAgICAgIGVuY29kaW5nKG51bGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHlwZSh2YXJpYW50LmdldE1lZGlhVHlwZSgpKTsKKyAgICAgICAgICAgIGxhbmd1YWdlKHZhcmlhbnQuZ2V0TGFuZ3VhZ2UoKSk7CisgICAgICAgICAgICBlbmNvZGluZyh2YXJpYW50LmdldEVuY29kaW5nKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByZXF1ZXN0IGlzIGNhbGxlZCBhc3luY2hyb25vdXNseSB1c2luZyB7QGxpbmsgamF2YXgud3MucnMuY2xpZW50LkFzeW5jSW52b2tlcn0KKyAgICAgKgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcmVxdWVzdCBpcyBhc3luY2hyb25vdXM7IGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FzeW5jaHJvbm91cygpIHsKKyAgICAgICAgcmV0dXJuIGFzeW5jaHJvbm91czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgcmVxdWVzdCBpcyBjYWxsZWQgYXN5bmNocm9ub3VzbHkgdXNpbmcge0BsaW5rIGphdmF4LndzLnJzLmNsaWVudC5Bc3luY0ludm9rZXJ9LgorICAgICAqCisgICAgICogQHBhcmFtIGFzeW5jIFRydWUgaWYgdGhlIHJlcXVlc3QgaXMgYXN5bmNocm9ub3VzOyBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgdm9pZCBzZXRBc3luY2hyb25vdXMoZmluYWwgYm9vbGVhbiBhc3luYykgeworICAgICAgICBhc3luY2hyb25vdXMgPSBhc3luYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmFibGUgYSBidWZmZXJpbmcgb2Ygc2VyaWFsaXplZCBlbnRpdHkuIFRoZSBidWZmZXJpbmcgd2lsbCBiZSBjb25maWd1cmVkIGZyb20gcnVudGltZSBjb25maWd1cmF0aW9uCisgICAgICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVxdWVzdC4gVGhlIHByb3BlcnR5IGRldGVybWluaW5nIHRoZSBzaXplIG9mIHRoZSBidWZmZXIKKyAgICAgKiBpcyB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuQ29tbW9uUHJvcGVydGllcyNPVVRCT1VORF9DT05URU5UX0xFTkdUSF9CVUZGRVJ9LgorICAgICAqIDxwLz4KKyAgICAgKiBUaGUgYnVmZmVyaW5nIGZ1bmN0aW9uYWxpdHkgaXMgYnkgZGVmYXVsdCBkaXNhYmxlZCBhbmQgY291bGQgYmUgZW5hYmxlZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kLiBJbiB0aGlzIGNhc2UKKyAgICAgKiB0aGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgZmlyc3QgYnl0ZXMgYXJlIHdyaXR0ZW4gdG8gdGhlIHtAbGluayAjZ2V0RW50aXR5U3RyZWFtKCkgZW50aXR5IHN0cmVhbX0uCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBlbmFibGVCdWZmZXJpbmcoKSB7CisgICAgICAgIGVuYWJsZUJ1ZmZlcmluZyhnZXRDb25maWd1cmF0aW9uKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIChzZXJpYWxpemUpIHRoZSBlbnRpdHkgc2V0IGluIHRoaXMgcmVxdWVzdCBpbnRvIHRoZSB7QGxpbmsgI2dldEVudGl0eVN0cmVhbSgpIGVudGl0eSBzdHJlYW19LiBUaGUgbWV0aG9kCisgICAgICogdXNlIHtAbGluayBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3Igd3JpdGVyIGludGVyY2VwdG9yc30gYW5kIHtAbGluayBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXIKKyAgICAgKiBtZXNzYWdlIGJvZHkgd3JpdGVyfS4KKyAgICAgKiA8cC8+CisgICAgICogVGhpcyBtZXRob2QgbW9kaWZpZXMgdGhlIHN0YXRlIG9mIHRoaXMgcmVxdWVzdCBhbmQgdGhlcmVmb3JlIGl0IGNhbiBiZSBjYWxsZWQgb25seSBvbmNlIHBlciByZXF1ZXN0IGxpZmUgY3ljbGUgb3RoZXJ3aXNlCisgICAgICogSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICAgKiA8cC8+CisgICAgICogTm90ZSB0aGF0IHtAbGluayAjc2V0U3RyZWFtUHJvdmlkZXIob3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5PdXRib3VuZE1lc3NhZ2VDb250ZXh0LlN0cmVhbVByb3ZpZGVyKX0KKyAgICAgKiBhbmQgb3B0aW9uYWxseSB7QGxpbmsgI2VuYWJsZUJ1ZmZlcmluZygpfSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyB0aGlzIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gSW4gdGhlIGNhc2Ugb2YgSU8gZXJyb3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGVFbnRpdHkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrU3RhdGUoIWVudGl0eVdyaXR0ZW4sIExvY2FsaXphdGlvbk1lc3NhZ2VzLlJFUVVFU1RfRU5USVRZX0FMUkVBRFlfV1JJVFRFTigpKTsKKyAgICAgICAgZW50aXR5V3JpdHRlbiA9IHRydWU7CisgICAgICAgIGVuc3VyZU1lZGlhVHlwZSgpOworICAgICAgICBmaW5hbCBHZW5lcmljVHlwZTw/PiBlbnRpdHlUeXBlID0gbmV3IEdlbmVyaWNUeXBlKGdldEVudGl0eVR5cGUoKSk7CisgICAgICAgIGRvV3JpdGVFbnRpdHkod29ya2VycywgZW50aXR5VHlwZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkZWQgb25seSB0byBtYWtlIHRoZSBjb2RlIHRlc3RhYmxlLgorICAgICAqCisgICAgICogQHBhcmFtIHdyaXRlV29ya2VycyBNZXNzYWdlIGJvZHkgd29ya2VycyBpbnN0YW5jZSB1c2VkIHRvIHdyaXRlIHRoZSBlbnRpdHkuCisgICAgICogQHBhcmFtIGVudGl0eVR5cGUgICBlbnRpdHkgdHlwZS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIHdoZW4ge0BsaW5rIE1lc3NhZ2VCb2R5V29ya2VycyN3cml0ZVRvKE9iamVjdCwgQ2xhc3MsIFR5cGUsIEFubm90YXRpb25bXSwgTWVkaWFUeXBlLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXAsIFByb3BlcnRpZXNEZWxlZ2F0ZSwgT3V0cHV0U3RyZWFtLCBJdGVyYWJsZSl9IHRocm93cyBhbiB7QGxpbmsgSU9FeGNlcHRpb259LgorICAgICAqICAgICAgICAgICAgICAgICAgICAgVGhpcyBzdGF0ZSBpcyBhbHdheXMgcmVnYXJkZWQgYXMgY29ubmVjdGlvbiBmYWlsdXJlLgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gdm9pZCBkb1dyaXRlRW50aXR5KGZpbmFsIE1lc3NhZ2VCb2R5V29ya2VycyB3cml0ZVdvcmtlcnMsIGZpbmFsIEdlbmVyaWNUeXBlPD8+IGVudGl0eVR5cGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0gPSBudWxsOworICAgICAgICBib29sZWFuIGNvbm5lY3Rpb25GYWlsZWQgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBydW50aW1lRXhjZXB0aW9uID0gZmFsc2U7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGVudGl0eVN0cmVhbSA9IHdyaXRlV29ya2Vycy53cml0ZVRvKAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RW50aXR5KCksCisgICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHlUeXBlLmdldFJhd1R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eVR5cGUuZ2V0VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RW50aXR5QW5ub3RhdGlvbnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldE1lZGlhVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SGVhZGVycygpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UHJvcGVydGllc0RlbGVnYXRlKCksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRFbnRpdHlTdHJlYW0oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlckludGVyY2VwdG9ycyk7CisgICAgICAgICAgICAgICAgc2V0RW50aXR5U3RyZWFtKGVudGl0eVN0cmVhbSk7CisgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gSkVSU0VZLTI3MjggLSB0cmVhdCBTU0xFeGNlcHRpb24gYXMgY29ubmVjdGlvbiBmYWlsdXJlCisgICAgICAgICAgICAgICAgY29ubmVjdGlvbkZhaWxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHJ1bnRpbWVFeGNlcHRpb24gPSB0cnVlOworICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAvLyBpbiBjYXNlIHdlJ3ZlIHNlZW4gdGhlIENvbm5lY3RFeGNlcHRpb24sIHdlIHdvbid0IHRyeSB0byBjbG9zZS9jb21taXQgc3RyZWFtIGFzIHRoaXMgd291bGQgcHJvZHVjZSBqdXN0CisgICAgICAgICAgICAvLyBhbm90aGVyIGluc3RhbmNlIG9mIENvbm5lY3RFeGNlcHRpb24gKHdoaWNoIHdvdWxkIGJlIGxvZ2dlZCBldmVuIGlmIHRoZSBwcmV2aW91c2x5IHRocm93biBvbmUgaXMgcHJvcGFnYXRlZCkKKyAgICAgICAgICAgIC8vIEhvd2V2ZXIsIGlmIGFub3RoZXIgZmFpbHVyZSBvY2N1cnJlZCwgd2Ugc3RpbGwgaGF2ZSB0byB0cnkgdG8gY2xvc2UgYW5kIGNvbW1pdCB0aGUgc3RyZWFtIC0gYW5kIGlmIHdlIGV4cGVyaWVuY2UKKyAgICAgICAgICAgIC8vIGFub3RoZXIgZmFpbHVyZSwgdGhlcmUgaXMgYSB2YWxpZCByZWFzb24gdG8gbG9nIGl0CisgICAgICAgICAgICBpZiAoIWNvbm5lY3Rpb25GYWlsZWQpIHsKKyAgICAgICAgICAgICAgICBpZiAoZW50aXR5U3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eVN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb25VdGlscy5jb25kaXRpb25hbGx5UmVUaHJvdyhlLCAhcnVudGltZUV4Y2VwdGlvbiwgTE9HR0VSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9DTE9TSU5HX09VVFBVVF9TVFJFQU0oKSwgTGV2ZWwuRklORSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uVXRpbHMuY29uZGl0aW9uYWxseVJlVGhyb3coZSwgIXJ1bnRpbWVFeGNlcHRpb24sIExPR0dFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfQ0xPU0lOR19PVVRQVVRfU1RSRUFNKCksIExldmVsLkZJTkUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNvbW1pdFN0cmVhbSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uVXRpbHMuY29uZGl0aW9uYWxseVJlVGhyb3coZSwgIXJ1bnRpbWVFeGNlcHRpb24sIExPR0dFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9DT01NSVRUSU5HX09VVFBVVF9TVFJFQU0oKSwgTGV2ZWwuRklORSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlvblV0aWxzLmNvbmRpdGlvbmFsbHlSZVRocm93KGUsICFydW50aW1lRXhjZXB0aW9uLCBMT0dHRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfQ09NTUlUVElOR19PVVRQVVRfU1RSRUFNKCksIExldmVsLkZJTkUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBlbnN1cmVNZWRpYVR5cGUoKSB7CisgICAgICAgIGlmIChnZXRNZWRpYVR5cGUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBDb250ZW50LVR5cGUgaXMgbm90IHByZXNlbnQgY2hvb3NlIGEgZGVmYXVsdCB0eXBlCisgICAgICAgICAgICBmaW5hbCBHZW5lcmljVHlwZTw/PiBlbnRpdHlUeXBlID0gbmV3IEdlbmVyaWNUeXBlKGdldEVudGl0eVR5cGUoKSk7CisgICAgICAgICAgICBmaW5hbCBMaXN0PE1lZGlhVHlwZT4gbWVkaWFUeXBlcyA9IHdvcmtlcnMuZ2V0TWVzc2FnZUJvZHlXcml0ZXJNZWRpYVR5cGVzKAorICAgICAgICAgICAgICAgICAgICBlbnRpdHlUeXBlLmdldFJhd1R5cGUoKSwgZW50aXR5VHlwZS5nZXRUeXBlKCksIGdldEVudGl0eUFubm90YXRpb25zKCkpOworCisgICAgICAgICAgICBzZXRNZWRpYVR5cGUoZ2V0TWVkaWFUeXBlKG1lZGlhVHlwZXMpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgTWVkaWFUeXBlIGdldE1lZGlhVHlwZShmaW5hbCBMaXN0PE1lZGlhVHlwZT4gbWVkaWFUeXBlcykgeworICAgICAgICBpZiAobWVkaWFUeXBlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBNZWRpYVR5cGUuQVBQTElDQVRJT05fT0NURVRfU1RSRUFNX1RZUEU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlID0gbWVkaWFUeXBlcy5nZXQoMCk7CisgICAgICAgICAgICBpZiAobWVkaWFUeXBlLmlzV2lsZGNhcmRUeXBlKCkgfHwgbWVkaWFUeXBlLmlzV2lsZGNhcmRTdWJ0eXBlKCkpIHsKKyAgICAgICAgICAgICAgICBtZWRpYVR5cGUgPSBNZWRpYVR5cGUuQVBQTElDQVRJT05fT0NURVRfU1RSRUFNX1RZUEU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbWVkaWFUeXBlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdyaXRlciBpbnRlcmNlcHRvcnMgZm9yIHRoaXMgcmVxdWVzdC4KKyAgICAgKiBAcGFyYW0gd3JpdGVySW50ZXJjZXB0b3JzIFdyaXRlciBpbnRlcmNlcHRvcnMgaW4gdGhlIGludGVyY2VwdG9yIGV4ZWN1dGlvbiBvcmRlci4KKyAgICAgKi8KKyAgICB2b2lkIHNldFdyaXRlckludGVyY2VwdG9ycyhmaW5hbCBJdGVyYWJsZTxXcml0ZXJJbnRlcmNlcHRvcj4gd3JpdGVySW50ZXJjZXB0b3JzKSB7CisgICAgICAgIHRoaXMud3JpdGVySW50ZXJjZXB0b3JzID0gd3JpdGVySW50ZXJjZXB0b3JzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB3cml0ZXIgaW50ZXJjZXB0b3JzIG9mIHRoaXMgcmVxdWVzdC4KKyAgICAgKiBAcmV0dXJuIFdyaXRlciBpbnRlcmNlcHRvcnMgaW4gdGhlIGludGVyY2VwdG9yIGV4ZWN1dGlvbiBvcmRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlcmFibGU8V3JpdGVySW50ZXJjZXB0b3I+IGdldFdyaXRlckludGVyY2VwdG9ycygpIHsKKyAgICAgICAgcmV0dXJuIHdyaXRlckludGVyY2VwdG9yczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgcmVhZGVyIGludGVyY2VwdG9ycyBvZiB0aGlzIHJlcXVlc3QuCisgICAgICogQHJldHVybiBSZWFkZXIgaW50ZXJjZXB0b3JzIGluIHRoZSBpbnRlcmNlcHRvciBleGVjdXRpb24gb3JkZXIuCisgICAgICovCisgICAgcHVibGljIEl0ZXJhYmxlPFJlYWRlckludGVyY2VwdG9yPiBnZXRSZWFkZXJJbnRlcmNlcHRvcnMoKSB7CisgICAgICAgIHJldHVybiByZWFkZXJJbnRlcmNlcHRvcnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHJlYWRlciBpbnRlcmNlcHRvcnMgZm9yIHRoaXMgcmVxdWVzdC4KKyAgICAgKiBAcGFyYW0gcmVhZGVySW50ZXJjZXB0b3JzIFJlYWRlciBpbnRlcmNlcHRvcnMgaW4gdGhlIGludGVyY2VwdG9yIGV4ZWN1dGlvbiBvcmRlci4KKyAgICAgKi8KKyAgICB2b2lkIHNldFJlYWRlckludGVyY2VwdG9ycyhmaW5hbCBJdGVyYWJsZTxSZWFkZXJJbnRlcmNlcHRvcj4gcmVhZGVySW50ZXJjZXB0b3JzKSB7CisgICAgICAgIHRoaXMucmVhZGVySW50ZXJjZXB0b3JzID0gcmVhZGVySW50ZXJjZXB0b3JzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJbmplY3Rpb25NYW5hZ2VyIGdldEluamVjdGlvbk1hbmFnZXIoKSB7CisgICAgICAgIHJldHVybiBnZXRDbGllbnRSdW50aW1lKCkuZ2V0SW5qZWN0aW9uTWFuYWdlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBVc2VyLUFnZW50IGhlYWRlciBzaG91bGQgYmUgb21pdHRlZCBpZiBub3QgZGlyZWN0bHkgc2V0IHRvIHRoZSBtYXAgb2YgaGVhZGVycy4KKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBoZWFkZXIgc2hvdWxkIGJlIG9taXR0ZWQsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlnbm9yZVVzZXJBZ2VudCgpIHsKKyAgICAgICAgcmV0dXJuIGlnbm9yZVVzZXJBZ2VudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgVXNlci1BZ2VudCBoZWFkZXIgc2hvdWxkIGJlIG9taXR0ZWQgaWYgbm90IGRpcmVjdGx5IHNldCB0byB0aGUgbWFwIG9mIGhlYWRlcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaWdub3JlIHtAY29kZSB0cnVlfSBpZiB0aGUgaGVhZGVyIHNob3VsZCBiZSBvbWl0dGVkLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpZ25vcmVVc2VyQWdlbnQoZmluYWwgYm9vbGVhbiBpZ25vcmUpIHsKKyAgICAgICAgdGhpcy5pZ25vcmVVc2VyQWdlbnQgPSBpZ25vcmU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvQ2xpZW50UmVzcG9uc2UuamF2YSBiL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0NsaWVudFJlc3BvbnNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMzMDFjMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0NsaWVudFJlc3BvbnNlLmphdmEKQEAgLTAsMCArMSw0MzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50OworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXNwb25zZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkxpbms7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5OZXdDb29raWU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUmVhZGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyU3VwcGxpZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5JbmJvdW5kTWVzc2FnZUNvbnRleHQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5PdXRib3VuZEpheHJzUmVzcG9uc2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5TdGF0dXNlczsKKworLyoqCisgKiBKZXJzZXkgY2xpZW50IHJlc3BvbnNlIGNvbnRleHQuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIENsaWVudFJlc3BvbnNlIGV4dGVuZHMgSW5ib3VuZE1lc3NhZ2VDb250ZXh0IGltcGxlbWVudHMgQ2xpZW50UmVzcG9uc2VDb250ZXh0LCBJbmplY3Rpb25NYW5hZ2VyU3VwcGxpZXIgeworCisgICAgcHJpdmF0ZSBSZXNwb25zZS5TdGF0dXNUeXBlIHN0YXR1czsKKyAgICBwcml2YXRlIGZpbmFsIENsaWVudFJlcXVlc3QgcmVxdWVzdENvbnRleHQ7CisgICAgcHJpdmF0ZSBVUkkgcmVzb2x2ZWRVcmk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IEplcnNleSBjbGllbnQgcmVzcG9uc2UgY29udGV4dCBpbml0aWFsaXplZCBmcm9tIGEgSkFYLVJTIHtAbGluayBSZXNwb25zZSByZXNwb25zZX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdENvbnRleHQgYXNzb2NpYXRlZCByZXF1ZXN0IGNvbnRleHQuCisgICAgICogQHBhcmFtIHJlc3BvbnNlICAgICAgIEpBWC1SUyByZXNwb25zZSB0byBiZSB1c2VkIHRvIGluaXRpYWxpemUgdGhlIHJlc3BvbnNlIGNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIENsaWVudFJlc3BvbnNlKGZpbmFsIENsaWVudFJlcXVlc3QgcmVxdWVzdENvbnRleHQsIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgICAgIHRoaXMocmVzcG9uc2UuZ2V0U3RhdHVzSW5mbygpLCByZXF1ZXN0Q29udGV4dCk7CisgICAgICAgIHRoaXMuaGVhZGVycyhPdXRib3VuZEpheHJzUmVzcG9uc2UuZnJvbShyZXNwb25zZSkuZ2V0Q29udGV4dCgpLmdldFN0cmluZ0hlYWRlcnMoKSk7CisKKyAgICAgICAgZmluYWwgT2JqZWN0IGVudGl0eSA9IHJlc3BvbnNlLmdldEVudGl0eSgpOworICAgICAgICBpZiAoZW50aXR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIElucHV0U3RyZWFtIGVudGl0eVN0cmVhbSA9IG5ldyBJbnB1dFN0cmVhbSgpIHsKKworICAgICAgICAgICAgICAgIHByaXZhdGUgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYnl0ZUFycmF5SW5wdXRTdHJlYW0gPSBudWxsOworCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGVBcnJheUlucHV0U3RyZWFtID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA9IHJlcXVlc3RDb250ZXh0LmdldFdvcmtlcnMoKS53cml0ZVRvKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eSwgZW50aXR5LmdldENsYXNzKCksIG51bGwsIG51bGwsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmdldE1ldGFkYXRhKCksIHJlcXVlc3RDb250ZXh0LmdldFByb3BlcnRpZXNEZWxlZ2F0ZSgpLCBiYW9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLjxXcml0ZXJJbnRlcmNlcHRvcj5lbXB0eUxpc3QoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZUFycmF5SW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBieXRlQXJyYXlJbnB1dFN0cmVhbS5yZWFkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHNldEVudGl0eVN0cmVhbShlbnRpdHlTdHJlYW0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IEplcnNleSBjbGllbnQgcmVzcG9uc2UgY29udGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGF0dXMgICAgICAgICByZXNwb25zZSBzdGF0dXMuCisgICAgICogQHBhcmFtIHJlcXVlc3RDb250ZXh0IGFzc29jaWF0ZWQgY2xpZW50IHJlcXVlc3QgY29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xpZW50UmVzcG9uc2UoUmVzcG9uc2UuU3RhdHVzVHlwZSBzdGF0dXMsIENsaWVudFJlcXVlc3QgcmVxdWVzdENvbnRleHQpIHsKKyAgICAgICAgdGhpcyhzdGF0dXMsIHJlcXVlc3RDb250ZXh0LCByZXF1ZXN0Q29udGV4dC5nZXRVcmkoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IEplcnNleSBjbGllbnQgcmVzcG9uc2UgY29udGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGF0dXMgICAgICAgICAgICAgcmVzcG9uc2Ugc3RhdHVzLgorICAgICAqIEBwYXJhbSByZXF1ZXN0Q29udGV4dCAgICAgYXNzb2NpYXRlZCBjbGllbnQgcmVxdWVzdCBjb250ZXh0LgorICAgICAqIEBwYXJhbSByZXNvbHZlZFJlcXVlc3RVcmkgcmVzb2x2ZWQgcmVxdWVzdCBVUkkgKHNlZSB7QGxpbmsgI2dldFJlc29sdmVkUmVxdWVzdFVyaSgpfSkuCisgICAgICovCisgICAgcHVibGljIENsaWVudFJlc3BvbnNlKFJlc3BvbnNlLlN0YXR1c1R5cGUgc3RhdHVzLCBDbGllbnRSZXF1ZXN0IHJlcXVlc3RDb250ZXh0LCBVUkkgcmVzb2x2ZWRSZXF1ZXN0VXJpKSB7CisgICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzOworICAgICAgICB0aGlzLnJlc29sdmVkVXJpID0gcmVzb2x2ZWRSZXF1ZXN0VXJpOworICAgICAgICB0aGlzLnJlcXVlc3RDb250ZXh0ID0gcmVxdWVzdENvbnRleHQ7CisKKyAgICAgICAgc2V0V29ya2VycyhyZXF1ZXN0Q29udGV4dC5nZXRXb3JrZXJzKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0U3RhdHVzKCkgeworICAgICAgICByZXR1cm4gc3RhdHVzLmdldFN0YXR1c0NvZGUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRTdGF0dXMoaW50IGNvZGUpIHsKKyAgICAgICAgdGhpcy5zdGF0dXMgPSBTdGF0dXNlcy5mcm9tKGNvZGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFN0YXR1c0luZm8oUmVzcG9uc2UuU3RhdHVzVHlwZSBzdGF0dXMpIHsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuQ0xJRU5UX1JFU1BPTlNFX1NUQVRVU19OVUxMKCkpOworICAgICAgICB9CisgICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNwb25zZS5TdGF0dXNUeXBlIGdldFN0YXR1c0luZm8oKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBhYnNvbHV0ZSBVUkkgb2YgdGhlIHVsdGltYXRlIHJlcXVlc3QgbWFkZSB0byByZWNlaXZlIHRoaXMgcmVzcG9uc2UuCisgICAgICogPHA+CisgICAgICogVGhlIHJldHVybmVkIFVSSSBwb2ludHMgdG8gdGhlIHVsdGltYXRlIGxvY2F0aW9uIG9mIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2UgdGhhdAorICAgICAqIHByb3ZpZGVkIHRoZSBkYXRhIHJlcHJlc2VudGVkIGJ5IHRoaXMgcmVzcG9uc2UgaW5zdGFuY2UuIEJlY2F1c2UgSmVyc2V5IGNsaWVudCBjb25uZWN0b3JzCisgICAgICogbWF5IGJlIGNvbmZpZ3VyZWQgdG8ge0BsaW5rIENsaWVudFByb3BlcnRpZXMjRk9MTE9XX1JFRElSRUNUUworICAgICAqIGF1dG9tYXRpY2FsbHkgZm9sbG93IHJlZGlyZWN0IHJlc3BvbnNlc30sIHRoZSB2YWx1ZSBvZiB0aGUgVVJJIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kIG1heQorICAgICAqIGJlIGRpZmZlcmVudCBmcm9tIHRoZSB2YWx1ZSBvZiB0aGUge0BsaW5rIGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0Q29udGV4dCNnZXRVcmkoKQorICAgICAqIG9yaWdpbmFsIHJlcXVlc3QgVVJJfSB0aGF0IGNhbiBiZSByZXRyaWV2ZWQgdXNpbmcge0Bjb2RlIHJlc3BvbnNlLmdldFJlcXVlc3RDb250ZXh0KCkuZ2V0VXJpKCl9CisgICAgICogY2hhaW4gb2YgbWV0aG9kIGNhbGxzLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYWJzb2x1dGUgVVJJIG9mIHRoZSB1bHRpbWF0ZSByZXF1ZXN0IG1hZGUgdG8gcmVjZWl2ZSB0aGlzIHJlc3BvbnNlLgorICAgICAqCisgICAgICogQHNlZSBDbGllbnRQcm9wZXJ0aWVzI0ZPTExPV19SRURJUkVDVFMKKyAgICAgKiBAc2VlICNzZXRSZXNvbHZlZFJlcXVlc3RVcmkoamF2YS5uZXQuVVJJKQorICAgICAqIEBzaW5jZSAyLjYKKyAgICAgKi8KKyAgICBwdWJsaWMgVVJJIGdldFJlc29sdmVkUmVxdWVzdFVyaSgpIHsKKyAgICAgICAgcmV0dXJuIHJlc29sdmVkVXJpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYWJzb2x1dGUgVVJJIG9mIHRoZSB1bHRpbWF0ZSByZXF1ZXN0IHRoYXQgd2FzIG1hZGUgdG8gcmVjZWl2ZSB0aGlzIHJlc3BvbnNlLgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSBvcmlnaW5hbCByZXF1ZXN0IFVSSSBoYXMgYmVlbiBtb2RpZmllZCAoZS5nLiBkdWUgdG8gcmVkaXJlY3Rpb25zKSwgdGhlIGFic29sdXRlIFVSSSBvZgorICAgICAqIHRoZSB1bHRpbWF0ZSByZXF1ZXN0IGJlaW5nIG1hZGUgdG8gcmVjZWl2ZSB0aGUgcmVzcG9uc2Ugc2hvdWxkIGJlIHNldCBieSB0aGUgY2FsbGVyCisgICAgICogb24gdGhlIHJlc3BvbnNlIGluc3RhbmNlIHVzaW5nIHRoaXMgbWV0aG9kLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgYWJzb2x1dGUgVVJJIG9mIHRoZSB1bHRpbWF0ZSByZXF1ZXN0IG1hZGUgdG8gcmVjZWl2ZSB0aGlzIHJlc3BvbnNlLiBNdXN0IG5vdCBiZSB7QGNvZGUgbnVsbH0uCisgICAgICogQHRocm93cyBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24gICAgIGluIGNhc2UgdGhlIHBhc3NlZCB7QGNvZGUgdXJpfSBwYXJhbWV0ZXIgaXMgbnVsbC4KKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW4gY2FzZSB0aGUgcGFzc2VkIHtAY29kZSB1cml9IHBhcmFtZXRlciBkb2VzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCByZXByZXNlbnQgYW4gYWJzb2x1dGUgVVJJLgorICAgICAqIEBzZWUgQ2xpZW50UHJvcGVydGllcyNGT0xMT1dfUkVESVJFQ1RTCisgICAgICogQHNlZSAjZ2V0UmVzb2x2ZWRSZXF1ZXN0VXJpKCkKKyAgICAgKiBAc2luY2UgMi42CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVzb2x2ZWRSZXF1ZXN0VXJpKGZpbmFsIFVSSSB1cmkpIHsKKyAgICAgICAgaWYgKHVyaSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuQ0xJRU5UX1JFU1BPTlNFX1JFU09MVkVEX1VSSV9OVUxMKCkpOworICAgICAgICB9CisgICAgICAgIGlmICghdXJpLmlzQWJzb2x1dGUoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5DTElFTlRfUkVTUE9OU0VfUkVTT0xWRURfVVJJX05PVF9BQlNPTFVURSgpKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnJlc29sdmVkVXJpID0gdXJpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgYXNzb2NpYXRlZCBjbGllbnQgcmVxdWVzdCBjb250ZXh0IHBhaXJlZCB3aXRoIHRoaXMgcmVzcG9uc2UgY29udGV4dC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYXNzb2NpYXRlZCBjbGllbnQgcmVxdWVzdCBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBDbGllbnRSZXF1ZXN0IGdldFJlcXVlc3RDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gcmVxdWVzdENvbnRleHQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1hcDxTdHJpbmcsIE5ld0Nvb2tpZT4gZ2V0Q29va2llcygpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmdldFJlc3BvbnNlQ29va2llcygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8TGluaz4gZ2V0TGlua3MoKSB7CisgICAgICAgIHJldHVybiBzdXBlci5nZXRMaW5rcygpCisgICAgICAgICAgICAgICAgICAgIC5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAubWFwKGxpbmsgLT4geworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxpbmsuZ2V0VXJpKCkuaXNBYnNvbHV0ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpbms7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBMaW5rLmZyb21MaW5rKGxpbmspLmJhc2VVcmkoZ2V0UmVzb2x2ZWRSZXF1ZXN0VXJpKCkpLmJ1aWxkKCk7CisgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJDbGllbnRSZXNwb25zZXsiCisgICAgICAgICAgICAgICArICJtZXRob2Q9IiArIHJlcXVlc3RDb250ZXh0LmdldE1ldGhvZCgpCisgICAgICAgICAgICAgICArICIsIHVyaT0iICsgcmVxdWVzdENvbnRleHQuZ2V0VXJpKCkKKyAgICAgICAgICAgICAgICsgIiwgc3RhdHVzPSIgKyBzdGF0dXMuZ2V0U3RhdHVzQ29kZSgpCisgICAgICAgICAgICAgICArICIsIHJlYXNvbj0iICsgc3RhdHVzLmdldFJlYXNvblBocmFzZSgpCisgICAgICAgICAgICAgICArICJ9IjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG1lc3NhZ2UgZW50aXR5IEphdmEgaW5zdGFuY2UuIFJldHVybnMge0Bjb2RlIG51bGx9IGlmIHRoZSBtZXNzYWdlCisgICAgICogZG9lcyBub3QgY29udGFpbiBhbiBlbnRpdHkgYm9keS4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgZW50aXR5IGlzIHJlcHJlc2VudGVkIGJ5IGFuIHVuLWNvbnN1bWVkIHtAbGluayBJbnB1dFN0cmVhbSBpbnB1dCBzdHJlYW19CisgICAgICogdGhlIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgaW5wdXQgc3RyZWFtLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG1lc3NhZ2UgZW50aXR5IG9yIHtAY29kZSBudWxsfSBpZiBtZXNzYWdlIGRvZXMgbm90IGNvbnRhaW4gYW4KKyAgICAgKiAgICAgICAgIGVudGl0eSBib2R5IChpLmUuIHdoZW4ge0BsaW5rICNoYXNFbnRpdHkoKX0gcmV0dXJucyB7QGNvZGUgZmFsc2V9KS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgZW50aXR5IHdhcyBwcmV2aW91c2x5IGZ1bGx5IGNvbnN1bWVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgYW4ge0BsaW5rIElucHV0U3RyZWFtIGlucHV0IHN0cmVhbX0sIG9yCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGhlIHJlc3BvbnNlIGhhcyBiZWVuIHtAbGluayAjY2xvc2UoKSBjbG9zZWR9LgorICAgICAqIEBzZWUgamF2YXgud3MucnMuY29yZS5SZXNwb25zZSNnZXRFbnRpdHkoKQorICAgICAqIEBzaW5jZSAyLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldEVudGl0eSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgICAgICAvLyBUT0RPIGltcGxlbWVudCBzb21lIGFkdmFuY2VkIGNhY2hpbmcgc3VwcG9ydD8KKyAgICAgICAgcmV0dXJuIGdldEVudGl0eVN0cmVhbSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgdGhlIG1lc3NhZ2UgZW50aXR5IGlucHV0IHN0cmVhbSBhcyBhbiBpbnN0YW5jZSBvZiBzcGVjaWZpZWQgSmF2YSB0eXBlCisgICAgICogdXNpbmcgYSB7QGxpbmsgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyfSB0aGF0IHN1cHBvcnRzIG1hcHBpbmcgdGhlCisgICAgICogbWVzc2FnZSBlbnRpdHkgc3RyZWFtIG9udG8gdGhlIHJlcXVlc3RlZCB0eXBlLgorICAgICAqIDxwPgorICAgICAqIE1ldGhvZCB0aHJvd3MgYW4ge0BsaW5rIFByb2Nlc3NpbmdFeGNlcHRpb259IGlmIHRoZSBjb250ZW50IG9mIHRoZQorICAgICAqIG1lc3NhZ2UgY2Fubm90IGJlIG1hcHBlZCB0byBhbiBlbnRpdHkgb2YgdGhlIHJlcXVlc3RlZCB0eXBlIGFuZAorICAgICAqIHtAbGluayBJbGxlZ2FsU3RhdGVFeGNlcHRpb259IGluIGNhc2UgdGhlIGVudGl0eSBpcyBub3QgYmFja2VkIGJ5IGFuIGlucHV0CisgICAgICogc3RyZWFtIG9yIGlmIHRoZSBvcmlnaW5hbCBlbnRpdHkgaW5wdXQgc3RyZWFtIGhhcyBhbHJlYWR5IGJlZW4gY29uc3VtZWQKKyAgICAgKiB3aXRob3V0IHtAbGluayAjYnVmZmVyRW50aXR5KCkgYnVmZmVyaW5nfSB0aGUgZW50aXR5IGRhdGEgcHJpb3IgY29uc3VtaW5nLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBBIG1lc3NhZ2UgaW5zdGFuY2UgcmV0dXJuZWQgZnJvbSB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhY2hlZCBmb3IKKyAgICAgKiBzdWJzZXF1ZW50IHJldHJpZXZhbHMgdmlhIHtAbGluayAjZ2V0RW50aXR5KCl9LiBVbmxlc3MgdGhlIHN1cHBsaWVkIGVudGl0eQorICAgICAqIHR5cGUgaXMgYW4ge0BsaW5rIGphdmEuaW8uSW5wdXRTdHJlYW0gaW5wdXQgc3RyZWFtfSwgdGhpcyBtZXRob2QgYXV0b21hdGljYWxseQorICAgICAqIHtAbGluayAjY2xvc2UoKSBjbG9zZXN9IHRoZSBhbiB1bmNvbnN1bWVkIG9yaWdpbmFsIHJlc3BvbnNlIGVudGl0eSBkYXRhIHN0cmVhbQorICAgICAqIGlmIG9wZW4uIEluIGNhc2UgdGhlIGVudGl0eSBkYXRhIGhhcyBiZWVuIGJ1ZmZlcmVkLCB0aGUgYnVmZmVyIHdpbGwgYmUgcmVzZXQKKyAgICAgKiBwcmlvciBjb25zdW1pbmcgdGhlIGJ1ZmZlcmVkIGRhdGEgdG8gZW5hYmxlIHN1YnNlcXVlbnQgaW52b2NhdGlvbnMgb2YKKyAgICAgKiB7QGNvZGUgcmVhZEVudGl0eSguLi4pfSBtZXRob2RzIG9uIHRoaXMgcmVzcG9uc2UuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIDxUPiAgICAgICAgZW50aXR5IGluc3RhbmNlIEphdmEgdHlwZS4KKyAgICAgKiBAcGFyYW0gZW50aXR5VHlwZSB0aGUgdHlwZSBvZiBlbnRpdHkuCisgICAgICogQHJldHVybiB0aGUgbWVzc2FnZSBlbnRpdHk7IGZvciBhIHplcm8tbGVuZ3RoIHJlc3BvbnNlIGVudGl0aWVzIHJldHVybnMgYSBjb3JyZXNwb25kaW5nCisgICAgICogICAgICAgICBKYXZhIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgemVyby1sZW5ndGggZGF0YS4gSW4gY2FzZSBubyB6ZXJvLWxlbmd0aCByZXByZXNlbnRhdGlvbgorICAgICAqICAgICAgICAgaXMgZGVmaW5lZCBmb3IgdGhlIEphdmEgdHlwZSwgYSB7QGxpbmsgUHJvY2Vzc2luZ0V4Y2VwdGlvbn0gd3JhcHBpbmcgdGhlCisgICAgICogICAgICAgICB1bmRlcmx5aW5nIHtAbGluayBqYXZheC53cy5ycy5jb3JlLk5vQ29udGVudEV4Y2VwdGlvbn0gaXMgdGhyb3duLgorICAgICAqIEB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiAgIGlmIHRoZSBjb250ZW50IG9mIHRoZSBtZXNzYWdlIGNhbm5vdCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZCB0byBhbiBlbnRpdHkgb2YgdGhlIHJlcXVlc3RlZCB0eXBlLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBlbnRpdHkgaXMgbm90IGJhY2tlZCBieSBhbiBpbnB1dCBzdHJlYW0sCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJlc3BvbnNlIGhhcyBiZWVuIHtAbGluayAjY2xvc2UoKSBjbG9zZWR9IGFscmVhZHksCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaWYgdGhlIGVudGl0eSBpbnB1dCBzdHJlYW0gaGFzIGJlZW4gZnVsbHkgY29uc3VtZWQgYWxyZWFkeSBhbmQgaGFzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGJlZW4gYnVmZmVyZWQgcHJpb3IgY29uc3VtaW5nLgorICAgICAqIEBzZWUgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyCisgICAgICogQHNlZSBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlI3JlYWRFbnRpdHkoQ2xhc3MpCisgICAgICogQHNpbmNlIDIuNQorICAgICAqLworICAgIHB1YmxpYyA8VD4gVCByZWFkRW50aXR5KENsYXNzPFQ+IGVudGl0eVR5cGUpIHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uLCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgICAgICByZXR1cm4gcmVhZEVudGl0eShlbnRpdHlUeXBlLCByZXF1ZXN0Q29udGV4dC5nZXRQcm9wZXJ0aWVzRGVsZWdhdGUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCB0aGUgbWVzc2FnZSBlbnRpdHkgaW5wdXQgc3RyZWFtIGFzIGFuIGluc3RhbmNlIG9mIHNwZWNpZmllZCBKYXZhIHR5cGUKKyAgICAgKiB1c2luZyBhIHtAbGluayBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXJ9IHRoYXQgc3VwcG9ydHMgbWFwcGluZyB0aGUKKyAgICAgKiBtZXNzYWdlIGVudGl0eSBzdHJlYW0gb250byB0aGUgcmVxdWVzdGVkIHR5cGUuCisgICAgICogPHA+CisgICAgICogTWV0aG9kIHRocm93cyBhbiB7QGxpbmsgUHJvY2Vzc2luZ0V4Y2VwdGlvbn0gaWYgdGhlIGNvbnRlbnQgb2YgdGhlCisgICAgICogbWVzc2FnZSBjYW5ub3QgYmUgbWFwcGVkIHRvIGFuIGVudGl0eSBvZiB0aGUgcmVxdWVzdGVkIHR5cGUgYW5kCisgICAgICoge0BsaW5rIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbn0gaW4gY2FzZSB0aGUgZW50aXR5IGlzIG5vdCBiYWNrZWQgYnkgYW4gaW5wdXQKKyAgICAgKiBzdHJlYW0gb3IgaWYgdGhlIG9yaWdpbmFsIGVudGl0eSBpbnB1dCBzdHJlYW0gaGFzIGFscmVhZHkgYmVlbiBjb25zdW1lZAorICAgICAqIHdpdGhvdXQge0BsaW5rICNidWZmZXJFbnRpdHkoKSBidWZmZXJpbmd9IHRoZSBlbnRpdHkgZGF0YSBwcmlvciBjb25zdW1pbmcuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIEEgbWVzc2FnZSBpbnN0YW5jZSByZXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FjaGVkIGZvcgorICAgICAqIHN1YnNlcXVlbnQgcmV0cmlldmFscyB2aWEge0BsaW5rICNnZXRFbnRpdHkoKX0uIFVubGVzcyB0aGUgc3VwcGxpZWQgZW50aXR5CisgICAgICogdHlwZSBpcyBhbiB7QGxpbmsgamF2YS5pby5JbnB1dFN0cmVhbSBpbnB1dCBzdHJlYW19LCB0aGlzIG1ldGhvZCBhdXRvbWF0aWNhbGx5CisgICAgICoge0BsaW5rICNjbG9zZSgpIGNsb3Nlc30gdGhlIGFuIHVuY29uc3VtZWQgb3JpZ2luYWwgcmVzcG9uc2UgZW50aXR5IGRhdGEgc3RyZWFtCisgICAgICogaWYgb3Blbi4gSW4gY2FzZSB0aGUgZW50aXR5IGRhdGEgaGFzIGJlZW4gYnVmZmVyZWQsIHRoZSBidWZmZXIgd2lsbCBiZSByZXNldAorICAgICAqIHByaW9yIGNvbnN1bWluZyB0aGUgYnVmZmVyZWQgZGF0YSB0byBlbmFibGUgc3Vic2VxdWVudCBpbnZvY2F0aW9ucyBvZgorICAgICAqIHtAY29kZSByZWFkRW50aXR5KC4uLil9IG1ldGhvZHMgb24gdGhpcyByZXNwb25zZS4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gPFQ+ICAgICAgICBlbnRpdHkgaW5zdGFuY2UgSmF2YSB0eXBlLgorICAgICAqIEBwYXJhbSBlbnRpdHlUeXBlIHRoZSB0eXBlIG9mIGVudGl0eTsgbWF5IGJlIGdlbmVyaWMuCisgICAgICogQHJldHVybiB0aGUgbWVzc2FnZSBlbnRpdHk7IGZvciBhIHplcm8tbGVuZ3RoIHJlc3BvbnNlIGVudGl0aWVzIHJldHVybnMgYSBjb3JyZXNwb25kaW5nCisgICAgICogICAgICAgICBKYXZhIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgemVyby1sZW5ndGggZGF0YS4gSW4gY2FzZSBubyB6ZXJvLWxlbmd0aCByZXByZXNlbnRhdGlvbgorICAgICAqICAgICAgICAgaXMgZGVmaW5lZCBmb3IgdGhlIEphdmEgdHlwZSwgYSB7QGxpbmsgUHJvY2Vzc2luZ0V4Y2VwdGlvbn0gd3JhcHBpbmcgdGhlCisgICAgICogICAgICAgICB1bmRlcmx5aW5nIHtAbGluayBqYXZheC53cy5ycy5jb3JlLk5vQ29udGVudEV4Y2VwdGlvbn0gaXMgdGhyb3duLgorICAgICAqIEB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiAgIGlmIHRoZSBjb250ZW50IG9mIHRoZSBtZXNzYWdlIGNhbm5vdCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZCB0byBhbiBlbnRpdHkgb2YgdGhlIHJlcXVlc3RlZCB0eXBlLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBlbnRpdHkgaXMgbm90IGJhY2tlZCBieSBhbiBpbnB1dCBzdHJlYW0sCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJlc3BvbnNlIGhhcyBiZWVuIHtAbGluayAjY2xvc2UoKSBjbG9zZWR9IGFscmVhZHksCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaWYgdGhlIGVudGl0eSBpbnB1dCBzdHJlYW0gaGFzIGJlZW4gZnVsbHkgY29uc3VtZWQgYWxyZWFkeSBhbmQgaGFzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGJlZW4gYnVmZmVyZWQgcHJpb3IgY29uc3VtaW5nLgorICAgICAqIEBzZWUgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyCisgICAgICogQHNlZSBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlI3JlYWRFbnRpdHkoamF2YXgud3MucnMuY29yZS5HZW5lcmljVHlwZSkKKyAgICAgKiBAc2luY2UgMi41CisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIDxUPiBUIHJlYWRFbnRpdHkoR2VuZXJpY1R5cGU8VD4gZW50aXR5VHlwZSkgdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24sIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiAoVCkgcmVhZEVudGl0eShlbnRpdHlUeXBlLmdldFJhd1R5cGUoKSwgZW50aXR5VHlwZS5nZXRUeXBlKCksIHJlcXVlc3RDb250ZXh0LmdldFByb3BlcnRpZXNEZWxlZ2F0ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIHRoZSBtZXNzYWdlIGVudGl0eSBpbnB1dCBzdHJlYW0gYXMgYW4gaW5zdGFuY2Ugb2Ygc3BlY2lmaWVkIEphdmEgdHlwZQorICAgICAqIHVzaW5nIGEge0BsaW5rIGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcn0gdGhhdCBzdXBwb3J0cyBtYXBwaW5nIHRoZQorICAgICAqIG1lc3NhZ2UgZW50aXR5IHN0cmVhbSBvbnRvIHRoZSByZXF1ZXN0ZWQgdHlwZS4KKyAgICAgKiA8cD4KKyAgICAgKiBNZXRob2QgdGhyb3dzIGFuIHtAbGluayBQcm9jZXNzaW5nRXhjZXB0aW9ufSBpZiB0aGUgY29udGVudCBvZiB0aGUKKyAgICAgKiBtZXNzYWdlIGNhbm5vdCBiZSBtYXBwZWQgdG8gYW4gZW50aXR5IG9mIHRoZSByZXF1ZXN0ZWQgdHlwZSBhbmQKKyAgICAgKiB7QGxpbmsgSWxsZWdhbFN0YXRlRXhjZXB0aW9ufSBpbiBjYXNlIHRoZSBlbnRpdHkgaXMgbm90IGJhY2tlZCBieSBhbiBpbnB1dAorICAgICAqIHN0cmVhbSBvciBpZiB0aGUgb3JpZ2luYWwgZW50aXR5IGlucHV0IHN0cmVhbSBoYXMgYWxyZWFkeSBiZWVuIGNvbnN1bWVkCisgICAgICogd2l0aG91dCB7QGxpbmsgI2J1ZmZlckVudGl0eSgpIGJ1ZmZlcmluZ30gdGhlIGVudGl0eSBkYXRhIHByaW9yIGNvbnN1bWluZy4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogQSBtZXNzYWdlIGluc3RhbmNlIHJldHVybmVkIGZyb20gdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWNoZWQgZm9yCisgICAgICogc3Vic2VxdWVudCByZXRyaWV2YWxzIHZpYSB7QGxpbmsgI2dldEVudGl0eSgpfS4gVW5sZXNzIHRoZSBzdXBwbGllZCBlbnRpdHkKKyAgICAgKiB0eXBlIGlzIGFuIHtAbGluayBqYXZhLmlvLklucHV0U3RyZWFtIGlucHV0IHN0cmVhbX0sIHRoaXMgbWV0aG9kIGF1dG9tYXRpY2FsbHkKKyAgICAgKiB7QGxpbmsgI2Nsb3NlKCkgY2xvc2VzfSB0aGUgYW4gdW5jb25zdW1lZCBvcmlnaW5hbCByZXNwb25zZSBlbnRpdHkgZGF0YSBzdHJlYW0KKyAgICAgKiBpZiBvcGVuLiBJbiBjYXNlIHRoZSBlbnRpdHkgZGF0YSBoYXMgYmVlbiBidWZmZXJlZCwgdGhlIGJ1ZmZlciB3aWxsIGJlIHJlc2V0CisgICAgICogcHJpb3IgY29uc3VtaW5nIHRoZSBidWZmZXJlZCBkYXRhIHRvIGVuYWJsZSBzdWJzZXF1ZW50IGludm9jYXRpb25zIG9mCisgICAgICoge0Bjb2RlIHJlYWRFbnRpdHkoLi4uKX0gbWV0aG9kcyBvbiB0aGlzIHJlc3BvbnNlLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSA8VD4gICAgICAgICBlbnRpdHkgaW5zdGFuY2UgSmF2YSB0eXBlLgorICAgICAqIEBwYXJhbSBlbnRpdHlUeXBlICB0aGUgdHlwZSBvZiBlbnRpdHkuCisgICAgICogQHBhcmFtIGFubm90YXRpb25zIGFubm90YXRpb25zIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIHtAbGluayBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXJ9LgorICAgICAqIEByZXR1cm4gdGhlIG1lc3NhZ2UgZW50aXR5OyBmb3IgYSB6ZXJvLWxlbmd0aCByZXNwb25zZSBlbnRpdGllcyByZXR1cm5zIGEgY29ycmVzcG9uZGluZworICAgICAqICAgICAgICAgSmF2YSBvYmplY3QgdGhhdCByZXByZXNlbnRzIHplcm8tbGVuZ3RoIGRhdGEuIEluIGNhc2Ugbm8gemVyby1sZW5ndGggcmVwcmVzZW50YXRpb24KKyAgICAgKiAgICAgICAgIGlzIGRlZmluZWQgZm9yIHRoZSBKYXZhIHR5cGUsIGEge0BsaW5rIFByb2Nlc3NpbmdFeGNlcHRpb259IHdyYXBwaW5nIHRoZQorICAgICAqICAgICAgICAgdW5kZXJseWluZyB7QGxpbmsgamF2YXgud3MucnMuY29yZS5Ob0NvbnRlbnRFeGNlcHRpb259IGlzIHRocm93bi4KKyAgICAgKiBAdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24gICBpZiB0aGUgY29udGVudCBvZiB0aGUgbWVzc2FnZSBjYW5ub3QgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZWQgdG8gYW4gZW50aXR5IG9mIHRoZSByZXF1ZXN0ZWQgdHlwZS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgZW50aXR5IGlzIG5vdCBiYWNrZWQgYnkgYW4gaW5wdXQgc3RyZWFtLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSByZXNwb25zZSBoYXMgYmVlbiB7QGxpbmsgI2Nsb3NlKCkgY2xvc2VkfSBhbHJlYWR5LAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGlmIHRoZSBlbnRpdHkgaW5wdXQgc3RyZWFtIGhhcyBiZWVuIGZ1bGx5IGNvbnN1bWVkIGFscmVhZHkgYW5kIGhhcworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBiZWVuIGJ1ZmZlcmVkIHByaW9yIGNvbnN1bWluZy4KKyAgICAgKiBAc2VlIGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcgorICAgICAqIEBzZWUgamF2YXgud3MucnMuY29yZS5SZXNwb25zZSNyZWFkRW50aXR5KENsYXNzLCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uW10pCisgICAgICogQHNpbmNlIDIuNQorICAgICAqLworICAgIHB1YmxpYyA8VD4gVCByZWFkRW50aXR5KENsYXNzPFQ+IGVudGl0eVR5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucykgdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24sIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiByZWFkRW50aXR5KGVudGl0eVR5cGUsIGFubm90YXRpb25zLCByZXF1ZXN0Q29udGV4dC5nZXRQcm9wZXJ0aWVzRGVsZWdhdGUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCB0aGUgbWVzc2FnZSBlbnRpdHkgaW5wdXQgc3RyZWFtIGFzIGFuIGluc3RhbmNlIG9mIHNwZWNpZmllZCBKYXZhIHR5cGUKKyAgICAgKiB1c2luZyBhIHtAbGluayBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXJ9IHRoYXQgc3VwcG9ydHMgbWFwcGluZyB0aGUKKyAgICAgKiBtZXNzYWdlIGVudGl0eSBzdHJlYW0gb250byB0aGUgcmVxdWVzdGVkIHR5cGUuCisgICAgICogPHA+CisgICAgICogTWV0aG9kIHRocm93cyBhbiB7QGxpbmsgUHJvY2Vzc2luZ0V4Y2VwdGlvbn0gaWYgdGhlIGNvbnRlbnQgb2YgdGhlCisgICAgICogbWVzc2FnZSBjYW5ub3QgYmUgbWFwcGVkIHRvIGFuIGVudGl0eSBvZiB0aGUgcmVxdWVzdGVkIHR5cGUgYW5kCisgICAgICoge0BsaW5rIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbn0gaW4gY2FzZSB0aGUgZW50aXR5IGlzIG5vdCBiYWNrZWQgYnkgYW4gaW5wdXQKKyAgICAgKiBzdHJlYW0gb3IgaWYgdGhlIG9yaWdpbmFsIGVudGl0eSBpbnB1dCBzdHJlYW0gaGFzIGFscmVhZHkgYmVlbiBjb25zdW1lZAorICAgICAqIHdpdGhvdXQge0BsaW5rICNidWZmZXJFbnRpdHkoKSBidWZmZXJpbmd9IHRoZSBlbnRpdHkgZGF0YSBwcmlvciBjb25zdW1pbmcuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIEEgbWVzc2FnZSBpbnN0YW5jZSByZXR1cm5lZCBmcm9tIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FjaGVkIGZvcgorICAgICAqIHN1YnNlcXVlbnQgcmV0cmlldmFscyB2aWEge0BsaW5rICNnZXRFbnRpdHkoKX0uIFVubGVzcyB0aGUgc3VwcGxpZWQgZW50aXR5CisgICAgICogdHlwZSBpcyBhbiB7QGxpbmsgamF2YS5pby5JbnB1dFN0cmVhbSBpbnB1dCBzdHJlYW19LCB0aGlzIG1ldGhvZCBhdXRvbWF0aWNhbGx5CisgICAgICoge0BsaW5rICNjbG9zZSgpIGNsb3Nlc30gdGhlIGFuIHVuY29uc3VtZWQgb3JpZ2luYWwgcmVzcG9uc2UgZW50aXR5IGRhdGEgc3RyZWFtCisgICAgICogaWYgb3Blbi4gSW4gY2FzZSB0aGUgZW50aXR5IGRhdGEgaGFzIGJlZW4gYnVmZmVyZWQsIHRoZSBidWZmZXIgd2lsbCBiZSByZXNldAorICAgICAqIHByaW9yIGNvbnN1bWluZyB0aGUgYnVmZmVyZWQgZGF0YSB0byBlbmFibGUgc3Vic2VxdWVudCBpbnZvY2F0aW9ucyBvZgorICAgICAqIHtAY29kZSByZWFkRW50aXR5KC4uLil9IG1ldGhvZHMgb24gdGhpcyByZXNwb25zZS4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gPFQ+ICAgICAgICAgZW50aXR5IGluc3RhbmNlIEphdmEgdHlwZS4KKyAgICAgKiBAcGFyYW0gZW50aXR5VHlwZSAgdGhlIHR5cGUgb2YgZW50aXR5OyBtYXkgYmUgZ2VuZXJpYy4KKyAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbnMgYW5ub3RhdGlvbnMgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUge0BsaW5rIGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcn0uCisgICAgICogQHJldHVybiB0aGUgbWVzc2FnZSBlbnRpdHk7IGZvciBhIHplcm8tbGVuZ3RoIHJlc3BvbnNlIGVudGl0aWVzIHJldHVybnMgYSBjb3JyZXNwb25kaW5nCisgICAgICogICAgICAgICBKYXZhIG9iamVjdCB0aGF0IHJlcHJlc2VudHMgemVyby1sZW5ndGggZGF0YS4gSW4gY2FzZSBubyB6ZXJvLWxlbmd0aCByZXByZXNlbnRhdGlvbgorICAgICAqICAgICAgICAgaXMgZGVmaW5lZCBmb3IgdGhlIEphdmEgdHlwZSwgYSB7QGxpbmsgUHJvY2Vzc2luZ0V4Y2VwdGlvbn0gd3JhcHBpbmcgdGhlCisgICAgICogICAgICAgICB1bmRlcmx5aW5nIHtAbGluayBqYXZheC53cy5ycy5jb3JlLk5vQ29udGVudEV4Y2VwdGlvbn0gaXMgdGhyb3duLgorICAgICAqIEB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiAgIGlmIHRoZSBjb250ZW50IG9mIHRoZSBtZXNzYWdlIGNhbm5vdCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZCB0byBhbiBlbnRpdHkgb2YgdGhlIHJlcXVlc3RlZCB0eXBlLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBlbnRpdHkgaXMgbm90IGJhY2tlZCBieSBhbiBpbnB1dCBzdHJlYW0sCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJlc3BvbnNlIGhhcyBiZWVuIHtAbGluayAjY2xvc2UoKSBjbG9zZWR9IGFscmVhZHksCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaWYgdGhlIGVudGl0eSBpbnB1dCBzdHJlYW0gaGFzIGJlZW4gZnVsbHkgY29uc3VtZWQgYWxyZWFkeSBhbmQgaGFzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGJlZW4gYnVmZmVyZWQgcHJpb3IgY29uc3VtaW5nLgorICAgICAqIEBzZWUgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyCisgICAgICogQHNlZSBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlI3JlYWRFbnRpdHkoamF2YXgud3MucnMuY29yZS5HZW5lcmljVHlwZSwgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbltdKQorICAgICAqIEBzaW5jZSAyLjUKKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgPFQ+IFQgcmVhZEVudGl0eShHZW5lcmljVHlwZTxUPiBlbnRpdHlUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMpCisgICAgICAgICAgICB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIChUKSByZWFkRW50aXR5KGVudGl0eVR5cGUuZ2V0UmF3VHlwZSgpLCBlbnRpdHlUeXBlLmdldFR5cGUoKSwgYW5ub3RhdGlvbnMsIHJlcXVlc3RDb250ZXh0LmdldFByb3BlcnRpZXNEZWxlZ2F0ZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSW5qZWN0aW9uTWFuYWdlciBnZXRJbmplY3Rpb25NYW5hZ2VyKCkgeworICAgICAgICByZXR1cm4gZ2V0UmVxdWVzdENvbnRleHQoKS5nZXRJbmplY3Rpb25NYW5hZ2VyKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEl0ZXJhYmxlPFJlYWRlckludGVyY2VwdG9yPiBnZXRSZWFkZXJJbnRlcmNlcHRvcnMoKSB7CisgICAgICAgIHJldHVybiByZXF1ZXN0Q29udGV4dC5nZXRSZWFkZXJJbnRlcmNlcHRvcnMoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9DbGllbnRSdW50aW1lLmphdmEgYi9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9DbGllbnRSdW50aW1lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQwZGE3NwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0NsaWVudFJ1bnRpbWUuamF2YQpAQCAtMCwwICsxLDM1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRFeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnNwaS5Bc3luY0Nvbm5lY3RvckNhbGxiYWNrOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5zcGkuQ29ubmVjdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkJvb3RzdHJhcEJhZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5WZXJzaW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5Qcm92aWRlcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLkxhenlWYWx1ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uUmVmOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5WYWx1ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uVmFsdWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuTWVzc2FnZUJvZHlXb3JrZXJzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1vZGVsLmludGVybmFsLk1hbmFnZWRPYmplY3RzRmluYWxpemVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWwuQ2hhaW5hYmxlU3RhZ2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5pbnRlcm5hbC5SZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLmludGVybmFsLlJlcXVlc3RTY29wZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLmludGVybmFsLlN0YWdlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWwuU3RhZ2VzOworCisvKioKKyAqIENsaWVudC1zaWRlIHJlcXVlc3QgcHJvY2Vzc2luZyBydW50aW1lLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK2NsYXNzIENsaWVudFJ1bnRpbWUgaW1wbGVtZW50cyBKZXJzZXlDbGllbnQuU2h1dGRvd25Ib29rLCBDbGllbnRFeGVjdXRvciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihDbGllbnRSdW50aW1lLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBwcml2YXRlIGZpbmFsIFN0YWdlPENsaWVudFJlcXVlc3Q+IHJlcXVlc3RQcm9jZXNzaW5nUm9vdDsKKyAgICBwcml2YXRlIGZpbmFsIFN0YWdlPENsaWVudFJlc3BvbnNlPiByZXNwb25zZVByb2Nlc3NpbmdSb290OworCisgICAgcHJpdmF0ZSBmaW5hbCBDb25uZWN0b3IgY29ubmVjdG9yOworICAgIHByaXZhdGUgZmluYWwgQ2xpZW50Q29uZmlnIGNvbmZpZzsKKworICAgIHByaXZhdGUgZmluYWwgUmVxdWVzdFNjb3BlIHJlcXVlc3RTY29wZTsKKyAgICBwcml2YXRlIGZpbmFsIExhenlWYWx1ZTxFeGVjdXRvclNlcnZpY2U+IGFzeW5jUmVxdWVzdEV4ZWN1dG9yOworICAgIHByaXZhdGUgZmluYWwgTGF6eVZhbHVlPFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZT4gYmFja2dyb3VuZFNjaGVkdWxlcjsKKworICAgIHByaXZhdGUgZmluYWwgSXRlcmFibGU8Q2xpZW50TGlmZWN5Y2xlTGlzdGVuZXI+IGxpZmVjeWNsZUxpc3RlbmVyczsKKworICAgIHByaXZhdGUgZmluYWwgQXRvbWljQm9vbGVhbiBjbG9zZWQgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CisgICAgcHJpdmF0ZSBmaW5hbCBNYW5hZ2VkT2JqZWN0c0ZpbmFsaXplciBtYW5hZ2VkT2JqZWN0c0ZpbmFsaXplcjsKKyAgICBwcml2YXRlIGZpbmFsIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlcjsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgY2xpZW50IHJlcXVlc3QgcHJvY2Vzc2luZyBydW50aW1lLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZyAgICAgICAgICAgY2xpZW50IHJ1bnRpbWUgY29uZmlndXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gY29ubmVjdG9yICAgICAgICBjbGllbnQgdHJhbnNwb3J0IGNvbm5lY3Rvci4KKyAgICAgKiBAcGFyYW0gaW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb24gbWFuYWdlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xpZW50UnVudGltZShmaW5hbCBDbGllbnRDb25maWcgY29uZmlnLCBmaW5hbCBDb25uZWN0b3IgY29ubmVjdG9yLCBmaW5hbCBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIsCisgICAgICAgICAgICBmaW5hbCBCb290c3RyYXBCYWcgYm9vdHN0cmFwQmFnKSB7CisgICAgICAgIFByb3ZpZGVyPFJlZjxDbGllbnRSZXF1ZXN0Pj4gY2xpZW50UmVxdWVzdCA9CisgICAgICAgICAgICAgICAgKCkgLT4gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShuZXcgR2VuZXJpY1R5cGU8UmVmPENsaWVudFJlcXVlc3Q+PigpIHt9LmdldFR5cGUoKSk7CisKKyAgICAgICAgUmVxdWVzdFByb2Nlc3NpbmdJbml0aWFsaXphdGlvblN0YWdlIHJlcXVlc3RQcm9jZXNzaW5nSW5pdGlhbGl6YXRpb25TdGFnZSA9CisgICAgICAgICAgICAgICAgbmV3IFJlcXVlc3RQcm9jZXNzaW5nSW5pdGlhbGl6YXRpb25TdGFnZShjbGllbnRSZXF1ZXN0LCBib290c3RyYXBCYWcuZ2V0TWVzc2FnZUJvZHlXb3JrZXJzKCksIGluamVjdGlvbk1hbmFnZXIpOworCisgICAgICAgIFN0YWdlLkJ1aWxkZXI8Q2xpZW50UmVxdWVzdD4gcmVxdWVzdGluZ0NoYWluQnVpbGRlciA9IFN0YWdlcy5jaGFpbihyZXF1ZXN0UHJvY2Vzc2luZ0luaXRpYWxpemF0aW9uU3RhZ2UpOworCisgICAgICAgIENoYWluYWJsZVN0YWdlPENsaWVudFJlcXVlc3Q+IHJlcXVlc3RGaWx0ZXJpbmdTdGFnZSA9IENsaWVudEZpbHRlcmluZ1N0YWdlcy5jcmVhdGVSZXF1ZXN0RmlsdGVyaW5nU3RhZ2UoaW5qZWN0aW9uTWFuYWdlcik7CisgICAgICAgIHRoaXMucmVxdWVzdFByb2Nlc3NpbmdSb290ID0gcmVxdWVzdEZpbHRlcmluZ1N0YWdlICE9IG51bGwKKyAgICAgICAgICAgICAgICA/IHJlcXVlc3RpbmdDaGFpbkJ1aWxkZXIuYnVpbGQocmVxdWVzdEZpbHRlcmluZ1N0YWdlKSA6IHJlcXVlc3RpbmdDaGFpbkJ1aWxkZXIuYnVpbGQoKTsKKworICAgICAgICBDaGFpbmFibGVTdGFnZTxDbGllbnRSZXNwb25zZT4gcmVzcG9uc2VGaWx0ZXJpbmdTdGFnZSA9IENsaWVudEZpbHRlcmluZ1N0YWdlcy5jcmVhdGVSZXNwb25zZUZpbHRlcmluZ1N0YWdlKAorICAgICAgICAgICAgICAgIGluamVjdGlvbk1hbmFnZXIpOworICAgICAgICB0aGlzLnJlc3BvbnNlUHJvY2Vzc2luZ1Jvb3QgPSByZXNwb25zZUZpbHRlcmluZ1N0YWdlICE9IG51bGwgPyByZXNwb25zZUZpbHRlcmluZ1N0YWdlIDogU3RhZ2VzLmlkZW50aXR5KCk7CisgICAgICAgIHRoaXMubWFuYWdlZE9iamVjdHNGaW5hbGl6ZXIgPSBib290c3RyYXBCYWcuZ2V0TWFuYWdlZE9iamVjdHNGaW5hbGl6ZXIoKTsKKyAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7CisgICAgICAgIHRoaXMuY29ubmVjdG9yID0gY29ubmVjdG9yOworICAgICAgICB0aGlzLnJlcXVlc3RTY29wZSA9IGJvb3RzdHJhcEJhZy5nZXRSZXF1ZXN0U2NvcGUoKTsKKyAgICAgICAgdGhpcy5hc3luY1JlcXVlc3RFeGVjdXRvciA9IFZhbHVlcy5sYXp5KChWYWx1ZTxFeGVjdXRvclNlcnZpY2U+KSAoKSAtPgorICAgICAgICAgICAgICAgIGNvbmZpZy5nZXRFeGVjdXRvclNlcnZpY2UoKSA9PSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICA/IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoRXhlY3V0b3JTZXJ2aWNlLmNsYXNzLCBDbGllbnRBc3luY0V4ZWN1dG9yTGl0ZXJhbC5JTlNUQU5DRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIDogY29uZmlnLmdldEV4ZWN1dG9yU2VydmljZSgpKTsKKyAgICAgICAgdGhpcy5iYWNrZ3JvdW5kU2NoZWR1bGVyID0gVmFsdWVzLmxhenkoKFZhbHVlPFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZT4pICgpIC0+CisgICAgICAgICAgICAgICAgY29uZmlnLmdldFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSgpID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgID8gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UuY2xhc3MsIENsaWVudEJhY2tncm91bmRTY2hlZHVsZXJMaXRlcmFsLklOU1RBTkNFKQorICAgICAgICAgICAgICAgICAgICAgICAgOiBjb25maWcuZ2V0U2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlKCkpOworCisgICAgICAgIHRoaXMuaW5qZWN0aW9uTWFuYWdlciA9IGluamVjdGlvbk1hbmFnZXI7CisgICAgICAgIHRoaXMubGlmZWN5Y2xlTGlzdGVuZXJzID0gUHJvdmlkZXJzLmdldEFsbFByb3ZpZGVycyhpbmplY3Rpb25NYW5hZ2VyLCBDbGllbnRMaWZlY3ljbGVMaXN0ZW5lci5jbGFzcyk7CisKKyAgICAgICAgZm9yIChmaW5hbCBDbGllbnRMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lciA6IGxpZmVjeWNsZUxpc3RlbmVycykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5vbkluaXQoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9MSVNURU5FUl9JTklUKGxpc3RlbmVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKSwgdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmVwYXJlIGEge0Bjb2RlIFJ1bm5hYmxlfSB0byBiZSB1c2VkIHRvIHN1Ym1pdCBhIHtAbGluayBDbGllbnRSZXF1ZXN0IGNsaWVudCByZXF1ZXN0fSBmb3IgYXN5bmNocm9ub3VzIHByb2Nlc3NpbmcuCisgICAgICogPHA+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCAgY2xpZW50IHJlcXVlc3QgdG8gYmUgc2VudC4KKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgYXN5bmNocm9ub3VzIHJlc3BvbnNlIGNhbGxiYWNrLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIFJ1bm5hYmxlfSB0byBiZSBzdWJtaXR0ZWQgZm9yIGFzeW5jIHByb2Nlc3NpbmcgdXNpbmcge0BsaW5rICNzdWJtaXQoUnVubmFibGUpfS4KKyAgICAgKi8KKyAgICBSdW5uYWJsZSBjcmVhdGVSdW5uYWJsZUZvckFzeW5jUHJvY2Vzc2luZyhDbGllbnRSZXF1ZXN0IHJlcXVlc3QsIGZpbmFsIFJlc3BvbnNlQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgcmV0dXJuICgpIC0+IHJlcXVlc3RTY29wZS5ydW5JblNjb3BlKCgpIC0+IHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQ2xpZW50UmVxdWVzdCBwcm9jZXNzZWRSZXF1ZXN0OworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZFJlcXVlc3QgPSBTdGFnZXMucHJvY2VzcyhyZXF1ZXN0LCByZXF1ZXN0UHJvY2Vzc2luZ1Jvb3QpOworICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWRSZXF1ZXN0ID0gYWRkVXNlckFnZW50KHByb2Nlc3NlZFJlcXVlc3QsIGNvbm5lY3Rvci5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEFib3J0RXhjZXB0aW9uIGFib3J0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1Jlc3BvbnNlKGFib3J0ZWQuZ2V0QWJvcnRSZXNwb25zZSgpLCBjYWxsYmFjayk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmaW5hbCBBc3luY0Nvbm5lY3RvckNhbGxiYWNrIGNvbm5lY3RvckNhbGxiYWNrID0gbmV3IEFzeW5jQ29ubmVjdG9yQ2FsbGJhY2soKSB7CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlc3BvbnNlKGZpbmFsIENsaWVudFJlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0U2NvcGUucnVuSW5TY29wZSgoKSAtPiBwcm9jZXNzUmVzcG9uc2UocmVzcG9uc2UsIGNhbGxiYWNrKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZmFpbHVyZShmaW5hbCBUaHJvd2FibGUgZmFpbHVyZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFNjb3BlLnJ1bkluU2NvcGUoKCkgLT4gcHJvY2Vzc0ZhaWx1cmUoZmFpbHVyZSwgY2FsbGJhY2spKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICBjb25uZWN0b3IuYXBwbHkocHJvY2Vzc2VkUmVxdWVzdCwgY29ubmVjdG9yQ2FsbGJhY2spOworICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgVGhyb3dhYmxlIHRocm93YWJsZSkgeworICAgICAgICAgICAgICAgIHByb2Nlc3NGYWlsdXJlKHRocm93YWJsZSwgY2FsbGJhY2spOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFQ+IEZ1dHVyZTxUPiBzdWJtaXQoQ2FsbGFibGU8VD4gdGFzaykgeworICAgICAgICByZXR1cm4gYXN5bmNSZXF1ZXN0RXhlY3V0b3IuZ2V0KCkuc3VibWl0KHRhc2spOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBGdXR1cmU8Pz4gc3VibWl0KFJ1bm5hYmxlIHRhc2spIHsKKyAgICAgICAgcmV0dXJuIGFzeW5jUmVxdWVzdEV4ZWN1dG9yLmdldCgpLnN1Ym1pdCh0YXNrKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFQ+IEZ1dHVyZTxUPiBzdWJtaXQoUnVubmFibGUgdGFzaywgVCByZXN1bHQpIHsKKyAgICAgICAgcmV0dXJuIGFzeW5jUmVxdWVzdEV4ZWN1dG9yLmdldCgpLnN1Ym1pdCh0YXNrLCByZXN1bHQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gU2NoZWR1bGVkRnV0dXJlPFQ+IHNjaGVkdWxlKENhbGxhYmxlPFQ+IGNhbGxhYmxlLCBsb25nIGRlbGF5LCBUaW1lVW5pdCB1bml0KSB7CisgICAgICAgIHJldHVybiBiYWNrZ3JvdW5kU2NoZWR1bGVyLmdldCgpLnNjaGVkdWxlKGNhbGxhYmxlLCBkZWxheSwgdW5pdCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNjaGVkdWxlZEZ1dHVyZTw/PiBzY2hlZHVsZShSdW5uYWJsZSBjb21tYW5kLCBsb25nIGRlbGF5LCBUaW1lVW5pdCB1bml0KSB7CisgICAgICAgIHJldHVybiBiYWNrZ3JvdW5kU2NoZWR1bGVyLmdldCgpLnNjaGVkdWxlKGNvbW1hbmQsIGRlbGF5LCB1bml0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1Jlc3BvbnNlKGZpbmFsIENsaWVudFJlc3BvbnNlIHJlc3BvbnNlLCBmaW5hbCBSZXNwb25zZUNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIGZpbmFsIENsaWVudFJlc3BvbnNlIHByb2Nlc3NlZFJlc3BvbnNlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcHJvY2Vzc2VkUmVzcG9uc2UgPSBTdGFnZXMucHJvY2VzcyhyZXNwb25zZSwgcmVzcG9uc2VQcm9jZXNzaW5nUm9vdCk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKKyAgICAgICAgICAgIHByb2Nlc3NGYWlsdXJlKHRocm93YWJsZSwgY2FsbGJhY2spOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNhbGxiYWNrLmNvbXBsZXRlZChwcm9jZXNzZWRSZXNwb25zZSwgcmVxdWVzdFNjb3BlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0ZhaWx1cmUoZmluYWwgVGhyb3dhYmxlIGZhaWx1cmUsIGZpbmFsIFJlc3BvbnNlQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgY2FsbGJhY2suZmFpbGVkKGZhaWx1cmUgaW5zdGFuY2VvZiBQcm9jZXNzaW5nRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgPyAoUHJvY2Vzc2luZ0V4Y2VwdGlvbikgZmFpbHVyZSA6IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKGZhaWx1cmUpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEZ1dHVyZTw/PiBzdWJtaXQoZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yLCBmaW5hbCBSdW5uYWJsZSB0YXNrKSB7CisgICAgICAgIHJldHVybiBleGVjdXRvci5zdWJtaXQoKCkgLT4gcmVxdWVzdFNjb3BlLnJ1bkluU2NvcGUodGFzaykpOworICAgIH0KKworICAgIHByaXZhdGUgQ2xpZW50UmVxdWVzdCBhZGRVc2VyQWdlbnQoZmluYWwgQ2xpZW50UmVxdWVzdCBjbGllbnRSZXF1ZXN0LCBmaW5hbCBTdHJpbmcgY29ubmVjdG9yTmFtZSkgeworICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaGVhZGVycyA9IGNsaWVudFJlcXVlc3QuZ2V0SGVhZGVycygpOworCisgICAgICAgIGlmIChoZWFkZXJzLmNvbnRhaW5zS2V5KEh0dHBIZWFkZXJzLlVTRVJfQUdFTlQpKSB7CisgICAgICAgICAgICAvLyBDaGVjayBmb3IgZXhwbGljaXRseSBzZXQgbnVsbCB2YWx1ZSBhbmQgaWYgc2V0LCB0aGVuIHJlbW92ZSB0aGUgaGVhZGVyIC0gc2VlIEpFUlNFWS0yMTg5CisgICAgICAgICAgICBpZiAoY2xpZW50UmVxdWVzdC5nZXRIZWFkZXJTdHJpbmcoSHR0cEhlYWRlcnMuVVNFUl9BR0VOVCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGhlYWRlcnMucmVtb3ZlKEh0dHBIZWFkZXJzLlVTRVJfQUdFTlQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCFjbGllbnRSZXF1ZXN0Lmlnbm9yZVVzZXJBZ2VudCgpKSB7CisgICAgICAgICAgICBpZiAoY29ubmVjdG9yTmFtZSAhPSBudWxsICYmICFjb25uZWN0b3JOYW1lLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGhlYWRlcnMucHV0KEh0dHBIZWFkZXJzLlVTRVJfQUdFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KFN0cmluZy5mb3JtYXQoIkplcnNleS8lcyAoJXMpIiwgVmVyc2lvbi5nZXRWZXJzaW9uKCksIGNvbm5lY3Rvck5hbWUpKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGhlYWRlcnMucHV0KEh0dHBIZWFkZXJzLlVTRVJfQUdFTlQsCisgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KFN0cmluZy5mb3JtYXQoIkplcnNleS8lcyIsIFZlcnNpb24uZ2V0VmVyc2lvbigpKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNsaWVudFJlcXVlc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW52b2tlIGEgcmVxdWVzdCBwcm9jZXNzaW5nIHN5bmNocm9ub3VzbHkgaW4gdGhlIGNvbnRleHQgb2YgdGhlIGNhbGxlcidzIHRocmVhZC4KKyAgICAgKiA8cD4KKyAgICAgKiBOT1RFOiB0aGUgbWV0aG9kIGRvZXMgbm90IGV4cGxpY2l0bHkgc3RhcnQgYSBuZXcgcmVxdWVzdCBzY29wZSBjb250ZXh0LiBJbnN0ZWFkCisgICAgICogaXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBtZXRob2QgaXMgaW52b2tlZCBmcm9tIHdpdGhpbiBhIGNvbnRleHQgb2YgYSBwcm9wZXIsIHJ1bm5pbmcKKyAgICAgKiB7QGxpbmsgUmVxdWVzdENvbnRleHQgcmVxdWVzdCBjb250ZXh0fS4gQSBjYWxsZXIgbWF5IHVzZSB0aGUKKyAgICAgKiB7QGxpbmsgI2dldFJlcXVlc3RTY29wZSgpfSBtZXRob2QgdG8gcmV0cmlldmUgdGhlIHJlcXVlc3Qgc2NvcGUgaW5zdGFuY2UgYW5kIHVzZSBpdCB0bworICAgICAqIGluaXRpYWxpemUgdGhlIHByb3BlciByZXF1ZXN0IHNjb3BlIGNvbnRleHQgcHJpb3IgdGhlIG1ldGhvZCBpbnZvY2F0aW9uLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IGNsaWVudCByZXF1ZXN0IHRvIGJlIGludm9rZWQuCisgICAgICogQHJldHVybiBjbGllbnQgcmVzcG9uc2UuCisgICAgICogQHRocm93cyBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uIGluIGNhc2Ugb2YgYW4gaW52b2NhdGlvbiBmYWlsdXJlLgorICAgICAqLworICAgIHB1YmxpYyBDbGllbnRSZXNwb25zZSBpbnZva2UoZmluYWwgQ2xpZW50UmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIENsaWVudFJlc3BvbnNlIHJlc3BvbnNlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXNwb25zZSA9IGNvbm5lY3Rvci5hcHBseShhZGRVc2VyQWdlbnQoU3RhZ2VzLnByb2Nlc3MocmVxdWVzdCwgcmVxdWVzdFByb2Nlc3NpbmdSb290KSwgY29ubmVjdG9yLmdldE5hbWUoKSkpOworICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgQWJvcnRFeGNlcHRpb24gYWJvcnRlZCkgeworICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gYWJvcnRlZC5nZXRBYm9ydFJlc3BvbnNlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBTdGFnZXMucHJvY2VzcyhyZXNwb25zZSwgcmVzcG9uc2VQcm9jZXNzaW5nUm9vdCk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFByb2Nlc3NpbmdFeGNlcHRpb24gcGUpIHsKKyAgICAgICAgICAgIHRocm93IHBlOworICAgICAgICB9IGNhdGNoIChmaW5hbCBUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24odC5nZXRNZXNzYWdlKCksIHQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSByZXF1ZXN0IHNjb3BlIGluc3RhbmNlIGNvbmZpZ3VyZWQgZm9yIHRoZSBydW50aW1lLgorICAgICAqCisgICAgICogQHJldHVybiByZXF1ZXN0IHNjb3BlIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBSZXF1ZXN0U2NvcGUgZ2V0UmVxdWVzdFNjb3BlKCkgeworICAgICAgICByZXR1cm4gcmVxdWVzdFNjb3BlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBydW50aW1lIGNvbmZpZ3VyYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHJ1bnRpbWUgY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xpZW50Q29uZmlnIGdldENvbmZpZygpIHsKKyAgICAgICAgcmV0dXJuIGNvbmZpZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHdpbGwgYmUgdXNlZCBhcyB0aGUgbGFzdCByZXNvcnQgdG8gY2xlYW4gdGhpbmdzIHVwCisgICAgICogaW4gdGhlIGNhc2UgdGhhdCB0aGlzIGluc3RhbmNlIGdldHMgZ2FyYmFnZSBjb2xsZWN0ZWQKKyAgICAgKiBiZWZvcmUgdGhlIGNsaWVudCBpdHNlbGYgZ2V0cyByZWxlYXNlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBDbG9zZSB3aWxsIGJlIGludm9rZWQgZWl0aGVyIHZpYSBmaW5hbGl6ZXIKKyAgICAgKiBvciB2aWEgSmVyc2V5Q2xpZW50IG9uU2h1dGRvd24gaG9vaywgd2hhdGV2ZXIgY29tZXMgZmlyc3QuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNsb3NlKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzdXBlci5maW5hbGl6ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TaHV0ZG93bigpIHsKKyAgICAgICAgY2xvc2UoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIGlmIChjbG9zZWQuY29tcGFyZUFuZFNldChmYWxzZSwgdHJ1ZSkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZm9yIChmaW5hbCBDbGllbnRMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lciA6IGxpZmVjeWNsZUxpc3RlbmVycykgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIub25DbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9MSVNURU5FUl9DTE9TRShsaXN0ZW5lci5nZXRDbGFzcygpLmdldE5hbWUoKSksIHQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjb25uZWN0b3IuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBtYW5hZ2VkT2JqZWN0c0ZpbmFsaXplci5wcmVEZXN0cm95KCk7CisgICAgICAgICAgICAgICAgICAgIGluamVjdGlvbk1hbmFnZXIuc2h1dGRvd24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmUtaW5pdGlhbGl6ZSB0aGUgY2xpZW50IHJ1bnRpbWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJlSW5pdGlhbGl6ZSgpIHsKKyAgICAgICAgLy8gcHJlLWluaXRpYWxpemUgTWVzc2FnZUJvZHlXb3JrZXJzCisgICAgICAgIGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoTWVzc2FnZUJvZHlXb3JrZXJzLmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSdW50aW1lIGNvbm5lY3Rvci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gcnVudGltZSBjb25uZWN0b3IuCisgICAgICovCisgICAgcHVibGljIENvbm5lY3RvciBnZXRDb25uZWN0b3IoKSB7CisgICAgICAgIHJldHVybiBjb25uZWN0b3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGluamVjdGlvbiBtYW5hZ2VyLgorICAgICAqCisgICAgICogQHJldHVybiBpbmplY3Rpb24gbWFuYWdlci4KKyAgICAgKi8KKyAgICBJbmplY3Rpb25NYW5hZ2VyIGdldEluamVjdGlvbk1hbmFnZXIoKSB7CisgICAgICAgIHJldHVybiBpbmplY3Rpb25NYW5hZ2VyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0N1c3RvbVByb3ZpZGVyc0ZlYXR1cmUuamF2YSBiL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0N1c3RvbVByb3ZpZGVyc0ZlYXR1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmMyNTViCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvQ3VzdG9tUHJvdmlkZXJzRmVhdHVyZS5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50OworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlQ29udGV4dDsKKworLyoqCisgKiBGZWF0dXJlIHRvIHByb3ZpZGUgdGhlIHNpbmdsZS1saW5lIHJlZ2lzdHJhdGlvbiBvZiBjdXN0b20gcHJvdmlkZXJzLgorICoKKyAqIEBhdXRob3IgU3RlcGFuIEtvcHJpdmEKKyAqLworcHVibGljIGNsYXNzIEN1c3RvbVByb3ZpZGVyc0ZlYXR1cmUgaW1wbGVtZW50cyBGZWF0dXJlIHsKKworICAgIHByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxDbGFzczw/Pj4gcHJvdmlkZXJzOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBGZWF0dXJlIHdoaWNoIGlzIHVzZWQgdG8gcmVnaXN0ZXIgcHJvdmlkZXJzIGFzIHByb3ZpZGVycyBpbiBDb25maWd1cmF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHByb3ZpZGVycyBjb2xsZWN0aW9uIG9mIHByb3ZpZGVycyB3aGljaCBhcmUgZ29pbmcgdG8gYmUgcmVnaXN0ZXJlZAorICAgICAqLworICAgIHB1YmxpYyBDdXN0b21Qcm92aWRlcnNGZWF0dXJlKENvbGxlY3Rpb248Q2xhc3M8Pz4+IHByb3ZpZGVycykgeworICAgICAgICB0aGlzLnByb3ZpZGVycyA9IHByb3ZpZGVyczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmUoRmVhdHVyZUNvbnRleHQgY29udGV4dCkgeworICAgICAgICBmb3IgKENsYXNzPD8+IHByb3ZpZGVyIDogcHJvdmlkZXJzKSB7CisgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKHByb3ZpZGVyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9EZWZhdWx0Q2xpZW50QXN5bmNFeGVjdXRvclByb3ZpZGVyLmphdmEgYi9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9EZWZhdWx0Q2xpZW50QXN5bmNFeGVjdXRvclByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY5NjAzYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0RlZmF1bHRDbGllbnRBc3luY0V4ZWN1dG9yUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudDsKKworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0Lk5hbWVkOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5MYXp5VmFsdWU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLlZhbHVlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5WYWx1ZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLlRocmVhZFBvb2xFeGVjdXRvclByb3ZpZGVyOworCisvKioKKyAqIERlZmF1bHQge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5FeGVjdXRvclNlcnZpY2VQcm92aWRlcn0gdXNlZCBvbiB0aGUgY2xpZW50IHNpZGUgZm9yIGFzeW5jaHJvbm91cyByZXF1ZXN0IHByb2Nlc3NpbmcuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQENsaWVudEFzeW5jRXhlY3V0b3IKK2NsYXNzIERlZmF1bHRDbGllbnRBc3luY0V4ZWN1dG9yUHJvdmlkZXIgZXh0ZW5kcyBUaHJlYWRQb29sRXhlY3V0b3JQcm92aWRlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihEZWZhdWx0Q2xpZW50QXN5bmNFeGVjdXRvclByb3ZpZGVyLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBwcml2YXRlIGZpbmFsIExhenlWYWx1ZTxJbnRlZ2VyPiBhc3luY1RocmVhZFBvb2xTaXplOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwb29sU2l6ZSBzaXplIG9mIHRoZSBkZWZhdWx0IGV4ZWN1dG9yIHRocmVhZCBwb29sIChpZiB1c2VkKS4gWmVybyBvciBuZWdhdGl2ZSB2YWx1ZXMgYXJlIGlnbm9yZWQuCisgICAgICogICAgICAgICAgICAgICAgIFNlZSBhbHNvIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllcyNBU1lOQ19USFJFQURQT09MX1NJWkV9LgorICAgICAqLworICAgIEBJbmplY3QKKyAgICBwdWJsaWMgRGVmYXVsdENsaWVudEFzeW5jRXhlY3V0b3JQcm92aWRlcihATmFtZWQoIkNsaWVudEFzeW5jVGhyZWFkUG9vbFNpemUiKSBmaW5hbCBpbnQgcG9vbFNpemUpIHsKKyAgICAgICAgc3VwZXIoImplcnNleS1jbGllbnQtYXN5bmMtZXhlY3V0b3IiKTsKKworICAgICAgICB0aGlzLmFzeW5jVGhyZWFkUG9vbFNpemUgPSBWYWx1ZXMubGF6eShuZXcgVmFsdWU8SW50ZWdlcj4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBJbnRlZ2VyIGdldCgpIHsKKyAgICAgICAgICAgICAgICBpZiAocG9vbFNpemUgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICBMT0dHRVIuY29uZmlnKExvY2FsaXphdGlvbk1lc3NhZ2VzLklHTk9SRURfQVNZTkNfVEhSRUFEUE9PTF9TSVpFKHBvb2xTaXplKSk7CisgICAgICAgICAgICAgICAgICAgIC8vIHVzaW5nIGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIExPR0dFUi5jb25maWcoTG9jYWxpemF0aW9uTWVzc2FnZXMuVVNJTkdfRklYRURfQVNZTkNfVEhSRUFEUE9PTChwb29sU2l6ZSkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcG9vbFNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgaW50IGdldE1heGltdW1Qb29sU2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIGFzeW5jVGhyZWFkUG9vbFNpemUuZ2V0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGludCBnZXRDb3JlUG9vbFNpemUoKSB7CisgICAgICAgIC8vIE1pbWlja2luZyB0aGUgRXhlY3V0b3JzLm5ld0NhY2hlZFRocmVhZFBvb2wgYW5kIG5ld0ZpeGVkVGhyZWFkUG9vbCBjb25maWd1cmF0aW9uIHZhbHVlcy4KKyAgICAgICAgZmluYWwgSW50ZWdlciBtYXhpbXVtUG9vbFNpemUgPSBnZXRNYXhpbXVtUG9vbFNpemUoKTsKKyAgICAgICAgaWYgKG1heGltdW1Qb29sU2l6ZSAhPSBJbnRlZ2VyLk1BWF9WQUxVRSkgeworICAgICAgICAgICAgcmV0dXJuIG1heGltdW1Qb29sU2l6ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvRGVmYXVsdENsaWVudEJhY2tncm91bmRTY2hlZHVsZXJQcm92aWRlci5qYXZhIGIvY29yZS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvRGVmYXVsdENsaWVudEJhY2tncm91bmRTY2hlZHVsZXJQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZjI5OGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9EZWZhdWx0Q2xpZW50QmFja2dyb3VuZFNjaGVkdWxlclByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yUHJvdmlkZXI7CisKKy8qKgorICogRGVmYXVsdCB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLlNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyfSB1c2VkIG9uIHRoZSBjbGllbnQgc2lkZSBmb3IgcHJvdmlkaW5nIHRoZSBzY2hlZHVsZWQKKyAqIGV4ZWN1dG9yIHNlcnZpY2UgdGhhdCBydW5zIGJhY2tncm91bmQgdGFza3MuCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICogQHNpbmNlIDIuMjYKKyAqLworQENsaWVudEJhY2tncm91bmRTY2hlZHVsZXIKK2NsYXNzIERlZmF1bHRDbGllbnRCYWNrZ3JvdW5kU2NoZWR1bGVyUHJvdmlkZXIgZXh0ZW5kcyBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3JQcm92aWRlciB7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgorICAgICAqLworICAgIERlZmF1bHRDbGllbnRCYWNrZ3JvdW5kU2NoZWR1bGVyUHJvdmlkZXIoKSB7CisgICAgICAgIHN1cGVyKCJqZXJzZXktY2xpZW50LWJhY2tncm91bmQtc2NoZWR1bGVyIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGludCBnZXRDb3JlUG9vbFNpemUoKSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0h0dHBVcmxDb25uZWN0b3JQcm92aWRlci5qYXZhIGIvY29yZS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvSHR0cFVybENvbm5lY3RvclByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZiYWM4NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0h0dHBVcmxDb25uZWN0b3JQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMzA4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuaW50ZXJuYWwuSHR0cFVybENvbm5lY3RvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnNwaS5Db25uZWN0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnNwaS5Db25uZWN0b3JQcm92aWRlcjsKKworLyoqCisgKiBEZWZhdWx0IEplcnNleSBjbGllbnQge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5zcGkuQ29ubmVjdG9yIGNvbm5lY3Rvcn0gcHJvdmlkZXIKKyAqIHRoYXQgcHJvdmlkZXMgY29ubmVjdG9yIGluc3RhbmNlcyB3aGljaCBkZWxlZ2F0ZSBIVFRQIHJlcXVlc3RzIHRvIHtAbGluayBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbn0KKyAqIGZvciBwcm9jZXNzaW5nLgorICogPHA+CisgKiBUaGUgcHJvdmlkZWQgY29ubmVjdG9yIGluc3RhbmNlcyBvdmVycmlkZSBkZWZhdWx0IGJlaGF2aW91ciBvZiB0aGUgcHJvcGVydHkKKyAqIHtAbGluayBDbGllbnRQcm9wZXJ0aWVzI1JFUVVFU1RfRU5USVRZX1BST0NFU1NJTkd9IGFuZCB1c2Uge0BsaW5rIFJlcXVlc3RFbnRpdHlQcm9jZXNzaW5nI0JVRkZFUkVEfQorICogcmVxdWVzdCBlbnRpdHkgcHJvY2Vzc2luZyBieSBkZWZhdWx0LgorICogPC9wPgorICogPHA+CisgKiBEdWUgdG8gYSBidWcgaW4gdGhlIGNodW5rZWQgdHJhbnNwb3J0IGNvZGluZyBzdXBwb3J0IG9mIHtAY29kZSBIdHRwVVJMQ29ubmVjdGlvbn0gdGhhdCBjYXVzZXMKKyAqIHJlcXVlc3RzIHRvIGZhaWwgdW5wcmVkaWN0YWJseSwgdGhpcyBjb25uZWN0b3IgcHJvdmlkZXIgYWxsb3dzIHRvIGNvbmZpZ3VyZSB0aGUgcHJvdmlkZWQgY29ubmVjdG9yCisgKiBpbnN0YW5jZXMgdG8gdXNlIHtAY29kZSBIdHRwVVJMQ29ubmVjdGlvbn0ncyBmaXhlZC1sZW5ndGggc3RyZWFtaW5nIG1vZGUgYXMgYSB3b3JrYXJvdW5kLiBUaGlzCisgKiB3b3JrYXJvdW5kIGNhbiBiZSBlbmFibGVkIHZpYSB7QGxpbmsgI3VzZUZpeGVkTGVuZ3RoU3RyZWFtaW5nKCl9IG1ldGhvZCBvciB2aWEKKyAqIHtAbGluayAjVVNFX0ZJWEVEX0xFTkdUSF9TVFJFQU1JTkd9IEplcnNleSBjbGllbnQgY29uZmlndXJhdGlvbiBwcm9wZXJ0eS4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSHR0cFVybENvbm5lY3RvclByb3ZpZGVyIGltcGxlbWVudHMgQ29ubmVjdG9yUHJvdmlkZXIgeworICAgIC8qKgorICAgICAqIElmIHtAY29kZSB0cnVlfSwgdGhlIHtAbGluayBIdHRwVXJsQ29ubmVjdG9yfSAoaWYgdXNlZCkgd2lsbCBhc3N1bWUgdGhlIGNvbnRlbnQgbGVuZ3RoCisgICAgICogZnJvbSB0aGUgdmFsdWUgb2Yge0B2YWx1ZSBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzI0NPTlRFTlRfTEVOR1RIfSByZXF1ZXN0CisgICAgICogaGVhZGVyIChpZiBwcmVzZW50KS4KKyAgICAgKiA8cD4KKyAgICAgKiBXaGVuIHRoaXMgcHJvcGVydHkgaXMgZW5hYmxlZCBhbmQgdGhlIHJlcXVlc3QgaGFzIGEgdmFsaWQgbm9uLXplcm8gY29udGVudCBsZW5ndGgKKyAgICAgKiB2YWx1ZSBzcGVjaWZpZWQgaW4gaXRzIHtAdmFsdWUgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVycyNDT05URU5UX0xFTkdUSH0gcmVxdWVzdAorICAgICAqIGhlYWRlciwgdGhhdCB0aGlzIHZhbHVlIHdpbGwgYmUgdXNlZCBhcyBhbiBpbnB1dCB0byB0aGUKKyAgICAgKiB7QGxpbmsgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb24jc2V0Rml4ZWRMZW5ndGhTdHJlYW1pbmdNb2RlKGludCl9IG1ldGhvZCBjYWxsCisgICAgICogaW52b2tlZCBvbiB0aGUgdW5kZXJseWluZyB7QGxpbmsgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb24gY29ubmVjdGlvbn0uCisgICAgICogVGhpcyB3aWxsIGFsc28gc3VwcHJlc3MgdGhlIGVudGl0eSBidWZmZXJpbmcgaW4gdGhlIEB7Y29kZSBIdHRwVVJMQ29ubmVjdGlvbn0sCisgICAgICogd2hpY2ggaXMgdW5kZXNpcmFibGUgaW4gY2VydGFpbiBzY2VuYXJpb3MsIGUuZy4gd2hlbiBzdHJlYW1pbmcgbGFyZ2UgZW50aXRpZXMuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIE5vdGUgdGhhdCB0aGUgY29udGVudCBsZW5ndGggdmFsdWUgZGVmaW5lZCBpbiB0aGUgcmVxdWVzdCBoZWFkZXIgbXVzdCBleGFjdGx5IG1hdGNoCisgICAgICogdGhlIHJlYWwgc2l6ZSBvZiB0aGUgZW50aXR5LiBJZiB0aGUge0BsaW5rIGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnMjQ09OVEVOVF9MRU5HVEh9IGhlYWRlcgorICAgICAqIGlzIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGluIGEgcmVxdWVzdCwgdGhpcyBwcm9wZXJ0eSB3aWxsIGJlIGlnbm9yZWQgYW5kIHRoZQorICAgICAqIHJlcXVlc3QgZW50aXR5IHdpbGwgYmUgc3RpbGwgYnVmZmVyZWQgYnkgdGhlIHVuZGVybHlpbmcgQHtjb2RlIEh0dHBVUkxDb25uZWN0aW9ufSBpbmZyYXN0cnVjdHVyZS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhpcyBwcm9wZXJ0eSBhbHNvIG92ZXJyaWRlcyB0aGUgYmVoYXZpb3VyIGVuYWJsZWQgYnkgdGhlCisgICAgICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzI0NIVU5LRURfRU5DT0RJTkdfU0laRX0gcHJvcGVydHkuCisgICAgICogQ2h1bmtlZCBlbmNvZGluZyB3aWxsIG9ubHkgYmUgdXNlZCwgaWYgdGhlIHNpemUgaXMgbm90IHNwZWNpZmllZCBpbiB0aGUgaGVhZGVyIG9mIHRoZSByZXF1ZXN0LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlIHRoYXQgdGhpcyBwcm9wZXJ0eSBvbmx5IGFwcGxpZXMgdG8gY2xpZW50IHJ1bi10aW1lcyB0aGF0IGFyZSBjb25maWd1cmVkIHRvIHVzZSB0aGUgZGVmYXVsdAorICAgICAqIHtAbGluayBIdHRwVXJsQ29ubmVjdG9yfSBhcyB0aGUgY2xpZW50IGNvbm5lY3Rvci4gVGhlIHByb3BlcnR5IGlzIGlnbm9yZWQgYnkgb3RoZXIgY29ubmVjdG9ycy4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMge0Bjb2RlIGZhbHNlfS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaXMgPHR0PntAdmFsdWV9PC90dD4uCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHNpbmNlIDIuNQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFVTRV9GSVhFRF9MRU5HVEhfU1RSRUFNSU5HID0KKyAgICAgICAgICAgICJqZXJzZXkuY29uZmlnLmNsaWVudC5odHRwVXJsQ29ubmVjdG9yLnVzZUZpeGVkTGVuZ3RoU3RyZWFtaW5nIjsKKworICAgIC8qKgorICAgICAqIEEgdmFsdWUgb2Yge0Bjb2RlIHRydWV9IGRlY2xhcmVzIHRoYXQgdGhlIGNsaWVudCB3aWxsIHRyeSB0byBzZXQKKyAgICAgKiB1bnN1cHBvcnRlZCBIVFRQIG1ldGhvZCB0byB7QGxpbmsgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb259IHZpYQorICAgICAqIHJlZmxlY3Rpb24uCisgICAgICogPHA+CisgICAgICogTk9URTogRW5hYmxpbmcgdGhpcyBwcm9wZXJ0eSBtYXkgY2F1c2Ugc2VjdXJpdHkgcmVsYXRlZCB3YXJuaW5ncy9lcnJvcnMKKyAgICAgKiBhbmQgaXQgbWF5IGJyZWFrIHdoZW4gb3RoZXIgSkRLIGltcGxlbWVudGF0aW9uIGlzIHVzZWQuIDxiPlVzZSBvbmx5CisgICAgICogd2hlbiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuPC9iPgorICAgICAqIDwvcD4KKyAgICAgKiA8cD5UaGUgdmFsdWUgTVVTVCBiZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgamF2YS5sYW5nLkJvb2xlYW59LjwvcD4KKyAgICAgKiA8cD5UaGUgZGVmYXVsdCB2YWx1ZSBpcyB7QGNvZGUgZmFsc2V9LjwvcD4KKyAgICAgKiA8cD5UaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi48L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VUX01FVEhPRF9XT1JLQVJPVU5EID0KKyAgICAgICAgICAgICJqZXJzZXkuY29uZmlnLmNsaWVudC5odHRwVXJsQ29ubmVjdGlvbi5zZXRNZXRob2RXb3JrYXJvdW5kIjsKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbm5lY3Rpb24gZmFjdG9yeSB0byBiZSB1c2VkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbm5lY3Rpb25GYWN0b3J5IERFRkFVTFRfQ09OTkVDVElPTl9GQUNUT1JZID0gbmV3IERlZmF1bHRDb25uZWN0aW9uRmFjdG9yeSgpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoSHR0cFVybENvbm5lY3RvclByb3ZpZGVyLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBwcml2YXRlIENvbm5lY3Rpb25GYWN0b3J5IGNvbm5lY3Rpb25GYWN0b3J5OworICAgIHByaXZhdGUgaW50IGNodW5rU2l6ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gdXNlRml4ZWRMZW5ndGhTdHJlYW1pbmc7CisgICAgcHJpdmF0ZSBib29sZWFuIHVzZVNldE1ldGhvZFdvcmthcm91bmQ7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IHtAbGluayBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbn0tYmFzZWQgSmVyc2V5IGNsaWVudCBjb25uZWN0b3IgcHJvdmlkZXIuCisgICAgICovCisgICAgcHVibGljIEh0dHBVcmxDb25uZWN0b3JQcm92aWRlcigpIHsKKyAgICAgICAgdGhpcy5jb25uZWN0aW9uRmFjdG9yeSA9IERFRkFVTFRfQ09OTkVDVElPTl9GQUNUT1JZOworICAgICAgICB0aGlzLmNodW5rU2l6ZSA9IENsaWVudFByb3BlcnRpZXMuREVGQVVMVF9DSFVOS19TSVpFOworICAgICAgICB0aGlzLnVzZUZpeGVkTGVuZ3RoU3RyZWFtaW5nID0gZmFsc2U7CisgICAgICAgIHRoaXMudXNlU2V0TWV0aG9kV29ya2Fyb3VuZCA9IGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBhIGN1c3RvbSB7QGxpbmsgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb259IGZhY3RvcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbkZhY3RvcnkgY3VzdG9tIEhUVFAgVVJMIGNvbm5lY3Rpb24gZmFjdG9yeS4gTXVzdCBub3QgYmUge0Bjb2RlIG51bGx9LgorICAgICAqIEByZXR1cm4gdXBkYXRlZCBjb25uZWN0b3IgcHJvdmlkZXIgaW5zdGFuY2UuCisgICAgICogQHRocm93cyBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gY2FzZSB0aGUgc3VwcGxpZWQgY29ubmVjdGlvbkZhY3RvcnkgaXMge0Bjb2RlIG51bGx9LgorICAgICAqLworICAgIHB1YmxpYyBIdHRwVXJsQ29ubmVjdG9yUHJvdmlkZXIgY29ubmVjdGlvbkZhY3RvcnkoZmluYWwgQ29ubmVjdGlvbkZhY3RvcnkgY29ubmVjdGlvbkZhY3RvcnkpIHsKKyAgICAgICAgaWYgKGNvbm5lY3Rpb25GYWN0b3J5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5OVUxMX0lOUFVUX1BBUkFNRVRFUigiY29ubmVjdGlvbkZhY3RvcnkiKSk7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmNvbm5lY3Rpb25GYWN0b3J5ID0gY29ubmVjdGlvbkZhY3Rvcnk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBjaHVuayBzaXplIGZvciByZXF1ZXN0cyB0cmFuc2ZlcnJlZCB1c2luZyBhCisgICAgICogPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWMzLmh0bWwjc2VjMy42LjEiPkhUVFAgY2h1bmtlZCB0cmFuc2ZlciBjb2Rpbmc8L2E+LgorICAgICAqCisgICAgICogSWYgbm8gdmFsdWUgaXMgc2V0LCB0aGUgZGVmYXVsdCBjaHVuayBzaXplIG9mIDQwOTYgYnl0ZXMgd2lsbCBiZSB1c2VkLgorICAgICAqIDxwPgorICAgICAqIE5vdGUgdGhhdCB0aGlzIHByb2dyYW1tYXRpY2FsbHkgc2V0IHZhbHVlIGNhbiBiZSBvdmVycmlkZGVuIGJ5CisgICAgICogc2V0dGluZyB0aGUge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzI0NIVU5LRURfRU5DT0RJTkdfU0laRX0gcHJvcGVydHkKKyAgICAgKiBzcGVjaWZpZWQgaW4gdGhlIEplcnNleSBjbGllbnQgaW5zdGFuY2UgY29uZmlndXJhdGlvbi4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gY2h1bmtTaXplIGNodW5rZWQgdHJhbnNmZXIgY29kaW5nIGNodW5rIHNpemUgdG8gYmUgdXNlZC4KKyAgICAgKiBAcmV0dXJuIHVwZGF0ZWQgY29ubmVjdG9yIHByb3ZpZGVyIGluc3RhbmNlLgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbiBjYXNlIHRoZSBzcGVjaWZpZWQgY2h1bmsgc2l6ZSBpcyBuZWdhdGl2ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSHR0cFVybENvbm5lY3RvclByb3ZpZGVyIGNodW5rU2l6ZShmaW5hbCBpbnQgY2h1bmtTaXplKSB7CisgICAgICAgIGlmIChjaHVua1NpemUgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLk5FR0FUSVZFX0lOUFVUX1BBUkFNRVRFUigiY2h1bmtTaXplIikpOworICAgICAgICB9CisgICAgICAgIHRoaXMuY2h1bmtTaXplID0gY2h1bmtTaXplOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnN0cnVjdCB0aGUgcHJvdmlkZWQgY29ubmVjdG9ycyB0byB1c2UgdGhlIHtAbGluayBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbiNzZXRGaXhlZExlbmd0aFN0cmVhbWluZ01vZGUoaW50KQorICAgICAqIGZpeGVkLWxlbmd0aCBzdHJlYW1pbmcgbW9kZX0gb24gdGhlIHVuZGVybHlpbmcgSFRUUCBVUkwgY29ubmVjdGlvbiBpbnN0YW5jZSB3aGVuIHNlbmRpbmcgcmVxdWVzdHMuCisgICAgICogU2VlIHtAbGluayAjVVNFX0ZJWEVEX0xFTkdUSF9TVFJFQU1JTkd9IHByb3BlcnR5IGRvY3VtZW50YXRpb24gZm9yIG1vcmUgZGV0YWlscy4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlIHRoYXQgdGhpcyBwcm9ncmFtbWF0aWNhbGx5IHNldCB2YWx1ZSBjYW4gYmUgb3ZlcnJpZGRlbiBieQorICAgICAqIHNldHRpbmcgdGhlIHtAY29kZSBVU0VfRklYRURfTEVOR1RIX1NUUkVBTUlOR30gcHJvcGVydHkgc3BlY2lmaWVkIGluIHRoZSBKZXJzZXkgY2xpZW50IGluc3RhbmNlIGNvbmZpZ3VyYXRpb24uCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHJldHVybiB1cGRhdGVkIGNvbm5lY3RvciBwcm92aWRlciBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSHR0cFVybENvbm5lY3RvclByb3ZpZGVyIHVzZUZpeGVkTGVuZ3RoU3RyZWFtaW5nKCkgeworICAgICAgICB0aGlzLnVzZUZpeGVkTGVuZ3RoU3RyZWFtaW5nID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5zdHJ1Y3QgdGhlIHByb3ZpZGVkIGNvbm5lY3RvcnMgdG8gdXNlIHJlZmxlY3Rpb24gd2hlbiBzZXR0aW5nIHRoZQorICAgICAqIEhUVFAgbWV0aG9kIHZhbHVlLlNlZSB7QGxpbmsgI1NFVF9NRVRIT0RfV09SS0FST1VORH0gcHJvcGVydHkgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLgorICAgICAqIDxwPgorICAgICAqIE5vdGUgdGhhdCB0aGlzIHByb2dyYW1tYXRpY2FsbHkgc2V0IHZhbHVlIGNhbiBiZSBvdmVycmlkZGVuIGJ5CisgICAgICogc2V0dGluZyB0aGUge0Bjb2RlIFNFVF9NRVRIT0RfV09SS0FST1VORH0gcHJvcGVydHkgc3BlY2lmaWVkIGluIHRoZSBKZXJzZXkgY2xpZW50IGluc3RhbmNlIGNvbmZpZ3VyYXRpb24KKyAgICAgKiBvciBpbiB0aGUgcmVxdWVzdCBwcm9wZXJ0aWVzLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdXBkYXRlZCBjb25uZWN0b3IgcHJvdmlkZXIgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIEh0dHBVcmxDb25uZWN0b3JQcm92aWRlciB1c2VTZXRNZXRob2RXb3JrYXJvdW5kKCkgeworICAgICAgICB0aGlzLnVzZVNldE1ldGhvZFdvcmthcm91bmQgPSB0cnVlOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29ubmVjdG9yIGdldENvbm5lY3RvcihmaW5hbCBDbGllbnQgY2xpZW50LCBmaW5hbCBDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBjb25maWcuZ2V0UHJvcGVydGllcygpOworCisgICAgICAgIGludCBjb21wdXRlZENodW5rU2l6ZSA9IENsaWVudFByb3BlcnRpZXMuZ2V0VmFsdWUocHJvcGVydGllcywKKyAgICAgICAgICAgICAgICBDbGllbnRQcm9wZXJ0aWVzLkNIVU5LRURfRU5DT0RJTkdfU0laRSwgY2h1bmtTaXplLCBJbnRlZ2VyLmNsYXNzKTsKKyAgICAgICAgaWYgKGNvbXB1dGVkQ2h1bmtTaXplIDwgMCkgeworICAgICAgICAgICAgTE9HR0VSLndhcm5pbmcoTG9jYWxpemF0aW9uTWVzc2FnZXMuTkVHQVRJVkVfQ0hVTktfU0laRShjb21wdXRlZENodW5rU2l6ZSwgY2h1bmtTaXplKSk7CisgICAgICAgICAgICBjb21wdXRlZENodW5rU2l6ZSA9IGNodW5rU2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGJvb2xlYW4gY29tcHV0ZWRVc2VGaXhlZExlbmd0aFN0cmVhbWluZyA9IENsaWVudFByb3BlcnRpZXMuZ2V0VmFsdWUocHJvcGVydGllcywKKyAgICAgICAgICAgICAgICBVU0VfRklYRURfTEVOR1RIX1NUUkVBTUlORywgdXNlRml4ZWRMZW5ndGhTdHJlYW1pbmcsIEJvb2xlYW4uY2xhc3MpOworICAgICAgICBmaW5hbCBib29sZWFuIGNvbXB1dGVkVXNlU2V0TWV0aG9kV29ya2Fyb3VuZCA9IENsaWVudFByb3BlcnRpZXMuZ2V0VmFsdWUocHJvcGVydGllcywKKyAgICAgICAgICAgICAgICBTRVRfTUVUSE9EX1dPUktBUk9VTkQsIHVzZVNldE1ldGhvZFdvcmthcm91bmQsIEJvb2xlYW4uY2xhc3MpOworCisgICAgICAgIHJldHVybiBjcmVhdGVIdHRwVXJsQ29ubmVjdG9yKGNsaWVudCwgY29ubmVjdGlvbkZhY3RvcnksIGNvbXB1dGVkQ2h1bmtTaXplLCBjb21wdXRlZFVzZUZpeGVkTGVuZ3RoU3RyZWFtaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlZFVzZVNldE1ldGhvZFdvcmthcm91bmQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSB7QGxpbmsgSHR0cFVybENvbm5lY3Rvcn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xpZW50ICAgICAgICAgICAgICBKQVgtUlMgY2xpZW50IGluc3RhbmNlIGZvciB3aGljaCB0aGUgY29ubmVjdG9yIGlzIGJlaW5nIGNyZWF0ZWQuCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25GYWN0b3J5ICAge0BsaW5rIGphdmF4Lm5ldC5zc2wuSHR0cHNVUkxDb25uZWN0aW9ufSBmYWN0b3J5IHRvIGJlIHVzZWQgd2hlbiBjcmVhdGluZworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25zLgorICAgICAqIEBwYXJhbSBjaHVua1NpemUgICAgICAgICAgIGNodW5rIHNpemUgdG8gdXNlIHdoZW4gdXNpbmcgSFRUUCBjaHVua2VkIHRyYW5zZmVyIGNvZGluZy4KKyAgICAgKiBAcGFyYW0gZml4TGVuZ3RoU3RyZWFtaW5nICBzcGVjaWZ5IGlmIHRoZSB0aGUge0BsaW5rIGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uI3NldEZpeGVkTGVuZ3RoU3RyZWFtaW5nTW9kZShpbnQpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgZml4ZWQtbGVuZ3RoIHN0cmVhbWluZyBtb2RlfSBvbiB0aGUgdW5kZXJseWluZyBIVFRQIFVSTCBjb25uZWN0aW9uIGluc3RhbmNlcyBzaG91bGQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSB1c2VkIHdoZW4gc2VuZGluZyByZXF1ZXN0cy4KKyAgICAgKiBAcGFyYW0gc2V0TWV0aG9kV29ya2Fyb3VuZCBzcGVjaWZ5IGlmIHRoZSByZWZsZWN0aW9uIHdvcmthcm91bmQgc2hvdWxkIGJlIHVzZWQgdG8gc2V0IEhUVFAgVVJMIGNvbm5lY3Rpb24gbWV0aG9kCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS4gU2VlIHtAbGluayBIdHRwVXJsQ29ubmVjdG9yUHJvdmlkZXIjU0VUX01FVEhPRF9XT1JLQVJPVU5EfSBmb3IgZGV0YWlscy4KKyAgICAgKiBAcmV0dXJuIGNyZWF0ZWQge0BsaW5rIEh0dHBVcmxDb25uZWN0b3J9IGluc3RhbmNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBDb25uZWN0b3IgY3JlYXRlSHR0cFVybENvbm5lY3RvcihDbGllbnQgY2xpZW50LCBDb25uZWN0aW9uRmFjdG9yeSBjb25uZWN0aW9uRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNodW5rU2l6ZSwgYm9vbGVhbiBmaXhMZW5ndGhTdHJlYW1pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2V0TWV0aG9kV29ya2Fyb3VuZCkgeworICAgICAgICByZXR1cm4gbmV3IEh0dHBVcmxDb25uZWN0b3IoCisgICAgICAgICAgICAgICAgY2xpZW50LAorICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25GYWN0b3J5LAorICAgICAgICAgICAgICAgIGNodW5rU2l6ZSwKKyAgICAgICAgICAgICAgICBmaXhMZW5ndGhTdHJlYW1pbmcsCisgICAgICAgICAgICAgICAgc2V0TWV0aG9kV29ya2Fyb3VuZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBmYWN0b3J5IGZvciB7QGxpbmsgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb259IGluc3RhbmNlcy4KKyAgICAgKiA8cD4KKyAgICAgKiBBIGZhY3RvcnkgbWF5IGJlIHVzZWQgdG8gY3JlYXRlIGEge0BsaW5rIGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9ufSBhbmQgY29uZmlndXJlCisgICAgICogaXQgaW4gYSBjdXN0b20gbWFubmVyIHRoYXQgaXMgbm90IHBvc3NpYmxlIHVzaW5nIHRoZSBDbGllbnQgQVBJLgorICAgICAqIDxwPgorICAgICAqIEEgY3VzdG9tIGZhY3RvcnkgaW5zdGFuY2UgbWF5IGJlIHJlZ2lzdGVyZWQgaW4gdGhlIHtAY29kZSBIdHRwVXJsQ29ubmVjdG9yUHJvdmlkZXJ9IGluc3RhbmNlCisgICAgICogdmlhIHtAbGluayAjY29ubmVjdGlvbkZhY3RvcnkoQ29ubmVjdGlvbkZhY3RvcnkpfSBtZXRob2QuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBDb25uZWN0aW9uRmFjdG9yeSB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBhIHtAbGluayBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbn0gZm9yIGEgZ2l2ZW4gVVJMLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogSW1wbGVtZW50YXRpb24gb2YgdGhlIG1ldGhvZCBNVVNUIGJlIHRocmVhZC1zYWZlIGFuZCBNVVNUIGVuc3VyZSB0aGF0CisgICAgICAgICAqIGEgZGVkaWNhdGVkIHtAbGluayBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbn0gaW5zdGFuY2UgaXMgcmV0dXJuZWQgZm9yIGNvbmN1cnJlbnQKKyAgICAgICAgICogcmVxdWVzdHMuCisgICAgICAgICAqIDwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHVybCB0aGUgZW5kcG9pbnQgVVJMLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb259LgorICAgICAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gaW4gY2FzZSB0aGUgY29ubmVjdGlvbiBjYW5ub3QgYmUgcHJvdmlkZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgSHR0cFVSTENvbm5lY3Rpb24gZ2V0Q29ubmVjdGlvbihVUkwgdXJsKSB0aHJvd3MgSU9FeGNlcHRpb247CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGVmYXVsdENvbm5lY3Rpb25GYWN0b3J5IGltcGxlbWVudHMgQ29ubmVjdGlvbkZhY3RvcnkgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSHR0cFVSTENvbm5lY3Rpb24gZ2V0Q29ubmVjdGlvbihmaW5hbCBVUkwgdXJsKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIChIdHRwVVJMQ29ubmVjdGlvbikgdXJsLm9wZW5Db25uZWN0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKHRoaXMgPT0gbykgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgSHR0cFVybENvbm5lY3RvclByb3ZpZGVyIHRoYXQgPSAoSHR0cFVybENvbm5lY3RvclByb3ZpZGVyKSBvOworCisgICAgICAgIGlmIChjaHVua1NpemUgIT0gdGhhdC5jaHVua1NpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodXNlRml4ZWRMZW5ndGhTdHJlYW1pbmcgIT0gdGhhdC51c2VGaXhlZExlbmd0aFN0cmVhbWluZykgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb25GYWN0b3J5LmVxdWFscyh0aGF0LmNvbm5lY3Rpb25GYWN0b3J5KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgcmVzdWx0ID0gY29ubmVjdGlvbkZhY3RvcnkuaGFzaENvZGUoKTsKKyAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyBjaHVua1NpemU7CisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgKHVzZUZpeGVkTGVuZ3RoU3RyZWFtaW5nID8gMSA6IDApOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0luYm91bmRKYXhyc1Jlc3BvbnNlLmphdmEgYi9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9JbmJvdW5kSmF4cnNSZXNwb25zZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3MTgxYWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9JbmJvdW5kSmF4cnNSZXNwb25zZS5qYXZhCkBAIC0wLDAgKzEsMjQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudDsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkVudGl0eVRhZzsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkdlbmVyaWNUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTGluazsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTmV3Q29va2llOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlByb2R1Y2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWwuUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5pbnRlcm5hbC5SZXF1ZXN0U2NvcGU7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgYW4gaW5ib3VuZCBjbGllbnQtc2lkZSBKQVgtUlMge0BsaW5rIFJlc3BvbnNlfSBtZXNzYWdlLgorICogPHA+CisgKiBUaGlzIHJlc3BvbnNlIGRlbGVnYXRlcyBtZXRob2QgY2FsbHMgdG8gdGhlIHVuZGVybHlpbmcKKyAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UmVzcG9uc2UgY2xpZW50IHJlc3BvbnNlIGNvbnRleHR9IGFuZAorICogZW5zdXJlcyB0aGF0IGFsbCByZXF1ZXN0LXNjb3BlZCBtZXRob2QgaW52b2NhdGlvbnMgYXJlIHJ1biBpbiB0aGUgcHJvcGVyIHJlcXVlc3Qgc2NvcGUuCisgKiA8L3A+CisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworY2xhc3MgSW5ib3VuZEpheHJzUmVzcG9uc2UgZXh0ZW5kcyBSZXNwb25zZSB7CisKKyAgICBwcml2YXRlIGZpbmFsIENsaWVudFJlc3BvbnNlIGNvbnRleHQ7CisgICAgcHJpdmF0ZSBmaW5hbCBSZXF1ZXN0U2NvcGUgc2NvcGU7CisgICAgcHJpdmF0ZSBmaW5hbCBSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgc2NvcGVkIGNsaWVudCByZXNwb25zZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IGplcnNleSBjbGllbnQgcmVzcG9uc2UgY29udGV4dC4KKyAgICAgKiBAcGFyYW0gc2NvcGUgICByZXF1ZXN0IHNjb3BlIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBJbmJvdW5kSmF4cnNSZXNwb25zZShmaW5hbCBDbGllbnRSZXNwb25zZSBjb250ZXh0LCBmaW5hbCBSZXF1ZXN0U2NvcGUgc2NvcGUpIHsKKyAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgdGhpcy5zY29wZSA9IHNjb3BlOworICAgICAgICBpZiAodGhpcy5zY29wZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLnJlcXVlc3RDb250ZXh0ID0gc2NvcGUucmVmZXJlbmNlQ3VycmVudCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5yZXF1ZXN0Q29udGV4dCA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldFN0YXR1cygpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0U3RhdHVzKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0YXR1c1R5cGUgZ2V0U3RhdHVzSW5mbygpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0U3RhdHVzSW5mbygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgZ2V0RW50aXR5KCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjb250ZXh0LmdldEVudGl0eSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gVCByZWFkRW50aXR5KGZpbmFsIENsYXNzPFQ+IGVudGl0eVR5cGUpIHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uLCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgICAgICByZXR1cm4gcnVuSW5TY29wZUlmUG9zc2libGUobmV3IFByb2R1Y2VyPFQ+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgVCBjYWxsKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LnJlYWRFbnRpdHkoZW50aXR5VHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyA8VD4gVCByZWFkRW50aXR5KGZpbmFsIEdlbmVyaWNUeXBlPFQ+IGVudGl0eVR5cGUpIHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uLCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgICAgICByZXR1cm4gcnVuSW5TY29wZUlmUG9zc2libGUobmV3IFByb2R1Y2VyPFQ+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgVCBjYWxsKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LnJlYWRFbnRpdHkoZW50aXR5VHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gVCByZWFkRW50aXR5KGZpbmFsIENsYXNzPFQ+IGVudGl0eVR5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucykKKyAgICAgICAgICAgIHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uLCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgICAgICByZXR1cm4gcnVuSW5TY29wZUlmUG9zc2libGUobmV3IFByb2R1Y2VyPFQ+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgVCBjYWxsKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LnJlYWRFbnRpdHkoZW50aXR5VHlwZSwgYW5ub3RhdGlvbnMpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgPFQ+IFQgcmVhZEVudGl0eShmaW5hbCBHZW5lcmljVHlwZTxUPiBlbnRpdHlUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMpCisgICAgICAgICAgICB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHJ1bkluU2NvcGVJZlBvc3NpYmxlKG5ldyBQcm9kdWNlcjxUPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFQgY2FsbCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5yZWFkRW50aXR5KGVudGl0eVR5cGUsIGFubm90YXRpb25zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaGFzRW50aXR5KCkgeworICAgICAgICByZXR1cm4gY29udGV4dC5oYXNFbnRpdHkoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBidWZmZXJFbnRpdHkoKSB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjb250ZXh0LmJ1ZmZlckVudGl0eSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29udGV4dC5jbG9zZSgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHJlcXVlc3RDb250ZXh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5yZWxlYXNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldEhlYWRlclN0cmluZyhTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gY29udGV4dC5nZXRIZWFkZXJTdHJpbmcobmFtZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBnZXRTdHJpbmdIZWFkZXJzKCkgeworICAgICAgICByZXR1cm4gY29udGV4dC5nZXRIZWFkZXJzKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1lZGlhVHlwZSBnZXRNZWRpYVR5cGUoKSB7CisgICAgICAgIHJldHVybiBjb250ZXh0LmdldE1lZGlhVHlwZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMb2NhbGUgZ2V0TGFuZ3VhZ2UoKSB7CisgICAgICAgIHJldHVybiBjb250ZXh0LmdldExhbmd1YWdlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRMZW5ndGgoKSB7CisgICAgICAgIHJldHVybiBjb250ZXh0LmdldExlbmd0aCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBOZXdDb29raWU+IGdldENvb2tpZXMoKSB7CisgICAgICAgIHJldHVybiBjb250ZXh0LmdldFJlc3BvbnNlQ29va2llcygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBFbnRpdHlUYWcgZ2V0RW50aXR5VGFnKCkgeworICAgICAgICByZXR1cm4gY29udGV4dC5nZXRFbnRpdHlUYWcoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRGF0ZSBnZXREYXRlKCkgeworICAgICAgICByZXR1cm4gY29udGV4dC5nZXREYXRlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIERhdGUgZ2V0TGFzdE1vZGlmaWVkKCkgeworICAgICAgICByZXR1cm4gY29udGV4dC5nZXRMYXN0TW9kaWZpZWQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0QWxsb3dlZE1ldGhvZHMoKSB7CisgICAgICAgIHJldHVybiBjb250ZXh0LmdldEFsbG93ZWRNZXRob2RzKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFVSSSBnZXRMb2NhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0TG9jYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PExpbms+IGdldExpbmtzKCkgeworICAgICAgICByZXR1cm4gY29udGV4dC5nZXRMaW5rcygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGhhc0xpbmsoU3RyaW5nIHJlbGF0aW9uKSB7CisgICAgICAgIHJldHVybiBjb250ZXh0Lmhhc0xpbmsocmVsYXRpb24pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaW5rIGdldExpbmsoU3RyaW5nIHJlbGF0aW9uKSB7CisgICAgICAgIHJldHVybiBjb250ZXh0LmdldExpbmsocmVsYXRpb24pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaW5rLkJ1aWxkZXIgZ2V0TGlua0J1aWxkZXIoU3RyaW5nIHJlbGF0aW9uKSB7CisgICAgICAgIHJldHVybiBjb250ZXh0LmdldExpbmtCdWlsZGVyKHJlbGF0aW9uKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGdldE1ldGFkYXRhKCkgeworICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsID8+IGhlYWRlcnMgPSBjb250ZXh0LmdldEhlYWRlcnMoKTsKKyAgICAgICAgcmV0dXJuIChNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4pIGhlYWRlcnM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJJbmJvdW5kSmF4cnNSZXNwb25zZXsiICsgImNvbnRleHQ9IiArIGNvbnRleHQgKyAifSI7CisgICAgfQorCisgICAgcHJpdmF0ZSA8VD4gVCBydW5JblNjb3BlSWZQb3NzaWJsZShQcm9kdWNlcjxUPiBwcm9kdWNlcikgeworICAgICAgICBpZiAoc2NvcGUgIT0gbnVsbCAmJiByZXF1ZXN0Q29udGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gc2NvcGUucnVuSW5TY29wZShyZXF1ZXN0Q29udGV4dCwgcHJvZHVjZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHByb2R1Y2VyLmNhbGwoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0luaXRpYWxpemFibGUuamF2YSBiL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0luaXRpYWxpemFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzhmNGMyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvSW5pdGlhbGl6YWJsZS5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50OworCisvKioKKyAqIEluaXRpYWxpemFibGUgSmVyc2V5IGNsaWVudC1zaWRlIGNvbXBvbmVudC4KKyAqIDxwPgorICogVGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgbWV0aG9kIHRoYXQgYWxsb3dzIHRvIHByZS1pbml0aWFsaXplIGNsaWVudC1zaWRlIGNvbXBvbmVudCdzIHJ1bnRpbWUgYW5kIHJ1bnRpbWUgY29uZmlndXJhdGlvbgorICogYWhlYWQgb2YgaXQncyBmaXJzdCB1c2UuIFRoZSBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5KZXJzZXlDbGllbnR9IGFuZAorICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5KZXJzZXlXZWJUYXJnZXR9IGNsYXNzZXMuCisgKiA8L3A+CisgKgorICogQHBhcmFtIDxUPiBpbml0aWFsaXphYmxlIHR5cGUuCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICogQHNpbmNlIDIuOAorICovCitwdWJsaWMgaW50ZXJmYWNlIEluaXRpYWxpemFibGU8VCBleHRlbmRzIEluaXRpYWxpemFibGU8VD4+IHsKKworICAgIC8qKgorICAgICAqIFByZS1pbml0aWFsaXplcyB0aGUgcnVudGltZSBhbmQgcnVudGltZSB7QGxpbmsgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb259IG9mIHRoaXMgY29tcG9uZW50CisgICAgICogaW4gb3JkZXIgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSBkdXJpbmcgdGhlIGZpcnN0IHJlcXVlc3QuCisgICAgICogPHA+CisgICAgICogT25jZSB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgbm8gb3RoZXIgbWV0aG9kIGltcGxlbWVudGluZyB7QGxpbmsgamF2YXgud3MucnMuY29yZS5Db25maWd1cmFibGV9IHNob3VsZCBiZSBjYWxsZWQKKyAgICAgKiBvbiB0aGlzIHByZSBpbml0aWFsaXplZCBjb21wb25lbnQsIG90aGVyd2lzZSB0aGUgaW5pdGlhbGl6ZWQgY2xpZW50IHJ1bnRpbWUgd2lsbCBiZSBkaXNjYXJkZWQgYW5kIHRoZSBjb25maWd1cmF0aW9uCisgICAgICogd2lsbCBjaGFuZ2UgYmFjayB0byB1bmluaXRpYWxpemVkLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gcHJlLWluaXRpYWxpemVkIEplcnNleSBjbGllbnQgY29tcG9uZW50LgorICAgICAqLworICAgIFQgcHJlSW5pdGlhbGl6ZSgpOworCisgICAgLyoqCisgICAgICogR2V0IGEgbGl2ZSB2aWV3IG9mIGFuIGludGVybmFsIGNsaWVudCBjb25maWd1cmF0aW9uIHN0YXRlIG9mIHRoaXMgaW5pdGlhbGl6YWJsZSBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gY29uZmlndXJhdGlvbiBsaXZlIHZpZXcgb2YgdGhlIGludGVybmFsIGNvbmZpZ3VyYXRpb24gc3RhdGUuCisgICAgICovCisgICAgQ2xpZW50Q29uZmlnIGdldENvbmZpZ3VyYXRpb24oKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0luamVjdGlvbk1hbmFnZXJDbGllbnRQcm92aWRlci5qYXZhIGIvY29yZS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvSW5qZWN0aW9uTWFuYWdlckNsaWVudFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdjOTRiYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0luamVjdGlvbk1hbmFnZXJDbGllbnRQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50OworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXNwb25zZUNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5JbmplY3Rpb25NYW5hZ2VyUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyU3VwcGxpZXI7CisKKy8qKgorICogRXh0ZW5zaW9uIG9mIHtAbGluayBJbmplY3Rpb25NYW5hZ2VyUHJvdmlkZXJ9IHdoaWNoIGNvbnRhaW5zIGhlbHBlciBzdGF0aWMgbWV0aG9kcworICogdGhhdCBleHRyYWN0IHtAbGluayBJbmplY3Rpb25NYW5hZ2VyfSBmcm9tIGNsaWVudCBzcGVjaWZpYyBKQVgtUlMgY29tcG9uZW50cy4KKyAqIDxwPgorICogU2VlIGphdmFkb2Mgb2Yge0BsaW5rIEluamVjdGlvbk1hbmFnZXJQcm92aWRlcn0gZm9yIG1vcmUgZGV0YWlscy4KKyAqIDwvcD4KKyAqCisgKiBAc2VlIEluamVjdGlvbk1hbmFnZXJQcm92aWRlcgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICogQHNpbmNlIDIuNgorICovCitwdWJsaWMgY2xhc3MgSW5qZWN0aW9uTWFuYWdlckNsaWVudFByb3ZpZGVyIGV4dGVuZHMgSW5qZWN0aW9uTWFuYWdlclByb3ZpZGVyIHsKKworICAgIC8qKgorICAgICAqIEV4dHJhY3QgYW5kIHJldHVybiBpbmplY3Rpb24gbWFuYWdlciBmcm9tIHtAbGluayBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdENvbnRleHQgY2xpZW50UmVxdWVzdENvbnRleHR9LgorICAgICAqIFRoZSBtZXRob2QgY2FuIGJlIHVzZWQgdG8gaW5qZWN0IGN1c3RvbSB0eXBlcyBpbnRvIGEge0BsaW5rIGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0RmlsdGVyfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGllbnRSZXF1ZXN0Q29udGV4dCBDbGllbnQgcmVxdWVzdCBjb250ZXh0LgorICAgICAqCisgICAgICogQHJldHVybiBpbmplY3Rpb24gbWFuYWdlci4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aGVuIHtAY29kZSBjbGllbnRSZXF1ZXN0Q29udGV4dH0gaXMgbm90IGEgZGVmYXVsdAorICAgICAqIEplcnNleSBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSBKZXJzZXkgYXMgYXJndW1lbnQgaW4gdGhlCisgICAgICoge0BsaW5rIGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0RmlsdGVyI2ZpbHRlcihqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdENvbnRleHQpfSBtZXRob2QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBJbmplY3Rpb25NYW5hZ2VyIGdldEluamVjdGlvbk1hbmFnZXIoQ2xpZW50UmVxdWVzdENvbnRleHQgY2xpZW50UmVxdWVzdENvbnRleHQpIHsKKyAgICAgICAgaWYgKCEoY2xpZW50UmVxdWVzdENvbnRleHQgaW5zdGFuY2VvZiBJbmplY3Rpb25NYW5hZ2VyU3VwcGxpZXIpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBMb2NhbGl6YXRpb25NZXNzYWdlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5FUlJPUl9TRVJWSUNFX0xPQ0FUT1JfUFJPVklERVJfSU5TVEFOQ0VfUkVRVUVTVChjbGllbnRSZXF1ZXN0Q29udGV4dC5nZXRDbGFzcygpLmdldE5hbWUoKSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoKEluamVjdGlvbk1hbmFnZXJTdXBwbGllcikgY2xpZW50UmVxdWVzdENvbnRleHQpLmdldEluamVjdGlvbk1hbmFnZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeHRyYWN0IGFuZCByZXR1cm4gaW5qZWN0aW9uIG1hbmFnZXIgZnJvbSB7QGxpbmsgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlc3BvbnNlQ29udGV4dCBjbGllbnRSZXNwb25zZUNvbnRleHR9LgorICAgICAqIFRoZSBtZXRob2QgY2FuIGJlIHVzZWQgdG8gaW5qZWN0IGN1c3RvbSB0eXBlcyBpbnRvIGEge0BsaW5rIGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXNwb25zZUZpbHRlcn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xpZW50UmVzcG9uc2VDb250ZXh0IENsaWVudCByZXNwb25zZSBjb250ZXh0LgorICAgICAqCisgICAgICogQHJldHVybiBpbmplY3Rpb24gbWFuYWdlci4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aGVuIHtAY29kZSBjbGllbnRSZXNwb25zZUNvbnRleHR9IGlzIG5vdCBhIGRlZmF1bHQKKyAgICAgKiBKZXJzZXkgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkgSmVyc2V5IGFzIGFyZ3VtZW50IGluIHRoZQorICAgICAqIHtAbGluayBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVzcG9uc2VGaWx0ZXIjZmlsdGVyKGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0Q29udGV4dCwgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlc3BvbnNlQ29udGV4dCl9CisgICAgICogbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgSW5qZWN0aW9uTWFuYWdlciBnZXRJbmplY3Rpb25NYW5hZ2VyKENsaWVudFJlc3BvbnNlQ29udGV4dCBjbGllbnRSZXNwb25zZUNvbnRleHQpIHsKKyAgICAgICAgaWYgKCEoY2xpZW50UmVzcG9uc2VDb250ZXh0IGluc3RhbmNlb2YgSW5qZWN0aW9uTWFuYWdlclN1cHBsaWVyKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgTG9jYWxpemF0aW9uTWVzc2FnZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRVJST1JfU0VSVklDRV9MT0NBVE9SX1BST1ZJREVSX0lOU1RBTkNFX1JFU1BPTlNFKGNsaWVudFJlc3BvbnNlQ29udGV4dC5nZXRDbGFzcygpLmdldE5hbWUoKSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoKEluamVjdGlvbk1hbmFnZXJTdXBwbGllcikgY2xpZW50UmVzcG9uc2VDb250ZXh0KS5nZXRJbmplY3Rpb25NYW5hZ2VyKCk7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0plcnNleUNsaWVudC5qYXZhIGIvY29yZS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvSmVyc2V5Q2xpZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk0ODI0ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0plcnNleUNsaWVudC5qYXZhCkBAIC0wLDAgKzEsNDQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudDsKKworaW1wb3J0IGphdmEubGFuZy5yZWYuUmVmZXJlbmNlOworaW1wb3J0IGphdmEubGFuZy5yZWYuUmVmZXJlbmNlUXVldWU7CitpbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkxpbmtlZEJsb2NraW5nRGVxdWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkxpbms7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgamF2YXgubmV0LnNzbC5Ib3N0bmFtZVZlcmlmaWVyOworaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMQ29udGV4dDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LlNzbENvbmZpZ3VyYXRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnNwaS5EZWZhdWx0U3NsQ29udGV4dFByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLlNlcnZpY2VGaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLlVuc2FmZVZhbHVlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5WYWx1ZXM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmEuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhLlByZWNvbmRpdGlvbnMuY2hlY2tTdGF0ZTsKKworLyoqCisgKiBKZXJzZXkgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQgSkFYLVJTIENsaWVudH0KKyAqIGNvbnRyYWN0LgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXlDbGllbnQgaW1wbGVtZW50cyBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50LCBJbml0aWFsaXphYmxlPEplcnNleUNsaWVudD4geworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKEplcnNleUNsaWVudC5jbGFzcy5nZXROYW1lKCkpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGVmYXVsdFNzbENvbnRleHRQcm92aWRlciBERUZBVUxUX1NTTF9DT05URVhUX1BST1ZJREVSID0gbmV3IERlZmF1bHRTc2xDb250ZXh0UHJvdmlkZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU1NMQ29udGV4dCBnZXREZWZhdWx0U3NsQ29udGV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiBTc2xDb25maWd1cmF0b3IuZ2V0RGVmYXVsdENvbnRleHQoKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIGZpbmFsIEF0b21pY0Jvb2xlYW4gY2xvc2VkRmxhZyA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNEZWZhdWx0U3NsQ29udGV4dDsKKyAgICBwcml2YXRlIGZpbmFsIENsaWVudENvbmZpZyBjb25maWc7CisgICAgcHJpdmF0ZSBmaW5hbCBIb3N0bmFtZVZlcmlmaWVyIGhvc3RuYW1lVmVyaWZpZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBVbnNhZmVWYWx1ZTxTU0xDb250ZXh0LCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24+IHNzbENvbnRleHQ7CisgICAgcHJpdmF0ZSBmaW5hbCBMaW5rZWRCbG9ja2luZ0RlcXVlPFdlYWtSZWZlcmVuY2U8SmVyc2V5Q2xpZW50LlNodXRkb3duSG9vaz4+IHNodXRkb3duSG9va3MgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMaW5rZWRCbG9ja2luZ0RlcXVlPFdlYWtSZWZlcmVuY2U8SmVyc2V5Q2xpZW50LlNodXRkb3duSG9vaz4+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBSZWZlcmVuY2VRdWV1ZTxKZXJzZXlDbGllbnQuU2h1dGRvd25Ib29rPiBzaFJlZmVyZW5jZVF1ZXVlID0gbmV3IFJlZmVyZW5jZVF1ZXVlPEplcnNleUNsaWVudC5TaHV0ZG93bkhvb2s+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlOworICAgIHByaXZhdGUgZmluYWwgU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlIHNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZTsKKworICAgIC8qKgorICAgICAqIENsaWVudCBpbnN0YW5jZSBzaHV0ZG93biBob29rLgorICAgICAqLworICAgIGludGVyZmFjZSBTaHV0ZG93bkhvb2sgeworICAgICAgICAvKioKKyAgICAgICAgICogSW52b2tlZCB3aGVuIHRoZSBjbGllbnQgaW5zdGFuY2UgaXMgY2xvc2VkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25TaHV0ZG93bigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBKZXJzZXkgY2xpZW50IGluc3RhbmNlIHVzaW5nIGEgZGVmYXVsdCBjb25maWd1cmF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBKZXJzZXlDbGllbnQoKSB7CisgICAgICAgIHRoaXMobnVsbCwgKFVuc2FmZVZhbHVlPFNTTENvbnRleHQsIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbj4pIG51bGwsIG51bGwsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBKZXJzZXkgY2xpZW50IGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZyAgICAgamVyc2V5IGNsaWVudCBjb25maWd1cmF0aW9uLgorICAgICAqIEBwYXJhbSBzc2xDb250ZXh0IGplcnNleSBjbGllbnQgU1NMIGNvbnRleHQuCisgICAgICogQHBhcmFtIHZlcmlmaWVyICAgamVyc2V5IGNsaWVudCBob3N0IG5hbWUgdmVyaWZpZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIEplcnNleUNsaWVudChmaW5hbCBDb25maWd1cmF0aW9uIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNTTENvbnRleHQgc3NsQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEhvc3RuYW1lVmVyaWZpZXIgdmVyaWZpZXIpIHsKKworICAgICAgICB0aGlzKGNvbmZpZywgc3NsQ29udGV4dCwgdmVyaWZpZXIsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBKZXJzZXkgY2xpZW50IGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZyAgICAgICAgICAgICAgICAgICAgamVyc2V5IGNsaWVudCBjb25maWd1cmF0aW9uLgorICAgICAqIEBwYXJhbSBzc2xDb250ZXh0ICAgICAgICAgICAgICAgIGplcnNleSBjbGllbnQgU1NMIGNvbnRleHQuCisgICAgICogQHBhcmFtIHZlcmlmaWVyICAgICAgICAgICAgICAgICAgamVyc2V5IGNsaWVudCBob3N0IG5hbWUgdmVyaWZpZXIuCisgICAgICogQHBhcmFtIGRlZmF1bHRTc2xDb250ZXh0UHJvdmlkZXIgZGVmYXVsdCBTU0wgY29udGV4dCBwcm92aWRlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSmVyc2V5Q2xpZW50KGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU1NMQ29udGV4dCBzc2xDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSG9zdG5hbWVWZXJpZmllciB2ZXJpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIERlZmF1bHRTc2xDb250ZXh0UHJvdmlkZXIgZGVmYXVsdFNzbENvbnRleHRQcm92aWRlcikgeworICAgICAgICB0aGlzKGNvbmZpZywgc3NsQ29udGV4dCA9PSBudWxsID8gbnVsbCA6IFZhbHVlcy51bnNhZmUoc3NsQ29udGV4dCksIHZlcmlmaWVyLAorICAgICAgICAgICAgIGRlZmF1bHRTc2xDb250ZXh0UHJvdmlkZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBKZXJzZXkgY2xpZW50IGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZyAgICAgICAgICAgICBqZXJzZXkgY2xpZW50IGNvbmZpZ3VyYXRpb24uCisgICAgICogQHBhcmFtIHNzbENvbnRleHRQcm92aWRlciBqZXJzZXkgY2xpZW50IFNTTCBjb250ZXh0IHByb3ZpZGVyLgorICAgICAqIEBwYXJhbSB2ZXJpZmllciAgICAgICAgICAgamVyc2V5IGNsaWVudCBob3N0IG5hbWUgdmVyaWZpZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIEplcnNleUNsaWVudChmaW5hbCBDb25maWd1cmF0aW9uIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFVuc2FmZVZhbHVlPFNTTENvbnRleHQsIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbj4gc3NsQ29udGV4dFByb3ZpZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSG9zdG5hbWVWZXJpZmllciB2ZXJpZmllcikgeworICAgICAgICB0aGlzKGNvbmZpZywgc3NsQ29udGV4dFByb3ZpZGVyLCB2ZXJpZmllciwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IEplcnNleSBjbGllbnQgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uZmlnICAgICAgICAgICAgICAgICAgICBqZXJzZXkgY2xpZW50IGNvbmZpZ3VyYXRpb24uCisgICAgICogQHBhcmFtIHNzbENvbnRleHQgICAgICAgICAgICAgICAgamVyc2V5IGNsaWVudCBTU0wgY29udGV4dC4KKyAgICAgKiBAcGFyYW0gdmVyaWZpZXIgICAgICAgICAgICAgICAgICBqZXJzZXkgY2xpZW50IGhvc3QgbmFtZSB2ZXJpZmllci4KKyAgICAgKiBAcGFyYW0gZGVmYXVsdFNzbENvbnRleHRQcm92aWRlciBkZWZhdWx0IFNTTCBjb250ZXh0IHByb3ZpZGVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBKZXJzZXlDbGllbnQoZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTU0xDb250ZXh0IHNzbENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBIb3N0bmFtZVZlcmlmaWVyIHZlcmlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRGVmYXVsdFNzbENvbnRleHRQcm92aWRlciBkZWZhdWx0U3NsQ29udGV4dFByb3ZpZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSBzY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UpIHsKKyAgICAgICAgdGhpcyhjb25maWcsIHNzbENvbnRleHQgPT0gbnVsbCA/IG51bGwgOiBWYWx1ZXMudW5zYWZlKHNzbENvbnRleHQpLCB2ZXJpZmllciwKKyAgICAgICAgICAgICBkZWZhdWx0U3NsQ29udGV4dFByb3ZpZGVyLCBleGVjdXRvclNlcnZpY2UsIHNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IEplcnNleSBjbGllbnQgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uZmlnICAgICAgICAgICAgIGplcnNleSBjbGllbnQgY29uZmlndXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gc3NsQ29udGV4dFByb3ZpZGVyIGplcnNleSBjbGllbnQgU1NMIGNvbnRleHQgcHJvdmlkZXIuCisgICAgICogQHBhcmFtIHZlcmlmaWVyICAgICAgICAgICBqZXJzZXkgY2xpZW50IGhvc3QgbmFtZSB2ZXJpZmllci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSmVyc2V5Q2xpZW50KGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVW5zYWZlVmFsdWU8U1NMQ29udGV4dCwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uPiBzc2xDb250ZXh0UHJvdmlkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBIb3N0bmFtZVZlcmlmaWVyIHZlcmlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSBzY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UpIHsKKyAgICAgICAgdGhpcyhjb25maWcsIHNzbENvbnRleHRQcm92aWRlciwgdmVyaWZpZXIsIG51bGwsIGV4ZWN1dG9yU2VydmljZSwgc2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgSmVyc2V5IGNsaWVudCBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25maWcgICAgICAgICAgICAgICAgICAgIGplcnNleSBjbGllbnQgY29uZmlndXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gc3NsQ29udGV4dFByb3ZpZGVyICAgICAgICBqZXJzZXkgY2xpZW50IFNTTCBjb250ZXh0IHByb3ZpZGVyLiBOb24ge0Bjb2RlIG51bGx9IHByb3ZpZGVyIGlzIGV4cGVjdGVkIHRvCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vbi1kZWZhdWx0IHZhbHVlLgorICAgICAqIEBwYXJhbSB2ZXJpZmllciAgICAgICAgICAgICAgICAgIGplcnNleSBjbGllbnQgaG9zdCBuYW1lIHZlcmlmaWVyLgorICAgICAqIEBwYXJhbSBkZWZhdWx0U3NsQ29udGV4dFByb3ZpZGVyIGRlZmF1bHQgU1NMIGNvbnRleHQgcHJvdmlkZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIEplcnNleUNsaWVudChmaW5hbCBDb25maWd1cmF0aW9uIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFVuc2FmZVZhbHVlPFNTTENvbnRleHQsIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbj4gc3NsQ29udGV4dFByb3ZpZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSG9zdG5hbWVWZXJpZmllciB2ZXJpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIERlZmF1bHRTc2xDb250ZXh0UHJvdmlkZXIgZGVmYXVsdFNzbENvbnRleHRQcm92aWRlcikgeworICAgICAgICB0aGlzKGNvbmZpZywgc3NsQ29udGV4dFByb3ZpZGVyLCB2ZXJpZmllciwgZGVmYXVsdFNzbENvbnRleHRQcm92aWRlciwgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEplcnNleUNsaWVudChmaW5hbCBDb25maWd1cmF0aW9uIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFVuc2FmZVZhbHVlPFNTTENvbnRleHQsIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbj4gc3NsQ29udGV4dFByb3ZpZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSG9zdG5hbWVWZXJpZmllciB2ZXJpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIERlZmF1bHRTc2xDb250ZXh0UHJvdmlkZXIgZGVmYXVsdFNzbENvbnRleHRQcm92aWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvclNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2Ugc2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlKSB7CisgICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnID09IG51bGwgPyBuZXcgQ2xpZW50Q29uZmlnKHRoaXMpIDogbmV3IENsaWVudENvbmZpZyh0aGlzLCBjb25maWcpOworCisgICAgICAgIGlmIChzc2xDb250ZXh0UHJvdmlkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5pc0RlZmF1bHRTc2xDb250ZXh0ID0gdHJ1ZTsKKworICAgICAgICAgICAgaWYgKGRlZmF1bHRTc2xDb250ZXh0UHJvdmlkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRoaXMuc3NsQ29udGV4dCA9IGNyZWF0ZUxhenlTc2xDb250ZXh0KGRlZmF1bHRTc2xDb250ZXh0UHJvdmlkZXIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBEZWZhdWx0U3NsQ29udGV4dFByb3ZpZGVyIGxvb2tlZFVwU3NsQ29udGV4dFByb3ZpZGVyOworCisgICAgICAgICAgICAgICAgZmluYWwgSXRlcmF0b3I8RGVmYXVsdFNzbENvbnRleHRQcm92aWRlcj4gaXRlcmF0b3IgPQorICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZUZpbmRlci5maW5kKERlZmF1bHRTc2xDb250ZXh0UHJvdmlkZXIuY2xhc3MpLml0ZXJhdG9yKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvb2tlZFVwU3NsQ29udGV4dFByb3ZpZGVyID0gaXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGxvb2tlZFVwU3NsQ29udGV4dFByb3ZpZGVyID0gREVGQVVMVF9TU0xfQ09OVEVYVF9QUk9WSURFUjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0aGlzLnNzbENvbnRleHQgPSBjcmVhdGVMYXp5U3NsQ29udGV4dChsb29rZWRVcFNzbENvbnRleHRQcm92aWRlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLmlzRGVmYXVsdFNzbENvbnRleHQgPSBmYWxzZTsKKyAgICAgICAgICAgIHRoaXMuc3NsQ29udGV4dCA9IFZhbHVlcy5sYXp5KHNzbENvbnRleHRQcm92aWRlcik7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmhvc3RuYW1lVmVyaWZpZXIgPSB2ZXJpZmllcjsKKyAgICAgICAgdGhpcy5leGVjdXRvclNlcnZpY2UgPSBleGVjdXRvclNlcnZpY2U7CisgICAgICAgIHRoaXMuc2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlID0gc2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICBpZiAoY2xvc2VkRmxhZy5jb21wYXJlQW5kU2V0KGZhbHNlLCB0cnVlKSkgeworICAgICAgICAgICAgcmVsZWFzZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlbGVhc2UoKSB7CisgICAgICAgIFJlZmVyZW5jZTxTaHV0ZG93bkhvb2s+IGxpc3RlbmVyUmVmOworICAgICAgICB3aGlsZSAoKGxpc3RlbmVyUmVmID0gc2h1dGRvd25Ib29rcy5wb2xsRmlyc3QoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgSmVyc2V5Q2xpZW50LlNodXRkb3duSG9vayBsaXN0ZW5lciA9IGxpc3RlbmVyUmVmLmdldCgpOworICAgICAgICAgICAgaWYgKGxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5vblNodXRkb3duKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5XQVJOSU5HLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9TSFVURE9XTkhPT0tfQ0xPU0UobGlzdGVuZXJSZWYuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpLCB0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFVuc2FmZVZhbHVlPFNTTENvbnRleHQsIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbj4gY3JlYXRlTGF6eVNzbENvbnRleHQoZmluYWwgRGVmYXVsdFNzbENvbnRleHRQcm92aWRlciBwcm92aWRlcikgeworICAgICAgICByZXR1cm4gVmFsdWVzLmxhenkobmV3IFVuc2FmZVZhbHVlPFNTTENvbnRleHQsIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbj4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTU0xDb250ZXh0IGdldCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcHJvdmlkZXIuZ2V0RGVmYXVsdFNzbENvbnRleHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgYSBuZXcgY2xpZW50IHNodXRkb3duIGhvb2suCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2h1dGRvd25Ib29rIGNsaWVudCBzaHV0ZG93biBob29rLgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gdm9pZCByZWdpc3RlclNodXRkb3duSG9vayhmaW5hbCBTaHV0ZG93bkhvb2sgc2h1dGRvd25Ib29rKSB7CisgICAgICAgIGNoZWNrTm90Q2xvc2VkKCk7CisgICAgICAgIHNodXRkb3duSG9va3MucHVzaChuZXcgV2Vha1JlZmVyZW5jZTxKZXJzZXlDbGllbnQuU2h1dGRvd25Ib29rPihzaHV0ZG93bkhvb2ssIHNoUmVmZXJlbmNlUXVldWUpKTsKKyAgICAgICAgY2xlYW5VcFNodXRkb3duSG9va3MoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGVhbiB1cCBzaHV0ZG93biBob29rcyB0aGF0IGhhdmUgYmVlbiBnYXJiYWdlIGNvbGxlY3RlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY2xlYW5VcFNodXRkb3duSG9va3MoKSB7CisKKyAgICAgICAgUmVmZXJlbmNlPD8gZXh0ZW5kcyBTaHV0ZG93bkhvb2s+IHJlZmVyZW5jZTsKKworICAgICAgICB3aGlsZSAoKHJlZmVyZW5jZSA9IHNoUmVmZXJlbmNlUXVldWUucG9sbCgpKSAhPSBudWxsKSB7CisKKyAgICAgICAgICAgIHNodXRkb3duSG9va3MucmVtb3ZlKHJlZmVyZW5jZSk7CisKKyAgICAgICAgICAgIGZpbmFsIFNodXRkb3duSG9vayBzaHV0ZG93bkhvb2sgPSByZWZlcmVuY2UuZ2V0KCk7CisgICAgICAgICAgICBpZiAoc2h1dGRvd25Ib29rICE9IG51bGwpIHsgLy8gY2xvc2UgdGhpcyBvbmUgb2ZmIGlmIHN0aWxsIGFjY2Vzc2libGUKKyAgICAgICAgICAgICAgICBzaHV0ZG93bkhvb2sub25TaHV0ZG93bigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UgZ2V0RGVmYXVsdFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSgpIHsKKyAgICAgICAgcmV0dXJuIEV4ZWN1dG9ycy5uZXdTY2hlZHVsZWRUaHJlYWRQb29sKDgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIGNsaWVudCBzdGF0ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGN1cnJlbnQge0Bjb2RlIEplcnNleUNsaWVudH0gaW5zdGFuY2UgaXMgY2xvc2VkLCBvdGhlcndpc2Uge0Bjb2RlIGZhbHNlfS4KKyAgICAgKgorICAgICAqIEBzZWUgI2Nsb3NlKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Nsb3NlZCgpIHsKKyAgICAgICAgcmV0dXJuIGNsb3NlZEZsYWcuZ2V0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgdGhhdCB0aGUgY2xpZW50IGluc3RhbmNlIGhhcyBub3QgYmVlbiBjbG9zZWQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpbiBjYXNlIHRoZSBjbGllbnQgaW5zdGFuY2UgaGFzIGJlZW4gY2xvc2VkIGFscmVhZHkuCisgICAgICovCisgICAgdm9pZCBjaGVja05vdENsb3NlZCgpIHsKKyAgICAgICAgY2hlY2tTdGF0ZSghY2xvc2VkRmxhZy5nZXQoKSwgTG9jYWxpemF0aW9uTWVzc2FnZXMuQ0xJRU5UX0lOU1RBTkNFX0NMT1NFRCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgaW5mb3JtYXRpb24gYWJvdXQgdXNlZCB7QGxpbmsgU1NMQ29udGV4dH0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSB3aGVuIHVzZWQge0Bjb2RlIFNTTENvbnRleHR9IGlzIGFjcXVpcmVkIGZyb20ge0BsaW5rIFNzbENvbmZpZ3VyYXRvciNnZXREZWZhdWx0Q29udGV4dCgpfSwKKyAgICAgKiB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHRTc2xDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gaXNEZWZhdWx0U3NsQ29udGV4dDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmVyc2V5V2ViVGFyZ2V0IHRhcmdldChmaW5hbCBTdHJpbmcgdXJpKSB7CisgICAgICAgIGNoZWNrTm90Q2xvc2VkKCk7CisgICAgICAgIGNoZWNrTm90TnVsbCh1cmksIExvY2FsaXphdGlvbk1lc3NhZ2VzLkNMSUVOVF9VUklfVEVNUExBVEVfTlVMTCgpKTsKKyAgICAgICAgcmV0dXJuIG5ldyBKZXJzZXlXZWJUYXJnZXQodXJpLCB0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmVyc2V5V2ViVGFyZ2V0IHRhcmdldChmaW5hbCBVUkkgdXJpKSB7CisgICAgICAgIGNoZWNrTm90Q2xvc2VkKCk7CisgICAgICAgIGNoZWNrTm90TnVsbCh1cmksIExvY2FsaXphdGlvbk1lc3NhZ2VzLkNMSUVOVF9VUklfTlVMTCgpKTsKKyAgICAgICAgcmV0dXJuIG5ldyBKZXJzZXlXZWJUYXJnZXQodXJpLCB0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmVyc2V5V2ViVGFyZ2V0IHRhcmdldChmaW5hbCBVcmlCdWlsZGVyIHVyaUJ1aWxkZXIpIHsKKyAgICAgICAgY2hlY2tOb3RDbG9zZWQoKTsKKyAgICAgICAgY2hlY2tOb3ROdWxsKHVyaUJ1aWxkZXIsIExvY2FsaXphdGlvbk1lc3NhZ2VzLkNMSUVOVF9VUklfQlVJTERFUl9OVUxMKCkpOworICAgICAgICByZXR1cm4gbmV3IEplcnNleVdlYlRhcmdldCh1cmlCdWlsZGVyLCB0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmVyc2V5V2ViVGFyZ2V0IHRhcmdldChmaW5hbCBMaW5rIGxpbmspIHsKKyAgICAgICAgY2hlY2tOb3RDbG9zZWQoKTsKKyAgICAgICAgY2hlY2tOb3ROdWxsKGxpbmssIExvY2FsaXphdGlvbk1lc3NhZ2VzLkNMSUVOVF9UQVJHRVRfTElOS19OVUxMKCkpOworICAgICAgICByZXR1cm4gbmV3IEplcnNleVdlYlRhcmdldChsaW5rLCB0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmVyc2V5SW52b2NhdGlvbi5CdWlsZGVyIGludm9jYXRpb24oZmluYWwgTGluayBsaW5rKSB7CisgICAgICAgIGNoZWNrTm90Q2xvc2VkKCk7CisgICAgICAgIGNoZWNrTm90TnVsbChsaW5rLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5DTElFTlRfSU5WT0NBVElPTl9MSU5LX05VTEwoKSk7CisgICAgICAgIGZpbmFsIEplcnNleVdlYlRhcmdldCB0ID0gbmV3IEplcnNleVdlYlRhcmdldChsaW5rLCB0aGlzKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGFjY2VwdFR5cGUgPSBsaW5rLmdldFR5cGUoKTsKKyAgICAgICAgcmV0dXJuIChhY2NlcHRUeXBlICE9IG51bGwpID8gdC5yZXF1ZXN0KGFjY2VwdFR5cGUpIDogdC5yZXF1ZXN0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEplcnNleUNsaWVudCByZWdpc3RlcihmaW5hbCBDbGFzczw/PiBwcm92aWRlckNsYXNzKSB7CisgICAgICAgIGNoZWNrTm90Q2xvc2VkKCk7CisgICAgICAgIGNvbmZpZy5yZWdpc3Rlcihwcm92aWRlckNsYXNzKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEplcnNleUNsaWVudCByZWdpc3RlcihmaW5hbCBPYmplY3QgcHJvdmlkZXIpIHsKKyAgICAgICAgY2hlY2tOb3RDbG9zZWQoKTsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKHByb3ZpZGVyKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEplcnNleUNsaWVudCByZWdpc3RlcihmaW5hbCBDbGFzczw/PiBwcm92aWRlckNsYXNzLCBmaW5hbCBpbnQgYmluZGluZ1ByaW9yaXR5KSB7CisgICAgICAgIGNoZWNrTm90Q2xvc2VkKCk7CisgICAgICAgIGNvbmZpZy5yZWdpc3Rlcihwcm92aWRlckNsYXNzLCBiaW5kaW5nUHJpb3JpdHkpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmVyc2V5Q2xpZW50IHJlZ2lzdGVyKGZpbmFsIENsYXNzPD8+IHByb3ZpZGVyQ2xhc3MsIGZpbmFsIENsYXNzPD8+Li4uIGNvbnRyYWN0cykgeworICAgICAgICBjaGVja05vdENsb3NlZCgpOworICAgICAgICBjb25maWcucmVnaXN0ZXIocHJvdmlkZXJDbGFzcywgY29udHJhY3RzKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEplcnNleUNsaWVudCByZWdpc3RlcihmaW5hbCBDbGFzczw/PiBwcm92aWRlckNsYXNzLCBmaW5hbCBNYXA8Q2xhc3M8Pz4sIEludGVnZXI+IGNvbnRyYWN0cykgeworICAgICAgICBjaGVja05vdENsb3NlZCgpOworICAgICAgICBjb25maWcucmVnaXN0ZXIocHJvdmlkZXJDbGFzcywgY29udHJhY3RzKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEplcnNleUNsaWVudCByZWdpc3RlcihmaW5hbCBPYmplY3QgcHJvdmlkZXIsIGZpbmFsIGludCBiaW5kaW5nUHJpb3JpdHkpIHsKKyAgICAgICAgY2hlY2tOb3RDbG9zZWQoKTsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKHByb3ZpZGVyLCBiaW5kaW5nUHJpb3JpdHkpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmVyc2V5Q2xpZW50IHJlZ2lzdGVyKGZpbmFsIE9iamVjdCBwcm92aWRlciwgZmluYWwgQ2xhc3M8Pz4uLi4gY29udHJhY3RzKSB7CisgICAgICAgIGNoZWNrTm90Q2xvc2VkKCk7CisgICAgICAgIGNvbmZpZy5yZWdpc3Rlcihwcm92aWRlciwgY29udHJhY3RzKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEplcnNleUNsaWVudCByZWdpc3RlcihmaW5hbCBPYmplY3QgcHJvdmlkZXIsIGZpbmFsIE1hcDxDbGFzczw/PiwgSW50ZWdlcj4gY29udHJhY3RzKSB7CisgICAgICAgIGNoZWNrTm90Q2xvc2VkKCk7CisgICAgICAgIGNvbmZpZy5yZWdpc3Rlcihwcm92aWRlciwgY29udHJhY3RzKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEplcnNleUNsaWVudCBwcm9wZXJ0eShmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIGNoZWNrTm90Q2xvc2VkKCk7CisgICAgICAgIGNvbmZpZy5wcm9wZXJ0eShuYW1lLCB2YWx1ZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDbGllbnRDb25maWcgZ2V0Q29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgY2hlY2tOb3RDbG9zZWQoKTsKKyAgICAgICAgcmV0dXJuIGNvbmZpZy5nZXRDb25maWd1cmF0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNTTENvbnRleHQgZ2V0U3NsQ29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIHNzbENvbnRleHQuZ2V0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEhvc3RuYW1lVmVyaWZpZXIgZ2V0SG9zdG5hbWVWZXJpZmllcigpIHsKKyAgICAgICAgcmV0dXJuIGhvc3RuYW1lVmVyaWZpZXI7CisgICAgfQorCisgICAgcHVibGljIEV4ZWN1dG9yU2VydmljZSBnZXRFeGVjdXRvclNlcnZpY2UoKSB7CisgICAgICAgIHJldHVybiBleGVjdXRvclNlcnZpY2U7CisgICAgfQorCisgICAgcHVibGljIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSBnZXRTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UoKSB7CisgICAgICAgIHJldHVybiBzY2hlZHVsZWRFeGVjdXRvclNlcnZpY2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEplcnNleUNsaWVudCBwcmVJbml0aWFsaXplKCkgeworICAgICAgICBjb25maWcucHJlSW5pdGlhbGl6ZSgpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9KZXJzZXlDbGllbnRCdWlsZGVyLmphdmEgYi9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9KZXJzZXlDbGllbnRCdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAxZThhMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0plcnNleUNsaWVudEJ1aWxkZXIuamF2YQpAQCAtMCwwICsxLDI0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQ7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKKworaW1wb3J0IGphdmF4Lm5ldC5zc2wuSG9zdG5hbWVWZXJpZmllcjsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLlNTTENvbnRleHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5Tc2xDb25maWd1cmF0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5VbnNhZmVWYWx1ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uVmFsdWVzOworCisvKioKKyAqIEplcnNleSBwcm92aWRlciBvZiB7QGxpbmsgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXIgSkFYLVJTIGNsaWVudCBidWlsZGVyfS4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSmVyc2V5Q2xpZW50QnVpbGRlciBleHRlbmRzIENsaWVudEJ1aWxkZXIgeworCisgICAgcHJpdmF0ZSBmaW5hbCBDbGllbnRDb25maWcgY29uZmlnOworICAgIHByaXZhdGUgSG9zdG5hbWVWZXJpZmllciBob3N0bmFtZVZlcmlmaWVyOworICAgIHByaXZhdGUgU3NsQ29uZmlndXJhdG9yIHNzbENvbmZpZ3VyYXRvcjsKKyAgICBwcml2YXRlIFNTTENvbnRleHQgc3NsQ29udGV4dDsKKyAgICBwcml2YXRlIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvclNlcnZpY2U7CisgICAgcHJpdmF0ZSBTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2Ugc2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGN1c3RvbS1jb25maWd1cmVkIHtAbGluayBKZXJzZXlDbGllbnR9IGluc3RhbmNlLgorICAgICAqCisgICAgICogQHJldHVybiBuZXcgY29uZmlndXJlZCBKZXJzZXkgY2xpZW50IGluc3RhbmNlLgorICAgICAqIEBzaW5jZSAyLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEplcnNleUNsaWVudCBjcmVhdGVDbGllbnQoKSB7CisgICAgICAgIHJldHVybiBuZXcgSmVyc2V5Q2xpZW50QnVpbGRlcigpLmJ1aWxkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGN1c3RvbS1jb25maWd1cmVkIHtAbGluayBKZXJzZXlDbGllbnR9IGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gZGF0YSB1c2VkIHRvIHByb3ZpZGUgaW5pdGlhbCBjb25maWd1cmF0aW9uIGZvciB0aGUgbmV3CisgICAgICogICAgICAgICAgICAgICAgICAgICAgSmVyc2V5IGNsaWVudCBpbnN0YW5jZS4KKyAgICAgKiBAcmV0dXJuIG5ldyBjb25maWd1cmVkIEplcnNleSBjbGllbnQgaW5zdGFuY2UuCisgICAgICogQHNpbmNlIDIuNQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgSmVyc2V5Q2xpZW50IGNyZWF0ZUNsaWVudChDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKZXJzZXlDbGllbnRCdWlsZGVyKCkud2l0aENvbmZpZyhjb25maWd1cmF0aW9uKS5idWlsZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgSmVyc2V5IGNsaWVudCBidWlsZGVyIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBKZXJzZXlDbGllbnRCdWlsZGVyKCkgeworICAgICAgICB0aGlzLmNvbmZpZyA9IG5ldyBDbGllbnRDb25maWcoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmVyc2V5Q2xpZW50QnVpbGRlciBzc2xDb250ZXh0KFNTTENvbnRleHQgc3NsQ29udGV4dCkgeworICAgICAgICBpZiAoc3NsQ29udGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuTlVMTF9TU0xfQ09OVEVYVCgpKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnNzbENvbnRleHQgPSBzc2xDb250ZXh0OworICAgICAgICBzc2xDb25maWd1cmF0b3IgPSBudWxsOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmVyc2V5Q2xpZW50QnVpbGRlciBrZXlTdG9yZShLZXlTdG9yZSBrZXlTdG9yZSwgY2hhcltdIHBhc3N3b3JkKSB7CisgICAgICAgIGlmIChrZXlTdG9yZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuTlVMTF9LRVlTVE9SRSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocGFzc3dvcmQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLk5VTExfS0VZU1RPUkVfUEFTV09SRCgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3NsQ29uZmlndXJhdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgIHNzbENvbmZpZ3VyYXRvciA9IFNzbENvbmZpZ3VyYXRvci5uZXdJbnN0YW5jZSgpOworICAgICAgICB9CisgICAgICAgIHNzbENvbmZpZ3VyYXRvci5rZXlTdG9yZShrZXlTdG9yZSk7CisgICAgICAgIHNzbENvbmZpZ3VyYXRvci5rZXlQYXNzd29yZChwYXNzd29yZCk7CisgICAgICAgIHNzbENvbnRleHQgPSBudWxsOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmVyc2V5Q2xpZW50QnVpbGRlciB0cnVzdFN0b3JlKEtleVN0b3JlIHRydXN0U3RvcmUpIHsKKyAgICAgICAgaWYgKHRydXN0U3RvcmUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLk5VTExfVFJVU1RTVE9SRSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3NsQ29uZmlndXJhdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgIHNzbENvbmZpZ3VyYXRvciA9IFNzbENvbmZpZ3VyYXRvci5uZXdJbnN0YW5jZSgpOworICAgICAgICB9CisgICAgICAgIHNzbENvbmZpZ3VyYXRvci50cnVzdFN0b3JlKHRydXN0U3RvcmUpOworICAgICAgICBzc2xDb250ZXh0ID0gbnVsbDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEplcnNleUNsaWVudEJ1aWxkZXIgaG9zdG5hbWVWZXJpZmllcihIb3N0bmFtZVZlcmlmaWVyIGhvc3RuYW1lVmVyaWZpZXIpIHsKKyAgICAgICAgdGhpcy5ob3N0bmFtZVZlcmlmaWVyID0gaG9zdG5hbWVWZXJpZmllcjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENsaWVudEJ1aWxkZXIgZXhlY3V0b3JTZXJ2aWNlKEV4ZWN1dG9yU2VydmljZSBleGVjdXRvclNlcnZpY2UpIHsKKyAgICAgICAgdGhpcy5leGVjdXRvclNlcnZpY2UgPSBleGVjdXRvclNlcnZpY2U7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDbGllbnRCdWlsZGVyIHNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZShTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2Ugc2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlKSB7CisgICAgICAgIHRoaXMuc2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlID0gc2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2xpZW50QnVpbGRlciBjb25uZWN0VGltZW91dChsb25nIHRpbWVvdXQsIFRpbWVVbml0IHVuaXQpIHsKKyAgICAgICAgaWYgKHRpbWVvdXQgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOZWdhdGl2ZSB0aW1lb3V0LiIpOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5wcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLkNPTk5FQ1RfVElNRU9VVCwgTWF0aC50b0ludEV4YWN0KHVuaXQudG9NaWxsaXModGltZW91dCkpKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENsaWVudEJ1aWxkZXIgcmVhZFRpbWVvdXQobG9uZyB0aW1lb3V0LCBUaW1lVW5pdCB1bml0KSB7CisgICAgICAgIGlmICh0aW1lb3V0IDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTmVnYXRpdmUgdGltZW91dC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMucHJvcGVydHkoQ2xpZW50UHJvcGVydGllcy5SRUFEX1RJTUVPVVQsIE1hdGgudG9JbnRFeGFjdCh1bml0LnRvTWlsbGlzKHRpbWVvdXQpKSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBKZXJzZXlDbGllbnQgYnVpbGQoKSB7CisgICAgICAgIGlmIChzc2xDb250ZXh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSmVyc2V5Q2xpZW50KGNvbmZpZywgc3NsQ29udGV4dCwgaG9zdG5hbWVWZXJpZmllciwgbnVsbCwgZXhlY3V0b3JTZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlKTsKKyAgICAgICAgfSBlbHNlIGlmIChzc2xDb25maWd1cmF0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgU3NsQ29uZmlndXJhdG9yIHNzbENvbmZpZ3VyYXRvckNvcHkgPSBzc2xDb25maWd1cmF0b3IuY29weSgpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBKZXJzZXlDbGllbnQoCisgICAgICAgICAgICAgICAgICAgIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgVmFsdWVzLmxhenkobmV3IFVuc2FmZVZhbHVlPFNTTENvbnRleHQsIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbj4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBTU0xDb250ZXh0IGdldCgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3NsQ29uZmlndXJhdG9yQ29weS5jcmVhdGVTU0xDb250ZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgICAgICBob3N0bmFtZVZlcmlmaWVyLCBleGVjdXRvclNlcnZpY2UsIHNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEplcnNleUNsaWVudChjb25maWcsIChVbnNhZmVWYWx1ZTxTU0xDb250ZXh0LCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24+KSBudWxsLCBob3N0bmFtZVZlcmlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0b3JTZXJ2aWNlLCBzY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENsaWVudENvbmZpZyBnZXRDb25maWd1cmF0aW9uKCkgeworICAgICAgICByZXR1cm4gY29uZmlnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBKZXJzZXlDbGllbnRCdWlsZGVyIHByb3BlcnR5KFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgdGhpcy5jb25maWcucHJvcGVydHkobmFtZSwgdmFsdWUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmVyc2V5Q2xpZW50QnVpbGRlciByZWdpc3RlcihDbGFzczw/PiBjb21wb25lbnRDbGFzcykgeworICAgICAgICB0aGlzLmNvbmZpZy5yZWdpc3Rlcihjb21wb25lbnRDbGFzcyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBKZXJzZXlDbGllbnRCdWlsZGVyIHJlZ2lzdGVyKENsYXNzPD8+IGNvbXBvbmVudENsYXNzLCBpbnQgcHJpb3JpdHkpIHsKKyAgICAgICAgdGhpcy5jb25maWcucmVnaXN0ZXIoY29tcG9uZW50Q2xhc3MsIHByaW9yaXR5KTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEplcnNleUNsaWVudEJ1aWxkZXIgcmVnaXN0ZXIoQ2xhc3M8Pz4gY29tcG9uZW50Q2xhc3MsIENsYXNzPD8+Li4uIGNvbnRyYWN0cykgeworICAgICAgICB0aGlzLmNvbmZpZy5yZWdpc3Rlcihjb21wb25lbnRDbGFzcywgY29udHJhY3RzKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEplcnNleUNsaWVudEJ1aWxkZXIgcmVnaXN0ZXIoQ2xhc3M8Pz4gY29tcG9uZW50Q2xhc3MsIE1hcDxDbGFzczw/PiwgSW50ZWdlcj4gY29udHJhY3RzKSB7CisgICAgICAgIHRoaXMuY29uZmlnLnJlZ2lzdGVyKGNvbXBvbmVudENsYXNzLCBjb250cmFjdHMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmVyc2V5Q2xpZW50QnVpbGRlciByZWdpc3RlcihPYmplY3QgY29tcG9uZW50KSB7CisgICAgICAgIHRoaXMuY29uZmlnLnJlZ2lzdGVyKGNvbXBvbmVudCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBKZXJzZXlDbGllbnRCdWlsZGVyIHJlZ2lzdGVyKE9iamVjdCBjb21wb25lbnQsIGludCBwcmlvcml0eSkgeworICAgICAgICB0aGlzLmNvbmZpZy5yZWdpc3Rlcihjb21wb25lbnQsIHByaW9yaXR5KTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEplcnNleUNsaWVudEJ1aWxkZXIgcmVnaXN0ZXIoT2JqZWN0IGNvbXBvbmVudCwgQ2xhc3M8Pz4uLi4gY29udHJhY3RzKSB7CisgICAgICAgIHRoaXMuY29uZmlnLnJlZ2lzdGVyKGNvbXBvbmVudCwgY29udHJhY3RzKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEplcnNleUNsaWVudEJ1aWxkZXIgcmVnaXN0ZXIoT2JqZWN0IGNvbXBvbmVudCwgTWFwPENsYXNzPD8+LCBJbnRlZ2VyPiBjb250cmFjdHMpIHsKKyAgICAgICAgdGhpcy5jb25maWcucmVnaXN0ZXIoY29tcG9uZW50LCBjb250cmFjdHMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmVyc2V5Q2xpZW50QnVpbGRlciB3aXRoQ29uZmlnKENvbmZpZ3VyYXRpb24gY29uZmlnKSB7CisgICAgICAgIHRoaXMuY29uZmlnLmxvYWRGcm9tKGNvbmZpZyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0plcnNleUNvbXBsZXRpb25TdGFnZVJ4SW52b2tlci5qYXZhIGIvY29yZS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvSmVyc2V5Q29tcGxldGlvblN0YWdlUnhJbnZva2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg1MzFlZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0plcnNleUNvbXBsZXRpb25TdGFnZVJ4SW52b2tlci5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50OworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29tcGxldGFibGVGdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29tcGxldGlvblN0YWdlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5Db21wbGV0aW9uU3RhZ2VSeEludm9rZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuSW52b2NhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkdlbmVyaWNUeXBlOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIFJlYWN0aXZlIEludm9rZXIgZm9yIHtAY29kZSBDb21wbGV0aW9uU3RhZ2V9LgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICogQHNpbmNlIDIuMjYKKyAqLworcHVibGljIGNsYXNzIEplcnNleUNvbXBsZXRpb25TdGFnZVJ4SW52b2tlciBleHRlbmRzIEFic3RyYWN0UnhJbnZva2VyPENvbXBsZXRpb25TdGFnZT4gaW1wbGVtZW50cyBDb21wbGV0aW9uU3RhZ2VSeEludm9rZXIgeworCisgICAgSmVyc2V5Q29tcGxldGlvblN0YWdlUnhJbnZva2VyKEludm9jYXRpb24uQnVpbGRlciBidWlsZGVyLCBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3IpIHsKKyAgICAgICAgc3VwZXIoYnVpbGRlciwgZXhlY3V0b3IpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gQ29tcGxldGlvblN0YWdlPFQ+IG1ldGhvZChmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgRW50aXR5PD8+IGVudGl0eSwgZmluYWwgQ2xhc3M8VD4gcmVzcG9uc2VUeXBlKSB7CisgICAgICAgIGZpbmFsIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvclNlcnZpY2UgPSBnZXRFeGVjdXRvclNlcnZpY2UoKTsKKworICAgICAgICByZXR1cm4gZXhlY3V0b3JTZXJ2aWNlID09IG51bGwKKyAgICAgICAgICAgICAgICA/IENvbXBsZXRhYmxlRnV0dXJlLnN1cHBseUFzeW5jKCgpIC0+IGdldFN5bmNJbnZva2VyKCkubWV0aG9kKG5hbWUsIGVudGl0eSwgcmVzcG9uc2VUeXBlKSkKKyAgICAgICAgICAgICAgICA6IENvbXBsZXRhYmxlRnV0dXJlLnN1cHBseUFzeW5jKCgpIC0+IGdldFN5bmNJbnZva2VyKCkubWV0aG9kKG5hbWUsIGVudGl0eSwgcmVzcG9uc2VUeXBlKSwgZXhlY3V0b3JTZXJ2aWNlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFQ+IENvbXBsZXRpb25TdGFnZTxUPiBtZXRob2QoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIEVudGl0eTw/PiBlbnRpdHksIGZpbmFsIEdlbmVyaWNUeXBlPFQ+IHJlc3BvbnNlVHlwZSkgeworICAgICAgICBmaW5hbCBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlID0gZ2V0RXhlY3V0b3JTZXJ2aWNlKCk7CisKKyAgICAgICAgcmV0dXJuIGV4ZWN1dG9yU2VydmljZSA9PSBudWxsCisgICAgICAgICAgICAgICAgPyBDb21wbGV0YWJsZUZ1dHVyZS5zdXBwbHlBc3luYygoKSAtPiBnZXRTeW5jSW52b2tlcigpLm1ldGhvZChuYW1lLCBlbnRpdHksIHJlc3BvbnNlVHlwZSkpCisgICAgICAgICAgICAgICAgOiBDb21wbGV0YWJsZUZ1dHVyZS5zdXBwbHlBc3luYygoKSAtPiBnZXRTeW5jSW52b2tlcigpLm1ldGhvZChuYW1lLCBlbnRpdHksIHJlc3BvbnNlVHlwZSksIGV4ZWN1dG9yU2VydmljZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvSmVyc2V5SW52b2NhdGlvbi5qYXZhIGIvY29yZS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvSmVyc2V5SW52b2NhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZGZkZGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9KZXJzZXlJbnZvY2F0aW9uLmphdmEKQEAgLTAsMCArMSwxMTE3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYW5jZWxsYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29tcGxldGFibGVGdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5CYWRSZXF1ZXN0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLkNsaWVudEVycm9yRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLkZvcmJpZGRlbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5JbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLk5vdEFjY2VwdGFibGVFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuTm90QWxsb3dlZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5Ob3RBdXRob3JpemVkRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLk5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLk5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLlJlZGlyZWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLlNlcnZlckVycm9yRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLlNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ29tcGxldGlvblN0YWdlUnhJbnZva2VyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50Lkludm9jYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50Lkludm9jYXRpb25DYWxsYmFjazsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuUmVzcG9uc2VQcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5SeEludm9rZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LlJ4SW52b2tlclByb3ZpZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5TeW5jSW52b2tlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNhY2hlQ29udHJvbDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvb2tpZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkdlbmVyaWNUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLk1hcFByb3BlcnRpZXNEZWxlZ2F0ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuUHJvdmlkZXJzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUHJvZHVjZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5Qcm9wZXJ0aWVzSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUmVmbGVjdGlvbkhlbHBlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLmludGVybmFsLlJlcXVlc3RTY29wZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXI7CisKKy8qKgorICogSmVyc2V5IGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBqYXZheC53cy5ycy5jbGllbnQuSW52b2NhdGlvbiBKQVgtUlMgY2xpZW50LXNpZGUKKyAqIHJlcXVlc3QgaW52b2NhdGlvbn0gY29udHJhY3QuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEplcnNleUludm9jYXRpb24gaW1wbGVtZW50cyBqYXZheC53cy5ycy5jbGllbnQuSW52b2NhdGlvbiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihKZXJzZXlJbnZvY2F0aW9uLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBwcml2YXRlIGZpbmFsIENsaWVudFJlcXVlc3QgcmVxdWVzdENvbnRleHQ7CisgICAgLy8gQ29weSByZXF1ZXN0IGNvbnRleHQgd2hlbiBpbnZva2Ugb3Igc3VibWl0IG1ldGhvZHMgYXJlIGludm9rZWQuCisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGNvcHlSZXF1ZXN0Q29udGV4dDsKKworICAgIHByaXZhdGUgSmVyc2V5SW52b2NhdGlvbihmaW5hbCBCdWlsZGVyIGJ1aWxkZXIpIHsKKyAgICAgICAgdGhpcyhidWlsZGVyLCBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBKZXJzZXlJbnZvY2F0aW9uKGZpbmFsIEJ1aWxkZXIgYnVpbGRlciwgZmluYWwgYm9vbGVhbiBjb3B5UmVxdWVzdENvbnRleHQpIHsKKyAgICAgICAgdmFsaWRhdGVIdHRwTWV0aG9kQW5kRW50aXR5KGJ1aWxkZXIucmVxdWVzdENvbnRleHQpOworCisgICAgICAgIHRoaXMucmVxdWVzdENvbnRleHQgPSBuZXcgQ2xpZW50UmVxdWVzdChidWlsZGVyLnJlcXVlc3RDb250ZXh0KTsKKyAgICAgICAgdGhpcy5jb3B5UmVxdWVzdENvbnRleHQgPSBjb3B5UmVxdWVzdENvbnRleHQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBlbnVtIEVudGl0eVByZXNlbmNlIHsKKyAgICAgICAgTVVTVF9CRV9OVUxMLAorICAgICAgICBNVVNUX0JFX1BSRVNFTlQsCisgICAgICAgIE9QVElPTkFMCisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgRW50aXR5UHJlc2VuY2U+IE1FVEhPRFMgPSBpbml0aWFsaXplTWFwKCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBFbnRpdHlQcmVzZW5jZT4gaW5pdGlhbGl6ZU1hcCgpIHsKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgRW50aXR5UHJlc2VuY2U+IG1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKworICAgICAgICBtYXAucHV0KCJERUxFVEUiLCBFbnRpdHlQcmVzZW5jZS5NVVNUX0JFX05VTEwpOworICAgICAgICBtYXAucHV0KCJHRVQiLCBFbnRpdHlQcmVzZW5jZS5NVVNUX0JFX05VTEwpOworICAgICAgICBtYXAucHV0KCJIRUFEIiwgRW50aXR5UHJlc2VuY2UuTVVTVF9CRV9OVUxMKTsKKyAgICAgICAgbWFwLnB1dCgiT1BUSU9OUyIsIEVudGl0eVByZXNlbmNlLk1VU1RfQkVfTlVMTCk7CisgICAgICAgIG1hcC5wdXQoIlBBVENIIiwgRW50aXR5UHJlc2VuY2UuTVVTVF9CRV9QUkVTRU5UKTsKKyAgICAgICAgbWFwLnB1dCgiUE9TVCIsIEVudGl0eVByZXNlbmNlLk9QVElPTkFMKTsgLy8gd2UgYWxsb3cgdG8gcG9zdCBudWxsIGluc3RlYWQgb2YgZW50aXR5CisgICAgICAgIG1hcC5wdXQoIlBVVCIsIEVudGl0eVByZXNlbmNlLk1VU1RfQkVfUFJFU0VOVCk7CisgICAgICAgIG1hcC5wdXQoIlRSQUNFIiwgRW50aXR5UHJlc2VuY2UuTVVTVF9CRV9OVUxMKTsKKyAgICAgICAgcmV0dXJuIG1hcDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdmFsaWRhdGVIdHRwTWV0aG9kQW5kRW50aXR5KGZpbmFsIENsaWVudFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICBib29sZWFuIHN1cHByZXNzRXhjZXB0aW9uczsKKyAgICAgICAgc3VwcHJlc3NFeGNlcHRpb25zID0gUHJvcGVydGllc0hlbHBlci5pc1Byb3BlcnR5KAorICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuU1VQUFJFU1NfSFRUUF9DT01QTElBTkNFX1ZBTElEQVRJT04pKTsKKworICAgICAgICBmaW5hbCBPYmplY3Qgc2hjdlByb3BlcnR5ID0gcmVxdWVzdC5nZXRQcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLlNVUFBSRVNTX0hUVFBfQ09NUExJQU5DRV9WQUxJREFUSU9OKTsKKyAgICAgICAgaWYgKHNoY3ZQcm9wZXJ0eSAhPSBudWxsKSB7IC8vIG92ZXJyaWRlIGdsb2JhbCBjb25maWd1cmF0aW9uIHdpdGggcmVxdWVzdC1zcGVjaWZpYworICAgICAgICAgICAgc3VwcHJlc3NFeGNlcHRpb25zID0gUHJvcGVydGllc0hlbHBlci5pc1Byb3BlcnR5KHNoY3ZQcm9wZXJ0eSk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBTdHJpbmcgbWV0aG9kID0gcmVxdWVzdC5nZXRNZXRob2QoKTsKKworICAgICAgICBmaW5hbCBFbnRpdHlQcmVzZW5jZSBlbnRpdHlQcmVzZW5jZSA9IE1FVEhPRFMuZ2V0KG1ldGhvZC50b1VwcGVyQ2FzZSgpKTsKKyAgICAgICAgaWYgKGVudGl0eVByZXNlbmNlID09IEVudGl0eVByZXNlbmNlLk1VU1RfQkVfTlVMTCAmJiByZXF1ZXN0Lmhhc0VudGl0eSgpKSB7CisgICAgICAgICAgICBpZiAoc3VwcHJlc3NFeGNlcHRpb25zKSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLndhcm5pbmcoTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfSFRUUF9NRVRIT0RfRU5USVRZX05PVF9OVUxMKG1ldGhvZCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX0hUVFBfTUVUSE9EX0VOVElUWV9OT1RfTlVMTChtZXRob2QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChlbnRpdHlQcmVzZW5jZSA9PSBFbnRpdHlQcmVzZW5jZS5NVVNUX0JFX1BSRVNFTlQgJiYgIXJlcXVlc3QuaGFzRW50aXR5KCkpIHsKKyAgICAgICAgICAgIGlmIChzdXBwcmVzc0V4Y2VwdGlvbnMpIHsKKyAgICAgICAgICAgICAgICBMT0dHRVIud2FybmluZyhMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9IVFRQX01FVEhPRF9FTlRJVFlfTlVMTChtZXRob2QpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9IVFRQX01FVEhPRF9FTlRJVFlfTlVMTChtZXRob2QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEplcnNleS1zcGVjaWZpYyB7QGxpbmsgamF2YXgud3MucnMuY2xpZW50Lkludm9jYXRpb24uQnVpbGRlciBjbGllbnQgaW52b2NhdGlvbiBidWlsZGVyfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXIgaW1wbGVtZW50cyBqYXZheC53cy5ycy5jbGllbnQuSW52b2NhdGlvbi5CdWlsZGVyIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIENsaWVudFJlcXVlc3QgcmVxdWVzdENvbnRleHQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBuZXcgSmVyc2V5LXNwZWNpZmljIGNsaWVudCBpbnZvY2F0aW9uIGJ1aWxkZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB1cmkgICAgICAgICAgIGludm9rZWQgcmVxdWVzdCBVUkkuCisgICAgICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uIEplcnNleSBjbGllbnQgY29uZmlndXJhdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBCdWlsZGVyKGZpbmFsIFVSSSB1cmksIGZpbmFsIENsaWVudENvbmZpZyBjb25maWd1cmF0aW9uKSB7CisgICAgICAgICAgICB0aGlzLnJlcXVlc3RDb250ZXh0ID0gbmV3IENsaWVudFJlcXVlc3QodXJpLCBjb25maWd1cmF0aW9uLCBuZXcgTWFwUHJvcGVydGllc0RlbGVnYXRlKCkpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIG11dGFibGUgcmVxdWVzdCBjb250ZXh0IHRvIGJlIGludm9rZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gbXV0YWJsZSByZXF1ZXN0IGNvbnRleHQgdG8gYmUgaW52b2tlZC4KKyAgICAgICAgICovCisgICAgICAgIENsaWVudFJlcXVlc3QgcmVxdWVzdCgpIHsKKyAgICAgICAgICAgIHJldHVybiByZXF1ZXN0Q29udGV4dDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBzdG9yZUVudGl0eShmaW5hbCBFbnRpdHk8Pz4gZW50aXR5KSB7CisgICAgICAgICAgICBpZiAoZW50aXR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC52YXJpYW50KGVudGl0eS5nZXRWYXJpYW50KCkpOworICAgICAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LnNldEVudGl0eShlbnRpdHkuZ2V0RW50aXR5KCkpOworICAgICAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LnNldEVudGl0eUFubm90YXRpb25zKGVudGl0eS5nZXRBbm5vdGF0aW9ucygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSmVyc2V5SW52b2NhdGlvbiBidWlsZChmaW5hbCBTdHJpbmcgbWV0aG9kKSB7CisgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5zZXRNZXRob2QobWV0aG9kKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSmVyc2V5SW52b2NhdGlvbih0aGlzLCB0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSmVyc2V5SW52b2NhdGlvbiBidWlsZChmaW5hbCBTdHJpbmcgbWV0aG9kLCBmaW5hbCBFbnRpdHk8Pz4gZW50aXR5KSB7CisgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5zZXRNZXRob2QobWV0aG9kKTsKKyAgICAgICAgICAgIHN0b3JlRW50aXR5KGVudGl0eSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IEplcnNleUludm9jYXRpb24odGhpcywgdHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEplcnNleUludm9jYXRpb24gYnVpbGRHZXQoKSB7CisgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5zZXRNZXRob2QoIkdFVCIpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBKZXJzZXlJbnZvY2F0aW9uKHRoaXMsIHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBKZXJzZXlJbnZvY2F0aW9uIGJ1aWxkRGVsZXRlKCkgeworICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuc2V0TWV0aG9kKCJERUxFVEUiKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSmVyc2V5SW52b2NhdGlvbih0aGlzLCB0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSmVyc2V5SW52b2NhdGlvbiBidWlsZFBvc3QoZmluYWwgRW50aXR5PD8+IGVudGl0eSkgeworICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuc2V0TWV0aG9kKCJQT1NUIik7CisgICAgICAgICAgICBzdG9yZUVudGl0eShlbnRpdHkpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBKZXJzZXlJbnZvY2F0aW9uKHRoaXMsIHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBKZXJzZXlJbnZvY2F0aW9uIGJ1aWxkUHV0KGZpbmFsIEVudGl0eTw/PiBlbnRpdHkpIHsKKyAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LnNldE1ldGhvZCgiUFVUIik7CisgICAgICAgICAgICBzdG9yZUVudGl0eShlbnRpdHkpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBKZXJzZXlJbnZvY2F0aW9uKHRoaXMsIHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBqYXZheC53cy5ycy5jbGllbnQuQXN5bmNJbnZva2VyIGFzeW5jKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBBc3luY0ludm9rZXIodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgYWNjZXB0KGZpbmFsIFN0cmluZy4uLiBtZWRpYVR5cGVzKSB7CisgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5hY2NlcHQobWVkaWFUeXBlcyk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnVpbGRlciBhY2NlcHQoZmluYWwgTWVkaWFUeXBlLi4uIG1lZGlhVHlwZXMpIHsKKyAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LmFjY2VwdChtZWRpYVR5cGVzKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBJbnZvY2F0aW9uLkJ1aWxkZXIgYWNjZXB0RW5jb2RpbmcoZmluYWwgU3RyaW5nLi4uIGVuY29kaW5ncykgeworICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuZ2V0SGVhZGVycygpLmFkZEFsbChIdHRwSGVhZGVycy5BQ0NFUFRfRU5DT0RJTkcsIChPYmplY3RbXSkgZW5jb2RpbmdzKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGFjY2VwdExhbmd1YWdlKGZpbmFsIExvY2FsZS4uLiBsb2NhbGVzKSB7CisgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5hY2NlcHRMYW5ndWFnZShsb2NhbGVzKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGFjY2VwdExhbmd1YWdlKGZpbmFsIFN0cmluZy4uLiBsb2NhbGVzKSB7CisgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5hY2NlcHRMYW5ndWFnZShsb2NhbGVzKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGNvb2tpZShmaW5hbCBDb29raWUgY29va2llKSB7CisgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5jb29raWUoY29va2llKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGNvb2tpZShmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5jb29raWUobmV3IENvb2tpZShuYW1lLCB2YWx1ZSkpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgY2FjaGVDb250cm9sKGZpbmFsIENhY2hlQ29udHJvbCBjYWNoZUNvbnRyb2wpIHsKKyAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LmNhY2hlQ29udHJvbChjYWNoZUNvbnRyb2wpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgaGVhZGVyKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBoZWFkZXJzID0gcmVxdWVzdENvbnRleHQuZ2V0SGVhZGVycygpOworCisgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGhlYWRlcnMucmVtb3ZlKG5hbWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBoZWFkZXJzLmFkZChuYW1lLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChIdHRwSGVhZGVycy5VU0VSX0FHRU5ULmVxdWFsc0lnbm9yZUNhc2UobmFtZSkpIHsKKyAgICAgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5pZ25vcmVVc2VyQWdlbnQodmFsdWUgPT0gbnVsbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGhlYWRlcnMoZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGhlYWRlcnMpIHsKKyAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LnJlcGxhY2VIZWFkZXJzKGhlYWRlcnMpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldCgpIHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBtZXRob2QoIkdFVCIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyA8VD4gVCBnZXQoZmluYWwgQ2xhc3M8VD4gcmVzcG9uc2VUeXBlKSB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIG1ldGhvZCgiR0VUIiwgcmVzcG9uc2VUeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgPFQ+IFQgZ2V0KGZpbmFsIEdlbmVyaWNUeXBlPFQ+IHJlc3BvbnNlVHlwZSkgdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBtZXRob2QoIkdFVCIsIHJlc3BvbnNlVHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHB1dChmaW5hbCBFbnRpdHk8Pz4gZW50aXR5KSB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbWV0aG9kKCJQVVQiLCBlbnRpdHkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyA8VD4gVCBwdXQoZmluYWwgRW50aXR5PD8+IGVudGl0eSwgZmluYWwgQ2xhc3M8VD4gcmVzcG9uc2VUeXBlKQorICAgICAgICAgICAgICAgIHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbWV0aG9kKCJQVVQiLCBlbnRpdHksIHJlc3BvbnNlVHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIDxUPiBUIHB1dChmaW5hbCBFbnRpdHk8Pz4gZW50aXR5LCBmaW5hbCBHZW5lcmljVHlwZTxUPiByZXNwb25zZVR5cGUpCisgICAgICAgICAgICAgICAgdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBtZXRob2QoIlBVVCIsIGVudGl0eSwgcmVzcG9uc2VUeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgcG9zdChmaW5hbCBFbnRpdHk8Pz4gZW50aXR5KSB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbWV0aG9kKCJQT1NUIiwgZW50aXR5KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgPFQ+IFQgcG9zdChmaW5hbCBFbnRpdHk8Pz4gZW50aXR5LCBmaW5hbCBDbGFzczxUPiByZXNwb25zZVR5cGUpCisgICAgICAgICAgICAgICAgdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBtZXRob2QoIlBPU1QiLCBlbnRpdHksIHJlc3BvbnNlVHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIDxUPiBUIHBvc3QoZmluYWwgRW50aXR5PD8+IGVudGl0eSwgZmluYWwgR2VuZXJpY1R5cGU8VD4gcmVzcG9uc2VUeXBlKQorICAgICAgICAgICAgICAgIHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbWV0aG9kKCJQT1NUIiwgZW50aXR5LCByZXNwb25zZVR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBkZWxldGUoKSB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbWV0aG9kKCJERUxFVEUiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgPFQ+IFQgZGVsZXRlKGZpbmFsIENsYXNzPFQ+IHJlc3BvbnNlVHlwZSkgdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBtZXRob2QoIkRFTEVURSIsIHJlc3BvbnNlVHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIDxUPiBUIGRlbGV0ZShmaW5hbCBHZW5lcmljVHlwZTxUPiByZXNwb25zZVR5cGUpIHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbWV0aG9kKCJERUxFVEUiLCByZXNwb25zZVR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBoZWFkKCkgdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIG1ldGhvZCgiSEVBRCIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBvcHRpb25zKCkgdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIG1ldGhvZCgiT1BUSU9OUyIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyA8VD4gVCBvcHRpb25zKGZpbmFsIENsYXNzPFQ+IHJlc3BvbnNlVHlwZSkgdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBtZXRob2QoIk9QVElPTlMiLCByZXNwb25zZVR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyA8VD4gVCBvcHRpb25zKGZpbmFsIEdlbmVyaWNUeXBlPFQ+IHJlc3BvbnNlVHlwZSkgdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBtZXRob2QoIk9QVElPTlMiLCByZXNwb25zZVR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSB0cmFjZSgpIHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBtZXRob2QoIlRSQUNFIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIDxUPiBUIHRyYWNlKGZpbmFsIENsYXNzPFQ+IHJlc3BvbnNlVHlwZSkgdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBtZXRob2QoIlRSQUNFIiwgcmVzcG9uc2VUeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgPFQ+IFQgdHJhY2UoZmluYWwgR2VuZXJpY1R5cGU8VD4gcmVzcG9uc2VUeXBlKSB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIG1ldGhvZCgiVFJBQ0UiLCByZXNwb25zZVR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBtZXRob2QoZmluYWwgU3RyaW5nIG5hbWUpIHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LnNldE1ldGhvZChuYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSmVyc2V5SW52b2NhdGlvbih0aGlzKS5pbnZva2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgPFQ+IFQgbWV0aG9kKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBDbGFzczxUPiByZXNwb25zZVR5cGUpIHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAocmVzcG9uc2VUeXBlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlJFU1BPTlNFX1RZUEVfSVNfTlVMTCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LnNldE1ldGhvZChuYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSmVyc2V5SW52b2NhdGlvbih0aGlzKS5pbnZva2UocmVzcG9uc2VUeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgPFQ+IFQgbWV0aG9kKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBHZW5lcmljVHlwZTxUPiByZXNwb25zZVR5cGUpCisgICAgICAgICAgICAgICAgdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChyZXNwb25zZVR5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuUkVTUE9OU0VfVFlQRV9JU19OVUxMKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuc2V0TWV0aG9kKG5hbWUpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBKZXJzZXlJbnZvY2F0aW9uKHRoaXMpLmludm9rZShyZXNwb25zZVR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBtZXRob2QoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIEVudGl0eTw/PiBlbnRpdHkpIHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LnNldE1ldGhvZChuYW1lKTsKKyAgICAgICAgICAgIHN0b3JlRW50aXR5KGVudGl0eSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IEplcnNleUludm9jYXRpb24odGhpcykuaW52b2tlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIDxUPiBUIG1ldGhvZChmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgRW50aXR5PD8+IGVudGl0eSwgZmluYWwgQ2xhc3M8VD4gcmVzcG9uc2VUeXBlKQorICAgICAgICAgICAgICAgIHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAocmVzcG9uc2VUeXBlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlJFU1BPTlNFX1RZUEVfSVNfTlVMTCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LnNldE1ldGhvZChuYW1lKTsKKyAgICAgICAgICAgIHN0b3JlRW50aXR5KGVudGl0eSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IEplcnNleUludm9jYXRpb24odGhpcykuaW52b2tlKHJlc3BvbnNlVHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIDxUPiBUIG1ldGhvZChmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgRW50aXR5PD8+IGVudGl0eSwgZmluYWwgR2VuZXJpY1R5cGU8VD4gcmVzcG9uc2VUeXBlKQorICAgICAgICAgICAgICAgIHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAocmVzcG9uc2VUeXBlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlJFU1BPTlNFX1RZUEVfSVNfTlVMTCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LnNldE1ldGhvZChuYW1lKTsKKyAgICAgICAgICAgIHN0b3JlRW50aXR5KGVudGl0eSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IEplcnNleUludm9jYXRpb24odGhpcykuaW52b2tlKHJlc3BvbnNlVHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgcHJvcGVydHkoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuc2V0UHJvcGVydHkobmFtZSwgdmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENvbXBsZXRpb25TdGFnZVJ4SW52b2tlciByeCgpIHsKKyAgICAgICAgICAgIEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyIGluc3RhbmNlID0gdGhpcy5yZXF1ZXN0Q29udGV4dC5nZXRJbmplY3Rpb25NYW5hZ2VyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRJbnN0YW5jZShFeGVjdXRvclNlcnZpY2VQcm92aWRlci5jbGFzcyk7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgSmVyc2V5Q29tcGxldGlvblN0YWdlUnhJbnZva2VyKHRoaXMsIGluc3RhbmNlLmdldEV4ZWN1dG9yU2VydmljZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgPFQgZXh0ZW5kcyBSeEludm9rZXI+IFQgcngoQ2xhc3M8VD4gY2xhenopIHsKKyAgICAgICAgICAgIEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyIGluc3RhbmNlID0gdGhpcy5yZXF1ZXN0Q29udGV4dC5nZXRJbmplY3Rpb25NYW5hZ2VyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRJbnN0YW5jZShFeGVjdXRvclNlcnZpY2VQcm92aWRlci5jbGFzcyk7CisKKyAgICAgICAgICAgIHJldHVybiBjcmVhdGVSeEludm9rZXIoY2xhenosIGluc3RhbmNlLmdldEV4ZWN1dG9yU2VydmljZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgPFQgZXh0ZW5kcyBSeEludm9rZXI+IFQgcngoQ2xhc3M8VD4gY2xhenosIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvclNlcnZpY2UpIHsKKyAgICAgICAgICAgIGlmIChleGVjdXRvclNlcnZpY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuTlVMTF9JTlBVVF9QQVJBTUVURVIoImV4ZWN1dG9yU2VydmljZSIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJ4SW52b2tlcihjbGF6eiwgZXhlY3V0b3JTZXJ2aWNlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUge0BsaW5rIFJ4SW52b2tlcn0gZnJvbSBwcm92aWRlZCB7QGNvZGUgUnhJbnZva2VyfSBzdWJjbGFzcy4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoZSBtZXRob2QgZG9lcyBhIGxvb2t1cCBmb3Ige0BsaW5rIFJ4SW52b2tlclByb3ZpZGVyfSwgd2hpY2ggcHJvdmlkZXMgZ2l2ZW4ge0Bjb2RlIFJ4SW52b2tlcn0gc3ViY2xhc3MKKyAgICAgICAgICogYW5kIGlmIGZvdW5kLCBjYWxscyB7QGxpbmsgUnhJbnZva2VyUHJvdmlkZXIjZ2V0UnhJbnZva2VyKFN5bmNJbnZva2VyLCBFeGVjdXRvclNlcnZpY2UpfQorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY2xhenogICAgICAgICAgIHtAY29kZSBSeEludm9rZXJ9IHN1YmNsYXNzIHRvIGJlIGNyZWF0ZWQuCisgICAgICAgICAqIEBwYXJhbSBleGVjdXRvclNlcnZpY2UgdG8gYmUgcGFzc2VkIHRvIHRoZSBmYWN0b3J5IG1ldGhvZCBpbnZvY2F0aW9uLgorICAgICAgICAgKiBAcGFyYW0gPFQ+ICAgICAgICAgICAgIHtAY29kZSBSeEludm9rZXJ9IHN1YmNsYXNzIHRvIGJlIHJldHVybmVkLgorICAgICAgICAgKiBAcmV0dXJuIHRocmVhZCBzYWZlIGluc3RhbmNlIG9mIHtAY29kZSBSeEludm9rZXJ9IHN1YmNsYXNzLgorICAgICAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB3aGVuIHByb3ZpZGVyIGZvciBnaXZlbiBjbGFzcyBpcyBub3QgcmVnaXN0ZXJlZC4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgPFQgZXh0ZW5kcyBSeEludm9rZXI+IFQgY3JlYXRlUnhJbnZva2VyKENsYXNzPD8gZXh0ZW5kcyBSeEludm9rZXI+IGNsYXp6LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlKSB7CisgICAgICAgICAgICBpZiAoY2xhenogPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuTlVMTF9JTlBVVF9QQVJBTUVURVIoImNsYXp6IikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBJdGVyYWJsZTxSeEludm9rZXJQcm92aWRlcj4gYWxsUHJvdmlkZXJzID0gUHJvdmlkZXJzLmdldEFsbFByb3ZpZGVycygKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0Q29udGV4dC5nZXRJbmplY3Rpb25NYW5hZ2VyKCksCisgICAgICAgICAgICAgICAgICAgIFJ4SW52b2tlclByb3ZpZGVyLmNsYXNzKTsKKworICAgICAgICAgICAgZm9yIChSeEludm9rZXJQcm92aWRlciBpbnZva2VyUHJvdmlkZXIgOiBhbGxQcm92aWRlcnMpIHsKKyAgICAgICAgICAgICAgICBpZiAoaW52b2tlclByb3ZpZGVyLmlzUHJvdmlkZXJGb3IoY2xhenopKSB7CisKKyAgICAgICAgICAgICAgICAgICAgUnhJbnZva2VyIHJ4SW52b2tlciA9IGludm9rZXJQcm92aWRlci5nZXRSeEludm9rZXIodGhpcywgZXhlY3V0b3JTZXJ2aWNlKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAocnhJbnZva2VyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuQ0xJRU5UX1JYX1BST1ZJREVSX05VTEwoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFQpIHJ4SW52b2tlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIExvY2FsaXphdGlvbk1lc3NhZ2VzLkNMSUVOVF9SWF9QUk9WSURFUl9OT1RfUkVHSVNURVJFRChjbGF6ei5nZXRTaW1wbGVOYW1lKCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFzeW5jSW52b2tlciBpbXBsZW1lbnRzIGphdmF4LndzLnJzLmNsaWVudC5Bc3luY0ludm9rZXIgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgSmVyc2V5SW52b2NhdGlvbi5CdWlsZGVyIGJ1aWxkZXI7CisKKyAgICAgICAgcHJpdmF0ZSBBc3luY0ludm9rZXIoZmluYWwgSmVyc2V5SW52b2NhdGlvbi5CdWlsZGVyIHJlcXVlc3QpIHsKKyAgICAgICAgICAgIHRoaXMuYnVpbGRlciA9IHJlcXVlc3Q7CisgICAgICAgICAgICB0aGlzLmJ1aWxkZXIucmVxdWVzdENvbnRleHQuc2V0QXN5bmNocm9ub3VzKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBGdXR1cmU8UmVzcG9uc2U+IGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtZXRob2QoIkdFVCIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyA8VD4gRnV0dXJlPFQ+IGdldChmaW5hbCBDbGFzczxUPiByZXNwb25zZVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBtZXRob2QoIkdFVCIsIHJlc3BvbnNlVHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIDxUPiBGdXR1cmU8VD4gZ2V0KGZpbmFsIEdlbmVyaWNUeXBlPFQ+IHJlc3BvbnNlVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIG1ldGhvZCgiR0VUIiwgcmVzcG9uc2VUeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgPFQ+IEZ1dHVyZTxUPiBnZXQoZmluYWwgSW52b2NhdGlvbkNhbGxiYWNrPFQ+IGNhbGxiYWNrKSB7CisgICAgICAgICAgICByZXR1cm4gbWV0aG9kKCJHRVQiLCBjYWxsYmFjayk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEZ1dHVyZTxSZXNwb25zZT4gcHV0KGZpbmFsIEVudGl0eTw/PiBlbnRpdHkpIHsKKyAgICAgICAgICAgIHJldHVybiBtZXRob2QoIlBVVCIsIGVudGl0eSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIDxUPiBGdXR1cmU8VD4gcHV0KGZpbmFsIEVudGl0eTw/PiBlbnRpdHksIGZpbmFsIENsYXNzPFQ+IHJlc3BvbnNlVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIG1ldGhvZCgiUFVUIiwgZW50aXR5LCByZXNwb25zZVR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyA8VD4gRnV0dXJlPFQ+IHB1dChmaW5hbCBFbnRpdHk8Pz4gZW50aXR5LCBmaW5hbCBHZW5lcmljVHlwZTxUPiByZXNwb25zZVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBtZXRob2QoIlBVVCIsIGVudGl0eSwgcmVzcG9uc2VUeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgPFQ+IEZ1dHVyZTxUPiBwdXQoZmluYWwgRW50aXR5PD8+IGVudGl0eSwgZmluYWwgSW52b2NhdGlvbkNhbGxiYWNrPFQ+IGNhbGxiYWNrKSB7CisgICAgICAgICAgICByZXR1cm4gbWV0aG9kKCJQVVQiLCBlbnRpdHksIGNhbGxiYWNrKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRnV0dXJlPFJlc3BvbnNlPiBwb3N0KGZpbmFsIEVudGl0eTw/PiBlbnRpdHkpIHsKKyAgICAgICAgICAgIHJldHVybiBtZXRob2QoIlBPU1QiLCBlbnRpdHkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyA8VD4gRnV0dXJlPFQ+IHBvc3QoZmluYWwgRW50aXR5PD8+IGVudGl0eSwgZmluYWwgQ2xhc3M8VD4gcmVzcG9uc2VUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gbWV0aG9kKCJQT1NUIiwgZW50aXR5LCByZXNwb25zZVR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyA8VD4gRnV0dXJlPFQ+IHBvc3QoZmluYWwgRW50aXR5PD8+IGVudGl0eSwgZmluYWwgR2VuZXJpY1R5cGU8VD4gcmVzcG9uc2VUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gbWV0aG9kKCJQT1NUIiwgZW50aXR5LCByZXNwb25zZVR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyA8VD4gRnV0dXJlPFQ+IHBvc3QoZmluYWwgRW50aXR5PD8+IGVudGl0eSwgZmluYWwgSW52b2NhdGlvbkNhbGxiYWNrPFQ+IGNhbGxiYWNrKSB7CisgICAgICAgICAgICByZXR1cm4gbWV0aG9kKCJQT1NUIiwgZW50aXR5LCBjYWxsYmFjayk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEZ1dHVyZTxSZXNwb25zZT4gZGVsZXRlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1ldGhvZCgiREVMRVRFIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIDxUPiBGdXR1cmU8VD4gZGVsZXRlKGZpbmFsIENsYXNzPFQ+IHJlc3BvbnNlVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIG1ldGhvZCgiREVMRVRFIiwgcmVzcG9uc2VUeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgPFQ+IEZ1dHVyZTxUPiBkZWxldGUoZmluYWwgR2VuZXJpY1R5cGU8VD4gcmVzcG9uc2VUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gbWV0aG9kKCJERUxFVEUiLCByZXNwb25zZVR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyA8VD4gRnV0dXJlPFQ+IGRlbGV0ZShmaW5hbCBJbnZvY2F0aW9uQ2FsbGJhY2s8VD4gY2FsbGJhY2spIHsKKyAgICAgICAgICAgIHJldHVybiBtZXRob2QoIkRFTEVURSIsIGNhbGxiYWNrKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRnV0dXJlPFJlc3BvbnNlPiBoZWFkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1ldGhvZCgiSEVBRCIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBGdXR1cmU8UmVzcG9uc2U+IGhlYWQoZmluYWwgSW52b2NhdGlvbkNhbGxiYWNrPFJlc3BvbnNlPiBjYWxsYmFjaykgeworICAgICAgICAgICAgcmV0dXJuIG1ldGhvZCgiSEVBRCIsIGNhbGxiYWNrKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRnV0dXJlPFJlc3BvbnNlPiBvcHRpb25zKCkgeworICAgICAgICAgICAgcmV0dXJuIG1ldGhvZCgiT1BUSU9OUyIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyA8VD4gRnV0dXJlPFQ+IG9wdGlvbnMoZmluYWwgQ2xhc3M8VD4gcmVzcG9uc2VUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gbWV0aG9kKCJPUFRJT05TIiwgcmVzcG9uc2VUeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgPFQ+IEZ1dHVyZTxUPiBvcHRpb25zKGZpbmFsIEdlbmVyaWNUeXBlPFQ+IHJlc3BvbnNlVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIG1ldGhvZCgiT1BUSU9OUyIsIHJlc3BvbnNlVHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIDxUPiBGdXR1cmU8VD4gb3B0aW9ucyhmaW5hbCBJbnZvY2F0aW9uQ2FsbGJhY2s8VD4gY2FsbGJhY2spIHsKKyAgICAgICAgICAgIHJldHVybiBtZXRob2QoIk9QVElPTlMiLCBjYWxsYmFjayk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEZ1dHVyZTxSZXNwb25zZT4gdHJhY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gbWV0aG9kKCJUUkFDRSIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyA8VD4gRnV0dXJlPFQ+IHRyYWNlKGZpbmFsIENsYXNzPFQ+IHJlc3BvbnNlVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIG1ldGhvZCgiVFJBQ0UiLCByZXNwb25zZVR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyA8VD4gRnV0dXJlPFQ+IHRyYWNlKGZpbmFsIEdlbmVyaWNUeXBlPFQ+IHJlc3BvbnNlVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIG1ldGhvZCgiVFJBQ0UiLCByZXNwb25zZVR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyA8VD4gRnV0dXJlPFQ+IHRyYWNlKGZpbmFsIEludm9jYXRpb25DYWxsYmFjazxUPiBjYWxsYmFjaykgeworICAgICAgICAgICAgcmV0dXJuIG1ldGhvZCgiVFJBQ0UiLCBjYWxsYmFjayk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEZ1dHVyZTxSZXNwb25zZT4gbWV0aG9kKGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICBidWlsZGVyLnJlcXVlc3RDb250ZXh0LnNldE1ldGhvZChuYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSmVyc2V5SW52b2NhdGlvbihidWlsZGVyKS5zdWJtaXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgPFQ+IEZ1dHVyZTxUPiBtZXRob2QoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIENsYXNzPFQ+IHJlc3BvbnNlVHlwZSkgeworICAgICAgICAgICAgaWYgKHJlc3BvbnNlVHlwZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5SRVNQT05TRV9UWVBFX0lTX05VTEwoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWlsZGVyLnJlcXVlc3RDb250ZXh0LnNldE1ldGhvZChuYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSmVyc2V5SW52b2NhdGlvbihidWlsZGVyKS5zdWJtaXQocmVzcG9uc2VUeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgPFQ+IEZ1dHVyZTxUPiBtZXRob2QoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIEdlbmVyaWNUeXBlPFQ+IHJlc3BvbnNlVHlwZSkgeworICAgICAgICAgICAgaWYgKHJlc3BvbnNlVHlwZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5SRVNQT05TRV9UWVBFX0lTX05VTEwoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWlsZGVyLnJlcXVlc3RDb250ZXh0LnNldE1ldGhvZChuYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSmVyc2V5SW52b2NhdGlvbihidWlsZGVyKS5zdWJtaXQocmVzcG9uc2VUeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgPFQ+IEZ1dHVyZTxUPiBtZXRob2QoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIEludm9jYXRpb25DYWxsYmFjazxUPiBjYWxsYmFjaykgeworICAgICAgICAgICAgYnVpbGRlci5yZXF1ZXN0Q29udGV4dC5zZXRNZXRob2QobmFtZSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IEplcnNleUludm9jYXRpb24oYnVpbGRlcikuc3VibWl0KGNhbGxiYWNrKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRnV0dXJlPFJlc3BvbnNlPiBtZXRob2QoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIEVudGl0eTw/PiBlbnRpdHkpIHsKKyAgICAgICAgICAgIGJ1aWxkZXIucmVxdWVzdENvbnRleHQuc2V0TWV0aG9kKG5hbWUpOworICAgICAgICAgICAgYnVpbGRlci5zdG9yZUVudGl0eShlbnRpdHkpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBKZXJzZXlJbnZvY2F0aW9uKGJ1aWxkZXIpLnN1Ym1pdCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyA8VD4gRnV0dXJlPFQ+IG1ldGhvZChmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgRW50aXR5PD8+IGVudGl0eSwgZmluYWwgQ2xhc3M8VD4gcmVzcG9uc2VUeXBlKSB7CisgICAgICAgICAgICBpZiAocmVzcG9uc2VUeXBlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlJFU1BPTlNFX1RZUEVfSVNfTlVMTCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1aWxkZXIucmVxdWVzdENvbnRleHQuc2V0TWV0aG9kKG5hbWUpOworICAgICAgICAgICAgYnVpbGRlci5zdG9yZUVudGl0eShlbnRpdHkpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBKZXJzZXlJbnZvY2F0aW9uKGJ1aWxkZXIpLnN1Ym1pdChyZXNwb25zZVR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyA8VD4gRnV0dXJlPFQ+IG1ldGhvZChmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgRW50aXR5PD8+IGVudGl0eSwgZmluYWwgR2VuZXJpY1R5cGU8VD4gcmVzcG9uc2VUeXBlKSB7CisgICAgICAgICAgICBpZiAocmVzcG9uc2VUeXBlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlJFU1BPTlNFX1RZUEVfSVNfTlVMTCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1aWxkZXIucmVxdWVzdENvbnRleHQuc2V0TWV0aG9kKG5hbWUpOworICAgICAgICAgICAgYnVpbGRlci5zdG9yZUVudGl0eShlbnRpdHkpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBKZXJzZXlJbnZvY2F0aW9uKGJ1aWxkZXIpLnN1Ym1pdChyZXNwb25zZVR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyA8VD4gRnV0dXJlPFQ+IG1ldGhvZChmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgRW50aXR5PD8+IGVudGl0eSwgZmluYWwgSW52b2NhdGlvbkNhbGxiYWNrPFQ+IGNhbGxiYWNrKSB7CisgICAgICAgICAgICBidWlsZGVyLnJlcXVlc3RDb250ZXh0LnNldE1ldGhvZChuYW1lKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuc3RvcmVFbnRpdHkoZW50aXR5KTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSmVyc2V5SW52b2NhdGlvbihidWlsZGVyKS5zdWJtaXQoY2FsbGJhY2spOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBDbGllbnRSZXF1ZXN0IHJlcXVlc3RGb3JDYWxsKGZpbmFsIENsaWVudFJlcXVlc3QgcmVxdWVzdENvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIGNvcHlSZXF1ZXN0Q29udGV4dCA/IG5ldyBDbGllbnRSZXF1ZXN0KHJlcXVlc3RDb250ZXh0KSA6IHJlcXVlc3RDb250ZXh0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNwb25zZSBpbnZva2UoKSB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICBmaW5hbCBDbGllbnRSdW50aW1lIHJ1bnRpbWUgPSByZXF1ZXN0KCkuZ2V0Q2xpZW50UnVudGltZSgpOworICAgICAgICBmaW5hbCBSZXF1ZXN0U2NvcGUgcmVxdWVzdFNjb3BlID0gcnVudGltZS5nZXRSZXF1ZXN0U2NvcGUoKTsKKyAgICAgICAgcmV0dXJuIHJlcXVlc3RTY29wZS5ydW5JblNjb3BlKAorICAgICAgICAgICAgICAgIChQcm9kdWNlcjxSZXNwb25zZT4pICgpIC0+IG5ldyBJbmJvdW5kSmF4cnNSZXNwb25zZShydW50aW1lLmludm9rZShyZXF1ZXN0Rm9yQ2FsbChyZXF1ZXN0Q29udGV4dCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0U2NvcGUpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFQ+IFQgaW52b2tlKGZpbmFsIENsYXNzPFQ+IHJlc3BvbnNlVHlwZSkgdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHJlc3BvbnNlVHlwZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlJFU1BPTlNFX1RZUEVfSVNfTlVMTCgpKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBDbGllbnRSdW50aW1lIHJ1bnRpbWUgPSByZXF1ZXN0KCkuZ2V0Q2xpZW50UnVudGltZSgpOworICAgICAgICBmaW5hbCBSZXF1ZXN0U2NvcGUgcmVxdWVzdFNjb3BlID0gcnVudGltZS5nZXRSZXF1ZXN0U2NvcGUoKTsKKyAgICAgICAgLy9ub2luc3BlY3Rpb24gRHVwbGljYXRlcworICAgICAgICByZXR1cm4gcmVxdWVzdFNjb3BlLnJ1bkluU2NvcGUoKCkgLT4geworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNsYXRlKHJ1bnRpbWUuaW52b2tlKHJlcXVlc3RGb3JDYWxsKHJlcXVlc3RDb250ZXh0KSksIHJlcXVlc3RTY29wZSwgcmVzcG9uc2VUeXBlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFByb2Nlc3NpbmdFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICBpZiAoZXguZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IChXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbikgZXguZ2V0Q2F1c2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gVCBpbnZva2UoZmluYWwgR2VuZXJpY1R5cGU8VD4gcmVzcG9uc2VUeXBlKSB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICBpZiAocmVzcG9uc2VUeXBlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuUkVTUE9OU0VfVFlQRV9JU19OVUxMKCkpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIENsaWVudFJ1bnRpbWUgcnVudGltZSA9IHJlcXVlc3QoKS5nZXRDbGllbnRSdW50aW1lKCk7CisgICAgICAgIGZpbmFsIFJlcXVlc3RTY29wZSByZXF1ZXN0U2NvcGUgPSBydW50aW1lLmdldFJlcXVlc3RTY29wZSgpOworICAgICAgICAvL25vaW5zcGVjdGlvbiBEdXBsaWNhdGVzCisgICAgICAgIHJldHVybiByZXF1ZXN0U2NvcGUucnVuSW5TY29wZSgoKSAtPiB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc2xhdGUocnVudGltZS5pbnZva2UocmVxdWVzdEZvckNhbGwocmVxdWVzdENvbnRleHQpKSwgcmVxdWVzdFNjb3BlLCByZXNwb25zZVR5cGUpOworICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgUHJvY2Vzc2luZ0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIGlmIChleC5nZXRDYXVzZSgpIGluc3RhbmNlb2YgV2ViQXBwbGljYXRpb25FeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKSBleC5nZXRDYXVzZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEZ1dHVyZTxSZXNwb25zZT4gc3VibWl0KCkgeworICAgICAgICBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTxSZXNwb25zZT4gcmVzcG9uc2VGdXR1cmUgPSBuZXcgQ29tcGxldGFibGVGdXR1cmU8PigpOworICAgICAgICBmaW5hbCBDbGllbnRSdW50aW1lIHJ1bnRpbWUgPSByZXF1ZXN0KCkuZ2V0Q2xpZW50UnVudGltZSgpOworICAgICAgICBydW50aW1lLnN1Ym1pdChydW50aW1lLmNyZWF0ZVJ1bm5hYmxlRm9yQXN5bmNQcm9jZXNzaW5nKHJlcXVlc3RGb3JDYWxsKHJlcXVlc3RDb250ZXh0KSwgbmV3IFJlc3BvbnNlQ2FsbGJhY2soKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgY29tcGxldGVkKGZpbmFsIENsaWVudFJlc3BvbnNlIHJlc3BvbnNlLCBmaW5hbCBSZXF1ZXN0U2NvcGUgc2NvcGUpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlRnV0dXJlLmlzQ2FuY2VsbGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VGdXR1cmUuY29tcGxldGUobmV3IEluYm91bmRKYXhyc1Jlc3BvbnNlKHJlc3BvbnNlLCBzY29wZSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZhaWxlZChmaW5hbCBQcm9jZXNzaW5nRXhjZXB0aW9uIGVycm9yKSB7CisgICAgICAgICAgICAgICAgaWYgKCFyZXNwb25zZUZ1dHVyZS5pc0NhbmNlbGxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlRnV0dXJlLmNvbXBsZXRlRXhjZXB0aW9uYWxseShlcnJvcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KSk7CisKKyAgICAgICAgcmV0dXJuIHJlc3BvbnNlRnV0dXJlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gRnV0dXJlPFQ+IHN1Ym1pdChmaW5hbCBDbGFzczxUPiByZXNwb25zZVR5cGUpIHsKKyAgICAgICAgaWYgKHJlc3BvbnNlVHlwZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlJFU1BPTlNFX1RZUEVfSVNfTlVMTCgpKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTxUPiByZXNwb25zZUZ1dHVyZSA9IG5ldyBDb21wbGV0YWJsZUZ1dHVyZTw+KCk7CisgICAgICAgIC8vbm9pbnNwZWN0aW9uIER1cGxpY2F0ZXMKKyAgICAgICAgZmluYWwgQ2xpZW50UnVudGltZSBydW50aW1lID0gcmVxdWVzdCgpLmdldENsaWVudFJ1bnRpbWUoKTsKKyAgICAgICAgcnVudGltZS5zdWJtaXQocnVudGltZS5jcmVhdGVSdW5uYWJsZUZvckFzeW5jUHJvY2Vzc2luZyhyZXF1ZXN0Rm9yQ2FsbChyZXF1ZXN0Q29udGV4dCksIG5ldyBSZXNwb25zZUNhbGxiYWNrKCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbXBsZXRlZChmaW5hbCBDbGllbnRSZXNwb25zZSByZXNwb25zZSwgZmluYWwgUmVxdWVzdFNjb3BlIHNjb3BlKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlRnV0dXJlLmlzQ2FuY2VsbGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXNwb25zZUZ1dHVyZS5jb21wbGV0ZSh0cmFuc2xhdGUocmVzcG9uc2UsIHNjb3BlLCByZXNwb25zZVR5cGUpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBQcm9jZXNzaW5nRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgIGZhaWxlZChleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZhaWxlZChmaW5hbCBQcm9jZXNzaW5nRXhjZXB0aW9uIGVycm9yKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlRnV0dXJlLmlzQ2FuY2VsbGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZXJyb3IuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlRnV0dXJlLmNvbXBsZXRlRXhjZXB0aW9uYWxseShlcnJvci5nZXRDYXVzZSgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXNwb25zZUZ1dHVyZS5jb21wbGV0ZUV4Y2VwdGlvbmFsbHkoZXJyb3IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSkpOworCisgICAgICAgIHJldHVybiByZXNwb25zZUZ1dHVyZTsKKyAgICB9CisKKyAgICBwcml2YXRlIDxUPiBUIHRyYW5zbGF0ZShmaW5hbCBDbGllbnRSZXNwb25zZSByZXNwb25zZSwgZmluYWwgUmVxdWVzdFNjb3BlIHNjb3BlLCBmaW5hbCBDbGFzczxUPiByZXNwb25zZVR5cGUpCisgICAgICAgICAgICB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChyZXNwb25zZVR5cGUgPT0gUmVzcG9uc2UuY2xhc3MpIHsKKyAgICAgICAgICAgIHJldHVybiByZXNwb25zZVR5cGUuY2FzdChuZXcgSW5ib3VuZEpheHJzUmVzcG9uc2UocmVzcG9uc2UsIHNjb3BlKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVzcG9uc2UuZ2V0U3RhdHVzSW5mbygpLmdldEZhbWlseSgpID09IFJlc3BvbnNlLlN0YXR1cy5GYW1pbHkuU1VDQ0VTU0ZVTCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UucmVhZEVudGl0eShyZXNwb25zZVR5cGUpOworICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgUHJvY2Vzc2luZ0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIGlmIChleC5nZXRDbGFzcygpID09IFByb2Nlc3NpbmdFeGNlcHRpb24uY2xhc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlc3BvbnNlUHJvY2Vzc2luZ0V4Y2VwdGlvbihuZXcgSW5ib3VuZEpheHJzUmVzcG9uc2UocmVzcG9uc2UsIHNjb3BlKSwgZXguZ2V0Q2F1c2UoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZXNwb25zZVByb2Nlc3NpbmdFeGNlcHRpb24obmV3IEluYm91bmRKYXhyc1Jlc3BvbnNlKHJlc3BvbnNlLCBzY29wZSksIGV4KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlc3BvbnNlUHJvY2Vzc2luZ0V4Y2VwdGlvbihuZXcgSW5ib3VuZEpheHJzUmVzcG9uc2UocmVzcG9uc2UsIHNjb3BlKSwgZXgpOworICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlc3BvbnNlUHJvY2Vzc2luZ0V4Y2VwdGlvbihuZXcgSW5ib3VuZEpheHJzUmVzcG9uc2UocmVzcG9uc2UsIHNjb3BlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsaXphdGlvbk1lc3NhZ2VzLlVORVhQRUNURURfRVJST1JfUkVTUE9OU0VfUFJPQ0VTU0lORygpLCBleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBjb252ZXJ0VG9FeGNlcHRpb24obmV3IEluYm91bmRKYXhyc1Jlc3BvbnNlKHJlc3BvbnNlLCBzY29wZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxUPiBGdXR1cmU8VD4gc3VibWl0KGZpbmFsIEdlbmVyaWNUeXBlPFQ+IHJlc3BvbnNlVHlwZSkgeworICAgICAgICBpZiAocmVzcG9uc2VUeXBlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuUkVTUE9OU0VfVFlQRV9JU19OVUxMKCkpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlPFQ+IHJlc3BvbnNlRnV0dXJlID0gbmV3IENvbXBsZXRhYmxlRnV0dXJlPD4oKTsKKyAgICAgICAgLy9ub2luc3BlY3Rpb24gRHVwbGljYXRlcworICAgICAgICBmaW5hbCBDbGllbnRSdW50aW1lIHJ1bnRpbWUgPSByZXF1ZXN0KCkuZ2V0Q2xpZW50UnVudGltZSgpOworICAgICAgICBydW50aW1lLnN1Ym1pdChydW50aW1lLmNyZWF0ZVJ1bm5hYmxlRm9yQXN5bmNQcm9jZXNzaW5nKHJlcXVlc3RGb3JDYWxsKHJlcXVlc3RDb250ZXh0KSwgbmV3IFJlc3BvbnNlQ2FsbGJhY2soKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgY29tcGxldGVkKGZpbmFsIENsaWVudFJlc3BvbnNlIHJlc3BvbnNlLCBmaW5hbCBSZXF1ZXN0U2NvcGUgc2NvcGUpIHsKKyAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2VGdXR1cmUuaXNDYW5jZWxsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VGdXR1cmUuY29tcGxldGUodHJhbnNsYXRlKHJlc3BvbnNlLCBzY29wZSwgcmVzcG9uc2VUeXBlKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgUHJvY2Vzc2luZ0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICBmYWlsZWQoZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBmYWlsZWQoZmluYWwgUHJvY2Vzc2luZ0V4Y2VwdGlvbiBlcnJvcikgeworICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZUZ1dHVyZS5pc0NhbmNlbGxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGVycm9yLmdldENhdXNlKCkgaW5zdGFuY2VvZiBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgICAgICByZXNwb25zZUZ1dHVyZS5jb21wbGV0ZUV4Y2VwdGlvbmFsbHkoZXJyb3IuZ2V0Q2F1c2UoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VGdXR1cmUuY29tcGxldGVFeGNlcHRpb25hbGx5KGVycm9yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pKTsKKworICAgICAgICByZXR1cm4gcmVzcG9uc2VGdXR1cmU7CisgICAgfQorCisgICAgcHJpdmF0ZSA8VD4gVCB0cmFuc2xhdGUoZmluYWwgQ2xpZW50UmVzcG9uc2UgcmVzcG9uc2UsIGZpbmFsIFJlcXVlc3RTY29wZSBzY29wZSwgZmluYWwgR2VuZXJpY1R5cGU8VD4gcmVzcG9uc2VUeXBlKQorICAgICAgICAgICAgdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24geworICAgICAgICBpZiAocmVzcG9uc2VUeXBlLmdldFJhd1R5cGUoKSA9PSBSZXNwb25zZS5jbGFzcykgeworICAgICAgICAgICAgLy9ub2luc3BlY3Rpb24gdW5jaGVja2VkCisgICAgICAgICAgICByZXR1cm4gKFQpIG5ldyBJbmJvdW5kSmF4cnNSZXNwb25zZShyZXNwb25zZSwgc2NvcGUpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlc3BvbnNlLmdldFN0YXR1c0luZm8oKS5nZXRGYW1pbHkoKSA9PSBSZXNwb25zZS5TdGF0dXMuRmFtaWx5LlNVQ0NFU1NGVUwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlYWRFbnRpdHkocmVzcG9uc2VUeXBlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFByb2Nlc3NpbmdFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVzcG9uc2VQcm9jZXNzaW5nRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEluYm91bmRKYXhyc1Jlc3BvbnNlKHJlc3BvbnNlLCBzY29wZSksCisgICAgICAgICAgICAgICAgICAgICAgICBleC5nZXRDYXVzZSgpICE9IG51bGwgPyBleC5nZXRDYXVzZSgpIDogZXgpOworICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVzcG9uc2VQcm9jZXNzaW5nRXhjZXB0aW9uKG5ldyBJbmJvdW5kSmF4cnNSZXNwb25zZShyZXNwb25zZSwgc2NvcGUpLCBleCk7CisgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVzcG9uc2VQcm9jZXNzaW5nRXhjZXB0aW9uKG5ldyBJbmJvdW5kSmF4cnNSZXNwb25zZShyZXNwb25zZSwgc2NvcGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxpemF0aW9uTWVzc2FnZXMuVU5FWFBFQ1RFRF9FUlJPUl9SRVNQT05TRV9QUk9DRVNTSU5HKCksIGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IGNvbnZlcnRUb0V4Y2VwdGlvbihuZXcgSW5ib3VuZEpheHJzUmVzcG9uc2UocmVzcG9uc2UsIHNjb3BlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFQ+IEZ1dHVyZTxUPiBzdWJtaXQoZmluYWwgSW52b2NhdGlvbkNhbGxiYWNrPFQ+IGNhbGxiYWNrKSB7CisgICAgICAgIHJldHVybiBzdWJtaXQobnVsbCwgY2FsbGJhY2spOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN1Ym1pdCB0aGUgcmVxdWVzdCBmb3IgYW4gYXN5bmNocm9ub3VzIGludm9jYXRpb24gYW5kIHJlZ2lzdGVyIGFuCisgICAgICoge0BsaW5rIEludm9jYXRpb25DYWxsYmFja30gdG8gcHJvY2VzcyB0aGUgZnV0dXJlIHJlc3VsdCBvZiB0aGUgaW52b2NhdGlvbi4KKyAgICAgKiA8cD4KKyAgICAgKiBSZXNwb25zZSB0eXBlIGluIHRoaXMgY2FzZSBpcyB0YWtlbiBmcm9tIHtAY29kZSByZXNwb25zZVR5cGV9IHBhcmFtIChpZiBub3Qge0Bjb2RlIG51bGx9KSByYXRoZXIKKyAgICAgKiB0aGFuIGZyb20ge0Bjb2RlIGNhbGxiYWNrfS4gVGhpcyBhbGxvd3MgdG8gcGFzcyBjYWxsYmFja3MgbGlrZSB7QGNvZGUgbmV3IEludm9jYXRpb25DYWxsYmFjayZsdDsmZ3QoKSB7Li4ufX0uCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIDxUPiAgICAgICAgICByZXNwb25zZSB0eXBlCisgICAgICogQHBhcmFtIHJlc3BvbnNlVHlwZSByZXNwb25zZSB0eXBlIHRoYXQgaXMgdXNlZCBpbnN0ZWFkIG9mIG9idGFpbmluZyB0eXBlcyBmcm9tIHtAY29kZSBjYWxsYmFja30uCisgICAgICogQHBhcmFtIGNhbGxiYWNrICAgICBpbnZvY2F0aW9uIGNhbGxiYWNrIGZvciBhc3luY2hyb25vdXMgcHJvY2Vzc2luZyBvZiB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgaW52b2NhdGlvbiByZXN1bHQuCisgICAgICogQHJldHVybiBmdXR1cmUgcmVzcG9uc2Ugb2JqZWN0IG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBhcyBhIHJlc3VsdCBvZiB0aGUKKyAgICAgKiByZXF1ZXN0IGludm9jYXRpb24uCisgICAgICovCisgICAgcHVibGljIDxUPiBGdXR1cmU8VD4gc3VibWl0KGZpbmFsIEdlbmVyaWNUeXBlPFQ+IHJlc3BvbnNlVHlwZSwgZmluYWwgSW52b2NhdGlvbkNhbGxiYWNrPFQ+IGNhbGxiYWNrKSB7CisgICAgICAgIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlPFQ+IHJlc3BvbnNlRnV0dXJlID0gbmV3IENvbXBsZXRhYmxlRnV0dXJlPD4oKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgUmVmbGVjdGlvbkhlbHBlci5EZWNsYXJpbmdDbGFzc0ludGVyZmFjZVBhaXIgcGFpciA9CisgICAgICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25IZWxwZXIuZ2V0Q2xhc3MoY2FsbGJhY2suZ2V0Q2xhc3MoKSwgSW52b2NhdGlvbkNhbGxiYWNrLmNsYXNzKTsKKworICAgICAgICAgICAgZmluYWwgVHlwZSBjYWxsYmFja1BhcmFtVHlwZTsKKyAgICAgICAgICAgIGZpbmFsIENsYXNzPFQ+IGNhbGxiYWNrUGFyYW1DbGFzczsKKworICAgICAgICAgICAgaWYgKHJlc3BvbnNlVHlwZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSByZXNwb25zZSB1c2UgY2FsbGJhY2sgdG8gb2J0YWluIHBhcmFtIHR5cGVzLgorICAgICAgICAgICAgICAgIGZpbmFsIFR5cGVbXSB0eXBlQXJndW1lbnRzID0gUmVmbGVjdGlvbkhlbHBlci5nZXRQYXJhbWV0ZXJpemVkVHlwZUFyZ3VtZW50cyhwYWlyKTsKKyAgICAgICAgICAgICAgICBpZiAodHlwZUFyZ3VtZW50cyA9PSBudWxsIHx8IHR5cGVBcmd1bWVudHMubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tQYXJhbVR5cGUgPSBPYmplY3QuY2xhc3M7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tQYXJhbVR5cGUgPSB0eXBlQXJndW1lbnRzWzBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYWxsYmFja1BhcmFtQ2xhc3MgPSBSZWZsZWN0aW9uSGVscGVyLmVyYXN1cmUoY2FsbGJhY2tQYXJhbVR5cGUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjYWxsYmFja1BhcmFtVHlwZSA9IHJlc3BvbnNlVHlwZS5nZXRUeXBlKCk7CisgICAgICAgICAgICAgICAgY2FsbGJhY2tQYXJhbUNsYXNzID0gUmVmbGVjdGlvbkhlbHBlci5lcmFzdXJlKHJlc3BvbnNlVHlwZS5nZXRSYXdUeXBlKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBSZXNwb25zZUNhbGxiYWNrIHJlc3BvbnNlQ2FsbGJhY2sgPSBuZXcgUmVzcG9uc2VDYWxsYmFjaygpIHsKKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbXBsZXRlZChmaW5hbCBDbGllbnRSZXNwb25zZSByZXNwb25zZSwgZmluYWwgUmVxdWVzdFNjb3BlIHNjb3BlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZUZ1dHVyZS5pc0NhbmNlbGxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbGVkKG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2FuY2VsbGF0aW9uRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX1JFUVVFU1RfQ0FOQ0VMTEVEKCkpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmaW5hbCBUIHJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrUGFyYW1DbGFzcyA9PSBSZXNwb25zZS5jbGFzcykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gY2FsbGJhY2tQYXJhbUNsYXNzLmNhc3QobmV3IEluYm91bmRKYXhyc1Jlc3BvbnNlKHJlc3BvbnNlLCBzY29wZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VGdXR1cmUuY29tcGxldGUocmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLmNvbXBsZXRlZChyZXN1bHQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLmdldFN0YXR1c0luZm8oKS5nZXRGYW1pbHkoKSA9PSBSZXNwb25zZS5TdGF0dXMuRmFtaWx5LlNVQ0NFU1NGVUwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3BvbnNlLnJlYWRFbnRpdHkobmV3IEdlbmVyaWNUeXBlPFQ+KGNhbGxiYWNrUGFyYW1UeXBlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZUZ1dHVyZS5jb21wbGV0ZShyZXN1bHQpOworICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suY29tcGxldGVkKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsZWQoY29udmVydFRvRXhjZXB0aW9uKG5ldyBJbmJvdW5kSmF4cnNSZXNwb25zZShyZXNwb25zZSwgc2NvcGUpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBmYWlsZWQoZmluYWwgUHJvY2Vzc2luZ0V4Y2VwdGlvbiBlcnJvcikgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yLmdldENhdXNlKCkgaW5zdGFuY2VvZiBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlRnV0dXJlLmNvbXBsZXRlRXhjZXB0aW9uYWxseShlcnJvci5nZXRDYXVzZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXJlc3BvbnNlRnV0dXJlLmlzQ2FuY2VsbGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZUZ1dHVyZS5jb21wbGV0ZUV4Y2VwdGlvbmFsbHkoZXJyb3IpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2suZmFpbGVkKGVycm9yLmdldENhdXNlKCkgaW5zdGFuY2VvZiBDYW5jZWxsYXRpb25FeGNlcHRpb24gPyBlcnJvci5nZXRDYXVzZSgpIDogZXJyb3IpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGZpbmFsIENsaWVudFJ1bnRpbWUgcnVudGltZSA9IHJlcXVlc3QoKS5nZXRDbGllbnRSdW50aW1lKCk7CisgICAgICAgICAgICBydW50aW1lLnN1Ym1pdChydW50aW1lLmNyZWF0ZVJ1bm5hYmxlRm9yQXN5bmNQcm9jZXNzaW5nKHJlcXVlc3RGb3JDYWxsKHJlcXVlc3RDb250ZXh0KSwgcmVzcG9uc2VDYWxsYmFjaykpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBUaHJvd2FibGUgZXJyb3IpIHsKKyAgICAgICAgICAgIGZpbmFsIFByb2Nlc3NpbmdFeGNlcHRpb24gY2U7CisgICAgICAgICAgICAvL25vaW5zcGVjdGlvbiBDaGFpbk9mSW5zdGFuY2VvZkNoZWNrcworICAgICAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgUHJvY2Vzc2luZ0V4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIGNlID0gKFByb2Nlc3NpbmdFeGNlcHRpb24pIGVycm9yOworICAgICAgICAgICAgICAgIHJlc3BvbnNlRnV0dXJlLmNvbXBsZXRlRXhjZXB0aW9uYWxseShjZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGVycm9yIGluc3RhbmNlb2YgV2ViQXBwbGljYXRpb25FeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICBjZSA9IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKGVycm9yKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZUZ1dHVyZS5jb21wbGV0ZUV4Y2VwdGlvbmFsbHkoZXJyb3IpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjZSA9IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKGVycm9yKTsKKyAgICAgICAgICAgICAgICByZXNwb25zZUZ1dHVyZS5jb21wbGV0ZUV4Y2VwdGlvbmFsbHkoY2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FsbGJhY2suZmFpbGVkKGNlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXNwb25zZUZ1dHVyZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmVyc2V5SW52b2NhdGlvbiBwcm9wZXJ0eShmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIHJlcXVlc3RDb250ZXh0LnNldFByb3BlcnR5KG5hbWUsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHJpdmF0ZSBQcm9jZXNzaW5nRXhjZXB0aW9uIGNvbnZlcnRUb0V4Y2VwdGlvbihmaW5hbCBSZXNwb25zZSByZXNwb25zZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gQnVmZmVyIGFuZCBjbG9zZSBlbnRpdHkgaW5wdXQgc3RyZWFtIChpZiBhbnkpIHRvIHByZXZlbnQKKyAgICAgICAgICAgIC8vIGxlYWtpbmcgY29ubmVjdGlvbnMgKHNlZSBKRVJTRVktMjE1NykuCisgICAgICAgICAgICByZXNwb25zZS5idWZmZXJFbnRpdHkoKTsKKworICAgICAgICAgICAgZmluYWwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24gd2ViQXBwRXhjZXB0aW9uOworICAgICAgICAgICAgZmluYWwgaW50IHN0YXR1c0NvZGUgPSByZXNwb25zZS5nZXRTdGF0dXMoKTsKKyAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlLlN0YXR1cyBzdGF0dXMgPSBSZXNwb25zZS5TdGF0dXMuZnJvbVN0YXR1c0NvZGUoc3RhdHVzQ29kZSk7CisKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlLlN0YXR1cy5GYW1pbHkgc3RhdHVzRmFtaWx5ID0gcmVzcG9uc2UuZ2V0U3RhdHVzSW5mbygpLmdldEZhbWlseSgpOworICAgICAgICAgICAgICAgIHdlYkFwcEV4Y2VwdGlvbiA9IGNyZWF0ZUV4Y2VwdGlvbkZvckZhbWlseShyZXNwb25zZSwgc3RhdHVzRmFtaWx5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChzdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBCQURfUkVRVUVTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHdlYkFwcEV4Y2VwdGlvbiA9IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKHJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFVOQVVUSE9SSVpFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHdlYkFwcEV4Y2VwdGlvbiA9IG5ldyBOb3RBdXRob3JpemVkRXhjZXB0aW9uKHJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEZPUkJJRERFTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHdlYkFwcEV4Y2VwdGlvbiA9IG5ldyBGb3JiaWRkZW5FeGNlcHRpb24ocmVzcG9uc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgTk9UX0ZPVU5EOgorICAgICAgICAgICAgICAgICAgICAgICAgd2ViQXBwRXhjZXB0aW9uID0gbmV3IE5vdEZvdW5kRXhjZXB0aW9uKHJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIE1FVEhPRF9OT1RfQUxMT1dFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHdlYkFwcEV4Y2VwdGlvbiA9IG5ldyBOb3RBbGxvd2VkRXhjZXB0aW9uKHJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIE5PVF9BQ0NFUFRBQkxFOgorICAgICAgICAgICAgICAgICAgICAgICAgd2ViQXBwRXhjZXB0aW9uID0gbmV3IE5vdEFjY2VwdGFibGVFeGNlcHRpb24ocmVzcG9uc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVU5TVVBQT1JURURfTUVESUFfVFlQRToKKyAgICAgICAgICAgICAgICAgICAgICAgIHdlYkFwcEV4Y2VwdGlvbiA9IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24ocmVzcG9uc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSU5URVJOQUxfU0VSVkVSX0VSUk9SOgorICAgICAgICAgICAgICAgICAgICAgICAgd2ViQXBwRXhjZXB0aW9uID0gbmV3IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24ocmVzcG9uc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgU0VSVklDRV9VTkFWQUlMQUJMRToKKyAgICAgICAgICAgICAgICAgICAgICAgIHdlYkFwcEV4Y2VwdGlvbiA9IG5ldyBTZXJ2aWNlVW5hdmFpbGFibGVFeGNlcHRpb24ocmVzcG9uc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZXNwb25zZS5TdGF0dXMuRmFtaWx5IHN0YXR1c0ZhbWlseSA9IHJlc3BvbnNlLmdldFN0YXR1c0luZm8oKS5nZXRGYW1pbHkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdlYkFwcEV4Y2VwdGlvbiA9IGNyZWF0ZUV4Y2VwdGlvbkZvckZhbWlseShyZXNwb25zZSwgc3RhdHVzRmFtaWx5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2VQcm9jZXNzaW5nRXhjZXB0aW9uKHJlc3BvbnNlLCB3ZWJBcHBFeGNlcHRpb24pOworICAgICAgICB9IGNhdGNoIChmaW5hbCBUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZVByb2Nlc3NpbmdFeGNlcHRpb24ocmVzcG9uc2UsIExvY2FsaXphdGlvbk1lc3NhZ2VzLlJFU1BPTlNFX1RPX0VYQ0VQVElPTl9DT05WRVJTSU9OX0ZBSUxFRCgpLCB0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgV2ViQXBwbGljYXRpb25FeGNlcHRpb24gY3JlYXRlRXhjZXB0aW9uRm9yRmFtaWx5KGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlLCBmaW5hbCBSZXNwb25zZS5TdGF0dXMuRmFtaWx5IHN0YXR1c0ZhbWlseSkgeworICAgICAgICBmaW5hbCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB3ZWJBcHBFeGNlcHRpb247CisgICAgICAgIHN3aXRjaCAoc3RhdHVzRmFtaWx5KSB7CisgICAgICAgICAgICBjYXNlIFJFRElSRUNUSU9OOgorICAgICAgICAgICAgICAgIHdlYkFwcEV4Y2VwdGlvbiA9IG5ldyBSZWRpcmVjdGlvbkV4Y2VwdGlvbihyZXNwb25zZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENMSUVOVF9FUlJPUjoKKyAgICAgICAgICAgICAgICB3ZWJBcHBFeGNlcHRpb24gPSBuZXcgQ2xpZW50RXJyb3JFeGNlcHRpb24ocmVzcG9uc2UpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTRVJWRVJfRVJST1I6CisgICAgICAgICAgICAgICAgd2ViQXBwRXhjZXB0aW9uID0gbmV3IFNlcnZlckVycm9yRXhjZXB0aW9uKHJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgd2ViQXBwRXhjZXB0aW9uID0gbmV3IFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKHJlc3BvbnNlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gd2ViQXBwRXhjZXB0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIG11dGFibGUgcmVxdWVzdCBjb250ZXh0IHRvIGJlIGludm9rZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIG11dGFibGUgcmVxdWVzdCBjb250ZXh0IHRvIGJlIGludm9rZWQuCisgICAgICovCisgICAgQ2xpZW50UmVxdWVzdCByZXF1ZXN0KCkgeworICAgICAgICByZXR1cm4gcmVxdWVzdENvbnRleHQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvSmVyc2V5V2ViVGFyZ2V0LmphdmEgYi9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9KZXJzZXlXZWJUYXJnZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2Q1NGJlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvSmVyc2V5V2ViVGFyZ2V0LmphdmEKQEAgLTAsMCArMSwzNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50OworCitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkxpbms7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmEuUHJlY29uZGl0aW9uczsKKworLyoqCisgKiBKZXJzZXkgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQgSkFYLVJTIGNsaWVudCB0YXJnZXR9CisgKiBjb250cmFjdC4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSmVyc2V5V2ViVGFyZ2V0IGltcGxlbWVudHMgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldCwgSW5pdGlhbGl6YWJsZTxKZXJzZXlXZWJUYXJnZXQ+IHsKKworICAgIHByaXZhdGUgZmluYWwgQ2xpZW50Q29uZmlnIGNvbmZpZzsKKyAgICBwcml2YXRlIGZpbmFsIFVyaUJ1aWxkZXIgdGFyZ2V0VXJpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyB3ZWIgdGFyZ2V0IGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHVyaSAgICB0YXJnZXQgVVJJLgorICAgICAqIEBwYXJhbSBwYXJlbnQgcGFyZW50IGNsaWVudC4KKyAgICAgKi8KKyAgICAvKnBhY2thZ2UqLyBKZXJzZXlXZWJUYXJnZXQoU3RyaW5nIHVyaSwgSmVyc2V5Q2xpZW50IHBhcmVudCkgeworICAgICAgICB0aGlzKFVyaUJ1aWxkZXIuZnJvbVVyaSh1cmkpLCBwYXJlbnQuZ2V0Q29uZmlndXJhdGlvbigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IHdlYiB0YXJnZXQgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpICAgIHRhcmdldCBVUkkuCisgICAgICogQHBhcmFtIHBhcmVudCBwYXJlbnQgY2xpZW50LgorICAgICAqLworICAgIC8qcGFja2FnZSovIEplcnNleVdlYlRhcmdldChVUkkgdXJpLCBKZXJzZXlDbGllbnQgcGFyZW50KSB7CisgICAgICAgIHRoaXMoVXJpQnVpbGRlci5mcm9tVXJpKHVyaSksIHBhcmVudC5nZXRDb25maWd1cmF0aW9uKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgd2ViIHRhcmdldCBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmlCdWlsZGVyIGJ1aWxkZXIgZm9yIHRoZSB0YXJnZXQgVVJJLgorICAgICAqIEBwYXJhbSBwYXJlbnQgICAgIHBhcmVudCBjbGllbnQuCisgICAgICovCisgICAgLypwYWNrYWdlKi8gSmVyc2V5V2ViVGFyZ2V0KFVyaUJ1aWxkZXIgdXJpQnVpbGRlciwgSmVyc2V5Q2xpZW50IHBhcmVudCkgeworICAgICAgICB0aGlzKHVyaUJ1aWxkZXIuY2xvbmUoKSwgcGFyZW50LmdldENvbmZpZ3VyYXRpb24oKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyB3ZWIgdGFyZ2V0IGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIGxpbmsgICBsaW5rIHRvIHRoZSB0YXJnZXQgVVJJLgorICAgICAqIEBwYXJhbSBwYXJlbnQgcGFyZW50IGNsaWVudC4KKyAgICAgKi8KKyAgICAvKnBhY2thZ2UqLyBKZXJzZXlXZWJUYXJnZXQoTGluayBsaW5rLCBKZXJzZXlDbGllbnQgcGFyZW50KSB7CisgICAgICAgIC8vIFRPRE8gaGFuZGxlIHJlbGF0aXZlIGxpbmtzCisgICAgICAgIHRoaXMoVXJpQnVpbGRlci5mcm9tVXJpKGxpbmsuZ2V0VXJpKCkpLCBwYXJlbnQuZ2V0Q29uZmlndXJhdGlvbigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IHdlYiB0YXJnZXQgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpQnVpbGRlciBidWlsZGVyIGZvciB0aGUgdGFyZ2V0IFVSSS4KKyAgICAgKiBAcGFyYW0gdGhhdCAgICAgICBvcmlnaW5hbCB0YXJnZXQgdG8gY29weSB0aGUgaW50ZXJuYWwgZGF0YSBmcm9tLgorICAgICAqLworICAgIHByb3RlY3RlZCBKZXJzZXlXZWJUYXJnZXQoVXJpQnVpbGRlciB1cmlCdWlsZGVyLCBKZXJzZXlXZWJUYXJnZXQgdGhhdCkgeworICAgICAgICB0aGlzKHVyaUJ1aWxkZXIsIHRoYXQuY29uZmlnKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IHdlYiB0YXJnZXQgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpQnVpbGRlciAgIGJ1aWxkZXIgZm9yIHRoZSB0YXJnZXQgVVJJLgorICAgICAqIEBwYXJhbSBjbGllbnRDb25maWcgdGFyZ2V0IGNvbmZpZ3VyYXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIEplcnNleVdlYlRhcmdldChVcmlCdWlsZGVyIHVyaUJ1aWxkZXIsIENsaWVudENvbmZpZyBjbGllbnRDb25maWcpIHsKKyAgICAgICAgY2xpZW50Q29uZmlnLmNoZWNrQ2xpZW50KCk7CisKKyAgICAgICAgdGhpcy50YXJnZXRVcmkgPSB1cmlCdWlsZGVyOworICAgICAgICB0aGlzLmNvbmZpZyA9IGNsaWVudENvbmZpZy5zbmFwc2hvdCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBVUkkgZ2V0VXJpKCkgeworICAgICAgICBjaGVja05vdENsb3NlZCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIHRhcmdldFVyaS5idWlsZCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZXguZ2V0TWVzc2FnZSgpLCBleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tOb3RDbG9zZWQoKSB7CisgICAgICAgIGNvbmZpZy5nZXRDbGllbnQoKS5jaGVja05vdENsb3NlZCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBVcmlCdWlsZGVyIGdldFVyaUJ1aWxkZXIoKSB7CisgICAgICAgIGNoZWNrTm90Q2xvc2VkKCk7CisgICAgICAgIHJldHVybiB0YXJnZXRVcmkuY2xvbmUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmVyc2V5V2ViVGFyZ2V0IHBhdGgoU3RyaW5nIHBhdGgpIHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiB7CisgICAgICAgIGNoZWNrTm90Q2xvc2VkKCk7CisgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsKHBhdGgsICJwYXRoIGlzICdudWxsJy4iKTsKKworICAgICAgICByZXR1cm4gbmV3IEplcnNleVdlYlRhcmdldChnZXRVcmlCdWlsZGVyKCkucGF0aChwYXRoKSwgdGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEplcnNleVdlYlRhcmdldCBtYXRyaXhQYXJhbShTdHJpbmcgbmFtZSwgT2JqZWN0Li4uIHZhbHVlcykgdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2tOb3RDbG9zZWQoKTsKKyAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGwobmFtZSwgIk1hdHJpeCBwYXJhbWV0ZXIgbmFtZSBtdXN0IG5vdCBiZSAnbnVsbCcuIik7CisKKyAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsIHx8IHZhbHVlcy5sZW5ndGggPT0gMCB8fCAodmFsdWVzLmxlbmd0aCA9PSAxICYmIHZhbHVlc1swXSA9PSBudWxsKSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBKZXJzZXlXZWJUYXJnZXQoZ2V0VXJpQnVpbGRlcigpLnJlcGxhY2VNYXRyaXhQYXJhbShuYW1lLCAoT2JqZWN0W10pIG51bGwpLCB0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIGNoZWNrRm9yTnVsbFZhbHVlcyhuYW1lLCB2YWx1ZXMpOworICAgICAgICByZXR1cm4gbmV3IEplcnNleVdlYlRhcmdldChnZXRVcmlCdWlsZGVyKCkubWF0cml4UGFyYW0obmFtZSwgdmFsdWVzKSwgdGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEplcnNleVdlYlRhcmdldCBxdWVyeVBhcmFtKFN0cmluZyBuYW1lLCBPYmplY3QuLi4gdmFsdWVzKSB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24geworICAgICAgICBjaGVja05vdENsb3NlZCgpOworICAgICAgICByZXR1cm4gbmV3IEplcnNleVdlYlRhcmdldChKZXJzZXlXZWJUYXJnZXQuc2V0UXVlcnlQYXJhbShnZXRVcmlCdWlsZGVyKCksIG5hbWUsIHZhbHVlcyksIHRoaXMpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFVyaUJ1aWxkZXIgc2V0UXVlcnlQYXJhbShVcmlCdWlsZGVyIHVyaUJ1aWxkZXIsIFN0cmluZyBuYW1lLCBPYmplY3RbXSB2YWx1ZXMpIHsKKyAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsIHx8IHZhbHVlcy5sZW5ndGggPT0gMCB8fCAodmFsdWVzLmxlbmd0aCA9PSAxICYmIHZhbHVlc1swXSA9PSBudWxsKSkgeworICAgICAgICAgICAgcmV0dXJuIHVyaUJ1aWxkZXIucmVwbGFjZVF1ZXJ5UGFyYW0obmFtZSwgKE9iamVjdFtdKSBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIGNoZWNrRm9yTnVsbFZhbHVlcyhuYW1lLCB2YWx1ZXMpOworICAgICAgICByZXR1cm4gdXJpQnVpbGRlci5xdWVyeVBhcmFtKG5hbWUsIHZhbHVlcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0Zvck51bGxWYWx1ZXMoU3RyaW5nIG5hbWUsIE9iamVjdFtdIHZhbHVlcykgeworICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbChuYW1lLCAibmFtZSBpcyAnbnVsbCcuIik7CisKKyAgICAgICAgTGlzdDxJbnRlZ2VyPiBpbmRleGVzID0gbmV3IExpbmtlZExpc3Q8SW50ZWdlcj4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZXNbaV0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGluZGV4ZXMuYWRkKGkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZpbmFsIGludCBmYWlsZWRJbmRleENvdW50ID0gaW5kZXhlcy5zaXplKCk7CisgICAgICAgIGlmIChmYWlsZWRJbmRleENvdW50ID4gMCkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlVHh0OworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGluZGV4VHh0OworICAgICAgICAgICAgaWYgKGZhaWxlZEluZGV4Q291bnQgPT0gMSkgeworICAgICAgICAgICAgICAgIHZhbHVlVHh0ID0gInZhbHVlIjsKKyAgICAgICAgICAgICAgICBpbmRleFR4dCA9ICJpbmRleCI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHZhbHVlVHh0ID0gInZhbHVlcyI7CisgICAgICAgICAgICAgICAgaW5kZXhUeHQgPSAiaW5kZXhlcyI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiJ251bGwnICVzIGRldGVjdGVkIGZvciBwYXJhbWV0ZXIgJyVzJyBvbiAlcyA6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVR4dCwgbmFtZSwgaW5kZXhUeHQsIGluZGV4ZXMudG9TdHJpbmcoKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEplcnNleUludm9jYXRpb24uQnVpbGRlciByZXF1ZXN0KCkgeworICAgICAgICBjaGVja05vdENsb3NlZCgpOworICAgICAgICByZXR1cm4gbmV3IEplcnNleUludm9jYXRpb24uQnVpbGRlcihnZXRVcmkoKSwgY29uZmlnLnNuYXBzaG90KCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBKZXJzZXlJbnZvY2F0aW9uLkJ1aWxkZXIgcmVxdWVzdChTdHJpbmcuLi4gYWNjZXB0ZWRSZXNwb25zZVR5cGVzKSB7CisgICAgICAgIGNoZWNrTm90Q2xvc2VkKCk7CisgICAgICAgIEplcnNleUludm9jYXRpb24uQnVpbGRlciBiID0gbmV3IEplcnNleUludm9jYXRpb24uQnVpbGRlcihnZXRVcmkoKSwgY29uZmlnLnNuYXBzaG90KCkpOworICAgICAgICBiLnJlcXVlc3QoKS5hY2NlcHQoYWNjZXB0ZWRSZXNwb25zZVR5cGVzKTsKKyAgICAgICAgcmV0dXJuIGI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEplcnNleUludm9jYXRpb24uQnVpbGRlciByZXF1ZXN0KE1lZGlhVHlwZS4uLiBhY2NlcHRlZFJlc3BvbnNlVHlwZXMpIHsKKyAgICAgICAgY2hlY2tOb3RDbG9zZWQoKTsKKyAgICAgICAgSmVyc2V5SW52b2NhdGlvbi5CdWlsZGVyIGIgPSBuZXcgSmVyc2V5SW52b2NhdGlvbi5CdWlsZGVyKGdldFVyaSgpLCBjb25maWcuc25hcHNob3QoKSk7CisgICAgICAgIGIucmVxdWVzdCgpLmFjY2VwdChhY2NlcHRlZFJlc3BvbnNlVHlwZXMpOworICAgICAgICByZXR1cm4gYjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmVyc2V5V2ViVGFyZ2V0IHJlc29sdmVUZW1wbGF0ZShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gcmVzb2x2ZVRlbXBsYXRlKG5hbWUsIHZhbHVlLCB0cnVlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmVyc2V5V2ViVGFyZ2V0IHJlc29sdmVUZW1wbGF0ZShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlLCBib29sZWFuIGVuY29kZVNsYXNoSW5QYXRoKSB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24geworICAgICAgICBjaGVja05vdENsb3NlZCgpOworICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbChuYW1lLCAibmFtZSBpcyAnbnVsbCcuIik7CisgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsKHZhbHVlLCAidmFsdWUgaXMgJ251bGwnLiIpOworCisgICAgICAgIHJldHVybiBuZXcgSmVyc2V5V2ViVGFyZ2V0KGdldFVyaUJ1aWxkZXIoKS5yZXNvbHZlVGVtcGxhdGUobmFtZSwgdmFsdWUsIGVuY29kZVNsYXNoSW5QYXRoKSwgdGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEplcnNleVdlYlRhcmdldCByZXNvbHZlVGVtcGxhdGVGcm9tRW5jb2RlZChTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKQorICAgICAgICAgICAgdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2tOb3RDbG9zZWQoKTsKKyAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGwobmFtZSwgIm5hbWUgaXMgJ251bGwnLiIpOworICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbCh2YWx1ZSwgInZhbHVlIGlzICdudWxsJy4iKTsKKworICAgICAgICByZXR1cm4gbmV3IEplcnNleVdlYlRhcmdldChnZXRVcmlCdWlsZGVyKCkucmVzb2x2ZVRlbXBsYXRlRnJvbUVuY29kZWQobmFtZSwgdmFsdWUpLCB0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmVyc2V5V2ViVGFyZ2V0IHJlc29sdmVUZW1wbGF0ZXMoTWFwPFN0cmluZywgT2JqZWN0PiB0ZW1wbGF0ZVZhbHVlcykgdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHJlc29sdmVUZW1wbGF0ZXModGVtcGxhdGVWYWx1ZXMsIHRydWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBKZXJzZXlXZWJUYXJnZXQgcmVzb2x2ZVRlbXBsYXRlcyhNYXA8U3RyaW5nLCBPYmplY3Q+IHRlbXBsYXRlVmFsdWVzLCBib29sZWFuIGVuY29kZVNsYXNoSW5QYXRoKQorICAgICAgICAgICAgdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2tOb3RDbG9zZWQoKTsKKyAgICAgICAgY2hlY2tUZW1wbGF0ZVZhbHVlcyh0ZW1wbGF0ZVZhbHVlcyk7CisKKyAgICAgICAgaWYgKHRlbXBsYXRlVmFsdWVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEplcnNleVdlYlRhcmdldChnZXRVcmlCdWlsZGVyKCkucmVzb2x2ZVRlbXBsYXRlcyh0ZW1wbGF0ZVZhbHVlcywgZW5jb2RlU2xhc2hJblBhdGgpLCB0aGlzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBKZXJzZXlXZWJUYXJnZXQgcmVzb2x2ZVRlbXBsYXRlc0Zyb21FbmNvZGVkKE1hcDxTdHJpbmcsIE9iamVjdD4gdGVtcGxhdGVWYWx1ZXMpCisgICAgICAgICAgICB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24geworICAgICAgICBjaGVja05vdENsb3NlZCgpOworICAgICAgICBjaGVja1RlbXBsYXRlVmFsdWVzKHRlbXBsYXRlVmFsdWVzKTsKKworICAgICAgICBpZiAodGVtcGxhdGVWYWx1ZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSmVyc2V5V2ViVGFyZ2V0KGdldFVyaUJ1aWxkZXIoKS5yZXNvbHZlVGVtcGxhdGVzRnJvbUVuY29kZWQodGVtcGxhdGVWYWx1ZXMpLCB0aGlzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIHRlbXBsYXRlIHZhbHVlcyBmb3Ige0Bjb2RlIG51bGx9IHZhbHVlcy4gVGhyb3dzIHtAY29kZSBOdWxsUG9pbnRlckV4Y2VwdGlvbn0gaWYgdGhlIG5hbWUtdmFsdWUgbWFwIG9yIGFueSBvZiB0aGUKKyAgICAgKiBuYW1lcyBvciBlbmNvZGVkIHZhbHVlcyBpbiB0aGUgbWFwIGlzIHtAY29kZSBudWxsfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZW1wbGF0ZVZhbHVlcyBtYXAgdG8gY2hlY2suCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgbmFtZS12YWx1ZSBtYXAgb3IgYW55IG9mIHRoZSBuYW1lcyBvciBlbmNvZGVkIHZhbHVlcyBpbiB0aGUgbWFwCisgICAgICogaXMge0Bjb2RlIG51bGx9LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjaGVja1RlbXBsYXRlVmFsdWVzKGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gdGVtcGxhdGVWYWx1ZXMpIHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiB7CisgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsKHRlbXBsYXRlVmFsdWVzLCAidGVtcGxhdGVWYWx1ZXMgaXMgJ251bGwnLiIpOworCisgICAgICAgIGZvciAoZmluYWwgTWFwLkVudHJ5IGVudHJ5IDogdGVtcGxhdGVWYWx1ZXMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGwoZW50cnkuZ2V0S2V5KCksICJuYW1lIGlzICdudWxsJy4iKTsKKyAgICAgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsKGVudHJ5LmdldFZhbHVlKCksICJ2YWx1ZSBpcyAnbnVsbCcuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmVyc2V5V2ViVGFyZ2V0IHJlZ2lzdGVyKENsYXNzPD8+IHByb3ZpZGVyQ2xhc3MpIHsKKyAgICAgICAgY2hlY2tOb3RDbG9zZWQoKTsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKHByb3ZpZGVyQ2xhc3MpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmVyc2V5V2ViVGFyZ2V0IHJlZ2lzdGVyKE9iamVjdCBwcm92aWRlcikgeworICAgICAgICBjaGVja05vdENsb3NlZCgpOworICAgICAgICBjb25maWcucmVnaXN0ZXIocHJvdmlkZXIpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmVyc2V5V2ViVGFyZ2V0IHJlZ2lzdGVyKENsYXNzPD8+IHByb3ZpZGVyQ2xhc3MsIGludCBiaW5kaW5nUHJpb3JpdHkpIHsKKyAgICAgICAgY2hlY2tOb3RDbG9zZWQoKTsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKHByb3ZpZGVyQ2xhc3MsIGJpbmRpbmdQcmlvcml0eSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBKZXJzZXlXZWJUYXJnZXQgcmVnaXN0ZXIoQ2xhc3M8Pz4gcHJvdmlkZXJDbGFzcywgQ2xhc3M8Pz4uLi4gY29udHJhY3RzKSB7CisgICAgICAgIGNoZWNrTm90Q2xvc2VkKCk7CisgICAgICAgIGNvbmZpZy5yZWdpc3Rlcihwcm92aWRlckNsYXNzLCBjb250cmFjdHMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmVyc2V5V2ViVGFyZ2V0IHJlZ2lzdGVyKENsYXNzPD8+IHByb3ZpZGVyQ2xhc3MsIE1hcDxDbGFzczw/PiwgSW50ZWdlcj4gY29udHJhY3RzKSB7CisgICAgICAgIGNoZWNrTm90Q2xvc2VkKCk7CisgICAgICAgIGNvbmZpZy5yZWdpc3Rlcihwcm92aWRlckNsYXNzLCBjb250cmFjdHMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmVyc2V5V2ViVGFyZ2V0IHJlZ2lzdGVyKE9iamVjdCBwcm92aWRlciwgaW50IGJpbmRpbmdQcmlvcml0eSkgeworICAgICAgICBjaGVja05vdENsb3NlZCgpOworICAgICAgICBjb25maWcucmVnaXN0ZXIocHJvdmlkZXIsIGJpbmRpbmdQcmlvcml0eSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBKZXJzZXlXZWJUYXJnZXQgcmVnaXN0ZXIoT2JqZWN0IHByb3ZpZGVyLCBDbGFzczw/Pi4uLiBjb250cmFjdHMpIHsKKyAgICAgICAgY2hlY2tOb3RDbG9zZWQoKTsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKHByb3ZpZGVyLCBjb250cmFjdHMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmVyc2V5V2ViVGFyZ2V0IHJlZ2lzdGVyKE9iamVjdCBwcm92aWRlciwgTWFwPENsYXNzPD8+LCBJbnRlZ2VyPiBjb250cmFjdHMpIHsKKyAgICAgICAgY2hlY2tOb3RDbG9zZWQoKTsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKHByb3ZpZGVyLCBjb250cmFjdHMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmVyc2V5V2ViVGFyZ2V0IHByb3BlcnR5KFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgY2hlY2tOb3RDbG9zZWQoKTsKKyAgICAgICAgY29uZmlnLnByb3BlcnR5KG5hbWUsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENsaWVudENvbmZpZyBnZXRDb25maWd1cmF0aW9uKCkgeworICAgICAgICBjaGVja05vdENsb3NlZCgpOworICAgICAgICByZXR1cm4gY29uZmlnLmdldENvbmZpZ3VyYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmVyc2V5V2ViVGFyZ2V0IHByZUluaXRpYWxpemUoKSB7CisgICAgICAgIGNvbmZpZy5wcmVJbml0aWFsaXplKCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiSmVyc2V5V2ViVGFyZ2V0IHsgIiArIHRhcmdldFVyaS50b1RlbXBsYXRlKCkgKyAiIH0iOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L1JlcXVlc3RFbnRpdHlQcm9jZXNzaW5nLmphdmEgYi9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9SZXF1ZXN0RW50aXR5UHJvY2Vzc2luZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZDFhYzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9SZXF1ZXN0RW50aXR5UHJvY2Vzc2luZy5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50OworCisvKioKKyAqIERlZmluZXMgdmFsdWVzIGZvciB0aGUge0BsaW5rIENsaWVudFByb3BlcnRpZXMjUkVRVUVTVF9FTlRJVFlfUFJPQ0VTU0lOR30gcHJvcGVydHkuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgZW51bSBSZXF1ZXN0RW50aXR5UHJvY2Vzc2luZyB7CisgICAgLyoqCisgICAgICogUmVxdWVzdCBlbnRpdHkgd2lsbCBiZSBidWZmZXJlZCBpbiB0aGUgbWVtb3J5IGluIG9yZGVyIHRvIGRldGVybWluZSBjb250ZW50IGxlbmd0aCB0aGF0CisgICAgICogd2lsbCBiZSBzZW5kIGFzIGEgQ29udGVudC1MZW5ndGggaGVhZGVyIGluIHRoZSByZXF1ZXN0LgorICAgICAqLworICAgIEJVRkZFUkVELAorCisgICAgLyoqCisgICAgICogRW50aXR5IHdpbGwgYmUgc2VuZCBhcyBjaHVua2VkIGVuY29kZWQgKG5vIENvbnRlbnQtbGVuZ3RoIGlzIHNwZWNpZmllZCwgZW50aXR5IGlzIHN0cmVhbWVkKS4KKyAgICAgKi8KKyAgICBDSFVOS0VECisKK30KZGlmZiAtLWdpdCBhL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L1JlcXVlc3RQcm9jZXNzaW5nSW5pdGlhbGl6YXRpb25TdGFnZS5qYXZhIGIvY29yZS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvUmVxdWVzdFByb2Nlc3NpbmdJbml0aWFsaXphdGlvblN0YWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlkZTc5MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L1JlcXVlc3RQcm9jZXNzaW5nSW5pdGlhbGl6YXRpb25TdGFnZS5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50OworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW1TdXBwb3J0OworCitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJlYWRlckludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvcjsKKworaW1wb3J0IGphdmF4LmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5Qcm92aWRlcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLlJlZjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLk1lc3NhZ2VCb2R5V29ya2VyczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb2RlbC5pbnRlcm5hbC5SYW5rZWRDb21wYXJhdG9yOworCisvKioKKyAqIEZ1bmN0aW9uIHRoYXQgY2FuIGJlIHB1dCB0byBhbiBhY2NlcHRvciBjaGFpbiB0byBwcm9wZXJseSBpbml0aWFsaXplCisgKiB0aGUgY2xpZW50LXNpZGUgcmVxdWVzdC1zY29wZWQgcHJvY2Vzc2luZyBpbmplY3Rpb24gZm9yIHRoZSBjdXJyZW50CisgKiByZXF1ZXN0IGFuZCByZXNwb25zZSBleGNoYW5nZS4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgUmVxdWVzdFByb2Nlc3NpbmdJbml0aWFsaXphdGlvblN0YWdlIGltcGxlbWVudHMgRnVuY3Rpb248Q2xpZW50UmVxdWVzdCwgQ2xpZW50UmVxdWVzdD4geworICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8UmVmPENsaWVudFJlcXVlc3Q+PiByZXF1ZXN0UmVmUHJvdmlkZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBNZXNzYWdlQm9keVdvcmtlcnMgd29ya2Vyc1Byb3ZpZGVyOworICAgIHByaXZhdGUgZmluYWwgSXRlcmFibGU8V3JpdGVySW50ZXJjZXB0b3I+IHdyaXRlckludGVyY2VwdG9yczsKKyAgICBwcml2YXRlIGZpbmFsIEl0ZXJhYmxlPFJlYWRlckludGVyY2VwdG9yPiByZWFkZXJJbnRlcmNlcHRvcnM7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLk1lc3NhZ2VCb2R5V29ya2Vyc30gaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24KKyAgICAgKiBmb3IgcmVxdWVzdHMgYW5kIHJlc3BvbnNlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0UmVmUHJvdmlkZXIgY2xpZW50IHJlcXVlc3QgY29udGV4dCByZWZlcmVuY2UgaW5qZWN0aW9uIHByb3ZpZGVyLgorICAgICAqIEBwYXJhbSB3b3JrZXJzUHJvdmlkZXIgbWVzc2FnZSBib2R5IHdvcmtlcnMgaW5qZWN0aW9uIHByb3ZpZGVyLgorICAgICAqIEBwYXJhbSBpbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbiBtYW5hZ2VyLgorICAgICAqLworICAgIHB1YmxpYyBSZXF1ZXN0UHJvY2Vzc2luZ0luaXRpYWxpemF0aW9uU3RhZ2UoCisgICAgICAgICAgICBQcm92aWRlcjxSZWY8Q2xpZW50UmVxdWVzdD4+IHJlcXVlc3RSZWZQcm92aWRlciwKKyAgICAgICAgICAgIE1lc3NhZ2VCb2R5V29ya2VycyB3b3JrZXJzUHJvdmlkZXIsCisgICAgICAgICAgICBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIpIHsKKyAgICAgICAgdGhpcy5yZXF1ZXN0UmVmUHJvdmlkZXIgPSByZXF1ZXN0UmVmUHJvdmlkZXI7CisgICAgICAgIHRoaXMud29ya2Vyc1Byb3ZpZGVyID0gd29ya2Vyc1Byb3ZpZGVyOworICAgICAgICB3cml0ZXJJbnRlcmNlcHRvcnMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KAorICAgICAgICAgICAgICAgIFN0cmVhbVN1cHBvcnQuc3RyZWFtKAorICAgICAgICAgICAgICAgICAgICAgICAgUHJvdmlkZXJzLmdldEFsbFByb3ZpZGVycyhpbmplY3Rpb25NYW5hZ2VyLCBXcml0ZXJJbnRlcmNlcHRvci5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJhbmtlZENvbXBhcmF0b3I8PigpKS5zcGxpdGVyYXRvcigpLCBmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkKKyAgICAgICAgKTsKKyAgICAgICAgcmVhZGVySW50ZXJjZXB0b3JzID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCgKKyAgICAgICAgICAgICAgICBTdHJlYW1TdXBwb3J0LnN0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb3ZpZGVycy5nZXRBbGxQcm92aWRlcnMoaW5qZWN0aW9uTWFuYWdlciwgUmVhZGVySW50ZXJjZXB0b3IuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSYW5rZWRDb21wYXJhdG9yPD4oKSkuc3BsaXRlcmF0b3IoKSwgZmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpCisgICAgICAgICk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENsaWVudFJlcXVlc3QgYXBwbHkoQ2xpZW50UmVxdWVzdCByZXF1ZXN0Q29udGV4dCkgeworICAgICAgICByZXF1ZXN0UmVmUHJvdmlkZXIuZ2V0KCkuc2V0KHJlcXVlc3RDb250ZXh0KTsKKyAgICAgICAgcmVxdWVzdENvbnRleHQuc2V0V29ya2Vycyh3b3JrZXJzUHJvdmlkZXIpOworICAgICAgICByZXF1ZXN0Q29udGV4dC5zZXRXcml0ZXJJbnRlcmNlcHRvcnMod3JpdGVySW50ZXJjZXB0b3JzKTsKKyAgICAgICAgcmVxdWVzdENvbnRleHQuc2V0UmVhZGVySW50ZXJjZXB0b3JzKHJlYWRlckludGVyY2VwdG9ycyk7CisKKyAgICAgICAgcmV0dXJuIHJlcXVlc3RDb250ZXh0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L1Jlc3BvbnNlQ2FsbGJhY2suamF2YSBiL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L1Jlc3BvbnNlQ2FsbGJhY2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWQ5MDY0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvUmVzcG9uc2VDYWxsYmFjay5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50OworCitpbXBvcnQgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWwuUmVxdWVzdFNjb3BlOworCisvKioKKyAqIENsaWVudCByZXNwb25zZSBwcm9jZXNzaW5nIGNhbGxiYWNrLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK2ludGVyZmFjZSBSZXNwb25zZUNhbGxiYWNrIHsKKworICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSBjbGllbnQgaW52b2NhdGlvbiB3YXMgc3VjY2Vzc2Z1bGx5IGNvbXBsZXRlZCB3aXRoIGEgcmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgcmVzcG9uc2UgZGF0YS4KKyAgICAgKiBAcGFyYW0gc2NvcGUgcmVxdWVzdCBwcm9jZXNzaW5nIHNjb3BlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvbXBsZXRlZChDbGllbnRSZXNwb25zZSByZXNwb25zZSwgUmVxdWVzdFNjb3BlIHNjb3BlKTsKKworICAgIC8qKgorICAgICAqIENhbGxlZCB3aGVuIHRoZSBpbnZvY2F0aW9uIGhhcyBmYWlsZWQgZm9yIGFueSByZWFzb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXJyb3IgY29udGFpbnMgZmFpbHVyZSBkZXRhaWxzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGZhaWxlZChQcm9jZXNzaW5nRXhjZXB0aW9uIGVycm9yKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L2F1dGhlbnRpY2F0aW9uL0Jhc2ljQXV0aGVudGljYXRvci5qYXZhIGIvY29yZS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvYXV0aGVudGljYXRpb24vQmFzaWNBdXRoZW50aWNhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUyNjMwNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L2F1dGhlbnRpY2F0aW9uL0Jhc2ljQXV0aGVudGljYXRvci5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5hdXRoZW50aWNhdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVzcG9uc2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5CYXNlNjQ7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgQmFzaWMgSHR0cCBBdXRoZW50aWNhdGlvbiBtZXRob2QgKFJGQyAyNjE3KS4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBDcmFpZyBNY0NsYW5haGFuCisgKi8KK2ZpbmFsIGNsYXNzIEJhc2ljQXV0aGVudGljYXRvciB7CisKKyAgICBwcml2YXRlIGZpbmFsIEh0dHBBdXRoZW50aWNhdGlvbkZpbHRlci5DcmVkZW50aWFscyBkZWZhdWx0Q3JlZGVudGlhbHM7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIGJhc2ljIGF1dGhlbnRpY2F0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVmYXVsdENyZWRlbnRpYWxzIENyZWRlbnRpYWxzLiBDYW4gYmUge0Bjb2RlIG51bGx9IGlmIG5vIGRlZmF1bHQgY3JlZGVudGlhbHMgc2hvdWxkIGJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkLgorICAgICAqLworICAgIEJhc2ljQXV0aGVudGljYXRvcihIdHRwQXV0aGVudGljYXRpb25GaWx0ZXIuQ3JlZGVudGlhbHMgZGVmYXVsdENyZWRlbnRpYWxzKSB7CisgICAgICAgIHRoaXMuZGVmYXVsdENyZWRlbnRpYWxzID0gZGVmYXVsdENyZWRlbnRpYWxzOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGNhbGN1bGF0ZUF1dGhlbnRpY2F0aW9uKEh0dHBBdXRoZW50aWNhdGlvbkZpbHRlci5DcmVkZW50aWFscyBjcmVkZW50aWFscykgeworICAgICAgICBTdHJpbmcgdXNlcm5hbWUgPSBjcmVkZW50aWFscy5nZXRVc2VybmFtZSgpOworICAgICAgICBieXRlW10gcGFzc3dvcmQgPSBjcmVkZW50aWFscy5nZXRQYXNzd29yZCgpOworICAgICAgICBpZiAodXNlcm5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdXNlcm5hbWUgPSAiIjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwYXNzd29yZCA9PSBudWxsKSB7CisgICAgICAgICAgICBwYXNzd29yZCA9IG5ldyBieXRlWzBdOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgYnl0ZVtdIHByZWZpeCA9ICh1c2VybmFtZSArICI6IikuZ2V0Qnl0ZXMoSHR0cEF1dGhlbnRpY2F0aW9uRmlsdGVyLkNIQVJBQ1RFUl9TRVQpOworICAgICAgICBmaW5hbCBieXRlW10gdXNlcm5hbWVQYXNzd29yZCA9IG5ldyBieXRlW3ByZWZpeC5sZW5ndGggKyBwYXNzd29yZC5sZW5ndGhdOworCisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkocHJlZml4LCAwLCB1c2VybmFtZVBhc3N3b3JkLCAwLCBwcmVmaXgubGVuZ3RoKTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShwYXNzd29yZCwgMCwgdXNlcm5hbWVQYXNzd29yZCwgcHJlZml4Lmxlbmd0aCwgcGFzc3dvcmQubGVuZ3RoKTsKKworICAgICAgICByZXR1cm4gIkJhc2ljICIgKyBCYXNlNjQuZW5jb2RlQXNTdHJpbmcodXNlcm5hbWVQYXNzd29yZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiB0byB0aGUgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFJlcXVlc3QgY29udGV4dC4KKyAgICAgKiBAdGhyb3dzIFJlcXVlc3RBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbiBpbiBjYXNlIHRoYXQgYmFzaWMgY3JlZGVudGlhbHMgbWlzc2luZyBvciBhcmUgaW4gaW52YWxpZCBmb3JtYXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmaWx0ZXJSZXF1ZXN0KENsaWVudFJlcXVlc3RDb250ZXh0IHJlcXVlc3QpIHRocm93cyBSZXF1ZXN0QXV0aGVudGljYXRpb25FeGNlcHRpb24geworICAgICAgICBIdHRwQXV0aGVudGljYXRpb25GaWx0ZXIuQ3JlZGVudGlhbHMgY3JlZGVudGlhbHMgPSBIdHRwQXV0aGVudGljYXRpb25GaWx0ZXIuZ2V0Q3JlZGVudGlhbHMocmVxdWVzdCwKKyAgICAgICAgICAgICAgICBkZWZhdWx0Q3JlZGVudGlhbHMsIEh0dHBBdXRoZW50aWNhdGlvbkZpbHRlci5UeXBlLkJBU0lDKTsKKyAgICAgICAgaWYgKGNyZWRlbnRpYWxzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSZXF1ZXN0QXV0aGVudGljYXRpb25FeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuQVVUSEVOVElDQVRJT05fQ1JFREVOVElBTFNfTUlTU0lOR19CQVNJQygpKTsKKyAgICAgICAgfQorICAgICAgICByZXF1ZXN0LmdldEhlYWRlcnMoKS5hZGQoSHR0cEhlYWRlcnMuQVVUSE9SSVpBVElPTiwgY2FsY3VsYXRlQXV0aGVudGljYXRpb24oY3JlZGVudGlhbHMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgdGhlIHJlc3BvbnNlIGFuZCBpZiBiYXNpYyBhdXRoZW50aWNhdGlvbiBpcyByZXF1aXJlZCB0aGVuIHBlcmZvcm1zIGEgbmV3IHJlcXVlc3QKKyAgICAgKiB3aXRoIGJhc2ljIGF1dGhlbnRpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgIFJlcXVlc3QgY29udGV4dC4KKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgUmVzcG9uc2UgY29udGV4dCAod2lsbCBiZSB1cGRhdGVkIHdpdGggbmV3ZXN0IHJlc3BvbnNlIGRhdGEgaWYgdGhlIHJlcXVlc3Qgd2FzIHJlcGVhdGVkKS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiByZXNwb25zZSBkb2VzIG5vdCByZXF1aXJlIGF1dGhlbnRpY2F0aW9uIG9yIGlmIGF1dGhlbnRpY2F0aW9uIGlzIHJlcXVpcmVkLAorICAgICAqIG5ldyByZXF1ZXN0IHdhcyBkb25lIHdpdGggZGlnZXN0IGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uIGFuZCBhdXRoZW50aWNhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KKyAgICAgKiBAdGhyb3dzIFJlc3BvbnNlQXV0aGVudGljYXRpb25FeGNlcHRpb24gaW4gY2FzZSB0aGF0IGJhc2ljIGNyZWRlbnRpYWxzIG1pc3Npbmcgb3IgYXJlIGluIGludmFsaWQgZm9ybWF0CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZmlsdGVyUmVzcG9uc2VBbmRBdXRoZW50aWNhdGUoQ2xpZW50UmVxdWVzdENvbnRleHQgcmVxdWVzdCwgQ2xpZW50UmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBhdXRoZW50aWNhdGUgPSByZXNwb25zZS5nZXRIZWFkZXJzKCkuZ2V0Rmlyc3QoSHR0cEhlYWRlcnMuV1dXX0FVVEhFTlRJQ0FURSk7CisgICAgICAgIGlmIChhdXRoZW50aWNhdGUgIT0gbnVsbCAmJiBhdXRoZW50aWNhdGUudHJpbSgpLnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aCgiQkFTSUMiKSkgeworICAgICAgICAgICAgSHR0cEF1dGhlbnRpY2F0aW9uRmlsdGVyLkNyZWRlbnRpYWxzIGNyZWRlbnRpYWxzID0gSHR0cEF1dGhlbnRpY2F0aW9uRmlsdGVyCisgICAgICAgICAgICAgICAgICAgIC5nZXRDcmVkZW50aWFscyhyZXF1ZXN0LCBkZWZhdWx0Q3JlZGVudGlhbHMsIEh0dHBBdXRoZW50aWNhdGlvbkZpbHRlci5UeXBlLkJBU0lDKTsKKworICAgICAgICAgICAgaWYgKGNyZWRlbnRpYWxzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVzcG9uc2VBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbihudWxsLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5BVVRIRU5USUNBVElPTl9DUkVERU5USUFMU19NSVNTSU5HX0JBU0lDKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gSHR0cEF1dGhlbnRpY2F0aW9uRmlsdGVyLnJlcGVhdFJlcXVlc3QocmVxdWVzdCwgcmVzcG9uc2UsIGNhbGN1bGF0ZUF1dGhlbnRpY2F0aW9uKGNyZWRlbnRpYWxzKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L2F1dGhlbnRpY2F0aW9uL0RpZ2VzdEF1dGhlbnRpY2F0b3IuamF2YSBiL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L2F1dGhlbnRpY2F0aW9uL0RpZ2VzdEF1dGhlbnRpY2F0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWY3NWJkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvYXV0aGVudGljYXRpb24vRGlnZXN0QXV0aGVudGljYXRvci5qYXZhCkBAIC0wLDAgKzEsNDYzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5hdXRoZW50aWNhdGlvbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlNlY3VyZVJhbmRvbTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVzcG9uc2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLk1lc3NhZ2VVdGlsczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS51cmkuVXJpQ29tcG9uZW50OworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIERpZ2VzdCBIdHRwIEF1dGhlbnRpY2F0aW9uIG1ldGhvZCAoUkZDIDI2MTcpLgorICoKKyAqIEBhdXRob3IgcmFwaGFlbC5qb2xpdmV0QGdtYWlsLmNvbQorICogQGF1dGhvciBTdGVmYW4gS2F0ZXJrYW1wIChzdGVmYW5Aa2F0ZXJrYW1wLmRlKQorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitmaW5hbCBjbGFzcyBEaWdlc3RBdXRoZW50aWNhdG9yIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBIRVhfQVJSQVkgPSB7JzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLCAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnfTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIEtFWV9WQUxVRV9QQUlSX1BBVFRFUk4gPSBQYXR0ZXJuLmNvbXBpbGUoIihcXHcrKVxccyo9XFxzKihcIihbXlwiXSspXCJ8KFxcdyspKVxccyosP1xccyoiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX05PTkNFX0JZVEVfQ09VTlQgPSA0OworCisgICAgcHJpdmF0ZSBmaW5hbCBTZWN1cmVSYW5kb20gcmFuZG9tR2VuZXJhdG9yOworICAgIHByaXZhdGUgZmluYWwgSHR0cEF1dGhlbnRpY2F0aW9uRmlsdGVyLkNyZWRlbnRpYWxzIGNyZWRlbnRpYWxzOworCisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8VVJJLCBEaWdlc3RTY2hlbWU+IGRpZ2VzdENhY2hlOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIGluaXRpYWxpemVkIGZyb20gY3JlZGVudGlhbHMgYW5kIGNvbmZpZ3VyYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3JlZGVudGlhbHMgQ3JlZGVudGlhbHMuIENhbiBiZSB7QGNvZGUgbnVsbH0gaWYgdGhlcmUgYXJlIG5vIGRlZmF1bHQgY3JlZGVudGlhbHMuCisgICAgICogQHBhcmFtIGxpbWl0ICAgICAgIE1heGltdW0gbnVtYmVyIG9mIFVSSXMgdGhhdCBzaG91bGQgYmUga2VwdCBpbiB0aGUgY2FjaGUgY29udGFpbmluZyBVUklzIGFuZCB0aGVpcgorICAgICAqICAgICAgICAgICAgICAgICAgICB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LmF1dGhlbnRpY2F0aW9uLkRpZ2VzdEF1dGhlbnRpY2F0b3IuRGlnZXN0U2NoZW1lfS4KKyAgICAgKi8KKyAgICBEaWdlc3RBdXRoZW50aWNhdG9yKGZpbmFsIEh0dHBBdXRoZW50aWNhdGlvbkZpbHRlci5DcmVkZW50aWFscyBjcmVkZW50aWFscywgZmluYWwgaW50IGxpbWl0KSB7CisgICAgICAgIHRoaXMuY3JlZGVudGlhbHMgPSBjcmVkZW50aWFsczsKKworICAgICAgICBkaWdlc3RDYWNoZSA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcChuZXcgTGlua2VkSGFzaE1hcDxVUkksIERpZ2VzdFNjaGVtZT4obGltaXQpIHsKKyAgICAgICAgICAgIC8vIHVzZSBpZCBhcyBpdCBpcyBhbiBhbm9ueW1vdXMgaW5uZXIgY2xhc3Mgd2l0aCBjaGFuZ2VkIGJlaGF2aW91cgorICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjU0NjI0NTYyNUw7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRWxkZXN0RW50cnkoZmluYWwgTWFwLkVudHJ5IGVsZGVzdCkgeworICAgICAgICAgICAgICAgIHJldHVybiBzaXplKCkgPiBsaW1pdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJhbmRvbUdlbmVyYXRvciA9IFNlY3VyZVJhbmRvbS5nZXRJbnN0YW5jZSgiU0hBMVBSTkciKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSZXF1ZXN0QXV0aGVudGljYXRpb25FeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfRElHRVNUX0ZJTFRFUl9HRU5FUkFUT1IoKSwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHJlcXVlc3QgYW5kIGFkZCBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiBpZiBwb3NzaWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IFJlcXVlc3QgY29udGV4dC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbiB3YXMgYWRkZWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBXaGVuIGVycm9yIHdpdGggZW5jcnlwdGlvbiBvY2N1cnMuCisgICAgICovCisgICAgYm9vbGVhbiBmaWx0ZXJSZXF1ZXN0KGZpbmFsIENsaWVudFJlcXVlc3RDb250ZXh0IHJlcXVlc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIERpZ2VzdFNjaGVtZSBkaWdlc3RTY2hlbWUgPSBkaWdlc3RDYWNoZS5nZXQocmVxdWVzdC5nZXRVcmkoKSk7CisgICAgICAgIGlmIChkaWdlc3RTY2hlbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgSHR0cEF1dGhlbnRpY2F0aW9uRmlsdGVyLkNyZWRlbnRpYWxzIGNyZWQgPSBIdHRwQXV0aGVudGljYXRpb25GaWx0ZXIuZ2V0Q3JlZGVudGlhbHMocmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5jcmVkZW50aWFscywgSHR0cEF1dGhlbnRpY2F0aW9uRmlsdGVyLlR5cGUuRElHRVNUKTsKKyAgICAgICAgICAgIGlmIChjcmVkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LmdldEhlYWRlcnMoKS5hZGQoSHR0cEhlYWRlcnMuQVVUSE9SSVpBVElPTiwgY3JlYXRlTmV4dEF1dGhUb2tlbihkaWdlc3RTY2hlbWUsIHJlcXVlc3QsIGNyZWQpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvY2VzcyByZXNwb25zZSBhbmQgcmVwZWF0IHRoZSByZXF1ZXN0IGlmIGRpZ2VzdCBhdXRoZW50aWNhdGlvbiBpcyByZXF1ZXN0ZWQuIFdoZW4gcmVxdWVzdCBpcyByZXBlYXRlZAorICAgICAqIHRoZSByZXNwb25zZSB3aWxsIGJlIG1vZGlmaWVkIHRvIGNvbnRhaW4gbmV3IHJlc3BvbnNlIGluZm9ybWF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgIFJlcXVlc3QgY29udGV4dC4KKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgUmVzcG9uc2UgY29udGV4dCAod2lsbCBiZSB1cGRhdGVkIHdpdGggbmV3ZXN0IHJlc3BvbnNlIGRhdGEgaWYgdGhlIHJlcXVlc3Qgd2FzIHJlcGVhdGVkKS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiByZXNwb25zZSBkb2VzIG5vdCByZXF1aXJlIGF1dGhlbnRpY2F0aW9uIG9yIGlmIGF1dGhlbnRpY2F0aW9uIGlzIHJlcXVpcmVkLAorICAgICAqIG5ldyByZXF1ZXN0IHdhcyBkb25lIHdpdGggZGlnZXN0IGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uIGFuZCBhdXRoZW50aWNhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIFdoZW4gZXJyb3Igd2l0aCBlbmNyeXB0aW9uIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBmaWx0ZXJSZXNwb25zZShmaW5hbCBDbGllbnRSZXF1ZXN0Q29udGV4dCByZXF1ZXN0LCBmaW5hbCBDbGllbnRSZXNwb25zZUNvbnRleHQgcmVzcG9uc2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKFJlc3BvbnNlLlN0YXR1cy5mcm9tU3RhdHVzQ29kZShyZXNwb25zZS5nZXRTdGF0dXMoKSkgPT0gUmVzcG9uc2UuU3RhdHVzLlVOQVVUSE9SSVpFRCkgeworCisgICAgICAgICAgICBmaW5hbCBEaWdlc3RTY2hlbWUgZGlnZXN0U2NoZW1lID0gcGFyc2VBdXRoSGVhZGVycyhyZXNwb25zZS5nZXRIZWFkZXJzKCkuZ2V0KEh0dHBIZWFkZXJzLldXV19BVVRIRU5USUNBVEUpKTsKKyAgICAgICAgICAgIGlmIChkaWdlc3RTY2hlbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gYXNzZW1ibGUgYXV0aGVudGljYXRpb24gcmVxdWVzdCBhbmQgcmVzZW5kIGl0CisgICAgICAgICAgICBmaW5hbCBIdHRwQXV0aGVudGljYXRpb25GaWx0ZXIuQ3JlZGVudGlhbHMgY3JlZCA9IEh0dHBBdXRoZW50aWNhdGlvbkZpbHRlci5nZXRDcmVkZW50aWFscyhyZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWRlbnRpYWxzLCBIdHRwQXV0aGVudGljYXRpb25GaWx0ZXIuVHlwZS5ESUdFU1QpOworICAgICAgICAgICAgaWYgKGNyZWQgPT0gbnVsbCkgeworCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlc3BvbnNlQXV0aGVudGljYXRpb25FeGNlcHRpb24obnVsbCwgTG9jYWxpemF0aW9uTWVzc2FnZXMuQVVUSEVOVElDQVRJT05fQ1JFREVOVElBTFNfTUlTU0lOR19ESUdFU1QoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gc3VjY2VzcyA9IEh0dHBBdXRoZW50aWNhdGlvbkZpbHRlci5yZXBlYXRSZXF1ZXN0KHJlcXVlc3QsIHJlc3BvbnNlLCBjcmVhdGVOZXh0QXV0aFRva2VuKGRpZ2VzdFNjaGVtZSwKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCwgY3JlZCkpOworICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICBkaWdlc3RDYWNoZS5wdXQocmVxdWVzdC5nZXRVcmkoKSwgZGlnZXN0U2NoZW1lKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGlnZXN0Q2FjaGUucmVtb3ZlKHJlcXVlc3QuZ2V0VXJpKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN1Y2Nlc3M7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFyc2UgZGlnZXN0IGhlYWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBoZWFkZXJzIExpc3Qgb2YgaGVhZGVyIHN0cmluZ3MKKyAgICAgKiBAcmV0dXJuIERpZ2VzdFNjaGVtZSBvciB7QGNvZGUgbnVsbH0gaWYgbm8gZGlnZXN0IGhlYWRlciBleGlzdHMuCisgICAgICovCisgICAgcHJpdmF0ZSBEaWdlc3RTY2hlbWUgcGFyc2VBdXRoSGVhZGVycyhmaW5hbCBMaXN0PD8+IGhlYWRlcnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGhlYWRlcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChmaW5hbCBPYmplY3QgbGluZU9iamVjdCA6IGhlYWRlcnMpIHsKKworICAgICAgICAgICAgaWYgKCEobGluZU9iamVjdCBpbnN0YW5jZW9mIFN0cmluZykpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBsaW5lID0gKFN0cmluZykgbGluZU9iamVjdDsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIHBhcnRzID0gbGluZS50cmltKCkuc3BsaXQoIlxccysiLCAyKTsKKworICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCAhPSAyKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoISJkaWdlc3QiLmVxdWFscyhwYXJ0c1swXS50b0xvd2VyQ2FzZSgpKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgcmVhbG0gPSBudWxsOworICAgICAgICAgICAgU3RyaW5nIG5vbmNlID0gbnVsbDsKKyAgICAgICAgICAgIFN0cmluZyBvcGFxdWUgPSBudWxsOworICAgICAgICAgICAgUU9QIHFvcCA9IFFPUC5VTlNQRUNJRklFRDsKKyAgICAgICAgICAgIEFsZ29yaXRobSBhbGdvcml0aG0gPSBBbGdvcml0aG0uVU5TUEVDSUZJRUQ7CisgICAgICAgICAgICBib29sZWFuIHN0YWxlID0gZmFsc2U7CisKKyAgICAgICAgICAgIGZpbmFsIE1hdGNoZXIgbWF0Y2ggPSBLRVlfVkFMVUVfUEFJUl9QQVRURVJOLm1hdGNoZXIocGFydHNbMV0pOworICAgICAgICAgICAgd2hpbGUgKG1hdGNoLmZpbmQoKSkgeworICAgICAgICAgICAgICAgIC8vIGV4cGVjdCA0IGdyb3VwcyAoa2V5KT0oIih2YWwpIiB8ICh2YWwpKQorICAgICAgICAgICAgICAgIGZpbmFsIGludCBuYkdyb3VwcyA9IG1hdGNoLmdyb3VwQ291bnQoKTsKKyAgICAgICAgICAgICAgICBpZiAobmJHcm91cHMgIT0gNCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGtleSA9IG1hdGNoLmdyb3VwKDEpOworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWxOb1F1b3RlcyA9IG1hdGNoLmdyb3VwKDMpOworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWxRdW90ZXMgPSBtYXRjaC5ncm91cCg0KTsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsID0gKHZhbE5vUXVvdGVzID09IG51bGwpID8gdmFsUXVvdGVzIDogdmFsTm9RdW90ZXM7CisgICAgICAgICAgICAgICAgaWYgKCJxb3AiLmVxdWFscyhrZXkpKSB7CisgICAgICAgICAgICAgICAgICAgIHFvcCA9IFFPUC5wYXJzZSh2YWwpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoInJlYWxtIi5lcXVhbHMoa2V5KSkgeworICAgICAgICAgICAgICAgICAgICByZWFsbSA9IHZhbDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJub25jZSIuZXF1YWxzKGtleSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbm9uY2UgPSB2YWw7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgib3BhcXVlIi5lcXVhbHMoa2V5KSkgeworICAgICAgICAgICAgICAgICAgICBvcGFxdWUgPSB2YWw7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgic3RhbGUiLmVxdWFscyhrZXkpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YWxlID0gQm9vbGVhbi5wYXJzZUJvb2xlYW4odmFsKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJhbGdvcml0aG0iLmVxdWFscyhrZXkpKSB7CisgICAgICAgICAgICAgICAgICAgIGFsZ29yaXRobSA9IEFsZ29yaXRobS5wYXJzZSh2YWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgRGlnZXN0U2NoZW1lKHJlYWxtLCBub25jZSwgb3BhcXVlLCBxb3AsIGFsZ29yaXRobSwgc3RhbGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgZGlnZXN0IHN0cmluZyBpbmNsdWRpbmcgY291bnRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkcyAgICAgICAgICAgICBEaWdlc3RTY2hlbWUgaW5zdGFuY2UKKyAgICAgKiBAcGFyYW0gcmVxdWVzdENvbnRleHQgY2xpZW50IHJlcXVlc3QgY29udGV4dAorICAgICAqIEByZXR1cm4gZGlnZXN0IGF1dGhlbnRpY2F0aW9uIHRva2VuIHN0cmluZworICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBjcmVhdGVOZXh0QXV0aFRva2VuKGZpbmFsIERpZ2VzdFNjaGVtZSBkcywgZmluYWwgQ2xpZW50UmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBIdHRwQXV0aGVudGljYXRpb25GaWx0ZXIuQ3JlZGVudGlhbHMgY3JlZGVudGlhbHMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigxMDApOworICAgICAgICBzYi5hcHBlbmQoIkRpZ2VzdCAiKTsKKyAgICAgICAgYXBwZW5kKHNiLCAidXNlcm5hbWUiLCBjcmVkZW50aWFscy5nZXRVc2VybmFtZSgpKTsKKyAgICAgICAgYXBwZW5kKHNiLCAicmVhbG0iLCBkcy5nZXRSZWFsbSgpKTsKKyAgICAgICAgYXBwZW5kKHNiLCAibm9uY2UiLCBkcy5nZXROb25jZSgpKTsKKyAgICAgICAgYXBwZW5kKHNiLCAib3BhcXVlIiwgZHMuZ2V0T3BhcXVlKCkpOworICAgICAgICBhcHBlbmQoc2IsICJhbGdvcml0aG0iLCBkcy5nZXRBbGdvcml0aG0oKS50b1N0cmluZygpLCBmYWxzZSk7CisgICAgICAgIGFwcGVuZChzYiwgInFvcCIsIGRzLmdldFFvcCgpLnRvU3RyaW5nKCksIGZhbHNlKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgdXJpID0gVXJpQ29tcG9uZW50LmZ1bGxSZWxhdGl2ZVVyaShyZXF1ZXN0Q29udGV4dC5nZXRVcmkoKSk7CisgICAgICAgIGFwcGVuZChzYiwgInVyaSIsIHVyaSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGhhMTsKKyAgICAgICAgaWYgKGRzLmdldEFsZ29yaXRobSgpID09IEFsZ29yaXRobS5NRDVfU0VTUykgeworICAgICAgICAgICAgaGExID0gbWQ1KG1kNShjcmVkZW50aWFscy5nZXRVc2VybmFtZSgpLCBkcy5nZXRSZWFsbSgpLAorICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nKGNyZWRlbnRpYWxzLmdldFBhc3N3b3JkKCksIE1lc3NhZ2VVdGlscy5nZXRDaGFyc2V0KHJlcXVlc3RDb250ZXh0LmdldE1lZGlhVHlwZSgpKSkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGhhMSA9IG1kNShjcmVkZW50aWFscy5nZXRVc2VybmFtZSgpLCBkcy5nZXRSZWFsbSgpLAorICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nKGNyZWRlbnRpYWxzLmdldFBhc3N3b3JkKCksIE1lc3NhZ2VVdGlscy5nZXRDaGFyc2V0KHJlcXVlc3RDb250ZXh0LmdldE1lZGlhVHlwZSgpKSkpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGhhMiA9IG1kNShyZXF1ZXN0Q29udGV4dC5nZXRNZXRob2QoKSwgdXJpKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzcG9uc2U7CisgICAgICAgIGlmIChkcy5nZXRRb3AoKSA9PSBRT1AuVU5TUEVDSUZJRUQpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlID0gbWQ1KGhhMSwgZHMuZ2V0Tm9uY2UoKSwgaGEyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjbm9uY2UgPSByYW5kb21CeXRlcyhDTElFTlRfTk9OQ0VfQllURV9DT1VOVCk7IC8vIGNsaWVudCBub25jZQorICAgICAgICAgICAgYXBwZW5kKHNiLCAiY25vbmNlIiwgY25vbmNlKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYyA9IFN0cmluZy5mb3JtYXQoIiUwOHgiLCBkcy5pbmNyZW1lbnRDb3VudGVyKCkpOyAvLyBjb3VudGVyCisgICAgICAgICAgICBhcHBlbmQoc2IsICJuYyIsIG5jLCBmYWxzZSk7CisgICAgICAgICAgICByZXNwb25zZSA9IG1kNShoYTEsIGRzLmdldE5vbmNlKCksIG5jLCBjbm9uY2UsIGRzLmdldFFvcCgpLnRvU3RyaW5nKCksIGhhMik7CisgICAgICAgIH0KKyAgICAgICAgYXBwZW5kKHNiLCAicmVzcG9uc2UiLCByZXNwb25zZSk7CisKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwZW5kIGNvbW1hIHNlcGFyYXRlZCBrZXk9dmFsdWUgdG9rZW4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzYiAgICAgICBzdHJpbmcgYnVpbGRlciBpbnN0YW5jZQorICAgICAqIEBwYXJhbSBrZXkgICAgICBrZXkgc3RyaW5nCisgICAgICogQHBhcmFtIHZhbHVlICAgIHZhbHVlIHN0cmluZworICAgICAqIEBwYXJhbSB1c2VRdW90ZSB0cnVlIGlmIHZhbHVlIG5lZWRzIHRvIGJlIGVuY2xvc2VkIGluIHF1b3RlcworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXBwZW5kKGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IsIGZpbmFsIFN0cmluZyBrZXksIGZpbmFsIFN0cmluZyB2YWx1ZSwgZmluYWwgYm9vbGVhbiB1c2VRdW90ZSkgeworCisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNiLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgaWYgKHNiLmNoYXJBdChzYi5sZW5ndGgoKSAtIDEpICE9ICcgJykgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnLCcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZChrZXkpOworICAgICAgICBzYi5hcHBlbmQoJz0nKTsKKyAgICAgICAgaWYgKHVzZVF1b3RlKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoJyInKTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQodmFsdWUpOworICAgICAgICBpZiAodXNlUXVvdGUpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgnIicpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwZW5kIGNvbW1hIHNlcGFyYXRlZCBrZXk9dmFsdWUgdG9rZW4uIFRoZSB2YWx1ZSBnZXRzIGVuY2xvc2VkIGluCisgICAgICogcXVvdGVzLgorICAgICAqCisgICAgICogQHBhcmFtIHNiICAgIHN0cmluZyBidWlsZGVyIGluc3RhbmNlCisgICAgICogQHBhcmFtIGtleSAgIGtleSBzdHJpbmcKKyAgICAgKiBAcGFyYW0gdmFsdWUgdmFsdWUgc3RyaW5nCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhcHBlbmQoZmluYWwgU3RyaW5nQnVpbGRlciBzYiwgZmluYWwgU3RyaW5nIGtleSwgZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIGFwcGVuZChzYiwga2V5LCB2YWx1ZSwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCBieXRlcyBhcnJheSB0byBoZXggc3RyaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGJ5dGVzIGFycmF5IG9mIGJ5dGVzCisgICAgICogQHJldHVybiBoZXggc3RyaW5nCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGJ5dGVzVG9IZXgoZmluYWwgYnl0ZVtdIGJ5dGVzKSB7CisgICAgICAgIGZpbmFsIGNoYXJbXSBoZXhDaGFycyA9IG5ldyBjaGFyW2J5dGVzLmxlbmd0aCAqIDJdOworICAgICAgICBpbnQgdjsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBieXRlcy5sZW5ndGg7IGorKykgeworICAgICAgICAgICAgdiA9IGJ5dGVzW2pdICYgMHhGRjsKKyAgICAgICAgICAgIGhleENoYXJzW2ogKiAyXSA9IEhFWF9BUlJBWVt2ID4+PiA0XTsKKyAgICAgICAgICAgIGhleENoYXJzW2ogKiAyICsgMV0gPSBIRVhfQVJSQVlbdiAmIDB4MEZdOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGhleENoYXJzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb2xvbiBzZXBhcmF0ZWQgdmFsdWUgTUQ1IGhhc2guCisgICAgICoKKyAgICAgKiBAcGFyYW0gdG9rZW5zIG9uZSBvciBtb3JlIHN0cmluZ3MKKyAgICAgKiBAcmV0dXJuIE01IGhhc2ggc3RyaW5nCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBtZDUoZmluYWwgU3RyaW5nLi4uIHRva2VucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDEwMCk7CisgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIHRva2VuIDogdG9rZW5zKSB7CisgICAgICAgICAgICBpZiAoc2IubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCc6Jyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYi5hcHBlbmQodG9rZW4pOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgTWVzc2FnZURpZ2VzdCBtZDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1kID0gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZSgiTUQ1Iik7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKGV4LmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgbWQudXBkYXRlKHNiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoSHR0cEF1dGhlbnRpY2F0aW9uRmlsdGVyLkNIQVJBQ1RFUl9TRVQpLCAwLCBzYi5sZW5ndGgoKSk7CisgICAgICAgIGZpbmFsIGJ5dGVbXSBtZDVoYXNoID0gbWQuZGlnZXN0KCk7CisgICAgICAgIHJldHVybiBieXRlc1RvSGV4KG1kNWhhc2gpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlIGEgcmFuZG9tIHNlcXVlbmNlIG9mIGJ5dGVzIGFuZCByZXR1cm4gaXRzIGhleCByZXByZXNlbnRhdGlvbgorICAgICAqCisgICAgICogQHBhcmFtIG5iQnl0ZXMgbnVtYmVyIG9mIGJ5dGVzIHRvIGdlbmVyYXRlCisgICAgICogQHJldHVybiBoZXggc3RyaW5nCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcmFuZG9tQnl0ZXMoZmluYWwgaW50IG5iQnl0ZXMpIHsKKyAgICAgICAgZmluYWwgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbbmJCeXRlc107CisgICAgICAgIHJhbmRvbUdlbmVyYXRvci5uZXh0Qnl0ZXMoYnl0ZXMpOworICAgICAgICByZXR1cm4gYnl0ZXNUb0hleChieXRlcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBlbnVtIFFPUCB7CisKKyAgICAgICAgVU5TUEVDSUZJRUQobnVsbCksCisgICAgICAgIEFVVEgoImF1dGgiKTsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBxb3A7CisKKyAgICAgICAgUU9QKGZpbmFsIFN0cmluZyBxb3ApIHsKKyAgICAgICAgICAgIHRoaXMucW9wID0gcW9wOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gcW9wOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBRT1AgcGFyc2UoZmluYWwgU3RyaW5nIHZhbCkgeworICAgICAgICAgICAgaWYgKHZhbCA9PSBudWxsIHx8IHZhbC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUU9QLlVOU1BFQ0lGSUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHZhbC5jb250YWlucygiYXV0aCIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFFPUC5BVVRIOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLkRJR0VTVF9GSUxURVJfUU9QX1VOU1VQUE9SVEVEKHZhbCkpOworICAgICAgICB9CisgICAgfQorCisgICAgZW51bSBBbGdvcml0aG0geworCisgICAgICAgIFVOU1BFQ0lGSUVEKG51bGwpLAorICAgICAgICBNRDUoIk1ENSIpLAorICAgICAgICBNRDVfU0VTUygiTUQ1LXNlc3MiKTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbWQ7CisKKyAgICAgICAgQWxnb3JpdGhtKGZpbmFsIFN0cmluZyBtZCkgeworICAgICAgICAgICAgdGhpcy5tZCA9IG1kOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gbWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIEFsZ29yaXRobSBwYXJzZShTdHJpbmcgdmFsKSB7CisgICAgICAgICAgICBpZiAodmFsID09IG51bGwgfHwgdmFsLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBBbGdvcml0aG0uVU5TUEVDSUZJRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YWwgPSB2YWwudHJpbSgpOworICAgICAgICAgICAgaWYgKHZhbC5jb250YWlucyhNRDVfU0VTUy5tZCkgfHwgdmFsLmNvbnRhaW5zKE1ENV9TRVNTLm1kLnRvTG93ZXJDYXNlKCkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE1ENV9TRVNTOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE1ENTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERpZ2VzdCBzY2hlbWUgUE9KTworICAgICAqLworICAgIGZpbmFsIGNsYXNzIERpZ2VzdFNjaGVtZSB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcmVhbG07CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5vbmNlOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBvcGFxdWU7CisgICAgICAgIHByaXZhdGUgZmluYWwgQWxnb3JpdGhtIGFsZ29yaXRobTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBRT1AgcW9wOworICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gc3RhbGU7CisgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgaW50IG5jOworCisgICAgICAgIERpZ2VzdFNjaGVtZShmaW5hbCBTdHJpbmcgcmVhbG0sIGZpbmFsIFN0cmluZyBub25jZSwgZmluYWwgU3RyaW5nIG9wYXF1ZSwgZmluYWwgUU9QIHFvcCwgZmluYWwgQWxnb3JpdGhtIGFsZ29yaXRobSwKKyAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gc3RhbGUpIHsKKyAgICAgICAgICAgIHRoaXMucmVhbG0gPSByZWFsbTsKKyAgICAgICAgICAgIHRoaXMubm9uY2UgPSBub25jZTsKKyAgICAgICAgICAgIHRoaXMub3BhcXVlID0gb3BhcXVlOworICAgICAgICAgICAgdGhpcy5xb3AgPSBxb3A7CisgICAgICAgICAgICB0aGlzLmFsZ29yaXRobSA9IGFsZ29yaXRobTsKKyAgICAgICAgICAgIHRoaXMuc3RhbGUgPSBzdGFsZTsKKyAgICAgICAgICAgIHRoaXMubmMgPSAwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBpbmNyZW1lbnRDb3VudGVyKCkgeworICAgICAgICAgICAgcmV0dXJuICsrbmM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5vbmNlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5vbmNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRSZWFsbSgpIHsKKyAgICAgICAgICAgIHJldHVybiByZWFsbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3BhcXVlKCkgeworICAgICAgICAgICAgcmV0dXJuIG9wYXF1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBBbGdvcml0aG0gZ2V0QWxnb3JpdGhtKCkgeworICAgICAgICAgICAgcmV0dXJuIGFsZ29yaXRobTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBRT1AgZ2V0UW9wKCkgeworICAgICAgICAgICAgcmV0dXJuIHFvcDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzU3RhbGUoKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhbGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldE5jKCkgeworICAgICAgICAgICAgcmV0dXJuIG5jOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvYXV0aGVudGljYXRpb24vSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5qYXZhIGIvY29yZS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvYXV0aGVudGljYXRpb24vSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMWIyZGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9hdXRoZW50aWNhdGlvbi9IdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLmphdmEKQEAgLTAsMCArMSw1ODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LmF1dGhlbnRpY2F0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CisKKy8qKgorICogRmVhdHVyZXMgdGhhdCBwcm92aWRlcyBIdHRwIEJhc2ljIGFuZCBEaWdlc3QgY2xpZW50IGF1dGhlbnRpY2F0aW9uIChiYXNlZCBvbiBSRkMgMjYxNykuCisgKiA8cD4KKyAqIFRoZSBmZWF0dXJlIGNhbiB3b3JrIGluIGZvbGxvd2luZyBtb2RlczoKKyAqIDx1bD4KKyAqICA8bGk+PGI+QkFTSUM6PC9iPiBCYXNpYyBwcmVlbXB0aXZlIGF1dGhlbnRpY2F0aW9uLiBJbiBwcmVlbXB0aXZlIG1vZGUgdGhlIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uCisgKiAgaXMgc2VuZCBhbHdheXMgd2l0aCBlYWNoIEhUVFAgcmVxdWVzdC4gVGhpcyBtb2RlIGlzIG1vcmUgdXN1YWwgdGhhbiB0aGUgZm9sbG93aW5nIG5vbi1wcmVlbXB0aXZlIG1vZGUKKyAqICAoaWYgeW91IHJlcXVpcmUgQkFTSUMgYXV0aGVudGljYXRpb24geW91IHdpbGwgcHJvYmFibHkgdXNlIHRoaXMgcHJlZW1wdGl2ZSBtb2RlKS4gVGhpcyBtb2RlIG11c3QKKyAqICBiZSBjb21iaW5lZCB3aXRoIHVzYWdlIG9mIFNTTC9UTFMgYXMgdGhlIHBhc3N3b3JkIGlzIHNlbmQgb25seSBCQVNFNjQgZW5jb2RlZC48L2xpPgorICogIDxsaT48aT5CQVNJQyBOT04tUFJFRU1QVElWRTo8L2k+IEJhc2ljIG5vbi1wcmVlbXB0aXZlIGF1dGhlbnRpY2F0aW9uLiBJbiBub24tcHJlZW1wdGl2ZSBtb2RlIHRoZQorICogIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uIGlzIGFkZGVkIG9ubHkgd2hlbiBzZXJ2ZXIgcmVmdXNlcyB0aGUgcmVxdWVzdCB3aXRoIHtAY29kZSA0MDF9IHN0YXR1cyBjb2RlIGFuZAorICogIHRoZW4gdGhlIHJlcXVlc3QgaXMgcmVwZWF0ZWQgd2l0aCBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbi4gVGhpcyBtb2RlIGhhcyBuZWdhdGl2ZSBpbXBhY3Qgb24gdGhlIHBlcmZvcm1hbmNlLgorICogIFRoZSBhZHZhbnRhZ2UgaXMgdGhhdCBpdCBkb2VzIG5vdCBzZW5kIGNyZWRlbnRpYWxzIHdoZW4gdGhleSBhcmUgbm90IG5lZWRlZC4gVGhpcyBtb2RlIG11c3QKKyAqICBiZSBjb21iaW5lZCB3aXRoIHVzYWdlIG9mIFNTTC9UTFMgYXMgdGhlIHBhc3N3b3JkIGlzIHNlbmQgb25seSBCQVNFNjQgZW5jb2RlZC4KKyAqICA8cC8+CisgKiAgUGxlYXNlIG5vdGUgdGhhdCB3aGVuIHlvdSB1c2Ugbm9uLXByZWVtcHRpdmUgYXV0aGVudGljYXRpb24sIEplcnNleSBjbGllbnQgd2lsbCBtYWtlIDIgcmVxdWVzdHMgdG8gYSByZXNvdXJjZSwKKyAqICB3aGljaCBhbHNvIG1lYW5zIHRoYXQgYWxsIHJlZ2lzdGVyZWQgZmlsdGVycyB3aWxsIGJlIGludm9rZWQgdHdpY2UuCisgKiAgPC9saT4KKyAqICA8bGk+PGI+RElHRVNUOjwvYj4gSHR0cCBkaWdlc3QgYXV0aGVudGljYXRpb24uIERvZXMgbm90IHJlcXVpcmUgdXNhZ2Ugb2YgU1NML1RMUy48L2xpPgorICogIDxsaT48Yj5VTklWRVJTQUw6PC9iPiBDb21iaW5hdGlvbiBvZiBiYXNpYyBhbmQgZGlnZXN0IGF1dGhlbnRpY2F0aW9uLiBUaGUgZmVhdHVyZSB3b3JrcyBpbiBub24tcHJlZW1wdGl2ZQorICogIG1vZGUgd2hpY2ggbWVhbnMgdGhhdCBpdCBzZW5kcyByZXF1ZXN0cyB3aXRob3V0IGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uLiBJZiB7QGNvZGUgNDAxfSBzdGF0dXMKKyAqICBjb2RlIGlzIHJldHVybmVkLCB0aGUgcmVxdWVzdCBpcyByZXBlYXRlZCBhbmQgYW4gYXBwcm9wcmlhdGUgYXV0aGVudGljYXRpb24gaXMgdXNlZCBiYXNlZCBvbiB0aGUKKyAqICBhdXRoZW50aWNhdGlvbiByZXF1ZXN0ZWQgaW4gdGhlIHJlc3BvbnNlIChkZWZpbmVkIGluIHtAY29kZSBXV1ctQXV0aGVudGljYXRlfSBIVFRQIGhlYWRlci4gVGhlIGZlYXR1cmUKKyAqICByZW1lbWJlcnMgd2hpY2ggYXV0aGVudGljYXRpb24gcmVxdWVzdHMgd2VyZSBzdWNjZXNzZnVsIGZvciBnaXZlbiBVUkkgYW5kIG5leHQgdGltZSB0cmllcyB0byBwcmVlbXB0aXZlbHkKKyAqICBhdXRoZW50aWNhdGUgYWdhaW5zdCB0aGlzIFVSSSB3aXRoIGxhdGVzdCBzdWNjZXNzZnVsIGF1dGhlbnRpY2F0aW9uIG1ldGhvZC4KKyAqICA8L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqIDxwPgorICogVG8gaW5pdGlhbGl6ZSB0aGUgZmVhdHVyZSB1c2Ugc3RhdGljIG1ldGhvZCBvZiB0aGlzIGZlYXR1cmUuCisgKiA8L3A+CisgKiA8cD4KKyAqIEV4YW1wbGUgb2YgYnVpbGRpbmcgdGhlIGZlYXR1cmUgaW4KKyAqIEJhc2ljIGF1dGhlbnRpY2F0aW9uIG1vZGU6CisgKiA8cHJlPgorICogSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZSBmZWF0dXJlID0gSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5iYXNpYygidXNlciIsICJzdXBlclNlY3JldFBhc3N3b3JkIik7CisgKiA8L3ByZT4KKyAqIDwvcD4KKyAqIDxwPgorICogRXhhbXBsZSBvZiBidWlsZGluZyB0aGUgZmVhdHVyZSBpbiBiYXNpYyBub24tcHJlZW1wdGl2ZSBtb2RlOgorICogPHByZT4KKyAqIEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUgZmVhdHVyZSA9IEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUuYmFzaWNCdWlsZGVyKCkKKyAqICAgICAubm9uUHJlZW1wdGl2ZSgpLmNyZWRlbnRpYWxzKCJ1c2VyIiwgInN1cGVyU2VjcmV0UGFzc3dvcmQiKS5idWlsZCgpOworICogPC9wcmU+CisgKiA8L3A+CisgKiA8cD4KKyAqIEV4YW1wbGUgb2YgYnVpbGRpbmcgdGhlIGZlYXR1cmUgaW4gdW5pdmVyc2FsIG1vZGU6CisgKiA8cHJlPgorICogSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZSBmZWF0dXJlID0gSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS51bml2ZXJzYWwoInVzZXIiLCAic3VwZXJTZWNyZXRQYXNzd29yZCIpOworICogPC9wcmU+CisgKiA8L3A+CisgKiA8cD4KKyAqIEV4YW1wbGUgb2YgYnVpbGRpbmcgdGhlIGZlYXR1cmUgaW4gdW5pdmVyc2FsIG1vZGUgd2l0aCBkaWZmZXJlbnQgY3JlZGVudGlhbHMgZm9yIGJhc2ljIGFuZCBkaWdlc3Q6CisgKiA8cHJlPgorICogSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZSBmZWF0dXJlID0gSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS51bml2ZXJzYWxCdWlsZGVyKCkKKyAqICAgICAgLmNyZWRlbnRpYWxzRm9yQmFzaWMoInVzZXIiLCAiMTIzNDU2IikKKyAqICAgICAgLmNyZWRlbnRpYWxzKCJhZG1pbnVzZXIiLCAiaGVsbG8iKQorICogICAgICAuYnVpbGQoKTsKKyAqIDwvcHJlPgorICogPC9wPgorICogRXhhbXBsZSBvZiBidWlsZGluZyB0aGUgZmVhdHVyZSBpbiBiYXNpYyBwcmVlbXB0aXZlIG1vZGUgd2l0aCBubyBkZWZhdWx0IGNyZWRlbnRpYWxzLiBDcmVkZW50aWFscyB3aWxsIGhhdmUKKyAqIHRvIGJlIHN1cHBsaWVkIHdpdGggZWFjaCByZXF1ZXN0IHVzaW5nIHJlcXVlc3QgcHJvcGVydGllcyAoc2VlIGJlbG93KToKKyAqIDxwcmU+CisgKiBIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlIGZlYXR1cmUgPSBIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLmJhc2ljQnVpbGRlcigpLmJ1aWxkKCk7CisgKiA8L3ByZT4KKyAqIDwvcD4KKyAqIDxwPgorICogT25jZSB0aGUgZmVhdHVyZSBpcyBidWlsdCBpdCBuZWVkcyB0byBiZSByZWdpc3RlcmVkIGludG8gdGhlIHtAbGluayBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50fSwKKyAqIHtAbGluayBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0fSBvciBvdGhlciBjbGllbnQgY29uZmlndXJhYmxlIG9iamVjdC4gRXhhbXBsZToKKyAqIDxwcmU+CisgKiBmaW5hbCBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKTsKKyAqIGNsaWVudC5yZWdpc3RlcihmZWF0dXJlKTsKKyAqIDwvcHJlPgorICogPC9wPgorICoKKyAqIFRoZW4geW91IGludm9rZSByZXF1ZXN0cyBhcyB1c3VhbCBhbmQgYXV0aGVudGljYXRpb24gd2lsbCBiZSBoYW5kbGVkIGJ5IHRoZSBmZWF0dXJlLgorICogWW91IGNhbiBjaGFuZ2UgdGhlIGNyZWRlbnRpYWxzIGZvciBlYWNoIHJlcXVlc3QgdXNpbmcgcHJvcGVydGllcworICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5hdXRoZW50aWNhdGlvbi5IdHRwQXV0aGVudGljYXRpb25GZWF0dXJlI0hUVFBfQVVUSEVOVElDQVRJT05fVVNFUk5BTUV9IGFuZAorICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5hdXRoZW50aWNhdGlvbi5IdHRwQXV0aGVudGljYXRpb25GZWF0dXJlI0hUVFBfQVVUSEVOVElDQVRJT05fUEFTU1dPUkR9LiBFeGFtcGxlOgorICogPHByZT4KKyAqIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gY2xpZW50LnRhcmdldCgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3Jlc3QvaG9tZXIvY29udGFjdCIpLnJlcXVlc3QoKQorICogICAgLnByb3BlcnR5KEhUVFBfQVVUSEVOVElDQVRJT05fQkFTSUNfVVNFUk5BTUUsICJob21lciIpCisgKiAgICAucHJvcGVydHkoSFRUUF9BVVRIRU5USUNBVElPTl9CQVNJQ19QQVNTV09SRCwgInAxc3dkNzQ1IikuZ2V0KCk7CisgKiA8L3ByZT4KKyAqIDxwPgorICogVGhpcyBjbGFzcyBhbHNvIGNvbnRhaW5zIHByb3BlcnR5IGtleSBkZWZpbml0aW9ucyBmb3Igb3ZlcnJpZGluZyBvbmx5IHNwZWNpZmljIGJhc2ljIG9yIGRpZ2VzdCBjcmVkZW50aWFsczoKKyAqIDx1bD4KKyAqICAgICA8bGk+CisgKiAgICAgIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuYXV0aGVudGljYXRpb24uSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZSNIVFRQX0FVVEhFTlRJQ0FUSU9OX0JBU0lDX1VTRVJOQU1FfSBhbmQKKyAqICAgICAge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5hdXRoZW50aWNhdGlvbi5IdHRwQXV0aGVudGljYXRpb25GZWF0dXJlI0hUVFBfQVVUSEVOVElDQVRJT05fQkFTSUNfUEFTU1dPUkR9CisgKiAgICAgIDwvbGk+CisgKiAgICAgPGxpPgorICogICAgICB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LmF1dGhlbnRpY2F0aW9uLkh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUjSFRUUF9BVVRIRU5USUNBVElPTl9ESUdFU1RfVVNFUk5BTUV9IGFuZAorICogICAgICB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LmF1dGhlbnRpY2F0aW9uLkh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUjSFRUUF9BVVRIRU5USUNBVElPTl9ESUdFU1RfUEFTU1dPUkR9LgorICogICAgICA8L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKgorICogQHNpbmNlIDIuNQorICovCitwdWJsaWMgY2xhc3MgSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZSBpbXBsZW1lbnRzIEZlYXR1cmUgeworCisgICAgLyoqCisgICAgICogRmVhdHVyZSBhdXRoZW50aWNhdGlvbiBtb2RlLgorICAgICAqLworICAgIHN0YXRpYyBlbnVtIE1vZGUgeworICAgICAgICAvKioKKyAgICAgICAgICogQmFzaWMgcHJlZW1wdGl2ZS4KKyAgICAgICAgICoqLworICAgICAgICBCQVNJQ19QUkVFTVBUSVZFLAorICAgICAgICAvKioKKyAgICAgICAgICogQmFzaWMgbm9uIHByZWVtcHRpdmUKKyAgICAgICAgICovCisgICAgICAgIEJBU0lDX05PTl9QUkVFTVBUSVZFLAorICAgICAgICAvKioKKyAgICAgICAgICogRGlnZXN0LgorICAgICAgICAgKi8KKyAgICAgICAgRElHRVNULAorICAgICAgICAvKioKKyAgICAgICAgICogVW5pdmVyc2FsLgorICAgICAgICAgKi8KKyAgICAgICAgVU5JVkVSU0FMCisgICAgfQorCisgICAgLyoqCisgICAgICogQnVpbGRlciB0aGF0IGNyZWF0ZXMgaW5zdGFuY2VzIG9mIHtAbGluayBIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBCdWlsZGVyIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IGNyZWRlbnRpYWxzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdXNlcm5hbWUgVXNlcm5hbWUuCisgICAgICAgICAqIEBwYXJhbSBwYXNzd29yZCBQYXNzd29yZCBhcyBieXRlIGFycmF5LgorICAgICAgICAgKiBAcmV0dXJuIFRoaXMgYnVpbGRlci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGNyZWRlbnRpYWxzKFN0cmluZyB1c2VybmFtZSwgYnl0ZVtdIHBhc3N3b3JkKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IGNyZWRlbnRpYWxzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdXNlcm5hbWUgVXNlcm5hbWUuCisgICAgICAgICAqIEBwYXJhbSBwYXNzd29yZCBQYXNzd29yZCBhcyB7QGxpbmsgU3RyaW5nfS4KKyAgICAgICAgICogQHJldHVybiBUaGlzIGJ1aWxkZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBjcmVkZW50aWFscyhTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJ1aWxkIHRoZSBmZWF0dXJlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIEh0dHAgYXV0aGVudGljYXRpb24gZmVhdHVyZSBjb25maWd1cmVkIGZyb20gdGhpcyBidWlsZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUgYnVpbGQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeHRlbnNpb24gb2Yge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5hdXRoZW50aWNhdGlvbi5IdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLkJ1aWxkZXJ9CisgICAgICogdGhhdCBidWlsZHMgdGhlIGh0dHAgYXV0aGVudGljYXRpb24gZmVhdHVyZSBjb25maWd1cmVkIGZvciBiYXNpYyBhdXRoZW50aWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBCYXNpY0J1aWxkZXIgZXh0ZW5kcyBCdWlsZGVyIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29uZmlndXJlIHRoZSBidWlsZGVyIHRvIGNyZWF0ZSBmZWF0dXJlcyBpbiBub24tcHJlZW1wdGl2ZSBiYXNpYyBhdXRoZW50aWNhdGlvbiBtb2RlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFRoaXMgYnVpbGRlci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCYXNpY0J1aWxkZXIgbm9uUHJlZW1wdGl2ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4dGVuc2lvbiBvZiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LmF1dGhlbnRpY2F0aW9uLkh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUuQnVpbGRlcn0KKyAgICAgKiB0aGF0IGJ1aWxkcyB0aGUgaHR0cCBhdXRoZW50aWNhdGlvbiBmZWF0dXJlIGNvbmZpZ3VyZWQgaW4gdW5pdmVyc2FsIG1vZGUgdGhhdCBzdXBwb3J0cworICAgICAqIGJhc2ljIGFuZCBkaWdlc3QgYXV0aGVudGljYXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgVW5pdmVyc2FsQnVpbGRlciBleHRlbmRzIEJ1aWxkZXIgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgY3JlZGVudGlhbHMgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIGJhc2ljIGF1dGhlbnRpY2F0aW9uIG9ubHkuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB1c2VybmFtZSBVc2VybmFtZS4KKyAgICAgICAgICogQHBhcmFtIHBhc3N3b3JkIFBhc3N3b3JkIGFzIHtAbGluayBTdHJpbmd9LgorICAgICAgICAgKiBAcmV0dXJuIFRoaXMgYnVpbGRlci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBVbml2ZXJzYWxCdWlsZGVyIGNyZWRlbnRpYWxzRm9yQmFzaWMoU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgY3JlZGVudGlhbHMgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIGJhc2ljIGF1dGhlbnRpY2F0aW9uIG9ubHkuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB1c2VybmFtZSBVc2VybmFtZS4KKyAgICAgICAgICogQHBhcmFtIHBhc3N3b3JkIFBhc3N3b3JkIGFzIHtAY29kZSBieXRlIGFycmF5fS4KKyAgICAgICAgICogQHJldHVybiBUaGlzIGJ1aWxkZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgVW5pdmVyc2FsQnVpbGRlciBjcmVkZW50aWFsc0ZvckJhc2ljKFN0cmluZyB1c2VybmFtZSwgYnl0ZVtdIHBhc3N3b3JkKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IGNyZWRlbnRpYWxzIHRoYXQgd2lsbCBiZSB1c2VkIGZvciBkaWdlc3QgYXV0aGVudGljYXRpb24gb25seS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHVzZXJuYW1lIFVzZXJuYW1lLgorICAgICAgICAgKiBAcGFyYW0gcGFzc3dvcmQgUGFzc3dvcmQgYXMge0BsaW5rIFN0cmluZ30uCisgICAgICAgICAqIEByZXR1cm4gVGhpcyBidWlsZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFVuaXZlcnNhbEJ1aWxkZXIgY3JlZGVudGlhbHNGb3JEaWdlc3QoU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgY3JlZGVudGlhbHMgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIGRpZ2VzdCBhdXRoZW50aWNhdGlvbiBvbmx5LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdXNlcm5hbWUgVXNlcm5hbWUuCisgICAgICAgICAqIEBwYXJhbSBwYXNzd29yZCBQYXNzd29yZCBhcyB7QGNvZGUgYnl0ZSBhcnJheX0uCisgICAgICAgICAqIEByZXR1cm4gVGhpcyBidWlsZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFVuaXZlcnNhbEJ1aWxkZXIgY3JlZGVudGlhbHNGb3JEaWdlc3QoU3RyaW5nIHVzZXJuYW1lLCBieXRlW10gcGFzc3dvcmQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudGF0aW9uIG9mIGFsbCBhdXRoZW50aWNhdGlvbiBidWlsZGVycy4KKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgQnVpbGRlckltcGwgaW1wbGVtZW50cyBVbml2ZXJzYWxCdWlsZGVyLCBCYXNpY0J1aWxkZXIgeworCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHVzZXJuYW1lQmFzaWM7CisgICAgICAgIHByaXZhdGUgYnl0ZVtdIHBhc3N3b3JkQmFzaWM7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIHVzZXJuYW1lRGlnZXN0OworICAgICAgICBwcml2YXRlIGJ5dGVbXSBwYXNzd29yZERpZ2VzdDsKKyAgICAgICAgcHJpdmF0ZSBNb2RlIG1vZGU7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhIG5ldyBidWlsZGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbW9kZSBNb2RlIGluIHdoaWNoIHRoZSBmaW5hbCBhdXRoZW50aWNhdGlvbiBmZWF0dXJlIHNob3VsZCB3b3JrLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXJJbXBsKE1vZGUgbW9kZSkgeworICAgICAgICAgICAgdGhpcy5tb2RlID0gbW9kZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnVpbGRlciBjcmVkZW50aWFscyhTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCkgeworICAgICAgICAgICAgcmV0dXJuIGNyZWRlbnRpYWxzKHVzZXJuYW1lLCBwYXNzd29yZCA9PSBudWxsID8gbnVsbCA6IHBhc3N3b3JkLmdldEJ5dGVzKEh0dHBBdXRoZW50aWNhdGlvbkZpbHRlci5DSEFSQUNURVJfU0VUKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgY3JlZGVudGlhbHMoU3RyaW5nIHVzZXJuYW1lLCBieXRlW10gcGFzc3dvcmQpIHsKKyAgICAgICAgICAgIGNyZWRlbnRpYWxzRm9yQmFzaWModXNlcm5hbWUsIHBhc3N3b3JkKTsKKyAgICAgICAgICAgIGNyZWRlbnRpYWxzRm9yRGlnZXN0KHVzZXJuYW1lLCBwYXNzd29yZCk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVW5pdmVyc2FsQnVpbGRlciBjcmVkZW50aWFsc0ZvckJhc2ljKFN0cmluZyB1c2VybmFtZSwgU3RyaW5nIHBhc3N3b3JkKSB7CisgICAgICAgICAgICByZXR1cm4gY3JlZGVudGlhbHNGb3JCYXNpYyh1c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQgPT0gbnVsbCA/IG51bGwgOiBwYXNzd29yZC5nZXRCeXRlcyhIdHRwQXV0aGVudGljYXRpb25GaWx0ZXIuQ0hBUkFDVEVSX1NFVCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBVbml2ZXJzYWxCdWlsZGVyIGNyZWRlbnRpYWxzRm9yQmFzaWMoU3RyaW5nIHVzZXJuYW1lLCBieXRlW10gcGFzc3dvcmQpIHsKKyAgICAgICAgICAgIHRoaXMudXNlcm5hbWVCYXNpYyA9IHVzZXJuYW1lOworICAgICAgICAgICAgdGhpcy5wYXNzd29yZEJhc2ljID0gcGFzc3dvcmQ7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVW5pdmVyc2FsQnVpbGRlciBjcmVkZW50aWFsc0ZvckRpZ2VzdChTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCkgeworICAgICAgICAgICAgcmV0dXJuIGNyZWRlbnRpYWxzRm9yRGlnZXN0KHVzZXJuYW1lLAorICAgICAgICAgICAgICAgICAgICBwYXNzd29yZCA9PSBudWxsID8gbnVsbCA6IHBhc3N3b3JkLmdldEJ5dGVzKEh0dHBBdXRoZW50aWNhdGlvbkZpbHRlci5DSEFSQUNURVJfU0VUKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFVuaXZlcnNhbEJ1aWxkZXIgY3JlZGVudGlhbHNGb3JEaWdlc3QoU3RyaW5nIHVzZXJuYW1lLCBieXRlW10gcGFzc3dvcmQpIHsKKyAgICAgICAgICAgIHRoaXMudXNlcm5hbWVEaWdlc3QgPSB1c2VybmFtZTsKKyAgICAgICAgICAgIHRoaXMucGFzc3dvcmREaWdlc3QgPSBwYXNzd29yZDsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlIGJ1aWxkKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlKG1vZGUsCisgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lQmFzaWMgPT0gbnVsbCA/IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBIdHRwQXV0aGVudGljYXRpb25GaWx0ZXIuQ3JlZGVudGlhbHModXNlcm5hbWVCYXNpYywgcGFzc3dvcmRCYXNpYyksCisgICAgICAgICAgICAgICAgICAgIHVzZXJuYW1lRGlnZXN0ID09IG51bGwgPyBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgSHR0cEF1dGhlbnRpY2F0aW9uRmlsdGVyLkNyZWRlbnRpYWxzKHVzZXJuYW1lRGlnZXN0LCBwYXNzd29yZERpZ2VzdCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCYXNpY0J1aWxkZXIgbm9uUHJlZW1wdGl2ZSgpIHsKKyAgICAgICAgICAgIGlmIChtb2RlID09IE1vZGUuQkFTSUNfUFJFRU1QVElWRSkgeworICAgICAgICAgICAgICAgIHRoaXMubW9kZSA9IE1vZGUuQkFTSUNfTk9OX1BSRUVNUFRJVkU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEtleSBvZiB0aGUgcHJvcGVydHkgdGhhdCBjYW4gYmUgc2V0IGludG8gdGhlIHtAbGluayBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdENvbnRleHQgY2xpZW50IHJlcXVlc3R9CisgICAgICogdXNpbmcge0BsaW5rIGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0Q29udGV4dCNzZXRQcm9wZXJ0eShTdHJpbmcsIE9iamVjdCl9IGluIG9yZGVyIHRvIG92ZXJyaWRlCisgICAgICogdGhlIHVzZXJuYW1lIGZvciBodHRwIGF1dGhlbnRpY2F0aW9uIGZlYXR1cmUgZm9yIHRoZSByZXF1ZXN0LgorICAgICAqIDxwPgorICAgICAqIEV4YW1wbGU6CisgICAgICogPHByZT4KKyAgICAgKiBSZXNwb25zZSByZXNwb25zZSA9IGNsaWVudC50YXJnZXQoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZXN0L2pvZS9vcmRlcnMiKS5yZXF1ZXN0KCkKKyAgICAgKiAgICAgIC5wcm9wZXJ0eShIVFRQX0FVVEhFTlRJQ0FUSU9OX1VTRVJOQU1FLCAiam9lIikKKyAgICAgKiAgICAgIC5wcm9wZXJ0eShIVFRQX0FVVEhFTlRJQ0FUSU9OX1BBU1NXT1JELCAicDFzd2Q3NDUiKS5nZXQoKTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKiA8L3A+CisgICAgICogVGhlIHByb3BlcnR5IG11c3QgYmUgYWx3YXlzIGNvbWJpbmVkIHdpdGggY29uZmlndXJhdGlvbiBvZiB7QGxpbmsgI0hUVFBfQVVUSEVOVElDQVRJT05fUEFTU1dPUkR9IHByb3BlcnR5CisgICAgICogKGFzIHNob3duIGluIHRoZSBleGFtcGxlKS4gVGhpcyBwcm9wZXJ0eSBwYWlyIG92ZXJyaWRlcyBhbGwgcGFzc3dvcmQgc2V0dGluZ3Mgb2YgdGhlIGF1dGhlbnRpY2F0aW9uCisgICAgICogZmVhdHVyZSBmb3IgdGhlIGN1cnJlbnQgcmVxdWVzdC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBtdXN0IGJlIGluc3RhbmNlIG9mIHtAbGluayBTdHJpbmd9LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9BVVRIRU5USUNBVElPTl9VU0VSTkFNRSA9ICJqZXJzZXkuY29uZmlnLmNsaWVudC5odHRwLmF1dGgudXNlcm5hbWUiOworICAgIC8qKgorICAgICAqIEtleSBvZiB0aGUgcHJvcGVydHkgdGhhdCBjYW4gYmUgc2V0IGludG8gdGhlIHtAbGluayBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdENvbnRleHQgY2xpZW50IHJlcXVlc3R9CisgICAgICogdXNpbmcge0BsaW5rIGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0Q29udGV4dCNzZXRQcm9wZXJ0eShTdHJpbmcsIE9iamVjdCl9IGluIG9yZGVyIHRvIG92ZXJyaWRlCisgICAgICogdGhlIHBhc3N3b3JkIGZvciBodHRwIGF1dGhlbnRpY2F0aW9uIGZlYXR1cmUgZm9yIHRoZSByZXF1ZXN0LgorICAgICAqIDxwPgorICAgICAqIEV4YW1wbGU6CisgICAgICogPHByZT4KKyAgICAgKiBSZXNwb25zZSByZXNwb25zZSA9IGNsaWVudC50YXJnZXQoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZXN0L2pvZS9vcmRlcnMiKS5yZXF1ZXN0KCkKKyAgICAgKiAgICAgIC5wcm9wZXJ0eShIVFRQX0FVVEhFTlRJQ0FUSU9OX1VTRVJOQU1FLCAiam9lIikKKyAgICAgKiAgICAgIC5wcm9wZXJ0eShIVFRQX0FVVEhFTlRJQ0FUSU9OX1BBU1NXT1JELCAicDFzd2Q3NDUiKS5nZXQoKTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKiA8L3A+CisgICAgICogVGhlIHByb3BlcnR5IG11c3QgYmUgYWx3YXlzIGNvbWJpbmVkIHdpdGggY29uZmlndXJhdGlvbiBvZiB7QGxpbmsgI0hUVFBfQVVUSEVOVElDQVRJT05fVVNFUk5BTUV9IHByb3BlcnR5CisgICAgICogKGFzIHNob3duIGluIHRoZSBleGFtcGxlKS4gVGhpcyBwcm9wZXJ0eSBwYWlyIG92ZXJyaWRlcyBhbGwgcGFzc3dvcmQgc2V0dGluZ3Mgb2YgdGhlIGF1dGhlbnRpY2F0aW9uCisgICAgICogZmVhdHVyZSBmb3IgdGhlIGN1cnJlbnQgcmVxdWVzdC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgdmFsdWUgbXVzdCBiZSBpbnN0YW5jZSBvZiB7QGxpbmsgU3RyaW5nfSBvciB7QGNvZGUgYnl0ZX0gYXJyYXkgKHtAY29kZSBieXRlW119KS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaXMgPHR0PntAdmFsdWV9PC90dD4uCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfQVVUSEVOVElDQVRJT05fUEFTU1dPUkQgPSAiamVyc2V5LmNvbmZpZy5jbGllbnQuaHR0cC5hdXRoLnBhc3N3b3JkIjsKKworICAgIC8qKgorICAgICAqIEtleSBvZiB0aGUgcHJvcGVydHkgdGhhdCBjYW4gYmUgc2V0IGludG8gdGhlIHtAbGluayBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdENvbnRleHQgY2xpZW50IHJlcXVlc3R9CisgICAgICogdXNpbmcge0BsaW5rIGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0Q29udGV4dCNzZXRQcm9wZXJ0eShTdHJpbmcsIE9iamVjdCl9IGluIG9yZGVyIHRvIG92ZXJyaWRlCisgICAgICogdGhlIHVzZXJuYW1lIGZvciBodHRwIGJhc2ljIGF1dGhlbnRpY2F0aW9uIGZlYXR1cmUgZm9yIHRoZSByZXF1ZXN0LgorICAgICAqIDxwPgorICAgICAqIEV4YW1wbGU6CisgICAgICogPHByZT4KKyAgICAgKiBSZXNwb25zZSByZXNwb25zZSA9IGNsaWVudC50YXJnZXQoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZXN0L2pvZS9vcmRlcnMiKS5yZXF1ZXN0KCkKKyAgICAgKiAgICAgIC5wcm9wZXJ0eShIVFRQX0FVVEhFTlRJQ0FUSU9OX0JBU0lDX1VTRVJOQU1FLCAiam9lIikKKyAgICAgKiAgICAgIC5wcm9wZXJ0eShIVFRQX0FVVEhFTlRJQ0FUSU9OX0JBU0lDX1BBU1NXT1JELCAicDFzd2Q3NDUiKS5nZXQoKTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKiA8L3A+CisgICAgICogVGhlIHByb3BlcnR5IG11c3QgYmUgYWx3YXlzIGNvbWJpbmVkIHdpdGggY29uZmlndXJhdGlvbiBvZiB7QGxpbmsgI0hUVFBfQVVUSEVOVElDQVRJT05fUEFTU1dPUkR9IHByb3BlcnR5CisgICAgICogKGFzIHNob3duIGluIHRoZSBleGFtcGxlKS4gVGhlIHByb3BlcnR5IHBhaXIgaW5mbHVlbmNlIG9ubHkgY3JlZGVudGlhbHMgdXNlZCBkdXJpbmcgYmFzaWMgYXV0aGVudGljYXRpb24uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgdmFsdWUgbXVzdCBiZSBpbnN0YW5jZSBvZiB7QGxpbmsgU3RyaW5nfS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaXMgPHR0PntAdmFsdWV9PC90dD4uCisgICAgICogPC9wPgorCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9BVVRIRU5USUNBVElPTl9CQVNJQ19VU0VSTkFNRSA9ICJqZXJzZXkuY29uZmlnLmNsaWVudC5odHRwLmF1dGguYmFzaWMudXNlcm5hbWUiOworCisgICAgLyoqCisgICAgICogS2V5IG9mIHRoZSBwcm9wZXJ0eSB0aGF0IGNhbiBiZSBzZXQgaW50byB0aGUge0BsaW5rIGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0Q29udGV4dCBjbGllbnQgcmVxdWVzdH0KKyAgICAgKiB1c2luZyB7QGxpbmsgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RDb250ZXh0I3NldFByb3BlcnR5KFN0cmluZywgT2JqZWN0KX0gaW4gb3JkZXIgdG8gb3ZlcnJpZGUKKyAgICAgKiB0aGUgcGFzc3dvcmQgZm9yIGh0dHAgYmFzaWMgYXV0aGVudGljYXRpb24gZmVhdHVyZSBmb3IgdGhlIHJlcXVlc3QuCisgICAgICogPHA+CisgICAgICogRXhhbXBsZToKKyAgICAgKiA8cHJlPgorICAgICAqIFJlc3BvbnNlIHJlc3BvbnNlID0gY2xpZW50LnRhcmdldCgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3Jlc3Qvam9lL29yZGVycyIpLnJlcXVlc3QoKQorICAgICAqICAgICAgLnByb3BlcnR5KEhUVFBfQVVUSEVOVElDQVRJT05fQkFTSUNfVVNFUk5BTUUsICJqb2UiKQorICAgICAqICAgICAgLnByb3BlcnR5KEhUVFBfQVVUSEVOVElDQVRJT05fQkFTSUNfUEFTU1dPUkQsICJwMXN3ZDc0NSIpLmdldCgpOworICAgICAqIDwvcHJlPgorICAgICAqIDwvcD4KKyAgICAgKiBUaGUgcHJvcGVydHkgbXVzdCBiZSBhbHdheXMgY29tYmluZWQgd2l0aCBjb25maWd1cmF0aW9uIG9mIHtAbGluayAjSFRUUF9BVVRIRU5USUNBVElPTl9VU0VSTkFNRX0gcHJvcGVydHkKKyAgICAgKiAoYXMgc2hvd24gaW4gdGhlIGV4YW1wbGUpLiBUaGUgcHJvcGVydHkgcGFpciBpbmZsdWVuY2Ugb25seSBjcmVkZW50aWFscyB1c2VkIGR1cmluZyBiYXNpYyBhdXRoZW50aWNhdGlvbi4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgdmFsdWUgbXVzdCBiZSBpbnN0YW5jZSBvZiB7QGxpbmsgU3RyaW5nfSBvciB7QGNvZGUgYnl0ZX0gYXJyYXkgKHtAY29kZSBieXRlW119KS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaXMgPHR0PntAdmFsdWV9PC90dD4uCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfQVVUSEVOVElDQVRJT05fQkFTSUNfUEFTU1dPUkQgPSAiamVyc2V5LmNvbmZpZy5jbGllbnQuaHR0cC5hdXRoLmJhc2ljLnBhc3N3b3JkIjsKKworICAgIC8qKgorICAgICAqIEtleSBvZiB0aGUgcHJvcGVydHkgdGhhdCBjYW4gYmUgc2V0IGludG8gdGhlIHtAbGluayBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdENvbnRleHQgY2xpZW50IHJlcXVlc3R9CisgICAgICogdXNpbmcge0BsaW5rIGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0Q29udGV4dCNzZXRQcm9wZXJ0eShTdHJpbmcsIE9iamVjdCl9IGluIG9yZGVyIHRvIG92ZXJyaWRlCisgICAgICogdGhlIHVzZXJuYW1lIGZvciBodHRwIGRpZ2VzdCBhdXRoZW50aWNhdGlvbiBmZWF0dXJlIGZvciB0aGUgcmVxdWVzdC4KKyAgICAgKiA8cD4KKyAgICAgKiBFeGFtcGxlOgorICAgICAqIDxwcmU+CisgICAgICogUmVzcG9uc2UgcmVzcG9uc2UgPSBjbGllbnQudGFyZ2V0KCJodHRwOi8vbG9jYWxob3N0OjgwODAvcmVzdC9qb2Uvb3JkZXJzIikucmVxdWVzdCgpCisgICAgICogICAgICAucHJvcGVydHkoSFRUUF9BVVRIRU5USUNBVElPTl9ESUdFU1RfVVNFUk5BTUUsICJqb2UiKQorICAgICAqICAgICAgLnByb3BlcnR5KEhUVFBfQVVUSEVOVElDQVRJT05fRElHRVNUX1BBU1NXT1JELCAicDFzd2Q3NDUiKS5nZXQoKTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKiA8L3A+CisgICAgICogVGhlIHByb3BlcnR5IG11c3QgYmUgYWx3YXlzIGNvbWJpbmVkIHdpdGggY29uZmlndXJhdGlvbiBvZiB7QGxpbmsgI0hUVFBfQVVUSEVOVElDQVRJT05fUEFTU1dPUkR9IHByb3BlcnR5CisgICAgICogKGFzIHNob3duIGluIHRoZSBleGFtcGxlKS4gVGhlIHByb3BlcnR5IHBhaXIgaW5mbHVlbmNlIG9ubHkgY3JlZGVudGlhbHMgdXNlZCBkdXJpbmcgZGlnZXN0IGF1dGhlbnRpY2F0aW9uLgorICAgICAqIDxwPgorICAgICAqIFRoZSB2YWx1ZSBtdXN0IGJlIGluc3RhbmNlIG9mIHtAbGluayBTdHJpbmd9LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9BVVRIRU5USUNBVElPTl9ESUdFU1RfVVNFUk5BTUUgPSAiamVyc2V5LmNvbmZpZy5jbGllbnQuaHR0cC5hdXRoLmRpZ2VzdC51c2VybmFtZSI7CisKKyAgICAvKioKKyAgICAgKiBLZXkgb2YgdGhlIHByb3BlcnR5IHRoYXQgY2FuIGJlIHNldCBpbnRvIHRoZSB7QGxpbmsgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RDb250ZXh0IGNsaWVudCByZXF1ZXN0fQorICAgICAqIHVzaW5nIHtAbGluayBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdENvbnRleHQjc2V0UHJvcGVydHkoU3RyaW5nLCBPYmplY3QpfSBpbiBvcmRlciB0byBvdmVycmlkZQorICAgICAqIHRoZSBwYXNzd29yZCBmb3IgaHR0cCBkaWdlc3QgYXV0aGVudGljYXRpb24gZmVhdHVyZSBmb3IgdGhlIHJlcXVlc3QuCisgICAgICogPHA+CisgICAgICogRXhhbXBsZToKKyAgICAgKiA8cHJlPgorICAgICAqIFJlc3BvbnNlIHJlc3BvbnNlID0gY2xpZW50LnRhcmdldCgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3Jlc3Qvam9lL29yZGVycyIpLnJlcXVlc3QoKQorICAgICAqICAgICAgLnByb3BlcnR5KEhUVFBfQVVUSEVOVElDQVRJT05fRElHRVNUX1VTRVJOQU1FLCAiam9lIikKKyAgICAgKiAgICAgIC5wcm9wZXJ0eShIVFRQX0FVVEhFTlRJQ0FUSU9OX0RJR0VTVF9QQVNTV09SRCwgInAxc3dkNzQ1IikuZ2V0KCk7CisgICAgICogPC9wcmU+CisgICAgICogPC9wPgorICAgICAqIFRoZSBwcm9wZXJ0eSBtdXN0IGJlIGFsd2F5cyBjb21iaW5lZCB3aXRoIGNvbmZpZ3VyYXRpb24gb2Yge0BsaW5rICNIVFRQX0FVVEhFTlRJQ0FUSU9OX1BBU1NXT1JEfSBwcm9wZXJ0eQorICAgICAqIChhcyBzaG93biBpbiB0aGUgZXhhbXBsZSkuIFRoZSBwcm9wZXJ0eSBwYWlyIGluZmx1ZW5jZSBvbmx5IGNyZWRlbnRpYWxzIHVzZWQgZHVyaW5nIGRpZ2VzdCBhdXRoZW50aWNhdGlvbi4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgdmFsdWUgbXVzdCBiZSBpbnN0YW5jZSBvZiB7QGxpbmsgU3RyaW5nfSBvciB7QGNvZGUgYnl0ZX0gYXJyYXkgKHtAY29kZSBieXRlW119KS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaXMgPHR0PntAdmFsdWV9PC90dD4uCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBfQVVUSEVOVElDQVRJT05fRElHRVNUX1BBU1NXT1JEID0gImplcnNleS5jb25maWcuY2xpZW50Lmh0dHAuYXV0aC5kaWdlc3QucGFzc3dvcmQiOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIHRoZSBidWlsZGVyIG9mIHRoZSBodHRwIGF1dGhlbnRpY2F0aW9uIGZlYXR1cmUgd29ya2luZyBpbiBiYXNpYyBhdXRoZW50aWNhdGlvbiBtb2RlLiBUaGUgYnVpbGRlcgorICAgICAqIGNhbiBidWlsZCBwcmVlbXB0aXZlIGFuZCBub24tcHJlZW1wdGl2ZSBiYXNpYyBhdXRoZW50aWNhdGlvbiBmZWF0dXJlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQmFzaWMgaHR0cCBhdXRoZW50aWNhdGlvbiBidWlsZGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQmFzaWNCdWlsZGVyIGJhc2ljQnVpbGRlcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVySW1wbChNb2RlLkJBU0lDX1BSRUVNUFRJVkUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSB0aGUgaHR0cCBhdXRoZW50aWNhdGlvbiBmZWF0dXJlIGluIGJhc2ljIHByZWVtcHRpdmUgYXV0aGVudGljYXRpb24gbW9kZSBpbml0aWFsaXplZCB3aXRoIGNyZWRlbnRpYWxzLgorICAgICAqCisgICAgICogQHBhcmFtIHVzZXJuYW1lIFVzZXJuYW1lLgorICAgICAqIEBwYXJhbSBwYXNzd29yZCBQYXNzd29yZCBhcyB7QGNvZGUgYnl0ZSBhcnJheX0uCisgICAgICogQHJldHVybiBIdHRwIGF1dGhlbnRpY2F0aW9uIGZlYXR1cmUgY29uZmlndXJlZCBpbiBiYXNpYyBtb2RlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZSBiYXNpYyhTdHJpbmcgdXNlcm5hbWUsIGJ5dGVbXSBwYXNzd29yZCkgeworICAgICAgICByZXR1cm4gYnVpbGQoTW9kZS5CQVNJQ19QUkVFTVBUSVZFLCB1c2VybmFtZSwgcGFzc3dvcmQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSB0aGUgaHR0cCBhdXRoZW50aWNhdGlvbiBmZWF0dXJlIGluIGJhc2ljIHByZWVtcHRpdmUgYXV0aGVudGljYXRpb24gbW9kZSBpbml0aWFsaXplZCB3aXRoIGNyZWRlbnRpYWxzLgorICAgICAqCisgICAgICogQHBhcmFtIHVzZXJuYW1lIFVzZXJuYW1lLgorICAgICAqIEBwYXJhbSBwYXNzd29yZCBQYXNzd29yZCBhcyB7QGxpbmsgU3RyaW5nfS4KKyAgICAgKiBAcmV0dXJuIEh0dHAgYXV0aGVudGljYXRpb24gZmVhdHVyZSBjb25maWd1cmVkIGluIGJhc2ljIG1vZGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlIGJhc2ljKFN0cmluZyB1c2VybmFtZSwgU3RyaW5nIHBhc3N3b3JkKSB7CisgICAgICAgIHJldHVybiBidWlsZChNb2RlLkJBU0lDX1BSRUVNUFRJVkUsIHVzZXJuYW1lLCBwYXNzd29yZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIHRoZSBodHRwIGF1dGhlbnRpY2F0aW9uIGZlYXR1cmUgaW4gZGlnZXN0IGF1dGhlbnRpY2F0aW9uIG1vZGUgaW5pdGlhbGl6ZWQgd2l0aG91dCBkZWZhdWx0CisgICAgICogY3JlZGVudGlhbHMuIENyZWRlbnRpYWxzIHdpbGwgaGF2ZSB0byBiZSBzdXBwbGllZCB1c2luZyByZXF1ZXN0IHByb3BlcnRpZXMgZm9yIGVhY2ggcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gSHR0cCBhdXRoZW50aWNhdGlvbiBmZWF0dXJlIGNvbmZpZ3VyZWQgaW4gZGlnZXN0IG1vZGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlIGRpZ2VzdCgpIHsKKyAgICAgICAgcmV0dXJuIGJ1aWxkKE1vZGUuRElHRVNUKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgdGhlIGh0dHAgYXV0aGVudGljYXRpb24gZmVhdHVyZSBpbiBkaWdlc3QgYXV0aGVudGljYXRpb24gbW9kZSBpbml0aWFsaXplZCB3aXRoIGNyZWRlbnRpYWxzLgorICAgICAqCisgICAgICogQHBhcmFtIHVzZXJuYW1lIFVzZXJuYW1lLgorICAgICAqIEBwYXJhbSBwYXNzd29yZCBQYXNzd29yZCBhcyB7QGNvZGUgYnl0ZSBhcnJheX0uCisgICAgICogQHJldHVybiBIdHRwIGF1dGhlbnRpY2F0aW9uIGZlYXR1cmUgY29uZmlndXJlZCBpbiBkaWdlc3QgbW9kZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUgZGlnZXN0KFN0cmluZyB1c2VybmFtZSwgYnl0ZVtdIHBhc3N3b3JkKSB7CisgICAgICAgIHJldHVybiBidWlsZChNb2RlLkRJR0VTVCwgdXNlcm5hbWUsIHBhc3N3b3JkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgdGhlIGh0dHAgYXV0aGVudGljYXRpb24gZmVhdHVyZSBpbiBkaWdlc3QgYXV0aGVudGljYXRpb24gbW9kZSBpbml0aWFsaXplZCB3aXRoIGNyZWRlbnRpYWxzLgorICAgICAqCisgICAgICogQHBhcmFtIHVzZXJuYW1lIFVzZXJuYW1lLgorICAgICAqIEBwYXJhbSBwYXNzd29yZCBQYXNzd29yZCBhcyB7QGxpbmsgU3RyaW5nfS4KKyAgICAgKiBAcmV0dXJuIEh0dHAgYXV0aGVudGljYXRpb24gZmVhdHVyZSBjb25maWd1cmVkIGluIGRpZ2VzdCBtb2RlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZSBkaWdlc3QoU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQpIHsKKyAgICAgICAgcmV0dXJuIGJ1aWxkKE1vZGUuRElHRVNULCB1c2VybmFtZSwgcGFzc3dvcmQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSB0aGUgYnVpbGRlciB0aGF0IGJ1aWxkcyBodHRwIGF1dGhlbnRpY2F0aW9uIGZlYXR1cmUgaW4gY29tYmluZWQgbW9kZSBzdXBwb3J0aW5nIGJvdGgsCisgICAgICogYmFzaWMgYW5kIGRpZ2VzdCBhdXRoZW50aWNhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVW5pdmVyc2FsIGJ1aWxkZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBVbml2ZXJzYWxCdWlsZGVyIHVuaXZlcnNhbEJ1aWxkZXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgQnVpbGRlckltcGwoTW9kZS5VTklWRVJTQUwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSB0aGUgaHR0cCBhdXRoZW50aWNhdGlvbiBmZWF0dXJlIGluIGNvbWJpbmVkIG1vZGUgc3VwcG9ydGluZyBib3RoLAorICAgICAqIGJhc2ljIGFuZCBkaWdlc3QgYXV0aGVudGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlcm5hbWUgVXNlcm5hbWUuCisgICAgICogQHBhcmFtIHBhc3N3b3JkIFBhc3N3b3JkIGFzIHtAY29kZSBieXRlIGFycmF5fS4KKyAgICAgKiBAcmV0dXJuIEh0dHAgYXV0aGVudGljYXRpb24gZmVhdHVyZSBjb25maWd1cmVkIGluIGRpZ2VzdCBtb2RlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZSB1bml2ZXJzYWwoU3RyaW5nIHVzZXJuYW1lLCBieXRlW10gcGFzc3dvcmQpIHsKKyAgICAgICAgcmV0dXJuIGJ1aWxkKE1vZGUuVU5JVkVSU0FMLCB1c2VybmFtZSwgcGFzc3dvcmQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSB0aGUgaHR0cCBhdXRoZW50aWNhdGlvbiBmZWF0dXJlIGluIGNvbWJpbmVkIG1vZGUgc3VwcG9ydGluZyBib3RoLAorICAgICAqIGJhc2ljIGFuZCBkaWdlc3QgYXV0aGVudGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlcm5hbWUgVXNlcm5hbWUuCisgICAgICogQHBhcmFtIHBhc3N3b3JkIFBhc3N3b3JkIGFzIHtAbGluayBTdHJpbmd9LgorICAgICAqIEByZXR1cm4gSHR0cCBhdXRoZW50aWNhdGlvbiBmZWF0dXJlIGNvbmZpZ3VyZWQgaW4gZGlnZXN0IG1vZGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlIHVuaXZlcnNhbChTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyBwYXNzd29yZCkgeworICAgICAgICByZXR1cm4gYnVpbGQoTW9kZS5VTklWRVJTQUwsIHVzZXJuYW1lLCBwYXNzd29yZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZSBidWlsZChNb2RlIG1vZGUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVySW1wbChtb2RlKS5idWlsZCgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUgYnVpbGQoTW9kZSBtb2RlLCBTdHJpbmcgdXNlcm5hbWUsIGJ5dGVbXSBwYXNzd29yZCkgeworICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXJJbXBsKG1vZGUpLmNyZWRlbnRpYWxzKHVzZXJuYW1lLCBwYXNzd29yZCkuYnVpbGQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlIGJ1aWxkKE1vZGUgbW9kZSwgU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVySW1wbChtb2RlKS5jcmVkZW50aWFscyh1c2VybmFtZSwgcGFzc3dvcmQpLmJ1aWxkKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBNb2RlIG1vZGU7CisgICAgcHJpdmF0ZSBmaW5hbCBIdHRwQXV0aGVudGljYXRpb25GaWx0ZXIuQ3JlZGVudGlhbHMgYmFzaWNDcmVkZW50aWFsczsKKyAgICBwcml2YXRlIGZpbmFsIEh0dHBBdXRoZW50aWNhdGlvbkZpbHRlci5DcmVkZW50aWFscyBkaWdlc3RDcmVkZW50aWFsczsKKworICAgIHByaXZhdGUgSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZShNb2RlIG1vZGUsIEh0dHBBdXRoZW50aWNhdGlvbkZpbHRlci5DcmVkZW50aWFscyBiYXNpY0NyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwQXV0aGVudGljYXRpb25GaWx0ZXIuQ3JlZGVudGlhbHMgZGlnZXN0Q3JlZGVudGlhbHMpIHsKKyAgICAgICAgdGhpcy5tb2RlID0gbW9kZTsKKyAgICAgICAgdGhpcy5iYXNpY0NyZWRlbnRpYWxzID0gYmFzaWNDcmVkZW50aWFsczsKKworICAgICAgICB0aGlzLmRpZ2VzdENyZWRlbnRpYWxzID0gZGlnZXN0Q3JlZGVudGlhbHM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlKEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgY29udGV4dC5yZWdpc3RlcihuZXcgSHR0cEF1dGhlbnRpY2F0aW9uRmlsdGVyKG1vZGUsIGJhc2ljQ3JlZGVudGlhbHMsIGRpZ2VzdENyZWRlbnRpYWxzLCBjb250ZXh0LmdldENvbmZpZ3VyYXRpb24oKSkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9hdXRoZW50aWNhdGlvbi9IdHRwQXV0aGVudGljYXRpb25GaWx0ZXIuamF2YSBiL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L2F1dGhlbnRpY2F0aW9uL0h0dHBBdXRoZW50aWNhdGlvbkZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3Njc1YzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9hdXRoZW50aWNhdGlvbi9IdHRwQXV0aGVudGljYXRpb25GaWx0ZXIuamF2YQpAQCAtMCwwICsxLDQyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuYXV0aGVudGljYXRpb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LndzLnJzLlByaW9yaXRpZXM7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlc3BvbnNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVzcG9uc2VGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuSW52b2NhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRIYXNoTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJpb3JpdHk7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CisKKy8qKgorICogSHR0cCBBdXRoZW50aWNhdGlvbiBmaWx0ZXIgdGhhdCBwcm92aWRlcyBiYXNpYyBhbmQgZGlnZXN0IGF1dGhlbnRpY2F0aW9uIChiYXNlZCBvbiBSRkMgMjYxNykuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitAUHJpb3JpdHkoUHJpb3JpdGllcy5BVVRIRU5USUNBVElPTikKK2NsYXNzIEh0dHBBdXRoZW50aWNhdGlvbkZpbHRlciBpbXBsZW1lbnRzIENsaWVudFJlcXVlc3RGaWx0ZXIsIENsaWVudFJlc3BvbnNlRmlsdGVyIHsKKworICAgIC8qKgorICAgICAqIEF1dGhlbnRpY2F0aW9uIHR5cGUuCisgICAgICovCisgICAgZW51bSBUeXBlIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJhc2ljIGF1dGhlbnRpY2F0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgQkFTSUMsCisgICAgICAgIC8qKgorICAgICAgICAgKiBEaWdlc3QgYXV0aGVudGljYXRpb24uCisgICAgICAgICAqLworICAgICAgICBESUdFU1QKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUVTVF9QUk9QRVJUWV9GSUxURVJfUkVVU0VEID0KKyAgICAgICAgICAgICJvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuYXV0aGVudGljYXRpb24uSHR0cEF1dGhlbnRpY2F0aW9uRmlsdGVyLnJldXNlZCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVFU1RfUFJPUEVSVFlfT1BFUkFUSU9OID0KKyAgICAgICAgICAgICJvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuYXV0aGVudGljYXRpb24uSHR0cEF1dGhlbnRpY2F0aW9uRmlsdGVyLm9wZXJhdGlvbiI7CisKKyAgICAvKioKKyAgICAgKiBFbmNvZGluZyB1c2VkIGZvciBhdXRoZW50aWNhdGlvbiBjYWxjdWxhdGlvbnMuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIENoYXJzZXQgQ0hBUkFDVEVSX1NFVCA9IENoYXJzZXQuZm9yTmFtZSgiaXNvLTg4NTktMSIpOworCisgICAgcHJpdmF0ZSBmaW5hbCBIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLk1vZGUgbW9kZTsKKworICAgIC8qKgorICAgICAqIENhY2hlIHdpdGgge0Bjb2RlIFVSSTpIVFRQLU1FVEhPRH0ga2V5cyBhbmQgYXV0aGVudGljYXRpb24gdHlwZSBhcyB2YWx1ZXMuIENvbnRhaW5zIHN1Y2Nlc3NmdWwKKyAgICAgKiBhdXRoZW50aWNhdGlvbnMgYWxyZWFkeSBwZXJmb3JtZWQgYnkgdGhlIGZpbHRlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFR5cGU+IHVyaUNhY2hlOworCisgICAgcHJpdmF0ZSBmaW5hbCBEaWdlc3RBdXRoZW50aWNhdG9yIGRpZ2VzdEF1dGg7CisgICAgcHJpdmF0ZSBmaW5hbCBCYXNpY0F1dGhlbnRpY2F0b3IgYmFzaWNBdXRoOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWElNVU1fRElHRVNUX0NBQ0hFX1NJWkUgPSAxMDAwMDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBmaWx0ZXIgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbW9kZSAgICAgICAgICAgICAgTW9kZS4KKyAgICAgKiBAcGFyYW0gYmFzaWNDcmVkZW50aWFscyAgQmFzaWMgY3JlZGVudGlhbHMgKGNhbiBiZSB7QGNvZGUgbnVsbH0gaWYgdGhpcyBmaWx0ZXIgZG9lcyBub3Qgd29yayBpbiB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzaWMgbW9kZSBvciBpZiBubyBkZWZhdWx0IGNyZWRlbnRpYWxzIGFyZSBkZWZpbmVkKS4KKyAgICAgKiBAcGFyYW0gZGlnZXN0Q3JlZGVudGlhbHMgRGlnZXN0IGNyZWRlbnRpYWxzIChjYW4gYmUge0Bjb2RlIG51bGx9IGlmIHRoaXMgZmlsdGVyIGRvZXMgbm90IHdvcmsgaW4gdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGRpZ2VzdCBtb2RlIG9yIGlmIG5vIGRlZmF1bHQgY3JlZGVudGlhbHMgYXJlIGRlZmluZWQpLgorICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uICAgICBDb25maWd1cmF0aW9uIChub24te0Bjb2RlIG51bGx9KS4KKyAgICAgKi8KKyAgICBIdHRwQXV0aGVudGljYXRpb25GaWx0ZXIoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5Nb2RlIG1vZGUsIENyZWRlbnRpYWxzIGJhc2ljQ3JlZGVudGlhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENyZWRlbnRpYWxzIGRpZ2VzdENyZWRlbnRpYWxzLCBDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgaW50IGxpbWl0ID0gZ2V0TWF4aW11bUNhY2hlTGltaXQoY29uZmlndXJhdGlvbik7CisKKyAgICAgICAgZmluYWwgaW50IHVyaUNhY2hlTGltaXQgPSBsaW1pdCAqIDI7IC8vIDIgaXMgY2hvc2VuIHRvIGVzdGltYXRlIHRoZXJlIHdpbGwgYmUgdHdvIHRpbWVzIFVSSXMKKyAgICAgICAgLy8gZm9yIGJhc2ljIGFuZCBkaWdlc3QgdG9nZXRoZXIgdGhhbiBvbmx5IGRpZ2VzdAorICAgICAgICAvLyAobGltaXQgZXN0aW1hdGVzIGRpZ2VzdCBtYXggVVJJIG51bWJlcikKKworICAgICAgICB1cmlDYWNoZSA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcChuZXcgTGlua2VkSGFzaE1hcDxTdHJpbmcsIFR5cGU+KHVyaUNhY2hlTGltaXQpIHsKKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDE5NDYyNDU2NDU0MTU2MjVMOworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBib29sZWFuIHJlbW92ZUVsZGVzdEVudHJ5KE1hcC5FbnRyeTxTdHJpbmcsIFR5cGU+IGVsZGVzdCkgeworICAgICAgICAgICAgICAgIHJldHVybiBzaXplKCkgPiB1cmlDYWNoZUxpbWl0OworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICB0aGlzLm1vZGUgPSBtb2RlOworICAgICAgICBzd2l0Y2ggKG1vZGUpIHsKKyAgICAgICAgICAgIGNhc2UgQkFTSUNfUFJFRU1QVElWRToKKyAgICAgICAgICAgIGNhc2UgQkFTSUNfTk9OX1BSRUVNUFRJVkU6CisgICAgICAgICAgICAgICAgdGhpcy5iYXNpY0F1dGggPSBuZXcgQmFzaWNBdXRoZW50aWNhdG9yKGJhc2ljQ3JlZGVudGlhbHMpOworICAgICAgICAgICAgICAgIHRoaXMuZGlnZXN0QXV0aCA9IG51bGw7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERJR0VTVDoKKyAgICAgICAgICAgICAgICB0aGlzLmJhc2ljQXV0aCA9IG51bGw7CisgICAgICAgICAgICAgICAgdGhpcy5kaWdlc3RBdXRoID0gbmV3IERpZ2VzdEF1dGhlbnRpY2F0b3IoZGlnZXN0Q3JlZGVudGlhbHMsIGxpbWl0KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgVU5JVkVSU0FMOgorICAgICAgICAgICAgICAgIHRoaXMuYmFzaWNBdXRoID0gbmV3IEJhc2ljQXV0aGVudGljYXRvcihiYXNpY0NyZWRlbnRpYWxzKTsKKyAgICAgICAgICAgICAgICB0aGlzLmRpZ2VzdEF1dGggPSBuZXcgRGlnZXN0QXV0aGVudGljYXRvcihkaWdlc3RDcmVkZW50aWFscywgbGltaXQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJOb3QgaW1wbGVtZW50ZWQuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGludCBnZXRNYXhpbXVtQ2FjaGVMaW1pdChDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgaW50IGxpbWl0ID0gQ2xpZW50UHJvcGVydGllcy5nZXRWYWx1ZShjb25maWd1cmF0aW9uLmdldFByb3BlcnRpZXMoKSwKKyAgICAgICAgICAgICAgICBDbGllbnRQcm9wZXJ0aWVzLkRJR0VTVEFVVEhfVVJJX0NBQ0hFX1NJWkVMSU1JVCwgTUFYSU1VTV9ESUdFU1RfQ0FDSEVfU0laRSk7CisgICAgICAgIGlmIChsaW1pdCA8IDEpIHsKKyAgICAgICAgICAgIGxpbWl0ID0gTUFYSU1VTV9ESUdFU1RfQ0FDSEVfU0laRTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGltaXQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZmlsdGVyKENsaWVudFJlcXVlc3RDb250ZXh0IHJlcXVlc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICgidHJ1ZSIuZXF1YWxzKHJlcXVlc3QuZ2V0UHJvcGVydHkoUkVRVUVTVF9QUk9QRVJUWV9GSUxURVJfUkVVU0VEKSkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXF1ZXN0LmdldEhlYWRlcnMoKS5jb250YWluc0tleShIdHRwSGVhZGVycy5BVVRIT1JJWkFUSU9OKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgVHlwZSBvcGVyYXRpb24gPSBudWxsOworICAgICAgICBpZiAobW9kZSA9PSBIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLk1vZGUuQkFTSUNfUFJFRU1QVElWRSkgeworICAgICAgICAgICAgYmFzaWNBdXRoLmZpbHRlclJlcXVlc3QocmVxdWVzdCk7CisgICAgICAgICAgICBvcGVyYXRpb24gPSBUeXBlLkJBU0lDOworICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5Nb2RlLkJBU0lDX05PTl9QUkVFTVBUSVZFKSB7CisgICAgICAgICAgICAvLyBkbyBub3RoaW5nCisgICAgICAgIH0gZWxzZSBpZiAobW9kZSA9PSBIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLk1vZGUuRElHRVNUKSB7CisgICAgICAgICAgICBpZiAoZGlnZXN0QXV0aC5maWx0ZXJSZXF1ZXN0KHJlcXVlc3QpKSB7CisgICAgICAgICAgICAgICAgb3BlcmF0aW9uID0gVHlwZS5ESUdFU1Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobW9kZSA9PSBIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLk1vZGUuVU5JVkVSU0FMKSB7CisKKyAgICAgICAgICAgIFR5cGUgbGFzdFN1Y2Nlc3NmdWxNZXRob2QgPSB1cmlDYWNoZS5nZXQoZ2V0Q2FjaGVLZXkocmVxdWVzdCkpOworICAgICAgICAgICAgaWYgKGxhc3RTdWNjZXNzZnVsTWV0aG9kICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LnNldFByb3BlcnR5KFJFUVVFU1RfUFJPUEVSVFlfT1BFUkFUSU9OLCBsYXN0U3VjY2Vzc2Z1bE1ldGhvZCk7CisgICAgICAgICAgICAgICAgaWYgKGxhc3RTdWNjZXNzZnVsTWV0aG9kID09IFR5cGUuQkFTSUMpIHsKKyAgICAgICAgICAgICAgICAgICAgYmFzaWNBdXRoLmZpbHRlclJlcXVlc3QocmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgIG9wZXJhdGlvbiA9IFR5cGUuQkFTSUM7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0U3VjY2Vzc2Z1bE1ldGhvZCA9PSBUeXBlLkRJR0VTVCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZGlnZXN0QXV0aC5maWx0ZXJSZXF1ZXN0KHJlcXVlc3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGVyYXRpb24gPSBUeXBlLkRJR0VTVDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChvcGVyYXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgcmVxdWVzdC5zZXRQcm9wZXJ0eShSRVFVRVNUX1BST1BFUlRZX09QRVJBVElPTiwgb3BlcmF0aW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDbGllbnRSZXF1ZXN0Q29udGV4dCByZXF1ZXN0LCBDbGllbnRSZXNwb25zZUNvbnRleHQgcmVzcG9uc2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICgidHJ1ZSIuZXF1YWxzKHJlcXVlc3QuZ2V0UHJvcGVydHkoUkVRVUVTVF9QUk9QRVJUWV9GSUxURVJfUkVVU0VEKSkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFR5cGUgcmVzdWx0ID0gbnVsbDsgLy8gd2hpY2ggYXV0aGVudGljYXRpb24gaXMgcmVxdWVzdGVkOiBCQVNJQyBvciBESUdFU1QKKyAgICAgICAgYm9vbGVhbiBhdXRoZW50aWNhdGU7CisKKyAgICAgICAgaWYgKHJlc3BvbnNlLmdldFN0YXR1cygpID09IFJlc3BvbnNlLlN0YXR1cy5VTkFVVEhPUklaRUQuZ2V0U3RhdHVzQ29kZSgpKSB7CisgICAgICAgICAgICBTdHJpbmcgYXV0aFN0cmluZyA9IHJlc3BvbnNlLmdldEhlYWRlcnMoKS5nZXRGaXJzdChIdHRwSGVhZGVycy5XV1dfQVVUSEVOVElDQVRFKTsKKyAgICAgICAgICAgIGlmIChhdXRoU3RyaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdXBwZXJDYXNlQXV0aCA9IGF1dGhTdHJpbmcudHJpbSgpLnRvVXBwZXJDYXNlKCk7CisgICAgICAgICAgICAgICAgaWYgKHVwcGVyQ2FzZUF1dGguc3RhcnRzV2l0aCgiQkFTSUMiKSkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUeXBlLkJBU0lDOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodXBwZXJDYXNlQXV0aC5zdGFydHNXaXRoKCJESUdFU1QiKSkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBUeXBlLkRJR0VTVDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyB1bmtub3duIGF1dGhlbnRpY2F0aW9uIC0+IHRoaXMgZmlsdGVyIGNhbm5vdCBhdXRoZW50aWNhdGUgd2l0aCB0aGlzIG1ldGhvZAorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYXV0aGVudGljYXRlID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF1dGhlbnRpY2F0ZSA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1vZGUgPT0gSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5Nb2RlLkJBU0lDX1BSRUVNUFRJVkUpIHsKKyAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcgLT4gNDAxIHdpbGwgYmUgcmV0dXJuZWQgdG8gdGhlIGNsaWVudAorICAgICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5Nb2RlLkJBU0lDX05PTl9QUkVFTVBUSVZFKSB7CisgICAgICAgICAgICBpZiAoYXV0aGVudGljYXRlICYmIHJlc3VsdCA9PSBUeXBlLkJBU0lDKSB7CisgICAgICAgICAgICAgICAgYmFzaWNBdXRoLmZpbHRlclJlc3BvbnNlQW5kQXV0aGVudGljYXRlKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChtb2RlID09IEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUuTW9kZS5ESUdFU1QpIHsKKyAgICAgICAgICAgIGlmIChhdXRoZW50aWNhdGUgJiYgcmVzdWx0ID09IFR5cGUuRElHRVNUKSB7CisgICAgICAgICAgICAgICAgZGlnZXN0QXV0aC5maWx0ZXJSZXNwb25zZShyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobW9kZSA9PSBIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLk1vZGUuVU5JVkVSU0FMKSB7CisgICAgICAgICAgICBUeXBlIG9wZXJhdGlvbiA9IChUeXBlKSByZXF1ZXN0LmdldFByb3BlcnR5KFJFUVVFU1RfUFJPUEVSVFlfT1BFUkFUSU9OKTsKKyAgICAgICAgICAgIGlmIChvcGVyYXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHVwZGF0ZUNhY2hlKHJlcXVlc3QsICFhdXRoZW50aWNhdGUsIG9wZXJhdGlvbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChhdXRoZW50aWNhdGUpIHsKKyAgICAgICAgICAgICAgICBib29sZWFuIHN1Y2Nlc3MgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIC8vIG5vdyB3ZSBoYXZlIHRoZSBjaGFsbGVuZ2UgcmVzcG9uc2UgYW5kIHdlIGNhbiBhdXRoZW50aWNhdGUKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IFR5cGUuQkFTSUMpIHsKKyAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IGJhc2ljQXV0aC5maWx0ZXJSZXNwb25zZUFuZEF1dGhlbnRpY2F0ZShyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHQgPT0gVHlwZS5ESUdFU1QpIHsKKyAgICAgICAgICAgICAgICAgICAgc3VjY2VzcyA9IGRpZ2VzdEF1dGguZmlsdGVyUmVzcG9uc2UocmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB1cGRhdGVDYWNoZShyZXF1ZXN0LCBzdWNjZXNzLCByZXN1bHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q2FjaGVLZXkoQ2xpZW50UmVxdWVzdENvbnRleHQgcmVxdWVzdCkgeworICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRVcmkoKS50b1N0cmluZygpICsgIjoiICsgcmVxdWVzdC5nZXRNZXRob2QoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdXBkYXRlQ2FjaGUoQ2xpZW50UmVxdWVzdENvbnRleHQgcmVxdWVzdCwgYm9vbGVhbiBzdWNjZXNzLCBUeXBlIG9wZXJhdGlvbikgeworICAgICAgICBTdHJpbmcgY2FjaGVLZXkgPSBnZXRDYWNoZUtleShyZXF1ZXN0KTsKKyAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgIHRoaXMudXJpQ2FjaGUucHV0KGNhY2hlS2V5LCBvcGVyYXRpb24pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy51cmlDYWNoZS5yZW1vdmUoY2FjaGVLZXkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwZWF0IHRoZSB7QGNvZGUgcmVxdWVzdH0gd2l0aCBwcm92aWRlZCB7QGNvZGUgbmV3QXV0aG9yaXphdGlvbkhlYWRlcn0KKyAgICAgKiBhbmQgdXBkYXRlIHRoZSB7QGNvZGUgcmVzcG9uc2V9IHdpdGggbmV3ZXN0IHJlc3BvbnNlIGRhdGEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCAgICAgICAgICAgICAgICBSZXF1ZXN0IGNvbnRleHQuCisgICAgICogQHBhcmFtIHJlc3BvbnNlICAgICAgICAgICAgICAgUmVzcG9uc2UgY29udGV4dCAod2lsbCBiZSB1cGRhdGVkIHdpdGggdGhlIG5ldyByZXNwb25zZSBkYXRhKS4KKyAgICAgKiBAcGFyYW0gbmV3QXV0aG9yaXphdGlvbkhlYWRlciB7QGNvZGUgQXV0aG9yaXphdGlvbn0gaGVhZGVyIHRoYXQgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSBuZXcgcmVxdWVzdC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpcyB0aGUgYXV0aGVudGljYXRpb24gd2FzIHN1Y2Nlc3NmdWwgKHtAY29kZSB0cnVlfSBpZiA0MDEgcmVzcG9uc2UgY29kZSB3YXMgbm90IHJldHVybmVkOworICAgICAqIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlKS4KKyAgICAgKi8KKyAgICBzdGF0aWMgYm9vbGVhbiByZXBlYXRSZXF1ZXN0KENsaWVudFJlcXVlc3RDb250ZXh0IHJlcXVlc3QsIENsaWVudFJlc3BvbnNlQ29udGV4dCByZXNwb25zZSwgU3RyaW5nIG5ld0F1dGhvcml6YXRpb25IZWFkZXIpIHsKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IHJlcXVlc3QuZ2V0Q2xpZW50KCk7CisKKyAgICAgICAgU3RyaW5nIG1ldGhvZCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCk7CisgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUgPSByZXF1ZXN0LmdldE1lZGlhVHlwZSgpOworICAgICAgICBVUkkgbFVyaSA9IHJlcXVlc3QuZ2V0VXJpKCk7CisKKyAgICAgICAgV2ViVGFyZ2V0IHJlc291cmNlVGFyZ2V0ID0gY2xpZW50LnRhcmdldChsVXJpKTsKKworICAgICAgICBJbnZvY2F0aW9uLkJ1aWxkZXIgYnVpbGRlciA9IHJlc291cmNlVGFyZ2V0LnJlcXVlc3QobWVkaWFUeXBlKTsKKworICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gbmV3SGVhZGVycyA9IG5ldyBNdWx0aXZhbHVlZEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisKKyAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBMaXN0PE9iamVjdD4+IGVudHJ5IDogcmVxdWVzdC5nZXRIZWFkZXJzKCkuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgaWYgKEh0dHBIZWFkZXJzLkFVVEhPUklaQVRJT04uZXF1YWxzKGVudHJ5LmdldEtleSgpKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmV3SGVhZGVycy5wdXQoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICB9CisKKyAgICAgICAgbmV3SGVhZGVycy5hZGQoSHR0cEhlYWRlcnMuQVVUSE9SSVpBVElPTiwgbmV3QXV0aG9yaXphdGlvbkhlYWRlcik7CisgICAgICAgIGJ1aWxkZXIuaGVhZGVycyhuZXdIZWFkZXJzKTsKKworICAgICAgICBidWlsZGVyLnByb3BlcnR5KFJFUVVFU1RfUFJPUEVSVFlfRklMVEVSX1JFVVNFRCwgInRydWUiKTsKKworICAgICAgICBJbnZvY2F0aW9uIGludm9jYXRpb247CisgICAgICAgIGlmIChyZXF1ZXN0LmdldEVudGl0eSgpID09IG51bGwpIHsKKyAgICAgICAgICAgIGludm9jYXRpb24gPSBidWlsZGVyLmJ1aWxkKG1ldGhvZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnZvY2F0aW9uID0gYnVpbGRlci5idWlsZChtZXRob2QsCisgICAgICAgICAgICAgICAgICAgIEVudGl0eS5lbnRpdHkocmVxdWVzdC5nZXRFbnRpdHkoKSwgcmVxdWVzdC5nZXRNZWRpYVR5cGUoKSkpOworICAgICAgICB9CisgICAgICAgIFJlc3BvbnNlIG5leHRSZXNwb25zZSA9IGludm9jYXRpb24uaW52b2tlKCk7CisKKyAgICAgICAgaWYgKG5leHRSZXNwb25zZS5oYXNFbnRpdHkoKSkgeworICAgICAgICAgICAgcmVzcG9uc2Uuc2V0RW50aXR5U3RyZWFtKG5leHRSZXNwb25zZS5yZWFkRW50aXR5KElucHV0U3RyZWFtLmNsYXNzKSk7CisgICAgICAgIH0KKyAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMgPSByZXNwb25zZS5nZXRIZWFkZXJzKCk7CisgICAgICAgIGhlYWRlcnMuY2xlYXIoKTsKKyAgICAgICAgaGVhZGVycy5wdXRBbGwobmV4dFJlc3BvbnNlLmdldFN0cmluZ0hlYWRlcnMoKSk7CisgICAgICAgIHJlc3BvbnNlLnNldFN0YXR1cyhuZXh0UmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworCisgICAgICAgIHJldHVybiByZXNwb25zZS5nZXRTdGF0dXMoKSAhPSBSZXNwb25zZS5TdGF0dXMuVU5BVVRIT1JJWkVELmdldFN0YXR1c0NvZGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVkZW50aWFscyAodXNlcm5hbWUgKyBwYXNzd29yZCkuCisgICAgICovCisgICAgc3RhdGljIGNsYXNzIENyZWRlbnRpYWxzIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB1c2VybmFtZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gcGFzc3dvcmQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhIG5ldyBjcmVkZW50aWFscyBmcm9tIHVzZXJuYW1lIGFuZCBwYXNzd29yZCBhcyBieXRlIGFycmF5LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdXNlcm5hbWUgVXNlcm5hbWUuCisgICAgICAgICAqIEBwYXJhbSBwYXNzd29yZCBQYXNzd29yZCBhcyBieXRlIGFycmF5LgorICAgICAgICAgKi8KKyAgICAgICAgQ3JlZGVudGlhbHMoU3RyaW5nIHVzZXJuYW1lLCBieXRlW10gcGFzc3dvcmQpIHsKKyAgICAgICAgICAgIHRoaXMudXNlcm5hbWUgPSB1c2VybmFtZTsKKyAgICAgICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgYSBuZXcgY3JlZGVudGlhbHMgZnJvbSB1c2VybmFtZSBhbmQgcGFzc3dvcmQgYXMge0BsaW5rIFN0cmluZ30uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB1c2VybmFtZSBVc2VybmFtZS4KKyAgICAgICAgICogQHBhcmFtIHBhc3N3b3JkIHtAY29kZSBTdHJpbmd9IHBhc3N3b3JkLgorICAgICAgICAgKi8KKyAgICAgICAgQ3JlZGVudGlhbHMoU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcGFzc3dvcmQpIHsKKyAgICAgICAgICAgIHRoaXMudXNlcm5hbWUgPSB1c2VybmFtZTsKKyAgICAgICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZCA9PSBudWxsID8gbnVsbCA6IHBhc3N3b3JkLmdldEJ5dGVzKENIQVJBQ1RFUl9TRVQpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybiB1c2VybmFtZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB1c2VybmFtZS4KKyAgICAgICAgICovCisgICAgICAgIFN0cmluZyBnZXRVc2VybmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB1c2VybmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gcGFzc3dvcmQgYXMgYnl0ZSBhcnJheS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBQYXNzd29yZCBzdHJpbmcgaW4gYnl0ZSBhcnJheSByZXByZXNlbnRhdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIGJ5dGVbXSBnZXRQYXNzd29yZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBwYXNzd29yZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIENyZWRlbnRpYWxzIGV4dHJhY3RDcmVkZW50aWFscyhDbGllbnRSZXF1ZXN0Q29udGV4dCByZXF1ZXN0LCBUeXBlIHR5cGUpIHsKKyAgICAgICAgU3RyaW5nIHVzZXJuYW1lS2V5ID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIHBhc3N3b3JkS2V5ID0gbnVsbDsKKyAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdXNlcm5hbWVLZXkgPSBIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLkhUVFBfQVVUSEVOVElDQVRJT05fVVNFUk5BTUU7CisgICAgICAgICAgICBwYXNzd29yZEtleSA9IEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUuSFRUUF9BVVRIRU5USUNBVElPTl9QQVNTV09SRDsKKyAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IFR5cGUuQkFTSUMpIHsKKyAgICAgICAgICAgIHVzZXJuYW1lS2V5ID0gSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5IVFRQX0FVVEhFTlRJQ0FUSU9OX0JBU0lDX1VTRVJOQU1FOworICAgICAgICAgICAgcGFzc3dvcmRLZXkgPSBIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLkhUVFBfQVVUSEVOVElDQVRJT05fQkFTSUNfUEFTU1dPUkQ7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBUeXBlLkRJR0VTVCkgeworICAgICAgICAgICAgdXNlcm5hbWVLZXkgPSBIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLkhUVFBfQVVUSEVOVElDQVRJT05fRElHRVNUX1VTRVJOQU1FOworICAgICAgICAgICAgcGFzc3dvcmRLZXkgPSBIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLkhUVFBfQVVUSEVOVElDQVRJT05fRElHRVNUX1BBU1NXT1JEOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHVzZXJOYW1lID0gKFN0cmluZykgcmVxdWVzdC5nZXRQcm9wZXJ0eSh1c2VybmFtZUtleSk7CisgICAgICAgIGlmICh1c2VyTmFtZSAhPSBudWxsICYmICF1c2VyTmFtZS5lcXVhbHMoIiIpKSB7CisgICAgICAgICAgICBieXRlW10gcHdkQnl0ZXM7CisgICAgICAgICAgICBPYmplY3QgcGFzc3dvcmQgPSByZXF1ZXN0LmdldFByb3BlcnR5KHBhc3N3b3JkS2V5KTsKKyAgICAgICAgICAgIGlmIChwYXNzd29yZCBpbnN0YW5jZW9mIGJ5dGVbXSkgeworICAgICAgICAgICAgICAgIHB3ZEJ5dGVzID0gKChieXRlW10pIHBhc3N3b3JkKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocGFzc3dvcmQgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgICAgICAgICAgICBwd2RCeXRlcyA9ICgoU3RyaW5nKSBwYXNzd29yZCkuZ2V0Qnl0ZXMoQ0hBUkFDVEVSX1NFVCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZXF1ZXN0QXV0aGVudGljYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGl6YXRpb25NZXNzYWdlcy5BVVRIRU5USUNBVElPTl9DUkVERU5USUFMU19SRVFVRVNUX1BBU1NXT1JEX1VOU1VQUE9SVEVEKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBDcmVkZW50aWFscyh1c2VyTmFtZSwgcHdkQnl0ZXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBjcmVkZW50aWFscyBhY3R1YWwgZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QuIFByaW9yaXRpZXMgaW4gY3JlZGVudGlhbHMgc2VsZWN0aW9uIGFyZSB0aGUgZm9sbG93aW5nOgorICAgICAqIDxvbD4KKyAgICAgKiA8bGk+QmFzaWMvZGlnZXN0IHNwZWNpZmljIGNyZWRlbnRpYWxzIGRlZmluZWQgaW4gdGhlIHJlcXVlc3QgcHJvcGVydGllczwvbGk+CisgICAgICogPGxpPkNvbW1vbiBjcmVkZW50aWFscyBkZWZpbmVkIGluIHRoZSByZXF1ZXN0IHByb3BlcnRpZXM8L2xpPgorICAgICAqIDxsaT57QGNvZGUgZGVmYXVsdENyZWRlbnRpYWxzfTwvbGk+CisgICAgICogPC9vbD4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0ICAgICAgICAgICAgUmVxdWVzdCBmcm9tIHdoaWNoIGNyZWRlbnRpYWxzIHNob3VsZCBiZSBleHRyYWN0ZWQuCisgICAgICogQHBhcmFtIGRlZmF1bHRDcmVkZW50aWFscyBEZWZhdWx0IGNyZWRlbnRpYWxzIChjYW4gYmUge0Bjb2RlIG51bGx9KS4KKyAgICAgKiBAcGFyYW0gdHlwZSAgICAgICAgICAgICAgIFR5cGUgb2YgcmVxdWVzdGVkIGNyZWRlbnRpYWxzLgorICAgICAqIEByZXR1cm4gQ3JlZGVudGlhbHMgb3Ige0Bjb2RlIG51bGx9IGlmIG5vIGNyZWRlbnRpYWxzIGFyZSBmb3VuZCBhbmQge0Bjb2RlIGRlZmF1bHRDcmVkZW50aWFsc30gYXJlIHtAY29kZSBudWxsfS4KKyAgICAgKiBAdGhyb3dzIFJlcXVlc3RBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbiBpbiBjYXNlIHRoZSB7QGNvZGUgdXNlcm5hbWV9IG9yIHtAY29kZSBwYXNzd29yZH0gaXMgaW52YWxpZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgQ3JlZGVudGlhbHMgZ2V0Q3JlZGVudGlhbHMoQ2xpZW50UmVxdWVzdENvbnRleHQgcmVxdWVzdCwgQ3JlZGVudGlhbHMgZGVmYXVsdENyZWRlbnRpYWxzLCBUeXBlIHR5cGUpIHsKKyAgICAgICAgQ3JlZGVudGlhbHMgY29tbW9uQ3JlZGVudGlhbHMgPSBleHRyYWN0Q3JlZGVudGlhbHMocmVxdWVzdCwgdHlwZSk7CisKKyAgICAgICAgaWYgKGNvbW1vbkNyZWRlbnRpYWxzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBjb21tb25DcmVkZW50aWFsczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIENyZWRlbnRpYWxzIHNwZWNpZmljQ3JlZGVudGlhbHMgPSBleHRyYWN0Q3JlZGVudGlhbHMocmVxdWVzdCwgbnVsbCk7CisKKyAgICAgICAgICAgIHJldHVybiBzcGVjaWZpY0NyZWRlbnRpYWxzICE9IG51bGwgPyBzcGVjaWZpY0NyZWRlbnRpYWxzIDogZGVmYXVsdENyZWRlbnRpYWxzOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvYXV0aGVudGljYXRpb24vUmVxdWVzdEF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uLmphdmEgYi9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9hdXRoZW50aWNhdGlvbi9SZXF1ZXN0QXV0aGVudGljYXRpb25FeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2EwZWMyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvYXV0aGVudGljYXRpb24vUmVxdWVzdEF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuYXV0aGVudGljYXRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworCisvKioKKyAqIEV4Y2VwdGlvbiB0aHJvd24gYnkgc2VjdXJpdHkgcmVxdWVzdCBhdXRoZW50aWNhdGlvbi4KKyAqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworcHVibGljIGNsYXNzIFJlcXVlc3RBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIFByb2Nlc3NpbmdFeGNlcHRpb24geworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBleGNlcHRpb24gd2l0aCBleGNlcHRpb24gY2F1c2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2F1c2UgRXhjZXB0aW9uIGNhdXNlLgorICAgICAqLworICAgIHB1YmxpYyBSZXF1ZXN0QXV0aGVudGljYXRpb25FeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgICAgIHN1cGVyKGNhdXNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGV4Y2VwdGlvbiB3aXRoIGV4Y2VwdGlvbiBtZXNzYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2UgRXhjZXB0aW9uIG1lc3NhZ2UuCisgICAgICovCisgICAgcHVibGljIFJlcXVlc3RBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICBzdXBlcihtZXNzYWdlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGV4Y2VwdGlvbiB3aXRoIGV4Y2VwdGlvbiBtZXNzYWdlIGFuZCBleGNlcHRpb24gY2F1c2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBFeGNlcHRpb24gbWVzc2FnZS4KKyAgICAgKiBAcGFyYW0gY2F1c2UgRXhjZXB0aW9uIGNhdXNlLgorICAgICAqLworICAgIHB1YmxpYyBSZXF1ZXN0QXV0aGVudGljYXRpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgeworICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9hdXRoZW50aWNhdGlvbi9SZXNwb25zZUF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uLmphdmEgYi9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9hdXRoZW50aWNhdGlvbi9SZXNwb25zZUF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZlMzliZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L2F1dGhlbnRpY2F0aW9uL1Jlc3BvbnNlQXV0aGVudGljYXRpb25FeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5hdXRoZW50aWNhdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5SZXNwb25zZVByb2Nlc3NpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworLyoqCisgKiBFeGNlcHRpb24gdGhyb3duIGJ5IHNlY3VyaXR5IHJlc3BvbnNlIGF1dGhlbnRpY2F0aW9uLgorICoKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitwdWJsaWMgY2xhc3MgUmVzcG9uc2VBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIFJlc3BvbnNlUHJvY2Vzc2luZ0V4Y2VwdGlvbiB7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGV4Y2VwdGlvbiB3aXRoIGV4Y2VwdGlvbiBjYXVzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNwb25zZSB0aGUgcmVzcG9uc2UgaW5zdGFuY2UgZm9yIHdoaWNoIHRoZSBwcm9jZXNzaW5nIGZhaWxlZC4KKyAgICAgKiBAcGFyYW0gY2F1c2UgRXhjZXB0aW9uIGNhdXNlLgorICAgICAqLworICAgIHB1YmxpYyBSZXNwb25zZUF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uKFJlc3BvbnNlIHJlc3BvbnNlLCBUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgICAgc3VwZXIocmVzcG9uc2UsIGNhdXNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIG5ldyBpbnN0YW5jZSBvZiB0aGlzIGV4Y2VwdGlvbiB3aXRoIGV4Y2VwdGlvbiBtZXNzYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc3BvbnNlIHRoZSByZXNwb25zZSBpbnN0YW5jZSBmb3Igd2hpY2ggdGhlIHByb2Nlc3NpbmcgZmFpbGVkLgorICAgICAqIEBwYXJhbSBtZXNzYWdlIEV4Y2VwdGlvbiBtZXNzYWdlLgorICAgICAqLworICAgIHB1YmxpYyBSZXNwb25zZUF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uKFJlc3BvbnNlIHJlc3BvbnNlLCBTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICBzdXBlcihyZXNwb25zZSwgbWVzc2FnZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBleGNlcHRpb24gd2l0aCBleGNlcHRpb24gbWVzc2FnZSBhbmQgZXhjZXB0aW9uIGNhdXNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc3BvbnNlIHRoZSByZXNwb25zZSBpbnN0YW5jZSBmb3Igd2hpY2ggdGhlIHByb2Nlc3NpbmcgZmFpbGVkLgorICAgICAqIEBwYXJhbSBtZXNzYWdlIEV4Y2VwdGlvbiBtZXNzYWdlLgorICAgICAqIEBwYXJhbSBjYXVzZSBFeGNlcHRpb24gY2F1c2UuCisgICAgICovCisgICAgcHVibGljIFJlc3BvbnNlQXV0aGVudGljYXRpb25FeGNlcHRpb24oUmVzcG9uc2UgcmVzcG9uc2UsIFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgICAgc3VwZXIocmVzcG9uc2UsIG1lc3NhZ2UsIGNhdXNlKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L2F1dGhlbnRpY2F0aW9uL3BhY2thZ2UtaW5mby5qYXZhIGIvY29yZS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvYXV0aGVudGljYXRpb24vcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFlOWVkOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L2F1dGhlbnRpY2F0aW9uL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKKy8qKgorICogUHJvdmlkZXMgY29yZSBjbGllbnQgYXV0aGVudGljYXRpb24gbWVjaGFuaXNtcy4KKyAqLworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuYXV0aGVudGljYXRpb247CmRpZmYgLS1naXQgYS9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9maWx0ZXIvQ3NyZlByb3RlY3Rpb25GaWx0ZXIuamF2YSBiL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L2ZpbHRlci9Dc3JmUHJvdGVjdGlvbkZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3NmEyN2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9maWx0ZXIvQ3NyZlByb3RlY3Rpb25GaWx0ZXIuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5maWx0ZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0RmlsdGVyOworCisvKioKKyAqIFNpbXBsZSBjbGllbnQtc2lkZSBmaWx0ZXIgdGhhdCBhZGRzIFgtUmVxdWVzdGVkLUJ5IGhlYWRlcnMgdG8gYWxsIHN0YXRlLWNoYW5naW5nCisgKiByZXF1ZXN0IChpLmUuIHJlcXVlc3QgZm9yIG1ldGhvZHMgb3RoZXIgdGhhbiBHRVQsIEhFQUQgYW5kIE9QVElPTlMpLgorICogVGhpcyBpcyB0byBzYXRpc2Z5IHRoZSByZXF1aXJlbWVudHMgb2YgdGhlIHtAY29kZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuZmlsdGVyLkNzcmZQcm90ZWN0aW9uRmlsdGVyfQorICogb24gdGhlIHNlcnZlciBzaWRlLgorICoKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitwdWJsaWMgY2xhc3MgQ3NyZlByb3RlY3Rpb25GaWx0ZXIgaW1wbGVtZW50cyBDbGllbnRSZXF1ZXN0RmlsdGVyIHsKKworICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhlIGhlYWRlciB0aGlzIGZpbHRlciB3aWxsIGF0dGFjaCB0byB0aGUgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfTkFNRSA9ICJYLVJlcXVlc3RlZC1CeSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBNRVRIT0RTX1RPX0lHTk9SRTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIEhhc2hTZXQ8U3RyaW5nPiBtdGkgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgICAgIG10aS5hZGQoIkdFVCIpOworICAgICAgICBtdGkuYWRkKCJPUFRJT05TIik7CisgICAgICAgIG10aS5hZGQoIkhFQUQiKTsKKyAgICAgICAgTUVUSE9EU19UT19JR05PUkUgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQobXRpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyByZXF1ZXN0ZWRCeTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGZpbHRlciB3aXRoIFgtUmVxdWVzdGVkLUJ5IGhlYWRlciB2YWx1ZSBzZXQgdG8gZW1wdHkgc3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBDc3JmUHJvdGVjdGlvbkZpbHRlcigpIHsKKyAgICAgICAgdGhpcygiIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZWQgdGhlIGZpbHRlciB3aXRoIGEgZGVzaXJlZCB2YWx1ZSBvZiB0aGUgWC1SZXF1ZXN0ZWQtQnkgaGVhZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3RlZEJ5IERlc2lyZWQgdmFsdWUgb2YgWC1SZXF1ZXN0ZWQtQnkgaGVhZGVyIHRoZSBmaWx0ZXIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBhZGRpbmcgZm9yIGFsbCBwb3RlbnRpYWxseSBzdGF0ZSBjaGFuZ2luZyByZXF1ZXN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ3NyZlByb3RlY3Rpb25GaWx0ZXIoZmluYWwgU3RyaW5nIHJlcXVlc3RlZEJ5KSB7CisgICAgICAgIHRoaXMucmVxdWVzdGVkQnkgPSByZXF1ZXN0ZWRCeTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ2xpZW50UmVxdWVzdENvbnRleHQgcmMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICghTUVUSE9EU19UT19JR05PUkUuY29udGFpbnMocmMuZ2V0TWV0aG9kKCkpICYmICFyYy5nZXRIZWFkZXJzKCkuY29udGFpbnNLZXkoSEVBREVSX05BTUUpKSB7CisgICAgICAgICAgICByYy5nZXRIZWFkZXJzKCkuYWRkKEhFQURFUl9OQU1FLCByZXF1ZXN0ZWRCeSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9maWx0ZXIvRW5jb2RpbmdGZWF0dXJlLmphdmEgYi9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9maWx0ZXIvRW5jb2RpbmdGZWF0dXJlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDlhNDNjNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L2ZpbHRlci9FbmNvZGluZ0ZlYXR1cmUuamF2YQpAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5maWx0ZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlQ29udGV4dDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5Qcm92aWRlcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLkNvbnRlbnRFbmNvZGVyOworCisvKioKKyAqIEZlYXR1cmUgdGhhdCBjb25maWd1cmVzIHN1cHBvcnQgZm9yIGNvbnRlbnQgZW5jb2RpbmdzIG9uIHRoZSBjbGllbnQgc2lkZS4KKyAqIFRoaXMgZmVhdHVyZSByZWdpc3RlcnMge0BsaW5rIEVuY29kaW5nRmlsdGVyfSBhbmQgdGhlIHNwZWNpZmllZCBzZXQgb2YKKyAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuQ29udGVudEVuY29kZXIgZW5jb2RpbmcgcHJvdmlkZXJzfSB0byB0aGUKKyAqIHtAbGluayBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYWJsZSBjbGllbnQgY29uZmlndXJhdGlvbn0uIEl0IGFsc28gYWxsb3dzCisgKiBzZXR0aW5nIHRoZSB2YWx1ZSBvZiB7QGxpbmsgQ2xpZW50UHJvcGVydGllcyNVU0VfRU5DT0RJTkd9IHByb3BlcnR5LgorICoKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitwdWJsaWMgY2xhc3MgRW5jb2RpbmdGZWF0dXJlIGltcGxlbWVudHMgRmVhdHVyZSB7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdXNlRW5jb2Rpbmc7CisgICAgcHJpdmF0ZSBmaW5hbCBDbGFzczw/PltdIGVuY29kaW5nUHJvdmlkZXJzOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBmZWF0dXJlLgorICAgICAqCisgICAgICogQHBhcmFtIGVuY29kaW5nUHJvdmlkZXJzIEVuY29kaW5nIHByb3ZpZGVycyB0byBiZSByZWdpc3RlcmVkIGluIHRoZSBjbGllbnQgY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgRW5jb2RpbmdGZWF0dXJlKENsYXNzPD8+Li4uIGVuY29kaW5nUHJvdmlkZXJzKSB7CisgICAgICAgIHRoaXMobnVsbCwgZW5jb2RpbmdQcm92aWRlcnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgZmVhdHVyZSBzcGVjaWZ5aW5nIHRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUKKyAgICAgKiB7QGxpbmsgQ2xpZW50UHJvcGVydGllcyNVU0VfRU5DT0RJTkd9IHByb3BlcnR5LiBVbmxlc3MgdGhlIHZhbHVlIGlzIHNldCBpbiB0aGUgY2xpZW50IGNvbmZpZ3VyYXRpb24KKyAgICAgKiBwcm9wZXJ0aWVzIGF0IHRoZSB0aW1lIHdoZW4gdGhpcyBmZWF0dXJlIGdldHMgZW5hYmxlZCwgdGhlIHByb3ZpZGVkIHZhbHVlIHdpbGwgYmUgdXNlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VFbmNvZGluZyBEZWZhdWx0IHZhbHVlIG9mIHtAbGluayBDbGllbnRQcm9wZXJ0aWVzI1VTRV9FTkNPRElOR30gcHJvcGVydHkuCisgICAgICogQHBhcmFtIGVuY29kZXJzICAgIEVuY29kZXJzIHRvIGJlIHJlZ2lzdGVyZWQgaW4gdGhlIGNsaWVudCBjb25maWd1cmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBFbmNvZGluZ0ZlYXR1cmUoU3RyaW5nIHVzZUVuY29kaW5nLCBDbGFzczw/Pi4uLiBlbmNvZGVycykgeworICAgICAgICB0aGlzLnVzZUVuY29kaW5nID0gdXNlRW5jb2Rpbmc7CisKKyAgICAgICAgUHJvdmlkZXJzLmVuc3VyZUNvbnRyYWN0KENvbnRlbnRFbmNvZGVyLmNsYXNzLCBlbmNvZGVycyk7CisgICAgICAgIHRoaXMuZW5jb2RpbmdQcm92aWRlcnMgPSBlbmNvZGVyczsKKyAgICB9CisKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZShGZWF0dXJlQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGlmICh1c2VFbmNvZGluZyAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBwcm9wZXJ0aWVzIHRha2UgcHJlY2VkZW5jZSBvdmVyIHRoZSBjb25zdHJ1Y3RvciB2YWx1ZQorICAgICAgICAgICAgaWYgKCFjb250ZXh0LmdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0aWVzKCkuY29udGFpbnNLZXkoQ2xpZW50UHJvcGVydGllcy5VU0VfRU5DT0RJTkcpKSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5wcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLlVTRV9FTkNPRElORywgdXNlRW5jb2RpbmcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoQ2xhc3M8Pz4gcHJvdmlkZXIgOiBlbmNvZGluZ1Byb3ZpZGVycykgeworICAgICAgICAgICAgY29udGV4dC5yZWdpc3Rlcihwcm92aWRlcik7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBlbmFibGUgPSB1c2VFbmNvZGluZyAhPSBudWxsIHx8IGVuY29kaW5nUHJvdmlkZXJzLmxlbmd0aCA+IDA7CisgICAgICAgIGlmIChlbmFibGUpIHsKKyAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoRW5jb2RpbmdGaWx0ZXIuY2xhc3MpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlbmFibGU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvZmlsdGVyL0VuY29kaW5nRmlsdGVyLmphdmEgYi9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9maWx0ZXIvRW5jb2RpbmdGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDE1ZWM0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvZmlsdGVyL0VuY29kaW5nRmlsdGVyLmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuZmlsdGVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7CitpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLkNvbnRlbnRFbmNvZGVyOworCisvKioKKyAqIENsaWVudCBmaWx0ZXIgYWRkaW5nIHN1cHBvcnQgZm9yIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuQ29udGVudEVuY29kZXIgY29udGVudCBlbmNvZGluZ30uIFRoZSBmaWx0ZXIgYWRkcworICogbGlzdCBvZiBzdXBwb3J0ZWQgZW5jb2RpbmdzIHRvIHRoZSBBY2NlcHQtSGVhZGVyIHZhbHVlcy4KKyAqIFN1cHBvcnRlZCBlbmNvZGluZ3MgYXJlIGRldGVybWluZWQgYnkgbG9va2luZworICogdXAgYWxsIHRoZSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLkNvbnRlbnRFbmNvZGVyfSBpbXBsZW1lbnRhdGlvbnMgcmVnaXN0ZXJlZCBpbiB0aGUgY29ycmVzcG9uZGluZworICoge0BsaW5rIENsaWVudENvbmZpZyBjbGllbnQgY29uZmlndXJhdGlvbn0uCisgKiA8cD4KKyAqIElmIHtAbGluayBDbGllbnRQcm9wZXJ0aWVzI1VTRV9FTkNPRElOR30gY2xpZW50IHByb3BlcnR5IGlzIHNldCwgdGhlIGZpbHRlciB3aWxsIGFkZCBDb250ZW50LUVuY29kaW5nIGhlYWRlciB3aXRoCisgKiB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5LCB1bmxlc3MgQ29udGVudC1FbmNvZGluZyBoZWFkZXIgaGFzIGFscmVhZHkgYmVlbiBzZXQuCisgKiA8L3A+CisgKgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBFbmNvZGluZ0ZpbHRlciBpbXBsZW1lbnRzIENsaWVudFJlcXVlc3RGaWx0ZXIgeworICAgIEBJbmplY3QKKyAgICBwcml2YXRlIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlcjsKKyAgICBwcml2YXRlIHZvbGF0aWxlIExpc3Q8T2JqZWN0PiBzdXBwb3J0ZWRFbmNvZGluZ3MgPSBudWxsOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZmlsdGVyKENsaWVudFJlcXVlc3RDb250ZXh0IHJlcXVlc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChnZXRTdXBwb3J0ZWRFbmNvZGluZ3MoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHJlcXVlc3QuZ2V0SGVhZGVycygpLmFkZEFsbChIdHRwSGVhZGVycy5BQ0NFUFRfRU5DT0RJTkcsIGdldFN1cHBvcnRlZEVuY29kaW5ncygpKTsKKworICAgICAgICBTdHJpbmcgdXNlRW5jb2RpbmcgPSAoU3RyaW5nKSByZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLlVTRV9FTkNPRElORyk7CisgICAgICAgIGlmICh1c2VFbmNvZGluZyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoIWdldFN1cHBvcnRlZEVuY29kaW5ncygpLmNvbnRhaW5zKHVzZUVuY29kaW5nKSkgeworICAgICAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoZ2V0Q2xhc3MoKS5nZXROYW1lKCkpLndhcm5pbmcoTG9jYWxpemF0aW9uTWVzc2FnZXMuVVNFX0VOQ09ESU5HX0lHTk9SRUQoCisgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRQcm9wZXJ0aWVzLlVTRV9FTkNPRElORywgdXNlRW5jb2RpbmcsIGdldFN1cHBvcnRlZEVuY29kaW5ncygpKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0Lmhhc0VudGl0eSgpKSB7ICAgLy8gZG9uJ3QgYWRkIENvbnRlbnQtRW5jb2RpbmcgaGVhZGVyIGZvciByZXF1ZXN0cyB3aXRoIG5vIGVudGl0eQorICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWVzdC5nZXRIZWFkZXJzKCkuZ2V0Rmlyc3QoSHR0cEhlYWRlcnMuQ09OVEVOVF9FTkNPRElORykgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRIZWFkZXJzKCkucHV0U2luZ2xlKEh0dHBIZWFkZXJzLkNPTlRFTlRfRU5DT0RJTkcsIHVzZUVuY29kaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIExpc3Q8T2JqZWN0PiBnZXRTdXBwb3J0ZWRFbmNvZGluZ3MoKSB7CisgICAgICAgIC8vIG5vIG5lZWQgZm9yIHN5bmNocm9uaXphdGlvbiAtIGluIGNhc2Ugb2YgYSByYWNlIGNvbmRpdGlvbiwgdGhlIHByb3BlcnR5CisgICAgICAgIC8vIG1heSBiZSBzZXQgdHdpY2UsIGJ1dCBpdCBkb2VzIG5vdCBicmVhayBhbnl0aGluZworICAgICAgICBpZiAoc3VwcG9ydGVkRW5jb2RpbmdzID09IG51bGwpIHsKKyAgICAgICAgICAgIFNvcnRlZFNldDxTdHJpbmc+IHNlID0gbmV3IFRyZWVTZXQ8PigpOworICAgICAgICAgICAgTGlzdDxDb250ZW50RW5jb2Rlcj4gZW5jb2RlcnMgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEFsbEluc3RhbmNlcyhDb250ZW50RW5jb2Rlci5jbGFzcyk7CisgICAgICAgICAgICBmb3IgKENvbnRlbnRFbmNvZGVyIGVuY29kZXIgOiBlbmNvZGVycykgeworICAgICAgICAgICAgICAgIHNlLmFkZEFsbChlbmNvZGVyLmdldFN1cHBvcnRlZEVuY29kaW5ncygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN1cHBvcnRlZEVuY29kaW5ncyA9IG5ldyBBcnJheUxpc3Q8PihzZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cHBvcnRlZEVuY29kaW5nczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9maWx0ZXIvcGFja2FnZS1pbmZvLmphdmEgYi9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9maWx0ZXIvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQyYzRiMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L2ZpbHRlci9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvKioKKyAqIFByb3ZpZGVzIGNvcmUgY2xpZW50IGZpbHRlcnMuCisgKi8KK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LmZpbHRlcjsKZGlmZiAtLWdpdCBhL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L2ludGVybmFsL0h0dHBVcmxDb25uZWN0b3IuamF2YSBiL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L2ludGVybmFsL0h0dHBVcmxDb25uZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWIyZWFlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvaW50ZXJuYWwvSHR0cFVybENvbm5lY3Rvci5qYXZhCkBAIC0wLDAgKzEsNTA4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uOworaW1wb3J0IGphdmEubmV0LlByb3RvY29sRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbXBsZXRhYmxlRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IGphdmF4Lm5ldC5zc2wuSG9zdG5hbWVWZXJpZmllcjsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLkh0dHBzVVJMQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLlNTTFNvY2tldEZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UmVxdWVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UmVzcG9uc2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50Lkh0dHBVcmxDb25uZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuSmVyc2V5Q2xpZW50OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5SZXF1ZXN0RW50aXR5UHJvY2Vzc2luZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuc3BpLkFzeW5jQ29ubmVjdG9yQ2FsbGJhY2s7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnNwaS5Db25uZWN0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5Qcm9wZXJ0aWVzSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5MYXp5VmFsdWU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLlVuc2FmZVZhbHVlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5WYWx1ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uVmFsdWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuU3RhdHVzZXM7CisKKy8qKgorICogRGVmYXVsdCBjbGllbnQgdHJhbnNwb3J0IGNvbm5lY3RvciB1c2luZyB7QGxpbmsgSHR0cFVSTENvbm5lY3Rpb259LgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBIdHRwVXJsQ29ubmVjdG9yIGltcGxlbWVudHMgQ29ubmVjdG9yIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEh0dHBVcmxDb25uZWN0b3IuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUxMT1dfUkVTVFJJQ1RFRF9IRUFERVJTX1NZU1RFTV9QUk9QRVJUWSA9ICJzdW4ubmV0Lmh0dHAuYWxsb3dSZXN0cmljdGVkSGVhZGVycyI7CisgICAgLy8gVGhlIGxpc3Qgb2YgcmVzdHJpY3RlZCBoZWFkZXJzIGlzIGV4dHJhY3RlZCBmcm9tIHN1bi5uZXQud3d3LnByb3RvY29sLmh0dHAuSHR0cFVSTENvbm5lY3Rpb24KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSByZXN0cmljdGVkSGVhZGVycyA9IHsKKyAgICAgICAgICAgICJBY2Nlc3MtQ29udHJvbC1SZXF1ZXN0LUhlYWRlcnMiLAorICAgICAgICAgICAgIkFjY2Vzcy1Db250cm9sLVJlcXVlc3QtTWV0aG9kIiwKKyAgICAgICAgICAgICJDb25uZWN0aW9uIiwgLyogY2xvc2UgaXMgYWxsb3dlZCAqLworICAgICAgICAgICAgIkNvbnRlbnQtTGVuZ3RoIiwKKyAgICAgICAgICAgICJDb250ZW50LVRyYW5zZmVyLUVuY29kaW5nIiwKKyAgICAgICAgICAgICJIb3N0IiwKKyAgICAgICAgICAgICJLZWVwLUFsaXZlIiwKKyAgICAgICAgICAgICJPcmlnaW4iLAorICAgICAgICAgICAgIlRyYWlsZXIiLAorICAgICAgICAgICAgIlRyYW5zZmVyLUVuY29kaW5nIiwKKyAgICAgICAgICAgICJVcGdyYWRlIiwKKyAgICAgICAgICAgICJWaWEiCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IHJlc3RyaWN0ZWRIZWFkZXJTZXQgPSBuZXcgSGFzaFNldDw+KHJlc3RyaWN0ZWRIZWFkZXJzLmxlbmd0aCk7CisKKyAgICBzdGF0aWMgeworICAgICAgICBmb3IgKFN0cmluZyBoZWFkZXJOYW1lIDogcmVzdHJpY3RlZEhlYWRlcnMpIHsKKyAgICAgICAgICAgIHJlc3RyaWN0ZWRIZWFkZXJTZXQuYWRkKGhlYWRlck5hbWUudG9Mb3dlckNhc2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIEh0dHBVcmxDb25uZWN0b3JQcm92aWRlci5Db25uZWN0aW9uRmFjdG9yeSBjb25uZWN0aW9uRmFjdG9yeTsKKyAgICBwcml2YXRlIGZpbmFsIGludCBjaHVua1NpemU7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGZpeExlbmd0aFN0cmVhbWluZzsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gc2V0TWV0aG9kV29ya2Fyb3VuZDsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNSZXN0cmljdGVkSGVhZGVyUHJvcGVydHlTZXQ7CisgICAgcHJpdmF0ZSBmaW5hbCBMYXp5VmFsdWU8U1NMU29ja2V0RmFjdG9yeT4gc3NsU29ja2V0RmFjdG9yeTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcge0Bjb2RlIEh0dHBVcmxDb25uZWN0b3J9IGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIGNsaWVudCAgICAgICAgICAgICAgSkFYLVJTIGNsaWVudCBpbnN0YW5jZSBmb3Igd2hpY2ggdGhlIGNvbm5lY3RvciBpcyBiZWluZyBjcmVhdGVkLgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uRmFjdG9yeSAgIHtAbGluayBqYXZheC5uZXQuc3NsLkh0dHBzVVJMQ29ubmVjdGlvbn0gZmFjdG9yeSB0byBiZSB1c2VkIHdoZW4gY3JlYXRpbmcgY29ubmVjdGlvbnMuCisgICAgICogQHBhcmFtIGNodW5rU2l6ZSAgICAgICAgICAgY2h1bmsgc2l6ZSB0byB1c2Ugd2hlbiB1c2luZyBIVFRQIGNodW5rZWQgdHJhbnNmZXIgY29kaW5nLgorICAgICAqIEBwYXJhbSBmaXhMZW5ndGhTdHJlYW1pbmcgIHNwZWNpZnkgaWYgdGhlIHRoZSB7QGxpbmsgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb24jc2V0Rml4ZWRMZW5ndGhTdHJlYW1pbmdNb2RlKGludCkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXhlZC1sZW5ndGggc3RyZWFtaW5nIG1vZGV9IG9uIHRoZSB1bmRlcmx5aW5nIEhUVFAgVVJMIGNvbm5lY3Rpb24gaW5zdGFuY2VzIHNob3VsZCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgd2hlbiBzZW5kaW5nIHJlcXVlc3RzLgorICAgICAqIEBwYXJhbSBzZXRNZXRob2RXb3JrYXJvdW5kIHNwZWNpZnkgaWYgdGhlIHJlZmxlY3Rpb24gd29ya2Fyb3VuZCBzaG91bGQgYmUgdXNlZCB0byBzZXQgSFRUUCBVUkwgY29ubmVjdGlvbiBtZXRob2QKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLiBTZWUge0BsaW5rIEh0dHBVcmxDb25uZWN0b3JQcm92aWRlciNTRVRfTUVUSE9EX1dPUktBUk9VTkR9IGZvciBkZXRhaWxzLgorICAgICAqLworICAgIHB1YmxpYyBIdHRwVXJsQ29ubmVjdG9yKAorICAgICAgICAgICAgZmluYWwgQ2xpZW50IGNsaWVudCwKKyAgICAgICAgICAgIGZpbmFsIEh0dHBVcmxDb25uZWN0b3JQcm92aWRlci5Db25uZWN0aW9uRmFjdG9yeSBjb25uZWN0aW9uRmFjdG9yeSwKKyAgICAgICAgICAgIGZpbmFsIGludCBjaHVua1NpemUsCisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGZpeExlbmd0aFN0cmVhbWluZywKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gc2V0TWV0aG9kV29ya2Fyb3VuZCkgeworCisgICAgICAgIHNzbFNvY2tldEZhY3RvcnkgPSBWYWx1ZXMubGF6eShuZXcgVmFsdWU8U1NMU29ja2V0RmFjdG9yeT4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTU0xTb2NrZXRGYWN0b3J5IGdldCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2xpZW50LmdldFNzbENvbnRleHQoKS5nZXRTb2NrZXRGYWN0b3J5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIHRoaXMuY29ubmVjdGlvbkZhY3RvcnkgPSBjb25uZWN0aW9uRmFjdG9yeTsKKyAgICAgICAgdGhpcy5jaHVua1NpemUgPSBjaHVua1NpemU7CisgICAgICAgIHRoaXMuZml4TGVuZ3RoU3RyZWFtaW5nID0gZml4TGVuZ3RoU3RyZWFtaW5nOworICAgICAgICB0aGlzLnNldE1ldGhvZFdvcmthcm91bmQgPSBzZXRNZXRob2RXb3JrYXJvdW5kOworCisgICAgICAgIC8vIGNoZWNrIGlmIHN1bi5uZXQuaHR0cC5hbGxvd1Jlc3RyaWN0ZWRIZWFkZXJzIHN5c3RlbSBwcm9wZXJ0eSBoYXMgYmVlbiBzZXQgYW5kIGxvZyB0aGUgcmVzdWx0CisgICAgICAgIC8vIHRoZSBwcm9wZXJ0eSBpcyBiZWluZyBjYWNoZWQgaW4gdGhlIEh0dHBVUkxDb25uZWN0aW9uLCBzbyB0aGlzIGlzIG9ubHkgaW5mb3JtYXRpdmUgLSB0aGVyZSBtaWdodAorICAgICAgICAvLyBhbHJlYWR5IGJlIHNvbWUgY29ubmVjdGlvbihzKSwgdGhhdCBleGlzdGVkIGJlZm9yZSB0aGUgcHJvcGVydHkgd2FzIHNldC9jaGFuZ2VkLgorICAgICAgICBpc1Jlc3RyaWN0ZWRIZWFkZXJQcm9wZXJ0eVNldCA9IEJvb2xlYW4udmFsdWVPZihBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKKyAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzSGVscGVyLmdldFN5c3RlbVByb3BlcnR5KEFMTE9XX1JFU1RSSUNURURfSEVBREVSU19TWVNURU1fUFJPUEVSVFksICJmYWxzZSIpCisgICAgICAgICkpOworCisgICAgICAgIExPR0dFUi5jb25maWcoaXNSZXN0cmljdGVkSGVhZGVyUHJvcGVydHlTZXQKKyAgICAgICAgICAgICAgICAgICAgICAgID8gTG9jYWxpemF0aW9uTWVzc2FnZXMuUkVTVFJJQ1RFRF9IRUFERVJfUFJPUEVSVFlfU0VUVElOR19UUlVFKEFMTE9XX1JFU1RSSUNURURfSEVBREVSU19TWVNURU1fUFJPUEVSVFkpCisgICAgICAgICAgICAgICAgICAgICAgICA6IExvY2FsaXphdGlvbk1lc3NhZ2VzLlJFU1RSSUNURURfSEVBREVSX1BST1BFUlRZX1NFVFRJTkdfRkFMU0UoQUxMT1dfUkVTVFJJQ1RFRF9IRUFERVJTX1NZU1RFTV9QUk9QRVJUWSkKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShmaW5hbCBIdHRwVVJMQ29ubmVjdGlvbiB1YykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJbnB1dFN0cmVhbSgpIHsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgVW5zYWZlVmFsdWU8SW5wdXRTdHJlYW0sIElPRXhjZXB0aW9uPiBpbiA9IFZhbHVlcy5sYXp5KG5ldyBVbnNhZmVWYWx1ZTxJbnB1dFN0cmVhbSwgSU9FeGNlcHRpb24+KCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICBpZiAodWMuZ2V0UmVzcG9uc2VDb2RlKCkgPCBSZXNwb25zZS5TdGF0dXMuQkFEX1JFUVVFU1QuZ2V0U3RhdHVzQ29kZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdWMuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGVpbiA9IHVjLmdldEVycm9yU3RyZWFtKCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGVpbiAhPSBudWxsKSA/IGVpbiA6IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVswXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGNsb3NlZCA9IGZhbHNlOworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIFRoZSBtb3RpdmF0aW9uIGZvciB0aGlzIG1ldGhvZCBpcyB0byBzdHJhaWdodGVuIHVwIGEgYmVoYXZpb3VyIG9mIHtAbGluayBzdW4ubmV0Lnd3dy5odHRwLktlZXBBbGl2ZVN0cmVhbX0gd2hpY2gKKyAgICAgICAgICAgICAqIGlzIHVzZWQgaGVyZSBhcyBhIGJhY2tpbmcge0BsaW5rIElucHV0U3RyZWFtfS4gVGhlIHByb2JsZW0gaXMgdGhhdCBpdHMgYWNjZXNzIG1ldGhvZHMgKGUuZy4sIHtAbGluaworICAgICAgICAgICAgICogc3VuLm5ldC53d3cuaHR0cC5LZWVwQWxpdmVTdHJlYW0jcmVhZCgpfSkgZG8gbm90IHRocm93IHtAbGluayBJT0V4Y2VwdGlvbn0gaWYgdGhlIHN0cmVhbSBpcyBjbG9zZWQuIFRoaXMgYmVoYXZpb3VyCisgICAgICAgICAgICAgKiBjb250cmFkaWN0cyB3aXRoIHtAbGluayBJbnB1dFN0cmVhbX0gY29udHJhY3QuCisgICAgICAgICAgICAgKiA8cC8+CisgICAgICAgICAgICAgKiBUaGlzIGlzIGEgcGFydCBvZiBmaXggb2YgSkVSU0VZLTI4NzgKKyAgICAgICAgICAgICAqIDxwLz4KKyAgICAgICAgICAgICAqIE5vdGUgdGhhdCB7QGxpbmsgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbX0gYWxzbyBjaGFuZ2VzIHRoZSBjb250cmFjdCBvZgorICAgICAgICAgICAgICoge0BsaW5rIGphdmEuaW8uRmlsdGVySW5wdXRTdHJlYW0jcmVhZChieXRlW10sIGludCwgaW50KX0gYXMgaXQgZG9lc24ndCBzdGF0ZSB0aGF0IGNsb3NlZCBzdHJlYW0gY2F1c2VzIGFuIHtAbGluaworICAgICAgICAgICAgICogSU9FeGNlcHRpb259IHdoaWNoIG1pZ2h0IGJlIHF1ZXN0aW9uYWJsZS4gTmV2ZXJ0aGVsZXNzLCBvdXIgY29udHJhY3QgaXMge0BsaW5rIElucHV0U3RyZWFtfSBhbmQgYXMgc3VjaCwgdGhlCisgICAgICAgICAgICAgKiBzdHJlYW0gd2UncmUgb2ZmZXJpbmcgbXVzdCBjb21wbHkgd2l0aCBpdC4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIHdoZW4gdGhlIHN0cmVhbSBpcyBjbG9zZWQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHByaXZhdGUgdm9pZCB0aHJvd0lPRXhjZXB0aW9uSWZDbG9zZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIGlmIChjbG9zZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJTdHJlYW0gY2xvc2VkIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9IGluLmdldCgpLnJlYWQoKTsKKyAgICAgICAgICAgICAgICB0aHJvd0lPRXhjZXB0aW9uSWZDbG9zZWQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gaW4uZ2V0KCkucmVhZChiKTsKKyAgICAgICAgICAgICAgICB0aHJvd0lPRXhjZXB0aW9uSWZDbG9zZWQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gaW4uZ2V0KCkucmVhZChiLCBvZmYsIGxlbik7CisgICAgICAgICAgICAgICAgdGhyb3dJT0V4Y2VwdGlvbklmQ2xvc2VkKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgbG9uZyBza2lwKGxvbmcgbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBsb25nIHJlc3VsdCA9IGluLmdldCgpLnNraXAobik7CisgICAgICAgICAgICAgICAgdGhyb3dJT0V4Y2VwdGlvbklmQ2xvc2VkKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgaW50IGF2YWlsYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9IGluLmdldCgpLmF2YWlsYWJsZSgpOworICAgICAgICAgICAgICAgIHRocm93SU9FeGNlcHRpb25JZkNsb3NlZCgpOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGluLmdldCgpLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgY2xvc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgbWFyayhpbnQgcmVhZExpbWl0KSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaW4uZ2V0KCkubWFyayhyZWFkTGltaXQpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5hYmxlIHRvIHJldHJpZXZlIHRoZSB1bmRlcmx5aW5nIGlucHV0IHN0cmVhbS4iLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIGluLmdldCgpLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgdGhyb3dJT0V4Y2VwdGlvbklmQ2xvc2VkKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW4uZ2V0KCkubWFya1N1cHBvcnRlZCgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5hYmxlIHRvIHJldHJpZXZlIHRoZSB1bmRlcmx5aW5nIGlucHV0IHN0cmVhbS4iLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENsaWVudFJlc3BvbnNlIGFwcGx5KENsaWVudFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIF9hcHBseShyZXF1ZXN0KTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBGdXR1cmU8Pz4gYXBwbHkoZmluYWwgQ2xpZW50UmVxdWVzdCByZXF1ZXN0LCBmaW5hbCBBc3luY0Nvbm5lY3RvckNhbGxiYWNrIGNhbGxiYWNrKSB7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNhbGxiYWNrLnJlc3BvbnNlKF9hcHBseShyZXF1ZXN0KSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBjYWxsYmFjay5mYWlsdXJlKG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKGV4KSk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBjYWxsYmFjay5mYWlsdXJlKHQpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIENvbXBsZXRhYmxlRnV0dXJlLmNvbXBsZXRlZEZ1dHVyZShudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgLy8gZG8gbm90aGluZworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlY3VyZSBjb25uZWN0aW9uIGlmIG5lY2Vzc2FyeS4KKyAgICAgKiA8cC8+CisgICAgICogUHJvdmlkZWQgaW1wbGVtZW50YXRpb24gc2V0cyB7QGxpbmsgSG9zdG5hbWVWZXJpZmllcn0gYW5kIHtAbGluayBTU0xTb2NrZXRGYWN0b3J5fSB0byBnaXZlIGNvbm5lY3Rpb24sIGlmIHRoYXQKKyAgICAgKiBpcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgSHR0cHNVUkxDb25uZWN0aW9ufS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGllbnQgY2xpZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNsaWVudCBydW50aW1lLgorICAgICAqIEBwYXJhbSB1YyAgICAgaHR0cCBjb25uZWN0aW9uIHRvIGJlIHNlY3VyZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgc2VjdXJlQ29ubmVjdGlvbihmaW5hbCBKZXJzZXlDbGllbnQgY2xpZW50LCBmaW5hbCBIdHRwVVJMQ29ubmVjdGlvbiB1YykgeworICAgICAgICBpZiAodWMgaW5zdGFuY2VvZiBIdHRwc1VSTENvbm5lY3Rpb24pIHsKKyAgICAgICAgICAgIEh0dHBzVVJMQ29ubmVjdGlvbiBzdWMgPSAoSHR0cHNVUkxDb25uZWN0aW9uKSB1YzsKKworICAgICAgICAgICAgZmluYWwgSG9zdG5hbWVWZXJpZmllciB2ZXJpZmllciA9IGNsaWVudC5nZXRIb3N0bmFtZVZlcmlmaWVyKCk7CisgICAgICAgICAgICBpZiAodmVyaWZpZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHN1Yy5zZXRIb3N0bmFtZVZlcmlmaWVyKHZlcmlmaWVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKEh0dHBzVVJMQ29ubmVjdGlvbi5nZXREZWZhdWx0U1NMU29ja2V0RmFjdG9yeSgpID09IHN1Yy5nZXRTU0xTb2NrZXRGYWN0b3J5KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBpbmRpY2F0ZXMgdGhhdCB0aGUgY3VzdG9tIHNvY2tldCBmYWN0b3J5IHdhcyBub3Qgc2V0CisgICAgICAgICAgICAgICAgc3VjLnNldFNTTFNvY2tldEZhY3Rvcnkoc3NsU29ja2V0RmFjdG9yeS5nZXQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIENsaWVudFJlc3BvbnNlIF9hcHBseShmaW5hbCBDbGllbnRSZXF1ZXN0IHJlcXVlc3QpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEh0dHBVUkxDb25uZWN0aW9uIHVjOworCisgICAgICAgIHVjID0gdGhpcy5jb25uZWN0aW9uRmFjdG9yeS5nZXRDb25uZWN0aW9uKHJlcXVlc3QuZ2V0VXJpKCkudG9VUkwoKSk7CisgICAgICAgIHVjLnNldERvSW5wdXQodHJ1ZSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGh0dHBNZXRob2QgPSByZXF1ZXN0LmdldE1ldGhvZCgpOworICAgICAgICBpZiAocmVxdWVzdC5yZXNvbHZlUHJvcGVydHkoSHR0cFVybENvbm5lY3RvclByb3ZpZGVyLlNFVF9NRVRIT0RfV09SS0FST1VORCwgc2V0TWV0aG9kV29ya2Fyb3VuZCkpIHsKKyAgICAgICAgICAgIHNldFJlcXVlc3RNZXRob2RWaWFKcmVCdWdXb3JrYXJvdW5kKHVjLCBodHRwTWV0aG9kKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVjLnNldFJlcXVlc3RNZXRob2QoaHR0cE1ldGhvZCk7CisgICAgICAgIH0KKworICAgICAgICB1Yy5zZXRJbnN0YW5jZUZvbGxvd1JlZGlyZWN0cyhyZXF1ZXN0LnJlc29sdmVQcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLkZPTExPV19SRURJUkVDVFMsIHRydWUpKTsKKworICAgICAgICB1Yy5zZXRDb25uZWN0VGltZW91dChyZXF1ZXN0LnJlc29sdmVQcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLkNPTk5FQ1RfVElNRU9VVCwgdWMuZ2V0Q29ubmVjdFRpbWVvdXQoKSkpOworCisgICAgICAgIHVjLnNldFJlYWRUaW1lb3V0KHJlcXVlc3QucmVzb2x2ZVByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuUkVBRF9USU1FT1VULCB1Yy5nZXRSZWFkVGltZW91dCgpKSk7CisKKyAgICAgICAgc2VjdXJlQ29ubmVjdGlvbihyZXF1ZXN0LmdldENsaWVudCgpLCB1Yyk7CisKKyAgICAgICAgZmluYWwgT2JqZWN0IGVudGl0eSA9IHJlcXVlc3QuZ2V0RW50aXR5KCk7CisgICAgICAgIGlmIChlbnRpdHkgIT0gbnVsbCkgeworICAgICAgICAgICAgUmVxdWVzdEVudGl0eVByb2Nlc3NpbmcgZW50aXR5UHJvY2Vzc2luZyA9IHJlcXVlc3QucmVzb2x2ZVByb3BlcnR5KAorICAgICAgICAgICAgICAgICAgICBDbGllbnRQcm9wZXJ0aWVzLlJFUVVFU1RfRU5USVRZX1BST0NFU1NJTkcsIFJlcXVlc3RFbnRpdHlQcm9jZXNzaW5nLmNsYXNzKTsKKworICAgICAgICAgICAgaWYgKGVudGl0eVByb2Nlc3NpbmcgPT0gbnVsbCB8fCBlbnRpdHlQcm9jZXNzaW5nICE9IFJlcXVlc3RFbnRpdHlQcm9jZXNzaW5nLkJVRkZFUkVEKSB7CisgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBsZW5ndGggPSByZXF1ZXN0LmdldExlbmd0aExvbmcoKTsKKyAgICAgICAgICAgICAgICBpZiAoZml4TGVuZ3RoU3RyZWFtaW5nICYmIGxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdWMuc2V0Rml4ZWRMZW5ndGhTdHJlYW1pbmdNb2RlKGxvbmcpIHdhcyBpbnRyb2R1Y2VkIGluIEpESyAxLjcgYW5kIEplcnNleSBjbGllbnQgc3VwcG9ydHMgMS42KworICAgICAgICAgICAgICAgICAgICBpZiAoIjEuNiIuZXF1YWxzKFJ1bnRpbWUuY2xhc3MuZ2V0UGFja2FnZSgpLmdldFNwZWNpZmljYXRpb25WZXJzaW9uKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1Yy5zZXRGaXhlZExlbmd0aFN0cmVhbWluZ01vZGUocmVxdWVzdC5nZXRMZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1Yy5zZXRGaXhlZExlbmd0aFN0cmVhbWluZ01vZGUobGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZW50aXR5UHJvY2Vzc2luZyA9PSBSZXF1ZXN0RW50aXR5UHJvY2Vzc2luZy5DSFVOS0VEKSB7CisgICAgICAgICAgICAgICAgICAgIHVjLnNldENodW5rZWRTdHJlYW1pbmdNb2RlKGNodW5rU2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdWMuc2V0RG9PdXRwdXQodHJ1ZSk7CisKKyAgICAgICAgICAgIGlmICgiR0VUIi5lcXVhbHNJZ25vcmVDYXNlKGh0dHBNZXRob2QpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgTG9nZ2VyIGxvZ2dlciA9IExvZ2dlci5nZXRMb2dnZXIoSHR0cFVybENvbm5lY3Rvci5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIGlmIChsb2dnZXIuaXNMb2dnYWJsZShMZXZlbC5JTkZPKSkgeworICAgICAgICAgICAgICAgICAgICBsb2dnZXIubG9nKExldmVsLklORk8sIExvY2FsaXphdGlvbk1lc3NhZ2VzLkhUVFBVUkxDT05ORUNUSU9OX1JFUExBQ0VTX0dFVF9XSVRIX0VOVElUWSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlcXVlc3Quc2V0U3RyZWFtUHJvdmlkZXIoY29udGVudExlbmd0aCAtPiB7CisgICAgICAgICAgICAgICAgc2V0T3V0Ym91bmRIZWFkZXJzKHJlcXVlc3QuZ2V0U3RyaW5nSGVhZGVycygpLCB1Yyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHVjLmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICByZXF1ZXN0LndyaXRlRW50aXR5KCk7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNldE91dGJvdW5kSGVhZGVycyhyZXF1ZXN0LmdldFN0cmluZ0hlYWRlcnMoKSwgdWMpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgaW50IGNvZGUgPSB1Yy5nZXRSZXNwb25zZUNvZGUoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlYXNvblBocmFzZSA9IHVjLmdldFJlc3BvbnNlTWVzc2FnZSgpOworICAgICAgICBmaW5hbCBSZXNwb25zZS5TdGF0dXNUeXBlIHN0YXR1cyA9CisgICAgICAgICAgICAgICAgcmVhc29uUGhyYXNlID09IG51bGwgPyBTdGF0dXNlcy5mcm9tKGNvZGUpIDogU3RhdHVzZXMuZnJvbShjb2RlLCByZWFzb25QaHJhc2UpOworICAgICAgICBmaW5hbCBVUkkgcmVzb2x2ZWRSZXF1ZXN0VXJpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVzb2x2ZWRSZXF1ZXN0VXJpID0gdWMuZ2V0VVJMKCkudG9VUkkoKTsKKyAgICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKGUpOworICAgICAgICB9CisKKyAgICAgICAgQ2xpZW50UmVzcG9uc2UgcmVzcG9uc2VDb250ZXh0ID0gbmV3IENsaWVudFJlc3BvbnNlKHN0YXR1cywgcmVxdWVzdCwgcmVzb2x2ZWRSZXF1ZXN0VXJpKTsKKyAgICAgICAgcmVzcG9uc2VDb250ZXh0LmhlYWRlcnMoCisgICAgICAgICAgICAgICAgdWMuZ2V0SGVhZGVyRmllbGRzKCkKKyAgICAgICAgICAgICAgICAgIC5lbnRyeVNldCgpCisgICAgICAgICAgICAgICAgICAuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgIC5maWx0ZXIoc3RyaW5nTGlzdEVudHJ5IC0+IHN0cmluZ0xpc3RFbnRyeS5nZXRLZXkoKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b01hcChNYXAuRW50cnk6OmdldEtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwLkVudHJ5OjpnZXRWYWx1ZSkpCisgICAgICAgICk7CisgICAgICAgIHJlc3BvbnNlQ29udGV4dC5zZXRFbnRpdHlTdHJlYW0oZ2V0SW5wdXRTdHJlYW0odWMpKTsKKworICAgICAgICByZXR1cm4gcmVzcG9uc2VDb250ZXh0OworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXRPdXRib3VuZEhlYWRlcnMoTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMsIEh0dHBVUkxDb25uZWN0aW9uIHVjKSB7CisgICAgICAgIGJvb2xlYW4gcmVzdHJpY3RlZFNlbnQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGhlYWRlciA6IGhlYWRlcnMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgU3RyaW5nIGhlYWRlck5hbWUgPSBoZWFkZXIuZ2V0S2V5KCk7CisgICAgICAgICAgICBTdHJpbmcgaGVhZGVyVmFsdWU7CisKKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBoZWFkZXJWYWx1ZXMgPSBoZWFkZXIuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIGlmIChoZWFkZXJWYWx1ZXMuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgICAgICBoZWFkZXJWYWx1ZSA9IGhlYWRlclZhbHVlcy5nZXQoMCk7CisgICAgICAgICAgICAgICAgdWMuc2V0UmVxdWVzdFByb3BlcnR5KGhlYWRlck5hbWUsIGhlYWRlclZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICBib29sZWFuIGFkZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IHZhbHVlIDogaGVhZGVyVmFsdWVzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChhZGQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGIuYXBwZW5kKCcsJyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYWRkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYi5hcHBlbmQodmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBoZWFkZXJWYWx1ZSA9IGIudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICB1Yy5zZXRSZXF1ZXN0UHJvcGVydHkoaGVhZGVyTmFtZSwgaGVhZGVyVmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gaWYgKGF0IGxlYXN0IG9uZSkgcmVzdHJpY3RlZCBoZWFkZXIgd2FzIGFkZGVkIGFuZCB0aGUgYWxsb3dSZXN0cmljdGVkSGVhZGVycworICAgICAgICAgICAgaWYgKCFpc1Jlc3RyaWN0ZWRIZWFkZXJQcm9wZXJ0eVNldCAmJiAhcmVzdHJpY3RlZFNlbnQpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNIZWFkZXJSZXN0cmljdGVkKGhlYWRlck5hbWUsIGhlYWRlclZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkU2VudCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChyZXN0cmljdGVkU2VudCkgeworICAgICAgICAgICAgTE9HR0VSLndhcm5pbmcoTG9jYWxpemF0aW9uTWVzc2FnZXMuUkVTVFJJQ1RFRF9IRUFERVJfUE9TU0lCTFlfSUdOT1JFRChBTExPV19SRVNUUklDVEVEX0hFQURFUlNfU1lTVEVNX1BST1BFUlRZKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNIZWFkZXJSZXN0cmljdGVkKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgcmV0dXJuIG5hbWUuc3RhcnRzV2l0aCgic2VjLSIpCisgICAgICAgICAgICAgICAgfHwgcmVzdHJpY3RlZEhlYWRlclNldC5jb250YWlucyhuYW1lKQorICAgICAgICAgICAgICAgICYmICEoImNvbm5lY3Rpb24iLmVxdWFsc0lnbm9yZUNhc2UobmFtZSkgJiYgImNsb3NlIi5lcXVhbHNJZ25vcmVDYXNlKHZhbHVlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV29ya2Fyb3VuZCBmb3IgYSBidWcgaW4ge0Bjb2RlIEh0dHBVUkxDb25uZWN0aW9uLnNldFJlcXVlc3RNZXRob2QoU3RyaW5nKX0KKyAgICAgKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgU3VuL09yYWNsZSBpcyB0aHJvd2luZyBhIHtAY29kZSBQcm90b2NvbEV4Y2VwdGlvbn0KKyAgICAgKiB3aGVuIHRoZSBtZXRob2QgaXMgbm90IGluIHRoZSBsaXN0IG9mIHRoZSBIVFRQLzEuMSBkZWZhdWx0IG1ldGhvZHMuCisgICAgICogVGhpcyBtZWFucyB0aGF0IHRvIHVzZSBlLmcuIHtAY29kZSBQUk9QRklORH0gYW5kIG90aGVycywgd2UgbXVzdCBhcHBseSB0aGlzIHdvcmthcm91bmQuCisgICAgICogPHAvPgorICAgICAqIFNlZSBpc3N1ZSBodHRwOi8vamF2YS5uZXQvamlyYS9icm93c2UvSkVSU0VZLTYzOQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0UmVxdWVzdE1ldGhvZFZpYUpyZUJ1Z1dvcmthcm91bmQoZmluYWwgSHR0cFVSTENvbm5lY3Rpb24gaHR0cFVSTENvbm5lY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWV0aG9kKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBodHRwVVJMQ29ubmVjdGlvbi5zZXRSZXF1ZXN0TWV0aG9kKG1ldGhvZCk7IC8vIENoZWNrIHdoZXRoZXIgd2UgYXJlIHJ1bm5pbmcgb24gYSBidWdneSBKUkUKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgUHJvdG9jb2xFeGNlcHRpb24gcGUpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlcgorICAgICAgICAgICAgICAgICAgICAgICAgLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjxPYmplY3Q+KCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgdGhyb3dzIE5vU3VjaEZpZWxkRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwVVJMQ29ubmVjdGlvbi5zZXRSZXF1ZXN0TWV0aG9kKG1ldGhvZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHdlIGFyZSBydW5uaW5nIG9uIGEgYnVnZ3kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEpSRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBQcm90b2NvbEV4Y2VwdGlvbiBwZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gY29ubmVjdGlvbkNsYXNzID0gaHR0cFVSTENvbm5lY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldENsYXNzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEZpZWxkIGRlbGVnYXRlRmllbGQgPSBjb25uZWN0aW9uQ2xhc3MuZ2V0RGVjbGFyZWRGaWVsZCgiZGVsZWdhdGUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZUZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwVVJMQ29ubmVjdGlvbiBkZWxlZ2F0ZUNvbm5lY3Rpb24gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEh0dHBVUkxDb25uZWN0aW9uKSBkZWxlZ2F0ZUZpZWxkLmdldChodHRwVVJMQ29ubmVjdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UmVxdWVzdE1ldGhvZFZpYUpyZUJ1Z1dvcmthcm91bmQoZGVsZWdhdGVDb25uZWN0aW9uLCBtZXRob2QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElnbm9yZSBmb3Igbm93LCBrZWVwIGdvaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gfCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGQgbWV0aG9kRmllbGQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGNvbm5lY3Rpb25DbGFzcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RGaWVsZCA9IGNvbm5lY3Rpb25DbGFzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RGVjbGFyZWRGaWVsZCgibWV0aG9kIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25DbGFzcyA9IGNvbm5lY3Rpb25DbGFzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0U3VwZXJjbGFzcygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kRmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kRmllbGQuc2V0KGh0dHBVUkxDb25uZWN0aW9uLCBtZXRob2QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZmluYWwgVGhyb3dhYmxlIGNhdXNlID0gZS5nZXRDYXVzZSgpOworICAgICAgICAgICAgICAgIGlmIChjYXVzZSBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pIGNhdXNlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGNhdXNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiAiSHR0cFVybENvbm5lY3Rpb24gIiArIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKFByb3BlcnRpZXNIZWxwZXIuZ2V0U3lzdGVtUHJvcGVydHkoImphdmEudmVyc2lvbiIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9wYWNrYWdlLWluZm8uamF2YSBiL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMWRkMDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvKioKKyAqIEplcnNleSBjbGllbnQtc2lkZSBjbGFzc2VzLgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudDsKZGlmZiAtLWdpdCBhL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L3NwaS9Bc3luY0Nvbm5lY3RvckNhbGxiYWNrLmphdmEgYi9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9zcGkvQXN5bmNDb25uZWN0b3JDYWxsYmFjay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZDVlOGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9zcGkvQXN5bmNDb25uZWN0b3JDYWxsYmFjay5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnNwaTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRSZXNwb25zZTsKKworLyoqCisgKiBBc3luY2hyb25vdXMgY29ubmVjdG9yIHJlc3BvbnNlIHByb2Nlc3NpbmcgY2FsbGJhY2sgY29udHJhY3QuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGludGVyZmFjZSBBc3luY0Nvbm5lY3RvckNhbGxiYWNrIHsKKworICAgIC8qKgorICAgICAqIEludm9rZWQgd2hlbiBhIHJlc3BvbnNlIGZvciB0aGUgYXN5bmNocm9ub3VzbHkgaW52b2tlZCByZXF1ZXN0IGlzIGF2YWlsYWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNwb25zZSBhc3luY2hyb25vdXNseSByZWNlaXZlZCBjbGllbnQgcmVzcG9uc2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzcG9uc2UoQ2xpZW50UmVzcG9uc2UgcmVzcG9uc2UpOworCisgICAgLyoqCisgICAgICogSW52b2tlZCBpbiBjYXNlIHRoZSBhc3luY2hyb25vdXMgcmVxdWVzdCBpbnZvY2F0aW9uIGZhaWxlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmYWlsdXJlIGNhdXNlIG9mIHRoZSBhc3luY2hyb25vdXMgcmVxdWVzdCBpbnZvY2F0aW9uIGZhaWx1cmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZmFpbHVyZShUaHJvd2FibGUgZmFpbHVyZSk7Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9zcGkvQ2FjaGluZ0Nvbm5lY3RvclByb3ZpZGVyLmphdmEgYi9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9zcGkvQ2FjaGluZ0Nvbm5lY3RvclByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMwZGU0YwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L3NwaS9DYWNoaW5nQ29ubmVjdG9yUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5zcGk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKKworLyoqCisgKiBDYWNoaW5nIGNvbm5lY3RvciBwcm92aWRlci4KKyAqCisgKiBUaGlzIHV0aWxpdHkgcHJvdmlkZXIgY2FuIGJlIHVzZWQgdG8gc2VydmUgYXMgYSBsYXppbHkgaW5pdGlhbGl6ZWQgcHJvdmlkZXIgb2YgdGhlIHNhbWUgY29ubmVjdG9yIGluc3RhbmNlLgorICogPHA+CisgKiBOb3RlIGhvd2V2ZXIgdGhhdCB0aGUgY29ubmVjdG9yIGluc3RhbmNlIHdpbGwgYmUgY29uZmlndXJlZCB1c2luZyB0aGUgcnVudGltZSBjb25maWd1cmF0aW9uIG9mIHRoZSBmaXJzdCBjbGllbnQgaW5zdGFuY2UgdGhhdAorICogaGFzIGludm9rZWQgdGhlIHtAbGluayAjZ2V0Q29ubmVjdG9yKGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQsIGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbil9IG1ldGhvZC4KKyAqIHtAbGluayBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50fSBhbmQge0BsaW5rIGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbn0gaW5zdGFuY2UgcGFzc2VkIHRvIHN1YnNlcXVlbnQKKyAqIHtAY29kZSBnZXRDb25uZWN0b3IoLi4uKX0gaW52b2NhdGlvbnMgd2lsbCBiZSBpZ25vcmVkLiBBcyBzdWNoLCB0aGlzIGNvbm5lY3RvciBwcm92aWRlciBzaG91bGQgbm90IGJlIHNoYXJlZCBhbW9uZyBjbGllbnQKKyAqIGluc3RhbmNlcyB0aGF0IGhhdmUgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQgY29ubmVjdG9yLXNwZWNpZmljIHNldHRpbmdzLgorICogPC9wPgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKiBAc2luY2UgMi4xMAorICovCitwdWJsaWMgY2xhc3MgQ2FjaGluZ0Nvbm5lY3RvclByb3ZpZGVyIGltcGxlbWVudHMgQ29ubmVjdG9yUHJvdmlkZXIgeworCisgICAgcHJpdmF0ZSBmaW5hbCBDb25uZWN0b3JQcm92aWRlciBkZWxlZ2F0ZTsKKyAgICBwcml2YXRlIENvbm5lY3RvciBjb25uZWN0b3I7CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSB0aGUgY2FjaGluZyBjb25uZWN0b3IgcHJvdmlkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVsZWdhdGUgZGVsZWdhdGUgY29ubmVjdG9yIHByb3ZpZGVyIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGluaXRpYWxpemUgYW5kIGNyZWF0ZSB0aGUgY29ubmVjdG9yIGluc3RhbmNlIHdoaWNoCisgICAgICogICAgICAgICAgICAgICAgIHdpbGwgYmUgc3Vic2VxdWVudGx5IGNhY2hlZCBhbmQgcmV1c2VkLgorICAgICAqLworICAgIHB1YmxpYyBDYWNoaW5nQ29ubmVjdG9yUHJvdmlkZXIoZmluYWwgQ29ubmVjdG9yUHJvdmlkZXIgZGVsZWdhdGUpIHsKKyAgICAgICAgdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgQ29ubmVjdG9yIGdldENvbm5lY3RvcihDbGllbnQgY2xpZW50LCBDb25maWd1cmF0aW9uIHJ1bnRpbWVDb25maWcpIHsKKyAgICAgICAgaWYgKGNvbm5lY3RvciA9PSBudWxsKSB7CisgICAgICAgICAgICBjb25uZWN0b3IgPSBkZWxlZ2F0ZS5nZXRDb25uZWN0b3IoY2xpZW50LCBydW50aW1lQ29uZmlnKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29ubmVjdG9yOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L3NwaS9Db25uZWN0b3IuamF2YSBiL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L3NwaS9Db25uZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Yzg5NTNiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvc3BpL0Nvbm5lY3Rvci5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnNwaTsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLkluZmxlY3RvcjsKKworLyoqCisgKiBDbGllbnQgdHJhbnNwb3J0IGNvbm5lY3RvciBleHRlbnNpb24gY29udHJhY3QuCisgKiA8cD4KKyAqIE5vdGUgdGhhdCB1bmxpa2UgbW9zdCBvZiB0aGUgb3RoZXIge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5Db250cmFjdCBKZXJzZXkgU1BJIGV4dGVuc2lvbiBjb250cmFjdHN9LAorICogSmVyc2V5IHtAY29kZSBDb25uZWN0b3J9IGlzIG5vdCBhIHR5cGljYWwgcnVudGltZSBleHRlbnNpb24gYW5kIGFzIHN1Y2ggY2Fubm90IGJlIGRpcmVjdGx5IHJlZ2lzdGVyZWQKKyAqIHVzaW5nIGEgY29uZmlndXJhdGlvbiB7QGNvZGUgcmVnaXN0ZXIoLi4uKX0gbWV0aG9kLiBKZXJzZXkgY2xpZW50IHJ1bnRpbWUgcmV0cmlldmVzIGEge0Bjb2RlIENvbm5lY3Rvcn0KKyAqIGluc3RhbmNlIHVwb24gSmVyc2V5IGNsaWVudCBydW50aW1lIGluaXRpYWxpemF0aW9uIHVzaW5nIGEge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5zcGkuQ29ubmVjdG9yUHJvdmlkZXJ9CisgKiByZWdpc3RlcmVkIGluIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnfS4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCisvLyBNdXN0IG5vdCBiZSBhbm5vdGF0ZWQgd2l0aCBAQ29udHJhY3QKK3B1YmxpYyBpbnRlcmZhY2UgQ29ubmVjdG9yIGV4dGVuZHMgSW5mbGVjdG9yPENsaWVudFJlcXVlc3QsIENsaWVudFJlc3BvbnNlPiB7CisgICAgLyoqCisgICAgICogU3luY2hyb25vdXNseSBwcm9jZXNzIGNsaWVudCByZXF1ZXN0IGludG8gYSByZXNwb25zZS4KKyAgICAgKgorICAgICAqIFRoZSBtZXRob2QgaXMgdXNlZCBieSBKZXJzZXkgY2xpZW50IHJ1bnRpbWUgdG8gc3luY2hyb25vdXNseSBzZW5kIGEgcmVxdWVzdAorICAgICAqIGFuZCByZWNlaXZlIGEgcmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBKZXJzZXkgY2xpZW50IHJlcXVlc3QgdG8gYmUgc2VudC4KKyAgICAgKiBAcmV0dXJuIEplcnNleSBjbGllbnQgcmVzcG9uc2UgcmVjZWl2ZWQgZm9yIHRoZSBjbGllbnQgcmVxdWVzdC4KKyAgICAgKiBAdGhyb3dzIGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb24gaW4gY2FzZSBvZiBhbnkgaW52b2NhdGlvbiBmYWlsdXJlLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIENsaWVudFJlc3BvbnNlIGFwcGx5KENsaWVudFJlcXVlc3QgcmVxdWVzdCk7CisKKyAgICAvKioKKyAgICAgKiBBc3luY2hyb25vdXNseSBwcm9jZXNzIGNsaWVudCByZXF1ZXN0IGludG8gYSByZXNwb25zZS4KKyAgICAgKgorICAgICAqIFRoZSBtZXRob2QgaXMgdXNlZCBieSBKZXJzZXkgY2xpZW50IHJ1bnRpbWUgdG8gYXN5bmNocm9ub3VzbHkgc2VuZCBhIHJlcXVlc3QKKyAgICAgKiBhbmQgcmVjZWl2ZSBhIHJlc3BvbnNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgIEplcnNleSBjbGllbnQgcmVxdWVzdCB0byBiZSBzZW50LgorICAgICAqIEBwYXJhbSBjYWxsYmFjayBKZXJzZXkgYXN5bmNocm9ub3VzIGNvbm5lY3RvciBjYWxsYmFjayB0byBhc3luY2hyb25vdXNseSByZWNlaXZlCisgICAgICogICAgICAgICAgICAgICAgIHRoZSByZXF1ZXN0IHByb2Nlc3NpbmcgcmVzdWx0IChlaXRoZXIgYSByZXNwb25zZSBvciBhIGZhaWx1cmUpLgorICAgICAqIEByZXR1cm4gYXN5bmNocm9ub3VzbHkgZXhlY3V0ZWQgdGFzayBoYW5kbGUuCisgICAgICovCisgICAgRnV0dXJlPD8+IGFwcGx5KENsaWVudFJlcXVlc3QgcmVxdWVzdCwgQXN5bmNDb25uZWN0b3JDYWxsYmFjayBjYWxsYmFjayk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgbmFtZSBvZiBjdXJyZW50IGNvbm5lY3Rvci4KKyAgICAgKgorICAgICAqIFNob3VsZCBjb250YWluIGlkZW50aWZpY2F0aW9uIG9mIHVuZGVybHlpbmcgc3BlY2lmaWNhdGlvbiBhbmQgb3B0aW9uYWxseSB2ZXJzaW9uIG51bWJlci4KKyAgICAgKiBXaWxsIGJlIHVzZWQgaW4gVXNlci1BZ2VudCBoZWFkZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIG5hbWUgb2YgY3VycmVudCBjb25uZWN0b3IuIFJldHVybmluZyB7QGNvZGUgbnVsbH0gb3IgZW1wdHkgc3RyaW5nIG1lYW5zIG5vdCBpbmNsdWRpbmcKKyAgICAgKiB0aGlzIGluZm9ybWF0aW9uIGluIGEgZ2VuZXJhdGVkIDx0dD57QHZhbHVlIGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnMjVVNFUl9BR0VOVH08L3R0PiBoZWFkZXIuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCk7CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSBjb25uZWN0b3IgYW5kIHJlbGVhc2UgYWxsIGl0J3MgaW50ZXJuYWxseSBhc3NvY2lhdGVkIHJlc291cmNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpOworfQpkaWZmIC0tZ2l0IGEvY29yZS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvc3BpL0Nvbm5lY3RvclByb3ZpZGVyLmphdmEgYi9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9zcGkvQ29ubmVjdG9yUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YThiODFhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvc3BpL0Nvbm5lY3RvclByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuc3BpOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CisKKy8qKgorICogSmVyc2V5IGNsaWVudCBjb25uZWN0b3IgcHJvdmlkZXIgY29udHJhY3QuCisgKgorICogQ29ubmVjdG9yIHByb3ZpZGVyIGlzIGludm9rZWQgYnkgSmVyc2V5IGNsaWVudCBydW50aW1lIHRvIHByb3ZpZGUgYSBjbGllbnQgY29ubmVjdG9yCisgKiB0byBiZSB1c2VkIHRvIHNlbmQgY2xpZW50IHJlcXVlc3RzIG92ZXIgdGhlIHdpcmUgdG8gc2VydmVyLXNpZGUgcmVzb3VyY2VzLgorICogVGhlcmUgY2FuIGJlIG9ubHkgb25lIGNvbm5lY3RvciBwcm92aWRlciByZWdpc3RlcmVkIGluIGEgc2luZ2xlIEplcnNleSBjbGllbnQgaW5zdGFuY2UuCisgKiA8cD4KKyAqIE5vdGUgdGhhdCB1bmxpa2UgbW9zdCBvZiB0aGUgb3RoZXIge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5Db250cmFjdCBKZXJzZXkgU1BJIGV4dGVuc2lvbiBjb250cmFjdHN9LAorICoge0Bjb2RlIENvbm5lY3RvclByb3ZpZGVyfSBpcyBub3QgYSB0eXBpY2FsIHJ1bnRpbWUgZXh0ZW5zaW9uIGFuZCBhcyBzdWNoIGNhbm5vdCBiZSByZWdpc3RlcmVkCisgKiB1c2luZyBhIGNvbmZpZ3VyYXRpb24ge0Bjb2RlIHJlZ2lzdGVyKC4uLil9IG1ldGhvZC4gSW5zdGVhZCwgaXQgbXVzdCBiZSByZWdpc3RlcmVkIHVzaW5nIHZpYQorICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5KZXJzZXlDbGllbnRCdWlsZGVyfSB1c2luZyBpdCdzCisgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZyNjb25uZWN0b3JQcm92aWRlcihDb25uZWN0b3JQcm92aWRlcil9CisgKiBpbml0aWFsaXplciBtZXRob2QuCisgKiA8L3A+CisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqIEBzaW5jZSAyLjUKKyAqLworLy8gTXVzdCBub3QgYmUgYW5ub3RhdGVkIHdpdGggQENvbnRyYWN0CitwdWJsaWMgaW50ZXJmYWNlIENvbm5lY3RvclByb3ZpZGVyIHsKKworICAgIC8qKgorICAgICAqIEdldCBhIEplcnNleSBjbGllbnQgY29ubmVjdG9yIGluc3RhbmNlIGZvciBhIGdpdmVuIHtAbGluayBDbGllbnQgY2xpZW50fSBpbnN0YW5jZQorICAgICAqIGFuZCBKZXJzZXkgY2xpZW50IHJ1bnRpbWUge0BsaW5rIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbn0uCisgICAgICogPHA+CisgICAgICogTm90ZSB0aGF0IHRoZSBzdXBwbGllZCBydW50aW1lIGNvbmZpZ3VyYXRpb24gY2FuIGJlIGRpZmZlcmVudCBmcm9tIHRoZSBjbGllbnQgaW5zdGFuY2UKKyAgICAgKiBjb25maWd1cmF0aW9uIGFzIGEgc2luZ2xlIGNsaWVudCBjYW4gYmUgdXNlZCB0byBzZXJ2ZSBtdWx0aXBsZSBkaWZmZXJlbnRseSBjb25maWd1cmVkIHJ1bnRpbWVzLgorICAgICAqIFdoaWxlIHRoZSB7QGxpbmsgQ2xpZW50I2dldFNzbENvbnRleHQoKSBTU0wgY29udGV4dH0gb3Ige0BsaW5rIENsaWVudCNnZXRIb3N0bmFtZVZlcmlmaWVyKCkgaG9zdG5hbWUgdmVyaWZpZXJ9CisgICAgICogYXJlIHNoYXJlZCwgb3RoZXIgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIG1heSBjaGFuZ2UgaW4gZWFjaCBydW50aW1lLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBCYXNlZCBvbiB0aGUgc3VwcGxpZWQgY2xpZW50IGFuZCBydW50aW1lIGNvbmZpZ3VyYXRpb24gZGF0YSwgaXQgaXMgdXAgdG8gZWFjaCBjb25uZWN0b3IgcHJvdmlkZXIKKyAgICAgKiBpbXBsZW1lbnRhdGlvbiB0byBkZWNpZGUgd2hldGhlciBhIG5ldyBkZWRpY2F0ZWQgY29ubmVjdG9yIGluc3RhbmNlIGlzIHJlcXVpcmVkIG9yIGlmIHRoZSBleGlzdGluZywKKyAgICAgKiBwcmV2aW91c2x5IGNyZWF0ZSBjb25uZWN0b3IgaW5zdGFuY2UgY2FuIGJlIHJldXNlZC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xpZW50ICAgICAgICBKZXJzZXkgY2xpZW50IGluc3RhbmNlLgorICAgICAqIEBwYXJhbSBydW50aW1lQ29uZmlnIEplcnNleSBjbGllbnQgcnVudGltZSBjb25maWd1cmF0aW9uLgorICAgICAqIEByZXR1cm4gY29uZmlndXJlZCB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnNwaS5Db25uZWN0b3J9IGluc3RhbmNlIHRvIGJlIHVzZWQgYnkgdGhlIGNsaWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29ubmVjdG9yIGdldENvbm5lY3RvcihDbGllbnQgY2xpZW50LCBDb25maWd1cmF0aW9uIHJ1bnRpbWVDb25maWcpOworfQpkaWZmIC0tZ2l0IGEvY29yZS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvc3BpL0RlZmF1bHRTc2xDb250ZXh0UHJvdmlkZXIuamF2YSBiL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L3NwaS9EZWZhdWx0U3NsQ29udGV4dFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRkZDViNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L3NwaS9EZWZhdWx0U3NsQ29udGV4dFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuc3BpOworCitpbXBvcnQgamF2YXgubmV0LnNzbC5TU0xDb250ZXh0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuU3NsQ29uZmlndXJhdG9yOworCisvKioKKyAqIERlZmF1bHQge0BsaW5rIFNTTENvbnRleHR9IHByb3ZpZGVyLgorICogPHA+CisgKiBDYW4gYmUgdXNlZCB0byBvdmVycmlkZSB7QGxpbmsgU3NsQ29uZmlndXJhdG9yI2dldERlZmF1bHRDb250ZXh0KCl9LgorICoKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKiBAc2luY2UgMi4yMS4xCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRGVmYXVsdFNzbENvbnRleHRQcm92aWRlciB7CisKKyAgICAvKioKKyAgICAgKiBHZXQgZGVmYXVsdCB7QGNvZGUgU1NMQ29udGV4dH0uCisgICAgICogPHA+CisgICAgICogUmV0dXJuZWQgaW5zdGFuY2UgaXMgZXhwZWN0ZWQgdG8gYmUgY29uZmlndXJlZCB0byBjb250YWluZXIgZGVmYXVsdCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGRlZmF1bHQgU1NMIGNvbnRleHQuCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gd2hlbiB0aGVyZSBpcyBhIHByb2JsZW0gd2l0aCBjcmVhdGluZyBvciBvYnRhaW5pbmcgZGVmYXVsdCBTU0wgY29udGV4dC4KKyAgICAgKi8KKyAgICBTU0xDb250ZXh0IGdldERlZmF1bHRTc2xDb250ZXh0KCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9zcGkvcGFja2FnZS1pbmZvLmphdmEgYi9jb3JlLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9zcGkvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUyZWQ5OQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L3NwaS9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvKioKKyAqIEplcnNleSBjbGllbnQgU1BJIGNsYXNzZXMvaW50ZXJmYWNlcy4KKyAqLworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuc3BpOwpkaWZmIC0tZ2l0IGEvY29yZS1jbGllbnQvc3JjL21haW4vcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9pbnRlcm5hbC9qZGtjb25uZWN0b3IvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMgYi9jb3JlLWNsaWVudC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L2ludGVybmFsL2pka2Nvbm5lY3Rvci9sb2NhbGl6YXRpb24ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGYwMzQyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jbGllbnQvc3JjL21haW4vcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9pbnRlcm5hbC9qZGtjb25uZWN0b3IvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMKQEAgLTAsMCArMSw3MyBAQAorIworIyBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisjIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyMKKyMgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorIyBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisjIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorIyB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisjCisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorIworCityZWFkLmxpc3RlbmVyLnNldC5vbmx5Lm9uY2U9IlJlYWQgbGlzdGVuZXIgY2FuIGJlIHNldCBvbmx5IG9uY2UuIgorYXN5bmMub3BlcmF0aW9uLm5vdC5zdXBwb3J0ZWQ9Ik9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkIGluIHN5bmNocm9ub3VzIG1vZGUuIgorc3luYy5vcGVyYXRpb24ubm90LnN1cHBvcnRlZD0iT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQgaW4gYXN5bmNocm9ub3VzIG1vZGUuIgord3JpdGUud2hlbi5ub3QucmVhZHk9IkFzeW5jaHJvbm91cyB3cml0ZSBjYWxsZWQgd2hlbiBzdHJlYW0gaXMgaW4gbm9uLXJlYWR5IHN0YXRlLiIKK3N0cmVhbS5jbG9zZWQuZm9yLmlucHV0PSJUaGlzIHN0cmVhbSBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZCBmb3IgaW5wdXQuIgord3JpdGUubGlzdGVuZXIuc2V0Lm9ubHkub25jZT0iV3JpdGUgbGlzdGVuZXIgY2FuIGJlIHNldCBvbmx5IG9uY2UuIgorc3RyZWFtLmNsb3NlZD0iVGhlIHN0cmVhbSBoYXMgYmVlbiBjbG9zZWQuIgord3JpdGluZy5mYWlsZWQ9IldyaXRpbmcgZGF0YSBmYWlsZWQiCitidWZmZXIuaW5jb3JyZWN0Lmxlbmd0aD0iQnVmZmVyIHBhc3NlZCBmb3IgZW5jb2RpbmcgaXMgbmVpdGhlciBhIG11bHRpcGxlIG9mIGNodW5rU2l6ZSBub3Igc21hbGxlciB0aGFuIGNodW5rU2l6ZS4iCitjb25uZWN0b3IuY29uZmlndXJhdGlvbj0iQ29ubmVjdG9yIGNvbmZpZ3VyYXRpb246IHswfS4iCituZWdhdGl2ZS5jaHVuay5zaXplPSJDb25maWd1cmVkIGNodW5rIHNpemUgaXMgbmVnYXRpdmU6IHswfSwgdXNpbmcgZGVmYXVsdCB2YWx1ZTogezF9LiIKK3RpbWVvdXQucmVjZWl2aW5nLnJlc3BvbnNlPSJUaW1lb3V0IHJlY2VpdmluZyByZXNwb25zZS4iCit0aW1lb3V0LnJlY2VpdmluZy5yZXNwb25zZS5ib2R5PSJUaW1lb3V0IHJlY2VpdmluZyByZXNwb25zZSBib2R5LiIKK2Nsb3NlZC53aGlsZS5zZW5kaW5nLnJlcXVlc3Q9IkNvbm5lY3Rpb24gY2xvc2VkIGJ5IHRoZSBzZXJ2ZXIgd2hpbGUgc2VuZGluZyByZXF1ZXN0Ii4KK2Nsb3NlZC53aGlsZS5yZWNlaXZpbmcucmVzcG9uc2U9IkNvbm5lY3Rpb24gY2xvc2VkIGJ5IHRoZSBzZXJ2ZXIgd2hpbGUgcmVjZWl2aW5nIHJlc3BvbnNlLiIKK2Nsb3NlZC53aGlsZS5yZWNlaXZpbmcuYm9keT0iQ29ubmVjdGlvbiBjbG9zZWQgYnkgdGhlIHNlcnZlciB3aGlsZSByZWNlaXZpbmcgcmVzcG9uc2UgYm9keS4iCitjb25uZWN0aW9uLmNsb3NlZD0iQ29ubmVjdGlvbiBjbG9zZWQgYnkgdGhlIHNlcnZlci4iCitjbG9zZWQuYnkuY2xpZW50LndoaWxlLnNlbmRpbmc9IkNvbm5lY3Rpb24gY2xvc2VkIGJ5IHRoZSBjbGllbnQgd2hpbGUgc2VuZGluZyByZXF1ZXN0LiIKK2Nsb3NlZC5ieS5jbGllbnQud2hpbGUucmVjZWl2aW5nPSJDb25uZWN0aW9uIGNsb3NlZCBieSB0aGUgY2xpZW50IHdoaWxlIHJlY2VpdmluZyByZXNwb25zZS4iCitjbG9zZWQuYnkuY2xpZW50LndoaWxlLnJlY2VpdmluZy5ib2R5PSJDb25uZWN0aW9uIGNsb3NlZCBieSB0aGUgY2xpZW50IHdoaWxlIHJlY2VpdmluZyByZXNwb25zZSBib2R5LiIKK2Nvbm5lY3Rpb24udGltZW91dD0iQ29ubmVjdGlvbiB0aW1lZCBvdXQuIgorY29ubmVjdGlvbi5jaGFuZ2luZy5zdGF0ZT0iSFRUUCBjb25uZWN0aW9uIHswfTp7MX0gY2hhbmdpbmcgc3RhdGUgezJ9IC0+IHszfS4iCit1bmV4cGVjdGVkLmRhdGEuaW4uYnVmZmVyPSJVbmV4cGVjdGVkIGRhdGEgcmVtYWluIGluIHRoZSBidWZmZXIgYWZ0ZXIgdGhlIEhUVFAgcmVzcG9uc2UgaGFzIGJlZW4gcGFyc2VkLiIKK2h0dHAuaW5pdGlhbC5saW5lLm92ZXJmbG93PSJIVFRQIHBhY2tldCBpbml0aWFsIGxpbmUgaXMgdG9vIGxhcmdlLiIKK2h0dHAucGFja2V0LmhlYWRlci5vdmVyZmxvdz0iSFRUUCBwYWNrZXQgaGVhZGVyIGlzIHRvbyBsYXJnZS4iCitodHRwLm5lZ2F0aXZlLmNvbnRlbnQubGVuZ3RoPSJDb250ZW50IGxlbmd0aCBjYW5ub3QgYmUgbGVzcyB0aGFuIDAuIgoraHR0cC5pbnZhbGlkLmNvbnRlbnQubGVuZ3RoPSJJbnZhbGlkIGZvcm1hdCBvZiBjb250ZW50IGxlbmd0aCBjb2RlLiIKK2h0dHAucmVxdWVzdC5uby5ib2R5PSJUaGlzIEhUVFAgcmVxdWVzdCBkb2VzIG5vdCBoYXZlIGEgYm9keS4iCitodHRwLnJlcXVlc3Qubm8uYnVmZmVyZWQuYm9keT0iQnVmZmVyZWQgYm9keSBpcyBhdmFpbGFibGUgb25seSBpbiBidWZmZXJlZCBib2R5IG1vZGUuIgoraHR0cC5yZXF1ZXN0LmJvZHkuc2l6ZS5ub3QuYXZhaWxhYmxlPSJCb2R5IHNpemUgaXMgbm90IGF2YWlsYWJsZSBpbiBjaHVua2VkIGJvZHkgbW9kZS4iCitwcm94eS51c2VyLm5hbWUubWlzc2luZz0iVXNlciBuYW1lIGlzIG1pc3NpbmciCitwcm94eS5wYXNzd29yZC5taXNzaW5nPSJQYXNzd29yZCBpcyBtaXNzaW5nIgorcHJveHkucW9wLm5vLnN1cHBvcnRlZD0iVGhlICdxb3AnIChxdWFsaXR5IG9mIHByb3RlY3Rpb24pID0gezB9IGV4dGVuc2lvbiByZXF1ZXN0ZWQgYnkgdGhlIHNlcnZlciBpcyBub3Qgc3VwcG9ydGVkLiBDYW5ub3QgYXV0aGVudGljYXRlIGFnYWluc3QgdGhlIHNlcnZlciB1c2luZyBIdHRwIERpZ2VzdCBBdXRoZW50aWNhdGlvbi4iCitwcm94eS40MDcudHdpY2U9IlJlY2VpdmVkIDQwNyBmb3IgdGhlIHNlY29uZCB0aW1lLiIKK3Byb3h5LmZhaWwuYXV0aC5oZWFkZXI9IkNyZWF0aW5nIGF1dGhvcml6YXRpb24gaGVhZGVyIGZhaWxlZC4iCitwcm94eS5jb25uZWN0LmZhaWw9IkNvbm5lY3RpbmcgdG8gcHJveHkgZmFpbGVkIHdpdGggc3RhdHVzIHswfS4iCitwcm94eS5taXNzaW5nLmF1dGguaGVhZGVyPSJQcm94eS1BdXRoZW50aWNhdGUgaGVhZGVyIHZhbHVlIGlzIG1pc3Npbmcgb3IgZW1wdHkuIgorcHJveHkudW5zdXBwb3J0ZWQuc2NoZW1lPSJVbnN1cHBvcnRlZCBzY2hlbWU6IHswfS4iCityZWRpcmVjdC5uby5sb2NhdGlvbj0iUmVjZWl2ZWQgcmVkaXJlY3QgdGhhdCBkb2VzIG5vdCBjb250YWluIGEgbG9jYXRpb24gb3IgdGhlIGxvY2F0aW9uIGlzIGVtcHR5LiIKK3JlZGlyZWN0LmVycm9yLmRldGVybWluaW5nLmxvY2F0aW9uPSJFcnJvciBkZXRlcm1pbmluZyByZWRpcmVjdCBsb2NhdGlvbi4iCityZWRpcmVjdC5pbmZpbml0ZS5sb29wPSJJbmZpbml0ZSBsb29wIGluIGNoYWluZWQgcmVkaXJlY3RzIGRldGVjdGVkLiIKK3JlZGlyZWN0LmxpbWl0LnJlYWNoZWQ9Ik1heCBjaGFpbmVkIHJlZGlyZWN0IGxpbWl0ICh7MH0pIGV4Y2VlZGVkLiIKK3NzbC5zZXNzaW9uLmNsb3NlZD0iU1NMIHNlc3Npb24gaGFzIGJlZW4gY2xvc2VkLiIKK2h0dHAuYm9keS5zaXplLm92ZXJmbG93PSJCb2R5IHNpemUgZXhjZWVkcyBkZWNsYXJlZCBzaXplIgoraHR0cC5pbnZhbGlkLmNodW5rLnNpemUuaGV4LnZhbHVlPSJJbnZhbGlkIGJ5dGUgcmVwcmVzZW50aW5nIGEgaGV4IHZhbHVlIHdpdGhpbiBhIGNodW5rIGxlbmd0aCBlbmNvdW50ZXJlZCA6IHswfSIKK2h0dHAudW5leHBlY3RlZC5jaHVuay5oZWFkZXI9IlVuZXhwZWN0ZWQgSFRUUCBjaHVuayBoZWFkZXIuIgoraHR0cC5jaHVuay5lbmNvZGluZy5wcmVmaXgub3ZlcmZsb3c9IlRoZSBjaHVua2VkIGVuY29kaW5nIGxlbmd0aCBwcmVmaXggaXMgdG9vIGxhcmdlLiIKK2h0dHAudHJhaWxlci5oZWFkZXIub3ZlcmZsb3c9IlRoZSBjaHVua2VkIGVuY29kaW5nIHRyYWlsZXIgaGVhZGVyIGlzIHRvbyBsYXJnZS4iCit0cmFuc3BvcnQuY29ubmVjdGlvbi5ub3QuY2xvc2VkPSJDb3VsZCBub3QgY2xvc2UgYSBjb25uZWN0aW9uLiIKK3RyYW5zcG9ydC5zZXQuY2xhc3MubG9hZGVyLmZhaWxlZD0iQ2Fubm90IHNldCB0aHJlYWQgY29udGV4dCBjbGFzcyBsb2FkZXIuIgordHJhbnNwb3J0LmV4ZWN1dG9yLmNsb3NlZD0iQ2Fubm90IHNldCB0aHJlYWQgY29udGV4dCBjbGFzcyBsb2FkZXIuIgordHJhbnNwb3J0LmV4ZWN1dG9yLnF1ZXVlLmxpbWl0LnJlYWNoZWQ9IkEgbGltaXQgb2YgY2xpZW50IHRocmVhZCBwb29sIHF1ZXVlIGhhcyBiZWVuIHJlYWNoZWQuIgordGhyZWFkLnBvb2wubWF4LnNpemUudG9vLnNtYWxsPSJNYXggdGhyZWFkIHBvb2wgc2l6ZSBjYW5ub3QgYmUgc21hbGxlciB0aGFuIDMuIgordGhyZWFkLnBvb2wuY29yZS5zaXplLnRvby5zbWFsbD0iQ29yZSB0aHJlYWQgcG9vbCBzaXplIGNhbm5vdCBiZSBzbWFsbGVyIHRoYW4gMC4iCitodHRwLmNvbm5lY3Rpb24uZXN0YWJsaXNoaW5nLmlsbGVnYWwuc3RhdGU9IkNhbm5vdCB0cnkgdG8gZXN0YWJsaXNoIGNvbm5lY3Rpb24gaWYgdGhlIGNvbm5lY3Rpb24gaXMgaW4gb3RoZXIgdGhhbiBDUkVBVEVEIHN0YXRlXAorICAuIEN1cnJlbnQgc3RhdGU6IHswfS4KK2h0dHAuY29ubmVjdGlvbi5ub3QuaWRsZT0iSHR0cCByZXF1ZXN0IGNhbm5vdCBiZSBzZW50IG92ZXIgYSBjb25uZWN0aW9uIHRoYXQgaXMgaW4gb3RoZXIgc3RhdGUgdGhhbiBJRExFLiBDdXJyZW50IHN0YXRlOiB7MH0iIApkaWZmIC0tZ2l0IGEvY29yZS1jbGllbnQvc3JjL21haW4vcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9pbnRlcm5hbC9sb2NhbGl6YXRpb24ucHJvcGVydGllcyBiL2NvcmUtY2xpZW50L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvaW50ZXJuYWwvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIxMzRmNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY2xpZW50L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvaW50ZXJuYWwvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMKQEAgLTAsMCArMSw3NSBAQAorIworIyBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisjIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyMKKyMgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorIyBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisjIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorIyB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisjCisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorIworCisjYnJpZWYubWVzc2FnZS5pZGVudGlmaWVyPU1lc3NhZ2UgdGV4dCwgcG9zc2libHkgd2l0aCBzb21lIGF0dHJpYnV0ZXMgInswfSIgZXRjLgorYXV0aGVudGljYXRpb24uY3JlZGVudGlhbHMubWlzc2luZy5iYXNpYz1DcmVkZW50aWFscyBtdXN0IGJlIGRlZmluZWQgZm9yIGJhc2ljIGF1dGhlbnRpY2F0aW9uLiBEZWZpbmUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGVpdGhlciB3aGVuIGNyZWF0aW5nIEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUgb3IgdXNlIHNwZWNpZmljIGNyZWRlbnRpYWxzIGZvciBlYWNoIHJlcXVlc3QgdXNpbmcgdGhlIHJlcXVlc3QgcHJvcGVydHkgKHNlZSBIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlKS4KK2F1dGhlbnRpY2F0aW9uLmNyZWRlbnRpYWxzLm1pc3NpbmcuZGlnZXN0PUNyZWRlbnRpYWxzIG11c3QgYmUgZGVmaW5lZCBmb3IgZGlnZXN0IGF1dGhlbnRpY2F0aW9uLiBEZWZpbmUgdXNlcm5hbWUgYW5kIHBhc3N3b3JkIGVpdGhlciB3aGVuIGNyZWF0aW5nIEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUgb3IgdXNlIHNwZWNpZmljIGNyZWRlbnRpYWxzIGZvciBlYWNoIHJlcXVlc3QgdXNpbmcgdGhlIHJlcXVlc3QgcHJvcGVydHkgKHNlZSBIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlKS4KK2F1dGhlbnRpY2F0aW9uLmNyZWRlbnRpYWxzLnJlcXVlc3QucGFzc3dvcmQudW5zdXBwb3J0ZWQ9VW5zdXBwb3J0ZWQgcGFzc3dvcmQgdHlwZSBjbGFzcy4gUGFzc3dvcmQgcGFzc2VkIGluIHRoZSByZXF1ZXN0IHByb3BlcnR5IG11c3QgYmUgU3RyaW5nIG9yIGJ5dGVbXS4KK2NodW5rZWQuaW5wdXQuY2xvc2VkPUNodW5rZWQgaW5wdXQgaGFzIGJlZW4gY2xvc2VkIGFscmVhZHkuCitjaHVua2VkLmlucHV0Lm1lZGlhLnR5cGUubnVsbD1TcGVjaWZpZWQgY2h1bmsgbWVkaWEgdHlwZSBtdXN0IG5vdCBiZSBudWxsLgorY2h1bmtlZC5pbnB1dC5zdHJlYW0uY2xvc2luZy5lcnJvcj1FcnJvciBjbG9zaW5nIGNodW5rZWQgaW5wdXQncyB1bmRlcmx5aW5nIHJlc3BvbnNlIGlucHV0IHN0cmVhbS4KK2NsaWVudC5pbnN0YW5jZS5jbG9zZWQ9Q2xpZW50IGluc3RhbmNlIGhhcyBiZWVuIGNsb3NlZC4KK2NsaWVudC5pbnZvY2F0aW9uLmxpbmsubnVsbD1MaW5rIG9mIHRoZSBuZXdseSBjcmVhdGVkIGludm9jYXRpb24gbXVzdCBub3QgYmUgbnVsbC4KK2NsaWVudC5yZXNwb25zZS5yZXNvbHZlZC51cmkubnVsbD1DbGllbnQgcmVzcG9uc2UgcmVzb2x2ZWQgVVJJIG11c3Qgbm90IGJlIG51bGwuCitjbGllbnQucmVzcG9uc2UucmVzb2x2ZWQudXJpLm5vdC5hYnNvbHV0ZT1DbGllbnQgcmVzcG9uc2UgcmVzb2x2ZWQgVVJJIG11c3QgYmUgYWJzb2x1dGUuCitjbGllbnQucmVzcG9uc2Uuc3RhdHVzLm51bGw9Q2xpZW50IHJlc3BvbnNlIHN0YXR1cyBtdXN0IG5vdCBiZSBudWxsLgorY2xpZW50LnJ4LnByb3ZpZGVyLm51bGw9UnhJbnZva2VyUHJvdmlkZXIgcmV0dXJuZWQgbnVsbC4KK2NsaWVudC5yeC5wcm92aWRlci5ub3QucmVnaXN0ZXJlZD1SeEludm9rZXJQcm92aWRlciBmb3IgdHlwZSB7MH0gaXMgbm90IHJlZ2lzdGVyZWQuCitjbGllbnQudGFyZ2V0LmxpbmsubnVsbD1MaW5rIHRvIHRoZSBuZXdseSBjcmVhdGVkIHRhcmdldCBtdXN0IG5vdCBiZSBudWxsLgorY2xpZW50LnVyaS50ZW1wbGF0ZS5udWxsPVVSSSB0ZW1wbGF0ZSBvZiB0aGUgbmV3bHkgY3JlYXRlZCB0YXJnZXQgbXVzdCBub3QgYmUgbnVsbC4KK2NsaWVudC51cmkubnVsbD1VUkkgb2YgdGhlIG5ld2x5IGNyZWF0ZWQgdGFyZ2V0IG11c3Qgbm90IGJlIG51bGwuCitjbGllbnQudXJpLmJ1aWxkZXIubnVsbD1VUkkgYnVpbGRlciBvZiB0aGUgbmV3bHkgY3JlYXRlZCB0YXJnZXQgbXVzdCBub3QgYmUgbnVsbC4KK2RpZ2VzdC5maWx0ZXIucW9wLnVuc3VwcG9ydGVkPVRoZSAncW9wJyAocXVhbGl0eSBvZiBwcm90ZWN0aW9uKSA9IHswfSBleHRlbnNpb24gcmVxdWVzdGVkIGJ5IHRoZSBzZXJ2ZXIgaXMgbm90IHN1cHBvcnRlZCBieSBKZXJzZXkgSHR0cERpZ2VzdEF1dGhGaWx0ZXIuIENhbm5vdCBhdXRoZW50aWNhdGUgYWdhaW5zdCB0aGUgc2VydmVyIHVzaW5nIEh0dHAgRGlnZXN0IEF1dGhlbnRpY2F0aW9uLgorZXJyb3IuY2xvc2luZy5vdXRwdXQuc3RyZWFtPUVycm9yIHdoZW4gY2xvc2luZyB0aGUgb3V0cHV0IHN0cmVhbS4KK2Vycm9yLmNvbW1pdHRpbmcub3V0cHV0LnN0cmVhbT1FcnJvciB3aGlsZSBjb21taXR0aW5nIHRoZSByZXF1ZXN0IG91dHB1dCBzdHJlYW0uCitlcnJvci5kaWdlc3QuZmlsdGVyLmdlbmVyYXRvcj1FcnJvciBkdXJpbmcgaW5pdGlhbGl6YXRpb24gb2YgcmFuZG9tIGdlbmVyYXRvciBvZiBEaWdlc3QgYXV0aGVudGljYXRpb24uCitlcnJvci5odHRwLm1ldGhvZC5lbnRpdHkubm90Lm51bGw9RW50aXR5IG11c3QgYmUgbnVsbCBmb3IgaHR0cCBtZXRob2QgezB9LgorZXJyb3IuaHR0cC5tZXRob2QuZW50aXR5Lm51bGw9RW50aXR5IG11c3Qgbm90IGJlIG51bGwgZm9yIGh0dHAgbWV0aG9kIHswfS4KK2Vycm9yLnNlcnZpY2UubG9jYXRvci5wcm92aWRlci5pbnN0YW5jZS5yZXF1ZXN0PUluY29ycmVjdCB0eXBlIG9mIHJlcXVlc3QgaW5zdGFuY2UgezB9LiBQYXJhbWV0ZXIgbXVzdCBiZSBhIGRlZmF1bHQgSmVyc2V5IENsaWVudFJlcXVlc3RDb250ZXh0IGltcGxlbWVudGF0aW9uLgorZXJyb3Iuc2VydmljZS5sb2NhdG9yLnByb3ZpZGVyLmluc3RhbmNlLnJlc3BvbnNlPUluY29ycmVjdCB0eXBlIG9mIHJlc3BvbnNlIGluc3RhbmNlIHswfS4gUGFyYW1ldGVyIG11c3QgYmUgYSBkZWZhdWx0IEplcnNleSBDbGllbnRSZXNwb25zZUNvbnRleHQgaW1wbGVtZW50YXRpb24uCitpZ25vcmVkLmFzeW5jLnRocmVhZHBvb2wuc2l6ZT1aZXJvIG9yIG5lZ2F0aXZlIGFzeW5jaHJvbm91cyB0aHJlYWQgcG9vbCBzaXplIHNwZWNpZmllZCBpbiB0aGUgY2xpZW50IGNvbmZpZ3VyYXRpb24gcHJvcGVydHk6IFt7MH1dIFwKKyAgVXNpbmcgZGVmYXVsdCBjYWNoZWQgdGhyZWFkIHBvb2wuCituZWdhdGl2ZS5jaHVuay5zaXplPU5lZ2F0aXZlIGNodW5rZWQgSFRUUCB0cmFuc2ZlciBjb2RpbmcgY2h1bmsgc2l6ZSB2YWx1ZSBzcGVjaWZpZWQgaW4gdGhlIGNsaWVudCBjb25maWd1cmF0aW9uIHByb3BlcnR5OiBbezB9XSBcCisgIFJldmVydGluZyB0byBwcm9ncmFtbWF0aWNhbGx5IHNldCBkZWZhdWx0OiBbezF9XQorbmVnYXRpdmUuaW5wdXQucGFyYW1ldGVyPSJJbnB1dCBwYXJhbWV0ZXIgezB9IG11c3Qgbm90IGJlIG5lZ2F0aXZlLiIKK251bGwuY29ubmVjdG9yLnByb3ZpZGVyPUNvbm5lY3RvclByb3ZpZGVyIG11c3Qgbm90IGJlIHNldCB0byBudWxsLgorbnVsbC5leGVjdXRvci5zZXJ2aWNlPUV4ZWN1dG9yU2VydmljZSBtdXN0IG5vdCBiZSBzZXQgdG8gbnVsbC4KK251bGwuaW5wdXQucGFyYW1ldGVyPUlucHV0IG1ldGhvZCBwYXJhbWV0ZXIgezB9IG11c3Qgbm90IGJlIG51bGwuCitudWxsLnNjaGVkdWxlZC5leGVjdXRvci5zZXJ2aWNlPVNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSBtdXN0IG5vdCBiZSBzZXQgdG8gbnVsbC4KK251bGwuc3NsLmNvbnRleHQ9Q3VzdG9tIGNsaWVudCBTU0wgY29udGV4dCwgaWYgc2V0LCBtdXN0IG5vdCBiZSBudWxsLgorbnVsbC5rZXlzdG9yZT1DdXN0b20ga2V5IHN0b3JlLCBpZiBzZXQsIG11c3Qgbm90IGJlIG51bGwuCitudWxsLmtleXN0b3JlLnBhc3dvcmQ9Q3VzdG9tIGtleSBzdG9yZSBwYXNzd29yZCBtdXN0IG5vdCBiZSBudWxsLgorbnVsbC50cnVzdHN0b3JlPUN1c3RvbSB0cnVzdCBzdG9yZSwgaWYgc2V0LCBtdXN0IG5vdCBiZSBudWxsLgoraHR0cHVybGNvbm5lY3Rpb24ucmVwbGFjZXMuZ2V0LndpdGguZW50aXR5PURldGVjdGVkIG5vbi1lbXB0eSBlbnRpdHkgb24gYSBIVFRQIEdFVCByZXF1ZXN0LiBUaGUgdW5kZXJseWluZyBIVFRQIFwKKyAgdHJhbnNwb3J0IGNvbm5lY3RvciBtYXkgZGVjaWRlIHRvIGNoYW5nZSB0aGUgcmVxdWVzdCBtZXRob2QgdG8gUE9TVC4KK3JlcXVlc3QuZW50aXR5LndyaXRlci5udWxsPVRoZSBlbnRpdHkgb2YgdGhlIGNsaWVudCByZXF1ZXN0IGlzIG51bGwuCityZXNwb25zZS50by5leGNlcHRpb24uY29udmVyc2lvbi5mYWlsZWQ9RmFpbGVkIHRvIGNvbnZlcnQgYSByZXNwb25zZSBpbnRvIGFuIGV4Y2VwdGlvbi4KK3Jlc3BvbnNlLnR5cGUuaXMubnVsbD1SZXF1ZXN0ZWQgcmVzcG9uc2UgdHlwZSBpcyBudWxsLgorcmVzdHJpY3RlZC5oZWFkZXIucG9zc2libHkuaWdub3JlZD1BdHRlbXB0IHRvIHNlbmQgcmVzdHJpY3RlZCBoZWFkZXIocykgd2hpbGUgdGhlIFt7MH1dIHN5c3RlbSBwcm9wZXJ0eSBub3Qgc2V0LiBIZWFkZXIocykgd2lsbCBcCisgICBwb3NzaWJseSBiZSBpZ25vcmVkLgorcmVzdHJpY3RlZC5oZWFkZXIucHJvcGVydHkuc2V0dGluZy5mYWxzZT1SZXN0cmljdGVkIGhlYWRlcnMgYXJlIG5vdCBlbmFibGVkIHVzaW5nIFt7MH1dIHN5c3RlbSBwcm9wZXJ0eSAoc2V0dGluZyBvbmx5IHRha2VzIFwKKyAgZWZmZWN0IG9uIGNvbm5lY3Rpb25zIGNyZWF0ZWQgYWZ0ZXIgdGhlIHByb3BlcnR5IGhhcyBiZWVuIHNldC9jaGFuZ2VkKS4KK3Jlc3RyaWN0ZWQuaGVhZGVyLnByb3BlcnR5LnNldHRpbmcudHJ1ZT1SZXN0cmljdGVkIGhlYWRlcnMgYXJlIGVuYWJsZWQgdXNpbmcgW3swfV0gc3lzdGVtIHByb3BlcnR5KHNldHRpbmcgb25seSB0YWtlcyBlZmZlY3Qgb25cCisgICBjb25uZWN0aW9ucyBjcmVhdGVkIGFmdGVyIHRoZSBwcm9wZXJ0eSBoYXMgYmVlbiBzZXQvY2hhbmdlZCkuCityZXF1ZXN0LmVudGl0eS5hbHJlYWR5LndyaXR0ZW49VGhlIGVudGl0eSB3YXMgYWxyZWFkeSB3cml0dGVuIGluIHRoaXMgcmVxdWVzdC4gVGhlIGVudGl0eSBjYW4gYmUgd3JpdHRlbiAoc2VyaWFsaXplZCBpbnRvIHRoZSBvdXRwdXQgc3RyZWFtKSBvbmx5IG9uY2UgcGVyIGEgcmVxdWVzdC4KK3VuZXhwZWN0ZWQuZXJyb3IucmVzcG9uc2UucHJvY2Vzc2luZz1VbmV4cGVjdGVkIGVycm9yIGR1cmluZyByZXNwb25zZSBwcm9jZXNzaW5nLgordXNlLmVuY29kaW5nLmlnbm9yZWQ9VmFsdWUgezF9IG9mIHswfSBjbGllbnQgcHJvcGVydHkgd2lsbCBiZSBpZ25vcmVkIGFzIGl0IGlzIG5vdCBhIHZhbGlkIHN1cHBvcnRlZCBlbmNvZGluZy4gXAorICBWYWxpZCBzdXBwb3J0ZWQgZW5jb2RpbmdzIGFyZTogezJ9Cit1c2luZy5maXhlZC5hc3luYy50aHJlYWRwb29sPVVzaW5nIGZpeGVkLXNpemUgdGhyZWFkIHBvb2wgb2Ygc2l6ZSBbezB9XSBmb3IgYXN5bmNocm9ub3VzIGNsaWVudCBpbnZvY2F0aW9ucy4KK2Vycm9yLnJlcXVlc3QuY2FuY2VsbGVkPVJlcXVlc3QgY2FuY2VsbGVkIGJ5IHRoZSBjbGllbnQgY2FsbC4KK2Vycm9yLmxpc3RlbmVyLmluaXQ9Q2xpZW50TGlmZWN5Y2xlTGlzdGVuZXIgezB9IGZhaWxlZCB0byBpbml0aWFsaXplIHByb3Blcmx5LgorZXJyb3IubGlzdGVuZXIuY2xvc2U9Q2xpZW50TGlmZWN5Y2xlTGlzdGVuZXIgezB9IGZhaWxlZCB0byBjbG9zZSBwcm9wZXJseS4KK2Vycm9yLnNodXRkb3duaG9vay5jbG9zZT1DbGllbnQgc2h1dGRvd24gaG9vayB7MH0gZmFpbGVkLgpkaWZmIC0tZ2l0IGEvY29yZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvQXV0b0Rpc2NvdmVyYWJsZUNsaWVudFRlc3QuamF2YSBiL2NvcmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0F1dG9EaXNjb3ZlcmFibGVDbGllbnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgxMzgwYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0F1dG9EaXNjb3ZlcmFibGVDbGllbnRUZXN0LmphdmEKQEAgLTAsMCArMSwyMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN0cmFpbmVkVG87CitpbXBvcnQgamF2YXgud3MucnMuUnVudGltZVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50Lkludm9jYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJpb3JpdHk7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5Db21tb25Qcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnNwaS5BdXRvRGlzY292ZXJhYmxlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUHJvcGVydGllc0hlbHBlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogTm90ZTogQXV0by1kaXNjb3ZlcmFibGVzIGZyb20gdGhpcyB0ZXN0ICJhZmZlY3RzIiBhbGwgb3RoZXIgdGVzdHMgaW4gc3VpdC4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEF1dG9EaXNjb3ZlcmFibGVDbGllbnRUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWSA9ICJBdXRvRGlzY292ZXJhYmxlVGVzdCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGllbnRSZXF1ZXN0RmlsdGVyIGNvbXBvbmVudCA9IG5ldyBDbGllbnRSZXF1ZXN0RmlsdGVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKGZpbmFsIENsaWVudFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuYWJvcnRXaXRoKFJlc3BvbnNlLnN0YXR1cyg0MDApLmVudGl0eSgiQ29tbW9uQXV0b0Rpc2NvdmVyYWJsZSIpLmJ1aWxkKCkpOworICAgICAgICB9CisgICAgfTsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29tbW9uQXV0b0Rpc2NvdmVyYWJsZSBpbXBsZW1lbnRzIEF1dG9EaXNjb3ZlcmFibGUgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoZmluYWwgRmVhdHVyZUNvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgLy8gUmV0dXJuIGlmIFBST1BFUlRZIGlzIG5vdCB0cnVlIC0gYXBwbGljYWJsZSBmb3Igb3RoZXIgdGVzdHMuCisgICAgICAgICAgICBpZiAoIVByb3BlcnRpZXNIZWxwZXIuaXNQcm9wZXJ0eShjb250ZXh0LmdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0eShQUk9QRVJUWSkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKGNvbXBvbmVudCwgMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJpb3JpdHkoMTApCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBYm9ydEZpbHRlciBpbXBsZW1lbnRzIENsaWVudFJlcXVlc3RGaWx0ZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoZmluYWwgQ2xpZW50UmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5hYm9ydFdpdGgoUmVzcG9uc2Uuc3RhdHVzKDQwMCkuZW50aXR5KCJBYm9ydEZpbHRlciIpLmJ1aWxkKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGb29MaWZlY3ljbGVMaXN0ZW5lciBpbXBsZW1lbnRzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIsIENsaWVudExpZmVjeWNsZUxpc3RlbmVyIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBDTE9TRUQgPSBmYWxzZTsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBJTklUSUFMSVpFRCA9IGZhbHNlOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkluaXQoKSB7CisgICAgICAgICAgICBJTklUSUFMSVpFRCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25DbG9zZSgpIHsKKyAgICAgICAgICAgIENMT1NFRCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKGZpbmFsIENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgLy8gZG8gbm90aGluZworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ2xvc2VkKCkgeworICAgICAgICAgICAgcmV0dXJuIENMT1NFRDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkgeworICAgICAgICAgICAgcmV0dXJuIElOSVRJQUxJWkVEOworICAgICAgICB9CisgICAgfQorCisgICAgQENvbnN0cmFpbmVkVG8oUnVudGltZVR5cGUuQ0xJRU5UKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTGlmZWN5Y2xlTGlzdGVuZXJBdXRvRGlzY292ZXJhYmxlIGltcGxlbWVudHMgQXV0b0Rpc2NvdmVyYWJsZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoZmluYWwgRmVhdHVyZUNvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgLy8gUmV0dXJuIGlmIFBST1BFUlRZIGlzIG5vdCB0cnVlIC0gYXBwbGljYWJsZSBmb3Igb3RoZXIgdGVzdHMuCisgICAgICAgICAgICBpZiAoIVByb3BlcnRpZXNIZWxwZXIuaXNQcm9wZXJ0eShjb250ZXh0LmdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0eShQUk9QRVJUWSkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihuZXcgRm9vTGlmZWN5Y2xlTGlzdGVuZXIoKSwgMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvRGlzY292ZXJhYmxlR2xvYmFsRGVmYXVsdFNlcnZlckRlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoIkNvbW1vbkF1dG9EaXNjb3ZlcmFibGUiLCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvRGlzY292ZXJhYmxlR2xvYmFsRGVmYXVsdFNlcnZlckVuYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoIkNvbW1vbkF1dG9EaXNjb3ZlcmFibGUiLCBudWxsLCBmYWxzZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0b0Rpc2NvdmVyYWJsZUdsb2JhbERlZmF1bHRTZXJ2ZXJEaXNhYmxlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgiQWJvcnRGaWx0ZXIiLCBudWxsLCB0cnVlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvRGlzY292ZXJhYmxlR2xvYmFsRGlzYWJsZWRTZXJ2ZXJEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJBYm9ydEZpbHRlciIsIHRydWUsIG51bGwpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEF1dG9EaXNjb3ZlcmFibGVHbG9iYWxEaXNhYmxlZFNlcnZlckVuYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoIkNvbW1vbkF1dG9EaXNjb3ZlcmFibGUiLCB0cnVlLCBmYWxzZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0b0Rpc2NvdmVyYWJsZUdsb2JhbERpc2FibGVkU2VydmVyRGlzYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoIkFib3J0RmlsdGVyIiwgdHJ1ZSwgdHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0b0Rpc2NvdmVyYWJsZUdsb2JhbEVuYWJsZWRTZXJ2ZXJEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJDb21tb25BdXRvRGlzY292ZXJhYmxlIiwgZmFsc2UsIG51bGwpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEF1dG9EaXNjb3ZlcmFibGVHbG9iYWxFbmFibGVkU2VydmVyRW5hYmxlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgiQ29tbW9uQXV0b0Rpc2NvdmVyYWJsZSIsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0b0Rpc2NvdmVyYWJsZUdsb2JhbEVuYWJsZWRTZXJ2ZXJEaXNhYmxlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgiQWJvcnRGaWx0ZXIiLCBmYWxzZSwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMsIHRoYXQge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRMaWZlY3ljbGVMaXN0ZW5lcn0gcmVnaXN0ZXJlZCB2aWEKKyAgICAgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuc3BpLkF1dG9EaXNjb3ZlcmFibGV9CisgICAgICoge0BsaW5rIGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZX0gd2lsbCBiZSBub3RpZmllZCB3aGVuIHtAbGluayBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50I2Nsb3NlKCl9IGlzIGludm9rZWQuCisgICAgICovCisgICAgQFRlc3QKKyAgICBASWdub3JlKCJpbnRlcm1pdHRlbnQgZmFpbHVyZXMuIikKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0b0Rpc2NvdmVyYWJsZUNsb3NpbmcoKSB7CisgICAgICAgIGZpbmFsIENsaWVudENvbmZpZyBjb25maWcgPSBuZXcgQ2xpZW50Q29uZmlnKCk7CisgICAgICAgIGNvbmZpZy5wcm9wZXJ0eShQUk9QRVJUWSwgdHJ1ZSk7CisgICAgICAgIGZpbmFsIEplcnNleUNsaWVudCBjbGllbnQgPSAoSmVyc2V5Q2xpZW50KSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudChjb25maWcpOworCisgICAgICAgIGFzc2VydEZhbHNlKEZvb0xpZmVjeWNsZUxpc3RlbmVyLmlzQ2xvc2VkKCkpOworCisgICAgICAgIGNsaWVudC5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UnVudGltZSgpOyAvLyBmb3JjZSBydW50aW1lIGluaXQKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRm9vTGlmZWN5Y2xlTGlzdGVuZXIgd2FzIGV4cGVjdGVkIHRvIGJlIGFscmVhZHkgaW5pdGlhbGl6ZWQuIiwgRm9vTGlmZWN5Y2xlTGlzdGVuZXIuaXNJbml0aWFsaXplZCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIkZvb0xpZmVjeWNsZUxpc3RlbmVyIHdhcyBub3QgZXhwZWN0ZWQgdG8gYmUgY2xvc2VkIHlldC4iLCBGb29MaWZlY3ljbGVMaXN0ZW5lci5pc0Nsb3NlZCgpKTsKKworICAgICAgICBjbGllbnQuY2xvc2UoKTsKKworICAgICAgICBhc3NlcnRUcnVlKCJGb29MaWZlY3ljbGVMaXN0ZW5lciBzaG91bGQgaGF2ZSBiZWVuIGNsb3NlZC4iLCBGb29MaWZlY3ljbGVMaXN0ZW5lci5pc0Nsb3NlZCgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3QoZmluYWwgU3RyaW5nIHJlc3BvbnNlLCBmaW5hbCBCb29sZWFuIGdsb2JhbERpc2FibGUsIGZpbmFsIEJvb2xlYW4gY2xpZW50RGlzYWJsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENsaWVudENvbmZpZyBjb25maWcgPSBuZXcgQ2xpZW50Q29uZmlnKCk7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihBYm9ydEZpbHRlci5jbGFzcyk7CisgICAgICAgIGNvbmZpZy5wcm9wZXJ0eShQUk9QRVJUWSwgdHJ1ZSk7CisKKyAgICAgICAgaWYgKGdsb2JhbERpc2FibGUgIT0gbnVsbCkgeworICAgICAgICAgICAgY29uZmlnLnByb3BlcnR5KENvbW1vblByb3BlcnRpZXMuRkVBVFVSRV9BVVRPX0RJU0NPVkVSWV9ESVNBQkxFLCBnbG9iYWxEaXNhYmxlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2xpZW50RGlzYWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICBjb25maWcucHJvcGVydHkoQ2xpZW50UHJvcGVydGllcy5GRUFUVVJFX0FVVE9fRElTQ09WRVJZX0RJU0FCTEUsIGNsaWVudERpc2FibGUpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KGNvbmZpZyk7CisgICAgICAgIGZpbmFsIEludm9jYXRpb24uQnVpbGRlciByZXF1ZXN0ID0gY2xpZW50LnRhcmdldCgiIikucmVxdWVzdCgpOworCisgICAgICAgIGFzc2VydEVxdWFscyhyZXNwb25zZSwgcmVxdWVzdC5nZXQoKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0NsaWVudENvbmZpZ1Rlc3QuamF2YSBiL2NvcmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0NsaWVudENvbmZpZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NThjZjY5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvQ2xpZW50Q29uZmlnVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjI4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuQ29udGV4dFJlc29sdmVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMQ29udGV4dDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5VbnNhZmVWYWx1ZTsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RTYW1lOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCisvKioKKyAqIHtAbGluayBDbGllbnRDb25maWd9IHVuaXQgdGVzdC4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQ2xpZW50Q29uZmlnVGVzdCB7CisKKyAgICBwdWJsaWMgQ2xpZW50Q29uZmlnVGVzdCgpIHsKKyAgICB9CisKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXBDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworICAgIH0KKworICAgIEBBZnRlckNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHRlYXJEb3duQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICB9CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgfQorCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U25hcHNob3QoKSB7CisgICAgICAgIENsaWVudENvbmZpZyBjX2EgPSBuZXcgQ2xpZW50Q29uZmlnKCkucHJvcGVydHkoImNvbW1vbl9uYW1lIiwgImNvbW1vbl92YWx1ZSIpOworCisgICAgICAgIENsaWVudENvbmZpZyBjX2IgPSBjX2Euc25hcHNob3QoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjX2IpOworICAgICAgICBhc3NlcnROb3RTYW1lKGNfYSwgY19iKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNfYSwgY19iKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb21tb25fdmFsdWUiLCBjX2EuZ2V0UHJvcGVydHkoImNvbW1vbl9uYW1lIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbW1vbl92YWx1ZSIsIGNfYi5nZXRQcm9wZXJ0eSgiY29tbW9uX25hbWUiKSk7CisKKyAgICAgICAgY19iLnByb3BlcnR5KCJuYW1lIiwgInZhbHVlIik7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UoY19hLmVxdWFscyhjX2IpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZSIsIGNfYi5nZXRQcm9wZXJ0eSgibmFtZSIpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChjX2EuZ2V0UHJvcGVydHkoIm5hbWUiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UHJvcGVydGllcygpIHsKKyAgICAgICAgQ2xpZW50Q29uZmlnIGluc3RhbmNlID0gbmV3IENsaWVudENvbmZpZygpOworICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3VsdCA9IGluc3RhbmNlLmdldFByb3BlcnRpZXMoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXN1bHQpOworCisgICAgICAgIGluc3RhbmNlLnByb3BlcnR5KCJuYW1lIiwgInZhbHVlIik7CisgICAgICAgIGFzc2VydEVxdWFscygidmFsdWUiLCByZXN1bHQuZ2V0KCJuYW1lIikpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXN1bHQucmVtb3ZlKCJuYW1lIik7CisgICAgICAgICAgICBmYWlsKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleHBlY3RlZCIpOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gb2sKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFByb3BlcnR5KCkgeworICAgICAgICBDbGllbnRDb25maWcgaW5zdGFuY2UgPSBuZXcgQ2xpZW50Q29uZmlnKCkucHJvcGVydHkoIm5hbWUiLCAidmFsdWUiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZSIsIGluc3RhbmNlLmdldFByb3BlcnR5KCJuYW1lIikpOworICAgICAgICBhc3NlcnROdWxsKGluc3RhbmNlLmdldFByb3BlcnR5KCJvdGhlciIpKTsKKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBwdWJsaWMgY2xhc3MgTXlQcm92aWRlciBpbXBsZW1lbnRzIENvbnRleHRSZXNvbHZlcjxTdHJpbmc+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb250ZXh0KGZpbmFsIENsYXNzPD8+IHR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbVByb3ZpZGVyc0ZlYXR1cmUoKSB7CisgICAgICAgIGZpbmFsIEN1c3RvbVByb3ZpZGVyc0ZlYXR1cmUgZmVhdHVyZSA9IG5ldyBDdXN0b21Qcm92aWRlcnNGZWF0dXJlKEFycmF5cy5hc0xpc3QobmV3IENsYXNzPD8+W117TXlQcm92aWRlci5jbGFzc30pKTsKKworICAgICAgICBDbGllbnRDb25maWcgaW5zdGFuY2UgPSBuZXcgQ2xpZW50Q29uZmlnKCk7CisgICAgICAgIGluc3RhbmNlLnJlZ2lzdGVyKGZlYXR1cmUpOworCisgICAgICAgIGFzc2VydFRydWUoaW5zdGFuY2UuZ2V0Q2xhc3NlcygpLmlzRW1wdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBpbnN0YW5jZS5nZXRJbnN0YW5jZXMoKS5zaXplKCkpOworCisgICAgICAgIC8vIEZlYXR1cmVzIGFyZSByZWdpc3RlcmVkIGF0IHRoZSB0aW1lIG9mIHByb3ZpZGVyIGJpbmRpbmdzLgorICAgICAgICBmaW5hbCBKZXJzZXlDbGllbnQgamVyc2V5Q2xpZW50ID0gbmV3IEplcnNleUNsaWVudChpbnN0YW5jZSwgKFVuc2FmZVZhbHVlPFNTTENvbnRleHQsIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbj4pIG51bGwsIG51bGwpOworICAgICAgICBDbGllbnRDb25maWcgY29uZmlnID0gamVyc2V5Q2xpZW50LmdldENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgZmluYWwgQ2xpZW50UnVudGltZSBydW50aW1lID0gY29uZmlnLmdldFJ1bnRpbWUoKTsKKworICAgICAgICBmaW5hbCBDbGllbnRDb25maWcgcnVudGltZUNvbmZpZyA9IHJ1bnRpbWUuZ2V0Q29uZmlnKCk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShydW50aW1lQ29uZmlnLmlzUmVnaXN0ZXJlZChNeVByb3ZpZGVyLmNsYXNzKSk7CisgICAgICAgIGFzc2VydFRydWUocnVudGltZUNvbmZpZy5pc0VuYWJsZWQoZmVhdHVyZSkpOworCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFbXB0eUZlYXR1cmUgaW1wbGVtZW50cyBGZWF0dXJlIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlKGZpbmFsIEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBVbmNvbmZpZ3VyYWJsZUZlYXR1cmUgaW1wbGVtZW50cyBGZWF0dXJlIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlKGZpbmFsIEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvcGllZCBmcm9tIERlZmF1bHRDb25maWdUZXN0LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEZlYXR1cmVzKCkgeworICAgICAgICBmaW5hbCBFbXB0eUZlYXR1cmUgZW1wdHlGZWF0dXJlID0gbmV3IEVtcHR5RmVhdHVyZSgpOworICAgICAgICBmaW5hbCBVbmNvbmZpZ3VyYWJsZUZlYXR1cmUgdW5jb25maWd1cmFibGVGZWF0dXJlID0gbmV3IFVuY29uZmlndXJhYmxlRmVhdHVyZSgpOworCisgICAgICAgIENsaWVudENvbmZpZyBjbGllbnRDb25maWcgPSBuZXcgQ2xpZW50Q29uZmlnKCk7CisgICAgICAgIGNsaWVudENvbmZpZy5yZWdpc3RlcihlbXB0eUZlYXR1cmUpOworICAgICAgICBjbGllbnRDb25maWcucmVnaXN0ZXIodW5jb25maWd1cmFibGVGZWF0dXJlKTsKKworICAgICAgICAvLyBGZWF0dXJlcyBhcmUgcmVnaXN0ZXJlZCBhdCB0aGUgdGltZSBvZiBwcm92aWRlciBiaW5kaW5ncy4KKyAgICAgICAgZmluYWwgSmVyc2V5Q2xpZW50IGplcnNleUNsaWVudCA9CisgICAgICAgICAgICAgICAgbmV3IEplcnNleUNsaWVudChjbGllbnRDb25maWcsIChVbnNhZmVWYWx1ZTxTU0xDb250ZXh0LCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24+KSBudWxsLCBudWxsKTsKKyAgICAgICAgY2xpZW50Q29uZmlnID0gamVyc2V5Q2xpZW50LmdldENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgY2xpZW50Q29uZmlnLmdldFJ1bnRpbWUoKTsKKworICAgICAgICBmaW5hbCBDb25maWd1cmF0aW9uIHJ1bnRpbWVDb25maWcgPSBjbGllbnRDb25maWcuZ2V0UnVudGltZSgpLmdldENvbmZpZygpOworCisgICAgICAgIGFzc2VydFRydWUocnVudGltZUNvbmZpZy5pc0VuYWJsZWQoZW1wdHlGZWF0dXJlKSk7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UHJvdmlkZXJDbGFzc2VzKCkgeworICAgICAgICBDbGllbnRDb25maWcgaW5zdGFuY2UgPSBuZXcgQ2xpZW50Q29uZmlnKCk7CisgICAgICAgIGluc3RhbmNlLmdldENsYXNzZXMoKS5hZGQoQ2xpZW50Q29uZmlnVGVzdC5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UHJvdmlkZXJJbnN0YW5jZXMoKSB7CisgICAgICAgIENsaWVudENvbmZpZyBpbnN0YW5jZSA9IG5ldyBDbGllbnRDb25maWcoKTsKKyAgICAgICAgaW5zdGFuY2UuZ2V0SW5zdGFuY2VzKCkuYWRkKHRoaXMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVwZGF0ZSgpIHsKKyAgICAgICAgZmluYWwgVW5jb25maWd1cmFibGVGZWF0dXJlIHVuY29uZmlndXJhYmxlRmVhdHVyZSA9IG5ldyBVbmNvbmZpZ3VyYWJsZUZlYXR1cmUoKTsKKworICAgICAgICBDbGllbnRDb25maWcgY2xpZW50Q29uZmlnMSA9IG5ldyBDbGllbnRDb25maWcoKTsKKyAgICAgICAgQ2xpZW50Q29uZmlnIGNsaWVudENvbmZpZzIgPSBuZXcgQ2xpZW50Q29uZmlnKCk7CisKKyAgICAgICAgY2xpZW50Q29uZmlnMS5yZWdpc3RlcihFbXB0eUZlYXR1cmUuY2xhc3MpOworICAgICAgICBjbGllbnRDb25maWcyLnJlZ2lzdGVyKHVuY29uZmlndXJhYmxlRmVhdHVyZSk7CisKKyAgICAgICAgQ2xpZW50Q29uZmlnIGNsaWVudENvbmZpZyA9IGNsaWVudENvbmZpZzIubG9hZEZyb20oY2xpZW50Q29uZmlnMSk7CisKKyAgICAgICAgLy8gRmVhdHVyZXMgYXJlIHJlZ2lzdGVyZWQgYXQgdGhlIHRpbWUgb2YgcHJvdmlkZXIgYmluZGluZ3MuCisgICAgICAgIGZpbmFsIEplcnNleUNsaWVudCBqZXJzZXlDbGllbnQgPQorICAgICAgICAgICAgICAgIG5ldyBKZXJzZXlDbGllbnQoY2xpZW50Q29uZmlnLCAoVW5zYWZlVmFsdWU8U1NMQ29udGV4dCwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uPikgbnVsbCwgbnVsbCk7CisgICAgICAgIGNsaWVudENvbmZpZyA9IGplcnNleUNsaWVudC5nZXRDb25maWd1cmF0aW9uKCk7CisgICAgICAgIGNsaWVudENvbmZpZy5nZXRSdW50aW1lKCk7CisKKyAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbiBydW50aW1lQ29uZmlnID0gY2xpZW50Q29uZmlnLmdldFJ1bnRpbWUoKS5nZXRDb25maWcoKTsKKworICAgICAgICBhc3NlcnRUcnVlKHJ1bnRpbWVDb25maWcuaXNFbmFibGVkKEVtcHR5RmVhdHVyZS5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNldFByb3BlcnR5KCkgeworICAgICAgICBDbGllbnRDb25maWcgaW5zdGFuY2UgPSBuZXcgQ2xpZW50Q29uZmlnKCk7CisgICAgICAgIGFzc2VydFRydWUoaW5zdGFuY2UuZ2V0UHJvcGVydGllcygpLmlzRW1wdHkoKSk7CisKKyAgICAgICAgaW5zdGFuY2UucHJvcGVydHkoIm5hbWUiLCAidmFsdWUiKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoaW5zdGFuY2UuZ2V0UHJvcGVydGllcygpLmlzRW1wdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBpbnN0YW5jZS5nZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZSIsIGluc3RhbmNlLmdldFByb3BlcnR5KCJuYW1lIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0NsaWVudFJlcXVlc3RUZXN0LmphdmEgYi9jb3JlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9DbGllbnRSZXF1ZXN0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NTEyY2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9DbGllbnRSZXF1ZXN0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTk2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkdlbmVyaWNUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuTWFwUHJvcGVydGllc0RlbGVnYXRlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLlByb3BlcnRpZXNEZWxlZ2F0ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLkV4Y2VwdGlvblV0aWxzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuTWVzc2FnZUJvZHlXb3JrZXJzOworCitpbXBvcnQgb3JnLmhhbWNyZXN0LmNvcmUuSXM7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcubW9ja2l0by5Nb2NrOworaW1wb3J0IG9yZy5tb2NraXRvLk1vY2tpdG87CitpbXBvcnQgb3JnLm1vY2tpdG8uTW9ja2l0b0Fubm90YXRpb25zOworaW1wb3J0IG9yZy5tb2NraXRvLnJ1bm5lcnMuTW9ja2l0b0pVbml0UnVubmVyOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKK2ltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTWF0Y2hlcnMuYW55OworaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5NYXRjaGVycy5zYW1lOworCisvKioKKyAqIHtAY29kZSBDbGllbnRSZXF1ZXN0fSB1bml0IHRlc3RzLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSdW5XaXRoKE1vY2tpdG9KVW5pdFJ1bm5lci5jbGFzcykKK3B1YmxpYyBjbGFzcyBDbGllbnRSZXF1ZXN0VGVzdCB7CisKKyAgICBATW9jaworICAgIHByaXZhdGUgTWVzc2FnZUJvZHlXb3JrZXJzIHdvcmtlcnM7CisgICAgQE1vY2sKKyAgICBwcml2YXRlIEdlbmVyaWNUeXBlPD8+IGVudGl0eVR5cGU7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgaW5pdE1vY2tzKCkgeworICAgICAgICBNb2NraXRvQW5ub3RhdGlvbnMuaW5pdE1vY2tzKHRoaXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgb2YgcmVzb2x2aW5nIHByb3BlcnRpZXMgaW4gdGhlIGNsaWVudCByZXF1ZXN0LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc29sdmVQcm9wZXJ0eSgpIHsKKyAgICAgICAgSmVyc2V5Q2xpZW50IGNsaWVudDsKKyAgICAgICAgQ2xpZW50UmVxdWVzdCByZXF1ZXN0OworCisgICAgICAgIC8vIHRlc3QgcHJvcGVydHkgaW4gbmVpdGhlciBjb25maWcgbm9yIHJlcXVlc3QKKyAgICAgICAgY2xpZW50ID0gbmV3IEplcnNleUNsaWVudEJ1aWxkZXIoKS5idWlsZCgpOworCisgICAgICAgIHJlcXVlc3QgPSBuZXcgQ2xpZW50UmVxdWVzdCgKKyAgICAgICAgICAgICAgICBVUkkuY3JlYXRlKCJodHRwOi8vZXhhbXBsZS5vcmciKSwKKyAgICAgICAgICAgICAgICBjbGllbnQuZ2V0Q29uZmlndXJhdGlvbigpLAorICAgICAgICAgICAgICAgIG5ldyBNYXBQcm9wZXJ0aWVzRGVsZWdhdGUoKSk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UocmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UHJvcGVydHlOYW1lcygpLmNvbnRhaW5zKCJuYW1lIikpOworICAgICAgICBhc3NlcnRGYWxzZShyZXF1ZXN0LmdldFByb3BlcnR5TmFtZXMoKS5jb250YWlucygibmFtZSIpKTsKKworICAgICAgICBhc3NlcnROdWxsKHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnR5KCJuYW1lIikpOworICAgICAgICBhc3NlcnROdWxsKHJlcXVlc3QuZ2V0UHJvcGVydHkoIm5hbWUiKSk7CisKKyAgICAgICAgYXNzZXJ0TnVsbChyZXF1ZXN0LnJlc29sdmVQcm9wZXJ0eSgibmFtZSIsIFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlLWRlZmF1bHQiLCByZXF1ZXN0LnJlc29sdmVQcm9wZXJ0eSgibmFtZSIsICJ2YWx1ZS1kZWZhdWx0IikpOworCisgICAgICAgIC8vIHRlc3QgcHJvcGVydHkgaW4gY29uZmlnIG9ubHkKKyAgICAgICAgY2xpZW50ID0gbmV3IEplcnNleUNsaWVudEJ1aWxkZXIoKS5wcm9wZXJ0eSgibmFtZSIsICJ2YWx1ZS1nbG9iYWwiKS5idWlsZCgpOworCisgICAgICAgIHJlcXVlc3QgPSBuZXcgQ2xpZW50UmVxdWVzdCgKKyAgICAgICAgICAgICAgICBVUkkuY3JlYXRlKCJodHRwOi8vZXhhbXBsZS5vcmciKSwKKyAgICAgICAgICAgICAgICBjbGllbnQuZ2V0Q29uZmlndXJhdGlvbigpLAorICAgICAgICAgICAgICAgIG5ldyBNYXBQcm9wZXJ0aWVzRGVsZWdhdGUoKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0eU5hbWVzKCkuY29udGFpbnMoIm5hbWUiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHJlcXVlc3QuZ2V0UHJvcGVydHlOYW1lcygpLmNvbnRhaW5zKCJuYW1lIikpOworCisgICAgICAgIGFzc2VydEVxdWFscygidmFsdWUtZ2xvYmFsIiwgcmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UHJvcGVydHkoIm5hbWUiKSk7CisgICAgICAgIGFzc2VydE51bGwocmVxdWVzdC5nZXRQcm9wZXJ0eSgibmFtZSIpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlLWdsb2JhbCIsIHJlcXVlc3QucmVzb2x2ZVByb3BlcnR5KCJuYW1lIiwgU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidmFsdWUtZ2xvYmFsIiwgcmVxdWVzdC5yZXNvbHZlUHJvcGVydHkoIm5hbWUiLCAidmFsdWUtZGVmYXVsdCIpKTsKKworICAgICAgICAvLyB0ZXN0IHByb3BlcnR5IGluIHJlcXVlc3Qgb25seQorICAgICAgICBjbGllbnQgPSBuZXcgSmVyc2V5Q2xpZW50QnVpbGRlcigpLmJ1aWxkKCk7CisKKyAgICAgICAgcmVxdWVzdCA9IG5ldyBDbGllbnRSZXF1ZXN0KAorICAgICAgICAgICAgICAgIFVSSS5jcmVhdGUoImh0dHA6Ly9leGFtcGxlLm9yZyIpLAorICAgICAgICAgICAgICAgIGNsaWVudC5nZXRDb25maWd1cmF0aW9uKCksCisgICAgICAgICAgICAgICAgbmV3IE1hcFByb3BlcnRpZXNEZWxlZ2F0ZSgpKTsKKyAgICAgICAgcmVxdWVzdC5zZXRQcm9wZXJ0eSgibmFtZSIsICJ2YWx1ZS1yZXF1ZXN0Iik7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UocmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UHJvcGVydHlOYW1lcygpLmNvbnRhaW5zKCJuYW1lIikpOworICAgICAgICBhc3NlcnRUcnVlKHJlcXVlc3QuZ2V0UHJvcGVydHlOYW1lcygpLmNvbnRhaW5zKCJuYW1lIikpOworCisgICAgICAgIGFzc2VydE51bGwocmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UHJvcGVydHkoIm5hbWUiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidmFsdWUtcmVxdWVzdCIsIHJlcXVlc3QuZ2V0UHJvcGVydHkoIm5hbWUiKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZS1yZXF1ZXN0IiwgcmVxdWVzdC5yZXNvbHZlUHJvcGVydHkoIm5hbWUiLCBTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZS1yZXF1ZXN0IiwgcmVxdWVzdC5yZXNvbHZlUHJvcGVydHkoIm5hbWUiLCAidmFsdWUtZGVmYXVsdCIpKTsKKworICAgICAgICAvLyB0ZXN0IHByb3BlcnR5IGluIGNvbmZpZyBhbmQgcmVxdWVzdAorICAgICAgICBjbGllbnQgPSBuZXcgSmVyc2V5Q2xpZW50QnVpbGRlcigpLnByb3BlcnR5KCJuYW1lIiwgInZhbHVlLWdsb2JhbCIpLmJ1aWxkKCk7CisKKyAgICAgICAgcmVxdWVzdCA9IG5ldyBDbGllbnRSZXF1ZXN0KAorICAgICAgICAgICAgICAgIFVSSS5jcmVhdGUoImh0dHA6Ly9leGFtcGxlLm9yZyIpLAorICAgICAgICAgICAgICAgIGNsaWVudC5nZXRDb25maWd1cmF0aW9uKCksCisgICAgICAgICAgICAgICAgbmV3IE1hcFByb3BlcnRpZXNEZWxlZ2F0ZSgpKTsKKyAgICAgICAgcmVxdWVzdC5zZXRQcm9wZXJ0eSgibmFtZSIsICJ2YWx1ZS1yZXF1ZXN0Iik7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0eU5hbWVzKCkuY29udGFpbnMoIm5hbWUiKSk7CisgICAgICAgIGFzc2VydFRydWUocmVxdWVzdC5nZXRQcm9wZXJ0eU5hbWVzKCkuY29udGFpbnMoIm5hbWUiKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZS1nbG9iYWwiLCByZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0eSgibmFtZSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZS1yZXF1ZXN0IiwgcmVxdWVzdC5nZXRQcm9wZXJ0eSgibmFtZSIpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlLXJlcXVlc3QiLCByZXF1ZXN0LnJlc29sdmVQcm9wZXJ0eSgibmFtZSIsIFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlLXJlcXVlc3QiLCByZXF1ZXN0LnJlc29sdmVQcm9wZXJ0eSgibmFtZSIsICJ2YWx1ZS1kZWZhdWx0IikpOworICAgIH0KKworICAgIHByaXZhdGUgQ2xpZW50UmVxdWVzdCBtb2NrVGhyb3dpbmcoRXhjZXB0aW9uIGV4Y2VwdGlvbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgSmVyc2V5Q2xpZW50IGNsaWVudCA9IG5ldyBKZXJzZXlDbGllbnRCdWlsZGVyKCkuYnVpbGQoKTsKKyAgICAgICAgZmluYWwgQ2xpZW50UmVxdWVzdCByZXF1ZXN0ID0gbmV3IENsaWVudFJlcXVlc3QoCisgICAgICAgICAgICAgICAgVVJJLmNyZWF0ZSgiaHR0cDovL2V4YW1wbGUub3JnIiksCisgICAgICAgICAgICAgICAgY2xpZW50LmdldENvbmZpZ3VyYXRpb24oKSwKKyAgICAgICAgICAgICAgICBuZXcgTWFwUHJvcGVydGllc0RlbGVnYXRlKCkpOworCisgICAgICAgIE1vY2tpdG8uZG9UaHJvdyhleGNlcHRpb24pLndoZW4od29ya2VycykKKyAgICAgICAgICAgICAgICAud3JpdGVUbyhhbnkoKSwgc2FtZShlbnRpdHlUeXBlLmdldFJhd1R5cGUoKSksIHNhbWUoZW50aXR5VHlwZS5nZXRUeXBlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgTW9ja2l0by48QW5ub3RhdGlvbltdPmFueSgpLCBNb2NraXRvLjxNZWRpYVR5cGU+YW55KCksCisgICAgICAgICAgICAgICAgICAgICAgICBNb2NraXRvLjxNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4+YW55KCksIE1vY2tpdG8uPFByb3BlcnRpZXNEZWxlZ2F0ZT5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1vY2tpdG8uPE91dHB1dFN0cmVhbT5hbnkoKSwgTW9ja2l0by48SXRlcmFibGU8V3JpdGVySW50ZXJjZXB0b3I+PmFueSgpKTsKKyAgICAgICAgcmV0dXJuIHJlcXVlc3Q7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U1NMRXhjZXB0aW9uSGFuZGxpbmcoKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIElPRXhjZXB0aW9uIGlvRXhjZXB0aW9uID0gbmV3IElPRXhjZXB0aW9uKCJUZXN0Iik7CisKKyAgICAgICAgZmluYWwgQ2xpZW50UmVxdWVzdCByZXF1ZXN0ID0gbW9ja1Rocm93aW5nKGlvRXhjZXB0aW9uKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVxdWVzdC5kb1dyaXRlRW50aXR5KHdvcmtlcnMsIGVudGl0eVR5cGUpOworICAgICAgICAgICAgZmFpbCgiQW4gSU9FeGNlcHRpb24gZXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24uIik7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUaGF0KCJEZXRlY3RlZCBhIHVuLWV4cGVjdGVkIGV4Y2VwdGlvbiEgXG4iICsgRXhjZXB0aW9uVXRpbHMuZXhjZXB0aW9uU3RhY2tUcmFjZUFzU3RyaW5nKGUpLAorICAgICAgICAgICAgICAgICAgICBlLCBJcy5pcyhpb0V4Y2VwdGlvbikpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UnVudGltZUV4Y2VwdGlvbkJlaW5nUmVUaHJvd24oKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgZmluYWwgUnVudGltZUV4Y2VwdGlvbiBydW50aW1lRXhjZXB0aW9uID0gbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRlc3QiKTsKKworICAgICAgICBDbGllbnRSZXF1ZXN0IHJlcXVlc3QgPSBtb2NrVGhyb3dpbmcocnVudGltZUV4Y2VwdGlvbik7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlcXVlc3QuZG9Xcml0ZUVudGl0eSh3b3JrZXJzLCBlbnRpdHlUeXBlKTsKKyAgICAgICAgICAgIEFzc2VydC5mYWlsKCJBIFJ1bnRpbWVFeGNlcHRpb24gZXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24uIik7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRoYXQoIkRldGVjdGVkIGEgdW4tZXhwZWN0ZWQgZXhjZXB0aW9uISBcbiIgKyBFeGNlcHRpb25VdGlscy5leGNlcHRpb25TdGFja1RyYWNlQXNTdHJpbmcoZSksCisgICAgICAgICAgICAgICAgICAgIGUsIElzLmlzKHJ1bnRpbWVFeGNlcHRpb24pKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvQ2xpZW50UnhUZXN0LmphdmEgYi9jb3JlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9DbGllbnRSeFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjM4MjJkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvQ2xpZW50UnhUZXN0LmphdmEKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50OworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuSW52b2NhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuUnhJbnZva2VyUHJvdmlkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LlN5bmNJbnZva2VyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YS5UaHJlYWRGYWN0b3J5QnVpbGRlcjsKKworaW1wb3J0IG9yZy5oYW1jcmVzdC5jb3JlLkFsbE9mOworaW1wb3J0IG9yZy5oYW1jcmVzdC5jb3JlLlN0cmluZ0NvbnRhaW5zOworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5FeHBlY3RlZEV4Y2VwdGlvbjsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIFNhbml0eSB0ZXN0IGZvciB7QGxpbmsgSW52b2NhdGlvbi5CdWlsZGVyI3J4KCl9IG1ldGhvZHMuCisgKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIENsaWVudFJ4VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBFeGVjdXRvclNlcnZpY2UgRVhFQ1VUT1JfU0VSVklDRSA9CisgICAgICAgICAgICBFeGVjdXRvcnMubmV3Q2FjaGVkVGhyZWFkUG9vbChuZXcgVGhyZWFkRmFjdG9yeUJ1aWxkZXIoKS5zZXROYW1lRm9ybWF0KCJyeFRlc3QtJWQiKS5idWlsZCgpKTsKKworICAgIHByaXZhdGUgZmluYWwgQ2xpZW50IENMSUVOVDsKKyAgICBwcml2YXRlIGZpbmFsIENsaWVudCBDTElFTlRfV0lUSF9FWEVDVVRPUjsKKworICAgIHB1YmxpYyBDbGllbnRSeFRlc3QoKSB7CisgICAgICAgIENMSUVOVCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KCk7CisKKyAgICAgICAgLy8gVE9ETyBKQVgtUlMgMi4xCisgICAgICAgIC8vIENMSUVOVF9XSVRIX0VYRUNVVE9SID0gQ2xpZW50QnVpbGRlci5uZXdCdWlsZGVyKCkuZXhlY3V0b3JTZXJ2aWNlKEVYRUNVVE9SX1NFUlZJQ0UpLmJ1aWxkKCk7CisgICAgICAgIENMSUVOVF9XSVRIX0VYRUNVVE9SID0gbnVsbDsKKyAgICB9CisKKyAgICBAUnVsZQorICAgIHB1YmxpYyBFeHBlY3RlZEV4Y2VwdGlvbiB0aHJvd24gPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCBhZnRlckNsYXNzKCkgeworICAgICAgICBDTElFTlQuY2xvc2UoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSeEludm9rZXIoKSB7CisgICAgICAgIC8vIGV4cGxpY2l0IHJlZ2lzdGVyIGlzIG5vdCBuZWNlc3NhcnksIGJ1dCBpdCBjYW4gYmUgdXNlZC4KKyAgICAgICAgQ0xJRU5ULnJlZ2lzdGVyKFRlc3RSeEludm9rZXJQcm92aWRlci5jbGFzcywgUnhJbnZva2VyUHJvdmlkZXIuY2xhc3MpOworCisgICAgICAgIFN0cmluZyBzID0gdGFyZ2V0KENMSUVOVCkucmVxdWVzdCgpLnJ4KFRlc3RSeEludm9rZXIuY2xhc3MpLmdldCgpOworCisgICAgICAgIGFzc2VydFRydWUoIlByb3ZpZGVkIFJ4SW52b2tlciB3YXMgbm90IHVzZWQuIiwgcy5zdGFydHNXaXRoKCJyeFRlc3RJbnZva2VyIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQElnbm9yZSgiVE9ETyBKQVgtUlMgMi4xIikKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UnhJbnZva2VyV2l0aEV4ZWN1dG9yKCkgeworICAgICAgICAvLyBpbXBsaWNpdCByZWdpc3RlciAobm90IHNheWluZyB0aGF0IHRoZSBjb250cmFjdCBpcyBSeEludm9rZXJQcm92aWRlcikuCisgICAgICAgIENMSUVOVC5yZWdpc3RlcihUZXN0UnhJbnZva2VyUHJvdmlkZXIuY2xhc3MpOworCisgICAgICAgIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvclNlcnZpY2UgPSBFeGVjdXRvcnMKKyAgICAgICAgICAgICAgICAubmV3Q2FjaGVkVGhyZWFkUG9vbChuZXcgVGhyZWFkRmFjdG9yeUJ1aWxkZXIoKS5zZXROYW1lRm9ybWF0KCJyeFRlc3QtJWQiKS5idWlsZCgpKTsKKyAgICAgICAgU3RyaW5nIHMgPSB0YXJnZXQoQ0xJRU5UX1dJVEhfRVhFQ1VUT1IpLnJlcXVlc3QoKS5yeChUZXN0UnhJbnZva2VyLmNsYXNzKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRUcnVlKCJQcm92aWRlZCBSeEludm9rZXIgd2FzIG5vdCB1c2VkLiIsIHMuc3RhcnRzV2l0aCgicnhUZXN0SW52b2tlciIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhlY3V0b3IgU2VydmljZSB3YXMgbm90IHBhc3NlZCB0byBSeEludm9rZXIiLCBzLmNvbnRhaW5zKCJyeFRlc3QtIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJ4SW52b2tlckludmFsaWQoKSB7CisgICAgICAgIEludm9jYXRpb24uQnVpbGRlciByZXF1ZXN0ID0gdGFyZ2V0KENMSUVOVCkucmVxdWVzdCgpOworICAgICAgICB0aHJvd24uZXhwZWN0KElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIHRocm93bi5leHBlY3RNZXNzYWdlKEFsbE9mLmFsbE9mKG5ldyBTdHJpbmdDb250YWlucygibnVsbCIpLCBuZXcgU3RyaW5nQ29udGFpbnMoImNsYXp6IikpKTsKKyAgICAgICAgcmVxdWVzdC5yeChudWxsKS5nZXQoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSeEludm9rZXJOb3RSZWdpc3RlcmVkKCkgeworICAgICAgICBJbnZvY2F0aW9uLkJ1aWxkZXIgcmVxdWVzdCA9IHRhcmdldChDTElFTlQpLnJlcXVlc3QoKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdChJbGxlZ2FsU3RhdGVFeGNlcHRpb24uY2xhc3MpOworICAgICAgICB0aHJvd24uZXhwZWN0TWVzc2FnZShBbGxPZi5hbGxPZigKKyAgICAgICAgICAgICAgICBuZXcgU3RyaW5nQ29udGFpbnMoIlRlc3RSeEludm9rZXIiKSwKKyAgICAgICAgICAgICAgICBuZXcgU3RyaW5nQ29udGFpbnMoIm5vdCByZWdpc3RlcmVkIiksCisgICAgICAgICAgICAgICAgbmV3IFN0cmluZ0NvbnRhaW5zKCJSeEludm9rZXJQcm92aWRlciIpKSk7CisgICAgICAgIHJlcXVlc3QucngoVGVzdFJ4SW52b2tlci5jbGFzcykuZ2V0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBXZWJUYXJnZXQgdGFyZ2V0KENsaWVudCBjbGllbnQpIHsKKyAgICAgICAgLy8gVXJpIGlzIG5vdCByZWxldmFudCwgdGhlIGNhbGwgd29uJ3QgYmUgZXZlciBleGVjdXRlZC4KKyAgICAgICAgcmV0dXJuIGNsaWVudC50YXJnZXQoImh0dHA6Ly9sb2NhbGhvc3Q6OTk5OSIpOworICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFJ4SW52b2tlclByb3ZpZGVyIGltcGxlbWVudHMgUnhJbnZva2VyUHJvdmlkZXI8VGVzdFJ4SW52b2tlcj4geworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFRlc3RSeEludm9rZXIgZ2V0UnhJbnZva2VyKFN5bmNJbnZva2VyIHN5bmNJbnZva2VyLCBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFRlc3RSeEludm9rZXIoc3luY0ludm9rZXIsIGV4ZWN1dG9yU2VydmljZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNQcm92aWRlckZvcihDbGFzczw/PiBjbGF6eikgeworICAgICAgICAgICAgcmV0dXJuIFRlc3RSeEludm9rZXIuY2xhc3MuZXF1YWxzKGNsYXp6KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRlc3RSeEludm9rZXIgZXh0ZW5kcyBBYnN0cmFjdFJ4SW52b2tlcjxTdHJpbmc+IHsKKworICAgICAgICBwcml2YXRlIFRlc3RSeEludm9rZXIoU3luY0ludm9rZXIgc3luY0ludm9rZXIsIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvcikgeworICAgICAgICAgICAgc3VwZXIoc3luY0ludm9rZXIsIGV4ZWN1dG9yKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgPFI+IFN0cmluZyBtZXRob2QoU3RyaW5nIG5hbWUsIEVudGl0eTw/PiBlbnRpdHksIENsYXNzPFI+IHJlc3BvbnNlVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuICJyeFRlc3RJbnZva2VyIiArIChnZXRFeGVjdXRvclNlcnZpY2UoKSA9PSBudWxsID8gIiIgOiAiIHJ4VGVzdC0iKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgPFI+IFN0cmluZyBtZXRob2QoU3RyaW5nIG5hbWUsIEVudGl0eTw/PiBlbnRpdHksIEdlbmVyaWNUeXBlPFI+IHJlc3BvbnNlVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuICJyeFRlc3RJbnZva2VyIiArIChnZXRFeGVjdXRvclNlcnZpY2UoKSA9PSBudWxsID8gIiIgOiAiIHJ4VGVzdC0iKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0N1c3RvbUNvbm5lY3RvclRlc3QuamF2YSBiL2NvcmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0N1c3RvbUNvbm5lY3RvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzBlNjBjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvQ3VzdG9tQ29ubmVjdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjIzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudDsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKKworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuc3BpLkFzeW5jQ29ubmVjdG9yQ2FsbGJhY2s7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnNwaS5Db25uZWN0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnNwaS5Db25uZWN0b3JQcm92aWRlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEN1c3RvbUNvbm5lY3RvclRlc3QgeworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBOdWxsQ29ubmVjdG9yIGltcGxlbWVudHMgQ29ubmVjdG9yLCBDb25uZWN0b3JQcm92aWRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDbGllbnRSZXNwb25zZSBhcHBseShDbGllbnRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKCJ0ZXN0Iik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEZ1dHVyZTw/PiBhcHBseShDbGllbnRSZXF1ZXN0IHJlcXVlc3QsIEFzeW5jQ29ubmVjdG9yQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKCJ0ZXN0LWFzeW5jIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgICAgICAvLyBkbyBub3RoaW5nCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENvbm5lY3RvciBnZXRDb25uZWN0b3IoQ2xpZW50IGNsaWVudCwgQ29uZmlndXJhdGlvbiBydW50aW1lQ29uZmlnKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE51bGxDb25uZWN0b3IoKSB7CisgICAgICAgIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudChuZXcgQ2xpZW50Q29uZmlnKCkuY29ubmVjdG9yUHJvdmlkZXIobmV3IE51bGxDb25uZWN0b3IoKSkuZ2V0Q29uZmlndXJhdGlvbigpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNsaWVudC50YXJnZXQoVXJpQnVpbGRlci5mcm9tVXJpKCIvIikuYnVpbGQoKSkucmVxdWVzdCgpLmdldCgpOworICAgICAgICB9IGNhdGNoIChQcm9jZXNzaW5nRXhjZXB0aW9uIGNlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QiLCBjZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjbGllbnQudGFyZ2V0KFVyaUJ1aWxkZXIuZnJvbVVyaSgiLyIpLmJ1aWxkKCkpLnJlcXVlc3QoKS5hc3luYygpLmdldCgpOworICAgICAgICB9IGNhdGNoIChQcm9jZXNzaW5nRXhjZXB0aW9uIGNlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QtYXN5bmMiLCBjZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9vcC1iYWNrIGNvbm5lY3RvciBwcm92aWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RDb25uZWN0b3JQcm92aWRlciBpbXBsZW1lbnRzIENvbm5lY3RvclByb3ZpZGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENvbm5lY3RvciBnZXRDb25uZWN0b3IoQ2xpZW50IGNsaWVudCwgQ29uZmlndXJhdGlvbiBydW50aW1lQ29uZmlnKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFRlc3RDb25uZWN0b3IoKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogTG9vcC1iYWNrIGNvbm5lY3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RDb25uZWN0b3IgaW1wbGVtZW50cyBDb25uZWN0b3IgeworICAgICAgICAvKioKKyAgICAgICAgICogVGVzdCBsb29wLWJhY2sgc3RhdHVzIGNvZGUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBURVNUX0xPT1BCQUNLX0NPREUgPSA2MDA7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUZXN0IGxvb3AtYmFjayBzdGF0dXMgdHlwZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBmaW5hbCBSZXNwb25zZS5TdGF0dXNUeXBlIExPT1BCQUNLX1NUQVRVUyA9IG5ldyBSZXNwb25zZS5TdGF0dXNUeXBlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgaW50IGdldFN0YXR1c0NvZGUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRFU1RfTE9PUEJBQ0tfQ09ERTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgUmVzcG9uc2UuU3RhdHVzLkZhbWlseSBnZXRGYW1pbHkoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLlN0YXR1cy5GYW1pbHkuT1RIRVI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRSZWFzb25QaHJhc2UoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJUZXN0IGNvbm5lY3RvciBsb29wLWJhY2siOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBjbG9zZWQgPSBmYWxzZTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENsaWVudFJlc3BvbnNlIGFwcGx5KENsaWVudFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICAgICAgY2hlY2tOb3RDbG9zZWQoKTsKKyAgICAgICAgICAgIGZpbmFsIENsaWVudFJlc3BvbnNlIHJlc3BvbnNlID0gbmV3IENsaWVudFJlc3BvbnNlKExPT1BCQUNLX1NUQVRVUywgcmVxdWVzdCk7CisKKyAgICAgICAgICAgIHJlc3BvbnNlLnNldEVudGl0eVN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocmVxdWVzdC5nZXRVcmkoKS50b1N0cmluZygpLmdldEJ5dGVzKCkpKTsKKyAgICAgICAgICAgIHJldHVybiByZXNwb25zZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRnV0dXJlPD8+IGFwcGx5KENsaWVudFJlcXVlc3QgcmVxdWVzdCwgQXN5bmNDb25uZWN0b3JDYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICAgICAgY2hlY2tOb3RDbG9zZWQoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiQXN5bmMgaW52b2NhdGlvbiBub3Qgc3VwcG9ydGVkIGJ5IHRoZSB0ZXN0IGNvbm5lY3Rvci4iKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gInRlc3QtbG9vcC1iYWNrLWNvbm5lY3RvciI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgICAgICBjbG9zZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGNoZWNrTm90Q2xvc2VkKCkgeworICAgICAgICAgICAgaWYgKGNsb3NlZCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNvbm5lY3RvciBjbG9zZWQuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGNsaWVudCByZXF1ZXN0IGZpbHRlciB0aGF0IGNyZWF0ZXMgbmV3IGNsaWVudCBiYXNlZCBvbiB0aGUgY3VycmVudCBydW50aW1lIGNvbmZpZ3VyYXRpb24KKyAgICAgKiBhbmQgdXNlcyB0aGUgbmV3IGNsaWVudCB0byBwcm9kdWNlIGEgcmVzcG9uc2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0Q2xpZW50RmlsdGVyIGltcGxlbWVudHMgQ2xpZW50UmVxdWVzdEZpbHRlciB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElOVk9LRURfQllfVEVTVF9GSUxURVIgPSAiaW52b2tlZC1ieS10ZXN0LWZpbHRlciI7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDbGllbnRSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgeworICAgICAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWcgPSByZXF1ZXN0Q29udGV4dC5nZXRDb25maWd1cmF0aW9uKCk7CisgICAgICAgICAgICBmaW5hbCBKZXJzZXlDbGllbnQgY2xpZW50ID0gbmV3IEplcnNleUNsaWVudEJ1aWxkZXIoKS53aXRoQ29uZmlnKGNvbmZpZykuYnVpbGQoKTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAocmVxdWVzdENvbnRleHQuZ2V0UHJvcGVydHlOYW1lcygpLmNvbnRhaW5zKElOVk9LRURfQllfVEVTVF9GSUxURVIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gcHJldmVudCB0aGUgaW5maW5pdGUgcmVjdXJzaW9uLi4uCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZmluYWwgVVJJIGZpbHRlcmVkVXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKHJlcXVlc3RDb250ZXh0LmdldFVyaSgpKS5wYXRoKCJmaWx0ZXJlZCIpLmJ1aWxkKCk7CisgICAgICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuYWJvcnRXaXRoKGNsaWVudC50YXJnZXQoZmlsdGVyZWRVcmkpLnJlcXVlc3QoKS5wcm9wZXJ0eShJTlZPS0VEX0JZX1RFU1RfRklMVEVSLCB0cnVlKS5nZXQoKSk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGNsaWVudC5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcm9kdWNlciBmb3IgSkVSU0VZLTIzMTguCisgICAgICoKKyAgICAgKiBUaGUgdGVzdCB2ZXJpZmllcyB0aGF0IHRoZSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnNwaS5Db25uZWN0b3JQcm92aWRlcn0gY29uZmlndXJlZAorICAgICAqIG9uIG9uZSBjbGllbnQgaW5zdGFuY2UgaXMgdHJhbnNmZXJyZWQgdG8gYW5vdGhlciBjbGllbnQgaW5zdGFuY2Ugd2hlbiB0aGUgbmV3IGNsaWVudCBpbnN0YW5jZSBpcworICAgICAqIGNyZWF0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgY2xpZW50IGluc3RhbmNlIGNvbmZpZ3VyYXRpb24uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdG9yUHJvdmlkZXJQcmVzZXJ2ZWRPbkNsaWVudENvbmZpZ0NvcHkoKSB7CisgICAgICAgIGZpbmFsIENsaWVudENvbmZpZyBjbGllbnRDb25maWcgPSBuZXcgQ2xpZW50Q29uZmlnKCkuY29ubmVjdG9yUHJvdmlkZXIobmV3IFRlc3RDb25uZWN0b3JQcm92aWRlcigpKTsKKworICAgICAgICBmaW5hbCBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoY2xpZW50Q29uZmlnKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlOworCisgICAgICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gY2xpZW50LnRhcmdldCgiaHR0cDovL3doZXJldmVyLm9yZy8iKTsKKyAgICAgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgICAgIC8vIGxldCdzIGZpcnN0IHZlcmlmeSB3ZSBhcmUgdXNpbmcgdGhlIHRlc3QgbG9vcC1iYWNrIGNvbm5lY3Rvci4KKyAgICAgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oVGVzdENvbm5lY3Rvci5URVNUX0xPT1BCQUNLX0NPREUpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKCJodHRwOi8vd2hlcmV2ZXIub3JnLyIpKTsKKworICAgICAgICAgICAgLy8gYW5kIG5vdyB3aXRoIHRoZSBmaWx0ZXIuLi4KKyAgICAgICAgICAgIHRhcmdldC5yZWdpc3RlcihUZXN0Q2xpZW50RmlsdGVyLmNsYXNzKTsKKyAgICAgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBjb25uZWN0b3IgcHJvdmlkZXIgaGFzIGJlZW4gcHJvcGFnYXRlZDoKKyAgICAgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oVGVzdENvbm5lY3Rvci5URVNUX0xPT1BCQUNLX0NPREUpKTsKKyAgICAgICAgICAgIC8vIGNoZWNrIGlmIHRoZSBmaWx0ZXIgaGFzIGJlZW4gaW52b2tlZDoKKyAgICAgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKCJodHRwOi8vd2hlcmV2ZXIub3JnL2ZpbHRlcmVkIikpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgY2xpZW50LmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0RlZmF1bHRTc2xDb250ZXh0UHJvdmlkZXJUZXN0LmphdmEgYi9jb3JlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9EZWZhdWx0U3NsQ29udGV4dFByb3ZpZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NDgzZDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9EZWZhdWx0U3NsQ29udGV4dFByb3ZpZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQ3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudDsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7CisKK2ltcG9ydCBqYXZheC5uZXQuc3NsLlNTTENvbnRleHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5Tc2xDb25maWd1cmF0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnNwaS5EZWZhdWx0U3NsQ29udGV4dFByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5VbnNhZmVWYWx1ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uVmFsdWVzOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIERlZmF1bHRTc2xDb250ZXh0UHJvdmlkZXJUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByb3ZpZGVkRGVmYXVsdFNzbENvbnRleHRQcm92aWRlcigpIHsKKworICAgICAgICBmaW5hbCBDbGllbnRDb25maWcgY2xpZW50Q29uZmlnID0gbmV3IENsaWVudENvbmZpZygpOworCisgICAgICAgIGZpbmFsIEF0b21pY0Jvb2xlYW4gZ2V0RGVmYXVsdFNzbENvbnRleHRDYWxsZWQgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CisKKworICAgICAgICBmaW5hbCBKZXJzZXlDbGllbnQgamVyc2V5Q2xpZW50ID0KKyAgICAgICAgICAgICAgICBuZXcgSmVyc2V5Q2xpZW50KGNsaWVudENvbmZpZywgU3NsQ29uZmlndXJhdG9yLmdldERlZmF1bHRDb250ZXh0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBuZXcgRGVmYXVsdFNzbENvbnRleHRQcm92aWRlcigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBTU0xDb250ZXh0IGdldERlZmF1bHRTc2xDb250ZXh0KCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGVmYXVsdFNzbENvbnRleHRDYWxsZWQuc2V0KHRydWUpOworCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3NsQ29uZmlndXJhdG9yLmdldERlZmF1bHRDb250ZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICBqZXJzZXlDbGllbnQuZ2V0U3NsQ29udGV4dCgpOworCisgICAgICAgIGFzc2VydEZhbHNlKGdldERlZmF1bHRTc2xDb250ZXh0Q2FsbGVkLmdldCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoamVyc2V5Q2xpZW50LmlzRGVmYXVsdFNzbENvbnRleHQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvdmlkZWREZWZhdWx0U3NsQ29udGV4dFByb3ZpZGVyVW5zYWZlVmFsKCkgeworCisgICAgICAgIGZpbmFsIENsaWVudENvbmZpZyBjbGllbnRDb25maWcgPSBuZXcgQ2xpZW50Q29uZmlnKCk7CisKKyAgICAgICAgZmluYWwgQXRvbWljQm9vbGVhbiBnZXREZWZhdWx0U3NsQ29udGV4dENhbGxlZCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKworCisgICAgICAgIGZpbmFsIEplcnNleUNsaWVudCBqZXJzZXlDbGllbnQgPQorICAgICAgICAgICAgICAgIG5ldyBKZXJzZXlDbGllbnQoY2xpZW50Q29uZmlnLCBWYWx1ZXMuPFNTTENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICBJbGxlZ2FsU3RhdGVFeGNlcHRpb24+dW5zYWZlKFNzbENvbmZpZ3VyYXRvci5nZXREZWZhdWx0Q29udGV4dCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG5ldyBEZWZhdWx0U3NsQ29udGV4dFByb3ZpZGVyKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIFNTTENvbnRleHQgZ2V0RGVmYXVsdFNzbENvbnRleHQoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnZXREZWZhdWx0U3NsQ29udGV4dENhbGxlZC5zZXQodHJ1ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTc2xDb25maWd1cmF0b3IuZ2V0RGVmYXVsdENvbnRleHQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgIGplcnNleUNsaWVudC5nZXRTc2xDb250ZXh0KCk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UoZ2V0RGVmYXVsdFNzbENvbnRleHRDYWxsZWQuZ2V0KCkpOworICAgICAgICBhc3NlcnRGYWxzZShqZXJzZXlDbGllbnQuaXNEZWZhdWx0U3NsQ29udGV4dCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21EZWZhdWx0U3NsQ29udGV4dFByb3ZpZGVyKCkgeworCisgICAgICAgIGZpbmFsIENsaWVudENvbmZpZyBjbGllbnRDb25maWcgPSBuZXcgQ2xpZW50Q29uZmlnKCk7CisKKyAgICAgICAgZmluYWwgQXRvbWljQm9vbGVhbiBnZXREZWZhdWx0U3NsQ29udGV4dENhbGxlZCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKyAgICAgICAgZmluYWwgQXRvbWljUmVmZXJlbmNlPFNTTENvbnRleHQ+IHJldHVybmVkQ29udGV4dCA9IG5ldyBBdG9taWNSZWZlcmVuY2U8U1NMQ29udGV4dD4obnVsbCk7CisKKyAgICAgICAgZmluYWwgSmVyc2V5Q2xpZW50IGplcnNleUNsaWVudCA9CisgICAgICAgICAgICAgICAgbmV3IEplcnNleUNsaWVudChjbGllbnRDb25maWcsIChTU0xDb250ZXh0KSBudWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgbmV3IERlZmF1bHRTc2xDb250ZXh0UHJvdmlkZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgU1NMQ29udGV4dCBnZXREZWZhdWx0U3NsQ29udGV4dCgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldERlZmF1bHRTc2xDb250ZXh0Q2FsbGVkLnNldCh0cnVlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU1NMQ29udGV4dCBkZWZhdWx0U3NsQ29udGV4dCA9IFNzbENvbmZpZ3VyYXRvci5nZXREZWZhdWx0Q29udGV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWRDb250ZXh0LnNldChkZWZhdWx0U3NsQ29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFNzbENvbnRleHQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAvLyBtYWtlIHN1cmUgY29udGV4dCBpcyBjcmVhdGVkCisgICAgICAgIGplcnNleUNsaWVudC5nZXRTc2xDb250ZXh0KCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJldHVybmVkQ29udGV4dC5nZXQoKSwgamVyc2V5Q2xpZW50LmdldFNzbENvbnRleHQoKSk7CisgICAgICAgIGFzc2VydFRydWUoZ2V0RGVmYXVsdFNzbENvbnRleHRDYWxsZWQuZ2V0KCkpOworICAgICAgICBhc3NlcnRUcnVlKGplcnNleUNsaWVudC5pc0RlZmF1bHRTc2xDb250ZXh0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbURlZmF1bHRTc2xDb250ZXh0UHJvdmlkZXJVbnNhZmVWYWwoKSB7CisKKyAgICAgICAgZmluYWwgQ2xpZW50Q29uZmlnIGNsaWVudENvbmZpZyA9IG5ldyBDbGllbnRDb25maWcoKTsKKworICAgICAgICBmaW5hbCBBdG9taWNCb29sZWFuIGdldERlZmF1bHRTc2xDb250ZXh0Q2FsbGVkID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOworICAgICAgICBmaW5hbCBBdG9taWNSZWZlcmVuY2U8U1NMQ29udGV4dD4gcmV0dXJuZWRDb250ZXh0ID0gbmV3IEF0b21pY1JlZmVyZW5jZTxTU0xDb250ZXh0PihudWxsKTsKKworICAgICAgICBmaW5hbCBKZXJzZXlDbGllbnQgamVyc2V5Q2xpZW50ID0KKyAgICAgICAgICAgICAgICBuZXcgSmVyc2V5Q2xpZW50KGNsaWVudENvbmZpZywgKFVuc2FmZVZhbHVlPFNTTENvbnRleHQsIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbj4pIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBuZXcgRGVmYXVsdFNzbENvbnRleHRQcm92aWRlcigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBTU0xDb250ZXh0IGdldERlZmF1bHRTc2xDb250ZXh0KCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGVmYXVsdFNzbENvbnRleHRDYWxsZWQuc2V0KHRydWUpOworCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTU0xDb250ZXh0IGRlZmF1bHRTc2xDb250ZXh0ID0gU3NsQ29uZmlndXJhdG9yLmdldERlZmF1bHRDb250ZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZENvbnRleHQuc2V0KGRlZmF1bHRTc2xDb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWZhdWx0U3NsQ29udGV4dDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgIC8vIG1ha2Ugc3VyZSBjb250ZXh0IGlzIGNyZWF0ZWQKKyAgICAgICAgamVyc2V5Q2xpZW50LmdldFNzbENvbnRleHQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMocmV0dXJuZWRDb250ZXh0LmdldCgpLCBqZXJzZXlDbGllbnQuZ2V0U3NsQ29udGV4dCgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShnZXREZWZhdWx0U3NsQ29udGV4dENhbGxlZC5nZXQoKSk7CisgICAgICAgIGFzc2VydFRydWUoamVyc2V5Q2xpZW50LmlzRGVmYXVsdFNzbENvbnRleHQoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvRml4ZWRCb3VuZGFyeVBhcnNlclRlc3QuamF2YSBiL2NvcmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0ZpeGVkQm91bmRhcnlQYXJzZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZiOTU2ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0ZpeGVkQm91bmRhcnlQYXJzZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50OworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKKworLyoqCisgKiBUZXN0cyBzZXZlcmFsIHBhcnNpbmcgdXNlLWNhc2VzIG9mIENodW5rZWRJbnB1dAorICoKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICoqLworcHVibGljIGNsYXNzIEZpeGVkQm91bmRhcnlQYXJzZXJUZXN0IHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFTElNSVRFUl80ID0gIjEyMzQiOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMSU1JVEVSXzEgPSAiIyI7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGaXhlZEJvdW5kYXJ5UGFyc2VyTnVsbElucHV0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ2h1bmtQYXJzZXIgcGFyc2VyID0gQ2h1bmtlZElucHV0LmNyZWF0ZVBhcnNlcihERUxJTUlURVJfNCk7CisgICAgICAgIElucHV0U3RyZWFtIGlucHV0ID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlW10ge30pOworICAgICAgICBhc3NlcnROdWxsKHBhcnNlci5yZWFkQ2h1bmsoaW5wdXQpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGaXhlZEJvdW5kYXJ5UGFyc2VyRGVsaW1pdGVyNCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENodW5rUGFyc2VyIHBhcnNlciA9IENodW5rZWRJbnB1dC5jcmVhdGVQYXJzZXIoREVMSU1JVEVSXzQpOworCisgICAgICAgIC8vIGRlbGltaXRlciBpcyB0aGUgc2FtZSBjaGFyIHNlcXVlbmNlIGFzIGFuIGlucHV0CisgICAgICAgIGFzc2VydE51bGwocGFyc2UocGFyc2VyLCBERUxJTUlURVJfNCkpOworCisgICAgICAgIC8vIGlucHV0IHN0YXJ0cyB3aXRoIHRoZSBkZWxpbWl0ZXIKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxMjMiLCBwYXJzZShwYXJzZXIsIERFTElNSVRFUl80ICsgIjEyMyIpKTsKKworICAgICAgICAvLyBiZWdpbm5pbmcgb2YgdGhlIGlucHV0IGFuZCBkZWxpbWl0ZXIgYXJlIG5vdCB0aGUgc2FtZQorICAgICAgICBhc3NlcnRFcXVhbHMoImFiYyIsIHBhcnNlKHBhcnNlciwgImFiYyIgKyBERUxJTUlURVJfNCArICJkZWYiKSk7CisKKyAgICAgICAgLy8gZGVsaW1pdGVyIGluIHRoZSBpbnB1dCBpcyBub3QgY29tcGxldGUsIG9ubHkgcGFydGlhbAorICAgICAgICBhc3NlcnRFcXVhbHMoImFiYzEyMyIsIHBhcnNlKHBhcnNlciwgImFiYzEyMyIpKTsKKworICAgICAgICAvLyBkZWxpbWl0ZXIgaW4gdGhlIGlucHV0IGlzIG5vdCBjb21wbGV0ZSwgb25seSBwYXJ0aWFsLAorICAgICAgICAvLyBhbmQgdGhlbiBjb250aW51ZSB3aXRoIGEgY2hhciB3aGljaCBpcyBub3QgcGFydCBvZiB0aGUKKyAgICAgICAgLy8gZGVsaW1pdGVyCisgICAgICAgIGFzc2VydEVxdWFscygiYWJjMTIzNSIsIHBhcnNlKHBhcnNlciwgImFiYzEyMzUiKSk7CisKKyAgICAgICAgLy8gZGVsaW1pdGVyIGluIHRoZSBpbnB1dCBpcyBub3QgY29tcGxldGUsIG9ubHkgcGFydGlhbCwKKyAgICAgICAgLy8gYW5kIHRoZW4gY29udGludWUgd2l0aCBhIGNoYXIgd2hpY2ggaXMgcGFydCBvZiB0aGUKKyAgICAgICAgLy8gZGVsaW1pdGVyCisgICAgICAgIGFzc2VydEVxdWFscygiYWJjMTIzMSIsIHBhcnNlKHBhcnNlciwgImFiYzEyMzEiKSk7CisKKyAgICAgICAgLy8gaW5wdXQgaGFzIHRoZSBzYW1lIGJlZ2lubmluZyBhcyB0aGUgZGVsaW1pdGVyCisgICAgICAgIGFzc2VydEVxdWFscygiMTIiLCBwYXJzZShwYXJzZXIsICIxMjEyMzQiKSk7CisKKyAgICAgICAgLy8gaW5wdXQgZW5kcyB3aXRoIGZpcnN0IGNoYXIgb2YgZGVsaW1pdGVyCisgICAgICAgIGFzc2VydEVxdWFscygiMTIzMSIsIHBhcnNlKHBhcnNlciwgIjEyMzEiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rml4ZWRCb3VuZGFyeVBhcnNlckRlbGltaXRlcjEoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBDaHVua1BhcnNlciBwYXJzZXIgPSBDaHVua2VkSW5wdXQuY3JlYXRlUGFyc2VyKERFTElNSVRFUl8xKTsKKworICAgICAgICAvLyBkZWxpbWl0ZXIgaXMgdGhlIHNhbWUgY2hhciBzZXF1ZW5jZSBhcyBhbiBpbnB1dAorICAgICAgICBhc3NlcnROdWxsKHBhcnNlKHBhcnNlciwgREVMSU1JVEVSXzEpKTsKKworICAgICAgICAvLyBpbnB1dCBzdGFydHMgd2l0aCB0aGUgZGVsaW1pdGVyCisgICAgICAgIGFzc2VydEVxdWFscygiMTIzIiwgcGFyc2UocGFyc2VyLCBERUxJTUlURVJfMSArICIxMjMiKSk7CisKKyAgICAgICAgLy8gYmVnaW5uaW5nIG9mIHRoZSBpbnB1dCBhbmQgZGVsaW1pdGVyIGFyZSBub3QgdGhlIHNhbWUKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhYmMiLCBwYXJzZShwYXJzZXIsICJhYmMiICsgREVMSU1JVEVSXzEgKyAiZGVmIikpOworCisgICAgICAgIC8vIGRlbGltaXRlciBpbiB0aGUgaW5wdXQgaXMgbm90IGNvbXBsZXRlLCBvbmx5IHBhcnRpYWwKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhYmMxMjMiLCBwYXJzZShwYXJzZXIsICJhYmMxMjMiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBkZWxpbWl0ZXJXaXRoUmVwZWF0ZWRJbml0aWFsQ2hhcmFjdGVycygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIENodW5rUGFyc2VyIHBhcnNlciA9IENodW5rZWRJbnB1dC5jcmVhdGVQYXJzZXIoIioqYioqIik7CisgICAgICAgIGFzc2VydEVxdWFscygiMSoiLCBwYXJzZShwYXJzZXIsICIxKioqYioqIikpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBwYXJzZShDaHVua1BhcnNlciBwYXJzZXIsIFN0cmluZyBzdHIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIElucHV0U3RyZWFtIGlucHV0ID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHN0ci5nZXRCeXRlcygpKTsKKyAgICAgICAgYnl0ZVtdIGJ5dGVzID0gcGFyc2VyLnJlYWRDaHVuayhpbnB1dCk7CisgICAgICAgIHJldHVybiBieXRlcyA9PSBudWxsID8gbnVsbCA6IG5ldyBTdHJpbmcoYnl0ZXMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpeGVkQm91bmRhcnlQYXJzZXJGbG93KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ2h1bmtQYXJzZXIgcGFyc2VyID0gQ2h1bmtlZElucHV0LmNyZWF0ZVBhcnNlcihERUxJTUlURVJfNCk7CisKKyAgICAgICAgU3RyaW5nIGlucHV0ID0gImFiYyIgKyBERUxJTUlURVJfNCArICJlZGYiICsgREVMSU1JVEVSXzQgKyAiZ2hpIjsKKyAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGlucHV0LmdldEJ5dGVzKCkpOworCisgICAgICAgIGJ5dGVbXSBieXRlcyA9IHBhcnNlci5yZWFkQ2h1bmsoc3RyZWFtKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhYmMiLCBuZXcgU3RyaW5nKGJ5dGVzKSk7CisKKyAgICAgICAgYnl0ZXMgPSBwYXJzZXIucmVhZENodW5rKHN0cmVhbSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZWRmIiwgbmV3IFN0cmluZyhieXRlcykpOworCisgICAgICAgIGJ5dGVzID0gcGFyc2VyLnJlYWRDaHVuayhzdHJlYW0pOworICAgICAgICBhc3NlcnRFcXVhbHMoImdoaSIsIG5ldyBTdHJpbmcoYnl0ZXMpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGaXhlZEJvdW5kYXJ5UGFyc2VyRmxvd0RlbGltaXRlckZpcnN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ2h1bmtQYXJzZXIgcGFyc2VyID0gQ2h1bmtlZElucHV0LmNyZWF0ZVBhcnNlcihERUxJTUlURVJfNCk7CisKKyAgICAgICAgU3RyaW5nIGlucHV0ID0gREVMSU1JVEVSXzQgKyAiZWRmIiArIERFTElNSVRFUl80ICsgImdoaSI7CisgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShpbnB1dC5nZXRCeXRlcygpKTsKKworICAgICAgICBieXRlW10gYnl0ZXMgPSBwYXJzZXIucmVhZENodW5rKHN0cmVhbSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZWRmIiwgbmV3IFN0cmluZyhieXRlcykpOworCisgICAgICAgIGJ5dGVzID0gcGFyc2VyLnJlYWRDaHVuayhzdHJlYW0pOworICAgICAgICBhc3NlcnRFcXVhbHMoImdoaSIsIG5ldyBTdHJpbmcoYnl0ZXMpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGaXhlZEJvdW5kYXJ5UGFyc2VyRmxvd0RlbGltaXRlckVuZHMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBDaHVua1BhcnNlciBwYXJzZXIgPSBDaHVua2VkSW5wdXQuY3JlYXRlUGFyc2VyKERFTElNSVRFUl80KTsKKworICAgICAgICBTdHJpbmcgaW5wdXQgPSAiYWJjIiArIERFTElNSVRFUl80ICsgImVkZiIgKyBERUxJTUlURVJfNDsKKyAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGlucHV0LmdldEJ5dGVzKCkpOworCisgICAgICAgIGJ5dGVbXSBieXRlcyA9IHBhcnNlci5yZWFkQ2h1bmsoc3RyZWFtKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhYmMiLCBuZXcgU3RyaW5nKGJ5dGVzKSk7CisKKyAgICAgICAgYnl0ZXMgPSBwYXJzZXIucmVhZENodW5rKHN0cmVhbSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZWRmIiwgbmV3IFN0cmluZyhieXRlcykpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvRml4ZWRNdWx0aUJvdW5kYXJ5UGFyc2VyVGVzdC5qYXZhIGIvY29yZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvRml4ZWRNdWx0aUJvdW5kYXJ5UGFyc2VyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNmQ2YTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9GaXhlZE11bHRpQm91bmRhcnlQYXJzZXJUZXN0LmphdmEKQEAgLTAsMCArMSwyMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50OworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKKworLyoqCisgKiBUZXN0cyBzZXZlcmFsIHBhcnNpbmcgdXNlLWNhc2VzIG9mIENodW5rZWRJbnB1dAorICoKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICoqLworcHVibGljIGNsYXNzIEZpeGVkTXVsdGlCb3VuZGFyeVBhcnNlclRlc3QgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVMSU1JVEVSXzQgPSAiMTIzNCI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUxJTUlURVJfMSA9ICIjIjsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpeGVkQm91bmRhcnlQYXJzZXJOdWxsSW5wdXQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBDaHVua1BhcnNlciBwYXJzZXIgPSBDaHVua2VkSW5wdXQuY3JlYXRlTXVsdGlQYXJzZXIoREVMSU1JVEVSXzQpOworICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dCA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVtdIHt9KTsKKyAgICAgICAgYXNzZXJ0TnVsbChwYXJzZXIucmVhZENodW5rKGlucHV0KSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rml4ZWRCb3VuZGFyeVBhcnNlckRlbGltaXRlcjQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBDaHVua1BhcnNlciBwYXJzZXIgPSBDaHVua2VkSW5wdXQuY3JlYXRlTXVsdGlQYXJzZXIoREVMSU1JVEVSXzQpOworCisgICAgICAgIC8vIGRlbGltaXRlciBpcyB0aGUgc2FtZSBjaGFyIHNlcXVlbmNlIGFzIGFuIGlucHV0CisgICAgICAgIGFzc2VydE51bGwocGFyc2UocGFyc2VyLCBERUxJTUlURVJfNCkpOworCisgICAgICAgIC8vIGlucHV0IHN0YXJ0cyB3aXRoIHRoZSBkZWxpbWl0ZXIKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxMjMiLCBwYXJzZShwYXJzZXIsIERFTElNSVRFUl80ICsgIjEyMyIpKTsKKworICAgICAgICAvLyBiZWdpbm5pbmcgb2YgdGhlIGlucHV0IGFuZCBkZWxpbWl0ZXIgYXJlIG5vdCB0aGUgc2FtZQorICAgICAgICBhc3NlcnRFcXVhbHMoImFiYyIsIHBhcnNlKHBhcnNlciwgImFiYyIgKyBERUxJTUlURVJfNCArICJkZWYiKSk7CisKKyAgICAgICAgLy8gZGVsaW1pdGVyIGluIHRoZSBpbnB1dCBpcyBub3QgY29tcGxldGUsIG9ubHkgcGFydGlhbAorICAgICAgICBhc3NlcnRFcXVhbHMoImFiYzEyMyIsIHBhcnNlKHBhcnNlciwgImFiYzEyMyIpKTsKKworICAgICAgICAvLyBkZWxpbWl0ZXIgaW4gdGhlIGlucHV0IGlzIG5vdCBjb21wbGV0ZSwgb25seSBwYXJ0aWFsLAorICAgICAgICAvLyBhbmQgdGhlbiBjb250aW51ZSB3aXRoIGEgY2hhciB3aGljaCBpcyBub3QgcGFydCBvZiB0aGUKKyAgICAgICAgLy8gZGVsaW1pdGVyCisgICAgICAgIGFzc2VydEVxdWFscygiYWJjMTIzNSIsIHBhcnNlKHBhcnNlciwgImFiYzEyMzUiKSk7CisKKyAgICAgICAgLy8gZGVsaW1pdGVyIGluIHRoZSBpbnB1dCBpcyBub3QgY29tcGxldGUsIG9ubHkgcGFydGlhbCwKKyAgICAgICAgLy8gYW5kIHRoZW4gY29udGludWUgd2l0aCBhIGNoYXIgd2hpY2ggaXMgcGFydCBvZiB0aGUKKyAgICAgICAgLy8gZGVsaW1pdGVyCisgICAgICAgIGFzc2VydEVxdWFscygiYWJjMTIzMSIsIHBhcnNlKHBhcnNlciwgImFiYzEyMzEiKSk7CisKKyAgICAgICAgLy8gaW5wdXQgaGFzIHRoZSBzYW1lIGJlZ2lubmluZyBhcyB0aGUgZGVsaW1pdGVyCisgICAgICAgIGFzc2VydEVxdWFscygiMTIiLCBwYXJzZShwYXJzZXIsICIxMjEyMzQiKSk7CisKKyAgICAgICAgLy8gaW5wdXQgZW5kcyB3aXRoIGZpcnN0IGNoYXIgb2YgZGVsaW1pdGVyCisgICAgICAgIGFzc2VydEVxdWFscygiMTIzMSIsIHBhcnNlKHBhcnNlciwgIjEyMzEiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rml4ZWRCb3VuZGFyeVBhcnNlckRlbGltaXRlcjEoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBDaHVua1BhcnNlciBwYXJzZXIgPSBDaHVua2VkSW5wdXQuY3JlYXRlTXVsdGlQYXJzZXIoREVMSU1JVEVSXzEpOworCisgICAgICAgIC8vIGRlbGltaXRlciBpcyB0aGUgc2FtZSBjaGFyIHNlcXVlbmNlIGFzIGFuIGlucHV0CisgICAgICAgIGFzc2VydE51bGwocGFyc2UocGFyc2VyLCBERUxJTUlURVJfMSkpOworCisgICAgICAgIC8vIGlucHV0IHN0YXJ0cyB3aXRoIHRoZSBkZWxpbWl0ZXIKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxMjMiLCBwYXJzZShwYXJzZXIsIERFTElNSVRFUl8xICsgIjEyMyIpKTsKKworICAgICAgICAvLyBiZWdpbm5pbmcgb2YgdGhlIGlucHV0IGFuZCBkZWxpbWl0ZXIgYXJlIG5vdCB0aGUgc2FtZQorICAgICAgICBhc3NlcnRFcXVhbHMoImFiYyIsIHBhcnNlKHBhcnNlciwgImFiYyIgKyBERUxJTUlURVJfMSArICJkZWYiKSk7CisKKyAgICAgICAgLy8gZGVsaW1pdGVyIGluIHRoZSBpbnB1dCBpcyBub3QgY29tcGxldGUsIG9ubHkgcGFydGlhbAorICAgICAgICBhc3NlcnRFcXVhbHMoImFiYzEyMyIsIHBhcnNlKHBhcnNlciwgImFiYzEyMyIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGRlbGltaXRlcldpdGhSZXBlYXRlZEluaXRpYWxDaGFyYWN0ZXJzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQ2h1bmtQYXJzZXIgcGFyc2VyID0gQ2h1bmtlZElucHV0LmNyZWF0ZU11bHRpUGFyc2VyKCIqKmIqKiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEqIiwgcGFyc2UocGFyc2VyLCAiMSoqKmIqKiIpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcGFyc2UoQ2h1bmtQYXJzZXIgcGFyc2VyLCBTdHJpbmcgc3RyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dCA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShzdHIuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIGJ5dGVbXSBieXRlcyA9IHBhcnNlci5yZWFkQ2h1bmsoaW5wdXQpOworICAgICAgICByZXR1cm4gYnl0ZXMgPT0gbnVsbCA/IG51bGwgOiBuZXcgU3RyaW5nKGJ5dGVzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGaXhlZEJvdW5kYXJ5UGFyc2VyRmxvdygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENodW5rUGFyc2VyIHBhcnNlciA9IENodW5rZWRJbnB1dC5jcmVhdGVNdWx0aVBhcnNlcihERUxJTUlURVJfNCk7CisKKyAgICAgICAgU3RyaW5nIGlucHV0ID0gImFiYyIgKyBERUxJTUlURVJfNCArICJlZGYiICsgREVMSU1JVEVSXzQgKyAiZ2hpIjsKKyAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGlucHV0LmdldEJ5dGVzKCkpOworCisgICAgICAgIGJ5dGVbXSBieXRlcyA9IHBhcnNlci5yZWFkQ2h1bmsoc3RyZWFtKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhYmMiLCBuZXcgU3RyaW5nKGJ5dGVzKSk7CisKKyAgICAgICAgYnl0ZXMgPSBwYXJzZXIucmVhZENodW5rKHN0cmVhbSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZWRmIiwgbmV3IFN0cmluZyhieXRlcykpOworCisgICAgICAgIGJ5dGVzID0gcGFyc2VyLnJlYWRDaHVuayhzdHJlYW0pOworICAgICAgICBhc3NlcnRFcXVhbHMoImdoaSIsIG5ldyBTdHJpbmcoYnl0ZXMpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGaXhlZEJvdW5kYXJ5UGFyc2VyRmxvd0RlbGltaXRlckZpcnN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ2h1bmtQYXJzZXIgcGFyc2VyID0gQ2h1bmtlZElucHV0LmNyZWF0ZU11bHRpUGFyc2VyKERFTElNSVRFUl80KTsKKworICAgICAgICBTdHJpbmcgaW5wdXQgPSBERUxJTUlURVJfNCArICJlZGYiICsgREVMSU1JVEVSXzQgKyAiZ2hpIjsKKyAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGlucHV0LmdldEJ5dGVzKCkpOworCisgICAgICAgIGJ5dGVbXSBieXRlcyA9IHBhcnNlci5yZWFkQ2h1bmsoc3RyZWFtKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJlZGYiLCBuZXcgU3RyaW5nKGJ5dGVzKSk7CisKKyAgICAgICAgYnl0ZXMgPSBwYXJzZXIucmVhZENodW5rKHN0cmVhbSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZ2hpIiwgbmV3IFN0cmluZyhieXRlcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpeGVkQm91bmRhcnlQYXJzZXJGbG93RGVsaW1pdGVyRW5kcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENodW5rUGFyc2VyIHBhcnNlciA9IENodW5rZWRJbnB1dC5jcmVhdGVNdWx0aVBhcnNlcihERUxJTUlURVJfNCk7CisKKyAgICAgICAgU3RyaW5nIGlucHV0ID0gImFiYyIgKyBERUxJTUlURVJfNCArICJlZGYiICsgREVMSU1JVEVSXzQ7CisgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShpbnB1dC5nZXRCeXRlcygpKTsKKworICAgICAgICBieXRlW10gYnl0ZXMgPSBwYXJzZXIucmVhZENodW5rKHN0cmVhbSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYWJjIiwgbmV3IFN0cmluZyhieXRlcykpOworCisgICAgICAgIGJ5dGVzID0gcGFyc2VyLnJlYWRDaHVuayhzdHJlYW0pOworICAgICAgICBhc3NlcnRFcXVhbHMoImVkZiIsIG5ldyBTdHJpbmcoYnl0ZXMpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aUZpeGVkQm91bmRhcnlQYXJzZXJDUkxGKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ2h1bmtQYXJzZXIgcGFyc2VyID0gQ2h1bmtlZElucHV0LmNyZWF0ZU11bHRpUGFyc2VyKCJcblxuIiwgIlxyXG5cclxuIik7CisKKyAgICAgICAgU3RyaW5nIGlucHV0ID0gImFiYyIgKyAiXHJcblxyXG4iICsgImVkZiIgKyAiXHJcblxyXG4iOworICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oaW5wdXQuZ2V0Qnl0ZXMoKSk7CisKKyAgICAgICAgYnl0ZVtdIGJ5dGVzID0gcGFyc2VyLnJlYWRDaHVuayhzdHJlYW0pOworICAgICAgICBhc3NlcnRFcXVhbHMoImFiYyIsIG5ldyBTdHJpbmcoYnl0ZXMpKTsKKworICAgICAgICBieXRlcyA9IHBhcnNlci5yZWFkQ2h1bmsoc3RyZWFtKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJlZGYiLCBuZXcgU3RyaW5nKGJ5dGVzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlGaXhlZEJvdW5kYXJ5UGFyc2VyQ1JMRlN0YXJ0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ2h1bmtQYXJzZXIgcGFyc2VyID0gQ2h1bmtlZElucHV0LmNyZWF0ZU11bHRpUGFyc2VyKCJcblxuIiwgIlxyXG5cclxuIik7CisKKyAgICAgICAgU3RyaW5nIGlucHV0ID0gIlxyXG5cclxuIiArICJlZGYiICsgIlxyXG5cclxuIjsKKyAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGlucHV0LmdldEJ5dGVzKCkpOworCisgICAgICAgIGJ5dGVbXSBieXRlcyA9IHBhcnNlci5yZWFkQ2h1bmsoc3RyZWFtKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJlZGYiLCBuZXcgU3RyaW5nKGJ5dGVzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlGaXhlZEJvdW5kYXJ5UGFyc2VyTEYoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBDaHVua1BhcnNlciBwYXJzZXIgPSBDaHVua2VkSW5wdXQuY3JlYXRlTXVsdGlQYXJzZXIoIlxuXG4iLCAiXHJcblxyXG4iKTsKKworICAgICAgICBTdHJpbmcgaW5wdXQgPSAiXG5cbiIgKyAiYWJjIiArICJcblxuIjsKKyAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGlucHV0LmdldEJ5dGVzKCkpOworCisgICAgICAgIGJ5dGVbXSBieXRlcyA9IHBhcnNlci5yZWFkQ2h1bmsoc3RyZWFtKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhYmMiLCBuZXcgU3RyaW5nKGJ5dGVzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlGaXhlZEJvdW5kYXJ5UGFyc2VyQ1JMRndpdGhMRigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENodW5rUGFyc2VyIHBhcnNlciA9IENodW5rZWRJbnB1dC5jcmVhdGVNdWx0aVBhcnNlcigiXG5cbiIsICJcclxuXHJcbiIpOworCisgICAgICAgIFN0cmluZyBpbnB1dCA9ICJhYmMiICsgIlxyXG5cclxuIiArICJlZGYiICsgIlxuXG4iICsgImdoaSI7CisgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShpbnB1dC5nZXRCeXRlcygpKTsKKworICAgICAgICBieXRlW10gYnl0ZXMgPSBwYXJzZXIucmVhZENodW5rKHN0cmVhbSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYWJjIiwgbmV3IFN0cmluZyhieXRlcykpOworCisgICAgICAgIGJ5dGVzID0gcGFyc2VyLnJlYWRDaHVuayhzdHJlYW0pOworICAgICAgICBhc3NlcnRFcXVhbHMoImVkZiIsIG5ldyBTdHJpbmcoYnl0ZXMpKTsKKworICAgICAgICBieXRlcyA9IHBhcnNlci5yZWFkQ2h1bmsoc3RyZWFtKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnaGkiLCBuZXcgU3RyaW5nKGJ5dGVzKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9IdHRwVXJsQ29ubmVjdG9yVGVzdC5qYXZhIGIvY29yZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvSHR0cFVybENvbm5lY3RvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2Q5MTIxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvSHR0cFVybENvbm5lY3RvclRlc3QuamF2YQpAQCAtMCwwICsxLDc4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS5uZXQuUHJvdG9jb2xFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuU29ja2V0VGltZW91dEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUGVybWlzc2lvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuSW52b2NhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5MaW5rOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC5uZXQuc3NsLkhvc3RuYW1lVmVyaWZpZXI7CitpbXBvcnQgamF2YXgubmV0LnNzbC5IdHRwc1VSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YXgubmV0LnNzbC5TU0xQZWVyVW52ZXJpZmllZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLlNTTFNvY2tldEZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuaW50ZXJuYWwuSHR0cFVybENvbm5lY3RvcjsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVmFyaW91cyB0ZXN0cyBmb3IgdGhlIGRlZmF1bHQgY2xpZW50IGNvbm5lY3Rvci4KKyAqCisgKiBAYXV0aG9yIENhcmxvIFBlbGxlZ3JpbmkKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsKKyAqLworcHVibGljIGNsYXNzIEh0dHBVcmxDb25uZWN0b3JUZXN0IHsKKworICAgIC8vIHRoZXJlIGlzIGFib3V0IDMwIG1zIG92ZXJoZWFkIG9uIG15IGxhcHRvcCwgNTAwIG1zIHNob3VsZCBiZSBzYWZlCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgVGltZW91dEJBU0UgPSA1MDA7CisKKyAgICAvKioKKyAgICAgKiBSZXByb2R1Y2VyIGZvciBKRVJTRVktMTk4NC4KKyAgICAgKiBUT0RPOiBmaXggYW5kIHJlLWVuYWJsZSB0aGUgdGVzdCwgaXQgY291bGQgZ2l2ZSBqYXZhLm5ldC5Ob1JvdXRlVG9Ib3N0RXhjZXB0aW9uIGluIGNlcnRhaW4gZW52aXJvbm1lbnRzIGluc3RlYWQgb2YgdGltZW91dCBleGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIEBJZ25vcmUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdGlvblRpbWVvdXRXaXRoRW50aXR5KCkgeworICAgICAgICBfdGVzdEludm9jYXRpb25UaW1lb3V0KGNyZWF0ZU5vblJvdXRhYmxlVGFyZ2V0KCkucmVxdWVzdCgpLmJ1aWxkUG9zdChFbnRpdHkudGV4dCgiZG9lcyBub3QgbWF0dGVyIikpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRpdGlvbmFsIHRlc3QgY2FzZSBmb3IgSkVSU0VZLTE5ODQgdG8gZW5zdXJlLCB0aGF0IHRoZSBlcnJvciBvY2N1cnMgb25seSB3aGVuIHNlbmRpbmcgYW4gZW50aXR5LgorICAgICAqIFRPRE86IHNlZSBhYm92ZSwgcmV3cml0ZSBzZXJ2ZXIgcGFydCwgdGhlICJub24tcm91dGFibGUiIHRhcmdldCBzb2x1dGlvbiBpcyBmcmFnaWxlCisgICAgICovCisgICAgQFRlc3QKKyAgICBASWdub3JlCisgICAgcHVibGljIHZvaWQgdGVzdENvbm5lY3Rpb25UaW1lb3V0Tm9FbnRpdHkoKSB7CisgICAgICAgIF90ZXN0SW52b2NhdGlvblRpbWVvdXQoY3JlYXRlTm9uUm91dGFibGVUYXJnZXQoKS5yZXF1ZXN0KCkuYnVpbGRHZXQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcm9kdWNlciBmb3IgSkVSU0VZLTE2MTEuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZWRSZXF1ZXN0VXJpKCkgeworICAgICAgICBIdHRwVXJsQ29ubmVjdG9yUHJvdmlkZXIuQ29ubmVjdGlvbkZhY3RvcnkgZmFjdG9yeSA9IG5ldyBIdHRwVXJsQ29ubmVjdG9yUHJvdmlkZXIuQ29ubmVjdGlvbkZhY3RvcnkoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBIdHRwVVJMQ29ubmVjdGlvbiBnZXRDb25uZWN0aW9uKFVSTCBlbmRwb2ludFVybCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBIdHRwVVJMQ29ubmVjdGlvbiByZXN1bHQgPSAoSHR0cFVSTENvbm5lY3Rpb24pIGVuZHBvaW50VXJsLm9wZW5Db25uZWN0aW9uKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBSZWRpcmVjdGVkSHR0cChyZXN1bHQpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBKZXJzZXlDbGllbnQgY2xpZW50ID0gbmV3IEplcnNleUNsaWVudEJ1aWxkZXIoKS5idWlsZCgpOworCisgICAgICAgIENsaWVudFJlcXVlc3QgcmVxdWVzdCA9IGNsaWVudC50YXJnZXQoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCIpLnJlcXVlc3QoKS5idWlsZEdldCgpLnJlcXVlc3QoKTsKKyAgICAgICAgZmluYWwgSHR0cFVybENvbm5lY3RvclByb3ZpZGVyIGNvbm5lY3RvclByb3ZpZGVyID0gbmV3IEh0dHBVcmxDb25uZWN0b3JQcm92aWRlcigpLmNvbm5lY3Rpb25GYWN0b3J5KGZhY3RvcnkpOworICAgICAgICBIdHRwVXJsQ29ubmVjdG9yIGNvbm5lY3RvciA9IChIdHRwVXJsQ29ubmVjdG9yKSBjb25uZWN0b3JQcm92aWRlci5nZXRDb25uZWN0b3IoY2xpZW50LCBjbGllbnQuZ2V0Q29uZmlndXJhdGlvbigpKTsKKyAgICAgICAgQ2xpZW50UmVzcG9uc2UgcmVzID0gY29ubmVjdG9yLmFwcGx5KHJlcXVlc3QpOworICAgICAgICBhc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwIiksIHJlcy5nZXRSZXF1ZXN0Q29udGV4dCgpLmdldFVyaSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9yZWRpcmVjdGVkLm9yZzo4MDgwL3JlZGlyZWN0ZWQiKSwgcmVzLmdldFJlc29sdmVkUmVxdWVzdFVyaSgpKTsKKworCisgICAgICAgIHJlcy5nZXRIZWFkZXJzKCkucHV0U2luZ2xlKEh0dHBIZWFkZXJzLkxJTkssIExpbmsuZnJvbVBhdGgoImFjdGlvbiIpLnJlbCgidGVzdCIpLmJ1aWxkKCkudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vcmVkaXJlY3RlZC5vcmc6ODA4MC9hY3Rpb24iKSwgcmVzLmdldExpbmsoInRlc3QiKS5nZXRVcmkoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBIdHRwVVJMQ29ubmVjdGlvbiB3cmFwUmVkaXJlY3RlZEh0dHAoZmluYWwgSHR0cFVSTENvbm5lY3Rpb24gY29ubmVjdGlvbikgeworICAgICAgICBpZiAoY29ubmVjdGlvbiBpbnN0YW5jZW9mIEh0dHBzVVJMQ29ubmVjdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb247CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3IEh0dHBVUkxDb25uZWN0aW9uKGNvbm5lY3Rpb24uZ2V0VVJMKCkpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgVVJMIGdldFVSTCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdXJsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0UmVzcG9uc2VDb2RlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAvLyBQcmV0ZW5kIHdlIHJlZGlyZWN0ZWQgZm9yIHRlc3RSZWRpcmVjdGlvbgorICAgICAgICAgICAgICAgIHVybCA9IG5ldyBVUkwoImh0dHA6Ly9yZWRpcmVjdGVkLm9yZzo4MDgwL3JlZGlyZWN0ZWQiKTsKKyAgICAgICAgICAgICAgICAvLyBhbmQgZmFrZSB0aGUgc3RhdHVzIGNvZGUgdG8gcHJldmVudCBhY3R1YWwgY29ubmVjdGlvbgorICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5TdGF0dXMuTk9fQ09OVEVOVC5nZXRTdGF0dXNDb2RlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRSZXNwb25zZU1lc3NhZ2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5TdGF0dXMuTk9fQ09OVEVOVC5nZXRSZWFzb25QaHJhc2UoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWdub3JlZCBmb3IgY29tcGF0aWJpbGl0eSBvbiBqYXZhNgorICAgICAgICAgICAgLy8gQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgbG9uZyBnZXRDb250ZW50TGVuZ3RoTG9uZygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbi5nZXRDb250ZW50TGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgLy8gSWdub3JlZCBmb3IgY29tcGF0aWJpbGl0eSBvbiBqYXZhNgorICAgICAgICAgICAgICAgIC8vIHJldHVybiBkZWxlZ2F0ZS5nZXRDb250ZW50TGVuZ3RoTG9uZygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJZ25vcmVkIGZvciBjb21wYXRpYmlsaXR5IG9uIGphdmE2CisgICAgICAgICAgICAvLyBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBsb25nIGdldEhlYWRlckZpZWxkTG9uZyhTdHJpbmcgbmFtZSwgbG9uZyBEZWZhdWx0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24uZ2V0SGVhZGVyRmllbGRJbnQobmFtZSwgKGludCkgRGVmYXVsdCk7CisgICAgICAgICAgICAgICAgLy8gSWdub3JlZCBmb3IgY29tcGF0aWJpbGl0eSBvbiBqYXZhNgorICAgICAgICAgICAgICAgIC8vIHJldHVybiBkZWxlZ2F0ZS5nZXRIZWFkZXJGaWVsZExvbmcobmFtZSwgRGVmYXVsdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIElnbm9yZWQgZm9yIGNvbXBhdGliaWxpdHkgb24gamF2YTYKKyAgICAgICAgICAgIC8vIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0Rml4ZWRMZW5ndGhTdHJlYW1pbmdNb2RlKGxvbmcgY29udGVudExlbmd0aCkgeworICAgICAgICAgICAgICAgIC8vIElnbm9yZWQgZm9yIGNvbXBhdGliaWxpdHkgb24gamF2YTYKKyAgICAgICAgICAgICAgICAvLyBkZWxlZ2F0ZS5zZXRGaXhlZExlbmd0aFN0cmVhbWluZ01vZGUoY29udGVudExlbmd0aCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0SW5zdGFuY2VGb2xsb3dSZWRpcmVjdHMoYm9vbGVhbiBmb2xsb3dSZWRpcmVjdHMpIHsKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnNldEluc3RhbmNlRm9sbG93UmVkaXJlY3RzKGZvbGxvd1JlZGlyZWN0cyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZ2V0SW5zdGFuY2VGb2xsb3dSZWRpcmVjdHMoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24uZ2V0SW5zdGFuY2VGb2xsb3dSZWRpcmVjdHMoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0TWV0aG9kKFN0cmluZyBtZXRob2QpIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0TWV0aG9kKG1ldGhvZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRSZXF1ZXN0TWV0aG9kKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLmdldFJlcXVlc3RNZXRob2QoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgbG9uZyBnZXRIZWFkZXJGaWVsZERhdGUoU3RyaW5nIG5hbWUsIGxvbmcgRGVmYXVsdCkgeworICAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLmdldEhlYWRlckZpZWxkRGF0ZShuYW1lLCBEZWZhdWx0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBkaXNjb25uZWN0KCkgeworICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uZGlzY29ubmVjdCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHVzaW5nUHJveHkoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24udXNpbmdQcm94eSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBQZXJtaXNzaW9uIGdldFBlcm1pc3Npb24oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLmdldFBlcm1pc3Npb24oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0RXJyb3JTdHJlYW0oKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24uZ2V0RXJyb3JTdHJlYW0oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEhlYWRlckZpZWxkKGludCBuKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24uZ2V0SGVhZGVyRmllbGQobik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0Q2h1bmtlZFN0cmVhbWluZ01vZGUoaW50IGNodW5rbGVuKSB7CisgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5zZXRDaHVua2VkU3RyZWFtaW5nTW9kZShjaHVua2xlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0Rml4ZWRMZW5ndGhTdHJlYW1pbmdNb2RlKGludCBjb250ZW50TGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5zZXRGaXhlZExlbmd0aFN0cmVhbWluZ01vZGUoY29udGVudExlbmd0aCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRIZWFkZXJGaWVsZEtleShpbnQgbikgeworICAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLmdldEhlYWRlckZpZWxkS2V5KG4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbm5lY3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uY29ubmVjdCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldENvbm5lY3RUaW1lb3V0KGludCB0aW1lb3V0KSB7CisgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5zZXRDb25uZWN0VGltZW91dCh0aW1lb3V0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgaW50IGdldENvbm5lY3RUaW1lb3V0KCkgeworICAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLmdldENvbm5lY3RUaW1lb3V0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0UmVhZFRpbWVvdXQoaW50IHRpbWVvdXQpIHsKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnNldFJlYWRUaW1lb3V0KHRpbWVvdXQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0UmVhZFRpbWVvdXQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24uZ2V0UmVhZFRpbWVvdXQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgaW50IGdldENvbnRlbnRMZW5ndGgoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24uZ2V0Q29udGVudExlbmd0aCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24uZ2V0Q29udGVudFR5cGUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRFbmNvZGluZygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbi5nZXRDb250ZW50RW5jb2RpbmcoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgbG9uZyBnZXRFeHBpcmF0aW9uKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLmdldEV4cGlyYXRpb24oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgbG9uZyBnZXREYXRlKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLmdldERhdGUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgbG9uZyBnZXRMYXN0TW9kaWZpZWQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24uZ2V0TGFzdE1vZGlmaWVkKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRIZWFkZXJGaWVsZChTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLmdldEhlYWRlckZpZWxkKG5hbWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGdldEhlYWRlckZpZWxkcygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbi5nZXRIZWFkZXJGaWVsZHMoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgaW50IGdldEhlYWRlckZpZWxkSW50KFN0cmluZyBuYW1lLCBpbnQgRGVmYXVsdCkgeworICAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLmdldEhlYWRlckZpZWxkSW50KG5hbWUsIERlZmF1bHQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udGVudCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24uZ2V0Q29udGVudCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udGVudChDbGFzc1tdIGNsYXNzZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24uZ2V0Q29udGVudChjbGFzc2VzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLmdldElucHV0U3RyZWFtKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24udG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXREb0lucHV0KGJvb2xlYW4gZG9pbnB1dCkgeworICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uc2V0RG9JbnB1dChkb2lucHV0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBnZXREb0lucHV0KCkgeworICAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLmdldERvSW5wdXQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXREb091dHB1dChib29sZWFuIGRvb3V0cHV0KSB7CisgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5zZXREb091dHB1dChkb291dHB1dCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZ2V0RG9PdXRwdXQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24uZ2V0RG9PdXRwdXQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRBbGxvd1VzZXJJbnRlcmFjdGlvbihib29sZWFuIGFsbG93dXNlcmludGVyYWN0aW9uKSB7CisgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5zZXRBbGxvd1VzZXJJbnRlcmFjdGlvbihhbGxvd3VzZXJpbnRlcmFjdGlvbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZ2V0QWxsb3dVc2VySW50ZXJhY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24uZ2V0QWxsb3dVc2VySW50ZXJhY3Rpb24oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRVc2VDYWNoZXMoYm9vbGVhbiB1c2VjYWNoZXMpIHsKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnNldFVzZUNhY2hlcyh1c2VjYWNoZXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGdldFVzZUNhY2hlcygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbi5nZXRVc2VDYWNoZXMoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRJZk1vZGlmaWVkU2luY2UobG9uZyBpZm1vZGlmaWVkc2luY2UpIHsKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnNldElmTW9kaWZpZWRTaW5jZShpZm1vZGlmaWVkc2luY2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBsb25nIGdldElmTW9kaWZpZWRTaW5jZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbi5nZXRJZk1vZGlmaWVkU2luY2UoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBnZXREZWZhdWx0VXNlQ2FjaGVzKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLmdldERlZmF1bHRVc2VDYWNoZXMoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0VXNlQ2FjaGVzKGJvb2xlYW4gZGVmYXVsdHVzZWNhY2hlcykgeworICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uc2V0RGVmYXVsdFVzZUNhY2hlcyhkZWZhdWx0dXNlY2FjaGVzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0UHJvcGVydHkoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0UHJvcGVydHkoa2V5LCB2YWx1ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgYWRkUmVxdWVzdFByb3BlcnR5KFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uYWRkUmVxdWVzdFByb3BlcnR5KGtleSwgdmFsdWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdFByb3BlcnR5KFN0cmluZyBrZXkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbi5nZXRSZXF1ZXN0UHJvcGVydHkoa2V5KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBnZXRSZXF1ZXN0UHJvcGVydGllcygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbi5nZXRSZXF1ZXN0UHJvcGVydGllcygpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0SW52b2NhdGlvblRpbWVvdXQoSW52b2NhdGlvbiBpbnZvY2F0aW9uKSB7CisKKyAgICAgICAgZmluYWwgbG9uZyBzdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnZvY2F0aW9uLmludm9rZSgpOworCisgICAgICAgICAgICBBc3NlcnQuZmFpbCgiVGltZW91dCBleHBlY3RlZCEiKTsKKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiQmFkIGV4Y2VwdGlvbiwgJXMsIGNhdWdodCEgVGltZW91dCBleHBlY3RlZC4iLCBleC5nZXRDYXVzZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgZXguZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIFNvY2tldFRpbWVvdXRFeGNlcHRpb24pOworCisgICAgICAgICAgICBmaW5hbCBsb25nIHN0b3AgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIGxvbmcgdGltZSA9IHN0b3AgLSBzdGFydDsKKworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCisgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAiQWN0dWFsIHRpbWUsICVkIG1zLCBzaG91bGQgbm90IGJlIG1vcmUgdGhhbiB0d2ljZSBhcyBsb25nZXIgYXMgdGhlIG9yaWdpbmFsIHRpbWVvdXQsICVkIG1zIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lb3V0QkFTRSksCisgICAgICAgICAgICAgICB0aW1lIDwgMiAqIFRpbWVvdXRCQVNFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgU1NMIGNvbm5lY3Rpb24uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U1NMQ29ubmVjdGlvbigpIHsKKyAgICAgICAgSmVyc2V5Q2xpZW50IGNsaWVudCA9IG5ldyBKZXJzZXlDbGllbnRCdWlsZGVyKCkuYnVpbGQoKTsKKyAgICAgICAgQ2xpZW50UmVxdWVzdCByZXF1ZXN0ID0gY2xpZW50LnRhcmdldCgiaHR0cHM6Ly9sb2NhbGhvc3Q6ODA4MCIpLnJlcXVlc3QoKS5idWlsZEdldCgpLnJlcXVlc3QoKTsKKyAgICAgICAgSHR0cFVybENvbm5lY3RvclByb3ZpZGVyLkNvbm5lY3Rpb25GYWN0b3J5IGZhY3RvcnkgPSBuZXcgSHR0cFVybENvbm5lY3RvclByb3ZpZGVyLkNvbm5lY3Rpb25GYWN0b3J5KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgSHR0cFVSTENvbm5lY3Rpb24gZ2V0Q29ubmVjdGlvbihVUkwgZW5kcG9pbnRVcmwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgSHR0cFVSTENvbm5lY3Rpb24gcmVzdWx0ID0gKEh0dHBVUkxDb25uZWN0aW9uKSBlbmRwb2ludFVybC5vcGVuQ29ubmVjdGlvbigpOworICAgICAgICAgICAgICAgIHJldHVybiB3cmFwTm9Db250ZW50SHR0cHMocmVzdWx0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgZmluYWwgSHR0cFVybENvbm5lY3RvclByb3ZpZGVyIGNvbm5lY3RvclByb3ZpZGVyID0gbmV3IEh0dHBVcmxDb25uZWN0b3JQcm92aWRlcigpLmNvbm5lY3Rpb25GYWN0b3J5KGZhY3RvcnkpOworICAgICAgICBIdHRwVXJsQ29ubmVjdG9yIGNvbm5lY3RvciA9IChIdHRwVXJsQ29ubmVjdG9yKSBjb25uZWN0b3JQcm92aWRlci5nZXRDb25uZWN0b3IoY2xpZW50LCBjbGllbnQuZ2V0Q29uZmlndXJhdGlvbigpKTsKKyAgICAgICAgQ2xpZW50UmVzcG9uc2UgcmVzID0gY29ubmVjdG9yLmFwcGx5KHJlcXVlc3QpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmVzcG9uc2UuU3RhdHVzLk5PX0NPTlRFTlQuZ2V0U3RhdHVzQ29kZSgpLCByZXMuZ2V0U3RhdHVzSW5mbygpLmdldFN0YXR1c0NvZGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSZXNwb25zZS5TdGF0dXMuTk9fQ09OVEVOVC5nZXRSZWFzb25QaHJhc2UoKSwgcmVzLmdldFN0YXR1c0luZm8oKS5nZXRSZWFzb25QaHJhc2UoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBIdHRwVVJMQ29ubmVjdGlvbiB3cmFwTm9Db250ZW50SHR0cHMoZmluYWwgSHR0cFVSTENvbm5lY3Rpb24gcmVzdWx0KSB7CisgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBIdHRwc1VSTENvbm5lY3Rpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSHR0cHNVUkxDb25uZWN0aW9uKHJlc3VsdC5nZXRVUkwoKSkgeworICAgICAgICAgICAgICAgIHByaXZhdGUgZmluYWwgSHR0cHNVUkxDb25uZWN0aW9uIGRlbGVnYXRlID0gKEh0dHBzVVJMQ29ubmVjdGlvbikgcmVzdWx0OworCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGludCBnZXRSZXNwb25zZUNvZGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2UuU3RhdHVzLk5PX0NPTlRFTlQuZ2V0U3RhdHVzQ29kZSgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzcG9uc2VNZXNzYWdlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLlN0YXR1cy5OT19DT05URU5ULmdldFJlYXNvblBocmFzZSgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIElnbm9yZWQgZm9yIGNvbXBhdGliaWxpdHkgb24gamF2YTYKKyAgICAgICAgICAgICAgICAvLyBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgbG9uZyBnZXRDb250ZW50TGVuZ3RoTG9uZygpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldENvbnRlbnRMZW5ndGgoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlZCBmb3IgY29tcGF0aWJpbGl0eSBvbiBqYXZhNgorICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gZGVsZWdhdGUuZ2V0Q29udGVudExlbmd0aExvbmcoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBJZ25vcmVkIGZvciBjb21wYXRpYmlsaXR5IG9uIGphdmE2CisgICAgICAgICAgICAgICAgLy8gQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGxvbmcgZ2V0SGVhZGVyRmllbGRMb25nKFN0cmluZyBuYW1lLCBsb25nIERlZmF1bHQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldEhlYWRlckZpZWxkSW50KG5hbWUsIChpbnQpIERlZmF1bHQpOworICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmVkIGZvciBjb21wYXRpYmlsaXR5IG9uIGphdmE2CisgICAgICAgICAgICAgICAgICAgIC8vIHJldHVybiBkZWxlZ2F0ZS5nZXRIZWFkZXJGaWVsZExvbmcobmFtZSwgRGVmYXVsdCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gSWdub3JlZCBmb3IgY29tcGF0aWJpbGl0eSBvbiBqYXZhNgorICAgICAgICAgICAgICAgIC8vIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldEZpeGVkTGVuZ3RoU3RyZWFtaW5nTW9kZShsb25nIGNvbnRlbnRMZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlZCBmb3IgY29tcGF0aWJpbGl0eSBvbiBqYXZhNgorICAgICAgICAgICAgICAgICAgICAvLyBkZWxlZ2F0ZS5zZXRGaXhlZExlbmd0aFN0cmVhbWluZ01vZGUoY29udGVudExlbmd0aCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRIZWFkZXJGaWVsZEtleShpbnQgbikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0SGVhZGVyRmllbGRLZXkobik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRIZWFkZXJGaWVsZChpbnQgbikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0SGVhZGVyRmllbGQobik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY29ubmVjdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlLmNvbm5lY3QoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBnZXRJbnN0YW5jZUZvbGxvd1JlZGlyZWN0cygpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldEluc3RhbmNlRm9sbG93UmVkaXJlY3RzKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGludCBnZXRDb25uZWN0VGltZW91dCgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldENvbm5lY3RUaW1lb3V0KCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGludCBnZXRDb250ZW50TGVuZ3RoKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0Q29udGVudExlbmd0aCgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudFR5cGUoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRDb250ZW50VHlwZSgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBsb25nIGdldEhlYWRlckZpZWxkRGF0ZShTdHJpbmcgbmFtZSwgbG9uZyBEZWZhdWx0KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRIZWFkZXJGaWVsZERhdGUobmFtZSwgRGVmYXVsdCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50RW5jb2RpbmcoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRDb250ZW50RW5jb2RpbmcoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBkaXNjb25uZWN0KCkgeworICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZS5kaXNjb25uZWN0KCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGxvbmcgZ2V0RXhwaXJhdGlvbigpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldEV4cGlyYXRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgbG9uZyBnZXREYXRlKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0RGF0ZSgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRFcnJvclN0cmVhbSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldEVycm9yU3RyZWFtKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGxvbmcgZ2V0TGFzdE1vZGlmaWVkKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0TGFzdE1vZGlmaWVkKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRIZWFkZXJGaWVsZChTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0SGVhZGVyRmllbGQobmFtZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZ2V0SGVhZGVyRmllbGRzKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0SGVhZGVyRmllbGRzKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGludCBnZXRIZWFkZXJGaWVsZEludChTdHJpbmcgbmFtZSwgaW50IERlZmF1bHQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldEhlYWRlckZpZWxkSW50KG5hbWUsIERlZmF1bHQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udGVudCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRDb250ZW50KCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBnZXRDb250ZW50KEBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpIENsYXNzW10gY2xhc3NlcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldENvbnRlbnQoY2xhc3Nlcyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldElucHV0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZ2V0RG9JbnB1dCgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldERvSW5wdXQoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBnZXREb091dHB1dCgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldERvT3V0cHV0KCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZ2V0QWxsb3dVc2VySW50ZXJhY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRBbGxvd1VzZXJJbnRlcmFjdGlvbigpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFkZFJlcXVlc3RQcm9wZXJ0eShTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGUuYWRkUmVxdWVzdFByb3BlcnR5KGtleSwgdmFsdWUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2lwaGVyU3VpdGUoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRDaXBoZXJTdWl0ZSgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGdldERlZmF1bHRVc2VDYWNoZXMoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXREZWZhdWx0VXNlQ2FjaGVzKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIEhvc3RuYW1lVmVyaWZpZXIgZ2V0SG9zdG5hbWVWZXJpZmllcigpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldEhvc3RuYW1lVmVyaWZpZXIoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgbG9uZyBnZXRJZk1vZGlmaWVkU2luY2UoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRJZk1vZGlmaWVkU2luY2UoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgQ2VydGlmaWNhdGVbXSBnZXRMb2NhbENlcnRpZmljYXRlcygpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldExvY2FsQ2VydGlmaWNhdGVzKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIFByaW5jaXBhbCBnZXRMb2NhbFByaW5jaXBhbCgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldExvY2FsUHJpbmNpcGFsKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0Rml4ZWRMZW5ndGhTdHJlYW1pbmdNb2RlKGludCBjb250ZW50TGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlLnNldEZpeGVkTGVuZ3RoU3RyZWFtaW5nTW9kZShjb250ZW50TGVuZ3RoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRDaHVua2VkU3RyZWFtaW5nTW9kZShpbnQgY2h1bmtsZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGUuc2V0Q2h1bmtlZFN0cmVhbWluZ01vZGUoY2h1bmtsZW4pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldENvbm5lY3RUaW1lb3V0KGludCB0aW1lb3V0KSB7CisgICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlLnNldENvbm5lY3RUaW1lb3V0KHRpbWVvdXQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBQcmluY2lwYWwgZ2V0UGVlclByaW5jaXBhbCgpIHRocm93cyBTU0xQZWVyVW52ZXJpZmllZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRQZWVyUHJpbmNpcGFsKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0SW5zdGFuY2VGb2xsb3dSZWRpcmVjdHMoYm9vbGVhbiBmb2xsb3dSZWRpcmVjdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGUuc2V0SW5zdGFuY2VGb2xsb3dSZWRpcmVjdHMoZm9sbG93UmVkaXJlY3RzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0TWV0aG9kKFN0cmluZyBtZXRob2QpIHRocm93cyBQcm90b2NvbEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlLnNldFJlcXVlc3RNZXRob2QobWV0aG9kKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RNZXRob2QoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRSZXF1ZXN0TWV0aG9kKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0UmVhZFRpbWVvdXQoaW50IHRpbWVvdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGUuc2V0UmVhZFRpbWVvdXQodGltZW91dCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGludCBnZXRSZWFkVGltZW91dCgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldFJlYWRUaW1lb3V0KCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIFVSTCBnZXRVUkwoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRVUkwoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiB1c2luZ1Byb3h5KCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUudXNpbmdQcm94eSgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBQZXJtaXNzaW9uIGdldFBlcm1pc3Npb24oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0UGVybWlzc2lvbigpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldERvSW5wdXQoYm9vbGVhbiBkb2lucHV0KSB7CisgICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlLnNldERvSW5wdXQoZG9pbnB1dCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0RG9PdXRwdXQoYm9vbGVhbiBkb291dHB1dCkgeworICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZS5zZXREb091dHB1dChkb291dHB1dCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0QWxsb3dVc2VySW50ZXJhY3Rpb24oYm9vbGVhbiBhbGxvd3VzZXJpbnRlcmFjdGlvbikgeworICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZS5zZXRBbGxvd1VzZXJJbnRlcmFjdGlvbihhbGxvd3VzZXJpbnRlcmFjdGlvbik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0VXNlQ2FjaGVzKGJvb2xlYW4gdXNlY2FjaGVzKSB7CisgICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlLnNldFVzZUNhY2hlcyh1c2VjYWNoZXMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGdldFVzZUNhY2hlcygpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldFVzZUNhY2hlcygpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldElmTW9kaWZpZWRTaW5jZShsb25nIGlmbW9kaWZpZWRzaW5jZSkgeworICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZS5zZXRJZk1vZGlmaWVkU2luY2UoaWZtb2RpZmllZHNpbmNlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0VXNlQ2FjaGVzKGJvb2xlYW4gZGVmYXVsdHVzZWNhY2hlcykgeworICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZS5zZXREZWZhdWx0VXNlQ2FjaGVzKGRlZmF1bHR1c2VjYWNoZXMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdFByb3BlcnR5KFN0cmluZyBrZXkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldFJlcXVlc3RQcm9wZXJ0eShrZXkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGdldFJlcXVlc3RQcm9wZXJ0aWVzKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0UmVxdWVzdFByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgU1NMU29ja2V0RmFjdG9yeSBnZXRTU0xTb2NrZXRGYWN0b3J5KCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0U1NMU29ja2V0RmFjdG9yeSgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBDZXJ0aWZpY2F0ZVtdIGdldFNlcnZlckNlcnRpZmljYXRlcygpIHRocm93cyBTU0xQZWVyVW52ZXJpZmllZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRTZXJ2ZXJDZXJ0aWZpY2F0ZXMoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRIb3N0bmFtZVZlcmlmaWVyKEhvc3RuYW1lVmVyaWZpZXIgdikgeworICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZS5zZXRIb3N0bmFtZVZlcmlmaWVyKHYpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldFJlcXVlc3RQcm9wZXJ0eShTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGUuc2V0UmVxdWVzdFByb3BlcnR5KGtleSwgdmFsdWUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldFNTTFNvY2tldEZhY3RvcnkoU1NMU29ja2V0RmFjdG9yeSBzZikgeworICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZS5zZXRTU0xTb2NrZXRGYWN0b3J5KHNmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBXZWJUYXJnZXQgY3JlYXRlTm9uUm91dGFibGVUYXJnZXQoKSB7CisgICAgICAgIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpOworICAgICAgICBjbGllbnQucHJvcGVydHkoQ2xpZW50UHJvcGVydGllcy5DT05ORUNUX1RJTUVPVVQsIFRpbWVvdXRCQVNFKTsKKyAgICAgICAgLy8gdGhlIGZvbGxvd2luZyBhZGRyZXNzIHNob3VsZCBub3QgYmUgcm91dGFibGUsIGNvbm5lY3Rpb25zIHdpbGwgdGltZW91dAorICAgICAgICByZXR1cm4gY2xpZW50LnRhcmdldCgiaHR0cDovLzEwLjI1NS4yNTUuMjU0LyIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0plcnNleUNsaWVudEJ1aWxkZXJUZXN0LmphdmEgYi9jb3JlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9KZXJzZXlDbGllbnRCdWlsZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMzRlNjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9KZXJzZXlDbGllbnRCdWlsZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjI2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlTdG9yZTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJpb3JpdHk7CitpbXBvcnQgamF2YXgubmV0LnNzbC5TU0xDb250ZXh0OworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuRXhwZWN0ZWRFeGNlcHRpb247CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RTYW1lOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCisvKioKKyAqIHtAbGluayBKZXJzZXlDbGllbnR9IHVuaXQgdGVzdC4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXlDbGllbnRCdWlsZGVyVGVzdCB7CisKKyAgICBAUnVsZQorICAgIHB1YmxpYyBmaW5hbCBFeHBlY3RlZEV4Y2VwdGlvbiBleGNlcHRpb24gPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CisKKyAgICBwcml2YXRlIEplcnNleUNsaWVudEJ1aWxkZXIgYnVpbGRlcjsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgYnVpbGRlciA9IG5ldyBKZXJzZXlDbGllbnRCdWlsZGVyKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnVpbGRDbGllbnRXaXRoTnVsbFNzbENvbmZpZygpIHRocm93cyBLZXlTdG9yZUV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBidWlsZGVyLnNzbENvbnRleHQobnVsbCk7CisgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBleHBlY3RlZCBmb3IgJ251bGwnIFNTTCBjb250ZXh0LiIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBucGUpIHsKKyAgICAgICAgICAgIC8vIHBhc3MKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBidWlsZGVyLmtleVN0b3JlKG51bGwsICJhYmMiKTsKKyAgICAgICAgICAgIGZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIGV4cGVjdGVkIGZvciAnbnVsbCcgU1NMIGNvbnRleHQuIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIG5wZSkgeworICAgICAgICAgICAgLy8gcGFzcworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBidWlsZGVyLmtleVN0b3JlKG51bGwsICJhYmMiLnRvQ2hhckFycmF5KCkpOworICAgICAgICAgICAgZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhwZWN0ZWQgZm9yICdudWxsJyBTU0wgY29udGV4dC4iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gbnBlKSB7CisgICAgICAgICAgICAvLyBwYXNzCisgICAgICAgIH0KKworICAgICAgICBLZXlTdG9yZSBrcyA9IEtleVN0b3JlLmdldEluc3RhbmNlKEtleVN0b3JlLmdldERlZmF1bHRUeXBlKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYnVpbGRlci5rZXlTdG9yZShrcywgKFN0cmluZykgbnVsbCk7CisgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBleHBlY3RlZCBmb3IgJ251bGwnIFNTTCBjb250ZXh0LiIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBucGUpIHsKKyAgICAgICAgICAgIC8vIHBhc3MKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgYnVpbGRlci5rZXlTdG9yZShrcywgKGNoYXJbXSkgbnVsbCk7CisgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBleHBlY3RlZCBmb3IgJ251bGwnIFNTTCBjb250ZXh0LiIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBucGUpIHsKKyAgICAgICAgICAgIC8vIHBhc3MKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBidWlsZGVyLmtleVN0b3JlKG51bGwsIChTdHJpbmcpIG51bGwpOworICAgICAgICAgICAgZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhwZWN0ZWQgZm9yICdudWxsJyBTU0wgY29udGV4dC4iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gbnBlKSB7CisgICAgICAgICAgICAvLyBwYXNzCisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJ1aWxkZXIua2V5U3RvcmUobnVsbCwgKGNoYXJbXSkgbnVsbCk7CisgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBleHBlY3RlZCBmb3IgJ251bGwnIFNTTCBjb250ZXh0LiIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBucGUpIHsKKyAgICAgICAgICAgIC8vIHBhc3MKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBidWlsZGVyLnRydXN0U3RvcmUobnVsbCk7CisgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBleHBlY3RlZCBmb3IgJ251bGwnIFNTTCBjb250ZXh0LiIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBucGUpIHsKKyAgICAgICAgICAgIC8vIHBhc3MKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE92ZXJyaWRpbmdTc2xDb25maWcoKSB0aHJvd3MgS2V5U3RvcmVFeGNlcHRpb24sIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiB7CisgICAgICAgIEtleVN0b3JlIGtzID0gS2V5U3RvcmUuZ2V0SW5zdGFuY2UoS2V5U3RvcmUuZ2V0RGVmYXVsdFR5cGUoKSk7CisgICAgICAgIFNTTENvbnRleHQgY3R4ID0gU1NMQ29udGV4dC5nZXRJbnN0YW5jZSgiU1NMIik7CisgICAgICAgIENsaWVudCBjbGllbnQ7CisKKyAgICAgICAgY2xpZW50ID0gbmV3IEplcnNleUNsaWVudEJ1aWxkZXIoKS5rZXlTdG9yZShrcywgInF3ZXJ0eSIpLnNzbENvbnRleHQoY3R4KS5idWlsZCgpOworICAgICAgICBhc3NlcnRTYW1lKCJTU0wgY29udGV4dCBub3QgdGhlIHNhbWUgYXMgc2V0IGluIHRoZSBjbGllbnQgYnVpbGRlci4iLCBjdHgsIGNsaWVudC5nZXRTc2xDb250ZXh0KCkpOworCisgICAgICAgIGNsaWVudCA9IG5ldyBKZXJzZXlDbGllbnRCdWlsZGVyKCkuc3NsQ29udGV4dChjdHgpLnRydXN0U3RvcmUoa3MpLmJ1aWxkKCk7CisgICAgICAgIGFzc2VydE5vdFNhbWUoIlNTTCBjb250ZXh0IG5vdCBvdmVycmlkZGVuIGluIHRoZSBjbGllbnQgYnVpbGRlci4iLCBjdHgsIGNsaWVudC5nZXRTc2xDb250ZXh0KCkpOworICAgIH0KKworICAgIEBQcmlvcml0eSgyKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQWJvcnRpbmdDbGllbnRGaWx0ZXIgaW1wbGVtZW50cyBDbGllbnRSZXF1ZXN0RmlsdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKGZpbmFsIENsaWVudFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuYWJvcnRXaXRoKFJlc3BvbnNlLm9rKCJvayIpLmJ1aWxkKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFByaW9yaXR5KDEpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDbGllbnRDcmVhdGluZ0ZpbHRlciBpbXBsZW1lbnRzIENsaWVudFJlcXVlc3RGaWx0ZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoZmluYWwgQ2xpZW50UmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoQm9vbGVhbi52YWx1ZU9mKHJlcXVlc3RDb250ZXh0LmdldEhlYWRlclN0cmluZygiY3JlYXRlIikpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXF1ZXN0Q29udGV4dC5nZXRQcm9wZXJ0eSgiZm9vIikudG9TdHJpbmcoKSwgZXF1YWxUbygicmFiIikpOworCisgICAgICAgICAgICAgICAgZmluYWwgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3QnVpbGRlcigpLndpdGhDb25maWcocmVxdWVzdENvbnRleHQuZ2V0Q29uZmlndXJhdGlvbigpKS5idWlsZCgpOworICAgICAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gY2xpZW50LnRhcmdldCgiaHR0cDovL2xvY2FsaG9zdCIpLnJlcXVlc3QoKS5oZWFkZXIoImNyZWF0ZSIsIGZhbHNlKS5nZXQoKTsKKworICAgICAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LmFib3J0V2l0aChyZXNwb25zZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFzc2VydFRoYXQocmVxdWVzdENvbnRleHQuZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnR5KCJmb28iKS50b1N0cmluZygpLCBlcXVhbFRvKCJiYXIiKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENsaWVudEZlYXR1cmUgaW1wbGVtZW50cyBGZWF0dXJlIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlKGZpbmFsIEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIGlmIChjb250ZXh0LmdldENvbmZpZ3VyYXRpb24oKS5pc1JlZ2lzdGVyZWQoQWJvcnRpbmdDbGllbnRGaWx0ZXIuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkFscmVhZHkgQ29uZmlndXJlZCEiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihDbGllbnRDcmVhdGluZ0ZpbHRlci5jbGFzcyk7CisgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKEFib3J0aW5nQ2xpZW50RmlsdGVyLmNsYXNzKTsKKworICAgICAgICAgICAgY29udGV4dC5wcm9wZXJ0eSgiZm9vIiwgImJhciIpOworCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUNsaWVudFdpdGhDb25maWdGcm9tQ2xpZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0Q3JlYXRlQ2xpZW50V2l0aEFub3RoZXJDb25maWcoZmFsc2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZUNsaWVudFdpdGhDb25maWdGcm9tUmVxdWVzdENvbnRleHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RDcmVhdGVDbGllbnRXaXRoQW5vdGhlckNvbmZpZyh0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBfdGVzdENyZWF0ZUNsaWVudFdpdGhBbm90aGVyQ29uZmlnKGZpbmFsIGJvb2xlYW4gY2xpZW50SW5GaWx0ZXIpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdCdWlsZGVyKCkucmVnaXN0ZXIobmV3IENsaWVudEZlYXR1cmUoKSkuYnVpbGQoKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSBjbGllbnQudGFyZ2V0KCJodHRwOi8vbG9jYWxob3N0IikKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpLnByb3BlcnR5KCJmb28iLCAicmFiIikuaGVhZGVyKCJjcmVhdGUiLCBjbGllbnRJbkZpbHRlcikuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgZXF1YWxUbygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGVxdWFsVG8oIm9rIikpOworCisgICAgICAgIGZpbmFsIENsaWVudCBuZXdDbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudChjbGllbnQuZ2V0Q29uZmlndXJhdGlvbigpKTsKKyAgICAgICAgcmVzcG9uc2UgPSBuZXdDbGllbnQudGFyZ2V0KCJodHRwOi8vbG9jYWxob3N0IikKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpLnByb3BlcnR5KCJmb28iLCAicmFiIikuaGVhZGVyKCJjcmVhdGUiLCBjbGllbnRJbkZpbHRlcikuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgZXF1YWxUbygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGVxdWFsVG8oIm9rIikpOworCisgICAgICAgIGZpbmFsIENsaWVudCBuZXdDbGllbnRGcm9tQnVpbGRlciA9IENsaWVudEJ1aWxkZXIubmV3QnVpbGRlcigpLndpdGhDb25maWcoY2xpZW50LmdldENvbmZpZ3VyYXRpb24oKSkuYnVpbGQoKTsKKyAgICAgICAgcmVzcG9uc2UgPSBuZXdDbGllbnRGcm9tQnVpbGRlci50YXJnZXQoImh0dHA6Ly9sb2NhbGhvc3QiKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkucHJvcGVydHkoImZvbyIsICJyYWIiKS5oZWFkZXIoImNyZWF0ZSIsIGNsaWVudEluRmlsdGVyKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbygib2siKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmVnYXRpdmVDb25uZWN0VGltZW91dCgpIHsKKyAgICAgICAgQ2xpZW50QnVpbGRlciBjbGllbnRCdWlsZGVyID0gQ2xpZW50QnVpbGRlci5uZXdCdWlsZGVyKCk7CisKKyAgICAgICAgZXhjZXB0aW9uLmV4cGVjdChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpOworICAgICAgICBjbGllbnRCdWlsZGVyLmNvbm5lY3RUaW1lb3V0KC0xLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROZWdhdGl2ZVJlYWRUaW1lb3V0KCkgeworICAgICAgICBDbGllbnRCdWlsZGVyIGNsaWVudEJ1aWxkZXIgPSBDbGllbnRCdWlsZGVyLm5ld0J1aWxkZXIoKTsKKworICAgICAgICBleGNlcHRpb24uZXhwZWN0KElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIGNsaWVudEJ1aWxkZXIucmVhZFRpbWVvdXQoLTEsIFRpbWVVbml0LlNFQ09ORFMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0plcnNleUNsaWVudFRlc3QuamF2YSBiL2NvcmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0plcnNleUNsaWVudFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2FhNTc4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvSmVyc2V5Q2xpZW50VGVzdC5qYXZhCkBAIC0wLDAgKzEsMzIxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOworCitpbXBvcnQgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTGluazsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUmVhZGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJlYWRlckludGVyY2VwdG9yQ29udGV4dDsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuc3BpLkFzeW5jQ29ubmVjdG9yQ2FsbGJhY2s7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnNwaS5Db25uZWN0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnNwaS5Db25uZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5WZXJzaW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5BYnN0cmFjdEJpbmRlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiB7QGxpbmsgSmVyc2V5Q2xpZW50fSB1bml0IHRlc3QuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEplcnNleUNsaWVudFRlc3QgeworCisgICAgcHJpdmF0ZSBKZXJzZXlDbGllbnQgY2xpZW50OworCisgICAgcHVibGljIEplcnNleUNsaWVudFRlc3QoKSB7CisgICAgfQorCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICB0aGlzLmNsaWVudCA9IChKZXJzZXlDbGllbnQpIENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KCk7CisgICAgfQorCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQ2xpZW50KCkgeworICAgICAgICBhc3NlcnROb3ROdWxsKGNsaWVudCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2UoKSB7CisgICAgICAgIGNsaWVudC5jbG9zZSgpOworICAgICAgICBhc3NlcnRUcnVlKGNsaWVudC5pc0Nsb3NlZCgpKTsKKyAgICAgICAgY2xpZW50LmNsb3NlKCk7IC8vIGNsb3NpbmcgbXVsdGlwbGUgdGltZXMgaXMgb2sKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2xpZW50LmdldENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgICAgIGZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCBpZiBhIG1ldGhvZCBpcyBjYWxsZWQgb24gYSBjbG9zZWQgY2xpZW50IGluc3RhbmNlLiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIGlnbm9yZWQKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgY2xpZW50LnRhcmdldCgiaHR0cDovL2plcnNleS5qYXZhLm5ldC9leGFtcGxlcyIpOworICAgICAgICAgICAgZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkIGlmIGEgbWV0aG9kIGlzIGNhbGxlZCBvbiBhIGNsb3NlZCBjbGllbnQgaW5zdGFuY2UuIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gaWdub3JlZAorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgZmluYWwgQ2xpZW50Q29uZmlnIGNvbmZpZ3VyYXRpb24gPSBjbGllbnQuZ2V0Q29uZmlndXJhdGlvbigpOworICAgICAgICBhc3NlcnROb3ROdWxsKGNvbmZpZ3VyYXRpb24pOworCisgICAgICAgIGNvbmZpZ3VyYXRpb24ucHJvcGVydHkoImhlbGxvIiwgIndvcmxkIik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3b3JsZCIsIGNsaWVudC5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UHJvcGVydHkoImhlbGxvIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRhcmdldCgpIHsKKyAgICAgICAgZmluYWwgSmVyc2V5V2ViVGFyZ2V0IHRhcmdldCA9IGNsaWVudC50YXJnZXQoImh0dHA6Ly9qZXJzZXkuamF2YS5uZXQvZXhhbXBsZXMiKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh0YXJnZXQpOworICAgICAgICBhc3NlcnRFcXVhbHMoY2xpZW50LmdldENvbmZpZ3VyYXRpb24oKSwgdGFyZ2V0LmdldENvbmZpZ3VyYXRpb24oKSk7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdFRhcmdldElBRSgpIHsKKyAgICAgICAgZmluYWwgVXJpQnVpbGRlciB1cmlCdWlsZGVyID0gVXJpQnVpbGRlci5mcm9tVXJpKCI6eHh4OjgwODAvL3l5eTo5MDA5MC8vamF4cnMgIik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0UHJvdmlkZXIgaW1wbGVtZW50cyBSZWFkZXJJbnRlcmNlcHRvciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPYmplY3QgYXJvdW5kUmVhZEZyb20oUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQucHJvY2VlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gUmVwcm9kdWNlciBKRVJTRVktMTYzNworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlZ2lzdGVyTnVsbE9yRW1wdHlDb250cmFjdHMoKSB7CisgICAgICAgIGZpbmFsIFRlc3RQcm92aWRlciBwcm92aWRlciA9IG5ldyBUZXN0UHJvdmlkZXIoKTsKKworICAgICAgICBjbGllbnQucmVnaXN0ZXIoVGVzdFByb3ZpZGVyLmNsYXNzLCAoQ2xhc3M8Pz5bXSkgbnVsbCk7CisgICAgICAgIGFzc2VydEZhbHNlKGNsaWVudC5nZXRDb25maWd1cmF0aW9uKCkuaXNSZWdpc3RlcmVkKFRlc3RQcm92aWRlci5jbGFzcykpOworCisgICAgICAgIGNsaWVudC5yZWdpc3Rlcihwcm92aWRlciwgKENsYXNzPD8+W10pIG51bGwpOworICAgICAgICBhc3NlcnRGYWxzZShjbGllbnQuZ2V0Q29uZmlndXJhdGlvbigpLmlzUmVnaXN0ZXJlZChUZXN0UHJvdmlkZXIuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY2xpZW50LmdldENvbmZpZ3VyYXRpb24oKS5pc1JlZ2lzdGVyZWQocHJvdmlkZXIpKTsKKworICAgICAgICBjbGllbnQucmVnaXN0ZXIoVGVzdFByb3ZpZGVyLmNsYXNzLCBuZXcgQ2xhc3NbMF0pOworICAgICAgICBhc3NlcnRGYWxzZShjbGllbnQuZ2V0Q29uZmlndXJhdGlvbigpLmlzUmVnaXN0ZXJlZChUZXN0UHJvdmlkZXIuY2xhc3MpKTsKKworICAgICAgICBjbGllbnQucmVnaXN0ZXIocHJvdmlkZXIsIG5ldyBDbGFzc1swXSk7CisgICAgICAgIGFzc2VydEZhbHNlKGNsaWVudC5nZXRDb25maWd1cmF0aW9uKCkuaXNSZWdpc3RlcmVkKFRlc3RQcm92aWRlci5jbGFzcykpOworICAgICAgICBhc3NlcnRGYWxzZShjbGllbnQuZ2V0Q29uZmlndXJhdGlvbigpLmlzUmVnaXN0ZXJlZChwcm92aWRlcikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRhcmdldENvbmZpZ1VwZGF0ZSgpIHsKKyAgICAgICAgZmluYWwgSmVyc2V5V2ViVGFyZ2V0IHRhcmdldCA9IGNsaWVudC50YXJnZXQoImh0dHA6Ly9qZXJzZXkuamF2YS5uZXQvZXhhbXBsZXMiKTsKKworICAgICAgICB0YXJnZXQuZ2V0Q29uZmlndXJhdGlvbigpLnJlZ2lzdGVyKG5ldyBDbGllbnRSZXF1ZXN0RmlsdGVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ2xpZW50UmVxdWVzdENvbnRleHQgY2xpZW50UmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIHlldCIpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdGFyZ2V0LmdldENvbmZpZ3VyYXRpb24oKS5nZXRJbnN0YW5jZXMoKS5zaXplKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ3Jlc3Npb24gdGVzdCBmb3IgSkVSU0VZLTExOTIuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlTGlua0Jhc2VkSW52b2NhdGlvbigpIHsKKyAgICAgICAgZmluYWwgSmVyc2V5Q2xpZW50IGplcnNleUNsaWVudCA9IG5ldyBKZXJzZXlDbGllbnQoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgamVyc2V5Q2xpZW50Lmludm9jYXRpb24obnVsbCk7CisgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBleHBlY3RlZC4iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIHN1Y2Nlc3MuCisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgamVyc2V5Q2xpZW50Lmludm9jYXRpb24obnVsbCk7CisgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBleHBlY3RlZC4iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIHN1Y2Nlc3MuCisgICAgICAgIH0KKworICAgICAgICBMaW5rIGxpbmsxID0KKyAgICAgICAgICAgICAgICBMaW5rLmZyb21VcmkoVXJpQnVpbGRlci5mcm9tUGF0aCgiaHR0cDovL2xvY2FsaG9zdDo4MDgwLyIpLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgTGluayBsaW5rMiA9CisgICAgICAgICAgICAgICAgTGluay5mcm9tVXJpKFVyaUJ1aWxkZXIuZnJvbVBhdGgoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8iKS5idWlsZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgLnR5cGUoInRleHQvcGxhaW4iKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKworICAgICAgICBhc3NlcnROb3ROdWxsKGplcnNleUNsaWVudC5pbnZvY2F0aW9uKGxpbmsxKS5idWlsZFBvc3QobnVsbCkpOworICAgICAgICBhc3NlcnROb3ROdWxsKGplcnNleUNsaWVudC5pbnZvY2F0aW9uKGxpbmsyKS5idWlsZFBvc3QobnVsbCkpOworCisgICAgICAgIGFzc2VydE5vdE51bGwoamVyc2V5Q2xpZW50Lmludm9jYXRpb24obGluazEpLmJ1aWxkUG9zdChFbnRpdHkudGV4dCgiVGVzdC4iKSkpOworICAgICAgICBhc3NlcnROb3ROdWxsKGplcnNleUNsaWVudC5pbnZvY2F0aW9uKGxpbmsyKS5idWlsZFBvc3QoRW50aXR5LnRleHQoIlRlc3QuIikpKTsKKworICAgICAgICBhc3NlcnROb3ROdWxsKGplcnNleUNsaWVudC5pbnZvY2F0aW9uKGxpbmsxKS5idWlsZFBvc3QoRW50aXR5LnhtbCgiVGVzdC4iKSkpOworICAgICAgICBhc3NlcnROb3ROdWxsKGplcnNleUNsaWVudC5pbnZvY2F0aW9uKGxpbmsyKS5idWlsZFBvc3QoRW50aXR5LnhtbCgiVGVzdC4iKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdXNlckFnZW50VGVzdCgpIHsKKyAgICAgICAgZmluYWwgQ2xpZW50IGN1c3RvbUNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KG5ldyBDbGllbnRDb25maWcoKS5jb25uZWN0b3JQcm92aWRlcihuZXcgVGVzdENvbm5lY3RvcigpKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGN1c3RvbUNsaWVudC50YXJnZXQoInRlc3QiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIH0gY2F0Y2ggKFByb2Nlc3NpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJKZXJzZXkvIiArIFZlcnNpb24uZ2V0VmVyc2lvbigpLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY3VzdG9tQ2xpZW50LnRhcmdldCgidGVzdCIpLnJlcXVlc3QoKS5hc3luYygpLmdldCgpLmdldCgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJKZXJzZXkvIiArIFZlcnNpb24uZ2V0VmVyc2lvbigpLCBlLmdldENhdXNlKCkuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEpFUlNFWS0yMTg5IHJlcHJvZHVjZXIuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjdXN0b21Vc2VyQWdlbnRUZXN0KCkgeworICAgICAgICBmaW5hbCBDbGllbnQgY3VzdG9tQ2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQobmV3IENsaWVudENvbmZpZygpLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBUZXN0Q29ubmVjdG9yKCkpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY3VzdG9tQ2xpZW50LnRhcmdldCgidGVzdCIpLnJlcXVlc3QoKS5oZWFkZXIoSHR0cEhlYWRlcnMuVVNFUl9BR0VOVCwgbnVsbCkuZ2V0KCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIltudWxsXSIsIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjdXN0b21DbGllbnQudGFyZ2V0KCJ0ZXN0IikucmVxdWVzdCgpLmhlYWRlcihIdHRwSGVhZGVycy5VU0VSX0FHRU5ULCBudWxsKS5hc3luYygpLmdldCgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJbbnVsbF0iLCBlLmdldENhdXNlKCkuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjdXN0b21DbGllbnQudGFyZ2V0KCJ0ZXN0IikucmVxdWVzdCgpLmhlYWRlcihIdHRwSGVhZGVycy5VU0VSX0FHRU5ULCAiY3VzdG9tIikuZ2V0KCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImN1c3RvbSIsIGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjdXN0b21DbGllbnQudGFyZ2V0KCJ0ZXN0IikucmVxdWVzdCgpLmhlYWRlcihIdHRwSGVhZGVycy5VU0VSX0FHRU5ULCAiY3VzdG9tIikuYXN5bmMoKS5nZXQoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiY3VzdG9tIiwgZS5nZXRDYXVzZSgpLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBDdXN0b21Db250cmFjdCB7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9vKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDdXN0b21TZXJ2aWNlIGltcGxlbWVudHMgQ3VzdG9tQ29udHJhY3QgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEZvbygpIHsKKyAgICAgICAgICAgIHJldHVybiAiRm9vIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ3VzdG9tQmluZGVyIGV4dGVuZHMgQWJzdHJhY3RCaW5kZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgICAgICBiaW5kKEN1c3RvbVNlcnZpY2UuY2xhc3MpLnRvKEN1c3RvbUNvbnRyYWN0LmNsYXNzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ3VzdG9tUHJvdmlkZXIgaW1wbGVtZW50cyBDbGllbnRSZXF1ZXN0RmlsdGVyIHsKKyAgICAgICAgQEluamVjdAorICAgICAgICBwcml2YXRlIEN1c3RvbUNvbnRyYWN0IGN1c3RvbUNvbnRyYWN0OworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ2xpZW50UmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5hYm9ydFdpdGgoUmVzcG9uc2Uub2soY3VzdG9tQ29udHJhY3QuZ2V0Rm9vKCkpLmJ1aWxkKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tQmluZGVycygpIHsKKyAgICAgICAgZmluYWwgQ3VzdG9tQmluZGVyIGJpbmRlciA9IG5ldyBDdXN0b21CaW5kZXIoKTsKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KCkucmVnaXN0ZXIoYmluZGVyKS5yZWdpc3RlcihDdXN0b21Qcm92aWRlci5jbGFzcyk7CisKKyAgICAgICAgUmVzcG9uc2UgcmVzcCA9IGNsaWVudC50YXJnZXQoInRlc3QiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiRm9vIiwgcmVzcC5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRlc3RDb25uZWN0b3IgaW1wbGVtZW50cyBDb25uZWN0b3IsIENvbm5lY3RvclByb3ZpZGVyIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDbGllbnRSZXNwb25zZSBhcHBseShDbGllbnRSZXF1ZXN0IHJlcXVlc3QpIHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIE9iamVjdCBhZ2VudCA9IHJlcXVlc3QuZ2V0SGVhZGVycygpLmdldEZpcnN0KEh0dHBIZWFkZXJzLlVTRVJfQUdFTlQpOworICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oKGFnZW50ID09IG51bGwpID8gIltudWxsXSIgOiBhZ2VudC50b1N0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRnV0dXJlPD8+IGFwcGx5KENsaWVudFJlcXVlc3QgcmVxdWVzdCwgQXN5bmNDb25uZWN0b3JDYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICAgICAgZmluYWwgT2JqZWN0IGFnZW50ID0gcmVxdWVzdC5nZXRIZWFkZXJzKCkuZ2V0Rmlyc3QoSHR0cEhlYWRlcnMuVVNFUl9BR0VOVCk7CisgICAgICAgICAgICBjYWxsYmFjay5mYWlsdXJlKG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKChhZ2VudCA9PSBudWxsKSA/ICJbbnVsbF0iIDogYWdlbnQudG9TdHJpbmcoKSkpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgICAgICAvLyBub3RoaW5nCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENvbm5lY3RvciBnZXRDb25uZWN0b3IoQ2xpZW50IGNsaWVudCwgQ29uZmlndXJhdGlvbiBydW50aW1lQ29uZmlnKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0plcnNleUNvbXBsZXRpb25TdGFnZVJ4SW52b2tlclRlc3QuamF2YSBiL2NvcmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L0plcnNleUNvbXBsZXRpb25TdGFnZVJ4SW52b2tlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmQ3NjNmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvSmVyc2V5Q29tcGxldGlvblN0YWdlUnhJbnZva2VyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTgyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudDsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3I7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Ob3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5Db21wbGV0aW9uU3RhZ2VSeEludm9rZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkdlbmVyaWNUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YS5UaHJlYWRGYWN0b3J5QnVpbGRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLkplcnNleVByb2Nlc3NpbmdVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXI7CisKK2ltcG9ydCBvcmcuaGFtY3Jlc3QuTWF0Y2hlcjsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuY29udGFpbnNTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5ub3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5jb3JlLklzLmlzOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXlDb21wbGV0aW9uU3RhZ2VSeEludm9rZXJUZXN0IHsKKworICAgIHByaXZhdGUgQ2xpZW50IGNsaWVudDsKKyAgICBwcml2YXRlIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvcjsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpLnJlZ2lzdGVyKFRlcm1pbmFsQ2xpZW50UmVxdWVzdEZpbHRlci5jbGFzcyk7CisgICAgICAgIGV4ZWN1dG9yID0gbmV3IFNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvcigxLCBuZXcgVGhyZWFkRmFjdG9yeUJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXROYW1lRm9ybWF0KCJqZXJzZXktcngtY2xpZW50LXRlc3QtJWQiKQorICAgICAgICAgICAgICAgIC5zZXRVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIobmV3IEplcnNleVByb2Nlc3NpbmdVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIoKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0b3Iuc2h1dGRvd24oKTsKKyAgICAgICAgY2xpZW50LmNsb3NlKCk7CisgICAgICAgIGNsaWVudCA9IG51bGw7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmV3Q2xpZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RDbGllbnQoQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKS5yZWdpc3RlcihUZXJtaW5hbENsaWVudFJlcXVlc3RGaWx0ZXIuY2xhc3MpLCBmYWxzZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBASWdub3JlKCJUT0RPIEpBWC1SUyAyLjEiKQorICAgIHB1YmxpYyB2b2lkIHRlc3ROZXdDbGllbnRFeGVjdXRvcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0Q2xpZW50KENsaWVudEJ1aWxkZXIubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5leGVjdXRvclNlcnZpY2UoZXhlY3V0b3IpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWdpc3RlcihUZXJtaW5hbENsaWVudFJlcXVlc3RGaWx0ZXIuY2xhc3MpLCB0cnVlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RGb3VuZFJlc3BvbnNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENvbXBsZXRpb25TdGFnZVJ4SW52b2tlciBpbnZva2VyID0gY2xpZW50LnRhcmdldCgiaHR0cDovL2plcnNleS5qYXZhLm5ldCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5oZWFkZXIoIlJlc3BvbnNlLVN0YXR1cyIsIDQwNCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucngoKTsKKworICAgICAgICB0ZXN0SW52b2tlcihpbnZva2VyLCA0MDQsIGZhbHNlKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IE5vdEZvdW5kRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RGb3VuZFJlYWRFbnRpdHlWaWFDbGFzcygpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2xpZW50LnRhcmdldCgiaHR0cDovL2plcnNleS5qYXZhLm5ldCIpCisgICAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgICAuaGVhZGVyKCJSZXNwb25zZS1TdGF0dXMiLCA0MDQpCisgICAgICAgICAgICAgICAgICAucngoKQorICAgICAgICAgICAgICAgICAgLmdldChTdHJpbmcuY2xhc3MpCisgICAgICAgICAgICAgICAgICAudG9Db21wbGV0YWJsZUZ1dHVyZSgpCisgICAgICAgICAgICAgICAgICAuZ2V0KCk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICAgICAgLy8gamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uCisgICAgICAgICAgICB0aHJvdyBleHBlY3RlZAorICAgICAgICAgICAgICAgICAgICAvLyBqYXZheC53cy5ycy5Ob3RGb3VuZEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAuZ2V0Q2F1c2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gTm90Rm91bmRFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdE5vdEZvdW5kUmVhZEVudGl0eVZpYUdlbmVyaWNUeXBlKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjbGllbnQudGFyZ2V0KCJodHRwOi8vamVyc2V5LmphdmEubmV0IikKKyAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAgIC5oZWFkZXIoIlJlc3BvbnNlLVN0YXR1cyIsIDQwNCkKKyAgICAgICAgICAgICAgICAgIC5yeCgpCisgICAgICAgICAgICAgICAgICAuZ2V0KG5ldyBHZW5lcmljVHlwZTxTdHJpbmc+KCkgeworICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgIC50b0NvbXBsZXRhYmxlRnV0dXJlKCkKKyAgICAgICAgICAgICAgICAgIC5nZXQoKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgICAgICAvLyBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb24KKyAgICAgICAgICAgIHRocm93IGV4cGVjdGVkCisgICAgICAgICAgICAgICAgICAgIC8vIGphdmF4LndzLnJzLk5vdEZvdW5kRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIC5nZXRDYXVzZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEVudGl0eVZpYUNsYXNzKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXNwb25zZSA9IGNsaWVudC50YXJnZXQoImh0dHA6Ly9qZXJzZXkuamF2YS5uZXQiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yeCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoU3RyaW5nLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9Db21wbGV0YWJsZUZ1dHVyZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLCBpcygiTk8tRU5USVRZIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRFbnRpdHlWaWFHZW5lcmljVHlwZSgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzcG9uc2UgPSBjbGllbnQudGFyZ2V0KCJodHRwOi8vamVyc2V5LmphdmEubmV0IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucngoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KG5ldyBHZW5lcmljVHlwZTxTdHJpbmc+KCkgeyB9KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9Db21wbGV0YWJsZUZ1dHVyZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLCBpcygiTk8tRU5USVRZIikpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0Q2xpZW50KGZpbmFsIENsaWVudCByeENsaWVudCwgZmluYWwgYm9vbGVhbiB0ZXN0RGVkaWNhdGVkVGhyZWFkKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RUYXJnZXQocnhDbGllbnQudGFyZ2V0KCJodHRwOi8vamVyc2V5LmphdmEubmV0IiksIHRlc3REZWRpY2F0ZWRUaHJlYWQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0VGFyZ2V0KGZpbmFsIFdlYlRhcmdldCByeFRhcmdldCwgYm9vbGVhbiBkZWRpY2F0ZWRUaHJlYWQpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgdGVzdEludm9rZXIocnhUYXJnZXQucmVxdWVzdCgpLnJ4KCksIDIwMCwgZGVkaWNhdGVkVGhyZWFkKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdEludm9rZXIoZmluYWwgQ29tcGxldGlvblN0YWdlUnhJbnZva2VyIHJ4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZXhwZWN0ZWRTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gdGVzdERlZGljYXRlZFRocmVhZCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgdGVzdFJlc3BvbnNlKHJ4LmdldCgpLnRvQ29tcGxldGFibGVGdXR1cmUoKS5nZXQoKSwgZXhwZWN0ZWRTdGF0dXMsIHRlc3REZWRpY2F0ZWRUaHJlYWQpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdFJlc3BvbnNlKGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlLCBmaW5hbCBpbnQgZXhwZWN0ZWRTdGF0dXMsIGZpbmFsIGJvb2xlYW4gdGVzdERlZGljYXRlZFRocmVhZCkgeworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcyhleHBlY3RlZFN0YXR1cykpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoIk5PLUVOVElUWSIpKTsKKworICAgICAgICAvLyBFeGVjdXRvci4KKyAgICAgICAgZmluYWwgTWF0Y2hlcjxTdHJpbmc+IG1hdGNoZXIgPSBjb250YWluc1N0cmluZygiamVyc2V5LXJ4LWNsaWVudC10ZXN0Iik7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJUZXN0LVRocmVhZCIpLCB0ZXN0RGVkaWNhdGVkVGhyZWFkID8gbWF0Y2hlciA6IG5vdChtYXRjaGVyKSk7CisKKyAgICAgICAgLy8gUHJvcGVydGllcy4KKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIlRlc3QtVXJpIiksIGlzKCJodHRwOi8vamVyc2V5LmphdmEubmV0IikpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiVGVzdC1NZXRob2QiKSwgaXMoIkdFVCIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9KZXJzZXlJbnZvY2F0aW9uVGVzdC5qYXZhIGIvY29yZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvSmVyc2V5SW52b2NhdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzAyMWEzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvSmVyc2V5SW52b2NhdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDQwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LkNvbm5lY3RFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuUHJvdG9jb2xFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlOworCitpbXBvcnQgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQXN5bmNJbnZva2VyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50Lkludm9jYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50Lkludm9jYXRpb25DYWxsYmFjazsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY1R5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZEhhc2hNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVyczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5hbnlPZjsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5oYXNJdGVtOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIEplcnNleUludm9jYXRpb25UZXN0IHsKKworICAgIC8qKgorICAgICAqIFJlZ3Jlc3Npb24gdGVzdCBmb3IgSkVSU0VZLTEyNTcKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPdmVycmlkZUhlYWRlcnNXaXRoTWFwKCkgeworICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gbmV3IE11bHRpdmFsdWVkSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICAgICAgbWFwLmFkZCgiYS1oZWFkZXIiLCAiYi1oZWFkZXIiKTsKKyAgICAgICAgZmluYWwgSmVyc2V5SW52b2NhdGlvbiBpbnZvY2F0aW9uID0gYnVpbGRJbnZvY2F0aW9uV2l0aEhlYWRlcnMobWFwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGludm9jYXRpb24ucmVxdWVzdCgpLmdldEhlYWRlcnMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImItaGVhZGVyIiwgaW52b2NhdGlvbi5yZXF1ZXN0KCkuZ2V0SGVhZGVycygpLmdldEZpcnN0KCJhLWhlYWRlciIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdyZXNzaW9uIHRlc3QgZm9yIEpFUlNFWS0xMjU3CisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJIZWFkZXJzKCkgeworICAgICAgICBmaW5hbCBKZXJzZXlJbnZvY2F0aW9uIGludm9jYXRpb24gPSBidWlsZEludm9jYXRpb25XaXRoSGVhZGVycyhudWxsKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShpbnZvY2F0aW9uLnJlcXVlc3QoKS5nZXRIZWFkZXJzKCkuaXNFbXB0eSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdyZXNzaW9uIHRlc3QgZm9yIEpFUlNFWS0yNTYyLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsZWFySGVhZGVyKCkgeworICAgICAgICBmaW5hbCBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKTsKKyAgICAgICAgZmluYWwgSW52b2NhdGlvbi5CdWlsZGVyIGJ1aWxkZXIgPSBjbGllbnQudGFyZ2V0KCJodHRwOi8vbG9jYWxob3N0OjgwODAvbXlwYXRoIikucmVxdWVzdCgpOworICAgICAgICBmaW5hbCBKZXJzZXlJbnZvY2F0aW9uIGludm9jYXRpb24gPSAoSmVyc2V5SW52b2NhdGlvbikgYnVpbGRlcgorICAgICAgICAgICAgICAgIC5oZWFkZXIoImZvbyIsICJiYXIiKS5oZWFkZXIoImZvbyIsIG51bGwpLmhlYWRlcigiYmFyIiwgImZvbyIpCisgICAgICAgICAgICAgICAgLmJ1aWxkR2V0KCk7CisgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBoZWFkZXJzID0gaW52b2NhdGlvbi5yZXF1ZXN0KCkuZ2V0SGVhZGVycygpOworCisgICAgICAgIGFzc2VydFRoYXQoaGVhZGVycy5zaXplKCksIGlzKDEpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChoZWFkZXJzLmtleVNldCgpLCBoYXNJdGVtKCJiYXIiKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBKZXJzZXlJbnZvY2F0aW9uIGJ1aWxkSW52b2NhdGlvbldpdGhIZWFkZXJzKGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBoZWFkZXJzKSB7CisgICAgICAgIGZpbmFsIENsaWVudCBjID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKTsKKyAgICAgICAgZmluYWwgSW52b2NhdGlvbi5CdWlsZGVyIGJ1aWxkZXIgPSBjLnRhcmdldCgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL215cGF0aCIpLnJlcXVlc3QoKTsKKyAgICAgICAgcmV0dXJuIChKZXJzZXlJbnZvY2F0aW9uKSBidWlsZGVyLmhlYWRlcigidW5leHBlY3RlZC1oZWFkZXIiLCAidW5leHBlY3RlZC1oZWFkZXIiKS5oZWFkZXJzKGhlYWRlcnMpLmJ1aWxkR2V0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIHRoYXQgcHJlc2VuY2Ugb2YgcmVxdWVzdCBlbnRpdHkgZm8gSFRUUCBERUxFVEUgbWV0aG9kIGRvZXMgbm90IGZhaWwgaW4gSmVyc2V5LgorICAgICAqIEluc3RlYWQsIHRoZSByZXF1ZXN0IGlzIHByb3BhZ2F0ZWQgdXAgdG8gSHR0cFVSTENvbm5lY3Rpb24sIHdoZXJlIGl0IGZhaWxzIHdpdGgKKyAgICAgKiB7QGNvZGUgUHJvdG9jb2xFeGNlcHRpb259LgorICAgICAqIDxwLz4KKyAgICAgKiBTZWUgYWxzbyBKRVJTRVktMTcxMS4KKyAgICAgKgorICAgICAqIEBzZWUgI292ZXJyaWRlSHR0cE1ldGhvZEJhc2VkQ29tcGxpYW5jZUNoZWNrTmVnYXRpdmVUZXN0KCkKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIG92ZXJyaWRlSHR0cE1ldGhvZEJhc2VkQ29tcGxpYW5jZUNoZWNrVGVzdCgpIHsKKyAgICAgICAgZmluYWwgQ2xpZW50IGMxID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKS5wcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLlNVUFBSRVNTX0hUVFBfQ09NUExJQU5DRV9WQUxJREFUSU9OLCB0cnVlKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGMxLnRhcmdldCgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL215UGF0aCIpLnJlcXVlc3QoKS5tZXRob2QoIkRFTEVURSIsIEVudGl0eS50ZXh0KCJib2R5IikpOworICAgICAgICAgICAgZmFpbCgiUHJvY2Vzc2luZ0V4Y2VwdGlvbiBleHBlY3RlZC4iKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgUHJvY2Vzc2luZ0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgYXNzZXJ0VGhhdChleC5nZXRDYXVzZSgpLmdldENsYXNzKCksIGFueU9mKENvcmVNYXRjaGVycy48Q2xhc3M8Pz4+ZXF1YWxUbyhQcm90b2NvbEV4Y2VwdGlvbi5jbGFzcyksCisgICAgICAgICAgICAgICAgICAgIENvcmVNYXRjaGVycy48Q2xhc3M8Pz4+ZXF1YWxUbyhDb25uZWN0RXhjZXB0aW9uLmNsYXNzKSkpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgQ2xpZW50IGMyID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGMyLnRhcmdldCgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL215UGF0aCIpLnJlcXVlc3QoKS5wcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLlNVUFBSRVNTX0hUVFBfQ09NUExJQU5DRV9WQUxJREFUSU9OLAorICAgICAgICAgICAgICAgICAgICB0cnVlKS5tZXRob2QoIkRFTEVURSIsIEVudGl0eS50ZXh0KCJib2R5IikpOworICAgICAgICAgICAgZmFpbCgiUHJvY2Vzc2luZ0V4Y2VwdGlvbiBleHBlY3RlZC4iKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgUHJvY2Vzc2luZ0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgYXNzZXJ0VGhhdChleC5nZXRDYXVzZSgpLmdldENsYXNzKCksIGFueU9mKENvcmVNYXRjaGVycy48Q2xhc3M8Pz4+ZXF1YWxUbyhQcm90b2NvbEV4Y2VwdGlvbi5jbGFzcyksCisgICAgICAgICAgICAgICAgICAgIENvcmVNYXRjaGVycy48Q2xhc3M8Pz4+ZXF1YWxUbyhDb25uZWN0RXhjZXB0aW9uLmNsYXNzKSkpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgQ2xpZW50IGMzID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKS5wcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLlNVUFBSRVNTX0hUVFBfQ09NUExJQU5DRV9WQUxJREFUSU9OLCBmYWxzZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjMy50YXJnZXQoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9teVBhdGgiKS5yZXF1ZXN0KCkucHJvcGVydHkoQ2xpZW50UHJvcGVydGllcy5TVVBQUkVTU19IVFRQX0NPTVBMSUFOQ0VfVkFMSURBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgdHJ1ZSkubWV0aG9kKCJERUxFVEUiLCBFbnRpdHkudGV4dCgiYm9keSIpKTsKKyAgICAgICAgICAgIGZhaWwoIlByb2Nlc3NpbmdFeGNlcHRpb24gZXhwZWN0ZWQuIik7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFByb2Nlc3NpbmdFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoZXguZ2V0Q2F1c2UoKS5nZXRDbGFzcygpLCBhbnlPZihDb3JlTWF0Y2hlcnMuPENsYXNzPD8+PmVxdWFsVG8oUHJvdG9jb2xFeGNlcHRpb24uY2xhc3MpLAorICAgICAgICAgICAgICAgICAgICBDb3JlTWF0Y2hlcnMuPENsYXNzPD8+PmVxdWFsVG8oQ29ubmVjdEV4Y2VwdGlvbi5jbGFzcykpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyB0aGF0IHByZXNlbmNlIG9mIHJlcXVlc3QgZW50aXR5IGZvIEhUVFAgREVMRVRFIG1ldGhvZCBmYWlscyBpbiBKZXJzZXkgd2l0aCB7QGNvZGUgSWxsZWdhbFN0YXRlRXhjZXB0aW9ufQorICAgICAqIGlmIEhUVFAgc3BlYyBjb21wbGlhbmNlIGlzIG5vdCBzdXBwcmVzc2VkIGJ5IHtAbGluayBDbGllbnRQcm9wZXJ0aWVzI1NVUFBSRVNTX0hUVFBfQ09NUExJQU5DRV9WQUxJREFUSU9OfSBwcm9wZXJ0eS4KKyAgICAgKiA8cC8+CisgICAgICogU2VlIGFsc28gSkVSU0VZLTE3MTEuCisgICAgICoKKyAgICAgKiBAc2VlICNvdmVycmlkZUh0dHBNZXRob2RCYXNlZENvbXBsaWFuY2VDaGVja1Rlc3QoKQorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgb3ZlcnJpZGVIdHRwTWV0aG9kQmFzZWRDb21wbGlhbmNlQ2hlY2tOZWdhdGl2ZVRlc3QoKSB7CisgICAgICAgIGZpbmFsIENsaWVudCBjMSA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjMS50YXJnZXQoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9teVBhdGgiKS5yZXF1ZXN0KCkubWV0aG9kKCJERUxFVEUiLCBFbnRpdHkudGV4dCgiYm9keSIpKTsKKyAgICAgICAgICAgIGZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZC4iKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgICAgICAvLyBwYXNzCisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBDbGllbnQgYzIgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYzIudGFyZ2V0KCJodHRwOi8vbG9jYWxob3N0OjgwODAvbXlQYXRoIikucmVxdWVzdCgpLnByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuU1VQUFJFU1NfSFRUUF9DT01QTElBTkNFX1ZBTElEQVRJT04sCisgICAgICAgICAgICAgICAgICAgIGZhbHNlKS5tZXRob2QoIkRFTEVURSIsIEVudGl0eS50ZXh0KCJib2R5IikpOworICAgICAgICAgICAgZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkLiIpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgICAgIC8vIHBhc3MKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIENsaWVudCBjMyA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KCkucHJvcGVydHkoQ2xpZW50UHJvcGVydGllcy5TVVBQUkVTU19IVFRQX0NPTVBMSUFOQ0VfVkFMSURBVElPTiwgdHJ1ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjMy50YXJnZXQoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9teVBhdGgiKS5yZXF1ZXN0KCkucHJvcGVydHkoQ2xpZW50UHJvcGVydGllcy5TVVBQUkVTU19IVFRQX0NPTVBMSUFOQ0VfVkFMSURBVElPTiwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UpLm1ldGhvZCgiREVMRVRFIiwgRW50aXR5LnRleHQoImJvZHkiKSk7CisgICAgICAgICAgICBmYWlsKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQuIik7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICAgICAgLy8gcGFzcworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TnVsbFJlc3BvbnNlVHlwZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKTsKKyAgICAgICAgY2xpZW50LnJlZ2lzdGVyKG5ldyBDbGllbnRSZXF1ZXN0RmlsdGVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoZmluYWwgQ2xpZW50UmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuYWJvcnRXaXRoKFJlc3BvbnNlLm9rKCkuYnVpbGQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSBjbGllbnQudGFyZ2V0KCJodHRwOi8vbG9jYWxob3N0OjgwODAvbXlwYXRoIik7CisKKyAgICAgICAgZmluYWwgQ2xhc3M8UmVzcG9uc2U+IHJlc3BvbnNlVHlwZSA9IG51bGw7CisgICAgICAgIGZpbmFsIFN0cmluZ1tdIG1ldGhvZHMgPSBuZXcgU3RyaW5nW10geyJHRVQiLCAiUFVUIiwgIlBPU1QiLCAiREVMRVRFIiwgIk9QVElPTlMifTsKKworICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBtZXRob2QgOiBtZXRob2RzKSB7CisgICAgICAgICAgICBmaW5hbCBJbnZvY2F0aW9uLkJ1aWxkZXIgcmVxdWVzdCA9IHRhcmdldC5yZXF1ZXN0KCk7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5tZXRob2QobWV0aG9kLCByZXNwb25zZVR5cGUpOworICAgICAgICAgICAgICAgIGZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleHBlY3RlZC4iKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKKyAgICAgICAgICAgICAgICAvLyBPSy4KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgSW52b2NhdGlvbiBidWlsZCA9ICJQVVQiLmVxdWFscyhtZXRob2QpID8gcmVxdWVzdC5idWlsZChtZXRob2QsIEVudGl0eS5lbnRpdHkoIiIsCisgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKSA6IHJlcXVlc3QuYnVpbGQobWV0aG9kKTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBidWlsZC5zdWJtaXQocmVzcG9uc2VUeXBlKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQuIik7CisgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7CisgICAgICAgICAgICAgICAgLy8gT0suCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYnVpbGQuaW52b2tlKHJlc3BvbnNlVHlwZSk7CisgICAgICAgICAgICAgICAgZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4cGVjdGVkLiIpOworICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgeworICAgICAgICAgICAgICAgIC8vIE9LLgorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlcXVlc3QuYXN5bmMoKS5tZXRob2QobWV0aG9kLCByZXNwb25zZVR5cGUpOworICAgICAgICAgICAgICAgIGZhaWwoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleHBlY3RlZC4iKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKKyAgICAgICAgICAgICAgICAvLyBPSy4KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZmFpbGVkQ2FsbGJhY2tUZXN0KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSW52b2NhdGlvbi5CdWlsZGVyIGJ1aWxkZXIgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpLnRhcmdldCgiaHR0cDovL2xvY2FsaG9zdDo4ODgvIikucmVxdWVzdCgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDE7IGkrKykgeworICAgICAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgICAgICBmaW5hbCBBdG9taWNJbnRlZ2VyIGFpID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CisgICAgICAgICAgICBmaW5hbCBJbnZvY2F0aW9uQ2FsbGJhY2s8U3RyaW5nPiBjYWxsYmFjayA9IG5ldyBJbnZvY2F0aW9uQ2FsbGJhY2s8U3RyaW5nPigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBjb21wbGV0ZWQoZmluYWwgU3RyaW5nIGFyZzApIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFpLnNldChhaS5nZXQoKSArIDEpOworICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBmYWlsZWQoZmluYWwgVGhyb3dhYmxlIHRocm93YWJsZSkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVzdWx0ID0gMTA7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhyb3dhYmxlIGluc3RhbmNlb2YgUHJvY2Vzc2luZ0V4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAxMDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUaHJvd2FibGUgaW9lID0gdGhyb3dhYmxlLmdldENhdXNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW9lIGluc3RhbmNlb2YgSU9FeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gMTAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGFpLnNldChhaS5nZXQoKSArIHJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGZpbmFsIEludm9jYXRpb24gaW52b2NhdGlvbiA9IGJ1aWxkZXIuYnVpbGRHZXQoKTsKKyAgICAgICAgICAgIGZpbmFsIEZ1dHVyZTxTdHJpbmc+IGZ1dHVyZSA9IGludm9jYXRpb24uc3VibWl0KGNhbGxiYWNrKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZnV0dXJlLmdldCgpOworICAgICAgICAgICAgICAgIGZhaWwoImZ1dHVyZS5nZXQoKSBzaG91bGQgaGF2ZSBmYWlsZWQuIik7CisgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGVjdXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFRocm93YWJsZSBwZSA9IGUuZ2V0Q2F1c2UoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJFeGVjdXRpb24gZXhjZXB0aW9uIGNhdXNlIGlzIG5vdCBhIFByb2Nlc3NpbmdFeGNlcHRpb246ICIgKyBwZS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgcGUgaW5zdGFuY2VvZiBQcm9jZXNzaW5nRXhjZXB0aW9uKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBUaHJvd2FibGUgaW9lID0gcGUuZ2V0Q2F1c2UoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJFeGVjdXRpb24gZXhjZXB0aW9uIGNhdXNlIGlzIG5vdCBhbiBJT0V4Y2VwdGlvbjogIiArIGlvZS50b1N0cmluZygpLCBpb2UgaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbik7CisgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxhdGNoLmF3YWl0KDEsIFRpbWVVbml0LlNFQ09ORFMpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMTExMCwgYWkuZ2V0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVVuYm91bmRDYWxsYmFjazxWPiBpbXBsZW1lbnRzIEludm9jYXRpb25DYWxsYmFjazxWPiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaDsKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBUaHJvd2FibGUgdGhyb3dhYmxlOworCisgICAgICAgIHB1YmxpYyBNeVVuYm91bmRDYWxsYmFjayhmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCkgeworICAgICAgICAgICAgdGhpcy5sYXRjaCA9IGxhdGNoOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNvbXBsZXRlZChmaW5hbCBWIHYpIHsKKyAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZhaWxlZChmaW5hbCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7CisgICAgICAgICAgICB0aGlzLnRocm93YWJsZSA9IHRocm93YWJsZTsKKyAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRocm93YWJsZSBnZXRUaHJvd2FibGUoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhyb3dhYmxlOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBmYWlsZWRVbmJvdW5kR2VuZXJpY0NhbGxiYWNrKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSW52b2NhdGlvbiBpbnZvY2F0aW9uID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKS50YXJnZXQoImh0dHA6Ly9sb2NhbGhvc3Q6ODg4LyIpLnJlcXVlc3QoKS5idWlsZEdldCgpOworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKworICAgICAgICBmaW5hbCBNeVVuYm91bmRDYWxsYmFjazxTdHJpbmc+IGNhbGxiYWNrID0gbmV3IE15VW5ib3VuZENhbGxiYWNrPFN0cmluZz4obGF0Y2gpOworICAgICAgICBpbnZvY2F0aW9uLnN1Ym1pdChjYWxsYmFjayk7CisKKyAgICAgICAgbGF0Y2guYXdhaXQoMSwgVGltZVVuaXQuU0VDT05EUyk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChjYWxsYmFjay5nZXRUaHJvd2FibGUoKSwgQ29yZU1hdGNoZXJzLmluc3RhbmNlT2YoUHJvY2Vzc2luZ0V4Y2VwdGlvbi5jbGFzcykpOworICAgICAgICBhc3NlcnRUaGF0KGNhbGxiYWNrLmdldFRocm93YWJsZSgpLmdldENhdXNlKCksIENvcmVNYXRjaGVycy5pbnN0YW5jZU9mKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykpOworICAgICAgICBhc3NlcnRUaGF0KGNhbGxiYWNrLmdldFRocm93YWJsZSgpLmdldENhdXNlKCkuZ2V0TWVzc2FnZSgpLCBDb3JlTWF0Y2hlcnMKKyAgICAgICAgICAgICAgICAuYWxsT2YoQ29yZU1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nKE15VW5ib3VuZENhbGxiYWNrLmNsYXNzLmdldE5hbWUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBDb3JlTWF0Y2hlcnMuY29udGFpbnNTdHJpbmcoSW52b2NhdGlvbkNhbGxiYWNrLmNsYXNzLmdldE5hbWUoKSkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJtaXRXaXRoR2VuZXJpY1R5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3N1Ym1pdFdpdGhHZW5lcmljVHlwZShuZXcgR2VuZXJpY1R5cGU8U3RyaW5nPigpIHt9KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJtaXRXaXRoR2VuZXJpY1R5cGVQYXJhbSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfc3VibWl0V2l0aEdlbmVyaWNUeXBlKG5ldyBHZW5lcmljVHlwZShTdHJpbmcuY2xhc3MpIHt9KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3N1Ym1pdFdpdGhHZW5lcmljVHlwZShmaW5hbCBHZW5lcmljVHlwZSB0eXBlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSW52b2NhdGlvbi5CdWlsZGVyIGJ1aWxkZXIgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKFRlcm1pbmF0aW5nRmlsdGVyLmNsYXNzKQorICAgICAgICAgICAgICAgIC50YXJnZXQoImh0dHA6Ly9sb2NhbGhvc3QvIikKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpOworCisgICAgICAgIGZpbmFsIEF0b21pY1JlZmVyZW5jZTxTdHJpbmc+IHJlZmVyZW5jZSA9IG5ldyBBdG9taWNSZWZlcmVuY2U8U3RyaW5nPigpOworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKworICAgICAgICBmaW5hbCBJbnZvY2F0aW9uQ2FsbGJhY2sgY2FsbGJhY2sgPSBuZXcgSW52b2NhdGlvbkNhbGxiYWNrPE9iamVjdD4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbXBsZXRlZChmaW5hbCBPYmplY3Qgb2JqKSB7CisgICAgICAgICAgICAgICAgcmVmZXJlbmNlLnNldChvYmoudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgZmFpbGVkKGZpbmFsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKKyAgICAgICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICAvL25vaW5zcGVjdGlvbiB1bmNoZWNrZWQKKyAgICAgICAgKChKZXJzZXlJbnZvY2F0aW9uKSBidWlsZGVyLmJ1aWxkR2V0KCkpCisgICAgICAgICAgICAgICAgLnN1Ym1pdCh0eXBlLCAoSW52b2NhdGlvbkNhbGxiYWNrPFN0cmluZz4pIGNhbGxiYWNrKTsKKworICAgICAgICBsYXRjaC5hd2FpdCgpOworCisgICAgICAgIGFzc2VydFRoYXQocmVmZXJlbmNlLmdldCgpLCBpcygiRU5USVRZIikpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVybWluYXRpbmdGaWx0ZXIgaW1wbGVtZW50cyBDbGllbnRSZXF1ZXN0RmlsdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKGZpbmFsIENsaWVudFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuYWJvcnRXaXRoKFJlc3BvbnNlLm9rKCJFTlRJVFkiKS5idWlsZCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcnVudGltZUV4Y2VwdGlvbkluQXN5bmNJbnZvY2F0aW9uKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBBc3luY0ludm9rZXIgYWkgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpLnJlZ2lzdGVyKG5ldyBFeGNlcHRpb25JbnZva2VyRmlsdGVyKCkpCisgICAgICAgICAgICAgICAgLnRhcmdldCgiaHR0cDovL2xvY2FsaG9zdDo4ODgvIikucmVxdWVzdCgpLmFzeW5jKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFpLmdldCgpLmdldCgpOworICAgICAgICAgICAgZmFpbCgiRXhlY3V0aW9uRXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGVlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoUHJvY2Vzc2luZ0V4Y2VwdGlvbi5jbGFzcywgZWUuZ2V0Q2F1c2UoKS5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhSdW50aW1lRXhjZXB0aW9uLmNsYXNzLCBlZS5nZXRDYXVzZSgpLmdldENhdXNlKCkuZ2V0Q2xhc3MoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEV4Y2VwdGlvbkludm9rZXJGaWx0ZXIgaW1wbGVtZW50cyBDbGllbnRSZXF1ZXN0RmlsdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKGZpbmFsIENsaWVudFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4Y2VwdGlvbkludm9rZXJGaWx0ZXIgUnVudGltZUV4Y2VwdGlvbiIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvSmVyc2V5V2ViVGFyZ2V0VGVzdC5qYXZhIGIvY29yZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvSmVyc2V5V2ViVGFyZ2V0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYmUyZjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9KZXJzZXlXZWJUYXJnZXRUZXN0LmphdmEKQEAgLTAsMCArMSw0NDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SZWFkZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudXJpLmludGVybmFsLkplcnNleVVyaUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCisvKioKKyAqIHtAY29kZSBKZXJzZXlXZWJUYXJnZXR9IGltcGxlbWVudGF0aW9uIHVuaXQgdGVzdHMuCisgKgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXlXZWJUYXJnZXRUZXN0IHsKKyAgICBwcml2YXRlIEplcnNleUNsaWVudCBjbGllbnQ7CisgICAgcHJpdmF0ZSBKZXJzZXlXZWJUYXJnZXQgdGFyZ2V0OworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICB0aGlzLmNsaWVudCA9IChKZXJzZXlDbGllbnQpIENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KCk7CisgICAgICAgIHRoaXMudGFyZ2V0ID0gY2xpZW50LnRhcmdldCgiLyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsb3NlKCkgeworICAgICAgICBjbGllbnQuY2xvc2UoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRhcmdldC5nZXRVcmlCdWlsZGVyKCk7CisgICAgICAgICAgICBmYWlsKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gd2FzIGV4cGVjdGVkLiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRhcmdldC5nZXRDb25maWd1cmF0aW9uKCk7CisgICAgICAgICAgICBmYWlsKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gd2FzIGV4cGVjdGVkLiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RQcm92aWRlciBpbXBsZW1lbnRzIFJlYWRlckludGVyY2VwdG9yIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE9iamVjdCBhcm91bmRSZWFkRnJvbShSZWFkZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5wcm9jZWVkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBSZXByb2R1Y2VyIEpFUlNFWS0xNjM3CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVnaXN0ZXJOdWxsT3JFbXB0eUNvbnRyYWN0cygpIHsKKyAgICAgICAgZmluYWwgVGVzdFByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IFRlc3RQcm92aWRlcigpOworCisgICAgICAgIHRhcmdldC5yZWdpc3RlcihUZXN0UHJvdmlkZXIuY2xhc3MsIChDbGFzczw/PltdKSBudWxsKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UodGFyZ2V0LmdldENvbmZpZ3VyYXRpb24oKS5pc1JlZ2lzdGVyZWQoVGVzdFByb3ZpZGVyLmNsYXNzKSk7CisKKyAgICAgICAgdGFyZ2V0LnJlZ2lzdGVyKHByb3ZpZGVyLCAoQ2xhc3M8Pz5bXSkgbnVsbCk7CisgICAgICAgIGFzc2VydEZhbHNlKHRhcmdldC5nZXRDb25maWd1cmF0aW9uKCkuaXNSZWdpc3RlcmVkKFRlc3RQcm92aWRlci5jbGFzcykpOworICAgICAgICBhc3NlcnRGYWxzZSh0YXJnZXQuZ2V0Q29uZmlndXJhdGlvbigpLmlzUmVnaXN0ZXJlZChwcm92aWRlcikpOworCisgICAgICAgIHRhcmdldC5yZWdpc3RlcihUZXN0UHJvdmlkZXIuY2xhc3MsIG5ldyBDbGFzc1swXSk7CisgICAgICAgIGFzc2VydEZhbHNlKHRhcmdldC5nZXRDb25maWd1cmF0aW9uKCkuaXNSZWdpc3RlcmVkKFRlc3RQcm92aWRlci5jbGFzcykpOworCisgICAgICAgIHRhcmdldC5yZWdpc3Rlcihwcm92aWRlciwgbmV3IENsYXNzWzBdKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UodGFyZ2V0LmdldENvbmZpZ3VyYXRpb24oKS5pc1JlZ2lzdGVyZWQoVGVzdFByb3ZpZGVyLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHRhcmdldC5nZXRDb25maWd1cmF0aW9uKCkuaXNSZWdpc3RlcmVkKHByb3ZpZGVyKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZVRlbXBsYXRlKCkgeworICAgICAgICBVUkkgdXJpOworICAgICAgICBVcmlCdWlsZGVyIHVyaUJ1aWxkZXI7CisKKyAgICAgICAgdXJpID0gdGFyZ2V0LnJlc29sdmVUZW1wbGF0ZSgiYSIsICJ2IikuZ2V0VXJpKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiLyIsIHVyaS50b1N0cmluZygpKTsKKworICAgICAgICB1cmkgPSB0YXJnZXQucGF0aCgie2F9IikucmVzb2x2ZVRlbXBsYXRlKCJhIiwgInYiKS5nZXRVcmkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvdiIsIHVyaS50b1N0cmluZygpKTsKKworICAgICAgICB1cmlCdWlsZGVyID0gdGFyZ2V0LnBhdGgoInthfSIpLnJlc29sdmVUZW1wbGF0ZSgicXFxIiwgInFxcSIpLmdldFVyaUJ1aWxkZXIoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIve2F9IiwgdXJpQnVpbGRlci50b1RlbXBsYXRlKCkpOworCisgICAgICAgIHVyaUJ1aWxkZXIgPSB0YXJnZXQucGF0aCgie2F9IikucmVzb2x2ZVRlbXBsYXRlKCJhIiwgInYiKS5yZXNvbHZlVGVtcGxhdGUoImEiLCAieCIpLmdldFVyaUJ1aWxkZXIoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvdiIsIHVyaUJ1aWxkZXIuYnVpbGQoKS50b1N0cmluZygpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGFyZ2V0LnJlc29sdmVUZW1wbGF0ZShudWxsLCBudWxsKTsKKyAgICAgICAgICAgIGZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIGV4cGVjdGVkLiIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc29sdmVUZW1wbGF0ZTIoKSB7CisgICAgICAgIGZpbmFsIEplcnNleVdlYlRhcmdldCBuZXdUYXJnZXQgPSB0YXJnZXQucGF0aCgicGF0aC97YX0iKS5xdWVyeVBhcmFtKCJxdWVyeSIsICJ7cX0iKS5yZXNvbHZlVGVtcGxhdGUoImEiLCAicGFyYW0tYSIpOworICAgICAgICBmaW5hbCBKZXJzZXlVcmlCdWlsZGVyIHVyaUJ1aWxkZXIgPSAoSmVyc2V5VXJpQnVpbGRlcikgbmV3VGFyZ2V0LmdldFVyaUJ1aWxkZXIoKTsKKyAgICAgICAgdXJpQnVpbGRlci5yZXNvbHZlVGVtcGxhdGUoInEiLCAicGFyYW0tcSIpLnJlc29sdmVUZW1wbGF0ZSgiYSIsICJ3aWxsLWJlLWlnbm9yZWQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoIi9wYXRoL3BhcmFtLWE/cXVlcnk9cGFyYW0tcSIpLCB1cmlCdWlsZGVyLmJ1aWxkKCkpOworCisgICAgICAgIGZpbmFsIFVyaUJ1aWxkZXIgdXJpQnVpbGRlck5ldyA9IG5ld1RhcmdldC5yZXNvbHZlVGVtcGxhdGUoImEiLCAid2lsbC1iZS1pZ25vcmVkIikucmVzb2x2ZVRlbXBsYXRlKCJxIiwKKyAgICAgICAgICAgICAgICAibmV3LXEiKS5nZXRVcmlCdWlsZGVyKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCIvcGF0aC9wYXJhbS1hP3F1ZXJ5PW5ldy1xIiksIHVyaUJ1aWxkZXJOZXcuYnVpbGQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZVRlbXBsYXRlMygpIHsKKyAgICAgICAgZmluYWwgSmVyc2V5V2ViVGFyZ2V0IHdlYlRhcmdldCA9IHRhcmdldC5wYXRoKCJwYXRoL3thfSIpLnBhdGgoIntifSIpLnF1ZXJ5UGFyYW0oInF1ZXJ5IiwgIntxfSIpCisgICAgICAgICAgICAgICAgLnJlc29sdmVUZW1wbGF0ZSgiYSIsICJwYXJhbS1hIikucmVzb2x2ZVRlbXBsYXRlKCJxIiwgInBhcmFtLXEiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvcGF0aC9wYXJhbS1hL3tifT9xdWVyeT1wYXJhbS1xIiwgd2ViVGFyZ2V0LmdldFVyaUJ1aWxkZXIoKS50b1RlbXBsYXRlKCkpOworICAgICAgICAvLyByZXNvbHZlIGIgaW4gd2ViVGFyZ2V0CisgICAgICAgIGFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCIvcGF0aC9wYXJhbS1hL3BhcmFtLWI/cXVlcnk9cGFyYW0tcSIpLCB3ZWJUYXJnZXQucmVzb2x2ZVRlbXBsYXRlKCJiIiwKKyAgICAgICAgICAgICAgICAicGFyYW0tYiIpLmdldFVyaSgpKTsKKworICAgICAgICAvLyBjaGVjayB0aGF0IG9yaWdpbmFsIHdlYlRhcmdldCBoYXMgbm90IGJlZW4gY2hhbmdlZAorICAgICAgICBhc3NlcnRFcXVhbHMoIi9wYXRoL3BhcmFtLWEve2J9P3F1ZXJ5PXBhcmFtLXEiLCB3ZWJUYXJnZXQuZ2V0VXJpQnVpbGRlcigpLnRvVGVtcGxhdGUoKSk7CisKKyAgICAgICAgLy8gcmVzb2x2ZSBiIGluIFVyaUJ1aWxkZXIKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoIi9wYXRoL3BhcmFtLWEvcGFyYW0tYj9xdWVyeT1wYXJhbS1xIiksICgoSmVyc2V5VXJpQnVpbGRlcikgd2ViVGFyZ2V0LmdldFVyaUJ1aWxkZXIoKSkKKyAgICAgICAgICAgICAgICAucmVzb2x2ZVRlbXBsYXRlKCJiIiwgInBhcmFtLWIiKS5idWlsZCgpKTsKKworICAgICAgICAvLyByZXNvbHZlIGluIGJ1aWxkIG1ldGhvZAorICAgICAgICBhc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiL3BhdGgvcGFyYW0tYS9wYXJhbS1iP3F1ZXJ5PXBhcmFtLXEiKSwgKChKZXJzZXlVcmlCdWlsZGVyKSB3ZWJUYXJnZXQuZ2V0VXJpQnVpbGRlcigpKQorICAgICAgICAgICAgICAgIC5idWlsZCgicGFyYW0tYiIpKTsKKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc29sdmVUZW1wbGF0ZUZyb21FbmNvZGVkKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgYSA9ICJhJTIwJTNGLyovIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIGIgPSAiL2IvIjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvcGF0aC9hJTIwJTNGLyovLy9iLyIsIHRhcmdldC5wYXRoKCJwYXRoL3thfS97Yn0iKS5yZXNvbHZlVGVtcGxhdGVGcm9tRW5jb2RlZCgiYSIsCisgICAgICAgICAgICAgICAgYSkucmVzb2x2ZVRlbXBsYXRlRnJvbUVuY29kZWQoImIiLCBiKS5nZXRVcmkoKS50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvcGF0aC9hJTI1MjAlMjUzRiUyRiolMkYvJTJGYiUyRiIsIHRhcmdldC5wYXRoKCJwYXRoL3thfS97Yn0iKS5yZXNvbHZlVGVtcGxhdGUoImEiLAorICAgICAgICAgICAgICAgIGEpLnJlc29sdmVUZW1wbGF0ZSgiYiIsIGIpLmdldFVyaSgpLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9wYXRoL2ElMjUyMCUyNTNGLyovLy9iLyIsIHRhcmdldC5wYXRoKCJwYXRoL3thfS97Yn0iKS5yZXNvbHZlVGVtcGxhdGUoImEiLAorICAgICAgICAgICAgICAgIGEsIGZhbHNlKS5yZXNvbHZlVGVtcGxhdGUoImIiLCBiLCBmYWxzZSkuZ2V0VXJpKCkudG9TdHJpbmcoKSk7CisgICAgfQorCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlVGVtcGxhdGVzRnJvbUVuY29kZWQoKSB7CisgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisgICAgICAgIG1hcC5wdXQoImEiLCAiYSUyMCUzRi8qLyIpOworICAgICAgICBtYXAucHV0KCJiIiwgIi9iLyIpOworCisgICAgICAgIGFzc2VydEVxdWFscygiL3BhdGgvYSUyMCUzRi8qLy8vYi8iLCB0YXJnZXQucGF0aCgicGF0aC97YX0ve2J9IikucmVzb2x2ZVRlbXBsYXRlc0Zyb21FbmNvZGVkKG1hcCkuZ2V0VXJpKCkKKyAgICAgICAgICAgICAgICAudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiL3BhdGgvYSUyNTIwJTI1M0YlMkYqJTJGLyUyRmIlMkYiLCB0YXJnZXQucGF0aCgicGF0aC97YX0ve2J9IikucmVzb2x2ZVRlbXBsYXRlcyhtYXApLmdldFVyaSgpCisgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9wYXRoL2ElMjUyMCUyNTNGLyovLy9iLyIsIHRhcmdldC5wYXRoKCJwYXRoL3thfS97Yn0iKS5yZXNvbHZlVGVtcGxhdGVzKG1hcCwKKyAgICAgICAgICAgICAgICBmYWxzZSkuZ2V0VXJpKCkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgTGlzdDxNYXA8U3RyaW5nLCBPYmplY3Q+PiBjb3JydXB0ZWRUZW1wbGF0ZVZhbHVlc0xpc3QgPSBBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCkge3sKKyAgICAgICAgICAgICAgICAgICAgcHV0KG51bGwsICJ2YWx1ZSIpOworICAgICAgICAgICAgICAgIH19LAorICAgICAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpIHt7CisgICAgICAgICAgICAgICAgICAgIHB1dCgibmFtZSIsIG51bGwpOworICAgICAgICAgICAgICAgIH19LAorICAgICAgICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpIHt7CisgICAgICAgICAgICAgICAgICAgIHB1dCgiYSIsICJmb28iKTsKKyAgICAgICAgICAgICAgICAgICAgcHV0KCJuYW1lIiwgbnVsbCk7CisgICAgICAgICAgICAgICAgfX0sCisgICAgICAgICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCkge3sKKyAgICAgICAgICAgICAgICAgICAgcHV0KCJuYW1lIiwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIHB1dCgiYSIsICJmb28iKTsKKyAgICAgICAgICAgICAgICB9fQorICAgICAgICApOworCisgICAgICAgIGZvciAoZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBjb3JydXB0ZWRUZW1wbGF0ZVZhbHVlcyA6IGNvcnJ1cHRlZFRlbXBsYXRlVmFsdWVzTGlzdCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB0YXJnZXQucGF0aCgicGF0aC97YX0ve2J9IikucmVzb2x2ZVRlbXBsYXRlc0Zyb21FbmNvZGVkKGNvcnJ1cHRlZFRlbXBsYXRlVmFsdWVzKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBleHBlY3RlZC4gIiArIGNvcnJ1cHRlZFRlbXBsYXRlVmFsdWVzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhwZWN0ZWQgZm9yIHRlbXBsYXRlIHZhbHVlcyAiICsgY29ycnVwdGVkVGVtcGxhdGVWYWx1ZXMgKyAiLCBjYXVnaHQ6ICIgKyBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBjb3JydXB0ZWRUZW1wbGF0ZVZhbHVlcyA6IGNvcnJ1cHRlZFRlbXBsYXRlVmFsdWVzTGlzdCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB0YXJnZXQucGF0aCgicGF0aC97YX0ve2J9IikucmVzb2x2ZVRlbXBsYXRlcyhjb3JydXB0ZWRUZW1wbGF0ZVZhbHVlcyk7CisgICAgICAgICAgICAgICAgZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhwZWN0ZWQuICIgKyBjb3JydXB0ZWRUZW1wbGF0ZVZhbHVlcyk7CisgICAgICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIGV4cGVjdGVkIGZvciB0ZW1wbGF0ZSB2YWx1ZXMgIiArIGNvcnJ1cHRlZFRlbXBsYXRlVmFsdWVzICsgIiwgY2F1Z2h0OiAiICsgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gY29ycnVwdGVkVGVtcGxhdGVWYWx1ZXMgOiBjb3JydXB0ZWRUZW1wbGF0ZVZhbHVlc0xpc3QpIHsKKyAgICAgICAgICAgIGZvciAoZmluYWwgYm9vbGVhbiBlbmNvZGUgOiBuZXcgYm9vbGVhbltde3RydWUsIGZhbHNlfSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHRhcmdldC5wYXRoKCJwYXRoL3thfS97Yn0iKS5yZXNvbHZlVGVtcGxhdGVzKGNvcnJ1cHRlZFRlbXBsYXRlVmFsdWVzLCBlbmNvZGUpOworICAgICAgICAgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBleHBlY3RlZC4gIiArIGNvcnJ1cHRlZFRlbXBsYXRlVmFsdWVzKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIGV4cGVjdGVkIGZvciB0ZW1wbGF0ZSB2YWx1ZXMgIiArIGNvcnJ1cHRlZFRlbXBsYXRlVmFsdWVzICsgIiwgY2F1Z2h0OiAiICsgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRVcmlCdWlsZGVyKCkgeworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IHBhcmFtcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigyKTsKKyAgICAgICAgcGFyYW1zLnB1dCgiYSIsICJ3MSIpOworICAgICAgICBVcmlCdWlsZGVyIHVyaUJ1aWxkZXIgPSB0YXJnZXQucGF0aCgie2F9IikucmVzb2x2ZVRlbXBsYXRlKCJhIiwgInYxIikucmVzb2x2ZVRlbXBsYXRlcyhwYXJhbXMpLmdldFVyaUJ1aWxkZXIoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvdjEiLCB1cmlCdWlsZGVyLmJ1aWxkKCkudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UXVlcnlQYXJhbXMoKSB7CisgICAgICAgIFVSSSB1cmk7CisKKyAgICAgICAgdXJpID0gdGFyZ2V0LnBhdGgoImEiKS5xdWVyeVBhcmFtKCJxIiwgInYxIiwgInYyIikucXVlcnlQYXJhbSgicSIpLmdldFVyaSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9hIiwgdXJpLnRvU3RyaW5nKCkpOworCisgICAgICAgIHVyaSA9IHRhcmdldC5wYXRoKCJhIikucXVlcnlQYXJhbSgicSIsICJ2MSIsICJ2MiIpLnF1ZXJ5UGFyYW0oInEiLCAoT2JqZWN0KSBudWxsKS5nZXRVcmkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvYSIsIHVyaS50b1N0cmluZygpKTsKKworICAgICAgICB1cmkgPSB0YXJnZXQucGF0aCgiYSIpLnF1ZXJ5UGFyYW0oInEiLCAidjEiLCAidjIiKS5xdWVyeVBhcmFtKCJxIiwgKE9iamVjdFtdKSBudWxsKS5nZXRVcmkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvYSIsIHVyaS50b1N0cmluZygpKTsKKworICAgICAgICB1cmkgPSB0YXJnZXQucGF0aCgiYSIpLnF1ZXJ5UGFyYW0oInEiLCAidjEiLCAidjIiKS5xdWVyeVBhcmFtKCJxIiwgbmV3IE9iamVjdFtde30pLmdldFVyaSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9hIiwgdXJpLnRvU3RyaW5nKCkpOworCisgICAgICAgIHVyaSA9IHRhcmdldC5wYXRoKCJhIikucXVlcnlQYXJhbSgicSIsICJ2IikuZ2V0VXJpKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiL2E/cT12IiwgdXJpLnRvU3RyaW5nKCkpOworCisgICAgICAgIHVyaSA9IHRhcmdldC5wYXRoKCJhIikucXVlcnlQYXJhbSgicTEiLCAidjEiKS5xdWVyeVBhcmFtKCJxMiIsICJ2MiIpLnF1ZXJ5UGFyYW0oInExIiwgKE9iamVjdCkgbnVsbCkuZ2V0VXJpKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiL2E/cTI9djIiLCB1cmkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRhcmdldC5xdWVyeVBhcmFtKCJxIiwgInYxIiwgbnVsbCwgInYyIiwgbnVsbCk7CisgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBleHBlY3RlZC4iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKworICAgICAgICB7CisgICAgICAgICAgICB1cmkgPSB0YXJnZXQucGF0aCgiYSIpLnF1ZXJ5UGFyYW0oInExIiwgInYxIikucXVlcnlQYXJhbSgicTIiLCAidjIiKS5xdWVyeVBhcmFtKCJxMSIsICJ3MSIsICJ3MiIpCisgICAgICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJxMiIsIChPYmplY3QpIG51bGwpLmdldFVyaSgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIvYT9xMT12MSZxMT13MSZxMT13MiIsIHVyaS50b1N0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0YXJnZXQucXVlcnlQYXJhbShudWxsKTsKKyAgICAgICAgICAgIGZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIGV4cGVjdGVkLiIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0YXJnZXQucXVlcnlQYXJhbShudWxsLCAicGFyYW0iKTsKKyAgICAgICAgICAgIGZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIGV4cGVjdGVkLiIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0YXJnZXQucGF0aCgiYSIpLnF1ZXJ5UGFyYW0oInExIiwgInYxIikucXVlcnlQYXJhbSgicTIiLCAidjIiKS5xdWVyeVBhcmFtKCJxMSIsICJ3MSIsIG51bGwpCisgICAgICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJxMiIsIChPYmplY3QpIG51bGwpOworCisgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBleHBlY3RlZC4iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXRyaXhQYXJhbXMoKSB7CisgICAgICAgIFVSSSB1cmk7CisKKyAgICAgICAgdXJpID0gdGFyZ2V0LnBhdGgoImEiKS5tYXRyaXhQYXJhbSgicSIsICJ2MSIsICJ2MiIpLm1hdHJpeFBhcmFtKCJxIikuZ2V0VXJpKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiL2EiLCB1cmkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgdXJpID0gdGFyZ2V0LnBhdGgoImEiKS5tYXRyaXhQYXJhbSgicSIsICJ2MSIsICJ2MiIpLm1hdHJpeFBhcmFtKCJxIiwgKE9iamVjdCkgbnVsbCkuZ2V0VXJpKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiL2EiLCB1cmkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgdXJpID0gdGFyZ2V0LnBhdGgoImEiKS5tYXRyaXhQYXJhbSgicSIsICJ2MSIsICJ2MiIpLm1hdHJpeFBhcmFtKCJxIiwgKE9iamVjdFtdKSBudWxsKS5nZXRVcmkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvYSIsIHVyaS50b1N0cmluZygpKTsKKworICAgICAgICB1cmkgPSB0YXJnZXQucGF0aCgiYSIpLm1hdHJpeFBhcmFtKCJxIiwgInYxIiwgInYyIikubWF0cml4UGFyYW0oInEiLCBuZXcgT2JqZWN0W117fSkuZ2V0VXJpKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiL2EiLCB1cmkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgdXJpID0gdGFyZ2V0LnBhdGgoImEiKS5tYXRyaXhQYXJhbSgicSIsICJ2IikuZ2V0VXJpKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiL2E7cT12IiwgdXJpLnRvU3RyaW5nKCkpOworCisgICAgICAgIHVyaSA9IHRhcmdldC5wYXRoKCJhIikubWF0cml4UGFyYW0oInExIiwgInYxIikubWF0cml4UGFyYW0oInEyIiwgInYyIikubWF0cml4UGFyYW0oInExIiwgKE9iamVjdCkgbnVsbCkuZ2V0VXJpKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiL2E7cTI9djIiLCB1cmkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRhcmdldC5tYXRyaXhQYXJhbSgicSIsICJ2MSIsIG51bGwsICJ2MiIsIG51bGwpOworICAgICAgICAgICAgZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhwZWN0ZWQuIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlTWF0cml4UGFyYW1zKCkgeworICAgICAgICBXZWJUYXJnZXQgd3QgPSB0YXJnZXQ7CisgICAgICAgIHd0ID0gd3QubWF0cml4UGFyYW0oIm1hdHJpeDEiLCAic2VnbWVudDEiKTsKKyAgICAgICAgd3QgPSB3dC5wYXRoKCJwYXRoMSIpOworICAgICAgICB3dCA9IHd0Lm1hdHJpeFBhcmFtKCJtYXRyaXgyIiwgInNlZ21lbnQxIik7CisgICAgICAgIHd0ID0gd3QubWF0cml4UGFyYW0oIm1hdHJpeDIiLCBuZXcgT2JqZWN0W117bnVsbH0pOworICAgICAgICB3dCA9IHd0LnBhdGgoInBhdGgyIik7CisgICAgICAgIHd0ID0gd3QubWF0cml4UGFyYW0oIm1hdHJpeDEiLCAic2VnbWVudDEiKTsKKyAgICAgICAgd3QgPSB3dC5tYXRyaXhQYXJhbSgibWF0cml4MSIsIG5ldyBPYmplY3RbXXtudWxsfSk7CisgICAgICAgIHd0ID0gd3QucGF0aCgicGF0aDMiKTsKKyAgICAgICAgVVJJIHVyaSA9IHd0LmdldFVyaSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi87bWF0cml4MT1zZWdtZW50MS9wYXRoMS9wYXRoMi9wYXRoMyIsIHVyaS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlTWF0cml4UGFyYW0oKSB7CisgICAgICAgIFdlYlRhcmdldCB3dCA9IHRhcmdldDsKKyAgICAgICAgd3QgPSB3dC5wYXRoKCJwYXRoMSIpOworICAgICAgICB3dCA9IHd0Lm1hdHJpeFBhcmFtKCJtYXRyaXgxMCIsICJzZWdtZW50MTAtZGVsZXRlIik7CisgICAgICAgIHd0ID0gd3QubWF0cml4UGFyYW0oIm1hdHJpeDExIiwgInNlZ21lbnQxMSIpOworICAgICAgICB3dCA9IHd0Lm1hdHJpeFBhcmFtKCJtYXRyaXgxMCIsIG5ldyBPYmplY3RbXXtudWxsfSk7CisgICAgICAgIHd0ID0gd3QucGF0aCgicGF0aDIiKTsKKyAgICAgICAgd3QgPSB3dC5tYXRyaXhQYXJhbSgibWF0cml4MjAiLCAic2VnbWVudDIwLWRlbGV0ZSIpOworICAgICAgICB3dCA9IHd0Lm1hdHJpeFBhcmFtKCJtYXRyaXgyMCIsIG5ldyBPYmplY3RbXXtudWxsfSk7CisgICAgICAgIHd0ID0gd3QubWF0cml4UGFyYW0oIm1hdHJpeDIwIiwgInNlZ21lbnQyMC1kZWxldGUtYWdhaW4iKTsKKyAgICAgICAgd3QgPSB3dC5tYXRyaXhQYXJhbSgibWF0cml4MjAiLCBuZXcgT2JqZWN0W117bnVsbH0pOworICAgICAgICB3dCA9IHd0LnBhdGgoInBhdGgzIik7CisgICAgICAgIHd0ID0gd3QubWF0cml4UGFyYW0oIm1hdHJpeDMwIiwgInNlZ21lbnQzMC1kZWxldGUiKTsKKyAgICAgICAgd3QgPSB3dC5tYXRyaXhQYXJhbSgibWF0cml4MzAiLCBuZXcgT2JqZWN0W117bnVsbH0pOworICAgICAgICB3dCA9IHd0Lm1hdHJpeFBhcmFtKCJtYXRyaXgzMCIsICJzZWdtZW50MzAtZGVsZXRlLWFnYWluIik7CisgICAgICAgIHd0ID0gd3QubWF0cml4UGFyYW0oIm1hdHJpeDMwIiwgbmV3IE9iamVjdFtde251bGx9KTsKKyAgICAgICAgd3QgPSB3dC5tYXRyaXhQYXJhbSgibWF0cml4MzAiLCAic2VnbWVudDMwIik7CisgICAgICAgIHd0ID0gd3QucGF0aCgicGF0aDQiKTsKKyAgICAgICAgd3QgPSB3dC5tYXRyaXhQYXJhbSgibWF0cml4NDAiLCAic2VnbWVudDQwLWRlbGV0ZSIpOworICAgICAgICB3dCA9IHd0Lm1hdHJpeFBhcmFtKCJtYXRyaXg0MCIsIG5ldyBPYmplY3RbXXtudWxsfSk7CisKKyAgICAgICAgVVJJIHVyaSA9IHd0LmdldFVyaSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9wYXRoMTttYXRyaXgxMT1zZWdtZW50MTEvcGF0aDIvcGF0aDM7bWF0cml4MzA9c2VnbWVudDMwL3BhdGg0IiwgdXJpLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gTnVsbFBvaW50ZXJFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdFF1ZXJ5UGFyYW1OdWxsKCkgeworICAgICAgICBXZWJUYXJnZXQgd3QgPSB0YXJnZXQ7CisKKyAgICAgICAgd3QucXVlcnlQYXJhbShudWxsKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IE51bGxQb2ludGVyRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXRoTnVsbCgpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHd0ID0gdGFyZ2V0OworCisgICAgICAgIHd0LnBhdGgobnVsbCk7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBOdWxsUG9pbnRlckV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZVRlbXBsYXRlTnVsbDEoKSB7CisgICAgICAgIFdlYlRhcmdldCB3dCA9IHRhcmdldDsKKworICAgICAgICB3dC5yZXNvbHZlVGVtcGxhdGUobnVsbCwgIiIsIHRydWUpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gTnVsbFBvaW50ZXJFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdFJlc29sdmVUZW1wbGF0ZU51bGwyKCkgeworICAgICAgICBXZWJUYXJnZXQgd3QgPSB0YXJnZXQ7CisKKyAgICAgICAgd3QucmVzb2x2ZVRlbXBsYXRlKCJuYW1lIiwgbnVsbCwgdHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBOdWxsUG9pbnRlckV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZVRlbXBsYXRlRnJvbUVuY29kZWROdWxsMSgpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHd0ID0gdGFyZ2V0OworCisgICAgICAgIHd0LnJlc29sdmVUZW1wbGF0ZUZyb21FbmNvZGVkKG51bGwsICIiKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IE51bGxQb2ludGVyRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlVGVtcGxhdGVGcm9tRW5jb2RlZE51bGwyKCkgeworICAgICAgICBXZWJUYXJnZXQgd3QgPSB0YXJnZXQ7CisKKyAgICAgICAgd3QucmVzb2x2ZVRlbXBsYXRlRnJvbUVuY29kZWQoIm5hbWUiLCBudWxsKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlVGVtcGxhdGVzRW5jb2RlZEVtcHR5TWFwKCkgeworICAgICAgICBXZWJUYXJnZXQgd3QgPSB0YXJnZXQ7CisgICAgICAgIHd0ID0gd3QucmVzb2x2ZVRlbXBsYXRlc0Zyb21FbmNvZGVkKENvbGxlY3Rpb25zLjxTdHJpbmcsIE9iamVjdD5lbXB0eU1hcCgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHModGFyZ2V0LCB3dCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZVRlbXBsYXRlc0VtcHR5TWFwKCkgeworICAgICAgICBXZWJUYXJnZXQgd3QgPSB0YXJnZXQ7CisgICAgICAgIHd0ID0gd3QucmVzb2x2ZVRlbXBsYXRlcyhDb2xsZWN0aW9ucy48U3RyaW5nLCBPYmplY3Q+ZW1wdHlNYXAoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRhcmdldCwgd3QpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc29sdmVUZW1wbGF0ZXNFbmNvZGVTbGFzaEVtcHR5TWFwKCkgeworICAgICAgICBXZWJUYXJnZXQgd3QgPSB0YXJnZXQ7CisgICAgICAgIHd0ID0gd3QucmVzb2x2ZVRlbXBsYXRlcyhDb2xsZWN0aW9ucy48U3RyaW5nLCBPYmplY3Q+ZW1wdHlNYXAoKSwgZmFsc2UpOworCisgICAgICAgIGFzc2VydEVxdWFscyh0YXJnZXQsIHd0KTsKKyAgICB9CisKK30KKworCmRpZmYgLS1naXQgYS9jb3JlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9MaW5rVGVzdC5qYXZhIGIvY29yZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvTGlua1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2I2MDI3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvTGlua1Rlc3QuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5MaW5rOworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogTGlua1Rlc3QgY2xhc3MuCisgKgorICogQGF1dGhvciBTYW50aWFnby5QZXJpY2FzLUdlZXJ0c2VuIChzYW50aWFnby5wZXJpY2FzZ2VlcnRzZW4gYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIExpbmtUZXN0IHsKKworICAgIHByaXZhdGUgSmVyc2V5Q2xpZW50IGNsaWVudDsKKworICAgIHB1YmxpYyBMaW5rVGVzdCgpIHsKKyAgICB9CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIHRoaXMuY2xpZW50ID0gKEplcnNleUNsaWVudCkgQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZvY2F0aW9uRnJvbUxpbmtOb0VudGl0eSgpIHsKKyAgICAgICAgTGluayBsID0gTGluay5mcm9tVXJpKCJodHRwOi8vZXhhbXBsZXMub3JnL2FwcCIpLnR5cGUoInRleHQvcGxhaW4iKS5idWlsZCgpOworICAgICAgICBhc3NlcnROb3ROdWxsKGwpOworCisgICAgICAgIGphdmF4LndzLnJzLmNsaWVudC5JbnZvY2F0aW9uIGkgPSBjbGllbnQuaW52b2NhdGlvbihsKS5idWlsZEdldCgpOworICAgICAgICBhc3NlcnROb3ROdWxsKGkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEludm9jYXRpb25Gcm9tTGlua1dpdGhFbnRpdHkoKSB7CisgICAgICAgIExpbmsgbCA9IExpbmsuZnJvbVVyaSgiaHR0cDovL2V4YW1wbGVzLm9yZy9hcHAiKS50eXBlKCIqLyoiKS5idWlsZCgpOworICAgICAgICBFbnRpdHk8U3RyaW5nPiBlID0gRW50aXR5LnRleHQoImhlbGxvIHdvcmxkIik7CisgICAgICAgIGphdmF4LndzLnJzLmNsaWVudC5JbnZvY2F0aW9uIGkgPSBjbGllbnQuaW52b2NhdGlvbihsKS5idWlsZFBvc3QoZSk7CisgICAgICAgIGFzc2VydFRydWUoaSAhPSBudWxsKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9TaHV0ZG93bkhvb2tMZWFrVGVzdC5qYXZhIGIvY29yZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvU2h1dGRvd25Ib29rTGVha1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTJmZWM3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvU2h1dGRvd25Ib29rTGVha1Rlc3QuamF2YQpAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudDsKKworaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QubnVtYmVyLk9yZGVyaW5nQ29tcGFyaXNvbi5sZXNzVGhhbjsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIFJlcHJvZHVjZXIgZm9yIEpFUlNFWS0yNzg2LgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBTaHV0ZG93bkhvb2tMZWFrVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSVRFUkFUSU9OUyA9IDQwMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRIUkVTSE9MRCA9IElURVJBVElPTlMgKiAyIC8gMzsKKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNodXRkb3duSG9va0RvZXNOb3RMZWFrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpOworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gY2xpZW50LnRhcmdldCgiaHR0cDovL2V4YW1wbGUuY29tIik7CisKKyAgICAgICAgZmluYWwgQ29sbGVjdGlvbiBzaHV0ZG93bkhvb2tzID0gZ2V0U2h1dGRvd25Ib29rcyhjbGllbnQpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgSVRFUkFUSU9OUzsgaSsrKSB7CisgICAgICAgICAgICAvLyBDcmVhdGUvSW5pdGlhbGl6ZSBjbGllbnQgcnVudGltZS4KKyAgICAgICAgICAgIHRhcmdldC5wcm9wZXJ0eSgiV2FzaGluZ3RvbiIsICJJcnZpbmciKQorICAgICAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgICAgIC5wcm9wZXJ0eSgiaG93IiwgIm5vdyIpCisgICAgICAgICAgICAgICAgICAgIC5idWlsZEdldCgpCisgICAgICAgICAgICAgICAgICAgIC5wcm9wZXJ0eSgiSXJ2aW5nIiwgIldhc2hpbmd0b24iKTsKKyAgICAgICAgfQorCisgICAgICAgIFN5c3RlbS5nYygpOworCisgICAgICAgIGludCBub3RFbnF1ZXVlZCA9IDA7CisgICAgICAgIGludCBub3ROdWxsID0gMDsKKyAgICAgICAgZm9yIChmaW5hbCBPYmplY3QgbyA6IHNodXRkb3duSG9va3MpIHsKKyAgICAgICAgICAgIGlmICgoKFdlYWtSZWZlcmVuY2U8SmVyc2V5Q2xpZW50LlNodXRkb3duSG9vaz4pIG8pLmdldCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBub3ROdWxsKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoISgoV2Vha1JlZmVyZW5jZTxKZXJzZXlDbGllbnQuU2h1dGRvd25Ib29rPikgbykuaXNFbnF1ZXVlZCgpKSB7CisgICAgICAgICAgICAgICAgbm90RW5xdWV1ZWQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydFRoYXQoCisgICAgICAgICAgICAgICAgIk5vbi1udWxsIHNodXRkb3duIGhvb2sgcmVmZXJlbmNlcyBjb3VudCBzaG91bGQgbm90IGNvcHkgbnVtYmVyIG9mIHByb3BlcnR5IGludm9jYXRpb24iLAorICAgICAgICAgICAgICAgIC8vIDY2ICUgc2VlbXMgbGlrZSBhIHJlYXNvbmFibGUgdGhyZXNob2xkIGZvciB0aGlzIHRlc3QgdG8ga2VlcCBpdCBzdGFibGUKKyAgICAgICAgICAgICAgICBub3ROdWxsLCBpcyhsZXNzVGhhbihUSFJFU0hPTEQpKSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdCgKKyAgICAgICAgICAgICAgICAiU2h1dGRvd24gaG9vayByZWZlcmVuY2VzIGNvdW50IG5vdCBlbnF1ZXVlZCBpbiB0aGUgUmVmZXJlbmNlUXVldWUgc2hvdWxkIG5vdCBjb3B5IG51bWJlciBvZiBwcm9wZXJ0eSBpbnZvY2F0aW9uIiwKKyAgICAgICAgICAgICAgICAvLyA2NiAlIHNlZW1zIGxpa2UgYSByZWFzb25hYmxlIHRocmVzaG9sZCBmb3IgdGhpcyB0ZXN0IHRvIGtlZXAgaXQgc3RhYmxlCisgICAgICAgICAgICAgICAgbm90RW5xdWV1ZWQsIGlzKGxlc3NUaGFuKFRIUkVTSE9MRCkpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIENvbGxlY3Rpb24gZ2V0U2h1dGRvd25Ib29rcyhmaW5hbCBDbGllbnQgY2xpZW50KSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24geworICAgICAgICBmaW5hbCBKZXJzZXlDbGllbnQgamVyc2V5Q2xpZW50ID0gKEplcnNleUNsaWVudCkgY2xpZW50OworICAgICAgICBmaW5hbCBGaWVsZCBzaHV0ZG93bkhvb2tzRmllbGQgPSBKZXJzZXlDbGllbnQuY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZCgic2h1dGRvd25Ib29rcyIpOworICAgICAgICBzaHV0ZG93bkhvb2tzRmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKKyAgICAgICAgcmV0dXJuIChDb2xsZWN0aW9uKSBzaHV0ZG93bkhvb2tzRmllbGQuZ2V0KGplcnNleUNsaWVudCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvVGVybWluYWxDbGllbnRSZXF1ZXN0RmlsdGVyLmphdmEgYi9jb3JlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9UZXJtaW5hbENsaWVudFJlcXVlc3RGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWZiNWFmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvVGVybWluYWxDbGllbnRSZXF1ZXN0RmlsdGVyLmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQ7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworLyoqCisgKiBDbGllbnQgcmVxdWVzdCBmaWx0ZXIsIHdoaWNoIGRvZXNuJ3QgcGVyZm9ybSBhY3R1YWwgcmVxdWVzdHMuCisgKgorICogU2V0cyB0aGUgcmVzcG9uc2UgYmFzZWQgb24gdmFyaW91cyByZXF1ZXN0IHByb3BlcnRpZXM6CisgKiA8dWw+CisgKiAgICAgPGxpPlJlc3BvbnNlIGNvZGUgaXMgdmFsdWUgb2YgcmVxdWVzdCBoZWFkZXIge0Bjb2RlICJSZXNwb25zZS1TdGF0dXMifSBvciB7QGNvZGUgMjAwfSwgaWYgbm90IHByZXNlbnQuPC9saT4KKyAqICAgICA8bGk+UmVzcG9uc2UgZW50aXR5IGlzIHJlcXVlc3QgZW50aXR5IG9yIHtAY29kZSAiTk8tRU5USVRZIn0sIGlmIHJlcXVlc3QgZW50aXR5IGlzIG5vdCBwcmVzZW50LjwvbGk+CisgKiAgICAgPGxpPlJlc3BvbnNlIGhlYWRlcnMgZG8gY29udGFpbiBhbGwgcmVxdWVzdCBoZWFkZXJzLCBuYW1lcyBhcmUgcHJlZml4ZWQgYnkge0Bjb2RlICJUZXN0LUhlYWRlci0ifS48L2xpPgorICogICAgIDxsaT5SZXNwb25zZSBoZWFkZXJzIGRvIGNvbnRhaW4gYWxsIHJlcXVlc3QgcHJvcGVydGllcywgbmFtZXMgYXJlIHByZWZpeGVkIGJ5IHtAY29kZSAiVGVzdC1Qcm9wZXJ0eS0ifS48L2xpPgorICogPC91bD4KKyAqCisgKiBBZGRpdGlvbmFsbHksIHJlc3BvbnNlIGhlYWRlcnMgY29udGFpbiB7QGNvZGUgIlRlc3QtVGhyZWFkIn0gKGN1cnJlbnQgdGhyZWFkIG5hbWUpLCB7QGNvZGUgIlRlc3QtVXJpIn0gKHJlcXVlc3QgVXJpKQorICogYW5kIHtAY29kZSAiVGVzdC1NZXRob2QifSAocmVxdWVzdCBIdHRwIG1ldGhvZCkuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK2NsYXNzIFRlcm1pbmFsQ2xpZW50UmVxdWVzdEZpbHRlciBpbXBsZW1lbnRzIENsaWVudFJlcXVlc3RGaWx0ZXIgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZmlsdGVyKGZpbmFsIENsaWVudFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBPYnRhaW4gZW50aXR5IC0gZnJvbSByZXF1ZXN0IG9yIGNyZWF0ZSBuZXcuCisgICAgICAgIGZpbmFsIEJ5dGVBcnJheUlucHV0U3RyZWFtIGVudGl0eSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5oYXNFbnRpdHkoKSA/IHJlcXVlc3RDb250ZXh0LmdldEVudGl0eSgpLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKSA6ICJOTy1FTlRJVFkiLmdldEJ5dGVzKCkKKyAgICAgICAgKTsKKworICAgICAgICBmaW5hbCBpbnQgcmVzcG9uc2VTdGF0dXMgPSBPcHRpb25hbC5vZk51bGxhYmxlKHJlcXVlc3RDb250ZXh0LmdldEhlYWRlcnMoKS5nZXRGaXJzdCgiUmVzcG9uc2UtU3RhdHVzIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChJbnRlZ2VyLmNsYXNzOjpjYXN0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vckVsc2UoMjAwKTsKKworICAgICAgICBSZXNwb25zZS5SZXNwb25zZUJ1aWxkZXIgcmVzcG9uc2UgPSBSZXNwb25zZS5zdGF0dXMocmVzcG9uc2VTdGF0dXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVudGl0eShlbnRpdHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnR5cGUoInRleHQvcGxhaW4iKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRlc3QgcHJvcGVydGllcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaGVhZGVyKCJUZXN0LVRocmVhZCIsIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5oZWFkZXIoIlRlc3QtVXJpIiwgcmVxdWVzdENvbnRleHQuZ2V0VXJpKCkudG9TdHJpbmcoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaGVhZGVyKCJUZXN0LU1ldGhvZCIsIHJlcXVlc3RDb250ZXh0LmdldE1ldGhvZCgpKTsKKworICAgICAgICAvLyBSZXF1ZXN0IGhlYWRlcnMgLT4gUmVzcG9uc2UgaGVhZGVycyAoPGhlYWRlcj4gLT4gVGVzdC1IZWFkZXItPGhlYWRlcj4pCisgICAgICAgIGZvciAoZmluYWwgTXVsdGl2YWx1ZWRNYXAuRW50cnk8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGVudHJ5IDogcmVxdWVzdENvbnRleHQuZ2V0U3RyaW5nSGVhZGVycygpLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlID0gcmVzcG9uc2UuaGVhZGVyKCJUZXN0LUhlYWRlci0iICsgZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUmVxdWVzdCBwcm9wZXJ0aWVzIC0+IFJlc3BvbnNlIGhlYWRlcnMgKDxoZWFkZXI+IC0+IFRlc3QtUHJvcGVydHktPGhlYWRlcj4pCisgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIHByb3BlcnR5IDogcmVxdWVzdENvbnRleHQuZ2V0UHJvcGVydHlOYW1lcygpKSB7CisgICAgICAgICAgICByZXNwb25zZSA9IHJlc3BvbnNlLmhlYWRlcigiVGVzdC1Qcm9wZXJ0eS0iICsgcHJvcGVydHksIHJlcXVlc3RDb250ZXh0LmdldFByb3BlcnR5KHByb3BlcnR5KSk7CisgICAgICAgIH0KKworICAgICAgICByZXF1ZXN0Q29udGV4dC5hYm9ydFdpdGgocmVzcG9uc2UuYnVpbGQoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvV2ViVGFyZ2V0UHJvcGVydGllc1Rlc3QuamF2YSBiL2NvcmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L1dlYlRhcmdldFByb3BlcnRpZXNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZiNDg1MAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L1dlYlRhcmdldFByb3BlcnRpZXNUZXN0LmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIEBhdXRob3IgcGF2ZWwuYnVjZWtAb3JhY2xlLmNvbQorICovCitwdWJsaWMgY2xhc3MgV2ViVGFyZ2V0UHJvcGVydGllc1Rlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvcGFnYXRpb24oKSB7CisgICAgICAgIENsaWVudCBjID0gQ2xpZW50QnVpbGRlci5uZXdCdWlsZGVyKCkubmV3Q2xpZW50KCk7CisKKyAgICAgICAgYy5wcm9wZXJ0eSgiYSIsICJ2YWwiKTsKKworICAgICAgICBXZWJUYXJnZXQgdzEgPSBjLnRhcmdldCgiaHR0cDovL2EiKTsKKyAgICAgICAgdzEucHJvcGVydHkoImIiLCAidmFsIik7CisKKyAgICAgICAgV2ViVGFyZ2V0IHcyID0gdzEucGF0aCgiYyIpOworICAgICAgICB3Mi5wcm9wZXJ0eSgiYyIsICJ2YWwiKTsKKworICAgICAgICBhc3NlcnRUcnVlKGMuZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnRpZXMoKS5jb250YWluc0tleSgiYSIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh3MS5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UHJvcGVydGllcygpLmNvbnRhaW5zS2V5KCJhIikpOworICAgICAgICBhc3NlcnRUcnVlKHcyLmdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0aWVzKCkuY29udGFpbnNLZXkoImEiKSk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UoYy5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UHJvcGVydGllcygpLmNvbnRhaW5zS2V5KCJiIikpOworICAgICAgICBhc3NlcnRUcnVlKHcxLmdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0aWVzKCkuY29udGFpbnNLZXkoImIiKSk7CisgICAgICAgIGFzc2VydFRydWUodzIuZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnRpZXMoKS5jb250YWluc0tleSgiYiIpKTsKKworICAgICAgICBhc3NlcnRGYWxzZShjLmdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0aWVzKCkuY29udGFpbnNLZXkoImMiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHcxLmdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0aWVzKCkuY29udGFpbnNLZXkoImMiKSk7CisgICAgICAgIGFzc2VydFRydWUodzIuZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnRpZXMoKS5jb250YWluc0tleSgiYyIpKTsKKworICAgICAgICB3Mi5wcm9wZXJ0eSgiYSIsIG51bGwpOworCisgICAgICAgIGFzc2VydFRydWUoYy5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UHJvcGVydGllcygpLmNvbnRhaW5zS2V5KCJhIikpOworICAgICAgICBhc3NlcnRUcnVlKHcxLmdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0aWVzKCkuY29udGFpbnNLZXkoImEiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHcyLmdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0aWVzKCkuY29udGFpbnNLZXkoImEiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvYXV0aGVudGljYXRpb24vSHR0cERpZ2VzdEF1dGhGaWx0ZXJUZXN0LmphdmEgYi9jb3JlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9hdXRoZW50aWNhdGlvbi9IdHRwRGlnZXN0QXV0aEZpbHRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODRlODdjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvYXV0aGVudGljYXRpb24vSHR0cERpZ2VzdEF1dGhGaWx0ZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LmF1dGhlbnRpY2F0aW9uOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuYXV0aGVudGljYXRpb24uRGlnZXN0QXV0aGVudGljYXRvci5EaWdlc3RTY2hlbWU7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIEBhdXRob3IgUmFwaGFlbCBKb2xpdmV0IChyYXBoYWVsLmpvbGl2ZXQgYXQgZ21haWwuY29tKQorICogQGF1dGhvciBTdGVmYW4gS2F0ZXJrYW1wIChzdGVmYW4gYXQga2F0ZXJrYW1wLmRlKQorICovCitwdWJsaWMgY2xhc3MgSHR0cERpZ2VzdEF1dGhGaWx0ZXJUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhcnNlSGVhZGVyczEoKSB0aHJvd3MgRXhjZXB0aW9uIHsgLy8gbm8gZGlnZXN0IHNjaGVtZQorICAgICAgICBmaW5hbCBEaWdlc3RBdXRoZW50aWNhdG9yIGYgPSBuZXcgRGlnZXN0QXV0aGVudGljYXRvcihuZXcgSHR0cEF1dGhlbnRpY2F0aW9uRmlsdGVyLkNyZWRlbnRpYWxzKCJmb28iLCAiYmFyIiksIDEwMDAwKTsKKyAgICAgICAgZmluYWwgTWV0aG9kIG1ldGhvZCA9IERpZ2VzdEF1dGhlbnRpY2F0b3IuY2xhc3MuZ2V0RGVjbGFyZWRNZXRob2QoInBhcnNlQXV0aEhlYWRlcnMiLCBMaXN0LmNsYXNzKTsKKyAgICAgICAgbWV0aG9kLnNldEFjY2Vzc2libGUodHJ1ZSk7CisgICAgICAgIGZpbmFsIERpZ2VzdFNjaGVtZSBkcyA9IChEaWdlc3RTY2hlbWUpIG1ldGhvZC5pbnZva2UoZiwKKyAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICAiYmFzaWMgdG90bz10dXR1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJiYXNpYyB0b3RvPVwidHV0dVwiIgorICAgICAgICAgICAgICAgIH0pKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0TnVsbChkcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VIZWFkZXJzMigpIHRocm93cyBFeGNlcHRpb24geyAvLyBUd28gY29uY3VycmVudCBzY2hlbWVzCisgICAgICAgIGZpbmFsIERpZ2VzdEF1dGhlbnRpY2F0b3IgZiA9IG5ldyBEaWdlc3RBdXRoZW50aWNhdG9yKG5ldyBIdHRwQXV0aGVudGljYXRpb25GaWx0ZXIuQ3JlZGVudGlhbHMoImZvbyIsICJiYXIiKSwgMTAwMDApOworICAgICAgICBmaW5hbCBNZXRob2QgbWV0aG9kID0gRGlnZXN0QXV0aGVudGljYXRvci5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgicGFyc2VBdXRoSGVhZGVycyIsIExpc3QuY2xhc3MpOworICAgICAgICBtZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKKyAgICAgICAgZmluYWwgRGlnZXN0U2NoZW1lIGRzID0gKERpZ2VzdFNjaGVtZSkgbWV0aG9kLmludm9rZShmLAorICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICJEaWdlc3QgcmVhbG09XCJ0YXRhXCIiLAorICAgICAgICAgICAgICAgICAgICAgICAgImJhc2ljICB0b3RvPVwidHV0dVwiIgorICAgICAgICAgICAgICAgIH0pKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoZHMpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInRhdGEiLCBkcy5nZXRSZWFsbSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUhlYWRlcnMzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7IC8vIENvbXBsZXggY2FzZSwgd2l0aCBjb21tYSBpbnNpZGUgdmFsdWUKKyAgICAgICAgZmluYWwgRGlnZXN0QXV0aGVudGljYXRvciBmID0gbmV3IERpZ2VzdEF1dGhlbnRpY2F0b3IobmV3IEh0dHBBdXRoZW50aWNhdGlvbkZpbHRlci5DcmVkZW50aWFscygiZm9vIiwgImJhciIpLCAxMDAwMCk7CisgICAgICAgIGZpbmFsIE1ldGhvZCBtZXRob2QgPSBEaWdlc3RBdXRoZW50aWNhdG9yLmNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJwYXJzZUF1dGhIZWFkZXJzIiwgTGlzdC5jbGFzcyk7CisgICAgICAgIG1ldGhvZC5zZXRBY2Nlc3NpYmxlKHRydWUpOworICAgICAgICBmaW5hbCBEaWdlc3RTY2hlbWUgZHMgPSAoRGlnZXN0U2NoZW1lKSBtZXRob2QuaW52b2tlKGYsCisgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChuZXcgU3RyaW5nW10geworICAgICAgICAgICAgICAgICAgICAgICAgImRpZ2VzdCByZWFsbT1cInRhdGFcIixub25jZT1cImZvbywgYmFyXCIiCisgICAgICAgICAgICAgICAgfSkpOworCisgICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGRzKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygidGF0YSIsIGRzLmdldFJlYWxtKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJmb28sIGJhciIsIGRzLmdldE5vbmNlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhcnNlSGVhZGVyczQoKSB0aHJvd3MgRXhjZXB0aW9uIHsgLy8gU3BhY2VzCisgICAgICAgIGZpbmFsIERpZ2VzdEF1dGhlbnRpY2F0b3IgZiA9IG5ldyBEaWdlc3RBdXRoZW50aWNhdG9yKG5ldyBIdHRwQXV0aGVudGljYXRpb25GaWx0ZXIuQ3JlZGVudGlhbHMoImZvbyIsICJiYXIiKSwgMTAwMDApOworICAgICAgICBmaW5hbCBNZXRob2QgbWV0aG9kID0gRGlnZXN0QXV0aGVudGljYXRvci5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgicGFyc2VBdXRoSGVhZGVycyIsIExpc3QuY2xhc3MpOworICAgICAgICBtZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKKyAgICAgICAgZmluYWwgRGlnZXN0U2NoZW1lIGRzID0gKERpZ2VzdFNjaGVtZSkgbWV0aG9kLmludm9rZShmLAorICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgICAgZGlnZXN0IHJlYWxtID0gICBcInRhdGFcIiAgLCAgb3BhcXVlPVwiYmFyXCIgLG5vbmNlPVwiZm9vLCBiYXJcIiIKKyAgICAgICAgICAgICAgICB9KSk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoZHMpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJ0YXRhIiwgZHMuZ2V0UmVhbG0oKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImZvbywgYmFyIiwgZHMuZ2V0Tm9uY2UoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImJhciIsIGRzLmdldE9wYXF1ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUhlYWRlcnM1KCkgdGhyb3dzIEV4Y2VwdGlvbiB7IC8vIE1peCBvZiBxdW90ZXMgYW5kICBub24tcXVvdGVzCisgICAgICAgIGZpbmFsIERpZ2VzdEF1dGhlbnRpY2F0b3IgZiA9IG5ldyBEaWdlc3RBdXRoZW50aWNhdG9yKG5ldyBIdHRwQXV0aGVudGljYXRpb25GaWx0ZXIuQ3JlZGVudGlhbHMoImZvbyIsICJiYXIiKSwgMTAwMDApOworICAgICAgICBmaW5hbCBNZXRob2QgbWV0aG9kID0gRGlnZXN0QXV0aGVudGljYXRvci5jbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgicGFyc2VBdXRoSGVhZGVycyIsIExpc3QuY2xhc3MpOworICAgICAgICBtZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKKyAgICAgICAgZmluYWwgRGlnZXN0U2NoZW1lIGRzID0gKERpZ2VzdFNjaGVtZSkgbWV0aG9kLmludm9rZShmLAorICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgICAgZGlnZXN0IHJlYWxtID0gICBcInRhdGFcIiAgLCAgb3BhcXVlID1iYXIgLG5vbmNlPVwiZm9vLCBiYXJcIiwgICBhbGdvcml0aG09bWQ1IgorICAgICAgICAgICAgICAgIH0pKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChkcyk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInRhdGEiLCBkcy5nZXRSZWFsbSgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiZm9vLCBiYXIiLCBkcy5nZXROb25jZSgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiYmFyIiwgZHMuZ2V0T3BhcXVlKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJNRDUiLCBkcy5nZXRBbGdvcml0aG0oKS5uYW1lKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L2ZpbHRlci9DbGllbnRQcm92aWRlckluc3RhbmNlSW5qZWN0aW9uVGVzdC5qYXZhIGIvY29yZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvZmlsdGVyL0NsaWVudFByb3ZpZGVySW5zdGFuY2VJbmplY3Rpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVjODNmYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L2ZpbHRlci9DbGllbnRQcm92aWRlckluc3RhbmNlSW5qZWN0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5maWx0ZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQWJzdHJhY3RCaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdHMgaW5qZWN0aW9ucyBpbnRvIHByb3ZpZGVyIGluc3RhbmNlcy4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIENsaWVudFByb3ZpZGVySW5zdGFuY2VJbmplY3Rpb25UZXN0IHsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlJbmplY3RlZSB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdmFsdWU7CisKKyAgICAgICAgcHVibGljIE15SW5qZWN0ZWUoZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFNvbWV0aGluZygpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlJbmplY3RlZUJpbmRlciBleHRlbmRzIEFic3RyYWN0QmluZGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICAgICAgYmluZChuZXcgTXlJbmplY3RlZSgiaGVsbG8iKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15RmlsdGVyIGltcGxlbWVudHMgQ2xpZW50UmVxdWVzdEZpbHRlciB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgZmllbGQ7CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBwcml2YXRlIE15SW5qZWN0ZWUgbXlJbmplY3RlZTsKKworICAgICAgICBwdWJsaWMgTXlGaWx0ZXIoT2JqZWN0IGZpZWxkKSB7CisgICAgICAgICAgICB0aGlzLmZpZWxkID0gZmllbGQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENsaWVudFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuYWJvcnRXaXRoKFJlc3BvbnNlLm9rKG15SW5qZWN0ZWUgKyAiLCIgKyBmaWVsZCkuYnVpbGQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15RmlsdGVyRmVhdHVyZSBpbXBsZW1lbnRzIEZlYXR1cmUgeworCisgICAgICAgIEBJbmplY3QKKyAgICAgICAgcHJpdmF0ZSBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXI7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZShmaW5hbCBGZWF0dXJlQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKG5ldyBNeUZpbHRlcihpbmplY3Rpb25NYW5hZ2VyKSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQgaW5zdGFuY2Ugb2YgYSBmZWF0dXJlIG9yIG90aGVyIHByb3ZpZGVyIHdpbGwgbm90IGJlIGluamVjdGVkIG9uIHRoZSBjbGllbnQtc2lkZS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3QoKSB7CisgICAgICAgIGZpbmFsIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihuZXcgTXlGaWx0ZXJGZWF0dXJlKCkpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKG5ldyBNeUluamVjdGVlQmluZGVyKCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gY2xpZW50LnRhcmdldCgiaHR0cDovL2Zvby5iYXIiKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm51bGwsbnVsbCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvZmlsdGVyL0NzcmZQcm90ZWN0aW9uRmlsdGVyVGVzdC5qYXZhIGIvY29yZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvZmlsdGVyL0NzcmZQcm90ZWN0aW9uRmlsdGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2OWRmMDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9maWx0ZXIvQ3NyZlByb3RlY3Rpb25GaWx0ZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LmZpbHRlcjsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuSW52b2NhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuc3BpLkFzeW5jQ29ubmVjdG9yQ2FsbGJhY2s7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnNwaS5Db25uZWN0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnNwaS5Db25uZWN0b3JQcm92aWRlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworCisvKioKKyAqIENyb3NzLXNpdGUgcmVxdWVzdCBmb3JnZXJ5IGNsaWVudCBmaWx0ZXIgdGVzdC4KKyAqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIENzcmZQcm90ZWN0aW9uRmlsdGVyVGVzdCB7CisgICAgcHJpdmF0ZSBJbnZvY2F0aW9uLkJ1aWxkZXIgaW52QnVpbGRlcjsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KG5ldyBDbGllbnRDb25maWcoQ3NyZlByb3RlY3Rpb25GaWx0ZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBUZXN0Q29ubmVjdG9yKCkpKTsKKyAgICAgICAgaW52QnVpbGRlciA9IGNsaWVudC50YXJnZXQoVXJpQnVpbGRlci5mcm9tVXJpKCIvIikuYnVpbGQoKSkucmVxdWVzdCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldCgpIHsKKyAgICAgICAgUmVzcG9uc2UgciA9IGludkJ1aWxkZXIuZ2V0KCk7CisgICAgICAgIGFzc2VydE51bGwoci5nZXRIZWFkZXJTdHJpbmcoQ3NyZlByb3RlY3Rpb25GaWx0ZXIuSEVBREVSX05BTUUpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQdXQoKSB7CisgICAgICAgIFJlc3BvbnNlIHIgPSBpbnZCdWlsZGVyLnB1dChFbnRpdHkuZW50aXR5KCJwdXQiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoci5nZXRIZWFkZXJTdHJpbmcoQ3NyZlByb3RlY3Rpb25GaWx0ZXIuSEVBREVSX05BTUUpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUZXN0Q29ubmVjdG9yIGltcGxlbWVudHMgQ29ubmVjdG9yLCBDb25uZWN0b3JQcm92aWRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDb25uZWN0b3IgZ2V0Q29ubmVjdG9yKENsaWVudCBjbGllbnQsIENvbmZpZ3VyYXRpb24gcnVudGltZUNvbmZpZykgeworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENsaWVudFJlc3BvbnNlIGFwcGx5KENsaWVudFJlcXVlc3QgcmVxdWVzdENvbnRleHQpIHsKKyAgICAgICAgICAgIGZpbmFsIENsaWVudFJlc3BvbnNlIHJlc3BvbnNlQ29udGV4dCA9IG5ldyBDbGllbnRSZXNwb25zZSgKKyAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2UuU3RhdHVzLk9LLCByZXF1ZXN0Q29udGV4dCk7CisKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBoZWFkZXJWYWx1ZSA9IHJlcXVlc3RDb250ZXh0LmdldEhlYWRlclN0cmluZyhDc3JmUHJvdGVjdGlvbkZpbHRlci5IRUFERVJfTkFNRSk7CisgICAgICAgICAgICBpZiAoaGVhZGVyVmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJlc3BvbnNlQ29udGV4dC5oZWFkZXIoQ3NyZlByb3RlY3Rpb25GaWx0ZXIuSEVBREVSX05BTUUsIGhlYWRlclZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXNwb25zZUNvbnRleHQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEZ1dHVyZTw/PiBhcHBseShDbGllbnRSZXF1ZXN0IHJlcXVlc3QsIEFzeW5jQ29ubmVjdG9yQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiQXN5bmNocm9ub3VzIGV4ZWN1dGlvbiBub3Qgc3VwcG9ydGVkLiIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICAgICAgLy8gZG8gbm90aGluZworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvZmlsdGVyL0VuY29kaW5nRmlsdGVyVGVzdC5qYXZhIGIvY29yZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvZmlsdGVyL0VuY29kaW5nRmlsdGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZGZjNDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9maWx0ZXIvRW5jb2RpbmdGaWx0ZXJUZXN0LmphdmEKQEAgLTAsMCArMSwyMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LmZpbHRlcjsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuSW52b2NhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CitpbXBvcnQgc3RhdGljIGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnMuQUNDRVBUX0VOQ09ESU5HOworaW1wb3J0IHN0YXRpYyBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzLkNPTlRFTlRfRU5DT0RJTkc7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuc3BpLkFzeW5jQ29ubmVjdG9yQ2FsbGJhY2s7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnNwaS5Db25uZWN0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnNwaS5Db25uZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLkRlZmxhdGVFbmNvZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuR1ppcEVuY29kZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiBDbGllbnQtc2lkZSBjb250ZW50IGVuY29kaW5nIGZpbHRlciB1bml0IHRlc3RzLgorICoKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEVuY29kaW5nRmlsdGVyVGVzdCB7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWNjZXB0RW5jb2RpbmcoKSB7CisgICAgICAgIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudChuZXcgQ2xpZW50Q29uZmlnKAorICAgICAgICAgICAgICAgIEVuY29kaW5nRmlsdGVyLmNsYXNzLAorICAgICAgICAgICAgICAgIEdaaXBFbmNvZGVyLmNsYXNzLAorICAgICAgICAgICAgICAgIERlZmxhdGVFbmNvZGVyLmNsYXNzCisgICAgICAgICkuY29ubmVjdG9yUHJvdmlkZXIobmV3IFRlc3RDb25uZWN0b3IoKSkpOworICAgICAgICBJbnZvY2F0aW9uLkJ1aWxkZXIgaW52QnVpbGRlciA9IGNsaWVudC50YXJnZXQoVXJpQnVpbGRlci5mcm9tVXJpKCIvIikuYnVpbGQoKSkucmVxdWVzdCgpOworICAgICAgICBSZXNwb25zZSByID0gaW52QnVpbGRlci5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkZWZsYXRlLGd6aXAseC1nemlwIiwgci5nZXRIZWFkZXJTdHJpbmcoQUNDRVBUX0VOQ09ESU5HKSk7CisgICAgICAgIGFzc2VydE51bGwoci5nZXRIZWFkZXJTdHJpbmcoQ09OVEVOVF9FTkNPRElORykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbnRlbnRFbmNvZGluZygpIHsKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KG5ldyBDbGllbnRDb25maWcoCisgICAgICAgICAgICAgICAgRW5jb2RpbmdGaWx0ZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgR1ppcEVuY29kZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgRGVmbGF0ZUVuY29kZXIuY2xhc3MKKyAgICAgICAgKS5wcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLlVTRV9FTkNPRElORywgImd6aXAiKS5jb25uZWN0b3JQcm92aWRlcihuZXcgVGVzdENvbm5lY3RvcigpKSk7CisgICAgICAgIEludm9jYXRpb24uQnVpbGRlciBpbnZCdWlsZGVyID0gY2xpZW50LnRhcmdldChVcmlCdWlsZGVyLmZyb21VcmkoIi8iKS5idWlsZCgpKS5yZXF1ZXN0KCk7CisgICAgICAgIFJlc3BvbnNlIHIgPSBpbnZCdWlsZGVyLnBvc3QoRW50aXR5LmVudGl0eSgiSGVsbG8gd29ybGQiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZGVmbGF0ZSxnemlwLHgtZ3ppcCIsIHIuZ2V0SGVhZGVyU3RyaW5nKEFDQ0VQVF9FTkNPRElORykpOworICAgICAgICBhc3NlcnRFcXVhbHMoImd6aXAiLCByLmdldEhlYWRlclN0cmluZyhDT05URU5UX0VOQ09ESU5HKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGVudEVuY29kaW5nVmlhRmVhdHVyZSgpIHsKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KG5ldyBDbGllbnRDb25maWcoKQorICAgICAgICAgICAgICAgIC5jb25uZWN0b3JQcm92aWRlcihuZXcgVGVzdENvbm5lY3RvcigpKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihuZXcgRW5jb2RpbmdGZWF0dXJlKCJnemlwIiwgR1ppcEVuY29kZXIuY2xhc3MsIERlZmxhdGVFbmNvZGVyLmNsYXNzKSkpOworICAgICAgICBJbnZvY2F0aW9uLkJ1aWxkZXIgaW52QnVpbGRlciA9IGNsaWVudC50YXJnZXQoVXJpQnVpbGRlci5mcm9tVXJpKCIvIikuYnVpbGQoKSkucmVxdWVzdCgpOworICAgICAgICBSZXNwb25zZSByID0gaW52QnVpbGRlci5wb3N0KEVudGl0eS5lbnRpdHkoIkhlbGxvIHdvcmxkIiwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImRlZmxhdGUsZ3ppcCx4LWd6aXAiLCByLmdldEhlYWRlclN0cmluZyhBQ0NFUFRfRU5DT0RJTkcpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnemlwIiwgci5nZXRIZWFkZXJTdHJpbmcoQ09OVEVOVF9FTkNPRElORykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbnRlbnRFbmNvZGluZ1NraXBwZWRGb3JOb0VudGl0eSgpIHsKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KG5ldyBDbGllbnRDb25maWcoCisgICAgICAgICAgICAgICAgRW5jb2RpbmdGaWx0ZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgR1ppcEVuY29kZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgRGVmbGF0ZUVuY29kZXIuY2xhc3MKKyAgICAgICAgKS5wcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLlVTRV9FTkNPRElORywgImd6aXAiKS5jb25uZWN0b3JQcm92aWRlcihuZXcgVGVzdENvbm5lY3RvcigpKSk7CisgICAgICAgIEludm9jYXRpb24uQnVpbGRlciBpbnZCdWlsZGVyID0gY2xpZW50LnRhcmdldChVcmlCdWlsZGVyLmZyb21VcmkoIi8iKS5idWlsZCgpKS5yZXF1ZXN0KCk7CisgICAgICAgIFJlc3BvbnNlIHIgPSBpbnZCdWlsZGVyLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImRlZmxhdGUsZ3ppcCx4LWd6aXAiLCByLmdldEhlYWRlclN0cmluZyhBQ0NFUFRfRU5DT0RJTkcpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChyLmdldEhlYWRlclN0cmluZyhDT05URU5UX0VOQ09ESU5HKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5zdXBwb3J0ZWRDb250ZW50RW5jb2RpbmcoKSB7CisgICAgICAgIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudChuZXcgQ2xpZW50Q29uZmlnKAorICAgICAgICAgICAgICAgIEVuY29kaW5nRmlsdGVyLmNsYXNzLAorICAgICAgICAgICAgICAgIEdaaXBFbmNvZGVyLmNsYXNzLAorICAgICAgICAgICAgICAgIERlZmxhdGVFbmNvZGVyLmNsYXNzCisgICAgICAgICkucHJvcGVydHkoQ2xpZW50UHJvcGVydGllcy5VU0VfRU5DT0RJTkcsICJub24tZ3ppcCIpLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBUZXN0Q29ubmVjdG9yKCkpKTsKKyAgICAgICAgSW52b2NhdGlvbi5CdWlsZGVyIGludkJ1aWxkZXIgPSBjbGllbnQudGFyZ2V0KFVyaUJ1aWxkZXIuZnJvbVVyaSgiLyIpLmJ1aWxkKCkpLnJlcXVlc3QoKTsKKyAgICAgICAgUmVzcG9uc2UgciA9IGludkJ1aWxkZXIuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiZGVmbGF0ZSxnemlwLHgtZ3ppcCIsIHIuZ2V0SGVhZGVyU3RyaW5nKEFDQ0VQVF9FTkNPRElORykpOworICAgICAgICBhc3NlcnROdWxsKHIuZ2V0SGVhZGVyU3RyaW5nKENPTlRFTlRfRU5DT0RJTkcpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByb2R1Y2VyIGZvciBKRVJTRVktMjAyOC4KKyAgICAgKgorICAgICAqIEBzZWUgI3Rlc3RDbG9zaW5nQ2xpZW50UmVzcG9uc2VTdHJlYW1SZXRyaWV2ZWRCeVZhbHVlT25FcnJvcgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsb3NpbmdDbGllbnRSZXNwb25zZVN0cmVhbVJldHJpZXZlZEJ5UmVzcG9uc2VPbkVycm9yKCkgeworICAgICAgICBmaW5hbCBUZXN0SW5wdXRTdHJlYW0gcmVzcG9uc2VTdHJlYW0gPSBuZXcgVGVzdElucHV0U3RyZWFtKCk7CisKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KG5ldyBDbGllbnRDb25maWcoKQorICAgICAgICAgICAgICAgIC5jb25uZWN0b3JQcm92aWRlcihuZXcgVGVzdENvbm5lY3RvcigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBDbGllbnRSZXNwb25zZSBhcHBseShDbGllbnRSZXF1ZXN0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGllbnRSZXNwb25zZSByZXNwb25zZUNvbnRleHQgPSBuZXcgQ2xpZW50UmVzcG9uc2UoUmVzcG9uc2UuU3RhdHVzLk9LLCByZXF1ZXN0Q29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuaGVhZGVyKENPTlRFTlRfRU5DT0RJTkcsICJnemlwIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuc2V0RW50aXR5U3RyZWFtKHJlc3BvbnNlU3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZUNvbnRleHQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihuZXcgRW5jb2RpbmdGZWF0dXJlKEdaaXBFbmNvZGVyLmNsYXNzLCBEZWZsYXRlRW5jb2Rlci5jbGFzcykpKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IGNsaWVudC50YXJnZXQoVXJpQnVpbGRlci5mcm9tVXJpKCIvIikuYnVpbGQoKSkucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmVzcG9uc2UuU3RhdHVzLk9LLmdldFN0YXR1c0NvZGUoKSwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImd6aXAiLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoQ09OVEVOVF9FTkNPRElORykpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gY2F1c2VkIGJ5IGludmFsaWQgZ3ppcCBzdHJlYW0gZXhwZWN0ZWQuIik7CisgICAgICAgIH0gY2F0Y2ggKFByb2Nlc3NpbmdFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlJlc3BvbnNlIGlucHV0IHN0cmVhbSBub3QgY2xvc2VkIHdoZW4gZXhjZXB0aW9uIGlzIHRocm93bi4iLCByZXNwb25zZVN0cmVhbS5pc0Nsb3NlZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByb2R1Y2VyIGZvciBKRVJTRVktMjAyOC4KKyAgICAgKgorICAgICAqIEBzZWUgI3Rlc3RDbG9zaW5nQ2xpZW50UmVzcG9uc2VTdHJlYW1SZXRyaWV2ZWRCeVJlc3BvbnNlT25FcnJvcgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsb3NpbmdDbGllbnRSZXNwb25zZVN0cmVhbVJldHJpZXZlZEJ5VmFsdWVPbkVycm9yKCkgeworICAgICAgICBmaW5hbCBUZXN0SW5wdXRTdHJlYW0gcmVzcG9uc2VTdHJlYW0gPSBuZXcgVGVzdElucHV0U3RyZWFtKCk7CisKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KG5ldyBDbGllbnRDb25maWcoKQorICAgICAgICAgICAgICAgIC5jb25uZWN0b3JQcm92aWRlcihuZXcgVGVzdENvbm5lY3RvcigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBDbGllbnRSZXNwb25zZSBhcHBseShDbGllbnRSZXF1ZXN0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGllbnRSZXNwb25zZSByZXNwb25zZUNvbnRleHQgPSBuZXcgQ2xpZW50UmVzcG9uc2UoUmVzcG9uc2UuU3RhdHVzLk9LLCByZXF1ZXN0Q29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuaGVhZGVyKENPTlRFTlRfRU5DT0RJTkcsICJnemlwIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuc2V0RW50aXR5U3RyZWFtKHJlc3BvbnNlU3RyZWFtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZUNvbnRleHQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihuZXcgRW5jb2RpbmdGZWF0dXJlKEdaaXBFbmNvZGVyLmNsYXNzLCBEZWZsYXRlRW5jb2Rlci5jbGFzcykpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2xpZW50LnRhcmdldChVcmlCdWlsZGVyLmZyb21VcmkoIi8iKS5idWlsZCgpKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gY2F1c2VkIGJ5IGludmFsaWQgZ3ppcCBzdHJlYW0gZXhwZWN0ZWQuIik7CisgICAgICAgIH0gY2F0Y2ggKFByb2Nlc3NpbmdFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlJlc3BvbnNlIGlucHV0IHN0cmVhbSBub3QgY2xvc2VkIHdoZW4gZXhjZXB0aW9uIGlzIHRocm93bi4iLCByZXNwb25zZVN0cmVhbS5pc0Nsb3NlZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUZXN0Q29ubmVjdG9yIGltcGxlbWVudHMgQ29ubmVjdG9yLCBDb25uZWN0b3JQcm92aWRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDb25uZWN0b3IgZ2V0Q29ubmVjdG9yKENsaWVudCBjbGllbnQsIENvbmZpZ3VyYXRpb24gcnVudGltZUNvbmZpZykgeworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENsaWVudFJlc3BvbnNlIGFwcGx5KENsaWVudFJlcXVlc3QgcmVxdWVzdENvbnRleHQpIHsKKyAgICAgICAgICAgIGZpbmFsIENsaWVudFJlc3BvbnNlIHJlc3BvbnNlQ29udGV4dCA9IG5ldyBDbGllbnRSZXNwb25zZSgKKyAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2UuU3RhdHVzLk9LLCByZXF1ZXN0Q29udGV4dCk7CisKKyAgICAgICAgICAgIFN0cmluZyBoZWFkZXJWYWx1ZSA9IHJlcXVlc3RDb250ZXh0LmdldEhlYWRlclN0cmluZyhBQ0NFUFRfRU5DT0RJTkcpOworICAgICAgICAgICAgaWYgKGhlYWRlclZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuaGVhZGVyKEFDQ0VQVF9FTkNPRElORywgaGVhZGVyVmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaGVhZGVyVmFsdWUgPSByZXF1ZXN0Q29udGV4dC5nZXRIZWFkZXJTdHJpbmcoQ09OVEVOVF9FTkNPRElORyk7CisgICAgICAgICAgICBpZiAoaGVhZGVyVmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJlc3BvbnNlQ29udGV4dC5oZWFkZXIoQ09OVEVOVF9FTkNPRElORywgaGVhZGVyVmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlQ29udGV4dDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRnV0dXJlPD8+IGFwcGx5KENsaWVudFJlcXVlc3QgY2xpZW50UmVxdWVzdCwgQXN5bmNDb25uZWN0b3JDYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJBc3luY2hyb25vdXMgZXhlY3V0aW9uIG5vdCBzdXBwb3J0ZWQuIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgICAgICAvLyBkbyBub3RoaW5nCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuICJ0ZXN0LWNvbm5lY3RvciI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUZXN0SW5wdXRTdHJlYW0gZXh0ZW5kcyBCeXRlQXJyYXlJbnB1dFN0cmVhbSB7CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzQ2xvc2VkOworCisgICAgICAgIHByaXZhdGUgVGVzdElucHV0U3RyZWFtKCkgeworICAgICAgICAgICAgc3VwZXIoInRlc3QiLmdldEJ5dGVzKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlzQ2xvc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIHN1cGVyLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9maWx0ZXIvSHR0cEJhc2ljQXV0aEZpbHRlclRlc3QuamF2YSBiL2NvcmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L2ZpbHRlci9IdHRwQmFzaWNBdXRoRmlsdGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzZjI1MTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9maWx0ZXIvSHR0cEJhc2ljQXV0aEZpbHRlclRlc3QuamF2YQpAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuZmlsdGVyOworCisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5JbnZvY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UmVxdWVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UmVzcG9uc2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LmF1dGhlbnRpY2F0aW9uLkh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnNwaS5Bc3luY0Nvbm5lY3RvckNhbGxiYWNrOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5zcGkuQ29ubmVjdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5zcGkuQ29ubmVjdG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5CYXNlNjQ7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogSFRUUCBCYXNpYyBhdXRoZW50aWNhdGlvbiBmaWx0ZXIgdGVzdC4KKyAqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIEh0dHBCYXNpY0F1dGhGaWx0ZXJUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldCgpIHsKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KG5ldyBDbGllbnRDb25maWcoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5iYXNpYygiVXppdmF0ZWxza2Ugam1lbm8iLCAiSGVzbG8iKSkKKyAgICAgICAgICAgICAgICAuY29ubmVjdG9yUHJvdmlkZXIobmV3IFRlc3RDb25uZWN0b3IoKSkpOworICAgICAgICBJbnZvY2F0aW9uLkJ1aWxkZXIgaW52QnVpbGRlciA9IGNsaWVudC50YXJnZXQoVXJpQnVpbGRlci5mcm9tVXJpKCIvIikuYnVpbGQoKSkucmVxdWVzdCgpOworICAgICAgICBSZXNwb25zZSByID0gaW52QnVpbGRlci5nZXQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIkJhc2ljICIgKyBCYXNlNjQuZW5jb2RlQXNTdHJpbmcoIlV6aXZhdGVsc2tlIGptZW5vOkhlc2xvIiksIHIuZ2V0SGVhZGVyU3RyaW5nKEh0dHBIZWFkZXJzLkFVVEhPUklaQVRJT04pKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCbGFua1VzZXJuYW1lUGFzc3dvcmQoKSB7CisgICAgICAgIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudChuZXcgQ2xpZW50Q29uZmlnKEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUuYmFzaWMoIiIsICIiKSkKKyAgICAgICAgICAgICAgICAuY29ubmVjdG9yUHJvdmlkZXIobmV3IFRlc3RDb25uZWN0b3IoKSkpOworICAgICAgICBJbnZvY2F0aW9uLkJ1aWxkZXIgaW52QnVpbGRlciA9IGNsaWVudC50YXJnZXQoVXJpQnVpbGRlci5mcm9tVXJpKCIvIikuYnVpbGQoKSkucmVxdWVzdCgpOworICAgICAgICBSZXNwb25zZSByID0gaW52QnVpbGRlci5nZXQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIkJhc2ljICIgKyBCYXNlNjQuZW5jb2RlQXNTdHJpbmcoIjoiKSwgci5nZXRIZWFkZXJTdHJpbmcoSHR0cEhlYWRlcnMuQVVUSE9SSVpBVElPTikpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRlc3RDb25uZWN0b3IgaW1wbGVtZW50cyBDb25uZWN0b3IsIENvbm5lY3RvclByb3ZpZGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENvbm5lY3RvciBnZXRDb25uZWN0b3IoQ2xpZW50IGNsaWVudCwgQ29uZmlndXJhdGlvbiBydW50aW1lQ29uZmlnKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ2xpZW50UmVzcG9uc2UgYXBwbHkoQ2xpZW50UmVxdWVzdCByZXF1ZXN0Q29udGV4dCkgeworICAgICAgICAgICAgZmluYWwgQ2xpZW50UmVzcG9uc2UgcmVzcG9uc2VDb250ZXh0ID0gbmV3IENsaWVudFJlc3BvbnNlKAorICAgICAgICAgICAgICAgICAgICBSZXNwb25zZS5TdGF0dXMuT0ssIHJlcXVlc3RDb250ZXh0KTsKKworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGhlYWRlclZhbHVlID0gcmVxdWVzdENvbnRleHQuZ2V0SGVhZGVyU3RyaW5nKEh0dHBIZWFkZXJzLkFVVEhPUklaQVRJT04pOworICAgICAgICAgICAgaWYgKGhlYWRlclZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuaGVhZGVyKEh0dHBIZWFkZXJzLkFVVEhPUklaQVRJT04sIGhlYWRlclZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXNwb25zZUNvbnRleHQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEZ1dHVyZTw/PiBhcHBseShDbGllbnRSZXF1ZXN0IGNsaWVudFJlcXVlc3QsIEFzeW5jQ29ubmVjdG9yQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiQXN5bmNocm9ub3VzIGV4ZWN1dGlvbiBub3Qgc3VwcG9ydGVkLiIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICAgICAgLy8gZG8gbm90aGluZworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvc3BpL0NhY2hpbmdDb25uZWN0b3JQcm92aWRlclRlc3QuamF2YSBiL2NvcmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L3NwaS9DYWNoaW5nQ29ubmVjdG9yUHJvdmlkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNlYTE2MAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L3NwaS9DYWNoaW5nQ29ubmVjdG9yUHJvdmlkZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnNwaTsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UmVxdWVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQ2FjaGluZyBjb25uZWN0b3IgcHJvdmlkZXIgdW5pdCB0ZXN0cy4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQ2FjaGluZ0Nvbm5lY3RvclByb3ZpZGVyVGVzdCB7CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZWZlcmVuY2VDb3VudGluZ051bGxDb25uZWN0b3IgaW1wbGVtZW50cyBDb25uZWN0b3IsIENvbm5lY3RvclByb3ZpZGVyIHsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBdG9taWNJbnRlZ2VyIGNvdW50ZXIgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENsaWVudFJlc3BvbnNlIGFwcGx5KENsaWVudFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oInRlc3QiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRnV0dXJlPD8+IGFwcGx5KENsaWVudFJlcXVlc3QgcmVxdWVzdCwgQXN5bmNDb25uZWN0b3JDYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oInRlc3QtYXN5bmMiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ29ubmVjdG9yIGdldENvbm5lY3RvcihDbGllbnQgY2xpZW50LCBDb25maWd1cmF0aW9uIHJ1bnRpbWVDb25maWcpIHsKKyAgICAgICAgICAgIGNvdW50ZXIuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7CisgICAgICAgICAgICByZXR1cm4gY291bnRlci5nZXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENhY2hpbmdDb25uZWN0b3IoKSB7CisgICAgICAgIGZpbmFsIFJlZmVyZW5jZUNvdW50aW5nTnVsbENvbm5lY3RvciBjb25uZWN0b3JQcm92aWRlciA9IG5ldyBSZWZlcmVuY2VDb3VudGluZ051bGxDb25uZWN0b3IoKTsKKyAgICAgICAgZmluYWwgQ2FjaGluZ0Nvbm5lY3RvclByb3ZpZGVyIGNhY2hpbmdDb25uZWN0b3JQcm92aWRlciA9IG5ldyBDYWNoaW5nQ29ubmVjdG9yUHJvdmlkZXIoY29ubmVjdG9yUHJvdmlkZXIpOworICAgICAgICBmaW5hbCBDbGllbnRDb25maWcgY29uZmlndXJhdGlvbiA9IG5ldyBDbGllbnRDb25maWcoKS5jb25uZWN0b3JQcm92aWRlcihjYWNoaW5nQ29ubmVjdG9yUHJvdmlkZXIpLmdldENvbmZpZ3VyYXRpb24oKTsKKworICAgICAgICBDbGllbnQgY2xpZW50MSA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KGNvbmZpZ3VyYXRpb24pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2xpZW50MS50YXJnZXQoVXJpQnVpbGRlci5mcm9tVXJpKCIvIikuYnVpbGQoKSkucmVxdWVzdCgpLmdldCgpOworICAgICAgICB9IGNhdGNoIChQcm9jZXNzaW5nRXhjZXB0aW9uIGNlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QiLCBjZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNvbm5lY3RvclByb3ZpZGVyLmdldENvdW50KCkpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjbGllbnQxLnRhcmdldChVcmlCdWlsZGVyLmZyb21VcmkoIi8iKS5idWlsZCgpKS5yZXF1ZXN0KCkuYXN5bmMoKS5nZXQoKTsKKyAgICAgICAgfSBjYXRjaCAoUHJvY2Vzc2luZ0V4Y2VwdGlvbiBjZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0LWFzeW5jIiwgY2UuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBjb25uZWN0b3JQcm92aWRlci5nZXRDb3VudCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIENsaWVudCBjbGllbnQyID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoY29uZmlndXJhdGlvbik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjbGllbnQyLnRhcmdldChVcmlCdWlsZGVyLmZyb21VcmkoIi8iKS5idWlsZCgpKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIH0gY2F0Y2ggKFByb2Nlc3NpbmdFeGNlcHRpb24gY2UpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygidGVzdCIsIGNlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY29ubmVjdG9yUHJvdmlkZXIuZ2V0Q291bnQoKSk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNsaWVudDIudGFyZ2V0KFVyaUJ1aWxkZXIuZnJvbVVyaSgiLyIpLmJ1aWxkKCkpLnJlcXVlc3QoKS5hc3luYygpLmdldCgpOworICAgICAgICB9IGNhdGNoIChQcm9jZXNzaW5nRXhjZXB0aW9uIGNlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QtYXN5bmMiLCBjZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNvbm5lY3RvclByb3ZpZGVyLmdldENvdW50KCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jbGllbnQvc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnNwaS5BdXRvRGlzY292ZXJhYmxlIGIvY29yZS1jbGllbnQvc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnNwaS5BdXRvRGlzY292ZXJhYmxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMzk0ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNsaWVudC9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuc3BpLkF1dG9EaXNjb3ZlcmFibGUKQEAgLTAsMCArMSwyIEBACitvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQXV0b0Rpc2NvdmVyYWJsZUNsaWVudFRlc3QkQ29tbW9uQXV0b0Rpc2NvdmVyYWJsZQorb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkF1dG9EaXNjb3ZlcmFibGVDbGllbnRUZXN0JExpZmVjeWNsZUxpc3RlbmVyQXV0b0Rpc2NvdmVyYWJsZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3BvbS54bWwgYi9jb3JlLWNvbW1vbi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZGU3MmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9wb20ueG1sCkBAIC0wLDAgKzEsMjUyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZTwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29tbW9uPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LWNvcmUtY29tbW9uPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPkplcnNleSBjb3JlIGNvbW1vbiBwYWNrYWdlczwvZGVzY3JpcHRpb24+CisKKyAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgICAgPG5hbWU+RVBMIDIuMDwvbmFtZT4KKyAgICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wPC91cmw+CisgICAgICAgICAgICA8ZGlzdHJpYnV0aW9uPnJlcG88L2Rpc3RyaWJ1dGlvbj4KKyAgICAgICAgICAgIDxjb21tZW50cz5FeGNlcHQgZm9yIEd1YXZhLCBKU1ItMTY2IGZpbGVzLCBEcm9wd2l6YXJkIE1vbml0b3JpbmcgaW5zcGlyZWQgY2xhc3NlcywgQVNNIGFuZCBKYWNrc29uIEpBWC1SUyBQcm92aWRlcnMuCisgICAgICAgICAgICAgICAgU2VlIGFsc28gaHR0cHM6Ly9naXRodWIuY29tL2VjbGlwc2UtZWU0ai9qZXJzZXkvYmxvYi9tYXN0ZXIvTk9USUNFLm1kPC9jb21tZW50cz4KKyAgICAgICAgPC9saWNlbnNlPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICAgIDxuYW1lPlRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwgVmVyc2lvbiAyLCBXaXRoIENsYXNzcGF0aCBFeGNlcHRpb248L25hbWU+CisgICAgICAgICAgICA8dXJsPmh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbDwvdXJsPgorICAgICAgICAgICAgPGRpc3RyaWJ1dGlvbj5yZXBvPC9kaXN0cmlidXRpb24+CisgICAgICAgICAgICA8Y29tbWVudHM+RXhjZXB0IGZvciBHdWF2YSwgYW5kIEpTUi0xNjYgZmlsZXMuCisgICAgICAgICAgICAgICAgU2VlIGFsc28gaHR0cHM6Ly9naXRodWIuY29tL2VjbGlwc2UtZWU0ai9qZXJzZXkvYmxvYi9tYXN0ZXIvTk9USUNFLm1kPC9jb21tZW50cz4KKyAgICAgICAgPC9saWNlbnNlPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICAgIDxuYW1lPkFwYWNoZSBMaWNlbnNlLCAyLjA8L25hbWU+CisgICAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC5odG1sPC91cmw+CisgICAgICAgICAgICA8ZGlzdHJpYnV0aW9uPnJlcG88L2Rpc3RyaWJ1dGlvbj4KKyAgICAgICAgICAgIDxjb21tZW50cz5Hb29nbGUgR3VhdmEgQCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YTwvY29tbWVudHM+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgICA8bmFtZT5QdWJsaWMgRG9tYWluPC9uYW1lPgorICAgICAgICAgICAgPHVybD5odHRwczovL2NyZWF0aXZlY29tbW9ucy5vcmcvcHVibGljZG9tYWluL3plcm8vMS4wLzwvdXJsPgorICAgICAgICAgICAgPGRpc3RyaWJ1dGlvbj5yZXBvPC9kaXN0cmlidXRpb24+CisgICAgICAgICAgICA8Y29tbWVudHM+SlNSLTE2NiBFeHRlbnNpb24gdG8gSkVQIDI2NiBAIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmpzcjE2NjwvY29tbWVudHM+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICA8L2xpY2Vuc2VzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cmVzb3VyY2VzPgorICAgICAgICAgICAgPHJlc291cmNlPgorICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICA8ZmlsdGVyaW5nPnRydWU8L2ZpbHRlcmluZz4KKyAgICAgICAgICAgIDwvcmVzb3VyY2U+CisgICAgICAgIDwvcmVzb3VyY2VzPgorCisgICAgICAgIDx0ZXN0UmVzb3VyY2VzPgorICAgICAgICAgIDx0ZXN0UmVzb3VyY2U+CisgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL3Rlc3QvcmVzb3VyY2VzPC9kaXJlY3Rvcnk+CisgICAgICAgICAgICA8ZmlsdGVyaW5nPnRydWU8L2ZpbHRlcmluZz4KKyAgICAgICAgICA8L3Rlc3RSZXNvdXJjZT4KKyAgICAgICAgPC90ZXN0UmVzb3VyY2VzPgorCisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHNvdXJjZT4ke2phdmEudmVyc2lvbn08L3NvdXJjZT4KKyAgICAgICAgICAgICAgICAgICAgPHRhcmdldD4ke2phdmEudmVyc2lvbn08L3RhcmdldD4KKyAgICAgICAgICAgICAgICAgICAgPGNvbXBpbGVyQXJndW1lbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEbyBub3Qgd2FybiBhYm91dCB1c2luZyBzdW4ubWlzYy5VbnNhZmUgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8WERpZ25vcmUuc3ltYm9sLmZpbGUgLz4KKyAgICAgICAgICAgICAgICAgICAgPC9jb21waWxlckFyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICAgICAgPHNob3dXYXJuaW5ncz5mYWxzZTwvc2hvd1dhcm5pbmdzPgorICAgICAgICAgICAgICAgICAgICA8Zm9yaz5mYWxzZTwvZm9yaz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi5pc3RhY2s8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4taXN0YWNrLWNvbW1vbnMtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJ1aWxkLWhlbHBlci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+ZGVmYXVsdC1qYXI8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmZlbGl4PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWJ1bmRsZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+CisgICAgICAgICAgICAgICAgPGV4dGVuc2lvbnM+dHJ1ZTwvZXh0ZW5zaW9ucz4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGluc3RydWN0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTm90ZTogV2hlbiB5b3UncmUgY2hhbmdpbmcgdGhlc2UgcHJvcGVydGllcyBjaGFuZ2UgdGhlbSBhbHNvIGluIGJ1bmRsZXMvamF4cnMtcmkvcG9tLnhtbC4gLS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8SW1wb3J0LVBhY2thZ2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VuLm1pc2MuKjtyZXNvbHV0aW9uOj1vcHRpb25hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICAgICAgICA8L0ltcG9ydC1QYWNrYWdlPgorICAgICAgICAgICAgICAgICAgICAgICAgPEV4cG9ydC1QYWNrYWdlPm9yZy5nbGFzc2Zpc2guamVyc2V5Lio7dmVyc2lvbj0ke3Byb2plY3QudmVyc2lvbn08L0V4cG9ydC1QYWNrYWdlPgorICAgICAgICAgICAgICAgICAgICAgICAgPFByaXZhdGUtUGFja2FnZT5vcmcuZ2xhc3NmaXNoLmplcnNleS5vc2dpPC9Qcml2YXRlLVBhY2thZ2U+CisgICAgICAgICAgICAgICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgorICAgICAgICAgICAgICAgICAgICA8dW5wYWNrQnVuZGxlPnRydWU8L3VucGFja0J1bmRsZT4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YnVpbGRudW1iZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8Zm9ybWF0PnswLGRhdGUseXl5eS1NTS1kZCBISDptbTpzc308L2Zvcm1hdD4KKyAgICAgICAgICAgICAgICAgICAgPGl0ZW1zPgorICAgICAgICAgICAgICAgICAgICAgICAgPGl0ZW0+dGltZXN0YW1wPC9pdGVtPgorICAgICAgICAgICAgICAgICAgICA8L2l0ZW1zPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT52YWxpZGF0ZTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y3JlYXRlPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDwhLS0gRXhlY3V0ZSB0ZXN0IGNsYXNzZXMgaW4gcGFyYWxsZWwgLSAxIHRocmVhZCBwZXIgQ1BVIGNvcmUuIC0tPgorICAgICAgICAgICAgICAgICAgICA8cGFyYWxsZWw+Y2xhc3Nlc0FuZE1ldGhvZHM8L3BhcmFsbGVsPgorICAgICAgICAgICAgICAgICAgICA8cGVyQ29yZVRocmVhZENvdW50PnRydWU8L3BlckNvcmVUaHJlYWRDb3VudD4KKyAgICAgICAgICAgICAgICAgICAgPHRocmVhZENvdW50PjE8L3RocmVhZENvdW50PgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgud3MucnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC53cy5ycy1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5hbm5vdGF0aW9uPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguYW5ub3RhdGlvbi1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcub3NnaTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5vc2dpLmNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5oazIuZXh0ZXJuYWw8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5pbmplY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmhrMjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm9zZ2ktcmVzb3VyY2UtbG9jYXRvcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPCEtLSBNdXN0IGJlIGRlY2xhcmVkIGJlZm9yZSBKVW5pdCBkZXBlbmRlbmN5LCBvdGhlcndpc2Ugbm90IHZpc2libGUgdG8gSlVuaXQuIC0tPgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmptb2NraXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qbW9ja2l0PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5oYW1jcmVzdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmhhbWNyZXN0LWxpYnJhcnk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+c2VjdXJpdHlPZmY8L2lkPgorICAgICAgICAgICAgPHByb3BlcnRpZXM+CisgICAgICAgICAgICAgICA8c3VyZWZpcmUuc2VjdXJpdHkuYXJnbGluZSAvPgorICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9TZWN1cml0eU1hbmFnZXJDb25maWd1cmVkVGVzdC5qYXZhPC9leGNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9SZWZsZWN0aW9uSGVscGVyVGVzdC5qYXZhPC9leGNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+c29uYXI8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBkaXNhYmxlIHBhcmFsbGVsIGV4ZWN1dGlvbiBzbyB0aGF0IEphQ29DbyBsaXN0ZW5lciBjYW4gcHJvcGVybHkgd29yayAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYWxsZWw+bm9uZTwvcGFyYWxsZWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBlckNvcmVUaHJlYWRDb3VudD5mYWxzZTwvcGVyQ29yZVRocmVhZENvdW50PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisKKyAgICA8L3Byb2ZpbGVzPgorCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxzdXJlZmlyZS5zZWN1cml0eS5hcmdsaW5lPi1EamF2YS5zZWN1cml0eS5tYW5hZ2VyIC1EamF2YS5zZWN1cml0eS5wb2xpY3k9JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vdGVzdC1jbGFzc2VzL3N1cmVmaXJlLnBvbGljeTwvc3VyZWZpcmUuc2VjdXJpdHkuYXJnbGluZT4KKyAgICA8L3Byb3BlcnRpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvQmV0YS5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9CZXRhLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg1NTk3OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvQmV0YS5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXk7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkFOTk9UQVRJT05fVFlQRTsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuQ09OU1RSVUNUT1I7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlBBQ0tBR0U7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7CisKKy8qKgorICogTWFya2VyIG9mIGEgcHVibGljIEplcnNleSBBUEkgdGhhdCBpcyBzdGlsbCBpbiAiYmV0YSIgbm9uLWZpbmFsIHZlcnNpb24uCisgKiA8cD4KKyAqIFRoaXMgYW5ub3RhdGlvbiBzaWduYWxzIHRoYXQgdGhlIGFubm90YXRlZCBwdWJsaWMgSmVyc2V5IEFQSSAocGFja2FnZSwgY2xhc3MsIG1ldGhvZCBvciBmaWVsZCkKKyAqIGhhcyBub3QgYmVlbiBmdWxseSBzdGFiaWxpemVkIHlldC4gQXMgc3VjaCwgdGhlIEFQSSBpcyBzdWJqZWN0IHRvIGJhY2t3YXJkLWluY29tcGF0aWJsZSBjaGFuZ2VzCisgKiAob3IgZXZlbiByZW1vdmFsKSBpbiBhIGZ1dHVyZSBKZXJzZXkgcmVsZWFzZS4gSmVyc2V5IGRldmVsb3BtZW50IHRlYW0gZG9lcyBub3QgbWFrZSBhbnkgZ3VhcmFudGVlcworICogdG8gcmV0YWluIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgb2YgYSB7QGNvZGUgQEJldGF9LWFubm90YXRlZCBKZXJzZXkgQVBJLgorICogPC9wPgorICogPHA+CisgKiBUaGlzIGFubm90YXRpb24gZG9lcyBub3QgaW5kaWNhdGUgaW5mZXJpb3IgcXVhbGl0eSBvciBwZXJmb3JtYW5jZSBvZiB0aGUgQVBJLCBqdXN0IGluZm9ybXMgdGhhdCB0aGUKKyAqIEFQSSBtYXkgc3RpbGwgZXZvbHZlIGluIHRoZSBmdXR1cmUgaW4gYSBiYWNrd2FyZC1pbmNvbXBhdGlibGUgd2F5cy4gSmVyc2V5IHVzZXJzIG1heSB1c2UgYmV0YSBBUElzCisgKiBpbiB0aGVpciBhcHBsaWNhdGlvbnMga2VlcGluZyBpbiBtaW5kIHBvdGVudGlhbCBjb3N0IG9mIGV4dHJhIHdvcmsgYXNzb2NpYXRlZCB3aXRoIGFuIHVwZ3JhZGUKKyAqIHRvIGEgbmV3ZXIgSmVyc2V5IHZlcnNpb24uCisgKiA8L3A+CisgKiA8cD4KKyAqIE9uY2UgYSB7QGNvZGUgQEJldGF9LWFubm90YXRlZCBKZXJzZXkgQVBJIHJlYWNoZXMgdGhlIGRlc2lyZWQgbWF0dXJpdHksIHRoZSB7QGNvZGUgQEJldGF9IGFubm90YXRpb24KKyAqIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHN1Y2ggQVBJIGFuZCB0aGUgQVBJIHdpbGwgYmVjb21lIHBhcnQgb2YgYSBzdGFibGUgcHVibGljIEplcnNleSBBUEkuCisgKiA8L3A+CisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuQ0xBU1MpCitARG9jdW1lbnRlZAorQFRhcmdldCh7QU5OT1RBVElPTl9UWVBFLCBUWVBFLCBDT05TVFJVQ1RPUiwgTUVUSE9ELCBGSUVMRCwgUEFDS0FHRX0pCitwdWJsaWMgQGludGVyZmFjZSBCZXRhIHsKK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvQ29tbW9uUHJvcGVydGllcy5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9Db21tb25Qcm9wZXJ0aWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIxOGQzYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvQ29tbW9uUHJvcGVydGllcy5qYXZhCkBAIC0wLDAgKzEsMzM2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5OworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LndzLnJzLlJ1bnRpbWVUeXBlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5Qcm9wZXJ0aWVzQ2xhc3M7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5Qcm9wZXJ0aWVzSGVscGVyOworCisvKioKKyAqIENvbW1vbiAoc2VydmVyL2NsaWVudCkgSmVyc2V5IGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcy4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQcm9wZXJ0aWVzQ2xhc3MKK3B1YmxpYyBmaW5hbCBjbGFzcyBDb21tb25Qcm9wZXJ0aWVzIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gTEVHQUNZX0ZBTExCQUNLX01BUCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworCisgICAgc3RhdGljIHsKKyAgICAgICAgTEVHQUNZX0ZBTExCQUNLX01BUC5wdXQoQ29tbW9uUHJvcGVydGllcy5PVVRCT1VORF9DT05URU5UX0xFTkdUSF9CVUZGRVJfQ0xJRU5ULAorICAgICAgICAgICAgICAgICJqZXJzZXkuY29uZmlnLmNvbnRlbnRMZW5ndGguYnVmZmVyLmNsaWVudCIpOworICAgICAgICBMRUdBQ1lfRkFMTEJBQ0tfTUFQLnB1dChDb21tb25Qcm9wZXJ0aWVzLk9VVEJPVU5EX0NPTlRFTlRfTEVOR1RIX0JVRkZFUl9TRVJWRVIsCisgICAgICAgICAgICAgICAgImplcnNleS5jb25maWcuY29udGVudExlbmd0aC5idWZmZXIuc2VydmVyIik7CisgICAgICAgIExFR0FDWV9GQUxMQkFDS19NQVAucHV0KENvbW1vblByb3BlcnRpZXMuRkVBVFVSRV9BVVRPX0RJU0NPVkVSWV9ESVNBQkxFX0NMSUVOVCwKKyAgICAgICAgICAgICAgICAiamVyc2V5LmNvbmZpZy5kaXNhYmxlQXV0b0Rpc2NvdmVyeS5jbGllbnQiKTsKKyAgICAgICAgTEVHQUNZX0ZBTExCQUNLX01BUC5wdXQoQ29tbW9uUHJvcGVydGllcy5GRUFUVVJFX0FVVE9fRElTQ09WRVJZX0RJU0FCTEVfU0VSVkVSLAorICAgICAgICAgICAgICAgICJqZXJzZXkuY29uZmlnLmRpc2FibGVBdXRvRGlzY292ZXJ5LnNlcnZlciIpOworICAgICAgICBMRUdBQ1lfRkFMTEJBQ0tfTUFQLnB1dChDb21tb25Qcm9wZXJ0aWVzLkpTT05fUFJPQ0VTU0lOR19GRUFUVVJFX0RJU0FCTEVfQ0xJRU5ULAorICAgICAgICAgICAgICAgICJqZXJzZXkuY29uZmlnLmRpc2FibGVKc29uUHJvY2Vzc2luZy5jbGllbnQiKTsKKyAgICAgICAgTEVHQUNZX0ZBTExCQUNLX01BUC5wdXQoQ29tbW9uUHJvcGVydGllcy5KU09OX1BST0NFU1NJTkdfRkVBVFVSRV9ESVNBQkxFX1NFUlZFUiwKKyAgICAgICAgICAgICAgICAiamVyc2V5LmNvbmZpZy5kaXNhYmxlSnNvblByb2Nlc3Npbmcuc2VydmVyIik7CisgICAgICAgIExFR0FDWV9GQUxMQkFDS19NQVAucHV0KENvbW1vblByb3BlcnRpZXMuTUVUQUlORl9TRVJWSUNFU19MT09LVVBfRElTQUJMRV9DTElFTlQsCisgICAgICAgICAgICAgICAgImplcnNleS5jb25maWcuZGlzYWJsZU1ldGFpbmZTZXJ2aWNlc0xvb2t1cC5jbGllbnQiKTsKKyAgICAgICAgTEVHQUNZX0ZBTExCQUNLX01BUC5wdXQoQ29tbW9uUHJvcGVydGllcy5NRVRBSU5GX1NFUlZJQ0VTX0xPT0tVUF9ESVNBQkxFX1NFUlZFUiwKKyAgICAgICAgICAgICAgICAiamVyc2V5LmNvbmZpZy5kaXNhYmxlTWV0YWluZlNlcnZpY2VzTG9va3VwLnNlcnZlciIpOworICAgICAgICBMRUdBQ1lfRkFMTEJBQ0tfTUFQLnB1dChDb21tb25Qcm9wZXJ0aWVzLk1PWFlfSlNPTl9GRUFUVVJFX0RJU0FCTEVfQ0xJRU5ULAorICAgICAgICAgICAgICAgICJqZXJzZXkuY29uZmlnLmRpc2FibGVNb3h5SnNvbi5jbGllbnQiKTsKKyAgICAgICAgTEVHQUNZX0ZBTExCQUNLX01BUC5wdXQoQ29tbW9uUHJvcGVydGllcy5NT1hZX0pTT05fRkVBVFVSRV9ESVNBQkxFX1NFUlZFUiwKKyAgICAgICAgICAgICAgICAiamVyc2V5LmNvbmZpZy5kaXNhYmxlTW94eUpzb24uc2VydmVyIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYge0Bjb2RlIHRydWV9IHRoZW4gZGlzYWJsZSBmZWF0dXJlIGF1dG8gZGlzY292ZXJ5IGdsb2JhbGx5IG9uIGNsaWVudC9zZXJ2ZXIuCisgICAgICogPHA+CisgICAgICogQnkgZGVmYXVsdCBhdXRvIGRpc2NvdmVyeSBpcyBhdXRvbWF0aWNhbGx5IGVuYWJsZWQuIFRoZSB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5IG1heSBiZSBvdmVycmlkZGVuIGJ5IHRoZSBjbGllbnQvc2VydmVyCisgICAgICogdmFyaWFudCBvZiB0aGlzIHByb3BlcnR5LgorICAgICAqIDxwPgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHtAY29kZSBmYWxzZX0uCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDx0dD57QHZhbHVlfTwvdHQ+LgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX0FVVE9fRElTQ09WRVJZX0RJU0FCTEUgPSAiamVyc2V5LmNvbmZpZy5kaXNhYmxlQXV0b0Rpc2NvdmVyeSI7CisKKyAgICAvKioKKyAgICAgKiBDbGllbnQtc3BlY2lmaWMgdmVyc2lvbiBvZiB7QGxpbmsgQ29tbW9uUHJvcGVydGllcyNGRUFUVVJFX0FVVE9fRElTQ09WRVJZX0RJU0FCTEV9LgorICAgICAqCisgICAgICogSWYgcHJlc2VudCwgaXQgb3ZlcnJpZGVzIHRoZSBnZW5lcmljIG9uZSBmb3IgdGhlIGNsaWVudCBlbnZpcm9ubWVudC4KKyAgICAgKiBAc2luY2UgMi44CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRV9BVVRPX0RJU0NPVkVSWV9ESVNBQkxFX0NMSUVOVCA9ICJqZXJzZXkuY29uZmlnLmNsaWVudC5kaXNhYmxlQXV0b0Rpc2NvdmVyeSI7CisKKyAgICAvKioKKyAgICAgKiBTZXJ2ZXItc3BlY2lmaWMgdmVyc2lvbiBvZiB7QGxpbmsgQ29tbW9uUHJvcGVydGllcyNGRUFUVVJFX0FVVE9fRElTQ09WRVJZX0RJU0FCTEV9LgorICAgICAqCisgICAgICogSWYgcHJlc2VudCwgaXQgb3ZlcnJpZGVzIHRoZSBnZW5lcmljIG9uZSBmb3IgdGhlIHNlcnZlciBlbnZpcm9ubWVudC4KKyAgICAgKiBAc2luY2UgMi44CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkVBVFVSRV9BVVRPX0RJU0NPVkVSWV9ESVNBQkxFX1NFUlZFUiA9ICJqZXJzZXkuY29uZmlnLnNlcnZlci5kaXNhYmxlQXV0b0Rpc2NvdmVyeSI7CisKKyAgICAvKioKKyAgICAgKiBJZiB7QGNvZGUgdHJ1ZX0gdGhlbiBkaXNhYmxlIGNvbmZpZ3VyYXRpb24gb2YgSnNvbiBQcm9jZXNzaW5nIChKU1ItMzUzKSBmZWF0dXJlLgorICAgICAqIDxwPgorICAgICAqIEJ5IGRlZmF1bHQgSnNvbiBQcm9jZXNzaW5nIGlzIGF1dG9tYXRpY2FsbHkgZW5hYmxlZC4gVGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgbWF5IGJlIG92ZXJyaWRkZW4gYnkgdGhlIGNsaWVudC9zZXJ2ZXIKKyAgICAgKiB2YXJpYW50IG9mIHRoaXMgcHJvcGVydHkuCisgICAgICogPHA+CisgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMge0Bjb2RlIGZhbHNlfS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaXMgPHR0PntAdmFsdWV9PC90dD4uCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fUFJPQ0VTU0lOR19GRUFUVVJFX0RJU0FCTEUgPSAiamVyc2V5LmNvbmZpZy5kaXNhYmxlSnNvblByb2Nlc3NpbmciOworCisgICAgLyoqCisgICAgICogQ2xpZW50LXNwZWNpZmljIHZlcnNpb24gb2Yge0BsaW5rIENvbW1vblByb3BlcnRpZXMjSlNPTl9QUk9DRVNTSU5HX0ZFQVRVUkVfRElTQUJMRX0uCisgICAgICoKKyAgICAgKiBJZiBwcmVzZW50LCBpdCBvdmVycmlkZXMgdGhlIGdlbmVyaWMgb25lIGZvciB0aGUgY2xpZW50IGVudmlyb25tZW50LgorICAgICAqIEBzaW5jZSAyLjgKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX1BST0NFU1NJTkdfRkVBVFVSRV9ESVNBQkxFX0NMSUVOVCA9ICJqZXJzZXkuY29uZmlnLmNsaWVudC5kaXNhYmxlSnNvblByb2Nlc3NpbmciOworCisgICAgLyoqCisgICAgICogU2VydmVyLXNwZWNpZmljIHZlcnNpb24gb2Yge0BsaW5rIENvbW1vblByb3BlcnRpZXMjSlNPTl9QUk9DRVNTSU5HX0ZFQVRVUkVfRElTQUJMRX0uCisgICAgICoKKyAgICAgKiBJZiBwcmVzZW50LCBpdCBvdmVycmlkZXMgdGhlIGdlbmVyaWMgb25lIGZvciB0aGUgc2VydmVyIGVudmlyb25tZW50LgorICAgICAqIEBzaW5jZSAyLjgKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX1BST0NFU1NJTkdfRkVBVFVSRV9ESVNBQkxFX1NFUlZFUiA9ICJqZXJzZXkuY29uZmlnLnNlcnZlci5kaXNhYmxlSnNvblByb2Nlc3NpbmciOworCisgICAgLyoqCisgICAgICogSWYge0Bjb2RlIHRydWV9IHRoZW4gZGlzYWJsZSBNRVRBLUlORi9zZXJ2aWNlcyBsb29rdXAgZ2xvYmFsbHkgb24gY2xpZW50L3NlcnZlci4KKyAgICAgKiA8cD4KKyAgICAgKiBCeSBkZWZhdWx0IEplcnNleSBsb29rcyB1cCBTUEkgaW1wbGVtZW50YXRpb25zIGRlc2NyaWJlZCBieSBNRVRBLUlORi9zZXJ2aWNlcy8qIGZpbGVzLgorICAgICAqIFRoZW4geW91IGNhbiByZWdpc3RlciBhcHByb3ByaWF0ZSBwcm92aWRlciBjbGFzc2VzIGJ5IHtAbGluayBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9ufS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMge0Bjb2RlIGZhbHNlfS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaXMgPHR0PntAdmFsdWV9PC90dD4uCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHNpbmNlIDIuMQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFJTkZfU0VSVklDRVNfTE9PS1VQX0RJU0FCTEUgPSAiamVyc2V5LmNvbmZpZy5kaXNhYmxlTWV0YWluZlNlcnZpY2VzTG9va3VwIjsKKworICAgIC8qKgorICAgICAqIENsaWVudC1zcGVjaWZpYyB2ZXJzaW9uIG9mIHtAbGluayBDb21tb25Qcm9wZXJ0aWVzI01FVEFJTkZfU0VSVklDRVNfTE9PS1VQX0RJU0FCTEV9LgorICAgICAqCisgICAgICogSWYgcHJlc2VudCwgaXQgb3ZlcnJpZGVzIHRoZSBnZW5lcmljIG9uZSBmb3IgdGhlIGNsaWVudCBlbnZpcm9ubWVudC4KKyAgICAgKiBAc2luY2UgMi44CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUQUlORl9TRVJWSUNFU19MT09LVVBfRElTQUJMRV9DTElFTlQgPSAiamVyc2V5LmNvbmZpZy5jbGllbnQuZGlzYWJsZU1ldGFpbmZTZXJ2aWNlc0xvb2t1cCI7CisKKyAgICAvKioKKyAgICAgKiBTZXJ2ZXItc3BlY2lmaWMgdmVyc2lvbiBvZiB7QGxpbmsgQ29tbW9uUHJvcGVydGllcyNNRVRBSU5GX1NFUlZJQ0VTX0xPT0tVUF9ESVNBQkxFfS4KKyAgICAgKgorICAgICAqIElmIHByZXNlbnQsIGl0IG92ZXJyaWRlcyB0aGUgZ2VuZXJpYyBvbmUgZm9yIHRoZSBzZXJ2ZXIgZW52aXJvbm1lbnQuCisgICAgICogQHNpbmNlIDIuOAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEFJTkZfU0VSVklDRVNfTE9PS1VQX0RJU0FCTEVfU0VSVkVSID0gImplcnNleS5jb25maWcuc2VydmVyLmRpc2FibGVNZXRhaW5mU2VydmljZXNMb29rdXAiOworCisgICAgLyoqCisgICAgICogSWYge0Bjb2RlIHRydWV9IHRoZW4gZGlzYWJsZSBjb25maWd1cmF0aW9uIG9mIE1PWHkgSnNvbiBmZWF0dXJlLgorICAgICAqIDxwPgorICAgICAqIEJ5IGRlZmF1bHQgTU9YeSBKc29uIGlzIGF1dG9tYXRpY2FsbHkgZW5hYmxlZC4gVGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgbWF5IGJlIG92ZXJyaWRkZW4gYnkgdGhlIGNsaWVudC9zZXJ2ZXIKKyAgICAgKiB2YXJpYW50IG9mIHRoaXMgcHJvcGVydHkuCisgICAgICogPHA+CisgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMge0Bjb2RlIGZhbHNlfS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaXMgPHR0PntAdmFsdWV9PC90dD4uCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PWFlfSlNPTl9GRUFUVVJFX0RJU0FCTEUgPSAiamVyc2V5LmNvbmZpZy5kaXNhYmxlTW94eUpzb24iOworCisgICAgLyoqCisgICAgICogQ2xpZW50LXNwZWNpZmljIHZlcnNpb24gb2Yge0BsaW5rIENvbW1vblByb3BlcnRpZXMjTU9YWV9KU09OX0ZFQVRVUkVfRElTQUJMRX0uCisgICAgICoKKyAgICAgKiBJZiBwcmVzZW50LCBpdCBvdmVycmlkZXMgdGhlIGdlbmVyaWMgb25lIGZvciB0aGUgY2xpZW50IGVudmlyb25tZW50LgorICAgICAqIEBzaW5jZSAyLjgKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT1hZX0pTT05fRkVBVFVSRV9ESVNBQkxFX0NMSUVOVCA9ICJqZXJzZXkuY29uZmlnLmNsaWVudC5kaXNhYmxlTW94eUpzb24iOworCisgICAgLyoqCisgICAgICogU2VydmVyLXNwZWNpZmljIHZlcnNpb24gb2Yge0BsaW5rIENvbW1vblByb3BlcnRpZXMjTU9YWV9KU09OX0ZFQVRVUkVfRElTQUJMRX0uCisgICAgICoKKyAgICAgKiBJZiBwcmVzZW50LCBpdCBvdmVycmlkZXMgdGhlIGdlbmVyaWMgb25lIGZvciB0aGUgc2VydmVyIGVudmlyb25tZW50LgorICAgICAqIEBzaW5jZSAyLjgKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT1hZX0pTT05fRkVBVFVSRV9ESVNBQkxFX1NFUlZFUiA9ICJqZXJzZXkuY29uZmlnLnNlcnZlci5kaXNhYmxlTW94eUpzb24iOworCisgICAgLyoqCisgICAgICogQW4gaW50ZWdlciB2YWx1ZSB0aGF0IGRlZmluZXMgdGhlIGJ1ZmZlciBzaXplIHVzZWQgdG8gYnVmZmVyIHRoZSBvdXRib3VuZCBtZXNzYWdlIGVudGl0eSBpbiBvcmRlciB0bworICAgICAqIGRldGVybWluZSBpdHMgc2l6ZSBhbmQgc2V0IHRoZSB2YWx1ZSBvZiBIVFRQIDx0dD57QHZhbHVlIGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnMjQ09OVEVOVF9MRU5HVEh9PC90dD4gaGVhZGVyLgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSBlbnRpdHkgc2l6ZSBleGNlZWRzIHRoZSBjb25maWd1cmVkIGJ1ZmZlciBzaXplLCB0aGUgYnVmZmVyaW5nIHdvdWxkIGJlIGNhbmNlbGxlZCBhbmQgdGhlIGVudGl0eSBzaXplCisgICAgICogd291bGQgbm90IGJlIGRldGVybWluZWQuIFZhbHVlIGxlc3Mgb3IgZXF1YWwgdG8gemVybyBkaXNhYmxlIHRoZSBidWZmZXJpbmcgb2YgdGhlIGVudGl0eSBhdCBhbGwuCisgICAgICogPC9wPgorICAgICAqIFRoZSB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5IG1heSBiZSBvdmVycmlkZGVuIGJ5IHRoZSBjbGllbnQvc2VydmVyIHZhcmlhbnQgb2YgdGhpcyBwcm9wZXJ0eSBieSBkZWZpbmluZyB0aGUgc3VmZml4CisgICAgICogdG8gdGhpcyBwcm9wZXJ0eSAiPHR0Pi5zZXJ2ZXI8L3R0PiIgb3IgIjx0dD4uY2xpZW50PC90dD4iCisgICAgICogKDx0dD57QHZhbHVlfS5zZXJ2ZXI8L3R0PiBvciAgPHR0PntAdmFsdWV9LmNsaWVudDwvdHQ+KS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8dHQ+ODE5MjwvdHQ+LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUQk9VTkRfQ09OVEVOVF9MRU5HVEhfQlVGRkVSID0gImplcnNleS5jb25maWcuY29udGVudExlbmd0aC5idWZmZXIiOworCisgICAgLyoqCisgICAgICogQ2xpZW50LXNwZWNpZmljIHZlcnNpb24gb2Yge0BsaW5rIENvbW1vblByb3BlcnRpZXMjT1VUQk9VTkRfQ09OVEVOVF9MRU5HVEhfQlVGRkVSfS4KKyAgICAgKgorICAgICAqIElmIHByZXNlbnQsIGl0IG92ZXJyaWRlcyB0aGUgZ2VuZXJpYyBvbmUgZm9yIHRoZSBjbGllbnQgZW52aXJvbm1lbnQuCisgICAgICogQHNpbmNlIDIuOAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVEJPVU5EX0NPTlRFTlRfTEVOR1RIX0JVRkZFUl9DTElFTlQgPSAiamVyc2V5LmNvbmZpZy5jbGllbnQuY29udGVudExlbmd0aC5idWZmZXIiOworCisgICAgLyoqCisgICAgICogU2VydmVyLXNwZWNpZmljIHZlcnNpb24gb2Yge0BsaW5rIENvbW1vblByb3BlcnRpZXMjT1VUQk9VTkRfQ09OVEVOVF9MRU5HVEhfQlVGRkVSfS4KKyAgICAgKgorICAgICAqIElmIHByZXNlbnQsIGl0IG92ZXJyaWRlcyB0aGUgZ2VuZXJpYyBvbmUgZm9yIHRoZSBzZXJ2ZXIgZW52aXJvbm1lbnQuCisgICAgICogQHNpbmNlIDIuOAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9VVEJPVU5EX0NPTlRFTlRfTEVOR1RIX0JVRkZFUl9TRVJWRVIgPSAiamVyc2V5LmNvbmZpZy5zZXJ2ZXIuY29udGVudExlbmd0aC5idWZmZXIiOworCisgICAgLyoqCisgICAgICogUHJldmVudCBpbnN0YW50aWF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgQ29tbW9uUHJvcGVydGllcygpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBJZiB0aGUgcHJvcGVydHkgaXMgbm90IHNldCBvciB0aGUgYWN0dWFsIHByb3BlcnR5IHZhbHVlIHR5cGUgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgc3BlY2lmaWVkIHR5cGUsIHRoZSBtZXRob2Qgd2lsbAorICAgICAqIHJldHVybiB7QGNvZGUgbnVsbH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvcGVydGllcyAgICBNYXAgb2YgcHJvcGVydGllcyB0byBnZXQgdGhlIHByb3BlcnR5IHZhbHVlIGZyb20uCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAgTmFtZSBvZiB0aGUgcHJvcGVydHkuCisgICAgICogQHBhcmFtIHR5cGUgICAgICAgICAgVHlwZSB0byByZXRyaWV2ZSB0aGUgdmFsdWUgYXMuCisgICAgICogQHJldHVybiAgICAgICAgICAgICAgVmFsdWUgb2YgdGhlIHByb3BlcnR5IG9yIHtAY29kZSBudWxsfS4KKyAgICAgKgorICAgICAqIEBzaW5jZSAyLjgKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRWYWx1ZShmaW5hbCBNYXA8U3RyaW5nLCA/PiBwcm9wZXJ0aWVzLCBmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLCBmaW5hbCBDbGFzczw/PiB0eXBlKSB7CisgICAgICAgIHJldHVybiBQcm9wZXJ0aWVzSGVscGVyLmdldFZhbHVlKHByb3BlcnRpZXMsIHByb3BlcnR5TmFtZSwgdHlwZSwgQ29tbW9uUHJvcGVydGllcy5MRUdBQ1lfRkFMTEJBQ0tfTUFQKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBJZiB0aGUgcHJvcGVydHkgaXMgbm90IHNldCBvciB0aGUgcmVhbCB2YWx1ZSB0eXBlIGlzIG5vdCBjb21wYXRpYmxlIHdpdGgge0Bjb2RlIGRlZmF1bHRWYWx1ZX0gdHlwZSwKKyAgICAgKiB0aGUgc3BlY2lmaWVkIHtAY29kZSBkZWZhdWx0VmFsdWV9IGlzIHJldHVybmVkLiBDYWxsaW5nIHRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZworICAgICAqIHtAY29kZSBDb21tb25Qcm9wZXJ0aWVzLmdldFZhbHVlKHByb3BlcnRpZXMsIGtleSwgZGVmYXVsdFZhbHVlLCAoQ2xhc3MmbHQ7VCZndDspIGRlZmF1bHRWYWx1ZS5nZXRDbGFzcygpKX0KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzICAgIE1hcCBvZiBwcm9wZXJ0aWVzIHRvIGdldCB0aGUgcHJvcGVydHkgdmFsdWUgZnJvbS4KKyAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lICBOYW1lIG9mIHRoZSBwcm9wZXJ0eS4KKyAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlICBEZWZhdWx0IHZhbHVlIGlmIHByb3BlcnR5IGlzIG5vdCByZWdpc3RlcmVkCisgICAgICogQHBhcmFtIDxUPiAgICAgICAgICAgVHlwZSBvZiB0aGUgcHJvcGVydHkgdmFsdWUuCisgICAgICogQHJldHVybiAgICAgICAgICAgICAgVmFsdWUgb2YgdGhlIHByb3BlcnR5IG9yIHtAY29kZSBudWxsfS4KKyAgICAgKgorICAgICAqIEBzaW5jZSAyLjgKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUPiBUIGdldFZhbHVlKGZpbmFsIE1hcDxTdHJpbmcsID8+IHByb3BlcnRpZXMsIGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGZpbmFsIFQgZGVmYXVsdFZhbHVlKSB7CisgICAgICAgIHJldHVybiBQcm9wZXJ0aWVzSGVscGVyLmdldFZhbHVlKHByb3BlcnRpZXMsIHByb3BlcnR5TmFtZSwgZGVmYXVsdFZhbHVlLCBDb21tb25Qcm9wZXJ0aWVzLkxFR0FDWV9GQUxMQkFDS19NQVApOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIElmIHRoZSBwcm9wZXJ0eSBpcyBub3Qgc2V0IG9yIHRoZSByZWFsIHZhbHVlIHR5cGUgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB7QGNvZGUgZGVmYXVsdFZhbHVlfSB0eXBlLAorICAgICAqIHRoZSBzcGVjaWZpZWQge0Bjb2RlIGRlZmF1bHRWYWx1ZX0gaXMgcmV0dXJuZWQuIENhbGxpbmcgdGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nCisgICAgICoge0Bjb2RlIENvbW1vblByb3BlcnRpZXMuZ2V0VmFsdWUocHJvcGVydGllcywgcnVudGltZVR5cGUsIGtleSwgZGVmYXVsdFZhbHVlLCAoQ2xhc3MmbHQ7VCZndDspIGRlZmF1bHRWYWx1ZS5nZXRDbGFzcygpKX0KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzICAgIE1hcCBvZiBwcm9wZXJ0aWVzIHRvIGdldCB0aGUgcHJvcGVydHkgdmFsdWUgZnJvbS4KKyAgICAgKiBAcGFyYW0gcnVudGltZSAgICAgICBSdW50aW1lIHR5cGUgd2hpY2ggaXMgdXNlZCB0byBjaGVjayB3aGV0aGVyIHRoZXJlIGlzIGEgcHJvcGVydHkgd2l0aCB0aGUgc2FtZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHtAY29kZSBrZXl9IGJ1dCBwb3N0LWZpeGVkIGJ5IHJ1bnRpbWUgdHlwZSAoPHR0Pi5zZXJ2ZXI8L3R0PgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIG9yIHtAY29kZSAuY2xpZW50fSkgd2hpY2ggd291bGQgb3ZlcnJpZGUgdGhlIHtAY29kZSBrZXl9IHByb3BlcnR5LgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eU5hbWUgIE5hbWUgb2YgdGhlIHByb3BlcnR5LgorICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgIERlZmF1bHQgdmFsdWUgaWYgcHJvcGVydHkgaXMgbm90IHJlZ2lzdGVyZWQKKyAgICAgKiBAcGFyYW0gPFQ+ICAgICAgICAgICBUeXBlIG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuICAgICAgICAgICAgICBWYWx1ZSBvZiB0aGUgcHJvcGVydHkgb3Ige0Bjb2RlIG51bGx9LgorICAgICAqCisgICAgICogQHNpbmNlIDIuOAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFQgZ2V0VmFsdWUoZmluYWwgTWFwPFN0cmluZywgPz4gcHJvcGVydGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJ1bnRpbWVUeXBlIHJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVCBkZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIFByb3BlcnRpZXNIZWxwZXIuZ2V0VmFsdWUocHJvcGVydGllcywgcnVudGltZSwgcHJvcGVydHlOYW1lLCBkZWZhdWx0VmFsdWUsIENvbW1vblByb3BlcnRpZXMuTEVHQUNZX0ZBTExCQUNLX01BUCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5LgorICAgICAqCisgICAgICogSWYgdGhlIHByb3BlcnR5IGlzIG5vdCBzZXQgb3IgdGhlIHJlYWwgdmFsdWUgdHlwZSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUgdHlwZSwKKyAgICAgKiByZXR1cm5zIHtAY29kZSBkZWZhdWx0VmFsdWV9LgorICAgICAqCisgICAgICogQHBhcmFtIHByb3BlcnRpZXMgICAgTWFwIG9mIHByb3BlcnRpZXMgdG8gZ2V0IHRoZSBwcm9wZXJ0eSB2YWx1ZSBmcm9tLgorICAgICAqIEBwYXJhbSBydW50aW1lICAgICAgIFJ1bnRpbWUgdHlwZSB3aGljaCBpcyB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgdGhlcmUgaXMgYSBwcm9wZXJ0eSB3aXRoIHRoZSBzYW1lCisgICAgICogICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIGtleX0gYnV0IHBvc3QtZml4ZWQgYnkgcnVudGltZSB0eXBlICg8dHQ+LnNlcnZlcjwvdHQ+CisgICAgICogICAgICAgICAgICAgICAgICAgICAgb3Ige0Bjb2RlIC5jbGllbnR9KSB3aGljaCB3b3VsZCBvdmVycmlkZSB0aGUge0Bjb2RlIGtleX0gcHJvcGVydHkuCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAgTmFtZSBvZiB0aGUgcHJvcGVydHkuCisgICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSAgRGVmYXVsdCB2YWx1ZSBpZiBwcm9wZXJ0eSBpcyBub3QgcmVnaXN0ZXJlZAorICAgICAqIEBwYXJhbSB0eXBlICAgICAgICAgIFR5cGUgdG8gcmV0cmlldmUgdGhlIHZhbHVlIGFzLgorICAgICAqIEBwYXJhbSA8VD4gICAgICAgICAgIFR5cGUgb2YgdGhlIHByb3BlcnR5IHZhbHVlLgorICAgICAqIEByZXR1cm4gICAgICAgICAgICAgIFZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBvciB7QGNvZGUgbnVsbH0uCisgICAgICoKKyAgICAgKiBAc2luY2UgMi44CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8VD4gVCBnZXRWYWx1ZShmaW5hbCBNYXA8U3RyaW5nLCA/PiBwcm9wZXJ0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUnVudGltZVR5cGUgcnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUIGRlZmF1bHRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPFQ+IHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIFByb3BlcnRpZXNIZWxwZXIuZ2V0VmFsdWUocHJvcGVydGllcywgcnVudGltZSwgcHJvcGVydHlOYW1lLCBkZWZhdWx0VmFsdWUsIHR5cGUsCisgICAgICAgICAgICAgICAgQ29tbW9uUHJvcGVydGllcy5MRUdBQ1lfRkFMTEJBQ0tfTUFQKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBJZiB0aGUgcHJvcGVydHkgaXMgbm90IHNldCBvciB0aGUgYWN0dWFsIHByb3BlcnR5IHZhbHVlIHR5cGUgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgc3BlY2lmaWVkIHR5cGUsIHRoZSBtZXRob2Qgd2lsbAorICAgICAqIHJldHVybiB7QGNvZGUgbnVsbH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvcGVydGllcyAgICBNYXAgb2YgcHJvcGVydGllcyB0byBnZXQgdGhlIHByb3BlcnR5IHZhbHVlIGZyb20uCisgICAgICogQHBhcmFtIHJ1bnRpbWUgICAgICAgUnVudGltZSB0eXBlIHdoaWNoIGlzIHVzZWQgdG8gY2hlY2sgd2hldGhlciB0aGVyZSBpcyBhIHByb3BlcnR5IHdpdGggdGhlIHNhbWUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB7QGNvZGUga2V5fSBidXQgcG9zdC1maXhlZCBieSBydW50aW1lIHR5cGUgKDx0dD4uc2VydmVyPC90dD4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvciB7QGNvZGUgLmNsaWVudH0pIHdoaWNoIHdvdWxkIG92ZXJyaWRlIHRoZSB7QGNvZGUga2V5fSBwcm9wZXJ0eS4KKyAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lICBOYW1lIG9mIHRoZSBwcm9wZXJ0eS4KKyAgICAgKiBAcGFyYW0gdHlwZSAgICAgICAgICBUeXBlIHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBhcy4KKyAgICAgKiBAcGFyYW0gPFQ+ICAgICAgICAgICBUeXBlIG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuICAgICAgICAgICAgICBWYWx1ZSBvZiB0aGUgcHJvcGVydHkgb3Ige0Bjb2RlIG51bGx9LgorICAgICAqCisgICAgICogQHNpbmNlIDIuOAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFQgZ2V0VmFsdWUoZmluYWwgTWFwPFN0cmluZywgPz4gcHJvcGVydGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJ1bnRpbWVUeXBlIHJ1bnRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8VD4gdHlwZSkgeworICAgICAgICByZXR1cm4gUHJvcGVydGllc0hlbHBlci5nZXRWYWx1ZShwcm9wZXJ0aWVzLCBydW50aW1lLCBwcm9wZXJ0eU5hbWUsIHR5cGUsIENvbW1vblByb3BlcnRpZXMuTEVHQUNZX0ZBTExCQUNLX01BUCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9FeHRlbmRlZENvbmZpZy5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9FeHRlbmRlZENvbmZpZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMGMyNGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L0V4dGVuZGVkQ29uZmlnLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKKworLyoqCisgKiBFeHRlbmRlZCBjb21tb24gcnVudGltZSBjb25maWd1cmF0aW9uLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRXh0ZW5kZWRDb25maWcgZXh0ZW5kcyBDb25maWd1cmF0aW9uIHsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IHdpdGggYSBnaXZlbiBuYW1lIGNvbnZlcnRlZCB0byB7QGNvZGUgYm9vbGVhbn0uCisgICAgICogUmV0dXJucyB7QGNvZGUgZmFsc2V9IGlmIHRoZSB2YWx1ZSBpcyBub3QgY29udmVydGlibGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBwcm9wZXJ0eSBuYW1lLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIGJvb2xlYW59IHByb3BlcnR5IHZhbHVlIG9yIHtAY29kZSBmYWxzZX0gaWYgdGhlIHByb3BlcnR5IGlzIG5vdAorICAgICAqICAgICAgICAgY29udmVydGlibGUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNQcm9wZXJ0eShmaW5hbCBTdHJpbmcgbmFtZSk7Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L0luamVjdGlvbk1hbmFnZXJQcm92aWRlci5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9JbmplY3Rpb25NYW5hZ2VyUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmNlNGM0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9JbmplY3Rpb25NYW5hZ2VyUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJlYWRlckludGVyY2VwdG9yQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXJTdXBwbGllcjsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIHdpdGggc3RhdGljIG1ldGhvZHMgdGhhdCBleHRyYWN0IHtAbGluayBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbiBtYW5hZ2VyfQorICogZnJvbSB2YXJpb3VzIEpBWC1SUyBjb21wb25lbnRzLiBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIHdoZW4gbm8gaW5qZWN0aW9uIGlzIHBvc3NpYmxlIGJ5CisgKiB7QGxpbmsgamF2YXgud3MucnMuY29yZS5Db250ZXh0fSBvciB7QGxpbmsgamF2YXguaW5qZWN0LkluamVjdH0gYW5ub3RhdGlvbiBkdWUgdG8gY2hhcmFjdGVyIG9mCisgKiBwcm92aWRlciBidXQgdGhlcmUgaXMgYSBuZWVkIHRvIGdldCBhbnkgc2VydmljZSBmcm9tIHtAbGluayBJbmplY3Rpb25NYW5hZ2VyfS4KKyAqIDxwPgorICogSW5qZWN0aW9ucyBhcmUgbm90IHBvc3NpYmxlIGZvciBleGFtcGxlIHdoZW4gYSBwcm92aWRlciBpcyByZWdpc3RlcmVkIGFzIGFuIGluc3RhbmNlIG9uIHRoZSBjbGllbnQuCisgKiBJbiB0aGlzIGNhc2UgdGhlIHJ1bnRpbWUgd2lsbCBub3QgaW5qZWN0IHRoZSBpbnN0YW5jZSBhcyB0aGlzIGluc3RhbmNlIG1pZ2h0IGJlIHVzZWQgaW4gb3RoZXIgY2xpZW50CisgKiBydW50aW1lcyB0b28uCisgKiA8L3A+CisgKiA8cD4KKyAqIEV4YW1wbGUuIFRoaXMgaXMgdGhlIGNsYXNzIHVzaW5nIGEgc3RhbmRhcmQgaW5qZWN0aW9uOgorICogPHByZT4KKyAqICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15V3JpdGVySW50ZXJjZXB0b3IgaW1wbGVtZW50cyBXcml0ZXJJbnRlcmNlcHRvciB7CisgKiAgICAgICAgICYjNjQ7SW5qZWN0CisgKiAgICAgICAgIE15SW5qZWN0ZWRTZXJ2aWNlIHNlcnZpY2U7CisgKgorICogICAgICAgICAmIzY0O092ZXJyaWRlCisgKiAgICAgICAgIHB1YmxpYyB2b2lkIGFyb3VuZFdyaXRlVG8oV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICogICAgICAgICAgICAgU29tZXRoaW5nIHNvbWV0aGluZyA9IHNlcnZpY2UuZ2V0U29tZXRoaW5nKCk7CisgKiAgICAgICAgICAgICAuLi4KKyAqICAgICAgICAgfQorICoKKyAqICAgICB9CisgKiA8L3ByZT4KKyAqIDwvcD4KKyAqIDxwPgorICogSWYgdGhpcyBpbmplY3Rpb24gaXMgbm90IHBvc3NpYmxlIHRoZW4gdGhpcyBjb25zdHJ1Y3QgY2FuIGJlIHVzZWQ6CisgKiA8cHJlPgorICogICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlXcml0ZXJJbnRlcmNlcHRvciBpbXBsZW1lbnRzIFdyaXRlckludGVyY2VwdG9yIHsKKyAqCisgKiAgICAgICAgICYjNjQ7T3ZlcnJpZGUKKyAqICAgICAgICAgcHVibGljIHZvaWQgYXJvdW5kV3JpdGVUbyhXcml0ZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgKiAgICAgICAgICAgICBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIgPSBJbmplY3Rpb25NYW5hZ2VyUHJvdmlkZXIuZ2V0SW5qZWN0aW9uTWFuYWdlcihjb250ZXh0KTsKKyAqICAgICAgICAgICAgIE15SW5qZWN0ZWRTZXJ2aWNlIHNlcnZpY2UgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKE15SW5qZWN0ZWRTZXJ2aWNlLmNsYXNzKTsKKyAqICAgICAgICAgICAgIFNvbWV0aGluZyBzb21ldGhpbmcgPSBzZXJ2aWNlLmdldFNvbWV0aGluZygpOworICogICAgICAgICAgICAgLi4uCisgKiAgICAgICAgIH0KKyAqICAgICB9CisgKiA8L3ByZT4KKyAqIDwvcD4KKyAqIDxwPgorICogTm90ZSwgdGhhdCB0aGlzIGluamVjdGlvbiBzdXBwb3J0IGlzIGludGVuZGVkIG1vc3RseSBmb3IgaW5qZWN0aW9uIG9mIGN1c3RvbSB1c2VyIHR5cGVzLiBKQVgtUlMgdHlwZXMKKyAqIGFyZSB1c3VhbGx5IGF2YWlsYWJsZSB3aXRob3V0IG5lZWQgZm9yIGluamVjdGlvbnMgaW4gbWV0aG9kIHBhcmFtZXRlcnMuIEhvd2V2ZXIsIHdoZW4gaW5qZWN0aW9uIG9mIGN1c3RvbQorICogdHlwZSBpcyBuZWVkZWQgaXQgaXMgcHJlZmVycmVkIHRvIHVzZSBzdGFuZGFyZCBpbmplY3Rpb25zIGlmIGl0IGlzIHBvc3NpYmxlIHJhdGhlciB0aGFuIGluamVjdGlvbiBzdXBwb3J0CisgKiBwcm92aWRlZCBieSB0aGlzIGNsYXNzLgorICogPC9wPgorICogPHA+CisgKiBVc2VyIHJldHVybmVkIHtAY29kZSBJbmplY3Rpb25NYW5hZ2VyfSBvbmx5IGZvciBwdXJwb3NlIG9mIGdldHRpbmcgc2VydmljZXMgKGRvIG5vdCBjaGFuZ2UgdGhlIHN0YXRlIG9mIHRoZSBpbmplY3Rpb24gbWFuYWdlcikuCisgKiA8L3A+CisgKgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqCisgKiBAc2luY2UgMi42CisgKi8KK3B1YmxpYyBjbGFzcyBJbmplY3Rpb25NYW5hZ2VyUHJvdmlkZXIgeworCisgICAgLyoqCisgICAgICogRXh0cmFjdCBhbmQgcmV0dXJuIGluamVjdGlvbiBtYW5hZ2VyIGZyb20ge0BsaW5rIGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvckNvbnRleHQgd3JpdGVySW50ZXJjZXB0b3JDb250ZXh0fS4KKyAgICAgKiBUaGUgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGluamVjdCBjdXN0b20gdHlwZXMgaW50byBhIHtAbGluayBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3J9LgorICAgICAqCisgICAgICogQHBhcmFtIHdyaXRlckludGVyY2VwdG9yQ29udGV4dCBXcml0ZXIgaW50ZXJjZXB0b3IgY29udGV4dC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gaW5qZWN0aW9uIG1hbmFnZXIuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2hlbiB7QGNvZGUgd3JpdGVySW50ZXJjZXB0b3JDb250ZXh0fSBpcyBub3QgYSBkZWZhdWx0CisgICAgICogSmVyc2V5IGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IEplcnNleSBhcyBhcmd1bWVudCBpbiB0aGUKKyAgICAgKiB7QGxpbmsgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yI2Fyb3VuZFdyaXRlVG8oamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yQ29udGV4dCl9IG1ldGhvZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEluamVjdGlvbk1hbmFnZXIgZ2V0SW5qZWN0aW9uTWFuYWdlcihXcml0ZXJJbnRlcmNlcHRvckNvbnRleHQgd3JpdGVySW50ZXJjZXB0b3JDb250ZXh0KSB7CisgICAgICAgIGlmICghKHdyaXRlckludGVyY2VwdG9yQ29udGV4dCBpbnN0YW5jZW9mIEluamVjdGlvbk1hbmFnZXJTdXBwbGllcikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX1NFUlZJQ0VfTE9DQVRPUl9QUk9WSURFUl9JTlNUQU5DRV9GRUFUVVJFX1dSSVRFUl9JTlRFUkNFUFRPUl9DT05URVhUKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlckludGVyY2VwdG9yQ29udGV4dC5nZXRDbGFzcygpLmdldE5hbWUoKSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoKEluamVjdGlvbk1hbmFnZXJTdXBwbGllcikgd3JpdGVySW50ZXJjZXB0b3JDb250ZXh0KS5nZXRJbmplY3Rpb25NYW5hZ2VyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXh0cmFjdCBhbmQgcmV0dXJuIGluamVjdGlvbiBtYW5hZ2VyIGZyb20ge0BsaW5rIGphdmF4LndzLnJzLmV4dC5SZWFkZXJJbnRlcmNlcHRvckNvbnRleHQgcmVhZGVySW50ZXJjZXB0b3JDb250ZXh0fS4KKyAgICAgKiBUaGUgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGluamVjdCBjdXN0b20gdHlwZXMgaW50byBhIHtAbGluayBqYXZheC53cy5ycy5leHQuUmVhZGVySW50ZXJjZXB0b3J9LgorICAgICAqCisgICAgICogQHBhcmFtIHJlYWRlckludGVyY2VwdG9yQ29udGV4dCBSZWFkZXIgaW50ZXJjZXB0b3IgY29udGV4dC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gaW5qZWN0aW9uIG1hbmFnZXIuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2hlbiB7QGNvZGUgcmVhZGVySW50ZXJjZXB0b3JDb250ZXh0fSBpcyBub3QgYSBkZWZhdWx0CisgICAgICogSmVyc2V5IGltcGxlbWVudGF0aW9uIHByb3ZpZGVkIGJ5IEplcnNleSBhcyBhcmd1bWVudCBpbiB0aGUKKyAgICAgKiB7QGxpbmsgamF2YXgud3MucnMuZXh0LlJlYWRlckludGVyY2VwdG9yI2Fyb3VuZFJlYWRGcm9tKGphdmF4LndzLnJzLmV4dC5SZWFkZXJJbnRlcmNlcHRvckNvbnRleHQpfSBtZXRob2QuCisKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEluamVjdGlvbk1hbmFnZXIgZ2V0SW5qZWN0aW9uTWFuYWdlcihSZWFkZXJJbnRlcmNlcHRvckNvbnRleHQgcmVhZGVySW50ZXJjZXB0b3JDb250ZXh0KSB7CisgICAgICAgIGlmICghKHJlYWRlckludGVyY2VwdG9yQ29udGV4dCBpbnN0YW5jZW9mIEluamVjdGlvbk1hbmFnZXJTdXBwbGllcikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX1NFUlZJQ0VfTE9DQVRPUl9QUk9WSURFUl9JTlNUQU5DRV9GRUFUVVJFX1JFQURFUl9JTlRFUkNFUFRPUl9DT05URVhUKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlckludGVyY2VwdG9yQ29udGV4dC5nZXRDbGFzcygpLmdldE5hbWUoKSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoKEluamVjdGlvbk1hbmFnZXJTdXBwbGllcikgcmVhZGVySW50ZXJjZXB0b3JDb250ZXh0KS5nZXRJbmplY3Rpb25NYW5hZ2VyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXh0cmFjdCBhbmQgcmV0dXJuIGluamVjdGlvbiBtYW5hZ2VyIGZyb20ge0BsaW5rIGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQgZmVhdHVyZUNvbnRleHR9LgorICAgICAqIFRoZSBtZXRob2QgY2FuIGJlIHVzZWQgdG8gaW5qZWN0IGN1c3RvbSB0eXBlcyBpbnRvIGEge0BsaW5rIGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZX0uCisgICAgICogPHA+CisgICAgICogTm90ZSB0aGF0IGZlYXR1cmVzIGFyZSB1dGlsaXplZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24gcGhhc2Ugd2hlbiBub3QgYWxsIHByb3ZpZGVycyBhcmUgcmVnaXN0ZXJlZCB5ZXQuCisgICAgICogSXQgaXMgdW5kZWZpbmVkIHdoaWNoIGluamVjdGlvbnMgYXJlIGFscmVhZHkgYXZhaWxhYmxlIGluIHRoaXMgcGhhc2UuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGZlYXR1cmVDb250ZXh0IEZlYXR1cmUgY29udGV4dC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gaW5qZWN0aW9uIG1hbmFnZXIuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2hlbiB7QGNvZGUgd3JpdGVySW50ZXJjZXB0b3JDb250ZXh0fSBpcyBub3QgYSBkZWZhdWx0CisgICAgICogSmVyc2V5IGluc3RhbmNlIHByb3ZpZGVkIGJ5IEplcnNleQorICAgICAqIGluIHtAbGluayBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmUjY29uZmlndXJlKGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQpfSBtZXRob2QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBJbmplY3Rpb25NYW5hZ2VyIGdldEluamVjdGlvbk1hbmFnZXIoRmVhdHVyZUNvbnRleHQgZmVhdHVyZUNvbnRleHQpIHsKKyAgICAgICAgaWYgKCEoZmVhdHVyZUNvbnRleHQgaW5zdGFuY2VvZiBJbmplY3Rpb25NYW5hZ2VyU3VwcGxpZXIpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9TRVJWSUNFX0xPQ0FUT1JfUFJPVklERVJfSU5TVEFOQ0VfRkVBVFVSRV9DT05URVhUKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVDb250ZXh0LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICgoSW5qZWN0aW9uTWFuYWdlclN1cHBsaWVyKSBmZWF0dXJlQ29udGV4dCkuZ2V0SW5qZWN0aW9uTWFuYWdlcigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvSmVyc2V5UHJpb3JpdGllcy5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9KZXJzZXlQcmlvcml0aWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM1YTc2NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvSmVyc2V5UHJpb3JpdGllcy5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcmlvcml0aWVzOworCisvKioKKyAqIEJ1aWx0LWluIEplcnNleS1zcGVjaWZpYyBwcmlvcml0eSBjb25zdGFudHMgdG8gYmUgdXNlZCBhbG9uZyB3aXRoIHtAbGluayBqYXZheC53cy5ycy5Qcmlvcml0aWVzfSB3aGVyZSBmaW5lci1ncmFpbmVkCisgKiBjYXRlZ29yaXphdGlvbiBpcyByZXF1aXJlZC4KKyAqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXlQcmlvcml0aWVzIHsKKworICAgIHByaXZhdGUgSmVyc2V5UHJpb3JpdGllcygpIHsKKyAgICAgICAgLy8gcHJldmVudHMgaW5zdGFudGlhdGlvbgorICAgIH0KKworICAgIC8qKgorICAgICAqIFByaW9yaXR5IGZvciBjb21wb25lbnRzIHRoYXQgaGF2ZSB0byBiZSBjYWxsZWQgQUZURVIgbWVzc2FnZSBlbmNvZGVycy9kZWNvZGVycyBmaWx0ZXJzL2ludGVyY2VwdG9ycy4KKyAgICAgKiBUaGUgY29uc3RhbnQgaGFzIHRvIGJlIGhpZ2hlciB0aGFuIHtAbGluayBqYXZheC53cy5ycy5Qcmlvcml0aWVzI0VOVElUWV9DT0RFUn0gaW4gb3JkZXIgdG8gZm9yY2UgdGhlCisgICAgICogcHJvY2Vzc2luZyBhZnRlciB0aGUgY29tcG9uZW50cyB3aXRoIHtAY29kZSBQcmlvcml0aWVzLkVOVElUWV9DT0RFUn0gYXJlIHByb2Nlc3NlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQT1NUX0VOVElUWV9DT0RFUiA9IFByaW9yaXRpZXMuRU5USVRZX0NPREVSICsgMTAwOworfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9TZXZlcml0eS5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9TZXZlcml0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNDJjMTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L1NldmVyaXR5LmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleTsKKworLyoqCisgKiBDb21tb24gc2V2ZXJpdHkuCisgKi8KK3B1YmxpYyBlbnVtIFNldmVyaXR5IHsKKyAgICAvKioKKyAgICAgKiBGYXRhbC4KKyAgICAgKi8KKyAgICBGQVRBTCwKKyAgICAvKioKKyAgICAgKiBXYXJuaW5nLgorICAgICAqLworICAgIFdBUk5JTkcsCisgICAgLyoqCisgICAgICogSGludC4KKyAgICAgKi8KKyAgICBISU5UCit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L1NzbENvbmZpZ3VyYXRvci5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9Tc2xDb25maWd1cmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2NhMjMyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9Tc2xDb25maWd1cmF0b3IuamF2YQpAQCAtMCwwICsxLDkxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAwNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleTsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleU1hbmFnZW1lbnRFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlTdG9yZTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LktleVN0b3JlRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoUHJvdmlkZXJFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5VbnJlY292ZXJhYmxlS2V5RXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4Lm5ldC5zc2wuS2V5TWFuYWdlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgubmV0LnNzbC5TU0xDb250ZXh0OworaW1wb3J0IGphdmF4Lm5ldC5zc2wuVHJ1c3RNYW5hZ2VyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUHJvcGVydGllc0hlbHBlcjsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzLCB3aGljaCBoZWxwcyB0byBjb25maWd1cmUge0BsaW5rIFNTTENvbnRleHR9IGluc3RhbmNlcy4KKyAqCisgKiBGb3IgZXhhbXBsZToKKyAqIDxwcmU+CisgKiBTc2xDb25maWd1cmF0b3Igc3NsQ29uZmlnID0gU3NsQ29uZmlndXJhdG9yLm5ld0luc3RhbmNlKCkKKyAqICAgIC50cnVzdFN0b3JlRmlsZSgidHJ1c3RzdG9yZS5qa3MiKQorICogICAgLnRydXN0U3RvcmVQYXNzd29yZCgiYXNkZmdoIikKKyAqICAgIC50cnVzdFN0b3JlVHlwZSgiSktTIikKKyAqICAgIC50cnVzdE1hbmFnZXJGYWN0b3J5QWxnb3JpdGhtKCJQS0lYIikKKyAqCisgKiAgICAua2V5U3RvcmVGaWxlKCJrZXlzdG9yZS5qa3MiKQorICogICAgLmtleVBhc3N3b3JkKCJhc2RmZ2giKQorICogICAgLmtleVN0b3JlVHlwZSgiSktTIikKKyAqICAgIC5rZXlNYW5hZ2VyRmFjdG9yeUFsZ29yaXRobSgiU3VuWDUwOSIpCisgKiAgICAua2V5U3RvcmVQcm92aWRlcigiU3VuSlNTRSIpCisgKgorICogICAgLnNlY3VyaXR5UHJvdG9jb2woIlNTTCIpOworICoKKyAqIFNTTENvbnRleHQgc3NsQ29udGV4dCA9IHNzbENvbmZpZy5jcmVhdGVTU0xDb250ZXh0KCk7CisgKiA8L3ByZT4KKyAqCisgKiBAYXV0aG9yIEFsZXhleSBTdGFzaG9rCisgKiBAYXV0aG9yIEh1YmVydCBJd2FuaXVrCisgKiBAYXV0aG9yIEJydW5vIEhhcmJ1bG90CisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitAU3VwcHJlc3NXYXJuaW5ncygiVW51c2VkRGVjbGFyYXRpb24iKQorcHVibGljIGZpbmFsIGNsYXNzIFNzbENvbmZpZ3VyYXRvciB7CisKKyAgICAvKioKKyAgICAgKiA8ZW0+VHJ1c3Q8L2VtPiBzdG9yZSBwcm92aWRlciBuYW1lLgorICAgICAqCisgICAgICogVGhlIHZhbHVlIE1VU1QgYmUgYSB7QGNvZGUgU3RyaW5nfSByZXByZXNlbnRpbmcgdGhlIG5hbWUgb2YgYSA8ZW0+dHJ1c3Q8L2VtPiBzdG9yZSBwcm92aWRlci4KKyAgICAgKiA8cD4KKyAgICAgKiBObyBkZWZhdWx0IHZhbHVlIGlzIHNldC4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaXMgPHR0PntAdmFsdWV9PC90dD4uCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSVVNUX1NUT1JFX1BST1ZJREVSID0gImphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZVByb3ZpZGVyIjsKKyAgICAvKioKKyAgICAgKiA8ZW0+S2V5PC9lbT4gc3RvcmUgcHJvdmlkZXIgbmFtZS4KKyAgICAgKgorICAgICAqIFRoZSB2YWx1ZSBNVVNUIGJlIGEge0Bjb2RlIFN0cmluZ30gcmVwcmVzZW50aW5nIHRoZSBuYW1lIG9mIGEgPGVtPnRydXN0PC9lbT4gc3RvcmUgcHJvdmlkZXIuCisgICAgICogPHA+CisgICAgICogTm8gZGVmYXVsdCB2YWx1ZSBpcyBzZXQuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDx0dD57QHZhbHVlfTwvdHQ+LgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU1RPUkVfUFJPVklERVIgPSAiamF2YXgubmV0LnNzbC5rZXlTdG9yZVByb3ZpZGVyIjsKKyAgICAvKioKKyAgICAgKiA8ZW0+VHJ1c3Q8L2VtPiBzdG9yZSBmaWxlIG5hbWUuCisgICAgICoKKyAgICAgKiBUaGUgdmFsdWUgTVVTVCBiZSBhIHtAY29kZSBTdHJpbmd9IHJlcHJlc2VudGluZyB0aGUgbmFtZSBvZiBhIDxlbT50cnVzdDwvZW0+IHN0b3JlIGZpbGUuCisgICAgICogPHA+CisgICAgICogTm8gZGVmYXVsdCB2YWx1ZSBpcyBzZXQuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDx0dD57QHZhbHVlfTwvdHQ+LgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUlVTVF9TVE9SRV9GSUxFID0gImphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZSI7CisgICAgLyoqCisgICAgICogPGVtPktleTwvZW0+IHN0b3JlIGZpbGUgbmFtZS4KKyAgICAgKgorICAgICAqIFRoZSB2YWx1ZSBNVVNUIGJlIGEge0Bjb2RlIFN0cmluZ30gcmVwcmVzZW50aW5nIHRoZSBuYW1lIG9mIGEgPGVtPmtleTwvZW0+IHN0b3JlIGZpbGUuCisgICAgICogPHA+CisgICAgICogTm8gZGVmYXVsdCB2YWx1ZSBpcyBzZXQuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDx0dD57QHZhbHVlfTwvdHQ+LgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU1RPUkVfRklMRSA9ICJqYXZheC5uZXQuc3NsLmtleVN0b3JlIjsKKyAgICAvKioKKyAgICAgKiA8ZW0+VHJ1c3Q8L2VtPiBzdG9yZSBmaWxlIHBhc3N3b3JkIC0gdGhlIHBhc3N3b3JkIHVzZWQgdG8gdW5sb2NrIHRoZSA8ZW0+dHJ1c3Q8L2VtPiBzdG9yZSBmaWxlLgorICAgICAqCisgICAgICogVGhlIHZhbHVlIE1VU1QgYmUgYSB7QGNvZGUgU3RyaW5nfSByZXByZXNlbnRpbmcgdGhlIDxlbT50cnVzdDwvZW0+IHN0b3JlIGZpbGUgcGFzc3dvcmQuCisgICAgICogPHA+CisgICAgICogTm8gZGVmYXVsdCB2YWx1ZSBpcyBzZXQuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDx0dD57QHZhbHVlfTwvdHQ+LgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUlVTVF9TVE9SRV9QQVNTV09SRCA9ICJqYXZheC5uZXQuc3NsLnRydXN0U3RvcmVQYXNzd29yZCI7CisgICAgLyoqCisgICAgICogPGVtPktleTwvZW0+IHN0b3JlIGZpbGUgcGFzc3dvcmQgLSB0aGUgcGFzc3dvcmQgdXNlZCB0byB1bmxvY2sgdGhlIDxlbT50cnVzdDwvZW0+IHN0b3JlIGZpbGUuCisgICAgICoKKyAgICAgKiBUaGUgdmFsdWUgTVVTVCBiZSBhIHtAY29kZSBTdHJpbmd9IHJlcHJlc2VudGluZyB0aGUgPGVtPmtleTwvZW0+IHN0b3JlIGZpbGUgcGFzc3dvcmQuCisgICAgICogPHA+CisgICAgICogTm8gZGVmYXVsdCB2YWx1ZSBpcyBzZXQuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDx0dD57QHZhbHVlfTwvdHQ+LgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU1RPUkVfUEFTU1dPUkQgPSAiamF2YXgubmV0LnNzbC5rZXlTdG9yZVBhc3N3b3JkIjsKKyAgICAvKioKKyAgICAgKiA8ZW0+VHJ1c3Q8L2VtPiBzdG9yZSB0eXBlIChzZWUge0BsaW5rIGphdmEuc2VjdXJpdHkuS2V5U3RvcmUjZ2V0VHlwZSgpfSBmb3IgbW9yZSBpbmZvKS4KKyAgICAgKgorICAgICAqIFRoZSB2YWx1ZSBNVVNUIGJlIGEge0Bjb2RlIFN0cmluZ30gcmVwcmVzZW50aW5nIHRoZSA8ZW0+dHJ1c3Q8L2VtPiBzdG9yZSB0eXBlIG5hbWUuCisgICAgICogPHA+CisgICAgICogTm8gZGVmYXVsdCB2YWx1ZSBpcyBzZXQuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDx0dD57QHZhbHVlfTwvdHQ+LgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBUUlVTVF9TVE9SRV9UWVBFID0gImphdmF4Lm5ldC5zc2wudHJ1c3RTdG9yZVR5cGUiOworICAgIC8qKgorICAgICAqIDxlbT5LZXk8L2VtPiBzdG9yZSB0eXBlIChzZWUge0BsaW5rIGphdmEuc2VjdXJpdHkuS2V5U3RvcmUjZ2V0VHlwZSgpfSBmb3IgbW9yZSBpbmZvKS4KKyAgICAgKgorICAgICAqIFRoZSB2YWx1ZSBNVVNUIGJlIGEge0Bjb2RlIFN0cmluZ30gcmVwcmVzZW50aW5nIHRoZSA8ZW0+a2V5PC9lbT4gc3RvcmUgdHlwZSBuYW1lLgorICAgICAqIDxwPgorICAgICAqIE5vIGRlZmF1bHQgdmFsdWUgaXMgc2V0LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NUT1JFX1RZUEUgPSAiamF2YXgubmV0LnNzbC5rZXlTdG9yZVR5cGUiOworICAgIC8qKgorICAgICAqIDxlbT5LZXk8L2VtPiBtYW5hZ2VyIGZhY3RvcnkgYWxnb3JpdGhtIG5hbWUuCisgICAgICoKKyAgICAgKiBUaGUgdmFsdWUgTVVTVCBiZSBhIHtAY29kZSBTdHJpbmd9IHJlcHJlc2VudGluZyB0aGUgPGVtPmtleTwvZW0+IG1hbmFnZXIgZmFjdG9yeSBhbGdvcml0aG0gbmFtZS4KKyAgICAgKiA8cD4KKyAgICAgKiBObyBkZWZhdWx0IHZhbHVlIGlzIHNldC4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaXMgPHR0PntAdmFsdWV9PC90dD4uCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9NQU5BR0VSX0ZBQ1RPUllfQUxHT1JJVEhNID0gInNzbC5rZXlNYW5hZ2VyRmFjdG9yeS5hbGdvcml0aG0iOworICAgIC8qKgorICAgICAqIDxlbT5LZXk8L2VtPiBtYW5hZ2VyIGZhY3RvcnkgcHJvdmlkZXIgbmFtZS4KKyAgICAgKgorICAgICAqIFRoZSB2YWx1ZSBNVVNUIGJlIGEge0Bjb2RlIFN0cmluZ30gcmVwcmVzZW50aW5nIHRoZSA8ZW0+a2V5PC9lbT4gbWFuYWdlciBmYWN0b3J5IHByb3ZpZGVyIG5hbWUuCisgICAgICogPHA+CisgICAgICogTm8gZGVmYXVsdCB2YWx1ZSBpcyBzZXQuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDx0dD57QHZhbHVlfTwvdHQ+LgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTUFOQUdFUl9GQUNUT1JZX1BST1ZJREVSID0gInNzbC5rZXlNYW5hZ2VyRmFjdG9yeS5wcm92aWRlciI7CisgICAgLyoqCisgICAgICogPGVtPlRydXN0PC9lbT4gbWFuYWdlciBmYWN0b3J5IGFsZ29yaXRobSBuYW1lLgorICAgICAqCisgICAgICogVGhlIHZhbHVlIE1VU1QgYmUgYSB7QGNvZGUgU3RyaW5nfSByZXByZXNlbnRpbmcgdGhlIDxlbT50cnVzdDwvZW0+IG1hbmFnZXIgZmFjdG9yeSBhbGdvcml0aG0gbmFtZS4KKyAgICAgKiA8cD4KKyAgICAgKiBObyBkZWZhdWx0IHZhbHVlIGlzIHNldC4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaXMgPHR0PntAdmFsdWV9PC90dD4uCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSVVNUX01BTkFHRVJfRkFDVE9SWV9BTEdPUklUSE0gPSAic3NsLnRydXN0TWFuYWdlckZhY3RvcnkuYWxnb3JpdGhtIjsKKyAgICAvKioKKyAgICAgKiA8ZW0+VHJ1c3Q8L2VtPiBtYW5hZ2VyIGZhY3RvcnkgcHJvdmlkZXIgbmFtZS4KKyAgICAgKgorICAgICAqIFRoZSB2YWx1ZSBNVVNUIGJlIGEge0Bjb2RlIFN0cmluZ30gcmVwcmVzZW50aW5nIHRoZSA8ZW0+dHJ1c3Q8L2VtPiBtYW5hZ2VyIGZhY3RvcnkgcHJvdmlkZXIgbmFtZS4KKyAgICAgKiA8cD4KKyAgICAgKiBObyBkZWZhdWx0IHZhbHVlIGlzIHNldC4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaXMgPHR0PntAdmFsdWV9PC90dD4uCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSVVNUX01BTkFHRVJfRkFDVE9SWV9QUk9WSURFUiA9ICJzc2wudHJ1c3RNYW5hZ2VyRmFjdG9yeS5wcm92aWRlciI7CisgICAgLyoqCisgICAgICogRGVmYXVsdCBTU0wgY29uZmlndXJhdGlvbiB0aGF0IGlzIHVzZWQgdG8gY3JlYXRlIGRlZmF1bHQgU1NMIGNvbnRleHQgaW5zdGFuY2VzIHRoYXQgZG8gbm90IHRha2UgaW50bworICAgICAqIGFjY291bnQgc3lzdGVtIHByb3BlcnRpZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3NsQ29uZmlndXJhdG9yIERFRkFVTFRfQ09ORklHX05PX1BST1BTID0gbmV3IFNzbENvbmZpZ3VyYXRvcihmYWxzZSk7CisgICAgLyoqCisgICAgICogTG9nZ2VyLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFNzbENvbmZpZ3VyYXRvci5jbGFzcy5nZXROYW1lKCkpOworCisgICAgcHJpdmF0ZSBLZXlTdG9yZSBrZXlTdG9yZTsKKyAgICBwcml2YXRlIEtleVN0b3JlIHRydXN0U3RvcmU7CisKKyAgICBwcml2YXRlIFN0cmluZyB0cnVzdFN0b3JlUHJvdmlkZXI7CisgICAgcHJpdmF0ZSBTdHJpbmcga2V5U3RvcmVQcm92aWRlcjsKKworICAgIHByaXZhdGUgU3RyaW5nIHRydXN0U3RvcmVUeXBlOworICAgIHByaXZhdGUgU3RyaW5nIGtleVN0b3JlVHlwZTsKKworICAgIHByaXZhdGUgY2hhcltdIHRydXN0U3RvcmVQYXNzOworICAgIHByaXZhdGUgY2hhcltdIGtleVN0b3JlUGFzczsKKyAgICBwcml2YXRlIGNoYXJbXSBrZXlQYXNzOworCisgICAgcHJpdmF0ZSBTdHJpbmcgdHJ1c3RTdG9yZUZpbGU7CisgICAgcHJpdmF0ZSBTdHJpbmcga2V5U3RvcmVGaWxlOworCisgICAgcHJpdmF0ZSBieXRlW10gdHJ1c3RTdG9yZUJ5dGVzOworICAgIHByaXZhdGUgYnl0ZVtdIGtleVN0b3JlQnl0ZXM7CisKKyAgICBwcml2YXRlIFN0cmluZyB0cnVzdE1hbmFnZXJGYWN0b3J5QWxnb3JpdGhtOworICAgIHByaXZhdGUgU3RyaW5nIGtleU1hbmFnZXJGYWN0b3J5QWxnb3JpdGhtOworCisgICAgcHJpdmF0ZSBTdHJpbmcgdHJ1c3RNYW5hZ2VyRmFjdG9yeVByb3ZpZGVyOworICAgIHByaXZhdGUgU3RyaW5nIGtleU1hbmFnZXJGYWN0b3J5UHJvdmlkZXI7CisKKyAgICBwcml2YXRlIFN0cmluZyBzZWN1cml0eVByb3RvY29sID0gIlRMUyI7CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBuZXcgaW5zdGFuY2Ugb2YgYSB7QGxpbmsgU1NMQ29udGV4dH0gY29uZmlndXJlZCB1c2luZyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MuCisgICAgICoKKyAgICAgKiBUaGUgZGVmYXVsdCBTU0wgY29uZmlndXJhdGlvbiBpcyBpbml0aWFsaXplZCBmcm9tIHN5c3RlbSBwcm9wZXJ0aWVzLiBUaGlzIG1ldGhvZCBpcyBhIHNob3J0Y3V0CisgICAgICogZm9yIHtAbGluayAjZ2V0RGVmYXVsdENvbnRleHQoYm9vbGVhbikgZ2V0RGVmYXVsdENvbnRleHQodHJ1ZSl9LgorICAgICAqCisgICAgICogQHJldHVybiBuZXcgaW5zdGFuY2Ugb2YgYSBkZWZhdWx0IFNTTCBjb250ZXh0IGluaXRpYWxpemVkIGZyb20gc3lzdGVtIHByb3BlcnRpZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTU0xDb250ZXh0IGdldERlZmF1bHRDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdENvbnRleHQodHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgbmV3IGluc3RhbmNlIG9mIGEge0BsaW5rIFNTTENvbnRleHR9IGNvbmZpZ3VyZWQgdXNpbmcgZGVmYXVsdCBjb25maWd1cmF0aW9uIHNldHRpbmdzLgorICAgICAqCisgICAgICogSWYge0Bjb2RlIHJlYWRTeXN0ZW1Qcm9wZXJ0aWVzfSBwYXJhbWV0ZXIgaXMgc2V0IHRvIHtAY29kZSB0cnVlfSwgdGhlIGRlZmF1bHQgU1NMIGNvbmZpZ3VyYXRpb24KKyAgICAgKiBpcyBpbml0aWFsaXplZCBmcm9tIHN5c3RlbSBwcm9wZXJ0aWVzLgorICAgICAqCisgICAgICogQHBhcmFtIHJlYWRTeXN0ZW1Qcm9wZXJ0aWVzIGlmIHtAY29kZSB0cnVlfSwgdGhlIGRlZmF1bHQgU1NMIGNvbnRleHQgd2lsbCBiZSBpbml0aWFsaXplZCB1c2luZworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW0gcHJvcGVydGllcy4KKyAgICAgKiBAcmV0dXJuIG5ldyBpbnN0YW5jZSBvZiBhIGRlZmF1bHQgU1NMIGNvbnRleHQgaW5pdGlhbGl6ZWQgZnJvbSBzeXN0ZW0gcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNTTENvbnRleHQgZ2V0RGVmYXVsdENvbnRleHQoYm9vbGVhbiByZWFkU3lzdGVtUHJvcGVydGllcykgeworICAgICAgICBpZiAocmVhZFN5c3RlbVByb3BlcnRpZXMpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3NsQ29uZmlndXJhdG9yKHRydWUpLmNyZWF0ZVNTTENvbnRleHQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBERUZBVUxUX0NPTkZJR19OT19QUk9QUy5jcmVhdGVTU0xDb250ZXh0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBuZXcgJiBpbml0aWFsaXplZCBTU0wgY29uZmlndXJhdG9yIGluc3RhbmNlLgorICAgICAqCisgICAgICogVGhlIGluc3RhbmNlIHtAbGluayAjcmV0cmlldmUoamF2YS51dGlsLlByb3BlcnRpZXMpIHJldHJpZXZlc30gdGhlIGluaXRpYWwgY29uZmlndXJhdGlvbiBmcm9tCisgICAgICoge0BsaW5rIFN5c3RlbSNnZXRQcm9wZXJ0aWVzKCkgc3lzdGVtIHByb3BlcnRpZXN9LgorICAgICAqCisgICAgICogQHJldHVybiBuZXcgJiBpbml0aWFsaXplZCBTU0wgY29uZmlndXJhdG9yIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3NsQ29uZmlndXJhdG9yIG5ld0luc3RhbmNlKCkgeworICAgICAgICByZXR1cm4gbmV3IFNzbENvbmZpZ3VyYXRvcihmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgbmV3IFNTTCBjb25maWd1cmF0b3IgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVhZFN5c3RlbVByb3BlcnRpZXMgaWYge0Bjb2RlIHRydWV9LCB7QGxpbmsgI3JldHJpZXZlKGphdmEudXRpbC5Qcm9wZXJ0aWVzKSBSZXRyaWV2ZXN9CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbml0aWFsIGNvbmZpZ3VyYXRpb24gZnJvbSB7QGxpbmsgU3lzdGVtI2dldFByb3BlcnRpZXMoKX0sCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSB0aGUgaW5zdGFudGlhdGVkIGNvbmZpZ3VyYXRvciB3aWxsIGJlIGVtcHR5LgorICAgICAqIEByZXR1cm4gbmV3IFNTTCBjb25maWd1cmF0b3IgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTc2xDb25maWd1cmF0b3IgbmV3SW5zdGFuY2UoYm9vbGVhbiByZWFkU3lzdGVtUHJvcGVydGllcykgeworICAgICAgICByZXR1cm4gbmV3IFNzbENvbmZpZ3VyYXRvcihyZWFkU3lzdGVtUHJvcGVydGllcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTc2xDb25maWd1cmF0b3IoYm9vbGVhbiByZWFkU3lzdGVtUHJvcGVydGllcykgeworICAgICAgICBpZiAocmVhZFN5c3RlbVByb3BlcnRpZXMpIHsKKyAgICAgICAgICAgIHJldHJpZXZlKEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKFByb3BlcnRpZXNIZWxwZXIuZ2V0U3lzdGVtUHJvcGVydGllcygpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFNzbENvbmZpZ3VyYXRvcihTc2xDb25maWd1cmF0b3IgdGhhdCkgeworICAgICAgICB0aGlzLmtleVN0b3JlID0gdGhhdC5rZXlTdG9yZTsKKyAgICAgICAgdGhpcy50cnVzdFN0b3JlID0gdGhhdC50cnVzdFN0b3JlOworICAgICAgICB0aGlzLnRydXN0U3RvcmVQcm92aWRlciA9IHRoYXQudHJ1c3RTdG9yZVByb3ZpZGVyOworICAgICAgICB0aGlzLmtleVN0b3JlUHJvdmlkZXIgPSB0aGF0LmtleVN0b3JlUHJvdmlkZXI7CisgICAgICAgIHRoaXMudHJ1c3RTdG9yZVR5cGUgPSB0aGF0LnRydXN0U3RvcmVUeXBlOworICAgICAgICB0aGlzLmtleVN0b3JlVHlwZSA9IHRoYXQua2V5U3RvcmVUeXBlOworICAgICAgICB0aGlzLnRydXN0U3RvcmVQYXNzID0gdGhhdC50cnVzdFN0b3JlUGFzczsKKyAgICAgICAgdGhpcy5rZXlTdG9yZVBhc3MgPSB0aGF0LmtleVN0b3JlUGFzczsKKyAgICAgICAgdGhpcy5rZXlQYXNzID0gdGhhdC5rZXlQYXNzOworICAgICAgICB0aGlzLnRydXN0U3RvcmVGaWxlID0gdGhhdC50cnVzdFN0b3JlRmlsZTsKKyAgICAgICAgdGhpcy5rZXlTdG9yZUZpbGUgPSB0aGF0LmtleVN0b3JlRmlsZTsKKyAgICAgICAgdGhpcy50cnVzdFN0b3JlQnl0ZXMgPSB0aGF0LnRydXN0U3RvcmVCeXRlczsKKyAgICAgICAgdGhpcy5rZXlTdG9yZUJ5dGVzID0gdGhhdC5rZXlTdG9yZUJ5dGVzOworICAgICAgICB0aGlzLnRydXN0TWFuYWdlckZhY3RvcnlBbGdvcml0aG0gPSB0aGF0LnRydXN0TWFuYWdlckZhY3RvcnlBbGdvcml0aG07CisgICAgICAgIHRoaXMua2V5TWFuYWdlckZhY3RvcnlBbGdvcml0aG0gPSB0aGF0LmtleU1hbmFnZXJGYWN0b3J5QWxnb3JpdGhtOworICAgICAgICB0aGlzLnRydXN0TWFuYWdlckZhY3RvcnlQcm92aWRlciA9IHRoYXQudHJ1c3RNYW5hZ2VyRmFjdG9yeVByb3ZpZGVyOworICAgICAgICB0aGlzLmtleU1hbmFnZXJGYWN0b3J5UHJvdmlkZXIgPSB0aGF0LmtleU1hbmFnZXJGYWN0b3J5UHJvdmlkZXI7CisgICAgICAgIHRoaXMuc2VjdXJpdHlQcm90b2NvbCA9IHRoYXQuc2VjdXJpdHlQcm90b2NvbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBjb3B5IG9mIHRoZSBjdXJyZW50IFNTTCBjb25maWd1cmF0b3IgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGNvcHkgb2YgdGhlIGN1cnJlbnQgU1NMIGNvbmZpZ3VyYXRvciBpbnN0YW5jZQorICAgICAqLworICAgIHB1YmxpYyBTc2xDb25maWd1cmF0b3IgY29weSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTc2xDb25maWd1cmF0b3IodGhpcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSA8ZW0+dHJ1c3Q8L2VtPiBzdG9yZSBwcm92aWRlciBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIHRydXN0U3RvcmVQcm92aWRlciA8ZW0+dHJ1c3Q8L2VtPiBzdG9yZSBwcm92aWRlciB0byBzZXQuCisgICAgICogQHJldHVybiB1cGRhdGVkIFNTTCBjb25maWd1cmF0b3IgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIFNzbENvbmZpZ3VyYXRvciB0cnVzdFN0b3JlUHJvdmlkZXIoU3RyaW5nIHRydXN0U3RvcmVQcm92aWRlcikgeworICAgICAgICB0aGlzLnRydXN0U3RvcmVQcm92aWRlciA9IHRydXN0U3RvcmVQcm92aWRlcjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSA8ZW0+a2V5PC9lbT4gc3RvcmUgcHJvdmlkZXIgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXlTdG9yZVByb3ZpZGVyIDxlbT5rZXk8L2VtPiBzdG9yZSBwcm92aWRlciB0byBzZXQuCisgICAgICogQHJldHVybiB1cGRhdGVkIFNTTCBjb25maWd1cmF0b3IgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIFNzbENvbmZpZ3VyYXRvciBrZXlTdG9yZVByb3ZpZGVyKFN0cmluZyBrZXlTdG9yZVByb3ZpZGVyKSB7CisgICAgICAgIHRoaXMua2V5U3RvcmVQcm92aWRlciA9IGtleVN0b3JlUHJvdmlkZXI7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdHlwZSBvZiA8ZW0+dHJ1c3Q8L2VtPiBzdG9yZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0cnVzdFN0b3JlVHlwZSB0eXBlIG9mIDxlbT50cnVzdDwvZW0+IHN0b3JlIHRvIHNldC4KKyAgICAgKiBAcmV0dXJuIHVwZGF0ZWQgU1NMIGNvbmZpZ3VyYXRvciBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3NsQ29uZmlndXJhdG9yIHRydXN0U3RvcmVUeXBlKFN0cmluZyB0cnVzdFN0b3JlVHlwZSkgeworICAgICAgICB0aGlzLnRydXN0U3RvcmVUeXBlID0gdHJ1c3RTdG9yZVR5cGU7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdHlwZSBvZiA8ZW0+a2V5PC9lbT4gc3RvcmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5U3RvcmVUeXBlIHR5cGUgb2YgPGVtPmtleTwvZW0+IHN0b3JlIHRvIHNldC4KKyAgICAgKiBAcmV0dXJuIHVwZGF0ZWQgU1NMIGNvbmZpZ3VyYXRvciBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3NsQ29uZmlndXJhdG9yIGtleVN0b3JlVHlwZShTdHJpbmcga2V5U3RvcmVUeXBlKSB7CisgICAgICAgIHRoaXMua2V5U3RvcmVUeXBlID0ga2V5U3RvcmVUeXBlOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHBhc3N3b3JkIG9mIDxlbT50cnVzdDwvZW0+IHN0b3JlLgorICAgICAqCisgICAgICogQHBhcmFtIHBhc3N3b3JkIHBhc3N3b3JkIG9mIDxlbT50cnVzdDwvZW0+IHN0b3JlIHRvIHNldC4KKyAgICAgKiBAcmV0dXJuIHVwZGF0ZWQgU1NMIGNvbmZpZ3VyYXRvciBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3NsQ29uZmlndXJhdG9yIHRydXN0U3RvcmVQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpIHsKKyAgICAgICAgdGhpcy50cnVzdFN0b3JlUGFzcyA9IHBhc3N3b3JkLnRvQ2hhckFycmF5KCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcGFzc3dvcmQgb2YgPGVtPmtleTwvZW0+IHN0b3JlLgorICAgICAqCisgICAgICogQHBhcmFtIHBhc3N3b3JkIHBhc3N3b3JkIG9mIDxlbT5rZXk8L2VtPiBzdG9yZSB0byBzZXQuCisgICAgICogQHJldHVybiB1cGRhdGVkIFNTTCBjb25maWd1cmF0b3IgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIFNzbENvbmZpZ3VyYXRvciBrZXlTdG9yZVBhc3N3b3JkKFN0cmluZyBwYXNzd29yZCkgeworICAgICAgICB0aGlzLmtleVN0b3JlUGFzcyA9IHBhc3N3b3JkLnRvQ2hhckFycmF5KCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcGFzc3dvcmQgb2YgPGVtPmtleTwvZW0+IHN0b3JlLgorICAgICAqCisgICAgICogQHBhcmFtIHBhc3N3b3JkIHBhc3N3b3JkIG9mIDxlbT5rZXk8L2VtPiBzdG9yZSB0byBzZXQuCisgICAgICogQHJldHVybiB1cGRhdGVkIFNTTCBjb25maWd1cmF0b3IgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIFNzbENvbmZpZ3VyYXRvciBrZXlTdG9yZVBhc3N3b3JkKGNoYXJbXSBwYXNzd29yZCkgeworICAgICAgICB0aGlzLmtleVN0b3JlUGFzcyA9IHBhc3N3b3JkLmNsb25lKCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcGFzc3dvcmQgb2YgdGhlIGtleSBpbiB0aGUgPGVtPmtleTwvZW0+IHN0b3JlLgorICAgICAqCisgICAgICogQHBhcmFtIHBhc3N3b3JkIHBhc3N3b3JkIG9mIDxlbT5rZXk8L2VtPiB0byBzZXQuCisgICAgICogQHJldHVybiB1cGRhdGVkIFNTTCBjb25maWd1cmF0b3IgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIFNzbENvbmZpZ3VyYXRvciBrZXlQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpIHsKKyAgICAgICAgdGhpcy5rZXlQYXNzID0gcGFzc3dvcmQudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwYXNzd29yZCBvZiB0aGUga2V5IGluIHRoZSA8ZW0+a2V5PC9lbT4gc3RvcmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFzc3dvcmQgcGFzc3dvcmQgb2YgPGVtPmtleTwvZW0+IHRvIHNldC4KKyAgICAgKiBAcmV0dXJuIHVwZGF0ZWQgU1NMIGNvbmZpZ3VyYXRvciBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3NsQ29uZmlndXJhdG9yIGtleVBhc3N3b3JkKGNoYXJbXSBwYXNzd29yZCkgeworICAgICAgICB0aGlzLmtleVBhc3MgPSBwYXNzd29yZC5jbG9uZSgpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIDxlbT50cnVzdDwvZW0+IHN0b3JlIGZpbGUgbmFtZS4KKyAgICAgKiA8cD4KKyAgICAgKiBTZXR0aW5nIGEgdHJ1c3Qgc3RvcmUgaW5zdGFuY2UgcmVzZXRzIGFueSB7QGxpbmsgI3RydXN0U3RvcmUoamF2YS5zZWN1cml0eS5LZXlTdG9yZSkgdHJ1c3Qgc3RvcmUgaW5zdGFuY2V9CisgICAgICogb3Ige0BsaW5rICN0cnVzdFN0b3JlQnl0ZXMoYnl0ZVtdKSB0cnVzdCBzdG9yZSBwYXlsb2FkfSB2YWx1ZSBwcmV2aW91c2x5IHNldC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZU5hbWUge0BsaW5rIGphdmEuaW8uRmlsZSBmaWxlfSBuYW1lIG9mIHRoZSA8ZW0+dHJ1c3Q8L2VtPiBzdG9yZS4KKyAgICAgKiBAcmV0dXJuIHVwZGF0ZWQgU1NMIGNvbmZpZ3VyYXRvciBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3NsQ29uZmlndXJhdG9yIHRydXN0U3RvcmVGaWxlKFN0cmluZyBmaWxlTmFtZSkgeworICAgICAgICB0aGlzLnRydXN0U3RvcmVGaWxlID0gZmlsZU5hbWU7CisgICAgICAgIHRoaXMudHJ1c3RTdG9yZUJ5dGVzID0gbnVsbDsKKyAgICAgICAgdGhpcy50cnVzdFN0b3JlID0gbnVsbDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSA8ZW0+dHJ1c3Q8L2VtPiBzdG9yZSBwYXlsb2FkIGFzIGJ5dGUgYXJyYXkuCisgICAgICogPHA+CisgICAgICogU2V0dGluZyBhIHRydXN0IHN0b3JlIGluc3RhbmNlIHJlc2V0cyBhbnkge0BsaW5rICN0cnVzdFN0b3JlRmlsZShTdHJpbmcpIHRydXN0IHN0b3JlIGZpbGV9CisgICAgICogb3Ige0BsaW5rICN0cnVzdFN0b3JlKGphdmEuc2VjdXJpdHkuS2V5U3RvcmUpIHRydXN0IHN0b3JlIGluc3RhbmNlfSB2YWx1ZSBwcmV2aW91c2x5IHNldC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF5bG9hZCA8ZW0+dHJ1c3Q8L2VtPiBzdG9yZSBwYXlsb2FkLgorICAgICAqIEByZXR1cm4gdXBkYXRlZCBTU0wgY29uZmlndXJhdG9yIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBTc2xDb25maWd1cmF0b3IgdHJ1c3RTdG9yZUJ5dGVzKGJ5dGVbXSBwYXlsb2FkKSB7CisgICAgICAgIHRoaXMudHJ1c3RTdG9yZUJ5dGVzID0gcGF5bG9hZC5jbG9uZSgpOworICAgICAgICB0aGlzLnRydXN0U3RvcmVGaWxlID0gbnVsbDsKKyAgICAgICAgdGhpcy50cnVzdFN0b3JlID0gbnVsbDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSA8ZW0+a2V5PC9lbT4gc3RvcmUgZmlsZSBuYW1lLgorICAgICAqIDxwPgorICAgICAqIFNldHRpbmcgYSBrZXkgc3RvcmUgaW5zdGFuY2UgcmVzZXRzIGFueSB7QGxpbmsgI2tleVN0b3JlKGphdmEuc2VjdXJpdHkuS2V5U3RvcmUpIGtleSBzdG9yZSBpbnN0YW5jZX0KKyAgICAgKiBvciB7QGxpbmsgI2tleVN0b3JlQnl0ZXMoYnl0ZVtdKSBrZXkgc3RvcmUgcGF5bG9hZH0gdmFsdWUgcHJldmlvdXNseSBzZXQuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGVOYW1lIHtAbGluayBqYXZhLmlvLkZpbGUgZmlsZX0gbmFtZSBvZiB0aGUgPGVtPmtleTwvZW0+IHN0b3JlLgorICAgICAqIEByZXR1cm4gdXBkYXRlZCBTU0wgY29uZmlndXJhdG9yIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBTc2xDb25maWd1cmF0b3Iga2V5U3RvcmVGaWxlKFN0cmluZyBmaWxlTmFtZSkgeworICAgICAgICB0aGlzLmtleVN0b3JlRmlsZSA9IGZpbGVOYW1lOworICAgICAgICB0aGlzLmtleVN0b3JlQnl0ZXMgPSBudWxsOworICAgICAgICB0aGlzLmtleVN0b3JlID0gbnVsbDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSA8ZW0+a2V5PC9lbT4gc3RvcmUgcGF5bG9hZCBhcyBieXRlIGFycmF5LgorICAgICAqIDxwPgorICAgICAqIFNldHRpbmcgYSBrZXkgc3RvcmUgaW5zdGFuY2UgcmVzZXRzIGFueSB7QGxpbmsgI2tleVN0b3JlRmlsZShTdHJpbmcpIGtleSBzdG9yZSBmaWxlfQorICAgICAqIG9yIHtAbGluayAja2V5U3RvcmUoamF2YS5zZWN1cml0eS5LZXlTdG9yZSkga2V5IHN0b3JlIGluc3RhbmNlfSB2YWx1ZSBwcmV2aW91c2x5IHNldC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF5bG9hZCA8ZW0+a2V5PC9lbT4gc3RvcmUgcGF5bG9hZC4KKyAgICAgKiBAcmV0dXJuIHVwZGF0ZWQgU1NMIGNvbmZpZ3VyYXRvciBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3NsQ29uZmlndXJhdG9yIGtleVN0b3JlQnl0ZXMoYnl0ZVtdIHBheWxvYWQpIHsKKyAgICAgICAgdGhpcy5rZXlTdG9yZUJ5dGVzID0gcGF5bG9hZC5jbG9uZSgpOworICAgICAgICB0aGlzLmtleVN0b3JlRmlsZSA9IG51bGw7CisgICAgICAgIHRoaXMua2V5U3RvcmUgPSBudWxsOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIDxlbT50cnVzdDwvZW0+IG1hbmFnZXIgZmFjdG9yeSBhbGdvcml0aG0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWxnb3JpdGhtIHRoZSA8ZW0+dHJ1c3Q8L2VtPiBtYW5hZ2VyIGZhY3RvcnkgYWxnb3JpdGhtLgorICAgICAqIEByZXR1cm4gdXBkYXRlZCBTU0wgY29uZmlndXJhdG9yIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBTc2xDb25maWd1cmF0b3IgdHJ1c3RNYW5hZ2VyRmFjdG9yeUFsZ29yaXRobShTdHJpbmcgYWxnb3JpdGhtKSB7CisgICAgICAgIHRoaXMudHJ1c3RNYW5hZ2VyRmFjdG9yeUFsZ29yaXRobSA9IGFsZ29yaXRobTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSA8ZW0+a2V5PC9lbT4gbWFuYWdlciBmYWN0b3J5IGFsZ29yaXRobS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbGdvcml0aG0gdGhlIDxlbT5rZXk8L2VtPiBtYW5hZ2VyIGZhY3RvcnkgYWxnb3JpdGhtLgorICAgICAqIEByZXR1cm4gdXBkYXRlZCBTU0wgY29uZmlndXJhdG9yIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBTc2xDb25maWd1cmF0b3Iga2V5TWFuYWdlckZhY3RvcnlBbGdvcml0aG0oU3RyaW5nIGFsZ29yaXRobSkgeworICAgICAgICB0aGlzLmtleU1hbmFnZXJGYWN0b3J5QWxnb3JpdGhtID0gYWxnb3JpdGhtOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIDxlbT50cnVzdDwvZW0+IG1hbmFnZXIgZmFjdG9yeSBwcm92aWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm92aWRlciB0aGUgPGVtPnRydXN0PC9lbT4gbWFuYWdlciBmYWN0b3J5IHByb3ZpZGVyLgorICAgICAqIEByZXR1cm4gdXBkYXRlZCBTU0wgY29uZmlndXJhdG9yIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBTc2xDb25maWd1cmF0b3IgdHJ1c3RNYW5hZ2VyRmFjdG9yeVByb3ZpZGVyKFN0cmluZyBwcm92aWRlcikgeworICAgICAgICB0aGlzLnRydXN0TWFuYWdlckZhY3RvcnlQcm92aWRlciA9IHByb3ZpZGVyOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIDxlbT5rZXk8L2VtPiBtYW5hZ2VyIGZhY3RvcnkgcHJvdmlkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvdmlkZXIgdGhlIDxlbT5rZXk8L2VtPiBtYW5hZ2VyIGZhY3RvcnkgcHJvdmlkZXIuCisgICAgICogQHJldHVybiB1cGRhdGVkIFNTTCBjb25maWd1cmF0b3IgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIFNzbENvbmZpZ3VyYXRvciBrZXlNYW5hZ2VyRmFjdG9yeVByb3ZpZGVyKFN0cmluZyBwcm92aWRlcikgeworICAgICAgICB0aGlzLmtleU1hbmFnZXJGYWN0b3J5UHJvdmlkZXIgPSBwcm92aWRlcjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBTU0xDb250ZXh0IHByb3RvY29sLiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB7QGNvZGUgVExTfSBpZiB0aGlzIGlzIHtAY29kZSBudWxsfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm90b2NvbCBwcm90b2NvbCBmb3Ige0BsaW5rIGphdmF4Lm5ldC5zc2wuU1NMQ29udGV4dCNnZXRQcm90b2NvbCgpfS4KKyAgICAgKiBAcmV0dXJuIHVwZGF0ZWQgU1NMIGNvbmZpZ3VyYXRvciBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3NsQ29uZmlndXJhdG9yIHNlY3VyaXR5UHJvdG9jb2woU3RyaW5nIHByb3RvY29sKSB7CisgICAgICAgIHRoaXMuc2VjdXJpdHlQcm90b2NvbCA9IHByb3RvY29sOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIDxlbT5rZXk8L2VtPiBzdG9yZSBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gPGVtPmtleTwvZW0+IHN0b3JlIGluc3RhbmNlIG9yIHtAY29kZSBudWxsfSBpZiBub3QgZXhwbGljaXRseSBzZXQuCisgICAgICovCisgICAgS2V5U3RvcmUgZ2V0S2V5U3RvcmUoKSB7CisgICAgICAgIHJldHVybiBrZXlTdG9yZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIDxlbT5rZXk8L2VtPiBzdG9yZSBpbnN0YW5jZS4KKyAgICAgKiA8cD4KKyAgICAgKiBTZXR0aW5nIGEga2V5IHN0b3JlIGluc3RhbmNlIHJlc2V0cyBhbnkge0BsaW5rICNrZXlTdG9yZUZpbGUoU3RyaW5nKSBrZXkgc3RvcmUgZmlsZX0KKyAgICAgKiBvciB7QGxpbmsgI2tleVN0b3JlQnl0ZXMoYnl0ZVtdKSBrZXkgc3RvcmUgcGF5bG9hZH0gdmFsdWUgcHJldmlvdXNseSBzZXQuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGtleVN0b3JlIDxlbT5rZXk8L2VtPiBzdG9yZSBpbnN0YW5jZS4KKyAgICAgKiBAcmV0dXJuIHVwZGF0ZWQgU1NMIGNvbmZpZ3VyYXRvciBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3NsQ29uZmlndXJhdG9yIGtleVN0b3JlKEtleVN0b3JlIGtleVN0b3JlKSB7CisgICAgICAgIHRoaXMua2V5U3RvcmUgPSBrZXlTdG9yZTsKKyAgICAgICAgdGhpcy5rZXlTdG9yZUZpbGUgPSBudWxsOworICAgICAgICB0aGlzLmtleVN0b3JlQnl0ZXMgPSBudWxsOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIDxlbT50cnVzdDwvZW0+IHN0b3JlIGluc3RhbmNlLgorICAgICAqIDxwPgorICAgICAqIFNldHRpbmcgYSB0cnVzdCBzdG9yZSBpbnN0YW5jZSByZXNldHMgYW55IHtAbGluayAjdHJ1c3RTdG9yZUZpbGUoU3RyaW5nKSB0cnVzdCBzdG9yZSBmaWxlfQorICAgICAqIG9yIHtAbGluayAjdHJ1c3RTdG9yZUJ5dGVzKGJ5dGVbXSkgdHJ1c3Qgc3RvcmUgcGF5bG9hZH0gdmFsdWUgcHJldmlvdXNseSBzZXQuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHJldHVybiA8ZW0+dHJ1c3Q8L2VtPiBzdG9yZSBpbnN0YW5jZSBvciB7QGNvZGUgbnVsbH0gaWYgbm90IGV4cGxpY2l0bHkgc2V0LgorICAgICAqLworICAgIEtleVN0b3JlIGdldFRydXN0U3RvcmUoKSB7CisgICAgICAgIHJldHVybiB0cnVzdFN0b3JlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgPGVtPnRydXN0PC9lbT4gc3RvcmUgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJ1c3RTdG9yZSA8ZW0+dHJ1c3Q8L2VtPiBzdG9yZSBpbnN0YW5jZS4KKyAgICAgKiBAcmV0dXJuIHVwZGF0ZWQgU1NMIGNvbmZpZ3VyYXRvciBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3NsQ29uZmlndXJhdG9yIHRydXN0U3RvcmUoS2V5U3RvcmUgdHJ1c3RTdG9yZSkgeworICAgICAgICB0aGlzLnRydXN0U3RvcmUgPSB0cnVzdFN0b3JlOworICAgICAgICB0aGlzLnRydXN0U3RvcmVGaWxlID0gbnVsbDsKKyAgICAgICAgdGhpcy50cnVzdFN0b3JlQnl0ZXMgPSBudWxsOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IFNTTCBjb250ZXh0IGluc3RhbmNlIHVzaW5nIHRoZSBjdXJyZW50IFNTTCBjb250ZXh0IGNvbmZpZ3VyYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIG5ld2x5IGNvbmZpZ3VyZWQgU1NMIGNvbnRleHQgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIFNTTENvbnRleHQgY3JlYXRlU1NMQ29udGV4dCgpIHsKKyAgICAgICAgVHJ1c3RNYW5hZ2VyRmFjdG9yeSB0cnVzdE1hbmFnZXJGYWN0b3J5ID0gbnVsbDsKKyAgICAgICAgS2V5TWFuYWdlckZhY3Rvcnkga2V5TWFuYWdlckZhY3RvcnkgPSBudWxsOworCisgICAgICAgIEtleVN0b3JlIF9rZXlTdG9yZSA9IGtleVN0b3JlOworICAgICAgICBpZiAoX2tleVN0b3JlID09IG51bGwgJiYgKGtleVN0b3JlQnl0ZXMgIT0gbnVsbCB8fCBrZXlTdG9yZUZpbGUgIT0gbnVsbCkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKGtleVN0b3JlUHJvdmlkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBfa2V5U3RvcmUgPSBLZXlTdG9yZS5nZXRJbnN0YW5jZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlTdG9yZVR5cGUgIT0gbnVsbCA/IGtleVN0b3JlVHlwZSA6IEtleVN0b3JlLmdldERlZmF1bHRUeXBlKCksIGtleVN0b3JlUHJvdmlkZXIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIF9rZXlTdG9yZSA9IEtleVN0b3JlLmdldEluc3RhbmNlKGtleVN0b3JlVHlwZSAhPSBudWxsID8ga2V5U3RvcmVUeXBlIDogS2V5U3RvcmUuZ2V0RGVmYXVsdFR5cGUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGtleVN0b3JlSW5wdXRTdHJlYW0gPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChrZXlTdG9yZUJ5dGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleVN0b3JlSW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oa2V5U3RvcmVCeXRlcyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWtleVN0b3JlRmlsZS5lcXVhbHMoIk5PTkUiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAga2V5U3RvcmVJbnB1dFN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oa2V5U3RvcmVGaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBfa2V5U3RvcmUubG9hZChrZXlTdG9yZUlucHV0U3RyZWFtLCBrZXlTdG9yZVBhc3MpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5U3RvcmVJbnB1dFN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5U3RvcmVJbnB1dFN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpZ25vcmVkKSB7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChLZXlTdG9yZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5TU0xfS1NfSU1QTF9OT1RfRk9VTkQoKSwgZSk7CisgICAgICAgICAgICB9IGNhdGNoIChDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5TU0xfS1NfQ0VSVF9MT0FEX0VSUk9SKCksIGUpOworICAgICAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlNTTF9LU19GSUxFX05PVF9GT1VORChrZXlTdG9yZUZpbGUpLCBlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlNTTF9LU19MT0FEX0VSUk9SKGtleVN0b3JlRmlsZSksIGUpOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuU1NMX0tTX1BST1ZJREVSU19OT1RfUkVHSVNURVJFRCgpLCBlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5TU0xfS1NfSU5URUdSSVRZX0FMR09SSVRITV9OT1RfRk9VTkQoKSwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9rZXlTdG9yZSAhPSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcga21mQWxnb3JpdGhtID0ga2V5TWFuYWdlckZhY3RvcnlBbGdvcml0aG07CisgICAgICAgICAgICBpZiAoa21mQWxnb3JpdGhtID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBrbWZBbGdvcml0aG0gPSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChQcm9wZXJ0aWVzSGVscGVyLmdldFN5c3RlbVByb3BlcnR5KAorICAgICAgICAgICAgICAgICAgICAgICAgS0VZX01BTkFHRVJfRkFDVE9SWV9BTEdPUklUSE0sIEtleU1hbmFnZXJGYWN0b3J5LmdldERlZmF1bHRBbGdvcml0aG0oKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoa2V5TWFuYWdlckZhY3RvcnlQcm92aWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGtleU1hbmFnZXJGYWN0b3J5ID0gS2V5TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2Uoa21mQWxnb3JpdGhtLCBrZXlNYW5hZ2VyRmFjdG9yeVByb3ZpZGVyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBrZXlNYW5hZ2VyRmFjdG9yeSA9IEtleU1hbmFnZXJGYWN0b3J5LmdldEluc3RhbmNlKGttZkFsZ29yaXRobSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsIGNoYXJbXSBwYXNzd29yZCA9IGtleVBhc3MgIT0gbnVsbCA/IGtleVBhc3MgOiBrZXlTdG9yZVBhc3M7CisgICAgICAgICAgICAgICAgaWYgKHBhc3N3b3JkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAga2V5TWFuYWdlckZhY3RvcnkuaW5pdChfa2V5U3RvcmUsIHBhc3N3b3JkKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcga3NOYW1lID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlTdG9yZVByb3ZpZGVyICE9IG51bGwgPyBMb2NhbGl6YXRpb25NZXNzYWdlcy5TU0xfS01GX05PX1BBU1NXT1JEX0ZPUl9QUk9WSURFUl9CQVNFRF9LUygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGtleVN0b3JlQnl0ZXMgIT0gbnVsbCA/IExvY2FsaXphdGlvbk1lc3NhZ2VzLlNTTF9LTUZfTk9fUEFTU1dPUkRfRk9SX0JZVEVfQkFTRURfS1MoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGtleVN0b3JlRmlsZTsKKworICAgICAgICAgICAgICAgICAgICBMT0dHRVIuY29uZmlnKExvY2FsaXphdGlvbk1lc3NhZ2VzLlNTTF9LTUZfTk9fUEFTU1dPUkRfU0VUKGtzTmFtZSkpOworICAgICAgICAgICAgICAgICAgICBrZXlNYW5hZ2VyRmFjdG9yeSA9IG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoS2V5U3RvcmVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuU1NMX0tNRl9JTklUX0ZBSUxFRCgpLCBlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFVucmVjb3ZlcmFibGVLZXlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuU1NMX0tNRl9VTlJFQ09WRVJBQkxFX0tFWSgpLCBlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5TU0xfS01GX0FMR09SSVRITV9OT1RfU1VQUE9SVEVEKCksIGUpOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoUHJvdmlkZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuU1NMX0tNRl9QUk9WSURFUl9OT1RfUkVHSVNURVJFRCgpLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEtleVN0b3JlIF90cnVzdFN0b3JlID0gdHJ1c3RTdG9yZTsKKyAgICAgICAgaWYgKF90cnVzdFN0b3JlID09IG51bGwgJiYgKHRydXN0U3RvcmVCeXRlcyAhPSBudWxsIHx8IHRydXN0U3RvcmVGaWxlICE9IG51bGwpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmICh0cnVzdFN0b3JlUHJvdmlkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBfdHJ1c3RTdG9yZSA9IEtleVN0b3JlLmdldEluc3RhbmNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydXN0U3RvcmVUeXBlICE9IG51bGwgPyB0cnVzdFN0b3JlVHlwZSA6IEtleVN0b3JlLmdldERlZmF1bHRUeXBlKCksIHRydXN0U3RvcmVQcm92aWRlcik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgX3RydXN0U3RvcmUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleVN0b3JlLmdldEluc3RhbmNlKHRydXN0U3RvcmVUeXBlICE9IG51bGwgPyB0cnVzdFN0b3JlVHlwZSA6IEtleVN0b3JlLmdldERlZmF1bHRUeXBlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSB0cnVzdFN0b3JlSW5wdXRTdHJlYW0gPSBudWxsOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0cnVzdFN0b3JlQnl0ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ1c3RTdG9yZUlucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHRydXN0U3RvcmVCeXRlcyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXRydXN0U3RvcmVGaWxlLmVxdWFscygiTk9ORSIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnVzdFN0b3JlSW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRydXN0U3RvcmVGaWxlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBfdHJ1c3RTdG9yZS5sb2FkKHRydXN0U3RvcmVJbnB1dFN0cmVhbSwgdHJ1c3RTdG9yZVBhc3MpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJ1c3RTdG9yZUlucHV0U3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVzdFN0b3JlSW5wdXRTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaWdub3JlZCkgeworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoS2V5U3RvcmVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuU1NMX1RTX0lNUExfTk9UX0ZPVU5EKCksIGUpOworICAgICAgICAgICAgfSBjYXRjaCAoQ2VydGlmaWNhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuU1NMX1RTX0NFUlRfTE9BRF9FUlJPUigpLCBlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5TU0xfVFNfRklMRV9OT1RfRk9VTkQodHJ1c3RTdG9yZUZpbGUpLCBlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlNTTF9UU19MT0FEX0VSUk9SKHRydXN0U3RvcmVGaWxlKSwgZSk7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5TU0xfVFNfUFJPVklERVJTX05PVF9SRUdJU1RFUkVEKCksIGUpOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlNTTF9UU19JTlRFR1JJVFlfQUxHT1JJVEhNX05PVF9GT1VORCgpLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoX3RydXN0U3RvcmUgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIHRtZkFsZ29yaXRobSA9IHRydXN0TWFuYWdlckZhY3RvcnlBbGdvcml0aG07CisgICAgICAgICAgICBpZiAodG1mQWxnb3JpdGhtID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0bWZBbGdvcml0aG0gPSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChQcm9wZXJ0aWVzSGVscGVyLmdldFN5c3RlbVByb3BlcnR5KAorICAgICAgICAgICAgICAgICAgICAgICAgVFJVU1RfTUFOQUdFUl9GQUNUT1JZX0FMR09SSVRITSwgVHJ1c3RNYW5hZ2VyRmFjdG9yeS5nZXREZWZhdWx0QWxnb3JpdGhtKCkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAodHJ1c3RNYW5hZ2VyRmFjdG9yeVByb3ZpZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ1c3RNYW5hZ2VyRmFjdG9yeSA9IFRydXN0TWFuYWdlckZhY3RvcnkuZ2V0SW5zdGFuY2UodG1mQWxnb3JpdGhtLCB0cnVzdE1hbmFnZXJGYWN0b3J5UHJvdmlkZXIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRydXN0TWFuYWdlckZhY3RvcnkgPSBUcnVzdE1hbmFnZXJGYWN0b3J5LmdldEluc3RhbmNlKHRtZkFsZ29yaXRobSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRydXN0TWFuYWdlckZhY3RvcnkuaW5pdChfdHJ1c3RTdG9yZSk7CisgICAgICAgICAgICB9IGNhdGNoIChLZXlTdG9yZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5TU0xfVE1GX0lOSVRfRkFJTEVEKCksIGUpOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlNTTF9UTUZfQUxHT1JJVEhNX05PVF9TVVBQT1JURUQoKSwgZSk7CisgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hQcm92aWRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5TU0xfVE1GX1BST1ZJREVSX05PVF9SRUdJU1RFUkVEKCksIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZyBzZWNQcm90b2NvbCA9ICJUTFMiOworICAgICAgICAgICAgaWYgKHNlY3VyaXR5UHJvdG9jb2wgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNlY1Byb3RvY29sID0gc2VjdXJpdHlQcm90b2NvbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIFNTTENvbnRleHQgc3NsQ29udGV4dCA9IFNTTENvbnRleHQuZ2V0SW5zdGFuY2Uoc2VjUHJvdG9jb2wpOworICAgICAgICAgICAgc3NsQ29udGV4dC5pbml0KAorICAgICAgICAgICAgICAgICAgICBrZXlNYW5hZ2VyRmFjdG9yeSAhPSBudWxsID8ga2V5TWFuYWdlckZhY3RvcnkuZ2V0S2V5TWFuYWdlcnMoKSA6IG51bGwsCisgICAgICAgICAgICAgICAgICAgIHRydXN0TWFuYWdlckZhY3RvcnkgIT0gbnVsbCA/IHRydXN0TWFuYWdlckZhY3RvcnkuZ2V0VHJ1c3RNYW5hZ2VycygpIDogbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCk7CisgICAgICAgICAgICByZXR1cm4gc3NsQ29udGV4dDsKKyAgICAgICAgfSBjYXRjaCAoS2V5TWFuYWdlbWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlNTTF9DVFhfSU5JVF9GQUlMRUQoKSwgZSk7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlNTTF9DVFhfQUxHT1JJVEhNX05PVF9TVVBQT1JURUQoKSwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZSB0aGUgU1NMIGNvbnRleHQgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBzdXBwbGllZCBwcm9wZXJ0aWVzLgorICAgICAqCisgICAgICogQHBhcmFtIHByb3BzIHByb3BlcnRpZXMgY29udGFpbmluZyB0aGUgU1NMIGNvbnRleHQgY29uZmlndXJhdGlvbi4KKyAgICAgKiBAcmV0dXJuIHVwZGF0ZWQgU1NMIGNvbmZpZ3VyYXRvciBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3NsQ29uZmlndXJhdG9yIHJldHJpZXZlKFByb3BlcnRpZXMgcHJvcHMpIHsKKyAgICAgICAgdHJ1c3RTdG9yZVByb3ZpZGVyID0gcHJvcHMuZ2V0UHJvcGVydHkoVFJVU1RfU1RPUkVfUFJPVklERVIpOworICAgICAgICBrZXlTdG9yZVByb3ZpZGVyID0gcHJvcHMuZ2V0UHJvcGVydHkoS0VZX1NUT1JFX1BST1ZJREVSKTsKKworICAgICAgICB0cnVzdE1hbmFnZXJGYWN0b3J5UHJvdmlkZXIgPSBwcm9wcy5nZXRQcm9wZXJ0eShUUlVTVF9NQU5BR0VSX0ZBQ1RPUllfUFJPVklERVIpOworICAgICAgICBrZXlNYW5hZ2VyRmFjdG9yeVByb3ZpZGVyID0gcHJvcHMuZ2V0UHJvcGVydHkoS0VZX01BTkFHRVJfRkFDVE9SWV9QUk9WSURFUik7CisKKyAgICAgICAgdHJ1c3RTdG9yZVR5cGUgPSBwcm9wcy5nZXRQcm9wZXJ0eShUUlVTVF9TVE9SRV9UWVBFKTsKKyAgICAgICAga2V5U3RvcmVUeXBlID0gcHJvcHMuZ2V0UHJvcGVydHkoS0VZX1NUT1JFX1RZUEUpOworCisgICAgICAgIGlmIChwcm9wcy5nZXRQcm9wZXJ0eShUUlVTVF9TVE9SRV9QQVNTV09SRCkgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ1c3RTdG9yZVBhc3MgPSBwcm9wcy5nZXRQcm9wZXJ0eShUUlVTVF9TVE9SRV9QQVNTV09SRCkudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRydXN0U3RvcmVQYXNzID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwcm9wcy5nZXRQcm9wZXJ0eShLRVlfU1RPUkVfUEFTU1dPUkQpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGtleVN0b3JlUGFzcyA9IHByb3BzLmdldFByb3BlcnR5KEtFWV9TVE9SRV9QQVNTV09SRCkudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGtleVN0b3JlUGFzcyA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICB0cnVzdFN0b3JlRmlsZSA9IHByb3BzLmdldFByb3BlcnR5KFRSVVNUX1NUT1JFX0ZJTEUpOworICAgICAgICBrZXlTdG9yZUZpbGUgPSBwcm9wcy5nZXRQcm9wZXJ0eShLRVlfU1RPUkVfRklMRSk7CisKKyAgICAgICAgdHJ1c3RTdG9yZUJ5dGVzID0gbnVsbDsKKyAgICAgICAga2V5U3RvcmVCeXRlcyA9IG51bGw7CisKKyAgICAgICAgdHJ1c3RTdG9yZSA9IG51bGw7CisgICAgICAgIGtleVN0b3JlID0gbnVsbDsKKworICAgICAgICBzZWN1cml0eVByb3RvY29sID0gIlRMUyI7CisKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmICh0aGlzID09IG8pIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIFNzbENvbmZpZ3VyYXRvciB0aGF0ID0gKFNzbENvbmZpZ3VyYXRvcikgbzsKKworICAgICAgICBpZiAoa2V5TWFuYWdlckZhY3RvcnlBbGdvcml0aG0gIT0gbnVsbAorICAgICAgICAgICAgICAgID8gIWtleU1hbmFnZXJGYWN0b3J5QWxnb3JpdGhtLmVxdWFscyh0aGF0LmtleU1hbmFnZXJGYWN0b3J5QWxnb3JpdGhtKSA6IHRoYXQua2V5TWFuYWdlckZhY3RvcnlBbGdvcml0aG0gIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChrZXlNYW5hZ2VyRmFjdG9yeVByb3ZpZGVyICE9IG51bGwKKyAgICAgICAgICAgICAgICA/ICFrZXlNYW5hZ2VyRmFjdG9yeVByb3ZpZGVyLmVxdWFscyh0aGF0LmtleU1hbmFnZXJGYWN0b3J5UHJvdmlkZXIpIDogdGhhdC5rZXlNYW5hZ2VyRmFjdG9yeVByb3ZpZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUFycmF5cy5lcXVhbHMoa2V5UGFzcywgdGhhdC5rZXlQYXNzKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChrZXlTdG9yZSAhPSBudWxsID8gIWtleVN0b3JlLmVxdWFscyh0aGF0LmtleVN0b3JlKSA6IHRoYXQua2V5U3RvcmUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICghQXJyYXlzLmVxdWFscyhrZXlTdG9yZUJ5dGVzLCB0aGF0LmtleVN0b3JlQnl0ZXMpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGtleVN0b3JlRmlsZSAhPSBudWxsID8gIWtleVN0b3JlRmlsZS5lcXVhbHModGhhdC5rZXlTdG9yZUZpbGUpIDogdGhhdC5rZXlTdG9yZUZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICghQXJyYXlzLmVxdWFscyhrZXlTdG9yZVBhc3MsIHRoYXQua2V5U3RvcmVQYXNzKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChrZXlTdG9yZVByb3ZpZGVyICE9IG51bGwgPyAha2V5U3RvcmVQcm92aWRlci5lcXVhbHModGhhdC5rZXlTdG9yZVByb3ZpZGVyKSA6IHRoYXQua2V5U3RvcmVQcm92aWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGtleVN0b3JlVHlwZSAhPSBudWxsID8gIWtleVN0b3JlVHlwZS5lcXVhbHModGhhdC5rZXlTdG9yZVR5cGUpIDogdGhhdC5rZXlTdG9yZVR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChzZWN1cml0eVByb3RvY29sICE9IG51bGwgPyAhc2VjdXJpdHlQcm90b2NvbC5lcXVhbHModGhhdC5zZWN1cml0eVByb3RvY29sKSA6IHRoYXQuc2VjdXJpdHlQcm90b2NvbCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRydXN0TWFuYWdlckZhY3RvcnlBbGdvcml0aG0gIT0gbnVsbCA/ICF0cnVzdE1hbmFnZXJGYWN0b3J5QWxnb3JpdGhtLmVxdWFscyh0aGF0LnRydXN0TWFuYWdlckZhY3RvcnlBbGdvcml0aG0pCisgICAgICAgICAgICAgICAgOiB0aGF0LnRydXN0TWFuYWdlckZhY3RvcnlBbGdvcml0aG0gIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICh0cnVzdE1hbmFnZXJGYWN0b3J5UHJvdmlkZXIgIT0gbnVsbCA/ICF0cnVzdE1hbmFnZXJGYWN0b3J5UHJvdmlkZXIuZXF1YWxzKHRoYXQudHJ1c3RNYW5hZ2VyRmFjdG9yeVByb3ZpZGVyKQorICAgICAgICAgICAgICAgIDogdGhhdC50cnVzdE1hbmFnZXJGYWN0b3J5UHJvdmlkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICh0cnVzdFN0b3JlICE9IG51bGwgPyAhdHJ1c3RTdG9yZS5lcXVhbHModGhhdC50cnVzdFN0b3JlKSA6IHRoYXQudHJ1c3RTdG9yZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFBcnJheXMuZXF1YWxzKHRydXN0U3RvcmVCeXRlcywgdGhhdC50cnVzdFN0b3JlQnl0ZXMpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRydXN0U3RvcmVGaWxlICE9IG51bGwgPyAhdHJ1c3RTdG9yZUZpbGUuZXF1YWxzKHRoYXQudHJ1c3RTdG9yZUZpbGUpIDogdGhhdC50cnVzdFN0b3JlRmlsZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFBcnJheXMuZXF1YWxzKHRydXN0U3RvcmVQYXNzLCB0aGF0LnRydXN0U3RvcmVQYXNzKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICh0cnVzdFN0b3JlUHJvdmlkZXIgIT0gbnVsbCA/ICF0cnVzdFN0b3JlUHJvdmlkZXIuZXF1YWxzKHRoYXQudHJ1c3RTdG9yZVByb3ZpZGVyKSA6IHRoYXQudHJ1c3RTdG9yZVByb3ZpZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHJ1c3RTdG9yZVR5cGUgIT0gbnVsbCA/ICF0cnVzdFN0b3JlVHlwZS5lcXVhbHModGhhdC50cnVzdFN0b3JlVHlwZSkgOiB0aGF0LnRydXN0U3RvcmVUeXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCByZXN1bHQgPSBrZXlTdG9yZSAhPSBudWxsID8ga2V5U3RvcmUuaGFzaENvZGUoKSA6IDA7CisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgKHRydXN0U3RvcmUgIT0gbnVsbCA/IHRydXN0U3RvcmUuaGFzaENvZGUoKSA6IDApOworICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArICh0cnVzdFN0b3JlUHJvdmlkZXIgIT0gbnVsbCA/IHRydXN0U3RvcmVQcm92aWRlci5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgKGtleVN0b3JlUHJvdmlkZXIgIT0gbnVsbCA/IGtleVN0b3JlUHJvdmlkZXIuaGFzaENvZGUoKSA6IDApOworICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArICh0cnVzdFN0b3JlVHlwZSAhPSBudWxsID8gdHJ1c3RTdG9yZVR5cGUuaGFzaENvZGUoKSA6IDApOworICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIChrZXlTdG9yZVR5cGUgIT0gbnVsbCA/IGtleVN0b3JlVHlwZS5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgKHRydXN0U3RvcmVQYXNzICE9IG51bGwgPyBBcnJheXMuaGFzaENvZGUodHJ1c3RTdG9yZVBhc3MpIDogMCk7CisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgKGtleVN0b3JlUGFzcyAhPSBudWxsID8gQXJyYXlzLmhhc2hDb2RlKGtleVN0b3JlUGFzcykgOiAwKTsKKyAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyAoa2V5UGFzcyAhPSBudWxsID8gQXJyYXlzLmhhc2hDb2RlKGtleVBhc3MpIDogMCk7CisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgKHRydXN0U3RvcmVGaWxlICE9IG51bGwgPyB0cnVzdFN0b3JlRmlsZS5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgKGtleVN0b3JlRmlsZSAhPSBudWxsID8ga2V5U3RvcmVGaWxlLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyAodHJ1c3RTdG9yZUJ5dGVzICE9IG51bGwgPyBBcnJheXMuaGFzaENvZGUodHJ1c3RTdG9yZUJ5dGVzKSA6IDApOworICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIChrZXlTdG9yZUJ5dGVzICE9IG51bGwgPyBBcnJheXMuaGFzaENvZGUoa2V5U3RvcmVCeXRlcykgOiAwKTsKKyAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyAodHJ1c3RNYW5hZ2VyRmFjdG9yeUFsZ29yaXRobSAhPSBudWxsID8gdHJ1c3RNYW5hZ2VyRmFjdG9yeUFsZ29yaXRobS5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgKGtleU1hbmFnZXJGYWN0b3J5QWxnb3JpdGhtICE9IG51bGwgPyBrZXlNYW5hZ2VyRmFjdG9yeUFsZ29yaXRobS5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgKHRydXN0TWFuYWdlckZhY3RvcnlQcm92aWRlciAhPSBudWxsID8gdHJ1c3RNYW5hZ2VyRmFjdG9yeVByb3ZpZGVyLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyAoa2V5TWFuYWdlckZhY3RvcnlQcm92aWRlciAhPSBudWxsID8ga2V5TWFuYWdlckZhY3RvcnlQcm92aWRlci5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgKHNlY3VyaXR5UHJvdG9jb2wgIT0gbnVsbCA/IHNlY3VyaXR5UHJvdG9jb2wuaGFzaENvZGUoKSA6IDApOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvQWJzdHJhY3RSdW50aW1lRGVsZWdhdGUuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvQWJzdHJhY3RSdW50aW1lRGVsZWdhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzk2NjllCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9BYnN0cmFjdFJ1bnRpbWVEZWxlZ2F0ZS5qYXZhCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuV2Vha0hhc2hNYXA7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNhY2hlQ29udHJvbDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvb2tpZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkVudGl0eVRhZzsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkxpbms7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5OZXdDb29raWU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZS5SZXNwb25zZUJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SdW50aW1lRGVsZWdhdGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkplcnNleUxpbms7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5PdXRib3VuZEpheHJzUmVzcG9uc2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5PdXRib3VuZE1lc3NhZ2VDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuVmFyaWFudExpc3RCdWlsZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5IZWFkZXJEZWxlZ2F0ZVByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnVyaS5pbnRlcm5hbC5KZXJzZXlVcmlCdWlsZGVyOworCisvKioKKyAqIEFuIGFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBSdW50aW1lRGVsZWdhdGV9IHRoYXQKKyAqIHByb3ZpZGVzIHN1cHBvcnQgY29tbW9uIHRvIHRoZSBjbGllbnQgYW5kIHNlcnZlci4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJ1bnRpbWVEZWxlZ2F0ZSBleHRlbmRzIFJ1bnRpbWVEZWxlZ2F0ZSB7CisKKyAgICBwcml2YXRlIGZpbmFsIFNldDxIZWFkZXJEZWxlZ2F0ZVByb3ZpZGVyPiBocHM7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8Q2xhc3M8Pz4sIEhlYWRlckRlbGVnYXRlPD8+PiBtYXA7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXphdGlvbiBjb25zdHJ1Y3Rvci4gVGhlIGluamVjdGlvbiBtYW5hZ2VyIHdpbGwgYmUgc2h1dCBkb3duLgorICAgICAqCisgICAgICogQHBhcmFtIGhwcyBhbGwge0BsaW5rIEhlYWRlckRlbGVnYXRlUHJvdmlkZXJ9IGluc3RhbmNlcyByZWdpc3RlcmVkIGludGVybmFsbHkuCisgICAgICovCisgICAgcHJvdGVjdGVkIEFic3RyYWN0UnVudGltZURlbGVnYXRlKFNldDxIZWFkZXJEZWxlZ2F0ZVByb3ZpZGVyPiBocHMpIHsKKyAgICAgICAgdGhpcy5ocHMgPSBocHM7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29uc3RydWN0IGEgbWFwIGZvciBxdWljayBsb29rIHVwIG9mIGtub3duIGhlYWRlciBjbGFzc2VzCisgICAgICAgICAqLworICAgICAgICBtYXAgPSBuZXcgV2Vha0hhc2hNYXA8PigpOworICAgICAgICBtYXAucHV0KEVudGl0eVRhZy5jbGFzcywgX2NyZWF0ZUhlYWRlckRlbGVnYXRlKEVudGl0eVRhZy5jbGFzcykpOworICAgICAgICBtYXAucHV0KE1lZGlhVHlwZS5jbGFzcywgX2NyZWF0ZUhlYWRlckRlbGVnYXRlKE1lZGlhVHlwZS5jbGFzcykpOworICAgICAgICBtYXAucHV0KENhY2hlQ29udHJvbC5jbGFzcywgX2NyZWF0ZUhlYWRlckRlbGVnYXRlKENhY2hlQ29udHJvbC5jbGFzcykpOworICAgICAgICBtYXAucHV0KE5ld0Nvb2tpZS5jbGFzcywgX2NyZWF0ZUhlYWRlckRlbGVnYXRlKE5ld0Nvb2tpZS5jbGFzcykpOworICAgICAgICBtYXAucHV0KENvb2tpZS5jbGFzcywgX2NyZWF0ZUhlYWRlckRlbGVnYXRlKENvb2tpZS5jbGFzcykpOworICAgICAgICBtYXAucHV0KFVSSS5jbGFzcywgX2NyZWF0ZUhlYWRlckRlbGVnYXRlKFVSSS5jbGFzcykpOworICAgICAgICBtYXAucHV0KERhdGUuY2xhc3MsIF9jcmVhdGVIZWFkZXJEZWxlZ2F0ZShEYXRlLmNsYXNzKSk7CisgICAgICAgIG1hcC5wdXQoU3RyaW5nLmNsYXNzLCBfY3JlYXRlSGVhZGVyRGVsZWdhdGUoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGphdmF4LndzLnJzLmNvcmUuVmFyaWFudC5WYXJpYW50TGlzdEJ1aWxkZXIgY3JlYXRlVmFyaWFudExpc3RCdWlsZGVyKCkgeworICAgICAgICByZXR1cm4gbmV3IFZhcmlhbnRMaXN0QnVpbGRlcigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNwb25zZUJ1aWxkZXIgY3JlYXRlUmVzcG9uc2VCdWlsZGVyKCkgeworICAgICAgICByZXR1cm4gbmV3IE91dGJvdW5kSmF4cnNSZXNwb25zZS5CdWlsZGVyKG5ldyBPdXRib3VuZE1lc3NhZ2VDb250ZXh0KCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBVcmlCdWlsZGVyIGNyZWF0ZVVyaUJ1aWxkZXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgSmVyc2V5VXJpQnVpbGRlcigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaW5rLkJ1aWxkZXIgY3JlYXRlTGlua0J1aWxkZXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgSmVyc2V5TGluay5CdWlsZGVyKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxUPiBIZWFkZXJEZWxlZ2F0ZTxUPiBjcmVhdGVIZWFkZXJEZWxlZ2F0ZShmaW5hbCBDbGFzczxUPiB0eXBlKSB7CisgICAgICAgIGlmICh0eXBlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInR5cGUgcGFyYW1ldGVyIGNhbm5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgZmluYWwgSGVhZGVyRGVsZWdhdGU8VD4gZGVsZWdhdGUgPSAoSGVhZGVyRGVsZWdhdGU8VD4pIG1hcC5nZXQodHlwZSk7CisgICAgICAgIGlmIChkZWxlZ2F0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gX2NyZWF0ZUhlYWRlckRlbGVnYXRlKHR5cGUpOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHByaXZhdGUgPFQ+IEhlYWRlckRlbGVnYXRlPFQ+IF9jcmVhdGVIZWFkZXJEZWxlZ2F0ZShmaW5hbCBDbGFzczxUPiB0eXBlKSB7CisgICAgICAgIGZvciAoZmluYWwgSGVhZGVyRGVsZWdhdGVQcm92aWRlciBocCA6IGhwcykgeworICAgICAgICAgICAgaWYgKGhwLnN1cHBvcnRzKHR5cGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGhwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9BYnN0cmFjdFNlcnZpY2VGaW5kZXJDb25maWd1cmF0b3IuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvQWJzdHJhY3RTZXJ2aWNlRmluZGVyQ29uZmlndXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjIzNmQ2MwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvQWJzdHJhY3RTZXJ2aWNlRmluZGVyQ29uZmlndXJhdG9yLmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKKworaW1wb3J0IGphdmF4LndzLnJzLlJ1bnRpbWVUeXBlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuQ29tbW9uUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKKworLyoqCisgKiBTaW1wbGUgU2VydmljZUZpbmRlciBjb25maWd1cmF0aW9uLgorICoKKyAqIExvb2tzIGZvciBhbGwgaW1wbGVtZW50YXRpb25zIG9mIGEgZ2l2ZW4gY29udHJhY3QgdXNpbmcge0BsaW5rIFNlcnZpY2VGaW5kZXJ9IGFuZCByZWdpc3RlcnMgZm91bmQgaW5zdGFuY2VzIHRvCisgKiB7QGxpbmsgSW5qZWN0aW9uTWFuYWdlcn0uCisgKgorICogQHBhcmFtIDxUPiBjb250cmFjdCB0eXBlLgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNlcnZpY2VGaW5kZXJDb25maWd1cmF0b3I8VD4gaW1wbGVtZW50cyBCb290c3RyYXBDb25maWd1cmF0b3IgeworCisgICAgcHJpdmF0ZSBmaW5hbCBDbGFzczxUPiBjb250cmFjdDsKKyAgICBwcml2YXRlIGZpbmFsIFJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGNvbmZpZ3VyYXRvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250cmFjdCAgICBjb250cmFjdCBvZiB0aGUgc2VydmljZSBwcm92aWRlcnMgYm91bmQgYnkgdGhpcyBiaW5kZXIuCisgICAgICogQHBhcmFtIHJ1bnRpbWVUeXBlIHJ1bnRpbWUgKGNsaWVudCBvciBzZXJ2ZXIpIHdoZXJlIHRoZSBzZXJ2aWNlIGZpbmRlciBiaW5kZXIgaXMgdXNlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQWJzdHJhY3RTZXJ2aWNlRmluZGVyQ29uZmlndXJhdG9yKENsYXNzPFQ+IGNvbnRyYWN0LCBSdW50aW1lVHlwZSBydW50aW1lVHlwZSkgeworICAgICAgICB0aGlzLmNvbnRyYWN0ID0gY29udHJhY3Q7CisgICAgICAgIHRoaXMucnVudGltZVR5cGUgPSBydW50aW1lVHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkIGFsbCBwYXJ0aWN1bGFyIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgdHlwZSB7QGNvZGUgVH0gdXNpbmcge0BsaW5rIFNlcnZpY2VGaW5kZXJ9LgorICAgICAqCisgICAgICogQHBhcmFtIGFwcGxpY2F0aW9uUHJvcGVydGllcyBtYXAgY29udGFpbmluZyBhcHBsaWNhdGlvbiBwcm9wZXJ0aWVzLiBNYXkgYmUge0Bjb2RlIG51bGx9CisgICAgICogQHJldHVybiBhbGwgcmVnaXN0ZXJlZCBjbGFzc2VzIG9mIHRoZSB0eXBlIHtAY29kZSBUfS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTGlzdDxDbGFzczxUPj4gbG9hZEltcGxlbWVudGF0aW9ucyhNYXA8U3RyaW5nLCBPYmplY3Q+IGFwcGxpY2F0aW9uUHJvcGVydGllcykgeworICAgICAgICBib29sZWFuIE1FVEFJTkZfU0VSVklDRVNfTE9PS1VQX0RJU0FCTEVfREVGQVVMVCA9IGZhbHNlOworICAgICAgICBib29sZWFuIGRpc2FibGVNZXRhSW5mU2VydmljZXNMb29rdXAgPSBNRVRBSU5GX1NFUlZJQ0VTX0xPT0tVUF9ESVNBQkxFX0RFRkFVTFQ7CisgICAgICAgIGlmIChhcHBsaWNhdGlvblByb3BlcnRpZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZGlzYWJsZU1ldGFJbmZTZXJ2aWNlc0xvb2t1cCA9IENvbW1vblByb3BlcnRpZXMuZ2V0VmFsdWUoYXBwbGljYXRpb25Qcm9wZXJ0aWVzLCBydW50aW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgQ29tbW9uUHJvcGVydGllcy5NRVRBSU5GX1NFUlZJQ0VTX0xPT0tVUF9ESVNBQkxFLCBNRVRBSU5GX1NFUlZJQ0VTX0xPT0tVUF9ESVNBQkxFX0RFRkFVTFQsIEJvb2xlYW4uY2xhc3MpOworICAgICAgICB9CisgICAgICAgIGlmICghZGlzYWJsZU1ldGFJbmZTZXJ2aWNlc0xvb2t1cCkgeworICAgICAgICAgICAgcmV0dXJuIFN0cmVhbS5vZihTZXJ2aWNlRmluZGVyLmZpbmQoY29udHJhY3QsIHRydWUpLnRvQ2xhc3NBcnJheSgpKQorICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9BdXRvRGlzY292ZXJhYmxlQ29uZmlndXJhdG9yLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL0F1dG9EaXNjb3ZlcmFibGVDb25maWd1cmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTY4MThkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9BdXRvRGlzY292ZXJhYmxlQ29uZmlndXJhdG9yLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IGphdmF4LndzLnJzLlJ1bnRpbWVUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5CaW5kaW5nczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5zcGkuQXV0b0Rpc2NvdmVyYWJsZTsKKworLyoqCisgKiBDb25maWd1cmF0b3Igd2hpY2ggaW5pdGlhbGl6ZXMgYW5kIHJlZ2lzdGVyIHtAbGluayBBdXRvRGlzY292ZXJhYmxlfSBpbnN0YW5jZXMgaW50byB7QGxpbmsgSW5qZWN0aW9uTWFuYWdlcn0gYW5kCisgKiB7QGxpbmsgQm9vdHN0cmFwQmFnfS4KKyAqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworcHVibGljIGNsYXNzIEF1dG9EaXNjb3ZlcmFibGVDb25maWd1cmF0b3IgZXh0ZW5kcyBBYnN0cmFjdFNlcnZpY2VGaW5kZXJDb25maWd1cmF0b3I8QXV0b0Rpc2NvdmVyYWJsZT4geworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGNvbmZpZ3VyYXRvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBydW50aW1lVHlwZSBydW50aW1lIChjbGllbnQgb3Igc2VydmVyKSB3aGVyZSB0aGUgc2VydmljZSBmaW5kZXIgYmluZGVyIGlzIHVzZWQuCisgICAgICovCisgICAgcHVibGljIEF1dG9EaXNjb3ZlcmFibGVDb25maWd1cmF0b3IoUnVudGltZVR5cGUgcnVudGltZVR5cGUpIHsKKyAgICAgICAgc3VwZXIoQXV0b0Rpc2NvdmVyYWJsZS5jbGFzcywgcnVudGltZVR5cGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGluaXQoSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyLCBCb290c3RyYXBCYWcgYm9vdHN0cmFwQmFnKSB7CisgICAgICAgIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IGJvb3RzdHJhcEJhZy5nZXRDb25maWd1cmF0aW9uKCk7CisgICAgICAgIExpc3Q8QXV0b0Rpc2NvdmVyYWJsZT4gYXV0b0Rpc2NvdmVyYWJsZXMgPSBsb2FkSW1wbGVtZW50YXRpb25zKGNvbmZpZ3VyYXRpb24uZ2V0UHJvcGVydGllcygpKS5zdHJlYW0oKQorICAgICAgICAgICAgICAgIC5wZWVrKGltcGxDbGFzcyAtPiBpbmplY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyKEJpbmRpbmdzLnNlcnZpY2UoaW1wbENsYXNzKS50byhBdXRvRGlzY292ZXJhYmxlLmNsYXNzKSkpCisgICAgICAgICAgICAgICAgLm1hcChpbmplY3Rpb25NYW5hZ2VyOjpjcmVhdGVBbmRJbml0aWFsaXplKQorICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCisgICAgICAgIGJvb3RzdHJhcEJhZy5zZXRBdXRvRGlzY292ZXJhYmxlcyhhdXRvRGlzY292ZXJhYmxlcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9Cb290c3RyYXBCYWcuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvQm9vdHN0cmFwQmFnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMzMDlmYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvQm9vdHN0cmFwQmFnLmphdmEKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuc3BpLkF1dG9EaXNjb3ZlcmFibGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5NZXNzYWdlQm9keVdvcmtlcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW9kZWwuaW50ZXJuYWwuTWFuYWdlZE9iamVjdHNGaW5hbGl6ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5pbnRlcm5hbC5SZXF1ZXN0U2NvcGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLkNvbnRleHRSZXNvbHZlcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLkV4Y2VwdGlvbk1hcHBlcnM7CisKKy8qKgorICogQSBob2xkZXIgdGhhdCBpcyB1c2VkIG9ubHkgZHVyaW5nIEplcnNleSBib290c3RyYXAgdG8ga2VlcCB0aGUgaW5zdGFuY2VzIG9mIHRoZSBnaXZlbiB0eXBlcyBhbmQgdGhlbiB1c2UgdGhlbSBkdXJpbmcgdGhlCisgKiBib290c3RyYXAuIFRoaXMgd29ya3MgYXMgYSByZXBsYWNlbWVudCBvZiBhbiBpbmplY3Rpb24gZnJhbWV3b3JrIGR1cmluZyBhIGJvb3RzdHJhcCBhbmQgaW50ZW50aW9uYWxseSBrZWVwcyBhbGwgbmVlZGVkIHR5cGVzIGluCisgKiBzZXBhcmF0ZSBmaWVsZHMgdG8gbWFrZSBzdHJvbmcgdHlwZSBuYXR1cmUgYW5kIHRvIHByZXNlcnZlIGEgY2xlYXIgdmlldyB3aGljaCB0eXBlcyBhcmUgbmVlZGVkIHRvIGluamVjdCB0byBvdGhlciBzZXJ2aWNlcy4KKyAqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworcHVibGljIGNsYXNzIEJvb3RzdHJhcEJhZyB7CisKKyAgICBwcml2YXRlIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbjsKKyAgICBwcml2YXRlIFJlcXVlc3RTY29wZSByZXF1ZXN0U2NvcGU7CisgICAgcHJpdmF0ZSBNZXNzYWdlQm9keVdvcmtlcnMgbWVzc2FnZUJvZHlXb3JrZXJzOworICAgIHByaXZhdGUgRXhjZXB0aW9uTWFwcGVycyBleGNlcHRpb25NYXBwZXJzOworICAgIHByaXZhdGUgQ29udGV4dFJlc29sdmVycyBjb250ZXh0UmVzb2x2ZXJzOworICAgIHByaXZhdGUgTWFuYWdlZE9iamVjdHNGaW5hbGl6ZXIgbWFuYWdlZE9iamVjdHNGaW5hbGl6ZXI7CisgICAgcHJpdmF0ZSBMaXN0PEF1dG9EaXNjb3ZlcmFibGU+IGF1dG9EaXNjb3ZlcmFibGVzOworCisgICAgLyoqCisgICAgICogR2V0cyBhIGxpc3Qgb2Yge0BsaW5rIEF1dG9EaXNjb3ZlcmFibGV9LgorICAgICAqCisgICAgICogQHJldHVybiBsaXN0IG9mIHtAbGluayBBdXRvRGlzY292ZXJhYmxlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxBdXRvRGlzY292ZXJhYmxlPiBnZXRBdXRvRGlzY292ZXJhYmxlcygpIHsKKyAgICAgICAgcmV0dXJuIGF1dG9EaXNjb3ZlcmFibGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYSBsaXN0IG9mIHtAbGluayBBdXRvRGlzY292ZXJhYmxlfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhdXRvRGlzY292ZXJhYmxlcyBsaXN0IG9mIHtAY29kZSBBdXRvRGlzY292ZXJhYmxlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRBdXRvRGlzY292ZXJhYmxlcyhMaXN0PEF1dG9EaXNjb3ZlcmFibGU+IGF1dG9EaXNjb3ZlcmFibGVzKSB7CisgICAgICAgIHRoaXMuYXV0b0Rpc2NvdmVyYWJsZXMgPSBhdXRvRGlzY292ZXJhYmxlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGFuIGluc3RhbmNlIG9mIHtAbGluayBNYW5hZ2VkT2JqZWN0c0ZpbmFsaXplcn0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSBNYW5hZ2VkT2JqZWN0c0ZpbmFsaXplcn0gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIE1hbmFnZWRPYmplY3RzRmluYWxpemVyIGdldE1hbmFnZWRPYmplY3RzRmluYWxpemVyKCkgeworICAgICAgICByZXR1cm4gbWFuYWdlZE9iamVjdHNGaW5hbGl6ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgTWFuYWdlZE9iamVjdHNGaW5hbGl6ZXJ9LgorICAgICAqCisgICAgICogQHBhcmFtIG1hbmFnZWRPYmplY3RzRmluYWxpemVyIHtAY29kZSBNYW5hZ2VkT2JqZWN0c0ZpbmFsaXplcn0gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWFuYWdlZE9iamVjdHNGaW5hbGl6ZXIoTWFuYWdlZE9iamVjdHNGaW5hbGl6ZXIgbWFuYWdlZE9iamVjdHNGaW5hbGl6ZXIpIHsKKyAgICAgICAgdGhpcy5tYW5hZ2VkT2JqZWN0c0ZpbmFsaXplciA9IG1hbmFnZWRPYmplY3RzRmluYWxpemVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFJlcXVlc3RTY29wZX0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSBSZXF1ZXN0U2NvcGV9IGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBSZXF1ZXN0U2NvcGUgZ2V0UmVxdWVzdFNjb3BlKCkgeworICAgICAgICByZXF1aXJlTm9uTnVsbChyZXF1ZXN0U2NvcGUsIFJlcXVlc3RTY29wZS5jbGFzcyk7CisgICAgICAgIHJldHVybiByZXF1ZXN0U2NvcGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgUmVxdWVzdFNjb3BlfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0U2NvcGUge0Bjb2RlIFJlcXVlc3RTY29wZX0gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVxdWVzdFNjb3BlKFJlcXVlc3RTY29wZSByZXF1ZXN0U2NvcGUpIHsKKyAgICAgICAgdGhpcy5yZXF1ZXN0U2NvcGUgPSByZXF1ZXN0U2NvcGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgTWVzc2FnZUJvZHlXb3JrZXJzfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIE1lc3NhZ2VCb2R5V29ya2Vyc30gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIE1lc3NhZ2VCb2R5V29ya2VycyBnZXRNZXNzYWdlQm9keVdvcmtlcnMoKSB7CisgICAgICAgIHJlcXVpcmVOb25OdWxsKG1lc3NhZ2VCb2R5V29ya2VycywgTWVzc2FnZUJvZHlXb3JrZXJzLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VCb2R5V29ya2VyczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGFuIGluc3RhbmNlIG9mIHtAbGluayBNZXNzYWdlQm9keVdvcmtlcnN9LgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2VCb2R5V29ya2VycyB7QGNvZGUgTWVzc2FnZUJvZHlXb3JrZXJzfSBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlQm9keVdvcmtlcnMoTWVzc2FnZUJvZHlXb3JrZXJzIG1lc3NhZ2VCb2R5V29ya2VycykgeworICAgICAgICB0aGlzLm1lc3NhZ2VCb2R5V29ya2VycyA9IG1lc3NhZ2VCb2R5V29ya2VyczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGFuIGluc3RhbmNlIG9mIHtAbGluayBDb25maWd1cmF0aW9ufS4KKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIENvbmZpZ3VyYXRpb259IGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgIHJlcXVpcmVOb25OdWxsKGNvbmZpZ3VyYXRpb24sIENvbmZpZ3VyYXRpb24uY2xhc3MpOworICAgICAgICByZXR1cm4gY29uZmlndXJhdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGFuIGluc3RhbmNlIG9mIHtAbGluayBDb25maWd1cmF0aW9ufS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uIHtAY29kZSBDb25maWd1cmF0aW9ufSBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25maWd1cmF0aW9uKENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgeworICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSBjb25maWd1cmF0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEV4Y2VwdGlvbk1hcHBlcnN9LgorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgRXhjZXB0aW9uTWFwcGVyc30gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIEV4Y2VwdGlvbk1hcHBlcnMgZ2V0RXhjZXB0aW9uTWFwcGVycygpIHsKKyAgICAgICAgcmVxdWlyZU5vbk51bGwoZXhjZXB0aW9uTWFwcGVycywgRXhjZXB0aW9uTWFwcGVycy5jbGFzcyk7CisgICAgICAgIHJldHVybiBleGNlcHRpb25NYXBwZXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEV4Y2VwdGlvbk1hcHBlcnN9LgorICAgICAqCisgICAgICogQHBhcmFtIGV4Y2VwdGlvbk1hcHBlcnMge0Bjb2RlIEV4Y2VwdGlvbk1hcHBlcnN9IGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEV4Y2VwdGlvbk1hcHBlcnMoRXhjZXB0aW9uTWFwcGVycyBleGNlcHRpb25NYXBwZXJzKSB7CisgICAgICAgIHRoaXMuZXhjZXB0aW9uTWFwcGVycyA9IGV4Y2VwdGlvbk1hcHBlcnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgQ29udGV4dFJlc29sdmVyc30uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSBDb250ZXh0UmVzb2x2ZXJzfSBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGV4dFJlc29sdmVycyBnZXRDb250ZXh0UmVzb2x2ZXJzKCkgeworICAgICAgICByZXF1aXJlTm9uTnVsbChjb250ZXh0UmVzb2x2ZXJzLCBDb250ZXh0UmVzb2x2ZXJzLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIGNvbnRleHRSZXNvbHZlcnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgQ29udGV4dFJlc29sdmVyc30uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dFJlc29sdmVycyB7QGNvZGUgQ29udGV4dFJlc29sdmVyc30gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Q29udGV4dFJlc29sdmVycyhDb250ZXh0UmVzb2x2ZXJzIGNvbnRleHRSZXNvbHZlcnMpIHsKKyAgICAgICAgdGhpcy5jb250ZXh0UmVzb2x2ZXJzID0gY29udGV4dFJlc29sdmVyczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayB3aGV0aGVyIHRoZSB2YWx1ZSBpcyBub3Qge0Bjb2RlIG51bGx9IHRoYXQgbWVhbnMgdGhhdCB0aGUgcHJvcGVyIHtAbGluayBCb290c3RyYXBDb25maWd1cmF0b3J9IGhhcyBub3QgYmVlbiBjb25maWd1cmVkCisgICAgICogb3IgaW4gYSB3cm9uZyBvcmRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvYmplY3QgdGVzdGVkIG9iamVjdC4KKyAgICAgKiBAcGFyYW0gdHlwZSAgIHR5cGUgb2YgdGhlIHRlc3RlZCBvYmplY3QuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHJlcXVpcmVOb25OdWxsKE9iamVjdCBvYmplY3QsIFR5cGUgdHlwZSkgeworICAgICAgICBPYmplY3RzLnJlcXVpcmVOb25OdWxsKG9iamVjdCwgdHlwZSArICIgaGFzIG5vdCBiZWVuIGFkZGVkIGludG8gQm9vdHN0cmFwQmFnIHlldCIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvQm9vdHN0cmFwQ29uZmlndXJhdG9yLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL0Jvb3RzdHJhcENvbmZpZ3VyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMTY0NTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL0Jvb3RzdHJhcENvbmZpZ3VyYXRvci5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKKworLyoqCisgKiBDb25maWd1cmF0b3Igd2hpY2ggY29udGFpbnMgdHdvIG1ldGhvZHMsIHtAbGluayAjaW5pdChJbmplY3Rpb25NYW5hZ2VyLCBCb290c3RyYXBCYWcpfSBjb250YWlucyB7QGxpbmsgSW5qZWN0aW9uTWFuYWdlcn0KKyAqIGludG8gd2hpY2ggb25seSByZWdpc3RlcmluZyBzZXJ2aWNlcyBtYWtlIHNlbnNlIGJlY2F1c2UgaW5qZWN0aW9uIG1hbmFnZXIgaGFzIG5vdCBiZWVuIGNvbXBsZXRlZCB5ZXQgYW5kCisgKiB7QGxpbmsgI3Bvc3RJbml0KEluamVjdGlvbk1hbmFnZXIsIEJvb3RzdHJhcEJhZyl9IGluIHdoaWNoIHtAbGluayBJbmplY3Rpb25NYW5hZ2VyfSBoYXMgYmVlbiBhbHJlYWR5IGNvbXBsZXRlZCBhbmQgaXMgYWJsZSB0bworICogY3JlYXRlIGFuZCBwcm92aWRlIHNlcnZpY2VzLgorICogPHA+CisgKiBUaGUgY29uZmlndXJhdG9ycyBzaG91bGQgcmVnaXN0ZXIgaW5zdGFuY2VzIGludG8ge0BsaW5rIEluamVjdGlvbk1hbmFnZXJ9IG9ubHkgaWYgdGhlIGluc3RhbmNlIG11c3QgYmUgcmVhbGx5IGluamVjdGFibGUgaWYKKyAqIHRoZSBpbnN0YW5jZSBjYW4gYmUgdXNlZCBpbnRlcm5hbGx5IHdpdGhvdXQgdGhlIGluamVjdGlvbiwgdGhlbiBleHRlbmQge0BsaW5rIEJvb3RzdHJhcEJhZ30gYW5kIHByb3BhZ2F0ZSB0aGUgaW5zdGFuY2UgdG8KKyAqIGNvcnJlY3Qgc2VydmljZXMgdXNpbmcgY29uc3RydWN0b3JzIG9yIG1ldGhvZHMgaW4gYSBwaGFzZSBvZiBKZXJzZXkgaW5pdGlhbGl6YXRpb24uCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQm9vdHN0cmFwQ29uZmlndXJhdG9yIHsKKworICAgIC8qKgorICAgICAqIFByZS1pbml0aWFsaXphdGlvbiBtZXRob2Qgc2hvdWxkIG9ubHkgcmVnaXN0ZXIgc2VydmljZXMgaW50byB7QGxpbmsgSW5qZWN0aW9uTWFuYWdlcn0gYW5kIHBvcHVsYXRlIHtAbGluayBCb290c3RyYXBCYWd9LgorICAgICAqCisgICAgICogQHBhcmFtIGluamVjdGlvbk1hbmFnZXIgbm90IGNvbXBsZXRlZCBpbmplY3Rpb24gbWFuYWdlci4KKyAgICAgKiBAcGFyYW0gYm9vdHN0cmFwQmFnICAgICBib290c3RyYXAgYmFnIHdpdGggc2VydmljZXMgdXNlZCBpbiBmb2xsb3dpbmcgcHJvY2Vzc2luZy4KKyAgICAgKi8KKyAgICB2b2lkIGluaXQoSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyLCBCb290c3RyYXBCYWcgYm9vdHN0cmFwQmFnKTsKKworICAgIC8qKgorICAgICAqIFBvc3QtaW5pdGlhbGl6YXRpb24gbWV0aG9kIGNhbiBnZXQgc2VydmljZXMgZnJvbSB7QGxpbmsgSW5qZWN0aW9uTWFuYWdlcn0gYW5kIGlzIG5vdCBhYmxlIHRvIHJlZ2lzdGVyIHRoZSBuZXcgb25lIGJlY2F1c2UKKyAgICAgKiBpbmplY3Rpb24gbWFuYWdlciBpcyBhbHJlYWR5IGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmplY3Rpb25NYW5hZ2VyIGFscmVhZHkgY29tcGxldGVkIGluamVjdGlvbiBtYW5hZ2VyLgorICAgICAqIEBwYXJhbSBib290c3RyYXBCYWcgICAgIGJvb3RzdHJhcCBiYWcgd2l0aCBzZXJ2aWNlcyB1c2VkIGluIGZvbGxvd2luZyBwcm9jZXNzaW5nLgorICAgICAqLworICAgIGRlZmF1bHQgdm9pZCBwb3N0SW5pdChJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIsIEJvb3RzdHJhcEJhZyBib290c3RyYXBCYWcpIHsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvQ29udGV4dFJlc29sdmVyRmFjdG9yeS5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9Db250ZXh0UmVzb2x2ZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE5N2FkZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvQ29udGV4dFJlc29sdmVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMjQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuQ29udGV4dFJlc29sdmVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkJpbmRpbmdzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbnN0YW5jZUJpbmRpbmc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5SZWZsZWN0aW9uSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUmVmbGVjdGlvbkhlbHBlci5EZWNsYXJpbmdDbGFzc0ludGVyZmFjZVBhaXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLktleUNvbXBhcmF0b3JIYXNoTWFwOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuTWVkaWFUeXBlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLk1lc3NhZ2VCb2R5RmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuQ29udGV4dFJlc29sdmVyczsKKworLyoqCisgKiBBIGZhY3RvcnkgaW1wbGVtZW50YXRpb24gZm9yIG1hbmFnaW5nIHtAbGluayBDb250ZXh0UmVzb2x2ZXJ9IGluc3RhbmNlcy4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQ29udGV4dFJlc29sdmVyRmFjdG9yeSBpbXBsZW1lbnRzIENvbnRleHRSZXNvbHZlcnMgeworCisgICAgLyoqCisgICAgICogQ29uZmlndXJhdG9yIHdoaWNoIGluaXRpYWxpemVzIGFuZCByZWdpc3RlciB7QGxpbmsgQ29udGV4dFJlc29sdmVyc30gaW5zdGFuY2UgaW50byB7QGxpbmsgSW5qZWN0aW9uTWFuYWdlcn0gYW5kCisgICAgICoge0BsaW5rIEJvb3RzdHJhcEJhZ30uCisgICAgICoKKyAgICAgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbnRleHRSZXNvbHZlcnNDb25maWd1cmF0b3IgaW1wbGVtZW50cyBCb290c3RyYXBDb25maWd1cmF0b3IgeworCisgICAgICAgIHByaXZhdGUgQ29udGV4dFJlc29sdmVyRmFjdG9yeSBjb250ZXh0UmVzb2x2ZXJGYWN0b3J5OworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBpbml0KEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciwgQm9vdHN0cmFwQmFnIGJvb3RzdHJhcEJhZykgeworICAgICAgICAgICAgY29udGV4dFJlc29sdmVyRmFjdG9yeSA9IG5ldyBDb250ZXh0UmVzb2x2ZXJGYWN0b3J5KCk7CisgICAgICAgICAgICBJbnN0YW5jZUJpbmRpbmc8Q29udGV4dFJlc29sdmVyRmFjdG9yeT4gYmluZGluZyA9CisgICAgICAgICAgICAgICAgICAgIEJpbmRpbmdzLnNlcnZpY2UoY29udGV4dFJlc29sdmVyRmFjdG9yeSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG8oQ29udGV4dFJlc29sdmVycy5jbGFzcyk7CisgICAgICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyKGJpbmRpbmcpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHBvc3RJbml0KEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciwgQm9vdHN0cmFwQmFnIGJvb3RzdHJhcEJhZykgeworICAgICAgICAgICAgY29udGV4dFJlc29sdmVyRmFjdG9yeS5pbml0aWFsaXplKGluamVjdGlvbk1hbmFnZXIuZ2V0QWxsSW5zdGFuY2VzKENvbnRleHRSZXNvbHZlci5jbGFzcykpOworICAgICAgICAgICAgYm9vdHN0cmFwQmFnLnNldENvbnRleHRSZXNvbHZlcnMoY29udGV4dFJlc29sdmVyRmFjdG9yeSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxUeXBlLCBNYXA8TWVkaWFUeXBlLCBDb250ZXh0UmVzb2x2ZXI+PiByZXNvbHZlciA9IG5ldyBIYXNoTWFwPD4oMyk7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8VHlwZSwgQ29uY3VycmVudEhhc2hNYXA8TWVkaWFUeXBlLCBDb250ZXh0UmVzb2x2ZXI+PiBjYWNoZSA9IG5ldyBIYXNoTWFwPD4oMyk7CisKKyAgICAvKioKKyAgICAgKiBQcml2YXRlIGNvbnN0cnVjdG9yIHRvIGFsbG93IHRvIGNyZWF0ZSB7QGxpbmsgQ29udGV4dFJlc29sdmVyRmFjdG9yeX0gb25seSBpbiB7QGxpbmsgQ29udGV4dFJlc29sdmVyc0NvbmZpZ3VyYXRvcn0uCisgICAgICovCisgICAgcHJpdmF0ZSBDb250ZXh0UmVzb2x2ZXJGYWN0b3J5KCl7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoTGlzdDxDb250ZXh0UmVzb2x2ZXI+IGNvbnRleHRSZXNvbHZlcnMpIHsKKyAgICAgICAgTWFwPFR5cGUsIE1hcDxNZWRpYVR5cGUsIExpc3Q8Q29udGV4dFJlc29sdmVyPj4+IHJzID0gbmV3IEhhc2hNYXA8PigpOworCisgICAgICAgIGZvciAoQ29udGV4dFJlc29sdmVyIHByb3ZpZGVyIDogY29udGV4dFJlc29sdmVycykgeworICAgICAgICAgICAgTGlzdDxNZWRpYVR5cGU+IG1zID0gTWVkaWFUeXBlcy5jcmVhdGVGcm9tKHByb3ZpZGVyLmdldENsYXNzKCkuZ2V0QW5ub3RhdGlvbihQcm9kdWNlcy5jbGFzcykpOworICAgICAgICAgICAgVHlwZSB0eXBlID0gZ2V0UGFyYW1ldGVyaXplZFR5cGUocHJvdmlkZXIuZ2V0Q2xhc3MoKSk7CisKKyAgICAgICAgICAgIE1hcDxNZWRpYVR5cGUsIExpc3Q8Q29udGV4dFJlc29sdmVyPj4gbXIgPSBycy5nZXQodHlwZSk7CisgICAgICAgICAgICBpZiAobXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1yID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICAgICAgICAgIHJzLnB1dCh0eXBlLCBtcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKE1lZGlhVHlwZSBtIDogbXMpIHsKKyAgICAgICAgICAgICAgICBMaXN0PENvbnRleHRSZXNvbHZlcj4gY3JsID0gbXIuZ2V0KG0pOworICAgICAgICAgICAgICAgIGlmIChjcmwgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjcmwgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgICAgICAgICAgICAgbXIucHV0KG0sIGNybCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNybC5hZGQocHJvdmlkZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmVkdWNlIHNldCBvZiB0d28gb3IgbW9yZSBjb250ZXh0IHJlc29sdmVycyBmb3Igc2FtZSB0eXBlIGFuZAorICAgICAgICAvLyBtZWRpYSB0eXBlCisKKyAgICAgICAgZm9yIChNYXAuRW50cnk8VHlwZSwgTWFwPE1lZGlhVHlwZSwgTGlzdDxDb250ZXh0UmVzb2x2ZXI+Pj4gZSA6IHJzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIE1hcDxNZWRpYVR5cGUsIENvbnRleHRSZXNvbHZlcj4gbXIgPSBuZXcgS2V5Q29tcGFyYXRvckhhc2hNYXA8Pig0LCBNZXNzYWdlQm9keUZhY3RvcnkuTUVESUFfVFlQRV9LRVlfQ09NUEFSQVRPUik7CisgICAgICAgICAgICByZXNvbHZlci5wdXQoZS5nZXRLZXkoKSwgbXIpOworICAgICAgICAgICAgY2FjaGUucHV0KGUuZ2V0S2V5KCksIG5ldyBDb25jdXJyZW50SGFzaE1hcDw+KDQpKTsKKworICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8TWVkaWFUeXBlLCBMaXN0PENvbnRleHRSZXNvbHZlcj4+IGYgOiBlLmdldFZhbHVlKCkuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgIG1yLnB1dChmLmdldEtleSgpLCByZWR1Y2UoZi5nZXRWYWx1ZSgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFR5cGUgZ2V0UGFyYW1ldGVyaXplZFR5cGUoZmluYWwgQ2xhc3M8Pz4gYykgeworICAgICAgICBmaW5hbCBEZWNsYXJpbmdDbGFzc0ludGVyZmFjZVBhaXIgcCA9IFJlZmxlY3Rpb25IZWxwZXIuZ2V0Q2xhc3MoCisgICAgICAgICAgICAgICAgYywgQ29udGV4dFJlc29sdmVyLmNsYXNzKTsKKworICAgICAgICBmaW5hbCBUeXBlW10gYXMgPSBSZWZsZWN0aW9uSGVscGVyLmdldFBhcmFtZXRlcml6ZWRUeXBlQXJndW1lbnRzKHApOworCisgICAgICAgIHJldHVybiAoYXMgIT0gbnVsbCkgPyBhc1swXSA6IE9iamVjdC5jbGFzczsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBOdWxsQ29udGV4dFJlc29sdmVyQWRhcHRlciBOVUxMX0NPTlRFWFRfUkVTT0xWRVIgPQorICAgICAgICAgICAgbmV3IE51bGxDb250ZXh0UmVzb2x2ZXJBZGFwdGVyKCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBOdWxsQ29udGV4dFJlc29sdmVyQWRhcHRlciBpbXBsZW1lbnRzIENvbnRleHRSZXNvbHZlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0Q29udGV4dChmaW5hbCBDbGFzcyB0eXBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgeWV0LiIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgQ29udGV4dFJlc29sdmVyQWRhcHRlciBpbXBsZW1lbnRzIENvbnRleHRSZXNvbHZlciB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0UmVzb2x2ZXJbXSBjcmE7CisKKyAgICAgICAgQ29udGV4dFJlc29sdmVyQWRhcHRlcihmaW5hbCBDb250ZXh0UmVzb2x2ZXIuLi4gY3JhKSB7CisgICAgICAgICAgICB0aGlzKHJlbW92ZU51bGwoY3JhKSk7CisgICAgICAgIH0KKworICAgICAgICBDb250ZXh0UmVzb2x2ZXJBZGFwdGVyKGZpbmFsIExpc3Q8Q29udGV4dFJlc29sdmVyPiBjcmwpIHsKKyAgICAgICAgICAgIHRoaXMuY3JhID0gY3JsLnRvQXJyYXkobmV3IENvbnRleHRSZXNvbHZlcltjcmwuc2l6ZSgpXSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRDb250ZXh0KGZpbmFsIENsYXNzIG9iamVjdFR5cGUpIHsKKyAgICAgICAgICAgIGZvciAoZmluYWwgQ29udGV4dFJlc29sdmVyIGNyIDogY3JhKSB7CisgICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIGZpbmFsIE9iamVjdCBjID0gY3IuZ2V0Q29udGV4dChvYmplY3RUeXBlKTsKKyAgICAgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQ29udGV4dFJlc29sdmVyIHJlZHVjZSgpIHsKKyAgICAgICAgICAgIGlmIChjcmEubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTF9DT05URVhUX1JFU09MVkVSOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNyYS5sZW5ndGggPT0gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBjcmFbMF07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxDb250ZXh0UmVzb2x2ZXI+IHJlbW92ZU51bGwoZmluYWwgQ29udGV4dFJlc29sdmVyLi4uIGNyYSkgeworICAgICAgICAgICAgZmluYWwgTGlzdDxDb250ZXh0UmVzb2x2ZXI+IGNybCA9IG5ldyBBcnJheUxpc3Q8PihjcmEubGVuZ3RoKTsKKyAgICAgICAgICAgIGZvciAoZmluYWwgQ29udGV4dFJlc29sdmVyIGNyIDogY3JhKSB7CisgICAgICAgICAgICAgICAgaWYgKGNyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY3JsLmFkZChjcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGNybDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgQ29udGV4dFJlc29sdmVyIHJlZHVjZShmaW5hbCBMaXN0PENvbnRleHRSZXNvbHZlcj4gcikgeworICAgICAgICBpZiAoci5zaXplKCkgPT0gMSkgeworICAgICAgICAgICAgcmV0dXJuIHIuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENvbnRleHRSZXNvbHZlckFkYXB0ZXIocik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFQ+IENvbnRleHRSZXNvbHZlcjxUPiByZXNvbHZlKGZpbmFsIFR5cGUgdCwgTWVkaWFUeXBlIG0pIHsKKyAgICAgICAgZmluYWwgQ29uY3VycmVudEhhc2hNYXA8TWVkaWFUeXBlLCBDb250ZXh0UmVzb2x2ZXI+IGNyTWFwQ2FjaGUgPSBjYWNoZS5nZXQodCk7CisgICAgICAgIGlmIChjck1hcENhY2hlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG0gPT0gbnVsbCkgeworICAgICAgICAgICAgbSA9IE1lZGlhVHlwZS5XSUxEQ0FSRF9UWVBFOworICAgICAgICB9CisKKyAgICAgICAgQ29udGV4dFJlc29sdmVyPFQ+IGNyID0gY3JNYXBDYWNoZS5nZXQobSk7CisgICAgICAgIGlmIChjciA9PSBudWxsKSB7CisgICAgICAgICAgICBmaW5hbCBNYXA8TWVkaWFUeXBlLCBDb250ZXh0UmVzb2x2ZXI+IGNyTWFwID0gcmVzb2x2ZXIuZ2V0KHQpOworCisgICAgICAgICAgICBpZiAobS5pc1dpbGRjYXJkVHlwZSgpKSB7CisgICAgICAgICAgICAgICAgY3IgPSBjck1hcC5nZXQoTWVkaWFUeXBlLldJTERDQVJEX1RZUEUpOworICAgICAgICAgICAgICAgIGlmIChjciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNyID0gTlVMTF9DT05URVhUX1JFU09MVkVSOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAobS5pc1dpbGRjYXJkU3VidHlwZSgpKSB7CisgICAgICAgICAgICAgICAgLy8gSW5jbHVkZSB4LCB4LyogYW5kICovKgorICAgICAgICAgICAgICAgIGZpbmFsIENvbnRleHRSZXNvbHZlcjxUPiBzdWJUeXBlV2lsZENhcmQgPSBjck1hcC5nZXQobSk7CisgICAgICAgICAgICAgICAgZmluYWwgQ29udGV4dFJlc29sdmVyPFQ+IHdpbGRDYXJkID0gY3JNYXAuZ2V0KE1lZGlhVHlwZS5XSUxEQ0FSRF9UWVBFKTsKKworICAgICAgICAgICAgICAgIGNyID0gbmV3IENvbnRleHRSZXNvbHZlckFkYXB0ZXIoc3ViVHlwZVdpbGRDYXJkLCB3aWxkQ2FyZCkucmVkdWNlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEluY2x1ZGUgeCwgeC8qIGFuZCAqLyoKKyAgICAgICAgICAgICAgICBmaW5hbCBDb250ZXh0UmVzb2x2ZXI8VD4gdHlwZSA9IGNyTWFwLmdldChtKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBDb250ZXh0UmVzb2x2ZXI8VD4gc3ViVHlwZVdpbGRDYXJkID0gY3JNYXAuZ2V0KG5ldyBNZWRpYVR5cGUobS5nZXRUeXBlKCksICIqIikpOworICAgICAgICAgICAgICAgIGZpbmFsIENvbnRleHRSZXNvbHZlcjxUPiB3aWxkQ2FyZCA9IGNyTWFwLmdldChNZWRpYVR5cGUuV0lMRENBUkRfVFlQRSk7CisKKyAgICAgICAgICAgICAgICBjciA9IG5ldyBDb250ZXh0UmVzb2x2ZXJBZGFwdGVyKHR5cGUsIHN1YlR5cGVXaWxkQ2FyZCwgd2lsZENhcmQpLnJlZHVjZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBDb250ZXh0UmVzb2x2ZXI8VD4gX2NyID0gY3JNYXBDYWNoZS5wdXRJZkFic2VudChtLCBjcik7CisgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhbHJlYWR5IGEgdmFsdWUgaW4gdGhlIGNhY2hlIHVzZSB0aGF0CisgICAgICAgICAgICAvLyBpbnN0YW5jZSwgYW5kIGRpc2NhcmQgdGhlIG5ldyBhbmQgcmVkdW5kYW50IGluc3RhbmNlLCB0bworICAgICAgICAgICAgLy8gZW5zdXJlIHRoZSBzYW1lIGluc3RhbmNlIGlzIGFsd2F5cyByZXR1cm5lZC4KKyAgICAgICAgICAgIC8vIFRoZSBjYWNoZWQgaW5zdGFuY2UgYW5kIHRoZSBuZXcgaW5zdGFuY2Ugd2lsbCBoYXZlIHRoZSBzYW1lCisgICAgICAgICAgICAvLyBmdW5jdGlvbmFsaXR5LgorICAgICAgICAgICAgaWYgKF9jciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY3IgPSBfY3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKGNyICE9IE5VTExfQ09OVEVYVF9SRVNPTFZFUikgPyBjciA6IG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9FcnJvcnMuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvRXJyb3JzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRmYWQzYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvRXJyb3JzLmphdmEKQEAgLTAsMCArMSw1MTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlEZXF1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuRGVxdWU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuU2V2ZXJpdHk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5Qcm9kdWNlcjsKKworLyoqCisgKiBFcnJvcnMgdXRpbGl0eSB1c2VkIHRvIGZpbGUgcHJvY2Vzc2luZyBtZXNzYWdlcyAoZS5nLiB2YWxpZGF0aW9uLCBwcm92aWRlciwgcmVzb3VyY2UgYnVpbGRpbmcgZXJyb3JzLCBoaW50KS4KKyAqIDxwLz4KKyAqIEVycm9yIGZpbGluZyBtZXRob2RzICh7QGNvZGUgI3dhcm5pbmd9LCB7QGNvZGUgI2Vycm9yfSwge0Bjb2RlICNmYXRhbH0pIGNhbiBiZSBpbnZva2VkIG9ubHkgaW4gdGhlICJlcnJvciBzY29wZSIgd2hpY2ggaXMKKyAqIGNyZWF0ZWQgYnkge0BsaW5rICNwcm9jZXNzKFByb2R1Y2VyKX0gb3IKKyAqIHtAbGluayAjcHJvY2Vzc1dpdGhFeGNlcHRpb24oUHJvZHVjZXIpfSBtZXRob2RzLiBGaWxlZCBlcnJvciBtZXNzYWdlcyBhcmUgcHJlc2VudCBhbHNvIGluIHRoaXMKKyAqIHNjb3BlLgorICogPHAvPgorICogVE9ETyBkbyBub3QgdXNlIHN0YXRpYyB0aHJlYWQgbG9jYWw/CisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBFcnJvcnMgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoRXJyb3JzLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUaHJlYWRMb2NhbDxFcnJvcnM+IGVycm9ycyA9IG5ldyBUaHJlYWRMb2NhbDxFcnJvcnM+KCk7CisKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gZXJyb3IgdG8gdGhlIGxpc3Qgb2YgbWVzc2FnZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSAgbWVzc2FnZSBvZiB0aGUgZXJyb3IuCisgICAgICogQHBhcmFtIHNldmVyaXR5IGluZGljYXRlcyBzZXZlcml0eSBvZiBhZGRlZCBlcnJvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZXJyb3IoZmluYWwgU3RyaW5nIG1lc3NhZ2UsIFNldmVyaXR5IHNldmVyaXR5KSB7CisgICAgICAgIGVycm9yKG51bGwsIG1lc3NhZ2UsIHNldmVyaXR5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYW4gZXJyb3IgdG8gdGhlIGxpc3Qgb2YgbWVzc2FnZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc291cmNlICAgc291cmNlIG9mIHRoZSBlcnJvci4KKyAgICAgKiBAcGFyYW0gbWVzc2FnZSAgbWVzc2FnZSBvZiB0aGUgZXJyb3IuCisgICAgICogQHBhcmFtIHNldmVyaXR5IGluZGljYXRlcyBzZXZlcml0eSBvZiBhZGRlZCBlcnJvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZXJyb3IoZmluYWwgT2JqZWN0IHNvdXJjZSwgZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIFNldmVyaXR5IHNldmVyaXR5KSB7CisgICAgICAgIGdldEluc3RhbmNlKCkuaXNzdWVzLmFkZChuZXcgRXJyb3JNZXNzYWdlKHNvdXJjZSwgbWVzc2FnZSwgc2V2ZXJpdHkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBmYXRhbCBlcnJvciB0byB0aGUgbGlzdCBvZiBtZXNzYWdlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzb3VyY2UgIHNvdXJjZSBvZiB0aGUgZXJyb3IuCisgICAgICogQHBhcmFtIG1lc3NhZ2UgbWVzc2FnZSBvZiB0aGUgZXJyb3IuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGZhdGFsKGZpbmFsIE9iamVjdCBzb3VyY2UsIGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIGVycm9yKHNvdXJjZSwgbWVzc2FnZSwgU2V2ZXJpdHkuRkFUQUwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIHdhcm5pbmcgdG8gdGhlIGxpc3Qgb2YgbWVzc2FnZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc291cmNlICBzb3VyY2Ugb2YgdGhlIGVycm9yLgorICAgICAqIEBwYXJhbSBtZXNzYWdlIG1lc3NhZ2Ugb2YgdGhlIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3YXJuaW5nKGZpbmFsIE9iamVjdCBzb3VyY2UsIGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIGVycm9yKHNvdXJjZSwgbWVzc2FnZSwgU2V2ZXJpdHkuV0FSTklORyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgaGludCB0byB0aGUgbGlzdCBvZiBtZXNzYWdlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzb3VyY2UgIHNvdXJjZSBvZiB0aGUgZXJyb3IuCisgICAgICogQHBhcmFtIG1lc3NhZ2UgbWVzc2FnZSBvZiB0aGUgZXJyb3IuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGhpbnQoZmluYWwgT2JqZWN0IHNvdXJjZSwgZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgZ2V0SW5zdGFuY2UoKS5pc3N1ZXMuYWRkKG5ldyBFcnJvck1lc3NhZ2Uoc291cmNlLCBtZXNzYWdlLCBTZXZlcml0eS5ISU5UKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9nIGVycm9ycyBhbmQgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZXJlIGFyZSBhbnkgZmF0YWwgaXNzdWVzIGRldGVjdGVkIGFuZAorICAgICAqIHRoZSB7QGNvZGUgdGhyb3dFeGNlcHRpb259IGZsYWcgaGFzIGJlZW4gc2V0IHRvIHtAY29kZSB0cnVlfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aHJvd0V4Y2VwdGlvbiBpZiBzZXQgdG8ge0Bjb2RlIHRydWV9LCBhbnkgZmF0YWwgaXNzdWVzIHdpbGwgY2F1c2UgYSB7QGxpbmsgRXJyb3JNZXNzYWdlc0V4Y2VwdGlvbn0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgdGhyb3duLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJvY2Vzc0Vycm9ycyhmaW5hbCBib29sZWFuIHRocm93RXhjZXB0aW9uKSB7CisgICAgICAgIGZpbmFsIExpc3Q8RXJyb3JNZXNzYWdlPiBlcnJvcnMgPSBuZXcgQXJyYXlMaXN0PEVycm9yTWVzc2FnZT4oRXJyb3JzLmVycm9ycy5nZXQoKS5pc3N1ZXMpOworICAgICAgICBib29sZWFuIGlzRmF0YWwgPSBsb2dFcnJvcnMoZXJyb3JzKTsKKyAgICAgICAgaWYgKHRocm93RXhjZXB0aW9uICYmIGlzRmF0YWwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvck1lc3NhZ2VzRXhjZXB0aW9uKGVycm9ycyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2cgZXJyb3JzIGFuZCByZXR1cm4gYSBzdGF0dXMgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgYSBmYXRhbCBpc3N1ZSBoYXMgYmVlbiBmb3VuZAorICAgICAqIGluIHRoZSBlcnJvciBjb2xsZWN0aW9uLgorICAgICAqIDxwPgorICAgICAqIFRoZSB7QGNvZGUgYWZ0ZXJNYXJrfSBmbGFnIGluZGljYXRlcyB3aGV0aGVyIG9ubHkgdGhvc2UgaXNzdWVzIHNob3VsZCBiZSBsb2dnZWQgdGhhdCB3ZXJlCisgICAgICogYWRkZWQgYWZ0ZXIgYSB7QGxpbmsgI21hcmsoKSBtYXJrIGhhcyBiZWVuIHNldH0uCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGFmdGVyTWFyayBpZiB7QGNvZGUgdHJ1ZX0sIG9ubHkgaXNzdWVzIGFkZGVkIGFmdGVyIGEgbWFyayBoYXMgYmVlbiBzZXQgYXJlIHJldHVybmVkLAorICAgICAqICAgICAgICAgICAgICAgICAgaWYge0Bjb2RlIGZhbHNlfSBhbGwgaXNzdWVzIGFyZSByZXR1cm5lZC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGVyZSBhcmUgYW55IGZhdGFsIGlzc3VlcyBwcmVzZW50IGluIHRoZSBjb2xsZWN0aW9uLCB7QGNvZGUgZmFsc2V9CisgICAgICogICAgICAgICBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGxvZ0Vycm9ycyhmaW5hbCBib29sZWFuIGFmdGVyTWFyaykgeworICAgICAgICByZXR1cm4gbG9nRXJyb3JzKGdldEluc3RhbmNlKCkuX2dldEVycm9yTWVzc2FnZXMoYWZ0ZXJNYXJrKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9nIHN1cHBsaWVkIGVycm9ycyBhbmQgcmV0dXJuIGEgc3RhdHVzIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIGEgZmF0YWwgaXNzdWUgaGFzIGJlZW4gZm91bmQKKyAgICAgKiBpbiB0aGUgZXJyb3IgY29sbGVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlcnJvcnMgYSBjb2xsZWN0aW9uIG9mIGVycm9ycyB0byBiZSBsb2dnZWQuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlcmUgYXJlIGFueSBmYXRhbCBpc3N1ZXMgcHJlc2VudCBpbiB0aGUgY29sbGVjdGlvbiwge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gbG9nRXJyb3JzKGZpbmFsIENvbGxlY3Rpb248RXJyb3JNZXNzYWdlPiBlcnJvcnMpIHsKKyAgICAgICAgYm9vbGVhbiBpc0ZhdGFsID0gZmFsc2U7CisKKyAgICAgICAgaWYgKCFlcnJvcnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGZhdGFscyA9IG5ldyBTdHJpbmdCdWlsZGVyKCJcbiIpOworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciB3YXJuaW5ncyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGhpbnRzID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworICAgICAgICAgICAgZm9yIChmaW5hbCBFcnJvck1lc3NhZ2UgZXJyb3IgOiBlcnJvcnMpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGVycm9yLmdldFNldmVyaXR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGQVRBTDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzRmF0YWwgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgZmF0YWxzLmFwcGVuZChMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9NU0coZXJyb3IuZ2V0TWVzc2FnZSgpKSkuYXBwZW5kKCdcbicpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgV0FSTklORzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzLmFwcGVuZChMb2NhbGl6YXRpb25NZXNzYWdlcy5XQVJOSU5HX01TRyhlcnJvci5nZXRNZXNzYWdlKCkpKS5hcHBlbmQoJ1xuJyk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBISU5UOgorICAgICAgICAgICAgICAgICAgICAgICAgaGludHMuYXBwZW5kKExvY2FsaXphdGlvbk1lc3NhZ2VzLkhJTlRfTVNHKGVycm9yLmdldE1lc3NhZ2UoKSkpLmFwcGVuZCgnXG4nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGlzRmF0YWwpIHsKKyAgICAgICAgICAgICAgICBMT0dHRVIuc2V2ZXJlKExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SU19BTkRfV0FSTklOR1NfREVURUNURUQoZmF0YWxzLmFwcGVuZCh3YXJuaW5ncykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoaGludHMpLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHdhcm5pbmdzLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBMT0dHRVIud2FybmluZyhMb2NhbGl6YXRpb25NZXNzYWdlcy5XQVJOSU5HU19ERVRFQ1RFRCh3YXJuaW5ncy50b1N0cmluZygpKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGhpbnRzLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBMT0dHRVIuY29uZmlnKExvY2FsaXphdGlvbk1lc3NhZ2VzLkhJTlRTX0RFVEVDVEVEKGhpbnRzLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gaXNGYXRhbDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIENoZWNrIHdoZXRoZXIgYSBmYXRhbCBlcnJvciBpcyBwcmVzZW50IGluIHRoZSBsaXN0IG9mIGFsbCBtZXNzYWdlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZXJlIGFyZSBhbnkgZmF0YWwgaXNzdWVzIGluIHRoaXMgZXJyb3IgY29udGV4dCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGZhdGFsSXNzdWVzRm91bmQoKSB7CisgICAgICAgIGZvciAoZmluYWwgRXJyb3JNZXNzYWdlIG1lc3NhZ2UgOiBnZXRJbnN0YW5jZSgpLmlzc3VlcykgeworICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZ2V0U2V2ZXJpdHkoKSA9PSBTZXZlcml0eS5GQVRBTCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZva2UgZ2l2ZW4gcHJvZHVjZXIgdGFzayBhbmQgZ2F0aGVyIGVycm9ycy4KKyAgICAgKiA8cC8+CisgICAgICogQWZ0ZXIgdGhlIHRhc2sgaXMgY29tcGxldGUgYWxsIGdhdGhlcmVkIGVycm9ycyBhcmUgbG9nZ2VkLiBObyBleGNlcHRpb24gaXMgdGhyb3duCisgICAgICogZXZlbiBpZiB0aGVyZSBpcyBhIGZhdGFsIGVycm9yIHByZXNlbnQgaW4gdGhlIGxpc3Qgb2YgZXJyb3JzLgorICAgICAqCisgICAgICogQHBhcmFtIHByb2R1Y2VyIHByb2R1Y2VyIHRhc2sgdG8gYmUgaW52b2tlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSByZXN1bHQgcHJvZHVjZWQgYnkgdGhlIHRhc2suCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8VD4gVCBwcm9jZXNzKGZpbmFsIFByb2R1Y2VyPFQ+IHByb2R1Y2VyKSB7CisgICAgICAgIHJldHVybiBwcm9jZXNzKHByb2R1Y2VyLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW52b2tlIGdpdmVuIGNhbGxhYmxlIHRhc2sgYW5kIGdhdGhlciBtZXNzYWdlcy4KKyAgICAgKiA8cC8+CisgICAgICogQWZ0ZXIgdGhlIHRhc2sgaXMgY29tcGxldGUgYWxsIGdhdGhlcmVkIGVycm9ycyBhcmUgbG9nZ2VkLiBBbnkgZXhjZXB0aW9uIHRocm93bgorICAgICAqIGJ5IHRoZSB0aHJvd2FibGUgaXMgcmUtdGhyb3duLgorICAgICAqCisgICAgICogQHBhcmFtIHRhc2sgY2FsbGFibGUgdGFzayB0byBiZSBpbnZva2VkLgorICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBwcm9kdWNlZCBieSB0aGUgdGFzay4KKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBleGNlcHRpb24gdGhyb3duIGJ5IHRoZSB0YXNrLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFQgcHJvY2VzcyhmaW5hbCBDYWxsYWJsZTxUPiB0YXNrKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHByb2Nlc3ModGFzaywgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW52b2tlIGdpdmVuIHByb2R1Y2VyIHRhc2sgYW5kIGdhdGhlciBtZXNzYWdlcy4KKyAgICAgKiA8cC8+CisgICAgICogQWZ0ZXIgdGhlIHRhc2sgaXMgY29tcGxldGUgYWxsIGdhdGhlcmVkIGVycm9ycyBhcmUgbG9nZ2VkLiBJZiB0aGVyZSBpcyBhIGZhdGFsIGVycm9yCisgICAgICogcHJlc2VudCBpbiB0aGUgbGlzdCBvZiBlcnJvcnMgYW4ge0BsaW5rIEVycm9yTWVzc2FnZXNFeGNlcHRpb24gZXhjZXB0aW9ufSBpcyB0aHJvd24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvZHVjZXIgcHJvZHVjZXIgdGFzayB0byBiZSBpbnZva2VkLgorICAgICAqIEByZXR1cm4gdGhlIHJlc3VsdCBwcm9kdWNlZCBieSB0aGUgdGFzay4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUPiBUIHByb2Nlc3NXaXRoRXhjZXB0aW9uKGZpbmFsIFByb2R1Y2VyPFQ+IHByb2R1Y2VyKSB7CisgICAgICAgIHJldHVybiBwcm9jZXNzKHByb2R1Y2VyLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZva2UgZ2l2ZW4gdGFzayBhbmQgZ2F0aGVyIG1lc3NhZ2VzLgorICAgICAqIDxwLz4KKyAgICAgKiBBZnRlciB0aGUgdGFzayBpcyBjb21wbGV0ZSBhbGwgZ2F0aGVyZWQgZXJyb3JzIGFyZSBsb2dnZWQuIE5vIGV4Y2VwdGlvbiBpcyB0aHJvd24KKyAgICAgKiBldmVuIGlmIHRoZXJlIGlzIGEgZmF0YWwgZXJyb3IgcHJlc2VudCBpbiB0aGUgbGlzdCBvZiBlcnJvcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFzayB0YXNrIHRvIGJlIGludm9rZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHByb2Nlc3MoZmluYWwgUnVubmFibGUgdGFzaykgeworICAgICAgICBwcm9jZXNzKG5ldyBQcm9kdWNlcjxWb2lkPigpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgVm9pZCBjYWxsKCkgeworICAgICAgICAgICAgICAgIHRhc2sucnVuKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0sIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZva2UgZ2l2ZW4gdGFzayBhbmQgZ2F0aGVyIG1lc3NhZ2VzLgorICAgICAqIDxwLz4KKyAgICAgKiBBZnRlciB0aGUgdGFzayBpcyBjb21wbGV0ZSBhbGwgZ2F0aGVyZWQgZXJyb3JzIGFyZSBsb2dnZWQuIElmIHRoZXJlIGlzIGEgZmF0YWwgZXJyb3IKKyAgICAgKiBwcmVzZW50IGluIHRoZSBsaXN0IG9mIGVycm9ycyBhbiB7QGxpbmsgRXJyb3JNZXNzYWdlc0V4Y2VwdGlvbiBleGNlcHRpb259IGlzIHRocm93bi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YXNrIHRhc2sgdG8gYmUgaW52b2tlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJvY2Vzc1dpdGhFeGNlcHRpb24oZmluYWwgUnVubmFibGUgdGFzaykgeworICAgICAgICBwcm9jZXNzKG5ldyBQcm9kdWNlcjxWb2lkPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFZvaWQgY2FsbCgpIHsKKyAgICAgICAgICAgICAgICB0YXNrLnJ1bigpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9LCB0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyA8VD4gVCBwcm9jZXNzKGZpbmFsIFByb2R1Y2VyPFQ+IHRhc2ssIGZpbmFsIGJvb2xlYW4gdGhyb3dFeGNlcHRpb24pIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBwcm9jZXNzKChDYWxsYWJsZTxUPikgdGFzaywgdGhyb3dFeGNlcHRpb24pOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyA8VD4gVCBwcm9jZXNzKGZpbmFsIENhbGxhYmxlPFQ+IHRhc2ssIGZpbmFsIGJvb2xlYW4gdGhyb3dFeGNlcHRpb24pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBFcnJvcnMgaW5zdGFuY2UgPSBlcnJvcnMuZ2V0KCk7CisgICAgICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKSB7CisgICAgICAgICAgICBpbnN0YW5jZSA9IG5ldyBFcnJvcnMoKTsKKyAgICAgICAgICAgIGVycm9ycy5zZXQoaW5zdGFuY2UpOworICAgICAgICB9CisgICAgICAgIGluc3RhbmNlLnByZVByb2Nlc3MoKTsKKworICAgICAgICBFeGNlcHRpb24gY2F1Z2h0ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiB0YXNrLmNhbGwoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIHJlKSB7CisgICAgICAgICAgICAvLyBJZiBhIHJ1bnRpbWUgZXhjZXB0aW9uIGlzIGNhdWdodCB0aGVuIHJlcG9ydCBlcnJvcnMgYW5kIHJldGhyb3cuCisgICAgICAgICAgICBjYXVnaHQgPSByZTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGluc3RhbmNlLnBvc3RQcm9jZXNzKHRocm93RXhjZXB0aW9uICYmIGNhdWdodCA9PSBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIHRocm93IGNhdWdodDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBFcnJvcnMgZ2V0SW5zdGFuY2UoKSB7CisgICAgICAgIGZpbmFsIEVycm9ycyBpbnN0YW5jZSA9IGVycm9ycy5nZXQoKTsKKyAgICAgICAgLy8gTm8gZXJyb3IgcHJvY2Vzc2luZyBpbiBzY29wZQorICAgICAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5OT19FUlJPUl9QUk9DRVNTSU5HX0lOX1NDT1BFKCkpOworICAgICAgICB9CisgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkgYnV0IGdpdmVuIHRoZSBmcmFnaWxlIG5hdHVyZSBvZgorICAgICAgICAvLyBzdGF0aWMgdGhyZWFkIGxvY2FsIHByb2JhYmx5IGJlc3QgdG8gYWRkIGl0IGluIGNhc2Ugc29tZSBpbnRlcm5hbHMgb2YKKyAgICAgICAgLy8gdGhpcyBjbGFzcyBjaGFuZ2UKKyAgICAgICAgaWYgKGluc3RhbmNlLnN0YWNrID09IDApIHsKKyAgICAgICAgICAgIGVycm9ycy5yZW1vdmUoKTsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuTk9fRVJST1JfUFJPQ0VTU0lOR19JTl9TQ09QRSgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW5zdGFuY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsaXN0IG9mIGFsbCBlcnJvciBtZXNzYWdlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbm9uLW51bGwgZXJyb3IgbWVzc2FnZSBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxFcnJvck1lc3NhZ2U+IGdldEVycm9yTWVzc2FnZXMoKSB7CisgICAgICAgIHJldHVybiBnZXRFcnJvck1lc3NhZ2VzKGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGxpc3Qgb2YgZXJyb3IgbWVzc2FnZXMuCisgICAgICogPHA+CisgICAgICogVGhlIHtAY29kZSBhZnRlck1hcmt9IGZsYWcgaW5kaWNhdGVzIHdoZXRoZXIgb25seSB0aG9zZSBpc3N1ZXMgc2hvdWxkIGJlIHJldHVybmVkIHRoYXQgd2VyZQorICAgICAqIGFkZGVkIGFmdGVyIGEge0BsaW5rICNtYXJrKCkgbWFyayBoYXMgYmVlbiBzZXR9LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZnRlck1hcmsgaWYge0Bjb2RlIHRydWV9LCBvbmx5IGlzc3VlcyBhZGRlZCBhZnRlciBhIG1hcmsgaGFzIGJlZW4gc2V0IGFyZSByZXR1cm5lZCwKKyAgICAgKiAgICAgICAgICAgICAgICAgIGlmIHtAY29kZSBmYWxzZX0gYWxsIGlzc3VlcyBhcmUgcmV0dXJuZWQuCisgICAgICogQHJldHVybiBub24tbnVsbCBlcnJvciBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxFcnJvck1lc3NhZ2U+IGdldEVycm9yTWVzc2FnZXMoZmluYWwgYm9vbGVhbiBhZnRlck1hcmspIHsKKyAgICAgICAgcmV0dXJuIGdldEluc3RhbmNlKCkuX2dldEVycm9yTWVzc2FnZXMoYWZ0ZXJNYXJrKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBtYXJrIGF0IGEgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgZXJyb3JzIG1lc3NhZ2VzIGxpc3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1hcmsoKSB7CisgICAgICAgIGdldEluc3RhbmNlKCkuX21hcmsoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSBwcmV2aW91c2x5IHNldCBtYXJrLCBpZiBhbnkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHVubWFyaygpIHsKKyAgICAgICAgZ2V0SW5zdGFuY2UoKS5fdW5tYXJrKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhbGwgaXNzdWVzIHRoYXQgaGF2ZSBiZWVuIGFkZGVkIHNpbmNlIHRoZSBsYXN0IG1hcmtlZCBwb3NpdGlvbiBhcyB3ZWxsIGFzCisgICAgICogcmVtb3ZlcyB0aGUgbGFzdCBtYXJrLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgZ2V0SW5zdGFuY2UoKS5fcmVzZXQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxFcnJvck1lc3NhZ2U+IGlzc3VlcyA9IG5ldyBBcnJheUxpc3Q8RXJyb3JNZXNzYWdlPigwKTsKKworICAgIHByaXZhdGUgRXJyb3JzKCkgeworICAgIH0KKworICAgIHByaXZhdGUgRGVxdWU8SW50ZWdlcj4gbWFyayA9IG5ldyBBcnJheURlcXVlPEludGVnZXI+KDQpOworICAgIHByaXZhdGUgaW50IHN0YWNrID0gMDsKKworICAgIHByaXZhdGUgdm9pZCBfbWFyaygpIHsKKyAgICAgICAgbWFyay5hZGRMYXN0KGlzc3Vlcy5zaXplKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfdW5tYXJrKCkgeworICAgICAgICBtYXJrLnBvbGxMYXN0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF9yZXNldCgpIHsKKyAgICAgICAgZmluYWwgSW50ZWdlciBfcG9zID0gbWFyay5wb2xsTGFzdCgpOyAvLyBhbHNvIHBlcmZvcm1zICJ1bm1hcmsiIGZ1bmN0aW9uYWxpdHkKKyAgICAgICAgZmluYWwgaW50IG1hcmtlZFBvcyA9IChfcG9zID09IG51bGwpID8gLTEgOiBfcG9zOworCisgICAgICAgIGlmIChtYXJrZWRQb3MgPj0gMCAmJiBtYXJrZWRQb3MgPCBpc3N1ZXMuc2l6ZSgpKSB7CisgICAgICAgICAgICBpc3N1ZXMuc3ViTGlzdChtYXJrZWRQb3MsIGlzc3Vlcy5zaXplKCkpLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJlUHJvY2VzcygpIHsKKyAgICAgICAgc3RhY2srKzsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcG9zdFByb2Nlc3MoYm9vbGVhbiB0aHJvd0V4Y2VwdGlvbikgeworICAgICAgICBzdGFjay0tOworCisgICAgICAgIGlmIChzdGFjayA9PSAwKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmICghaXNzdWVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRXJyb3JzKHRocm93RXhjZXB0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGVycm9ycy5yZW1vdmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgTGlzdDxFcnJvck1lc3NhZ2U+IF9nZXRFcnJvck1lc3NhZ2VzKGZpbmFsIGJvb2xlYW4gYWZ0ZXJNYXJrKSB7CisgICAgICAgIGlmIChhZnRlck1hcmspIHsKKyAgICAgICAgICAgIGZpbmFsIEludGVnZXIgX3BvcyA9IG1hcmsucGVla0xhc3QoKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBtYXJrZWRQb3MgPSAoX3BvcyA9PSBudWxsKSA/IC0xIDogX3BvczsKKworICAgICAgICAgICAgaWYgKG1hcmtlZFBvcyA+PSAwICYmIG1hcmtlZFBvcyA8IGlzc3Vlcy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChuZXcgQXJyYXlMaXN0PEVycm9yTWVzc2FnZT4oaXNzdWVzLnN1Ykxpc3QobWFya2VkUG9zLCBpc3N1ZXMuc2l6ZSgpKSkpOworICAgICAgICAgICAgfSAvLyBlbHNlIHJldHVybiBhbGwgZXJyb3JzCisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChuZXcgQXJyYXlMaXN0PEVycm9yTWVzc2FnZT4oaXNzdWVzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXJyb3IgbWVzc2FnZSBleGNlcHRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFcnJvck1lc3NhZ2VzRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEVycm9yTWVzc2FnZT4gbWVzc2FnZXM7CisKKyAgICAgICAgcHJpdmF0ZSBFcnJvck1lc3NhZ2VzRXhjZXB0aW9uKGZpbmFsIExpc3Q8RXJyb3JNZXNzYWdlPiBtZXNzYWdlcykgeworICAgICAgICAgICAgdGhpcy5tZXNzYWdlcyA9IG1lc3NhZ2VzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBlbmNvdW50ZXJlZCBlcnJvciBtZXNzYWdlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBlbmNvdW50ZXJlZCBlcnJvciBtZXNzYWdlcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBMaXN0PEVycm9yTWVzc2FnZT4gZ2V0TWVzc2FnZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbWVzc2FnZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmljIGVycm9yIG1lc3NhZ2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFcnJvck1lc3NhZ2UgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IHNvdXJjZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZXZlcml0eSBzZXZlcml0eTsKKworICAgICAgICBwcml2YXRlIEVycm9yTWVzc2FnZShmaW5hbCBPYmplY3Qgc291cmNlLCBmaW5hbCBTdHJpbmcgbWVzc2FnZSwgU2V2ZXJpdHkgc2V2ZXJpdHkpIHsKKyAgICAgICAgICAgIHRoaXMuc291cmNlID0gc291cmNlOworICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICAgICAgICAgIHRoaXMuc2V2ZXJpdHkgPSBzZXZlcml0eTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQge0BsaW5rIFNldmVyaXR5fS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBzZXZlcml0eSBvZiBjdXJyZW50IHtAY29kZSBFcnJvck1lc3NhZ2V9LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFNldmVyaXR5IGdldFNldmVyaXR5KCkgeworICAgICAgICAgICAgcmV0dXJuIHNldmVyaXR5OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBpc3N1ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBtZXNzYWdlIGRlc2NyaWJpbmcgdGhlIGlzc3VlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGlzc3VlIHNvdXJjZS4KKyAgICAgICAgICogPHAvPgorICAgICAgICAgKiBJZGVudGlmaWVzIHRoZSBvYmplY3Qgd2hlcmUgdGhlIGlzc3VlIHdhcyBmb3VuZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBzb3VyY2Ugb2YgdGhlIGlzc3VlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRTb3VyY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gc291cmNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICAgICAgaWYgKHRoaXMgPT0gbykgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRXJyb3JNZXNzYWdlIHRoYXQgPSAoRXJyb3JNZXNzYWdlKSBvOworCisgICAgICAgICAgICBpZiAobWVzc2FnZSAhPSBudWxsID8gIW1lc3NhZ2UuZXF1YWxzKHRoYXQubWVzc2FnZSkgOiB0aGF0Lm1lc3NhZ2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzZXZlcml0eSAhPSB0aGF0LnNldmVyaXR5KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsID8gIXNvdXJjZS5lcXVhbHModGhhdC5zb3VyY2UpIDogdGhhdC5zb3VyY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIGludCByZXN1bHQgPSBzb3VyY2UgIT0gbnVsbCA/IHNvdXJjZS5oYXNoQ29kZSgpIDogMDsKKyAgICAgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgKG1lc3NhZ2UgIT0gbnVsbCA/IG1lc3NhZ2UuaGFzaENvZGUoKSA6IDApOworICAgICAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyAoc2V2ZXJpdHkgIT0gbnVsbCA/IHNldmVyaXR5Lmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL0V4Y2VwdGlvbk1hcHBlckZhY3RvcnkuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvRXhjZXB0aW9uTWFwcGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZjg2YmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL0V4Y2VwdGlvbk1hcHBlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDMwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlBhcmFtZXRlcml6ZWRUeXBlOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlByb3h5OworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZVZhcmlhYmxlOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5FeGNlcHRpb25NYXBwZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQmluZGluZ3M7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0Lkluc3RhbmNlQmluZGluZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuUHJvdmlkZXJzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5TZXJ2aWNlSG9sZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUmVmbGVjdGlvbkhlbHBlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uQ2xhc3NUeXBlUGFpcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uTGF6eVZhbHVlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5WYWx1ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uVmFsdWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5FeGNlcHRpb25NYXBwZXJzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5FeHRlbmRlZEV4Y2VwdGlvbk1hcHBlcjsKKworLyoqCisgKiB7QGxpbmsgRXhjZXB0aW9uTWFwcGVycyBFeGNlcHRpb24gbWFwcGVyc30gaW1wbGVtZW50YXRpb24gdGhhdCBhZ2dyZWdhdGVzCisgKiBleGNlcHRpb24gbWFwcGVycyBhbmQgc2VydmVyIGFzIHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciBleGNlcHRpb24gbWFwcGVyCisgKiBpbnN0YW5jZSBsb29rdXAuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBTYW50aWFnbyBQZXJpY2FzLUdlZXJ0c2VuIChTYW50aWFnby5QZXJpY2FzR2VlcnRzZW4gYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgRXhjZXB0aW9uTWFwcGVyRmFjdG9yeSBpbXBsZW1lbnRzIEV4Y2VwdGlvbk1hcHBlcnMgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoRXhjZXB0aW9uTWFwcGVyRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOworCisgICAgLyoqCisgICAgICogQ29uZmlndXJhdG9yIHdoaWNoIGluaXRpYWxpemVzIGFuZCByZWdpc3RlciB7QGxpbmsgRXhjZXB0aW9uTWFwcGVyc30gaW5zdGFuY2UgaW50byB7QGxpbmsgSW5qZWN0aW9uTWFuYWdlcn0gYW5kCisgICAgICoge0BsaW5rIEJvb3RzdHJhcEJhZ30uCisgICAgICoKKyAgICAgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEV4Y2VwdGlvbk1hcHBlcnNDb25maWd1cmF0b3IgaW1wbGVtZW50cyBCb290c3RyYXBDb25maWd1cmF0b3IgeworCisgICAgICAgIHByaXZhdGUgRXhjZXB0aW9uTWFwcGVyRmFjdG9yeSBleGNlcHRpb25NYXBwZXJGYWN0b3J5OworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBpbml0KEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciwgQm9vdHN0cmFwQmFnIGJvb3RzdHJhcEJhZykgeworICAgICAgICAgICAgZXhjZXB0aW9uTWFwcGVyRmFjdG9yeSA9IG5ldyBFeGNlcHRpb25NYXBwZXJGYWN0b3J5KGluamVjdGlvbk1hbmFnZXIpOworICAgICAgICAgICAgSW5zdGFuY2VCaW5kaW5nPEV4Y2VwdGlvbk1hcHBlckZhY3Rvcnk+IGJpbmRpbmcgPQorICAgICAgICAgICAgICAgICAgICBCaW5kaW5ncy5zZXJ2aWNlKGV4Y2VwdGlvbk1hcHBlckZhY3RvcnkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvKEV4Y2VwdGlvbk1hcHBlcnMuY2xhc3MpOworICAgICAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5yZWdpc3RlcihiaW5kaW5nKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBwb3N0SW5pdChJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIsIEJvb3RzdHJhcEJhZyBib290c3RyYXBCYWcpIHsKKyAgICAgICAgICAgIGJvb3RzdHJhcEJhZy5zZXRFeGNlcHRpb25NYXBwZXJzKGV4Y2VwdGlvbk1hcHBlckZhY3RvcnkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRXhjZXB0aW9uTWFwcGVyVHlwZSB7CisKKyAgICAgICAgU2VydmljZUhvbGRlcjxFeGNlcHRpb25NYXBwZXI+IG1hcHBlcjsKKyAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFRocm93YWJsZT4gZXhjZXB0aW9uVHlwZTsKKworICAgICAgICBwdWJsaWMgRXhjZXB0aW9uTWFwcGVyVHlwZShmaW5hbCBTZXJ2aWNlSG9sZGVyPEV4Y2VwdGlvbk1hcHBlcj4gbWFwcGVyLCBmaW5hbCBDbGFzczw/IGV4dGVuZHMgVGhyb3dhYmxlPiBleGNlcHRpb25UeXBlKSB7CisgICAgICAgICAgICB0aGlzLm1hcHBlciA9IG1hcHBlcjsKKyAgICAgICAgICAgIHRoaXMuZXhjZXB0aW9uVHlwZSA9IGV4Y2VwdGlvblR5cGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIFZhbHVlPFNldDxFeGNlcHRpb25NYXBwZXJUeXBlPj4gZXhjZXB0aW9uTWFwcGVyVHlwZXM7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgPFQgZXh0ZW5kcyBUaHJvd2FibGU+IEV4Y2VwdGlvbk1hcHBlcjxUPiBmaW5kTWFwcGluZyhmaW5hbCBUIGV4Y2VwdGlvbkluc3RhbmNlKSB7CisgICAgICAgIHJldHVybiBmaW5kKChDbGFzczxUPikgZXhjZXB0aW9uSW5zdGFuY2UuZ2V0Q2xhc3MoKSwgZXhjZXB0aW9uSW5zdGFuY2UpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VCBleHRlbmRzIFRocm93YWJsZT4gRXhjZXB0aW9uTWFwcGVyPFQ+IGZpbmQoZmluYWwgQ2xhc3M8VD4gdHlwZSkgeworICAgICAgICByZXR1cm4gZmluZCh0eXBlLCBudWxsKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwcml2YXRlIDxUIGV4dGVuZHMgVGhyb3dhYmxlPiBFeGNlcHRpb25NYXBwZXI8VD4gZmluZChmaW5hbCBDbGFzczxUPiB0eXBlLCBmaW5hbCBUIGV4Y2VwdGlvbkluc3RhbmNlKSB7CisgICAgICAgIEV4Y2VwdGlvbk1hcHBlcjxUPiBtYXBwZXIgPSBudWxsOworICAgICAgICBpbnQgbWluRGlzdGFuY2UgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKKworICAgICAgICBmb3IgKGZpbmFsIEV4Y2VwdGlvbk1hcHBlclR5cGUgbWFwcGVyVHlwZSA6IGV4Y2VwdGlvbk1hcHBlclR5cGVzLmdldCgpKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgZCA9IGRpc3RhbmNlKHR5cGUsIG1hcHBlclR5cGUuZXhjZXB0aW9uVHlwZSk7CisgICAgICAgICAgICBpZiAoZCA+PSAwICYmIGQgPD0gbWluRGlzdGFuY2UpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBFeGNlcHRpb25NYXBwZXI8VD4gY2FuZGlkYXRlID0gbWFwcGVyVHlwZS5tYXBwZXIuZ2V0SW5zdGFuY2UoKTsKKworICAgICAgICAgICAgICAgIGlmIChpc1ByZWZlcnJlZENhbmRpZGF0ZShleGNlcHRpb25JbnN0YW5jZSwgY2FuZGlkYXRlLCBkID09IG1pbkRpc3RhbmNlKSkgeworICAgICAgICAgICAgICAgICAgICBtYXBwZXIgPSBjYW5kaWRhdGU7CisgICAgICAgICAgICAgICAgICAgIG1pbkRpc3RhbmNlID0gZDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2xpZ2h0IG9wdGltaXphdGlvbjogaWYgdGhlIGRpc3RhbmNlIGlzIDAsIGl0IGlzIGFscmVhZHkgdGhlIGJlc3QgY2FzZSwgc28gd2UgY2FuIGV4aXQKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXBwZXI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1hcHBlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGN1cnJlbnRseSBjb25zaWRlcmVkIGNhbmRpZGF0ZSBzaG91bGQgYmUgcHJlZmVycmVkIG92ZXIgdGhlIHByZXZpb3VzIG9uZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleGNlcHRpb25JbnN0YW5jZSBleGNlcHRpb24gdG8gYmUgbWFwcGVkLgorICAgICAqIEBwYXJhbSBjYW5kaWRhdGUgICAgICAgICBtYXBwZXIgYWJsZSB0byBtYXAgZ2l2ZW4gZXhjZXB0aW9uIHR5cGUuCisgICAgICogQHBhcmFtIHNhbWVEaXN0YW5jZSAgICAgIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgYW5kIHRoZSBwcmV2aW91c2x5IGNvbnNpZGVyZWQgY2FuZGlkYXRlIGFyZSBpbiB0aGUgc2FtZSBkaXN0YW5jZS4KKyAgICAgKiBAcGFyYW0gPFQ+ICAgICAgICAgICAgICAgZXhjZXB0aW9uIHR5cGUuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGdpdmVuIGNhbmRpZGF0ZSBpcyBwcmVmZXJyZWQgb3ZlciB0aGUgcHJldmlvdXMgb25lIHdpdGggdGhlIHNhbWUgb3IgbG93ZXIgZGlzdGFuY2UsCisgICAgICoge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHJpdmF0ZSA8VCBleHRlbmRzIFRocm93YWJsZT4gYm9vbGVhbiBpc1ByZWZlcnJlZENhbmRpZGF0ZShmaW5hbCBUIGV4Y2VwdGlvbkluc3RhbmNlLCBmaW5hbCBFeGNlcHRpb25NYXBwZXI8VD4gY2FuZGlkYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBzYW1lRGlzdGFuY2UpIHsKKyAgICAgICAgaWYgKGV4Y2VwdGlvbkluc3RhbmNlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChjYW5kaWRhdGUgaW5zdGFuY2VvZiBFeHRlbmRlZEV4Y2VwdGlvbk1hcHBlcikgeworICAgICAgICAgICAgcmV0dXJuICFzYW1lRGlzdGFuY2UKKyAgICAgICAgICAgICAgICAgICAgJiYgKChFeHRlbmRlZEV4Y2VwdGlvbk1hcHBlcjxUPikgY2FuZGlkYXRlKS5pc01hcHBhYmxlKGV4Y2VwdGlvbkluc3RhbmNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAhc2FtZURpc3RhbmNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyBleGNlcHRpb24gbWFwcGVyIGZhY3RvcnkgaW5pdGlhbGl6ZWQgd2l0aCB7QGxpbmsgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb24gbWFuYWdlcn0KKyAgICAgKiBpbnN0YW5jZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBsb29rIHVwIGFsbCBwcm92aWRlcnMgaW1wbGVtZW50aW5nIHtAbGluayBFeGNlcHRpb25NYXBwZXJ9IGludGVyZmFjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbiBtYW5hZ2VyLgorICAgICAqLworICAgIHB1YmxpYyBFeGNlcHRpb25NYXBwZXJGYWN0b3J5KEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlcikgeworICAgICAgICBleGNlcHRpb25NYXBwZXJUeXBlcyA9IGNyZWF0ZUxhenlFeGNlcHRpb25NYXBwZXJzKGluamVjdGlvbk1hbmFnZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMge0BsaW5rIExhenlWYWx1ZX0gb2YgZXhjZXB0aW9uIG1hcHBlcnMgdGhhdCBkZWxheXMgdGhlaXIgY3JlYXRpb24gdG8gdGhlIGZpcnN0IHVzZS4gVGhlIGV4Y2VwdGlvbiBtYXBwZXJzIHdvbid0IGJlCisgICAgICogY3JlYXRlZCBkdXJpbmcgYm9vdHN0cmFwIGJ1dCBhdCB0aGUgdGltZSBvZiB0aGUgZmlyc3QgY2FsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbiBtYW5hZ2VyIHRoYXQgbWF5IG5vdCBiZSBmdWxseSBwb3B1bGF0ZWQgYXQgdGhlIHRpbWUgb2YgYSBmdW5jdGlvbiBjYWxsIHRoZXJlZm9yZSB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgaXMgd3JhcHBlZCB0byBsYXp5IHZhbHVlLgorICAgICAqIEByZXR1cm4gbGF6eSB2YWx1ZSBvZiBleGNlcHRpb24gbWFwcGVycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIExhenlWYWx1ZTxTZXQ8RXhjZXB0aW9uTWFwcGVyVHlwZT4+IGNyZWF0ZUxhenlFeGNlcHRpb25NYXBwZXJzKEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlcikgeworICAgICAgICByZXR1cm4gVmFsdWVzLmxhenkoKFZhbHVlPFNldDxFeGNlcHRpb25NYXBwZXJUeXBlPj4pICgpIC0+IHsKKyAgICAgICAgICAgIENvbGxlY3Rpb248U2VydmljZUhvbGRlcjxFeGNlcHRpb25NYXBwZXI+PiBtYXBwZXJIYW5kbGVzID0KKyAgICAgICAgICAgICAgICAgICAgUHJvdmlkZXJzLmdldEFsbFNlcnZpY2VIb2xkZXJzKGluamVjdGlvbk1hbmFnZXIsIEV4Y2VwdGlvbk1hcHBlci5jbGFzcyk7CisKKyAgICAgICAgICAgIFNldDxFeGNlcHRpb25NYXBwZXJUeXBlPiBleGNlcHRpb25NYXBwZXJUeXBlcyA9IG5ldyBMaW5rZWRIYXNoU2V0PD4oKTsKKyAgICAgICAgICAgIGZvciAoU2VydmljZUhvbGRlcjxFeGNlcHRpb25NYXBwZXI+IG1hcHBlckhhbmRsZTogbWFwcGVySGFuZGxlcykgeworICAgICAgICAgICAgICAgIEV4Y2VwdGlvbk1hcHBlciBtYXBwZXIgPSBtYXBwZXJIYW5kbGUuZ2V0SW5zdGFuY2UoKTsKKworICAgICAgICAgICAgICAgIGlmIChQcm94eS5pc1Byb3h5Q2xhc3MobWFwcGVyLmdldENsYXNzKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIFNvcnRlZFNldDxDbGFzczw/IGV4dGVuZHMgRXhjZXB0aW9uTWFwcGVyPj4gbWFwcGVyVHlwZXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUcmVlU2V0PD4oKG8xLCBvMikgLT4gbzEuaXNBc3NpZ25hYmxlRnJvbShvMikgPyAtMSA6IDEpOworCisgICAgICAgICAgICAgICAgICAgIFNldDxUeXBlPiBjb250cmFjdHMgPSBtYXBwZXJIYW5kbGUuZ2V0Q29udHJhY3RUeXBlcygpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIFR5cGUgY29udHJhY3QgOiBjb250cmFjdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250cmFjdCBpbnN0YW5jZW9mIENsYXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIEV4Y2VwdGlvbk1hcHBlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKChDbGFzczw/PikgY29udHJhY3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGNvbnRyYWN0ICE9IEV4Y2VwdGlvbk1hcHBlci5jbGFzcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbm9pbnNwZWN0aW9uIHVuY2hlY2tlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlclR5cGVzLmFkZCgoQ2xhc3M8PyBleHRlbmRzIEV4Y2VwdGlvbk1hcHBlcj4pIGNvbnRyYWN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICghbWFwcGVyVHlwZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/IGV4dGVuZHMgVGhyb3dhYmxlPiBjID0gZ2V0RXhjZXB0aW9uVHlwZShtYXBwZXJUeXBlcy5maXJzdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25NYXBwZXJUeXBlcy5hZGQobmV3IEV4Y2VwdGlvbk1hcHBlclR5cGUobWFwcGVySGFuZGxlLCBjKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/IGV4dGVuZHMgVGhyb3dhYmxlPiBjID0gZ2V0RXhjZXB0aW9uVHlwZShtYXBwZXIuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbk1hcHBlclR5cGVzLmFkZChuZXcgRXhjZXB0aW9uTWFwcGVyVHlwZShtYXBwZXJIYW5kbGUsIGMpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBleGNlcHRpb25NYXBwZXJUeXBlczsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZGlzdGFuY2UoQ2xhc3M8Pz4gYywgZmluYWwgQ2xhc3M8Pz4gZW10YykgeworICAgICAgICBpbnQgZGlzdGFuY2UgPSAwOworICAgICAgICBpZiAoIWVtdGMuaXNBc3NpZ25hYmxlRnJvbShjKSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKGMgIT0gZW10YykgeworICAgICAgICAgICAgYyA9IGMuZ2V0U3VwZXJjbGFzcygpOworICAgICAgICAgICAgZGlzdGFuY2UrKzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBkaXN0YW5jZTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwcml2YXRlIENsYXNzPD8gZXh0ZW5kcyBUaHJvd2FibGU+IGdldEV4Y2VwdGlvblR5cGUoZmluYWwgQ2xhc3M8PyBleHRlbmRzIEV4Y2VwdGlvbk1hcHBlcj4gYykgeworICAgICAgICBmaW5hbCBDbGFzczw/PiB0ID0gZ2V0VHlwZShjKTsKKyAgICAgICAgaWYgKFRocm93YWJsZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHQpKSB7CisgICAgICAgICAgICByZXR1cm4gKENsYXNzPD8gZXh0ZW5kcyBUaHJvd2FibGU+KSB0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKExPR0dFUi5pc0xvZ2dhYmxlKExldmVsLldBUk5JTkcpKSB7CisgICAgICAgICAgICBMT0dHRVIud2FybmluZyhMb2NhbGl6YXRpb25NZXNzYWdlcy5FWENFUFRJT05fTUFQUEVSX1NVUFBPUlRFRF9UWVBFX1VOS05PV04oYy5nZXROYW1lKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBleGNlcHRpb24gdHlwZSBmb3IgZ2l2ZW4gZXhjZXB0aW9uIG1hcHBlciBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGF6eiBjbGFzcyB0byBnZXQgZXhjZXB0aW9uIHR5cGUgZm9yLgorICAgICAqIEByZXR1cm4gZXhjZXB0aW9uIHR5cGUgZm9yIGdpdmVuIGNsYXNzLgorICAgICAqLworICAgIHByaXZhdGUgQ2xhc3MgZ2V0VHlwZShmaW5hbCBDbGFzczw/IGV4dGVuZHMgRXhjZXB0aW9uTWFwcGVyPiBjbGF6eikgeworICAgICAgICBDbGFzcyBjbGF6ekhvbGRlciA9IGNsYXp6OworCisgICAgICAgIHdoaWxlIChjbGF6ekhvbGRlciAhPSBPYmplY3QuY2xhc3MpIHsKKyAgICAgICAgICAgIGZpbmFsIENsYXNzIHR5cGUgPSBnZXRUeXBlRnJvbUludGVyZmFjZShjbGF6ekhvbGRlciwgY2xhenopOworICAgICAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjbGF6ekhvbGRlciA9IGNsYXp6SG9sZGVyLmdldFN1cGVyY2xhc3MoKTsKKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX0ZJTkRJTkdfRVhDRVBUSU9OX01BUFBFUl9UWVBFKGNsYXp6KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXRlcmF0ZSB0aHJvdWdoIGludGVyZmFjZSBoaWVyYXJjaHkgb2Yge0Bjb2RlIGNsYXp6fSBhbmQgZ2V0IGV4Y2VwdGlvbiB0eXBlIGZvciBnaXZlbiBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGF6eiBjbGFzcyB0byBpbnNwZWN0LgorICAgICAqIEByZXR1cm4gZXhjZXB0aW9uIHR5cGUgZm9yIGdpdmVuIGNsYXNzIG9yIHtAY29kZSBudWxsfSBpZiB0aGUgY2xhc3MgZG9lc24ndCBpbXBsZW1lbnQge0Bjb2RlIEV4Y2VwdGlvbk1hcHBlcn0uCisgICAgICovCisgICAgcHJpdmF0ZSBDbGFzcyBnZXRUeXBlRnJvbUludGVyZmFjZShDbGFzczw/PiBjbGF6eiwgZmluYWwgQ2xhc3M8PyBleHRlbmRzIEV4Y2VwdGlvbk1hcHBlcj4gb3JpZ2luYWwpIHsKKyAgICAgICAgZmluYWwgVHlwZVtdIHR5cGVzID0gY2xhenouZ2V0R2VuZXJpY0ludGVyZmFjZXMoKTsKKworICAgICAgICBmb3IgKGZpbmFsIFR5cGUgdHlwZSA6IHR5cGVzKSB7CisgICAgICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRUeXBlKSB7CisgICAgICAgICAgICAgICAgZmluYWwgUGFyYW1ldGVyaXplZFR5cGUgcHQgPSAoUGFyYW1ldGVyaXplZFR5cGUpIHR5cGU7CisgICAgICAgICAgICAgICAgaWYgKHB0LmdldFJhd1R5cGUoKSA9PSBFeGNlcHRpb25NYXBwZXIuY2xhc3MKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHB0LmdldFJhd1R5cGUoKSA9PSBFeHRlbmRlZEV4Y2VwdGlvbk1hcHBlci5jbGFzcykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0UmVzb2x2ZWRUeXBlKHB0LmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKVswXSwgb3JpZ2luYWwsIGNsYXp6KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBDbGFzczw/PikgeworICAgICAgICAgICAgICAgIGNsYXp6ID0gKENsYXNzPD8+KSB0eXBlOworCisgICAgICAgICAgICAgICAgaWYgKEV4Y2VwdGlvbk1hcHBlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNsYXp6KSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0VHlwZUZyb21JbnRlcmZhY2UoY2xhenosIG9yaWdpbmFsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIENsYXNzIGdldFJlc29sdmVkVHlwZShmaW5hbCBUeXBlIHQsIGZpbmFsIENsYXNzIGMsIGZpbmFsIENsYXNzIGRjKSB7CisgICAgICAgIGlmICh0IGluc3RhbmNlb2YgQ2xhc3MpIHsKKyAgICAgICAgICAgIHJldHVybiAoQ2xhc3MpIHQ7CisgICAgICAgIH0gZWxzZSBpZiAodCBpbnN0YW5jZW9mIFR5cGVWYXJpYWJsZSkgeworICAgICAgICAgICAgZmluYWwgQ2xhc3NUeXBlUGFpciBjdCA9IFJlZmxlY3Rpb25IZWxwZXIucmVzb2x2ZVR5cGVWYXJpYWJsZShjLCBkYywgKFR5cGVWYXJpYWJsZSkgdCk7CisgICAgICAgICAgICBpZiAoY3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBjdC5yYXdDbGFzcygpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh0IGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFR5cGUpIHsKKyAgICAgICAgICAgIGZpbmFsIFBhcmFtZXRlcml6ZWRUeXBlIHB0ID0gKFBhcmFtZXRlcml6ZWRUeXBlKSB0OworICAgICAgICAgICAgcmV0dXJuIChDbGFzcykgcHQuZ2V0UmF3VHlwZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL0ludGVybmFsUHJvcGVydGllcy5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9JbnRlcm5hbFByb3BlcnRpZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWY4NWVkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9JbnRlcm5hbFByb3BlcnRpZXMuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5Qcm9wZXJ0aWVzQ2xhc3M7CisKKy8qKgorICogSW50ZXJuYWwgY29tbW9uIChzZXJ2ZXIvY2xpZW50KSBKZXJzZXkgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUHJvcGVydGllc0NsYXNzCitwdWJsaWMgY2xhc3MgSW50ZXJuYWxQcm9wZXJ0aWVzIHsKKworICAgIC8qKgorICAgICAqIFRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIHNldCBieSBjb25maWd1cmVkIEpTT04gZmVhdHVyZSB0byBpbmRpY2F0ZSB0aGF0IG90aGVyIChyZWdpc3RlcmVkIGJ1dCBub3QgY29uZmlndXJlZCkgSlNPTiBmZWF0dXJlcworICAgICAqIHNob3VsZCBub3QgYmUgY29uZmlndXJlZC4KKyAgICAgKiA8cC8+CisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaXMgPHR0PntAdmFsdWV9PC90dD4uCisgICAgICoKKyAgICAgKiBAc2luY2UgMi45CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9GRUFUVVJFID0gImplcnNleS5jb25maWcuanNvbkZlYXR1cmUiOworCisgICAgLyoqCisgICAgICogQ2xpZW50LXNwZWNpZmljIHZlcnNpb24gb2Yge0BsaW5rIEludGVybmFsUHJvcGVydGllcyNKU09OX0ZFQVRVUkV9LgorICAgICAqIDxwLz4KKyAgICAgKiBJZiBwcmVzZW50LCBpdCBvdmVycmlkZXMgdGhlIGdlbmVyaWMgb25lIGZvciB0aGUgY2xpZW50IGVudmlyb25tZW50LgorICAgICAqCisgICAgICogQHNpbmNlIDIuOQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fRkVBVFVSRV9DTElFTlQgPSAiamVyc2V5LmNvbmZpZy5jbGllbnQuanNvbkZlYXR1cmUiOworCisgICAgLyoqCisgICAgICogU2VydmVyLXNwZWNpZmljIHZlcnNpb24gb2Yge0BsaW5rIEludGVybmFsUHJvcGVydGllcyNKU09OX0ZFQVRVUkV9LgorICAgICAqIDxwLz4KKyAgICAgKiBJZiBwcmVzZW50LCBpdCBvdmVycmlkZXMgdGhlIGdlbmVyaWMgb25lIGZvciB0aGUgc2VydmVyIGVudmlyb25tZW50LgorICAgICAqCisgICAgICogQHNpbmNlIDIuOQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fRkVBVFVSRV9TRVJWRVIgPSAiamVyc2V5LmNvbmZpZy5zZXJ2ZXIuanNvbkZlYXR1cmUiOworCisgICAgLyoqCisgICAgICogUHJldmVudCBpbnN0YW50aWF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgSW50ZXJuYWxQcm9wZXJ0aWVzKCkgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvSmF4cnNQcm92aWRlcnMuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvSmF4cnNQcm92aWRlcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTliMWU1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9KYXhyc1Byb3ZpZGVycy5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuQ29udGV4dFJlc29sdmVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5FeGNlcHRpb25NYXBwZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXJzOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQmluZGluZ3M7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LlBlckxvb2t1cDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLk1lc3NhZ2VCb2R5V29ya2VyczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuQ29udGV4dFJlc29sdmVyczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuRXhjZXB0aW9uTWFwcGVyczsKKworLyoqCisgKiBKZXJzZXkgaW1wbGVtZW50YXRpb24gb2YgSkFYLVJTIHtAbGluayBQcm92aWRlcnN9IGNvbnRyYWN0LgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBKYXhyc1Byb3ZpZGVycyBpbXBsZW1lbnRzIFByb3ZpZGVycyB7CisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmF0b3Igd2hpY2ggaW5pdGlhbGl6ZXMgYW5kIHJlZ2lzdGVycyB7QGxpbmsgUHJvdmlkZXJzfSBpbnN0YW5jZSBpbnRvIHtAbGluayBJbmplY3Rpb25NYW5hZ2VyfSBhbmQKKyAgICAgKiB7QGxpbmsgQm9vdHN0cmFwQmFnfS4KKyAgICAgKiBJbnN0YW5jZXMgb2YgdGhlc2UgaW50ZXJmYWNlcyBhcmUgcHJvY2Vzc2VkLCBjb25maWd1cmVkIGFuZCBwcm92aWRlZCB1c2luZyB0aGlzIGNvbmZpZ3VyYXRvcjoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAbGluayBQcm92aWRlcnN9PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHJvdmlkZXJzQ29uZmlndXJhdG9yIGltcGxlbWVudHMgQm9vdHN0cmFwQ29uZmlndXJhdG9yeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBpbml0KEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciwgQm9vdHN0cmFwQmFnIGJvb3RzdHJhcEJhZykgeworICAgICAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5yZWdpc3RlcigKKyAgICAgICAgICAgICAgICAgICAgQmluZGluZ3Muc2VydmljZShKYXhyc1Byb3ZpZGVycy5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG8oUHJvdmlkZXJzLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbihQZXJMb29rdXAuY2xhc3MpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBJbmplY3QKKyAgICBwcml2YXRlIFByb3ZpZGVyPE1lc3NhZ2VCb2R5V29ya2Vycz4gd29ya2VyczsKKyAgICBASW5qZWN0CisgICAgcHJpdmF0ZSBQcm92aWRlcjxDb250ZXh0UmVzb2x2ZXJzPiByZXNvbHZlcnM7CisgICAgQEluamVjdAorICAgIHByaXZhdGUgUHJvdmlkZXI8RXhjZXB0aW9uTWFwcGVycz4gbWFwcGVyczsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gTWVzc2FnZUJvZHlSZWFkZXI8VD4gZ2V0TWVzc2FnZUJvZHlSZWFkZXIoQ2xhc3M8VD4gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiB3b3JrZXJzLmdldCgpLmdldE1lc3NhZ2VCb2R5UmVhZGVyKHR5cGUsIGdlbmVyaWNUeXBlLCBhbm5vdGF0aW9ucywgbWVkaWFUeXBlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFQ+IE1lc3NhZ2VCb2R5V3JpdGVyPFQ+IGdldE1lc3NhZ2VCb2R5V3JpdGVyKENsYXNzPFQ+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICByZXR1cm4gd29ya2Vycy5nZXQoKS5nZXRNZXNzYWdlQm9keVdyaXRlcih0eXBlLCBnZW5lcmljVHlwZSwgYW5ub3RhdGlvbnMsIG1lZGlhVHlwZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxUIGV4dGVuZHMgVGhyb3dhYmxlPiBFeGNlcHRpb25NYXBwZXI8VD4gZ2V0RXhjZXB0aW9uTWFwcGVyKENsYXNzPFQ+IHR5cGUpIHsKKyAgICAgICAgLy8gZXhjZXB0aW9uIG1hcHBlcnMgYXJlIG5vdCBzdXBwb3J0ZWQgb24gdGhlIGNsaWVudCBzaWRlCisgICAgICAgIGZpbmFsIEV4Y2VwdGlvbk1hcHBlcnMgYWN0dWFsTWFwcGVycyA9IG1hcHBlcnMuZ2V0KCk7CisgICAgICAgIHJldHVybiAoYWN0dWFsTWFwcGVycyAhPSBudWxsKSA/IGFjdHVhbE1hcHBlcnMuZmluZCh0eXBlKSA6IG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxUPiBDb250ZXh0UmVzb2x2ZXI8VD4gZ2V0Q29udGV4dFJlc29sdmVyKENsYXNzPFQ+IGNvbnRleHRUeXBlLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiByZXNvbHZlcnMuZ2V0KCkucmVzb2x2ZShjb250ZXh0VHlwZSwgbWVkaWFUeXBlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL01hcFByb3BlcnRpZXNEZWxlZ2F0ZS5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9NYXBQcm9wZXJ0aWVzRGVsZWdhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWY4MTEzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9NYXBQcm9wZXJ0aWVzRGVsZWdhdGUuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogUHJvcGVydGllcyBkZWxlZ2F0ZSBiYWNrZWQgYnkgYSB7QGNvZGUgTWFwfS4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTWFwUHJvcGVydGllc0RlbGVnYXRlIGltcGxlbWVudHMgUHJvcGVydGllc0RlbGVnYXRlIHsKKworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBzdG9yZTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgbWFwLWJhc2VkIHByb3BlcnRpZXMgZGVsZWdhdGUuCisgICAgICovCisgICAgcHVibGljIE1hcFByb3BlcnRpZXNEZWxlZ2F0ZSgpIHsKKyAgICAgICAgdGhpcy5zdG9yZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgbWFwLWJhc2VkIHByb3BlcnRpZXMgZGVsZWdhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RvcmUgYmFja2luZyBwcm9wZXJ0eSBzdG9yZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwUHJvcGVydGllc0RlbGVnYXRlKE1hcDxTdHJpbmcsIE9iamVjdD4gc3RvcmUpIHsKKyAgICAgICAgdGhpcy5zdG9yZSA9IHN0b3JlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgbmV3IG1hcC1iYXNlZCBwcm9wZXJ0aWVzIGRlbGVnYXRlIGZyb20gYW5vdGhlcgorICAgICAqIGRlbGVnYXRlLgorICAgICAqCisgICAgICogQHBhcmFtIHRoYXQgb3JpZ2luYWwgcHJvcGVydGllcyBkZWxlZ2F0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwUHJvcGVydGllc0RlbGVnYXRlKFByb3BlcnRpZXNEZWxlZ2F0ZSB0aGF0KSB7CisgICAgICAgIGlmICh0aGF0IGluc3RhbmNlb2YgTWFwUHJvcGVydGllc0RlbGVnYXRlKSB7CisgICAgICAgICAgICB0aGlzLnN0b3JlID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCgoTWFwUHJvcGVydGllc0RlbGVnYXRlKSB0aGF0KS5zdG9yZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLnN0b3JlID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBuYW1lIDogdGhhdC5nZXRQcm9wZXJ0eU5hbWVzKCkpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnB1dChuYW1lLCB0aGF0LmdldFByb3BlcnR5KG5hbWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIHN0b3JlLmdldChuYW1lKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxTdHJpbmc+IGdldFByb3BlcnR5TmFtZXMoKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKHN0b3JlLmtleVNldCgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIHN0b3JlLnB1dChuYW1lLCB2YWx1ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHkoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3RvcmUucmVtb3ZlKG5hbWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvT3NnaVJlZ2lzdHJ5LmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL09zZ2lSZWdpc3RyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NmZlZTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL09zZ2lSZWdpc3RyeS5qYXZhCkBAIC0wLDAgKzEsNjAzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydHlSZXNvdXJjZUJ1bmRsZTsKK2ltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVhZFdyaXRlTG9jazsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRSZWFkV3JpdGVMb2NrOworaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7CitpbXBvcnQgamF2YS51dGlsLmphci5KYXJJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5SZWZsZWN0aW9uSGVscGVyOworCitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZTsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlRXZlbnQ7CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuRnJhbWV3b3JrVXRpbDsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuU3luY2hyb25vdXNCdW5kbGVMaXN0ZW5lcjsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIHRvIGRlYWwgd2l0aCBPU0dpIHJ1bnRpbWUgc3BlY2lmaWMgYmVoYXZpb3IuCisgKiBUaGlzIGlzIG1haW5seSB0byBoYW5kbGUgTUVUQS1JTkYvc2VydmljZXMgbG9va3VwCisgKiBhbmQgZ2VuZXJpYy9hcHBsaWNhdGlvbiBjbGFzcyBsb29rdXAgaXNzdWUgaW4gT1NHaS4KKyAqCisgKiBXaGVuIE9TR2kgcnVudGltZSBpcyBkZXRlY3RlZCBieSB0aGUge0BsaW5rIFNlcnZpY2VGaW5kZXJ9IGNsYXNzLAorICogYW4gaW5zdGFuY2Ugb2YgT3NnaVJlZ2lzdHJ5IGlzIGNyZWF0ZWQgYW5kIGFzc29jaWF0ZWQgd2l0aCBnaXZlbgorICogT1NHaSBCdW5kbGVDb250ZXh0LiBNRVRBLUlORi9zZXJ2aWNlcyBlbnRyaWVzIGFyZSB0aGVuIGJlaW5nIGFjY2Vzc2VkCisgKiB2aWEgdGhlIE9TR2kgQnVuZGxlIEFQSSBhcyBkaXJlY3QgQ2xhc3NMb2FkZXIjZ2V0UmVzb3VyY2UoKSBtZXRob2QgaW52b2NhdGlvbgorICogZG9lcyBub3Qgd29yayBpbiB0aGlzIGNhc2Ugd2l0aGluIE9TR2kuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE9zZ2lSZWdpc3RyeSBpbXBsZW1lbnRzIFN5bmNocm9ub3VzQnVuZGxlTGlzdGVuZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFdFQl9JTkZfQ0xBU1NFUyA9ICJXRUItSU5GL2NsYXNzZXMvIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ29yZUJ1bmRsZVN5bWJvbGljTkFNRSA9ICJvcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlLmplcnNleS1jb21tb24iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKE9zZ2lSZWdpc3RyeS5jbGFzcy5nZXROYW1lKCkpOworCisgICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGVDb250ZXh0IGJ1bmRsZUNvbnRleHQ7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8TG9uZywgTWFwPFN0cmluZywgQ2FsbGFibGU8TGlzdDxDbGFzczw/Pj4+Pj4gZmFjdG9yaWVzID0KKyAgICAgICAgICAgIG5ldyBIYXNoTWFwPExvbmcsIE1hcDxTdHJpbmcsIENhbGxhYmxlPExpc3Q8Q2xhc3M8Pz4+Pj4+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBSZWFkV3JpdGVMb2NrIGxvY2sgPSBuZXcgUmVlbnRyYW50UmVhZFdyaXRlTG9jaygpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgT3NnaVJlZ2lzdHJ5IGluc3RhbmNlOworCisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBCdW5kbGU+IGNsYXNzVG9CdW5kbGVNYXBwaW5nID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBCdW5kbGU+KCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIHtAY29kZSBPc2dpUmVnaXN0cnl9IGluc3RhbmNlLiBDYWxsIHRoaXMgbWV0aG9kIG9ubHkgaWYgc3VyZSB0aGF0IHRoZSBhcHBsaWNhdGlvbiBpcyBydW5uaW5nIGluIE9TR2kKKyAgICAgKiBlbnZpcm9ubWVudCwgb3RoZXJ3aXNlIGEgY2FsbCB0byB0aGlzIG1ldGhvZCBjYW4gbGVhZCB0byBhbiB7QGxpbmsgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbn0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFuIHtAY29kZSBPc2dpUmVnaXN0cnl9IGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIE9zZ2lSZWdpc3RyeSBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgaWYgKGluc3RhbmNlID09IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gQWNjZXNzQ29udHJvbGxlcgorICAgICAgICAgICAgICAgICAgICAuZG9Qcml2aWxlZ2VkKFJlZmxlY3Rpb25IZWxwZXIuZ2V0Q2xhc3NMb2FkZXJQQShSZWZsZWN0aW9uSGVscGVyLmNsYXNzKSk7CisgICAgICAgICAgICBpZiAoY2xhc3NMb2FkZXIgaW5zdGFuY2VvZiBCdW5kbGVSZWZlcmVuY2UpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBCdW5kbGVDb250ZXh0IGNvbnRleHQgPSBGcmFtZXdvcmtVdGlsLmdldEJ1bmRsZShPc2dpUmVnaXN0cnkuY2xhc3MpLmdldEJ1bmRsZUNvbnRleHQoKTsKKyAgICAgICAgICAgICAgICBpZiAoY29udGV4dCAhPSBudWxsKSB7IC8vIGNvbnRleHQgY291bGQgYmUgc3RpbGwgbnVsbCBpZiB0aGUgY3VycmVudCBidW5kbGUgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQKKyAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UgPSBuZXcgT3NnaVJlZ2lzdHJ5KGNvbnRleHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW5zdGFuY2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBPc2dpU2VydmljZUZpbmRlciBleHRlbmRzIFNlcnZpY2VGaW5kZXIuU2VydmljZUl0ZXJhdG9yUHJvdmlkZXIgeworCisgICAgICAgIGZpbmFsIFNlcnZpY2VGaW5kZXIuU2VydmljZUl0ZXJhdG9yUHJvdmlkZXIgZGVmYXVsdEl0ZXJhdG9yID0gbmV3IFNlcnZpY2VGaW5kZXIuRGVmYXVsdFNlcnZpY2VJdGVyYXRvclByb3ZpZGVyKCk7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyA8VD4gSXRlcmF0b3I8VD4gY3JlYXRlSXRlcmF0b3IoCisgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8VD4gc2VydmljZUNsYXNzLAorICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzZXJ2aWNlTmFtZSwKKyAgICAgICAgICAgICAgICBmaW5hbCBDbGFzc0xvYWRlciBsb2FkZXIsCisgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpZ25vcmVPbkNsYXNzTm90Rm91bmQpIHsKKworICAgICAgICAgICAgZmluYWwgTGlzdDxDbGFzczw/Pj4gcHJvdmlkZXJDbGFzc2VzID0gbG9jYXRlQWxsUHJvdmlkZXJzKHNlcnZpY2VOYW1lKTsKKyAgICAgICAgICAgIGlmICghcHJvdmlkZXJDbGFzc2VzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSXRlcmF0b3I8VD4oKSB7CisKKyAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8Q2xhc3M8Pz4+IGl0ID0gcHJvdmlkZXJDbGFzc2VzLml0ZXJhdG9yKCk7CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXQuaGFzTmV4dCgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgVCBuZXh0KCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8VD4gbmV4dENsYXNzID0gKENsYXNzPFQ+KSBpdC5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXh0Q2xhc3MubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNlcnZpY2VDb25maWd1cmF0aW9uRXJyb3Igc2NlID0gbmV3IFNlcnZpY2VDb25maWd1cmF0aW9uRXJyb3Ioc2VydmljZU5hbWUgKyAiOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIExvY2FsaXphdGlvbk1lc3NhZ2VzLlBST1ZJREVSX0NPVUxEX05PVF9CRV9DUkVBVEVEKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dENsYXNzLmdldE5hbWUoKSwgc2VydmljZUNsYXNzLCBleC5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2UuaW5pdENhdXNlKGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBzY2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRJdGVyYXRvci5jcmVhdGVJdGVyYXRvcihzZXJ2aWNlQ2xhc3MsIHNlcnZpY2VOYW1lLCBsb2FkZXIsIGlnbm9yZU9uQ2xhc3NOb3RGb3VuZCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIDxUPiBJdGVyYXRvcjxDbGFzczxUPj4gY3JlYXRlQ2xhc3NJdGVyYXRvcigKKyAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczxUPiBzZXJ2aWNlLCBmaW5hbCBTdHJpbmcgc2VydmljZU5hbWUsIGZpbmFsIENsYXNzTG9hZGVyIGxvYWRlciwgZmluYWwgYm9vbGVhbiBpZ25vcmVPbkNsYXNzTm90Rm91bmQpIHsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8Q2xhc3M8Pz4+IHByb3ZpZGVyQ2xhc3NlcyA9IGxvY2F0ZUFsbFByb3ZpZGVycyhzZXJ2aWNlTmFtZSk7CisgICAgICAgICAgICBpZiAoIXByb3ZpZGVyQ2xhc3Nlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yPENsYXNzPFQ+PigpIHsKKworICAgICAgICAgICAgICAgICAgICBJdGVyYXRvcjxDbGFzczw/Pj4gaXQgPSBwcm92aWRlckNsYXNzZXMuaXRlcmF0b3IoKTsKKworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdC5oYXNOZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBDbGFzczxUPiBuZXh0KCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChDbGFzczxUPikgaXQubmV4dCgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0SXRlcmF0b3IuY3JlYXRlQ2xhc3NJdGVyYXRvcihzZXJ2aWNlLCBzZXJ2aWNlTmFtZSwgbG9hZGVyLCBpZ25vcmVPbkNsYXNzTm90Rm91bmQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQnVuZGxlU3BpUHJvdmlkZXJzTG9hZGVyIGltcGxlbWVudHMgQ2FsbGFibGU8TGlzdDxDbGFzczw/Pj4+IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBzcGk7CisgICAgICAgIHByaXZhdGUgZmluYWwgVVJMIHNwaVJlZ2lzdHJ5VXJsOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBzcGlSZWdpc3RyeVVybFN0cmluZzsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgYnVuZGxlOworCisgICAgICAgIEJ1bmRsZVNwaVByb3ZpZGVyc0xvYWRlcihmaW5hbCBTdHJpbmcgc3BpLCBmaW5hbCBVUkwgc3BpUmVnaXN0cnlVcmwsIGZpbmFsIEJ1bmRsZSBidW5kbGUpIHsKKyAgICAgICAgICAgIHRoaXMuc3BpID0gc3BpOworICAgICAgICAgICAgdGhpcy5zcGlSZWdpc3RyeVVybCA9IHNwaVJlZ2lzdHJ5VXJsOworICAgICAgICAgICAgdGhpcy5zcGlSZWdpc3RyeVVybFN0cmluZyA9IHNwaVJlZ2lzdHJ5VXJsLnRvRXh0ZXJuYWxGb3JtKCk7CisgICAgICAgICAgICB0aGlzLmJ1bmRsZSA9IGJ1bmRsZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTGlzdDxDbGFzczw/Pj4gY2FsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbnVsbDsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoTE9HR0VSLmlzTG9nZ2FibGUoTGV2ZWwuRklORVNUKSkgeworICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLkZJTkVTVCwgIkxvYWRpbmcgcHJvdmlkZXJzIGZvciBTUEk6IHswfSIsIHNwaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoc3BpUmVnaXN0cnlVcmwub3BlblN0cmVhbSgpLCAiVVRGLTgiKSk7CisgICAgICAgICAgICAgICAgU3RyaW5nIHByb3ZpZGVyQ2xhc3NOYW1lOworCisgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxDbGFzczw/Pj4gcHJvdmlkZXJDbGFzc2VzID0gbmV3IEFycmF5TGlzdDxDbGFzczw/Pj4oKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKHByb3ZpZGVyQ2xhc3NOYW1lID0gcmVhZGVyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVyQ2xhc3NOYW1lLnRyaW0oKS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoTE9HR0VSLmlzTG9nZ2FibGUoTGV2ZWwuRklORVNUKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5GSU5FU1QsICJTUEkgcHJvdmlkZXI6IHswfSIsIHByb3ZpZGVyQ2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwcm92aWRlckNsYXNzZXMuYWRkKGxvYWRDbGFzcyhidW5kbGUsIHByb3ZpZGVyQ2xhc3NOYW1lKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyQ2xhc3NlczsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5XQVJOSU5HLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5FWENFUFRJT05fQ0FVR0hUX1dISUxFX0xPQURJTkdfU1BJX1BST1ZJREVSUygpLCBlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgRXJyb3IgZSkgeworICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuV0FSTklORywgTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfQ0FVR0hUX1dISUxFX0xPQURJTkdfU1BJX1BST1ZJREVSUygpLCBlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAocmVhZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuRklORSwgIkVycm9yIGNsb3NpbmcgU1BJIHJlZ2lzdHJ5IHN0cmVhbToiICsgc3BpUmVnaXN0cnlVcmwsIGlvZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBzcGlSZWdpc3RyeVVybFN0cmluZzsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgcmV0dXJuIHNwaVJlZ2lzdHJ5VXJsU3RyaW5nLmhhc2hDb2RlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvYmopIHsKKyAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBCdW5kbGVTcGlQcm92aWRlcnNMb2FkZXIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3BpUmVnaXN0cnlVcmxTdHJpbmcuZXF1YWxzKCgoQnVuZGxlU3BpUHJvdmlkZXJzTG9hZGVyKSBvYmopLnNwaVJlZ2lzdHJ5VXJsU3RyaW5nKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYnVuZGxlQ2hhbmdlZChmaW5hbCBCdW5kbGVFdmVudCBldmVudCkgeworCisgICAgICAgIGlmIChldmVudC5nZXRUeXBlKCkgPT0gQnVuZGxlRXZlbnQuUkVTT0xWRUQpIHsKKyAgICAgICAgICAgIHJlZ2lzdGVyKGV2ZW50LmdldEJ1bmRsZSgpKTsKKyAgICAgICAgfSBlbHNlIGlmIChldmVudC5nZXRUeXBlKCkgPT0gQnVuZGxlRXZlbnQuVU5SRVNPTFZFRCB8fCBldmVudC5nZXRUeXBlKCkgPT0gQnVuZGxlRXZlbnQuVU5JTlNUQUxMRUQpIHsKKworICAgICAgICAgICAgZmluYWwgQnVuZGxlIHVucmVnaXN0ZXJlZEJ1bmRsZSA9IGV2ZW50LmdldEJ1bmRsZSgpOworCisgICAgICAgICAgICBsb2NrLndyaXRlTG9jaygpLmxvY2soKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZmFjdG9yaWVzLnJlbW92ZSh1bnJlZ2lzdGVyZWRCdW5kbGUuZ2V0QnVuZGxlSWQoKSk7CisKKyAgICAgICAgICAgICAgICBpZiAodW5yZWdpc3RlcmVkQnVuZGxlLmdldFN5bWJvbGljTmFtZSgpLmVxdWFscyhDb3JlQnVuZGxlU3ltYm9saWNOQU1FKSkgeworICAgICAgICAgICAgICAgICAgICBidW5kbGVDb250ZXh0LnJlbW92ZUJ1bmRsZUxpc3RlbmVyKHRoaXMpOworICAgICAgICAgICAgICAgICAgICBmYWN0b3JpZXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGxvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2xhdGVzIGJ1bmRsZSBlbnRyeSBwYXRoIGFzIHJldHVybmVkIGZyb20ge0BsaW5rIG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGUjZmluZEVudHJpZXMoU3RyaW5nLCBTdHJpbmcsIGJvb2xlYW4pfSB0bworICAgICAqIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIHRoYXQgcmVzaWRlcyBpbiBnaXZlbiBwYWNrYWdlIHBhdGggKGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW4gaXRzIHN1YnBhY2thZ2VzKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYWNrYWdlUGF0aCAgICAgVGhlIHBhY2thZ2UgcGF0aCB3aGVyZSB0aGUgY2xhc3MgaXMgbG9jYXRlZCAoZXZlbiByZWN1cnNpdmVseSkKKyAgICAgKiBAcGFyYW0gYnVuZGxlRW50cnlQYXRoIFRoZSBidW5kbGUgcGF0aCB0byB0cmFuc2xhdGUuCisgICAgICogQHJldHVybiBGdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBidW5kbGVFbnRyeVBhdGhUb0NsYXNzTmFtZShTdHJpbmcgcGFja2FnZVBhdGgsIFN0cmluZyBidW5kbGVFbnRyeVBhdGgpIHsKKyAgICAgICAgLy8gbm9ybWFsaXplIHBhY2thZ2VQYXRoCisgICAgICAgIHBhY2thZ2VQYXRoID0gbm9ybWFsaXplZFBhY2thZ2VQYXRoKHBhY2thZ2VQYXRoKTsKKworICAgICAgICAvLyByZW1vdmUgV0VCLUlORi9jbGFzc2VzIGZyb20gYnVuZGxlIGVudHJ5IHBhdGgKKyAgICAgICAgaWYgKGJ1bmRsZUVudHJ5UGF0aC5jb250YWlucyhXRUJfSU5GX0NMQVNTRVMpKSB7CisgICAgICAgICAgICBidW5kbGVFbnRyeVBhdGggPSBidW5kbGVFbnRyeVBhdGguc3Vic3RyaW5nKGJ1bmRsZUVudHJ5UGF0aC5pbmRleE9mKFdFQl9JTkZfQ0xBU1NFUykgKyBXRUJfSU5GX0NMQVNTRVMubGVuZ3RoKCkpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgaW50IHBhY2thZ2VJbmRleCA9IGJ1bmRsZUVudHJ5UGF0aC5pbmRleE9mKHBhY2thZ2VQYXRoKTsKKworICAgICAgICBTdHJpbmcgbm9ybWFsaXplZENsYXNzTmFtZVBhdGggPSBwYWNrYWdlSW5kZXggPiAtMQorICAgICAgICAgICAgICAgIC8vIHRoZSBwYWNrYWdlIHBhdGggd2FzIGZvdW5kIGluIHRoZSBidW5kbGUgcGF0aAorICAgICAgICAgICAgICAgID8gYnVuZGxlRW50cnlQYXRoLnN1YnN0cmluZyhwYWNrYWdlSW5kZXgpCisgICAgICAgICAgICAgICAgLy8gdGhlIHBhY2thZ2UgcGF0aCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIGJ1bmRsZSBlbnRyeSBwYXRoCisgICAgICAgICAgICAgICAgLy8gZmFsbCBiYWNrIHRvIHRoZSBvcmlnaW5hbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdHJhbnNsYXRpb24gd2hpY2ggZG9lcyBub3QgY29uc2lkZXIgcmVjdXJzaW9uCisgICAgICAgICAgICAgICAgOiBwYWNrYWdlUGF0aCArIGJ1bmRsZUVudHJ5UGF0aC5zdWJzdHJpbmcoYnVuZGxlRW50cnlQYXRoLmxhc3RJbmRleE9mKCcvJykgKyAxKTsKKworICAgICAgICByZXR1cm4gKG5vcm1hbGl6ZWRDbGFzc05hbWVQYXRoLnN0YXJ0c1dpdGgoIi8iKSA/IG5vcm1hbGl6ZWRDbGFzc05hbWVQYXRoLnN1YnN0cmluZygxKSA6IG5vcm1hbGl6ZWRDbGFzc05hbWVQYXRoKQorICAgICAgICAgICAgICAgIC5yZXBsYWNlKCcvJywgJy4nKS5yZXBsYWNlKCIuY2xhc3MiLCAiIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBnaXZlbiBlbnRyeSBwYXRoIGlzIGxvY2F0ZWQgZGlyZWN0bHkgaW4gdGhlIHByb3ZpZGVkIHBhY2thZ2UgcGF0aC4gVGhhdCBpcywKKyAgICAgKiBpZiB0aGUgZW50cnkgaXMgbG9jYXRlZCBpbiBhIHN1Yi1wYWNrYWdlLCB0aGVuIHtAY29kZSBmYWxzZX0gaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFja2FnZVBhdGggUGFja2FnZSBwYXRoIHdoaWNoIHRoZSBlbnRyeSBpcyBjb21wYXJlZCB0bworICAgICAqIEBwYXJhbSBlbnRyeVBhdGggRW50cnkgcGF0aAorICAgICAqIEByZXR1cm4gV2hldGhlciB0aGUgZ2l2ZW4gZW50cnkgcGF0aCBpcyBsb2NhdGVkIGRpcmVjdGx5IGluIHRoZSBwcm92aWRlZCBwYWNrYWdlIHBhdGguCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzUGFja2FnZUxldmVsRW50cnkoU3RyaW5nIHBhY2thZ2VQYXRoLCBmaW5hbCBTdHJpbmcgZW50cnlQYXRoKSB7CisgICAgICAgIC8vIG5vcm1hbGl6ZSBwYWNrYWdlUGF0aAorICAgICAgICBwYWNrYWdlUGF0aCA9IG5vcm1hbGl6ZWRQYWNrYWdlUGF0aChwYWNrYWdlUGF0aCk7CisKKyAgICAgICAgLy8gaWYgdGhlIHBhY2thZ2UgcGF0aCBpcyBjb250YWluZWQgaW4gdGhlIGphciBlbnRyeSBuYW1lLCBzdWJ0cmFjdCBpdAorICAgICAgICBTdHJpbmcgZW50cnlXaXRob3V0UGFja2FnZVBhdGggPSBlbnRyeVBhdGguY29udGFpbnMocGFja2FnZVBhdGgpCisgICAgICAgICAgICAgICAgPyBlbnRyeVBhdGguc3Vic3RyaW5nKGVudHJ5UGF0aC5pbmRleE9mKHBhY2thZ2VQYXRoKSArIHBhY2thZ2VQYXRoLmxlbmd0aCgpKQorICAgICAgICAgICAgICAgIDogZW50cnlQYXRoOworCisgICAgICAgIHJldHVybiAhKGVudHJ5V2l0aG91dFBhY2thZ2VQYXRoLnN0YXJ0c1dpdGgoIi8iKSA/IGVudHJ5V2l0aG91dFBhY2thZ2VQYXRoLnN1YnN0cmluZygxKQorICAgICAgICAgICAgICAgICAgICAgICAgIDogZW50cnlXaXRob3V0UGFja2FnZVBhdGgpCisgICAgICAgICAgICAgICAgLmNvbnRhaW5zKCIvIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm9ybWFsaXplZCBwYWNrYWdlIHJldHVybnMgcGF0aCB0aGF0IGRvZXMgbm90IHN0YXJ0IHdpdGggJy8nIGNoYXJhY3RlciBhbmQgZW5kcyB3aXRoICcvJyBjaGFyYWN0ZXIuCisgICAgICogSWYgdGhlIGFyZ3VtZW50IGlzICcvJyB0aGVuIHJldHVybmVkIHZhbHVlIGlzIGVtcHR5IHN0cmluZyAiIi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYWNrYWdlUGF0aCBwYWNrYWdlIHBhdGggdG8gbm9ybWFsaXplLgorICAgICAqIEByZXR1cm4gTm9ybWFsaXplZCBwYWNrYWdlIHBhdGguCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbm9ybWFsaXplZFBhY2thZ2VQYXRoKFN0cmluZyBwYWNrYWdlUGF0aCkgeworICAgICAgICBwYWNrYWdlUGF0aCA9IHBhY2thZ2VQYXRoLnN0YXJ0c1dpdGgoIi8iKSA/IHBhY2thZ2VQYXRoLnN1YnN0cmluZygxKSA6IHBhY2thZ2VQYXRoOworICAgICAgICBwYWNrYWdlUGF0aCA9IHBhY2thZ2VQYXRoLmVuZHNXaXRoKCIvIikgPyBwYWNrYWdlUGF0aCA6IHBhY2thZ2VQYXRoICsgIi8iOworICAgICAgICBwYWNrYWdlUGF0aCA9ICIvIi5lcXVhbHMocGFja2FnZVBhdGgpID8gIiIgOiBwYWNrYWdlUGF0aDsKKyAgICAgICAgcmV0dXJuIHBhY2thZ2VQYXRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBVUkxzIG9mIHJlc291cmNlcyBmcm9tIGEgZ2l2ZW4gcGFja2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYWNrYWdlUGF0aCBwYWNrYWdlLgorICAgICAqIEBwYXJhbSBjbGFzc0xvYWRlciByZXNvdXJjZSBjbGFzcyBsb2FkZXIuCisgICAgICogQHBhcmFtIHJlY3Vyc2l2ZSAgIHdoZXRoZXIgdGhlIGdpdmVuIHBhY2thZ2UgcGF0aCBzaG91bGQgYmUgc2Nhbm5lZCByZWN1cnNpdmVseSBieSBPU0dpCisgICAgICogQHJldHVybiBVUkxzIG9mIHRoZSBsb2NhdGVkIHJlc291cmNlcy4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgRW51bWVyYXRpb248VVJMPiBnZXRQYWNrYWdlUmVzb3VyY2VzKGZpbmFsIFN0cmluZyBwYWNrYWdlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZWN1cnNpdmUpIHsKKyAgICAgICAgZmluYWwgTGlzdDxVUkw+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PFVSTD4oKTsKKworICAgICAgICBmb3IgKGZpbmFsIEJ1bmRsZSBidW5kbGUgOiBidW5kbGVDb250ZXh0LmdldEJ1bmRsZXMoKSkgeworICAgICAgICAgICAgLy8gTG9vayBmb3IgcmVzb3VyY2VzIGF0IHRoZSBnaXZlbiA8cGFja2FnZVBhdGg+IGFuZCBhdCBXRUItSU5GL2NsYXNzZXMvPHBhY2thZ2VQYXRoPiBpbiBjYXNlIGEgV0FSIGlzIGJlaW5nIGV4YW1pbmVkLgorICAgICAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgYnVuZGxlUGFja2FnZVBhdGggOiBuZXcgU3RyaW5nW10ge3BhY2thZ2VQYXRoLCBXRUJfSU5GX0NMQVNTRVMgKyBwYWNrYWdlUGF0aH0pIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBFbnVtZXJhdGlvbjxVUkw+IGVudW1lcmF0aW9uID0gZmluZEVudHJpZXMoYnVuZGxlLCBidW5kbGVQYWNrYWdlUGF0aCwgIiouY2xhc3MiLCByZWN1cnNpdmUpOworCisgICAgICAgICAgICAgICAgaWYgKGVudW1lcmF0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGVudW1lcmF0aW9uLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBVUkwgdXJsID0gZW51bWVyYXRpb24ubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwYXRoID0gdXJsLmdldFBhdGgoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NUb0J1bmRsZU1hcHBpbmcucHV0KGJ1bmRsZUVudHJ5UGF0aFRvQ2xhc3NOYW1lKHBhY2thZ2VQYXRoLCBwYXRoKSwgYnVuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQodXJsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gTm93IGludGVyZXN0ZWQgb25seSBpbiAuamFyIHByb3ZpZGVkIGJ5IGN1cnJlbnQgYnVuZGxlLgorICAgICAgICAgICAgZmluYWwgRW51bWVyYXRpb248VVJMPiBqYXJzID0gZmluZEVudHJpZXMoYnVuZGxlLCAiLyIsICIqLmphciIsIHRydWUpOworICAgICAgICAgICAgaWYgKGphcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdoaWxlIChqYXJzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFVSTCBqYXIgPSBqYXJzLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gY2xhc3NMb2FkZXIuZ2V0UmVzb3VyY2VBc1N0cmVhbShqYXIuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0U3RyZWFtID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi5jb25maWcoTG9jYWxpemF0aW9uTWVzc2FnZXMuT1NHSV9SRUdJU1RSWV9FUlJPUl9PUEVOSU5HX1JFU09VUkNFX1NUUkVBTShqYXIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIEphcklucHV0U3RyZWFtIGphcklucHV0U3RyZWFtOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgamFySW5wdXRTdHJlYW0gPSBuZXcgSmFySW5wdXRTdHJlYW0oaW5wdXRTdHJlYW0pOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5DT05GSUcsIExvY2FsaXphdGlvbk1lc3NhZ2VzLk9TR0lfUkVHSVNUUllfRVJST1JfUFJPQ0VTU0lOR19SRVNPVVJDRV9TVFJFQU0oamFyKSwgZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEphckVudHJ5IGphckVudHJ5OworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChqYXJFbnRyeSA9IGphcklucHV0U3RyZWFtLmdldE5leHRKYXJFbnRyeSgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGphckVudHJ5TmFtZSA9IGphckVudHJ5LmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgamFyRW50cnlOYW1lTGVhZGluZ1NsYXNoID0gamFyRW50cnlOYW1lLnN0YXJ0c1dpdGgoIi8iKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBqYXJFbnRyeU5hbWUgOiAiLyIgKyBqYXJFbnRyeU5hbWU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoamFyRW50cnlOYW1lLmVuZHNXaXRoKCIuY2xhc3MiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkZWQgbGVhZGluZyBhbmQgdHJhaWxpbmcgc2xhc2hlcyAnLycgdG8gcGFja2FnZSBwYXRoIChlLmcuICcvY29tLycpIGhlbHBzIHVzIHRvIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWNjaWRlbnRhbGx5IG1hdGNoIHN1Yi1zdHJpbmdzIG9mIHRoZSBwYWNrYWdlIHBhdGggKGUuZy4sIGlmIHBhY2thZ2UgcGF0aCAnY29tJyB3YXMgdXNlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHNjYW5uaW5nLCBwYWNrYWdlICd3aGF0ZXZlci5mb28udGVsZWNvbScgd291bGQgYmUgbWF0Y2hlZCBiZWNhdXNlIG9mIHdvcmQgJ3RlbGVbY29tXScpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGNhbm5vdCBhdm9pZCBhbGwgY29ybmVyIGNhc2VzIHdpdGggYWNjaWRlbnRhbCBtYXRjaGVzIHNpbmNlIGphcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW50cnkgbmFtZSBtaWdodCBiZSBhbG1vc3QgYW55dGhpbmcgKGUuZy4sIGlmIHBhY2thZ2UgcGF0aCAndGVsZWNvbScgd2FzIHVzZWQsIHBhY2thZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICd3aGF0ZXZlci5mb28udGVsZWNvbScgd2lsbCBiZSBtYXRjaGVkIGFuZCB0aGVyZSBpcyBubyB3YXkgdG8gYXZvaWQgaXQgdW5sZXNzIHVzZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGxpY2l0bHkgaW5zdHJ1Y3RzIHVzIHRvIGRvIHNvIHNvbWVob3cgKG5vdCBpbXBsZW1lbnRlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGphckVudHJ5TmFtZUxlYWRpbmdTbGFzaC5jb250YWlucygiLyIgKyBub3JtYWxpemVkUGFja2FnZVBhdGgocGFja2FnZVBhdGgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlY3Vyc2l2ZSAmJiAhaXNQYWNrYWdlTGV2ZWxFbnRyeShwYWNrYWdlUGF0aCwgamFyRW50cnlOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NUb0J1bmRsZU1hcHBpbmcucHV0KGphckVudHJ5TmFtZS5yZXBsYWNlKCIuY2xhc3MiLCAiIikucmVwbGFjZSgnLycsICcuJyksIGJ1bmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoYnVuZGxlLmdldFJlc291cmNlKGphckVudHJ5TmFtZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLkNPTkZJRywgTG9jYWxpemF0aW9uTWVzc2FnZXMuT1NHSV9SRUdJU1RSWV9FUlJPUl9QUk9DRVNTSU5HX1JFU09VUkNFX1NUUkVBTShqYXIpLCBleCk7CisgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphcklucHV0U3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlZAorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVudW1lcmF0aW9uKHJlc3VsdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBDbGFzcyBmcm9tIHRoZSBjbGFzcyBuYW1lLgorICAgICAqIDxwPgorICAgICAqIFRoZSBjb250ZXh0IGNsYXNzIGxvYWRlciB3aWxsIGJlIHV0aWxpemVkIGlmIGFjY2Vzc2libGUgYW5kIG5vbi1udWxsLgorICAgICAqIE90aGVyd2lzZSB0aGUgZGVmaW5pbmcgY2xhc3MgbG9hZGVyIG9mIHRoaXMgY2xhc3Mgd2lsbAorICAgICAqIGJlIHV0aWxpemVkLgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzTmFtZSB0aGUgY2xhc3MgbmFtZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBDbGFzcywgb3RoZXJ3aXNlIG51bGwgaWYgdGhlIGNsYXNzIGNhbm5vdCBiZSBmb3VuZC4KKyAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gaWYgdGhlIGNsYXNzIGNhbm5vdCBiZSBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3M8Pz4gY2xhc3NGb3JOYW1lV2l0aEV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEJ1bmRsZSBidW5kbGUgPSBjbGFzc1RvQnVuZGxlTWFwcGluZy5nZXQoY2xhc3NOYW1lKTsKKworICAgICAgICBpZiAoYnVuZGxlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKGNsYXNzTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxvYWRDbGFzcyhidW5kbGUsIGNsYXNzTmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJpZXMgdG8gbG9hZCByZXNvdXJjZSBidW5kbGUgdmlhIE9TR2kgbWVhbnMuIE5vIGNhY2hpbmcgaW52b2x2ZWQgaGVyZSwKKyAgICAgKiBhcyBsb2NhbGl6YXRpb24gcHJvcGVydGllcyBhcmUgYmVpbmcgY2FjaGVkIGluIExvY2FsaXplciBjbGFzcyBhbHJlYWR5LgorICAgICAqCisgICAgICogQHBhcmFtIGJ1bmRsZU5hbWUgbmFtZSBvZiB0aGUgcmVzb3VyY2UgYnVuZGxlIHRvIGxvYWQKKyAgICAgKiBAcmV0dXJuIHJlc291cmNlIGJ1bmRsZSBpbnN0YW5jZSBpZiBmb3VuZCwgbnVsbCBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzb3VyY2VCdW5kbGUgZ2V0UmVzb3VyY2VCdW5kbGUoZmluYWwgU3RyaW5nIGJ1bmRsZU5hbWUpIHsKKyAgICAgICAgZmluYWwgaW50IGxhc3REb3RJbmRleCA9IGJ1bmRsZU5hbWUubGFzdEluZGV4T2YoJy4nKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHBhdGggPSBidW5kbGVOYW1lLnN1YnN0cmluZygwLCBsYXN0RG90SW5kZXgpLnJlcGxhY2UoJy4nLCAnLycpOworICAgICAgICBmaW5hbCBTdHJpbmcgcHJvcGVydGllc05hbWUgPSBidW5kbGVOYW1lLnN1YnN0cmluZyhsYXN0RG90SW5kZXggKyAxLCBidW5kbGVOYW1lLmxlbmd0aCgpKSArICIucHJvcGVydGllcyI7CisgICAgICAgIGZvciAoZmluYWwgQnVuZGxlIGJ1bmRsZSA6IGJ1bmRsZUNvbnRleHQuZ2V0QnVuZGxlcygpKSB7CisgICAgICAgICAgICBmaW5hbCBFbnVtZXJhdGlvbjxVUkw+IGVudHJpZXMgPSBmaW5kRW50cmllcyhidW5kbGUsIHBhdGgsIHByb3BlcnRpZXNOYW1lLCBmYWxzZSk7CisgICAgICAgICAgICBpZiAoZW50cmllcyAhPSBudWxsICYmIGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBVUkwgZW50cnlVcmwgPSBlbnRyaWVzLm5leHRFbGVtZW50KCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eVJlc291cmNlQnVuZGxlKGVudHJ5VXJsLm9wZW5TdHJlYW0oKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKExPR0dFUi5pc0xvZ2dhYmxlKExldmVsLkZJTkUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb2VzIG5vdCBtYWtlIHNlbnNlIHRvIGxvY2FsaXplIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi5maW5lKCJFeGNlcHRpb24gY2F1Z2h0IHdoZW4gdHJpZWQgdG8gbG9hZCByZXNvdXJjZSBidW5kbGUgaW4gT1NHaSIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IE9zZ2lSZWdpc3RyeSBpbnN0YW5jZSBib3VuZCB0byBhIHBhcnRpY3VsYXIgT1NHaSBydW50aW1lLgorICAgICAqIFRoZSBvbmx5IHBhcmFtZXRlciBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIGEge0BsaW5rIEJ1bmRsZUNvbnRleHR9LgorICAgICAqCisgICAgICogQHBhcmFtIGJ1bmRsZUNvbnRleHQgbXVzdCBiZSBhIG5vbi1udWxsIGluc3RhbmNlIG9mIGEgQnVuZGxlQ29udGV4dAorICAgICAqLworICAgIHByaXZhdGUgT3NnaVJlZ2lzdHJ5KGZpbmFsIEJ1bmRsZUNvbnRleHQgYnVuZGxlQ29udGV4dCkgeworICAgICAgICB0aGlzLmJ1bmRsZUNvbnRleHQgPSBidW5kbGVDb250ZXh0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFdpbGwgaG9vayB1cCB0aGlzIGluc3RhbmNlIHdpdGggdGhlIE9TR2kgcnVudGltZS4KKyAgICAgKiBUaGlzIGlzIHRvIGFjdHVhbGx5IHVwZGF0ZSBTUEkgcHJvdmlkZXIgbG9va3VwIGFuZCBjbGFzcyBsb2FkaW5nIG1lY2hhbmlzbXMgaW4gSmVyc2V5CisgICAgICogdG8gdXRpbGl6ZSBPU0dpIGZlYXR1cmVzLgorICAgICAqLworICAgIHZvaWQgaG9va1VwKCkgeworICAgICAgICBzZXRPU0dpU2VydmljZUZpbmRlckl0ZXJhdG9yUHJvdmlkZXIoKTsKKyAgICAgICAgYnVuZGxlQ29udGV4dC5hZGRCdW5kbGVMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgcmVnaXN0ZXJFeGlzdGluZ0J1bmRsZXMoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVnaXN0ZXJFeGlzdGluZ0J1bmRsZXMoKSB7CisgICAgICAgIGZvciAoZmluYWwgQnVuZGxlIGJ1bmRsZSA6IGJ1bmRsZUNvbnRleHQuZ2V0QnVuZGxlcygpKSB7CisgICAgICAgICAgICBpZiAoYnVuZGxlLmdldFN0YXRlKCkgPT0gQnVuZGxlLlJFU09MVkVEIHx8IGJ1bmRsZS5nZXRTdGF0ZSgpID09IEJ1bmRsZS5TVEFSVElORworICAgICAgICAgICAgICAgICAgICB8fCBidW5kbGUuZ2V0U3RhdGUoKSA9PSBCdW5kbGUuQUNUSVZFIHx8IGJ1bmRsZS5nZXRTdGF0ZSgpID09IEJ1bmRsZS5TVE9QUElORykgeworICAgICAgICAgICAgICAgIHJlZ2lzdGVyKGJ1bmRsZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2V0T1NHaVNlcnZpY2VGaW5kZXJJdGVyYXRvclByb3ZpZGVyKCkgeworICAgICAgICBTZXJ2aWNlRmluZGVyLnNldEl0ZXJhdG9yUHJvdmlkZXIobmV3IE9zZ2lTZXJ2aWNlRmluZGVyKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWdpc3RlcihmaW5hbCBCdW5kbGUgYnVuZGxlKSB7CisgICAgICAgIGlmIChMT0dHRVIuaXNMb2dnYWJsZShMZXZlbC5GSU5FU1QpKSB7CisgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLkZJTkVTVCwgImNoZWNraW5nIGJ1bmRsZSB7MH0iLCBidW5kbGUuZ2V0QnVuZGxlSWQoKSk7CisgICAgICAgIH0KKworICAgICAgICBNYXA8U3RyaW5nLCBDYWxsYWJsZTxMaXN0PENsYXNzPD8+Pj4+IG1hcDsKKyAgICAgICAgbG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtYXAgPSBmYWN0b3JpZXMuZ2V0KGJ1bmRsZS5nZXRCdW5kbGVJZCgpKTsKKyAgICAgICAgICAgIGlmIChtYXAgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1hcCA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDxTdHJpbmcsIENhbGxhYmxlPExpc3Q8Q2xhc3M8Pz4+Pj4oKTsKKyAgICAgICAgICAgICAgICBmYWN0b3JpZXMucHV0KGJ1bmRsZS5nZXRCdW5kbGVJZCgpLCBtYXApOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIEVudW1lcmF0aW9uPFVSTD4gZSA9IGZpbmRFbnRyaWVzKGJ1bmRsZSwgIk1FVEEtSU5GL3NlcnZpY2VzLyIsICIqIiwgZmFsc2UpOworICAgICAgICBpZiAoZSAhPSBudWxsKSB7CisgICAgICAgICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFVSTCB1ID0gZS5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB1cmwgPSB1LnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgaWYgKHVybC5lbmRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZmFjdG9yeUlkID0gdXJsLnN1YnN0cmluZyh1cmwubGFzdEluZGV4T2YoIi8iKSArIDEpOworICAgICAgICAgICAgICAgIG1hcC5wdXQoZmFjdG9yeUlkLCBuZXcgQnVuZGxlU3BpUHJvdmlkZXJzTG9hZGVyKGZhY3RvcnlJZCwgdSwgYnVuZGxlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8Q2xhc3M8Pz4+IGxvY2F0ZUFsbFByb3ZpZGVycyhmaW5hbCBTdHJpbmcgc2VydmljZU5hbWUpIHsKKyAgICAgICAgbG9jay5yZWFkTG9jaygpLmxvY2soKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8Q2xhc3M8Pz4+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PENsYXNzPD8+PigpOworICAgICAgICAgICAgZm9yIChmaW5hbCBNYXA8U3RyaW5nLCBDYWxsYWJsZTxMaXN0PENsYXNzPD8+Pj4+IHZhbHVlIDogZmFjdG9yaWVzLnZhbHVlcygpKSB7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmNvbnRhaW5zS2V5KHNlcnZpY2VOYW1lKSkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbCh2YWx1ZS5nZXQoc2VydmljZU5hbWUpLmNhbGwoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbG9jay5yZWFkTG9jaygpLnVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3M8Pz4gbG9hZENsYXNzKGZpbmFsIEJ1bmRsZSBidW5kbGUsIGZpbmFsIFN0cmluZyBjbGFzc05hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjxDbGFzczw/Pj4oKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIENsYXNzPD8+IHJ1bigpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1bmRsZS5sb2FkQ2xhc3MoY2xhc3NOYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgZmluYWwgRXhjZXB0aW9uIG9yaWdpbmFsRXhjZXB0aW9uID0gZXguZ2V0RXhjZXB0aW9uKCk7CisgICAgICAgICAgICBpZiAob3JpZ2luYWxFeGNlcHRpb24gaW5zdGFuY2VvZiBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgKENsYXNzTm90Rm91bmRFeGNlcHRpb24pIG9yaWdpbmFsRXhjZXB0aW9uOworICAgICAgICAgICAgfSBlbHNlIGlmIChvcmlnaW5hbEV4Y2VwdGlvbiBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbikgb3JpZ2luYWxFeGNlcHRpb247CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKG9yaWdpbmFsRXhjZXB0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEVudW1lcmF0aW9uPFVSTD4gZmluZEVudHJpZXMoZmluYWwgQnVuZGxlIGJ1bmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZpbGVOYW1lUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVjdXJzaXZlKSB7CisgICAgICAgIHJldHVybiBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEFjdGlvbjxFbnVtZXJhdGlvbjxVUkw+PigpIHsKKyAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgRW51bWVyYXRpb248VVJMPiBydW4oKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJ1bmRsZS5maW5kRW50cmllcyhwYXRoLCBmaWxlTmFtZVBhdHRlcm4sIHJlY3Vyc2l2ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvUHJvcGVydGllc0RlbGVnYXRlLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL1Byb3BlcnRpZXNEZWxlZ2F0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwY2RlNTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL1Byb3BlcnRpZXNEZWxlZ2F0ZS5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworLyoqCisgKiBUT0RPOiBqYXZhZG9jLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUHJvcGVydGllc0RlbGVnYXRlIHsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB3aXRoIHRoZSBnaXZlbiBuYW1lIHJlZ2lzdGVyZWQgaW4gdGhlIGN1cnJlbnQgcmVxdWVzdC9yZXNwb25zZQorICAgICAqIGV4Y2hhbmdlIGNvbnRleHQsIG9yIHtAY29kZSBudWxsfSBpZiB0aGVyZSBpcyBubyBwcm9wZXJ0eSBieSB0aGF0IG5hbWUuCisgICAgICogPHA+CisgICAgICogQSBwcm9wZXJ0eSBhbGxvd3MgYSBKQVgtUlMgZmlsdGVycyBhbmQgaW50ZXJjZXB0b3JzIHRvIGV4Y2hhbmdlCisgICAgICogYWRkaXRpb25hbCBjdXN0b20gaW5mb3JtYXRpb24gbm90IGFscmVhZHkgcHJvdmlkZWQgYnkgdGhpcyBpbnRlcmZhY2UuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIEEgbGlzdCBvZiBzdXBwb3J0ZWQgcHJvcGVydGllcyBjYW4gYmUgcmV0cmlldmVkIHVzaW5nIHtAbGluayAjZ2V0UHJvcGVydHlOYW1lcygpfS4KKyAgICAgKiBDdXN0b20gcHJvcGVydHkgbmFtZXMgc2hvdWxkIGZvbGxvdyB0aGUgc2FtZSBjb252ZW50aW9uIGFzIHBhY2thZ2UgbmFtZXMuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgYSB7QGNvZGUgU3RyaW5nfSBzcGVjaWZ5aW5nIHRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS4KKyAgICAgKiBAcmV0dXJuIGFuIHtAY29kZSBPYmplY3R9IGNvbnRhaW5pbmcgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSwgb3IKKyAgICAgKiAgICAgICAgIHtAY29kZSBudWxsfSBpZiBubyBwcm9wZXJ0eSBleGlzdHMgbWF0Y2hpbmcgdGhlIGdpdmVuIG5hbWUuCisgICAgICogQHNlZSAjZ2V0UHJvcGVydHlOYW1lcygpCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSk7CisKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gaW1tdXRhYmxlIHtAbGluayBqYXZhLnV0aWwuQ29sbGVjdGlvbiBjb2xsZWN0aW9ufSBjb250YWluaW5nIHRoZSBwcm9wZXJ0eQorICAgICAqIG5hbWVzIGF2YWlsYWJsZSB3aXRoaW4gdGhlIGNvbnRleHQgb2YgdGhlIGN1cnJlbnQgcmVxdWVzdC9yZXNwb25zZSBleGNoYW5nZSBjb250ZXh0LgorICAgICAqIDxwPgorICAgICAqIFVzZSB0aGUge0BsaW5rICNnZXRQcm9wZXJ0eX0gbWV0aG9kIHdpdGggYSBwcm9wZXJ0eSBuYW1lIHRvIGdldCB0aGUgdmFsdWUgb2YKKyAgICAgKiBhIHByb3BlcnR5LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYW4gaW1tdXRhYmxlIHtAbGluayBqYXZhLnV0aWwuQ29sbGVjdGlvbiBjb2xsZWN0aW9ufSBvZiBwcm9wZXJ0eSBuYW1lcy4KKyAgICAgKiBAc2VlICNnZXRQcm9wZXJ0eQorICAgICAqLworICAgIHB1YmxpYyBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0UHJvcGVydHlOYW1lcygpOworCisKKyAgICAvKioKKyAgICAgKiBCaW5kcyBhbiBvYmplY3QgdG8gYSBnaXZlbiBwcm9wZXJ0eSBuYW1lIGluIHRoZSBjdXJyZW50IHJlcXVlc3QvcmVzcG9uc2UKKyAgICAgKiBleGNoYW5nZSBjb250ZXh0LiBJZiB0aGUgbmFtZSBzcGVjaWZpZWQgaXMgYWxyZWFkeSB1c2VkIGZvciBhIHByb3BlcnR5LAorICAgICAqIHRoaXMgbWV0aG9kIHdpbGwgcmVwbGFjZSB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IHdpdGggdGhlIG5ldyB2YWx1ZS4KKyAgICAgKiA8cD4KKyAgICAgKiBBIHByb3BlcnR5IGFsbG93cyBhIEpBWC1SUyBmaWx0ZXJzIGFuZCBpbnRlcmNlcHRvcnMgdG8gZXhjaGFuZ2UKKyAgICAgKiBhZGRpdGlvbmFsIGN1c3RvbSBpbmZvcm1hdGlvbiBub3QgYWxyZWFkeSBwcm92aWRlZCBieSB0aGlzIGludGVyZmFjZS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogQSBsaXN0IG9mIHN1cHBvcnRlZCBwcm9wZXJ0aWVzIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmcge0BsaW5rICNnZXRQcm9wZXJ0eU5hbWVzKCl9LgorICAgICAqIEN1c3RvbSBwcm9wZXJ0eSBuYW1lcyBzaG91bGQgZm9sbG93IHRoZSBzYW1lIGNvbnZlbnRpb24gYXMgcGFja2FnZSBuYW1lcy4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogSWYgYSB7QGNvZGUgbnVsbH0gdmFsdWUgaXMgcGFzc2VkLCB0aGUgZWZmZWN0IGlzIHRoZSBzYW1lIGFzIGNhbGxpbmcgdGhlCisgICAgICoge0BsaW5rICNyZW1vdmVQcm9wZXJ0eShTdHJpbmcpfSBtZXRob2QuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgICBhIHtAY29kZSBTdHJpbmd9IHNwZWNpZnlpbmcgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5LgorICAgICAqIEBwYXJhbSBvYmplY3QgYW4ge0Bjb2RlIE9iamVjdH0gcmVwcmVzZW50aW5nIHRoZSBwcm9wZXJ0eSB0byBiZSBib3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSwgT2JqZWN0IG9iamVjdCk7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGEgcHJvcGVydHkgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBmcm9tIHRoZSBjdXJyZW50IHJlcXVlc3QvcmVzcG9uc2UKKyAgICAgKiBleGNoYW5nZSBjb250ZXh0LiBBZnRlciByZW1vdmFsLCBzdWJzZXF1ZW50IGNhbGxzIHRvIHtAbGluayAjZ2V0UHJvcGVydHl9CisgICAgICogdG8gcmV0cmlldmUgdGhlIHByb3BlcnR5IHZhbHVlIHdpbGwgcmV0dXJuIHtAY29kZSBudWxsfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIGEge0Bjb2RlIFN0cmluZ30gc3BlY2lmeWluZyB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gYmUgcmVtb3ZlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZW1vdmVQcm9wZXJ0eShTdHJpbmcgbmFtZSk7Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL1J1bnRpbWVEZWxlZ2F0ZUltcGwuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvUnVudGltZURlbGVnYXRlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYjI1YTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL1J1bnRpbWVEZWxlZ2F0ZUltcGwuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuTWVzc2FnaW5nQmluZGVyczsKKworLyoqCisgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIEpBWC1SUyB7QGxpbmsgamF2YXgud3MucnMuZXh0LlJ1bnRpbWVEZWxlZ2F0ZX0uCisgKiBUaGUge0BsaW5rIGphdmF4LndzLnJzLmV4dC5SdW50aW1lRGVsZWdhdGV9IGNsYXNzIGxvb2tzIGZvciB0aGUgaW1wbGVtZW50YXRpb25zIHJlZ2lzdGVyZWQKKyAqIGluIE1FVEEtSU5GL3NlcnZpY2VzLiBJZiBubyBzdWNoIGltcGxlbWVudGF0aW9uIGlzIGZvdW5kLCB0aGlzIG9uZSBpcyBwaWNrZWQKKyAqIGFzIHRoZSBkZWZhdWx0LiBTZXJ2ZXIgaW5qZWN0aW9uIGJpbmRlciBzaG91bGQgb3ZlcnJpZGUgdGhpcyAodXNpbmcgTUVUQS1JTkYvc2VydmljZXMpCisgKiB0byBwcm92aWRlIGFuIGltcGxlbWVudGF0aW9uIHRoYXQgc3VwcG9ydHMge0BsaW5rICNjcmVhdGVFbmRwb2ludChqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uLCBqYXZhLmxhbmcuQ2xhc3MpfQorICogbWV0aG9kLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIFJ1bnRpbWVEZWxlZ2F0ZUltcGwgZXh0ZW5kcyBBYnN0cmFjdFJ1bnRpbWVEZWxlZ2F0ZSB7CisKKyAgICBwdWJsaWMgUnVudGltZURlbGVnYXRlSW1wbCgpIHsKKyAgICAgICAgc3VwZXIobmV3IE1lc3NhZ2luZ0JpbmRlcnMuSGVhZGVyRGVsZWdhdGVQcm92aWRlcnMoKS5nZXRIZWFkZXJEZWxlZ2F0ZVByb3ZpZGVycygpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFQ+IFQgY3JlYXRlRW5kcG9pbnQoQXBwbGljYXRpb24gYXBwbGljYXRpb24sIENsYXNzPFQ+IGVuZHBvaW50VHlwZSkKKyAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLk5PX0NPTlRBSU5FUl9BVkFJTEFCTEUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9TZXJ2aWNlQ29uZmlndXJhdGlvbkVycm9yLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL1NlcnZpY2VDb25maWd1cmF0aW9uRXJyb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTNjNTQyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9TZXJ2aWNlQ29uZmlndXJhdGlvbkVycm9yLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbDsKKworLyoqCisgKiBFcnJvciB0aHJvd24gd2hlbiBzb21ldGhpbmcgZ29lcyB3cm9uZyB3aGlsZSBsb29raW5nIHVwIHNlcnZpY2UgcHJvdmlkZXJzLgorICogSW4gcGFydGljdWxhciwgdGhpcyBlcnJvciB3aWxsIGJlIHRocm93biBpbiB0aGUgZm9sbG93aW5nIHNpdHVhdGlvbnM6CisgKgorICogICA8dWw+CisgKiAgIDxsaT4gQSBjb25jcmV0ZSBwcm92aWRlciBjbGFzcyBjYW5ub3QgYmUgZm91bmQsCisgKiAgIDxsaT4gQSBjb25jcmV0ZSBwcm92aWRlciBjbGFzcyBjYW5ub3QgYmUgaW5zdGFudGlhdGVkLAorICogICA8bGk+IFRoZSBmb3JtYXQgb2YgYSBwcm92aWRlci1jb25maWd1cmF0aW9uIGZpbGUgaXMgaWxsZWdhbCwgb3IKKyAqICAgPGxpPiBBbiBJT0V4Y2VwdGlvbiBvY2N1cnMgd2hpbGUgcmVhZGluZyBhIHByb3ZpZGVyLWNvbmZpZ3VyYXRpb24gZmlsZS4KKyAqICAgPC91bD4KKyAqCisgKiBAYXV0aG9yIE1hcmsgUmVpbmhvbGQKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBTZXJ2aWNlQ29uZmlndXJhdGlvbkVycm9yIGV4dGVuZHMgRXJyb3IgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTg1MzIzOTIzMzgzMjY0MjgwNzRMOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSB3aXRoIHRoZSBzcGVjaWZpZWQgZGV0YWlsIHN0cmluZy4KKyAgICAgKiBAcGFyYW0gbXNnIHRoZSBkZXRhaWwgc3RyaW5nCisgICAgICovCisgICAgcHVibGljIFNlcnZpY2VDb25maWd1cmF0aW9uRXJyb3IoU3RyaW5nIG1zZykgeworICAgICAgICBzdXBlcihtc2cpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2UgdGhhdCB3cmFwcyB0aGUgc3BlY2lmaWVkIHRocm93YWJsZS4KKyAgICAgKiBAcGFyYW0geCB0aGUgdGhyb3dhYmxlIHRvIGJlIHdyYXBwZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU2VydmljZUNvbmZpZ3VyYXRpb25FcnJvcihUaHJvd2FibGUgeCkgeworICAgICAgICBzdXBlcih4KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL1NlcnZpY2VGaW5kZXIuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvU2VydmljZUZpbmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MTg0ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL1NlcnZpY2VGaW5kZXIuamF2YQpAQCAtMCwwICsxLDg4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUmVmbGVjdFBlcm1pc3Npb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlJlZmxlY3Rpb25IZWxwZXI7CisKKy8qKgorICogQSBzaW1wbGUgc2VydmljZS1wcm92aWRlciBsb29rdXAgbWVjaGFuaXNtLiAgQSA8aT5zZXJ2aWNlPC9pPiBpcyBhCisgKiB3ZWxsLWtub3duIHNldCBvZiBpbnRlcmZhY2VzIGFuZCAodXN1YWxseSBhYnN0cmFjdCkgY2xhc3Nlcy4gIEEgPGk+c2VydmljZQorICogcHJvdmlkZXI8L2k+IGlzIGEgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb2YgYSBzZXJ2aWNlLiAgVGhlIGNsYXNzZXMgaW4gYQorICogcHJvdmlkZXIgdHlwaWNhbGx5IGltcGxlbWVudCB0aGUgaW50ZXJmYWNlcyBhbmQgc3ViY2xhc3MgdGhlIGNsYXNzZXMgZGVmaW5lZAorICogaW4gdGhlIHNlcnZpY2UgaXRzZWxmLiAgU2VydmljZSBwcm92aWRlcnMgbWF5IGJlIGluc3RhbGxlZCBpbiBhbgorICogaW1wbGVtZW50YXRpb24gb2YgdGhlIEphdmEgcGxhdGZvcm0gaW4gdGhlIGZvcm0gb2YgZXh0ZW5zaW9ucywgdGhhdCBpcywgamFyCisgKiBmaWxlcyBwbGFjZWQgaW50byBhbnkgb2YgdGhlIHVzdWFsIGV4dGVuc2lvbiBkaXJlY3Rvcmllcy4gIFByb3ZpZGVycyBtYXkKKyAqIGFsc28gYmUgbWFkZSBhdmFpbGFibGUgYnkgYWRkaW5nIHRoZW0gdG8gdGhlIGFwcGxldCBvciBhcHBsaWNhdGlvbiBjbGFzcworICogcGF0aCBvciBieSBzb21lIG90aGVyIHBsYXRmb3JtLXNwZWNpZmljIG1lYW5zLgorICogPHAvPgorICogPHA+IEluIHRoaXMgbG9va3VwIG1lY2hhbmlzbSBhIHNlcnZpY2UgaXMgcmVwcmVzZW50ZWQgYnkgYW4gaW50ZXJmYWNlIG9yIGFuCisgKiBhYnN0cmFjdCBjbGFzcy4gIChBIGNvbmNyZXRlIGNsYXNzIG1heSBiZSB1c2VkLCBidXQgdGhpcyBpcyBub3QKKyAqIHJlY29tbWVuZGVkLikgIEEgcHJvdmlkZXIgb2YgYSBnaXZlbiBzZXJ2aWNlIGNvbnRhaW5zIG9uZSBvciBtb3JlIGNvbmNyZXRlCisgKiBjbGFzc2VzIHRoYXQgZXh0ZW5kIHRoaXMgPGk+c2VydmljZSBjbGFzczwvaT4gd2l0aCBkYXRhIGFuZCBjb2RlIHNwZWNpZmljIHRvCisgKiB0aGUgcHJvdmlkZXIuICBUaGlzIDxpPnByb3ZpZGVyIGNsYXNzPC9pPiB3aWxsIHR5cGljYWxseSBub3QgYmUgdGhlIGVudGlyZQorICogcHJvdmlkZXIgaXRzZWxmIGJ1dCByYXRoZXIgYSBwcm94eSB0aGF0IGNvbnRhaW5zIGVub3VnaCBpbmZvcm1hdGlvbiB0bworICogZGVjaWRlIHdoZXRoZXIgdGhlIHByb3ZpZGVyIGlzIGFibGUgdG8gc2F0aXNmeSBhIHBhcnRpY3VsYXIgcmVxdWVzdCB0b2dldGhlcgorICogd2l0aCBjb2RlIHRoYXQgY2FuIGNyZWF0ZSB0aGUgYWN0dWFsIHByb3ZpZGVyIG9uIGRlbWFuZC4gIFRoZSBkZXRhaWxzIG9mCisgKiBwcm92aWRlciBjbGFzc2VzIHRlbmQgdG8gYmUgaGlnaGx5IHNlcnZpY2Utc3BlY2lmaWM7IG5vIHNpbmdsZSBjbGFzcyBvcgorICogaW50ZXJmYWNlIGNvdWxkIHBvc3NpYmx5IHVuaWZ5IHRoZW0sIHNvIG5vIHN1Y2ggY2xhc3MgaGFzIGJlZW4gZGVmaW5lZC4gIFRoZQorICogb25seSByZXF1aXJlbWVudCBlbmZvcmNlZCBoZXJlIGlzIHRoYXQgcHJvdmlkZXIgY2xhc3NlcyBtdXN0IGhhdmUgYQorICogemVyby1hcmd1bWVudCBjb25zdHJ1Y3RvciBzbyB0aGF0IHRoZXkgbWF5IGJlIGluc3RhbnRpYXRlZCBkdXJpbmcgbG9va3VwLgorICogPHAvPgorICogPHA+VGhlIGRlZmF1bHQgc2VydmljZSBwcm92aWRlciByZWdpc3RyYXRpb24vbG9va3VwIG1lY2hhbmlzbSBiYXNlZAorICogb24gPHR0Pk1FVEEtSU5GL3NlcnZpY2VzPC90dD4gZmlsZXMgaXMgZGVzY3JpYmVkIGJlbG93LgorICogRm9yIGVudmlyb25tZW50cywgd2hlcmUgdGhlIGJhc2ljIG1lY2hhbmlzbSBpcyBub3Qgc3VpdGFibGUsIGNsaWVudHMKKyAqIGNhbiBlbmZvcmNlIGEgZGlmZmVyZW50IGFwcHJvYWNoIGJ5IHNldHRpbmcgdGhlaXIgY3VzdG9tIDx0dD5TZXJ2aWNlSXRlcmF0b3JQcm92aWRlcjwvdHQ+CisgKiBieSBjYWxsaW5nIDx0dD5zZXRJdGVyYXRvclByb3ZpZGVyPC90dD4uIFRoZSBjYWxsIG11c3QgYmUgbWFkZSBwcmlvciB0byBhbnkgbG9va3VwIGF0dGVtcHRzLgorICogPC9wPgorICogPHA+IEEgc2VydmljZSBwcm92aWRlciBpZGVudGlmaWVzIGl0c2VsZiBieSBwbGFjaW5nIGEgcHJvdmlkZXItY29uZmlndXJhdGlvbgorICogZmlsZSBpbiB0aGUgcmVzb3VyY2UgZGlyZWN0b3J5IDx0dD5NRVRBLUlORi9zZXJ2aWNlczwvdHQ+LiAgVGhlIGZpbGUncyBuYW1lCisgKiBzaG91bGQgY29uc2lzdCBvZiB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGFic3RyYWN0IHNlcnZpY2UgY2xhc3MuCisgKiBUaGUgZmlsZSBzaG91bGQgY29udGFpbiBhIGxpc3Qgb2YgZnVsbHktcXVhbGlmaWVkIGNvbmNyZXRlIHByb3ZpZGVyLWNsYXNzCisgKiBuYW1lcywgb25lIHBlciBsaW5lLiAgU3BhY2UgYW5kIHRhYiBjaGFyYWN0ZXJzIHN1cnJvdW5kaW5nIGVhY2ggbmFtZSwgYXMKKyAqIHdlbGwgYXMgYmxhbmsgbGluZXMsIGFyZSBpZ25vcmVkLiAgVGhlIGNvbW1lbnQgY2hhcmFjdGVyIGlzIDx0dD4nIyc8L3R0PgorICogKDx0dD4weDIzPC90dD4pOyBvbiBlYWNoIGxpbmUgYWxsIGNoYXJhY3RlcnMgZm9sbG93aW5nIHRoZSBmaXJzdCBjb21tZW50CisgKiBjaGFyYWN0ZXIgYXJlIGlnbm9yZWQuICBUaGUgZmlsZSBtdXN0IGJlIGVuY29kZWQgaW4gVVRGLTguCisgKiA8cC8+CisgKiA8cD4gSWYgYSBwYXJ0aWN1bGFyIGNvbmNyZXRlIHByb3ZpZGVyIGNsYXNzIGlzIG5hbWVkIGluIG1vcmUgdGhhbiBvbmUKKyAqIGNvbmZpZ3VyYXRpb24gZmlsZSwgb3IgaXMgbmFtZWQgaW4gdGhlIHNhbWUgY29uZmlndXJhdGlvbiBmaWxlIG1vcmUgdGhhbgorICogb25jZSwgdGhlbiB0aGUgZHVwbGljYXRlcyB3aWxsIGJlIGlnbm9yZWQuICBUaGUgY29uZmlndXJhdGlvbiBmaWxlIG5hbWluZyBhCisgKiBwYXJ0aWN1bGFyIHByb3ZpZGVyIG5lZWQgbm90IGJlIGluIHRoZSBzYW1lIGphciBmaWxlIG9yIG90aGVyIGRpc3RyaWJ1dGlvbgorICogdW5pdCBhcyB0aGUgcHJvdmlkZXIgaXRzZWxmLiAgVGhlIHByb3ZpZGVyIG11c3QgYmUgYWNjZXNzaWJsZSBmcm9tIHRoZSBzYW1lCisgKiBjbGFzcyBsb2FkZXIgdGhhdCB3YXMgaW5pdGlhbGx5IHF1ZXJpZWQgdG8gbG9jYXRlIHRoZSBjb25maWd1cmF0aW9uIGZpbGU7CisgKiBub3RlIHRoYXQgdGhpcyBpcyBub3QgbmVjZXNzYXJpbHkgdGhlIGNsYXNzIGxvYWRlciB0aGF0IGZvdW5kIHRoZSBmaWxlLgorICogPHAvPgorICogPHA+IDxiPkV4YW1wbGU6PC9iPiBTdXBwb3NlIHdlIGhhdmUgYSBzZXJ2aWNlIGNsYXNzIG5hbWVkCisgKiA8dHQ+amF2YS5pby5zcGkuQ2hhckNvZGVjPC90dD4uICBJdCBoYXMgdHdvIGFic3RyYWN0IG1ldGhvZHM6CisgKiA8cC8+CisgKiA8cHJlPgorICogICBwdWJsaWMgYWJzdHJhY3QgQ2hhckVuY29kZXIgZ2V0RW5jb2RlcihTdHJpbmcgZW5jb2RpbmdOYW1lKTsKKyAqICAgcHVibGljIGFic3RyYWN0IENoYXJEZWNvZGVyIGdldERlY29kZXIoU3RyaW5nIGVuY29kaW5nTmFtZSk7CisgKiA8L3ByZT4KKyAqIDxwLz4KKyAqIEVhY2ggbWV0aG9kIHJldHVybnMgYW4gYXBwcm9wcmlhdGUgb2JqZWN0IG9yIDx0dD5udWxsPC90dD4gaWYgaXQgY2Fubm90CisgKiB0cmFuc2xhdGUgdGhlIGdpdmVuIGVuY29kaW5nLiAgVHlwaWNhbCA8dHQ+Q2hhckNvZGVjPC90dD4gcHJvdmlkZXJzIHdpbGwKKyAqIHN1cHBvcnQgbW9yZSB0aGFuIG9uZSBlbmNvZGluZy4KKyAqIDxwLz4KKyAqIDxwPiBJZiA8dHQ+c3VuLmlvLlN0YW5kYXJkQ29kZWM8L3R0PiBpcyBhIHByb3ZpZGVyIG9mIHRoZSA8dHQ+Q2hhckNvZGVjPC90dD4KKyAqIHNlcnZpY2UgdGhlbiBpdHMgamFyIGZpbGUgd291bGQgY29udGFpbiB0aGUgZmlsZQorICogPHR0Pk1FVEEtSU5GL3NlcnZpY2VzL2phdmEuaW8uc3BpLkNoYXJDb2RlYzwvdHQ+LiAgVGhpcyBmaWxlIHdvdWxkIGNvbnRhaW4KKyAqIHRoZSBzaW5nbGUgbGluZToKKyAqIDxwLz4KKyAqIDxwcmU+CisgKiAgIHN1bi5pby5TdGFuZGFyZENvZGVjICAgICMgU3RhbmRhcmQgY29kZWNzIGZvciB0aGUgcGxhdGZvcm0KKyAqIDwvcHJlPgorICogPHAvPgorICogVG8gbG9jYXRlIGFuIGNvZGVjIGZvciBhIGdpdmVuIGVuY29kaW5nIG5hbWUsIHRoZSBpbnRlcm5hbCBJL08gY29kZSB3b3VsZAorICogZG8gc29tZXRoaW5nIGxpa2UgdGhpczoKKyAqIDxwLz4KKyAqIDxwcmU+CisgKiAgIENoYXJFbmNvZGVyIGdldEVuY29kZXIoU3RyaW5nIGVuY29kaW5nTmFtZSkgeworICogICAgICAgZm9yKCBDaGFyQ29kZWMgY2MgOiBTZXJ2aWNlRmluZGVyLmZpbmQoQ2hhckNvZGVjLmNsYXNzKSApIHsKKyAqICAgICAgICAgICBDaGFyRW5jb2RlciBjZSA9IGNjLmdldEVuY29kZXIoZW5jb2RpbmdOYW1lKTsKKyAqICAgICAgICAgICBpZiAoY2UgIT0gbnVsbCkKKyAqICAgICAgICAgICAgICAgcmV0dXJuIGNlOworICogICAgICAgfQorICogICAgICAgcmV0dXJuIG51bGw7CisgKiAgIH0KKyAqIDwvcHJlPgorICogPHAvPgorICogVGhlIHByb3ZpZGVyLWxvb2t1cCBtZWNoYW5pc20gYWx3YXlzIGV4ZWN1dGVzIGluIHRoZSBzZWN1cml0eSBjb250ZXh0IG9mIHRoZQorICogY2FsbGVyLiAgVHJ1c3RlZCBzeXN0ZW0gY29kZSBzaG91bGQgdHlwaWNhbGx5IGludm9rZSB0aGUgbWV0aG9kcyBpbiB0aGlzCisgKiBjbGFzcyBmcm9tIHdpdGhpbiBhIHByaXZpbGVnZWQgc2VjdXJpdHkgY29udGV4dC4KKyAqCisgKiBAcGFyYW0gPFQ+IHRoZSB0eXBlIG9mIHRoZSBzZXJ2aWNlIGluc3RhbmNlLgorICogQGF1dGhvciBNYXJrIFJlaW5ob2xkCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTZXJ2aWNlRmluZGVyPFQ+IGltcGxlbWVudHMgSXRlcmFibGU8VD4geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoU2VydmljZUZpbmRlci5jbGFzcy5nZXROYW1lKCkpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSAiTUVUQS1JTkYvc2VydmljZXMvIjsKKyAgICBwcml2YXRlIGZpbmFsIENsYXNzPFQ+IHNlcnZpY2VDbGFzczsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBzZXJ2aWNlTmFtZTsKKyAgICBwcml2YXRlIGZpbmFsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyOworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpZ25vcmVPbkNsYXNzTm90Rm91bmQ7CisKKyAgICBzdGF0aWMgeworICAgICAgICBmaW5hbCBPc2dpUmVnaXN0cnkgb3NnaVJlZ2lzdHJ5ID0gUmVmbGVjdGlvbkhlbHBlci5nZXRPc2dpUmVnaXN0cnlJbnN0YW5jZSgpOworCisgICAgICAgIGlmIChvc2dpUmVnaXN0cnkgIT0gbnVsbCkgeworICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5DT05GSUcsICJSdW5uaW5nIGluIGFuIE9TR2kgZW52aXJvbm1lbnQiKTsKKworICAgICAgICAgICAgb3NnaVJlZ2lzdHJ5Lmhvb2tVcCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5DT05GSUcsICJSdW5uaW5nIGluIGEgbm9uLU9TR2kgZW52aXJvbm1lbnQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEVudW1lcmF0aW9uPFVSTD4gZ2V0UmVzb3VyY2VzKGZpbmFsIENsYXNzTG9hZGVyIGxvYWRlciwgZmluYWwgU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChsb2FkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGdldFJlc291cmNlcyhuYW1lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbmFsIEVudW1lcmF0aW9uPFVSTD4gcmVzb3VyY2VzID0gbG9hZGVyLmdldFJlc291cmNlcyhuYW1lKTsKKyAgICAgICAgICAgIGlmICgocmVzb3VyY2VzICE9IG51bGwpICYmIHJlc291cmNlcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXNvdXJjZXM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBnZXRSZXNvdXJjZXMobmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBFbnVtZXJhdGlvbjxVUkw+IGdldFJlc291cmNlcyhmaW5hbCBTdHJpbmcgbmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKFNlcnZpY2VGaW5kZXIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gU2VydmljZUZpbmRlci5jbGFzcy5nZXRDbGFzc0xvYWRlcigpLmdldFJlc291cmNlcyhuYW1lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBDbGFzc0xvYWRlci5nZXRTeXN0ZW1SZXNvdXJjZXMobmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBDbGFzc0xvYWRlciBfZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkgeworICAgICAgICByZXR1cm4gQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoUmVmbGVjdGlvbkhlbHBlci5nZXRDb250ZXh0Q2xhc3NMb2FkZXJQQSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2NhdGVzIGFuZCBpbmNyZW1lbnRhbGx5IGluc3RhbnRpYXRlcyB0aGUgYXZhaWxhYmxlIHByb3ZpZGVycyBvZiBhCisgICAgICogZ2l2ZW4gc2VydmljZSB1c2luZyB0aGUgZ2l2ZW4gY2xhc3MgbG9hZGVyLgorICAgICAqIDxwLz4KKyAgICAgKiA8cD4gVGhpcyBtZXRob2QgdHJhbnNmb3JtcyB0aGUgbmFtZSBvZiB0aGUgZ2l2ZW4gc2VydmljZSBjbGFzcyBpbnRvIGEKKyAgICAgKiBwcm92aWRlci1jb25maWd1cmF0aW9uIGZpbGVuYW1lIGFzIGRlc2NyaWJlZCBhYm92ZSBhbmQgdGhlbiB1c2VzIHRoZQorICAgICAqIDx0dD5nZXRSZXNvdXJjZXM8L3R0PiBtZXRob2Qgb2YgdGhlIGdpdmVuIGNsYXNzIGxvYWRlciB0byBmaW5kIGFsbAorICAgICAqIGF2YWlsYWJsZSBmaWxlcyB3aXRoIHRoYXQgbmFtZS4gIFRoZXNlIGZpbGVzIGFyZSB0aGVuIHJlYWQgYW5kIHBhcnNlZCB0bworICAgICAqIHByb2R1Y2UgYSBsaXN0IG9mIHByb3ZpZGVyLWNsYXNzIG5hbWVzLiAgVGhlIGl0ZXJhdG9yIHRoYXQgaXMgcmV0dXJuZWQKKyAgICAgKiB1c2VzIHRoZSBnaXZlbiBjbGFzcyBsb2FkZXIgdG8gbG9va3VwIGFuZCB0aGVuIGluc3RhbnRpYXRlIGVhY2ggZWxlbWVudAorICAgICAqIG9mIHRoZSBsaXN0LgorICAgICAqIDxwLz4KKyAgICAgKiA8cD4gQmVjYXVzZSBpdCBpcyBwb3NzaWJsZSBmb3IgZXh0ZW5zaW9ucyB0byBiZSBpbnN0YWxsZWQgaW50byBhIHJ1bm5pbmcKKyAgICAgKiBKYXZhIHZpcnR1YWwgbWFjaGluZSwgdGhpcyBtZXRob2QgbWF5IHJldHVybiBkaWZmZXJlbnQgcmVzdWx0cyBlYWNoIHRpbWUKKyAgICAgKiBpdCBpcyBpbnZva2VkLiA8cD4KKyAgICAgKiBAcGFyYW0gc2VydmljZSBUaGUgc2VydmljZSdzIGFic3RyYWN0IHNlcnZpY2UgY2xhc3MKKyAgICAgKiBAcGFyYW0gbG9hZGVyIFRoZSBjbGFzcyBsb2FkZXIgdG8gYmUgdXNlZCB0byBsb2FkIHByb3ZpZGVyLWNvbmZpZ3VyYXRpb24gZmlsZXMKKyAgICAgKiAgICAgICAgICAgICAgICBhbmQgaW5zdGFudGlhdGUgcHJvdmlkZXIgY2xhc3Nlcywgb3IgPHR0Pm51bGw8L3R0PiBpZiB0aGUgc3lzdGVtCisgICAgICogICAgICAgICAgICAgICAgY2xhc3MgbG9hZGVyIChvciwgZmFpbGluZyB0aGF0IHRoZSBib290c3RyYXAgY2xhc3MgbG9hZGVyKSBpcyB0bworICAgICAqICAgICAgICAgICAgICAgIGJlIHVzZWQKKyAgICAgKiBAdGhyb3dzIFNlcnZpY2VDb25maWd1cmF0aW9uRXJyb3IgSWYgYSBwcm92aWRlci1jb25maWd1cmF0aW9uIGZpbGUgdmlvbGF0ZXMgdGhlIHNwZWNpZmllZCBmb3JtYXQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgbmFtZXMgYSBwcm92aWRlciBjbGFzcyB0aGF0IGNhbm5vdCBiZSBmb3VuZCBhbmQgaW5zdGFudGlhdGVkCisgICAgICogQHNlZSAjZmluZChDbGFzcykKKyAgICAgKiBAcGFyYW0gPFQ+IHRoZSB0eXBlIG9mIHRoZSBzZXJ2aWNlIGluc3RhbmNlLgorICAgICAqIEByZXR1cm4gdGhlIHNlcnZpY2UgZmluZGVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8VD4gU2VydmljZUZpbmRlcjxUPiBmaW5kKGZpbmFsIENsYXNzPFQ+IHNlcnZpY2UsIGZpbmFsIENsYXNzTG9hZGVyIGxvYWRlcikKKyAgICAgICAgICAgIHRocm93cyBTZXJ2aWNlQ29uZmlndXJhdGlvbkVycm9yIHsKKyAgICAgICAgcmV0dXJuIGZpbmQoc2VydmljZSwKKyAgICAgICAgICAgICAgICBsb2FkZXIsCisgICAgICAgICAgICAgICAgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvY2F0ZXMgYW5kIGluY3JlbWVudGFsbHkgaW5zdGFudGlhdGVzIHRoZSBhdmFpbGFibGUgcHJvdmlkZXJzIG9mIGEKKyAgICAgKiBnaXZlbiBzZXJ2aWNlIHVzaW5nIHRoZSBnaXZlbiBjbGFzcyBsb2FkZXIuCisgICAgICogPHAvPgorICAgICAqIDxwPiBUaGlzIG1ldGhvZCB0cmFuc2Zvcm1zIHRoZSBuYW1lIG9mIHRoZSBnaXZlbiBzZXJ2aWNlIGNsYXNzIGludG8gYQorICAgICAqIHByb3ZpZGVyLWNvbmZpZ3VyYXRpb24gZmlsZW5hbWUgYXMgZGVzY3JpYmVkIGFib3ZlIGFuZCB0aGVuIHVzZXMgdGhlCisgICAgICogPHR0PmdldFJlc291cmNlczwvdHQ+IG1ldGhvZCBvZiB0aGUgZ2l2ZW4gY2xhc3MgbG9hZGVyIHRvIGZpbmQgYWxsCisgICAgICogYXZhaWxhYmxlIGZpbGVzIHdpdGggdGhhdCBuYW1lLiAgVGhlc2UgZmlsZXMgYXJlIHRoZW4gcmVhZCBhbmQgcGFyc2VkIHRvCisgICAgICogcHJvZHVjZSBhIGxpc3Qgb2YgcHJvdmlkZXItY2xhc3MgbmFtZXMuICBUaGUgaXRlcmF0b3IgdGhhdCBpcyByZXR1cm5lZAorICAgICAqIHVzZXMgdGhlIGdpdmVuIGNsYXNzIGxvYWRlciB0byBsb29rdXAgYW5kIHRoZW4gaW5zdGFudGlhdGUgZWFjaCBlbGVtZW50CisgICAgICogb2YgdGhlIGxpc3QuCisgICAgICogPHAvPgorICAgICAqIDxwPiBCZWNhdXNlIGl0IGlzIHBvc3NpYmxlIGZvciBleHRlbnNpb25zIHRvIGJlIGluc3RhbGxlZCBpbnRvIGEgcnVubmluZworICAgICAqIEphdmEgdmlydHVhbCBtYWNoaW5lLCB0aGlzIG1ldGhvZCBtYXkgcmV0dXJuIGRpZmZlcmVudCByZXN1bHRzIGVhY2ggdGltZQorICAgICAqIGl0IGlzIGludm9rZWQuIDxwPgorICAgICAqIEBwYXJhbSBzZXJ2aWNlIFRoZSBzZXJ2aWNlJ3MgYWJzdHJhY3Qgc2VydmljZSBjbGFzcworICAgICAqIEBwYXJhbSBsb2FkZXIgVGhlIGNsYXNzIGxvYWRlciB0byBiZSB1c2VkIHRvIGxvYWQgcHJvdmlkZXItY29uZmlndXJhdGlvbiBmaWxlcworICAgICAqICAgICAgICAgICAgICAgIGFuZCBpbnN0YW50aWF0ZSBwcm92aWRlciBjbGFzc2VzLCBvciA8dHQ+bnVsbDwvdHQ+IGlmIHRoZSBzeXN0ZW0KKyAgICAgKiAgICAgICAgICAgICAgICBjbGFzcyBsb2FkZXIgKG9yLCBmYWlsaW5nIHRoYXQgdGhlIGJvb3RzdHJhcCBjbGFzcyBsb2FkZXIpIGlzIHRvCisgICAgICogICAgICAgICAgICAgICAgYmUgdXNlZAorICAgICAqIEBwYXJhbSBpZ25vcmVPbkNsYXNzTm90Rm91bmQgSWYgYSBwcm92aWRlciBjYW5ub3QgYmUgbG9hZGVkIGJ5IHRoZSBjbGFzcyBsb2FkZXIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4gbW92ZSBvbiB0byB0aGUgbmV4dCBhdmFpbGFibGUgcHJvdmlkZXIuCisgICAgICogQHRocm93cyBTZXJ2aWNlQ29uZmlndXJhdGlvbkVycm9yIElmIGEgcHJvdmlkZXItY29uZmlndXJhdGlvbiBmaWxlIHZpb2xhdGVzIHRoZSBzcGVjaWZpZWQgZm9ybWF0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIG5hbWVzIGEgcHJvdmlkZXIgY2xhc3MgdGhhdCBjYW5ub3QgYmUgZm91bmQgYW5kIGluc3RhbnRpYXRlZAorICAgICAqIEBzZWUgI2ZpbmQoQ2xhc3MpCisgICAgICogQHBhcmFtIDxUPiB0aGUgdHlwZSBvZiB0aGUgc2VydmljZSBpbnN0YW5jZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBzZXJ2aWNlIGZpbmRlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFNlcnZpY2VGaW5kZXI8VD4gZmluZChmaW5hbCBDbGFzczxUPiBzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzc0xvYWRlciBsb2FkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaWdub3JlT25DbGFzc05vdEZvdW5kKSB0aHJvd3MgU2VydmljZUNvbmZpZ3VyYXRpb25FcnJvciB7CisgICAgICAgIHJldHVybiBuZXcgU2VydmljZUZpbmRlcjxUPihzZXJ2aWNlLAorICAgICAgICAgICAgICAgIGxvYWRlciwKKyAgICAgICAgICAgICAgICBpZ25vcmVPbkNsYXNzTm90Rm91bmQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvY2F0ZXMgYW5kIGluY3JlbWVudGFsbHkgaW5zdGFudGlhdGVzIHRoZSBhdmFpbGFibGUgcHJvdmlkZXJzIG9mIGEKKyAgICAgKiBnaXZlbiBzZXJ2aWNlIHVzaW5nIHRoZSBjb250ZXh0IGNsYXNzIGxvYWRlci4gIFRoaXMgY29udmVuaWVuY2UgbWV0aG9kCisgICAgICogaXMgZXF1aXZhbGVudCB0bworICAgICAqIDxwLz4KKyAgICAgKiA8cHJlPgorICAgICAqICAgQ2xhc3NMb2FkZXIgY2wgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworICAgICAqICAgcmV0dXJuIFNlcnZpY2UucHJvdmlkZXJzKHNlcnZpY2UsIGNsLCBmYWxzZSk7CisgICAgICogPC9wcmU+CisgICAgICogQHBhcmFtIHNlcnZpY2UgVGhlIHNlcnZpY2UncyBhYnN0cmFjdCBzZXJ2aWNlIGNsYXNzCisgICAgICogQHRocm93cyBTZXJ2aWNlQ29uZmlndXJhdGlvbkVycm9yIElmIGEgcHJvdmlkZXItY29uZmlndXJhdGlvbiBmaWxlIHZpb2xhdGVzIHRoZSBzcGVjaWZpZWQgZm9ybWF0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIG5hbWVzIGEgcHJvdmlkZXIgY2xhc3MgdGhhdCBjYW5ub3QgYmUgZm91bmQgYW5kIGluc3RhbnRpYXRlZAorICAgICAqIEBzZWUgI2ZpbmQoQ2xhc3MsIENsYXNzTG9hZGVyKQorICAgICAqIEBwYXJhbSA8VD4gdGhlIHR5cGUgb2YgdGhlIHNlcnZpY2UgaW5zdGFuY2UuCisgICAgICogQHJldHVybiB0aGUgc2VydmljZSBmaW5kZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUPiBTZXJ2aWNlRmluZGVyPFQ+IGZpbmQoZmluYWwgQ2xhc3M8VD4gc2VydmljZSkKKyAgICAgICAgICAgIHRocm93cyBTZXJ2aWNlQ29uZmlndXJhdGlvbkVycm9yIHsKKyAgICAgICAgcmV0dXJuIGZpbmQoc2VydmljZSwKKyAgICAgICAgICAgICAgICBfZ2V0Q29udGV4dENsYXNzTG9hZGVyKCksCisgICAgICAgICAgICAgICAgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvY2F0ZXMgYW5kIGluY3JlbWVudGFsbHkgaW5zdGFudGlhdGVzIHRoZSBhdmFpbGFibGUgcHJvdmlkZXJzIG9mIGEKKyAgICAgKiBnaXZlbiBzZXJ2aWNlIHVzaW5nIHRoZSBjb250ZXh0IGNsYXNzIGxvYWRlci4gIFRoaXMgY29udmVuaWVuY2UgbWV0aG9kCisgICAgICogaXMgZXF1aXZhbGVudCB0bworICAgICAqIDxwLz4KKyAgICAgKiA8cHJlPgorICAgICAqICAgQ2xhc3NMb2FkZXIgY2wgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworICAgICAqICAgYm9vbGVhbiBpbmdvcmUgPSAuLi4KKyAgICAgKiAgIHJldHVybiBTZXJ2aWNlLnByb3ZpZGVycyhzZXJ2aWNlLCBjbCwgaWdub3JlKTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKiBAcGFyYW0gc2VydmljZSBUaGUgc2VydmljZSdzIGFic3RyYWN0IHNlcnZpY2UgY2xhc3MKKyAgICAgKiBAcGFyYW0gaWdub3JlT25DbGFzc05vdEZvdW5kIElmIGEgcHJvdmlkZXIgY2Fubm90IGJlIGxvYWRlZCBieSB0aGUgY2xhc3MgbG9hZGVyCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVuIG1vdmUgb24gdG8gdGhlIG5leHQgYXZhaWxhYmxlIHByb3ZpZGVyLgorICAgICAqIEB0aHJvd3MgU2VydmljZUNvbmZpZ3VyYXRpb25FcnJvciBJZiBhIHByb3ZpZGVyLWNvbmZpZ3VyYXRpb24gZmlsZSB2aW9sYXRlcyB0aGUgc3BlY2lmaWVkIGZvcm1hdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBuYW1lcyBhIHByb3ZpZGVyIGNsYXNzIHRoYXQgY2Fubm90IGJlIGZvdW5kIGFuZCBpbnN0YW50aWF0ZWQKKyAgICAgKiBAc2VlICNmaW5kKENsYXNzLCBDbGFzc0xvYWRlcikKKyAgICAgKiBAcGFyYW0gPFQ+IHRoZSB0eXBlIG9mIHRoZSBzZXJ2aWNlIGluc3RhbmNlLgorICAgICAqIEByZXR1cm4gdGhlIHNlcnZpY2UgZmluZGVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8VD4gU2VydmljZUZpbmRlcjxUPiBmaW5kKGZpbmFsIENsYXNzPFQ+IHNlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaWdub3JlT25DbGFzc05vdEZvdW5kKSB0aHJvd3MgU2VydmljZUNvbmZpZ3VyYXRpb25FcnJvciB7CisgICAgICAgIHJldHVybiBmaW5kKHNlcnZpY2UsCisgICAgICAgICAgICAgICAgX2dldENvbnRleHRDbGFzc0xvYWRlcigpLAorICAgICAgICAgICAgICAgIGlnbm9yZU9uQ2xhc3NOb3RGb3VuZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9jYXRlcyBhbmQgaW5jcmVtZW50YWxseSBpbnN0YW50aWF0ZXMgdGhlIGF2YWlsYWJsZSBjbGFzc2VzIG9mIGEgZ2l2ZW4KKyAgICAgKiBzZXJ2aWNlIGZpbGUgdXNpbmcgdGhlIGNvbnRleHQgY2xhc3MgbG9hZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHNlcnZpY2VOYW1lIHRoZSBzZXJ2aWNlIG5hbWUgY29ycmVzcG9uZCB0byBhIGZpbGUgaW4KKyAgICAgKiAgICAgICAgTUVUQS1JTkYvc2VydmljZXMgdGhhdCBjb250YWlucyBhIGxpc3Qgb2YgZnVsbHkgcXVhbGlmaWVkIGNsYXNzCisgICAgICogICAgICAgIG5hbWVzCisgICAgICogQHRocm93cyBTZXJ2aWNlQ29uZmlndXJhdGlvbkVycm9yIElmIGEgc2VydmljZSBmaWxlIHZpb2xhdGVzIHRoZSBzcGVjaWZpZWQgZm9ybWF0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIG5hbWVzIGEgcHJvdmlkZXIgY2xhc3MgdGhhdCBjYW5ub3QgYmUgZm91bmQgYW5kIGluc3RhbnRpYXRlZAorICAgICAqIEByZXR1cm4gdGhlIHNlcnZpY2UgZmluZGVyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTZXJ2aWNlRmluZGVyPD8+IGZpbmQoZmluYWwgU3RyaW5nIHNlcnZpY2VOYW1lKSB0aHJvd3MgU2VydmljZUNvbmZpZ3VyYXRpb25FcnJvciB7CisgICAgICAgIHJldHVybiBuZXcgU2VydmljZUZpbmRlcjxPYmplY3Q+KE9iamVjdC5jbGFzcywgc2VydmljZU5hbWUsIF9nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIHRoZSBzZXJ2aWNlIGl0ZXJhdG9yIHByb3ZpZGVyIHRvIGl0ZXJhdGUgb24gcHJvdmlkZXIgaW5zdGFuY2VzCisgICAgICogb3IgY2xhc3Nlcy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZWdpc3RlcmVkLCB7QGxpbmsgRGVmYXVsdFNlcnZpY2VJdGVyYXRvclByb3ZpZGVyfSwKKyAgICAgKiBsb29rcyB1cCBwcm92aWRlciBjbGFzc2VzIGluIE1FVEEtSU5GL3NlcnZpY2UgZmlsZXMuCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgcHJpb3IgdG8gYW55IGF0dGVtcHRzIHRvIG9idGFpbiBwcm92aWRlcgorICAgICAqIGluc3RhbmNlcyBvciBjbGFzc2VzLgorICAgICAqCisgICAgICogQHBhcmFtIHNpcCB0aGUgc2VydmljZSBpdGVyYXRvciBwcm92aWRlci4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIGlmIHRoZSBwcm92aWRlciBjYW5ub3QgYmUgcmVnaXN0ZXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0SXRlcmF0b3JQcm92aWRlcihmaW5hbCBTZXJ2aWNlSXRlcmF0b3JQcm92aWRlciBzaXApIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiB7CisgICAgICAgIFNlcnZpY2VJdGVyYXRvclByb3ZpZGVyLnNldEluc3RhbmNlKHNpcCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTZXJ2aWNlRmluZGVyKAorICAgICAgICAgICAgZmluYWwgQ2xhc3M8VD4gc2VydmljZSwKKyAgICAgICAgICAgIGZpbmFsIENsYXNzTG9hZGVyIGxvYWRlciwKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaWdub3JlT25DbGFzc05vdEZvdW5kKSB7CisgICAgICAgIHRoaXMoc2VydmljZSwgc2VydmljZS5nZXROYW1lKCksIGxvYWRlciwgaWdub3JlT25DbGFzc05vdEZvdW5kKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFNlcnZpY2VGaW5kZXIoCisgICAgICAgICAgICBmaW5hbCBDbGFzczxUPiBzZXJ2aWNlLAorICAgICAgICAgICAgZmluYWwgU3RyaW5nIHNlcnZpY2VOYW1lLAorICAgICAgICAgICAgZmluYWwgQ2xhc3NMb2FkZXIgbG9hZGVyLAorICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpZ25vcmVPbkNsYXNzTm90Rm91bmQpIHsKKyAgICAgICAgdGhpcy5zZXJ2aWNlQ2xhc3MgPSBzZXJ2aWNlOworICAgICAgICB0aGlzLnNlcnZpY2VOYW1lID0gc2VydmljZU5hbWU7CisgICAgICAgIHRoaXMuY2xhc3NMb2FkZXIgPSBsb2FkZXI7CisgICAgICAgIHRoaXMuaWdub3JlT25DbGFzc05vdEZvdW5kID0gaWdub3JlT25DbGFzc05vdEZvdW5kOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgZGlzY292ZXJlZCBvYmplY3RzIGluY3JlbWVudGFsbHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEFuIDx0dD5JdGVyYXRvcjwvdHQ+IHRoYXQgeWllbGRzIHByb3ZpZGVyIG9iamVjdHMgZm9yIHRoZSBnaXZlbgorICAgICAqICAgICAgICAgc2VydmljZSwgaW4gc29tZSBhcmJpdHJhcnkgb3JkZXIuICBUaGUgaXRlcmF0b3Igd2lsbCB0aHJvdyBhCisgICAgICogICAgICAgICA8dHQ+U2VydmljZUNvbmZpZ3VyYXRpb25FcnJvcjwvdHQ+IGlmIGEgcHJvdmlkZXItY29uZmlndXJhdGlvbgorICAgICAqICAgICAgICAgZmlsZSB2aW9sYXRlcyB0aGUgc3BlY2lmaWVkIGZvcm1hdCBvciBpZiBhIHByb3ZpZGVyIGNsYXNzIGNhbm5vdAorICAgICAqICAgICAgICAgYmUgZm91bmQgYW5kIGluc3RhbnRpYXRlZC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSXRlcmF0b3I8VD4gaXRlcmF0b3IoKSB7CisgICAgICAgIHJldHVybiBTZXJ2aWNlSXRlcmF0b3JQcm92aWRlci5nZXRJbnN0YW5jZSgpCisgICAgICAgICAgICAgICAgLmNyZWF0ZUl0ZXJhdG9yKHNlcnZpY2VDbGFzcywgc2VydmljZU5hbWUsIGNsYXNzTG9hZGVyLCBpZ25vcmVPbkNsYXNzTm90Rm91bmQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgZGlzY292ZXJlZCBvYmplY3RzIGFsbCBhdCBvbmNlLgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICAgY2FuIGJlIGVtcHR5IGJ1dCBuZXZlciBudWxsLgorICAgICAqCisgICAgICogQHRocm93cyBTZXJ2aWNlQ29uZmlndXJhdGlvbkVycm9yIElmIGEgcHJvdmlkZXItY29uZmlndXJhdGlvbiBmaWxlIHZpb2xhdGVzIHRoZSBzcGVjaWZpZWQgZm9ybWF0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIG5hbWVzIGEgcHJvdmlkZXIgY2xhc3MgdGhhdCBjYW5ub3QgYmUgZm91bmQgYW5kIGluc3RhbnRpYXRlZAorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBUW10gdG9BcnJheSgpIHRocm93cyBTZXJ2aWNlQ29uZmlndXJhdGlvbkVycm9yIHsKKyAgICAgICAgZmluYWwgTGlzdDxUPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PFQ+KCk7CisgICAgICAgIGZvciAoZmluYWwgVCB0IDogdGhpcykgeworICAgICAgICAgICAgcmVzdWx0LmFkZCh0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0LnRvQXJyYXkoKFRbXSkgQXJyYXkubmV3SW5zdGFuY2Uoc2VydmljZUNsYXNzLCByZXN1bHQuc2l6ZSgpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBkaXNjb3ZlcmVkIGNsYXNzZXMgYWxsIGF0IG9uY2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgICBjYW4gYmUgZW1wdHkgYnV0IG5ldmVyIG51bGwuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFNlcnZpY2VDb25maWd1cmF0aW9uRXJyb3IgSWYgYSBwcm92aWRlci1jb25maWd1cmF0aW9uIGZpbGUgdmlvbGF0ZXMgdGhlIHNwZWNpZmllZCBmb3JtYXQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgbmFtZXMgYSBwcm92aWRlciBjbGFzcyB0aGF0IGNhbm5vdCBiZSBmb3VuZAorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBDbGFzczxUPltdIHRvQ2xhc3NBcnJheSgpIHRocm93cyBTZXJ2aWNlQ29uZmlndXJhdGlvbkVycm9yIHsKKyAgICAgICAgZmluYWwgTGlzdDxDbGFzczxUPj4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxDbGFzczxUPj4oKTsKKworICAgICAgICBmaW5hbCBTZXJ2aWNlSXRlcmF0b3JQcm92aWRlciBpdGVyYXRvclByb3ZpZGVyID0gU2VydmljZUl0ZXJhdG9yUHJvdmlkZXIuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgZmluYWwgSXRlcmF0b3I8Q2xhc3M8VD4+IGkgPSBpdGVyYXRvclByb3ZpZGVyCisgICAgICAgICAgICAgICAgLmNyZWF0ZUNsYXNzSXRlcmF0b3Ioc2VydmljZUNsYXNzLCBzZXJ2aWNlTmFtZSwgY2xhc3NMb2FkZXIsIGlnbm9yZU9uQ2xhc3NOb3RGb3VuZCk7CisgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgeworICAgICAgICAgICAgcmVzdWx0LmFkZChpLm5leHQoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC50b0FycmF5KChDbGFzczxUPltdKSBBcnJheS5uZXdJbnN0YW5jZShDbGFzcy5jbGFzcywgcmVzdWx0LnNpemUoKSkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZmFpbChmaW5hbCBTdHJpbmcgc2VydmljZU5hbWUsIGZpbmFsIFN0cmluZyBtc2csIGZpbmFsIFRocm93YWJsZSBjYXVzZSkKKyAgICAgICAgICAgIHRocm93cyBTZXJ2aWNlQ29uZmlndXJhdGlvbkVycm9yIHsKKyAgICAgICAgZmluYWwgU2VydmljZUNvbmZpZ3VyYXRpb25FcnJvciBzY2UgPSBuZXcgU2VydmljZUNvbmZpZ3VyYXRpb25FcnJvcihzZXJ2aWNlTmFtZSArICI6ICIgKyBtc2cpOworICAgICAgICBzY2UuaW5pdENhdXNlKGNhdXNlKTsKKyAgICAgICAgdGhyb3cgc2NlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZmFpbChmaW5hbCBTdHJpbmcgc2VydmljZU5hbWUsIGZpbmFsIFN0cmluZyBtc2cpCisgICAgICAgICAgICB0aHJvd3MgU2VydmljZUNvbmZpZ3VyYXRpb25FcnJvciB7CisgICAgICAgIHRocm93IG5ldyBTZXJ2aWNlQ29uZmlndXJhdGlvbkVycm9yKHNlcnZpY2VOYW1lICsgIjogIiArIG1zZyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBmYWlsKGZpbmFsIFN0cmluZyBzZXJ2aWNlTmFtZSwgZmluYWwgVVJMIHUsIGZpbmFsIGludCBsaW5lLCBmaW5hbCBTdHJpbmcgbXNnKQorICAgICAgICAgICAgdGhyb3dzIFNlcnZpY2VDb25maWd1cmF0aW9uRXJyb3IgeworICAgICAgICBmYWlsKHNlcnZpY2VOYW1lLCB1ICsgIjoiICsgbGluZSArICI6ICIgKyBtc2cpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIGEgc2luZ2xlIGxpbmUgZnJvbSB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiBmaWxlLCBhZGRpbmcgdGhlIG5hbWUKKyAgICAgKiBvbiB0aGUgbGluZSB0byBib3RoIHRoZSBuYW1lcyBsaXN0IGFuZCB0aGUgcmV0dXJuZWQgc2V0IGlmZiB0aGUgbmFtZSBpcworICAgICAqIG5vdCBhbHJlYWR5IGEgbWVtYmVyIG9mIHRoZSByZXR1cm5lZCBzZXQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHBhcnNlTGluZShmaW5hbCBTdHJpbmcgc2VydmljZU5hbWUsIGZpbmFsIFVSTCB1LCBmaW5hbCBCdWZmZXJlZFJlYWRlciByLCBmaW5hbCBpbnQgbGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gbmFtZXMsIGZpbmFsIFNldDxTdHJpbmc+IHJldHVybmVkKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2aWNlQ29uZmlndXJhdGlvbkVycm9yIHsKKyAgICAgICAgU3RyaW5nIGxuID0gci5yZWFkTGluZSgpOworICAgICAgICBpZiAobG4gPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGZpbmFsIGludCBjaSA9IGxuLmluZGV4T2YoJyMnKTsKKyAgICAgICAgaWYgKGNpID49IDApIHsKKyAgICAgICAgICAgIGxuID0gbG4uc3Vic3RyaW5nKDAsIGNpKTsKKyAgICAgICAgfQorICAgICAgICBsbiA9IGxuLnRyaW0oKTsKKyAgICAgICAgZmluYWwgaW50IG4gPSBsbi5sZW5ndGgoKTsKKyAgICAgICAgaWYgKG4gIT0gMCkgeworICAgICAgICAgICAgaWYgKChsbi5pbmRleE9mKCcgJykgPj0gMCkgfHwgKGxuLmluZGV4T2YoJ1x0JykgPj0gMCkpIHsKKyAgICAgICAgICAgICAgICBmYWlsKHNlcnZpY2VOYW1lLCB1LCBsYywgTG9jYWxpemF0aW9uTWVzc2FnZXMuSUxMRUdBTF9DT05GSUdfU1lOVEFYKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGNwID0gbG4uY29kZVBvaW50QXQoMCk7CisgICAgICAgICAgICBpZiAoIUNoYXJhY3Rlci5pc0phdmFJZGVudGlmaWVyU3RhcnQoY3ApKSB7CisgICAgICAgICAgICAgICAgZmFpbChzZXJ2aWNlTmFtZSwgdSwgbGMsIExvY2FsaXphdGlvbk1lc3NhZ2VzLklMTEVHQUxfUFJPVklERVJfQ0xBU1NfTkFNRShsbikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IENoYXJhY3Rlci5jaGFyQ291bnQoY3ApOyBpIDwgbjsgaSArPSBDaGFyYWN0ZXIuY2hhckNvdW50KGNwKSkgeworICAgICAgICAgICAgICAgIGNwID0gbG4uY29kZVBvaW50QXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKCFDaGFyYWN0ZXIuaXNKYXZhSWRlbnRpZmllclBhcnQoY3ApICYmIChjcCAhPSAnLicpKSB7CisgICAgICAgICAgICAgICAgICAgIGZhaWwoc2VydmljZU5hbWUsIHUsIGxjLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5JTExFR0FMX1BST1ZJREVSX0NMQVNTX05BTUUobG4pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXJldHVybmVkLmNvbnRhaW5zKGxuKSkgeworICAgICAgICAgICAgICAgIG5hbWVzLmFkZChsbik7CisgICAgICAgICAgICAgICAgcmV0dXJuZWQuYWRkKGxuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGMgKyAxOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlIHRoZSBjb250ZW50IG9mIHRoZSBnaXZlbiBVUkwgYXMgYSBwcm92aWRlci1jb25maWd1cmF0aW9uIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VydmljZU5hbWUgIFRoZSBzZXJ2aWNlIGNsYXNzIGZvciB3aGljaCBwcm92aWRlcnMgYXJlIGJlaW5nIHNvdWdodDsKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIHVzZWQgdG8gY29uc3RydWN0IGVycm9yIGRldGFpbCBzdHJpbmdzCisgICAgICogQHBhcmFtIHUgICAgICAgIFRoZSBVUkwgbmFtaW5nIHRoZSBjb25maWd1cmF0aW9uIGZpbGUgdG8gYmUgcGFyc2VkCisgICAgICogQHBhcmFtIHJldHVybmVkIEEgU2V0IGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIHByb3ZpZGVyIGNsYXNzZXMgdGhhdCBoYXZlIGFscmVhZHkKKyAgICAgKiAgICAgICAgICAgICAgICAgYmVlbiByZXR1cm5lZC4gIFRoaXMgc2V0IHdpbGwgYmUgdXBkYXRlZCB0byBjb250YWluIHRoZSBuYW1lcworICAgICAqICAgICAgICAgICAgICAgICB0aGF0IHdpbGwgYmUgeWllbGRlZCBmcm9tIHRoZSByZXR1cm5lZCA8dHQ+SXRlcmF0b3I8L3R0Pi4KKyAgICAgKiBAcmV0dXJuIEEgKHBvc3NpYmx5IGVtcHR5KSA8dHQ+SXRlcmF0b3I8L3R0PiB0aGF0IHdpbGwgeWllbGQgdGhlCisgICAgICogICAgICAgICBwcm92aWRlci1jbGFzcyBuYW1lcyBpbiB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbiBmaWxlIHRoYXQgYXJlCisgICAgICogICAgICAgICBub3QgeWV0IG1lbWJlcnMgb2YgdGhlIHJldHVybmVkIHNldAorICAgICAqIEB0aHJvd3MgU2VydmljZUNvbmZpZ3VyYXRpb25FcnJvciBJZiBhbiBJL08gZXJyb3Igb2NjdXJzIHdoaWxlIHJlYWRpbmcgZnJvbSB0aGUgZ2l2ZW4gVVJMLCBvcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBhIGNvbmZpZ3VyYXRpb24tZmlsZSBmb3JtYXQgZXJyb3IgaXMgZGV0ZWN0ZWQKKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlN0YXRlbWVudFdpdGhFbXB0eUJvZHkifSkKKyAgICBwcml2YXRlIHN0YXRpYyBJdGVyYXRvcjxTdHJpbmc+IHBhcnNlKGZpbmFsIFN0cmluZyBzZXJ2aWNlTmFtZSwgZmluYWwgVVJMIHUsIGZpbmFsIFNldDxTdHJpbmc+IHJldHVybmVkKQorICAgICAgICAgICAgdGhyb3dzIFNlcnZpY2VDb25maWd1cmF0aW9uRXJyb3IgeworICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IG51bGw7CisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHIgPSBudWxsOworICAgICAgICBmaW5hbCBBcnJheUxpc3Q8U3RyaW5nPiBuYW1lcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgVVJMQ29ubmVjdGlvbiB1Q29ubiA9IHUub3BlbkNvbm5lY3Rpb24oKTsKKyAgICAgICAgICAgIHVDb25uLnNldFVzZUNhY2hlcyhmYWxzZSk7CisgICAgICAgICAgICBpbiA9IHVDb25uLmdldElucHV0U3RyZWFtKCk7CisgICAgICAgICAgICByID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbiwgInV0Zi04IikpOworICAgICAgICAgICAgaW50IGxjID0gMTsKKyAgICAgICAgICAgIHdoaWxlICgobGMgPSBwYXJzZUxpbmUoc2VydmljZU5hbWUsIHUsIHIsIGxjLCBuYW1lcywgcmV0dXJuZWQpKSA+PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gY29udGludWUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24geCkgeworICAgICAgICAgICAgZmFpbChzZXJ2aWNlTmFtZSwgIjogIiArIHgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAociAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGluICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiB5KSB7CisgICAgICAgICAgICAgICAgZmFpbChzZXJ2aWNlTmFtZSwgIjogIiArIHkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBuYW1lcy5pdGVyYXRvcigpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFic3RyYWN0TGF6eUl0ZXJhdG9yPFQ+IHsKKworICAgICAgICBmaW5hbCBDbGFzczxUPiBzZXJ2aWNlOworICAgICAgICBmaW5hbCBTdHJpbmcgc2VydmljZU5hbWU7CisgICAgICAgIGZpbmFsIENsYXNzTG9hZGVyIGxvYWRlcjsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpZ25vcmVPbkNsYXNzTm90Rm91bmQ7CisgICAgICAgIEVudW1lcmF0aW9uPFVSTD4gY29uZmlncyA9IG51bGw7CisgICAgICAgIEl0ZXJhdG9yPFN0cmluZz4gcGVuZGluZyA9IG51bGw7CisgICAgICAgIFNldDxTdHJpbmc+IHJldHVybmVkID0gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOworICAgICAgICBTdHJpbmcgbmV4dE5hbWUgPSBudWxsOworCisgICAgICAgIHByaXZhdGUgQWJzdHJhY3RMYXp5SXRlcmF0b3IoCisgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8VD4gc2VydmljZSwKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc2VydmljZU5hbWUsCisgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3NMb2FkZXIgbG9hZGVyLAorICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaWdub3JlT25DbGFzc05vdEZvdW5kKSB7CisgICAgICAgICAgICB0aGlzLnNlcnZpY2UgPSBzZXJ2aWNlOworICAgICAgICAgICAgdGhpcy5zZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOworICAgICAgICAgICAgdGhpcy5sb2FkZXIgPSBsb2FkZXI7CisgICAgICAgICAgICB0aGlzLmlnbm9yZU9uQ2xhc3NOb3RGb3VuZCA9IGlnbm9yZU9uQ2xhc3NOb3RGb3VuZDsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHNldENvbmZpZ3MoKSB7CisgICAgICAgICAgICBpZiAoY29uZmlncyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZ1bGxOYW1lID0gUFJFRklYICsgc2VydmljZU5hbWU7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3MgPSBnZXRSZXNvdXJjZXMobG9hZGVyLCBmdWxsTmFtZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24geCkgeworICAgICAgICAgICAgICAgICAgICBmYWlsKHNlcnZpY2VOYW1lLCAiOiAiICsgeCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHRocm93cyBTZXJ2aWNlQ29uZmlndXJhdGlvbkVycm9yIHsKKyAgICAgICAgICAgIGlmIChuZXh0TmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRDb25maWdzKCk7CisKKyAgICAgICAgICAgIHdoaWxlIChuZXh0TmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKChwZW5kaW5nID09IG51bGwpIHx8ICFwZW5kaW5nLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZ3MuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwZW5kaW5nID0gcGFyc2Uoc2VydmljZU5hbWUsIGNvbmZpZ3MubmV4dEVsZW1lbnQoKSwgcmV0dXJuZWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBuZXh0TmFtZSA9IHBlbmRpbmcubmV4dCgpOworICAgICAgICAgICAgICAgIGlmIChpZ25vcmVPbkNsYXNzTm90Rm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKFJlZmxlY3Rpb25IZWxwZXIuY2xhc3NGb3JOYW1lV2l0aEV4Y2VwdGlvblBFQShuZXh0TmFtZSwgbG9hZGVyKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNsYXNzTm90Rm91bmRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBwYWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFRocm93YWJsZSB0aHJvd24gPSBwYWUuZ2V0RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhyb3duIGluc3RhbmNlb2YgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUNsYXNzTm90Rm91bmRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhyb3duIGluc3RhbmNlb2YgTm9DbGFzc0RlZkZvdW5kRXJyb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEZXBlbmRlbnQgY2xhc3Mgb2YgcHJvdmlkZXIgbm90IGZvdW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExPR0dFUi5pc0xvZ2dhYmxlKExldmVsLkNPTkZJRykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBhc3N1bWVzIHRoYXQgZXguZ2V0TG9jYWxpemVkTWVzc2FnZSgpIHJldHVybnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG5hbWUgb2YgYSBkZXBlbmRlbnQgY2xhc3MgdGhhdCBpcyBub3QgZm91bmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5DT05GSUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxpemF0aW9uTWVzc2FnZXMuREVQRU5ERU5UX0NMQVNTX09GX1BST1ZJREVSX05PVF9GT1VORCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93bi5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIG5leHROYW1lLCBzZXJ2aWNlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHROYW1lID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhyb3duIGluc3RhbmNlb2YgQ2xhc3NGb3JtYXRFcnJvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlcGVuZGVudCBjbGFzcyBvZiBwcm92aWRlciBub3QgZm91bmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoTE9HR0VSLmlzTG9nZ2FibGUoTGV2ZWwuQ09ORklHKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLkNPTkZJRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGl6YXRpb25NZXNzYWdlcy5ERVBFTkRFTlRfQ0xBU1NfT0ZfUFJPVklERVJfRk9STUFUX0VSUk9SKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3duLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgbmV4dE5hbWUsIHNlcnZpY2UpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dE5hbWUgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aHJvd24gaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pIHRocm93bjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbih0aHJvd24pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBoYW5kbGVDbGFzc05vdEZvdW5kRXhjZXB0aW9uKCkgeworICAgICAgICAgICAgLy8gUHJvdmlkZXIgaW1wbGVtZW50YXRpb24gbm90IGZvdW5kCisgICAgICAgICAgICBpZiAoTE9HR0VSLmlzTG9nZ2FibGUoTGV2ZWwuQ09ORklHKSkgeworICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuQ09ORklHLAorICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxpemF0aW9uTWVzc2FnZXMuUFJPVklERVJfTk9UX0ZPVU5EKG5leHROYW1lLCBzZXJ2aWNlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZXh0TmFtZSA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBMYXp5Q2xhc3NJdGVyYXRvcjxUPiBleHRlbmRzIEFic3RyYWN0TGF6eUl0ZXJhdG9yPFQ+CisgICAgICAgICAgICBpbXBsZW1lbnRzIEl0ZXJhdG9yPENsYXNzPFQ+PiB7CisKKyAgICAgICAgcHJpdmF0ZSBMYXp5Q2xhc3NJdGVyYXRvcigKKyAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczxUPiBzZXJ2aWNlLAorICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzZXJ2aWNlTmFtZSwKKyAgICAgICAgICAgICAgICBmaW5hbCBDbGFzc0xvYWRlciBsb2FkZXIsCisgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpZ25vcmVPbkNsYXNzTm90Rm91bmQpIHsKKyAgICAgICAgICAgIHN1cGVyKHNlcnZpY2UsIHNlcnZpY2VOYW1lLCBsb2FkZXIsIGlnbm9yZU9uQ2xhc3NOb3RGb3VuZCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENsYXNzPFQ+IG5leHQoKSB7CisgICAgICAgICAgICBpZiAoIWhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY24gPSBuZXh0TmFtZTsKKyAgICAgICAgICAgIG5leHROYW1lID0gbnVsbDsKKyAgICAgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczxUPiB0Q2xhc3MgPSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25IZWxwZXIuPFQ+Y2xhc3NGb3JOYW1lV2l0aEV4Y2VwdGlvblBFQShjbiwgbG9hZGVyKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoTE9HR0VSLmlzTG9nZ2FibGUoTGV2ZWwuRklORVNUKSkgeworICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLkZJTkVTVCwgIkxvYWRpbmcgbmV4dCBjbGFzczogIiArIHRDbGFzcy5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiB0Q2xhc3M7CisKKyAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICBmYWlsKHNlcnZpY2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxpemF0aW9uTWVzc2FnZXMuUFJPVklERVJfTk9UX0ZPVU5EKGNuLCBzZXJ2aWNlKSk7CisgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIHBhZSkgeworCisgICAgICAgICAgICAgICAgZmluYWwgVGhyb3dhYmxlIHRocm93biA9IHBhZS5nZXRDYXVzZSgpOworCisgICAgICAgICAgICAgICAgaWYgKHRocm93biBpbnN0YW5jZW9mIENsYXNzTm90Rm91bmRFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgZmFpbChzZXJ2aWNlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGl6YXRpb25NZXNzYWdlcy5QUk9WSURFUl9OT1RfRk9VTkQoY24sIHNlcnZpY2UpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRocm93biBpbnN0YW5jZW9mIE5vQ2xhc3NEZWZGb3VuZEVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIGZhaWwoc2VydmljZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxpemF0aW9uTWVzc2FnZXMuREVQRU5ERU5UX0NMQVNTX09GX1BST1ZJREVSX05PVF9GT1VORCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93bi5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGNuLCBzZXJ2aWNlKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aHJvd24gaW5zdGFuY2VvZiBDbGFzc0Zvcm1hdEVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIGZhaWwoc2VydmljZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxpemF0aW9uTWVzc2FnZXMuREVQRU5ERU5UX0NMQVNTX09GX1BST1ZJREVSX0ZPUk1BVF9FUlJPUigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93bi5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIGNuLCBzZXJ2aWNlKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZmFpbChzZXJ2aWNlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGl6YXRpb25NZXNzYWdlcy5QUk9WSURFUl9DTEFTU19DT1VMRF9OT1RfQkVfTE9BREVEKGNuLCBzZXJ2aWNlLCB0aHJvd24uZ2V0TG9jYWxpemVkTWVzc2FnZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG51bGw7ICAgIC8qIFRoaXMgY2Fubm90IGhhcHBlbiAqLworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgTGF6eU9iamVjdEl0ZXJhdG9yPFQ+IGV4dGVuZHMgQWJzdHJhY3RMYXp5SXRlcmF0b3I8VD4gaW1wbGVtZW50cyBJdGVyYXRvcjxUPiB7CisKKyAgICAgICAgcHJpdmF0ZSBUIHQ7CisKKyAgICAgICAgcHJpdmF0ZSBMYXp5T2JqZWN0SXRlcmF0b3IoCisgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8VD4gc2VydmljZSwKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc2VydmljZU5hbWUsCisgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3NMb2FkZXIgbG9hZGVyLAorICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaWdub3JlT25DbGFzc05vdEZvdW5kKSB7CisgICAgICAgICAgICBzdXBlcihzZXJ2aWNlLCBzZXJ2aWNlTmFtZSwgbG9hZGVyLCBpZ25vcmVPbkNsYXNzTm90Rm91bmQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB0aHJvd3MgU2VydmljZUNvbmZpZ3VyYXRpb25FcnJvciB7CisgICAgICAgICAgICBpZiAobmV4dE5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0Q29uZmlncygpOworCisgICAgICAgICAgICB3aGlsZSAobmV4dE5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdoaWxlICgocGVuZGluZyA9PSBudWxsKSB8fCAhcGVuZGluZy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFjb25maWdzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcGVuZGluZyA9IHBhcnNlKHNlcnZpY2VOYW1lLCBjb25maWdzLm5leHRFbGVtZW50KCksIHJldHVybmVkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbmV4dE5hbWUgPSBwZW5kaW5nLm5leHQoKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB0ID0gc2VydmljZS5jYXN0KEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25IZWxwZXIuY2xhc3NGb3JOYW1lV2l0aEV4Y2VwdGlvblBFQShuZXh0TmFtZSwgbG9hZGVyKSkubmV3SW5zdGFuY2UoKSk7CisKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpZ25vcmVPbkNsYXNzTm90Rm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChMT0dHRVIuaXNMb2dnYWJsZShMZXZlbC5DT05GSUcpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5DT05GSUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGl6YXRpb25NZXNzYWdlcy5QUk9WSURFUl9DT1VMRF9OT1RfQkVfQ1JFQVRFRChuZXh0TmFtZSwgc2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXguZ2V0TG9jYWxpemVkTWVzc2FnZSgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0TmFtZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsKHNlcnZpY2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGl6YXRpb25NZXNzYWdlcy5QUk9WSURFUl9DT1VMRF9OT1RfQkVfQ1JFQVRFRChuZXh0TmFtZSwgc2VydmljZSwgZXguZ2V0TG9jYWxpemVkTWVzc2FnZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICBmYWlsKHNlcnZpY2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsaXphdGlvbk1lc3NhZ2VzLlBST1ZJREVSX0NPVUxEX05PVF9CRV9DUkVBVEVEKG5leHROYW1lLCBzZXJ2aWNlLCBleC5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4KTsKKworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIE5vQ2xhc3NEZWZGb3VuZEVycm9yIGV4KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIERlcGVuZGVudCBjbGFzcyBvZiBwcm92aWRlciBub3QgZm91bmQKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlnbm9yZU9uQ2xhc3NOb3RGb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExPR0dFUi5pc0xvZ2dhYmxlKExldmVsLkNPTkZJRykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGFzc3VtZXMgdGhhdCBleC5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkgcmV0dXJucworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBuYW1lIG9mIGEgZGVwZW5kZW50IGNsYXNzIHRoYXQgaXMgbm90IGZvdW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5DT05GSUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGl6YXRpb25NZXNzYWdlcy5ERVBFTkRFTlRfQ0xBU1NfT0ZfUFJPVklERVJfTk9UX0ZPVU5EKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleC5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksIG5leHROYW1lLCBzZXJ2aWNlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXh0TmFtZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsKHNlcnZpY2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGl6YXRpb25NZXNzYWdlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ERVBFTkRFTlRfQ0xBU1NfT0ZfUFJPVklERVJfTk9UX0ZPVU5EKGV4LmdldExvY2FsaXplZE1lc3NhZ2UoKSwgbmV4dE5hbWUsIHNlcnZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gcGFlKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFRocm93YWJsZSBjYXVzZSA9IHBhZS5nZXRDYXVzZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2F1c2UgaW5zdGFuY2VvZiBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVDbGFzc05vdEZvdW5kRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2F1c2UgaW5zdGFuY2VvZiBDbGFzc0Zvcm1hdEVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBEZXBlbmRlbnQgY2xhc3Mgb2YgcHJvdmlkZXIgbm90IGZvdW5kCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWdub3JlT25DbGFzc05vdEZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExPR0dFUi5pc0xvZ2dhYmxlKExldmVsLkNPTkZJRykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5DT05GSUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxpemF0aW9uTWVzc2FnZXMuREVQRU5ERU5UX0NMQVNTX09GX1BST1ZJREVSX0ZPUk1BVF9FUlJPUigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdXNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgbmV4dE5hbWUsIHNlcnZpY2UpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dE5hbWUgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWlsKHNlcnZpY2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxpemF0aW9uTWVzc2FnZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkRFUEVOREVOVF9DTEFTU19PRl9QUk9WSURFUl9GT1JNQVRfRVJST1IoY2F1c2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLCBuZXh0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdXNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoc2VydmljZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsaXphdGlvbk1lc3NhZ2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLlBST1ZJREVSX0NPVUxEX05PVF9CRV9DUkVBVEVEKG5leHROYW1lLCBzZXJ2aWNlLCBjYXVzZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXVzZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVCBuZXh0KCkgeworICAgICAgICAgICAgaWYgKCFoYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmV4dE5hbWUgPSBudWxsOworICAgICAgICAgICAgaWYgKExPR0dFUi5pc0xvZ2dhYmxlKExldmVsLkZJTkVTVCkpIHsKKyAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLkZJTkVTVCwgIkxvYWRpbmcgbmV4dCBvYmplY3Q6ICIgKyB0LmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGhhbmRsZUNsYXNzTm90Rm91bmRFeGNlcHRpb24oKSB0aHJvd3MgU2VydmljZUNvbmZpZ3VyYXRpb25FcnJvciB7CisgICAgICAgICAgICBpZiAoaWdub3JlT25DbGFzc05vdEZvdW5kKSB7CisgICAgICAgICAgICAgICAgLy8gUHJvdmlkZXIgaW1wbGVtZW50YXRpb24gbm90IGZvdW5kCisgICAgICAgICAgICAgICAgaWYgKExPR0dFUi5pc0xvZ2dhYmxlKExldmVsLkNPTkZJRykpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5DT05GSUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxpemF0aW9uTWVzc2FnZXMuUFJPVklERVJfTk9UX0ZPVU5EKG5leHROYW1lLCBzZXJ2aWNlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5leHROYW1lID0gbnVsbDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZmFpbChzZXJ2aWNlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsaXphdGlvbk1lc3NhZ2VzLlBST1ZJREVSX05PVF9GT1VORChuZXh0TmFtZSwgc2VydmljZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3VwcG9ydHMgaXRlcmF0aW9uIG9mIHByb3ZpZGVyIGluc3RhbmNlcyBvciBjbGFzc2VzLgorICAgICAqIDxwPgorICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGxvb2tzIHVwIHByb3ZpZGVyIGNsYXNzZXMgZnJvbSBNRVRBLUlORi9zZXJ2aWNlcworICAgICAqIGZpbGVzLCBzZWUge0BsaW5rIERlZmF1bHRTZXJ2aWNlSXRlcmF0b3JQcm92aWRlcn0uCisgICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiBtYXkgYmUgb3ZlcnJpZGRlbiBieSBpbnZva2luZworICAgICAqIHtAbGluayBTZXJ2aWNlRmluZGVyI3NldEl0ZXJhdG9yUHJvdmlkZXIob3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuU2VydmljZUZpbmRlci5TZXJ2aWNlSXRlcmF0b3JQcm92aWRlcil9LgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgU2VydmljZUl0ZXJhdG9yUHJvdmlkZXIgeworCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIFNlcnZpY2VJdGVyYXRvclByb3ZpZGVyIHNpcDsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IHNpcExvY2sgPSBuZXcgT2JqZWN0KCk7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgU2VydmljZUl0ZXJhdG9yUHJvdmlkZXIgZ2V0SW5zdGFuY2UoKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBjaGVjayB0aGUgZm9sbG93aW5nIGlzIGEgZ29vZCBwcmFjdGljZTogRG91YmxlLWNoZWNrIGlkaW9tIGZvciBsYXp5IGluaXRpYWxpemF0aW9uIG9mIGZpZWxkcy4KKyAgICAgICAgICAgIFNlcnZpY2VJdGVyYXRvclByb3ZpZGVyIHJlc3VsdCA9IHNpcDsKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeyAvLyBGaXJzdCBjaGVjayAobm8gbG9ja2luZykKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNpcExvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2lwOworICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsgLy8gU2Vjb25kIGNoZWNrICh3aXRoIGxvY2tpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICBzaXAgPSByZXN1bHQgPSBuZXcgRGVmYXVsdFNlcnZpY2VJdGVyYXRvclByb3ZpZGVyKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRJbnN0YW5jZShmaW5hbCBTZXJ2aWNlSXRlcmF0b3JQcm92aWRlciBzaXApIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBTZWN1cml0eU1hbmFnZXIgc2VjdXJpdHkgPSBTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCk7CisgICAgICAgICAgICBpZiAoc2VjdXJpdHkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFJlZmxlY3RQZXJtaXNzaW9uIHJwID0gbmV3IFJlZmxlY3RQZXJtaXNzaW9uKCJzdXBwcmVzc0FjY2Vzc0NoZWNrcyIpOworICAgICAgICAgICAgICAgIHNlY3VyaXR5LmNoZWNrUGVybWlzc2lvbihycCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNpcExvY2spIHsKKyAgICAgICAgICAgICAgICBTZXJ2aWNlSXRlcmF0b3JQcm92aWRlci5zaXAgPSBzaXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSXRlcmF0ZSBvdmVyIHByb3ZpZGVyIGluc3RhbmNlcyBvZiBhIHNlcnZpY2UuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSA8VD4gdGhlIHR5cGUgb2YgdGhlIHNlcnZpY2UuCisgICAgICAgICAqIEBwYXJhbSBzZXJ2aWNlIHRoZSBzZXJ2aWNlIGNsYXNzLgorICAgICAgICAgKiBAcGFyYW0gc2VydmljZU5hbWUgdGhlIHNlcnZpY2UgbmFtZS4KKyAgICAgICAgICogQHBhcmFtIGxvYWRlciB0aGUgY2xhc3MgbG9hZGVyIHRvIHV0aWxpemUgd2hlbiBsb2FkaW5nIHByb3ZpZGVyCisgICAgICAgICAqICAgICAgICBjbGFzc2VzLgorICAgICAgICAgKiBAcGFyYW0gaWdub3JlT25DbGFzc05vdEZvdW5kIGlmIHRydWUgaWdub3JlIGFuIGluc3RhbmNlIGlmIHRoZQorICAgICAgICAgKiAgICAgICAgY29ycmVzcG9uZGluZyBwcm92aWRlciBjbGFzcyBpZiBjYW5ub3QgYmUgZm91bmQsCisgICAgICAgICAqICAgICAgICBvdGhlcndpc2UgdGhyb3cgYSB7QGxpbmsgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbn0uCisgICAgICAgICAqIEByZXR1cm4gdGhlIHByb3ZpZGVyIGluc3RhbmNlIGl0ZXJhdG9yLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGFic3RyYWN0IDxUPiBJdGVyYXRvcjxUPiBjcmVhdGVJdGVyYXRvcihDbGFzczxUPiBzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSwgQ2xhc3NMb2FkZXIgbG9hZGVyLCBib29sZWFuIGlnbm9yZU9uQ2xhc3NOb3RGb3VuZCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEl0ZXJhdGUgb3ZlciBwcm92aWRlciBjbGFzc2VzIG9mIGEgc2VydmljZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIDxUPiB0aGUgdHlwZSBvZiB0aGUgc2VydmljZS4KKyAgICAgICAgICogQHBhcmFtIHNlcnZpY2UgdGhlIHNlcnZpY2UgY2xhc3MuCisgICAgICAgICAqIEBwYXJhbSBzZXJ2aWNlTmFtZSB0aGUgc2VydmljZSBuYW1lLgorICAgICAgICAgKiBAcGFyYW0gbG9hZGVyIHRoZSBjbGFzcyBsb2FkZXIgdG8gdXRpbGl6ZSB3aGVuIGxvYWRpbmcgcHJvdmlkZXIKKyAgICAgICAgICogICAgICAgIGNsYXNzZXMuCisgICAgICAgICAqIEBwYXJhbSBpZ25vcmVPbkNsYXNzTm90Rm91bmQgaWYgdHJ1ZSBpZ25vcmUgdGhlIHByb3ZpZGVyIGNsYXNzIGlmCisgICAgICAgICAqICAgICAgICBjYW5ub3QgYmUgZm91bmQsCisgICAgICAgICAqICAgICAgICBvdGhlcndpc2UgdGhyb3cgYSB7QGxpbmsgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbn0uCisgICAgICAgICAqIEByZXR1cm4gdGhlIHByb3ZpZGVyIGNsYXNzIGl0ZXJhdG9yLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGFic3RyYWN0IDxUPiBJdGVyYXRvcjxDbGFzczxUPj4gY3JlYXRlQ2xhc3NJdGVyYXRvcihDbGFzczxUPiBzZXJ2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc0xvYWRlciBsb2FkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpZ25vcmVPbkNsYXNzTm90Rm91bmQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IHNlcnZpY2UgaXRlcmF0b3IgcHJvdmlkZXIgdGhhdCBsb29rcyB1cCBwcm92aWRlciBjbGFzc2VzIGluCisgICAgICogTUVUQS1JTkYvc2VydmljZXMgZmlsZXMuCisgICAgICogPHA+CisgICAgICogVGhpcyBjbGFzcyBtYXkgdXRpbGl6ZWQgaWYgYSB7QGxpbmsgU2VydmljZUl0ZXJhdG9yUHJvdmlkZXJ9IG5lZWRzIHRvCisgICAgICogcmV1c2UgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBEZWZhdWx0U2VydmljZUl0ZXJhdG9yUHJvdmlkZXIgZXh0ZW5kcyBTZXJ2aWNlSXRlcmF0b3JQcm92aWRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyA8VD4gSXRlcmF0b3I8VD4gY3JlYXRlSXRlcmF0b3IoZmluYWwgQ2xhc3M8VD4gc2VydmljZSwgZmluYWwgU3RyaW5nIHNlcnZpY2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzTG9hZGVyIGxvYWRlciwgZmluYWwgYm9vbGVhbiBpZ25vcmVPbkNsYXNzTm90Rm91bmQpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTGF6eU9iamVjdEl0ZXJhdG9yPFQ+KHNlcnZpY2UsIHNlcnZpY2VOYW1lLCBsb2FkZXIsIGlnbm9yZU9uQ2xhc3NOb3RGb3VuZCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIDxUPiBJdGVyYXRvcjxDbGFzczxUPj4gY3JlYXRlQ2xhc3NJdGVyYXRvcihmaW5hbCBDbGFzczxUPiBzZXJ2aWNlLCBmaW5hbCBTdHJpbmcgc2VydmljZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3NMb2FkZXIgbG9hZGVyLCBmaW5hbCBib29sZWFuIGlnbm9yZU9uQ2xhc3NOb3RGb3VuZCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBMYXp5Q2xhc3NJdGVyYXRvcjxUPihzZXJ2aWNlLCBzZXJ2aWNlTmFtZSwgbG9hZGVyLCBpZ25vcmVPbkNsYXNzTm90Rm91bmQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9TZXJ2aWNlRmluZGVyQmluZGVyLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL1NlcnZpY2VGaW5kZXJCaW5kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzBkYTVlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9TZXJ2aWNlRmluZGVyQmluZGVyLmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC53cy5ycy5SdW50aW1lVHlwZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LkNvbW1vblByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkFic3RyYWN0QmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworCisvKioKKyAqIFNpbXBsZSBTZXJ2aWNlRmluZGVyIGluamVjdGlvbiBiaW5kZXIuCisgKgorICogTG9va3MgZm9yIGFsbCBpbXBsZW1lbnRhdGlvbnMgb2YgYSBnaXZlbiBjb250cmFjdCB1c2luZyB7QGxpbmsgU2VydmljZUZpbmRlcn0KKyAqIGFuZCByZWdpc3RlcnMgZm91bmQgaW5zdGFuY2VzIHRvIHtAbGluayBJbmplY3Rpb25NYW5hZ2VyfS4KKyAqCisgKiBAcGFyYW0gPFQ+IGNvbnRyYWN0IHR5cGUuCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFNlcnZpY2VGaW5kZXJCaW5kZXI8VD4gZXh0ZW5kcyBBYnN0cmFjdEJpbmRlciB7CisKKyAgICBwcml2YXRlIGZpbmFsIENsYXNzPFQ+IGNvbnRyYWN0OworCisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IGFwcGxpY2F0aW9uUHJvcGVydGllczsKKworICAgIHByaXZhdGUgZmluYWwgUnVudGltZVR5cGUgcnVudGltZVR5cGU7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgc2VydmljZSBmaW5kZXIgaW5qZWN0aW9uIGJpbmRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250cmFjdCBjb250cmFjdCBvZiB0aGUgc2VydmljZSBwcm92aWRlcnMgYm91bmQgYnkgdGhpcyBiaW5kZXIuCisgICAgICogQHBhcmFtIGFwcGxpY2F0aW9uUHJvcGVydGllcyBtYXAgY29udGFpbmluZyBhcHBsaWNhdGlvbiBwcm9wZXJ0aWVzLiBNYXkgYmUge0Bjb2RlIG51bGx9LgorICAgICAqIEBwYXJhbSBydW50aW1lVHlwZSBydW50aW1lIChjbGllbnQgb3Igc2VydmVyKSB3aGVyZSB0aGUgc2VydmljZSBmaW5kZXIgYmluZGVyIGlzIHVzZWQuCisgICAgICovCisgICAgcHVibGljIFNlcnZpY2VGaW5kZXJCaW5kZXIoQ2xhc3M8VD4gY29udHJhY3QsIE1hcDxTdHJpbmcsIE9iamVjdD4gYXBwbGljYXRpb25Qcm9wZXJ0aWVzLCBSdW50aW1lVHlwZSBydW50aW1lVHlwZSkgeworICAgICAgICB0aGlzLmNvbnRyYWN0ID0gY29udHJhY3Q7CisgICAgICAgIHRoaXMuYXBwbGljYXRpb25Qcm9wZXJ0aWVzID0gYXBwbGljYXRpb25Qcm9wZXJ0aWVzOworICAgICAgICB0aGlzLnJ1bnRpbWVUeXBlID0gcnVudGltZVR5cGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICBmaW5hbCBib29sZWFuIE1FVEFJTkZfU0VSVklDRVNfTE9PS1VQX0RJU0FCTEVfREVGQVVMVCA9IGZhbHNlOworICAgICAgICBib29sZWFuIGRpc2FibGVNZXRhaW5mU2VydmljZXNMb29rdXAgPSBNRVRBSU5GX1NFUlZJQ0VTX0xPT0tVUF9ESVNBQkxFX0RFRkFVTFQ7CisgICAgICAgIGlmIChhcHBsaWNhdGlvblByb3BlcnRpZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZGlzYWJsZU1ldGFpbmZTZXJ2aWNlc0xvb2t1cCA9IENvbW1vblByb3BlcnRpZXMuZ2V0VmFsdWUoYXBwbGljYXRpb25Qcm9wZXJ0aWVzLCBydW50aW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgQ29tbW9uUHJvcGVydGllcy5NRVRBSU5GX1NFUlZJQ0VTX0xPT0tVUF9ESVNBQkxFLCBNRVRBSU5GX1NFUlZJQ0VTX0xPT0tVUF9ESVNBQkxFX0RFRkFVTFQsIEJvb2xlYW4uY2xhc3MpOworICAgICAgICB9CisgICAgICAgIGlmICghZGlzYWJsZU1ldGFpbmZTZXJ2aWNlc0xvb2t1cCkgeworICAgICAgICAgICAgZm9yIChDbGFzczxUPiB0IDogU2VydmljZUZpbmRlci5maW5kKGNvbnRyYWN0LCB0cnVlKS50b0NsYXNzQXJyYXkoKSkgeworICAgICAgICAgICAgICAgIGJpbmQodCkudG8oY29udHJhY3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9WZXJzaW9uLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL1ZlcnNpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWZkNjRhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9WZXJzaW9uLmphdmEKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyBmb3IgcmVhZGluZyBidWlsZC5wcm9wZXJ0aWVzIGZpbGUuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVmVyc2lvbiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYnVpbGRJZDsKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdmVyc2lvbiA9IG51bGw7CisKKyAgICBzdGF0aWMgeworICAgICAgICBfaW5pdGlhdGVQcm9wZXJ0aWVzKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBWZXJzaW9uKCkgeworICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIkluc3RhbnRpYXRpb24gbm90IGFsbG93ZWQuIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBfaW5pdGlhdGVQcm9wZXJ0aWVzKCkgeworICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBpbiA9IGdldEludHB1dFN0cmVhbSgpOworICAgICAgICBpZiAoaW4gIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmaW5hbCBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICAgICAgICAgIHAubG9hZChpbik7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRpbWVzdGFtcCA9IHAuZ2V0UHJvcGVydHkoIkJ1aWxkLVRpbWVzdGFtcCIpOworICAgICAgICAgICAgICAgIHZlcnNpb24gPSBwLmdldFByb3BlcnR5KCJCdWlsZC1WZXJzaW9uIik7CisKKyAgICAgICAgICAgICAgICBidWlsZElkID0gU3RyaW5nLmZvcm1hdCgiSmVyc2V5OiAlcyAlcyIsIHZlcnNpb24sIHRpbWVzdGFtcCk7CisgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGJ1aWxkSWQgPSAiSmVyc2V5IjsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgY2xvc2UoaW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjbG9zZShmaW5hbCBJbnB1dFN0cmVhbSBpbikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW4uY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBJZ25vcmUKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIElucHV0U3RyZWFtIGdldEludHB1dFN0cmVhbSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBWZXJzaW9uLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oImJ1aWxkLnByb3BlcnRpZXMiKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBidWlsZCBpZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYnVpbGQgaWQgc3RyaW5nLiBDb250YWlucyB2ZXJzaW9uIGFuZCBidWlsZCB0aW1lc3RhbXAuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0QnVpbGRJZCgpIHsKKyAgICAgICAgcmV0dXJuIGJ1aWxkSWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IEplcnNleSB2ZXJzaW9uLgorICAgICAqCisgICAgICogQHJldHVybiBKZXJzZXkgdmVyc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRWZXJzaW9uKCkgeworICAgICAgICByZXR1cm4gdmVyc2lvbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL0Fic3RyYWN0RnV0dXJlLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL0Fic3RyYWN0RnV0dXJlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRhOTcwNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvQWJzdHJhY3RGdXR1cmUuamF2YQpAQCAtMCwwICsxLDM5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgR3VhdmEgQXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YTsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbmNlbGxhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZW91dEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5BYnN0cmFjdFF1ZXVlZFN5bmNocm9uaXplcjsKKworaW1wb3J0IHN0YXRpYyBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKKworLyoqCisgKiBBbiBhYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIExpc3RlbmFibGVGdXR1cmV9IGludGVyZmFjZS4gVGhpcworICogY2xhc3MgaXMgcHJlZmVyYWJsZSB0byB7QGxpbmsgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlVGFza30gZm9yIHR3bworICogcmVhc29uczogSXQgaW1wbGVtZW50cyB7QGNvZGUgTGlzdGVuYWJsZUZ1dHVyZX0sIGFuZCBpdCBkb2VzIG5vdCBpbXBsZW1lbnQKKyAqIHtAY29kZSBSdW5uYWJsZX0uIChJZiB5b3Ugd2FudCBhIHtAY29kZSBSdW5uYWJsZX0gaW1wbGVtZW50YXRpb24gb2Yge0Bjb2RlCisgKiBMaXN0ZW5hYmxlRnV0dXJlfSwgY3JlYXRlIGEge0BsaW5rIExpc3RlbmFibGVGdXR1cmVUYXNrfSwgb3Igc3VibWl0IHlvdXIKKyAqIHRhc2tzIHRvIGEge0BsaW5rIExpc3RlbmluZ0V4ZWN1dG9yU2VydmljZX0uKQorICogPHA+CisgKiA8cD5UaGlzIGNsYXNzIGltcGxlbWVudHMgYWxsIG1ldGhvZHMgaW4ge0Bjb2RlIExpc3RlbmFibGVGdXR1cmV9LgorICogU3ViY2xhc3NlcyBzaG91bGQgcHJvdmlkZSBhIHdheSB0byBzZXQgdGhlIHJlc3VsdCBvZiB0aGUgY29tcHV0YXRpb24gdGhyb3VnaAorICogdGhlIHByb3RlY3RlZCBtZXRob2RzIHtAbGluayAjc2V0KE9iamVjdCl9IGFuZAorICoge0BsaW5rICNzZXRFeGNlcHRpb24oVGhyb3dhYmxlKX0uIFN1YmNsYXNzZXMgbWF5IGFsc28gb3ZlcnJpZGUge0BsaW5rCisgKiAjaW50ZXJydXB0VGFzaygpfSwgd2hpY2ggd2lsbCBiZSBpbnZva2VkIGF1dG9tYXRpY2FsbHkgaWYgYSBjYWxsIHRvIHtAbGluaworICogI2NhbmNlbChib29sZWFuKSBjYW5jZWwodHJ1ZSl9IHN1Y2NlZWRzIGluIGNhbmNlbGluZyB0aGUgZnV0dXJlLgorICogPHA+CisgKiA8cD57QGNvZGUgQWJzdHJhY3RGdXR1cmV9IHVzZXMgYW4ge0BsaW5rIEFic3RyYWN0UXVldWVkU3luY2hyb25pemVyfSB0byBkZWFsCisgKiB3aXRoIGNvbmN1cnJlbmN5IGlzc3VlcyBhbmQgZ3VhcmFudGVlIHRocmVhZCBzYWZldHkuCisgKiA8cD4KKyAqIDxwPlRoZSBzdGF0ZSBjaGFuZ2luZyBtZXRob2RzIGFsbCByZXR1cm4gYSBib29sZWFuIGluZGljYXRpbmcgc3VjY2VzcyBvcgorICogZmFpbHVyZSBpbiBjaGFuZ2luZyB0aGUgZnV0dXJlJ3Mgc3RhdGUuICBWYWxpZCBzdGF0ZXMgYXJlIHJ1bm5pbmcsCisgKiBjb21wbGV0ZWQsIGZhaWxlZCwgb3IgY2FuY2VsbGVkLgorICogPHA+CisgKiA8cD5UaGlzIGNsYXNzIHVzZXMgYW4ge0BsaW5rIEV4ZWN1dGlvbkxpc3R9IHRvIGd1YXJhbnRlZSB0aGF0IGFsbCByZWdpc3RlcmVkCisgKiBsaXN0ZW5lcnMgd2lsbCBiZSBleGVjdXRlZCwgZWl0aGVyIHdoZW4gdGhlIGZ1dHVyZSBmaW5pc2hlcyBvciwgZm9yIGxpc3RlbmVycworICogdGhhdCBhcmUgYWRkZWQgYWZ0ZXIgdGhlIGZ1dHVyZSBjb21wbGV0ZXMsIGltbWVkaWF0ZWx5LgorICoge0Bjb2RlIFJ1bm5hYmxlfS17QGNvZGUgRXhlY3V0b3J9IHBhaXJzIGFyZSBzdG9yZWQgaW4gdGhlIGV4ZWN1dGlvbiBsaXN0IGJ1dAorICogYXJlIG5vdCBuZWNlc3NhcmlseSBleGVjdXRlZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSB3ZXJlIGFkZGVkLiAgKElmIGEKKyAqIGxpc3RlbmVyIGlzIGFkZGVkIGFmdGVyIHRoZSBGdXR1cmUgaXMgY29tcGxldGUsIGl0IHdpbGwgYmUgZXhlY3V0ZWQKKyAqIGltbWVkaWF0ZWx5LCBldmVuIGlmIGVhcmxpZXIgbGlzdGVuZXJzIGhhdmUgbm90IGJlZW4gZXhlY3V0ZWQuIEFkZGl0aW9uYWxseSwKKyAqIGV4ZWN1dG9ycyBuZWVkIG5vdCBndWFyYW50ZWUgRklGTyBleGVjdXRpb24sIG9yIGRpZmZlcmVudCBsaXN0ZW5lcnMgbWF5IHJ1bgorICogaW4gZGlmZmVyZW50IGV4ZWN1dG9ycy4pCisgKgorICogQGF1dGhvciBTdmVuIE1hd3NvbgorICogQHNpbmNlIDEuMAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RGdXR1cmU8Vj4gaW1wbGVtZW50cyBMaXN0ZW5hYmxlRnV0dXJlPFY+IHsKKworICAgIC8qKgorICAgICAqIFN5bmNocm9uaXphdGlvbiBjb250cm9sIGZvciBBYnN0cmFjdEZ1dHVyZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBTeW5jPFY+IHN5bmMgPSBuZXcgU3luYzxWPigpOworCisgICAgLy8gVGhlIGV4ZWN1dGlvbiBsaXN0IHRvIGhvbGQgb3VyIGV4ZWN1dG9ycy4KKyAgICBwcml2YXRlIGZpbmFsIEV4ZWN1dGlvbkxpc3QgZXhlY3V0aW9uTGlzdCA9IG5ldyBFeGVjdXRpb25MaXN0KCk7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgdXNlIGJ5IHN1YmNsYXNzZXMuCisgICAgICovCisgICAgQWJzdHJhY3RGdXR1cmUoKSB7CisgICAgfQorCisgIC8qCisgICAqIEltcHJvdmUgdGhlIGRvY3VtZW50YXRpb24gb2Ygd2hlbiBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpcyB0aHJvd24uIE91cgorICAgKiBiZWhhdmlvciBtYXRjaGVzIHRoZSBKREsncywgYnV0IHRoZSBKREsncyBkb2N1bWVudGF0aW9uIGlzIG1pc2xlYWRpbmcuCisgICAqLworCisgICAgcHJpdmF0ZSBzdGF0aWMgQ2FuY2VsbGF0aW9uRXhjZXB0aW9uIGNhbmNlbGxhdGlvbkV4Y2VwdGlvbldpdGhDYXVzZSgKKyAgICAgICAgICAgIFRocm93YWJsZSBjYXVzZSkgeworICAgICAgICBDYW5jZWxsYXRpb25FeGNlcHRpb24gZXhjZXB0aW9uID0gbmV3IENhbmNlbGxhdGlvbkV4Y2VwdGlvbigiVGFzayB3YXMgY2FuY2VsbGVkLiIpOworICAgICAgICBleGNlcHRpb24uaW5pdENhdXNlKGNhdXNlKTsKKyAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbjsKKyAgICB9CisKKyAgLyoKKyAgICogSW1wcm92ZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB3aGVuIEludGVycnVwdGVkRXhjZXB0aW9uIGlzIHRocm93bi4gT3VyCisgICAqIGJlaGF2aW9yIG1hdGNoZXMgdGhlIEpESydzLCBidXQgdGhlIEpESydzIGRvY3VtZW50YXRpb24gaXMgbWlzbGVhZGluZy4KKyAgICovCisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICogPHA+CisgICAgICogPHA+VGhlIGRlZmF1bHQge0BsaW5rIEFic3RyYWN0RnV0dXJlfSBpbXBsZW1lbnRhdGlvbiB0aHJvd3Mge0Bjb2RlCisgICAgICogSW50ZXJydXB0ZWRFeGNlcHRpb259IGlmIHRoZSBjdXJyZW50IHRocmVhZCBpcyBpbnRlcnJ1cHRlZCBiZWZvcmUgb3IgZHVyaW5nCisgICAgICogdGhlIGNhbGwsIGV2ZW4gaWYgdGhlIHZhbHVlIGlzIGFscmVhZHkgYXZhaWxhYmxlLgorICAgICAqCisgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiAgaWYgdGhlIGN1cnJlbnQgdGhyZWFkIHdhcyBpbnRlcnJ1cHRlZCBiZWZvcmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBkdXJpbmcgdGhlIGNhbGwgKG9wdGlvbmFsIGJ1dCByZWNvbW1lbmRlZCkuCisgICAgICogQHRocm93cyBDYW5jZWxsYXRpb25FeGNlcHRpb24ge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBWIGdldChsb25nIHRpbWVvdXQsIFRpbWVVbml0IHVuaXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwKKyAgICAgICAgICAgIFRpbWVvdXRFeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBzeW5jLmdldCh1bml0LnRvTmFub3ModGltZW91dCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5UaGUgZGVmYXVsdCB7QGxpbmsgQWJzdHJhY3RGdXR1cmV9IGltcGxlbWVudGF0aW9uIHRocm93cyB7QGNvZGUKKyAgICAgKiBJbnRlcnJ1cHRlZEV4Y2VwdGlvbn0gaWYgdGhlIGN1cnJlbnQgdGhyZWFkIGlzIGludGVycnVwdGVkIGJlZm9yZSBvciBkdXJpbmcKKyAgICAgKiB0aGUgY2FsbCwgZXZlbiBpZiB0aGUgdmFsdWUgaXMgYWxyZWFkeSBhdmFpbGFibGUuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uICBpZiB0aGUgY3VycmVudCB0aHJlYWQgd2FzIGludGVycnVwdGVkIGJlZm9yZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGR1cmluZyB0aGUgY2FsbCAob3B0aW9uYWwgYnV0IHJlY29tbWVuZGVkKS4KKyAgICAgKiBAdGhyb3dzIENhbmNlbGxhdGlvbkV4Y2VwdGlvbiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFYgZ2V0KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24geworICAgICAgICByZXR1cm4gc3luYy5nZXQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RvbmUoKSB7CisgICAgICAgIHJldHVybiBzeW5jLmlzRG9uZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzQ2FuY2VsbGVkKCkgeworICAgICAgICByZXR1cm4gc3luYy5pc0NhbmNlbGxlZCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNhbmNlbChib29sZWFuIG1heUludGVycnVwdElmUnVubmluZykgeworICAgICAgICBpZiAoIXN5bmMuY2FuY2VsKG1heUludGVycnVwdElmUnVubmluZykpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBleGVjdXRpb25MaXN0LmV4ZWN1dGUoKTsKKyAgICAgICAgaWYgKG1heUludGVycnVwdElmUnVubmluZykgeworICAgICAgICAgICAgaW50ZXJydXB0VGFzaygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN1YmNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGltcGxlbWVudCBpbnRlcnJ1cHRpb24gb2YgdGhlCisgICAgICogZnV0dXJlJ3MgY29tcHV0YXRpb24uIFRoZSBtZXRob2QgaXMgaW52b2tlZCBhdXRvbWF0aWNhbGx5IGJ5IGEgc3VjY2Vzc2Z1bAorICAgICAqIGNhbGwgdG8ge0BsaW5rICNjYW5jZWwoYm9vbGVhbikgY2FuY2VsKHRydWUpfS4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5UaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdGhpbmcuCisgICAgICoKKyAgICAgKiBAc2luY2UgMTAuMAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBpbnRlcnJ1cHRUYXNrKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGZ1dHVyZSB3YXMgY2FuY2VsbGVkIHdpdGgge0Bjb2RlCisgICAgICogbWF5SW50ZXJydXB0SWZSdW5uaW5nfSBzZXQgdG8ge0Bjb2RlIHRydWV9LgorICAgICAqCisgICAgICogQHNpbmNlIDE0LjAKKyAgICAgKi8KKyAgICBmaW5hbCBib29sZWFuIHdhc0ludGVycnVwdGVkKCkgeworICAgICAgICByZXR1cm4gc3luYy53YXNJbnRlcnJ1cHRlZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKgorICAgICAqIEBzaW5jZSAxMC4wCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoUnVubmFibGUgbGlzdGVuZXIsIEV4ZWN1dG9yIGV4ZWMpIHsKKyAgICAgICAgZXhlY3V0aW9uTGlzdC5hZGQobGlzdGVuZXIsIGV4ZWMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN1YmNsYXNzZXMgc2hvdWxkIGludm9rZSB0aGlzIG1ldGhvZCB0byBzZXQgdGhlIHJlc3VsdCBvZiB0aGUgY29tcHV0YXRpb24KKyAgICAgKiB0byB7QGNvZGUgdmFsdWV9LiAgVGhpcyB3aWxsIHNldCB0aGUgc3RhdGUgb2YgdGhlIGZ1dHVyZSB0bworICAgICAqIHtAbGluayBBYnN0cmFjdEZ1dHVyZS5TeW5jI0NPTVBMRVRFRH0gYW5kIGludm9rZSB0aGUgbGlzdGVuZXJzIGlmIHRoZQorICAgICAqIHN0YXRlIHdhcyBzdWNjZXNzZnVsbHkgY2hhbmdlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdGhhdCB3YXMgdGhlIHJlc3VsdCBvZiB0aGUgdGFzay4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHN0YXRlIHdhcyBzdWNjZXNzZnVsbHkgY2hhbmdlZC4KKyAgICAgKi8KKyAgICBib29sZWFuIHNldChWIHZhbHVlKSB7CisgICAgICAgIGJvb2xlYW4gcmVzdWx0ID0gc3luYy5zZXQodmFsdWUpOworICAgICAgICBpZiAocmVzdWx0KSB7CisgICAgICAgICAgICBleGVjdXRpb25MaXN0LmV4ZWN1dGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFN1YmNsYXNzZXMgc2hvdWxkIGludm9rZSB0aGlzIG1ldGhvZCB0byBzZXQgdGhlIHJlc3VsdCBvZiB0aGUgY29tcHV0YXRpb24KKyAgICAgKiB0byBhbiBlcnJvciwge0Bjb2RlIHRocm93YWJsZX0uICBUaGlzIHdpbGwgc2V0IHRoZSBzdGF0ZSBvZiB0aGUgZnV0dXJlIHRvCisgICAgICoge0BsaW5rIEFic3RyYWN0RnV0dXJlLlN5bmMjQ09NUExFVEVEfSBhbmQgaW52b2tlIHRoZSBsaXN0ZW5lcnMgaWYgdGhlCisgICAgICogc3RhdGUgd2FzIHN1Y2Nlc3NmdWxseSBjaGFuZ2VkLgorICAgICAqCisgICAgICogQHBhcmFtIHRocm93YWJsZSB0aGUgZXhjZXB0aW9uIHRoYXQgdGhlIHRhc2sgZmFpbGVkIHdpdGguCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzdGF0ZSB3YXMgc3VjY2Vzc2Z1bGx5IGNoYW5nZWQuCisgICAgICovCisgICAgYm9vbGVhbiBzZXRFeGNlcHRpb24oVGhyb3dhYmxlIHRocm93YWJsZSkgeworICAgICAgICBib29sZWFuIHJlc3VsdCA9IHN5bmMuc2V0RXhjZXB0aW9uKGNoZWNrTm90TnVsbCh0aHJvd2FibGUpKTsKKyAgICAgICAgaWYgKHJlc3VsdCkgeworICAgICAgICAgICAgZXhlY3V0aW9uTGlzdC5leGVjdXRlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5Gb2xsb3dpbmcgdGhlIGNvbnRyYWN0IG9mIHtAbGluayBBYnN0cmFjdFF1ZXVlZFN5bmNocm9uaXplcn0gd2UgY3JlYXRlIGEKKyAgICAgKiBwcml2YXRlIHN1YmNsYXNzIHRvIGhvbGQgdGhlIHN5bmNocm9uaXplci4gIFRoaXMgc3luY2hyb25pemVyIGlzIHVzZWQgdG8KKyAgICAgKiBpbXBsZW1lbnQgdGhlIGJsb2NraW5nIGFuZCB3YWl0aW5nIGNhbGxzIGFzIHdlbGwgYXMgdG8gaGFuZGxlIHN0YXRlIGNoYW5nZXMKKyAgICAgKiBpbiBhIHRocmVhZC1zYWZlIG1hbm5lci4gIFRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBmdXR1cmUgaXMgaGVsZCBpbiB0aGUKKyAgICAgKiBTeW5jIHN0YXRlLCBhbmQgdGhlIGxvY2sgaXMgcmVsZWFzZWQgd2hlbmV2ZXIgdGhlIHN0YXRlIGNoYW5nZXMgdG8KKyAgICAgKiB7QGxpbmsgI0NPTVBMRVRFRH0sIHtAbGluayAjQ0FOQ0VMTEVEfSwgb3Ige0BsaW5rICNJTlRFUlJVUFRFRH0KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5UbyBhdm9pZCByYWNlcyBiZXR3ZWVuIHRocmVhZHMgZG9pbmcgcmVsZWFzZSBhbmQgYWNxdWlyZSwgd2UgdHJhbnNpdGlvbgorICAgICAqIHRvIHRoZSBmaW5hbCBzdGF0ZSBpbiB0d28gc3RlcHMuICBPbmUgdGhyZWFkIHdpbGwgc3VjY2Vzc2Z1bGx5IENBUyBmcm9tCisgICAgICogUlVOTklORyB0byBDT01QTEVUSU5HLCB0aGF0IHRocmVhZCB3aWxsIHRoZW4gc2V0IHRoZSByZXN1bHQgb2YgdGhlCisgICAgICogY29tcHV0YXRpb24sIGFuZCBvbmx5IHRoZW4gdHJhbnNpdGlvbiB0byBDT01QTEVURUQsIENBTkNFTExFRCwgb3IKKyAgICAgKiBJTlRFUlJVUFRFRC4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5XZSBkb24ndCB1c2UgdGhlIGludGVnZXIgYXJndW1lbnQgcGFzc2VkIGJldHdlZW4gYWNxdWlyZSBtZXRob2RzIHNvIHdlCisgICAgICogcGFzcyBhcm91bmQgYSAtMSBldmVyeXdoZXJlLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBTeW5jPFY+IGV4dGVuZHMgQWJzdHJhY3RRdWV1ZWRTeW5jaHJvbml6ZXIgeworCisgICAgICAgIC8qIFZhbGlkIHN0YXRlcy4gKi8KKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBSVU5OSU5HID0gMDsKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBDT01QTEVUSU5HID0gMTsKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBDT01QTEVURUQgPSAyOworICAgICAgICBzdGF0aWMgZmluYWwgaW50IENBTkNFTExFRCA9IDQ7CisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgSU5URVJSVVBURUQgPSA4OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAwTDsKKyAgICAgICAgcHJpdmF0ZSBWIHZhbHVlOworICAgICAgICBwcml2YXRlIFRocm93YWJsZSBleGNlcHRpb247CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQWNxdWlzaXRpb24gc3VjY2VlZHMgaWYgdGhlIGZ1dHVyZSBpcyBkb25lLCBvdGhlcndpc2UgaXQgZmFpbHMuCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIGludCB0cnlBY3F1aXJlU2hhcmVkKGludCBpZ25vcmVkKSB7CisgICAgICAgICAgICBpZiAoaXNEb25lKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFdlIGFsd2F5cyBhbGxvdyBhIHJlbGVhc2UgdG8gZ28gdGhyb3VnaCwgdGhpcyBtZWFucyB0aGUgc3RhdGUgaGFzIGJlZW4KKyAgICAgICAgICogc3VjY2Vzc2Z1bGx5IGNoYW5nZWQgYW5kIHRoZSByZXN1bHQgaXMgYXZhaWxhYmxlLgorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBib29sZWFuIHRyeVJlbGVhc2VTaGFyZWQoaW50IGZpbmFsU3RhdGUpIHsKKyAgICAgICAgICAgIHNldFN0YXRlKGZpbmFsU3RhdGUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQmxvY2tzIHVudGlsIHRoZSB0YXNrIGlzIGNvbXBsZXRlIG9yIHRoZSB0aW1lb3V0IGV4cGlyZXMuICBUaHJvd3MgYQorICAgICAgICAgKiB7QGxpbmsgVGltZW91dEV4Y2VwdGlvbn0gaWYgdGhlIHRpbWVyIGV4cGlyZXMsIG90aGVyd2lzZSBiZWhhdmVzIGxpa2UKKyAgICAgICAgICoge0BsaW5rICNnZXQoKX0uCisgICAgICAgICAqLworICAgICAgICBWIGdldChsb25nIG5hbm9zKSB0aHJvd3MgVGltZW91dEV4Y2VwdGlvbiwgQ2FuY2VsbGF0aW9uRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworCisgICAgICAgICAgICAvLyBBdHRlbXB0IHRvIGFjcXVpcmUgdGhlIHNoYXJlZCBsb2NrIHdpdGggYSB0aW1lb3V0LgorICAgICAgICAgICAgaWYgKCF0cnlBY3F1aXJlU2hhcmVkTmFub3MoLTEsIG5hbm9zKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUaW1lb3V0RXhjZXB0aW9uKCJUaW1lb3V0IHdhaXRpbmcgZm9yIHRhc2suIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZSgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJsb2NrcyB1bnRpbCB7QGxpbmsgI2NvbXBsZXRlKE9iamVjdCwgVGhyb3dhYmxlLCBpbnQpfSBoYXMgYmVlbgorICAgICAgICAgKiBzdWNjZXNzZnVsbHkgY2FsbGVkLiAgVGhyb3dzIGEge0BsaW5rIENhbmNlbGxhdGlvbkV4Y2VwdGlvbn0gaWYgdGhlIHRhc2sKKyAgICAgICAgICogd2FzIGNhbmNlbGxlZCwgb3IgYSB7QGxpbmsgRXhlY3V0aW9uRXhjZXB0aW9ufSBpZiB0aGUgdGFzayBjb21wbGV0ZWQgd2l0aAorICAgICAgICAgKiBhbiBlcnJvci4KKyAgICAgICAgICovCisgICAgICAgIFYgZ2V0KCkgdGhyb3dzIENhbmNlbGxhdGlvbkV4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgLy8gQWNxdWlyZSB0aGUgc2hhcmVkIGxvY2sgYWxsb3dpbmcgaW50ZXJydXB0aW9uLgorICAgICAgICAgICAgYWNxdWlyZVNoYXJlZEludGVycnVwdGlibHkoLTEpOworICAgICAgICAgICAgcmV0dXJuIGdldFZhbHVlKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGFjdHVhbCB2YWx1ZSByZXRyaWV2YWwuICBXaWxsIHJldHVybiB0aGUgdmFsdWUKKyAgICAgICAgICogb24gc3VjY2VzcywgYW4gZXhjZXB0aW9uIG9uIGZhaWx1cmUsIGEgY2FuY2VsbGF0aW9uIG9uIGNhbmNlbGxhdGlvbiwgb3IKKyAgICAgICAgICogYW4gaWxsZWdhbCBzdGF0ZSBpZiB0aGUgc3luY2hyb25pemVyIGlzIGluIGFuIGludmFsaWQgc3RhdGUuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIFYgZ2V0VmFsdWUoKSB0aHJvd3MgQ2FuY2VsbGF0aW9uRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgaW50IHN0YXRlID0gZ2V0U3RhdGUoKTsKKyAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIENPTVBMRVRFRDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKGV4Y2VwdGlvbik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNhc2UgQ0FOQ0VMTEVEOgorICAgICAgICAgICAgICAgIGNhc2UgSU5URVJSVVBURUQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IGNhbmNlbGxhdGlvbkV4Y2VwdGlvbldpdGhDYXVzZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb24pOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IsIHN5bmNocm9uaXplciBpbiBpbnZhbGlkIHN0YXRlOiAiICsgc3RhdGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENoZWNrcyBpZiB0aGUgc3RhdGUgaXMge0BsaW5rICNDT01QTEVURUR9LCB7QGxpbmsgI0NBTkNFTExFRH0sIG9yIHtAbGluaworICAgICAgICAgKiBJTlRFUlJVUFRFRH0uCisgICAgICAgICAqLworICAgICAgICBib29sZWFuIGlzRG9uZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAoZ2V0U3RhdGUoKSAmIChDT01QTEVURUQgfCBDQU5DRUxMRUQgfCBJTlRFUlJVUFRFRCkpICE9IDA7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2hlY2tzIGlmIHRoZSBzdGF0ZSBpcyB7QGxpbmsgI0NBTkNFTExFRH0gb3Ige0BsaW5rICNJTlRFUlJVUFRFRH0uCisgICAgICAgICAqLworICAgICAgICBib29sZWFuIGlzQ2FuY2VsbGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIChnZXRTdGF0ZSgpICYgKENBTkNFTExFRCB8IElOVEVSUlVQVEVEKSkgIT0gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDaGVja3MgaWYgdGhlIHN0YXRlIGlzIHtAbGluayAjSU5URVJSVVBURUR9LgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbGVhbiB3YXNJbnRlcnJ1cHRlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRTdGF0ZSgpID09IElOVEVSUlVQVEVEOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRyYW5zaXRpb24gdG8gdGhlIENPTVBMRVRFRCBzdGF0ZSBhbmQgc2V0IHRoZSB2YWx1ZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2xlYW4gc2V0KFYgdikgeworICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXRlKHYsIG51bGwsIENPTVBMRVRFRCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVHJhbnNpdGlvbiB0byB0aGUgQ09NUExFVEVEIHN0YXRlIGFuZCBzZXQgdGhlIGV4Y2VwdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIGJvb2xlYW4gc2V0RXhjZXB0aW9uKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICByZXR1cm4gY29tcGxldGUobnVsbCwgdCwgQ09NUExFVEVEKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUcmFuc2l0aW9uIHRvIHRoZSBDQU5DRUxMRUQgb3IgSU5URVJSVVBURUQgc3RhdGUuCisgICAgICAgICAqLworICAgICAgICBib29sZWFuIGNhbmNlbChib29sZWFuIGludGVycnVwdCkgeworICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXRlKG51bGwsIG51bGwsIGludGVycnVwdCA/IElOVEVSUlVQVEVEIDogQ0FOQ0VMTEVEKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBjb21wbGV0aW5nIGEgdGFzay4gIEVpdGhlciB7QGNvZGUgdn0gb3Ige0Bjb2RlIHR9IHdpbGwKKyAgICAgICAgICogYmUgc2V0IGJ1dCBub3QgYm90aC4gIFRoZSB7QGNvZGUgZmluYWxTdGF0ZX0gaXMgdGhlIHN0YXRlIHRvIGNoYW5nZSB0bworICAgICAgICAgKiBmcm9tIHtAbGluayAjUlVOTklOR30uICBJZiB0aGUgc3RhdGUgaXMgbm90IGluIHRoZSBSVU5OSU5HIHN0YXRlIHdlCisgICAgICAgICAqIHJldHVybiB7QGNvZGUgZmFsc2V9IGFmdGVyIHdhaXRpbmcgZm9yIHRoZSBzdGF0ZSB0byBiZSBzZXQgdG8gYSB2YWxpZAorICAgICAgICAgKiBmaW5hbCBzdGF0ZSAoe0BsaW5rICNDT01QTEVURUR9LCB7QGxpbmsgI0NBTkNFTExFRH0sIG9yIHtAbGluaworICAgICAgICAgKiAjSU5URVJSVVBURUR9KS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHYgICAgICAgICAgdGhlIHZhbHVlIHRvIHNldCBhcyB0aGUgcmVzdWx0IG9mIHRoZSBjb21wdXRhdGlvbi4KKyAgICAgICAgICogQHBhcmFtIHQgICAgICAgICAgdGhlIGV4Y2VwdGlvbiB0byBzZXQgYXMgdGhlIHJlc3VsdCBvZiB0aGUgY29tcHV0YXRpb24uCisgICAgICAgICAqIEBwYXJhbSBmaW5hbFN0YXRlIHRoZSBzdGF0ZSB0byB0cmFuc2l0aW9uIHRvLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGNvbXBsZXRlKFYgdiwgVGhyb3dhYmxlIHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmluYWxTdGF0ZSkgeworICAgICAgICAgICAgYm9vbGVhbiBkb0NvbXBsZXRpb24gPSBjb21wYXJlQW5kU2V0U3RhdGUoUlVOTklORywgQ09NUExFVElORyk7CisgICAgICAgICAgICBpZiAoZG9Db21wbGV0aW9uKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyB0aHJlYWQgc3VjY2Vzc2Z1bGx5IHRyYW5zaXRpb25lZCB0byBDT01QTEVUSU5HLCBzZXQgdGhlIHZhbHVlCisgICAgICAgICAgICAgICAgLy8gYW5kIGV4Y2VwdGlvbiBhbmQgdGhlbiByZWxlYXNlIHRvIHRoZSBmaW5hbCBzdGF0ZS4KKyAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdjsKKyAgICAgICAgICAgICAgICAvLyBEb24ndCBhY3R1YWxseSBjb25zdHJ1Y3QgYSBDYW5jZWxsYXRpb25FeGNlcHRpb24gdW50aWwgbmVjZXNzYXJ5LgorICAgICAgICAgICAgICAgIHRoaXMuZXhjZXB0aW9uID0gKChmaW5hbFN0YXRlICYgKENBTkNFTExFRCB8IElOVEVSUlVQVEVEKSkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IENhbmNlbGxhdGlvbkV4Y2VwdGlvbigiRnV0dXJlLmNhbmNlbCgpIHdhcyBjYWxsZWQuIikgOiB0OworICAgICAgICAgICAgICAgIHJlbGVhc2VTaGFyZWQoZmluYWxTdGF0ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGdldFN0YXRlKCkgPT0gQ09NUExFVElORykgeworICAgICAgICAgICAgICAgIC8vIElmIHNvbWUgb3RoZXIgdGhyZWFkIGlzIGN1cnJlbnRseSBjb21wbGV0aW5nIHRoZSBmdXR1cmUsIGJsb2NrIHVudGlsCisgICAgICAgICAgICAgICAgLy8gdGhleSBhcmUgZG9uZSBzbyB3ZSBjYW4gZ3VhcmFudGVlIGNvbXBsZXRpb24uCisgICAgICAgICAgICAgICAgYWNxdWlyZVNoYXJlZCgtMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZG9Db21wbGV0aW9uOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9BYnN0cmFjdEluZGV4ZWRMaXN0SXRlcmF0b3IuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvQWJzdHJhY3RJbmRleGVkTGlzdEl0ZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkzMDJhZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvQWJzdHJhY3RJbmRleGVkTGlzdEl0ZXJhdG9yLmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgR3VhdmEgQXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CisKK2ltcG9ydCBzdGF0aWMgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmEuUHJlY29uZGl0aW9ucy5jaGVja1Bvc2l0aW9uSW5kZXg7CisKKy8qKgorICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIHNrZWxldGFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgTGlzdEl0ZXJhdG9yfQorICogaW50ZXJmYWNlIGFjcm9zcyBhIGZpeGVkIG51bWJlciBvZiBlbGVtZW50cyB0aGF0IG1heSBiZSByZXRyaWV2ZWQgYnkKKyAqIHBvc2l0aW9uLiBJdCBkb2VzIG5vdCBzdXBwb3J0IHtAbGluayAjcmVtb3ZlfSwge0BsaW5rICNzZXR9LCBvciB7QGxpbmsgI2FkZH0uCisgKgorICogQGF1dGhvciBKYXJlZCBMZXZ5CisgKi8KK2Fic3RyYWN0IGNsYXNzIEFic3RyYWN0SW5kZXhlZExpc3RJdGVyYXRvcjxFPgorICAgICAgICBleHRlbmRzIFVubW9kaWZpYWJsZUxpc3RJdGVyYXRvcjxFPiB7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgc2l6ZTsKKyAgICBwcml2YXRlIGludCBwb3NpdGlvbjsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gaXRlcmF0b3IgYWNyb3NzIGEgc2VxdWVuY2Ugb2YgdGhlIGdpdmVuIHNpemUgd2l0aCB0aGUgZ2l2ZW4KKyAgICAgKiBpbml0aWFsIHBvc2l0aW9uLiBUaGF0IGlzLCB0aGUgZmlyc3QgY2FsbCB0byB7QGxpbmsgI25leHRJbmRleCgpfSB3aWxsCisgICAgICogcmV0dXJuIHtAY29kZSBwb3NpdGlvbn0sIGFuZCB0aGUgZmlyc3QgY2FsbCB0byB7QGxpbmsgI25leHQoKX0gd2lsbCByZXR1cm4KKyAgICAgKiB0aGUgZWxlbWVudCBhdCB0aGF0IGluZGV4LCBpZiBhdmFpbGFibGUuIENhbGxzIHRvIHtAbGluayAjcHJldmlvdXMoKX0gY2FuCisgICAgICogcmV0cmlldmUgdGhlIHByZWNlZGluZyB7QGNvZGUgcG9zaXRpb259IGVsZW1lbnRzLgorICAgICAqCisgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHtAY29kZSBwb3NpdGlvbn0gaXMgbmVnYXRpdmUgb3IgaXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JlYXRlciB0aGFuIHtAY29kZSBzaXplfQorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBpZiB7QGNvZGUgc2l6ZX0gaXMgbmVnYXRpdmUKKyAgICAgKi8KKyAgICBBYnN0cmFjdEluZGV4ZWRMaXN0SXRlcmF0b3IoaW50IHNpemUsIGludCBwb3NpdGlvbikgeworICAgICAgICBjaGVja1Bvc2l0aW9uSW5kZXgocG9zaXRpb24sIHNpemUpOworICAgICAgICB0aGlzLnNpemUgPSBzaXplOworICAgICAgICB0aGlzLnBvc2l0aW9uID0gcG9zaXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZWxlbWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXguIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieQorICAgICAqIHtAbGluayAjbmV4dCgpfS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgRSBnZXQoaW50IGluZGV4KTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgIHJldHVybiBwb3NpdGlvbiA8IHNpemU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZpbmFsIEUgbmV4dCgpIHsKKyAgICAgICAgaWYgKCFoYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldChwb3NpdGlvbisrKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgaW50IG5leHRJbmRleCgpIHsKKyAgICAgICAgcmV0dXJuIHBvc2l0aW9uOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGhhc1ByZXZpb3VzKCkgeworICAgICAgICByZXR1cm4gcG9zaXRpb24gPiAwOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmaW5hbCBFIHByZXZpb3VzKCkgeworICAgICAgICBpZiAoIWhhc1ByZXZpb3VzKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdldCgtLXBvc2l0aW9uKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgaW50IHByZXZpb3VzSW5kZXgoKSB7CisgICAgICAgIHJldHVybiBwb3NpdGlvbiAtIDE7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9BYnN0cmFjdEl0ZXJhdG9yLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL0Fic3RyYWN0SXRlcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzEyMzg1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9BYnN0cmFjdEl0ZXJhdG9yLmphdmEKQEAgLTAsMCArMSwxNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEd1YXZhIEF1dGhvcnMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKKworaW1wb3J0IHN0YXRpYyBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YS5QcmVjb25kaXRpb25zLmNoZWNrU3RhdGU7CisKKy8qKgorICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIHNrZWxldGFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGNvZGUgSXRlcmF0b3J9CisgKiBpbnRlcmZhY2UsIHRvIG1ha2UgdGhpcyBpbnRlcmZhY2UgZWFzaWVyIHRvIGltcGxlbWVudCBmb3IgY2VydGFpbiB0eXBlcyBvZgorICogZGF0YSBzb3VyY2VzLgorICogPHA+CisgKiA8cD57QGNvZGUgSXRlcmF0b3J9IHJlcXVpcmVzIGl0cyBpbXBsZW1lbnRhdGlvbnMgdG8gc3VwcG9ydCBxdWVyeWluZyB0aGUKKyAqIGVuZC1vZi1kYXRhIHN0YXR1cyB3aXRob3V0IGNoYW5naW5nIHRoZSBpdGVyYXRvcidzIHN0YXRlLCB1c2luZyB0aGUge0BsaW5rCisgKiAjaGFzTmV4dH0gbWV0aG9kLiBCdXQgbWFueSBkYXRhIHNvdXJjZXMsIHN1Y2ggYXMge0BsaW5rCisgKiBqYXZhLmlvLlJlYWRlciNyZWFkKCl9LCBkbyBub3QgZXhwb3NlIHRoaXMgaW5mb3JtYXRpb247IHRoZSBvbmx5IHdheSB0bworICogZGlzY292ZXIgd2hldGhlciB0aGVyZSBpcyBhbnkgZGF0YSBsZWZ0IGlzIGJ5IHRyeWluZyB0byByZXRyaWV2ZSBpdC4gVGhlc2UKKyAqIHR5cGVzIG9mIGRhdGEgc291cmNlcyBhcmUgb3JkaW5hcmlseSBkaWZmaWN1bHQgdG8gd3JpdGUgaXRlcmF0b3JzIGZvci4gQnV0CisgKiB1c2luZyB0aGlzIGNsYXNzLCBvbmUgbXVzdCBpbXBsZW1lbnQgb25seSB0aGUge0BsaW5rICNjb21wdXRlTmV4dH0gbWV0aG9kLAorICogYW5kIGludm9rZSB0aGUge0BsaW5rICNlbmRPZkRhdGF9IG1ldGhvZCB3aGVuIGFwcHJvcHJpYXRlLgorICogPHA+CisgKiA8cD5Bbm90aGVyIGV4YW1wbGUgaXMgYW4gaXRlcmF0b3IgdGhhdCBza2lwcyBvdmVyIG51bGwgZWxlbWVudHMgaW4gYSBiYWNraW5nCisgKiBpdGVyYXRvci4gVGhpcyBjb3VsZCBiZSBpbXBsZW1lbnRlZCBhczogPHByZT4gICB7QGNvZGUKKyAqIDxwPgorICogICBwdWJsaWMgc3RhdGljIEl0ZXJhdG9yPFN0cmluZz4gc2tpcE51bGxzKGZpbmFsIEl0ZXJhdG9yPFN0cmluZz4gaW4pIHsKKyAqICAgICByZXR1cm4gbmV3IEFic3RyYWN0SXRlcmF0b3I8U3RyaW5nPigpIHsKKyAqICAgICAgIHByb3RlY3RlZCBTdHJpbmcgY29tcHV0ZU5leHQoKSB7CisgKiAgICAgICAgIHdoaWxlIChpbi5oYXNOZXh0KCkpIHsKKyAqICAgICAgICAgICBTdHJpbmcgcyA9IGluLm5leHQoKTsKKyAqICAgICAgICAgICBpZiAocyAhPSBudWxsKSB7CisgKiAgICAgICAgICAgICByZXR1cm4gczsKKyAqICAgICAgICAgICB9CisgKiAgICAgICAgIH0KKyAqICAgICAgICAgcmV0dXJuIGVuZE9mRGF0YSgpOworICogICAgICAgfQorICogICAgIH07CisgKiAgIH19PC9wcmU+CisgKiA8cD4KKyAqIDxwPlRoaXMgY2xhc3Mgc3VwcG9ydHMgaXRlcmF0b3JzIHRoYXQgaW5jbHVkZSBudWxsIGVsZW1lbnRzLgorICoKKyAqIEBhdXRob3IgS2V2aW4gQm91cnJpbGxpb24KKyAqIEBzaW5jZSAyLjAgKGltcG9ydGVkIGZyb20gR29vZ2xlIENvbGxlY3Rpb25zIExpYnJhcnkpCisgKi8KKy8vIFdoZW4gbWFraW5nIGNoYW5nZXMgdG8gdGhpcyBjbGFzcywgcGxlYXNlIGFsc28gdXBkYXRlIHRoZSBjb3B5IGF0CisvLyBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YS5jb21tb24uYmFzZS5BYnN0cmFjdEl0ZXJhdG9yCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RJdGVyYXRvcjxUPiBleHRlbmRzIFVubW9kaWZpYWJsZUl0ZXJhdG9yPFQ+IHsKKyAgICBwcml2YXRlIFN0YXRlIHN0YXRlID0gU3RhdGUuTk9UX1JFQURZOworICAgIHByaXZhdGUgVCBuZXh0OworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIHVzZSBieSBzdWJjbGFzc2VzLgorICAgICAqLworICAgIEFic3RyYWN0SXRlcmF0b3IoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmV4dCBlbGVtZW50LiA8Yj5Ob3RlOjwvYj4gdGhlIGltcGxlbWVudGF0aW9uIG11c3QgY2FsbCB7QGxpbmsKKyAgICAgKiAjZW5kT2ZEYXRhKCl9IHdoZW4gdGhlcmUgYXJlIG5vIGVsZW1lbnRzIGxlZnQgaW4gdGhlIGl0ZXJhdGlvbi4gRmFpbHVyZSB0bworICAgICAqIGRvIHNvIGNvdWxkIHJlc3VsdCBpbiBhbiBpbmZpbml0ZSBsb29wLgorICAgICAqIDxwPgorICAgICAqIDxwPlRoZSBpbml0aWFsIGludm9jYXRpb24gb2Yge0BsaW5rICNoYXNOZXh0KCl9IG9yIHtAbGluayAjbmV4dCgpfSBjYWxscworICAgICAqIHRoaXMgbWV0aG9kLCBhcyBkb2VzIHRoZSBmaXJzdCBpbnZvY2F0aW9uIG9mIHtAY29kZSBoYXNOZXh0fSBvciB7QGNvZGUKKyAgICAgKiBuZXh0fSBmb2xsb3dpbmcgZWFjaCBzdWNjZXNzZnVsIGNhbGwgdG8ge0Bjb2RlIG5leHR9LiBPbmNlIHRoZQorICAgICAqIGltcGxlbWVudGF0aW9uIGVpdGhlciBpbnZva2VzIHtAY29kZSBlbmRPZkRhdGF9IG9yIHRocm93cyBhbiBleGNlcHRpb24sCisgICAgICoge0Bjb2RlIGNvbXB1dGVOZXh0fSBpcyBndWFyYW50ZWVkIHRvIG5ldmVyIGJlIGNhbGxlZCBhZ2Fpbi4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5JZiB0aGlzIG1ldGhvZCB0aHJvd3MgYW4gZXhjZXB0aW9uLCBpdCB3aWxsIHByb3BhZ2F0ZSBvdXR3YXJkIHRvIHRoZQorICAgICAqIHtAY29kZSBoYXNOZXh0fSBvciB7QGNvZGUgbmV4dH0gaW52b2NhdGlvbiB0aGF0IGludm9rZWQgdGhpcyBtZXRob2QuIEFueQorICAgICAqIGZ1cnRoZXIgYXR0ZW1wdHMgdG8gdXNlIHRoZSBpdGVyYXRvciB3aWxsIHJlc3VsdCBpbiBhbiB7QGxpbmsKKyAgICAgKiBJbGxlZ2FsU3RhdGVFeGNlcHRpb259LgorICAgICAqIDxwPgorICAgICAqIDxwPlRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBtYXkgbm90IGludm9rZSB0aGUge0Bjb2RlIGhhc05leHR9LAorICAgICAqIHtAY29kZSBuZXh0fSwgb3Ige0BsaW5rICNwZWVrKCl9IG1ldGhvZHMgb24gdGhpcyBpbnN0YW5jZTsgaWYgaXQgZG9lcywgYW4KKyAgICAgKiB7QGNvZGUgSWxsZWdhbFN0YXRlRXhjZXB0aW9ufSB3aWxsIHJlc3VsdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG5leHQgZWxlbWVudCBpZiB0aGVyZSB3YXMgb25lLiBJZiB7QGNvZGUgZW5kT2ZEYXRhfSB3YXMgY2FsbGVkCisgICAgICogZHVyaW5nIGV4ZWN1dGlvbiwgdGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIGlnbm9yZWQuCisgICAgICogQHRocm93cyBSdW50aW1lRXhjZXB0aW9uIGlmIGFueSB1bnJlY292ZXJhYmxlIGVycm9yIGhhcHBlbnMuIFRoaXMgZXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgcHJvcGFnYXRlIG91dHdhcmQgdG8gdGhlIHtAY29kZSBoYXNOZXh0KCl9LCB7QGNvZGUgbmV4dCgpfSwgb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIHBlZWsoKX0gaW52b2NhdGlvbiB0aGF0IGludm9rZWQgdGhpcyBtZXRob2QuIEFueSBmdXJ0aGVyCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGVtcHRzIHRvIHVzZSB0aGUgaXRlcmF0b3Igd2lsbCByZXN1bHQgaW4gYW4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAge0BsaW5rIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbn0uCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IFQgY29tcHV0ZU5leHQoKTsKKworICAgIC8qKgorICAgICAqIEltcGxlbWVudGF0aW9ucyBvZiB7QGxpbmsgI2NvbXB1dGVOZXh0fSA8Yj5tdXN0PC9iPiBpbnZva2UgdGhpcyBtZXRob2Qgd2hlbgorICAgICAqIHRoZXJlIGFyZSBubyBlbGVtZW50cyBsZWZ0IGluIHRoZSBpdGVyYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSBudWxsfTsgYSBjb252ZW5pZW5jZSBzbyB5b3VyIHtAY29kZSBjb21wdXRlTmV4dH0KKyAgICAgKiBpbXBsZW1lbnRhdGlvbiBjYW4gdXNlIHRoZSBzaW1wbGUgc3RhdGVtZW50IHtAY29kZSByZXR1cm4gZW5kT2ZEYXRhKCk7fQorICAgICAqLworICAgIGZpbmFsIFQgZW5kT2ZEYXRhKCkgeworICAgICAgICBzdGF0ZSA9IFN0YXRlLkRPTkU7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgIGNoZWNrU3RhdGUoc3RhdGUgIT0gU3RhdGUuRkFJTEVEKTsKKyAgICAgICAgc3dpdGNoIChzdGF0ZSkgeworICAgICAgICAgICAgY2FzZSBET05FOgorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGNhc2UgUkVBRFk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnlUb0NvbXB1dGVOZXh0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHRyeVRvQ29tcHV0ZU5leHQoKSB7CisgICAgICAgIHN0YXRlID0gU3RhdGUuRkFJTEVEOyAvLyB0ZW1wb3JhcnkgcGVzc2ltaXNtCisgICAgICAgIG5leHQgPSBjb21wdXRlTmV4dCgpOworICAgICAgICBpZiAoc3RhdGUgIT0gU3RhdGUuRE9ORSkgeworICAgICAgICAgICAgc3RhdGUgPSBTdGF0ZS5SRUFEWTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgVCBuZXh0KCkgeworICAgICAgICBpZiAoIWhhc05leHQoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZSA9IFN0YXRlLk5PVF9SRUFEWTsKKyAgICAgICAgVCByZXN1bHQgPSBuZXh0OworICAgICAgICBuZXh0ID0gbnVsbDsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwcml2YXRlIGVudW0gU3RhdGUgeworICAgICAgICAvKioKKyAgICAgICAgICogV2UgaGF2ZSBjb21wdXRlZCB0aGUgbmV4dCBlbGVtZW50IGFuZCBoYXZlbid0IHJldHVybmVkIGl0IHlldC4KKyAgICAgICAgICovCisgICAgICAgIFJFQURZLAorCisgICAgICAgIC8qKgorICAgICAgICAgKiBXZSBoYXZlbid0IHlldCBjb21wdXRlZCBvciBoYXZlIGFscmVhZHkgcmV0dXJuZWQgdGhlIGVsZW1lbnQuCisgICAgICAgICAqLworICAgICAgICBOT1RfUkVBRFksCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdlIGhhdmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBkYXRhIGFuZCBhcmUgZmluaXNoZWQuCisgICAgICAgICAqLworICAgICAgICBET05FLAorCisgICAgICAgIC8qKgorICAgICAgICAgKiBXZSd2ZSBzdWZmZXJlZCBhbiBleGNlcHRpb24gYW5kIGFyZSBrYXB1dC4KKyAgICAgICAgICovCisgICAgICAgIEZBSUxFRCwKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvQWJzdHJhY3RMaXN0TXVsdGltYXAuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvQWJzdHJhY3RMaXN0TXVsdGltYXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTAzYmU3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9BYnN0cmFjdExpc3RNdWx0aW1hcC5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBHdWF2YSBBdXRob3JzCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBCYXNpYyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIExpc3RNdWx0aW1hcH0gaW50ZXJmYWNlLiBJdCdzIGEgd3JhcHBlcgorICogYXJvdW5kIHtAbGluayBBYnN0cmFjdE1hcEJhc2VkTXVsdGltYXB9IHRoYXQgY29udmVydHMgdGhlIHJldHVybmVkIGNvbGxlY3Rpb25zIGludG8KKyAqIHtAY29kZSBMaXN0c30uIFRoZSB7QGxpbmsgI2NyZWF0ZUNvbGxlY3Rpb259IG1ldGhvZCBtdXN0IHJldHVybiBhIHtAY29kZQorICogTGlzdH0uCisgKgorICogQGF1dGhvciBKYXJlZCBMZXZ5CisgKiBAc2luY2UgMi4wIChpbXBvcnRlZCBmcm9tIEdvb2dsZSBDb2xsZWN0aW9ucyBMaWJyYXJ5KQorICovCithYnN0cmFjdCBjbGFzcyBBYnN0cmFjdExpc3RNdWx0aW1hcDxLLCBWPgorICAgICAgICBleHRlbmRzIEFic3RyYWN0TWFwQmFzZWRNdWx0aW1hcDxLLCBWPiBpbXBsZW1lbnRzIExpc3RNdWx0aW1hcDxLLCBWPiB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNjU4ODM1MDYyMzgzMTY5OTEwOUw7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IG11bHRpbWFwIHRoYXQgdXNlcyB0aGUgcHJvdmlkZWQgbWFwLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcCBwbGFjZSB0byBzdG9yZSB0aGUgbWFwcGluZyBmcm9tIGVhY2gga2V5IHRvIGl0cyBjb3JyZXNwb25kaW5nCisgICAgICogICAgICAgICAgICB2YWx1ZXMKKyAgICAgKi8KKyAgICBBYnN0cmFjdExpc3RNdWx0aW1hcChNYXA8SywgQ29sbGVjdGlvbjxWPj4gbWFwKSB7CisgICAgICAgIHN1cGVyKG1hcCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgYWJzdHJhY3QgTGlzdDxWPiBjcmVhdGVDb2xsZWN0aW9uKCk7CisKKyAgICAvLyBGb2xsb3dpbmcgSmF2YWRvYyBjb3BpZWQgZnJvbSBMaXN0TXVsdGltYXAuCisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICogPHA+CisgICAgICogPHA+QmVjYXVzZSB0aGUgdmFsdWVzIGZvciBhIGdpdmVuIGtleSBtYXkgaGF2ZSBkdXBsaWNhdGVzIGFuZCBmb2xsb3cgdGhlCisgICAgICogaW5zZXJ0aW9uIG9yZGVyaW5nLCB0aGlzIG1ldGhvZCByZXR1cm5zIGEge0BsaW5rIExpc3R9LCBpbnN0ZWFkIG9mIHRoZQorICAgICAqIHtAbGluayBDb2xsZWN0aW9ufSBzcGVjaWZpZWQgaW4gdGhlIHtAbGluayBNdWx0aW1hcH0gaW50ZXJmYWNlLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFY+IGdldChLIGtleSkgeworICAgICAgICByZXR1cm4gKExpc3Q8Vj4pIHN1cGVyLmdldChrZXkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5CZWNhdXNlIHRoZSB2YWx1ZXMgZm9yIGEgZ2l2ZW4ga2V5IG1heSBoYXZlIGR1cGxpY2F0ZXMgYW5kIGZvbGxvdyB0aGUKKyAgICAgKiBpbnNlcnRpb24gb3JkZXJpbmcsIHRoaXMgbWV0aG9kIHJldHVybnMgYSB7QGxpbmsgTGlzdH0sIGluc3RlYWQgb2YgdGhlCisgICAgICoge0BsaW5rIENvbGxlY3Rpb259IHNwZWNpZmllZCBpbiB0aGUge0BsaW5rIE11bHRpbWFwfSBpbnRlcmZhY2UuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8Vj4gcmVtb3ZlQWxsKE9iamVjdCBrZXkpIHsKKyAgICAgICAgcmV0dXJuIChMaXN0PFY+KSBzdXBlci5yZW1vdmVBbGwoa2V5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9yZXMgYSBrZXktdmFsdWUgcGFpciBpbiB0aGUgbXVsdGltYXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5ICAga2V5IHRvIHN0b3JlIGluIHRoZSBtdWx0aW1hcAorICAgICAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSB0byBzdG9yZSBpbiB0aGUgbXVsdGltYXAKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBhbHdheXMKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBwdXQoSyBrZXksIFYgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnB1dChrZXksIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICogPHA+CisgICAgICogPHA+VGhvdWdoIHRoZSBtZXRob2Qgc2lnbmF0dXJlIGRvZXNuJ3Qgc2F5IHNvIGV4cGxpY2l0bHksIHRoZSByZXR1cm5lZCBtYXAKKyAgICAgKiBoYXMge0BsaW5rIExpc3R9IHZhbHVlcy4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWFwPEssIENvbGxlY3Rpb248Vj4+IGFzTWFwKCkgeworICAgICAgICByZXR1cm4gc3VwZXIuYXNNYXAoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIG9iamVjdCB0byB0aGlzIG11bHRpbWFwIGZvciBlcXVhbGl0eS4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5Ud28ge0Bjb2RlIExpc3RNdWx0aW1hcH0gaW5zdGFuY2VzIGFyZSBlcXVhbCBpZiwgZm9yIGVhY2gga2V5LCB0aGV5CisgICAgICogY29udGFpbiB0aGUgc2FtZSB2YWx1ZXMgaW4gdGhlIHNhbWUgb3JkZXIuIElmIHRoZSB2YWx1ZSBvcmRlcmluZ3MgZGlzYWdyZWUsCisgICAgICogdGhlIG11bHRpbWFwcyB3aWxsIG5vdCBiZSBjb25zaWRlcmVkIGVxdWFsLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7CisgICAgICAgIHJldHVybiBzdXBlci5lcXVhbHMob2JqZWN0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL0Fic3RyYWN0TWFwQmFzZWRNdWx0aW1hcC5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9BYnN0cmFjdE1hcEJhc2VkTXVsdGltYXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2E0YzhlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9BYnN0cmFjdE1hcEJhc2VkTXVsdGltYXAuamF2YQpAQCAtMCwwICsxLDE1NjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEd1YXZhIEF1dGhvcnMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmE7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YS51dGlsLk5hdmlnYWJsZU1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTmF2aWdhYmxlU2V0OworaW1wb3J0IGphdmEudXRpbC5SYW5kb21BY2Nlc3M7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU29ydGVkTWFwOworaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmEuUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50OworaW1wb3J0IHN0YXRpYyBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKKworLyoqCisgKiBCYXNpYyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIE11bHRpbWFwfSBpbnRlcmZhY2UuIFRoaXMgY2xhc3MgcmVwcmVzZW50cworICogYSBtdWx0aW1hcCBhcyBhIG1hcCB0aGF0IGFzc29jaWF0ZXMgZWFjaCBrZXkgd2l0aCBhIGNvbGxlY3Rpb24gb2YgdmFsdWVzLiBBbGwKKyAqIG1ldGhvZHMgb2Yge0BsaW5rIE11bHRpbWFwfSBhcmUgc3VwcG9ydGVkLCBpbmNsdWRpbmcgdGhvc2Ugc3BlY2lmaWVkIGFzCisgKiBvcHRpb25hbCBpbiB0aGUgaW50ZXJmYWNlLgorICogPHA+CisgKiA8cD5UbyBpbXBsZW1lbnQgYSBtdWx0aW1hcCwgYSBzdWJjbGFzcyBtdXN0IGRlZmluZSB0aGUgbWV0aG9kIHtAbGluaworICogI2NyZWF0ZUNvbGxlY3Rpb24oKX0sIHdoaWNoIGNyZWF0ZXMgYW4gZW1wdHkgY29sbGVjdGlvbiBvZiB2YWx1ZXMgZm9yIGEga2V5LgorICogPHA+CisgKiA8cD5UaGUgbXVsdGltYXAgY29uc3RydWN0b3IgdGFrZXMgYSBtYXAgdGhhdCBoYXMgYSBzaW5nbGUgZW50cnkgZm9yIGVhY2gKKyAqIGRpc3RpbmN0IGtleS4gV2hlbiB5b3UgaW5zZXJ0IGEga2V5LXZhbHVlIHBhaXIgd2l0aCBhIGtleSB0aGF0IGlzbid0IGFscmVhZHkKKyAqIGluIHRoZSBtdWx0aW1hcCwge0Bjb2RlIEFic3RyYWN0TWFwQmFzZWRNdWx0aW1hcH0gY2FsbHMge0BsaW5rICNjcmVhdGVDb2xsZWN0aW9uKCl9CisgKiB0byBjcmVhdGUgdGhlIGNvbGxlY3Rpb24gb2YgdmFsdWVzIGZvciB0aGF0IGtleS4gVGhlIHN1YmNsYXNzIHNob3VsZCBub3QgY2FsbAorICoge0BsaW5rICNjcmVhdGVDb2xsZWN0aW9uKCl9IGRpcmVjdGx5LCBhbmQgYSBuZXcgaW5zdGFuY2Ugc2hvdWxkIGJlIGNyZWF0ZWQKKyAqIGV2ZXJ5IHRpbWUgdGhlIG1ldGhvZCBpcyBjYWxsZWQuCisgKiA8cD4KKyAqIDxwPkZvciBleGFtcGxlLCB0aGUgc3ViY2xhc3MgY291bGQgcGFzcyBhIHtAbGluayBqYXZhLnV0aWwuVHJlZU1hcH0gZHVyaW5nCisgKiBjb25zdHJ1Y3Rpb24sIGFuZCB7QGxpbmsgI2NyZWF0ZUNvbGxlY3Rpb24oKX0gY291bGQgcmV0dXJuIGEge0BsaW5rCisgKiBqYXZhLnV0aWwuVHJlZVNldH0sIGluIHdoaWNoIGNhc2UgdGhlIG11bHRpbWFwJ3MgaXRlcmF0b3JzIHdvdWxkIHByb3BhZ2F0ZQorICogdGhyb3VnaCB0aGUga2V5cyBhbmQgdmFsdWVzIGluIHNvcnRlZCBvcmRlci4KKyAqIDxwPgorICogPHA+S2V5cyBhbmQgdmFsdWVzIG1heSBiZSBudWxsLCBhcyBsb25nIGFzIHRoZSB1bmRlcmx5aW5nIGNvbGxlY3Rpb24gY2xhc3NlcworICogc3VwcG9ydCBudWxsIGVsZW1lbnRzLgorICogPHA+CisgKiA8cD5UaGUgY29sbGVjdGlvbnMgY3JlYXRlZCBieSB7QGxpbmsgI2NyZWF0ZUNvbGxlY3Rpb24oKX0gbWF5IG9yIG1heSBub3QKKyAqIGFsbG93IGR1cGxpY2F0ZXMuIElmIHRoZSBjb2xsZWN0aW9uLCBzdWNoIGFzIGEge0BsaW5rIFNldH0sIGRvZXMgbm90IHN1cHBvcnQKKyAqIGR1cGxpY2F0ZXMsIGFuIGFkZGVkIGtleS12YWx1ZSBwYWlyIHdpbGwgcmVwbGFjZSBhbiBleGlzdGluZyBwYWlyIHdpdGggdGhlCisgKiBzYW1lIGtleSBhbmQgdmFsdWUsIGlmIHN1Y2ggYSBwYWlyIGlzIHByZXNlbnQuIFdpdGggY29sbGVjdGlvbnMgbGlrZSB7QGxpbmsKKyAqIExpc3R9IHRoYXQgYWxsb3cgZHVwbGljYXRlcywgdGhlIGNvbGxlY3Rpb24gd2lsbCBrZWVwIHRoZSBleGlzdGluZyBrZXktdmFsdWUKKyAqIHBhaXJzIHdoaWxlIGFkZGluZyBhIG5ldyBwYWlyLgorICogPHA+CisgKiA8cD5UaGlzIGNsYXNzIGlzIG5vdCB0aHJlYWRzYWZlIHdoZW4gYW55IGNvbmN1cnJlbnQgb3BlcmF0aW9ucyB1cGRhdGUgdGhlCisgKiBtdWx0aW1hcCwgZXZlbiBpZiB0aGUgdW5kZXJseWluZyBtYXAgYW5kIHtAbGluayAjY3JlYXRlQ29sbGVjdGlvbigpfSBtZXRob2QKKyAqIHJldHVybiB0aHJlYWRzYWZlIGNsYXNzZXMuIENvbmN1cnJlbnQgcmVhZCBvcGVyYXRpb25zIHdpbGwgd29yayBjb3JyZWN0bHkuIFRvCisgKiBhbGxvdyBjb25jdXJyZW50IHVwZGF0ZSBvcGVyYXRpb25zLCB3cmFwIHlvdXIgbXVsdGltYXAgd2l0aCBhIGNhbGwgdG8ge0BsaW5rCisgKiBNdWx0aW1hcHMjc3luY2hyb25pemVkTXVsdGltYXB9LgorICogPHA+CisgKiA8cD5Gb3Igc2VyaWFsaXphdGlvbiB0byB3b3JrLCB0aGUgc3ViY2xhc3MgbXVzdCBzcGVjaWZ5IGV4cGxpY2l0CisgKiB7QGNvZGUgcmVhZE9iamVjdH0gYW5kIHtAY29kZSB3cml0ZU9iamVjdH0gbWV0aG9kcy4KKyAqCisgKiBAYXV0aG9yIEphcmVkIExldnkKKyAqIEBhdXRob3IgTG91aXMgV2Fzc2VybWFuCisgKi8KK2Fic3RyYWN0IGNsYXNzIEFic3RyYWN0TWFwQmFzZWRNdWx0aW1hcDxLLCBWPiBleHRlbmRzIEFic3RyYWN0TXVsdGltYXA8SywgVj4KKyAgICAgICAgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworICAvKgorICAgKiBIZXJlJ3MgYW4gb3V0bGluZSBvZiB0aGUgb3ZlcmFsbCBkZXNpZ24uCisgICAqCisgICAqIFRoZSBtYXAgdmFyaWFibGUgY29udGFpbnMgdGhlIGNvbGxlY3Rpb24gb2YgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCBlYWNoCisgICAqIGtleS4gV2hlbiBhIGtleS12YWx1ZSBwYWlyIGlzIGFkZGVkIHRvIGEgbXVsdGltYXAgdGhhdCBkaWRuJ3QgcHJldmlvdXNseQorICAgKiBjb250YWluIGFueSB2YWx1ZXMgZm9yIHRoYXQga2V5LCBhIG5ldyBjb2xsZWN0aW9uIGdlbmVyYXRlZCBieQorICAgKiBjcmVhdGVDb2xsZWN0aW9uIGlzIGFkZGVkIHRvIHRoZSBtYXAuIFRoYXQgc2FtZSBjb2xsZWN0aW9uIGluc3RhbmNlCisgICAqIHJlbWFpbnMgaW4gdGhlIG1hcCBhcyBsb25nIGFzIHRoZSBtdWx0aW1hcCBoYXMgYW55IHZhbHVlcyBmb3IgdGhlIGtleS4gSWYKKyAgICogYWxsIHZhbHVlcyBmb3IgdGhlIGtleSBhcmUgcmVtb3ZlZCwgdGhlIGtleSBhbmQgY29sbGVjdGlvbiBhcmUgcmVtb3ZlZAorICAgKiBmcm9tIHRoZSBtYXAuCisgICAqCisgICAqIFRoZSBnZXQgbWV0aG9kIHJldHVybnMgYSBXcmFwcGVkQ29sbGVjdGlvbiwgd2hpY2ggZGVjb3JhdGVzIHRoZSBjb2xsZWN0aW9uCisgICAqIGluIHRoZSBtYXAgKGlmIHRoZSBrZXkgaXMgcHJlc2VudCkgb3IgYW4gZW1wdHkgY29sbGVjdGlvbiAoaWYgdGhlIGtleSBpcworICAgKiBub3QgcHJlc2VudCkuIFdoZW4gdGhlIGNvbGxlY3Rpb24gZGVsZWdhdGUgaW4gdGhlIFdyYXBwZWRDb2xsZWN0aW9uIGlzCisgICAqIGVtcHR5LCB0aGUgbXVsdGltYXAgbWF5IGNvbnRhaW4gc3Vic2VxdWVudGx5IGFkZGVkIHZhbHVlcyBmb3IgdGhhdCBrZXkuIFRvCisgICAqIGhhbmRsZSB0aGF0IHNpdHVhdGlvbiwgdGhlIFdyYXBwZWRDb2xsZWN0aW9uIGNoZWNrcyB3aGV0aGVyIG1hcCBjb250YWlucworICAgKiBhbiBlbnRyeSBmb3IgdGhlIHByb3ZpZGVkIGtleSwgYW5kIGlmIHNvIHJlcGxhY2VzIHRoZSBkZWxlZ2F0ZS4KKyAgICovCisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyNDQ3NTM3ODM3MDExNjgzMzU3TDsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBNYXA8SywgQ29sbGVjdGlvbjxWPj4gbWFwOworICAgIHByaXZhdGUgdHJhbnNpZW50IGludCB0b3RhbFNpemU7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IG11bHRpbWFwIHRoYXQgdXNlcyB0aGUgcHJvdmlkZWQgbWFwLgorICAgICAqCisgICAgICogQHBhcmFtIG1hcCBwbGFjZSB0byBzdG9yZSB0aGUgbWFwcGluZyBmcm9tIGVhY2gga2V5IHRvIGl0cyBjb3JyZXNwb25kaW5nCisgICAgICogICAgICAgICAgICB2YWx1ZXMKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB7QGNvZGUgbWFwfSBpcyBub3QgZW1wdHkKKyAgICAgKi8KKyAgICBBYnN0cmFjdE1hcEJhc2VkTXVsdGltYXAoTWFwPEssIENvbGxlY3Rpb248Vj4+IG1hcCkgeworICAgICAgICBjaGVja0FyZ3VtZW50KG1hcC5pc0VtcHR5KCkpOworICAgICAgICB0aGlzLm1hcCA9IG1hcDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2VkIGR1cmluZyBkZXNlcmlhbGl6YXRpb24gb25seS4KKyAgICAgKi8KKyAgICBmaW5hbCB2b2lkIHNldE1hcChNYXA8SywgQ29sbGVjdGlvbjxWPj4gbWFwKSB7CisgICAgICAgIHRoaXMubWFwID0gbWFwOworICAgICAgICB0b3RhbFNpemUgPSAwOworICAgICAgICBmb3IgKENvbGxlY3Rpb248Vj4gdmFsdWVzIDogbWFwLnZhbHVlcygpKSB7CisgICAgICAgICAgICBjaGVja0FyZ3VtZW50KCF2YWx1ZXMuaXNFbXB0eSgpKTsKKyAgICAgICAgICAgIHRvdGFsU2l6ZSArPSB2YWx1ZXMuc2l6ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiB1bm1vZGlmaWFibGUsIGVtcHR5IGNvbGxlY3Rpb24gb2YgdmFsdWVzLgorICAgICAqIDxwPgorICAgICAqIDxwPlRoaXMgaXMgdXNlZCBpbiB7QGxpbmsgI3JlbW92ZUFsbH0gb24gYW4gZW1wdHkga2V5LgorICAgICAqLworICAgIENvbGxlY3Rpb248Vj4gY3JlYXRlVW5tb2RpZmlhYmxlRW1wdHlDb2xsZWN0aW9uKCkgeworICAgICAgICByZXR1cm4gdW5tb2RpZmlhYmxlQ29sbGVjdGlvblN1YmNsYXNzKGNyZWF0ZUNvbGxlY3Rpb24oKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyB0aGUgY29sbGVjdGlvbiBvZiB2YWx1ZXMgZm9yIGEgc2luZ2xlIGtleS4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5Db2xsZWN0aW9ucyB3aXRoIHdlYWssIHNvZnQsIG9yIHBoYW50b20gcmVmZXJlbmNlcyBhcmUgbm90IHN1cHBvcnRlZC4KKyAgICAgKiBFYWNoIGNhbGwgdG8ge0Bjb2RlIGNyZWF0ZUNvbGxlY3Rpb259IHNob3VsZCBjcmVhdGUgYSBuZXcgaW5zdGFuY2UuCisgICAgICogPHA+CisgICAgICogPHA+VGhlIHJldHVybmVkIGNvbGxlY3Rpb24gY2xhc3MgZGV0ZXJtaW5lcyB3aGV0aGVyIGR1cGxpY2F0ZSBrZXktdmFsdWUKKyAgICAgKiBwYWlycyBhcmUgYWxsb3dlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYW4gZW1wdHkgY29sbGVjdGlvbiBvZiB2YWx1ZXMKKyAgICAgKi8KKyAgICBhYnN0cmFjdCBDb2xsZWN0aW9uPFY+IGNyZWF0ZUNvbGxlY3Rpb24oKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgdGhlIGNvbGxlY3Rpb24gb2YgdmFsdWVzIGZvciBhbiBleHBsaWNpdGx5IHByb3ZpZGVkIGtleS4gQnkKKyAgICAgKiBkZWZhdWx0LCBpdCBzaW1wbHkgY2FsbHMge0BsaW5rICNjcmVhdGVDb2xsZWN0aW9uKCl9LCB3aGljaCBpcyB0aGUgY29ycmVjdAorICAgICAqIGJlaGF2aW9yIGZvciBtb3N0IGltcGxlbWVudGF0aW9ucy4gVGhlIHtAbGluayBMaW5rZWRIYXNoTXVsdGltYXB9IGNsYXNzCisgICAgICogb3ZlcnJpZGVzIGl0LgorICAgICAqCisgICAgICogQHBhcmFtIGtleSBrZXkgdG8gYXNzb2NpYXRlIHdpdGggdmFsdWVzIGluIHRoZSBjb2xsZWN0aW9uCisgICAgICogQHJldHVybiBhbiBlbXB0eSBjb2xsZWN0aW9uIG9mIHZhbHVlcworICAgICAqLworICAgIENvbGxlY3Rpb248Vj4gY3JlYXRlQ29sbGVjdGlvbihLIGtleSkgeworICAgICAgICByZXR1cm4gY3JlYXRlQ29sbGVjdGlvbigpOworICAgIH0KKworICAgIC8vIFF1ZXJ5IE9wZXJhdGlvbnMKKworICAgIE1hcDxLLCBDb2xsZWN0aW9uPFY+PiBiYWNraW5nTWFwKCkgeworICAgICAgICByZXR1cm4gbWFwOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIHRvdGFsU2l6ZTsKKyAgICB9CisKKyAgICAvLyBNb2RpZmljYXRpb24gT3BlcmF0aW9ucworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoT2JqZWN0IGtleSkgeworICAgICAgICByZXR1cm4gbWFwLmNvbnRhaW5zS2V5KGtleSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gcHV0KEsga2V5LCBWIHZhbHVlKSB7CisgICAgICAgIENvbGxlY3Rpb248Vj4gY29sbGVjdGlvbiA9IG1hcC5nZXQoa2V5KTsKKyAgICAgICAgaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgY29sbGVjdGlvbiA9IGNyZWF0ZUNvbGxlY3Rpb24oa2V5KTsKKyAgICAgICAgICAgIGlmIChjb2xsZWN0aW9uLmFkZCh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICB0b3RhbFNpemUrKzsKKyAgICAgICAgICAgICAgICBtYXAucHV0KGtleSwgY29sbGVjdGlvbik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiTmV3IENvbGxlY3Rpb24gdmlvbGF0ZWQgdGhlIENvbGxlY3Rpb24gc3BlYyIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNvbGxlY3Rpb24uYWRkKHZhbHVlKSkgeworICAgICAgICAgICAgdG90YWxTaXplKys7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEJ1bGsgT3BlcmF0aW9ucworCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqIDxwPgorICAgICAqIDxwPlRoZSByZXR1cm5lZCBjb2xsZWN0aW9uIGlzIGltbXV0YWJsZS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxWPiByZW1vdmVBbGwoT2JqZWN0IGtleSkgeworICAgICAgICBDb2xsZWN0aW9uPFY+IGNvbGxlY3Rpb24gPSBtYXAucmVtb3ZlKGtleSk7CisKKyAgICAgICAgaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVVubW9kaWZpYWJsZUVtcHR5Q29sbGVjdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgQ29sbGVjdGlvbjxWPiBvdXRwdXQgPSBjcmVhdGVDb2xsZWN0aW9uKCk7CisgICAgICAgIG91dHB1dC5hZGRBbGwoY29sbGVjdGlvbik7CisgICAgICAgIHRvdGFsU2l6ZSAtPSBjb2xsZWN0aW9uLnNpemUoKTsKKyAgICAgICAgY29sbGVjdGlvbi5jbGVhcigpOworCisgICAgICAgIHJldHVybiB1bm1vZGlmaWFibGVDb2xsZWN0aW9uU3ViY2xhc3Mob3V0cHV0KTsKKyAgICB9CisKKyAgICBDb2xsZWN0aW9uPFY+IHVubW9kaWZpYWJsZUNvbGxlY3Rpb25TdWJjbGFzcyhDb2xsZWN0aW9uPFY+IGNvbGxlY3Rpb24pIHsKKyAgICAgICAgLy8gV2UgZG9uJ3QgZGVhbCB3aXRoIE5hdmlnYWJsZVNldCBoZXJlIHlldCBmb3IgR1dUIHJlYXNvbnMgLS0gaW5zdGVhZCwKKyAgICAgICAgLy8gbm9uLUdXVCBUcmVlTXVsdGltYXAgZXhwbGljaXRseSBvdmVycmlkZXMgdGhpcyBhbmQgdXNlcyBOYXZpZ2FibGVTZXQuCisgICAgICAgIGlmIChjb2xsZWN0aW9uIGluc3RhbmNlb2YgU29ydGVkU2V0KSB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU29ydGVkU2V0KChTb3J0ZWRTZXQ8Vj4pIGNvbGxlY3Rpb24pOworICAgICAgICB9IGVsc2UgaWYgKGNvbGxlY3Rpb24gaW5zdGFuY2VvZiBTZXQpIHsKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoKFNldDxWPikgY29sbGVjdGlvbik7CisgICAgICAgIH0gZWxzZSBpZiAoY29sbGVjdGlvbiBpbnN0YW5jZW9mIExpc3QpIHsKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KChMaXN0PFY+KSBjb2xsZWN0aW9uKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKGNvbGxlY3Rpb24pOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVmlld3MKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICAvLyBDbGVhciBlYWNoIGNvbGxlY3Rpb24sIHRvIG1ha2UgcHJldmlvdXNseSByZXR1cm5lZCBjb2xsZWN0aW9ucyBlbXB0eS4KKyAgICAgICAgZm9yIChDb2xsZWN0aW9uPFY+IGNvbGxlY3Rpb24gOiBtYXAudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIGNvbGxlY3Rpb24uY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBtYXAuY2xlYXIoKTsKKyAgICAgICAgdG90YWxTaXplID0gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICogPHA+CisgICAgICogPHA+VGhlIHJldHVybmVkIGNvbGxlY3Rpb24gaXMgbm90IHNlcmlhbGl6YWJsZS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxWPiBnZXQoSyBrZXkpIHsKKyAgICAgICAgQ29sbGVjdGlvbjxWPiBjb2xsZWN0aW9uID0gbWFwLmdldChrZXkpOworICAgICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICBjb2xsZWN0aW9uID0gY3JlYXRlQ29sbGVjdGlvbihrZXkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB3cmFwQ29sbGVjdGlvbihrZXksIGNvbGxlY3Rpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyBhIGRlY29yYXRlZCBjb2xsZWN0aW9uIHRoYXQgcmVtYWlucyBjb25zaXN0ZW50IHdpdGggdGhlIHZhbHVlcyBpbgorICAgICAqIHRoZSBtdWx0aW1hcCBmb3IgdGhlIHByb3ZpZGVkIGtleS4gQ2hhbmdlcyB0byB0aGUgbXVsdGltYXAgbWF5IGFsdGVyIHRoZQorICAgICAqIHJldHVybmVkIGNvbGxlY3Rpb24sIGFuZCB2aWNlIHZlcnNhLgorICAgICAqLworICAgIENvbGxlY3Rpb248Vj4gd3JhcENvbGxlY3Rpb24oSyBrZXksIENvbGxlY3Rpb248Vj4gY29sbGVjdGlvbikgeworICAgICAgICAvLyBXZSBkb24ndCBkZWFsIHdpdGggTmF2aWdhYmxlU2V0IGhlcmUgeWV0IGZvciBHV1QgcmVhc29ucyAtLSBpbnN0ZWFkLAorICAgICAgICAvLyBub24tR1dUIFRyZWVNdWx0aW1hcCBleHBsaWNpdGx5IG92ZXJyaWRlcyB0aGlzIGFuZCB1c2VzIE5hdmlnYWJsZVNldC4KKyAgICAgICAgaWYgKGNvbGxlY3Rpb24gaW5zdGFuY2VvZiBTb3J0ZWRTZXQpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgV3JhcHBlZFNvcnRlZFNldChrZXksIChTb3J0ZWRTZXQ8Vj4pIGNvbGxlY3Rpb24sIG51bGwpOworICAgICAgICB9IGVsc2UgaWYgKGNvbGxlY3Rpb24gaW5zdGFuY2VvZiBTZXQpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgV3JhcHBlZFNldChrZXksIChTZXQ8Vj4pIGNvbGxlY3Rpb24pOworICAgICAgICB9IGVsc2UgaWYgKGNvbGxlY3Rpb24gaW5zdGFuY2VvZiBMaXN0KSB7CisgICAgICAgICAgICByZXR1cm4gd3JhcExpc3Qoa2V5LCAoTGlzdDxWPikgY29sbGVjdGlvbiwgbnVsbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFdyYXBwZWRDb2xsZWN0aW9uKGtleSwgY29sbGVjdGlvbiwgbnVsbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8Vj4gd3JhcExpc3QoCisgICAgICAgICAgICBLIGtleSwgTGlzdDxWPiBsaXN0LCBXcmFwcGVkQ29sbGVjdGlvbiBhbmNlc3RvcikgeworICAgICAgICByZXR1cm4gKGxpc3QgaW5zdGFuY2VvZiBSYW5kb21BY2Nlc3MpCisgICAgICAgICAgICAgICAgPyBuZXcgUmFuZG9tQWNjZXNzV3JhcHBlZExpc3Qoa2V5LCBsaXN0LCBhbmNlc3RvcikKKyAgICAgICAgICAgICAgICA6IG5ldyBXcmFwcGVkTGlzdChrZXksIGxpc3QsIGFuY2VzdG9yKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEl0ZXJhdG9yPFY+IGl0ZXJhdG9yT3JMaXN0SXRlcmF0b3IoQ29sbGVjdGlvbjxWPiBjb2xsZWN0aW9uKSB7CisgICAgICAgIHJldHVybiAoY29sbGVjdGlvbiBpbnN0YW5jZW9mIExpc3QpCisgICAgICAgICAgICAgICAgPyAoKExpc3Q8Vj4pIGNvbGxlY3Rpb24pLmxpc3RJdGVyYXRvcigpCisgICAgICAgICAgICAgICAgOiBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgU2V0PEs+IGNyZWF0ZUtleVNldCgpIHsKKyAgICAgICAgLy8gVHJlZU11bHRpbWFwIHVzZXMgTmF2aWdhYmxlS2V5U2V0IGV4cGxpY2l0bHksIGJ1dCB3ZSBkb24ndCBoYW5kbGUgdGhhdCBoZXJlIGZvciBHV1QKKyAgICAgICAgLy8gY29tcGF0aWJpbGl0eSByZWFzb25zCisgICAgICAgIHJldHVybiAobWFwIGluc3RhbmNlb2YgU29ydGVkTWFwKQorICAgICAgICAgICAgICAgID8gbmV3IFNvcnRlZEtleVNldCgoU29ydGVkTWFwPEssIENvbGxlY3Rpb248Vj4+KSBtYXApIDogbmV3IEtleVNldChtYXApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYWxsIHZhbHVlcyBmb3IgdGhlIHByb3ZpZGVkIGtleS4gVW5saWtlIHtAbGluayAjcmVtb3ZlQWxsfSwgaXQKKyAgICAgKiByZXR1cm5zIHRoZSBudW1iZXIgb2YgcmVtb3ZlZCBtYXBwaW5ncy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCByZW1vdmVWYWx1ZXNGb3JLZXkoT2JqZWN0IGtleSkgeworICAgICAgICBDb2xsZWN0aW9uPFY+IGNvbGxlY3Rpb24gPSBNYXBzLnNhZmVSZW1vdmUobWFwLCBrZXkpOworCisgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgIGlmIChjb2xsZWN0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvdW50ID0gY29sbGVjdGlvbi5zaXplKCk7CisgICAgICAgICAgICBjb2xsZWN0aW9uLmNsZWFyKCk7CisgICAgICAgICAgICB0b3RhbFNpemUgLT0gY291bnQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvdW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5UaGUgaXRlcmF0b3IgZ2VuZXJhdGVkIGJ5IHRoZSByZXR1cm5lZCBjb2xsZWN0aW9uIHRyYXZlcnNlcyB0aGUgdmFsdWVzCisgICAgICogZm9yIG9uZSBrZXksIGZvbGxvd2VkIGJ5IHRoZSB2YWx1ZXMgb2YgYSBzZWNvbmQga2V5LCBhbmQgc28gb24uCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENvbGxlY3Rpb248Vj4gdmFsdWVzKCkgeworICAgICAgICByZXR1cm4gc3VwZXIudmFsdWVzKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgSXRlcmF0b3I8Vj4gdmFsdWVJdGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJdHI8Vj4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIFYgb3V0cHV0KEsga2V5LCBWIHZhbHVlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5UaGUgaXRlcmF0b3IgZ2VuZXJhdGVkIGJ5IHRoZSByZXR1cm5lZCBjb2xsZWN0aW9uIHRyYXZlcnNlcyB0aGUgdmFsdWVzCisgICAgICogZm9yIG9uZSBrZXksIGZvbGxvd2VkIGJ5IHRoZSB2YWx1ZXMgb2YgYSBzZWNvbmQga2V5LCBhbmQgc28gb24uCisgICAgICogPHA+CisgICAgICogPHA+RWFjaCBlbnRyeSBpcyBhbiBpbW11dGFibGUgc25hcHNob3Qgb2YgYSBrZXktdmFsdWUgbWFwcGluZyBpbiB0aGUKKyAgICAgKiBtdWx0aW1hcCwgdGFrZW4gYXQgdGhlIHRpbWUgdGhlIGVudHJ5IGlzIHJldHVybmVkIGJ5IGEgbWV0aG9kIGNhbGwgdG8gdGhlCisgICAgICogY29sbGVjdGlvbiBvciBpdHMgaXRlcmF0b3IuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENvbGxlY3Rpb248RW50cnk8SywgVj4+IGVudHJpZXMoKSB7CisgICAgICAgIHJldHVybiBzdXBlci5lbnRyaWVzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBpdGVyYXRvciBhY3Jvc3MgYWxsIGtleS12YWx1ZSBtYXAgZW50cmllcywgdXNlZCBieSB7QGNvZGUKKyAgICAgKiBlbnRyaWVzKCkuaXRlcmF0b3IoKX0gYW5kIHtAY29kZSB2YWx1ZXMoKS5pdGVyYXRvcigpfS4gVGhlIGRlZmF1bHQKKyAgICAgKiBiZWhhdmlvciwgd2hpY2ggdHJhdmVyc2VzIHRoZSB2YWx1ZXMgZm9yIG9uZSBrZXksIHRoZSB2YWx1ZXMgZm9yIGEgc2Vjb25kCisgICAgICoga2V5LCBhbmQgc28gb24sIHN1ZmZpY2VzIGZvciBtb3N0IHtAY29kZSBBYnN0cmFjdE1hcEJhc2VkTXVsdGltYXB9IGltcGxlbWVudGF0aW9ucy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYW4gaXRlcmF0b3IgYWNyb3NzIG1hcCBlbnRyaWVzCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgSXRlcmF0b3I8RW50cnk8SywgVj4+IGVudHJ5SXRlcmF0b3IoKSB7CisgICAgICAgIHJldHVybiBuZXcgSXRyPEVudHJ5PEssIFY+PigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgRW50cnk8SywgVj4gb3V0cHV0KEsga2V5LCBWIHZhbHVlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE1hcHMuaW1tdXRhYmxlRW50cnkoa2V5LCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgTWFwPEssIENvbGxlY3Rpb248Vj4+IGNyZWF0ZUFzTWFwKCkgeworICAgICAgICAvLyBUcmVlTXVsdGltYXAgdXNlcyBOYXZpZ2FibGVBc01hcCBleHBsaWNpdGx5LCBidXQgd2UgZG9uJ3QgaGFuZGxlIHRoYXQgaGVyZSBmb3IgR1dUCisgICAgICAgIC8vIGNvbXBhdGliaWxpdHkgcmVhc29ucworICAgICAgICByZXR1cm4gKG1hcCBpbnN0YW5jZW9mIFNvcnRlZE1hcCkKKyAgICAgICAgICAgICAgICA/IG5ldyBTb3J0ZWRBc01hcCgoU29ydGVkTWFwPEssIENvbGxlY3Rpb248Vj4+KSBtYXApIDogbmV3IEFzTWFwKG1hcCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29sbGVjdGlvbiBkZWNvcmF0b3IgdGhhdCBzdGF5cyBpbiBzeW5jIHdpdGggdGhlIG11bHRpbWFwIHZhbHVlcyBmb3IgYSBrZXkuCisgICAgICogVGhlcmUgYXJlIHR3byBraW5kcyBvZiB3cmFwcGVkIGNvbGxlY3Rpb25zOiBmdWxsIGFuZCBzdWJjb2xsZWN0aW9ucy4gQm90aAorICAgICAqIGhhdmUgYSBkZWxlZ2F0ZSBwb2ludGluZyB0byB0aGUgdW5kZXJseWluZyBjb2xsZWN0aW9uIGNsYXNzLgorICAgICAqIDxwPgorICAgICAqIDxwPkZ1bGwgY29sbGVjdGlvbnMsIGlkZW50aWZpZWQgYnkgYSBudWxsIGFuY2VzdG9yIGZpZWxkLCBjb250YWluIGFsbAorICAgICAqIG11bHRpbWFwIHZhbHVlcyBmb3IgYSBnaXZlbiBrZXkuIEl0cyBkZWxlZ2F0ZSBpcyBhIHZhbHVlIGluIHtAbGluaworICAgICAqIEFic3RyYWN0TWFwQmFzZWRNdWx0aW1hcCNtYXB9IHdoZW5ldmVyIHRoZSBkZWxlZ2F0ZSBpcyBub24tZW1wdHkuIFRoZSB7QGNvZGUKKyAgICAgKiByZWZyZXNoSWZFbXB0eX0sIHtAY29kZSByZW1vdmVJZkVtcHR5fSwgYW5kIHtAY29kZSBhZGRUb01hcH0gbWV0aG9kcyBlbnN1cmUKKyAgICAgKiB0aGF0IHRoZSB7QGNvZGUgV3JhcHBlZENvbGxlY3Rpb259IGFuZCBtYXAgcmVtYWluIGNvbnNpc3RlbnQuCisgICAgICogPHA+CisgICAgICogPHA+QSBzdWJjb2xsZWN0aW9uLCBzdWNoIGFzIGEgc3VibGlzdCwgY29udGFpbnMgc29tZSBvZiB0aGUgdmFsdWVzIGZvciBhCisgICAgICogZ2l2ZW4ga2V5LiBJdHMgYW5jZXN0b3IgZmllbGQgcG9pbnRzIHRvIHRoZSBmdWxsIHdyYXBwZWQgY29sbGVjdGlvbiB3aXRoCisgICAgICogYWxsIHZhbHVlcyBmb3IgdGhlIGtleS4gVGhlIHN1YmNvbGxlY3Rpb24ge0Bjb2RlIHJlZnJlc2hJZkVtcHR5fSwge0Bjb2RlCisgICAgICogcmVtb3ZlSWZFbXB0eX0sIGFuZCB7QGNvZGUgYWRkVG9NYXB9IG1ldGhvZHMgY2FsbCB0aGUgY29ycmVzcG9uZGluZyBtZXRob2RzCisgICAgICogb2YgdGhlIGZ1bGwgd3JhcHBlZCBjb2xsZWN0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgV3JhcHBlZENvbGxlY3Rpb24gZXh0ZW5kcyBBYnN0cmFjdENvbGxlY3Rpb248Vj4geworICAgICAgICBmaW5hbCBLIGtleTsKKyAgICAgICAgZmluYWwgV3JhcHBlZENvbGxlY3Rpb24gYW5jZXN0b3I7CisgICAgICAgIGZpbmFsIENvbGxlY3Rpb248Vj4gYW5jZXN0b3JEZWxlZ2F0ZTsKKyAgICAgICAgQ29sbGVjdGlvbjxWPiBkZWxlZ2F0ZTsKKworICAgICAgICBXcmFwcGVkQ29sbGVjdGlvbihLIGtleSwgQ29sbGVjdGlvbjxWPiBkZWxlZ2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgV3JhcHBlZENvbGxlY3Rpb24gYW5jZXN0b3IpIHsKKyAgICAgICAgICAgIHRoaXMua2V5ID0ga2V5OworICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlOworICAgICAgICAgICAgdGhpcy5hbmNlc3RvciA9IGFuY2VzdG9yOworICAgICAgICAgICAgdGhpcy5hbmNlc3RvckRlbGVnYXRlCisgICAgICAgICAgICAgICAgICAgID0gKGFuY2VzdG9yID09IG51bGwpID8gbnVsbCA6IGFuY2VzdG9yLmdldERlbGVnYXRlKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSWYgdGhlIGRlbGVnYXRlIGNvbGxlY3Rpb24gaXMgZW1wdHksIGJ1dCB0aGUgbXVsdGltYXAgaGFzIHZhbHVlcyBmb3IgdGhlCisgICAgICAgICAqIGtleSwgcmVwbGFjZSB0aGUgZGVsZWdhdGUgd2l0aCB0aGUgbmV3IGNvbGxlY3Rpb24gZm9yIHRoZSBrZXkuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiA8cD5Gb3IgYSBzdWJjb2xsZWN0aW9uLCByZWZyZXNoIGl0cyBhbmNlc3RvciBhbmQgdmFsaWRhdGUgdGhhdCB0aGUKKyAgICAgICAgICogYW5jZXN0b3IgZGVsZWdhdGUgaGFzbid0IGNoYW5nZWQuCisgICAgICAgICAqLworICAgICAgICB2b2lkIHJlZnJlc2hJZkVtcHR5KCkgeworICAgICAgICAgICAgaWYgKGFuY2VzdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhbmNlc3Rvci5yZWZyZXNoSWZFbXB0eSgpOworICAgICAgICAgICAgICAgIGlmIChhbmNlc3Rvci5nZXREZWxlZ2F0ZSgpICE9IGFuY2VzdG9yRGVsZWdhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRlbGVnYXRlLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIENvbGxlY3Rpb248Vj4gbmV3RGVsZWdhdGUgPSBtYXAuZ2V0KGtleSk7CisgICAgICAgICAgICAgICAgaWYgKG5ld0RlbGVnYXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsZWdhdGUgPSBuZXdEZWxlZ2F0ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSWYgY29sbGVjdGlvbiBpcyBlbXB0eSwgcmVtb3ZlIGl0IGZyb20ge0Bjb2RlIEFic3RyYWN0TWFwQmFzZWRNdWx0aW1hcC50aGlzLm1hcH0uCisgICAgICAgICAqIEZvciBzdWJjb2xsZWN0aW9ucywgY2hlY2sgd2hldGhlciB0aGUgYW5jZXN0b3IgY29sbGVjdGlvbiBpcyBlbXB0eS4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgcmVtb3ZlSWZFbXB0eSgpIHsKKyAgICAgICAgICAgIGlmIChhbmNlc3RvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYW5jZXN0b3IucmVtb3ZlSWZFbXB0eSgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChkZWxlZ2F0ZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBtYXAucmVtb3ZlKGtleSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBLIGdldEtleSgpIHsKKyAgICAgICAgICAgIHJldHVybiBrZXk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIHRoZSBkZWxlZ2F0ZSB0byB0aGUgbWFwLiBPdGhlciB7QGNvZGUgV3JhcHBlZENvbGxlY3Rpb259IG1ldGhvZHMKKyAgICAgICAgICogc2hvdWxkIGNhbGwgdGhpcyBtZXRob2QgYWZ0ZXIgYWRkaW5nIGVsZW1lbnRzIHRvIGEgcHJldmlvdXNseSBlbXB0eQorICAgICAgICAgKiBjb2xsZWN0aW9uLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogPHA+U3ViY29sbGVjdGlvbiBhZGQgdGhlIGFuY2VzdG9yJ3MgZGVsZWdhdGUgaW5zdGVhZC4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgYWRkVG9NYXAoKSB7CisgICAgICAgICAgICBpZiAoYW5jZXN0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGFuY2VzdG9yLmFkZFRvTWFwKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1hcC5wdXQoa2V5LCBkZWxlZ2F0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICAgICAgcmVmcmVzaElmRW1wdHkoKTsKKyAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5zaXplKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKKyAgICAgICAgICAgIGlmIChvYmplY3QgPT0gdGhpcykgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVmcmVzaElmRW1wdHkoKTsKKyAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5lcXVhbHMob2JqZWN0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgcmVmcmVzaElmRW1wdHkoKTsKKyAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5oYXNoQ29kZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZWZyZXNoSWZFbXB0eSgpOworICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBDb2xsZWN0aW9uPFY+IGdldERlbGVnYXRlKCkgeworICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBJdGVyYXRvcjxWPiBpdGVyYXRvcigpIHsKKyAgICAgICAgICAgIHJlZnJlc2hJZkVtcHR5KCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFdyYXBwZWRJdGVyYXRvcigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGFkZChWIHZhbHVlKSB7CisgICAgICAgICAgICByZWZyZXNoSWZFbXB0eSgpOworICAgICAgICAgICAgYm9vbGVhbiB3YXNFbXB0eSA9IGRlbGVnYXRlLmlzRW1wdHkoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IGRlbGVnYXRlLmFkZCh2YWx1ZSk7CisgICAgICAgICAgICBpZiAoY2hhbmdlZCkgeworICAgICAgICAgICAgICAgIHRvdGFsU2l6ZSsrOworICAgICAgICAgICAgICAgIGlmICh3YXNFbXB0eSkgeworICAgICAgICAgICAgICAgICAgICBhZGRUb01hcCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjaGFuZ2VkOworICAgICAgICB9CisKKyAgICAgICAgV3JhcHBlZENvbGxlY3Rpb24gZ2V0QW5jZXN0b3IoKSB7CisgICAgICAgICAgICByZXR1cm4gYW5jZXN0b3I7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIFY+IGNvbGxlY3Rpb24pIHsKKyAgICAgICAgICAgIGlmIChjb2xsZWN0aW9uLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBvbGRTaXplID0gc2l6ZSgpOyAgLy8gY2FsbHMgcmVmcmVzaElmRW1wdHkKKyAgICAgICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IGRlbGVnYXRlLmFkZEFsbChjb2xsZWN0aW9uKTsKKyAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgaW50IG5ld1NpemUgPSBkZWxlZ2F0ZS5zaXplKCk7CisgICAgICAgICAgICAgICAgdG90YWxTaXplICs9IChuZXdTaXplIC0gb2xkU2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKG9sZFNpemUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBhZGRUb01hcCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjaGFuZ2VkOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSBwcm92aWRlZCBmb3IgYmV0dGVyIHBlcmZvcm1hbmNlLgorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgeworICAgICAgICAgICAgcmVmcmVzaElmRW1wdHkoKTsKKyAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5jb250YWlucyhvKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0FsbChDb2xsZWN0aW9uPD8+IGMpIHsKKyAgICAgICAgICAgIHJlZnJlc2hJZkVtcHR5KCk7CisgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuY29udGFpbnNBbGwoYyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgICAgICBpbnQgb2xkU2l6ZSA9IHNpemUoKTsgIC8vIGNhbGxzIHJlZnJlc2hJZkVtcHR5CisgICAgICAgICAgICBpZiAob2xkU2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVsZWdhdGUuY2xlYXIoKTsKKyAgICAgICAgICAgIHRvdGFsU2l6ZSAtPSBvbGRTaXplOworICAgICAgICAgICAgcmVtb3ZlSWZFbXB0eSgpOyAgICAgICAvLyBtYXliZSBzaG91bGRuJ3QgYmUgcmVtb3ZlZCBpZiB0aGlzIGlzIGEgc3VibGlzdAorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgeworICAgICAgICAgICAgcmVmcmVzaElmRW1wdHkoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IGRlbGVnYXRlLnJlbW92ZShvKTsKKyAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgdG90YWxTaXplLS07CisgICAgICAgICAgICAgICAgcmVtb3ZlSWZFbXB0eSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGNoYW5nZWQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gYykgeworICAgICAgICAgICAgaWYgKGMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IG9sZFNpemUgPSBzaXplKCk7ICAvLyBjYWxscyByZWZyZXNoSWZFbXB0eQorICAgICAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gZGVsZWdhdGUucmVtb3ZlQWxsKGMpOworICAgICAgICAgICAgaWYgKGNoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICBpbnQgbmV3U2l6ZSA9IGRlbGVnYXRlLnNpemUoKTsKKyAgICAgICAgICAgICAgICB0b3RhbFNpemUgKz0gKG5ld1NpemUgLSBvbGRTaXplKTsKKyAgICAgICAgICAgICAgICByZW1vdmVJZkVtcHR5KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY2hhbmdlZDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbjw/PiBjKSB7CisgICAgICAgICAgICBjaGVja05vdE51bGwoYyk7CisgICAgICAgICAgICBpbnQgb2xkU2l6ZSA9IHNpemUoKTsgIC8vIGNhbGxzIHJlZnJlc2hJZkVtcHR5CisgICAgICAgICAgICBib29sZWFuIGNoYW5nZWQgPSBkZWxlZ2F0ZS5yZXRhaW5BbGwoYyk7CisgICAgICAgICAgICBpZiAoY2hhbmdlZCkgeworICAgICAgICAgICAgICAgIGludCBuZXdTaXplID0gZGVsZWdhdGUuc2l6ZSgpOworICAgICAgICAgICAgICAgIHRvdGFsU2l6ZSArPSAobmV3U2l6ZSAtIG9sZFNpemUpOworICAgICAgICAgICAgICAgIHJlbW92ZUlmRW1wdHkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjaGFuZ2VkOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbGxlY3Rpb24gaXRlcmF0b3IgZm9yIHtAY29kZSBXcmFwcGVkQ29sbGVjdGlvbn0uCisgICAgICAgICAqLworICAgICAgICBjbGFzcyBXcmFwcGVkSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcjxWPiB7CisgICAgICAgICAgICBmaW5hbCBJdGVyYXRvcjxWPiBkZWxlZ2F0ZUl0ZXJhdG9yOworICAgICAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxWPiBvcmlnaW5hbERlbGVnYXRlID0gZGVsZWdhdGU7CisKKyAgICAgICAgICAgIFdyYXBwZWRJdGVyYXRvcigpIHsKKyAgICAgICAgICAgICAgICBkZWxlZ2F0ZUl0ZXJhdG9yID0gaXRlcmF0b3JPckxpc3RJdGVyYXRvcihkZWxlZ2F0ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFdyYXBwZWRJdGVyYXRvcihJdGVyYXRvcjxWPiBkZWxlZ2F0ZUl0ZXJhdG9yKSB7CisgICAgICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZUl0ZXJhdG9yID0gZGVsZWdhdGVJdGVyYXRvcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBJZiB0aGUgZGVsZWdhdGUgY2hhbmdlZCBzaW5jZSB0aGUgaXRlcmF0b3Igd2FzIGNyZWF0ZWQsIHRoZSBpdGVyYXRvciBpcworICAgICAgICAgICAgICogbm8gbG9uZ2VyIHZhbGlkLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICB2b2lkIHZhbGlkYXRlSXRlcmF0b3IoKSB7CisgICAgICAgICAgICAgICAgcmVmcmVzaElmRW1wdHkoKTsKKyAgICAgICAgICAgICAgICBpZiAoZGVsZWdhdGUgIT0gb3JpZ2luYWxEZWxlZ2F0ZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICAgICAgICAgIHZhbGlkYXRlSXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGVJdGVyYXRvci5oYXNOZXh0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFYgbmV4dCgpIHsKKyAgICAgICAgICAgICAgICB2YWxpZGF0ZUl0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlSXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKyAgICAgICAgICAgICAgICBkZWxlZ2F0ZUl0ZXJhdG9yLnJlbW92ZSgpOworICAgICAgICAgICAgICAgIHRvdGFsU2l6ZS0tOworICAgICAgICAgICAgICAgIHJlbW92ZUlmRW1wdHkoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgSXRlcmF0b3I8Vj4gZ2V0RGVsZWdhdGVJdGVyYXRvcigpIHsKKyAgICAgICAgICAgICAgICB2YWxpZGF0ZUl0ZXJhdG9yKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlSXRlcmF0b3I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgZGVjb3JhdG9yIHRoYXQgc3RheXMgaW4gc3luYyB3aXRoIHRoZSBtdWx0aW1hcCB2YWx1ZXMgZm9yIGEga2V5LgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgV3JhcHBlZFNldCBleHRlbmRzIFdyYXBwZWRDb2xsZWN0aW9uIGltcGxlbWVudHMgU2V0PFY+IHsKKyAgICAgICAgV3JhcHBlZFNldChLIGtleSwgU2V0PFY+IGRlbGVnYXRlKSB7CisgICAgICAgICAgICBzdXBlcihrZXksIGRlbGVnYXRlLCBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbjw/PiBjKSB7CisgICAgICAgICAgICBpZiAoYy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgb2xkU2l6ZSA9IHNpemUoKTsgIC8vIGNhbGxzIHJlZnJlc2hJZkVtcHR5CisKKyAgICAgICAgICAgIC8vIEd1YXZhIGlzc3VlIDEwMTM6IEFic3RyYWN0U2V0IGFuZCBtb3N0IEpESyBzZXQgaW1wbGVtZW50YXRpb25zIGFyZQorICAgICAgICAgICAgLy8gc3VzY2VwdGlibGUgdG8gcXVhZHJhdGljIHJlbW92ZUFsbCBwZXJmb3JtYW5jZSBvbiBsaXN0czsKKyAgICAgICAgICAgIC8vIHVzZSBhIHNsaWdodGx5IHNtYXJ0ZXIgaW1wbGVtZW50YXRpb24gaGVyZQorICAgICAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gU2V0cy5yZW1vdmVBbGxJbXBsKChTZXQ8Vj4pIGRlbGVnYXRlLCBjKTsKKyAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgaW50IG5ld1NpemUgPSBkZWxlZ2F0ZS5zaXplKCk7CisgICAgICAgICAgICAgICAgdG90YWxTaXplICs9IChuZXdTaXplIC0gb2xkU2l6ZSk7CisgICAgICAgICAgICAgICAgcmVtb3ZlSWZFbXB0eSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGNoYW5nZWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTb3J0ZWRTZXQgZGVjb3JhdG9yIHRoYXQgc3RheXMgaW4gc3luYyB3aXRoIHRoZSBtdWx0aW1hcCB2YWx1ZXMgZm9yIGEga2V5LgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgV3JhcHBlZFNvcnRlZFNldCBleHRlbmRzIFdyYXBwZWRDb2xsZWN0aW9uCisgICAgICAgICAgICBpbXBsZW1lbnRzIFNvcnRlZFNldDxWPiB7CisgICAgICAgIFdyYXBwZWRTb3J0ZWRTZXQoSyBrZXksIFNvcnRlZFNldDxWPiBkZWxlZ2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBXcmFwcGVkQ29sbGVjdGlvbiBhbmNlc3RvcikgeworICAgICAgICAgICAgc3VwZXIoa2V5LCBkZWxlZ2F0ZSwgYW5jZXN0b3IpOworICAgICAgICB9CisKKyAgICAgICAgU29ydGVkU2V0PFY+IGdldFNvcnRlZFNldERlbGVnYXRlKCkgeworICAgICAgICAgICAgcmV0dXJuIChTb3J0ZWRTZXQ8Vj4pIGdldERlbGVnYXRlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENvbXBhcmF0b3I8PyBzdXBlciBWPiBjb21wYXJhdG9yKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldFNvcnRlZFNldERlbGVnYXRlKCkuY29tcGFyYXRvcigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWIGZpcnN0KCkgeworICAgICAgICAgICAgcmVmcmVzaElmRW1wdHkoKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRTb3J0ZWRTZXREZWxlZ2F0ZSgpLmZpcnN0KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFYgbGFzdCgpIHsKKyAgICAgICAgICAgIHJlZnJlc2hJZkVtcHR5KCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0U29ydGVkU2V0RGVsZWdhdGUoKS5sYXN0KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFNvcnRlZFNldDxWPiBoZWFkU2V0KFYgdG9FbGVtZW50KSB7CisgICAgICAgICAgICByZWZyZXNoSWZFbXB0eSgpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBXcmFwcGVkU29ydGVkU2V0KAorICAgICAgICAgICAgICAgICAgICBnZXRLZXkoKSwgZ2V0U29ydGVkU2V0RGVsZWdhdGUoKS5oZWFkU2V0KHRvRWxlbWVudCksCisgICAgICAgICAgICAgICAgICAgIChnZXRBbmNlc3RvcigpID09IG51bGwpID8gdGhpcyA6IGdldEFuY2VzdG9yKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTb3J0ZWRTZXQ8Vj4gc3ViU2V0KFYgZnJvbUVsZW1lbnQsIFYgdG9FbGVtZW50KSB7CisgICAgICAgICAgICByZWZyZXNoSWZFbXB0eSgpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBXcmFwcGVkU29ydGVkU2V0KAorICAgICAgICAgICAgICAgICAgICBnZXRLZXkoKSwgZ2V0U29ydGVkU2V0RGVsZWdhdGUoKS5zdWJTZXQoZnJvbUVsZW1lbnQsIHRvRWxlbWVudCksCisgICAgICAgICAgICAgICAgICAgIChnZXRBbmNlc3RvcigpID09IG51bGwpID8gdGhpcyA6IGdldEFuY2VzdG9yKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTb3J0ZWRTZXQ8Vj4gdGFpbFNldChWIGZyb21FbGVtZW50KSB7CisgICAgICAgICAgICByZWZyZXNoSWZFbXB0eSgpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBXcmFwcGVkU29ydGVkU2V0KAorICAgICAgICAgICAgICAgICAgICBnZXRLZXkoKSwgZ2V0U29ydGVkU2V0RGVsZWdhdGUoKS50YWlsU2V0KGZyb21FbGVtZW50KSwKKyAgICAgICAgICAgICAgICAgICAgKGdldEFuY2VzdG9yKCkgPT0gbnVsbCkgPyB0aGlzIDogZ2V0QW5jZXN0b3IoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBXcmFwcGVkTmF2aWdhYmxlU2V0IGV4dGVuZHMgV3JhcHBlZFNvcnRlZFNldCBpbXBsZW1lbnRzIE5hdmlnYWJsZVNldDxWPiB7CisgICAgICAgIFdyYXBwZWROYXZpZ2FibGVTZXQoCisgICAgICAgICAgICAgICAgSyBrZXksIE5hdmlnYWJsZVNldDxWPiBkZWxlZ2F0ZSwgV3JhcHBlZENvbGxlY3Rpb24gYW5jZXN0b3IpIHsKKyAgICAgICAgICAgIHN1cGVyKGtleSwgZGVsZWdhdGUsIGFuY2VzdG9yKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBOYXZpZ2FibGVTZXQ8Vj4gZ2V0U29ydGVkU2V0RGVsZWdhdGUoKSB7CisgICAgICAgICAgICByZXR1cm4gKE5hdmlnYWJsZVNldDxWPikgc3VwZXIuZ2V0U29ydGVkU2V0RGVsZWdhdGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgViBsb3dlcihWIHYpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRTb3J0ZWRTZXREZWxlZ2F0ZSgpLmxvd2VyKHYpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWIGZsb29yKFYgdikgeworICAgICAgICAgICAgcmV0dXJuIGdldFNvcnRlZFNldERlbGVnYXRlKCkuZmxvb3Iodik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFYgY2VpbGluZyhWIHYpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRTb3J0ZWRTZXREZWxlZ2F0ZSgpLmNlaWxpbmcodik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFYgaGlnaGVyKFYgdikgeworICAgICAgICAgICAgcmV0dXJuIGdldFNvcnRlZFNldERlbGVnYXRlKCkuaGlnaGVyKHYpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWIHBvbGxGaXJzdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBJdGVyYXRvcnMucG9sbE5leHQoaXRlcmF0b3IoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFYgcG9sbExhc3QoKSB7CisgICAgICAgICAgICByZXR1cm4gSXRlcmF0b3JzLnBvbGxOZXh0KGRlc2NlbmRpbmdJdGVyYXRvcigpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgTmF2aWdhYmxlU2V0PFY+IHdyYXAoTmF2aWdhYmxlU2V0PFY+IHdyYXBwZWQpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgV3JhcHBlZE5hdmlnYWJsZVNldChrZXksIHdyYXBwZWQsCisgICAgICAgICAgICAgICAgICAgIChnZXRBbmNlc3RvcigpID09IG51bGwpID8gdGhpcyA6IGdldEFuY2VzdG9yKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBOYXZpZ2FibGVTZXQ8Vj4gZGVzY2VuZGluZ1NldCgpIHsKKyAgICAgICAgICAgIHJldHVybiB3cmFwKGdldFNvcnRlZFNldERlbGVnYXRlKCkuZGVzY2VuZGluZ1NldCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSXRlcmF0b3I8Vj4gZGVzY2VuZGluZ0l0ZXJhdG9yKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBBYnN0cmFjdE1hcEJhc2VkTXVsdGltYXAuV3JhcHBlZENvbGxlY3Rpb24uV3JhcHBlZEl0ZXJhdG9yKGdldFNvcnRlZFNldERlbGVnYXRlKCkKKyAgICAgICAgICAgICAgICAgICAgLmRlc2NlbmRpbmdJdGVyYXRvcigpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTmF2aWdhYmxlU2V0PFY+IHN1YlNldCgKKyAgICAgICAgICAgICAgICBWIGZyb21FbGVtZW50LCBib29sZWFuIGZyb21JbmNsdXNpdmUsIFYgdG9FbGVtZW50LCBib29sZWFuIHRvSW5jbHVzaXZlKSB7CisgICAgICAgICAgICByZXR1cm4gd3JhcCgKKyAgICAgICAgICAgICAgICAgICAgZ2V0U29ydGVkU2V0RGVsZWdhdGUoKS5zdWJTZXQoZnJvbUVsZW1lbnQsIGZyb21JbmNsdXNpdmUsIHRvRWxlbWVudCwgdG9JbmNsdXNpdmUpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTmF2aWdhYmxlU2V0PFY+IGhlYWRTZXQoViB0b0VsZW1lbnQsIGJvb2xlYW4gaW5jbHVzaXZlKSB7CisgICAgICAgICAgICByZXR1cm4gd3JhcChnZXRTb3J0ZWRTZXREZWxlZ2F0ZSgpLmhlYWRTZXQodG9FbGVtZW50LCBpbmNsdXNpdmUpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTmF2aWdhYmxlU2V0PFY+IHRhaWxTZXQoViBmcm9tRWxlbWVudCwgYm9vbGVhbiBpbmNsdXNpdmUpIHsKKyAgICAgICAgICAgIHJldHVybiB3cmFwKGdldFNvcnRlZFNldERlbGVnYXRlKCkudGFpbFNldChmcm9tRWxlbWVudCwgaW5jbHVzaXZlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMaXN0IGRlY29yYXRvciB0aGF0IHN0YXlzIGluIHN5bmMgd2l0aCB0aGUgbXVsdGltYXAgdmFsdWVzIGZvciBhIGtleS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIFdyYXBwZWRMaXN0IGV4dGVuZHMgV3JhcHBlZENvbGxlY3Rpb24gaW1wbGVtZW50cyBMaXN0PFY+IHsKKyAgICAgICAgV3JhcHBlZExpc3QoSyBrZXksIExpc3Q8Vj4gZGVsZWdhdGUsCisgICAgICAgICAgICAgICAgICAgIFdyYXBwZWRDb2xsZWN0aW9uIGFuY2VzdG9yKSB7CisgICAgICAgICAgICBzdXBlcihrZXksIGRlbGVnYXRlLCBhbmNlc3Rvcik7CisgICAgICAgIH0KKworICAgICAgICBMaXN0PFY+IGdldExpc3REZWxlZ2F0ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAoTGlzdDxWPikgZ2V0RGVsZWdhdGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBhZGRBbGwoaW50IGluZGV4LCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBWPiBjKSB7CisgICAgICAgICAgICBpZiAoYy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgb2xkU2l6ZSA9IHNpemUoKTsgIC8vIGNhbGxzIHJlZnJlc2hJZkVtcHR5CisgICAgICAgICAgICBib29sZWFuIGNoYW5nZWQgPSBnZXRMaXN0RGVsZWdhdGUoKS5hZGRBbGwoaW5kZXgsIGMpOworICAgICAgICAgICAgaWYgKGNoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICBpbnQgbmV3U2l6ZSA9IGdldERlbGVnYXRlKCkuc2l6ZSgpOworICAgICAgICAgICAgICAgIHRvdGFsU2l6ZSArPSAobmV3U2l6ZSAtIG9sZFNpemUpOworICAgICAgICAgICAgICAgIGlmIChvbGRTaXplID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkVG9NYXAoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY2hhbmdlZDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgViBnZXQoaW50IGluZGV4KSB7CisgICAgICAgICAgICByZWZyZXNoSWZFbXB0eSgpOworICAgICAgICAgICAgcmV0dXJuIGdldExpc3REZWxlZ2F0ZSgpLmdldChpbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFYgc2V0KGludCBpbmRleCwgViBlbGVtZW50KSB7CisgICAgICAgICAgICByZWZyZXNoSWZFbXB0eSgpOworICAgICAgICAgICAgcmV0dXJuIGdldExpc3REZWxlZ2F0ZSgpLnNldChpbmRleCwgZWxlbWVudCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYWRkKGludCBpbmRleCwgViBlbGVtZW50KSB7CisgICAgICAgICAgICByZWZyZXNoSWZFbXB0eSgpOworICAgICAgICAgICAgYm9vbGVhbiB3YXNFbXB0eSA9IGdldERlbGVnYXRlKCkuaXNFbXB0eSgpOworICAgICAgICAgICAgZ2V0TGlzdERlbGVnYXRlKCkuYWRkKGluZGV4LCBlbGVtZW50KTsKKyAgICAgICAgICAgIHRvdGFsU2l6ZSsrOworICAgICAgICAgICAgaWYgKHdhc0VtcHR5KSB7CisgICAgICAgICAgICAgICAgYWRkVG9NYXAoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgViByZW1vdmUoaW50IGluZGV4KSB7CisgICAgICAgICAgICByZWZyZXNoSWZFbXB0eSgpOworICAgICAgICAgICAgViB2YWx1ZSA9IGdldExpc3REZWxlZ2F0ZSgpLnJlbW92ZShpbmRleCk7CisgICAgICAgICAgICB0b3RhbFNpemUtLTsKKyAgICAgICAgICAgIHJlbW92ZUlmRW1wdHkoKTsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGluZGV4T2YoT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIHJlZnJlc2hJZkVtcHR5KCk7CisgICAgICAgICAgICByZXR1cm4gZ2V0TGlzdERlbGVnYXRlKCkuaW5kZXhPZihvKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGxhc3RJbmRleE9mKE9iamVjdCBvKSB7CisgICAgICAgICAgICByZWZyZXNoSWZFbXB0eSgpOworICAgICAgICAgICAgcmV0dXJuIGdldExpc3REZWxlZ2F0ZSgpLmxhc3RJbmRleE9mKG8pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBMaXN0SXRlcmF0b3I8Vj4gbGlzdEl0ZXJhdG9yKCkgeworICAgICAgICAgICAgcmVmcmVzaElmRW1wdHkoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgV3JhcHBlZExpc3RJdGVyYXRvcigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBMaXN0SXRlcmF0b3I8Vj4gbGlzdEl0ZXJhdG9yKGludCBpbmRleCkgeworICAgICAgICAgICAgcmVmcmVzaElmRW1wdHkoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgV3JhcHBlZExpc3RJdGVyYXRvcihpbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIExpc3Q8Vj4gc3ViTGlzdChpbnQgZnJvbUluZGV4LCBpbnQgdG9JbmRleCkgeworICAgICAgICAgICAgcmVmcmVzaElmRW1wdHkoKTsKKyAgICAgICAgICAgIHJldHVybiB3cmFwTGlzdCgKKyAgICAgICAgICAgICAgICAgICAgZ2V0S2V5KCksCisgICAgICAgICAgICAgICAgICAgIGdldExpc3REZWxlZ2F0ZSgpLnN1Ykxpc3QoZnJvbUluZGV4LCB0b0luZGV4KSwKKyAgICAgICAgICAgICAgICAgICAgKGdldEFuY2VzdG9yKCkgPT0gbnVsbCkgPyB0aGlzIDogZ2V0QW5jZXN0b3IoKSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogTGlzdEl0ZXJhdG9yIGRlY29yYXRvci4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgY2xhc3MgV3JhcHBlZExpc3RJdGVyYXRvciBleHRlbmRzIFdyYXBwZWRJdGVyYXRvcgorICAgICAgICAgICAgICAgIGltcGxlbWVudHMgTGlzdEl0ZXJhdG9yPFY+IHsKKyAgICAgICAgICAgIFdyYXBwZWRMaXN0SXRlcmF0b3IoKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBXcmFwcGVkTGlzdEl0ZXJhdG9yKGludCBpbmRleCkgeworICAgICAgICAgICAgICAgIHN1cGVyKGdldExpc3REZWxlZ2F0ZSgpLmxpc3RJdGVyYXRvcihpbmRleCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIExpc3RJdGVyYXRvcjxWPiBnZXREZWxlZ2F0ZUxpc3RJdGVyYXRvcigpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKExpc3RJdGVyYXRvcjxWPikgZ2V0RGVsZWdhdGVJdGVyYXRvcigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBnZXREZWxlZ2F0ZUxpc3RJdGVyYXRvcigpLmhhc1ByZXZpb3VzKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFYgcHJldmlvdXMoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldERlbGVnYXRlTGlzdEl0ZXJhdG9yKCkucHJldmlvdXMoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RGVsZWdhdGVMaXN0SXRlcmF0b3IoKS5uZXh0SW5kZXgoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgaW50IHByZXZpb3VzSW5kZXgoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldERlbGVnYXRlTGlzdEl0ZXJhdG9yKCkucHJldmlvdXNJbmRleCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldChWIHZhbHVlKSB7CisgICAgICAgICAgICAgICAgZ2V0RGVsZWdhdGVMaXN0SXRlcmF0b3IoKS5zZXQodmFsdWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFkZChWIHZhbHVlKSB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiB3YXNFbXB0eSA9IGlzRW1wdHkoKTsKKyAgICAgICAgICAgICAgICBnZXREZWxlZ2F0ZUxpc3RJdGVyYXRvcigpLmFkZCh2YWx1ZSk7CisgICAgICAgICAgICAgICAgdG90YWxTaXplKys7CisgICAgICAgICAgICAgICAgaWYgKHdhc0VtcHR5KSB7CisgICAgICAgICAgICAgICAgICAgIGFkZFRvTWFwKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTGlzdCBkZWNvcmF0b3IgdGhhdCBzdGF5cyBpbiBzeW5jIHdpdGggdGhlIG11bHRpbWFwIHZhbHVlcyBmb3IgYSBrZXkgYW5kCisgICAgICogc3VwcG9ydHMgcmFwaWQgcmFuZG9tIGFjY2Vzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIFJhbmRvbUFjY2Vzc1dyYXBwZWRMaXN0IGV4dGVuZHMgV3JhcHBlZExpc3QKKyAgICAgICAgICAgIGltcGxlbWVudHMgUmFuZG9tQWNjZXNzIHsKKyAgICAgICAgUmFuZG9tQWNjZXNzV3JhcHBlZExpc3QoSyBrZXksIExpc3Q8Vj4gZGVsZWdhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyYXBwZWRDb2xsZWN0aW9uIGFuY2VzdG9yKSB7CisgICAgICAgICAgICBzdXBlcihrZXksIGRlbGVnYXRlLCBhbmNlc3Rvcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgLyoKKyAgICogVE9ETyhrZXZpbmIpOiBzaG91bGQgd2UgY29weSB0aGlzIGphdmFkb2MgdG8gZWFjaCBjb25jcmV0ZSBjbGFzcywgc28gdGhhdAorICAgKiBjbGFzc2VzIGxpa2UgTGlua2VkSGFzaE11bHRpbWFwIHRoYXQgbmVlZCB0byBzYXkgc29tZXRoaW5nIGRpZmZlcmVudCBhcmUKKyAgICogc3RpbGwgYWJsZSB0byB7QGluaGVyaXREb2N9IGFsbCB0aGUgd2F5IGZyb20gTXVsdGltYXA/CisgICAqLworCisgICAgcHJpdmF0ZSBjbGFzcyBLZXlTZXQgZXh0ZW5kcyBNYXBzLktleVNldDxLLCBDb2xsZWN0aW9uPFY+PiB7CisgICAgICAgIEtleVNldChmaW5hbCBNYXA8SywgQ29sbGVjdGlvbjxWPj4gc3ViTWFwKSB7CisgICAgICAgICAgICBzdXBlcihzdWJNYXApOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBJdGVyYXRvcjxLPiBpdGVyYXRvcigpIHsKKyAgICAgICAgICAgIGZpbmFsIEl0ZXJhdG9yPEVudHJ5PEssIENvbGxlY3Rpb248Vj4+PiBlbnRyeUl0ZXJhdG9yCisgICAgICAgICAgICAgICAgICAgID0gbWFwKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBJdGVyYXRvcjxLPigpIHsKKyAgICAgICAgICAgICAgICBFbnRyeTxLLCBDb2xsZWN0aW9uPFY+PiBlbnRyeTsKKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeUl0ZXJhdG9yLmhhc05leHQoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgSyBuZXh0KCkgeworICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IGVudHJ5SXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeworICAgICAgICAgICAgICAgICAgICBDb2xsZWN0UHJlY29uZGl0aW9ucy5jaGVja1JlbW92ZShlbnRyeSAhPSBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxWPiBjb2xsZWN0aW9uID0gZW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgZW50cnlJdGVyYXRvci5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgdG90YWxTaXplIC09IGNvbGxlY3Rpb24uc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgaW5jbHVkZWQgZm9yIGJldHRlciBwZXJmb3JtYW5jZS4KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBrZXkpIHsKKyAgICAgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgICAgICBDb2xsZWN0aW9uPFY+IGNvbGxlY3Rpb24gPSBtYXAoKS5yZW1vdmUoa2V5KTsKKyAgICAgICAgICAgIGlmIChjb2xsZWN0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb3VudCA9IGNvbGxlY3Rpb24uc2l6ZSgpOworICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24uY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB0b3RhbFNpemUgLT0gY291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY291bnQgPiAwOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICAgICAgSXRlcmF0b3JzLmNsZWFyKGl0ZXJhdG9yKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb248Pz4gYykgeworICAgICAgICAgICAgcmV0dXJuIG1hcCgpLmtleVNldCgpLmNvbnRhaW5zQWxsKGMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcyA9PSBvYmplY3QgfHwgdGhpcy5tYXAoKS5rZXlTZXQoKS5lcXVhbHMob2JqZWN0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1hcCgpLmtleVNldCgpLmhhc2hDb2RlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFNvcnRlZEtleVNldCBleHRlbmRzIEtleVNldCBpbXBsZW1lbnRzIFNvcnRlZFNldDxLPiB7CisKKyAgICAgICAgU29ydGVkS2V5U2V0KFNvcnRlZE1hcDxLLCBDb2xsZWN0aW9uPFY+PiBzdWJNYXApIHsKKyAgICAgICAgICAgIHN1cGVyKHN1Yk1hcCk7CisgICAgICAgIH0KKworICAgICAgICBTb3J0ZWRNYXA8SywgQ29sbGVjdGlvbjxWPj4gc29ydGVkTWFwKCkgeworICAgICAgICAgICAgcmV0dXJuIChTb3J0ZWRNYXA8SywgQ29sbGVjdGlvbjxWPj4pIHN1cGVyLm1hcCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDb21wYXJhdG9yPD8gc3VwZXIgSz4gY29tcGFyYXRvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBzb3J0ZWRNYXAoKS5jb21wYXJhdG9yKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEsgZmlyc3QoKSB7CisgICAgICAgICAgICByZXR1cm4gc29ydGVkTWFwKCkuZmlyc3RLZXkoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU29ydGVkU2V0PEs+IGhlYWRTZXQoSyB0b0VsZW1lbnQpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU29ydGVkS2V5U2V0KHNvcnRlZE1hcCgpLmhlYWRNYXAodG9FbGVtZW50KSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEsgbGFzdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBzb3J0ZWRNYXAoKS5sYXN0S2V5KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFNvcnRlZFNldDxLPiBzdWJTZXQoSyBmcm9tRWxlbWVudCwgSyB0b0VsZW1lbnQpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU29ydGVkS2V5U2V0KHNvcnRlZE1hcCgpLnN1Yk1hcChmcm9tRWxlbWVudCwgdG9FbGVtZW50KSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFNvcnRlZFNldDxLPiB0YWlsU2V0KEsgZnJvbUVsZW1lbnQpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU29ydGVkS2V5U2V0KHNvcnRlZE1hcCgpLnRhaWxNYXAoZnJvbUVsZW1lbnQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIE5hdmlnYWJsZUtleVNldCBleHRlbmRzIFNvcnRlZEtleVNldCBpbXBsZW1lbnRzIE5hdmlnYWJsZVNldDxLPiB7CisgICAgICAgIE5hdmlnYWJsZUtleVNldChOYXZpZ2FibGVNYXA8SywgQ29sbGVjdGlvbjxWPj4gc3ViTWFwKSB7CisgICAgICAgICAgICBzdXBlcihzdWJNYXApOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIE5hdmlnYWJsZU1hcDxLLCBDb2xsZWN0aW9uPFY+PiBzb3J0ZWRNYXAoKSB7CisgICAgICAgICAgICByZXR1cm4gKE5hdmlnYWJsZU1hcDxLLCBDb2xsZWN0aW9uPFY+Pikgc3VwZXIuc29ydGVkTWFwKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEsgbG93ZXIoSyBrKSB7CisgICAgICAgICAgICByZXR1cm4gc29ydGVkTWFwKCkubG93ZXJLZXkoayk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEsgZmxvb3IoSyBrKSB7CisgICAgICAgICAgICByZXR1cm4gc29ydGVkTWFwKCkuZmxvb3JLZXkoayk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEsgY2VpbGluZyhLIGspIHsKKyAgICAgICAgICAgIHJldHVybiBzb3J0ZWRNYXAoKS5jZWlsaW5nS2V5KGspOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBLIGhpZ2hlcihLIGspIHsKKyAgICAgICAgICAgIHJldHVybiBzb3J0ZWRNYXAoKS5oaWdoZXJLZXkoayk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEsgcG9sbEZpcnN0KCkgeworICAgICAgICAgICAgcmV0dXJuIEl0ZXJhdG9ycy5wb2xsTmV4dChpdGVyYXRvcigpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSyBwb2xsTGFzdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBJdGVyYXRvcnMucG9sbE5leHQoZGVzY2VuZGluZ0l0ZXJhdG9yKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBOYXZpZ2FibGVTZXQ8Sz4gZGVzY2VuZGluZ1NldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTmF2aWdhYmxlS2V5U2V0KHNvcnRlZE1hcCgpLmRlc2NlbmRpbmdNYXAoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEl0ZXJhdG9yPEs+IGRlc2NlbmRpbmdJdGVyYXRvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBkZXNjZW5kaW5nU2V0KCkuaXRlcmF0b3IoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTmF2aWdhYmxlU2V0PEs+IGhlYWRTZXQoSyB0b0VsZW1lbnQpIHsKKyAgICAgICAgICAgIHJldHVybiBoZWFkU2V0KHRvRWxlbWVudCwgZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBOYXZpZ2FibGVTZXQ8Sz4gaGVhZFNldChLIHRvRWxlbWVudCwgYm9vbGVhbiBpbmNsdXNpdmUpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTmF2aWdhYmxlS2V5U2V0KHNvcnRlZE1hcCgpLmhlYWRNYXAodG9FbGVtZW50LCBpbmNsdXNpdmUpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTmF2aWdhYmxlU2V0PEs+IHN1YlNldChLIGZyb21FbGVtZW50LCBLIHRvRWxlbWVudCkgeworICAgICAgICAgICAgcmV0dXJuIHN1YlNldChmcm9tRWxlbWVudCwgdHJ1ZSwgdG9FbGVtZW50LCBmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE5hdmlnYWJsZVNldDxLPiBzdWJTZXQoCisgICAgICAgICAgICAgICAgSyBmcm9tRWxlbWVudCwgYm9vbGVhbiBmcm9tSW5jbHVzaXZlLCBLIHRvRWxlbWVudCwgYm9vbGVhbiB0b0luY2x1c2l2ZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBOYXZpZ2FibGVLZXlTZXQoCisgICAgICAgICAgICAgICAgICAgIHNvcnRlZE1hcCgpLnN1Yk1hcChmcm9tRWxlbWVudCwgZnJvbUluY2x1c2l2ZSwgdG9FbGVtZW50LCB0b0luY2x1c2l2ZSkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBOYXZpZ2FibGVTZXQ8Sz4gdGFpbFNldChLIGZyb21FbGVtZW50KSB7CisgICAgICAgICAgICByZXR1cm4gdGFpbFNldChmcm9tRWxlbWVudCwgdHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE5hdmlnYWJsZVNldDxLPiB0YWlsU2V0KEsgZnJvbUVsZW1lbnQsIGJvb2xlYW4gaW5jbHVzaXZlKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE5hdmlnYWJsZUtleVNldChzb3J0ZWRNYXAoKS50YWlsTWFwKGZyb21FbGVtZW50LCBpbmNsdXNpdmUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYWJzdHJhY3QgY2xhc3MgSXRyPFQ+IGltcGxlbWVudHMgSXRlcmF0b3I8VD4geworICAgICAgICBmaW5hbCBJdGVyYXRvcjxFbnRyeTxLLCBDb2xsZWN0aW9uPFY+Pj4ga2V5SXRlcmF0b3I7CisgICAgICAgIEsga2V5OworICAgICAgICBDb2xsZWN0aW9uPFY+IGNvbGxlY3Rpb247CisgICAgICAgIEl0ZXJhdG9yPFY+IHZhbHVlSXRlcmF0b3I7CisKKyAgICAgICAgSXRyKCkgeworICAgICAgICAgICAga2V5SXRlcmF0b3IgPSBtYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICAgICAga2V5ID0gbnVsbDsKKyAgICAgICAgICAgIGNvbGxlY3Rpb24gPSBudWxsOworICAgICAgICAgICAgdmFsdWVJdGVyYXRvciA9IEl0ZXJhdG9ycy5lbXB0eU1vZGlmaWFibGVJdGVyYXRvcigpOworICAgICAgICB9CisKKyAgICAgICAgYWJzdHJhY3QgVCBvdXRwdXQoSyBrZXksIFYgdmFsdWUpOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIGtleUl0ZXJhdG9yLmhhc05leHQoKSB8fCB2YWx1ZUl0ZXJhdG9yLmhhc05leHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVCBuZXh0KCkgeworICAgICAgICAgICAgaWYgKCF2YWx1ZUl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIEVudHJ5PEssIENvbGxlY3Rpb248Vj4+IG1hcEVudHJ5ID0ga2V5SXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgICAgIGtleSA9IG1hcEVudHJ5LmdldEtleSgpOworICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24gPSBtYXBFbnRyeS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgICAgIHZhbHVlSXRlcmF0b3IgPSBjb2xsZWN0aW9uLml0ZXJhdG9yKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gb3V0cHV0KGtleSwgdmFsdWVJdGVyYXRvci5uZXh0KCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKyAgICAgICAgICAgIHZhbHVlSXRlcmF0b3IucmVtb3ZlKCk7CisgICAgICAgICAgICBpZiAoY29sbGVjdGlvbi5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBrZXlJdGVyYXRvci5yZW1vdmUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRvdGFsU2l6ZS0tOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBBc01hcCBleHRlbmRzIE1hcHMuSW1wcm92ZWRBYnN0cmFjdE1hcDxLLCBDb2xsZWN0aW9uPFY+PiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBVc3VhbGx5IHRoZSBzYW1lIGFzIG1hcCwgYnV0IHNtYWxsZXIgZm9yIHRoZSBoZWFkTWFwKCksIHRhaWxNYXAoKSwgb3IKKyAgICAgICAgICogc3ViTWFwKCkgb2YgYSBTb3J0ZWRBc01hcC4KKyAgICAgICAgICovCisgICAgICAgIGZpbmFsIHRyYW5zaWVudCBNYXA8SywgQ29sbGVjdGlvbjxWPj4gc3VibWFwOworCisgICAgICAgIEFzTWFwKE1hcDxLLCBDb2xsZWN0aW9uPFY+PiBzdWJtYXApIHsKKyAgICAgICAgICAgIHRoaXMuc3VibWFwID0gc3VibWFwOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBTZXQ8RW50cnk8SywgQ29sbGVjdGlvbjxWPj4+IGNyZWF0ZUVudHJ5U2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBBc01hcEVudHJpZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgaW5jbHVkZWQgZm9yIHBlcmZvcm1hbmNlLgorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShPYmplY3Qga2V5KSB7CisgICAgICAgICAgICByZXR1cm4gTWFwcy5zYWZlQ29udGFpbnNLZXkoc3VibWFwLCBrZXkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDb2xsZWN0aW9uPFY+IGdldChPYmplY3Qga2V5KSB7CisgICAgICAgICAgICBDb2xsZWN0aW9uPFY+IGNvbGxlY3Rpb24gPSBNYXBzLnNhZmVHZXQoc3VibWFwLCBrZXkpOworICAgICAgICAgICAgaWYgKGNvbGxlY3Rpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgICAgICBLIGsgPSAoSykga2V5OworICAgICAgICAgICAgcmV0dXJuIHdyYXBDb2xsZWN0aW9uKGssIGNvbGxlY3Rpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTZXQ8Sz4ga2V5U2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIEFic3RyYWN0TWFwQmFzZWRNdWx0aW1hcC50aGlzLmtleVNldCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBzdWJtYXAuc2l6ZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDb2xsZWN0aW9uPFY+IHJlbW92ZShPYmplY3Qga2V5KSB7CisgICAgICAgICAgICBDb2xsZWN0aW9uPFY+IGNvbGxlY3Rpb24gPSBzdWJtYXAucmVtb3ZlKGtleSk7CisgICAgICAgICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbGxlY3Rpb248Vj4gb3V0cHV0ID0gY3JlYXRlQ29sbGVjdGlvbigpOworICAgICAgICAgICAgb3V0cHV0LmFkZEFsbChjb2xsZWN0aW9uKTsKKyAgICAgICAgICAgIHRvdGFsU2l6ZSAtPSBjb2xsZWN0aW9uLnNpemUoKTsKKyAgICAgICAgICAgIGNvbGxlY3Rpb24uY2xlYXIoKTsKKyAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzID09IG9iamVjdCB8fCBzdWJtYXAuZXF1YWxzKG9iamVjdCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBzdWJtYXAuaGFzaENvZGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIHN1Ym1hcC50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICAgICAgaWYgKHN1Ym1hcCA9PSBtYXApIHsKKyAgICAgICAgICAgICAgICBBYnN0cmFjdE1hcEJhc2VkTXVsdGltYXAudGhpcy5jbGVhcigpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBJdGVyYXRvcnMuY2xlYXIobmV3IEFzTWFwSXRlcmF0b3IoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBFbnRyeTxLLCBDb2xsZWN0aW9uPFY+PiB3cmFwRW50cnkoRW50cnk8SywgQ29sbGVjdGlvbjxWPj4gZW50cnkpIHsKKyAgICAgICAgICAgIEsga2V5ID0gZW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICByZXR1cm4gTWFwcy5pbW11dGFibGVFbnRyeShrZXksIHdyYXBDb2xsZWN0aW9uKGtleSwgZW50cnkuZ2V0VmFsdWUoKSkpOworICAgICAgICB9CisKKyAgICAgICAgY2xhc3MgQXNNYXBFbnRyaWVzIGV4dGVuZHMgTWFwcy5FbnRyeVNldDxLLCBDb2xsZWN0aW9uPFY+PiB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIE1hcDxLLCBDb2xsZWN0aW9uPFY+PiBtYXAoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFic3RyYWN0TWFwQmFzZWRNdWx0aW1hcC5Bc01hcC50aGlzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBJdGVyYXRvcjxFbnRyeTxLLCBDb2xsZWN0aW9uPFY+Pj4gaXRlcmF0b3IoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBc01hcEl0ZXJhdG9yKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgaW5jbHVkZWQgZm9yIHBlcmZvcm1hbmNlLgorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zMi5zYWZlQ29udGFpbnMoc3VibWFwLmVudHJ5U2V0KCksIG8pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgeworICAgICAgICAgICAgICAgIGlmICghY29udGFpbnMobykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBFbnRyeTw/LCA/PiBlbnRyeSA9IChFbnRyeTw/LCA/PikgbzsKKyAgICAgICAgICAgICAgICByZW1vdmVWYWx1ZXNGb3JLZXkoZW50cnkuZ2V0S2V5KCkpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEl0ZXJhdG9yIGFjcm9zcyBhbGwga2V5cyBhbmQgdmFsdWUgY29sbGVjdGlvbnMuCisgICAgICAgICAqLworICAgICAgICBjbGFzcyBBc01hcEl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3I8RW50cnk8SywgQ29sbGVjdGlvbjxWPj4+IHsKKyAgICAgICAgICAgIGZpbmFsIEl0ZXJhdG9yPEVudHJ5PEssIENvbGxlY3Rpb248Vj4+PiBkZWxlZ2F0ZUl0ZXJhdG9yCisgICAgICAgICAgICAgICAgICAgID0gc3VibWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIENvbGxlY3Rpb248Vj4gY29sbGVjdGlvbjsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZUl0ZXJhdG9yLmhhc05leHQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgRW50cnk8SywgQ29sbGVjdGlvbjxWPj4gbmV4dCgpIHsKKyAgICAgICAgICAgICAgICBFbnRyeTxLLCBDb2xsZWN0aW9uPFY+PiBlbnRyeSA9IGRlbGVnYXRlSXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24gPSBlbnRyeS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgICAgIHJldHVybiB3cmFwRW50cnkoZW50cnkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKyAgICAgICAgICAgICAgICBkZWxlZ2F0ZUl0ZXJhdG9yLnJlbW92ZSgpOworICAgICAgICAgICAgICAgIHRvdGFsU2l6ZSAtPSBjb2xsZWN0aW9uLnNpemUoKTsKKyAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLmNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFNvcnRlZEFzTWFwIGV4dGVuZHMgQXNNYXAKKyAgICAgICAgICAgIGltcGxlbWVudHMgU29ydGVkTWFwPEssIENvbGxlY3Rpb248Vj4+IHsKKyAgICAgICAgU29ydGVkU2V0PEs+IHNvcnRlZEtleVNldDsKKworICAgICAgICBTb3J0ZWRBc01hcChTb3J0ZWRNYXA8SywgQ29sbGVjdGlvbjxWPj4gc3VibWFwKSB7CisgICAgICAgICAgICBzdXBlcihzdWJtYXApOworICAgICAgICB9CisKKyAgICAgICAgU29ydGVkTWFwPEssIENvbGxlY3Rpb248Vj4+IHNvcnRlZE1hcCgpIHsKKyAgICAgICAgICAgIHJldHVybiAoU29ydGVkTWFwPEssIENvbGxlY3Rpb248Vj4+KSBzdWJtYXA7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENvbXBhcmF0b3I8PyBzdXBlciBLPiBjb21wYXJhdG9yKCkgeworICAgICAgICAgICAgcmV0dXJuIHNvcnRlZE1hcCgpLmNvbXBhcmF0b3IoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSyBmaXJzdEtleSgpIHsKKyAgICAgICAgICAgIHJldHVybiBzb3J0ZWRNYXAoKS5maXJzdEtleSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBLIGxhc3RLZXkoKSB7CisgICAgICAgICAgICByZXR1cm4gc29ydGVkTWFwKCkubGFzdEtleSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTb3J0ZWRNYXA8SywgQ29sbGVjdGlvbjxWPj4gaGVhZE1hcChLIHRvS2V5KSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFNvcnRlZEFzTWFwKHNvcnRlZE1hcCgpLmhlYWRNYXAodG9LZXkpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU29ydGVkTWFwPEssIENvbGxlY3Rpb248Vj4+IHN1Yk1hcChLIGZyb21LZXksIEsgdG9LZXkpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU29ydGVkQXNNYXAoc29ydGVkTWFwKCkuc3ViTWFwKGZyb21LZXksIHRvS2V5KSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFNvcnRlZE1hcDxLLCBDb2xsZWN0aW9uPFY+PiB0YWlsTWFwKEsgZnJvbUtleSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTb3J0ZWRBc01hcChzb3J0ZWRNYXAoKS50YWlsTWFwKGZyb21LZXkpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHJldHVybnMgYSBTb3J0ZWRTZXQsIGV2ZW4gdGhvdWdoIHJldHVybmluZyBhIFNldCB3b3VsZCBiZSBzdWZmaWNpZW50IHRvCisgICAgICAgIC8vIHNhdGlzZnkgdGhlIFNvcnRlZE1hcC5rZXlTZXQoKSBpbnRlcmZhY2UKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTb3J0ZWRTZXQ8Sz4ga2V5U2V0KCkgeworICAgICAgICAgICAgU29ydGVkU2V0PEs+IHJlc3VsdCA9IHNvcnRlZEtleVNldDsKKyAgICAgICAgICAgIHJldHVybiAocmVzdWx0ID09IG51bGwpID8gc29ydGVkS2V5U2V0ID0gY3JlYXRlS2V5U2V0KCkgOiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgU29ydGVkU2V0PEs+IGNyZWF0ZUtleVNldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU29ydGVkS2V5U2V0KHNvcnRlZE1hcCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsYXNzIE5hdmlnYWJsZUFzTWFwIGV4dGVuZHMgU29ydGVkQXNNYXAgaW1wbGVtZW50cyBOYXZpZ2FibGVNYXA8SywgQ29sbGVjdGlvbjxWPj4geworCisgICAgICAgIE5hdmlnYWJsZUFzTWFwKE5hdmlnYWJsZU1hcDxLLCBDb2xsZWN0aW9uPFY+PiBzdWJtYXApIHsKKyAgICAgICAgICAgIHN1cGVyKHN1Ym1hcCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgTmF2aWdhYmxlTWFwPEssIENvbGxlY3Rpb248Vj4+IHNvcnRlZE1hcCgpIHsKKyAgICAgICAgICAgIHJldHVybiAoTmF2aWdhYmxlTWFwPEssIENvbGxlY3Rpb248Vj4+KSBzdXBlci5zb3J0ZWRNYXAoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRW50cnk8SywgQ29sbGVjdGlvbjxWPj4gbG93ZXJFbnRyeShLIGtleSkgeworICAgICAgICAgICAgRW50cnk8SywgQ29sbGVjdGlvbjxWPj4gZW50cnkgPSBzb3J0ZWRNYXAoKS5sb3dlckVudHJ5KGtleSk7CisgICAgICAgICAgICByZXR1cm4gKGVudHJ5ID09IG51bGwpID8gbnVsbCA6IHdyYXBFbnRyeShlbnRyeSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEsgbG93ZXJLZXkoSyBrZXkpIHsKKyAgICAgICAgICAgIHJldHVybiBzb3J0ZWRNYXAoKS5sb3dlcktleShrZXkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBFbnRyeTxLLCBDb2xsZWN0aW9uPFY+PiBmbG9vckVudHJ5KEsga2V5KSB7CisgICAgICAgICAgICBFbnRyeTxLLCBDb2xsZWN0aW9uPFY+PiBlbnRyeSA9IHNvcnRlZE1hcCgpLmZsb29yRW50cnkoa2V5KTsKKyAgICAgICAgICAgIHJldHVybiAoZW50cnkgPT0gbnVsbCkgPyBudWxsIDogd3JhcEVudHJ5KGVudHJ5KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSyBmbG9vcktleShLIGtleSkgeworICAgICAgICAgICAgcmV0dXJuIHNvcnRlZE1hcCgpLmZsb29yS2V5KGtleSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEVudHJ5PEssIENvbGxlY3Rpb248Vj4+IGNlaWxpbmdFbnRyeShLIGtleSkgeworICAgICAgICAgICAgRW50cnk8SywgQ29sbGVjdGlvbjxWPj4gZW50cnkgPSBzb3J0ZWRNYXAoKS5jZWlsaW5nRW50cnkoa2V5KTsKKyAgICAgICAgICAgIHJldHVybiAoZW50cnkgPT0gbnVsbCkgPyBudWxsIDogd3JhcEVudHJ5KGVudHJ5KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSyBjZWlsaW5nS2V5KEsga2V5KSB7CisgICAgICAgICAgICByZXR1cm4gc29ydGVkTWFwKCkuY2VpbGluZ0tleShrZXkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBFbnRyeTxLLCBDb2xsZWN0aW9uPFY+PiBoaWdoZXJFbnRyeShLIGtleSkgeworICAgICAgICAgICAgRW50cnk8SywgQ29sbGVjdGlvbjxWPj4gZW50cnkgPSBzb3J0ZWRNYXAoKS5oaWdoZXJFbnRyeShrZXkpOworICAgICAgICAgICAgcmV0dXJuIChlbnRyeSA9PSBudWxsKSA/IG51bGwgOiB3cmFwRW50cnkoZW50cnkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBLIGhpZ2hlcktleShLIGtleSkgeworICAgICAgICAgICAgcmV0dXJuIHNvcnRlZE1hcCgpLmhpZ2hlcktleShrZXkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBFbnRyeTxLLCBDb2xsZWN0aW9uPFY+PiBmaXJzdEVudHJ5KCkgeworICAgICAgICAgICAgRW50cnk8SywgQ29sbGVjdGlvbjxWPj4gZW50cnkgPSBzb3J0ZWRNYXAoKS5maXJzdEVudHJ5KCk7CisgICAgICAgICAgICByZXR1cm4gKGVudHJ5ID09IG51bGwpID8gbnVsbCA6IHdyYXBFbnRyeShlbnRyeSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEVudHJ5PEssIENvbGxlY3Rpb248Vj4+IGxhc3RFbnRyeSgpIHsKKyAgICAgICAgICAgIEVudHJ5PEssIENvbGxlY3Rpb248Vj4+IGVudHJ5ID0gc29ydGVkTWFwKCkubGFzdEVudHJ5KCk7CisgICAgICAgICAgICByZXR1cm4gKGVudHJ5ID09IG51bGwpID8gbnVsbCA6IHdyYXBFbnRyeShlbnRyeSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEVudHJ5PEssIENvbGxlY3Rpb248Vj4+IHBvbGxGaXJzdEVudHJ5KCkgeworICAgICAgICAgICAgcmV0dXJuIHBvbGxBc01hcEVudHJ5KGVudHJ5U2V0KCkuaXRlcmF0b3IoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEVudHJ5PEssIENvbGxlY3Rpb248Vj4+IHBvbGxMYXN0RW50cnkoKSB7CisgICAgICAgICAgICByZXR1cm4gcG9sbEFzTWFwRW50cnkoZGVzY2VuZGluZ01hcCgpLmVudHJ5U2V0KCkuaXRlcmF0b3IoKSk7CisgICAgICAgIH0KKworICAgICAgICBFbnRyeTxLLCBDb2xsZWN0aW9uPFY+PiBwb2xsQXNNYXBFbnRyeShJdGVyYXRvcjxFbnRyeTxLLCBDb2xsZWN0aW9uPFY+Pj4gZW50cnlJdGVyYXRvcikgeworICAgICAgICAgICAgaWYgKCFlbnRyeUl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRW50cnk8SywgQ29sbGVjdGlvbjxWPj4gZW50cnkgPSBlbnRyeUl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgIENvbGxlY3Rpb248Vj4gb3V0cHV0ID0gY3JlYXRlQ29sbGVjdGlvbigpOworICAgICAgICAgICAgb3V0cHV0LmFkZEFsbChlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIGVudHJ5SXRlcmF0b3IucmVtb3ZlKCk7CisgICAgICAgICAgICByZXR1cm4gTWFwcy5pbW11dGFibGVFbnRyeShlbnRyeS5nZXRLZXkoKSwgdW5tb2RpZmlhYmxlQ29sbGVjdGlvblN1YmNsYXNzKG91dHB1dCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBOYXZpZ2FibGVNYXA8SywgQ29sbGVjdGlvbjxWPj4gZGVzY2VuZGluZ01hcCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTmF2aWdhYmxlQXNNYXAoc29ydGVkTWFwKCkuZGVzY2VuZGluZ01hcCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTmF2aWdhYmxlU2V0PEs+IGtleVNldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAoTmF2aWdhYmxlU2V0PEs+KSBzdXBlci5rZXlTZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBOYXZpZ2FibGVTZXQ8Sz4gY3JlYXRlS2V5U2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBOYXZpZ2FibGVLZXlTZXQoc29ydGVkTWFwKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBOYXZpZ2FibGVTZXQ8Sz4gbmF2aWdhYmxlS2V5U2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIGtleVNldCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBOYXZpZ2FibGVTZXQ8Sz4gZGVzY2VuZGluZ0tleVNldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBkZXNjZW5kaW5nTWFwKCkubmF2aWdhYmxlS2V5U2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE5hdmlnYWJsZU1hcDxLLCBDb2xsZWN0aW9uPFY+PiBzdWJNYXAoSyBmcm9tS2V5LCBLIHRvS2V5KSB7CisgICAgICAgICAgICByZXR1cm4gc3ViTWFwKGZyb21LZXksIHRydWUsIHRvS2V5LCBmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE5hdmlnYWJsZU1hcDxLLCBDb2xsZWN0aW9uPFY+PiBzdWJNYXAoCisgICAgICAgICAgICAgICAgSyBmcm9tS2V5LCBib29sZWFuIGZyb21JbmNsdXNpdmUsIEsgdG9LZXksIGJvb2xlYW4gdG9JbmNsdXNpdmUpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTmF2aWdhYmxlQXNNYXAoc29ydGVkTWFwKCkuc3ViTWFwKGZyb21LZXksIGZyb21JbmNsdXNpdmUsIHRvS2V5LCB0b0luY2x1c2l2ZSkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBOYXZpZ2FibGVNYXA8SywgQ29sbGVjdGlvbjxWPj4gaGVhZE1hcChLIHRvS2V5KSB7CisgICAgICAgICAgICByZXR1cm4gaGVhZE1hcCh0b0tleSwgZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBOYXZpZ2FibGVNYXA8SywgQ29sbGVjdGlvbjxWPj4gaGVhZE1hcChLIHRvS2V5LCBib29sZWFuIGluY2x1c2l2ZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBOYXZpZ2FibGVBc01hcChzb3J0ZWRNYXAoKS5oZWFkTWFwKHRvS2V5LCBpbmNsdXNpdmUpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTmF2aWdhYmxlTWFwPEssIENvbGxlY3Rpb248Vj4+IHRhaWxNYXAoSyBmcm9tS2V5KSB7CisgICAgICAgICAgICByZXR1cm4gdGFpbE1hcChmcm9tS2V5LCB0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTmF2aWdhYmxlTWFwPEssIENvbGxlY3Rpb248Vj4+IHRhaWxNYXAoSyBmcm9tS2V5LCBib29sZWFuIGluY2x1c2l2ZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBOYXZpZ2FibGVBc01hcChzb3J0ZWRNYXAoKS50YWlsTWFwKGZyb21LZXksIGluY2x1c2l2ZSkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9BYnN0cmFjdE1hcEVudHJ5LmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL0Fic3RyYWN0TWFwRW50cnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODFhNGQyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9BYnN0cmFjdE1hcEVudHJ5LmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgR3VhdmEgQXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YTsKKworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIHtAY29kZSBlcXVhbHN9LCB7QGNvZGUgaGFzaENvZGV9LCBhbmQge0Bjb2RlIHRvU3RyaW5nfQorICogbWV0aG9kcyBvZiB7QGNvZGUgRW50cnl9LgorICoKKyAqIEBhdXRob3IgSmFyZWQgTGV2eQorICovCithYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1hcEVudHJ5PEssIFY+IGltcGxlbWVudHMgRW50cnk8SywgVj4geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGFic3RyYWN0IEsgZ2V0S2V5KCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYWJzdHJhY3QgViBnZXRWYWx1ZSgpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFYgc2V0VmFsdWUoViB2YWx1ZSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgeworICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgRW50cnkpIHsKKyAgICAgICAgICAgIEVudHJ5PD8sID8+IHRoYXQgPSAoRW50cnk8PywgPz4pIG9iamVjdDsKKyAgICAgICAgICAgIHJldHVybiBPYmplY3RzLmVxdWFscyh0aGlzLmdldEtleSgpLCB0aGF0LmdldEtleSgpKQorICAgICAgICAgICAgICAgICAgICAmJiBPYmplY3RzLmVxdWFscyh0aGlzLmdldFZhbHVlKCksIHRoYXQuZ2V0VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIEsgayA9IGdldEtleSgpOworICAgICAgICBWIHYgPSBnZXRWYWx1ZSgpOworICAgICAgICByZXR1cm4gKChrID09IG51bGwpID8gMCA6IGsuaGFzaENvZGUoKSkgXiAoKHYgPT0gbnVsbCkgPyAwIDogdi5oYXNoQ29kZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmb3JtIHtAY29kZSB7a2V5fT17dmFsdWV9fS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gZ2V0S2V5KCkgKyAiPSIgKyBnZXRWYWx1ZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvQWJzdHJhY3RNdWx0aW1hcC5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9BYnN0cmFjdE11bHRpbWFwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcyNDRmZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvQWJzdHJhY3RNdWx0aW1hcC5qYXZhCkBAIC0wLDAgKzEsMjA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBHdWF2YSBBdXRob3JzCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhOworCitpbXBvcnQgamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmEuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CisKKy8qKgorICogQSBza2VsZXRvbiB7QGNvZGUgTXVsdGltYXB9IGltcGxlbWVudGF0aW9uLCBub3QgbmVjZXNzYXJpbHkgaW4gdGVybXMgb2YgYSB7QGNvZGUgTWFwfS4KKyAqCisgKiBAYXV0aG9yIExvdWlzIFdhc3Nlcm1hbgorICovCithYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE11bHRpbWFwPEssIFY+IGltcGxlbWVudHMgTXVsdGltYXA8SywgVj4geworICAgIHByaXZhdGUgdHJhbnNpZW50IENvbGxlY3Rpb248RW50cnk8SywgVj4+IGVudHJpZXM7CisgICAgcHJpdmF0ZSB0cmFuc2llbnQgU2V0PEs+IGtleVNldDsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBDb2xsZWN0aW9uPFY+IHZhbHVlczsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBNYXA8SywgQ29sbGVjdGlvbjxWPj4gYXNNYXA7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgeworICAgICAgICBmb3IgKENvbGxlY3Rpb248Vj4gY29sbGVjdGlvbiA6IGFzTWFwKCkudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIGlmIChjb2xsZWN0aW9uLmNvbnRhaW5zKHZhbHVlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zRW50cnkoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIENvbGxlY3Rpb248Vj4gY29sbGVjdGlvbiA9IGFzTWFwKCkuZ2V0KGtleSk7CisgICAgICAgIHJldHVybiBjb2xsZWN0aW9uICE9IG51bGwgJiYgY29sbGVjdGlvbi5jb250YWlucyh2YWx1ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBrZXksIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBDb2xsZWN0aW9uPFY+IGNvbGxlY3Rpb24gPSBhc01hcCgpLmdldChrZXkpOworICAgICAgICByZXR1cm4gY29sbGVjdGlvbiAhPSBudWxsICYmIGNvbGxlY3Rpb24ucmVtb3ZlKHZhbHVlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBwdXQoSyBrZXksIFYgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIGdldChrZXkpLmFkZCh2YWx1ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gcHV0QWxsKEsga2V5LCBJdGVyYWJsZTw/IGV4dGVuZHMgVj4gdmFsdWVzKSB7CisgICAgICAgIGNoZWNrTm90TnVsbCh2YWx1ZXMpOworICAgICAgICAvLyBtYWtlIHN1cmUgd2Ugb25seSBjYWxsIHZhbHVlcy5pdGVyYXRvcigpIG9uY2UKKyAgICAgICAgLy8gYW5kIHdlIG9ubHkgY2FsbCBnZXQoa2V5KSBpZiB2YWx1ZXMgaXMgbm9uZW1wdHkKKyAgICAgICAgaWYgKHZhbHVlcyBpbnN0YW5jZW9mIENvbGxlY3Rpb24pIHsKKyAgICAgICAgICAgIENvbGxlY3Rpb248PyBleHRlbmRzIFY+IHZhbHVlQ29sbGVjdGlvbiA9IChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBWPikgdmFsdWVzOworICAgICAgICAgICAgcmV0dXJuICF2YWx1ZUNvbGxlY3Rpb24uaXNFbXB0eSgpICYmIGdldChrZXkpLmFkZEFsbCh2YWx1ZUNvbGxlY3Rpb24pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgSXRlcmF0b3I8PyBleHRlbmRzIFY+IHZhbHVlSXRyID0gdmFsdWVzLml0ZXJhdG9yKCk7CisgICAgICAgICAgICByZXR1cm4gdmFsdWVJdHIuaGFzTmV4dCgpICYmIEl0ZXJhdG9ycy5hZGRBbGwoZ2V0KGtleSksIHZhbHVlSXRyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb2xsZWN0aW9uPEVudHJ5PEssIFY+PiBlbnRyaWVzKCkgeworICAgICAgICBDb2xsZWN0aW9uPEVudHJ5PEssIFY+PiByZXN1bHQgPSBlbnRyaWVzOworICAgICAgICByZXR1cm4gKHJlc3VsdCA9PSBudWxsKSA/IGVudHJpZXMgPSBjcmVhdGVFbnRyaWVzKCkgOiByZXN1bHQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPEVudHJ5PEssIFY+PiBjcmVhdGVFbnRyaWVzKCkgeworICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIFNldE11bHRpbWFwKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEVudHJ5U2V0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEVudHJpZXMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGFic3RyYWN0IEl0ZXJhdG9yPEVudHJ5PEssIFY+PiBlbnRyeUl0ZXJhdG9yKCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PEs+IGtleVNldCgpIHsKKyAgICAgICAgU2V0PEs+IHJlc3VsdCA9IGtleVNldDsKKyAgICAgICAgcmV0dXJuIChyZXN1bHQgPT0gbnVsbCkgPyBrZXlTZXQgPSBjcmVhdGVLZXlTZXQoKSA6IHJlc3VsdDsKKyAgICB9CisKKyAgICBTZXQ8Sz4gY3JlYXRlS2V5U2V0KCkgeworICAgICAgICByZXR1cm4gbmV3IE1hcHMuS2V5U2V0PEssIENvbGxlY3Rpb248Vj4+KGFzTWFwKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb2xsZWN0aW9uPFY+IHZhbHVlcygpIHsKKyAgICAgICAgQ29sbGVjdGlvbjxWPiByZXN1bHQgPSB2YWx1ZXM7CisgICAgICAgIHJldHVybiAocmVzdWx0ID09IG51bGwpID8gdmFsdWVzID0gY3JlYXRlVmFsdWVzKCkgOiByZXN1bHQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPFY+IGNyZWF0ZVZhbHVlcygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZXMoKTsKKyAgICB9CisKKyAgICBJdGVyYXRvcjxWPiB2YWx1ZUl0ZXJhdG9yKCkgeworICAgICAgICByZXR1cm4gTWFwcy52YWx1ZUl0ZXJhdG9yKGVudHJpZXMoKS5pdGVyYXRvcigpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWFwPEssIENvbGxlY3Rpb248Vj4+IGFzTWFwKCkgeworICAgICAgICBNYXA8SywgQ29sbGVjdGlvbjxWPj4gcmVzdWx0ID0gYXNNYXA7CisgICAgICAgIHJldHVybiAocmVzdWx0ID09IG51bGwpID8gYXNNYXAgPSBjcmVhdGVBc01hcCgpIDogcmVzdWx0OworICAgIH0KKworICAgIGFic3RyYWN0IE1hcDxLLCBDb2xsZWN0aW9uPFY+PiBjcmVhdGVBc01hcCgpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKKyAgICAgICAgcmV0dXJuIE11bHRpbWFwcy5lcXVhbHNJbXBsKHRoaXMsIG9iamVjdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgaGFzaCBjb2RlIGZvciB0aGlzIG11bHRpbWFwLgorICAgICAqIDxwPgorICAgICAqIDxwPlRoZSBoYXNoIGNvZGUgb2YgYSBtdWx0aW1hcCBpcyBkZWZpbmVkIGFzIHRoZSBoYXNoIGNvZGUgb2YgdGhlIG1hcCB2aWV3LAorICAgICAqIGFzIHJldHVybmVkIGJ5IHtAbGluayBNdWx0aW1hcCNhc01hcH0uCisgICAgICoKKyAgICAgKiBAc2VlIE1hcCNoYXNoQ29kZQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIHJldHVybiBhc01hcCgpLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgbXVsdGltYXAsIGdlbmVyYXRlZCBieSBjYWxsaW5nCisgICAgICoge0Bjb2RlIHRvU3RyaW5nfSBvbiB0aGUgbWFwIHJldHVybmVkIGJ5IHtAbGluayBNdWx0aW1hcCNhc01hcH0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtdWx0aW1hcAorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBhc01hcCgpLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLy8gQ29tcGFyaXNvbiBhbmQgaGFzaGluZworCisgICAgcHJpdmF0ZSBjbGFzcyBFbnRyaWVzIGV4dGVuZHMgTXVsdGltYXBzLkVudHJpZXM8SywgVj4geworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgTXVsdGltYXA8SywgVj4gbXVsdGltYXAoKSB7CisgICAgICAgICAgICByZXR1cm4gQWJzdHJhY3RNdWx0aW1hcC50aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBJdGVyYXRvcjxFbnRyeTxLLCBWPj4gaXRlcmF0b3IoKSB7CisgICAgICAgICAgICByZXR1cm4gZW50cnlJdGVyYXRvcigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBFbnRyeVNldCBleHRlbmRzIEVudHJpZXMgaW1wbGVtZW50cyBTZXQ8RW50cnk8SywgVj4+IHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gU2V0cy5oYXNoQ29kZUltcGwodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgICAgIHJldHVybiBTZXRzLmVxdWFsc0ltcGwodGhpcywgb2JqKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgVmFsdWVzIGV4dGVuZHMgQWJzdHJhY3RDb2xsZWN0aW9uPFY+IHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBJdGVyYXRvcjxWPiBpdGVyYXRvcigpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZUl0ZXJhdG9yKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICAgICAgcmV0dXJuIEFic3RyYWN0TXVsdGltYXAudGhpcy5zaXplKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIHJldHVybiBBYnN0cmFjdE11bHRpbWFwLnRoaXMuY29udGFpbnNWYWx1ZShvKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgICAgIEFic3RyYWN0TXVsdGltYXAudGhpcy5jbGVhcigpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9BYnN0cmFjdFNlcXVlbnRpYWxJdGVyYXRvci5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9BYnN0cmFjdFNlcXVlbnRpYWxJdGVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZTJiMTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL0Fic3RyYWN0U2VxdWVudGlhbEl0ZXJhdG9yLmphdmEKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgR3VhdmEgQXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YTsKKworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworCisvKioKKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBza2VsZXRhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0Bjb2RlIEl0ZXJhdG9yfQorICogaW50ZXJmYWNlIGZvciBzZXF1ZW5jZXMgd2hvc2UgbmV4dCBlbGVtZW50IGNhbiBhbHdheXMgYmUgZGVyaXZlZCBmcm9tIHRoZQorICogcHJldmlvdXMgZWxlbWVudC4gTnVsbCBlbGVtZW50cyBhcmUgbm90IHN1cHBvcnRlZCwgbm9yIGlzIHRoZQorICoge0BsaW5rICNyZW1vdmUoKX0gbWV0aG9kLgorICogPHA+CisgKiA8cD5FeGFtcGxlOiA8cHJlPiAgIHtAY29kZQorICogPHA+CisgKiAgIEl0ZXJhdG9yPEludGVnZXI+IHBvd2Vyc09mVHdvID0KKyAqICAgICAgIG5ldyBBYnN0cmFjdFNlcXVlbnRpYWxJdGVyYXRvcjxJbnRlZ2VyPigxKSB7CisgKiAgICAgICAgIHByb3RlY3RlZCBJbnRlZ2VyIGNvbXB1dGVOZXh0KEludGVnZXIgcHJldmlvdXMpIHsKKyAqICAgICAgICAgICByZXR1cm4gKHByZXZpb3VzID09IDEgPDwgMzApID8gbnVsbCA6IHByZXZpb3VzICogMjsKKyAqICAgICAgICAgfQorICogICAgICAgfTt9PC9wcmU+CisgKgorICogQGF1dGhvciBDaHJpcyBQb3ZpcmsKKyAqIEBzaW5jZSAxMi4wIChpbiBHdWF2YSBhcyB7QGNvZGUgQWJzdHJhY3RMaW5rZWRJdGVyYXRvcn0gc2luY2UgOC4wKQorICovCithYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNlcXVlbnRpYWxJdGVyYXRvcjxUPgorICAgICAgICBleHRlbmRzIFVubW9kaWZpYWJsZUl0ZXJhdG9yPFQ+IHsKKyAgICBwcml2YXRlIFQgbmV4dE9yTnVsbDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgaXRlcmF0b3Igd2l0aCB0aGUgZ2l2ZW4gZmlyc3QgZWxlbWVudCwgb3IsIGlmIHtAY29kZQorICAgICAqIGZpcnN0T3JOdWxsfSBpcyBudWxsLCBjcmVhdGVzIGEgbmV3IGVtcHR5IGl0ZXJhdG9yLgorICAgICAqLworICAgIEFic3RyYWN0U2VxdWVudGlhbEl0ZXJhdG9yKFQgZmlyc3RPck51bGwpIHsKKyAgICAgICAgdGhpcy5uZXh0T3JOdWxsID0gZmlyc3RPck51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZWxlbWVudCB0aGF0IGZvbGxvd3Mge0Bjb2RlIHByZXZpb3VzfSwgb3IgcmV0dXJucyB7QGNvZGUgbnVsbH0KKyAgICAgKiBpZiBubyBlbGVtZW50cyByZW1haW4uIFRoaXMgbWV0aG9kIGlzIGludm9rZWQgZHVyaW5nIGVhY2ggY2FsbCB0bworICAgICAqIHtAbGluayAjbmV4dCgpfSBpbiBvcmRlciB0byBjb21wdXRlIHRoZSByZXN1bHQgb2YgYSA8aT5mdXR1cmU8L2k+IGNhbGwgdG8KKyAgICAgKiB7QGNvZGUgbmV4dCgpfS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgVCBjb21wdXRlTmV4dChUIHByZXZpb3VzKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgIHJldHVybiBuZXh0T3JOdWxsICE9IG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZpbmFsIFQgbmV4dCgpIHsKKyAgICAgICAgaWYgKCFoYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBuZXh0T3JOdWxsOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgbmV4dE9yTnVsbCA9IGNvbXB1dGVOZXh0KG5leHRPck51bGwpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9BYnN0cmFjdFNldE11bHRpbWFwLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL0Fic3RyYWN0U2V0TXVsdGltYXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjQ3NjI0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9BYnN0cmFjdFNldE11bHRpbWFwLmphdmEKQEAgLTAsMCArMSwxMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEd1YXZhIEF1dGhvcnMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIEJhc2ljIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgU2V0TXVsdGltYXB9IGludGVyZmFjZS4gSXQncyBhIHdyYXBwZXIKKyAqIGFyb3VuZCB7QGxpbmsgQWJzdHJhY3RNYXBCYXNlZE11bHRpbWFwfSB0aGF0IGNvbnZlcnRzIHRoZSByZXR1cm5lZCBjb2xsZWN0aW9ucyBpbnRvCisgKiB7QGNvZGUgU2V0c30uIFRoZSB7QGxpbmsgI2NyZWF0ZUNvbGxlY3Rpb259IG1ldGhvZCBtdXN0IHJldHVybiBhIHtAY29kZSBTZXR9LgorICoKKyAqIEBhdXRob3IgSmFyZWQgTGV2eQorICovCithYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNldE11bHRpbWFwPEssIFY+CisgICAgICAgIGV4dGVuZHMgQWJzdHJhY3RNYXBCYXNlZE11bHRpbWFwPEssIFY+IGltcGxlbWVudHMgU2V0TXVsdGltYXA8SywgVj4geworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDc0MzE2MjUyOTQ4Nzg0MTkxNjBMOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBtdWx0aW1hcCB0aGF0IHVzZXMgdGhlIHByb3ZpZGVkIG1hcC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXAgcGxhY2UgdG8gc3RvcmUgdGhlIG1hcHBpbmcgZnJvbSBlYWNoIGtleSB0byBpdHMgY29ycmVzcG9uZGluZworICAgICAqICAgICAgICAgICAgdmFsdWVzCisgICAgICovCisgICAgQWJzdHJhY3RTZXRNdWx0aW1hcChNYXA8SywgQ29sbGVjdGlvbjxWPj4gbWFwKSB7CisgICAgICAgIHN1cGVyKG1hcCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgYWJzdHJhY3QgU2V0PFY+IGNyZWF0ZUNvbGxlY3Rpb24oKTsKKworICAgIC8vIEZvbGxvd2luZyBKYXZhZG9jIGNvcGllZCBmcm9tIFNldE11bHRpbWFwLgorCisgICAgQE92ZXJyaWRlCisgICAgU2V0PFY+IGNyZWF0ZVVubW9kaWZpYWJsZUVtcHR5Q29sbGVjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqIDxwPgorICAgICAqIDxwPkJlY2F1c2UgYSB7QGNvZGUgU2V0TXVsdGltYXB9IGhhcyB1bmlxdWUgdmFsdWVzIGZvciBhIGdpdmVuIGtleSwgdGhpcworICAgICAqIG1ldGhvZCByZXR1cm5zIGEge0BsaW5rIFNldH0sIGluc3RlYWQgb2YgdGhlIHtAbGluayBDb2xsZWN0aW9ufSBzcGVjaWZpZWQKKyAgICAgKiBpbiB0aGUge0BsaW5rIE11bHRpbWFwfSBpbnRlcmZhY2UuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxWPiBnZXQoSyBrZXkpIHsKKyAgICAgICAgcmV0dXJuIChTZXQ8Vj4pIHN1cGVyLmdldChrZXkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5CZWNhdXNlIGEge0Bjb2RlIFNldE11bHRpbWFwfSBoYXMgdW5pcXVlIHZhbHVlcyBmb3IgYSBnaXZlbiBrZXksIHRoaXMKKyAgICAgKiBtZXRob2QgcmV0dXJucyBhIHtAbGluayBTZXR9LCBpbnN0ZWFkIG9mIHRoZSB7QGxpbmsgQ29sbGVjdGlvbn0gc3BlY2lmaWVkCisgICAgICogaW4gdGhlIHtAbGluayBNdWx0aW1hcH0gaW50ZXJmYWNlLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8TWFwLkVudHJ5PEssIFY+PiBlbnRyaWVzKCkgeworICAgICAgICByZXR1cm4gKFNldDxNYXAuRW50cnk8SywgVj4+KSBzdXBlci5lbnRyaWVzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqIDxwPgorICAgICAqIDxwPkJlY2F1c2UgYSB7QGNvZGUgU2V0TXVsdGltYXB9IGhhcyB1bmlxdWUgdmFsdWVzIGZvciBhIGdpdmVuIGtleSwgdGhpcworICAgICAqIG1ldGhvZCByZXR1cm5zIGEge0BsaW5rIFNldH0sIGluc3RlYWQgb2YgdGhlIHtAbGluayBDb2xsZWN0aW9ufSBzcGVjaWZpZWQKKyAgICAgKiBpbiB0aGUge0BsaW5rIE11bHRpbWFwfSBpbnRlcmZhY2UuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxWPiByZW1vdmVBbGwoT2JqZWN0IGtleSkgeworICAgICAgICByZXR1cm4gKFNldDxWPikgc3VwZXIucmVtb3ZlQWxsKGtleSk7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqIDxwPgorICAgICAqIDxwPlRob3VnaCB0aGUgbWV0aG9kIHNpZ25hdHVyZSBkb2Vzbid0IHNheSBzbyBleHBsaWNpdGx5LCB0aGUgcmV0dXJuZWQgbWFwCisgICAgICogaGFzIHtAbGluayBTZXR9IHZhbHVlcy4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWFwPEssIENvbGxlY3Rpb248Vj4+IGFzTWFwKCkgeworICAgICAgICByZXR1cm4gc3VwZXIuYXNNYXAoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9yZXMgYSBrZXktdmFsdWUgcGFpciBpbiB0aGUgbXVsdGltYXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5ICAga2V5IHRvIHN0b3JlIGluIHRoZSBtdWx0aW1hcAorICAgICAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSB0byBzdG9yZSBpbiB0aGUgbXVsdGltYXAKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgbWV0aG9kIGluY3JlYXNlZCB0aGUgc2l6ZSBvZiB0aGUgbXVsdGltYXAsIG9yCisgICAgICoge0Bjb2RlIGZhbHNlfSBpZiB0aGUgbXVsdGltYXAgYWxyZWFkeSBjb250YWluZWQgdGhlIGtleS12YWx1ZSBwYWlyCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gcHV0KEsga2V5LCBWIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBzdXBlci5wdXQoa2V5LCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gdGhpcyBtdWx0aW1hcCBmb3IgZXF1YWxpdHkuCisgICAgICogPHA+CisgICAgICogPHA+VHdvIHtAY29kZSBTZXRNdWx0aW1hcH0gaW5zdGFuY2VzIGFyZSBlcXVhbCBpZiwgZm9yIGVhY2gga2V5LCB0aGV5CisgICAgICogY29udGFpbiB0aGUgc2FtZSB2YWx1ZXMuIEVxdWFsaXR5IGRvZXMgbm90IGRlcGVuZCBvbiB0aGUgb3JkZXJpbmcgb2Yga2V5cworICAgICAqIG9yIHZhbHVlcy4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgeworICAgICAgICByZXR1cm4gc3VwZXIuZXF1YWxzKG9iamVjdCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9BYnN0cmFjdFNvcnRlZEtleVNvcnRlZFNldE11bHRpbWFwLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL0Fic3RyYWN0U29ydGVkS2V5U29ydGVkU2V0TXVsdGltYXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MTNlZDA3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9BYnN0cmFjdFNvcnRlZEtleVNvcnRlZFNldE11bHRpbWFwLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgR3VhdmEgQXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YTsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRNYXA7CitpbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKKworLyoqCisgKiBCYXNpYyBpbXBsZW1lbnRhdGlvbiBvZiBhIHtAbGluayBTb3J0ZWRTZXRNdWx0aW1hcH0gd2l0aCBhIHNvcnRlZCBrZXkgc2V0LgorICogPHA+CisgKiBUaGlzIHN1cGVyY2xhc3MgYWxsb3dzIHtAY29kZSBUcmVlTXVsdGltYXB9IHRvIG92ZXJyaWRlIG1ldGhvZHMgdG8gcmV0dXJuCisgKiBuYXZpZ2FibGUgc2V0IGFuZCBtYXAgdHlwZXMgaW4gbm9uLUdXVCBvbmx5LCB3aGlsZSBHV1QgY29kZSB3aWxsIGluaGVyaXQgdGhlCisgKiBTb3J0ZWRNYXAvU29ydGVkU2V0IG92ZXJyaWRlcy4KKyAqCisgKiBAYXV0aG9yIExvdWlzIFdhc3Nlcm1hbgorICovCithYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNvcnRlZEtleVNvcnRlZFNldE11bHRpbWFwPEssIFY+IGV4dGVuZHMgQWJzdHJhY3RTb3J0ZWRTZXRNdWx0aW1hcDxLLCBWPiB7CisKKyAgICBBYnN0cmFjdFNvcnRlZEtleVNvcnRlZFNldE11bHRpbWFwKFNvcnRlZE1hcDxLLCBDb2xsZWN0aW9uPFY+PiBtYXApIHsKKyAgICAgICAgc3VwZXIobWFwKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU29ydGVkTWFwPEssIENvbGxlY3Rpb248Vj4+IGFzTWFwKCkgeworICAgICAgICByZXR1cm4gKFNvcnRlZE1hcDxLLCBDb2xsZWN0aW9uPFY+Pikgc3VwZXIuYXNNYXAoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBTb3J0ZWRNYXA8SywgQ29sbGVjdGlvbjxWPj4gYmFja2luZ01hcCgpIHsKKyAgICAgICAgcmV0dXJuIChTb3J0ZWRNYXA8SywgQ29sbGVjdGlvbjxWPj4pIHN1cGVyLmJhY2tpbmdNYXAoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU29ydGVkU2V0PEs+IGtleVNldCgpIHsKKyAgICAgICAgcmV0dXJuIChTb3J0ZWRTZXQ8Sz4pIHN1cGVyLmtleVNldCgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9BYnN0cmFjdFNvcnRlZFNldE11bHRpbWFwLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL0Fic3RyYWN0U29ydGVkU2V0TXVsdGltYXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTU0N2U1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9BYnN0cmFjdFNvcnRlZFNldE11bHRpbWFwLmphdmEKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEd1YXZhIEF1dGhvcnMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OworCisvKioKKyAqIEJhc2ljIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgU29ydGVkU2V0TXVsdGltYXB9IGludGVyZmFjZS4gSXQncyBhCisgKiB3cmFwcGVyIGFyb3VuZCB7QGxpbmsgQWJzdHJhY3RNYXBCYXNlZE11bHRpbWFwfSB0aGF0IGNvbnZlcnRzIHRoZSByZXR1cm5lZAorICogY29sbGVjdGlvbnMgaW50byBzb3J0ZWQgc2V0cy4gVGhlIHtAbGluayAjY3JlYXRlQ29sbGVjdGlvbn0gbWV0aG9kCisgKiBtdXN0IHJldHVybiBhIHtAY29kZSBTb3J0ZWRTZXR9LgorICoKKyAqIEBhdXRob3IgSmFyZWQgTGV2eQorICovCithYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNvcnRlZFNldE11bHRpbWFwPEssIFY+CisgICAgICAgIGV4dGVuZHMgQWJzdHJhY3RTZXRNdWx0aW1hcDxLLCBWPiBpbXBsZW1lbnRzIFNvcnRlZFNldE11bHRpbWFwPEssIFY+IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA0MzA4NDg1ODcxNzMzMTU3NDhMOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBtdWx0aW1hcCB0aGF0IHVzZXMgdGhlIHByb3ZpZGVkIG1hcC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXAgcGxhY2UgdG8gc3RvcmUgdGhlIG1hcHBpbmcgZnJvbSBlYWNoIGtleSB0byBpdHMgY29ycmVzcG9uZGluZworICAgICAqICAgICAgICAgICAgdmFsdWVzCisgICAgICovCisgICAgQWJzdHJhY3RTb3J0ZWRTZXRNdWx0aW1hcChNYXA8SywgQ29sbGVjdGlvbjxWPj4gbWFwKSB7CisgICAgICAgIHN1cGVyKG1hcCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgYWJzdHJhY3QgU29ydGVkU2V0PFY+IGNyZWF0ZUNvbGxlY3Rpb24oKTsKKworICAgIEBPdmVycmlkZQorICAgIFNvcnRlZFNldDxWPiBjcmVhdGVVbm1vZGlmaWFibGVFbXB0eUNvbGxlY3Rpb24oKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTb3J0ZWRTZXQoY3JlYXRlQ29sbGVjdGlvbigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgY29sbGVjdGlvbiB2aWV3IG9mIGFsbCB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIGEga2V5LiBJZiBubworICAgICAqIG1hcHBpbmdzIGluIHRoZSBtdWx0aW1hcCBoYXZlIHRoZSBwcm92aWRlZCBrZXksIGFuIGVtcHR5IGNvbGxlY3Rpb24gaXMKKyAgICAgKiByZXR1cm5lZC4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5DaGFuZ2VzIHRvIHRoZSByZXR1cm5lZCBjb2xsZWN0aW9uIHdpbGwgdXBkYXRlIHRoZSB1bmRlcmx5aW5nIG11bHRpbWFwLAorICAgICAqIGFuZCB2aWNlIHZlcnNhLgorICAgICAqIDxwPgorICAgICAqIDxwPkJlY2F1c2UgYSB7QGNvZGUgU29ydGVkU2V0TXVsdGltYXB9IGhhcyB1bmlxdWUgc29ydGVkIHZhbHVlcyBmb3IgYSBnaXZlbgorICAgICAqIGtleSwgdGhpcyBtZXRob2QgcmV0dXJucyBhIHtAbGluayBTb3J0ZWRTZXR9LCBpbnN0ZWFkIG9mIHRoZQorICAgICAqIHtAbGluayBDb2xsZWN0aW9ufSBzcGVjaWZpZWQgaW4gdGhlIHtAbGluayBNdWx0aW1hcH0gaW50ZXJmYWNlLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTb3J0ZWRTZXQ8Vj4gZ2V0KEsga2V5KSB7CisgICAgICAgIHJldHVybiAoU29ydGVkU2V0PFY+KSBzdXBlci5nZXQoa2V5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGFsbCB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4ga2V5LiBUaGUgcmV0dXJuZWQgY29sbGVjdGlvbiBpcworICAgICAqIGltbXV0YWJsZS4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5CZWNhdXNlIGEge0Bjb2RlIFNvcnRlZFNldE11bHRpbWFwfSBoYXMgdW5pcXVlIHNvcnRlZCB2YWx1ZXMgZm9yIGEgZ2l2ZW4KKyAgICAgKiBrZXksIHRoaXMgbWV0aG9kIHJldHVybnMgYSB7QGxpbmsgU29ydGVkU2V0fSwgaW5zdGVhZCBvZiB0aGUKKyAgICAgKiB7QGxpbmsgQ29sbGVjdGlvbn0gc3BlY2lmaWVkIGluIHRoZSB7QGxpbmsgTXVsdGltYXB9IGludGVyZmFjZS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU29ydGVkU2V0PFY+IHJlbW92ZUFsbChPYmplY3Qga2V5KSB7CisgICAgICAgIHJldHVybiAoU29ydGVkU2V0PFY+KSBzdXBlci5yZW1vdmVBbGwoa2V5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbWFwIHZpZXcgdGhhdCBhc3NvY2lhdGVzIGVhY2gga2V5IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWVzCisgICAgICogaW4gdGhlIG11bHRpbWFwLiBDaGFuZ2VzIHRvIHRoZSByZXR1cm5lZCBtYXAsIHN1Y2ggYXMgZWxlbWVudCByZW1vdmFsLCB3aWxsCisgICAgICogdXBkYXRlIHRoZSB1bmRlcmx5aW5nIG11bHRpbWFwLiBUaGUgbWFwIGRvZXMgbm90IHN1cHBvcnQge0Bjb2RlIHNldFZhbHVlfQorICAgICAqIG9uIGl0cyBlbnRyaWVzLCB7QGNvZGUgcHV0fSwgb3Ige0Bjb2RlIHB1dEFsbH0uCisgICAgICogPHA+CisgICAgICogPHA+V2hlbiBwYXNzZWQgYSBrZXkgdGhhdCBpcyBwcmVzZW50IGluIHRoZSBtYXAsIHtAY29kZQorICAgICAqIGFzTWFwKCkuZ2V0KE9iamVjdCl9IGhhcyB0aGUgc2FtZSBiZWhhdmlvciBhcyB7QGxpbmsgI2dldH0sIHJldHVybmluZyBhCisgICAgICogbGl2ZSBjb2xsZWN0aW9uLiBXaGVuIHBhc3NlZCBhIGtleSB0aGF0IGlzIG5vdCBwcmVzZW50LCBob3dldmVyLCB7QGNvZGUKKyAgICAgKiBhc01hcCgpLmdldChPYmplY3QpfSByZXR1cm5zIHtAY29kZSBudWxsfSBpbnN0ZWFkIG9mIGFuIGVtcHR5IGNvbGxlY3Rpb24uCisgICAgICogPHA+CisgICAgICogPHA+VGhvdWdoIHRoZSBtZXRob2Qgc2lnbmF0dXJlIGRvZXNuJ3Qgc2F5IHNvIGV4cGxpY2l0bHksIHRoZSByZXR1cm5lZCBtYXAKKyAgICAgKiBoYXMge0BsaW5rIFNvcnRlZFNldH0gdmFsdWVzLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNYXA8SywgQ29sbGVjdGlvbjxWPj4gYXNNYXAoKSB7CisgICAgICAgIHJldHVybiBzdXBlci5hc01hcCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKiA8cD4KKyAgICAgKiBDb25zZXF1ZW50bHksIHRoZSB2YWx1ZXMgZG8gbm90IGZvbGxvdyB0aGVpciBuYXR1cmFsIG9yZGVyaW5nIG9yIHRoZQorICAgICAqIG9yZGVyaW5nIG9mIHRoZSB2YWx1ZSBjb21wYXJhdG9yLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb2xsZWN0aW9uPFY+IHZhbHVlcygpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnZhbHVlcygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvQWJzdHJhY3RUYWJsZS5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9BYnN0cmFjdFRhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWEzZTVhYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvQWJzdHJhY3RUYWJsZS5qYXZhCkBAIC0wLDAgKzEsMTY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBHdWF2YSBBdXRob3JzCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0CisgKiBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UKKyAqIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YTsKKworaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIFNrZWxldGFsLCBpbXBsZW1lbnRhdGlvbi1hZ25vc3RpYyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIFRhYmxlfSBpbnRlcmZhY2UuCisgKgorICogQGF1dGhvciBMb3VpcyBXYXNzZXJtYW4KKyAqLworYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RUYWJsZTxSLCBDLCBWPiBpbXBsZW1lbnRzIFRhYmxlPFIsIEMsIFY+IHsKKworICAgIHByaXZhdGUgdHJhbnNpZW50IFNldDxDZWxsPFIsIEMsIFY+PiBjZWxsU2V0OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNSb3coT2JqZWN0IHJvd0tleSkgeworICAgICAgICByZXR1cm4gTWFwcy5zYWZlQ29udGFpbnNLZXkocm93TWFwKCksIHJvd0tleSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNDb2x1bW4oT2JqZWN0IGNvbHVtbktleSkgeworICAgICAgICByZXR1cm4gTWFwcy5zYWZlQ29udGFpbnNLZXkoY29sdW1uTWFwKCksIGNvbHVtbktleSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxSPiByb3dLZXlTZXQoKSB7CisgICAgICAgIHJldHVybiByb3dNYXAoKS5rZXlTZXQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PEM+IGNvbHVtbktleVNldCgpIHsKKyAgICAgICAgcmV0dXJuIGNvbHVtbk1hcCgpLmtleVNldCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmFsdWUoT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIGZvciAoTWFwPEMsIFY+IHJvdyA6IHJvd01hcCgpLnZhbHVlcygpKSB7CisgICAgICAgICAgICBpZiAocm93LmNvbnRhaW5zVmFsdWUodmFsdWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCByb3dLZXksIE9iamVjdCBjb2x1bW5LZXkpIHsKKyAgICAgICAgTWFwPEMsIFY+IHJvdyA9IE1hcHMuc2FmZUdldChyb3dNYXAoKSwgcm93S2V5KTsKKyAgICAgICAgcmV0dXJuIHJvdyAhPSBudWxsICYmIE1hcHMuc2FmZUNvbnRhaW5zS2V5KHJvdywgY29sdW1uS2V5KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgViBnZXQoT2JqZWN0IHJvd0tleSwgT2JqZWN0IGNvbHVtbktleSkgeworICAgICAgICBNYXA8QywgVj4gcm93ID0gTWFwcy5zYWZlR2V0KHJvd01hcCgpLCByb3dLZXkpOworICAgICAgICByZXR1cm4gKHJvdyA9PSBudWxsKSA/IG51bGwgOiBNYXBzLnNhZmVHZXQocm93LCBjb2x1bW5LZXkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICBJdGVyYXRvcnMuY2xlYXIoY2VsbFNldCgpLml0ZXJhdG9yKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBWIHJlbW92ZShPYmplY3Qgcm93S2V5LCBPYmplY3QgY29sdW1uS2V5KSB7CisgICAgICAgIE1hcDxDLCBWPiByb3cgPSBNYXBzLnNhZmVHZXQocm93TWFwKCksIHJvd0tleSk7CisgICAgICAgIHJldHVybiAocm93ID09IG51bGwpID8gbnVsbCA6IE1hcHMuc2FmZVJlbW92ZShyb3csIGNvbHVtbktleSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFYgcHV0KFIgcm93S2V5LCBDIGNvbHVtbktleSwgViB2YWx1ZSkgeworICAgICAgICByZXR1cm4gcm93KHJvd0tleSkucHV0KGNvbHVtbktleSwgdmFsdWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHB1dEFsbChUYWJsZTw/IGV4dGVuZHMgUiwgPyBleHRlbmRzIEMsID8gZXh0ZW5kcyBWPiB0YWJsZSkgeworICAgICAgICBmb3IgKENlbGw8PyBleHRlbmRzIFIsID8gZXh0ZW5kcyBDLCA/IGV4dGVuZHMgVj4gY2VsbCA6IHRhYmxlLmNlbGxTZXQoKSkgeworICAgICAgICAgICAgcHV0KGNlbGwuZ2V0Um93S2V5KCksIGNlbGwuZ2V0Q29sdW1uS2V5KCksIGNlbGwuZ2V0VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENlbGw8UiwgQywgVj4+IGNlbGxTZXQoKSB7CisgICAgICAgIFNldDxDZWxsPFIsIEMsIFY+PiByZXN1bHQgPSBjZWxsU2V0OworICAgICAgICByZXR1cm4gKHJlc3VsdCA9PSBudWxsKSA/IGNlbGxTZXQgPSBjcmVhdGVDZWxsU2V0KCkgOiByZXN1bHQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBTZXQ8Q2VsbDxSLCBDLCBWPj4gY3JlYXRlQ2VsbFNldCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDZWxsU2V0KCk7CisgICAgfQorCisgICAgYWJzdHJhY3QgSXRlcmF0b3I8Q2VsbDxSLCBDLCBWPj4gY2VsbEl0ZXJhdG9yKCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICByZXR1cm4gVGFibGVzLmVxdWFsc0ltcGwodGhpcywgb2JqKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gY2VsbFNldCgpLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIHtAY29kZSByb3dNYXAoKS50b1N0cmluZygpfS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gcm93TWFwKCkudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIENlbGxTZXQgZXh0ZW5kcyBBYnN0cmFjdFNldDxDZWxsPFIsIEMsIFY+PiB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgeworICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBDZWxsKSB7CisgICAgICAgICAgICAgICAgQ2VsbDw/LCA/LCA/PiBjZWxsID0gKENlbGw8PywgPywgPz4pIG87CisgICAgICAgICAgICAgICAgTWFwPEMsIFY+IHJvdyA9IE1hcHMuc2FmZUdldChyb3dNYXAoKSwgY2VsbC5nZXRSb3dLZXkoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJvdyAhPSBudWxsICYmIENvbGxlY3Rpb25zMi5zYWZlQ29udGFpbnMoCisgICAgICAgICAgICAgICAgICAgICAgICByb3cuZW50cnlTZXQoKSwgTWFwcy5pbW11dGFibGVFbnRyeShjZWxsLmdldENvbHVtbktleSgpLCBjZWxsLmdldFZhbHVlKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgQ2VsbCkgeworICAgICAgICAgICAgICAgIENlbGw8PywgPywgPz4gY2VsbCA9IChDZWxsPD8sID8sID8+KSBvOworICAgICAgICAgICAgICAgIE1hcDxDLCBWPiByb3cgPSBNYXBzLnNhZmVHZXQocm93TWFwKCksIGNlbGwuZ2V0Um93S2V5KCkpOworICAgICAgICAgICAgICAgIHJldHVybiByb3cgIT0gbnVsbCAmJiBDb2xsZWN0aW9uczIuc2FmZVJlbW92ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvdy5lbnRyeVNldCgpLCBNYXBzLmltbXV0YWJsZUVudHJ5KGNlbGwuZ2V0Q29sdW1uS2V5KCksIGNlbGwuZ2V0VmFsdWUoKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICAgICAgQWJzdHJhY3RUYWJsZS50aGlzLmNsZWFyKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEl0ZXJhdG9yPENlbGw8UiwgQywgVj4+IGl0ZXJhdG9yKCkgeworICAgICAgICAgICAgcmV0dXJuIGNlbGxJdGVyYXRvcigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBBYnN0cmFjdFRhYmxlLnRoaXMuc2l6ZSgpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL0FzeW5jRnVuY3Rpb24uamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvQXN5bmNGdW5jdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNmNlYWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL0FzeW5jRnVuY3Rpb24uamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBHdWF2YSBBdXRob3JzCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOworCisvKioKKyAqIFRyYW5zZm9ybXMgYSB2YWx1ZSwgcG9zc2libHkgYXN5bmNocm9ub3VzbHkuIEZvciBhbiBleGFtcGxlIHVzYWdlIGFuZCBtb3JlCisgKiBpbmZvcm1hdGlvbiwgc2VlIHtAbGluayBGdXR1cmVzI3RyYW5zZm9ybShMaXN0ZW5hYmxlRnV0dXJlLCBBc3luY0Z1bmN0aW9uKX0uCisgKgorICogQGF1dGhvciBDaHJpcyBQb3ZpcmsKKyAqIEBzaW5jZSAxMS4wCisgKi8KK2ludGVyZmFjZSBBc3luY0Z1bmN0aW9uPEksIE8+IHsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIG91dHB1dCB7QGNvZGUgRnV0dXJlfSB0byB1c2UgaW4gcGxhY2Ugb2YgdGhlIGdpdmVuIHtAY29kZQorICAgICAqIGlucHV0fS4gVGhlIG91dHB1dCB7QGNvZGUgRnV0dXJlfSBuZWVkIG5vdCBiZSB7QGxpbmtwbGFpbiBGdXR1cmUjaXNEb25lCisgICAgICogZG9uZX0sIG1ha2luZyB7QGNvZGUgQXN5bmNGdW5jdGlvbn0gc3VpdGFibGUgZm9yIGFzeW5jaHJvbm91cyBkZXJpdmF0aW9ucy4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5UaHJvd2luZyBhbiBleGNlcHRpb24gZnJvbSB0aGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvIHJldHVybmluZyBhCisgICAgICogZmFpbGluZyB7QGNvZGUgRnV0dXJlfS4KKyAgICAgKi8KKyAgICBMaXN0ZW5hYmxlRnV0dXJlPE8+IGFwcGx5KEkgaW5wdXQpOworfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9DYWNoZS5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9DYWNoZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNjBiMGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL0NhY2hlLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgR3VhdmEgQXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YTsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOworCisvKioKKyAqIEEgc2VtaS1wZXJzaXN0ZW50IG1hcHBpbmcgZnJvbSBrZXlzIHRvIHZhbHVlcy4gQ2FjaGUgZW50cmllcyBhcmUgbWFudWFsbHkgYWRkZWQgdXNpbmcKKyAqIHtAbGluayAjZ2V0KE9iamVjdCwgQ2FsbGFibGUpfSBvciB7QGxpbmsgI3B1dChPYmplY3QsIE9iamVjdCl9LCBhbmQgYXJlIHN0b3JlZCBpbiB0aGUgY2FjaGUgdW50aWwKKyAqIGVpdGhlciBldmljdGVkIG9yIG1hbnVhbGx5IGludmFsaWRhdGVkLgorICogPHA+CisgKiA8cD5JbXBsZW1lbnRhdGlvbnMgb2YgdGhpcyBpbnRlcmZhY2UgYXJlIGV4cGVjdGVkIHRvIGJlIHRocmVhZC1zYWZlLCBhbmQgY2FuIGJlIHNhZmVseSBhY2Nlc3NlZAorICogYnkgbXVsdGlwbGUgY29uY3VycmVudCB0aHJlYWRzLgorICogPHA+CisgKiA8cD5Ob3RlIHRoYXQgd2hpbGUgdGhpcyBjbGFzcyBpcyBzdGlsbCBhbm5vdGF0ZWQgYXMge0BsaW5rIEJldGF9LCB0aGUgQVBJIGlzIGZyb3plbiBmcm9tIGEKKyAqIGNvbnN1bWVyJ3Mgc3RhbmRwb2ludC4gSW4gb3RoZXIgd29yZHMgZXhpc3RpbmcgbWV0aG9kcyBhcmUgYWxsIGNvbnNpZGVyZWQge0Bjb2RlIG5vbi1CZXRhfSBhbmQKKyAqIHdvbid0IGJlIGNoYW5nZWQgd2l0aG91dCBnb2luZyB0aHJvdWdoIGFuIDE4IG1vbnRoIGRlcHJlY2F0aW9uIGN5Y2xlOyBob3dldmVyIG5ldyBtZXRob2RzIG1heSBiZQorICogYWRkZWQgYXQgYW55IHRpbWUuCisgKgorICogQGF1dGhvciBDaGFybGVzIEZyeQorICogQHNpbmNlIDEwLjAKKyAqLworcHVibGljIGludGVyZmFjZSBDYWNoZTxLLCBWPiB7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGgge0Bjb2RlIGtleX0gaW4gdGhpcyBjYWNoZSwgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZXJlIGlzIG5vCisgICAgICogY2FjaGVkIHZhbHVlIGZvciB7QGNvZGUga2V5fS4KKyAgICAgKgorICAgICAqIEBzaW5jZSAxMS4wCisgICAgICovCisgICAgViBnZXRJZlByZXNlbnQoT2JqZWN0IGtleSk7CisKKyAgICAvKioKKyAgICAgKiBBc3NvY2lhdGVzIHtAY29kZSB2YWx1ZX0gd2l0aCB7QGNvZGUga2V5fSBpbiB0aGlzIGNhY2hlLiBJZiB0aGUgY2FjaGUgcHJldmlvdXNseSBjb250YWluZWQgYQorICAgICAqIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB7QGNvZGUga2V5fSwgdGhlIG9sZCB2YWx1ZSBpcyByZXBsYWNlZCBieSB7QGNvZGUgdmFsdWV9LgorICAgICAqIDxwPgorICAgICAqIDxwPlByZWZlciB7QGxpbmsgI2dldChPYmplY3QsIENhbGxhYmxlKX0gd2hlbiB1c2luZyB0aGUgY29udmVudGlvbmFsICJpZiBjYWNoZWQsIHJldHVybjsKKyAgICAgKiBvdGhlcndpc2UgY3JlYXRlLCBjYWNoZSBhbmQgcmV0dXJuIiBwYXR0ZXJuLgorICAgICAqCisgICAgICogQHNpbmNlIDExLjAKKyAgICAgKi8KKyAgICB2b2lkIHB1dChLIGtleSwgViB2YWx1ZSk7CisKK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvQ2FjaGVCdWlsZGVyLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL0NhY2hlQnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYjU2N2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL0NhY2hlQnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsMzAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBHdWF2YSBBdXRob3JzCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhOworCitpbXBvcnQgamF2YS5sYW5nLnJlZi5Tb2Z0UmVmZXJlbmNlOworaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmEuUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50OworaW1wb3J0IHN0YXRpYyBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YS5QcmVjb25kaXRpb25zLmNoZWNrU3RhdGU7CisKKy8qKgorICogPHA+QSBidWlsZGVyIG9mIHtAbGluayBMb2FkaW5nQ2FjaGV9IGFuZCB7QGxpbmsgQ2FjaGV9IGluc3RhbmNlcyBoYXZpbmcgYW55IGNvbWJpbmF0aW9uIG9mIHRoZQorICogZm9sbG93aW5nIGZlYXR1cmVzOgorICogPHA+CisgKiA8dWw+CisgKiA8bGk+YXV0b21hdGljIGxvYWRpbmcgb2YgZW50cmllcyBpbnRvIHRoZSBjYWNoZQorICogPGxpPmxlYXN0LXJlY2VudGx5LXVzZWQgZXZpY3Rpb24gd2hlbiBhIG1heGltdW0gc2l6ZSBpcyBleGNlZWRlZAorICogPGxpPnRpbWUtYmFzZWQgZXhwaXJhdGlvbiBvZiBlbnRyaWVzLCBtZWFzdXJlZCBzaW5jZSBsYXN0IGFjY2VzcyBvciBsYXN0IHdyaXRlCisgKiA8bGk+a2V5cyBhdXRvbWF0aWNhbGx5IHdyYXBwZWQgaW4ge0BsaW5rcGxhaW4gV2Vha1JlZmVyZW5jZSB3ZWFrfSByZWZlcmVuY2VzCisgKiA8bGk+dmFsdWVzIGF1dG9tYXRpY2FsbHkgd3JhcHBlZCBpbiB7QGxpbmtwbGFpbiBXZWFrUmVmZXJlbmNlIHdlYWt9IG9yCisgKiB7QGxpbmtwbGFpbiBTb2Z0UmVmZXJlbmNlIHNvZnR9IHJlZmVyZW5jZXMKKyAqIDxsaT5ub3RpZmljYXRpb24gb2YgZXZpY3RlZCAob3Igb3RoZXJ3aXNlIHJlbW92ZWQpIGVudHJpZXMKKyAqIDxsaT5hY2N1bXVsYXRpb24gb2YgY2FjaGUgYWNjZXNzIHN0YXRpc3RpY3MKKyAqIDwvdWw+CisgKiA8cD4KKyAqIDxwPlRoZXNlIGZlYXR1cmVzIGFyZSBhbGwgb3B0aW9uYWw7IGNhY2hlcyBjYW4gYmUgY3JlYXRlZCB1c2luZyBhbGwgb3Igbm9uZSBvZiB0aGVtLiBCeSBkZWZhdWx0CisgKiBjYWNoZSBpbnN0YW5jZXMgY3JlYXRlZCBieSB7QGNvZGUgQ2FjaGVCdWlsZGVyfSB3aWxsIG5vdCBwZXJmb3JtIGFueSB0eXBlIG9mIGV2aWN0aW9uLgorICogPHA+CisgKiA8cD5Vc2FnZSBleGFtcGxlOiA8cHJlPiAgIHtAY29kZQorICogPHA+CisgKiAgIExvYWRpbmdDYWNoZTxLZXksIEdyYXBoPiBncmFwaHMgPSBDYWNoZUJ1aWxkZXIubmV3QnVpbGRlcigpCisgKiAgICAgICAubWF4aW11bVNpemUoMTAwMDApCisgKiAgICAgICAuZXhwaXJlQWZ0ZXJXcml0ZSgxMCwgVGltZVVuaXQuTUlOVVRFUykKKyAqICAgICAgIC5yZW1vdmFsTGlzdGVuZXIoTVlfTElTVEVORVIpCisgKiAgICAgICAuYnVpbGQoCisgKiAgICAgICAgICAgbmV3IENhY2hlTG9hZGVyPEtleSwgR3JhcGg+KCkgeworICogICAgICAgICAgICAgcHVibGljIEdyYXBoIGxvYWQoS2V5IGtleSkgdGhyb3dzIEFueUV4Y2VwdGlvbiB7CisgKiAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVFeHBlbnNpdmVHcmFwaChrZXkpOworICogICAgICAgICAgICAgfQorICogICAgICAgICAgIH0pO308L3ByZT4KKyAqIDxwPgorICogPHA+T3IgZXF1aXZhbGVudGx5LCA8cHJlPiAgIHtAY29kZQorICogPHA+CisgKiAgIC8vIEluIHJlYWwgbGlmZSB0aGlzIHdvdWxkIGNvbWUgZnJvbSBhIGNvbW1hbmQtbGluZSBmbGFnIG9yIGNvbmZpZyBmaWxlCisgKiAgIFN0cmluZyBzcGVjID0gIm1heGltdW1TaXplPTEwMDAwLGV4cGlyZUFmdGVyV3JpdGU9MTBtIjsKKyAqIDxwPgorICogICBMb2FkaW5nQ2FjaGU8S2V5LCBHcmFwaD4gZ3JhcGhzID0gQ2FjaGVCdWlsZGVyLmZyb20oc3BlYykKKyAqICAgICAgIC5yZW1vdmFsTGlzdGVuZXIoTVlfTElTVEVORVIpCisgKiAgICAgICAuYnVpbGQoCisgKiAgICAgICAgICAgbmV3IENhY2hlTG9hZGVyPEtleSwgR3JhcGg+KCkgeworICogICAgICAgICAgICAgcHVibGljIEdyYXBoIGxvYWQoS2V5IGtleSkgdGhyb3dzIEFueUV4Y2VwdGlvbiB7CisgKiAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVFeHBlbnNpdmVHcmFwaChrZXkpOworICogICAgICAgICAgICAgfQorICogICAgICAgICAgIH0pO308L3ByZT4KKyAqIDxwPgorICogPHA+VGhlIHJldHVybmVkIGNhY2hlIGlzIGltcGxlbWVudGVkIGFzIGEgaGFzaCB0YWJsZSB3aXRoIHNpbWlsYXIgcGVyZm9ybWFuY2UgY2hhcmFjdGVyaXN0aWNzIHRvCisgKiB7QGxpbmsgQ29uY3VycmVudEhhc2hNYXB9LiBJdCBpbXBsZW1lbnRzIGFsbCBvcHRpb25hbCBvcGVyYXRpb25zIG9mIHRoZSB7QGxpbmsgTG9hZGluZ0NhY2hlfSBhbmQKKyAqIHtAbGluayBDYWNoZX0gaW50ZXJmYWNlcy4gVGhlIHtAY29kZSBhc01hcH0gdmlldyAoYW5kIGl0cyBjb2xsZWN0aW9uIHZpZXdzKSBoYXZlIDxpPndlYWtseQorICogY29uc2lzdGVudCBpdGVyYXRvcnM8L2k+LiBUaGlzIG1lYW5zIHRoYXQgdGhleSBhcmUgc2FmZSBmb3IgY29uY3VycmVudCB1c2UsIGJ1dCBpZiBvdGhlciB0aHJlYWRzCisgKiBtb2RpZnkgdGhlIGNhY2hlIGFmdGVyIHRoZSBpdGVyYXRvciBpcyBjcmVhdGVkLCBpdCBpcyB1bmRlZmluZWQgd2hpY2ggb2YgdGhlc2UgY2hhbmdlcywgaWYgYW55LAorICogYXJlIHJlZmxlY3RlZCBpbiB0aGF0IGl0ZXJhdG9yLiBUaGVzZSBpdGVyYXRvcnMgbmV2ZXIgdGhyb3cge0BsaW5rCisgKiBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9ufS4KKyAqIDxwPgorICogPHA+PGI+Tm90ZTo8L2I+IGJ5IGRlZmF1bHQsIHRoZSByZXR1cm5lZCBjYWNoZSB1c2VzIGVxdWFsaXR5IGNvbXBhcmlzb25zICh0aGUKKyAqIHtAbGluayBPYmplY3QjZXF1YWxzIGVxdWFsc30gbWV0aG9kKSB0byBkZXRlcm1pbmUgZXF1YWxpdHkgZm9yIGtleXMgb3IgdmFsdWVzLiBIb3dldmVyLCBpZgorICoge0BsaW5rICN3ZWFrS2V5c30gd2FzIHNwZWNpZmllZCwgdGhlIGNhY2hlIHVzZXMgaWRlbnRpdHkgKHtAY29kZSA9PX0pCisgKiBjb21wYXJpc29ucyBpbnN0ZWFkIGZvciBrZXlzLiBMaWtld2lzZSwgaWYge0BsaW5rICN3ZWFrVmFsdWVzfSBvciB7QGxpbmsgI3NvZnRWYWx1ZXN9IHdhcworICogc3BlY2lmaWVkLCB0aGUgY2FjaGUgdXNlcyBpZGVudGl0eSBjb21wYXJpc29ucyBmb3IgdmFsdWVzLgorICogPHA+CisgKiA8cD5FbnRyaWVzIGFyZSBhdXRvbWF0aWNhbGx5IGV2aWN0ZWQgZnJvbSB0aGUgY2FjaGUgd2hlbiBhbnkgb2YKKyAqIHtAbGlua3BsYWluICNtYXhpbXVtU2l6ZShsb25nKSBtYXhpbXVtU2l6ZX0sIHtAbGlua3BsYWluICNtYXhpbXVtV2VpZ2h0KGxvbmcpIG1heGltdW1XZWlnaHR9LAorICoge0BsaW5rcGxhaW4gI2V4cGlyZUFmdGVyV3JpdGUgZXhwaXJlQWZ0ZXJXcml0ZX0sCisgKiB7QGxpbmtwbGFpbiAjZXhwaXJlQWZ0ZXJBY2Nlc3MgZXhwaXJlQWZ0ZXJBY2Nlc3N9LCB7QGxpbmtwbGFpbiAjd2Vha0tleXMgd2Vha0tleXN9LAorICoge0BsaW5rcGxhaW4gI3dlYWtWYWx1ZXMgd2Vha1ZhbHVlc30sIG9yIHtAbGlua3BsYWluICNzb2Z0VmFsdWVzIHNvZnRWYWx1ZXN9IGFyZSByZXF1ZXN0ZWQuCisgKiA8cD4KKyAqIDxwPklmIHtAbGlua3BsYWluICNtYXhpbXVtU2l6ZShsb25nKSBtYXhpbXVtU2l6ZX0gb3IKKyAqIHtAbGlua3BsYWluICNtYXhpbXVtV2VpZ2h0KGxvbmcpIG1heGltdW1XZWlnaHR9IGlzIHJlcXVlc3RlZCBlbnRyaWVzIG1heSBiZSBldmljdGVkIG9uIGVhY2ggY2FjaGUKKyAqIG1vZGlmaWNhdGlvbi4KKyAqIDxwPgorICogPHA+SWYge0BsaW5rcGxhaW4gI2V4cGlyZUFmdGVyV3JpdGUgZXhwaXJlQWZ0ZXJXcml0ZX0gb3IKKyAqIHtAbGlua3BsYWluICNleHBpcmVBZnRlckFjY2VzcyBleHBpcmVBZnRlckFjY2Vzc30gaXMgcmVxdWVzdGVkIGVudHJpZXMgbWF5IGJlIGV2aWN0ZWQgb24gZWFjaAorICogY2FjaGUgbW9kaWZpY2F0aW9uLCBvbiBvY2Nhc2lvbmFsIGNhY2hlIGFjY2Vzc2VzLCBvciBvbiBjYWxscyB0byB7QGxpbmsgQ2FjaGUjY2xlYW5VcH0uIEV4cGlyZWQKKyAqIGVudHJpZXMgbWF5IGJlIGNvdW50ZWQgYnkge0BsaW5rIENhY2hlI3NpemV9LCBidXQgd2lsbCBuZXZlciBiZSB2aXNpYmxlIHRvIHJlYWQgb3Igd3JpdGUKKyAqIG9wZXJhdGlvbnMuCisgKiA8cD4KKyAqIDxwPklmIHtAbGlua3BsYWluICN3ZWFrS2V5cyB3ZWFrS2V5c30sIHtAbGlua3BsYWluICN3ZWFrVmFsdWVzIHdlYWtWYWx1ZXN9LCBvcgorICoge0BsaW5rcGxhaW4gI3NvZnRWYWx1ZXMgc29mdFZhbHVlc30gYXJlIHJlcXVlc3RlZCwgaXQgaXMgcG9zc2libGUgZm9yIGEga2V5IG9yIHZhbHVlIHByZXNlbnQgaW4KKyAqIHRoZSBjYWNoZSB0byBiZSByZWNsYWltZWQgYnkgdGhlIGdhcmJhZ2UgY29sbGVjdG9yLiBFbnRyaWVzIHdpdGggcmVjbGFpbWVkIGtleXMgb3IgdmFsdWVzIG1heSBiZQorICogcmVtb3ZlZCBmcm9tIHRoZSBjYWNoZSBvbiBlYWNoIGNhY2hlIG1vZGlmaWNhdGlvbiwgb24gb2NjYXNpb25hbCBjYWNoZSBhY2Nlc3Nlcywgb3Igb24gY2FsbHMgdG8KKyAqIHtAbGluayBDYWNoZSNjbGVhblVwfTsgc3VjaCBlbnRyaWVzIG1heSBiZSBjb3VudGVkIGluIHtAbGluayBDYWNoZSNzaXplfSwgYnV0IHdpbGwgbmV2ZXIgYmUKKyAqIHZpc2libGUgdG8gcmVhZCBvciB3cml0ZSBvcGVyYXRpb25zLgorICogPHA+CisgKiA8cD5DZXJ0YWluIGNhY2hlIGNvbmZpZ3VyYXRpb25zIHdpbGwgcmVzdWx0IGluIHRoZSBhY2NydWFsIG9mIHBlcmlvZGljIG1haW50ZW5hbmNlIHRhc2tzIHdoaWNoCisgKiB3aWxsIGJlIHBlcmZvcm1lZCBkdXJpbmcgd3JpdGUgb3BlcmF0aW9ucywgb3IgZHVyaW5nIG9jY2FzaW9uYWwgcmVhZCBvcGVyYXRpb25zIGluIHRoZSBhYnNlbmNlIG9mCisgKiB3cml0ZXMuIFRoZSB7QGxpbmsgQ2FjaGUjY2xlYW5VcH0gbWV0aG9kIG9mIHRoZSByZXR1cm5lZCBjYWNoZSB3aWxsIGFsc28gcGVyZm9ybSBtYWludGVuYW5jZSwgYnV0CisgKiBjYWxsaW5nIGl0IHNob3VsZCBub3QgYmUgbmVjZXNzYXJ5IHdpdGggYSBoaWdoIHRocm91Z2hwdXQgY2FjaGUuIE9ubHkgY2FjaGVzIGJ1aWx0IHdpdGgKKyAqIHtAbGlua3BsYWluICNyZW1vdmFsTGlzdGVuZXIgcmVtb3ZhbExpc3RlbmVyfSwge0BsaW5rcGxhaW4gI2V4cGlyZUFmdGVyV3JpdGUgZXhwaXJlQWZ0ZXJXcml0ZX0sCisgKiB7QGxpbmtwbGFpbiAjZXhwaXJlQWZ0ZXJBY2Nlc3MgZXhwaXJlQWZ0ZXJBY2Nlc3N9LCB7QGxpbmtwbGFpbiAjd2Vha0tleXMgd2Vha0tleXN9LAorICoge0BsaW5rcGxhaW4gI3dlYWtWYWx1ZXMgd2Vha1ZhbHVlc30sIG9yIHtAbGlua3BsYWluICNzb2Z0VmFsdWVzIHNvZnRWYWx1ZXN9IHBlcmZvcm0gcGVyaW9kaWMKKyAqIG1haW50ZW5hbmNlLgorICogPHA+CisgKiA8cD5UaGUgY2FjaGVzIHByb2R1Y2VkIGJ5IHtAY29kZSBDYWNoZUJ1aWxkZXJ9IGFyZSBzZXJpYWxpemFibGUsIGFuZCB0aGUgZGVzZXJpYWxpemVkIGNhY2hlcworICogcmV0YWluIGFsbCB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIG9mIHRoZSBvcmlnaW5hbCBjYWNoZS4gTm90ZSB0aGF0IHRoZSBzZXJpYWxpemVkIGZvcm0gZG9lcworICogPGk+bm90PC9pPiBpbmNsdWRlIGNhY2hlIGNvbnRlbnRzLCBidXQgb25seSBjb25maWd1cmF0aW9uLgorICogPHA+CisgKiA8cD5TZWUgdGhlIEd1YXZhIFVzZXIgR3VpZGUgYXJ0aWNsZSBvbiA8YSBocmVmPQorICogImh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9ndWF2YS1saWJyYXJpZXMvd2lraS9DYWNoZXNFeHBsYWluZWQiPmNhY2hpbmc8L2E+IGZvciBhIGhpZ2hlci1sZXZlbAorICogZXhwbGFuYXRpb24uCisgKgorICogQHBhcmFtIDxLPiB0aGUgYmFzZSBrZXkgdHlwZSBmb3IgYWxsIGNhY2hlcyBjcmVhdGVkIGJ5IHRoaXMgYnVpbGRlcgorICogQHBhcmFtIDxWPiB0aGUgYmFzZSB2YWx1ZSB0eXBlIGZvciBhbGwgY2FjaGVzIGNyZWF0ZWQgYnkgdGhpcyBidWlsZGVyCisgKiBAYXV0aG9yIENoYXJsZXMgRnJ5CisgKiBAYXV0aG9yIEtldmluIEJvdXJyaWxsaW9uCisgKiBAc2luY2UgMTAuMAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQ2FjaGVCdWlsZGVyPEssIFY+IHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVGlja2VyIE5VTExfVElDS0VSID0gbmV3IFRpY2tlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIHJlYWQoKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgIH07CisgICAgc3RhdGljIGZpbmFsIGludCBVTlNFVF9JTlQgPSAtMTsKKyAgICBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfSU5JVElBTF9DQVBBQ0lUWSA9IDE2OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0NPTkNVUlJFTkNZX0xFVkVMID0gNDsKKyAgICBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfRVhQSVJBVElPTl9OQU5PUyA9IDA7CisgICAgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1JFRlJFU0hfTkFOT1MgPSAwOworICAgIHByaXZhdGUgZmluYWwgaW50IGluaXRpYWxDYXBhY2l0eSA9IFVOU0VUX0lOVDsKKyAgICBwcml2YXRlIGZpbmFsIGludCBjb25jdXJyZW5jeUxldmVsID0gVU5TRVRfSU5UOworICAgIHByaXZhdGUgbG9uZyBtYXhpbXVtU2l6ZSA9IFVOU0VUX0lOVDsKKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgbWF4aW11bVdlaWdodCA9IFVOU0VUX0lOVDsKKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgZXhwaXJlQWZ0ZXJXcml0ZU5hbm9zID0gVU5TRVRfSU5UOworICAgIHByaXZhdGUgbG9uZyBleHBpcmVBZnRlckFjY2Vzc05hbm9zID0gVU5TRVRfSU5UOworICAgIHByaXZhdGUgZmluYWwgbG9uZyByZWZyZXNoTmFub3MgPSBVTlNFVF9JTlQ7CisKKyAgICAvLyBUT0RPKGZyeSk6IG1ha2UgY29uc3RydWN0b3IgcHJpdmF0ZSBhbmQgdXBkYXRlIHRlc3RzIHRvIHVzZSBuZXdCdWlsZGVyCisgICAgcHJpdmF0ZSBDYWNoZUJ1aWxkZXIoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgQ2FjaGVCdWlsZGVyfSBpbnN0YW5jZSB3aXRoIGRlZmF1bHQgc2V0dGluZ3MsIGluY2x1ZGluZyBzdHJvbmcga2V5cywKKyAgICAgKiBzdHJvbmcgdmFsdWVzLCBhbmQgbm8gYXV0b21hdGljIGV2aWN0aW9uIG9mIGFueSBraW5kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ2FjaGVCdWlsZGVyPE9iamVjdCwgT2JqZWN0PiBuZXdCdWlsZGVyKCkgeworICAgICAgICByZXR1cm4gbmV3IENhY2hlQnVpbGRlcjxPYmplY3QsIE9iamVjdD4oKTsKKyAgICB9CisKKyAgICBpbnQgZ2V0Q29uY3VycmVuY3lMZXZlbCgpIHsKKyAgICAgICAgcmV0dXJuIChjb25jdXJyZW5jeUxldmVsID09IFVOU0VUX0lOVCkgPyBERUZBVUxUX0NPTkNVUlJFTkNZX0xFVkVMIDogY29uY3VycmVuY3lMZXZlbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGVudHJpZXMgdGhlIGNhY2hlIG1heSBjb250YWluLiBOb3RlIHRoYXQgdGhlIGNhY2hlIDxiPm1heSBldmljdAorICAgICAqIGFuIGVudHJ5IGJlZm9yZSB0aGlzIGxpbWl0IGlzIGV4Y2VlZGVkPC9iPi4gQXMgdGhlIGNhY2hlIHNpemUgZ3Jvd3MgY2xvc2UgdG8gdGhlIG1heGltdW0sIHRoZQorICAgICAqIGNhY2hlIGV2aWN0cyBlbnRyaWVzIHRoYXQgYXJlIGxlc3MgbGlrZWx5IHRvIGJlIHVzZWQgYWdhaW4uIEZvciBleGFtcGxlLCB0aGUgY2FjaGUgbWF5IGV2aWN0IGFuCisgICAgICogZW50cnkgYmVjYXVzZSBpdCBoYXNuJ3QgYmVlbiB1c2VkIHJlY2VudGx5IG9yIHZlcnkgb2Z0ZW4uCisgICAgICogPHA+CisgICAgICogPHA+V2hlbiB7QGNvZGUgc2l6ZX0gaXMgemVybywgZWxlbWVudHMgd2lsbCBiZSBldmljdGVkIGltbWVkaWF0ZWx5IGFmdGVyIGJlaW5nIGxvYWRlZCBpbnRvIHRoZQorICAgICAqIGNhY2hlLiBUaGlzIGNhbiBiZSB1c2VmdWwgaW4gdGVzdGluZywgb3IgdG8gZGlzYWJsZSBjYWNoaW5nIHRlbXBvcmFyaWx5IHdpdGhvdXQgYSBjb2RlIGNoYW5nZS4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5UaGlzIGZlYXR1cmUgY2Fubm90IGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB7QGxpbmsgI21heGltdW1XZWlnaHR9LgorICAgICAqCisgICAgICogQHBhcmFtIHNpemUgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY2FjaGUKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB7QGNvZGUgc2l6ZX0gaXMgbmVnYXRpdmUKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiAgICBpZiBhIG1heGltdW0gc2l6ZSBvciB3ZWlnaHQgd2FzIGFscmVhZHkgc2V0CisgICAgICovCisgICAgcHVibGljIENhY2hlQnVpbGRlcjxLLCBWPiBtYXhpbXVtU2l6ZShsb25nIHNpemUpIHsKKyAgICAgICAgY2hlY2tTdGF0ZSh0aGlzLm1heGltdW1TaXplID09IFVOU0VUX0lOVCwgIm1heGltdW0gc2l6ZSB3YXMgYWxyZWFkeSBzZXQgdG8gJXMiLAorICAgICAgICAgICAgICAgIHRoaXMubWF4aW11bVNpemUpOworICAgICAgICBjaGVja1N0YXRlKHRoaXMubWF4aW11bVdlaWdodCA9PSBVTlNFVF9JTlQsICJtYXhpbXVtIHdlaWdodCB3YXMgYWxyZWFkeSBzZXQgdG8gJXMiLAorICAgICAgICAgICAgICAgIHRoaXMubWF4aW11bVdlaWdodCk7CisgICAgICAgIGNoZWNrQXJndW1lbnQoc2l6ZSA+PSAwLCAibWF4aW11bSBzaXplIG11c3Qgbm90IGJlIG5lZ2F0aXZlIik7CisgICAgICAgIHRoaXMubWF4aW11bVNpemUgPSBzaXplOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgdGhhdCBlYWNoIGVudHJ5IHNob3VsZCBiZSBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUgb25jZSBhIGZpeGVkIGR1cmF0aW9uCisgICAgICogaGFzIGVsYXBzZWQgYWZ0ZXIgdGhlIGVudHJ5J3MgY3JlYXRpb24sIHRoZSBtb3N0IHJlY2VudCByZXBsYWNlbWVudCBvZiBpdHMgdmFsdWUsIG9yIGl0cyBsYXN0CisgICAgICogYWNjZXNzLiBBY2Nlc3MgdGltZSBpcyByZXNldCBieSBhbGwgY2FjaGUgcmVhZCBhbmQgd3JpdGUgb3BlcmF0aW9ucyAoaW5jbHVkaW5nCisgICAgICoge0Bjb2RlIENhY2hlLmFzTWFwKCkuZ2V0KE9iamVjdCl9IGFuZCB7QGNvZGUgQ2FjaGUuYXNNYXAoKS5wdXQoSywgVil9KSwgYnV0IG5vdCBieSBvcGVyYXRpb25zCisgICAgICogb24gdGhlIGNvbGxlY3Rpb24tdmlld3Mgb2Yge0BsaW5rIENhY2hlI2FzTWFwfS4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5XaGVuIHtAY29kZSBkdXJhdGlvbn0gaXMgemVybywgdGhpcyBtZXRob2QgaGFuZHMgb2ZmIHRvCisgICAgICoge0BsaW5rICNtYXhpbXVtU2l6ZShsb25nKSBtYXhpbXVtU2l6ZX17QGNvZGUgKDApfSwgaWdub3JpbmcgYW55IG90aGVyd2lzZS1zcGVjaWZpY2VkIG1heGltdW0KKyAgICAgKiBzaXplIG9yIHdlaWdodC4gVGhpcyBjYW4gYmUgdXNlZnVsIGluIHRlc3RpbmcsIG9yIHRvIGRpc2FibGUgY2FjaGluZyB0ZW1wb3JhcmlseSB3aXRob3V0IGEgY29kZQorICAgICAqIGNoYW5nZS4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5FeHBpcmVkIGVudHJpZXMgbWF5IGJlIGNvdW50ZWQgaW4ge0BsaW5rIENhY2hlI3NpemV9LCBidXQgd2lsbCBuZXZlciBiZSB2aXNpYmxlIHRvIHJlYWQgb3IKKyAgICAgKiB3cml0ZSBvcGVyYXRpb25zLiBFeHBpcmVkIGVudHJpZXMgYXJlIGNsZWFuZWQgdXAgYXMgcGFydCBvZiB0aGUgcm91dGluZSBtYWludGVuYW5jZSBkZXNjcmliZWQKKyAgICAgKiBpbiB0aGUgY2xhc3MgamF2YWRvYy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkdXJhdGlvbiB0aGUgbGVuZ3RoIG9mIHRpbWUgYWZ0ZXIgYW4gZW50cnkgaXMgbGFzdCBhY2Nlc3NlZCB0aGF0IGl0IHNob3VsZCBiZQorICAgICAqICAgICAgICAgICAgICAgICBhdXRvbWF0aWNhbGx5IHJlbW92ZWQKKyAgICAgKiBAcGFyYW0gdW5pdCAgICAgdGhlIHVuaXQgdGhhdCB7QGNvZGUgZHVyYXRpb259IGlzIGV4cHJlc3NlZCBpbgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHtAY29kZSBkdXJhdGlvbn0gaXMgbmVnYXRpdmUKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiAgICBpZiB0aGUgdGltZSB0byBpZGxlIG9yIHRpbWUgdG8gbGl2ZSB3YXMgYWxyZWFkeSBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2FjaGVCdWlsZGVyPEssIFY+IGV4cGlyZUFmdGVyQWNjZXNzKGxvbmcgZHVyYXRpb24sIFRpbWVVbml0IHVuaXQpIHsKKyAgICAgICAgY2hlY2tTdGF0ZShleHBpcmVBZnRlckFjY2Vzc05hbm9zID09IFVOU0VUX0lOVCwgImV4cGlyZUFmdGVyQWNjZXNzIHdhcyBhbHJlYWR5IHNldCB0byAlcyBucyIsCisgICAgICAgICAgICAgICAgZXhwaXJlQWZ0ZXJBY2Nlc3NOYW5vcyk7CisgICAgICAgIGNoZWNrQXJndW1lbnQoZHVyYXRpb24gPj0gMCwgImR1cmF0aW9uIGNhbm5vdCBiZSBuZWdhdGl2ZTogJXMgJXMiLCBkdXJhdGlvbiwgdW5pdCk7CisgICAgICAgIHRoaXMuZXhwaXJlQWZ0ZXJBY2Nlc3NOYW5vcyA9IHVuaXQudG9OYW5vcyhkdXJhdGlvbik7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIGxvbmcgZ2V0RXhwaXJlQWZ0ZXJBY2Nlc3NOYW5vcygpIHsKKyAgICAgICAgcmV0dXJuIChleHBpcmVBZnRlckFjY2Vzc05hbm9zID09IFVOU0VUX0lOVCkKKyAgICAgICAgICAgICAgICA/IERFRkFVTFRfRVhQSVJBVElPTl9OQU5PUyA6IGV4cGlyZUFmdGVyQWNjZXNzTmFub3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogQnVpbGRzIGEgY2FjaGUsIHdoaWNoIGVpdGhlciByZXR1cm5zIGFuIGFscmVhZHktbG9hZGVkIHZhbHVlIGZvciBhIGdpdmVuIGtleSBvciBhdG9taWNhbGx5CisgICAgICogY29tcHV0ZXMgb3IgcmV0cmlldmVzIGl0IHVzaW5nIHRoZSBzdXBwbGllZCB7QGNvZGUgQ2FjaGVMb2FkZXJ9LiBJZiBhbm90aGVyIHRocmVhZCBpcyBjdXJyZW50bHkKKyAgICAgKiBsb2FkaW5nIHRoZSB2YWx1ZSBmb3IgdGhpcyBrZXksIHNpbXBseSB3YWl0cyBmb3IgdGhhdCB0aHJlYWQgdG8gZmluaXNoIGFuZCByZXR1cm5zIGl0cworICAgICAqIGxvYWRlZCB2YWx1ZS4gTm90ZSB0aGF0IG11bHRpcGxlIHRocmVhZHMgY2FuIGNvbmN1cnJlbnRseSBsb2FkIHZhbHVlcyBmb3IgZGlzdGluY3Qga2V5cy4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5UaGlzIG1ldGhvZCBkb2VzIG5vdCBhbHRlciB0aGUgc3RhdGUgb2YgdGhpcyB7QGNvZGUgQ2FjaGVCdWlsZGVyfSBpbnN0YW5jZSwgc28gaXQgY2FuIGJlCisgICAgICogaW52b2tlZCBhZ2FpbiB0byBjcmVhdGUgbXVsdGlwbGUgaW5kZXBlbmRlbnQgY2FjaGVzLgorICAgICAqCisgICAgICogQHBhcmFtIGxvYWRlciB0aGUgY2FjaGUgbG9hZGVyIHVzZWQgdG8gb2J0YWluIG5ldyB2YWx1ZXMKKyAgICAgKiBAcmV0dXJuIGEgY2FjaGUgaGF2aW5nIHRoZSByZXF1ZXN0ZWQgZmVhdHVyZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgPEsxIGV4dGVuZHMgSywgVjEgZXh0ZW5kcyBWPiBMb2FkaW5nQ2FjaGU8SzEsIFYxPiBidWlsZCgKKyAgICAgICAgICAgIENhY2hlTG9hZGVyPD8gc3VwZXIgSzEsIFYxPiBsb2FkZXIpIHsKKyAgICAgICAgY2hlY2tXZWlnaHRXaXRoV2VpZ2hlcigpOworICAgICAgICByZXR1cm4gbmV3IExvY2FsQ2FjaGUuTG9jYWxMb2FkaW5nQ2FjaGU8SzEsIFYxPih0aGlzLCBsb2FkZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJ1aWxkcyBhIGNhY2hlIHdoaWNoIGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgbG9hZCB2YWx1ZXMgd2hlbiBrZXlzIGFyZSByZXF1ZXN0ZWQuCisgICAgICogPHA+CisgICAgICogPHA+Q29uc2lkZXIge0BsaW5rICNidWlsZChDYWNoZUxvYWRlcil9IGluc3RlYWQsIGlmIGl0IGlzIGZlYXNpYmxlIHRvIGltcGxlbWVudCBhCisgICAgICoge0Bjb2RlIENhY2hlTG9hZGVyfS4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5UaGlzIG1ldGhvZCBkb2VzIG5vdCBhbHRlciB0aGUgc3RhdGUgb2YgdGhpcyB7QGNvZGUgQ2FjaGVCdWlsZGVyfSBpbnN0YW5jZSwgc28gaXQgY2FuIGJlCisgICAgICogaW52b2tlZCBhZ2FpbiB0byBjcmVhdGUgbXVsdGlwbGUgaW5kZXBlbmRlbnQgY2FjaGVzLgorICAgICAqCisgICAgICogQHJldHVybiBhIGNhY2hlIGhhdmluZyB0aGUgcmVxdWVzdGVkIGZlYXR1cmVzCisgICAgICogQHNpbmNlIDExLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgPEsxIGV4dGVuZHMgSywgVjEgZXh0ZW5kcyBWPiBDYWNoZTxLMSwgVjE+IGJ1aWxkKCkgeworICAgICAgICBjaGVja1dlaWdodFdpdGhXZWlnaGVyKCk7CisgICAgICAgIGNoZWNrTm9uTG9hZGluZ0NhY2hlKCk7CisgICAgICAgIHJldHVybiBuZXcgTG9jYWxDYWNoZS5Mb2NhbE1hbnVhbENhY2hlPEsxLCBWMT4odGhpcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrTm9uTG9hZGluZ0NhY2hlKCkgeworICAgICAgICBjaGVja1N0YXRlKHJlZnJlc2hOYW5vcyA9PSBVTlNFVF9JTlQsICJyZWZyZXNoQWZ0ZXJXcml0ZSByZXF1aXJlcyBhIExvYWRpbmdDYWNoZSIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja1dlaWdodFdpdGhXZWlnaGVyKCkgeworICAgICAgICBjaGVja1N0YXRlKG1heGltdW1XZWlnaHQgPT0gVU5TRVRfSU5ULCAibWF4aW11bVdlaWdodCByZXF1aXJlcyB3ZWlnaGVyIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBmb3IgdGhpcyBDYWNoZUJ1aWxkZXIgaW5zdGFuY2UuIFRoZSBleGFjdCBmb3JtIG9mIHRoZSByZXR1cm5lZAorICAgICAqIHN0cmluZyBpcyBub3Qgc3BlY2lmaWVkLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIE1vcmVPYmplY3RzLlRvU3RyaW5nSGVscGVyIHMgPSBNb3JlT2JqZWN0cy50b1N0cmluZ0hlbHBlcih0aGlzKTsKKyAgICAgICAgaWYgKGluaXRpYWxDYXBhY2l0eSAhPSBVTlNFVF9JTlQpIHsKKyAgICAgICAgICAgIHMuYWRkKCJpbml0aWFsQ2FwYWNpdHkiLCBpbml0aWFsQ2FwYWNpdHkpOworICAgICAgICB9CisgICAgICAgIGlmIChjb25jdXJyZW5jeUxldmVsICE9IFVOU0VUX0lOVCkgeworICAgICAgICAgICAgcy5hZGQoImNvbmN1cnJlbmN5TGV2ZWwiLCBjb25jdXJyZW5jeUxldmVsKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobWF4aW11bVNpemUgIT0gVU5TRVRfSU5UKSB7CisgICAgICAgICAgICBzLmFkZCgibWF4aW11bVNpemUiLCBtYXhpbXVtU2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1heGltdW1XZWlnaHQgIT0gVU5TRVRfSU5UKSB7CisgICAgICAgICAgICBzLmFkZCgibWF4aW11bVdlaWdodCIsIG1heGltdW1XZWlnaHQpOworICAgICAgICB9CisgICAgICAgIGlmIChleHBpcmVBZnRlcldyaXRlTmFub3MgIT0gVU5TRVRfSU5UKSB7CisgICAgICAgICAgICBzLmFkZCgiZXhwaXJlQWZ0ZXJXcml0ZSIsIGV4cGlyZUFmdGVyV3JpdGVOYW5vcyArICJucyIpOworICAgICAgICB9CisgICAgICAgIGlmIChleHBpcmVBZnRlckFjY2Vzc05hbm9zICE9IFVOU0VUX0lOVCkgeworICAgICAgICAgICAgcy5hZGQoImV4cGlyZUFmdGVyQWNjZXNzIiwgZXhwaXJlQWZ0ZXJBY2Nlc3NOYW5vcyArICJucyIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9DYWNoZUxvYWRlci5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9DYWNoZUxvYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkODg1OWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL0NhY2hlTG9hZGVyLmphdmEKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgR3VhdmEgQXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YTsKKworaW1wb3J0IHN0YXRpYyBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKKworLyoqCisgKiBDb21wdXRlcyBvciByZXRyaWV2ZXMgdmFsdWVzLCBiYXNlZCBvbiBhIGtleSwgZm9yIHVzZSBpbiBwb3B1bGF0aW5nIGEge0BsaW5rIExvYWRpbmdDYWNoZX0uCisgKiA8cD4KKyAqIDxwPk1vc3QgaW1wbGVtZW50YXRpb25zIHdpbGwgb25seSBuZWVkIHRvIGltcGxlbWVudCB7QGxpbmsgI2xvYWR9LiBPdGhlciBtZXRob2RzIG1heSBiZQorICogb3ZlcnJpZGRlbiBhcyBkZXNpcmVkLgorICogPHA+CisgKiA8cD5Vc2FnZSBleGFtcGxlOiA8cHJlPiAgIHtAY29kZQorICogPHA+CisgKiAgIENhY2hlTG9hZGVyPEtleSwgR3JhcGg+IGxvYWRlciA9IG5ldyBDYWNoZUxvYWRlcjxLZXksIEdyYXBoPigpIHsKKyAqICAgICBwdWJsaWMgR3JhcGggbG9hZChLZXkga2V5KSB0aHJvd3MgQW55RXhjZXB0aW9uIHsKKyAqICAgICAgIHJldHVybiBjcmVhdGVFeHBlbnNpdmVHcmFwaChrZXkpOworICogICAgIH0KKyAqICAgfTsKKyAqICAgTG9hZGluZ0NhY2hlPEtleSwgR3JhcGg+IGNhY2hlID0gQ2FjaGVCdWlsZGVyLm5ld0J1aWxkZXIoKS5idWlsZChsb2FkZXIpO308L3ByZT4KKyAqCisgKiBAYXV0aG9yIENoYXJsZXMgRnJ5CisgKiBAc2luY2UgMTAuMAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ2FjaGVMb2FkZXI8SywgVj4geworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciB1c2UgYnkgc3ViY2xhc3Nlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ2FjaGVMb2FkZXIoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcHV0ZXMgb3IgcmV0cmlldmVzIHRoZSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHtAY29kZSBrZXl9LgorICAgICAqCisgICAgICogQHBhcmFtIGtleSB0aGUgbm9uLW51bGwga2V5IHdob3NlIHZhbHVlIHNob3VsZCBiZSBsb2FkZWQKKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGgge0Bjb2RlIGtleX07IDxiPm11c3Qgbm90IGJlIG51bGw8L2I+CisgICAgICogQHRocm93cyBFeGNlcHRpb24gICAgICAgICAgICBpZiB1bmFibGUgdG8gbG9hZCB0aGUgcmVzdWx0CisgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBpcyBpbnRlcnJ1cHRlZC4ge0Bjb2RlIEludGVycnVwdGVkRXhjZXB0aW9ufSBpcworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJlYXRlZCBsaWtlIGFueSBvdGhlciB7QGNvZGUgRXhjZXB0aW9ufSBpbiBhbGwgcmVzcGVjdHMgZXhjZXB0IHRoYXQsIHdoZW4gaXQgaXMgY2F1Z2h0LAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRocmVhZCdzIGludGVycnVwdCBzdGF0dXMgaXMgc2V0CisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IFYgbG9hZChLIGtleSkgdGhyb3dzIEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIENvbXB1dGVzIG9yIHJldHJpZXZlcyBhIHJlcGxhY2VtZW50IHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gYW4gYWxyZWFkeS1jYWNoZWQge0Bjb2RlIGtleX0uIFRoaXMKKyAgICAgKiBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYW4gZXhpc3RpbmcgY2FjaGUgZW50cnkgaXMgcmVmcmVzaGVkIGJ5CisgICAgICoge0BsaW5rIENhY2hlQnVpbGRlciNyZWZyZXNoQWZ0ZXJXcml0ZX0sIG9yIHRocm91Z2ggYSBjYWxsIHRvIHtAbGluayBMb2FkaW5nQ2FjaGUjcmVmcmVzaH0uCisgICAgICogPHA+CisgICAgICogPHA+VGhpcyBpbXBsZW1lbnRhdGlvbiBzeW5jaHJvbm91c2x5IGRlbGVnYXRlcyB0byB7QGxpbmsgI2xvYWR9LiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IGl0IGJlCisgICAgICogb3ZlcnJpZGRlbiB3aXRoIGFuIGFzeW5jaHJvbm91cyBpbXBsZW1lbnRhdGlvbiB3aGVuIHVzaW5nCisgICAgICoge0BsaW5rIENhY2hlQnVpbGRlciNyZWZyZXNoQWZ0ZXJXcml0ZX0uCisgICAgICogPHA+CisgICAgICogPHA+PGI+Tm90ZTo8L2I+IDxpPmFsbCBleGNlcHRpb25zIHRocm93biBieSB0aGlzIG1ldGhvZCB3aWxsIGJlIGxvZ2dlZCBhbmQgdGhlbiBzd2FsbG93ZWQ8L2k+LgorICAgICAqCisgICAgICogQHBhcmFtIGtleSAgICAgIHRoZSBub24tbnVsbCBrZXkgd2hvc2UgdmFsdWUgc2hvdWxkIGJlIGxvYWRlZAorICAgICAqIEBwYXJhbSBvbGRWYWx1ZSB0aGUgbm9uLW51bGwgb2xkIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8ge0Bjb2RlIGtleX0KKyAgICAgKiBAcmV0dXJuIHRoZSBmdXR1cmUgbmV3IHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB7QGNvZGUga2V5fTsKKyAgICAgKiA8Yj5tdXN0IG5vdCBiZSBudWxsLCBtdXN0IG5vdCByZXR1cm4gbnVsbDwvYj4KKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiAgICAgICAgICAgIGlmIHVuYWJsZSB0byByZWxvYWQgdGhlIHJlc3VsdAorICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgdGhpcyBtZXRob2QgaXMgaW50ZXJydXB0ZWQuIHtAY29kZSBJbnRlcnJ1cHRlZEV4Y2VwdGlvbn0gaXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyZWF0ZWQgbGlrZSBhbnkgb3RoZXIge0Bjb2RlIEV4Y2VwdGlvbn0gaW4gYWxsIHJlc3BlY3RzIGV4Y2VwdCB0aGF0LCB3aGVuIGl0IGlzIGNhdWdodCwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0aHJlYWQncyBpbnRlcnJ1cHQgc3RhdHVzIGlzIHNldAorICAgICAqIEBzaW5jZSAxMS4wCisgICAgICovCisgICAgcHVibGljIExpc3RlbmFibGVGdXR1cmU8Vj4gcmVsb2FkKEsga2V5LCBWIG9sZFZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2tOb3ROdWxsKGtleSk7CisgICAgICAgIGNoZWNrTm90TnVsbChvbGRWYWx1ZSk7CisgICAgICAgIHJldHVybiBGdXR1cmVzLmltbWVkaWF0ZUZ1dHVyZShsb2FkKGtleSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRocm93biB0byBpbmRpY2F0ZSB0aGF0IGFuIGludmFsaWQgcmVzcG9uc2Ugd2FzIHJldHVybmVkIGZyb20gYSBjYWxsIHRvIHtAbGluayBDYWNoZUxvYWRlcn0uCisgICAgICoKKyAgICAgKiBAc2luY2UgMTEuMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgSW52YWxpZENhY2hlTG9hZEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworICAgICAgICBwdWJsaWMgSW52YWxpZENhY2hlTG9hZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICAgICAgc3VwZXIobWVzc2FnZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL0NvbGxlY3RQcmVjb25kaXRpb25zLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL0NvbGxlY3RQcmVjb25kaXRpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQwNzM3MwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvQ29sbGVjdFByZWNvbmRpdGlvbnMuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBHdWF2YSBBdXRob3JzCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhOworCitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhLlByZWNvbmRpdGlvbnMuY2hlY2tTdGF0ZTsKKworLyoqCisgKiBQcmVjb25kaXRpb24gY2hlY2tzIHVzZWZ1bCBpbiBjb2xsZWN0aW9uIGltcGxlbWVudGF0aW9ucy4KKyAqLworZmluYWwgY2xhc3MgQ29sbGVjdFByZWNvbmRpdGlvbnMgeworCisgICAgc3RhdGljIGludCBjaGVja05vbm5lZ2F0aXZlKGludCB2YWx1ZSwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgaWYgKHZhbHVlIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihuYW1lICsgIiBjYW5ub3QgYmUgbmVnYXRpdmUgYnV0IHdhczogIiArIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJlY29uZGl0aW9uIHRlc3RlciBmb3Ige0Bjb2RlIEl0ZXJhdG9yLnJlbW92ZSgpfSB0aGF0IHRocm93cyBhbiBleGNlcHRpb24gd2l0aCBhIGNvbnNpc3RlbnQKKyAgICAgKiBlcnJvciBtZXNzYWdlLgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIGNoZWNrUmVtb3ZlKGJvb2xlYW4gY2FuUmVtb3ZlKSB7CisgICAgICAgIGNoZWNrU3RhdGUoY2FuUmVtb3ZlLCAibm8gY2FsbHMgdG8gbmV4dCgpIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8gcmVtb3ZlKCkiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL0NvbGxlY3Rpb25zMi5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9Db2xsZWN0aW9uczIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDgxYjA2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9Db2xsZWN0aW9uczIuamF2YQpAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgR3VhdmEgQXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YTsKKworaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdENvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKKworaW1wb3J0IHN0YXRpYyBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YS5QcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQ7CitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworCisvKioKKyAqIFByb3ZpZGVzIHN0YXRpYyBtZXRob2RzIGZvciB3b3JraW5nIHdpdGgge0Bjb2RlIENvbGxlY3Rpb259IGluc3RhbmNlcy4KKyAqCisgKiBAYXV0aG9yIENocmlzIFBvdmlyaworICogQGF1dGhvciBNaWtlIEJvc3RvY2sKKyAqIEBhdXRob3IgSmFyZWQgTGV2eQorICogQHNpbmNlIDIuMCAoaW1wb3J0ZWQgZnJvbSBHb29nbGUgQ29sbGVjdGlvbnMgTGlicmFyeSkKKyAqLworZmluYWwgY2xhc3MgQ29sbGVjdGlvbnMyIHsKKyAgICBzdGF0aWMgZmluYWwgSm9pbmVyIFNUQU5EQVJEX0pPSU5FUiA9IEpvaW5lci5vbigpOworCisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uczIoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVsZWdhdGVzIHRvIHtAbGluayBDb2xsZWN0aW9uI2NvbnRhaW5zfS4gUmV0dXJucyB7QGNvZGUgZmFsc2V9IGlmIHRoZQorICAgICAqIHtAY29kZSBjb250YWluc30gbWV0aG9kIHRocm93cyBhIHtAY29kZSBDbGFzc0Nhc3RFeGNlcHRpb259IG9yCisgICAgICoge0Bjb2RlIE51bGxQb2ludGVyRXhjZXB0aW9ufS4KKyAgICAgKi8KKyAgICBzdGF0aWMgYm9vbGVhbiBzYWZlQ29udGFpbnMoCisgICAgICAgICAgICBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24sIE9iamVjdCBvYmplY3QpIHsKKyAgICAgICAgY2hlY2tOb3ROdWxsKGNvbGxlY3Rpb24pOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb24uY29udGFpbnMob2JqZWN0KTsKKyAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVsZWdhdGVzIHRvIHtAbGluayBDb2xsZWN0aW9uI3JlbW92ZX0uIFJldHVybnMge0Bjb2RlIGZhbHNlfSBpZiB0aGUKKyAgICAgKiB7QGNvZGUgcmVtb3ZlfSBtZXRob2QgdGhyb3dzIGEge0Bjb2RlIENsYXNzQ2FzdEV4Y2VwdGlvbn0gb3IKKyAgICAgKiB7QGNvZGUgTnVsbFBvaW50ZXJFeGNlcHRpb259LgorICAgICAqLworICAgIHN0YXRpYyBib29sZWFuIHNhZmVSZW1vdmUoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uLCBPYmplY3Qgb2JqZWN0KSB7CisgICAgICAgIGNoZWNrTm90TnVsbChjb2xsZWN0aW9uKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBjb2xsZWN0aW9uLnJlbW92ZShvYmplY3QpOworICAgICAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgY29sbGVjdGlvbiB0aGF0IGFwcGxpZXMge0Bjb2RlIGZ1bmN0aW9ufSB0byBlYWNoIGVsZW1lbnQgb2YKKyAgICAgKiB7QGNvZGUgZnJvbUNvbGxlY3Rpb259LiBUaGUgcmV0dXJuZWQgY29sbGVjdGlvbiBpcyBhIGxpdmUgdmlldyBvZiB7QGNvZGUKKyAgICAgKiBmcm9tQ29sbGVjdGlvbn07IGNoYW5nZXMgdG8gb25lIGFmZmVjdCB0aGUgb3RoZXIuCisgICAgICogPHA+CisgICAgICogPHA+VGhlIHJldHVybmVkIGNvbGxlY3Rpb24ncyB7QGNvZGUgYWRkKCl9IGFuZCB7QGNvZGUgYWRkQWxsKCl9IG1ldGhvZHMKKyAgICAgKiB0aHJvdyBhbiB7QGxpbmsgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb259LiBBbGwgb3RoZXIgY29sbGVjdGlvbgorICAgICAqIG1ldGhvZHMgYXJlIHN1cHBvcnRlZCwgYXMgbG9uZyBhcyB7QGNvZGUgZnJvbUNvbGxlY3Rpb259IHN1cHBvcnRzIHRoZW0uCisgICAgICogPHA+CisgICAgICogPHA+VGhlIHJldHVybmVkIGNvbGxlY3Rpb24gaXNuJ3QgdGhyZWFkc2FmZSBvciBzZXJpYWxpemFibGUsIGV2ZW4gaWYKKyAgICAgKiB7QGNvZGUgZnJvbUNvbGxlY3Rpb259IGlzLgorICAgICAqIDxwPgorICAgICAqIDxwPldoZW4gYSBsaXZlIHZpZXcgaXMgPGk+bm90PC9pPiBuZWVkZWQsIGl0IG1heSBiZSBmYXN0ZXIgdG8gY29weSB0aGUKKyAgICAgKiB0cmFuc2Zvcm1lZCBjb2xsZWN0aW9uIGFuZCB1c2UgdGhlIGNvcHkuCisgICAgICogPHA+CisgICAgICogPHA+SWYgdGhlIGlucHV0IHtAY29kZSBDb2xsZWN0aW9ufSBpcyBrbm93biB0byBiZSBhIHtAY29kZSBMaXN0fSwgY29uc2lkZXIKKyAgICAgKiB7QGxpbmsgTGlzdHMjdHJhbnNmb3JtfS4gSWYgb25seSBhbiB7QGNvZGUgSXRlcmFibGV9IGlzIGF2YWlsYWJsZSwgdXNlCisgICAgICoge0BsaW5rIEl0ZXJhYmxlcyN0cmFuc2Zvcm19LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPEYsIFQ+IENvbGxlY3Rpb248VD4gdHJhbnNmb3JtKENvbGxlY3Rpb248Rj4gZnJvbUNvbGxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb248PyBzdXBlciBGLCBUPiBmdW5jdGlvbikgeworICAgICAgICByZXR1cm4gbmV3IFRyYW5zZm9ybWVkQ29sbGVjdGlvbjxGLCBUPihmcm9tQ29sbGVjdGlvbiwgZnVuY3Rpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYmVzdC1lZmZvcnQtc2l6ZWQgU3RyaW5nQnVpbGRlciBiYXNlZCBvbiB0aGUgZ2l2ZW4gY29sbGVjdGlvbiBzaXplLgorICAgICAqLworICAgIHN0YXRpYyBTdHJpbmdCdWlsZGVyIG5ld1N0cmluZ0J1aWxkZXJGb3JDb2xsZWN0aW9uKGludCBzaXplKSB7CisgICAgICAgIENvbGxlY3RQcmVjb25kaXRpb25zLmNoZWNrTm9ubmVnYXRpdmUoc2l6ZSwgInNpemUiKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdCdWlsZGVyKChpbnQpIE1hdGgubWluKHNpemUgKiA4TCwgSW50cy5NQVhfUE9XRVJfT0ZfVFdPKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXNlZCB0byBhdm9pZCBodHRwOi8vYnVncy5zdW4uY29tL3ZpZXdfYnVnLmRvP2J1Z19pZD02NTU4NTU3CisgICAgICovCisgICAgc3RhdGljIDxUPiBDb2xsZWN0aW9uPFQ+IGNhc3QoSXRlcmFibGU8VD4gaXRlcmFibGUpIHsKKyAgICAgICAgcmV0dXJuIChDb2xsZWN0aW9uPFQ+KSBpdGVyYWJsZTsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgVHJhbnNmb3JtZWRDb2xsZWN0aW9uPEYsIFQ+IGV4dGVuZHMgQWJzdHJhY3RDb2xsZWN0aW9uPFQ+IHsKKyAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxGPiBmcm9tQ29sbGVjdGlvbjsKKyAgICAgICAgZmluYWwgRnVuY3Rpb248PyBzdXBlciBGLCA/IGV4dGVuZHMgVD4gZnVuY3Rpb247CisKKyAgICAgICAgVHJhbnNmb3JtZWRDb2xsZWN0aW9uKENvbGxlY3Rpb248Rj4gZnJvbUNvbGxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjw/IHN1cGVyIEYsID8gZXh0ZW5kcyBUPiBmdW5jdGlvbikgeworICAgICAgICAgICAgdGhpcy5mcm9tQ29sbGVjdGlvbiA9IGNoZWNrTm90TnVsbChmcm9tQ29sbGVjdGlvbik7CisgICAgICAgICAgICB0aGlzLmZ1bmN0aW9uID0gY2hlY2tOb3ROdWxsKGZ1bmN0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgICAgIGZyb21Db2xsZWN0aW9uLmNsZWFyKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKyAgICAgICAgICAgIHJldHVybiBmcm9tQ29sbGVjdGlvbi5pc0VtcHR5KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yKCkgeworICAgICAgICAgICAgcmV0dXJuIEl0ZXJhdG9ycy50cmFuc2Zvcm0oZnJvbUNvbGxlY3Rpb24uaXRlcmF0b3IoKSwgZnVuY3Rpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBmcm9tQ29sbGVjdGlvbi5zaXplKCk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvQ29tcGFyYXRvck9yZGVyaW5nLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL0NvbXBhcmF0b3JPcmRlcmluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjYmE5NmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL0NvbXBhcmF0b3JPcmRlcmluZy5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEd1YXZhIEF1dGhvcnMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmE7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKKworaW1wb3J0IHN0YXRpYyBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKKworLyoqCisgKiBBbiBvcmRlcmluZyBmb3IgYSBwcmUtZXhpc3RpbmcgY29tcGFyYXRvci4KKyAqLworZmluYWwgY2xhc3MgQ29tcGFyYXRvck9yZGVyaW5nPFQ+IGV4dGVuZHMgT3JkZXJpbmc8VD4gaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDA7CisgICAgcHJpdmF0ZSBmaW5hbCBDb21wYXJhdG9yPFQ+IGNvbXBhcmF0b3I7CisKKyAgICBDb21wYXJhdG9yT3JkZXJpbmcoQ29tcGFyYXRvcjxUPiBjb21wYXJhdG9yKSB7CisgICAgICAgIHRoaXMuY29tcGFyYXRvciA9IGNoZWNrTm90TnVsbChjb21wYXJhdG9yKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGNvbXBhcmUoVCBhLCBUIGIpIHsKKyAgICAgICAgcmV0dXJuIGNvbXBhcmF0b3IuY29tcGFyZShhLCBiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgeworICAgICAgICBpZiAob2JqZWN0ID09IHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBDb21wYXJhdG9yT3JkZXJpbmcpIHsKKyAgICAgICAgICAgIENvbXBhcmF0b3JPcmRlcmluZzw/PiB0aGF0ID0gKENvbXBhcmF0b3JPcmRlcmluZzw/Pikgb2JqZWN0OworICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyYXRvci5lcXVhbHModGhhdC5jb21wYXJhdG9yKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIGNvbXBhcmF0b3IuaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gY29tcGFyYXRvci50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvRXF1aXZhbGVuY2UuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvRXF1aXZhbGVuY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTFiNGUwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9FcXVpdmFsZW5jZS5qYXZhCkBAIC0wLDAgKzEsMTY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBHdWF2YSBBdXRob3JzCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKKy8qKgorICogQSBzdHJhdGVneSBmb3IgZGV0ZXJtaW5pbmcgd2hldGhlciB0d28gaW5zdGFuY2VzIGFyZSBjb25zaWRlcmVkIGVxdWl2YWxlbnQuIEV4YW1wbGVzIG9mCisgKiBlcXVpdmFsZW5jZXMgYXJlIHRoZSB7QGxpbmtwbGFpbiAjaWRlbnRpdHkoKSBpZGVudGl0eSBlcXVpdmFsZW5jZX0gYW5kIHtAbGlua3BsYWluICNlcXVhbHMgZXF1YWxzCisgKiBlcXVpdmFsZW5jZX0uCisgKgorICogQGF1dGhvciBCb2IgTGVlCisgKiBAYXV0aG9yIEJlbiBZdQorICogQGF1dGhvciBHcmVnb3J5IEtpY2sKKyAqIEBzaW5jZSAxMC4wICg8YSBocmVmPSJodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ3VhdmEtbGlicmFyaWVzL3dpa2kvQ29tcGF0aWJpbGl0eSIKKyAqID5tb3N0bHkgc291cmNlLWNvbXBhdGlibGU8L2E+IHNpbmNlIDQuMCkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEVxdWl2YWxlbmNlPFQ+IHsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gZXF1aXZhbGVuY2UgdGhhdCBkZWxlZ2F0ZXMgdG8ge0BsaW5rIE9iamVjdCNlcXVhbHN9IGFuZCB7QGxpbmsgT2JqZWN0I2hhc2hDb2RlfS4KKyAgICAgKiB7QGxpbmsgRXF1aXZhbGVuY2UjZXF1aXZhbGVudH0gcmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgYm90aCB2YWx1ZXMgYXJlIG51bGwsIG9yIGlmIG5laXRoZXIKKyAgICAgKiB2YWx1ZSBpcyBudWxsIGFuZCB7QGxpbmsgT2JqZWN0I2VxdWFsc30gcmV0dXJucyB7QGNvZGUgdHJ1ZX0uIHtAbGluayBFcXVpdmFsZW5jZSNoYXNofSByZXR1cm5zCisgICAgICoge0Bjb2RlIDB9IGlmIHBhc3NlZCBhIG51bGwgdmFsdWUuCisgICAgICoKKyAgICAgKiBAc2luY2UgNC4wIChpbiBFcXVpdmFsZW5jZXMpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBFcXVpdmFsZW5jZTxPYmplY3Q+IGVxdWFscygpIHsKKyAgICAgICAgcmV0dXJuIEVxdWFscy5JTlNUQU5DRTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIGVxdWl2YWxlbmNlIHRoYXQgdXNlcyB7QGNvZGUgPT19IHRvIGNvbXBhcmUgdmFsdWVzIGFuZCB7QGxpbmsKKyAgICAgKiBTeXN0ZW0jaWRlbnRpdHlIYXNoQ29kZShPYmplY3QpfSB0byBjb21wdXRlIHRoZSBoYXNoIGNvZGUuICB7QGxpbmsgRXF1aXZhbGVuY2UjZXF1aXZhbGVudH0KKyAgICAgKiByZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB7QGNvZGUgYSA9PSBifSwgaW5jbHVkaW5nIGluIHRoZSBjYXNlIHRoYXQgYSBhbmQgYiBhcmUgYm90aCBudWxsLgorICAgICAqCisgICAgICogQHNpbmNlIDQuMCAoaW4gRXF1aXZhbGVuY2VzKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRXF1aXZhbGVuY2U8T2JqZWN0PiBpZGVudGl0eSgpIHsKKyAgICAgICAgcmV0dXJuIElkZW50aXR5LklOU1RBTkNFOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoZSBnaXZlbiBvYmplY3RzIGFyZSBjb25zaWRlcmVkIGVxdWl2YWxlbnQuCisgICAgICogPHA+CisgICAgICogPHA+VGhlIHtAY29kZSBlcXVpdmFsZW50fSBtZXRob2QgaW1wbGVtZW50cyBhbiBlcXVpdmFsZW5jZSByZWxhdGlvbiBvbiBvYmplY3QgcmVmZXJlbmNlczoKKyAgICAgKiA8cD4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPkl0IGlzIDxpPnJlZmxleGl2ZTwvaT46IGZvciBhbnkgcmVmZXJlbmNlIHtAY29kZSB4fSwgaW5jbHVkaW5nIG51bGwsIHtAY29kZQorICAgICAqIGVxdWl2YWxlbnQoeCwgeCl9IHJldHVybnMge0Bjb2RlIHRydWV9LgorICAgICAqIDxsaT5JdCBpcyA8aT5zeW1tZXRyaWM8L2k+OiBmb3IgYW55IHJlZmVyZW5jZXMge0Bjb2RlIHh9IGFuZCB7QGNvZGUgeX0sIHtAY29kZQorICAgICAqIGVxdWl2YWxlbnQoeCwgeSkgPT0gZXF1aXZhbGVudCh5LCB4KX0uCisgICAgICogPGxpPkl0IGlzIDxpPnRyYW5zaXRpdmU8L2k+OiBmb3IgYW55IHJlZmVyZW5jZXMge0Bjb2RlIHh9LCB7QGNvZGUgeX0sIGFuZCB7QGNvZGUgen0sIGlmCisgICAgICoge0Bjb2RlIGVxdWl2YWxlbnQoeCwgeSl9IHJldHVybnMge0Bjb2RlIHRydWV9IGFuZCB7QGNvZGUgZXF1aXZhbGVudCh5LCB6KX0gcmV0dXJucyB7QGNvZGUKKyAgICAgKiB0cnVlfSwgdGhlbiB7QGNvZGUgZXF1aXZhbGVudCh4LCB6KX0gcmV0dXJucyB7QGNvZGUgdHJ1ZX0uCisgICAgICogPGxpPkl0IGlzIDxpPmNvbnNpc3RlbnQ8L2k+OiBmb3IgYW55IHJlZmVyZW5jZXMge0Bjb2RlIHh9IGFuZCB7QGNvZGUgeX0sIG11bHRpcGxlIGludm9jYXRpb25zCisgICAgICogb2Yge0Bjb2RlIGVxdWl2YWxlbnQoeCwgeSl9IGNvbnNpc3RlbnRseSByZXR1cm4ge0Bjb2RlIHRydWV9IG9yIGNvbnNpc3RlbnRseSByZXR1cm4ge0Bjb2RlCisgICAgICogZmFsc2V9IChwcm92aWRlZCB0aGF0IG5laXRoZXIge0Bjb2RlIHh9IG5vciB7QGNvZGUgeX0gaXMgbW9kaWZpZWQpLgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gZXF1aXZhbGVudChUIGEsIFQgYikgeworICAgICAgICBpZiAoYSA9PSBiKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkb0VxdWl2YWxlbnQoYSwgYik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYge0Bjb2RlIGF9IGFuZCB7QGNvZGUgYn0gYXJlIGNvbnNpZGVyZWQgZXF1aXZhbGVudC4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5DYWxsZWQgYnkge0BsaW5rICNlcXVpdmFsZW50fS4ge0Bjb2RlIGF9IGFuZCB7QGNvZGUgYn0gYXJlIG5vdCB0aGUgc2FtZQorICAgICAqIG9iamVjdCBhbmQgYXJlIG5vdCBudWxscy4KKyAgICAgKgorICAgICAqIEBzaW5jZSAxMC4wIChwcmV2aW91c2x5LCBzdWJjbGFzc2VzIHdvdWxkIG92ZXJyaWRlIGVxdWl2YWxlbnQoKSkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBkb0VxdWl2YWxlbnQoVCBhLCBUIGIpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGhhc2ggY29kZSBmb3Ige0Bjb2RlIHR9LgorICAgICAqIDxwPgorICAgICAqIDxwPlRoZSB7QGNvZGUgaGFzaH0gaGFzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPkl0IGlzIDxpPmNvbnNpc3RlbnQ8L2k+OiBmb3IgYW55IHJlZmVyZW5jZSB7QGNvZGUgeH0sIG11bHRpcGxlIGludm9jYXRpb25zIG9mCisgICAgICoge0Bjb2RlIGhhc2goeH19IGNvbnNpc3RlbnRseSByZXR1cm4gdGhlIHNhbWUgdmFsdWUgcHJvdmlkZWQge0Bjb2RlIHh9IHJlbWFpbnMgdW5jaGFuZ2VkCisgICAgICogYWNjb3JkaW5nIHRvIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBlcXVpdmFsZW5jZS4gVGhlIGhhc2ggbmVlZCBub3QgcmVtYWluIGNvbnNpc3RlbnQgZnJvbQorICAgICAqIG9uZSBleGVjdXRpb24gb2YgYW4gYXBwbGljYXRpb24gdG8gYW5vdGhlciBleGVjdXRpb24gb2YgdGhlIHNhbWUgYXBwbGljYXRpb24uCisgICAgICogPGxpPkl0IGlzIDxpPmRpc3RyaWJ1dGFibGUgYWNyb3NzIGVxdWl2YWxlbmNlPC9pPjogZm9yIGFueSByZWZlcmVuY2VzIHtAY29kZSB4fSBhbmQge0Bjb2RlIHl9LAorICAgICAqIGlmIHtAY29kZSBlcXVpdmFsZW50KHgsIHkpfSwgdGhlbiB7QGNvZGUgaGFzaCh4KSA9PSBoYXNoKHkpfS4gSXQgaXMgPGk+bm90PC9pPiBuZWNlc3NhcnkKKyAgICAgKiB0aGF0IHRoZSBoYXNoIGJlIGRpc3RyaWJ1dGFibGUgYWNyb3NzIDxpPmluZXF1aXZhbGVuY2U8L2k+LiBJZiB7QGNvZGUgZXF1aXZhbGVuY2UoeCwgeSl9CisgICAgICogaXMgZmFsc2UsIHtAY29kZSBoYXNoKHgpID09IGhhc2goeSl9IG1heSBzdGlsbCBiZSB0cnVlLgorICAgICAqIDxsaT57QGNvZGUgaGFzaChudWxsKX0gaXMge0Bjb2RlIDB9LgorICAgICAqIDwvdWw+CisgICAgICovCisgICAgcHVibGljIGZpbmFsIGludCBoYXNoKFQgdCkgeworICAgICAgICBpZiAodCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZG9IYXNoKHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBoYXNoIGNvZGUgZm9yIG5vbi1udWxsIG9iamVjdCB7QGNvZGUgdH0uCisgICAgICogPHA+CisgICAgICogPHA+Q2FsbGVkIGJ5IHtAbGluayAjaGFzaH0uCisgICAgICoKKyAgICAgKiBAc2luY2UgMTAuMCAocHJldmlvdXNseSwgc3ViY2xhc3NlcyB3b3VsZCBvdmVycmlkZSBoYXNoKCkpCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IGludCBkb0hhc2goVCB0KTsKKworICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBFcXVhbHMgZXh0ZW5kcyBFcXVpdmFsZW5jZTxPYmplY3Q+IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworICAgICAgICBzdGF0aWMgZmluYWwgRXF1aXZhbGVuY2UuRXF1YWxzIElOU1RBTkNFID0gbmV3IEVxdWl2YWxlbmNlLkVxdWFscygpOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkb0VxdWl2YWxlbnQoT2JqZWN0IGEsIE9iamVjdCBiKSB7CisgICAgICAgICAgICByZXR1cm4gYS5lcXVhbHMoYik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIGludCBkb0hhc2goT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIHJldHVybiBvLmhhc2hDb2RlKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIE9iamVjdCByZWFkUmVzb2x2ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBJTlNUQU5DRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBJZGVudGl0eSBleHRlbmRzIEVxdWl2YWxlbmNlPE9iamVjdD4gaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisgICAgICAgIHN0YXRpYyBmaW5hbCBFcXVpdmFsZW5jZS5JZGVudGl0eSBJTlNUQU5DRSA9IG5ldyBFcXVpdmFsZW5jZS5JZGVudGl0eSgpOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBkb0VxdWl2YWxlbnQoT2JqZWN0IGEsIE9iamVjdCBiKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIGludCBkb0hhc2goT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIHJldHVybiBTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZShvKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgeworICAgICAgICAgICAgcmV0dXJuIElOU1RBTkNFOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9FeGVjdXRpb25FcnJvci5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9FeGVjdXRpb25FcnJvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwYzBiZTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL0V4ZWN1dGlvbkVycm9yLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgR3VhdmEgQXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YTsKKworLyoqCisgKiB7QGxpbmsgRXJyb3J9IHZhcmlhbnQgb2Yge0BsaW5rIGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbn0uIEFzCisgKiB3aXRoIHtAY29kZSBFeGVjdXRpb25FeGNlcHRpb259LCB0aGUgZXJyb3IncyB7QGxpbmtwbGFpbiAjZ2V0Q2F1c2UoKSBjYXVzZX0KKyAqIGNvbWVzIGZyb20gYSBmYWlsZWQgdGFzaywgcG9zc2libHkgcnVuIGluIGFub3RoZXIgdGhyZWFkLiBUaGF0IGNhdXNlIHNob3VsZAorICogaXRzZWxmIGJlIGFuIHtAY29kZSBFcnJvcn07IGlmIG5vdCwgdXNlIHtAY29kZSBFeGVjdXRpb25FeGNlcHRpb259IG9yIHtAbGluaworICogVW5jaGVja2VkRXhlY3V0aW9uRXhjZXB0aW9ufS4gVGhpcyBhbGxvd3MgdGhlIGNsaWVudCBjb2RlIHRvIGNvbnRpbnVlIHRvCisgKiBkaXN0aW5ndWlzaCBiZXR3ZWVuIGV4Y2VwdGlvbnMgYW5kIGVycm9ycywgZXZlbiB3aGVuIHRoZXkgY29tZSBmcm9tIG90aGVyCisgKiB0aHJlYWRzLgorICoKKyAqIEBhdXRob3IgQ2hyaXMgUG92aXJrCisgKiBAc2luY2UgMTAuMAorICovCitwdWJsaWMgY2xhc3MgRXhlY3V0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAwOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSB3aXRoIHRoZSBnaXZlbiBjYXVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRXhlY3V0aW9uRXJyb3IoRXJyb3IgY2F1c2UpIHsKKyAgICAgICAgc3VwZXIoY2F1c2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvRXhlY3V0aW9uTGlzdC5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9FeGVjdXRpb25MaXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJhMmI3MwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvRXhlY3V0aW9uTGlzdC5qYXZhCkBAIC0wLDAgKzEsMTcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBHdWF2YSBBdXRob3JzCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvKioKKyAqIDxwPkEgbGlzdCBvZiBsaXN0ZW5lcnMsIGVhY2ggd2l0aCBhbiBhc3NvY2lhdGVkIHtAY29kZSBFeGVjdXRvcn0sIHRoYXQKKyAqIGd1YXJhbnRlZXMgdGhhdCBldmVyeSB7QGNvZGUgUnVubmFibGV9IHRoYXQgaXMge0BsaW5rcGxhaW4gI2FkZCBhZGRlZH0gd2lsbAorICogYmUgZXhlY3V0ZWQgYWZ0ZXIge0BsaW5rICNleGVjdXRlKCl9IGlzIGNhbGxlZC4gQW55IHtAY29kZSBSdW5uYWJsZX0gYWRkZWQKKyAqIGFmdGVyIHRoZSBjYWxsIHRvIHtAY29kZSBleGVjdXRlfSBpcyBzdGlsbCBndWFyYW50ZWVkIHRvIGV4ZWN1dGUuIFRoZXJlIGlzIG5vCisgKiBndWFyYW50ZWUsIGhvd2V2ZXIsIHRoYXQgbGlzdGVuZXJzIHdpbGwgYmUgZXhlY3V0ZWQgaW4gdGhlIG9yZGVyIHRoYXQgdGhleQorICogYXJlIGFkZGVkLgorICogPHA+CisgKiA8cD5FeGNlcHRpb25zIHRocm93biBieSBhIGxpc3RlbmVyIHdpbGwgYmUgcHJvcGFnYXRlZCB1cCB0byB0aGUgZXhlY3V0b3IuCisgKiBBbnkgZXhjZXB0aW9uIHRocm93biBkdXJpbmcge0Bjb2RlIEV4ZWN1dG9yLmV4ZWN1dGV9IChlLmcuLCBhIHtAY29kZQorICogUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb259IG9yIGFuIGV4Y2VwdGlvbiB0aHJvd24gYnkge0BsaW5rcGxhaW4KKyAqIE1vcmVFeGVjdXRvcnMjZGlyZWN0RXhlY3V0b3IgZGlyZWN0IGV4ZWN1dGlvbn0pIHdpbGwgYmUgY2F1Z2h0IGFuZAorICogbG9nZ2VkLgorICoKKyAqIEBhdXRob3IgTmlzaGFudCBUaGFra2FyCisgKiBAYXV0aG9yIFN2ZW4gTWF3c29uCisgKiBAc2luY2UgMS4wCisgKi8KK2ZpbmFsIGNsYXNzIEV4ZWN1dGlvbkxpc3QgeworICAgIC8vIExvZ2dlciB0byBsb2cgZXhjZXB0aW9ucyBjYXVnaHQgd2hlbiBydW5uaW5nIHJ1bm5hYmxlcy4KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nID0gTG9nZ2VyLmdldExvZ2dlcihFeGVjdXRpb25MaXN0LmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcnVubmFibGUsIGV4ZWN1dG9yIHBhaXJzIHRvIGV4ZWN1dGUuICBUaGlzIGFjdHMgYXMgYSBzdGFjayB0aHJlYWRlZCB0aHJvdWdoIHRoZQorICAgICAqIHtAbGluayBSdW5uYWJsZUV4ZWN1dG9yUGFpciNuZXh0fSBmaWVsZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFJ1bm5hYmxlRXhlY3V0b3JQYWlyIHJ1bm5hYmxlczsKKyAgICBwcml2YXRlIGJvb2xlYW4gZXhlY3V0ZWQ7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3LCBlbXB0eSB7QGxpbmsgRXhlY3V0aW9uTGlzdH0uCisgICAgICovCisgICAgcHVibGljIEV4ZWN1dGlvbkxpc3QoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3VibWl0cyB0aGUgZ2l2ZW4gcnVubmFibGUgdG8gdGhlIGdpdmVuIHtAbGluayBFeGVjdXRvcn0gY2F0Y2hpbmcgYW5kIGxvZ2dpbmcgYWxsCisgICAgICoge0BsaW5rcGxhaW4gUnVudGltZUV4Y2VwdGlvbiBydW50aW1lIGV4Y2VwdGlvbnN9IHRocm93biBieSB0aGUgZXhlY3V0b3IuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBleGVjdXRlTGlzdGVuZXIoUnVubmFibGUgcnVubmFibGUsIEV4ZWN1dG9yIGV4ZWN1dG9yKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBleGVjdXRvci5leGVjdXRlKHJ1bm5hYmxlKTsKKyAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBMb2cgaXQgYW5kIGtlZXAgZ29pbmcsIGJhZCBydW5uYWJsZSBhbmQvb3IgZXhlY3V0b3IuICBEb24ndAorICAgICAgICAgICAgLy8gcHVuaXNoIHRoZSBvdGhlciBydW5uYWJsZXMgaWYgd2UncmUgZ2l2ZW4gYSBiYWQgb25lLiAgV2Ugb25seQorICAgICAgICAgICAgLy8gY2F0Y2ggUnVudGltZUV4Y2VwdGlvbiBiZWNhdXNlIHdlIHdhbnQgRXJyb3JzIHRvIHByb3BhZ2F0ZSB1cC4KKyAgICAgICAgICAgIGxvZy5sb2coTGV2ZWwuU0VWRVJFLCAiUnVudGltZUV4Y2VwdGlvbiB3aGlsZSBleGVjdXRpbmcgcnVubmFibGUgIgorICAgICAgICAgICAgICAgICAgICArIHJ1bm5hYmxlICsgIiB3aXRoIGV4ZWN1dG9yICIgKyBleGVjdXRvciwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHRoZSB7QGNvZGUgUnVubmFibGV9IGFuZCBhY2NvbXBhbnlpbmcge0Bjb2RlIEV4ZWN1dG9yfSB0byB0aGUgbGlzdCBvZgorICAgICAqIGxpc3RlbmVycyB0byBleGVjdXRlLiBJZiBleGVjdXRpb24gaGFzIGFscmVhZHkgYmVndW4sIHRoZSBsaXN0ZW5lciBpcworICAgICAqIGV4ZWN1dGVkIGltbWVkaWF0ZWx5LgorICAgICAqIDxwPgorICAgICAqIDxwPk5vdGU6IEZvciBmYXN0LCBsaWdodHdlaWdodCBsaXN0ZW5lcnMgdGhhdCB3b3VsZCBiZSBzYWZlIHRvIGV4ZWN1dGUgaW4KKyAgICAgKiBhbnkgdGhyZWFkLCBjb25zaWRlciB7QGxpbmsgTW9yZUV4ZWN1dG9ycyNkaXJlY3RFeGVjdXRvcn0uIEZvciBoZWF2aWVyCisgICAgICogbGlzdGVuZXJzLCB7QGNvZGUgZGlyZWN0RXhlY3V0b3IoKX0gY2FycmllcyBzb21lIGNhdmVhdHM6IEZpcnN0LCB0aGUKKyAgICAgKiB0aHJlYWQgdGhhdCB0aGUgbGlzdGVuZXIgcnVucyBpbiBkZXBlbmRzIG9uIHdoZXRoZXIgdGhlIHtAY29kZQorICAgICAqIEV4ZWN1dGlvbkxpc3R9IGhhcyBiZWVuIGV4ZWN1dGVkIGF0IHRoZSB0aW1lIGl0IGlzIGFkZGVkLiBJbiBwYXJ0aWN1bGFyLAorICAgICAqIGxpc3RlbmVycyBtYXkgcnVuIGluIHRoZSB0aHJlYWQgdGhhdCBjYWxscyB7QGNvZGUgYWRkfS4gU2Vjb25kLCB0aGUgdGhyZWFkCisgICAgICogdGhhdCBjYWxscyB7QGxpbmsgI2V4ZWN1dGV9IG1heSBiZSBhbiBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiB0aHJlYWQsIHN1Y2gKKyAgICAgKiBhcyBhbiBSUEMgbmV0d29yayB0aHJlYWQsIGFuZCB7QGNvZGUgZGlyZWN0RXhlY3V0b3IoKX0gbGlzdGVuZXJzIG1heQorICAgICAqIHJ1biBpbiB0aGlzIHRocmVhZC4gRmluYWxseSwgZHVyaW5nIHRoZSBleGVjdXRpb24gb2YgYSB7QGNvZGUKKyAgICAgKiBkaXJlY3RFeGVjdXRvcn0gbGlzdGVuZXIsIGFsbCBvdGhlciByZWdpc3RlcmVkIGJ1dCB1bmV4ZWN1dGVkCisgICAgICogbGlzdGVuZXJzIGFyZSBwcmV2ZW50ZWQgZnJvbSBydW5uaW5nLCBldmVuIGlmIHRob3NlIGxpc3RlbmVycyBhcmUgdG8gcnVuCisgICAgICogaW4gb3RoZXIgZXhlY3V0b3JzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZChSdW5uYWJsZSBydW5uYWJsZSwgRXhlY3V0b3IgZXhlY3V0b3IpIHsKKyAgICAgICAgLy8gRmFpbCBmYXN0IG9uIGEgbnVsbC4gIFdlIHRocm93IE5QRSBoZXJlIGJlY2F1c2UgdGhlIGNvbnRyYWN0IG9mCisgICAgICAgIC8vIEV4ZWN1dG9yIHN0YXRlcyB0aGF0IGl0IHRocm93cyBOUEUgb24gbnVsbCBsaXN0ZW5lciwgc28gd2UgcHJvcGFnYXRlCisgICAgICAgIC8vIHRoYXQgY29udHJhY3QgdXAgaW50byB0aGUgYWRkIG1ldGhvZCBhcyB3ZWxsLgorICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbChydW5uYWJsZSwgIlJ1bm5hYmxlIHdhcyBudWxsLiIpOworICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbChleGVjdXRvciwgIkV4ZWN1dG9yIHdhcyBudWxsLiIpOworCisgICAgICAgIC8vIExvY2sgd2hpbGUgd2UgY2hlY2sgc3RhdGUuICBXZSBtdXN0IG1haW50YWluIHRoZSBsb2NrIHdoaWxlIGFkZGluZyB0aGUKKyAgICAgICAgLy8gbmV3IHBhaXIgc28gdGhhdCBhbm90aGVyIHRocmVhZCBjYW4ndCBydW4gdGhlIGxpc3Qgb3V0IGZyb20gdW5kZXIgdXMuCisgICAgICAgIC8vIFdlIG9ubHkgYWRkIHRvIHRoZSBsaXN0IGlmIHdlIGhhdmUgbm90IHlldCBzdGFydGVkIGV4ZWN1dGlvbi4KKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBpZiAoIWV4ZWN1dGVkKSB7CisgICAgICAgICAgICAgICAgcnVubmFibGVzID0gbmV3IFJ1bm5hYmxlRXhlY3V0b3JQYWlyKHJ1bm5hYmxlLCBleGVjdXRvciwgcnVubmFibGVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gRXhlY3V0ZSB0aGUgcnVubmFibGUgaW1tZWRpYXRlbHkuIEJlY2F1c2Ugb2Ygc2NoZWR1bGluZyB0aGlzIG1heSBlbmQgdXAKKyAgICAgICAgLy8gZ2V0dGluZyBjYWxsZWQgYmVmb3JlIHNvbWUgb2YgdGhlIHByZXZpb3VzbHkgYWRkZWQgcnVubmFibGVzLCBidXQgd2UncmUKKyAgICAgICAgLy8gT0sgd2l0aCB0aGF0LiAgSWYgd2Ugd2FudCB0byBjaGFuZ2UgdGhlIGNvbnRyYWN0IHRvIGd1YXJhbnRlZSBvcmRlcmluZworICAgICAgICAvLyBhbW9uZyBydW5uYWJsZXMgd2UnZCBoYXZlIHRvIG1vZGlmeSB0aGUgbG9naWMgaGVyZSB0byBhbGxvdyBpdC4KKyAgICAgICAgZXhlY3V0ZUxpc3RlbmVyKHJ1bm5hYmxlLCBleGVjdXRvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUnVucyB0aGlzIGV4ZWN1dGlvbiBsaXN0LCBleGVjdXRpbmcgYWxsIGV4aXN0aW5nIHBhaXJzIGluIHRoZSBvcmRlciB0aGV5CisgICAgICogd2VyZSBhZGRlZC4gSG93ZXZlciwgbm90ZSB0aGF0IGxpc3RlbmVycyBhZGRlZCBhZnRlciB0aGlzIHBvaW50IG1heSBiZQorICAgICAqIGV4ZWN1dGVkIGJlZm9yZSB0aG9zZSBwcmV2aW91c2x5IGFkZGVkLCBhbmQgbm90ZSB0aGF0IHRoZSBleGVjdXRpb24gb3JkZXIKKyAgICAgKiBvZiBhbGwgbGlzdGVuZXJzIGlzIHVsdGltYXRlbHkgY2hvc2VuIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlCisgICAgICogc3VwcGxpZWQgZXhlY3V0b3JzLgorICAgICAqIDxwPgorICAgICAqIDxwPlRoaXMgbWV0aG9kIGlzIGlkZW1wb3RlbnQuIENhbGxpbmcgaXQgc2V2ZXJhbCB0aW1lcyBpbiBwYXJhbGxlbCBpcworICAgICAqIHNlbWFudGljYWxseSBlcXVpdmFsZW50IHRvIGNhbGxpbmcgaXQgZXhhY3RseSBvbmNlLgorICAgICAqCisgICAgICogQHNpbmNlIDEwLjAgKHByZXNlbnQgaW4gMS4wIGFzIHtAY29kZSBydW59KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB7CisgICAgICAgIC8vIExvY2sgd2hpbGUgd2UgdXBkYXRlIG91ciBzdGF0ZSBzbyB0aGUgYWRkIG1ldGhvZCBhYm92ZSB3aWxsIGZpbmlzaCBhZGRpbmcKKyAgICAgICAgLy8gYW55IGxpc3RlbmVycyBiZWZvcmUgd2Ugc3RhcnQgdG8gcnVuIHRoZW0uCisgICAgICAgIFJ1bm5hYmxlRXhlY3V0b3JQYWlyIGxpc3Q7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgaWYgKGV4ZWN1dGVkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXhlY3V0ZWQgPSB0cnVlOworICAgICAgICAgICAgbGlzdCA9IHJ1bm5hYmxlczsKKyAgICAgICAgICAgIHJ1bm5hYmxlcyA9IG51bGw7ICAvLyBhbGxvdyBHQyB0byBmcmVlIGxpc3RlbmVycyBldmVuIGlmIHRoaXMgc3RheXMgYXJvdW5kIGZvciBhIHdoaWxlLgorICAgICAgICB9CisgICAgICAgIC8vIElmIHdlIHN1Y2NlZWRlZCB0aGVuIGxpc3QgaG9sZHMgYWxsIHRoZSBydW5uYWJsZXMgd2UgdG8gZXhlY3V0ZS4gIFRoZSBwYWlycyBpbiB0aGUgc3RhY2sgYXJlCisgICAgICAgIC8vIGluIHRoZSBvcHBvc2l0ZSBvcmRlciBmcm9tIGhvdyB0aGV5IHdlcmUgYWRkZWQgc28gd2UgbmVlZCB0byByZXZlcnNlIHRoZSBsaXN0IHRvIGZ1bGZpbGwgb3VyCisgICAgICAgIC8vIGNvbnRyYWN0LgorICAgICAgICAvLyBUaGlzIGlzIHNvbWV3aGF0IGFubm95aW5nLCBidXQgdHVybnMgb3V0IHRvIGJlIHZlcnkgZmFzdCBpbiBwcmFjdGljZS4gIEFsdGVybmF0aXZlbHksIHdlCisgICAgICAgIC8vIGNvdWxkIGRyb3AgdGhlIGNvbnRyYWN0IG9uIHRoZSBtZXRob2QgdGhhdCBlbmZvcmNlcyB0aGlzIHF1ZXVlIGxpa2UgYmVoYXZpb3Igc2luY2UgZGVwZW5kaW5nCisgICAgICAgIC8vIG9uIGl0IGlzIGxpa2VseSB0byBiZSBhIGJ1ZyBhbnl3YXkuCisKKyAgICAgICAgLy8gTi5CLiBBbGwgd3JpdGVzIHRvIHRoZSBsaXN0IGFuZCB0aGUgbmV4dCBwb2ludGVycyBtdXN0IGhhdmUgaGFwcGVuZWQgYmVmb3JlIHRoZSBhYm92ZQorICAgICAgICAvLyBzeW5jaHJvbml6ZWQgYmxvY2ssIHNvIHdlIGNhbiBpdGVyYXRlIHRoZSBsaXN0IHdpdGhvdXQgdGhlIGxvY2sgaGVsZCBoZXJlLgorICAgICAgICBSdW5uYWJsZUV4ZWN1dG9yUGFpciByZXZlcnNlZExpc3QgPSBudWxsOworICAgICAgICB3aGlsZSAobGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICBSdW5uYWJsZUV4ZWN1dG9yUGFpciB0bXAgPSBsaXN0OworICAgICAgICAgICAgbGlzdCA9IGxpc3QubmV4dDsKKyAgICAgICAgICAgIHRtcC5uZXh0ID0gcmV2ZXJzZWRMaXN0OworICAgICAgICAgICAgcmV2ZXJzZWRMaXN0ID0gdG1wOworICAgICAgICB9CisgICAgICAgIHdoaWxlIChyZXZlcnNlZExpc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgZXhlY3V0ZUxpc3RlbmVyKHJldmVyc2VkTGlzdC5ydW5uYWJsZSwgcmV2ZXJzZWRMaXN0LmV4ZWN1dG9yKTsKKyAgICAgICAgICAgIHJldmVyc2VkTGlzdCA9IHJldmVyc2VkTGlzdC5uZXh0OworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUnVubmFibGVFeGVjdXRvclBhaXIgeworICAgICAgICBmaW5hbCBSdW5uYWJsZSBydW5uYWJsZTsKKyAgICAgICAgZmluYWwgRXhlY3V0b3IgZXhlY3V0b3I7CisgICAgICAgIFJ1bm5hYmxlRXhlY3V0b3JQYWlyIG5leHQ7CisKKyAgICAgICAgUnVubmFibGVFeGVjdXRvclBhaXIoUnVubmFibGUgcnVubmFibGUsIEV4ZWN1dG9yIGV4ZWN1dG9yLCBSdW5uYWJsZUV4ZWN1dG9yUGFpciBuZXh0KSB7CisgICAgICAgICAgICB0aGlzLnJ1bm5hYmxlID0gcnVubmFibGU7CisgICAgICAgICAgICB0aGlzLmV4ZWN1dG9yID0gZXhlY3V0b3I7CisgICAgICAgICAgICB0aGlzLm5leHQgPSBuZXh0OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9Gb3J3YXJkaW5nQ29sbGVjdGlvbi5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9Gb3J3YXJkaW5nQ29sbGVjdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMGRmZjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL0ZvcndhcmRpbmdDb2xsZWN0aW9uLmphdmEKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEd1YXZhIEF1dGhvcnMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKKy8qKgorICogQSBjb2xsZWN0aW9uIHdoaWNoIGZvcndhcmRzIGFsbCBpdHMgbWV0aG9kIGNhbGxzIHRvIGFub3RoZXIgY29sbGVjdGlvbi4KKyAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIG9uZSBvciBtb3JlIG1ldGhvZHMgdG8gbW9kaWZ5IHRoZSBiZWhhdmlvciBvZiB0aGUKKyAqIGJhY2tpbmcgY29sbGVjdGlvbiBhcyBkZXNpcmVkIHBlciB0aGUgPGEKKyAqIGhyZWY9Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGVjb3JhdG9yX3BhdHRlcm4iPmRlY29yYXRvciBwYXR0ZXJuPC9hPi4KKyAqIDxwPgorICogPHA+PGI+V2FybmluZzo8L2I+IFRoZSBtZXRob2RzIG9mIHtAY29kZSBGb3J3YXJkaW5nQ29sbGVjdGlvbn0gZm9yd2FyZAorICogPGI+aW5kaXNjcmltaW5hdGVseTwvYj4gdG8gdGhlIG1ldGhvZHMgb2YgdGhlIGRlbGVnYXRlLiBGb3IgZXhhbXBsZSwKKyAqIG92ZXJyaWRpbmcge0BsaW5rICNhZGR9IGFsb25lIDxiPndpbGwgbm90PC9iPiBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mIHtAbGluaworICogI2FkZEFsbH0sIHdoaWNoIGNhbiBsZWFkIHRvIHVuZXhwZWN0ZWQgYmVoYXZpb3IuIEluIHRoaXMgY2FzZSwgeW91IHNob3VsZAorICogb3ZlcnJpZGUge0Bjb2RlIGFkZEFsbH0gYXMgd2VsbCwgZWl0aGVyIHByb3ZpZGluZyB5b3VyIG93biBpbXBsZW1lbnRhdGlvbiwgb3IKKyAqIGRlbGVnYXRpbmcgdG8gdGhlIHByb3ZpZGVkIHtAY29kZSBzdGFuZGFyZEFkZEFsbH0gbWV0aG9kLgorICogPHA+CisgKiA8cD5UaGUge0Bjb2RlIHN0YW5kYXJkfSBtZXRob2RzIGFyZSBub3QgZ3VhcmFudGVlZCB0byBiZSB0aHJlYWQtc2FmZSwgZXZlbgorICogd2hlbiBhbGwgb2YgdGhlIG1ldGhvZHMgdGhhdCB0aGV5IGRlcGVuZCBvbiBhcmUgdGhyZWFkLXNhZmUuCisgKgorICogQGF1dGhvciBLZXZpbiBCb3VycmlsbGlvbgorICogQGF1dGhvciBMb3VpcyBXYXNzZXJtYW4KKyAqIEBzaW5jZSAyLjAgKGltcG9ydGVkIGZyb20gR29vZ2xlIENvbGxlY3Rpb25zIExpYnJhcnkpCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBGb3J3YXJkaW5nQ29sbGVjdGlvbjxFPiBleHRlbmRzIEZvcndhcmRpbmdPYmplY3QKKyAgICAgICAgaW1wbGVtZW50cyBDb2xsZWN0aW9uPEU+IHsKKyAgICAvLyBUT0RPKHVzZXIpOiBpZGVudGlmeSBwbGFjZXMgd2hlcmUgdGhyZWFkIHNhZmV0eSBpcyBhY3R1YWxseSBsb3N0CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgdXNlIGJ5IHN1YmNsYXNzZXMuCisgICAgICovCisgICAgRm9yd2FyZGluZ0NvbGxlY3Rpb24oKSB7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IENvbGxlY3Rpb248RT4gZGVsZWdhdGUoKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkuaXRlcmF0b3IoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZSgpLnNpemUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZSgpLnJlbW92ZUFsbChjb2xsZWN0aW9uKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS5pc0VtcHR5KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG9iamVjdCkgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS5jb250YWlucyhvYmplY3QpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGFkZChFIGVsZW1lbnQpIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkuYWRkKGVsZW1lbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3Qgb2JqZWN0KSB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZSgpLnJlbW92ZShvYmplY3QpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS5jb250YWluc0FsbChjb2xsZWN0aW9uKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gY29sbGVjdGlvbikgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS5hZGRBbGwoY29sbGVjdGlvbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbikgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS5yZXRhaW5BbGwoY29sbGVjdGlvbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIGRlbGVnYXRlKCkuY2xlYXIoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkudG9BcnJheSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gVFtdIHRvQXJyYXkoVFtdIGFycmF5KSB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZSgpLnRvQXJyYXkoYXJyYXkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9Gb3J3YXJkaW5nTWFwRW50cnkuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvRm9yd2FyZGluZ01hcEVudHJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y2YjFhZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvRm9yd2FyZGluZ01hcEVudHJ5LmphdmEKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEd1YXZhIEF1dGhvcnMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworCisvKioKKyAqIEEgbWFwIGVudHJ5IHdoaWNoIGZvcndhcmRzIGFsbCBpdHMgbWV0aG9kIGNhbGxzIHRvIGFub3RoZXIgbWFwIGVudHJ5LgorICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgb25lIG9yIG1vcmUgbWV0aG9kcyB0byBtb2RpZnkgdGhlIGJlaGF2aW9yIG9mIHRoZQorICogYmFja2luZyBtYXAgZW50cnkgYXMgZGVzaXJlZCBwZXIgdGhlIDxhCisgKiBocmVmPSJodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0RlY29yYXRvcl9wYXR0ZXJuIj5kZWNvcmF0b3IgcGF0dGVybjwvYT4uCisgKiA8cD4KKyAqIDxwPjxpPldhcm5pbmc6PC9pPiBUaGUgbWV0aG9kcyBvZiB7QGNvZGUgRm9yd2FyZGluZ01hcEVudHJ5fSBmb3J3YXJkCisgKiA8aT5pbmRpc2NyaW1pbmF0ZWx5PC9pPiB0byB0aGUgbWV0aG9kcyBvZiB0aGUgZGVsZWdhdGUuIEZvciBleGFtcGxlLAorICogb3ZlcnJpZGluZyB7QGxpbmsgI2dldFZhbHVlfSBhbG9uZSA8aT53aWxsIG5vdDwvaT4gY2hhbmdlIHRoZSBiZWhhdmlvciBvZgorICoge0BsaW5rICNlcXVhbHN9LCB3aGljaCBjYW4gbGVhZCB0byB1bmV4cGVjdGVkIGJlaGF2aW9yLiBJbiB0aGlzIGNhc2UsIHlvdQorICogc2hvdWxkIG92ZXJyaWRlIHtAY29kZSBlcXVhbHN9IGFzIHdlbGwsIGVpdGhlciBwcm92aWRpbmcgeW91ciBvd24KKyAqIGltcGxlbWVudGF0aW9uLCBvciBkZWxlZ2F0aW5nIHRvIHRoZSBwcm92aWRlZCB7QGNvZGUgc3RhbmRhcmRFcXVhbHN9IG1ldGhvZC4KKyAqIDxwPgorICogPHA+RWFjaCBvZiB0aGUge0Bjb2RlIHN0YW5kYXJkfSBtZXRob2RzLCB3aGVyZSBhcHByb3ByaWF0ZSwgdXNlIHtAbGluaworICogT2JqZWN0cyNlcXVhbH0gdG8gdGVzdCBlcXVhbGl0eSBmb3IgYm90aCBrZXlzIGFuZCB2YWx1ZXMuIFRoaXMgbWF5IG5vdCBiZQorICogdGhlIGRlc2lyZWQgYmVoYXZpb3IgZm9yIG1hcCBpbXBsZW1lbnRhdGlvbnMgdGhhdCB1c2Ugbm9uLXN0YW5kYXJkIG5vdGlvbnMgb2YKKyAqIGtleSBlcXVhbGl0eSwgc3VjaCBhcyB0aGUgZW50cnkgb2YgYSB7QGNvZGUgU29ydGVkTWFwfSB3aG9zZSBjb21wYXJhdG9yIGlzCisgKiBub3QgY29uc2lzdGVudCB3aXRoIHtAY29kZSBlcXVhbHN9LgorICogPHA+CisgKiA8cD5UaGUge0Bjb2RlIHN0YW5kYXJkfSBtZXRob2RzIGFyZSBub3QgZ3VhcmFudGVlZCB0byBiZSB0aHJlYWQtc2FmZSwgZXZlbgorICogd2hlbiBhbGwgb2YgdGhlIG1ldGhvZHMgdGhhdCB0aGV5IGRlcGVuZCBvbiBhcmUgdGhyZWFkLXNhZmUuCisgKgorICogQGF1dGhvciBNaWtlIEJvc3RvY2sKKyAqIEBhdXRob3IgTG91aXMgV2Fzc2VybWFuCisgKiBAc2luY2UgMi4wIChpbXBvcnRlZCBmcm9tIEdvb2dsZSBDb2xsZWN0aW9ucyBMaWJyYXJ5KQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRm9yd2FyZGluZ01hcEVudHJ5PEssIFY+CisgICAgICAgIGV4dGVuZHMgRm9yd2FyZGluZ09iamVjdCBpbXBsZW1lbnRzIEVudHJ5PEssIFY+IHsKKyAgICAvLyBUT0RPKHVzZXIpOiBpZGVudGlmeSBwbGFjZXMgd2hlcmUgdGhyZWFkIHNhZmV0eSBpcyBhY3R1YWxseSBsb3N0CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgdXNlIGJ5IHN1YmNsYXNzZXMuCisgICAgICovCisgICAgRm9yd2FyZGluZ01hcEVudHJ5KCkgeworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBhYnN0cmFjdCBFbnRyeTxLLCBWPiBkZWxlZ2F0ZSgpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEsgZ2V0S2V5KCkgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS5nZXRLZXkoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgViBnZXRWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkuZ2V0VmFsdWUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgViBzZXRWYWx1ZShWIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZSgpLnNldFZhbHVlKHZhbHVlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS5lcXVhbHMob2JqZWN0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS5oYXNoQ29kZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgc2Vuc2libGUgZGVmaW5pdGlvbiBvZiB7QGxpbmsgI2VxdWFscyhPYmplY3QpfSBpbiB0ZXJtcyBvZiB7QGxpbmsKKyAgICAgKiAjZ2V0S2V5KCl9IGFuZCB7QGxpbmsgI2dldFZhbHVlKCl9LiBJZiB5b3Ugb3ZlcnJpZGUgZWl0aGVyIG9mIHRoZXNlCisgICAgICogbWV0aG9kcywgeW91IG1heSB3aXNoIHRvIG92ZXJyaWRlIHtAbGluayAjZXF1YWxzKE9iamVjdCl9IHRvIGZvcndhcmQgdG8KKyAgICAgKiB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqCisgICAgICogQHNpbmNlIDcuMAorICAgICAqLworICAgIGJvb2xlYW4gc3RhbmRhcmRFcXVhbHMoT2JqZWN0IG9iamVjdCkgeworICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgRW50cnkpIHsKKyAgICAgICAgICAgIEVudHJ5PD8sID8+IHRoYXQgPSAoRW50cnk8PywgPz4pIG9iamVjdDsKKyAgICAgICAgICAgIHJldHVybiBPYmplY3RzLmVxdWFscyh0aGlzLmdldEtleSgpLCB0aGF0LmdldEtleSgpKQorICAgICAgICAgICAgICAgICAgICAmJiBPYmplY3RzLmVxdWFscyh0aGlzLmdldFZhbHVlKCksIHRoYXQuZ2V0VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9Gb3J3YXJkaW5nT2JqZWN0LmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL0ZvcndhcmRpbmdPYmplY3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODA4ZjAxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9Gb3J3YXJkaW5nT2JqZWN0LmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgR3VhdmEgQXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YTsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCisvKioKKyAqIEFuIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGltcGxlbWVudGluZyB0aGUgPGEKKyAqIGhyZWY9Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGVjb3JhdG9yX3BhdHRlcm4iPmRlY29yYXRvciBwYXR0ZXJuPC9hPi4KKyAqIFRoZSB7QGxpbmsgI2RlbGVnYXRlKCl9IG1ldGhvZCBtdXN0IGJlIG92ZXJyaWRkZW4gdG8gcmV0dXJuIHRoZSBpbnN0YW5jZQorICogYmVpbmcgZGVjb3JhdGVkLgorICogPHA+CisgKiA8cD5UaGlzIGNsYXNzIGRvZXMgPGk+bm90PC9pPiBmb3J3YXJkIHRoZSB7QGNvZGUgaGFzaENvZGV9IGFuZCB7QGNvZGUgZXF1YWxzfQorICogbWV0aG9kcyB0aHJvdWdoIHRvIHRoZSBiYWNraW5nIG9iamVjdCwgYnV0IHJlbGllcyBvbiB7QGNvZGUgT2JqZWN0fSdzCisgKiBpbXBsZW1lbnRhdGlvbi4gVGhpcyBpcyBuZWNlc3NhcnkgdG8gcHJlc2VydmUgdGhlIHN5bW1ldHJ5IG9mIHtAY29kZSBlcXVhbHN9LgorICogQ3VzdG9tIGRlZmluaXRpb25zIG9mIGVxdWFsaXR5IGFyZSB1c3VhbGx5IGJhc2VkIG9uIGFuIGludGVyZmFjZSwgc3VjaCBhcworICoge0Bjb2RlIFNldH0gb3Ige0Bjb2RlIExpc3R9LCBzbyB0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB7QGNvZGUgZXF1YWxzfSBjYW4KKyAqIGNhc3QgdGhlIG9iamVjdCBiZWluZyB0ZXN0ZWQgZm9yIGVxdWFsaXR5IHRvIHRoZSBjdXN0b20gaW50ZXJmYWNlLiB7QGNvZGUKKyAqIEZvcndhcmRpbmdPYmplY3R9IGltcGxlbWVudHMgbm8gc3VjaCBjdXN0b20gaW50ZXJmYWNlcyBkaXJlY3RseTsgdGhleQorICogYXJlIGltcGxlbWVudGVkIG9ubHkgaW4gc3ViY2xhc3Nlcy4gVGhlcmVmb3JlLCBmb3J3YXJkaW5nIHtAY29kZSBlcXVhbHN9CisgKiB3b3VsZCBicmVhayBzeW1tZXRyeSwgYXMgdGhlIGZvcndhcmRpbmcgb2JqZWN0IG1pZ2h0IGNvbnNpZGVyIGl0c2VsZiBlcXVhbCB0bworICogdGhlIG9iamVjdCBiZWluZyB0ZXN0ZWQsIGJ1dCB0aGUgcmV2ZXJzZSBjb3VsZCBub3QgYmUgdHJ1ZS4gVGhpcyBiZWhhdmlvciBpcworICogY29uc2lzdGVudCB3aXRoIHRoZSBKREsncyBjb2xsZWN0aW9uIHdyYXBwZXJzLCBzdWNoIGFzCisgKiB7QGxpbmsgamF2YS51dGlsLkNvbGxlY3Rpb25zI3VubW9kaWZpYWJsZUNvbGxlY3Rpb259LiBVc2UgYW4KKyAqIGludGVyZmFjZS1zcGVjaWZpYyBzdWJjbGFzcyBvZiB7QGNvZGUgRm9yd2FyZGluZ09iamVjdH0sIHN1Y2ggYXMge0BsaW5rCisgKiBGb3J3YXJkaW5nTGlzdH0sIHRvIHByZXNlcnZlIGVxdWFsaXR5IGJlaGF2aW9yLCBvciBvdmVycmlkZSB7QGNvZGUgZXF1YWxzfQorICogZGlyZWN0bHkuCisgKiA8cD4KKyAqIDxwPlRoZSB7QGNvZGUgdG9TdHJpbmd9IG1ldGhvZCBpcyBmb3J3YXJkZWQgdG8gdGhlIGRlbGVnYXRlLiBBbHRob3VnaCB0aGlzCisgKiBjbGFzcyBkb2VzIG5vdCBpbXBsZW1lbnQge0BsaW5rIFNlcmlhbGl6YWJsZX0sIGEgc2VyaWFsaXphYmxlIHN1YmNsYXNzIG1heSBiZQorICogY3JlYXRlZCBzaW5jZSB0aGlzIGNsYXNzIGhhcyBhIHBhcmFtZXRlci1sZXNzIGNvbnN0cnVjdG9yLgorICoKKyAqIEBhdXRob3IgTWlrZSBCb3N0b2NrCisgKiBAc2luY2UgMi4wIChpbXBvcnRlZCBmcm9tIEdvb2dsZSBDb2xsZWN0aW9ucyBMaWJyYXJ5KQorICovCithYnN0cmFjdCBjbGFzcyBGb3J3YXJkaW5nT2JqZWN0IHsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciB1c2UgYnkgc3ViY2xhc3Nlcy4KKyAgICAgKi8KKyAgICBGb3J3YXJkaW5nT2JqZWN0KCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGJhY2tpbmcgZGVsZWdhdGUgaW5zdGFuY2UgdGhhdCBtZXRob2RzIGFyZSBmb3J3YXJkZWQgdG8uCisgICAgICogQWJzdHJhY3Qgc3ViY2xhc3NlcyBnZW5lcmFsbHkgb3ZlcnJpZGUgdGhpcyBtZXRob2Qgd2l0aCBhbiBhYnN0cmFjdCBtZXRob2QKKyAgICAgKiB0aGF0IGhhcyBhIG1vcmUgc3BlY2lmaWMgcmV0dXJuIHR5cGUsIHN1Y2ggYXMge0BsaW5rCisgICAgICogRm9yd2FyZGluZ1NldCNkZWxlZ2F0ZX0uIENvbmNyZXRlIHN1YmNsYXNzZXMgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gc3VwcGx5CisgICAgICogdGhlIGluc3RhbmNlIGJlaW5nIGRlY29yYXRlZC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgT2JqZWN0IGRlbGVnYXRlKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gZ2VuZXJhdGVkIGJ5IHRoZSBkZWxlZ2F0ZSdzCisgICAgICoge0Bjb2RlIHRvU3RyaW5nfSBtZXRob2QuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgLyogTm8gZXF1YWxzIG9yIGhhc2hDb2RlLiBTZWUgY2xhc3MgY29tbWVudHMgZm9yIGRldGFpbHMuICovCit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL0ZvcndhcmRpbmdTZXQuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvRm9yd2FyZGluZ1NldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMTg1YjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL0ZvcndhcmRpbmdTZXQuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBHdWF2YSBBdXRob3JzCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhOworCitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiBBIHNldCB3aGljaCBmb3J3YXJkcyBhbGwgaXRzIG1ldGhvZCBjYWxscyB0byBhbm90aGVyIHNldC4gU3ViY2xhc3NlcyBzaG91bGQKKyAqIG92ZXJyaWRlIG9uZSBvciBtb3JlIG1ldGhvZHMgdG8gbW9kaWZ5IHRoZSBiZWhhdmlvciBvZiB0aGUgYmFja2luZyBzZXQgYXMKKyAqIGRlc2lyZWQgcGVyIHRoZSA8YQorICogaHJlZj0iaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9EZWNvcmF0b3JfcGF0dGVybiI+ZGVjb3JhdG9yIHBhdHRlcm48L2E+LgorICogPHA+CisgKiA8cD48Yj5XYXJuaW5nOjwvYj4gVGhlIG1ldGhvZHMgb2Yge0Bjb2RlIEZvcndhcmRpbmdTZXR9IGZvcndhcmQKKyAqIDxiPmluZGlzY3JpbWluYXRlbHk8L2I+IHRvIHRoZSBtZXRob2RzIG9mIHRoZSBkZWxlZ2F0ZS4gRm9yIGV4YW1wbGUsCisgKiBvdmVycmlkaW5nIHtAbGluayAjYWRkfSBhbG9uZSA8Yj53aWxsIG5vdDwvYj4gY2hhbmdlIHRoZSBiZWhhdmlvciBvZiB7QGxpbmsKKyAqICNhZGRBbGx9LCB3aGljaCBjYW4gbGVhZCB0byB1bmV4cGVjdGVkIGJlaGF2aW9yLiBJbiB0aGlzIGNhc2UsIHlvdSBzaG91bGQKKyAqIG92ZXJyaWRlIHtAY29kZSBhZGRBbGx9IGFzIHdlbGwsIGVpdGhlciBwcm92aWRpbmcgeW91ciBvd24gaW1wbGVtZW50YXRpb24sIG9yCisgKiBkZWxlZ2F0aW5nIHRvIHRoZSBwcm92aWRlZCB7QGNvZGUgc3RhbmRhcmRBZGRBbGx9IG1ldGhvZC4KKyAqIDxwPgorICogPHA+VGhlIHtAY29kZSBzdGFuZGFyZH0gbWV0aG9kcyBhcmUgbm90IGd1YXJhbnRlZWQgdG8gYmUgdGhyZWFkLXNhZmUsIGV2ZW4KKyAqIHdoZW4gYWxsIG9mIHRoZSBtZXRob2RzIHRoYXQgdGhleSBkZXBlbmQgb24gYXJlIHRocmVhZC1zYWZlLgorICoKKyAqIEBhdXRob3IgS2V2aW4gQm91cnJpbGxpb24KKyAqIEBhdXRob3IgTG91aXMgV2Fzc2VybWFuCisgKiBAc2luY2UgMi4wIChpbXBvcnRlZCBmcm9tIEdvb2dsZSBDb2xsZWN0aW9ucyBMaWJyYXJ5KQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRm9yd2FyZGluZ1NldDxFPiBleHRlbmRzIEZvcndhcmRpbmdDb2xsZWN0aW9uPEU+CisgICAgICAgIGltcGxlbWVudHMgU2V0PEU+IHsKKyAgICAvLyBUT0RPKHVzZXIpOiBpZGVudGlmeSBwbGFjZXMgd2hlcmUgdGhyZWFkIHNhZmV0eSBpcyBhY3R1YWxseSBsb3N0CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgdXNlIGJ5IHN1YmNsYXNzZXMuCisgICAgICovCisgICAgRm9yd2FyZGluZ1NldCgpIHsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU2V0PEU+IGRlbGVnYXRlKCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgeworICAgICAgICByZXR1cm4gb2JqZWN0ID09IHRoaXMgfHwgZGVsZWdhdGUoKS5lcXVhbHMob2JqZWN0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS5oYXNoQ29kZSgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9Gb3J3YXJkaW5nU29ydGVkU2V0LmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL0ZvcndhcmRpbmdTb3J0ZWRTZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGI1ZDJkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9Gb3J3YXJkaW5nU29ydGVkU2V0LmphdmEKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgR3VhdmEgQXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YTsKKworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7CisKKy8qKgorICogQSBzb3J0ZWQgc2V0IHdoaWNoIGZvcndhcmRzIGFsbCBpdHMgbWV0aG9kIGNhbGxzIHRvIGFub3RoZXIgc29ydGVkIHNldC4KKyAqIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIG9uZSBvciBtb3JlIG1ldGhvZHMgdG8gbW9kaWZ5IHRoZSBiZWhhdmlvciBvZiB0aGUKKyAqIGJhY2tpbmcgc29ydGVkIHNldCBhcyBkZXNpcmVkIHBlciB0aGUgPGEKKyAqIGhyZWY9Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRGVjb3JhdG9yX3BhdHRlcm4iPmRlY29yYXRvciBwYXR0ZXJuPC9hPi4KKyAqIDxwPgorICogPHA+PGk+V2FybmluZzo8L2k+IFRoZSBtZXRob2RzIG9mIHtAY29kZSBGb3J3YXJkaW5nU29ydGVkU2V0fSBmb3J3YXJkCisgKiA8aT5pbmRpc2NyaW1pbmF0ZWx5PC9pPiB0byB0aGUgbWV0aG9kcyBvZiB0aGUgZGVsZWdhdGUuIEZvciBleGFtcGxlLAorICogb3ZlcnJpZGluZyB7QGxpbmsgI2FkZH0gYWxvbmUgPGk+d2lsbCBub3Q8L2k+IGNoYW5nZSB0aGUgYmVoYXZpb3Igb2Yge0BsaW5rCisgKiAjYWRkQWxsfSwgd2hpY2ggY2FuIGxlYWQgdG8gdW5leHBlY3RlZCBiZWhhdmlvci4gSW4gdGhpcyBjYXNlLCB5b3Ugc2hvdWxkCisgKiBvdmVycmlkZSB7QGNvZGUgYWRkQWxsfSBhcyB3ZWxsLCBlaXRoZXIgcHJvdmlkaW5nIHlvdXIgb3duIGltcGxlbWVudGF0aW9uLCBvcgorICogZGVsZWdhdGluZyB0byB0aGUgcHJvdmlkZWQge0Bjb2RlIHN0YW5kYXJkQWRkQWxsfSBtZXRob2QuCisgKiA8cD4KKyAqIDxwPkVhY2ggb2YgdGhlIHtAY29kZSBzdGFuZGFyZH0gbWV0aG9kcywgd2hlcmUgYXBwcm9wcmlhdGUsIHVzZXMgdGhlIHNldCdzCisgKiBjb21wYXJhdG9yIChvciB0aGUgbmF0dXJhbCBvcmRlcmluZyBvZiB0aGUgZWxlbWVudHMsIGlmIHRoZXJlIGlzIG5vCisgKiBjb21wYXJhdG9yKSB0byB0ZXN0IGVsZW1lbnQgZXF1YWxpdHkuIEFzIGEgcmVzdWx0LCBpZiB0aGUgY29tcGFyYXRvciBpcyBub3QKKyAqIGNvbnNpc3RlbnQgd2l0aCBlcXVhbHMsIHNvbWUgb2YgdGhlIHN0YW5kYXJkIGltcGxlbWVudGF0aW9ucyBtYXkgdmlvbGF0ZSB0aGUKKyAqIHtAY29kZSBTZXR9IGNvbnRyYWN0LgorICogPHA+CisgKiA8cD5UaGUge0Bjb2RlIHN0YW5kYXJkfSBtZXRob2RzIGFuZCB0aGUgY29sbGVjdGlvbiB2aWV3cyB0aGV5IHJldHVybiBhcmUgbm90CisgKiBndWFyYW50ZWVkIHRvIGJlIHRocmVhZC1zYWZlLCBldmVuIHdoZW4gYWxsIG9mIHRoZSBtZXRob2RzIHRoYXQgdGhleSBkZXBlbmQKKyAqIG9uIGFyZSB0aHJlYWQtc2FmZS4KKyAqCisgKiBAYXV0aG9yIE1pa2UgQm9zdG9jaworICogQGF1dGhvciBMb3VpcyBXYXNzZXJtYW4KKyAqIEBzaW5jZSAyLjAgKGltcG9ydGVkIGZyb20gR29vZ2xlIENvbGxlY3Rpb25zIExpYnJhcnkpCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBGb3J3YXJkaW5nU29ydGVkU2V0PEU+IGV4dGVuZHMgRm9yd2FyZGluZ1NldDxFPgorICAgICAgICBpbXBsZW1lbnRzIFNvcnRlZFNldDxFPiB7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgdXNlIGJ5IHN1YmNsYXNzZXMuCisgICAgICovCisgICAgRm9yd2FyZGluZ1NvcnRlZFNldCgpIHsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU29ydGVkU2V0PEU+IGRlbGVnYXRlKCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29tcGFyYXRvcjw/IHN1cGVyIEU+IGNvbXBhcmF0b3IoKSB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZSgpLmNvbXBhcmF0b3IoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRSBmaXJzdCgpIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkuZmlyc3QoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU29ydGVkU2V0PEU+IGhlYWRTZXQoRSB0b0VsZW1lbnQpIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkuaGVhZFNldCh0b0VsZW1lbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBFIGxhc3QoKSB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZSgpLmxhc3QoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU29ydGVkU2V0PEU+IHN1YlNldChFIGZyb21FbGVtZW50LCBFIHRvRWxlbWVudCkgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS5zdWJTZXQoZnJvbUVsZW1lbnQsIHRvRWxlbWVudCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNvcnRlZFNldDxFPiB0YWlsU2V0KEUgZnJvbUVsZW1lbnQpIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlKCkudGFpbFNldChmcm9tRWxlbWVudCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL0Z1dHVyZXMuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvRnV0dXJlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlYzMxOTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL0Z1dHVyZXMuamF2YQpAQCAtMCwwICsxLDM0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNiBUaGUgR3VhdmEgQXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YTsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlVuZGVjbGFyZWRUaHJvd2FibGVFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FuY2VsbGF0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IHN0YXRpYyBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKKworLyoqCisgKiBTdGF0aWMgdXRpbGl0eSBtZXRob2RzIHBlcnRhaW5pbmcgdG8gdGhlIHtAbGluayBGdXR1cmV9IGludGVyZmFjZS4KKyAqIDxwPgorICogPHA+TWFueSBvZiB0aGVzZSBtZXRob2RzIHVzZSB0aGUge0BsaW5rIExpc3RlbmFibGVGdXR1cmV9IEFQSTsgY29uc3VsdCB0aGUKKyAqIEd1YXZhIFVzZXIgR3VpZGUgYXJ0aWNsZSBvbiA8YSBocmVmPQorICogImh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9ndWF2YS1saWJyYXJpZXMvd2lraS9MaXN0ZW5hYmxlRnV0dXJlRXhwbGFpbmVkIj4KKyAqIHtAY29kZSBMaXN0ZW5hYmxlRnV0dXJlfTwvYT4uCisgKgorICogQGF1dGhvciBLZXZpbiBCb3VycmlsbGlvbgorICogQGF1dGhvciBOaXNoYW50IFRoYWtrYXIKKyAqIEBhdXRob3IgU3ZlbiBNYXdzb24KKyAqIEBzaW5jZSAxLjAKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEZ1dHVyZXMgeworICAgIHByaXZhdGUgRnV0dXJlcygpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEge0Bjb2RlIExpc3RlbmFibGVGdXR1cmV9IHdoaWNoIGhhcyBpdHMgdmFsdWUgc2V0IGltbWVkaWF0ZWx5IHVwb24KKyAgICAgKiBjb25zdHJ1Y3Rpb24uIFRoZSBnZXR0ZXJzIGp1c3QgcmV0dXJuIHRoZSB2YWx1ZS4gVGhpcyB7QGNvZGUgRnV0dXJlfSBjYW4ndAorICAgICAqIGJlIGNhbmNlbGVkIG9yIHRpbWVkIG91dCBhbmQgaXRzIHtAY29kZSBpc0RvbmUoKX0gbWV0aG9kIGFsd2F5cyByZXR1cm5zCisgICAgICoge0Bjb2RlIHRydWV9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFY+IExpc3RlbmFibGVGdXR1cmU8Vj4gaW1tZWRpYXRlRnV0dXJlKFYgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJbW1lZGlhdGVTdWNjZXNzZnVsRnV0dXJlPFY+KHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEge0Bjb2RlIExpc3RlbmFibGVGdXR1cmV9IHdoaWNoIGhhcyBhbiBleGNlcHRpb24gc2V0IGltbWVkaWF0ZWx5CisgICAgICogdXBvbiBjb25zdHJ1Y3Rpb24uCisgICAgICogPHA+CisgICAgICogPHA+VGhlIHJldHVybmVkIHtAY29kZSBGdXR1cmV9IGNhbid0IGJlIGNhbmNlbGxlZCwgYW5kIGl0cyB7QGNvZGUgaXNEb25lKCl9CisgICAgICogbWV0aG9kIGFsd2F5cyByZXR1cm5zIHtAY29kZSB0cnVlfS4gQ2FsbGluZyB7QGNvZGUgZ2V0KCl9IHdpbGwgaW1tZWRpYXRlbHkKKyAgICAgKiB0aHJvdyB0aGUgcHJvdmlkZWQge0Bjb2RlIFRocm93YWJsZX0gd3JhcHBlZCBpbiBhbiB7QGNvZGUKKyAgICAgKiBFeGVjdXRpb25FeGNlcHRpb259LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFY+IExpc3RlbmFibGVGdXR1cmU8Vj4gaW1tZWRpYXRlRmFpbGVkRnV0dXJlKAorICAgICAgICAgICAgVGhyb3dhYmxlIHRocm93YWJsZSkgeworICAgICAgICBjaGVja05vdE51bGwodGhyb3dhYmxlKTsKKyAgICAgICAgcmV0dXJuIG5ldyBJbW1lZGlhdGVGYWlsZWRGdXR1cmU8Vj4odGhyb3dhYmxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmV3IHtAY29kZSBMaXN0ZW5hYmxlRnV0dXJlfSB3aG9zZSByZXN1bHQgaXMgdGhlIHByb2R1Y3Qgb2YKKyAgICAgKiBhcHBseWluZyB0aGUgZ2l2ZW4ge0Bjb2RlIEZ1bmN0aW9ufSB0byB0aGUgcmVzdWx0IG9mIHRoZSBnaXZlbiB7QGNvZGUKKyAgICAgKiBGdXR1cmV9LiBFeGFtcGxlOgorICAgICAqIDxwPgorICAgICAqIDxwcmU+ICAge0Bjb2RlCisgICAgICogICBMaXN0ZW5hYmxlRnV0dXJlPFF1ZXJ5UmVzdWx0PiBxdWVyeUZ1dHVyZSA9IC4uLjsKKyAgICAgKiAgIEZ1bmN0aW9uPFF1ZXJ5UmVzdWx0LCBMaXN0PFJvdz4+IHJvd3NGdW5jdGlvbiA9CisgICAgICogICAgICAgbmV3IEZ1bmN0aW9uPFF1ZXJ5UmVzdWx0LCBMaXN0PFJvdz4+KCkgeworICAgICAqICAgICAgICAgcHVibGljIExpc3Q8Um93PiBhcHBseShRdWVyeVJlc3VsdCBxdWVyeVJlc3VsdCkgeworICAgICAqICAgICAgICAgICByZXR1cm4gcXVlcnlSZXN1bHQuZ2V0Um93cygpOworICAgICAqICAgICAgICAgfQorICAgICAqICAgICAgIH07CisgICAgICogICBMaXN0ZW5hYmxlRnV0dXJlPExpc3Q8Um93Pj4gcm93c0Z1dHVyZSA9CisgICAgICogICAgICAgdHJhbnNmb3JtKHF1ZXJ5RnV0dXJlLCByb3dzRnVuY3Rpb24pO308L3ByZT4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5Ob3RlOiBJZiB0aGUgdHJhbnNmb3JtYXRpb24gaXMgc2xvdyBvciBoZWF2eXdlaWdodCwgY29uc2lkZXIge0BsaW5rcGxhaW4KKyAgICAgKiAjdHJhbnNmb3JtKExpc3RlbmFibGVGdXR1cmUsIEZ1bmN0aW9uLCBFeGVjdXRvcikgc3VwcGx5aW5nIGFuIGV4ZWN1dG9yfS4KKyAgICAgKiBJZiB5b3UgZG8gbm90IHN1cHBseSBhbiBleGVjdXRvciwge0Bjb2RlIHRyYW5zZm9ybX0gd2lsbCB1c2UgYW4gaW5saW5lCisgICAgICogZXhlY3V0b3IsIHdoaWNoIGNhcnJpZXMgc29tZSBjYXZlYXRzIGZvciBoZWF2aWVyIG9wZXJhdGlvbnMuICBGb3IgZXhhbXBsZSwKKyAgICAgKiB0aGUgY2FsbCB0byB7QGNvZGUgZnVuY3Rpb24uYXBwbHl9IG1heSBydW4gb24gYW4gdW5wcmVkaWN0YWJsZSBvcgorICAgICAqIHVuZGVzaXJhYmxlIHRocmVhZDoKKyAgICAgKiA8cD4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPklmIHRoZSBpbnB1dCB7QGNvZGUgRnV0dXJlfSBpcyBkb25lIGF0IHRoZSB0aW1lIHtAY29kZSB0cmFuc2Zvcm19IGlzCisgICAgICogY2FsbGVkLCB7QGNvZGUgdHJhbnNmb3JtfSB3aWxsIGNhbGwge0Bjb2RlIGZ1bmN0aW9uLmFwcGx5fSBpbmxpbmUuCisgICAgICogPGxpPklmIHRoZSBpbnB1dCB7QGNvZGUgRnV0dXJlfSBpcyBub3QgeWV0IGRvbmUsIHtAY29kZSB0cmFuc2Zvcm19IHdpbGwKKyAgICAgKiBzY2hlZHVsZSB7QGNvZGUgZnVuY3Rpb24uYXBwbHl9IHRvIGJlIHJ1biBieSB0aGUgdGhyZWFkIHRoYXQgY29tcGxldGVzIHRoZQorICAgICAqIGlucHV0IHtAY29kZSBGdXR1cmV9LCB3aGljaCBtYXkgYmUgYW4gaW50ZXJuYWwgc3lzdGVtIHRocmVhZCBzdWNoIGFzIGFuCisgICAgICogUlBDIG5ldHdvcmsgdGhyZWFkLgorICAgICAqIDwvdWw+CisgICAgICogPHA+CisgICAgICogPHA+QWxzbyBub3RlIHRoYXQsIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggdGhyZWFkIGV4ZWN1dGVzIHRoZSB7QGNvZGUKKyAgICAgKiBmdW5jdGlvbi5hcHBseX0sIGFsbCBvdGhlciByZWdpc3RlcmVkIGJ1dCB1bmV4ZWN1dGVkIGxpc3RlbmVycyBhcmUKKyAgICAgKiBwcmV2ZW50ZWQgZnJvbSBydW5uaW5nIGR1cmluZyBpdHMgZXhlY3V0aW9uLCBldmVuIGlmIHRob3NlIGxpc3RlbmVycyBhcmUKKyAgICAgKiB0byBydW4gaW4gb3RoZXIgZXhlY3V0b3JzLgorICAgICAqIDxwPgorICAgICAqIDxwPlRoZSByZXR1cm5lZCB7QGNvZGUgRnV0dXJlfSBhdHRlbXB0cyB0byBrZWVwIGl0cyBjYW5jZWxsYXRpb24gc3RhdGUgaW4KKyAgICAgKiBzeW5jIHdpdGggdGhhdCBvZiB0aGUgaW5wdXQgZnV0dXJlLiBUaGF0IGlzLCBpZiB0aGUgcmV0dXJuZWQge0Bjb2RlIEZ1dHVyZX0KKyAgICAgKiBpcyBjYW5jZWxsZWQsIGl0IHdpbGwgYXR0ZW1wdCB0byBjYW5jZWwgdGhlIGlucHV0LCBhbmQgaWYgdGhlIGlucHV0IGlzCisgICAgICogY2FuY2VsbGVkLCB0aGUgcmV0dXJuZWQge0Bjb2RlIEZ1dHVyZX0gd2lsbCByZWNlaXZlIGEgY2FsbGJhY2sgaW4gd2hpY2ggaXQKKyAgICAgKiB3aWxsIGF0dGVtcHQgdG8gY2FuY2VsIGl0c2VsZi4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5BbiBleGFtcGxlIHVzZSBvZiB0aGlzIG1ldGhvZCBpcyB0byBjb252ZXJ0IGEgc2VyaWFsaXphYmxlIG9iamVjdAorICAgICAqIHJldHVybmVkIGZyb20gYW4gUlBDIGludG8gYSBQT0pPLgorICAgICAqCisgICAgICogQHBhcmFtIGlucHV0ICAgIFRoZSBmdXR1cmUgdG8gdHJhbnNmb3JtCisgICAgICogQHBhcmFtIGZ1bmN0aW9uIEEgRnVuY3Rpb24gdG8gdHJhbnNmb3JtIHRoZSByZXN1bHRzIG9mIHRoZSBwcm92aWRlZCBmdXR1cmUKKyAgICAgKiAgICAgICAgICAgICAgICAgdG8gdGhlIHJlc3VsdHMgb2YgdGhlIHJldHVybmVkIGZ1dHVyZS4gIFRoaXMgd2lsbCBiZSBydW4gaW4gdGhlIHRocmVhZAorICAgICAqICAgICAgICAgICAgICAgICB0aGF0IG5vdGlmaWVzIGlucHV0IGl0IGlzIGNvbXBsZXRlLgorICAgICAqIEByZXR1cm4gQSBmdXR1cmUgdGhhdCBob2xkcyByZXN1bHQgb2YgdGhlIHRyYW5zZm9ybWF0aW9uLgorICAgICAqIEBzaW5jZSA5LjAgKGluIDEuMCBhcyB7QGNvZGUgY29tcG9zZX0pCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8SSwgTz4gTGlzdGVuYWJsZUZ1dHVyZTxPPiB0cmFuc2Zvcm0oTGlzdGVuYWJsZUZ1dHVyZTxJPiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBGdW5jdGlvbjw/IHN1cGVyIEksID8gZXh0ZW5kcyBPPiBmdW5jdGlvbikgeworICAgICAgICBjaGVja05vdE51bGwoZnVuY3Rpb24pOworICAgICAgICBDaGFpbmluZ0xpc3RlbmFibGVGdXR1cmU8SSwgTz4gb3V0cHV0ID0KKyAgICAgICAgICAgICAgICBuZXcgQ2hhaW5pbmdMaXN0ZW5hYmxlRnV0dXJlPEksIE8+KGFzQXN5bmNGdW5jdGlvbihmdW5jdGlvbiksIGlucHV0KTsKKyAgICAgICAgaW5wdXQuYWRkTGlzdGVuZXIob3V0cHV0LCBNb3JlRXhlY3V0b3JzLmRpcmVjdEV4ZWN1dG9yKCkpOworICAgICAgICByZXR1cm4gb3V0cHV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyYXBzIHRoZSBnaXZlbiBmdW5jdGlvbiBhcyBhbiBBc3luY0Z1bmN0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIDxJLCBPPiBBc3luY0Z1bmN0aW9uPEksIE8+IGFzQXN5bmNGdW5jdGlvbigKKyAgICAgICAgICAgIGZpbmFsIEZ1bmN0aW9uPD8gc3VwZXIgSSwgPyBleHRlbmRzIE8+IGZ1bmN0aW9uKSB7CisgICAgICAgIHJldHVybiBuZXcgQXN5bmNGdW5jdGlvbjxJLCBPPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIExpc3RlbmFibGVGdXR1cmU8Tz4gYXBwbHkoSSBpbnB1dCkgeworICAgICAgICAgICAgICAgIE8gb3V0cHV0ID0gZnVuY3Rpb24uYXBwbHkoaW5wdXQpOworICAgICAgICAgICAgICAgIHJldHVybiBpbW1lZGlhdGVGdXR1cmUob3V0cHV0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBwcml2YXRlIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBJbW1lZGlhdGVGdXR1cmU8Vj4KKyAgICAgICAgICAgIGltcGxlbWVudHMgTGlzdGVuYWJsZUZ1dHVyZTxWPiB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9CisgICAgICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihJbW1lZGlhdGVGdXR1cmUuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoUnVubmFibGUgbGlzdGVuZXIsIEV4ZWN1dG9yIGV4ZWN1dG9yKSB7CisgICAgICAgICAgICBjaGVja05vdE51bGwobGlzdGVuZXIsICJSdW5uYWJsZSB3YXMgbnVsbC4iKTsKKyAgICAgICAgICAgIGNoZWNrTm90TnVsbChleGVjdXRvciwgIkV4ZWN1dG9yIHdhcyBudWxsLiIpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBleGVjdXRvci5leGVjdXRlKGxpc3RlbmVyKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIExpc3RlbmFibGVGdXR1cmUncyBjb250cmFjdCBpcyB0aGF0IGl0IHdpbGwgbm90IHRocm93IHVuY2hlY2tlZAorICAgICAgICAgICAgICAgIC8vIGV4Y2VwdGlvbnMsIHNvIGxvZyB0aGUgYmFkIHJ1bm5hYmxlIGFuZC9vciBleGVjdXRvciBhbmQgc3dhbGxvdyBpdC4KKyAgICAgICAgICAgICAgICBsb2cubG9nKExldmVsLlNFVkVSRSwgIlJ1bnRpbWVFeGNlcHRpb24gd2hpbGUgZXhlY3V0aW5nIHJ1bm5hYmxlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgbGlzdGVuZXIgKyAiIHdpdGggZXhlY3V0b3IgIiArIGV4ZWN1dG9yLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBjYW5jZWwoYm9vbGVhbiBtYXlJbnRlcnJ1cHRJZlJ1bm5pbmcpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYWJzdHJhY3QgViBnZXQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgViBnZXQobG9uZyB0aW1lb3V0LCBUaW1lVW5pdCB1bml0KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGNoZWNrTm90TnVsbCh1bml0KTsKKyAgICAgICAgICAgIHJldHVybiBnZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0NhbmNlbGxlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0RvbmUoKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEltbWVkaWF0ZVN1Y2Nlc3NmdWxGdXR1cmU8Vj4gZXh0ZW5kcyBJbW1lZGlhdGVGdXR1cmU8Vj4geworCisgICAgICAgIHByaXZhdGUgZmluYWwgViB2YWx1ZTsKKworICAgICAgICBJbW1lZGlhdGVTdWNjZXNzZnVsRnV0dXJlKFYgdmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgViBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJbW1lZGlhdGVGYWlsZWRGdXR1cmU8Vj4gZXh0ZW5kcyBJbW1lZGlhdGVGdXR1cmU8Vj4geworCisgICAgICAgIHByaXZhdGUgZmluYWwgVGhyb3dhYmxlIHRocm93bjsKKworICAgICAgICBJbW1lZGlhdGVGYWlsZWRGdXR1cmUoVGhyb3dhYmxlIHRocm93bikgeworICAgICAgICAgICAgdGhpcy50aHJvd24gPSB0aHJvd247CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFYgZ2V0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXhlY3V0aW9uRXhjZXB0aW9uKHRocm93bik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGNvZGUgTGlzdGVuYWJsZUZ1dHVyZX0gdGhhdCBhbHNvIGltcGxlbWVudHMKKyAgICAgKiB7QGNvZGUgUnVubmFibGV9IHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgdG8gbmVzdCBMaXN0ZW5hYmxlRnV0dXJlcy4KKyAgICAgKiBPbmNlIHRoZSBwYXNzZWQtaW4ge0Bjb2RlIExpc3RlbmFibGVGdXR1cmV9IGlzIGNvbXBsZXRlLCBpdCBjYWxscyB0aGUKKyAgICAgKiBwYXNzZWQtaW4ge0Bjb2RlIEZ1bmN0aW9ufSB0byBnZW5lcmF0ZSB0aGUgcmVzdWx0LgorICAgICAqIDxwPgorICAgICAqIDxwPkZvciBoaXN0b3JpY2FsIHJlYXNvbnMsIHRoaXMgY2xhc3MgaGFzIGEgc3BlY2lhbCBjYXNlIGluIGl0cyBleGNlcHRpb24KKyAgICAgKiBoYW5kbGluZzogSWYgdGhlIGdpdmVuIHtAY29kZSBBc3luY0Z1bmN0aW9ufSB0aHJvd3MgYW4ge0Bjb2RlCisgICAgICogVW5kZWNsYXJlZFRocm93YWJsZUV4Y2VwdGlvbn0sIHtAY29kZSBDaGFpbmluZ0xpc3RlbmFibGVGdXR1cmV9IHVud3JhcHMgaXQKKyAgICAgKiBhbmQgdXNlcyBpdHMgPGk+Y2F1c2U8L2k+IGFzIHRoZSBvdXRwdXQgZnV0dXJlJ3MgZXhjZXB0aW9uLCByYXRoZXIgdGhhbgorICAgICAqIHVzaW5nIHRoZSB7QGNvZGUgVW5kZWNsYXJlZFRocm93YWJsZUV4Y2VwdGlvbn0gaXRzZWxmIGFzIGl0IHdvdWxkIGZvciBvdGhlcgorICAgICAqIGV4Y2VwdGlvbiB0eXBlcy4gVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyB0aGF0IHtAY29kZSBGdXR1cmVzLnRyYW5zZm9ybX0gdXNlZAorICAgICAqIHRvIHJlcXVpcmUgYSB7QGNvZGUgRnVuY3Rpb259LCB3aG9zZSB7QGNvZGUgYXBwbHl9IG1ldGhvZCBpcyBub3QgYWxsb3dlZCB0bworICAgICAqIHRocm93IGNoZWNrZWQgZXhjZXB0aW9ucy4gTm93YWRheXMsIHtAY29kZSBGdXR1cmVzLnRyYW5zZm9ybX0gaGFzIGFuCisgICAgICogb3ZlcmxvYWQgdGhhdCBhY2NlcHRzIGFuIHtAY29kZSBBc3luY0Z1bmN0aW9ufSwgd2hvc2Uge0Bjb2RlIGFwcGx5fSBtZXRob2QKKyAgICAgKiA8aT5pczwvaT4gYWxsb3dlZCB0byB0aHJvdyBjaGVja2VkIGV4Y2VwdGlvbi4gVXNlcnMgd2hvIHdpc2ggdG8gdGhyb3cKKyAgICAgKiBjaGVja2VkIGV4Y2VwdGlvbnMgc2hvdWxkIHVzZSB0aGF0IG92ZXJsb2FkIGluc3RlYWQsIGFuZCA8YQorICAgICAqIGhyZWY9Imh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9ndWF2YS1saWJyYXJpZXMvaXNzdWVzL2RldGFpbD9pZD0xNTQ4Ij53ZQorICAgICAqIHNob3VsZCByZW1vdmUgdGhlIHtAY29kZSBVbmRlY2xhcmVkVGhyb3dhYmxlRXhjZXB0aW9ufSBzcGVjaWFsIGNhc2U8L2E+LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENoYWluaW5nTGlzdGVuYWJsZUZ1dHVyZTxJLCBPPgorICAgICAgICAgICAgZXh0ZW5kcyBBYnN0cmFjdEZ1dHVyZTxPPiBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKKworICAgICAgICBwcml2YXRlIEFzeW5jRnVuY3Rpb248PyBzdXBlciBJLCA/IGV4dGVuZHMgTz4gZnVuY3Rpb247CisgICAgICAgIHByaXZhdGUgTGlzdGVuYWJsZUZ1dHVyZTw/IGV4dGVuZHMgST4gaW5wdXRGdXR1cmU7CisgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgTGlzdGVuYWJsZUZ1dHVyZTw/IGV4dGVuZHMgTz4gb3V0cHV0RnV0dXJlOworCisgICAgICAgIHByaXZhdGUgQ2hhaW5pbmdMaXN0ZW5hYmxlRnV0dXJlKAorICAgICAgICAgICAgICAgIEFzeW5jRnVuY3Rpb248PyBzdXBlciBJLCA/IGV4dGVuZHMgTz4gZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgTGlzdGVuYWJsZUZ1dHVyZTw/IGV4dGVuZHMgST4gaW5wdXRGdXR1cmUpIHsKKyAgICAgICAgICAgIHRoaXMuZnVuY3Rpb24gPSBjaGVja05vdE51bGwoZnVuY3Rpb24pOworICAgICAgICAgICAgdGhpcy5pbnB1dEZ1dHVyZSA9IGNoZWNrTm90TnVsbChpbnB1dEZ1dHVyZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY2FuY2VsKGJvb2xlYW4gbWF5SW50ZXJydXB0SWZSdW5uaW5nKSB7CisgICAgICAvKgorICAgICAgICogT3VyIGFkZGl0aW9uYWwgY2FuY2VsbGF0aW9uIHdvcmsgbmVlZHMgdG8gb2NjdXIgZXZlbiBpZgorICAgICAgICogIW1heUludGVycnVwdElmUnVubmluZywgc28gd2UgY2FuJ3QgbW92ZSBpdCBpbnRvIGludGVycnVwdFRhc2soKS4KKyAgICAgICAqLworICAgICAgICAgICAgaWYgKHN1cGVyLmNhbmNlbChtYXlJbnRlcnJ1cHRJZlJ1bm5pbmcpKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbmV2ZXIgYmxvY2sgc2luY2Ugb25seSBvbmUgdGhyZWFkIGlzIGFsbG93ZWQgdG8gY2FuY2VsCisgICAgICAgICAgICAgICAgLy8gdGhpcyBGdXR1cmUuCisgICAgICAgICAgICAgICAgY2FuY2VsKGlucHV0RnV0dXJlLCBtYXlJbnRlcnJ1cHRJZlJ1bm5pbmcpOworICAgICAgICAgICAgICAgIGNhbmNlbChvdXRwdXRGdXR1cmUsIG1heUludGVycnVwdElmUnVubmluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgY2FuY2VsKEZ1dHVyZTw/PiBmdXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBtYXlJbnRlcnJ1cHRJZlJ1bm5pbmcpIHsKKyAgICAgICAgICAgIGlmIChmdXR1cmUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZ1dHVyZS5jYW5jZWwobWF5SW50ZXJydXB0SWZSdW5uaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEkgc291cmNlUmVzdWx0OworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHNvdXJjZVJlc3VsdCA9IFVuaW50ZXJydXB0aWJsZXMuZ2V0VW5pbnRlcnJ1cHRpYmx5KGlucHV0RnV0dXJlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChDYW5jZWxsYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBDYW5jZWwgdGhpcyBmdXR1cmUgYW5kIHJldHVybi4KKyAgICAgICAgICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgaW5wdXRGdXR1cmUgaXMgY2FuY2VsbGVkIGFuZCBvdXRwdXRGdXR1cmUgZG9lc24ndAorICAgICAgICAgICAgICAgICAgICAvLyBleGlzdCwgc28gdGhlIHZhbHVlIG9mIG1heUludGVycnVwdElmUnVubmluZyBpcyBpcnJlbGV2YW50LgorICAgICAgICAgICAgICAgICAgICBjYW5jZWwoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uIGFzIHRoaXMgZnV0dXJlJ3MgZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgIHNldEV4Y2VwdGlvbihlLmdldENhdXNlKCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZmluYWwgTGlzdGVuYWJsZUZ1dHVyZTw/IGV4dGVuZHMgTz4gb3V0cHV0RnV0dXJlID0gdGhpcy5vdXRwdXRGdXR1cmUgPQorICAgICAgICAgICAgICAgICAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGwoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uLmFwcGx5KHNvdXJjZVJlc3VsdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBc3luY0Z1bmN0aW9uIG1heSBub3QgcmV0dXJuIG51bGwuIik7CisgICAgICAgICAgICAgICAgaWYgKGlzQ2FuY2VsbGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0RnV0dXJlLmNhbmNlbCh3YXNJbnRlcnJ1cHRlZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5vdXRwdXRGdXR1cmUgPSBudWxsOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dHB1dEZ1dHVyZS5hZGRMaXN0ZW5lcihuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldChVbmludGVycnVwdGlibGVzLmdldFVuaW50ZXJydXB0aWJseShvdXRwdXRGdXR1cmUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKENhbmNlbGxhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2FuY2VsIHRoaXMgZnV0dXJlIGFuZCByZXR1cm4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCwgaW5wdXRGdXR1cmUgYW5kIG91dHB1dEZ1dHVyZSBhcmUgZG9uZSwgc28gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWUgb2YgbWF5SW50ZXJydXB0SWZSdW5uaW5nIGlzIGlycmVsZXZhbnQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuY2VsKGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uIGFzIHRoaXMgZnV0dXJlJ3MgZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0RXhjZXB0aW9uKGUuZ2V0Q2F1c2UoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvbid0IHBpbiBpbnB1dHMgYmV5b25kIGNvbXBsZXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdXR1cmVzLkNoYWluaW5nTGlzdGVuYWJsZUZ1dHVyZS50aGlzLm91dHB1dEZ1dHVyZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9LCBNb3JlRXhlY3V0b3JzLmRpcmVjdEV4ZWN1dG9yKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoVW5kZWNsYXJlZFRocm93YWJsZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uIGFzIHRoaXMgZnV0dXJlJ3MgZXhjZXB0aW9uCisgICAgICAgICAgICAgICAgc2V0RXhjZXB0aW9uKGUuZ2V0Q2F1c2UoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgZXhjZXB0aW9uIGlzIGlycmVsZXZhbnQgaW4gdGhpcyB0aHJlYWQsIGJ1dCB1c2VmdWwgZm9yIHRoZQorICAgICAgICAgICAgICAgIC8vIGNsaWVudAorICAgICAgICAgICAgICAgIHNldEV4Y2VwdGlvbih0KTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgLy8gRG9uJ3QgcGluIGlucHV0cyBiZXlvbmQgY29tcGxldGlvbgorICAgICAgICAgICAgICAgIGZ1bmN0aW9uID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpbnB1dEZ1dHVyZSA9IG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvR2VuZXJpY01hcE1ha2VyLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL0dlbmVyaWNNYXBNYWtlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZmFiYTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL0dlbmVyaWNNYXBNYWtlci5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEd1YXZhIEF1dGhvcnMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTLUlTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YTsKKworLyoqCisgKiBBIGNsYXNzIGV4YWN0bHkgbGlrZSB7QGxpbmsgTWFwTWFrZXJ9LCBleGNlcHQgcmVzdHJpY3RlZCBpbiB0aGUgdHlwZXMgb2YgbWFwcyBpdCBjYW4gYnVpbGQuCisgKiBGb3IgdGhlIG1vc3QgcGFydCwgeW91IHNob3VsZCBwcm9iYWJseSBqdXN0IGlnbm9yZSB0aGUgZXhpc3RlbmNlIG9mIHRoaXMgY2xhc3MuCisgKgorICogQHBhcmFtIDxLMD4gdGhlIGJhc2UgdHlwZSBmb3IgYWxsIGtleSB0eXBlcyBvZiBtYXBzIGJ1aWx0IGJ5IHRoaXMgbWFwIG1ha2VyCisgKiBAcGFyYW0gPFYwPiB0aGUgYmFzZSB0eXBlIGZvciBhbGwgdmFsdWUgdHlwZXMgb2YgbWFwcyBidWlsdCBieSB0aGlzIG1hcCBtYWtlcgorICogQGF1dGhvciBLZXZpbiBCb3VycmlsbGlvbgorICogQHNpbmNlIDcuMAorICogQGRlcHJlY2F0ZWQgVGhpcyBjbGFzcyBleGlzdGVkIG9ubHkgdG8gc3VwcG9ydCB0aGUgZ2VuZXJpYyBwYXJhbXRlcml6YXRpb24gbmVjZXNzYXJ5IGZvciB0aGUKKyAqIGNhY2hpbmcgZnVuY3Rpb25hbGl0eSBpbiB7QGNvZGUgTWFwTWFrZXJ9LiBUaGF0IGZ1bmN0aW9uYWxpdHkgaGFzIGJlZW4gbW92ZWQgdG8ge0BsaW5rCisgKiBDYWNoZUJ1aWxkZXJ9LCB3aGljaCBpcyBhIHByb3Blcmx5IGdlbmVyaWZpZWQgY2xhc3MgYW5kIHRodXMgbmVlZHMgbm8KKyAqICJHZW5lcmljIiBlcXVpdmFsZW50OyBzaW1wbGUgdXNlIHtAY29kZSBDYWNoZUJ1aWxkZXJ9IG5hdHVyYWxseS4gRm9yIGdlbmVyYWwgbWlncmF0aW9uCisgKiBpbnN0cnVjdGlvbnMsIHNlZSB0aGUgPGEKKyAqIGhyZWY9Imh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9ndWF2YS1saWJyYXJpZXMvd2lraS9NYXBNYWtlck1pZ3JhdGlvbiI+TWFwTWFrZXIgTWlncmF0aW9uCisgKiBHdWlkZTwvYT4uCisgKi8KK0BEZXByZWNhdGVkCithYnN0cmFjdCBjbGFzcyBHZW5lcmljTWFwTWFrZXI8SzAsIFYwPiB7CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgLy8gc2FmZSBjb3ZhcmlhbnQgY2FzdAorICAgIDxLIGV4dGVuZHMgSzAsIFYgZXh0ZW5kcyBWMD4gTWFwTWFrZXIuUmVtb3ZhbExpc3RlbmVyPEssIFY+IGdldFJlbW92YWxMaXN0ZW5lcigpIHsKKyAgICAgICAgcmV0dXJuIChNYXBNYWtlci5SZW1vdmFsTGlzdGVuZXI8SywgVj4pIEdlbmVyaWNNYXBNYWtlci5OdWxsTGlzdGVuZXIuSU5TVEFOQ0U7CisgICAgfQorCisgICAgZW51bSBOdWxsTGlzdGVuZXIgaW1wbGVtZW50cyBNYXBNYWtlci5SZW1vdmFsTGlzdGVuZXI8T2JqZWN0LCBPYmplY3Q+IHsKKyAgICAgICAgSU5TVEFOQ0U7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVtb3ZhbChNYXBNYWtlci5SZW1vdmFsTm90aWZpY2F0aW9uPE9iamVjdCwgT2JqZWN0PiBub3RpZmljYXRpb24pIHsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9IYXNoQmFzZWRUYWJsZS5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9IYXNoQmFzZWRUYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2ODBjYmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL0hhc2hCYXNlZFRhYmxlLmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEd1YXZhIEF1dGhvcnMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmE7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgVGFibGV9IHVzaW5nIGhhc2ggdGFibGVzLgorICogPHA+CisgKiA8cD5UaGUgdmlld3MgcmV0dXJuZWQgYnkge0BsaW5rICNjb2x1bW59LCB7QGxpbmsgI2NvbHVtbktleVNldCgpfSwgYW5kIHtAbGluaworICogI2NvbHVtbk1hcCgpfSBoYXZlIGl0ZXJhdG9ycyB0aGF0IGRvbid0IHN1cHBvcnQge0Bjb2RlIHJlbW92ZSgpfS4gT3RoZXJ3aXNlLAorICogYWxsIG9wdGlvbmFsIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4gTnVsbCByb3cga2V5cywgY29sdW1ucyBrZXlzLCBhbmQKKyAqIHZhbHVlcyBhcmUgbm90IHN1cHBvcnRlZC4KKyAqIDxwPgorICogPHA+TG9va3VwcyBieSByb3cga2V5IGFyZSBvZnRlbiBmYXN0ZXIgdGhhbiBsb29rdXBzIGJ5IGNvbHVtbiBrZXksIGJlY2F1c2UKKyAqIHRoZSBkYXRhIGlzIHN0b3JlZCBpbiBhIHtAY29kZSBNYXA8UiwgTWFwPEMsIFY+Pn0uIEEgbWV0aG9kIGNhbGwgbGlrZSB7QGNvZGUKKyAqIGNvbHVtbihjb2x1bW5LZXkpLmdldChyb3dLZXkpfSBzdGlsbCBydW5zIHF1aWNrbHksIHNpbmNlIHRoZSByb3cga2V5IGlzCisgKiBwcm92aWRlZC4gSG93ZXZlciwge0Bjb2RlIGNvbHVtbihjb2x1bW5LZXkpLnNpemUoKX0gdGFrZXMgbG9uZ2VyLCBzaW5jZSBhbgorICogaXRlcmF0aW9uIGFjcm9zcyBhbGwgcm93IGtleXMgb2NjdXJzLgorICogPHA+CisgKiA8cD5Ob3RlIHRoYXQgdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBub3Qgc3luY2hyb25pemVkLiBJZiBtdWx0aXBsZSB0aHJlYWRzCisgKiBhY2Nlc3MgdGhpcyB0YWJsZSBjb25jdXJyZW50bHkgYW5kIG9uZSBvZiB0aGUgdGhyZWFkcyBtb2RpZmllcyB0aGUgdGFibGUsIGl0CisgKiBtdXN0IGJlIHN5bmNocm9uaXplZCBleHRlcm5hbGx5LgorICogPHA+CisgKiA8cD5TZWUgdGhlIEd1YXZhIFVzZXIgR3VpZGUgYXJ0aWNsZSBvbiA8YSBocmVmPQorICogImh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9ndWF2YS1saWJyYXJpZXMvd2lraS9OZXdDb2xsZWN0aW9uVHlwZXNFeHBsYWluZWQjVGFibGUiPgorICoge0Bjb2RlIFRhYmxlfTwvYT4uCisgKgorICogQGF1dGhvciBKYXJlZCBMZXZ5CisgKiBAc2luY2UgNy4wCisgKi8KK3B1YmxpYyBjbGFzcyBIYXNoQmFzZWRUYWJsZTxSLCBDLCBWPiBleHRlbmRzIFN0YW5kYXJkVGFibGU8UiwgQywgVj4geworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDA7CisKKyAgICBwcml2YXRlIEhhc2hCYXNlZFRhYmxlKE1hcDxSLCBNYXA8QywgVj4+IGJhY2tpbmdNYXAsIEZhY3Rvcnk8QywgVj4gZmFjdG9yeSkgeworICAgICAgICBzdXBlcihiYWNraW5nTWFwLCBmYWN0b3J5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIGVtcHR5IHtAY29kZSBIYXNoQmFzZWRUYWJsZX0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8UiwgQywgVj4gSGFzaEJhc2VkVGFibGU8UiwgQywgVj4gY3JlYXRlKCkgeworICAgICAgICByZXR1cm4gbmV3IEhhc2hCYXNlZFRhYmxlPFIsIEMsIFY+KAorICAgICAgICAgICAgICAgIG5ldyBIYXNoTWFwPFIsIE1hcDxDLCBWPj4oKSwgbmV3IEZhY3Rvcnk8QywgVj4oMCkpOworICAgIH0KKworICAgIC8vIE92ZXJyaWRpbmcgc28gTnVsbFBvaW50ZXJUZXN0ZXIgdGVzdCBwYXNzZXMuCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucygKKyAgICAgICAgICAgIE9iamVjdCByb3dLZXksIE9iamVjdCBjb2x1bW5LZXkpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmNvbnRhaW5zKHJvd0tleSwgY29sdW1uS2V5KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0NvbHVtbihPYmplY3QgY29sdW1uS2V5KSB7CisgICAgICAgIHJldHVybiBzdXBlci5jb250YWluc0NvbHVtbihjb2x1bW5LZXkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmFsdWUoT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIHJldHVybiBzdXBlci5jb250YWluc1ZhbHVlKHZhbHVlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgViBnZXQoT2JqZWN0IHJvd0tleSwgT2JqZWN0IGNvbHVtbktleSkgeworICAgICAgICByZXR1cm4gc3VwZXIuZ2V0KHJvd0tleSwgY29sdW1uS2V5KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICByZXR1cm4gc3VwZXIuZXF1YWxzKG9iaik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRmFjdG9yeTxDLCBWPgorICAgICAgICAgICAgaW1wbGVtZW50cyBTdXBwbGllcjxNYXA8QywgVj4+LCBTZXJpYWxpemFibGUgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAwOworICAgICAgICBmaW5hbCBpbnQgZXhwZWN0ZWRTaXplOworCisgICAgICAgIEZhY3RvcnkoaW50IGV4cGVjdGVkU2l6ZSkgeworICAgICAgICAgICAgdGhpcy5leHBlY3RlZFNpemUgPSBleHBlY3RlZFNpemU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE1hcDxDLCBWPiBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gTWFwcy5uZXdIYXNoTWFwV2l0aEV4cGVjdGVkU2l6ZShleHBlY3RlZFNpemUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9IYXNoTXVsdGltYXAuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvSGFzaE11bHRpbWFwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE4MDAwZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvSGFzaE11bHRpbWFwLmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgR3VhdmEgQXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIE11bHRpbWFwfSB1c2luZyBoYXNoIHRhYmxlcy4KKyAqIDxwPgorICogPHA+VGhlIG11bHRpbWFwIGRvZXMgbm90IHN0b3JlIGR1cGxpY2F0ZSBrZXktdmFsdWUgcGFpcnMuIEFkZGluZyBhIG5ldworICoga2V5LXZhbHVlIHBhaXIgZXF1YWwgdG8gYW4gZXhpc3Rpbmcga2V5LXZhbHVlIHBhaXIgaGFzIG5vIGVmZmVjdC4KKyAqIDxwPgorICogPHA+S2V5cyBhbmQgdmFsdWVzIG1heSBiZSBudWxsLiBBbGwgb3B0aW9uYWwgbXVsdGltYXAgbWV0aG9kcyBhcmUgc3VwcG9ydGVkLAorICogYW5kIGFsbCByZXR1cm5lZCB2aWV3cyBhcmUgbW9kaWZpYWJsZS4KKyAqIDxwPgorICogPHA+VGhpcyBjbGFzcyBpcyBub3QgdGhyZWFkc2FmZSB3aGVuIGFueSBjb25jdXJyZW50IG9wZXJhdGlvbnMgdXBkYXRlIHRoZQorICogbXVsdGltYXAuIENvbmN1cnJlbnQgcmVhZCBvcGVyYXRpb25zIHdpbGwgd29yayBjb3JyZWN0bHkuIFRvIGFsbG93IGNvbmN1cnJlbnQKKyAqIHVwZGF0ZSBvcGVyYXRpb25zLCB3cmFwIHlvdXIgbXVsdGltYXAgd2l0aCBhIGNhbGwgdG8ge0BsaW5rCisgKiBNdWx0aW1hcHMjc3luY2hyb25pemVkU2V0TXVsdGltYXB9LgorICoKKyAqIEBhdXRob3IgSmFyZWQgTGV2eQorICogQHNpbmNlIDIuMCAoaW1wb3J0ZWQgZnJvbSBHb29nbGUgQ29sbGVjdGlvbnMgTGlicmFyeSkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEhhc2hNdWx0aW1hcDxLLCBWPiBleHRlbmRzIEFic3RyYWN0U2V0TXVsdGltYXA8SywgVj4geworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1ZBTFVFU19QRVJfS0VZID0gMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAwOworICAgIHByaXZhdGUgdHJhbnNpZW50IGludCBleHBlY3RlZFZhbHVlc1BlcktleSA9IERFRkFVTFRfVkFMVUVTX1BFUl9LRVk7CisKKyAgICBwcml2YXRlIEhhc2hNdWx0aW1hcCgpIHsKKyAgICAgICAgc3VwZXIobmV3IEhhc2hNYXA8SywgQ29sbGVjdGlvbjxWPj4oKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldywgZW1wdHkge0Bjb2RlIEhhc2hNdWx0aW1hcH0gd2l0aCB0aGUgZGVmYXVsdCBpbml0aWFsCisgICAgICogY2FwYWNpdGllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxLLCBWPiBIYXNoTXVsdGltYXA8SywgVj4gY3JlYXRlKCkgeworICAgICAgICByZXR1cm4gbmV3IEhhc2hNdWx0aW1hcDxLLCBWPigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5DcmVhdGVzIGFuIGVtcHR5IHtAY29kZSBIYXNoU2V0fSBmb3IgYSBjb2xsZWN0aW9uIG9mIHZhbHVlcyBmb3Igb25lIGtleS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBuZXcge0Bjb2RlIEhhc2hTZXR9IGNvbnRhaW5pbmcgYSBjb2xsZWN0aW9uIG9mIHZhbHVlcyBmb3Igb25lIGtleQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIFNldDxWPiBjcmVhdGVDb2xsZWN0aW9uKCkgeworICAgICAgICByZXR1cm4gU2V0cy5uZXdIYXNoU2V0V2l0aEV4cGVjdGVkU2l6ZShleHBlY3RlZFZhbHVlc1BlcktleSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlcmlhbERhdGEgZXhwZWN0ZWRWYWx1ZXNQZXJLZXksIG51bWJlciBvZiBkaXN0aW5jdCBrZXlzLCBhbmQgdGhlbiBmb3IKKyAgICAgKiBlYWNoIGRpc3RpbmN0IGtleTogdGhlIGtleSwgbnVtYmVyIG9mIHZhbHVlcyBmb3IgdGhhdCBrZXksIGFuZCB0aGUKKyAgICAgKiBrZXkncyB2YWx1ZXMKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoT2JqZWN0T3V0cHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgc3RyZWFtLmRlZmF1bHRXcml0ZU9iamVjdCgpOworICAgICAgICBzdHJlYW0ud3JpdGVJbnQoZXhwZWN0ZWRWYWx1ZXNQZXJLZXkpOworICAgICAgICBTZXJpYWxpemF0aW9uLndyaXRlTXVsdGltYXAodGhpcywgc3RyZWFtKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBzdHJlYW0pCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBzdHJlYW0uZGVmYXVsdFJlYWRPYmplY3QoKTsKKyAgICAgICAgZXhwZWN0ZWRWYWx1ZXNQZXJLZXkgPSBzdHJlYW0ucmVhZEludCgpOworICAgICAgICBpbnQgZGlzdGluY3RLZXlzID0gU2VyaWFsaXphdGlvbi5yZWFkQ291bnQoc3RyZWFtKTsKKyAgICAgICAgTWFwPEssIENvbGxlY3Rpb248Vj4+IG1hcCA9IE1hcHMubmV3SGFzaE1hcFdpdGhFeHBlY3RlZFNpemUoZGlzdGluY3RLZXlzKTsKKyAgICAgICAgc2V0TWFwKG1hcCk7CisgICAgICAgIFNlcmlhbGl6YXRpb24ucG9wdWxhdGVNdWx0aW1hcCh0aGlzLCBzdHJlYW0sIGRpc3RpbmN0S2V5cyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9IYXNoaW5nLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL0hhc2hpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmI5OTJjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9IYXNoaW5nLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgR3VhdmEgQXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YTsKKworLyoqCisgKiBTdGF0aWMgbWV0aG9kcyBmb3IgaW1wbGVtZW50aW5nIGhhc2gtYmFzZWQgY29sbGVjdGlvbnMuCisgKgorICogQGF1dGhvciBLZXZpbiBCb3VycmlsbGlvbgorICogQGF1dGhvciBKZXNzZSBXaWxzb24KKyAqIEBhdXRob3IgQXVzdGluIEFwcGxlYnkKKyAqLworZmluYWwgY2xhc3MgSGFzaGluZyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEMxID0gMHhjYzllMmQ1MTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQzIgPSAweDFiODczNTkzOworCisgICAgcHJpdmF0ZSBIYXNoaW5nKCkgeworICAgIH0KKworICAgIC8qCisgICAgICogVGhpcyBtZXRob2Qgd2FzIHJld3JpdHRlbiBpbiBKYXZhIGZyb20gYW4gaW50ZXJtZWRpYXRlIHN0ZXAgb2YgdGhlIE11cm11ciBoYXNoIGZ1bmN0aW9uIGluCisgICAgICogaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3NtaGFzaGVyL3NvdXJjZS9icm93c2UvdHJ1bmsvTXVybXVySGFzaDMuY3BwLCB3aGljaCBjb250YWluZWQgdGhlCisgICAgICogZm9sbG93aW5nIGhlYWRlcjoKKyAgICAgKgorICAgICAqIE11cm11ckhhc2gzIHdhcyB3cml0dGVuIGJ5IEF1c3RpbiBBcHBsZWJ5LCBhbmQgaXMgcGxhY2VkIGluIHRoZSBwdWJsaWMgZG9tYWluLiBUaGUgYXV0aG9yCisgICAgICogaGVyZWJ5IGRpc2NsYWltcyBjb3B5cmlnaHQgdG8gdGhpcyBzb3VyY2UgY29kZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgaW50IHNtZWFyKGludCBoYXNoQ29kZSkgeworICAgICAgICByZXR1cm4gQzIgKiBJbnRlZ2VyLnJvdGF0ZUxlZnQoaGFzaENvZGUgKiBDMSwgMTUpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9JbW11dGFibGVFbnRyeS5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9JbW11dGFibGVFbnRyeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzYzZkMGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL0ltbXV0YWJsZUVudHJ5LmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgR3VhdmEgQXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YTsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCisvKioKKyAqIEBzZWUgTWFwcyNpbW11dGFibGVFbnRyeShPYmplY3QsIE9iamVjdCkKKyAqLworY2xhc3MgSW1tdXRhYmxlRW50cnk8SywgVj4gZXh0ZW5kcyBBYnN0cmFjdE1hcEVudHJ5PEssIFY+CisgICAgICAgIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAwOworICAgIHByaXZhdGUgZmluYWwgSyBrZXk7CisgICAgcHJpdmF0ZSBmaW5hbCBWIHZhbHVlOworCisgICAgSW1tdXRhYmxlRW50cnkoSyBrZXksIFYgdmFsdWUpIHsKKyAgICAgICAgdGhpcy5rZXkgPSBrZXk7CisgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgSyBnZXRLZXkoKSB7CisgICAgICAgIHJldHVybiBrZXk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZpbmFsIFYgZ2V0VmFsdWUoKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgViBzZXRWYWx1ZShWIHZhbHVlKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvSW5ldEFkZHJlc3Nlcy5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9JbmV0QWRkcmVzc2VzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ1MjA3MAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvSW5ldEFkZHJlc3Nlcy5qYXZhCkBAIC0wLDAgKzEsMzYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBHdWF2YSBBdXRob3JzCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhOworCitpbXBvcnQgamF2YS5uZXQuSW5ldDRBZGRyZXNzOworaW1wb3J0IGphdmEubmV0LkluZXQ2QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5JbmV0QWRkcmVzczsKK2ltcG9ydCBqYXZhLm5ldC5Vbmtub3duSG9zdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworCisvKioKKyAqIFN0YXRpYyB1dGlsaXR5IG1ldGhvZHMgcGVydGFpbmluZyB0byB7QGxpbmsgSW5ldEFkZHJlc3N9IGluc3RhbmNlcy4KKyAqIDxwPgorICogPHA+PGI+SW1wb3J0YW50IG5vdGU6PC9iPiBVbmxpa2Uge0Bjb2RlIEluZXRBZGRyZXNzLmdldEJ5TmFtZSgpfSwgdGhlCisgKiBtZXRob2RzIG9mIHRoaXMgY2xhc3MgbmV2ZXIgY2F1c2UgRE5TIHNlcnZpY2VzIHRvIGJlIGFjY2Vzc2VkLiBGb3IKKyAqIHRoaXMgcmVhc29uLCB5b3Ugc2hvdWxkIHByZWZlciB0aGVzZSBtZXRob2RzIGFzIG11Y2ggYXMgcG9zc2libGUgb3ZlcgorICogdGhlaXIgSkRLIGVxdWl2YWxlbnRzIHdoZW5ldmVyIHlvdSBhcmUgZXhwZWN0aW5nIHRvIGhhbmRsZSBvbmx5CisgKiBJUCBhZGRyZXNzIHN0cmluZyBsaXRlcmFscyAtLSB0aGVyZSBpcyBubyBibG9ja2luZyBETlMgcGVuYWx0eSBmb3IgYQorICogbWFsZm9ybWVkIHN0cmluZy4KKyAqIDxwPgorICogPHA+V2hlbiBkZWFsaW5nIHdpdGgge0BsaW5rIEluZXQ0QWRkcmVzc30gYW5kIHtAbGluayBJbmV0NkFkZHJlc3N9CisgKiBvYmplY3RzIGFzIGJ5dGUgYXJyYXlzICh2aXMuIHtAY29kZSBJbmV0QWRkcmVzcy5nZXRBZGRyZXNzKCl9KSB0aGV5CisgKiBhcmUgNCBhbmQgMTYgYnl0ZXMgaW4gbGVuZ3RoLCByZXNwZWN0aXZlbHksIGFuZCByZXByZXNlbnQgdGhlIGFkZHJlc3MKKyAqIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4KKyAqIDxwPgorICogPHA+RXhhbXBsZXMgb2YgSVAgYWRkcmVzc2VzIGFuZCB0aGVpciBieXRlIHJlcHJlc2VudGF0aW9uczoKKyAqIDx1bD4KKyAqIDxsaT5UaGUgSVB2NCBsb29wYmFjayBhZGRyZXNzLCB7QGNvZGUgIjEyNy4wLjAuMSJ9Ljxici8+CisgKiB7QGNvZGUgN2YgMDAgMDAgMDF9CisgKiA8cD4KKyAqIDxsaT5UaGUgSVB2NiBsb29wYmFjayBhZGRyZXNzLCB7QGNvZGUgIjo6MSJ9Ljxici8+CisgKiB7QGNvZGUgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDF9CisgKiA8cD4KKyAqIDxsaT5Gcm9tIHRoZSBJUHY2IHJlc2VydmVkIGRvY3VtZW50YXRpb24gcHJlZml4ICh7QGNvZGUgMjAwMTpkYjg6Oi8zMn0pLAorICoge0Bjb2RlICIyMDAxOmRiODo6MSJ9Ljxici8+CisgKiB7QGNvZGUgMjAgMDEgMGQgYjggMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDF9CisgKiA8cD4KKyAqIDxsaT5BbiBJUHY2ICJJUHY0IGNvbXBhdGlibGUiIChvciAiY29tcGF0IikgYWRkcmVzcywKKyAqIHtAY29kZSAiOjoxOTIuMTY4LjAuMSJ9Ljxici8+CisgKiB7QGNvZGUgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgMDAgYzAgYTggMDAgMDF9CisgKiA8cD4KKyAqIDxsaT5BbiBJUHY2ICJJUHY0IG1hcHBlZCIgYWRkcmVzcywge0Bjb2RlICI6OmZmZmY6MTkyLjE2OC4wLjEifS48YnIvPgorICoge0Bjb2RlIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIDAwIGZmIGZmIGMwIGE4IDAwIDAxfQorICogPC91bD4KKyAqIDxwPgorICogPHA+QSBmZXcgbm90ZXMgYWJvdXQgSVB2NiAiSVB2NCBtYXBwZWQiIGFkZHJlc3NlcyBhbmQgdGhlaXIgb2JzZXJ2ZWQKKyAqIHVzZSBpbiBKYXZhLgorICogPGJyPjxicj4KKyAqICJJUHY0IG1hcHBlZCIgYWRkcmVzc2VzIHdlcmUgb3JpZ2luYWxseSBhIHJlcHJlc2VudGF0aW9uIG9mIElQdjQKKyAqIGFkZHJlc3NlcyBmb3IgdXNlIG9uIGFuIElQdjYgc29ja2V0IHRoYXQgY291bGQgcmVjZWl2ZSBib3RoIElQdjQKKyAqIGFuZCBJUHY2IGNvbm5lY3Rpb25zIChieSBkaXNhYmxpbmcgdGhlIHtAY29kZSBJUFY2X1Y2T05MWX0gc29ja2V0CisgKiBvcHRpb24gb24gYW4gSVB2NiBzb2NrZXQpLiAgWWVzLCBpdCdzIGNvbmZ1c2luZy4gIE5ldmVydGhlbGVzcywKKyAqIHRoZXNlICJtYXBwZWQiIGFkZHJlc3NlcyB3ZXJlIG5ldmVyIHN1cHBvc2VkIHRvIGJlIHNlZW4gb24gdGhlCisgKiB3aXJlLiAgVGhhdCBhc3N1bXB0aW9uIHdhcyBkcm9wcGVkLCBzb21lIHNheSBtaXN0YWtlbmx5LCBpbiBsYXRlcgorICogUkZDcyB3aXRoIHRoZSBhcHBhcmVudCBhaW0gb2YgbWFraW5nIElQdjQtdG8tSVB2NiB0cmFuc2l0aW9uIHNpbXBsZXIuCisgKiA8cD4KKyAqIDxwPlRlY2huaWNhbGx5IG9uZSA8aT5jYW48L2k+IGNyZWF0ZSBhIDEyOGJpdCBJUHY2IGFkZHJlc3Mgd2l0aCB0aGUgd2lyZQorICogZm9ybWF0IG9mIGEgIm1hcHBlZCIgYWRkcmVzcywgYXMgc2hvd24gYWJvdmUsIGFuZCB0cmFuc21pdCBpdCBpbiBhbgorICogSVB2NiBwYWNrZXQgaGVhZGVyLiAgSG93ZXZlciwgSmF2YSdzIEluZXRBZGRyZXNzIGNyZWF0aW9uIG1ldGhvZHMKKyAqIGFwcGVhciB0byBhZGhlcmUgZG9nZ2VkbHkgdG8gdGhlIG9yaWdpbmFsIGludGVudCBvZiB0aGUgIm1hcHBlZCIKKyAqIGFkZHJlc3M6IGFsbCAibWFwcGVkIiBhZGRyZXNzZXMgcmV0dXJuIHtAbGluayBJbmV0NEFkZHJlc3N9IG9iamVjdHMuCisgKiA8cD4KKyAqIDxwPkZvciBhZGRlZCBzYWZldHksIGl0IGlzIGNvbW1vbiBmb3IgSVB2NiBuZXR3b3JrIG9wZXJhdG9ycyB0byBmaWx0ZXIKKyAqIGFsbCBwYWNrZXRzIHdoZXJlIGVpdGhlciB0aGUgc291cmNlIG9yIGRlc3RpbmF0aW9uIGFkZHJlc3MgYXBwZWFycyB0bworICogYmUgYSAiY29tcGF0IiBvciAibWFwcGVkIiBhZGRyZXNzLiAgRmlsdGVyaW5nIHN1Z2dlc3Rpb25zIHVzdWFsbHkKKyAqIHJlY29tbWVuZCBkaXNjYXJkaW5nIGFueSBwYWNrZXRzIHdpdGggc291cmNlIG9yIGRlc3RpbmF0aW9uIGFkZHJlc3NlcworICogaW4gdGhlIGludmFsaWQgcmFuZ2Uge0Bjb2RlIDo6LzN9LCB3aGljaCBpbmNsdWRlcyBib3RoIG9mIHRoZXNlIGJpemFycmUKKyAqIGFkZHJlc3MgZm9ybWF0cy4gIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uICJib2dvbnMiLCBpbmNsdWRpbmcgbGlzdHMKKyAqIG9mIElQdjYgYm9nb24gc3BhY2UsIHNlZToKKyAqIDxwPgorICogPHVsPgorICogPGxpPjxhIHRhcmdldD0iX3BhcmVudCIKKyAqIGhyZWY9Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQm9nb25fZmlsdGVyaW5nIgorICogPmh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQm9nb25fZmlsdGVyaW5nPC9hPgorICogPGxpPjxhIHRhcmdldD0iX3BhcmVudCIKKyAqIGhyZWY9Imh0dHA6Ly93d3cuY3ltcnUuY29tL0JvZ29ucy9pcHY2LnR4dCIKKyAqID5odHRwOi8vd3d3LmN5bXJ1LmNvbS9Cb2dvbnMvaXB2Ni50eHQ8L2E+CisgKiA8bGk+PGEgdGFyZ2V0PSJfcGFyZW50IgorICogaHJlZj0iaHR0cDovL3d3dy5jeW1ydS5jb20vQm9nb25zL3Y2Ym9nb24uaHRtbCIKKyAqID5odHRwOi8vd3d3LmN5bXJ1LmNvbS9Cb2dvbnMvdjZib2dvbi5odG1sPC9hPgorICogPGxpPjxhIHRhcmdldD0iX3BhcmVudCIKKyAqIGhyZWY9Imh0dHA6Ly93d3cuc3BhY2UubmV0L35nZXJ0L1JJUEUvaXB2Ni1maWx0ZXJzLmh0bWwiCisgKiA+aHR0cDovL3d3dy5zcGFjZS5uZXQvfmdlcnQvUklQRS9pcHY2LWZpbHRlcnMuaHRtbDwvYT4KKyAqIDwvdWw+CisgKgorICogQGF1dGhvciBFcmlrIEtsaW5lCisgKiBAc2luY2UgNS4wCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBJbmV0QWRkcmVzc2VzIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSVBWNF9QQVJUX0NPVU5UID0gNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSVBWNl9QQVJUX0NPVU5UID0gODsKKworICAgIHByaXZhdGUgSW5ldEFkZHJlc3NlcygpIHsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gaXBTdHJpbmdUb0J5dGVzKFN0cmluZyBpcFN0cmluZykgeworICAgICAgICAvLyBNYWtlIGEgZmlyc3QgcGFzcyB0byBjYXRlZ29yaXplIHRoZSBjaGFyYWN0ZXJzIGluIHRoaXMgc3RyaW5nLgorICAgICAgICBib29sZWFuIGhhc0NvbG9uID0gZmFsc2U7CisgICAgICAgIGJvb2xlYW4gaGFzRG90ID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXBTdHJpbmcubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgY2hhciBjID0gaXBTdHJpbmcuY2hhckF0KGkpOworICAgICAgICAgICAgaWYgKGMgPT0gJy4nKSB7CisgICAgICAgICAgICAgICAgaGFzRG90ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnOicpIHsKKyAgICAgICAgICAgICAgICBpZiAoaGFzRG90KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOyAgLy8gQ29sb25zIG11c3Qgbm90IGFwcGVhciBhZnRlciBkb3RzLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBoYXNDb2xvbiA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKENoYXJhY3Rlci5kaWdpdChjLCAxNikgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsgIC8vIEV2ZXJ5dGhpbmcgZWxzZSBtdXN0IGJlIGEgZGVjaW1hbCBvciBoZXggZGlnaXQuCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3cgZGVjaWRlIHdoaWNoIGFkZHJlc3MgZmFtaWx5IHRvIHBhcnNlLgorICAgICAgICBpZiAoaGFzQ29sb24pIHsKKyAgICAgICAgICAgIGlmIChoYXNEb3QpIHsKKyAgICAgICAgICAgICAgICBpcFN0cmluZyA9IGNvbnZlcnREb3R0ZWRRdWFkVG9IZXgoaXBTdHJpbmcpOworICAgICAgICAgICAgICAgIGlmIChpcFN0cmluZyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0ZXh0VG9OdW1lcmljRm9ybWF0VjYoaXBTdHJpbmcpOworICAgICAgICB9IGVsc2UgaWYgKGhhc0RvdCkgeworICAgICAgICAgICAgcmV0dXJuIHRleHRUb051bWVyaWNGb3JtYXRWNChpcFN0cmluZyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIHRleHRUb051bWVyaWNGb3JtYXRWNChTdHJpbmcgaXBTdHJpbmcpIHsKKyAgICAgICAgU3RyaW5nW10gYWRkcmVzcyA9IGlwU3RyaW5nLnNwbGl0KCJcXC4iLCBJUFY0X1BBUlRfQ09VTlQgKyAxKTsKKyAgICAgICAgaWYgKGFkZHJlc3MubGVuZ3RoICE9IElQVjRfUEFSVF9DT1VOVCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtJUFY0X1BBUlRfQ09VTlRdOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGJ5dGVzW2ldID0gcGFyc2VPY3RldChhZGRyZXNzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBieXRlczsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gdGV4dFRvTnVtZXJpY0Zvcm1hdFY2KFN0cmluZyBpcFN0cmluZykgeworICAgICAgICAvLyBBbiBhZGRyZXNzIGNhbiBoYXZlIFsyLi44XSBjb2xvbnMsIGFuZCBOIGNvbG9ucyBtYWtlIE4rMSBwYXJ0cy4KKyAgICAgICAgU3RyaW5nW10gcGFydHMgPSBpcFN0cmluZy5zcGxpdCgiOiIsIElQVjZfUEFSVF9DT1VOVCArIDIpOworICAgICAgICBpZiAocGFydHMubGVuZ3RoIDwgMyB8fCBwYXJ0cy5sZW5ndGggPiBJUFY2X1BBUlRfQ09VTlQgKyAxKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIERpc3JlZ2FyZGluZyB0aGUgZW5kcG9pbnRzLCBmaW5kICI6OiIgd2l0aCBub3RoaW5nIGluIGJldHdlZW4uCisgICAgICAgIC8vIFRoaXMgaW5kaWNhdGVzIHRoYXQgYSBydW4gb2YgemVyb2VzIGhhcyBiZWVuIHNraXBwZWQuCisgICAgICAgIGludCBza2lwSW5kZXggPSAtMTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChwYXJ0c1tpXS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKHNraXBJbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOyAgLy8gQ2FuJ3QgaGF2ZSBtb3JlIHRoYW4gb25lIDo6CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNraXBJbmRleCA9IGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnQgcGFydHNIaTsgIC8vIE51bWJlciBvZiBwYXJ0cyB0byBjb3B5IGZyb20gYWJvdmUvYmVmb3JlIHRoZSAiOjoiCisgICAgICAgIGludCBwYXJ0c0xvOyAgLy8gTnVtYmVyIG9mIHBhcnRzIHRvIGNvcHkgZnJvbSBiZWxvdy9hZnRlciB0aGUgIjo6IgorICAgICAgICBpZiAoc2tpcEluZGV4ID49IDApIHsKKyAgICAgICAgICAgIC8vIElmIHdlIGZvdW5kIGEgIjo6IiwgdGhlbiBjaGVjayBpZiBpdCBhbHNvIGNvdmVycyB0aGUgZW5kcG9pbnRzLgorICAgICAgICAgICAgcGFydHNIaSA9IHNraXBJbmRleDsKKyAgICAgICAgICAgIHBhcnRzTG8gPSBwYXJ0cy5sZW5ndGggLSBza2lwSW5kZXggLSAxOworICAgICAgICAgICAgaWYgKHBhcnRzWzBdLmxlbmd0aCgpID09IDAgJiYgLS1wYXJ0c0hpICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsgIC8vIF46IHJlcXVpcmVzIF46OgorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdLmxlbmd0aCgpID09IDAgJiYgLS1wYXJ0c0xvICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsgIC8vIDokIHJlcXVpcmVzIDo6JAorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBhbGxvY2F0ZSB0aGUgZW50aXJlIGFkZHJlc3MgdG8gcGFydHNIaS4gIFRoZSBlbmRwb2ludHMKKyAgICAgICAgICAgIC8vIGNvdWxkIHN0aWxsIGJlIGVtcHR5LCBidXQgcGFyc2VIZXh0ZXQoKSB3aWxsIGNoZWNrIGZvciB0aGF0LgorICAgICAgICAgICAgcGFydHNIaSA9IHBhcnRzLmxlbmd0aDsKKyAgICAgICAgICAgIHBhcnRzTG8gPSAwOworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgd2UgZm91bmQgYSA6OiwgdGhlbiB3ZSBtdXN0IGhhdmUgc2tpcHBlZCBhdCBsZWFzdCBvbmUgcGFydC4KKyAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSBtdXN0IGhhdmUgZXhhY3RseSB0aGUgcmlnaHQgbnVtYmVyIG9mIHBhcnRzLgorICAgICAgICBpbnQgcGFydHNTa2lwcGVkID0gSVBWNl9QQVJUX0NPVU5UIC0gKHBhcnRzSGkgKyBwYXJ0c0xvKTsKKyAgICAgICAgaWYgKCEoc2tpcEluZGV4ID49IDAgPyBwYXJ0c1NraXBwZWQgPj0gMSA6IHBhcnRzU2tpcHBlZCA9PSAwKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvLyBOb3cgcGFyc2UgdGhlIGhleHRldHMgaW50byBhIGJ5dGUgYXJyYXkuCisgICAgICAgIEJ5dGVCdWZmZXIgcmF3Qnl0ZXMgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKDIgKiBJUFY2X1BBUlRfQ09VTlQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJ0c0hpOyBpKyspIHsKKyAgICAgICAgICAgICAgICByYXdCeXRlcy5wdXRTaG9ydChwYXJzZUhleHRldChwYXJ0c1tpXSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJ0c1NraXBwZWQ7IGkrKykgeworICAgICAgICAgICAgICAgIHJhd0J5dGVzLnB1dFNob3J0KChzaG9ydCkgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludCBpID0gcGFydHNMbzsgaSA+IDA7IGktLSkgeworICAgICAgICAgICAgICAgIHJhd0J5dGVzLnB1dFNob3J0KHBhcnNlSGV4dGV0KHBhcnRzW3BhcnRzLmxlbmd0aCAtIGldKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJhd0J5dGVzLmFycmF5KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNvbnZlcnREb3R0ZWRRdWFkVG9IZXgoU3RyaW5nIGlwU3RyaW5nKSB7CisgICAgICAgIGludCBsYXN0Q29sb24gPSBpcFN0cmluZy5sYXN0SW5kZXhPZignOicpOworICAgICAgICBTdHJpbmcgaW5pdGlhbFBhcnQgPSBpcFN0cmluZy5zdWJzdHJpbmcoMCwgbGFzdENvbG9uICsgMSk7CisgICAgICAgIFN0cmluZyBkb3R0ZWRRdWFkID0gaXBTdHJpbmcuc3Vic3RyaW5nKGxhc3RDb2xvbiArIDEpOworICAgICAgICBieXRlW10gcXVhZCA9IHRleHRUb051bWVyaWNGb3JtYXRWNChkb3R0ZWRRdWFkKTsKKyAgICAgICAgaWYgKHF1YWQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHBlbnVsdGltYXRlID0gSW50ZWdlci50b0hleFN0cmluZygoKHF1YWRbMF0gJiAweGZmKSA8PCA4KSB8IChxdWFkWzFdICYgMHhmZikpOworICAgICAgICBTdHJpbmcgdWx0aW1hdGUgPSBJbnRlZ2VyLnRvSGV4U3RyaW5nKCgocXVhZFsyXSAmIDB4ZmYpIDw8IDgpIHwgKHF1YWRbM10gJiAweGZmKSk7CisgICAgICAgIHJldHVybiBpbml0aWFsUGFydCArIHBlbnVsdGltYXRlICsgIjoiICsgdWx0aW1hdGU7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZSBwYXJzZU9jdGV0KFN0cmluZyBpcFBhcnQpIHsKKyAgICAgICAgLy8gTm90ZTogd2UgYWxyZWFkeSB2ZXJpZmllZCB0aGF0IHRoaXMgc3RyaW5nIGNvbnRhaW5zIG9ubHkgaGV4IGRpZ2l0cy4KKyAgICAgICAgaW50IG9jdGV0ID0gSW50ZWdlci5wYXJzZUludChpcFBhcnQpOworICAgICAgICAvLyBEaXNhbGxvdyBsZWFkaW5nIHplcm9lcywgYmVjYXVzZSBubyBjbGVhciBzdGFuZGFyZCBleGlzdHMgb24KKyAgICAgICAgLy8gd2hldGhlciB0aGVzZSBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgZGVjaW1hbCBvciBvY3RhbC4KKyAgICAgICAgaWYgKG9jdGV0ID4gMjU1IHx8IChpcFBhcnQuc3RhcnRzV2l0aCgiMCIpICYmIGlwUGFydC5sZW5ndGgoKSA+IDEpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChieXRlKSBvY3RldDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBzaG9ydCBwYXJzZUhleHRldChTdHJpbmcgaXBQYXJ0KSB7CisgICAgICAgIC8vIE5vdGU6IHdlIGFscmVhZHkgdmVyaWZpZWQgdGhhdCB0aGlzIHN0cmluZyBjb250YWlucyBvbmx5IGhleCBkaWdpdHMuCisgICAgICAgIGludCBoZXh0ZXQgPSBJbnRlZ2VyLnBhcnNlSW50KGlwUGFydCwgMTYpOworICAgICAgICBpZiAoaGV4dGV0ID4gMHhmZmZmKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChzaG9ydCkgaGV4dGV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgYSBieXRlIGFycmF5IGludG8gYW4gSW5ldEFkZHJlc3MuCisgICAgICogPHA+CisgICAgICoge0BsaW5rIEluZXRBZGRyZXNzI2dldEJ5QWRkcmVzc30gaXMgZG9jdW1lbnRlZCBhcyB0aHJvd2luZyBhIGNoZWNrZWQKKyAgICAgKiBleGNlcHRpb24gImlmIElQIGFkZHJlc3MgaWYgb2YgaWxsZWdhbCBsZW5ndGguIiAgV2UgcmVwbGFjZSBpdCB3aXRoCisgICAgICogYW4gdW5jaGVja2VkIGV4Y2VwdGlvbiwgZm9yIHVzZSBieSBjYWxsZXJzIHdobyBhbHJlYWR5IGtub3cgdGhhdCBhZGRyCisgICAgICogaXMgYW4gYXJyYXkgb2YgbGVuZ3RoIDQgb3IgMTYuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWRkciB0aGUgcmF3IDQtYnl0ZSBvciAxNi1ieXRlIElQIGFkZHJlc3MgaW4gYmlnLWVuZGlhbiBvcmRlcgorICAgICAqIEByZXR1cm4gYW4gSW5ldEFkZHJlc3Mgb2JqZWN0IGNyZWF0ZWQgZnJvbSB0aGUgcmF3IElQIGFkZHJlc3MKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBJbmV0QWRkcmVzcyBieXRlc1RvSW5ldEFkZHJlc3MoYnl0ZVtdIGFkZHIpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBJbmV0QWRkcmVzcy5nZXRCeUFkZHJlc3MoYWRkcik7CisgICAgICAgIH0gY2F0Y2ggKFVua25vd25Ib3N0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gSW5ldEFkZHJlc3MgcmVwcmVzZW50aW5nIHRoZSBsaXRlcmFsIElQdjQgb3IgSVB2NiBob3N0CisgICAgICogcG9ydGlvbiBvZiBhIFVSTCwgZW5jb2RlZCBpbiB0aGUgZm9ybWF0IHNwZWNpZmllZCBieSBSRkMgMzk4NiBzZWN0aW9uIDMuMi4yLgorICAgICAqIDxwPgorICAgICAqIDxwPlRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byB7QGxpbmsgSW5ldEFkZHJlc3NlcyNmb3JTdHJpbmcoU3RyaW5nKX0sCisgICAgICogaG93ZXZlciwgaXQgcmVxdWlyZXMgdGhhdCBJUHY2IGFkZHJlc3NlcyBhcmUgc3Vycm91bmRlZCBieSBzcXVhcmUgYnJhY2tldHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaG9zdEFkZHIgQSBSRkMgMzk4NiBzZWN0aW9uIDMuMi4yIGVuY29kZWQgSVB2NCBvciBJUHY2IGFkZHJlc3MKKyAgICAgKiBAcmV0dXJuIGFuIEluZXRBZGRyZXNzIHJlcHJlc2VudGluZyB0aGUgYWRkcmVzcyBpbiB7QGNvZGUgaG9zdEFkZHJ9OworICAgICAqICAgICAgICAgb3RoZXJ3aXNlIG51bGwgaWYge0Bjb2RlIGhvc3RBZGRyfSBpcyBub3QgYSB2YWxpZCBJUHY0IGFkZHJlc3MsCisgICAgICogICAgICAgICBvciBJUHY2IGFkZHJlc3Mgc3Vycm91bmRlZCAqIGJ5IHNxdWFyZSBicmFja2V0cworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEluZXRBZGRyZXNzIGZvclVyaVN0cmluZ05vVGhyb3coU3RyaW5nIGhvc3RBZGRyKSB7CisgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsKGhvc3RBZGRyKTsKKworICAgICAgICAvLyBEZWNpZGUgaWYgdGhpcyBzaG91bGQgYmUgYW4gSVB2NiBvciBJUHY0IGFkZHJlc3MuCisgICAgICAgIFN0cmluZyBpcFN0cmluZzsKKyAgICAgICAgaW50IGV4cGVjdEJ5dGVzOworICAgICAgICBpZiAoaG9zdEFkZHIuc3RhcnRzV2l0aCgiWyIpICYmIGhvc3RBZGRyLmVuZHNXaXRoKCJdIikpIHsKKyAgICAgICAgICAgIGlwU3RyaW5nID0gaG9zdEFkZHIuc3Vic3RyaW5nKDEsIGhvc3RBZGRyLmxlbmd0aCgpIC0gMSk7CisgICAgICAgICAgICBleHBlY3RCeXRlcyA9IDE2OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaXBTdHJpbmcgPSBob3N0QWRkcjsKKyAgICAgICAgICAgIGV4cGVjdEJ5dGVzID0gNDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBhcnNlIHRoZSBhZGRyZXNzLCBhbmQgbWFrZSBzdXJlIHRoZSBsZW5ndGgvdmVyc2lvbiBpcyBjb3JyZWN0LgorICAgICAgICBieXRlW10gYWRkciA9IGlwU3RyaW5nVG9CeXRlcyhpcFN0cmluZyk7CisgICAgICAgIGlmIChhZGRyID09IG51bGwgfHwgYWRkci5sZW5ndGggIT0gZXhwZWN0Qnl0ZXMpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGJ5dGVzVG9JbmV0QWRkcmVzcyhhZGRyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGUgc3VwcGxpZWQgc3RyaW5nIGlzIGEgdmFsaWQgVVJJIElQIHN0cmluZworICAgICAqIGxpdGVyYWwsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqCisgICAgICogQHBhcmFtIGlwU3RyaW5nIHtAY29kZSBTdHJpbmd9IHRvIGV2YWx1YXRlZCBhcyBhbiBJUCBVUkkgaG9zdCBzdHJpbmcgbGl0ZXJhbAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBhcmd1bWVudCBpcyBhIHZhbGlkIElQIFVSSSBob3N0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVXJpSW5ldEFkZHJlc3MoU3RyaW5nIGlwU3RyaW5nKSB7CisgICAgICAgIHJldHVybiBmb3JVcmlTdHJpbmdOb1Rocm93KGlwU3RyaW5nKSAhPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV2YWx1YXRlcyB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhbiAiSVB2NCBtYXBwZWQiIElQdjYgYWRkcmVzcy4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5BbiAiSVB2NCBtYXBwZWQiIGFkZHJlc3MgaXMgYW55dGhpbmcgaW4gdGhlIHJhbmdlIDo6ZmZmZjowOjAvOTYKKyAgICAgKiAoc29tZXRpbWVzIHdyaXR0ZW4gYXMgOjpmZmZmOjAuMC4wLjAvOTYpLCB3aXRoIHRoZSBsYXN0IDMyIGJpdHMKKyAgICAgKiBpbnRlcnByZXRlZCBhcyBhbiBJUHY0IGFkZHJlc3MuCisgICAgICogPHA+CisgICAgICogPHA+Rm9yIG1vcmUgb24gSVB2NCBtYXBwZWQgYWRkcmVzc2VzIHNlZSBzZWN0aW9uIDIuNS41LjIgb2YKKyAgICAgKiA8YSB0YXJnZXQ9Il9wYXJlbnQiCisgICAgICogaHJlZj0iaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNDI5MSNzZWN0aW9uLTIuNS41LjIiCisgICAgICogPmh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzQyOTE8L2E+CisgICAgICogPHA+CisgICAgICogPHA+Tm90ZTogVGhpcyBtZXRob2QgdGFrZXMgYSB7QGNvZGUgU3RyaW5nfSBhcmd1bWVudCBiZWNhdXNlCisgICAgICoge0BsaW5rIEluZXRBZGRyZXNzfSBhdXRvbWF0aWNhbGx5IGNvbGxhcHNlcyBtYXBwZWQgYWRkcmVzc2VzIHRvIElQdjQuCisgICAgICogKEl0IGlzIGFjdHVhbGx5IHBvc3NpYmxlIHRvIGF2b2lkIHRoaXMgdXNpbmcgb25lIG9mIHRoZSBvYnNjdXJlCisgICAgICoge0BsaW5rIEluZXQ2QWRkcmVzc30gbWV0aG9kcywgYnV0IGl0IHdvdWxkIGJlIHVud2lzZSB0byBkZXBlbmQgb24gc3VjaAorICAgICAqIGEgcG9vcmx5LWRvY3VtZW50ZWQgZmVhdHVyZS4pCisgICAgICoKKyAgICAgKiBAcGFyYW0gaXBTdHJpbmcge0Bjb2RlIFN0cmluZ30gdG8gYmUgZXhhbWluZWQgZm9yIGVtYmVkZGVkIElQdjQtbWFwcGVkIElQdjYgYWRkcmVzcyBmb3JtYXQKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgYXJndW1lbnQgaXMgYSB2YWxpZCAibWFwcGVkIiBhZGRyZXNzCisgICAgICogQHNpbmNlIDEwLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNNYXBwZWRJUHY0QWRkcmVzcyhTdHJpbmcgaXBTdHJpbmcpIHsKKyAgICAgICAgYnl0ZVtdIGJ5dGVzID0gaXBTdHJpbmdUb0J5dGVzKGlwU3RyaW5nKTsKKyAgICAgICAgaWYgKGJ5dGVzICE9IG51bGwgJiYgYnl0ZXMubGVuZ3RoID09IDE2KSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoYnl0ZXNbaV0gIT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDEwOyBpIDwgMTI7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChieXRlc1tpXSAhPSAoYnl0ZSkgMHhmZikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9JbnRzLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL0ludHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmJhZmI0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9JbnRzLmphdmEKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgR3VhdmEgQXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKKy8qKgorICogU3RhdGljIHV0aWxpdHkgbWV0aG9kcyBwZXJ0YWluaW5nIHRvIHtAY29kZSBpbnR9IHByaW1pdGl2ZXMsIHRoYXQgYXJlIG5vdAorICogYWxyZWFkeSBmb3VuZCBpbiBlaXRoZXIge0BsaW5rIEludGVnZXJ9IG9yIHtAbGluayBBcnJheXN9LgorICogPHA+CisgKiA8cD5TZWUgdGhlIEd1YXZhIFVzZXIgR3VpZGUgYXJ0aWNsZSBvbiA8YSBocmVmPQorICogImh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9ndWF2YS1saWJyYXJpZXMvd2lraS9QcmltaXRpdmVzRXhwbGFpbmVkIj4KKyAqIHByaW1pdGl2ZSB1dGlsaXRpZXM8L2E+LgorICoKKyAqIEBhdXRob3IgS2V2aW4gQm91cnJpbGxpb24KKyAqIEBzaW5jZSAxLjAKKyAqLworZmluYWwgY2xhc3MgSW50cyB7CisgICAgLyoqCisgICAgICogVGhlIGxhcmdlc3QgcG93ZXIgb2YgdHdvIHRoYXQgY2FuIGJlIHJlcHJlc2VudGVkIGFzIGFuIHtAY29kZSBpbnR9LgorICAgICAqCisgICAgICogQHNpbmNlIDEwLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfUE9XRVJfT0ZfVFdPID0gMSA8PCAoSW50ZWdlci5TSVpFIC0gMik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIGFzY2lpRGlnaXRzID0gbmV3IGJ5dGVbMTI4XTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIEFycmF5cy5maWxsKGFzY2lpRGlnaXRzLCAoYnl0ZSkgLTEpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSA5OyBpKyspIHsKKyAgICAgICAgICAgIGFzY2lpRGlnaXRzWycwJyArIGldID0gKGJ5dGUpIGk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gMjY7IGkrKykgeworICAgICAgICAgICAgYXNjaWlEaWdpdHNbJ0EnICsgaV0gPSAoYnl0ZSkgKDEwICsgaSk7CisgICAgICAgICAgICBhc2NpaURpZ2l0c1snYScgKyBpXSA9IChieXRlKSAoMTAgKyBpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgSW50cygpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB7QGNvZGUgaW50fSBuZWFyZXN0IGluIHZhbHVlIHRvIHtAY29kZSB2YWx1ZX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgYW55IHtAY29kZSBsb25nfSB2YWx1ZQorICAgICAqIEByZXR1cm4gdGhlIHNhbWUgdmFsdWUgY2FzdCB0byB7QGNvZGUgaW50fSBpZiBpdCBpcyBpbiB0aGUgcmFuZ2Ugb2YgdGhlCisgICAgICoge0Bjb2RlIGludH0gdHlwZSwge0BsaW5rIEludGVnZXIjTUFYX1ZBTFVFfSBpZiBpdCBpcyB0b28gbGFyZ2UsCisgICAgICogb3Ige0BsaW5rIEludGVnZXIjTUlOX1ZBTFVFfSBpZiBpdCBpcyB0b28gc21hbGwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBzYXR1cmF0ZWRDYXN0KGxvbmcgdmFsdWUpIHsKKyAgICAgICAgaWYgKHZhbHVlID4gSW50ZWdlci5NQVhfVkFMVUUpIHsKKyAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWUgPCBJbnRlZ2VyLk1JTl9WQUxVRSkgeworICAgICAgICAgICAgcmV0dXJuIEludGVnZXIuTUlOX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoaW50KSB2YWx1ZTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvSXRlcmFibGVzLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL0l0ZXJhYmxlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NGRlYTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL0l0ZXJhYmxlcy5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEd1YXZhIEF1dGhvcnMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKKworaW1wb3J0IHN0YXRpYyBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGNvbnRhaW5zIHN0YXRpYyB1dGlsaXR5IG1ldGhvZHMgdGhhdCBvcGVyYXRlIG9uIG9yIHJldHVybiBvYmplY3RzCisgKiBvZiB0eXBlIHtAY29kZSBJdGVyYWJsZX0uIEV4Y2VwdCBhcyBub3RlZCwgZWFjaCBtZXRob2QgaGFzIGEgY29ycmVzcG9uZGluZworICoge0BsaW5rIEl0ZXJhdG9yfS1iYXNlZCBtZXRob2QgaW4gdGhlIHtAbGluayBJdGVyYXRvcnN9IGNsYXNzLgorICogPHA+CisgKiA8cD48aT5QZXJmb3JtYW5jZSBub3Rlczo8L2k+IFVubGVzcyBvdGhlcndpc2Ugbm90ZWQsIGFsbCBvZiB0aGUgaXRlcmFibGVzCisgKiBwcm9kdWNlZCBpbiB0aGlzIGNsYXNzIGFyZSA8aT5sYXp5PC9pPiwgd2hpY2ggbWVhbnMgdGhhdCB0aGVpciBpdGVyYXRvcnMKKyAqIG9ubHkgYWR2YW5jZSB0aGUgYmFja2luZyBpdGVyYXRpb24gd2hlbiBhYnNvbHV0ZWx5IG5lY2Vzc2FyeS4KKyAqIDxwPgorICogPHA+U2VlIHRoZSBHdWF2YSBVc2VyIEd1aWRlIGFydGljbGUgb24gPGEgaHJlZj0KKyAqICJodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ3VhdmEtbGlicmFyaWVzL3dpa2kvQ29sbGVjdGlvblV0aWxpdGllc0V4cGxhaW5lZCNJdGVyYWJsZXMiPgorICoge0Bjb2RlIEl0ZXJhYmxlc308L2E+LgorICoKKyAqIEBhdXRob3IgS2V2aW4gQm91cnJpbGxpb24KKyAqIEBhdXRob3IgSmFyZWQgTGV2eQorICogQHNpbmNlIDIuMCAoaW1wb3J0ZWQgZnJvbSBHb29nbGUgQ29sbGVjdGlvbnMgTGlicmFyeSkKKyAqLworZmluYWwgY2xhc3MgSXRlcmFibGVzIHsKKyAgICBwcml2YXRlIEl0ZXJhYmxlcygpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBlbGVtZW50IGluIHtAY29kZSBpdGVyYWJsZX0gb3Ige0Bjb2RlIGRlZmF1bHRWYWx1ZX0gaWYKKyAgICAgKiB0aGUgaXRlcmFibGUgaXMgZW1wdHkuICBUaGUge0BsaW5rIEl0ZXJhdG9yc30gYW5hbG9nIHRvIHRoaXMgbWV0aG9kIGlzCisgICAgICoge0BsaW5rIEl0ZXJhdG9ycyNnZXROZXh0fS4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5JZiBubyBkZWZhdWx0IHZhbHVlIGlzIGRlc2lyZWQgKGFuZCB0aGUgY2FsbGVyIGluc3RlYWQgd2FudHMgYQorICAgICAqIHtAbGluayBOb1N1Y2hFbGVtZW50RXhjZXB0aW9ufSB0byBiZSB0aHJvd24pLCBpdCBpcyByZWNvbW1lbmRlZCB0aGF0CisgICAgICoge0Bjb2RlIGl0ZXJhYmxlLml0ZXJhdG9yKCkubmV4dCgpfSBpcyB1c2VkIGluc3RlYWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSBkZWZhdWx0IHZhbHVlIHRvIHJldHVybiBpZiB0aGUgaXRlcmFibGUgaXMgZW1wdHkKKyAgICAgKiBAcmV0dXJuIHRoZSBmaXJzdCBlbGVtZW50IG9mIHtAY29kZSBpdGVyYWJsZX0gb3IgdGhlIGRlZmF1bHQgdmFsdWUKKyAgICAgKiBAc2luY2UgNy4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8VD4gVCBnZXRGaXJzdChJdGVyYWJsZTw/IGV4dGVuZHMgVD4gaXRlcmFibGUsIFQgZGVmYXVsdFZhbHVlKSB7CisgICAgICAgIHJldHVybiBJdGVyYXRvcnMuZ2V0TmV4dChpdGVyYWJsZS5pdGVyYXRvcigpLCBkZWZhdWx0VmFsdWUpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9JdGVyYXRvcnMuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvSXRlcmF0b3JzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRmNWI5YQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvSXRlcmF0b3JzLmphdmEKQEAgLTAsMCArMSw1MzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEd1YXZhIEF1dGhvcnMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmEuUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50OworaW1wb3J0IHN0YXRpYyBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmEuUHJlY29uZGl0aW9ucy5jaGVja1N0YXRlOworaW1wb3J0IHN0YXRpYyBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YS5QcmVkaWNhdGVzLmluOworCisvKioKKyAqIFRoaXMgY2xhc3MgY29udGFpbnMgc3RhdGljIHV0aWxpdHkgbWV0aG9kcyB0aGF0IG9wZXJhdGUgb24gb3IgcmV0dXJuIG9iamVjdHMKKyAqIG9mIHR5cGUge0BsaW5rIEl0ZXJhdG9yfS4gRXhjZXB0IGFzIG5vdGVkLCBlYWNoIG1ldGhvZCBoYXMgYSBjb3JyZXNwb25kaW5nCisgKiB7QGxpbmsgSXRlcmFibGV9LWJhc2VkIG1ldGhvZCBpbiB0aGUge0BsaW5rIEl0ZXJhYmxlc30gY2xhc3MuCisgKiA8cD4KKyAqIDxwPjxpPlBlcmZvcm1hbmNlIG5vdGVzOjwvaT4gVW5sZXNzIG90aGVyd2lzZSBub3RlZCwgYWxsIG9mIHRoZSBpdGVyYXRvcnMKKyAqIHByb2R1Y2VkIGluIHRoaXMgY2xhc3MgYXJlIDxpPmxhenk8L2k+LCB3aGljaCBtZWFucyB0aGF0IHRoZXkgb25seSBhZHZhbmNlCisgKiB0aGUgYmFja2luZyBpdGVyYXRpb24gd2hlbiBhYnNvbHV0ZWx5IG5lY2Vzc2FyeS4KKyAqIDxwPgorICogPHA+U2VlIHRoZSBHdWF2YSBVc2VyIEd1aWRlIHNlY3Rpb24gb24gPGEgaHJlZj0KKyAqICJodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ3VhdmEtbGlicmFyaWVzL3dpa2kvQ29sbGVjdGlvblV0aWxpdGllc0V4cGxhaW5lZCNJdGVyYWJsZXMiPgorICoge0Bjb2RlIEl0ZXJhdG9yc308L2E+LgorICoKKyAqIEBhdXRob3IgS2V2aW4gQm91cnJpbGxpb24KKyAqIEBhdXRob3IgSmFyZWQgTGV2eQorICogQHNpbmNlIDIuMCAoaW1wb3J0ZWQgZnJvbSBHb29nbGUgQ29sbGVjdGlvbnMgTGlicmFyeSkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEl0ZXJhdG9ycyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVW5tb2RpZmlhYmxlTGlzdEl0ZXJhdG9yPE9iamVjdD4gRU1QVFlfTElTVF9JVEVSQVRPUgorICAgICAgICAgICAgPSBuZXcgVW5tb2RpZmlhYmxlTGlzdEl0ZXJhdG9yPE9iamVjdD4oKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPYmplY3QgbmV4dCgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzUHJldmlvdXMoKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE9iamVjdCBwcmV2aW91cygpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBuZXh0SW5kZXgoKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHByZXZpb3VzSW5kZXgoKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEl0ZXJhdG9yPE9iamVjdD4gRU1QVFlfTU9ESUZJQUJMRV9JVEVSQVRPUiA9CisgICAgICAgICAgICBuZXcgSXRlcmF0b3I8T2JqZWN0PigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBuZXh0KCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgQ29sbGVjdFByZWNvbmRpdGlvbnMuY2hlY2tSZW1vdmUoZmFsc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICBwcml2YXRlIEl0ZXJhdG9ycygpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBlbXB0eSBpdGVyYXRvci4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5UaGUge0BsaW5rIEl0ZXJhYmxlfSBlcXVpdmFsZW50IG9mIHRoaXMgbWV0aG9kIGlzIHtAbGluaworICAgICAqIEltbXV0YWJsZVNldCNvZigpfS4KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGNvZGUgSW1tdXRhYmxlU2V0LjxUPm9mKCkuaXRlcmF0b3IoKX0gaW5zdGVhZDsgb3IgZm9yCisgICAgICogSmF2YSA3IG9yIGxhdGVyLCB7QGxpbmsgQ29sbGVjdGlvbnMjZW1wdHlJdGVyYXRvcn0uIFRoaXMgbWV0aG9kIGlzCisgICAgICogc2NoZWR1bGVkIGZvciByZW1vdmFsIGluIE1heSAyMDE2LgorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIHN0YXRpYyA8VD4gVW5tb2RpZmlhYmxlSXRlcmF0b3I8VD4gZW1wdHlJdGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIGVtcHR5TGlzdEl0ZXJhdG9yKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZW1wdHkgaXRlcmF0b3IuCisgICAgICogPHA+CisgICAgICogPHA+VGhlIHtAbGluayBJdGVyYWJsZX0gZXF1aXZhbGVudCBvZiB0aGlzIG1ldGhvZCBpcyB7QGxpbmsKKyAgICAgKiBJbW11dGFibGVTZXQjb2YoKX0uCisgICAgICovCisgICAgLy8gQ2FzdGluZyB0byBhbnkgdHlwZSBpcyBzYWZlIHNpbmNlIHRoZXJlIGFyZSBubyBhY3R1YWwgZWxlbWVudHMuCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHJpdmF0ZSBzdGF0aWMgPFQ+IFVubW9kaWZpYWJsZUxpc3RJdGVyYXRvcjxUPiBlbXB0eUxpc3RJdGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIChVbm1vZGlmaWFibGVMaXN0SXRlcmF0b3I8VD4pIEVNUFRZX0xJU1RfSVRFUkFUT1I7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZW1wdHkge0Bjb2RlIEl0ZXJhdG9yfSB0aGF0IHRocm93cworICAgICAqIHtAbGluayBJbGxlZ2FsU3RhdGVFeGNlcHRpb259IGluc3RlYWQgb2YKKyAgICAgKiB7QGxpbmsgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb259IG9uIGEgY2FsbCB0bworICAgICAqIHtAbGluayBJdGVyYXRvciNyZW1vdmUoKX0uCisgICAgICovCisgICAgLy8gQ2FzdGluZyB0byBhbnkgdHlwZSBpcyBzYWZlIHNpbmNlIHRoZXJlIGFyZSBubyBhY3R1YWwgZWxlbWVudHMuCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgc3RhdGljIDxUPiBJdGVyYXRvcjxUPiBlbXB0eU1vZGlmaWFibGVJdGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIChJdGVyYXRvcjxUPikgRU1QVFlfTU9ESUZJQUJMRV9JVEVSQVRPUjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIHVubW9kaWZpYWJsZSB2aWV3IG9mIHtAY29kZSBpdGVyYXRvcn0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8VD4gVW5tb2RpZmlhYmxlSXRlcmF0b3I8VD4gdW5tb2RpZmlhYmxlSXRlcmF0b3IoCisgICAgICAgICAgICBmaW5hbCBJdGVyYXRvcjxUPiBpdGVyYXRvcikgeworICAgICAgICBjaGVja05vdE51bGwoaXRlcmF0b3IpOworICAgICAgICBpZiAoaXRlcmF0b3IgaW5zdGFuY2VvZiBVbm1vZGlmaWFibGVJdGVyYXRvcikgeworICAgICAgICAgICAgcmV0dXJuIChVbm1vZGlmaWFibGVJdGVyYXRvcjxUPikgaXRlcmF0b3I7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBVbm1vZGlmaWFibGVJdGVyYXRvcjxUPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBUIG5leHQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgcmVtYWluaW5nIGluIHtAY29kZSBpdGVyYXRvcn0uIFRoZSBpdGVyYXRvcgorICAgICAqIHdpbGwgYmUgbGVmdCBleGhhdXN0ZWQ6IGl0cyB7QGNvZGUgaGFzTmV4dCgpfSBtZXRob2Qgd2lsbCByZXR1cm4KKyAgICAgKiB7QGNvZGUgZmFsc2V9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IHNpemUoSXRlcmF0b3I8Pz4gaXRlcmF0b3IpIHsKKyAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgaXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJhdmVyc2VzIGFuIGl0ZXJhdG9yIGFuZCByZW1vdmVzIGV2ZXJ5IGVsZW1lbnQgdGhhdCBiZWxvbmdzIHRvIHRoZQorICAgICAqIHByb3ZpZGVkIGNvbGxlY3Rpb24uIFRoZSBpdGVyYXRvciB3aWxsIGJlIGxlZnQgZXhoYXVzdGVkOiBpdHMKKyAgICAgKiB7QGNvZGUgaGFzTmV4dCgpfSBtZXRob2Qgd2lsbCByZXR1cm4ge0Bjb2RlIGZhbHNlfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZW1vdmVGcm9tICAgICAgIHRoZSBpdGVyYXRvciB0byAocG90ZW50aWFsbHkpIHJlbW92ZSBlbGVtZW50cyBmcm9tCisgICAgICogQHBhcmFtIGVsZW1lbnRzVG9SZW1vdmUgdGhlIGVsZW1lbnRzIHRvIHJlbW92ZQorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGFueSBlbGVtZW50IHdhcyByZW1vdmVkIGZyb20ge0Bjb2RlIGl0ZXJhdG9yfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZW1vdmVBbGwoCisgICAgICAgICAgICBJdGVyYXRvcjw/PiByZW1vdmVGcm9tLCBDb2xsZWN0aW9uPD8+IGVsZW1lbnRzVG9SZW1vdmUpIHsKKyAgICAgICAgcmV0dXJuIHJlbW92ZUlmKHJlbW92ZUZyb20sIGluKGVsZW1lbnRzVG9SZW1vdmUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGV2ZXJ5IGVsZW1lbnQgdGhhdCBzYXRpc2ZpZXMgdGhlIHByb3ZpZGVkIHByZWRpY2F0ZSBmcm9tIHRoZQorICAgICAqIGl0ZXJhdG9yLiBUaGUgaXRlcmF0b3Igd2lsbCBiZSBsZWZ0IGV4aGF1c3RlZDogaXRzIHtAY29kZSBoYXNOZXh0KCl9CisgICAgICogbWV0aG9kIHdpbGwgcmV0dXJuIHtAY29kZSBmYWxzZX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVtb3ZlRnJvbSB0aGUgaXRlcmF0b3IgdG8gKHBvdGVudGlhbGx5KSByZW1vdmUgZWxlbWVudHMgZnJvbQorICAgICAqIEBwYXJhbSBwcmVkaWNhdGUgIGEgcHJlZGljYXRlIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIGFuIGVsZW1lbnQgc2hvdWxkCisgICAgICogICAgICAgICAgICAgICAgICAgYmUgcmVtb3ZlZAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGFueSBlbGVtZW50cyB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgaXRlcmF0b3IKKyAgICAgKiBAc2luY2UgMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8VD4gYm9vbGVhbiByZW1vdmVJZigKKyAgICAgICAgICAgIEl0ZXJhdG9yPFQ+IHJlbW92ZUZyb20sIFByZWRpY2F0ZTw/IHN1cGVyIFQ+IHByZWRpY2F0ZSkgeworICAgICAgICBjaGVja05vdE51bGwocHJlZGljYXRlKTsKKyAgICAgICAgYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOworICAgICAgICB3aGlsZSAocmVtb3ZlRnJvbS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIGlmIChwcmVkaWNhdGUudGVzdChyZW1vdmVGcm9tLm5leHQoKSkpIHsKKyAgICAgICAgICAgICAgICByZW1vdmVGcm9tLnJlbW92ZSgpOworICAgICAgICAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbW9kaWZpZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHR3byBpdGVyYXRvcnMgY29udGFpbiBlcXVhbCBlbGVtZW50cyBpbiB0aGUgc2FtZSBvcmRlci4KKyAgICAgKiBNb3JlIHNwZWNpZmljYWxseSwgdGhpcyBtZXRob2QgcmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYge0Bjb2RlIGl0ZXJhdG9yMX0KKyAgICAgKiBhbmQge0Bjb2RlIGl0ZXJhdG9yMn0gY29udGFpbiB0aGUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMgYW5kIGV2ZXJ5IGVsZW1lbnQKKyAgICAgKiBvZiB7QGNvZGUgaXRlcmF0b3IxfSBpcyBlcXVhbCB0byB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IG9mCisgICAgICoge0Bjb2RlIGl0ZXJhdG9yMn0uCisgICAgICogPHA+CisgICAgICogPHA+Tm90ZSB0aGF0IHRoaXMgd2lsbCBtb2RpZnkgdGhlIHN1cHBsaWVkIGl0ZXJhdG9ycywgc2luY2UgdGhleSB3aWxsIGhhdmUKKyAgICAgKiBiZWVuIGFkdmFuY2VkIHNvbWUgbnVtYmVyIG9mIGVsZW1lbnRzIGZvcndhcmQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGVsZW1lbnRzRXF1YWwoCisgICAgICAgICAgICBJdGVyYXRvcjw/PiBpdGVyYXRvcjEsIEl0ZXJhdG9yPD8+IGl0ZXJhdG9yMikgeworICAgICAgICB3aGlsZSAoaXRlcmF0b3IxLmhhc05leHQoKSkgeworICAgICAgICAgICAgaWYgKCFpdGVyYXRvcjIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgT2JqZWN0IG8xID0gaXRlcmF0b3IxLm5leHQoKTsKKyAgICAgICAgICAgIE9iamVjdCBvMiA9IGl0ZXJhdG9yMi5uZXh0KCk7CisgICAgICAgICAgICBpZiAoIU9iamVjdHMuZXF1YWxzKG8xLCBvMikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICFpdGVyYXRvcjIuaGFzTmV4dCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYWxsIGVsZW1lbnRzIGluIHtAY29kZSBpdGVyYXRvcn0gdG8ge0Bjb2RlIGNvbGxlY3Rpb259LiBUaGUgaXRlcmF0b3IKKyAgICAgKiB3aWxsIGJlIGxlZnQgZXhoYXVzdGVkOiBpdHMge0Bjb2RlIGhhc05leHQoKX0gbWV0aG9kIHdpbGwgcmV0dXJuCisgICAgICoge0Bjb2RlIGZhbHNlfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHtAY29kZSBjb2xsZWN0aW9ufSB3YXMgbW9kaWZpZWQgYXMgYSByZXN1bHQgb2YgdGhpcworICAgICAqIG9wZXJhdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IGJvb2xlYW4gYWRkQWxsKAorICAgICAgICAgICAgQ29sbGVjdGlvbjxUPiBhZGRUbywgSXRlcmF0b3I8PyBleHRlbmRzIFQ+IGl0ZXJhdG9yKSB7CisgICAgICAgIGNoZWNrTm90TnVsbChhZGRUbyk7CisgICAgICAgIGNoZWNrTm90TnVsbChpdGVyYXRvcik7CisgICAgICAgIGJvb2xlYW4gd2FzTW9kaWZpZWQgPSBmYWxzZTsKKyAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgd2FzTW9kaWZpZWQgfD0gYWRkVG8uYWRkKGl0ZXJhdG9yLm5leHQoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHdhc01vZGlmaWVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIGV2ZXJ5IGVsZW1lbnQgcmV0dXJuZWQgYnkge0Bjb2RlIGl0ZXJhdG9yfQorICAgICAqIHNhdGlzZmllcyB0aGUgZ2l2ZW4gcHJlZGljYXRlLiBJZiB7QGNvZGUgaXRlcmF0b3J9IGlzIGVtcHR5LCB7QGNvZGUgdHJ1ZX0KKyAgICAgKiBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUPiBib29sZWFuIGFsbCgKKyAgICAgICAgICAgIEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yLCBQcmVkaWNhdGU8PyBzdXBlciBUPiBwcmVkaWNhdGUpIHsKKyAgICAgICAgY2hlY2tOb3ROdWxsKHByZWRpY2F0ZSk7CisgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIFQgZWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgIGlmICghcHJlZGljYXRlLnRlc3QoZWxlbWVudCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgaW5kZXggaW4ge0Bjb2RlIGl0ZXJhdG9yfSBvZiB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IHNhdGlzZmllcworICAgICAqIHRoZSBwcm92aWRlZCB7QGNvZGUgcHJlZGljYXRlfSwgb3Ige0Bjb2RlIC0xfSBpZiB0aGUgSXRlcmF0b3IgaGFzIG5vIHN1Y2gKKyAgICAgKiBlbGVtZW50cy4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5Nb3JlIGZvcm1hbGx5LCByZXR1cm5zIHRoZSBsb3dlc3QgaW5kZXgge0Bjb2RlIGl9IHN1Y2ggdGhhdAorICAgICAqIHtAY29kZSBwcmVkaWNhdGUuYXBwbHkoSXRlcmF0b3JzLmdldChpdGVyYXRvciwgaSkpfSByZXR1cm5zIHtAY29kZSB0cnVlfSwKKyAgICAgKiBvciB7QGNvZGUgLTF9IGlmIHRoZXJlIGlzIG5vIHN1Y2ggaW5kZXguCisgICAgICogPHA+CisgICAgICogPHA+SWYgLTEgaXMgcmV0dXJuZWQsIHRoZSBpdGVyYXRvciB3aWxsIGJlIGxlZnQgZXhoYXVzdGVkOiBpdHMKKyAgICAgKiB7QGNvZGUgaGFzTmV4dCgpfSBtZXRob2Qgd2lsbCByZXR1cm4ge0Bjb2RlIGZhbHNlfS4gIE90aGVyd2lzZSwKKyAgICAgKiB0aGUgaXRlcmF0b3Igd2lsbCBiZSBzZXQgdG8gdGhlIGVsZW1lbnQgd2hpY2ggc2F0aXNmaWVzIHRoZQorICAgICAqIHtAY29kZSBwcmVkaWNhdGV9LgorICAgICAqCisgICAgICogQHNpbmNlIDIuMAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIDxUPiBpbnQgaW5kZXhPZigKKyAgICAgICAgICAgIEl0ZXJhdG9yPFQ+IGl0ZXJhdG9yLCBQcmVkaWNhdGU8PyBzdXBlciBUPiBwcmVkaWNhdGUpIHsKKyAgICAgICAgY2hlY2tOb3ROdWxsKHByZWRpY2F0ZSwgInByZWRpY2F0ZSIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaXRlcmF0b3IuaGFzTmV4dCgpOyBpKyspIHsKKyAgICAgICAgICAgIFQgY3VycmVudCA9IGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChwcmVkaWNhdGUudGVzdChjdXJyZW50KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIHRoYXQgYXBwbGllcyB7QGNvZGUgZnVuY3Rpb259IHRvIGVhY2ggZWxlbWVudCBvZiB7QGNvZGUKKyAgICAgKiBmcm9tSXRlcmF0b3J9LgorICAgICAqIDxwPgorICAgICAqIDxwPlRoZSByZXR1cm5lZCBpdGVyYXRvciBzdXBwb3J0cyB7QGNvZGUgcmVtb3ZlKCl9IGlmIHRoZSBwcm92aWRlZCBpdGVyYXRvcgorICAgICAqIGRvZXMuIEFmdGVyIGEgc3VjY2Vzc2Z1bCB7QGNvZGUgcmVtb3ZlKCl9IGNhbGwsIHtAY29kZSBmcm9tSXRlcmF0b3J9IG5vCisgICAgICogbG9uZ2VyIGNvbnRhaW5zIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8RiwgVD4gSXRlcmF0b3I8VD4gdHJhbnNmb3JtKGZpbmFsIEl0ZXJhdG9yPEY+IGZyb21JdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRnVuY3Rpb248PyBzdXBlciBGLCA/IGV4dGVuZHMgVD4gZnVuY3Rpb24pIHsKKyAgICAgICAgY2hlY2tOb3ROdWxsKGZ1bmN0aW9uKTsKKyAgICAgICAgcmV0dXJuIG5ldyBUcmFuc2Zvcm1lZEl0ZXJhdG9yPEYsIFQ+KGZyb21JdGVyYXRvcikgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBUIHRyYW5zZm9ybShGIGZyb20pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24uYXBwbHkoZnJvbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmV4dCBlbGVtZW50IGluIHtAY29kZSBpdGVyYXRvcn0gb3Ige0Bjb2RlIGRlZmF1bHRWYWx1ZX0gaWYKKyAgICAgKiB0aGUgaXRlcmF0b3IgaXMgZW1wdHkuICBUaGUge0BsaW5rIEl0ZXJhYmxlc30gYW5hbG9nIHRvIHRoaXMgbWV0aG9kIGlzCisgICAgICoge0BsaW5rIEl0ZXJhYmxlcyNnZXRGaXJzdH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSBkZWZhdWx0IHZhbHVlIHRvIHJldHVybiBpZiB0aGUgaXRlcmF0b3IgaXMgZW1wdHkKKyAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IGVsZW1lbnQgb2Yge0Bjb2RlIGl0ZXJhdG9yfSBvciB0aGUgZGVmYXVsdCB2YWx1ZQorICAgICAqIEBzaW5jZSA3LjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUPiBUIGdldE5leHQoSXRlcmF0b3I8PyBleHRlbmRzIFQ+IGl0ZXJhdG9yLCBUIGRlZmF1bHRWYWx1ZSkgeworICAgICAgICByZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpID8gaXRlcmF0b3IubmV4dCgpIDogZGVmYXVsdFZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlbGV0ZXMgYW5kIHJldHVybnMgdGhlIG5leHQgdmFsdWUgZnJvbSB0aGUgaXRlcmF0b3IsIG9yIHJldHVybnMKKyAgICAgKiB7QGNvZGUgbnVsbH0gaWYgdGhlcmUgaXMgbm8gc3VjaCB2YWx1ZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgPFQ+IFQgcG9sbE5leHQoSXRlcmF0b3I8VD4gaXRlcmF0b3IpIHsKKyAgICAgICAgaWYgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgVCByZXN1bHQgPSBpdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICBpdGVyYXRvci5yZW1vdmUoKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIE1ldGhvZHMgb25seSBpbiBJdGVyYXRvcnMsIG5vdCBpbiBJdGVyYWJsZXMKKworICAgIC8qKgorICAgICAqIENsZWFycyB0aGUgaXRlcmF0b3IgdXNpbmcgaXRzIHJlbW92ZSBtZXRob2QuCisgICAgICovCisgICAgc3RhdGljIHZvaWQgY2xlYXIoSXRlcmF0b3I8Pz4gaXRlcmF0b3IpIHsKKyAgICAgICAgY2hlY2tOb3ROdWxsKGl0ZXJhdG9yKTsKKyAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgaXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgaXRlcmF0b3IucmVtb3ZlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzIG9mIHtAY29kZSBhcnJheX0gaW4gb3JkZXIuIFRoZQorICAgICAqIHJldHVybmVkIGl0ZXJhdG9yIGlzIGEgdmlldyBvZiB0aGUgYXJyYXk7IHN1YnNlcXVlbnQgY2hhbmdlcyB0byB0aGUgYXJyYXkKKyAgICAgKiB3aWxsIGJlIHJlZmxlY3RlZCBpbiB0aGUgaXRlcmF0b3IuCisgICAgICogPHA+CisgICAgICogPHA+PGI+Tm90ZTo8L2I+IEl0IGlzIG9mdGVuIHByZWZlcmFibGUgdG8gcmVwcmVzZW50IHlvdXIgZGF0YSB1c2luZyBhCisgICAgICogY29sbGVjdGlvbiB0eXBlLCBmb3IgZXhhbXBsZSB1c2luZyB7QGxpbmsgQXJyYXlzI2FzTGlzdChPYmplY3RbXSl9LCBtYWtpbmcKKyAgICAgKiB0aGlzIG1ldGhvZCB1bm5lY2Vzc2FyeS4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5UaGUge0Bjb2RlIEl0ZXJhYmxlfSBlcXVpdmFsZW50IG9mIHRoaXMgbWV0aG9kIGlzIGVpdGhlciB7QGxpbmsKKyAgICAgKiBBcnJheXMjYXNMaXN0KE9iamVjdFtdKX0sIHtAbGluayBJbW11dGFibGVMaXN0I2NvcHlPZihPYmplY3RbXSl9fSwKKyAgICAgKiBvciB7QGxpbmsgSW1tdXRhYmxlTGlzdCNvZn0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8VD4gVW5tb2RpZmlhYmxlSXRlcmF0b3I8VD4gZm9yQXJyYXkoZmluYWwgVC4uLiBhcnJheSkgeworICAgICAgICByZXR1cm4gZm9yQXJyYXkoYXJyYXksIDAsIGFycmF5Lmxlbmd0aCwgMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGxpc3QgaXRlcmF0b3IgY29udGFpbmluZyB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCByYW5nZSBvZgorICAgICAqIHtAY29kZSBhcnJheX0gaW4gb3JkZXIsIHN0YXJ0aW5nIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCisgICAgICogPHA+CisgICAgICogPHA+VGhlIHtAY29kZSBJdGVyYWJsZX0gZXF1aXZhbGVudCBvZiB0aGlzIG1ldGhvZCBpcyB7QGNvZGUKKyAgICAgKiBBcnJheXMuYXNMaXN0KGFycmF5KS5zdWJMaXN0KG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKS5saXN0SXRlcmF0b3IoaW5kZXgpfS4KKyAgICAgKi8KKyAgICBzdGF0aWMgPFQ+IFVubW9kaWZpYWJsZUxpc3RJdGVyYXRvcjxUPiBmb3JBcnJheSgKKyAgICAgICAgICAgIGZpbmFsIFRbXSBhcnJheSwgZmluYWwgaW50IG9mZnNldCwgaW50IGxlbmd0aCwgaW50IGluZGV4KSB7CisgICAgICAgIGNoZWNrQXJndW1lbnQobGVuZ3RoID49IDApOworICAgICAgICBpbnQgZW5kID0gb2Zmc2V0ICsgbGVuZ3RoOworCisgICAgICAgIC8vIFRlY2huaWNhbGx5IHdlIHNob3VsZCBnaXZlIGEgc2xpZ2h0bHkgbW9yZSBkZXNjcmlwdGl2ZSBlcnJvciBvbiBvdmVyZmxvdworICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrUG9zaXRpb25JbmRleGVzKG9mZnNldCwgZW5kLCBhcnJheS5sZW5ndGgpOworICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrUG9zaXRpb25JbmRleChpbmRleCwgbGVuZ3RoKTsKKyAgICAgICAgaWYgKGxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZW1wdHlMaXN0SXRlcmF0b3IoKTsKKyAgICAgICAgfQorCisgICAgLyoKKyAgICAgKiBXZSBjYW4ndCB1c2UgY2FsbCB0aGUgdHdvLWFyZyBjb25zdHJ1Y3RvciB3aXRoIGFyZ3VtZW50cyAob2Zmc2V0LCBlbmQpCisgICAgICogYmVjYXVzZSB0aGUgcmV0dXJuZWQgSXRlcmF0b3IgaXMgYSBMaXN0SXRlcmF0b3IgdGhhdCBtYXkgYmUgbW92ZWQgYmFjaworICAgICAqIHBhc3QgdGhlIGJlZ2lubmluZyBvZiB0aGUgaXRlcmF0aW9uLgorICAgICAqLworICAgICAgICByZXR1cm4gbmV3IEFic3RyYWN0SW5kZXhlZExpc3RJdGVyYXRvcjxUPihsZW5ndGgsIGluZGV4KSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBUIGdldChpbnQgaW5kZXgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXlbb2Zmc2V0ICsgaW5kZXhdOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gaXRlcmF0b3IgY29udGFpbmluZyBvbmx5IHtAY29kZSB2YWx1ZX0uCisgICAgICogPHA+CisgICAgICogPHA+VGhlIHtAbGluayBJdGVyYWJsZX0gZXF1aXZhbGVudCBvZiB0aGlzIG1ldGhvZCBpcyB7QGxpbmsKKyAgICAgKiBDb2xsZWN0aW9ucyNzaW5nbGV0b259LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFVubW9kaWZpYWJsZUl0ZXJhdG9yPFQ+IHNpbmdsZXRvbkl0ZXJhdG9yKAorICAgICAgICAgICAgZmluYWwgVCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gbmV3IFVubW9kaWZpYWJsZUl0ZXJhdG9yPFQ+KCkgeworICAgICAgICAgICAgYm9vbGVhbiBkb25lOworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICFkb25lOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBUIG5leHQoKSB7CisgICAgICAgICAgICAgICAgaWYgKGRvbmUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZG9uZSA9IHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSB7QGNvZGUgUGVla2luZ0l0ZXJhdG9yfSBiYWNrZWQgYnkgdGhlIGdpdmVuIGl0ZXJhdG9yLgorICAgICAqIDxwPgorICAgICAqIDxwPkNhbGxzIHRvIHRoZSB7QGNvZGUgcGVla30gbWV0aG9kIHdpdGggbm8gaW50ZXJ2ZW5pbmcgY2FsbHMgdG8ge0Bjb2RlCisgICAgICogbmV4dH0gZG8gbm90IGFmZmVjdCB0aGUgaXRlcmF0aW9uLCBhbmQgaGVuY2UgcmV0dXJuIHRoZSBzYW1lIG9iamVjdCBlYWNoCisgICAgICogdGltZS4gQSBzdWJzZXF1ZW50IGNhbGwgdG8ge0Bjb2RlIG5leHR9IGlzIGd1YXJhbnRlZWQgdG8gcmV0dXJuIHRoZSBzYW1lCisgICAgICogb2JqZWN0IGFnYWluLiBGb3IgZXhhbXBsZTogPHByZT4gICB7QGNvZGUKKyAgICAgKiA8cD4KKyAgICAgKiAgIFBlZWtpbmdJdGVyYXRvcjxTdHJpbmc+IHBlZWtpbmdJdGVyYXRvciA9CisgICAgICogICAgICAgSXRlcmF0b3JzLnBlZWtpbmdJdGVyYXRvcihJdGVyYXRvcnMuZm9yQXJyYXkoImEiLCAiYiIpKTsKKyAgICAgKiAgIFN0cmluZyBhMSA9IHBlZWtpbmdJdGVyYXRvci5wZWVrKCk7IC8vIHJldHVybnMgImEiCisgICAgICogICBTdHJpbmcgYTIgPSBwZWVraW5nSXRlcmF0b3IucGVlaygpOyAvLyBhbHNvIHJldHVybnMgImEiCisgICAgICogICBTdHJpbmcgYTMgPSBwZWVraW5nSXRlcmF0b3IubmV4dCgpOyAvLyBhbHNvIHJldHVybnMgImEifTwvcHJlPgorICAgICAqIDxwPgorICAgICAqIDxwPkFueSBzdHJ1Y3R1cmFsIGNoYW5nZXMgdG8gdGhlIHVuZGVybHlpbmcgaXRlcmF0aW9uIChhc2lkZSBmcm9tIHRob3NlCisgICAgICogcGVyZm9ybWVkIGJ5IHRoZSBpdGVyYXRvcidzIG93biB7QGxpbmsgUGVla2luZ0l0ZXJhdG9yI3JlbW92ZSgpfSBtZXRob2QpCisgICAgICogd2lsbCBsZWF2ZSB0aGUgaXRlcmF0b3IgaW4gYW4gdW5kZWZpbmVkIHN0YXRlLgorICAgICAqIDxwPgorICAgICAqIDxwPlRoZSByZXR1cm5lZCBpdGVyYXRvciBkb2VzIG5vdCBzdXBwb3J0IHJlbW92YWwgYWZ0ZXIgcGVla2luZywgYXMKKyAgICAgKiBleHBsYWluZWQgYnkge0BsaW5rIFBlZWtpbmdJdGVyYXRvciNyZW1vdmUoKX0uCisgICAgICogPHA+CisgICAgICogPHA+Tm90ZTogSWYgdGhlIGdpdmVuIGl0ZXJhdG9yIGlzIGFscmVhZHkgYSB7QGNvZGUgUGVla2luZ0l0ZXJhdG9yfSwKKyAgICAgKiBpdCA8aT5taWdodDwvaT4gYmUgcmV0dXJuZWQgdG8gdGhlIGNhbGxlciwgYWx0aG91Z2ggdGhpcyBpcyBuZWl0aGVyCisgICAgICogZ3VhcmFudGVlZCB0byBvY2N1ciBub3IgcmVxdWlyZWQgdG8gYmUgY29uc2lzdGVudC4gIEZvciBleGFtcGxlLCB0aGlzCisgICAgICogbWV0aG9kIDxpPm1pZ2h0PC9pPiBjaG9vc2UgdG8gcGFzcyB0aHJvdWdoIHJlY29nbml6ZWQgaW1wbGVtZW50YXRpb25zIG9mCisgICAgICoge0Bjb2RlIFBlZWtpbmdJdGVyYXRvcn0gd2hlbiB0aGUgYmVoYXZpb3Igb2YgdGhlIGltcGxlbWVudGF0aW9uIGlzCisgICAgICoga25vd24gdG8gbWVldCB0aGUgY29udHJhY3QgZ3VhcmFudGVlZCBieSB0aGlzIG1ldGhvZC4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5UaGVyZSBpcyBubyB7QGxpbmsgSXRlcmFibGV9IGVxdWl2YWxlbnQgdG8gdGhpcyBtZXRob2QsIHNvIHVzZSB0aGlzCisgICAgICogbWV0aG9kIHRvIHdyYXAgZWFjaCBpbmRpdmlkdWFsIGl0ZXJhdG9yIGFzIGl0IGlzIGdlbmVyYXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpdGVyYXRvciB0aGUgYmFja2luZyBpdGVyYXRvci4gVGhlIHtAbGluayBQZWVraW5nSXRlcmF0b3J9IGFzc3VtZXMKKyAgICAgKiAgICAgICAgICAgICAgICAgb3duZXJzaGlwIG9mIHRoaXMgaXRlcmF0b3IsIHNvIHVzZXJzIHNob3VsZCBjZWFzZSBtYWtpbmcgZGlyZWN0IGNhbGxzCisgICAgICogICAgICAgICAgICAgICAgIHRvIGl0IGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QuCisgICAgICogQHJldHVybiBhIHBlZWtpbmcgaXRlcmF0b3IgYmFja2VkIGJ5IHRoYXQgaXRlcmF0b3IuIEFwYXJ0IGZyb20gdGhlCisgICAgICogYWRkaXRpb25hbCB7QGxpbmsgUGVla2luZ0l0ZXJhdG9yI3BlZWsoKX0gbWV0aG9kLCB0aGlzIGl0ZXJhdG9yIGJlaGF2ZXMKKyAgICAgKiBleGFjdGx5IHRoZSBzYW1lIGFzIHtAY29kZSBpdGVyYXRvcn0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8VD4gUGVla2luZ0l0ZXJhdG9yPFQ+IHBlZWtpbmdJdGVyYXRvcigKKyAgICAgICAgICAgIEl0ZXJhdG9yPD8gZXh0ZW5kcyBUPiBpdGVyYXRvcikgeworICAgICAgICBpZiAoaXRlcmF0b3IgaW5zdGFuY2VvZiBQZWVraW5nSW1wbCkgeworICAgICAgICAgICAgLy8gU2FmZSB0byBjYXN0IDw/IGV4dGVuZHMgVD4gdG8gPFQ+IGJlY2F1c2UgUGVla2luZ0ltcGwgb25seSB1c2VzIFQKKyAgICAgICAgICAgIC8vIGNvdmFyaWFudGx5IChhbmQgY2Fubm90IGJlIHN1YmNsYXNzZWQgdG8gYWRkIG5vbi1jb3ZhcmlhbnQgdXNlcykuCisgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgICAgIFBlZWtpbmdJbXBsPFQ+IHBlZWtpbmcgPSAoUGVla2luZ0ltcGw8VD4pIGl0ZXJhdG9yOworICAgICAgICAgICAgcmV0dXJuIHBlZWtpbmc7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBQZWVraW5nSW1wbDxUPihpdGVyYXRvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50YXRpb24gb2YgUGVla2luZ0l0ZXJhdG9yIHRoYXQgYXZvaWRzIHBlZWtpbmcgdW5sZXNzIG5lY2Vzc2FyeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQZWVraW5nSW1wbDxFPiBpbXBsZW1lbnRzIFBlZWtpbmdJdGVyYXRvcjxFPiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3I7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBoYXNQZWVrZWQ7CisgICAgICAgIHByaXZhdGUgRSBwZWVrZWRFbGVtZW50OworCisgICAgICAgIHB1YmxpYyBQZWVraW5nSW1wbChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gaXRlcmF0b3IpIHsKKyAgICAgICAgICAgIHRoaXMuaXRlcmF0b3IgPSBjaGVja05vdE51bGwoaXRlcmF0b3IpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgICAgICByZXR1cm4gaGFzUGVla2VkIHx8IGl0ZXJhdG9yLmhhc05leHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRSBuZXh0KCkgeworICAgICAgICAgICAgaWYgKCFoYXNQZWVrZWQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRSByZXN1bHQgPSBwZWVrZWRFbGVtZW50OworICAgICAgICAgICAgaGFzUGVla2VkID0gZmFsc2U7CisgICAgICAgICAgICBwZWVrZWRFbGVtZW50ID0gbnVsbDsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeworICAgICAgICAgICAgY2hlY2tTdGF0ZSghaGFzUGVla2VkLCAiQ2FuJ3QgcmVtb3ZlIGFmdGVyIHlvdSd2ZSBwZWVrZWQgYXQgbmV4dCIpOworICAgICAgICAgICAgaXRlcmF0b3IucmVtb3ZlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEUgcGVlaygpIHsKKyAgICAgICAgICAgIGlmICghaGFzUGVla2VkKSB7CisgICAgICAgICAgICAgICAgcGVla2VkRWxlbWVudCA9IGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgICAgICBoYXNQZWVrZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHBlZWtlZEVsZW1lbnQ7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL0pvaW5lci5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9Kb2luZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTA1MmMzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9Kb2luZXIuamF2YQpAQCAtMCwwICsxLDIwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgR3VhdmEgQXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKKworaW1wb3J0IHN0YXRpYyBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKKworLyoqCisgKiBBbiBvYmplY3Qgd2hpY2ggam9pbnMgcGllY2VzIG9mIHRleHQgKHNwZWNpZmllZCBhcyBhbiBhcnJheSwge0BsaW5rIEl0ZXJhYmxlfSwgdmFyYXJncyBvciBldmVuIGEKKyAqIHtAbGluayBNYXB9KSB3aXRoIGEgc2VwYXJhdG9yLiBJdCBlaXRoZXIgYXBwZW5kcyB0aGUgcmVzdWx0cyB0byBhbiB7QGxpbmsgQXBwZW5kYWJsZX0gb3IgcmV0dXJucworICogdGhlbSBhcyBhIHtAbGluayBTdHJpbmd9LiBFeGFtcGxlOiA8cHJlPiAgIHtAY29kZQorICogPHA+CisgKiAgIEpvaW5lciBqb2luZXIgPSBKb2luZXIub24oIjsgIikuc2tpcE51bGxzKCk7CisgKiAgICAuIC4gLgorICogICByZXR1cm4gam9pbmVyLmpvaW4oIkhhcnJ5IiwgbnVsbCwgIlJvbiIsICJIZXJtaW9uZSIpO308L3ByZT4KKyAqIDxwPgorICogPHA+VGhpcyByZXR1cm5zIHRoZSBzdHJpbmcge0Bjb2RlICJIYXJyeTsgUm9uOyBIZXJtaW9uZSJ9LiBOb3RlIHRoYXQgYWxsIGlucHV0IGVsZW1lbnRzIGFyZQorICogY29udmVydGVkIHRvIHN0cmluZ3MgdXNpbmcge0BsaW5rIE9iamVjdCN0b1N0cmluZygpfSBiZWZvcmUgYmVpbmcgYXBwZW5kZWQuCisgKiA8cD4KKyAqIDxwPklmIG5laXRoZXIge0BsaW5rICNza2lwTnVsbHMoKX0gbm9yIHtAbGluayAjdXNlRm9yTnVsbChTdHJpbmcpfSBpcyBzcGVjaWZpZWQsIHRoZSBqb2luaW5nCisgKiBtZXRob2RzIHdpbGwgdGhyb3cge0BsaW5rIE51bGxQb2ludGVyRXhjZXB0aW9ufSBpZiBhbnkgZ2l2ZW4gZWxlbWVudCBpcyBudWxsLgorICogPHA+CisgKiA8cD48Yj5XYXJuaW5nOiBqb2luZXIgaW5zdGFuY2VzIGFyZSBhbHdheXMgaW1tdXRhYmxlPC9iPjsgYSBjb25maWd1cmF0aW9uIG1ldGhvZCBzdWNoIGFzIHtAY29kZQorICogdXNlRm9yTnVsbH0gaGFzIG5vIGVmZmVjdCBvbiB0aGUgaW5zdGFuY2UgaXQgaXMgaW52b2tlZCBvbiEgWW91IG11c3Qgc3RvcmUgYW5kIHVzZSB0aGUgbmV3IGpvaW5lcgorICogaW5zdGFuY2UgcmV0dXJuZWQgYnkgdGhlIG1ldGhvZC4gVGhpcyBtYWtlcyBqb2luZXJzIHRocmVhZC1zYWZlLCBhbmQgc2FmZSB0byBzdG9yZSBhcyB7QGNvZGUKKyAqIHN0YXRpYyBmaW5hbH0gY29uc3RhbnRzLiA8cHJlPiAgIHtAY29kZQorICogPHA+CisgKiAgIC8vIEJhZCEgRG8gbm90IGRvIHRoaXMhCisgKiAgIEpvaW5lciBqb2luZXIgPSBKb2luZXIub24oJywnKTsKKyAqICAgam9pbmVyLnNraXBOdWxscygpOyAvLyBkb2VzIG5vdGhpbmchCisgKiAgIHJldHVybiBqb2luZXIuam9pbigid3JvbmciLCBudWxsLCAid3JvbmciKTt9PC9wcmU+CisgKiA8cD4KKyAqIDxwPlNlZSB0aGUgR3VhdmEgVXNlciBHdWlkZSBhcnRpY2xlIG9uIDxhIGhyZWY9CisgKiAiaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2d1YXZhLWxpYnJhcmllcy93aWtpL1N0cmluZ3NFeHBsYWluZWQjSm9pbmVyIj57QGNvZGUgSm9pbmVyfTwvYT4uCisgKgorICogQGF1dGhvciBLZXZpbiBCb3VycmlsbGlvbgorICogQHNpbmNlIDIuMCAoaW1wb3J0ZWQgZnJvbSBHb29nbGUgQ29sbGVjdGlvbnMgTGlicmFyeSkKKyAqLworcHVibGljIGNsYXNzIEpvaW5lciB7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc2VwYXJhdG9yOworCisgICAgcHJpdmF0ZSBKb2luZXIoU3RyaW5nIHNlcGFyYXRvcikgeworICAgICAgICB0aGlzLnNlcGFyYXRvciA9IFByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsKHNlcGFyYXRvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGpvaW5lciB3aGljaCBhdXRvbWF0aWNhbGx5IHBsYWNlcyB7QGNvZGUgc2VwYXJhdG9yfSBiZXR3ZWVuIGNvbnNlY3V0aXZlIGVsZW1lbnRzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgSm9pbmVyIG9uKCkgeworICAgICAgICByZXR1cm4gbmV3IEpvaW5lcigiLCAiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmRzIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgZWFjaCBvZiB7QGNvZGUgcGFydHN9LCB1c2luZyB0aGUgcHJldmlvdXNseSBjb25maWd1cmVkCisgICAgICogc2VwYXJhdG9yIGJldHdlZW4gZWFjaCwgdG8ge0Bjb2RlIGFwcGVuZGFibGV9LgorICAgICAqCisgICAgICogQHNpbmNlIDExLjAKKyAgICAgKi8KKyAgICBwcml2YXRlIDxBIGV4dGVuZHMgQXBwZW5kYWJsZT4gQSBhcHBlbmRUbyhBIGFwcGVuZGFibGUsIEl0ZXJhdG9yPD8+IHBhcnRzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbChhcHBlbmRhYmxlKTsKKyAgICAgICAgaWYgKHBhcnRzLmhhc05leHQoKSkgeworICAgICAgICAgICAgYXBwZW5kYWJsZS5hcHBlbmQodG9TdHJpbmcocGFydHMubmV4dCgpKSk7CisgICAgICAgICAgICB3aGlsZSAocGFydHMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgYXBwZW5kYWJsZS5hcHBlbmQoc2VwYXJhdG9yKTsKKyAgICAgICAgICAgICAgICBhcHBlbmRhYmxlLmFwcGVuZCh0b1N0cmluZyhwYXJ0cy5uZXh0KCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYXBwZW5kYWJsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmRzIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgZWFjaCBvZiB7QGNvZGUgcGFydHN9LCB1c2luZyB0aGUgcHJldmlvdXNseSBjb25maWd1cmVkCisgICAgICogc2VwYXJhdG9yIGJldHdlZW4gZWFjaCwgdG8ge0Bjb2RlIGJ1aWxkZXJ9LiBJZGVudGljYWwgdG8ge0BsaW5rICNhcHBlbmRUbyhBcHBlbmRhYmxlLAorICAgICAqIEl0ZXJhYmxlKX0sIGV4Y2VwdCB0aGF0IGl0IGRvZXMgbm90IHRocm93IHtAbGluayBJT0V4Y2VwdGlvbn0uCisgICAgICoKKyAgICAgKiBAc2luY2UgMTEuMAorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nQnVpbGRlciBhcHBlbmRUbyhTdHJpbmdCdWlsZGVyIGJ1aWxkZXIsIEl0ZXJhdG9yPD8+IHBhcnRzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhcHBlbmRUbygoQXBwZW5kYWJsZSkgYnVpbGRlciwgcGFydHMpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpbXBvc3NpYmxlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoaW1wb3NzaWJsZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1aWxkZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHtAY29kZSBNYXBKb2luZXJ9IHVzaW5nIHRoZSBnaXZlbiBrZXktdmFsdWUgc2VwYXJhdG9yLCBhbmQgdGhlIHNhbWUgY29uZmlndXJhdGlvbiBhcworICAgICAqIHRoaXMge0Bjb2RlIEpvaW5lcn0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBNYXBKb2luZXIgd2l0aEtleVZhbHVlU2VwYXJhdG9yKCkgeworICAgICAgICByZXR1cm4gbmV3IE1hcEpvaW5lcih0aGlzLCAiPSIpOworICAgIH0KKworICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIHRvU3RyaW5nKE9iamVjdCBwYXJ0KSB7CisgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsKHBhcnQpOyAgLy8gY2hlY2tOb3ROdWxsIGZvciBHV1QgKGRvIG5vdCBvcHRpbWl6ZSkuCisgICAgICAgIHJldHVybiAocGFydCBpbnN0YW5jZW9mIENoYXJTZXF1ZW5jZSkgPyAoQ2hhclNlcXVlbmNlKSBwYXJ0IDogcGFydC50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFuIG9iamVjdCB0aGF0IGpvaW5zIG1hcCBlbnRyaWVzIGluIHRoZSBzYW1lIG1hbm5lciBhcyB7QGNvZGUgSm9pbmVyfSBqb2lucyBpdGVyYWJsZXMgYW5kCisgICAgICogYXJyYXlzLiBMaWtlIHtAY29kZSBKb2luZXJ9LCBpdCBpcyB0aHJlYWQtc2FmZSBhbmQgaW1tdXRhYmxlLgorICAgICAqIDxwPgorICAgICAqIDxwPkluIGFkZGl0aW9uIHRvIG9wZXJhdGluZyBvbiB7QGNvZGUgTWFwfSBpbnN0YW5jZXMsIHtAY29kZSBNYXBKb2luZXJ9IGNhbiBvcGVyYXRlIG9uIHtAY29kZQorICAgICAqIE11bHRpbWFwfSBlbnRyaWVzIGluIHR3byBkaXN0aW5jdCBtb2RlczoKKyAgICAgKiA8cD4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPlRvIG91dHB1dCBhIHNlcGFyYXRlIGVudHJ5IGZvciBlYWNoIGtleS12YWx1ZSBwYWlyLCBwYXNzIHtAY29kZSBtdWx0aW1hcC5lbnRyaWVzKCl9IHRvIGEKKyAgICAgKiB7QGNvZGUgTWFwSm9pbmVyfSBtZXRob2QgdGhhdCBhY2NlcHRzIGVudHJpZXMgYXMgaW5wdXQsIGFuZCByZWNlaXZlIG91dHB1dCBvZiB0aGUgZm9ybQorICAgICAqIHtAY29kZSBrZXkxPUEma2V5MT1CJmtleTI9Q30uCisgICAgICogPGxpPlRvIG91dHB1dCBhIHNpbmdsZSBlbnRyeSBmb3IgZWFjaCBrZXksIHBhc3Mge0Bjb2RlIG11bHRpbWFwLmFzTWFwKCl9IHRvIGEge0Bjb2RlIE1hcEpvaW5lcn0KKyAgICAgKiBtZXRob2QgdGhhdCBhY2NlcHRzIGEgbWFwIGFzIGlucHV0LCBhbmQgcmVjZWl2ZSBvdXRwdXQgb2YgdGhlIGZvcm0ge0Bjb2RlCisgICAgICoga2V5MT1bQSwgQl0ma2V5Mj1DfS4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogQHNpbmNlIDIuMCAoaW1wb3J0ZWQgZnJvbSBHb29nbGUgQ29sbGVjdGlvbnMgTGlicmFyeSkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIE1hcEpvaW5lciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgSm9pbmVyIGpvaW5lcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcga2V5VmFsdWVTZXBhcmF0b3I7CisKKyAgICAgICAgcHJpdmF0ZSBNYXBKb2luZXIoSm9pbmVyIGpvaW5lciwgU3RyaW5nIGtleVZhbHVlU2VwYXJhdG9yKSB7CisgICAgICAgICAgICB0aGlzLmpvaW5lciA9IGpvaW5lcjsgLy8gb25seSAidGhpcyIgaXMgZXZlciBwYXNzZWQsIHNvIGRvbid0IGNoZWNrTm90TnVsbAorICAgICAgICAgICAgdGhpcy5rZXlWYWx1ZVNlcGFyYXRvciA9IFByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsKGtleVZhbHVlU2VwYXJhdG9yKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBcHBlbmRzIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgZWFjaCBlbnRyeSBvZiB7QGNvZGUgbWFwfSwgdXNpbmcgdGhlIHByZXZpb3VzbHkKKyAgICAgICAgICogY29uZmlndXJlZCBzZXBhcmF0b3IgYW5kIGtleS12YWx1ZSBzZXBhcmF0b3IsIHRvIHtAY29kZSBidWlsZGVyfS4gSWRlbnRpY2FsIHRvIHtAbGluaworICAgICAgICAgKiAjYXBwZW5kVG8oQXBwZW5kYWJsZSwgTWFwKX0sIGV4Y2VwdCB0aGF0IGl0IGRvZXMgbm90IHRocm93IHtAbGluayBJT0V4Y2VwdGlvbn0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nQnVpbGRlciBhcHBlbmRUbyhTdHJpbmdCdWlsZGVyIGJ1aWxkZXIsIE1hcDw/LCA/PiBtYXApIHsKKyAgICAgICAgICAgIHJldHVybiBhcHBlbmRUbyhidWlsZGVyLCBtYXAuZW50cnlTZXQoKSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQXBwZW5kcyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGVhY2ggZW50cnkgaW4ge0Bjb2RlIGVudHJpZXN9LCB1c2luZyB0aGUgcHJldmlvdXNseQorICAgICAgICAgKiBjb25maWd1cmVkIHNlcGFyYXRvciBhbmQga2V5LXZhbHVlIHNlcGFyYXRvciwgdG8ge0Bjb2RlIGFwcGVuZGFibGV9LgorICAgICAgICAgKgorICAgICAgICAgKiBAc2luY2UgMTEuMAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIDxBIGV4dGVuZHMgQXBwZW5kYWJsZT4gQSBhcHBlbmRUbyhBIGFwcGVuZGFibGUsIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFbnRyeTw/LCA/Pj4gcGFydHMpCisgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsKGFwcGVuZGFibGUpOworICAgICAgICAgICAgaWYgKHBhcnRzLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIEVudHJ5PD8sID8+IGVudHJ5ID0gcGFydHMubmV4dCgpOworICAgICAgICAgICAgICAgIGFwcGVuZGFibGUuYXBwZW5kKGpvaW5lci50b1N0cmluZyhlbnRyeS5nZXRLZXkoKSkpOworICAgICAgICAgICAgICAgIGFwcGVuZGFibGUuYXBwZW5kKGtleVZhbHVlU2VwYXJhdG9yKTsKKyAgICAgICAgICAgICAgICBhcHBlbmRhYmxlLmFwcGVuZChqb2luZXIudG9TdHJpbmcoZW50cnkuZ2V0VmFsdWUoKSkpOworICAgICAgICAgICAgICAgIHdoaWxlIChwYXJ0cy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kYWJsZS5hcHBlbmQoam9pbmVyLnNlcGFyYXRvcik7CisgICAgICAgICAgICAgICAgICAgIEVudHJ5PD8sID8+IGUgPSBwYXJ0cy5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIGFwcGVuZGFibGUuYXBwZW5kKGpvaW5lci50b1N0cmluZyhlLmdldEtleSgpKSk7CisgICAgICAgICAgICAgICAgICAgIGFwcGVuZGFibGUuYXBwZW5kKGtleVZhbHVlU2VwYXJhdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kYWJsZS5hcHBlbmQoam9pbmVyLnRvU3RyaW5nKGUuZ2V0VmFsdWUoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBhcHBlbmRhYmxlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFwcGVuZHMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBlYWNoIGVudHJ5IGluIHtAY29kZSBlbnRyaWVzfSwgdXNpbmcgdGhlIHByZXZpb3VzbHkKKyAgICAgICAgICogY29uZmlndXJlZCBzZXBhcmF0b3IgYW5kIGtleS12YWx1ZSBzZXBhcmF0b3IsIHRvIHtAY29kZSBidWlsZGVyfS4gSWRlbnRpY2FsIHRvIHtAbGluaworICAgICAgICAgKiAjYXBwZW5kVG8oQXBwZW5kYWJsZSwgSXRlcmFibGUpfSwgZXhjZXB0IHRoYXQgaXQgZG9lcyBub3QgdGhyb3cge0BsaW5rIElPRXhjZXB0aW9ufS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHNpbmNlIDEwLjAKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmdCdWlsZGVyIGFwcGVuZFRvKFN0cmluZ0J1aWxkZXIgYnVpbGRlciwgSXRlcmFibGU8PyBleHRlbmRzIEVudHJ5PD8sID8+PiBlbnRyaWVzKSB7CisgICAgICAgICAgICByZXR1cm4gYXBwZW5kVG8oYnVpbGRlciwgZW50cmllcy5pdGVyYXRvcigpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBcHBlbmRzIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgZWFjaCBlbnRyeSBpbiB7QGNvZGUgZW50cmllc30sIHVzaW5nIHRoZSBwcmV2aW91c2x5CisgICAgICAgICAqIGNvbmZpZ3VyZWQgc2VwYXJhdG9yIGFuZCBrZXktdmFsdWUgc2VwYXJhdG9yLCB0byB7QGNvZGUgYnVpbGRlcn0uIElkZW50aWNhbCB0byB7QGxpbmsKKyAgICAgICAgICogI2FwcGVuZFRvKEFwcGVuZGFibGUsIEl0ZXJhYmxlKX0sIGV4Y2VwdCB0aGF0IGl0IGRvZXMgbm90IHRocm93IHtAbGluayBJT0V4Y2VwdGlvbn0uCisgICAgICAgICAqCisgICAgICAgICAqIEBzaW5jZSAxMS4wCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nQnVpbGRlciBhcHBlbmRUbyhTdHJpbmdCdWlsZGVyIGJ1aWxkZXIsIEl0ZXJhdG9yPD8gZXh0ZW5kcyBFbnRyeTw/LCA/Pj4gZW50cmllcykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBhcHBlbmRUbygoQXBwZW5kYWJsZSkgYnVpbGRlciwgZW50cmllcyk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpbXBvc3NpYmxlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKGltcG9zc2libGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXI7CisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9MaXN0TXVsdGltYXAuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvTGlzdE11bHRpbWFwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJkOTRhNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvTGlzdE11bHRpbWFwLmphdmEKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgR3VhdmEgQXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YTsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogQSB7QGNvZGUgTXVsdGltYXB9IHRoYXQgY2FuIGhvbGQgZHVwbGljYXRlIGtleS12YWx1ZSBwYWlycyBhbmQgdGhhdCBtYWludGFpbnMKKyAqIHRoZSBpbnNlcnRpb24gb3JkZXJpbmcgb2YgdmFsdWVzIGZvciBhIGdpdmVuIGtleS4gU2VlIHRoZSB7QGxpbmsgTXVsdGltYXB9CisgKiBkb2N1bWVudGF0aW9uIGZvciBpbmZvcm1hdGlvbiBjb21tb24gdG8gYWxsIG11bHRpbWFwcy4KKyAqIDxwPgorICogPHA+VGhlIHtAbGluayAjZ2V0fSwge0BsaW5rICNyZW1vdmVBbGx9LCBhbmQge0BsaW5rICNyZXBsYWNlVmFsdWVzfSBtZXRob2RzCisgKiBlYWNoIHJldHVybiBhIHtAbGluayBMaXN0fSBvZiB2YWx1ZXMuIFRob3VnaCB0aGUgbWV0aG9kIHNpZ25hdHVyZSBkb2Vzbid0IHNheQorICogc28gZXhwbGljaXRseSwgdGhlIG1hcCByZXR1cm5lZCBieSB7QGxpbmsgI2FzTWFwfSBoYXMge0Bjb2RlIExpc3R9IHZhbHVlcy4KKyAqIDxwPgorICogPHA+U2VlIHRoZSBHdWF2YSBVc2VyIEd1aWRlIGFydGljbGUgb24gPGEgaHJlZj0KKyAqICJodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ3VhdmEtbGlicmFyaWVzL3dpa2kvTmV3Q29sbGVjdGlvblR5cGVzRXhwbGFpbmVkI011bHRpbWFwIj4KKyAqIHtAY29kZSBNdWx0aW1hcH08L2E+LgorICoKKyAqIEBhdXRob3IgSmFyZWQgTGV2eQorICogQHNpbmNlIDIuMCAoaW1wb3J0ZWQgZnJvbSBHb29nbGUgQ29sbGVjdGlvbnMgTGlicmFyeSkKKyAqLworcHVibGljIGludGVyZmFjZSBMaXN0TXVsdGltYXA8SywgVj4gZXh0ZW5kcyBNdWx0aW1hcDxLLCBWPiB7CisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqIDxwPgorICAgICAqIDxwPkJlY2F1c2UgdGhlIHZhbHVlcyBmb3IgYSBnaXZlbiBrZXkgbWF5IGhhdmUgZHVwbGljYXRlcyBhbmQgZm9sbG93IHRoZQorICAgICAqIGluc2VydGlvbiBvcmRlcmluZywgdGhpcyBtZXRob2QgcmV0dXJucyBhIHtAbGluayBMaXN0fSwgaW5zdGVhZCBvZiB0aGUKKyAgICAgKiB7QGxpbmsgQ29sbGVjdGlvbn0gc3BlY2lmaWVkIGluIHRoZSB7QGxpbmsgTXVsdGltYXB9IGludGVyZmFjZS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBMaXN0PFY+IGdldChLIGtleSk7CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICogPHA+CisgICAgICogPHA+QmVjYXVzZSB0aGUgdmFsdWVzIGZvciBhIGdpdmVuIGtleSBtYXkgaGF2ZSBkdXBsaWNhdGVzIGFuZCBmb2xsb3cgdGhlCisgICAgICogaW5zZXJ0aW9uIG9yZGVyaW5nLCB0aGlzIG1ldGhvZCByZXR1cm5zIGEge0BsaW5rIExpc3R9LCBpbnN0ZWFkIG9mIHRoZQorICAgICAqIHtAbGluayBDb2xsZWN0aW9ufSBzcGVjaWZpZWQgaW4gdGhlIHtAbGluayBNdWx0aW1hcH0gaW50ZXJmYWNlLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIExpc3Q8Vj4gcmVtb3ZlQWxsKE9iamVjdCBrZXkpOworCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqIDxwPgorICAgICAqIDxwPjxiPk5vdGU6PC9iPiBUaGUgcmV0dXJuZWQgbWFwJ3MgdmFsdWVzIGFyZSBndWFyYW50ZWVkIHRvIGJlIG9mIHR5cGUKKyAgICAgKiB7QGxpbmsgTGlzdH0uIFRvIG9idGFpbiB0aGlzIG1hcCB3aXRoIHRoZSBtb3JlIHNwZWNpZmljIGdlbmVyaWMgdHlwZQorICAgICAqIHtAY29kZSBNYXA8SywgTGlzdDxWPj59LCBjYWxsIHtAbGluayBNdWx0aW1hcHMjYXNNYXAoTGlzdE11bHRpbWFwKX0KKyAgICAgKiBpbnN0ZWFkLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIE1hcDxLLCBDb2xsZWN0aW9uPFY+PiBhc01hcCgpOworCisgICAgLyoqCisgICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gdGhpcyBtdWx0aW1hcCBmb3IgZXF1YWxpdHkuCisgICAgICogPHA+CisgICAgICogPHA+VHdvIHtAY29kZSBMaXN0TXVsdGltYXB9IGluc3RhbmNlcyBhcmUgZXF1YWwgaWYsIGZvciBlYWNoIGtleSwgdGhleQorICAgICAqIGNvbnRhaW4gdGhlIHNhbWUgdmFsdWVzIGluIHRoZSBzYW1lIG9yZGVyLiBJZiB0aGUgdmFsdWUgb3JkZXJpbmdzIGRpc2FncmVlLAorICAgICAqIHRoZSBtdWx0aW1hcHMgd2lsbCBub3QgYmUgY29uc2lkZXJlZCBlcXVhbC4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5BbiBlbXB0eSB7QGNvZGUgTGlzdE11bHRpbWFwfSBpcyBlcXVhbCB0byBhbnkgb3RoZXIgZW1wdHkge0Bjb2RlCisgICAgICogTXVsdGltYXB9LCBpbmNsdWRpbmcgYW4gZW1wdHkge0Bjb2RlIFNldE11bHRpbWFwfS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvTGlzdGVuYWJsZUZ1dHVyZS5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9MaXN0ZW5hYmxlRnV0dXJlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDkxMDkyZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvTGlzdGVuYWJsZUZ1dHVyZS5qYXZhCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBHdWF2YSBBdXRob3JzCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmVUYXNrOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlJlamVjdGVkRXhlY3V0aW9uRXhjZXB0aW9uOworCisvKioKKyAqIEEge0BsaW5rIEZ1dHVyZX0gdGhhdCBhY2NlcHRzIGNvbXBsZXRpb24gbGlzdGVuZXJzLiAgRWFjaCBsaXN0ZW5lciBoYXMgYW4KKyAqIGFzc29jaWF0ZWQgZXhlY3V0b3IsIGFuZCBpdCBpcyBpbnZva2VkIHVzaW5nIHRoaXMgZXhlY3V0b3Igb25jZSB0aGUgZnV0dXJlJ3MKKyAqIGNvbXB1dGF0aW9uIGlzIHtAbGlua3BsYWluIEZ1dHVyZSNpc0RvbmUoKSBjb21wbGV0ZX0uICBJZiB0aGUgY29tcHV0YXRpb24gaGFzCisgKiBhbHJlYWR5IGNvbXBsZXRlZCB3aGVuIHRoZSBsaXN0ZW5lciBpcyBhZGRlZCwgdGhlIGxpc3RlbmVyIHdpbGwgZXhlY3V0ZQorICogaW1tZWRpYXRlbHkuCisgKiA8cD4KKyAqIDxwPlNlZSB0aGUgR3VhdmEgVXNlciBHdWlkZSBhcnRpY2xlIG9uIDxhIGhyZWY9CisgKiAiaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2d1YXZhLWxpYnJhcmllcy93aWtpL0xpc3RlbmFibGVGdXR1cmVFeHBsYWluZWQiPgorICoge0Bjb2RlIExpc3RlbmFibGVGdXR1cmV9PC9hPi4KKyAqIDxwPgorICogPGgzPlB1cnBvc2U8L2gzPgorICogPHA+CisgKiA8cD5Nb3N0IGNvbW1vbmx5LCB7QGNvZGUgTGlzdGVuYWJsZUZ1dHVyZX0gaXMgdXNlZCBhcyBhbiBpbnB1dCB0byBhbm90aGVyCisgKiBkZXJpdmVkIHtAY29kZSBGdXR1cmV9LCBhcyBpbiB7QGxpbmsgRnV0dXJlcyNhbGxBc0xpc3QoSXRlcmFibGUpCisgKiBGdXR1cmVzLmFsbEFzTGlzdH0uIE1hbnkgc3VjaCBtZXRob2RzIGFyZSBpbXBvc3NpYmxlIHRvIGltcGxlbWVudCBlZmZpY2llbnRseQorICogd2l0aG91dCBsaXN0ZW5lciBzdXBwb3J0LgorICogPHA+CisgKiA8cD5JdCBpcyBwb3NzaWJsZSB0byBjYWxsIHtAbGluayAjYWRkTGlzdGVuZXIgYWRkTGlzdGVuZXJ9IGRpcmVjdGx5LCBidXQgdGhpcworICogaXMgdW5jb21tb24gYmVjYXVzZSB0aGUge0Bjb2RlIFJ1bm5hYmxlfSBpbnRlcmZhY2UgZG9lcyBub3QgcHJvdmlkZSBkaXJlY3QKKyAqIGFjY2VzcyB0byB0aGUge0Bjb2RlIEZ1dHVyZX0gcmVzdWx0LiAoVXNlcnMgd2hvIHdhbnQgc3VjaCBhY2Nlc3MgbWF5IHByZWZlcgorICoge0BsaW5rIEZ1dHVyZXMjYWRkQ2FsbGJhY2sgRnV0dXJlcy5hZGRDYWxsYmFja30uKSBTdGlsbCwgZGlyZWN0IHtAY29kZQorICogYWRkTGlzdGVuZXJ9IGNhbGxzIGFyZSBvY2Nhc2lvbmFsbHkgdXNlZnVsOjxwcmU+ICAge0Bjb2RlCisgKiAgIGZpbmFsIFN0cmluZyBuYW1lID0gLi4uOworICogICBpbkZsaWdodC5hZGQobmFtZSk7CisgKiAgIExpc3RlbmFibGVGdXR1cmU8UmVzdWx0PiBmdXR1cmUgPSBzZXJ2aWNlLnF1ZXJ5KG5hbWUpOworICogICBmdXR1cmUuYWRkTGlzdGVuZXIobmV3IFJ1bm5hYmxlKCkgeworICogICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAqICAgICAgIHByb2Nlc3NlZENvdW50LmluY3JlbWVudEFuZEdldCgpOworICogICAgICAgaW5GbGlnaHQucmVtb3ZlKG5hbWUpOworICogICAgICAgbGFzdFByb2Nlc3NlZC5zZXQobmFtZSk7CisgKiAgICAgICBsb2dnZXIuaW5mbygiRG9uZSB3aXRoIHswfSIsIG5hbWUpOworICogICAgIH0KKyAqICAgfSwgZXhlY3V0b3IpO308L3ByZT4KKyAqIDxwPgorICogPGgzPkhvdyB0byBnZXQgYW4gaW5zdGFuY2U8L2gzPgorICogPHA+CisgKiA8cD5EZXZlbG9wZXJzIGFyZSBlbmNvdXJhZ2VkIHRvIHJldHVybiB7QGNvZGUgTGlzdGVuYWJsZUZ1dHVyZX0gZnJvbSB0aGVpcgorICogbWV0aG9kcyBzbyB0aGF0IHVzZXJzIGNhbiB0YWtlIGFkdmFudGFnZXMgb2YgdGhlIHV0aWxpdGllcyBidWlsdCBhdG9wIHRoZQorICogY2xhc3MuIFRoZSB3YXkgdGhhdCB0aGV5IHdpbGwgY3JlYXRlIHtAY29kZSBMaXN0ZW5hYmxlRnV0dXJlfSBpbnN0YW5jZXMKKyAqIGRlcGVuZHMgb24gaG93IHRoZXkgY3VycmVudGx5IGNyZWF0ZSB7QGNvZGUgRnV0dXJlfSBpbnN0YW5jZXM6CisgKiA8dWw+CisgKiA8bGk+SWYgdGhleSBhcmUgcmV0dXJuZWQgZnJvbSBhbiB7QGNvZGUgRXhlY3V0b3JTZXJ2aWNlfSwgY29udmVydCB0aGF0CisgKiBzZXJ2aWNlIHRvIGEge0BsaW5rIExpc3RlbmluZ0V4ZWN1dG9yU2VydmljZX0sIHVzdWFsbHkgYnkgY2FsbGluZyB7QGxpbmsKKyAqIE1vcmVFeGVjdXRvcnMjbGlzdGVuaW5nRGVjb3JhdG9yKEV4ZWN1dG9yU2VydmljZSkKKyAqIE1vcmVFeGVjdXRvcnMubGlzdGVuaW5nRGVjb3JhdG9yfS4gKEN1c3RvbSBleGVjdXRvcnMgbWF5IGZpbmQgaXQgbW9yZQorICogY29udmVuaWVudCB0byB1c2Uge0BsaW5rIExpc3RlbmFibGVGdXR1cmVUYXNrfSBkaXJlY3RseS4pCisgKiA8bGk+SWYgdGhleSBhcmUgbWFudWFsbHkgZmlsbGVkIGluIGJ5IGEgY2FsbCB0byB7QGxpbmsgRnV0dXJlVGFzayNzZXR9IG9yIGEKKyAqIHNpbWlsYXIgbWV0aG9kLCBjcmVhdGUgYSB7QGxpbmsgU2V0dGFibGVGdXR1cmV9IGluc3RlYWQuIChVc2VycyB3aXRoIG1vcmUKKyAqIGNvbXBsZXggbmVlZHMgbWF5IHByZWZlciB7QGxpbmsgQWJzdHJhY3RGdXR1cmV9LikKKyAqIDwvdWw+CisgKiA8cD4KKyAqIDxwPk9jY2FzaW9uYWxseSwgYW4gQVBJIHdpbGwgcmV0dXJuIGEgcGxhaW4ge0Bjb2RlIEZ1dHVyZX0gYW5kIGl0IHdpbGwgYmUKKyAqIGltcG9zc2libGUgdG8gY2hhbmdlIHRoZSByZXR1cm4gdHlwZS4gRm9yIHRoaXMgY2FzZSwgd2UgcHJvdmlkZSBhIG1vcmUKKyAqIGV4cGVuc2l2ZSB3b3JrYXJvdW5kIGluIHtAY29kZSBKZGtGdXR1cmVBZGFwdGVyc30uIEhvd2V2ZXIsIHdoZW4gcG9zc2libGUsIGl0CisgKiBpcyBtb3JlIGVmZmljaWVudCBhbmQgcmVsaWFibGUgdG8gY3JlYXRlIGEge0Bjb2RlIExpc3RlbmFibGVGdXR1cmV9IGRpcmVjdGx5LgorICoKKyAqIEBhdXRob3IgU3ZlbiBNYXdzb24KKyAqIEBhdXRob3IgTmlzaGFudCBUaGFra2FyCisgKiBAc2luY2UgMS4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTGlzdGVuYWJsZUZ1dHVyZTxWPiBleHRlbmRzIEZ1dHVyZTxWPiB7CisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGEgbGlzdGVuZXIgdG8gYmUge0BsaW5rcGxhaW4gRXhlY3V0b3IjZXhlY3V0ZShSdW5uYWJsZSkgcnVufSBvbgorICAgICAqIHRoZSBnaXZlbiBleGVjdXRvci4gIFRoZSBsaXN0ZW5lciB3aWxsIHJ1biB3aGVuIHRoZSB7QGNvZGUgRnV0dXJlfSdzCisgICAgICogY29tcHV0YXRpb24gaXMge0BsaW5rcGxhaW4gRnV0dXJlI2lzRG9uZSgpIGNvbXBsZXRlfSBvciwgaWYgdGhlIGNvbXB1dGF0aW9uCisgICAgICogaXMgYWxyZWFkeSBjb21wbGV0ZSwgaW1tZWRpYXRlbHkuCisgICAgICogPHA+CisgICAgICogPHA+VGhlcmUgaXMgbm8gZ3VhcmFudGVlZCBvcmRlcmluZyBvZiBleGVjdXRpb24gb2YgbGlzdGVuZXJzLCBidXQgYW55CisgICAgICogbGlzdGVuZXIgYWRkZWQgdGhyb3VnaCB0aGlzIG1ldGhvZCBpcyBndWFyYW50ZWVkIHRvIGJlIGNhbGxlZCBvbmNlIHRoZQorICAgICAqIGNvbXB1dGF0aW9uIGlzIGNvbXBsZXRlLgorICAgICAqIDxwPgorICAgICAqIDxwPkV4Y2VwdGlvbnMgdGhyb3duIGJ5IGEgbGlzdGVuZXIgd2lsbCBiZSBwcm9wYWdhdGVkIHVwIHRvIHRoZSBleGVjdXRvci4KKyAgICAgKiBBbnkgZXhjZXB0aW9uIHRocm93biBkdXJpbmcge0Bjb2RlIEV4ZWN1dG9yLmV4ZWN1dGV9IChlLmcuLCBhIHtAY29kZQorICAgICAqIFJlamVjdGVkRXhlY3V0aW9uRXhjZXB0aW9ufSBvciBhbiBleGNlcHRpb24gdGhyb3duIGJ5IHtAbGlua3BsYWluCisgICAgICogTW9yZUV4ZWN1dG9ycyNkaXJlY3RFeGVjdXRvciBkaXJlY3QgZXhlY3V0aW9ufSkgd2lsbCBiZSBjYXVnaHQgYW5kCisgICAgICogbG9nZ2VkLgorICAgICAqIDxwPgorICAgICAqIDxwPk5vdGU6IEZvciBmYXN0LCBsaWdodHdlaWdodCBsaXN0ZW5lcnMgdGhhdCB3b3VsZCBiZSBzYWZlIHRvIGV4ZWN1dGUgaW4KKyAgICAgKiBhbnkgdGhyZWFkLCBjb25zaWRlciB7QGxpbmsgTW9yZUV4ZWN1dG9ycyNkaXJlY3RFeGVjdXRvcn0uIEZvciBoZWF2aWVyCisgICAgICogbGlzdGVuZXJzLCB7QGNvZGUgZGlyZWN0RXhlY3V0b3IoKX0gY2FycmllcyBzb21lIGNhdmVhdHMuICBGb3IKKyAgICAgKiBleGFtcGxlLCB0aGUgbGlzdGVuZXIgbWF5IHJ1biBvbiBhbiB1bnByZWRpY3RhYmxlIG9yIHVuZGVzaXJhYmxlIHRocmVhZDoKKyAgICAgKiA8cD4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPklmIHRoaXMge0Bjb2RlIEZ1dHVyZX0gaXMgZG9uZSBhdCB0aGUgdGltZSB7QGNvZGUgYWRkTGlzdGVuZXJ9IGlzCisgICAgICogY2FsbGVkLCB7QGNvZGUgYWRkTGlzdGVuZXJ9IHdpbGwgZXhlY3V0ZSB0aGUgbGlzdGVuZXIgaW5saW5lLgorICAgICAqIDxsaT5JZiB0aGlzIHtAY29kZSBGdXR1cmV9IGlzIG5vdCB5ZXQgZG9uZSwge0Bjb2RlIGFkZExpc3RlbmVyfSB3aWxsCisgICAgICogc2NoZWR1bGUgdGhlIGxpc3RlbmVyIHRvIGJlIHJ1biBieSB0aGUgdGhyZWFkIHRoYXQgY29tcGxldGVzIHRoaXMge0Bjb2RlCisgICAgICogRnV0dXJlfSwgd2hpY2ggbWF5IGJlIGFuIGludGVybmFsIHN5c3RlbSB0aHJlYWQgc3VjaCBhcyBhbiBSUEMgbmV0d29yaworICAgICAqIHRocmVhZC4KKyAgICAgKiA8L3VsPgorICAgICAqIDxwPgorICAgICAqIDxwPkFsc28gbm90ZSB0aGF0LCByZWdhcmRsZXNzIG9mIHdoaWNoIHRocmVhZCBleGVjdXRlcyB0aGUKKyAgICAgKiB7QGNvZGUgZGlyZWN0RXhlY3V0b3IoKX0gbGlzdGVuZXIsIGFsbCBvdGhlciByZWdpc3RlcmVkIGJ1dCB1bmV4ZWN1dGVkCisgICAgICogbGlzdGVuZXJzIGFyZSBwcmV2ZW50ZWQgZnJvbSBydW5uaW5nIGR1cmluZyBpdHMgZXhlY3V0aW9uLCBldmVuIGlmIHRob3NlCisgICAgICogbGlzdGVuZXJzIGFyZSB0byBydW4gaW4gb3RoZXIgZXhlY3V0b3JzLgorICAgICAqIDxwPgorICAgICAqIDxwPlRoaXMgaXMgdGhlIG1vc3QgZ2VuZXJhbCBsaXN0ZW5lciBpbnRlcmZhY2UuIEZvciBjb21tb24gb3BlcmF0aW9ucworICAgICAqIHBlcmZvcm1lZCB1c2luZyBsaXN0ZW5lcnMsIHNlZSB7QGxpbmsKKyAgICAgKiBGdXR1cmVzfS4gRm9yIGEgc2ltcGxpZmllZCBidXQgZ2VuZXJhbAorICAgICAqIGxpc3RlbmVyIGludGVyZmFjZSwgc2VlIHtAbGluaworICAgICAqIEZ1dHVyZXMjYWRkQ2FsbGJhY2sgYWRkQ2FsbGJhY2soKX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIGxpc3RlbmVyIHRvIHJ1biB3aGVuIHRoZSBjb21wdXRhdGlvbiBpcyBjb21wbGV0ZQorICAgICAqIEBwYXJhbSBleGVjdXRvciB0aGUgZXhlY3V0b3IgdG8gcnVuIHRoZSBsaXN0ZW5lciBpbgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gICAgICAgaWYgdGhlIGV4ZWN1dG9yIG9yIGxpc3RlbmVyIHdhcyBudWxsCisgICAgICogQHRocm93cyBSZWplY3RlZEV4ZWN1dGlvbkV4Y2VwdGlvbiBpZiB3ZSB0cmllZCB0byBleGVjdXRlIHRoZSBsaXN0ZW5lcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1tZWRpYXRlbHkgYnV0IHRoZSBleGVjdXRvciByZWplY3RlZCBpdC4KKyAgICAgKi8KKyAgICB2b2lkIGFkZExpc3RlbmVyKFJ1bm5hYmxlIGxpc3RlbmVyLCBFeGVjdXRvciBleGVjdXRvcik7Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL0xpc3RzLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL0xpc3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhiODc1YwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvTGlzdHMuamF2YQpAQCAtMCwwICsxLDMwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgR3VhdmEgQXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YTsKKworaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKKworaW1wb3J0IHN0YXRpYyBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YS5QcmVjb25kaXRpb25zLmNoZWNrRWxlbWVudEluZGV4OworaW1wb3J0IHN0YXRpYyBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmEuUHJlY29uZGl0aW9ucy5jaGVja1Bvc2l0aW9uSW5kZXg7CitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhLlByZWNvbmRpdGlvbnMuY2hlY2tQb3NpdGlvbkluZGV4ZXM7CitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhLlByZWNvbmRpdGlvbnMuY2hlY2tTdGF0ZTsKKworLyoqCisgKiBTdGF0aWMgdXRpbGl0eSBtZXRob2RzIHBlcnRhaW5pbmcgdG8ge0BsaW5rIExpc3R9IGluc3RhbmNlcy4gQWxzbyBzZWUgdGhpcworICogY2xhc3MncyBjb3VudGVycGFydHMge0BsaW5rIFNldHN9LCB7QGxpbmsgTWFwc30gYW5kIHtAbGluayBRdWV1ZXN9LgorICogPHA+CisgKiA8cD5TZWUgdGhlIEd1YXZhIFVzZXIgR3VpZGUgYXJ0aWNsZSBvbiA8YSBocmVmPQorICogImh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9ndWF2YS1saWJyYXJpZXMvd2lraS9Db2xsZWN0aW9uVXRpbGl0aWVzRXhwbGFpbmVkI0xpc3RzIj4KKyAqIHtAY29kZSBMaXN0c308L2E+LgorICoKKyAqIEBhdXRob3IgS2V2aW4gQm91cnJpbGxpb24KKyAqIEBhdXRob3IgTWlrZSBCb3N0b2NrCisgKiBAYXV0aG9yIExvdWlzIFdhc3Nlcm1hbgorICogQHNpbmNlIDIuMCAoaW1wb3J0ZWQgZnJvbSBHb29nbGUgQ29sbGVjdGlvbnMgTGlicmFyeSkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIExpc3RzIHsKKyAgICBwcml2YXRlIExpc3RzKCkgeworICAgIH0KKworICAgIC8vIEFycmF5TGlzdAorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIDxpPm11dGFibGU8L2k+LCBlbXB0eSB7QGNvZGUgQXJyYXlMaXN0fSBpbnN0YW5jZSAoZm9yIEphdmEgNiBhbmQKKyAgICAgKiBlYXJsaWVyKS4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD48Yj5Ob3RlOjwvYj4gaWYgbXV0YWJpbGl0eSBpcyBub3QgcmVxdWlyZWQsIHVzZSB7QGxpbmsKKyAgICAgKiBJbW11dGFibGVMaXN0I29mKCl9IGluc3RlYWQuCisgICAgICogPHA+CisgICAgICogPHA+PGI+Tm90ZSBmb3IgSmF2YSA3IGFuZCBsYXRlcjo8L2I+IHRoaXMgbWV0aG9kIGlzIG5vdyB1bm5lY2Vzc2FyeSBhbmQKKyAgICAgKiBzaG91bGQgYmUgdHJlYXRlZCBhcyBkZXByZWNhdGVkLiBJbnN0ZWFkLCB1c2UgdGhlIHtAY29kZSBBcnJheUxpc3R9CisgICAgICoge0BsaW5rcGxhaW4gQXJyYXlMaXN0I0FycmF5TGlzdCgpIGNvbnN0cnVjdG9yfSBkaXJlY3RseSwgdGFraW5nIGFkdmFudGFnZQorICAgICAqIG9mIHRoZSBuZXcgPGEgaHJlZj0iaHR0cDovL2dvby5nbC9pejJXaSI+ImRpYW1vbmQiIHN5bnRheDwvYT4uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgPEU+IEFycmF5TGlzdDxFPiBuZXdBcnJheUxpc3QoKSB7CisgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PEU+KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIDxpPm11dGFibGU8L2k+IHtAY29kZSBBcnJheUxpc3R9IGluc3RhbmNlIGNvbnRhaW5pbmcgdGhlIGdpdmVuCisgICAgICogZWxlbWVudHM7IGEgdmVyeSB0aGluIHNob3J0Y3V0IGZvciBjcmVhdGluZyBhbiBlbXB0eSBsaXN0IHRoZW4gY2FsbGluZworICAgICAqIHtAbGluayBJdGVyYWJsZXMjYWRkQWxsfS4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD48Yj5Ob3RlOjwvYj4gaWYgbXV0YWJpbGl0eSBpcyBub3QgcmVxdWlyZWQgYW5kIHRoZSBlbGVtZW50cyBhcmUKKyAgICAgKiBub24tbnVsbCwgdXNlIHtAbGluayBJbW11dGFibGVMaXN0I2NvcHlPZihJdGVyYWJsZSl9IGluc3RlYWQuIChPciwgY2hhbmdlCisgICAgICoge0Bjb2RlIGVsZW1lbnRzfSB0byBiZSBhIHtAbGluayBGbHVlbnRJdGVyYWJsZX0gYW5kIGNhbGwKKyAgICAgKiB7QGNvZGUgZWxlbWVudHMudG9MaXN0KCl9LikKKyAgICAgKiA8cD4KKyAgICAgKiA8cD48Yj5Ob3RlIGZvciBKYXZhIDcgYW5kIGxhdGVyOjwvYj4gaWYge0Bjb2RlIGVsZW1lbnRzfSBpcyBhIHtAbGluaworICAgICAqIENvbGxlY3Rpb259LCB5b3UgZG9uJ3QgbmVlZCB0aGlzIG1ldGhvZC4gVXNlIHRoZSB7QGNvZGUgQXJyYXlMaXN0fQorICAgICAqIHtAbGlua3BsYWluIEFycmF5TGlzdCNBcnJheUxpc3QoQ29sbGVjdGlvbikgY29uc3RydWN0b3J9IGRpcmVjdGx5LCB0YWtpbmcKKyAgICAgKiBhZHZhbnRhZ2Ugb2YgdGhlIG5ldyA8YSBocmVmPSJodHRwOi8vZ29vLmdsL2l6MldpIj4iZGlhbW9uZCIgc3ludGF4PC9hPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxFPiBBcnJheUxpc3Q8RT4gbmV3QXJyYXlMaXN0KEl0ZXJhYmxlPD8gZXh0ZW5kcyBFPiBlbGVtZW50cykgeworICAgICAgICBjaGVja05vdE51bGwoZWxlbWVudHMpOyAvLyBmb3IgR1dUCisgICAgICAgIC8vIExldCBBcnJheUxpc3QncyBzaXppbmcgbG9naWMgd29yaywgaWYgcG9zc2libGUKKyAgICAgICAgcmV0dXJuIChlbGVtZW50cyBpbnN0YW5jZW9mIENvbGxlY3Rpb24pCisgICAgICAgICAgICAgICAgPyBuZXcgQXJyYXlMaXN0PEU+KENvbGxlY3Rpb25zMi5jYXN0KGVsZW1lbnRzKSkKKyAgICAgICAgICAgICAgICA6IG5ld0FycmF5TGlzdChlbGVtZW50cy5pdGVyYXRvcigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgPGk+bXV0YWJsZTwvaT4ge0Bjb2RlIEFycmF5TGlzdH0gaW5zdGFuY2UgY29udGFpbmluZyB0aGUgZ2l2ZW4KKyAgICAgKiBlbGVtZW50czsgYSB2ZXJ5IHRoaW4gc2hvcnRjdXQgZm9yIGNyZWF0aW5nIGFuIGVtcHR5IGxpc3QgYW5kIHRoZW4gY2FsbGluZworICAgICAqIHtAbGluayBJdGVyYXRvcnMjYWRkQWxsfS4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD48Yj5Ob3RlOjwvYj4gaWYgbXV0YWJpbGl0eSBpcyBub3QgcmVxdWlyZWQgYW5kIHRoZSBlbGVtZW50cyBhcmUKKyAgICAgKiBub24tbnVsbCwgdXNlIHtAbGluayBJbW11dGFibGVMaXN0I2NvcHlPZihJdGVyYXRvcil9IGluc3RlYWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8RT4gQXJyYXlMaXN0PEU+IG5ld0FycmF5TGlzdChJdGVyYXRvcjw/IGV4dGVuZHMgRT4gZWxlbWVudHMpIHsKKyAgICAgICAgQXJyYXlMaXN0PEU+IGxpc3QgPSBuZXdBcnJheUxpc3QoKTsKKyAgICAgICAgSXRlcmF0b3JzLmFkZEFsbChsaXN0LCBlbGVtZW50cyk7CisgICAgICAgIHJldHVybiBsaXN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSByZXZlcnNlZCB2aWV3IG9mIHRoZSBzcGVjaWZpZWQgbGlzdC4gRm9yIGV4YW1wbGUsIHtAY29kZQorICAgICAqIExpc3RzLnJldmVyc2UoQXJyYXlzLmFzTGlzdCgxLCAyLCAzKSl9IHJldHVybnMgYSBsaXN0IGNvbnRhaW5pbmcge0Bjb2RlIDMsCisgICAgICogMiwgMX0uIFRoZSByZXR1cm5lZCBsaXN0IGlzIGJhY2tlZCBieSB0aGlzIGxpc3QsIHNvIGNoYW5nZXMgaW4gdGhlIHJldHVybmVkCisgICAgICogbGlzdCBhcmUgcmVmbGVjdGVkIGluIHRoaXMgbGlzdCwgYW5kIHZpY2UtdmVyc2EuIFRoZSByZXR1cm5lZCBsaXN0IHN1cHBvcnRzCisgICAgICogYWxsIG9mIHRoZSBvcHRpb25hbCBsaXN0IG9wZXJhdGlvbnMgc3VwcG9ydGVkIGJ5IHRoaXMgbGlzdC4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5UaGUgcmV0dXJuZWQgbGlzdCBpcyByYW5kb20tYWNjZXNzIGlmIHRoZSBzcGVjaWZpZWQgbGlzdCBpcyByYW5kb20KKyAgICAgKiBhY2Nlc3MuCisgICAgICoKKyAgICAgKiBAc2luY2UgNy4wCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgPFQ+IExpc3Q8VD4gcmV2ZXJzZShMaXN0PFQ+IGxpc3QpIHsKKyAgICAgICAgaWYgKGxpc3QgaW5zdGFuY2VvZiBSZXZlcnNlTGlzdCkgeworICAgICAgICAgICAgcmV0dXJuICgoUmV2ZXJzZUxpc3Q8VD4pIGxpc3QpLmdldEZvcndhcmRMaXN0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJldmVyc2VMaXN0PFQ+KGxpc3QpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQW4gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIExpc3QjZXF1YWxzKE9iamVjdCl9LgorICAgICAqLworICAgIHN0YXRpYyBib29sZWFuIGVxdWFsc0ltcGwoTGlzdDw/PiBsaXN0LCBPYmplY3Qgb2JqZWN0KSB7CisgICAgICAgIGlmIChvYmplY3QgPT0gY2hlY2tOb3ROdWxsKGxpc3QpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBMaXN0KSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgTGlzdDw/PiBvID0gKExpc3Q8Pz4pIG9iamVjdDsKKworICAgICAgICByZXR1cm4gbGlzdC5zaXplKCkgPT0gby5zaXplKCkKKyAgICAgICAgICAgICAgICAmJiBJdGVyYXRvcnMuZWxlbWVudHNFcXVhbChsaXN0Lml0ZXJhdG9yKCksIG8uaXRlcmF0b3IoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQW4gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIExpc3QjaW5kZXhPZihPYmplY3QpfS4KKyAgICAgKi8KKyAgICBzdGF0aWMgaW50IGluZGV4T2ZJbXBsKExpc3Q8Pz4gbGlzdCwgT2JqZWN0IGVsZW1lbnQpIHsKKyAgICAgICAgTGlzdEl0ZXJhdG9yPD8+IGxpc3RJdGVyYXRvciA9IGxpc3QubGlzdEl0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChsaXN0SXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBpZiAoT2JqZWN0cy5lcXVhbHMoZWxlbWVudCwgbGlzdEl0ZXJhdG9yLm5leHQoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGlzdEl0ZXJhdG9yLnByZXZpb3VzSW5kZXgoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLyoqCisgICAgICogQW4gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIExpc3QjbGFzdEluZGV4T2YoT2JqZWN0KX0uCisgICAgICovCisgICAgc3RhdGljIGludCBsYXN0SW5kZXhPZkltcGwoTGlzdDw/PiBsaXN0LCBPYmplY3QgZWxlbWVudCkgeworICAgICAgICBMaXN0SXRlcmF0b3I8Pz4gbGlzdEl0ZXJhdG9yID0gbGlzdC5saXN0SXRlcmF0b3IobGlzdC5zaXplKCkpOworICAgICAgICB3aGlsZSAobGlzdEl0ZXJhdG9yLmhhc1ByZXZpb3VzKCkpIHsKKyAgICAgICAgICAgIGlmIChPYmplY3RzLmVxdWFscyhlbGVtZW50LCBsaXN0SXRlcmF0b3IucHJldmlvdXMoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGlzdEl0ZXJhdG9yLm5leHRJbmRleCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSZXZlcnNlTGlzdDxUPiBleHRlbmRzIEFic3RyYWN0TGlzdDxUPiB7CisgICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxUPiBmb3J3YXJkTGlzdDsKKworICAgICAgICBSZXZlcnNlTGlzdChMaXN0PFQ+IGZvcndhcmRMaXN0KSB7CisgICAgICAgICAgICB0aGlzLmZvcndhcmRMaXN0ID0gY2hlY2tOb3ROdWxsKGZvcndhcmRMaXN0KTsKKyAgICAgICAgfQorCisgICAgICAgIExpc3Q8VD4gZ2V0Rm9yd2FyZExpc3QoKSB7CisgICAgICAgICAgICByZXR1cm4gZm9yd2FyZExpc3Q7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGludCByZXZlcnNlSW5kZXgoaW50IGluZGV4KSB7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IHNpemUoKTsKKyAgICAgICAgICAgIGNoZWNrRWxlbWVudEluZGV4KGluZGV4LCBzaXplKTsKKyAgICAgICAgICAgIHJldHVybiAoc2l6ZSAtIDEpIC0gaW5kZXg7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGludCByZXZlcnNlUG9zaXRpb24oaW50IGluZGV4KSB7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IHNpemUoKTsKKyAgICAgICAgICAgIGNoZWNrUG9zaXRpb25JbmRleChpbmRleCwgc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gc2l6ZSAtIGluZGV4OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIFQgZWxlbWVudCkgeworICAgICAgICAgICAgZm9yd2FyZExpc3QuYWRkKHJldmVyc2VQb3NpdGlvbihpbmRleCksIGVsZW1lbnQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICAgICAgZm9yd2FyZExpc3QuY2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVCByZW1vdmUoaW50IGluZGV4KSB7CisgICAgICAgICAgICByZXR1cm4gZm9yd2FyZExpc3QucmVtb3ZlKHJldmVyc2VJbmRleChpbmRleCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHJlbW92ZVJhbmdlKGludCBmcm9tSW5kZXgsIGludCB0b0luZGV4KSB7CisgICAgICAgICAgICBzdWJMaXN0KGZyb21JbmRleCwgdG9JbmRleCkuY2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVCBzZXQoaW50IGluZGV4LCBUIGVsZW1lbnQpIHsKKyAgICAgICAgICAgIHJldHVybiBmb3J3YXJkTGlzdC5zZXQocmV2ZXJzZUluZGV4KGluZGV4KSwgZWxlbWVudCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFQgZ2V0KGludCBpbmRleCkgeworICAgICAgICAgICAgcmV0dXJuIGZvcndhcmRMaXN0LmdldChyZXZlcnNlSW5kZXgoaW5kZXgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgICAgICByZXR1cm4gZm9yd2FyZExpc3Quc2l6ZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBMaXN0PFQ+IHN1Ykxpc3QoaW50IGZyb21JbmRleCwgaW50IHRvSW5kZXgpIHsKKyAgICAgICAgICAgIGNoZWNrUG9zaXRpb25JbmRleGVzKGZyb21JbmRleCwgdG9JbmRleCwgc2l6ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiByZXZlcnNlKGZvcndhcmRMaXN0LnN1Ykxpc3QoCisgICAgICAgICAgICAgICAgICAgIHJldmVyc2VQb3NpdGlvbih0b0luZGV4KSwgcmV2ZXJzZVBvc2l0aW9uKGZyb21JbmRleCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSXRlcmF0b3I8VD4gaXRlcmF0b3IoKSB7CisgICAgICAgICAgICByZXR1cm4gbGlzdEl0ZXJhdG9yKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIExpc3RJdGVyYXRvcjxUPiBsaXN0SXRlcmF0b3IoaW50IGluZGV4KSB7CisgICAgICAgICAgICBpbnQgc3RhcnQgPSByZXZlcnNlUG9zaXRpb24oaW5kZXgpOworICAgICAgICAgICAgZmluYWwgTGlzdEl0ZXJhdG9yPFQ+IGZvcndhcmRJdGVyYXRvciA9IGZvcndhcmRMaXN0Lmxpc3RJdGVyYXRvcihzdGFydCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IExpc3RJdGVyYXRvcjxUPigpIHsKKworICAgICAgICAgICAgICAgIGJvb2xlYW4gY2FuUmVtb3ZlT3JTZXQ7CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhZGQoVCBlKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcndhcmRJdGVyYXRvci5hZGQoZSk7CisgICAgICAgICAgICAgICAgICAgIGZvcndhcmRJdGVyYXRvci5wcmV2aW91cygpOworICAgICAgICAgICAgICAgICAgICBjYW5SZW1vdmVPclNldCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmb3J3YXJkSXRlcmF0b3IuaGFzUHJldmlvdXMoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZvcndhcmRJdGVyYXRvci5oYXNOZXh0KCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIFQgbmV4dCgpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY2FuUmVtb3ZlT3JTZXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm9yd2FyZEl0ZXJhdG9yLnByZXZpb3VzKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGludCBuZXh0SW5kZXgoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXZlcnNlUG9zaXRpb24oZm9yd2FyZEl0ZXJhdG9yLm5leHRJbmRleCgpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgVCBwcmV2aW91cygpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNQcmV2aW91cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNhblJlbW92ZU9yU2V0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZvcndhcmRJdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGludCBwcmV2aW91c0luZGV4KCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV4dEluZGV4KCkgLSAxOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgQ29sbGVjdFByZWNvbmRpdGlvbnMuY2hlY2tSZW1vdmUoY2FuUmVtb3ZlT3JTZXQpOworICAgICAgICAgICAgICAgICAgICBmb3J3YXJkSXRlcmF0b3IucmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgICAgIGNhblJlbW92ZU9yU2V0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0KFQgZSkgeworICAgICAgICAgICAgICAgICAgICBjaGVja1N0YXRlKGNhblJlbW92ZU9yU2V0KTsKKyAgICAgICAgICAgICAgICAgICAgZm9yd2FyZEl0ZXJhdG9yLnNldChlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9Mb2FkaW5nQ2FjaGUuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvTG9hZGluZ0NhY2hlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg4MDZiZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvTG9hZGluZ0NhY2hlLmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgR3VhdmEgQXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YTsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CisKKy8qKgorICogQSBzZW1pLXBlcnNpc3RlbnQgbWFwcGluZyBmcm9tIGtleXMgdG8gdmFsdWVzLiBWYWx1ZXMgYXJlIGF1dG9tYXRpY2FsbHkgbG9hZGVkIGJ5IHRoZSBjYWNoZSwKKyAqIGFuZCBhcmUgc3RvcmVkIGluIHRoZSBjYWNoZSB1bnRpbCBlaXRoZXIgZXZpY3RlZCBvciBtYW51YWxseSBpbnZhbGlkYXRlZC4KKyAqIDxwPgorICogPHA+SW1wbGVtZW50YXRpb25zIG9mIHRoaXMgaW50ZXJmYWNlIGFyZSBleHBlY3RlZCB0byBiZSB0aHJlYWQtc2FmZSwgYW5kIGNhbiBiZSBzYWZlbHkgYWNjZXNzZWQKKyAqIGJ5IG11bHRpcGxlIGNvbmN1cnJlbnQgdGhyZWFkcy4KKyAqIDxwPgorICogPHA+V2hlbiBldmFsdWF0ZWQgYXMgYSB7QGxpbmsgRnVuY3Rpb259LCBhIGNhY2hlIHlpZWxkcyB0aGUgc2FtZSByZXN1bHQgYXMgaW52b2tpbmcKKyAqIHtAbGluayAjZ2V0VW5jaGVja2VkfS4KKyAqIDxwPgorICogPHA+Tm90ZSB0aGF0IHdoaWxlIHRoaXMgY2xhc3MgaXMgc3RpbGwgYW5ub3RhdGVkIGFzIHtAbGluayBCZXRhfSwgdGhlIEFQSSBpcyBmcm96ZW4gZnJvbSBhCisgKiBjb25zdW1lcidzIHN0YW5kcG9pbnQuIEluIG90aGVyIHdvcmRzIGV4aXN0aW5nIG1ldGhvZHMgYXJlIGFsbCBjb25zaWRlcmVkIHtAY29kZSBub24tQmV0YX0gYW5kCisgKiB3b24ndCBiZSBjaGFuZ2VkIHdpdGhvdXQgZ29pbmcgdGhyb3VnaCBhbiAxOCBtb250aCBkZXByZWNhdGlvbiBjeWNsZTsgaG93ZXZlciBuZXcgbWV0aG9kcyBtYXkgYmUKKyAqIGFkZGVkIGF0IGFueSB0aW1lLgorICoKKyAqIEBhdXRob3IgQ2hhcmxlcyBGcnkKKyAqIEBzaW5jZSAxMS4wCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTG9hZGluZ0NhY2hlPEssIFY+IGV4dGVuZHMgQ2FjaGU8SywgVj4sIEZ1bmN0aW9uPEssIFY+IHsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB7QGNvZGUga2V5fSBpbiB0aGlzIGNhY2hlLCBmaXJzdCBsb2FkaW5nIHRoYXQgdmFsdWUgaWYKKyAgICAgKiBuZWNlc3NhcnkuIE5vIG9ic2VydmFibGUgc3RhdGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2FjaGUgaXMgbW9kaWZpZWQgdW50aWwgbG9hZGluZyBjb21wbGV0ZXMuCisgICAgICogPHA+CisgICAgICogPHA+SWYgYW5vdGhlciBjYWxsIHRvIHtAbGluayAjZ2V0fSBvciB7QGxpbmsgI2dldFVuY2hlY2tlZH0gaXMgY3VycmVudGx5IGxvYWRpbmcgdGhlIHZhbHVlIGZvcgorICAgICAqIHtAY29kZSBrZXl9LCBzaW1wbHkgd2FpdHMgZm9yIHRoYXQgdGhyZWFkIHRvIGZpbmlzaCBhbmQgcmV0dXJucyBpdHMgbG9hZGVkIHZhbHVlLiBOb3RlIHRoYXQKKyAgICAgKiBtdWx0aXBsZSB0aHJlYWRzIGNhbiBjb25jdXJyZW50bHkgbG9hZCB2YWx1ZXMgZm9yIGRpc3RpbmN0IGtleXMuCisgICAgICogPHA+CisgICAgICogPHA+Q2FjaGVzIGxvYWRlZCBieSBhIHtAbGluayBDYWNoZUxvYWRlcn0gd2lsbCBjYWxsIHtAbGluayBDYWNoZUxvYWRlciNsb2FkfSB0byBsb2FkIG5ldyB2YWx1ZXMKKyAgICAgKiBpbnRvIHRoZSBjYWNoZS4gTmV3bHkgbG9hZGVkIHZhbHVlcyBhcmUgYWRkZWQgdG8gdGhlIGNhY2hlIHVzaW5nCisgICAgICoge0Bjb2RlIENhY2hlLmFzTWFwKCkucHV0SWZBYnNlbnR9IGFmdGVyIGxvYWRpbmcgaGFzIGNvbXBsZXRlZDsgaWYgYW5vdGhlciB2YWx1ZSB3YXMgYXNzb2NpYXRlZAorICAgICAqIHdpdGgge0Bjb2RlIGtleX0gd2hpbGUgdGhlIG5ldyB2YWx1ZSB3YXMgbG9hZGluZyB0aGVuIGEgcmVtb3ZhbCBub3RpZmljYXRpb24gd2lsbCBiZSBzZW50IGZvcgorICAgICAqIHRoZSBuZXcgdmFsdWUuCisgICAgICogPHA+CisgICAgICogPHA+SWYgdGhlIGNhY2hlIGxvYWRlciBhc3NvY2lhdGVkIHdpdGggdGhpcyBjYWNoZSBpcyBrbm93biBub3QgdG8gdGhyb3cgY2hlY2tlZAorICAgICAqIGV4Y2VwdGlvbnMsIHRoZW4gcHJlZmVyIHtAbGluayAjZ2V0VW5jaGVja2VkfSBvdmVyIHRoaXMgbWV0aG9kLgorICAgICAqCisgICAgICogQHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gICAgICAgICAgaWYgYSBjaGVja2VkIGV4Y2VwdGlvbiB3YXMgdGhyb3duIHdoaWxlIGxvYWRpbmcgdGhlIHZhbHVlLiAoe0Bjb2RlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhlY3V0aW9uRXhjZXB0aW9ufSBpcyB0aHJvd24gPGEKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBocmVmPSJodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ3VhdmEtbGlicmFyaWVzL3dpa2kvQ2FjaGVzRXhwbGFpbmVkI0ludGVycnVwdGlvbiI+ZXZlbiBpZgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGF0aW9uIHdhcyBpbnRlcnJ1cHRlZCBieSBhbiB7QGNvZGUgSW50ZXJydXB0ZWRFeGNlcHRpb259PC9hPi4pCisgICAgICogQHRocm93cyBVbmNoZWNrZWRFeGVjdXRpb25FeGNlcHRpb24gaWYgYW4gdW5jaGVja2VkIGV4Y2VwdGlvbiB3YXMgdGhyb3duIHdoaWxlIGxvYWRpbmcgdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUKKyAgICAgKiBAdGhyb3dzIEV4ZWN1dGlvbkVycm9yICAgICAgICAgICAgICBpZiBhbiBlcnJvciB3YXMgdGhyb3duIHdoaWxlIGxvYWRpbmcgdGhlIHZhbHVlCisgICAgICovCisgICAgViBnZXQoSyBrZXkpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBAdGhyb3dzIFVuY2hlY2tlZEV4ZWN1dGlvbkV4Y2VwdGlvbiBpZiBhbiBleGNlcHRpb24gd2FzIHRocm93biB3aGlsZSBsb2FkaW5nIHRoZSB2YWx1ZS4gKEFzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmVkIGluIHRoZSBkb2N1bWVudGF0aW9uIGZvciB7QGxpbmsgI2dldFVuY2hlY2tlZH0sIHtAY29kZSBMb2FkaW5nQ2FjaGV9IHNob3VsZCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgYXMgYSB7QGNvZGUgRnVuY3Rpb259IG9ubHkgd2l0aCBjYWNoZSBsb2FkZXJzIHRoYXQgdGhyb3cgb25seSB1bmNoZWNrZWQgZXhjZXB0aW9ucy4pCisgICAgICogQGRlcHJlY2F0ZWQgUHJvdmlkZWQgdG8gc2F0aXNmeSB0aGUge0Bjb2RlIEZ1bmN0aW9ufSBpbnRlcmZhY2U7IHVzZSB7QGxpbmsgI2dldH0gb3IKKyAgICAgKiB7QGxpbmsgI2dldFVuY2hlY2tlZH0gaW5zdGVhZC4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIEBPdmVycmlkZQorICAgIFYgYXBwbHkoSyBrZXkpOworCit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL0xvY2FsQ2FjaGUuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvTG9jYWxDYWNoZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5OTQ0Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL0xvY2FsQ2FjaGUuamF2YQpAQCAtMCwwICsxLDQxMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEd1YXZhIEF1dGhvcnMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmE7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmLlJlZmVyZW5jZVF1ZXVlOworaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKK2ltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RDb2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RTZXQ7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlF1ZXVlOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudExpbmtlZFF1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRNYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2VBcnJheTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRMb2NrOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmEuTW9yZUV4ZWN1dG9ycy5kaXJlY3RFeGVjdXRvcjsKK2ltcG9ydCBzdGF0aWMgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmEuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhLlByZWNvbmRpdGlvbnMuY2hlY2tTdGF0ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmEuVW5pbnRlcnJ1cHRpYmxlcy5nZXRVbmludGVycnVwdGlibHk7CisKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuTkFOT1NFQ09ORFM7CisKKy8qKgorICogVGhlIGNvbmN1cnJlbnQgaGFzaCBtYXAgaW1wbGVtZW50YXRpb24gYnVpbHQgYnkge0BsaW5rIENhY2hlQnVpbGRlcn0uCisgKiA8cD4KKyAqIDxwPlRoaXMgaW1wbGVtZW50YXRpb24gaXMgaGVhdmlseSBkZXJpdmVkIGZyb20gcmV2aXNpb24gMS45NiBvZiA8YQorICogaHJlZj0iaHR0cDovL3Rpbnl1cmwuY29tL0NvbmN1cnJlbnRIYXNoTWFwIj5Db25jdXJyZW50SGFzaE1hcC5qYXZhPC9hPi4KKyAqCisgKiBAYXV0aG9yIENoYXJsZXMgRnJ5CisgKiBAYXV0aG9yIEJvYiBMZWUgKHtAY29kZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YS5NYXBNYWtlcn0pCisgKiBAYXV0aG9yIERvdWcgTGVhICh7QGNvZGUgQ29uY3VycmVudEhhc2hNYXB9KQorICovCitjbGFzcyBMb2NhbENhY2hlPEssIFY+IGV4dGVuZHMgQWJzdHJhY3RNYXA8SywgVj4gaW1wbGVtZW50cyBDb25jdXJyZW50TWFwPEssIFY+IHsKKworICAvKgorICAgKiBUaGUgYmFzaWMgc3RyYXRlZ3kgaXMgdG8gc3ViZGl2aWRlIHRoZSB0YWJsZSBhbW9uZyBTZWdtZW50cywgZWFjaCBvZiB3aGljaCBpdHNlbGYgaXMgYQorICAgKiBjb25jdXJyZW50bHkgcmVhZGFibGUgaGFzaCB0YWJsZS4gVGhlIG1hcCBzdXBwb3J0cyBub24tYmxvY2tpbmcgcmVhZHMgYW5kIGNvbmN1cnJlbnQgd3JpdGVzCisgICAqIGFjcm9zcyBkaWZmZXJlbnQgc2VnbWVudHMuCisgICAqCisgICAqIElmIGEgbWF4aW11bSBzaXplIGlzIHNwZWNpZmllZCwgYSBiZXN0LWVmZm9ydCBib3VuZGluZyBpcyBwZXJmb3JtZWQgcGVyIHNlZ21lbnQsIHVzaW5nIGEKKyAgICogcGFnZS1yZXBsYWNlbWVudCBhbGdvcml0aG0gdG8gZGV0ZXJtaW5lIHdoaWNoIGVudHJpZXMgdG8gZXZpY3Qgd2hlbiB0aGUgY2FwYWNpdHkgaGFzIGJlZW4KKyAgICogZXhjZWVkZWQuCisgICAqCisgICAqIFRoZSBwYWdlIHJlcGxhY2VtZW50IGFsZ29yaXRobSdzIGRhdGEgc3RydWN0dXJlcyBhcmUga2VwdCBjYXN1YWxseSBjb25zaXN0ZW50IHdpdGggdGhlIG1hcC4gVGhlCisgICAqIG9yZGVyaW5nIG9mIHdyaXRlcyB0byBhIHNlZ21lbnQgaXMgc2VxdWVudGlhbGx5IGNvbnNpc3RlbnQuIEFuIHVwZGF0ZSB0byB0aGUgbWFwIGFuZCByZWNvcmRpbmcKKyAgICogb2YgcmVhZHMgbWF5IG5vdCBiZSBpbW1lZGlhdGVseSByZWZsZWN0ZWQgb24gdGhlIGFsZ29yaXRobSdzIGRhdGEgc3RydWN0dXJlcy4gVGhlc2Ugc3RydWN0dXJlcworICAgKiBhcmUgZ3VhcmRlZCBieSBhIGxvY2sgYW5kIG9wZXJhdGlvbnMgYXJlIGFwcGxpZWQgaW4gYmF0Y2hlcyB0byBhdm9pZCBsb2NrIGNvbnRlbnRpb24uIFRoZQorICAgKiBwZW5hbHR5IG9mIGFwcGx5aW5nIHRoZSBiYXRjaGVzIGlzIHNwcmVhZCBhY3Jvc3MgdGhyZWFkcyBzbyB0aGF0IHRoZSBhbW9ydGl6ZWQgY29zdCBpcyBzbGlnaHRseQorICAgKiBoaWdoZXIgdGhhbiBwZXJmb3JtaW5nIGp1c3QgdGhlIG9wZXJhdGlvbiB3aXRob3V0IGVuZm9yY2luZyB0aGUgY2FwYWNpdHkgY29uc3RyYWludC4KKyAgICoKKyAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIGEgcGVyLXNlZ21lbnQgcXVldWUgdG8gcmVjb3JkIGEgbWVtZW50byBvZiB0aGUgYWRkaXRpb25zLCByZW1vdmFscywKKyAgICogYW5kIGFjY2Vzc2VzIHRoYXQgd2VyZSBwZXJmb3JtZWQgb24gdGhlIG1hcC4gVGhlIHF1ZXVlIGlzIGRyYWluZWQgb24gd3JpdGVzIGFuZCB3aGVuIGl0IGV4Y2VlZHMKKyAgICogaXRzIGNhcGFjaXR5IHRocmVzaG9sZC4KKyAgICoKKyAgICogVGhlIExlYXN0IFJlY2VudGx5IFVzZWQgcGFnZSByZXBsYWNlbWVudCBhbGdvcml0aG0gd2FzIGNob3NlbiBkdWUgdG8gaXRzIHNpbXBsaWNpdHksIGhpZ2ggaGl0CisgICAqIHJhdGUsIGFuZCBhYmlsaXR5IHRvIGJlIGltcGxlbWVudGVkIHdpdGggTygxKSB0aW1lIGNvbXBsZXhpdHkuIFRoZSBpbml0aWFsIExSVSBpbXBsZW1lbnRhdGlvbgorICAgKiBvcGVyYXRlcyBwZXItc2VnbWVudCByYXRoZXIgdGhhbiBnbG9iYWxseSBmb3IgaW5jcmVhc2VkIGltcGxlbWVudGF0aW9uIHNpbXBsaWNpdHkuIFdlIGV4cGVjdAorICAgKiB0aGUgY2FjaGUgaGl0IHJhdGUgdG8gYmUgc2ltaWxhciB0byB0aGF0IG9mIGEgZ2xvYmFsIExSVSBhbGdvcml0aG0uCisgICAqLworCisgICAgLy8gQ29uc3RhbnRzCisKKyAgICAvKioKKyAgICAgKiBUaGUgbWF4aW11bSBjYXBhY2l0eSwgdXNlZCBpZiBhIGhpZ2hlciB2YWx1ZSBpcyBpbXBsaWNpdGx5IHNwZWNpZmllZCBieSBlaXRoZXIgb2YgdGhlCisgICAgICogY29uc3RydWN0b3JzIHdpdGggYXJndW1lbnRzLiBNVVNUIGJlIGEgcG93ZXIgb2YgdHdvIDw9IDE8PDMwIHRvIGVuc3VyZSB0aGF0IGVudHJpZXMgYXJlCisgICAgICogaW5kZXhhYmxlIHVzaW5nIGludHMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWElNVU1fQ0FQQUNJVFkgPSAxIDw8IDMwOworCisgICAgLyoqCisgICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIHNlZ21lbnRzIHRvIGFsbG93OyB1c2VkIHRvIGJvdW5kIGNvbnN0cnVjdG9yIGFyZ3VtZW50cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1NFR01FTlRTID0gMSA8PCAxNjsgLy8gc2xpZ2h0bHkgY29uc2VydmF0aXZlCisKKyAgICAvKioKKyAgICAgKiBOdW1iZXIgb2YgKHVuc3luY2hyb25pemVkKSByZXRyaWVzIGluIHRoZSBjb250YWluc1ZhbHVlIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OVEFJTlNfVkFMVUVfUkVUUklFUyA9IDM7CisKKyAgICAvKioKKyAgICAgKiBOdW1iZXIgb2YgY2FjaGUgYWNjZXNzIG9wZXJhdGlvbnMgdGhhdCBjYW4gYmUgYnVmZmVyZWQgcGVyIHNlZ21lbnQgYmVmb3JlIHRoZSBjYWNoZSdzIHJlY2VuY3kKKyAgICAgKiBvcmRlcmluZyBpbmZvcm1hdGlvbiBpcyB1cGRhdGVkLiBUaGlzIGlzIHVzZWQgdG8gYXZvaWQgbG9jayBjb250ZW50aW9uIGJ5IHJlY29yZGluZyBhIG1lbWVudG8KKyAgICAgKiBvZiByZWFkcyBhbmQgZGVsYXlpbmcgYSBsb2NrIGFjcXVpc2l0aW9uIHVudGlsIHRoZSB0aHJlc2hvbGQgaXMgY3Jvc3NlZCBvciBhIG11dGF0aW9uIG9jY3Vycy4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5UaGlzIG11c3QgYmUgYSAoMl5uKS0xIGFzIGl0IGlzIHVzZWQgYXMgYSBtYXNrLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEUkFJTl9USFJFU0hPTEQgPSAweDNGOworCisgICAgLyoqCisgICAgICogTWF4aW11bSBudW1iZXIgb2YgZW50cmllcyB0byBiZSBkcmFpbmVkIGluIGEgc2luZ2xlIGNsZWFudXAgcnVuLiBUaGlzIGFwcGxpZXMgaW5kZXBlbmRlbnRseSB0bworICAgICAqIHRoZSBjbGVhbnVwIHF1ZXVlIGFuZCBib3RoIHJlZmVyZW5jZSBxdWV1ZXMuCisgICAgICovCisgICAgLy8gVE9ETyhmcnkpOiBlbXBpcmljYWxseSBvcHRpbWl6ZSB0aGlzCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERSQUlOX01BWCA9IDE2OworCisgICAgLy8gRmllbGRzCisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihMb2NhbENhY2hlLmNsYXNzLmdldE5hbWUoKSk7CisgICAgLyoqCisgICAgICogUGxhY2Vob2xkZXIuIEluZGljYXRlcyB0aGF0IHRoZSB2YWx1ZSBoYXNuJ3QgYmVlbiBzZXQgeWV0LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFZhbHVlUmVmZXJlbmNlPE9iamVjdCwgT2JqZWN0PiBVTlNFVCA9IG5ldyBWYWx1ZVJlZmVyZW5jZTxPYmplY3QsIE9iamVjdD4oKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0IGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0V2VpZ2h0KCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlZmVyZW5jZUVudHJ5PE9iamVjdCwgT2JqZWN0PiBnZXRFbnRyeSgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWYWx1ZVJlZmVyZW5jZTxPYmplY3QsIE9iamVjdD4gY29weUZvcihSZWZlcmVuY2VRdWV1ZTxPYmplY3Q+IHF1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlLCBSZWZlcmVuY2VFbnRyeTxPYmplY3QsIE9iamVjdD4gZW50cnkpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzTG9hZGluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0FjdGl2ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0IHdhaXRGb3JWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG5vdGlmeU5ld1ZhbHVlKE9iamVjdCBuZXdWYWx1ZSkgeworICAgICAgICB9CisgICAgfTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBRdWV1ZTw/PiBESVNDQVJESU5HX1FVRVVFID0gbmV3IEFic3RyYWN0UXVldWU8T2JqZWN0PigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIG9mZmVyKE9iamVjdCBvKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0IHBlZWsoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0IHBvbGwoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSXRlcmF0b3I8T2JqZWN0PiBpdGVyYXRvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBJdGVyYXRvcnMuZW1wdHlJdGVyYXRvcigpOworICAgICAgICB9CisgICAgfTsKKyAgICAvKioKKyAgICAgKiBNYXNrIHZhbHVlIGZvciBpbmRleGluZyBpbnRvIHNlZ21lbnRzLiBUaGUgdXBwZXIgYml0cyBvZiBhIGtleSdzIGhhc2ggY29kZSBhcmUgdXNlZCB0byBjaG9vc2UKKyAgICAgKiB0aGUgc2VnbWVudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGludCBzZWdtZW50TWFzazsKKyAgICAvKioKKyAgICAgKiBTaGlmdCB2YWx1ZSBmb3IgaW5kZXhpbmcgd2l0aGluIHNlZ21lbnRzLiBIZWxwcyBwcmV2ZW50IGVudHJpZXMgdGhhdCBlbmQgdXAgaW4gdGhlIHNhbWUgc2VnbWVudAorICAgICAqIGZyb20gYWxzbyBlbmRpbmcgdXAgaW4gdGhlIHNhbWUgYnVja2V0LgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgaW50IHNlZ21lbnRTaGlmdDsKKyAgICAvKioKKyAgICAgKiBUaGUgc2VnbWVudHMsIGVhY2ggb2Ygd2hpY2ggaXMgYSBzcGVjaWFsaXplZCBoYXNoIHRhYmxlLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgU2VnbWVudDxLLCBWPltdIHNlZ21lbnRzOworICAgIC8qKgorICAgICAqIFRoZSBjb25jdXJyZW5jeSBsZXZlbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGludCBjb25jdXJyZW5jeUxldmVsOworICAgIC8qKgorICAgICAqIFN0cmF0ZWd5IGZvciBjb21wYXJpbmcga2V5cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIEVxdWl2YWxlbmNlPE9iamVjdD4ga2V5RXF1aXZhbGVuY2U7CisgICAgLyoqCisgICAgICogU3RyYXRlZ3kgZm9yIGNvbXBhcmluZyB2YWx1ZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBFcXVpdmFsZW5jZTxPYmplY3Q+IHZhbHVlRXF1aXZhbGVuY2U7CisgICAgLyoqCisgICAgICogU3RyYXRlZ3kgZm9yIHJlZmVyZW5jaW5nIGtleXMuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJlbmd0aCBrZXlTdHJlbmd0aDsKKyAgICAvKioKKyAgICAgKiBTdHJhdGVneSBmb3IgcmVmZXJlbmNpbmcgdmFsdWVzLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgU3RyZW5ndGggdmFsdWVTdHJlbmd0aDsKKyAgICAvKioKKyAgICAgKiBUaGUgbWF4aW11bSB3ZWlnaHQgb2YgdGhpcyBtYXAuIFVOU0VUX0lOVCBpZiB0aGVyZSBpcyBubyBtYXhpbXVtLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgbG9uZyBtYXhXZWlnaHQ7CisgICAgLyoqCisgICAgICogSG93IGxvbmcgYWZ0ZXIgdGhlIGxhc3QgYWNjZXNzIHRvIGFuIGVudHJ5IHRoZSBtYXAgd2lsbCByZXRhaW4gdGhhdCBlbnRyeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgZXhwaXJlQWZ0ZXJBY2Nlc3NOYW5vczsKKyAgICAvKioKKyAgICAgKiBIb3cgbG9uZyBhZnRlciB0aGUgbGFzdCB3cml0ZSB0byBhbiBlbnRyeSB0aGUgbWFwIHdpbGwgcmV0YWluIHRoYXQgZW50cnkuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIGV4cGlyZUFmdGVyV3JpdGVOYW5vczsKKyAgICAvKioKKyAgICAgKiBIb3cgbG9uZyBhZnRlciB0aGUgbGFzdCB3cml0ZSBhbiBlbnRyeSBiZWNvbWVzIGEgY2FuZGlkYXRlIGZvciByZWZyZXNoLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgbG9uZyByZWZyZXNoTmFub3M7CisgICAgLyoqCisgICAgICogRW50cmllcyB3YWl0aW5nIHRvIGJlIGNvbnN1bWVkIGJ5IHRoZSByZW1vdmFsIGxpc3RlbmVyLgorICAgICAqLworICAgIC8vIFRPRE8oZnJ5KTogZGVmaW5lIGEgbmV3IHR5cGUgd2hpY2ggY3JlYXRlcyBldmVudCBvYmplY3RzIGFuZCBhdXRvbWF0ZXMgdGhlIGNsZWFyIGxvZ2ljCisgICAgcHJpdmF0ZSBmaW5hbCBRdWV1ZTxSZW1vdmFsTm90aWZpY2F0aW9uPEssIFY+PiByZW1vdmFsTm90aWZpY2F0aW9uUXVldWU7CisgICAgLyoqCisgICAgICogTWVhc3VyZXMgdGltZSBpbiBhIHRlc3RhYmxlIHdheS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIFRpY2tlciB0aWNrZXI7CisgICAgLyoqCisgICAgICogRmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSBuZXcgZW50cmllcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIEVudHJ5RmFjdG9yeSBlbnRyeUZhY3Rvcnk7CisgICAgLyoqCisgICAgICogVGhlIGRlZmF1bHQgY2FjaGUgbG9hZGVyIHRvIHVzZSBvbiBsb2FkaW5nIG9wZXJhdGlvbnMuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBDYWNoZUxvYWRlcjw/IHN1cGVyIEssIFY+IGRlZmF1bHRMb2FkZXI7CisgICAgcHJpdmF0ZSBTZXQ8Sz4ga2V5U2V0OworICAgIHByaXZhdGUgQ29sbGVjdGlvbjxWPiB2YWx1ZXM7CisgICAgcHJpdmF0ZSBTZXQ8RW50cnk8SywgVj4+IGVudHJ5U2V0OworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldywgZW1wdHkgbWFwIHdpdGggdGhlIHNwZWNpZmllZCBzdHJhdGVneSwgaW5pdGlhbCBjYXBhY2l0eSBhbmQgY29uY3VycmVuY3kgbGV2ZWwuCisgICAgICovCisgICAgcHJpdmF0ZSBMb2NhbENhY2hlKAorICAgICAgICAgICAgQ2FjaGVCdWlsZGVyPD8gc3VwZXIgSywgPyBzdXBlciBWPiBidWlsZGVyLCBDYWNoZUxvYWRlcjw/IHN1cGVyIEssIFY+IGxvYWRlcikgeworICAgICAgICBjb25jdXJyZW5jeUxldmVsID0gTWF0aC5taW4oYnVpbGRlci5nZXRDb25jdXJyZW5jeUxldmVsKCksIE1BWF9TRUdNRU5UUyk7CisKKyAgICAgICAga2V5U3RyZW5ndGggPSBTdHJlbmd0aC5TVFJPTkc7CisgICAgICAgIHZhbHVlU3RyZW5ndGggPSBTdHJlbmd0aC5TVFJPTkc7CisKKyAgICAgICAga2V5RXF1aXZhbGVuY2UgPSBrZXlTdHJlbmd0aC5kZWZhdWx0RXF1aXZhbGVuY2UoKTsKKyAgICAgICAgdmFsdWVFcXVpdmFsZW5jZSA9IHZhbHVlU3RyZW5ndGguZGVmYXVsdEVxdWl2YWxlbmNlKCk7CisKKyAgICAgICAgbWF4V2VpZ2h0ID0gQ2FjaGVCdWlsZGVyLlVOU0VUX0lOVDsKKyAgICAgICAgZXhwaXJlQWZ0ZXJBY2Nlc3NOYW5vcyA9IGJ1aWxkZXIuZ2V0RXhwaXJlQWZ0ZXJBY2Nlc3NOYW5vcygpOworICAgICAgICBleHBpcmVBZnRlcldyaXRlTmFub3MgPSBDYWNoZUJ1aWxkZXIuREVGQVVMVF9FWFBJUkFUSU9OX05BTk9TOworICAgICAgICByZWZyZXNoTmFub3MgPSBDYWNoZUJ1aWxkZXIuREVGQVVMVF9SRUZSRVNIX05BTk9TOworCisgICAgICAgIHJlbW92YWxOb3RpZmljYXRpb25RdWV1ZSA9IExvY2FsQ2FjaGUuZGlzY2FyZGluZ1F1ZXVlKCk7CisKKyAgICAgICAgdGlja2VyID0gcmVjb3Jkc1RpbWUoKSA/IFRpY2tlci5zeXN0ZW1UaWNrZXIoKSA6IENhY2hlQnVpbGRlci5OVUxMX1RJQ0tFUjsKKyAgICAgICAgZW50cnlGYWN0b3J5ID0gRW50cnlGYWN0b3J5LmdldEZhY3Rvcnkoa2V5U3RyZW5ndGgsIHVzZXNBY2Nlc3NFbnRyaWVzKCksIHVzZXNXcml0ZUVudHJpZXMoKSk7CisgICAgICAgIGRlZmF1bHRMb2FkZXIgPSBsb2FkZXI7CisKKyAgICAgICAgaW50IGluaXRpYWxDYXBhY2l0eSA9IE1hdGgubWluKENhY2hlQnVpbGRlci5ERUZBVUxUX0lOSVRJQUxfQ0FQQUNJVFksIE1BWElNVU1fQ0FQQUNJVFkpOworICAgICAgICBpZiAoZXZpY3RzQnlTaXplKCkpIHsKKyAgICAgICAgICAgIGluaXRpYWxDYXBhY2l0eSA9IE1hdGgubWluKGluaXRpYWxDYXBhY2l0eSwgKGludCkgbWF4V2VpZ2h0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZpbmQgdGhlIGxvd2VzdCBwb3dlci1vZi10d28gc2VnbWVudENvdW50IHRoYXQgZXhjZWVkcyBjb25jdXJyZW5jeUxldmVsLCB1bmxlc3MKKyAgICAgICAgLy8gbWF4aW11bVNpemUvV2VpZ2h0IGlzIHNwZWNpZmllZCBpbiB3aGljaCBjYXNlIGVuc3VyZSB0aGF0IGVhY2ggc2VnbWVudCBnZXRzIGF0IGxlYXN0IDEwCisgICAgICAgIC8vIGVudHJpZXMuIFRoZSBzcGVjaWFsIGNhc2luZyBmb3Igc2l6ZS1iYXNlZCBldmljdGlvbiBpcyBvbmx5IG5lY2Vzc2FyeSBiZWNhdXNlIHRoYXQgZXZpY3Rpb24KKyAgICAgICAgLy8gaGFwcGVucyBwZXIgc2VnbWVudCBpbnN0ZWFkIG9mIGdsb2JhbGx5LCBzbyB0b28gbWFueSBzZWdtZW50cyBjb21wYXJlZCB0byB0aGUgbWF4aW11bSBzaXplCisgICAgICAgIC8vIHdpbGwgcmVzdWx0IGluIHJhbmRvbSBldmljdGlvbiBiZWhhdmlvci4KKyAgICAgICAgaW50IHNlZ21lbnRTaGlmdCA9IDA7CisgICAgICAgIGludCBzZWdtZW50Q291bnQgPSAxOworICAgICAgICB3aGlsZSAoc2VnbWVudENvdW50IDwgY29uY3VycmVuY3lMZXZlbAorICAgICAgICAgICAgICAgICYmICghZXZpY3RzQnlTaXplKCkgfHwgc2VnbWVudENvdW50ICogMjAgPD0gbWF4V2VpZ2h0KSkgeworICAgICAgICAgICAgKytzZWdtZW50U2hpZnQ7CisgICAgICAgICAgICBzZWdtZW50Q291bnQgPDw9IDE7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5zZWdtZW50U2hpZnQgPSAzMiAtIHNlZ21lbnRTaGlmdDsKKyAgICAgICAgc2VnbWVudE1hc2sgPSBzZWdtZW50Q291bnQgLSAxOworCisgICAgICAgIHRoaXMuc2VnbWVudHMgPSBuZXdTZWdtZW50QXJyYXkoc2VnbWVudENvdW50KTsKKworICAgICAgICBpbnQgc2VnbWVudENhcGFjaXR5ID0gaW5pdGlhbENhcGFjaXR5IC8gc2VnbWVudENvdW50OworICAgICAgICBpZiAoc2VnbWVudENhcGFjaXR5ICogc2VnbWVudENvdW50IDwgaW5pdGlhbENhcGFjaXR5KSB7CisgICAgICAgICAgICArK3NlZ21lbnRDYXBhY2l0eTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBzZWdtZW50U2l6ZSA9IDE7CisgICAgICAgIHdoaWxlIChzZWdtZW50U2l6ZSA8IHNlZ21lbnRDYXBhY2l0eSkgeworICAgICAgICAgICAgc2VnbWVudFNpemUgPDw9IDE7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZXZpY3RzQnlTaXplKCkpIHsKKyAgICAgICAgICAgIC8vIEVuc3VyZSBzdW0gb2Ygc2VnbWVudCBtYXggd2VpZ2h0cyA9IG92ZXJhbGwgbWF4IHdlaWdodHMKKyAgICAgICAgICAgIGxvbmcgbWF4U2VnbWVudFdlaWdodCA9IG1heFdlaWdodCAvIHNlZ21lbnRDb3VudCArIDE7CisgICAgICAgICAgICBsb25nIHJlbWFpbmRlciA9IG1heFdlaWdodCAlIHNlZ21lbnRDb3VudDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5zZWdtZW50cy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgIGlmIChpID09IHJlbWFpbmRlcikgeworICAgICAgICAgICAgICAgICAgICBtYXhTZWdtZW50V2VpZ2h0LS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRoaXMuc2VnbWVudHNbaV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlU2VnbWVudChzZWdtZW50U2l6ZSwgbWF4U2VnbWVudFdlaWdodCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuc2VnbWVudHMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnNlZ21lbnRzW2ldID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVNlZ21lbnQoc2VnbWVudFNpemUsIENhY2hlQnVpbGRlci5VTlNFVF9JTlQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2luZ2xldG9uIHBsYWNlaG9sZGVyIHRoYXQgaW5kaWNhdGVzIGEgdmFsdWUgaXMgYmVpbmcgbG9hZGVkLgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSAvLyBpbXBsIG5ldmVyIHVzZXMgYSBwYXJhbWV0ZXIgb3IgcmV0dXJucyBhbnkgbm9uLW51bGwgdmFsdWUKKyAgICBwcml2YXRlIHN0YXRpYyA8SywgVj4gVmFsdWVSZWZlcmVuY2U8SywgVj4gdW5zZXQoKSB7CisgICAgICAgIHJldHVybiAoVmFsdWVSZWZlcmVuY2U8SywgVj4pIFVOU0VUOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSAvLyBpbXBsIG5ldmVyIHVzZXMgYSBwYXJhbWV0ZXIgb3IgcmV0dXJucyBhbnkgbm9uLW51bGwgdmFsdWUKKyAgICBwcml2YXRlIHN0YXRpYyA8SywgVj4gUmVmZXJlbmNlRW50cnk8SywgVj4gbnVsbEVudHJ5KCkgeworICAgICAgICByZXR1cm4gKFJlZmVyZW5jZUVudHJ5PEssIFY+KSBOdWxsRW50cnkuSU5TVEFOQ0U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUXVldWUgdGhhdCBkaXNjYXJkcyBhbGwgZWxlbWVudHMuCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIC8vIGltcGwgbmV2ZXIgdXNlcyBhIHBhcmFtZXRlciBvciByZXR1cm5zIGFueSBub24tbnVsbCB2YWx1ZQorICAgIHByaXZhdGUgc3RhdGljIDxFPiBRdWV1ZTxFPiBkaXNjYXJkaW5nUXVldWUoKSB7CisgICAgICAgIHJldHVybiAoUXVldWUpIERJU0NBUkRJTkdfUVVFVUU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwbGllcyBhIHN1cHBsZW1lbnRhbCBoYXNoIGZ1bmN0aW9uIHRvIGEgZ2l2ZW4gaGFzaCBjb2RlLCB3aGljaCBkZWZlbmRzIGFnYWluc3QgcG9vciBxdWFsaXR5CisgICAgICogaGFzaCBmdW5jdGlvbnMuIFRoaXMgaXMgY3JpdGljYWwgd2hlbiB0aGUgY29uY3VycmVudCBoYXNoIG1hcCB1c2VzIHBvd2VyLW9mLXR3byBsZW5ndGggaGFzaAorICAgICAqIHRhYmxlcywgdGhhdCBvdGhlcndpc2UgZW5jb3VudGVyIGNvbGxpc2lvbnMgZm9yIGhhc2ggY29kZXMgdGhhdCBkbyBub3QgZGlmZmVyIGluIGxvd2VyIG9yCisgICAgICogdXBwZXIgYml0cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBoIGhhc2ggY29kZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludCByZWhhc2goaW50IGgpIHsKKyAgICAgICAgLy8gU3ByZWFkIGJpdHMgdG8gcmVndWxhcml6ZSBib3RoIHNlZ21lbnQgYW5kIGluZGV4IGxvY2F0aW9ucywKKyAgICAgICAgLy8gdXNpbmcgdmFyaWFudCBvZiBzaW5nbGUtd29yZCBXYW5nL0plbmtpbnMgaGFzaC4KKyAgICAgICAgLy8gVE9ETyhrZXZpbmIpOiB1c2UgSGFzaGluZy9tb3ZlIHRoaXMgdG8gSGFzaGluZz8KKyAgICAgICAgaCArPSAoaCA8PCAxNSkgXiAweGZmZmZjZDdkOworICAgICAgICBoIF49IChoID4+PiAxMCk7CisgICAgICAgIGggKz0gKGggPDwgMyk7CisgICAgICAgIGggXj0gKGggPj4+IDYpOworICAgICAgICBoICs9IChoIDw8IDIpICsgKGggPDwgMTQpOworICAgICAgICByZXR1cm4gaCBeIChoID4+PiAxNik7CisgICAgfQorCisgICAgLy8gR3VhcmRlZCBCeSBTZWdtZW50LnRoaXMKKyAgICBwcml2YXRlIHN0YXRpYyA8SywgVj4gdm9pZCBjb25uZWN0QWNjZXNzT3JkZXIoUmVmZXJlbmNlRW50cnk8SywgVj4gcHJldmlvdXMsIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5leHQpIHsKKyAgICAgICAgcHJldmlvdXMuc2V0TmV4dEluQWNjZXNzUXVldWUobmV4dCk7CisgICAgICAgIG5leHQuc2V0UHJldmlvdXNJbkFjY2Vzc1F1ZXVlKHByZXZpb3VzKTsKKyAgICB9CisKKyAgICAvLyBHdWFyZGVkIEJ5IFNlZ21lbnQudGhpcworICAgIHByaXZhdGUgc3RhdGljIDxLLCBWPiB2b2lkIG51bGxpZnlBY2Nlc3NPcmRlcihSZWZlcmVuY2VFbnRyeTxLLCBWPiBudWxsZWQpIHsKKyAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gbnVsbEVudHJ5ID0gbnVsbEVudHJ5KCk7CisgICAgICAgIG51bGxlZC5zZXROZXh0SW5BY2Nlc3NRdWV1ZShudWxsRW50cnkpOworICAgICAgICBudWxsZWQuc2V0UHJldmlvdXNJbkFjY2Vzc1F1ZXVlKG51bGxFbnRyeSk7CisgICAgfQorCisgICAgLy8gR3VhcmRlZCBCeSBTZWdtZW50LnRoaXMKKyAgICBwcml2YXRlIHN0YXRpYyA8SywgVj4gdm9pZCBjb25uZWN0V3JpdGVPcmRlcihSZWZlcmVuY2VFbnRyeTxLLCBWPiBwcmV2aW91cywgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV4dCkgeworICAgICAgICBwcmV2aW91cy5zZXROZXh0SW5Xcml0ZVF1ZXVlKG5leHQpOworICAgICAgICBuZXh0LnNldFByZXZpb3VzSW5Xcml0ZVF1ZXVlKHByZXZpb3VzKTsKKyAgICB9CisKKyAgICAvLyBHdWFyZGVkIEJ5IFNlZ21lbnQudGhpcworICAgIHByaXZhdGUgc3RhdGljIDxLLCBWPiB2b2lkIG51bGxpZnlXcml0ZU9yZGVyKFJlZmVyZW5jZUVudHJ5PEssIFY+IG51bGxlZCkgeworICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBudWxsRW50cnkgPSBudWxsRW50cnkoKTsKKyAgICAgICAgbnVsbGVkLnNldE5leHRJbldyaXRlUXVldWUobnVsbEVudHJ5KTsKKyAgICAgICAgbnVsbGVkLnNldFByZXZpb3VzSW5Xcml0ZVF1ZXVlKG51bGxFbnRyeSk7CisgICAgfQorCisgICAgYm9vbGVhbiBldmljdHNCeVNpemUoKSB7CisgICAgICAgIHJldHVybiBtYXhXZWlnaHQgPj0gMDsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gZXhwaXJlc0FmdGVyV3JpdGUoKSB7CisgICAgICAgIHJldHVybiBleHBpcmVBZnRlcldyaXRlTmFub3MgPiAwOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBleHBpcmVzQWZ0ZXJBY2Nlc3MoKSB7CisgICAgICAgIHJldHVybiBleHBpcmVBZnRlckFjY2Vzc05hbm9zID4gMDsKKyAgICB9CisKKyAgICBib29sZWFuIHJlZnJlc2hlcygpIHsKKyAgICAgICAgcmV0dXJuIHJlZnJlc2hOYW5vcyA+IDA7CisgICAgfQorCisgICAgYm9vbGVhbiB1c2VzQWNjZXNzUXVldWUoKSB7CisgICAgICAgIHJldHVybiBleHBpcmVzQWZ0ZXJBY2Nlc3MoKSB8fCBldmljdHNCeVNpemUoKTsKKyAgICB9CisKKyAgICBib29sZWFuIHVzZXNXcml0ZVF1ZXVlKCkgeworICAgICAgICByZXR1cm4gZXhwaXJlc0FmdGVyV3JpdGUoKTsKKyAgICB9CisKKyAgICBib29sZWFuIHJlY29yZHNXcml0ZSgpIHsKKyAgICAgICAgcmV0dXJuIGV4cGlyZXNBZnRlcldyaXRlKCkgfHwgcmVmcmVzaGVzKCk7CisgICAgfQorCisgICAgYm9vbGVhbiByZWNvcmRzQWNjZXNzKCkgeworICAgICAgICByZXR1cm4gZXhwaXJlc0FmdGVyQWNjZXNzKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHJlY29yZHNUaW1lKCkgeworICAgICAgICByZXR1cm4gcmVjb3Jkc1dyaXRlKCkgfHwgcmVjb3Jkc0FjY2VzcygpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiB1c2VzV3JpdGVFbnRyaWVzKCkgeworICAgICAgICByZXR1cm4gdXNlc1dyaXRlUXVldWUoKSB8fCByZWNvcmRzV3JpdGUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gdXNlc0FjY2Vzc0VudHJpZXMoKSB7CisgICAgICAgIHJldHVybiB1c2VzQWNjZXNzUXVldWUoKSB8fCByZWNvcmRzQWNjZXNzKCk7CisgICAgfQorCisgIC8qCisgICAqIE5vdGU6IEFsbCBvZiB0aGlzIGR1cGxpY2F0ZSBjb2RlIHN1Y2tzLCBidXQgaXQgc2F2ZXMgYSBsb3Qgb2YgbWVtb3J5LiBJZiBvbmx5IEphdmEgaGFkIG1peGlucyEKKyAgICogVG8gbWFpbnRhaW4gdGhpcyBjb2RlLCBtYWtlIGEgY2hhbmdlIGZvciB0aGUgc3Ryb25nIHJlZmVyZW5jZSB0eXBlLiBUaGVuLCBjdXQgYW5kIHBhc3RlLCBhbmQKKyAgICogcmVwbGFjZSAiU3Ryb25nIiB3aXRoICJTb2Z0IiBvciAiV2VhayIgd2l0aGluIHRoZSBwYXN0ZWQgdGV4dC4gVGhlIHByaW1hcnkgZGlmZmVyZW5jZSBpcyB0aGF0CisgICAqIHN0cm9uZyBlbnRyaWVzIHN0b3JlIHRoZSBrZXkgcmVmZXJlbmNlIGRpcmVjdGx5IHdoaWxlIHNvZnQgYW5kIHdlYWsgZW50cmllcyBkZWxlZ2F0ZSB0byB0aGVpcgorICAgKiByZXNwZWN0aXZlIHN1cGVyY2xhc3Nlcy4KKyAgICovCisKKyAgICBib29sZWFuIHVzZXNLZXlSZWZlcmVuY2VzKCkgeworICAgICAgICByZXR1cm4ga2V5U3RyZW5ndGggIT0gU3RyZW5ndGguU1RST05HOworICAgIH0KKworICAgIGJvb2xlYW4gdXNlc1ZhbHVlUmVmZXJlbmNlcygpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlU3RyZW5ndGggIT0gU3RyZW5ndGguU1RST05HOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGhhc2goT2JqZWN0IGtleSkgeworICAgICAgICBpbnQgaCA9IGtleUVxdWl2YWxlbmNlLmhhc2goa2V5KTsKKyAgICAgICAgcmV0dXJuIHJlaGFzaChoKTsKKyAgICB9CisKKyAgICB2b2lkIHJlY2xhaW1WYWx1ZShWYWx1ZVJlZmVyZW5jZTxLLCBWPiB2YWx1ZVJlZmVyZW5jZSkgeworICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBlbnRyeSA9IHZhbHVlUmVmZXJlbmNlLmdldEVudHJ5KCk7CisgICAgICAgIGludCBoYXNoID0gZW50cnkuZ2V0SGFzaCgpOworICAgICAgICBzZWdtZW50Rm9yKGhhc2gpLnJlY2xhaW1WYWx1ZShlbnRyeS5nZXRLZXkoKSwgaGFzaCwgdmFsdWVSZWZlcmVuY2UpOworICAgIH0KKworICAgIHZvaWQgcmVjbGFpbUtleShSZWZlcmVuY2VFbnRyeTxLLCBWPiBlbnRyeSkgeworICAgICAgICBpbnQgaGFzaCA9IGVudHJ5LmdldEhhc2goKTsKKyAgICAgICAgc2VnbWVudEZvcihoYXNoKS5yZWNsYWltS2V5KGVudHJ5LCBoYXNoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzZWdtZW50IHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIGEga2V5IHdpdGggdGhlIGdpdmVuIGhhc2guCisgICAgICoKKyAgICAgKiBAcGFyYW0gaGFzaCB0aGUgaGFzaCBjb2RlIGZvciB0aGUga2V5CisgICAgICogQHJldHVybiB0aGUgc2VnbWVudAorICAgICAqLworICAgIHByaXZhdGUgU2VnbWVudDxLLCBWPiBzZWdtZW50Rm9yKGludCBoYXNoKSB7CisgICAgICAgIC8vIFRPRE8oZnJ5KTogTGF6aWx5IGNyZWF0ZSBzZWdtZW50cz8KKyAgICAgICAgcmV0dXJuIHNlZ21lbnRzWyhoYXNoID4+PiBzZWdtZW50U2hpZnQpICYgc2VnbWVudE1hc2tdOworICAgIH0KKworICAgIHByaXZhdGUgU2VnbWVudDxLLCBWPiBjcmVhdGVTZWdtZW50KAorICAgICAgICAgICAgaW50IGluaXRpYWxDYXBhY2l0eSwgbG9uZyBtYXhTZWdtZW50V2VpZ2h0KSB7CisgICAgICAgIHJldHVybiBuZXcgU2VnbWVudDxLLCBWPih0aGlzLCBpbml0aWFsQ2FwYWNpdHksIG1heFNlZ21lbnRXZWlnaHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIGZyb20gYW4gZW50cnkuIFJldHVybnMgbnVsbCBpZiB0aGUgZW50cnkgaXMgaW52YWxpZCwgcGFydGlhbGx5LWNvbGxlY3RlZCwKKyAgICAgKiBsb2FkaW5nLCBvciBleHBpcmVkLiBVbmxpa2Uge0BsaW5rIFNlZ21lbnQjZ2V0TGl2ZVZhbHVlfSB0aGlzIG1ldGhvZCBkb2VzIG5vdCBhdHRlbXB0IHRvCisgICAgICogY2xlYW51cCBzdGFsZSBlbnRyaWVzLiBBcyBzdWNoIGl0IHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvdXRzaWRlIG9mIGEgc2VnbWVudCBjb250ZXh0LCBzdWNoIGFzCisgICAgICogZHVyaW5nIGl0ZXJhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFYgZ2V0TGl2ZVZhbHVlKFJlZmVyZW5jZUVudHJ5PEssIFY+IGVudHJ5LCBsb25nIG5vdykgeworICAgICAgICBpZiAoZW50cnkuZ2V0S2V5KCkgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgViB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlUmVmZXJlbmNlKCkuZ2V0KCk7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc0V4cGlyZWQoZW50cnksIG5vdykpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVudHJ5IGhhcyBleHBpcmVkLgorICAgICAqLworICAgIGJvb2xlYW4gaXNFeHBpcmVkKFJlZmVyZW5jZUVudHJ5PEssIFY+IGVudHJ5LCBsb25nIG5vdykgeworICAgICAgICBjaGVja05vdE51bGwoZW50cnkpOworICAgICAgICBpZiAoZXhwaXJlc0FmdGVyQWNjZXNzKCkKKyAgICAgICAgICAgICAgICAmJiAobm93IC0gZW50cnkuZ2V0QWNjZXNzVGltZSgpID49IGV4cGlyZUFmdGVyQWNjZXNzTmFub3MpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXhwaXJlc0FmdGVyV3JpdGUoKQorICAgICAgICAgICAgICAgICYmIChub3cgLSBlbnRyeS5nZXRXcml0ZVRpbWUoKSA+PSBleHBpcmVBZnRlcldyaXRlTmFub3MpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHJpdmF0ZSBTZWdtZW50PEssIFY+W10gbmV3U2VnbWVudEFycmF5KGludCBzc2l6ZSkgeworICAgICAgICByZXR1cm4gbmV3IFNlZ21lbnRbc3NpemVdOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgLyoKKyAgICAgKiBTdW0gcGVyLXNlZ21lbnQgbW9kQ291bnRzIHRvIGF2b2lkIG1pcy1yZXBvcnRpbmcgd2hlbiBlbGVtZW50cyBhcmUgY29uY3VycmVudGx5IGFkZGVkIGFuZAorICAgICAqIHJlbW92ZWQgaW4gb25lIHNlZ21lbnQgd2hpbGUgY2hlY2tpbmcgYW5vdGhlciwgaW4gd2hpY2ggY2FzZSB0aGUgdGFibGUgd2FzIG5ldmVyIGFjdHVhbGx5CisgICAgICogZW1wdHkgYXQgYW55IHBvaW50LiAoVGhlIHN1bSBlbnN1cmVzIGFjY3VyYWN5IHVwIHRocm91Z2ggYXQgbGVhc3QgMTw8MzEgcGVyLXNlZ21lbnQKKyAgICAgKiBtb2RpZmljYXRpb25zIGJlZm9yZSByZWNoZWNrLikgIE1ldGhvZCBjb250YWluc1ZhbHVlKCkgdXNlcyBzaW1pbGFyIGNvbnN0cnVjdGlvbnMgZm9yCisgICAgICogc3RhYmlsaXR5IGNoZWNrcy4KKyAgICAgKi8KKyAgICAgICAgbG9uZyBzdW0gPSAwTDsKKyAgICAgICAgU2VnbWVudDxLLCBWPltdIHNlZ21lbnRzID0gdGhpcy5zZWdtZW50czsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgaWYgKHNlZ21lbnRzW2ldLmNvdW50ICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdW0gKz0gc2VnbWVudHNbaV0ubW9kQ291bnQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3VtICE9IDBMKSB7IC8vIHJlY2hlY2sgdW5sZXNzIG5vIG1vZGlmaWNhdGlvbnMKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2VnbWVudHNbaV0uY291bnQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN1bSAtPSBzZWdtZW50c1tpXS5tb2RDb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdW0gIT0gMEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBsb25nIGxvbmdTaXplKCkgeworICAgICAgICBTZWdtZW50PEssIFY+W10gc2VnbWVudHMgPSB0aGlzLnNlZ21lbnRzOworICAgICAgICBsb25nIHN1bSA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIHN1bSArPSBzZWdtZW50c1tpXS5jb3VudDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VtOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIEludHMuc2F0dXJhdGVkQ2FzdChsb25nU2l6ZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgViBnZXQoT2JqZWN0IGtleSkgeworICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGludCBoYXNoID0gaGFzaChrZXkpOworICAgICAgICByZXR1cm4gc2VnbWVudEZvcihoYXNoKS5nZXQoa2V5LCBoYXNoKTsKKyAgICB9CisKKyAgICBWIGdldElmUHJlc2VudChPYmplY3Qga2V5KSB7CisgICAgICAgIGludCBoYXNoID0gaGFzaChjaGVja05vdE51bGwoa2V5KSk7CisgICAgICAgIHJldHVybiBzZWdtZW50Rm9yKGhhc2gpLmdldChrZXksIGhhc2gpOworICAgIH0KKworICAgIHByaXZhdGUgViBnZXQoSyBrZXksIENhY2hlTG9hZGVyPD8gc3VwZXIgSywgVj4gbG9hZGVyKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IGhhc2ggPSBoYXNoKGNoZWNrTm90TnVsbChrZXkpKTsKKyAgICAgICAgcmV0dXJuIHNlZ21lbnRGb3IoaGFzaCkuZ2V0KGtleSwgaGFzaCwgbG9hZGVyKTsKKyAgICB9CisKKyAgICBWIGdldE9yTG9hZChLIGtleSkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBnZXQoa2V5LCBkZWZhdWx0TG9hZGVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShPYmplY3Qga2V5KSB7CisgICAgICAgIC8vIGRvZXMgbm90IGltcGFjdCByZWNlbmN5IG9yZGVyaW5nCisgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGludCBoYXNoID0gaGFzaChrZXkpOworICAgICAgICByZXR1cm4gc2VnbWVudEZvcihoYXNoKS5jb250YWluc0tleShrZXksIGhhc2gpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmFsdWUoT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIC8vIGRvZXMgbm90IGltcGFjdCByZWNlbmN5IG9yZGVyaW5nCisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGlzIGltcGxlbWVudGF0aW9uIGlzIHBhdHRlcm5lZCBhZnRlciBDb25jdXJyZW50SGFzaE1hcCwgYnV0IHdpdGhvdXQgdGhlIGxvY2tpbmcuIFRoZSBvbmx5CisgICAgICAgIC8vIHdheSBmb3IgaXQgdG8gcmV0dXJuIGEgZmFsc2UgbmVnYXRpdmUgd291bGQgYmUgZm9yIHRoZSB0YXJnZXQgdmFsdWUgdG8ganVtcCBhcm91bmQgaW4gdGhlIG1hcAorICAgICAgICAvLyBzdWNoIHRoYXQgbm9uZSBvZiB0aGUgc3Vic2VxdWVudCBpdGVyYXRpb25zIG9ic2VydmVkIGl0LCBkZXNwaXRlIHRoZSBmYWN0IHRoYXQgYXQgZXZlcnkgcG9pbnQKKyAgICAgICAgLy8gaW4gdGltZSBpdCB3YXMgcHJlc2VudCBzb21ld2hlcmUgaW50IHRoZSBtYXAuIFRoaXMgYmVjb21lcyBpbmNyZWFzaW5nbHkgdW5saWtlbHkgYXMKKyAgICAgICAgLy8gQ09OVEFJTlNfVkFMVUVfUkVUUklFUyBpbmNyZWFzZXMsIHRob3VnaCB3aXRob3V0IGxvY2tpbmcgaXQgaXMgdGhlb3JldGljYWxseSBwb3NzaWJsZS4KKyAgICAgICAgbG9uZyBub3cgPSB0aWNrZXIucmVhZCgpOworICAgICAgICBmaW5hbCBTZWdtZW50PEssIFY+W10gc2VnbWVudHMgPSB0aGlzLnNlZ21lbnRzOworICAgICAgICBsb25nIGxhc3QgPSAtMUw7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQ09OVEFJTlNfVkFMVUVfUkVUUklFUzsgaSsrKSB7CisgICAgICAgICAgICBsb25nIHN1bSA9IDBMOworICAgICAgICAgICAgZm9yIChTZWdtZW50PEssIFY+IHNlZ21lbnQgOiBzZWdtZW50cykgeworICAgICAgICAgICAgICAgIC8vIGVuc3VyZSB2aXNpYmlsaXR5IG9mIG1vc3QgcmVjZW50IGNvbXBsZXRlZCB3cml0ZQorICAgICAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24iLCAidW51c2VkIn0pCisgICAgICAgICAgICAgICAgaW50IGMgPSBzZWdtZW50LmNvdW50OyAvLyByZWFkLXZvbGF0aWxlCisKKyAgICAgICAgICAgICAgICBBdG9taWNSZWZlcmVuY2VBcnJheTxSZWZlcmVuY2VFbnRyeTxLLCBWPj4gdGFibGUgPSBzZWdtZW50LnRhYmxlOworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdGFibGUubGVuZ3RoKCk7IGorKykgeworICAgICAgICAgICAgICAgICAgICBmb3IgKFJlZmVyZW5jZUVudHJ5PEssIFY+IGUgPSB0YWJsZS5nZXQoaik7IGUgIT0gbnVsbDsgZSA9IGUuZ2V0TmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBWIHYgPSBzZWdtZW50LmdldExpdmVWYWx1ZShlLCBub3cpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgIT0gbnVsbCAmJiB2YWx1ZUVxdWl2YWxlbmNlLmVxdWl2YWxlbnQodmFsdWUsIHYpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3VtICs9IHNlZ21lbnQubW9kQ291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3VtID09IGxhc3QpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxhc3QgPSBzdW07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBWIHB1dChLIGtleSwgViB2YWx1ZSkgeworICAgICAgICBjaGVja05vdE51bGwoa2V5KTsKKyAgICAgICAgY2hlY2tOb3ROdWxsKHZhbHVlKTsKKyAgICAgICAgaW50IGhhc2ggPSBoYXNoKGtleSk7CisgICAgICAgIHJldHVybiBzZWdtZW50Rm9yKGhhc2gpLnB1dChrZXksIGhhc2gsIHZhbHVlLCBmYWxzZSk7CisgICAgfQorCisgICAgLy8gZXhwaXJhdGlvbgorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFYgcHV0SWZBYnNlbnQoSyBrZXksIFYgdmFsdWUpIHsKKyAgICAgICAgY2hlY2tOb3ROdWxsKGtleSk7CisgICAgICAgIGNoZWNrTm90TnVsbCh2YWx1ZSk7CisgICAgICAgIGludCBoYXNoID0gaGFzaChrZXkpOworICAgICAgICByZXR1cm4gc2VnbWVudEZvcihoYXNoKS5wdXQoa2V5LCBoYXNoLCB2YWx1ZSwgdHJ1ZSk7CisgICAgfQorCisgICAgLy8gcXVldWVzCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwdXRBbGwoTWFwPD8gZXh0ZW5kcyBLLCA/IGV4dGVuZHMgVj4gbSkgeworICAgICAgICBmb3IgKEVudHJ5PD8gZXh0ZW5kcyBLLCA/IGV4dGVuZHMgVj4gZSA6IG0uZW50cnlTZXQoKSkgeworICAgICAgICAgICAgcHV0KGUuZ2V0S2V5KCksIGUuZ2V0VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgViByZW1vdmUoT2JqZWN0IGtleSkgeworICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGludCBoYXNoID0gaGFzaChrZXkpOworICAgICAgICByZXR1cm4gc2VnbWVudEZvcihoYXNoKS5yZW1vdmUoa2V5LCBoYXNoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIGlmIChrZXkgPT0gbnVsbCB8fCB2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaW50IGhhc2ggPSBoYXNoKGtleSk7CisgICAgICAgIHJldHVybiBzZWdtZW50Rm9yKGhhc2gpLnJlbW92ZShrZXksIGhhc2gsIHZhbHVlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiByZXBsYWNlKEsga2V5LCBWIG9sZFZhbHVlLCBWIG5ld1ZhbHVlKSB7CisgICAgICAgIGNoZWNrTm90TnVsbChrZXkpOworICAgICAgICBjaGVja05vdE51bGwobmV3VmFsdWUpOworICAgICAgICBpZiAob2xkVmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGludCBoYXNoID0gaGFzaChrZXkpOworICAgICAgICByZXR1cm4gc2VnbWVudEZvcihoYXNoKS5yZXBsYWNlKGtleSwgaGFzaCwgb2xkVmFsdWUsIG5ld1ZhbHVlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgViByZXBsYWNlKEsga2V5LCBWIHZhbHVlKSB7CisgICAgICAgIGNoZWNrTm90TnVsbChrZXkpOworICAgICAgICBjaGVja05vdE51bGwodmFsdWUpOworICAgICAgICBpbnQgaGFzaCA9IGhhc2goa2V5KTsKKyAgICAgICAgcmV0dXJuIHNlZ21lbnRGb3IoaGFzaCkucmVwbGFjZShrZXksIGhhc2gsIHZhbHVlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgZm9yIChTZWdtZW50PEssIFY+IHNlZ21lbnQgOiBzZWdtZW50cykgeworICAgICAgICAgICAgc2VnbWVudC5jbGVhcigpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gSW5uZXIgQ2xhc3NlcworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxLPiBrZXlTZXQoKSB7CisgICAgICAgIC8vIGRvZXMgbm90IGltcGFjdCByZWNlbmN5IG9yZGVyaW5nCisgICAgICAgIFNldDxLPiBrcyA9IGtleVNldDsKKyAgICAgICAgcmV0dXJuIChrcyAhPSBudWxsKSA/IGtzIDogKGtleVNldCA9IG5ldyBLZXlTZXQodGhpcykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb2xsZWN0aW9uPFY+IHZhbHVlcygpIHsKKyAgICAgICAgLy8gZG9lcyBub3QgaW1wYWN0IHJlY2VuY3kgb3JkZXJpbmcKKyAgICAgICAgQ29sbGVjdGlvbjxWPiB2cyA9IHZhbHVlczsKKyAgICAgICAgcmV0dXJuICh2cyAhPSBudWxsKSA/IHZzIDogKHZhbHVlcyA9IG5ldyBWYWx1ZXModGhpcykpOworICAgIH0KKworICAgIC8vIFF1ZXVlcworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxFbnRyeTxLLCBWPj4gZW50cnlTZXQoKSB7CisgICAgICAgIC8vIGRvZXMgbm90IGltcGFjdCByZWNlbmN5IG9yZGVyaW5nCisgICAgICAgIFNldDxFbnRyeTxLLCBWPj4gZXMgPSBlbnRyeVNldDsKKyAgICAgICAgcmV0dXJuIChlcyAhPSBudWxsKSA/IGVzIDogKGVudHJ5U2V0ID0gbmV3IEVudHJ5U2V0KHRoaXMpKTsKKyAgICB9CisKKyAgICBlbnVtIFN0cmVuZ3RoIHsKKyAgICAvKgorICAgICAqIFRPRE8oa2V2aW5iKTogSWYgd2Ugc3Ryb25nbHkgcmVmZXJlbmNlIHRoZSB2YWx1ZSBhbmQgYXJlbid0IGxvYWRpbmcsIHdlIG5lZWRuJ3Qgd3JhcCB0aGUKKyAgICAgKiB2YWx1ZS4gVGhpcyBjb3VsZCBzYXZlIH44IGJ5dGVzIHBlciBlbnRyeS4KKyAgICAgKi8KKworICAgICAgICBTVFJPTkcgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICA8SywgVj4gVmFsdWVSZWZlcmVuY2U8SywgVj4gcmVmZXJlbmNlVmFsdWUoCisgICAgICAgICAgICAgICAgICAgIFNlZ21lbnQ8SywgVj4gc2VnbWVudCwgUmVmZXJlbmNlRW50cnk8SywgVj4gZW50cnksIFYgdmFsdWUsIGludCB3ZWlnaHQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKHdlaWdodCA9PSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXcgU3Ryb25nVmFsdWVSZWZlcmVuY2U8SywgVj4odmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBXZWlnaHRlZFN0cm9uZ1ZhbHVlUmVmZXJlbmNlPEssIFY+KHZhbHVlLCB3ZWlnaHQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIEVxdWl2YWxlbmNlPE9iamVjdD4gZGVmYXVsdEVxdWl2YWxlbmNlKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBFcXVpdmFsZW5jZS5lcXVhbHMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKworICAgICAgICBXRUFLIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgPEssIFY+IFZhbHVlUmVmZXJlbmNlPEssIFY+IHJlZmVyZW5jZVZhbHVlKAorICAgICAgICAgICAgICAgICAgICBTZWdtZW50PEssIFY+IHNlZ21lbnQsIFJlZmVyZW5jZUVudHJ5PEssIFY+IGVudHJ5LCBWIHZhbHVlLCBpbnQgd2VpZ2h0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICh3ZWlnaHQgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IFdlYWtWYWx1ZVJlZmVyZW5jZTxLLCBWPihzZWdtZW50LnZhbHVlUmVmZXJlbmNlUXVldWUsIHZhbHVlLCBlbnRyeSkKKyAgICAgICAgICAgICAgICAgICAgICAgIDogbmV3IFdlaWdodGVkV2Vha1ZhbHVlUmVmZXJlbmNlPEssIFY+KAorICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudC52YWx1ZVJlZmVyZW5jZVF1ZXVlLCB2YWx1ZSwgZW50cnksIHdlaWdodCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgRXF1aXZhbGVuY2U8T2JqZWN0PiBkZWZhdWx0RXF1aXZhbGVuY2UoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVxdWl2YWxlbmNlLmlkZW50aXR5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSByZWZlcmVuY2UgZm9yIHRoZSBnaXZlbiB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhpcyB2YWx1ZSBzdHJlbmd0aC4KKyAgICAgICAgICovCisgICAgICAgIGFic3RyYWN0IDxLLCBWPiBWYWx1ZVJlZmVyZW5jZTxLLCBWPiByZWZlcmVuY2VWYWx1ZSgKKyAgICAgICAgICAgICAgICBTZWdtZW50PEssIFY+IHNlZ21lbnQsIFJlZmVyZW5jZUVudHJ5PEssIFY+IGVudHJ5LCBWIHZhbHVlLCBpbnQgd2VpZ2h0KTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCBlcXVpdmFsZW5jZSBzdHJhdGVneSB1c2VkIHRvIGNvbXBhcmUgYW5kIGhhc2gga2V5cyBvciB2YWx1ZXMgcmVmZXJlbmNlZAorICAgICAgICAgKiBhdCB0aGlzIHN0cmVuZ3RoLiBUaGlzIHN0cmF0ZWd5IHdpbGwgYmUgdXNlZCB1bmxlc3MgdGhlIHVzZXIgZXhwbGljaXRseSBzcGVjaWZpZXMgYW4KKyAgICAgICAgICogYWx0ZXJuYXRlIHN0cmF0ZWd5LgorICAgICAgICAgKi8KKyAgICAgICAgYWJzdHJhY3QgRXF1aXZhbGVuY2U8T2JqZWN0PiBkZWZhdWx0RXF1aXZhbGVuY2UoKTsKKyAgICB9CisKKyAgICAvLyBDYWNoZSBzdXBwb3J0CisKKyAgICAvLyBDb25jdXJyZW50TWFwIG1ldGhvZHMKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgbmV3IGVudHJpZXMuCisgICAgICovCisgICAgZW51bSBFbnRyeUZhY3RvcnkgeworICAgICAgICBTVFJPTkcgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICA8SywgVj4gUmVmZXJlbmNlRW50cnk8SywgVj4gbmV3RW50cnkoCisgICAgICAgICAgICAgICAgICAgIFNlZ21lbnQ8SywgVj4gc2VnbWVudCwgSyBrZXksIGludCBoYXNoLCBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXh0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJvbmdFbnRyeTxLLCBWPihrZXksIGhhc2gsIG5leHQpOworICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBTVFJPTkdfQUNDRVNTIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgPEssIFY+IFJlZmVyZW5jZUVudHJ5PEssIFY+IG5ld0VudHJ5KAorICAgICAgICAgICAgICAgICAgICBTZWdtZW50PEssIFY+IHNlZ21lbnQsIEsga2V5LCBpbnQgaGFzaCwgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV4dCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3Ryb25nQWNjZXNzRW50cnk8SywgVj4oa2V5LCBoYXNoLCBuZXh0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICA8SywgVj4gUmVmZXJlbmNlRW50cnk8SywgVj4gY29weUVudHJ5KAorICAgICAgICAgICAgICAgICAgICBTZWdtZW50PEssIFY+IHNlZ21lbnQsIFJlZmVyZW5jZUVudHJ5PEssIFY+IG9yaWdpbmFsLCBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXdOZXh0KSB7CisgICAgICAgICAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV3RW50cnkgPSBzdXBlci5jb3B5RW50cnkoc2VnbWVudCwgb3JpZ2luYWwsIG5ld05leHQpOworICAgICAgICAgICAgICAgIGNvcHlBY2Nlc3NFbnRyeShvcmlnaW5hbCwgbmV3RW50cnkpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXdFbnRyeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgU1RST05HX1dSSVRFIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgPEssIFY+IFJlZmVyZW5jZUVudHJ5PEssIFY+IG5ld0VudHJ5KAorICAgICAgICAgICAgICAgICAgICBTZWdtZW50PEssIFY+IHNlZ21lbnQsIEsga2V5LCBpbnQgaGFzaCwgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV4dCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3Ryb25nV3JpdGVFbnRyeTxLLCBWPihrZXksIGhhc2gsIG5leHQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIDxLLCBWPiBSZWZlcmVuY2VFbnRyeTxLLCBWPiBjb3B5RW50cnkoCisgICAgICAgICAgICAgICAgICAgIFNlZ21lbnQ8SywgVj4gc2VnbWVudCwgUmVmZXJlbmNlRW50cnk8SywgVj4gb3JpZ2luYWwsIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5ld05leHQpIHsKKyAgICAgICAgICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXdFbnRyeSA9IHN1cGVyLmNvcHlFbnRyeShzZWdtZW50LCBvcmlnaW5hbCwgbmV3TmV4dCk7CisgICAgICAgICAgICAgICAgY29weVdyaXRlRW50cnkob3JpZ2luYWwsIG5ld0VudHJ5KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3RW50cnk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIFNUUk9OR19BQ0NFU1NfV1JJVEUgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICA8SywgVj4gUmVmZXJlbmNlRW50cnk8SywgVj4gbmV3RW50cnkoCisgICAgICAgICAgICAgICAgICAgIFNlZ21lbnQ8SywgVj4gc2VnbWVudCwgSyBrZXksIGludCBoYXNoLCBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXh0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJvbmdBY2Nlc3NXcml0ZUVudHJ5PEssIFY+KGtleSwgaGFzaCwgbmV4dCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgPEssIFY+IFJlZmVyZW5jZUVudHJ5PEssIFY+IGNvcHlFbnRyeSgKKyAgICAgICAgICAgICAgICAgICAgU2VnbWVudDxLLCBWPiBzZWdtZW50LCBSZWZlcmVuY2VFbnRyeTxLLCBWPiBvcmlnaW5hbCwgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV3TmV4dCkgeworICAgICAgICAgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5ld0VudHJ5ID0gc3VwZXIuY29weUVudHJ5KHNlZ21lbnQsIG9yaWdpbmFsLCBuZXdOZXh0KTsKKyAgICAgICAgICAgICAgICBjb3B5QWNjZXNzRW50cnkob3JpZ2luYWwsIG5ld0VudHJ5KTsKKyAgICAgICAgICAgICAgICBjb3B5V3JpdGVFbnRyeShvcmlnaW5hbCwgbmV3RW50cnkpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXdFbnRyeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKworICAgICAgICBXRUFLIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgPEssIFY+IFJlZmVyZW5jZUVudHJ5PEssIFY+IG5ld0VudHJ5KAorICAgICAgICAgICAgICAgICAgICBTZWdtZW50PEssIFY+IHNlZ21lbnQsIEsga2V5LCBpbnQgaGFzaCwgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV4dCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgV2Vha0VudHJ5PEssIFY+KHNlZ21lbnQua2V5UmVmZXJlbmNlUXVldWUsIGtleSwgaGFzaCwgbmV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIFdFQUtfQUNDRVNTIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgPEssIFY+IFJlZmVyZW5jZUVudHJ5PEssIFY+IG5ld0VudHJ5KAorICAgICAgICAgICAgICAgICAgICBTZWdtZW50PEssIFY+IHNlZ21lbnQsIEsga2V5LCBpbnQgaGFzaCwgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV4dCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgV2Vha0FjY2Vzc0VudHJ5PEssIFY+KHNlZ21lbnQua2V5UmVmZXJlbmNlUXVldWUsIGtleSwgaGFzaCwgbmV4dCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgPEssIFY+IFJlZmVyZW5jZUVudHJ5PEssIFY+IGNvcHlFbnRyeSgKKyAgICAgICAgICAgICAgICAgICAgU2VnbWVudDxLLCBWPiBzZWdtZW50LCBSZWZlcmVuY2VFbnRyeTxLLCBWPiBvcmlnaW5hbCwgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV3TmV4dCkgeworICAgICAgICAgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5ld0VudHJ5ID0gc3VwZXIuY29weUVudHJ5KHNlZ21lbnQsIG9yaWdpbmFsLCBuZXdOZXh0KTsKKyAgICAgICAgICAgICAgICBjb3B5QWNjZXNzRW50cnkob3JpZ2luYWwsIG5ld0VudHJ5KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3RW50cnk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIFdFQUtfV1JJVEUgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICA8SywgVj4gUmVmZXJlbmNlRW50cnk8SywgVj4gbmV3RW50cnkoCisgICAgICAgICAgICAgICAgICAgIFNlZ21lbnQ8SywgVj4gc2VnbWVudCwgSyBrZXksIGludCBoYXNoLCBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXh0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXZWFrV3JpdGVFbnRyeTxLLCBWPihzZWdtZW50LmtleVJlZmVyZW5jZVF1ZXVlLCBrZXksIGhhc2gsIG5leHQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIDxLLCBWPiBSZWZlcmVuY2VFbnRyeTxLLCBWPiBjb3B5RW50cnkoCisgICAgICAgICAgICAgICAgICAgIFNlZ21lbnQ8SywgVj4gc2VnbWVudCwgUmVmZXJlbmNlRW50cnk8SywgVj4gb3JpZ2luYWwsIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5ld05leHQpIHsKKyAgICAgICAgICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXdFbnRyeSA9IHN1cGVyLmNvcHlFbnRyeShzZWdtZW50LCBvcmlnaW5hbCwgbmV3TmV4dCk7CisgICAgICAgICAgICAgICAgY29weVdyaXRlRW50cnkob3JpZ2luYWwsIG5ld0VudHJ5KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3RW50cnk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIFdFQUtfQUNDRVNTX1dSSVRFIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgPEssIFY+IFJlZmVyZW5jZUVudHJ5PEssIFY+IG5ld0VudHJ5KAorICAgICAgICAgICAgICAgICAgICBTZWdtZW50PEssIFY+IHNlZ21lbnQsIEsga2V5LCBpbnQgaGFzaCwgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV4dCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgV2Vha0FjY2Vzc1dyaXRlRW50cnk8SywgVj4oc2VnbWVudC5rZXlSZWZlcmVuY2VRdWV1ZSwga2V5LCBoYXNoLCBuZXh0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICA8SywgVj4gUmVmZXJlbmNlRW50cnk8SywgVj4gY29weUVudHJ5KAorICAgICAgICAgICAgICAgICAgICBTZWdtZW50PEssIFY+IHNlZ21lbnQsIFJlZmVyZW5jZUVudHJ5PEssIFY+IG9yaWdpbmFsLCBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXdOZXh0KSB7CisgICAgICAgICAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV3RW50cnkgPSBzdXBlci5jb3B5RW50cnkoc2VnbWVudCwgb3JpZ2luYWwsIG5ld05leHQpOworICAgICAgICAgICAgICAgIGNvcHlBY2Nlc3NFbnRyeShvcmlnaW5hbCwgbmV3RW50cnkpOworICAgICAgICAgICAgICAgIGNvcHlXcml0ZUVudHJ5KG9yaWdpbmFsLCBuZXdFbnRyeSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0VudHJ5OworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBNYXNrcyB1c2VkIHRvIGNvbXB1dGUgaW5kaWNlcyBpbiB0aGUgZm9sbG93aW5nIHRhYmxlLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBBQ0NFU1NfTUFTSyA9IDE7CisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgV1JJVEVfTUFTSyA9IDI7CisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgV0VBS19NQVNLID0gNDsKKworICAgICAgICAvKioKKyAgICAgICAgICogTG9vay11cCB0YWJsZSBmb3IgZmFjdG9yaWVzLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIGZpbmFsIEVudHJ5RmFjdG9yeVtdIGZhY3RvcmllcyA9IHsKKyAgICAgICAgICAgICAgICBTVFJPTkcsIFNUUk9OR19BQ0NFU1MsIFNUUk9OR19XUklURSwgU1RST05HX0FDQ0VTU19XUklURSwKKyAgICAgICAgICAgICAgICBXRUFLLCBXRUFLX0FDQ0VTUywgV0VBS19XUklURSwgV0VBS19BQ0NFU1NfV1JJVEUsCisgICAgICAgIH07CisKKyAgICAgICAgc3RhdGljIEVudHJ5RmFjdG9yeSBnZXRGYWN0b3J5KFN0cmVuZ3RoIGtleVN0cmVuZ3RoLCBib29sZWFuIHVzZXNBY2Nlc3NRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXNlc1dyaXRlUXVldWUpIHsKKyAgICAgICAgICAgIGludCBmbGFncyA9ICgoa2V5U3RyZW5ndGggPT0gU3RyZW5ndGguV0VBSykgPyBXRUFLX01BU0sgOiAwKQorICAgICAgICAgICAgICAgICAgICB8ICh1c2VzQWNjZXNzUXVldWUgPyBBQ0NFU1NfTUFTSyA6IDApCisgICAgICAgICAgICAgICAgICAgIHwgKHVzZXNXcml0ZVF1ZXVlID8gV1JJVEVfTUFTSyA6IDApOworICAgICAgICAgICAgcmV0dXJuIGZhY3Rvcmllc1tmbGFnc107CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBlbnRyeS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHNlZ21lbnQgdG8gY3JlYXRlIHRoZSBlbnRyeSBmb3IKKyAgICAgICAgICogQHBhcmFtIGtleSAgICAgb2YgdGhlIGVudHJ5CisgICAgICAgICAqIEBwYXJhbSBoYXNoICAgIG9mIHRoZSBrZXkKKyAgICAgICAgICogQHBhcmFtIG5leHQgICAgZW50cnkgaW4gdGhlIHNhbWUgYnVja2V0CisgICAgICAgICAqLworICAgICAgICBhYnN0cmFjdCA8SywgVj4gUmVmZXJlbmNlRW50cnk8SywgVj4gbmV3RW50cnkoCisgICAgICAgICAgICAgICAgU2VnbWVudDxLLCBWPiBzZWdtZW50LCBLIGtleSwgaW50IGhhc2gsIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5leHQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb3BpZXMgYW4gZW50cnksIGFzc2lnbmluZyBpdCBhIG5ldyB7QGNvZGUgbmV4dH0gZW50cnkuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBvcmlnaW5hbCB0aGUgZW50cnkgdG8gY29weQorICAgICAgICAgKiBAcGFyYW0gbmV3TmV4dCAgZW50cnkgaW4gdGhlIHNhbWUgYnVja2V0CisgICAgICAgICAqLworICAgICAgICAvLyBHdWFyZGVkIEJ5IFNlZ21lbnQudGhpcworICAgICAgICA8SywgVj4gUmVmZXJlbmNlRW50cnk8SywgVj4gY29weUVudHJ5KAorICAgICAgICAgICAgICAgIFNlZ21lbnQ8SywgVj4gc2VnbWVudCwgUmVmZXJlbmNlRW50cnk8SywgVj4gb3JpZ2luYWwsIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5ld05leHQpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXdFbnRyeShzZWdtZW50LCBvcmlnaW5hbC5nZXRLZXkoKSwgb3JpZ2luYWwuZ2V0SGFzaCgpLCBuZXdOZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEd1YXJkZWQgQnkgU2VnbWVudC50aGlzCisgICAgICAgIDxLLCBWPiB2b2lkIGNvcHlBY2Nlc3NFbnRyeShSZWZlcmVuY2VFbnRyeTxLLCBWPiBvcmlnaW5hbCwgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV3RW50cnkpIHsKKyAgICAgICAgICAgIC8vIFRPRE8oZnJ5KTogd2hlbiB3ZSBsaW5rIHZhbHVlcyBpbnN0ZWFkIG9mIGVudHJpZXMgdGhpcyBtZXRob2QgY2FuIGdvCisgICAgICAgICAgICAvLyBhd2F5LCBhcyBjYW4gY29ubmVjdEFjY2Vzc09yZGVyLCBudWxsaWZ5QWNjZXNzT3JkZXIuCisgICAgICAgICAgICBuZXdFbnRyeS5zZXRBY2Nlc3NUaW1lKG9yaWdpbmFsLmdldEFjY2Vzc1RpbWUoKSk7CisKKyAgICAgICAgICAgIGNvbm5lY3RBY2Nlc3NPcmRlcihvcmlnaW5hbC5nZXRQcmV2aW91c0luQWNjZXNzUXVldWUoKSwgbmV3RW50cnkpOworICAgICAgICAgICAgY29ubmVjdEFjY2Vzc09yZGVyKG5ld0VudHJ5LCBvcmlnaW5hbC5nZXROZXh0SW5BY2Nlc3NRdWV1ZSgpKTsKKworICAgICAgICAgICAgbnVsbGlmeUFjY2Vzc09yZGVyKG9yaWdpbmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEd1YXJkZWQgQnkgU2VnbWVudC50aGlzCisgICAgICAgIDxLLCBWPiB2b2lkIGNvcHlXcml0ZUVudHJ5KFJlZmVyZW5jZUVudHJ5PEssIFY+IG9yaWdpbmFsLCBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXdFbnRyeSkgeworICAgICAgICAgICAgLy8gVE9ETyhmcnkpOiB3aGVuIHdlIGxpbmsgdmFsdWVzIGluc3RlYWQgb2YgZW50cmllcyB0aGlzIG1ldGhvZCBjYW4gZ28KKyAgICAgICAgICAgIC8vIGF3YXksIGFzIGNhbiBjb25uZWN0V3JpdGVPcmRlciwgbnVsbGlmeVdyaXRlT3JkZXIuCisgICAgICAgICAgICBuZXdFbnRyeS5zZXRXcml0ZVRpbWUob3JpZ2luYWwuZ2V0V3JpdGVUaW1lKCkpOworCisgICAgICAgICAgICBjb25uZWN0V3JpdGVPcmRlcihvcmlnaW5hbC5nZXRQcmV2aW91c0luV3JpdGVRdWV1ZSgpLCBuZXdFbnRyeSk7CisgICAgICAgICAgICBjb25uZWN0V3JpdGVPcmRlcihuZXdFbnRyeSwgb3JpZ2luYWwuZ2V0TmV4dEluV3JpdGVRdWV1ZSgpKTsKKworICAgICAgICAgICAgbnVsbGlmeVdyaXRlT3JkZXIob3JpZ2luYWwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBlbnVtIE51bGxFbnRyeSBpbXBsZW1lbnRzIFJlZmVyZW5jZUVudHJ5PE9iamVjdCwgT2JqZWN0PiB7CisgICAgICAgIElOU1RBTkNFOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVmFsdWVSZWZlcmVuY2U8T2JqZWN0LCBPYmplY3Q+IGdldFZhbHVlUmVmZXJlbmNlKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VmFsdWVSZWZlcmVuY2UoVmFsdWVSZWZlcmVuY2U8T2JqZWN0LCBPYmplY3Q+IHZhbHVlUmVmZXJlbmNlKSB7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlZmVyZW5jZUVudHJ5PE9iamVjdCwgT2JqZWN0PiBnZXROZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBnZXRIYXNoKCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRLZXkoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRBY2Nlc3NUaW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0QWNjZXNzVGltZShsb25nIHRpbWUpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVmZXJlbmNlRW50cnk8T2JqZWN0LCBPYmplY3Q+IGdldE5leHRJbkFjY2Vzc1F1ZXVlKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0TmV4dEluQWNjZXNzUXVldWUoUmVmZXJlbmNlRW50cnk8T2JqZWN0LCBPYmplY3Q+IG5leHQpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVmZXJlbmNlRW50cnk8T2JqZWN0LCBPYmplY3Q+IGdldFByZXZpb3VzSW5BY2Nlc3NRdWV1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFByZXZpb3VzSW5BY2Nlc3NRdWV1ZShSZWZlcmVuY2VFbnRyeTxPYmplY3QsIE9iamVjdD4gcHJldmlvdXMpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRXcml0ZVRpbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRXcml0ZVRpbWUobG9uZyB0aW1lKSB7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlZmVyZW5jZUVudHJ5PE9iamVjdCwgT2JqZWN0PiBnZXROZXh0SW5Xcml0ZVF1ZXVlKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0TmV4dEluV3JpdGVRdWV1ZShSZWZlcmVuY2VFbnRyeTxPYmplY3QsIE9iamVjdD4gbmV4dCkgeworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZWZlcmVuY2VFbnRyeTxPYmplY3QsIE9iamVjdD4gZ2V0UHJldmlvdXNJbldyaXRlUXVldWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcmV2aW91c0luV3JpdGVRdWV1ZShSZWZlcmVuY2VFbnRyeTxPYmplY3QsIE9iamVjdD4gcHJldmlvdXMpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgcmVmZXJlbmNlIHRvIGEgdmFsdWUuCisgICAgICovCisgICAgaW50ZXJmYWNlIFZhbHVlUmVmZXJlbmNlPEssIFY+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIHZhbHVlLiBEb2VzIG5vdCBibG9jayBvciB0aHJvdyBleGNlcHRpb25zLgorICAgICAgICAgKi8KKyAgICAgICAgViBnZXQoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogV2FpdHMgZm9yIGEgdmFsdWUgdGhhdCBtYXkgc3RpbGwgYmUgbG9hZGluZy4gVW5saWtlIGdldCgpLCB0aGlzIG1ldGhvZCBjYW4gYmxvY2sgKGluIHRoZQorICAgICAgICAgKiBjYXNlIG9mIEZ1dHVyZVZhbHVlUmVmZXJlbmNlKS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24gaWYgdGhlIGxvYWRpbmcgdGhyZWFkIHRocm93cyBhbiBleGNlcHRpb24KKyAgICAgICAgICogQHRocm93cyBFeGVjdXRpb25FcnJvciAgICAgaWYgdGhlIGxvYWRpbmcgdGhyZWFkIHRocm93cyBhbiBlcnJvcgorICAgICAgICAgKi8KKyAgICAgICAgViB3YWl0Rm9yVmFsdWUoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSB3ZWlnaHQgb2YgdGhpcyBlbnRyeS4gVGhpcyBpcyBhc3N1bWVkIHRvIGJlIHN0YXRpYyBiZXR3ZWVuIGNhbGxzIHRvIHNldFZhbHVlLgorICAgICAgICAgKi8KKyAgICAgICAgaW50IGdldFdlaWdodCgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBlbnRyeSBhc3NvY2lhdGVkIHdpdGggdGhpcyB2YWx1ZSByZWZlcmVuY2UsIG9yIHtAY29kZSBudWxsfSBpZiB0aGlzIHZhbHVlCisgICAgICAgICAqIHJlZmVyZW5jZSBpcyBpbmRlcGVuZGVudCBvZiBhbnkgZW50cnkuCisgICAgICAgICAqLworICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBnZXRFbnRyeSgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgY29weSBvZiB0aGlzIHJlZmVyZW5jZSBmb3IgdGhlIGdpdmVuIGVudHJ5LgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogPHA+e0Bjb2RlIHZhbHVlfSBtYXkgYmUgbnVsbCBvbmx5IGZvciBhIGxvYWRpbmcgcmVmZXJlbmNlLgorICAgICAgICAgKi8KKyAgICAgICAgVmFsdWVSZWZlcmVuY2U8SywgVj4gY29weUZvcigKKyAgICAgICAgICAgICAgICBSZWZlcmVuY2VRdWV1ZTxWPiBxdWV1ZSwgViB2YWx1ZSwgUmVmZXJlbmNlRW50cnk8SywgVj4gZW50cnkpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBOb3RpZmlmeSBwZW5kaW5nIGxvYWRzIHRoYXQgYSBuZXcgdmFsdWUgd2FzIHNldC4gVGhpcyBpcyBvbmx5IHJlbGV2YW50IHRvIGxvYWRpbmcKKyAgICAgICAgICogdmFsdWUgcmVmZXJlbmNlcy4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgbm90aWZ5TmV3VmFsdWUoViBuZXdWYWx1ZSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiBhIG5ldyB2YWx1ZSBpcyBjdXJyZW50bHkgbG9hZGluZywgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIG9yIG5vdCB0aGVyZSBpcyBhbgorICAgICAgICAgKiBleGlzdGluZyB2YWx1ZS4gSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSByZXR1cm4gdmFsdWUgb2YgdGhpcyBtZXRob2QgaXMgY29uc3RhbnQgZm9yIGFueSBnaXZlbgorICAgICAgICAgKiBWYWx1ZVJlZmVyZW5jZSBpbnN0YW5jZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2xlYW4gaXNMb2FkaW5nKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHJlZmVyZW5jZSBjb250YWlucyBhbiBhY3RpdmUgdmFsdWUsIG1lYW5pbmcgb25lIHRoYXQgaXMgc3RpbGwgY29uc2lkZXJlZAorICAgICAgICAgKiBwcmVzZW50IGluIHRoZSBjYWNoZS4gQWN0aXZlIHZhbHVlcyBjb25zaXN0IG9mIGxpdmUgdmFsdWVzLCB3aGljaCBhcmUgcmV0dXJuZWQgYnkgY2FjaGUKKyAgICAgICAgICogbG9va3VwcywgYW5kIGRlYWQgdmFsdWVzLCB3aGljaCBoYXZlIGJlZW4gZXZpY3RlZCBidXQgYXdhaXRpbmcgcmVtb3ZhbC4gTm9uLWFjdGl2ZSB2YWx1ZXMKKyAgICAgICAgICogY29uc2lzdCBzdHJpY3RseSBvZiBsb2FkaW5nIHZhbHVlcywgdGhvdWdoIGR1cmluZyByZWZyZXNoIGEgdmFsdWUgbWF5IGJlIGJvdGggYWN0aXZlIGFuZAorICAgICAgICAgKiBsb2FkaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbGVhbiBpc0FjdGl2ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFuIGVudHJ5IGluIGEgcmVmZXJlbmNlIG1hcC4KKyAgICAgKiA8cD4KKyAgICAgKiBFbnRyaWVzIGluIHRoZSBtYXAgY2FuIGJlIGluIHRoZSBmb2xsb3dpbmcgc3RhdGVzOgorICAgICAqIDxwPgorICAgICAqIFZhbGlkOgorICAgICAqIC0gTGl2ZTogdmFsaWQga2V5L3ZhbHVlIGFyZSBzZXQKKyAgICAgKiAtIExvYWRpbmc6IGxvYWRpbmcgaXMgcGVuZGluZworICAgICAqIDxwPgorICAgICAqIEludmFsaWQ6CisgICAgICogLSBFeHBpcmVkOiB0aW1lIGV4cGlyZWQgKGtleS92YWx1ZSBtYXkgc3RpbGwgYmUgc2V0KQorICAgICAqIC0gQ29sbGVjdGVkOiBrZXkvdmFsdWUgd2FzIHBhcnRpYWxseSBjb2xsZWN0ZWQsIGJ1dCBub3QgeWV0IGNsZWFuZWQgdXAKKyAgICAgKiAtIFVuc2V0OiBtYXJrZWQgYXMgdW5zZXQsIGF3YWl0aW5nIGNsZWFudXAgb3IgcmV1c2UKKyAgICAgKi8KKyAgICBpbnRlcmZhY2UgUmVmZXJlbmNlRW50cnk8SywgVj4geworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgcmVmZXJlbmNlIGZyb20gdGhpcyBlbnRyeS4KKyAgICAgICAgICovCisgICAgICAgIFZhbHVlUmVmZXJlbmNlPEssIFY+IGdldFZhbHVlUmVmZXJlbmNlKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIHZhbHVlIHJlZmVyZW5jZSBmb3IgdGhpcyBlbnRyeS4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgc2V0VmFsdWVSZWZlcmVuY2UoVmFsdWVSZWZlcmVuY2U8SywgVj4gdmFsdWVSZWZlcmVuY2UpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGVudHJ5IGluIHRoZSBjaGFpbi4KKyAgICAgICAgICovCisgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IGdldE5leHQoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgZW50cnkncyBoYXNoLgorICAgICAgICAgKi8KKyAgICAgICAgaW50IGdldEhhc2goKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUga2V5IGZvciB0aGlzIGVudHJ5LgorICAgICAgICAgKi8KKyAgICAgICAgSyBnZXRLZXkoKTsKKworICAgIC8qCisgICAgICogVXNlZCBieSBlbnRyaWVzIHRoYXQgdXNlIGFjY2VzcyBvcmRlci4gQWNjZXNzIGVudHJpZXMgYXJlIG1haW50YWluZWQgaW4gYSBkb3VibHktbGlua2VkIGxpc3QuCisgICAgICogTmV3IGVudHJpZXMgYXJlIGFkZGVkIGF0IHRoZSB0YWlsIG9mIHRoZSBsaXN0IGF0IHdyaXRlIHRpbWU7IHN0YWxlIGVudHJpZXMgYXJlIGV4cGlyZWQgZnJvbQorICAgICAqIHRoZSBoZWFkIG9mIHRoZSBsaXN0LgorICAgICAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSB0aW1lIHRoYXQgdGhpcyBlbnRyeSB3YXMgbGFzdCBhY2Nlc3NlZCwgaW4gbnMuCisgICAgICAgICAqLworICAgICAgICBsb25nIGdldEFjY2Vzc1RpbWUoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgZW50cnkgYWNjZXNzIHRpbWUgaW4gbnMuCisgICAgICAgICAqLworICAgICAgICB2b2lkIHNldEFjY2Vzc1RpbWUobG9uZyB0aW1lKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgbmV4dCBlbnRyeSBpbiB0aGUgYWNjZXNzIHF1ZXVlLgorICAgICAgICAgKi8KKyAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gZ2V0TmV4dEluQWNjZXNzUXVldWUoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgbmV4dCBlbnRyeSBpbiB0aGUgYWNjZXNzIHF1ZXVlLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBzZXROZXh0SW5BY2Nlc3NRdWV1ZShSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXh0KTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgcHJldmlvdXMgZW50cnkgaW4gdGhlIGFjY2VzcyBxdWV1ZS4KKyAgICAgICAgICovCisgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IGdldFByZXZpb3VzSW5BY2Nlc3NRdWV1ZSgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSBwcmV2aW91cyBlbnRyeSBpbiB0aGUgYWNjZXNzIHF1ZXVlLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBzZXRQcmV2aW91c0luQWNjZXNzUXVldWUoUmVmZXJlbmNlRW50cnk8SywgVj4gcHJldmlvdXMpOworCisgICAgLyoKKyAgICAgKiBJbXBsZW1lbnRlZCBieSBlbnRyaWVzIHRoYXQgdXNlIHdyaXRlIG9yZGVyLiBXcml0ZSBlbnRyaWVzIGFyZSBtYWludGFpbmVkIGluIGEKKyAgICAgKiBkb3VibHktbGlua2VkIGxpc3QuIE5ldyBlbnRyaWVzIGFyZSBhZGRlZCBhdCB0aGUgdGFpbCBvZiB0aGUgbGlzdCBhdCB3cml0ZSB0aW1lIGFuZCBzdGFsZQorICAgICAqIGVudHJpZXMgYXJlIGV4cGlyZWQgZnJvbSB0aGUgaGVhZCBvZiB0aGUgbGlzdC4KKyAgICAgKi8KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgdGltZSB0aGF0IHRoaXMgZW50cnkgd2FzIGxhc3Qgd3JpdHRlbiwgaW4gbnMuCisgICAgICAgICAqLworICAgICAgICBsb25nIGdldFdyaXRlVGltZSgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSBlbnRyeSB3cml0ZSB0aW1lIGluIG5zLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBzZXRXcml0ZVRpbWUobG9uZyB0aW1lKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgbmV4dCBlbnRyeSBpbiB0aGUgd3JpdGUgcXVldWUuCisgICAgICAgICAqLworICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBnZXROZXh0SW5Xcml0ZVF1ZXVlKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIG5leHQgZW50cnkgaW4gdGhlIHdyaXRlIHF1ZXVlLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBzZXROZXh0SW5Xcml0ZVF1ZXVlKFJlZmVyZW5jZUVudHJ5PEssIFY+IG5leHQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBwcmV2aW91cyBlbnRyeSBpbiB0aGUgd3JpdGUgcXVldWUuCisgICAgICAgICAqLworICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBnZXRQcmV2aW91c0luV3JpdGVRdWV1ZSgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSBwcmV2aW91cyBlbnRyeSBpbiB0aGUgd3JpdGUgcXVldWUuCisgICAgICAgICAqLworICAgICAgICB2b2lkIHNldFByZXZpb3VzSW5Xcml0ZVF1ZXVlKFJlZmVyZW5jZUVudHJ5PEssIFY+IHByZXZpb3VzKTsKKyAgICB9CisKKyAgICBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgQWJzdHJhY3RSZWZlcmVuY2VFbnRyeTxLLCBWPiBpbXBsZW1lbnRzIFJlZmVyZW5jZUVudHJ5PEssIFY+IHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWYWx1ZVJlZmVyZW5jZTxLLCBWPiBnZXRWYWx1ZVJlZmVyZW5jZSgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlUmVmZXJlbmNlKFZhbHVlUmVmZXJlbmNlPEssIFY+IHZhbHVlUmVmZXJlbmNlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVmZXJlbmNlRW50cnk8SywgVj4gZ2V0TmV4dCgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0SGFzaCgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBLIGdldEtleSgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldEFjY2Vzc1RpbWUoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRBY2Nlc3NUaW1lKGxvbmcgdGltZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlZmVyZW5jZUVudHJ5PEssIFY+IGdldE5leHRJbkFjY2Vzc1F1ZXVlKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0TmV4dEluQWNjZXNzUXVldWUoUmVmZXJlbmNlRW50cnk8SywgVj4gbmV4dCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlZmVyZW5jZUVudHJ5PEssIFY+IGdldFByZXZpb3VzSW5BY2Nlc3NRdWV1ZSgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFByZXZpb3VzSW5BY2Nlc3NRdWV1ZShSZWZlcmVuY2VFbnRyeTxLLCBWPiBwcmV2aW91cykgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0V3JpdGVUaW1lKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0V3JpdGVUaW1lKGxvbmcgdGltZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlZmVyZW5jZUVudHJ5PEssIFY+IGdldE5leHRJbldyaXRlUXVldWUoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXROZXh0SW5Xcml0ZVF1ZXVlKFJlZmVyZW5jZUVudHJ5PEssIFY+IG5leHQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZWZlcmVuY2VFbnRyeTxLLCBWPiBnZXRQcmV2aW91c0luV3JpdGVRdWV1ZSgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFByZXZpb3VzSW5Xcml0ZVF1ZXVlKFJlZmVyZW5jZUVudHJ5PEssIFY+IHByZXZpb3VzKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZWQgZm9yIHN0cm9uZ2x5LXJlZmVyZW5jZWQga2V5cy4KKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgU3Ryb25nRW50cnk8SywgVj4gZXh0ZW5kcyBBYnN0cmFjdFJlZmVyZW5jZUVudHJ5PEssIFY+IHsKKyAgICAgICAgZmluYWwgSyBrZXk7CisgICAgICAgIGZpbmFsIGludCBoYXNoOworICAgICAgICBmaW5hbCBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXh0OworCisgICAgICAgIC8vIFRoZSBjb2RlIGJlbG93IGlzIGV4YWN0bHkgdGhlIHNhbWUgZm9yIGVhY2ggZW50cnkgdHlwZS4KKyAgICAgICAgdm9sYXRpbGUgVmFsdWVSZWZlcmVuY2U8SywgVj4gdmFsdWVSZWZlcmVuY2UgPSB1bnNldCgpOworCisgICAgICAgIFN0cm9uZ0VudHJ5KEsga2V5LCBpbnQgaGFzaCwgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV4dCkgeworICAgICAgICAgICAgdGhpcy5rZXkgPSBrZXk7CisgICAgICAgICAgICB0aGlzLmhhc2ggPSBoYXNoOworICAgICAgICAgICAgdGhpcy5uZXh0ID0gbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSyBnZXRLZXkoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5rZXk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFZhbHVlUmVmZXJlbmNlPEssIFY+IGdldFZhbHVlUmVmZXJlbmNlKCkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlUmVmZXJlbmNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlUmVmZXJlbmNlKFZhbHVlUmVmZXJlbmNlPEssIFY+IHZhbHVlUmVmZXJlbmNlKSB7CisgICAgICAgICAgICB0aGlzLnZhbHVlUmVmZXJlbmNlID0gdmFsdWVSZWZlcmVuY2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBnZXRIYXNoKCkgeworICAgICAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlZmVyZW5jZUVudHJ5PEssIFY+IGdldE5leHQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV4dDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBTdHJvbmdBY2Nlc3NFbnRyeTxLLCBWPiBleHRlbmRzIFN0cm9uZ0VudHJ5PEssIFY+IHsKKyAgICAgICAgdm9sYXRpbGUgbG9uZyBhY2Nlc3NUaW1lID0gTG9uZy5NQVhfVkFMVUU7CisKKyAgICAgICAgLy8gVGhlIGNvZGUgYmVsb3cgaXMgZXhhY3RseSB0aGUgc2FtZSBmb3IgZWFjaCBhY2Nlc3MgZW50cnkgdHlwZS4KKyAgICAgICAgLy8gR3VhcmRlZCBCeSBTZWdtZW50LnRoaXMKKyAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV4dEFjY2VzcyA9IG51bGxFbnRyeSgpOworICAgICAgICAvLyBHdWFyZGVkIEJ5IFNlZ21lbnQudGhpcworICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBwcmV2aW91c0FjY2VzcyA9IG51bGxFbnRyeSgpOworCisgICAgICAgIFN0cm9uZ0FjY2Vzc0VudHJ5KEsga2V5LCBpbnQgaGFzaCwgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV4dCkgeworICAgICAgICAgICAgc3VwZXIoa2V5LCBoYXNoLCBuZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRBY2Nlc3NUaW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIGFjY2Vzc1RpbWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0QWNjZXNzVGltZShsb25nIHRpbWUpIHsKKyAgICAgICAgICAgIHRoaXMuYWNjZXNzVGltZSA9IHRpbWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlZmVyZW5jZUVudHJ5PEssIFY+IGdldE5leHRJbkFjY2Vzc1F1ZXVlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5leHRBY2Nlc3M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0TmV4dEluQWNjZXNzUXVldWUoUmVmZXJlbmNlRW50cnk8SywgVj4gbmV4dCkgeworICAgICAgICAgICAgdGhpcy5uZXh0QWNjZXNzID0gbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVmZXJlbmNlRW50cnk8SywgVj4gZ2V0UHJldmlvdXNJbkFjY2Vzc1F1ZXVlKCkgeworICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzQWNjZXNzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFByZXZpb3VzSW5BY2Nlc3NRdWV1ZShSZWZlcmVuY2VFbnRyeTxLLCBWPiBwcmV2aW91cykgeworICAgICAgICAgICAgdGhpcy5wcmV2aW91c0FjY2VzcyA9IHByZXZpb3VzOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIFN0cm9uZ1dyaXRlRW50cnk8SywgVj4gZXh0ZW5kcyBTdHJvbmdFbnRyeTxLLCBWPiB7CisgICAgICAgIHZvbGF0aWxlIGxvbmcgd3JpdGVUaW1lID0gTG9uZy5NQVhfVkFMVUU7CisKKyAgICAgICAgLy8gVGhlIGNvZGUgYmVsb3cgaXMgZXhhY3RseSB0aGUgc2FtZSBmb3IgZWFjaCB3cml0ZSBlbnRyeSB0eXBlLgorICAgICAgICAvLyBHdWFyZGVkIEJ5IFNlZ21lbnQudGhpcworICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXh0V3JpdGUgPSBudWxsRW50cnkoKTsKKyAgICAgICAgLy8gR3VhcmRlZCBCeSBTZWdtZW50LnRoaXMKKyAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gcHJldmlvdXNXcml0ZSA9IG51bGxFbnRyeSgpOworCisgICAgICAgIFN0cm9uZ1dyaXRlRW50cnkoSyBrZXksIGludCBoYXNoLCBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXh0KSB7CisgICAgICAgICAgICBzdXBlcihrZXksIGhhc2gsIG5leHQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldFdyaXRlVGltZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB3cml0ZVRpbWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0V3JpdGVUaW1lKGxvbmcgdGltZSkgeworICAgICAgICAgICAgdGhpcy53cml0ZVRpbWUgPSB0aW1lOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZWZlcmVuY2VFbnRyeTxLLCBWPiBnZXROZXh0SW5Xcml0ZVF1ZXVlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5leHRXcml0ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXROZXh0SW5Xcml0ZVF1ZXVlKFJlZmVyZW5jZUVudHJ5PEssIFY+IG5leHQpIHsKKyAgICAgICAgICAgIHRoaXMubmV4dFdyaXRlID0gbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVmZXJlbmNlRW50cnk8SywgVj4gZ2V0UHJldmlvdXNJbldyaXRlUXVldWUoKSB7CisgICAgICAgICAgICByZXR1cm4gcHJldmlvdXNXcml0ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcmV2aW91c0luV3JpdGVRdWV1ZShSZWZlcmVuY2VFbnRyeTxLLCBWPiBwcmV2aW91cykgeworICAgICAgICAgICAgdGhpcy5wcmV2aW91c1dyaXRlID0gcHJldmlvdXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgU3Ryb25nQWNjZXNzV3JpdGVFbnRyeTxLLCBWPiBleHRlbmRzIFN0cm9uZ0VudHJ5PEssIFY+IHsKKyAgICAgICAgdm9sYXRpbGUgbG9uZyBhY2Nlc3NUaW1lID0gTG9uZy5NQVhfVkFMVUU7CisKKyAgICAgICAgLy8gVGhlIGNvZGUgYmVsb3cgaXMgZXhhY3RseSB0aGUgc2FtZSBmb3IgZWFjaCBhY2Nlc3MgZW50cnkgdHlwZS4KKyAgICAgICAgLy8gR3VhcmRlZCBCeSBTZWdtZW50LnRoaXMKKyAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV4dEFjY2VzcyA9IG51bGxFbnRyeSgpOworICAgICAgICAvLyBHdWFyZGVkIEJ5IFNlZ21lbnQudGhpcworICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBwcmV2aW91c0FjY2VzcyA9IG51bGxFbnRyeSgpOworICAgICAgICB2b2xhdGlsZSBsb25nIHdyaXRlVGltZSA9IExvbmcuTUFYX1ZBTFVFOworICAgICAgICAvLyBHdWFyZGVkIEJ5IFNlZ21lbnQudGhpcworICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXh0V3JpdGUgPSBudWxsRW50cnkoKTsKKyAgICAgICAgLy8gR3VhcmRlZCBCeSBTZWdtZW50LnRoaXMKKyAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gcHJldmlvdXNXcml0ZSA9IG51bGxFbnRyeSgpOworCisgICAgICAgIFN0cm9uZ0FjY2Vzc1dyaXRlRW50cnkoSyBrZXksIGludCBoYXNoLCBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXh0KSB7CisgICAgICAgICAgICBzdXBlcihrZXksIGhhc2gsIG5leHQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldEFjY2Vzc1RpbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gYWNjZXNzVGltZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRBY2Nlc3NUaW1lKGxvbmcgdGltZSkgeworICAgICAgICAgICAgdGhpcy5hY2Nlc3NUaW1lID0gdGltZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVmZXJlbmNlRW50cnk8SywgVj4gZ2V0TmV4dEluQWNjZXNzUXVldWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV4dEFjY2VzczsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoZSBjb2RlIGJlbG93IGlzIGV4YWN0bHkgdGhlIHNhbWUgZm9yIGVhY2ggd3JpdGUgZW50cnkgdHlwZS4KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0TmV4dEluQWNjZXNzUXVldWUoUmVmZXJlbmNlRW50cnk8SywgVj4gbmV4dCkgeworICAgICAgICAgICAgdGhpcy5uZXh0QWNjZXNzID0gbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVmZXJlbmNlRW50cnk8SywgVj4gZ2V0UHJldmlvdXNJbkFjY2Vzc1F1ZXVlKCkgeworICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzQWNjZXNzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFByZXZpb3VzSW5BY2Nlc3NRdWV1ZShSZWZlcmVuY2VFbnRyeTxLLCBWPiBwcmV2aW91cykgeworICAgICAgICAgICAgdGhpcy5wcmV2aW91c0FjY2VzcyA9IHByZXZpb3VzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldFdyaXRlVGltZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB3cml0ZVRpbWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0V3JpdGVUaW1lKGxvbmcgdGltZSkgeworICAgICAgICAgICAgdGhpcy53cml0ZVRpbWUgPSB0aW1lOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZWZlcmVuY2VFbnRyeTxLLCBWPiBnZXROZXh0SW5Xcml0ZVF1ZXVlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5leHRXcml0ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXROZXh0SW5Xcml0ZVF1ZXVlKFJlZmVyZW5jZUVudHJ5PEssIFY+IG5leHQpIHsKKyAgICAgICAgICAgIHRoaXMubmV4dFdyaXRlID0gbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVmZXJlbmNlRW50cnk8SywgVj4gZ2V0UHJldmlvdXNJbldyaXRlUXVldWUoKSB7CisgICAgICAgICAgICByZXR1cm4gcHJldmlvdXNXcml0ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcmV2aW91c0luV3JpdGVRdWV1ZShSZWZlcmVuY2VFbnRyeTxLLCBWPiBwcmV2aW91cykgeworICAgICAgICAgICAgdGhpcy5wcmV2aW91c1dyaXRlID0gcHJldmlvdXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2VkIGZvciB3ZWFrbHktcmVmZXJlbmNlZCBrZXlzLgorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBXZWFrRW50cnk8SywgVj4gZXh0ZW5kcyBXZWFrUmVmZXJlbmNlPEs+IGltcGxlbWVudHMgUmVmZXJlbmNlRW50cnk8SywgVj4geworICAgICAgICBmaW5hbCBpbnQgaGFzaDsKKyAgICAgICAgZmluYWwgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV4dDsKKworICAgIC8qCisgICAgICogSXQnZCBiZSBuaWNlIHRvIGdldCB0aGVzZSBmb3IgZnJlZSBmcm9tIEFic3RyYWN0UmVmZXJlbmNlRW50cnksIGJ1dCB3ZSdyZSBhbHJlYWR5IGV4dGVuZGluZworICAgICAqIFdlYWtSZWZlcmVuY2U8Sz4uCisgICAgICovCisKKyAgICAgICAgLy8gbnVsbCBhY2Nlc3MKKyAgICAgICAgdm9sYXRpbGUgVmFsdWVSZWZlcmVuY2U8SywgVj4gdmFsdWVSZWZlcmVuY2UgPSB1bnNldCgpOworCisgICAgICAgIFdlYWtFbnRyeShSZWZlcmVuY2VRdWV1ZTxLPiBxdWV1ZSwgSyBrZXksIGludCBoYXNoLCBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXh0KSB7CisgICAgICAgICAgICBzdXBlcihrZXksIHF1ZXVlKTsKKyAgICAgICAgICAgIHRoaXMuaGFzaCA9IGhhc2g7CisgICAgICAgICAgICB0aGlzLm5leHQgPSBuZXh0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBLIGdldEtleSgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRBY2Nlc3NUaW1lKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0QWNjZXNzVGltZShsb25nIHRpbWUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZWZlcmVuY2VFbnRyeTxLLCBWPiBnZXROZXh0SW5BY2Nlc3NRdWV1ZSgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgLy8gbnVsbCB3cml0ZQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXROZXh0SW5BY2Nlc3NRdWV1ZShSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXh0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVmZXJlbmNlRW50cnk8SywgVj4gZ2V0UHJldmlvdXNJbkFjY2Vzc1F1ZXVlKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UHJldmlvdXNJbkFjY2Vzc1F1ZXVlKFJlZmVyZW5jZUVudHJ5PEssIFY+IHByZXZpb3VzKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRXcml0ZVRpbWUoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRXcml0ZVRpbWUobG9uZyB0aW1lKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVmZXJlbmNlRW50cnk8SywgVj4gZ2V0TmV4dEluV3JpdGVRdWV1ZSgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlIGNvZGUgYmVsb3cgaXMgZXhhY3RseSB0aGUgc2FtZSBmb3IgZWFjaCBlbnRyeSB0eXBlLgorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXROZXh0SW5Xcml0ZVF1ZXVlKFJlZmVyZW5jZUVudHJ5PEssIFY+IG5leHQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZWZlcmVuY2VFbnRyeTxLLCBWPiBnZXRQcmV2aW91c0luV3JpdGVRdWV1ZSgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFByZXZpb3VzSW5Xcml0ZVF1ZXVlKFJlZmVyZW5jZUVudHJ5PEssIFY+IHByZXZpb3VzKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVmFsdWVSZWZlcmVuY2U8SywgVj4gZ2V0VmFsdWVSZWZlcmVuY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWVSZWZlcmVuY2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VmFsdWVSZWZlcmVuY2UoVmFsdWVSZWZlcmVuY2U8SywgVj4gdmFsdWVSZWZlcmVuY2UpIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWVSZWZlcmVuY2UgPSB2YWx1ZVJlZmVyZW5jZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGdldEhhc2goKSB7CisgICAgICAgICAgICByZXR1cm4gaGFzaDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVmZXJlbmNlRW50cnk8SywgVj4gZ2V0TmV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXh0OworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIFdlYWtBY2Nlc3NFbnRyeTxLLCBWPiBleHRlbmRzIFdlYWtFbnRyeTxLLCBWPiB7CisgICAgICAgIHZvbGF0aWxlIGxvbmcgYWNjZXNzVGltZSA9IExvbmcuTUFYX1ZBTFVFOworCisgICAgICAgIC8vIFRoZSBjb2RlIGJlbG93IGlzIGV4YWN0bHkgdGhlIHNhbWUgZm9yIGVhY2ggYWNjZXNzIGVudHJ5IHR5cGUuCisgICAgICAgIC8vIEd1YXJkZWQgQnkgU2VnbWVudC50aGlzCisgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5leHRBY2Nlc3MgPSBudWxsRW50cnkoKTsKKyAgICAgICAgLy8gR3VhcmRlZCBCeSBTZWdtZW50LnRoaXMKKyAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gcHJldmlvdXNBY2Nlc3MgPSBudWxsRW50cnkoKTsKKworICAgICAgICBXZWFrQWNjZXNzRW50cnkoCisgICAgICAgICAgICAgICAgUmVmZXJlbmNlUXVldWU8Sz4gcXVldWUsIEsga2V5LCBpbnQgaGFzaCwgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV4dCkgeworICAgICAgICAgICAgc3VwZXIocXVldWUsIGtleSwgaGFzaCwgbmV4dCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0QWNjZXNzVGltZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBhY2Nlc3NUaW1lOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEFjY2Vzc1RpbWUobG9uZyB0aW1lKSB7CisgICAgICAgICAgICB0aGlzLmFjY2Vzc1RpbWUgPSB0aW1lOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZWZlcmVuY2VFbnRyeTxLLCBWPiBnZXROZXh0SW5BY2Nlc3NRdWV1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXh0QWNjZXNzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE5leHRJbkFjY2Vzc1F1ZXVlKFJlZmVyZW5jZUVudHJ5PEssIFY+IG5leHQpIHsKKyAgICAgICAgICAgIHRoaXMubmV4dEFjY2VzcyA9IG5leHQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlZmVyZW5jZUVudHJ5PEssIFY+IGdldFByZXZpb3VzSW5BY2Nlc3NRdWV1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBwcmV2aW91c0FjY2VzczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcmV2aW91c0luQWNjZXNzUXVldWUoUmVmZXJlbmNlRW50cnk8SywgVj4gcHJldmlvdXMpIHsKKyAgICAgICAgICAgIHRoaXMucHJldmlvdXNBY2Nlc3MgPSBwcmV2aW91czsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBXZWFrV3JpdGVFbnRyeTxLLCBWPiBleHRlbmRzIFdlYWtFbnRyeTxLLCBWPiB7CisgICAgICAgIHZvbGF0aWxlIGxvbmcgd3JpdGVUaW1lID0gTG9uZy5NQVhfVkFMVUU7CisKKyAgICAgICAgLy8gVGhlIGNvZGUgYmVsb3cgaXMgZXhhY3RseSB0aGUgc2FtZSBmb3IgZWFjaCB3cml0ZSBlbnRyeSB0eXBlLgorICAgICAgICAvLyBHdWFyZGVkIEJ5IFNlZ21lbnQudGhpcworICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXh0V3JpdGUgPSBudWxsRW50cnkoKTsKKyAgICAgICAgLy8gR3VhcmRlZCBCeSBTZWdtZW50LnRoaXMKKyAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gcHJldmlvdXNXcml0ZSA9IG51bGxFbnRyeSgpOworCisgICAgICAgIFdlYWtXcml0ZUVudHJ5KAorICAgICAgICAgICAgICAgIFJlZmVyZW5jZVF1ZXVlPEs+IHF1ZXVlLCBLIGtleSwgaW50IGhhc2gsIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5leHQpIHsKKyAgICAgICAgICAgIHN1cGVyKHF1ZXVlLCBrZXksIGhhc2gsIG5leHQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldFdyaXRlVGltZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB3cml0ZVRpbWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0V3JpdGVUaW1lKGxvbmcgdGltZSkgeworICAgICAgICAgICAgdGhpcy53cml0ZVRpbWUgPSB0aW1lOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZWZlcmVuY2VFbnRyeTxLLCBWPiBnZXROZXh0SW5Xcml0ZVF1ZXVlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5leHRXcml0ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXROZXh0SW5Xcml0ZVF1ZXVlKFJlZmVyZW5jZUVudHJ5PEssIFY+IG5leHQpIHsKKyAgICAgICAgICAgIHRoaXMubmV4dFdyaXRlID0gbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVmZXJlbmNlRW50cnk8SywgVj4gZ2V0UHJldmlvdXNJbldyaXRlUXVldWUoKSB7CisgICAgICAgICAgICByZXR1cm4gcHJldmlvdXNXcml0ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcmV2aW91c0luV3JpdGVRdWV1ZShSZWZlcmVuY2VFbnRyeTxLLCBWPiBwcmV2aW91cykgeworICAgICAgICAgICAgdGhpcy5wcmV2aW91c1dyaXRlID0gcHJldmlvdXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgV2Vha0FjY2Vzc1dyaXRlRW50cnk8SywgVj4gZXh0ZW5kcyBXZWFrRW50cnk8SywgVj4geworICAgICAgICB2b2xhdGlsZSBsb25nIGFjY2Vzc1RpbWUgPSBMb25nLk1BWF9WQUxVRTsKKworICAgICAgICAvLyBUaGUgY29kZSBiZWxvdyBpcyBleGFjdGx5IHRoZSBzYW1lIGZvciBlYWNoIGFjY2VzcyBlbnRyeSB0eXBlLgorICAgICAgICAvLyBHdWFyZGVkIEJ5IFNlZ21lbnQudGhpcworICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXh0QWNjZXNzID0gbnVsbEVudHJ5KCk7CisgICAgICAgIC8vIEd1YXJkZWQgQnkgU2VnbWVudC50aGlzCisgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IHByZXZpb3VzQWNjZXNzID0gbnVsbEVudHJ5KCk7CisgICAgICAgIHZvbGF0aWxlIGxvbmcgd3JpdGVUaW1lID0gTG9uZy5NQVhfVkFMVUU7CisgICAgICAgIC8vIEd1YXJkZWQgQnkgU2VnbWVudC50aGlzCisgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5leHRXcml0ZSA9IG51bGxFbnRyeSgpOworICAgICAgICAvLyBHdWFyZGVkIEJ5IFNlZ21lbnQudGhpcworICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBwcmV2aW91c1dyaXRlID0gbnVsbEVudHJ5KCk7CisKKyAgICAgICAgV2Vha0FjY2Vzc1dyaXRlRW50cnkoCisgICAgICAgICAgICAgICAgUmVmZXJlbmNlUXVldWU8Sz4gcXVldWUsIEsga2V5LCBpbnQgaGFzaCwgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV4dCkgeworICAgICAgICAgICAgc3VwZXIocXVldWUsIGtleSwgaGFzaCwgbmV4dCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0QWNjZXNzVGltZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBhY2Nlc3NUaW1lOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEFjY2Vzc1RpbWUobG9uZyB0aW1lKSB7CisgICAgICAgICAgICB0aGlzLmFjY2Vzc1RpbWUgPSB0aW1lOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZWZlcmVuY2VFbnRyeTxLLCBWPiBnZXROZXh0SW5BY2Nlc3NRdWV1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXh0QWNjZXNzOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlIGNvZGUgYmVsb3cgaXMgZXhhY3RseSB0aGUgc2FtZSBmb3IgZWFjaCB3cml0ZSBlbnRyeSB0eXBlLgorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXROZXh0SW5BY2Nlc3NRdWV1ZShSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXh0KSB7CisgICAgICAgICAgICB0aGlzLm5leHRBY2Nlc3MgPSBuZXh0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZWZlcmVuY2VFbnRyeTxLLCBWPiBnZXRQcmV2aW91c0luQWNjZXNzUXVldWUoKSB7CisgICAgICAgICAgICByZXR1cm4gcHJldmlvdXNBY2Nlc3M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UHJldmlvdXNJbkFjY2Vzc1F1ZXVlKFJlZmVyZW5jZUVudHJ5PEssIFY+IHByZXZpb3VzKSB7CisgICAgICAgICAgICB0aGlzLnByZXZpb3VzQWNjZXNzID0gcHJldmlvdXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0V3JpdGVUaW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIHdyaXRlVGltZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRXcml0ZVRpbWUobG9uZyB0aW1lKSB7CisgICAgICAgICAgICB0aGlzLndyaXRlVGltZSA9IHRpbWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlZmVyZW5jZUVudHJ5PEssIFY+IGdldE5leHRJbldyaXRlUXVldWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV4dFdyaXRlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE5leHRJbldyaXRlUXVldWUoUmVmZXJlbmNlRW50cnk8SywgVj4gbmV4dCkgeworICAgICAgICAgICAgdGhpcy5uZXh0V3JpdGUgPSBuZXh0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZWZlcmVuY2VFbnRyeTxLLCBWPiBnZXRQcmV2aW91c0luV3JpdGVRdWV1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBwcmV2aW91c1dyaXRlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFByZXZpb3VzSW5Xcml0ZVF1ZXVlKFJlZmVyZW5jZUVudHJ5PEssIFY+IHByZXZpb3VzKSB7CisgICAgICAgICAgICB0aGlzLnByZXZpb3VzV3JpdGUgPSBwcmV2aW91czsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZmVyZW5jZXMgYSB3ZWFrIHZhbHVlLgorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBXZWFrVmFsdWVSZWZlcmVuY2U8SywgVj4KKyAgICAgICAgICAgIGV4dGVuZHMgV2Vha1JlZmVyZW5jZTxWPiBpbXBsZW1lbnRzIFZhbHVlUmVmZXJlbmNlPEssIFY+IHsKKyAgICAgICAgZmluYWwgUmVmZXJlbmNlRW50cnk8SywgVj4gZW50cnk7CisKKyAgICAgICAgV2Vha1ZhbHVlUmVmZXJlbmNlKFJlZmVyZW5jZVF1ZXVlPFY+IHF1ZXVlLCBWIHJlZmVyZW50LCBSZWZlcmVuY2VFbnRyeTxLLCBWPiBlbnRyeSkgeworICAgICAgICAgICAgc3VwZXIocmVmZXJlbnQsIHF1ZXVlKTsKKyAgICAgICAgICAgIHRoaXMuZW50cnkgPSBlbnRyeTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGdldFdlaWdodCgpIHsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZWZlcmVuY2VFbnRyeTxLLCBWPiBnZXRFbnRyeSgpIHsKKyAgICAgICAgICAgIHJldHVybiBlbnRyeTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBub3RpZnlOZXdWYWx1ZShWIG5ld1ZhbHVlKSB7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFZhbHVlUmVmZXJlbmNlPEssIFY+IGNvcHlGb3IoCisgICAgICAgICAgICAgICAgUmVmZXJlbmNlUXVldWU8Vj4gcXVldWUsIFYgdmFsdWUsIFJlZmVyZW5jZUVudHJ5PEssIFY+IGVudHJ5KSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFdlYWtWYWx1ZVJlZmVyZW5jZTxLLCBWPihxdWV1ZSwgdmFsdWUsIGVudHJ5KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0xvYWRpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNBY3RpdmUoKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgViB3YWl0Rm9yVmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWZlcmVuY2VzIGEgc3Ryb25nIHZhbHVlLgorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBTdHJvbmdWYWx1ZVJlZmVyZW5jZTxLLCBWPiBpbXBsZW1lbnRzIFZhbHVlUmVmZXJlbmNlPEssIFY+IHsKKyAgICAgICAgZmluYWwgViByZWZlcmVudDsKKworICAgICAgICBTdHJvbmdWYWx1ZVJlZmVyZW5jZShWIHJlZmVyZW50KSB7CisgICAgICAgICAgICB0aGlzLnJlZmVyZW50ID0gcmVmZXJlbnQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFYgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIHJlZmVyZW50OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0V2VpZ2h0KCkgeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlZmVyZW5jZUVudHJ5PEssIFY+IGdldEVudHJ5KCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFZhbHVlUmVmZXJlbmNlPEssIFY+IGNvcHlGb3IoCisgICAgICAgICAgICAgICAgUmVmZXJlbmNlUXVldWU8Vj4gcXVldWUsIFYgdmFsdWUsIFJlZmVyZW5jZUVudHJ5PEssIFY+IGVudHJ5KSB7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0xvYWRpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNBY3RpdmUoKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgViB3YWl0Rm9yVmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgbm90aWZ5TmV3VmFsdWUoViBuZXdWYWx1ZSkgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVmZXJlbmNlcyBhIHdlYWsgdmFsdWUuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIFdlaWdodGVkV2Vha1ZhbHVlUmVmZXJlbmNlPEssIFY+IGV4dGVuZHMgV2Vha1ZhbHVlUmVmZXJlbmNlPEssIFY+IHsKKyAgICAgICAgZmluYWwgaW50IHdlaWdodDsKKworICAgICAgICBXZWlnaHRlZFdlYWtWYWx1ZVJlZmVyZW5jZShSZWZlcmVuY2VRdWV1ZTxWPiBxdWV1ZSwgViByZWZlcmVudCwgUmVmZXJlbmNlRW50cnk8SywgVj4gZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3ZWlnaHQpIHsKKyAgICAgICAgICAgIHN1cGVyKHF1ZXVlLCByZWZlcmVudCwgZW50cnkpOworICAgICAgICAgICAgdGhpcy53ZWlnaHQgPSB3ZWlnaHQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBnZXRXZWlnaHQoKSB7CisgICAgICAgICAgICByZXR1cm4gd2VpZ2h0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWYWx1ZVJlZmVyZW5jZTxLLCBWPiBjb3B5Rm9yKAorICAgICAgICAgICAgICAgIFJlZmVyZW5jZVF1ZXVlPFY+IHF1ZXVlLCBWIHZhbHVlLCBSZWZlcmVuY2VFbnRyeTxLLCBWPiBlbnRyeSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBXZWlnaHRlZFdlYWtWYWx1ZVJlZmVyZW5jZTxLLCBWPihxdWV1ZSwgdmFsdWUsIGVudHJ5LCB3ZWlnaHQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVmZXJlbmNlcyBhIHN0cm9uZyB2YWx1ZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgV2VpZ2h0ZWRTdHJvbmdWYWx1ZVJlZmVyZW5jZTxLLCBWPiBleHRlbmRzIFN0cm9uZ1ZhbHVlUmVmZXJlbmNlPEssIFY+IHsKKyAgICAgICAgZmluYWwgaW50IHdlaWdodDsKKworICAgICAgICBXZWlnaHRlZFN0cm9uZ1ZhbHVlUmVmZXJlbmNlKFYgcmVmZXJlbnQsIGludCB3ZWlnaHQpIHsKKyAgICAgICAgICAgIHN1cGVyKHJlZmVyZW50KTsKKyAgICAgICAgICAgIHRoaXMud2VpZ2h0ID0gd2VpZ2h0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0V2VpZ2h0KCkgeworICAgICAgICAgICAgcmV0dXJuIHdlaWdodDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNlZ21lbnRzIGFyZSBzcGVjaWFsaXplZCB2ZXJzaW9ucyBvZiBoYXNoIHRhYmxlcy4gVGhpcyBzdWJjbGFzcyBpbmhlcml0cyBmcm9tIFJlZW50cmFudExvY2sKKyAgICAgKiBvcHBvcnR1bmlzdGljYWxseSwganVzdCB0byBzaW1wbGlmeSBzb21lIGxvY2tpbmcgYW5kIGF2b2lkIHNlcGFyYXRlIGNvbnN0cnVjdGlvbi4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikgLy8gVGhpcyBjbGFzcyBpcyBuZXZlciBzZXJpYWxpemVkLgorICAgIHN0YXRpYyBjbGFzcyBTZWdtZW50PEssIFY+IGV4dGVuZHMgUmVlbnRyYW50TG9jayB7CisKKyAgICAvKgorICAgICAqIFRPRE8oZnJ5KTogQ29uc2lkZXIgY29weWluZyB2YXJpYWJsZXMgKGxpa2UgZXZpY3RzQnlTaXplKSBmcm9tIG91dGVyIGNsYXNzIGludG8gdGhpcyBjbGFzcy4KKyAgICAgKiBJdCB3aWxsIHJlcXVpcmUgbW9yZSBtZW1vcnkgYnV0IHdpbGwgcmVkdWNlIGluZGlyZWN0aW9uLgorICAgICAqLworCisgICAgLyoKKyAgICAgKiBTZWdtZW50cyBtYWludGFpbiBhIHRhYmxlIG9mIGVudHJ5IGxpc3RzIHRoYXQgYXJlIEFMV0FZUyBrZXB0IGluIGEgY29uc2lzdGVudCBzdGF0ZSwgc28gY2FuCisgICAgICogYmUgcmVhZCB3aXRob3V0IGxvY2tpbmcuIE5leHQgZmllbGRzIG9mIG5vZGVzIGFyZSBpbW11dGFibGUgKGZpbmFsKS4gQWxsIGxpc3QgYWRkaXRpb25zIGFyZQorICAgICAqIHBlcmZvcm1lZCBhdCB0aGUgZnJvbnQgb2YgZWFjaCBiaW4uIFRoaXMgbWFrZXMgaXQgZWFzeSB0byBjaGVjayBjaGFuZ2VzLCBhbmQgYWxzbyBmYXN0IHRvCisgICAgICogdHJhdmVyc2UuIFdoZW4gbm9kZXMgd291bGQgb3RoZXJ3aXNlIGJlIGNoYW5nZWQsIG5ldyBub2RlcyBhcmUgY3JlYXRlZCB0byByZXBsYWNlIHRoZW0uIFRoaXMKKyAgICAgKiB3b3JrcyB3ZWxsIGZvciBoYXNoIHRhYmxlcyBzaW5jZSB0aGUgYmluIGxpc3RzIHRlbmQgdG8gYmUgc2hvcnQuIChUaGUgYXZlcmFnZSBsZW5ndGggaXMgbGVzcworICAgICAqIHRoYW4gdHdvLikKKyAgICAgKgorICAgICAqIFJlYWQgb3BlcmF0aW9ucyBjYW4gdGh1cyBwcm9jZWVkIHdpdGhvdXQgbG9ja2luZywgYnV0IHJlbHkgb24gc2VsZWN0ZWQgdXNlcyBvZiB2b2xhdGlsZXMgdG8KKyAgICAgKiBlbnN1cmUgdGhhdCBjb21wbGV0ZWQgd3JpdGUgb3BlcmF0aW9ucyBwZXJmb3JtZWQgYnkgb3RoZXIgdGhyZWFkcyBhcmUgbm90aWNlZC4gRm9yIG1vc3QKKyAgICAgKiBwdXJwb3NlcywgdGhlICJjb3VudCIgZmllbGQsIHRyYWNraW5nIHRoZSBudW1iZXIgb2YgZWxlbWVudHMsIHNlcnZlcyBhcyB0aGF0IHZvbGF0aWxlCisgICAgICogdmFyaWFibGUgZW5zdXJpbmcgdmlzaWJpbGl0eS4gVGhpcyBpcyBjb252ZW5pZW50IGJlY2F1c2UgdGhpcyBmaWVsZCBuZWVkcyB0byBiZSByZWFkIGluIG1hbnkKKyAgICAgKiByZWFkIG9wZXJhdGlvbnMgYW55d2F5OgorICAgICAqCisgICAgICogLSBBbGwgKHVuc3luY2hyb25pemVkKSByZWFkIG9wZXJhdGlvbnMgbXVzdCBmaXJzdCByZWFkIHRoZSAiY291bnQiIGZpZWxkLCBhbmQgc2hvdWxkIG5vdAorICAgICAqIGxvb2sgYXQgdGFibGUgZW50cmllcyBpZiBpdCBpcyAwLgorICAgICAqCisgICAgICogLSBBbGwgKHN5bmNocm9uaXplZCkgd3JpdGUgb3BlcmF0aW9ucyBzaG91bGQgd3JpdGUgdG8gdGhlICJjb3VudCIgZmllbGQgYWZ0ZXIgc3RydWN0dXJhbGx5CisgICAgICogY2hhbmdpbmcgYW55IGJpbi4gVGhlIG9wZXJhdGlvbnMgbXVzdCBub3QgdGFrZSBhbnkgYWN0aW9uIHRoYXQgY291bGQgZXZlbiBtb21lbnRhcmlseQorICAgICAqIGNhdXNlIGEgY29uY3VycmVudCByZWFkIG9wZXJhdGlvbiB0byBzZWUgaW5jb25zaXN0ZW50IGRhdGEuIFRoaXMgaXMgbWFkZSBlYXNpZXIgYnkgdGhlCisgICAgICogbmF0dXJlIG9mIHRoZSByZWFkIG9wZXJhdGlvbnMgaW4gTWFwLiBGb3IgZXhhbXBsZSwgbm8gb3BlcmF0aW9uIGNhbiByZXZlYWwgdGhhdCB0aGUgdGFibGUKKyAgICAgKiBoYXMgZ3Jvd24gYnV0IHRoZSB0aHJlc2hvbGQgaGFzIG5vdCB5ZXQgYmVlbiB1cGRhdGVkLCBzbyB0aGVyZSBhcmUgbm8gYXRvbWljaXR5IHJlcXVpcmVtZW50cworICAgICAqIGZvciB0aGlzIHdpdGggcmVzcGVjdCB0byByZWFkcy4KKyAgICAgKgorICAgICAqIEFzIGEgZ3VpZGUsIGFsbCBjcml0aWNhbCB2b2xhdGlsZSByZWFkcyBhbmQgd3JpdGVzIHRvIHRoZSBjb3VudCBmaWVsZCBhcmUgbWFya2VkIGluIGNvZGUKKyAgICAgKiBjb21tZW50cy4KKyAgICAgKi8KKworICAgICAgICBmaW5hbCBMb2NhbENhY2hlPEssIFY+IG1hcDsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBtYXhpbXVtIHdlaWdodCBvZiB0aGlzIHNlZ21lbnQuIFVOU0VUX0lOVCBpZiB0aGVyZSBpcyBubyBtYXhpbXVtLgorICAgICAgICAgKi8KKyAgICAgICAgZmluYWwgbG9uZyBtYXhTZWdtZW50V2VpZ2h0OworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGtleSByZWZlcmVuY2UgcXVldWUgY29udGFpbnMgZW50cmllcyB3aG9zZSBrZXlzIGhhdmUgYmVlbiBnYXJiYWdlIGNvbGxlY3RlZCwgYW5kIHdoaWNoCisgICAgICAgICAqIG5lZWQgdG8gYmUgY2xlYW5lZCB1cCBpbnRlcm5hbGx5LgorICAgICAgICAgKi8KKyAgICAgICAgZmluYWwgUmVmZXJlbmNlUXVldWU8Sz4ga2V5UmVmZXJlbmNlUXVldWU7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdmFsdWUgcmVmZXJlbmNlIHF1ZXVlIGNvbnRhaW5zIHZhbHVlIHJlZmVyZW5jZXMgd2hvc2UgdmFsdWVzIGhhdmUgYmVlbiBnYXJiYWdlIGNvbGxlY3RlZCwKKyAgICAgICAgICogYW5kIHdoaWNoIG5lZWQgdG8gYmUgY2xlYW5lZCB1cCBpbnRlcm5hbGx5LgorICAgICAgICAgKi8KKyAgICAgICAgZmluYWwgUmVmZXJlbmNlUXVldWU8Vj4gdmFsdWVSZWZlcmVuY2VRdWV1ZTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSByZWNlbmN5IHF1ZXVlIGlzIHVzZWQgdG8gcmVjb3JkIHdoaWNoIGVudHJpZXMgd2VyZSBhY2Nlc3NlZCBmb3IgdXBkYXRpbmcgdGhlIGFjY2VzcworICAgICAgICAgKiBsaXN0J3Mgb3JkZXJpbmcuIEl0IGlzIGRyYWluZWQgYXMgYSBiYXRjaCBvcGVyYXRpb24gd2hlbiBlaXRoZXIgdGhlIERSQUlOX1RIUkVTSE9MRCBpcworICAgICAgICAgKiBjcm9zc2VkIG9yIGEgd3JpdGUgb2NjdXJzIG9uIHRoZSBzZWdtZW50LgorICAgICAgICAgKi8KKyAgICAgICAgZmluYWwgUXVldWU8UmVmZXJlbmNlRW50cnk8SywgVj4+IHJlY2VuY3lRdWV1ZTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEEgY291bnRlciBvZiB0aGUgbnVtYmVyIG9mIHJlYWRzIHNpbmNlIHRoZSBsYXN0IHdyaXRlLCB1c2VkIHRvIGRyYWluIHF1ZXVlcyBvbiBhIHNtYWxsCisgICAgICAgICAqIGZyYWN0aW9uIG9mIHJlYWQgb3BlcmF0aW9ucy4KKyAgICAgICAgICovCisgICAgICAgIGZpbmFsIEF0b21pY0ludGVnZXIgcmVhZENvdW50ID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEEgcXVldWUgb2YgZWxlbWVudHMgY3VycmVudGx5IGluIHRoZSBtYXAsIG9yZGVyZWQgYnkgd3JpdGUgdGltZS4gRWxlbWVudHMgYXJlIGFkZGVkIHRvIHRoZQorICAgICAgICAgKiB0YWlsIG9mIHRoZSBxdWV1ZSBvbiB3cml0ZS4KKyAgICAgICAgICovCisgICAgICAgIGZpbmFsIFF1ZXVlPFJlZmVyZW5jZUVudHJ5PEssIFY+PiB3cml0ZVF1ZXVlOworICAgICAgICAvKioKKyAgICAgICAgICogQSBxdWV1ZSBvZiBlbGVtZW50cyBjdXJyZW50bHkgaW4gdGhlIG1hcCwgb3JkZXJlZCBieSBhY2Nlc3MgdGltZS4gRWxlbWVudHMgYXJlIGFkZGVkIHRvIHRoZQorICAgICAgICAgKiB0YWlsIG9mIHRoZSBxdWV1ZSBvbiBhY2Nlc3MgKG5vdGUgdGhhdCB3cml0ZXMgY291bnQgYXMgYWNjZXNzZXMpLgorICAgICAgICAgKi8KKyAgICAgICAgZmluYWwgUXVldWU8UmVmZXJlbmNlRW50cnk8SywgVj4+IGFjY2Vzc1F1ZXVlOworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG51bWJlciBvZiBsaXZlIGVsZW1lbnRzIGluIHRoaXMgc2VnbWVudCdzIHJlZ2lvbi4KKyAgICAgICAgICovCisgICAgICAgIHZvbGF0aWxlIGludCBjb3VudDsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB3ZWlnaHQgb2YgdGhlIGxpdmUgZWxlbWVudHMgaW4gdGhpcyBzZWdtZW50J3MgcmVnaW9uLgorICAgICAgICAgKi8KKyAgICAgICAgbG9uZyB0b3RhbFdlaWdodDsKKyAgICAgICAgLyoqCisgICAgICAgICAqIE51bWJlciBvZiB1cGRhdGVzIHRoYXQgYWx0ZXIgdGhlIHNpemUgb2YgdGhlIHRhYmxlLiBUaGlzIGlzIHVzZWQgZHVyaW5nIGJ1bGstcmVhZCBtZXRob2RzIHRvCisgICAgICAgICAqIG1ha2Ugc3VyZSB0aGV5IHNlZSBhIGNvbnNpc3RlbnQgc25hcHNob3Q6IElmIG1vZENvdW50cyBjaGFuZ2UgZHVyaW5nIGEgdHJhdmVyc2FsIG9mIHNlZ21lbnRzCisgICAgICAgICAqIGxvYWRpbmcgc2l6ZSBvciBjaGVja2luZyBjb250YWluc1ZhbHVlLCB0aGVuIHdlIG1pZ2h0IGhhdmUgYW4gaW5jb25zaXN0ZW50IHZpZXcgb2Ygc3RhdGUKKyAgICAgICAgICogc28gKHVzdWFsbHkpIG11c3QgcmV0cnkuCisgICAgICAgICAqLworICAgICAgICBpbnQgbW9kQ291bnQ7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgdGFibGUgaXMgZXhwYW5kZWQgd2hlbiBpdHMgc2l6ZSBleGNlZWRzIHRoaXMgdGhyZXNob2xkLiAoVGhlIHZhbHVlIG9mIHRoaXMgZmllbGQgaXMKKyAgICAgICAgICogYWx3YXlzIHtAY29kZSAoaW50KSAoY2FwYWNpdHkgKiAwLjc1KX0uKQorICAgICAgICAgKi8KKyAgICAgICAgaW50IHRocmVzaG9sZDsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBwZXItc2VnbWVudCB0YWJsZS4KKyAgICAgICAgICovCisgICAgICAgIHZvbGF0aWxlIEF0b21pY1JlZmVyZW5jZUFycmF5PFJlZmVyZW5jZUVudHJ5PEssIFY+PiB0YWJsZTsKKworICAgICAgICBTZWdtZW50KExvY2FsQ2FjaGU8SywgVj4gbWFwLCBpbnQgaW5pdGlhbENhcGFjaXR5LCBsb25nIG1heFNlZ21lbnRXZWlnaHQpIHsKKyAgICAgICAgICAgIHRoaXMubWFwID0gbWFwOworICAgICAgICAgICAgdGhpcy5tYXhTZWdtZW50V2VpZ2h0ID0gbWF4U2VnbWVudFdlaWdodDsKKyAgICAgICAgICAgIGluaXRUYWJsZShuZXdFbnRyeUFycmF5KGluaXRpYWxDYXBhY2l0eSkpOworCisgICAgICAgICAgICBrZXlSZWZlcmVuY2VRdWV1ZSA9IG1hcC51c2VzS2V5UmVmZXJlbmNlcygpCisgICAgICAgICAgICAgICAgICAgID8gbmV3IFJlZmVyZW5jZVF1ZXVlPEs+KCkgOiBudWxsOworCisgICAgICAgICAgICB2YWx1ZVJlZmVyZW5jZVF1ZXVlID0gbWFwLnVzZXNWYWx1ZVJlZmVyZW5jZXMoKQorICAgICAgICAgICAgICAgICAgICA/IG5ldyBSZWZlcmVuY2VRdWV1ZTxWPigpIDogbnVsbDsKKworICAgICAgICAgICAgcmVjZW5jeVF1ZXVlID0gbWFwLnVzZXNBY2Nlc3NRdWV1ZSgpCisgICAgICAgICAgICAgICAgICAgID8gbmV3IENvbmN1cnJlbnRMaW5rZWRRdWV1ZTxSZWZlcmVuY2VFbnRyeTxLLCBWPj4oKQorICAgICAgICAgICAgICAgICAgICA6IExvY2FsQ2FjaGUuZGlzY2FyZGluZ1F1ZXVlKCk7CisKKyAgICAgICAgICAgIHdyaXRlUXVldWUgPSBtYXAudXNlc1dyaXRlUXVldWUoKQorICAgICAgICAgICAgICAgICAgICA/IG5ldyBXcml0ZVF1ZXVlPEssIFY+KCkKKyAgICAgICAgICAgICAgICAgICAgOiBMb2NhbENhY2hlLmRpc2NhcmRpbmdRdWV1ZSgpOworCisgICAgICAgICAgICBhY2Nlc3NRdWV1ZSA9IG1hcC51c2VzQWNjZXNzUXVldWUoKQorICAgICAgICAgICAgICAgICAgICA/IG5ldyBBY2Nlc3NRdWV1ZTxLLCBWPigpCisgICAgICAgICAgICAgICAgICAgIDogTG9jYWxDYWNoZS5kaXNjYXJkaW5nUXVldWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEF0b21pY1JlZmVyZW5jZUFycmF5PFJlZmVyZW5jZUVudHJ5PEssIFY+PiBuZXdFbnRyeUFycmF5KGludCBzaXplKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEF0b21pY1JlZmVyZW5jZUFycmF5PFJlZmVyZW5jZUVudHJ5PEssIFY+PihzaXplKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgaW5pdFRhYmxlKEF0b21pY1JlZmVyZW5jZUFycmF5PFJlZmVyZW5jZUVudHJ5PEssIFY+PiBuZXdUYWJsZSkgeworICAgICAgICAgICAgdGhpcy50aHJlc2hvbGQgPSBuZXdUYWJsZS5sZW5ndGgoKSAqIDMgLyA0OyAvLyAwLjc1CisgICAgICAgICAgICBpZiAodGhpcy50aHJlc2hvbGQgPT0gbWF4U2VnbWVudFdlaWdodCkgeworICAgICAgICAgICAgICAgIC8vIHByZXZlbnQgc3B1cmlvdXMgZXhwYW5zaW9uIGJlZm9yZSBldmljdGlvbgorICAgICAgICAgICAgICAgIHRoaXMudGhyZXNob2xkKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLnRhYmxlID0gbmV3VGFibGU7CisgICAgICAgIH0KKworICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXdFbnRyeShLIGtleSwgaW50IGhhc2gsIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5leHQpIHsKKyAgICAgICAgICAgIHJldHVybiBtYXAuZW50cnlGYWN0b3J5Lm5ld0VudHJ5KHRoaXMsIGNoZWNrTm90TnVsbChrZXkpLCBoYXNoLCBuZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb3BpZXMge0Bjb2RlIG9yaWdpbmFsfSBpbnRvIGEgbmV3IGVudHJ5IGNoYWluZWQgdG8ge0Bjb2RlIG5ld05leHR9LiBSZXR1cm5zIHRoZSBuZXcgZW50cnksCisgICAgICAgICAqIG9yIHtAY29kZSBudWxsfSBpZiB7QGNvZGUgb3JpZ2luYWx9IHdhcyBhbHJlYWR5IGdhcmJhZ2UgY29sbGVjdGVkLgorICAgICAgICAgKi8KKyAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gY29weUVudHJ5KFJlZmVyZW5jZUVudHJ5PEssIFY+IG9yaWdpbmFsLCBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXdOZXh0KSB7CisgICAgICAgICAgICBpZiAob3JpZ2luYWwuZ2V0S2V5KCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIGtleSBjb2xsZWN0ZWQKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgVmFsdWVSZWZlcmVuY2U8SywgVj4gdmFsdWVSZWZlcmVuY2UgPSBvcmlnaW5hbC5nZXRWYWx1ZVJlZmVyZW5jZSgpOworICAgICAgICAgICAgViB2YWx1ZSA9IHZhbHVlUmVmZXJlbmNlLmdldCgpOworICAgICAgICAgICAgaWYgKCh2YWx1ZSA9PSBudWxsKSAmJiB2YWx1ZVJlZmVyZW5jZS5pc0FjdGl2ZSgpKSB7CisgICAgICAgICAgICAgICAgLy8gdmFsdWUgY29sbGVjdGVkCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5ld0VudHJ5ID0gbWFwLmVudHJ5RmFjdG9yeS5jb3B5RW50cnkodGhpcywgb3JpZ2luYWwsIG5ld05leHQpOworICAgICAgICAgICAgbmV3RW50cnkuc2V0VmFsdWVSZWZlcmVuY2UodmFsdWVSZWZlcmVuY2UuY29weUZvcih0aGlzLnZhbHVlUmVmZXJlbmNlUXVldWUsIHZhbHVlLCBuZXdFbnRyeSkpOworICAgICAgICAgICAgcmV0dXJuIG5ld0VudHJ5OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgYSBuZXcgdmFsdWUgb2YgYW4gZW50cnkuIEFkZHMgbmV3bHkgY3JlYXRlZCBlbnRyaWVzIGF0IHRoZSBlbmQgb2YgdGhlIGFjY2VzcyBxdWV1ZS4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgc2V0VmFsdWUoUmVmZXJlbmNlRW50cnk8SywgVj4gZW50cnksIEsga2V5LCBWIHZhbHVlLCBsb25nIG5vdykgeworICAgICAgICAgICAgVmFsdWVSZWZlcmVuY2U8SywgVj4gcHJldmlvdXMgPSBlbnRyeS5nZXRWYWx1ZVJlZmVyZW5jZSgpOworICAgICAgICAgICAgaW50IHdlaWdodCA9IDE7CisgICAgICAgICAgICBjaGVja1N0YXRlKHdlaWdodCA+PSAwLCAiV2VpZ2h0cyBtdXN0IGJlIG5vbi1uZWdhdGl2ZSIpOworCisgICAgICAgICAgICBWYWx1ZVJlZmVyZW5jZTxLLCBWPiB2YWx1ZVJlZmVyZW5jZSA9CisgICAgICAgICAgICAgICAgICAgIG1hcC52YWx1ZVN0cmVuZ3RoLnJlZmVyZW5jZVZhbHVlKHRoaXMsIGVudHJ5LCB2YWx1ZSwgd2VpZ2h0KTsKKyAgICAgICAgICAgIGVudHJ5LnNldFZhbHVlUmVmZXJlbmNlKHZhbHVlUmVmZXJlbmNlKTsKKyAgICAgICAgICAgIHJlY29yZFdyaXRlKGVudHJ5LCB3ZWlnaHQsIG5vdyk7CisgICAgICAgICAgICBwcmV2aW91cy5ub3RpZnlOZXdWYWx1ZSh2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBsb2FkaW5nCisKKyAgICAgICAgViBnZXQoSyBrZXksIGludCBoYXNoLCBDYWNoZUxvYWRlcjw/IHN1cGVyIEssIFY+IGxvYWRlcikgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBjaGVja05vdE51bGwoa2V5KTsKKyAgICAgICAgICAgIGNoZWNrTm90TnVsbChsb2FkZXIpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoY291bnQgIT0gMCkgeyAvLyByZWFkLXZvbGF0aWxlCisgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IGNhbGwgZ2V0TGl2ZUVudHJ5LCB3aGljaCB3b3VsZCBpZ25vcmUgbG9hZGluZyB2YWx1ZXMKKyAgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gZSA9IGdldEVudHJ5KGtleSwgaGFzaCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgbm93ID0gbWFwLnRpY2tlci5yZWFkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBWIHZhbHVlID0gZ2V0TGl2ZVZhbHVlKGUsIG5vdyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZFJlYWQoZSwgbm93KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2NoZWR1bGVSZWZyZXNoKGUsIGtleSwgaGFzaCwgdmFsdWUsIG5vdywgbG9hZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlUmVmZXJlbmNlPEssIFY+IHZhbHVlUmVmZXJlbmNlID0gZS5nZXRWYWx1ZVJlZmVyZW5jZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlUmVmZXJlbmNlLmlzTG9hZGluZygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdhaXRGb3JMb2FkaW5nVmFsdWUoZSwga2V5LCB2YWx1ZVJlZmVyZW5jZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBhdCB0aGlzIHBvaW50IGUgaXMgZWl0aGVyIG51bGwgb3IgZXhwaXJlZDsKKyAgICAgICAgICAgICAgICByZXR1cm4gbG9ja2VkR2V0T3JMb2FkKGtleSwgaGFzaCwgbG9hZGVyKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlZSkgeworICAgICAgICAgICAgICAgIFRocm93YWJsZSBjYXVzZSA9IGVlLmdldENhdXNlKCk7CisgICAgICAgICAgICAgICAgaWYgKGNhdXNlIGluc3RhbmNlb2YgRXJyb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4ZWN1dGlvbkVycm9yKChFcnJvcikgY2F1c2UpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2F1c2UgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbmNoZWNrZWRFeGVjdXRpb25FeGNlcHRpb24oY2F1c2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aHJvdyBlZTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgcG9zdFJlYWRDbGVhbnVwKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBWIGxvY2tlZEdldE9yTG9hZChLIGtleSwgaW50IGhhc2gsIENhY2hlTG9hZGVyPD8gc3VwZXIgSywgVj4gbG9hZGVyKQorICAgICAgICAgICAgICAgIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gZTsKKyAgICAgICAgICAgIFZhbHVlUmVmZXJlbmNlPEssIFY+IHZhbHVlUmVmZXJlbmNlID0gbnVsbDsKKyAgICAgICAgICAgIExvYWRpbmdWYWx1ZVJlZmVyZW5jZTxLLCBWPiBsb2FkaW5nVmFsdWVSZWZlcmVuY2UgPSBudWxsOworICAgICAgICAgICAgYm9vbGVhbiBjcmVhdGVOZXdFbnRyeSA9IHRydWU7CisKKyAgICAgICAgICAgIGxvY2soKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gcmUtcmVhZCB0aWNrZXIgb25jZSBpbnNpZGUgdGhlIGxvY2sKKyAgICAgICAgICAgICAgICBsb25nIG5vdyA9IG1hcC50aWNrZXIucmVhZCgpOworICAgICAgICAgICAgICAgIHByZVdyaXRlQ2xlYW51cChub3cpOworCisgICAgICAgICAgICAgICAgaW50IG5ld0NvdW50ID0gdGhpcy5jb3VudCAtIDE7CisgICAgICAgICAgICAgICAgQXRvbWljUmVmZXJlbmNlQXJyYXk8UmVmZXJlbmNlRW50cnk8SywgVj4+IHRhYmxlID0gdGhpcy50YWJsZTsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBoYXNoICYgKHRhYmxlLmxlbmd0aCgpIC0gMSk7CisgICAgICAgICAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gZmlyc3QgPSB0YWJsZS5nZXQoaW5kZXgpOworCisgICAgICAgICAgICAgICAgZm9yIChlID0gZmlyc3Q7IGUgIT0gbnVsbDsgZSA9IGUuZ2V0TmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIEsgZW50cnlLZXkgPSBlLmdldEtleSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoZS5nZXRIYXNoKCkgPT0gaGFzaCAmJiBlbnRyeUtleSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbWFwLmtleUVxdWl2YWxlbmNlLmVxdWl2YWxlbnQoa2V5LCBlbnRyeUtleSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlUmVmZXJlbmNlID0gZS5nZXRWYWx1ZVJlZmVyZW5jZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlUmVmZXJlbmNlLmlzTG9hZGluZygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlTmV3RW50cnkgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgViB2YWx1ZSA9IHZhbHVlUmVmZXJlbmNlLmdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVucXVldWVOb3RpZmljYXRpb24oZW50cnlLZXksIGhhc2gsIHZhbHVlUmVmZXJlbmNlLCBSZW1vdmFsQ2F1c2UuQ09MTEVDVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1hcC5pc0V4cGlyZWQoZSwgbm93KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgZHVwbGljYXRlIGNoZWNrLCBhcyBwcmVXcml0ZUNsZWFudXAgYWxyZWFkeSBwdXJnZWQgZXhwaXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbnRyaWVzLCBidXQgbGV0J3MgYWNjb21vZGF0ZSBhbiBpbmNvcnJlY3QgZXhwaXJhdGlvbiBxdWV1ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5xdWV1ZU5vdGlmaWNhdGlvbihlbnRyeUtleSwgaGFzaCwgdmFsdWVSZWZlcmVuY2UsIFJlbW92YWxDYXVzZS5FWFBJUkVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRMb2NrZWRSZWFkKGUsIG5vdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHdlcmUgY29uY3VycmVudCB3aXRoIGxvYWRpbmc7IGRvbid0IGNvbnNpZGVyIHJlZnJlc2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltbWVkaWF0ZWx5IHJldXNlIGludmFsaWQgZW50cmllcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlUXVldWUucmVtb3ZlKGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc1F1ZXVlLnJlbW92ZShlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvdW50ID0gbmV3Q291bnQ7IC8vIHdyaXRlLXZvbGF0aWxlCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChjcmVhdGVOZXdFbnRyeSkgeworICAgICAgICAgICAgICAgICAgICBsb2FkaW5nVmFsdWVSZWZlcmVuY2UgPSBuZXcgTG9hZGluZ1ZhbHVlUmVmZXJlbmNlPEssIFY+KCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZSA9IG5ld0VudHJ5KGtleSwgaGFzaCwgZmlyc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgZS5zZXRWYWx1ZVJlZmVyZW5jZShsb2FkaW5nVmFsdWVSZWZlcmVuY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUuc2V0KGluZGV4LCBlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGUuc2V0VmFsdWVSZWZlcmVuY2UobG9hZGluZ1ZhbHVlUmVmZXJlbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgICAgICAgICAgcG9zdFdyaXRlQ2xlYW51cCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY3JlYXRlTmV3RW50cnkpIHsKKyAgICAgICAgICAgICAgICAvLyBTeW5jaHJvbml6ZXMgb24gdGhlIGVudHJ5IHRvIGFsbG93IGZhaWxpbmcgZmFzdCB3aGVuIGEgcmVjdXJzaXZlIGxvYWQgaXMKKyAgICAgICAgICAgICAgICAvLyBkZXRlY3RlZC4gVGhpcyBtYXkgYmUgY2lyY3VtdmVudGVkIHdoZW4gYW4gZW50cnkgaXMgY29waWVkLCBidXQgd2lsbCBmYWlsIGZhc3QgbW9zdAorICAgICAgICAgICAgICAgIC8vIG9mIHRoZSB0aW1lLgorICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoZSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9hZFN5bmMoa2V5LCBoYXNoLCBsb2FkaW5nVmFsdWVSZWZlcmVuY2UsIGxvYWRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgZW50cnkgYWxyZWFkeSBleGlzdHMuIFdhaXQgZm9yIGxvYWRpbmcuCisgICAgICAgICAgICAgICAgcmV0dXJuIHdhaXRGb3JMb2FkaW5nVmFsdWUoZSwga2V5LCB2YWx1ZVJlZmVyZW5jZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBWIHdhaXRGb3JMb2FkaW5nVmFsdWUoUmVmZXJlbmNlRW50cnk8SywgVj4gZSwgSyBrZXksIFZhbHVlUmVmZXJlbmNlPEssIFY+IHZhbHVlUmVmZXJlbmNlKQorICAgICAgICAgICAgICAgIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKCF2YWx1ZVJlZmVyZW5jZS5pc0xvYWRpbmcoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjaGVja1N0YXRlKCFUaHJlYWQuaG9sZHNMb2NrKGUpLCAiUmVjdXJzaXZlIGxvYWQgb2Y6ICVzIiwga2V5KTsKKyAgICAgICAgICAgIC8vIGRvbid0IGNvbnNpZGVyIGV4cGlyYXRpb24gYXMgd2UncmUgY29uY3VycmVudCB3aXRoIGxvYWRpbmcKKyAgICAgICAgICAgIFYgdmFsdWUgPSB2YWx1ZVJlZmVyZW5jZS53YWl0Rm9yVmFsdWUoKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENhY2hlTG9hZGVyLkludmFsaWRDYWNoZUxvYWRFeGNlcHRpb24oIkNhY2hlTG9hZGVyIHJldHVybmVkIG51bGwgZm9yIGtleSAiICsga2V5ICsgIi4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHJlLXJlYWQgdGlja2VyIG5vdyB0aGF0IGxvYWRpbmcgaGFzIGNvbXBsZXRlZAorICAgICAgICAgICAgbG9uZyBub3cgPSBtYXAudGlja2VyLnJlYWQoKTsKKyAgICAgICAgICAgIHJlY29yZFJlYWQoZSwgbm93KTsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKworICAgICAgICB9CisKKyAgICAgICAgLy8gYXQgbW9zdCBvbmUgb2YgbG9hZFN5bmMvbG9hZEFzeW5jIG1heSBiZSBjYWxsZWQgZm9yIGFueSBnaXZlbiBMb2FkaW5nVmFsdWVSZWZlcmVuY2UKKworICAgICAgICBWIGxvYWRTeW5jKEsga2V5LCBpbnQgaGFzaCwgTG9hZGluZ1ZhbHVlUmVmZXJlbmNlPEssIFY+IGxvYWRpbmdWYWx1ZVJlZmVyZW5jZSwKKyAgICAgICAgICAgICAgICAgICBDYWNoZUxvYWRlcjw/IHN1cGVyIEssIFY+IGxvYWRlcikgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBMaXN0ZW5hYmxlRnV0dXJlPFY+IGxvYWRpbmdGdXR1cmUgPSBsb2FkaW5nVmFsdWVSZWZlcmVuY2UubG9hZEZ1dHVyZShrZXksIGxvYWRlcik7CisgICAgICAgICAgICByZXR1cm4gZ2V0QW5kUmVjb3JkU3RhdHMoa2V5LCBoYXNoLCBsb2FkaW5nVmFsdWVSZWZlcmVuY2UsIGxvYWRpbmdGdXR1cmUpOworICAgICAgICB9CisKKyAgICAgICAgTGlzdGVuYWJsZUZ1dHVyZTxWPiBsb2FkQXN5bmMoZmluYWwgSyBrZXksIGZpbmFsIGludCBoYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMb2FkaW5nVmFsdWVSZWZlcmVuY2U8SywgVj4gbG9hZGluZ1ZhbHVlUmVmZXJlbmNlLCBDYWNoZUxvYWRlcjw/IHN1cGVyIEssIFY+IGxvYWRlcikgeworICAgICAgICAgICAgZmluYWwgTGlzdGVuYWJsZUZ1dHVyZTxWPiBsb2FkaW5nRnV0dXJlID0gbG9hZGluZ1ZhbHVlUmVmZXJlbmNlLmxvYWRGdXR1cmUoa2V5LCBsb2FkZXIpOworICAgICAgICAgICAgbG9hZGluZ0Z1dHVyZS5hZGRMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICAgICAgbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgViBuZXdWYWx1ZSA9IGdldEFuZFJlY29yZFN0YXRzKGtleSwgaGFzaCwgbG9hZGluZ1ZhbHVlUmVmZXJlbmNlLCBsb2FkaW5nRnV0dXJlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIubG9nKExldmVsLldBUk5JTkcsICJFeGNlcHRpb24gdGhyb3duIGR1cmluZyByZWZyZXNoIiwgdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRpbmdWYWx1ZVJlZmVyZW5jZS5zZXRFeGNlcHRpb24odCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9LCBkaXJlY3RFeGVjdXRvcigpKTsKKyAgICAgICAgICAgIHJldHVybiBsb2FkaW5nRnV0dXJlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdhaXRzIHVuaW50ZXJydXB0aWJseSBmb3Ige0Bjb2RlIG5ld1ZhbHVlfSB0byBiZSBsb2FkZWQsIGFuZCB0aGVuIHJlY29yZHMgbG9hZGluZyBzdGF0cy4KKyAgICAgICAgICovCisgICAgICAgIFYgZ2V0QW5kUmVjb3JkU3RhdHMoSyBrZXksIGludCBoYXNoLCBMb2FkaW5nVmFsdWVSZWZlcmVuY2U8SywgVj4gbG9hZGluZ1ZhbHVlUmVmZXJlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3RlbmFibGVGdXR1cmU8Vj4gbmV3VmFsdWUpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgViB2YWx1ZSA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0VW5pbnRlcnJ1cHRpYmx5KG5ld1ZhbHVlKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ2FjaGVMb2FkZXIuSW52YWxpZENhY2hlTG9hZEV4Y2VwdGlvbigiQ2FjaGVMb2FkZXIgcmV0dXJuZWQgbnVsbCBmb3Iga2V5ICIgKyBrZXkgKyAiLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdG9yZUxvYWRlZFZhbHVlKGtleSwgaGFzaCwgbG9hZGluZ1ZhbHVlUmVmZXJlbmNlLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZW1vdmVMb2FkaW5nVmFsdWUoa2V5LCBoYXNoLCBsb2FkaW5nVmFsdWVSZWZlcmVuY2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFYgc2NoZWR1bGVSZWZyZXNoKFJlZmVyZW5jZUVudHJ5PEssIFY+IGVudHJ5LCBLIGtleSwgaW50IGhhc2gsIFYgb2xkVmFsdWUsIGxvbmcgbm93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDYWNoZUxvYWRlcjw/IHN1cGVyIEssIFY+IGxvYWRlcikgeworICAgICAgICAgICAgaWYgKG1hcC5yZWZyZXNoZXMoKSAmJiAobm93IC0gZW50cnkuZ2V0V3JpdGVUaW1lKCkgPiBtYXAucmVmcmVzaE5hbm9zKQorICAgICAgICAgICAgICAgICAgICAmJiAhZW50cnkuZ2V0VmFsdWVSZWZlcmVuY2UoKS5pc0xvYWRpbmcoKSkgeworICAgICAgICAgICAgICAgIFYgbmV3VmFsdWUgPSByZWZyZXNoKGtleSwgaGFzaCwgbG9hZGVyLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3VmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG9sZFZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlZnJlc2hlcyB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHtAY29kZSBrZXl9LCB1bmxlc3MgYW5vdGhlciB0aHJlYWQgaXMgYWxyZWFkeSBkb2luZyBzby4KKyAgICAgICAgICogUmV0dXJucyB0aGUgbmV3bHkgcmVmcmVzaGVkIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB7QGNvZGUga2V5fSBpZiBpdCB3YXMgcmVmcmVzaGVkIGlubGluZSwgb3IKKyAgICAgICAgICoge0Bjb2RlIG51bGx9IGlmIGFub3RoZXIgdGhyZWFkIGlzIHBlcmZvcm1pbmcgdGhlIHJlZnJlc2ggb3IgaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZworICAgICAgICAgKiByZWZyZXNoLgorICAgICAgICAgKi8KKyAgICAgICAgViByZWZyZXNoKEsga2V5LCBpbnQgaGFzaCwgQ2FjaGVMb2FkZXI8PyBzdXBlciBLLCBWPiBsb2FkZXIsIGJvb2xlYW4gY2hlY2tUaW1lKSB7CisgICAgICAgICAgICBmaW5hbCBMb2FkaW5nVmFsdWVSZWZlcmVuY2U8SywgVj4gbG9hZGluZ1ZhbHVlUmVmZXJlbmNlID0KKyAgICAgICAgICAgICAgICAgICAgaW5zZXJ0TG9hZGluZ1ZhbHVlUmVmZXJlbmNlKGtleSwgaGFzaCwgY2hlY2tUaW1lKTsKKyAgICAgICAgICAgIGlmIChsb2FkaW5nVmFsdWVSZWZlcmVuY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMaXN0ZW5hYmxlRnV0dXJlPFY+IHJlc3VsdCA9IGxvYWRBc3luYyhrZXksIGhhc2gsIGxvYWRpbmdWYWx1ZVJlZmVyZW5jZSwgbG9hZGVyKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQuaXNEb25lKCkpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gVW5pbnRlcnJ1cHRpYmxlcy5nZXRVbmludGVycnVwdGlibHkocmVzdWx0KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBsZXQgcmVmcmVzaCBleGNlcHRpb25zIHByb3BhZ2F0ZTsgZXJyb3Igd2FzIGFscmVhZHkgbG9nZ2VkCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyBhIG5ld2x5IGluc2VydGVkIHtAY29kZSBMb2FkaW5nVmFsdWVSZWZlcmVuY2V9LCBvciBudWxsIGlmIHRoZSBsaXZlIHZhbHVlIHJlZmVyZW5jZQorICAgICAgICAgKiBpcyBhbHJlYWR5IGxvYWRpbmcuCisgICAgICAgICAqLworICAgICAgICBMb2FkaW5nVmFsdWVSZWZlcmVuY2U8SywgVj4gaW5zZXJ0TG9hZGluZ1ZhbHVlUmVmZXJlbmNlKGZpbmFsIEsga2V5LCBmaW5hbCBpbnQgaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGNoZWNrVGltZSkgeworICAgICAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gZSA9IG51bGw7CisgICAgICAgICAgICBsb2NrKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGxvbmcgbm93ID0gbWFwLnRpY2tlci5yZWFkKCk7CisgICAgICAgICAgICAgICAgcHJlV3JpdGVDbGVhbnVwKG5vdyk7CisKKyAgICAgICAgICAgICAgICBBdG9taWNSZWZlcmVuY2VBcnJheTxSZWZlcmVuY2VFbnRyeTxLLCBWPj4gdGFibGUgPSB0aGlzLnRhYmxlOworICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGhhc2ggJiAodGFibGUubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBmaXJzdCA9IHRhYmxlLmdldChpbmRleCk7CisKKyAgICAgICAgICAgICAgICAvLyBMb29rIGZvciBhbiBleGlzdGluZyBlbnRyeS4KKyAgICAgICAgICAgICAgICBmb3IgKGUgPSBmaXJzdDsgZSAhPSBudWxsOyBlID0gZS5nZXROZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgSyBlbnRyeUtleSA9IGUuZ2V0S2V5KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlLmdldEhhc2goKSA9PSBoYXNoICYmIGVudHJ5S2V5ICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtYXAua2V5RXF1aXZhbGVuY2UuZXF1aXZhbGVudChrZXksIGVudHJ5S2V5KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZm91bmQgYW4gZXhpc3RpbmcgZW50cnkuCisKKyAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlUmVmZXJlbmNlPEssIFY+IHZhbHVlUmVmZXJlbmNlID0gZS5nZXRWYWx1ZVJlZmVyZW5jZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlUmVmZXJlbmNlLmlzTG9hZGluZygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChjaGVja1RpbWUgJiYgKG5vdyAtIGUuZ2V0V3JpdGVUaW1lKCkgPCBtYXAucmVmcmVzaE5hbm9zKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWZyZXNoIGlzIGEgbm8tb3AgaWYgbG9hZGluZyBpcyBwZW5kaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgY2hlY2tUaW1lLCB3ZSB3YW50IHRvIGNoZWNrICphZnRlciogYWNxdWlyaW5nIHRoZSBsb2NrIGlmIHJlZnJlc2ggc3RpbGwgbmVlZHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBiZSBzY2hlZHVsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29udGludWUgcmV0dXJuaW5nIG9sZCB2YWx1ZSB3aGlsZSBsb2FkaW5nCisgICAgICAgICAgICAgICAgICAgICAgICArK21vZENvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgTG9hZGluZ1ZhbHVlUmVmZXJlbmNlPEssIFY+IGxvYWRpbmdWYWx1ZVJlZmVyZW5jZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMb2FkaW5nVmFsdWVSZWZlcmVuY2U8SywgVj4odmFsdWVSZWZlcmVuY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgZS5zZXRWYWx1ZVJlZmVyZW5jZShsb2FkaW5nVmFsdWVSZWZlcmVuY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvYWRpbmdWYWx1ZVJlZmVyZW5jZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICsrbW9kQ291bnQ7CisgICAgICAgICAgICAgICAgTG9hZGluZ1ZhbHVlUmVmZXJlbmNlPEssIFY+IGxvYWRpbmdWYWx1ZVJlZmVyZW5jZSA9IG5ldyBMb2FkaW5nVmFsdWVSZWZlcmVuY2U8SywgVj4oKTsKKyAgICAgICAgICAgICAgICBlID0gbmV3RW50cnkoa2V5LCBoYXNoLCBmaXJzdCk7CisgICAgICAgICAgICAgICAgZS5zZXRWYWx1ZVJlZmVyZW5jZShsb2FkaW5nVmFsdWVSZWZlcmVuY2UpOworICAgICAgICAgICAgICAgIHRhYmxlLnNldChpbmRleCwgZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxvYWRpbmdWYWx1ZVJlZmVyZW5jZTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgICAgICAgICAgcG9zdFdyaXRlQ2xlYW51cCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gcmVmZXJlbmNlIHF1ZXVlcywgZm9yIGdhcmJhZ2UgY29sbGVjdGlvbiBjbGVhbnVwCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENsZWFudXAgY29sbGVjdGVkIGVudHJpZXMgd2hlbiB0aGUgbG9jayBpcyBhdmFpbGFibGUuCisgICAgICAgICAqLworICAgICAgICB2b2lkIHRyeURyYWluUmVmZXJlbmNlUXVldWVzKCkgeworICAgICAgICAgICAgaWYgKHRyeUxvY2soKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGRyYWluUmVmZXJlbmNlUXVldWVzKCk7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIERyYWluIHRoZSBrZXkgYW5kIHZhbHVlIHJlZmVyZW5jZSBxdWV1ZXMsIGNsZWFuaW5nIHVwIGludGVybmFsIGVudHJpZXMgY29udGFpbmluZyBnYXJiYWdlCisgICAgICAgICAqIGNvbGxlY3RlZCBrZXlzIG9yIHZhbHVlcy4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgZHJhaW5SZWZlcmVuY2VRdWV1ZXMoKSB7CisgICAgICAgICAgICBpZiAobWFwLnVzZXNLZXlSZWZlcmVuY2VzKCkpIHsKKyAgICAgICAgICAgICAgICBkcmFpbktleVJlZmVyZW5jZVF1ZXVlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWFwLnVzZXNWYWx1ZVJlZmVyZW5jZXMoKSkgeworICAgICAgICAgICAgICAgIGRyYWluVmFsdWVSZWZlcmVuY2VRdWV1ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdm9pZCBkcmFpbktleVJlZmVyZW5jZVF1ZXVlKCkgeworICAgICAgICAgICAgUmVmZXJlbmNlPD8gZXh0ZW5kcyBLPiByZWY7CisgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICB3aGlsZSAoKHJlZiA9IGtleVJlZmVyZW5jZVF1ZXVlLnBvbGwoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICAgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IGVudHJ5ID0gKFJlZmVyZW5jZUVudHJ5PEssIFY+KSByZWY7CisgICAgICAgICAgICAgICAgbWFwLnJlY2xhaW1LZXkoZW50cnkpOworICAgICAgICAgICAgICAgIGlmICgrK2kgPT0gRFJBSU5fTUFYKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgZHJhaW5WYWx1ZVJlZmVyZW5jZVF1ZXVlKCkgeworICAgICAgICAgICAgUmVmZXJlbmNlPD8gZXh0ZW5kcyBWPiByZWY7CisgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICB3aGlsZSAoKHJlZiA9IHZhbHVlUmVmZXJlbmNlUXVldWUucG9sbCgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgICAgICAgICAgVmFsdWVSZWZlcmVuY2U8SywgVj4gdmFsdWVSZWZlcmVuY2UgPSAoVmFsdWVSZWZlcmVuY2U8SywgVj4pIHJlZjsKKyAgICAgICAgICAgICAgICBtYXAucmVjbGFpbVZhbHVlKHZhbHVlUmVmZXJlbmNlKTsKKyAgICAgICAgICAgICAgICBpZiAoKytpID09IERSQUlOX01BWCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2xlYXJzIGFsbCBlbnRyaWVzIGZyb20gdGhlIGtleSBhbmQgdmFsdWUgcmVmZXJlbmNlIHF1ZXVlcy4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgY2xlYXJSZWZlcmVuY2VRdWV1ZXMoKSB7CisgICAgICAgICAgICBpZiAobWFwLnVzZXNLZXlSZWZlcmVuY2VzKCkpIHsKKyAgICAgICAgICAgICAgICBjbGVhcktleVJlZmVyZW5jZVF1ZXVlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWFwLnVzZXNWYWx1ZVJlZmVyZW5jZXMoKSkgeworICAgICAgICAgICAgICAgIGNsZWFyVmFsdWVSZWZlcmVuY2VRdWV1ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdm9pZCBjbGVhcktleVJlZmVyZW5jZVF1ZXVlKCkgeworICAgICAgICAgICAgd2hpbGUgKGtleVJlZmVyZW5jZVF1ZXVlLnBvbGwoKSAhPSBudWxsKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGNsZWFyVmFsdWVSZWZlcmVuY2VRdWV1ZSgpIHsKKyAgICAgICAgICAgIHdoaWxlICh2YWx1ZVJlZmVyZW5jZVF1ZXVlLnBvbGwoKSAhPSBudWxsKSB7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyByZWNlbmN5IHF1ZXVlLCBzaGFyZWQgYnkgZXhwaXJhdGlvbiBhbmQgZXZpY3Rpb24KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVjb3JkcyB0aGUgcmVsYXRpdmUgb3JkZXIgaW4gd2hpY2ggdGhpcyByZWFkIHdhcyBwZXJmb3JtZWQgYnkgYWRkaW5nIHtAY29kZSBlbnRyeX0gdG8gdGhlCisgICAgICAgICAqIHJlY2VuY3kgcXVldWUuIEF0IHdyaXRlLXRpbWUsIG9yIHdoZW4gdGhlIHF1ZXVlIGlzIGZ1bGwgcGFzdCB0aGUgdGhyZXNob2xkLCB0aGUgcXVldWUgd2lsbAorICAgICAgICAgKiBiZSBkcmFpbmVkIGFuZCB0aGUgZW50cmllcyB0aGVyZWluIHByb2Nlc3NlZC4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIDxwPk5vdGU6IGxvY2tlZCByZWFkcyBzaG91bGQgdXNlIHtAbGluayAjcmVjb3JkTG9ja2VkUmVhZH0uCisgICAgICAgICAqLworICAgICAgICB2b2lkIHJlY29yZFJlYWQoUmVmZXJlbmNlRW50cnk8SywgVj4gZW50cnksIGxvbmcgbm93KSB7CisgICAgICAgICAgICBpZiAobWFwLnJlY29yZHNBY2Nlc3MoKSkgeworICAgICAgICAgICAgICAgIGVudHJ5LnNldEFjY2Vzc1RpbWUobm93KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlY2VuY3lRdWV1ZS5hZGQoZW50cnkpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFVwZGF0ZXMgdGhlIGV2aWN0aW9uIG1ldGFkYXRhIHRoYXQge0Bjb2RlIGVudHJ5fSB3YXMganVzdCByZWFkLiBUaGlzIGN1cnJlbnRseSBhbW91bnRzIHRvCisgICAgICAgICAqIGFkZGluZyB7QGNvZGUgZW50cnl9IHRvIHJlbGV2YW50IGV2aWN0aW9uIGxpc3RzLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogPHA+Tm90ZTogdGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHVuZGVyIGxvY2ssIGFzIGl0IGRpcmVjdGx5IG1hbmlwdWxhdGVzIHRoZQorICAgICAgICAgKiBldmljdGlvbiBxdWV1ZXMuIFVubG9ja2VkIHJlYWRzIHNob3VsZCB1c2Uge0BsaW5rICNyZWNvcmRSZWFkfS4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgcmVjb3JkTG9ja2VkUmVhZChSZWZlcmVuY2VFbnRyeTxLLCBWPiBlbnRyeSwgbG9uZyBub3cpIHsKKyAgICAgICAgICAgIGlmIChtYXAucmVjb3Jkc0FjY2VzcygpKSB7CisgICAgICAgICAgICAgICAgZW50cnkuc2V0QWNjZXNzVGltZShub3cpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWNjZXNzUXVldWUuYWRkKGVudHJ5KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBVcGRhdGVzIGV2aWN0aW9uIG1ldGFkYXRhIHRoYXQge0Bjb2RlIGVudHJ5fSB3YXMganVzdCB3cml0dGVuLiBUaGlzIGN1cnJlbnRseSBhbW91bnRzIHRvCisgICAgICAgICAqIGFkZGluZyB7QGNvZGUgZW50cnl9IHRvIHJlbGV2YW50IGV2aWN0aW9uIGxpc3RzLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCByZWNvcmRXcml0ZShSZWZlcmVuY2VFbnRyeTxLLCBWPiBlbnRyeSwgaW50IHdlaWdodCwgbG9uZyBub3cpIHsKKyAgICAgICAgICAgIC8vIHdlIGFyZSBhbHJlYWR5IHVuZGVyIGxvY2ssIHNvIGRyYWluIHRoZSByZWNlbmN5IHF1ZXVlIGltbWVkaWF0ZWx5CisgICAgICAgICAgICBkcmFpblJlY2VuY3lRdWV1ZSgpOworICAgICAgICAgICAgdG90YWxXZWlnaHQgKz0gd2VpZ2h0OworCisgICAgICAgICAgICBpZiAobWFwLnJlY29yZHNBY2Nlc3MoKSkgeworICAgICAgICAgICAgICAgIGVudHJ5LnNldEFjY2Vzc1RpbWUobm93KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtYXAucmVjb3Jkc1dyaXRlKCkpIHsKKyAgICAgICAgICAgICAgICBlbnRyeS5zZXRXcml0ZVRpbWUobm93KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFjY2Vzc1F1ZXVlLmFkZChlbnRyeSk7CisgICAgICAgICAgICB3cml0ZVF1ZXVlLmFkZChlbnRyeSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRHJhaW5zIHRoZSByZWNlbmN5IHF1ZXVlLCB1cGRhdGluZyBldmljdGlvbiBtZXRhZGF0YSB0aGF0IHRoZSBlbnRyaWVzIHRoZXJlaW4gd2VyZSByZWFkIGluCisgICAgICAgICAqIHRoZSBzcGVjaWZpZWQgcmVsYXRpdmUgb3JkZXIuIFRoaXMgY3VycmVudGx5IGFtb3VudHMgdG8gYWRkaW5nIHRoZW0gdG8gcmVsZXZhbnQgZXZpY3Rpb24KKyAgICAgICAgICogbGlzdHMgKGFjY291bnRpbmcgZm9yIHRoZSBmYWN0IHRoYXQgdGhleSBjb3VsZCBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBtYXAgc2luY2UgYmVpbmcKKyAgICAgICAgICogYWRkZWQgdG8gdGhlIHJlY2VuY3kgcXVldWUpLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBkcmFpblJlY2VuY3lRdWV1ZSgpIHsKKyAgICAgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IGU7CisgICAgICAgICAgICB3aGlsZSAoKGUgPSByZWNlbmN5UXVldWUucG9sbCgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gQW4gZW50cnkgbWF5IGJlIGluIHRoZSByZWNlbmN5IHF1ZXVlIGRlc3BpdGUgaXQgYmVpbmcgcmVtb3ZlZCBmcm9tCisgICAgICAgICAgICAgICAgLy8gdGhlIG1hcCAuIFRoaXMgY2FuIG9jY3VyIHdoZW4gdGhlIGVudHJ5IHdhcyBjb25jdXJyZW50bHkgcmVhZCB3aGlsZSBhCisgICAgICAgICAgICAgICAgLy8gd3JpdGVyIGlzIHJlbW92aW5nIGl0IGZyb20gdGhlIHNlZ21lbnQgb3IgYWZ0ZXIgYSBjbGVhciBoYXMgcmVtb3ZlZAorICAgICAgICAgICAgICAgIC8vIGFsbCBvZiB0aGUgc2VnbWVudCdzIGVudHJpZXMuCisgICAgICAgICAgICAgICAgaWYgKGFjY2Vzc1F1ZXVlLmNvbnRhaW5zKGUpKSB7CisgICAgICAgICAgICAgICAgICAgIGFjY2Vzc1F1ZXVlLmFkZChlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBleHBpcmF0aW9uCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENsZWFudXAgZXhwaXJlZCBlbnRyaWVzIHdoZW4gdGhlIGxvY2sgaXMgYXZhaWxhYmxlLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCB0cnlFeHBpcmVFbnRyaWVzKGxvbmcgbm93KSB7CisgICAgICAgICAgICBpZiAodHJ5TG9jaygpKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZXhwaXJlRW50cmllcyhub3cpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBjYWxsIHBvc3RXcml0ZUNsZWFudXAgYXMgd2UncmUgaW4gYSByZWFkCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdm9pZCBleHBpcmVFbnRyaWVzKGxvbmcgbm93KSB7CisgICAgICAgICAgICBkcmFpblJlY2VuY3lRdWV1ZSgpOworCisgICAgICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBlOworICAgICAgICAgICAgd2hpbGUgKChlID0gd3JpdGVRdWV1ZS5wZWVrKCkpICE9IG51bGwgJiYgbWFwLmlzRXhwaXJlZChlLCBub3cpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFyZW1vdmVFbnRyeShlLCBlLmdldEhhc2goKSwgUmVtb3ZhbENhdXNlLkVYUElSRUQpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlICgoZSA9IGFjY2Vzc1F1ZXVlLnBlZWsoKSkgIT0gbnVsbCAmJiBtYXAuaXNFeHBpcmVkKGUsIG5vdykpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXJlbW92ZUVudHJ5KGUsIGUuZ2V0SGFzaCgpLCBSZW1vdmFsQ2F1c2UuRVhQSVJFRCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gZXZpY3Rpb24KKworICAgICAgICB2b2lkIGVucXVldWVOb3RpZmljYXRpb24oUmVmZXJlbmNlRW50cnk8SywgVj4gZW50cnksIFJlbW92YWxDYXVzZSBjYXVzZSkgeworICAgICAgICAgICAgZW5xdWV1ZU5vdGlmaWNhdGlvbihlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0SGFzaCgpLCBlbnRyeS5nZXRWYWx1ZVJlZmVyZW5jZSgpLCBjYXVzZSk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGVucXVldWVOb3RpZmljYXRpb24oSyBrZXksIGludCBoYXNoLCBWYWx1ZVJlZmVyZW5jZTxLLCBWPiB2YWx1ZVJlZmVyZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbW92YWxDYXVzZSBjYXVzZSkgeworICAgICAgICAgICAgdG90YWxXZWlnaHQgLT0gdmFsdWVSZWZlcmVuY2UuZ2V0V2VpZ2h0KCk7CisgICAgICAgICAgICBpZiAobWFwLnJlbW92YWxOb3RpZmljYXRpb25RdWV1ZSAhPSBESVNDQVJESU5HX1FVRVVFKSB7CisgICAgICAgICAgICAgICAgViB2YWx1ZSA9IHZhbHVlUmVmZXJlbmNlLmdldCgpOworICAgICAgICAgICAgICAgIFJlbW92YWxOb3RpZmljYXRpb248SywgVj4gbm90aWZpY2F0aW9uID0gbmV3IFJlbW92YWxOb3RpZmljYXRpb248SywgVj4oa2V5LCB2YWx1ZSwgY2F1c2UpOworICAgICAgICAgICAgICAgIG1hcC5yZW1vdmFsTm90aWZpY2F0aW9uUXVldWUub2ZmZXIobm90aWZpY2F0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBQZXJmb3JtcyBldmljdGlvbiBpZiB0aGUgc2VnbWVudCBpcyBmdWxsLiBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBwcmlvciB0byBhZGRpbmcgYSBuZXcKKyAgICAgICAgICogZW50cnkgYW5kIGluY3JlYXNpbmcge0Bjb2RlIGNvdW50fS4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgZXZpY3RFbnRyaWVzKCkgeworICAgICAgICAgICAgaWYgKCFtYXAuZXZpY3RzQnlTaXplKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRyYWluUmVjZW5jeVF1ZXVlKCk7CisgICAgICAgICAgICB3aGlsZSAodG90YWxXZWlnaHQgPiBtYXhTZWdtZW50V2VpZ2h0KSB7CisgICAgICAgICAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gZSA9IGdldE5leHRFdmljdGFibGUoKTsKKyAgICAgICAgICAgICAgICBpZiAoIXJlbW92ZUVudHJ5KGUsIGUuZ2V0SGFzaCgpLCBSZW1vdmFsQ2F1c2UuU0laRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETyhmcnkpOiBpbnN0ZWFkIGltcGxlbWVudCB0aGlzIHdpdGggYW4gZXZpY3Rpb24gaGVhZAorICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBnZXROZXh0RXZpY3RhYmxlKCkgeworICAgICAgICAgICAgZm9yIChSZWZlcmVuY2VFbnRyeTxLLCBWPiBlIDogYWNjZXNzUXVldWUpIHsKKyAgICAgICAgICAgICAgICBpbnQgd2VpZ2h0ID0gZS5nZXRWYWx1ZVJlZmVyZW5jZSgpLmdldFdlaWdodCgpOworICAgICAgICAgICAgICAgIGlmICh3ZWlnaHQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgZmlyc3QgZW50cnkgb2YgYmluIGZvciBnaXZlbiBoYXNoLgorICAgICAgICAgKi8KKyAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gZ2V0Rmlyc3QoaW50IGhhc2gpIHsKKyAgICAgICAgICAgIC8vIHJlYWQgdGhpcyB2b2xhdGlsZSBmaWVsZCBvbmx5IG9uY2UKKyAgICAgICAgICAgIEF0b21pY1JlZmVyZW5jZUFycmF5PFJlZmVyZW5jZUVudHJ5PEssIFY+PiB0YWJsZSA9IHRoaXMudGFibGU7CisgICAgICAgICAgICByZXR1cm4gdGFibGUuZ2V0KGhhc2ggJiAodGFibGUubGVuZ3RoKCkgLSAxKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTcGVjaWFsaXplZCBpbXBsZW1lbnRhdGlvbnMgb2YgbWFwIG1ldGhvZHMKKworICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBnZXRFbnRyeShPYmplY3Qga2V5LCBpbnQgaGFzaCkgeworICAgICAgICAgICAgZm9yIChSZWZlcmVuY2VFbnRyeTxLLCBWPiBlID0gZ2V0Rmlyc3QoaGFzaCk7IGUgIT0gbnVsbDsgZSA9IGUuZ2V0TmV4dCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGUuZ2V0SGFzaCgpICE9IGhhc2gpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgSyBlbnRyeUtleSA9IGUuZ2V0S2V5KCk7CisgICAgICAgICAgICAgICAgaWYgKGVudHJ5S2V5ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5RHJhaW5SZWZlcmVuY2VRdWV1ZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG1hcC5rZXlFcXVpdmFsZW5jZS5lcXVpdmFsZW50KGtleSwgZW50cnlLZXkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBnZXRMaXZlRW50cnkoT2JqZWN0IGtleSwgaW50IGhhc2gsIGxvbmcgbm93KSB7CisgICAgICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBlID0gZ2V0RW50cnkoa2V5LCBoYXNoKTsKKyAgICAgICAgICAgIGlmIChlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobWFwLmlzRXhwaXJlZChlLCBub3cpKSB7CisgICAgICAgICAgICAgICAgdHJ5RXhwaXJlRW50cmllcyhub3cpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB0aGUgdmFsdWUgZnJvbSBhbiBlbnRyeS4gUmV0dXJucyBudWxsIGlmIHRoZSBlbnRyeSBpcyBpbnZhbGlkLCBwYXJ0aWFsbHktY29sbGVjdGVkLAorICAgICAgICAgKiBsb2FkaW5nLCBvciBleHBpcmVkLgorICAgICAgICAgKi8KKyAgICAgICAgViBnZXRMaXZlVmFsdWUoUmVmZXJlbmNlRW50cnk8SywgVj4gZW50cnksIGxvbmcgbm93KSB7CisgICAgICAgICAgICBpZiAoZW50cnkuZ2V0S2V5KCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeURyYWluUmVmZXJlbmNlUXVldWVzKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBWIHZhbHVlID0gZW50cnkuZ2V0VmFsdWVSZWZlcmVuY2UoKS5nZXQoKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5RHJhaW5SZWZlcmVuY2VRdWV1ZXMoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1hcC5pc0V4cGlyZWQoZW50cnksIG5vdykpIHsKKyAgICAgICAgICAgICAgICB0cnlFeHBpcmVFbnRyaWVzKG5vdyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBWIGdldChPYmplY3Qga2V5LCBpbnQgaGFzaCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoY291bnQgIT0gMCkgeyAvLyByZWFkLXZvbGF0aWxlCisgICAgICAgICAgICAgICAgICAgIGxvbmcgbm93ID0gbWFwLnRpY2tlci5yZWFkKCk7CisgICAgICAgICAgICAgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IGUgPSBnZXRMaXZlRW50cnkoa2V5LCBoYXNoLCBub3cpOworICAgICAgICAgICAgICAgICAgICBpZiAoZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIFYgdmFsdWUgPSBlLmdldFZhbHVlUmVmZXJlbmNlKCkuZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRSZWFkKGUsIG5vdyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2NoZWR1bGVSZWZyZXNoKGUsIGUuZ2V0S2V5KCksIGhhc2gsIHZhbHVlLCBub3csIG1hcC5kZWZhdWx0TG9hZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0cnlEcmFpblJlZmVyZW5jZVF1ZXVlcygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgcG9zdFJlYWRDbGVhbnVwKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGNvbnRhaW5zS2V5KE9iamVjdCBrZXksIGludCBoYXNoKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChjb3VudCAhPSAwKSB7IC8vIHJlYWQtdm9sYXRpbGUKKyAgICAgICAgICAgICAgICAgICAgbG9uZyBub3cgPSBtYXAudGlja2VyLnJlYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gZSA9IGdldExpdmVFbnRyeShrZXksIGhhc2gsIG5vdyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS5nZXRWYWx1ZVJlZmVyZW5jZSgpLmdldCgpICE9IG51bGw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBwb3N0UmVhZENsZWFudXAoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFYgcHV0KEsga2V5LCBpbnQgaGFzaCwgViB2YWx1ZSwgYm9vbGVhbiBvbmx5SWZBYnNlbnQpIHsKKyAgICAgICAgICAgIGxvY2soKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbG9uZyBub3cgPSBtYXAudGlja2VyLnJlYWQoKTsKKyAgICAgICAgICAgICAgICBwcmVXcml0ZUNsZWFudXAobm93KTsKKworICAgICAgICAgICAgICAgIGludCBuZXdDb3VudCA9IHRoaXMuY291bnQgKyAxOworICAgICAgICAgICAgICAgIGlmIChuZXdDb3VudCA+IHRoaXMudGhyZXNob2xkKSB7IC8vIGVuc3VyZSBjYXBhY2l0eQorICAgICAgICAgICAgICAgICAgICBleHBhbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3Q291bnQgPSB0aGlzLmNvdW50ICsgMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBBdG9taWNSZWZlcmVuY2VBcnJheTxSZWZlcmVuY2VFbnRyeTxLLCBWPj4gdGFibGUgPSB0aGlzLnRhYmxlOworICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGhhc2ggJiAodGFibGUubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBmaXJzdCA9IHRhYmxlLmdldChpbmRleCk7CisKKyAgICAgICAgICAgICAgICAvLyBMb29rIGZvciBhbiBleGlzdGluZyBlbnRyeS4KKyAgICAgICAgICAgICAgICBmb3IgKFJlZmVyZW5jZUVudHJ5PEssIFY+IGUgPSBmaXJzdDsgZSAhPSBudWxsOyBlID0gZS5nZXROZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgSyBlbnRyeUtleSA9IGUuZ2V0S2V5KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlLmdldEhhc2goKSA9PSBoYXNoICYmIGVudHJ5S2V5ICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtYXAua2V5RXF1aXZhbGVuY2UuZXF1aXZhbGVudChrZXksIGVudHJ5S2V5KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZm91bmQgYW4gZXhpc3RpbmcgZW50cnkuCisKKyAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlUmVmZXJlbmNlPEssIFY+IHZhbHVlUmVmZXJlbmNlID0gZS5nZXRWYWx1ZVJlZmVyZW5jZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgViBlbnRyeVZhbHVlID0gdmFsdWVSZWZlcmVuY2UuZ2V0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeVZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArK21vZENvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZVJlZmVyZW5jZS5pc0FjdGl2ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVucXVldWVOb3RpZmljYXRpb24oa2V5LCBoYXNoLCB2YWx1ZVJlZmVyZW5jZSwgUmVtb3ZhbENhdXNlLkNPTExFQ1RFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhbHVlKGUsIGtleSwgdmFsdWUsIG5vdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvdW50ID0gdGhpcy5jb3VudDsgLy8gY291bnQgcmVtYWlucyB1bmNoYW5nZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRWYWx1ZShlLCBrZXksIHZhbHVlLCBub3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb3VudCA9IHRoaXMuY291bnQgKyAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvdW50ID0gbmV3Q291bnQ7IC8vIHdyaXRlLXZvbGF0aWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZpY3RFbnRyaWVzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9ubHlJZkFic2VudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1pbWljCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gImlmICghbWFwLmNvbnRhaW5zS2V5KGtleSkpIC4uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVsc2UgcmV0dXJuIG1hcC5nZXQoa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRMb2NrZWRSZWFkKGUsIG5vdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5VmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsb2JiZXIgZXhpc3RpbmcgZW50cnksIGNvdW50IHJlbWFpbnMgdW5jaGFuZ2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyttb2RDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnF1ZXVlTm90aWZpY2F0aW9uKGtleSwgaGFzaCwgdmFsdWVSZWZlcmVuY2UsIFJlbW92YWxDYXVzZS5SRVBMQUNFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VmFsdWUoZSwga2V5LCB2YWx1ZSwgbm93KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmljdEVudHJpZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnlWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBlbnRyeS4KKyAgICAgICAgICAgICAgICArK21vZENvdW50OworICAgICAgICAgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5ld0VudHJ5ID0gbmV3RW50cnkoa2V5LCBoYXNoLCBmaXJzdCk7CisgICAgICAgICAgICAgICAgc2V0VmFsdWUobmV3RW50cnksIGtleSwgdmFsdWUsIG5vdyk7CisgICAgICAgICAgICAgICAgdGFibGUuc2V0KGluZGV4LCBuZXdFbnRyeSk7CisgICAgICAgICAgICAgICAgbmV3Q291bnQgPSB0aGlzLmNvdW50ICsgMTsKKyAgICAgICAgICAgICAgICB0aGlzLmNvdW50ID0gbmV3Q291bnQ7IC8vIHdyaXRlLXZvbGF0aWxlCisgICAgICAgICAgICAgICAgZXZpY3RFbnRyaWVzKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICAgICAgICAgIHBvc3RXcml0ZUNsZWFudXAoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBFeHBhbmRzIHRoZSB0YWJsZSBpZiBwb3NzaWJsZS4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgZXhwYW5kKCkgeworICAgICAgICAgICAgQXRvbWljUmVmZXJlbmNlQXJyYXk8UmVmZXJlbmNlRW50cnk8SywgVj4+IG9sZFRhYmxlID0gdGFibGU7CisgICAgICAgICAgICBpbnQgb2xkQ2FwYWNpdHkgPSBvbGRUYWJsZS5sZW5ndGgoKTsKKyAgICAgICAgICAgIGlmIChvbGRDYXBhY2l0eSA+PSBNQVhJTVVNX0NBUEFDSVRZKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAvKgorICAgICAgICogUmVjbGFzc2lmeSBub2RlcyBpbiBlYWNoIGxpc3QgdG8gbmV3IE1hcC4gQmVjYXVzZSB3ZSBhcmUgdXNpbmcgcG93ZXItb2YtdHdvIGV4cGFuc2lvbiwgdGhlCisgICAgICAgKiBlbGVtZW50cyBmcm9tIGVhY2ggYmluIG11c3QgZWl0aGVyIHN0YXkgYXQgc2FtZSBpbmRleCwgb3IgbW92ZSB3aXRoIGEgcG93ZXIgb2YgdHdvIG9mZnNldC4KKyAgICAgICAqIFdlIGVsaW1pbmF0ZSB1bm5lY2Vzc2FyeSBub2RlIGNyZWF0aW9uIGJ5IGNhdGNoaW5nIGNhc2VzIHdoZXJlIG9sZCBub2RlcyBjYW4gYmUgcmV1c2VkCisgICAgICAgKiBiZWNhdXNlIHRoZWlyIG5leHQgZmllbGRzIHdvbid0IGNoYW5nZS4gU3RhdGlzdGljYWxseSwgYXQgdGhlIGRlZmF1bHQgdGhyZXNob2xkLCBvbmx5CisgICAgICAgKiBhYm91dCBvbmUtc2l4dGggb2YgdGhlbSBuZWVkIGNsb25pbmcgd2hlbiBhIHRhYmxlIGRvdWJsZXMuIFRoZSBub2RlcyB0aGV5IHJlcGxhY2Ugd2lsbCBiZQorICAgICAgICogZ2FyYmFnZSBjb2xsZWN0YWJsZSBhcyBzb29uIGFzIHRoZXkgYXJlIG5vIGxvbmdlciByZWZlcmVuY2VkIGJ5IGFueSByZWFkZXIgdGhyZWFkIHRoYXQgbWF5CisgICAgICAgKiBiZSBpbiB0aGUgbWlkc3Qgb2YgdHJhdmVyc2luZyB0YWJsZSByaWdodCBub3cuCisgICAgICAgKi8KKworICAgICAgICAgICAgaW50IG5ld0NvdW50ID0gY291bnQ7CisgICAgICAgICAgICBBdG9taWNSZWZlcmVuY2VBcnJheTxSZWZlcmVuY2VFbnRyeTxLLCBWPj4gbmV3VGFibGUgPSBuZXdFbnRyeUFycmF5KG9sZENhcGFjaXR5IDw8IDEpOworICAgICAgICAgICAgdGhyZXNob2xkID0gbmV3VGFibGUubGVuZ3RoKCkgKiAzIC8gNDsKKyAgICAgICAgICAgIGludCBuZXdNYXNrID0gbmV3VGFibGUubGVuZ3RoKCkgLSAxOworICAgICAgICAgICAgZm9yIChpbnQgb2xkSW5kZXggPSAwOyBvbGRJbmRleCA8IG9sZENhcGFjaXR5OyArK29sZEluZGV4KSB7CisgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBndWFyYW50ZWUgdGhhdCBhbnkgZXhpc3RpbmcgcmVhZHMgb2Ygb2xkIE1hcCBjYW4KKyAgICAgICAgICAgICAgICAvLyBwcm9jZWVkLiBTbyB3ZSBjYW5ub3QgeWV0IG51bGwgb3V0IGVhY2ggYmluLgorICAgICAgICAgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IGhlYWQgPSBvbGRUYWJsZS5nZXQob2xkSW5kZXgpOworCisgICAgICAgICAgICAgICAgaWYgKGhlYWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXh0ID0gaGVhZC5nZXROZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIGludCBoZWFkSW5kZXggPSBoZWFkLmdldEhhc2goKSAmIG5ld01hc2s7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gU2luZ2xlIG5vZGUgb24gbGlzdAorICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdUYWJsZS5zZXQoaGVhZEluZGV4LCBoZWFkKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldXNlIHRoZSBjb25zZWN1dGl2ZSBzZXF1ZW5jZSBvZiBub2RlcyB3aXRoIHRoZSBzYW1lIHRhcmdldAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5kZXggZnJvbSB0aGUgZW5kIG9mIHRoZSBsaXN0LiB0YWlsIHBvaW50cyB0byB0aGUgZmlyc3QKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVudHJ5IGluIHRoZSByZXVzYWJsZSBsaXN0LgorICAgICAgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gdGFpbCA9IGhlYWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGFpbEluZGV4ID0gaGVhZEluZGV4OworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChSZWZlcmVuY2VFbnRyeTxLLCBWPiBlID0gbmV4dDsgZSAhPSBudWxsOyBlID0gZS5nZXROZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmV3SW5kZXggPSBlLmdldEhhc2goKSAmIG5ld01hc2s7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0luZGV4ICE9IHRhaWxJbmRleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgaW5kZXggY2hhbmdlZC4gV2UnbGwgbmVlZCB0byBjb3B5IHRoZSBwcmV2aW91cyBlbnRyeS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFpbEluZGV4ID0gbmV3SW5kZXg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhaWwgPSBlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RhYmxlLnNldCh0YWlsSW5kZXgsIHRhaWwpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDbG9uZSBub2RlcyBsZWFkaW5nIHVwIHRvIHRoZSB0YWlsLgorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChSZWZlcmVuY2VFbnRyeTxLLCBWPiBlID0gaGVhZDsgZSAhPSB0YWlsOyBlID0gZS5nZXROZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmV3SW5kZXggPSBlLmdldEhhc2goKSAmIG5ld01hc2s7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV3TmV4dCA9IG5ld1RhYmxlLmdldChuZXdJbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV3Rmlyc3QgPSBjb3B5RW50cnkoZSwgbmV3TmV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0ZpcnN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VGFibGUuc2V0KG5ld0luZGV4LCBuZXdGaXJzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQ29sbGVjdGVkRW50cnkoZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvdW50LS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdGFibGUgPSBuZXdUYWJsZTsKKyAgICAgICAgICAgIHRoaXMuY291bnQgPSBuZXdDb3VudDsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gcmVwbGFjZShLIGtleSwgaW50IGhhc2gsIFYgb2xkVmFsdWUsIFYgbmV3VmFsdWUpIHsKKyAgICAgICAgICAgIGxvY2soKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbG9uZyBub3cgPSBtYXAudGlja2VyLnJlYWQoKTsKKyAgICAgICAgICAgICAgICBwcmVXcml0ZUNsZWFudXAobm93KTsKKworICAgICAgICAgICAgICAgIEF0b21pY1JlZmVyZW5jZUFycmF5PFJlZmVyZW5jZUVudHJ5PEssIFY+PiB0YWJsZSA9IHRoaXMudGFibGU7CisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gaGFzaCAmICh0YWJsZS5sZW5ndGgoKSAtIDEpOworICAgICAgICAgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IGZpcnN0ID0gdGFibGUuZ2V0KGluZGV4KTsKKworICAgICAgICAgICAgICAgIGZvciAoUmVmZXJlbmNlRW50cnk8SywgVj4gZSA9IGZpcnN0OyBlICE9IG51bGw7IGUgPSBlLmdldE5leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBLIGVudHJ5S2V5ID0gZS5nZXRLZXkoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGUuZ2V0SGFzaCgpID09IGhhc2ggJiYgZW50cnlLZXkgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1hcC5rZXlFcXVpdmFsZW5jZS5lcXVpdmFsZW50KGtleSwgZW50cnlLZXkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZVJlZmVyZW5jZTxLLCBWPiB2YWx1ZVJlZmVyZW5jZSA9IGUuZ2V0VmFsdWVSZWZlcmVuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFYgZW50cnlWYWx1ZSA9IHZhbHVlUmVmZXJlbmNlLmdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5VmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZVJlZmVyZW5jZS5pc0FjdGl2ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSB2YWx1ZSBkaXNhcHBlYXJlZCwgdGhpcyBlbnRyeSBpcyBwYXJ0aWFsbHkgY29sbGVjdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmV3Q291bnQgPSB0aGlzLmNvdW50IC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyttb2RDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV3Rmlyc3QgPSByZW1vdmVWYWx1ZUZyb21DaGFpbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCwgZSwgZW50cnlLZXksIGhhc2gsIHZhbHVlUmVmZXJlbmNlLCBSZW1vdmFsQ2F1c2UuQ09MTEVDVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q291bnQgPSB0aGlzLmNvdW50IC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUuc2V0KGluZGV4LCBuZXdGaXJzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY291bnQgPSBuZXdDb3VudDsgLy8gd3JpdGUtdm9sYXRpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFwLnZhbHVlRXF1aXZhbGVuY2UuZXF1aXZhbGVudChvbGRWYWx1ZSwgZW50cnlWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArK21vZENvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVucXVldWVOb3RpZmljYXRpb24oa2V5LCBoYXNoLCB2YWx1ZVJlZmVyZW5jZSwgUmVtb3ZhbENhdXNlLlJFUExBQ0VEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRWYWx1ZShlLCBrZXksIG5ld1ZhbHVlLCBub3cpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2aWN0RW50cmllcygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNaW1pYworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICJpZiAobWFwLmNvbnRhaW5zS2V5KGtleSkgJiYgbWFwLmdldChrZXkpLmVxdWFscyhvbGRWYWx1ZSkpLi4uIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZExvY2tlZFJlYWQoZSwgbm93KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICAgICAgICAgIHBvc3RXcml0ZUNsZWFudXAoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFYgcmVwbGFjZShLIGtleSwgaW50IGhhc2gsIFYgbmV3VmFsdWUpIHsKKyAgICAgICAgICAgIGxvY2soKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbG9uZyBub3cgPSBtYXAudGlja2VyLnJlYWQoKTsKKyAgICAgICAgICAgICAgICBwcmVXcml0ZUNsZWFudXAobm93KTsKKworICAgICAgICAgICAgICAgIEF0b21pY1JlZmVyZW5jZUFycmF5PFJlZmVyZW5jZUVudHJ5PEssIFY+PiB0YWJsZSA9IHRoaXMudGFibGU7CisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gaGFzaCAmICh0YWJsZS5sZW5ndGgoKSAtIDEpOworICAgICAgICAgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IGZpcnN0ID0gdGFibGUuZ2V0KGluZGV4KTsKKworICAgICAgICAgICAgICAgIGZvciAoUmVmZXJlbmNlRW50cnk8SywgVj4gZSA9IGZpcnN0OyBlICE9IG51bGw7IGUgPSBlLmdldE5leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBLIGVudHJ5S2V5ID0gZS5nZXRLZXkoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGUuZ2V0SGFzaCgpID09IGhhc2ggJiYgZW50cnlLZXkgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1hcC5rZXlFcXVpdmFsZW5jZS5lcXVpdmFsZW50KGtleSwgZW50cnlLZXkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZVJlZmVyZW5jZTxLLCBWPiB2YWx1ZVJlZmVyZW5jZSA9IGUuZ2V0VmFsdWVSZWZlcmVuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFYgZW50cnlWYWx1ZSA9IHZhbHVlUmVmZXJlbmNlLmdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5VmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZVJlZmVyZW5jZS5pc0FjdGl2ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSB2YWx1ZSBkaXNhcHBlYXJlZCwgdGhpcyBlbnRyeSBpcyBwYXJ0aWFsbHkgY29sbGVjdGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmV3Q291bnQgPSB0aGlzLmNvdW50IC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyttb2RDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV3Rmlyc3QgPSByZW1vdmVWYWx1ZUZyb21DaGFpbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCwgZSwgZW50cnlLZXksIGhhc2gsIHZhbHVlUmVmZXJlbmNlLCBSZW1vdmFsQ2F1c2UuQ09MTEVDVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q291bnQgPSB0aGlzLmNvdW50IC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUuc2V0KGluZGV4LCBuZXdGaXJzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY291bnQgPSBuZXdDb3VudDsgLy8gd3JpdGUtdm9sYXRpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICsrbW9kQ291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBlbnF1ZXVlTm90aWZpY2F0aW9uKGtleSwgaGFzaCwgdmFsdWVSZWZlcmVuY2UsIFJlbW92YWxDYXVzZS5SRVBMQUNFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRWYWx1ZShlLCBrZXksIG5ld1ZhbHVlLCBub3cpOworICAgICAgICAgICAgICAgICAgICAgICAgZXZpY3RFbnRyaWVzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnlWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgICAgICAgICBwb3N0V3JpdGVDbGVhbnVwKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBWIHJlbW92ZShPYmplY3Qga2V5LCBpbnQgaGFzaCkgeworICAgICAgICAgICAgbG9jaygpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBsb25nIG5vdyA9IG1hcC50aWNrZXIucmVhZCgpOworICAgICAgICAgICAgICAgIHByZVdyaXRlQ2xlYW51cChub3cpOworCisgICAgICAgICAgICAgICAgaW50IG5ld0NvdW50ID0gdGhpcy5jb3VudCAtIDE7CisgICAgICAgICAgICAgICAgQXRvbWljUmVmZXJlbmNlQXJyYXk8UmVmZXJlbmNlRW50cnk8SywgVj4+IHRhYmxlID0gdGhpcy50YWJsZTsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBoYXNoICYgKHRhYmxlLmxlbmd0aCgpIC0gMSk7CisgICAgICAgICAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gZmlyc3QgPSB0YWJsZS5nZXQoaW5kZXgpOworCisgICAgICAgICAgICAgICAgZm9yIChSZWZlcmVuY2VFbnRyeTxLLCBWPiBlID0gZmlyc3Q7IGUgIT0gbnVsbDsgZSA9IGUuZ2V0TmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIEsgZW50cnlLZXkgPSBlLmdldEtleSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoZS5nZXRIYXNoKCkgPT0gaGFzaCAmJiBlbnRyeUtleSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbWFwLmtleUVxdWl2YWxlbmNlLmVxdWl2YWxlbnQoa2V5LCBlbnRyeUtleSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlUmVmZXJlbmNlPEssIFY+IHZhbHVlUmVmZXJlbmNlID0gZS5nZXRWYWx1ZVJlZmVyZW5jZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgViBlbnRyeVZhbHVlID0gdmFsdWVSZWZlcmVuY2UuZ2V0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlbW92YWxDYXVzZSBjYXVzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeVZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXVzZSA9IFJlbW92YWxDYXVzZS5FWFBMSUNJVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWVSZWZlcmVuY2UuaXNBY3RpdmUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdXNlID0gUmVtb3ZhbENhdXNlLkNPTExFQ1RFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3VycmVudGx5IGxvYWRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgKyttb2RDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5ld0ZpcnN0ID0gcmVtb3ZlVmFsdWVGcm9tQ2hhaW4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0LCBlLCBlbnRyeUtleSwgaGFzaCwgdmFsdWVSZWZlcmVuY2UsIGNhdXNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvdW50ID0gdGhpcy5jb3VudCAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5zZXQoaW5kZXgsIG5ld0ZpcnN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY291bnQgPSBuZXdDb3VudDsgLy8gd3JpdGUtdm9sYXRpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeVZhbHVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICAgICAgICAgIHBvc3RXcml0ZUNsZWFudXAoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gc3RvcmVMb2FkZWRWYWx1ZShLIGtleSwgaW50IGhhc2gsIExvYWRpbmdWYWx1ZVJlZmVyZW5jZTxLLCBWPiBvbGRWYWx1ZVJlZmVyZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYgbmV3VmFsdWUpIHsKKyAgICAgICAgICAgIGxvY2soKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgbG9uZyBub3cgPSBtYXAudGlja2VyLnJlYWQoKTsKKyAgICAgICAgICAgICAgICBwcmVXcml0ZUNsZWFudXAobm93KTsKKworICAgICAgICAgICAgICAgIGludCBuZXdDb3VudCA9IHRoaXMuY291bnQgKyAxOworICAgICAgICAgICAgICAgIGlmIChuZXdDb3VudCA+IHRoaXMudGhyZXNob2xkKSB7IC8vIGVuc3VyZSBjYXBhY2l0eQorICAgICAgICAgICAgICAgICAgICBleHBhbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3Q291bnQgPSB0aGlzLmNvdW50ICsgMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBBdG9taWNSZWZlcmVuY2VBcnJheTxSZWZlcmVuY2VFbnRyeTxLLCBWPj4gdGFibGUgPSB0aGlzLnRhYmxlOworICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGhhc2ggJiAodGFibGUubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBmaXJzdCA9IHRhYmxlLmdldChpbmRleCk7CisKKyAgICAgICAgICAgICAgICBmb3IgKFJlZmVyZW5jZUVudHJ5PEssIFY+IGUgPSBmaXJzdDsgZSAhPSBudWxsOyBlID0gZS5nZXROZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgSyBlbnRyeUtleSA9IGUuZ2V0S2V5KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlLmdldEhhc2goKSA9PSBoYXNoICYmIGVudHJ5S2V5ICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtYXAua2V5RXF1aXZhbGVuY2UuZXF1aXZhbGVudChrZXksIGVudHJ5S2V5KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVSZWZlcmVuY2U8SywgVj4gdmFsdWVSZWZlcmVuY2UgPSBlLmdldFZhbHVlUmVmZXJlbmNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBWIGVudHJ5VmFsdWUgPSB2YWx1ZVJlZmVyZW5jZS5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxhY2UgdGhlIG9sZCBMb2FkaW5nVmFsdWVSZWZlcmVuY2UgaWYgaXQncyBsaXZlLCBvdGhlcndpc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBlcmZvcm0gYSBwdXRJZkFic2VudAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZFZhbHVlUmVmZXJlbmNlID09IHZhbHVlUmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChlbnRyeVZhbHVlID09IG51bGwgJiYgdmFsdWVSZWZlcmVuY2UgIT0gVU5TRVQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyttb2RDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2xkVmFsdWVSZWZlcmVuY2UuaXNBY3RpdmUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmFsQ2F1c2UgY2F1c2UgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbnRyeVZhbHVlID09IG51bGwpID8gUmVtb3ZhbENhdXNlLkNPTExFQ1RFRCA6IFJlbW92YWxDYXVzZS5SRVBMQUNFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5xdWV1ZU5vdGlmaWNhdGlvbihrZXksIGhhc2gsIG9sZFZhbHVlUmVmZXJlbmNlLCBjYXVzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvdW50LS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhbHVlKGUsIGtleSwgbmV3VmFsdWUsIG5vdyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3VudCA9IG5ld0NvdW50OyAvLyB3cml0ZS12b2xhdGlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2aWN0RW50cmllcygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbG9hZGVkIHZhbHVlIHdhcyBhbHJlYWR5IGNsb2JiZXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVSZWZlcmVuY2UgPSBuZXcgV2VpZ2h0ZWRTdHJvbmdWYWx1ZVJlZmVyZW5jZTxLLCBWPihuZXdWYWx1ZSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbnF1ZXVlTm90aWZpY2F0aW9uKGtleSwgaGFzaCwgdmFsdWVSZWZlcmVuY2UsIFJlbW92YWxDYXVzZS5SRVBMQUNFRCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICArK21vZENvdW50OworICAgICAgICAgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5ld0VudHJ5ID0gbmV3RW50cnkoa2V5LCBoYXNoLCBmaXJzdCk7CisgICAgICAgICAgICAgICAgc2V0VmFsdWUobmV3RW50cnksIGtleSwgbmV3VmFsdWUsIG5vdyk7CisgICAgICAgICAgICAgICAgdGFibGUuc2V0KGluZGV4LCBuZXdFbnRyeSk7CisgICAgICAgICAgICAgICAgdGhpcy5jb3VudCA9IG5ld0NvdW50OyAvLyB3cml0ZS12b2xhdGlsZQorICAgICAgICAgICAgICAgIGV2aWN0RW50cmllcygpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgICAgICAgICBwb3N0V3JpdGVDbGVhbnVwKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIHJlbW92ZShPYmplY3Qga2V5LCBpbnQgaGFzaCwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgICAgICBsb2NrKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGxvbmcgbm93ID0gbWFwLnRpY2tlci5yZWFkKCk7CisgICAgICAgICAgICAgICAgcHJlV3JpdGVDbGVhbnVwKG5vdyk7CisKKyAgICAgICAgICAgICAgICBpbnQgbmV3Q291bnQgPSB0aGlzLmNvdW50IC0gMTsKKyAgICAgICAgICAgICAgICBBdG9taWNSZWZlcmVuY2VBcnJheTxSZWZlcmVuY2VFbnRyeTxLLCBWPj4gdGFibGUgPSB0aGlzLnRhYmxlOworICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGhhc2ggJiAodGFibGUubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBmaXJzdCA9IHRhYmxlLmdldChpbmRleCk7CisKKyAgICAgICAgICAgICAgICBmb3IgKFJlZmVyZW5jZUVudHJ5PEssIFY+IGUgPSBmaXJzdDsgZSAhPSBudWxsOyBlID0gZS5nZXROZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgSyBlbnRyeUtleSA9IGUuZ2V0S2V5KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlLmdldEhhc2goKSA9PSBoYXNoICYmIGVudHJ5S2V5ICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtYXAua2V5RXF1aXZhbGVuY2UuZXF1aXZhbGVudChrZXksIGVudHJ5S2V5KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVSZWZlcmVuY2U8SywgVj4gdmFsdWVSZWZlcmVuY2UgPSBlLmdldFZhbHVlUmVmZXJlbmNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBWIGVudHJ5VmFsdWUgPSB2YWx1ZVJlZmVyZW5jZS5nZXQoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3ZhbENhdXNlIGNhdXNlOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcC52YWx1ZUVxdWl2YWxlbmNlLmVxdWl2YWxlbnQodmFsdWUsIGVudHJ5VmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F1c2UgPSBSZW1vdmFsQ2F1c2UuRVhQTElDSVQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVudHJ5VmFsdWUgPT0gbnVsbCAmJiB2YWx1ZVJlZmVyZW5jZS5pc0FjdGl2ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F1c2UgPSBSZW1vdmFsQ2F1c2UuQ09MTEVDVEVEOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50bHkgbG9hZGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgKyttb2RDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5ld0ZpcnN0ID0gcmVtb3ZlVmFsdWVGcm9tQ2hhaW4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0LCBlLCBlbnRyeUtleSwgaGFzaCwgdmFsdWVSZWZlcmVuY2UsIGNhdXNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvdW50ID0gdGhpcy5jb3VudCAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5zZXQoaW5kZXgsIG5ld0ZpcnN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY291bnQgPSBuZXdDb3VudDsgLy8gd3JpdGUtdm9sYXRpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoY2F1c2UgPT0gUmVtb3ZhbENhdXNlLkVYUExJQ0lUKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgICAgICAgICAgcG9zdFdyaXRlQ2xlYW51cCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgICAgIGlmIChjb3VudCAhPSAwKSB7IC8vIHJlYWQtdm9sYXRpbGUKKyAgICAgICAgICAgICAgICBsb2NrKCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgQXRvbWljUmVmZXJlbmNlQXJyYXk8UmVmZXJlbmNlRW50cnk8SywgVj4+IHRhYmxlID0gdGhpcy50YWJsZTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJsZS5sZW5ndGgoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFJlZmVyZW5jZUVudHJ5PEssIFY+IGUgPSB0YWJsZS5nZXQoaSk7IGUgIT0gbnVsbDsgZSA9IGUuZ2V0TmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9hZGluZyByZWZlcmVuY2VzIGFyZW4ndCBhY3R1YWxseSBpbiB0aGUgbWFwIHlldC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5nZXRWYWx1ZVJlZmVyZW5jZSgpLmlzQWN0aXZlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5xdWV1ZU5vdGlmaWNhdGlvbihlLCBSZW1vdmFsQ2F1c2UuRVhQTElDSVQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhYmxlLmxlbmd0aCgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLnNldChpLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjbGVhclJlZmVyZW5jZVF1ZXVlcygpOworICAgICAgICAgICAgICAgICAgICB3cml0ZVF1ZXVlLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIGFjY2Vzc1F1ZXVlLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIHJlYWRDb3VudC5zZXQoMCk7CisKKyAgICAgICAgICAgICAgICAgICAgKyttb2RDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgPSAwOyAvLyB3cml0ZS12b2xhdGlsZQorICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICAgICAgICAgICAgICBwb3N0V3JpdGVDbGVhbnVwKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gcmVtb3ZlVmFsdWVGcm9tQ2hhaW4oUmVmZXJlbmNlRW50cnk8SywgVj4gZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IGVudHJ5LCBLIGtleSwgaW50IGhhc2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlUmVmZXJlbmNlPEssIFY+IHZhbHVlUmVmZXJlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW1vdmFsQ2F1c2UgY2F1c2UpIHsKKyAgICAgICAgICAgIGVucXVldWVOb3RpZmljYXRpb24oa2V5LCBoYXNoLCB2YWx1ZVJlZmVyZW5jZSwgY2F1c2UpOworICAgICAgICAgICAgd3JpdGVRdWV1ZS5yZW1vdmUoZW50cnkpOworICAgICAgICAgICAgYWNjZXNzUXVldWUucmVtb3ZlKGVudHJ5KTsKKworICAgICAgICAgICAgaWYgKHZhbHVlUmVmZXJlbmNlLmlzTG9hZGluZygpKSB7CisgICAgICAgICAgICAgICAgdmFsdWVSZWZlcmVuY2Uubm90aWZ5TmV3VmFsdWUobnVsbCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZpcnN0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVtb3ZlRW50cnlGcm9tQ2hhaW4oZmlyc3QsIGVudHJ5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IHJlbW92ZUVudHJ5RnJvbUNoYWluKFJlZmVyZW5jZUVudHJ5PEssIFY+IGZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBlbnRyeSkgeworICAgICAgICAgICAgaW50IG5ld0NvdW50ID0gY291bnQ7CisgICAgICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXdGaXJzdCA9IGVudHJ5LmdldE5leHQoKTsKKyAgICAgICAgICAgIGZvciAoUmVmZXJlbmNlRW50cnk8SywgVj4gZSA9IGZpcnN0OyBlICE9IGVudHJ5OyBlID0gZS5nZXROZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXh0ID0gY29weUVudHJ5KGUsIG5ld0ZpcnN0KTsKKyAgICAgICAgICAgICAgICBpZiAobmV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG5ld0ZpcnN0ID0gbmV4dDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZW1vdmVDb2xsZWN0ZWRFbnRyeShlKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3Q291bnQtLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLmNvdW50ID0gbmV3Q291bnQ7CisgICAgICAgICAgICByZXR1cm4gbmV3Rmlyc3Q7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHJlbW92ZUNvbGxlY3RlZEVudHJ5KFJlZmVyZW5jZUVudHJ5PEssIFY+IGVudHJ5KSB7CisgICAgICAgICAgICBlbnF1ZXVlTm90aWZpY2F0aW9uKGVudHJ5LCBSZW1vdmFsQ2F1c2UuQ09MTEVDVEVEKTsKKyAgICAgICAgICAgIHdyaXRlUXVldWUucmVtb3ZlKGVudHJ5KTsKKyAgICAgICAgICAgIGFjY2Vzc1F1ZXVlLnJlbW92ZShlbnRyeSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVtb3ZlcyBhbiBlbnRyeSB3aG9zZSBrZXkgaGFzIGJlZW4gZ2FyYmFnZSBjb2xsZWN0ZWQuCisgICAgICAgICAqLworICAgICAgICBib29sZWFuIHJlY2xhaW1LZXkoUmVmZXJlbmNlRW50cnk8SywgVj4gZW50cnksIGludCBoYXNoKSB7CisgICAgICAgICAgICBsb2NrKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGludCBuZXdDb3VudCA9IGNvdW50IC0gMTsKKyAgICAgICAgICAgICAgICBBdG9taWNSZWZlcmVuY2VBcnJheTxSZWZlcmVuY2VFbnRyeTxLLCBWPj4gdGFibGUgPSB0aGlzLnRhYmxlOworICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGhhc2ggJiAodGFibGUubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBmaXJzdCA9IHRhYmxlLmdldChpbmRleCk7CisKKyAgICAgICAgICAgICAgICBmb3IgKFJlZmVyZW5jZUVudHJ5PEssIFY+IGUgPSBmaXJzdDsgZSAhPSBudWxsOyBlID0gZS5nZXROZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGUgPT0gZW50cnkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrbW9kQ291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXdGaXJzdCA9IHJlbW92ZVZhbHVlRnJvbUNoYWluKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCwgZSwgZS5nZXRLZXkoKSwgaGFzaCwgZS5nZXRWYWx1ZVJlZmVyZW5jZSgpLCBSZW1vdmFsQ2F1c2UuQ09MTEVDVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvdW50ID0gdGhpcy5jb3VudCAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5zZXQoaW5kZXgsIG5ld0ZpcnN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY291bnQgPSBuZXdDb3VudDsgLy8gd3JpdGUtdm9sYXRpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgICAgICAgICBwb3N0V3JpdGVDbGVhbnVwKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVtb3ZlcyBhbiBlbnRyeSB3aG9zZSB2YWx1ZSBoYXMgYmVlbiBnYXJiYWdlIGNvbGxlY3RlZC4KKyAgICAgICAgICovCisgICAgICAgIGJvb2xlYW4gcmVjbGFpbVZhbHVlKEsga2V5LCBpbnQgaGFzaCwgVmFsdWVSZWZlcmVuY2U8SywgVj4gdmFsdWVSZWZlcmVuY2UpIHsKKyAgICAgICAgICAgIGxvY2soKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaW50IG5ld0NvdW50ID0gdGhpcy5jb3VudCAtIDE7CisgICAgICAgICAgICAgICAgQXRvbWljUmVmZXJlbmNlQXJyYXk8UmVmZXJlbmNlRW50cnk8SywgVj4+IHRhYmxlID0gdGhpcy50YWJsZTsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBoYXNoICYgKHRhYmxlLmxlbmd0aCgpIC0gMSk7CisgICAgICAgICAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gZmlyc3QgPSB0YWJsZS5nZXQoaW5kZXgpOworCisgICAgICAgICAgICAgICAgZm9yIChSZWZlcmVuY2VFbnRyeTxLLCBWPiBlID0gZmlyc3Q7IGUgIT0gbnVsbDsgZSA9IGUuZ2V0TmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIEsgZW50cnlLZXkgPSBlLmdldEtleSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoZS5nZXRIYXNoKCkgPT0gaGFzaCAmJiBlbnRyeUtleSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbWFwLmtleUVxdWl2YWxlbmNlLmVxdWl2YWxlbnQoa2V5LCBlbnRyeUtleSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlUmVmZXJlbmNlPEssIFY+IHYgPSBlLmdldFZhbHVlUmVmZXJlbmNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodiA9PSB2YWx1ZVJlZmVyZW5jZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrbW9kQ291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV3Rmlyc3QgPSByZW1vdmVWYWx1ZUZyb21DaGFpbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0LCBlLCBlbnRyeUtleSwgaGFzaCwgdmFsdWVSZWZlcmVuY2UsIFJlbW92YWxDYXVzZS5DT0xMRUNURUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvdW50ID0gdGhpcy5jb3VudCAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUuc2V0KGluZGV4LCBuZXdGaXJzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3VudCA9IG5ld0NvdW50OyAvLyB3cml0ZS12b2xhdGlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgICAgICAgICBpZiAoIWlzSGVsZEJ5Q3VycmVudFRocmVhZCgpKSB7IC8vIGRvbid0IGNsZWFudXAgaW5zaWRlIG9mIHB1dAorICAgICAgICAgICAgICAgICAgICBwb3N0V3JpdGVDbGVhbnVwKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiByZW1vdmVMb2FkaW5nVmFsdWUoSyBrZXksIGludCBoYXNoLCBMb2FkaW5nVmFsdWVSZWZlcmVuY2U8SywgVj4gdmFsdWVSZWZlcmVuY2UpIHsKKyAgICAgICAgICAgIGxvY2soKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQXRvbWljUmVmZXJlbmNlQXJyYXk8UmVmZXJlbmNlRW50cnk8SywgVj4+IHRhYmxlID0gdGhpcy50YWJsZTsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBoYXNoICYgKHRhYmxlLmxlbmd0aCgpIC0gMSk7CisgICAgICAgICAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gZmlyc3QgPSB0YWJsZS5nZXQoaW5kZXgpOworCisgICAgICAgICAgICAgICAgZm9yIChSZWZlcmVuY2VFbnRyeTxLLCBWPiBlID0gZmlyc3Q7IGUgIT0gbnVsbDsgZSA9IGUuZ2V0TmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIEsgZW50cnlLZXkgPSBlLmdldEtleSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoZS5nZXRIYXNoKCkgPT0gaGFzaCAmJiBlbnRyeUtleSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbWFwLmtleUVxdWl2YWxlbmNlLmVxdWl2YWxlbnQoa2V5LCBlbnRyeUtleSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlUmVmZXJlbmNlPEssIFY+IHYgPSBlLmdldFZhbHVlUmVmZXJlbmNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodiA9PSB2YWx1ZVJlZmVyZW5jZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZVJlZmVyZW5jZS5pc0FjdGl2ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc2V0VmFsdWVSZWZlcmVuY2UodmFsdWVSZWZlcmVuY2UuZ2V0T2xkVmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV3Rmlyc3QgPSByZW1vdmVFbnRyeUZyb21DaGFpbihmaXJzdCwgZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLnNldChpbmRleCwgbmV3Rmlyc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgICAgICAgICAgcG9zdFdyaXRlQ2xlYW51cCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiByZW1vdmVFbnRyeShSZWZlcmVuY2VFbnRyeTxLLCBWPiBlbnRyeSwgaW50IGhhc2gsIFJlbW92YWxDYXVzZSBjYXVzZSkgeworICAgICAgICAgICAgaW50IG5ld0NvdW50ID0gdGhpcy5jb3VudCAtIDE7CisgICAgICAgICAgICBBdG9taWNSZWZlcmVuY2VBcnJheTxSZWZlcmVuY2VFbnRyeTxLLCBWPj4gdGFibGUgPSB0aGlzLnRhYmxlOworICAgICAgICAgICAgaW50IGluZGV4ID0gaGFzaCAmICh0YWJsZS5sZW5ndGgoKSAtIDEpOworICAgICAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gZmlyc3QgPSB0YWJsZS5nZXQoaW5kZXgpOworCisgICAgICAgICAgICBmb3IgKFJlZmVyZW5jZUVudHJ5PEssIFY+IGUgPSBmaXJzdDsgZSAhPSBudWxsOyBlID0gZS5nZXROZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZSA9PSBlbnRyeSkgeworICAgICAgICAgICAgICAgICAgICArK21vZENvdW50OworICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXdGaXJzdCA9IHJlbW92ZVZhbHVlRnJvbUNoYWluKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0LCBlLCBlLmdldEtleSgpLCBoYXNoLCBlLmdldFZhbHVlUmVmZXJlbmNlKCksIGNhdXNlKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3Q291bnQgPSB0aGlzLmNvdW50IC0gMTsKKyAgICAgICAgICAgICAgICAgICAgdGFibGUuc2V0KGluZGV4LCBuZXdGaXJzdCk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuY291bnQgPSBuZXdDb3VudDsgLy8gd3JpdGUtdm9sYXRpbGUKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUGVyZm9ybXMgcm91dGluZSBjbGVhbnVwIGZvbGxvd2luZyBhIHJlYWQuIE5vcm1hbGx5IGNsZWFudXAgaGFwcGVucyBkdXJpbmcgd3JpdGVzLiBJZiBjbGVhbnVwCisgICAgICAgICAqIGlzIG5vdCBvYnNlcnZlZCBhZnRlciBhIHN1ZmZpY2llbnQgbnVtYmVyIG9mIHJlYWRzLCB0cnkgY2xlYW5pbmcgdXAgZnJvbSB0aGUgcmVhZCB0aHJlYWQuCisgICAgICAgICAqLworICAgICAgICB2b2lkIHBvc3RSZWFkQ2xlYW51cCgpIHsKKyAgICAgICAgICAgIGlmICgocmVhZENvdW50LmluY3JlbWVudEFuZEdldCgpICYgRFJBSU5fVEhSRVNIT0xEKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgY2xlYW5VcCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBlcmZvcm1zIHJvdXRpbmUgY2xlYW51cCBwcmlvciB0byBleGVjdXRpbmcgYSB3cml0ZS4gVGhpcyBzaG91bGQgYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgYQorICAgICAgICAgKiB3cml0ZSB0aHJlYWQgYWNxdWlyZXMgdGhlIHNlZ21lbnQgbG9jaywgaW1tZWRpYXRlbHkgYWZ0ZXIgYWNxdWlyaW5nIHRoZSBsb2NrLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogPHA+UG9zdC1jb25kaXRpb246IGV4cGlyZUVudHJpZXMgaGFzIGJlZW4gcnVuLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBwcmVXcml0ZUNsZWFudXAobG9uZyBub3cpIHsKKyAgICAgICAgICAgIHJ1bkxvY2tlZENsZWFudXAobm93KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBQZXJmb3JtcyByb3V0aW5lIGNsZWFudXAgZm9sbG93aW5nIGEgd3JpdGUuCisgICAgICAgICAqLworICAgICAgICB2b2lkIHBvc3RXcml0ZUNsZWFudXAoKSB7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGNsZWFuVXAoKSB7CisgICAgICAgICAgICBsb25nIG5vdyA9IG1hcC50aWNrZXIucmVhZCgpOworICAgICAgICAgICAgcnVuTG9ja2VkQ2xlYW51cChub3cpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBydW5Mb2NrZWRDbGVhbnVwKGxvbmcgbm93KSB7CisgICAgICAgICAgICBpZiAodHJ5TG9jaygpKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZHJhaW5SZWZlcmVuY2VRdWV1ZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgZXhwaXJlRW50cmllcyhub3cpOyAvLyBjYWxscyBkcmFpblJlY2VuY3lRdWV1ZQorICAgICAgICAgICAgICAgICAgICByZWFkQ291bnQuc2V0KDApOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBMb2FkaW5nVmFsdWVSZWZlcmVuY2U8SywgVj4gaW1wbGVtZW50cyBWYWx1ZVJlZmVyZW5jZTxLLCBWPiB7CisgICAgICAgIC8vIFRPRE8oZnJ5KTogcmVuYW1lIGdldCwgdGhlbiBleHRlbmQgQWJzdHJhY3RGdXR1cmUgaW5zdGVhZCBvZiBjb250YWluaW5nIFNldHRhYmxlRnV0dXJlCisgICAgICAgIGZpbmFsIFNldHRhYmxlRnV0dXJlPFY+IGZ1dHVyZVZhbHVlID0gU2V0dGFibGVGdXR1cmUuY3JlYXRlKCk7CisgICAgICAgIGZpbmFsIFN0b3B3YXRjaCBzdG9wd2F0Y2ggPSBTdG9wd2F0Y2guY3JlYXRlVW5zdGFydGVkKCk7CisgICAgICAgIHZvbGF0aWxlIFZhbHVlUmVmZXJlbmNlPEssIFY+IG9sZFZhbHVlOworCisgICAgICAgIHB1YmxpYyBMb2FkaW5nVmFsdWVSZWZlcmVuY2UoKSB7CisgICAgICAgICAgICB0aGlzKExvY2FsQ2FjaGUudW5zZXQoKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTG9hZGluZ1ZhbHVlUmVmZXJlbmNlKFZhbHVlUmVmZXJlbmNlPEssIFY+IG9sZFZhbHVlKSB7CisgICAgICAgICAgICB0aGlzLm9sZFZhbHVlID0gb2xkVmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNMb2FkaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNBY3RpdmUoKSB7CisgICAgICAgICAgICByZXR1cm4gb2xkVmFsdWUuaXNBY3RpdmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGdldFdlaWdodCgpIHsKKyAgICAgICAgICAgIHJldHVybiBvbGRWYWx1ZS5nZXRXZWlnaHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIHNldChWIG5ld1ZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gZnV0dXJlVmFsdWUuc2V0KG5ld1ZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIHNldEV4Y2VwdGlvbihUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgcmV0dXJuIGZ1dHVyZVZhbHVlLnNldEV4Y2VwdGlvbih0KTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgTGlzdGVuYWJsZUZ1dHVyZTxWPiBmdWxseUZhaWxlZEZ1dHVyZShUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgcmV0dXJuIEZ1dHVyZXMuaW1tZWRpYXRlRmFpbGVkRnV0dXJlKHQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG5vdGlmeU5ld1ZhbHVlKFYgbmV3VmFsdWUpIHsKKyAgICAgICAgICAgIGlmIChuZXdWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIHBlbmRpbmcgbG9hZCB3YXMgY2xvYmJlcmVkIGJ5IGEgbWFudWFsIHdyaXRlLgorICAgICAgICAgICAgICAgIC8vIFVuYmxvY2sgYWxsIHBlbmRpbmcgZ2V0cywgYW5kIGhhdmUgdGhlbSByZXR1cm4gdGhlIG5ldyB2YWx1ZS4KKyAgICAgICAgICAgICAgICBzZXQobmV3VmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgcGVuZGluZyBsb2FkIHdhcyByZW1vdmVkLiBEZWxheSBub3RpZmljYXRpb25zIHVudGlsIGxvYWRpbmcgY29tcGxldGVzLgorICAgICAgICAgICAgICAgIG9sZFZhbHVlID0gdW5zZXQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVE9ETyhmcnkpOiBjb3VsZCBhbHNvIGNhbmNlbCBsb2FkaW5nIGlmIHdlIGhhZCBhIGhhbmRsZSBvbiBpdHMgZnV0dXJlCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTGlzdGVuYWJsZUZ1dHVyZTxWPiBsb2FkRnV0dXJlKEsga2V5LCBDYWNoZUxvYWRlcjw/IHN1cGVyIEssIFY+IGxvYWRlcikgeworICAgICAgICAgICAgc3RvcHdhdGNoLnN0YXJ0KCk7CisgICAgICAgICAgICBWIHByZXZpb3VzVmFsdWUgPSBvbGRWYWx1ZS5nZXQoKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzVmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBWIG5ld1ZhbHVlID0gbG9hZGVyLmxvYWQoa2V5KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNldChuZXdWYWx1ZSkgPyBmdXR1cmVWYWx1ZSA6IEZ1dHVyZXMuaW1tZWRpYXRlRnV0dXJlKG5ld1ZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgTGlzdGVuYWJsZUZ1dHVyZTxWPiBuZXdWYWx1ZSA9IGxvYWRlci5yZWxvYWQoa2V5LCBwcmV2aW91c1ZhbHVlKTsKKyAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRnV0dXJlcy5pbW1lZGlhdGVGdXR1cmUobnVsbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFRvIGF2b2lkIGEgcmFjZSwgbWFrZSBzdXJlIHRoZSByZWZyZXNoZWQgdmFsdWUgaXMgc2V0IGludG8gbG9hZGluZ1ZhbHVlUmVmZXJlbmNlCisgICAgICAgICAgICAgICAgLy8gKmJlZm9yZSogcmV0dXJuaW5nIG5ld1ZhbHVlIGZyb20gdGhlIGNhY2hlIHF1ZXJ5LgorICAgICAgICAgICAgICAgIHJldHVybiBGdXR1cmVzLnRyYW5zZm9ybShuZXdWYWx1ZSwgbmV3IEZ1bmN0aW9uPFYsIFY+KCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIFYgYXBwbHkoViBuZXdWYWx1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9hZGluZ1ZhbHVlUmVmZXJlbmNlLnRoaXMuc2V0KG5ld1ZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIEludGVycnVwdGVkRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBzZXRFeGNlcHRpb24odCkgPyBmdXR1cmVWYWx1ZSA6IGZ1bGx5RmFpbGVkRnV0dXJlKHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWIHdhaXRGb3JWYWx1ZSgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIGdldFVuaW50ZXJydXB0aWJseShmdXR1cmVWYWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFYgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG9sZFZhbHVlLmdldCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFZhbHVlUmVmZXJlbmNlPEssIFY+IGdldE9sZFZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIG9sZFZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZWZlcmVuY2VFbnRyeTxLLCBWPiBnZXRFbnRyeSgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWYWx1ZVJlZmVyZW5jZTxLLCBWPiBjb3B5Rm9yKAorICAgICAgICAgICAgICAgIFJlZmVyZW5jZVF1ZXVlPFY+IHF1ZXVlLCBWIHZhbHVlLCBSZWZlcmVuY2VFbnRyeTxLLCBWPiBlbnRyeSkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGN1c3RvbSBxdWV1ZSBmb3IgbWFuYWdpbmcgZXZpY3Rpb24gb3JkZXIuIE5vdGUgdGhhdCB0aGlzIGlzIHRpZ2h0bHkgaW50ZWdyYXRlZCB3aXRoIHtAY29kZQorICAgICAqIFJlZmVyZW5jZUVudHJ5fSwgdXBvbiB3aGljaCBpdCByZWxpZXMgdG8gcGVyZm9ybSBpdHMgbGlua2luZy4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5Ob3RlIHRoYXQgdGhpcyBlbnRpcmUgaW1wbGVtZW50YXRpb24gbWFrZXMgdGhlIGFzc3VtcHRpb24gdGhhdCBhbGwgZWxlbWVudHMgd2hpY2ggYXJlIGluCisgICAgICogdGhlIG1hcCBhcmUgYWxzbyBpbiB0aGlzIHF1ZXVlLCBhbmQgdGhhdCBhbGwgZWxlbWVudHMgbm90IGluIHRoZSBxdWV1ZSBhcmUgbm90IGluIHRoZSBtYXAuCisgICAgICogPHA+CisgICAgICogPHA+VGhlIGJlbmVmaXRzIG9mIGNyZWF0aW5nIG91ciBvd24gcXVldWUgYXJlIHRoYXQgKDEpIHdlIGNhbiByZXBsYWNlIGVsZW1lbnRzIGluIHRoZSBtaWRkbGUKKyAgICAgKiBvZiB0aGUgcXVldWUgYXMgcGFydCBvZiBjb3B5V3JpdGVFbnRyeSwgYW5kICgyKSB0aGUgY29udGFpbnMgbWV0aG9kIGlzIGhpZ2hseSBvcHRpbWl6ZWQKKyAgICAgKiBmb3IgdGhlIGN1cnJlbnQgbW9kZWwuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIFdyaXRlUXVldWU8SywgVj4gZXh0ZW5kcyBBYnN0cmFjdFF1ZXVlPFJlZmVyZW5jZUVudHJ5PEssIFY+PiB7CisgICAgICAgIGZpbmFsIFJlZmVyZW5jZUVudHJ5PEssIFY+IGhlYWQgPSBuZXcgQWJzdHJhY3RSZWZlcmVuY2VFbnRyeTxLLCBWPigpIHsKKworICAgICAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV4dFdyaXRlID0gdGhpczsKKyAgICAgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IHByZXZpb3VzV3JpdGUgPSB0aGlzOworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBsb25nIGdldFdyaXRlVGltZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTG9uZy5NQVhfVkFMVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0V3JpdGVUaW1lKGxvbmcgdGltZSkgeworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBSZWZlcmVuY2VFbnRyeTxLLCBWPiBnZXROZXh0SW5Xcml0ZVF1ZXVlKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXh0V3JpdGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0TmV4dEluV3JpdGVRdWV1ZShSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXh0KSB7CisgICAgICAgICAgICAgICAgdGhpcy5uZXh0V3JpdGUgPSBuZXh0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBSZWZlcmVuY2VFbnRyeTxLLCBWPiBnZXRQcmV2aW91c0luV3JpdGVRdWV1ZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcHJldmlvdXNXcml0ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcmV2aW91c0luV3JpdGVRdWV1ZShSZWZlcmVuY2VFbnRyeTxLLCBWPiBwcmV2aW91cykgeworICAgICAgICAgICAgICAgIHRoaXMucHJldmlvdXNXcml0ZSA9IHByZXZpb3VzOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIC8vIGltcGxlbWVudHMgUXVldWUKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb2ZmZXIoUmVmZXJlbmNlRW50cnk8SywgVj4gZW50cnkpIHsKKyAgICAgICAgICAgIC8vIHVubGluaworICAgICAgICAgICAgY29ubmVjdFdyaXRlT3JkZXIoZW50cnkuZ2V0UHJldmlvdXNJbldyaXRlUXVldWUoKSwgZW50cnkuZ2V0TmV4dEluV3JpdGVRdWV1ZSgpKTsKKworICAgICAgICAgICAgLy8gYWRkIHRvIHRhaWwKKyAgICAgICAgICAgIGNvbm5lY3RXcml0ZU9yZGVyKGhlYWQuZ2V0UHJldmlvdXNJbldyaXRlUXVldWUoKSwgZW50cnkpOworICAgICAgICAgICAgY29ubmVjdFdyaXRlT3JkZXIoZW50cnksIGhlYWQpOworCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVmZXJlbmNlRW50cnk8SywgVj4gcGVlaygpIHsKKyAgICAgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5leHQgPSBoZWFkLmdldE5leHRJbldyaXRlUXVldWUoKTsKKyAgICAgICAgICAgIHJldHVybiAobmV4dCA9PSBoZWFkKSA/IG51bGwgOiBuZXh0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZWZlcmVuY2VFbnRyeTxLLCBWPiBwb2xsKCkgeworICAgICAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV4dCA9IGhlYWQuZ2V0TmV4dEluV3JpdGVRdWV1ZSgpOworICAgICAgICAgICAgaWYgKG5leHQgPT0gaGVhZCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZW1vdmUobmV4dCk7CisgICAgICAgICAgICByZXR1cm4gbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7CisgICAgICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBlID0gKFJlZmVyZW5jZUVudHJ5KSBvOworICAgICAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gcHJldmlvdXMgPSBlLmdldFByZXZpb3VzSW5Xcml0ZVF1ZXVlKCk7CisgICAgICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXh0ID0gZS5nZXROZXh0SW5Xcml0ZVF1ZXVlKCk7CisgICAgICAgICAgICBjb25uZWN0V3JpdGVPcmRlcihwcmV2aW91cywgbmV4dCk7CisgICAgICAgICAgICBudWxsaWZ5V3JpdGVPcmRlcihlKTsKKworICAgICAgICAgICAgcmV0dXJuIG5leHQgIT0gTnVsbEVudHJ5LklOU1RBTkNFOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgeworICAgICAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gZSA9IChSZWZlcmVuY2VFbnRyeSkgbzsKKyAgICAgICAgICAgIHJldHVybiBlLmdldE5leHRJbldyaXRlUXVldWUoKSAhPSBOdWxsRW50cnkuSU5TVEFOQ0U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKyAgICAgICAgICAgIHJldHVybiBoZWFkLmdldE5leHRJbldyaXRlUXVldWUoKSA9PSBoZWFkOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgICAgIGludCBzaXplID0gMDsKKyAgICAgICAgICAgIGZvciAoUmVmZXJlbmNlRW50cnk8SywgVj4gZSA9IGhlYWQuZ2V0TmV4dEluV3JpdGVRdWV1ZSgpOyBlICE9IGhlYWQ7CisgICAgICAgICAgICAgICAgIGUgPSBlLmdldE5leHRJbldyaXRlUXVldWUoKSkgeworICAgICAgICAgICAgICAgIHNpemUrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzaXplOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gZSA9IGhlYWQuZ2V0TmV4dEluV3JpdGVRdWV1ZSgpOworICAgICAgICAgICAgd2hpbGUgKGUgIT0gaGVhZCkgeworICAgICAgICAgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5leHQgPSBlLmdldE5leHRJbldyaXRlUXVldWUoKTsKKyAgICAgICAgICAgICAgICBudWxsaWZ5V3JpdGVPcmRlcihlKTsKKyAgICAgICAgICAgICAgICBlID0gbmV4dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaGVhZC5zZXROZXh0SW5Xcml0ZVF1ZXVlKGhlYWQpOworICAgICAgICAgICAgaGVhZC5zZXRQcmV2aW91c0luV3JpdGVRdWV1ZShoZWFkKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSXRlcmF0b3I8UmVmZXJlbmNlRW50cnk8SywgVj4+IGl0ZXJhdG9yKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBBYnN0cmFjdFNlcXVlbnRpYWxJdGVyYXRvcjxSZWZlcmVuY2VFbnRyeTxLLCBWPj4ocGVlaygpKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHJvdGVjdGVkIFJlZmVyZW5jZUVudHJ5PEssIFY+IGNvbXB1dGVOZXh0KFJlZmVyZW5jZUVudHJ5PEssIFY+IHByZXZpb3VzKSB7CisgICAgICAgICAgICAgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5leHQgPSBwcmV2aW91cy5nZXROZXh0SW5Xcml0ZVF1ZXVlKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAobmV4dCA9PSBoZWFkKSA/IG51bGwgOiBuZXh0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGN1c3RvbSBxdWV1ZSBmb3IgbWFuYWdpbmcgYWNjZXNzIG9yZGVyLiBOb3RlIHRoYXQgdGhpcyBpcyB0aWdodGx5IGludGVncmF0ZWQgd2l0aAorICAgICAqIHtAY29kZSBSZWZlcmVuY2VFbnRyeX0sIHVwb24gd2hpY2ggaXQgcmVsaWVzZSB0byBwZXJmb3JtIGl0cyBsaW5raW5nLgorICAgICAqIDxwPgorICAgICAqIDxwPk5vdGUgdGhhdCB0aGlzIGVudGlyZSBpbXBsZW1lbnRhdGlvbiBtYWtlcyB0aGUgYXNzdW1wdGlvbiB0aGF0IGFsbCBlbGVtZW50cyB3aGljaCBhcmUgaW4KKyAgICAgKiB0aGUgbWFwIGFyZSBhbHNvIGluIHRoaXMgcXVldWUsIGFuZCB0aGF0IGFsbCBlbGVtZW50cyBub3QgaW4gdGhlIHF1ZXVlIGFyZSBub3QgaW4gdGhlIG1hcC4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5UaGUgYmVuZWZpdHMgb2YgY3JlYXRpbmcgb3VyIG93biBxdWV1ZSBhcmUgdGhhdCAoMSkgd2UgY2FuIHJlcGxhY2UgZWxlbWVudHMgaW4gdGhlIG1pZGRsZQorICAgICAqIG9mIHRoZSBxdWV1ZSBhcyBwYXJ0IG9mIGNvcHlXcml0ZUVudHJ5LCBhbmQgKDIpIHRoZSBjb250YWlucyBtZXRob2QgaXMgaGlnaGx5IG9wdGltaXplZAorICAgICAqIGZvciB0aGUgY3VycmVudCBtb2RlbC4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgQWNjZXNzUXVldWU8SywgVj4gZXh0ZW5kcyBBYnN0cmFjdFF1ZXVlPFJlZmVyZW5jZUVudHJ5PEssIFY+PiB7CisgICAgICAgIGZpbmFsIFJlZmVyZW5jZUVudHJ5PEssIFY+IGhlYWQgPSBuZXcgQWJzdHJhY3RSZWZlcmVuY2VFbnRyeTxLLCBWPigpIHsKKworICAgICAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV4dEFjY2VzcyA9IHRoaXM7CisgICAgICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBwcmV2aW91c0FjY2VzcyA9IHRoaXM7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGxvbmcgZ2V0QWNjZXNzVGltZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTG9uZy5NQVhfVkFMVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0QWNjZXNzVGltZShsb25nIHRpbWUpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgUmVmZXJlbmNlRW50cnk8SywgVj4gZ2V0TmV4dEluQWNjZXNzUXVldWUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5leHRBY2Nlc3M7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0TmV4dEluQWNjZXNzUXVldWUoUmVmZXJlbmNlRW50cnk8SywgVj4gbmV4dCkgeworICAgICAgICAgICAgICAgIHRoaXMubmV4dEFjY2VzcyA9IG5leHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFJlZmVyZW5jZUVudHJ5PEssIFY+IGdldFByZXZpb3VzSW5BY2Nlc3NRdWV1ZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcHJldmlvdXNBY2Nlc3M7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0UHJldmlvdXNJbkFjY2Vzc1F1ZXVlKFJlZmVyZW5jZUVudHJ5PEssIFY+IHByZXZpb3VzKSB7CisgICAgICAgICAgICAgICAgdGhpcy5wcmV2aW91c0FjY2VzcyA9IHByZXZpb3VzOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIC8vIGltcGxlbWVudHMgUXVldWUKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb2ZmZXIoUmVmZXJlbmNlRW50cnk8SywgVj4gZW50cnkpIHsKKyAgICAgICAgICAgIC8vIHVubGluaworICAgICAgICAgICAgY29ubmVjdEFjY2Vzc09yZGVyKGVudHJ5LmdldFByZXZpb3VzSW5BY2Nlc3NRdWV1ZSgpLCBlbnRyeS5nZXROZXh0SW5BY2Nlc3NRdWV1ZSgpKTsKKworICAgICAgICAgICAgLy8gYWRkIHRvIHRhaWwKKyAgICAgICAgICAgIGNvbm5lY3RBY2Nlc3NPcmRlcihoZWFkLmdldFByZXZpb3VzSW5BY2Nlc3NRdWV1ZSgpLCBlbnRyeSk7CisgICAgICAgICAgICBjb25uZWN0QWNjZXNzT3JkZXIoZW50cnksIGhlYWQpOworCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVmZXJlbmNlRW50cnk8SywgVj4gcGVlaygpIHsKKyAgICAgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5leHQgPSBoZWFkLmdldE5leHRJbkFjY2Vzc1F1ZXVlKCk7CisgICAgICAgICAgICByZXR1cm4gKG5leHQgPT0gaGVhZCkgPyBudWxsIDogbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVmZXJlbmNlRW50cnk8SywgVj4gcG9sbCgpIHsKKyAgICAgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5leHQgPSBoZWFkLmdldE5leHRJbkFjY2Vzc1F1ZXVlKCk7CisgICAgICAgICAgICBpZiAobmV4dCA9PSBoZWFkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlbW92ZShuZXh0KTsKKyAgICAgICAgICAgIHJldHVybiBuZXh0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IGUgPSAoUmVmZXJlbmNlRW50cnkpIG87CisgICAgICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBwcmV2aW91cyA9IGUuZ2V0UHJldmlvdXNJbkFjY2Vzc1F1ZXVlKCk7CisgICAgICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXh0ID0gZS5nZXROZXh0SW5BY2Nlc3NRdWV1ZSgpOworICAgICAgICAgICAgY29ubmVjdEFjY2Vzc09yZGVyKHByZXZpb3VzLCBuZXh0KTsKKyAgICAgICAgICAgIG51bGxpZnlBY2Nlc3NPcmRlcihlKTsKKworICAgICAgICAgICAgcmV0dXJuIG5leHQgIT0gTnVsbEVudHJ5LklOU1RBTkNFOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgeworICAgICAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gZSA9IChSZWZlcmVuY2VFbnRyeSkgbzsKKyAgICAgICAgICAgIHJldHVybiBlLmdldE5leHRJbkFjY2Vzc1F1ZXVlKCkgIT0gTnVsbEVudHJ5LklOU1RBTkNFOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgICAgICAgICByZXR1cm4gaGVhZC5nZXROZXh0SW5BY2Nlc3NRdWV1ZSgpID09IGhlYWQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICAgICAgaW50IHNpemUgPSAwOworICAgICAgICAgICAgZm9yIChSZWZlcmVuY2VFbnRyeTxLLCBWPiBlID0gaGVhZC5nZXROZXh0SW5BY2Nlc3NRdWV1ZSgpOyBlICE9IGhlYWQ7CisgICAgICAgICAgICAgICAgIGUgPSBlLmdldE5leHRJbkFjY2Vzc1F1ZXVlKCkpIHsKKyAgICAgICAgICAgICAgICBzaXplKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IGUgPSBoZWFkLmdldE5leHRJbkFjY2Vzc1F1ZXVlKCk7CisgICAgICAgICAgICB3aGlsZSAoZSAhPSBoZWFkKSB7CisgICAgICAgICAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV4dCA9IGUuZ2V0TmV4dEluQWNjZXNzUXVldWUoKTsKKyAgICAgICAgICAgICAgICBudWxsaWZ5QWNjZXNzT3JkZXIoZSk7CisgICAgICAgICAgICAgICAgZSA9IG5leHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGhlYWQuc2V0TmV4dEluQWNjZXNzUXVldWUoaGVhZCk7CisgICAgICAgICAgICBoZWFkLnNldFByZXZpb3VzSW5BY2Nlc3NRdWV1ZShoZWFkKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSXRlcmF0b3I8UmVmZXJlbmNlRW50cnk8SywgVj4+IGl0ZXJhdG9yKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBBYnN0cmFjdFNlcXVlbnRpYWxJdGVyYXRvcjxSZWZlcmVuY2VFbnRyeTxLLCBWPj4ocGVlaygpKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHJvdGVjdGVkIFJlZmVyZW5jZUVudHJ5PEssIFY+IGNvbXB1dGVOZXh0KFJlZmVyZW5jZUVudHJ5PEssIFY+IHByZXZpb3VzKSB7CisgICAgICAgICAgICAgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5leHQgPSBwcmV2aW91cy5nZXROZXh0SW5BY2Nlc3NRdWV1ZSgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG5leHQgPT0gaGVhZCkgPyBudWxsIDogbmV4dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgfQorCisgICAgLy8gSXRlcmF0b3IgU3VwcG9ydAorCisgICAgc3RhdGljIGNsYXNzIExvY2FsTWFudWFsQ2FjaGU8SywgVj4gaW1wbGVtZW50cyBDYWNoZTxLLCBWPiwgU2VyaWFsaXphYmxlIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTsKKyAgICAgICAgZmluYWwgTG9jYWxDYWNoZTxLLCBWPiBsb2NhbENhY2hlOworCisgICAgICAgIExvY2FsTWFudWFsQ2FjaGUoQ2FjaGVCdWlsZGVyPD8gc3VwZXIgSywgPyBzdXBlciBWPiBidWlsZGVyKSB7CisgICAgICAgICAgICB0aGlzKG5ldyBMb2NhbENhY2hlPEssIFY+KGJ1aWxkZXIsIG51bGwpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENhY2hlIG1ldGhvZHMKKworICAgICAgICBwcml2YXRlIExvY2FsTWFudWFsQ2FjaGUoTG9jYWxDYWNoZTxLLCBWPiBsb2NhbENhY2hlKSB7CisgICAgICAgICAgICB0aGlzLmxvY2FsQ2FjaGUgPSBsb2NhbENhY2hlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWIGdldElmUHJlc2VudChPYmplY3Qga2V5KSB7CisgICAgICAgICAgICByZXR1cm4gbG9jYWxDYWNoZS5nZXRJZlByZXNlbnQoa2V5KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNlcmlhbGl6YXRpb24gU3VwcG9ydAorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBwdXQoSyBrZXksIFYgdmFsdWUpIHsKKyAgICAgICAgICAgIGxvY2FsQ2FjaGUucHV0KGtleSwgdmFsdWUpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgTG9jYWxMb2FkaW5nQ2FjaGU8SywgVj4KKyAgICAgICAgICAgIGV4dGVuZHMgTG9jYWxNYW51YWxDYWNoZTxLLCBWPiBpbXBsZW1lbnRzIExvYWRpbmdDYWNoZTxLLCBWPiB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMTsKKworICAgICAgICAvLyBMb2FkaW5nQ2FjaGUgbWV0aG9kcworCisgICAgICAgIExvY2FsTG9hZGluZ0NhY2hlKENhY2hlQnVpbGRlcjw/IHN1cGVyIEssID8gc3VwZXIgVj4gYnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGVMb2FkZXI8PyBzdXBlciBLLCBWPiBsb2FkZXIpIHsKKyAgICAgICAgICAgIHN1cGVyKG5ldyBMb2NhbENhY2hlPEssIFY+KGJ1aWxkZXIsIGNoZWNrTm90TnVsbChsb2FkZXIpKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFYgZ2V0KEsga2V5KSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBsb2NhbENhY2hlLmdldE9yTG9hZChrZXkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFYgZ2V0VW5jaGVja2VkKEsga2V5KSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBnZXQoa2V5KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuY2hlY2tlZEV4ZWN1dGlvbkV4Y2VwdGlvbihlLmdldENhdXNlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU2VyaWFsaXphdGlvbiBTdXBwb3J0CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBmaW5hbCBWIGFwcGx5KEsga2V5KSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VW5jaGVja2VkKGtleSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIGFic3RyYWN0IGNsYXNzIEhhc2hJdGVyYXRvcjxUPiBpbXBsZW1lbnRzIEl0ZXJhdG9yPFQ+IHsKKworICAgICAgICBpbnQgbmV4dFNlZ21lbnRJbmRleDsKKyAgICAgICAgaW50IG5leHRUYWJsZUluZGV4OworICAgICAgICBTZWdtZW50PEssIFY+IGN1cnJlbnRTZWdtZW50OworICAgICAgICBBdG9taWNSZWZlcmVuY2VBcnJheTxSZWZlcmVuY2VFbnRyeTxLLCBWPj4gY3VycmVudFRhYmxlOworICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXh0RW50cnk7CisgICAgICAgIFdyaXRlVGhyb3VnaEVudHJ5IG5leHRFeHRlcm5hbDsKKyAgICAgICAgV3JpdGVUaHJvdWdoRW50cnkgbGFzdFJldHVybmVkOworCisgICAgICAgIEhhc2hJdGVyYXRvcigpIHsKKyAgICAgICAgICAgIG5leHRTZWdtZW50SW5kZXggPSBzZWdtZW50cy5sZW5ndGggLSAxOworICAgICAgICAgICAgbmV4dFRhYmxlSW5kZXggPSAtMTsKKyAgICAgICAgICAgIGFkdmFuY2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVCBuZXh0KCk7CisKKyAgICAgICAgZmluYWwgdm9pZCBhZHZhbmNlKCkgeworICAgICAgICAgICAgbmV4dEV4dGVybmFsID0gbnVsbDsKKworICAgICAgICAgICAgaWYgKG5leHRJbkNoYWluKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChuZXh0SW5UYWJsZSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3aGlsZSAobmV4dFNlZ21lbnRJbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgY3VycmVudFNlZ21lbnQgPSBzZWdtZW50c1tuZXh0U2VnbWVudEluZGV4LS1dOworICAgICAgICAgICAgICAgIGlmIChjdXJyZW50U2VnbWVudC5jb3VudCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUYWJsZSA9IGN1cnJlbnRTZWdtZW50LnRhYmxlOworICAgICAgICAgICAgICAgICAgICBuZXh0VGFibGVJbmRleCA9IGN1cnJlbnRUYWJsZS5sZW5ndGgoKSAtIDE7CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0SW5UYWJsZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRmluZHMgdGhlIG5leHQgZW50cnkgaW4gdGhlIGN1cnJlbnQgY2hhaW4uIFJldHVybnMgdHJ1ZSBpZiBhbiBlbnRyeSB3YXMgZm91bmQuCisgICAgICAgICAqLworICAgICAgICBib29sZWFuIG5leHRJbkNoYWluKCkgeworICAgICAgICAgICAgaWYgKG5leHRFbnRyeSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChuZXh0RW50cnkgPSBuZXh0RW50cnkuZ2V0TmV4dCgpOyBuZXh0RW50cnkgIT0gbnVsbDsgbmV4dEVudHJ5ID0gbmV4dEVudHJ5LmdldE5leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYWR2YW5jZVRvKG5leHRFbnRyeSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZpbmRzIHRoZSBuZXh0IGVudHJ5IGluIHRoZSBjdXJyZW50IHRhYmxlLiBSZXR1cm5zIHRydWUgaWYgYW4gZW50cnkgd2FzIGZvdW5kLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbGVhbiBuZXh0SW5UYWJsZSgpIHsKKyAgICAgICAgICAgIHdoaWxlIChuZXh0VGFibGVJbmRleCA+PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKChuZXh0RW50cnkgPSBjdXJyZW50VGFibGUuZ2V0KG5leHRUYWJsZUluZGV4LS0pKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChhZHZhbmNlVG8obmV4dEVudHJ5KSB8fCBuZXh0SW5DaGFpbigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZHZhbmNlcyB0byB0aGUgZ2l2ZW4gZW50cnkuIFJldHVybnMgdHJ1ZSBpZiB0aGUgZW50cnkgd2FzIHZhbGlkLCBmYWxzZSBpZiBpdCBzaG91bGQgYmUKKyAgICAgICAgICogc2tpcHBlZC4KKyAgICAgICAgICovCisgICAgICAgIGJvb2xlYW4gYWR2YW5jZVRvKFJlZmVyZW5jZUVudHJ5PEssIFY+IGVudHJ5KSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGxvbmcgbm93ID0gdGlja2VyLnJlYWQoKTsKKyAgICAgICAgICAgICAgICBLIGtleSA9IGVudHJ5LmdldEtleSgpOworICAgICAgICAgICAgICAgIFYgdmFsdWUgPSBnZXRMaXZlVmFsdWUoZW50cnksIG5vdyk7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV4dEV4dGVybmFsID0gbmV3IFdyaXRlVGhyb3VnaEVudHJ5KGtleSwgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIHN0YWxlIGVudHJ5LgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBjdXJyZW50U2VnbWVudC5wb3N0UmVhZENsZWFudXAoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5leHRFeHRlcm5hbCAhPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgV3JpdGVUaHJvdWdoRW50cnkgbmV4dEVudHJ5KCkgeworICAgICAgICAgICAgaWYgKG5leHRFeHRlcm5hbCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxhc3RSZXR1cm5lZCA9IG5leHRFeHRlcm5hbDsKKyAgICAgICAgICAgIGFkdmFuY2UoKTsKKyAgICAgICAgICAgIHJldHVybiBsYXN0UmV0dXJuZWQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeworICAgICAgICAgICAgY2hlY2tTdGF0ZShsYXN0UmV0dXJuZWQgIT0gbnVsbCk7CisgICAgICAgICAgICBMb2NhbENhY2hlLnRoaXMucmVtb3ZlKGxhc3RSZXR1cm5lZC5nZXRLZXkoKSk7CisgICAgICAgICAgICBsYXN0UmV0dXJuZWQgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgZmluYWwgY2xhc3MgS2V5SXRlcmF0b3IgZXh0ZW5kcyBIYXNoSXRlcmF0b3I8Sz4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSyBuZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5leHRFbnRyeSgpLmdldEtleSgpOworICAgICAgICB9CisgICAgfQorCisgICAgZmluYWwgY2xhc3MgVmFsdWVJdGVyYXRvciBleHRlbmRzIEhhc2hJdGVyYXRvcjxWPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWIG5leHQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV4dEVudHJ5KCkuZ2V0VmFsdWUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEN1c3RvbSBFbnRyeSBjbGFzcyB1c2VkIGJ5IEVudHJ5SXRlcmF0b3IubmV4dCgpLCB0aGF0IHJlbGF5cyBzZXRWYWx1ZSBjaGFuZ2VzIHRvIHRoZQorICAgICAqIHVuZGVybHlpbmcgbWFwLgorICAgICAqLworICAgIGZpbmFsIGNsYXNzIFdyaXRlVGhyb3VnaEVudHJ5IGltcGxlbWVudHMgRW50cnk8SywgVj4geworICAgICAgICBmaW5hbCBLIGtleTsgLy8gbm9uLW51bGwKKyAgICAgICAgZmluYWwgViB2YWx1ZTsgLy8gbm9uLW51bGwKKworICAgICAgICBXcml0ZVRocm91Z2hFbnRyeShLIGtleSwgViB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy5rZXkgPSBrZXk7CisgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEsgZ2V0S2V5KCkgeworICAgICAgICAgICAgcmV0dXJuIGtleTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgViBnZXRWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgeworICAgICAgICAgICAgLy8gQ2Fubm90IHVzZSBrZXkgYW5kIHZhbHVlIGVxdWl2YWxlbmNlCisgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgRW50cnkpIHsKKyAgICAgICAgICAgICAgICBFbnRyeTw/LCA/PiB0aGF0ID0gKEVudHJ5PD8sID8+KSBvYmplY3Q7CisgICAgICAgICAgICAgICAgcmV0dXJuIGtleS5lcXVhbHModGhhdC5nZXRLZXkoKSkgJiYgdmFsdWUuZXF1YWxzKHRoYXQuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIC8vIENhbm5vdCB1c2Uga2V5IGFuZCB2YWx1ZSBlcXVpdmFsZW5jZQorICAgICAgICAgICAgcmV0dXJuIGtleS5oYXNoQ29kZSgpIF4gdmFsdWUuaGFzaENvZGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgViBzZXRWYWx1ZShWIG5ld1ZhbHVlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmb3JtIDxjb2RlPntrZXl9PXt2YWx1ZX08L2NvZGU+LgorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0S2V5KCkgKyAiPSIgKyBnZXRWYWx1ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgZmluYWwgY2xhc3MgRW50cnlJdGVyYXRvciBleHRlbmRzIEhhc2hJdGVyYXRvcjxFbnRyeTxLLCBWPj4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRW50cnk8SywgVj4gbmV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXh0RW50cnkoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFNlcmlhbGl6YXRpb24gU3VwcG9ydAorCisgICAgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDYWNoZVNldDxUPiBleHRlbmRzIEFic3RyYWN0U2V0PFQ+IHsKKyAgICAgICAgZmluYWwgQ29uY3VycmVudE1hcDw/LCA/PiBtYXA7CisKKyAgICAgICAgQWJzdHJhY3RDYWNoZVNldChDb25jdXJyZW50TWFwPD8sID8+IG1hcCkgeworICAgICAgICAgICAgdGhpcy5tYXAgPSBtYXA7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICAgICAgcmV0dXJuIG1hcC5zaXplKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtYXAuaXNFbXB0eSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICAgICAgbWFwLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmaW5hbCBjbGFzcyBLZXlTZXQgZXh0ZW5kcyBBYnN0cmFjdENhY2hlU2V0PEs+IHsKKworICAgICAgICBLZXlTZXQoQ29uY3VycmVudE1hcDw/LCA/PiBtYXApIHsKKyAgICAgICAgICAgIHN1cGVyKG1hcCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEl0ZXJhdG9yPEs+IGl0ZXJhdG9yKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBLZXlJdGVyYXRvcigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7CisgICAgICAgICAgICByZXR1cm4gbWFwLmNvbnRhaW5zS2V5KG8pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgeworICAgICAgICAgICAgcmV0dXJuIG1hcC5yZW1vdmUobykgIT0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZpbmFsIGNsYXNzIFZhbHVlcyBleHRlbmRzIEFic3RyYWN0Q29sbGVjdGlvbjxWPiB7CisgICAgICAgIHByaXZhdGUgZmluYWwgQ29uY3VycmVudE1hcDw/LCA/PiBtYXA7CisKKyAgICAgICAgVmFsdWVzKENvbmN1cnJlbnRNYXA8PywgPz4gbWFwKSB7CisgICAgICAgICAgICB0aGlzLm1hcCA9IG1hcDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgICAgICByZXR1cm4gbWFwLnNpemUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgeworICAgICAgICAgICAgcmV0dXJuIG1hcC5pc0VtcHR5KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgICAgICBtYXAuY2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSXRlcmF0b3I8Vj4gaXRlcmF0b3IoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlSXRlcmF0b3IoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgeworICAgICAgICAgICAgcmV0dXJuIG1hcC5jb250YWluc1ZhbHVlKG8pOworICAgICAgICB9CisgICAgfQorCisgICAgZmluYWwgY2xhc3MgRW50cnlTZXQgZXh0ZW5kcyBBYnN0cmFjdENhY2hlU2V0PEVudHJ5PEssIFY+PiB7CisKKyAgICAgICAgRW50cnlTZXQoQ29uY3VycmVudE1hcDw/LCA/PiBtYXApIHsKKyAgICAgICAgICAgIHN1cGVyKG1hcCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEl0ZXJhdG9yPEVudHJ5PEssIFY+PiBpdGVyYXRvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRW50cnlJdGVyYXRvcigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7CisgICAgICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgRW50cnkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRW50cnk8PywgPz4gZSA9IChFbnRyeTw/LCA/PikgbzsKKyAgICAgICAgICAgIE9iamVjdCBrZXkgPSBlLmdldEtleSgpOworICAgICAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgViB2ID0gTG9jYWxDYWNoZS50aGlzLmdldChrZXkpOworCisgICAgICAgICAgICByZXR1cm4gdiAhPSBudWxsICYmIHZhbHVlRXF1aXZhbGVuY2UuZXF1aXZhbGVudChlLmdldFZhbHVlKCksIHYpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgeworICAgICAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIEVudHJ5KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEVudHJ5PD8sID8+IGUgPSAoRW50cnk8PywgPz4pIG87CisgICAgICAgICAgICBPYmplY3Qga2V5ID0gZS5nZXRLZXkoKTsKKyAgICAgICAgICAgIHJldHVybiBrZXkgIT0gbnVsbCAmJiBMb2NhbENhY2hlLnRoaXMucmVtb3ZlKGtleSwgZS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvTWFwTWFrZXIuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvTWFwTWFrZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2FlZDVmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9NYXBNYWtlci5qYXZhCkBAIC0wLDAgKzEsMjM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBHdWF2YSBBdXRob3JzCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0CisgKiBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UKKyAqIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YTsKKworaW1wb3J0IGphdmEubGFuZy5yZWYuU29mdFJlZmVyZW5jZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CitpbXBvcnQgamF2YS51dGlsLkNvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TWFwOworCisvKioKKyAqIDxwPkEgYnVpbGRlciBvZiB7QGxpbmsgQ29uY3VycmVudE1hcH0gaW5zdGFuY2VzIGhhdmluZyBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyBmZWF0dXJlczoKKyAqIDxwPgorICogPHVsPgorICogPGxpPmtleXMgb3IgdmFsdWVzIGF1dG9tYXRpY2FsbHkgd3JhcHBlZCBpbiB7QGxpbmtwbGFpbiBXZWFrUmVmZXJlbmNlIHdlYWt9IG9yIHtAbGlua3BsYWluCisgKiBTb2Z0UmVmZXJlbmNlIHNvZnR9IHJlZmVyZW5jZXMKKyAqIDxsaT5ub3RpZmljYXRpb24gb2YgZXZpY3RlZCAob3Igb3RoZXJ3aXNlIHJlbW92ZWQpIGVudHJpZXMKKyAqIDxsaT5vbi1kZW1hbmQgY29tcHV0YXRpb24gb2YgdmFsdWVzIGZvciBrZXlzIG5vdCBhbHJlYWR5IHByZXNlbnQKKyAqIDwvdWw+CisgKiA8cD4KKyAqIDxwPlVzYWdlIGV4YW1wbGU6IDxwcmU+ICAge0Bjb2RlCisgKiA8cD4KKyAqICAgQ29uY3VycmVudE1hcDxSZXF1ZXN0LCBTdG9wd2F0Y2g+IHRpbWVycyA9IG5ldyBNYXBNYWtlcigpCisgKiAgICAgICAuY29uY3VycmVuY3lMZXZlbCg0KQorICogICAgICAgLndlYWtLZXlzKCkKKyAqICAgICAgIC5tYWtlTWFwKCk7fTwvcHJlPgorICogPHA+CisgKiA8cD5UaGVzZSBmZWF0dXJlcyBhcmUgYWxsIG9wdGlvbmFsOyB7QGNvZGUgbmV3IE1hcE1ha2VyKCkubWFrZU1hcCgpfSByZXR1cm5zIGEgdmFsaWQgY29uY3VycmVudAorICogbWFwIHRoYXQgYmVoYXZlcyBzaW1pbGFybHkgdG8gYSB7QGxpbmsgQ29uY3VycmVudEhhc2hNYXB9LgorICogPHA+CisgKiA8cD5UaGUgcmV0dXJuZWQgbWFwIGlzIGltcGxlbWVudGVkIGFzIGEgaGFzaCB0YWJsZSB3aXRoIHNpbWlsYXIgcGVyZm9ybWFuY2UgY2hhcmFjdGVyaXN0aWNzIHRvCisgKiB7QGxpbmsgQ29uY3VycmVudEhhc2hNYXB9LiBJdCBzdXBwb3J0cyBhbGwgb3B0aW9uYWwgb3BlcmF0aW9ucyBvZiB0aGUge0Bjb2RlIENvbmN1cnJlbnRNYXB9CisgKiBpbnRlcmZhY2UuIEl0IGRvZXMgbm90IHBlcm1pdCBudWxsIGtleXMgb3IgdmFsdWVzLgorICogPHA+CisgKiA8cD48Yj5Ob3RlOjwvYj4gYnkgZGVmYXVsdCwgdGhlIHJldHVybmVkIG1hcCB1c2VzIGVxdWFsaXR5IGNvbXBhcmlzb25zICh0aGUge0BsaW5rIE9iamVjdCNlcXVhbHMKKyAqIGVxdWFsc30gbWV0aG9kKSB0byBkZXRlcm1pbmUgZXF1YWxpdHkgZm9yIGtleXMgb3IgdmFsdWVzLiBIb3dldmVyLCBpZiB7QGxpbmsgI3dlYWtLZXlzfSB3YXMKKyAqIHNwZWNpZmllZCwgdGhlIG1hcCB1c2VzIGlkZW50aXR5ICh7QGNvZGUgPT19KSBjb21wYXJpc29ucyBpbnN0ZWFkIGZvciBrZXlzLiBMaWtld2lzZSwgaWYge0BsaW5rCisgKiAjd2Vha1ZhbHVlc30gb3Ige0BsaW5rICNzb2Z0VmFsdWVzfSB3YXMgc3BlY2lmaWVkLCB0aGUgbWFwIHVzZXMgaWRlbnRpdHkgY29tcGFyaXNvbnMgZm9yIHZhbHVlcy4KKyAqIDxwPgorICogPHA+VGhlIHZpZXcgY29sbGVjdGlvbnMgb2YgdGhlIHJldHVybmVkIG1hcCBoYXZlIDxpPndlYWtseSBjb25zaXN0ZW50IGl0ZXJhdG9yczwvaT4uIFRoaXMgbWVhbnMKKyAqIHRoYXQgdGhleSBhcmUgc2FmZSBmb3IgY29uY3VycmVudCB1c2UsIGJ1dCBpZiBvdGhlciB0aHJlYWRzIG1vZGlmeSB0aGUgbWFwIGFmdGVyIHRoZSBpdGVyYXRvciBpcworICogY3JlYXRlZCwgaXQgaXMgdW5kZWZpbmVkIHdoaWNoIG9mIHRoZXNlIGNoYW5nZXMsIGlmIGFueSwgYXJlIHJlZmxlY3RlZCBpbiB0aGF0IGl0ZXJhdG9yLiBUaGVzZQorICogaXRlcmF0b3JzIG5ldmVyIHRocm93IHtAbGluayBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9ufS4KKyAqIDxwPgorICogPHA+SWYge0BsaW5rICN3ZWFrS2V5c30sIHtAbGluayAjd2Vha1ZhbHVlc30sIG9yIHtAbGluayAjc29mdFZhbHVlc30gYXJlIHJlcXVlc3RlZCwgaXQgaXMKKyAqIHBvc3NpYmxlIGZvciBhIGtleSBvciB2YWx1ZSBwcmVzZW50IGluIHRoZSBtYXAgdG8gYmUgcmVjbGFpbWVkIGJ5IHRoZSBnYXJiYWdlIGNvbGxlY3Rvci4gRW50cmllcworICogd2l0aCByZWNsYWltZWQga2V5cyBvciB2YWx1ZXMgbWF5IGJlIHJlbW92ZWQgZnJvbSB0aGUgbWFwIG9uIGVhY2ggbWFwIG1vZGlmaWNhdGlvbiBvciBvbgorICogb2NjYXNpb25hbCBtYXAgYWNjZXNzZXM7IHN1Y2ggZW50cmllcyBtYXkgYmUgY291bnRlZCBieSB7QGxpbmsgTWFwI3NpemV9LCBidXQgd2lsbCBuZXZlciBiZQorICogdmlzaWJsZSB0byByZWFkIG9yIHdyaXRlIG9wZXJhdGlvbnMuIEEgcGFydGlhbGx5LXJlY2xhaW1lZCBlbnRyeSBpcyBuZXZlciBleHBvc2VkIHRvIHRoZSB1c2VyLgorICogQW55IHtAbGluayBNYXAuRW50cnl9IGluc3RhbmNlIHJldHJpZXZlZCBmcm9tIHRoZSBtYXAncworICoge0BsaW5rcGxhaW4gTWFwI2VudHJ5U2V0IGVudHJ5IHNldH0gaXMgYSBzbmFwc2hvdCBvZiB0aGF0IGVudHJ5J3Mgc3RhdGUgYXQgdGhlIHRpbWUgb2YKKyAqIHJldHJpZXZhbDsgc3VjaCBlbnRyaWVzIGRvLCBob3dldmVyLCBzdXBwb3J0IHtAbGluayBNYXAuRW50cnkjc2V0VmFsdWV9LCB3aGljaCBzaW1wbHkKKyAqIGNhbGxzIHtAbGluayBNYXAjcHV0fSBvbiB0aGUgZW50cnkncyBrZXkuCisgKiA8cD4KKyAqIDxwPlRoZSBtYXBzIHByb2R1Y2VkIGJ5IHtAY29kZSBNYXBNYWtlcn0gYXJlIHNlcmlhbGl6YWJsZSwgYW5kIHRoZSBkZXNlcmlhbGl6ZWQgbWFwcyByZXRhaW4gYWxsCisgKiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIG9mIHRoZSBvcmlnaW5hbCBtYXAuIER1cmluZyBkZXNlcmlhbGl6YXRpb24sIGlmIHRoZSBvcmlnaW5hbCBtYXAgaGFkCisgKiB1c2VkIHNvZnQgb3Igd2VhayByZWZlcmVuY2VzLCB0aGUgZW50cmllcyBhcmUgcmVjb25zdHJ1Y3RlZCBhcyB0aGV5IHdlcmUsIGJ1dCBpdCdzIG5vdCB1bmxpa2VseQorICogdGhleSdsbCBiZSBxdWlja2x5IGdhcmJhZ2UtY29sbGVjdGVkIGJlZm9yZSB0aGV5IGFyZSBldmVyIGFjY2Vzc2VkLgorICogPHA+CisgKiA8cD57QGNvZGUgbmV3IE1hcE1ha2VyKCkud2Vha0tleXMoKS5tYWtlTWFwKCl9IGlzIGEgcmVjb21tZW5kZWQgcmVwbGFjZW1lbnQgZm9yIHtAbGluaworICogamF2YS51dGlsLldlYWtIYXNoTWFwfSwgYnV0IG5vdGUgdGhhdCBpdCBjb21wYXJlcyBrZXlzIHVzaW5nIG9iamVjdCBpZGVudGl0eSB3aGVyZWFzIHtAY29kZQorICogV2Vha0hhc2hNYXB9IHVzZXMge0BsaW5rIE9iamVjdCNlcXVhbHN9LgorICoKKyAqIEBhdXRob3IgQm9iIExlZQorICogQGF1dGhvciBDaGFybGVzIEZyeQorICogQGF1dGhvciBLZXZpbiBCb3VycmlsbGlvbgorICogQHNpbmNlIDIuMCAoaW1wb3J0ZWQgZnJvbSBHb29nbGUgQ29sbGVjdGlvbnMgTGlicmFyeSkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE1hcE1ha2VyIGV4dGVuZHMgR2VuZXJpY01hcE1ha2VyPE9iamVjdCwgT2JqZWN0PiB7CisgICAgc3RhdGljIGZpbmFsIGludCBVTlNFVF9JTlQgPSAtMTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9JTklUSUFMX0NBUEFDSVRZID0gMTY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQ09OQ1VSUkVOQ1lfTEVWRUwgPSA0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0VYUElSQVRJT05fTkFOT1MgPSAwOworCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgaW5pdGlhbENhcGFjaXR5ID0gVU5TRVRfSU5UOworICAgIHByaXZhdGUgZmluYWwgaW50IGNvbmN1cnJlbmN5TGV2ZWwgPSBVTlNFVF9JTlQ7CisgICAgZmluYWwgaW50IG1heGltdW1TaXplID0gVU5TRVRfSU5UOworCisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIGV4cGlyZUFmdGVyV3JpdGVOYW5vcyA9IFVOU0VUX0lOVDsKKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgZXhwaXJlQWZ0ZXJBY2Nlc3NOYW5vcyA9IFVOU0VUX0lOVDsKKworICAgIEVxdWl2YWxlbmNlPE9iamVjdD4gZ2V0S2V5RXF1aXZhbGVuY2UoKSB7CisgICAgICAgIHJldHVybiBnZXRLZXlTdHJlbmd0aCgpLmRlZmF1bHRFcXVpdmFsZW5jZSgpOworICAgIH0KKworICAgIGludCBnZXRJbml0aWFsQ2FwYWNpdHkoKSB7CisgICAgICAgIHJldHVybiAoaW5pdGlhbENhcGFjaXR5ID09IFVOU0VUX0lOVCkgPyBERUZBVUxUX0lOSVRJQUxfQ0FQQUNJVFkgOiBpbml0aWFsQ2FwYWNpdHk7CisgICAgfQorCisgICAgaW50IGdldENvbmN1cnJlbmN5TGV2ZWwoKSB7CisgICAgICAgIHJldHVybiAoY29uY3VycmVuY3lMZXZlbCA9PSBVTlNFVF9JTlQpID8gREVGQVVMVF9DT05DVVJSRU5DWV9MRVZFTCA6IGNvbmN1cnJlbmN5TGV2ZWw7CisgICAgfQorCisgICAgTWFwTWFrZXJJbnRlcm5hbE1hcC5TdHJlbmd0aCBnZXRLZXlTdHJlbmd0aCgpIHsKKyAgICAgICAgcmV0dXJuIE1hcE1ha2VySW50ZXJuYWxNYXAuU3RyZW5ndGguU1RST05HOworICAgIH0KKworICAgIE1hcE1ha2VySW50ZXJuYWxNYXAuU3RyZW5ndGggZ2V0VmFsdWVTdHJlbmd0aCgpIHsKKyAgICAgICAgcmV0dXJuIE1hcE1ha2VySW50ZXJuYWxNYXAuU3RyZW5ndGguU1RST05HOworICAgIH0KKworICAgIGxvbmcgZ2V0RXhwaXJlQWZ0ZXJXcml0ZU5hbm9zKCkgeworICAgICAgICByZXR1cm4gKGV4cGlyZUFmdGVyV3JpdGVOYW5vcyA9PSBVTlNFVF9JTlQpID8gREVGQVVMVF9FWFBJUkFUSU9OX05BTk9TIDogZXhwaXJlQWZ0ZXJXcml0ZU5hbm9zOworICAgIH0KKworICAgIGxvbmcgZ2V0RXhwaXJlQWZ0ZXJBY2Nlc3NOYW5vcygpIHsKKyAgICAgICAgcmV0dXJuIChleHBpcmVBZnRlckFjY2Vzc05hbm9zID09IFVOU0VUX0lOVCkKKyAgICAgICAgICAgICAgICA/IERFRkFVTFRfRVhQSVJBVElPTl9OQU5PUyA6IGV4cGlyZUFmdGVyQWNjZXNzTmFub3M7CisgICAgfQorCisgICAgVGlja2VyIGdldFRpY2tlcigpIHsKKyAgICAgICAgcmV0dXJuIFRpY2tlci5zeXN0ZW1UaWNrZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGZvciB0aGlzIE1hcE1ha2VyIGluc3RhbmNlLiBUaGUgZXhhY3QgZm9ybSBvZiB0aGUgcmV0dXJuZWQKKyAgICAgKiBzdHJpbmcgaXMgbm90IHNwZWNpZmljZWQuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgTW9yZU9iamVjdHMuVG9TdHJpbmdIZWxwZXIgcyA9IE1vcmVPYmplY3RzLnRvU3RyaW5nSGVscGVyKHRoaXMpOworICAgICAgICBpZiAoaW5pdGlhbENhcGFjaXR5ICE9IFVOU0VUX0lOVCkgeworICAgICAgICAgICAgcy5hZGQoImluaXRpYWxDYXBhY2l0eSIsIGluaXRpYWxDYXBhY2l0eSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbmN1cnJlbmN5TGV2ZWwgIT0gVU5TRVRfSU5UKSB7CisgICAgICAgICAgICBzLmFkZCgiY29uY3VycmVuY3lMZXZlbCIsIGNvbmN1cnJlbmN5TGV2ZWwpOworICAgICAgICB9CisgICAgICAgIGlmIChtYXhpbXVtU2l6ZSAhPSBVTlNFVF9JTlQpIHsKKyAgICAgICAgICAgIHMuYWRkKCJtYXhpbXVtU2l6ZSIsIG1heGltdW1TaXplKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXhwaXJlQWZ0ZXJXcml0ZU5hbm9zICE9IFVOU0VUX0lOVCkgeworICAgICAgICAgICAgcy5hZGQoImV4cGlyZUFmdGVyV3JpdGUiLCBleHBpcmVBZnRlcldyaXRlTmFub3MgKyAibnMiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXhwaXJlQWZ0ZXJBY2Nlc3NOYW5vcyAhPSBVTlNFVF9JTlQpIHsKKyAgICAgICAgICAgIHMuYWRkKCJleHBpcmVBZnRlckFjY2VzcyIsIGV4cGlyZUFmdGVyQWNjZXNzTmFub3MgKyAibnMiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcy50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSByZWFzb24gd2h5IGFuIGVudHJ5IHdhcyByZW1vdmVkLgorICAgICAqLworICAgIGVudW0gUmVtb3ZhbENhdXNlIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBlbnRyeSB3YXMgbWFudWFsbHkgcmVtb3ZlZCBieSB0aGUgdXNlci4gVGhpcyBjYW4gcmVzdWx0IGZyb20gdGhlIHVzZXIgaW52b2tpbmcKKyAgICAgICAgICoge0BsaW5rIE1hcCNyZW1vdmV9LCB7QGxpbmsgQ29uY3VycmVudE1hcCNyZW1vdmV9LCBvciB7QGxpbmsgamF2YS51dGlsLkl0ZXJhdG9yI3JlbW92ZX0uCisgICAgICAgICAqLworICAgICAgICBFWFBMSUNJVCB7CisgICAgICAgIH0sCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBlbnRyeSBpdHNlbGYgd2FzIG5vdCBhY3R1YWxseSByZW1vdmVkLCBidXQgaXRzIHZhbHVlIHdhcyByZXBsYWNlZCBieSB0aGUgdXNlci4gVGhpcyBjYW4KKyAgICAgICAgICogcmVzdWx0IGZyb20gdGhlIHVzZXIgaW52b2tpbmcge0BsaW5rIE1hcCNwdXR9LCB7QGxpbmsgTWFwI3B1dEFsbH0sCisgICAgICAgICAqIHtAbGluayBDb25jdXJyZW50TWFwI3JlcGxhY2UoT2JqZWN0LCBPYmplY3QpfSwgb3IKKyAgICAgICAgICoge0BsaW5rIENvbmN1cnJlbnRNYXAjcmVwbGFjZShPYmplY3QsIE9iamVjdCwgT2JqZWN0KX0uCisgICAgICAgICAqLworICAgICAgICBSRVBMQUNFRCB7CisgICAgICAgIH0sCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBlbnRyeSB3YXMgcmVtb3ZlZCBhdXRvbWF0aWNhbGx5IGJlY2F1c2UgaXRzIGtleSBvciB2YWx1ZSB3YXMgZ2FyYmFnZS1jb2xsZWN0ZWQuIFRoaXMgY2FuCisgICAgICAgICAqIG9jY3VyIHdoZW4gdXNpbmcge0BsaW5rICNzb2Z0VmFsdWVzfSwge0BsaW5rICN3ZWFrS2V5c30sIG9yIHtAbGluayAjd2Vha1ZhbHVlc30uCisgICAgICAgICAqLworICAgICAgICBDT0xMRUNURUQgeworICAgICAgICB9LAorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgZW50cnkncyBleHBpcmF0aW9uIHRpbWVzdGFtcCBoYXMgcGFzc2VkLiBUaGlzIGNhbiBvY2N1ciB3aGVuIHVzaW5nIHtAbGluaworICAgICAgICAgKiAjZXhwaXJlQWZ0ZXJXcml0ZX0gb3Ige0BsaW5rICNleHBpcmVBZnRlckFjY2Vzc30uCisgICAgICAgICAqLworICAgICAgICBFWFBJUkVEIHsKKyAgICAgICAgfSwKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGVudHJ5IHdhcyBldmljdGVkIGR1ZSB0byBzaXplIGNvbnN0cmFpbnRzLiBUaGlzIGNhbiBvY2N1ciB3aGVuIHVzaW5nIHtAbGluaworICAgICAgICAgKiAjbWF4aW11bVNpemV9LgorICAgICAgICAgKi8KKyAgICAgICAgU0laRSB7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIEFuIG9iamVjdCB0aGF0IGNhbiByZWNlaXZlIGEgbm90aWZpY2F0aW9uIHdoZW4gYW4gZW50cnkgaXMgcmVtb3ZlZCBmcm9tIGEgbWFwLiBUaGUgcmVtb3ZhbAorICAgICAqIHJlc3VsdGluZyBpbiBub3RpZmljYXRpb24gY291bGQgaGF2ZSBvY2N1cmVkIHRvIGFuIGVudHJ5IGJlaW5nIG1hbnVhbGx5IHJlbW92ZWQgb3IgcmVwbGFjZWQsIG9yCisgICAgICogZHVlIHRvIGV2aWN0aW9uIHJlc3VsdGluZyBmcm9tIHRpbWVkIGV4cGlyYXRpb24sIGV4Y2VlZGluZyBhIG1heGltdW0gc2l6ZSwgb3IgZ2FyYmFnZQorICAgICAqIGNvbGxlY3Rpb24uCisgICAgICogPHA+CisgICAgICogPHA+QW4gaW5zdGFuY2UgbWF5IGJlIGNhbGxlZCBjb25jdXJyZW50bHkgYnkgbXVsdGlwbGUgdGhyZWFkcyB0byBwcm9jZXNzIGRpZmZlcmVudCBlbnRyaWVzLgorICAgICAqIEltcGxlbWVudGF0aW9ucyBvZiB0aGlzIGludGVyZmFjZSBzaG91bGQgYXZvaWQgcGVyZm9ybWluZyBibG9ja2luZyBjYWxscyBvciBzeW5jaHJvbml6aW5nIG9uCisgICAgICogc2hhcmVkIHJlc291cmNlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSA8Sz4gdGhlIG1vc3QgZ2VuZXJhbCB0eXBlIG9mIGtleXMgdGhpcyBsaXN0ZW5lciBjYW4gbGlzdGVuIGZvcjsgZm9yCisgICAgICogICAgICAgICAgICBleGFtcGxlIHtAY29kZSBPYmplY3R9IGlmIGFueSBrZXkgaXMgYWNjZXB0YWJsZQorICAgICAqIEBwYXJhbSA8Vj4gdGhlIG1vc3QgZ2VuZXJhbCB0eXBlIG9mIHZhbHVlcyB0aGlzIGxpc3RlbmVyIGNhbiBsaXN0ZW4gZm9yOyBmb3IKKyAgICAgKiAgICAgICAgICAgIGV4YW1wbGUge0Bjb2RlIE9iamVjdH0gaWYgYW55IGtleSBpcyBhY2NlcHRhYmxlCisgICAgICovCisgICAgaW50ZXJmYWNlIFJlbW92YWxMaXN0ZW5lcjxLLCBWPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBOb3RpZmllcyB0aGUgbGlzdGVuZXIgdGhhdCBhIHJlbW92YWwgb2NjdXJyZWQgYXQgc29tZSBwb2ludCBpbiB0aGUgcGFzdC4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgb25SZW1vdmFsKFJlbW92YWxOb3RpZmljYXRpb248SywgVj4gbm90aWZpY2F0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIG5vdGlmaWNhdGlvbiBvZiB0aGUgcmVtb3ZhbCBvZiBhIHNpbmdsZSBlbnRyeS4gVGhlIGtleSBvciB2YWx1ZSBtYXkgYmUgbnVsbCBpZiBpdCB3YXMgYWxyZWFkeQorICAgICAqIGdhcmJhZ2UgY29sbGVjdGVkLgorICAgICAqIDxwPgorICAgICAqIDxwPkxpa2Ugb3RoZXIge0Bjb2RlIE1hcC5FbnRyeX0gaW5zdGFuY2VzIGFzc29jaWF0ZWQgd2l0aCBNYXBNYWtlciwgdGhpcyBjbGFzcyBob2xkcyBzdHJvbmcKKyAgICAgKiByZWZlcmVuY2VzIHRvIHRoZSBrZXkgYW5kIHZhbHVlLCByZWdhcmRsZXNzIG9mIHRoZSB0eXBlIG9mIHJlZmVyZW5jZXMgdGhlIG1hcCBtYXkgYmUgdXNpbmcuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIFJlbW92YWxOb3RpZmljYXRpb248SywgVj4gZXh0ZW5kcyBJbW11dGFibGVFbnRyeTxLLCBWPiB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDA7CisKKyAgICAgICAgUmVtb3ZhbE5vdGlmaWNhdGlvbihLIGtleSwgViB2YWx1ZSwgUmVtb3ZhbENhdXNlIGNhdXNlKSB7CisgICAgICAgICAgICBzdXBlcihrZXksIHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL01hcE1ha2VySW50ZXJuYWxNYXAuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvTWFwTWFrZXJJbnRlcm5hbE1hcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYWU2YTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL01hcE1ha2VySW50ZXJuYWxNYXAuamF2YQpAQCAtMCwwICsxLDMzMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEd1YXZhIEF1dGhvcnMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQKKyAqIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZQorICogaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2U7CitpbXBvcnQgamF2YS5sYW5nLnJlZi5SZWZlcmVuY2VRdWV1ZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CitpbXBvcnQgamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RNYXA7CitpbXBvcnQgamF2YS51dGlsLkFic3RyYWN0UXVldWU7CitpbXBvcnQgamF2YS51dGlsLkFic3RyYWN0U2V0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5RdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRMaW5rZWRRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2VBcnJheTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRMb2NrOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IHN0YXRpYyBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKKworLyoqCisgKiBUaGUgY29uY3VycmVudCBoYXNoIG1hcCBpbXBsZW1lbnRhdGlvbiBidWlsdCBieSB7QGxpbmsgTWFwTWFrZXJ9LgorICogPHA+CisgKiA8cD5UaGlzIGltcGxlbWVudGF0aW9uIGlzIGhlYXZpbHkgZGVyaXZlZCBmcm9tIHJldmlzaW9uIDEuOTYgb2YgPGEKKyAqIGhyZWY9Imh0dHA6Ly90aW55dXJsLmNvbS9Db25jdXJyZW50SGFzaE1hcCI+Q29uY3VycmVudEhhc2hNYXAuamF2YTwvYT4uCisgKgorICogQGF1dGhvciBCb2IgTGVlCisgKiBAYXV0aG9yIENoYXJsZXMgRnJ5CisgKiBAYXV0aG9yIERvdWcgTGVhICh7QGNvZGUgQ29uY3VycmVudEhhc2hNYXB9KQorICovCitjbGFzcyBNYXBNYWtlckludGVybmFsTWFwPEssIFY+CisgICAgICAgIGV4dGVuZHMgQWJzdHJhY3RNYXA8SywgVj4gaW1wbGVtZW50cyBDb25jdXJyZW50TWFwPEssIFY+LCBTZXJpYWxpemFibGUgeworCisgIC8qCisgICAqIFRoZSBiYXNpYyBzdHJhdGVneSBpcyB0byBzdWJkaXZpZGUgdGhlIHRhYmxlIGFtb25nIFNlZ21lbnRzLCBlYWNoIG9mIHdoaWNoIGl0c2VsZiBpcyBhCisgICAqIGNvbmN1cnJlbnRseSByZWFkYWJsZSBoYXNoIHRhYmxlLiBUaGUgbWFwIHN1cHBvcnRzIG5vbi1ibG9ja2luZyByZWFkcyBhbmQgY29uY3VycmVudCB3cml0ZXMKKyAgICogYWNyb3NzIGRpZmZlcmVudCBzZWdtZW50cy4KKyAgICoKKyAgICogSWYgYSBtYXhpbXVtIHNpemUgaXMgc3BlY2lmaWVkLCBhIGJlc3QtZWZmb3J0IGJvdW5kaW5nIGlzIHBlcmZvcm1lZCBwZXIgc2VnbWVudCwgdXNpbmcgYQorICAgKiBwYWdlLXJlcGxhY2VtZW50IGFsZ29yaXRobSB0byBkZXRlcm1pbmUgd2hpY2ggZW50cmllcyB0byBldmljdCB3aGVuIHRoZSBjYXBhY2l0eSBoYXMgYmVlbgorICAgKiBleGNlZWRlZC4KKyAgICoKKyAgICogVGhlIHBhZ2UgcmVwbGFjZW1lbnQgYWxnb3JpdGhtJ3MgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBrZXB0IGNhc3VhbGx5IGNvbnNpc3RlbnQgd2l0aCB0aGUgbWFwLiBUaGUKKyAgICogb3JkZXJpbmcgb2Ygd3JpdGVzIHRvIGEgc2VnbWVudCBpcyBzZXF1ZW50aWFsbHkgY29uc2lzdGVudC4gQW4gdXBkYXRlIHRvIHRoZSBtYXAgYW5kIHJlY29yZGluZworICAgKiBvZiByZWFkcyBtYXkgbm90IGJlIGltbWVkaWF0ZWx5IHJlZmxlY3RlZCBvbiB0aGUgYWxnb3JpdGhtJ3MgZGF0YSBzdHJ1Y3R1cmVzLiBUaGVzZSBzdHJ1Y3R1cmVzCisgICAqIGFyZSBndWFyZGVkIGJ5IGEgbG9jayBhbmQgb3BlcmF0aW9ucyBhcmUgYXBwbGllZCBpbiBiYXRjaGVzIHRvIGF2b2lkIGxvY2sgY29udGVudGlvbi4gVGhlCisgICAqIHBlbmFsdHkgb2YgYXBwbHlpbmcgdGhlIGJhdGNoZXMgaXMgc3ByZWFkIGFjcm9zcyB0aHJlYWRzIHNvIHRoYXQgdGhlIGFtb3J0aXplZCBjb3N0IGlzIHNsaWdodGx5CisgICAqIGhpZ2hlciB0aGFuIHBlcmZvcm1pbmcganVzdCB0aGUgb3BlcmF0aW9uIHdpdGhvdXQgZW5mb3JjaW5nIHRoZSBjYXBhY2l0eSBjb25zdHJhaW50LgorICAgKgorICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIHVzZXMgYSBwZXItc2VnbWVudCBxdWV1ZSB0byByZWNvcmQgYSBtZW1lbnRvIG9mIHRoZSBhZGRpdGlvbnMsIHJlbW92YWxzLAorICAgKiBhbmQgYWNjZXNzZXMgdGhhdCB3ZXJlIHBlcmZvcm1lZCBvbiB0aGUgbWFwLiBUaGUgcXVldWUgaXMgZHJhaW5lZCBvbiB3cml0ZXMgYW5kIHdoZW4gaXQgZXhjZWVkcworICAgKiBpdHMgY2FwYWNpdHkgdGhyZXNob2xkLgorICAgKgorICAgKiBUaGUgTGVhc3QgUmVjZW50bHkgVXNlZCBwYWdlIHJlcGxhY2VtZW50IGFsZ29yaXRobSB3YXMgY2hvc2VuIGR1ZSB0byBpdHMgc2ltcGxpY2l0eSwgaGlnaCBoaXQKKyAgICogcmF0ZSwgYW5kIGFiaWxpdHkgdG8gYmUgaW1wbGVtZW50ZWQgd2l0aCBPKDEpIHRpbWUgY29tcGxleGl0eS4gVGhlIGluaXRpYWwgTFJVIGltcGxlbWVudGF0aW9uCisgICAqIG9wZXJhdGVzIHBlci1zZWdtZW50IHJhdGhlciB0aGFuIGdsb2JhbGx5IGZvciBpbmNyZWFzZWQgaW1wbGVtZW50YXRpb24gc2ltcGxpY2l0eS4gV2UgZXhwZWN0CisgICAqIHRoZSBjYWNoZSBoaXQgcmF0ZSB0byBiZSBzaW1pbGFyIHRvIHRoYXQgb2YgYSBnbG9iYWwgTFJVIGFsZ29yaXRobS4KKyAgICovCisKKyAgICAvLyBDb25zdGFudHMKKworICAgIC8qKgorICAgICAqIFRoZSBtYXhpbXVtIGNhcGFjaXR5LCB1c2VkIGlmIGEgaGlnaGVyIHZhbHVlIGlzIGltcGxpY2l0bHkgc3BlY2lmaWVkIGJ5IGVpdGhlciBvZiB0aGUKKyAgICAgKiBjb25zdHJ1Y3RvcnMgd2l0aCBhcmd1bWVudHMuIE1VU1QgYmUgYSBwb3dlciBvZiB0d28gPD0gMTw8MzAgdG8gZW5zdXJlIHRoYXQgZW50cmllcyBhcmUKKyAgICAgKiBpbmRleGFibGUgdXNpbmcgaW50cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYSU1VTV9DQVBBQ0lUWSA9IEludHMuTUFYX1BPV0VSX09GX1RXTzsKKworICAgIC8qKgorICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBzZWdtZW50cyB0byBhbGxvdzsgdXNlZCB0byBib3VuZCBjb25zdHJ1Y3RvciBhcmd1bWVudHMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9TRUdNRU5UUyA9IDEgPDwgMTY7IC8vIHNsaWdodGx5IGNvbnNlcnZhdGl2ZQorCisgICAgLyoqCisgICAgICogTnVtYmVyIG9mICh1bnN5bmNocm9uaXplZCkgcmV0cmllcyBpbiB0aGUgY29udGFpbnNWYWx1ZSBtZXRob2QuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENPTlRBSU5TX1ZBTFVFX1JFVFJJRVMgPSAzOworCisgICAgLyoqCisgICAgICogTnVtYmVyIG9mIGNhY2hlIGFjY2VzcyBvcGVyYXRpb25zIHRoYXQgY2FuIGJlIGJ1ZmZlcmVkIHBlciBzZWdtZW50IGJlZm9yZSB0aGUgY2FjaGUncyByZWNlbmN5CisgICAgICogb3JkZXJpbmcgaW5mb3JtYXRpb24gaXMgdXBkYXRlZC4gVGhpcyBpcyB1c2VkIHRvIGF2b2lkIGxvY2sgY29udGVudGlvbiBieSByZWNvcmRpbmcgYSBtZW1lbnRvCisgICAgICogb2YgcmVhZHMgYW5kIGRlbGF5aW5nIGEgbG9jayBhY3F1aXNpdGlvbiB1bnRpbCB0aGUgdGhyZXNob2xkIGlzIGNyb3NzZWQgb3IgYSBtdXRhdGlvbiBvY2N1cnMuCisgICAgICogPHA+CisgICAgICogPHA+VGhpcyBtdXN0IGJlIGEgKDJebiktMSBhcyBpdCBpcyB1c2VkIGFzIGEgbWFzay4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRFJBSU5fVEhSRVNIT0xEID0gMHgzRjsKKworICAgIC8qKgorICAgICAqIE1heGltdW0gbnVtYmVyIG9mIGVudHJpZXMgdG8gYmUgZHJhaW5lZCBpbiBhIHNpbmdsZSBjbGVhbnVwIHJ1bi4gVGhpcyBhcHBsaWVzIGluZGVwZW5kZW50bHkgdG8KKyAgICAgKiB0aGUgY2xlYW51cCBxdWV1ZSBhbmQgYm90aCByZWZlcmVuY2UgcXVldWVzLgorICAgICAqLworICAgIC8vIFRPRE8oZnJ5KTogZW1waXJpY2FsbHkgb3B0aW1pemUgdGhpcworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBEUkFJTl9NQVggPSAxNjsKKworICAgIC8vIEZpZWxkcworICAgIC8qKgorICAgICAqIFBsYWNlaG9sZGVyLiBJbmRpY2F0ZXMgdGhhdCB0aGUgdmFsdWUgaGFzbid0IGJlZW4gc2V0IHlldC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBWYWx1ZVJlZmVyZW5jZTxPYmplY3QsIE9iamVjdD4gVU5TRVQgPSBuZXcgVmFsdWVSZWZlcmVuY2U8T2JqZWN0LCBPYmplY3Q+KCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVmZXJlbmNlRW50cnk8T2JqZWN0LCBPYmplY3Q+IGdldEVudHJ5KCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFZhbHVlUmVmZXJlbmNlPE9iamVjdCwgT2JqZWN0PiBjb3B5Rm9yKFJlZmVyZW5jZVF1ZXVlPE9iamVjdD4gcXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUsIFJlZmVyZW5jZUVudHJ5PE9iamVjdCwgT2JqZWN0PiBlbnRyeSkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDb21wdXRpbmdSZWZlcmVuY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoVmFsdWVSZWZlcmVuY2U8T2JqZWN0LCBPYmplY3Q+IG5ld1ZhbHVlKSB7CisgICAgICAgIH0KKyAgICB9OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFF1ZXVlPD8+IERJU0NBUkRJTkdfUVVFVUUgPSBuZXcgQWJzdHJhY3RRdWV1ZTxPYmplY3Q+KCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb2ZmZXIoT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPYmplY3QgcGVlaygpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPYmplY3QgcG9sbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBJdGVyYXRvcjxPYmplY3Q+IGl0ZXJhdG9yKCkgeworICAgICAgICAgICAgcmV0dXJuIEl0ZXJhdG9ycy5lbXB0eUl0ZXJhdG9yKCk7CisgICAgICAgIH0KKyAgICB9OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKE1hcE1ha2VySW50ZXJuYWxNYXAuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA1OworICAgIC8qKgorICAgICAqIE1hc2sgdmFsdWUgZm9yIGluZGV4aW5nIGludG8gc2VnbWVudHMuIFRoZSB1cHBlciBiaXRzIG9mIGEga2V5J3MgaGFzaCBjb2RlIGFyZSB1c2VkIHRvIGNob29zZQorICAgICAqIHRoZSBzZWdtZW50LgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgdHJhbnNpZW50IGludCBzZWdtZW50TWFzazsKKyAgICAvKioKKyAgICAgKiBTaGlmdCB2YWx1ZSBmb3IgaW5kZXhpbmcgd2l0aGluIHNlZ21lbnRzLiBIZWxwcyBwcmV2ZW50IGVudHJpZXMgdGhhdCBlbmQgdXAgaW4gdGhlIHNhbWUgc2VnbWVudAorICAgICAqIGZyb20gYWxzbyBlbmRpbmcgdXAgaW4gdGhlIHNhbWUgYnVja2V0LgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgdHJhbnNpZW50IGludCBzZWdtZW50U2hpZnQ7CisgICAgLyoqCisgICAgICogVGhlIHNlZ21lbnRzLCBlYWNoIG9mIHdoaWNoIGlzIGEgc3BlY2lhbGl6ZWQgaGFzaCB0YWJsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIHRyYW5zaWVudCBTZWdtZW50PEssIFY+W10gc2VnbWVudHM7CisgICAgLyoqCisgICAgICogVGhlIGNvbmN1cnJlbmN5IGxldmVsLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgaW50IGNvbmN1cnJlbmN5TGV2ZWw7CisgICAgLyoqCisgICAgICogU3RyYXRlZ3kgZm9yIGNvbXBhcmluZyBrZXlzLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgRXF1aXZhbGVuY2U8T2JqZWN0PiBrZXlFcXVpdmFsZW5jZTsKKyAgICAvKioKKyAgICAgKiBTdHJhdGVneSBmb3IgY29tcGFyaW5nIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIEVxdWl2YWxlbmNlPE9iamVjdD4gdmFsdWVFcXVpdmFsZW5jZTsKKyAgICAvKioKKyAgICAgKiBTdHJhdGVneSBmb3IgcmVmZXJlbmNpbmcga2V5cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIFN0cmVuZ3RoIGtleVN0cmVuZ3RoOworICAgIC8qKgorICAgICAqIFN0cmF0ZWd5IGZvciByZWZlcmVuY2luZyB2YWx1ZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJlbmd0aCB2YWx1ZVN0cmVuZ3RoOworICAgIC8qKgorICAgICAqIFRoZSBtYXhpbXVtIHNpemUgb2YgdGhpcyBtYXAuIE1hcE1ha2VyLlVOU0VUX0lOVCBpZiB0aGVyZSBpcyBubyBtYXhpbXVtLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgaW50IG1heGltdW1TaXplOworICAgIC8qKgorICAgICAqIEhvdyBsb25nIGFmdGVyIHRoZSBsYXN0IGFjY2VzcyB0byBhbiBlbnRyeSB0aGUgbWFwIHdpbGwgcmV0YWluIHRoYXQgZW50cnkuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIGV4cGlyZUFmdGVyQWNjZXNzTmFub3M7CisgICAgLyoqCisgICAgICogSG93IGxvbmcgYWZ0ZXIgdGhlIGxhc3Qgd3JpdGUgdG8gYW4gZW50cnkgdGhlIG1hcCB3aWxsIHJldGFpbiB0aGF0IGVudHJ5LgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgbG9uZyBleHBpcmVBZnRlcldyaXRlTmFub3M7CisgICAgLyoqCisgICAgICogRW50cmllcyB3YWl0aW5nIHRvIGJlIGNvbnN1bWVkIGJ5IHRoZSByZW1vdmFsIGxpc3RlbmVyLgorICAgICAqLworICAgIC8vIFRPRE8oZnJ5KTogZGVmaW5lIGEgbmV3IHR5cGUgd2hpY2ggY3JlYXRlcyBldmVudCBvYmplY3RzIGFuZCBhdXRvbWF0ZXMgdGhlIGNsZWFyIGxvZ2ljCisgICAgcHJpdmF0ZSBmaW5hbCBRdWV1ZTxNYXBNYWtlci5SZW1vdmFsTm90aWZpY2F0aW9uPEssIFY+PiByZW1vdmFsTm90aWZpY2F0aW9uUXVldWU7CisgICAgLyoqCisgICAgICogQSBsaXN0ZW5lciB0aGF0IGlzIGludm9rZWQgd2hlbiBhbiBlbnRyeSBpcyByZW1vdmVkIGR1ZSB0byBleHBpcmF0aW9uIG9yIGdhcmJhZ2UgY29sbGVjdGlvbiBvZgorICAgICAqIHNvZnQvd2VhayBlbnRyaWVzLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgTWFwTWFrZXIuUmVtb3ZhbExpc3RlbmVyPEssIFY+IHJlbW92YWxMaXN0ZW5lcjsKKyAgICAvKioKKyAgICAgKiBGYWN0b3J5IHVzZWQgdG8gY3JlYXRlIG5ldyBlbnRyaWVzLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgdHJhbnNpZW50IEVudHJ5RmFjdG9yeSBlbnRyeUZhY3Rvcnk7CisgICAgLyoqCisgICAgICogTWVhc3VyZXMgdGltZSBpbiBhIHRlc3RhYmxlIHdheS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIFRpY2tlciB0aWNrZXI7CisgICAgcHJpdmF0ZSB0cmFuc2llbnQgU2V0PEs+IGtleVNldDsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBDb2xsZWN0aW9uPFY+IHZhbHVlczsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBTZXQ8RW50cnk8SywgVj4+IGVudHJ5U2V0OworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldywgZW1wdHkgbWFwIHdpdGggdGhlIHNwZWNpZmllZCBzdHJhdGVneSwgaW5pdGlhbCBjYXBhY2l0eSBhbmQgY29uY3VycmVuY3kgbGV2ZWwuCisgICAgICovCisgICAgcHJpdmF0ZSBNYXBNYWtlckludGVybmFsTWFwKE1hcE1ha2VyIGJ1aWxkZXIpIHsKKyAgICAgICAgY29uY3VycmVuY3lMZXZlbCA9IE1hdGgubWluKGJ1aWxkZXIuZ2V0Q29uY3VycmVuY3lMZXZlbCgpLCBNQVhfU0VHTUVOVFMpOworCisgICAgICAgIGtleVN0cmVuZ3RoID0gYnVpbGRlci5nZXRLZXlTdHJlbmd0aCgpOworICAgICAgICB2YWx1ZVN0cmVuZ3RoID0gYnVpbGRlci5nZXRWYWx1ZVN0cmVuZ3RoKCk7CisKKyAgICAgICAga2V5RXF1aXZhbGVuY2UgPSBidWlsZGVyLmdldEtleUVxdWl2YWxlbmNlKCk7CisgICAgICAgIHZhbHVlRXF1aXZhbGVuY2UgPSB2YWx1ZVN0cmVuZ3RoLmRlZmF1bHRFcXVpdmFsZW5jZSgpOworCisgICAgICAgIG1heGltdW1TaXplID0gYnVpbGRlci5tYXhpbXVtU2l6ZTsKKyAgICAgICAgZXhwaXJlQWZ0ZXJBY2Nlc3NOYW5vcyA9IGJ1aWxkZXIuZ2V0RXhwaXJlQWZ0ZXJBY2Nlc3NOYW5vcygpOworICAgICAgICBleHBpcmVBZnRlcldyaXRlTmFub3MgPSBidWlsZGVyLmdldEV4cGlyZUFmdGVyV3JpdGVOYW5vcygpOworCisgICAgICAgIGVudHJ5RmFjdG9yeSA9IEVudHJ5RmFjdG9yeS5nZXRGYWN0b3J5KGtleVN0cmVuZ3RoLCBleHBpcmVzKCksIGV2aWN0c0J5U2l6ZSgpKTsKKyAgICAgICAgdGlja2VyID0gYnVpbGRlci5nZXRUaWNrZXIoKTsKKworICAgICAgICByZW1vdmFsTGlzdGVuZXIgPSBidWlsZGVyLmdldFJlbW92YWxMaXN0ZW5lcigpOworICAgICAgICByZW1vdmFsTm90aWZpY2F0aW9uUXVldWUgPSAocmVtb3ZhbExpc3RlbmVyID09IEdlbmVyaWNNYXBNYWtlci5OdWxsTGlzdGVuZXIuSU5TVEFOQ0UpCisgICAgICAgICAgICAgICAgPyBNYXBNYWtlckludGVybmFsTWFwLmRpc2NhcmRpbmdRdWV1ZSgpCisgICAgICAgICAgICAgICAgOiBuZXcgQ29uY3VycmVudExpbmtlZFF1ZXVlPE1hcE1ha2VyLlJlbW92YWxOb3RpZmljYXRpb248SywgVj4+KCk7CisKKyAgICAgICAgaW50IGluaXRpYWxDYXBhY2l0eSA9IE1hdGgubWluKGJ1aWxkZXIuZ2V0SW5pdGlhbENhcGFjaXR5KCksIE1BWElNVU1fQ0FQQUNJVFkpOworICAgICAgICBpZiAoZXZpY3RzQnlTaXplKCkpIHsKKyAgICAgICAgICAgIGluaXRpYWxDYXBhY2l0eSA9IE1hdGgubWluKGluaXRpYWxDYXBhY2l0eSwgbWF4aW11bVNpemUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRmluZCBwb3dlci1vZi10d28gc2l6ZXMgYmVzdCBtYXRjaGluZyBhcmd1bWVudHMuIENvbnN0cmFpbnRzOgorICAgICAgICAvLyAoc2VnbWVudENvdW50IDw9IG1heGltdW1TaXplKQorICAgICAgICAvLyAmJiAoY29uY3VycmVuY3lMZXZlbCA+IG1heGltdW1TaXplIHx8IHNlZ21lbnRDb3VudCA+IGNvbmN1cnJlbmN5TGV2ZWwpCisgICAgICAgIGludCBzZWdtZW50U2hpZnQgPSAwOworICAgICAgICBpbnQgc2VnbWVudENvdW50ID0gMTsKKyAgICAgICAgd2hpbGUgKHNlZ21lbnRDb3VudCA8IGNvbmN1cnJlbmN5TGV2ZWwKKyAgICAgICAgICAgICAgICAmJiAoIWV2aWN0c0J5U2l6ZSgpIHx8IHNlZ21lbnRDb3VudCAqIDIgPD0gbWF4aW11bVNpemUpKSB7CisgICAgICAgICAgICArK3NlZ21lbnRTaGlmdDsKKyAgICAgICAgICAgIHNlZ21lbnRDb3VudCA8PD0gMTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnNlZ21lbnRTaGlmdCA9IDMyIC0gc2VnbWVudFNoaWZ0OworICAgICAgICBzZWdtZW50TWFzayA9IHNlZ21lbnRDb3VudCAtIDE7CisKKyAgICAgICAgdGhpcy5zZWdtZW50cyA9IG5ld1NlZ21lbnRBcnJheShzZWdtZW50Q291bnQpOworCisgICAgICAgIGludCBzZWdtZW50Q2FwYWNpdHkgPSBpbml0aWFsQ2FwYWNpdHkgLyBzZWdtZW50Q291bnQ7CisgICAgICAgIGlmIChzZWdtZW50Q2FwYWNpdHkgKiBzZWdtZW50Q291bnQgPCBpbml0aWFsQ2FwYWNpdHkpIHsKKyAgICAgICAgICAgICsrc2VnbWVudENhcGFjaXR5OworICAgICAgICB9CisKKyAgICAgICAgaW50IHNlZ21lbnRTaXplID0gMTsKKyAgICAgICAgd2hpbGUgKHNlZ21lbnRTaXplIDwgc2VnbWVudENhcGFjaXR5KSB7CisgICAgICAgICAgICBzZWdtZW50U2l6ZSA8PD0gMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChldmljdHNCeVNpemUoKSkgeworICAgICAgICAgICAgLy8gRW5zdXJlIHN1bSBvZiBzZWdtZW50IG1heCBzaXplcyA9IG92ZXJhbGwgbWF4IHNpemUKKyAgICAgICAgICAgIGludCBtYXhpbXVtU2VnbWVudFNpemUgPSBtYXhpbXVtU2l6ZSAvIHNlZ21lbnRDb3VudCArIDE7CisgICAgICAgICAgICBpbnQgcmVtYWluZGVyID0gbWF4aW11bVNpemUgJSBzZWdtZW50Q291bnQ7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMuc2VnbWVudHMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSByZW1haW5kZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgbWF4aW11bVNlZ21lbnRTaXplLS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRoaXMuc2VnbWVudHNbaV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlU2VnbWVudChzZWdtZW50U2l6ZSwgbWF4aW11bVNlZ21lbnRTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy5zZWdtZW50cy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgIHRoaXMuc2VnbWVudHNbaV0gPQorICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlU2VnbWVudChzZWdtZW50U2l6ZSwgTWFwTWFrZXIuVU5TRVRfSU5UKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNpbmdsZXRvbiBwbGFjZWhvbGRlciB0aGF0IGluZGljYXRlcyBhIHZhbHVlIGlzIGJlaW5nIGNvbXB1dGVkLgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSAvLyBpbXBsIG5ldmVyIHVzZXMgYSBwYXJhbWV0ZXIgb3IgcmV0dXJucyBhbnkgbm9uLW51bGwgdmFsdWUKKyAgICBwcml2YXRlIHN0YXRpYyA8SywgVj4gVmFsdWVSZWZlcmVuY2U8SywgVj4gdW5zZXQoKSB7CisgICAgICAgIHJldHVybiAoVmFsdWVSZWZlcmVuY2U8SywgVj4pIFVOU0VUOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSAvLyBpbXBsIG5ldmVyIHVzZXMgYSBwYXJhbWV0ZXIgb3IgcmV0dXJucyBhbnkgbm9uLW51bGwgdmFsdWUKKyAgICBwcml2YXRlIHN0YXRpYyA8SywgVj4gUmVmZXJlbmNlRW50cnk8SywgVj4gbnVsbEVudHJ5KCkgeworICAgICAgICByZXR1cm4gKFJlZmVyZW5jZUVudHJ5PEssIFY+KSBOdWxsRW50cnkuSU5TVEFOQ0U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUXVldWUgdGhhdCBkaXNjYXJkcyBhbGwgZWxlbWVudHMuCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIC8vIGltcGwgbmV2ZXIgdXNlcyBhIHBhcmFtZXRlciBvciByZXR1cm5zIGFueSBub24tbnVsbCB2YWx1ZQorICAgIHByaXZhdGUgc3RhdGljIDxFPiBRdWV1ZTxFPiBkaXNjYXJkaW5nUXVldWUoKSB7CisgICAgICAgIHJldHVybiAoUXVldWUpIERJU0NBUkRJTkdfUVVFVUU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwbGllcyBhIHN1cHBsZW1lbnRhbCBoYXNoIGZ1bmN0aW9uIHRvIGEgZ2l2ZW4gaGFzaCBjb2RlLCB3aGljaCBkZWZlbmRzIGFnYWluc3QgcG9vciBxdWFsaXR5CisgICAgICogaGFzaCBmdW5jdGlvbnMuIFRoaXMgaXMgY3JpdGljYWwgd2hlbiB0aGUgY29uY3VycmVudCBoYXNoIG1hcCB1c2VzIHBvd2VyLW9mLXR3byBsZW5ndGggaGFzaAorICAgICAqIHRhYmxlcywgdGhhdCBvdGhlcndpc2UgZW5jb3VudGVyIGNvbGxpc2lvbnMgZm9yIGhhc2ggY29kZXMgdGhhdCBkbyBub3QgZGlmZmVyIGluIGxvd2VyIG9yCisgICAgICogdXBwZXIgYml0cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBoIGhhc2ggY29kZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludCByZWhhc2goaW50IGgpIHsKKyAgICAgICAgLy8gU3ByZWFkIGJpdHMgdG8gcmVndWxhcml6ZSBib3RoIHNlZ21lbnQgYW5kIGluZGV4IGxvY2F0aW9ucywKKyAgICAgICAgLy8gdXNpbmcgdmFyaWFudCBvZiBzaW5nbGUtd29yZCBXYW5nL0plbmtpbnMgaGFzaC4KKyAgICAgICAgLy8gVE9ETyhrZXZpbmIpOiB1c2UgSGFzaGluZy9tb3ZlIHRoaXMgdG8gSGFzaGluZz8KKyAgICAgICAgaCArPSAoaCA8PCAxNSkgXiAweGZmZmZjZDdkOworICAgICAgICBoIF49IChoID4+PiAxMCk7CisgICAgICAgIGggKz0gKGggPDwgMyk7CisgICAgICAgIGggXj0gKGggPj4+IDYpOworICAgICAgICBoICs9IChoIDw8IDIpICsgKGggPDwgMTQpOworICAgICAgICByZXR1cm4gaCBeIChoID4+PiAxNik7CisgICAgfQorCisgICAgLy8gR3VhcmRlZCBCeSBTZWdtZW50LnRoaXMKKyAgICBwcml2YXRlIHN0YXRpYyA8SywgVj4gdm9pZCBjb25uZWN0RXhwaXJhYmxlcyhSZWZlcmVuY2VFbnRyeTxLLCBWPiBwcmV2aW91cywgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV4dCkgeworICAgICAgICBwcmV2aW91cy5zZXROZXh0RXhwaXJhYmxlKG5leHQpOworICAgICAgICBuZXh0LnNldFByZXZpb3VzRXhwaXJhYmxlKHByZXZpb3VzKTsKKyAgICB9CisKKyAgICAvLyBHdWFyZGVkIEJ5IFNlZ21lbnQudGhpcworICAgIHByaXZhdGUgc3RhdGljIDxLLCBWPiB2b2lkIG51bGxpZnlFeHBpcmFibGUoUmVmZXJlbmNlRW50cnk8SywgVj4gbnVsbGVkKSB7CisgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IG51bGxFbnRyeSA9IG51bGxFbnRyeSgpOworICAgICAgICBudWxsZWQuc2V0TmV4dEV4cGlyYWJsZShudWxsRW50cnkpOworICAgICAgICBudWxsZWQuc2V0UHJldmlvdXNFeHBpcmFibGUobnVsbEVudHJ5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMaW5rcyB0aGUgZXZpdGFibGVzIHRvZ2V0aGVyLgorICAgICAqLworICAgIC8vIEd1YXJkZWQgQnkgU2VnbWVudC50aGlzCisgICAgcHJpdmF0ZSBzdGF0aWMgPEssIFY+IHZvaWQgY29ubmVjdEV2aWN0YWJsZXMoUmVmZXJlbmNlRW50cnk8SywgVj4gcHJldmlvdXMsIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5leHQpIHsKKyAgICAgICAgcHJldmlvdXMuc2V0TmV4dEV2aWN0YWJsZShuZXh0KTsKKyAgICAgICAgbmV4dC5zZXRQcmV2aW91c0V2aWN0YWJsZShwcmV2aW91cyk7CisgICAgfQorCisgICAgLy8gR3VhcmRlZCBCeSBTZWdtZW50LnRoaXMKKyAgICBwcml2YXRlIHN0YXRpYyA8SywgVj4gdm9pZCBudWxsaWZ5RXZpY3RhYmxlKFJlZmVyZW5jZUVudHJ5PEssIFY+IG51bGxlZCkgeworICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBudWxsRW50cnkgPSBudWxsRW50cnkoKTsKKyAgICAgICAgbnVsbGVkLnNldE5leHRFdmljdGFibGUobnVsbEVudHJ5KTsKKyAgICAgICAgbnVsbGVkLnNldFByZXZpb3VzRXZpY3RhYmxlKG51bGxFbnRyeSk7CisgICAgfQorCisgICAgYm9vbGVhbiBldmljdHNCeVNpemUoKSB7CisgICAgICAgIHJldHVybiBtYXhpbXVtU2l6ZSAhPSBNYXBNYWtlci5VTlNFVF9JTlQ7CisgICAgfQorCisgICAgYm9vbGVhbiBleHBpcmVzKCkgeworICAgICAgICByZXR1cm4gZXhwaXJlc0FmdGVyV3JpdGUoKSB8fCBleHBpcmVzQWZ0ZXJBY2Nlc3MoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gZXhwaXJlc0FmdGVyV3JpdGUoKSB7CisgICAgICAgIHJldHVybiBleHBpcmVBZnRlcldyaXRlTmFub3MgPiAwOworICAgIH0KKworICAvKgorICAgKiBOb3RlOiBBbGwgb2YgdGhpcyBkdXBsaWNhdGUgY29kZSBzdWNrcywgYnV0IGl0IHNhdmVzIGEgbG90IG9mIG1lbW9yeS4gSWYgb25seSBKYXZhIGhhZCBtaXhpbnMhCisgICAqIFRvIG1haW50YWluIHRoaXMgY29kZSwgbWFrZSBhIGNoYW5nZSBmb3IgdGhlIHN0cm9uZyByZWZlcmVuY2UgdHlwZS4gVGhlbiwgY3V0IGFuZCBwYXN0ZSwgYW5kCisgICAqIHJlcGxhY2UgIlN0cm9uZyIgd2l0aCAiU29mdCIgb3IgIldlYWsiIHdpdGhpbiB0aGUgcGFzdGVkIHRleHQuIFRoZSBwcmltYXJ5IGRpZmZlcmVuY2UgaXMgdGhhdAorICAgKiBzdHJvbmcgZW50cmllcyBzdG9yZSB0aGUga2V5IHJlZmVyZW5jZSBkaXJlY3RseSB3aGlsZSBzb2Z0IGFuZCB3ZWFrIGVudHJpZXMgZGVsZWdhdGUgdG8gdGhlaXIKKyAgICogcmVzcGVjdGl2ZSBzdXBlcmNsYXNzZXMuCisgICAqLworCisgICAgYm9vbGVhbiBleHBpcmVzQWZ0ZXJBY2Nlc3MoKSB7CisgICAgICAgIHJldHVybiBleHBpcmVBZnRlckFjY2Vzc05hbm9zID4gMDsKKyAgICB9CisKKyAgICBib29sZWFuIHVzZXNLZXlSZWZlcmVuY2VzKCkgeworICAgICAgICByZXR1cm4ga2V5U3RyZW5ndGggIT0gU3RyZW5ndGguU1RST05HOworICAgIH0KKworICAgIGJvb2xlYW4gdXNlc1ZhbHVlUmVmZXJlbmNlcygpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlU3RyZW5ndGggIT0gU3RyZW5ndGguU1RST05HOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGhhc2goT2JqZWN0IGtleSkgeworICAgICAgICBpbnQgaCA9IGtleUVxdWl2YWxlbmNlLmhhc2goa2V5KTsKKyAgICAgICAgcmV0dXJuIHJlaGFzaChoKTsKKyAgICB9CisKKyAgICB2b2lkIHJlY2xhaW1WYWx1ZShWYWx1ZVJlZmVyZW5jZTxLLCBWPiB2YWx1ZVJlZmVyZW5jZSkgeworICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBlbnRyeSA9IHZhbHVlUmVmZXJlbmNlLmdldEVudHJ5KCk7CisgICAgICAgIGludCBoYXNoID0gZW50cnkuZ2V0SGFzaCgpOworICAgICAgICBzZWdtZW50Rm9yKGhhc2gpLnJlY2xhaW1WYWx1ZShlbnRyeS5nZXRLZXkoKSwgaGFzaCwgdmFsdWVSZWZlcmVuY2UpOworICAgIH0KKworICAgIHZvaWQgcmVjbGFpbUtleShSZWZlcmVuY2VFbnRyeTxLLCBWPiBlbnRyeSkgeworICAgICAgICBpbnQgaGFzaCA9IGVudHJ5LmdldEhhc2goKTsKKyAgICAgICAgc2VnbWVudEZvcihoYXNoKS5yZWNsYWltS2V5KGVudHJ5LCBoYXNoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzZWdtZW50IHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIGEga2V5IHdpdGggdGhlIGdpdmVuIGhhc2guCisgICAgICoKKyAgICAgKiBAcGFyYW0gaGFzaCB0aGUgaGFzaCBjb2RlIGZvciB0aGUga2V5CisgICAgICogQHJldHVybiB0aGUgc2VnbWVudAorICAgICAqLworICAgIHByaXZhdGUgU2VnbWVudDxLLCBWPiBzZWdtZW50Rm9yKGludCBoYXNoKSB7CisgICAgICAgIC8vIFRPRE8oZnJ5KTogTGF6aWx5IGNyZWF0ZSBzZWdtZW50cz8KKyAgICAgICAgcmV0dXJuIHNlZ21lbnRzWyhoYXNoID4+PiBzZWdtZW50U2hpZnQpICYgc2VnbWVudE1hc2tdOworICAgIH0KKworICAgIHByaXZhdGUgU2VnbWVudDxLLCBWPiBjcmVhdGVTZWdtZW50KGludCBpbml0aWFsQ2FwYWNpdHksIGludCBtYXhTZWdtZW50U2l6ZSkgeworICAgICAgICByZXR1cm4gbmV3IFNlZ21lbnQ8SywgVj4odGhpcywgaW5pdGlhbENhcGFjaXR5LCBtYXhTZWdtZW50U2l6ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgZnJvbSBhbiBlbnRyeS4gUmV0dXJucyB7QGNvZGUgbnVsbH0gaWYgdGhlIGVudHJ5IGlzIGludmFsaWQsCisgICAgICogcGFydGlhbGx5LWNvbGxlY3RlZCwgY29tcHV0aW5nLCBvciBleHBpcmVkLiBVbmxpa2Uge0BsaW5rIFNlZ21lbnQjZ2V0TGl2ZVZhbHVlfSB0aGlzIG1ldGhvZAorICAgICAqIGRvZXMgbm90IGF0dGVtcHQgdG8gY2xlYW4gdXAgc3RhbGUgZW50cmllcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFYgZ2V0TGl2ZVZhbHVlKFJlZmVyZW5jZUVudHJ5PEssIFY+IGVudHJ5KSB7CisgICAgICAgIGlmIChlbnRyeS5nZXRLZXkoKSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBWIHZhbHVlID0gZW50cnkuZ2V0VmFsdWVSZWZlcmVuY2UoKS5nZXQoKTsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGV4cGlyZXMoKSAmJiBpc0V4cGlyZWQoZW50cnkpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGVudHJ5IGhhcyBleHBpcmVkLgorICAgICAqLworICAgIGJvb2xlYW4gaXNFeHBpcmVkKFJlZmVyZW5jZUVudHJ5PEssIFY+IGVudHJ5KSB7CisgICAgICAgIHJldHVybiBpc0V4cGlyZWQoZW50cnksIHRpY2tlci5yZWFkKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoZSBlbnRyeSBoYXMgZXhwaXJlZC4KKyAgICAgKi8KKyAgICBib29sZWFuIGlzRXhwaXJlZChSZWZlcmVuY2VFbnRyeTxLLCBWPiBlbnRyeSwgbG9uZyBub3cpIHsKKyAgICAgICAgLy8gaWYgdGhlIGV4cGlyYXRpb24gdGltZSBoYWQgb3ZlcmZsb3dlZCwgdGhpcyAidW5kb2VzIiB0aGUgb3ZlcmZsb3cKKyAgICAgICAgcmV0dXJuIG5vdyAtIGVudHJ5LmdldEV4cGlyYXRpb25UaW1lKCkgPiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vdGlmaWVzIGxpc3RlbmVycyB0aGF0IGFuIGVudHJ5IGhhcyBiZWVuIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCBkdWUgdG8gZXhwaXJhdGlvbiwgZXZpY3Rpb24sCisgICAgICogb3IgZWxpZ2liaWxpdHkgZm9yIGdhcmJhZ2UgY29sbGVjdGlvbi4gVGhpcyBzaG91bGQgYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgZXhwaXJlRW50cmllcyBvcgorICAgICAqIGV2aWN0RW50cnkgaXMgY2FsbGVkIChvbmNlIHRoZSBsb2NrIGlzIHJlbGVhc2VkKS4KKyAgICAgKi8KKyAgICB2b2lkIHByb2Nlc3NQZW5kaW5nTm90aWZpY2F0aW9ucygpIHsKKyAgICAgICAgTWFwTWFrZXIuUmVtb3ZhbE5vdGlmaWNhdGlvbjxLLCBWPiBub3RpZmljYXRpb247CisgICAgICAgIHdoaWxlICgobm90aWZpY2F0aW9uID0gcmVtb3ZhbE5vdGlmaWNhdGlvblF1ZXVlLnBvbGwoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZW1vdmFsTGlzdGVuZXIub25SZW1vdmFsKG5vdGlmaWNhdGlvbik7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGxvZ2dlci5sb2coTGV2ZWwuV0FSTklORywgIkV4Y2VwdGlvbiB0aHJvd24gYnkgcmVtb3ZhbCBsaXN0ZW5lciIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHJpdmF0ZSBTZWdtZW50PEssIFY+W10gbmV3U2VnbWVudEFycmF5KGludCBzc2l6ZSkgeworICAgICAgICByZXR1cm4gbmV3IFNlZ21lbnRbc3NpemVdOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgLyoKKyAgICAgKiBTdW0gcGVyLXNlZ21lbnQgbW9kQ291bnRzIHRvIGF2b2lkIG1pcy1yZXBvcnRpbmcgd2hlbiBlbGVtZW50cyBhcmUgY29uY3VycmVudGx5IGFkZGVkIGFuZAorICAgICAqIHJlbW92ZWQgaW4gb25lIHNlZ21lbnQgd2hpbGUgY2hlY2tpbmcgYW5vdGhlciwgaW4gd2hpY2ggY2FzZSB0aGUgdGFibGUgd2FzIG5ldmVyIGFjdHVhbGx5CisgICAgICogZW1wdHkgYXQgYW55IHBvaW50LiAoVGhlIHN1bSBlbnN1cmVzIGFjY3VyYWN5IHVwIHRocm91Z2ggYXQgbGVhc3QgMTw8MzEgcGVyLXNlZ21lbnQKKyAgICAgKiBtb2RpZmljYXRpb25zIGJlZm9yZSByZWNoZWNrLikgIE1ldGhvZCBjb250YWluc1ZhbHVlKCkgdXNlcyBzaW1pbGFyIGNvbnN0cnVjdGlvbnMgZm9yCisgICAgICogc3RhYmlsaXR5IGNoZWNrcy4KKyAgICAgKi8KKyAgICAgICAgbG9uZyBzdW0gPSAwTDsKKyAgICAgICAgU2VnbWVudDxLLCBWPltdIHNlZ21lbnRzID0gdGhpcy5zZWdtZW50czsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgaWYgKHNlZ21lbnRzW2ldLmNvdW50ICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdW0gKz0gc2VnbWVudHNbaV0ubW9kQ291bnQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3VtICE9IDBMKSB7IC8vIHJlY2hlY2sgdW5sZXNzIG5vIG1vZGlmaWNhdGlvbnMKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2VnbWVudHNbaV0uY291bnQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN1bSAtPSBzZWdtZW50c1tpXS5tb2RDb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdW0gIT0gMEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICBTZWdtZW50PEssIFY+W10gc2VnbWVudHMgPSB0aGlzLnNlZ21lbnRzOworICAgICAgICBsb25nIHN1bSA9IDA7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIHN1bSArPSBzZWdtZW50c1tpXS5jb3VudDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gSW50cy5zYXR1cmF0ZWRDYXN0KHN1bSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFYgZ2V0KE9iamVjdCBrZXkpIHsKKyAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpbnQgaGFzaCA9IGhhc2goa2V5KTsKKyAgICAgICAgcmV0dXJuIHNlZ21lbnRGb3IoaGFzaCkuZ2V0KGtleSwgaGFzaCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoT2JqZWN0IGtleSkgeworICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpbnQgaGFzaCA9IGhhc2goa2V5KTsKKyAgICAgICAgcmV0dXJuIHNlZ21lbnRGb3IoaGFzaCkuY29udGFpbnNLZXkoa2V5LCBoYXNoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKE9iamVjdCB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBwYXR0ZXJuZWQgYWZ0ZXIgQ29uY3VycmVudEhhc2hNYXAsIGJ1dCB3aXRob3V0IHRoZSBsb2NraW5nLiBUaGUgb25seQorICAgICAgICAvLyB3YXkgZm9yIGl0IHRvIHJldHVybiBhIGZhbHNlIG5lZ2F0aXZlIHdvdWxkIGJlIGZvciB0aGUgdGFyZ2V0IHZhbHVlIHRvIGp1bXAgYXJvdW5kIGluIHRoZSBtYXAKKyAgICAgICAgLy8gc3VjaCB0aGF0IG5vbmUgb2YgdGhlIHN1YnNlcXVlbnQgaXRlcmF0aW9ucyBvYnNlcnZlZCBpdCwgZGVzcGl0ZSB0aGUgZmFjdCB0aGF0IGF0IGV2ZXJ5IHBvaW50CisgICAgICAgIC8vIGluIHRpbWUgaXQgd2FzIHByZXNlbnQgc29tZXdoZXJlIGludCB0aGUgbWFwLiBUaGlzIGJlY29tZXMgaW5jcmVhc2luZ2x5IHVubGlrZWx5IGFzCisgICAgICAgIC8vIENPTlRBSU5TX1ZBTFVFX1JFVFJJRVMgaW5jcmVhc2VzLCB0aG91Z2ggd2l0aG91dCBsb2NraW5nIGl0IGlzIHRoZW9yZXRpY2FsbHkgcG9zc2libGUuCisgICAgICAgIGZpbmFsIFNlZ21lbnQ8SywgVj5bXSBzZWdtZW50cyA9IHRoaXMuc2VnbWVudHM7CisgICAgICAgIGxvbmcgbGFzdCA9IC0xTDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBDT05UQUlOU19WQUxVRV9SRVRSSUVTOyBpKyspIHsKKyAgICAgICAgICAgIGxvbmcgc3VtID0gMEw7CisgICAgICAgICAgICBmb3IgKFNlZ21lbnQ8SywgVj4gc2VnbWVudCA6IHNlZ21lbnRzKSB7CisgICAgICAgICAgICAgICAgLy8gZW5zdXJlIHZpc2liaWxpdHkgb2YgbW9zdCByZWNlbnQgY29tcGxldGVkIHdyaXRlCisgICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiIsICJ1bnVzZWQifSkKKyAgICAgICAgICAgICAgICBpbnQgYyA9IHNlZ21lbnQuY291bnQ7IC8vIHJlYWQtdm9sYXRpbGUKKworICAgICAgICAgICAgICAgIEF0b21pY1JlZmVyZW5jZUFycmF5PFJlZmVyZW5jZUVudHJ5PEssIFY+PiB0YWJsZSA9IHNlZ21lbnQudGFibGU7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB0YWJsZS5sZW5ndGgoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoUmVmZXJlbmNlRW50cnk8SywgVj4gZSA9IHRhYmxlLmdldChqKTsgZSAhPSBudWxsOyBlID0gZS5nZXROZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFYgdiA9IHNlZ21lbnQuZ2V0TGl2ZVZhbHVlKGUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgIT0gbnVsbCAmJiB2YWx1ZUVxdWl2YWxlbmNlLmVxdWl2YWxlbnQodmFsdWUsIHYpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3VtICs9IHNlZ21lbnQubW9kQ291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3VtID09IGxhc3QpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxhc3QgPSBzdW07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIGV4cGlyYXRpb24KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBWIHB1dChLIGtleSwgViB2YWx1ZSkgeworICAgICAgICBjaGVja05vdE51bGwoa2V5KTsKKyAgICAgICAgY2hlY2tOb3ROdWxsKHZhbHVlKTsKKyAgICAgICAgaW50IGhhc2ggPSBoYXNoKGtleSk7CisgICAgICAgIHJldHVybiBzZWdtZW50Rm9yKGhhc2gpLnB1dChrZXksIGhhc2gsIHZhbHVlLCBmYWxzZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFYgcHV0SWZBYnNlbnQoSyBrZXksIFYgdmFsdWUpIHsKKyAgICAgICAgY2hlY2tOb3ROdWxsKGtleSk7CisgICAgICAgIGNoZWNrTm90TnVsbCh2YWx1ZSk7CisgICAgICAgIGludCBoYXNoID0gaGFzaChrZXkpOworICAgICAgICByZXR1cm4gc2VnbWVudEZvcihoYXNoKS5wdXQoa2V5LCBoYXNoLCB2YWx1ZSwgdHJ1ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcHV0QWxsKE1hcDw/IGV4dGVuZHMgSywgPyBleHRlbmRzIFY+IG0pIHsKKyAgICAgICAgZm9yIChFbnRyeTw/IGV4dGVuZHMgSywgPyBleHRlbmRzIFY+IGUgOiBtLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIHB1dChlLmdldEtleSgpLCBlLmdldFZhbHVlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFYgcmVtb3ZlKE9iamVjdCBrZXkpIHsKKyAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpbnQgaGFzaCA9IGhhc2goa2V5KTsKKyAgICAgICAgcmV0dXJuIHNlZ21lbnRGb3IoaGFzaCkucmVtb3ZlKGtleSwgaGFzaCk7CisgICAgfQorCisgICAgLy8gZXZpY3Rpb24KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgaWYgKGtleSA9PSBudWxsIHx8IHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpbnQgaGFzaCA9IGhhc2goa2V5KTsKKyAgICAgICAgcmV0dXJuIHNlZ21lbnRGb3IoaGFzaCkucmVtb3ZlKGtleSwgaGFzaCwgdmFsdWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHJlcGxhY2UoSyBrZXksIFYgb2xkVmFsdWUsIFYgbmV3VmFsdWUpIHsKKyAgICAgICAgY2hlY2tOb3ROdWxsKGtleSk7CisgICAgICAgIGNoZWNrTm90TnVsbChuZXdWYWx1ZSk7CisgICAgICAgIGlmIChvbGRWYWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaW50IGhhc2ggPSBoYXNoKGtleSk7CisgICAgICAgIHJldHVybiBzZWdtZW50Rm9yKGhhc2gpLnJlcGxhY2Uoa2V5LCBoYXNoLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBWIHJlcGxhY2UoSyBrZXksIFYgdmFsdWUpIHsKKyAgICAgICAgY2hlY2tOb3ROdWxsKGtleSk7CisgICAgICAgIGNoZWNrTm90TnVsbCh2YWx1ZSk7CisgICAgICAgIGludCBoYXNoID0gaGFzaChrZXkpOworICAgICAgICByZXR1cm4gc2VnbWVudEZvcihoYXNoKS5yZXBsYWNlKGtleSwgaGFzaCwgdmFsdWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICBmb3IgKFNlZ21lbnQ8SywgVj4gc2VnbWVudCA6IHNlZ21lbnRzKSB7CisgICAgICAgICAgICBzZWdtZW50LmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJbm5lciBDbGFzc2VzCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PEs+IGtleVNldCgpIHsKKyAgICAgICAgU2V0PEs+IGtzID0ga2V5U2V0OworICAgICAgICByZXR1cm4gKGtzICE9IG51bGwpID8ga3MgOiAoa2V5U2V0ID0gbmV3IEtleVNldCgpKTsKKyAgICB9CisKKyAgICAvLyBRdWV1ZXMKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb2xsZWN0aW9uPFY+IHZhbHVlcygpIHsKKyAgICAgICAgQ29sbGVjdGlvbjxWPiB2cyA9IHZhbHVlczsKKyAgICAgICAgcmV0dXJuICh2cyAhPSBudWxsKSA/IHZzIDogKHZhbHVlcyA9IG5ldyBWYWx1ZXMoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxFbnRyeTxLLCBWPj4gZW50cnlTZXQoKSB7CisgICAgICAgIFNldDxFbnRyeTxLLCBWPj4gZXMgPSBlbnRyeVNldDsKKyAgICAgICAgcmV0dXJuIChlcyAhPSBudWxsKSA/IGVzIDogKGVudHJ5U2V0ID0gbmV3IEVudHJ5U2V0KCkpOworICAgIH0KKworICAgIC8vIENvbmN1cnJlbnRNYXAgbWV0aG9kcworCisgICAgZW51bSBTdHJlbmd0aCB7CisgICAgLyoKKyAgICAgKiBUT0RPKGtldmluYik6IElmIHdlIHN0cm9uZ2x5IHJlZmVyZW5jZSB0aGUgdmFsdWUgYW5kIGFyZW4ndCBjb21wdXRpbmcsIHdlIG5lZWRuJ3Qgd3JhcCB0aGUKKyAgICAgKiB2YWx1ZS4gVGhpcyBjb3VsZCBzYXZlIH44IGJ5dGVzIHBlciBlbnRyeS4KKyAgICAgKi8KKworICAgICAgICBTVFJPTkcgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICA8SywgVj4gVmFsdWVSZWZlcmVuY2U8SywgVj4gcmVmZXJlbmNlVmFsdWUoCisgICAgICAgICAgICAgICAgICAgIFNlZ21lbnQ8SywgVj4gc2VnbWVudCwgUmVmZXJlbmNlRW50cnk8SywgVj4gZW50cnksIFYgdmFsdWUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cm9uZ1ZhbHVlUmVmZXJlbmNlPEssIFY+KHZhbHVlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBFcXVpdmFsZW5jZTxPYmplY3Q+IGRlZmF1bHRFcXVpdmFsZW5jZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRXF1aXZhbGVuY2UuZXF1YWxzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSByZWZlcmVuY2UgZm9yIHRoZSBnaXZlbiB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhpcyB2YWx1ZSBzdHJlbmd0aC4KKyAgICAgICAgICovCisgICAgICAgIGFic3RyYWN0IDxLLCBWPiBWYWx1ZVJlZmVyZW5jZTxLLCBWPiByZWZlcmVuY2VWYWx1ZSgKKyAgICAgICAgICAgICAgICBTZWdtZW50PEssIFY+IHNlZ21lbnQsIFJlZmVyZW5jZUVudHJ5PEssIFY+IGVudHJ5LCBWIHZhbHVlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgZGVmYXVsdCBlcXVpdmFsZW5jZSBzdHJhdGVneSB1c2VkIHRvIGNvbXBhcmUgYW5kIGhhc2gga2V5cyBvciB2YWx1ZXMgcmVmZXJlbmNlZAorICAgICAgICAgKiBhdCB0aGlzIHN0cmVuZ3RoLiBUaGlzIHN0cmF0ZWd5IHdpbGwgYmUgdXNlZCB1bmxlc3MgdGhlIHVzZXIgZXhwbGljaXRseSBzcGVjaWZpZXMgYW4KKyAgICAgICAgICogYWx0ZXJuYXRlIHN0cmF0ZWd5LgorICAgICAgICAgKi8KKyAgICAgICAgYWJzdHJhY3QgRXF1aXZhbGVuY2U8T2JqZWN0PiBkZWZhdWx0RXF1aXZhbGVuY2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIG5ldyBlbnRyaWVzLgorICAgICAqLworICAgIGVudW0gRW50cnlGYWN0b3J5IHsKKyAgICAgICAgU1RST05HIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgPEssIFY+IFJlZmVyZW5jZUVudHJ5PEssIFY+IG5ld0VudHJ5KAorICAgICAgICAgICAgICAgICAgICBTZWdtZW50PEssIFY+IHNlZ21lbnQsIEsga2V5LCBpbnQgaGFzaCwgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV4dCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3Ryb25nRW50cnk8SywgVj4oa2V5LCBoYXNoLCBuZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgU1RST05HX0VYUElSQUJMRSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIDxLLCBWPiBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXdFbnRyeSgKKyAgICAgICAgICAgICAgICAgICAgU2VnbWVudDxLLCBWPiBzZWdtZW50LCBLIGtleSwgaW50IGhhc2gsIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5leHQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cm9uZ0V4cGlyYWJsZUVudHJ5PEssIFY+KGtleSwgaGFzaCwgbmV4dCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgPEssIFY+IFJlZmVyZW5jZUVudHJ5PEssIFY+IGNvcHlFbnRyeSgKKyAgICAgICAgICAgICAgICAgICAgU2VnbWVudDxLLCBWPiBzZWdtZW50LCBSZWZlcmVuY2VFbnRyeTxLLCBWPiBvcmlnaW5hbCwgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV3TmV4dCkgeworICAgICAgICAgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5ld0VudHJ5ID0gc3VwZXIuY29weUVudHJ5KHNlZ21lbnQsIG9yaWdpbmFsLCBuZXdOZXh0KTsKKyAgICAgICAgICAgICAgICBjb3B5RXhwaXJhYmxlRW50cnkob3JpZ2luYWwsIG5ld0VudHJ5KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3RW50cnk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIFNUUk9OR19FVklDVEFCTEUgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICA8SywgVj4gUmVmZXJlbmNlRW50cnk8SywgVj4gbmV3RW50cnkoCisgICAgICAgICAgICAgICAgICAgIFNlZ21lbnQ8SywgVj4gc2VnbWVudCwgSyBrZXksIGludCBoYXNoLCBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXh0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJvbmdFdmljdGFibGVFbnRyeTxLLCBWPihrZXksIGhhc2gsIG5leHQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIDxLLCBWPiBSZWZlcmVuY2VFbnRyeTxLLCBWPiBjb3B5RW50cnkoCisgICAgICAgICAgICAgICAgICAgIFNlZ21lbnQ8SywgVj4gc2VnbWVudCwgUmVmZXJlbmNlRW50cnk8SywgVj4gb3JpZ2luYWwsIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5ld05leHQpIHsKKyAgICAgICAgICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXdFbnRyeSA9IHN1cGVyLmNvcHlFbnRyeShzZWdtZW50LCBvcmlnaW5hbCwgbmV3TmV4dCk7CisgICAgICAgICAgICAgICAgY29weUV2aWN0YWJsZUVudHJ5KG9yaWdpbmFsLCBuZXdFbnRyeSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0VudHJ5OworICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBTVFJPTkdfRVhQSVJBQkxFX0VWSUNUQUJMRSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIDxLLCBWPiBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXdFbnRyeSgKKyAgICAgICAgICAgICAgICAgICAgU2VnbWVudDxLLCBWPiBzZWdtZW50LCBLIGtleSwgaW50IGhhc2gsIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5leHQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFN0cm9uZ0V4cGlyYWJsZUV2aWN0YWJsZUVudHJ5PEssIFY+KGtleSwgaGFzaCwgbmV4dCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgPEssIFY+IFJlZmVyZW5jZUVudHJ5PEssIFY+IGNvcHlFbnRyeSgKKyAgICAgICAgICAgICAgICAgICAgU2VnbWVudDxLLCBWPiBzZWdtZW50LCBSZWZlcmVuY2VFbnRyeTxLLCBWPiBvcmlnaW5hbCwgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV3TmV4dCkgeworICAgICAgICAgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5ld0VudHJ5ID0gc3VwZXIuY29weUVudHJ5KHNlZ21lbnQsIG9yaWdpbmFsLCBuZXdOZXh0KTsKKyAgICAgICAgICAgICAgICBjb3B5RXhwaXJhYmxlRW50cnkob3JpZ2luYWwsIG5ld0VudHJ5KTsKKyAgICAgICAgICAgICAgICBjb3B5RXZpY3RhYmxlRW50cnkob3JpZ2luYWwsIG5ld0VudHJ5KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3RW50cnk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisKKyAgICAgICAgV0VBSyB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIDxLLCBWPiBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXdFbnRyeSgKKyAgICAgICAgICAgICAgICAgICAgU2VnbWVudDxLLCBWPiBzZWdtZW50LCBLIGtleSwgaW50IGhhc2gsIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5leHQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdlYWtFbnRyeTxLLCBWPihzZWdtZW50LmtleVJlZmVyZW5jZVF1ZXVlLCBrZXksIGhhc2gsIG5leHQpOworICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBXRUFLX0VYUElSQUJMRSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIDxLLCBWPiBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXdFbnRyeSgKKyAgICAgICAgICAgICAgICAgICAgU2VnbWVudDxLLCBWPiBzZWdtZW50LCBLIGtleSwgaW50IGhhc2gsIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5leHQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdlYWtFeHBpcmFibGVFbnRyeTxLLCBWPihzZWdtZW50LmtleVJlZmVyZW5jZVF1ZXVlLCBrZXksIGhhc2gsIG5leHQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIDxLLCBWPiBSZWZlcmVuY2VFbnRyeTxLLCBWPiBjb3B5RW50cnkoCisgICAgICAgICAgICAgICAgICAgIFNlZ21lbnQ8SywgVj4gc2VnbWVudCwgUmVmZXJlbmNlRW50cnk8SywgVj4gb3JpZ2luYWwsIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5ld05leHQpIHsKKyAgICAgICAgICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXdFbnRyeSA9IHN1cGVyLmNvcHlFbnRyeShzZWdtZW50LCBvcmlnaW5hbCwgbmV3TmV4dCk7CisgICAgICAgICAgICAgICAgY29weUV4cGlyYWJsZUVudHJ5KG9yaWdpbmFsLCBuZXdFbnRyeSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0VudHJ5OworICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBXRUFLX0VWSUNUQUJMRSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIDxLLCBWPiBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXdFbnRyeSgKKyAgICAgICAgICAgICAgICAgICAgU2VnbWVudDxLLCBWPiBzZWdtZW50LCBLIGtleSwgaW50IGhhc2gsIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5leHQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdlYWtFdmljdGFibGVFbnRyeTxLLCBWPihzZWdtZW50LmtleVJlZmVyZW5jZVF1ZXVlLCBrZXksIGhhc2gsIG5leHQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIDxLLCBWPiBSZWZlcmVuY2VFbnRyeTxLLCBWPiBjb3B5RW50cnkoCisgICAgICAgICAgICAgICAgICAgIFNlZ21lbnQ8SywgVj4gc2VnbWVudCwgUmVmZXJlbmNlRW50cnk8SywgVj4gb3JpZ2luYWwsIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5ld05leHQpIHsKKyAgICAgICAgICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXdFbnRyeSA9IHN1cGVyLmNvcHlFbnRyeShzZWdtZW50LCBvcmlnaW5hbCwgbmV3TmV4dCk7CisgICAgICAgICAgICAgICAgY29weUV2aWN0YWJsZUVudHJ5KG9yaWdpbmFsLCBuZXdFbnRyeSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0VudHJ5OworICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBXRUFLX0VYUElSQUJMRV9FVklDVEFCTEUgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICA8SywgVj4gUmVmZXJlbmNlRW50cnk8SywgVj4gbmV3RW50cnkoCisgICAgICAgICAgICAgICAgICAgIFNlZ21lbnQ8SywgVj4gc2VnbWVudCwgSyBrZXksIGludCBoYXNoLCBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXh0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXZWFrRXhwaXJhYmxlRXZpY3RhYmxlRW50cnk8SywgVj4oc2VnbWVudC5rZXlSZWZlcmVuY2VRdWV1ZSwga2V5LCBoYXNoLCBuZXh0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICA8SywgVj4gUmVmZXJlbmNlRW50cnk8SywgVj4gY29weUVudHJ5KAorICAgICAgICAgICAgICAgICAgICBTZWdtZW50PEssIFY+IHNlZ21lbnQsIFJlZmVyZW5jZUVudHJ5PEssIFY+IG9yaWdpbmFsLCBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXdOZXh0KSB7CisgICAgICAgICAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV3RW50cnkgPSBzdXBlci5jb3B5RW50cnkoc2VnbWVudCwgb3JpZ2luYWwsIG5ld05leHQpOworICAgICAgICAgICAgICAgIGNvcHlFeHBpcmFibGVFbnRyeShvcmlnaW5hbCwgbmV3RW50cnkpOworICAgICAgICAgICAgICAgIGNvcHlFdmljdGFibGVFbnRyeShvcmlnaW5hbCwgbmV3RW50cnkpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXdFbnRyeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICAvKioKKyAgICAgICAgICogTWFza3MgdXNlZCB0byBjb21wdXRlIGluZGljZXMgaW4gdGhlIGZvbGxvd2luZyB0YWJsZS4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgRVhQSVJBQkxFX01BU0sgPSAxOworICAgICAgICBzdGF0aWMgZmluYWwgaW50IEVWSUNUQUJMRV9NQVNLID0gMjsKKworICAgICAgICAvKioKKyAgICAgICAgICogTG9vay11cCB0YWJsZSBmb3IgZmFjdG9yaWVzLiBGaXJzdCBkaW1lbnNpb24gaXMgdGhlIHJlZmVyZW5jZSB0eXBlLiBUaGUgc2Vjb25kIGRpbWVuc2lvbiBpcworICAgICAgICAgKiB0aGUgcmVzdWx0IG9mIE9SLWluZyB0aGUgZmVhdHVyZSBtYXNrcy4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBmaW5hbCBFbnRyeUZhY3RvcnlbXVtdIGZhY3RvcmllcyA9IHsKKyAgICAgICAgICAgICAgICB7U1RST05HLCBTVFJPTkdfRVhQSVJBQkxFLCBTVFJPTkdfRVZJQ1RBQkxFLCBTVFJPTkdfRVhQSVJBQkxFX0VWSUNUQUJMRX0sCisgICAgICAgICAgICAgICAge30sIC8vIG5vIHN1cHBvcnQgZm9yIFNPRlQga2V5cworICAgICAgICAgICAgICAgIHtXRUFLLCBXRUFLX0VYUElSQUJMRSwgV0VBS19FVklDVEFCTEUsIFdFQUtfRVhQSVJBQkxFX0VWSUNUQUJMRX0KKyAgICAgICAgfTsKKworICAgICAgICBzdGF0aWMgRW50cnlGYWN0b3J5IGdldEZhY3RvcnkoU3RyZW5ndGgga2V5U3RyZW5ndGgsIGJvb2xlYW4gZXhwaXJlQWZ0ZXJXcml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZXZpY3RzQnlTaXplKSB7CisgICAgICAgICAgICBpbnQgZmxhZ3MgPSAoZXhwaXJlQWZ0ZXJXcml0ZSA/IEVYUElSQUJMRV9NQVNLIDogMCkgfCAoZXZpY3RzQnlTaXplID8gRVZJQ1RBQkxFX01BU0sgOiAwKTsKKyAgICAgICAgICAgIHJldHVybiBmYWN0b3JpZXNba2V5U3RyZW5ndGgub3JkaW5hbCgpXVtmbGFnc107CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBlbnRyeS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHNlZ21lbnQgdG8gY3JlYXRlIHRoZSBlbnRyeSBmb3IKKyAgICAgICAgICogQHBhcmFtIGtleSAgICAgb2YgdGhlIGVudHJ5CisgICAgICAgICAqIEBwYXJhbSBoYXNoICAgIG9mIHRoZSBrZXkKKyAgICAgICAgICogQHBhcmFtIG5leHQgICAgZW50cnkgaW4gdGhlIHNhbWUgYnVja2V0CisgICAgICAgICAqLworICAgICAgICBhYnN0cmFjdCA8SywgVj4gUmVmZXJlbmNlRW50cnk8SywgVj4gbmV3RW50cnkoCisgICAgICAgICAgICAgICAgU2VnbWVudDxLLCBWPiBzZWdtZW50LCBLIGtleSwgaW50IGhhc2gsIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5leHQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb3BpZXMgYW4gZW50cnksIGFzc2lnbmluZyBpdCBhIG5ldyB7QGNvZGUgbmV4dH0gZW50cnkuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBvcmlnaW5hbCB0aGUgZW50cnkgdG8gY29weQorICAgICAgICAgKiBAcGFyYW0gbmV3TmV4dCAgZW50cnkgaW4gdGhlIHNhbWUgYnVja2V0CisgICAgICAgICAqLworICAgICAgICAvLyBHdWFyZGVkIEJ5IFNlZ21lbnQudGhpcworICAgICAgICA8SywgVj4gUmVmZXJlbmNlRW50cnk8SywgVj4gY29weUVudHJ5KAorICAgICAgICAgICAgICAgIFNlZ21lbnQ8SywgVj4gc2VnbWVudCwgUmVmZXJlbmNlRW50cnk8SywgVj4gb3JpZ2luYWwsIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5ld05leHQpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXdFbnRyeShzZWdtZW50LCBvcmlnaW5hbC5nZXRLZXkoKSwgb3JpZ2luYWwuZ2V0SGFzaCgpLCBuZXdOZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEd1YXJkZWQgQnkgU2VnbWVudC50aGlzCisgICAgICAgIDxLLCBWPiB2b2lkIGNvcHlFeHBpcmFibGVFbnRyeShSZWZlcmVuY2VFbnRyeTxLLCBWPiBvcmlnaW5hbCwgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV3RW50cnkpIHsKKyAgICAgICAgICAgIC8vIFRPRE8oZnJ5KTogd2hlbiB3ZSBsaW5rIHZhbHVlcyBpbnN0ZWFkIG9mIGVudHJpZXMgdGhpcyBtZXRob2QgY2FuIGdvCisgICAgICAgICAgICAvLyBhd2F5LCBhcyBjYW4gY29ubmVjdEV4cGlyYWJsZXMsIG51bGxpZnlFeHBpcmFibGUuCisgICAgICAgICAgICBuZXdFbnRyeS5zZXRFeHBpcmF0aW9uVGltZShvcmlnaW5hbC5nZXRFeHBpcmF0aW9uVGltZSgpKTsKKworICAgICAgICAgICAgY29ubmVjdEV4cGlyYWJsZXMob3JpZ2luYWwuZ2V0UHJldmlvdXNFeHBpcmFibGUoKSwgbmV3RW50cnkpOworICAgICAgICAgICAgY29ubmVjdEV4cGlyYWJsZXMobmV3RW50cnksIG9yaWdpbmFsLmdldE5leHRFeHBpcmFibGUoKSk7CisKKyAgICAgICAgICAgIG51bGxpZnlFeHBpcmFibGUob3JpZ2luYWwpOworICAgICAgICB9CisKKyAgICAgICAgLy8gR3VhcmRlZCBCeSBTZWdtZW50LnRoaXMKKyAgICAgICAgPEssIFY+IHZvaWQgY29weUV2aWN0YWJsZUVudHJ5KFJlZmVyZW5jZUVudHJ5PEssIFY+IG9yaWdpbmFsLCBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXdFbnRyeSkgeworICAgICAgICAgICAgLy8gVE9ETyhmcnkpOiB3aGVuIHdlIGxpbmsgdmFsdWVzIGluc3RlYWQgb2YgZW50cmllcyB0aGlzIG1ldGhvZCBjYW4gZ28KKyAgICAgICAgICAgIC8vIGF3YXksIGFzIGNhbiBjb25uZWN0RXZpY3RhYmxlcywgbnVsbGlmeUV2aWN0YWJsZS4KKyAgICAgICAgICAgIGNvbm5lY3RFdmljdGFibGVzKG9yaWdpbmFsLmdldFByZXZpb3VzRXZpY3RhYmxlKCksIG5ld0VudHJ5KTsKKyAgICAgICAgICAgIGNvbm5lY3RFdmljdGFibGVzKG5ld0VudHJ5LCBvcmlnaW5hbC5nZXROZXh0RXZpY3RhYmxlKCkpOworCisgICAgICAgICAgICBudWxsaWZ5RXZpY3RhYmxlKG9yaWdpbmFsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZW51bSBOdWxsRW50cnkgaW1wbGVtZW50cyBSZWZlcmVuY2VFbnRyeTxPYmplY3QsIE9iamVjdD4geworICAgICAgICBJTlNUQU5DRTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFZhbHVlUmVmZXJlbmNlPE9iamVjdCwgT2JqZWN0PiBnZXRWYWx1ZVJlZmVyZW5jZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlUmVmZXJlbmNlKFZhbHVlUmVmZXJlbmNlPE9iamVjdCwgT2JqZWN0PiB2YWx1ZVJlZmVyZW5jZSkgeworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZWZlcmVuY2VFbnRyeTxPYmplY3QsIE9iamVjdD4gZ2V0TmV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0SGFzaCgpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0S2V5KCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0RXhwaXJhdGlvblRpbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRFeHBpcmF0aW9uVGltZShsb25nIHRpbWUpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVmZXJlbmNlRW50cnk8T2JqZWN0LCBPYmplY3Q+IGdldE5leHRFeHBpcmFibGUoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXROZXh0RXhwaXJhYmxlKFJlZmVyZW5jZUVudHJ5PE9iamVjdCwgT2JqZWN0PiBuZXh0KSB7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlZmVyZW5jZUVudHJ5PE9iamVjdCwgT2JqZWN0PiBnZXRQcmV2aW91c0V4cGlyYWJsZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFByZXZpb3VzRXhwaXJhYmxlKFJlZmVyZW5jZUVudHJ5PE9iamVjdCwgT2JqZWN0PiBwcmV2aW91cykgeworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZWZlcmVuY2VFbnRyeTxPYmplY3QsIE9iamVjdD4gZ2V0TmV4dEV2aWN0YWJsZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE5leHRFdmljdGFibGUoUmVmZXJlbmNlRW50cnk8T2JqZWN0LCBPYmplY3Q+IG5leHQpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVmZXJlbmNlRW50cnk8T2JqZWN0LCBPYmplY3Q+IGdldFByZXZpb3VzRXZpY3RhYmxlKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UHJldmlvdXNFdmljdGFibGUoUmVmZXJlbmNlRW50cnk8T2JqZWN0LCBPYmplY3Q+IHByZXZpb3VzKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHJlZmVyZW5jZSB0byBhIHZhbHVlLgorICAgICAqLworICAgIGludGVyZmFjZSBWYWx1ZVJlZmVyZW5jZTxLLCBWPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHRoZSB2YWx1ZS4gRG9lcyBub3QgYmxvY2sgb3IgdGhyb3cgZXhjZXB0aW9ucy4KKyAgICAgICAgICovCisgICAgICAgIFYgZ2V0KCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIGVudHJ5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHZhbHVlIHJlZmVyZW5jZSwgb3Ige0Bjb2RlIG51bGx9IGlmIHRoaXMgdmFsdWUKKyAgICAgICAgICogcmVmZXJlbmNlIGlzIGluZGVwZW5kZW50IG9mIGFueSBlbnRyeS4KKyAgICAgICAgICovCisgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IGdldEVudHJ5KCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBjb3B5IG9mIHRoaXMgcmVmZXJlbmNlIGZvciB0aGUgZ2l2ZW4gZW50cnkuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiA8cD57QGNvZGUgdmFsdWV9IG1heSBiZSBudWxsIG9ubHkgZm9yIGEgbG9hZGluZyByZWZlcmVuY2UuCisgICAgICAgICAqLworICAgICAgICBWYWx1ZVJlZmVyZW5jZTxLLCBWPiBjb3B5Rm9yKAorICAgICAgICAgICAgICAgIFJlZmVyZW5jZVF1ZXVlPFY+IHF1ZXVlLCBWIHZhbHVlLCBSZWZlcmVuY2VFbnRyeTxLLCBWPiBlbnRyeSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENsZWFycyB0aGlzIHJlZmVyZW5jZSBvYmplY3QuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBuZXdWYWx1ZSB0aGUgbmV3IHZhbHVlIHJlZmVyZW5jZSB3aGljaCB3aWxsIHJlcGxhY2UgdGhpcyBvbmU7IHRoaXMgaXMgb25seSB1c2VkIGR1cmluZworICAgICAgICAgKiAgICAgICAgICAgICAgICAgY29tcHV0YXRpb24gdG8gaW1tZWRpYXRlbHkgbm90aWZ5IGJsb2NrZWQgdGhyZWFkcyBvZiB0aGUgbmV3IHZhbHVlCisgICAgICAgICAqLworICAgICAgICB2b2lkIGNsZWFyKFZhbHVlUmVmZXJlbmNlPEssIFY+IG5ld1ZhbHVlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHZhbHVlIHR5cGUgaXMgYSBjb21wdXRpbmcgcmVmZXJlbmNlIChyZWdhcmRsZXNzIG9mIHdoZXRoZXIgb3Igbm90CisgICAgICAgICAqIGNvbXB1dGF0aW9uIGhhcyBjb21wbGV0ZWQpLiBUaGlzIGlzIG5lY2Vzc2FyeSB0byBkaXN0aWd1aXNoIGJldHdlZW4gcGFydGlhbGx5LWNvbGxlY3RlZAorICAgICAgICAgKiBlbnRyaWVzIGFuZCBjb21wdXRpbmcgZW50cmllcywgd2hpY2ggbmVlZCB0byBiZSBjbGVhbmVkIHVwIGRpZmZlcmVudGx5LgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbGVhbiBpc0NvbXB1dGluZ1JlZmVyZW5jZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFuIGVudHJ5IGluIGEgcmVmZXJlbmNlIG1hcC4KKyAgICAgKiA8cD4KKyAgICAgKiBFbnRyaWVzIGluIHRoZSBtYXAgY2FuIGJlIGluIHRoZSBmb2xsb3dpbmcgc3RhdGVzOgorICAgICAqIDxwPgorICAgICAqIFZhbGlkOgorICAgICAqIC0gTGl2ZTogdmFsaWQga2V5L3ZhbHVlIGFyZSBzZXQKKyAgICAgKiAtIENvbXB1dGluZzogY29tcHV0YXRpb24gaXMgcGVuZGluZworICAgICAqIDxwPgorICAgICAqIEludmFsaWQ6CisgICAgICogLSBFeHBpcmVkOiB0aW1lIGV4cGlyZWQgKGtleS92YWx1ZSBtYXkgc3RpbGwgYmUgc2V0KQorICAgICAqIC0gQ29sbGVjdGVkOiBrZXkvdmFsdWUgd2FzIHBhcnRpYWxseSBjb2xsZWN0ZWQsIGJ1dCBub3QgeWV0IGNsZWFuZWQgdXAKKyAgICAgKi8KKyAgICBpbnRlcmZhY2UgUmVmZXJlbmNlRW50cnk8SywgVj4geworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB0aGUgdmFsdWUgcmVmZXJlbmNlIGZyb20gdGhpcyBlbnRyeS4KKyAgICAgICAgICovCisgICAgICAgIFZhbHVlUmVmZXJlbmNlPEssIFY+IGdldFZhbHVlUmVmZXJlbmNlKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIHZhbHVlIHJlZmVyZW5jZSBmb3IgdGhpcyBlbnRyeS4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgc2V0VmFsdWVSZWZlcmVuY2UoVmFsdWVSZWZlcmVuY2U8SywgVj4gdmFsdWVSZWZlcmVuY2UpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHRoZSBuZXh0IGVudHJ5IGluIHRoZSBjaGFpbi4KKyAgICAgICAgICovCisgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IGdldE5leHQoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB0aGUgZW50cnkncyBoYXNoLgorICAgICAgICAgKi8KKyAgICAgICAgaW50IGdldEhhc2goKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB0aGUga2V5IGZvciB0aGlzIGVudHJ5LgorICAgICAgICAgKi8KKyAgICAgICAgSyBnZXRLZXkoKTsKKworICAgIC8qCisgICAgICogVXNlZCBieSBlbnRyaWVzIHRoYXQgYXJlIGV4cGlyYWJsZS4gRXhwaXJhYmxlIGVudHJpZXMgYXJlIG1haW50YWluZWQgaW4gYSBkb3VibHktbGlua2VkIGxpc3QuCisgICAgICogTmV3IGVudHJpZXMgYXJlIGFkZGVkIGF0IHRoZSB0YWlsIG9mIHRoZSBsaXN0IGF0IHdyaXRlIHRpbWU7IHN0YWxlIGVudHJpZXMgYXJlIGV4cGlyZWQgZnJvbQorICAgICAqIHRoZSBoZWFkIG9mIHRoZSBsaXN0LgorICAgICAqLworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHRoZSBlbnRyeSBleHBpcmF0aW9uIHRpbWUgaW4gbnMuCisgICAgICAgICAqLworICAgICAgICBsb25nIGdldEV4cGlyYXRpb25UaW1lKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIGVudHJ5IGV4cGlyYXRpb24gdGltZSBpbiBucy4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgc2V0RXhwaXJhdGlvblRpbWUobG9uZyB0aW1lKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB0aGUgbmV4dCBlbnRyeSBpbiB0aGUgcmVjZW5jeSBsaXN0LgorICAgICAgICAgKi8KKyAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gZ2V0TmV4dEV4cGlyYWJsZSgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSBuZXh0IGVudHJ5IGluIHRoZSByZWNlbmN5IGxpc3QuCisgICAgICAgICAqLworICAgICAgICB2b2lkIHNldE5leHRFeHBpcmFibGUoUmVmZXJlbmNlRW50cnk8SywgVj4gbmV4dCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgdGhlIHByZXZpb3VzIGVudHJ5IGluIHRoZSByZWNlbmN5IGxpc3QuCisgICAgICAgICAqLworICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBnZXRQcmV2aW91c0V4cGlyYWJsZSgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSBwcmV2aW91cyBlbnRyeSBpbiB0aGUgcmVjZW5jeSBsaXN0LgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBzZXRQcmV2aW91c0V4cGlyYWJsZShSZWZlcmVuY2VFbnRyeTxLLCBWPiBwcmV2aW91cyk7CisKKyAgICAvKgorICAgICAqIEltcGxlbWVudGVkIGJ5IGVudHJpZXMgdGhhdCBhcmUgZXZpY3RhYmxlLiBFdmljdGFibGUgZW50cmllcyBhcmUgbWFpbnRhaW5lZCBpbiBhCisgICAgICogZG91Ymx5LWxpbmtlZCBsaXN0LiBOZXcgZW50cmllcyBhcmUgYWRkZWQgYXQgdGhlIHRhaWwgb2YgdGhlIGxpc3QgYXQgd3JpdGUgdGltZSBhbmQgc3RhbGUKKyAgICAgKiBlbnRyaWVzIGFyZSBleHBpcmVkIGZyb20gdGhlIGhlYWQgb2YgdGhlIGxpc3QuCisgICAgICovCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgdGhlIG5leHQgZW50cnkgaW4gdGhlIHJlY2VuY3kgbGlzdC4KKyAgICAgICAgICovCisgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IGdldE5leHRFdmljdGFibGUoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgbmV4dCBlbnRyeSBpbiB0aGUgcmVjZW5jeSBsaXN0LgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBzZXROZXh0RXZpY3RhYmxlKFJlZmVyZW5jZUVudHJ5PEssIFY+IG5leHQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHRoZSBwcmV2aW91cyBlbnRyeSBpbiB0aGUgcmVjZW5jeSBsaXN0LgorICAgICAgICAgKi8KKyAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gZ2V0UHJldmlvdXNFdmljdGFibGUoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgcHJldmlvdXMgZW50cnkgaW4gdGhlIHJlY2VuY3kgbGlzdC4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgc2V0UHJldmlvdXNFdmljdGFibGUoUmVmZXJlbmNlRW50cnk8SywgVj4gcHJldmlvdXMpOworICAgIH0KKworICAgIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBBYnN0cmFjdFJlZmVyZW5jZUVudHJ5PEssIFY+IGltcGxlbWVudHMgUmVmZXJlbmNlRW50cnk8SywgVj4geworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFZhbHVlUmVmZXJlbmNlPEssIFY+IGdldFZhbHVlUmVmZXJlbmNlKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VmFsdWVSZWZlcmVuY2UoVmFsdWVSZWZlcmVuY2U8SywgVj4gdmFsdWVSZWZlcmVuY2UpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZWZlcmVuY2VFbnRyeTxLLCBWPiBnZXROZXh0KCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBnZXRIYXNoKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEsgZ2V0S2V5KCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0RXhwaXJhdGlvblRpbWUoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRFeHBpcmF0aW9uVGltZShsb25nIHRpbWUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZWZlcmVuY2VFbnRyeTxLLCBWPiBnZXROZXh0RXhwaXJhYmxlKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0TmV4dEV4cGlyYWJsZShSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXh0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVmZXJlbmNlRW50cnk8SywgVj4gZ2V0UHJldmlvdXNFeHBpcmFibGUoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcmV2aW91c0V4cGlyYWJsZShSZWZlcmVuY2VFbnRyeTxLLCBWPiBwcmV2aW91cykgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlZmVyZW5jZUVudHJ5PEssIFY+IGdldE5leHRFdmljdGFibGUoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXROZXh0RXZpY3RhYmxlKFJlZmVyZW5jZUVudHJ5PEssIFY+IG5leHQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZWZlcmVuY2VFbnRyeTxLLCBWPiBnZXRQcmV2aW91c0V2aWN0YWJsZSgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFByZXZpb3VzRXZpY3RhYmxlKFJlZmVyZW5jZUVudHJ5PEssIFY+IHByZXZpb3VzKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFVzZWQgZm9yIHN0cm9uZ2x5LXJlZmVyZW5jZWQga2V5cy4KKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgU3Ryb25nRW50cnk8SywgVj4gaW1wbGVtZW50cyBSZWZlcmVuY2VFbnRyeTxLLCBWPiB7CisgICAgICAgIGZpbmFsIEsga2V5OworICAgICAgICBmaW5hbCBpbnQgaGFzaDsKKyAgICAgICAgZmluYWwgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV4dDsKKworICAgICAgICAvLyBudWxsIGV4cGlyYXRpb24KKyAgICAgICAgdm9sYXRpbGUgVmFsdWVSZWZlcmVuY2U8SywgVj4gdmFsdWVSZWZlcmVuY2UgPSB1bnNldCgpOworCisgICAgICAgIFN0cm9uZ0VudHJ5KEsga2V5LCBpbnQgaGFzaCwgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV4dCkgeworICAgICAgICAgICAgdGhpcy5rZXkgPSBrZXk7CisgICAgICAgICAgICB0aGlzLmhhc2ggPSBoYXNoOworICAgICAgICAgICAgdGhpcy5uZXh0ID0gbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSyBnZXRLZXkoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5rZXk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0RXhwaXJhdGlvblRpbWUoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRFeHBpcmF0aW9uVGltZShsb25nIHRpbWUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZWZlcmVuY2VFbnRyeTxLLCBWPiBnZXROZXh0RXhwaXJhYmxlKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBudWxsIGV2aWN0aW9uCisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE5leHRFeHBpcmFibGUoUmVmZXJlbmNlRW50cnk8SywgVj4gbmV4dCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlZmVyZW5jZUVudHJ5PEssIFY+IGdldFByZXZpb3VzRXhwaXJhYmxlKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UHJldmlvdXNFeHBpcmFibGUoUmVmZXJlbmNlRW50cnk8SywgVj4gcHJldmlvdXMpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZWZlcmVuY2VFbnRyeTxLLCBWPiBnZXROZXh0RXZpY3RhYmxlKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGUgY29kZSBiZWxvdyBpcyBleGFjdGx5IHRoZSBzYW1lIGZvciBlYWNoIGVudHJ5IHR5cGUuCisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE5leHRFdmljdGFibGUoUmVmZXJlbmNlRW50cnk8SywgVj4gbmV4dCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlZmVyZW5jZUVudHJ5PEssIFY+IGdldFByZXZpb3VzRXZpY3RhYmxlKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UHJldmlvdXNFdmljdGFibGUoUmVmZXJlbmNlRW50cnk8SywgVj4gcHJldmlvdXMpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWYWx1ZVJlZmVyZW5jZTxLLCBWPiBnZXRWYWx1ZVJlZmVyZW5jZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZVJlZmVyZW5jZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZVJlZmVyZW5jZShWYWx1ZVJlZmVyZW5jZTxLLCBWPiB2YWx1ZVJlZmVyZW5jZSkgeworICAgICAgICAgICAgVmFsdWVSZWZlcmVuY2U8SywgVj4gcHJldmlvdXMgPSB0aGlzLnZhbHVlUmVmZXJlbmNlOworICAgICAgICAgICAgdGhpcy52YWx1ZVJlZmVyZW5jZSA9IHZhbHVlUmVmZXJlbmNlOworICAgICAgICAgICAgcHJldmlvdXMuY2xlYXIodmFsdWVSZWZlcmVuY2UpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0SGFzaCgpIHsKKyAgICAgICAgICAgIHJldHVybiBoYXNoOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZWZlcmVuY2VFbnRyeTxLLCBWPiBnZXROZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5leHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgU3Ryb25nRXhwaXJhYmxlRW50cnk8SywgVj4gZXh0ZW5kcyBTdHJvbmdFbnRyeTxLLCBWPgorICAgICAgICAgICAgaW1wbGVtZW50cyBSZWZlcmVuY2VFbnRyeTxLLCBWPiB7CisgICAgICAgIHZvbGF0aWxlIGxvbmcgdGltZSA9IExvbmcuTUFYX1ZBTFVFOworCisgICAgICAgIC8vIFRoZSBjb2RlIGJlbG93IGlzIGV4YWN0bHkgdGhlIHNhbWUgZm9yIGVhY2ggZXhwaXJhYmxlIGVudHJ5IHR5cGUuCisgICAgICAgIC8vIEd1YXJkZWQgQnkgU2VnbWVudC50aGlzCisgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5leHRFeHBpcmFibGUgPSBudWxsRW50cnkoKTsKKyAgICAgICAgLy8gR3VhcmRlZCBCeSBTZWdtZW50LnRoaXMKKyAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gcHJldmlvdXNFeHBpcmFibGUgPSBudWxsRW50cnkoKTsKKworICAgICAgICBTdHJvbmdFeHBpcmFibGVFbnRyeShLIGtleSwgaW50IGhhc2gsIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5leHQpIHsKKyAgICAgICAgICAgIHN1cGVyKGtleSwgaGFzaCwgbmV4dCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0RXhwaXJhdGlvblRpbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdGltZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRFeHBpcmF0aW9uVGltZShsb25nIHRpbWUpIHsKKyAgICAgICAgICAgIHRoaXMudGltZSA9IHRpbWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlZmVyZW5jZUVudHJ5PEssIFY+IGdldE5leHRFeHBpcmFibGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV4dEV4cGlyYWJsZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXROZXh0RXhwaXJhYmxlKFJlZmVyZW5jZUVudHJ5PEssIFY+IG5leHQpIHsKKyAgICAgICAgICAgIHRoaXMubmV4dEV4cGlyYWJsZSA9IG5leHQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlZmVyZW5jZUVudHJ5PEssIFY+IGdldFByZXZpb3VzRXhwaXJhYmxlKCkgeworICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzRXhwaXJhYmxlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFByZXZpb3VzRXhwaXJhYmxlKFJlZmVyZW5jZUVudHJ5PEssIFY+IHByZXZpb3VzKSB7CisgICAgICAgICAgICB0aGlzLnByZXZpb3VzRXhwaXJhYmxlID0gcHJldmlvdXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgU3Ryb25nRXZpY3RhYmxlRW50cnk8SywgVj4KKyAgICAgICAgICAgIGV4dGVuZHMgU3Ryb25nRW50cnk8SywgVj4gaW1wbGVtZW50cyBSZWZlcmVuY2VFbnRyeTxLLCBWPiB7CisgICAgICAgIC8vIEd1YXJkZWQgQnkgU2VnbWVudC50aGlzCisgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5leHRFdmljdGFibGUgPSBudWxsRW50cnkoKTsKKworICAgICAgICAvLyBUaGUgY29kZSBiZWxvdyBpcyBleGFjdGx5IHRoZSBzYW1lIGZvciBlYWNoIGV2aWN0YWJsZSBlbnRyeSB0eXBlLgorICAgICAgICAvLyBHdWFyZGVkIEJ5IFNlZ21lbnQudGhpcworICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBwcmV2aW91c0V2aWN0YWJsZSA9IG51bGxFbnRyeSgpOworCisgICAgICAgIFN0cm9uZ0V2aWN0YWJsZUVudHJ5KEsga2V5LCBpbnQgaGFzaCwgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV4dCkgeworICAgICAgICAgICAgc3VwZXIoa2V5LCBoYXNoLCBuZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVmZXJlbmNlRW50cnk8SywgVj4gZ2V0TmV4dEV2aWN0YWJsZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXh0RXZpY3RhYmxlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE5leHRFdmljdGFibGUoUmVmZXJlbmNlRW50cnk8SywgVj4gbmV4dCkgeworICAgICAgICAgICAgdGhpcy5uZXh0RXZpY3RhYmxlID0gbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVmZXJlbmNlRW50cnk8SywgVj4gZ2V0UHJldmlvdXNFdmljdGFibGUoKSB7CisgICAgICAgICAgICByZXR1cm4gcHJldmlvdXNFdmljdGFibGU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UHJldmlvdXNFdmljdGFibGUoUmVmZXJlbmNlRW50cnk8SywgVj4gcHJldmlvdXMpIHsKKyAgICAgICAgICAgIHRoaXMucHJldmlvdXNFdmljdGFibGUgPSBwcmV2aW91czsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBTdHJvbmdFeHBpcmFibGVFdmljdGFibGVFbnRyeTxLLCBWPgorICAgICAgICAgICAgZXh0ZW5kcyBTdHJvbmdFbnRyeTxLLCBWPiBpbXBsZW1lbnRzIFJlZmVyZW5jZUVudHJ5PEssIFY+IHsKKyAgICAgICAgdm9sYXRpbGUgbG9uZyB0aW1lID0gTG9uZy5NQVhfVkFMVUU7CisKKyAgICAgICAgLy8gVGhlIGNvZGUgYmVsb3cgaXMgZXhhY3RseSB0aGUgc2FtZSBmb3IgZWFjaCBleHBpcmFibGUgZW50cnkgdHlwZS4KKyAgICAgICAgLy8gR3VhcmRlZCBCeSBTZWdtZW50LnRoaXMKKyAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV4dEV4cGlyYWJsZSA9IG51bGxFbnRyeSgpOworICAgICAgICAvLyBHdWFyZGVkIEJ5IFNlZ21lbnQudGhpcworICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBwcmV2aW91c0V4cGlyYWJsZSA9IG51bGxFbnRyeSgpOworICAgICAgICAvLyBHdWFyZGVkIEJ5IFNlZ21lbnQudGhpcworICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXh0RXZpY3RhYmxlID0gbnVsbEVudHJ5KCk7CisgICAgICAgIC8vIEd1YXJkZWQgQnkgU2VnbWVudC50aGlzCisgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IHByZXZpb3VzRXZpY3RhYmxlID0gbnVsbEVudHJ5KCk7CisKKyAgICAgICAgU3Ryb25nRXhwaXJhYmxlRXZpY3RhYmxlRW50cnkoSyBrZXksIGludCBoYXNoLCBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXh0KSB7CisgICAgICAgICAgICBzdXBlcihrZXksIGhhc2gsIG5leHQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldEV4cGlyYXRpb25UaW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIHRpbWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0RXhwaXJhdGlvblRpbWUobG9uZyB0aW1lKSB7CisgICAgICAgICAgICB0aGlzLnRpbWUgPSB0aW1lOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZWZlcmVuY2VFbnRyeTxLLCBWPiBnZXROZXh0RXhwaXJhYmxlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5leHRFeHBpcmFibGU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0TmV4dEV4cGlyYWJsZShSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXh0KSB7CisgICAgICAgICAgICB0aGlzLm5leHRFeHBpcmFibGUgPSBuZXh0OworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlIGNvZGUgYmVsb3cgaXMgZXhhY3RseSB0aGUgc2FtZSBmb3IgZWFjaCBldmljdGFibGUgZW50cnkgdHlwZS4KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlZmVyZW5jZUVudHJ5PEssIFY+IGdldFByZXZpb3VzRXhwaXJhYmxlKCkgeworICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzRXhwaXJhYmxlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFByZXZpb3VzRXhwaXJhYmxlKFJlZmVyZW5jZUVudHJ5PEssIFY+IHByZXZpb3VzKSB7CisgICAgICAgICAgICB0aGlzLnByZXZpb3VzRXhwaXJhYmxlID0gcHJldmlvdXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlZmVyZW5jZUVudHJ5PEssIFY+IGdldE5leHRFdmljdGFibGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV4dEV2aWN0YWJsZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXROZXh0RXZpY3RhYmxlKFJlZmVyZW5jZUVudHJ5PEssIFY+IG5leHQpIHsKKyAgICAgICAgICAgIHRoaXMubmV4dEV2aWN0YWJsZSA9IG5leHQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlZmVyZW5jZUVudHJ5PEssIFY+IGdldFByZXZpb3VzRXZpY3RhYmxlKCkgeworICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzRXZpY3RhYmxlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFByZXZpb3VzRXZpY3RhYmxlKFJlZmVyZW5jZUVudHJ5PEssIFY+IHByZXZpb3VzKSB7CisgICAgICAgICAgICB0aGlzLnByZXZpb3VzRXZpY3RhYmxlID0gcHJldmlvdXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2VkIGZvciB3ZWFrbHktcmVmZXJlbmNlZCBrZXlzLgorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBXZWFrRW50cnk8SywgVj4gZXh0ZW5kcyBXZWFrUmVmZXJlbmNlPEs+IGltcGxlbWVudHMgUmVmZXJlbmNlRW50cnk8SywgVj4geworICAgICAgICBmaW5hbCBpbnQgaGFzaDsKKyAgICAgICAgZmluYWwgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV4dDsKKworICAgICAgICAvLyBudWxsIGV4cGlyYXRpb24KKyAgICAgICAgdm9sYXRpbGUgVmFsdWVSZWZlcmVuY2U8SywgVj4gdmFsdWVSZWZlcmVuY2UgPSB1bnNldCgpOworCisgICAgICAgIFdlYWtFbnRyeShSZWZlcmVuY2VRdWV1ZTxLPiBxdWV1ZSwgSyBrZXksIGludCBoYXNoLCBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXh0KSB7CisgICAgICAgICAgICBzdXBlcihrZXksIHF1ZXVlKTsKKyAgICAgICAgICAgIHRoaXMuaGFzaCA9IGhhc2g7CisgICAgICAgICAgICB0aGlzLm5leHQgPSBuZXh0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBLIGdldEtleSgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRFeHBpcmF0aW9uVGltZSgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEV4cGlyYXRpb25UaW1lKGxvbmcgdGltZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlZmVyZW5jZUVudHJ5PEssIFY+IGdldE5leHRFeHBpcmFibGUoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG51bGwgZXZpY3Rpb24KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0TmV4dEV4cGlyYWJsZShSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXh0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVmZXJlbmNlRW50cnk8SywgVj4gZ2V0UHJldmlvdXNFeHBpcmFibGUoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcmV2aW91c0V4cGlyYWJsZShSZWZlcmVuY2VFbnRyeTxLLCBWPiBwcmV2aW91cykgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlZmVyZW5jZUVudHJ5PEssIFY+IGdldE5leHRFdmljdGFibGUoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoZSBjb2RlIGJlbG93IGlzIGV4YWN0bHkgdGhlIHNhbWUgZm9yIGVhY2ggZW50cnkgdHlwZS4KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0TmV4dEV2aWN0YWJsZShSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXh0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVmZXJlbmNlRW50cnk8SywgVj4gZ2V0UHJldmlvdXNFdmljdGFibGUoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcmV2aW91c0V2aWN0YWJsZShSZWZlcmVuY2VFbnRyeTxLLCBWPiBwcmV2aW91cykgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFZhbHVlUmVmZXJlbmNlPEssIFY+IGdldFZhbHVlUmVmZXJlbmNlKCkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlUmVmZXJlbmNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlUmVmZXJlbmNlKFZhbHVlUmVmZXJlbmNlPEssIFY+IHZhbHVlUmVmZXJlbmNlKSB7CisgICAgICAgICAgICBWYWx1ZVJlZmVyZW5jZTxLLCBWPiBwcmV2aW91cyA9IHRoaXMudmFsdWVSZWZlcmVuY2U7CisgICAgICAgICAgICB0aGlzLnZhbHVlUmVmZXJlbmNlID0gdmFsdWVSZWZlcmVuY2U7CisgICAgICAgICAgICBwcmV2aW91cy5jbGVhcih2YWx1ZVJlZmVyZW5jZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBnZXRIYXNoKCkgeworICAgICAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlZmVyZW5jZUVudHJ5PEssIFY+IGdldE5leHQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV4dDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBXZWFrRXhwaXJhYmxlRW50cnk8SywgVj4KKyAgICAgICAgICAgIGV4dGVuZHMgV2Vha0VudHJ5PEssIFY+IGltcGxlbWVudHMgUmVmZXJlbmNlRW50cnk8SywgVj4geworICAgICAgICB2b2xhdGlsZSBsb25nIHRpbWUgPSBMb25nLk1BWF9WQUxVRTsKKworICAgICAgICAvLyBUaGUgY29kZSBiZWxvdyBpcyBleGFjdGx5IHRoZSBzYW1lIGZvciBlYWNoIGV4cGlyYWJsZSBlbnRyeSB0eXBlLgorICAgICAgICAvLyBHdWFyZGVkIEJ5IFNlZ21lbnQudGhpcworICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXh0RXhwaXJhYmxlID0gbnVsbEVudHJ5KCk7CisgICAgICAgIC8vIEd1YXJkZWQgQnkgU2VnbWVudC50aGlzCisgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IHByZXZpb3VzRXhwaXJhYmxlID0gbnVsbEVudHJ5KCk7CisKKyAgICAgICAgV2Vha0V4cGlyYWJsZUVudHJ5KAorICAgICAgICAgICAgICAgIFJlZmVyZW5jZVF1ZXVlPEs+IHF1ZXVlLCBLIGtleSwgaW50IGhhc2gsIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5leHQpIHsKKyAgICAgICAgICAgIHN1cGVyKHF1ZXVlLCBrZXksIGhhc2gsIG5leHQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldEV4cGlyYXRpb25UaW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIHRpbWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0RXhwaXJhdGlvblRpbWUobG9uZyB0aW1lKSB7CisgICAgICAgICAgICB0aGlzLnRpbWUgPSB0aW1lOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZWZlcmVuY2VFbnRyeTxLLCBWPiBnZXROZXh0RXhwaXJhYmxlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5leHRFeHBpcmFibGU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0TmV4dEV4cGlyYWJsZShSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXh0KSB7CisgICAgICAgICAgICB0aGlzLm5leHRFeHBpcmFibGUgPSBuZXh0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZWZlcmVuY2VFbnRyeTxLLCBWPiBnZXRQcmV2aW91c0V4cGlyYWJsZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBwcmV2aW91c0V4cGlyYWJsZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRQcmV2aW91c0V4cGlyYWJsZShSZWZlcmVuY2VFbnRyeTxLLCBWPiBwcmV2aW91cykgeworICAgICAgICAgICAgdGhpcy5wcmV2aW91c0V4cGlyYWJsZSA9IHByZXZpb3VzOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIFdlYWtFdmljdGFibGVFbnRyeTxLLCBWPgorICAgICAgICAgICAgZXh0ZW5kcyBXZWFrRW50cnk8SywgVj4gaW1wbGVtZW50cyBSZWZlcmVuY2VFbnRyeTxLLCBWPiB7CisgICAgICAgIC8vIEd1YXJkZWQgQnkgU2VnbWVudC50aGlzCisgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5leHRFdmljdGFibGUgPSBudWxsRW50cnkoKTsKKworICAgICAgICAvLyBUaGUgY29kZSBiZWxvdyBpcyBleGFjdGx5IHRoZSBzYW1lIGZvciBlYWNoIGV2aWN0YWJsZSBlbnRyeSB0eXBlLgorICAgICAgICAvLyBHdWFyZGVkIEJ5IFNlZ21lbnQudGhpcworICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBwcmV2aW91c0V2aWN0YWJsZSA9IG51bGxFbnRyeSgpOworCisgICAgICAgIFdlYWtFdmljdGFibGVFbnRyeSgKKyAgICAgICAgICAgICAgICBSZWZlcmVuY2VRdWV1ZTxLPiBxdWV1ZSwgSyBrZXksIGludCBoYXNoLCBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXh0KSB7CisgICAgICAgICAgICBzdXBlcihxdWV1ZSwga2V5LCBoYXNoLCBuZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVmZXJlbmNlRW50cnk8SywgVj4gZ2V0TmV4dEV2aWN0YWJsZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXh0RXZpY3RhYmxlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE5leHRFdmljdGFibGUoUmVmZXJlbmNlRW50cnk8SywgVj4gbmV4dCkgeworICAgICAgICAgICAgdGhpcy5uZXh0RXZpY3RhYmxlID0gbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVmZXJlbmNlRW50cnk8SywgVj4gZ2V0UHJldmlvdXNFdmljdGFibGUoKSB7CisgICAgICAgICAgICByZXR1cm4gcHJldmlvdXNFdmljdGFibGU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UHJldmlvdXNFdmljdGFibGUoUmVmZXJlbmNlRW50cnk8SywgVj4gcHJldmlvdXMpIHsKKyAgICAgICAgICAgIHRoaXMucHJldmlvdXNFdmljdGFibGUgPSBwcmV2aW91czsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBXZWFrRXhwaXJhYmxlRXZpY3RhYmxlRW50cnk8SywgVj4KKyAgICAgICAgICAgIGV4dGVuZHMgV2Vha0VudHJ5PEssIFY+IGltcGxlbWVudHMgUmVmZXJlbmNlRW50cnk8SywgVj4geworICAgICAgICB2b2xhdGlsZSBsb25nIHRpbWUgPSBMb25nLk1BWF9WQUxVRTsKKworICAgICAgICAvLyBUaGUgY29kZSBiZWxvdyBpcyBleGFjdGx5IHRoZSBzYW1lIGZvciBlYWNoIGV4cGlyYWJsZSBlbnRyeSB0eXBlLgorICAgICAgICAvLyBHdWFyZGVkIEJ5IFNlZ21lbnQudGhpcworICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXh0RXhwaXJhYmxlID0gbnVsbEVudHJ5KCk7CisgICAgICAgIC8vIEd1YXJkZWQgQnkgU2VnbWVudC50aGlzCisgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IHByZXZpb3VzRXhwaXJhYmxlID0gbnVsbEVudHJ5KCk7CisgICAgICAgIC8vIEd1YXJkZWQgQnkgU2VnbWVudC50aGlzCisgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5leHRFdmljdGFibGUgPSBudWxsRW50cnkoKTsKKyAgICAgICAgLy8gR3VhcmRlZCBCeSBTZWdtZW50LnRoaXMKKyAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gcHJldmlvdXNFdmljdGFibGUgPSBudWxsRW50cnkoKTsKKworICAgICAgICBXZWFrRXhwaXJhYmxlRXZpY3RhYmxlRW50cnkoCisgICAgICAgICAgICAgICAgUmVmZXJlbmNlUXVldWU8Sz4gcXVldWUsIEsga2V5LCBpbnQgaGFzaCwgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV4dCkgeworICAgICAgICAgICAgc3VwZXIocXVldWUsIGtleSwgaGFzaCwgbmV4dCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0RXhwaXJhdGlvblRpbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdGltZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRFeHBpcmF0aW9uVGltZShsb25nIHRpbWUpIHsKKyAgICAgICAgICAgIHRoaXMudGltZSA9IHRpbWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlZmVyZW5jZUVudHJ5PEssIFY+IGdldE5leHRFeHBpcmFibGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV4dEV4cGlyYWJsZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXROZXh0RXhwaXJhYmxlKFJlZmVyZW5jZUVudHJ5PEssIFY+IG5leHQpIHsKKyAgICAgICAgICAgIHRoaXMubmV4dEV4cGlyYWJsZSA9IG5leHQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGUgY29kZSBiZWxvdyBpcyBleGFjdGx5IHRoZSBzYW1lIGZvciBlYWNoIGV2aWN0YWJsZSBlbnRyeSB0eXBlLgorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVmZXJlbmNlRW50cnk8SywgVj4gZ2V0UHJldmlvdXNFeHBpcmFibGUoKSB7CisgICAgICAgICAgICByZXR1cm4gcHJldmlvdXNFeHBpcmFibGU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UHJldmlvdXNFeHBpcmFibGUoUmVmZXJlbmNlRW50cnk8SywgVj4gcHJldmlvdXMpIHsKKyAgICAgICAgICAgIHRoaXMucHJldmlvdXNFeHBpcmFibGUgPSBwcmV2aW91czsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVmZXJlbmNlRW50cnk8SywgVj4gZ2V0TmV4dEV2aWN0YWJsZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXh0RXZpY3RhYmxlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE5leHRFdmljdGFibGUoUmVmZXJlbmNlRW50cnk8SywgVj4gbmV4dCkgeworICAgICAgICAgICAgdGhpcy5uZXh0RXZpY3RhYmxlID0gbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVmZXJlbmNlRW50cnk8SywgVj4gZ2V0UHJldmlvdXNFdmljdGFibGUoKSB7CisgICAgICAgICAgICByZXR1cm4gcHJldmlvdXNFdmljdGFibGU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UHJldmlvdXNFdmljdGFibGUoUmVmZXJlbmNlRW50cnk8SywgVj4gcHJldmlvdXMpIHsKKyAgICAgICAgICAgIHRoaXMucHJldmlvdXNFdmljdGFibGUgPSBwcmV2aW91czsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZmVyZW5jZXMgYSBzdHJvbmcgdmFsdWUuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIFN0cm9uZ1ZhbHVlUmVmZXJlbmNlPEssIFY+IGltcGxlbWVudHMgVmFsdWVSZWZlcmVuY2U8SywgVj4geworICAgICAgICBmaW5hbCBWIHJlZmVyZW50OworCisgICAgICAgIFN0cm9uZ1ZhbHVlUmVmZXJlbmNlKFYgcmVmZXJlbnQpIHsKKyAgICAgICAgICAgIHRoaXMucmVmZXJlbnQgPSByZWZlcmVudDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgViBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gcmVmZXJlbnQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlZmVyZW5jZUVudHJ5PEssIFY+IGdldEVudHJ5KCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFZhbHVlUmVmZXJlbmNlPEssIFY+IGNvcHlGb3IoCisgICAgICAgICAgICAgICAgUmVmZXJlbmNlUXVldWU8Vj4gcXVldWUsIFYgdmFsdWUsIFJlZmVyZW5jZUVudHJ5PEssIFY+IGVudHJ5KSB7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbXB1dGluZ1JlZmVyZW5jZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcihWYWx1ZVJlZmVyZW5jZTxLLCBWPiBuZXdWYWx1ZSkgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VnbWVudHMgYXJlIHNwZWNpYWxpemVkIHZlcnNpb25zIG9mIGhhc2ggdGFibGVzLiBUaGlzIHN1YmNsYXNzIGluaGVyaXRzIGZyb20gUmVlbnRyYW50TG9jaworICAgICAqIG9wcG9ydHVuaXN0aWNhbGx5LCBqdXN0IHRvIHNpbXBsaWZ5IHNvbWUgbG9ja2luZyBhbmQgYXZvaWQgc2VwYXJhdGUgY29uc3RydWN0aW9uLgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJzZXJpYWwiKSAvLyBUaGlzIGNsYXNzIGlzIG5ldmVyIHNlcmlhbGl6ZWQuCisgICAgc3RhdGljIGNsYXNzIFNlZ21lbnQ8SywgVj4gZXh0ZW5kcyBSZWVudHJhbnRMb2NrIHsKKworICAgIC8qCisgICAgICogVE9ETyhmcnkpOiBDb25zaWRlciBjb3B5aW5nIHZhcmlhYmxlcyAobGlrZSBldmljdHNCeVNpemUpIGZyb20gb3V0ZXIgY2xhc3MgaW50byB0aGlzIGNsYXNzLgorICAgICAqIEl0IHdpbGwgcmVxdWlyZSBtb3JlIG1lbW9yeSBidXQgd2lsbCByZWR1Y2UgaW5kaXJlY3Rpb24uCisgICAgICovCisKKyAgICAvKgorICAgICAqIFNlZ21lbnRzIG1haW50YWluIGEgdGFibGUgb2YgZW50cnkgbGlzdHMgdGhhdCBhcmUgQUxXQVlTIGtlcHQgaW4gYSBjb25zaXN0ZW50IHN0YXRlLCBzbyBjYW4KKyAgICAgKiBiZSByZWFkIHdpdGhvdXQgbG9ja2luZy4gTmV4dCBmaWVsZHMgb2Ygbm9kZXMgYXJlIGltbXV0YWJsZSAoZmluYWwpLiBBbGwgbGlzdCBhZGRpdGlvbnMgYXJlCisgICAgICogcGVyZm9ybWVkIGF0IHRoZSBmcm9udCBvZiBlYWNoIGJpbi4gVGhpcyBtYWtlcyBpdCBlYXN5IHRvIGNoZWNrIGNoYW5nZXMsIGFuZCBhbHNvIGZhc3QgdG8KKyAgICAgKiB0cmF2ZXJzZS4gV2hlbiBub2RlcyB3b3VsZCBvdGhlcndpc2UgYmUgY2hhbmdlZCwgbmV3IG5vZGVzIGFyZSBjcmVhdGVkIHRvIHJlcGxhY2UgdGhlbS4gVGhpcworICAgICAqIHdvcmtzIHdlbGwgZm9yIGhhc2ggdGFibGVzIHNpbmNlIHRoZSBiaW4gbGlzdHMgdGVuZCB0byBiZSBzaG9ydC4gKFRoZSBhdmVyYWdlIGxlbmd0aCBpcyBsZXNzCisgICAgICogdGhhbiB0d28uKQorICAgICAqCisgICAgICogUmVhZCBvcGVyYXRpb25zIGNhbiB0aHVzIHByb2NlZWQgd2l0aG91dCBsb2NraW5nLCBidXQgcmVseSBvbiBzZWxlY3RlZCB1c2VzIG9mIHZvbGF0aWxlcyB0bworICAgICAqIGVuc3VyZSB0aGF0IGNvbXBsZXRlZCB3cml0ZSBvcGVyYXRpb25zIHBlcmZvcm1lZCBieSBvdGhlciB0aHJlYWRzIGFyZSBub3RpY2VkLiBGb3IgbW9zdAorICAgICAqIHB1cnBvc2VzLCB0aGUgImNvdW50IiBmaWVsZCwgdHJhY2tpbmcgdGhlIG51bWJlciBvZiBlbGVtZW50cywgc2VydmVzIGFzIHRoYXQgdm9sYXRpbGUKKyAgICAgKiB2YXJpYWJsZSBlbnN1cmluZyB2aXNpYmlsaXR5LiBUaGlzIGlzIGNvbnZlbmllbnQgYmVjYXVzZSB0aGlzIGZpZWxkIG5lZWRzIHRvIGJlIHJlYWQgaW4gbWFueQorICAgICAqIHJlYWQgb3BlcmF0aW9ucyBhbnl3YXk6CisgICAgICoKKyAgICAgKiAtIEFsbCAodW5zeW5jaHJvbml6ZWQpIHJlYWQgb3BlcmF0aW9ucyBtdXN0IGZpcnN0IHJlYWQgdGhlICJjb3VudCIgZmllbGQsIGFuZCBzaG91bGQgbm90CisgICAgICogbG9vayBhdCB0YWJsZSBlbnRyaWVzIGlmIGl0IGlzIDAuCisgICAgICoKKyAgICAgKiAtIEFsbCAoc3luY2hyb25pemVkKSB3cml0ZSBvcGVyYXRpb25zIHNob3VsZCB3cml0ZSB0byB0aGUgImNvdW50IiBmaWVsZCBhZnRlciBzdHJ1Y3R1cmFsbHkKKyAgICAgKiBjaGFuZ2luZyBhbnkgYmluLiBUaGUgb3BlcmF0aW9ucyBtdXN0IG5vdCB0YWtlIGFueSBhY3Rpb24gdGhhdCBjb3VsZCBldmVuIG1vbWVudGFyaWx5CisgICAgICogY2F1c2UgYSBjb25jdXJyZW50IHJlYWQgb3BlcmF0aW9uIHRvIHNlZSBpbmNvbnNpc3RlbnQgZGF0YS4gVGhpcyBpcyBtYWRlIGVhc2llciBieSB0aGUKKyAgICAgKiBuYXR1cmUgb2YgdGhlIHJlYWQgb3BlcmF0aW9ucyBpbiBNYXAuIEZvciBleGFtcGxlLCBubyBvcGVyYXRpb24gY2FuIHJldmVhbCB0aGF0IHRoZSB0YWJsZQorICAgICAqIGhhcyBncm93biBidXQgdGhlIHRocmVzaG9sZCBoYXMgbm90IHlldCBiZWVuIHVwZGF0ZWQsIHNvIHRoZXJlIGFyZSBubyBhdG9taWNpdHkgcmVxdWlyZW1lbnRzCisgICAgICogZm9yIHRoaXMgd2l0aCByZXNwZWN0IHRvIHJlYWRzLgorICAgICAqCisgICAgICogQXMgYSBndWlkZSwgYWxsIGNyaXRpY2FsIHZvbGF0aWxlIHJlYWRzIGFuZCB3cml0ZXMgdG8gdGhlIGNvdW50IGZpZWxkIGFyZSBtYXJrZWQgaW4gY29kZQorICAgICAqIGNvbW1lbnRzLgorICAgICAqLworCisgICAgICAgIGZpbmFsIE1hcE1ha2VySW50ZXJuYWxNYXA8SywgVj4gbWFwOworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG1heGltdW0gc2l6ZSBvZiB0aGlzIG1hcC4gTWFwTWFrZXIuVU5TRVRfSU5UIGlmIHRoZXJlIGlzIG5vIG1heGltdW0uCisgICAgICAgICAqLworICAgICAgICBmaW5hbCBpbnQgbWF4U2VnbWVudFNpemU7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUga2V5IHJlZmVyZW5jZSBxdWV1ZSBjb250YWlucyBlbnRyaWVzIHdob3NlIGtleXMgaGF2ZSBiZWVuIGdhcmJhZ2UgY29sbGVjdGVkLCBhbmQgd2hpY2gKKyAgICAgICAgICogbmVlZCB0byBiZSBjbGVhbmVkIHVwIGludGVybmFsbHkuCisgICAgICAgICAqLworICAgICAgICBmaW5hbCBSZWZlcmVuY2VRdWV1ZTxLPiBrZXlSZWZlcmVuY2VRdWV1ZTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB2YWx1ZSByZWZlcmVuY2UgcXVldWUgY29udGFpbnMgdmFsdWUgcmVmZXJlbmNlcyB3aG9zZSB2YWx1ZXMgaGF2ZSBiZWVuIGdhcmJhZ2UgY29sbGVjdGVkLAorICAgICAgICAgKiBhbmQgd2hpY2ggbmVlZCB0byBiZSBjbGVhbmVkIHVwIGludGVybmFsbHkuCisgICAgICAgICAqLworICAgICAgICBmaW5hbCBSZWZlcmVuY2VRdWV1ZTxWPiB2YWx1ZVJlZmVyZW5jZVF1ZXVlOworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHJlY2VuY3kgcXVldWUgaXMgdXNlZCB0byByZWNvcmQgd2hpY2ggZW50cmllcyB3ZXJlIGFjY2Vzc2VkIGZvciB1cGRhdGluZyB0aGUgZXZpY3Rpb24KKyAgICAgICAgICogbGlzdCdzIG9yZGVyaW5nLiBJdCBpcyBkcmFpbmVkIGFzIGEgYmF0Y2ggb3BlcmF0aW9uIHdoZW4gZWl0aGVyIHRoZSBEUkFJTl9USFJFU0hPTEQgaXMKKyAgICAgICAgICogY3Jvc3NlZCBvciBhIHdyaXRlIG9jY3VycyBvbiB0aGUgc2VnbWVudC4KKyAgICAgICAgICovCisgICAgICAgIGZpbmFsIFF1ZXVlPFJlZmVyZW5jZUVudHJ5PEssIFY+PiByZWNlbmN5UXVldWU7CisgICAgICAgIC8qKgorICAgICAgICAgKiBBIGNvdW50ZXIgb2YgdGhlIG51bWJlciBvZiByZWFkcyBzaW5jZSB0aGUgbGFzdCB3cml0ZSwgdXNlZCB0byBkcmFpbiBxdWV1ZXMgb24gYSBzbWFsbAorICAgICAgICAgKiBmcmFjdGlvbiBvZiByZWFkIG9wZXJhdGlvbnMuCisgICAgICAgICAqLworICAgICAgICBmaW5hbCBBdG9taWNJbnRlZ2VyIHJlYWRDb3VudCA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CisgICAgICAgIC8qKgorICAgICAgICAgKiBBIHF1ZXVlIG9mIGVsZW1lbnRzIGN1cnJlbnRseSBpbiB0aGUgbWFwLCBvcmRlcmVkIGJ5IGFjY2VzcyB0aW1lLiBFbGVtZW50cyBhcmUgYWRkZWQgdG8gdGhlCisgICAgICAgICAqIHRhaWwgb2YgdGhlIHF1ZXVlIG9uIGFjY2Vzcy93cml0ZS4KKyAgICAgICAgICovCisgICAgICAgIGZpbmFsIFF1ZXVlPFJlZmVyZW5jZUVudHJ5PEssIFY+PiBldmljdGlvblF1ZXVlOworICAgICAgICAvKioKKyAgICAgICAgICogQSBxdWV1ZSBvZiBlbGVtZW50cyBjdXJyZW50bHkgaW4gdGhlIG1hcCwgb3JkZXJlZCBieSBleHBpcmF0aW9uIHRpbWUgKGVpdGhlciBhY2Nlc3Mgb3Igd3JpdGUKKyAgICAgICAgICogdGltZSkuIEVsZW1lbnRzIGFyZSBhZGRlZCB0byB0aGUgdGFpbCBvZiB0aGUgcXVldWUgb24gYWNjZXNzL3dyaXRlLgorICAgICAgICAgKi8KKyAgICAgICAgZmluYWwgUXVldWU8UmVmZXJlbmNlRW50cnk8SywgVj4+IGV4cGlyYXRpb25RdWV1ZTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBudW1iZXIgb2YgbGl2ZSBlbGVtZW50cyBpbiB0aGlzIHNlZ21lbnQncyByZWdpb24uIFRoaXMgZG9lcyBub3QgaW5jbHVkZSB1bnNldCBlbGVtZW50cworICAgICAgICAgKiB3aGljaCBhcmUgYXdhaXRpbmcgY2xlYW51cC4KKyAgICAgICAgICovCisgICAgICAgIHZvbGF0aWxlIGludCBjb3VudDsKKyAgICAgICAgLyoqCisgICAgICAgICAqIE51bWJlciBvZiB1cGRhdGVzIHRoYXQgYWx0ZXIgdGhlIHNpemUgb2YgdGhlIHRhYmxlLiBUaGlzIGlzIHVzZWQgZHVyaW5nIGJ1bGstcmVhZCBtZXRob2RzIHRvCisgICAgICAgICAqIG1ha2Ugc3VyZSB0aGV5IHNlZSBhIGNvbnNpc3RlbnQgc25hcHNob3Q6IElmIG1vZENvdW50cyBjaGFuZ2UgZHVyaW5nIGEgdHJhdmVyc2FsIG9mIHNlZ21lbnRzCisgICAgICAgICAqIGNvbXB1dGluZyBzaXplIG9yIGNoZWNraW5nIGNvbnRhaW5zVmFsdWUsIHRoZW4gd2UgbWlnaHQgaGF2ZSBhbiBpbmNvbnNpc3RlbnQgdmlldyBvZiBzdGF0ZQorICAgICAgICAgKiBzbyAodXN1YWxseSkgbXVzdCByZXRyeS4KKyAgICAgICAgICovCisgICAgICAgIGludCBtb2RDb3VudDsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSB0YWJsZSBpcyBleHBhbmRlZCB3aGVuIGl0cyBzaXplIGV4Y2VlZHMgdGhpcyB0aHJlc2hvbGQuIChUaGUgdmFsdWUgb2YgdGhpcyBmaWVsZCBpcworICAgICAgICAgKiBhbHdheXMge0Bjb2RlIChpbnQpIChjYXBhY2l0eSAqIDAuNzUpfS4pCisgICAgICAgICAqLworICAgICAgICBpbnQgdGhyZXNob2xkOworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHBlci1zZWdtZW50IHRhYmxlLgorICAgICAgICAgKi8KKyAgICAgICAgdm9sYXRpbGUgQXRvbWljUmVmZXJlbmNlQXJyYXk8UmVmZXJlbmNlRW50cnk8SywgVj4+IHRhYmxlOworCisgICAgICAgIFNlZ21lbnQoTWFwTWFrZXJJbnRlcm5hbE1hcDxLLCBWPiBtYXAsIGludCBpbml0aWFsQ2FwYWNpdHksIGludCBtYXhTZWdtZW50U2l6ZSkgeworICAgICAgICAgICAgdGhpcy5tYXAgPSBtYXA7CisgICAgICAgICAgICB0aGlzLm1heFNlZ21lbnRTaXplID0gbWF4U2VnbWVudFNpemU7CisgICAgICAgICAgICBpbml0VGFibGUobmV3RW50cnlBcnJheShpbml0aWFsQ2FwYWNpdHkpKTsKKworICAgICAgICAgICAga2V5UmVmZXJlbmNlUXVldWUgPSBtYXAudXNlc0tleVJlZmVyZW5jZXMoKQorICAgICAgICAgICAgICAgICAgICA/IG5ldyBSZWZlcmVuY2VRdWV1ZTxLPigpIDogbnVsbDsKKworICAgICAgICAgICAgdmFsdWVSZWZlcmVuY2VRdWV1ZSA9IG1hcC51c2VzVmFsdWVSZWZlcmVuY2VzKCkKKyAgICAgICAgICAgICAgICAgICAgPyBuZXcgUmVmZXJlbmNlUXVldWU8Vj4oKSA6IG51bGw7CisKKyAgICAgICAgICAgIHJlY2VuY3lRdWV1ZSA9IChtYXAuZXZpY3RzQnlTaXplKCkgfHwgbWFwLmV4cGlyZXNBZnRlckFjY2VzcygpKQorICAgICAgICAgICAgICAgICAgICA/IG5ldyBDb25jdXJyZW50TGlua2VkUXVldWU8UmVmZXJlbmNlRW50cnk8SywgVj4+KCkKKyAgICAgICAgICAgICAgICAgICAgOiBNYXBNYWtlckludGVybmFsTWFwLmRpc2NhcmRpbmdRdWV1ZSgpOworCisgICAgICAgICAgICBldmljdGlvblF1ZXVlID0gbWFwLmV2aWN0c0J5U2l6ZSgpCisgICAgICAgICAgICAgICAgICAgID8gbmV3IEV2aWN0aW9uUXVldWU8SywgVj4oKQorICAgICAgICAgICAgICAgICAgICA6IE1hcE1ha2VySW50ZXJuYWxNYXAuZGlzY2FyZGluZ1F1ZXVlKCk7CisKKyAgICAgICAgICAgIGV4cGlyYXRpb25RdWV1ZSA9IG1hcC5leHBpcmVzKCkKKyAgICAgICAgICAgICAgICAgICAgPyBuZXcgRXhwaXJhdGlvblF1ZXVlPEssIFY+KCkKKyAgICAgICAgICAgICAgICAgICAgOiBNYXBNYWtlckludGVybmFsTWFwLmRpc2NhcmRpbmdRdWV1ZSgpOworICAgICAgICB9CisKKyAgICAgICAgQXRvbWljUmVmZXJlbmNlQXJyYXk8UmVmZXJlbmNlRW50cnk8SywgVj4+IG5ld0VudHJ5QXJyYXkoaW50IHNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQXRvbWljUmVmZXJlbmNlQXJyYXk8UmVmZXJlbmNlRW50cnk8SywgVj4+KHNpemUpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBpbml0VGFibGUoQXRvbWljUmVmZXJlbmNlQXJyYXk8UmVmZXJlbmNlRW50cnk8SywgVj4+IG5ld1RhYmxlKSB7CisgICAgICAgICAgICB0aGlzLnRocmVzaG9sZCA9IG5ld1RhYmxlLmxlbmd0aCgpICogMyAvIDQ7IC8vIDAuNzUKKyAgICAgICAgICAgIGlmICh0aGlzLnRocmVzaG9sZCA9PSBtYXhTZWdtZW50U2l6ZSkgeworICAgICAgICAgICAgICAgIC8vIHByZXZlbnQgc3B1cmlvdXMgZXhwYW5zaW9uIGJlZm9yZSBldmljdGlvbgorICAgICAgICAgICAgICAgIHRoaXMudGhyZXNob2xkKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLnRhYmxlID0gbmV3VGFibGU7CisgICAgICAgIH0KKworICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXdFbnRyeShLIGtleSwgaW50IGhhc2gsIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5leHQpIHsKKyAgICAgICAgICAgIHJldHVybiBtYXAuZW50cnlGYWN0b3J5Lm5ld0VudHJ5KHRoaXMsIGtleSwgaGFzaCwgbmV4dCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ29waWVzIHtAY29kZSBvcmlnaW5hbH0gaW50byBhIG5ldyBlbnRyeSBjaGFpbmVkIHRvIHtAY29kZSBuZXdOZXh0fS4gUmV0dXJucyB0aGUgbmV3IGVudHJ5LAorICAgICAgICAgKiBvciB7QGNvZGUgbnVsbH0gaWYge0Bjb2RlIG9yaWdpbmFsfSB3YXMgYWxyZWFkeSBnYXJiYWdlIGNvbGxlY3RlZC4KKyAgICAgICAgICovCisgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IGNvcHlFbnRyeShSZWZlcmVuY2VFbnRyeTxLLCBWPiBvcmlnaW5hbCwgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV3TmV4dCkgeworICAgICAgICAgICAgaWYgKG9yaWdpbmFsLmdldEtleSgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBrZXkgY29sbGVjdGVkCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFZhbHVlUmVmZXJlbmNlPEssIFY+IHZhbHVlUmVmZXJlbmNlID0gb3JpZ2luYWwuZ2V0VmFsdWVSZWZlcmVuY2UoKTsKKyAgICAgICAgICAgIFYgdmFsdWUgPSB2YWx1ZVJlZmVyZW5jZS5nZXQoKTsKKyAgICAgICAgICAgIGlmICgodmFsdWUgPT0gbnVsbCkgJiYgIXZhbHVlUmVmZXJlbmNlLmlzQ29tcHV0aW5nUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgICAgICAvLyB2YWx1ZSBjb2xsZWN0ZWQKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV3RW50cnkgPSBtYXAuZW50cnlGYWN0b3J5LmNvcHlFbnRyeSh0aGlzLCBvcmlnaW5hbCwgbmV3TmV4dCk7CisgICAgICAgICAgICBuZXdFbnRyeS5zZXRWYWx1ZVJlZmVyZW5jZSh2YWx1ZVJlZmVyZW5jZS5jb3B5Rm9yKHRoaXMudmFsdWVSZWZlcmVuY2VRdWV1ZSwgdmFsdWUsIG5ld0VudHJ5KSk7CisgICAgICAgICAgICByZXR1cm4gbmV3RW50cnk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyBhIG5ldyB2YWx1ZSBvZiBhbiBlbnRyeS4gQWRkcyBuZXdseSBjcmVhdGVkIGVudHJpZXMgYXQgdGhlIGVuZCBvZiB0aGUgZXhwaXJhdGlvbiBxdWV1ZS4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgc2V0VmFsdWUoUmVmZXJlbmNlRW50cnk8SywgVj4gZW50cnksIFYgdmFsdWUpIHsKKyAgICAgICAgICAgIFZhbHVlUmVmZXJlbmNlPEssIFY+IHZhbHVlUmVmZXJlbmNlID0gbWFwLnZhbHVlU3RyZW5ndGgucmVmZXJlbmNlVmFsdWUodGhpcywgZW50cnksIHZhbHVlKTsKKyAgICAgICAgICAgIGVudHJ5LnNldFZhbHVlUmVmZXJlbmNlKHZhbHVlUmVmZXJlbmNlKTsKKyAgICAgICAgICAgIHJlY29yZFdyaXRlKGVudHJ5KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHJlZmVyZW5jZSBxdWV1ZXMsIGZvciBnYXJiYWdlIGNvbGxlY3Rpb24gY2xlYW51cAorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDbGVhbnVwIGNvbGxlY3RlZCBlbnRyaWVzIHdoZW4gdGhlIGxvY2sgaXMgYXZhaWxhYmxlLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCB0cnlEcmFpblJlZmVyZW5jZVF1ZXVlcygpIHsKKyAgICAgICAgICAgIGlmICh0cnlMb2NrKCkpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBkcmFpblJlZmVyZW5jZVF1ZXVlcygpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBEcmFpbiB0aGUga2V5IGFuZCB2YWx1ZSByZWZlcmVuY2UgcXVldWVzLCBjbGVhbmluZyB1cCBpbnRlcm5hbCBlbnRyaWVzIGNvbnRhaW5pbmcgZ2FyYmFnZQorICAgICAgICAgKiBjb2xsZWN0ZWQga2V5cyBvciB2YWx1ZXMuCisgICAgICAgICAqLworICAgICAgICB2b2lkIGRyYWluUmVmZXJlbmNlUXVldWVzKCkgeworICAgICAgICAgICAgaWYgKG1hcC51c2VzS2V5UmVmZXJlbmNlcygpKSB7CisgICAgICAgICAgICAgICAgZHJhaW5LZXlSZWZlcmVuY2VRdWV1ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1hcC51c2VzVmFsdWVSZWZlcmVuY2VzKCkpIHsKKyAgICAgICAgICAgICAgICBkcmFpblZhbHVlUmVmZXJlbmNlUXVldWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgZHJhaW5LZXlSZWZlcmVuY2VRdWV1ZSgpIHsKKyAgICAgICAgICAgIFJlZmVyZW5jZTw/IGV4dGVuZHMgSz4gcmVmOworICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgd2hpbGUgKChyZWYgPSBrZXlSZWZlcmVuY2VRdWV1ZS5wb2xsKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBlbnRyeSA9IChSZWZlcmVuY2VFbnRyeTxLLCBWPikgcmVmOworICAgICAgICAgICAgICAgIG1hcC5yZWNsYWltS2V5KGVudHJ5KTsKKyAgICAgICAgICAgICAgICBpZiAoKytpID09IERSQUlOX01BWCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGRyYWluVmFsdWVSZWZlcmVuY2VRdWV1ZSgpIHsKKyAgICAgICAgICAgIFJlZmVyZW5jZTw/IGV4dGVuZHMgVj4gcmVmOworICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgd2hpbGUgKChyZWYgPSB2YWx1ZVJlZmVyZW5jZVF1ZXVlLnBvbGwoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICAgICAgICAgIFZhbHVlUmVmZXJlbmNlPEssIFY+IHZhbHVlUmVmZXJlbmNlID0gKFZhbHVlUmVmZXJlbmNlPEssIFY+KSByZWY7CisgICAgICAgICAgICAgICAgbWFwLnJlY2xhaW1WYWx1ZSh2YWx1ZVJlZmVyZW5jZSk7CisgICAgICAgICAgICAgICAgaWYgKCsraSA9PSBEUkFJTl9NQVgpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENsZWFycyBhbGwgZW50cmllcyBmcm9tIHRoZSBrZXkgYW5kIHZhbHVlIHJlZmVyZW5jZSBxdWV1ZXMuCisgICAgICAgICAqLworICAgICAgICB2b2lkIGNsZWFyUmVmZXJlbmNlUXVldWVzKCkgeworICAgICAgICAgICAgaWYgKG1hcC51c2VzS2V5UmVmZXJlbmNlcygpKSB7CisgICAgICAgICAgICAgICAgY2xlYXJLZXlSZWZlcmVuY2VRdWV1ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1hcC51c2VzVmFsdWVSZWZlcmVuY2VzKCkpIHsKKyAgICAgICAgICAgICAgICBjbGVhclZhbHVlUmVmZXJlbmNlUXVldWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgY2xlYXJLZXlSZWZlcmVuY2VRdWV1ZSgpIHsKKyAgICAgICAgICAgIHdoaWxlIChrZXlSZWZlcmVuY2VRdWV1ZS5wb2xsKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdm9pZCBjbGVhclZhbHVlUmVmZXJlbmNlUXVldWUoKSB7CisgICAgICAgICAgICB3aGlsZSAodmFsdWVSZWZlcmVuY2VRdWV1ZS5wb2xsKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gcmVjZW5jeSBxdWV1ZSwgc2hhcmVkIGJ5IGV4cGlyYXRpb24gYW5kIGV2aWN0aW9uCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlY29yZHMgdGhlIHJlbGF0aXZlIG9yZGVyIGluIHdoaWNoIHRoaXMgcmVhZCB3YXMgcGVyZm9ybWVkIGJ5IGFkZGluZyB7QGNvZGUgZW50cnl9IHRvIHRoZQorICAgICAgICAgKiByZWNlbmN5IHF1ZXVlLiBBdCB3cml0ZS10aW1lLCBvciB3aGVuIHRoZSBxdWV1ZSBpcyBmdWxsIHBhc3QgdGhlIHRocmVzaG9sZCwgdGhlIHF1ZXVlIHdpbGwKKyAgICAgICAgICogYmUgZHJhaW5lZCBhbmQgdGhlIGVudHJpZXMgdGhlcmVpbiBwcm9jZXNzZWQuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiA8cD5Ob3RlOiBsb2NrZWQgcmVhZHMgc2hvdWxkIHVzZSB7QGxpbmsgI3JlY29yZExvY2tlZFJlYWR9LgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCByZWNvcmRSZWFkKFJlZmVyZW5jZUVudHJ5PEssIFY+IGVudHJ5KSB7CisgICAgICAgICAgICBpZiAobWFwLmV4cGlyZXNBZnRlckFjY2VzcygpKSB7CisgICAgICAgICAgICAgICAgcmVjb3JkRXhwaXJhdGlvblRpbWUoZW50cnksIG1hcC5leHBpcmVBZnRlckFjY2Vzc05hbm9zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlY2VuY3lRdWV1ZS5hZGQoZW50cnkpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFVwZGF0ZXMgdGhlIGV2aWN0aW9uIG1ldGFkYXRhIHRoYXQge0Bjb2RlIGVudHJ5fSB3YXMganVzdCByZWFkLiBUaGlzIGN1cnJlbnRseSBhbW91bnRzIHRvCisgICAgICAgICAqIGFkZGluZyB7QGNvZGUgZW50cnl9IHRvIHJlbGV2YW50IGV2aWN0aW9uIGxpc3RzLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogPHA+Tm90ZTogdGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHVuZGVyIGxvY2ssIGFzIGl0IGRpcmVjdGx5IG1hbmlwdWxhdGVzIHRoZQorICAgICAgICAgKiBldmljdGlvbiBxdWV1ZXMuIFVubG9ja2VkIHJlYWRzIHNob3VsZCB1c2Uge0BsaW5rICNyZWNvcmRSZWFkfS4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgcmVjb3JkTG9ja2VkUmVhZChSZWZlcmVuY2VFbnRyeTxLLCBWPiBlbnRyeSkgeworICAgICAgICAgICAgZXZpY3Rpb25RdWV1ZS5hZGQoZW50cnkpOworICAgICAgICAgICAgaWYgKG1hcC5leHBpcmVzQWZ0ZXJBY2Nlc3MoKSkgeworICAgICAgICAgICAgICAgIHJlY29yZEV4cGlyYXRpb25UaW1lKGVudHJ5LCBtYXAuZXhwaXJlQWZ0ZXJBY2Nlc3NOYW5vcyk7CisgICAgICAgICAgICAgICAgZXhwaXJhdGlvblF1ZXVlLmFkZChlbnRyeSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVXBkYXRlcyBldmljdGlvbiBtZXRhZGF0YSB0aGF0IHtAY29kZSBlbnRyeX0gd2FzIGp1c3Qgd3JpdHRlbi4gVGhpcyBjdXJyZW50bHkgYW1vdW50cyB0bworICAgICAgICAgKiBhZGRpbmcge0Bjb2RlIGVudHJ5fSB0byByZWxldmFudCBldmljdGlvbiBsaXN0cy4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgcmVjb3JkV3JpdGUoUmVmZXJlbmNlRW50cnk8SywgVj4gZW50cnkpIHsKKyAgICAgICAgICAgIC8vIHdlIGFyZSBhbHJlYWR5IHVuZGVyIGxvY2ssIHNvIGRyYWluIHRoZSByZWNlbmN5IHF1ZXVlIGltbWVkaWF0ZWx5CisgICAgICAgICAgICBkcmFpblJlY2VuY3lRdWV1ZSgpOworICAgICAgICAgICAgZXZpY3Rpb25RdWV1ZS5hZGQoZW50cnkpOworICAgICAgICAgICAgaWYgKG1hcC5leHBpcmVzKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBjdXJyZW50bHkgTWFwTWFrZXIgZW5zdXJlcyB0aGF0IGV4cGlyZUFmdGVyV3JpdGUgYW5kCisgICAgICAgICAgICAgICAgLy8gZXhwaXJlQWZ0ZXJBY2Nlc3MgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZQorICAgICAgICAgICAgICAgIGxvbmcgZXhwaXJhdGlvbiA9IG1hcC5leHBpcmVzQWZ0ZXJBY2Nlc3MoKQorICAgICAgICAgICAgICAgICAgICAgICAgPyBtYXAuZXhwaXJlQWZ0ZXJBY2Nlc3NOYW5vcworICAgICAgICAgICAgICAgICAgICAgICAgOiBtYXAuZXhwaXJlQWZ0ZXJXcml0ZU5hbm9zOworICAgICAgICAgICAgICAgIHJlY29yZEV4cGlyYXRpb25UaW1lKGVudHJ5LCBleHBpcmF0aW9uKTsKKyAgICAgICAgICAgICAgICBleHBpcmF0aW9uUXVldWUuYWRkKGVudHJ5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBEcmFpbnMgdGhlIHJlY2VuY3kgcXVldWUsIHVwZGF0aW5nIGV2aWN0aW9uIG1ldGFkYXRhIHRoYXQgdGhlIGVudHJpZXMgdGhlcmVpbiB3ZXJlIHJlYWQgaW4KKyAgICAgICAgICogdGhlIHNwZWNpZmllZCByZWxhdGl2ZSBvcmRlci4gVGhpcyBjdXJyZW50bHkgYW1vdW50cyB0byBhZGRpbmcgdGhlbSB0byByZWxldmFudCBldmljdGlvbgorICAgICAgICAgKiBsaXN0cyAoYWNjb3VudGluZyBmb3IgdGhlIGZhY3QgdGhhdCB0aGV5IGNvdWxkIGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIG1hcCBzaW5jZSBiZWluZworICAgICAgICAgKiBhZGRlZCB0byB0aGUgcmVjZW5jeSBxdWV1ZSkuCisgICAgICAgICAqLworICAgICAgICB2b2lkIGRyYWluUmVjZW5jeVF1ZXVlKCkgeworICAgICAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gZTsKKyAgICAgICAgICAgIHdoaWxlICgoZSA9IHJlY2VuY3lRdWV1ZS5wb2xsKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBBbiBlbnRyeSBtYXkgYmUgaW4gdGhlIHJlY2VuY3kgcXVldWUgZGVzcGl0ZSBpdCBiZWluZyByZW1vdmVkIGZyb20KKyAgICAgICAgICAgICAgICAvLyB0aGUgbWFwIC4gVGhpcyBjYW4gb2NjdXIgd2hlbiB0aGUgZW50cnkgd2FzIGNvbmN1cnJlbnRseSByZWFkIHdoaWxlIGEKKyAgICAgICAgICAgICAgICAvLyB3cml0ZXIgaXMgcmVtb3ZpbmcgaXQgZnJvbSB0aGUgc2VnbWVudCBvciBhZnRlciBhIGNsZWFyIGhhcyByZW1vdmVkCisgICAgICAgICAgICAgICAgLy8gYWxsIG9mIHRoZSBzZWdtZW50J3MgZW50cmllcy4KKyAgICAgICAgICAgICAgICBpZiAoZXZpY3Rpb25RdWV1ZS5jb250YWlucyhlKSkgeworICAgICAgICAgICAgICAgICAgICBldmljdGlvblF1ZXVlLmFkZChlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1hcC5leHBpcmVzQWZ0ZXJBY2Nlc3MoKSAmJiBleHBpcmF0aW9uUXVldWUuY29udGFpbnMoZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZXhwaXJhdGlvblF1ZXVlLmFkZChlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBleHBpcmF0aW9uCisKKyAgICAgICAgdm9pZCByZWNvcmRFeHBpcmF0aW9uVGltZShSZWZlcmVuY2VFbnRyeTxLLCBWPiBlbnRyeSwgbG9uZyBleHBpcmF0aW9uTmFub3MpIHsKKyAgICAgICAgICAgIC8vIG1pZ2h0IG92ZXJmbG93LCBidXQgdGhhdCdzIG9rYXkgKHNlZSBpc0V4cGlyZWQoKSkKKyAgICAgICAgICAgIGVudHJ5LnNldEV4cGlyYXRpb25UaW1lKG1hcC50aWNrZXIucmVhZCgpICsgZXhwaXJhdGlvbk5hbm9zKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDbGVhbnVwIGV4cGlyZWQgZW50cmllcyB3aGVuIHRoZSBsb2NrIGlzIGF2YWlsYWJsZS4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgdHJ5RXhwaXJlRW50cmllcygpIHsKKyAgICAgICAgICAgIGlmICh0cnlMb2NrKCkpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBleHBpcmVFbnRyaWVzKCk7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IGNhbGwgcG9zdFdyaXRlQ2xlYW51cCBhcyB3ZSdyZSBpbiBhIHJlYWQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGV4cGlyZUVudHJpZXMoKSB7CisgICAgICAgICAgICBkcmFpblJlY2VuY3lRdWV1ZSgpOworCisgICAgICAgICAgICBpZiAoZXhwaXJhdGlvblF1ZXVlLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIC8vIFRoZXJlJ3Mgbm8gcG9pbnQgaW4gY2FsbGluZyBuYW5vVGltZSgpIGlmIHdlIGhhdmUgbm8gZW50cmllcyB0bworICAgICAgICAgICAgICAgIC8vIGV4cGlyZS4KKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb25nIG5vdyA9IG1hcC50aWNrZXIucmVhZCgpOworICAgICAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gZTsKKyAgICAgICAgICAgIHdoaWxlICgoZSA9IGV4cGlyYXRpb25RdWV1ZS5wZWVrKCkpICE9IG51bGwgJiYgbWFwLmlzRXhwaXJlZChlLCBub3cpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFyZW1vdmVFbnRyeShlLCBlLmdldEhhc2goKSwgTWFwTWFrZXIuUmVtb3ZhbENhdXNlLkVYUElSRUQpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGV2aWN0aW9uCisKKyAgICAgICAgdm9pZCBlbnF1ZXVlTm90aWZpY2F0aW9uKFJlZmVyZW5jZUVudHJ5PEssIFY+IGVudHJ5LCBNYXBNYWtlci5SZW1vdmFsQ2F1c2UgY2F1c2UpIHsKKyAgICAgICAgICAgIGVucXVldWVOb3RpZmljYXRpb24oZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldEhhc2goKSwgZW50cnkuZ2V0VmFsdWVSZWZlcmVuY2UoKS5nZXQoKSwgY2F1c2UpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBlbnF1ZXVlTm90aWZpY2F0aW9uKEsga2V5LCBpbnQgaGFzaCwgViB2YWx1ZSwgTWFwTWFrZXIuUmVtb3ZhbENhdXNlIGNhdXNlKSB7CisgICAgICAgICAgICBpZiAobWFwLnJlbW92YWxOb3RpZmljYXRpb25RdWV1ZSAhPSBESVNDQVJESU5HX1FVRVVFKSB7CisgICAgICAgICAgICAgICAgTWFwTWFrZXIuUmVtb3ZhbE5vdGlmaWNhdGlvbjxLLCBWPiBub3RpZmljYXRpb24gPSBuZXcgTWFwTWFrZXIuUmVtb3ZhbE5vdGlmaWNhdGlvbjxLLCBWPihrZXksIHZhbHVlLCBjYXVzZSk7CisgICAgICAgICAgICAgICAgbWFwLnJlbW92YWxOb3RpZmljYXRpb25RdWV1ZS5vZmZlcihub3RpZmljYXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBlcmZvcm1zIGV2aWN0aW9uIGlmIHRoZSBzZWdtZW50IGlzIGZ1bGwuIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIHByaW9yIHRvIGFkZGluZyBhIG5ldworICAgICAgICAgKiBlbnRyeSBhbmQgaW5jcmVhc2luZyB7QGNvZGUgY291bnR9LgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBldmljdGlvbiBvY2N1cnJlZAorICAgICAgICAgKi8KKyAgICAgICAgYm9vbGVhbiBldmljdEVudHJpZXMoKSB7CisgICAgICAgICAgICBpZiAobWFwLmV2aWN0c0J5U2l6ZSgpICYmIGNvdW50ID49IG1heFNlZ21lbnRTaXplKSB7CisgICAgICAgICAgICAgICAgZHJhaW5SZWNlbmN5UXVldWUoKTsKKworICAgICAgICAgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IGUgPSBldmljdGlvblF1ZXVlLnJlbW92ZSgpOworICAgICAgICAgICAgICAgIGlmICghcmVtb3ZlRW50cnkoZSwgZS5nZXRIYXNoKCksIE1hcE1ha2VyLlJlbW92YWxDYXVzZS5TSVpFKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyBmaXJzdCBlbnRyeSBvZiBiaW4gZm9yIGdpdmVuIGhhc2guCisgICAgICAgICAqLworICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBnZXRGaXJzdChpbnQgaGFzaCkgeworICAgICAgICAgICAgLy8gcmVhZCB0aGlzIHZvbGF0aWxlIGZpZWxkIG9ubHkgb25jZQorICAgICAgICAgICAgQXRvbWljUmVmZXJlbmNlQXJyYXk8UmVmZXJlbmNlRW50cnk8SywgVj4+IHRhYmxlID0gdGhpcy50YWJsZTsKKyAgICAgICAgICAgIHJldHVybiB0YWJsZS5nZXQoaGFzaCAmICh0YWJsZS5sZW5ndGgoKSAtIDEpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNwZWNpYWxpemVkIGltcGxlbWVudGF0aW9ucyBvZiBtYXAgbWV0aG9kcworCisgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IGdldEVudHJ5KE9iamVjdCBrZXksIGludCBoYXNoKSB7CisgICAgICAgICAgICBpZiAoY291bnQgIT0gMCkgeyAvLyByZWFkLXZvbGF0aWxlCisgICAgICAgICAgICAgICAgZm9yIChSZWZlcmVuY2VFbnRyeTxLLCBWPiBlID0gZ2V0Rmlyc3QoaGFzaCk7IGUgIT0gbnVsbDsgZSA9IGUuZ2V0TmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChlLmdldEhhc2goKSAhPSBoYXNoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEsgZW50cnlLZXkgPSBlLmdldEtleSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnlLZXkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5RHJhaW5SZWZlcmVuY2VRdWV1ZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1hcC5rZXlFcXVpdmFsZW5jZS5lcXVpdmFsZW50KGtleSwgZW50cnlLZXkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBnZXRMaXZlRW50cnkoT2JqZWN0IGtleSwgaW50IGhhc2gpIHsKKyAgICAgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IGUgPSBnZXRFbnRyeShrZXksIGhhc2gpOworICAgICAgICAgICAgaWYgKGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfSBlbHNlIGlmIChtYXAuZXhwaXJlcygpICYmIG1hcC5pc0V4cGlyZWQoZSkpIHsKKyAgICAgICAgICAgICAgICB0cnlFeHBpcmVFbnRyaWVzKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZTsKKyAgICAgICAgfQorCisgICAgICAgIFYgZ2V0KE9iamVjdCBrZXksIGludCBoYXNoKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IGUgPSBnZXRMaXZlRW50cnkoa2V5LCBoYXNoKTsKKyAgICAgICAgICAgICAgICBpZiAoZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFYgdmFsdWUgPSBlLmdldFZhbHVlUmVmZXJlbmNlKCkuZ2V0KCk7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVjb3JkUmVhZChlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0cnlEcmFpblJlZmVyZW5jZVF1ZXVlcygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHBvc3RSZWFkQ2xlYW51cCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBjb250YWluc0tleShPYmplY3Qga2V5LCBpbnQgaGFzaCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoY291bnQgIT0gMCkgeyAvLyByZWFkLXZvbGF0aWxlCisgICAgICAgICAgICAgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IGUgPSBnZXRMaXZlRW50cnkoa2V5LCBoYXNoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLmdldFZhbHVlUmVmZXJlbmNlKCkuZ2V0KCkgIT0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHBvc3RSZWFkQ2xlYW51cCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgViBwdXQoSyBrZXksIGludCBoYXNoLCBWIHZhbHVlLCBib29sZWFuIG9ubHlJZkFic2VudCkgeworICAgICAgICAgICAgbG9jaygpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBwcmVXcml0ZUNsZWFudXAoKTsKKworICAgICAgICAgICAgICAgIGludCBuZXdDb3VudCA9IHRoaXMuY291bnQgKyAxOworICAgICAgICAgICAgICAgIGlmIChuZXdDb3VudCA+IHRoaXMudGhyZXNob2xkKSB7IC8vIGVuc3VyZSBjYXBhY2l0eQorICAgICAgICAgICAgICAgICAgICBleHBhbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3Q291bnQgPSB0aGlzLmNvdW50ICsgMTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBBdG9taWNSZWZlcmVuY2VBcnJheTxSZWZlcmVuY2VFbnRyeTxLLCBWPj4gdGFibGUgPSB0aGlzLnRhYmxlOworICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGhhc2ggJiAodGFibGUubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBmaXJzdCA9IHRhYmxlLmdldChpbmRleCk7CisKKyAgICAgICAgICAgICAgICAvLyBMb29rIGZvciBhbiBleGlzdGluZyBlbnRyeS4KKyAgICAgICAgICAgICAgICBmb3IgKFJlZmVyZW5jZUVudHJ5PEssIFY+IGUgPSBmaXJzdDsgZSAhPSBudWxsOyBlID0gZS5nZXROZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgSyBlbnRyeUtleSA9IGUuZ2V0S2V5KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlLmdldEhhc2goKSA9PSBoYXNoICYmIGVudHJ5S2V5ICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtYXAua2V5RXF1aXZhbGVuY2UuZXF1aXZhbGVudChrZXksIGVudHJ5S2V5KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZm91bmQgYW4gZXhpc3RpbmcgZW50cnkuCisKKyAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlUmVmZXJlbmNlPEssIFY+IHZhbHVlUmVmZXJlbmNlID0gZS5nZXRWYWx1ZVJlZmVyZW5jZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgViBlbnRyeVZhbHVlID0gdmFsdWVSZWZlcmVuY2UuZ2V0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeVZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArK21vZENvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhbHVlKGUsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlUmVmZXJlbmNlLmlzQ29tcHV0aW5nUmVmZXJlbmNlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5xdWV1ZU5vdGlmaWNhdGlvbihrZXksIGhhc2gsIGVudHJ5VmFsdWUsIE1hcE1ha2VyLlJlbW92YWxDYXVzZS5DT0xMRUNURUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb3VudCA9IHRoaXMuY291bnQ7IC8vIGNvdW50IHJlbWFpbnMgdW5jaGFuZ2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmljdEVudHJpZXMoKSkgeyAvLyBldmljdEVudHJpZXMgYWZ0ZXIgc2V0dGluZyBuZXcgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q291bnQgPSB0aGlzLmNvdW50ICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3VudCA9IG5ld0NvdW50OyAvLyB3cml0ZS12b2xhdGlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvbmx5SWZBYnNlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNaW1pYworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICJpZiAoIW1hcC5jb250YWluc0tleShrZXkpKSAuLi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbHNlIHJldHVybiBtYXAuZ2V0KGtleSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkTG9ja2VkUmVhZChlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnlWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xvYmJlciBleGlzdGluZyBlbnRyeSwgY291bnQgcmVtYWlucyB1bmNoYW5nZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArK21vZENvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVucXVldWVOb3RpZmljYXRpb24oa2V5LCBoYXNoLCBlbnRyeVZhbHVlLCBNYXBNYWtlci5SZW1vdmFsQ2F1c2UuUkVQTEFDRUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFZhbHVlKGUsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnlWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBlbnRyeS4KKyAgICAgICAgICAgICAgICArK21vZENvdW50OworICAgICAgICAgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5ld0VudHJ5ID0gbmV3RW50cnkoa2V5LCBoYXNoLCBmaXJzdCk7CisgICAgICAgICAgICAgICAgc2V0VmFsdWUobmV3RW50cnksIHZhbHVlKTsKKyAgICAgICAgICAgICAgICB0YWJsZS5zZXQoaW5kZXgsIG5ld0VudHJ5KTsKKyAgICAgICAgICAgICAgICBpZiAoZXZpY3RFbnRyaWVzKCkpIHsgLy8gZXZpY3RFbnRyaWVzIGFmdGVyIHNldHRpbmcgbmV3IHZhbHVlCisgICAgICAgICAgICAgICAgICAgIG5ld0NvdW50ID0gdGhpcy5jb3VudCArIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRoaXMuY291bnQgPSBuZXdDb3VudDsgLy8gd3JpdGUtdm9sYXRpbGUKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgICAgICAgICAgcG9zdFdyaXRlQ2xlYW51cCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEV4cGFuZHMgdGhlIHRhYmxlIGlmIHBvc3NpYmxlLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBleHBhbmQoKSB7CisgICAgICAgICAgICBBdG9taWNSZWZlcmVuY2VBcnJheTxSZWZlcmVuY2VFbnRyeTxLLCBWPj4gb2xkVGFibGUgPSB0YWJsZTsKKyAgICAgICAgICAgIGludCBvbGRDYXBhY2l0eSA9IG9sZFRhYmxlLmxlbmd0aCgpOworICAgICAgICAgICAgaWYgKG9sZENhcGFjaXR5ID49IE1BWElNVU1fQ0FQQUNJVFkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgIC8qCisgICAgICAgKiBSZWNsYXNzaWZ5IG5vZGVzIGluIGVhY2ggbGlzdCB0byBuZXcgTWFwLiBCZWNhdXNlIHdlIGFyZSB1c2luZyBwb3dlci1vZi10d28gZXhwYW5zaW9uLCB0aGUKKyAgICAgICAqIGVsZW1lbnRzIGZyb20gZWFjaCBiaW4gbXVzdCBlaXRoZXIgc3RheSBhdCBzYW1lIGluZGV4LCBvciBtb3ZlIHdpdGggYSBwb3dlciBvZiB0d28gb2Zmc2V0LgorICAgICAgICogV2UgZWxpbWluYXRlIHVubmVjZXNzYXJ5IG5vZGUgY3JlYXRpb24gYnkgY2F0Y2hpbmcgY2FzZXMgd2hlcmUgb2xkIG5vZGVzIGNhbiBiZSByZXVzZWQKKyAgICAgICAqIGJlY2F1c2UgdGhlaXIgbmV4dCBmaWVsZHMgd29uJ3QgY2hhbmdlLiBTdGF0aXN0aWNhbGx5LCBhdCB0aGUgZGVmYXVsdCB0aHJlc2hvbGQsIG9ubHkKKyAgICAgICAqIGFib3V0IG9uZS1zaXh0aCBvZiB0aGVtIG5lZWQgY2xvbmluZyB3aGVuIGEgdGFibGUgZG91Ymxlcy4gVGhlIG5vZGVzIHRoZXkgcmVwbGFjZSB3aWxsIGJlCisgICAgICAgKiBnYXJiYWdlIGNvbGxlY3RhYmxlIGFzIHNvb24gYXMgdGhleSBhcmUgbm8gbG9uZ2VyIHJlZmVyZW5jZWQgYnkgYW55IHJlYWRlciB0aHJlYWQgdGhhdCBtYXkKKyAgICAgICAqIGJlIGluIHRoZSBtaWRzdCBvZiB0cmF2ZXJzaW5nIHRhYmxlIHJpZ2h0IG5vdy4KKyAgICAgICAqLworCisgICAgICAgICAgICBpbnQgbmV3Q291bnQgPSBjb3VudDsKKyAgICAgICAgICAgIEF0b21pY1JlZmVyZW5jZUFycmF5PFJlZmVyZW5jZUVudHJ5PEssIFY+PiBuZXdUYWJsZSA9IG5ld0VudHJ5QXJyYXkob2xkQ2FwYWNpdHkgPDwgMSk7CisgICAgICAgICAgICB0aHJlc2hvbGQgPSBuZXdUYWJsZS5sZW5ndGgoKSAqIDMgLyA0OworICAgICAgICAgICAgaW50IG5ld01hc2sgPSBuZXdUYWJsZS5sZW5ndGgoKSAtIDE7CisgICAgICAgICAgICBmb3IgKGludCBvbGRJbmRleCA9IDA7IG9sZEluZGV4IDwgb2xkQ2FwYWNpdHk7ICsrb2xkSW5kZXgpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGd1YXJhbnRlZSB0aGF0IGFueSBleGlzdGluZyByZWFkcyBvZiBvbGQgTWFwIGNhbgorICAgICAgICAgICAgICAgIC8vIHByb2NlZWQuIFNvIHdlIGNhbm5vdCB5ZXQgbnVsbCBvdXQgZWFjaCBiaW4uCisgICAgICAgICAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gaGVhZCA9IG9sZFRhYmxlLmdldChvbGRJbmRleCk7CisKKyAgICAgICAgICAgICAgICBpZiAoaGVhZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5leHQgPSBoZWFkLmdldE5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGhlYWRJbmRleCA9IGhlYWQuZ2V0SGFzaCgpICYgbmV3TWFzazsKKworICAgICAgICAgICAgICAgICAgICAvLyBTaW5nbGUgbm9kZSBvbiBsaXN0CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RhYmxlLnNldChoZWFkSW5kZXgsIGhlYWQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV1c2UgdGhlIGNvbnNlY3V0aXZlIHNlcXVlbmNlIG9mIG5vZGVzIHdpdGggdGhlIHNhbWUgdGFyZ2V0CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmRleCBmcm9tIHRoZSBlbmQgb2YgdGhlIGxpc3QuIHRhaWwgcG9pbnRzIHRvIHRoZSBmaXJzdAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW50cnkgaW4gdGhlIHJldXNhYmxlIGxpc3QuCisgICAgICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiB0YWlsID0gaGVhZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB0YWlsSW5kZXggPSBoZWFkSW5kZXg7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFJlZmVyZW5jZUVudHJ5PEssIFY+IGUgPSBuZXh0OyBlICE9IG51bGw7IGUgPSBlLmdldE5leHQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXdJbmRleCA9IGUuZ2V0SGFzaCgpICYgbmV3TWFzazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3SW5kZXggIT0gdGFpbEluZGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBpbmRleCBjaGFuZ2VkLiBXZSdsbCBuZWVkIHRvIGNvcHkgdGhlIHByZXZpb3VzIGVudHJ5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWlsSW5kZXggPSBuZXdJbmRleDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFpbCA9IGU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3VGFibGUuc2V0KHRhaWxJbmRleCwgdGFpbCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsb25lIG5vZGVzIGxlYWRpbmcgdXAgdG8gdGhlIHRhaWwuCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFJlZmVyZW5jZUVudHJ5PEssIFY+IGUgPSBoZWFkOyBlICE9IHRhaWw7IGUgPSBlLmdldE5leHQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXdJbmRleCA9IGUuZ2V0SGFzaCgpICYgbmV3TWFzazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXdOZXh0ID0gbmV3VGFibGUuZ2V0KG5ld0luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXdGaXJzdCA9IGNvcHlFbnRyeShlLCBuZXdOZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3Rmlyc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdUYWJsZS5zZXQobmV3SW5kZXgsIG5ld0ZpcnN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVDb2xsZWN0ZWRFbnRyeShlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q291bnQtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0YWJsZSA9IG5ld1RhYmxlOworICAgICAgICAgICAgdGhpcy5jb3VudCA9IG5ld0NvdW50OworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiByZXBsYWNlKEsga2V5LCBpbnQgaGFzaCwgViBvbGRWYWx1ZSwgViBuZXdWYWx1ZSkgeworICAgICAgICAgICAgbG9jaygpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBwcmVXcml0ZUNsZWFudXAoKTsKKworICAgICAgICAgICAgICAgIEF0b21pY1JlZmVyZW5jZUFycmF5PFJlZmVyZW5jZUVudHJ5PEssIFY+PiB0YWJsZSA9IHRoaXMudGFibGU7CisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gaGFzaCAmICh0YWJsZS5sZW5ndGgoKSAtIDEpOworICAgICAgICAgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IGZpcnN0ID0gdGFibGUuZ2V0KGluZGV4KTsKKworICAgICAgICAgICAgICAgIGZvciAoUmVmZXJlbmNlRW50cnk8SywgVj4gZSA9IGZpcnN0OyBlICE9IG51bGw7IGUgPSBlLmdldE5leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBLIGVudHJ5S2V5ID0gZS5nZXRLZXkoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGUuZ2V0SGFzaCgpID09IGhhc2ggJiYgZW50cnlLZXkgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1hcC5rZXlFcXVpdmFsZW5jZS5lcXVpdmFsZW50KGtleSwgZW50cnlLZXkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdmFsdWUgZGlzYXBwZWFyZWQsIHRoaXMgZW50cnkgaXMgcGFydGlhbGx5IGNvbGxlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB3ZSBzaG91bGQgcHJldGVuZCBsaWtlIGl0IGRvZXNuJ3QgZXhpc3QuCisgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZVJlZmVyZW5jZTxLLCBWPiB2YWx1ZVJlZmVyZW5jZSA9IGUuZ2V0VmFsdWVSZWZlcmVuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFYgZW50cnlWYWx1ZSA9IHZhbHVlUmVmZXJlbmNlLmdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5VmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0NvbGxlY3RlZCh2YWx1ZVJlZmVyZW5jZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG5ld0NvdW50ID0gdGhpcy5jb3VudCAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrbW9kQ291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVucXVldWVOb3RpZmljYXRpb24oZW50cnlLZXksIGhhc2gsIGVudHJ5VmFsdWUsIE1hcE1ha2VyLlJlbW92YWxDYXVzZS5DT0xMRUNURUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXdGaXJzdCA9IHJlbW92ZUZyb21DaGFpbihmaXJzdCwgZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvdW50ID0gdGhpcy5jb3VudCAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLnNldChpbmRleCwgbmV3Rmlyc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvdW50ID0gbmV3Q291bnQ7IC8vIHdyaXRlLXZvbGF0aWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcC52YWx1ZUVxdWl2YWxlbmNlLmVxdWl2YWxlbnQob2xkVmFsdWUsIGVudHJ5VmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyttb2RDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnF1ZXVlTm90aWZpY2F0aW9uKGtleSwgaGFzaCwgZW50cnlWYWx1ZSwgTWFwTWFrZXIuUmVtb3ZhbENhdXNlLlJFUExBQ0VEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRWYWx1ZShlLCBuZXdWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1pbWljCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gImlmIChtYXAuY29udGFpbnNLZXkoa2V5KSAmJiBtYXAuZ2V0KGtleSkuZXF1YWxzKG9sZFZhbHVlKSkuLi4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkTG9ja2VkUmVhZChlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICAgICAgICAgIHBvc3RXcml0ZUNsZWFudXAoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFYgcmVwbGFjZShLIGtleSwgaW50IGhhc2gsIFYgbmV3VmFsdWUpIHsKKyAgICAgICAgICAgIGxvY2soKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcHJlV3JpdGVDbGVhbnVwKCk7CisKKyAgICAgICAgICAgICAgICBBdG9taWNSZWZlcmVuY2VBcnJheTxSZWZlcmVuY2VFbnRyeTxLLCBWPj4gdGFibGUgPSB0aGlzLnRhYmxlOworICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGhhc2ggJiAodGFibGUubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBmaXJzdCA9IHRhYmxlLmdldChpbmRleCk7CisKKyAgICAgICAgICAgICAgICBmb3IgKFJlZmVyZW5jZUVudHJ5PEssIFY+IGUgPSBmaXJzdDsgZSAhPSBudWxsOyBlID0gZS5nZXROZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgSyBlbnRyeUtleSA9IGUuZ2V0S2V5KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlLmdldEhhc2goKSA9PSBoYXNoICYmIGVudHJ5S2V5ICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtYXAua2V5RXF1aXZhbGVuY2UuZXF1aXZhbGVudChrZXksIGVudHJ5S2V5KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHZhbHVlIGRpc2FwcGVhcmVkLCB0aGlzIGVudHJ5IGlzIHBhcnRpYWxseSBjb2xsZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgd2Ugc2hvdWxkIHByZXRlbmQgbGlrZSBpdCBkb2Vzbid0IGV4aXN0LgorICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVSZWZlcmVuY2U8SywgVj4gdmFsdWVSZWZlcmVuY2UgPSBlLmdldFZhbHVlUmVmZXJlbmNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBWIGVudHJ5VmFsdWUgPSB2YWx1ZVJlZmVyZW5jZS5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbnRyeVZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNDb2xsZWN0ZWQodmFsdWVSZWZlcmVuY2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBuZXdDb3VudCA9IHRoaXMuY291bnQgLSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK21vZENvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnF1ZXVlTm90aWZpY2F0aW9uKGVudHJ5S2V5LCBoYXNoLCBlbnRyeVZhbHVlLCBNYXBNYWtlci5SZW1vdmFsQ2F1c2UuQ09MTEVDVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV3Rmlyc3QgPSByZW1vdmVGcm9tQ2hhaW4oZmlyc3QsIGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb3VudCA9IHRoaXMuY291bnQgLSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5zZXQoaW5kZXgsIG5ld0ZpcnN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3VudCA9IG5ld0NvdW50OyAvLyB3cml0ZS12b2xhdGlsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgKyttb2RDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVucXVldWVOb3RpZmljYXRpb24oa2V5LCBoYXNoLCBlbnRyeVZhbHVlLCBNYXBNYWtlci5SZW1vdmFsQ2F1c2UuUkVQTEFDRUQpOworICAgICAgICAgICAgICAgICAgICAgICAgc2V0VmFsdWUoZSwgbmV3VmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5VmFsdWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgICAgICAgICAgcG9zdFdyaXRlQ2xlYW51cCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgViByZW1vdmUoT2JqZWN0IGtleSwgaW50IGhhc2gpIHsKKyAgICAgICAgICAgIGxvY2soKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcHJlV3JpdGVDbGVhbnVwKCk7CisKKyAgICAgICAgICAgICAgICBpbnQgbmV3Q291bnQgPSB0aGlzLmNvdW50IC0gMTsKKyAgICAgICAgICAgICAgICBBdG9taWNSZWZlcmVuY2VBcnJheTxSZWZlcmVuY2VFbnRyeTxLLCBWPj4gdGFibGUgPSB0aGlzLnRhYmxlOworICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGhhc2ggJiAodGFibGUubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBmaXJzdCA9IHRhYmxlLmdldChpbmRleCk7CisKKyAgICAgICAgICAgICAgICBmb3IgKFJlZmVyZW5jZUVudHJ5PEssIFY+IGUgPSBmaXJzdDsgZSAhPSBudWxsOyBlID0gZS5nZXROZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgSyBlbnRyeUtleSA9IGUuZ2V0S2V5KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlLmdldEhhc2goKSA9PSBoYXNoICYmIGVudHJ5S2V5ICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtYXAua2V5RXF1aXZhbGVuY2UuZXF1aXZhbGVudChrZXksIGVudHJ5S2V5KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVSZWZlcmVuY2U8SywgVj4gdmFsdWVSZWZlcmVuY2UgPSBlLmdldFZhbHVlUmVmZXJlbmNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBWIGVudHJ5VmFsdWUgPSB2YWx1ZVJlZmVyZW5jZS5nZXQoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgTWFwTWFrZXIuUmVtb3ZhbENhdXNlIGNhdXNlOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5VmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdXNlID0gTWFwTWFrZXIuUmVtb3ZhbENhdXNlLkVYUExJQ0lUOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc0NvbGxlY3RlZCh2YWx1ZVJlZmVyZW5jZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXVzZSA9IE1hcE1ha2VyLlJlbW92YWxDYXVzZS5DT0xMRUNURUQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICArK21vZENvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgZW5xdWV1ZU5vdGlmaWNhdGlvbihlbnRyeUtleSwgaGFzaCwgZW50cnlWYWx1ZSwgY2F1c2UpOworICAgICAgICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV3Rmlyc3QgPSByZW1vdmVGcm9tQ2hhaW4oZmlyc3QsIGUpOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q291bnQgPSB0aGlzLmNvdW50IC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlLnNldChpbmRleCwgbmV3Rmlyc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3VudCA9IG5ld0NvdW50OyAvLyB3cml0ZS12b2xhdGlsZQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5VmFsdWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgdW5sb2NrKCk7CisgICAgICAgICAgICAgICAgcG9zdFdyaXRlQ2xlYW51cCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiByZW1vdmUoT2JqZWN0IGtleSwgaW50IGhhc2gsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICAgICAgbG9jaygpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBwcmVXcml0ZUNsZWFudXAoKTsKKworICAgICAgICAgICAgICAgIGludCBuZXdDb3VudCA9IHRoaXMuY291bnQgLSAxOworICAgICAgICAgICAgICAgIEF0b21pY1JlZmVyZW5jZUFycmF5PFJlZmVyZW5jZUVudHJ5PEssIFY+PiB0YWJsZSA9IHRoaXMudGFibGU7CisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gaGFzaCAmICh0YWJsZS5sZW5ndGgoKSAtIDEpOworICAgICAgICAgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IGZpcnN0ID0gdGFibGUuZ2V0KGluZGV4KTsKKworICAgICAgICAgICAgICAgIGZvciAoUmVmZXJlbmNlRW50cnk8SywgVj4gZSA9IGZpcnN0OyBlICE9IG51bGw7IGUgPSBlLmdldE5leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBLIGVudHJ5S2V5ID0gZS5nZXRLZXkoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGUuZ2V0SGFzaCgpID09IGhhc2ggJiYgZW50cnlLZXkgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1hcC5rZXlFcXVpdmFsZW5jZS5lcXVpdmFsZW50KGtleSwgZW50cnlLZXkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZVJlZmVyZW5jZTxLLCBWPiB2YWx1ZVJlZmVyZW5jZSA9IGUuZ2V0VmFsdWVSZWZlcmVuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFYgZW50cnlWYWx1ZSA9IHZhbHVlUmVmZXJlbmNlLmdldCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICBNYXBNYWtlci5SZW1vdmFsQ2F1c2UgY2F1c2U7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFwLnZhbHVlRXF1aXZhbGVuY2UuZXF1aXZhbGVudCh2YWx1ZSwgZW50cnlWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXVzZSA9IE1hcE1ha2VyLlJlbW92YWxDYXVzZS5FWFBMSUNJVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNDb2xsZWN0ZWQodmFsdWVSZWZlcmVuY2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F1c2UgPSBNYXBNYWtlci5SZW1vdmFsQ2F1c2UuQ09MTEVDVEVEOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICsrbW9kQ291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBlbnF1ZXVlTm90aWZpY2F0aW9uKGVudHJ5S2V5LCBoYXNoLCBlbnRyeVZhbHVlLCBjYXVzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXdGaXJzdCA9IHJlbW92ZUZyb21DaGFpbihmaXJzdCwgZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb3VudCA9IHRoaXMuY291bnQgLSAxOworICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUuc2V0KGluZGV4LCBuZXdGaXJzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvdW50ID0gbmV3Q291bnQ7IC8vIHdyaXRlLXZvbGF0aWxlCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGNhdXNlID09IE1hcE1ha2VyLlJlbW92YWxDYXVzZS5FWFBMSUNJVCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICAgICAgICAgIHBvc3RXcml0ZUNsZWFudXAoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgY2xlYXIoKSB7CisgICAgICAgICAgICBpZiAoY291bnQgIT0gMCkgeworICAgICAgICAgICAgICAgIGxvY2soKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBBdG9taWNSZWZlcmVuY2VBcnJheTxSZWZlcmVuY2VFbnRyeTxLLCBWPj4gdGFibGUgPSB0aGlzLnRhYmxlOworICAgICAgICAgICAgICAgICAgICBpZiAobWFwLnJlbW92YWxOb3RpZmljYXRpb25RdWV1ZSAhPSBESVNDQVJESU5HX1FVRVVFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhYmxlLmxlbmd0aCgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFJlZmVyZW5jZUVudHJ5PEssIFY+IGUgPSB0YWJsZS5nZXQoaSk7IGUgIT0gbnVsbDsgZSA9IGUuZ2V0TmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbXB1dGluZyByZWZlcmVuY2VzIGFyZW4ndCBhY3R1YWxseSBpbiB0aGUgbWFwIHlldC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlLmdldFZhbHVlUmVmZXJlbmNlKCkuaXNDb21wdXRpbmdSZWZlcmVuY2UoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5xdWV1ZU5vdGlmaWNhdGlvbihlLCBNYXBNYWtlci5SZW1vdmFsQ2F1c2UuRVhQTElDSVQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFibGUubGVuZ3RoKCk7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUuc2V0KGksIG51bGwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNsZWFyUmVmZXJlbmNlUXVldWVzKCk7CisgICAgICAgICAgICAgICAgICAgIGV2aWN0aW9uUXVldWUuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgZXhwaXJhdGlvblF1ZXVlLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIHJlYWRDb3VudC5zZXQoMCk7CisKKyAgICAgICAgICAgICAgICAgICAgKyttb2RDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgY291bnQgPSAwOyAvLyB3cml0ZS12b2xhdGlsZQorICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICAgICAgICAgICAgICBwb3N0V3JpdGVDbGVhbnVwKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlbW92ZXMgYW4gZW50cnkgZnJvbSB3aXRoaW4gYSB0YWJsZS4gQWxsIGVudHJpZXMgZm9sbG93aW5nIHRoZSByZW1vdmVkIG5vZGUgY2FuIHN0YXksIGJ1dAorICAgICAgICAgKiBhbGwgcHJlY2VkaW5nIG9uZXMgbmVlZCB0byBiZSBjbG9uZWQuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiA8cD5UaGlzIG1ldGhvZCBkb2VzIG5vdCBkZWNyZW1lbnQgY291bnQgZm9yIHRoZSByZW1vdmVkIGVudHJ5LCBidXQgZG9lcyBkZWNyZW1lbnQgY291bnQgZm9yCisgICAgICAgICAqIGFsbCBwYXJ0aWFsbHkgY29sbGVjdGVkIGVudHJpZXMgd2hpY2ggYXJlIHNraXBwZWQuIEFzIHN1Y2ggY2FsbGVycyB3aGljaCBhcmUgbW9kaWZ5aW5nIGNvdW50CisgICAgICAgICAqIG11c3QgcmUtcmVhZCBpdCBhZnRlciBjYWxsaW5nIHJlbW92ZUZyb21DaGFpbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGZpcnN0IHRoZSBmaXJzdCBlbnRyeSBvZiB0aGUgdGFibGUKKyAgICAgICAgICogQHBhcmFtIGVudHJ5IHRoZSBlbnRyeSBiZWluZyByZW1vdmVkIGZyb20gdGhlIHRhYmxlCisgICAgICAgICAqIEByZXR1cm4gdGhlIG5ldyBmaXJzdCBlbnRyeSBmb3IgdGhlIHRhYmxlCisgICAgICAgICAqLworICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiByZW1vdmVGcm9tQ2hhaW4oUmVmZXJlbmNlRW50cnk8SywgVj4gZmlyc3QsIFJlZmVyZW5jZUVudHJ5PEssIFY+IGVudHJ5KSB7CisgICAgICAgICAgICBldmljdGlvblF1ZXVlLnJlbW92ZShlbnRyeSk7CisgICAgICAgICAgICBleHBpcmF0aW9uUXVldWUucmVtb3ZlKGVudHJ5KTsKKworICAgICAgICAgICAgaW50IG5ld0NvdW50ID0gY291bnQ7CisgICAgICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXdGaXJzdCA9IGVudHJ5LmdldE5leHQoKTsKKyAgICAgICAgICAgIGZvciAoUmVmZXJlbmNlRW50cnk8SywgVj4gZSA9IGZpcnN0OyBlICE9IGVudHJ5OyBlID0gZS5nZXROZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXh0ID0gY29weUVudHJ5KGUsIG5ld0ZpcnN0KTsKKyAgICAgICAgICAgICAgICBpZiAobmV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIG5ld0ZpcnN0ID0gbmV4dDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZW1vdmVDb2xsZWN0ZWRFbnRyeShlKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3Q291bnQtLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLmNvdW50ID0gbmV3Q291bnQ7CisgICAgICAgICAgICByZXR1cm4gbmV3Rmlyc3Q7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHJlbW92ZUNvbGxlY3RlZEVudHJ5KFJlZmVyZW5jZUVudHJ5PEssIFY+IGVudHJ5KSB7CisgICAgICAgICAgICBlbnF1ZXVlTm90aWZpY2F0aW9uKGVudHJ5LCBNYXBNYWtlci5SZW1vdmFsQ2F1c2UuQ09MTEVDVEVEKTsKKyAgICAgICAgICAgIGV2aWN0aW9uUXVldWUucmVtb3ZlKGVudHJ5KTsKKyAgICAgICAgICAgIGV4cGlyYXRpb25RdWV1ZS5yZW1vdmUoZW50cnkpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlbW92ZXMgYW4gZW50cnkgd2hvc2Uga2V5IGhhcyBiZWVuIGdhcmJhZ2UgY29sbGVjdGVkLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbGVhbiByZWNsYWltS2V5KFJlZmVyZW5jZUVudHJ5PEssIFY+IGVudHJ5LCBpbnQgaGFzaCkgeworICAgICAgICAgICAgbG9jaygpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpbnQgbmV3Q291bnQgPSBjb3VudCAtIDE7CisgICAgICAgICAgICAgICAgQXRvbWljUmVmZXJlbmNlQXJyYXk8UmVmZXJlbmNlRW50cnk8SywgVj4+IHRhYmxlID0gdGhpcy50YWJsZTsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBoYXNoICYgKHRhYmxlLmxlbmd0aCgpIC0gMSk7CisgICAgICAgICAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gZmlyc3QgPSB0YWJsZS5nZXQoaW5kZXgpOworCisgICAgICAgICAgICAgICAgZm9yIChSZWZlcmVuY2VFbnRyeTxLLCBWPiBlID0gZmlyc3Q7IGUgIT0gbnVsbDsgZSA9IGUuZ2V0TmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChlID09IGVudHJ5KSB7CisgICAgICAgICAgICAgICAgICAgICAgICArK21vZENvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgZW5xdWV1ZU5vdGlmaWNhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRLZXkoKSwgaGFzaCwgZS5nZXRWYWx1ZVJlZmVyZW5jZSgpLmdldCgpLCBNYXBNYWtlci5SZW1vdmFsQ2F1c2UuQ09MTEVDVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5ld0ZpcnN0ID0gcmVtb3ZlRnJvbUNoYWluKGZpcnN0LCBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvdW50ID0gdGhpcy5jb3VudCAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5zZXQoaW5kZXgsIG5ld0ZpcnN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY291bnQgPSBuZXdDb3VudDsgLy8gd3JpdGUtdm9sYXRpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICB1bmxvY2soKTsKKyAgICAgICAgICAgICAgICBwb3N0V3JpdGVDbGVhbnVwKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVtb3ZlcyBhbiBlbnRyeSB3aG9zZSB2YWx1ZSBoYXMgYmVlbiBnYXJiYWdlIGNvbGxlY3RlZC4KKyAgICAgICAgICovCisgICAgICAgIGJvb2xlYW4gcmVjbGFpbVZhbHVlKEsga2V5LCBpbnQgaGFzaCwgVmFsdWVSZWZlcmVuY2U8SywgVj4gdmFsdWVSZWZlcmVuY2UpIHsKKyAgICAgICAgICAgIGxvY2soKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaW50IG5ld0NvdW50ID0gdGhpcy5jb3VudCAtIDE7CisgICAgICAgICAgICAgICAgQXRvbWljUmVmZXJlbmNlQXJyYXk8UmVmZXJlbmNlRW50cnk8SywgVj4+IHRhYmxlID0gdGhpcy50YWJsZTsKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBoYXNoICYgKHRhYmxlLmxlbmd0aCgpIC0gMSk7CisgICAgICAgICAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gZmlyc3QgPSB0YWJsZS5nZXQoaW5kZXgpOworCisgICAgICAgICAgICAgICAgZm9yIChSZWZlcmVuY2VFbnRyeTxLLCBWPiBlID0gZmlyc3Q7IGUgIT0gbnVsbDsgZSA9IGUuZ2V0TmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIEsgZW50cnlLZXkgPSBlLmdldEtleSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoZS5nZXRIYXNoKCkgPT0gaGFzaCAmJiBlbnRyeUtleSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbWFwLmtleUVxdWl2YWxlbmNlLmVxdWl2YWxlbnQoa2V5LCBlbnRyeUtleSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlUmVmZXJlbmNlPEssIFY+IHYgPSBlLmdldFZhbHVlUmVmZXJlbmNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodiA9PSB2YWx1ZVJlZmVyZW5jZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrbW9kQ291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5xdWV1ZU5vdGlmaWNhdGlvbihrZXksIGhhc2gsIHZhbHVlUmVmZXJlbmNlLmdldCgpLCBNYXBNYWtlci5SZW1vdmFsQ2F1c2UuQ09MTEVDVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXdGaXJzdCA9IHJlbW92ZUZyb21DaGFpbihmaXJzdCwgZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q291bnQgPSB0aGlzLmNvdW50IC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZS5zZXQoaW5kZXgsIG5ld0ZpcnN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvdW50ID0gbmV3Q291bnQ7IC8vIHdyaXRlLXZvbGF0aWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICAgICAgICAgIGlmICghaXNIZWxkQnlDdXJyZW50VGhyZWFkKCkpIHsgLy8gZG9uJ3QgY2xlYW51cCBpbnNpZGUgb2YgcHV0CisgICAgICAgICAgICAgICAgICAgIHBvc3RXcml0ZUNsZWFudXAoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIHJlbW92ZUVudHJ5KFJlZmVyZW5jZUVudHJ5PEssIFY+IGVudHJ5LCBpbnQgaGFzaCwgTWFwTWFrZXIuUmVtb3ZhbENhdXNlIGNhdXNlKSB7CisgICAgICAgICAgICBpbnQgbmV3Q291bnQgPSB0aGlzLmNvdW50IC0gMTsKKyAgICAgICAgICAgIEF0b21pY1JlZmVyZW5jZUFycmF5PFJlZmVyZW5jZUVudHJ5PEssIFY+PiB0YWJsZSA9IHRoaXMudGFibGU7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBoYXNoICYgKHRhYmxlLmxlbmd0aCgpIC0gMSk7CisgICAgICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBmaXJzdCA9IHRhYmxlLmdldChpbmRleCk7CisKKyAgICAgICAgICAgIGZvciAoUmVmZXJlbmNlRW50cnk8SywgVj4gZSA9IGZpcnN0OyBlICE9IG51bGw7IGUgPSBlLmdldE5leHQoKSkgeworICAgICAgICAgICAgICAgIGlmIChlID09IGVudHJ5KSB7CisgICAgICAgICAgICAgICAgICAgICsrbW9kQ291bnQ7CisgICAgICAgICAgICAgICAgICAgIGVucXVldWVOb3RpZmljYXRpb24oZS5nZXRLZXkoKSwgaGFzaCwgZS5nZXRWYWx1ZVJlZmVyZW5jZSgpLmdldCgpLCBjYXVzZSk7CisgICAgICAgICAgICAgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5ld0ZpcnN0ID0gcmVtb3ZlRnJvbUNoYWluKGZpcnN0LCBlKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3Q291bnQgPSB0aGlzLmNvdW50IC0gMTsKKyAgICAgICAgICAgICAgICAgICAgdGFibGUuc2V0KGluZGV4LCBuZXdGaXJzdCk7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuY291bnQgPSBuZXdDb3VudDsgLy8gd3JpdGUtdm9sYXRpbGUKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHZhbHVlIGhhcyBiZWVuIHBhcnRpYWxseSBjb2xsZWN0ZWQsIG1lYW5pbmcgdGhhdCB0aGUgdmFsdWUgaXMKKyAgICAgICAgICogbnVsbCBhbmQgaXQgaXMgbm90IGNvbXB1dGluZy4KKyAgICAgICAgICovCisgICAgICAgIGJvb2xlYW4gaXNDb2xsZWN0ZWQoVmFsdWVSZWZlcmVuY2U8SywgVj4gdmFsdWVSZWZlcmVuY2UpIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZVJlZmVyZW5jZS5pc0NvbXB1dGluZ1JlZmVyZW5jZSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICh2YWx1ZVJlZmVyZW5jZS5nZXQoKSA9PSBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHRoZSB2YWx1ZSBmcm9tIGFuIGVudHJ5LiBSZXR1cm5zIHtAY29kZSBudWxsfSBpZiB0aGUgZW50cnkgaXMgaW52YWxpZCwKKyAgICAgICAgICogcGFydGlhbGx5LWNvbGxlY3RlZCwgY29tcHV0aW5nLCBvciBleHBpcmVkLgorICAgICAgICAgKi8KKyAgICAgICAgViBnZXRMaXZlVmFsdWUoUmVmZXJlbmNlRW50cnk8SywgVj4gZW50cnkpIHsKKyAgICAgICAgICAgIGlmIChlbnRyeS5nZXRLZXkoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5RHJhaW5SZWZlcmVuY2VRdWV1ZXMoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFYgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZVJlZmVyZW5jZSgpLmdldCgpOworICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnlEcmFpblJlZmVyZW5jZVF1ZXVlcygpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobWFwLmV4cGlyZXMoKSAmJiBtYXAuaXNFeHBpcmVkKGVudHJ5KSkgeworICAgICAgICAgICAgICAgIHRyeUV4cGlyZUVudHJpZXMoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBQZXJmb3JtcyByb3V0aW5lIGNsZWFudXAgZm9sbG93aW5nIGEgcmVhZC4gTm9ybWFsbHkgY2xlYW51cCBoYXBwZW5zIGR1cmluZyB3cml0ZXMsIG9yIGZyb20KKyAgICAgICAgICogdGhlIGNsZWFudXBFeGVjdXRvci4gSWYgY2xlYW51cCBpcyBub3Qgb2JzZXJ2ZWQgYWZ0ZXIgYSBzdWZmaWNpZW50IG51bWJlciBvZiByZWFkcywgdHJ5CisgICAgICAgICAqIGNsZWFuaW5nIHVwIGZyb20gdGhlIHJlYWQgdGhyZWFkLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBwb3N0UmVhZENsZWFudXAoKSB7CisgICAgICAgICAgICBpZiAoKHJlYWRDb3VudC5pbmNyZW1lbnRBbmRHZXQoKSAmIERSQUlOX1RIUkVTSE9MRCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHJ1bkNsZWFudXAoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBQZXJmb3JtcyByb3V0aW5lIGNsZWFudXAgcHJpb3IgdG8gZXhlY3V0aW5nIGEgd3JpdGUuIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBldmVyeSB0aW1lIGEKKyAgICAgICAgICogd3JpdGUgdGhyZWFkIGFjcXVpcmVzIHRoZSBzZWdtZW50IGxvY2ssIGltbWVkaWF0ZWx5IGFmdGVyIGFjcXVpcmluZyB0aGUgbG9jay4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIDxwPlBvc3QtY29uZGl0aW9uOiBleHBpcmVFbnRyaWVzIGhhcyBiZWVuIHJ1bi4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgcHJlV3JpdGVDbGVhbnVwKCkgeworICAgICAgICAgICAgcnVuTG9ja2VkQ2xlYW51cCgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBlcmZvcm1zIHJvdXRpbmUgY2xlYW51cCBmb2xsb3dpbmcgYSB3cml0ZS4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgcG9zdFdyaXRlQ2xlYW51cCgpIHsKKyAgICAgICAgICAgIHJ1blVubG9ja2VkQ2xlYW51cCgpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBydW5DbGVhbnVwKCkgeworICAgICAgICAgICAgcnVuTG9ja2VkQ2xlYW51cCgpOworICAgICAgICAgICAgcnVuVW5sb2NrZWRDbGVhbnVwKCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHJ1bkxvY2tlZENsZWFudXAoKSB7CisgICAgICAgICAgICBpZiAodHJ5TG9jaygpKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZHJhaW5SZWZlcmVuY2VRdWV1ZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgZXhwaXJlRW50cmllcygpOyAvLyBjYWxscyBkcmFpblJlY2VuY3lRdWV1ZQorICAgICAgICAgICAgICAgICAgICByZWFkQ291bnQuc2V0KDApOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIHVubG9jaygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgcnVuVW5sb2NrZWRDbGVhbnVwKCkgeworICAgICAgICAgICAgLy8gbG9ja2VkIGNsZWFudXAgbWF5IGdlbmVyYXRlIG5vdGlmaWNhdGlvbnMgd2UgY2FuIHNlbmQgdW5sb2NrZWQKKyAgICAgICAgICAgIGlmICghaXNIZWxkQnlDdXJyZW50VGhyZWFkKCkpIHsKKyAgICAgICAgICAgICAgICBtYXAucHJvY2Vzc1BlbmRpbmdOb3RpZmljYXRpb25zKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgY3VzdG9tIHF1ZXVlIGZvciBtYW5hZ2luZyBldmljdGlvbiBvcmRlci4gTm90ZSB0aGF0IHRoaXMgaXMgdGlnaHRseSBpbnRlZ3JhdGVkIHdpdGgge0Bjb2RlCisgICAgICogUmVmZXJlbmNlRW50cnl9LCB1cG9uIHdoaWNoIGl0IHJlbGllcyB0byBwZXJmb3JtIGl0cyBsaW5raW5nLgorICAgICAqIDxwPgorICAgICAqIDxwPk5vdGUgdGhhdCB0aGlzIGVudGlyZSBpbXBsZW1lbnRhdGlvbiBtYWtlcyB0aGUgYXNzdW1wdGlvbiB0aGF0IGFsbCBlbGVtZW50cyB3aGljaCBhcmUgaW4KKyAgICAgKiB0aGUgbWFwIGFyZSBhbHNvIGluIHRoaXMgcXVldWUsIGFuZCB0aGF0IGFsbCBlbGVtZW50cyBub3QgaW4gdGhlIHF1ZXVlIGFyZSBub3QgaW4gdGhlIG1hcC4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5UaGUgYmVuZWZpdHMgb2YgY3JlYXRpbmcgb3VyIG93biBxdWV1ZSBhcmUgdGhhdCAoMSkgd2UgY2FuIHJlcGxhY2UgZWxlbWVudHMgaW4gdGhlIG1pZGRsZQorICAgICAqIG9mIHRoZSBxdWV1ZSBhcyBwYXJ0IG9mIGNvcHlFdmljdGFibGVFbnRyeSwgYW5kICgyKSB0aGUgY29udGFpbnMgbWV0aG9kIGlzIGhpZ2hseSBvcHRpbWl6ZWQKKyAgICAgKiBmb3IgdGhlIGN1cnJlbnQgbW9kZWwuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIEV2aWN0aW9uUXVldWU8SywgVj4gZXh0ZW5kcyBBYnN0cmFjdFF1ZXVlPFJlZmVyZW5jZUVudHJ5PEssIFY+PiB7CisgICAgICAgIGZpbmFsIFJlZmVyZW5jZUVudHJ5PEssIFY+IGhlYWQgPSBuZXcgQWJzdHJhY3RSZWZlcmVuY2VFbnRyeTxLLCBWPigpIHsKKworICAgICAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV4dEV2aWN0YWJsZSA9IHRoaXM7CisgICAgICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBwcmV2aW91c0V2aWN0YWJsZSA9IHRoaXM7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFJlZmVyZW5jZUVudHJ5PEssIFY+IGdldE5leHRFdmljdGFibGUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5leHRFdmljdGFibGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0TmV4dEV2aWN0YWJsZShSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXh0KSB7CisgICAgICAgICAgICAgICAgdGhpcy5uZXh0RXZpY3RhYmxlID0gbmV4dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgUmVmZXJlbmNlRW50cnk8SywgVj4gZ2V0UHJldmlvdXNFdmljdGFibGUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzRXZpY3RhYmxlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldFByZXZpb3VzRXZpY3RhYmxlKFJlZmVyZW5jZUVudHJ5PEssIFY+IHByZXZpb3VzKSB7CisgICAgICAgICAgICAgICAgdGhpcy5wcmV2aW91c0V2aWN0YWJsZSA9IHByZXZpb3VzOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIC8vIGltcGxlbWVudHMgUXVldWUKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gb2ZmZXIoUmVmZXJlbmNlRW50cnk8SywgVj4gZW50cnkpIHsKKyAgICAgICAgICAgIC8vIHVubGluaworICAgICAgICAgICAgY29ubmVjdEV2aWN0YWJsZXMoZW50cnkuZ2V0UHJldmlvdXNFdmljdGFibGUoKSwgZW50cnkuZ2V0TmV4dEV2aWN0YWJsZSgpKTsKKworICAgICAgICAgICAgLy8gYWRkIHRvIHRhaWwKKyAgICAgICAgICAgIGNvbm5lY3RFdmljdGFibGVzKGhlYWQuZ2V0UHJldmlvdXNFdmljdGFibGUoKSwgZW50cnkpOworICAgICAgICAgICAgY29ubmVjdEV2aWN0YWJsZXMoZW50cnksIGhlYWQpOworCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVmZXJlbmNlRW50cnk8SywgVj4gcGVlaygpIHsKKyAgICAgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5leHQgPSBoZWFkLmdldE5leHRFdmljdGFibGUoKTsKKyAgICAgICAgICAgIHJldHVybiAobmV4dCA9PSBoZWFkKSA/IG51bGwgOiBuZXh0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZWZlcmVuY2VFbnRyeTxLLCBWPiBwb2xsKCkgeworICAgICAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV4dCA9IGhlYWQuZ2V0TmV4dEV2aWN0YWJsZSgpOworICAgICAgICAgICAgaWYgKG5leHQgPT0gaGVhZCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZW1vdmUobmV4dCk7CisgICAgICAgICAgICByZXR1cm4gbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7CisgICAgICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBlID0gKFJlZmVyZW5jZUVudHJ5KSBvOworICAgICAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gcHJldmlvdXMgPSBlLmdldFByZXZpb3VzRXZpY3RhYmxlKCk7CisgICAgICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXh0ID0gZS5nZXROZXh0RXZpY3RhYmxlKCk7CisgICAgICAgICAgICBjb25uZWN0RXZpY3RhYmxlcyhwcmV2aW91cywgbmV4dCk7CisgICAgICAgICAgICBudWxsaWZ5RXZpY3RhYmxlKGUpOworCisgICAgICAgICAgICByZXR1cm4gbmV4dCAhPSBOdWxsRW50cnkuSU5TVEFOQ0U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7CisgICAgICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBlID0gKFJlZmVyZW5jZUVudHJ5KSBvOworICAgICAgICAgICAgcmV0dXJuIGUuZ2V0TmV4dEV2aWN0YWJsZSgpICE9IE51bGxFbnRyeS5JTlNUQU5DRTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgeworICAgICAgICAgICAgcmV0dXJuIGhlYWQuZ2V0TmV4dEV2aWN0YWJsZSgpID09IGhlYWQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICAgICAgaW50IHNpemUgPSAwOworICAgICAgICAgICAgZm9yIChSZWZlcmVuY2VFbnRyeTxLLCBWPiBlID0gaGVhZC5nZXROZXh0RXZpY3RhYmxlKCk7IGUgIT0gaGVhZDsgZSA9IGUuZ2V0TmV4dEV2aWN0YWJsZSgpKSB7CisgICAgICAgICAgICAgICAgc2l6ZSsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHNpemU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBlID0gaGVhZC5nZXROZXh0RXZpY3RhYmxlKCk7CisgICAgICAgICAgICB3aGlsZSAoZSAhPSBoZWFkKSB7CisgICAgICAgICAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV4dCA9IGUuZ2V0TmV4dEV2aWN0YWJsZSgpOworICAgICAgICAgICAgICAgIG51bGxpZnlFdmljdGFibGUoZSk7CisgICAgICAgICAgICAgICAgZSA9IG5leHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGhlYWQuc2V0TmV4dEV2aWN0YWJsZShoZWFkKTsKKyAgICAgICAgICAgIGhlYWQuc2V0UHJldmlvdXNFdmljdGFibGUoaGVhZCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEl0ZXJhdG9yPFJlZmVyZW5jZUVudHJ5PEssIFY+PiBpdGVyYXRvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQWJzdHJhY3RTZXF1ZW50aWFsSXRlcmF0b3I8UmVmZXJlbmNlRW50cnk8SywgVj4+KHBlZWsoKSkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHByb3RlY3RlZCBSZWZlcmVuY2VFbnRyeTxLLCBWPiBjb21wdXRlTmV4dChSZWZlcmVuY2VFbnRyeTxLLCBWPiBwcmV2aW91cykgeworICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXh0ID0gcHJldmlvdXMuZ2V0TmV4dEV2aWN0YWJsZSgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG5leHQgPT0gaGVhZCkgPyBudWxsIDogbmV4dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgfQorCisgICAgLy8gSXRlcmF0b3IgU3VwcG9ydAorCisgICAgLyoqCisgICAgICogQSBjdXN0b20gcXVldWUgZm9yIG1hbmFnaW5nIGV4cGlyYXRpb24gb3JkZXIuIE5vdGUgdGhhdCB0aGlzIGlzIHRpZ2h0bHkgaW50ZWdyYXRlZCB3aXRoCisgICAgICoge0Bjb2RlIFJlZmVyZW5jZUVudHJ5fSwgdXBvbiB3aGljaCBpdCByZWxpZXNlIHRvIHBlcmZvcm0gaXRzIGxpbmtpbmcuCisgICAgICogPHA+CisgICAgICogPHA+Tm90ZSB0aGF0IHRoaXMgZW50aXJlIGltcGxlbWVudGF0aW9uIG1ha2VzIHRoZSBhc3N1bXB0aW9uIHRoYXQgYWxsIGVsZW1lbnRzIHdoaWNoIGFyZSBpbgorICAgICAqIHRoZSBtYXAgYXJlIGFsc28gaW4gdGhpcyBxdWV1ZSwgYW5kIHRoYXQgYWxsIGVsZW1lbnRzIG5vdCBpbiB0aGUgcXVldWUgYXJlIG5vdCBpbiB0aGUgbWFwLgorICAgICAqIDxwPgorICAgICAqIDxwPlRoZSBiZW5lZml0cyBvZiBjcmVhdGluZyBvdXIgb3duIHF1ZXVlIGFyZSB0aGF0ICgxKSB3ZSBjYW4gcmVwbGFjZSBlbGVtZW50cyBpbiB0aGUgbWlkZGxlCisgICAgICogb2YgdGhlIHF1ZXVlIGFzIHBhcnQgb2YgY29weUV2aWN0YWJsZUVudHJ5LCBhbmQgKDIpIHRoZSBjb250YWlucyBtZXRob2QgaXMgaGlnaGx5IG9wdGltaXplZAorICAgICAqIGZvciB0aGUgY3VycmVudCBtb2RlbC4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgRXhwaXJhdGlvblF1ZXVlPEssIFY+IGV4dGVuZHMgQWJzdHJhY3RRdWV1ZTxSZWZlcmVuY2VFbnRyeTxLLCBWPj4geworICAgICAgICBmaW5hbCBSZWZlcmVuY2VFbnRyeTxLLCBWPiBoZWFkID0gbmV3IEFic3RyYWN0UmVmZXJlbmNlRW50cnk8SywgVj4oKSB7CisKKyAgICAgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5leHRFeHBpcmFibGUgPSB0aGlzOworICAgICAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gcHJldmlvdXNFeHBpcmFibGUgPSB0aGlzOworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBsb25nIGdldEV4cGlyYXRpb25UaW1lKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBMb25nLk1BWF9WQUxVRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRFeHBpcmF0aW9uVGltZShsb25nIHRpbWUpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgUmVmZXJlbmNlRW50cnk8SywgVj4gZ2V0TmV4dEV4cGlyYWJsZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV4dEV4cGlyYWJsZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXROZXh0RXhwaXJhYmxlKFJlZmVyZW5jZUVudHJ5PEssIFY+IG5leHQpIHsKKyAgICAgICAgICAgICAgICB0aGlzLm5leHRFeHBpcmFibGUgPSBuZXh0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBSZWZlcmVuY2VFbnRyeTxLLCBWPiBnZXRQcmV2aW91c0V4cGlyYWJsZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcHJldmlvdXNFeHBpcmFibGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0UHJldmlvdXNFeHBpcmFibGUoUmVmZXJlbmNlRW50cnk8SywgVj4gcHJldmlvdXMpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnByZXZpb3VzRXhwaXJhYmxlID0gcHJldmlvdXM7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgLy8gaW1wbGVtZW50cyBRdWV1ZQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBvZmZlcihSZWZlcmVuY2VFbnRyeTxLLCBWPiBlbnRyeSkgeworICAgICAgICAgICAgLy8gdW5saW5rCisgICAgICAgICAgICBjb25uZWN0RXhwaXJhYmxlcyhlbnRyeS5nZXRQcmV2aW91c0V4cGlyYWJsZSgpLCBlbnRyeS5nZXROZXh0RXhwaXJhYmxlKCkpOworCisgICAgICAgICAgICAvLyBhZGQgdG8gdGFpbAorICAgICAgICAgICAgY29ubmVjdEV4cGlyYWJsZXMoaGVhZC5nZXRQcmV2aW91c0V4cGlyYWJsZSgpLCBlbnRyeSk7CisgICAgICAgICAgICBjb25uZWN0RXhwaXJhYmxlcyhlbnRyeSwgaGVhZCk7CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZWZlcmVuY2VFbnRyeTxLLCBWPiBwZWVrKCkgeworICAgICAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV4dCA9IGhlYWQuZ2V0TmV4dEV4cGlyYWJsZSgpOworICAgICAgICAgICAgcmV0dXJuIChuZXh0ID09IGhlYWQpID8gbnVsbCA6IG5leHQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlZmVyZW5jZUVudHJ5PEssIFY+IHBvbGwoKSB7CisgICAgICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXh0ID0gaGVhZC5nZXROZXh0RXhwaXJhYmxlKCk7CisgICAgICAgICAgICBpZiAobmV4dCA9PSBoZWFkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlbW92ZShuZXh0KTsKKyAgICAgICAgICAgIHJldHVybiBuZXh0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IGUgPSAoUmVmZXJlbmNlRW50cnkpIG87CisgICAgICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBwcmV2aW91cyA9IGUuZ2V0UHJldmlvdXNFeHBpcmFibGUoKTsKKyAgICAgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5leHQgPSBlLmdldE5leHRFeHBpcmFibGUoKTsKKyAgICAgICAgICAgIGNvbm5lY3RFeHBpcmFibGVzKHByZXZpb3VzLCBuZXh0KTsKKyAgICAgICAgICAgIG51bGxpZnlFeHBpcmFibGUoZSk7CisKKyAgICAgICAgICAgIHJldHVybiBuZXh0ICE9IE51bGxFbnRyeS5JTlNUQU5DRTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IGUgPSAoUmVmZXJlbmNlRW50cnkpIG87CisgICAgICAgICAgICByZXR1cm4gZS5nZXROZXh0RXhwaXJhYmxlKCkgIT0gTnVsbEVudHJ5LklOU1RBTkNFOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgICAgICAgICByZXR1cm4gaGVhZC5nZXROZXh0RXhwaXJhYmxlKCkgPT0gaGVhZDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgICAgICBpbnQgc2l6ZSA9IDA7CisgICAgICAgICAgICBmb3IgKFJlZmVyZW5jZUVudHJ5PEssIFY+IGUgPSBoZWFkLmdldE5leHRFeHBpcmFibGUoKTsgZSAhPSBoZWFkOyBlID0gZS5nZXROZXh0RXhwaXJhYmxlKCkpIHsKKyAgICAgICAgICAgICAgICBzaXplKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IGUgPSBoZWFkLmdldE5leHRFeHBpcmFibGUoKTsKKyAgICAgICAgICAgIHdoaWxlIChlICE9IGhlYWQpIHsKKyAgICAgICAgICAgICAgICBSZWZlcmVuY2VFbnRyeTxLLCBWPiBuZXh0ID0gZS5nZXROZXh0RXhwaXJhYmxlKCk7CisgICAgICAgICAgICAgICAgbnVsbGlmeUV4cGlyYWJsZShlKTsKKyAgICAgICAgICAgICAgICBlID0gbmV4dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaGVhZC5zZXROZXh0RXhwaXJhYmxlKGhlYWQpOworICAgICAgICAgICAgaGVhZC5zZXRQcmV2aW91c0V4cGlyYWJsZShoZWFkKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSXRlcmF0b3I8UmVmZXJlbmNlRW50cnk8SywgVj4+IGl0ZXJhdG9yKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBBYnN0cmFjdFNlcXVlbnRpYWxJdGVyYXRvcjxSZWZlcmVuY2VFbnRyeTxLLCBWPj4ocGVlaygpKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHJvdGVjdGVkIFJlZmVyZW5jZUVudHJ5PEssIFY+IGNvbXB1dGVOZXh0KFJlZmVyZW5jZUVudHJ5PEssIFY+IHByZXZpb3VzKSB7CisgICAgICAgICAgICAgICAgICAgIFJlZmVyZW5jZUVudHJ5PEssIFY+IG5leHQgPSBwcmV2aW91cy5nZXROZXh0RXhwaXJhYmxlKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAobmV4dCA9PSBoZWFkKSA/IG51bGwgOiBuZXh0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhYnN0cmFjdCBjbGFzcyBIYXNoSXRlcmF0b3I8RT4gaW1wbGVtZW50cyBJdGVyYXRvcjxFPiB7CisKKyAgICAgICAgaW50IG5leHRTZWdtZW50SW5kZXg7CisgICAgICAgIGludCBuZXh0VGFibGVJbmRleDsKKyAgICAgICAgU2VnbWVudDxLLCBWPiBjdXJyZW50U2VnbWVudDsKKyAgICAgICAgQXRvbWljUmVmZXJlbmNlQXJyYXk8UmVmZXJlbmNlRW50cnk8SywgVj4+IGN1cnJlbnRUYWJsZTsKKyAgICAgICAgUmVmZXJlbmNlRW50cnk8SywgVj4gbmV4dEVudHJ5OworICAgICAgICBXcml0ZVRocm91Z2hFbnRyeSBuZXh0RXh0ZXJuYWw7CisgICAgICAgIFdyaXRlVGhyb3VnaEVudHJ5IGxhc3RSZXR1cm5lZDsKKworICAgICAgICBIYXNoSXRlcmF0b3IoKSB7CisgICAgICAgICAgICBuZXh0U2VnbWVudEluZGV4ID0gc2VnbWVudHMubGVuZ3RoIC0gMTsKKyAgICAgICAgICAgIG5leHRUYWJsZUluZGV4ID0gLTE7CisgICAgICAgICAgICBhZHZhbmNlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGFic3RyYWN0IEUgbmV4dCgpOworCisgICAgICAgIGZpbmFsIHZvaWQgYWR2YW5jZSgpIHsKKyAgICAgICAgICAgIG5leHRFeHRlcm5hbCA9IG51bGw7CisKKyAgICAgICAgICAgIGlmIChuZXh0SW5DaGFpbigpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobmV4dEluVGFibGUoKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd2hpbGUgKG5leHRTZWdtZW50SW5kZXggPj0gMCkgeworICAgICAgICAgICAgICAgIGN1cnJlbnRTZWdtZW50ID0gc2VnbWVudHNbbmV4dFNlZ21lbnRJbmRleC0tXTsKKyAgICAgICAgICAgICAgICBpZiAoY3VycmVudFNlZ21lbnQuY291bnQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGFibGUgPSBjdXJyZW50U2VnbWVudC50YWJsZTsKKyAgICAgICAgICAgICAgICAgICAgbmV4dFRhYmxlSW5kZXggPSBjdXJyZW50VGFibGUubGVuZ3RoKCkgLSAxOworICAgICAgICAgICAgICAgICAgICBpZiAobmV4dEluVGFibGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZpbmRzIHRoZSBuZXh0IGVudHJ5IGluIHRoZSBjdXJyZW50IGNoYWluLiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiBhbiBlbnRyeSB3YXMgZm91bmQuCisgICAgICAgICAqLworICAgICAgICBib29sZWFuIG5leHRJbkNoYWluKCkgeworICAgICAgICAgICAgaWYgKG5leHRFbnRyeSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChuZXh0RW50cnkgPSBuZXh0RW50cnkuZ2V0TmV4dCgpOyBuZXh0RW50cnkgIT0gbnVsbDsgbmV4dEVudHJ5ID0gbmV4dEVudHJ5LmdldE5leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYWR2YW5jZVRvKG5leHRFbnRyeSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZpbmRzIHRoZSBuZXh0IGVudHJ5IGluIHRoZSBjdXJyZW50IHRhYmxlLiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiBhbiBlbnRyeSB3YXMgZm91bmQuCisgICAgICAgICAqLworICAgICAgICBib29sZWFuIG5leHRJblRhYmxlKCkgeworICAgICAgICAgICAgd2hpbGUgKG5leHRUYWJsZUluZGV4ID49IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoKG5leHRFbnRyeSA9IGN1cnJlbnRUYWJsZS5nZXQobmV4dFRhYmxlSW5kZXgtLSkpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFkdmFuY2VUbyhuZXh0RW50cnkpIHx8IG5leHRJbkNoYWluKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkdmFuY2VzIHRvIHRoZSBnaXZlbiBlbnRyeS4gUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGVudHJ5IHdhcyB2YWxpZCwge0Bjb2RlIGZhbHNlfSBpZiBpdAorICAgICAgICAgKiBzaG91bGQgYmUgc2tpcHBlZC4KKyAgICAgICAgICovCisgICAgICAgIGJvb2xlYW4gYWR2YW5jZVRvKFJlZmVyZW5jZUVudHJ5PEssIFY+IGVudHJ5KSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEsga2V5ID0gZW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICAgICAgViB2YWx1ZSA9IGdldExpdmVWYWx1ZShlbnRyeSk7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV4dEV4dGVybmFsID0gbmV3IFdyaXRlVGhyb3VnaEVudHJ5KGtleSwgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIHN0YWxlIGVudHJ5LgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBjdXJyZW50U2VnbWVudC5wb3N0UmVhZENsZWFudXAoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5leHRFeHRlcm5hbCAhPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgV3JpdGVUaHJvdWdoRW50cnkgbmV4dEVudHJ5KCkgeworICAgICAgICAgICAgaWYgKG5leHRFeHRlcm5hbCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxhc3RSZXR1cm5lZCA9IG5leHRFeHRlcm5hbDsKKyAgICAgICAgICAgIGFkdmFuY2UoKTsKKyAgICAgICAgICAgIHJldHVybiBsYXN0UmV0dXJuZWQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeworICAgICAgICAgICAgQ29sbGVjdFByZWNvbmRpdGlvbnMuY2hlY2tSZW1vdmUobGFzdFJldHVybmVkICE9IG51bGwpOworICAgICAgICAgICAgTWFwTWFrZXJJbnRlcm5hbE1hcC50aGlzLnJlbW92ZShsYXN0UmV0dXJuZWQuZ2V0S2V5KCkpOworICAgICAgICAgICAgbGFzdFJldHVybmVkID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZpbmFsIGNsYXNzIEtleUl0ZXJhdG9yIGV4dGVuZHMgSGFzaEl0ZXJhdG9yPEs+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEsgbmV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXh0RW50cnkoKS5nZXRLZXkoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZpbmFsIGNsYXNzIFZhbHVlSXRlcmF0b3IgZXh0ZW5kcyBIYXNoSXRlcmF0b3I8Vj4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgViBuZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5leHRFbnRyeSgpLmdldFZhbHVlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDdXN0b20gRW50cnkgY2xhc3MgdXNlZCBieSBFbnRyeUl0ZXJhdG9yLm5leHQoKSwgdGhhdCByZWxheXMgc2V0VmFsdWUgY2hhbmdlcyB0byB0aGUKKyAgICAgKiB1bmRlcmx5aW5nIG1hcC4KKyAgICAgKi8KKyAgICBmaW5hbCBjbGFzcyBXcml0ZVRocm91Z2hFbnRyeSBleHRlbmRzIEFic3RyYWN0TWFwRW50cnk8SywgVj4geworICAgICAgICBmaW5hbCBLIGtleTsgLy8gbm9uLW51bGwKKyAgICAgICAgViB2YWx1ZTsgLy8gbm9uLW51bGwKKworICAgICAgICBXcml0ZVRocm91Z2hFbnRyeShLIGtleSwgViB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy5rZXkgPSBrZXk7CisgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEsgZ2V0S2V5KCkgeworICAgICAgICAgICAgcmV0dXJuIGtleTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgViBnZXRWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgeworICAgICAgICAgICAgLy8gQ2Fubm90IHVzZSBrZXkgYW5kIHZhbHVlIGVxdWl2YWxlbmNlCisgICAgICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgRW50cnkpIHsKKyAgICAgICAgICAgICAgICBFbnRyeTw/LCA/PiB0aGF0ID0gKEVudHJ5PD8sID8+KSBvYmplY3Q7CisgICAgICAgICAgICAgICAgcmV0dXJuIGtleS5lcXVhbHModGhhdC5nZXRLZXkoKSkgJiYgdmFsdWUuZXF1YWxzKHRoYXQuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIC8vIENhbm5vdCB1c2Uga2V5IGFuZCB2YWx1ZSBlcXVpdmFsZW5jZQorICAgICAgICAgICAgcmV0dXJuIGtleS5oYXNoQ29kZSgpIF4gdmFsdWUuaGFzaENvZGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgViBzZXRWYWx1ZShWIG5ld1ZhbHVlKSB7CisgICAgICAgICAgICBWIG9sZFZhbHVlID0gcHV0KGtleSwgbmV3VmFsdWUpOworICAgICAgICAgICAgdmFsdWUgPSBuZXdWYWx1ZTsgLy8gb25seSBpZiBwdXQgc3VjY2VlZHMKKyAgICAgICAgICAgIHJldHVybiBvbGRWYWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZpbmFsIGNsYXNzIEVudHJ5SXRlcmF0b3IgZXh0ZW5kcyBIYXNoSXRlcmF0b3I8RW50cnk8SywgVj4+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEVudHJ5PEssIFY+IG5leHQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV4dEVudHJ5KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIEtleVNldCBleHRlbmRzIEFic3RyYWN0U2V0PEs+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEl0ZXJhdG9yPEs+IGl0ZXJhdG9yKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBLZXlJdGVyYXRvcigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBNYXBNYWtlckludGVybmFsTWFwLnRoaXMuc2l6ZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgICAgICAgICByZXR1cm4gTWFwTWFrZXJJbnRlcm5hbE1hcC50aGlzLmlzRW1wdHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgeworICAgICAgICAgICAgcmV0dXJuIE1hcE1ha2VySW50ZXJuYWxNYXAudGhpcy5jb250YWluc0tleShvKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIHJldHVybiBNYXBNYWtlckludGVybmFsTWFwLnRoaXMucmVtb3ZlKG8pICE9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgICAgICBNYXBNYWtlckludGVybmFsTWFwLnRoaXMuY2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgY2xhc3MgVmFsdWVzIGV4dGVuZHMgQWJzdHJhY3RDb2xsZWN0aW9uPFY+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEl0ZXJhdG9yPFY+IGl0ZXJhdG9yKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZUl0ZXJhdG9yKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICAgICAgcmV0dXJuIE1hcE1ha2VySW50ZXJuYWxNYXAudGhpcy5zaXplKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKyAgICAgICAgICAgIHJldHVybiBNYXBNYWtlckludGVybmFsTWFwLnRoaXMuaXNFbXB0eSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7CisgICAgICAgICAgICByZXR1cm4gTWFwTWFrZXJJbnRlcm5hbE1hcC50aGlzLmNvbnRhaW5zVmFsdWUobyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgICAgICBNYXBNYWtlckludGVybmFsTWFwLnRoaXMuY2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFNlcmlhbGl6YXRpb24gU3VwcG9ydAorCisgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBFbnRyeVNldCBleHRlbmRzIEFic3RyYWN0U2V0PEVudHJ5PEssIFY+PiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBJdGVyYXRvcjxFbnRyeTxLLCBWPj4gaXRlcmF0b3IoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEVudHJ5SXRlcmF0b3IoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgeworICAgICAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIEVudHJ5KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEVudHJ5PD8sID8+IGUgPSAoRW50cnk8PywgPz4pIG87CisgICAgICAgICAgICBPYmplY3Qga2V5ID0gZS5nZXRLZXkoKTsKKyAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFYgdiA9IE1hcE1ha2VySW50ZXJuYWxNYXAudGhpcy5nZXQoa2V5KTsKKworICAgICAgICAgICAgcmV0dXJuIHYgIT0gbnVsbCAmJiB2YWx1ZUVxdWl2YWxlbmNlLmVxdWl2YWxlbnQoZS5nZXRWYWx1ZSgpLCB2KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBFbnRyeSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFbnRyeTw/LCA/PiBlID0gKEVudHJ5PD8sID8+KSBvOworICAgICAgICAgICAgT2JqZWN0IGtleSA9IGUuZ2V0S2V5KCk7CisgICAgICAgICAgICByZXR1cm4ga2V5ICE9IG51bGwgJiYgTWFwTWFrZXJJbnRlcm5hbE1hcC50aGlzLnJlbW92ZShrZXksIGUuZ2V0VmFsdWUoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICAgICAgcmV0dXJuIE1hcE1ha2VySW50ZXJuYWxNYXAudGhpcy5zaXplKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKyAgICAgICAgICAgIHJldHVybiBNYXBNYWtlckludGVybmFsTWFwLnRoaXMuaXNFbXB0eSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICAgICAgTWFwTWFrZXJJbnRlcm5hbE1hcC50aGlzLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvTWFwcy5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9NYXBzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJmNmVkMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvTWFwcy5qYXZhCkBAIC0wLDAgKzEsNTc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBHdWF2YSBBdXRob3JzCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhOworCitpbXBvcnQgamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RNYXA7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRNYXA7CitpbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhLkpvaW5lci5NYXBKb2luZXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmEuUHJlY29uZGl0aW9ucy5jaGVja0FyZ3VtZW50OworaW1wb3J0IHN0YXRpYyBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmEuUHJlZGljYXRlcy5jb21wb3NlOworCisvKioKKyAqIFN0YXRpYyB1dGlsaXR5IG1ldGhvZHMgcGVydGFpbmluZyB0byB7QGxpbmsgTWFwfSBpbnN0YW5jZXMgKGluY2x1ZGluZyBpbnN0YW5jZXMgb2YKKyAqIHtAbGluayBTb3J0ZWRNYXB9LCB7QGxpbmsgQmlNYXB9LCBldGMuKS4gQWxzbyBzZWUgdGhpcyBjbGFzcydzIGNvdW50ZXJwYXJ0cworICoge0BsaW5rIExpc3RzfSwge0BsaW5rIFNldHN9IGFuZCB7QGxpbmsgUXVldWVzfS4KKyAqIDxwPgorICogPHA+U2VlIHRoZSBHdWF2YSBVc2VyIEd1aWRlIGFydGljbGUgb24gPGEgaHJlZj0KKyAqICJodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ3VhdmEtbGlicmFyaWVzL3dpa2kvQ29sbGVjdGlvblV0aWxpdGllc0V4cGxhaW5lZCNNYXBzIj4KKyAqIHtAY29kZSBNYXBzfTwvYT4uCisgKgorICogQGF1dGhvciBLZXZpbiBCb3VycmlsbGlvbgorICogQGF1dGhvciBNaWtlIEJvc3RvY2sKKyAqIEBhdXRob3IgSXNhYWMgU2h1bQorICogQGF1dGhvciBMb3VpcyBXYXNzZXJtYW4KKyAqIEBzaW5jZSAyLjAgKGltcG9ydGVkIGZyb20gR29vZ2xlIENvbGxlY3Rpb25zIExpYnJhcnkpCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBNYXBzIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXBKb2luZXIgU1RBTkRBUkRfSk9JTkVSID0KKyAgICAgICAgICAgIENvbGxlY3Rpb25zMi5TVEFOREFSRF9KT0lORVIud2l0aEtleVZhbHVlU2VwYXJhdG9yKCk7CisKKyAgICBwcml2YXRlIE1hcHMoKSB7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHJpdmF0ZSBzdGF0aWMgPEs+IEZ1bmN0aW9uPEVudHJ5PEssID8+LCBLPiBrZXlGdW5jdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIChGdW5jdGlvbikgRW50cnlGdW5jdGlvbi5LRVk7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHJpdmF0ZSBzdGF0aWMgPFY+IEZ1bmN0aW9uPEVudHJ5PD8sIFY+LCBWPiB2YWx1ZUZ1bmN0aW9uKCkgeworICAgICAgICByZXR1cm4gKEZ1bmN0aW9uKSBFbnRyeUZ1bmN0aW9uLlZBTFVFOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIDxLLCBWPiBJdGVyYXRvcjxLPiBrZXlJdGVyYXRvcihJdGVyYXRvcjxFbnRyeTxLLCBWPj4gZW50cnlJdGVyYXRvcikgeworICAgICAgICByZXR1cm4gSXRlcmF0b3JzLnRyYW5zZm9ybShlbnRyeUl0ZXJhdG9yLCBNYXBzLmtleUZ1bmN0aW9uKCkpOworICAgIH0KKworICAgIHN0YXRpYyA8SywgVj4gSXRlcmF0b3I8Vj4gdmFsdWVJdGVyYXRvcihJdGVyYXRvcjxFbnRyeTxLLCBWPj4gZW50cnlJdGVyYXRvcikgeworICAgICAgICByZXR1cm4gSXRlcmF0b3JzLnRyYW5zZm9ybShlbnRyeUl0ZXJhdG9yLCBNYXBzLnZhbHVlRnVuY3Rpb24oKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHtAY29kZSBIYXNoTWFwfSBpbnN0YW5jZSwgd2l0aCBhIGhpZ2ggZW5vdWdoICJpbml0aWFsIGNhcGFjaXR5IgorICAgICAqIHRoYXQgaXQgPGk+c2hvdWxkPC9pPiBob2xkIHtAY29kZSBleHBlY3RlZFNpemV9IGVsZW1lbnRzIHdpdGhvdXQgZ3Jvd3RoLgorICAgICAqIFRoaXMgYmVoYXZpb3IgY2Fubm90IGJlIGJyb2FkbHkgZ3VhcmFudGVlZCwgYnV0IGl0IGlzIG9ic2VydmVkIHRvIGJlIHRydWUKKyAgICAgKiBmb3IgT3BlbkpESyAxLjYuIEl0IGFsc28gY2FuJ3QgYmUgZ3VhcmFudGVlZCB0aGF0IHRoZSBtZXRob2QgaXNuJ3QKKyAgICAgKiBpbmFkdmVydGVudGx5IDxpPm92ZXJzaXppbmc8L2k+IHRoZSByZXR1cm5lZCBtYXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXhwZWN0ZWRTaXplIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgeW91IGV4cGVjdCB0byBhZGQgdG8gdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgICByZXR1cm5lZCBtYXAKKyAgICAgKiBAcmV0dXJuIGEgbmV3LCBlbXB0eSB7QGNvZGUgSGFzaE1hcH0gd2l0aCBlbm91Z2ggY2FwYWNpdHkgdG8gaG9sZCB7QGNvZGUKKyAgICAgKiBleHBlY3RlZFNpemV9IGVsZW1lbnRzIHdpdGhvdXQgcmVzaXppbmcKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB7QGNvZGUgZXhwZWN0ZWRTaXplfSBpcyBuZWdhdGl2ZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPEssIFY+IEhhc2hNYXA8SywgVj4gbmV3SGFzaE1hcFdpdGhFeHBlY3RlZFNpemUoCisgICAgICAgICAgICBpbnQgZXhwZWN0ZWRTaXplKSB7CisgICAgICAgIHJldHVybiBuZXcgSGFzaE1hcDxLLCBWPihjYXBhY2l0eShleHBlY3RlZFNpemUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgY2FwYWNpdHkgdGhhdCBpcyBzdWZmaWNpZW50IHRvIGtlZXAgdGhlIG1hcCBmcm9tIGJlaW5nIHJlc2l6ZWQgYXMKKyAgICAgKiBsb25nIGFzIGl0IGdyb3dzIG5vIGxhcmdlciB0aGFuIGV4cGVjdGVkU2l6ZSBhbmQgdGhlIGxvYWQgZmFjdG9yIGlzID49IGl0cworICAgICAqIGRlZmF1bHQgKDAuNzUpLgorICAgICAqLworICAgIHN0YXRpYyBpbnQgY2FwYWNpdHkoaW50IGV4cGVjdGVkU2l6ZSkgeworICAgICAgICBpZiAoZXhwZWN0ZWRTaXplIDwgMykgeworICAgICAgICAgICAgQ29sbGVjdFByZWNvbmRpdGlvbnMuY2hlY2tOb25uZWdhdGl2ZShleHBlY3RlZFNpemUsICJleHBlY3RlZFNpemUiKTsKKyAgICAgICAgICAgIHJldHVybiBleHBlY3RlZFNpemUgKyAxOworICAgICAgICB9CisgICAgICAgIGlmIChleHBlY3RlZFNpemUgPCBJbnRzLk1BWF9QT1dFUl9PRl9UV08pIHsKKyAgICAgICAgICAgIHJldHVybiBleHBlY3RlZFNpemUgKyBleHBlY3RlZFNpemUgLyAzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsgLy8gYW55IGxhcmdlIHZhbHVlCisgICAgfQorCisgICAgc3RhdGljIDxLLCBWPiBJdGVyYXRvcjxFbnRyeTxLLCBWPj4gYXNNYXBFbnRyeUl0ZXJhdG9yKAorICAgICAgICAgICAgU2V0PEs+IHNldCwgZmluYWwgRnVuY3Rpb248PyBzdXBlciBLLCBWPiBmdW5jdGlvbikgeworICAgICAgICByZXR1cm4gbmV3IFRyYW5zZm9ybWVkSXRlcmF0b3I8SywgRW50cnk8SywgVj4+KHNldC5pdGVyYXRvcigpKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIEVudHJ5PEssIFY+IHRyYW5zZm9ybShmaW5hbCBLIGtleSkgeworICAgICAgICAgICAgICAgIHJldHVybiBpbW11dGFibGVFbnRyeShrZXksIGZ1bmN0aW9uLmFwcGx5KGtleSkpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIDxFPiBTZXQ8RT4gcmVtb3ZlT25seVNldChmaW5hbCBTZXQ8RT4gc2V0KSB7CisgICAgICAgIHJldHVybiBuZXcgRm9yd2FyZGluZ1NldDxFPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIFNldDxFPiBkZWxlZ2F0ZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGFkZChFIGVsZW1lbnQpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gZXMpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyA8RT4gU29ydGVkU2V0PEU+IHJlbW92ZU9ubHlTb3J0ZWRTZXQoZmluYWwgU29ydGVkU2V0PEU+IHNldCkgeworICAgICAgICByZXR1cm4gbmV3IEZvcndhcmRpbmdTb3J0ZWRTZXQ8RT4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBTb3J0ZWRTZXQ8RT4gZGVsZWdhdGUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNldDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhZGQoRSBlbGVtZW50KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGVzKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFNvcnRlZFNldDxFPiBoZWFkU2V0KEUgdG9FbGVtZW50KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlbW92ZU9ubHlTb3J0ZWRTZXQoc3VwZXIuaGVhZFNldCh0b0VsZW1lbnQpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU29ydGVkU2V0PEU+IHN1YlNldChFIGZyb21FbGVtZW50LCBFIHRvRWxlbWVudCkgeworICAgICAgICAgICAgICAgIHJldHVybiByZW1vdmVPbmx5U29ydGVkU2V0KHN1cGVyLnN1YlNldChmcm9tRWxlbWVudCwgdG9FbGVtZW50KSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFNvcnRlZFNldDxFPiB0YWlsU2V0KEUgZnJvbUVsZW1lbnQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVtb3ZlT25seVNvcnRlZFNldChzdXBlci50YWlsU2V0KGZyb21FbGVtZW50KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBpbW11dGFibGUgbWFwIGVudHJ5IHdpdGggdGhlIHNwZWNpZmllZCBrZXkgYW5kIHZhbHVlLiBUaGUge0BsaW5rCisgICAgICogRW50cnkjc2V0VmFsdWV9IG9wZXJhdGlvbiB0aHJvd3MgYW4ge0BsaW5rIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufS4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5UaGUgcmV0dXJuZWQgZW50cnkgaXMgc2VyaWFsaXphYmxlLgorICAgICAqCisgICAgICogQHBhcmFtIGtleSAgIHRoZSBrZXkgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXR1cm5lZCBlbnRyeQorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXR1cm5lZCBlbnRyeQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPEssIFY+IEVudHJ5PEssIFY+IGltbXV0YWJsZUVudHJ5KAorICAgICAgICAgICAgSyBrZXksIFYgdmFsdWUpIHsKKworCisgICAgICAgIHJldHVybiBuZXcgSW1tdXRhYmxlRW50cnk8SywgVj4oa2V5LCB2YWx1ZSk7CisgICAgfQorCisgICAgc3RhdGljIDxLPiBQcmVkaWNhdGU8RW50cnk8SywgPz4+IGtleVByZWRpY2F0ZU9uRW50cmllcyhQcmVkaWNhdGU8PyBzdXBlciBLPiBrZXlQcmVkaWNhdGUpIHsKKyAgICAgICAgcmV0dXJuIGNvbXBvc2Uoa2V5UHJlZGljYXRlLCBNYXBzLjxLPmtleUZ1bmN0aW9uKCkpOworICAgIH0KKworICAgIHN0YXRpYyA8Vj4gUHJlZGljYXRlPEVudHJ5PD8sIFY+PiB2YWx1ZVByZWRpY2F0ZU9uRW50cmllcyhQcmVkaWNhdGU8PyBzdXBlciBWPiB2YWx1ZVByZWRpY2F0ZSkgeworICAgICAgICByZXR1cm4gY29tcG9zZSh2YWx1ZVByZWRpY2F0ZSwgTWFwcy48Vj52YWx1ZUZ1bmN0aW9uKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlbGVnYXRlcyB0byB7QGxpbmsgTWFwI2dldH0uIFJldHVybnMge0Bjb2RlIG51bGx9IG9uIHtAY29kZQorICAgICAqIENsYXNzQ2FzdEV4Y2VwdGlvbn0gYW5kIHtAY29kZSBOdWxsUG9pbnRlckV4Y2VwdGlvbn0uCisgICAgICovCisgICAgc3RhdGljIDxWPiBWIHNhZmVHZXQoTWFwPD8sIFY+IG1hcCwgT2JqZWN0IGtleSkgeworICAgICAgICBjaGVja05vdE51bGwobWFwKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBtYXAuZ2V0KGtleSk7CisgICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWxlZ2F0ZXMgdG8ge0BsaW5rIE1hcCNjb250YWluc0tleX0uIFJldHVybnMge0Bjb2RlIGZhbHNlfSBvbiB7QGNvZGUKKyAgICAgKiBDbGFzc0Nhc3RFeGNlcHRpb259IGFuZCB7QGNvZGUgTnVsbFBvaW50ZXJFeGNlcHRpb259LgorICAgICAqLworICAgIHN0YXRpYyBib29sZWFuIHNhZmVDb250YWluc0tleShNYXA8PywgPz4gbWFwLCBPYmplY3Qga2V5KSB7CisgICAgICAgIGNoZWNrTm90TnVsbChtYXApOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1hcC5jb250YWluc0tleShrZXkpOworICAgICAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWxlZ2F0ZXMgdG8ge0BsaW5rIE1hcCNyZW1vdmV9LiBSZXR1cm5zIHtAY29kZSBudWxsfSBvbiB7QGNvZGUKKyAgICAgKiBDbGFzc0Nhc3RFeGNlcHRpb259IGFuZCB7QGNvZGUgTnVsbFBvaW50ZXJFeGNlcHRpb259LgorICAgICAqLworICAgIHN0YXRpYyA8Vj4gViBzYWZlUmVtb3ZlKE1hcDw/LCBWPiBtYXAsIE9iamVjdCBrZXkpIHsKKyAgICAgICAgY2hlY2tOb3ROdWxsKG1hcCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbWFwLnJlbW92ZShrZXkpOworICAgICAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBlbnVtIEVudHJ5RnVuY3Rpb24gaW1wbGVtZW50cyBGdW5jdGlvbjxFbnRyeTw/LCA/PiwgT2JqZWN0PiB7CisgICAgICAgIEtFWSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgYXBwbHkoRW50cnk8PywgPz4gZW50cnkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIFZBTFVFIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIE9iamVjdCBhcHBseShFbnRyeTw/LCA/PiBlbnRyeSkgeworICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQXNNYXBWaWV3PEssIFY+IGV4dGVuZHMgSW1wcm92ZWRBYnN0cmFjdE1hcDxLLCBWPiB7CisKKyAgICAgICAgZmluYWwgRnVuY3Rpb248PyBzdXBlciBLLCBWPiBmdW5jdGlvbjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8Sz4gc2V0OworCisgICAgICAgIEFzTWFwVmlldyhTZXQ8Sz4gc2V0LCBGdW5jdGlvbjw/IHN1cGVyIEssIFY+IGZ1bmN0aW9uKSB7CisgICAgICAgICAgICB0aGlzLnNldCA9IGNoZWNrTm90TnVsbChzZXQpOworICAgICAgICAgICAgdGhpcy5mdW5jdGlvbiA9IGNoZWNrTm90TnVsbChmdW5jdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBTZXQ8Sz4gYmFja2luZ1NldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBzZXQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFNldDxLPiBjcmVhdGVLZXlTZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gcmVtb3ZlT25seVNldChiYWNraW5nU2V0KCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIENvbGxlY3Rpb248Vj4gY3JlYXRlVmFsdWVzKCkgeworICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zMi50cmFuc2Zvcm0oc2V0LCBmdW5jdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICAgICAgcmV0dXJuIGJhY2tpbmdTZXQoKS5zaXplKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoT2JqZWN0IGtleSkgeworICAgICAgICAgICAgcmV0dXJuIGJhY2tpbmdTZXQoKS5jb250YWlucyhrZXkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWIGdldChPYmplY3Qga2V5KSB7CisgICAgICAgICAgICBpZiAoQ29sbGVjdGlvbnMyLnNhZmVDb250YWlucyhiYWNraW5nU2V0KCksIGtleSkpIHsKKyAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgLy8gdW5zYWZlLCBidXQgSmF2YWRvYyB3YXJucyBhYm91dCBpdAorICAgICAgICAgICAgICAgICAgICAgICAgSyBrID0gKEspIGtleTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24uYXBwbHkoayk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWIHJlbW92ZShPYmplY3Qga2V5KSB7CisgICAgICAgICAgICBpZiAoYmFja2luZ1NldCgpLnJlbW92ZShrZXkpKSB7CisgICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIC8vIHVuc2FmZSwgYnV0IEphdmFkb2Mgd2FybnMgYWJvdXQgaXQKKyAgICAgICAgICAgICAgICAgICAgICAgIEsgayA9IChLKSBrZXk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uLmFwcGx5KGspOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgICAgIGJhY2tpbmdTZXQoKS5jbGVhcigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBTZXQ8RW50cnk8SywgVj4+IGNyZWF0ZUVudHJ5U2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBFbnRyeVNldDxLLCBWPigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBNYXA8SywgVj4gbWFwKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWFwcy5Bc01hcFZpZXcudGhpczsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgSXRlcmF0b3I8RW50cnk8SywgVj4+IGl0ZXJhdG9yKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXNNYXBFbnRyeUl0ZXJhdG9yKGJhY2tpbmdTZXQoKSwgZnVuY3Rpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGNvZGUgQWJzdHJhY3RNYXB9IGV4dGVuc2lvbiB0aGF0IGltcGxlbWVudHMge0BsaW5rICNpc0VtcHR5KCl9IGFzIHtAY29kZQorICAgICAqIGVudHJ5U2V0KCkuaXNFbXB0eSgpfSBpbnN0ZWFkIG9mIHtAY29kZSBzaXplKCkgPT0gMH0gdG8gc3BlZWQgdXAKKyAgICAgKiBpbXBsZW1lbnRhdGlvbnMgd2hlcmUge0Bjb2RlIHNpemUoKX0gaXMgTyhuKSwgYW5kIGl0IGRlbGVnYXRlcyB0aGUge0Bjb2RlCisgICAgICogaXNFbXB0eSgpfSBtZXRob2RzIG9mIGl0cyBrZXkgc2V0IGFuZCB2YWx1ZSBjb2xsZWN0aW9uIHRvIHRoaXMKKyAgICAgKiBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgSW1wcm92ZWRBYnN0cmFjdE1hcDxLLCBWPiBleHRlbmRzIEFic3RyYWN0TWFwPEssIFY+IHsKKyAgICAgICAgcHJpdmF0ZSB0cmFuc2llbnQgU2V0PEVudHJ5PEssIFY+PiBlbnRyeVNldDsKKyAgICAgICAgcHJpdmF0ZSB0cmFuc2llbnQgU2V0PEs+IGtleVNldDsKKyAgICAgICAgcHJpdmF0ZSB0cmFuc2llbnQgQ29sbGVjdGlvbjxWPiB2YWx1ZXM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgdGhlIGVudHJ5IHNldCB0byBiZSByZXR1cm5lZCBieSB7QGxpbmsgI2VudHJ5U2V0KCl9LiBUaGlzIG1ldGhvZAorICAgICAgICAgKiBpcyBpbnZva2VkIGF0IG1vc3Qgb25jZSBvbiBhIGdpdmVuIG1hcCwgYXQgdGhlIHRpbWUgd2hlbiB7QGNvZGUgZW50cnlTZXR9CisgICAgICAgICAqIGlzIGZpcnN0IGNhbGxlZC4KKyAgICAgICAgICovCisgICAgICAgIGFic3RyYWN0IFNldDxFbnRyeTxLLCBWPj4gY3JlYXRlRW50cnlTZXQoKTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFNldDxFbnRyeTxLLCBWPj4gZW50cnlTZXQoKSB7CisgICAgICAgICAgICBTZXQ8RW50cnk8SywgVj4+IHJlc3VsdCA9IGVudHJ5U2V0OworICAgICAgICAgICAgcmV0dXJuIChyZXN1bHQgPT0gbnVsbCkgPyBlbnRyeVNldCA9IGNyZWF0ZUVudHJ5U2V0KCkgOiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFNldDxLPiBrZXlTZXQoKSB7CisgICAgICAgICAgICBTZXQ8Sz4gcmVzdWx0ID0ga2V5U2V0OworICAgICAgICAgICAgcmV0dXJuIChyZXN1bHQgPT0gbnVsbCkgPyBrZXlTZXQgPSBjcmVhdGVLZXlTZXQoKSA6IHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIFNldDxLPiBjcmVhdGVLZXlTZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEtleVNldDxLLCBWPih0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ29sbGVjdGlvbjxWPiB2YWx1ZXMoKSB7CisgICAgICAgICAgICBDb2xsZWN0aW9uPFY+IHJlc3VsdCA9IHZhbHVlczsKKyAgICAgICAgICAgIHJldHVybiAocmVzdWx0ID09IG51bGwpID8gdmFsdWVzID0gY3JlYXRlVmFsdWVzKCkgOiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBDb2xsZWN0aW9uPFY+IGNyZWF0ZVZhbHVlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVmFsdWVzPEssIFY+KHRoaXMpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIEtleVNldDxLLCBWPiBleHRlbmRzIFNldHMuSW1wcm92ZWRBYnN0cmFjdFNldDxLPiB7CisgICAgICAgIGZpbmFsIE1hcDxLLCBWPiBtYXA7CisKKyAgICAgICAgS2V5U2V0KE1hcDxLLCBWPiBtYXApIHsKKyAgICAgICAgICAgIHRoaXMubWFwID0gY2hlY2tOb3ROdWxsKG1hcCk7CisgICAgICAgIH0KKworICAgICAgICBNYXA8SywgVj4gbWFwKCkgeworICAgICAgICAgICAgcmV0dXJuIG1hcDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSXRlcmF0b3I8Sz4gaXRlcmF0b3IoKSB7CisgICAgICAgICAgICByZXR1cm4ga2V5SXRlcmF0b3IobWFwKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgICAgICByZXR1cm4gbWFwKCkuc2l6ZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgICAgICAgICByZXR1cm4gbWFwKCkuaXNFbXB0eSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7CisgICAgICAgICAgICByZXR1cm4gbWFwKCkuY29udGFpbnNLZXkobyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7CisgICAgICAgICAgICBpZiAoY29udGFpbnMobykpIHsKKyAgICAgICAgICAgICAgICBtYXAoKS5yZW1vdmUobyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgICAgICBtYXAoKS5jbGVhcigpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFZhbHVlczxLLCBWPiBleHRlbmRzIEFic3RyYWN0Q29sbGVjdGlvbjxWPiB7CisgICAgICAgIGZpbmFsIE1hcDxLLCBWPiBtYXA7CisKKyAgICAgICAgVmFsdWVzKE1hcDxLLCBWPiBtYXApIHsKKyAgICAgICAgICAgIHRoaXMubWFwID0gY2hlY2tOb3ROdWxsKG1hcCk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBNYXA8SywgVj4gbWFwKCkgeworICAgICAgICAgICAgcmV0dXJuIG1hcDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSXRlcmF0b3I8Vj4gaXRlcmF0b3IoKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWVJdGVyYXRvcihtYXAoKS5lbnRyeVNldCgpLml0ZXJhdG9yKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIucmVtb3ZlKG8pOworICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGZvciAoRW50cnk8SywgVj4gZW50cnkgOiBtYXAoKS5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3RzLmVxdWFscyhvLCBlbnRyeS5nZXRWYWx1ZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWFwKCkucmVtb3ZlKGVudHJ5LmdldEtleSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbjw/PiBjKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmVBbGwoY2hlY2tOb3ROdWxsKGMpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBTZXQ8Sz4gdG9SZW1vdmUgPSBTZXRzLm5ld0hhc2hTZXQoKTsKKyAgICAgICAgICAgICAgICBmb3IgKEVudHJ5PEssIFY+IGVudHJ5IDogbWFwKCkuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYy5jb250YWlucyhlbnRyeS5nZXRWYWx1ZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdG9SZW1vdmUuYWRkKGVudHJ5LmdldEtleSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbWFwKCkua2V5U2V0KCkucmVtb3ZlQWxsKHRvUmVtb3ZlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbjw/PiBjKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5yZXRhaW5BbGwoY2hlY2tOb3ROdWxsKGMpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBTZXQ8Sz4gdG9SZXRhaW4gPSBTZXRzLm5ld0hhc2hTZXQoKTsKKyAgICAgICAgICAgICAgICBmb3IgKEVudHJ5PEssIFY+IGVudHJ5IDogbWFwKCkuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYy5jb250YWlucyhlbnRyeS5nZXRWYWx1ZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdG9SZXRhaW4uYWRkKGVudHJ5LmdldEtleSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbWFwKCkua2V5U2V0KCkucmV0YWluQWxsKHRvUmV0YWluKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgICAgICByZXR1cm4gbWFwKCkuc2l6ZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgICAgICAgICByZXR1cm4gbWFwKCkuaXNFbXB0eSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7CisgICAgICAgICAgICByZXR1cm4gbWFwKCkuY29udGFpbnNWYWx1ZShvKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgICAgIG1hcCgpLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgRW50cnlTZXQ8SywgVj4KKyAgICAgICAgICAgIGV4dGVuZHMgU2V0cy5JbXByb3ZlZEFic3RyYWN0U2V0PEVudHJ5PEssIFY+PiB7CisgICAgICAgIGFic3RyYWN0IE1hcDxLLCBWPiBtYXAoKTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICAgICAgcmV0dXJuIG1hcCgpLnNpemUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgICAgIG1hcCgpLmNsZWFyKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgRW50cnkpIHsKKyAgICAgICAgICAgICAgICBFbnRyeTw/LCA/PiBlbnRyeSA9IChFbnRyeTw/LCA/PikgbzsKKyAgICAgICAgICAgICAgICBPYmplY3Qga2V5ID0gZW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICAgICAgViB2YWx1ZSA9IE1hcHMuc2FmZUdldChtYXAoKSwga2V5KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0cy5lcXVhbHModmFsdWUsIGVudHJ5LmdldFZhbHVlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAodmFsdWUgIT0gbnVsbCB8fCBtYXAoKS5jb250YWluc0tleShrZXkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgeworICAgICAgICAgICAgcmV0dXJuIG1hcCgpLmlzRW1wdHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIGlmIChjb250YWlucyhvKSkgeworICAgICAgICAgICAgICAgIEVudHJ5PD8sID8+IGVudHJ5ID0gKEVudHJ5PD8sID8+KSBvOworICAgICAgICAgICAgICAgIHJldHVybiBtYXAoKS5rZXlTZXQoKS5yZW1vdmUoZW50cnkuZ2V0S2V5KCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZUFsbChDb2xsZWN0aW9uPD8+IGMpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnJlbW92ZUFsbChjaGVja05vdE51bGwoYykpOworICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBpdGVyYXRvcnMgZG9uJ3Qgc3VwcG9ydCByZW1vdmUKKyAgICAgICAgICAgICAgICByZXR1cm4gU2V0cy5yZW1vdmVBbGxJbXBsKHRoaXMsIGMuaXRlcmF0b3IoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb248Pz4gYykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIucmV0YWluQWxsKGNoZWNrTm90TnVsbChjKSk7CisgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGl0ZXJhdG9ycyBkb24ndCBzdXBwb3J0IHJlbW92ZQorICAgICAgICAgICAgICAgIFNldDxPYmplY3Q+IGtleXMgPSBTZXRzLm5ld0hhc2hTZXRXaXRoRXhwZWN0ZWRTaXplKGMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBvIDogYykgeworICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbnMobykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEVudHJ5PD8sID8+IGVudHJ5ID0gKEVudHJ5PD8sID8+KSBvOworICAgICAgICAgICAgICAgICAgICAgICAga2V5cy5hZGQoZW50cnkuZ2V0S2V5KCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBtYXAoKS5rZXlTZXQoKS5yZXRhaW5BbGwoa2V5cyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL01vcmVFeGVjdXRvcnMuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvTW9yZUV4ZWN1dG9ycy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0OTA1NzUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL01vcmVFeGVjdXRvcnMuamF2YQpAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBHdWF2YSBBdXRob3JzCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZEZhY3Rvcnk7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yLkNhbGxlclJ1bnNQb2xpY3k7CisKKy8qKgorICogRmFjdG9yeSBhbmQgdXRpbGl0eSBtZXRob2RzIGZvciB7QGxpbmsgRXhlY3V0b3J9LCB7QGxpbmsKKyAqIEV4ZWN1dG9yU2VydmljZX0sIGFuZCB7QGxpbmsgVGhyZWFkRmFjdG9yeX0uCisgKgorICogQGF1dGhvciBFcmljIEZlbGxoZWltZXIKKyAqIEBhdXRob3IgS3lsZSBMaXR0bGVmaWVsZAorICogQGF1dGhvciBKdXN0aW4gTWFob25leQorICogQHNpbmNlIDMuMAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTW9yZUV4ZWN1dG9ycyB7CisgICAgcHJpdmF0ZSBNb3JlRXhlY3V0b3JzKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4ge0BsaW5rIEV4ZWN1dG9yfSB0aGF0IHJ1bnMgZWFjaCB0YXNrIGluIHRoZSB0aHJlYWQgdGhhdCBpbnZva2VzCisgICAgICoge0BsaW5rIEV4ZWN1dG9yI2V4ZWN1dGUgZXhlY3V0ZX0sIGFzIGluIHtAbGluayBDYWxsZXJSdW5zUG9saWN5fS4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5UaGlzIGluc3RhbmNlIGlzIGVxdWl2YWxlbnQgdG86IDxwcmU+ICAge0Bjb2RlCisgICAgICogICBmaW5hbCBjbGFzcyBEaXJlY3RFeGVjdXRvciBpbXBsZW1lbnRzIEV4ZWN1dG9yIHsKKyAgICAgKiAgICAgcHVibGljIHZvaWQgZXhlY3V0ZShSdW5uYWJsZSByKSB7CisgICAgICogICAgICAgci5ydW4oKTsKKyAgICAgKiAgICAgfQorICAgICAqICAgfX08L3ByZT4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5UaGlzIHNob3VsZCBiZSBwcmVmZXJyZWQgdG8ge0BsaW5rICNuZXdEaXJlY3RFeGVjdXRvclNlcnZpY2UoKX0gYmVjYXVzZSB0aGUgaW1wbGVtZW50aW5nIHRoZQorICAgICAqIHtAbGluayBFeGVjdXRvclNlcnZpY2V9IHN1YmludGVyZmFjZSBuZWNlc3NpdGF0ZXMgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2Ugb3ZlcmhlYWQuCisgICAgICoKKyAgICAgKiBAc2luY2UgMTguMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRXhlY3V0b3IgZGlyZWN0RXhlY3V0b3IoKSB7CisgICAgICAgIHJldHVybiBEaXJlY3RFeGVjdXRvci5JTlNUQU5DRTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZWUge0BsaW5rICNkaXJlY3RFeGVjdXRvcn0gZm9yIGJlaGF2aW9yYWwgbm90ZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBlbnVtIERpcmVjdEV4ZWN1dG9yIGltcGxlbWVudHMgRXhlY3V0b3IgeworICAgICAgICBJTlNUQU5DRTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZShSdW5uYWJsZSBjb21tYW5kKSB7CisgICAgICAgICAgICBjb21tYW5kLnJ1bigpOworICAgICAgICB9CisgICAgfQorCisgIC8qCisgICAqIFRoaXMgZm9sbG93aW5nIG1ldGhvZCBpcyBhIG1vZGlmaWVkIHZlcnNpb24gb2Ygb25lIGZvdW5kIGluCisgICAqIGh0dHA6Ly9nZWUuY3Mub3N3ZWdvLmVkdS9jZ2ktYmluL3ZpZXdjdnMuY2dpL2pzcjE2Ni9zcmMvdGVzdC90Y2svQWJzdHJhY3RFeGVjdXRvclNlcnZpY2VUZXN0LmphdmE/cmV2aXNpb249MS4zMAorICAgKiB3aGljaCBjb250YWluZWQgdGhlIGZvbGxvd2luZyBub3RpY2U6CisgICAqCisgICAqIFdyaXR0ZW4gYnkgRG91ZyBMZWEgd2l0aCBhc3Npc3RhbmNlIGZyb20gbWVtYmVycyBvZiBKQ1AgSlNSLTE2NgorICAgKiBFeHBlcnQgR3JvdXAgYW5kIHJlbGVhc2VkIHRvIHRoZSBwdWJsaWMgZG9tYWluLCBhcyBleHBsYWluZWQgYXQKKyAgICogaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvcHVibGljZG9tYWluL3plcm8vMS4wLworICAgKiBPdGhlciBjb250cmlidXRvcnMgaW5jbHVkZSBBbmRyZXcgV3JpZ2h0LCBKZWZmcmV5IEhheWVzLAorICAgKiBQYXQgRmlzaGVyLCBNaWtlIEp1ZGQuCisgICAqLworCit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL01vcmVPYmplY3RzLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL01vcmVPYmplY3RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNjYWFlZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvTW9yZU9iamVjdHMuamF2YQpAQCAtMCwwICsxLDIwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgR3VhdmEgQXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YTsKKworaW1wb3J0IHN0YXRpYyBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKKworLyoqCisgKiBIZWxwZXIgZnVuY3Rpb25zIHRoYXQgb3BlcmF0ZSBvbiBhbnkge0Bjb2RlIE9iamVjdH0sIGFuZCBhcmUgbm90IGFscmVhZHkgcHJvdmlkZWQgaW4KKyAqIHtAbGluayBqYXZhLnV0aWwuT2JqZWN0c30uCisgKiA8cD4KKyAqIDxwPlNlZSB0aGUgR3VhdmEgVXNlciBHdWlkZSBvbiA8YQorICogaHJlZj0iaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2d1YXZhLWxpYnJhcmllcy93aWtpL0NvbW1vbk9iamVjdFV0aWxpdGllc0V4cGxhaW5lZCI+d3JpdGluZworICoge0Bjb2RlIE9iamVjdH0gbWV0aG9kcyB3aXRoIHtAY29kZSBNb3JlT2JqZWN0c308L2E+LgorICoKKyAqIEBhdXRob3IgTGF1cmVuY2UgR29uc2FsdmVzCisgKiBAc2luY2UgMTguMCAoc2luY2UgMi4wIGFzIHtAY29kZSBPYmplY3RzfSkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE1vcmVPYmplY3RzIHsKKyAgICBwcml2YXRlIE1vcmVPYmplY3RzKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFRvU3RyaW5nSGVscGVyfS4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5UaGlzIGlzIGhlbHBmdWwgZm9yIGltcGxlbWVudGluZyB7QGxpbmsgT2JqZWN0I3RvU3RyaW5nKCl9LgorICAgICAqIFNwZWNpZmljYXRpb24gYnkgZXhhbXBsZTogPHByZT4gICB7QGNvZGUKKyAgICAgKiAgIC8vIFJldHVybnMgIkNsYXNzTmFtZXt9IgorICAgICAqICAgTW9yZU9iamVjdHMudG9TdHJpbmdIZWxwZXIodGhpcykKKyAgICAgKiAgICAgICAudG9TdHJpbmcoKTsKKyAgICAgKiA8cD4KKyAgICAgKiAgIC8vIFJldHVybnMgIkNsYXNzTmFtZXt4PTF9IgorICAgICAqICAgTW9yZU9iamVjdHMudG9TdHJpbmdIZWxwZXIodGhpcykKKyAgICAgKiAgICAgICAuYWRkKCJ4IiwgMSkKKyAgICAgKiAgICAgICAudG9TdHJpbmcoKTsKKyAgICAgKiA8cD4KKyAgICAgKiAgIC8vIFJldHVybnMgIk15T2JqZWN0e3g9MX0iCisgICAgICogICBNb3JlT2JqZWN0cy50b1N0cmluZ0hlbHBlcigiTXlPYmplY3QiKQorICAgICAqICAgICAgIC5hZGQoIngiLCAxKQorICAgICAqICAgICAgIC50b1N0cmluZygpOworICAgICAqIDxwPgorICAgICAqICAgLy8gUmV0dXJucyAiQ2xhc3NOYW1le3g9MSwgeT1mb299IgorICAgICAqICAgTW9yZU9iamVjdHMudG9TdHJpbmdIZWxwZXIodGhpcykKKyAgICAgKiAgICAgICAuYWRkKCJ4IiwgMSkKKyAgICAgKiAgICAgICAuYWRkKCJ5IiwgImZvbyIpCisgICAgICogICAgICAgLnRvU3RyaW5nKCk7CisgICAgICogPHA+CisgICAgICogICAvLyBSZXR1cm5zICJDbGFzc05hbWV7eD0xfSIKKyAgICAgKiAgIE1vcmVPYmplY3RzLnRvU3RyaW5nSGVscGVyKHRoaXMpCisgICAgICogICAgICAgLm9taXROdWxsVmFsdWVzKCkKKyAgICAgKiAgICAgICAuYWRkKCJ4IiwgMSkKKyAgICAgKiAgICAgICAuYWRkKCJ5IiwgbnVsbCkKKyAgICAgKiAgICAgICAudG9TdHJpbmcoKTsKKyAgICAgKiAgIH19PC9wcmU+CisgICAgICogPHA+CisgICAgICogPHA+Tm90ZSB0aGF0IGluIEdXVCwgY2xhc3MgbmFtZXMgYXJlIG9mdGVuIG9iZnVzY2F0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VsZiB0aGUgb2JqZWN0IHRvIGdlbmVyYXRlIHRoZSBzdHJpbmcgZm9yICh0eXBpY2FsbHkge0Bjb2RlIHRoaXN9KSwgdXNlZCBvbmx5IGZvciBpdHMKKyAgICAgKiAgICAgICAgICAgICBjbGFzcyBuYW1lCisgICAgICogQHNpbmNlIDE4LjAgKHNpbmNlIDIuMCBhcyB7QGNvZGUgT2JqZWN0cy50b1N0cmluZ0hlbHBlcigpfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFRvU3RyaW5nSGVscGVyIHRvU3RyaW5nSGVscGVyKE9iamVjdCBzZWxmKSB7CisgICAgICAgIHJldHVybiBuZXcgVG9TdHJpbmdIZWxwZXIoc2ltcGxlTmFtZShzZWxmLmdldENsYXNzKCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgQ2xhc3MjZ2V0U2ltcGxlTmFtZSgpfSBpcyBub3QgR1dUIGNvbXBhdGlibGUgeWV0LCBzbyB3ZQorICAgICAqIHByb3ZpZGUgb3VyIG93biBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICAvLyBQYWNrYWdlLXByaXZhdGUgc28gT2JqZWN0cyBjYW4gY2FsbCBpdC4KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc2ltcGxlTmFtZShDbGFzczw/PiBjbGF6eikgeworICAgICAgICBTdHJpbmcgbmFtZSA9IGNsYXp6LmdldE5hbWUoKTsKKworICAgICAgICAvLyB0aGUgbnRoIGFub255bW91cyBjbGFzcyBoYXMgYSBjbGFzcyBuYW1lIGVuZGluZyBpbiAiT3V0ZXIkbiIKKyAgICAgICAgLy8gYW5kIGxvY2FsIGlubmVyIGNsYXNzZXMgaGF2ZSBuYW1lcyBlbmRpbmcgaW4gIk91dGVyLiQxSW5uZXIiCisgICAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2VBbGwoIlxcJFswLTldKyIsICJcXCQiKTsKKworICAgICAgICAvLyB3ZSB3YW50IHRoZSBuYW1lIG9mIHRoZSBpbm5lciBjbGFzcyBhbGwgYnkgaXRzIGxvbmVzb21lCisgICAgICAgIGludCBzdGFydCA9IG5hbWUubGFzdEluZGV4T2YoJyQnKTsKKworICAgICAgICAvLyBpZiB0aGlzIGlzbid0IGFuIGlubmVyIGNsYXNzLCBqdXN0IGZpbmQgdGhlIHN0YXJ0IG9mIHRoZQorICAgICAgICAvLyB0b3AgbGV2ZWwgY2xhc3MgbmFtZS4KKyAgICAgICAgaWYgKHN0YXJ0ID09IC0xKSB7CisgICAgICAgICAgICBzdGFydCA9IG5hbWUubGFzdEluZGV4T2YoJy4nKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmFtZS5zdWJzdHJpbmcoc3RhcnQgKyAxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdXBwb3J0IGNsYXNzIGZvciB7QGxpbmsgTW9yZU9iamVjdHMjdG9TdHJpbmdIZWxwZXJ9LgorICAgICAqCisgICAgICogQGF1dGhvciBKYXNvbiBMZWUKKyAgICAgKiBAc2luY2UgMTguMCAoc2luY2UgMi4wIGFzIHtAY29kZSBPYmplY3RzLlRvU3RyaW5nSGVscGVyfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFRvU3RyaW5nSGVscGVyIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY2xhc3NOYW1lOworICAgICAgICBwcml2YXRlIGZpbmFsIFZhbHVlSG9sZGVyIGhvbGRlckhlYWQgPSBuZXcgVmFsdWVIb2xkZXIoKTsKKyAgICAgICAgcHJpdmF0ZSBWYWx1ZUhvbGRlciBob2xkZXJUYWlsID0gaG9sZGVySGVhZDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG9taXROdWxsVmFsdWVzID0gZmFsc2U7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFVzZSB7QGxpbmsgTW9yZU9iamVjdHMjdG9TdHJpbmdIZWxwZXIoT2JqZWN0KX0gdG8gY3JlYXRlIGFuIGluc3RhbmNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBUb1N0cmluZ0hlbHBlcihTdHJpbmcgY2xhc3NOYW1lKSB7CisgICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IFByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsKGNsYXNzTmFtZSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkcyBhIG5hbWUvdmFsdWUgcGFpciB0byB0aGUgZm9ybWF0dGVkIG91dHB1dCBpbiB7QGNvZGUgbmFtZT12YWx1ZX0KKyAgICAgICAgICogZm9ybWF0LiBJZiB7QGNvZGUgdmFsdWV9IGlzIHtAY29kZSBudWxsfSwgdGhlIHN0cmluZyB7QGNvZGUgIm51bGwifQorICAgICAgICAgKiBpcyB1c2VkLCB1bmxlc3Mge0BsaW5rICNvbWl0TnVsbFZhbHVlcygpfSBpcyBjYWxsZWQsIGluIHdoaWNoIGNhc2UgdGhpcworICAgICAgICAgKiBuYW1lL3ZhbHVlIHBhaXIgd2lsbCBub3QgYmUgYWRkZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgVG9TdHJpbmdIZWxwZXIgYWRkKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiBhZGRIb2xkZXIobmFtZSwgdmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZHMgYSBuYW1lL3ZhbHVlIHBhaXIgdG8gdGhlIGZvcm1hdHRlZCBvdXRwdXQgaW4ge0Bjb2RlIG5hbWU9dmFsdWV9CisgICAgICAgICAqIGZvcm1hdC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHNpbmNlIDE4LjAgKHNpbmNlIDExLjAgYXMge0Bjb2RlIE9iamVjdHMuVG9TdHJpbmdIZWxwZXIub21pdE51bGxWYWx1ZXMoKX0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgVG9TdHJpbmdIZWxwZXIgYWRkKFN0cmluZyBuYW1lLCBpbnQgdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiBhZGRIb2xkZXIobmFtZSwgU3RyaW5nLnZhbHVlT2YodmFsdWUpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGRzIGEgbmFtZS92YWx1ZSBwYWlyIHRvIHRoZSBmb3JtYXR0ZWQgb3V0cHV0IGluIHtAY29kZSBuYW1lPXZhbHVlfQorICAgICAgICAgKiBmb3JtYXQuCisgICAgICAgICAqCisgICAgICAgICAqIEBzaW5jZSAxOC4wIChzaW5jZSAxMS4wIGFzIHtAY29kZSBPYmplY3RzLlRvU3RyaW5nSGVscGVyLm9taXROdWxsVmFsdWVzKCl9LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFRvU3RyaW5nSGVscGVyIGFkZChTdHJpbmcgbmFtZSwgbG9uZyB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIGFkZEhvbGRlcihuYW1lLCBTdHJpbmcudmFsdWVPZih2YWx1ZSkpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgYSBzdHJpbmcgaW4gdGhlIGZvcm1hdCBzcGVjaWZpZWQgYnkKKyAgICAgICAgICoge0BsaW5rIE1vcmVPYmplY3RzI3RvU3RyaW5nSGVscGVyKE9iamVjdCl9LgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogPHA+QWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCwgeW91IGNhbiBrZWVwIGFkZGluZyBtb3JlIHByb3BlcnRpZXMgdG8gbGF0ZXIKKyAgICAgICAgICogY2FsbCB0b1N0cmluZygpIGFnYWluIGFuZCBnZXQgYSBtb3JlIGNvbXBsZXRlIHJlcHJlc2VudGF0aW9uIG9mIHRoZQorICAgICAgICAgKiBzYW1lIG9iamVjdDsgYnV0IHByb3BlcnRpZXMgY2Fubm90IGJlIHJlbW92ZWQsIHNvIHRoaXMgb25seSBhbGxvd3MKKyAgICAgICAgICogbGltaXRlZCByZXVzZSBvZiB0aGUgaGVscGVyIGluc3RhbmNlLiBUaGUgaGVscGVyIGFsbG93cyBkdXBsaWNhdGlvbiBvZgorICAgICAgICAgKiBwcm9wZXJ0aWVzIChtdWx0aXBsZSBuYW1lL3ZhbHVlIHBhaXJzIHdpdGggdGhlIHNhbWUgbmFtZSBjYW4gYmUgYWRkZWQpLgorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICAvLyBjcmVhdGUgYSBjb3B5IHRvIGtlZXAgaXQgY29uc2lzdGVudCBpbiBjYXNlIHZhbHVlIGNoYW5nZXMKKyAgICAgICAgICAgIFN0cmluZyBuZXh0U2VwYXJhdG9yID0gIiI7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigzMikuYXBwZW5kKGNsYXNzTmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJ3snKTsKKyAgICAgICAgICAgIGZvciAoVmFsdWVIb2xkZXIgdmFsdWVIb2xkZXIgPSBob2xkZXJIZWFkLm5leHQ7IHZhbHVlSG9sZGVyICE9IG51bGw7CisgICAgICAgICAgICAgICAgIHZhbHVlSG9sZGVyID0gdmFsdWVIb2xkZXIubmV4dCkgeworICAgICAgICAgICAgICAgIGlmICghb21pdE51bGxWYWx1ZXMgfHwgdmFsdWVIb2xkZXIudmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChuZXh0U2VwYXJhdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgbmV4dFNlcGFyYXRvciA9ICIsICI7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlSG9sZGVyLm5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQodmFsdWVIb2xkZXIubmFtZSkuYXBwZW5kKCc9Jyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQodmFsdWVIb2xkZXIudmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBidWlsZGVyLmFwcGVuZCgnfScpLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFZhbHVlSG9sZGVyIGFkZEhvbGRlcigpIHsKKyAgICAgICAgICAgIFZhbHVlSG9sZGVyIHZhbHVlSG9sZGVyID0gbmV3IFZhbHVlSG9sZGVyKCk7CisgICAgICAgICAgICBob2xkZXJUYWlsID0gaG9sZGVyVGFpbC5uZXh0ID0gdmFsdWVIb2xkZXI7CisgICAgICAgICAgICByZXR1cm4gdmFsdWVIb2xkZXI7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFRvU3RyaW5nSGVscGVyIGFkZEhvbGRlcihTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgICAgICBWYWx1ZUhvbGRlciB2YWx1ZUhvbGRlciA9IGFkZEhvbGRlcigpOworICAgICAgICAgICAgdmFsdWVIb2xkZXIudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgICAgIHZhbHVlSG9sZGVyLm5hbWUgPSBQcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbChuYW1lKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgVmFsdWVIb2xkZXIgeworICAgICAgICAgICAgU3RyaW5nIG5hbWU7CisgICAgICAgICAgICBPYmplY3QgdmFsdWU7CisgICAgICAgICAgICBWYWx1ZUhvbGRlciBuZXh0OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9NdWx0aW1hcC5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9NdWx0aW1hcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYjNjMTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL011bHRpbWFwLmphdmEKQEAgLTAsMCArMSwzNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEd1YXZhIEF1dGhvcnMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogQSBjb2xsZWN0aW9uIHRoYXQgbWFwcyBrZXlzIHRvIHZhbHVlcywgc2ltaWxhciB0byB7QGxpbmsgTWFwfSwgYnV0IGluIHdoaWNoCisgKiBlYWNoIGtleSBtYXkgYmUgYXNzb2NpYXRlZCB3aXRoIDxpPm11bHRpcGxlPC9pPiB2YWx1ZXMuIFlvdSBjYW4gdmlzdWFsaXplIHRoZQorICogY29udGVudHMgb2YgYSBtdWx0aW1hcCBlaXRoZXIgYXMgYSBtYXAgZnJvbSBrZXlzIHRvIDxpPm5vbmVtcHR5PC9pPgorICogY29sbGVjdGlvbnMgb2YgdmFsdWVzOgorICogPHA+CisgKiA8dWw+CisgKiA8bGk+YSDihpIgMSwgMgorICogPGxpPmIg4oaSIDMKKyAqIDwvdWw+CisgKiA8cD4KKyAqIC4uLiBvciBhcyBhIHNpbmdsZSAiZmxhdHRlbmVkIiBjb2xsZWN0aW9uIG9mIGtleS12YWx1ZSBwYWlyczoKKyAqIDxwPgorICogPHVsPgorICogPGxpPmEg4oaSIDEKKyAqIDxsaT5hIOKGkiAyCisgKiA8bGk+YiDihpIgMworICogPC91bD4KKyAqIDxwPgorICogPHA+PGI+SW1wb3J0YW50OjwvYj4gYWx0aG91Z2ggdGhlIGZpcnN0IGludGVycHJldGF0aW9uIHJlc2VtYmxlcyBob3cgbW9zdAorICogbXVsdGltYXBzIGFyZSA8aT5pbXBsZW1lbnRlZDwvaT4sIHRoZSBkZXNpZ24gb2YgdGhlIHtAY29kZSBNdWx0aW1hcH0gQVBJIGlzCisgKiBiYXNlZCBvbiB0aGUgPGk+c2Vjb25kPC9pPiBmb3JtLiBTbywgdXNpbmcgdGhlIG11bHRpbWFwIHNob3duIGFib3ZlIGFzIGFuCisgKiBleGFtcGxlLCB0aGUge0BsaW5rICNzaXplfSBpcyB7QGNvZGUgM30sIG5vdCB7QGNvZGUgMn0sIGFuZCB0aGUge0BsaW5rCisgKiAjdmFsdWVzfSBjb2xsZWN0aW9uIGlzIHtAY29kZSBbMSwgMiwgM119LCBub3Qge0Bjb2RlIFtbMSwgMl0sIFszXV19LiBGb3IKKyAqIHRob3NlIHRpbWVzIHdoZW4gdGhlIGZpcnN0IHN0eWxlIGlzIG1vcmUgdXNlZnVsLCB1c2UgdGhlIG11bHRpbWFwJ3Mge0BsaW5rCisgKiAjYXNNYXB9IHZpZXcgKG9yIGNyZWF0ZSBhIHtAY29kZSBNYXA8SywgQ29sbGVjdGlvbjxWPj59IGluIHRoZSBmaXJzdCBwbGFjZSkuCisgKiA8cD4KKyAqIDxoMz5FeGFtcGxlPC9oMz4KKyAqIDxwPgorICogPHA+VGhlIGZvbGxvd2luZyBjb2RlOiA8cHJlPiAgIHtAY29kZQorICogPHA+CisgKiAgIExpc3RNdWx0aW1hcDxTdHJpbmcsIFN0cmluZz4gbXVsdGltYXAgPSBBcnJheUxpc3RNdWx0aW1hcC5jcmVhdGUoKTsKKyAqICAgZm9yIChQcmVzaWRlbnQgcHJlcyA6IFVTX1BSRVNJREVOVFNfSU5fT1JERVIpIHsKKyAqICAgICBtdWx0aW1hcC5wdXQocHJlcy5maXJzdE5hbWUoKSwgcHJlcy5sYXN0TmFtZSgpKTsKKyAqICAgfQorICogICBmb3IgKFN0cmluZyBmaXJzdE5hbWUgOiBtdWx0aW1hcC5rZXlTZXQoKSkgeworICogICAgIExpc3Q8U3RyaW5nPiBsYXN0TmFtZXMgPSBtdWx0aW1hcC5nZXQoZmlyc3ROYW1lKTsKKyAqICAgICBvdXQucHJpbnRsbihmaXJzdE5hbWUgKyAiOiAiICsgbGFzdE5hbWVzKTsKKyAqICAgfX08L3ByZT4KKyAqIDxwPgorICogLi4uIHByb2R1Y2VzIG91dHB1dCBzdWNoIGFzOiA8cHJlPiAgIHtAY29kZQorICogPHA+CisgKiAgIFphY2hhcnk6IFtUYXlsb3JdCisgKiAgIEpvaG46IFtBZGFtcywgQWRhbXMsIFR5bGVyLCBLZW5uZWR5XSAgLy8gUmVtZW1iZXIsIFF1aW5jeSEKKyAqICAgR2VvcmdlOiBbV2FzaGluZ3RvbiwgQnVzaCwgQnVzaF0KKyAqICAgR3JvdmVyOiBbQ2xldmVsYW5kLCBDbGV2ZWxhbmRdICAgICAgICAvLyBUd28sIG5vbi1jb25zZWN1dGl2ZSB0ZXJtcywgcmVwJ2luZyBOSiEKKyAqICAgLi4ufTwvcHJlPgorICogPHA+CisgKiA8aDM+Vmlld3M8L2gzPgorICogPHA+CisgKiA8cD5NdWNoIG9mIHRoZSBwb3dlciBvZiB0aGUgbXVsdGltYXAgQVBJIGNvbWVzIGZyb20gdGhlIDxpPnZpZXcKKyAqIGNvbGxlY3Rpb25zPC9pPiBpdCBwcm92aWRlcy4gVGhlc2UgYWx3YXlzIHJlZmxlY3QgdGhlIGxhdGVzdCBzdGF0ZSBvZiB0aGUKKyAqIG11bHRpbWFwIGl0c2VsZi4gV2hlbiB0aGV5IHN1cHBvcnQgbW9kaWZpY2F0aW9uLCB0aGUgY2hhbmdlcyBhcmUKKyAqIDxpPndyaXRlLXRocm91Z2g8L2k+ICh0aGV5IGF1dG9tYXRpY2FsbHkgdXBkYXRlIHRoZSBiYWNraW5nIG11bHRpbWFwKS4gVGhlc2UKKyAqIHZpZXcgY29sbGVjdGlvbnMgYXJlOgorICogPHA+CisgKiA8dWw+CisgKiA8bGk+e0BsaW5rICNhc01hcH0sIG1lbnRpb25lZCBhYm92ZTwvbGk+CisgKiA8bGk+e0BsaW5rICNrZXlzfSwge0BsaW5rICNrZXlTZXR9LCB7QGxpbmsgI3ZhbHVlc30sIHtAbGluayAjZW50cmllc30sIHdoaWNoCisgKiBhcmUgc2ltaWxhciB0byB0aGUgY29ycmVzcG9uZGluZyB2aWV3IGNvbGxlY3Rpb25zIG9mIHtAbGluayBNYXB9CisgKiA8bGk+YW5kLCBub3RhYmx5LCBldmVuIHRoZSBjb2xsZWN0aW9uIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0IGdldChrZXkpfSBpcyBhbgorICogYWN0aXZlIHZpZXcgb2YgdGhlIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHtAY29kZSBrZXl9CisgKiA8L3VsPgorICogPHA+CisgKiA8cD5UaGUgY29sbGVjdGlvbnMgcmV0dXJuZWQgYnkgdGhlIHtAbGluayAjcmVwbGFjZVZhbHVlcyByZXBsYWNlVmFsdWVzfSBhbmQKKyAqIHtAbGluayAjcmVtb3ZlQWxsIHJlbW92ZUFsbH0gbWV0aG9kcywgd2hpY2ggY29udGFpbiB2YWx1ZXMgdGhhdCBoYXZlIGp1c3QKKyAqIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBtdWx0aW1hcCwgYXJlIG5hdHVyYWxseSA8aT5ub3Q8L2k+IHZpZXdzLgorICogPHA+CisgKiA8aDM+U3ViaW50ZXJmYWNlczwvaDM+CisgKiA8cD4KKyAqIDxwPkluc3RlYWQgb2YgdXNpbmcgdGhlIHtAY29kZSBNdWx0aW1hcH0gaW50ZXJmYWNlIGRpcmVjdGx5LCBwcmVmZXIgdGhlCisgKiBzdWJpbnRlcmZhY2VzIHtAbGluayBMaXN0TXVsdGltYXB9IGFuZCB7QGxpbmsgU2V0TXVsdGltYXB9LiBUaGVzZSB0YWtlIHRoZWlyCisgKiBuYW1lcyBmcm9tIHRoZSBmYWN0IHRoYXQgdGhlIGNvbGxlY3Rpb25zIHRoZXkgcmV0dXJuIGZyb20ge0Bjb2RlIGdldH0gYmVoYXZlCisgKiBsaWtlIChhbmQsIG9mIGNvdXJzZSwgaW1wbGVtZW50KSB7QGxpbmsgTGlzdH0gYW5kIHtAbGluayBTZXR9LCByZXNwZWN0aXZlbHkuCisgKiA8cD4KKyAqIDxwPkZvciBleGFtcGxlLCB0aGUgInByZXNpZGVudHMiIGNvZGUgc25pcHBldCBhYm92ZSB1c2VkIGEge0Bjb2RlCisgKiBMaXN0TXVsdGltYXB9OyBpZiBpdCBoYWQgdXNlZCBhIHtAY29kZSBTZXRNdWx0aW1hcH0gaW5zdGVhZCwgdHdvIHByZXNpZGVudHMKKyAqIHdvdWxkIGhhdmUgdmFuaXNoZWQsIGFuZCBsYXN0IG5hbWVzIG1pZ2h0IG9yIG1pZ2h0IG5vdCBhcHBlYXIgaW4KKyAqIGNocm9ub2xvZ2ljYWwgb3JkZXIuCisgKiA8cD4KKyAqIDxwPjxiPldhcm5pbmc6PC9iPiBpbnN0YW5jZXMgb2YgdHlwZSB7QGNvZGUgTXVsdGltYXB9IG1heSBub3QgaW1wbGVtZW50CisgKiB7QGxpbmsgT2JqZWN0I2VxdWFsc30gaW4gdGhlIHdheSB5b3UgZXhwZWN0LiAgTXVsdGltYXBzIGNvbnRhaW5pbmcgdGhlIHNhbWUKKyAqIGtleS12YWx1ZSBwYWlycywgZXZlbiBpbiB0aGUgc2FtZSBvcmRlciwgbWF5IG9yIG1heSBub3QgYmUgZXF1YWwgYW5kIG1heSBvcgorICogbWF5IG5vdCBoYXZlIHRoZSBzYW1lIHtAY29kZSBoYXNoQ29kZX0uIFRoZSByZWNvbW1lbmRlZCBzdWJpbnRlcmZhY2VzCisgKiBwcm92aWRlIG11Y2ggc3Ryb25nZXIgZ3VhcmFudGVlcy4KKyAqIDxwPgorICogPGgzPkNvbXBhcmlzb24gdG8gYSBtYXAgb2YgY29sbGVjdGlvbnM8L2gzPgorICogPHA+CisgKiA8cD5NdWx0aW1hcHMgYXJlIGNvbW1vbmx5IHVzZWQgaW4gcGxhY2VzIHdoZXJlIGEge0Bjb2RlIE1hcDxLLAorICogQ29sbGVjdGlvbjxWPj59IHdvdWxkIG90aGVyd2lzZSBoYXZlIGFwcGVhcmVkLiBUaGUgZGlmZmVyZW5jZXMgaW5jbHVkZToKKyAqIDxwPgorICogPHVsPgorICogPGxpPlRoZXJlIGlzIG5vIG5lZWQgdG8gcG9wdWxhdGUgYW4gZW1wdHkgY29sbGVjdGlvbiBiZWZvcmUgYWRkaW5nIGFuIGVudHJ5CisgKiB3aXRoIHtAbGluayAjcHV0IHB1dH0uCisgKiA8bGk+e0Bjb2RlIGdldH0gbmV2ZXIgcmV0dXJucyB7QGNvZGUgbnVsbH0sIG9ubHkgYW4gZW1wdHkgY29sbGVjdGlvbi4KKyAqIDxsaT5BIGtleSBpcyBjb250YWluZWQgaW4gdGhlIG11bHRpbWFwIGlmIGFuZCBvbmx5IGlmIGl0IG1hcHMgdG8gYXQgbGVhc3QKKyAqIG9uZSB2YWx1ZS4gQW55IG9wZXJhdGlvbiB0aGF0IGNhdXNlcyBhIGtleSB0byBoYXZlIHplcm8gYXNzb2NpYXRlZAorICogdmFsdWVzIGhhcyB0aGUgZWZmZWN0IG9mIDxpPnJlbW92aW5nPC9pPiB0aGF0IGtleSBmcm9tIHRoZSBtdWx0aW1hcC4KKyAqIDxsaT5UaGUgdG90YWwgZW50cnkgY291bnQgaXMgYXZhaWxhYmxlIGFzIHtAbGluayAjc2l6ZX0uCisgKiA8bGk+TWFueSBjb21wbGV4IG9wZXJhdGlvbnMgYmVjb21lIGVhc2llcjsgZm9yIGV4YW1wbGUsIHtAY29kZQorICogQ29sbGVjdGlvbnMubWluKG11bHRpbWFwLnZhbHVlcygpKX0gZmluZHMgdGhlIHNtYWxsZXN0IHZhbHVlIGFjcm9zcyBhbGwKKyAqIGtleXMuCisgKiA8L3VsPgorICogPHA+CisgKiA8aDM+SW1wbGVtZW50YXRpb25zPC9oMz4KKyAqIDxwPgorICogPHA+QXMgYWx3YXlzLCBwcmVmZXIgdGhlIGltbXV0YWJsZSBpbXBsZW1lbnRhdGlvbnMsIHtAbGluaworICogSW1tdXRhYmxlTGlzdE11bHRpbWFwfSBhbmQge0BsaW5rIEltbXV0YWJsZVNldE11bHRpbWFwfS4gR2VuZXJhbC1wdXJwb3NlCisgKiBtdXRhYmxlIGltcGxlbWVudGF0aW9ucyBhcmUgbGlzdGVkIGFib3ZlIHVuZGVyICJBbGwgS25vd24gSW1wbGVtZW50aW5nCisgKiBDbGFzc2VzIi4gWW91IGNhbiBhbHNvIGNyZWF0ZSBhIDxpPmN1c3RvbTwvaT4gbXVsdGltYXAsIGJhY2tlZCBieSBhbnkge0Bjb2RlCisgKiBNYXB9IGFuZCB7QGxpbmsgQ29sbGVjdGlvbn0gdHlwZXMsIHVzaW5nIHRoZSB7QGxpbmsgTXVsdGltYXBzI25ld011bHRpbWFwCisgKiBNdWx0aW1hcHMubmV3TXVsdGltYXB9IGZhbWlseSBvZiBtZXRob2RzLiBGaW5hbGx5LCBhbm90aGVyIHBvcHVsYXIgd2F5IHRvCisgKiBvYnRhaW4gYSBtdWx0aW1hcCBpcyB1c2luZyB7QGxpbmsgTXVsdGltYXBzI2luZGV4IE11bHRpbWFwcy5pbmRleH0uIFNlZQorICogdGhlIHtAbGluayBNdWx0aW1hcHN9IGNsYXNzIGZvciB0aGVzZSBhbmQgb3RoZXIgc3RhdGljIHV0aWxpdGllcyByZWxhdGVkCisgKiB0byBtdWx0aW1hcHMuCisgKiA8cD4KKyAqIDxoMz5PdGhlciBOb3RlczwvaDM+CisgKiA8cD4KKyAqIDxwPkFzIHdpdGgge0Bjb2RlIE1hcH0sIHRoZSBiZWhhdmlvciBvZiBhIHtAY29kZSBNdWx0aW1hcH0gaXMgbm90IHNwZWNpZmllZAorICogaWYga2V5IG9iamVjdHMgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBtdWx0aW1hcCBjaGFuZ2UgaW4gYSBtYW5uZXIgdGhhdAorICogYWZmZWN0cyB7QGNvZGUgZXF1YWxzfSBjb21wYXJpc29ucy4gIFVzZSBjYXV0aW9uIGlmIG11dGFibGUgb2JqZWN0cyBhcmUgdXNlZAorICogYXMga2V5cyBpbiBhIHtAY29kZSBNdWx0aW1hcH0uCisgKiA8cD4KKyAqIDxwPkFsbCBtZXRob2RzIHRoYXQgbW9kaWZ5IHRoZSBtdWx0aW1hcCBhcmUgb3B0aW9uYWwuIFRoZSB2aWV3IGNvbGxlY3Rpb25zCisgKiByZXR1cm5lZCBieSB0aGUgbXVsdGltYXAgbWF5IG9yIG1heSBub3QgYmUgbW9kaWZpYWJsZS4gQW55IG1vZGlmaWNhdGlvbgorICogbWV0aG9kIHRoYXQgaXMgbm90IHN1cHBvcnRlZCB3aWxsIHRocm93IHtAbGluaworICogVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb259LgorICogPHA+CisgKiA8cD5TZWUgdGhlIEd1YXZhIFVzZXIgR3VpZGUgYXJ0aWNsZSBvbiA8YSBocmVmPQorICogImh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9ndWF2YS1saWJyYXJpZXMvd2lraS9OZXdDb2xsZWN0aW9uVHlwZXNFeHBsYWluZWQjTXVsdGltYXAiPgorICoge0Bjb2RlIE11bHRpbWFwfTwvYT4uCisgKgorICogQGF1dGhvciBKYXJlZCBMZXZ5CisgKiBAc2luY2UgMi4wIChpbXBvcnRlZCBmcm9tIEdvb2dsZSBDb2xsZWN0aW9ucyBMaWJyYXJ5KQorICovCitwdWJsaWMgaW50ZXJmYWNlIE11bHRpbWFwPEssIFY+IHsKKyAgICAvLyBRdWVyeSBPcGVyYXRpb25zCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Yga2V5LXZhbHVlIHBhaXJzIGluIHRoaXMgbXVsdGltYXAuCisgICAgICogPHA+CisgICAgICogPHA+PGI+Tm90ZTo8L2I+IHRoaXMgbWV0aG9kIGRvZXMgbm90IHJldHVybiB0aGUgbnVtYmVyIG9mIDxpPmRpc3RpbmN0CisgICAgICoga2V5czwvaT4gaW4gdGhlIG11bHRpbWFwLCB3aGljaCBpcyBnaXZlbiBieSB7QGNvZGUga2V5U2V0KCkuc2l6ZSgpfSBvcgorICAgICAqIHtAY29kZSBhc01hcCgpLnNpemUoKX0uIFNlZSB0aGUgb3BlbmluZyBzZWN0aW9uIG9mIHRoZSB7QGxpbmsgTXVsdGltYXB9CisgICAgICogY2xhc3MgZG9jdW1lbnRhdGlvbiBmb3IgY2xhcmlmaWNhdGlvbi4KKyAgICAgKi8KKyAgICBpbnQgc2l6ZSgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBtdWx0aW1hcCBjb250YWlucyBhdCBsZWFzdCBvbmUga2V5LXZhbHVlIHBhaXIKKyAgICAgKiB3aXRoIHRoZSBrZXkge0Bjb2RlIGtleX0uCisgICAgICovCisgICAgYm9vbGVhbiBjb250YWluc0tleShPYmplY3Qga2V5KTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgbXVsdGltYXAgY29udGFpbnMgYXQgbGVhc3Qgb25lIGtleS12YWx1ZSBwYWlyCisgICAgICogd2l0aCB0aGUgdmFsdWUge0Bjb2RlIHZhbHVlfS4KKyAgICAgKi8KKyAgICBib29sZWFuIGNvbnRhaW5zVmFsdWUoT2JqZWN0IHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgbXVsdGltYXAgY29udGFpbnMgYXQgbGVhc3Qgb25lIGtleS12YWx1ZSBwYWlyCisgICAgICogd2l0aCB0aGUga2V5IHtAY29kZSBrZXl9IGFuZCB0aGUgdmFsdWUge0Bjb2RlIHZhbHVlfS4KKyAgICAgKi8KKyAgICBib29sZWFuIGNvbnRhaW5zRW50cnkoT2JqZWN0IGtleSwgT2JqZWN0IHZhbHVlKTsKKworICAgIC8vIE1vZGlmaWNhdGlvbiBPcGVyYXRpb25zCisKKyAgICAvKioKKyAgICAgKiBTdG9yZXMgYSBrZXktdmFsdWUgcGFpciBpbiB0aGlzIG11bHRpbWFwLgorICAgICAqIDxwPgorICAgICAqIDxwPlNvbWUgbXVsdGltYXAgaW1wbGVtZW50YXRpb25zIGFsbG93IGR1cGxpY2F0ZSBrZXktdmFsdWUgcGFpcnMsIGluIHdoaWNoCisgICAgICogY2FzZSB7QGNvZGUgcHV0fSBhbHdheXMgYWRkcyBhIG5ldyBrZXktdmFsdWUgcGFpciBhbmQgaW5jcmVhc2VzIHRoZQorICAgICAqIG11bHRpbWFwIHNpemUgYnkgMS4gT3RoZXIgaW1wbGVtZW50YXRpb25zIHByb2hpYml0IGR1cGxpY2F0ZXMsIGFuZCBzdG9yaW5nCisgICAgICogYSBrZXktdmFsdWUgcGFpciB0aGF0J3MgYWxyZWFkeSBpbiB0aGUgbXVsdGltYXAgaGFzIG5vIGVmZmVjdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBtZXRob2QgaW5jcmVhc2VkIHRoZSBzaXplIG9mIHRoZSBtdWx0aW1hcCwgb3IKKyAgICAgKiB7QGNvZGUgZmFsc2V9IGlmIHRoZSBtdWx0aW1hcCBhbHJlYWR5IGNvbnRhaW5lZCB0aGUga2V5LXZhbHVlIHBhaXIgYW5kCisgICAgICogZG9lc24ndCBhbGxvdyBkdXBsaWNhdGVzCisgICAgICovCisgICAgYm9vbGVhbiBwdXQoSyBrZXksIFYgdmFsdWUpOworCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhIHNpbmdsZSBrZXktdmFsdWUgcGFpciB3aXRoIHRoZSBrZXkge0Bjb2RlIGtleX0gYW5kIHRoZSB2YWx1ZQorICAgICAqIHtAY29kZSB2YWx1ZX0gZnJvbSB0aGlzIG11bHRpbWFwLCBpZiBzdWNoIGV4aXN0cy4gSWYgbXVsdGlwbGUga2V5LXZhbHVlCisgICAgICogcGFpcnMgaW4gdGhlIG11bHRpbWFwIGZpdCB0aGlzIGRlc2NyaXB0aW9uLCB3aGljaCBvbmUgaXMgcmVtb3ZlZCBpcworICAgICAqIHVuc3BlY2lmaWVkLgorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG11bHRpbWFwIGNoYW5nZWQKKyAgICAgKi8KKyAgICBib29sZWFuIHJlbW92ZShPYmplY3Qga2V5LCBPYmplY3QgdmFsdWUpOworCisgICAgLy8gQnVsayBPcGVyYXRpb25zCisKKyAgICAvKioKKyAgICAgKiBTdG9yZXMgYSBrZXktdmFsdWUgcGFpciBpbiB0aGlzIG11bHRpbWFwIGZvciBlYWNoIG9mIHtAY29kZSB2YWx1ZXN9LCBhbGwKKyAgICAgKiB1c2luZyB0aGUgc2FtZSBrZXksIHtAY29kZSBrZXl9LiBFcXVpdmFsZW50IHRvIChidXQgZXhwZWN0ZWQgdG8gYmUgbW9yZQorICAgICAqIGVmZmljaWVudCB0aGFuKTogPHByZT4gICB7QGNvZGUKKyAgICAgKiA8cD4KKyAgICAgKiAgIGZvciAoViB2YWx1ZSA6IHZhbHVlcykgeworICAgICAqICAgICBwdXQoa2V5LCB2YWx1ZSk7CisgICAgICogICB9fTwvcHJlPgorICAgICAqIDxwPgorICAgICAqIDxwPkluIHBhcnRpY3VsYXIsIHRoaXMgaXMgYSBuby1vcCBpZiB7QGNvZGUgdmFsdWVzfSBpcyBlbXB0eS4KKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBtdWx0aW1hcCBjaGFuZ2VkCisgICAgICovCisgICAgYm9vbGVhbiBwdXRBbGwoSyBrZXksIEl0ZXJhYmxlPD8gZXh0ZW5kcyBWPiB2YWx1ZXMpOworCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhbGwgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5IHtAY29kZSBrZXl9LgorICAgICAqIDxwPgorICAgICAqIDxwPk9uY2UgdGhpcyBtZXRob2QgcmV0dXJucywge0Bjb2RlIGtleX0gd2lsbCBub3QgYmUgbWFwcGVkIHRvIGFueSB2YWx1ZXMsCisgICAgICogc28gaXQgd2lsbCBub3QgYXBwZWFyIGluIHtAbGluayAja2V5U2V0KCl9LCB7QGxpbmsgI2FzTWFwKCl9LCBvciBhbnkgb3RoZXIKKyAgICAgKiB2aWV3cy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlcyB0aGF0IHdlcmUgcmVtb3ZlZCAocG9zc2libHkgZW1wdHkpLiBUaGUgcmV0dXJuZWQKKyAgICAgKiBjb2xsZWN0aW9uIDxpPm1heTwvaT4gYmUgbW9kaWZpYWJsZSwgYnV0IHVwZGF0aW5nIGl0IHdpbGwgaGF2ZSBubworICAgICAqIGVmZmVjdCBvbiB0aGUgbXVsdGltYXAuCisgICAgICovCisgICAgQ29sbGVjdGlvbjxWPiByZW1vdmVBbGwoT2JqZWN0IGtleSk7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGFsbCBrZXktdmFsdWUgcGFpcnMgZnJvbSB0aGUgbXVsdGltYXAsIGxlYXZpbmcgaXQge0BsaW5rcGxhaW4KKyAgICAgKiAjaXNFbXB0eSBlbXB0eX0uCisgICAgICovCisgICAgdm9pZCBjbGVhcigpOworCisgICAgLy8gVmlld3MKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSB2aWV3IGNvbGxlY3Rpb24gb2YgdGhlIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGgge0Bjb2RlIGtleX0gaW4gdGhpcworICAgICAqIG11bHRpbWFwLCBpZiBhbnkuIE5vdGUgdGhhdCB3aGVuIHtAY29kZSBjb250YWluc0tleShrZXkpfSBpcyBmYWxzZSwgdGhpcworICAgICAqIHJldHVybnMgYW4gZW1wdHkgY29sbGVjdGlvbiwgbm90IHtAY29kZSBudWxsfS4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5DaGFuZ2VzIHRvIHRoZSByZXR1cm5lZCBjb2xsZWN0aW9uIHdpbGwgdXBkYXRlIHRoZSB1bmRlcmx5aW5nIG11bHRpbWFwLAorICAgICAqIGFuZCB2aWNlIHZlcnNhLgorICAgICAqLworICAgIENvbGxlY3Rpb248Vj4gZ2V0KEsga2V5KTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSB2aWV3IGNvbGxlY3Rpb24gb2YgYWxsIDxpPmRpc3RpbmN0PC9pPiBrZXlzIGNvbnRhaW5lZCBpbiB0aGlzCisgICAgICogbXVsdGltYXAuIE5vdGUgdGhhdCB0aGUga2V5IHNldCBjb250YWlucyBhIGtleSBpZiBhbmQgb25seSBpZiB0aGlzIG11bHRpbWFwCisgICAgICogbWFwcyB0aGF0IGtleSB0byBhdCBsZWFzdCBvbmUgdmFsdWUuCisgICAgICogPHA+CisgICAgICogPHA+Q2hhbmdlcyB0byB0aGUgcmV0dXJuZWQgc2V0IHdpbGwgdXBkYXRlIHRoZSB1bmRlcmx5aW5nIG11bHRpbWFwLCBhbmQKKyAgICAgKiB2aWNlIHZlcnNhLiBIb3dldmVyLCA8aT5hZGRpbmc8L2k+IHRvIHRoZSByZXR1cm5lZCBzZXQgaXMgbm90IHBvc3NpYmxlLgorICAgICAqLworICAgIFNldDxLPiBrZXlTZXQoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSB2aWV3IGNvbGxlY3Rpb24gY29udGFpbmluZyB0aGUgPGk+dmFsdWU8L2k+IGZyb20gZWFjaCBrZXktdmFsdWUKKyAgICAgKiBwYWlyIGNvbnRhaW5lZCBpbiB0aGlzIG11bHRpbWFwLCB3aXRob3V0IGNvbGxhcHNpbmcgZHVwbGljYXRlcyAoc28ge0Bjb2RlCisgICAgICogdmFsdWVzKCkuc2l6ZSgpID09IHNpemUoKX0pLgorICAgICAqIDxwPgorICAgICAqIDxwPkNoYW5nZXMgdG8gdGhlIHJldHVybmVkIGNvbGxlY3Rpb24gd2lsbCB1cGRhdGUgdGhlIHVuZGVybHlpbmcgbXVsdGltYXAsCisgICAgICogYW5kIHZpY2UgdmVyc2EuIEhvd2V2ZXIsIDxpPmFkZGluZzwvaT4gdG8gdGhlIHJldHVybmVkIGNvbGxlY3Rpb24gaXMgbm90CisgICAgICogcG9zc2libGUuCisgICAgICovCisgICAgQ29sbGVjdGlvbjxWPiB2YWx1ZXMoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSB2aWV3IGNvbGxlY3Rpb24gb2YgYWxsIGtleS12YWx1ZSBwYWlycyBjb250YWluZWQgaW4gdGhpcworICAgICAqIG11bHRpbWFwLCBhcyB7QGxpbmsgTWFwLkVudHJ5fSBpbnN0YW5jZXMuCisgICAgICogPHA+CisgICAgICogPHA+Q2hhbmdlcyB0byB0aGUgcmV0dXJuZWQgY29sbGVjdGlvbiBvciB0aGUgZW50cmllcyBpdCBjb250YWlucyB3aWxsCisgICAgICogdXBkYXRlIHRoZSB1bmRlcmx5aW5nIG11bHRpbWFwLCBhbmQgdmljZSB2ZXJzYS4gSG93ZXZlciwgPGk+YWRkaW5nPC9pPiB0bworICAgICAqIHRoZSByZXR1cm5lZCBjb2xsZWN0aW9uIGlzIG5vdCBwb3NzaWJsZS4KKyAgICAgKi8KKyAgICBDb2xsZWN0aW9uPE1hcC5FbnRyeTxLLCBWPj4gZW50cmllcygpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHZpZXcgb2YgdGhpcyBtdWx0aW1hcCBhcyBhIHtAY29kZSBNYXB9IGZyb20gZWFjaCBkaXN0aW5jdCBrZXkKKyAgICAgKiB0byB0aGUgbm9uZW1wdHkgY29sbGVjdGlvbiBvZiB0aGF0IGtleSdzIGFzc29jaWF0ZWQgdmFsdWVzLiBOb3RlIHRoYXQKKyAgICAgKiB7QGNvZGUgdGhpcy5hc01hcCgpLmdldChrKX0gaXMgZXF1aXZhbGVudCB0byB7QGNvZGUgdGhpcy5nZXQoayl9IG9ubHkgd2hlbgorICAgICAqIHtAY29kZSBrfSBpcyBhIGtleSBjb250YWluZWQgaW4gdGhlIG11bHRpbWFwOyBvdGhlcndpc2UgaXQgcmV0dXJucyB7QGNvZGUKKyAgICAgKiBudWxsfSBhcyBvcHBvc2VkIHRvIGFuIGVtcHR5IGNvbGxlY3Rpb24uCisgICAgICogPHA+CisgICAgICogPHA+Q2hhbmdlcyB0byB0aGUgcmV0dXJuZWQgbWFwIG9yIHRoZSBjb2xsZWN0aW9ucyB0aGF0IHNlcnZlIGFzIGl0cyB2YWx1ZXMKKyAgICAgKiB3aWxsIHVwZGF0ZSB0aGUgdW5kZXJseWluZyBtdWx0aW1hcCwgYW5kIHZpY2UgdmVyc2EuIFRoZSBtYXAgZG9lcyBub3QKKyAgICAgKiBzdXBwb3J0IHtAY29kZSBwdXR9IG9yIHtAY29kZSBwdXRBbGx9LCBub3IgZG8gaXRzIGVudHJpZXMgc3VwcG9ydCB7QGxpbmsKKyAgICAgKiBNYXAuRW50cnkjc2V0VmFsdWUgc2V0VmFsdWV9LgorICAgICAqLworICAgIE1hcDxLLCBDb2xsZWN0aW9uPFY+PiBhc01hcCgpOworCisgICAgLy8gQ29tcGFyaXNvbiBhbmQgaGFzaGluZworCisgICAgLyoqCisgICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBvYmplY3Qgd2l0aCB0aGlzIG11bHRpbWFwIGZvciBlcXVhbGl0eS4gVHdvCisgICAgICogbXVsdGltYXBzIGFyZSBlcXVhbCB3aGVuIHRoZWlyIG1hcCB2aWV3cywgYXMgcmV0dXJuZWQgYnkge0BsaW5rICNhc01hcH0sCisgICAgICogYXJlIGFsc28gZXF1YWwuCisgICAgICogPHA+CisgICAgICogPHA+SW4gZ2VuZXJhbCwgdHdvIG11bHRpbWFwcyB3aXRoIGlkZW50aWNhbCBrZXktdmFsdWUgbWFwcGluZ3MgbWF5IG9yIG1heQorICAgICAqIG5vdCBiZSBlcXVhbCwgZGVwZW5kaW5nIG9uIHRoZSBpbXBsZW1lbnRhdGlvbi4gRm9yIGV4YW1wbGUsIHR3bworICAgICAqIHtAbGluayBTZXRNdWx0aW1hcH0gaW5zdGFuY2VzIHdpdGggdGhlIHNhbWUga2V5LXZhbHVlIG1hcHBpbmdzIGFyZSBlcXVhbCwKKyAgICAgKiBidXQgZXF1YWxpdHkgb2YgdHdvIHtAbGluayBMaXN0TXVsdGltYXB9IGluc3RhbmNlcyBkZXBlbmRzIG9uIHRoZSBvcmRlcmluZworICAgICAqIG9mIHRoZSB2YWx1ZXMgZm9yIGVhY2gga2V5LgorICAgICAqIDxwPgorICAgICAqIDxwPkEgbm9uLWVtcHR5IHtAbGluayBTZXRNdWx0aW1hcH0gY2Fubm90IGJlIGVxdWFsIHRvIGEgbm9uLWVtcHR5CisgICAgICoge0BsaW5rIExpc3RNdWx0aW1hcH0sIHNpbmNlIHRoZWlyIHtAbGluayAjYXNNYXB9IHZpZXdzIGNvbnRhaW4gdW5lcXVhbAorICAgICAqIGNvbGxlY3Rpb25zIGFzIHZhbHVlcy4gSG93ZXZlciwgYW55IHR3byBlbXB0eSBtdWx0aW1hcHMgYXJlIGVxdWFsLCBiZWNhdXNlCisgICAgICogdGhleSBib3RoIGhhdmUgZW1wdHkge0BsaW5rICNhc01hcH0gdmlld3MuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaik7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBoYXNoIGNvZGUgZm9yIHRoaXMgbXVsdGltYXAuCisgICAgICogPHA+CisgICAgICogPHA+VGhlIGhhc2ggY29kZSBvZiBhIG11bHRpbWFwIGlzIGRlZmluZWQgYXMgdGhlIGhhc2ggY29kZSBvZiB0aGUgbWFwIHZpZXcsCisgICAgICogYXMgcmV0dXJuZWQgYnkge0BsaW5rIE11bHRpbWFwI2FzTWFwfS4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5JbiBnZW5lcmFsLCB0d28gbXVsdGltYXBzIHdpdGggaWRlbnRpY2FsIGtleS12YWx1ZSBtYXBwaW5ncyBtYXkgb3IgbWF5CisgICAgICogbm90IGhhdmUgdGhlIHNhbWUgaGFzaCBjb2RlcywgZGVwZW5kaW5nIG9uIHRoZSBpbXBsZW1lbnRhdGlvbi4gRm9yCisgICAgICogZXhhbXBsZSwgdHdvIHtAbGluayBTZXRNdWx0aW1hcH0gaW5zdGFuY2VzIHdpdGggdGhlIHNhbWUga2V5LXZhbHVlCisgICAgICogbWFwcGluZ3Mgd2lsbCBoYXZlIHRoZSBzYW1lIHtAY29kZSBoYXNoQ29kZX0sIGJ1dCB0aGUge0Bjb2RlIGhhc2hDb2RlfQorICAgICAqIG9mIHtAbGluayBMaXN0TXVsdGltYXB9IGluc3RhbmNlcyBkZXBlbmRzIG9uIHRoZSBvcmRlcmluZyBvZiB0aGUgdmFsdWVzCisgICAgICogZm9yIGVhY2gga2V5LgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIGludCBoYXNoQ29kZSgpOworfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9NdWx0aW1hcHMuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvTXVsdGltYXBzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmExYTkzYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvTXVsdGltYXBzLmphdmEKQEAgLTAsMCArMSwxNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEd1YXZhIEF1dGhvcnMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmE7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFic3RyYWN0Q29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOworCitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworCisvKioKKyAqIFByb3ZpZGVzIHN0YXRpYyBtZXRob2RzIGFjdGluZyBvbiBvciBnZW5lcmF0aW5nIGEge0Bjb2RlIE11bHRpbWFwfS4KKyAqIDxwPgorICogPHA+U2VlIHRoZSBHdWF2YSBVc2VyIEd1aWRlIGFydGljbGUgb24gPGEgaHJlZj0KKyAqICJodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ3VhdmEtbGlicmFyaWVzL3dpa2kvQ29sbGVjdGlvblV0aWxpdGllc0V4cGxhaW5lZCNNdWx0aW1hcHMiPgorICoge0Bjb2RlIE11bHRpbWFwc308L2E+LgorICoKKyAqIEBhdXRob3IgSmFyZWQgTGV2eQorICogQGF1dGhvciBSb2JlcnQgS29uaWdzYmVyZworICogQGF1dGhvciBNaWtlIEJvc3RvY2sKKyAqIEBhdXRob3IgTG91aXMgV2Fzc2VybWFuCisgKiBAc2luY2UgMi4wIChpbXBvcnRlZCBmcm9tIEdvb2dsZSBDb2xsZWN0aW9ucyBMaWJyYXJ5KQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTXVsdGltYXBzIHsKKyAgICBwcml2YXRlIE11bHRpbWFwcygpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAY29kZSBMaXN0TXVsdGltYXB9IHRoYXQgdXNlcyB0aGUgcHJvdmlkZWQgbWFwIGFuZCBmYWN0b3J5LgorICAgICAqIEl0IGNhbiBnZW5lcmF0ZSBhIG11bHRpbWFwIGJhc2VkIG9uIGFyYml0cmFyeSB7QGxpbmsgTWFwfSBhbmQge0BsaW5rIExpc3R9CisgICAgICogY2xhc3Nlcy4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5UaGUge0Bjb2RlIGZhY3Rvcnl9LWdlbmVyYXRlZCBhbmQge0Bjb2RlIG1hcH0gY2xhc3NlcyBkZXRlcm1pbmUgdGhlCisgICAgICogbXVsdGltYXAgaXRlcmF0aW9uIG9yZGVyLiBUaGV5IGFsc28gc3BlY2lmeSB0aGUgYmVoYXZpb3Igb2YgdGhlCisgICAgICoge0Bjb2RlIGVxdWFsc30sIHtAY29kZSBoYXNoQ29kZX0sIGFuZCB7QGNvZGUgdG9TdHJpbmd9IG1ldGhvZHMgZm9yIHRoZQorICAgICAqIG11bHRpbWFwIGFuZCBpdHMgcmV0dXJuZWQgdmlld3MuIFRoZSBtdWx0aW1hcCdzIHtAY29kZSBnZXR9LCB7QGNvZGUKKyAgICAgKiByZW1vdmVBbGx9LCBhbmQge0Bjb2RlIHJlcGxhY2VWYWx1ZXN9IG1ldGhvZHMgcmV0dXJuIHtAY29kZSBSYW5kb21BY2Nlc3N9CisgICAgICogbGlzdHMgaWYgdGhlIGZhY3RvcnkgZG9lcy4gSG93ZXZlciwgdGhlIG11bHRpbWFwJ3Mge0Bjb2RlIGdldH0gbWV0aG9kCisgICAgICogcmV0dXJucyBpbnN0YW5jZXMgb2YgYSBkaWZmZXJlbnQgY2xhc3MgdGhhbiBkb2VzIHtAY29kZSBmYWN0b3J5LmdldCgpfS4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5UaGUgbXVsdGltYXAgaXMgc2VyaWFsaXphYmxlIGlmIHtAY29kZSBtYXB9LCB7QGNvZGUgZmFjdG9yeX0sIHRoZQorICAgICAqIGxpc3RzIGdlbmVyYXRlZCBieSB7QGNvZGUgZmFjdG9yeX0sIGFuZCB0aGUgbXVsdGltYXAgY29udGVudHMgYXJlIGFsbAorICAgICAqIHNlcmlhbGl6YWJsZS4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5UaGUgbXVsdGltYXAgaXMgbm90IHRocmVhZHNhZmUgd2hlbiBhbnkgY29uY3VycmVudCBvcGVyYXRpb25zIHVwZGF0ZSB0aGUKKyAgICAgKiBtdWx0aW1hcCwgZXZlbiBpZiB7QGNvZGUgbWFwfSBhbmQgdGhlIGluc3RhbmNlcyBnZW5lcmF0ZWQgYnkKKyAgICAgKiB7QGNvZGUgZmFjdG9yeX0gYXJlLiBDb25jdXJyZW50IHJlYWQgb3BlcmF0aW9ucyB3aWxsIHdvcmsgY29ycmVjdGx5LiBUbworICAgICAqIGFsbG93IGNvbmN1cnJlbnQgdXBkYXRlIG9wZXJhdGlvbnMsIHdyYXAgdGhlIG11bHRpbWFwIHdpdGggYSBjYWxsIHRvCisgICAgICoge0BsaW5rICNzeW5jaHJvbml6ZWRMaXN0TXVsdGltYXB9LgorICAgICAqIDxwPgorICAgICAqIDxwPkNhbGwgdGhpcyBtZXRob2Qgb25seSB3aGVuIHRoZSBzaW1wbGVyIG1ldGhvZHMKKyAgICAgKiB7QGxpbmsgQXJyYXlMaXN0TXVsdGltYXAjY3JlYXRlKCl9IGFuZCB7QGxpbmsgTGlua2VkTGlzdE11bHRpbWFwI2NyZWF0ZSgpfQorICAgICAqIHdvbid0IHN1ZmZpY2UuCisgICAgICogPHA+CisgICAgICogPHA+Tm90ZTogdGhlIG11bHRpbWFwIGFzc3VtZXMgY29tcGxldGUgb3duZXJzaGlwIG92ZXIgb2Yge0Bjb2RlIG1hcH0gYW5kCisgICAgICogdGhlIGxpc3RzIHJldHVybmVkIGJ5IHtAY29kZSBmYWN0b3J5fS4gVGhvc2Ugb2JqZWN0cyBzaG91bGQgbm90IGJlIG1hbnVhbGx5CisgICAgICogdXBkYXRlZCwgdGhleSBzaG91bGQgYmUgZW1wdHkgd2hlbiBwcm92aWRlZCwgYW5kIHRoZXkgc2hvdWxkIG5vdCB1c2Ugc29mdCwKKyAgICAgKiB3ZWFrLCBvciBwaGFudG9tIHJlZmVyZW5jZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwICAgICBwbGFjZSB0byBzdG9yZSB0aGUgbWFwcGluZyBmcm9tIGVhY2gga2V5IHRvIGl0cyBjb3JyZXNwb25kaW5nCisgICAgICogICAgICAgICAgICAgICAgdmFsdWVzCisgICAgICogQHBhcmFtIGZhY3Rvcnkgc3VwcGxpZXIgb2YgbmV3LCBlbXB0eSBsaXN0cyB0aGF0IHdpbGwgZWFjaCBob2xkIGFsbCB2YWx1ZXMKKyAgICAgKiAgICAgICAgICAgICAgICBmb3IgYSBnaXZlbiBrZXkKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB7QGNvZGUgbWFwfSBpcyBub3QgZW1wdHkKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxLLCBWPiBMaXN0TXVsdGltYXA8SywgVj4gbmV3TGlzdE11bHRpbWFwKAorICAgICAgICAgICAgTWFwPEssIENvbGxlY3Rpb248Vj4+IG1hcCwgZmluYWwgU3VwcGxpZXI8PyBleHRlbmRzIExpc3Q8Vj4+IGZhY3RvcnkpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDdXN0b21MaXN0TXVsdGltYXA8SywgVj4obWFwLCBmYWN0b3J5KTsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbGVhbiBlcXVhbHNJbXBsKE11bHRpbWFwPD8sID8+IG11bHRpbWFwLCBPYmplY3Qgb2JqZWN0KSB7CisgICAgICAgIGlmIChvYmplY3QgPT0gbXVsdGltYXApIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBNdWx0aW1hcCkgeworICAgICAgICAgICAgTXVsdGltYXA8PywgPz4gdGhhdCA9IChNdWx0aW1hcDw/LCA/Pikgb2JqZWN0OworICAgICAgICAgICAgcmV0dXJuIG11bHRpbWFwLmFzTWFwKCkuZXF1YWxzKHRoYXQuYXNNYXAoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEN1c3RvbUxpc3RNdWx0aW1hcDxLLCBWPgorICAgICAgICAgICAgZXh0ZW5kcyBBYnN0cmFjdExpc3RNdWx0aW1hcDxLLCBWPiB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDA7CisgICAgICAgIHRyYW5zaWVudCBTdXBwbGllcjw/IGV4dGVuZHMgTGlzdDxWPj4gZmFjdG9yeTsKKworICAgICAgICBDdXN0b21MaXN0TXVsdGltYXAoTWFwPEssIENvbGxlY3Rpb248Vj4+IG1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1cHBsaWVyPD8gZXh0ZW5kcyBMaXN0PFY+PiBmYWN0b3J5KSB7CisgICAgICAgICAgICBzdXBlcihtYXApOworICAgICAgICAgICAgdGhpcy5mYWN0b3J5ID0gY2hlY2tOb3ROdWxsKGZhY3RvcnkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBMaXN0PFY+IGNyZWF0ZUNvbGxlY3Rpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gZmFjdG9yeS5nZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VyaWFsRGF0YSB0aGUgZmFjdG9yeSBhbmQgdGhlIGJhY2tpbmcgbWFwCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoT2JqZWN0T3V0cHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHN0cmVhbS5kZWZhdWx0V3JpdGVPYmplY3QoKTsKKyAgICAgICAgICAgIHN0cmVhbS53cml0ZU9iamVjdChmYWN0b3J5KTsKKyAgICAgICAgICAgIHN0cmVhbS53cml0ZU9iamVjdChiYWNraW5nTWFwKCkpOworICAgICAgICB9CisKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIC8vIHJlYWRpbmcgZGF0YSBzdG9yZWQgYnkgd3JpdGVPYmplY3QKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoT2JqZWN0SW5wdXRTdHJlYW0gc3RyZWFtKQorICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBzdHJlYW0uZGVmYXVsdFJlYWRPYmplY3QoKTsKKyAgICAgICAgICAgIGZhY3RvcnkgPSAoU3VwcGxpZXI8PyBleHRlbmRzIExpc3Q8Vj4+KSBzdHJlYW0ucmVhZE9iamVjdCgpOworICAgICAgICAgICAgTWFwPEssIENvbGxlY3Rpb248Vj4+IG1hcCA9IChNYXA8SywgQ29sbGVjdGlvbjxWPj4pIHN0cmVhbS5yZWFkT2JqZWN0KCk7CisgICAgICAgICAgICBzZXRNYXAobWFwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgc2tlbGV0b24gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIE11bHRpbWFwI2VudHJpZXMoKX0uCisgICAgICovCisgICAgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIEVudHJpZXM8SywgVj4gZXh0ZW5kcworICAgICAgICAgICAgQWJzdHJhY3RDb2xsZWN0aW9uPEVudHJ5PEssIFY+PiB7CisgICAgICAgIGFic3RyYWN0IE11bHRpbWFwPEssIFY+IG11bHRpbWFwKCk7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtdWx0aW1hcCgpLnNpemUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgeworICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBNYXAuRW50cnkpIHsKKyAgICAgICAgICAgICAgICBFbnRyeTw/LCA/PiBlbnRyeSA9IChFbnRyeTw/LCA/PikgbzsKKyAgICAgICAgICAgICAgICByZXR1cm4gbXVsdGltYXAoKS5jb250YWluc0VudHJ5KGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgTWFwLkVudHJ5KSB7CisgICAgICAgICAgICAgICAgRW50cnk8PywgPz4gZW50cnkgPSAoRW50cnk8PywgPz4pIG87CisgICAgICAgICAgICAgICAgcmV0dXJuIG11bHRpbWFwKCkucmVtb3ZlKGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgICAgIG11bHRpbWFwKCkuY2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRPRE8oamxldnkpOiBDcmVhdGUgbWV0aG9kcyB0aGF0IGZpbHRlciBhIFNvcnRlZFNldE11bHRpbWFwLgorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9OYXR1cmFsT3JkZXJpbmcuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvTmF0dXJhbE9yZGVyaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNiYzM1OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvTmF0dXJhbE9yZGVyaW5nLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgR3VhdmEgQXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YTsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworCisvKioKKyAqIEFuIG9yZGVyaW5nIHRoYXQgdXNlcyB0aGUgbmF0dXJhbCBvcmRlciBvZiB0aGUgdmFsdWVzLgorICovCitAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgLy8gVE9ETyhrZXZpbmIpOiB0aGUgcmlnaHQgd2F5IHRvIGV4cGxhaW4gdGhpcz8/CitmaW5hbCBjbGFzcyBOYXR1cmFsT3JkZXJpbmcKKyAgICAgICAgZXh0ZW5kcyBPcmRlcmluZzxDb21wYXJhYmxlPiBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisgICAgc3RhdGljIGZpbmFsIE5hdHVyYWxPcmRlcmluZyBJTlNUQU5DRSA9IG5ldyBOYXR1cmFsT3JkZXJpbmcoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAwOworCisgICAgcHJpdmF0ZSBOYXR1cmFsT3JkZXJpbmcoKSB7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBjb21wYXJlKENvbXBhcmFibGUgbGVmdCwgQ29tcGFyYWJsZSByaWdodCkgeworICAgICAgICBjaGVja05vdE51bGwobGVmdCk7IC8vIGZvciBHV1QKKyAgICAgICAgY2hlY2tOb3ROdWxsKHJpZ2h0KTsKKyAgICAgICAgcmV0dXJuIGxlZnQuY29tcGFyZVRvKHJpZ2h0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFMgZXh0ZW5kcyBDb21wYXJhYmxlPiBPcmRlcmluZzxTPiByZXZlcnNlKCkgeworICAgICAgICByZXR1cm4gKE9yZGVyaW5nPFM+KSBSZXZlcnNlTmF0dXJhbE9yZGVyaW5nLklOU1RBTkNFOworICAgIH0KKworICAgIC8vIHByZXNlcnZpbmcgc2luZ2xldG9uLW5lc3MgZ2l2ZXMgZXF1YWxzKCkvaGFzaENvZGUoKSBmb3IgZnJlZQorICAgIHByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgeworICAgICAgICByZXR1cm4gSU5TVEFOQ0U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJPcmRlcmluZy5uYXR1cmFsKCkiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvTnVsbHNGaXJzdE9yZGVyaW5nLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL051bGxzRmlyc3RPcmRlcmluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYzNjYjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL051bGxzRmlyc3RPcmRlcmluZy5qYXZhCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEd1YXZhIEF1dGhvcnMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmE7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworLyoqCisgKiBBbiBvcmRlcmluZyB0aGF0IHRyZWF0cyB7QGNvZGUgbnVsbH0gYXMgbGVzcyB0aGFuIGFsbCBvdGhlciB2YWx1ZXMuCisgKi8KK2ZpbmFsIGNsYXNzIE51bGxzRmlyc3RPcmRlcmluZzxUPiBleHRlbmRzIE9yZGVyaW5nPFQ+IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAwOworICAgIHByaXZhdGUgZmluYWwgT3JkZXJpbmc8PyBzdXBlciBUPiBvcmRlcmluZzsKKworICAgIE51bGxzRmlyc3RPcmRlcmluZyhPcmRlcmluZzw/IHN1cGVyIFQ+IG9yZGVyaW5nKSB7CisgICAgICAgIHRoaXMub3JkZXJpbmcgPSBvcmRlcmluZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGNvbXBhcmUoVCBsZWZ0LCBUIHJpZ2h0KSB7CisgICAgICAgIGlmIChsZWZ0ID09IHJpZ2h0KSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAobGVmdCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gUklHSFRfSVNfR1JFQVRFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAocmlnaHQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIExFRlRfSVNfR1JFQVRFUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb3JkZXJpbmcuY29tcGFyZShsZWZ0LCByaWdodCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxTIGV4dGVuZHMgVD4gT3JkZXJpbmc8Uz4gcmV2ZXJzZSgpIHsKKyAgICAgICAgLy8gb3JkZXJpbmcucmV2ZXJzZSgpIG1pZ2h0IGJlIG9wdGltaXplZCwgc28gbGV0IGl0IGRvIGl0cyB0aGluZworICAgICAgICByZXR1cm4gb3JkZXJpbmcucmV2ZXJzZSgpLm51bGxzTGFzdCgpOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSAvLyBzdGlsbCBuZWVkIHRoZSByaWdodCB3YXkgdG8gZXhwbGFpbiB0aGlzCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxTIGV4dGVuZHMgVD4gT3JkZXJpbmc8Uz4gbnVsbHNGaXJzdCgpIHsKKyAgICAgICAgcmV0dXJuIChPcmRlcmluZzxTPikgdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFMgZXh0ZW5kcyBUPiBPcmRlcmluZzxTPiBudWxsc0xhc3QoKSB7CisgICAgICAgIHJldHVybiBvcmRlcmluZy5udWxsc0xhc3QoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgeworICAgICAgICBpZiAob2JqZWN0ID09IHRoaXMpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBOdWxsc0ZpcnN0T3JkZXJpbmcpIHsKKyAgICAgICAgICAgIE51bGxzRmlyc3RPcmRlcmluZzw/PiB0aGF0ID0gKE51bGxzRmlyc3RPcmRlcmluZzw/Pikgb2JqZWN0OworICAgICAgICAgICAgcmV0dXJuIHRoaXMub3JkZXJpbmcuZXF1YWxzKHRoYXQub3JkZXJpbmcpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gb3JkZXJpbmcuaGFzaENvZGUoKSBeIDk1NzY5MjUzMjsgLy8gbWVhbmluZ2xlc3MKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gb3JkZXJpbmcgKyAiLm51bGxzRmlyc3QoKSI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9OdWxsc0xhc3RPcmRlcmluZy5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9OdWxsc0xhc3RPcmRlcmluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNWUxZjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL051bGxzTGFzdE9yZGVyaW5nLmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgR3VhdmEgQXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YTsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCisvKioKKyAqIEFuIG9yZGVyaW5nIHRoYXQgdHJlYXRzIHtAY29kZSBudWxsfSBhcyBncmVhdGVyIHRoYW4gYWxsIG90aGVyIHZhbHVlcy4KKyAqLworZmluYWwgY2xhc3MgTnVsbHNMYXN0T3JkZXJpbmc8VD4gZXh0ZW5kcyBPcmRlcmluZzxUPiBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMDsKKyAgICBwcml2YXRlIGZpbmFsIE9yZGVyaW5nPD8gc3VwZXIgVD4gb3JkZXJpbmc7CisKKyAgICBOdWxsc0xhc3RPcmRlcmluZyhPcmRlcmluZzw/IHN1cGVyIFQ+IG9yZGVyaW5nKSB7CisgICAgICAgIHRoaXMub3JkZXJpbmcgPSBvcmRlcmluZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGNvbXBhcmUoVCBsZWZ0LCBUIHJpZ2h0KSB7CisgICAgICAgIGlmIChsZWZ0ID09IHJpZ2h0KSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAobGVmdCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gTEVGVF9JU19HUkVBVEVSOworICAgICAgICB9CisgICAgICAgIGlmIChyaWdodCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gUklHSFRfSVNfR1JFQVRFUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb3JkZXJpbmcuY29tcGFyZShsZWZ0LCByaWdodCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxTIGV4dGVuZHMgVD4gT3JkZXJpbmc8Uz4gcmV2ZXJzZSgpIHsKKyAgICAgICAgLy8gb3JkZXJpbmcucmV2ZXJzZSgpIG1pZ2h0IGJlIG9wdGltaXplZCwgc28gbGV0IGl0IGRvIGl0cyB0aGluZworICAgICAgICByZXR1cm4gb3JkZXJpbmcucmV2ZXJzZSgpLm51bGxzRmlyc3QoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFMgZXh0ZW5kcyBUPiBPcmRlcmluZzxTPiBudWxsc0ZpcnN0KCkgeworICAgICAgICByZXR1cm4gb3JkZXJpbmcubnVsbHNGaXJzdCgpOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSAvLyBzdGlsbCBuZWVkIHRoZSByaWdodCB3YXkgdG8gZXhwbGFpbiB0aGlzCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxTIGV4dGVuZHMgVD4gT3JkZXJpbmc8Uz4gbnVsbHNMYXN0KCkgeworICAgICAgICByZXR1cm4gKE9yZGVyaW5nPFM+KSB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7CisgICAgICAgIGlmIChvYmplY3QgPT0gdGhpcykgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE51bGxzTGFzdE9yZGVyaW5nKSB7CisgICAgICAgICAgICBOdWxsc0xhc3RPcmRlcmluZzw/PiB0aGF0ID0gKE51bGxzTGFzdE9yZGVyaW5nPD8+KSBvYmplY3Q7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5vcmRlcmluZy5lcXVhbHModGhhdC5vcmRlcmluZyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIHJldHVybiBvcmRlcmluZy5oYXNoQ29kZSgpIF4gLTkyMTIxMDI5NjsgLy8gbWVhbmluZ2xlc3MKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gb3JkZXJpbmcgKyAiLm51bGxzTGFzdCgpIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL09iamVjdEFycmF5cy5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9PYmplY3RBcnJheXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDRhMjU1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9PYmplY3RBcnJheXMuamF2YQpAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBHdWF2YSBBdXRob3JzCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhOworCisvKioKKyAqIFN0YXRpYyB1dGlsaXR5IG1ldGhvZHMgcGVydGFpbmluZyB0byBvYmplY3QgYXJyYXlzLgorICoKKyAqIEBhdXRob3IgS2V2aW4gQm91cnJpbGxpb24KKyAqIEBzaW5jZSAyLjAgKGltcG9ydGVkIGZyb20gR29vZ2xlIENvbGxlY3Rpb25zIExpYnJhcnkpCisgKi8KK2ZpbmFsIGNsYXNzIE9iamVjdEFycmF5cyB7CisgICAgc3RhdGljIGZpbmFsIE9iamVjdFtdIEVNUFRZX0FSUkFZID0gbmV3IE9iamVjdFswXTsKKworICAgIHByaXZhdGUgT2JqZWN0QXJyYXlzKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBuZXcgYXJyYXkgb2YgdGhlIGdpdmVuIGxlbmd0aCB3aXRoIHRoZSBzYW1lIHR5cGUgYXMgYSByZWZlcmVuY2UKKyAgICAgKiBhcnJheS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWZlcmVuY2UgYW55IGFycmF5IG9mIHRoZSBkZXNpcmVkIHR5cGUKKyAgICAgKiBAcGFyYW0gbGVuZ3RoICAgIHRoZSBsZW5ndGggb2YgdGhlIG5ldyBhcnJheQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFRbXSBuZXdBcnJheShUW10gcmVmZXJlbmNlLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIHJldHVybiBQbGF0Zm9ybS5uZXdBcnJheShyZWZlcmVuY2UsIGxlbmd0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR1dUIHNhZmUgdmVyc2lvbiBvZiBBcnJheXMuY29weU9mLgorICAgICAqLworICAgIHN0YXRpYyA8VD4gVFtdIGFycmF5c0NvcHlPZihUW10gb3JpZ2luYWwsIGludCBuZXdMZW5ndGgpIHsKKyAgICAgICAgVFtdIGNvcHkgPSBuZXdBcnJheShvcmlnaW5hbCwgbmV3TGVuZ3RoKTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShvcmlnaW5hbCwgMCwgY29weSwgMCwgTWF0aC5taW4ob3JpZ2luYWwubGVuZ3RoLCBuZXdMZW5ndGgpKTsKKyAgICAgICAgcmV0dXJuIGNvcHk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9PcmRlcmluZy5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9PcmRlcmluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NDRlMzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL09yZGVyaW5nLmphdmEKQEAgLTAsMCArMSwzMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEd1YXZhIEF1dGhvcnMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKKworLyoqCisgKiBBIGNvbXBhcmF0b3IsIHdpdGggYWRkaXRpb25hbCBtZXRob2RzIHRvIHN1cHBvcnQgY29tbW9uIG9wZXJhdGlvbnMuIFRoaXMgaXMKKyAqIGFuICJlbnJpY2hlZCIgdmVyc2lvbiBvZiB7QGNvZGUgQ29tcGFyYXRvcn0sIGluIHRoZSBzYW1lIHNlbnNlIHRoYXQge0BsaW5rCisgKiBGbHVlbnRJdGVyYWJsZX0gaXMgYW4gZW5yaWNoZWQge0BsaW5rIEl0ZXJhYmxlfS4KKyAqIDxwPgorICogPHA+VGhlIGNvbW1vbiB3YXlzIHRvIGdldCBhbiBpbnN0YW5jZSBvZiB7QGNvZGUgT3JkZXJpbmd9IGFyZToKKyAqIDxwPgorICogPHVsPgorICogPGxpPlN1YmNsYXNzIGl0IGFuZCBpbXBsZW1lbnQge0BsaW5rICNjb21wYXJlfSBpbnN0ZWFkIG9mIGltcGxlbWVudGluZworICoge0BsaW5rIENvbXBhcmF0b3J9IGRpcmVjdGx5CisgKiA8bGk+UGFzcyBhIDxpPnByZS1leGlzdGluZzwvaT4ge0BsaW5rIENvbXBhcmF0b3J9IGluc3RhbmNlIHRvIHtAbGluaworICogI2Zyb20oQ29tcGFyYXRvcil9CisgKiA8bGk+VXNlIHRoZSBuYXR1cmFsIG9yZGVyaW5nLCB7QGxpbmsgT3JkZXJpbmcjbmF0dXJhbH0KKyAqIDwvdWw+CisgKiA8cD4KKyAqIDxwPlRoZW4geW91IGNhbiB1c2UgdGhlIDxpPmNoYWluaW5nPC9pPiBtZXRob2RzIHRvIGdldCBhbiBhbHRlcmVkIHZlcnNpb24gb2YKKyAqIHRoYXQge0Bjb2RlIE9yZGVyaW5nfSwgaW5jbHVkaW5nOgorICogPHA+CisgKiA8dWw+CisgKiA8bGk+e0BsaW5rICNyZXZlcnNlfQorICogPGxpPntAbGluayAjY29tcG91bmQoQ29tcGFyYXRvcil9CisgKiA8bGk+e0BsaW5rICNvblJlc3VsdE9mKEZ1bmN0aW9uKX0KKyAqIDxsaT57QGxpbmsgI251bGxzRmlyc3R9IC8ge0BsaW5rICNudWxsc0xhc3R9CisgKiA8L3VsPgorICogPHA+CisgKiA8cD5GaW5hbGx5LCB1c2UgdGhlIHJlc3VsdGluZyB7QGNvZGUgT3JkZXJpbmd9IGFueXdoZXJlIGEge0BsaW5rIENvbXBhcmF0b3J9CisgKiBpcyByZXF1aXJlZCwgb3IgdXNlIGFueSBvZiBpdHMgc3BlY2lhbCBvcGVyYXRpb25zLCBzdWNoIGFzOjwvcD4KKyAqIDxwPgorICogPHVsPgorICogPGxpPntAbGluayAjaW1tdXRhYmxlU29ydGVkQ29weX0KKyAqIDxsaT57QGxpbmsgI2lzT3JkZXJlZH0gLyB7QGxpbmsgI2lzU3RyaWN0bHlPcmRlcmVkfQorICogPGxpPntAbGluayAjbWlufSAvIHtAbGluayAjbWF4fQorICogPC91bD4KKyAqIDxwPgorICogPHA+RXhjZXB0IGFzIG5vdGVkLCB0aGUgb3JkZXJpbmdzIHJldHVybmVkIGJ5IHRoZSBmYWN0b3J5IG1ldGhvZHMgb2YgdGhpcworICogY2xhc3MgYXJlIHNlcmlhbGl6YWJsZSBpZiBhbmQgb25seSBpZiB0aGUgcHJvdmlkZWQgaW5zdGFuY2VzIHRoYXQgYmFjayB0aGVtCisgKiBhcmUuIEZvciBleGFtcGxlLCBpZiB7QGNvZGUgb3JkZXJpbmd9IGFuZCB7QGNvZGUgZnVuY3Rpb259IGNhbiB0aGVtc2VsdmVzIGJlCisgKiBzZXJpYWxpemVkLCB0aGVuIHtAY29kZSBvcmRlcmluZy5vblJlc3VsdE9mKGZ1bmN0aW9uKX0gY2FuIGFzIHdlbGwuCisgKiA8cD4KKyAqIDxwPlNlZSB0aGUgR3VhdmEgVXNlciBHdWlkZSBhcnRpY2xlIG9uIDxhIGhyZWY9CisgKiAiaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2d1YXZhLWxpYnJhcmllcy93aWtpL09yZGVyaW5nRXhwbGFpbmVkIj4KKyAqIHtAY29kZSBPcmRlcmluZ308L2E+LgorICoKKyAqIEBhdXRob3IgSmVzc2UgV2lsc29uCisgKiBAYXV0aG9yIEtldmluIEJvdXJyaWxsaW9uCisgKiBAc2luY2UgMi4wIChpbXBvcnRlZCBmcm9tIEdvb2dsZSBDb2xsZWN0aW9ucyBMaWJyYXJ5KQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgT3JkZXJpbmc8VD4gaW1wbGVtZW50cyBDb21wYXJhdG9yPFQ+IHsKKyAgICAvLyBOYXR1cmFsIG9yZGVyCisKKyAgICAvLyBOZXZlciBtYWtlIHRoZXNlIHB1YmxpYworICAgIHN0YXRpYyBmaW5hbCBpbnQgTEVGVF9JU19HUkVBVEVSID0gMTsKKworICAgIC8vIFN0YXRpYyBmYWN0b3JpZXMKKyAgICBzdGF0aWMgZmluYWwgaW50IFJJR0hUX0lTX0dSRUFURVIgPSAtMTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyAob25seSBpbnZva2FibGUgYnkgdGhlIHN1YmNsYXNzCisgICAgICogY29uc3RydWN0b3IsIHR5cGljYWxseSBpbXBsaWNpdCkuCisgICAgICovCisgICAgT3JkZXJpbmcoKSB7CisgICAgfQorCisgICAgLy8gSW5zdGFuY2UtYmFzZWQgZmFjdG9yaWVzIChhbmQgYW55IHN0YXRpYyBlcXVpdmFsZW50cykKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzZXJpYWxpemFibGUgb3JkZXJpbmcgdGhhdCB1c2VzIHRoZSBuYXR1cmFsIG9yZGVyIG9mIHRoZSB2YWx1ZXMuCisgICAgICogVGhlIG9yZGVyaW5nIHRocm93cyBhIHtAbGluayBOdWxsUG9pbnRlckV4Y2VwdGlvbn0gd2hlbiBwYXNzZWQgYSBudWxsCisgICAgICogcGFyYW1ldGVyLgorICAgICAqIDxwPgorICAgICAqIDxwPlRoZSB0eXBlIHNwZWNpZmljYXRpb24gaXMge0Bjb2RlIDxDIGV4dGVuZHMgQ29tcGFyYWJsZT59LCBpbnN0ZWFkIG9mCisgICAgICogdGhlIHRlY2huaWNhbGx5IGNvcnJlY3Qge0Bjb2RlIDxDIGV4dGVuZHMgQ29tcGFyYWJsZTw/IHN1cGVyIEM+Pn0sIHRvCisgICAgICogc3VwcG9ydCBsZWdhY3kgdHlwZXMgZnJvbSBiZWZvcmUgSmF2YSA1LgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSAvLyBUT0RPKGtldmluYik6IHJpZ2h0IHdheSB0byBleHBsYWluIHRoaXM/PworICAgIHB1YmxpYyBzdGF0aWMgPEMgZXh0ZW5kcyBDb21wYXJhYmxlPiBPcmRlcmluZzxDPiBuYXR1cmFsKCkgeworICAgICAgICByZXR1cm4gKE9yZGVyaW5nPEM+KSBOYXR1cmFsT3JkZXJpbmcuSU5TVEFOQ0U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBvcmRlcmluZyBiYXNlZCBvbiBhbiA8aT5leGlzdGluZzwvaT4gY29tcGFyYXRvciBpbnN0YW5jZS4gTm90ZQorICAgICAqIHRoYXQgaXQgaXMgdW5uZWNlc3NhcnkgdG8gY3JlYXRlIGEgPGk+bmV3PC9pPiBhbm9ueW1vdXMgaW5uZXIgY2xhc3MKKyAgICAgKiBpbXBsZW1lbnRpbmcge0Bjb2RlIENvbXBhcmF0b3J9IGp1c3QgdG8gcGFzcyBpdCBpbiBoZXJlLiBJbnN0ZWFkLCBzaW1wbHkKKyAgICAgKiBzdWJjbGFzcyB7QGNvZGUgT3JkZXJpbmd9IGFuZCBpbXBsZW1lbnQgaXRzIHtAY29kZSBjb21wYXJlfSBtZXRob2QKKyAgICAgKiBkaXJlY3RseS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb21wYXJhdG9yIHRoZSBjb21wYXJhdG9yIHRoYXQgZGVmaW5lcyB0aGUgb3JkZXIKKyAgICAgKiBAcmV0dXJuIGNvbXBhcmF0b3IgaXRzZWxmIGlmIGl0IGlzIGFscmVhZHkgYW4ge0Bjb2RlIE9yZGVyaW5nfTsgb3RoZXJ3aXNlCisgICAgICogYW4gb3JkZXJpbmcgdGhhdCB3cmFwcyB0aGF0IGNvbXBhcmF0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUPiBPcmRlcmluZzxUPiBmcm9tKENvbXBhcmF0b3I8VD4gY29tcGFyYXRvcikgeworICAgICAgICByZXR1cm4gKGNvbXBhcmF0b3IgaW5zdGFuY2VvZiBPcmRlcmluZykKKyAgICAgICAgICAgICAgICA/IChPcmRlcmluZzxUPikgY29tcGFyYXRvcgorICAgICAgICAgICAgICAgIDogbmV3IENvbXBhcmF0b3JPcmRlcmluZzxUPihjb21wYXJhdG9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSByZXZlcnNlIG9mIHRoaXMgb3JkZXJpbmc7IHRoZSB7QGNvZGUgT3JkZXJpbmd9IGVxdWl2YWxlbnQgdG8KKyAgICAgKiB7QGxpbmsgQ29sbGVjdGlvbnMjcmV2ZXJzZU9yZGVyKENvbXBhcmF0b3IpfS4KKyAgICAgKi8KKyAgICAvLyB0eXBlIHBhcmFtZXRlciA8Uz4gbGV0cyB1cyBhdm9pZCB0aGUgZXh0cmEgPFN0cmluZz4gaW4gc3RhdGVtZW50cyBsaWtlOgorICAgIC8vIE9yZGVyaW5nPFN0cmluZz4gbyA9IE9yZGVyaW5nLjxTdHJpbmc+bmF0dXJhbCgpLnJldmVyc2UoKTsKKyAgICBwdWJsaWMgPFMgZXh0ZW5kcyBUPiBPcmRlcmluZzxTPiByZXZlcnNlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJldmVyc2VPcmRlcmluZzxTPih0aGlzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIG9yZGVyaW5nIHRoYXQgdHJlYXRzIHtAY29kZSBudWxsfSBhcyBsZXNzIHRoYW4gYWxsIG90aGVyIHZhbHVlcworICAgICAqIGFuZCB1c2VzIHtAY29kZSB0aGlzfSB0byBjb21wYXJlIG5vbi1udWxsIHZhbHVlcy4KKyAgICAgKi8KKyAgICAvLyB0eXBlIHBhcmFtZXRlciA8Uz4gbGV0cyB1cyBhdm9pZCB0aGUgZXh0cmEgPFN0cmluZz4gaW4gc3RhdGVtZW50cyBsaWtlOgorICAgIC8vIE9yZGVyaW5nPFN0cmluZz4gbyA9IE9yZGVyaW5nLjxTdHJpbmc+bmF0dXJhbCgpLm51bGxzRmlyc3QoKTsKKyAgICA8UyBleHRlbmRzIFQ+IE9yZGVyaW5nPFM+IG51bGxzRmlyc3QoKSB7CisgICAgICAgIHJldHVybiBuZXcgTnVsbHNGaXJzdE9yZGVyaW5nPFM+KHRoaXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gb3JkZXJpbmcgdGhhdCB0cmVhdHMge0Bjb2RlIG51bGx9IGFzIGdyZWF0ZXIgdGhhbiBhbGwgb3RoZXIKKyAgICAgKiB2YWx1ZXMgYW5kIHVzZXMgdGhpcyBvcmRlcmluZyB0byBjb21wYXJlIG5vbi1udWxsIHZhbHVlcy4KKyAgICAgKi8KKyAgICAvLyB0eXBlIHBhcmFtZXRlciA8Uz4gbGV0cyB1cyBhdm9pZCB0aGUgZXh0cmEgPFN0cmluZz4gaW4gc3RhdGVtZW50cyBsaWtlOgorICAgIC8vIE9yZGVyaW5nPFN0cmluZz4gbyA9IE9yZGVyaW5nLjxTdHJpbmc+bmF0dXJhbCgpLm51bGxzTGFzdCgpOworICAgIDxTIGV4dGVuZHMgVD4gT3JkZXJpbmc8Uz4gbnVsbHNMYXN0KCkgeworICAgICAgICByZXR1cm4gbmV3IE51bGxzTGFzdE9yZGVyaW5nPFM+KHRoaXMpOworICAgIH0KKworICAgIC8vIFJlZ3VsYXIgaW5zdGFuY2UgbWV0aG9kcworCisgICAgLy8gT3ZlcnJpZGUgdG8gYWRkIEBOdWxsYWJsZQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgY29tcGFyZShUIGxlZnQsIFQgcmlnaHQpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbGVhc3Qgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZXMgYWNjb3JkaW5nIHRvIHRoaXMgb3JkZXJpbmcuIElmCisgICAgICogdGhlcmUgYXJlIG11bHRpcGxlIGxlYXN0IHZhbHVlcywgdGhlIGZpcnN0IG9mIHRob3NlIGlzIHJldHVybmVkLiBUaGUKKyAgICAgKiBpdGVyYXRvciB3aWxsIGJlIGxlZnQgZXhoYXVzdGVkOiBpdHMge0Bjb2RlIGhhc05leHQoKX0gbWV0aG9kIHdpbGwgcmV0dXJuCisgICAgICoge0Bjb2RlIGZhbHNlfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpdGVyYXRvciB0aGUgaXRlcmF0b3Igd2hvc2UgbWluaW11bSBlbGVtZW50IGlzIHRvIGJlIGRldGVybWluZWQKKyAgICAgKiBAdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gaWYge0Bjb2RlIGl0ZXJhdG9yfSBpcyBlbXB0eQorICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uICAgICBpZiB0aGUgcGFyYW1ldGVycyBhcmUgbm90IDxpPm11dHVhbGx5CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmFibGU8L2k+IHVuZGVyIHRoaXMgb3JkZXJpbmcuCisgICAgICogQHNpbmNlIDExLjAKKyAgICAgKi8KKyAgICA8RSBleHRlbmRzIFQ+IEUgbWluKEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKSB7CisgICAgICAgIC8vIGxldCB0aGlzIHRocm93IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gYXMgbmVjZXNzYXJ5CisgICAgICAgIEUgbWluU29GYXIgPSBpdGVyYXRvci5uZXh0KCk7CisKKyAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgbWluU29GYXIgPSBtaW4obWluU29GYXIsIGl0ZXJhdG9yLm5leHQoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbWluU29GYXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbGVhc3Qgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZXMgYWNjb3JkaW5nIHRvIHRoaXMgb3JkZXJpbmcuIElmCisgICAgICogdGhlcmUgYXJlIG11bHRpcGxlIGxlYXN0IHZhbHVlcywgdGhlIGZpcnN0IG9mIHRob3NlIGlzIHJldHVybmVkLgorICAgICAqCisgICAgICogQHBhcmFtIGl0ZXJhYmxlIHRoZSBpdGVyYWJsZSB3aG9zZSBtaW5pbXVtIGVsZW1lbnQgaXMgdG8gYmUgZGV0ZXJtaW5lZAorICAgICAqIEB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBpZiB7QGNvZGUgaXRlcmFibGV9IGlzIGVtcHR5CisgICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gICAgIGlmIHRoZSBwYXJhbWV0ZXJzIGFyZSBub3QgPGk+bXV0dWFsbHkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyYWJsZTwvaT4gdW5kZXIgdGhpcyBvcmRlcmluZy4KKyAgICAgKi8KKyAgICA8RSBleHRlbmRzIFQ+IEUgbWluKEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKSB7CisgICAgICAgIHJldHVybiBtaW4oaXRlcmFibGUuaXRlcmF0b3IoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbGVzc2VyIG9mIHRoZSB0d28gdmFsdWVzIGFjY29yZGluZyB0byB0aGlzIG9yZGVyaW5nLiBJZiB0aGUKKyAgICAgKiB2YWx1ZXMgY29tcGFyZSBhcyAwLCB0aGUgZmlyc3QgaXMgcmV0dXJuZWQuCisgICAgICogPHA+CisgICAgICogPHA+PGI+SW1wbGVtZW50YXRpb24gbm90ZTo8L2I+IHRoaXMgbWV0aG9kIGlzIGludm9rZWQgYnkgdGhlIGRlZmF1bHQKKyAgICAgKiBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIG90aGVyIHtAY29kZSBtaW59IG92ZXJsb2Fkcywgc28gb3ZlcnJpZGluZyBpdCB3aWxsCisgICAgICogYWZmZWN0IHRoZWlyIGJlaGF2aW9yLgorICAgICAqCisgICAgICogQHBhcmFtIGEgdmFsdWUgdG8gY29tcGFyZSwgcmV0dXJuZWQgaWYgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGIuCisgICAgICogQHBhcmFtIGIgdmFsdWUgdG8gY29tcGFyZS4KKyAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpZiB0aGUgcGFyYW1ldGVycyBhcmUgbm90IDxpPm11dHVhbGx5CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyYWJsZTwvaT4gdW5kZXIgdGhpcyBvcmRlcmluZy4KKyAgICAgKi8KKyAgICA8RSBleHRlbmRzIFQ+IEUgbWluKEUgYSwgRSBiKSB7CisgICAgICAgIHJldHVybiAoY29tcGFyZShhLCBiKSA8PSAwKSA/IGEgOiBiOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxlYXN0IG9mIHRoZSBzcGVjaWZpZWQgdmFsdWVzIGFjY29yZGluZyB0byB0aGlzIG9yZGVyaW5nLiBJZgorICAgICAqIHRoZXJlIGFyZSBtdWx0aXBsZSBsZWFzdCB2YWx1ZXMsIHRoZSBmaXJzdCBvZiB0aG9zZSBpcyByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhICAgIHZhbHVlIHRvIGNvbXBhcmUsIHJldHVybmVkIGlmIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgcmVzdC4KKyAgICAgKiBAcGFyYW0gYiAgICB2YWx1ZSB0byBjb21wYXJlCisgICAgICogQHBhcmFtIGMgICAgdmFsdWUgdG8gY29tcGFyZQorICAgICAqIEBwYXJhbSByZXN0IHZhbHVlcyB0byBjb21wYXJlCisgICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgdGhlIHBhcmFtZXRlcnMgYXJlIG5vdCA8aT5tdXR1YWxseQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmFibGU8L2k+IHVuZGVyIHRoaXMgb3JkZXJpbmcuCisgICAgICovCisgICAgPEUgZXh0ZW5kcyBUPiBFIG1pbigKKyAgICAgICAgICAgIEUgYSwgRSBiLCBFIGMsIEUuLi4gcmVzdCkgeworICAgICAgICBFIG1pblNvRmFyID0gbWluKG1pbihhLCBiKSwgYyk7CisKKyAgICAgICAgZm9yIChFIHIgOiByZXN0KSB7CisgICAgICAgICAgICBtaW5Tb0ZhciA9IG1pbihtaW5Tb0Zhciwgcik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbWluU29GYXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZ3JlYXRlc3Qgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZXMgYWNjb3JkaW5nIHRvIHRoaXMgb3JkZXJpbmcuIElmCisgICAgICogdGhlcmUgYXJlIG11bHRpcGxlIGdyZWF0ZXN0IHZhbHVlcywgdGhlIGZpcnN0IG9mIHRob3NlIGlzIHJldHVybmVkLiBUaGUKKyAgICAgKiBpdGVyYXRvciB3aWxsIGJlIGxlZnQgZXhoYXVzdGVkOiBpdHMge0Bjb2RlIGhhc05leHQoKX0gbWV0aG9kIHdpbGwgcmV0dXJuCisgICAgICoge0Bjb2RlIGZhbHNlfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpdGVyYXRvciB0aGUgaXRlcmF0b3Igd2hvc2UgbWF4aW11bSBlbGVtZW50IGlzIHRvIGJlIGRldGVybWluZWQKKyAgICAgKiBAdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gaWYge0Bjb2RlIGl0ZXJhdG9yfSBpcyBlbXB0eQorICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uICAgICBpZiB0aGUgcGFyYW1ldGVycyBhcmUgbm90IDxpPm11dHVhbGx5CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmFibGU8L2k+IHVuZGVyIHRoaXMgb3JkZXJpbmcuCisgICAgICogQHNpbmNlIDExLjAKKyAgICAgKi8KKyAgICA8RSBleHRlbmRzIFQ+IEUgbWF4KEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKSB7CisgICAgICAgIC8vIGxldCB0aGlzIHRocm93IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gYXMgbmVjZXNzYXJ5CisgICAgICAgIEUgbWF4U29GYXIgPSBpdGVyYXRvci5uZXh0KCk7CisKKyAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgbWF4U29GYXIgPSBtYXgobWF4U29GYXIsIGl0ZXJhdG9yLm5leHQoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbWF4U29GYXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZ3JlYXRlc3Qgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZXMgYWNjb3JkaW5nIHRvIHRoaXMgb3JkZXJpbmcuIElmCisgICAgICogdGhlcmUgYXJlIG11bHRpcGxlIGdyZWF0ZXN0IHZhbHVlcywgdGhlIGZpcnN0IG9mIHRob3NlIGlzIHJldHVybmVkLgorICAgICAqCisgICAgICogQHBhcmFtIGl0ZXJhYmxlIHRoZSBpdGVyYWJsZSB3aG9zZSBtYXhpbXVtIGVsZW1lbnQgaXMgdG8gYmUgZGV0ZXJtaW5lZAorICAgICAqIEB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBpZiB7QGNvZGUgaXRlcmFibGV9IGlzIGVtcHR5CisgICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gICAgIGlmIHRoZSBwYXJhbWV0ZXJzIGFyZSBub3QgPGk+bXV0dWFsbHkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyYWJsZTwvaT4gdW5kZXIgdGhpcyBvcmRlcmluZy4KKyAgICAgKi8KKyAgICA8RSBleHRlbmRzIFQ+IEUgbWF4KEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKSB7CisgICAgICAgIHJldHVybiBtYXgoaXRlcmFibGUuaXRlcmF0b3IoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZ3JlYXRlciBvZiB0aGUgdHdvIHZhbHVlcyBhY2NvcmRpbmcgdG8gdGhpcyBvcmRlcmluZy4gSWYgdGhlCisgICAgICogdmFsdWVzIGNvbXBhcmUgYXMgMCwgdGhlIGZpcnN0IGlzIHJldHVybmVkLgorICAgICAqIDxwPgorICAgICAqIDxwPjxiPkltcGxlbWVudGF0aW9uIG5vdGU6PC9iPiB0aGlzIG1ldGhvZCBpcyBpbnZva2VkIGJ5IHRoZSBkZWZhdWx0CisgICAgICogaW1wbGVtZW50YXRpb25zIG9mIHRoZSBvdGhlciB7QGNvZGUgbWF4fSBvdmVybG9hZHMsIHNvIG92ZXJyaWRpbmcgaXQgd2lsbAorICAgICAqIGFmZmVjdCB0aGVpciBiZWhhdmlvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhIHZhbHVlIHRvIGNvbXBhcmUsIHJldHVybmVkIGlmIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBiLgorICAgICAqIEBwYXJhbSBiIHZhbHVlIHRvIGNvbXBhcmUuCisgICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgdGhlIHBhcmFtZXRlcnMgYXJlIG5vdCA8aT5tdXR1YWxseQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmFibGU8L2k+IHVuZGVyIHRoaXMgb3JkZXJpbmcuCisgICAgICovCisgICAgPEUgZXh0ZW5kcyBUPiBFIG1heChFIGEsIEUgYikgeworICAgICAgICByZXR1cm4gKGNvbXBhcmUoYSwgYikgPj0gMCkgPyBhIDogYjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBncmVhdGVzdCBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlcyBhY2NvcmRpbmcgdG8gdGhpcyBvcmRlcmluZy4gSWYKKyAgICAgKiB0aGVyZSBhcmUgbXVsdGlwbGUgZ3JlYXRlc3QgdmFsdWVzLCB0aGUgZmlyc3Qgb2YgdGhvc2UgaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYSAgICB2YWx1ZSB0byBjb21wYXJlLCByZXR1cm5lZCBpZiBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHJlc3QuCisgICAgICogQHBhcmFtIGIgICAgdmFsdWUgdG8gY29tcGFyZQorICAgICAqIEBwYXJhbSBjICAgIHZhbHVlIHRvIGNvbXBhcmUKKyAgICAgKiBAcGFyYW0gcmVzdCB2YWx1ZXMgdG8gY29tcGFyZQorICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uIGlmIHRoZSBwYXJhbWV0ZXJzIGFyZSBub3QgPGk+bXV0dWFsbHkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJhYmxlPC9pPiB1bmRlciB0aGlzIG9yZGVyaW5nLgorICAgICAqLworICAgIDxFIGV4dGVuZHMgVD4gRSBtYXgoCisgICAgICAgICAgICBFIGEsIEUgYiwgRSBjLCBFLi4uIHJlc3QpIHsKKyAgICAgICAgRSBtYXhTb0ZhciA9IG1heChtYXgoYSwgYiksIGMpOworCisgICAgICAgIGZvciAoRSByIDogcmVzdCkgeworICAgICAgICAgICAgbWF4U29GYXIgPSBtYXgobWF4U29GYXIsIHIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1heFNvRmFyOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9QZWVraW5nSXRlcmF0b3IuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvUGVla2luZ0l0ZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYxYTYxMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvUGVla2luZ0l0ZXJhdG9yLmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgR3VhdmEgQXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKKworLyoqCisgKiBBbiBpdGVyYXRvciB0aGF0IHN1cHBvcnRzIGEgb25lLWVsZW1lbnQgbG9va2FoZWFkIHdoaWxlIGl0ZXJhdGluZy4KKyAqIDxwPgorICogPHA+U2VlIHRoZSBHdWF2YSBVc2VyIEd1aWRlIGFydGljbGUgb24gPGEgaHJlZj0KKyAqICJodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ3VhdmEtbGlicmFyaWVzL3dpa2kvQ29sbGVjdGlvbkhlbHBlcnNFeHBsYWluZWQjUGVla2luZ0l0ZXJhdG9yIj4KKyAqIHtAY29kZSBQZWVraW5nSXRlcmF0b3J9PC9hPi4KKyAqCisgKiBAYXV0aG9yIE1pY2sgS2lsbGlhbmV5CisgKiBAc2luY2UgMi4wIChpbXBvcnRlZCBmcm9tIEdvb2dsZSBDb2xsZWN0aW9ucyBMaWJyYXJ5KQorICovCitwdWJsaWMgaW50ZXJmYWNlIFBlZWtpbmdJdGVyYXRvcjxFPiBleHRlbmRzIEl0ZXJhdG9yPEU+IHsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuZXh0IGVsZW1lbnQgaW4gdGhlIGl0ZXJhdGlvbiwgd2l0aG91dCBhZHZhbmNpbmcgdGhlIGl0ZXJhdGlvbi4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5DYWxscyB0byB7QGNvZGUgcGVlaygpfSBzaG91bGQgbm90IGNoYW5nZSB0aGUgc3RhdGUgb2YgdGhlIGl0ZXJhdGlvbiwKKyAgICAgKiBleGNlcHQgdGhhdCBpdCA8aT5tYXk8L2k+IHByZXZlbnQgcmVtb3ZhbCBvZiB0aGUgbW9zdCByZWNlbnQgZWxlbWVudCB2aWEKKyAgICAgKiB7QGxpbmsgI3JlbW92ZSgpfS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBpZiB0aGUgaXRlcmF0aW9uIGhhcyBubyBtb3JlIGVsZW1lbnRzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY29yZGluZyB0byB7QGxpbmsgI2hhc05leHQoKX0KKyAgICAgKi8KKyAgICBFIHBlZWsoKTsKKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5UaGUgb2JqZWN0cyByZXR1cm5lZCBieSBjb25zZWN1dGl2ZSBjYWxscyB0byB7QGxpbmsgI3BlZWsoKX0gdGhlbiB7QGxpbmsKKyAgICAgKiAjbmV4dCgpfSBhcmUgZ3VhcmFudGVlZCB0byBiZSBlcXVhbCB0byBlYWNoIG90aGVyLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIEUgbmV4dCgpOworCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqIDxwPgorICAgICAqIDxwPkltcGxlbWVudGF0aW9ucyBtYXkgb3IgbWF5IG5vdCBzdXBwb3J0IHJlbW92YWwgd2hlbiBhIGNhbGwgdG8ge0BsaW5rCisgICAgICogI3BlZWsoKX0gaGFzIG9jY3VycmVkIHNpbmNlIHRoZSBtb3N0IHJlY2VudCBjYWxsIHRvIHtAbGluayAjbmV4dCgpfS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZXJlIGhhcyBiZWVuIGEgY2FsbCB0byB7QGxpbmsgI3BlZWsoKX0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaW5jZSB0aGUgbW9zdCByZWNlbnQgY2FsbCB0byB7QGxpbmsgI25leHQoKX0gYW5kIHRoaXMgaW1wbGVtZW50YXRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2VzIG5vdCBzdXBwb3J0IHRoaXMgc2VxdWVuY2Ugb2YgY2FsbHMgKG9wdGlvbmFsKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHZvaWQgcmVtb3ZlKCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL1BsYXRmb3JtLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL1BsYXRmb3JtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY3MTY3MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvUGxhdGZvcm0uamF2YQpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBHdWF2YSBBdXRob3JzCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7CitpbXBvcnQgamF2YS51dGlsLk5hdmlnYWJsZVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU29ydGVkTWFwOworaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworCisvKioKKyAqIE1ldGhvZHMgZmFjdG9yZWQgb3V0IHNvIHRoYXQgdGhleSBjYW4gYmUgZW11bGF0ZWQgZGlmZmVyZW50bHkgaW4gR1dULgorICoKKyAqIEBhdXRob3IgSmVzc2UgV2lsc29uCisgKi8KK2ZpbmFsIGNsYXNzIFBsYXRmb3JtIHsKKyAgICBwcml2YXRlIFBsYXRmb3JtKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbGxzIHtAbGluayBTeXN0ZW0jbmFub1RpbWUoKX0uCisgICAgICovCisgICAgc3RhdGljIGxvbmcgc3lzdGVtTmFub1RpbWUoKSB7CisgICAgICAgIHJldHVybiBTeXN0ZW0ubmFub1RpbWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmV3IGFycmF5IG9mIHRoZSBnaXZlbiBsZW5ndGggd2l0aCB0aGUgc2FtZSB0eXBlIGFzIGEgcmVmZXJlbmNlCisgICAgICogYXJyYXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVmZXJlbmNlIGFueSBhcnJheSBvZiB0aGUgZGVzaXJlZCB0eXBlCisgICAgICogQHBhcmFtIGxlbmd0aCAgICB0aGUgbGVuZ3RoIG9mIHRoZSBuZXcgYXJyYXkKKyAgICAgKi8KKyAgICBzdGF0aWMgPFQ+IFRbXSBuZXdBcnJheShUW10gcmVmZXJlbmNlLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIENsYXNzPD8+IHR5cGUgPSByZWZlcmVuY2UuZ2V0Q2xhc3MoKS5nZXRDb21wb25lbnRUeXBlKCk7CisKKyAgICAgICAgLy8gdGhlIGNhc3QgaXMgc2FmZSBiZWNhdXNlCisgICAgICAgIC8vIHJlc3VsdC5nZXRDbGFzcygpID09IHJlZmVyZW5jZS5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKQorICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgVFtdIHJlc3VsdCA9IChUW10pIEFycmF5Lm5ld0luc3RhbmNlKHR5cGUsIGxlbmd0aCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9QcmVjb25kaXRpb25zLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL1ByZWNvbmRpdGlvbnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOThhZDM2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9QcmVjb25kaXRpb25zLmphdmEKQEAgLTAsMCArMSw0MzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEd1YXZhIEF1dGhvcnMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQKKyAqIGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZQorICogaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzCisgKiBvciBpbXBsaWVkLiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisgKiB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhOworCisvKioKKyAqIFN0YXRpYyBjb252ZW5pZW5jZSBtZXRob2RzIHRoYXQgaGVscCBhIG1ldGhvZCBvciBjb25zdHJ1Y3RvciBjaGVjayB3aGV0aGVyIGl0IHdhcyBpbnZva2VkCisgKiBjb3JyZWN0bHkgKHdoZXRoZXIgaXRzIDxpPnByZWNvbmRpdGlvbnM8L2k+IGhhdmUgYmVlbiBtZXQpLiBUaGVzZSBtZXRob2RzIGdlbmVyYWxseSBhY2NlcHQgYQorICoge0Bjb2RlIGJvb2xlYW59IGV4cHJlc3Npb24gd2hpY2ggaXMgZXhwZWN0ZWQgdG8gYmUge0Bjb2RlIHRydWV9IChvciBpbiB0aGUgY2FzZSBvZiB7QGNvZGUKKyAqIGNoZWNrTm90TnVsbH0sIGFuIG9iamVjdCByZWZlcmVuY2Ugd2hpY2ggaXMgZXhwZWN0ZWQgdG8gYmUgbm9uLW51bGwpLiBXaGVuIHtAY29kZSBmYWxzZX0gKG9yCisgKiB7QGNvZGUgbnVsbH0pIGlzIHBhc3NlZCBpbnN0ZWFkLCB0aGUge0Bjb2RlIFByZWNvbmRpdGlvbnN9IG1ldGhvZCB0aHJvd3MgYW4gdW5jaGVja2VkIGV4Y2VwdGlvbiwKKyAqIHdoaWNoIGhlbHBzIHRoZSBjYWxsaW5nIG1ldGhvZCBjb21tdW5pY2F0ZSB0byA8aT5pdHM8L2k+IGNhbGxlciB0aGF0IDxpPnRoYXQ8L2k+IGNhbGxlciBoYXMgbWFkZQorICogYSBtaXN0YWtlLiBFeGFtcGxlOiA8cHJlPiAgIHtAY29kZQorICogPHA+CisgKiAgIC8qKgorICogICAgKiBSZXR1cm5zIHRoZSBwb3NpdGl2ZSBzcXVhcmUgcm9vdCBvZiB0aGUgZ2l2ZW4gdmFsdWUuCisgKiAgICAqCisgKiAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSB2YWx1ZSBpcyBuZWdhdGl2ZQorICogICAgKn17QGNvZGUgLworICogICBwdWJsaWMgc3RhdGljIGRvdWJsZSBzcXJ0KGRvdWJsZSB2YWx1ZSkgeworICogICAgIFByZWNvbmRpdGlvbnMuY2hlY2tBcmd1bWVudCh2YWx1ZSA+PSAwLjAsICJuZWdhdGl2ZSB2YWx1ZTogJXMiLCB2YWx1ZSk7CisgKiAgICAgLy8gY2FsY3VsYXRlIHRoZSBzcXVhcmUgcm9vdAorICogICB9CisgKiA8cD4KKyAqICAgdm9pZCBleGFtcGxlQmFkQ2FsbGVyKCkgeworICogICAgIGRvdWJsZSBkID0gc3FydCgtMS4wKTsKKyAqICAgfX08L3ByZT4KKyAqIDxwPgorICogSW4gdGhpcyBleGFtcGxlLCB7QGNvZGUgY2hlY2tBcmd1bWVudH0gdGhyb3dzIGFuIHtAY29kZSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb259IHRvIGluZGljYXRlCisgKiB0aGF0IHtAY29kZSBleGFtcGxlQmFkQ2FsbGVyfSBtYWRlIGFuIGVycm9yIGluIDxpPml0czwvaT4gY2FsbCB0byB7QGNvZGUgc3FydH0uCisgKiA8cD4KKyAqIDxoMz5XYXJuaW5nIGFib3V0IHBlcmZvcm1hbmNlPC9oMz4KKyAqIDxwPgorICogPHA+VGhlIGdvYWwgb2YgdGhpcyBjbGFzcyBpcyB0byBpbXByb3ZlIHJlYWRhYmlsaXR5IG9mIGNvZGUsIGJ1dCBpbiBzb21lIGNpcmN1bXN0YW5jZXMgdGhpcyBtYXkKKyAqIGNvbWUgYXQgYSBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBjb3N0LiBSZW1lbWJlciB0aGF0IHBhcmFtZXRlciB2YWx1ZXMgZm9yIG1lc3NhZ2UgY29uc3RydWN0aW9uCisgKiBtdXN0IGFsbCBiZSBjb21wdXRlZCBlYWdlcmx5LCBhbmQgYXV0b2JveGluZyBhbmQgdmFyYXJncyBhcnJheSBjcmVhdGlvbiBtYXkgaGFwcGVuIGFzIHdlbGwsIGV2ZW4KKyAqIHdoZW4gdGhlIHByZWNvbmRpdGlvbiBjaGVjayB0aGVuIHN1Y2NlZWRzIChhcyBpdCBzaG91bGQgYWxtb3N0IGFsd2F5cyBkbyBpbiBwcm9kdWN0aW9uKS4gSW4gc29tZQorICogY2lyY3Vtc3RhbmNlcyB0aGVzZSB3YXN0ZWQgQ1BVIGN5Y2xlcyBhbmQgYWxsb2NhdGlvbnMgY2FuIGFkZCB1cCB0byBhIHJlYWwgcHJvYmxlbS4KKyAqIFBlcmZvcm1hbmNlLXNlbnNpdGl2ZSBwcmVjb25kaXRpb24gY2hlY2tzIGNhbiBhbHdheXMgYmUgY29udmVydGVkIHRvIHRoZSBjdXN0b21hcnkgZm9ybToKKyAqIDxwcmU+ICAge0Bjb2RlCisgKgorICogICBpZiAodmFsdWUgPCAwLjApIHsKKyAqICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJuZWdhdGl2ZSB2YWx1ZTogIiArIHZhbHVlKTsKKyAqICAgfX08L3ByZT4KKyAqIDxwPgorICogPGgzPk90aGVyIHR5cGVzIG9mIHByZWNvbmRpdGlvbnM8L2gzPgorICogPHA+CisgKiA8cD5Ob3QgZXZlcnkgdHlwZSBvZiBwcmVjb25kaXRpb24gZmFpbHVyZSBpcyBzdXBwb3J0ZWQgYnkgdGhlc2UgbWV0aG9kcy4gQ29udGludWUgdG8gdGhyb3cKKyAqIHN0YW5kYXJkIEpESyBleGNlcHRpb25zIHN1Y2ggYXMge0BsaW5rIGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9ufSBvciB7QGxpbmsKKyAqIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufSBpbiB0aGUgc2l0dWF0aW9ucyB0aGV5IGFyZSBpbnRlbmRlZCBmb3IuCisgKiA8cD4KKyAqIDxoMz5Ob24tcHJlY29uZGl0aW9uczwvaDM+CisgKiA8cD4KKyAqIDxwPkl0IGlzIG9mIGNvdXJzZSBwb3NzaWJsZSB0byB1c2UgdGhlIG1ldGhvZHMgb2YgdGhpcyBjbGFzcyB0byBjaGVjayBmb3IgaW52YWxpZCBjb25kaXRpb25zCisgKiB3aGljaCBhcmUgPGk+bm90IHRoZSBjYWxsZXIncyBmYXVsdDwvaT4uIERvaW5nIHNvIGlzIDxiPm5vdCByZWNvbW1lbmRlZDwvYj4gYmVjYXVzZSBpdCBpcworICogbWlzbGVhZGluZyB0byBmdXR1cmUgcmVhZGVycyBvZiB0aGUgY29kZSBhbmQgb2Ygc3RhY2sgdHJhY2VzLiBTZWUKKyAqIDxhIGhyZWY9Imh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9ndWF2YS1saWJyYXJpZXMvd2lraS9Db25kaXRpb25hbEZhaWx1cmVzRXhwbGFpbmVkIj5Db25kaXRpb25hbAorICogZmFpbHVyZXMgZXhwbGFpbmVkPC9hPiBpbiB0aGUgR3VhdmEgVXNlciBHdWlkZSBmb3IgbW9yZSBhZHZpY2UuCisgKiA8cD4KKyAqIDxoMz57QGNvZGUgamF2YS51dGlsLk9iamVjdHMucmVxdWlyZU5vbk51bGwoKX08L2gzPgorICogPHA+CisgKiA8cD5Qcm9qZWN0cyB3aGljaCB1c2Uge0Bjb2RlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhLmNvbW1vbn0gc2hvdWxkIGdlbmVyYWxseSBhdm9pZCB0aGUgdXNlIG9mIHtAbGluaworICogamF2YS51dGlsLk9iamVjdHMjcmVxdWlyZU5vbk51bGwoT2JqZWN0KX0uIEluc3RlYWQsIHVzZSB3aGljaGV2ZXIgb2Yge0BsaW5rCisgKiAjY2hlY2tOb3ROdWxsKE9iamVjdCl9IG9yIHtAbGluayBWZXJpZnkjdmVyaWZ5Tm90TnVsbChPYmplY3QpfSBpcyBhcHByb3ByaWF0ZSB0byB0aGUgc2l0dWF0aW9uLgorICogKFRoZSBzYW1lIGdvZXMgZm9yIHRoZSBtZXNzYWdlLWFjY2VwdGluZyBvdmVybG9hZHMuKQorICogPHA+CisgKiA8aDM+T25seSB7QGNvZGUgJXN9IGlzIHN1cHBvcnRlZDwvaDM+CisgKiA8cD4KKyAqIDxwPkluIHtAY29kZSBQcmVjb25kaXRpb25zfSBlcnJvciBtZXNzYWdlIHRlbXBsYXRlIHN0cmluZ3MsIG9ubHkgdGhlIHtAY29kZSAiJXMifSBzcGVjaWZpZXIgaXMKKyAqIHN1cHBvcnRlZCwgbm90IHRoZSBmdWxsIHJhbmdlIG9mIHtAbGluayBqYXZhLnV0aWwuRm9ybWF0dGVyfSBzcGVjaWZpZXJzLgorICogPHA+CisgKiA8aDM+TW9yZSBpbmZvcm1hdGlvbjwvaDM+CisgKiA8cD4KKyAqIDxwPlNlZSB0aGUgR3VhdmEgVXNlciBHdWlkZSBvbgorICogPGEgaHJlZj0iaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2d1YXZhLWxpYnJhcmllcy93aWtpL1ByZWNvbmRpdGlvbnNFeHBsYWluZWQiPnVzaW5nIHtAY29kZQorICogUHJlY29uZGl0aW9uc308L2E+LgorICoKKyAqIEBhdXRob3IgS2V2aW4gQm91cnJpbGxpb24KKyAqIEBzaW5jZSAyLjAgKGltcG9ydGVkIGZyb20gR29vZ2xlIENvbGxlY3Rpb25zIExpYnJhcnkpCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBQcmVjb25kaXRpb25zIHsKKyAgICBwcml2YXRlIFByZWNvbmRpdGlvbnMoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5zdXJlcyB0aGUgdHJ1dGggb2YgYW4gZXhwcmVzc2lvbiBpbnZvbHZpbmcgb25lIG9yIG1vcmUgcGFyYW1ldGVycyB0byB0aGUgY2FsbGluZyBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXhwcmVzc2lvbiBhIGJvb2xlYW4gZXhwcmVzc2lvbgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHtAY29kZSBleHByZXNzaW9ufSBpcyBmYWxzZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja0FyZ3VtZW50KGJvb2xlYW4gZXhwcmVzc2lvbikgeworICAgICAgICBpZiAoIWV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEVuc3VyZXMgdGhlIHRydXRoIG9mIGFuIGV4cHJlc3Npb24gaW52b2x2aW5nIG9uZSBvciBtb3JlIHBhcmFtZXRlcnMgdG8gdGhlIGNhbGxpbmcgbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIGV4cHJlc3Npb24gICBhIGJvb2xlYW4gZXhwcmVzc2lvbgorICAgICAqIEBwYXJhbSBlcnJvck1lc3NhZ2UgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlIHRvIHVzZSBpZiB0aGUgY2hlY2sgZmFpbHM7IHdpbGwgYmUgY29udmVydGVkIHRvIGEKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB1c2luZyB7QGxpbmsgU3RyaW5nI3ZhbHVlT2YoT2JqZWN0KX0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB7QGNvZGUgZXhwcmVzc2lvbn0gaXMgZmFsc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tBcmd1bWVudChib29sZWFuIGV4cHJlc3Npb24sIE9iamVjdCBlcnJvck1lc3NhZ2UpIHsKKyAgICAgICAgaWYgKCFleHByZXNzaW9uKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy52YWx1ZU9mKGVycm9yTWVzc2FnZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5zdXJlcyB0aGUgdHJ1dGggb2YgYW4gZXhwcmVzc2lvbiBpbnZvbHZpbmcgb25lIG9yIG1vcmUgcGFyYW1ldGVycyB0byB0aGUgY2FsbGluZyBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXhwcmVzc2lvbiAgICAgICAgICAgYSBib29sZWFuIGV4cHJlc3Npb24KKyAgICAgKiBAcGFyYW0gZXJyb3JNZXNzYWdlVGVtcGxhdGUgYSB0ZW1wbGF0ZSBmb3IgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlIHNob3VsZCB0aGUgY2hlY2sgZmFpbC4gVGhlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgaXMgZm9ybWVkIGJ5IHJlcGxhY2luZyBlYWNoIHtAY29kZSAlc30gcGxhY2Vob2xkZXIgaW4gdGhlIHRlbXBsYXRlIHdpdGggYW4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnQuIFRoZXNlIGFyZSBtYXRjaGVkIGJ5IHBvc2l0aW9uIC0gdGhlIGZpcnN0IHtAY29kZSAlc30gZ2V0cyB7QGNvZGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlQXJnc1swXX0sIGV0Yy4gIFVubWF0Y2hlZCBhcmd1bWVudHMgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gc3F1YXJlIGJyYWNlcy4gVW5tYXRjaGVkIHBsYWNlaG9sZGVycyB3aWxsIGJlIGxlZnQgYXMtaXMuCisgICAgICogQHBhcmFtIGVycm9yTWVzc2FnZUFyZ3MgICAgIHRoZSBhcmd1bWVudHMgdG8gYmUgc3Vic3RpdHV0ZWQgaW50byB0aGUgbWVzc2FnZSB0ZW1wbGF0ZS4gQXJndW1lbnRzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBjb252ZXJ0ZWQgdG8gc3RyaW5ncyB1c2luZyB7QGxpbmsgU3RyaW5nI3ZhbHVlT2YoT2JqZWN0KX0uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYge0Bjb2RlIGV4cHJlc3Npb259IGlzIGZhbHNlCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiAgICAgaWYgdGhlIGNoZWNrIGZhaWxzIGFuZCBlaXRoZXIge0Bjb2RlIGVycm9yTWVzc2FnZVRlbXBsYXRlfSBvcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAY29kZSBlcnJvck1lc3NhZ2VBcmdzfSBpcyBudWxsIChkb24ndCBsZXQgdGhpcyBoYXBwZW4pCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrQXJndW1lbnQoYm9vbGVhbiBleHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlcnJvck1lc3NhZ2VUZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuLi4gZXJyb3JNZXNzYWdlQXJncykgeworICAgICAgICBpZiAoIWV4cHJlc3Npb24pIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZm9ybWF0KGVycm9yTWVzc2FnZVRlbXBsYXRlLCBlcnJvck1lc3NhZ2VBcmdzKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmVzIHRoZSB0cnV0aCBvZiBhbiBleHByZXNzaW9uIGludm9sdmluZyB0aGUgc3RhdGUgb2YgdGhlIGNhbGxpbmcgaW5zdGFuY2UsIGJ1dCBub3QKKyAgICAgKiBpbnZvbHZpbmcgYW55IHBhcmFtZXRlcnMgdG8gdGhlIGNhbGxpbmcgbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIGV4cHJlc3Npb24gYSBib29sZWFuIGV4cHJlc3Npb24KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB7QGNvZGUgZXhwcmVzc2lvbn0gaXMgZmFsc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tTdGF0ZShib29sZWFuIGV4cHJlc3Npb24pIHsKKyAgICAgICAgaWYgKCFleHByZXNzaW9uKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmVzIHRoZSB0cnV0aCBvZiBhbiBleHByZXNzaW9uIGludm9sdmluZyB0aGUgc3RhdGUgb2YgdGhlIGNhbGxpbmcgaW5zdGFuY2UsIGJ1dCBub3QKKyAgICAgKiBpbnZvbHZpbmcgYW55IHBhcmFtZXRlcnMgdG8gdGhlIGNhbGxpbmcgbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIGV4cHJlc3Npb24gICBhIGJvb2xlYW4gZXhwcmVzc2lvbgorICAgICAqIEBwYXJhbSBlcnJvck1lc3NhZ2UgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlIHRvIHVzZSBpZiB0aGUgY2hlY2sgZmFpbHM7IHdpbGwgYmUgY29udmVydGVkIHRvIGEKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB1c2luZyB7QGxpbmsgU3RyaW5nI3ZhbHVlT2YoT2JqZWN0KX0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB7QGNvZGUgZXhwcmVzc2lvbn0gaXMgZmFsc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tTdGF0ZShib29sZWFuIGV4cHJlc3Npb24sIE9iamVjdCBlcnJvck1lc3NhZ2UpIHsKKyAgICAgICAgaWYgKCFleHByZXNzaW9uKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKFN0cmluZy52YWx1ZU9mKGVycm9yTWVzc2FnZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5zdXJlcyB0aGUgdHJ1dGggb2YgYW4gZXhwcmVzc2lvbiBpbnZvbHZpbmcgdGhlIHN0YXRlIG9mIHRoZSBjYWxsaW5nIGluc3RhbmNlLCBidXQgbm90CisgICAgICogaW52b2x2aW5nIGFueSBwYXJhbWV0ZXJzIHRvIHRoZSBjYWxsaW5nIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleHByZXNzaW9uICAgICAgICAgICBhIGJvb2xlYW4gZXhwcmVzc2lvbgorICAgICAqIEBwYXJhbSBlcnJvck1lc3NhZ2VUZW1wbGF0ZSBhIHRlbXBsYXRlIGZvciB0aGUgZXhjZXB0aW9uIG1lc3NhZ2Ugc2hvdWxkIHRoZSBjaGVjayBmYWlsLiBUaGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSBpcyBmb3JtZWQgYnkgcmVwbGFjaW5nIGVhY2gge0Bjb2RlICVzfSBwbGFjZWhvbGRlciBpbiB0aGUgdGVtcGxhdGUgd2l0aCBhbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudC4gVGhlc2UgYXJlIG1hdGNoZWQgYnkgcG9zaXRpb24gLSB0aGUgZmlyc3Qge0Bjb2RlICVzfSBnZXRzIHtAY29kZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2VBcmdzWzBdfSwgZXRjLiAgVW5tYXRjaGVkIGFyZ3VtZW50cyB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBmb3JtYXR0ZWQgbWVzc2FnZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBzcXVhcmUgYnJhY2VzLiBVbm1hdGNoZWQgcGxhY2Vob2xkZXJzIHdpbGwgYmUgbGVmdCBhcy1pcy4KKyAgICAgKiBAcGFyYW0gZXJyb3JNZXNzYWdlQXJncyAgICAgdGhlIGFyZ3VtZW50cyB0byBiZSBzdWJzdGl0dXRlZCBpbnRvIHRoZSBtZXNzYWdlIHRlbXBsYXRlLiBBcmd1bWVudHMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlIGNvbnZlcnRlZCB0byBzdHJpbmdzIHVzaW5nIHtAbGluayBTdHJpbmcjdmFsdWVPZihPYmplY3QpfS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB7QGNvZGUgZXhwcmVzc2lvbn0gaXMgZmFsc2UKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uICBpZiB0aGUgY2hlY2sgZmFpbHMgYW5kIGVpdGhlciB7QGNvZGUgZXJyb3JNZXNzYWdlVGVtcGxhdGV9IG9yCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIGVycm9yTWVzc2FnZUFyZ3N9IGlzIG51bGwgKGRvbid0IGxldCB0aGlzIGhhcHBlbikKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY2hlY2tTdGF0ZShib29sZWFuIGV4cHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVycm9yTWVzc2FnZVRlbXBsYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC4uLiBlcnJvck1lc3NhZ2VBcmdzKSB7CisgICAgICAgIGlmICghZXhwcmVzc2lvbikgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihmb3JtYXQoZXJyb3JNZXNzYWdlVGVtcGxhdGUsIGVycm9yTWVzc2FnZUFyZ3MpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEVuc3VyZXMgdGhhdCBhbiBvYmplY3QgcmVmZXJlbmNlIHBhc3NlZCBhcyBhIHBhcmFtZXRlciB0byB0aGUgY2FsbGluZyBtZXRob2QgaXMgbm90IG51bGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVmZXJlbmNlIGFuIG9iamVjdCByZWZlcmVuY2UKKyAgICAgKiBAcmV0dXJuIHRoZSBub24tbnVsbCByZWZlcmVuY2UgdGhhdCB3YXMgdmFsaWRhdGVkCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB7QGNvZGUgcmVmZXJlbmNlfSBpcyBudWxsCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8VD4gVCBjaGVja05vdE51bGwoVCByZWZlcmVuY2UpIHsKKyAgICAgICAgaWYgKHJlZmVyZW5jZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVmZXJlbmNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuc3VyZXMgdGhhdCBhbiBvYmplY3QgcmVmZXJlbmNlIHBhc3NlZCBhcyBhIHBhcmFtZXRlciB0byB0aGUgY2FsbGluZyBtZXRob2QgaXMgbm90IG51bGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVmZXJlbmNlICAgIGFuIG9iamVjdCByZWZlcmVuY2UKKyAgICAgKiBAcGFyYW0gZXJyb3JNZXNzYWdlIHRoZSBleGNlcHRpb24gbWVzc2FnZSB0byB1c2UgaWYgdGhlIGNoZWNrIGZhaWxzOyB3aWxsIGJlIGNvbnZlcnRlZCB0byBhCisgICAgICogICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdXNpbmcge0BsaW5rIFN0cmluZyN2YWx1ZU9mKE9iamVjdCl9CisgICAgICogQHJldHVybiB0aGUgbm9uLW51bGwgcmVmZXJlbmNlIHRoYXQgd2FzIHZhbGlkYXRlZAorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYge0Bjb2RlIHJlZmVyZW5jZX0gaXMgbnVsbAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFQgY2hlY2tOb3ROdWxsKFQgcmVmZXJlbmNlLCBPYmplY3QgZXJyb3JNZXNzYWdlKSB7CisgICAgICAgIGlmIChyZWZlcmVuY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKFN0cmluZy52YWx1ZU9mKGVycm9yTWVzc2FnZSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZWZlcmVuY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5zdXJlcyB0aGF0IGFuIG9iamVjdCByZWZlcmVuY2UgcGFzc2VkIGFzIGEgcGFyYW1ldGVyIHRvIHRoZSBjYWxsaW5nIG1ldGhvZCBpcyBub3QgbnVsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWZlcmVuY2UgICAgICAgICAgICBhbiBvYmplY3QgcmVmZXJlbmNlCisgICAgICogQHBhcmFtIGVycm9yTWVzc2FnZVRlbXBsYXRlIGEgdGVtcGxhdGUgZm9yIHRoZSBleGNlcHRpb24gbWVzc2FnZSBzaG91bGQgdGhlIGNoZWNrIGZhaWwuIFRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlIGlzIGZvcm1lZCBieSByZXBsYWNpbmcgZWFjaCB7QGNvZGUgJXN9IHBsYWNlaG9sZGVyIGluIHRoZSB0ZW1wbGF0ZSB3aXRoIGFuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50LiBUaGVzZSBhcmUgbWF0Y2hlZCBieSBwb3NpdGlvbiAtIHRoZSBmaXJzdCB7QGNvZGUgJXN9IGdldHMge0Bjb2RlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZUFyZ3NbMF19LCBldGMuICBVbm1hdGNoZWQgYXJndW1lbnRzIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhlIGZvcm1hdHRlZCBtZXNzYWdlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHNxdWFyZSBicmFjZXMuIFVubWF0Y2hlZCBwbGFjZWhvbGRlcnMgd2lsbCBiZSBsZWZ0IGFzLWlzLgorICAgICAqIEBwYXJhbSBlcnJvck1lc3NhZ2VBcmdzICAgICB0aGUgYXJndW1lbnRzIHRvIGJlIHN1YnN0aXR1dGVkIGludG8gdGhlIG1lc3NhZ2UgdGVtcGxhdGUuIEFyZ3VtZW50cworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgY29udmVydGVkIHRvIHN0cmluZ3MgdXNpbmcge0BsaW5rIFN0cmluZyN2YWx1ZU9mKE9iamVjdCl9LgorICAgICAqIEByZXR1cm4gdGhlIG5vbi1udWxsIHJlZmVyZW5jZSB0aGF0IHdhcyB2YWxpZGF0ZWQKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHtAY29kZSByZWZlcmVuY2V9IGlzIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUPiBUIGNoZWNrTm90TnVsbChUIHJlZmVyZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXJyb3JNZXNzYWdlVGVtcGxhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0Li4uIGVycm9yTWVzc2FnZUFyZ3MpIHsKKyAgICAgICAgaWYgKHJlZmVyZW5jZSA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBJZiBlaXRoZXIgb2YgdGhlc2UgcGFyYW1ldGVycyBpcyBudWxsLCB0aGUgcmlnaHQgdGhpbmcgaGFwcGVucyBhbnl3YXkKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihmb3JtYXQoZXJyb3JNZXNzYWdlVGVtcGxhdGUsIGVycm9yTWVzc2FnZUFyZ3MpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVmZXJlbmNlOworICAgIH0KKworICAvKgorICAgKiBBbGwgcmVjZW50IGhvdHNwb3RzIChhcyBvZiAyMDA5KSAqcmVhbGx5KiBsaWtlIHRvIGhhdmUgdGhlIG5hdHVyYWwgY29kZQorICAgKgorICAgKiBpZiAoZ3VhcmRFeHByZXNzaW9uKSB7CisgICAqICAgIHRocm93IG5ldyBCYWRFeGNlcHRpb24obWVzc2FnZUV4cHJlc3Npb24pOworICAgKiB9CisgICAqCisgICAqIHJlZmFjdG9yZWQgc28gdGhhdCBtZXNzYWdlRXhwcmVzc2lvbiBpcyBtb3ZlZCB0byBhIHNlcGFyYXRlIFN0cmluZy1yZXR1cm5pbmcgbWV0aG9kLgorICAgKgorICAgKiBpZiAoZ3VhcmRFeHByZXNzaW9uKSB7CisgICAqICAgIHRocm93IG5ldyBCYWRFeGNlcHRpb24oYmFkTXNnKC4uLikpOworICAgKiB9CisgICAqCisgICAqIFRoZSBhbHRlcm5hdGl2ZSBuYXR1cmFsIHJlZmFjdG9yaW5ncyBpbnRvIHZvaWQgb3IgRXhjZXB0aW9uLXJldHVybmluZyBtZXRob2RzIGFyZSBtdWNoIHNsb3dlci4KKyAgICogVGhpcyBpcyBhIGJpZyBkZWFsIC0gd2UncmUgdGFsa2luZyBmYWN0b3JzIG9mIDItOCBpbiBtaWNyb2JlbmNobWFya3MsIG5vdCBqdXN0IDEwLTIwJS4gIChUaGlzCisgICAqIGlzIGEgaG90c3BvdCBvcHRpbWl6ZXIgYnVnLCB3aGljaCBzaG91bGQgYmUgZml4ZWQsIGJ1dCB0aGF0J3MgYSBzZXBhcmF0ZSwgYmlnIHByb2plY3QpLgorICAgKgorICAgKiBUaGUgY29kaW5nIHBhdHRlcm4gYWJvdmUgaXMgaGVhdmlseSB1c2VkIGluIGphdmEudXRpbCwgZS5nLiBpbiBBcnJheUxpc3QuICBUaGVyZSBpcyBhCisgICAqIFJhbmdlQ2hlY2tNaWNyb0JlbmNobWFyayBpbiB0aGUgSkRLIHRoYXQgd2FzIHVzZWQgdG8gdGVzdCB0aGlzLgorICAgKgorICAgKiBCdXQgdGhlIG1ldGhvZHMgaW4gdGhpcyBjbGFzcyB3YW50IHRvIHRocm93IGRpZmZlcmVudCBleGNlcHRpb25zLCBkZXBlbmRpbmcgb24gdGhlIGFyZ3MsIHNvIGl0CisgICAqIGFwcGVhcnMgdGhhdCB0aGlzIHBhdHRlcm4gaXMgbm90IGRpcmVjdGx5IGFwcGxpY2FibGUuICBCdXQgd2UgY2FuIHVzZSB0aGUgcmlkaWN1bG91cywgZGV2aW91cworICAgKiB0cmljayBvZiB0aHJvd2luZyBhbiBleGNlcHRpb24gaW4gdGhlIG1pZGRsZSBvZiB0aGUgY29uc3RydWN0aW9uIG9mIGFub3RoZXIgZXhjZXB0aW9uLiAgSG90c3BvdAorICAgKiBpcyBmaW5lIHdpdGggdGhhdC4KKyAgICovCisKKyAgICAvKioKKyAgICAgKiBFbnN1cmVzIHRoYXQge0Bjb2RlIGluZGV4fSBzcGVjaWZpZXMgYSB2YWxpZCA8aT5lbGVtZW50PC9pPiBpbiBhbiBhcnJheSwgbGlzdCBvciBzdHJpbmcgb2Ygc2l6ZQorICAgICAqIHtAY29kZSBzaXplfS4gQW4gZWxlbWVudCBpbmRleCBtYXkgcmFuZ2UgZnJvbSB6ZXJvLCBpbmNsdXNpdmUsIHRvIHtAY29kZSBzaXplfSwgZXhjbHVzaXZlLgorICAgICAqCisgICAgICogQHBhcmFtIGluZGV4IGEgdXNlci1zdXBwbGllZCBpbmRleCBpZGVudGlmeWluZyBhbiBlbGVtZW50IG9mIGFuIGFycmF5LCBsaXN0IG9yIHN0cmluZworICAgICAqIEBwYXJhbSBzaXplICB0aGUgc2l6ZSBvZiB0aGF0IGFycmF5LCBsaXN0IG9yIHN0cmluZworICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHtAY29kZSBpbmRleH0KKyAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYge0Bjb2RlIGluZGV4fSBpcyBuZWdhdGl2ZSBvciBpcyBub3QgbGVzcyB0aGFuIHtAY29kZSBzaXplfQorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBpZiB7QGNvZGUgc2l6ZX0gaXMgbmVnYXRpdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBjaGVja0VsZW1lbnRJbmRleChpbnQgaW5kZXgsIGludCBzaXplKSB7CisgICAgICAgIHJldHVybiBjaGVja0VsZW1lbnRJbmRleChpbmRleCwgc2l6ZSwgImluZGV4Iik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5zdXJlcyB0aGF0IHtAY29kZSBpbmRleH0gc3BlY2lmaWVzIGEgdmFsaWQgPGk+ZWxlbWVudDwvaT4gaW4gYW4gYXJyYXksIGxpc3Qgb3Igc3RyaW5nIG9mIHNpemUKKyAgICAgKiB7QGNvZGUgc2l6ZX0uIEFuIGVsZW1lbnQgaW5kZXggbWF5IHJhbmdlIGZyb20gemVybywgaW5jbHVzaXZlLCB0byB7QGNvZGUgc2l6ZX0sIGV4Y2x1c2l2ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmRleCBhIHVzZXItc3VwcGxpZWQgaW5kZXggaWRlbnRpZnlpbmcgYW4gZWxlbWVudCBvZiBhbiBhcnJheSwgbGlzdCBvciBzdHJpbmcKKyAgICAgKiBAcGFyYW0gc2l6ZSAgdGhlIHNpemUgb2YgdGhhdCBhcnJheSwgbGlzdCBvciBzdHJpbmcKKyAgICAgKiBAcGFyYW0gZGVzYyAgdGhlIHRleHQgdG8gdXNlIHRvIGRlc2NyaWJlIHRoaXMgaW5kZXggaW4gYW4gZXJyb3IgbWVzc2FnZQorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIG9mIHtAY29kZSBpbmRleH0KKyAgICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYge0Bjb2RlIGluZGV4fSBpcyBuZWdhdGl2ZSBvciBpcyBub3QgbGVzcyB0aGFuIHtAY29kZSBzaXplfQorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBpZiB7QGNvZGUgc2l6ZX0gaXMgbmVnYXRpdmUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgY2hlY2tFbGVtZW50SW5kZXgoCisgICAgICAgICAgICBpbnQgaW5kZXgsIGludCBzaXplLCBTdHJpbmcgZGVzYykgeworICAgICAgICAvLyBDYXJlZnVsbHkgb3B0aW1pemVkIGZvciBleGVjdXRpb24gYnkgaG90c3BvdCAoZXhwbGFuYXRvcnkgY29tbWVudCBhYm92ZSkKKyAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBzaXplKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihiYWRFbGVtZW50SW5kZXgoaW5kZXgsIHNpemUsIGRlc2MpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGJhZEVsZW1lbnRJbmRleChpbnQgaW5kZXgsIGludCBzaXplLCBTdHJpbmcgZGVzYykgeworICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gZm9ybWF0KCIlcyAoJXMpIG11c3Qgbm90IGJlIG5lZ2F0aXZlIiwgZGVzYywgaW5kZXgpOworICAgICAgICB9IGVsc2UgaWYgKHNpemUgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJuZWdhdGl2ZSBzaXplOiAiICsgc2l6ZSk7CisgICAgICAgIH0gZWxzZSB7IC8vIGluZGV4ID49IHNpemUKKyAgICAgICAgICAgIHJldHVybiBmb3JtYXQoIiVzICglcykgbXVzdCBiZSBsZXNzIHRoYW4gc2l6ZSAoJXMpIiwgZGVzYywgaW5kZXgsIHNpemUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5zdXJlcyB0aGF0IHtAY29kZSBpbmRleH0gc3BlY2lmaWVzIGEgdmFsaWQgPGk+cG9zaXRpb248L2k+IGluIGFuIGFycmF5LCBsaXN0IG9yIHN0cmluZyBvZgorICAgICAqIHNpemUge0Bjb2RlIHNpemV9LiBBIHBvc2l0aW9uIGluZGV4IG1heSByYW5nZSBmcm9tIHplcm8gdG8ge0Bjb2RlIHNpemV9LCBpbmNsdXNpdmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5kZXggYSB1c2VyLXN1cHBsaWVkIGluZGV4IGlkZW50aWZ5aW5nIGEgcG9zaXRpb24gaW4gYW4gYXJyYXksIGxpc3Qgb3Igc3RyaW5nCisgICAgICogQHBhcmFtIHNpemUgIHRoZSBzaXplIG9mIHRoYXQgYXJyYXksIGxpc3Qgb3Igc3RyaW5nCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2Yge0Bjb2RlIGluZGV4fQorICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiB7QGNvZGUgaW5kZXh9IGlzIG5lZ2F0aXZlIG9yIGlzIGdyZWF0ZXIgdGhhbiB7QGNvZGUgc2l6ZX0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgaWYge0Bjb2RlIHNpemV9IGlzIG5lZ2F0aXZlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgY2hlY2tQb3NpdGlvbkluZGV4KGludCBpbmRleCwgaW50IHNpemUpIHsKKyAgICAgICAgcmV0dXJuIGNoZWNrUG9zaXRpb25JbmRleChpbmRleCwgc2l6ZSwgImluZGV4Iik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5zdXJlcyB0aGF0IHtAY29kZSBpbmRleH0gc3BlY2lmaWVzIGEgdmFsaWQgPGk+cG9zaXRpb248L2k+IGluIGFuIGFycmF5LCBsaXN0IG9yIHN0cmluZyBvZgorICAgICAqIHNpemUge0Bjb2RlIHNpemV9LiBBIHBvc2l0aW9uIGluZGV4IG1heSByYW5nZSBmcm9tIHplcm8gdG8ge0Bjb2RlIHNpemV9LCBpbmNsdXNpdmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5kZXggYSB1c2VyLXN1cHBsaWVkIGluZGV4IGlkZW50aWZ5aW5nIGEgcG9zaXRpb24gaW4gYW4gYXJyYXksIGxpc3Qgb3Igc3RyaW5nCisgICAgICogQHBhcmFtIHNpemUgIHRoZSBzaXplIG9mIHRoYXQgYXJyYXksIGxpc3Qgb3Igc3RyaW5nCisgICAgICogQHBhcmFtIGRlc2MgIHRoZSB0ZXh0IHRvIHVzZSB0byBkZXNjcmliZSB0aGlzIGluZGV4IGluIGFuIGVycm9yIG1lc3NhZ2UKKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB7QGNvZGUgaW5kZXh9CisgICAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHtAY29kZSBpbmRleH0gaXMgbmVnYXRpdmUgb3IgaXMgZ3JlYXRlciB0aGFuIHtAY29kZSBzaXplfQorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uICBpZiB7QGNvZGUgc2l6ZX0gaXMgbmVnYXRpdmUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgY2hlY2tQb3NpdGlvbkluZGV4KGludCBpbmRleCwgaW50IHNpemUsIFN0cmluZyBkZXNjKSB7CisgICAgICAgIC8vIENhcmVmdWxseSBvcHRpbWl6ZWQgZm9yIGV4ZWN1dGlvbiBieSBob3RzcG90IChleHBsYW5hdG9yeSBjb21tZW50IGFib3ZlKQorICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gc2l6ZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oYmFkUG9zaXRpb25JbmRleChpbmRleCwgc2l6ZSwgZGVzYykpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpbmRleDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYmFkUG9zaXRpb25JbmRleChpbnQgaW5kZXgsIGludCBzaXplLCBTdHJpbmcgZGVzYykgeworICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gZm9ybWF0KCIlcyAoJXMpIG11c3Qgbm90IGJlIG5lZ2F0aXZlIiwgZGVzYywgaW5kZXgpOworICAgICAgICB9IGVsc2UgaWYgKHNpemUgPCAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJuZWdhdGl2ZSBzaXplOiAiICsgc2l6ZSk7CisgICAgICAgIH0gZWxzZSB7IC8vIGluZGV4ID4gc2l6ZQorICAgICAgICAgICAgcmV0dXJuIGZvcm1hdCgiJXMgKCVzKSBtdXN0IG5vdCBiZSBncmVhdGVyIHRoYW4gc2l6ZSAoJXMpIiwgZGVzYywgaW5kZXgsIHNpemUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5zdXJlcyB0aGF0IHtAY29kZSBzdGFydH0gYW5kIHtAY29kZSBlbmR9IHNwZWNpZnkgYSB2YWxpZCA8aT5wb3NpdGlvbnM8L2k+IGluIGFuIGFycmF5LCBsaXN0CisgICAgICogb3Igc3RyaW5nIG9mIHNpemUge0Bjb2RlIHNpemV9LCBhbmQgYXJlIGluIG9yZGVyLiBBIHBvc2l0aW9uIGluZGV4IG1heSByYW5nZSBmcm9tIHplcm8gdG8KKyAgICAgKiB7QGNvZGUgc2l6ZX0sIGluY2x1c2l2ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGFydCBhIHVzZXItc3VwcGxpZWQgaW5kZXggaWRlbnRpZnlpbmcgYSBzdGFydGluZyBwb3NpdGlvbiBpbiBhbiBhcnJheSwgbGlzdCBvciBzdHJpbmcKKyAgICAgKiBAcGFyYW0gZW5kICAgYSB1c2VyLXN1cHBsaWVkIGluZGV4IGlkZW50aWZ5aW5nIGEgZW5kaW5nIHBvc2l0aW9uIGluIGFuIGFycmF5LCBsaXN0IG9yIHN0cmluZworICAgICAqIEBwYXJhbSBzaXplICB0aGUgc2l6ZSBvZiB0aGF0IGFycmF5LCBsaXN0IG9yIHN0cmluZworICAgICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiBlaXRoZXIgaW5kZXggaXMgbmVnYXRpdmUgb3IgaXMgZ3JlYXRlciB0aGFuIHtAY29kZSBzaXplfSwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaWYge0Bjb2RlIGVuZH0gaXMgbGVzcyB0aGFuIHtAY29kZSBzdGFydH0KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiAgaWYge0Bjb2RlIHNpemV9IGlzIG5lZ2F0aXZlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNoZWNrUG9zaXRpb25JbmRleGVzKGludCBzdGFydCwgaW50IGVuZCwgaW50IHNpemUpIHsKKyAgICAgICAgLy8gQ2FyZWZ1bGx5IG9wdGltaXplZCBmb3IgZXhlY3V0aW9uIGJ5IGhvdHNwb3QgKGV4cGxhbmF0b3J5IGNvbW1lbnQgYWJvdmUpCisgICAgICAgIGlmIChzdGFydCA8IDAgfHwgZW5kIDwgc3RhcnQgfHwgZW5kID4gc2l6ZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oYmFkUG9zaXRpb25JbmRleGVzKHN0YXJ0LCBlbmQsIHNpemUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBiYWRQb3NpdGlvbkluZGV4ZXMoaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgc2l6ZSkgeworICAgICAgICBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID4gc2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIGJhZFBvc2l0aW9uSW5kZXgoc3RhcnQsIHNpemUsICJzdGFydCBpbmRleCIpOworICAgICAgICB9CisgICAgICAgIGlmIChlbmQgPCAwIHx8IGVuZCA+IHNpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBiYWRQb3NpdGlvbkluZGV4KGVuZCwgc2l6ZSwgImVuZCBpbmRleCIpOworICAgICAgICB9CisgICAgICAgIC8vIGVuZCA8IHN0YXJ0CisgICAgICAgIHJldHVybiBmb3JtYXQoImVuZCBpbmRleCAoJXMpIG11c3Qgbm90IGJlIGxlc3MgdGhhbiBzdGFydCBpbmRleCAoJXMpIiwgZW5kLCBzdGFydCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3Vic3RpdHV0ZXMgZWFjaCB7QGNvZGUgJXN9IGluIHtAY29kZSB0ZW1wbGF0ZX0gd2l0aCBhbiBhcmd1bWVudC4gVGhlc2UgYXJlIG1hdGNoZWQgYnkKKyAgICAgKiBwb3NpdGlvbjogdGhlIGZpcnN0IHtAY29kZSAlc30gZ2V0cyB7QGNvZGUgYXJnc1swXX0sIGV0Yy4gIElmIHRoZXJlIGFyZSBtb3JlIGFyZ3VtZW50cyB0aGFuCisgICAgICogcGxhY2Vob2xkZXJzLCB0aGUgdW5tYXRjaGVkIGFyZ3VtZW50cyB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBlbmQgb2YgdGhlIGZvcm1hdHRlZCBtZXNzYWdlIGluCisgICAgICogc3F1YXJlIGJyYWNlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZW1wbGF0ZSBhIG5vbi1udWxsIHN0cmluZyBjb250YWluaW5nIDAgb3IgbW9yZSB7QGNvZGUgJXN9IHBsYWNlaG9sZGVycy4KKyAgICAgKiBAcGFyYW0gYXJncyAgICAgdGhlIGFyZ3VtZW50cyB0byBiZSBzdWJzdGl0dXRlZCBpbnRvIHRoZSBtZXNzYWdlIHRlbXBsYXRlLiBBcmd1bWVudHMgYXJlIGNvbnZlcnRlZAorICAgICAqICAgICAgICAgICAgICAgICB0byBzdHJpbmdzIHVzaW5nIHtAbGluayBTdHJpbmcjdmFsdWVPZihPYmplY3QpfS4gQXJndW1lbnRzIGNhbiBiZSBudWxsLgorICAgICAqLworICAgIC8vIE5vdGUgdGhhdCB0aGlzIGlzIHNvbWV3aGF0LWltcHJvcGVybHkgdXNlZCBmcm9tIFZlcmlmeS5qYXZhIGFzIHdlbGwuCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGZvcm1hdChTdHJpbmcgdGVtcGxhdGUsIE9iamVjdC4uLiBhcmdzKSB7CisgICAgICAgIHRlbXBsYXRlID0gU3RyaW5nLnZhbHVlT2YodGVtcGxhdGUpOyAvLyBudWxsIC0+ICJudWxsIgorCisgICAgICAgIC8vIHN0YXJ0IHN1YnN0aXR1dGluZyB0aGUgYXJndW1lbnRzIGludG8gdGhlICclcycgcGxhY2Vob2xkZXJzCisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKHRlbXBsYXRlLmxlbmd0aCgpICsgMTYgKiBhcmdzLmxlbmd0aCk7CisgICAgICAgIGludCB0ZW1wbGF0ZVN0YXJ0ID0gMDsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICB3aGlsZSAoaSA8IGFyZ3MubGVuZ3RoKSB7CisgICAgICAgICAgICBpbnQgcGxhY2Vob2xkZXJTdGFydCA9IHRlbXBsYXRlLmluZGV4T2YoIiVzIiwgdGVtcGxhdGVTdGFydCk7CisgICAgICAgICAgICBpZiAocGxhY2Vob2xkZXJTdGFydCA9PSAtMSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQodGVtcGxhdGUuc3Vic3RyaW5nKHRlbXBsYXRlU3RhcnQsIHBsYWNlaG9sZGVyU3RhcnQpKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGFyZ3NbaSsrXSk7CisgICAgICAgICAgICB0ZW1wbGF0ZVN0YXJ0ID0gcGxhY2Vob2xkZXJTdGFydCArIDI7CisgICAgICAgIH0KKyAgICAgICAgYnVpbGRlci5hcHBlbmQodGVtcGxhdGUuc3Vic3RyaW5nKHRlbXBsYXRlU3RhcnQpKTsKKworICAgICAgICAvLyBpZiB3ZSBydW4gb3V0IG9mIHBsYWNlaG9sZGVycywgYXBwZW5kIHRoZSBleHRyYSBhcmdzIGluIHNxdWFyZSBicmFjZXMKKyAgICAgICAgaWYgKGkgPCBhcmdzLmxlbmd0aCkgeworICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIiBbIik7CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChhcmdzW2krK10pOworICAgICAgICAgICAgd2hpbGUgKGkgPCBhcmdzLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGFyZ3NbaSsrXSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnXScpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL1ByZWRpY2F0ZXMuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvUHJlZGljYXRlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0YWVkNWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL1ByZWRpY2F0ZXMuamF2YQpAQCAtMCwwICsxLDMwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgR3VhdmEgQXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YTsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlOworCitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworCisvKioKKyAqIFN0YXRpYyB1dGlsaXR5IG1ldGhvZHMgcGVydGFpbmluZyB0byB7QGNvZGUgUHJlZGljYXRlfSBpbnN0YW5jZXMuCisgKiA8cD4KKyAqIDxwPkFsbCBtZXRob2RzIHJldHVybnMgc2VyaWFsaXphYmxlIHByZWRpY2F0ZXMgYXMgbG9uZyBhcyB0aGV5J3JlIGdpdmVuCisgKiBzZXJpYWxpemFibGUgcGFyYW1ldGVycy4KKyAqIDxwPgorICogPHA+U2VlIHRoZSBHdWF2YSBVc2VyIEd1aWRlIGFydGljbGUgb24gPGEgaHJlZj0KKyAqICJodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ3VhdmEtbGlicmFyaWVzL3dpa2kvRnVuY3Rpb25hbEV4cGxhaW5lZCI+dGhlCisgKiB1c2Ugb2Yge0Bjb2RlIFByZWRpY2F0ZX08L2E+LgorICoKKyAqIEBhdXRob3IgS2V2aW4gQm91cnJpbGxpb24KKyAqIEBzaW5jZSAyLjAgKGltcG9ydGVkIGZyb20gR29vZ2xlIENvbGxlY3Rpb25zIExpYnJhcnkpCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBQcmVkaWNhdGVzIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBKb2luZXIgQ09NTUFfSk9JTkVSID0gSm9pbmVyLm9uKCk7CisKKyAgICAvLyBUT0RPKGtldmluYik6IGNvbnNpZGVyaW5nIGhhdmluZyB0aGVzZSBpbXBsZW1lbnQgYSBWaXNpdGFibGVQcmVkaWNhdGUKKyAgICAvLyBpbnRlcmZhY2Ugd2hpY2ggc3BlY2lmaWVzIGFuIGFjY2VwdChQcmVkaWNhdGVWaXNpdG9yKSBtZXRob2QuCisKKyAgICBwcml2YXRlIFByZWRpY2F0ZXMoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHByZWRpY2F0ZSB0aGF0IGFsd2F5cyBldmFsdWF0ZXMgdG8ge0Bjb2RlIHRydWV9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFByZWRpY2F0ZTxUPiBhbHdheXNUcnVlKCkgeworICAgICAgICByZXR1cm4gT2JqZWN0UHJlZGljYXRlLkFMV0FZU19UUlVFLndpdGhOYXJyb3dlZFR5cGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgcHJlZGljYXRlIHRoYXQgZXZhbHVhdGVzIHRvIHtAY29kZSB0cnVlfSBpZiB0aGUgb2JqZWN0IHJlZmVyZW5jZQorICAgICAqIGJlaW5nIHRlc3RlZCBpcyBudWxsLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIDxUPiBQcmVkaWNhdGU8VD4gaXNOdWxsKCkgeworICAgICAgICByZXR1cm4gT2JqZWN0UHJlZGljYXRlLklTX05VTEwud2l0aE5hcnJvd2VkVHlwZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBwcmVkaWNhdGUgdGhhdCBldmFsdWF0ZXMgdG8ge0Bjb2RlIHRydWV9IGlmIHRoZSBnaXZlbiBwcmVkaWNhdGUKKyAgICAgKiBldmFsdWF0ZXMgdG8ge0Bjb2RlIGZhbHNlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUPiBQcmVkaWNhdGU8VD4gbm90KFByZWRpY2F0ZTxUPiBwcmVkaWNhdGUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBOb3RQcmVkaWNhdGU8VD4ocHJlZGljYXRlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgcHJlZGljYXRlIHRoYXQgZXZhbHVhdGVzIHRvIHtAY29kZSB0cnVlfSBpZiB0aGUgb2JqZWN0IGJlaW5nCisgICAgICogdGVzdGVkIHtAY29kZSBlcXVhbHMoKX0gdGhlIGdpdmVuIHRhcmdldCBvciBib3RoIGFyZSBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFByZWRpY2F0ZTxUPiBlcXVhbFRvKFQgdGFyZ2V0KSB7CisgICAgICAgIHJldHVybiAodGFyZ2V0ID09IG51bGwpCisgICAgICAgICAgICAgICAgPyBQcmVkaWNhdGVzLmlzTnVsbCgpCisgICAgICAgICAgICAgICAgOiBuZXcgSXNFcXVhbFRvUHJlZGljYXRlPFQ+KHRhcmdldCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHByZWRpY2F0ZSB0aGF0IGV2YWx1YXRlcyB0byB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG9iamVjdCByZWZlcmVuY2UKKyAgICAgKiBiZWluZyB0ZXN0ZWQgaXMgYSBtZW1iZXIgb2YgdGhlIGdpdmVuIGNvbGxlY3Rpb24uIEl0IGRvZXMgbm90IGRlZmVuc2l2ZWx5CisgICAgICogY29weSB0aGUgY29sbGVjdGlvbiBwYXNzZWQgaW4sIHNvIGZ1dHVyZSBjaGFuZ2VzIHRvIGl0IHdpbGwgYWx0ZXIgdGhlCisgICAgICogYmVoYXZpb3Igb2YgdGhlIHByZWRpY2F0ZS4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5UaGlzIG1ldGhvZCBjYW4gdGVjaG5pY2FsbHkgYWNjZXB0IGFueSB7QGNvZGUgQ29sbGVjdGlvbjw/Pn0sIGJ1dCB1c2luZworICAgICAqIGEgdHlwZWQgY29sbGVjdGlvbiBoZWxwcyBwcmV2ZW50IGJ1Z3MuIFRoaXMgYXBwcm9hY2ggZG9lc24ndCBibG9jayBhbnkKKyAgICAgKiBwb3RlbnRpYWwgdXNlcnMgc2luY2UgaXQgaXMgYWx3YXlzIHBvc3NpYmxlIHRvIHVzZSB7QGNvZGUKKyAgICAgKiBQcmVkaWNhdGVzLjxPYmplY3Q+aW4oKX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFyZ2V0IHRoZSBjb2xsZWN0aW9uIHRoYXQgbWF5IGNvbnRhaW4gdGhlIGZ1bmN0aW9uIGlucHV0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8VD4gUHJlZGljYXRlPFQ+IGluKENvbGxlY3Rpb248PyBleHRlbmRzIFQ+IHRhcmdldCkgeworICAgICAgICByZXR1cm4gbmV3IEluUHJlZGljYXRlPFQ+KHRhcmdldCk7CisgICAgfQorCisgICAgLy8gRW5kIHB1YmxpYyBBUEksIGJlZ2luIHByaXZhdGUgaW1wbGVtZW50YXRpb24gY2xhc3Nlcy4KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGNvbXBvc2l0aW9uIG9mIGEgZnVuY3Rpb24gYW5kIGEgcHJlZGljYXRlLiBGb3IgZXZlcnkge0Bjb2RlIHh9LAorICAgICAqIHRoZSBnZW5lcmF0ZWQgcHJlZGljYXRlIHJldHVybnMge0Bjb2RlIHByZWRpY2F0ZShmdW5jdGlvbih4KSl9LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgY29tcG9zaXRpb24gb2YgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uIGFuZCBwcmVkaWNhdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxBLCBCPiBQcmVkaWNhdGU8QT4gY29tcG9zZSgKKyAgICAgICAgICAgIFByZWRpY2F0ZTxCPiBwcmVkaWNhdGUsIEZ1bmN0aW9uPEEsID8gZXh0ZW5kcyBCPiBmdW5jdGlvbikgeworICAgICAgICByZXR1cm4gbmV3IENvbXBvc2l0aW9uUHJlZGljYXRlPEEsIEI+KHByZWRpY2F0ZSwgZnVuY3Rpb24pOworICAgIH0KKworICAgIC8vIFBhY2thZ2UgcHJpdmF0ZSBmb3IgR1dUIHNlcmlhbGl6YXRpb24uCisgICAgZW51bSBPYmplY3RQcmVkaWNhdGUgaW1wbGVtZW50cyBQcmVkaWNhdGU8T2JqZWN0PiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAc2VlIFByZWRpY2F0ZXMjYWx3YXlzVHJ1ZSgpCisgICAgICAgICAqLworICAgICAgICBBTFdBWVNfVFJVRSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHRlc3QoT2JqZWN0IG8pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgICAgIHJldHVybiAiUHJlZGljYXRlcy5hbHdheXNUcnVlKCkiOworICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBQcmVkaWNhdGVzI2lzTnVsbCgpCisgICAgICAgICAqLworICAgICAgICBJU19OVUxMIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gdGVzdChPYmplY3QgbykgeworICAgICAgICAgICAgICAgIHJldHVybiBvID09IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIlByZWRpY2F0ZXMuaXNOdWxsKCkiOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICAgICAgLy8gc2FmZSBjb250cmF2YXJpYW50IGNhc3QKKyAgICAgICAgPFQ+IFByZWRpY2F0ZTxUPiB3aXRoTmFycm93ZWRUeXBlKCkgeworICAgICAgICAgICAgcmV0dXJuIChQcmVkaWNhdGU8VD4pIHRoaXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIFByZWRpY2F0ZXMjbm90KFByZWRpY2F0ZSkKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBOb3RQcmVkaWNhdGU8VD4gaW1wbGVtZW50cyBQcmVkaWNhdGU8VD4sIFNlcmlhbGl6YWJsZSB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDA7CisgICAgICAgIGZpbmFsIFByZWRpY2F0ZTxUPiBwcmVkaWNhdGU7CisKKyAgICAgICAgTm90UHJlZGljYXRlKFByZWRpY2F0ZTxUPiBwcmVkaWNhdGUpIHsKKyAgICAgICAgICAgIHRoaXMucHJlZGljYXRlID0gUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGwocHJlZGljYXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiB0ZXN0KFQgdCkgeworICAgICAgICAgICAgcmV0dXJuICFwcmVkaWNhdGUudGVzdCh0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgcmV0dXJuIH5wcmVkaWNhdGUuaGFzaENvZGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIE5vdFByZWRpY2F0ZSkgeworICAgICAgICAgICAgICAgIE5vdFByZWRpY2F0ZTw/PiB0aGF0ID0gKE5vdFByZWRpY2F0ZTw/Pikgb2JqOworICAgICAgICAgICAgICAgIHJldHVybiBwcmVkaWNhdGUuZXF1YWxzKHRoYXQucHJlZGljYXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJQcmVkaWNhdGVzLm5vdCgiICsgcHJlZGljYXRlLnRvU3RyaW5nKCkgKyAiKSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIFByZWRpY2F0ZXMjZXF1YWxUbyhPYmplY3QpCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSXNFcXVhbFRvUHJlZGljYXRlPFQ+CisgICAgICAgICAgICBpbXBsZW1lbnRzIFByZWRpY2F0ZTxUPiwgU2VyaWFsaXphYmxlIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBUIHRhcmdldDsKKworICAgICAgICBwcml2YXRlIElzRXF1YWxUb1ByZWRpY2F0ZShUIHRhcmdldCkgeworICAgICAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gdGVzdChUIHQpIHsKKyAgICAgICAgICAgIHJldHVybiB0YXJnZXQuZXF1YWxzKHQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gdGFyZ2V0Lmhhc2hDb2RlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBJc0VxdWFsVG9QcmVkaWNhdGUpIHsKKyAgICAgICAgICAgICAgICBJc0VxdWFsVG9QcmVkaWNhdGU8Pz4gdGhhdCA9IChJc0VxdWFsVG9QcmVkaWNhdGU8Pz4pIG9iajsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0LmVxdWFscyh0aGF0LnRhcmdldCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiUHJlZGljYXRlcy5lcXVhbFRvKCIgKyB0YXJnZXQgKyAiKSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIFByZWRpY2F0ZXMjaW4oQ29sbGVjdGlvbikKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJblByZWRpY2F0ZTxUPiBpbXBsZW1lbnRzIFByZWRpY2F0ZTxUPiwgU2VyaWFsaXphYmxlIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPD8+IHRhcmdldDsKKworICAgICAgICBwcml2YXRlIEluUHJlZGljYXRlKENvbGxlY3Rpb248Pz4gdGFyZ2V0KSB7CisgICAgICAgICAgICB0aGlzLnRhcmdldCA9IFByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsKHRhcmdldCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gdGVzdChUIHQpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5jb250YWlucyh0KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEluUHJlZGljYXRlKSB7CisgICAgICAgICAgICAgICAgSW5QcmVkaWNhdGU8Pz4gdGhhdCA9IChJblByZWRpY2F0ZTw/Pikgb2JqOworICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQuZXF1YWxzKHRoYXQudGFyZ2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgcmV0dXJuIHRhcmdldC5oYXNoQ29kZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIlByZWRpY2F0ZXMuaW4oIiArIHRhcmdldCArICIpIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgUHJlZGljYXRlcyNjb21wb3NlKFByZWRpY2F0ZSwgRnVuY3Rpb24pCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29tcG9zaXRpb25QcmVkaWNhdGU8QSwgQj4KKyAgICAgICAgICAgIGltcGxlbWVudHMgUHJlZGljYXRlPEE+LCBTZXJpYWxpemFibGUgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAwOworICAgICAgICBmaW5hbCBQcmVkaWNhdGU8Qj4gcDsKKyAgICAgICAgZmluYWwgRnVuY3Rpb248QSwgPyBleHRlbmRzIEI+IGY7CisKKyAgICAgICAgcHJpdmF0ZSBDb21wb3NpdGlvblByZWRpY2F0ZShQcmVkaWNhdGU8Qj4gcCwgRnVuY3Rpb248QSwgPyBleHRlbmRzIEI+IGYpIHsKKyAgICAgICAgICAgIHRoaXMucCA9IFByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsKHApOworICAgICAgICAgICAgdGhpcy5mID0gUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGwoZik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gdGVzdChBIGEpIHsKKyAgICAgICAgICAgIHJldHVybiBwLnRlc3QoZi5hcHBseShhKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBDb21wb3NpdGlvblByZWRpY2F0ZSkgeworICAgICAgICAgICAgICAgIENvbXBvc2l0aW9uUHJlZGljYXRlPD8sID8+IHRoYXQgPSAoQ29tcG9zaXRpb25QcmVkaWNhdGU8PywgPz4pIG9iajsKKyAgICAgICAgICAgICAgICByZXR1cm4gZi5lcXVhbHModGhhdC5mKSAmJiBwLmVxdWFscyh0aGF0LnApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gZi5oYXNoQ29kZSgpIF4gcC5oYXNoQ29kZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gcC50b1N0cmluZygpICsgIigiICsgZi50b1N0cmluZygpICsgIikiOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL1ByaW1pdGl2ZXMuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvUHJpbWl0aXZlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ZDVhYTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL1ByaW1pdGl2ZXMuamF2YQpAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBHdWF2YSBBdXRob3JzCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmEuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CisKKy8qKgorICogQ29udGFpbnMgc3RhdGljIHV0aWxpdHkgbWV0aG9kcyBwZXJ0YWluaW5nIHRvIHByaW1pdGl2ZSB0eXBlcyBhbmQgdGhlaXIKKyAqIGNvcnJlc3BvbmRpbmcgd3JhcHBlciB0eXBlcy4KKyAqCisgKiBAYXV0aG9yIEtldmluIEJvdXJyaWxsaW9uCisgKiBAc2luY2UgMS4wCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBQcmltaXRpdmVzIHsKKyAgICAvKioKKyAgICAgKiBBIG1hcCBmcm9tIHByaW1pdGl2ZSB0eXBlcyB0byB0aGVpciBjb3JyZXNwb25kaW5nIHdyYXBwZXIgdHlwZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPENsYXNzPD8+LCBDbGFzczw/Pj4gUFJJTUlUSVZFX1RPX1dSQVBQRVJfVFlQRTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIE1hcDxDbGFzczw/PiwgQ2xhc3M8Pz4+IHByaW1Ub1dyYXAgPSBuZXcgSGFzaE1hcDxDbGFzczw/PiwgQ2xhc3M8Pz4+KDE2KTsKKworICAgICAgICBhZGQocHJpbVRvV3JhcCwgYm9vbGVhbi5jbGFzcywgQm9vbGVhbi5jbGFzcyk7CisgICAgICAgIGFkZChwcmltVG9XcmFwLCBieXRlLmNsYXNzLCBCeXRlLmNsYXNzKTsKKyAgICAgICAgYWRkKHByaW1Ub1dyYXAsIGNoYXIuY2xhc3MsIENoYXJhY3Rlci5jbGFzcyk7CisgICAgICAgIGFkZChwcmltVG9XcmFwLCBkb3VibGUuY2xhc3MsIERvdWJsZS5jbGFzcyk7CisgICAgICAgIGFkZChwcmltVG9XcmFwLCBmbG9hdC5jbGFzcywgRmxvYXQuY2xhc3MpOworICAgICAgICBhZGQocHJpbVRvV3JhcCwgaW50LmNsYXNzLCBJbnRlZ2VyLmNsYXNzKTsKKyAgICAgICAgYWRkKHByaW1Ub1dyYXAsIGxvbmcuY2xhc3MsIExvbmcuY2xhc3MpOworICAgICAgICBhZGQocHJpbVRvV3JhcCwgc2hvcnQuY2xhc3MsIFNob3J0LmNsYXNzKTsKKyAgICAgICAgYWRkKHByaW1Ub1dyYXAsIHZvaWQuY2xhc3MsIFZvaWQuY2xhc3MpOworCisgICAgICAgIFBSSU1JVElWRV9UT19XUkFQUEVSX1RZUEUgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAocHJpbVRvV3JhcCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBQcmltaXRpdmVzKCkgeworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkKE1hcDxDbGFzczw/PiwgQ2xhc3M8Pz4+IGZvcndhcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M8Pz4ga2V5LCBDbGFzczw/PiB2YWx1ZSkgeworICAgICAgICBmb3J3YXJkLnB1dChrZXksIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHdyYXBwZXIgdHlwZSBvZiB7QGNvZGUgdHlwZX0gaWYgaXQgaXMgYSBwcmltaXRpdmUKKyAgICAgKiB0eXBlOyBvdGhlcndpc2UgcmV0dXJucyB7QGNvZGUgdHlwZX0gaXRzZWxmLiBJZGVtcG90ZW50LgorICAgICAqIDxwcmU+CisgICAgICogICAgIHdyYXAoaW50LmNsYXNzKSA9PSBJbnRlZ2VyLmNsYXNzCisgICAgICogICAgIHdyYXAoSW50ZWdlci5jbGFzcykgPT0gSW50ZWdlci5jbGFzcworICAgICAqICAgICB3cmFwKFN0cmluZy5jbGFzcykgPT0gU3RyaW5nLmNsYXNzCisgICAgICogPC9wcmU+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8VD4gQ2xhc3M8VD4gd3JhcChDbGFzczxUPiB0eXBlKSB7CisgICAgICAgIGNoZWNrTm90TnVsbCh0eXBlKTsKKworICAgICAgICAvLyBjYXN0IGlzIHNhZmU6IGxvbmcuY2xhc3MgYW5kIExvbmcuY2xhc3MgYXJlIGJvdGggb2YgdHlwZSBDbGFzczxMb25nPgorICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgQ2xhc3M8VD4gd3JhcHBlZCA9IChDbGFzczxUPikgUFJJTUlUSVZFX1RPX1dSQVBQRVJfVFlQRS5nZXQodHlwZSk7CisgICAgICAgIHJldHVybiAod3JhcHBlZCA9PSBudWxsKSA/IHR5cGUgOiB3cmFwcGVkOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9SZW1vdmFsQ2F1c2UuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvUmVtb3ZhbENhdXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg0Y2U4NwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvUmVtb3ZhbENhdXNlLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgR3VhdmEgQXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRNYXA7CisKKy8qKgorICogVGhlIHJlYXNvbiB3aHkgYSBjYWNoZWQgZW50cnkgd2FzIHJlbW92ZWQuCisgKgorICogQGF1dGhvciBDaGFybGVzIEZyeQorICogQHNpbmNlIDEwLjAKKyAqLworcHVibGljIGVudW0gUmVtb3ZhbENhdXNlIHsKKyAgICAvKioKKyAgICAgKiBUaGUgZW50cnkgd2FzIG1hbnVhbGx5IHJlbW92ZWQgYnkgdGhlIHVzZXIuIFRoaXMgY2FuIHJlc3VsdCBmcm9tIHRoZSB1c2VyIGludm9raW5nCisgICAgICoge0BsaW5rIENhY2hlI2ludmFsaWRhdGV9LCB7QGxpbmsgQ2FjaGUjaW52YWxpZGF0ZUFsbChJdGVyYWJsZSl9LCB7QGxpbmsgQ2FjaGUjaW52YWxpZGF0ZUFsbCgpfSwKKyAgICAgKiB7QGxpbmsgTWFwI3JlbW92ZX0sIHtAbGluayBDb25jdXJyZW50TWFwI3JlbW92ZX0sIG9yIHtAbGluayBJdGVyYXRvciNyZW1vdmV9LgorICAgICAqLworICAgIEVYUExJQ0lUIHsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogVGhlIGVudHJ5IGl0c2VsZiB3YXMgbm90IGFjdHVhbGx5IHJlbW92ZWQsIGJ1dCBpdHMgdmFsdWUgd2FzIHJlcGxhY2VkIGJ5IHRoZSB1c2VyLiBUaGlzIGNhbgorICAgICAqIHJlc3VsdCBmcm9tIHRoZSB1c2VyIGludm9raW5nIHtAbGluayBDYWNoZSNwdXR9LCB7QGxpbmsgTG9hZGluZ0NhY2hlI3JlZnJlc2h9LCB7QGxpbmsgTWFwI3B1dH0sCisgICAgICoge0BsaW5rIE1hcCNwdXRBbGx9LCB7QGxpbmsgQ29uY3VycmVudE1hcCNyZXBsYWNlKE9iamVjdCwgT2JqZWN0KX0sIG9yCisgICAgICoge0BsaW5rIENvbmN1cnJlbnRNYXAjcmVwbGFjZShPYmplY3QsIE9iamVjdCwgT2JqZWN0KX0uCisgICAgICovCisgICAgUkVQTEFDRUQgeworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBUaGUgZW50cnkgd2FzIHJlbW92ZWQgYXV0b21hdGljYWxseSBiZWNhdXNlIGl0cyBrZXkgb3IgdmFsdWUgd2FzIGdhcmJhZ2UtY29sbGVjdGVkLiBUaGlzCisgICAgICogY2FuIG9jY3VyIHdoZW4gdXNpbmcge0BsaW5rIENhY2hlQnVpbGRlciN3ZWFrS2V5c30sIHtAbGluayBDYWNoZUJ1aWxkZXIjd2Vha1ZhbHVlc30sIG9yCisgICAgICoge0BsaW5rIENhY2hlQnVpbGRlciNzb2Z0VmFsdWVzfS4KKyAgICAgKi8KKyAgICBDT0xMRUNURUQgeworICAgIH0sCisKKyAgICAvKioKKyAgICAgKiBUaGUgZW50cnkncyBleHBpcmF0aW9uIHRpbWVzdGFtcCBoYXMgcGFzc2VkLiBUaGlzIGNhbiBvY2N1ciB3aGVuIHVzaW5nCisgICAgICoge0BsaW5rIENhY2hlQnVpbGRlciNleHBpcmVBZnRlcldyaXRlfSBvciB7QGxpbmsgQ2FjaGVCdWlsZGVyI2V4cGlyZUFmdGVyQWNjZXNzfS4KKyAgICAgKi8KKyAgICBFWFBJUkVEIHsKKyAgICB9LAorCisgICAgLyoqCisgICAgICogVGhlIGVudHJ5IHdhcyBldmljdGVkIGR1ZSB0byBzaXplIGNvbnN0cmFpbnRzLiBUaGlzIGNhbiBvY2N1ciB3aGVuIHVzaW5nCisgICAgICoge0BsaW5rIENhY2hlQnVpbGRlciNtYXhpbXVtU2l6ZX0gb3Ige0BsaW5rIENhY2hlQnVpbGRlciNtYXhpbXVtV2VpZ2h0fS4KKyAgICAgKi8KKyAgICBTSVpFIHsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvUmVtb3ZhbE5vdGlmaWNhdGlvbi5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9SZW1vdmFsTm90aWZpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc5NWE5YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvUmVtb3ZhbE5vdGlmaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEd1YXZhIEF1dGhvcnMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworCisvKioKKyAqIEEgbm90aWZpY2F0aW9uIG9mIHRoZSByZW1vdmFsIG9mIGEgc2luZ2xlIGVudHJ5LiBUaGUga2V5IGFuZC9vciB2YWx1ZSBtYXkgYmUgbnVsbCBpZiB0aGV5IHdlcmUKKyAqIGFscmVhZHkgZ2FyYmFnZSBjb2xsZWN0ZWQuCisgKiA8cD4KKyAqIDxwPkxpa2Ugb3RoZXIge0Bjb2RlIE1hcC5FbnRyeX0gaW5zdGFuY2VzIGFzc29jaWF0ZWQgd2l0aCB7QGNvZGUgQ2FjaGVCdWlsZGVyfSwgdGhpcyBjbGFzcyBob2xkcworICogc3Ryb25nIHJlZmVyZW5jZXMgdG8gdGhlIGtleSBhbmQgdmFsdWUsIHJlZ2FyZGxlc3Mgb2YgdGhlIHR5cGUgb2YgcmVmZXJlbmNlcyB0aGUgY2FjaGUgbWF5IGJlCisgKiB1c2luZy4KKyAqCisgKiBAYXV0aG9yIENoYXJsZXMgRnJ5CisgKiBAc2luY2UgMTAuMAorICovCitmaW5hbCBjbGFzcyBSZW1vdmFsTm90aWZpY2F0aW9uPEssIFY+IGltcGxlbWVudHMgRW50cnk8SywgVj4geworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDA7CisgICAgcHJpdmF0ZSBmaW5hbCBLIGtleTsKKyAgICBwcml2YXRlIGZpbmFsIFYgdmFsdWU7CisKKyAgICBSZW1vdmFsTm90aWZpY2F0aW9uKEsga2V5LCBWIHZhbHVlLCBSZW1vdmFsQ2F1c2UgY2F1c2UpIHsKKyAgICAgICAgdGhpcy5rZXkgPSBrZXk7CisgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSyBnZXRLZXkoKSB7CisgICAgICAgIHJldHVybiBrZXk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFYgZ2V0VmFsdWUoKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgViBzZXRWYWx1ZShWIHZhbHVlKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7CisgICAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBFbnRyeSkgeworICAgICAgICAgICAgRW50cnk8PywgPz4gdGhhdCA9IChFbnRyeTw/LCA/Pikgb2JqZWN0OworICAgICAgICAgICAgcmV0dXJuIE9iamVjdHMuZXF1YWxzKHRoaXMuZ2V0S2V5KCksIHRoYXQuZ2V0S2V5KCkpCisgICAgICAgICAgICAgICAgICAgICYmIE9iamVjdHMuZXF1YWxzKHRoaXMuZ2V0VmFsdWUoKSwgdGhhdC5nZXRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgSyBrID0gZ2V0S2V5KCk7CisgICAgICAgIFYgdiA9IGdldFZhbHVlKCk7CisgICAgICAgIHJldHVybiAoKGsgPT0gbnVsbCkgPyAwIDogay5oYXNoQ29kZSgpKSBeICgodiA9PSBudWxsKSA/IDAgOiB2Lmhhc2hDb2RlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGZvcm0gPGNvZGU+e2tleX09e3ZhbHVlfTwvY29kZT4uCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIGdldEtleSgpICsgIj0iICsgZ2V0VmFsdWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL1JldmVyc2VOYXR1cmFsT3JkZXJpbmcuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvUmV2ZXJzZU5hdHVyYWxPcmRlcmluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZjM4N2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL1JldmVyc2VOYXR1cmFsT3JkZXJpbmcuamF2YQpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgR3VhdmEgQXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YTsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IHN0YXRpYyBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKKworLyoqCisgKiBBbiBvcmRlcmluZyB0aGF0IHVzZXMgdGhlIHJldmVyc2Ugb2YgdGhlIG5hdHVyYWwgb3JkZXIgb2YgdGhlIHZhbHVlcy4KKyAqLworQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIC8vIFRPRE8oa2V2aW5iKTogdGhlIHJpZ2h0IHdheSB0byBleHBsYWluIHRoaXM/PworZmluYWwgY2xhc3MgUmV2ZXJzZU5hdHVyYWxPcmRlcmluZworICAgICAgICBleHRlbmRzIE9yZGVyaW5nPENvbXBhcmFibGU+IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKyAgICBzdGF0aWMgZmluYWwgUmV2ZXJzZU5hdHVyYWxPcmRlcmluZyBJTlNUQU5DRSA9IG5ldyBSZXZlcnNlTmF0dXJhbE9yZGVyaW5nKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMDsKKworICAgIHByaXZhdGUgUmV2ZXJzZU5hdHVyYWxPcmRlcmluZygpIHsKKyAgICB9CisKKyAgICAvLyBPdmVycmlkZSB0aGUgbWluL21heCBtZXRob2RzIHRvICJob2lzdCIgZGVsZWdhdGlvbiBvdXRzaWRlIGxvb3BzCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGNvbXBhcmUoQ29tcGFyYWJsZSBsZWZ0LCBDb21wYXJhYmxlIHJpZ2h0KSB7CisgICAgICAgIGNoZWNrTm90TnVsbChsZWZ0KTsgLy8gcmlnaHQgbnVsbCBpcyBjYXVnaHQgbGF0ZXIKKyAgICAgICAgaWYgKGxlZnQgPT0gcmlnaHQpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJpZ2h0LmNvbXBhcmVUbyhsZWZ0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFMgZXh0ZW5kcyBDb21wYXJhYmxlPiBPcmRlcmluZzxTPiByZXZlcnNlKCkgeworICAgICAgICByZXR1cm4gT3JkZXJpbmcubmF0dXJhbCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8RSBleHRlbmRzIENvbXBhcmFibGU+IEUgbWluKEUgYSwgRSBiKSB7CisgICAgICAgIHJldHVybiBOYXR1cmFsT3JkZXJpbmcuSU5TVEFOQ0UubWF4KGEsIGIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8RSBleHRlbmRzIENvbXBhcmFibGU+IEUgbWluKEUgYSwgRSBiLCBFIGMsIEUuLi4gcmVzdCkgeworICAgICAgICByZXR1cm4gTmF0dXJhbE9yZGVyaW5nLklOU1RBTkNFLm1heChhLCBiLCBjLCByZXN0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEUgZXh0ZW5kcyBDb21wYXJhYmxlPiBFIG1pbihJdGVyYXRvcjxFPiBpdGVyYXRvcikgeworICAgICAgICByZXR1cm4gTmF0dXJhbE9yZGVyaW5nLklOU1RBTkNFLm1heChpdGVyYXRvcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxFIGV4dGVuZHMgQ29tcGFyYWJsZT4gRSBtaW4oSXRlcmFibGU8RT4gaXRlcmFibGUpIHsKKyAgICAgICAgcmV0dXJuIE5hdHVyYWxPcmRlcmluZy5JTlNUQU5DRS5tYXgoaXRlcmFibGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8RSBleHRlbmRzIENvbXBhcmFibGU+IEUgbWF4KEUgYSwgRSBiKSB7CisgICAgICAgIHJldHVybiBOYXR1cmFsT3JkZXJpbmcuSU5TVEFOQ0UubWluKGEsIGIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8RSBleHRlbmRzIENvbXBhcmFibGU+IEUgbWF4KEUgYSwgRSBiLCBFIGMsIEUuLi4gcmVzdCkgeworICAgICAgICByZXR1cm4gTmF0dXJhbE9yZGVyaW5nLklOU1RBTkNFLm1pbihhLCBiLCBjLCByZXN0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEUgZXh0ZW5kcyBDb21wYXJhYmxlPiBFIG1heChJdGVyYXRvcjxFPiBpdGVyYXRvcikgeworICAgICAgICByZXR1cm4gTmF0dXJhbE9yZGVyaW5nLklOU1RBTkNFLm1pbihpdGVyYXRvcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxFIGV4dGVuZHMgQ29tcGFyYWJsZT4gRSBtYXgoSXRlcmFibGU8RT4gaXRlcmFibGUpIHsKKyAgICAgICAgcmV0dXJuIE5hdHVyYWxPcmRlcmluZy5JTlNUQU5DRS5taW4oaXRlcmFibGUpOworICAgIH0KKworICAgIC8vIHByZXNlcnZpbmcgc2luZ2xldG9uLW5lc3MgZ2l2ZXMgZXF1YWxzKCkvaGFzaENvZGUoKSBmb3IgZnJlZQorICAgIHByaXZhdGUgT2JqZWN0IHJlYWRSZXNvbHZlKCkgeworICAgICAgICByZXR1cm4gSU5TVEFOQ0U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJPcmRlcmluZy5uYXR1cmFsKCkucmV2ZXJzZSgpIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL1JldmVyc2VPcmRlcmluZy5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9SZXZlcnNlT3JkZXJpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODUxZTczCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9SZXZlcnNlT3JkZXJpbmcuamF2YQpAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgR3VhdmEgQXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YTsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IHN0YXRpYyBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKKworLyoqCisgKiBBbiBvcmRlcmluZyB0aGF0IHVzZXMgdGhlIHJldmVyc2Ugb2YgYSBnaXZlbiBvcmRlci4KKyAqLworZmluYWwgY2xhc3MgUmV2ZXJzZU9yZGVyaW5nPFQ+IGV4dGVuZHMgT3JkZXJpbmc8VD4gaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDA7CisgICAgcHJpdmF0ZSBmaW5hbCBPcmRlcmluZzw/IHN1cGVyIFQ+IGZvcndhcmRPcmRlcjsKKworICAgIFJldmVyc2VPcmRlcmluZyhPcmRlcmluZzw/IHN1cGVyIFQ+IGZvcndhcmRPcmRlcikgeworICAgICAgICB0aGlzLmZvcndhcmRPcmRlciA9IGNoZWNrTm90TnVsbChmb3J3YXJkT3JkZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgY29tcGFyZShUIGEsIFQgYikgeworICAgICAgICByZXR1cm4gZm9yd2FyZE9yZGVyLmNvbXBhcmUoYiwgYSk7CisgICAgfQorCisgICAgLy8gT3ZlcnJpZGUgdGhlIG1pbi9tYXggbWV0aG9kcyB0byAiaG9pc3QiIGRlbGVnYXRpb24gb3V0c2lkZSBsb29wcworCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIC8vIGhvdyB0byBleHBsYWluPworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8UyBleHRlbmRzIFQ+IE9yZGVyaW5nPFM+IHJldmVyc2UoKSB7CisgICAgICAgIHJldHVybiAoT3JkZXJpbmc8Uz4pIGZvcndhcmRPcmRlcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEUgZXh0ZW5kcyBUPiBFIG1pbihFIGEsIEUgYikgeworICAgICAgICByZXR1cm4gZm9yd2FyZE9yZGVyLm1heChhLCBiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEUgZXh0ZW5kcyBUPiBFIG1pbihFIGEsIEUgYiwgRSBjLCBFLi4uIHJlc3QpIHsKKyAgICAgICAgcmV0dXJuIGZvcndhcmRPcmRlci5tYXgoYSwgYiwgYywgcmVzdCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxFIGV4dGVuZHMgVD4gRSBtaW4oSXRlcmF0b3I8RT4gaXRlcmF0b3IpIHsKKyAgICAgICAgcmV0dXJuIGZvcndhcmRPcmRlci5tYXgoaXRlcmF0b3IpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8RSBleHRlbmRzIFQ+IEUgbWluKEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKSB7CisgICAgICAgIHJldHVybiBmb3J3YXJkT3JkZXIubWF4KGl0ZXJhYmxlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEUgZXh0ZW5kcyBUPiBFIG1heChFIGEsIEUgYikgeworICAgICAgICByZXR1cm4gZm9yd2FyZE9yZGVyLm1pbihhLCBiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEUgZXh0ZW5kcyBUPiBFIG1heChFIGEsIEUgYiwgRSBjLCBFLi4uIHJlc3QpIHsKKyAgICAgICAgcmV0dXJuIGZvcndhcmRPcmRlci5taW4oYSwgYiwgYywgcmVzdCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxFIGV4dGVuZHMgVD4gRSBtYXgoSXRlcmF0b3I8RT4gaXRlcmF0b3IpIHsKKyAgICAgICAgcmV0dXJuIGZvcndhcmRPcmRlci5taW4oaXRlcmF0b3IpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8RSBleHRlbmRzIFQ+IEUgbWF4KEl0ZXJhYmxlPEU+IGl0ZXJhYmxlKSB7CisgICAgICAgIHJldHVybiBmb3J3YXJkT3JkZXIubWluKGl0ZXJhYmxlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gLWZvcndhcmRPcmRlci5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7CisgICAgICAgIGlmIChvYmplY3QgPT0gdGhpcykgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFJldmVyc2VPcmRlcmluZykgeworICAgICAgICAgICAgUmV2ZXJzZU9yZGVyaW5nPD8+IHRoYXQgPSAoUmV2ZXJzZU9yZGVyaW5nPD8+KSBvYmplY3Q7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5mb3J3YXJkT3JkZXIuZXF1YWxzKHRoYXQuZm9yd2FyZE9yZGVyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIGZvcndhcmRPcmRlciArICIucmV2ZXJzZSgpIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL1NlcmlhbGl6YXRpb24uamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvU2VyaWFsaXphdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYTAwYjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL1NlcmlhbGl6YXRpb24uamF2YQpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgR3VhdmEgQXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIFByb3ZpZGVzIHN0YXRpYyBtZXRob2RzIGZvciBzZXJpYWxpemluZyBjb2xsZWN0aW9uIGNsYXNzZXMuCisgKiA8cD4KKyAqIDxwPlRoaXMgY2xhc3MgYXNzaXN0cyB0aGUgaW1wbGVtZW50YXRpb24gb2YgY29sbGVjdGlvbiBjbGFzc2VzLiBEbyBub3QgdXNlCisgKiB0aGlzIGNsYXNzIHRvIHNlcmlhbGl6ZSBjb2xsZWN0aW9ucyB0aGF0IGFyZSBkZWZpbmVkIGVsc2V3aGVyZS4KKyAqCisgKiBAYXV0aG9yIEphcmVkIExldnkKKyAqLworZmluYWwgY2xhc3MgU2VyaWFsaXphdGlvbiB7CisgICAgcHJpdmF0ZSBTZXJpYWxpemF0aW9uKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIGEgY291bnQgY29ycmVzcG9uZGluZyB0byBhIHNlcmlhbGl6ZWQgbWFwLCBtdWx0aXNldCwgb3IgbXVsdGltYXAuIEl0CisgICAgICogcmV0dXJucyB0aGUgc2l6ZSBvZiBhIG1hcCBzZXJpYWxpemVkIGJ5IHtAbGluaworICAgICAqICN3cml0ZU1hcChNYXAsIE9iamVjdE91dHB1dFN0cmVhbSl9LCB0aGUgbnVtYmVyIG9mIGRpc3RpbmN0IGVsZW1lbnRzIGluIGEKKyAgICAgKiBtdWx0aXNldCBzZXJpYWxpemVkIGJ5IHtAbGluaworICAgICAqICN3cml0ZU11bHRpc2V0KE11bHRpc2V0LCBPYmplY3RPdXRwdXRTdHJlYW0pfSwgb3IgdGhlIG51bWJlciBvZiBkaXN0aW5jdAorICAgICAqIGtleXMgaW4gYSBtdWx0aW1hcCBzZXJpYWxpemVkIGJ5IHtAbGluaworICAgICAqICN3cml0ZU11bHRpbWFwKE11bHRpbWFwLCBPYmplY3RPdXRwdXRTdHJlYW0pfS4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5UaGUgcmV0dXJuZWQgY291bnQgbWF5IGJlIHVzZWQgdG8gY29uc3RydWN0IGFuIGVtcHR5IGNvbGxlY3Rpb24gb2YgdGhlCisgICAgICogYXBwcm9wcmlhdGUgY2FwYWNpdHkgYmVmb3JlIGNhbGxpbmcgYW55IG9mIHRoZSB7QGNvZGUgcG9wdWxhdGV9IG1ldGhvZHMuCisgICAgICovCisgICAgc3RhdGljIGludCByZWFkQ291bnQoT2JqZWN0SW5wdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gc3RyZWFtLnJlYWRJbnQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9yZXMgdGhlIGNvbnRlbnRzIG9mIGEgbXVsdGltYXAgaW4gYW4gb3V0cHV0IHN0cmVhbSwgYXMgcGFydCBvZgorICAgICAqIHNlcmlhbGl6YXRpb24uIEl0IGRvZXMgbm90IHN1cHBvcnQgY29uY3VycmVudCBtdWx0aW1hcHMgd2hvc2UgY29udGVudCBtYXkKKyAgICAgKiBjaGFuZ2Ugd2hpbGUgdGhlIG1ldGhvZCBpcyBydW5uaW5nLiBUaGUge0BsaW5rIE11bHRpbWFwI2FzTWFwfSB2aWV3CisgICAgICogZGV0ZXJtaW5lcyB0aGUgb3JkZXJpbmcgaW4gd2hpY2ggZGF0YSBpcyB3cml0dGVuIHRvIHRoZSBzdHJlYW0uCisgICAgICogPHA+CisgICAgICogPHA+VGhlIHNlcmlhbGl6ZWQgb3V0cHV0IGNvbnNpc3RzIG9mIHRoZSBudW1iZXIgb2YgZGlzdGluY3Qga2V5cywgYW5kIHRoZW4KKyAgICAgKiBmb3IgZWFjaCBkaXN0aW5jdCBrZXk6IHRoZSBrZXksIHRoZSBudW1iZXIgb2YgdmFsdWVzIGZvciB0aGF0IGtleSwgYW5kIHRoZQorICAgICAqIGtleSdzIHZhbHVlcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgPEssIFY+IHZvaWQgd3JpdGVNdWx0aW1hcCgKKyAgICAgICAgICAgIE11bHRpbWFwPEssIFY+IG11bHRpbWFwLCBPYmplY3RPdXRwdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBzdHJlYW0ud3JpdGVJbnQobXVsdGltYXAuYXNNYXAoKS5zaXplKCkpOworICAgICAgICBmb3IgKE1hcC5FbnRyeTxLLCBDb2xsZWN0aW9uPFY+PiBlbnRyeSA6IG11bHRpbWFwLmFzTWFwKCkuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgc3RyZWFtLndyaXRlT2JqZWN0KGVudHJ5LmdldEtleSgpKTsKKyAgICAgICAgICAgIHN0cmVhbS53cml0ZUludChlbnRyeS5nZXRWYWx1ZSgpLnNpemUoKSk7CisgICAgICAgICAgICBmb3IgKFYgdmFsdWUgOiBlbnRyeS5nZXRWYWx1ZSgpKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtLndyaXRlT2JqZWN0KHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBvcHVsYXRlcyBhIG11bHRpbWFwIGJ5IHJlYWRpbmcgYW4gaW5wdXQgc3RyZWFtLCBhcyBwYXJ0IG9mCisgICAgICogZGVzZXJpYWxpemF0aW9uLiBTZWUge0BsaW5rICN3cml0ZU11bHRpbWFwfSBmb3IgdGhlIGRhdGEgZm9ybWF0LgorICAgICAqLworICAgIHN0YXRpYyA8SywgVj4gdm9pZCBwb3B1bGF0ZU11bHRpbWFwKAorICAgICAgICAgICAgTXVsdGltYXA8SywgVj4gbXVsdGltYXAsIE9iamVjdElucHV0U3RyZWFtIHN0cmVhbSkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIGludCBkaXN0aW5jdEtleXMgPSBzdHJlYW0ucmVhZEludCgpOworICAgICAgICBwb3B1bGF0ZU11bHRpbWFwKG11bHRpbWFwLCBzdHJlYW0sIGRpc3RpbmN0S2V5cyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUG9wdWxhdGVzIGEgbXVsdGltYXAgYnkgcmVhZGluZyBhbiBpbnB1dCBzdHJlYW0sIGFzIHBhcnQgb2YKKyAgICAgKiBkZXNlcmlhbGl6YXRpb24uIFNlZSB7QGxpbmsgI3dyaXRlTXVsdGltYXB9IGZvciB0aGUgZGF0YSBmb3JtYXQuIFRoZSBudW1iZXIKKyAgICAgKiBvZiBkaXN0aW5jdCBrZXlzIGlzIGRldGVybWluZWQgYnkgYSBwcmlvciBjYWxsIHRvIHtAbGluayAjcmVhZENvdW50fS4KKyAgICAgKi8KKyAgICBzdGF0aWMgPEssIFY+IHZvaWQgcG9wdWxhdGVNdWx0aW1hcCgKKyAgICAgICAgICAgIE11bHRpbWFwPEssIFY+IG11bHRpbWFwLCBPYmplY3RJbnB1dFN0cmVhbSBzdHJlYW0sIGludCBkaXN0aW5jdEtleXMpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpc3RpbmN0S2V5czsgaSsrKSB7CisgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgLy8gcmVhZGluZyBkYXRhIHN0b3JlZCBieSB3cml0ZU11bHRpbWFwCisgICAgICAgICAgICAgICAgICAgIEsga2V5ID0gKEspIHN0cmVhbS5yZWFkT2JqZWN0KCk7CisgICAgICAgICAgICBDb2xsZWN0aW9uPFY+IHZhbHVlcyA9IG11bHRpbWFwLmdldChrZXkpOworICAgICAgICAgICAgaW50IHZhbHVlQ291bnQgPSBzdHJlYW0ucmVhZEludCgpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB2YWx1ZUNvdW50OyBqKyspIHsKKyAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgLy8gcmVhZGluZyBkYXRhIHN0b3JlZCBieSB3cml0ZU11bHRpbWFwCisgICAgICAgICAgICAgICAgICAgICAgICBWIHZhbHVlID0gKFYpIHN0cmVhbS5yZWFkT2JqZWN0KCk7CisgICAgICAgICAgICAgICAgdmFsdWVzLmFkZCh2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvU2V0TXVsdGltYXAuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvU2V0TXVsdGltYXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzIzYTlhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9TZXRNdWx0aW1hcC5qYXZhCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBHdWF2YSBBdXRob3JzCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIEEge0Bjb2RlIE11bHRpbWFwfSB0aGF0IGNhbm5vdCBob2xkIGR1cGxpY2F0ZSBrZXktdmFsdWUgcGFpcnMuIEFkZGluZyBhCisgKiBrZXktdmFsdWUgcGFpciB0aGF0J3MgYWxyZWFkeSBpbiB0aGUgbXVsdGltYXAgaGFzIG5vIGVmZmVjdC4gU2VlIHRoZSB7QGxpbmsKKyAqIE11bHRpbWFwfSBkb2N1bWVudGF0aW9uIGZvciBpbmZvcm1hdGlvbiBjb21tb24gdG8gYWxsIG11bHRpbWFwcy4KKyAqIDxwPgorICogPHA+VGhlIHtAbGluayAjZ2V0fSwge0BsaW5rICNyZW1vdmVBbGx9LCBhbmQge0BsaW5rICNyZXBsYWNlVmFsdWVzfSBtZXRob2RzCisgKiBlYWNoIHJldHVybiBhIHtAbGluayBTZXR9IG9mIHZhbHVlcywgd2hpbGUge0BsaW5rICNlbnRyaWVzfSByZXR1cm5zIGEge0Bjb2RlCisgKiBTZXR9IG9mIG1hcCBlbnRyaWVzLiBUaG91Z2ggdGhlIG1ldGhvZCBzaWduYXR1cmUgZG9lc24ndCBzYXkgc28gZXhwbGljaXRseSwKKyAqIHRoZSBtYXAgcmV0dXJuZWQgYnkge0BsaW5rICNhc01hcH0gaGFzIHtAY29kZSBTZXR9IHZhbHVlcy4KKyAqIDxwPgorICogPHA+SWYgdGhlIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIGEgc2luZ2xlIGtleSBzaG91bGQgYmUgb3JkZXJlZCBhY2NvcmRpbmcgdG8KKyAqIGEge0BsaW5rIGphdmEudXRpbC5Db21wYXJhdG9yfSAob3IgdGhlIG5hdHVyYWwgb3JkZXIpLCBzZWUgdGhlCisgKiB7QGxpbmsgU29ydGVkU2V0TXVsdGltYXB9IHN1YmludGVyZmFjZS4KKyAqIDxwPgorICogPHA+U2luY2UgdGhlIHZhbHVlIGNvbGxlY3Rpb25zIGFyZSBzZXRzLCB0aGUgYmVoYXZpb3Igb2YgYSB7QGNvZGUgU2V0TXVsdGltYXB9CisgKiBpcyBub3Qgc3BlY2lmaWVkIGlmIGtleSA8ZW0+b3IgdmFsdWU8L2VtPiBvYmplY3RzIGFscmVhZHkgcHJlc2VudCBpbiB0aGUKKyAqIG11bHRpbWFwIGNoYW5nZSBpbiBhIG1hbm5lciB0aGF0IGFmZmVjdHMge0Bjb2RlIGVxdWFsc30gY29tcGFyaXNvbnMuCisgKiBVc2UgY2F1dGlvbiBpZiBtdXRhYmxlIG9iamVjdHMgYXJlIHVzZWQgYXMga2V5cyBvciB2YWx1ZXMgaW4gYQorICoge0Bjb2RlIFNldE11bHRpbWFwfS4KKyAqIDxwPgorICogPHA+U2VlIHRoZSBHdWF2YSBVc2VyIEd1aWRlIGFydGljbGUgb24gPGEgaHJlZj0KKyAqICJodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ3VhdmEtbGlicmFyaWVzL3dpa2kvTmV3Q29sbGVjdGlvblR5cGVzRXhwbGFpbmVkI011bHRpbWFwIj4KKyAqIHtAY29kZSBNdWx0aW1hcH08L2E+LgorICoKKyAqIEBhdXRob3IgSmFyZWQgTGV2eQorICogQHNpbmNlIDIuMCAoaW1wb3J0ZWQgZnJvbSBHb29nbGUgQ29sbGVjdGlvbnMgTGlicmFyeSkKKyAqLworcHVibGljIGludGVyZmFjZSBTZXRNdWx0aW1hcDxLLCBWPiBleHRlbmRzIE11bHRpbWFwPEssIFY+IHsKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICogPHA+CisgICAgICogPHA+QmVjYXVzZSBhIHtAY29kZSBTZXRNdWx0aW1hcH0gaGFzIHVuaXF1ZSB2YWx1ZXMgZm9yIGEgZ2l2ZW4ga2V5LCB0aGlzCisgICAgICogbWV0aG9kIHJldHVybnMgYSB7QGxpbmsgU2V0fSwgaW5zdGVhZCBvZiB0aGUge0BsaW5rIENvbGxlY3Rpb259CisgICAgICogc3BlY2lmaWVkIGluIHRoZSB7QGxpbmsgTXVsdGltYXB9IGludGVyZmFjZS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBTZXQ8Vj4gZ2V0KEsga2V5KTsKKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5CZWNhdXNlIGEge0Bjb2RlIFNldE11bHRpbWFwfSBoYXMgdW5pcXVlIHZhbHVlcyBmb3IgYSBnaXZlbiBrZXksIHRoaXMKKyAgICAgKiBtZXRob2QgcmV0dXJucyBhIHtAbGluayBTZXR9LCBpbnN0ZWFkIG9mIHRoZSB7QGxpbmsgQ29sbGVjdGlvbn0KKyAgICAgKiBzcGVjaWZpZWQgaW4gdGhlIHtAbGluayBNdWx0aW1hcH0gaW50ZXJmYWNlLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIFNldDxWPiByZW1vdmVBbGwoT2JqZWN0IGtleSk7CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICogPHA+CisgICAgICogPHA+QmVjYXVzZSBhIHtAY29kZSBTZXRNdWx0aW1hcH0gaGFzIHVuaXF1ZSB2YWx1ZXMgZm9yIGEgZ2l2ZW4ga2V5LCB0aGlzCisgICAgICogbWV0aG9kIHJldHVybnMgYSB7QGxpbmsgU2V0fSwgaW5zdGVhZCBvZiB0aGUge0BsaW5rIENvbGxlY3Rpb259CisgICAgICogc3BlY2lmaWVkIGluIHRoZSB7QGxpbmsgTXVsdGltYXB9IGludGVyZmFjZS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBTZXQ8TWFwLkVudHJ5PEssIFY+PiBlbnRyaWVzKCk7CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICogPHA+CisgICAgICogPHA+PGI+Tm90ZTo8L2I+IFRoZSByZXR1cm5lZCBtYXAncyB2YWx1ZXMgYXJlIGd1YXJhbnRlZWQgdG8gYmUgb2YgdHlwZQorICAgICAqIHtAbGluayBTZXR9LiBUbyBvYnRhaW4gdGhpcyBtYXAgd2l0aCB0aGUgbW9yZSBzcGVjaWZpYyBnZW5lcmljIHR5cGUKKyAgICAgKiB7QGNvZGUgTWFwPEssIFNldDxWPj59LCBjYWxsIHtAbGluayBNdWx0aW1hcHMjYXNNYXAoU2V0TXVsdGltYXApfSBpbnN0ZWFkLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIE1hcDxLLCBDb2xsZWN0aW9uPFY+PiBhc01hcCgpOworCisgICAgLyoqCisgICAgICogQ29tcGFyZXMgdGhlIHNwZWNpZmllZCBvYmplY3QgdG8gdGhpcyBtdWx0aW1hcCBmb3IgZXF1YWxpdHkuCisgICAgICogPHA+CisgICAgICogPHA+VHdvIHtAY29kZSBTZXRNdWx0aW1hcH0gaW5zdGFuY2VzIGFyZSBlcXVhbCBpZiwgZm9yIGVhY2gga2V5LCB0aGV5CisgICAgICogY29udGFpbiB0aGUgc2FtZSB2YWx1ZXMuIEVxdWFsaXR5IGRvZXMgbm90IGRlcGVuZCBvbiB0aGUgb3JkZXJpbmcgb2Yga2V5cworICAgICAqIG9yIHZhbHVlcy4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5BbiBlbXB0eSB7QGNvZGUgU2V0TXVsdGltYXB9IGlzIGVxdWFsIHRvIGFueSBvdGhlciBlbXB0eSB7QGNvZGUKKyAgICAgKiBNdWx0aW1hcH0sIGluY2x1ZGluZyBhbiBlbXB0eSB7QGNvZGUgTGlzdE11bHRpbWFwfS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvU2V0cy5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9TZXRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNjN2YwOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvU2V0cy5qYXZhCkBAIC0wLDAgKzEsMjcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA3IFRoZSBHdWF2YSBBdXRob3JzCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLkFic3RyYWN0U2V0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk5hdmlnYWJsZVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmEuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CisKKy8qKgorICogU3RhdGljIHV0aWxpdHkgbWV0aG9kcyBwZXJ0YWluaW5nIHRvIHtAbGluayBTZXR9IGluc3RhbmNlcy4gQWxzbyBzZWUgdGhpcworICogY2xhc3MncyBjb3VudGVycGFydHMge0BsaW5rIExpc3RzfSwge0BsaW5rIE1hcHN9IGFuZCB7QGxpbmsgUXVldWVzfS4KKyAqIDxwPgorICogPHA+U2VlIHRoZSBHdWF2YSBVc2VyIEd1aWRlIGFydGljbGUgb24gPGEgaHJlZj0KKyAqICJodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ3VhdmEtbGlicmFyaWVzL3dpa2kvQ29sbGVjdGlvblV0aWxpdGllc0V4cGxhaW5lZCNTZXRzIj4KKyAqIHtAY29kZSBTZXRzfTwvYT4uCisgKgorICogQGF1dGhvciBLZXZpbiBCb3VycmlsbGlvbgorICogQGF1dGhvciBKYXJlZCBMZXZ5CisgKiBAYXV0aG9yIENocmlzIFBvdmlyaworICogQHNpbmNlIDIuMCAoaW1wb3J0ZWQgZnJvbSBHb29nbGUgQ29sbGVjdGlvbnMgTGlicmFyeSkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNldHMgeworICAgIHByaXZhdGUgU2V0cygpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgPGk+bXV0YWJsZTwvaT4sIGVtcHR5IHtAY29kZSBIYXNoU2V0fSBpbnN0YW5jZS4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD48Yj5Ob3RlOjwvYj4gaWYgbXV0YWJpbGl0eSBpcyBub3QgcmVxdWlyZWQsIHVzZSB7QGxpbmsKKyAgICAgKiBJbW11dGFibGVTZXQjb2YoKX0gaW5zdGVhZC4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD48Yj5Ob3RlOjwvYj4gaWYge0Bjb2RlIEV9IGlzIGFuIHtAbGluayBFbnVtfSB0eXBlLCB1c2Uge0BsaW5rCisgICAgICogRW51bVNldCNub25lT2Z9IGluc3RlYWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgbmV3LCBlbXB0eSB7QGNvZGUgSGFzaFNldH0KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxFPiBIYXNoU2V0PEU+IG5ld0hhc2hTZXQoKSB7CisgICAgICAgIHJldHVybiBuZXcgSGFzaFNldDxFPigpOworICAgIH0KKworICAgIC8vIEhhc2hTZXQKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSB7QGNvZGUgSGFzaFNldH0gaW5zdGFuY2UsIHdpdGggYSBoaWdoIGVub3VnaCAiaW5pdGlhbCBjYXBhY2l0eSIKKyAgICAgKiB0aGF0IGl0IDxpPnNob3VsZDwvaT4gaG9sZCB7QGNvZGUgZXhwZWN0ZWRTaXplfSBlbGVtZW50cyB3aXRob3V0IGdyb3d0aC4KKyAgICAgKiBUaGlzIGJlaGF2aW9yIGNhbm5vdCBiZSBicm9hZGx5IGd1YXJhbnRlZWQsIGJ1dCBpdCBpcyBvYnNlcnZlZCB0byBiZSB0cnVlCisgICAgICogZm9yIE9wZW5KREsgMS42LiBJdCBhbHNvIGNhbid0IGJlIGd1YXJhbnRlZWQgdGhhdCB0aGUgbWV0aG9kIGlzbid0CisgICAgICogaW5hZHZlcnRlbnRseSA8aT5vdmVyc2l6aW5nPC9pPiB0aGUgcmV0dXJuZWQgc2V0LgorICAgICAqCisgICAgICogQHBhcmFtIGV4cGVjdGVkU2l6ZSB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHlvdSBleHBlY3QgdG8gYWRkIHRvIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQgc2V0CisgICAgICogQHJldHVybiBhIG5ldywgZW1wdHkge0Bjb2RlIEhhc2hTZXR9IHdpdGggZW5vdWdoIGNhcGFjaXR5IHRvIGhvbGQge0Bjb2RlCisgICAgICogZXhwZWN0ZWRTaXplfSBlbGVtZW50cyB3aXRob3V0IHJlc2l6aW5nCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYge0Bjb2RlIGV4cGVjdGVkU2l6ZX0gaXMgbmVnYXRpdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxFPiBIYXNoU2V0PEU+IG5ld0hhc2hTZXRXaXRoRXhwZWN0ZWRTaXplKGludCBleHBlY3RlZFNpemUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBIYXNoU2V0PEU+KE1hcHMuY2FwYWNpdHkoZXhwZWN0ZWRTaXplKSk7CisgICAgfQorCisgICAgLy8gTGlua2VkSGFzaFNldAorCisgICAgLy8gVHJlZVNldAorCisgICAgLyoqCisgICAgICogQW4gaW1wbGVtZW50YXRpb24gZm9yIHtAbGluayBTZXQjaGFzaENvZGUoKX0uCisgICAgICovCisgICAgc3RhdGljIGludCBoYXNoQ29kZUltcGwoU2V0PD8+IHMpIHsKKyAgICAgICAgaW50IGhhc2hDb2RlID0gMDsKKyAgICAgICAgZm9yIChPYmplY3QgbyA6IHMpIHsKKyAgICAgICAgICAgIGhhc2hDb2RlICs9IG8gIT0gbnVsbCA/IG8uaGFzaENvZGUoKSA6IDA7CisKKyAgICAgICAgICAgIGhhc2hDb2RlID0gfn5oYXNoQ29kZTsKKyAgICAgICAgICAgIC8vIE5lZWRlZCB0byBkZWFsIHdpdGggdW51c3VhbCBpbnRlZ2VyIG92ZXJmbG93IGluIEdXVC4KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaGFzaENvZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQW4gaW1wbGVtZW50YXRpb24gZm9yIHtAbGluayBTZXQjZXF1YWxzKE9iamVjdCl9LgorICAgICAqLworICAgIHN0YXRpYyBib29sZWFuIGVxdWFsc0ltcGwoU2V0PD8+IHMsIE9iamVjdCBvYmplY3QpIHsKKyAgICAgICAgaWYgKHMgPT0gb2JqZWN0KSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgU2V0KSB7CisgICAgICAgICAgICBTZXQ8Pz4gbyA9IChTZXQ8Pz4pIG9iamVjdDsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcy5zaXplKCkgPT0gby5zaXplKCkgJiYgcy5jb250YWluc0FsbChvKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGlnbm9yZWQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9IGNhdGNoIChDbGFzc0Nhc3RFeGNlcHRpb24gaWdub3JlZCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiB1bm1vZGlmaWFibGUgdmlldyBvZiB0aGUgc3BlY2lmaWVkIG5hdmlnYWJsZSBzZXQuIFRoaXMgbWV0aG9kCisgICAgICogYWxsb3dzIG1vZHVsZXMgdG8gcHJvdmlkZSB1c2VycyB3aXRoICJyZWFkLW9ubHkiIGFjY2VzcyB0byBpbnRlcm5hbAorICAgICAqIG5hdmlnYWJsZSBzZXRzLiBRdWVyeSBvcGVyYXRpb25zIG9uIHRoZSByZXR1cm5lZCBzZXQgInJlYWQgdGhyb3VnaCIgdG8gdGhlCisgICAgICogc3BlY2lmaWVkIHNldCwgYW5kIGF0dGVtcHRzIHRvIG1vZGlmeSB0aGUgcmV0dXJuZWQgc2V0LCB3aGV0aGVyIGRpcmVjdCBvcgorICAgICAqIHZpYSBpdHMgY29sbGVjdGlvbiB2aWV3cywgcmVzdWx0IGluIGFuCisgICAgICoge0Bjb2RlIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufS4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5UaGUgcmV0dXJuZWQgbmF2aWdhYmxlIHNldCB3aWxsIGJlIHNlcmlhbGl6YWJsZSBpZiB0aGUgc3BlY2lmaWVkCisgICAgICogbmF2aWdhYmxlIHNldCBpcyBzZXJpYWxpemFibGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2V0IHRoZSBuYXZpZ2FibGUgc2V0IGZvciB3aGljaCBhbiB1bm1vZGlmaWFibGUgdmlldyBpcyB0byBiZQorICAgICAqICAgICAgICAgICAgcmV0dXJuZWQKKyAgICAgKiBAcmV0dXJuIGFuIHVubW9kaWZpYWJsZSB2aWV3IG9mIHRoZSBzcGVjaWZpZWQgbmF2aWdhYmxlIHNldAorICAgICAqIEBzaW5jZSAxMi4wCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8RT4gTmF2aWdhYmxlU2V0PEU+IHVubW9kaWZpYWJsZU5hdmlnYWJsZVNldCgKKyAgICAgICAgICAgIE5hdmlnYWJsZVNldDxFPiBzZXQpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBVbm1vZGlmaWFibGVOYXZpZ2FibGVTZXQ8RT4oc2V0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgZWFjaCBlbGVtZW50IGluIGFuIGl0ZXJhYmxlIGZyb20gYSBzZXQuCisgICAgICovCisgICAgc3RhdGljIGJvb2xlYW4gcmVtb3ZlQWxsSW1wbChTZXQ8Pz4gc2V0LCBJdGVyYXRvcjw/PiBpdGVyYXRvcikgeworICAgICAgICBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgY2hhbmdlZCB8PSBzZXQucmVtb3ZlKGl0ZXJhdG9yLm5leHQoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNoYW5nZWQ7CisgICAgfQorCisgICAgc3RhdGljIGJvb2xlYW4gcmVtb3ZlQWxsSW1wbChTZXQ8Pz4gc2V0LCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsKKyAgICAgICAgY2hlY2tOb3ROdWxsKGNvbGxlY3Rpb24pOyAvLyBmb3IgR1dUCisgICAgLyoKKyAgICAgKiBBYnN0cmFjdFNldC5yZW1vdmVBbGwoTGlzdCkgaGFzIHF1YWRyYXRpYyBiZWhhdmlvciBpZiB0aGUgbGlzdCBzaXplCisgICAgICogaXMganVzdCBsZXNzIHRoYW4gdGhlIHNldCdzIHNpemUuICBXZSBhdWdtZW50IHRoZSB0ZXN0IGJ5CisgICAgICogYXNzdW1pbmcgdGhhdCBzZXRzIGhhdmUgZmFzdCBjb250YWlucygpIHBlcmZvcm1hbmNlLCBhbmQgb3RoZXIKKyAgICAgKiBjb2xsZWN0aW9ucyBkb24ndC4gIFNlZQorICAgICAqIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9ndWF2YS1saWJyYXJpZXMvaXNzdWVzL2RldGFpbD9pZD0xMDEzCisgICAgICovCisgICAgICAgIGlmIChjb2xsZWN0aW9uIGluc3RhbmNlb2YgU2V0ICYmIGNvbGxlY3Rpb24uc2l6ZSgpID4gc2V0LnNpemUoKSkgeworICAgICAgICAgICAgcmV0dXJuIEl0ZXJhdG9ycy5yZW1vdmVBbGwoc2V0Lml0ZXJhdG9yKCksIGNvbGxlY3Rpb24pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHJlbW92ZUFsbEltcGwoc2V0LCBjb2xsZWN0aW9uLml0ZXJhdG9yKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICoge0BsaW5rIEFic3RyYWN0U2V0fSBzdWJzdGl0dXRlIHdpdGhvdXQgdGhlIHBvdGVudGlhbGx5LXF1YWRyYXRpYworICAgICAqIHtAY29kZSByZW1vdmVBbGx9IGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBJbXByb3ZlZEFic3RyYWN0U2V0PEU+IGV4dGVuZHMgQWJzdHJhY3RTZXQ8RT4geworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gYykgeworICAgICAgICAgICAgcmV0dXJuIHJlbW92ZUFsbEltcGwodGhpcywgYyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKENvbGxlY3Rpb248Pz4gYykgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnJldGFpbkFsbChjaGVja05vdE51bGwoYykpOyAvLyBHV1QgY29tcGF0aWJpbGl0eQorICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIFVubW9kaWZpYWJsZU5hdmlnYWJsZVNldDxFPgorICAgICAgICAgICAgZXh0ZW5kcyBGb3J3YXJkaW5nU29ydGVkU2V0PEU+IGltcGxlbWVudHMgTmF2aWdhYmxlU2V0PEU+LCBTZXJpYWxpemFibGUgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAwOworICAgICAgICBwcml2YXRlIGZpbmFsIE5hdmlnYWJsZVNldDxFPiBkZWxlZ2F0ZTsKKyAgICAgICAgcHJpdmF0ZSB0cmFuc2llbnQgVW5tb2RpZmlhYmxlTmF2aWdhYmxlU2V0PEU+IGRlc2NlbmRpbmdTZXQ7CisKKyAgICAgICAgVW5tb2RpZmlhYmxlTmF2aWdhYmxlU2V0KE5hdmlnYWJsZVNldDxFPiBkZWxlZ2F0ZSkgeworICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZSA9IGNoZWNrTm90TnVsbChkZWxlZ2F0ZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIFNvcnRlZFNldDxFPiBkZWxlZ2F0ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTb3J0ZWRTZXQoZGVsZWdhdGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBFIGxvd2VyKEUgZSkgeworICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmxvd2VyKGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBFIGZsb29yKEUgZSkgeworICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmZsb29yKGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBFIGNlaWxpbmcoRSBlKSB7CisgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuY2VpbGluZyhlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRSBoaWdoZXIoRSBlKSB7CisgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuaGlnaGVyKGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBFIHBvbGxGaXJzdCgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBFIHBvbGxMYXN0KCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE5hdmlnYWJsZVNldDxFPiBkZXNjZW5kaW5nU2V0KCkgeworICAgICAgICAgICAgVW5tb2RpZmlhYmxlTmF2aWdhYmxlU2V0PEU+IHJlc3VsdCA9IGRlc2NlbmRpbmdTZXQ7CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBkZXNjZW5kaW5nU2V0ID0gbmV3IFVubW9kaWZpYWJsZU5hdmlnYWJsZVNldDxFPigKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlLmRlc2NlbmRpbmdTZXQoKSk7CisgICAgICAgICAgICAgICAgcmVzdWx0LmRlc2NlbmRpbmdTZXQgPSB0aGlzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSXRlcmF0b3I8RT4gZGVzY2VuZGluZ0l0ZXJhdG9yKCkgeworICAgICAgICAgICAgcmV0dXJuIEl0ZXJhdG9ycy51bm1vZGlmaWFibGVJdGVyYXRvcihkZWxlZ2F0ZS5kZXNjZW5kaW5nSXRlcmF0b3IoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE5hdmlnYWJsZVNldDxFPiBzdWJTZXQoCisgICAgICAgICAgICAgICAgRSBmcm9tRWxlbWVudCwKKyAgICAgICAgICAgICAgICBib29sZWFuIGZyb21JbmNsdXNpdmUsCisgICAgICAgICAgICAgICAgRSB0b0VsZW1lbnQsCisgICAgICAgICAgICAgICAgYm9vbGVhbiB0b0luY2x1c2l2ZSkgeworICAgICAgICAgICAgcmV0dXJuIHVubW9kaWZpYWJsZU5hdmlnYWJsZVNldChkZWxlZ2F0ZS5zdWJTZXQoCisgICAgICAgICAgICAgICAgICAgIGZyb21FbGVtZW50LAorICAgICAgICAgICAgICAgICAgICBmcm9tSW5jbHVzaXZlLAorICAgICAgICAgICAgICAgICAgICB0b0VsZW1lbnQsCisgICAgICAgICAgICAgICAgICAgIHRvSW5jbHVzaXZlKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE5hdmlnYWJsZVNldDxFPiBoZWFkU2V0KEUgdG9FbGVtZW50LCBib29sZWFuIGluY2x1c2l2ZSkgeworICAgICAgICAgICAgcmV0dXJuIHVubW9kaWZpYWJsZU5hdmlnYWJsZVNldChkZWxlZ2F0ZS5oZWFkU2V0KHRvRWxlbWVudCwgaW5jbHVzaXZlKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE5hdmlnYWJsZVNldDxFPiB0YWlsU2V0KEUgZnJvbUVsZW1lbnQsIGJvb2xlYW4gaW5jbHVzaXZlKSB7CisgICAgICAgICAgICByZXR1cm4gdW5tb2RpZmlhYmxlTmF2aWdhYmxlU2V0KAorICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZS50YWlsU2V0KGZyb21FbGVtZW50LCBpbmNsdXNpdmUpKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9TZXR0YWJsZUZ1dHVyZS5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9TZXR0YWJsZUZ1dHVyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MWZjMGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL1NldHRhYmxlRnV0dXJlLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgR3VhdmEgQXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YTsKKworLyoqCisgKiBBIHtAbGluayBMaXN0ZW5hYmxlRnV0dXJlfSB3aG9zZSByZXN1bHQgbWF5IGJlIHNldCBieSBhIHtAbGluayAjc2V0KE9iamVjdCl9CisgKiBvciB7QGxpbmsgI3NldEV4Y2VwdGlvbihUaHJvd2FibGUpfSBjYWxsLiBJdCBtYXkgYWxzbyBiZSBjYW5jZWxsZWQuCisgKgorICogQGF1dGhvciBTdmVuIE1hd3NvbgorICogQHNpbmNlIDkuMCAoaW4gMS4wIGFzIHtAY29kZSBWYWx1ZUZ1dHVyZX0pCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTZXR0YWJsZUZ1dHVyZTxWPiBleHRlbmRzIEFic3RyYWN0RnV0dXJlPFY+IHsKKworICAgIC8qKgorICAgICAqIEV4cGxpY2l0IHByaXZhdGUgY29uc3RydWN0b3IsIHVzZSB0aGUge0BsaW5rICNjcmVhdGV9IGZhY3RvcnkgbWV0aG9kIHRvCisgICAgICogY3JlYXRlIGluc3RhbmNlcyBvZiB7QGNvZGUgU2V0dGFibGVGdXR1cmV9LgorICAgICAqLworICAgIHByaXZhdGUgU2V0dGFibGVGdXR1cmUoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgU2V0dGFibGVGdXR1cmV9IGluIHRoZSBkZWZhdWx0IHN0YXRlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFY+IFNldHRhYmxlRnV0dXJlPFY+IGNyZWF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTZXR0YWJsZUZ1dHVyZTxWPigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoaXMgZnV0dXJlLiAgVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4ge0Bjb2RlIHRydWV9IGlmCisgICAgICogdGhlIHZhbHVlIHdhcyBzdWNjZXNzZnVsbHkgc2V0LCBvciB7QGNvZGUgZmFsc2V9IGlmIHRoZSBmdXR1cmUgaGFzIGFscmVhZHkKKyAgICAgKiBiZWVuIHNldCBvciBjYW5jZWxsZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRoZSBmdXR1cmUgc2hvdWxkIGhvbGQuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSB3YXMgc3VjY2Vzc2Z1bGx5IHNldC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBzZXQoViB2YWx1ZSkgeworICAgICAgICByZXR1cm4gc3VwZXIuc2V0KHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBmdXR1cmUgdG8gaGF2aW5nIGZhaWxlZCB3aXRoIHRoZSBnaXZlbiBleGNlcHRpb24uIFRoaXMgZXhjZXB0aW9uCisgICAgICogd2lsbCBiZSB3cmFwcGVkIGluIGFuIHtAY29kZSBFeGVjdXRpb25FeGNlcHRpb259IGFuZCB0aHJvd24gZnJvbSB0aGUge0Bjb2RlCisgICAgICogZ2V0fSBtZXRob2RzLiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGV4Y2VwdGlvbiB3YXMKKyAgICAgKiBzdWNjZXNzZnVsbHkgc2V0LCBvciB7QGNvZGUgZmFsc2V9IGlmIHRoZSBmdXR1cmUgaGFzIGFscmVhZHkgYmVlbiBzZXQgb3IKKyAgICAgKiBjYW5jZWxsZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGhyb3dhYmxlIHRoZSBleGNlcHRpb24gdGhlIGZ1dHVyZSBzaG91bGQgaG9sZC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGV4Y2VwdGlvbiB3YXMgc3VjY2Vzc2Z1bGx5IHNldC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBzZXRFeGNlcHRpb24oVGhyb3dhYmxlIHRocm93YWJsZSkgeworICAgICAgICByZXR1cm4gc3VwZXIuc2V0RXhjZXB0aW9uKHRocm93YWJsZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9Tb3J0ZWRJdGVyYWJsZS5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9Tb3J0ZWRJdGVyYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMmJmZDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL1NvcnRlZEl0ZXJhYmxlLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgR3VhdmEgQXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdAorICogaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZQorICogTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKKy8qKgorICogQW4ge0Bjb2RlIEl0ZXJhYmxlfSB3aG9zZSBlbGVtZW50cyBhcmUgc29ydGVkIHJlbGF0aXZlIHRvIGEge0Bjb2RlIENvbXBhcmF0b3J9LCB0eXBpY2FsbHkKKyAqIHByb3ZpZGVkIGF0IGNyZWF0aW9uIHRpbWUuCisgKgorICogQGF1dGhvciBMb3VpcyBXYXNzZXJtYW4KKyAqLworaW50ZXJmYWNlIFNvcnRlZEl0ZXJhYmxlPFQ+IGV4dGVuZHMgSXRlcmFibGU8VD4geworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHtAY29kZSBDb21wYXJhdG9yfSBieSB3aGljaCB0aGUgZWxlbWVudHMgb2YgdGhpcyBpdGVyYWJsZSBhcmUgb3JkZXJlZCwgb3Ige0Bjb2RlCisgICAgICogT3JkZXJpbmcubmF0dXJhbCgpfSBpZiB0aGUgZWxlbWVudHMgYXJlIG9yZGVyZWQgYnkgdGhlaXIgbmF0dXJhbCBvcmRlcmluZy4KKyAgICAgKi8KKyAgICBDb21wYXJhdG9yPD8gc3VwZXIgVD4gY29tcGFyYXRvcigpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBpdGVyYXRvciBvdmVyIGVsZW1lbnRzIG9mIHR5cGUge0Bjb2RlIFR9LiBUaGUgZWxlbWVudHMgYXJlIHJldHVybmVkIGluCisgICAgICogbm9uZGVjcmVhc2luZyBvcmRlciBhY2NvcmRpbmcgdG8gdGhlIGFzc29jaWF0ZWQge0BsaW5rICNjb21wYXJhdG9yfS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBJdGVyYXRvcjxUPiBpdGVyYXRvcigpOworfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9Tb3J0ZWRJdGVyYWJsZXMuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvU29ydGVkSXRlcmFibGVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQxMjcxZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvU29ydGVkSXRlcmFibGVzLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgR3VhdmEgQXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdAorICogaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZQorICogTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyCisgKiBleHByZXNzIG9yIGltcGxpZWQuIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OworCitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworCisvKioKKyAqIFV0aWxpdGllcyBmb3IgZGVhbGluZyB3aXRoIHNvcnRlZCBjb2xsZWN0aW9ucyBvZiBhbGwgdHlwZXMuCisgKgorICogQGF1dGhvciBMb3VpcyBXYXNzZXJtYW4KKyAqLworZmluYWwgY2xhc3MgU29ydGVkSXRlcmFibGVzIHsKKyAgICBwcml2YXRlIFNvcnRlZEl0ZXJhYmxlcygpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB7QGNvZGUgZWxlbWVudHN9IGlzIGEgc29ydGVkIGNvbGxlY3Rpb24gdXNpbmcgYW4gb3JkZXJpbmcgZXF1aXZhbGVudAorICAgICAqIHRvIHtAY29kZSBjb21wYXJhdG9yfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzU2FtZUNvbXBhcmF0b3IoQ29tcGFyYXRvcjw/PiBjb21wYXJhdG9yLCBJdGVyYWJsZTw/PiBlbGVtZW50cykgeworICAgICAgICBjaGVja05vdE51bGwoY29tcGFyYXRvcik7CisgICAgICAgIGNoZWNrTm90TnVsbChlbGVtZW50cyk7CisgICAgICAgIENvbXBhcmF0b3I8Pz4gY29tcGFyYXRvcjI7CisgICAgICAgIGlmIChlbGVtZW50cyBpbnN0YW5jZW9mIFNvcnRlZFNldCkgeworICAgICAgICAgICAgY29tcGFyYXRvcjIgPSBjb21wYXJhdG9yKChTb3J0ZWRTZXQ8Pz4pIGVsZW1lbnRzKTsKKyAgICAgICAgfSBlbHNlIGlmIChlbGVtZW50cyBpbnN0YW5jZW9mIFNvcnRlZEl0ZXJhYmxlKSB7CisgICAgICAgICAgICBjb21wYXJhdG9yMiA9ICgoU29ydGVkSXRlcmFibGU8Pz4pIGVsZW1lbnRzKS5jb21wYXJhdG9yKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbXBhcmF0b3IuZXF1YWxzKGNvbXBhcmF0b3IyKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAvLyBpZiBzb3J0ZWRTZXQuY29tcGFyYXRvcigpIGlzIG51bGwsIHRoZSBzZXQgbXVzdCBiZSBuYXR1cmFsbHkgb3JkZXJlZAorICAgIHByaXZhdGUgc3RhdGljIDxFPiBDb21wYXJhdG9yPD8gc3VwZXIgRT4gY29tcGFyYXRvcihTb3J0ZWRTZXQ8RT4gc29ydGVkU2V0KSB7CisgICAgICAgIENvbXBhcmF0b3I8PyBzdXBlciBFPiByZXN1bHQgPSBzb3J0ZWRTZXQuY29tcGFyYXRvcigpOworICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IChDb21wYXJhdG9yPD8gc3VwZXIgRT4pIE9yZGVyaW5nLm5hdHVyYWwoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvU29ydGVkTGlzdHMuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvU29ydGVkTGlzdHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGVkZGU0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9Tb3J0ZWRMaXN0cy5qYXZhCkBAIC0wLDAgKzEsMjA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBHdWF2YSBBdXRob3JzCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0CisgKiBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UKKyAqIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcworICogb3IgaW1wbGllZC4gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucyB1bmRlcgorICogdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YTsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tQWNjZXNzOworCitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworCisvKioKKyAqIFN0YXRpYyBtZXRob2RzIHBlcnRhaW5pbmcgdG8gc29ydGVkIHtAbGluayBMaXN0fSBpbnN0YW5jZXMuCisgKiA8cD4KKyAqIEluIHRoaXMgZG9jdW1lbnRhdGlvbiwgdGhlIHRlcm1zIDxpPmdyZWF0ZXN0PC9pPiwgPGk+Z3JlYXRlcjwvaT4sIDxpPmxlYXN0PC9pPiwgYW5kCisgKiA8aT5sZXNzZXI8L2k+IGFyZSBjb25zaWRlcmVkIHRvIHJlZmVyIHRvIHRoZSBjb21wYXJhdG9yIG9uIHRoZSBlbGVtZW50cywgYW5kIHRoZSB0ZXJtcworICogPGk+Zmlyc3Q8L2k+IGFuZCA8aT5sYXN0PC9pPiBhcmUgY29uc2lkZXJlZCB0byByZWZlciB0byB0aGUgZWxlbWVudHMnIG9yZGVyaW5nIGluIGEKKyAqIGxpc3QuCisgKgorICogQGF1dGhvciBMb3VpcyBXYXNzZXJtYW4KKyAqLworZmluYWwgY2xhc3MgU29ydGVkTGlzdHMgeworICAgIHByaXZhdGUgU29ydGVkTGlzdHMoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VhcmNoZXMgdGhlIHNwZWNpZmllZCBsaXN0IGZvciB0aGUgc3BlY2lmaWVkIG9iamVjdCB1c2luZyB0aGUgYmluYXJ5IHNlYXJjaCBhbGdvcml0aG0uIFRoZQorICAgICAqIGxpc3QgbXVzdCBiZSBzb3J0ZWQgaW50byBhc2NlbmRpbmcgb3JkZXIgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgY29tcGFyYXRvciAoYXMgYnkgdGhlCisgICAgICoge0BsaW5rIENvbGxlY3Rpb25zI3NvcnQoTGlzdCwgQ29tcGFyYXRvcikgQ29sbGVjdGlvbnMuc29ydChMaXN0LCBDb21wYXJhdG9yKX0gbWV0aG9kKSwgcHJpb3IKKyAgICAgKiB0byBtYWtpbmcgdGhpcyBjYWxsLiBJZiBpdCBpcyBub3Qgc29ydGVkLCB0aGUgcmVzdWx0cyBhcmUgdW5kZWZpbmVkLgorICAgICAqIDxwPgorICAgICAqIDxwPklmIHRoZXJlIGFyZSBlbGVtZW50cyBpbiB0aGUgbGlzdCB3aGljaCBjb21wYXJlIGFzIGVxdWFsIHRvIHRoZSBrZXksIHRoZSBjaG9pY2Ugb2YKKyAgICAgKiB7QGxpbmsgS2V5UHJlc2VudEJlaGF2aW9yfSBkZWNpZGVzIHdoaWNoIGluZGV4IGlzIHJldHVybmVkLiBJZiBubyBlbGVtZW50cyBjb21wYXJlIGFzIGVxdWFsIHRvCisgICAgICogdGhlIGtleSwgdGhlIGNob2ljZSBvZiB7QGxpbmsgS2V5QWJzZW50QmVoYXZpb3J9IGRlY2lkZXMgd2hpY2ggaW5kZXggaXMgcmV0dXJuZWQuCisgICAgICogPHA+CisgICAgICogPHA+VGhpcyBtZXRob2QgcnVucyBpbiBsb2cobikgdGltZSBvbiByYW5kb20tYWNjZXNzIGxpc3RzLCB3aGljaCBvZmZlciBuZWFyLWNvbnN0YW50LXRpbWUKKyAgICAgKiBhY2Nlc3MgdG8gZWFjaCBsaXN0IGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdCAgICAgICAgICAgIHRoZSBsaXN0IHRvIGJlIHNlYXJjaGVkLgorICAgICAqIEBwYXJhbSBrZXkgICAgICAgICAgICAgdGhlIHZhbHVlIHRvIGJlIHNlYXJjaGVkIGZvci4KKyAgICAgKiBAcGFyYW0gY29tcGFyYXRvciAgICAgIHRoZSBjb21wYXJhdG9yIGJ5IHdoaWNoIHRoZSBsaXN0IGlzIG9yZGVyZWQuCisgICAgICogQHBhcmFtIHByZXNlbnRCZWhhdmlvciB0aGUgc3BlY2lmaWNhdGlvbiBmb3Igd2hhdCB0byBkbyBpZiBhdCBsZWFzdCBvbmUgZWxlbWVudCBvZiB0aGUgbGlzdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZXMgYXMgZXF1YWwgdG8gdGhlIGtleS4KKyAgICAgKiBAcGFyYW0gYWJzZW50QmVoYXZpb3IgIHRoZSBzcGVjaWZpY2F0aW9uIGZvciB3aGF0IHRvIGRvIGlmIG5vIGVsZW1lbnRzIG9mIHRoZSBsaXN0IGNvbXBhcmUgYXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGVxdWFsIHRvIHRoZSBrZXkuCisgICAgICogQHJldHVybiB0aGUgaW5kZXggZGV0ZXJtaW5lZCBieSB0aGUge0Bjb2RlIEtleVByZXNlbnRCZWhhdmlvcn0sIGlmIHRoZSBrZXkgaXMgaW4gdGhlIGxpc3Q7CisgICAgICogb3RoZXJ3aXNlIHRoZSBpbmRleCBkZXRlcm1pbmVkIGJ5IHRoZSB7QGNvZGUgS2V5QWJzZW50QmVoYXZpb3J9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPEU+IGludCBiaW5hcnlTZWFyY2goTGlzdDw/IGV4dGVuZHMgRT4gbGlzdCwgRSBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wYXJhdG9yPD8gc3VwZXIgRT4gY29tcGFyYXRvciwgS2V5UHJlc2VudEJlaGF2aW9yIHByZXNlbnRCZWhhdmlvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUFic2VudEJlaGF2aW9yIGFic2VudEJlaGF2aW9yKSB7CisgICAgICAgIGNoZWNrTm90TnVsbChjb21wYXJhdG9yKTsKKyAgICAgICAgY2hlY2tOb3ROdWxsKGxpc3QpOworICAgICAgICBjaGVja05vdE51bGwocHJlc2VudEJlaGF2aW9yKTsKKyAgICAgICAgY2hlY2tOb3ROdWxsKGFic2VudEJlaGF2aW9yKTsKKyAgICAgICAgaWYgKCEobGlzdCBpbnN0YW5jZW9mIFJhbmRvbUFjY2VzcykpIHsKKyAgICAgICAgICAgIGxpc3QgPSBMaXN0cy5uZXdBcnJheUxpc3QobGlzdCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETyh1c2VyKTogYmVuY2htYXJrIHdoZW4gaXQncyBiZXN0IHRvIGRvIGEgbGluZWFyIHNlYXJjaAorCisgICAgICAgIGludCBsb3dlciA9IDA7CisgICAgICAgIGludCB1cHBlciA9IGxpc3Quc2l6ZSgpIC0gMTsKKworICAgICAgICB3aGlsZSAobG93ZXIgPD0gdXBwZXIpIHsKKyAgICAgICAgICAgIGludCBtaWRkbGUgPSAobG93ZXIgKyB1cHBlcikgPj4+IDE7CisgICAgICAgICAgICBpbnQgYyA9IGNvbXBhcmF0b3IuY29tcGFyZShrZXksIGxpc3QuZ2V0KG1pZGRsZSkpOworICAgICAgICAgICAgaWYgKGMgPCAwKSB7CisgICAgICAgICAgICAgICAgdXBwZXIgPSBtaWRkbGUgLSAxOworICAgICAgICAgICAgfSBlbHNlIGlmIChjID4gMCkgeworICAgICAgICAgICAgICAgIGxvd2VyID0gbWlkZGxlICsgMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxvd2VyICsgcHJlc2VudEJlaGF2aW9yLnJlc3VsdEluZGV4KAorICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyYXRvciwga2V5LCBsaXN0LnN1Ykxpc3QobG93ZXIsIHVwcGVyICsgMSksIG1pZGRsZSAtIGxvd2VyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWJzZW50QmVoYXZpb3IucmVzdWx0SW5kZXgobG93ZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgc3BlY2lmaWNhdGlvbiBmb3Igd2hpY2ggaW5kZXggdG8gcmV0dXJuIGlmIHRoZSBsaXN0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBlbGVtZW50IHRoYXQKKyAgICAgKiBjb21wYXJlcyBhcyBlcXVhbCB0byB0aGUga2V5LgorICAgICAqLworICAgIHB1YmxpYyBlbnVtIEtleVByZXNlbnRCZWhhdmlvciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdGhlIGluZGV4IG9mIGFueSBsaXN0IGVsZW1lbnQgdGhhdCBjb21wYXJlcyBhcyBlcXVhbCB0byB0aGUga2V5LiBObyBndWFyYW50ZWVzIGFyZQorICAgICAgICAgKiBtYWRlIGFzIHRvIHdoaWNoIGluZGV4IGlzIHJldHVybmVkLCBpZiBtb3JlIHRoYW4gb25lIGVsZW1lbnQgY29tcGFyZXMgYXMgZXF1YWwgdG8gdGhlIGtleS4KKyAgICAgICAgICovCisgICAgICAgIEFOWV9QUkVTRU5UIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgPEU+IGludCByZXN1bHRJbmRleCgKKyAgICAgICAgICAgICAgICAgICAgQ29tcGFyYXRvcjw/IHN1cGVyIEU+IGNvbXBhcmF0b3IsIEUga2V5LCBMaXN0PD8gZXh0ZW5kcyBFPiBsaXN0LCBpbnQgZm91bmRJbmRleCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZEluZGV4OworICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBsaXN0IGVsZW1lbnQgdGhhdCBjb21wYXJlcyBhcyBlcXVhbCB0byB0aGUga2V5LgorICAgICAgICAgKi8KKyAgICAgICAgTEFTVF9QUkVTRU5UIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgPEU+IGludCByZXN1bHRJbmRleCgKKyAgICAgICAgICAgICAgICAgICAgQ29tcGFyYXRvcjw/IHN1cGVyIEU+IGNvbXBhcmF0b3IsIEUga2V5LCBMaXN0PD8gZXh0ZW5kcyBFPiBsaXN0LCBpbnQgZm91bmRJbmRleCkgeworICAgICAgICAgICAgICAgIC8vIE9mIGNvdXJzZSwgd2UgaGF2ZSB0byB1c2UgYmluYXJ5IHNlYXJjaCB0byBmaW5kIHRoZSBwcmVjaXNlCisgICAgICAgICAgICAgICAgLy8gYnJlYWtwb2ludC4uLgorICAgICAgICAgICAgICAgIGludCBsb3dlciA9IGZvdW5kSW5kZXg7CisgICAgICAgICAgICAgICAgaW50IHVwcGVyID0gbGlzdC5zaXplKCkgLSAxOworICAgICAgICAgICAgICAgIC8vIEV2ZXJ5dGhpbmcgYmV0d2VlbiBsb3dlciBhbmQgdXBwZXIgaW5jbHVzaXZlIGNvbXBhcmVzIGF0ID49IDAuCisgICAgICAgICAgICAgICAgd2hpbGUgKGxvd2VyIDwgdXBwZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IG1pZGRsZSA9IChsb3dlciArIHVwcGVyICsgMSkgPj4+IDE7CisgICAgICAgICAgICAgICAgICAgIGludCBjID0gY29tcGFyYXRvci5jb21wYXJlKGxpc3QuZ2V0KG1pZGRsZSksIGtleSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBtaWRkbGUgLSAxOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBjID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyID0gbWlkZGxlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBsb3dlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybiB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGxpc3QgZWxlbWVudCB0aGF0IGNvbXBhcmVzIGFzIGVxdWFsIHRvIHRoZSBrZXkuCisgICAgICAgICAqLworICAgICAgICBGSVJTVF9QUkVTRU5UIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgPEU+IGludCByZXN1bHRJbmRleCgKKyAgICAgICAgICAgICAgICAgICAgQ29tcGFyYXRvcjw/IHN1cGVyIEU+IGNvbXBhcmF0b3IsIEUga2V5LCBMaXN0PD8gZXh0ZW5kcyBFPiBsaXN0LCBpbnQgZm91bmRJbmRleCkgeworICAgICAgICAgICAgICAgIC8vIE9mIGNvdXJzZSwgd2UgaGF2ZSB0byB1c2UgYmluYXJ5IHNlYXJjaCB0byBmaW5kIHRoZSBwcmVjaXNlCisgICAgICAgICAgICAgICAgLy8gYnJlYWtwb2ludC4uLgorICAgICAgICAgICAgICAgIGludCBsb3dlciA9IDA7CisgICAgICAgICAgICAgICAgaW50IHVwcGVyID0gZm91bmRJbmRleDsKKyAgICAgICAgICAgICAgICAvLyBPZiBjb3Vyc2UsIHdlIGhhdmUgdG8gdXNlIGJpbmFyeSBzZWFyY2ggdG8gZmluZCB0aGUgcHJlY2lzZSBicmVha3BvaW50Li4uCisgICAgICAgICAgICAgICAgLy8gRXZlcnl0aGluZyBiZXR3ZWVuIGxvd2VyIGFuZCB1cHBlciBpbmNsdXNpdmUgY29tcGFyZXMgYXQgPD0gMC4KKyAgICAgICAgICAgICAgICB3aGlsZSAobG93ZXIgPCB1cHBlcikgeworICAgICAgICAgICAgICAgICAgICBpbnQgbWlkZGxlID0gKGxvd2VyICsgdXBwZXIpID4+PiAxOworICAgICAgICAgICAgICAgICAgICBpbnQgYyA9IGNvbXBhcmF0b3IuY29tcGFyZShsaXN0LmdldChtaWRkbGUpLCBrZXkpOworICAgICAgICAgICAgICAgICAgICBpZiAoYyA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyID0gbWlkZGxlICsgMTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gYyA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICB1cHBlciA9IG1pZGRsZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbG93ZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBsaXN0IGVsZW1lbnQgdGhhdCBjb21wYXJlcyBhcyBncmVhdGVyIHRoYW4gdGhlIGtleSwgb3Ige0Bjb2RlCisgICAgICAgICAqIGxpc3Quc2l6ZSgpfSBpZiB0aGVyZSBpcyBubyBzdWNoIGVsZW1lbnQuCisgICAgICAgICAqLworICAgICAgICBGSVJTVF9BRlRFUiB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyA8RT4gaW50IHJlc3VsdEluZGV4KAorICAgICAgICAgICAgICAgICAgICBDb21wYXJhdG9yPD8gc3VwZXIgRT4gY29tcGFyYXRvciwgRSBrZXksIExpc3Q8PyBleHRlbmRzIEU+IGxpc3QsIGludCBmb3VuZEluZGV4KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIExBU1RfUFJFU0VOVC5yZXN1bHRJbmRleChjb21wYXJhdG9yLCBrZXksIGxpc3QsIGZvdW5kSW5kZXgpICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBhYnN0cmFjdCA8RT4gaW50IHJlc3VsdEluZGV4KAorICAgICAgICAgICAgICAgIENvbXBhcmF0b3I8PyBzdXBlciBFPiBjb21wYXJhdG9yLCBFIGtleSwgTGlzdDw/IGV4dGVuZHMgRT4gbGlzdCwgaW50IGZvdW5kSW5kZXgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgc3BlY2lmaWNhdGlvbiBmb3Igd2hpY2ggaW5kZXggdG8gcmV0dXJuIGlmIHRoZSBsaXN0IGNvbnRhaW5zIG5vIGVsZW1lbnRzIHRoYXQgY29tcGFyZSBhcworICAgICAqIGVxdWFsIHRvIHRoZSBrZXkuCisgICAgICovCisgICAgcHVibGljIGVudW0gS2V5QWJzZW50QmVoYXZpb3IgeworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBoaWdoZXIgZWxlbWVudCBpbiB0aGUgbGlzdCwgb3Ige0Bjb2RlIGxpc3Quc2l6ZSgpfSBpZiB0aGVyZSBpcworICAgICAgICAgKiBubyBzdWNoIGVsZW1lbnQuCisgICAgICAgICAqLworICAgICAgICBORVhUX0hJR0hFUiB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgcmVzdWx0SW5kZXgoaW50IGhpZ2hlckluZGV4KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGhpZ2hlckluZGV4OworICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIHtAY29kZSB+aW5zZXJ0aW9uSW5kZXh9LCB3aGVyZSB7QGNvZGUgaW5zZXJ0aW9uSW5kZXh9IGlzIGRlZmluZWQgYXMgdGhlIHBvaW50IGF0CisgICAgICAgICAqIHdoaWNoIHRoZSBrZXkgd291bGQgYmUgaW5zZXJ0ZWQgaW50byB0aGUgbGlzdDogdGhlIGluZGV4IG9mIHRoZSBuZXh0IGhpZ2hlciBlbGVtZW50IGluIHRoZQorICAgICAgICAgKiBsaXN0LCBvciB7QGNvZGUgbGlzdC5zaXplKCl9IGlmIHRoZXJlIGlzIG5vIHN1Y2ggZWxlbWVudC4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIDxwPk5vdGUgdGhhdCB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgYmUge0Bjb2RlID49IDB9IGlmIGFuZCBvbmx5IGlmIHRoZXJlIGlzIGFuIGVsZW1lbnQgb2YgdGhlCisgICAgICAgICAqIGxpc3QgdGhhdCBjb21wYXJlcyBhcyBlcXVhbCB0byB0aGUga2V5LgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogPHA+VGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBiZWhhdmlvciBvZgorICAgICAgICAgKiB7QGxpbmsgQ29sbGVjdGlvbnMjYmluYXJ5U2VhcmNoKExpc3QsIE9iamVjdCl9IHdoZW4gdGhlIGtleSBpc24ndCBwcmVzZW50LCBzaW5jZQorICAgICAgICAgKiB7QGNvZGUgfmluc2VydGlvbkluZGV4fSBpcyBlcXVhbCB0byB7QGNvZGUgLTEgLSBpbnNlcnRpb25JbmRleH0uCisgICAgICAgICAqLworICAgICAgICBJTlZFUlRFRF9JTlNFUlRJT05fSU5ERVggeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgaW50IHJlc3VsdEluZGV4KGludCBoaWdoZXJJbmRleCkgeworICAgICAgICAgICAgICAgIHJldHVybiB+aGlnaGVySW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgYWJzdHJhY3QgaW50IHJlc3VsdEluZGV4KGludCBoaWdoZXJJbmRleCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9Tb3J0ZWRTZXRNdWx0aW1hcC5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9Tb3J0ZWRTZXRNdWx0aW1hcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MGRkZmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL1NvcnRlZFNldE11bHRpbWFwLmphdmEKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNyBUaGUgR3VhdmEgQXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YTsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OworCisvKioKKyAqIEEge0Bjb2RlIFNldE11bHRpbWFwfSB3aG9zZSBzZXQgb2YgdmFsdWVzIGZvciBhIGdpdmVuIGtleSBhcmUga2VwdCBzb3J0ZWQ7CisgKiB0aGF0IGlzLCB0aGV5IGNvbXByaXNlIGEge0BsaW5rIFNvcnRlZFNldH0uIEl0IGNhbm5vdCBob2xkIGR1cGxpY2F0ZQorICoga2V5LXZhbHVlIHBhaXJzOyBhZGRpbmcgYSBrZXktdmFsdWUgcGFpciB0aGF0J3MgYWxyZWFkeSBpbiB0aGUgbXVsdGltYXAgaGFzCisgKiBubyBlZmZlY3QuIFRoaXMgaW50ZXJmYWNlIGRvZXMgbm90IHNwZWNpZnkgdGhlIG9yZGVyaW5nIG9mIHRoZSBtdWx0aW1hcCdzCisgKiBrZXlzLiBTZWUgdGhlIHtAbGluayBNdWx0aW1hcH0gZG9jdW1lbnRhdGlvbiBmb3IgaW5mb3JtYXRpb24gY29tbW9uIHRvIGFsbAorICogbXVsdGltYXBzLgorICogPHA+CisgKiA8cD5UaGUge0BsaW5rICNnZXR9LCB7QGxpbmsgI3JlbW92ZUFsbH0sIGFuZCB7QGxpbmsgI3JlcGxhY2VWYWx1ZXN9IG1ldGhvZHMKKyAqIGVhY2ggcmV0dXJuIGEge0BsaW5rIFNvcnRlZFNldH0gb2YgdmFsdWVzLCB3aGlsZSB7QGxpbmsgTXVsdGltYXAjZW50cmllcygpfQorICogcmV0dXJucyBhIHtAbGluayBTZXR9IG9mIG1hcCBlbnRyaWVzLiBUaG91Z2ggdGhlIG1ldGhvZCBzaWduYXR1cmUgZG9lc24ndCBzYXkKKyAqIHNvIGV4cGxpY2l0bHksIHRoZSBtYXAgcmV0dXJuZWQgYnkge0BsaW5rICNhc01hcH0gaGFzIHtAY29kZSBTb3J0ZWRTZXR9CisgKiB2YWx1ZXMuCisgKiA8cD4KKyAqIDxwPlNlZSB0aGUgR3VhdmEgVXNlciBHdWlkZSBhcnRpY2xlIG9uIDxhIGhyZWY9CisgKiAiaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2d1YXZhLWxpYnJhcmllcy93aWtpL05ld0NvbGxlY3Rpb25UeXBlc0V4cGxhaW5lZCNNdWx0aW1hcCI+CisgKiB7QGNvZGUgTXVsdGltYXB9PC9hPi4KKyAqCisgKiBAYXV0aG9yIEphcmVkIExldnkKKyAqIEBzaW5jZSAyLjAgKGltcG9ydGVkIGZyb20gR29vZ2xlIENvbGxlY3Rpb25zIExpYnJhcnkpCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU29ydGVkU2V0TXVsdGltYXA8SywgVj4gZXh0ZW5kcyBTZXRNdWx0aW1hcDxLLCBWPiB7CisgICAgLy8gRm9sbG93aW5nIEphdmFkb2MgY29waWVkIGZyb20gTXVsdGltYXAuCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgY29sbGVjdGlvbiB2aWV3IG9mIGFsbCB2YWx1ZXMgYXNzb2NpYXRlZCB3aXRoIGEga2V5LiBJZiBubworICAgICAqIG1hcHBpbmdzIGluIHRoZSBtdWx0aW1hcCBoYXZlIHRoZSBwcm92aWRlZCBrZXksIGFuIGVtcHR5IGNvbGxlY3Rpb24gaXMKKyAgICAgKiByZXR1cm5lZC4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5DaGFuZ2VzIHRvIHRoZSByZXR1cm5lZCBjb2xsZWN0aW9uIHdpbGwgdXBkYXRlIHRoZSB1bmRlcmx5aW5nIG11bHRpbWFwLAorICAgICAqIGFuZCB2aWNlIHZlcnNhLgorICAgICAqIDxwPgorICAgICAqIDxwPkJlY2F1c2UgYSB7QGNvZGUgU29ydGVkU2V0TXVsdGltYXB9IGhhcyB1bmlxdWUgc29ydGVkIHZhbHVlcyBmb3IgYSBnaXZlbgorICAgICAqIGtleSwgdGhpcyBtZXRob2QgcmV0dXJucyBhIHtAbGluayBTb3J0ZWRTZXR9LCBpbnN0ZWFkIG9mIHRoZQorICAgICAqIHtAbGluayBDb2xsZWN0aW9ufSBzcGVjaWZpZWQgaW4gdGhlIHtAbGluayBNdWx0aW1hcH0gaW50ZXJmYWNlLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIFNvcnRlZFNldDxWPiBnZXQoSyBrZXkpOworCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhbGwgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGtleS4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5CZWNhdXNlIGEge0Bjb2RlIFNvcnRlZFNldE11bHRpbWFwfSBoYXMgdW5pcXVlIHNvcnRlZCB2YWx1ZXMgZm9yIGEgZ2l2ZW4KKyAgICAgKiBrZXksIHRoaXMgbWV0aG9kIHJldHVybnMgYSB7QGxpbmsgU29ydGVkU2V0fSwgaW5zdGVhZCBvZiB0aGUKKyAgICAgKiB7QGxpbmsgQ29sbGVjdGlvbn0gc3BlY2lmaWVkIGluIHRoZSB7QGxpbmsgTXVsdGltYXB9IGludGVyZmFjZS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBTb3J0ZWRTZXQ8Vj4gcmVtb3ZlQWxsKE9iamVjdCBrZXkpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIG1hcCB2aWV3IHRoYXQgYXNzb2NpYXRlcyBlYWNoIGtleSB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlcworICAgICAqIGluIHRoZSBtdWx0aW1hcC4gQ2hhbmdlcyB0byB0aGUgcmV0dXJuZWQgbWFwLCBzdWNoIGFzIGVsZW1lbnQgcmVtb3ZhbCwgd2lsbAorICAgICAqIHVwZGF0ZSB0aGUgdW5kZXJseWluZyBtdWx0aW1hcC4gVGhlIG1hcCBkb2VzIG5vdCBzdXBwb3J0IHtAY29kZSBzZXRWYWx1ZSgpfQorICAgICAqIG9uIGl0cyBlbnRyaWVzLCB7QGNvZGUgcHV0fSwgb3Ige0Bjb2RlIHB1dEFsbH0uCisgICAgICogPHA+CisgICAgICogPHA+V2hlbiBwYXNzZWQgYSBrZXkgdGhhdCBpcyBwcmVzZW50IGluIHRoZSBtYXAsIHtAY29kZQorICAgICAqIGFzTWFwKCkuZ2V0KE9iamVjdCl9IGhhcyB0aGUgc2FtZSBiZWhhdmlvciBhcyB7QGxpbmsgI2dldH0sIHJldHVybmluZyBhCisgICAgICogbGl2ZSBjb2xsZWN0aW9uLiBXaGVuIHBhc3NlZCBhIGtleSB0aGF0IGlzIG5vdCBwcmVzZW50LCBob3dldmVyLCB7QGNvZGUKKyAgICAgKiBhc01hcCgpLmdldChPYmplY3QpfSByZXR1cm5zIHtAY29kZSBudWxsfSBpbnN0ZWFkIG9mIGFuIGVtcHR5IGNvbGxlY3Rpb24uCisgICAgICogPHA+CisgICAgICogPHA+PGI+Tm90ZTo8L2I+IFRoZSByZXR1cm5lZCBtYXAncyB2YWx1ZXMgYXJlIGd1YXJhbnRlZWQgdG8gYmUgb2YgdHlwZQorICAgICAqIHtAbGluayBTb3J0ZWRTZXR9LiBUbyBvYnRhaW4gdGhpcyBtYXAgd2l0aCB0aGUgbW9yZSBzcGVjaWZpYyBnZW5lcmljIHR5cGUKKyAgICAgKiB7QGNvZGUgTWFwPEssIFNvcnRlZFNldDxWPj59LCBjYWxsCisgICAgICoge0BsaW5rIE11bHRpbWFwcyNhc01hcChTb3J0ZWRTZXRNdWx0aW1hcCl9IGluc3RlYWQuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgTWFwPEssIENvbGxlY3Rpb248Vj4+IGFzTWFwKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjb21wYXJhdG9yIHRoYXQgb3JkZXJzIHRoZSBtdWx0aW1hcCB2YWx1ZXMsIHdpdGgge0Bjb2RlIG51bGx9CisgICAgICogaW5kaWNhdGluZyB0aGF0IG5hdHVyYWwgb3JkZXJpbmcgaXMgdXNlZC4KKyAgICAgKi8KKyAgICBDb21wYXJhdG9yPD8gc3VwZXIgVj4gdmFsdWVDb21wYXJhdG9yKCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL1N0YW5kYXJkVGFibGUuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvU3RhbmRhcmRUYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyOTkzNjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL1N0YW5kYXJkVGFibGUuamF2YQpAQCAtMCwwICsxLDk1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgR3VhdmEgQXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YTsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmEuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhLlByZWRpY2F0ZXMuYWx3YXlzVHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmEuUHJlZGljYXRlcy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YS5QcmVkaWNhdGVzLmluOworaW1wb3J0IHN0YXRpYyBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YS5QcmVkaWNhdGVzLm5vdDsKKworLyoqCisgKiB7QGxpbmsgVGFibGV9IGltcGxlbWVudGF0aW9uIGJhY2tlZCBieSBhIG1hcCB0aGF0IGFzc29jaWF0ZXMgcm93IGtleXMgd2l0aAorICogY29sdW1uIGtleSAvIHZhbHVlIHNlY29uZGFyeSBtYXBzLiBUaGlzIGNsYXNzIHByb3ZpZGVzIHJhcGlkIGFjY2VzcyB0bworICogcmVjb3JkcyBieSB0aGUgcm93IGtleSBhbG9uZSBvciBieSBib3RoIGtleXMsIGJ1dCBub3QgYnkganVzdCB0aGUgY29sdW1uIGtleS4KKyAqIDxwPgorICogPHA+VGhlIHZpZXdzIHJldHVybmVkIGJ5IHtAbGluayAjY29sdW1ufSwge0BsaW5rICNjb2x1bW5LZXlTZXQoKX0sIGFuZCB7QGxpbmsKKyAqICNjb2x1bW5NYXAoKX0gaGF2ZSBpdGVyYXRvcnMgdGhhdCBkb24ndCBzdXBwb3J0IHtAY29kZSByZW1vdmUoKX0uIE90aGVyd2lzZSwKKyAqIGFsbCBvcHRpb25hbCBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuIE51bGwgcm93IGtleXMsIGNvbHVtbnMga2V5cywgYW5kCisgKiB2YWx1ZXMgYXJlIG5vdCBzdXBwb3J0ZWQuCisgKiA8cD4KKyAqIDxwPkxvb2t1cHMgYnkgcm93IGtleSBhcmUgb2Z0ZW4gZmFzdGVyIHRoYW4gbG9va3VwcyBieSBjb2x1bW4ga2V5LCBiZWNhdXNlCisgKiB0aGUgZGF0YSBpcyBzdG9yZWQgaW4gYSB7QGNvZGUgTWFwPFIsIE1hcDxDLCBWPj59LiBBIG1ldGhvZCBjYWxsIGxpa2Uge0Bjb2RlCisgKiBjb2x1bW4oY29sdW1uS2V5KS5nZXQocm93S2V5KX0gc3RpbGwgcnVucyBxdWlja2x5LCBzaW5jZSB0aGUgcm93IGtleSBpcworICogcHJvdmlkZWQuIEhvd2V2ZXIsIHtAY29kZSBjb2x1bW4oY29sdW1uS2V5KS5zaXplKCl9IHRha2VzIGxvbmdlciwgc2luY2UgYW4KKyAqIGl0ZXJhdGlvbiBhY3Jvc3MgYWxsIHJvdyBrZXlzIG9jY3Vycy4KKyAqIDxwPgorICogPHA+Tm90ZSB0aGF0IHRoaXMgaW1wbGVtZW50YXRpb24gaXMgbm90IHN5bmNocm9uaXplZC4gSWYgbXVsdGlwbGUgdGhyZWFkcworICogYWNjZXNzIHRoaXMgdGFibGUgY29uY3VycmVudGx5IGFuZCBvbmUgb2YgdGhlIHRocmVhZHMgbW9kaWZpZXMgdGhlIHRhYmxlLCBpdAorICogbXVzdCBiZSBzeW5jaHJvbml6ZWQgZXh0ZXJuYWxseS4KKyAqCisgKiBAYXV0aG9yIEphcmVkIExldnkKKyAqLworY2xhc3MgU3RhbmRhcmRUYWJsZTxSLCBDLCBWPiBleHRlbmRzIEFic3RyYWN0VGFibGU8UiwgQywgVj4gaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDA7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8UiwgTWFwPEMsIFY+PiBiYWNraW5nTWFwOworICAgIHByaXZhdGUgZmluYWwgU3VwcGxpZXI8PyBleHRlbmRzIE1hcDxDLCBWPj4gZmFjdG9yeTsKKworICAgIC8vIEFjY2Vzc29ycworICAgIHByaXZhdGUgdHJhbnNpZW50IFNldDxDPiBjb2x1bW5LZXlTZXQ7CisgICAgcHJpdmF0ZSB0cmFuc2llbnQgTWFwPFIsIE1hcDxDLCBWPj4gcm93TWFwOworICAgIHByaXZhdGUgdHJhbnNpZW50IENvbHVtbk1hcCBjb2x1bW5NYXA7CisKKyAgICBTdGFuZGFyZFRhYmxlKE1hcDxSLCBNYXA8QywgVj4+IGJhY2tpbmdNYXAsCisgICAgICAgICAgICAgICAgICBTdXBwbGllcjw/IGV4dGVuZHMgTWFwPEMsIFY+PiBmYWN0b3J5KSB7CisgICAgICAgIHRoaXMuYmFja2luZ01hcCA9IGJhY2tpbmdNYXA7CisgICAgICAgIHRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoCisgICAgICAgICAgICBPYmplY3Qgcm93S2V5LCBPYmplY3QgY29sdW1uS2V5KSB7CisgICAgICAgIHJldHVybiByb3dLZXkgIT0gbnVsbCAmJiBjb2x1bW5LZXkgIT0gbnVsbCAmJiBzdXBlci5jb250YWlucyhyb3dLZXksIGNvbHVtbktleSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNDb2x1bW4oT2JqZWN0IGNvbHVtbktleSkgeworICAgICAgICBpZiAoY29sdW1uS2V5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKE1hcDxDLCBWPiBtYXAgOiBiYWNraW5nTWFwLnZhbHVlcygpKSB7CisgICAgICAgICAgICBpZiAoTWFwcy5zYWZlQ29udGFpbnNLZXkobWFwLCBjb2x1bW5LZXkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIE11dGF0b3JzCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1JvdyhPYmplY3Qgcm93S2V5KSB7CisgICAgICAgIHJldHVybiByb3dLZXkgIT0gbnVsbCAmJiBNYXBzLnNhZmVDb250YWluc0tleShiYWNraW5nTWFwLCByb3dLZXkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmFsdWUoT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIHN1cGVyLmNvbnRhaW5zVmFsdWUodmFsdWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBWIGdldChPYmplY3Qgcm93S2V5LCBPYmplY3QgY29sdW1uS2V5KSB7CisgICAgICAgIHJldHVybiAocm93S2V5ID09IG51bGwgfHwgY29sdW1uS2V5ID09IG51bGwpCisgICAgICAgICAgICAgICAgPyBudWxsCisgICAgICAgICAgICAgICAgOiBzdXBlci5nZXQocm93S2V5LCBjb2x1bW5LZXkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgaW50IHNpemUgPSAwOworICAgICAgICBmb3IgKE1hcDxDLCBWPiBtYXAgOiBiYWNraW5nTWFwLnZhbHVlcygpKSB7CisgICAgICAgICAgICBzaXplICs9IG1hcC5zaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIGJhY2tpbmdNYXAuY2xlYXIoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIE1hcDxDLCBWPiBnZXRPckNyZWF0ZShSIHJvd0tleSkgeworICAgICAgICBNYXA8QywgVj4gbWFwID0gYmFja2luZ01hcC5nZXQocm93S2V5KTsKKyAgICAgICAgaWYgKG1hcCA9PSBudWxsKSB7CisgICAgICAgICAgICBtYXAgPSBmYWN0b3J5LmdldCgpOworICAgICAgICAgICAgYmFja2luZ01hcC5wdXQocm93S2V5LCBtYXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtYXA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFYgcHV0KFIgcm93S2V5LCBDIGNvbHVtbktleSwgViB2YWx1ZSkgeworICAgICAgICBjaGVja05vdE51bGwocm93S2V5KTsKKyAgICAgICAgY2hlY2tOb3ROdWxsKGNvbHVtbktleSk7CisgICAgICAgIGNoZWNrTm90TnVsbCh2YWx1ZSk7CisgICAgICAgIHJldHVybiBnZXRPckNyZWF0ZShyb3dLZXkpLnB1dChjb2x1bW5LZXksIHZhbHVlKTsKKyAgICB9CisKKyAgICAvLyBWaWV3cworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFYgcmVtb3ZlKAorICAgICAgICAgICAgT2JqZWN0IHJvd0tleSwgT2JqZWN0IGNvbHVtbktleSkgeworICAgICAgICBpZiAoKHJvd0tleSA9PSBudWxsKSB8fCAoY29sdW1uS2V5ID09IG51bGwpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBNYXA8QywgVj4gbWFwID0gTWFwcy5zYWZlR2V0KGJhY2tpbmdNYXAsIHJvd0tleSk7CisgICAgICAgIGlmIChtYXAgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgViB2YWx1ZSA9IG1hcC5yZW1vdmUoY29sdW1uS2V5KTsKKyAgICAgICAgaWYgKG1hcC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGJhY2tpbmdNYXAucmVtb3ZlKHJvd0tleSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIHByaXZhdGUgTWFwPFIsIFY+IHJlbW92ZUNvbHVtbihPYmplY3QgY29sdW1uKSB7CisgICAgICAgIE1hcDxSLCBWPiBvdXRwdXQgPSBuZXcgTGlua2VkSGFzaE1hcDxSLCBWPigpOworICAgICAgICBJdGVyYXRvcjxFbnRyeTxSLCBNYXA8QywgVj4+PiBpdGVyYXRvcgorICAgICAgICAgICAgICAgID0gYmFja2luZ01hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIEVudHJ5PFIsIE1hcDxDLCBWPj4gZW50cnkgPSBpdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICBWIHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKS5yZW1vdmUoY29sdW1uKTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgb3V0cHV0LnB1dChlbnRyeS5nZXRLZXkoKSwgdmFsdWUpOworICAgICAgICAgICAgICAgIGlmIChlbnRyeS5nZXRWYWx1ZSgpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG91dHB1dDsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gY29udGFpbnNNYXBwaW5nKAorICAgICAgICAgICAgT2JqZWN0IHJvd0tleSwgT2JqZWN0IGNvbHVtbktleSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIHZhbHVlLmVxdWFscyhnZXQocm93S2V5LCBjb2x1bW5LZXkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgYSByb3cga2V5IC8gY29sdW1uIGtleSAvIHZhbHVlIG1hcHBpbmcsIGlmIHByZXNlbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHJlbW92ZU1hcHBpbmcoT2JqZWN0IHJvd0tleSwgT2JqZWN0IGNvbHVtbktleSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIGlmIChjb250YWluc01hcHBpbmcocm93S2V5LCBjb2x1bW5LZXksIHZhbHVlKSkgeworICAgICAgICAgICAgcmVtb3ZlKHJvd0tleSwgY29sdW1uS2V5KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICogPHA+CisgICAgICogPHA+VGhlIHNldCdzIGl0ZXJhdG9yIHRyYXZlcnNlcyB0aGUgbWFwcGluZ3MgZm9yIHRoZSBmaXJzdCByb3csIHRoZQorICAgICAqIG1hcHBpbmdzIGZvciB0aGUgc2Vjb25kIHJvdywgYW5kIHNvIG9uLgorICAgICAqIDxwPgorICAgICAqIDxwPkVhY2ggY2VsbCBpcyBhbiBpbW11dGFibGUgc25hcHNob3Qgb2YgYSByb3cga2V5IC8gY29sdW1uIGtleSAvIHZhbHVlCisgICAgICogbWFwcGluZywgdGFrZW4gYXQgdGhlIHRpbWUgdGhlIGNlbGwgaXMgcmV0dXJuZWQgYnkgYSBtZXRob2QgY2FsbCB0byB0aGUKKyAgICAgKiBzZXQgb3IgaXRzIGl0ZXJhdG9yLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q2VsbDxSLCBDLCBWPj4gY2VsbFNldCgpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmNlbGxTZXQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBJdGVyYXRvcjxDZWxsPFIsIEMsIFY+PiBjZWxsSXRlcmF0b3IoKSB7CisgICAgICAgIHJldHVybiBuZXcgQ2VsbEl0ZXJhdG9yKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1hcDxDLCBWPiByb3coUiByb3dLZXkpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSb3cocm93S2V5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICogPHA+CisgICAgICogPHA+VGhlIHJldHVybmVkIG1hcCdzIHZpZXdzIGhhdmUgaXRlcmF0b3JzIHRoYXQgZG9uJ3Qgc3VwcG9ydAorICAgICAqIHtAY29kZSByZW1vdmUoKX0uCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1hcDxSLCBWPiBjb2x1bW4oQyBjb2x1bW5LZXkpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW4oY29sdW1uS2V5KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PFI+IHJvd0tleVNldCgpIHsKKyAgICAgICAgcmV0dXJuIHJvd01hcCgpLmtleVNldCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5UaGUgcmV0dXJuZWQgc2V0IGhhcyBhbiBpdGVyYXRvciB0aGF0IGRvZXMgbm90IHN1cHBvcnQge0Bjb2RlIHJlbW92ZSgpfS4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5UaGUgc2V0J3MgaXRlcmF0b3IgdHJhdmVyc2VzIHRoZSBjb2x1bW5zIG9mIHRoZSBmaXJzdCByb3csIHRoZQorICAgICAqIGNvbHVtbnMgb2YgdGhlIHNlY29uZCByb3csIGV0Yy4sIHNraXBwaW5nIGFueSBjb2x1bW5zIHRoYXQgaGF2ZQorICAgICAqIGFwcGVhcmVkIHByZXZpb3VzbHkuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDPiBjb2x1bW5LZXlTZXQoKSB7CisgICAgICAgIFNldDxDPiByZXN1bHQgPSBjb2x1bW5LZXlTZXQ7CisgICAgICAgIHJldHVybiAocmVzdWx0ID09IG51bGwpID8gY29sdW1uS2V5U2V0ID0gbmV3IENvbHVtbktleVNldCgpIDogcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gaXRlcmF0b3IgdGhhdCByZXR1cm5zIGVhY2ggY29sdW1uIHZhbHVlIHdpdGggZHVwbGljYXRlcworICAgICAqIG9taXR0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBJdGVyYXRvcjxDPiBjcmVhdGVDb2x1bW5LZXlJdGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5LZXlJdGVyYXRvcigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNYXA8UiwgTWFwPEMsIFY+PiByb3dNYXAoKSB7CisgICAgICAgIE1hcDxSLCBNYXA8QywgVj4+IHJlc3VsdCA9IHJvd01hcDsKKyAgICAgICAgcmV0dXJuIChyZXN1bHQgPT0gbnVsbCkgPyByb3dNYXAgPSBjcmVhdGVSb3dNYXAoKSA6IHJlc3VsdDsKKyAgICB9CisKKyAgICBwcml2YXRlIE1hcDxSLCBNYXA8QywgVj4+IGNyZWF0ZVJvd01hcCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSb3dNYXAoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWFwPEMsIE1hcDxSLCBWPj4gY29sdW1uTWFwKCkgeworICAgICAgICBDb2x1bW5NYXAgcmVzdWx0ID0gY29sdW1uTWFwOworICAgICAgICByZXR1cm4gKHJlc3VsdCA9PSBudWxsKSA/IGNvbHVtbk1hcCA9IG5ldyBDb2x1bW5NYXAoKSA6IHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBYnN0cmFjdCBzZXQgd2hvc2Uge0Bjb2RlIGlzRW1wdHkoKX0gcmV0dXJucyB3aGV0aGVyIHRoZSB0YWJsZSBpcyBlbXB0eSBhbmQKKyAgICAgKiB3aG9zZSB7QGNvZGUgY2xlYXIoKX0gY2xlYXJzIGFsbCB0YWJsZSBtYXBwaW5ncy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGFic3RyYWN0IGNsYXNzIFRhYmxlU2V0PFQ+IGV4dGVuZHMgU2V0cy5JbXByb3ZlZEFic3RyYWN0U2V0PFQ+IHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgICAgICAgICByZXR1cm4gYmFja2luZ01hcC5pc0VtcHR5KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgICAgICBiYWNraW5nTWFwLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIENlbGxJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yPENlbGw8UiwgQywgVj4+IHsKKyAgICAgICAgZmluYWwgSXRlcmF0b3I8RW50cnk8UiwgTWFwPEMsIFY+Pj4gcm93SXRlcmF0b3IKKyAgICAgICAgICAgICAgICA9IGJhY2tpbmdNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICBFbnRyeTxSLCBNYXA8QywgVj4+IHJvd0VudHJ5OworICAgICAgICBJdGVyYXRvcjxFbnRyeTxDLCBWPj4gY29sdW1uSXRlcmF0b3IKKyAgICAgICAgICAgICAgICA9IEl0ZXJhdG9ycy5lbXB0eU1vZGlmaWFibGVJdGVyYXRvcigpOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIHJvd0l0ZXJhdG9yLmhhc05leHQoKSB8fCBjb2x1bW5JdGVyYXRvci5oYXNOZXh0KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENlbGw8UiwgQywgVj4gbmV4dCgpIHsKKyAgICAgICAgICAgIGlmICghY29sdW1uSXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgcm93RW50cnkgPSByb3dJdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICAgICAgY29sdW1uSXRlcmF0b3IgPSByb3dFbnRyeS5nZXRWYWx1ZSgpLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEVudHJ5PEMsIFY+IGNvbHVtbkVudHJ5ID0gY29sdW1uSXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgcmV0dXJuIFRhYmxlcy5pbW11dGFibGVDZWxsKAorICAgICAgICAgICAgICAgICAgICByb3dFbnRyeS5nZXRLZXkoKSwgY29sdW1uRW50cnkuZ2V0S2V5KCksIGNvbHVtbkVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKyAgICAgICAgICAgIGNvbHVtbkl0ZXJhdG9yLnJlbW92ZSgpOworICAgICAgICAgICAgaWYgKHJvd0VudHJ5LmdldFZhbHVlKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgcm93SXRlcmF0b3IucmVtb3ZlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBSb3cgZXh0ZW5kcyBNYXBzLkltcHJvdmVkQWJzdHJhY3RNYXA8QywgVj4geworICAgICAgICBmaW5hbCBSIHJvd0tleTsKKyAgICAgICAgTWFwPEMsIFY+IGJhY2tpbmdSb3dNYXA7CisKKyAgICAgICAgUm93KFIgcm93S2V5KSB7CisgICAgICAgICAgICB0aGlzLnJvd0tleSA9IGNoZWNrTm90TnVsbChyb3dLZXkpOworICAgICAgICB9CisKKyAgICAgICAgTWFwPEMsIFY+IGJhY2tpbmdSb3dNYXAoKSB7CisgICAgICAgICAgICByZXR1cm4gKGJhY2tpbmdSb3dNYXAgPT0gbnVsbAorICAgICAgICAgICAgICAgICAgICB8fCAoYmFja2luZ1Jvd01hcC5pc0VtcHR5KCkgJiYgYmFja2luZ01hcC5jb250YWluc0tleShyb3dLZXkpKSkKKyAgICAgICAgICAgICAgICAgICAgPyBiYWNraW5nUm93TWFwID0gY29tcHV0ZUJhY2tpbmdSb3dNYXAoKQorICAgICAgICAgICAgICAgICAgICA6IGJhY2tpbmdSb3dNYXA7CisgICAgICAgIH0KKworICAgICAgICBNYXA8QywgVj4gY29tcHV0ZUJhY2tpbmdSb3dNYXAoKSB7CisgICAgICAgICAgICByZXR1cm4gYmFja2luZ01hcC5nZXQocm93S2V5KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENhbGwgdGhpcyBldmVyeSB0aW1lIHdlIHBlcmZvcm0gYSByZW1vdmFsLgorICAgICAgICB2b2lkIG1haW50YWluRW1wdHlJbnZhcmlhbnQoKSB7CisgICAgICAgICAgICBpZiAoYmFja2luZ1Jvd01hcCgpICE9IG51bGwgJiYgYmFja2luZ1Jvd01hcC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBiYWNraW5nTWFwLnJlbW92ZShyb3dLZXkpOworICAgICAgICAgICAgICAgIGJhY2tpbmdSb3dNYXAgPSBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KE9iamVjdCBrZXkpIHsKKyAgICAgICAgICAgIE1hcDxDLCBWPiBiYWNraW5nUm93TWFwID0gYmFja2luZ1Jvd01hcCgpOworICAgICAgICAgICAgcmV0dXJuIChrZXkgIT0gbnVsbCAmJiBiYWNraW5nUm93TWFwICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICYmIE1hcHMuc2FmZUNvbnRhaW5zS2V5KGJhY2tpbmdSb3dNYXAsIGtleSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFYgZ2V0KE9iamVjdCBrZXkpIHsKKyAgICAgICAgICAgIE1hcDxDLCBWPiBiYWNraW5nUm93TWFwID0gYmFja2luZ1Jvd01hcCgpOworICAgICAgICAgICAgcmV0dXJuIChrZXkgIT0gbnVsbCAmJiBiYWNraW5nUm93TWFwICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgID8gTWFwcy5zYWZlR2V0KGJhY2tpbmdSb3dNYXAsIGtleSkKKyAgICAgICAgICAgICAgICAgICAgOiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWIHB1dChDIGtleSwgViB2YWx1ZSkgeworICAgICAgICAgICAgY2hlY2tOb3ROdWxsKGtleSk7CisgICAgICAgICAgICBjaGVja05vdE51bGwodmFsdWUpOworICAgICAgICAgICAgaWYgKGJhY2tpbmdSb3dNYXAgIT0gbnVsbCAmJiAhYmFja2luZ1Jvd01hcC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYmFja2luZ1Jvd01hcC5wdXQoa2V5LCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gU3RhbmRhcmRUYWJsZS50aGlzLnB1dChyb3dLZXksIGtleSwgdmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWIHJlbW92ZShPYmplY3Qga2V5KSB7CisgICAgICAgICAgICBNYXA8QywgVj4gYmFja2luZ1Jvd01hcCA9IGJhY2tpbmdSb3dNYXAoKTsKKyAgICAgICAgICAgIGlmIChiYWNraW5nUm93TWFwID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFYgcmVzdWx0ID0gTWFwcy5zYWZlUmVtb3ZlKGJhY2tpbmdSb3dNYXAsIGtleSk7CisgICAgICAgICAgICBtYWludGFpbkVtcHR5SW52YXJpYW50KCk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgeworICAgICAgICAgICAgTWFwPEMsIFY+IGJhY2tpbmdSb3dNYXAgPSBiYWNraW5nUm93TWFwKCk7CisgICAgICAgICAgICBpZiAoYmFja2luZ1Jvd01hcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYmFja2luZ1Jvd01hcC5jbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWFpbnRhaW5FbXB0eUludmFyaWFudCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBTZXQ8RW50cnk8QywgVj4+IGNyZWF0ZUVudHJ5U2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSb3dFbnRyeVNldCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBSb3dFbnRyeVNldCBleHRlbmRzIE1hcHMuRW50cnlTZXQ8QywgVj4geworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBNYXA8QywgVj4gbWFwKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBSb3cudGhpczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgICAgICAgICAgTWFwPEMsIFY+IG1hcCA9IGJhY2tpbmdSb3dNYXAoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKG1hcCA9PSBudWxsKSA/IDAgOiBtYXAuc2l6ZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBJdGVyYXRvcjxFbnRyeTxDLCBWPj4gaXRlcmF0b3IoKSB7CisgICAgICAgICAgICAgICAgZmluYWwgTWFwPEMsIFY+IG1hcCA9IGJhY2tpbmdSb3dNYXAoKTsKKyAgICAgICAgICAgICAgICBpZiAobWFwID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEl0ZXJhdG9ycy5lbXB0eU1vZGlmaWFibGVJdGVyYXRvcigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5hbCBJdGVyYXRvcjxFbnRyeTxDLCBWPj4gaXRlcmF0b3IgPSBtYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSXRlcmF0b3I8RW50cnk8QywgVj4+KCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVyYXRvci5oYXNOZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIEVudHJ5PEMsIFY+IG5leHQoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBFbnRyeTxDLCBWPiBlbnRyeSA9IGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRm9yd2FyZGluZ01hcEVudHJ5PEMsIFY+KCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCBFbnRyeTxDLCBWPiBkZWxlZ2F0ZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBWIHNldFZhbHVlKFYgdmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnNldFZhbHVlKGNoZWNrTm90TnVsbCh2YWx1ZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8odXNlcik6IGlkZW50aWZ5IHdoeSB0aGlzIGFmZmVjdHMgR1dUIHRlc3RzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGFuZGFyZEVxdWFscyhvYmplY3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IucmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtYWludGFpbkVtcHR5SW52YXJpYW50KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBDb2x1bW4gZXh0ZW5kcyBNYXBzLkltcHJvdmVkQWJzdHJhY3RNYXA8UiwgVj4geworICAgICAgICBmaW5hbCBDIGNvbHVtbktleTsKKworICAgICAgICBDb2x1bW4oQyBjb2x1bW5LZXkpIHsKKyAgICAgICAgICAgIHRoaXMuY29sdW1uS2V5ID0gY2hlY2tOb3ROdWxsKGNvbHVtbktleSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFYgcHV0KFIga2V5LCBWIHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gU3RhbmRhcmRUYWJsZS50aGlzLnB1dChrZXksIGNvbHVtbktleSwgdmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWIGdldChPYmplY3Qga2V5KSB7CisgICAgICAgICAgICByZXR1cm4gU3RhbmRhcmRUYWJsZS50aGlzLmdldChrZXksIGNvbHVtbktleSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoT2JqZWN0IGtleSkgeworICAgICAgICAgICAgcmV0dXJuIFN0YW5kYXJkVGFibGUudGhpcy5jb250YWlucyhrZXksIGNvbHVtbktleSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFYgcmVtb3ZlKE9iamVjdCBrZXkpIHsKKyAgICAgICAgICAgIHJldHVybiBTdGFuZGFyZFRhYmxlLnRoaXMucmVtb3ZlKGtleSwgY29sdW1uS2V5KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZW1vdmVzIGFsbCB7QGNvZGUgQ29sdW1ufSBtYXBwaW5ncyB3aG9zZSByb3cga2V5IGFuZCB2YWx1ZSBzYXRpc2Z5IHRoZQorICAgICAgICAgKiBnaXZlbiBwcmVkaWNhdGUuCisgICAgICAgICAqLworICAgICAgICBib29sZWFuIHJlbW92ZUZyb21Db2x1bW5JZihQcmVkaWNhdGU8PyBzdXBlciBFbnRyeTxSLCBWPj4gcHJlZGljYXRlKSB7CisgICAgICAgICAgICBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIEl0ZXJhdG9yPEVudHJ5PFIsIE1hcDxDLCBWPj4+IGl0ZXJhdG9yCisgICAgICAgICAgICAgICAgICAgID0gYmFja2luZ01hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgRW50cnk8UiwgTWFwPEMsIFY+PiBlbnRyeSA9IGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgICAgICBNYXA8QywgVj4gbWFwID0gZW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICBWIHZhbHVlID0gbWFwLmdldChjb2x1bW5LZXkpOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBwcmVkaWNhdGUudGVzdChNYXBzLmltbXV0YWJsZUVudHJ5KGVudHJ5LmdldEtleSgpLCB2YWx1ZSkpKSB7CisgICAgICAgICAgICAgICAgICAgIG1hcC5yZW1vdmUoY29sdW1uS2V5KTsKKyAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGlmIChtYXAuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjaGFuZ2VkOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIFNldDxFbnRyeTxSLCBWPj4gY3JlYXRlRW50cnlTZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEVudHJ5U2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgU2V0PFI+IGNyZWF0ZUtleVNldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgS2V5U2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgQ29sbGVjdGlvbjxWPiBjcmVhdGVWYWx1ZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlcygpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBFbnRyeVNldCBleHRlbmRzIFNldHMuSW1wcm92ZWRBYnN0cmFjdFNldDxFbnRyeTxSLCBWPj4geworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgSXRlcmF0b3I8RW50cnk8UiwgVj4+IGl0ZXJhdG9yKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRW50cnlTZXRJdGVyYXRvcigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChNYXA8QywgVj4gbWFwIDogYmFja2luZ01hcC52YWx1ZXMoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobWFwLmNvbnRhaW5zS2V5KGNvbHVtbktleSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgeworICAgICAgICAgICAgICAgIHJldHVybiAhY29udGFpbnNDb2x1bW4oY29sdW1uS2V5KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgICAgICAgICByZW1vdmVGcm9tQ29sdW1uSWYoYWx3YXlzVHJ1ZSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgeworICAgICAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgRW50cnkpIHsKKyAgICAgICAgICAgICAgICAgICAgRW50cnk8PywgPz4gZW50cnkgPSAoRW50cnk8PywgPz4pIG87CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluc01hcHBpbmcoZW50cnkuZ2V0S2V5KCksIGNvbHVtbktleSwgZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBFbnRyeSkgeworICAgICAgICAgICAgICAgICAgICBFbnRyeTw/LCA/PiBlbnRyeSA9IChFbnRyeTw/LCA/Pikgb2JqOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVtb3ZlTWFwcGluZyhlbnRyeS5nZXRLZXkoKSwgY29sdW1uS2V5LCBlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uPD8+IGMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVtb3ZlRnJvbUNvbHVtbklmKG5vdChpbihjKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBFbnRyeVNldEl0ZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RJdGVyYXRvcjxFbnRyeTxSLCBWPj4geworICAgICAgICAgICAgZmluYWwgSXRlcmF0b3I8RW50cnk8UiwgTWFwPEMsIFY+Pj4gaXRlcmF0b3IKKyAgICAgICAgICAgICAgICAgICAgPSBiYWNraW5nTWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgRW50cnk8UiwgVj4gY29tcHV0ZU5leHQoKSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBFbnRyeTxSLCBNYXA8QywgVj4+IGVudHJ5ID0gaXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkuZ2V0VmFsdWUoKS5jb250YWluc0tleShjb2x1bW5LZXkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFic3RyYWN0TWFwRW50cnk8UiwgVj4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFIgZ2V0S2V5KCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFYgZ2V0VmFsdWUoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeS5nZXRWYWx1ZSgpLmdldChjb2x1bW5LZXkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBWIHNldFZhbHVlKFYgdmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5LmdldFZhbHVlKCkucHV0KGNvbHVtbktleSwgY2hlY2tOb3ROdWxsKHZhbHVlKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZW5kT2ZEYXRhKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGNsYXNzIEtleVNldCBleHRlbmRzIE1hcHMuS2V5U2V0PFIsIFY+IHsKKyAgICAgICAgICAgIEtleVNldCgpIHsKKyAgICAgICAgICAgICAgICBzdXBlcihTdGFuZGFyZFRhYmxlLkNvbHVtbi50aGlzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3Qgb2JqKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFN0YW5kYXJkVGFibGUudGhpcy5jb250YWlucyhvYmosIGNvbHVtbktleSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvYmopIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gU3RhbmRhcmRUYWJsZS50aGlzLnJlbW92ZShvYmosIGNvbHVtbktleSkgIT0gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiByZXRhaW5BbGwoZmluYWwgQ29sbGVjdGlvbjw/PiBjKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlbW92ZUZyb21Db2x1bW5JZihNYXBzLmtleVByZWRpY2F0ZU9uRW50cmllcyhub3QoaW4oYykpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGNsYXNzIFZhbHVlcyBleHRlbmRzIE1hcHMuVmFsdWVzPFIsIFY+IHsKKyAgICAgICAgICAgIFZhbHVlcygpIHsKKyAgICAgICAgICAgICAgICBzdXBlcihTdGFuZGFyZFRhYmxlLkNvbHVtbi50aGlzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgICAgIHJldHVybiBvYmogIT0gbnVsbCAmJiByZW1vdmVGcm9tQ29sdW1uSWYoTWFwcy52YWx1ZVByZWRpY2F0ZU9uRW50cmllcyhlcXVhbFRvKG9iaikpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoZmluYWwgQ29sbGVjdGlvbjw/PiBjKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlbW92ZUZyb21Db2x1bW5JZihNYXBzLnZhbHVlUHJlZGljYXRlT25FbnRyaWVzKGluKGMpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcmV0YWluQWxsKGZpbmFsIENvbGxlY3Rpb248Pz4gYykgeworICAgICAgICAgICAgICAgIHJldHVybiByZW1vdmVGcm9tQ29sdW1uSWYoTWFwcy52YWx1ZVByZWRpY2F0ZU9uRW50cmllcyhub3QoaW4oYykpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIENvbHVtbktleVNldCBleHRlbmRzIFRhYmxlU2V0PEM+IHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBJdGVyYXRvcjxDPiBpdGVyYXRvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBjcmVhdGVDb2x1bW5LZXlJdGVyYXRvcigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBJdGVyYXRvcnMuc2l6ZShpdGVyYXRvcigpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7CisgICAgICAgICAgICBJdGVyYXRvcjxNYXA8QywgVj4+IGl0ZXJhdG9yID0gYmFja2luZ01hcC52YWx1ZXMoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIE1hcDxDLCBWPiBtYXAgPSBpdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKG1hcC5rZXlTZXQoKS5yZW1vdmUob2JqKSkgeworICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1hcC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnJlbW92ZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGNoYW5nZWQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gYykgeworICAgICAgICAgICAgY2hlY2tOb3ROdWxsKGMpOworICAgICAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7CisgICAgICAgICAgICBJdGVyYXRvcjxNYXA8QywgVj4+IGl0ZXJhdG9yID0gYmFja2luZ01hcC52YWx1ZXMoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIE1hcDxDLCBWPiBtYXAgPSBpdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICAgICAgLy8gbWFwLmtleVNldCgpLnJlbW92ZUFsbChjKSBjYW4gdGhyb3cgYSBOUEUgd2hlbiBtYXAgaXMgYSBUcmVlTWFwIHdpdGgKKyAgICAgICAgICAgICAgICAvLyBuYXR1cmFsIG9yZGVyaW5nIGFuZCBjIGNvbnRhaW5zIGEgbnVsbC4KKyAgICAgICAgICAgICAgICBpZiAoSXRlcmF0b3JzLnJlbW92ZUFsbChtYXAua2V5U2V0KCkuaXRlcmF0b3IoKSwgYykpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGlmIChtYXAuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpdGVyYXRvci5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjaGFuZ2VkOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uPD8+IGMpIHsKKyAgICAgICAgICAgIGNoZWNrTm90TnVsbChjKTsKKyAgICAgICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOworICAgICAgICAgICAgSXRlcmF0b3I8TWFwPEMsIFY+PiBpdGVyYXRvciA9IGJhY2tpbmdNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBNYXA8QywgVj4gbWFwID0gaXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgICAgIGlmIChtYXAua2V5U2V0KCkucmV0YWluQWxsKGMpKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBpZiAobWFwLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IucmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY2hhbmdlZDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3Qgb2JqKSB7CisgICAgICAgICAgICByZXR1cm4gY29udGFpbnNDb2x1bW4ob2JqKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgQ29sdW1uS2V5SXRlcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdEl0ZXJhdG9yPEM+IHsKKyAgICAgICAgLy8gVXNlIHRoZSBzYW1lIG1hcCB0eXBlIHRvIHN1cHBvcnQgVHJlZU1hcHMgd2l0aCBjb21wYXJhdG9ycyB0aGF0IGFyZW4ndAorICAgICAgICAvLyBjb25zaXN0ZW50IHdpdGggZXF1YWxzKCkuCisgICAgICAgIGZpbmFsIE1hcDxDLCBWPiBzZWVuID0gZmFjdG9yeS5nZXQoKTsKKyAgICAgICAgZmluYWwgSXRlcmF0b3I8TWFwPEMsIFY+PiBtYXBJdGVyYXRvciA9IGJhY2tpbmdNYXAudmFsdWVzKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgSXRlcmF0b3I8RW50cnk8QywgVj4+IGVudHJ5SXRlcmF0b3IgPSBJdGVyYXRvcnMuZW1wdHlJdGVyYXRvcigpOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQyBjb21wdXRlTmV4dCgpIHsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgaWYgKGVudHJ5SXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIEVudHJ5PEMsIFY+IGVudHJ5ID0gZW50cnlJdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghc2Vlbi5jb250YWluc0tleShlbnRyeS5nZXRLZXkoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlZW4ucHV0KGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbnRyeS5nZXRLZXkoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobWFwSXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGVudHJ5SXRlcmF0b3IgPSBtYXBJdGVyYXRvci5uZXh0KCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbmRPZkRhdGEoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGFzcyBSb3dNYXAgZXh0ZW5kcyBNYXBzLkltcHJvdmVkQWJzdHJhY3RNYXA8UiwgTWFwPEMsIFY+PiB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShPYmplY3Qga2V5KSB7CisgICAgICAgICAgICByZXR1cm4gY29udGFpbnNSb3coa2V5KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHBlcmZvcm1pbmcgY2FzdCBvbmx5IHdoZW4ga2V5IGlzIGluIGJhY2tpbmcgbWFwIGFuZCBoYXMgdGhlIGNvcnJlY3QgdHlwZQorICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBNYXA8QywgVj4gZ2V0KE9iamVjdCBrZXkpIHsKKyAgICAgICAgICAgIHJldHVybiBjb250YWluc1JvdyhrZXkpID8gcm93KChSKSBrZXkpIDogbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTWFwPEMsIFY+IHJlbW92ZShPYmplY3Qga2V5KSB7CisgICAgICAgICAgICByZXR1cm4gKGtleSA9PSBudWxsKSA/IG51bGwgOiBiYWNraW5nTWFwLnJlbW92ZShrZXkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBTZXQ8RW50cnk8UiwgTWFwPEMsIFY+Pj4gY3JlYXRlRW50cnlTZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEVudHJ5U2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBjbGFzcyBFbnRyeVNldCBleHRlbmRzIFRhYmxlU2V0PEVudHJ5PFIsIE1hcDxDLCBWPj4+IHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEl0ZXJhdG9yPEVudHJ5PFIsIE1hcDxDLCBWPj4+IGl0ZXJhdG9yKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBNYXBzLmFzTWFwRW50cnlJdGVyYXRvcihiYWNraW5nTWFwLmtleVNldCgpLCBuZXcgRnVuY3Rpb248UiwgTWFwPEMsIFY+PigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBNYXA8QywgVj4gYXBwbHkoUiByb3dLZXkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByb3cocm93S2V5KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYmFja2luZ01hcC5zaXplKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBFbnRyeSkgeworICAgICAgICAgICAgICAgICAgICBFbnRyeTw/LCA/PiBlbnRyeSA9IChFbnRyeTw/LCA/Pikgb2JqOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnkuZ2V0S2V5KCkgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBNYXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBDb2xsZWN0aW9uczIuc2FmZUNvbnRhaW5zKGJhY2tpbmdNYXAuZW50cnlTZXQoKSwgZW50cnkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvYmopIHsKKyAgICAgICAgICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgRW50cnkpIHsKKyAgICAgICAgICAgICAgICAgICAgRW50cnk8PywgPz4gZW50cnkgPSAoRW50cnk8PywgPz4pIG9iajsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5LmdldEtleSgpICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBlbnRyeS5nZXRWYWx1ZSgpIGluc3RhbmNlb2YgTWFwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgYmFja2luZ01hcC5lbnRyeVNldCgpLnJlbW92ZShlbnRyeSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgQ29sdW1uTWFwIGV4dGVuZHMgTWFwcy5JbXByb3ZlZEFic3RyYWN0TWFwPEMsIE1hcDxSLCBWPj4geworICAgICAgICAvLyBUaGUgY2FzdCB0byBDIG9jY3VycyBvbmx5IHdoZW4gdGhlIGtleSBpcyBpbiB0aGUgbWFwLCBpbXBseWluZyB0aGF0IGl0CisgICAgICAgIC8vIGhhcyB0aGUgY29ycmVjdCB0eXBlLgorICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBNYXA8UiwgVj4gZ2V0KE9iamVjdCBrZXkpIHsKKyAgICAgICAgICAgIHJldHVybiBjb250YWluc0NvbHVtbihrZXkpID8gY29sdW1uKChDKSBrZXkpIDogbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShPYmplY3Qga2V5KSB7CisgICAgICAgICAgICByZXR1cm4gY29udGFpbnNDb2x1bW4oa2V5KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTWFwPFIsIFY+IHJlbW92ZShPYmplY3Qga2V5KSB7CisgICAgICAgICAgICByZXR1cm4gY29udGFpbnNDb2x1bW4oa2V5KSA/IHJlbW92ZUNvbHVtbihrZXkpIDogbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU2V0PEVudHJ5PEMsIE1hcDxSLCBWPj4+IGNyZWF0ZUVudHJ5U2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2x1bW5NYXBFbnRyeVNldCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTZXQ8Qz4ga2V5U2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIGNvbHVtbktleVNldCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIENvbGxlY3Rpb248TWFwPFIsIFY+PiBjcmVhdGVWYWx1ZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENvbHVtbk1hcFZhbHVlcygpOworICAgICAgICB9CisKKyAgICAgICAgY2xhc3MgQ29sdW1uTWFwRW50cnlTZXQgZXh0ZW5kcyBUYWJsZVNldDxFbnRyeTxDLCBNYXA8UiwgVj4+PiB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBJdGVyYXRvcjxFbnRyeTxDLCBNYXA8UiwgVj4+PiBpdGVyYXRvcigpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTWFwcy5hc01hcEVudHJ5SXRlcmF0b3IoY29sdW1uS2V5U2V0KCksIG5ldyBGdW5jdGlvbjxDLCBNYXA8UiwgVj4+KCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIE1hcDxSLCBWPiBhcHBseShDIGNvbHVtbktleSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbihjb2x1bW5LZXkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBjb2x1bW5LZXlTZXQoKS5zaXplKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBFbnRyeSkgeworICAgICAgICAgICAgICAgICAgICBFbnRyeTw/LCA/PiBlbnRyeSA9IChFbnRyeTw/LCA/Pikgb2JqOworICAgICAgICAgICAgICAgICAgICBpZiAoY29udGFpbnNDb2x1bW4oZW50cnkuZ2V0S2V5KCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY2FzdCB0byBDIG9jY3VycyBvbmx5IHdoZW4gdGhlIGtleSBpcyBpbiB0aGUgbWFwLCBpbXBseWluZworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBpdCBoYXMgdGhlIGNvcnJlY3QgdHlwZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICAgICAgICAgICAgICAgICAgQyBjb2x1bW5LZXkgPSAoQykgZW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0KGNvbHVtbktleSkuZXF1YWxzKGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgICAgIGlmIChjb250YWlucyhvYmopKSB7CisgICAgICAgICAgICAgICAgICAgIEVudHJ5PD8sID8+IGVudHJ5ID0gKEVudHJ5PD8sID8+KSBvYmo7CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZUNvbHVtbihlbnRyeS5nZXRLZXkoKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gYykgeworICAgICAgICAvKgorICAgICAgICAgKiBXZSBjYW4ndCBpbmhlcml0IHRoZSBub3JtYWwgaW1wbGVtZW50YXRpb24gKHdoaWNoIGNhbGxzCisgICAgICAgICAqIFNldHMucmVtb3ZlQWxsSW1wbChTZXQsICpDb2xsZWN0aW9uKikgYmVjYXVzZSwgdW5kZXIgc29tZQorICAgICAgICAgKiBjaXJjdW1zdGFuY2VzLCBpdCBhdHRlbXB0cyB0byBjYWxsIGNvbHVtbktleVNldCgpLml0ZXJhdG9yKCkucmVtb3ZlLAorICAgICAgICAgKiB3aGljaCBpcyB1bnN1cHBvcnRlZC4KKyAgICAgICAgICovCisgICAgICAgICAgICAgICAgY2hlY2tOb3ROdWxsKGMpOworICAgICAgICAgICAgICAgIHJldHVybiBTZXRzLnJlbW92ZUFsbEltcGwodGhpcywgYy5pdGVyYXRvcigpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbjw/PiBjKSB7CisgICAgICAgICAgICAgICAgY2hlY2tOb3ROdWxsKGMpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGZvciAoQyBjb2x1bW5LZXkgOiBMaXN0cy5uZXdBcnJheUxpc3QoY29sdW1uS2V5U2V0KCkuaXRlcmF0b3IoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFjLmNvbnRhaW5zKE1hcHMuaW1tdXRhYmxlRW50cnkoY29sdW1uS2V5LCBjb2x1bW4oY29sdW1uS2V5KSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVDb2x1bW4oY29sdW1uS2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBjaGFuZ2VkOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBDb2x1bW5NYXBWYWx1ZXMgZXh0ZW5kcyBNYXBzLlZhbHVlczxDLCBNYXA8UiwgVj4+IHsKKyAgICAgICAgICAgIENvbHVtbk1hcFZhbHVlcygpIHsKKyAgICAgICAgICAgICAgICBzdXBlcihTdGFuZGFyZFRhYmxlLkNvbHVtbk1hcC50aGlzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgICAgIGZvciAoRW50cnk8QywgTWFwPFIsIFY+PiBlbnRyeSA6IFN0YW5kYXJkVGFibGUuQ29sdW1uTWFwLnRoaXMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkuZ2V0VmFsdWUoKS5lcXVhbHMob2JqKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlQ29sdW1uKGVudHJ5LmdldEtleSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmVBbGwoQ29sbGVjdGlvbjw/PiBjKSB7CisgICAgICAgICAgICAgICAgY2hlY2tOb3ROdWxsKGMpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGZvciAoQyBjb2x1bW5LZXkgOiBMaXN0cy5uZXdBcnJheUxpc3QoY29sdW1uS2V5U2V0KCkuaXRlcmF0b3IoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGMuY29udGFpbnMoY29sdW1uKGNvbHVtbktleSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVDb2x1bW4oY29sdW1uS2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBjaGFuZ2VkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uPD8+IGMpIHsKKyAgICAgICAgICAgICAgICBjaGVja05vdE51bGwoYyk7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZm9yIChDIGNvbHVtbktleSA6IExpc3RzLm5ld0FycmF5TGlzdChjb2x1bW5LZXlTZXQoKS5pdGVyYXRvcigpKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWMuY29udGFpbnMoY29sdW1uKGNvbHVtbktleSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVDb2x1bW4oY29sdW1uS2V5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBjaGFuZ2VkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9TdG9wd2F0Y2guamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvU3RvcHdhdGNoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIzYjNkYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvU3RvcHdhdGNoLmphdmEKQEAgLTAsMCArMSwxODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEd1YXZhIEF1dGhvcnMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmEuUHJlY29uZGl0aW9ucy5jaGVja1N0YXRlOworCitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0LkRBWVM7CitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0LkhPVVJTOworaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdC5NSUNST1NFQ09ORFM7CitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0Lk1JTExJU0VDT05EUzsKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuTUlOVVRFUzsKK2ltcG9ydCBzdGF0aWMgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQuTkFOT1NFQ09ORFM7CitpbXBvcnQgc3RhdGljIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0LlNFQ09ORFM7CisKKy8qKgorICogQW4gb2JqZWN0IHRoYXQgbWVhc3VyZXMgZWxhcHNlZCB0aW1lIGluIG5hbm9zZWNvbmRzLiBJdCBpcyB1c2VmdWwgdG8gbWVhc3VyZQorICogZWxhcHNlZCB0aW1lIHVzaW5nIHRoaXMgY2xhc3MgaW5zdGVhZCBvZiBkaXJlY3QgY2FsbHMgdG8ge0BsaW5rCisgKiBTeXN0ZW0jbmFub1RpbWV9IGZvciBhIGZldyByZWFzb25zOgorICogPHA+CisgKiA8dWw+CisgKiA8bGk+QW4gYWx0ZXJuYXRlIHRpbWUgc291cmNlIGNhbiBiZSBzdWJzdGl0dXRlZCwgZm9yIHRlc3Rpbmcgb3IgcGVyZm9ybWFuY2UKKyAqIHJlYXNvbnMuCisgKiA8bGk+QXMgZG9jdW1lbnRlZCBieSB7QGNvZGUgbmFub1RpbWV9LCB0aGUgdmFsdWUgcmV0dXJuZWQgaGFzIG5vIGFic29sdXRlCisgKiBtZWFuaW5nLCBhbmQgY2FuIG9ubHkgYmUgaW50ZXJwcmV0ZWQgYXMgcmVsYXRpdmUgdG8gYW5vdGhlciB0aW1lc3RhbXAKKyAqIHJldHVybmVkIGJ5IHtAY29kZSBuYW5vVGltZX0gYXQgYSBkaWZmZXJlbnQgdGltZS4ge0Bjb2RlIFN0b3B3YXRjaH0gaXMgYQorICogbW9yZSBlZmZlY3RpdmUgYWJzdHJhY3Rpb24gYmVjYXVzZSBpdCBleHBvc2VzIG9ubHkgdGhlc2UgcmVsYXRpdmUgdmFsdWVzLAorICogbm90IHRoZSBhYnNvbHV0ZSBvbmVzLgorICogPC91bD4KKyAqIDxwPgorICogPHA+QmFzaWMgdXNhZ2U6CisgKiA8cHJlPgorICogICBTdG9wd2F0Y2ggc3RvcHdhdGNoID0gU3RvcHdhdGNoLntAbGluayAjY3JlYXRlU3RhcnRlZCBjcmVhdGVTdGFydGVkfSgpOworICogICBkb1NvbWV0aGluZygpOworICogICBzdG9wd2F0Y2gue0BsaW5rICNzdG9wIHN0b3B9KCk7IC8vIG9wdGlvbmFsCisgKgorICogICBsb25nIG1pbGxpcyA9IHN0b3B3YXRjaC5lbGFwc2VkKE1JTExJU0VDT05EUyk7CisgKgorICogICBsb2cuaW5mbygidGltZTogIiArIHN0b3B3YXRjaCk7IC8vIGZvcm1hdHRlZCBzdHJpbmcgbGlrZSAiMTIuMyBtcyI8L3ByZT4KKyAqIDxwPgorICogPHA+U3RvcHdhdGNoIG1ldGhvZHMgYXJlIG5vdCBpZGVtcG90ZW50OyBpdCBpcyBhbiBlcnJvciB0byBzdGFydCBvciBzdG9wIGEKKyAqIHN0b3B3YXRjaCB0aGF0IGlzIGFscmVhZHkgaW4gdGhlIGRlc2lyZWQgc3RhdGUuCisgKiA8cD4KKyAqIDxwPldoZW4gdGVzdGluZyBjb2RlIHRoYXQgdXNlcyB0aGlzIGNsYXNzLCB1c2UKKyAqIHtAbGluayAjY3JlYXRlVW5zdGFydGVkKFRpY2tlcil9IG9yIHtAbGluayAjY3JlYXRlU3RhcnRlZChUaWNrZXIpfSB0bworICogc3VwcGx5IGEgZmFrZSBvciBtb2NrIHRpY2tlci4KKyAqIDwhLS0gVE9ETyhrZXZpbmIpOiByZXN0b3JlIHRoZSAic3VjaCBhcyIgLS0+IFRoaXMgYWxsb3dzIHlvdSB0bworICogc2ltdWxhdGUgYW55IHZhbGlkIGJlaGF2aW9yIG9mIHRoZSBzdG9wd2F0Y2guCisgKiA8cD4KKyAqIDxwPjxiPk5vdGU6PC9iPiBUaGlzIGNsYXNzIGlzIG5vdCB0aHJlYWQtc2FmZS4KKyAqCisgKiBAYXV0aG9yIEtldmluIEJvdXJyaWxsaW9uCisgKiBAc2luY2UgMTAuMAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgU3RvcHdhdGNoIHsKKyAgICBwcml2YXRlIGZpbmFsIFRpY2tlciB0aWNrZXI7CisgICAgcHJpdmF0ZSBib29sZWFuIGlzUnVubmluZzsKKyAgICBwcml2YXRlIGxvbmcgc3RhcnRUaWNrOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyAoYnV0IGRvZXMgbm90IHN0YXJ0KSBhIG5ldyBzdG9wd2F0Y2ggdXNpbmcge0BsaW5rIFN5c3RlbSNuYW5vVGltZX0KKyAgICAgKiBhcyBpdHMgdGltZSBzb3VyY2UuCisgICAgICoKKyAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rIFN0b3B3YXRjaCNjcmVhdGVVbnN0YXJ0ZWQoKX0gaW5zdGVhZC4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHByaXZhdGUgU3RvcHdhdGNoKCkgeworICAgICAgICB0aGlzKFRpY2tlci5zeXN0ZW1UaWNrZXIoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyAoYnV0IGRvZXMgbm90IHN0YXJ0KSBhIG5ldyBzdG9wd2F0Y2gsIHVzaW5nIHRoZSBzcGVjaWZpZWQgdGltZQorICAgICAqIHNvdXJjZS4KKyAgICAgKgorICAgICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgU3RvcHdhdGNoI2NyZWF0ZVVuc3RhcnRlZChUaWNrZXIpfSBpbnN0ZWFkLgorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHJpdmF0ZSBTdG9wd2F0Y2goVGlja2VyIHRpY2tlcikgeworICAgICAgICB0aGlzLnRpY2tlciA9IFByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsKHRpY2tlciwgInRpY2tlciIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgKGJ1dCBkb2VzIG5vdCBzdGFydCkgYSBuZXcgc3RvcHdhdGNoIHVzaW5nIHtAbGluayBTeXN0ZW0jbmFub1RpbWV9CisgICAgICogYXMgaXRzIHRpbWUgc291cmNlLgorICAgICAqCisgICAgICogQHNpbmNlIDE1LjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0b3B3YXRjaCBjcmVhdGVVbnN0YXJ0ZWQoKSB7CisgICAgICAgIHJldHVybiBuZXcgU3RvcHdhdGNoKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgVGltZVVuaXQgY2hvb3NlVW5pdChsb25nIG5hbm9zKSB7CisgICAgICAgIGlmIChEQVlTLmNvbnZlcnQobmFub3MsIE5BTk9TRUNPTkRTKSA+IDApIHsKKyAgICAgICAgICAgIHJldHVybiBEQVlTOworICAgICAgICB9CisgICAgICAgIGlmIChIT1VSUy5jb252ZXJ0KG5hbm9zLCBOQU5PU0VDT05EUykgPiAwKSB7CisgICAgICAgICAgICByZXR1cm4gSE9VUlM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKE1JTlVURVMuY29udmVydChuYW5vcywgTkFOT1NFQ09ORFMpID4gMCkgeworICAgICAgICAgICAgcmV0dXJuIE1JTlVURVM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFNFQ09ORFMuY29udmVydChuYW5vcywgTkFOT1NFQ09ORFMpID4gMCkgeworICAgICAgICAgICAgcmV0dXJuIFNFQ09ORFM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKE1JTExJU0VDT05EUy5jb252ZXJ0KG5hbm9zLCBOQU5PU0VDT05EUykgPiAwKSB7CisgICAgICAgICAgICByZXR1cm4gTUlMTElTRUNPTkRTOworICAgICAgICB9CisgICAgICAgIGlmIChNSUNST1NFQ09ORFMuY29udmVydChuYW5vcywgTkFOT1NFQ09ORFMpID4gMCkgeworICAgICAgICAgICAgcmV0dXJuIE1JQ1JPU0VDT05EUzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTkFOT1NFQ09ORFM7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGFiYnJldmlhdGUoVGltZVVuaXQgdW5pdCkgeworICAgICAgICBzd2l0Y2ggKHVuaXQpIHsKKyAgICAgICAgICAgIGNhc2UgTkFOT1NFQ09ORFM6CisgICAgICAgICAgICAgICAgcmV0dXJuICJucyI7CisgICAgICAgICAgICBjYXNlIE1JQ1JPU0VDT05EUzoKKyAgICAgICAgICAgICAgICByZXR1cm4gIlx1MDNiY3MiOyAvLyDOvHMKKyAgICAgICAgICAgIGNhc2UgTUlMTElTRUNPTkRTOgorICAgICAgICAgICAgICAgIHJldHVybiAibXMiOworICAgICAgICAgICAgY2FzZSBTRUNPTkRTOgorICAgICAgICAgICAgICAgIHJldHVybiAicyI7CisgICAgICAgICAgICBjYXNlIE1JTlVURVM6CisgICAgICAgICAgICAgICAgcmV0dXJuICJtaW4iOworICAgICAgICAgICAgY2FzZSBIT1VSUzoKKyAgICAgICAgICAgICAgICByZXR1cm4gImgiOworICAgICAgICAgICAgY2FzZSBEQVlTOgorICAgICAgICAgICAgICAgIHJldHVybiAiZCI7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnRzIHRoZSBzdG9wd2F0Y2guCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoaXMge0Bjb2RlIFN0b3B3YXRjaH0gaW5zdGFuY2UKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgc3RvcHdhdGNoIGlzIGFscmVhZHkgcnVubmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RvcHdhdGNoIHN0YXJ0KCkgeworICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrU3RhdGUoIWlzUnVubmluZywgIlRoaXMgc3RvcHdhdGNoIGlzIGFscmVhZHkgcnVubmluZy4iKTsKKyAgICAgICAgaXNSdW5uaW5nID0gdHJ1ZTsKKyAgICAgICAgc3RhcnRUaWNrID0gdGlja2VyLnJlYWQoKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHJpdmF0ZSBsb25nIGVsYXBzZWROYW5vcygpIHsKKyAgICAgICAgcmV0dXJuIGlzUnVubmluZyA/IHRpY2tlci5yZWFkKCkgLSBzdGFydFRpY2sgOiAwTDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjdXJyZW50IGVsYXBzZWQgdGltZS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBsb25nIG5hbm9zID0gZWxhcHNlZE5hbm9zKCk7CisKKyAgICAgICAgVGltZVVuaXQgdW5pdCA9IGNob29zZVVuaXQobmFub3MpOworICAgICAgICBkb3VibGUgdmFsdWUgPSAoZG91YmxlKSBuYW5vcyAvIE5BTk9TRUNPTkRTLmNvbnZlcnQoMSwgdW5pdCk7CisKKyAgICAgICAgLy8gVG9vIGJhZCB0aGlzIGZ1bmN0aW9uYWxpdHkgaXMgbm90IGV4cG9zZWQgYXMgYSByZWd1bGFyIG1ldGhvZCBjYWxsCisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlLjRnICVzIiwgdmFsdWUsIGFiYnJldmlhdGUodW5pdCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvVGFibGUuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvVGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTdjZDRhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9UYWJsZS5qYXZhCkBAIC0wLDAgKzEsMjc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBHdWF2YSBBdXRob3JzCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIEEgY29sbGVjdGlvbiB0aGF0IGFzc29jaWF0ZXMgYW4gb3JkZXJlZCBwYWlyIG9mIGtleXMsIGNhbGxlZCBhIHJvdyBrZXkgYW5kIGEKKyAqIGNvbHVtbiBrZXksIHdpdGggYSBzaW5nbGUgdmFsdWUuIEEgdGFibGUgbWF5IGJlIHNwYXJzZSwgd2l0aCBvbmx5IGEgc21hbGwKKyAqIGZyYWN0aW9uIG9mIHJvdyBrZXkgLyBjb2x1bW4ga2V5IHBhaXJzIHBvc3Nlc3NpbmcgYSBjb3JyZXNwb25kaW5nIHZhbHVlLgorICogPHA+CisgKiA8cD5UaGUgbWFwcGluZ3MgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIHJvdyBrZXkgbWF5IGJlIHZpZXdlZCBhcyBhIHtAbGluaworICogTWFwfSB3aG9zZSBrZXlzIGFyZSB0aGUgY29sdW1ucy4gVGhlIHJldmVyc2UgaXMgYWxzbyBhdmFpbGFibGUsIGFzc29jaWF0aW5nIGEKKyAqIGNvbHVtbiB3aXRoIGEgcm93IGtleSAvIHZhbHVlIG1hcC4gTm90ZSB0aGF0LCBpbiBzb21lIGltcGxlbWVudGF0aW9ucywgZGF0YQorICogYWNjZXNzIGJ5IGNvbHVtbiBrZXkgbWF5IGhhdmUgZmV3ZXIgc3VwcG9ydGVkIG9wZXJhdGlvbnMgb3Igd29yc2UgcGVyZm9ybWFuY2UKKyAqIHRoYW4gZGF0YSBhY2Nlc3MgYnkgcm93IGtleS4KKyAqIDxwPgorICogPHA+VGhlIG1ldGhvZHMgcmV0dXJuaW5nIGNvbGxlY3Rpb25zIG9yIG1hcHMgYWx3YXlzIHJldHVybiB2aWV3cyBvZiB0aGUKKyAqIHVuZGVybHlpbmcgdGFibGUuIFVwZGF0aW5nIHRoZSB0YWJsZSBjYW4gY2hhbmdlIHRoZSBjb250ZW50cyBvZiB0aG9zZQorICogY29sbGVjdGlvbnMsIGFuZCB1cGRhdGluZyB0aGUgY29sbGVjdGlvbnMgd2lsbCBjaGFuZ2UgdGhlIHRhYmxlLgorICogPHA+CisgKiA8cD5BbGwgbWV0aG9kcyB0aGF0IG1vZGlmeSB0aGUgdGFibGUgYXJlIG9wdGlvbmFsLCBhbmQgdGhlIHZpZXdzIHJldHVybmVkIGJ5CisgKiB0aGUgdGFibGUgbWF5IG9yIG1heSBub3QgYmUgbW9kaWZpYWJsZS4gV2hlbiBtb2RpZmljYXRpb24gaXNuJ3Qgc3VwcG9ydGVkLAorICogdGhvc2UgbWV0aG9kcyB3aWxsIHRocm93IGFuIHtAbGluayBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbn0uCisgKiA8cD4KKyAqIDxwPlNlZSB0aGUgR3VhdmEgVXNlciBHdWlkZSBhcnRpY2xlIG9uIDxhIGhyZWY9CisgKiAiaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2d1YXZhLWxpYnJhcmllcy93aWtpL05ld0NvbGxlY3Rpb25UeXBlc0V4cGxhaW5lZCNUYWJsZSI+CisgKiB7QGNvZGUgVGFibGV9PC9hPi4KKyAqCisgKiBAcGFyYW0gPFI+IHRoZSB0eXBlIG9mIHRoZSB0YWJsZSByb3cga2V5cworICogQHBhcmFtIDxDPiB0aGUgdHlwZSBvZiB0aGUgdGFibGUgY29sdW1uIGtleXMKKyAqIEBwYXJhbSA8Vj4gdGhlIHR5cGUgb2YgdGhlIG1hcHBlZCB2YWx1ZXMKKyAqIEBhdXRob3IgSmFyZWQgTGV2eQorICogQHNpbmNlIDcuMAorICovCitwdWJsaWMgaW50ZXJmYWNlIFRhYmxlPFIsIEMsIFY+IHsKKyAgICAvLyBUT0RPKGpsZXZ5KTogQ29uc2lkZXIgYWRkaW5nIG1ldGhvZHMgc2ltaWxhciB0byBDb25jdXJyZW50TWFwIG1ldGhvZHMuCisKKyAgICAvLyBBY2Nlc3NvcnMKKworICAgIC8qKgorICAgICAqIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoZSB0YWJsZSBjb250YWlucyBhIG1hcHBpbmcgd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgICogcm93IGFuZCBjb2x1bW4ga2V5cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb3dLZXkgICAga2V5IG9mIHJvdyB0byBzZWFyY2ggZm9yCisgICAgICogQHBhcmFtIGNvbHVtbktleSBrZXkgb2YgY29sdW1uIHRvIHNlYXJjaCBmb3IKKyAgICAgKi8KKyAgICBib29sZWFuIGNvbnRhaW5zKE9iamVjdCByb3dLZXksIE9iamVjdCBjb2x1bW5LZXkpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHRhYmxlIGNvbnRhaW5zIGEgbWFwcGluZyB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiByb3cga2V5LgorICAgICAqCisgICAgICogQHBhcmFtIHJvd0tleSBrZXkgb2Ygcm93IHRvIHNlYXJjaCBmb3IKKyAgICAgKi8KKyAgICBib29sZWFuIGNvbnRhaW5zUm93KE9iamVjdCByb3dLZXkpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHRhYmxlIGNvbnRhaW5zIGEgbWFwcGluZyB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBjb2x1bW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29sdW1uS2V5IGtleSBvZiBjb2x1bW4gdG8gc2VhcmNoIGZvcgorICAgICAqLworICAgIGJvb2xlYW4gY29udGFpbnNDb2x1bW4oT2JqZWN0IGNvbHVtbktleSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGUgdGFibGUgY29udGFpbnMgYSBtYXBwaW5nIHdpdGggdGhlIHNwZWNpZmllZAorICAgICAqIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIHZhbHVlIHRvIHNlYXJjaCBmb3IKKyAgICAgKi8KKyAgICBib29sZWFuIGNvbnRhaW5zVmFsdWUoT2JqZWN0IHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHJvdyBhbmQgY29sdW1uIGtleXMsIG9yCisgICAgICoge0Bjb2RlIG51bGx9IGlmIG5vIHN1Y2ggbWFwcGluZyBleGlzdHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm93S2V5ICAgIGtleSBvZiByb3cgdG8gc2VhcmNoIGZvcgorICAgICAqIEBwYXJhbSBjb2x1bW5LZXkga2V5IG9mIGNvbHVtbiB0byBzZWFyY2ggZm9yCisgICAgICovCisgICAgViBnZXQoT2JqZWN0IHJvd0tleSwgT2JqZWN0IGNvbHVtbktleSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygcm93IGtleSAvIGNvbHVtbiBrZXkgLyB2YWx1ZSBtYXBwaW5ncyBpbiB0aGUgdGFibGUuCisgICAgICovCisgICAgaW50IHNpemUoKTsKKworICAgIC8qKgorICAgICAqIENvbXBhcmVzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHdpdGggdGhpcyB0YWJsZSBmb3IgZXF1YWxpdHkuIFR3byB0YWJsZXMgYXJlCisgICAgICogZXF1YWwgd2hlbiB0aGVpciBjZWxsIHZpZXdzLCBhcyByZXR1cm5lZCBieSB7QGxpbmsgI2NlbGxTZXR9LCBhcmUgZXF1YWwuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaik7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBoYXNoIGNvZGUgZm9yIHRoaXMgdGFibGUuIFRoZSBoYXNoIGNvZGUgb2YgYSB0YWJsZSBpcyBkZWZpbmVkCisgICAgICogYXMgdGhlIGhhc2ggY29kZSBvZiBpdHMgY2VsbCB2aWV3LCBhcyByZXR1cm5lZCBieSB7QGxpbmsgI2NlbGxTZXR9LgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIGludCBoYXNoQ29kZSgpOworCisgICAgLy8gTXV0YXRvcnMKKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYWxsIG1hcHBpbmdzIGZyb20gdGhlIHRhYmxlLgorICAgICAqLworICAgIHZvaWQgY2xlYXIoKTsKKworICAgIC8qKgorICAgICAqIEFzc29jaWF0ZXMgdGhlIHNwZWNpZmllZCB2YWx1ZSB3aXRoIHRoZSBzcGVjaWZpZWQga2V5cy4gSWYgdGhlIHRhYmxlCisgICAgICogYWxyZWFkeSBjb250YWluZWQgYSBtYXBwaW5nIGZvciB0aG9zZSBrZXlzLCB0aGUgb2xkIHZhbHVlIGlzIHJlcGxhY2VkIHdpdGgKKyAgICAgKiB0aGUgc3BlY2lmaWVkIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIHJvd0tleSAgICByb3cga2V5IHRoYXQgdGhlIHZhbHVlIHNob3VsZCBiZSBhc3NvY2lhdGVkIHdpdGgKKyAgICAgKiBAcGFyYW0gY29sdW1uS2V5IGNvbHVtbiBrZXkgdGhhdCB0aGUgdmFsdWUgc2hvdWxkIGJlIGFzc29jaWF0ZWQgd2l0aAorICAgICAqIEBwYXJhbSB2YWx1ZSAgICAgdmFsdWUgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5cworICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIHByZXZpb3VzbHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXlzLCBvciB7QGNvZGUgbnVsbH0gaWYKKyAgICAgKiBubyBtYXBwaW5nIGV4aXN0ZWQgZm9yIHRoZSBrZXlzCisgICAgICovCisgICAgViBwdXQoUiByb3dLZXksIEMgY29sdW1uS2V5LCBWIHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIENvcGllcyBhbGwgbWFwcGluZ3MgZnJvbSB0aGUgc3BlY2lmaWVkIHRhYmxlIHRvIHRoaXMgdGFibGUuIFRoZSBlZmZlY3QgaXMKKyAgICAgKiBlcXVpdmFsZW50IHRvIGNhbGxpbmcge0BsaW5rICNwdXR9IHdpdGggZWFjaCByb3cga2V5IC8gY29sdW1uIGtleSAvIHZhbHVlCisgICAgICogbWFwcGluZyBpbiB7QGNvZGUgdGFibGV9LgorICAgICAqCisgICAgICogQHBhcmFtIHRhYmxlIHRoZSB0YWJsZSB0byBhZGQgdG8gdGhpcyB0YWJsZQorICAgICAqLworICAgIHZvaWQgcHV0QWxsKFRhYmxlPD8gZXh0ZW5kcyBSLCA/IGV4dGVuZHMgQywgPyBleHRlbmRzIFY+IHRhYmxlKTsKKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgdGhlIG1hcHBpbmcsIGlmIGFueSwgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBrZXlzLgorICAgICAqCisgICAgICogQHBhcmFtIHJvd0tleSAgICByb3cga2V5IG9mIG1hcHBpbmcgdG8gYmUgcmVtb3ZlZAorICAgICAqIEBwYXJhbSBjb2x1bW5LZXkgY29sdW1uIGtleSBvZiBtYXBwaW5nIHRvIGJlIHJlbW92ZWQKKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBwcmV2aW91c2x5IGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5cywgb3Ige0Bjb2RlIG51bGx9IGlmCisgICAgICogbm8gc3VjaCB2YWx1ZSBleGlzdGVkCisgICAgICovCisgICAgViByZW1vdmUoT2JqZWN0IHJvd0tleSwgT2JqZWN0IGNvbHVtbktleSk7CisKKyAgICAvLyBWaWV3cworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHZpZXcgb2YgYWxsIG1hcHBpbmdzIHRoYXQgaGF2ZSB0aGUgZ2l2ZW4gcm93IGtleS4gRm9yIGVhY2ggcm93CisgICAgICoga2V5IC8gY29sdW1uIGtleSAvIHZhbHVlIG1hcHBpbmcgaW4gdGhlIHRhYmxlIHdpdGggdGhhdCByb3cga2V5LCB0aGUKKyAgICAgKiByZXR1cm5lZCBtYXAgYXNzb2NpYXRlcyB0aGUgY29sdW1uIGtleSB3aXRoIHRoZSB2YWx1ZS4gSWYgbm8gbWFwcGluZ3MgaW4KKyAgICAgKiB0aGUgdGFibGUgaGF2ZSB0aGUgcHJvdmlkZWQgcm93IGtleSwgYW4gZW1wdHkgbWFwIGlzIHJldHVybmVkLgorICAgICAqIDxwPgorICAgICAqIDxwPkNoYW5nZXMgdG8gdGhlIHJldHVybmVkIG1hcCB3aWxsIHVwZGF0ZSB0aGUgdW5kZXJseWluZyB0YWJsZSwgYW5kIHZpY2UKKyAgICAgKiB2ZXJzYS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb3dLZXkga2V5IG9mIHJvdyB0byBzZWFyY2ggZm9yIGluIHRoZSB0YWJsZQorICAgICAqIEByZXR1cm4gdGhlIGNvcnJlc3BvbmRpbmcgbWFwIGZyb20gY29sdW1uIGtleXMgdG8gdmFsdWVzCisgICAgICovCisgICAgTWFwPEMsIFY+IHJvdyhSIHJvd0tleSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgdmlldyBvZiBhbGwgbWFwcGluZ3MgdGhhdCBoYXZlIHRoZSBnaXZlbiBjb2x1bW4ga2V5LiBGb3IgZWFjaCByb3cKKyAgICAgKiBrZXkgLyBjb2x1bW4ga2V5IC8gdmFsdWUgbWFwcGluZyBpbiB0aGUgdGFibGUgd2l0aCB0aGF0IGNvbHVtbiBrZXksIHRoZQorICAgICAqIHJldHVybmVkIG1hcCBhc3NvY2lhdGVzIHRoZSByb3cga2V5IHdpdGggdGhlIHZhbHVlLiBJZiBubyBtYXBwaW5ncyBpbiB0aGUKKyAgICAgKiB0YWJsZSBoYXZlIHRoZSBwcm92aWRlZCBjb2x1bW4ga2V5LCBhbiBlbXB0eSBtYXAgaXMgcmV0dXJuZWQuCisgICAgICogPHA+CisgICAgICogPHA+Q2hhbmdlcyB0byB0aGUgcmV0dXJuZWQgbWFwIHdpbGwgdXBkYXRlIHRoZSB1bmRlcmx5aW5nIHRhYmxlLCBhbmQgdmljZQorICAgICAqIHZlcnNhLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbHVtbktleSBrZXkgb2YgY29sdW1uIHRvIHNlYXJjaCBmb3IgaW4gdGhlIHRhYmxlCisgICAgICogQHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBtYXAgZnJvbSByb3cga2V5cyB0byB2YWx1ZXMKKyAgICAgKi8KKyAgICBNYXA8UiwgVj4gY29sdW1uKEMgY29sdW1uS2V5KTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzZXQgb2YgYWxsIHJvdyBrZXkgLyBjb2x1bW4ga2V5IC8gdmFsdWUgdHJpcGxldHMuIENoYW5nZXMgdG8gdGhlCisgICAgICogcmV0dXJuZWQgc2V0IHdpbGwgdXBkYXRlIHRoZSB1bmRlcmx5aW5nIHRhYmxlLCBhbmQgdmljZSB2ZXJzYS4gVGhlIGNlbGwgc2V0CisgICAgICogZG9lcyBub3Qgc3VwcG9ydCB0aGUge0Bjb2RlIGFkZH0gb3Ige0Bjb2RlIGFkZEFsbH0gbWV0aG9kcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gc2V0IG9mIHRhYmxlIGNlbGxzIGNvbnNpc3Rpbmcgb2Ygcm93IGtleSAvIGNvbHVtbiBrZXkgLyB2YWx1ZQorICAgICAqIHRyaXBsZXRzCisgICAgICovCisgICAgU2V0PENlbGw8UiwgQywgVj4+IGNlbGxTZXQoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzZXQgb2Ygcm93IGtleXMgdGhhdCBoYXZlIG9uZSBvciBtb3JlIHZhbHVlcyBpbiB0aGUgdGFibGUuCisgICAgICogQ2hhbmdlcyB0byB0aGUgc2V0IHdpbGwgdXBkYXRlIHRoZSB1bmRlcmx5aW5nIHRhYmxlLCBhbmQgdmljZSB2ZXJzYS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gc2V0IG9mIHJvdyBrZXlzCisgICAgICovCisgICAgU2V0PFI+IHJvd0tleVNldCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHNldCBvZiBjb2x1bW4ga2V5cyB0aGF0IGhhdmUgb25lIG9yIG1vcmUgdmFsdWVzIGluIHRoZSB0YWJsZS4KKyAgICAgKiBDaGFuZ2VzIHRvIHRoZSBzZXQgd2lsbCB1cGRhdGUgdGhlIHVuZGVybHlpbmcgdGFibGUsIGFuZCB2aWNlIHZlcnNhLgorICAgICAqCisgICAgICogQHJldHVybiBzZXQgb2YgY29sdW1uIGtleXMKKyAgICAgKi8KKyAgICBTZXQ8Qz4gY29sdW1uS2V5U2V0KCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgdmlldyB0aGF0IGFzc29jaWF0ZXMgZWFjaCByb3cga2V5IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgbWFwIGZyb20KKyAgICAgKiBjb2x1bW4ga2V5cyB0byB2YWx1ZXMuIENoYW5nZXMgdG8gdGhlIHJldHVybmVkIG1hcCB3aWxsIHVwZGF0ZSB0aGlzIHRhYmxlLgorICAgICAqIFRoZSByZXR1cm5lZCBtYXAgZG9lcyBub3Qgc3VwcG9ydCB7QGNvZGUgcHV0KCl9IG9yIHtAY29kZSBwdXRBbGwoKX0sIG9yCisgICAgICoge0Bjb2RlIHNldFZhbHVlKCl9IG9uIGl0cyBlbnRyaWVzLgorICAgICAqIDxwPgorICAgICAqIDxwPkluIGNvbnRyYXN0LCB0aGUgbWFwcyByZXR1cm5lZCBieSB7QGNvZGUgcm93TWFwKCkuZ2V0KCl9IGhhdmUgdGhlIHNhbWUKKyAgICAgKiBiZWhhdmlvciBhcyB0aG9zZSByZXR1cm5lZCBieSB7QGxpbmsgI3Jvd30uIFRob3NlIG1hcHMgbWF5IHN1cHBvcnQge0Bjb2RlCisgICAgICogc2V0VmFsdWUoKX0sIHtAY29kZSBwdXQoKX0sIGFuZCB7QGNvZGUgcHV0QWxsKCl9LgorICAgICAqCisgICAgICogQHJldHVybiBhIG1hcCB2aWV3IGZyb20gZWFjaCByb3cga2V5IHRvIGEgc2Vjb25kYXJ5IG1hcCBmcm9tIGNvbHVtbiBrZXlzIHRvCisgICAgICogdmFsdWVzCisgICAgICovCisgICAgTWFwPFIsIE1hcDxDLCBWPj4gcm93TWFwKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgdmlldyB0aGF0IGFzc29jaWF0ZXMgZWFjaCBjb2x1bW4ga2V5IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgbWFwCisgICAgICogZnJvbSByb3cga2V5cyB0byB2YWx1ZXMuIENoYW5nZXMgdG8gdGhlIHJldHVybmVkIG1hcCB3aWxsIHVwZGF0ZSB0aGlzCisgICAgICogdGFibGUuIFRoZSByZXR1cm5lZCBtYXAgZG9lcyBub3Qgc3VwcG9ydCB7QGNvZGUgcHV0KCl9IG9yIHtAY29kZSBwdXRBbGwoKX0sCisgICAgICogb3Ige0Bjb2RlIHNldFZhbHVlKCl9IG9uIGl0cyBlbnRyaWVzLgorICAgICAqIDxwPgorICAgICAqIDxwPkluIGNvbnRyYXN0LCB0aGUgbWFwcyByZXR1cm5lZCBieSB7QGNvZGUgY29sdW1uTWFwKCkuZ2V0KCl9IGhhdmUgdGhlCisgICAgICogc2FtZSBiZWhhdmlvciBhcyB0aG9zZSByZXR1cm5lZCBieSB7QGxpbmsgI2NvbHVtbn0uIFRob3NlIG1hcHMgbWF5IHN1cHBvcnQKKyAgICAgKiB7QGNvZGUgc2V0VmFsdWUoKX0sIHtAY29kZSBwdXQoKX0sIGFuZCB7QGNvZGUgcHV0QWxsKCl9LgorICAgICAqCisgICAgICogQHJldHVybiBhIG1hcCB2aWV3IGZyb20gZWFjaCBjb2x1bW4ga2V5IHRvIGEgc2Vjb25kYXJ5IG1hcCBmcm9tIHJvdyBrZXlzIHRvCisgICAgICogdmFsdWVzCisgICAgICovCisgICAgTWFwPEMsIE1hcDxSLCBWPj4gY29sdW1uTWFwKCk7CisKKyAgICAvKioKKyAgICAgKiBSb3cga2V5IC8gY29sdW1uIGtleSAvIHZhbHVlIHRyaXBsZXQgY29ycmVzcG9uZGluZyB0byBhIG1hcHBpbmcgaW4gYSB0YWJsZS4KKyAgICAgKgorICAgICAqIEBzaW5jZSA3LjAKKyAgICAgKi8KKyAgICBpbnRlcmZhY2UgQ2VsbDxSLCBDLCBWPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSByb3cga2V5IG9mIHRoaXMgY2VsbC4KKyAgICAgICAgICovCisgICAgICAgIFIgZ2V0Um93S2V5KCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIGNvbHVtbiBrZXkgb2YgdGhpcyBjZWxsLgorICAgICAgICAgKi8KKyAgICAgICAgQyBnZXRDb2x1bW5LZXkoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhpcyBjZWxsLgorICAgICAgICAgKi8KKyAgICAgICAgViBnZXRWYWx1ZSgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIG9iamVjdCB3aXRoIHRoaXMgY2VsbCBmb3IgZXF1YWxpdHkuIFR3byBjZWxscyBhcmUKKyAgICAgICAgICogZXF1YWwgd2hlbiB0aGV5IGhhdmUgZXF1YWwgcm93IGtleXMsIGNvbHVtbiBrZXlzLCBhbmQgdmFsdWVzLgorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBoYXNoIGNvZGUgb2YgdGhpcyBjZWxsLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogPHA+VGhlIGhhc2ggY29kZSBvZiBhIHRhYmxlIGNlbGwgaXMgZXF1YWwgdG8ge0BsaW5rCisgICAgICAgICAqIE9iamVjdHMjaGFzaENvZGV9e0Bjb2RlIChlLmdldFJvd0tleSgpLCBlLmdldENvbHVtbktleSgpLCBlLmdldFZhbHVlKCkpfS4KKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBpbnQgaGFzaENvZGUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL1RhYmxlcy5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9UYWJsZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNThjOTg2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9UYWJsZXMuamF2YQpAQCAtMCwwICsxLDI1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgR3VhdmEgQXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YTsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworCitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworCisvKioKKyAqIFByb3ZpZGVzIHN0YXRpYyBtZXRob2RzIHRoYXQgaW52b2x2ZSBhIHtAY29kZSBUYWJsZX0uCisgKiA8cD4KKyAqIDxwPlNlZSB0aGUgR3VhdmEgVXNlciBHdWlkZSBhcnRpY2xlIG9uIDxhIGhyZWY9CisgKiAiaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2d1YXZhLWxpYnJhcmllcy93aWtpL0NvbGxlY3Rpb25VdGlsaXRpZXNFeHBsYWluZWQjVGFibGVzIj4KKyAqIHtAY29kZSBUYWJsZXN9PC9hPi4KKyAqCisgKiBAYXV0aG9yIEphcmVkIExldnkKKyAqIEBhdXRob3IgTG91aXMgV2Fzc2VybWFuCisgKiBAc2luY2UgNy4wCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBUYWJsZXMgeworICAgIHByaXZhdGUgVGFibGVzKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gaW1tdXRhYmxlIGNlbGwgd2l0aCB0aGUgc3BlY2lmaWVkIHJvdyBrZXksIGNvbHVtbiBrZXksIGFuZAorICAgICAqIHZhbHVlLgorICAgICAqIDxwPgorICAgICAqIDxwPlRoZSByZXR1cm5lZCBjZWxsIGlzIHNlcmlhbGl6YWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb3dLZXkgICAgdGhlIHJvdyBrZXkgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXR1cm5lZCBjZWxsCisgICAgICogQHBhcmFtIGNvbHVtbktleSB0aGUgY29sdW1uIGtleSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHJldHVybmVkIGNlbGwKKyAgICAgKiBAcGFyYW0gdmFsdWUgICAgIHRoZSB2YWx1ZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHJldHVybmVkIGNlbGwKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxSLCBDLCBWPiBUYWJsZS5DZWxsPFIsIEMsIFY+IGltbXV0YWJsZUNlbGwoCisgICAgICAgICAgICBSIHJvd0tleSwgQyBjb2x1bW5LZXksIFYgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJbW11dGFibGVDZWxsPFIsIEMsIFY+KHJvd0tleSwgY29sdW1uS2V5LCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHRyYW5zcG9zZWQgdmlldyBvZiBhIGdpdmVuIHRhYmxlIHRoYXQgZmxpcHMgaXRzIHJvdyBhbmQgY29sdW1uCisgICAgICoga2V5cy4gSW4gb3RoZXIgd29yZHMsIGNhbGxpbmcge0Bjb2RlIGdldChjb2x1bW5LZXksIHJvd0tleSl9IG9uIHRoZQorICAgICAqIGdlbmVyYXRlZCB0YWJsZSBhbHdheXMgcmV0dXJucyB0aGUgc2FtZSB2YWx1ZSBhcyBjYWxsaW5nIHtAY29kZQorICAgICAqIGdldChyb3dLZXksIGNvbHVtbktleSl9IG9uIHRoZSBvcmlnaW5hbCB0YWJsZS4gVXBkYXRpbmcgdGhlIG9yaWdpbmFsIHRhYmxlCisgICAgICogY2hhbmdlcyB0aGUgY29udGVudHMgb2YgdGhlIHRyYW5zcG9zZWQgdGFibGUgYW5kIHZpY2UgdmVyc2EuCisgICAgICogPHA+CisgICAgICogPHA+VGhlIHJldHVybmVkIHRhYmxlIHN1cHBvcnRzIHVwZGF0ZSBvcGVyYXRpb25zIGFzIGxvbmcgYXMgdGhlIGlucHV0IHRhYmxlCisgICAgICogc3VwcG9ydHMgdGhlIGFuYWxvZ291cyBvcGVyYXRpb24gd2l0aCBzd2FwcGVkIHJvd3MgYW5kIGNvbHVtbnMuIEZvcgorICAgICAqIGV4YW1wbGUsIGluIGEge0BsaW5rIEhhc2hCYXNlZFRhYmxlfSBpbnN0YW5jZSwge0Bjb2RlCisgICAgICogcm93S2V5U2V0KCkuaXRlcmF0b3IoKX0gc3VwcG9ydHMge0Bjb2RlIHJlbW92ZSgpfSBidXQge0Bjb2RlCisgICAgICogY29sdW1uS2V5U2V0KCkuaXRlcmF0b3IoKX0gZG9lc24ndC4gV2l0aCBhIHRyYW5zcG9zZWQge0BsaW5rCisgICAgICogSGFzaEJhc2VkVGFibGV9LCBpdCdzIHRoZSBvdGhlciB3YXkgYXJvdW5kLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIDxSLCBDLCBWPiBUYWJsZTxDLCBSLCBWPiB0cmFuc3Bvc2UoVGFibGU8UiwgQywgVj4gdGFibGUpIHsKKyAgICAgICAgcmV0dXJuICh0YWJsZSBpbnN0YW5jZW9mIFRyYW5zcG9zZVRhYmxlKQorICAgICAgICAgICAgICAgID8gKChUcmFuc3Bvc2VUYWJsZTxSLCBDLCBWPikgdGFibGUpLm9yaWdpbmFsCisgICAgICAgICAgICAgICAgOiBuZXcgVHJhbnNwb3NlVGFibGU8QywgUiwgVj4odGFibGUpOworICAgIH0KKworICAgIHN0YXRpYyBib29sZWFuIGVxdWFsc0ltcGwoVGFibGU8PywgPywgPz4gdGFibGUsIE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKG9iaiA9PSB0YWJsZSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgVGFibGUpIHsKKyAgICAgICAgICAgIFRhYmxlPD8sID8sID8+IHRoYXQgPSAoVGFibGU8PywgPywgPz4pIG9iajsKKyAgICAgICAgICAgIHJldHVybiB0YWJsZS5jZWxsU2V0KCkuZXF1YWxzKHRoYXQuY2VsbFNldCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBJbW11dGFibGVDZWxsPFIsIEMsIFY+CisgICAgICAgICAgICBleHRlbmRzIEFic3RyYWN0Q2VsbDxSLCBDLCBWPiBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDA7CisgICAgICAgIHByaXZhdGUgZmluYWwgUiByb3dLZXk7CisgICAgICAgIHByaXZhdGUgZmluYWwgQyBjb2x1bW5LZXk7CisgICAgICAgIHByaXZhdGUgZmluYWwgViB2YWx1ZTsKKworICAgICAgICBJbW11dGFibGVDZWxsKAorICAgICAgICAgICAgICAgIFIgcm93S2V5LCBDIGNvbHVtbktleSwgViB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy5yb3dLZXkgPSByb3dLZXk7CisgICAgICAgICAgICB0aGlzLmNvbHVtbktleSA9IGNvbHVtbktleTsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUiBnZXRSb3dLZXkoKSB7CisgICAgICAgICAgICByZXR1cm4gcm93S2V5OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDIGdldENvbHVtbktleSgpIHsKKyAgICAgICAgICAgIHJldHVybiBjb2x1bW5LZXk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFYgZ2V0VmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgQWJzdHJhY3RDZWxsPFIsIEMsIFY+IGltcGxlbWVudHMgVGFibGUuQ2VsbDxSLCBDLCBWPiB7CisgICAgICAgIC8vIG5lZWRlZCBmb3Igc2VyaWFsaXphdGlvbgorICAgICAgICBBYnN0cmFjdENlbGwoKSB7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgICAgIGlmIChvYmogPT0gdGhpcykgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFRhYmxlLkNlbGwpIHsKKyAgICAgICAgICAgICAgICBUYWJsZS5DZWxsPD8sID8sID8+IG90aGVyID0gKFRhYmxlLkNlbGw8PywgPywgPz4pIG9iajsKKyAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0cy5lcXVhbHMoZ2V0Um93S2V5KCksIG90aGVyLmdldFJvd0tleSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgT2JqZWN0cy5lcXVhbHMoZ2V0Q29sdW1uS2V5KCksIG90aGVyLmdldENvbHVtbktleSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgT2JqZWN0cy5lcXVhbHMoZ2V0VmFsdWUoKSwgb3RoZXIuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBPYmplY3RzLmhhc2goZ2V0Um93S2V5KCksIGdldENvbHVtbktleSgpLCBnZXRWYWx1ZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICIoIiArIGdldFJvd0tleSgpICsgIiwiICsgZ2V0Q29sdW1uS2V5KCkgKyAiKT0iICsgZ2V0VmFsdWUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRyYW5zcG9zZVRhYmxlPEMsIFIsIFY+IGV4dGVuZHMgQWJzdHJhY3RUYWJsZTxDLCBSLCBWPiB7CisgICAgICAgIC8vIFdpbGwgY2FzdCBUUkFOU1BPU0VfQ0VMTCB0byBhIHR5cGUgdGhhdCBhbHdheXMgc3VjY2VlZHMKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRnVuY3Rpb248Q2VsbDw/LCA/LCA/PiwgQ2VsbDw/LCA/LCA/Pj4gVFJBTlNQT1NFX0NFTEwgPQorICAgICAgICAgICAgICAgIG5ldyBGdW5jdGlvbjxDZWxsPD8sID8sID8+LCBDZWxsPD8sID8sID8+PigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBDZWxsPD8sID8sID8+IGFwcGx5KENlbGw8PywgPywgPz4gY2VsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGltbXV0YWJsZUNlbGwoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGwuZ2V0Q29sdW1uS2V5KCksIGNlbGwuZ2V0Um93S2V5KCksIGNlbGwuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICBmaW5hbCBUYWJsZTxSLCBDLCBWPiBvcmlnaW5hbDsKKworICAgICAgICBUcmFuc3Bvc2VUYWJsZShUYWJsZTxSLCBDLCBWPiBvcmlnaW5hbCkgeworICAgICAgICAgICAgdGhpcy5vcmlnaW5hbCA9IGNoZWNrTm90TnVsbChvcmlnaW5hbCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgICAgICBvcmlnaW5hbC5jbGVhcigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBNYXA8QywgVj4gY29sdW1uKFIgY29sdW1uS2V5KSB7CisgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwucm93KGNvbHVtbktleSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFNldDxSPiBjb2x1bW5LZXlTZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwucm93S2V5U2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE1hcDxSLCBNYXA8QywgVj4+IGNvbHVtbk1hcCgpIHsKKyAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbC5yb3dNYXAoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucygKKyAgICAgICAgICAgICAgICBPYmplY3Qgcm93S2V5LCBPYmplY3QgY29sdW1uS2V5KSB7CisgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwuY29udGFpbnMoY29sdW1uS2V5LCByb3dLZXkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zQ29sdW1uKE9iamVjdCBjb2x1bW5LZXkpIHsKKyAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbC5jb250YWluc1Jvdyhjb2x1bW5LZXkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zUm93KE9iamVjdCByb3dLZXkpIHsKKyAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbC5jb250YWluc0NvbHVtbihyb3dLZXkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmFsdWUoT2JqZWN0IHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwuY29udGFpbnNWYWx1ZSh2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFYgZ2V0KE9iamVjdCByb3dLZXksIE9iamVjdCBjb2x1bW5LZXkpIHsKKyAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbC5nZXQoY29sdW1uS2V5LCByb3dLZXkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWIHB1dChDIHJvd0tleSwgUiBjb2x1bW5LZXksIFYgdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbC5wdXQoY29sdW1uS2V5LCByb3dLZXksIHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBwdXRBbGwoVGFibGU8PyBleHRlbmRzIEMsID8gZXh0ZW5kcyBSLCA/IGV4dGVuZHMgVj4gdGFibGUpIHsKKyAgICAgICAgICAgIG9yaWdpbmFsLnB1dEFsbCh0cmFuc3Bvc2UodGFibGUpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgViByZW1vdmUoT2JqZWN0IHJvd0tleSwgT2JqZWN0IGNvbHVtbktleSkgeworICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsLnJlbW92ZShjb2x1bW5LZXksIHJvd0tleSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE1hcDxSLCBWPiByb3coQyByb3dLZXkpIHsKKyAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbC5jb2x1bW4ocm93S2V5KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU2V0PEM+IHJvd0tleVNldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbC5jb2x1bW5LZXlTZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTWFwPEMsIE1hcDxSLCBWPj4gcm93TWFwKCkgeworICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsLmNvbHVtbk1hcCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbC5zaXplKCk7CisgICAgICAgIH0KKworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIEl0ZXJhdG9yPENlbGw8QywgUiwgVj4+IGNlbGxJdGVyYXRvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBJdGVyYXRvcnMudHJhbnNmb3JtKG9yaWdpbmFsLmNlbGxTZXQoKS5pdGVyYXRvcigpLCAoRnVuY3Rpb24pIFRSQU5TUE9TRV9DRUxMKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvVGhyZWFkRmFjdG9yeUJ1aWxkZXIuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvVGhyZWFkRmFjdG9yeUJ1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDYyNGEyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9UaHJlYWRGYWN0b3J5QnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBHdWF2YSBBdXRob3JzCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhOworCitpbXBvcnQgamF2YS5sYW5nLlRocmVhZC5VbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXI7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZEZhY3Rvcnk7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0xvbmc7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmEuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CisKKy8qKgorICogQSBUaHJlYWRGYWN0b3J5IGJ1aWxkZXIsIHByb3ZpZGluZyBhbnkgY29tYmluYXRpb24gb2YgdGhlc2UgZmVhdHVyZXM6CisgKiA8dWw+CisgKiA8bGk+IHdoZXRoZXIgdGhyZWFkcyBzaG91bGQgYmUgbWFya2VkIGFzIHtAbGlua3BsYWluIFRocmVhZCNzZXREYWVtb24gZGFlbW9ufQorICogdGhyZWFkcworICogPGxpPiBhIHtAbGlua3BsYWluIFRocmVhZEZhY3RvcnlCdWlsZGVyI3NldE5hbWVGb3JtYXQgbmFtaW5nIGZvcm1hdH0KKyAqIDxsaT4gYSB7QGxpbmtwbGFpbiBUaHJlYWQjc2V0UHJpb3JpdHkgdGhyZWFkIHByaW9yaXR5fQorICogPGxpPiBhbiB7QGxpbmtwbGFpbiBUaHJlYWQjc2V0VW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyIHVuY2F1Z2h0IGV4Y2VwdGlvbgorICogaGFuZGxlcn0KKyAqIDxsaT4gYSB7QGxpbmtwbGFpbiBUaHJlYWRGYWN0b3J5I25ld1RocmVhZCBiYWNraW5nIHRocmVhZCBmYWN0b3J5fQorICogPC91bD4KKyAqIDxwPklmIG5vIGJhY2tpbmcgdGhyZWFkIGZhY3RvcnkgaXMgcHJvdmlkZWQsIGEgZGVmYXVsdCBiYWNraW5nIHRocmVhZCBmYWN0b3J5IGlzCisgKiB1c2VkIGFzIGlmIGJ5IGNhbGxpbmcge0Bjb2RlIHNldFRocmVhZEZhY3RvcnkofXtAbGluaworICogRXhlY3V0b3JzI2RlZmF1bHRUaHJlYWRGYWN0b3J5KCl9e0Bjb2RlICl9LgorICoKKyAqIEBhdXRob3IgS3VydCBBbGZyZWQgS2x1ZXZlcgorICogQHNpbmNlIDQuMAorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVGhyZWFkRmFjdG9yeUJ1aWxkZXIgeworICAgIHByaXZhdGUgU3RyaW5nIG5hbWVGb3JtYXQgPSBudWxsOworICAgIHByaXZhdGUgQm9vbGVhbiBkYWVtb24gPSBudWxsOworICAgIHByaXZhdGUgSW50ZWdlciBwcmlvcml0eSA9IG51bGw7CisgICAgcHJpdmF0ZSBVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIgdW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyID0gbnVsbDsKKyAgICBwcml2YXRlIFRocmVhZEZhY3RvcnkgYmFja2luZ1RocmVhZEZhY3RvcnkgPSBudWxsOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgVGhyZWFkRmFjdG9yeX0gYnVpbGRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGhyZWFkRmFjdG9yeUJ1aWxkZXIoKSB7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgVGhyZWFkRmFjdG9yeSBidWlsZChUaHJlYWRGYWN0b3J5QnVpbGRlciBidWlsZGVyKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lRm9ybWF0ID0gYnVpbGRlci5uYW1lRm9ybWF0OworICAgICAgICBmaW5hbCBCb29sZWFuIGRhZW1vbiA9IGJ1aWxkZXIuZGFlbW9uOworICAgICAgICBmaW5hbCBJbnRlZ2VyIHByaW9yaXR5ID0gYnVpbGRlci5wcmlvcml0eTsKKyAgICAgICAgZmluYWwgVW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyIHVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlciA9CisgICAgICAgICAgICAgICAgYnVpbGRlci51bmNhdWdodEV4Y2VwdGlvbkhhbmRsZXI7CisgICAgICAgIGZpbmFsIFRocmVhZEZhY3RvcnkgYmFja2luZ1RocmVhZEZhY3RvcnkgPQorICAgICAgICAgICAgICAgIChidWlsZGVyLmJhY2tpbmdUaHJlYWRGYWN0b3J5ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICA/IGJ1aWxkZXIuYmFja2luZ1RocmVhZEZhY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgICAgIDogRXhlY3V0b3JzLmRlZmF1bHRUaHJlYWRGYWN0b3J5KCk7CisgICAgICAgIGZpbmFsIEF0b21pY0xvbmcgY291bnQgPSAobmFtZUZvcm1hdCAhPSBudWxsKSA/IG5ldyBBdG9taWNMb25nKDApIDogbnVsbDsKKyAgICAgICAgcmV0dXJuIG5ldyBUaHJlYWRGYWN0b3J5KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgVGhyZWFkIG5ld1RocmVhZChSdW5uYWJsZSBydW5uYWJsZSkgeworICAgICAgICAgICAgICAgIFRocmVhZCB0aHJlYWQgPSBiYWNraW5nVGhyZWFkRmFjdG9yeS5uZXdUaHJlYWQocnVubmFibGUpOworICAgICAgICAgICAgICAgIGlmIChuYW1lRm9ybWF0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkLnNldE5hbWUoU3RyaW5nLmZvcm1hdChuYW1lRm9ybWF0LCBjb3VudC5nZXRBbmRJbmNyZW1lbnQoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZGFlbW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkLnNldERhZW1vbihkYWVtb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocHJpb3JpdHkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJlYWQuc2V0UHJpb3JpdHkocHJpb3JpdHkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkLnNldFVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcih1bmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGhyZWFkOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG5hbWluZyBmb3JtYXQgdG8gdXNlIHdoZW4gbmFtaW5nIHRocmVhZHMgKHtAbGluayBUaHJlYWQjc2V0TmFtZX0pCisgICAgICogd2hpY2ggYXJlIGNyZWF0ZWQgd2l0aCB0aGlzIFRocmVhZEZhY3RvcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZUZvcm1hdCBhIHtAbGluayBTdHJpbmcjZm9ybWF0KFN0cmluZywgT2JqZWN0Li4uKX0tY29tcGF0aWJsZQorICAgICAqICAgICAgICAgICAgICAgICAgIGZvcm1hdCBTdHJpbmcsIHRvIHdoaWNoIGEgdW5pcXVlIGludGVnZXIgKDAsIDEsIGV0Yy4pIHdpbGwgYmUgc3VwcGxpZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICBhcyB0aGUgc2luZ2xlIHBhcmFtZXRlci4gVGhpcyBpbnRlZ2VyIHdpbGwgYmUgdW5pcXVlIHRvIHRoZSBidWlsdAorICAgICAqICAgICAgICAgICAgICAgICAgIGluc3RhbmNlIG9mIHRoZSBUaHJlYWRGYWN0b3J5IGFuZCB3aWxsIGJlIGFzc2lnbmVkIHNlcXVlbnRpYWxseS4gRm9yCisgICAgICogICAgICAgICAgICAgICAgICAgZXhhbXBsZSwge0Bjb2RlICJycGMtcG9vbC0lZCJ9IHdpbGwgZ2VuZXJhdGUgdGhyZWFkIG5hbWVzIGxpa2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICB7QGNvZGUgInJwYy1wb29sLTAifSwge0Bjb2RlICJycGMtcG9vbC0xIn0sIHtAY29kZSAicnBjLXBvb2wtMiJ9LCBldGMuCisgICAgICogQHJldHVybiB0aGlzIGZvciB0aGUgYnVpbGRlciBwYXR0ZXJuCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoIlJldHVyblZhbHVlSWdub3JlZCIpCisgICAgcHVibGljIFRocmVhZEZhY3RvcnlCdWlsZGVyIHNldE5hbWVGb3JtYXQoU3RyaW5nIG5hbWVGb3JtYXQpIHsKKyAgICAgICAgU3RyaW5nLmZvcm1hdChuYW1lRm9ybWF0LCAwKTsgLy8gZmFpbCBmYXN0IGlmIHRoZSBmb3JtYXQgaXMgYmFkIG9yIG51bGwKKyAgICAgICAgdGhpcy5uYW1lRm9ybWF0ID0gbmFtZUZvcm1hdDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBkYWVtb24gb3Igbm90IGZvciBuZXcgdGhyZWFkcyBjcmVhdGVkIHdpdGggdGhpcyBUaHJlYWRGYWN0b3J5LgorICAgICAqCisgICAgICogQHBhcmFtIGRhZW1vbiB3aGV0aGVyIG9yIG5vdCBuZXcgVGhyZWFkcyBjcmVhdGVkIHdpdGggdGhpcyBUaHJlYWRGYWN0b3J5CisgICAgICogICAgICAgICAgICAgICB3aWxsIGJlIGRhZW1vbiB0aHJlYWRzCisgICAgICogQHJldHVybiB0aGlzIGZvciB0aGUgYnVpbGRlciBwYXR0ZXJuCisgICAgICovCisgICAgcHVibGljIFRocmVhZEZhY3RvcnlCdWlsZGVyIHNldERhZW1vbihib29sZWFuIGRhZW1vbikgeworICAgICAgICB0aGlzLmRhZW1vbiA9IGRhZW1vbjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUge0BsaW5rIFVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcn0gZm9yIG5ldyB0aHJlYWRzIGNyZWF0ZWQgd2l0aCB0aGlzCisgICAgICogVGhyZWFkRmFjdG9yeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1bmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIgdGhlIHVuY2F1Z2h0IGV4Y2VwdGlvbiBoYW5kbGVyIGZvciBuZXcKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZHMgY3JlYXRlZCB3aXRoIHRoaXMgVGhyZWFkRmFjdG9yeQorICAgICAqIEByZXR1cm4gdGhpcyBmb3IgdGhlIGJ1aWxkZXIgcGF0dGVybgorICAgICAqLworICAgIHB1YmxpYyBUaHJlYWRGYWN0b3J5QnVpbGRlciBzZXRVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIoCisgICAgICAgICAgICBVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIgdW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyKSB7CisgICAgICAgIHRoaXMudW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyID0gY2hlY2tOb3ROdWxsKHVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcik7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGJhY2tpbmcge0BsaW5rIFRocmVhZEZhY3Rvcnl9IGZvciBuZXcgdGhyZWFkcyBjcmVhdGVkIHdpdGggdGhpcworICAgICAqIFRocmVhZEZhY3RvcnkuIFRocmVhZHMgd2lsbCBiZSBjcmVhdGVkIGJ5IGludm9raW5nICNuZXdUaHJlYWQoUnVubmFibGUpIG9uCisgICAgICogdGhpcyBiYWNraW5nIHtAbGluayBUaHJlYWRGYWN0b3J5fS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiYWNraW5nVGhyZWFkRmFjdG9yeSB0aGUgYmFja2luZyB7QGxpbmsgVGhyZWFkRmFjdG9yeX0gd2hpY2ggd2lsbAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBkZWxlZ2F0ZWQgdG8gZHVyaW5nIHRocmVhZCBjcmVhdGlvbi4KKyAgICAgKiBAcmV0dXJuIHRoaXMgZm9yIHRoZSBidWlsZGVyIHBhdHRlcm4KKyAgICAgKiBAc2VlIE1vcmVFeGVjdXRvcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgVGhyZWFkRmFjdG9yeUJ1aWxkZXIgc2V0VGhyZWFkRmFjdG9yeSgKKyAgICAgICAgICAgIFRocmVhZEZhY3RvcnkgYmFja2luZ1RocmVhZEZhY3RvcnkpIHsKKyAgICAgICAgdGhpcy5iYWNraW5nVGhyZWFkRmFjdG9yeSA9IGNoZWNrTm90TnVsbChiYWNraW5nVGhyZWFkRmFjdG9yeSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBuZXcgdGhyZWFkIGZhY3RvcnkgdXNpbmcgdGhlIG9wdGlvbnMgc3VwcGxpZWQgZHVyaW5nIHRoZSBidWlsZGluZworICAgICAqIHByb2Nlc3MuIEFmdGVyIGJ1aWxkaW5nLCBpdCBpcyBzdGlsbCBwb3NzaWJsZSB0byBjaGFuZ2UgdGhlIG9wdGlvbnMgdXNlZCB0bworICAgICAqIGJ1aWxkIHRoZSBUaHJlYWRGYWN0b3J5IGFuZC9vciBidWlsZCBhZ2Fpbi4gU3RhdGUgaXMgbm90IHNoYXJlZCBhbW9uZ3N0CisgICAgICogYnVpbHQgaW5zdGFuY2VzLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZnVsbHkgY29uc3RydWN0ZWQge0BsaW5rIFRocmVhZEZhY3Rvcnl9CisgICAgICovCisgICAgcHVibGljIFRocmVhZEZhY3RvcnkgYnVpbGQoKSB7CisgICAgICAgIHJldHVybiBidWlsZCh0aGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL1RpY2tlci5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9UaWNrZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGJhYmI2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9UaWNrZXIuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBHdWF2YSBBdXRob3JzCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhOworCisvKioKKyAqIEEgdGltZSBzb3VyY2U7IHJldHVybnMgYSB0aW1lIHZhbHVlIHJlcHJlc2VudGluZyB0aGUgbnVtYmVyIG9mIG5hbm9zZWNvbmRzIGVsYXBzZWQgc2luY2Ugc29tZQorICogZml4ZWQgYnV0IGFyYml0cmFyeSBwb2ludCBpbiB0aW1lLiBOb3RlIHRoYXQgbW9zdCB1c2VycyBzaG91bGQgdXNlIHtAbGluayBTdG9wd2F0Y2h9IGluc3RlYWQgb2YKKyAqIGludGVyYWN0aW5nIHdpdGggdGhpcyBjbGFzcyBkaXJlY3RseS4KKyAqIDxwPgorICogPHA+PGI+V2FybmluZzo8L2I+IHRoaXMgaW50ZXJmYWNlIGNhbiBvbmx5IGJlIHVzZWQgdG8gbWVhc3VyZSBlbGFwc2VkIHRpbWUsIG5vdCB3YWxsIHRpbWUuCisgKgorICogQGF1dGhvciBLZXZpbiBCb3VycmlsbGlvbgorICogQHNpbmNlIDEwLjAKKyAqICg8YSBocmVmPSJodHRwOi8vY29kZS5nb29nbGUuY29tL3AvZ3VhdmEtbGlicmFyaWVzL3dpa2kvQ29tcGF0aWJpbGl0eSIKKyAqID5tb3N0bHkgc291cmNlLWNvbXBhdGlibGU8L2E+IHNpbmNlIDkuMCkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFRpY2tlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGlja2VyIFNZU1RFTV9USUNLRVIgPSBuZXcgVGlja2VyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgcmVhZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBQbGF0Zm9ybS5zeXN0ZW1OYW5vVGltZSgpOworICAgICAgICB9CisgICAgfTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciB1c2UgYnkgc3ViY2xhc3Nlcy4KKyAgICAgKi8KKyAgICBUaWNrZXIoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSB0aWNrZXIgdGhhdCByZWFkcyB0aGUgY3VycmVudCB0aW1lIHVzaW5nIHtAbGluayBTeXN0ZW0jbmFub1RpbWV9LgorICAgICAqCisgICAgICogQHNpbmNlIDEwLjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFRpY2tlciBzeXN0ZW1UaWNrZXIoKSB7CisgICAgICAgIHJldHVybiBTWVNURU1fVElDS0VSOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBuYW5vc2Vjb25kcyBlbGFwc2VkIHNpbmNlIHRoaXMgdGlja2VyJ3MgZml4ZWQKKyAgICAgKiBwb2ludCBvZiByZWZlcmVuY2UuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGxvbmcgcmVhZCgpOworfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9UcmFuc2Zvcm1lZEl0ZXJhdG9yLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL1RyYW5zZm9ybWVkSXRlcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWE3YmZlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9UcmFuc2Zvcm1lZEl0ZXJhdG9yLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgR3VhdmEgQXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YTsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IHN0YXRpYyBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YS5QcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbDsKKworLyoqCisgKiBBbiBpdGVyYXRvciB0aGF0IHRyYW5zZm9ybXMgYSBiYWNraW5nIGl0ZXJhdG9yOyBmb3IgaW50ZXJuYWwgdXNlLiBUaGlzIGF2b2lkcworICogdGhlIG9iamVjdCBvdmVyaGVhZCBvZiBjb25zdHJ1Y3RpbmcgYSB7QGxpbmsgRnVuY3Rpb259IGZvciBpbnRlcm5hbCBtZXRob2RzLgorICoKKyAqIEBhdXRob3IgTG91aXMgV2Fzc2VybWFuCisgKi8KK2Fic3RyYWN0IGNsYXNzIFRyYW5zZm9ybWVkSXRlcmF0b3I8RiwgVD4gaW1wbGVtZW50cyBJdGVyYXRvcjxUPiB7CisgICAgcHJpdmF0ZSBmaW5hbCBJdGVyYXRvcjw/IGV4dGVuZHMgRj4gYmFja2luZ0l0ZXJhdG9yOworCisgICAgVHJhbnNmb3JtZWRJdGVyYXRvcihJdGVyYXRvcjw/IGV4dGVuZHMgRj4gYmFja2luZ0l0ZXJhdG9yKSB7CisgICAgICAgIHRoaXMuYmFja2luZ0l0ZXJhdG9yID0gY2hlY2tOb3ROdWxsKGJhY2tpbmdJdGVyYXRvcik7CisgICAgfQorCisgICAgYWJzdHJhY3QgVCB0cmFuc2Zvcm0oRiBmcm9tKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgIHJldHVybiBiYWNraW5nSXRlcmF0b3IuaGFzTmV4dCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmaW5hbCBUIG5leHQoKSB7CisgICAgICAgIHJldHVybiB0cmFuc2Zvcm0oYmFja2luZ0l0ZXJhdG9yLm5leHQoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZpbmFsIHZvaWQgcmVtb3ZlKCkgeworICAgICAgICBiYWNraW5nSXRlcmF0b3IucmVtb3ZlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9UcmVlTXVsdGltYXAuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvVHJlZU11bHRpbWFwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE0OWU4YQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvVHJlZU11bHRpbWFwLmphdmEKQEAgLTAsMCArMSwyMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgVGhlIEd1YXZhIEF1dGhvcnMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmE7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk5hdmlnYWJsZU1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTmF2aWdhYmxlU2V0OworaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CitpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmEuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2Yge0Bjb2RlIE11bHRpbWFwfSB3aG9zZSBrZXlzIGFuZCB2YWx1ZXMgYXJlIG9yZGVyZWQgYnkKKyAqIHRoZWlyIG5hdHVyYWwgb3JkZXJpbmcgb3IgYnkgc3VwcGxpZWQgY29tcGFyYXRvcnMuIEluIGFsbCBjYXNlcywgdGhpcworICogaW1wbGVtZW50YXRpb24gdXNlcyB7QGxpbmsgQ29tcGFyYWJsZSNjb21wYXJlVG99IG9yIHtAbGluaworICogQ29tcGFyYXRvciNjb21wYXJlfSBpbnN0ZWFkIG9mIHtAbGluayBPYmplY3QjZXF1YWxzfSB0byBkZXRlcm1pbmUKKyAqIGVxdWl2YWxlbmNlIG9mIGluc3RhbmNlcy4KKyAqIDxwPgorICogPHA+PGI+V2FybmluZzo8L2I+IFRoZSBjb21wYXJhdG9ycyBvciBjb21wYXJhYmxlcyB1c2VkIG11c3QgYmUgPGk+Y29uc2lzdGVudAorICogd2l0aCBlcXVhbHM8L2k+IGFzIGV4cGxhaW5lZCBieSB0aGUge0BsaW5rIENvbXBhcmFibGV9IGNsYXNzIHNwZWNpZmljYXRpb24uCisgKiBPdGhlcndpc2UsIHRoZSByZXN1bHRpbmcgbXVsdGlzZXQgd2lsbCB2aW9sYXRlIHRoZSBnZW5lcmFsIGNvbnRyYWN0IG9mIHtAbGluaworICogU2V0TXVsdGltYXB9LCB3aGljaCBpdCBpcyBzcGVjaWZpZWQgaW4gdGVybXMgb2Yge0BsaW5rIE9iamVjdCNlcXVhbHN9LgorICogPHA+CisgKiA8cD5UaGUgY29sbGVjdGlvbnMgcmV0dXJuZWQgYnkge0Bjb2RlIGtleVNldH0gYW5kIHtAY29kZSBhc01hcH0gaXRlcmF0ZQorICogdGhyb3VnaCB0aGUga2V5cyBhY2NvcmRpbmcgdG8gdGhlIGtleSBjb21wYXJhdG9yIG9yZGVyaW5nIG9yIHRoZSBuYXR1cmFsCisgKiBvcmRlcmluZyBvZiB0aGUga2V5cy4gU2ltaWxhcmx5LCB7QGNvZGUgZ2V0fSwge0Bjb2RlIHJlbW92ZUFsbH0sIGFuZCB7QGNvZGUKKyAqIHJlcGxhY2VWYWx1ZXN9IHJldHVybiBjb2xsZWN0aW9ucyB0aGF0IGl0ZXJhdGUgdGhyb3VnaCB0aGUgdmFsdWVzIGFjY29yZGluZworICogdG8gdGhlIHZhbHVlIGNvbXBhcmF0b3Igb3JkZXJpbmcgb3IgdGhlIG5hdHVyYWwgb3JkZXJpbmcgb2YgdGhlIHZhbHVlcy4gVGhlCisgKiBjb2xsZWN0aW9ucyBnZW5lcmF0ZWQgYnkge0Bjb2RlIGVudHJpZXN9LCB7QGNvZGUga2V5c30sIGFuZCB7QGNvZGUgdmFsdWVzfQorICogaXRlcmF0ZSBhY3Jvc3MgdGhlIGtleXMgYWNjb3JkaW5nIHRvIHRoZSBhYm92ZSBrZXkgb3JkZXJpbmcsIGFuZCBmb3IgZWFjaAorICoga2V5IHRoZXkgaXRlcmF0ZSBhY3Jvc3MgdGhlIHZhbHVlcyBhY2NvcmRpbmcgdG8gdGhlIHZhbHVlIG9yZGVyaW5nLgorICogPHA+CisgKiA8cD5UaGUgbXVsdGltYXAgZG9lcyBub3Qgc3RvcmUgZHVwbGljYXRlIGtleS12YWx1ZSBwYWlycy4gQWRkaW5nIGEgbmV3CisgKiBrZXktdmFsdWUgcGFpciBlcXVhbCB0byBhbiBleGlzdGluZyBrZXktdmFsdWUgcGFpciBoYXMgbm8gZWZmZWN0LgorICogPHA+CisgKiA8cD5OdWxsIGtleXMgYW5kIHZhbHVlcyBhcmUgcGVybWl0dGVkIChwcm92aWRlZCwgb2YgY291cnNlLCB0aGF0IHRoZQorICogcmVzcGVjdGl2ZSBjb21wYXJhdG9ycyBzdXBwb3J0IHRoZW0pLiBBbGwgb3B0aW9uYWwgbXVsdGltYXAgbWV0aG9kcyBhcmUKKyAqIHN1cHBvcnRlZCwgYW5kIGFsbCByZXR1cm5lZCB2aWV3cyBhcmUgbW9kaWZpYWJsZS4KKyAqIDxwPgorICogPHA+VGhpcyBjbGFzcyBpcyBub3QgdGhyZWFkc2FmZSB3aGVuIGFueSBjb25jdXJyZW50IG9wZXJhdGlvbnMgdXBkYXRlIHRoZQorICogbXVsdGltYXAuIENvbmN1cnJlbnQgcmVhZCBvcGVyYXRpb25zIHdpbGwgd29yayBjb3JyZWN0bHkuIFRvIGFsbG93IGNvbmN1cnJlbnQKKyAqIHVwZGF0ZSBvcGVyYXRpb25zLCB3cmFwIHlvdXIgbXVsdGltYXAgd2l0aCBhIGNhbGwgdG8ge0BsaW5rCisgKiBNdWx0aW1hcHMjc3luY2hyb25pemVkU29ydGVkU2V0TXVsdGltYXB9LgorICogPHA+CisgKiA8cD5TZWUgdGhlIEd1YXZhIFVzZXIgR3VpZGUgYXJ0aWNsZSBvbiA8YSBocmVmPQorICogImh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9ndWF2YS1saWJyYXJpZXMvd2lraS9OZXdDb2xsZWN0aW9uVHlwZXNFeHBsYWluZWQjTXVsdGltYXAiPgorICoge0Bjb2RlIE11bHRpbWFwfTwvYT4uCisgKgorICogQGF1dGhvciBKYXJlZCBMZXZ5CisgKiBAYXV0aG9yIExvdWlzIFdhc3Nlcm1hbgorICogQHNpbmNlIDIuMCAoaW1wb3J0ZWQgZnJvbSBHb29nbGUgQ29sbGVjdGlvbnMgTGlicmFyeSkKKyAqLworcHVibGljIGNsYXNzIFRyZWVNdWx0aW1hcDxLLCBWPiBleHRlbmRzIEFic3RyYWN0U29ydGVkS2V5U29ydGVkU2V0TXVsdGltYXA8SywgVj4geworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDA7CisgICAgcHJpdmF0ZSB0cmFuc2llbnQgQ29tcGFyYXRvcjw/IHN1cGVyIEs+IGtleUNvbXBhcmF0b3I7CisgICAgcHJpdmF0ZSB0cmFuc2llbnQgQ29tcGFyYXRvcjw/IHN1cGVyIFY+IHZhbHVlQ29tcGFyYXRvcjsKKworICAgIHByaXZhdGUgVHJlZU11bHRpbWFwKENvbXBhcmF0b3I8PyBzdXBlciBLPiBrZXlDb21wYXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBhcmF0b3I8PyBzdXBlciBWPiB2YWx1ZUNvbXBhcmF0b3IpIHsKKyAgICAgICAgc3VwZXIobmV3IFRyZWVNYXA8SywgQ29sbGVjdGlvbjxWPj4oa2V5Q29tcGFyYXRvcikpOworICAgICAgICB0aGlzLmtleUNvbXBhcmF0b3IgPSBrZXlDb21wYXJhdG9yOworICAgICAgICB0aGlzLnZhbHVlQ29tcGFyYXRvciA9IHZhbHVlQ29tcGFyYXRvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIGVtcHR5IHtAY29kZSBUcmVlTXVsdGltYXB9IG9yZGVyZWQgYnkgdGhlIG5hdHVyYWwgb3JkZXJpbmcgb2YKKyAgICAgKiBpdHMga2V5cyBhbmQgdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPEsgZXh0ZW5kcyBDb21wYXJhYmxlLCBWIGV4dGVuZHMgQ29tcGFyYWJsZT4KKyAgICBUcmVlTXVsdGltYXA8SywgVj4gY3JlYXRlKCkgeworICAgICAgICByZXR1cm4gbmV3IFRyZWVNdWx0aW1hcDxLLCBWPihPcmRlcmluZy5uYXR1cmFsKCksIE9yZGVyaW5nLm5hdHVyYWwoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqIDxwPgorICAgICAqIDxwPkNyZWF0ZXMgYW4gZW1wdHkge0Bjb2RlIFRyZWVTZXR9IGZvciBhIGNvbGxlY3Rpb24gb2YgdmFsdWVzIGZvciBvbmUga2V5LgorICAgICAqCisgICAgICogQHJldHVybiBhIG5ldyB7QGNvZGUgVHJlZVNldH0gY29udGFpbmluZyBhIGNvbGxlY3Rpb24gb2YgdmFsdWVzIGZvciBvbmUKKyAgICAgKiBrZXkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBTb3J0ZWRTZXQ8Vj4gY3JlYXRlQ29sbGVjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUcmVlU2V0PFY+KHZhbHVlQ29tcGFyYXRvcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQ29sbGVjdGlvbjxWPiBjcmVhdGVDb2xsZWN0aW9uKEsga2V5KSB7CisgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgeworICAgICAgICAgICAga2V5Q29tcGFyYXRvcigpLmNvbXBhcmUoa2V5LCBrZXkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5jcmVhdGVDb2xsZWN0aW9uKGtleSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY29tcGFyYXRvciB0aGF0IG9yZGVycyB0aGUgbXVsdGltYXAga2V5cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIENvbXBhcmF0b3I8PyBzdXBlciBLPiBrZXlDb21wYXJhdG9yKCkgeworICAgICAgICByZXR1cm4ga2V5Q29tcGFyYXRvcjsKKyAgICB9CisKKyAgLyoKKyAgICogVGhlIGZvbGxvd2luZyBAR3d0SW5jb21wYXRpYmxlIG1ldGhvZHMgb3ZlcnJpZGUgdGhlIG1ldGhvZHMgaW4KKyAgICogQWJzdHJhY3RTb3J0ZWRLZXlTb3J0ZWRTZXRNdWx0aW1hcCwgc28gR1dUIHdpbGwgZmFsbCBiYWNrIHRvIHRoZSBBU0tTU00gaW1wbGVtZW50YXRpb25zLAorICAgKiB3aGljaCByZXR1cm4gU29ydGVkU2V0cyBhbmQgU29ydGVkTWFwcy4KKyAgICovCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29tcGFyYXRvcjw/IHN1cGVyIFY+IHZhbHVlQ29tcGFyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlQ29tcGFyYXRvcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBOYXZpZ2FibGVNYXA8SywgQ29sbGVjdGlvbjxWPj4gYmFja2luZ01hcCgpIHsKKyAgICAgICAgcmV0dXJuIChOYXZpZ2FibGVNYXA8SywgQ29sbGVjdGlvbjxWPj4pIHN1cGVyLmJhY2tpbmdNYXAoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2luY2UgMTQuMCAocHJlc2VudCB3aXRoIHJldHVybiB0eXBlIHtAY29kZSBTb3J0ZWRTZXR9IHNpbmNlIDIuMCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTmF2aWdhYmxlU2V0PFY+IGdldChLIGtleSkgeworICAgICAgICByZXR1cm4gKE5hdmlnYWJsZVNldDxWPikgc3VwZXIuZ2V0KGtleSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQ29sbGVjdGlvbjxWPiB1bm1vZGlmaWFibGVDb2xsZWN0aW9uU3ViY2xhc3MoQ29sbGVjdGlvbjxWPiBjb2xsZWN0aW9uKSB7CisgICAgICAgIHJldHVybiBTZXRzLnVubW9kaWZpYWJsZU5hdmlnYWJsZVNldCgoTmF2aWdhYmxlU2V0PFY+KSBjb2xsZWN0aW9uKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBDb2xsZWN0aW9uPFY+IHdyYXBDb2xsZWN0aW9uKEsga2V5LCBDb2xsZWN0aW9uPFY+IGNvbGxlY3Rpb24pIHsKKyAgICAgICAgcmV0dXJuIG5ldyBXcmFwcGVkTmF2aWdhYmxlU2V0KGtleSwgKE5hdmlnYWJsZVNldDxWPikgY29sbGVjdGlvbiwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqIDxwPgorICAgICAqIDxwPkJlY2F1c2UgYSB7QGNvZGUgVHJlZU11bHRpbWFwfSBoYXMgdW5pcXVlIHNvcnRlZCBrZXlzLCB0aGlzIG1ldGhvZAorICAgICAqIHJldHVybnMgYSB7QGxpbmsgTmF2aWdhYmxlU2V0fSwgaW5zdGVhZCBvZiB0aGUge0BsaW5rIGphdmEudXRpbC5TZXR9IHNwZWNpZmllZAorICAgICAqIGluIHRoZSB7QGxpbmsgTXVsdGltYXB9IGludGVyZmFjZS4KKyAgICAgKgorICAgICAqIEBzaW5jZSAxNC4wIChwcmVzZW50IHdpdGggcmV0dXJuIHR5cGUge0Bjb2RlIFNvcnRlZFNldH0gc2luY2UgMi4wKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBOYXZpZ2FibGVTZXQ8Sz4ga2V5U2V0KCkgeworICAgICAgICByZXR1cm4gKE5hdmlnYWJsZVNldDxLPikgc3VwZXIua2V5U2V0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgTmF2aWdhYmxlU2V0PEs+IGNyZWF0ZUtleVNldCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBOYXZpZ2FibGVLZXlTZXQoYmFja2luZ01hcCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICogPHA+CisgICAgICogPHA+QmVjYXVzZSBhIHtAY29kZSBUcmVlTXVsdGltYXB9IGhhcyB1bmlxdWUgc29ydGVkIGtleXMsIHRoaXMgbWV0aG9kCisgICAgICogcmV0dXJucyBhIHtAbGluayBOYXZpZ2FibGVNYXB9LCBpbnN0ZWFkIG9mIHRoZSB7QGxpbmsgamF2YS51dGlsLk1hcH0gc3BlY2lmaWVkCisgICAgICogaW4gdGhlIHtAbGluayBNdWx0aW1hcH0gaW50ZXJmYWNlLgorICAgICAqCisgICAgICogQHNpbmNlIDE0LjAgKHByZXNlbnQgd2l0aCByZXR1cm4gdHlwZSB7QGNvZGUgU29ydGVkTWFwfSBzaW5jZSAyLjApCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE5hdmlnYWJsZU1hcDxLLCBDb2xsZWN0aW9uPFY+PiBhc01hcCgpIHsKKyAgICAgICAgcmV0dXJuIChOYXZpZ2FibGVNYXA8SywgQ29sbGVjdGlvbjxWPj4pIHN1cGVyLmFzTWFwKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgTmF2aWdhYmxlTWFwPEssIENvbGxlY3Rpb248Vj4+IGNyZWF0ZUFzTWFwKCkgeworICAgICAgICByZXR1cm4gbmV3IE5hdmlnYWJsZUFzTWFwKGJhY2tpbmdNYXAoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlcmlhbERhdGEga2V5IGNvbXBhcmF0b3IsIHZhbHVlIGNvbXBhcmF0b3IsIG51bWJlciBvZiBkaXN0aW5jdCBrZXlzLCBhbmQKKyAgICAgKiB0aGVuIGZvciBlYWNoIGRpc3RpbmN0IGtleTogdGhlIGtleSwgbnVtYmVyIG9mIHZhbHVlcyBmb3IgdGhhdCBrZXksIGFuZAorICAgICAqIGtleSB2YWx1ZXMKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoT2JqZWN0T3V0cHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgc3RyZWFtLmRlZmF1bHRXcml0ZU9iamVjdCgpOworICAgICAgICBzdHJlYW0ud3JpdGVPYmplY3Qoa2V5Q29tcGFyYXRvcigpKTsKKyAgICAgICAgc3RyZWFtLndyaXRlT2JqZWN0KHZhbHVlQ29tcGFyYXRvcigpKTsKKyAgICAgICAgU2VyaWFsaXphdGlvbi53cml0ZU11bHRpbWFwKHRoaXMsIHN0cmVhbSk7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIC8vIHJlYWRpbmcgZGF0YSBzdG9yZWQgYnkgd3JpdGVPYmplY3QKKyAgICBwcml2YXRlIHZvaWQgcmVhZE9iamVjdChPYmplY3RJbnB1dFN0cmVhbSBzdHJlYW0pCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBzdHJlYW0uZGVmYXVsdFJlYWRPYmplY3QoKTsKKyAgICAgICAga2V5Q29tcGFyYXRvciA9IGNoZWNrTm90TnVsbCgoQ29tcGFyYXRvcjw/IHN1cGVyIEs+KSBzdHJlYW0ucmVhZE9iamVjdCgpKTsKKyAgICAgICAgdmFsdWVDb21wYXJhdG9yID0gY2hlY2tOb3ROdWxsKChDb21wYXJhdG9yPD8gc3VwZXIgVj4pIHN0cmVhbS5yZWFkT2JqZWN0KCkpOworICAgICAgICBzZXRNYXAobmV3IFRyZWVNYXA8SywgQ29sbGVjdGlvbjxWPj4oa2V5Q29tcGFyYXRvcikpOworICAgICAgICBTZXJpYWxpemF0aW9uLnBvcHVsYXRlTXVsdGltYXAodGhpcywgc3RyZWFtKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL1VuY2hlY2tlZEV4ZWN1dGlvbkV4Y2VwdGlvbi5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9VbmNoZWNrZWRFeGVjdXRpb25FeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGM3NTNlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9VbmNoZWNrZWRFeGVjdXRpb25FeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBHdWF2YSBBdXRob3JzCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhOworCisvKioKKyAqIFVuY2hlY2tlZCB2YXJpYW50IG9mIHtAbGluayBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb259LiBBcyB3aXRoCisgKiB7QGNvZGUgRXhlY3V0aW9uRXhjZXB0aW9ufSwgdGhlIGV4Y2VwdGlvbidzIHtAbGlua3BsYWluICNnZXRDYXVzZSgpIGNhdXNlfQorICogY29tZXMgZnJvbSBhIGZhaWxlZCB0YXNrLCBwb3NzaWJseSBydW4gaW4gYW5vdGhlciB0aHJlYWQuCisgKiA8cD4KKyAqIDxwPntAY29kZSBVbmNoZWNrZWRFeGVjdXRpb25FeGNlcHRpb259IGlzIGludGVuZGVkIGFzIGFuIGFsdGVybmF0aXZlIHRvCisgKiB7QGNvZGUgRXhlY3V0aW9uRXhjZXB0aW9ufSB3aGVuIHRoZSBleGNlcHRpb24gdGhyb3duIGJ5IGEgdGFzayBpcyBhbgorICogdW5jaGVja2VkIGV4Y2VwdGlvbi4gSG93ZXZlciwgaXQgbWF5IGFsc28gd3JhcCBhIGNoZWNrZWQgZXhjZXB0aW9uIGluIHNvbWUKKyAqIGNhc2VzLgorICogPHA+CisgKiA8cD5XaGVuIHdyYXBwaW5nIGFuIHtAY29kZSBFcnJvcn0gZnJvbSBhbm90aGVyIHRocmVhZCwgcHJlZmVyIHtAbGluaworICogRXhlY3V0aW9uRXJyb3J9LiBXaGVuIHdyYXBwaW5nIGEgY2hlY2tlZCBleGNlcHRpb24sIHByZWZlciB7QGNvZGUKKyAqIEV4ZWN1dGlvbkV4Y2VwdGlvbn0uCisgKgorICogQGF1dGhvciBDaGFybGVzIEZyeQorICogQHNpbmNlIDEwLjAKKyAqLworcHVibGljIGNsYXNzIFVuY2hlY2tlZEV4ZWN1dGlvbkV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugd2l0aCB0aGUgZ2l2ZW4gY2F1c2UuCisgICAgICovCisgICAgcHVibGljIFVuY2hlY2tlZEV4ZWN1dGlvbkV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgICAgc3VwZXIoY2F1c2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvVW5pbnRlcnJ1cHRpYmxlcy5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9VbmludGVycnVwdGlibGVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE1NmRjYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvVW5pbnRlcnJ1cHRpYmxlcy5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEd1YXZhIEF1dGhvcnMKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYW5jZWxsYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKKworLyoqCisgKiBVdGlsaXRpZXMgZm9yIHRyZWF0aW5nIGludGVycnVwdGlibGUgb3BlcmF0aW9ucyBhcyB1bmludGVycnVwdGlibGUuCisgKiBJbiBhbGwgY2FzZXMsIGlmIGEgdGhyZWFkIGlzIGludGVycnVwdGVkIGR1cmluZyBzdWNoIGEgY2FsbCwgdGhlIGNhbGwKKyAqIGNvbnRpbnVlcyB0byBibG9jayB1bnRpbCB0aGUgcmVzdWx0IGlzIGF2YWlsYWJsZSBvciB0aGUgdGltZW91dCBlbGFwc2VzLAorICogYW5kIG9ubHkgdGhlbiByZS1pbnRlcnJ1cHRzIHRoZSB0aHJlYWQuCisgKgorICogQGF1dGhvciBBbnRob255IFphbmEKKyAqIEBzaW5jZSAxMC4wCisgKi8KK2ZpbmFsIGNsYXNzIFVuaW50ZXJydXB0aWJsZXMgeworCisgICAgLy8gSW1wbGVtZW50YXRpb24gTm90ZTogQXMgb2YgMy03LTExLCB0aGUgbG9naWMgZm9yIGVhY2ggYmxvY2tpbmcvdGltZW91dAorICAgIC8vIG1ldGhvZHMgaXMgaWRlbnRpY2FsLCBzYXZlIGZvciBtZXRob2QgYmVpbmcgaW52b2tlZC4KKworICAgIHByaXZhdGUgVW5pbnRlcnJ1cHRpYmxlcygpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZva2VzIHtAY29kZSBmdXR1cmUufXtAbGluayBGdXR1cmUjZ2V0KCkgZ2V0KCl9IHVuaW50ZXJydXB0aWJseS4KKyAgICAgKiBUbyBnZXQgdW5pbnRlcnJ1cHRpYmlsaXR5IGFuZCByZW1vdmUgY2hlY2tlZCBleGNlcHRpb25zLCBzZWUKKyAgICAgKiB7QGxpbmsgRnV0dXJlcyNnZXRVbmNoZWNrZWR9LgorICAgICAqIDxwPgorICAgICAqIDxwPklmIGluc3RlYWQsIHlvdSB3aXNoIHRvIHRyZWF0IHtAbGluayBJbnRlcnJ1cHRlZEV4Y2VwdGlvbn0gdW5pZm9ybWx5CisgICAgICogd2l0aCBvdGhlciBleGNlcHRpb25zLCBzZWUge0BsaW5rIEZ1dHVyZXMjZ2V0KEZ1dHVyZSwgQ2xhc3MpIEZ1dHVyZXMuZ2V0fQorICAgICAqIG9yIHtAbGluayBGdXR1cmVzI21ha2VDaGVja2VkfS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uICAgIGlmIHRoZSBjb21wdXRhdGlvbiB0aHJldyBhbiBleGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIENhbmNlbGxhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgY29tcHV0YXRpb24gd2FzIGNhbmNlbGxlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFY+IFYgZ2V0VW5pbnRlcnJ1cHRpYmx5KEZ1dHVyZTxWPiBmdXR1cmUpCisgICAgICAgICAgICB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgYm9vbGVhbiBpbnRlcnJ1cHRlZCA9IGZhbHNlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnV0dXJlLmdldCgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChpbnRlcnJ1cHRlZCkgeworICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL1VubW9kaWZpYWJsZUl0ZXJhdG9yLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL1VubW9kaWZpYWJsZUl0ZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ3MThiMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvVW5tb2RpZmlhYmxlSXRlcmF0b3IuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA4IFRoZSBHdWF2YSBBdXRob3JzCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCisvKioKKyAqIEFuIGl0ZXJhdG9yIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCB7QGxpbmsgI3JlbW92ZX0uCisgKgorICogQGF1dGhvciBKYXJlZCBMZXZ5CisgKiBAc2luY2UgMi4wIChpbXBvcnRlZCBmcm9tIEdvb2dsZSBDb2xsZWN0aW9ucyBMaWJyYXJ5KQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVW5tb2RpZmlhYmxlSXRlcmF0b3I8RT4gaW1wbGVtZW50cyBJdGVyYXRvcjxFPiB7CisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIHVzZSBieSBzdWJjbGFzc2VzLgorICAgICAqLworICAgIFVubW9kaWZpYWJsZUl0ZXJhdG9yKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIEd1YXJhbnRlZWQgdG8gdGhyb3cgYW4gZXhjZXB0aW9uIGFuZCBsZWF2ZSB0aGUgdW5kZXJseWluZyBkYXRhIHVubW9kaWZpZWQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGFsd2F5cworICAgICAqIEBkZXByZWNhdGVkIFVuc3VwcG9ydGVkIG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZSgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS9Vbm1vZGlmaWFibGVMaXN0SXRlcmF0b3IuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvVW5tb2RpZmlhYmxlTGlzdEl0ZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZjNGNkMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvVW5tb2RpZmlhYmxlTGlzdEl0ZXJhdG9yLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgR3VhdmEgQXV0aG9ycworICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CisKKy8qKgorICogQSBsaXN0IGl0ZXJhdG9yIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCB7QGxpbmsgI3JlbW92ZX0sIHtAbGluayAjYWRkfSwgb3IKKyAqIHtAbGluayAjc2V0fS4KKyAqCisgKiBAYXV0aG9yIExvdWlzIFdhc3Nlcm1hbgorICogQHNpbmNlIDcuMAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVW5tb2RpZmlhYmxlTGlzdEl0ZXJhdG9yPEU+CisgICAgICAgIGV4dGVuZHMgVW5tb2RpZmlhYmxlSXRlcmF0b3I8RT4gaW1wbGVtZW50cyBMaXN0SXRlcmF0b3I8RT4geworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGZvciB1c2UgYnkgc3ViY2xhc3Nlcy4KKyAgICAgKi8KKyAgICBVbm1vZGlmaWFibGVMaXN0SXRlcmF0b3IoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogR3VhcmFudGVlZCB0byB0aHJvdyBhbiBleGNlcHRpb24gYW5kIGxlYXZlIHRoZSB1bmRlcmx5aW5nIGRhdGEgdW5tb2RpZmllZC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gYWx3YXlzCisgICAgICogQGRlcHJlY2F0ZWQgVW5zdXBwb3J0ZWQgb3BlcmF0aW9uLgorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZpbmFsIHZvaWQgYWRkKEUgZSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHdWFyYW50ZWVkIHRvIHRocm93IGFuIGV4Y2VwdGlvbiBhbmQgbGVhdmUgdGhlIHVuZGVybHlpbmcgZGF0YSB1bm1vZGlmaWVkLgorICAgICAqCisgICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBhbHdheXMKKyAgICAgKiBAZGVwcmVjYXRlZCBVbnN1cHBvcnRlZCBvcGVyYXRpb24uCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXQoRSBlKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvZ3VhdmEvcGFja2FnZS1pbmZvLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYjQwZjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2d1YXZhL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisvKgorICogQ29kZSB0YWtlbiBmcm9tIEd1YXZhLgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhOwpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9pbmplY3QvQWJzdHJhY3RCaW5kZXIuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvaW5qZWN0L0Fic3RyYWN0QmluZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFlN2ZmYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvaW5qZWN0L0Fic3RyYWN0QmluZGVyLmphdmEKQEAgLTAsMCArMSwyNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0OworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljVHlwZTsKKworaW1wb3J0IGphdmF4LmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHtAbGluayBCaW5kZXJ9IGludGVyZmFjZSBkZWRpY2F0ZWQgdG8ga2VlcCBzb21lIGxldmVsIG9mIGNvZGUgY29tcGF0aWJpbGl0eSBiZXR3ZWVuIHByZXZpb3VzIEhLMgorICogaW1wbGVtZW50YXRpb24gYW5kIG5ldyBESSBTUEkuCisgKiA8cD4KKyAqIEN1cnJlbnRseSwgdGhlcmUgYXJlIHN1cHBvcnRlZCBvbmx5IGJpbmQgbWV0aG9kIGFuZCBtb3JlIGNvbXBsaWNhdGVkIG1ldGhvZCB3aGVyZSBISzIgaW50ZXJmYWNlcyBhcmUgcmVxdWlyZWQgd2VyZSBvbWl0dGVkLgorICoKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RCaW5kZXIgaW1wbGVtZW50cyBCaW5kZXIgeworCisgICAgcHJpdmF0ZSBMaXN0PEJpbmRpbmc+IGludGVybmFsQmluZGluZ3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgIHByaXZhdGUgTGlzdDxBYnN0cmFjdEJpbmRlcj4gaW5zdGFsbGVkID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICBwcml2YXRlIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlcjsKKworICAgIHByaXZhdGUgYm9vbGVhbiBjb25maWd1cmVkID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnQgdG8gcHJvdmlkZSBiaW5kaW5nIGRlZmluaXRpb25zIHVzaW5nIHRoZSBleHBvc2VkIGJpbmRpbmcgbWV0aG9kcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBjb25maWd1cmUoKTsKKworICAgIC8qKgorICAgICAqIFNldHMge0BsaW5rIEluamVjdGlvbk1hbmFnZXJ9IHRvIGJlIGFibGUgdG8gY3JlYXRlIGluc3RhbmNlIHByb3ZpZGVycyB1c2luZyB0aGUgaW5qZWN0aW9uIG1hbmFnZXIuIHtAY29kZSBJbmplY3Rpb25NYW5hZ2VyfQorICAgICAqIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBpbnZvY2F0aW9uIG9mIHtAbGluayAjY29uZmlndXJlKCl9LCBvdGhlcndpc2UgaW1tZWRpYXRlIGludm9jYXRpb24ge0BsaW5rIFByb3ZpZGVyI2dldCgpfQorICAgICAqIHJldHVybnMKKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbiBtYW5hZ2VyIHRvIGNyZWF0ZSBhIHByb3ZpZGVyLgorICAgICAqLworICAgIHZvaWQgc2V0SW5qZWN0aW9uTWFuYWdlcihJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIpIHsKKyAgICAgICAgdGhpcy5pbmplY3Rpb25NYW5hZ2VyID0gaW5qZWN0aW9uTWFuYWdlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHtAbGluayBQcm92aWRlcn0gd2hpY2ggaXMgYWJsZSB0byByZXRyaWV2ZSBhIG1hbmFnZWQgaW5zdGFuY2UgcmVnaXN0ZXJlZCBpbgorICAgICAqIHtAbGluayBJbmplY3Rpb25NYW5hZ2VyfS4gSWYge0Bjb2RlIEluamVjdGlvbk1hbmFnZXJ9IGlzIHtAY29kZSBudWxsfSBhdCB0aGUgdGltZSBvZiBjYWxsaW5nIHtAbGluayBQcm92aWRlciNnZXQoKX0gdGhlbgorICAgICAqIHtAbGluayBJbGxlZ2FsU3RhdGVFeGNlcHRpb259IGlzIHRocm93bi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGF6eiBjbGFzcyBvZiBtYW5hZ2VkIGluc3RhbmNlLgorICAgICAqIEBwYXJhbSA8VD4gICB0eXBlIG9mIHRoZSBtYW5hZ2VkIGluc3RhbmNlIHJldHVybmVkIHVzaW5nIHByb3ZpZGVyLgorICAgICAqIEByZXR1cm4gcHJvdmlkZXIgd2l0aCBpbnN0YW5jZSBvZiBtYW5hZ2VkIGluc3RhbmNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCA8VD4gUHJvdmlkZXI8VD4gY3JlYXRlTWFuYWdlZEluc3RhbmNlUHJvdmlkZXIoQ2xhc3M8VD4gY2xhenopIHsKKyAgICAgICAgcmV0dXJuICgpIC0+IHsKKyAgICAgICAgICAgIGlmIChpbmplY3Rpb25NYW5hZ2VyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLklOSkVDVElPTl9NQU5BR0VSX05PVF9QUk9WSURFRCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKGNsYXp6KTsKKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBidWlsZGluZyBhIG5ldyBjbGFzcy1iYXNlZCBzZXJ2aWNlIGJpbmRpbmcuCisgICAgICogPHA+CisgICAgICogRG9lcyBOT1QgYmluZCB0aGUgc2VydmljZSB0eXBlIGl0c2VsZiBhcyBhIGNvbnRyYWN0IHR5cGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gPFQ+ICAgICAgICAgc2VydmljZSB0eXBlLgorICAgICAqIEBwYXJhbSBzZXJ2aWNlVHlwZSBzZXJ2aWNlIGNsYXNzLgorICAgICAqIEByZXR1cm4gaW5pdGlhbGl6ZWQgYmluZGluZyBidWlsZGVyLgorICAgICAqLworICAgIHB1YmxpYyA8VD4gQ2xhc3NCaW5kaW5nPFQ+IGJpbmQoQ2xhc3M8VD4gc2VydmljZVR5cGUpIHsKKyAgICAgICAgQ2xhc3NCaW5kaW5nPFQ+IGJpbmRpbmcgPSBCaW5kaW5ncy5zZXJ2aWNlKHNlcnZpY2VUeXBlKTsKKyAgICAgICAgaW50ZXJuYWxCaW5kaW5ncy5hZGQoYmluZGluZyk7CisgICAgICAgIHJldHVybiBiaW5kaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJpbmRzIHRoZSBwcm92aWRlZCBiaW5kaW5nIGFuZCByZXR1cm4gdGhlIHNhbWUgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmluZGluZyBiaW5kaW5nLgorICAgICAqIEByZXR1cm4gdGhlIHNhbWUgcHJvdmlkZWQgYmluZGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQmluZGluZyBiaW5kKEJpbmRpbmcgYmluZGluZykgeworICAgICAgICBpbnRlcm5hbEJpbmRpbmdzLmFkZChiaW5kaW5nKTsKKyAgICAgICAgcmV0dXJuIGJpbmRpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgYnVpbGRpbmcgYSBuZXcgY2xhc3MtYmFzZWQgc2VydmljZSBiaW5kaW5nLgorICAgICAqIDxwPgorICAgICAqIEJpbmRzIHRoZSBzZXJ2aWNlIHR5cGUgaXRzZWxmIGFzIGEgY29udHJhY3QgdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSA8VD4gICAgICAgICBzZXJ2aWNlIHR5cGUuCisgICAgICogQHBhcmFtIHNlcnZpY2VUeXBlIHNlcnZpY2UgY2xhc3MuCisgICAgICogQHJldHVybiBpbml0aWFsaXplZCBiaW5kaW5nIGJ1aWxkZXIuCisgICAgICovCisgICAgcHVibGljIDxUPiBDbGFzc0JpbmRpbmc8VD4gYmluZEFzQ29udHJhY3QoQ2xhc3M8VD4gc2VydmljZVR5cGUpIHsKKyAgICAgICAgQ2xhc3NCaW5kaW5nPFQ+IGJpbmRpbmcgPSBCaW5kaW5ncy5zZXJ2aWNlQXNDb250cmFjdChzZXJ2aWNlVHlwZSk7CisgICAgICAgIGludGVybmFsQmluZGluZ3MuYWRkKGJpbmRpbmcpOworICAgICAgICByZXR1cm4gYmluZGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBidWlsZGluZyBhIG5ldyBnZW5lcmljIHR5cGUtYmFzZWQgc2VydmljZSBiaW5kaW5nLgorICAgICAqIDxwPgorICAgICAqIEJpbmRzIHRoZSBnZW5lcmljIHNlcnZpY2UgdHlwZSBpdHNlbGYgYXMgYSBjb250cmFjdCB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIDxUPiAgICAgICAgIHNlcnZpY2UgdHlwZS4KKyAgICAgKiBAcGFyYW0gc2VydmljZVR5cGUgZ2VuZXJpYyBzZXJ2aWNlIHR5cGUgaW5mb3JtYXRpb24uCisgICAgICogQHJldHVybiBpbml0aWFsaXplZCBiaW5kaW5nIGJ1aWxkZXIuCisgICAgICovCisgICAgcHVibGljIDxUPiBDbGFzc0JpbmRpbmc8VD4gYmluZEFzQ29udHJhY3QoR2VuZXJpY1R5cGU8VD4gc2VydmljZVR5cGUpIHsKKyAgICAgICAgQ2xhc3NCaW5kaW5nPFQ+IGJpbmRpbmcgPSBCaW5kaW5ncy5zZXJ2aWNlKHNlcnZpY2VUeXBlKTsKKyAgICAgICAgaW50ZXJuYWxCaW5kaW5ncy5hZGQoYmluZGluZyk7CisgICAgICAgIHJldHVybiBiaW5kaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IGJ1aWxkaW5nIGEgbmV3IGdlbmVyaWMgdHlwZS1iYXNlZCBzZXJ2aWNlIGJpbmRpbmcuCisgICAgICogPHA+CisgICAgICogQmluZHMgdGhlIGdlbmVyaWMgc2VydmljZSB0eXBlIGl0c2VsZiBhcyBhIGNvbnRyYWN0IHR5cGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VydmljZVR5cGUgZ2VuZXJpYyBzZXJ2aWNlIHR5cGUgaW5mb3JtYXRpb24uCisgICAgICogQHJldHVybiBpbml0aWFsaXplZCBiaW5kaW5nIGJ1aWxkZXIuCisgICAgICovCisgICAgcHVibGljIENsYXNzQmluZGluZzxPYmplY3Q+IGJpbmRBc0NvbnRyYWN0KFR5cGUgc2VydmljZVR5cGUpIHsKKyAgICAgICAgQ2xhc3NCaW5kaW5nPE9iamVjdD4gYmluZGluZyA9IEJpbmRpbmdzLnNlcnZpY2VBc0NvbnRyYWN0KHNlcnZpY2VUeXBlKTsKKyAgICAgICAgaW50ZXJuYWxCaW5kaW5ncy5hZGQoYmluZGluZyk7CisgICAgICAgIHJldHVybiBiaW5kaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IGJ1aWxkaW5nIGEgbmV3IGluc3RhbmNlLWJhc2VkIHNlcnZpY2UgYmluZGluZy4gVGhlIGJpbmRpbmcgaXMgbmF0dXJhbGx5CisgICAgICogY29uc2lkZXJlZCB0byBiZSBhIHtAbGluayBqYXZheC5pbmplY3QuU2luZ2xldG9uIHNpbmdsZXRvbi1zY29wZWR9LgorICAgICAqIDxwPgorICAgICAqIERvZXMgTk9UIGJpbmQgdGhlIHNlcnZpY2UgdHlwZSBpdHNlbGYgYXMgYSBjb250cmFjdCB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIDxUPiAgICAgc2VydmljZSB0eXBlLgorICAgICAqIEBwYXJhbSBzZXJ2aWNlIHNlcnZpY2UgaW5zdGFuY2UuCisgICAgICogQHJldHVybiBpbml0aWFsaXplZCBiaW5kaW5nIGJ1aWxkZXIuCisgICAgICovCisgICAgcHVibGljIDxUPiBJbnN0YW5jZUJpbmRpbmc8VD4gYmluZChUIHNlcnZpY2UpIHsKKyAgICAgICAgSW5zdGFuY2VCaW5kaW5nPFQ+IGJpbmRpbmcgPSBCaW5kaW5ncy5zZXJ2aWNlKHNlcnZpY2UpOworICAgICAgICBpbnRlcm5hbEJpbmRpbmdzLmFkZChiaW5kaW5nKTsKKyAgICAgICAgcmV0dXJuIGJpbmRpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgYnVpbGRpbmcgYSBuZXcgc3VwcGxpZXIgY2xhc3MtYmFzZWQgc2VydmljZSBiaW5kaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIDxUPiAgICAgICAgICAgc2VydmljZSB0eXBlLgorICAgICAqIEBwYXJhbSBzdXBwbGllclR5cGUgIHNlcnZpY2Ugc3VwcGxpZXIgY2xhc3MuCisgICAgICogQHBhcmFtIHN1cHBsaWVyU2NvcGUgZmFjdG9yeSBzY29wZS4KKyAgICAgKiBAcmV0dXJuIGluaXRpYWxpemVkIGJpbmRpbmcgYnVpbGRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgPFQ+IFN1cHBsaWVyQ2xhc3NCaW5kaW5nPFQ+IGJpbmRGYWN0b3J5KAorICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFN1cHBsaWVyPFQ+PiBzdXBwbGllclR5cGUsIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBzdXBwbGllclNjb3BlKSB7CisgICAgICAgIFN1cHBsaWVyQ2xhc3NCaW5kaW5nPFQ+IGJpbmRpbmcgPSBCaW5kaW5ncy5zdXBwbGllcihzdXBwbGllclR5cGUsIHN1cHBsaWVyU2NvcGUpOworICAgICAgICBpbnRlcm5hbEJpbmRpbmdzLmFkZChiaW5kaW5nKTsKKyAgICAgICAgcmV0dXJuIGJpbmRpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgYnVpbGRpbmcgYSBuZXcgc3VwcGxpZXIgY2xhc3MtYmFzZWQgc2VydmljZSBiaW5kaW5nLgorICAgICAqIDxwPgorICAgICAqIFRoZSBzdXBwbGllciBpdHNlbGYgaXMgYm91bmQgaW4gYSBwZXItbG9va3VwIHNjb3BlLgorICAgICAqCisgICAgICogQHBhcmFtIDxUPiAgICAgICAgICBzZXJ2aWNlIHR5cGUuCisgICAgICogQHBhcmFtIHN1cHBsaWVyVHlwZSBzZXJ2aWNlIHN1cHBsaWVyIGNsYXNzLgorICAgICAqIEByZXR1cm4gaW5pdGlhbGl6ZWQgYmluZGluZyBidWlsZGVyLgorICAgICAqLworICAgIHB1YmxpYyA8VD4gU3VwcGxpZXJDbGFzc0JpbmRpbmc8VD4gYmluZEZhY3RvcnkoQ2xhc3M8PyBleHRlbmRzIFN1cHBsaWVyPFQ+PiBzdXBwbGllclR5cGUpIHsKKyAgICAgICAgU3VwcGxpZXJDbGFzc0JpbmRpbmc8VD4gYmluZGluZyA9IEJpbmRpbmdzLnN1cHBsaWVyKHN1cHBsaWVyVHlwZSk7CisgICAgICAgIGludGVybmFsQmluZGluZ3MuYWRkKGJpbmRpbmcpOworICAgICAgICByZXR1cm4gYmluZGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBidWlsZGluZyBhIG5ldyBzdXBwbGllciBpbnN0YW5jZS1iYXNlZCBzZXJ2aWNlIGJpbmRpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gPFQ+ICAgICBzZXJ2aWNlIHR5cGUuCisgICAgICogQHBhcmFtIGZhY3Rvcnkgc2VydmljZSBpbnN0YW5jZS4KKyAgICAgKiBAcmV0dXJuIGluaXRpYWxpemVkIGJpbmRpbmcgYnVpbGRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgPFQ+IFN1cHBsaWVySW5zdGFuY2VCaW5kaW5nPFQ+IGJpbmRGYWN0b3J5KFN1cHBsaWVyPFQ+IGZhY3RvcnkpIHsKKyAgICAgICAgU3VwcGxpZXJJbnN0YW5jZUJpbmRpbmc8VD4gYmluZGluZyA9IEJpbmRpbmdzLnN1cHBsaWVyKGZhY3RvcnkpOworICAgICAgICBpbnRlcm5hbEJpbmRpbmdzLmFkZChiaW5kaW5nKTsKKyAgICAgICAgcmV0dXJuIGJpbmRpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgYnVpbGRpbmcgYSBuZXcgaW5qZWN0aW9uIHJlc29sdmVyIGJpbmRpbmcuIFRoZSBpbmplY3Rpb24gcmVzb2x2ZXIgaXMgbmF0dXJhbGx5CisgICAgICogY29uc2lkZXJlZCB0byBiZSBhIHtAbGluayBqYXZheC5pbmplY3QuU2luZ2xldG9uIHNpbmdsZXRvbi1zY29wZWR9LgorICAgICAqIDxwPgorICAgICAqIFRoZXJlIGlzIG5vIG5lZWQgdG8gcHJvdmlkZSBhbnkgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4gT3RoZXIgbWV0aG9kIG9uIHtAbGluayBCaW5kaW5nfQorICAgICAqIHdpbGwgYmUgaWdub3JlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSA8VD4gICAgICB0eXBlIG9mIHRoZSBpbmplY3Rpb24gcmVzb2x2ZXIuCisgICAgICogQHBhcmFtIHJlc29sdmVyIGluamVjdGlvbiByZXNvbHZlciBpbnN0YW5jZS4KKyAgICAgKiBAcmV0dXJuIGluaXRpYWxpemVkIGJpbmRpbmcgYnVpbGRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgPFQgZXh0ZW5kcyBJbmplY3Rpb25SZXNvbHZlcj4gSW5qZWN0aW9uUmVzb2x2ZXJCaW5kaW5nPFQ+IGJpbmQoVCByZXNvbHZlcikgeworICAgICAgICBJbmplY3Rpb25SZXNvbHZlckJpbmRpbmc8VD4gYmluZGluZyA9IEJpbmRpbmdzLmluamVjdGlvblJlc29sdmVyKHJlc29sdmVyKTsKKyAgICAgICAgaW50ZXJuYWxCaW5kaW5ncy5hZGQoYmluZGluZyk7CisgICAgICAgIHJldHVybiBiaW5kaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYWxsIGJpbmRpbmcgZGVmaW5pdGlvbnMgZnJvbSB0aGUgYmluZGVycyB0byB0aGUgYmluZGluZyBjb25maWd1cmF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGJpbmRlcnMgYmluZGVycyB3aG9zZSBiaW5kaW5nIGRlZmluaXRpb25zIHNob3VsZCBiZSBjb25maWd1cmVkLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGluc3RhbGwoQWJzdHJhY3RCaW5kZXIuLi4gYmluZGVycykgeworICAgICAgICBBcnJheXMuc3RyZWFtKGJpbmRlcnMpCisgICAgICAgICAgICAgICAgLmZpbHRlcihPYmplY3RzOjpub25OdWxsKQorICAgICAgICAgICAgICAgIC5mb3JFYWNoKGluc3RhbGxlZDo6YWRkKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxCaW5kaW5nPiBnZXRCaW5kaW5ncygpIHsKKyAgICAgICAgaW52b2tlQ29uZmlndXJlKCk7CisgICAgICAgIExpc3Q8QmluZGluZz4gYmluZGluZ3MgPSBpbnN0YWxsZWQuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAuZmxhdE1hcChiaW5kZXIgLT4gQmluZGluZ3MuZ2V0QmluZGluZ3MoaW5qZWN0aW9uTWFuYWdlciwgYmluZGVyKS5zdHJlYW0oKSkKKyAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICAgICAgYmluZGluZ3MuYWRkQWxsKGludGVybmFsQmluZGluZ3MpOworICAgICAgICByZXR1cm4gYmluZGluZ3M7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGludm9rZUNvbmZpZ3VyZSgpIHsKKyAgICAgICAgaWYgKCFjb25maWd1cmVkKSB7CisgICAgICAgICAgICBjb25maWd1cmUoKTsKKyAgICAgICAgICAgIGNvbmZpZ3VyZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9pbmplY3QvQWxpYXNCaW5kaW5nLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2luamVjdC9BbGlhc0JpbmRpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmEwZGMwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9pbmplY3QvQWxpYXNCaW5kaW5nLmphdmEKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0OworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsSW50OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogSW5qZWN0aW9uIGJpbmRpbmcgZGVzY3JpcHRpb24gdXNlZCB0byBkZXNjcmliZSB0aGUgYWxpYXNlcyB0byBtYWluIHtAbGluayBCaW5kaW5nfS4KKyAqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworcHVibGljIGNsYXNzIEFsaWFzQmluZGluZyB7CisKKyAgICBwcml2YXRlIGZpbmFsIENsYXNzPD8+IGNvbnRyYWN0OworICAgIHByaXZhdGUgZmluYWwgU2V0PEFubm90YXRpb24+IHF1YWxpZmllcnMgPSBuZXcgTGlua2VkSGFzaFNldDw+KCk7CisgICAgQFN1cHByZXNzV2FybmluZ3MoIk9wdGlvbmFsVXNlZEFzRmllbGRPclBhcmFtZXRlclR5cGUiKQorICAgIHByaXZhdGUgT3B0aW9uYWw8U3RyaW5nPiBzY29wZSA9IE9wdGlvbmFsLmVtcHR5KCk7CisgICAgQFN1cHByZXNzV2FybmluZ3MoIk9wdGlvbmFsVXNlZEFzRmllbGRPclBhcmFtZXRlclR5cGUiKQorICAgIHByaXZhdGUgT3B0aW9uYWxJbnQgcmFuayA9IE9wdGlvbmFsSW50LmVtcHR5KCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGFsaWFzLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRyYWN0IGNvbnRyYWN0IG9mIHRoZSBhbGlhcy4KKyAgICAgKi8KKyAgICAgLyogcGFja2FnZSAqLyBBbGlhc0JpbmRpbmcoQ2xhc3M8Pz4gY29udHJhY3QpIHsKKyAgICAgICAgdGhpcy5jb250cmFjdCA9IGNvbnRyYWN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgYmluZGluZydzIGNvbnRyYWN0LgorICAgICAqCisgICAgICogQHJldHVybiBiaW5kaW5nJ3MgY29udHJhY3QuCisgICAgICovCisgICAgcHVibGljIENsYXNzPD8+IGdldENvbnRyYWN0KCkgeworICAgICAgICByZXR1cm4gY29udHJhY3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBiaW5kaW5nJ3Mgb3B0aW9uYWwgc2NvcGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGJpbmRpbmcncyBzY29wZSwgaWYgc2V0IGV4cGxpY2l0bHkuCisgICAgICovCisgICAgcHVibGljIE9wdGlvbmFsPFN0cmluZz4gZ2V0U2NvcGUoKSB7CisgICAgICAgIHJldHVybiBzY29wZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBiaW5kaW5nJ3Mgc2NvcGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2NvcGUgYmluZGluZydzIHNjb3BlLgorICAgICAqIEByZXR1cm4gY3VycmVudCBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQWxpYXNCaW5kaW5nIGluKFN0cmluZyBzY29wZSkgeworICAgICAgICB0aGlzLnNjb3BlID0gT3B0aW9uYWwub2Yoc2NvcGUpOworCisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgYmluZGluZydzIG9wdGlvbmFsIHJhbmsuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGJpbmRpbmcncyByYW5rLCBpZiBzZXQgZXhwbGljaXRseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT3B0aW9uYWxJbnQgZ2V0UmFuaygpIHsKKyAgICAgICAgcmV0dXJuIHJhbms7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgYmluZGluZydzIHJhbmsuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmFuayBiaW5kaW5nJ3MgcmFuay4KKyAgICAgKiBAcmV0dXJuIGN1cnJlbnQgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIEFsaWFzQmluZGluZyByYW5rZWQoaW50IHJhbmspIHsKKyAgICAgICAgdGhpcy5yYW5rID0gT3B0aW9uYWxJbnQub2YocmFuayk7CisKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBiaW5kaW5nJ3MgcXVhbGlmaWVycy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYmluZGluZydzIHF1YWxpZmllcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgU2V0PEFubm90YXRpb24+IGdldFF1YWxpZmllcnMoKSB7CisgICAgICAgIHJldHVybiBxdWFsaWZpZXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBuZXcgYmluZGluZydzIHF1YWxpZmllci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIGJpbmRpbmcncyBxdWFsaWZpZXIuCisgICAgICogQHJldHVybiBjdXJyZW50IGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBBbGlhc0JpbmRpbmcgcXVhbGlmaWVkQnkoQW5ub3RhdGlvbiBhbm5vdGF0aW9uKSB7CisgICAgICAgIGlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIHF1YWxpZmllcnMuYWRkKGFubm90YXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9pbmplY3QvQW5ub3RhdGlvbkxpdGVyYWwuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvaW5qZWN0L0Fubm90YXRpb25MaXRlcmFsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIzNDBmNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvaW5qZWN0L0Fubm90YXRpb25MaXRlcmFsLmphdmEKQEAgLTAsMCArMSwyMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0OworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BY2Nlc3NpYmxlT2JqZWN0OworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlBhcmFtZXRlcml6ZWRUeXBlOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCisvKioKKyAqIFN1cHBvcnRzIGlubGluZSBpbnN0YW50aWF0aW9uIG9mIGFubm90YXRpb24gdHlwZSBpbnN0YW5jZXMuCisgKiA8cD4KKyAqIEFuIGluc3RhbmNlIG9mIGFuIGFubm90YXRpb24gdHlwZSBtYXkgYmUgb2J0YWluZWQgYnkgc3ViY2xhc3NpbmcgPHR0PkFubm90YXRpb25MaXRlcmFsPC90dD4uCisgKiA8cHJlPgorICogcHVibGljIGFic3RyYWN0IGNsYXNzIFBheUJ5UXVhbGlmaWVyCisgKiAgICAgICBleHRlbmRzIEFubm90YXRpb25MaXRlcmFsJmx0O1BheUJ5Jmd0OworICogICAgICAgaW1wbGVtZW50cyBQYXlCeSB7fQorICogPC9wcmU+CisgKiBBbiBleHRlbnNpb24gb2YgQW5ub3RhdGlvbkxpdGVyYWwgbXVzdCBkbyB0d28gdGhpbmdzOjxPTD4KKyAqIDxMST5NdXN0IGhhdmUgdGhlIHRhcmdldCBhbm5vdGF0aW9uIGFzIGl0cyBnZW5lcmljIHR5cGU8L0xJPgorICogPExJPk11c3QgaW1wbGVtZW50IHRoZSB0YXJnZXQgdHlwZTwvTEk+CisgKiA8L09MPgorICogSW4gcGFydGljdWxhciwgaW4tbGluZSBhbm9ueW1vdXMgZXh0ZW5zaW9ucyBvZiBBbm5vdGF0aW9uTGl0ZXJhbCB3aWxsIG5vdAorICogd29yayBiZWNhdXNlIGluLWxpbmUgYW5vbnltb3VzIGV4dGVuc2lvbnMgb2YgQW5ub3RhdGlvbkxpdGVyYWwgY2Fubm90IGltcGxlbWVudAorICogdGhlIHRhcmdldCBhbm5vdGF0aW9uCisgKgorICogQHBhcmFtIDxUPiB0aGUgYW5ub3RhdGlvbiB0eXBlCisgKiBAYXV0aG9yIGp3ZWxscworICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQW5ub3RhdGlvbkxpdGVyYWw8VCBleHRlbmRzIEFubm90YXRpb24+IGltcGxlbWVudHMgQW5ub3RhdGlvbiwgU2VyaWFsaXphYmxlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zNjQ1NDMwNzY2ODE0Mzc2NjE2TDsKKworICAgIHByaXZhdGUgdHJhbnNpZW50IENsYXNzPFQ+IGFubm90YXRpb25UeXBlOworICAgIHByaXZhdGUgdHJhbnNpZW50IE1ldGhvZFtdIG1lbWJlcnM7CisKKyAgICBwcm90ZWN0ZWQgQW5ub3RhdGlvbkxpdGVyYWwoKSB7CisgICAgICAgIENsYXNzPD8+IHRoaXNDbGFzcyA9IHRoaXMuZ2V0Q2xhc3MoKTsKKworICAgICAgICBib29sZWFuIGZvdW5kQW5ub3RhdGlvbiA9IGZhbHNlOworICAgICAgICBmb3IgKENsYXNzPD8+IGlDbGFzcyA6IHRoaXNDbGFzcy5nZXRJbnRlcmZhY2VzKCkpIHsKKyAgICAgICAgICAgIGlmIChpQ2xhc3MuaXNBbm5vdGF0aW9uKCkpIHsKKyAgICAgICAgICAgICAgICBmb3VuZEFubm90YXRpb24gPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFmb3VuZEFubm90YXRpb24pIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJUaGUgc3ViY2xhc3MgIiArIHRoaXNDbGFzcy5nZXROYW1lKCkgKyAiIG9mIEFubm90YXRpb25MaXRlcmFsIG11c3QgaW1wbGVtZW50IGFuIEFubm90YXRpb24iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIENsYXNzPD8+IGdldEFubm90YXRpb25MaXRlcmFsU3ViY2xhc3MoQ2xhc3M8Pz4gY2xhenopIHsKKyAgICAgICAgQ2xhc3M8Pz4gc3VwZXJjbGFzcyA9IGNsYXp6LmdldFN1cGVyY2xhc3MoKTsKKyAgICAgICAgaWYgKHN1cGVyY2xhc3MuZXF1YWxzKEFubm90YXRpb25MaXRlcmFsLmNsYXNzKSkgeworICAgICAgICAgICAgcmV0dXJuIGNsYXp6OworICAgICAgICB9IGVsc2UgaWYgKHN1cGVyY2xhc3MuZXF1YWxzKE9iamVjdC5jbGFzcykpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGdldEFubm90YXRpb25MaXRlcmFsU3ViY2xhc3Moc3VwZXJjbGFzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwcml2YXRlIHN0YXRpYyA8VD4gQ2xhc3M8VD4gZ2V0VHlwZVBhcmFtZXRlcihDbGFzczw/PiBhbm5vdGF0aW9uTGl0ZXJhbFN1cGVyY2xhc3MpIHsKKyAgICAgICAgVHlwZSB0eXBlID0gYW5ub3RhdGlvbkxpdGVyYWxTdXBlcmNsYXNzLmdldEdlbmVyaWNTdXBlcmNsYXNzKCk7CisgICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFR5cGUpIHsKKyAgICAgICAgICAgIFBhcmFtZXRlcml6ZWRUeXBlIHBhcmFtZXRlcml6ZWRUeXBlID0gKFBhcmFtZXRlcml6ZWRUeXBlKSB0eXBlOworICAgICAgICAgICAgaWYgKHBhcmFtZXRlcml6ZWRUeXBlLmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKS5sZW5ndGggPT0gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiAoQ2xhc3M8VD4pIHBhcmFtZXRlcml6ZWRUeXBlLmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKVswXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldEFjY2Vzc2libGUoZmluYWwgQWNjZXNzaWJsZU9iamVjdCBhbykgeworICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgoUHJpdmlsZWdlZEFjdGlvbjxPYmplY3Q+KSAoKSAtPiB7CisgICAgICAgICAgICBhby5zZXRBY2Nlc3NpYmxlKHRydWUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE9iamVjdCBpbnZva2UoTWV0aG9kIG1ldGhvZCwgT2JqZWN0IGluc3RhbmNlKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoIW1ldGhvZC5pc0FjY2Vzc2libGUoKSkgeworICAgICAgICAgICAgICAgIHNldEFjY2Vzc2libGUobWV0aG9kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtZXRob2QuaW52b2tlKGluc3RhbmNlKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB8IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJFcnJvciBjaGVja2luZyB2YWx1ZSBvZiBtZW1iZXIgbWV0aG9kICIgKyBtZXRob2QuZ2V0TmFtZSgpICsgIiBvbiAiICsgbWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCksIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBNZXRob2RbXSBnZXRNZW1iZXJzKCkgeworICAgICAgICBpZiAobWVtYmVycyA9PSBudWxsKSB7CisgICAgICAgICAgICBtZW1iZXJzID0gQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoKFByaXZpbGVnZWRBY3Rpb248TWV0aG9kW10+KSBhbm5vdGF0aW9uVHlwZSgpOjpnZXREZWNsYXJlZE1ldGhvZHMpOworCisgICAgICAgICAgICBpZiAobWVtYmVycy5sZW5ndGggPiAwICYmICFhbm5vdGF0aW9uVHlwZSgpLmlzQXNzaWduYWJsZUZyb20odGhpcy5nZXRDbGFzcygpKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2xhc3MoKSArICIgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBhbm5vdGF0aW9uIHR5cGUgd2l0aCBtZW1iZXJzICIgKyBhbm5vdGF0aW9uVHlwZSgpLmdldE5hbWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1lbWJlcnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWV0aG9kIHJldHVybnMgdGhlIHR5cGUgb2YgdGhlIGFubm90YXRpb24gbGl0ZXJhbC4gVGhlIHZhbHVlIGlzIHJlc29sdmVkIGxhemlseSBkdXJpbmcgdGhlIGZpcnN0IGNhbGwgb2YgdGhpcyBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFubm90YXRpb24gdHlwZSBvZiB0aGlzIGxpdGVyYWwuCisgICAgICovCisgICAgcHVibGljIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uVHlwZSgpIHsKKyAgICAgICAgaWYgKGFubm90YXRpb25UeXBlID09IG51bGwpIHsKKyAgICAgICAgICAgIENsYXNzPD8+IGFubm90YXRpb25MaXRlcmFsU3ViY2xhc3MgPSBnZXRBbm5vdGF0aW9uTGl0ZXJhbFN1YmNsYXNzKHRoaXMuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICBpZiAoYW5ub3RhdGlvbkxpdGVyYWxTdWJjbGFzcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZ2V0Q2xhc3MoKSArICJpcyBub3QgYSBzdWJjbGFzcyBvZiBBbm5vdGF0aW9uTGl0ZXJhbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYW5ub3RhdGlvblR5cGUgPSBnZXRUeXBlUGFyYW1ldGVyKGFubm90YXRpb25MaXRlcmFsU3ViY2xhc3MpOworICAgICAgICAgICAgaWYgKGFubm90YXRpb25UeXBlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihnZXRDbGFzcygpICsgIiBkb2VzIG5vdCBzcGVjaWZ5IHRoZSB0eXBlIHBhcmFtZXRlciBUIG9mIEFubm90YXRpb25MaXRlcmFsPFQ+Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFubm90YXRpb25UeXBlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKKyAgICAgICAgaWYgKG90aGVyIGluc3RhbmNlb2YgQW5ub3RhdGlvbikgeworICAgICAgICAgICAgQW5ub3RhdGlvbiB0aGF0ID0gKEFubm90YXRpb24pIG90aGVyOworICAgICAgICAgICAgaWYgKHRoaXMuYW5ub3RhdGlvblR5cGUoKS5lcXVhbHModGhhdC5hbm5vdGF0aW9uVHlwZSgpKSkgeworICAgICAgICAgICAgICAgIGZvciAoTWV0aG9kIG1lbWJlciA6IGdldE1lbWJlcnMoKSkgeworICAgICAgICAgICAgICAgICAgICBPYmplY3QgdGhpc1ZhbHVlID0gaW52b2tlKG1lbWJlciwgdGhpcyk7CisgICAgICAgICAgICAgICAgICAgIE9iamVjdCB0aGF0VmFsdWUgPSBpbnZva2UobWVtYmVyLCB0aGF0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXNWYWx1ZSBpbnN0YW5jZW9mIGJ5dGVbXSAmJiB0aGF0VmFsdWUgaW5zdGFuY2VvZiBieXRlW10pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQXJyYXlzLmVxdWFscygoYnl0ZVtdKSB0aGlzVmFsdWUsIChieXRlW10pIHRoYXRWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpc1ZhbHVlIGluc3RhbmNlb2Ygc2hvcnRbXSAmJiB0aGF0VmFsdWUgaW5zdGFuY2VvZiBzaG9ydFtdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUFycmF5cy5lcXVhbHMoKHNob3J0W10pIHRoaXNWYWx1ZSwgKHNob3J0W10pIHRoYXRWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpc1ZhbHVlIGluc3RhbmNlb2YgaW50W10gJiYgdGhhdFZhbHVlIGluc3RhbmNlb2YgaW50W10pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQXJyYXlzLmVxdWFscygoaW50W10pIHRoaXNWYWx1ZSwgKGludFtdKSB0aGF0VmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXNWYWx1ZSBpbnN0YW5jZW9mIGxvbmdbXSAmJiB0aGF0VmFsdWUgaW5zdGFuY2VvZiBsb25nW10pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQXJyYXlzLmVxdWFscygobG9uZ1tdKSB0aGlzVmFsdWUsIChsb25nW10pIHRoYXRWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpc1ZhbHVlIGluc3RhbmNlb2YgZmxvYXRbXSAmJiB0aGF0VmFsdWUgaW5zdGFuY2VvZiBmbG9hdFtdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUFycmF5cy5lcXVhbHMoKGZsb2F0W10pIHRoaXNWYWx1ZSwgKGZsb2F0W10pIHRoYXRWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpc1ZhbHVlIGluc3RhbmNlb2YgZG91YmxlW10gJiYgdGhhdFZhbHVlIGluc3RhbmNlb2YgZG91YmxlW10pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQXJyYXlzLmVxdWFscygoZG91YmxlW10pIHRoaXNWYWx1ZSwgKGRvdWJsZVtdKSB0aGF0VmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXNWYWx1ZSBpbnN0YW5jZW9mIGNoYXJbXSAmJiB0aGF0VmFsdWUgaW5zdGFuY2VvZiBjaGFyW10pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQXJyYXlzLmVxdWFscygoY2hhcltdKSB0aGlzVmFsdWUsIChjaGFyW10pIHRoYXRWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpc1ZhbHVlIGluc3RhbmNlb2YgYm9vbGVhbltdICYmIHRoYXRWYWx1ZSBpbnN0YW5jZW9mIGJvb2xlYW5bXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBcnJheXMuZXF1YWxzKChib29sZWFuW10pIHRoaXNWYWx1ZSwgKGJvb2xlYW5bXSkgdGhhdFZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzVmFsdWUgaW5zdGFuY2VvZiBPYmplY3RbXSAmJiB0aGF0VmFsdWUgaW5zdGFuY2VvZiBPYmplY3RbXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFBcnJheXMuZXF1YWxzKChPYmplY3RbXSkgdGhpc1ZhbHVlLCAoT2JqZWN0W10pIHRoYXRWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXNWYWx1ZS5lcXVhbHModGhhdFZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKworICAgICAgICBpbnQgaGFzaENvZGUgPSAwOworICAgICAgICBmb3IgKE1ldGhvZCBtZW1iZXIgOiBnZXRNZW1iZXJzKCkpIHsKKyAgICAgICAgICAgIGludCBtZW1iZXJOYW1lSGFzaENvZGUgPSAxMjcgKiBtZW1iZXIuZ2V0TmFtZSgpLmhhc2hDb2RlKCk7CisgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBpbnZva2UobWVtYmVyLCB0aGlzKTsKKyAgICAgICAgICAgIGludCBtZW1iZXJWYWx1ZUhhc2hDb2RlOworICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgYm9vbGVhbltdKSB7CisgICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVIYXNoQ29kZSA9IEFycmF5cy5oYXNoQ29kZSgoYm9vbGVhbltdKSB2YWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2Ygc2hvcnRbXSkgeworICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlSGFzaENvZGUgPSBBcnJheXMuaGFzaENvZGUoKHNob3J0W10pIHZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBpbnRbXSkgeworICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlSGFzaENvZGUgPSBBcnJheXMuaGFzaENvZGUoKGludFtdKSB2YWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgbG9uZ1tdKSB7CisgICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVIYXNoQ29kZSA9IEFycmF5cy5oYXNoQ29kZSgobG9uZ1tdKSB2YWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgZmxvYXRbXSkgeworICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlSGFzaENvZGUgPSBBcnJheXMuaGFzaENvZGUoKGZsb2F0W10pIHZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBkb3VibGVbXSkgeworICAgICAgICAgICAgICAgIG1lbWJlclZhbHVlSGFzaENvZGUgPSBBcnJheXMuaGFzaENvZGUoKGRvdWJsZVtdKSB2YWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgYnl0ZVtdKSB7CisgICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVIYXNoQ29kZSA9IEFycmF5cy5oYXNoQ29kZSgoYnl0ZVtdKSB2YWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgY2hhcltdKSB7CisgICAgICAgICAgICAgICAgbWVtYmVyVmFsdWVIYXNoQ29kZSA9IEFycmF5cy5oYXNoQ29kZSgoY2hhcltdKSB2YWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgT2JqZWN0W10pIHsKKyAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZUhhc2hDb2RlID0gQXJyYXlzLmhhc2hDb2RlKChPYmplY3RbXSkgdmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtZW1iZXJWYWx1ZUhhc2hDb2RlID0gdmFsdWUuaGFzaENvZGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhhc2hDb2RlICs9IG1lbWJlck5hbWVIYXNoQ29kZSBeIG1lbWJlclZhbHVlSGFzaENvZGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGhhc2hDb2RlOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9pbmplY3QvQmluZGVyLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2luamVjdC9CaW5kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2Y3YWZjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9pbmplY3QvQmluZGVyLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworLyoqCisgKiBJbnRlcmZhY2UgZGVkaWNhdGVkIHRvIGtlZXAgc29tZSBsZXZlbCBvZiBjb2RlIGNvbXBhdGliaWxpdHkgYmV0d2VlbiBwcmV2aW91cyBISzIgaW1wbGVtZW50YXRpb24gYW5kIG5ldyBESSBTUEkuCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQmluZGVyIHsKKworICAgIC8qKgorICAgICAqIEdldHMgYSBjb2xsZWN0aW9uIG9mIGRlc2NyaXB0b3JzIHJlZ2lzdGVyZWQgaW4gdGhpcyBqZXJzZXkgYmluZGVyLgorICAgICAqCisgICAgICogQHJldHVybiBjb2xsZWN0aW9uIG9mIGRlc2NyaXB0b3JzLgorICAgICAqLworICAgIENvbGxlY3Rpb248QmluZGluZz4gZ2V0QmluZGluZ3MoKTsKKworfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9pbmplY3QvQmluZGluZy5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9pbmplY3QvQmluZGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YWMxOWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2luamVjdC9CaW5kaW5nLmphdmEKQEAgLTAsMCArMSwyNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0OworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkdlbmVyaWNUeXBlOworCitpbXBvcnQgamF2YXguaW5qZWN0Lk5hbWVkOworCisvKioKKyAqIEFic3RyYWN0IGluamVjdGlvbiBiaW5kaW5nIGRlc2NyaXB0aW9uIG9mIGEgYmVhbi4KKyAqCisgKiBAcGFyYW0gPFQ+IHR5cGUgb2YgdGhlIGJlYW4gZGVzY3JpYmVkIGJ5IHRoaXMgaW5qZWN0aW9uIGJpbmRpbmcuCisgKiBAcGFyYW0gPEQ+IGNvbmNyZXRlIGluamVjdGlvbiBiaW5kaW5nIGltcGxlbWVudGF0aW9uIHR5cGUuCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmluZGluZzxULCBEIGV4dGVuZHMgQmluZGluZz4geworCisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8VHlwZT4gY29udHJhY3RzID0gbmV3IEhhc2hTZXQ8PigpOworICAgIHByaXZhdGUgZmluYWwgU2V0PEFubm90YXRpb24+IHF1YWxpZmllcnMgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8QWxpYXNCaW5kaW5nPiBhbGlhc2VzID0gbmV3IEhhc2hTZXQ8PigpOworICAgIHByaXZhdGUgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IHNjb3BlID0gbnVsbDsKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lID0gbnVsbDsKKyAgICBwcml2YXRlIENsYXNzPFQ+IGltcGxlbWVudGF0aW9uVHlwZSA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgYW5hbHl6ZXIgPSBudWxsOworICAgIHByaXZhdGUgQm9vbGVhbiBwcm94aWFibGUgPSBudWxsOworICAgIHByaXZhdGUgQm9vbGVhbiBwcm94eUZvclNhbWVTY29wZSA9IG51bGw7CisgICAgcHJpdmF0ZSBJbnRlZ2VyIHJhbmtlZCA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGluZm9ybWF0aW9uIHdoZXRoZXIgdGhlIHNlcnZpY2UgaXMgcHJveGlhYmxlLgorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHNlcnZpY2UgaXMgcHJveGlhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBCb29sZWFuIGlzUHJveGlhYmxlKCkgeworICAgICAgICByZXR1cm4gcHJveGlhYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgaW5mb3JtYXRpb24gd2hldGhlciB0aGUgc2VydmljZSBjcmVhdGVzIHRoZSBwcm94eSBmb3IgdGhlIHNhbWUgc2NvcGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc2VydmljZSBjcmVhdGVzIHRoZSBwcm94eSBmb3IgdGhlIHNhbWUgc2NvcC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQm9vbGVhbiBpc1Byb3hpZWRGb3JTYW1lU2NvcGUoKSB7CisgICAgICAgIHJldHVybiBwcm94eUZvclNhbWVTY29wZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHJhbmsgb2YgdGhlIHNlcnZpY2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHNlcnZpY2UncyByYW5rLgorICAgICAqLworICAgIHB1YmxpYyBJbnRlZ2VyIGdldFJhbmsoKSB7CisgICAgICAgIHJldHVybiByYW5rZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBzZXJ2aWNlJ3MgY29udHJhY3RzLgorICAgICAqCisgICAgICogQHJldHVybiBzZXJ2aWNlJ3MgY29udHJhY3RzLgorICAgICAqLworICAgIHB1YmxpYyBTZXQ8VHlwZT4gZ2V0Q29udHJhY3RzKCkgeworICAgICAgICByZXR1cm4gY29udHJhY3RzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgc2VydmljZSdzIHF1YWxpZmllcnMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHNlcnZpY2UncyBxdWFsaWZpZXJzLgorICAgICAqLworICAgIHB1YmxpYyBTZXQ8QW5ub3RhdGlvbj4gZ2V0UXVhbGlmaWVycygpIHsKKyAgICAgICAgcmV0dXJuIHF1YWxpZmllcnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBzZXJ2aWNlJ3Mgc2NvcGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHNlcnZpY2UncyBzY29wZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGdldFNjb3BlKCkgeworICAgICAgICByZXR1cm4gc2NvcGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBzZXJ2aWNlJ3MgbmFtZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gc2VydmljZSdzIG5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHNlcnZpY2UncyB0eXBlLgorICAgICAqCisgICAgICogQHJldHVybiBzZXJ2aWNlJ3MgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3M8VD4gZ2V0SW1wbGVtZW50YXRpb25UeXBlKCkgeworICAgICAgICByZXR1cm4gaW1wbGVtZW50YXRpb25UeXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgc2VydmljZSdzIGFuYWx5emVyLgorICAgICAqCisgICAgICogQHJldHVybiBzZXJ2aWNlJ3MgYW5hbHl6ZXIuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRBbmFseXplcigpIHsKKyAgICAgICAgcmV0dXJuIGFuYWx5emVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgc2VydmljZSdzIGFsaWFzZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHNlcnZpY2UncyBhbGlhc2VzLgorICAgICAqLworICAgIHB1YmxpYyBTZXQ8QWxpYXNCaW5kaW5nPiBnZXRBbGlhc2VzKCkgeworICAgICAgICByZXR1cm4gYWxpYXNlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHNlcnZpY2UncyBhbmFseXplci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gY3VycmVudCBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICAvLyBUT0RPOiBDYW5kaWRhdGUgdG8gcmVtb3ZlLCB1c2VkIG9ubHkgaW4gbGVnYWN5IENESSBpbnRlZ3JhdGlvbi4KKyAgICBwdWJsaWMgRCBhbmFseXplV2l0aChTdHJpbmcgYW5hbHl6ZXIpIHsKKyAgICAgICAgdGhpcy5hbmFseXplciA9IGFuYWx5emVyOworICAgICAgICByZXR1cm4gKEQpIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBzZXJ2aWNlJ3MgY29udHJhY3RzLgorICAgICAqCisgICAgICogQHJldHVybiBjdXJyZW50IGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBEIHRvKENvbGxlY3Rpb248Q2xhc3M8PyBzdXBlciBUPj4gY29udHJhY3RzKSB7CisgICAgICAgIGlmIChjb250cmFjdHMgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5jb250cmFjdHMuYWRkQWxsKGNvbnRyYWN0cyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChEKSB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgc2VydmljZSdzIGNvbnRyYWN0LgorICAgICAqCisgICAgICogQHJldHVybiBjdXJyZW50IGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBEIHRvKENsYXNzPD8gc3VwZXIgVD4gY29udHJhY3QpIHsKKyAgICAgICAgdGhpcy5jb250cmFjdHMuYWRkKGNvbnRyYWN0KTsKKyAgICAgICAgcmV0dXJuIChEKSB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgc2VydmljZSdzIGNvbnRyYWN0LgorICAgICAqCisgICAgICogQHJldHVybiBjdXJyZW50IGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBEIHRvKEdlbmVyaWNUeXBlPD8+IGNvbnRyYWN0KSB7CisgICAgICAgIHRoaXMuY29udHJhY3RzLmFkZChjb250cmFjdC5nZXRUeXBlKCkpOworICAgICAgICByZXR1cm4gKEQpIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBzZXJ2aWNlJ3MgY29udHJhY3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGN1cnJlbnQgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIEQgdG8oVHlwZSBjb250cmFjdCkgeworICAgICAgICB0aGlzLmNvbnRyYWN0cy5hZGQoY29udHJhY3QpOworICAgICAgICByZXR1cm4gKEQpIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBzZXJ2aWNlJ3MgcXVhbGlmaWVyLgorICAgICAqCisgICAgICogQHJldHVybiBjdXJyZW50IGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBEIHF1YWxpZmllZEJ5KEFubm90YXRpb24gYW5ub3RhdGlvbikgeworICAgICAgICBpZiAoTmFtZWQuY2xhc3MuZXF1YWxzKGFubm90YXRpb24uYW5ub3RhdGlvblR5cGUoKSkpIHsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9ICgoTmFtZWQpIGFubm90YXRpb24pLnZhbHVlKCk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5xdWFsaWZpZXJzLmFkZChhbm5vdGF0aW9uKTsKKyAgICAgICAgcmV0dXJuIChEKSB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgc2VydmljZSdzIHNjb3BlLgorICAgICAqCisgICAgICogQHJldHVybiBjdXJyZW50IGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBEIGluKENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBzY29wZUFubm90YXRpb24pIHsKKyAgICAgICAgdGhpcy5zY29wZSA9IHNjb3BlQW5ub3RhdGlvbjsKKyAgICAgICAgcmV0dXJuIChEKSB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgc2VydmljZSdzIG5hbWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGN1cnJlbnQgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIEQgbmFtZWQoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgcmV0dXJuIChEKSB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgc2VydmljZSdzIGFsaWFzLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRyYWN0IGNvbnRyYWN0IG9mIHRoZSBhbGlhcy4KKyAgICAgKiBAcmV0dXJuIGluc3RhbmNlIG9mIGEgbmV3IGFsaWFzIGZvciB0aGlzIGJpbmRpbmcgZGVzY3JpcHRvciB0aGF0IGNhbiBiZSBmdXJ0aGVyIHNwZWNpZmllZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQWxpYXNCaW5kaW5nIGFkZEFsaWFzKENsYXNzPD8+IGNvbnRyYWN0KSB7CisgICAgICAgIEFsaWFzQmluZGluZyBhbGlhcyA9IG5ldyBBbGlhc0JpbmRpbmcoY29udHJhY3QpOworICAgICAgICBhbGlhc2VzLmFkZChhbGlhcyk7CisgICAgICAgIHJldHVybiBhbGlhczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGluZm9ybWF0aW9uIGFib3V0IHByb3h5IGNyZWF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBjdXJyZW50IGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBEIHByb3h5KGJvb2xlYW4gcHJveGlhYmxlKSB7CisgICAgICAgIHRoaXMucHJveGlhYmxlID0gcHJveGlhYmxlOworICAgICAgICByZXR1cm4gKEQpIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBpbmZvcm1hdGlvbiBhYm91dCBwcm94eSBjcmVhdGlvbiB3aGVuIHRoZSBzZXJ2aWNlIGlzIGluIHRoZSBzYW1lIHNjb3BlLgorICAgICAqCisgICAgICogQHJldHVybiBjdXJyZW50IGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBEIHByb3h5Rm9yU2FtZVNjb3BlKGJvb2xlYW4gcHJveHlGb3JTYW1lU2NvcGUpIHsKKyAgICAgICAgdGhpcy5wcm94eUZvclNhbWVTY29wZSA9IHByb3h5Rm9yU2FtZVNjb3BlOworICAgICAgICByZXR1cm4gKEQpIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBzZXJ2aWNlJ3MgcmFuay4KKyAgICAgKgorICAgICAqIEByZXR1cm4gY3VycmVudCBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByYW5rZWQoaW50IHJhbmspIHsKKyAgICAgICAgdGhpcy5yYW5rZWQgPSByYW5rOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgc2VydmljZSdzIHR5cGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGN1cnJlbnQgaW5zdGFuY2UuCisgICAgICovCisgICAgRCBhc1R5cGUoQ2xhc3MgdHlwZSkgeworICAgICAgICB0aGlzLmltcGxlbWVudGF0aW9uVHlwZSA9IHR5cGU7CisgICAgICAgIHJldHVybiAoRCkgdGhpczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2luamVjdC9CaW5kaW5ncy5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9pbmplY3QvQmluZGluZ3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzcwNjNhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9pbmplY3QvQmluZGluZ3MuamF2YQpAQCAtMCwwICsxLDE5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3Q7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljVHlwZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUmVmbGVjdGlvbkhlbHBlcjsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIHRvIGNyZWF0ZSBhIG5ldyBpbmplY3Rpb24gYmluZGluZyBkZXNjcmlwdGlvbnMgZm9yIGFyYml0cmFyeSBKYXZhIGJlYW5zLgorICoKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQmluZGluZ3MgeworCisgICAgcHJpdmF0ZSBCaW5kaW5ncygpIHsKKyAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJVdGlsaXR5IGNsYXNzIGluc3RhbnRpYXRpb24gZm9yYmlkZGVuLiIpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxCaW5kaW5nPiBnZXRCaW5kaW5ncyhJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIsIEJpbmRlciBiaW5kZXIpIHsKKyAgICAgICAgaWYgKGJpbmRlciBpbnN0YW5jZW9mIEFic3RyYWN0QmluZGVyKSB7CisgICAgICAgICAgICAoKEFic3RyYWN0QmluZGVyKSBiaW5kZXIpLnNldEluamVjdGlvbk1hbmFnZXIoaW5qZWN0aW9uTWFuYWdlcik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYmluZGVyLmdldEJpbmRpbmdzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgYnVpbGRpbmcgYSBuZXcgY2xhc3MtYmFzZWQgc2VydmljZSBiaW5kaW5nLgorICAgICAqIDxwPgorICAgICAqIERvZXMgTk9UIHNlcnZpY2UgdGhlIHNlcnZpY2UgdHlwZSBpdHNlbGYgYXMgYSBjb250cmFjdCB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIDxUPiAgICAgICAgIHNlcnZpY2UgdHlwZS4KKyAgICAgKiBAcGFyYW0gc2VydmljZVR5cGUgc2VydmljZSBjbGFzcy4KKyAgICAgKiBAcmV0dXJuIGluaXRpYWxpemVkIGJpbmRpbmcgYnVpbGRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUPiBDbGFzc0JpbmRpbmc8VD4gc2VydmljZShDbGFzczxUPiBzZXJ2aWNlVHlwZSkgeworICAgICAgICByZXR1cm4gbmV3IENsYXNzQmluZGluZzw+KHNlcnZpY2VUeXBlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBidWlsZGluZyBhIG5ldyBjbGFzcy1iYXNlZCBzZXJ2aWNlIGJpbmRpbmcuCisgICAgICogPHA+CisgICAgICogQmluZHMgdGhlIHNlcnZpY2UgdHlwZSBpdHNlbGYgYXMgYSBjb250cmFjdCB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIDxUPiAgICAgICAgIHNlcnZpY2UgdHlwZS4KKyAgICAgKiBAcGFyYW0gc2VydmljZVR5cGUgc2VydmljZSBjbGFzcy4KKyAgICAgKiBAcmV0dXJuIGluaXRpYWxpemVkIGJpbmRpbmcgYnVpbGRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUPiBDbGFzc0JpbmRpbmc8VD4gc2VydmljZUFzQ29udHJhY3QoQ2xhc3M8VD4gc2VydmljZVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDbGFzc0JpbmRpbmc8PihzZXJ2aWNlVHlwZSkudG8oc2VydmljZVR5cGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IGJ1aWxkaW5nIGEgbmV3IGdlbmVyaWMgdHlwZS1iYXNlZCBzZXJ2aWNlIGJpbmRpbmcuCisgICAgICogPHA+CisgICAgICogQmluZHMgdGhlIGdlbmVyaWMgc2VydmljZSB0eXBlIGl0c2VsZiBhcyBhIGNvbnRyYWN0IHR5cGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gPFQ+ICAgICAgICAgc2VydmljZSB0eXBlLgorICAgICAqIEBwYXJhbSBzZXJ2aWNlVHlwZSBnZW5lcmljIHNlcnZpY2UgdHlwZSBpbmZvcm1hdGlvbi4KKyAgICAgKiBAcmV0dXJuIGluaXRpYWxpemVkIGJpbmRpbmcgYnVpbGRlci4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgc3RhdGljIDxUPiBDbGFzc0JpbmRpbmc8VD4gc2VydmljZShHZW5lcmljVHlwZTxUPiBzZXJ2aWNlVHlwZSkgeworICAgICAgICByZXR1cm4gKENsYXNzQmluZGluZzxUPikgbmV3IENsYXNzQmluZGluZzw+KHNlcnZpY2VUeXBlLmdldFJhd1R5cGUoKSkKKyAgICAgICAgICAgICAgICAuYXNUeXBlKChDbGFzczxUPikgc2VydmljZVR5cGUuZ2V0VHlwZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBidWlsZGluZyBhIG5ldyBnZW5lcmljIHR5cGUtYmFzZWQgc2VydmljZSBiaW5kaW5nLgorICAgICAqIDxwPgorICAgICAqIEJpbmRzIHRoZSBnZW5lcmljIHNlcnZpY2UgdHlwZSBpdHNlbGYgYXMgYSBjb250cmFjdCB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIDxUPiAgICAgICAgIHNlcnZpY2UgdHlwZS4KKyAgICAgKiBAcGFyYW0gc2VydmljZVR5cGUgZ2VuZXJpYyBzZXJ2aWNlIHR5cGUgaW5mb3JtYXRpb24uCisgICAgICogQHJldHVybiBpbml0aWFsaXplZCBiaW5kaW5nIGJ1aWxkZXIuCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIHN0YXRpYyA8VD4gQ2xhc3NCaW5kaW5nPFQ+IHNlcnZpY2VBc0NvbnRyYWN0KEdlbmVyaWNUeXBlPFQ+IHNlcnZpY2VUeXBlKSB7CisgICAgICAgIHJldHVybiAoQ2xhc3NCaW5kaW5nPFQ+KSBuZXcgQ2xhc3NCaW5kaW5nPD4oc2VydmljZVR5cGUuZ2V0UmF3VHlwZSgpKQorICAgICAgICAgICAgICAgIC5hc1R5cGUoKENsYXNzPFQ+KSBzZXJ2aWNlVHlwZS5nZXRUeXBlKCkpCisgICAgICAgICAgICAgICAgLnRvKHNlcnZpY2VUeXBlLmdldFR5cGUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgYnVpbGRpbmcgYSBuZXcgZ2VuZXJpYyB0eXBlLWJhc2VkIHNlcnZpY2UgYmluZGluZy4KKyAgICAgKiA8cD4KKyAgICAgKiBCaW5kcyB0aGUgZ2VuZXJpYyBzZXJ2aWNlIHR5cGUgaXRzZWxmIGFzIGEgY29udHJhY3QgdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSA8VD4gICAgICAgICBzZXJ2aWNlIHR5cGUuCisgICAgICogQHBhcmFtIHNlcnZpY2VUeXBlIGdlbmVyaWMgc2VydmljZSB0eXBlIGluZm9ybWF0aW9uLgorICAgICAqIEByZXR1cm4gaW5pdGlhbGl6ZWQgYmluZGluZyBidWlsZGVyLgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBzdGF0aWMgPFQ+IENsYXNzQmluZGluZzxUPiBzZXJ2aWNlQXNDb250cmFjdChUeXBlIHNlcnZpY2VUeXBlKSB7CisgICAgICAgIHJldHVybiBuZXcgQ2xhc3NCaW5kaW5nPD4oKENsYXNzPFQ+KSBSZWZsZWN0aW9uSGVscGVyLmdldFJhd0NsYXNzKHNlcnZpY2VUeXBlKSkKKyAgICAgICAgICAgICAgICAuYXNUeXBlKChDbGFzczxUPikgc2VydmljZVR5cGUpCisgICAgICAgICAgICAgICAgLnRvKHNlcnZpY2VUeXBlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBidWlsZGluZyBhIG5ldyBpbnN0YW5jZS1iYXNlZCBzZXJ2aWNlIGJpbmRpbmcuIFRoZSBiaW5kaW5nIGlzIG5hdHVyYWxseQorICAgICAqIGNvbnNpZGVyZWQgdG8gYmUgYSB7QGxpbmsgamF2YXguaW5qZWN0LlNpbmdsZXRvbiBzaW5nbGV0b24tc2NvcGVkfS4KKyAgICAgKiA8cD4KKyAgICAgKiBEb2VzIE5PVCBzZXJ2aWNlIHRoZSBzZXJ2aWNlIHR5cGUgaXRzZWxmIGFzIGEgY29udHJhY3QgdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSA8VD4gICAgIHNlcnZpY2UgdHlwZS4KKyAgICAgKiBAcGFyYW0gc2VydmljZSBzZXJ2aWNlIGluc3RhbmNlLgorICAgICAqIEByZXR1cm4gaW5pdGlhbGl6ZWQgYmluZGluZyBidWlsZGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IEluc3RhbmNlQmluZGluZzxUPiBzZXJ2aWNlKFQgc2VydmljZSkgeworICAgICAgICByZXR1cm4gbmV3IEluc3RhbmNlQmluZGluZzw+KHNlcnZpY2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IGJ1aWxkaW5nIGEgbmV3IGluc3RhbmNlLWJhc2VkIHNlcnZpY2UgYmluZGluZy4gVGhlIGJpbmRpbmcgaXMgbmF0dXJhbGx5CisgICAgICogY29uc2lkZXJlZCB0byBiZSBhIHtAbGluayBqYXZheC5pbmplY3QuU2luZ2xldG9uIHNpbmdsZXRvbi1zY29wZWR9LgorICAgICAqIDxwPgorICAgICAqIEJpbmRzIHRoZSBnZW5lcmljIHNlcnZpY2UgdHlwZSBpdHNlbGYgYXMgYSBjb250cmFjdCB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIDxUPiAgICAgc2VydmljZSB0eXBlLgorICAgICAqIEBwYXJhbSBzZXJ2aWNlIHNlcnZpY2UgaW5zdGFuY2UuCisgICAgICogQHJldHVybiBpbml0aWFsaXplZCBiaW5kaW5nIGJ1aWxkZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8VD4gSW5zdGFuY2VCaW5kaW5nPFQ+IHNlcnZpY2VBc0NvbnRyYWN0KFQgc2VydmljZSkgeworICAgICAgICByZXR1cm4gbmV3IEluc3RhbmNlQmluZGluZzw+KHNlcnZpY2UsIHNlcnZpY2UuZ2V0Q2xhc3MoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgYnVpbGRpbmcgYSBuZXcgc3VwcGxpZXIgY2xhc3MtYmFzZWQgc2VydmljZSBiaW5kaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIDxUPiAgICAgICAgICAgc2VydmljZSB0eXBlLgorICAgICAqIEBwYXJhbSBzdXBwbGllclR5cGUgIHNlcnZpY2Ugc3VwcGxpZXIgY2xhc3MuCisgICAgICogQHBhcmFtIHN1cHBsaWVyU2NvcGUgZmFjdG9yeSBzY29wZS4KKyAgICAgKiBAcmV0dXJuIGluaXRpYWxpemVkIGJpbmRpbmcgYnVpbGRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUPiBTdXBwbGllckNsYXNzQmluZGluZzxUPiBzdXBwbGllcigKKyAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBTdXBwbGllcjxUPj4gc3VwcGxpZXJUeXBlLCBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gc3VwcGxpZXJTY29wZSkgeworICAgICAgICByZXR1cm4gbmV3IFN1cHBsaWVyQ2xhc3NCaW5kaW5nPD4oc3VwcGxpZXJUeXBlLCBzdXBwbGllclNjb3BlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBidWlsZGluZyBhIG5ldyBzdXBwbGllciBjbGFzcy1iYXNlZCBzZXJ2aWNlIGJpbmRpbmcuCisgICAgICogPHA+CisgICAgICogVGhlIHN1cHBsaWVyIGl0c2VsZiBpcyBib3VuZCBpbiBhIHBlci1sb29rdXAgc2NvcGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gPFQ+ICAgICAgICAgIHNlcnZpY2UgdHlwZS4KKyAgICAgKiBAcGFyYW0gc3VwcGxpZXJUeXBlIHNlcnZpY2Ugc3VwcGxpZXIgY2xhc3MuCisgICAgICogQHJldHVybiBpbml0aWFsaXplZCBiaW5kaW5nIGJ1aWxkZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8VD4gU3VwcGxpZXJDbGFzc0JpbmRpbmc8VD4gc3VwcGxpZXIoQ2xhc3M8PyBleHRlbmRzIFN1cHBsaWVyPFQ+PiBzdXBwbGllclR5cGUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdXBwbGllckNsYXNzQmluZGluZzw+KHN1cHBsaWVyVHlwZSwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgYnVpbGRpbmcgYSBuZXcgc3VwcGxpZXIgaW5zdGFuY2UtYmFzZWQgc2VydmljZSBiaW5kaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIDxUPiAgICAgIHNlcnZpY2UgdHlwZS4KKyAgICAgKiBAcGFyYW0gc3VwcGxpZXIgc2VydmljZSBpbnN0YW5jZS4KKyAgICAgKiBAcmV0dXJuIGluaXRpYWxpemVkIGJpbmRpbmcgYnVpbGRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUPiBTdXBwbGllckluc3RhbmNlQmluZGluZzxUPiBzdXBwbGllcihTdXBwbGllcjxUPiBzdXBwbGllcikgeworICAgICAgICByZXR1cm4gbmV3IFN1cHBsaWVySW5zdGFuY2VCaW5kaW5nPD4oc3VwcGxpZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IGJ1aWxkaW5nIGEgbmV3IGluamVjdGlvbiByZXNvbHZlciBiaW5kaW5nLiBUaGUgaW5qZWN0aW9uIHJlc29sdmVyIGlzIG5hdHVyYWxseQorICAgICAqIGNvbnNpZGVyZWQgdG8gYmUgYSB7QGxpbmsgamF2YXguaW5qZWN0LlNpbmdsZXRvbiBzaW5nbGV0b24tc2NvcGVkfS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGVyZSBpcyBubyBuZWVkIHRvIHByb3ZpZGUgYW55IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uIE90aGVyIG1ldGhvZCBvbiB7QGxpbmsgQmluZGluZ30KKyAgICAgKiB3aWxsIGJlIGlnbm9yZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gPFQ+ICAgICAgICB0eXBlIG9mIHRoZSBpbmplY3Rpb24gcmVzb2x2ZXIuCisgICAgICogQHBhcmFtIHJlc29sdmVyICAgaW5qZWN0aW9uIHJlc29sdmVyIGluc3RhbmNlLgorICAgICAqIEByZXR1cm4gaW5pdGlhbGl6ZWQgYmluZGluZyBidWlsZGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQgZXh0ZW5kcyBJbmplY3Rpb25SZXNvbHZlcj4gSW5qZWN0aW9uUmVzb2x2ZXJCaW5kaW5nPFQ+IGluamVjdGlvblJlc29sdmVyKFQgcmVzb2x2ZXIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJbmplY3Rpb25SZXNvbHZlckJpbmRpbmc8PihyZXNvbHZlcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9pbmplY3QvQ2xhc3NCaW5kaW5nLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2luamVjdC9DbGFzc0JpbmRpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDVhYmMxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9pbmplY3QvQ2xhc3NCaW5kaW5nLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3Q7CisKKy8qKgorICogSW5qZWN0aW9uIGJpbmRpbmcgZGVzY3JpcHRpb24gb2YgYSBiZWFuIGJvdW5kIHZpYSBpdHMgYSBKYXZhIGNsYXNzLgorICoKKyAqIEBwYXJhbSA8VD4gdHlwZSBvZiB0aGUgYmVhbiBkZXNjcmliZWQgYnkgdGhpcyBpbmplY3Rpb24gYmluZGluZy4KKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitwdWJsaWMgY2xhc3MgQ2xhc3NCaW5kaW5nPFQ+IGV4dGVuZHMgQmluZGluZzxULCBDbGFzc0JpbmRpbmc8VD4+IHsKKworICAgIHByaXZhdGUgZmluYWwgQ2xhc3M8VD4gc2VydmljZTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBzZXJ2aWNlIGFzIGEgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VydmljZSBzZXJ2aWNlJ3MgY2xhc3MuCisgICAgICovCisgICAgQ2xhc3NCaW5kaW5nKENsYXNzPFQ+IHNlcnZpY2UpIHsKKyAgICAgICAgdGhpcy5zZXJ2aWNlID0gc2VydmljZTsKKyAgICAgICAgYXNUeXBlKHNlcnZpY2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgc2VydmljZScgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHNlcnZpY2UncyBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3M8VD4gZ2V0U2VydmljZSgpIHsKKyAgICAgICAgcmV0dXJuIHNlcnZpY2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9pbmplY3QvQ29tcG9zaXRlQmluZGVyLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2luamVjdC9Db21wb3NpdGVCaW5kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzQ3NDE1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9pbmplY3QvQ29tcG9zaXRlQmluZGVyLmphdmEKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyB3aGljaCBpcyBhYmxlIHRvIGluc3RhbGwgc2V2ZXJhbCBiaW5kZXJzIGFuZCByZWdpc3RlciB0aGVtIGFzIGEgd2hvbGUuCisgKiA8cD4KKyAqIHtAY29kZSBCaW5kZXJ9IGlzIGFibGUgdG8gcmVjdXJzaXZlbHkgcmVnaXN0ZXIgYWxsIGluamVjdGlvbiBiaW5kaW5nIGRlc2NyaXB0aW9ucyBpbiBhbGwgaW5zdGFsbGVkIGJpbmRlcnMuCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK3B1YmxpYyBjbGFzcyBDb21wb3NpdGVCaW5kZXIgZXh0ZW5kcyBBYnN0cmFjdEJpbmRlciB7CisKKyAgICBwcml2YXRlIENvbGxlY3Rpb248QmluZGVyPiBpbnN0YWxsZWQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIENvbXBvc2l0ZUJpbmRlcn0gYW5kIGFkZHMgdGhlIGNvbGxlY3Rpb24gb2YgYmluZGVycyBhcyBjYW5kaWRhdGVzIHRvIGluc3RhbGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5zdGFsbGVkIGFsbCBiaW5kZXIgcmVhZHkgdG8gaW5zdGFsbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIENvbXBvc2l0ZUJpbmRlcihDb2xsZWN0aW9uPEJpbmRlcj4gaW5zdGFsbGVkKSB7CisgICAgICAgIHRoaXMuaW5zdGFsbGVkID0gaW5zdGFsbGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMge0Bjb2RlIENvbXBvc2l0ZUJpbmRlcn0gd2l0aCBwcm92aWRlZCBiaW5kZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIGJpbmRlcnMgcHJvdmlkZWQgYmluZGVyIHRvIGluc3RhbGwgYXMgYSBjb2xsZWN0aW9uLgorICAgICAqIEByZXR1cm4gY29tcG9zaXRlIGJpbmRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEFic3RyYWN0QmluZGVyIHdyYXAoQ29sbGVjdGlvbjxCaW5kZXI+IGJpbmRlcnMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDb21wb3NpdGVCaW5kZXIoYmluZGVycyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyB7QGNvZGUgQ29tcG9zaXRlQmluZGVyfSB3aXRoIHByb3ZpZGVkIGJpbmRlcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmluZGVycyBwcm92aWRlZCBiaW5kZXIgdG8gaW5zdGFsbCBhcyBhbiBhcnJheS4KKyAgICAgKiBAcmV0dXJuIGNvbXBvc2l0ZSBiaW5kZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBBYnN0cmFjdEJpbmRlciB3cmFwKEJpbmRlci4uLiBiaW5kZXJzKSB7CisgICAgICAgIHJldHVybiBuZXcgQ29tcG9zaXRlQmluZGVyKEFycmF5cy5hc0xpc3QoYmluZGVycykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEF1dG9tYXRpY2FsbHkgaW5zdGFsbGVkIGFsbCBwcm92aWRlZCBiaW5kZXJzLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgaW5zdGFsbChpbnN0YWxsZWQudG9BcnJheShuZXcgQWJzdHJhY3RCaW5kZXJbXSB7fSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvaW5qZWN0L0NvbnRleHRJbmplY3Rpb25SZXNvbHZlci5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9pbmplY3QvQ29udGV4dEluamVjdGlvblJlc29sdmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ0MWI1ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvaW5qZWN0L0NvbnRleHRJbmplY3Rpb25SZXNvbHZlci5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworCisvKioKKyAqIEEgbWFya2VyIGludGVyZmFjZSB0byB7QGNvZGUgSW5qZWN0aW9uUmVzb2x2ZXImbHQ7Q29udGV4dCZndDt9LiBUaGlzIGludGVyZmFjZSBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IGV2ZXJ5IERlcGVuZGVuY3kKKyAqIEluamVjdGlvbiBQcm92aWRlciB0byBwcm9wZXJseSBoYW5kbGUgdGhlIGluamVjdGlvbiBvZiB7QGxpbmsgQ29udGV4dH0gYW5ub3RhdGlvbi4KKyAqIDxwPgorICogSmVyc2V5IGNhbm5vdCBzaW1wbHkgYWRkIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgaW50ZXJmYWNlIGJlY2F1c2UgdGhlIHByb3BlciBpbXBsZW1lbnRhdGlvbiByZXF1aXJlcyBhIGxvdCBvZgorICogY2FjaGluZyBhbmQgb3B0aW1pemF0aW9uIHdoaWNoIGNhbiBiZSBkb25lIG9ubHkgd2l0aCB2ZXJ5IGNsb3NlIGRlcGVuZGVuY3kgdG8gREkgcHJvdmlkZXIuCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ29udGV4dEluamVjdGlvblJlc29sdmVyIGV4dGVuZHMgSW5qZWN0aW9uUmVzb2x2ZXI8Q29udGV4dD4geworfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9pbmplY3QvQ3VzdG9tLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2luamVjdC9DdXN0b20uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjMxNWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9pbmplY3QvQ3VzdG9tLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3Q7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworCitpbXBvcnQgamF2YXguaW5qZWN0LlF1YWxpZmllcjsKKworLyoqCisgKiB7QGxpbmsgUXVhbGlmaWVyIFF1YWxpZmllciBhbm5vdGF0aW9ufSB1c2VkIHRvIGFubm90YXRlIEhLMiBpbmplY3Rpb25zIGFuZAorICogYmluZGluZ3MgZm9yIHVzZXIgY3VzdG9tIHByb3ZpZGVycy4gUHJvdmlkZXJzIGFyZSBjbGFzc2VzIHdoaWNoIGltcGxlbWVudCBvbmUKKyAqIG9mIHRoZSBwcm92aWRlciBpbnRlcmZhY2VzIChmb3IgZXhhbXBsZSB7QGxpbmsgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyCisgKiBNZXNzYWdlIGJvZHkgcmVhZGVyIGludGVyZmFjZX0pLgorICogPHA+CisgKiBDdXN0b20gcHJvdmlkZXJzIGFyZSBib3VuZCBpbiB0aGUgSEsyIGluamVjdGlvbiBtYW5hZ2VyIHVzaW5nIHtAY29kZSAmIzY0O0N1c3RvbX0KKyAqIGFubm90YXRpb24uIE9uY2UgYm91bmQsIHRoZSBjdXN0b20gcHJvdmlkZXJzIGNhbiBiZSBpbmplY3RlZCB1c2luZyB7QGNvZGUgJiM2NDtDdXN0b219CisgKiBxdWFsaWZpZXIgYW5ub3RhdGlvbiBhZ2Fpbi4KKyAqIDwvcD4KKyAqIDxwPgorICogRm9yIGV4YW1wbGU6CisgKiA8cHJlPgorICogICYjMDY0O0luamVjdAorICogICYjMDY0O0N1c3RvbQorICogIE1lc3NhZ2VCb2R5UmVhZGVyIG1lc3NhZ2VCb2R5UmVhZGVyOworICogPC9wcmU+CisgKiA8L3A+CisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqIEBzZWUgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkN1c3RvbUFubm90YXRpb25MaXRlcmFsCisgKi8KK0BRdWFsaWZpZXIKK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitwdWJsaWMgQGludGVyZmFjZSBDdXN0b20geworCit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2luamVjdC9DdXN0b21Bbm5vdGF0aW9uTGl0ZXJhbC5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9pbmplY3QvQ3VzdG9tQW5ub3RhdGlvbkxpdGVyYWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTQ3ZWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9pbmplY3QvQ3VzdG9tQW5ub3RhdGlvbkxpdGVyYWwuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdDsKKworLyoqCisgKiB7QGxpbmsgQ3VzdG9tfSBhbm5vdGF0aW9uIGxpdGVyYWwuCisgKiA8cD4KKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSB7QGxpbmsgI0lOU1RBTkNFIGNvbnN0YW50IGluc3RhbmNlfSBvZiB0aGUge0Bjb2RlIEBDdXN0b219IGFubm90YXRpb24gdG8gYmUgdXNlZAorICogaW4gbWV0aG9kIGNhbGxzIHRoYXQgcmVxdWlyZSB1c2Ugb2YgYW5ub3RhdGlvbiBpbnN0YW5jZXMuCisgKiA8L3A+CisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQFN1cHByZXNzV2FybmluZ3MoIkNsYXNzRXhwbGljaXRseUFubm90YXRpb24iKQorcHVibGljIGZpbmFsIGNsYXNzIEN1c3RvbUFubm90YXRpb25MaXRlcmFsIGV4dGVuZHMgQW5ub3RhdGlvbkxpdGVyYWw8Q3VzdG9tPiBpbXBsZW1lbnRzIEN1c3RvbSB7CisKKyAgICAvKioKKyAgICAgKiB7QGNvZGUgQ3VzdG9tfSBhbm5vdGF0aW9uIGluc3RhbmNlIHRvIHVzZSBmb3IgaW5qZWN0aW9uIGJpbmRpbmdzIGFuZCByZWxhdGVkIHF1ZXJpZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDdXN0b20gSU5TVEFOQ0UgPSBuZXcgQ3VzdG9tQW5ub3RhdGlvbkxpdGVyYWwoKTsKKworICAgIHByaXZhdGUgQ3VzdG9tQW5ub3RhdGlvbkxpdGVyYWwoKSB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9pbmplY3QvRGlzcG9zYWJsZVN1cHBsaWVyLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2luamVjdC9EaXNwb3NhYmxlU3VwcGxpZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTU1ZmExCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9pbmplY3QvRGlzcG9zYWJsZVN1cHBsaWVyLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CisKKy8qKgorICogU3VwcGxpZXIgZXh0ZW5zaW9uIHdoaWNoIGlzIGFibGUgdG8gY2FsbCB7QGxpbmsgI2dldCgpfSBtZXRob2QgdG8gY3JlYXRlIGEgbmV3IG9iamVjdCBhbmQgYWxzbyBjYWxsIHtAbGluayAjZGlzcG9zZShPYmplY3QpfQorICogdG8gbWFrZSBzb21lIGNsZWFuaW5nIGNvZGUgcmVnYXJkaW5nIHRoZSBpbnN0YW5jZSBhbmQgdGhlIHNwZWNpZmljIHtAbGluayBTdXBwbGllcn0gaW5zdGFuY2UuCisgKgorICogQHBhcmFtIDxUPiB0eXBlIHdoaWNoIGlzIGNyZWF0ZWQgYnkge0BsaW5rIERpc3Bvc2FibGVTdXBwbGllcn0uCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworcHVibGljIGludGVyZmFjZSBEaXNwb3NhYmxlU3VwcGxpZXI8VD4gZXh0ZW5kcyBTdXBwbGllcjxUPiB7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGRpc3Bvc2UgdGhlIHByb3ZpZGVkIG9iamVjdCBjcmVhdGVkIGJ5IHRoaXMge0Bjb2RlIFN1cHBsaWVyfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnN0YW5jZSB0aGUgaW5zdGFuY2UgdG8gYmUgZGlzcG9zZWQuCisgICAgICovCisgICAgdm9pZCBkaXNwb3NlKFQgaW5zdGFuY2UpOworCit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2luamVjdC9FeHRyYWN0b3JFeGNlcHRpb24uamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvaW5qZWN0L0V4dHJhY3RvckV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyOWI4NzQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2luamVjdC9FeHRyYWN0b3JFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdDsKKworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CisKKy8qKgorICogQSBydW50aW1lIGV4Y2VwdGlvbiB0aGF0IGNvbnRhaW5zIGEgY2F1c2UsIGEgY2hlY2tlZCBvciBydW50aW1lIGV4Y2VwdGlvbiwKKyAqIHRoYXQgbWF5IGJlIHBhc3NlZCB0byB0aGUgY2F1c2Ugb2YgYSB7QGxpbmsgV2ViQXBwbGljYXRpb25FeGNlcHRpb259LgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqLworcHVibGljIGNsYXNzIEV4dHJhY3RvckV4Y2VwdGlvbiBleHRlbmRzIFByb2Nlc3NpbmdFeGNlcHRpb24geworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00OTE4MDIzMjU3MTA0NDEzOTgxTDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgcGFyYW1ldGVyIGV4dHJhY3RvciBleGNlcHRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBleGNlcHRpb24gbWVzc2FnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRXh0cmFjdG9yRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIHN1cGVyKG1lc3NhZ2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgcGFyYW1ldGVyIGV4dHJhY3RvciBleGNlcHRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBleGNlcHRpb24gbWVzc2FnZS4KKyAgICAgKiBAcGFyYW0gY2F1c2UgICBleGNlcHRpb24gY2F1c2UuCisgICAgICovCisgICAgcHVibGljIEV4dHJhY3RvckV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IHBhcmFtZXRlciBleHRyYWN0b3IgZXhjZXB0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNhdXNlIGV4Y2VwdGlvbiBjYXVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRXh0cmFjdG9yRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgeworICAgICAgICBzdXBlcihjYXVzZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9pbmplY3QvRm9yZWlnbkRlc2NyaXB0b3IuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvaW5qZWN0L0ZvcmVpZ25EZXNjcmlwdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE1OGRhOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvaW5qZWN0L0ZvcmVpZ25EZXNjcmlwdG9yLmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CisKKy8qKgorICogVGhlIGRlc2NyaXB0b3IgaG9sZGVyIGZvciBhbiBleHRlcm5hbGx5IHByb3ZpZGVkIERJIHByb3ZpZGVycy4gVXNpbmcgdGhpcyBpbnRlcmZhY2UgREkgcHJvdmlkZXIgaXMgYWJsZSB0byBwcm92aWRlciBoaXMgb3duCisgKiBkZXNjcmlwdG9yIHdoaWNoIGNhbiBiZSB1c2VkIGFuZCByZXR1cm5lZCB0byB0aGUgREkgcHJvdmlkZXIgaW4gZnVydGhlciBwcm9jZXNzaW5nLgorICogPHA+CisgKiBUaGlzIGlzIHVzZWZ1bCBpbiB0aGUgY2FzZSBvZiBjYWNoaW5nIHdoZXJlIGFuIGFsZ29yaXRobSBpcyBhYmxlIHRvIHN0b3JlIGFuZCBzdWJzZXF1ZW50bHkgcHJvdmlkZSBmb3IgYW4gaW5qZWN0aW9uIHRoZSBhbHJlYWR5CisgKiByZXNvbHZlZCBkZXNjcmlwdG9yIG9mIHRoZSBzYW1lIHZhbHVlLgorICovCitwdWJsaWMgaW50ZXJmYWNlIEZvcmVpZ25EZXNjcmlwdG9yIHsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gb2JqZWN0IHRoYXQgY2FuIGJlIGNhc3Qgb24gdGhlIHNpZGUgb2YgREkgcHJvdmlkZXIgdG8gaGlzIGRlc2NyaXB0b3IuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIERJIHByb3ZpZGVyJ3MgZGVzY3JpcHRvci4KKyAgICAgKi8KKyAgICBPYmplY3QgZ2V0KCk7CisKKyAgICAvKioKKyAgICAgKiBEaXNwb3NlcyB0aGlzIGluc3RhbmNlLiBBbGwgdGhlIFBlckxvb2t1cCBvYmplY3RzIHRoYXQgd2VyZSBjcmVhdGVkIGZvciB0aGlzIGluc3RhbmNlIHdpbGwgYmUgZGVzdHJveWVkIGFmdGVyIHRoaXMKKyAgICAgKiBvYmplY3QgaGFzIGJlZW4gZGVzdHJveWVkLgorICAgICAqCisgICAgICogQHBhcmFtIGluc3RhbmNlIFRoZSBpbnN0YW5jZSB0byBkZXN0cm95LgorICAgICAqLworICAgIHZvaWQgZGlzcG9zZShPYmplY3QgaW5zdGFuY2UpOworCisgICAgLyoqCisgICAgICogV3JhcHMgaW5jb21pbmcgZGVzY3JpcHRvciBpbnN0YW5jZSBhbmQgcHJvdmlkZXMgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBGb3JlaWduRGVzY3JpcHRvcn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVzY3JpcHRvciBpbmNvbWluZyBmb3JlaWduIGRlc2NyaXB0b3IuCisgICAgICogQHJldHVybiB3cmFwcGVkIGZvcmVpZ24gZGVzY3JpcHRvci4KKyAgICAgKi8KKyAgICAgc3RhdGljIEZvcmVpZ25EZXNjcmlwdG9yIHdyYXAoT2JqZWN0IGRlc2NyaXB0b3IpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGb3JlaWduRGVzY3JpcHRvckltcGwoZGVzY3JpcHRvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JhcHMgaW5jb21pbmcgZGVzY3JpcHRvciBpbnN0YW5jZSBhbmQgcHJvdmlkZXMgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBGb3JlaWduRGVzY3JpcHRvcn0gYWxvbmcgd2l0aCBhCisgICAgICoge0BsaW5rIENvbnN1bWVyfSBmb3IgYSBkaXNwb3NpbmcgYW4gaW5zdGFuY2UgY3JlYXRlZCB1c2luZyBhIGdpdmVuIGRlc2NyaXB0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVzY3JpcHRvciAgICAgIGluY29taW5nIGZvcmVpZ24gZGVzY3JpcHRvci4KKyAgICAgKiBAcGFyYW0gZGlzcG9zZUluc3RhbmNlIGNvbnN1bWVyIHdoaWNoIGlzIGFibGUgdG8gZGlzcG9zZSBhbiBpbnN0YW5jZSBjcmVhdGVkIHdpdGggdGhlIGdpdmVuIGRlc2NyaXB0b3IuCisgICAgICogQHJldHVybiB3cmFwcGVkIGZvcmVpZ24gZGVzY3JpcHRvci4KKyAgICAgKi8KKyAgICBzdGF0aWMgRm9yZWlnbkRlc2NyaXB0b3Igd3JhcChPYmplY3QgZGVzY3JpcHRvciwgQ29uc3VtZXI8T2JqZWN0PiBkaXNwb3NlSW5zdGFuY2UpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGb3JlaWduRGVzY3JpcHRvckltcGwoZGVzY3JpcHRvciwgZGlzcG9zZUluc3RhbmNlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2luamVjdC9Gb3JlaWduRGVzY3JpcHRvckltcGwuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvaW5qZWN0L0ZvcmVpZ25EZXNjcmlwdG9ySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiYWFjODUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2luamVjdC9Gb3JlaWduRGVzY3JpcHRvckltcGwuamF2YQpAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdDsKKworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKKworLyoqCisgKiBUaGUgZGVzY3JpcHRvciBob2xkZXIgZm9yIGFuIGV4dGVybmFsbHkgcHJvdmlkZWQgREkgcHJvdmlkZXJzLiBVc2luZyB0aGlzIGludGVyZmFjZSBESSBwcm92aWRlciBpcyBhYmxlIHRvIHByb3ZpZGVyIGhpcyBvd24KKyAqIGRlc2NyaXB0b3Igd2hpY2ggY2FuIGJlIHVzZWQgYW5kIHJldHVybmVkIHRvIHRoZSBESSBwcm92aWRlciBpbiBmdXJ0aGVyIHByb2Nlc3NpbmcuCisgKiA8cD4KKyAqIFRoaXMgaXMgdXNlZnVsIGluIHRoZSBjYXNlIG9mIGNhY2hpbmcgd2hlcmUgYW4gYWxnb3JpdGhtIGlzIGFibGUgdG8gc3RvcmUgYW5kIHN1YnNlcXVlbnRseSBwcm92aWRlIGZvciBhbiBpbmplY3Rpb24gdGhlIGFscmVhZHkKKyAqIHJlc29sdmVkIGRlc2NyaXB0b3Igb2YgdGhlIHNhbWUgdmFsdWUuCisgKi8KK3B1YmxpYyBjbGFzcyBGb3JlaWduRGVzY3JpcHRvckltcGwgaW1wbGVtZW50cyBGb3JlaWduRGVzY3JpcHRvciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb25zdW1lcjxPYmplY3Q+IE5PT1BfRElTUE9TRV9JTlNUQU5DRSA9IGluc3RhbmNlIC0+IHt9OworCisgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgZm9yZWlnbkRlc2NyaXB0b3I7CisgICAgcHJpdmF0ZSBmaW5hbCBDb25zdW1lcjxPYmplY3Q+IGRpc3Bvc2VJbnN0YW5jZTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGFjY2VwdHMgYSBkZXNjcmlwdG9yIG9mIHRoZSBESSBwcm92aWRlciBhbmQgdG8gYmUgYWJsZSB0byBwcm92aWRlIGl0IGluIGZ1cnRoZXIgcHJvY2Vzc2luZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmb3JlaWduRGVzY3JpcHRvciBESSBwcm92aWRlcidzIGRlc2NyaXB0b3IuCisgICAgICovCisgICAgcHVibGljIEZvcmVpZ25EZXNjcmlwdG9ySW1wbChPYmplY3QgZm9yZWlnbkRlc2NyaXB0b3IpIHsKKyAgICAgICAgdGhpcyhmb3JlaWduRGVzY3JpcHRvciwgTk9PUF9ESVNQT1NFX0lOU1RBTkNFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBhY2NlcHRzIGEgZGVzY3JpcHRvciBvZiB0aGUgREkgcHJvdmlkZXIgYW5kIHRvIGJlIGFibGUgdG8gcHJvdmlkZSBpdCBpbiBmdXJ0aGVyIHByb2Nlc3NpbmcgYWxvbmcgd2l0aAorICAgICAqIGRpc3Bvc2UgbWVjaGFuaXNtIHRvIGRlc3Ryb3kgdGhlIG9iamVjdHMgY29ycmVzcG9uZGluZyB0aGUgZ2l2ZW4ge0Bjb2RlIGZvcmVpZ24ga2V5fS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmb3JlaWduRGVzY3JpcHRvciBESSBwcm92aWRlcidzIGRlc2NyaXB0b3IuCisgICAgICovCisgICAgcHVibGljIEZvcmVpZ25EZXNjcmlwdG9ySW1wbChPYmplY3QgZm9yZWlnbkRlc2NyaXB0b3IsIENvbnN1bWVyPE9iamVjdD4gZGlzcG9zZUluc3RhbmNlKSB7CisgICAgICAgIHRoaXMuZm9yZWlnbkRlc2NyaXB0b3IgPSBmb3JlaWduRGVzY3JpcHRvcjsKKyAgICAgICAgdGhpcy5kaXNwb3NlSW5zdGFuY2UgPSBkaXNwb3NlSW5zdGFuY2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdCBnZXQoKSB7CisgICAgICAgIHJldHVybiBmb3JlaWduRGVzY3JpcHRvcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKE9iamVjdCBpbnN0YW5jZSkgeworICAgICAgICBkaXNwb3NlSW5zdGFuY2UuYWNjZXB0KGluc3RhbmNlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKHRoaXMgPT0gbykgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIEZvcmVpZ25EZXNjcmlwdG9ySW1wbCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBGb3JlaWduRGVzY3JpcHRvckltcGwgdGhhdCA9IChGb3JlaWduRGVzY3JpcHRvckltcGwpIG87CisgICAgICAgIHJldHVybiBmb3JlaWduRGVzY3JpcHRvci5lcXVhbHModGhhdC5mb3JlaWduRGVzY3JpcHRvcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIGZvcmVpZ25EZXNjcmlwdG9yLmhhc2hDb2RlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9pbmplY3QvRm9yZWlnblJlcXVlc3RTY29wZUJyaWRnZS5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9pbmplY3QvRm9yZWlnblJlcXVlc3RTY29wZUJyaWRnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhYmJlMTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2luamVjdC9Gb3JlaWduUmVxdWVzdFNjb3BlQnJpZGdlLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIEludGVybmFsIHNlcnZpY2UgdG8gaGVscCBkZXRlcm1pbmUKKyAqIHdoaWNoIEhLMiBmYWN0b3J5IHByb3ZpZGVkIGNvbXBvbmVudHMgc2hvdWxkIGJlIHRyZWF0ZWQKKyAqIGFzIHJlcXVlc3Qgc2NvcGVkLiBUaGlzIGlzIHRvIGhlbHAgYXZvaWQgaGF2aW5nCisgKiBkeW5hbWljIHByb3hpZXMgb2YgcmVxdWVzdCBzY29wZWQgY29tcG9uZW50cyBpbmplY3RlZCBpbnRvCisgKiBmYWN0b3J5IGNyZWF0ZWQgY29tcG9uZW50cyBtYW5hZ2VkIGJ5IDNyZCBwYXJ0eSBjb21wb25lbnQKKyAqIHByb3ZpZGVycworICoKKyAqIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKS4KKyAqLworcHVibGljIGludGVyZmFjZSBGb3JlaWduUmVxdWVzdFNjb3BlQnJpZGdlIHsKKworICAgIC8qKgorICAgICAqIEdldCBtZSBhIHNldCBvZiBjbGFzc2VzIHRoYXQgYXJlIG1hbmFnZWQgb3V0c2lkZSBvZiBISzIKKyAgICAgKiBhbmQgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgaWYgSEsyIHJlcXVlc3Qgc2NvcGVkLgorICAgICAqCisgICAgICogQHJldHVybiBzZXQgb2YgY2xhc3NlcyByZXByZXNlbnRpbmcgZm9yZWlnbiByZXF1ZXN0IHNjb3BlZCBjb21wb25lbnRzLgorICAgICAqLworICAgIFNldDxDbGFzczw/Pj4gZ2V0UmVxdWVzdFNjb3BlZENvbXBvbmVudHMoKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvaW5qZWN0L0luamVjdGVlLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2luamVjdC9JbmplY3RlZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNjY4ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2luamVjdC9JbmplY3RlZS5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdDsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQW5ub3RhdGVkRWxlbWVudDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogQW4gSW5qZWN0ZWUgcmVwcmVzZW50cyB0aGUgcG9pbnQgb2YgaW5qZWN0aW9uLiBJdCBjYW4gYmUgdXNlZCBieSBpbmplY3Rpb24gcmVzb2x2ZXJzIHRvIGRpc2NvdmVyIGFsbCBvZiB0aGUgaW5mb3JtYXRpb24KKyAqIGF2YWlsYWJsZSBhYm91dCB0aGUgZW50aXR5IGJlaW5nIGluamVjdGVkIGludG8uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSW5qZWN0ZWUgeworCisgICAgLyoqCisgICAgICogVGhpcyBpcyB0aGUgcmVxdWlyZWQgdHlwZSBvZiB0aGUgaW5qZWN0ZWUuIFRoZSBvYmplY3QgdGhhdCBpcyBpbmplY3RlZCBpbnRvIHRoaXMgcG9pbnQgbXVzdCBiZSB0eXBlLXNhZmUgd2l0aCByZWdhcmRzIHRvCisgICAgICogdGhpcyB0eXBlLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgdHlwZSB0aGF0IHRoaXMgaW5qZWN0ZWUgaXMgZXhwZWN0aW5nLiBBbnkgb2JqZWN0IGluamVjdGVkIGludG8gdGhpcyBpbmplY3Rpb24gcG9pbnQgbXVzdCBiZSB0eXBlLXNhZmUgd2l0aAorICAgICAqIHJlZ2FyZHMgdG8gdGhpcyB0eXBlLgorICAgICAqLworICAgIFR5cGUgZ2V0UmVxdWlyZWRUeXBlKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHRoZSBzZXQgb2YgcmVxdWlyZWQgcXVhbGlmaWVycyBmb3IgdGhpcyBpbmplY3RlZS4gQWxsIG9mIHRoZXNlIHF1YWxpZmllcnMgbXVzdCBiZSBwcmVzZW50IG9uIHRoZSBpbXBsZW1lbnRhdGlvbgorICAgICAqIGNsYXNzIG9mIHRoZSBvYmplY3QgdGhhdCBpcyBpbmplY3RlZCBpbnRvIHRoaXMgaW5qZWN0ZWUuIE5vdGUgdGhhdCB0aGUgZmllbGRzIG9mIHRoZSBhbm5vdGF0aW9uIG11c3QgYWxzbyBtYXRjaC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gV2lsbCBub3QgcmV0dXJuIHtAY29kZSBudWxsfSwgYnV0IG1heSByZXR1cm4gYW4gZW1wdHkgc2V0LiBUaGUgc2V0IG9mIGFsbCBxdWFsaWZpZXJzIHRoYXQgbXVzdCBtYXRjaC4KKyAgICAgKi8KKyAgICBTZXQ8QW5ub3RhdGlvbj4gZ2V0UmVxdWlyZWRRdWFsaWZpZXJzKCk7CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGlzIEluamVjdGVlIGlzIGEgY29uc3RydWN0b3Igb3IgbWV0aG9kIHBhcmFtZXRlciwgdGhpcyB3aWxsIHJldHVybiB0aGUgaW5kZXggb2YgdGhlIHBhcmFtZXRlci4gSWYgdGhpcworICAgICAqIHtAY29kZSBJbmplY3RlZX0gaXMgYSBmaWVsZCwgdGhpcyB3aWxsIHJldHVybiB7QGNvZGUgLTF9LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgcG9zaXRpb24gb2YgdGhlIHBhcmFtZXRlciwgb3Ige0Bjb2RlIC0xfSBpZiB0aGlzIGlzIGEgZmllbGQuCisgICAgICovCisgICAgaW50IGdldFBvc2l0aW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBwYXJlbnQgY2xhc3MgZm9yIHRoaXMgaW5qZWN0ZWUuIFRoaXMgaXMgdGhlIGNsYXNzIG9mIHRoZSBvYmplY3QgdGhhdCB3aWxsIGJlIGluamVjdGVkIGludG8uIFRoaXMgZmllbGQgbWF5CisgICAgICogcmV0dXJuIHtAY29kZSBudWxsfSBpZiB0aGlzIGlzIGZyb20gYSBzZXJ2aWNlIGxvb2t1cC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGNsYXNzIG9mIHRoZSBvYmplY3QgdGhhdCB3aWxsIGJlIGluamVjdGVkIGludG8uCisgICAgICovCisgICAgQ2xhc3M8Pz4gZ2V0SW5qZWN0ZWVDbGFzcygpOworCisgICAgLyoqCisgICAgICogSWYgdGhpcyBJbmplY3RlZSBpcyBpbiBhIGNvbnN0cnVjdG9yIHRoaXMgd2lsbCByZXR1cm4gdGhlIGNvbnN0cnVjdG9yIGJlaW5nIGluamVjdGVkIGludG8uIElmIHRoaXMgSW5qZWN0ZWUgaXMgaW4gYQorICAgICAqIG1ldGhvZCB0aGlzIHdpbGwgcmV0dXJuIHRoZSBtZXRob2QgYmVpbmcgaW5qZWN0ZWQgaW50by4gSWYgdGhpcyBpbmplY3RlZSByZXByZXNlbnRzIGEgZmllbGQsIHRoaXMgd2lsbCByZXR1cm4gdGhlIGZpZWxkCisgICAgICogYmVpbmcgaW5qZWN0ZWQgaW50by4gVGhpcyBpbmplY3RlZSBtYXkgYmUgbmVpdGhlciBpbiB3aGljaCBjYXNlIHRoaXMgd2lsbCByZXR1cm4ge0Bjb2RlIG51bGx9LgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgcGFyZW50IG9mIHRoZSBpbmplY3RlZSwgd2hpY2ggbWF5IGJlIHtAY29kZSBudWxsfS4KKyAgICAgKi8KKyAgICBBbm5vdGF0ZWRFbGVtZW50IGdldFBhcmVudCgpOworCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBpbmplY3Rpb24gcG9pbnQgaXMgYW5ub3RhdGVkIHdpdGggJiM4NjtPcHRpb25hbC4gSW4gdGhpcyBjYXNlIGlmIHRoZXJlIGlzIG5vCisgICAgICogZGVmaW5pdGlvbiBmb3IgIHRoZSBpbmplY3Rpb24gcG9pbnQgaW4gdGhlIHN5c3RlbSBpdCBpcyBhbGxvd2FibGUgZm9yIHRoZSBzeXN0ZW0gdG8gbWVyZWx5IHJldHVybiB7QGNvZGUgbnVsbH0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgaW5qZWN0aW9uIHBvaW50IGlzIGFubm90YXRlZCB3aXRoICYjODY7T3B0aW9uYWwsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2xlYW4gaXNPcHRpb25hbCgpOworCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBmb3JlaWduIGRlc2NyaXB0b3Igb2YgdGhlIGN1cnJlbnQgaW5qZWN0ZWUgdGhhdCBtZWFucyB0aGF0IHRoZSBESSBwcm92aWRlciBpcyBhYmxlIHRvIHN0b3JlIGl0cworICAgICAqIHNwZWNpZmljIGRlc2NyaXB0b3IgYW5kIHRoYXQgdXNlIGl0IGluIHRoZSBkZXNjcmlwdG9yIHByb2Nlc3NpbmcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIERJIHNwZWNpZmljIGZvcmVpZ24gZGVzY3JpcHRvci4KKyAgICAgKi8KKyAgICBGb3JlaWduRGVzY3JpcHRvciBnZXRJbmplY3RlZURlc2NyaXB0b3IoKTsKKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgc2NvcGUgaW4gd2hpY2ggdGhlIHBhcmVudCBjbGFzcyBpcyByZWdpc3RlcmVkLgorICAgICAqCisgICAgICogQHJldHVybiBzY29wZSBhbm5vdGF0aW9uLgorICAgICAqLworICAgIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBnZXRQYXJlbnRDbGFzc1Njb3BlKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGUgaW5qZWN0ZWUgdmFsdWUgaXMgcHJvdmlkZWQgdXNpbmcge0BsaW5rIGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcn0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgaW5qZWN0ZWUgaXMgYSBmYWN0b3J5LgorICAgICAqLworICAgIGJvb2xlYW4gaXNGYWN0b3J5KCk7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGUgaW5qZWN0ZWUgdmFsdWUgaXMgcHJvdmlkZWQgdXNpbmcge0BsaW5rIGphdmF4LmluamVjdC5Qcm92aWRlcn0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgaW5qZWN0ZWUgaXMgYSBwcm92aWRlci4KKyAgICAgKi8KKyAgICBib29sZWFuIGlzUHJvdmlkZXIoKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvaW5qZWN0L0luamVjdGVlSW1wbC5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9pbmplY3QvSW5qZWN0ZWVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdlYjFlZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvaW5qZWN0L0luamVjdGVlSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjM3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdDsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQW5ub3RhdGVkRWxlbWVudDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUHJldHR5OworCisvKioKKyAqIEFuIEluamVjdGVlIHJlcHJlc2VudHMgdGhlIHBvaW50IG9mIGluamVjdGlvbi4gSXQgY2FuIGJlIHVzZWQgYnkgaW5qZWN0aW9uIHJlc29sdmVycyB0byBkaXNjb3ZlciBhbGwgb2YgdGhlIGluZm9ybWF0aW9uCisgKiBhdmFpbGFibGUgYWJvdXQgdGhlIGVudGl0eSBiZWluZyBpbmplY3RlZCBpbnRvLgorICovCitwdWJsaWMgY2xhc3MgSW5qZWN0ZWVJbXBsIGltcGxlbWVudHMgSW5qZWN0ZWUgeworCisgICAgcHJpdmF0ZSBUeXBlIHJlcXVpcmVkVHlwZTsKKyAgICBwcml2YXRlIFNldDxBbm5vdGF0aW9uPiBxdWFsaWZpZXJzOworICAgIHByaXZhdGUgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IHBhcmVudENsYXNzU2NvcGU7CisgICAgcHJpdmF0ZSBpbnQgcG9zaXRpb24gPSAtMTsKKyAgICBwcml2YXRlIENsYXNzPD8+IGluamVjdGVlQ2xhc3M7CisgICAgcHJpdmF0ZSBBbm5vdGF0ZWRFbGVtZW50IHBhcmVudDsKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNPcHRpb25hbCA9IGZhbHNlOworICAgIHByaXZhdGUgYm9vbGVhbiBpc0ZhY3RvcnkgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNQcm92aWRlciA9IGZhbHNlOworICAgIHByaXZhdGUgRm9yZWlnbkRlc2NyaXB0b3IgaW5qZWN0ZWVEZXNjcmlwdG9yOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFR5cGUgZ2V0UmVxdWlyZWRUeXBlKCkgeworICAgICAgICByZXR1cm4gcmVxdWlyZWRUeXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHJlcXVpcmVkIHR5cGUgb2YgdGhpcyBJbmplY3RlZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1aXJlZFR5cGUgVGhlIHJlcXVpcmVkIHR5cGUgb2YgdGhpcyBpbmplY3RlZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXF1aXJlZFR5cGUoVHlwZSByZXF1aXJlZFR5cGUpIHsKKyAgICAgICAgdGhpcy5yZXF1aXJlZFR5cGUgPSByZXF1aXJlZFR5cGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxBbm5vdGF0aW9uPiBnZXRSZXF1aXJlZFF1YWxpZmllcnMoKSB7CisgICAgICAgIGlmIChxdWFsaWZpZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBxdWFsaWZpZXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHJlcXVpcmVkIHF1YWxpZmllcnMgZm9yIHRoaXMgSW5qZWN0ZWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWlyZWRRdWFsaWZpZXJzIFRoZSBub24tbnVsbCBzZXQgb2YgcmVxdWlyZWQgcXVhbGlmaWVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXF1aXJlZFF1YWxpZmllcnMoU2V0PEFubm90YXRpb24+IHJlcXVpcmVkUXVhbGlmaWVycykgeworICAgICAgICBxdWFsaWZpZXJzID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KHJlcXVpcmVkUXVhbGlmaWVycyk7CisKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGdldFBhcmVudENsYXNzU2NvcGUoKSB7CisgICAgICAgIHJldHVybiBwYXJlbnRDbGFzc1Njb3BlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc2NvcGUgaW4gd2hpY2ggdGhlIHBhcmVudCBjbGFzcyBpcyByZWdpc3RlcmVkLgorICAgICAqCisgICAgICogQHJldHVybiBwYXJlbnQgY2xhc3Mgc2NvcGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFyZW50Q2xhc3NTY29wZShDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gcGFyZW50Q2xhc3NTY29wZSkgeworICAgICAgICB0aGlzLnBhcmVudENsYXNzU2NvcGUgPSBwYXJlbnRDbGFzc1Njb3BlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzRmFjdG9yeSgpIHsKKyAgICAgICAgcmV0dXJuIGlzRmFjdG9yeTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGEgZmxhZyB3aGV0aGVyIHRoZSBpbmplY3RlZSBpcyBhIGZhY3RvcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmFjdG9yeSB7QGNvZGUgdHJ1ZX0gZmxhZyB3aGV0aGVyIHRoZSBpbmplY3RlZSBpcyBmYWN0b3J5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZhY3RvcnkoYm9vbGVhbiBmYWN0b3J5KSB7CisgICAgICAgIGlzRmFjdG9yeSA9IGZhY3Rvcnk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNQcm92aWRlcigpIHsKKyAgICAgICAgcmV0dXJuIGlzUHJvdmlkZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyBhIGZsYWcgd2hldGhlciB0aGUgaW5qZWN0ZWUgaXMgYSBwcm92aWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm92aWRlciB7QGNvZGUgdHJ1ZX0gZmxhZyB3aGV0aGVyIHRoZSBpbmplY3RlZSBpcyBwcm92aWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm92aWRlcihib29sZWFuIHByb3ZpZGVyKSB7CisgICAgICAgIGlzUHJvdmlkZXIgPSBwcm92aWRlcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldFBvc2l0aW9uKCkgeworICAgICAgICByZXR1cm4gcG9zaXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgcG9zaXRpb24gb2YgdGhpcyBJbmplY3RlZS4gVGhlIHBvc2l0aW9uIHJlcHJlc2VudHMgdGhlIGluZGV4IG9mIHRoZSBwYXJhbWV0ZXIsIG9yIHtAY29kZSAtMX0gaWYgdGhpcyBJbmplY3RlZSBpcworICAgICAqIGRlc2NyaWJpbmcgYSBmaWVsZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgaW5kZXggcG9zaXRpb24gb2YgdGhlIHBhcmFtZXRlciwgb3Ige0Bjb2RlIC0xfSBpZiBkZXNjcmliaW5nIGEgZmllbGQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UG9zaXRpb24oaW50IHBvc2l0aW9uKSB7CisgICAgICAgIHRoaXMucG9zaXRpb24gPSBwb3NpdGlvbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0SW5qZWN0ZWVDbGFzcygpIHsKKyAgICAgICAgcmV0dXJuIGluamVjdGVlQ2xhc3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0eXBlIG9mIHRoZSBpbmplY3RlZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmplY3RlZUNsYXNzIGluamVjdGVlIHR5cGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW5qZWN0ZWVDbGFzcyhmaW5hbCBDbGFzczw/PiBpbmplY3RlZUNsYXNzKSB7CisgICAgICAgIHRoaXMuaW5qZWN0ZWVDbGFzcyA9IGluamVjdGVlQ2xhc3M7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFubm90YXRlZEVsZW1lbnQgZ2V0UGFyZW50KCkgeworICAgICAgICByZXR1cm4gcGFyZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgc2V0dGVyIHNldHMgYm90aCB0aGUgcGFyZW50IGFuZCB0aGUgaW5qZWN0ZWVDbGFzcyBmaWVsZHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50IFRoZSBwYXJlbnQgKEZpZWxkLCBDb25zdHJ1Y3RvciBvciBNZXRob2QpIHdoaWNoIGlzIHRoZSBwYXJlbnQgb2YgdGhpcyBJbmplY3RlZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQpIHsKKyAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisKKyAgICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIEZpZWxkKSB7CisgICAgICAgICAgICBpbmplY3RlZUNsYXNzID0gKChGaWVsZCkgcGFyZW50KS5nZXREZWNsYXJpbmdDbGFzcygpOworICAgICAgICB9IGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSB7CisgICAgICAgICAgICBpbmplY3RlZUNsYXNzID0gKChDb25zdHJ1Y3Rvcjw/PikgcGFyZW50KS5nZXREZWNsYXJpbmdDbGFzcygpOworICAgICAgICB9IGVsc2UgaWYgKHBhcmVudCBpbnN0YW5jZW9mIE1ldGhvZCkgeworICAgICAgICAgICAgaW5qZWN0ZWVDbGFzcyA9ICgoTWV0aG9kKSBwYXJlbnQpLmdldERlY2xhcmluZ0NsYXNzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc09wdGlvbmFsKCkgeworICAgICAgICByZXR1cm4gaXNPcHRpb25hbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHdoZXRoZXIgb3Igbm90IHRoaXMgSW5qZWN0ZWUgc2hvdWxkIGJlIGNvbnNpZGVyZWQgb3B0aW9uYWwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3B0aW9uYWwgdHJ1ZSBpZiB0aGlzIGluamVjdGVlIGlzIG9wdGlvbmFsLCBmYWxzZSBpZiByZXF1aXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRPcHRpb25hbChib29sZWFuIG9wdGlvbmFsKSB7CisgICAgICAgIHRoaXMuaXNPcHRpb25hbCA9IG9wdGlvbmFsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBGb3JlaWduRGVzY3JpcHRvciBnZXRJbmplY3RlZURlc2NyaXB0b3IoKSB7CisgICAgICAgIHJldHVybiBpbmplY3RlZURlc2NyaXB0b3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZGVzY3JpcHRvciBmb3IgdGhpcyBJbmplY3RlZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmplY3RlZURlc2NyaXB0b3IgaW5qZWN0ZWUncyBkZXNjcmlwdG9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEluamVjdGVlRGVzY3JpcHRvcihGb3JlaWduRGVzY3JpcHRvciBpbmplY3RlZURlc2NyaXB0b3IpIHsKKyAgICAgICAgdGhpcy5pbmplY3RlZURlc2NyaXB0b3IgPSBpbmplY3RlZURlc2NyaXB0b3I7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJJbmplY3RlZUltcGwocmVxdWlyZWRUeXBlPSIgKyBQcmV0dHkudHlwZShyZXF1aXJlZFR5cGUpCisgICAgICAgICAgICAgICAgKyAiLHBhcmVudD0iICsgUHJldHR5LmNsYXp6KHBhcmVudC5nZXRDbGFzcygpKQorICAgICAgICAgICAgICAgICsgIixxdWFsaWZpZXJzPSIgKyBQcmV0dHkuY29sbGVjdGlvbihxdWFsaWZpZXJzKQorICAgICAgICAgICAgICAgICsgIixwb3NpdGlvbj0iICsgcG9zaXRpb24KKyAgICAgICAgICAgICAgICArICIsZmFjdG9yeT0iICsgaXNGYWN0b3J5CisgICAgICAgICAgICAgICAgKyAiLHByb3ZpZGVyPSIgKyBpc1Byb3ZpZGVyCisgICAgICAgICAgICAgICAgKyAiLG9wdGlvbmFsPSIgKyBpc09wdGlvbmFsCisgICAgICAgICAgICAgICAgKyAiLCIgKyBTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZSh0aGlzKSArICIpIjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKHRoaXMgPT0gbykgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIEluamVjdGVlSW1wbCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBJbmplY3RlZUltcGwgaW5qZWN0ZWUgPSAoSW5qZWN0ZWVJbXBsKSBvOworICAgICAgICByZXR1cm4gcG9zaXRpb24gPT0gaW5qZWN0ZWUucG9zaXRpb24KKyAgICAgICAgICAgICAgICAmJiBpc09wdGlvbmFsID09IGluamVjdGVlLmlzT3B0aW9uYWwKKyAgICAgICAgICAgICAgICAmJiBpc0ZhY3RvcnkgPT0gaW5qZWN0ZWUuaXNGYWN0b3J5CisgICAgICAgICAgICAgICAgJiYgaXNQcm92aWRlciA9PSBpbmplY3RlZS5pc1Byb3ZpZGVyCisgICAgICAgICAgICAgICAgJiYgT2JqZWN0cy5lcXVhbHMocmVxdWlyZWRUeXBlLCBpbmplY3RlZS5yZXF1aXJlZFR5cGUpCisgICAgICAgICAgICAgICAgJiYgT2JqZWN0cy5lcXVhbHMocXVhbGlmaWVycywgaW5qZWN0ZWUucXVhbGlmaWVycykKKyAgICAgICAgICAgICAgICAmJiBPYmplY3RzLmVxdWFscyhpbmplY3RlZUNsYXNzLCBpbmplY3RlZS5pbmplY3RlZUNsYXNzKQorICAgICAgICAgICAgICAgICYmIE9iamVjdHMuZXF1YWxzKHBhcmVudCwgaW5qZWN0ZWUucGFyZW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gT2JqZWN0cy5oYXNoKHJlcXVpcmVkVHlwZSwgcXVhbGlmaWVycywgcG9zaXRpb24sIGluamVjdGVlQ2xhc3MsIHBhcmVudCwgaXNPcHRpb25hbCwgaXNGYWN0b3J5KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2luamVjdC9JbmplY3Rpb25NYW5hZ2VyLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2luamVjdC9JbmplY3Rpb25NYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBlM2U0NQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvaW5qZWN0L0luamVjdGlvbk1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDI0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3Q7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogSW50ZXJmYWNlIHByb3ZpZGVzIHRoZSBjb21tdW5pY2F0aW9uIEFQSSBiZXR3ZWVuIEplcnNleSBhbmQgRGVwZW5kZW5jeSBJbmplY3Rpb24gcHJvdmlkZXIuCisgKiA8cD4KKyAqIExpZmVjeWNsZSBtZXRob2RzIHNob3VsZCBiZSBjYWxsZWQgaW4gdGhpcyBvcmRlcjoKKyAqIDx1bD4KKyAqIDxsaT57QGxpbmsgI2NvbXBsZXRlUmVnaXN0cmF0aW9uKCl9IC0gbm90aWZpZXMgdGhhdCBKZXJzZXkgYm9vdHN0cmFwIGhhcyBiZWVuIGZpbmlzaGVkIGFuZCBESSBwcm92aWRlciBzaG91bGQgYmUgcmVhZHkgZm9yIGEgcnVudGltZS48L2xpPgorICogPGxpPntAbGluayAjc2h1dGRvd24oKX0gLSBKZXJzZXkgYXBwbGljYXRpb24gaGFzIGJlZW4gY2xvc2VkIGFuZCBESSBwcm92aWRlciBzaG91bGQgbWFrZSBuZWVkZWQgY2xlYW5pbmcgc3RlcHMuPC9saT4KKyAqIDwvdWw+CisgKiA8cD4KKyAqIEFsbCB7QGNvZGUgZ2V0SW5zdGFuY2V9IG1ldGhvZHMgY2FuIGJlIGNhbGxlZCBhZnRlciB7QGxpbmsgI2NvbXBsZXRlUmVnaXN0cmF0aW9uKCl9IG1ldGhvZCBoYXMgYmVlbiBjYWxsZWQgYmVjYXVzZSBhdCB0aGlzIGFsbAorICogY29tcG9uZW50cyBhcmUgYm91bmQgdG8gaW5qZWN0aW9uIG1hbmFnZXIgYW5kIHJlYWR5IGZvciBnZXR0aW5nLgorICogSW4gdHVybiwge0BsaW5rICNzaHV0ZG93bigpfSBtZXRob2Qgc3RvcHMgdGhlIHBvc3NpYmlsaXR5IHRvIHVzZSB0aGVzZSBtZXRob2RzIGFuZCBjbG9zZXMge0Bjb2RlIEluamVjdGlvbk1hbmFnZXJ9LgorICoKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitwdWJsaWMgaW50ZXJmYWNlIEluamVjdGlvbk1hbmFnZXIgeworCisgICAgLyoqCisgICAgICogQ29tcGxldGVzIHtAbGluayBJbmplY3Rpb25NYW5hZ2VyfSBhbmQgdGhlIHVuZGVybHlpbmcgREkgcHJvdmlkZXIuIEFsbCByZWdpc3RlcmVkIGNvbXBvbmVudHMgYXJlIGJvdW5kIHRvIGluamVjdGlvbgorICAgICAqIG1hbmFnZXIgYW5kIGFmdGVyIGFuIGludm9jYXRpb24gb2YgdGhpcyBtZXRob2QgYWxsIGNvbXBvbmVudHMgYXJlIGF2YWlsYWJsZSB1c2luZyBlLmcuIHtAbGluayAjZ2V0SW5zdGFuY2UoQ2xhc3MpfS4KKyAgICAgKi8KKyAgICB2b2lkIGNvbXBsZXRlUmVnaXN0cmF0aW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBTaHV0cyBkb3duIHRoZSBlbnRpcmUge0BsaW5rIEluamVjdGlvbk1hbmFnZXJ9IGFuZCB0aGUgdW5kZXJseWluZyBESSBwcm92aWRlci4KKyAgICAgKiA8cD4KKyAgICAgKiBTaHV0ZG93biBwaGFzZSBpcyBkZWRpY2F0ZWQgdG8gbWFrZSBzb21lIGZpbmFsIGNsZWFuaW5nIHN0ZXBzIHJlZ2FyZGluZyB1bmRlcmx5aW5nIERJIHByb3ZpZGVyLgorICAgICAqLworICAgIHZvaWQgc2h1dGRvd24oKTsKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVycyBvbmUgYmVhbiByZXByZXNlbnRlZCB1c2luZyBmaWVsZHMgaW4gdGhlIHByb3ZpZGVkIGRlc2NyaXB0b3IuIFRoZSBmaW5hbCBiZWFuIGNhbiBiZSBkaXJlY3QgYmVhbiBvcgorICAgICAqIGZhY3Rvcnkgb2JqZWN0IHdoaWNoIHdpbGwgY3JlYXRlIHRoZSBiZWFuIGF0IHRoZSB0aW1lIG9mIGluamVjdGlvbi4ge0Bjb2RlIEluamVjdGlvbk1hbmFnZXJ9IGlzIGFibGUgdG8gcmVnaXN0ZXIgYSBiZWFuCisgICAgICogcmVwcmVzZW50ZWQgYnkgYSBjbGFzcyBvciBkaXJlY3QgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmluZGluZyBvbmUgZGVzY3JpcHRvci4KKyAgICAgKiBAc2VlIENsYXNzQmluZGluZworICAgICAqIEBzZWUgSW5zdGFuY2VCaW5kaW5nCisgICAgICogQHNlZSBTdXBwbGllckNsYXNzQmluZGluZworICAgICAqIEBzZWUgU3VwcGxpZXJJbnN0YW5jZUJpbmRpbmcKKyAgICAgKi8KKyAgICB2b2lkIHJlZ2lzdGVyKEJpbmRpbmcgYmluZGluZyk7CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgYSBjb2xsZWN0aW9uIG9mIGJlYW5zIHJlcHJlc2VudGVkIHVzaW5nIGZpZWxkcyBpbiB0aGUgcHJvdmlkZWQgZGVzY3JpcHRvcnMuIFRoZSBmaW5hbCBiZWFuIGNhbiBiZQorICAgICAqIGRpcmVjdCBiZWFuIG9yIGZhY3Rvcnkgb2JqZWN0IHdoaWNoIHdpbGwgY3JlYXRlIHRoZSBiZWFuIGF0IHRoZSB0aW1lIG9mIGluamVjdGlvbi4ge0Bjb2RlIEluamVjdGlvbk1hbmFnZXJ9IGlzIGFibGUgdG8KKyAgICAgKiByZWdpc3RlciBhIGJlYW4gcmVwcmVzZW50ZWQgYnkgYSBjbGFzcyBvciBkaXJlY3QgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVzY3JpcHRvcnMgY29sbGVjdGlvbiBvZiBkZXNjcmlwdG9ycy4KKyAgICAgKiBAc2VlIENsYXNzQmluZGluZworICAgICAqIEBzZWUgSW5zdGFuY2VCaW5kaW5nCisgICAgICogQHNlZSBTdXBwbGllckNsYXNzQmluZGluZworICAgICAqIEBzZWUgU3VwcGxpZXJJbnN0YW5jZUJpbmRpbmcKKyAgICAgKi8KKyAgICB2b2lkIHJlZ2lzdGVyKEl0ZXJhYmxlPEJpbmRpbmc+IGRlc2NyaXB0b3JzKTsKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVycyBiZWFucyB3aGljaCBhcmUgaW5jbHVkZWQgaW4ge0BsaW5rIEJpbmRlcn0uIHtAY29kZSBCaW5kZXJ9IGNhbiBjb250YWlucyBhbGwgZGVzY3JpcHRvcnMgZXh0ZW5kaW5nCisgICAgICoge0BsaW5rIEJpbmRpbmd9IG9yIG90aGVyIGJpbmRlcnMgd2hpY2ggYXJlIGluc3RhbGxlZCB0b2dldGhlciBpbiB0cmVlLXN0cnVjdHVyZS4gVGhpcyBtZXRob2Qgd2lsbCBnZXQgYWxsIGRlc2NyaXB0b3JzCisgICAgICogYm91bmQgaW4gdGhlIGdpdmVuIGJpbmRlciBhbmQgcmVnaXN0ZXIgdGhlbSBpbiB0aGUgb3JkZXIgaG93IHRoZSBiaW5kZXJzIGFyZSBpbnN0YWxsZWQgdG9nZXRoZXIuIEluIHRoZSB0cmVlIHN0cnVjdHVyZSwKKyAgICAgKiB0aGUgZGVlcGVyIG9uIHRoZSBsZWZ0IHNpZGUgd2lsbCBiZSBwcm9jZXNzZWQgZmlyc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmluZGVyIGNvbGxlY3Rpb24gb2YgZGVzY3JpcHRvcnMuCisgICAgICogQHNlZSBDbGFzc0JpbmRpbmcKKyAgICAgKiBAc2VlIEluc3RhbmNlQmluZGluZworICAgICAqIEBzZWUgU3VwcGxpZXJDbGFzc0JpbmRpbmcKKyAgICAgKiBAc2VlIFN1cHBsaWVySW5zdGFuY2VCaW5kaW5nCisgICAgICovCisgICAgdm9pZCByZWdpc3RlcihCaW5kZXIgYmluZGVyKTsKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVycyBhIHByb3ZpZGVyLiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIEluamVjdGlvbk1hbmFnZXJ9IHNob3VsZCB0ZXN0IHdoZXRoZXIgdGhlIHR5cGUgb2YgdGhlIG9iamVjdCBjYW4gYmUKKyAgICAgKiByZWdpc3RlcmVkIHVzaW5nIHRoZSBtZXRob2Qge0BsaW5rICNpc1JlZ2lzdHJhYmxlKENsYXNzKX0uIFRoZW4gYSBjYWxsZXIgaGFzIGFuIGNlcnRhaW50eSB0aGF0IHRoZSBpbnN0YW5jZSBvZiB0aGUgdGVzdGVkCisgICAgICogY2xhc3MgY2FuIGJlIHJlZ2lzdGVyZWQgaW4ge0Bjb2RlIEluamVjdGlvbk1hbmFnZXJ9LiBJZiB7QGNvZGUgSW5qZWN0aW9uTWFuYWdlcn0gaXMgbm90IGFibGUgdG8gcmVnaXN0ZXIgdGhlIHByb3ZpZGVyCisgICAgICogdGhlbiB7QGxpbmsgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9ufSBpcyB0aHJvd24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvdmlkZXIgb2JqZWN0IHRoYXQgY2FuIGJlIHJlZ2lzdGVyZWQgaW4ge0Bjb2RlIEluamVjdGlvbk1hbmFnZXJ9LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHByb3ZpZGVyIGNhbm5vdCBiZSByZWdpc3RlcmVkLgorICAgICAqLworICAgIHZvaWQgcmVnaXN0ZXIoT2JqZWN0IHByb3ZpZGVyKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogVGVzdHMgd2hldGhlciB0aGUgcHJvdmlkZWQge0Bjb2RlIGNsYXp6fSBjYW4gYmUgcmVnaXN0ZXJlZCBieSB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBJbmplY3Rpb25NYW5hZ2VyfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGF6eiB0eXBlIHRoYXQgaXMgdGVzdGVkIHdoZXRoZXIgaXMgcmVnaXN0cmFibGUgYnkgdGhlIGltcGxlbWVudGF0aW9uIG9mIHtAY29kZSBJbmplY3Rpb25NYW5hZ2VyfS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUge0Bjb2RlIEluamVjdGlvbk1hbmFnZXJ9IGlzIGFibGUgdG8gcmVnaXN0ZXIgdGhpcyB0eXBlLgorICAgICAqLworICAgIGJvb2xlYW4gaXNSZWdpc3RyYWJsZShDbGFzczw/PiBjbGF6eik7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzLCBpbmplY3RzIGFuZCBwb3N0LWNvbnN0cnVjdHMgYW4gb2JqZWN0IHdpdGggdGhlIGdpdmVuIGNsYXNzLiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyB0aGUKKyAgICAgKiB7QGNvZGUgY3JlYXRlLWNsYXNzfSBtZXRob2QgZm9sbG93ZWQgYnkgdGhlIHtAY29kZSBpbmplY3QtY2xhc3N9IG1ldGhvZCBmb2xsb3dlZCBieSB0aGUge0Bjb2RlIHBvc3QtY29uc3RydWN0fSBtZXRob2QuCisgICAgICogPHA+CisgICAgICogVGhlIG9iamVjdCBjcmVhdGVkIGlzIG5vdCBtYW5hZ2VkIGJ5IHRoZSBpbmplY3Rpb24gbWFuYWdlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjcmVhdGVNZSBUaGUgbm9uLW51bGwgY2xhc3MgdG8gY3JlYXRlIHRoaXMgb2JqZWN0IGZyb207CisgICAgICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiB0aGUgb2JqZWN0IHRoYXQgaGFzIGJlZW4gY3JlYXRlZCwgaW5qZWN0ZWQgYW5kIHBvc3QgY29uc3RydWN0ZWQuCisgICAgICovCisgICAgPFQ+IFQgY3JlYXRlQW5kSW5pdGlhbGl6ZShDbGFzczxUPiBjcmVhdGVNZSk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGFsbCBzZXJ2aWNlcyBmcm9tIHRoaXMgaW5qZWN0aW9uIG1hbmFnZXIgdGhhdCBpbXBsZW1lbnRzIHRoaXMgY29udHJhY3Qgb3IgaGFzIHRoaXMgaW1wbGVtZW50YXRpb24gYWxvbmcgd2l0aAorICAgICAqIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZXJ2aWNlIHdoaWNoIGNhbiBiZSBrZXB0IGJ5IHtAbGluayBTZXJ2aWNlSG9sZGVyfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250cmFjdE9ySW1wbCBNYXkgbm90IGJlIG51bGwsIGFuZCBpcyB0aGUgY29udHJhY3Qgb3IgY29uY3JldGUgaW1wbGVtZW50YXRpb24gdG8gZ2V0IHRoZSBiZXN0IGluc3RhbmNlIG9mLgorICAgICAqIEBwYXJhbSBxdWFsaWZpZXJzICAgICBUaGUgc2V0IG9mIHF1YWxpZmllcnMgdGhhdCBtdXN0IG1hdGNoIHRoaXMgc2VydmljZSBkZWZpbml0aW9uLgorICAgICAqIEBwYXJhbSA8VD4gICAgICAgICAgICBJbnN0YW5jZSB0eXBlLgorICAgICAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgdGhlIGNvbnRyYWN0IG9yIGltcGwgYWxvbmcgd2l0aCBvdGhlciBpbmZvcm1hdGlvbi4gTWF5IHJldHVybiAgbnVsbCBpZiB0aGVyZSBpcyBubyBwcm92aWRlciB0aGF0CisgICAgICogcHJvdmlkZXMgdGhlIGdpdmVuIGltcGxlbWVudGF0aW9uIG9yIGNvbnRyYWN0LgorICAgICAqLworICAgIDxUPiBMaXN0PFNlcnZpY2VIb2xkZXI8VD4+IGdldEFsbFNlcnZpY2VIb2xkZXJzKENsYXNzPFQ+IGNvbnRyYWN0T3JJbXBsLCBBbm5vdGF0aW9uLi4uIHF1YWxpZmllcnMpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgYmVzdCBzZXJ2aWNlIGZyb20gdGhpcyBpbmplY3Rpb24gbWFuYWdlciB0aGF0IGltcGxlbWVudHMgdGhpcyBjb250cmFjdCBvciBoYXMgdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiA8cD4KKyAgICAgKiBVc2UgdGhpcyBtZXRob2Qgb25seSBpZiBvdGhlciBpbmZvcm1hdGlvbiBpcyBub3QgbmVlZGVkIG90aGVyd2lzZSB1c2UsIG90aGVyd2lzZSB1c2UKKyAgICAgKiB7QGxpbmsgSW5qZWN0aW9uTWFuYWdlciNnZXRBbGxTZXJ2aWNlSG9sZGVycyhDbGFzcywgQW5ub3RhdGlvbi4uLil9LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRyYWN0T3JJbXBsIE1heSBub3QgYmUgbnVsbCwgYW5kIGlzIHRoZSBjb250cmFjdCBvciBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiB0byBnZXQgdGhlIGJlc3QgaW5zdGFuY2Ugb2YuCisgICAgICogQHBhcmFtIHF1YWxpZmllcnMgICAgIFRoZSBzZXQgb2YgcXVhbGlmaWVycyB0aGF0IG11c3QgbWF0Y2ggdGhpcyBzZXJ2aWNlIGRlZmluaXRpb24uCisgICAgICogQHBhcmFtIDxUPiAgICAgICAgICAgIEluc3RhbmNlIHR5cGUuCisgICAgICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiB0aGUgY29udHJhY3Qgb3IgaW1wbC4gIE1heSByZXR1cm4gIG51bGwgaWYgdGhlcmUgaXMgbm8gcHJvdmlkZXIgdGhhdCBwcm92aWRlcyB0aGUgZ2l2ZW4KKyAgICAgKiBpbXBsZW1lbnRhdGlvbiBvciBjb250cmFjdC4KKyAgICAgKi8KKyAgICA8VD4gVCBnZXRJbnN0YW5jZShDbGFzczxUPiBjb250cmFjdE9ySW1wbCwgQW5ub3RhdGlvbi4uLiBxdWFsaWZpZXJzKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGJlc3Qgc2VydmljZSBmcm9tIHRoaXMgaW5qZWN0aW9uIG1hbmFnZXIgdGhhdCBpbXBsZW1lbnRzIHRoaXMgY29udHJhY3Qgb3IgaGFzIHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICogPHA+CisgICAgICogVXNlIHRoaXMgbWV0aG9kIG9ubHkgaWYgb3RoZXIgaW5mb3JtYXRpb24gaXMgbm90IG5lZWRlZCBvdGhlcndpc2UgdXNlLCBvdGhlcndpc2UgdXNlCisgICAgICoge0BsaW5rIEluamVjdGlvbk1hbmFnZXIjZ2V0QWxsU2VydmljZUhvbGRlcnMoQ2xhc3MsIEFubm90YXRpb24uLi4pfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250cmFjdE9ySW1wbCBNYXkgbm90IGJlIG51bGwsIGFuZCBpcyB0aGUgY29udHJhY3Qgb3IgY29uY3JldGUgaW1wbGVtZW50YXRpb24gdG8gZ2V0IHRoZSBiZXN0IGluc3RhbmNlIG9mLgorICAgICAqIEBwYXJhbSBjbGFzc0FuYWx5emVyICAtLS0tLS0tCisgICAgICogQHBhcmFtIDxUPiAgICAgICAgICAgIEluc3RhbmNlIHR5cGUuCisgICAgICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiB0aGUgY29udHJhY3Qgb3IgaW1wbC4gIE1heSByZXR1cm4gIG51bGwgaWYgdGhlcmUgaXMgbm8gcHJvdmlkZXIgdGhhdCBwcm92aWRlcyB0aGUgZ2l2ZW4KKyAgICAgKiBpbXBsZW1lbnRhdGlvbiBvciBjb250cmFjdC4KKyAgICAgKi8KKyAgICAvLyBUT0RPOiBSZW1vdmUgQ0xBU1MgQU5BTFlaRVIgLSBORUVERUQgT05MWSBJTiBDZGlDb21wb25lbnRQcm92aWRlcgorICAgIDxUPiBUIGdldEluc3RhbmNlKENsYXNzPFQ+IGNvbnRyYWN0T3JJbXBsLCBTdHJpbmcgY2xhc3NBbmFseXplcik7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBiZXN0IHNlcnZpY2UgZnJvbSB0aGlzIGluamVjdGlvbiBtYW5hZ2VyIHRoYXQgaW1wbGVtZW50cyB0aGlzIGNvbnRyYWN0IG9yIGhhcyB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqIDxwPgorICAgICAqIFVzZSB0aGlzIG1ldGhvZCBvbmx5IGlmIG90aGVyIGluZm9ybWF0aW9uIGlzIG5vdCBuZWVkZWQgb3RoZXJ3aXNlIHVzZSwgb3RoZXJ3aXNlIHVzZQorICAgICAqIHtAbGluayBJbmplY3Rpb25NYW5hZ2VyI2dldEFsbFNlcnZpY2VIb2xkZXJzKENsYXNzLCBBbm5vdGF0aW9uLi4uKX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udHJhY3RPckltcGwgTWF5IG5vdCBiZSBudWxsLCBhbmQgaXMgdGhlIGNvbnRyYWN0IG9yIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIHRvIGdldCB0aGUgYmVzdCBpbnN0YW5jZSBvZi4KKyAgICAgKiBAcGFyYW0gPFQ+ICAgICAgICAgICAgSW5zdGFuY2UgdHlwZS4KKyAgICAgKiBAcmV0dXJuIEFuIGluc3RhbmNlIG9mIHRoZSBjb250cmFjdCBvciBpbXBsLiAgTWF5IHJldHVybiAgbnVsbCBpZiB0aGVyZSBpcyBubyBwcm92aWRlciB0aGF0IHByb3ZpZGVzIHRoZSBnaXZlbgorICAgICAqIGltcGxlbWVudGF0aW9uIG9yIGNvbnRyYWN0LgorICAgICAqLworICAgIDxUPiBUIGdldEluc3RhbmNlKENsYXNzPFQ+IGNvbnRyYWN0T3JJbXBsKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGJlc3Qgc2VydmljZSBmcm9tIHRoaXMgaW5qZWN0aW9uIG1hbmFnZXIgdGhhdCBpbXBsZW1lbnRzIHRoaXMgY29udHJhY3Qgb3IgaGFzIHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICogPHA+CisgICAgICogVXNlIHRoaXMgbWV0aG9kIG9ubHkgaWYgb3RoZXIgaW5mb3JtYXRpb24gaXMgbm90IG5lZWRlZCBvdGhlcndpc2UgdXNlLCBvdGhlcndpc2UgdXNlCisgICAgICoge0BsaW5rIEluamVjdGlvbk1hbmFnZXIjZ2V0QWxsU2VydmljZUhvbGRlcnMoQ2xhc3MsIEFubm90YXRpb24uLi4pfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250cmFjdE9ySW1wbCBNYXkgbm90IGJlIG51bGwsIGFuZCBpcyB0aGUgY29udHJhY3Qgb3IgY29uY3JldGUgaW1wbGVtZW50YXRpb24gdG8gZ2V0IHRoZSBiZXN0IGluc3RhbmNlIG9mLgorICAgICAqIEBwYXJhbSA8VD4gICAgICAgICAgICBJbnN0YW5jZSB0eXBlLgorICAgICAqIEByZXR1cm4gQW4gaW5zdGFuY2Ugb2YgdGhlIGNvbnRyYWN0IG9yIGltcGwuICBNYXkgcmV0dXJuICBudWxsIGlmIHRoZXJlIGlzIG5vIHByb3ZpZGVyIHRoYXQgcHJvdmlkZXMgdGhlIGdpdmVuCisgICAgICogaW1wbGVtZW50YXRpb24gb3IgY29udHJhY3QuCisgICAgICovCisgICAgPFQ+IFQgZ2V0SW5zdGFuY2UoVHlwZSBjb250cmFjdE9ySW1wbCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBzZXJ2aWNlIGluc3RhbmNlIGFjY29yZGluZyB0byB7QGxpbmsgRm9yZWlnbkRlc2NyaXB0b3J9IHdoaWNoIGlzIHNwZWNpZmljIHRvIHRoZSB1bmRlcmx5aW5nIERJIHByb3ZpZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGZvcmVpZ25EZXNjcmlwdG9yIERJIHNwZWNpZmljIGRlc2NyaXB0b3IuCisgICAgICogQHJldHVybiBzZXJ2aWNlIGluc3RhbmNlIGFjY29yZGluZyB0byBmb3JlaWduIGRlc2NyaXB0b3IuCisgICAgICovCisgICAgT2JqZWN0IGdldEluc3RhbmNlKEZvcmVpZ25EZXNjcmlwdG9yIGZvcmVpZ25EZXNjcmlwdG9yKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW5kIHJlZ2lzdGVycyB0aGUgZGVzY3JpcHRvciBpbiB0aGUgdW5kZXJseWluZyBESSBwcm92aWRlciBhbmQgcmV0dXJucyB7QGxpbmsgRm9yZWlnbkRlc2NyaXB0b3J9IHRoYXQgaXMgc3BlY2lmaWMKKyAgICAgKiBkZXNjcmlwdG9yIGZvciB0aGUgdW5kZXJseWluZyBESSBwcm92aWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiaW5kaW5nIGplcnNleSBkZXNjcmlwdG9yLgorICAgICAqIEByZXR1cm4gc3BlY2lmaWMgZm9yZWlnbiBkZXNjcmlwdG9yIG9mIHRoZSB1bmRlcmx5aW5nIERJIHByb3ZpZGVyLgorICAgICAqLworICAgIEZvcmVpZ25EZXNjcmlwdG9yIGNyZWF0ZUZvcmVpZ25EZXNjcmlwdG9yKEJpbmRpbmcgYmluZGluZyk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGFsbCBzZXJ2aWNlcyBmcm9tIHRoaXMgaW5qZWN0aW9uIG1hbmFnZXIgdGhhdCBpbXBsZW1lbnQgdGhpcyBjb250cmFjdCBvciBoYXZlIHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICogPHA+CisgICAgICogVXNlIHRoaXMgbWV0aG9kIG9ubHkgaWYgb3RoZXIgaW5mb3JtYXRpb24gaXMgbm90IG5lZWRlZCBvdGhlcndpc2UgdXNlLCBvdGhlcndpc2UgdXNlCisgICAgICoge0BsaW5rIEluamVjdGlvbk1hbmFnZXIjZ2V0QWxsU2VydmljZUhvbGRlcnMoQ2xhc3MsIEFubm90YXRpb24uLi4pfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250cmFjdE9ySW1wbCBNYXkgbm90IGJlIG51bGwsIGFuZCBpcyB0aGUgY29udHJhY3Qgb3IgY29uY3JldGUgaW1wbGVtZW50YXRpb24gdG8gZ2V0IHRoZSBiZXN0IGluc3RhbmNlIG9mLgorICAgICAqIEBwYXJhbSA8VD4gICAgICAgICAgICBJbnN0YW5jZSB0eXBlLgorICAgICAqIEByZXR1cm4gQSBsaXN0IG9mIHNlcnZpY2VzIGltcGxlbWVudGluZyB0aGlzIGNvbnRyYWN0IG9yIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uLiAgTWF5IG5vdCByZXR1cm4gbnVsbCwgYnV0ICBtYXkgcmV0dXJuCisgICAgICogYW4gZW1wdHkgbGlzdAorICAgICAqLworICAgIDxUPiBMaXN0PFQ+IGdldEFsbEluc3RhbmNlcyhUeXBlIGNvbnRyYWN0T3JJbXBsKTsKKworICAgIC8qKgorICAgICAqIEFuYWx5emVzIHRoZSBnaXZlbiBvYmplY3QgYW5kIGluamVjdCBpbnRvIGl0cyBmaWVsZHMgYW5kIG1ldGhvZHMuCisgICAgICogVGhlIG9iamVjdCBpbmplY3RlZCBpbiB0aGlzIHdheSB3aWxsIG5vdCBiZSBtYW5hZ2VkIGJ5IEhLMgorICAgICAqCisgICAgICogQHBhcmFtIGluamVjdE1lIFRoZSBvYmplY3QgdG8gYmUgYW5hbHl6ZWQgYW5kIGluamVjdGVkIGludG8KKyAgICAgKi8KKyAgICB2b2lkIGluamVjdChPYmplY3QgaW5qZWN0TWUpOworCisgICAgLyoqCisgICAgICogVGhpcyB3aWxsIGFuYWx5emUgdGhlIGdpdmVuIG9iamVjdCBhbmQgaW5qZWN0IGludG8gaXRzIGZpZWxkcyBhbmQgbWV0aG9kcy4gVGhlIG9iamVjdCBpbmplY3RlZCBpbiB0aGlzIHdheSB3aWxsIG5vdCBiZQorICAgICAqIG1hbmFnZWQgYnkgSEsyCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5qZWN0TWUgVGhlIG9iamVjdCB0byBiZSBhbmFseXplZCBhbmQgaW5qZWN0ZWQgaW50bworICAgICAqLworICAgIC8vIFRPRE86IFJlbW92ZSBDTEFTUyBBTkFMWVpFUiAtIG9ubHkgaW4gbGVnYWN5IENESSBpbnRlZ3JhdGlvbi4KKyAgICB2b2lkIGluamVjdChPYmplY3QgaW5qZWN0TWUsIFN0cmluZyBjbGFzc0FuYWx5emVyKTsKKworICAgIC8qKgorICAgICAqIEFuYWx5emVzIHRoZSBnaXZlbiBvYmplY3QgYW5kIGNhbGwgdGhlIHByZURlc3Ryb3kgbWV0aG9kLiBUaGUgb2JqZWN0IGdpdmVuIHdpbGwgbm90IGJlIG1hbmFnZWQgYnkgYmVhbiBtYW5hZ2VyLgorICAgICAqCisgICAgICogQHBhcmFtIHByZURlc3Ryb3lNZSBUaGUgb2JqZWN0IHRvIHByZURlc3Ryb3kKKyAgICAgKi8KKyAgICB2b2lkIHByZURlc3Ryb3koT2JqZWN0IHByZURlc3Ryb3lNZSk7Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2luamVjdC9JbmplY3Rpb25NYW5hZ2VyRmFjdG9yeS5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9pbmplY3QvSW5qZWN0aW9uTWFuYWdlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTc0YjM3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9pbmplY3QvSW5qZWN0aW9uTWFuYWdlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdDsKKworLyoqCisgKiBGYWN0b3J5IHdoaWNoIGlzIGFibGUgdG8gY3JlYXRlIHtAbGluayBJbmplY3Rpb25NYW5hZ2VyfS4gRXZlcnkgREkgcHJvdmlkZXIgbXVzdCBjcmVhdGUgaXRzIG93biB7QGxpbmsgSW5qZWN0aW9uTWFuYWdlckZhY3Rvcnl9CisgKiBhbmQgcmVnaXN0ZXIgaXQgaW4gTUVUQS1JTkYuc2VydmljZXMuIFRoZW4gdGhlIHtAY29kZSBJbmplY3Rpb25NYW5hZ2VyRmFjdG9yeX0gY2FuIGJlIGxvb2tlZCB1cCBhbmQge0Bjb2RlIEluamVjdGlvbk1hbmFnZXJ9CisgKiBjYW4gYmUgY3JlYXRlZC4KKyAqLworcHVibGljIGludGVyZmFjZSBJbmplY3Rpb25NYW5hZ2VyRmFjdG9yeSB7CisKKyAgICAvKioKKyAgICAgKiBMb2FkIGEgbmV3IGluamVjdGlvbiBtYW5hZ2VyIHdpdGhvdXQgcGFyZW50IGFuZCBpbml0aWFsIGJpbmRlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gaW5pdGlhbGl6ZWQgaW5qZWN0aW9uIG1hbmFnZXIuCisgICAgICovCisgICAgZGVmYXVsdCBJbmplY3Rpb25NYW5hZ2VyIGNyZWF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZShudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2FkIGEgbmV3IGluamVjdGlvbiBtYW5hZ2VyIHdpdGggcGFyZW50IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgaW5qZWN0aW9uIG1hbmFnZXIgcGFyZW50IG9yIGNvbmNyZXRlIERJIHNwZWNpZmljIG9iamVjdCB3aGljaCBpcyBjb21wYXRpYmxlIHdpdGggREkgcHJvdmlkZXIuCisgICAgICogQHJldHVybiBpbml0aWFsaXplZCBpbmplY3Rpb24gbWFuYWdlci4KKyAgICAgKi8KKyAgICBJbmplY3Rpb25NYW5hZ2VyIGNyZWF0ZShPYmplY3QgcGFyZW50KTsKK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvaW5qZWN0L0luamVjdGlvbk1hbmFnZXJTdXBwbGllci5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9pbmplY3QvSW5qZWN0aW9uTWFuYWdlclN1cHBsaWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JlZWE0NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvaW5qZWN0L0luamVjdGlvbk1hbmFnZXJTdXBwbGllci5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0OworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoaXMgaW50ZXJmYWNlIGlzIGNhcGFibGUgb2YgcmV0dXJuaW5nIHtAbGluayBJbmplY3Rpb25NYW5hZ2VyfS4KKyAqLworcHVibGljIGludGVyZmFjZSBJbmplY3Rpb25NYW5hZ2VyU3VwcGxpZXIgeworCisgICAgLyoqCisgICAgICogR2V0IGluamVjdGlvbiBtYW5hZ2VyLgorICAgICAqCisgICAgICogQHJldHVybiBpbmplY3Rpb24gbWFuYWdlci4KKyAgICAgKi8KKyAgICBJbmplY3Rpb25NYW5hZ2VyIGdldEluamVjdGlvbk1hbmFnZXIoKTsKKworfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9pbmplY3QvSW5qZWN0aW9uUmVzb2x2ZXIuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvaW5qZWN0L0luamVjdGlvblJlc29sdmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg5Y2IwMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvaW5qZWN0L0luamVjdGlvblJlc29sdmVyLmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3Q7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworCisvKioKKyAqIFRoaXMgY2xhc3MgYWxsb3dzIHVzZXJzIHRvIHByb3ZpZGUgYSBjdXN0b20gaW5qZWN0aW9uIHRhcmdldCBmb3IgYW55IGFubm90YXRpb24gKGluY2x1ZGluZyB7QGNvZGUgJiM2NDtJbmplY3R9KS4gVGhlIHVzZXIgd291bGQKKyAqIHVzdWFsbHkgb25seSBwcm92aWRlIGEgcmVzb2x2ZXIgZm9yIHtAY29kZSAmIzY0O0luamVjdH0gaWYgaXQgd2VyZSBzcGVjaWFsaXppbmcgdGhlIHN5c3RlbSBwcm92aWRlZCByZXNvbHZlciBmb3IKKyAqIHtAY29kZSAmIzY0O0luamVjdH0uIE90aGVyd2lzZSwgdGhpcyByZXNvbHZlciBjYW4gYmUgdXNlZCB0byBwcm92aWRlIGluamVjdGlvbiBwb2ludHMgZm9yIGFueSBhbm5vdGF0aW9uLgorICogPHA+CisgKiBKZXJzZXkgcHJvdmlkZXMgYWxsIHtAY29kZSBJbmplY3Rpb25SZXNvbHZlcnN9IGZvciBKQVgtUlMgYW5ub3RhdGlvbiBhbmQge0Bjb2RlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Vcml9IGFwYXJ0IGZyb20KKyAqIHtAbGluayBqYXZheC53cy5ycy5jb3JlLkNvbnRleHR9IHdoaWNoIG11c3QgYmUgaW1wbGVtZW50ZWQgYW5kIHJlZ2lzdGVyZWQgZGlyZWN0bHkgYXMgYSBwYXJ0IG9mIERJIGludGVncmF0aW9uIGJlY2F1c2Ugb2YKKyAqIG1hbnkgb3B0aW1pemF0aW9uIHdoaWNoIGNhbm5vdCBiZSBpbXBsZW1lbnRlZCBvbiBKZXJzZXkgc2lkZS4KKyAqIDxwPgorICogVGhlIHtAY29kZSBJbmplY3Rpb25SZXNvbHZlcnN9IGFyZSBkZWxpdmVyZWQgdG8gREkgaW50ZWdyYXRpb24gdXNpbmcge0BsaW5rIEluamVjdGlvbk1hbmFnZXIjcmVnaXN0ZXIoQmluZGVyKX0gYW5kIERJIHByb3ZpZGVyCisgKiBqdXN0IGZpbHRlciB7QGxpbmsgSW5qZWN0aW9uUmVzb2x2ZXJCaW5kaW5nfSBhbmQgaW50ZXJuYWxseSByZWdpc3RlciB0aGUgYW5ub3RhdGlvbiBoYW5kbGluZyB1c2luZyBpdHMgb3duIG1lY2hhbmlzbS4KKyAqCisgKiBAcGFyYW0gPFQ+IFRoaXMgbXVzdCBiZSB0aGUgYW5ub3RhdGlvbiBjbGFzcyBvZiB0aGUgaW5qZWN0aW9uIGFubm90YXRpb24gdGhhdCB0aGlzIHJlc29sdmVyIHdpbGwgaGFuZGxlLgorICovCitwdWJsaWMgaW50ZXJmYWNlIEluamVjdGlvblJlc29sdmVyPFQgZXh0ZW5kcyBBbm5vdGF0aW9uPiB7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgb2JqZWN0IHRoYXQgc2hvdWxkIGJlIGluamVjdGVkIGludG8gdGhlIGdpdmVuIGluamVjdGlvbiBwb2ludC4gIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUKKyAgICAgKiBpbXBsZW1lbnRhdGlvbiB0byBlbnN1cmUgdGhhdCB0aGUgb2JqZWN0IHJldHVybmVkIGNhbiBiZSBzYWZlbHkgaW5qZWN0ZWQgaW50byB0aGUgaW5qZWN0aW9uIHBvaW50LgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIHNob3VsZCBub3QgZG8gdGhlIGluamVjdGlvbiB0aGVtc2VsdmVzLgorICAgICAqCisgICAgICogQHBhcmFtIGluamVjdGVlIFRoZSBpbmplY3Rpb24gcG9pbnQgdGhpcyB2YWx1ZSBpcyBiZWluZyBpbmplY3RlZCBpbnRvCisgICAgICogQHJldHVybiBBIHBvc3NpYmx5IG51bGwgdmFsdWUgdG8gYmUgaW5qZWN0ZWQgaW50byB0aGUgZ2l2ZW4gaW5qZWN0aW9uIHBvaW50CisgICAgICovCisgICAgT2JqZWN0IHJlc29sdmUoSW5qZWN0ZWUgaW5qZWN0ZWUpOworCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiB0cnVlIGlmIHRoZSBhbm5vdGF0aW9uIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhpcyBpcyBhbiBpbmplY3Rpb24gcG9pbnQgY2FuIGFwcGVhciBpbiB0aGUgcGFyYW1ldGVyCisgICAgICogbGlzdCBvZiBhIGNvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBpbmplY3Rpb24gYW5ub3RhdGlvbiBjYW4gYXBwZWFyIGluIHRoZSBwYXJhbWV0ZXIgbGlzdCBvZiBhIGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIGJvb2xlYW4gaXNDb25zdHJ1Y3RvclBhcmFtZXRlckluZGljYXRvcigpOworCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiB0cnVlIGlmIHRoZSBhbm5vdGF0aW9uIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhpcyBpcyBhbiBpbmplY3Rpb24gcG9pbnQgY2FuIGFwcGVhciBpbiB0aGUgcGFyYW1ldGVyCisgICAgICogbGlzdCBvZiBhIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgaW5qZWN0aW9uIGFubm90YXRpb24gY2FuIGFwcGVhciBpbiB0aGUgcGFyYW1ldGVyIGxpc3Qgb2YgYSBtZXRob2QuCisgICAgICovCisgICAgYm9vbGVhbiBpc01ldGhvZFBhcmFtZXRlckluZGljYXRvcigpOworCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgYW5ub3RhdGlvbiBmb3Igd2hhdCB0aGUgaW5qZWN0aW9uIHJlc29sdmVyIGlzIGltcGxlbWVudGVkLgorICAgICAqCisgICAgICogQHJldHVybiBoYW5kbGVkIGFubm90YXRpb24gYnkgaW5qZWN0aW9uIHJlc29sdmVyLgorICAgICAqLworICAgIENsYXNzPFQ+IGdldEFubm90YXRpb24oKTsKKworfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9pbmplY3QvSW5qZWN0aW9uUmVzb2x2ZXJCaW5kaW5nLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2luamVjdC9JbmplY3Rpb25SZXNvbHZlckJpbmRpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGY4ZGVlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9pbmplY3QvSW5qZWN0aW9uUmVzb2x2ZXJCaW5kaW5nLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3Q7CisKKy8qKgorICogQ2xhc3Mgd2hpY2ggaGFzIHRoZSBmaWVsZHMgY29udGFpbmluZyB0aGUgaW5zdGFuY2Ugb2Yge0BsaW5rIEluamVjdGlvblJlc29sdmVyfSBhbmQgaXRzIGEgY29uY3JldGUgdHlwZS4KKyAqCisgKiBAcGFyYW0gPFQ+IHR5cGUgb2YgdGhlIGFubm90YXRpb24gd2hpY2ggaXMgc2VydmVkIHVzaW5nIHRoIGdpdmVuIGluamVjdGlvbiByZXNvbHZlci4KKyAqLworcHVibGljIGNsYXNzIEluamVjdGlvblJlc29sdmVyQmluZGluZzxUIGV4dGVuZHMgSW5qZWN0aW9uUmVzb2x2ZXI+IGV4dGVuZHMgQmluZGluZzxULCBJbmplY3Rpb25SZXNvbHZlckJpbmRpbmc8VD4+IHsKKworICAgIHByaXZhdGUgZmluYWwgVCByZXNvbHZlcjsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gaW5qZWN0aW9uIHJlc29sdmVyIGFzIGFuIGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc29sdmVyIGluamVjdGlvbiByZXNvbHZlciBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBJbmplY3Rpb25SZXNvbHZlckJpbmRpbmcoVCByZXNvbHZlcikgeworICAgICAgICB0aGlzLnJlc29sdmVyID0gcmVzb2x2ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgaW5qZWN0aW9uIHJlc29sdmVyIGhhbmRsZWQgYnkgdGhpcyBkZXNjcmlwdG9yLgorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgSW5qZWN0aW9uUmVzb2x2ZXJ9IGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBUIGdldFJlc29sdmVyKCkgeworICAgICAgICByZXR1cm4gcmVzb2x2ZXI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9pbmplY3QvSW5qZWN0aW9ucy5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9pbmplY3QvSW5qZWN0aW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYjJmMWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2luamVjdC9JbmplY3Rpb25zLmphdmEKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0OworCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9wdGlvbmFsOworCitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5TZXJ2aWNlRmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1vZGVsLmludGVybmFsLlJhbmtlZENvbXBhcmF0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW9kZWwuaW50ZXJuYWwuUmFua2VkUHJvdmlkZXI7CisKKy8qKgorICogSW5qZWN0aW9uIGJpbmRpbmcgdXRpbGl0eSBtZXRob2RzLgorICoKKyAqIEBhdXRob3IgVG9tIEJlZXJib3dlcgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEluamVjdGlvbnMgeworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHtAbGluayBJbmplY3Rpb25NYW5hZ2VyfSB3aXRob3V0IHBhcmVudCBhbmQgaW5pdGlhbCBiaW5kZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgaW5qZWN0aW9uIG1hbmFnZXIgd2l0aCBhbGwgdGhlIGJpbmRpbmdzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgSW5qZWN0aW9uTWFuYWdlciBjcmVhdGVJbmplY3Rpb25NYW5hZ2VyKCkgeworICAgICAgICByZXR1cm4gbG9va3VwSW5qZWN0aW9uTWFuYWdlckZhY3RvcnkoKS5jcmVhdGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEge0BsaW5rIEluamVjdGlvbk1hbmFnZXJ9IHdpdGggaW5pdGlhbCBiaW5kZXIgdGhhdCBpcyBpbW1lZGlhdGVseSByZWdpc3RlcmVkLgorICAgICAqCisgICAgICogQHBhcmFtIGJpbmRlciBjdXN0b20gdGhlIHtAbGluayBCaW5kZXIgYmluZGVyfS4KKyAgICAgKiBAcmV0dXJuIGEgaW5qZWN0aW9uIG1hbmFnZXIgd2l0aCBhbGwgdGhlIGJpbmRpbmdzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgSW5qZWN0aW9uTWFuYWdlciBjcmVhdGVJbmplY3Rpb25NYW5hZ2VyKEJpbmRlciBiaW5kZXIpIHsKKyAgICAgICAgSW5qZWN0aW9uTWFuYWdlckZhY3RvcnkgaW5qZWN0aW9uTWFuYWdlckZhY3RvcnkgPSBsb29rdXBJbmplY3Rpb25NYW5hZ2VyRmFjdG9yeSgpOworICAgICAgICBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIgPSBpbmplY3Rpb25NYW5hZ2VyRmFjdG9yeS5jcmVhdGUoKTsKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5yZWdpc3RlcihiaW5kZXIpOworICAgICAgICByZXR1cm4gaW5qZWN0aW9uTWFuYWdlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIHVubmFtZWQsIHBhcmVudGVkIHtAbGluayBJbmplY3Rpb25NYW5hZ2VyfS4gSW4gY2FzZSB0aGUge0Bjb2RlIHBhcmVudH0gaW5qZWN0aW9uIG1hbmFnZXIgaXMgbm90IHNwZWNpZmllZCwgdGhlCisgICAgICogbG9jYXRvciB3aWxsIG5vdCBiZSBwYXJlbnRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgVGhlIHBhcmVudCBvZiB0aGlzIGluamVjdGlvbiBtYW5hZ2VyLiBTZXJ2aWNlcyBjYW4gYmUgZm91bmQgaW4gdGhlIHBhcmVudCAoYW5kIGFsbCBncmFuZC1wYXJlbnRzKS4gTWF5IGJlCisgICAgICogICAgICAgICAgICAgICB7QGNvZGUgbnVsbH0uIEFuIHVuZGVybHlpbmcgREkgcHJvdmlkZXIgY2hlY2tzIHdoZXRoZXIgdGhlIHBhcmVudCBpcyBpbiBhIHByb3BlciB0eXBlLgorICAgICAqIEByZXR1cm4gYW4gaW5qZWN0aW9uIG1hbmFnZXIgd2l0aCBhbGwgdGhlIGJpbmRpbmdzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgSW5qZWN0aW9uTWFuYWdlciBjcmVhdGVJbmplY3Rpb25NYW5hZ2VyKE9iamVjdCBwYXJlbnQpIHsKKyAgICAgICAgcmV0dXJuIGxvb2t1cEluamVjdGlvbk1hbmFnZXJGYWN0b3J5KCkuY3JlYXRlKHBhcmVudCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgSW5qZWN0aW9uTWFuYWdlckZhY3RvcnkgbG9va3VwSW5qZWN0aW9uTWFuYWdlckZhY3RvcnkoKSB7CisgICAgICAgIHJldHVybiBsb29rdXBTZXJ2aWNlKEluamVjdGlvbk1hbmFnZXJGYWN0b3J5LmNsYXNzKQorICAgICAgICAgICAgICAgIC5vckVsc2VUaHJvdygoKSAtPiBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLklOSkVDVElPTl9NQU5BR0VSX0ZBQ1RPUllfTk9UX0ZPVU5EKCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb29rIGZvciBhIHNlcnZpY2Ugb2YgZ2l2ZW4gdHlwZS4gSWYgbW9yZSB0aGVuIG9uZSBzZXJ2aWNlIGlzIGZvdW5kIHRoZSBtZXRob2Qgc29ydHMgdGhlbSBhcmUgcmV0dXJucyB0aGUgb25lIHdpdGggaGlnaGVzdAorICAgICAqIHByaW9yaXR5LgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXp6IHR5cGUgb2Ygc2VydmljZSB0byBsb29rIGZvci4KKyAgICAgKiBAcGFyYW0gPFQ+ICAgdHlwZSBvZiBzZXJ2aWNlIHRvIGxvb2sgZm9yLgorICAgICAqIEByZXR1cm4gaW5zdGFuY2Ugb2Ygc2VydmljZSB3aXRoIGhpZ2hlc3QgcHJpb3JpdHkgb3Ige0Bjb2RlIG51bGx9IGlmIHNlcnZpY2Ugb2YgZ2l2ZW4gdHlwZSBjYW5ub3QgYmUgZm91bmQuCisgICAgICogQHNlZSBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgPFQ+IE9wdGlvbmFsPFQ+IGxvb2t1cFNlcnZpY2UoZmluYWwgQ2xhc3M8VD4gY2xhenopIHsKKyAgICAgICAgTGlzdDxSYW5rZWRQcm92aWRlcjxUPj4gcHJvdmlkZXJzID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgICAgICBmb3IgKFQgcHJvdmlkZXIgOiBTZXJ2aWNlRmluZGVyLmZpbmQoY2xhenopKSB7CisgICAgICAgICAgICBwcm92aWRlcnMuYWRkKG5ldyBSYW5rZWRQcm92aWRlcjw+KHByb3ZpZGVyKSk7CisgICAgICAgIH0KKyAgICAgICAgcHJvdmlkZXJzLnNvcnQobmV3IFJhbmtlZENvbXBhcmF0b3I8PihSYW5rZWRDb21wYXJhdG9yLk9yZGVyLkRFU0NFTkRJTkcpKTsKKyAgICAgICAgcmV0dXJuIHByb3ZpZGVycy5pc0VtcHR5KCkgPyBPcHRpb25hbC5lbXB0eSgpIDogT3B0aW9uYWwub2ZOdWxsYWJsZShwcm92aWRlcnMuZ2V0KDApLmdldFByb3ZpZGVyKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY2xhc3MgYnkgY29udHJhY3Qgb3IgY3JlYXRlIGFuZCBpbmplY3QgYSBuZXcgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gPFQ+ICAgICAgICAgICAgICBpbnN0YW5jZSB0eXBlLgorICAgICAqIEBwYXJhbSBpbmplY3Rpb25NYW5hZ2VyIERJIGluamVjdGlvbiBtYW5hZ2VyLgorICAgICAqIEBwYXJhbSBjbGF6eiAgICAgICAgICAgIGNsYXNzIG9mIHRoZSBpbnN0YW5jZSB0byBiZSBwcm92aWRlci4KKyAgICAgKiBAcmV0dXJuIGluc3RhbmNlIG9mIHRoZSBjbGFzcyBlaXRoZXIgcHJvdmlkZWQgYXMgYSBzZXJ2aWNlIG9yIGNyZWF0ZWQgYW5kIGluamVjdGVkICBieSBISzIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8VD4gVCBnZXRPckNyZWF0ZShJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIsIGZpbmFsIENsYXNzPFQ+IGNsYXp6KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBUIGNvbXBvbmVudCA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoY2xhenopOworICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudCA9PSBudWxsID8gaW5qZWN0aW9uTWFuYWdlci5jcmVhdGVBbmRJbml0aWFsaXplKGNsYXp6KSA6IGNvbXBvbmVudDsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgUnVudGltZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBMb29rIGZvciBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiBhbmQgcmV0dXJuIGl0IGlmIGZvdW5kLiBNdWx0aUV4Y2VwdGlvbiBpcyB0aHJvd24gd2hlbiAqUGFyYW0gZmllbGQgaXMKKyAgICAgICAgICAgIC8vIGFubm90YXRlZCBhbmQgdmFsdWUgY2Fubm90IGJlIHByb3ZpZGVkIChmb3IgZXhhbXBsZSBmcm9tU3RyaW5nKFN0cmluZykgbWV0aG9kIGNhbiB0aHJvdyB1bmNoZWNrZWQKKyAgICAgICAgICAgIC8vIGV4Y2VwdGlvbi4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBzZWUgSW52YWxpZFBhcmFtVGVzdAorICAgICAgICAgICAgLy8gc2VlIEpFUlNFWS0xMTE3CisgICAgICAgICAgICBUaHJvd2FibGUgdGhyb3dhYmxlID0gZS5nZXRDYXVzZSgpOworICAgICAgICAgICAgaWYgKHRocm93YWJsZSAhPSBudWxsICYmIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odGhyb3dhYmxlLmdldENsYXNzKCkpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgKFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKSB0aHJvd2FibGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2luamVjdC9JbnN0YW5jZUJpbmRpbmcuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvaW5qZWN0L0luc3RhbmNlQmluZGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNTEwNzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2luamVjdC9JbnN0YW5jZUJpbmRpbmcuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CisKKy8qKgorICogSW5qZWN0aW9uIGJpbmRpbmcgZGVzY3JpcHRpb24gb2YgYSBiZWFuIGJvdW5kIGRpcmVjdGx5IGFzIGEgc3BlY2lmaWMgaW5zdGFuY2UuCisgKgorICogQHBhcmFtIDxUPiB0eXBlIG9mIHRoZSBiZWFuIGRlc2NyaWJlZCBieSB0aGlzIGluamVjdGlvbiBiaW5kaW5nLgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK3B1YmxpYyBjbGFzcyBJbnN0YW5jZUJpbmRpbmc8VD4gZXh0ZW5kcyBCaW5kaW5nPFQsIEluc3RhbmNlQmluZGluZzxUPj4geworCisgICAgcHJpdmF0ZSBmaW5hbCBUIHNlcnZpY2U7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgc2VydmljZSBhcyBhbiBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2aWNlIHNlcnZpY2UncyBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBJbnN0YW5jZUJpbmRpbmcoVCBzZXJ2aWNlKSB7CisgICAgICAgIHRoaXMoc2VydmljZSwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHNlcnZpY2UgYXMgYW4gaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VydmljZSAgICAgIHNlcnZpY2UncyBpbnN0YW5jZS4KKyAgICAgKiBAcGFyYW0gY29udHJhY3RUeXBlIHNlcnZpY2UncyBjb250cmFjdFR5cGUuCisgICAgICovCisgICAgSW5zdGFuY2VCaW5kaW5nKFQgc2VydmljZSwgVHlwZSBjb250cmFjdFR5cGUpIHsKKyAgICAgICAgdGhpcy5zZXJ2aWNlID0gc2VydmljZTsKKyAgICAgICAgaWYgKGNvbnRyYWN0VHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLnRvKGNvbnRyYWN0VHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgYXNUeXBlKHNlcnZpY2UuZ2V0Q2xhc3MoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBzZXJ2aWNlJyBjbGFzcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gc2VydmljZSdzIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBUIGdldFNlcnZpY2UoKSB7CisgICAgICAgIHJldHVybiBzZXJ2aWNlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvaW5qZWN0L1Blckxvb2t1cC5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9pbmplY3QvUGVyTG9va3VwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRlMmQwZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvaW5qZWN0L1Blckxvb2t1cC5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0OworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCitpbXBvcnQgamF2YXguaW5qZWN0LlNjb3BlOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7CisKKy8qKgorICogUGVyTG9va3VwIGlzIHRoZSBzY29wZSBmb3Igb2JqZWN0cyB0aGF0IGFyZSBjcmVhdGVkIGV2ZXJ5IHRpbWUgdGhleSBhcmUgbG9va2VkIHVwLiBQZXJMb29rdXAgb2JqZWN0cworICogd2lsbCBiZSBkZXN0cm95ZWQgd2hlbmV2ZXIgYSBzZXJ2aWNlIGNvbnRhaW5pbmcgdGhlbSBpcyBkZXN0cm95ZWQuCisgKgorICogQGF1dGhvciBKb2huIFdlbGxzIChqb2huLndlbGxzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BEb2N1bWVudGVkCitAUmV0ZW50aW9uKFJVTlRJTUUpCitAU2NvcGUKK0BUYXJnZXQoeyBUWVBFLCBNRVRIT0QgfSkKK3B1YmxpYyBAaW50ZXJmYWNlIFBlckxvb2t1cCB7Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2luamVjdC9QZXJUaHJlYWQuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvaW5qZWN0L1BlclRocmVhZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MTliOTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2luamVjdC9QZXJUaHJlYWQuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdDsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworaW1wb3J0IGphdmF4LmluamVjdC5TY29wZTsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOworCisvKioKKyAqIFBlclRocmVhZCBpcyBhIHNjb3BlIHRoYXQgb3BlcmF0ZXMgbGlrZSB7QGxpbmsgamF2YXguaW5qZWN0LlNpbmdsZXRvbn0gc2NvcGUsIGV4Y2VwdCBvbiBhIHBlci10aHJlYWQgYmFzaXMuIFRoZSBsaWZlY3ljbGUgb2YKKyAqIHRoZSBzZXJ2aWNlIGlzIGRldGVybWluZWQgYnkgdGhlIHRocmVhZCBpdCBpcyBvbi4gT24gYSBzaW5nbGUgdGhyZWFkIG9ubHkgb25lIG9mIHRoZSBzZXJ2aWNlIHdpbGwgYmUgY3JlYXRlZCwgYnV0IGEgbmV3CisgKiBzZXJ2aWNlIHdpbGwgYmUgY3JlYXRlZCBmb3IgZWFjaCB0aHJlYWQuCisgKgorICogQGF1dGhvciBKb2huIFdlbGxzIChqb2huLndlbGxzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BEb2N1bWVudGVkCitAUmV0ZW50aW9uKFJVTlRJTUUpCitAU2NvcGUKK0BUYXJnZXQoeyBUWVBFLCBNRVRIT0QgfSkKK3B1YmxpYyBAaW50ZXJmYWNlIFBlclRocmVhZCB7Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2luamVjdC9Qcm92aWRlckJpbmRlci5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9pbmplY3QvUHJvdmlkZXJCaW5kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDMwMmI0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9pbmplY3QvUHJvdmlkZXJCaW5kZXIuamF2YQpAQCAtMCwwICsxLDM0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3Q7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5SdW50aW1lVHlwZTsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb2RlbC5Db250cmFjdFByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1vZGVsLmludGVybmFsLkNvbXBvbmVudEJhZzsKKworLyoqCisgKiBDbGFzcyB1c2VkIGZvciByZWdpc3RyYXRpb24gb2YgdGhlIGN1c3RvbSBwcm92aWRlcnMgaW50byBpbmplY3Rpb24gbWFuYWdlci4KKyAqIDxwPgorICogQ3VzdG9tIHByb3ZpZGVycyBhcmUgY2xhc3NlcyB0aGF0IGltcGxlbWVudHMgc3BlY2lmaWMgSkFYLVJTIG9yIEplcnNleQorICogU1BJIGludGVyZmFjZXMgKGUuZy4ge0BsaW5rIGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcn0pIGFuZCBhcmUKKyAqIHN1cHBsaWVkIGJ5IHRoZSB1c2VyLiBUaGVzZSBwcm92aWRlcnMgd2lsbCBiZSBib3VuZCBpbnRvIHRoZSBpbmplY3Rpb24gbWFuYWdlcgorICogYW5ub3RhdGVkIGJ5IGEge0BsaW5rIEN1c3RvbSAmIzY0O0N1c3RvbX0gcXVhbGlmaWVyIGFubm90YXRpb24uCisgKiA8L3A+CisgKiA8cD4KKyAqIFVzZSB0aGUge0Bjb2RlICYjNjQ7Q3VzdG9tfSBxdWFsaWZpZXIgYW5ub3RhdGlvbiB0byByZXRyaWV2ZSB0aGVzZSBwcm92aWRlcnMKKyAqIGZyb20gaW5qZWN0aW9uIG1hbmFnZXIuIFlvdSBtYXkgYWxzbyB1c2UgYSBvbmUgb2YgdGhlIHByb3ZpZGVyIGFjY2Vzc29yIHV0aWxpdHkKKyAqIG1ldGhvZCBkZWZpbmVkIGluIHtAbGluayBQcm92aWRlcnN9IGNsYXNzLgorICogPC9wPgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIFByb3ZpZGVyQmluZGVyIHsKKworICAgIHByaXZhdGUgZmluYWwgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyBwcm92aWRlciBiaW5kZXIgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5qZWN0aW9uTWFuYWdlciB0aGUgYmluZGVyIHdpbGwgdXNlIHRvIGJpbmQgdGhlIHByb3ZpZGVycyBpbnRvLgorICAgICAqLworICAgIHB1YmxpYyBQcm92aWRlckJpbmRlcihmaW5hbCBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIpIHsKKyAgICAgICAgdGhpcy5pbmplY3Rpb25NYW5hZ2VyID0gaW5qZWN0aW9uTWFuYWdlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCaW5kIGNvbnRyYWN0IHByb3ZpZGVyIG1vZGVsIHRvIGEgcHJvdmlkZXIgY2xhc3MgdXNpbmcgdGhlIHN1cHBsaWVkIGluamVjdGlvbiBtYW5hZ2VyLgorICAgICAqCisgICAgICogQHBhcmFtIHByb3ZpZGVyQ2xhc3MgcHJvdmlkZXIgY2xhc3MuCisgICAgICogQHBhcmFtIG1vZGVsICAgICAgICAgY29udHJhY3QgcHJvdmlkZXIgbW9kZWwuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGJpbmRQcm92aWRlcihDbGFzczw/PiBwcm92aWRlckNsYXNzLCBDb250cmFjdFByb3ZpZGVyIG1vZGVsLCBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIpIHsKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5yZWdpc3RlcihDb21wb3NpdGVCaW5kZXIud3JhcChjcmVhdGVQcm92aWRlckJpbmRlcnMocHJvdmlkZXJDbGFzcywgbW9kZWwpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQ29sbGVjdGlvbjxCaW5kZXI+IGNyZWF0ZVByb3ZpZGVyQmluZGVycyhDbGFzczw/PiBwcm92aWRlckNsYXNzLCBDb250cmFjdFByb3ZpZGVyIG1vZGVsKSB7CisgICAgICAgIC8qIENyZWF0ZSBhIEJpbmRlciBvZiB0aGUgUHJvdmlkZXIgd2l0aCB0aGUgY29uY3JldGUgY29udHJhY3QuICovCisgICAgICAgIEZ1bmN0aW9uPENsYXNzLCBCaW5kZXI+IGJpbmRlckZ1bmN0aW9uID0gY29udHJhY3QgLT4gbmV3IEFic3RyYWN0QmluZGVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgICAgICBDbGFzc0JpbmRpbmcgYnVpbGRlciA9IGJpbmQocHJvdmlkZXJDbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5pbihtb2RlbC5nZXRTY29wZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgLnF1YWxpZmllZEJ5KEN1c3RvbUFubm90YXRpb25MaXRlcmFsLklOU1RBTkNFKQorICAgICAgICAgICAgICAgICAgICAgICAgLnRvKGNvbnRyYWN0KTsKKworICAgICAgICAgICAgICAgIGludCBwcmlvcml0eSA9IG1vZGVsLmdldFByaW9yaXR5KGNvbnRyYWN0KTsKKyAgICAgICAgICAgICAgICBpZiAocHJpb3JpdHkgPiBDb250cmFjdFByb3ZpZGVyLk5PX1BSSU9SSVRZKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIucmFua2VkKHByaW9yaXR5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgLyogQ3JlYXRlIEJpbmRlcnMgd2l0aCBhbGwgY29udHJhY3RzIGFuZCByZXR1cm4gdGhlaXIgY29sbGVjdGlvbi4gKi8KKyAgICAgICAgcmV0dXJuIG1vZGVsLmdldENvbnRyYWN0cygpLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgLm1hcChiaW5kZXJGdW5jdGlvbikKKyAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCaW5kIGNvbnRyYWN0IHByb3ZpZGVyIG1vZGVsIHRvIGEgcHJvdmlkZXIgaW5zdGFuY2UgdXNpbmcgdGhlIHN1cHBsaWVkIGluamVjdGlvbiBtYW5hZ2VyLgorICAgICAqIDxwPgorICAgICAqIFNjb3BlIHZhbHVlIHNwZWNpZmllZCBpbiB0aGUge0BsaW5rIENvbnRyYWN0UHJvdmlkZXIgY29udHJhY3QgcHJvdmlkZXIgbW9kZWx9CisgICAgICogaXMgaWdub3JlZCBhcyBpbnN0YW5jZXMgY2FuIG9ubHkgYmUgYm91bmQgYXMgInNpbmdsZXRvbnMiLgorICAgICAqCisgICAgICogQHBhcmFtIHByb3ZpZGVySW5zdGFuY2UgcHJvdmlkZXIgaW5zdGFuY2UuCisgICAgICogQHBhcmFtIG1vZGVsICAgICAgICAgICAgY29udHJhY3QgcHJvdmlkZXIgbW9kZWwuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGJpbmRQcm92aWRlcihPYmplY3QgcHJvdmlkZXJJbnN0YW5jZSwgQ29udHJhY3RQcm92aWRlciBtb2RlbCwgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyKSB7CisgICAgICAgIGluamVjdGlvbk1hbmFnZXIucmVnaXN0ZXIoQ29tcG9zaXRlQmluZGVyLndyYXAoY3JlYXRlUHJvdmlkZXJCaW5kZXJzKHByb3ZpZGVySW5zdGFuY2UsIG1vZGVsKSkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248QmluZGVyPiBjcmVhdGVQcm92aWRlckJpbmRlcnMoT2JqZWN0IHByb3ZpZGVySW5zdGFuY2UsIENvbnRyYWN0UHJvdmlkZXIgbW9kZWwpIHsKKyAgICAgICAgLyogQ3JlYXRlIGEgQmluZGVyIG9mIHRoZSBQcm92aWRlciB3aXRoIHRoZSBjb25jcmV0ZSBjb250cmFjdC4gKi8KKyAgICAgICAgRnVuY3Rpb248Q2xhc3MsIEJpbmRlcj4gYmluZGVyRnVuY3Rpb24gPSBjb250cmFjdCAtPiBuZXcgQWJzdHJhY3RCaW5kZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICAgICAgICAgIEluc3RhbmNlQmluZGluZyBidWlsZGVyID0gYmluZChwcm92aWRlckluc3RhbmNlKQorICAgICAgICAgICAgICAgICAgICAgICAgLnF1YWxpZmllZEJ5KEN1c3RvbUFubm90YXRpb25MaXRlcmFsLklOU1RBTkNFKQorICAgICAgICAgICAgICAgICAgICAgICAgLnRvKGNvbnRyYWN0KTsKKworICAgICAgICAgICAgICAgIGludCBwcmlvcml0eSA9IG1vZGVsLmdldFByaW9yaXR5KGNvbnRyYWN0KTsKKyAgICAgICAgICAgICAgICBpZiAocHJpb3JpdHkgPiBDb250cmFjdFByb3ZpZGVyLk5PX1BSSU9SSVRZKSB7CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIucmFua2VkKHByaW9yaXR5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgLyogQ3JlYXRlIEJpbmRlcnMgd2l0aCBhbGwgY29udHJhY3RzIGFuZCByZXR1cm4gdGhlaXIgY29sbGVjdGlvbi4gKi8KKyAgICAgICAgcmV0dXJuIG1vZGVsLmdldENvbnRyYWN0cygpLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgLm1hcChiaW5kZXJGdW5jdGlvbikKKyAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCaW5kIGFsbCBwcm92aWRlcnMgY29udGFpbmVkIGluIHtAY29kZSBwcm92aWRlckJhZ30gKGNsYXNzZXMgYW5kIGluc3RhbmNlcykgdXNpbmcgaW5qZWN0aW9uIG1hbmFnZXIuIENvbmZpZ3VyYXRpb24gaXMKKyAgICAgKiBhbHNvIGNvbW1pdHRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb21wb25lbnRCYWcgICAgIGJhZyBvZiBwcm92aWRlciBjbGFzc2VzIGFuZCBpbnN0YW5jZXMuCisgICAgICogQHBhcmFtIGluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uIG1hbmFnZXIgdGhlIGJpbmRlciB3aWxsIHVzZSB0byBiaW5kIHRoZSBwcm92aWRlcnMgaW50by4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYmluZFByb3ZpZGVycyhmaW5hbCBDb21wb25lbnRCYWcgY29tcG9uZW50QmFnLCBmaW5hbCBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIpIHsKKyAgICAgICAgYmluZFByb3ZpZGVycyhjb21wb25lbnRCYWcsIG51bGwsIENvbGxlY3Rpb25zLmVtcHR5U2V0KCksIGluamVjdGlvbk1hbmFnZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJpbmQgYWxsIHByb3ZpZGVycyBjb250YWluZWQgaW4ge0Bjb2RlIHByb3ZpZGVyQmFnfSAoY2xhc3NlcyBhbmQgaW5zdGFuY2VzKSB1c2luZyBpbmplY3Rpb24gbWFuYWdlci4gQ29uZmlndXJhdGlvbiBpcworICAgICAqIGFsc28gY29tbWl0dGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbXBvbmVudEJhZyAgICAgIGJhZyBvZiBwcm92aWRlciBjbGFzc2VzIGFuZCBpbnN0YW5jZXMuCisgICAgICogQHBhcmFtIGNvbnN0cmFpbmVkVG8gICAgIGN1cnJlbnQgcnVudGltZSAoY2xpZW50IG9yIHNlcnZlcikuCisgICAgICogQHBhcmFtIHJlZ2lzdGVyZWRDbGFzc2VzIGNsYXNzZXMgd2hpY2ggYXJlIG1hbnVhbGx5IHJlZ2lzdGVyZWQgYnkgdGhlIHVzZXIgKG5vdCBmb3VuZCBieSB0aGUgY2xhc3NwYXRoIHNjYW5uaW5nKS4KKyAgICAgKiBAcGFyYW0gaW5qZWN0aW9uTWFuYWdlciAgaW5qZWN0aW9uIG1hbmFnZXIgdGhlIGJpbmRlciB3aWxsIHVzZSB0byBiaW5kIHRoZSBwcm92aWRlcnMgaW50by4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYmluZFByb3ZpZGVycyhDb21wb25lbnRCYWcgY29tcG9uZW50QmFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bnRpbWVUeXBlIGNvbnN0cmFpbmVkVG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0PENsYXNzPD8+PiByZWdpc3RlcmVkQ2xhc3NlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIpIHsKKyAgICAgICAgUHJlZGljYXRlPENvbnRyYWN0UHJvdmlkZXI+IGZpbHRlciA9IENvbXBvbmVudEJhZy5FWENMVURFX0VNUFRZCisgICAgICAgICAgICAgICAgLmFuZChDb21wb25lbnRCYWcuZXhjbHVkZU1ldGFQcm92aWRlcnMoaW5qZWN0aW9uTWFuYWdlcikpOworCisgICAgICAgIC8qCisgICAgICAgICAqIENoZWNrIHRoZSB7QGNvZGUgY29tcG9uZW50fSB3aGV0aGVyIGl0IGlzIGNvcnJlY3RseSBjb25maWd1cmVkIGZvciBjbGllbnQgb3Igc2VydmVyIHtAbGluayBSdW50aW1lVHlwZSBydW50aW1lfS4KKyAgICAgICAgICovCisgICAgICAgIFByZWRpY2F0ZTxDbGFzczw/Pj4gY29ycmVjdGx5Q29uZmlndXJlZCA9CisgICAgICAgICAgICAgICAgY29tcG9uZW50Q2xhc3MgLT4gUHJvdmlkZXJzLmNoZWNrUHJvdmlkZXJSdW50aW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50Q2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRCYWcuZ2V0TW9kZWwoY29tcG9uZW50Q2xhc3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RyYWluZWRUbywKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyZWRDbGFzc2VzID09IG51bGwgfHwgIXJlZ2lzdGVyZWRDbGFzc2VzLmNvbnRhaW5zKGNvbXBvbmVudENsYXNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBUaGVzZSBiaW5kZXIgd2lsbCBiZSByZWdpc3RlcmVkIHRvIEluamVjdGlvbk1hbmFnZXIgYXQgdGhlIGVuZCBvZiBtZXRob2QgYmVjYXVzZSBvZiBhIGJ1bGsgcmVnaXN0cmF0aW9uIHRvIGF2b2lkIGEKKyAgICAgICAgICogcmVnaXN0cmF0aW9uIGVhY2ggYmluZGVyIGFsb25lLgorICAgICAgICAgKi8KKyAgICAgICAgQ29sbGVjdGlvbjxCaW5kZXI+IGJpbmRlclRvUmVnaXN0ZXIgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgICAgICAvLyBCaW5kIHByb3ZpZGVyIGNsYXNzZXMgZXhjZXB0IGZvciBwdXJlIG1ldGEtcHJvdmlkZXJzIGFuZCBwcm92aWRlcnMgd2l0aCBlbXB0eSBjb250cmFjdCBtb2RlbHMgKGUuZy4gcmVzb3VyY2VzKQorICAgICAgICBTZXQ8Q2xhc3M8Pz4+IGNsYXNzZXMgPSBuZXcgTGlua2VkSGFzaFNldDw+KGNvbXBvbmVudEJhZy5nZXRDbGFzc2VzKGZpbHRlcikpOworICAgICAgICBpZiAoY29uc3RyYWluZWRUbyAhPSBudWxsKSB7CisgICAgICAgICAgICBjbGFzc2VzID0gY2xhc3Nlcy5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGNvcnJlY3RseUNvbmZpZ3VyZWQpCisgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChmaW5hbCBDbGFzczw/PiBwcm92aWRlckNsYXNzIDogY2xhc3NlcykgeworICAgICAgICAgICAgZmluYWwgQ29udHJhY3RQcm92aWRlciBtb2RlbCA9IGNvbXBvbmVudEJhZy5nZXRNb2RlbChwcm92aWRlckNsYXNzKTsKKyAgICAgICAgICAgIGJpbmRlclRvUmVnaXN0ZXIuYWRkQWxsKGNyZWF0ZVByb3ZpZGVyQmluZGVycyhwcm92aWRlckNsYXNzLCBtb2RlbCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQmluZCBwcm92aWRlciBpbnN0YW5jZXMgZXhjZXB0IGZvciBwdXJlIG1ldGEtcHJvdmlkZXJzIGFuZCBwcm92aWRlcnMgd2l0aCBlbXB0eSBjb250cmFjdCBtb2RlbHMgKGUuZy4gcmVzb3VyY2VzKQorICAgICAgICBTZXQ8T2JqZWN0PiBpbnN0YW5jZXMgPSBjb21wb25lbnRCYWcuZ2V0SW5zdGFuY2VzKGZpbHRlcik7CisgICAgICAgIGlmIChjb25zdHJhaW5lZFRvICE9IG51bGwpIHsKKyAgICAgICAgICAgIGluc3RhbmNlcyA9IGluc3RhbmNlcy5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGNvbXBvbmVudCAtPiBjb3JyZWN0bHlDb25maWd1cmVkLnRlc3QoY29tcG9uZW50LmdldENsYXNzKCkpKQorICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoZmluYWwgT2JqZWN0IHByb3ZpZGVyIDogaW5zdGFuY2VzKSB7CisgICAgICAgICAgICBmaW5hbCBDb250cmFjdFByb3ZpZGVyIG1vZGVsID0gY29tcG9uZW50QmFnLmdldE1vZGVsKHByb3ZpZGVyLmdldENsYXNzKCkpOworICAgICAgICAgICAgYmluZGVyVG9SZWdpc3Rlci5hZGRBbGwoY3JlYXRlUHJvdmlkZXJCaW5kZXJzKHByb3ZpZGVyLCBtb2RlbCkpOworICAgICAgICB9CisKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5yZWdpc3RlcihDb21wb3NpdGVCaW5kZXIud3JhcChiaW5kZXJUb1JlZ2lzdGVyKSk7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHJpdmF0ZSBzdGF0aWMgPFQ+IENvbGxlY3Rpb248QmluZGVyPiBjcmVhdGVJbnN0YW5jZUJpbmRlcnMoVCBpbnN0YW5jZSkgeworICAgICAgICBGdW5jdGlvbjxDbGFzcywgQmluZGVyPiBiaW5kZXJGdW5jdGlvbiA9IGNvbnRyYWN0IC0+CisgICAgICAgICAgICAgICAgbmV3IEFic3RyYWN0QmluZGVyKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYmluZChpbnN0YW5jZSkudG8oY29udHJhY3QpLnF1YWxpZmllZEJ5KEN1c3RvbUFubm90YXRpb25MaXRlcmFsLklOU1RBTkNFKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgcmV0dXJuIFByb3ZpZGVycy5nZXRQcm92aWRlckNvbnRyYWN0cyhpbnN0YW5jZS5nZXRDbGFzcygpKS5zdHJlYW0oKQorICAgICAgICAgICAgICAgIC5tYXAoYmluZGVyRnVuY3Rpb24pCisgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIvYmluZCBjdXN0b20gcHJvdmlkZXIgaW5zdGFuY2VzLiBSZWdpc3RlcmVkIHByb3ZpZGVycyB3aWxsIGJlIGhhbmRsZWQKKyAgICAgKiBhbHdheXMgYXMgU2luZ2xldG9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnN0YW5jZXMgY3VzdG9tIHByb3ZpZGVyIGluc3RhbmNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiaW5kSW5zdGFuY2VzKGZpbmFsIEl0ZXJhYmxlPE9iamVjdD4gaW5zdGFuY2VzKSB7CisgICAgICAgIExpc3Q8T2JqZWN0PiBpbnN0YW5jZXNMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGluc3RhbmNlcy5mb3JFYWNoKGluc3RhbmNlc0xpc3Q6OmFkZCk7CisgICAgICAgIGJpbmRJbnN0YW5jZXMoaW5zdGFuY2VzTGlzdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIvYmluZCBjdXN0b20gcHJvdmlkZXIgaW5zdGFuY2VzLiBSZWdpc3RlcmVkIHByb3ZpZGVycyB3aWxsIGJlIGhhbmRsZWQKKyAgICAgKiBhbHdheXMgYXMgU2luZ2xldG9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnN0YW5jZXMgY3VzdG9tIHByb3ZpZGVyIGluc3RhbmNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiaW5kSW5zdGFuY2VzKGZpbmFsIENvbGxlY3Rpb248T2JqZWN0PiBpbnN0YW5jZXMpIHsKKyAgICAgICAgTGlzdDxCaW5kZXI+IGJpbmRlcnMgPSBpbnN0YW5jZXMuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAubWFwKFByb3ZpZGVyQmluZGVyOjpjcmVhdGVJbnN0YW5jZUJpbmRlcnMpCisgICAgICAgICAgICAgICAgLmZsYXRNYXAoQ29sbGVjdGlvbjo6c3RyZWFtKQorICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCisgICAgICAgIGluamVjdGlvbk1hbmFnZXIucmVnaXN0ZXIoQ29tcG9zaXRlQmluZGVyLndyYXAoYmluZGVycykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyL2JpbmQgY3VzdG9tIHByb3ZpZGVyIGNsYXNzZXMuIFJlZ2lzdGVyZWQgcHJvdmlkZXJzIHdpbGwgYmUgaGFuZGxlZAorICAgICAqIGFsd2F5cyBhcyBTaW5nbGV0b25zIHVubGVzcyBhbm5vdGF0ZWQgYnkge0BsaW5rIFBlckxvb2t1cH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhc3NlcyBjdXN0b20gcHJvdmlkZXIgY2xhc3Nlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiaW5kQ2xhc3NlcyhmaW5hbCBDbGFzczw/Pi4uLiBjbGFzc2VzKSB7CisgICAgICAgIGJpbmRDbGFzc2VzKEFycmF5cy5hc0xpc3QoY2xhc3NlcyksIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3Rlci9iaW5kIGN1c3RvbSBwcm92aWRlciBjbGFzc2VzLiBSZWdpc3RlcmVkIHByb3ZpZGVycyB3aWxsIGJlIGhhbmRsZWQKKyAgICAgKiBhbHdheXMgYXMgU2luZ2xldG9ucyB1bmxlc3MgYW5ub3RhdGVkIGJ5IHtAbGluayBQZXJMb29rdXB9LgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzZXMgY3VzdG9tIHByb3ZpZGVyIGNsYXNzZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYmluZENsYXNzZXMoZmluYWwgSXRlcmFibGU8Q2xhc3M8Pz4+IGNsYXNzZXMpIHsKKyAgICAgICAgTGlzdDxDbGFzczw/Pj4gY2xhc3Nlc0xpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgY2xhc3Nlcy5mb3JFYWNoKGNsYXNzZXNMaXN0OjphZGQpOworICAgICAgICBiaW5kQ2xhc3NlcyhjbGFzc2VzTGlzdCwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyL2JpbmQgY3VzdG9tIHByb3ZpZGVyIGNsYXNzZXMuIFJlZ2lzdGVyZWQgcHJvdmlkZXJzIHdpbGwgYmUgaGFuZGxlZAorICAgICAqIGFsd2F5cyBhcyBTaW5nbGV0b25zIHVubGVzcyBhbm5vdGF0ZWQgYnkge0BsaW5rIFBlckxvb2t1cH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhc3NlcyBjdXN0b20gcHJvdmlkZXIgY2xhc3Nlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBiaW5kQ2xhc3NlcyhmaW5hbCBDb2xsZWN0aW9uPENsYXNzPD8+PiBjbGFzc2VzKSB7CisgICAgICAgIGJpbmRDbGFzc2VzKGNsYXNzZXMsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3Rlci9iaW5kIGN1c3RvbSBwcm92aWRlciBjbGFzc2VzIHRoYXQgbWF5IGFsc28gYmUgcmVzb3VyY2VzLiBSZWdpc3RlcmVkCisgICAgICogcHJvdmlkZXJzL3Jlc291cmNlcyB3aWxsIGJlIGhhbmRsZWQgYWx3YXlzIGFzIFNpbmdsZXRvbnMgdW5sZXNzIGFubm90YXRlZCBieQorICAgICAqIHtAbGluayBQZXJMb29rdXB9LgorICAgICAqIDxwPgorICAgICAqIDxwPgorICAgICAqIElmIHtAY29kZSBiaW5kQXNSZXNvdXJjZXN9IGlzIHNldCB0byB7QGNvZGUgdHJ1ZX0sIHRoZSBwcm92aWRlcnMgd2lsbCBhbHNvIGJlIGJvdW5kCisgICAgICogYXMgcmVzb3VyY2VzLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGFzc2VzICAgICAgIGN1c3RvbSBwcm92aWRlciBjbGFzc2VzLgorICAgICAqIEBwYXJhbSBiaW5kUmVzb3VyY2VzIGlmIHtAY29kZSB0cnVlfSwgdGhlIHByb3ZpZGVyIGNsYXNzZXMgd2lsbCBhbHNvIGJlIGJvdW5kIGFzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGJpbmRDbGFzc2VzKENvbGxlY3Rpb248Q2xhc3M8Pz4+IGNsYXNzZXMsIGJvb2xlYW4gYmluZFJlc291cmNlcykgeworICAgICAgICBMaXN0PEJpbmRlcj4gYmluZGVycyA9IGNsYXNzZXMuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAubWFwKGNsYXp6IC0+IGNyZWF0ZUNsYXNzQmluZGVycyhjbGF6eiwgYmluZFJlc291cmNlcykpCisgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5yZWdpc3RlcihDb21wb3NpdGVCaW5kZXIud3JhcChiaW5kZXJzKSk7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHJpdmF0ZSA8VD4gQmluZGVyIGNyZWF0ZUNsYXNzQmluZGVycyhDbGFzczxUPiBjbGF6eiwgYm9vbGVhbiBpc1Jlc291cmNlKSB7CisgICAgICAgIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBzY29wZSA9IGdldFByb3ZpZGVyU2NvcGUoY2xhenopOworCisgICAgICAgIGlmIChpc1Jlc291cmNlKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEFic3RyYWN0QmluZGVyKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgQ2xhc3NCaW5kaW5nPFQ+IGRlc2NyaXB0b3IgPSBiaW5kQXNDb250cmFjdChjbGF6eikuaW4oc2NvcGUpOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoQ2xhc3MgY29udHJhY3QgOiBQcm92aWRlcnMuZ2V0UHJvdmlkZXJDb250cmFjdHMoY2xhenopKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLmFkZEFsaWFzKGNvbnRyYWN0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW4oc2NvcGUuZ2V0TmFtZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucXVhbGlmaWVkQnkoQ3VzdG9tQW5ub3RhdGlvbkxpdGVyYWwuSU5TVEFOQ0UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQWJzdHJhY3RCaW5kZXIoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICAgICAgICAgICAgICBDbGFzc0JpbmRpbmc8VD4gYnVpbGRlciA9IGJpbmQoY2xhenopLmluKHNjb3BlKS5xdWFsaWZpZWRCeShDdXN0b21Bbm5vdGF0aW9uTGl0ZXJhbC5JTlNUQU5DRSk7CisgICAgICAgICAgICAgICAgICAgIFByb3ZpZGVycy5nZXRQcm92aWRlckNvbnRyYWN0cyhjbGF6eikuZm9yRWFjaChjb250cmFjdCAtPiBidWlsZGVyLnRvKChDbGFzczw/IHN1cGVyIFQ+KSBjb250cmFjdCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBnZXRQcm92aWRlclNjb3BlKGZpbmFsIENsYXNzPD8+IGNsYXp6KSB7CisgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBzY29wZSA9IFNpbmdsZXRvbi5jbGFzczsKKyAgICAgICAgaWYgKGNsYXp6LmlzQW5ub3RhdGlvblByZXNlbnQoUGVyTG9va3VwLmNsYXNzKSkgeworICAgICAgICAgICAgc2NvcGUgPSBQZXJMb29rdXAuY2xhc3M7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNjb3BlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvaW5qZWN0L1Byb3ZpZGVycy5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9pbmplY3QvUHJvdmlkZXJzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk2NTU3NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvaW5qZWN0L1Byb3ZpZGVycy5qYXZhCkBAIC0wLDAgKzEsNTkzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdDsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtU3VwcG9ydDsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN0cmFpbmVkVG87CitpbXBvcnQgamF2YXgud3MucnMuUHJpb3JpdGllczsKK2ltcG9ydCBqYXZheC53cy5ycy5SdW50aW1lVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmU7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW9kZWwuQ29udHJhY3RQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb2RlbC5pbnRlcm5hbC5SYW5rZWRDb21wYXJhdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1vZGVsLmludGVybmFsLlJhbmtlZFByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5Db250cmFjdDsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIHByb3ZpZGluZyBhIHNldCBvZiB1dGlsaXR5IG1ldGhvZHMgZm9yIGVhc2llciBhbmQgbW9yZSB0eXBlLXNhZmUKKyAqIGludGVyYWN0aW9uIHdpdGggYW4gaW5qZWN0aW9uIGxheWVyLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBQcm92aWRlcnMgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoUHJvdmlkZXJzLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICAvKioKKyAgICAgKiBNYXAgb2YgYWxsIHN0YW5kYXJkIEpBWC1SUyBwcm92aWRlcnMgYW5kIHRoZWlyIHJ1bi10aW1lIGFmZmluaXR5LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxDbGFzczw/PiwgUHJvdmlkZXJSdW50aW1lPiBKQVhfUlNfUFJPVklERVJfSU5URVJGQUNFX1dISVRFTElTVCA9CisgICAgICAgICAgICBnZXRKYXhSc1Byb3ZpZGVySW50ZXJmYWNlcygpOworICAgIC8qKgorICAgICAqIE1hcCBvZiBhbGwgc3VwcG9ydGVkIGV4dGVybmFsIChpLmUuIG5vbi1KZXJzZXkpIGNvbnRyYWN0cyBhbmQgdGhlaXIgcnVuLXRpbWUgYWZmaW5pdHkuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPENsYXNzPD8+LCBQcm92aWRlclJ1bnRpbWU+IEVYVEVSTkFMX1BST1ZJREVSX0lOVEVSRkFDRV9XSElURUxJU1QgPQorICAgICAgICAgICAgZ2V0RXh0ZXJuYWxQcm92aWRlckludGVyZmFjZXMoKTsKKworICAgIHByaXZhdGUgUHJvdmlkZXJzKCkgeworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE1hcDxDbGFzczw/PiwgUHJvdmlkZXJSdW50aW1lPiBnZXRKYXhSc1Byb3ZpZGVySW50ZXJmYWNlcygpIHsKKyAgICAgICAgZmluYWwgTWFwPENsYXNzPD8+LCBQcm92aWRlclJ1bnRpbWU+IGludGVyZmFjZXMgPSBuZXcgSGFzaE1hcDxDbGFzczw/PiwgUHJvdmlkZXJSdW50aW1lPigpOworCisgICAgICAgIGludGVyZmFjZXMucHV0KGphdmF4LndzLnJzLmV4dC5Db250ZXh0UmVzb2x2ZXIuY2xhc3MsIFByb3ZpZGVyUnVudGltZS5CT1RIKTsKKyAgICAgICAgaW50ZXJmYWNlcy5wdXQoamF2YXgud3MucnMuZXh0LkV4Y2VwdGlvbk1hcHBlci5jbGFzcywgUHJvdmlkZXJSdW50aW1lLkJPVEgpOworICAgICAgICBpbnRlcmZhY2VzLnB1dChqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXIuY2xhc3MsIFByb3ZpZGVyUnVudGltZS5CT1RIKTsKKyAgICAgICAgaW50ZXJmYWNlcy5wdXQoamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyLmNsYXNzLCBQcm92aWRlclJ1bnRpbWUuQk9USCk7CisgICAgICAgIGludGVyZmFjZXMucHV0KGphdmF4LndzLnJzLmV4dC5SZWFkZXJJbnRlcmNlcHRvci5jbGFzcywgUHJvdmlkZXJSdW50aW1lLkJPVEgpOworICAgICAgICBpbnRlcmZhY2VzLnB1dChqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3IuY2xhc3MsIFByb3ZpZGVyUnVudGltZS5CT1RIKTsKKyAgICAgICAgaW50ZXJmYWNlcy5wdXQoamF2YXgud3MucnMuZXh0LlBhcmFtQ29udmVydGVyUHJvdmlkZXIuY2xhc3MsIFByb3ZpZGVyUnVudGltZS5CT1RIKTsKKworICAgICAgICBpbnRlcmZhY2VzLnB1dChqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlci5jbGFzcywgUHJvdmlkZXJSdW50aW1lLlNFUlZFUik7CisgICAgICAgIGludGVyZmFjZXMucHV0KGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUZpbHRlci5jbGFzcywgUHJvdmlkZXJSdW50aW1lLlNFUlZFUik7CisgICAgICAgIGludGVyZmFjZXMucHV0KGphdmF4LndzLnJzLmNvbnRhaW5lci5EeW5hbWljRmVhdHVyZS5jbGFzcywgUHJvdmlkZXJSdW50aW1lLlNFUlZFUik7CisKKyAgICAgICAgaW50ZXJmYWNlcy5wdXQoamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlc3BvbnNlRmlsdGVyLmNsYXNzLCBQcm92aWRlclJ1bnRpbWUuQ0xJRU5UKTsKKyAgICAgICAgaW50ZXJmYWNlcy5wdXQoamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RGaWx0ZXIuY2xhc3MsIFByb3ZpZGVyUnVudGltZS5DTElFTlQpOworICAgICAgICBpbnRlcmZhY2VzLnB1dChqYXZheC53cy5ycy5jbGllbnQuUnhJbnZva2VyUHJvdmlkZXIuY2xhc3MsIFByb3ZpZGVyUnVudGltZS5DTElFTlQpOworCisgICAgICAgIHJldHVybiBpbnRlcmZhY2VzOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE1hcDxDbGFzczw/PiwgUHJvdmlkZXJSdW50aW1lPiBnZXRFeHRlcm5hbFByb3ZpZGVySW50ZXJmYWNlcygpIHsKKyAgICAgICAgZmluYWwgTWFwPENsYXNzPD8+LCBQcm92aWRlclJ1bnRpbWU+IGludGVyZmFjZXMgPSBuZXcgSGFzaE1hcDxDbGFzczw/PiwgUHJvdmlkZXJSdW50aW1lPigpOworCisgICAgICAgIC8vIEpBWC1SUworICAgICAgICBpbnRlcmZhY2VzLnB1dEFsbChKQVhfUlNfUFJPVklERVJfSU5URVJGQUNFX1dISVRFTElTVCk7CisgICAgICAgIGludGVyZmFjZXMucHV0KGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZS5jbGFzcywgUHJvdmlkZXJSdW50aW1lLkJPVEgpOworICAgICAgICBpbnRlcmZhY2VzLnB1dChCaW5kZXIuY2xhc3MsIFByb3ZpZGVyUnVudGltZS5CT1RIKTsKKyAgICAgICAgcmV0dXJuIGludGVyZmFjZXM7CisgICAgfQorCisgICAgcHJpdmF0ZSBlbnVtIFByb3ZpZGVyUnVudGltZSB7CisKKyAgICAgICAgQk9USChudWxsKSwgU0VSVkVSKFJ1bnRpbWVUeXBlLlNFUlZFUiksIENMSUVOVChSdW50aW1lVHlwZS5DTElFTlQpOworCisgICAgICAgIHByaXZhdGUgZmluYWwgUnVudGltZVR5cGUgcnVudGltZTsKKworICAgICAgICBwcml2YXRlIFByb3ZpZGVyUnVudGltZShmaW5hbCBSdW50aW1lVHlwZSBydW50aW1lKSB7CisgICAgICAgICAgICB0aGlzLnJ1bnRpbWUgPSBydW50aW1lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFJ1bnRpbWVUeXBlIGdldFJ1bnRpbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gcnVudGltZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgc2V0IG9mIGRlZmF1bHQgcHJvdmlkZXJzIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBzZXJ2aWNlIHByb3ZpZGVyIGNvbnRyYWN0CisgICAgICogaW4gdGhlIHVuZGVybHlpbmcge0BsaW5rIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uIG1hbmFnZXJ9IGNvbnRhaW5lci4KKyAgICAgKgorICAgICAqIEBwYXJhbSA8VD4gICAgICAgICAgICAgc2VydmljZSBwcm92aWRlciBjb250cmFjdCBKYXZhIHR5cGUuCisgICAgICogQHBhcmFtIGluamVjdGlvbk1hbmFnZXIgdW5kZXJseWluZyBpbmplY3Rpb24gbWFuYWdlci4KKyAgICAgKiBAcGFyYW0gY29udHJhY3QgICAgICAgIHNlcnZpY2UgcHJvdmlkZXIgY29udHJhY3QuCisgICAgICogQHJldHVybiBzZXQgb2YgYWxsIGF2YWlsYWJsZSBkZWZhdWx0IHNlcnZpY2UgcHJvdmlkZXIgaW5zdGFuY2VzIGZvciB0aGUgY29udHJhY3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8VD4gU2V0PFQ+IGdldFByb3ZpZGVycyhJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIsIENsYXNzPFQ+IGNvbnRyYWN0KSB7CisgICAgICAgIENvbGxlY3Rpb248U2VydmljZUhvbGRlcjxUPj4gcHJvdmlkZXJzID0gZ2V0U2VydmljZUhvbGRlcnMoaW5qZWN0aW9uTWFuYWdlciwgY29udHJhY3QpOworICAgICAgICByZXR1cm4gZ2V0UHJvdmlkZXJDbGFzc2VzKHByb3ZpZGVycyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBzZXQgb2YgYWxsIGN1c3RvbSBwcm92aWRlcnMgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIHNlcnZpY2UgcHJvdmlkZXIgY29udHJhY3QKKyAgICAgKiBpbiB0aGUgdW5kZXJseWluZyB7QGxpbmsgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb24gbWFuYWdlcn0gY29udGFpbmVyLgorICAgICAqIDxwPgorICAgICAqIFJldHVybmVkIHByb3ZpZGVycyBhcmUgc29ydGVkIGJhc2VkIG9uIHtAbGluayBQcmlvcml0eX0gKGxvd2VyIHtAY29kZSBQcmlvcml0eX0gdmFsdWUgaXMgaGlnaGVyIHByaW9yaXR5LAorICAgICAqIHNlZSB7QGxpbmsgUHJpb3JpdGllc30uCisgICAgICoKKyAgICAgKiBAcGFyYW0gPFQ+ICAgICAgICAgICAgICBzZXJ2aWNlIHByb3ZpZGVyIGNvbnRyYWN0IEphdmEgdHlwZS4KKyAgICAgKiBAcGFyYW0gaW5qZWN0aW9uTWFuYWdlciB1bmRlcmx5aW5nIGluamVjdGlvbiBtYW5hZ2VyLgorICAgICAqIEBwYXJhbSBjb250cmFjdCAgICAgICAgIHNlcnZpY2UgcHJvdmlkZXIgY29udHJhY3QuCisgICAgICogQHJldHVybiBzZXQgb2YgYWxsIGF2YWlsYWJsZSBzZXJ2aWNlIHByb3ZpZGVyIGluc3RhbmNlcyBmb3IgdGhlIGNvbnRyYWN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFNldDxUPiBnZXRDdXN0b21Qcm92aWRlcnMoSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyLCBDbGFzczxUPiBjb250cmFjdCkgeworCisgICAgICAgIExpc3Q8U2VydmljZUhvbGRlcjxUPj4gcHJvdmlkZXJzID0gZ2V0U2VydmljZUhvbGRlcnMoaW5qZWN0aW9uTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cmFjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wYXJhdG9yLmNvbXBhcmluZ0ludChQcm92aWRlcnM6OmdldFByaW9yaXR5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21Bbm5vdGF0aW9uTGl0ZXJhbC5JTlNUQU5DRSk7CisKKyAgICAgICAgcmV0dXJuIGdldFByb3ZpZGVyQ2xhc3Nlcyhwcm92aWRlcnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgaXRlcmFibGUgb2YgYWxsIHByb3ZpZGVycyAoY3VzdG9tIGFuZCBkZWZhdWx0KSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gc2VydmljZSBwcm92aWRlciBjb250cmFjdAorICAgICAqIGluIHRoZSB1bmRlcmx5aW5nIHtAbGluayBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbiBtYW5hZ2VyfSBjb250YWluZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gPFQ+ICAgICAgICAgICAgIHNlcnZpY2UgcHJvdmlkZXIgY29udHJhY3QgSmF2YSB0eXBlLgorICAgICAqIEBwYXJhbSBpbmplY3Rpb25NYW5hZ2VyIHVuZGVybHlpbmcgaW5qZWN0aW9uIG1hbmFnZXIuCisgICAgICogQHBhcmFtIGNvbnRyYWN0ICAgICAgICBzZXJ2aWNlIHByb3ZpZGVyIGNvbnRyYWN0LgorICAgICAqIEByZXR1cm4gaXRlcmFibGUgb2YgYWxsIGF2YWlsYWJsZSBzZXJ2aWNlIHByb3ZpZGVyIGluc3RhbmNlcyBmb3IgdGhlIGNvbnRyYWN0LiBSZXR1cm4gdmFsdWUgaXMgbmV2ZXIgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUPiBJdGVyYWJsZTxUPiBnZXRBbGxQcm92aWRlcnMoSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyLCBDbGFzczxUPiBjb250cmFjdCkgeworICAgICAgICByZXR1cm4gZ2V0QWxsUHJvdmlkZXJzKGluamVjdGlvbk1hbmFnZXIsIGNvbnRyYWN0LCAoQ29tcGFyYXRvcjxUPikgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBpdGVyYWJsZSBvZiBhbGwge0BsaW5rIFJhbmtlZFByb3ZpZGVyIHByb3ZpZGVyc30gKGN1c3RvbSBhbmQgZGVmYXVsdCkgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIHNlcnZpY2UgcHJvdmlkZXIKKyAgICAgKiBjb250cmFjdCBpbiB0aGUgdW5kZXJseWluZyB7QGxpbmsgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb24gbWFuYWdlcn0gY29udGFpbmVyLgorICAgICAqCisgICAgICogQHBhcmFtIDxUPiAgICAgICAgICAgICBzZXJ2aWNlIHByb3ZpZGVyIGNvbnRyYWN0IEphdmEgdHlwZS4KKyAgICAgKiBAcGFyYW0gaW5qZWN0aW9uTWFuYWdlciB1bmRlcmx5aW5nIGluamVjdGlvbiBtYW5hZ2VyLgorICAgICAqIEBwYXJhbSBjb250cmFjdCAgICAgICAgc2VydmljZSBwcm92aWRlciBjb250cmFjdC4KKyAgICAgKiBAcmV0dXJuIGl0ZXJhYmxlIG9mIGFsbCBhdmFpbGFibGUgcmFua2VkIHNlcnZpY2UgcHJvdmlkZXJzIGZvciB0aGUgY29udHJhY3QuIFJldHVybiB2YWx1ZSBpcyBuZXZlciB7QGNvZGUgbnVsbH0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8VD4gSXRlcmFibGU8UmFua2VkUHJvdmlkZXI8VD4+IGdldEFsbFJhbmtlZFByb3ZpZGVycyhJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIsIENsYXNzPFQ+IGNvbnRyYWN0KSB7CisgICAgICAgIExpc3Q8U2VydmljZUhvbGRlcjxUPj4gcHJvdmlkZXJzID0gZ2V0U2VydmljZUhvbGRlcnMoaW5qZWN0aW9uTWFuYWdlciwgY29udHJhY3QsIEN1c3RvbUFubm90YXRpb25MaXRlcmFsLklOU1RBTkNFKTsKKyAgICAgICAgcHJvdmlkZXJzLmFkZEFsbChnZXRTZXJ2aWNlSG9sZGVycyhpbmplY3Rpb25NYW5hZ2VyLCBjb250cmFjdCkpOworCisgICAgICAgIExpbmtlZEhhc2hNYXA8U2VydmljZUhvbGRlcjxUPiwgUmFua2VkUHJvdmlkZXI8VD4+IHByb3ZpZGVyTWFwID0gbmV3IExpbmtlZEhhc2hNYXA8PigpOworCisgICAgICAgIGZvciAoU2VydmljZUhvbGRlcjxUPiBwcm92aWRlciA6IHByb3ZpZGVycykgeworICAgICAgICAgICAgaWYgKCFwcm92aWRlck1hcC5jb250YWluc0tleShwcm92aWRlcikpIHsKKyAgICAgICAgICAgICAgICBTZXQ8VHlwZT4gY29udHJhY3RUeXBlcyA9IHByb3ZpZGVyLmdldENvbnRyYWN0VHlwZXMoKTsKKyAgICAgICAgICAgICAgICBDbGFzczw/PiBpbXBsZW1lbnRhdGlvbkNsYXNzID0gcHJvdmlkZXIuZ2V0SW1wbGVtZW50YXRpb25DbGFzcygpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gcHJveHlHZW5lcmF0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGZvciAoVHlwZSBjdCA6IGNvbnRyYWN0VHlwZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCgoQ2xhc3M8Pz4pIGN0KS5pc0Fzc2lnbmFibGVGcm9tKGltcGxlbWVudGF0aW9uQ2xhc3MpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm94eUdlbmVyYXRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU2V0PFR5cGU+IGNvbnRyYWN0cyA9IHByb3h5R2VuZXJhdGVkID8gY29udHJhY3RUeXBlcyA6IG51bGw7CisgICAgICAgICAgICAgICAgcHJvdmlkZXJNYXAucHV0KHByb3ZpZGVyLCBuZXcgUmFua2VkUHJvdmlkZXI8Pihwcm92aWRlci5nZXRJbnN0YW5jZSgpLCBwcm92aWRlci5nZXRSYW5rKCksIGNvbnRyYWN0cykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHByb3ZpZGVyTWFwLnZhbHVlcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNvcnQgZ2l2ZW4gcHJvdmlkZXJzIHdpdGgge0BsaW5rIFJhbmtlZENvbXBhcmF0b3IgcmFua2VkIGNvbXBhcmF0b3J9LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbXBhcmF0b3IgY29tcGFyYXRvciB0byBzb3J0IHRoZSBwcm92aWRlcnMgd2l0aC4KKyAgICAgKiBAcGFyYW0gcHJvdmlkZXJzICBwcm92aWRlcnMgdG8gYmUgc29ydGVkLgorICAgICAqIEBwYXJhbSA8VD4gICAgICAgIHNlcnZpY2UgcHJvdmlkZXIgY29udHJhY3QgSmF2YSB0eXBlLgorICAgICAqIEByZXR1cm4gc29ydGVkIHtAbGluayBJdGVyYWJsZSBpdGVyYWJsZX0gaW5zdGFuY2UgY29udGFpbmluZyBnaXZlbiBwcm92aWRlcnMuCisgICAgICogVGhlIHJldHVybmVkIHZhbHVlIGlzIG5ldmVyIHtAY29kZSBudWxsfS4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiVHlwZU1heUJlV2Vha2VuZWQiKQorICAgIHB1YmxpYyBzdGF0aWMgPFQ+IEl0ZXJhYmxlPFQ+IHNvcnRSYW5rZWRQcm92aWRlcnMoZmluYWwgUmFua2VkQ29tcGFyYXRvcjxUPiBjb21wYXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSXRlcmFibGU8UmFua2VkUHJvdmlkZXI8VD4+IHByb3ZpZGVycykgeworCisgICAgICAgIHJldHVybiBTdHJlYW1TdXBwb3J0LnN0cmVhbShwcm92aWRlcnMuc3BsaXRlcmF0b3IoKSwgZmFsc2UpCisgICAgICAgICAgICAgICAgLnNvcnRlZChjb21wYXJhdG9yKQorICAgICAgICAgICAgICAgIC5tYXAoUmFua2VkUHJvdmlkZXI6OmdldFByb3ZpZGVyKQorICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgaXRlcmFibGUgb2YgYWxsIHByb3ZpZGVycyAoY3VzdG9tIGFuZCBkZWZhdWx0KSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gc2VydmljZSBwcm92aWRlciBjb250cmFjdCBpbiB0aGUgdW5kZXJseWluZworICAgICAqIHtAbGluayBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbiBtYW5hZ2VyfSBjb250YWluZXIgYW5kIGF1dG9tYXRpY2FsbHkgc29ydGVkIHVzaW5nCisgICAgICoge0BsaW5rIFJhbmtlZENvbXBhcmF0b3IgcmFua2VkIGNvbXBhcmF0b3J9LgorICAgICAqCisgICAgICogQHBhcmFtIDxUPiAgICAgICAgICAgICBzZXJ2aWNlIHByb3ZpZGVyIGNvbnRyYWN0IEphdmEgdHlwZS4KKyAgICAgKiBAcGFyYW0gaW5qZWN0aW9uTWFuYWdlciB1bmRlcmx5aW5nIGluamVjdGlvbiBtYW5hZ2VyLgorICAgICAqIEBwYXJhbSBjb250cmFjdCAgICAgICAgc2VydmljZSBwcm92aWRlciBjb250cmFjdC4KKyAgICAgKiBAcmV0dXJuIGl0ZXJhYmxlIG9mIGFsbCBhdmFpbGFibGUgc2VydmljZSBwcm92aWRlcnMgZm9yIHRoZSBjb250cmFjdC4gUmV0dXJuIHZhbHVlIGlzIG5ldmVyIHtAY29kZSBudWxsfS4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiVHlwZU1heUJlV2Vha2VuZWQiKQorICAgIHB1YmxpYyBzdGF0aWMgPFQ+IEl0ZXJhYmxlPFQ+IGdldEFsbFJhbmtlZFNvcnRlZFByb3ZpZGVycyhJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIsIENsYXNzPFQ+IGNvbnRyYWN0KSB7CisgICAgICAgIEl0ZXJhYmxlPFJhbmtlZFByb3ZpZGVyPFQ+PiBhbGxSYW5rZWRQcm92aWRlcnMgPSBQcm92aWRlcnMuZ2V0QWxsUmFua2VkUHJvdmlkZXJzKGluamVjdGlvbk1hbmFnZXIsIGNvbnRyYWN0KTsKKyAgICAgICAgcmV0dXJuIFByb3ZpZGVycy5zb3J0UmFua2VkUHJvdmlkZXJzKG5ldyBSYW5rZWRDb21wYXJhdG9yPD4oKSwgYWxsUmFua2VkUHJvdmlkZXJzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZXJnZSBhbmQgc29ydCBnaXZlbiBwcm92aWRlcnMgd2l0aCB7QGxpbmsgUmFua2VkQ29tcGFyYXRvciByYW5rZWQgY29tcGFyYXRvcn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tcGFyYXRvciAgICAgICAgY29tcGFyYXRvciB0byBzb3J0IHRoZSBwcm92aWRlcnMgd2l0aC4KKyAgICAgKiBAcGFyYW0gcHJvdmlkZXJJdGVyYWJsZXMgcHJvdmlkZXJzIHRvIGJlIHNvcnRlZC4KKyAgICAgKiBAcGFyYW0gPFQ+ICAgICAgICAgICAgICAgc2VydmljZSBwcm92aWRlciBjb250cmFjdCBKYXZhIHR5cGUuCisgICAgICogQHJldHVybiBtZXJnZWQgYW5kIHNvcnRlZCB7QGxpbmsgSXRlcmFibGUgaXRlcmFibGV9IGluc3RhbmNlIGNvbnRhaW5pbmcgZ2l2ZW4gcHJvdmlkZXJzLgorICAgICAqIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBuZXZlciB7QGNvZGUgbnVsbH0uCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoIlR5cGVNYXlCZVdlYWtlbmVkIikKKyAgICBwdWJsaWMgc3RhdGljIDxUPiBJdGVyYWJsZTxUPiBtZXJnZUFuZFNvcnRSYW5rZWRQcm92aWRlcnMoZmluYWwgUmFua2VkQ29tcGFyYXRvcjxUPiBjb21wYXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJdGVyYWJsZTxJdGVyYWJsZTxSYW5rZWRQcm92aWRlcjxUPj4+IHByb3ZpZGVySXRlcmFibGVzKSB7CisKKyAgICAgICAgcmV0dXJuIFN0cmVhbVN1cHBvcnQuc3RyZWFtKHByb3ZpZGVySXRlcmFibGVzLnNwbGl0ZXJhdG9yKCksIGZhbHNlKQorICAgICAgICAgICAgICAgIC5mbGF0TWFwKHJhbmtlZFByb3ZpZGVycyAtPiBTdHJlYW1TdXBwb3J0LnN0cmVhbShyYW5rZWRQcm92aWRlcnMuc3BsaXRlcmF0b3IoKSwgZmFsc2UpKQorICAgICAgICAgICAgICAgIC5zb3J0ZWQoY29tcGFyYXRvcikKKyAgICAgICAgICAgICAgICAubWFwKFJhbmtlZFByb3ZpZGVyOjpnZXRQcm92aWRlcikKKyAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHNvcnRlZCBpdGVyYWJsZSBvZiBhbGwge0BsaW5rIFJhbmtlZFByb3ZpZGVyIHByb3ZpZGVyc30gKGN1c3RvbSBhbmQgZGVmYXVsdCkgcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIHNlcnZpY2UKKyAgICAgKiBwcm92aWRlciBjb250cmFjdCBpbiB0aGUgdW5kZXJseWluZyB7QGxpbmsgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb24gbWFuYWdlcn0gY29udGFpbmVyLgorICAgICAqCisgICAgICogQHBhcmFtIDxUPiAgICAgICAgICAgICBzZXJ2aWNlIHByb3ZpZGVyIGNvbnRyYWN0IEphdmEgdHlwZS4KKyAgICAgKiBAcGFyYW0gaW5qZWN0aW9uTWFuYWdlciB1bmRlcmx5aW5nIGluamVjdGlvbiBtYW5hZ2VyLgorICAgICAqIEBwYXJhbSBjb250cmFjdCAgICAgICAgc2VydmljZSBwcm92aWRlciBjb250cmFjdC4KKyAgICAgKiBAcGFyYW0gY29tcGFyYXRvciAgICAgIGNvbXBhcmF0b3IgdG8gc29ydCB0aGUgcHJvdmlkZXJzIHdpdGguCisgICAgICogQHJldHVybiBzZXQgb2YgYWxsIGF2YWlsYWJsZSByYW5rZWQgc2VydmljZSBwcm92aWRlcnMgZm9yIHRoZSBjb250cmFjdC4gUmV0dXJuIHZhbHVlIGlzIG5ldmVyIG51bGwuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8VD4gSXRlcmFibGU8VD4gZ2V0QWxsUHJvdmlkZXJzKAorICAgICAgICAgICAgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyLCBDbGFzczxUPiBjb250cmFjdCwgUmFua2VkQ29tcGFyYXRvcjxUPiBjb21wYXJhdG9yKSB7CisgICAgICAgIC8vbm9pbnNwZWN0aW9uIHVuY2hlY2tlZAorICAgICAgICByZXR1cm4gc29ydFJhbmtlZFByb3ZpZGVycyhjb21wYXJhdG9yLCBnZXRBbGxSYW5rZWRQcm92aWRlcnMoaW5qZWN0aW9uTWFuYWdlciwgY29udHJhY3QpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgY29sbGVjdGlvbiBvZiBhbGwge0BsaW5rIFNlcnZpY2VIb2xkZXJ9cyBib3VuZCBmb3IgcHJvdmlkZXJzIChjdXN0b20gYW5kIGRlZmF1bHQpIHJlZ2lzdGVyZWQgZm9yIHRoZSBnaXZlbiBzZXJ2aWNlCisgICAgICogcHJvdmlkZXIgY29udHJhY3QgaW4gdGhlIHVuZGVybHlpbmcge0BsaW5rIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uIG1hbmFnZXJ9IGNvbnRhaW5lci4KKyAgICAgKgorICAgICAqIEBwYXJhbSA8VD4gICAgICAgICAgICAgc2VydmljZSBwcm92aWRlciBjb250cmFjdCBKYXZhIHR5cGUuCisgICAgICogQHBhcmFtIGluamVjdGlvbk1hbmFnZXIgdW5kZXJseWluZyBpbmplY3Rpb24gbWFuYWdlci4KKyAgICAgKiBAcGFyYW0gY29udHJhY3QgICAgICAgIHNlcnZpY2UgcHJvdmlkZXIgY29udHJhY3QuCisgICAgICogQHJldHVybiBzZXQgb2YgYWxsIGF2YWlsYWJsZSBzZXJ2aWNlIHByb3ZpZGVyIGluc3RhbmNlcyBmb3IgdGhlIGNvbnRyYWN0CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8VD4gQ29sbGVjdGlvbjxTZXJ2aWNlSG9sZGVyPFQ+PiBnZXRBbGxTZXJ2aWNlSG9sZGVycyhJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIsIENsYXNzPFQ+IGNvbnRyYWN0KSB7CisgICAgICAgIExpc3Q8U2VydmljZUhvbGRlcjxUPj4gcHJvdmlkZXJzID0gZ2V0U2VydmljZUhvbGRlcnMoaW5qZWN0aW9uTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cmFjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wYXJhdG9yLmNvbXBhcmluZ0ludChQcm92aWRlcnM6OmdldFByaW9yaXR5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21Bbm5vdGF0aW9uTGl0ZXJhbC5JTlNUQU5DRSk7CisgICAgICAgIHByb3ZpZGVycy5hZGRBbGwoZ2V0U2VydmljZUhvbGRlcnMoaW5qZWN0aW9uTWFuYWdlciwgY29udHJhY3QpKTsKKworICAgICAgICBMaW5rZWRIYXNoU2V0PFNlcnZpY2VIb2xkZXI8VD4+IHByb3ZpZGVyc1NldCA9IG5ldyBMaW5rZWRIYXNoU2V0PD4oKTsKKyAgICAgICAgZm9yIChTZXJ2aWNlSG9sZGVyPFQ+IHByb3ZpZGVyIDogcHJvdmlkZXJzKSB7CisgICAgICAgICAgICBpZiAoIXByb3ZpZGVyc1NldC5jb250YWlucyhwcm92aWRlcikpIHsKKyAgICAgICAgICAgICAgICBwcm92aWRlcnNTZXQuYWRkKHByb3ZpZGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBwcm92aWRlcnNTZXQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgPFQ+IExpc3Q8U2VydmljZUhvbGRlcjxUPj4gZ2V0U2VydmljZUhvbGRlcnMoCisgICAgICAgICAgICBJbmplY3Rpb25NYW5hZ2VyIGJtLCBDbGFzczxUPiBjb250cmFjdCwgQW5ub3RhdGlvbi4uLiBxdWFsaWZpZXJzKSB7CisgICAgICAgIHJldHVybiBibS5nZXRBbGxTZXJ2aWNlSG9sZGVycyhjb250cmFjdCwgcXVhbGlmaWVycyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgPFQ+IExpc3Q8U2VydmljZUhvbGRlcjxUPj4gZ2V0U2VydmljZUhvbGRlcnMoSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPFQ+IGNvbnRyYWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBhcmF0b3I8Q2xhc3M8Pz4+IG9iamVjdENvbXBhcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbi4uLiBxdWFsaWZpZXJzKSB7CisKKyAgICAgICAgTGlzdDxTZXJ2aWNlSG9sZGVyPFQ+PiBzZXJ2aWNlSG9sZGVycyA9IGluamVjdGlvbk1hbmFnZXIuZ2V0QWxsU2VydmljZUhvbGRlcnMoY29udHJhY3QsIHF1YWxpZmllcnMpOworICAgICAgICBzZXJ2aWNlSG9sZGVycy5zb3J0KChvMSwgbzIpIC0+IG9iamVjdENvbXBhcmF0b3IuY29tcGFyZShvMS5nZXRJbXBsZW1lbnRhdGlvbkNsYXNzKCksIG8yLmdldEltcGxlbWVudGF0aW9uQ2xhc3MoKSkpOworICAgICAgICByZXR1cm4gc2VydmljZUhvbGRlcnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgZ2l2ZW4gY29tcG9uZW50IGNsYXNzIGlzIGEgSkFYLVJTIHByb3ZpZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXp6IGNsYXNzIHRvIGNoZWNrLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBjbGFzcyBpcyBhIEpBWC1SUyBwcm92aWRlciwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSmF4UnNQcm92aWRlcihmaW5hbCBDbGFzczw/PiBjbGF6eikgeworICAgICAgICBmb3IgKGZpbmFsIENsYXNzPD8+IHByb3ZpZGVyVHlwZSA6IEpBWF9SU19QUk9WSURFUl9JTlRFUkZBQ0VfV0hJVEVMSVNULmtleVNldCgpKSB7CisgICAgICAgICAgICBpZiAocHJvdmlkZXJUeXBlLmlzQXNzaWduYWJsZUZyb20oY2xhenopKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgaXRlcmFibGUgb2YgYWxsIHByb3ZpZGVycyAoY3VzdG9tIGFuZCBkZWZhdWx0KSByZWdpc3RlcmVkIGZvciB0aGUgZ2l2ZW4gc2VydmljZSBwcm92aWRlciBjb250cmFjdAorICAgICAqIGluIHRoZSB1bmRlcmx5aW5nIHtAbGluayBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbiBtYW5hZ2VyfSBjb250YWluZXIgb3JkZXJlZCBiYXNlZCBvbiB0aGUgZ2l2ZW4ge0Bjb2RlIGNvbXBhcmF0b3J9LgorICAgICAqCisgICAgICogQHBhcmFtIDxUPiAgICAgICAgICAgICAgc2VydmljZSBwcm92aWRlciBjb250cmFjdCBKYXZhIHR5cGUuCisgICAgICogQHBhcmFtIGluamVjdGlvbk1hbmFnZXIgdW5kZXJseWluZyBpbmplY3Rpb24gbWFuYWdlci4KKyAgICAgKiBAcGFyYW0gY29udHJhY3QgICAgICAgICBzZXJ2aWNlIHByb3ZpZGVyIGNvbnRyYWN0LgorICAgICAqIEBwYXJhbSBjb21wYXJhdG9yICAgICAgIGNvbXBhcmF0b3IgdG8gYmUgdXNlZCBmb3Igc29ydGluZyB0aGUgcmV0dXJuZWQgcHJvdmlkZXJzLgorICAgICAqIEByZXR1cm4gc2V0IG9mIGFsbCBhdmFpbGFibGUgc2VydmljZSBwcm92aWRlciBpbnN0YW5jZXMgZm9yIHRoZSBjb250cmFjdCBvcmRlcmVkIHVzaW5nIHRoZSBnaXZlbgorICAgICAqIHtAbGluayBDb21wYXJhdG9yIGNvbXBhcmF0b3J9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IEl0ZXJhYmxlPFQ+IGdldEFsbFByb3ZpZGVycygKKyAgICAgICAgICAgIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciwgQ2xhc3M8VD4gY29udHJhY3QsIENvbXBhcmF0b3I8VD4gY29tcGFyYXRvcikgeworICAgICAgICBMaXN0PFQ+IHByb3ZpZGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8PihnZXRQcm92aWRlckNsYXNzZXMoZ2V0QWxsU2VydmljZUhvbGRlcnMoaW5qZWN0aW9uTWFuYWdlciwgY29udHJhY3QpKSk7CisgICAgICAgIGlmIChjb21wYXJhdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgIHByb3ZpZGVyTGlzdC5zb3J0KGNvbXBhcmF0b3IpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwcm92aWRlckxpc3Q7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgPFQ+IFNldDxUPiBnZXRQcm92aWRlckNsYXNzZXMoZmluYWwgQ29sbGVjdGlvbjxTZXJ2aWNlSG9sZGVyPFQ+PiBwcm92aWRlcnMpIHsKKyAgICAgICAgcmV0dXJuIHByb3ZpZGVycy5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChQcm92aWRlcnM6OmhvbGRlcjJzZXJ2aWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0NvbGxlY3Rpb24oTGlua2VkSGFzaFNldDo6bmV3KSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgPFQ+IFQgaG9sZGVyMnNlcnZpY2UoU2VydmljZUhvbGRlcjxUPiBob2xkZXIpIHsKKyAgICAgICAgcmV0dXJuIChob2xkZXIgIT0gbnVsbCkgPyBob2xkZXIuZ2V0SW5zdGFuY2UoKSA6IG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldFByaW9yaXR5KENsYXNzPD8+IHNlcnZpY2VDbGFzcykgeworICAgICAgICBQcmlvcml0eSBhbm5vdGF0aW9uID0gc2VydmljZUNsYXNzLmdldEFubm90YXRpb24oUHJpb3JpdHkuY2xhc3MpOworICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gYW5ub3RhdGlvbi52YWx1ZSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZGVmYXVsdCBwcmlvcml0eQorICAgICAgICByZXR1cm4gUHJpb3JpdGllcy5VU0VSOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgcHJvdmlkZXIgY29udHJhY3RzIHJlY29nbml6ZWQgYnkgSmVyc2V5IHRoYXQgYXJlIGltcGxlbWVudGVkIGJ5IHRoZSB7QGNvZGUgY2xhenp9LgorICAgICAqIFJlY29nbml6ZWQgcHJvdmlkZXIgY29udHJhY3RzIGluY2x1ZGUgYWxsIEpBWC1SUyBwcm92aWRlcnMgYXMgd2VsbCBhcyBhbGwgSmVyc2V5IFNQSQorICAgICAqIGNvbXBvbmVudHMgYW5ub3RhdGVkIHdpdGgge0BsaW5rIENvbnRyYWN0ICYjMDY0O0NvbnRyYWN0fSBhbm5vdGF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXp6IGNsYXNzIHRvIGV4dHJhY3QgdGhlIHByb3ZpZGVyIGludGVyZmFjZXMgZnJvbS4KKyAgICAgKiBAcmV0dXJuIHNldCBvZiBwcm92aWRlciBjb250cmFjdHMgaW1wbGVtZW50ZWQgYnkgdGhlIGdpdmVuIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU2V0PENsYXNzPD8+PiBnZXRQcm92aWRlckNvbnRyYWN0cyhmaW5hbCBDbGFzczw/PiBjbGF6eikgeworICAgICAgICBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IGNvbnRyYWN0cyA9IENvbGxlY3Rpb25zLm5ld1NldEZyb21NYXAobmV3IElkZW50aXR5SGFzaE1hcDw+KCkpOworICAgICAgICBjb21wdXRlUHJvdmlkZXJDb250cmFjdHMoY2xhenosIGNvbnRyYWN0cyk7CisgICAgICAgIHJldHVybiBjb250cmFjdHM7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjb21wdXRlUHJvdmlkZXJDb250cmFjdHMoZmluYWwgQ2xhc3M8Pz4gY2xhenosIGZpbmFsIFNldDxDbGFzczw/Pj4gY29udHJhY3RzKSB7CisgICAgICAgIGZvciAoZmluYWwgQ2xhc3M8Pz4gY29udHJhY3QgOiBnZXRJbXBsZW1lbnRlZENvbnRyYWN0cyhjbGF6eikpIHsKKyAgICAgICAgICAgIGlmIChpc1N1cHBvcnRlZENvbnRyYWN0KGNvbnRyYWN0KSkgeworICAgICAgICAgICAgICAgIGNvbnRyYWN0cy5hZGQoY29udHJhY3QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29tcHV0ZVByb3ZpZGVyQ29udHJhY3RzKGNvbnRyYWN0LCBjb250cmFjdHMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgdGhlIHtAY29kZSBjb21wb25lbnR9IHdoZXRoZXIgaXQgaXMgYXBwcm9wcmlhdGUgY29ycmVjdGx5IGNvbmZpZ3VyZWQgZm9yIGNsaWVudCBvciBzZXJ2ZXIKKyAgICAgKiB7QGxpbmsgUnVudGltZVR5cGUgcnVudGltZX0uCisgICAgICogPHA+CisgICAgICogSWYgYSBwcm9ibGVtIG9jY3VycyBhIHdhcm5pbmcgaXMgbG9nZ2VkIGFuZCBpZiB0aGUgY29tcG9uZW50IGlzIG5vdCB1c2FibGUgYXQgYWxsIGluIHRoZSBjdXJyZW50IHJ1bnRpbWUKKyAgICAgKiB7QGNvZGUgZmFsc2V9IGlzIHJldHVybmVkLiBGb3IgY2xhc3NlcyBmb3VuZCBkdXJpbmcgY29tcG9uZW50IHNjYW5uaW5nIChzY2FubmVkPXRydWUpIGNlcnRhaW4gd2FybmluZ3MgYXJlCisgICAgICogY29tcGxldGVseSBpZ25vcmVkIChlLmcuIGNvbXBvbmVudHMge0BsaW5rIENvbnN0cmFpbmVkVG8gY29uc3RyYWluZWQgdG99IHRoZSBjbGllbnQgcnVudGltZSBhbmQgZm91bmQgYnkKKyAgICAgKiBzZXJ2ZXItc2lkZSBjbGFzcyBwYXRoIHNjYW5uaW5nIHdpbGwgYmUgc2lsZW50bHkgaWdub3JlZCBhbmQgbm8gd2FybmluZyB3aWxsIGJlIGxvZ2dlZCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tcG9uZW50ICAgICAgICAgdGhlIGNsYXNzIG9mIHRoZSBjb21wb25lbnQgYmVpbmcgY2hlY2tlZC4KKyAgICAgKiBAcGFyYW0gbW9kZWwgICAgICAgICAgICAgbW9kZWwgb2YgdGhlIGNvbXBvbmVudC4KKyAgICAgKiBAcGFyYW0gcnVudGltZUNvbnN0cmFpbnQgY3VycmVudCBydW50aW1lIChjbGllbnQgb3Igc2VydmVyKS4KKyAgICAgKiBAcGFyYW0gc2Nhbm5lZCAgICAgICAgICAge0Bjb2RlIGZhbHNlfSBpZiB0aGUgY29tcG9uZW50IHR5cGUgaGFzIGJlZW4gcmVnaXN0ZXJlZCBleHBsaWNpdGx5OworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGNsYXNzIGhhcyBiZWVuIGRpc2NvdmVyZWQgZHVyaW5nIGFueSBmb3JtIG9mIGNvbXBvbmVudCBzY2FubmluZy4KKyAgICAgKiBAcGFyYW0gaXNSZXNvdXJjZSAgICAgICAge0Bjb2RlIHRydWV9IGlmIHRoZSBjb21wb25lbnQgaXMgYWxzbyBhIHJlc291cmNlIGNsYXNzLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGNvbXBvbmVudCBpcyBhY2NlcHRhYmxlIGZvciB1c2UgaW4gdGhlIGdpdmVuIHJ1bnRpbWUgdHlwZSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNoZWNrUHJvdmlkZXJSdW50aW1lKGZpbmFsIENsYXNzPD8+IGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29udHJhY3RQcm92aWRlciBtb2RlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUnVudGltZVR5cGUgcnVudGltZUNvbnN0cmFpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gc2Nhbm5lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1Jlc291cmNlKSB7CisgICAgICAgIGZpbmFsIFNldDxDbGFzczw/Pj4gY29udHJhY3RzID0gbW9kZWwuZ2V0Q29udHJhY3RzKCk7CisgICAgICAgIGZpbmFsIENvbnN0cmFpbmVkVG8gY29uc3RyYWluZWRUbyA9IGNvbXBvbmVudC5nZXRBbm5vdGF0aW9uKENvbnN0cmFpbmVkVG8uY2xhc3MpOworICAgICAgICBmaW5hbCBSdW50aW1lVHlwZSBjb21wb25lbnRDb25zdHJhaW50ID0gY29uc3RyYWluZWRUbyA9PSBudWxsID8gbnVsbCA6IGNvbnN0cmFpbmVkVG8udmFsdWUoKTsKKyAgICAgICAgaWYgKEZlYXR1cmUuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjb21wb25lbnQpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgd2FybmluZ3MgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBwcm92aWRlciBpbXBsZW1lbnRzIGF0IGxlYXN0IG9uZSBjb250cmFjdCBjb21wYXRpYmxlCisgICAgICAgICAgICAgKiB3aXRoIGl0J3MgaW1wbGVtZW50YXRpb24gY2xhc3MgY29uc3RyYWludC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgYm9vbGVhbiBmb3VuZENvbXBvbmVudENvbXBhdGlibGUgPSBjb21wb25lbnRDb25zdHJhaW50ID09IG51bGw7CisgICAgICAgICAgICBib29sZWFuIGZvdW5kUnVudGltZUNvbXBhdGlibGVDb250cmFjdCA9IGlzUmVzb3VyY2UgJiYgcnVudGltZUNvbnN0cmFpbnQgPT0gUnVudGltZVR5cGUuU0VSVkVSOworICAgICAgICAgICAgZm9yIChmaW5hbCBDbGFzczw/PiBjb250cmFjdCA6IGNvbnRyYWN0cykgeworICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBjb250cmFjdCBpcyBjb21tb24vbm90IGNvbnN0cmFpbmVkLCBkZWZhdWx0IHRvIHByb3ZpZGVyIGNvbnN0cmFpbnQKKyAgICAgICAgICAgICAgICBmaW5hbCBSdW50aW1lVHlwZSBjb250cmFjdENvbnN0cmFpbnQgPSBnZXRDb250cmFjdENvbnN0cmFpbnQoY29udHJhY3QsIGNvbXBvbmVudENvbnN0cmFpbnQpOworICAgICAgICAgICAgICAgIGZvdW5kUnVudGltZUNvbXBhdGlibGVDb250cmFjdCB8PSBjb250cmFjdENvbnN0cmFpbnQgPT0gbnVsbCB8fCBjb250cmFjdENvbnN0cmFpbnQgPT0gcnVudGltZUNvbnN0cmFpbnQ7CisKKyAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50Q29uc3RyYWludCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb250cmFjdENvbnN0cmFpbnQgIT0gY29tcG9uZW50Q29uc3RyYWludCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy9ub2luc3BlY3Rpb24gQ29uc3RhbnRDb25kaXRpb25zCisgICAgICAgICAgICAgICAgICAgICAgICB3YXJuaW5ncy5hcHBlbmQoTG9jYWxpemF0aW9uTWVzc2FnZXMuV0FSTklOR19QUk9WSURFUl9DT05TVFJBSU5FRF9UT19XUk9OR19QQUNLQUdFKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRDb25zdHJhaW50Lm5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJhY3QuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cmFjdENvbnN0cmFpbnQubmFtZSgpKSkgLy8gaXMgbmV2ZXIgbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIgIik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZENvbXBvbmVudENvbXBhdGlibGUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIWZvdW5kQ29tcG9uZW50Q29tcGF0aWJsZSkgeworICAgICAgICAgICAgICAgIC8vbm9pbnNwZWN0aW9uIENvbnN0YW50Q29uZGl0aW9ucworICAgICAgICAgICAgICAgIHdhcm5pbmdzLmFwcGVuZChMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9QUk9WSURFUl9DT05TVFJBSU5FRF9UT19XUk9OR19QQUNLQUdFKAorICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudENvbnN0cmFpbnQubmFtZSgpKSkgLy8gaXMgbmV2ZXIgbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiICIpOworICAgICAgICAgICAgICAgIGxvZ1Byb3ZpZGVyU2tpcHBlZCh3YXJuaW5ncywgY29tcG9uZW50LCBpc1Jlc291cmNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNQcm92aWRlclJ1bnRpbWVDb21wYXRpYmxlOworICAgICAgICAgICAgLy8gcnVudGltZUNvbnN0cmFpbnQgdnMuIHByb3ZpZGVyQ29uc3RyYWludAorICAgICAgICAgICAgaXNQcm92aWRlclJ1bnRpbWVDb21wYXRpYmxlID0gY29tcG9uZW50Q29uc3RyYWludCA9PSBudWxsIHx8IGNvbXBvbmVudENvbnN0cmFpbnQgPT0gcnVudGltZUNvbnN0cmFpbnQ7CisgICAgICAgICAgICBpZiAoIWlzUHJvdmlkZXJSdW50aW1lQ29tcGF0aWJsZSAmJiAhc2Nhbm5lZCkgeworICAgICAgICAgICAgICAgIC8vIGxvZyBmYWlsdXJlIGZvciBtYW51YWxseSByZWdpc3RlcmVkIHByb3ZpZGVycworICAgICAgICAgICAgICAgIHdhcm5pbmdzLmFwcGVuZChMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9QUk9WSURFUl9DT05TVFJBSU5FRF9UT19XUk9OR19SVU5USU1FKAorICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudENvbnN0cmFpbnQubmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUNvbnN0cmFpbnQubmFtZSgpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIiAiKTsKKworICAgICAgICAgICAgICAgIGxvZ1Byb3ZpZGVyU2tpcHBlZCh3YXJuaW5ncywgY29tcG9uZW50LCBpc1Jlc291cmNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gcnVudGltZUNvbnN0cmFpbnQgdnMgY29udHJhY3RDb25zdHJhaW50CisgICAgICAgICAgICBpZiAoIWZvdW5kUnVudGltZUNvbXBhdGlibGVDb250cmFjdCAmJiAhc2Nhbm5lZCkgeworICAgICAgICAgICAgICAgIHdhcm5pbmdzLmFwcGVuZChMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9QUk9WSURFUl9SRUdJU1RFUkVEX1dST05HX1JVTlRJTUUoCisgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUNvbnN0cmFpbnQubmFtZSgpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIiAiKTsKKyAgICAgICAgICAgICAgICBsb2dQcm92aWRlclNraXBwZWQod2FybmluZ3MsIGNvbXBvbmVudCwgaXNSZXNvdXJjZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gaXNQcm92aWRlclJ1bnRpbWVDb21wYXRpYmxlICYmIGZvdW5kUnVudGltZUNvbXBhdGlibGVDb250cmFjdDsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmICh3YXJuaW5ncy5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLldBUk5JTkcsIHdhcm5pbmdzLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2dQcm92aWRlclNraXBwZWQoZmluYWwgU3RyaW5nQnVpbGRlciBzYiwgZmluYWwgQ2xhc3M8Pz4gcHJvdmlkZXIsIGZpbmFsIGJvb2xlYW4gYWxzb1Jlc291cmNlQ2xhc3MpIHsKKyAgICAgICAgc2IuYXBwZW5kKGFsc29SZXNvdXJjZUNsYXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgID8gTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfUFJPVklERVJfQU5EX1JFU09VUkNFX0NPTlNUUkFJTkVEX1RPX0lHTk9SRUQocHJvdmlkZXIuZ2V0TmFtZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICA6IExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX1BST1ZJREVSX0NPTlNUUkFJTkVEX1RPX0lHTk9SRUQocHJvdmlkZXIuZ2V0TmFtZSgpKSkuYXBwZW5kKCIgIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIEphdmEgdHlwZSBpcyBhIEplcnNleS1zdXBwb3J0ZWQgY29udHJhY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSBjb250cmFjdCB0eXBlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGdpdmVuIHR5cGUgaXMgYSBKZXJzZXktc3VwcG9ydGVkIGNvbnRyYWN0LCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTdXBwb3J0ZWRDb250cmFjdChmaW5hbCBDbGFzczw/PiB0eXBlKSB7CisgICAgICAgIHJldHVybiAoRVhURVJOQUxfUFJPVklERVJfSU5URVJGQUNFX1dISVRFTElTVC5nZXQodHlwZSkgIT0gbnVsbCB8fCB0eXBlLmlzQW5ub3RhdGlvblByZXNlbnQoQ29udHJhY3QuY2xhc3MpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBSdW50aW1lVHlwZSBnZXRDb250cmFjdENvbnN0cmFpbnQoZmluYWwgQ2xhc3M8Pz4gY2xhenosIGZpbmFsIFJ1bnRpbWVUeXBlIGRlZmF1bHRDb25zdHJhaW50KSB7CisgICAgICAgIGZpbmFsIFByb3ZpZGVyUnVudGltZSBqYXhSc1Byb3ZpZGVyID0gRVhURVJOQUxfUFJPVklERVJfSU5URVJGQUNFX1dISVRFTElTVC5nZXQoY2xhenopOworCisgICAgICAgIFJ1bnRpbWVUeXBlIHJlc3VsdCA9IG51bGw7CisgICAgICAgIGlmIChqYXhSc1Byb3ZpZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGpheFJzUHJvdmlkZXIuZ2V0UnVudGltZSgpOworICAgICAgICB9IGVsc2UgaWYgKGNsYXp6LmdldEFubm90YXRpb24oQ29udHJhY3QuY2xhc3MpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIENvbnN0cmFpbmVkVG8gY29uc3RyYWluZWRUb0Fubm90YXRpb24gPSBjbGF6ei5nZXRBbm5vdGF0aW9uKENvbnN0cmFpbmVkVG8uY2xhc3MpOworICAgICAgICAgICAgaWYgKGNvbnN0cmFpbmVkVG9Bbm5vdGF0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBjb25zdHJhaW5lZFRvQW5ub3RhdGlvbi52YWx1ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChyZXN1bHQgPT0gbnVsbCkgPyBkZWZhdWx0Q29uc3RyYWludCA6IHJlc3VsdDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBJdGVyYWJsZTxDbGFzczw/Pj4gZ2V0SW1wbGVtZW50ZWRDb250cmFjdHMoZmluYWwgQ2xhc3M8Pz4gY2xhenopIHsKKyAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxDbGFzczw/Pj4gbGlzdCA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKworICAgICAgICBDb2xsZWN0aW9ucy5hZGRBbGwobGlzdCwgY2xhenouZ2V0SW50ZXJmYWNlcygpKTsKKworICAgICAgICBmaW5hbCBDbGFzczw/PiBzdXBlcmNsYXNzID0gY2xhenouZ2V0U3VwZXJjbGFzcygpOworICAgICAgICBpZiAoc3VwZXJjbGFzcyAhPSBudWxsKSB7CisgICAgICAgICAgICBsaXN0LmFkZChzdXBlcmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBsaXN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoZSBnaXZlbiBjb21wb25lbnQgY2xhc3MgaXMgYSBwcm92aWRlciAoaW1wbGVtZW50cyBzcGVjaWZpYyBpbnRlcmZhY2VzKS4KKyAgICAgKiBTZWUge0BsaW5rICNnZXRQcm92aWRlckNvbnRyYWN0c30uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhenogY2xhc3MgdG8gdGVzdC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgY2xhc3MgaXMgcHJvdmlkZXIsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Byb3ZpZGVyKGZpbmFsIENsYXNzPD8+IGNsYXp6KSB7CisgICAgICAgIHJldHVybiBmaW5kRmlyc3RQcm92aWRlckNvbnRyYWN0KGNsYXp6KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmUgdGhlIHN1cHBsaWVkIGltcGxlbWVudGF0aW9uIGNsYXNzZXMgaW1wbGVtZW50IHRoZSBleHBlY3RlZCBjb250cmFjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250cmFjdCAgICAgICAgY29udHJhY3QgdGhhdCBpcyBleHBlY3RlZCB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUgaW1wbGVtZW50YXRpb24gY2xhc3Nlcy4KKyAgICAgKiBAcGFyYW0gaW1wbGVtZW50YXRpb25zIGNvbnRyYWN0IGltcGxlbWVudGF0aW9ucy4KKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW4gY2FzZSBhbnkgb2YgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzZXMgZG9lcyBub3QKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50IHRoZSBleHBlY3RlZCBjb250cmFjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgZW5zdXJlQ29udHJhY3QoZmluYWwgQ2xhc3M8Pz4gY29udHJhY3QsIGZpbmFsIENsYXNzPD8+Li4uIGltcGxlbWVudGF0aW9ucykgeworICAgICAgICBpZiAoaW1wbGVtZW50YXRpb25zID09IG51bGwgfHwgaW1wbGVtZW50YXRpb25zLmxlbmd0aCA8PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGludmFsaWRDbGFzc05hbWVzID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgZm9yIChmaW5hbCBDbGFzczw/PiBpbXBsIDogaW1wbGVtZW50YXRpb25zKSB7CisgICAgICAgICAgICBpZiAoIWNvbnRyYWN0LmlzQXNzaWduYWJsZUZyb20oaW1wbCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoaW52YWxpZENsYXNzTmFtZXMubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGludmFsaWRDbGFzc05hbWVzLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW52YWxpZENsYXNzTmFtZXMuYXBwZW5kKGltcGwuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbnZhbGlkQ2xhc3NOYW1lcy5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuSU5WQUxJRF9TUElfQ0xBU1NFUygKKyAgICAgICAgICAgICAgICAgICAgY29udHJhY3QuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICBpbnZhbGlkQ2xhc3NOYW1lcy50b1N0cmluZygpKSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZmluZEZpcnN0UHJvdmlkZXJDb250cmFjdChmaW5hbCBDbGFzczw/PiBjbGF6eikgeworICAgICAgICBmb3IgKGZpbmFsIENsYXNzPD8+IGNvbnRyYWN0IDogZ2V0SW1wbGVtZW50ZWRDb250cmFjdHMoY2xhenopKSB7CisgICAgICAgICAgICBpZiAoaXNTdXBwb3J0ZWRDb250cmFjdChjb250cmFjdCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmaW5kRmlyc3RQcm92aWRlckNvbnRyYWN0KGNvbnRyYWN0KSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2luamVjdC9SZWZlcmVuY2luZ0ZhY3RvcnkuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvaW5qZWN0L1JlZmVyZW5jaW5nRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZWI3ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2luamVjdC9SZWZlcmVuY2luZ0ZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdDsKKworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKKworaW1wb3J0IGphdmF4LmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5SZWY7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLlJlZnM7CisKKy8qKgorICogRmFjdG9yeSB0aGF0IHByb3ZpZGVzIGluamVjdGlvbiBvZiB0aGUgcmVmZXJlbmNlZCBpbnN0YW5jZS4KKyAqCisgKiBAcGFyYW0gPFQ+CisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgUmVmZXJlbmNpbmdGYWN0b3J5PFQ+IGltcGxlbWVudHMgU3VwcGxpZXI8VD4geworCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRW1wdHlSZWZlcmVuY2VGYWN0b3J5PFQ+IGltcGxlbWVudHMgU3VwcGxpZXI8UmVmPFQ+PiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZWY8VD4gZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIFJlZnMuZW1wdHlSZWYoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEluaXRpYWxpemVkUmVmZXJlbmNlRmFjdG9yeTxUPiBpbXBsZW1lbnRzIFN1cHBsaWVyPFJlZjxUPj4geworCisgICAgICAgIHByaXZhdGUgZmluYWwgVCBpbml0aWFsVmFsdWU7CisKKyAgICAgICAgcHVibGljIEluaXRpYWxpemVkUmVmZXJlbmNlRmFjdG9yeShUIGluaXRpYWxWYWx1ZSkgeworICAgICAgICAgICAgdGhpcy5pbml0aWFsVmFsdWUgPSBpbml0aWFsVmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlZjxUPiBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVmcy5vZihpbml0aWFsVmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxSZWY8VD4+IHJlZmVyZW5jZUZhY3Rvcnk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IHJlZmVyZW5jaW5nIGluamVjdGlvbiBmYWN0b3J5LgorICAgICAqCisgICAgICogQHBhcmFtIHJlZmVyZW5jZUZhY3RvcnkgcmVmZXJlbmNlIHByb3ZpZGVyIGJhY2tpbmcgdGhlIGZhY3RvcnkuCisgICAgICovCisgICAgcHVibGljIFJlZmVyZW5jaW5nRmFjdG9yeShQcm92aWRlcjxSZWY8VD4+IHJlZmVyZW5jZUZhY3RvcnkpIHsKKyAgICAgICAgdGhpcy5yZWZlcmVuY2VGYWN0b3J5ID0gcmVmZXJlbmNlRmFjdG9yeTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVCBnZXQoKSB7CisgICAgICAgIHJldHVybiByZWZlcmVuY2VGYWN0b3J5LmdldCgpLmdldCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIHJlZmVyZW5jZSBmYWN0b3J5IHByb3ZpZGluZyBhbiBlbXB0eSByZWZlcmVuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gPFQ+IHJlZmVyZW5jZSB0eXBlLgorICAgICAqIEByZXR1cm4gcmVmZXJlbmNlIGZhY3RvcnkgcHJvdmlkaW5nIGFuIGVtcHR5IHJlZmVyZW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUPiBTdXBwbGllcjxSZWY8VD4+IHJlZmVyZW5jZUZhY3RvcnkoKSB7CisgICAgICAgIHJldHVybiBuZXcgRW1wdHlSZWZlcmVuY2VGYWN0b3J5PD4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSByZWZlcmVuY2UgZmFjdG9yeSBwcm92aWRpbmcgYW4gaW5pdGlhbGl6ZWQgcmVmZXJlbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIDxUPiAgICAgICAgICByZWZlcmVuY2UgdHlwZS4KKyAgICAgKiBAcGFyYW0gaW5pdGlhbFZhbHVlIGluaXRpYWwgdmFsdWUgc3RvcmVkIGluIHRoZSByZWZlcmVuY2UgcHJvdmlkZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSByZXR1cm5lZCBmYWN0b3J5LgorICAgICAqIEByZXR1cm4gcmVmZXJlbmNlIGZhY3RvcnkgcHJvdmlkaW5nIGEgcmVmZXJlbmNlIGluaXRpYWxpemVkIHdpdGggYW4KKyAgICAgKiAgICAgICAgIHtAY29kZSBpbml0aWFsVmFsdWV9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFN1cHBsaWVyPFJlZjxUPj4gcmVmZXJlbmNlRmFjdG9yeShUIGluaXRpYWxWYWx1ZSkgeworICAgICAgICBpZiAoaW5pdGlhbFZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRW1wdHlSZWZlcmVuY2VGYWN0b3J5PD4oKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgSW5pdGlhbGl6ZWRSZWZlcmVuY2VGYWN0b3J5PD4oaW5pdGlhbFZhbHVlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2luamVjdC9TZXJ2aWNlSG9sZGVyLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2luamVjdC9TZXJ2aWNlSG9sZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRiNGFkYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvaW5qZWN0L1NlcnZpY2VIb2xkZXIuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGNsYXNzIGlzIHVzZWQgYXMgYSBob2xkZXIgZm9yIHNlcnZpY2UgaW5zdGFuY2UgZnJvbQorICoge0BsaW5rIEluamVjdGlvbk1hbmFnZXJ9IGFsb25nIHdpdGggb3RoZXIgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb3ZpZGVkIHNlcnZpY2UuCisgKgorICogQHNlZSBTZXJ2aWNlSG9sZGVySW1wbAorICogQHBhcmFtIDxUPgorICovCitwdWJsaWMgaW50ZXJmYWNlIFNlcnZpY2VIb2xkZXI8VD4geworCisgICAgLyoqCisgICAgICogQW4gaW5zdGFuY2Ugb2YgdGhlIHNlcnZpY2UgZ290IGZyb20ge0BsaW5rIEluamVjdGlvbk1hbmFnZXJ9LgorICAgICAqCisgICAgICogQHJldHVybiBzZXJ2aWNlIGluc3RhbmNlLgorICAgICAqLworICAgIFQgZ2V0SW5zdGFuY2UoKTsKKworICAgIC8qKgorICAgICAqIEdldHMgYW4gaW1wbGVtZW50YXRpb24gY2xhc3Mgb2YgdGhlIGluc3RhbmNlIHdoaWNoIGlzIGtlcHQgaW4gdGhpcyBzZXJ2aWNlIGhvbGRlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gaW1wbGVtZW50YXRpb24gY2xhc3Mgb2YgdGhlIGtlcHQgaW5zdGFuY2UuCisgICAgICovCisgICAgQ2xhc3M8VD4gZ2V0SW1wbGVtZW50YXRpb25DbGFzcygpOworCisgICAgLyoqCisgICAgICogR2V0cyBhbGwgY29udHJhY3RzIHdoaWNoIHJlcHJlc2VudHMgdGhlIGtlcHQgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFsbCBjb250cmFjdHMuCisgICAgICovCisgICAgU2V0PFR5cGU+IGdldENvbnRyYWN0VHlwZXMoKTsKKworICAgIC8qKgorICAgICAqIEdldHMgcmFua2luZyBvZiB0aGUga2VwdCBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gaW5zdGFuY2UncyByYW5raW5nLgorICAgICAqLworICAgIGludCBnZXRSYW5rKCk7CisKK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvaW5qZWN0L1NlcnZpY2VIb2xkZXJJbXBsLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2luamVjdC9TZXJ2aWNlSG9sZGVySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxY2RlNDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2luamVjdC9TZXJ2aWNlSG9sZGVySW1wbC5qYXZhCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgaW5zdGFuY2Uga2VlcGVyIHdoaWNoIGtlcHQgdGhlIGluc3RhbmNlIG9mIHRoZSBjbGFzcyBmcm9tCisgKiB7QGxpbmsgSW5qZWN0aW9uTWFuYWdlcn0gYW5kIHRoZSBvdGhlciBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGluc3RhbmNlLgorICoKKyAqIEBwYXJhbSA8VD4gdHlwZSBvZiB0aGUga2VwdCBpbnN0YW5jZS4KKyAqLworcHVibGljIGNsYXNzIFNlcnZpY2VIb2xkZXJJbXBsPFQ+IGltcGxlbWVudHMgU2VydmljZUhvbGRlcjxUPiB7CisKKyAgICBwcml2YXRlIGZpbmFsIFQgc2VydmljZTsKKworICAgIHByaXZhdGUgZmluYWwgQ2xhc3M8VD4gaW1wbGVtZW50YXRpb25DbGFzczsKKworICAgIHByaXZhdGUgZmluYWwgU2V0PFR5cGU+IGNvbnRyYWN0VHlwZXM7CisKKyAgICBwcml2YXRlIGZpbmFsIGludCByYW5rOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc2VydmljZSBob2xkZXIgd2hpY2gga2VlcHMgdGhlIGNvbmNyZXRlIGluc3RhbmNlIGFuZCBpdHMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2aWNlICAgICAgICAgICAgIHNlcnZpY2UgaW5zdGFuY2Uga2VwdCBieSB0aGlzIGhvbGRlci4KKyAgICAgKiBAcGFyYW0gY29udHJhY3RUeXBlcyAgICAgICB0eXBlcyB3aGljaCByZXByZXNlbnQgdGhlIGdpdmVuIGluc3RhbmNlLgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBTZXJ2aWNlSG9sZGVySW1wbChUIHNlcnZpY2UsIFNldDxUeXBlPiBjb250cmFjdFR5cGVzKSB7CisgICAgICAgIHRoaXMoc2VydmljZSwgKENsYXNzPFQ+KSBzZXJ2aWNlLmdldENsYXNzKCksIGNvbnRyYWN0VHlwZXMsIDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHNlcnZpY2UgaG9sZGVyIHdoaWNoIGtlZXBzIHRoZSBjb25jcmV0ZSBpbnN0YW5jZSBhbmQgaXRzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VydmljZSAgICAgICAgICAgICBzZXJ2aWNlIGluc3RhbmNlIGtlcHQgYnkgdGhpcyBob2xkZXIuCisgICAgICogQHBhcmFtIGltcGxlbWVudGF0aW9uQ2xhc3MgaW1wbGVtZW50YXRpb24gY2xhc3Mgb2YgdGhlIGdpdmVuIGluc3RhbmNlLgorICAgICAqIEBwYXJhbSBjb250cmFjdFR5cGVzICAgICAgIHR5cGVzIHdoaWNoIHJlcHJlc2VudCB0aGUgZ2l2ZW4gaW5zdGFuY2UuCisgICAgICogQHBhcmFtIHJhbmsgICAgICAgICAgICAgICAgcmFua2luZyBvZiB0aGUgZ2l2ZW4gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIFNlcnZpY2VIb2xkZXJJbXBsKFQgc2VydmljZSwgQ2xhc3M8VD4gaW1wbGVtZW50YXRpb25DbGFzcywgU2V0PFR5cGU+IGNvbnRyYWN0VHlwZXMsIGludCByYW5rKSB7CisgICAgICAgIHRoaXMuc2VydmljZSA9IHNlcnZpY2U7CisgICAgICAgIHRoaXMuaW1wbGVtZW50YXRpb25DbGFzcyA9IGltcGxlbWVudGF0aW9uQ2xhc3M7CisgICAgICAgIHRoaXMuY29udHJhY3RUeXBlcyA9IGNvbnRyYWN0VHlwZXM7CisgICAgICAgIHRoaXMucmFuayA9IHJhbms7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFQgZ2V0SW5zdGFuY2UoKSB7CisgICAgICAgIHJldHVybiBzZXJ2aWNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDbGFzczxUPiBnZXRJbXBsZW1lbnRhdGlvbkNsYXNzKCkgeworICAgICAgICByZXR1cm4gaW1wbGVtZW50YXRpb25DbGFzczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PFR5cGU+IGdldENvbnRyYWN0VHlwZXMoKSB7CisgICAgICAgIHJldHVybiBjb250cmFjdFR5cGVzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0UmFuaygpIHsKKyAgICAgICAgcmV0dXJuIHJhbms7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmICh0aGlzID09IG8pIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBTZXJ2aWNlSG9sZGVySW1wbCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBTZXJ2aWNlSG9sZGVySW1wbDw/PiB0aGF0ID0gKFNlcnZpY2VIb2xkZXJJbXBsPD8+KSBvOworICAgICAgICByZXR1cm4gcmFuayA9PSB0aGF0LnJhbmsKKyAgICAgICAgICAgICAgICAmJiBPYmplY3RzLmVxdWFscyhzZXJ2aWNlLCB0aGF0LnNlcnZpY2UpCisgICAgICAgICAgICAgICAgJiYgT2JqZWN0cy5lcXVhbHMoaW1wbGVtZW50YXRpb25DbGFzcywgdGhhdC5pbXBsZW1lbnRhdGlvbkNsYXNzKQorICAgICAgICAgICAgICAgICYmIE9iamVjdHMuZXF1YWxzKGNvbnRyYWN0VHlwZXMsIHRoYXQuY29udHJhY3RUeXBlcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIE9iamVjdHMuaGFzaChzZXJ2aWNlLCBpbXBsZW1lbnRhdGlvbkNsYXNzLCBjb250cmFjdFR5cGVzLCByYW5rKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2luamVjdC9TdXBwbGllckNsYXNzQmluZGluZy5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9pbmplY3QvU3VwcGxpZXJDbGFzc0JpbmRpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDdiNGZmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9pbmplY3QvU3VwcGxpZXJDbGFzc0JpbmRpbmcuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdDsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOworCisvKioKKyAqIEluamVjdGlvbiBiaW5kaW5nIGRlc2NyaXB0aW9uIG9mIGEgYmVhbiBib3VuZCBpbmRpcmVjdGx5IHZpYSBhIHN1cHBsaWVyIGNsYXNzIHByb2R1Y2luZyBpbnN0YW5jZXMgb2YgdGhlIGJvdW5kIHR5cGUuCisgKgorICogQHBhcmFtIDxUPiB0eXBlIG9mIHRoZSBiZWFuIGRlc2NyaWJlZCBieSB0aGlzIGluamVjdGlvbiBiaW5kaW5nIGRlc2NyaXB0b3IuCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworcHVibGljIGNsYXNzIFN1cHBsaWVyQ2xhc3NCaW5kaW5nPFQ+IGV4dGVuZHMgQmluZGluZzxTdXBwbGllcjxUPiwgU3VwcGxpZXJDbGFzc0JpbmRpbmc8VD4+IHsKKworICAgIHByaXZhdGUgZmluYWwgQ2xhc3M8PyBleHRlbmRzIFN1cHBsaWVyPFQ+PiBzdXBwbGllckNsYXNzOworICAgIHByaXZhdGUgZmluYWwgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IHN1cHBsaWVyU2NvcGU7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgc2VydmljZSBhcyBhIGNsYXNzLgorICAgICAqCisgICAgICogQHBhcmFtIHN1cHBsaWVyQ2xhc3MgZmFjdG9yeSdzIGNsYXNzLgorICAgICAqIEBwYXJhbSBzY29wZSAgICAgICAgZmFjdG9yeSdzIHNjb3BlLgorICAgICAqLworICAgIFN1cHBsaWVyQ2xhc3NCaW5kaW5nKENsYXNzPD8gZXh0ZW5kcyBTdXBwbGllcjxUPj4gc3VwcGxpZXJDbGFzcywgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IHNjb3BlKSB7CisgICAgICAgIHRoaXMuc3VwcGxpZXJDbGFzcyA9IHN1cHBsaWVyQ2xhc3M7CisgICAgICAgIHRoaXMuc3VwcGxpZXJTY29wZSA9IHNjb3BlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgc3VwcGxpZXIncyBjbGFzcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gc3VwcGxpZXIncyBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIFN1cHBsaWVyPFQ+PiBnZXRTdXBwbGllckNsYXNzKCkgeworICAgICAgICByZXR1cm4gc3VwcGxpZXJDbGFzczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHN1cHBsaWVyJ3Mgc2NvcGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHN1cHBsaWVyJ3Mgc2NvcGUuCisgICAgICovCisgICAgcHVibGljIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBnZXRTdXBwbGllclNjb3BlKCkgeworICAgICAgICByZXR1cm4gc3VwcGxpZXJTY29wZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2luamVjdC9TdXBwbGllckluc3RhbmNlQmluZGluZy5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9pbmplY3QvU3VwcGxpZXJJbnN0YW5jZUJpbmRpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2Y2NjQzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9pbmplY3QvU3VwcGxpZXJJbnN0YW5jZUJpbmRpbmcuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdDsKKworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKKworLyoqCisgKiBJbmplY3Rpb24gYmluZGluZyBkZXNjcmlwdGlvbiBvZiBhIGJlYW4gYm91bmQgaW5kaXJlY3RseSB2aWEgYW4gc3VwcGxpZXIgcHJvZHVjaW5nIGluc3RhbmNlcyBvZiB0aGUgYm91bmQgdHlwZS4KKyAqCisgKiBAcGFyYW0gPFQ+IHR5cGUgb2YgdGhlIGJlYW4gZGVzY3JpYmVkIGJ5IHRoaXMgaW5qZWN0aW9uIGJpbmRpbmcgZGVzY3JpcHRvci4KKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitwdWJsaWMgY2xhc3MgU3VwcGxpZXJJbnN0YW5jZUJpbmRpbmc8VD4gZXh0ZW5kcyBCaW5kaW5nPFN1cHBsaWVyPFQ+LCBTdXBwbGllckluc3RhbmNlQmluZGluZzxUPj4geworCisgICAgcHJpdmF0ZSBmaW5hbCBTdXBwbGllcjxUPiBzdXBwbGllcjsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBzdXBwbGllciBhcyBhbiBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdXBwbGllciBzZXJ2aWNlJ3MgaW5zdGFuY2UuCisgICAgICovCisgICAgU3VwcGxpZXJJbnN0YW5jZUJpbmRpbmcoU3VwcGxpZXI8VD4gc3VwcGxpZXIpIHsKKyAgICAgICAgdGhpcy5zdXBwbGllciA9IHN1cHBsaWVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgc3VwcGxpZXIncyBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gc3VwcGxpZXIncyBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3VwcGxpZXI8VD4gZ2V0U3VwcGxpZXIoKSB7CisgICAgICAgIHJldHVybiBzdXBwbGllcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2luamVjdC9wYWNrYWdlLWluZm8uamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvaW5qZWN0L3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlY2I2NTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2luamVjdC9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvKioKKyAqIENvbW1vbiBKZXJzZXkgaW50ZXJuYWwgaW5qZWN0aW9uIHV0aWxpdHkgY2xhc3Nlcy4KKyAqLworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3Q7CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2pzcjE2Ni9GbG93LmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2pzcjE2Ni9GbG93LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU2NGQ4OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvanNyMTY2L0Zsb3cuamF2YQpAQCAtMCwwICsxLDI5MCBAQAorLyoKKyAqIFdyaXR0ZW4gYnkgRG91ZyBMZWEgd2l0aCBhc3Npc3RhbmNlIGZyb20gbWVtYmVycyBvZiBKQ1AgSlNSLTE2NgorICogRXhwZXJ0IEdyb3VwIGFuZCByZWxlYXNlZCB0byB0aGUgcHVibGljIGRvbWFpbiwgYXMgZXhwbGFpbmVkIGF0CisgKiBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9wdWJsaWNkb21haW4vemVyby8xLjAvCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5qc3IxNjY7CisKKy8qKgorICogSW50ZXJyZWxhdGVkIGludGVyZmFjZXMgYW5kIHN0YXRpYyBtZXRob2RzIGZvciBlc3RhYmxpc2hpbmcKKyAqIGZsb3ctY29udHJvbGxlZCBjb21wb25lbnRzIGluIHdoaWNoIHtAbGluayBQdWJsaXNoZXIgUHVibGlzaGVyc30KKyAqIHByb2R1Y2UgaXRlbXMgY29uc3VtZWQgYnkgb25lIG9yIG1vcmUge0BsaW5rIFN1YnNjcmliZXIKKyAqIFN1YnNjcmliZXJzfSwgZWFjaCBtYW5hZ2VkIGJ5IGEge0BsaW5rIFN1YnNjcmlwdGlvbgorICogU3Vic2NyaXB0aW9ufS4KKyAqCisgKiA8cD5UaGVzZSBpbnRlcmZhY2VzIGNvcnJlc3BvbmQgdG8gdGhlIDxhCisgKiBocmVmPSJodHRwOi8vd3d3LnJlYWN0aXZlLXN0cmVhbXMub3JnLyI+IHJlYWN0aXZlLXN0cmVhbXM8L2E+CisgKiBzcGVjaWZpY2F0aW9uLiAgVGhleSBhcHBseSBpbiBib3RoIGNvbmN1cnJlbnQgYW5kIGRpc3RyaWJ1dGVkCisgKiBhc3luY2hyb25vdXMgc2V0dGluZ3M6IEFsbCAoc2V2ZW4pIG1ldGhvZHMgYXJlIGRlZmluZWQgaW4ge0Bjb2RlCisgKiB2b2lkfSAib25lLXdheSIgbWVzc2FnZSBzdHlsZS4gQ29tbXVuaWNhdGlvbiByZWxpZXMgb24gYSBzaW1wbGUgZm9ybQorICogb2YgZmxvdyBjb250cm9sIChtZXRob2Qge0BsaW5rIFN1YnNjcmlwdGlvbiNyZXF1ZXN0fSkgdGhhdCBjYW4gYmUKKyAqIHVzZWQgdG8gYXZvaWQgcmVzb3VyY2UgbWFuYWdlbWVudCBwcm9ibGVtcyB0aGF0IG1heSBvdGhlcndpc2Ugb2NjdXIKKyAqIGluICJwdXNoIiBiYXNlZCBzeXN0ZW1zLgorICoKKyAqIDxwPjxiPkV4YW1wbGVzLjwvYj4gQSB7QGxpbmsgUHVibGlzaGVyfSB1c3VhbGx5IGRlZmluZXMgaXRzIG93bgorICoge0BsaW5rIFN1YnNjcmlwdGlvbn0gaW1wbGVtZW50YXRpb247IGNvbnN0cnVjdGluZyBvbmUgaW4gbWV0aG9kCisgKiB7QGNvZGUgc3Vic2NyaWJlfSBhbmQgaXNzdWluZyBpdCB0byB0aGUgY2FsbGluZyB7QGxpbmsKKyAqIFN1YnNjcmliZXJ9LiBJdCBwdWJsaXNoZXMgaXRlbXMgdG8gdGhlIHN1YnNjcmliZXIgYXN5bmNocm9ub3VzbHksCisgKiBub3JtYWxseSB1c2luZyBhbiB7QGxpbmsgRXhlY3V0b3J9LiAgRm9yIGV4YW1wbGUsIGhlcmUgaXMgYSB2ZXJ5CisgKiBzaW1wbGUgcHVibGlzaGVyIHRoYXQgb25seSBpc3N1ZXMgKHdoZW4gcmVxdWVzdGVkKSBhIHNpbmdsZSB7QGNvZGUKKyAqIFRSVUV9IGl0ZW0gdG8gYSBzaW5nbGUgc3Vic2NyaWJlci4gIEJlY2F1c2UgdGhlIHN1YnNjcmliZXIgcmVjZWl2ZXMKKyAqIG9ubHkgYSBzaW5nbGUgaXRlbSwgdGhpcyBjbGFzcyBkb2VzIG5vdCB1c2UgYnVmZmVyaW5nIGFuZCBvcmRlcmluZworICogY29udHJvbCByZXF1aXJlZCBpbiBtb3N0IGltcGxlbWVudGF0aW9ucyAoZm9yIGV4YW1wbGUge0BsaW5rCisgKiBTdWJtaXNzaW9uUHVibGlzaGVyfSkuCisgKgorICogPHByZT4ge0Bjb2RlCisgKiBjbGFzcyBPbmVTaG90UHVibGlzaGVyIGltcGxlbWVudHMgUHVibGlzaGVyPEJvb2xlYW4+IHsKKyAqICAgcHJpdmF0ZSBmaW5hbCBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3IgPSBGb3JrSm9pblBvb2wuY29tbW9uUG9vbCgpOyAvLyBkYWVtb24tYmFzZWQKKyAqICAgcHJpdmF0ZSBib29sZWFuIHN1YnNjcmliZWQ7IC8vIHRydWUgYWZ0ZXIgZmlyc3Qgc3Vic2NyaWJlCisgKiAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdWJzY3JpYmUoU3Vic2NyaWJlcjw/IHN1cGVyIEJvb2xlYW4+IHN1YnNjcmliZXIpIHsKKyAqICAgICBpZiAoc3Vic2NyaWJlZCkKKyAqICAgICAgICBzdWJzY3JpYmVyLm9uRXJyb3IobmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsgLy8gb25seSBvbmUgYWxsb3dlZAorICogICAgIGVsc2UgeworICogICAgICAgc3Vic2NyaWJlZCA9IHRydWU7CisgKiAgICAgICBzdWJzY3JpYmVyLm9uU3Vic2NyaWJlKG5ldyBPbmVTaG90U3Vic2NyaXB0aW9uKHN1YnNjcmliZXIsIGV4ZWN1dG9yKSk7CisgKiAgICAgfQorICogICB9CisgKiAgIHN0YXRpYyBjbGFzcyBPbmVTaG90U3Vic2NyaXB0aW9uIGltcGxlbWVudHMgU3Vic2NyaXB0aW9uIHsKKyAqICAgICBwcml2YXRlIGZpbmFsIFN1YnNjcmliZXI8PyBzdXBlciBCb29sZWFuPiBzdWJzY3JpYmVyOworICogICAgIHByaXZhdGUgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yOworICogICAgIHByaXZhdGUgRnV0dXJlPD8+IGZ1dHVyZTsgLy8gdG8gYWxsb3cgY2FuY2VsbGF0aW9uCisgKiAgICAgcHJpdmF0ZSBib29sZWFuIGNvbXBsZXRlZDsKKyAqICAgICBPbmVTaG90U3Vic2NyaXB0aW9uKFN1YnNjcmliZXI8PyBzdXBlciBCb29sZWFuPiBzdWJzY3JpYmVyLAorICogICAgICAgICAgICAgICAgICAgICAgICAgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yKSB7CisgKiAgICAgICB0aGlzLnN1YnNjcmliZXIgPSBzdWJzY3JpYmVyOworICogICAgICAgdGhpcy5leGVjdXRvciA9IGV4ZWN1dG9yOworICogICAgIH0KKyAqICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVxdWVzdChsb25nIG4pIHsKKyAqICAgICAgIGlmIChuICE9IDAgJiYgIWNvbXBsZXRlZCkgeworICogICAgICAgICBjb21wbGV0ZWQgPSB0cnVlOworICogICAgICAgICBpZiAobiA8IDApIHsKKyAqICAgICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXggPSBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgKiAgICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiBzdWJzY3JpYmVyLm9uRXJyb3IoZXgpKTsKKyAqICAgICAgICAgfSBlbHNlIHsKKyAqICAgICAgICAgICBmdXR1cmUgPSBleGVjdXRvci5zdWJtaXQoKCkgLT4geworICogICAgICAgICAgICAgc3Vic2NyaWJlci5vbk5leHQoQm9vbGVhbi5UUlVFKTsKKyAqICAgICAgICAgICAgIHN1YnNjcmliZXIub25Db21wbGV0ZSgpOworICogICAgICAgICAgIH0pOworICogICAgICAgICB9CisgKiAgICAgICB9CisgKiAgICAgfQorICogICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjYW5jZWwoKSB7CisgKiAgICAgICBjb21wbGV0ZWQgPSB0cnVlOworICogICAgICAgaWYgKGZ1dHVyZSAhPSBudWxsKSBmdXR1cmUuY2FuY2VsKGZhbHNlKTsKKyAqICAgICB9CisgKiAgIH0KKyAqIH19PC9wcmU+CisgKgorICogPHA+QSB7QGxpbmsgU3Vic2NyaWJlcn0gYXJyYW5nZXMgdGhhdCBpdGVtcyBiZSByZXF1ZXN0ZWQgYW5kCisgKiBwcm9jZXNzZWQuICBJdGVtcyAoaW52b2NhdGlvbnMgb2Yge0BsaW5rIFN1YnNjcmliZXIjb25OZXh0fSkgYXJlCisgKiBub3QgaXNzdWVkIHVubGVzcyByZXF1ZXN0ZWQsIGJ1dCBtdWx0aXBsZSBpdGVtcyBtYXkgYmUgcmVxdWVzdGVkLgorICogTWFueSBTdWJzY3JpYmVyIGltcGxlbWVudGF0aW9ucyBjYW4gYXJyYW5nZSB0aGlzIGluIHRoZSBzdHlsZSBvZgorICogdGhlIGZvbGxvd2luZyBleGFtcGxlLCB3aGVyZSBhIGJ1ZmZlciBzaXplIG9mIDEgc2luZ2xlLXN0ZXBzLCBhbmQKKyAqIGxhcmdlciBzaXplcyB1c3VhbGx5IGFsbG93IGZvciBtb3JlIGVmZmljaWVudCBvdmVybGFwcGVkIHByb2Nlc3NpbmcKKyAqIHdpdGggbGVzcyBjb21tdW5pY2F0aW9uOyBmb3IgZXhhbXBsZSB3aXRoIGEgdmFsdWUgb2YgNjQsIHRoaXMga2VlcHMKKyAqIHRvdGFsIG91dHN0YW5kaW5nIHJlcXVlc3RzIGJldHdlZW4gMzIgYW5kIDY0LgorICogQmVjYXVzZSBTdWJzY3JpYmVyIG1ldGhvZCBpbnZvY2F0aW9ucyBmb3IgYSBnaXZlbiB7QGxpbmsKKyAqIFN1YnNjcmlwdGlvbn0gYXJlIHN0cmljdGx5IG9yZGVyZWQsIHRoZXJlIGlzIG5vIG5lZWQgZm9yIHRoZXNlCisgKiBtZXRob2RzIHRvIHVzZSBsb2NrcyBvciB2b2xhdGlsZXMgdW5sZXNzIGEgU3Vic2NyaWJlciBtYWludGFpbnMKKyAqIG11bHRpcGxlIFN1YnNjcmlwdGlvbnMgKGluIHdoaWNoIGNhc2UgaXQgaXMgYmV0dGVyIHRvIGluc3RlYWQKKyAqIGRlZmluZSBtdWx0aXBsZSBTdWJzY3JpYmVycywgZWFjaCB3aXRoIGl0cyBvd24gU3Vic2NyaXB0aW9uKS4KKyAqCisgKiA8cHJlPiB7QGNvZGUKKyAqIGNsYXNzIFNhbXBsZVN1YnNjcmliZXI8VD4gaW1wbGVtZW50cyBTdWJzY3JpYmVyPFQ+IHsKKyAqICAgZmluYWwgQ29uc3VtZXI8PyBzdXBlciBUPiBjb25zdW1lcjsKKyAqICAgU3Vic2NyaXB0aW9uIHN1YnNjcmlwdGlvbjsKKyAqICAgZmluYWwgbG9uZyBidWZmZXJTaXplOworICogICBsb25nIGNvdW50OworICogICBTYW1wbGVTdWJzY3JpYmVyKGxvbmcgYnVmZmVyU2l6ZSwgQ29uc3VtZXI8PyBzdXBlciBUPiBjb25zdW1lcikgeworICogICAgIHRoaXMuYnVmZmVyU2l6ZSA9IGJ1ZmZlclNpemU7CisgKiAgICAgdGhpcy5jb25zdW1lciA9IGNvbnN1bWVyOworICogICB9CisgKiAgIHB1YmxpYyB2b2lkIG9uU3Vic2NyaWJlKFN1YnNjcmlwdGlvbiBzdWJzY3JpcHRpb24pIHsKKyAqICAgICBsb25nIGluaXRpYWxSZXF1ZXN0U2l6ZSA9IGJ1ZmZlclNpemU7CisgKiAgICAgY291bnQgPSBidWZmZXJTaXplIC0gYnVmZmVyU2l6ZSAvIDI7IC8vIHJlLXJlcXVlc3Qgd2hlbiBoYWxmIGNvbnN1bWVkCisgKiAgICAgKHRoaXMuc3Vic2NyaXB0aW9uID0gc3Vic2NyaXB0aW9uKS5yZXF1ZXN0KGluaXRpYWxSZXF1ZXN0U2l6ZSk7CisgKiAgIH0KKyAqICAgcHVibGljIHZvaWQgb25OZXh0KFQgaXRlbSkgeworICogICAgIGlmICgtLWNvdW50IDw9IDApCisgKiAgICAgICBzdWJzY3JpcHRpb24ucmVxdWVzdChjb3VudCA9IGJ1ZmZlclNpemUgLSBidWZmZXJTaXplIC8gMik7CisgKiAgICAgY29uc3VtZXIuYWNjZXB0KGl0ZW0pOworICogICB9CisgKiAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoVGhyb3dhYmxlIGV4KSB7IGV4LnByaW50U3RhY2tUcmFjZSgpOyB9CisgKiAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUoKSB7fQorICogfX08L3ByZT4KKyAqCisgKiA8cD5UaGUgZGVmYXVsdCB2YWx1ZSBvZiB7QGxpbmsgI2RlZmF1bHRCdWZmZXJTaXplfSBtYXkgcHJvdmlkZSBhCisgKiB1c2VmdWwgc3RhcnRpbmcgcG9pbnQgZm9yIGNob29zaW5nIHJlcXVlc3Qgc2l6ZXMgYW5kIGNhcGFjaXRpZXMgaW4KKyAqIEZsb3cgY29tcG9uZW50cyBiYXNlZCBvbiBleHBlY3RlZCByYXRlcywgcmVzb3VyY2VzLCBhbmQgdXNhZ2VzLgorICogT3IsIHdoZW4gZmxvdyBjb250cm9sIGlzIG5ldmVyIG5lZWRlZCwgYSBzdWJzY3JpYmVyIG1heSBpbml0aWFsbHkKKyAqIHJlcXVlc3QgYW4gZWZmZWN0aXZlbHkgdW5ib3VuZGVkIG51bWJlciBvZiBpdGVtcywgYXMgaW46CisgKgorICogPHByZT4ge0Bjb2RlCisgKiBjbGFzcyBVbmJvdW5kZWRTdWJzY3JpYmVyPFQ+IGltcGxlbWVudHMgU3Vic2NyaWJlcjxUPiB7CisgKiAgIHB1YmxpYyB2b2lkIG9uU3Vic2NyaWJlKFN1YnNjcmlwdGlvbiBzdWJzY3JpcHRpb24pIHsKKyAqICAgICBzdWJzY3JpcHRpb24ucmVxdWVzdChMb25nLk1BWF9WQUxVRSk7IC8vIGVmZmVjdGl2ZWx5IHVuYm91bmRlZAorICogICB9CisgKiAgIHB1YmxpYyB2b2lkIG9uTmV4dChUIGl0ZW0pIHsgdXNlKGl0ZW0pOyB9CisgKiAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoVGhyb3dhYmxlIGV4KSB7IGV4LnByaW50U3RhY2tUcmFjZSgpOyB9CisgKiAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUoKSB7fQorICogICB2b2lkIHVzZShUIGl0ZW0pIHsgLi4uIH0KKyAqIH19PC9wcmU+CisgKgorICogQGF1dGhvciBEb3VnIExlYQorICogQHNpbmNlIDkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEZsb3cgeworCisgICAgcHJpdmF0ZSBGbG93KCkge30gLy8gdW5pbnN0YW50aWFibGUKKworICAgIC8qKgorICAgICAqIEEgcHJvZHVjZXIgb2YgaXRlbXMgKGFuZCByZWxhdGVkIGNvbnRyb2wgbWVzc2FnZXMpIHJlY2VpdmVkIGJ5CisgICAgICogU3Vic2NyaWJlcnMuICBFYWNoIGN1cnJlbnQge0BsaW5rIFN1YnNjcmliZXJ9IHJlY2VpdmVzIHRoZSBzYW1lCisgICAgICogaXRlbXMgKHZpYSBtZXRob2Qge0Bjb2RlIG9uTmV4dH0pIGluIHRoZSBzYW1lIG9yZGVyLCB1bmxlc3MKKyAgICAgKiBkcm9wcyBvciBlcnJvcnMgYXJlIGVuY291bnRlcmVkLiBJZiBhIFB1Ymxpc2hlciBlbmNvdW50ZXJzIGFuCisgICAgICogZXJyb3IgdGhhdCBkb2VzIG5vdCBhbGxvdyBpdGVtcyB0byBiZSBpc3N1ZWQgdG8gYSBTdWJzY3JpYmVyLAorICAgICAqIHRoYXQgU3Vic2NyaWJlciByZWNlaXZlcyB7QGNvZGUgb25FcnJvcn0sIGFuZCB0aGVuIHJlY2VpdmVzIG5vCisgICAgICogZnVydGhlciBtZXNzYWdlcy4gIE90aGVyd2lzZSwgd2hlbiBpdCBpcyBrbm93biB0aGF0IG5vIGZ1cnRoZXIKKyAgICAgKiBtZXNzYWdlcyB3aWxsIGJlIGlzc3VlZCB0byBpdCwgYSBzdWJzY3JpYmVyIHJlY2VpdmVzIHtAY29kZQorICAgICAqIG9uQ29tcGxldGV9LiAgUHVibGlzaGVycyBlbnN1cmUgdGhhdCBTdWJzY3JpYmVyIG1ldGhvZAorICAgICAqIGludm9jYXRpb25zIGZvciBlYWNoIHN1YnNjcmlwdGlvbiBhcmUgc3RyaWN0bHkgb3JkZXJlZCBpbiA8YQorICAgICAqIGhyZWY9InBhY2thZ2Utc3VtbWFyeS5odG1sI01lbW9yeVZpc2liaWxpdHkiPjxpPmhhcHBlbnMtYmVmb3JlPC9pPjwvYT4KKyAgICAgKiBvcmRlci4KKyAgICAgKgorICAgICAqIDxwPlB1Ymxpc2hlcnMgbWF5IHZhcnkgaW4gcG9saWN5IGFib3V0IHdoZXRoZXIgZHJvcHMgKGZhaWx1cmVzCisgICAgICogdG8gaXNzdWUgYW4gaXRlbSBiZWNhdXNlIG9mIHJlc291cmNlIGxpbWl0YXRpb25zKSBhcmUgdHJlYXRlZAorICAgICAqIGFzIHVucmVjb3ZlcmFibGUgZXJyb3JzLiAgUHVibGlzaGVycyBtYXkgYWxzbyB2YXJ5IGFib3V0CisgICAgICogd2hldGhlciBTdWJzY3JpYmVycyByZWNlaXZlIGl0ZW1zIHRoYXQgd2VyZSBwcm9kdWNlZCBvcgorICAgICAqIGF2YWlsYWJsZSBiZWZvcmUgdGhleSBzdWJzY3JpYmVkLgorICAgICAqCisgICAgICogQHBhcmFtIDxUPiB0aGUgcHVibGlzaGVkIGl0ZW0gdHlwZQorICAgICAqLworICAgIEBGdW5jdGlvbmFsSW50ZXJmYWNlCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgUHVibGlzaGVyPFQ+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZHMgdGhlIGdpdmVuIFN1YnNjcmliZXIgaWYgcG9zc2libGUuICBJZiBhbHJlYWR5CisgICAgICAgICAqIHN1YnNjcmliZWQsIG9yIHRoZSBhdHRlbXB0IHRvIHN1YnNjcmliZSBmYWlscyBkdWUgdG8gcG9saWN5CisgICAgICAgICAqIHZpb2xhdGlvbnMgb3IgZXJyb3JzLCB0aGUgU3Vic2NyaWJlcidzIHtAY29kZSBvbkVycm9yfQorICAgICAgICAgKiBtZXRob2QgaXMgaW52b2tlZCB3aXRoIGFuIHtAbGluayBJbGxlZ2FsU3RhdGVFeGNlcHRpb259LgorICAgICAgICAgKiBPdGhlcndpc2UsIHRoZSBTdWJzY3JpYmVyJ3Mge0Bjb2RlIG9uU3Vic2NyaWJlfSBtZXRob2QgaXMKKyAgICAgICAgICogaW52b2tlZCB3aXRoIGEgbmV3IHtAbGluayBTdWJzY3JpcHRpb259LiAgU3Vic2NyaWJlcnMgbWF5CisgICAgICAgICAqIGVuYWJsZSByZWNlaXZpbmcgaXRlbXMgYnkgaW52b2tpbmcgdGhlIHtAY29kZSByZXF1ZXN0fQorICAgICAgICAgKiBtZXRob2Qgb2YgdGhpcyBTdWJzY3JpcHRpb24sIGFuZCBtYXkgdW5zdWJzY3JpYmUgYnkKKyAgICAgICAgICogaW52b2tpbmcgaXRzIHtAY29kZSBjYW5jZWx9IG1ldGhvZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHN1YnNjcmliZXIgdGhlIHN1YnNjcmliZXIKKyAgICAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBzdWJzY3JpYmVyIGlzIG51bGwKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHN1YnNjcmliZShTdWJzY3JpYmVyPD8gc3VwZXIgVD4gc3Vic2NyaWJlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSByZWNlaXZlciBvZiBtZXNzYWdlcy4gIFRoZSBtZXRob2RzIGluIHRoaXMgaW50ZXJmYWNlIGFyZQorICAgICAqIGludm9rZWQgaW4gc3RyaWN0IHNlcXVlbnRpYWwgb3JkZXIgZm9yIGVhY2gge0BsaW5rCisgICAgICogU3Vic2NyaXB0aW9ufS4KKyAgICAgKgorICAgICAqIEBwYXJhbSA8VD4gdGhlIHN1YnNjcmliZWQgaXRlbSB0eXBlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgU3Vic2NyaWJlcjxUPiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBNZXRob2QgaW52b2tlZCBwcmlvciB0byBpbnZva2luZyBhbnkgb3RoZXIgU3Vic2NyaWJlcgorICAgICAgICAgKiBtZXRob2RzIGZvciB0aGUgZ2l2ZW4gU3Vic2NyaXB0aW9uLiBJZiB0aGlzIG1ldGhvZCB0aHJvd3MKKyAgICAgICAgICogYW4gZXhjZXB0aW9uLCByZXN1bHRpbmcgYmVoYXZpb3IgaXMgbm90IGd1YXJhbnRlZWQsIGJ1dCBtYXkKKyAgICAgICAgICogY2F1c2UgdGhlIFN1YnNjcmlwdGlvbiBub3QgdG8gYmUgZXN0YWJsaXNoZWQgb3IgdG8gYmUgY2FuY2VsbGVkLgorICAgICAgICAgKgorICAgICAgICAgKiA8cD5UeXBpY2FsbHksIGltcGxlbWVudGF0aW9ucyBvZiB0aGlzIG1ldGhvZCBpbnZva2Uge0Bjb2RlCisgICAgICAgICAqIHN1YnNjcmlwdGlvbi5yZXF1ZXN0fSB0byBlbmFibGUgcmVjZWl2aW5nIGl0ZW1zLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc3Vic2NyaXB0aW9uIGEgbmV3IHN1YnNjcmlwdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25TdWJzY3JpYmUoU3Vic2NyaXB0aW9uIHN1YnNjcmlwdGlvbik7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE1ldGhvZCBpbnZva2VkIHdpdGggYSBTdWJzY3JpcHRpb24ncyBuZXh0IGl0ZW0uICBJZiB0aGlzCisgICAgICAgICAqIG1ldGhvZCB0aHJvd3MgYW4gZXhjZXB0aW9uLCByZXN1bHRpbmcgYmVoYXZpb3IgaXMgbm90CisgICAgICAgICAqIGd1YXJhbnRlZWQsIGJ1dCBtYXkgY2F1c2UgdGhlIFN1YnNjcmlwdGlvbiB0byBiZSBjYW5jZWxsZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBpdGVtIHRoZSBpdGVtCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbk5leHQoVCBpdGVtKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogTWV0aG9kIGludm9rZWQgdXBvbiBhbiB1bnJlY292ZXJhYmxlIGVycm9yIGVuY291bnRlcmVkIGJ5IGEKKyAgICAgICAgICogUHVibGlzaGVyIG9yIFN1YnNjcmlwdGlvbiwgYWZ0ZXIgd2hpY2ggbm8gb3RoZXIgU3Vic2NyaWJlcgorICAgICAgICAgKiBtZXRob2RzIGFyZSBpbnZva2VkIGJ5IHRoZSBTdWJzY3JpcHRpb24uICBJZiB0aGlzIG1ldGhvZAorICAgICAgICAgKiBpdHNlbGYgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgcmVzdWx0aW5nIGJlaGF2aW9yIGlzCisgICAgICAgICAqIHVuZGVmaW5lZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHRocm93YWJsZSB0aGUgZXhjZXB0aW9uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKFRocm93YWJsZSB0aHJvd2FibGUpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBNZXRob2QgaW52b2tlZCB3aGVuIGl0IGlzIGtub3duIHRoYXQgbm8gYWRkaXRpb25hbAorICAgICAgICAgKiBTdWJzY3JpYmVyIG1ldGhvZCBpbnZvY2F0aW9ucyB3aWxsIG9jY3VyIGZvciBhIFN1YnNjcmlwdGlvbgorICAgICAgICAgKiB0aGF0IGlzIG5vdCBhbHJlYWR5IHRlcm1pbmF0ZWQgYnkgZXJyb3IsIGFmdGVyIHdoaWNoIG5vCisgICAgICAgICAqIG90aGVyIFN1YnNjcmliZXIgbWV0aG9kcyBhcmUgaW52b2tlZCBieSB0aGUgU3Vic2NyaXB0aW9uLgorICAgICAgICAgKiBJZiB0aGlzIG1ldGhvZCB0aHJvd3MgYW4gZXhjZXB0aW9uLCByZXN1bHRpbmcgYmVoYXZpb3IgaXMKKyAgICAgICAgICogdW5kZWZpbmVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1lc3NhZ2UgY29udHJvbCBsaW5raW5nIGEge0BsaW5rIFB1Ymxpc2hlcn0gYW5kIHtAbGluaworICAgICAqIFN1YnNjcmliZXJ9LiAgU3Vic2NyaWJlcnMgcmVjZWl2ZSBpdGVtcyBvbmx5IHdoZW4gcmVxdWVzdGVkLAorICAgICAqIGFuZCBtYXkgY2FuY2VsIGF0IGFueSB0aW1lLiBUaGUgbWV0aG9kcyBpbiB0aGlzIGludGVyZmFjZSBhcmUKKyAgICAgKiBpbnRlbmRlZCB0byBiZSBpbnZva2VkIG9ubHkgYnkgdGhlaXIgU3Vic2NyaWJlcnM7IHVzYWdlcyBpbgorICAgICAqIG90aGVyIGNvbnRleHRzIGhhdmUgdW5kZWZpbmVkIGVmZmVjdHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgU3Vic2NyaXB0aW9uIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZHMgdGhlIGdpdmVuIG51bWJlciB7QGNvZGUgbn0gb2YgaXRlbXMgdG8gdGhlIGN1cnJlbnQKKyAgICAgICAgICogdW5mdWxmaWxsZWQgZGVtYW5kIGZvciB0aGlzIHN1YnNjcmlwdGlvbi4gIElmIHtAY29kZSBufSBpcworICAgICAgICAgKiBuZWdhdGl2ZSwgdGhlIFN1YnNjcmliZXIgd2lsbCByZWNlaXZlIGFuIHtAY29kZSBvbkVycm9yfQorICAgICAgICAgKiBzaWduYWwgd2l0aCBhbiB7QGxpbmsgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9ufSBhcmd1bWVudC4KKyAgICAgICAgICogT3RoZXJ3aXNlLCB0aGUgU3Vic2NyaWJlciB3aWxsIHJlY2VpdmUgdXAgdG8ge0Bjb2RlIG59CisgICAgICAgICAqIGFkZGl0aW9uYWwge0Bjb2RlIG9uTmV4dH0gaW52b2NhdGlvbnMgKG9yIGZld2VyIGlmCisgICAgICAgICAqIHRlcm1pbmF0ZWQpLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbiB0aGUgaW5jcmVtZW50IG9mIGRlbWFuZDsgYSB2YWx1ZSBvZiB7QGNvZGUKKyAgICAgICAgICogTG9uZy5NQVhfVkFMVUV9IG1heSBiZSBjb25zaWRlcmVkIGFzIGVmZmVjdGl2ZWx5IHVuYm91bmRlZAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgcmVxdWVzdChsb25nIG4pOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDYXVzZXMgdGhlIFN1YnNjcmliZXIgdG8gKGV2ZW50dWFsbHkpIHN0b3AgcmVjZWl2aW5nCisgICAgICAgICAqIG1lc3NhZ2VzLiAgSW1wbGVtZW50YXRpb24gaXMgYmVzdC1lZmZvcnQgLS0gYWRkaXRpb25hbAorICAgICAgICAgKiBtZXNzYWdlcyBtYXkgYmUgcmVjZWl2ZWQgYWZ0ZXIgaW52b2tpbmcgdGhpcyBtZXRob2QuCisgICAgICAgICAqIEEgY2FuY2VsbGVkIHN1YnNjcmlwdGlvbiBuZWVkIG5vdCBldmVyIHJlY2VpdmUgYW4KKyAgICAgICAgICoge0Bjb2RlIG9uQ29tcGxldGV9IG9yIHtAY29kZSBvbkVycm9yfSBzaWduYWwuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgdm9pZCBjYW5jZWwoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGNvbXBvbmVudCB0aGF0IGFjdHMgYXMgYm90aCBhIFN1YnNjcmliZXIgYW5kIFB1Ymxpc2hlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSA8VD4gdGhlIHN1YnNjcmliZWQgaXRlbSB0eXBlCisgICAgICogQHBhcmFtIDxSPiB0aGUgcHVibGlzaGVkIGl0ZW0gdHlwZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFByb2Nlc3NvcjxULCBSPiBleHRlbmRzIFN1YnNjcmliZXI8VD4sIFB1Ymxpc2hlcjxSPiB7CisgICAgfQorCisgICAgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0JVRkZFUl9TSVpFID0gMjU2OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGRlZmF1bHQgdmFsdWUgZm9yIFB1Ymxpc2hlciBvciBTdWJzY3JpYmVyIGJ1ZmZlcmluZywKKyAgICAgKiB0aGF0IG1heSBiZSB1c2VkIGluIHRoZSBhYnNlbmNlIG9mIG90aGVyIGNvbnN0cmFpbnRzLgorICAgICAqCisgICAgICogQGltcGxOb3RlCisgICAgICogVGhlIGN1cnJlbnQgdmFsdWUgcmV0dXJuZWQgaXMgMjU2LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgYnVmZmVyIHNpemUgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBkZWZhdWx0QnVmZmVyU2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIERFRkFVTFRfQlVGRkVSX1NJWkU7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2pzcjE2Ni9TdWJtaXNzaW9uUHVibGlzaGVyLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2pzcjE2Ni9TdWJtaXNzaW9uUHVibGlzaGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NhNDhlZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvanNyMTY2L1N1Ym1pc3Npb25QdWJsaXNoZXIuamF2YQpAQCAtMCwwICsxLDE2MjYgQEAKKy8qCisgKiBXcml0dGVuIGJ5IERvdWcgTGVhIHdpdGggYXNzaXN0YW5jZSBmcm9tIG1lbWJlcnMgb2YgSkNQIEpTUi0xNjYKKyAqIEV4cGVydCBHcm91cCBhbmQgcmVsZWFzZWQgdG8gdGhlIHB1YmxpYyBkb21haW4sIGFzIGV4cGxhaW5lZCBhdAorICogaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvcHVibGljZG9tYWluL3plcm8vMS4wLworICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuanNyMTY2OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db21wbGV0YWJsZUZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRm9ya0pvaW5Qb29sOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZvcmtKb2luVGFzazsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5SZWplY3RlZEV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5Mb2NrU3VwcG9ydDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQmlDb25zdW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQmlQcmVkaWNhdGU7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworCisvKioKKyAqIEEge0BsaW5rIEZsb3cuUHVibGlzaGVyfSB0aGF0IGFzeW5jaHJvbm91c2x5IGlzc3VlcyBzdWJtaXR0ZWQKKyAqIChub24tbnVsbCkgaXRlbXMgdG8gY3VycmVudCBzdWJzY3JpYmVycyB1bnRpbCBpdCBpcyBjbG9zZWQuICBFYWNoCisgKiBjdXJyZW50IHN1YnNjcmliZXIgcmVjZWl2ZXMgbmV3bHkgc3VibWl0dGVkIGl0ZW1zIGluIHRoZSBzYW1lIG9yZGVyCisgKiB1bmxlc3MgZHJvcHMgb3IgZXhjZXB0aW9ucyBhcmUgZW5jb3VudGVyZWQuICBVc2luZyBhCisgKiBTdWJtaXNzaW9uUHVibGlzaGVyIGFsbG93cyBpdGVtIGdlbmVyYXRvcnMgdG8gYWN0IGFzIGNvbXBsaWFudCA8YQorICogaHJlZj0iaHR0cDovL3d3dy5yZWFjdGl2ZS1zdHJlYW1zLm9yZy8iPiByZWFjdGl2ZS1zdHJlYW1zPC9hPgorICogUHVibGlzaGVycyByZWx5aW5nIG9uIGRyb3AgaGFuZGxpbmcgYW5kL29yIGJsb2NraW5nIGZvciBmbG93CisgKiBjb250cm9sLgorICogPHA+CisgKiA8cD5BIFN1Ym1pc3Npb25QdWJsaXNoZXIgdXNlcyB0aGUge0BsaW5rIEV4ZWN1dG9yfSBzdXBwbGllZCBpbiBpdHMKKyAqIGNvbnN0cnVjdG9yIGZvciBkZWxpdmVyeSB0byBzdWJzY3JpYmVycy4gVGhlIGJlc3QgY2hvaWNlIG9mCisgKiBFeGVjdXRvciBkZXBlbmRzIG9uIGV4cGVjdGVkIHVzYWdlLiBJZiB0aGUgZ2VuZXJhdG9yKHMpIG9mCisgKiBzdWJtaXR0ZWQgaXRlbXMgcnVuIGluIHNlcGFyYXRlIHRocmVhZHMsIGFuZCB0aGUgbnVtYmVyIG9mCisgKiBzdWJzY3JpYmVycyBjYW4gYmUgZXN0aW1hdGVkLCBjb25zaWRlciB1c2luZyBhIHtAbGluaworICogRXhlY3V0b3JzI25ld0ZpeGVkVGhyZWFkUG9vbH0uIE90aGVyd2lzZSBjb25zaWRlciB1c2luZyB0aGUKKyAqIGRlZmF1bHQsIG5vcm1hbGx5IHRoZSB7QGxpbmsgRm9ya0pvaW5Qb29sI2NvbW1vblBvb2x9LgorICogPHA+CisgKiA8cD5CdWZmZXJpbmcgYWxsb3dzIHByb2R1Y2VycyBhbmQgY29uc3VtZXJzIHRvIHRyYW5zaWVudGx5IG9wZXJhdGUKKyAqIGF0IGRpZmZlcmVudCByYXRlcy4gIEVhY2ggc3Vic2NyaWJlciB1c2VzIGFuIGluZGVwZW5kZW50IGJ1ZmZlci4KKyAqIEJ1ZmZlcnMgYXJlIGNyZWF0ZWQgdXBvbiBmaXJzdCB1c2UgYW5kIGV4cGFuZGVkIGFzIG5lZWRlZCB1cCB0byB0aGUKKyAqIGdpdmVuIG1heGltdW0uIChUaGUgZW5mb3JjZWQgY2FwYWNpdHkgbWF5IGJlIHJvdW5kZWQgdXAgdG8gdGhlCisgKiBuZWFyZXN0IHBvd2VyIG9mIHR3byBhbmQvb3IgYm91bmRlZCBieSB0aGUgbGFyZ2VzdCB2YWx1ZSBzdXBwb3J0ZWQKKyAqIGJ5IHRoaXMgaW1wbGVtZW50YXRpb24uKSAgSW52b2NhdGlvbnMgb2Yge0BsaW5rCisgKiBGbG93LlN1YnNjcmlwdGlvbiNyZXF1ZXN0KGxvbmcpIHJlcXVlc3R9IGRvIG5vdCBkaXJlY3RseSByZXN1bHQgaW4KKyAqIGJ1ZmZlciBleHBhbnNpb24sIGJ1dCByaXNrIHNhdHVyYXRpb24gaWYgdW5maWxsZWQgcmVxdWVzdHMgZXhjZWVkCisgKiB0aGUgbWF4aW11bSBjYXBhY2l0eS4gIFRoZSBkZWZhdWx0IHZhbHVlIG9mIHtAbGluaworICogRmxvdyNkZWZhdWx0QnVmZmVyU2l6ZSgpfSBtYXkgcHJvdmlkZSBhIHVzZWZ1bCBzdGFydGluZyBwb2ludCBmb3IKKyAqIGNob29zaW5nIGEgY2FwYWNpdHkgYmFzZWQgb24gZXhwZWN0ZWQgcmF0ZXMsIHJlc291cmNlcywgYW5kIHVzYWdlcy4KKyAqIDxwPgorICogPHA+UHVibGljYXRpb24gbWV0aG9kcyBzdXBwb3J0IGRpZmZlcmVudCBwb2xpY2llcyBhYm91dCB3aGF0IHRvIGRvCisgKiB3aGVuIGJ1ZmZlcnMgYXJlIHNhdHVyYXRlZC4gTWV0aG9kIHtAbGluayAjc3VibWl0KE9iamVjdCkgc3VibWl0fQorICogYmxvY2tzIHVudGlsIHJlc291cmNlcyBhcmUgYXZhaWxhYmxlLiBUaGlzIGlzIHNpbXBsZXN0LCBidXQgbGVhc3QKKyAqIHJlc3BvbnNpdmUuICBUaGUge0Bjb2RlIG9mZmVyfSBtZXRob2RzIG1heSBkcm9wIGl0ZW1zIChlaXRoZXIKKyAqIGltbWVkaWF0ZWx5IG9yIHdpdGggYm91bmRlZCB0aW1lb3V0KSwgYnV0IHByb3ZpZGUgYW4gb3Bwb3J0dW5pdHkgdG8KKyAqIGludGVycG9zZSBhIGhhbmRsZXIgYW5kIHRoZW4gcmV0cnkuCisgKiA8cD4KKyAqIDxwPklmIGFueSBTdWJzY3JpYmVyIG1ldGhvZCB0aHJvd3MgYW4gZXhjZXB0aW9uLCBpdHMgc3Vic2NyaXB0aW9uCisgKiBpcyBjYW5jZWxsZWQuICBJZiBhIGhhbmRsZXIgaXMgc3VwcGxpZWQgYXMgYSBjb25zdHJ1Y3RvciBhcmd1bWVudCwKKyAqIGl0IGlzIGludm9rZWQgYmVmb3JlIGNhbmNlbGxhdGlvbiB1cG9uIGFuIGV4Y2VwdGlvbiBpbiBtZXRob2QKKyAqIHtAbGluayBGbG93LlN1YnNjcmliZXIjb25OZXh0IG9uTmV4dH0sIGJ1dCBleGNlcHRpb25zIGluIG1ldGhvZHMKKyAqIHtAbGluayBGbG93LlN1YnNjcmliZXIjb25TdWJzY3JpYmUgb25TdWJzY3JpYmV9LAorICoge0BsaW5rIEZsb3cuU3Vic2NyaWJlciNvbkVycm9yKFRocm93YWJsZSkgb25FcnJvcn0gYW5kCisgKiB7QGxpbmsgRmxvdy5TdWJzY3JpYmVyI29uQ29tcGxldGUoKSBvbkNvbXBsZXRlfSBhcmUgbm90IHJlY29yZGVkIG9yCisgKiBoYW5kbGVkIGJlZm9yZSBjYW5jZWxsYXRpb24uICBJZiB0aGUgc3VwcGxpZWQgRXhlY3V0b3IgdGhyb3dzCisgKiB7QGxpbmsgUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb259IChvciBhbnkgb3RoZXIgUnVudGltZUV4Y2VwdGlvbgorICogb3IgRXJyb3IpIHdoZW4gYXR0ZW1wdGluZyB0byBleGVjdXRlIGEgdGFzaywgb3IgYSBkcm9wIGhhbmRsZXIKKyAqIHRocm93cyBhbiBleGNlcHRpb24gd2hlbiBwcm9jZXNzaW5nIGEgZHJvcHBlZCBpdGVtLCB0aGVuIHRoZQorICogZXhjZXB0aW9uIGlzIHJldGhyb3duLiBJbiB0aGVzZSBjYXNlcywgbm90IGFsbCBzdWJzY3JpYmVycyB3aWxsCisgKiBoYXZlIGJlZW4gaXNzdWVkIHRoZSBwdWJsaXNoZWQgaXRlbS4gSXQgaXMgdXN1YWxseSBnb29kIHByYWN0aWNlIHRvCisgKiB7QGxpbmsgI2Nsb3NlRXhjZXB0aW9uYWxseSBjbG9zZUV4Y2VwdGlvbmFsbHl9IGluIHRoZXNlIGNhc2VzLgorICogPHA+CisgKiA8cD5NZXRob2Qge0BsaW5rICNjb25zdW1lKENvbnN1bWVyKX0gc2ltcGxpZmllcyBzdXBwb3J0IGZvciBhCisgKiBjb21tb24gY2FzZSBpbiB3aGljaCB0aGUgb25seSBhY3Rpb24gb2YgYSBzdWJzY3JpYmVyIGlzIHRvIHJlcXVlc3QKKyAqIGFuZCBwcm9jZXNzIGFsbCBpdGVtcyB1c2luZyBhIHN1cHBsaWVkIGZ1bmN0aW9uLgorICogPHA+CisgKiA8cD5UaGlzIGNsYXNzIG1heSBhbHNvIHNlcnZlIGFzIGEgY29udmVuaWVudCBiYXNlIGZvciBzdWJjbGFzc2VzCisgKiB0aGF0IGdlbmVyYXRlIGl0ZW1zLCBhbmQgdXNlIHRoZSBtZXRob2RzIGluIHRoaXMgY2xhc3MgdG8gcHVibGlzaAorICogdGhlbS4gIEZvciBleGFtcGxlIGhlcmUgaXMgYSBjbGFzcyB0aGF0IHBlcmlvZGljYWxseSBwdWJsaXNoZXMgdGhlCisgKiBpdGVtcyBnZW5lcmF0ZWQgZnJvbSBhIHN1cHBsaWVyLiAoSW4gcHJhY3RpY2UgeW91IG1pZ2h0IGFkZCBtZXRob2RzCisgKiB0byBpbmRlcGVuZGVudGx5IHN0YXJ0IGFuZCBzdG9wIGdlbmVyYXRpb24sIHRvIHNoYXJlIEV4ZWN1dG9ycworICogYW1vbmcgcHVibGlzaGVycywgYW5kIHNvIG9uLCBvciB1c2UgYSBTdWJtaXNzaW9uUHVibGlzaGVyIGFzIGEKKyAqIGNvbXBvbmVudCByYXRoZXIgdGhhbiBhIHN1cGVyY2xhc3MuKQorICogPHA+CisgKiA8cHJlPiB7QGNvZGUKKyAqIGNsYXNzIFBlcmlvZGljUHVibGlzaGVyPFQ+IGV4dGVuZHMgU3VibWlzc2lvblB1Ymxpc2hlcjxUPiB7CisgKiAgIGZpbmFsIFNjaGVkdWxlZEZ1dHVyZTw/PiBwZXJpb2RpY1Rhc2s7CisgKiAgIGZpbmFsIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSBzY2hlZHVsZXI7CisgKiAgIFBlcmlvZGljUHVibGlzaGVyKEV4ZWN1dG9yIGV4ZWN1dG9yLCBpbnQgbWF4QnVmZmVyQ2FwYWNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgIFN1cHBsaWVyPD8gZXh0ZW5kcyBUPiBzdXBwbGllciwKKyAqICAgICAgICAgICAgICAgICAgICAgbG9uZyBwZXJpb2QsIFRpbWVVbml0IHVuaXQpIHsKKyAqICAgICBzdXBlcihleGVjdXRvciwgbWF4QnVmZmVyQ2FwYWNpdHkpOworICogICAgIHNjaGVkdWxlciA9IG5ldyBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IoMSk7CisgKiAgICAgcGVyaW9kaWNUYXNrID0gc2NoZWR1bGVyLnNjaGVkdWxlQXRGaXhlZFJhdGUoCisgKiAgICAgICAoKSAtPiBzdWJtaXQoc3VwcGxpZXIuZ2V0KCkpLCAwLCBwZXJpb2QsIHVuaXQpOworICogICB9CisgKiAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICogICAgIHBlcmlvZGljVGFzay5jYW5jZWwoZmFsc2UpOworICogICAgIHNjaGVkdWxlci5zaHV0ZG93bigpOworICogICAgIHN1cGVyLmNsb3NlKCk7CisgKiAgIH0KKyAqIH19PC9wcmU+CisgKiA8cD4KKyAqIDxwPkhlcmUgaXMgYW4gZXhhbXBsZSBvZiBhIHtAbGluayBGbG93LlByb2Nlc3Nvcn0gaW1wbGVtZW50YXRpb24uCisgKiBJdCB1c2VzIHNpbmdsZS1zdGVwIHJlcXVlc3RzIHRvIGl0cyBwdWJsaXNoZXIgZm9yIHNpbXBsaWNpdHkgb2YKKyAqIGlsbHVzdHJhdGlvbi4gQSBtb3JlIGFkYXB0aXZlIHZlcnNpb24gY291bGQgbW9uaXRvciBmbG93IHVzaW5nIHRoZQorICogbGFnIGVzdGltYXRlIHJldHVybmVkIGZyb20ge0Bjb2RlIHN1Ym1pdH0sIGFsb25nIHdpdGggb3RoZXIgdXRpbGl0eQorICogbWV0aG9kcy4KKyAqIDxwPgorICogPHByZT4ge0Bjb2RlCisgKiBjbGFzcyBUcmFuc2Zvcm1Qcm9jZXNzb3I8UyxUPiBleHRlbmRzIFN1Ym1pc3Npb25QdWJsaXNoZXI8VD4KKyAqICAgaW1wbGVtZW50cyBGbG93LlByb2Nlc3NvcjxTLFQ+IHsKKyAqICAgZmluYWwgRnVuY3Rpb248PyBzdXBlciBTLCA/IGV4dGVuZHMgVD4gZnVuY3Rpb247CisgKiAgIEZsb3cuU3Vic2NyaXB0aW9uIHN1YnNjcmlwdGlvbjsKKyAqICAgVHJhbnNmb3JtUHJvY2Vzc29yKEV4ZWN1dG9yIGV4ZWN1dG9yLCBpbnQgbWF4QnVmZmVyQ2FwYWNpdHksCisgKiAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjw/IHN1cGVyIFMsID8gZXh0ZW5kcyBUPiBmdW5jdGlvbikgeworICogICAgIHN1cGVyKGV4ZWN1dG9yLCBtYXhCdWZmZXJDYXBhY2l0eSk7CisgKiAgICAgdGhpcy5mdW5jdGlvbiA9IGZ1bmN0aW9uOworICogICB9CisgKiAgIHB1YmxpYyB2b2lkIG9uU3Vic2NyaWJlKEZsb3cuU3Vic2NyaXB0aW9uIHN1YnNjcmlwdGlvbikgeworICogICAgICh0aGlzLnN1YnNjcmlwdGlvbiA9IHN1YnNjcmlwdGlvbikucmVxdWVzdCgxKTsKKyAqICAgfQorICogICBwdWJsaWMgdm9pZCBvbk5leHQoUyBpdGVtKSB7CisgKiAgICAgc3Vic2NyaXB0aW9uLnJlcXVlc3QoMSk7CisgKiAgICAgc3VibWl0KGZ1bmN0aW9uLmFwcGx5KGl0ZW0pKTsKKyAqICAgfQorICogICBwdWJsaWMgdm9pZCBvbkVycm9yKFRocm93YWJsZSBleCkgeyBjbG9zZUV4Y2VwdGlvbmFsbHkoZXgpOyB9CisgKiAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUoKSB7IGNsb3NlKCk7IH0KKyAqIH19PC9wcmU+CisgKgorICogQHBhcmFtIDxUPiB0aGUgcHVibGlzaGVkIGl0ZW0gdHlwZQorICogQGF1dGhvciBEb3VnIExlYQorICogQHNpbmNlIDkKKyAqLworcHVibGljIGNsYXNzIFN1Ym1pc3Npb25QdWJsaXNoZXI8VD4gaW1wbGVtZW50cyBGbG93LlB1Ymxpc2hlcjxUPiwKKyAgICAgICAgQXV0b0Nsb3NlYWJsZSB7CisgICAgLyoKKyAgICAgKiBNb3N0IG1lY2hhbmljcyBhcmUgaGFuZGxlZCBieSBCdWZmZXJlZFN1YnNjcmlwdGlvbi4gVGhpcyBjbGFzcworICAgICAqIG1haW5seSB0cmFja3Mgc3Vic2NyaWJlcnMgYW5kIGVuc3VyZXMgc2VxdWVudGlhbGl0eSwgYnkgdXNpbmcKKyAgICAgKiBidWlsdC1pbiBzeW5jaHJvbml6YXRpb24gbG9ja3MgYWNyb3NzIHB1YmxpYyBtZXRob2RzLiAoVXNpbmcKKyAgICAgKiBidWlsdC1pbiBsb2NrcyB3b3JrcyB3ZWxsIGluIHRoZSBtb3N0IHR5cGljYWwgY2FzZSBpbiB3aGljaAorICAgICAqIG9ubHkgb25lIHRocmVhZCBzdWJtaXRzIGl0ZW1zKS4KKyAgICAgKi8KKworICAgIC8qKgorICAgICAqIFRoZSBsYXJnZXN0IHBvc3NpYmxlIHBvd2VyIG9mIHR3byBhcnJheSBzaXplLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSX0NBUEFDSVRZX0xJTUlUID0gMSA8PCAzMDsKKworICAgIC8qKgorICAgICAqIFJvdW5kIGNhcGFjaXR5IHRvIHBvd2VyIG9mIDIsIGF0IG1vc3QgbGltaXQuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCByb3VuZENhcGFjaXR5KGludCBjYXApIHsKKyAgICAgICAgaW50IG4gPSBjYXAgLSAxOworICAgICAgICBuIHw9IG4gPj4+IDE7CisgICAgICAgIG4gfD0gbiA+Pj4gMjsKKyAgICAgICAgbiB8PSBuID4+PiA0OworICAgICAgICBuIHw9IG4gPj4+IDg7CisgICAgICAgIG4gfD0gbiA+Pj4gMTY7CisgICAgICAgIHJldHVybiAobiA8PSAwKSA/IDEgOiAvLyBhdCBsZWFzdCAxCisgICAgICAgICAgICAgICAgKG4gPj0gQlVGRkVSX0NBUEFDSVRZX0xJTUlUKSA/IEJVRkZFUl9DQVBBQ0lUWV9MSU1JVCA6IG4gKyAxOworICAgIH0KKworICAgIC8vIGRlZmF1bHQgRXhlY3V0b3Igc2V0dXA7IG5lYXJseSB0aGUgc2FtZSBhcyBDb21wbGV0YWJsZUZ1dHVyZQorCisgICAgLyoqCisgICAgICogRGVmYXVsdCBleGVjdXRvciAtLSBGb3JrSm9pblBvb2wuY29tbW9uUG9vbCgpIHVubGVzcyBpdCBjYW5ub3QKKyAgICAgKiBzdXBwb3J0IHBhcmFsbGVsaXNtLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEV4ZWN1dG9yIEFTWU5DX1BPT0wgPQorICAgICAgICAgICAgKEZvcmtKb2luUG9vbC5nZXRDb21tb25Qb29sUGFyYWxsZWxpc20oKSA+IDEpID8gRm9ya0pvaW5Qb29sLmNvbW1vblBvb2woKSA6IG5ldyBUaHJlYWRQZXJUYXNrRXhlY3V0b3IoKTsKKworICAgIC8qKgorICAgICAqIEZhbGxiYWNrIGlmIEZvcmtKb2luUG9vbC5jb21tb25Qb29sKCkgY2Fubm90IHN1cHBvcnQgcGFyYWxsZWxpc20KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBUaHJlYWRQZXJUYXNrRXhlY3V0b3IgaW1wbGVtZW50cyBFeGVjdXRvciB7CisgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoUnVubmFibGUgcikgeworICAgICAgICAgICAgbmV3IFRocmVhZChyKS5zdGFydCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xpZW50cyAoQnVmZmVyZWRTdWJzY3JpcHRpb25zKSBhcmUgbWFpbnRhaW5lZCBpbiBhIGxpbmtlZCBsaXN0CisgICAgICogKHZpYSB0aGVpciAibmV4dCIgZmllbGRzKS4gVGhpcyB3b3JrcyB3ZWxsIGZvciBwdWJsaXNoIGxvb3BzLgorICAgICAqIEl0IHJlcXVpcmVzIE8obikgdHJhdmVyc2FsIHRvIGNoZWNrIGZvciBkdXBsaWNhdGUgc3Vic2NyaWJlcnMsCisgICAgICogYnV0IHdlIGV4cGVjdCB0aGF0IHN1YnNjcmliaW5nIGlzIG11Y2ggbGVzcyBjb21tb24gdGhhbgorICAgICAqIHB1Ymxpc2hpbmcuIFVuc3Vic2NyaWJpbmcgb2NjdXJzIG9ubHkgZHVyaW5nIHRyYXZlcnNhbCBsb29wcywKKyAgICAgKiB3aGVuIEJ1ZmZlcmVkU3Vic2NyaXB0aW9uIG1ldGhvZHMgcmV0dXJuIG5lZ2F0aXZlIHZhbHVlcworICAgICAqIHNpZ25pZnlpbmcgdGhhdCB0aGV5IGhhdmUgYmVlbiBkaXNhYmxlZC4gIFRvIHJlZHVjZQorICAgICAqIGhlYWQtb2YtbGluZSBibG9ja2luZywgc3VibWl0IGFuZCBvZmZlciBtZXRob2RzIGZpcnN0IGNhbGwKKyAgICAgKiBCdWZmZXJlZFN1YnNjcmlwdGlvbi5vZmZlciBvbiBlYWNoIHN1YnNjcmliZXIsIGFuZCBwbGFjZQorICAgICAqIHNhdHVyYXRlZCBvbmVzIGluIHJldHJpZXMgbGlzdCAodXNpbmcgbmV4dFJldHJ5IGZpZWxkKSwgYW5kCisgICAgICogcmV0cnksIHBvc3NpYmx5IGJsb2NraW5nIG9yIGRyb3BwaW5nLgorICAgICAqLworICAgIEJ1ZmZlcmVkU3Vic2NyaXB0aW9uPFQ+IGNsaWVudHM7CisKKyAgICAvKioKKyAgICAgKiBSdW4gc3RhdHVzLCB1cGRhdGVkIG9ubHkgd2l0aGluIGxvY2tzCisgICAgICovCisgICAgdm9sYXRpbGUgYm9vbGVhbiBjbG9zZWQ7CisgICAgLyoqCisgICAgICogSWYgbm9uLW51bGwsIHRoZSBleGNlcHRpb24gaW4gY2xvc2VFeGNlcHRpb25hbGx5CisgICAgICovCisgICAgdm9sYXRpbGUgVGhyb3dhYmxlIGNsb3NlZEV4Y2VwdGlvbjsKKworICAgIC8vIFBhcmFtZXRlcnMgZm9yIGNvbnN0cnVjdGluZyBCdWZmZXJlZFN1YnNjcmlwdGlvbnMKKyAgICBmaW5hbCBFeGVjdXRvciBleGVjdXRvcjsKKyAgICBmaW5hbCBCaUNvbnN1bWVyPD8gc3VwZXIgRmxvdy5TdWJzY3JpYmVyPD8gc3VwZXIgVD4sID8gc3VwZXIgVGhyb3dhYmxlPiBvbk5leHRIYW5kbGVyOworICAgIGZpbmFsIGludCBtYXhCdWZmZXJDYXBhY2l0eTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgU3VibWlzc2lvblB1Ymxpc2hlciB1c2luZyB0aGUgZ2l2ZW4gRXhlY3V0b3IgZm9yCisgICAgICogYXN5bmMgZGVsaXZlcnkgdG8gc3Vic2NyaWJlcnMsIHdpdGggdGhlIGdpdmVuIG1heGltdW0gYnVmZmVyIHNpemUKKyAgICAgKiBmb3IgZWFjaCBzdWJzY3JpYmVyLCBhbmQsIGlmIG5vbi1udWxsLCB0aGUgZ2l2ZW4gaGFuZGxlciBpbnZva2VkCisgICAgICogd2hlbiBhbnkgU3Vic2NyaWJlciB0aHJvd3MgYW4gZXhjZXB0aW9uIGluIG1ldGhvZCB7QGxpbmsKKyAgICAgKiBGbG93LlN1YnNjcmliZXIjb25OZXh0KE9iamVjdCkgb25OZXh0fS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleGVjdXRvciAgICAgICAgICB0aGUgZXhlY3V0b3IgdG8gdXNlIGZvciBhc3luYyBkZWxpdmVyeSwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGluZyBjcmVhdGlvbiBvZiBhdCBsZWFzdCBvbmUgaW5kZXBlbmRlbnQgdGhyZWFkCisgICAgICogQHBhcmFtIG1heEJ1ZmZlckNhcGFjaXR5IHRoZSBtYXhpbXVtIGNhcGFjaXR5IGZvciBlYWNoCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIncyBidWZmZXIgKHRoZSBlbmZvcmNlZCBjYXBhY2l0eSBtYXkgYmUgcm91bmRlZCB1cCB0bworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbmVhcmVzdCBwb3dlciBvZiB0d28gYW5kL29yIGJvdW5kZWQgYnkgdGhlIGxhcmdlc3QgdmFsdWUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb247IG1ldGhvZCB7QGxpbmsgI2dldE1heEJ1ZmZlckNhcGFjaXR5fQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5zIHRoZSBhY3R1YWwgdmFsdWUpCisgICAgICogQHBhcmFtIGhhbmRsZXIgICAgICAgICAgIGlmIG5vbi1udWxsLCBwcm9jZWR1cmUgdG8gaW52b2tlIHVwb24gZXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93biBpbiBtZXRob2Qge0Bjb2RlIG9uTmV4dH0KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uICAgICBpZiBleGVjdXRvciBpcyBudWxsCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgbWF4QnVmZmVyQ2FwYWNpdHkgbm90CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3VibWlzc2lvblB1Ymxpc2hlcihFeGVjdXRvciBleGVjdXRvciwgaW50IG1heEJ1ZmZlckNhcGFjaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpQ29uc3VtZXI8PyBzdXBlciBGbG93LlN1YnNjcmliZXI8PyBzdXBlciBUPiwgPyBzdXBlciBUaHJvd2FibGU+IGhhbmRsZXIpIHsKKyAgICAgICAgaWYgKGV4ZWN1dG9yID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGlmIChtYXhCdWZmZXJDYXBhY2l0eSA8PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYXBhY2l0eSBtdXN0IGJlIHBvc2l0aXZlIik7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5leGVjdXRvciA9IGV4ZWN1dG9yOworICAgICAgICB0aGlzLm9uTmV4dEhhbmRsZXIgPSBoYW5kbGVyOworICAgICAgICB0aGlzLm1heEJ1ZmZlckNhcGFjaXR5ID0gcm91bmRDYXBhY2l0eShtYXhCdWZmZXJDYXBhY2l0eSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBTdWJtaXNzaW9uUHVibGlzaGVyIHVzaW5nIHRoZSBnaXZlbiBFeGVjdXRvciBmb3IKKyAgICAgKiBhc3luYyBkZWxpdmVyeSB0byBzdWJzY3JpYmVycywgd2l0aCB0aGUgZ2l2ZW4gbWF4aW11bSBidWZmZXIgc2l6ZQorICAgICAqIGZvciBlYWNoIHN1YnNjcmliZXIsIGFuZCBubyBoYW5kbGVyIGZvciBTdWJzY3JpYmVyIGV4Y2VwdGlvbnMgaW4KKyAgICAgKiBtZXRob2Qge0BsaW5rIEZsb3cuU3Vic2NyaWJlciNvbk5leHQoT2JqZWN0KSBvbk5leHR9LgorICAgICAqCisgICAgICogQHBhcmFtIGV4ZWN1dG9yICAgICAgICAgIHRoZSBleGVjdXRvciB0byB1c2UgZm9yIGFzeW5jIGRlbGl2ZXJ5LAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0aW5nIGNyZWF0aW9uIG9mIGF0IGxlYXN0IG9uZSBpbmRlcGVuZGVudCB0aHJlYWQKKyAgICAgKiBAcGFyYW0gbWF4QnVmZmVyQ2FwYWNpdHkgdGhlIG1heGltdW0gY2FwYWNpdHkgZm9yIGVhY2gKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlcidzIGJ1ZmZlciAodGhlIGVuZm9yY2VkIGNhcGFjaXR5IG1heSBiZSByb3VuZGVkIHVwIHRvCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBuZWFyZXN0IHBvd2VyIG9mIHR3byBhbmQvb3IgYm91bmRlZCBieSB0aGUgbGFyZ2VzdCB2YWx1ZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbjsgbWV0aG9kIHtAbGluayAjZ2V0TWF4QnVmZmVyQ2FwYWNpdHl9CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgdGhlIGFjdHVhbCB2YWx1ZSkKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uICAgICBpZiBleGVjdXRvciBpcyBudWxsCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgbWF4QnVmZmVyQ2FwYWNpdHkgbm90CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3VibWlzc2lvblB1Ymxpc2hlcihFeGVjdXRvciBleGVjdXRvciwgaW50IG1heEJ1ZmZlckNhcGFjaXR5KSB7CisgICAgICAgIHRoaXMoZXhlY3V0b3IsIG1heEJ1ZmZlckNhcGFjaXR5LCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IFN1Ym1pc3Npb25QdWJsaXNoZXIgdXNpbmcgdGhlIHtAbGluaworICAgICAqIEZvcmtKb2luUG9vbCNjb21tb25Qb29sKCl9IGZvciBhc3luYyBkZWxpdmVyeSB0byBzdWJzY3JpYmVycworICAgICAqICh1bmxlc3MgaXQgZG9lcyBub3Qgc3VwcG9ydCBhIHBhcmFsbGVsaXNtIGxldmVsIG9mIGF0IGxlYXN0IHR3bywKKyAgICAgKiBpbiB3aGljaCBjYXNlLCBhIG5ldyBUaHJlYWQgaXMgY3JlYXRlZCB0byBydW4gZWFjaCB0YXNrKSwgd2l0aAorICAgICAqIG1heGltdW0gYnVmZmVyIGNhcGFjaXR5IG9mIHtAbGluayBGbG93I2RlZmF1bHRCdWZmZXJTaXplfSwgYW5kIG5vCisgICAgICogaGFuZGxlciBmb3IgU3Vic2NyaWJlciBleGNlcHRpb25zIGluIG1ldGhvZCB7QGxpbmsKKyAgICAgKiBGbG93LlN1YnNjcmliZXIjb25OZXh0KE9iamVjdCkgb25OZXh0fS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3VibWlzc2lvblB1Ymxpc2hlcigpIHsKKyAgICAgICAgdGhpcyhBU1lOQ19QT09MLCBGbG93LmRlZmF1bHRCdWZmZXJTaXplKCksIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgdGhlIGdpdmVuIFN1YnNjcmliZXIgdW5sZXNzIGFscmVhZHkgc3Vic2NyaWJlZC4gIElmIGFscmVhZHkKKyAgICAgKiBzdWJzY3JpYmVkLCB0aGUgU3Vic2NyaWJlcidzIHtAbGluaworICAgICAqIEZsb3cuU3Vic2NyaWJlciNvbkVycm9yKFRocm93YWJsZSkgb25FcnJvcn0gbWV0aG9kIGlzIGludm9rZWQgb24KKyAgICAgKiB0aGUgZXhpc3Rpbmcgc3Vic2NyaXB0aW9uIHdpdGggYW4ge0BsaW5rIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbn0uCisgICAgICogT3RoZXJ3aXNlLCB1cG9uIHN1Y2Nlc3MsIHRoZSBTdWJzY3JpYmVyJ3Mge0BsaW5rCisgICAgICogRmxvdy5TdWJzY3JpYmVyI29uU3Vic2NyaWJlIG9uU3Vic2NyaWJlfSBtZXRob2QgaXMgaW52b2tlZAorICAgICAqIGFzeW5jaHJvbm91c2x5IHdpdGggYSBuZXcge0BsaW5rIEZsb3cuU3Vic2NyaXB0aW9ufS4gIElmIHtAbGluaworICAgICAqIEZsb3cuU3Vic2NyaWJlciNvblN1YnNjcmliZSBvblN1YnNjcmliZX0gdGhyb3dzIGFuIGV4Y2VwdGlvbiwgdGhlCisgICAgICogc3Vic2NyaXB0aW9uIGlzIGNhbmNlbGxlZC4gT3RoZXJ3aXNlLCBpZiB0aGlzIFN1Ym1pc3Npb25QdWJsaXNoZXIKKyAgICAgKiB3YXMgY2xvc2VkIGV4Y2VwdGlvbmFsbHksIHRoZW4gdGhlIHN1YnNjcmliZXIncyB7QGxpbmsKKyAgICAgKiBGbG93LlN1YnNjcmliZXIjb25FcnJvciBvbkVycm9yfSBtZXRob2QgaXMgaW52b2tlZCB3aXRoIHRoZQorICAgICAqIGNvcnJlc3BvbmRpbmcgZXhjZXB0aW9uLCBvciBpZiBjbG9zZWQgd2l0aG91dCBleGNlcHRpb24sIHRoZQorICAgICAqIHN1YnNjcmliZXIncyB7QGxpbmsgRmxvdy5TdWJzY3JpYmVyI29uQ29tcGxldGUoKSBvbkNvbXBsZXRlfQorICAgICAqIG1ldGhvZCBpcyBpbnZva2VkLiAgU3Vic2NyaWJlcnMgbWF5IGVuYWJsZSByZWNlaXZpbmcgaXRlbXMgYnkKKyAgICAgKiBpbnZva2luZyB0aGUge0BsaW5rIEZsb3cuU3Vic2NyaXB0aW9uI3JlcXVlc3QobG9uZykgcmVxdWVzdH0KKyAgICAgKiBtZXRob2Qgb2YgdGhlIG5ldyBTdWJzY3JpcHRpb24sIGFuZCBtYXkgdW5zdWJzY3JpYmUgYnkgaW52b2tpbmcKKyAgICAgKiBpdHMge0BsaW5rIEZsb3cuU3Vic2NyaXB0aW9uI2NhbmNlbCgpIGNhbmNlbH0gbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIHN1YnNjcmliZXIgdGhlIHN1YnNjcmliZXIKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHN1YnNjcmliZXIgaXMgbnVsbAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN1YnNjcmliZShGbG93LlN1YnNjcmliZXI8PyBzdXBlciBUPiBzdWJzY3JpYmVyKSB7CisgICAgICAgIGlmIChzdWJzY3JpYmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIEJ1ZmZlcmVkU3Vic2NyaXB0aW9uPFQ+IHN1YnNjcmlwdGlvbiA9CisgICAgICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkU3Vic2NyaXB0aW9uPFQ+KHN1YnNjcmliZXIsIGV4ZWN1dG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgb25OZXh0SGFuZGxlciwgbWF4QnVmZmVyQ2FwYWNpdHkpOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGZvciAoQnVmZmVyZWRTdWJzY3JpcHRpb248VD4gYiA9IGNsaWVudHMsIHByZWQgPSBudWxsOzspIHsKKyAgICAgICAgICAgICAgICBpZiAoYiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIFRocm93YWJsZSBleDsKKyAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uLm9uU3Vic2NyaWJlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICgoZXggPSBjbG9zZWRFeGNlcHRpb24pICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5vbkVycm9yKGV4KTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjbG9zZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5vbkNvbXBsZXRlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJlZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRzID0gc3Vic2NyaXB0aW9uOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJlZC5uZXh0ID0gc3Vic2NyaXB0aW9uOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBCdWZmZXJlZFN1YnNjcmlwdGlvbjxUPiBuZXh0ID0gYi5uZXh0OworICAgICAgICAgICAgICAgIGlmIChiLmlzRGlzYWJsZWQoKSkgeyAvLyByZW1vdmUKKyAgICAgICAgICAgICAgICAgICAgYi5uZXh0ID0gbnVsbDsgICAgLy8gZGV0YWNoCisgICAgICAgICAgICAgICAgICAgIGlmIChwcmVkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudHMgPSBuZXh0OworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJlZC5uZXh0ID0gbmV4dDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3Vic2NyaWJlci5lcXVhbHMoYi5zdWJzY3JpYmVyKSkgeworICAgICAgICAgICAgICAgICAgICBiLm9uRXJyb3IobmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRHVwbGljYXRlIHN1YnNjcmliZSIpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcHJlZCA9IGI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGIgPSBuZXh0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUHVibGlzaGVzIHRoZSBnaXZlbiBpdGVtIHRvIGVhY2ggY3VycmVudCBzdWJzY3JpYmVyIGJ5CisgICAgICogYXN5bmNocm9ub3VzbHkgaW52b2tpbmcgaXRzIHtAbGluayBGbG93LlN1YnNjcmliZXIjb25OZXh0KE9iamVjdCkKKyAgICAgKiBvbk5leHR9IG1ldGhvZCwgYmxvY2tpbmcgdW5pbnRlcnJ1cHRpYmx5IHdoaWxlIHJlc291cmNlcyBmb3IgYW55CisgICAgICogc3Vic2NyaWJlciBhcmUgdW5hdmFpbGFibGUuIFRoaXMgbWV0aG9kIHJldHVybnMgYW4gZXN0aW1hdGUgb2YKKyAgICAgKiB0aGUgbWF4aW11bSBsYWcgKG51bWJlciBvZiBpdGVtcyBzdWJtaXR0ZWQgYnV0IG5vdCB5ZXQgY29uc3VtZWQpCisgICAgICogYW1vbmcgYWxsIGN1cnJlbnQgc3Vic2NyaWJlcnMuIFRoaXMgdmFsdWUgaXMgYXQgbGVhc3Qgb25lCisgICAgICogKGFjY291bnRpbmcgZm9yIHRoaXMgc3VibWl0dGVkIGl0ZW0pIGlmIHRoZXJlIGFyZSBhbnkKKyAgICAgKiBzdWJzY3JpYmVycywgZWxzZSB6ZXJvLgorICAgICAqIDxwPgorICAgICAqIDxwPklmIHRoZSBFeGVjdXRvciBmb3IgdGhpcyBwdWJsaXNoZXIgdGhyb3dzIGEKKyAgICAgKiBSZWplY3RlZEV4ZWN1dGlvbkV4Y2VwdGlvbiAob3IgYW55IG90aGVyIFJ1bnRpbWVFeGNlcHRpb24gb3IKKyAgICAgKiBFcnJvcikgd2hlbiBhdHRlbXB0aW5nIHRvIGFzeW5jaHJvbm91c2x5IG5vdGlmeSBzdWJzY3JpYmVycywKKyAgICAgKiB0aGVuIHRoaXMgZXhjZXB0aW9uIGlzIHJldGhyb3duLCBpbiB3aGljaCBjYXNlIG5vdCBhbGwKKyAgICAgKiBzdWJzY3JpYmVycyB3aWxsIGhhdmUgYmVlbiBpc3N1ZWQgdGhpcyBpdGVtLgorICAgICAqCisgICAgICogQHBhcmFtIGl0ZW0gdGhlIChub24tbnVsbCkgaXRlbSB0byBwdWJsaXNoCisgICAgICogQHJldHVybiB0aGUgZXN0aW1hdGVkIG1heGltdW0gbGFnIGFtb25nIHN1YnNjcmliZXJzCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gICAgICBpZiBjbG9zZWQKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uICAgICAgIGlmIGl0ZW0gaXMgbnVsbAorICAgICAqIEB0aHJvd3MgUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb24gaWYgdGhyb3duIGJ5IEV4ZWN1dG9yCisgICAgICovCisgICAgcHVibGljIGludCBzdWJtaXQoVCBpdGVtKSB7CisgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGludCBsYWcgPSAwOworICAgICAgICBib29sZWFuIGNvbXBsZXRlOworICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgIGNvbXBsZXRlID0gY2xvc2VkOworICAgICAgICAgICAgQnVmZmVyZWRTdWJzY3JpcHRpb248VD4gYiA9IGNsaWVudHM7CisgICAgICAgICAgICBpZiAoIWNvbXBsZXRlKSB7CisgICAgICAgICAgICAgICAgQnVmZmVyZWRTdWJzY3JpcHRpb248VD4gcHJlZCA9IG51bGwsIHIgPSBudWxsLCBydGFpbCA9IG51bGw7CisgICAgICAgICAgICAgICAgd2hpbGUgKGIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBCdWZmZXJlZFN1YnNjcmlwdGlvbjxUPiBuZXh0ID0gYi5uZXh0OworICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdCA9IGIub2ZmZXIoaXRlbSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0IDwgMCkgeyAgICAgICAgICAgLy8gZGlzYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIGIubmV4dCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJlZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50cyA9IG5leHQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWQubmV4dCA9IG5leHQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdCA+IGxhZykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhZyA9IHN0YXQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXQgPT0gMCkgeyAvLyBwbGFjZSBvbiByZXRyeSBsaXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYi5uZXh0UmV0cnkgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChydGFpbCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIgPSBiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0YWlsLm5leHRSZXRyeSA9IGI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0YWlsID0gYjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWQgPSBiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGIgPSBuZXh0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSAociAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcmVkU3Vic2NyaXB0aW9uPFQ+IG5leHRSZXRyeSA9IHIubmV4dFJldHJ5OworICAgICAgICAgICAgICAgICAgICByLm5leHRSZXRyeSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGludCBzdGF0ID0gci5zdWJtaXQoaXRlbSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ID4gbGFnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsYWcgPSBzdGF0OworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXQgPCAwICYmIGNsaWVudHMgPT0gcikgeworICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50cyA9IHIubmV4dDsgLy8gcG9zdHBvbmUgaW50ZXJuYWwgdW5zdWJzY3JpYmVzCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgciA9IG5leHRSZXRyeTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbXBsZXRlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDbG9zZWQiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBsYWc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQdWJsaXNoZXMgdGhlIGdpdmVuIGl0ZW0sIGlmIHBvc3NpYmxlLCB0byBlYWNoIGN1cnJlbnQgc3Vic2NyaWJlcgorICAgICAqIGJ5IGFzeW5jaHJvbm91c2x5IGludm9raW5nIGl0cyB7QGxpbmsKKyAgICAgKiBGbG93LlN1YnNjcmliZXIjb25OZXh0KE9iamVjdCkgb25OZXh0fSBtZXRob2QuIFRoZSBpdGVtIG1heSBiZQorICAgICAqIGRyb3BwZWQgYnkgb25lIG9yIG1vcmUgc3Vic2NyaWJlcnMgaWYgcmVzb3VyY2UgbGltaXRzIGFyZQorICAgICAqIGV4Y2VlZGVkLCBpbiB3aGljaCBjYXNlIHRoZSBnaXZlbiBoYW5kbGVyIChpZiBub24tbnVsbCkgaXMKKyAgICAgKiBpbnZva2VkLCBhbmQgaWYgaXQgcmV0dXJucyB0cnVlLCByZXRyaWVkIG9uY2UuICBPdGhlciBjYWxscyB0bworICAgICAqIG1ldGhvZHMgaW4gdGhpcyBjbGFzcyBieSBvdGhlciB0aHJlYWRzIGFyZSBibG9ja2VkIHdoaWxlIHRoZQorICAgICAqIGhhbmRsZXIgaXMgaW52b2tlZC4gIFVubGVzcyByZWNvdmVyeSBpcyBhc3N1cmVkLCBvcHRpb25zIGFyZQorICAgICAqIHVzdWFsbHkgbGltaXRlZCB0byBsb2dnaW5nIHRoZSBlcnJvciBhbmQvb3IgaXNzdWluZyBhbiB7QGxpbmsKKyAgICAgKiBGbG93LlN1YnNjcmliZXIjb25FcnJvcihUaHJvd2FibGUpIG9uRXJyb3J9IHNpZ25hbCB0byB0aGUKKyAgICAgKiBzdWJzY3JpYmVyLgorICAgICAqIDxwPgorICAgICAqIDxwPlRoaXMgbWV0aG9kIHJldHVybnMgYSBzdGF0dXMgaW5kaWNhdG9yOiBJZiBuZWdhdGl2ZSwgaXQKKyAgICAgKiByZXByZXNlbnRzIHRoZSAobmVnYXRpdmUpIG51bWJlciBvZiBkcm9wcyAoZmFpbGVkIGF0dGVtcHRzIHRvCisgICAgICogaXNzdWUgdGhlIGl0ZW0gdG8gYSBzdWJzY3JpYmVyKS4gT3RoZXJ3aXNlIGl0IGlzIGFuIGVzdGltYXRlIG9mCisgICAgICogdGhlIG1heGltdW0gbGFnIChudW1iZXIgb2YgaXRlbXMgc3VibWl0dGVkIGJ1dCBub3QgeWV0CisgICAgICogY29uc3VtZWQpIGFtb25nIGFsbCBjdXJyZW50IHN1YnNjcmliZXJzLiBUaGlzIHZhbHVlIGlzIGF0IGxlYXN0CisgICAgICogb25lIChhY2NvdW50aW5nIGZvciB0aGlzIHN1Ym1pdHRlZCBpdGVtKSBpZiB0aGVyZSBhcmUgYW55CisgICAgICogc3Vic2NyaWJlcnMsIGVsc2UgemVyby4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5JZiB0aGUgRXhlY3V0b3IgZm9yIHRoaXMgcHVibGlzaGVyIHRocm93cyBhCisgICAgICogUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb24gKG9yIGFueSBvdGhlciBSdW50aW1lRXhjZXB0aW9uIG9yCisgICAgICogRXJyb3IpIHdoZW4gYXR0ZW1wdGluZyB0byBhc3luY2hyb25vdXNseSBub3RpZnkgc3Vic2NyaWJlcnMsIG9yCisgICAgICogdGhlIGRyb3AgaGFuZGxlciB0aHJvd3MgYW4gZXhjZXB0aW9uIHdoZW4gcHJvY2Vzc2luZyBhIGRyb3BwZWQKKyAgICAgKiBpdGVtLCB0aGVuIHRoaXMgZXhjZXB0aW9uIGlzIHJldGhyb3duLgorICAgICAqCisgICAgICogQHBhcmFtIGl0ZW0gICB0aGUgKG5vbi1udWxsKSBpdGVtIHRvIHB1Ymxpc2gKKyAgICAgKiBAcGFyYW0gb25Ecm9wIGlmIG5vbi1udWxsLCB0aGUgaGFuZGxlciBpbnZva2VkIHVwb24gYSBkcm9wIHRvIGEKKyAgICAgKiAgICAgICAgICAgICAgIHN1YnNjcmliZXIsIHdpdGggYXJndW1lbnRzIG9mIHRoZSBzdWJzY3JpYmVyIGFuZCBpdGVtOyBpZiBpdAorICAgICAqICAgICAgICAgICAgICAgcmV0dXJucyB0cnVlLCBhbiBvZmZlciBpcyByZS1hdHRlbXB0ZWQgKG9uY2UpCisgICAgICogQHJldHVybiBpZiBuZWdhdGl2ZSwgdGhlIChuZWdhdGl2ZSkgbnVtYmVyIG9mIGRyb3BzOyBvdGhlcndpc2UKKyAgICAgKiBhbiBlc3RpbWF0ZSBvZiBtYXhpbXVtIGxhZworICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uICAgICAgaWYgY2xvc2VkCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiAgICAgICBpZiBpdGVtIGlzIG51bGwKKyAgICAgKiBAdGhyb3dzIFJlamVjdGVkRXhlY3V0aW9uRXhjZXB0aW9uIGlmIHRocm93biBieSBFeGVjdXRvcgorICAgICAqLworICAgIHB1YmxpYyBpbnQgb2ZmZXIoVCBpdGVtLAorICAgICAgICAgICAgICAgICAgICAgQmlQcmVkaWNhdGU8Rmxvdy5TdWJzY3JpYmVyPD8gc3VwZXIgVD4sID8gc3VwZXIgVD4gb25Ecm9wKSB7CisgICAgICAgIHJldHVybiBkb09mZmVyKDBMLCBpdGVtLCBvbkRyb3ApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFB1Ymxpc2hlcyB0aGUgZ2l2ZW4gaXRlbSwgaWYgcG9zc2libGUsIHRvIGVhY2ggY3VycmVudCBzdWJzY3JpYmVyCisgICAgICogYnkgYXN5bmNocm9ub3VzbHkgaW52b2tpbmcgaXRzIHtAbGluaworICAgICAqIEZsb3cuU3Vic2NyaWJlciNvbk5leHQoT2JqZWN0KSBvbk5leHR9IG1ldGhvZCwgYmxvY2tpbmcgd2hpbGUKKyAgICAgKiByZXNvdXJjZXMgZm9yIGFueSBzdWJzY3JpcHRpb24gYXJlIHVuYXZhaWxhYmxlLCB1cCB0byB0aGUKKyAgICAgKiBzcGVjaWZpZWQgdGltZW91dCBvciB1bnRpbCB0aGUgY2FsbGVyIHRocmVhZCBpcyBpbnRlcnJ1cHRlZCwgYXQKKyAgICAgKiB3aGljaCBwb2ludCB0aGUgZ2l2ZW4gaGFuZGxlciAoaWYgbm9uLW51bGwpIGlzIGludm9rZWQsIGFuZCBpZiBpdAorICAgICAqIHJldHVybnMgdHJ1ZSwgcmV0cmllZCBvbmNlLiAoVGhlIGRyb3AgaGFuZGxlciBtYXkgZGlzdGluZ3Vpc2gKKyAgICAgKiB0aW1lb3V0cyBmcm9tIGludGVycnVwdHMgYnkgY2hlY2tpbmcgd2hldGhlciB0aGUgY3VycmVudCB0aHJlYWQKKyAgICAgKiBpcyBpbnRlcnJ1cHRlZC4pICBPdGhlciBjYWxscyB0byBtZXRob2RzIGluIHRoaXMgY2xhc3MgYnkgb3RoZXIKKyAgICAgKiB0aHJlYWRzIGFyZSBibG9ja2VkIHdoaWxlIHRoZSBoYW5kbGVyIGlzIGludm9rZWQuICBVbmxlc3MKKyAgICAgKiByZWNvdmVyeSBpcyBhc3N1cmVkLCBvcHRpb25zIGFyZSB1c3VhbGx5IGxpbWl0ZWQgdG8gbG9nZ2luZyB0aGUKKyAgICAgKiBlcnJvciBhbmQvb3IgaXNzdWluZyBhbiB7QGxpbmsgRmxvdy5TdWJzY3JpYmVyI29uRXJyb3IoVGhyb3dhYmxlKQorICAgICAqIG9uRXJyb3J9IHNpZ25hbCB0byB0aGUgc3Vic2NyaWJlci4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD5UaGlzIG1ldGhvZCByZXR1cm5zIGEgc3RhdHVzIGluZGljYXRvcjogSWYgbmVnYXRpdmUsIGl0CisgICAgICogcmVwcmVzZW50cyB0aGUgKG5lZ2F0aXZlKSBudW1iZXIgb2YgZHJvcHMgKGZhaWxlZCBhdHRlbXB0cyB0bworICAgICAqIGlzc3VlIHRoZSBpdGVtIHRvIGEgc3Vic2NyaWJlcikuIE90aGVyd2lzZSBpdCBpcyBhbiBlc3RpbWF0ZSBvZgorICAgICAqIHRoZSBtYXhpbXVtIGxhZyAobnVtYmVyIG9mIGl0ZW1zIHN1Ym1pdHRlZCBidXQgbm90IHlldAorICAgICAqIGNvbnN1bWVkKSBhbW9uZyBhbGwgY3VycmVudCBzdWJzY3JpYmVycy4gVGhpcyB2YWx1ZSBpcyBhdCBsZWFzdAorICAgICAqIG9uZSAoYWNjb3VudGluZyBmb3IgdGhpcyBzdWJtaXR0ZWQgaXRlbSkgaWYgdGhlcmUgYXJlIGFueQorICAgICAqIHN1YnNjcmliZXJzLCBlbHNlIHplcm8uCisgICAgICogPHA+CisgICAgICogPHA+SWYgdGhlIEV4ZWN1dG9yIGZvciB0aGlzIHB1Ymxpc2hlciB0aHJvd3MgYQorICAgICAqIFJlamVjdGVkRXhlY3V0aW9uRXhjZXB0aW9uIChvciBhbnkgb3RoZXIgUnVudGltZUV4Y2VwdGlvbiBvcgorICAgICAqIEVycm9yKSB3aGVuIGF0dGVtcHRpbmcgdG8gYXN5bmNocm9ub3VzbHkgbm90aWZ5IHN1YnNjcmliZXJzLCBvcgorICAgICAqIHRoZSBkcm9wIGhhbmRsZXIgdGhyb3dzIGFuIGV4Y2VwdGlvbiB3aGVuIHByb2Nlc3NpbmcgYSBkcm9wcGVkCisgICAgICogaXRlbSwgdGhlbiB0aGlzIGV4Y2VwdGlvbiBpcyByZXRocm93bi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpdGVtICAgIHRoZSAobm9uLW51bGwpIGl0ZW0gdG8gcHVibGlzaAorICAgICAqIEBwYXJhbSB0aW1lb3V0IGhvdyBsb25nIHRvIHdhaXQgZm9yIHJlc291cmNlcyBmb3IgYW55IHN1YnNjcmliZXIKKyAgICAgKiAgICAgICAgICAgICAgICBiZWZvcmUgZ2l2aW5nIHVwLCBpbiB1bml0cyBvZiB7QGNvZGUgdW5pdH0KKyAgICAgKiBAcGFyYW0gdW5pdCAgICBhIHtAY29kZSBUaW1lVW5pdH0gZGV0ZXJtaW5pbmcgaG93IHRvIGludGVycHJldCB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICB7QGNvZGUgdGltZW91dH0gcGFyYW1ldGVyCisgICAgICogQHBhcmFtIG9uRHJvcCAgaWYgbm9uLW51bGwsIHRoZSBoYW5kbGVyIGludm9rZWQgdXBvbiBhIGRyb3AgdG8gYQorICAgICAqICAgICAgICAgICAgICAgIHN1YnNjcmliZXIsIHdpdGggYXJndW1lbnRzIG9mIHRoZSBzdWJzY3JpYmVyIGFuZCBpdGVtOyBpZiBpdAorICAgICAqICAgICAgICAgICAgICAgIHJldHVybnMgdHJ1ZSwgYW4gb2ZmZXIgaXMgcmUtYXR0ZW1wdGVkIChvbmNlKQorICAgICAqIEByZXR1cm4gaWYgbmVnYXRpdmUsIHRoZSAobmVnYXRpdmUpIG51bWJlciBvZiBkcm9wczsgb3RoZXJ3aXNlCisgICAgICogYW4gZXN0aW1hdGUgb2YgbWF4aW11bSBsYWcKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiAgICAgIGlmIGNsb3NlZAorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gICAgICAgaWYgaXRlbSBpcyBudWxsCisgICAgICogQHRocm93cyBSZWplY3RlZEV4ZWN1dGlvbkV4Y2VwdGlvbiBpZiB0aHJvd24gYnkgRXhlY3V0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IG9mZmVyKFQgaXRlbSwgbG9uZyB0aW1lb3V0LCBUaW1lVW5pdCB1bml0LAorICAgICAgICAgICAgICAgICAgICAgQmlQcmVkaWNhdGU8Rmxvdy5TdWJzY3JpYmVyPD8gc3VwZXIgVD4sID8gc3VwZXIgVD4gb25Ecm9wKSB7CisgICAgICAgIHJldHVybiBkb09mZmVyKHVuaXQudG9OYW5vcyh0aW1lb3V0KSwgaXRlbSwgb25Ecm9wKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21tb24gaW1wbGVtZW50YXRpb24gZm9yIGJvdGggZm9ybXMgb2Ygb2ZmZXIKKyAgICAgKi8KKyAgICBmaW5hbCBpbnQgZG9PZmZlcihsb25nIG5hbm9zLCBUIGl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgQmlQcmVkaWNhdGU8Rmxvdy5TdWJzY3JpYmVyPD8gc3VwZXIgVD4sID8gc3VwZXIgVD4gb25Ecm9wKSB7CisgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGludCBsYWcgPSAwLCBkcm9wcyA9IDA7CisgICAgICAgIGJvb2xlYW4gY29tcGxldGU7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgY29tcGxldGUgPSBjbG9zZWQ7CisgICAgICAgICAgICBCdWZmZXJlZFN1YnNjcmlwdGlvbjxUPiBiID0gY2xpZW50czsKKyAgICAgICAgICAgIGlmICghY29tcGxldGUpIHsKKyAgICAgICAgICAgICAgICBCdWZmZXJlZFN1YnNjcmlwdGlvbjxUPiBwcmVkID0gbnVsbCwgciA9IG51bGwsIHJ0YWlsID0gbnVsbDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoYiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcmVkU3Vic2NyaXB0aW9uPFQ+IG5leHQgPSBiLm5leHQ7CisgICAgICAgICAgICAgICAgICAgIGludCBzdGF0ID0gYi5vZmZlcihpdGVtKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBiLm5leHQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudHMgPSBuZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkLm5leHQgPSBuZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXQgPiBsYWcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWcgPSBzdGF0OworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiLm5leHRSZXRyeSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJ0YWlsID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IGI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRhaWwubmV4dFJldHJ5ID0gYjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRhaWwgPSBiOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0ID4gbGFnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFnID0gc3RhdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWQgPSBiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGIgPSBuZXh0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSAociAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcmVkU3Vic2NyaXB0aW9uPFQ+IG5leHRSZXRyeSA9IHIubmV4dFJldHJ5OworICAgICAgICAgICAgICAgICAgICByLm5leHRSZXRyeSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGludCBzdGF0ID0gKG5hbm9zID4gMEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyByLnRpbWVkT2ZmZXIoaXRlbSwgbmFub3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiByLm9mZmVyKGl0ZW0pOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdCA9PSAwICYmIG9uRHJvcCAhPSBudWxsICYmIG9uRHJvcC50ZXN0KHIuc3Vic2NyaWJlciwgaXRlbSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXQgPSByLm9mZmVyKGl0ZW0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrZHJvcHM7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdCA+IGxhZykgeworICAgICAgICAgICAgICAgICAgICAgICAgbGFnID0gc3RhdDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0IDwgMCAmJiBjbGllbnRzID09IHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudHMgPSByLm5leHQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgciA9IG5leHRSZXRyeTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbXBsZXRlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDbG9zZWQiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAoZHJvcHMgPiAwKSA/IC1kcm9wcyA6IGxhZzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFVubGVzcyBhbHJlYWR5IGNsb3NlZCwgaXNzdWVzIHtAbGluaworICAgICAqIEZsb3cuU3Vic2NyaWJlciNvbkNvbXBsZXRlKCkgb25Db21wbGV0ZX0gc2lnbmFscyB0byBjdXJyZW50CisgICAgICogc3Vic2NyaWJlcnMsIGFuZCBkaXNhbGxvd3Mgc3Vic2VxdWVudCBhdHRlbXB0cyB0byBwdWJsaXNoLgorICAgICAqIFVwb24gcmV0dXJuLCB0aGlzIG1ldGhvZCBkb2VzIDxlbT5OT1Q8L2VtPiBndWFyYW50ZWUgdGhhdCBhbGwKKyAgICAgKiBzdWJzY3JpYmVycyBoYXZlIHlldCBjb21wbGV0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIGlmICghY2xvc2VkKSB7CisgICAgICAgICAgICBCdWZmZXJlZFN1YnNjcmlwdGlvbjxUPiBiOworICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgYiA9IGNsaWVudHM7CisgICAgICAgICAgICAgICAgY2xpZW50cyA9IG51bGw7CisgICAgICAgICAgICAgICAgY2xvc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdoaWxlIChiICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBCdWZmZXJlZFN1YnNjcmlwdGlvbjxUPiBuZXh0ID0gYi5uZXh0OworICAgICAgICAgICAgICAgIGIubmV4dCA9IG51bGw7CisgICAgICAgICAgICAgICAgYi5vbkNvbXBsZXRlKCk7CisgICAgICAgICAgICAgICAgYiA9IG5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVbmxlc3MgYWxyZWFkeSBjbG9zZWQsIGlzc3VlcyB7QGxpbmsKKyAgICAgKiBGbG93LlN1YnNjcmliZXIjb25FcnJvcihUaHJvd2FibGUpIG9uRXJyb3J9IHNpZ25hbHMgdG8gY3VycmVudAorICAgICAqIHN1YnNjcmliZXJzIHdpdGggdGhlIGdpdmVuIGVycm9yLCBhbmQgZGlzYWxsb3dzIHN1YnNlcXVlbnQKKyAgICAgKiBhdHRlbXB0cyB0byBwdWJsaXNoLiAgRnV0dXJlIHN1YnNjcmliZXJzIGFsc28gcmVjZWl2ZSB0aGUgZ2l2ZW4KKyAgICAgKiBlcnJvci4gVXBvbiByZXR1cm4sIHRoaXMgbWV0aG9kIGRvZXMgPGVtPk5PVDwvZW0+IGd1YXJhbnRlZQorICAgICAqIHRoYXQgYWxsIHN1YnNjcmliZXJzIGhhdmUgeWV0IGNvbXBsZXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlcnJvciB0aGUge0Bjb2RlIG9uRXJyb3J9IGFyZ3VtZW50IHNlbnQgdG8gc3Vic2NyaWJlcnMKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGVycm9yIGlzIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZUV4Y2VwdGlvbmFsbHkoVGhyb3dhYmxlIGVycm9yKSB7CisgICAgICAgIGlmIChlcnJvciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWNsb3NlZCkgeworICAgICAgICAgICAgQnVmZmVyZWRTdWJzY3JpcHRpb248VD4gYjsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgICAgIGIgPSBjbGllbnRzOworICAgICAgICAgICAgICAgIGNsaWVudHMgPSBudWxsOworICAgICAgICAgICAgICAgIGNsb3NlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgY2xvc2VkRXhjZXB0aW9uID0gZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoYiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQnVmZmVyZWRTdWJzY3JpcHRpb248VD4gbmV4dCA9IGIubmV4dDsKKyAgICAgICAgICAgICAgICBiLm5leHQgPSBudWxsOworICAgICAgICAgICAgICAgIGIub25FcnJvcihlcnJvcik7CisgICAgICAgICAgICAgICAgYiA9IG5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBwdWJsaXNoZXIgaXMgbm90IGFjY2VwdGluZyBzdWJtaXNzaW9ucy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBjbG9zZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Nsb3NlZCgpIHsKKyAgICAgICAgcmV0dXJuIGNsb3NlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBleGNlcHRpb24gYXNzb2NpYXRlZCB3aXRoIHtAbGluaworICAgICAqICNjbG9zZUV4Y2VwdGlvbmFsbHkoVGhyb3dhYmxlKSBjbG9zZUV4Y2VwdGlvbmFsbHl9LCBvciBudWxsIGlmCisgICAgICogbm90IGNsb3NlZCBvciBpZiBjbG9zZWQgbm9ybWFsbHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBleGNlcHRpb24sIG9yIG51bGwgaWYgbm9uZQorICAgICAqLworICAgIHB1YmxpYyBUaHJvd2FibGUgZ2V0Q2xvc2VkRXhjZXB0aW9uKCkgeworICAgICAgICByZXR1cm4gY2xvc2VkRXhjZXB0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHB1Ymxpc2hlciBoYXMgYW55IHN1YnNjcmliZXJzLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgcHVibGlzaGVyIGhhcyBhbnkgc3Vic2NyaWJlcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNTdWJzY3JpYmVycygpIHsKKyAgICAgICAgYm9vbGVhbiBub25FbXB0eSA9IGZhbHNlOworICAgICAgICBpZiAoIWNsb3NlZCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICAgICAgZm9yIChCdWZmZXJlZFN1YnNjcmlwdGlvbjxUPiBiID0gY2xpZW50czsgYiAhPSBudWxsOyApIHsKKyAgICAgICAgICAgICAgICAgICAgQnVmZmVyZWRTdWJzY3JpcHRpb248VD4gbmV4dCA9IGIubmV4dDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGIuaXNEaXNhYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBiLm5leHQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGNsaWVudHMgPSBuZXh0OworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbm9uRW1wdHkgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5vbkVtcHR5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjdXJyZW50IHN1YnNjcmliZXJzLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGN1cnJlbnQgc3Vic2NyaWJlcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE51bWJlck9mU3Vic2NyaWJlcnMoKSB7CisgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgIGlmICghY2xvc2VkKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICBCdWZmZXJlZFN1YnNjcmlwdGlvbjxUPiBwcmVkID0gbnVsbCwgbmV4dDsKKyAgICAgICAgICAgICAgICBmb3IgKEJ1ZmZlcmVkU3Vic2NyaXB0aW9uPFQ+IGIgPSBjbGllbnRzOyBiICE9IG51bGw7IGIgPSBuZXh0KSB7CisgICAgICAgICAgICAgICAgICAgIG5leHQgPSBiLm5leHQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChiLmlzRGlzYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYi5uZXh0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRzID0gbmV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZC5uZXh0ID0gbmV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWQgPSBiOworICAgICAgICAgICAgICAgICAgICAgICAgKytjb3VudDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgRXhlY3V0b3IgdXNlZCBmb3IgYXN5bmNocm9ub3VzIGRlbGl2ZXJ5LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgRXhlY3V0b3IgdXNlZCBmb3IgYXN5bmNocm9ub3VzIGRlbGl2ZXJ5CisgICAgICovCisgICAgcHVibGljIEV4ZWN1dG9yIGdldEV4ZWN1dG9yKCkgeworICAgICAgICByZXR1cm4gZXhlY3V0b3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBwZXItc3Vic2NyaWJlciBidWZmZXIgY2FwYWNpdHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBtYXhpbXVtIHBlci1zdWJzY3JpYmVyIGJ1ZmZlciBjYXBhY2l0eQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TWF4QnVmZmVyQ2FwYWNpdHkoKSB7CisgICAgICAgIHJldHVybiBtYXhCdWZmZXJDYXBhY2l0eTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBjdXJyZW50IHN1YnNjcmliZXJzIGZvciBtb25pdG9yaW5nIGFuZAorICAgICAqIHRyYWNraW5nIHB1cnBvc2VzLCBub3QgZm9yIGludm9raW5nIHtAbGluayBGbG93LlN1YnNjcmliZXJ9CisgICAgICogbWV0aG9kcyBvbiB0aGUgc3Vic2NyaWJlcnMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgY3VycmVudCBzdWJzY3JpYmVycworICAgICAqLworICAgIHB1YmxpYyBMaXN0PEZsb3cuU3Vic2NyaWJlcjw/IHN1cGVyIFQ+PiBnZXRTdWJzY3JpYmVycygpIHsKKyAgICAgICAgQXJyYXlMaXN0PEZsb3cuU3Vic2NyaWJlcjw/IHN1cGVyIFQ+PiBzdWJzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgQnVmZmVyZWRTdWJzY3JpcHRpb248VD4gcHJlZCA9IG51bGwsIG5leHQ7CisgICAgICAgICAgICBmb3IgKEJ1ZmZlcmVkU3Vic2NyaXB0aW9uPFQ+IGIgPSBjbGllbnRzOyBiICE9IG51bGw7IGIgPSBuZXh0KSB7CisgICAgICAgICAgICAgICAgbmV4dCA9IGIubmV4dDsKKyAgICAgICAgICAgICAgICBpZiAoYi5pc0Rpc2FibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYi5uZXh0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50cyA9IG5leHQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmVkLm5leHQgPSBuZXh0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3Vicy5hZGQoYi5zdWJzY3JpYmVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1YnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBTdWJzY3JpYmVyIGlzIGN1cnJlbnRseSBzdWJzY3JpYmVkLgorICAgICAqCisgICAgICogQHBhcmFtIHN1YnNjcmliZXIgdGhlIHN1YnNjcmliZXIKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgY3VycmVudGx5IHN1YnNjcmliZWQKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHN1YnNjcmliZXIgaXMgbnVsbAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU3Vic2NyaWJlZChGbG93LlN1YnNjcmliZXI8PyBzdXBlciBUPiBzdWJzY3JpYmVyKSB7CisgICAgICAgIGlmIChzdWJzY3JpYmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGlmICghY2xvc2VkKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKKyAgICAgICAgICAgICAgICBCdWZmZXJlZFN1YnNjcmlwdGlvbjxUPiBwcmVkID0gbnVsbCwgbmV4dDsKKyAgICAgICAgICAgICAgICBmb3IgKEJ1ZmZlcmVkU3Vic2NyaXB0aW9uPFQ+IGIgPSBjbGllbnRzOyBiICE9IG51bGw7IGIgPSBuZXh0KSB7CisgICAgICAgICAgICAgICAgICAgIG5leHQgPSBiLm5leHQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChiLmlzRGlzYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYi5uZXh0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmVkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRzID0gbmV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZC5uZXh0ID0gbmV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdWJzY3JpYmVyLmVxdWFscyhiLnN1YnNjcmliZXIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByZWQgPSBiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIGVzdGltYXRlIG9mIHRoZSBtaW5pbXVtIG51bWJlciBvZiBpdGVtcyByZXF1ZXN0ZWQKKyAgICAgKiAodmlhIHtAbGluayBGbG93LlN1YnNjcmlwdGlvbiNyZXF1ZXN0KGxvbmcpIHJlcXVlc3R9KSBidXQgbm90CisgICAgICogeWV0IHByb2R1Y2VkLCBhbW9uZyBhbGwgY3VycmVudCBzdWJzY3JpYmVycy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGVzdGltYXRlLCBvciB6ZXJvIGlmIG5vIHN1YnNjcmliZXJzCisgICAgICovCisgICAgcHVibGljIGxvbmcgZXN0aW1hdGVNaW5pbXVtRGVtYW5kKCkgeworICAgICAgICBsb25nIG1pbiA9IExvbmcuTUFYX1ZBTFVFOworICAgICAgICBib29sZWFuIG5vbkVtcHR5ID0gZmFsc2U7CisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgQnVmZmVyZWRTdWJzY3JpcHRpb248VD4gcHJlZCA9IG51bGwsIG5leHQ7CisgICAgICAgICAgICBmb3IgKEJ1ZmZlcmVkU3Vic2NyaXB0aW9uPFQ+IGIgPSBjbGllbnRzOyBiICE9IG51bGw7IGIgPSBuZXh0KSB7CisgICAgICAgICAgICAgICAgaW50IG47CisgICAgICAgICAgICAgICAgbG9uZyBkOworICAgICAgICAgICAgICAgIG5leHQgPSBiLm5leHQ7CisgICAgICAgICAgICAgICAgaWYgKChuID0gYi5lc3RpbWF0ZUxhZygpKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYi5uZXh0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50cyA9IG5leHQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcmVkLm5leHQgPSBuZXh0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChkID0gYi5kZW1hbmQgLSBuKSA8IG1pbikgeworICAgICAgICAgICAgICAgICAgICAgICAgbWluID0gZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBub25FbXB0eSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHByZWQgPSBiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbm9uRW1wdHkgPyBtaW4gOiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gZXN0aW1hdGUgb2YgdGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHByb2R1Y2VkIGJ1dAorICAgICAqIG5vdCB5ZXQgY29uc3VtZWQgYW1vbmcgYWxsIGN1cnJlbnQgc3Vic2NyaWJlcnMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBlc3RpbWF0ZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZXN0aW1hdGVNYXhpbXVtTGFnKCkgeworICAgICAgICBpbnQgbWF4ID0gMDsKKyAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7CisgICAgICAgICAgICBCdWZmZXJlZFN1YnNjcmlwdGlvbjxUPiBwcmVkID0gbnVsbCwgbmV4dDsKKyAgICAgICAgICAgIGZvciAoQnVmZmVyZWRTdWJzY3JpcHRpb248VD4gYiA9IGNsaWVudHM7IGIgIT0gbnVsbDsgYiA9IG5leHQpIHsKKyAgICAgICAgICAgICAgICBpbnQgbjsKKyAgICAgICAgICAgICAgICBuZXh0ID0gYi5uZXh0OworICAgICAgICAgICAgICAgIGlmICgobiA9IGIuZXN0aW1hdGVMYWcoKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGIubmV4dCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGlmIChwcmVkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudHMgPSBuZXh0OworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJlZC5uZXh0ID0gbmV4dDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChuID4gbWF4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXggPSBuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHByZWQgPSBiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbWF4OworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2Nlc3NlcyBhbGwgcHVibGlzaGVkIGl0ZW1zIHVzaW5nIHRoZSBnaXZlbiBDb25zdW1lciBmdW5jdGlvbi4KKyAgICAgKiBSZXR1cm5zIGEgQ29tcGxldGFibGVGdXR1cmUgdGhhdCBpcyBjb21wbGV0ZWQgbm9ybWFsbHkgd2hlbiB0aGlzCisgICAgICogcHVibGlzaGVyIHNpZ25hbHMge0BsaW5rIEZsb3cuU3Vic2NyaWJlciNvbkNvbXBsZXRlKCkKKyAgICAgKiBvbkNvbXBsZXRlfSwgb3IgY29tcGxldGVkIGV4Y2VwdGlvbmFsbHkgdXBvbiBhbnkgZXJyb3IsIG9yIGFuCisgICAgICogZXhjZXB0aW9uIGlzIHRocm93biBieSB0aGUgQ29uc3VtZXIsIG9yIHRoZSByZXR1cm5lZAorICAgICAqIENvbXBsZXRhYmxlRnV0dXJlIGlzIGNhbmNlbGxlZCwgaW4gd2hpY2ggY2FzZSBubyBmdXJ0aGVyIGl0ZW1zCisgICAgICogYXJlIHByb2Nlc3NlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25zdW1lciB0aGUgZnVuY3Rpb24gYXBwbGllZCB0byBlYWNoIG9uTmV4dCBpdGVtCisgICAgICogQHJldHVybiBhIENvbXBsZXRhYmxlRnV0dXJlIHRoYXQgaXMgY29tcGxldGVkIG5vcm1hbGx5CisgICAgICogd2hlbiB0aGUgcHVibGlzaGVyIHNpZ25hbHMgb25Db21wbGV0ZSwgYW5kIGV4Y2VwdGlvbmFsbHkKKyAgICAgKiB1cG9uIGFueSBlcnJvciBvciBjYW5jZWxsYXRpb24KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGNvbnN1bWVyIGlzIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4gY29uc3VtZShDb25zdW1lcjw/IHN1cGVyIFQ+IGNvbnN1bWVyKSB7CisgICAgICAgIGlmIChjb25zdW1lciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPiBzdGF0dXMgPSBuZXcgQ29tcGxldGFibGVGdXR1cmU8PigpOworICAgICAgICBzdWJzY3JpYmUobmV3IENvbnN1bWVyU3Vic2NyaWJlcjxUPihzdGF0dXMsIGNvbnN1bWVyKSk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3Vic2NyaWJlciBmb3IgbWV0aG9kIGNvbnN1bWUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBDb25zdW1lclN1YnNjcmliZXI8VD4KKyAgICAgICAgICAgIGltcGxlbWVudHMgRmxvdy5TdWJzY3JpYmVyPFQ+IHsKKyAgICAgICAgZmluYWwgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4gc3RhdHVzOworICAgICAgICBmaW5hbCBDb25zdW1lcjw/IHN1cGVyIFQ+IGNvbnN1bWVyOworICAgICAgICBGbG93LlN1YnNjcmlwdGlvbiBzdWJzY3JpcHRpb247CisKKyAgICAgICAgQ29uc3VtZXJTdWJzY3JpYmVyKENvbXBsZXRhYmxlRnV0dXJlPFZvaWQ+IHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN1bWVyPD8gc3VwZXIgVD4gY29uc3VtZXIpIHsKKyAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzOworICAgICAgICAgICAgdGhpcy5jb25zdW1lciA9IGNvbnN1bWVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZpbmFsIHZvaWQgb25TdWJzY3JpYmUoRmxvdy5TdWJzY3JpcHRpb24gc3Vic2NyaXB0aW9uKSB7CisgICAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHN1YnNjcmlwdGlvbjsKKyAgICAgICAgICAgIHN0YXR1cy53aGVuQ29tcGxldGUoKHYsIGUpIC0+IHN1YnNjcmlwdGlvbi5jYW5jZWwoKSk7CisgICAgICAgICAgICBpZiAoIXN0YXR1cy5pc0RvbmUoKSkgeworICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5yZXF1ZXN0KExvbmcuTUFYX1ZBTFVFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmaW5hbCB2b2lkIG9uRXJyb3IoVGhyb3dhYmxlIGV4KSB7CisgICAgICAgICAgICBzdGF0dXMuY29tcGxldGVFeGNlcHRpb25hbGx5KGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmaW5hbCB2b2lkIG9uQ29tcGxldGUoKSB7CisgICAgICAgICAgICBzdGF0dXMuY29tcGxldGUobnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmluYWwgdm9pZCBvbk5leHQoVCBpdGVtKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbnN1bWVyLmFjY2VwdChpdGVtKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBleCkgeworICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5jYW5jZWwoKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMuY29tcGxldGVFeGNlcHRpb25hbGx5KGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgdGFzayBmb3IgY29uc3VtaW5nIGJ1ZmZlciBpdGVtcyBhbmQgc2lnbmFscywgY3JlYXRlZCBhbmQKKyAgICAgKiBleGVjdXRlZCB3aGVuZXZlciB0aGV5IGJlY29tZSBhdmFpbGFibGUuIEEgdGFzayBjb25zdW1lcyBhcworICAgICAqIG1hbnkgaXRlbXMvc2lnbmFscyBhcyBwb3NzaWJsZSBiZWZvcmUgdGVybWluYXRpbmcsIGF0IHdoaWNoCisgICAgICogcG9pbnQgYW5vdGhlciB0YXNrIGlzIGNyZWF0ZWQgd2hlbiBuZWVkZWQuIFRoZSBkdWFsIFJ1bm5hYmxlCisgICAgICogYW5kIEZvcmtKb2luVGFzayBkZWNsYXJhdGlvbiBzYXZlcyBvdmVyaGVhZCB3aGVuIGV4ZWN1dGVkIGJ5CisgICAgICogRm9ya0pvaW5Qb29scywgd2l0aG91dCBpbXBhY3Rpbmcgb3RoZXIga2luZHMgb2YgRXhlY3V0b3JzLgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJzZXJpYWwiKQorICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBDb25zdW1lclRhc2s8VD4gZXh0ZW5kcyBGb3JrSm9pblRhc2s8Vm9pZD4KKyAgICAgICAgICAgIGltcGxlbWVudHMgUnVubmFibGUsIENvbXBsZXRhYmxlRnV0dXJlLkFzeW5jaHJvbm91c0NvbXBsZXRpb25UYXNrIHsKKyAgICAgICAgZmluYWwgQnVmZmVyZWRTdWJzY3JpcHRpb248VD4gY29uc3VtZXI7CisKKyAgICAgICAgQ29uc3VtZXJUYXNrKEJ1ZmZlcmVkU3Vic2NyaXB0aW9uPFQ+IGNvbnN1bWVyKSB7CisgICAgICAgICAgICB0aGlzLmNvbnN1bWVyID0gY29uc3VtZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmluYWwgVm9pZCBnZXRSYXdSZXN1bHQoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldFJhd1Jlc3VsdChWb2lkIHYpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGV4ZWMoKSB7CisgICAgICAgICAgICBjb25zdW1lci5jb25zdW1lKCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmluYWwgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBjb25zdW1lci5jb25zdW1lKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGJvdW5kZWQgKHJpbmcpIGJ1ZmZlciB3aXRoIGludGVncmF0ZWQgY29udHJvbCB0byBzdGFydCBhCisgICAgICogY29uc3VtZXIgdGFzayB3aGVuZXZlciBpdGVtcyBhcmUgYXZhaWxhYmxlLiAgVGhlIGJ1ZmZlcgorICAgICAqIGFsZ29yaXRobSBpcyBzaW1pbGFyIHRvIG9uZSB1c2VkIGluc2lkZSBGb3JrSm9pblBvb2wgKHNlZSBpdHMKKyAgICAgKiBpbnRlcm5hbCBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzKSBzcGVjaWFsaXplZCBmb3IgdGhlIGNhc2Ugb2YKKyAgICAgKiBhdCBtb3N0IG9uZSBjb25jdXJyZW50IHByb2R1Y2VyIGFuZCBjb25zdW1lciwgYW5kIHBvd2VyIG9mIHR3bworICAgICAqIGJ1ZmZlciBzaXplcy4gVGhpcyBhbGxvd3MgbWV0aG9kcyB0byBvcGVyYXRlIHdpdGhvdXQgbG9ja3MgZXZlbgorICAgICAqIHdoaWxlIHN1cHBvcnRpbmcgcmVzaXppbmcsIGJsb2NraW5nLCB0YXNrLXRyaWdnZXJpbmcsIGFuZAorICAgICAqIGdhcmJhZ2UtZnJlZSBidWZmZXJzIChudWxsaW5nIG91dCBlbGVtZW50cyB3aGVuIGNvbnN1bWVkKSwKKyAgICAgKiBhbHRob3VnaCBzdXBwb3J0aW5nIHRoZXNlIGRvZXMgaW1wb3NlIGEgYml0IG9mIG92ZXJoZWFkCisgICAgICogY29tcGFyZWQgdG8gcGxhaW4gZml4ZWQtc2l6ZSByaW5nIGJ1ZmZlcnMuCisgICAgICogPHA+CisgICAgICogVGhlIHB1Ymxpc2hlciBndWFyYW50ZWVzIGEgc2luZ2xlIHByb2R1Y2VyIHZpYSBpdHMgbG9jay4gIFdlCisgICAgICogZW5zdXJlIGluIHRoaXMgY2xhc3MgdGhhdCB0aGVyZSBpcyBhdCBtb3N0IG9uZSBjb25zdW1lci4gIFRoZQorICAgICAqIHJlcXVlc3QgYW5kIGNhbmNlbCBtZXRob2RzIG11c3QgYmUgZnVsbHkgdGhyZWFkLXNhZmUgYnV0IGFyZQorICAgICAqIGNvZGVkIHRvIGV4cGxvaXQgdGhlIG1vc3QgY29tbW9uIGNhc2UgaW4gd2hpY2ggdGhleSBhcmUgb25seQorICAgICAqIGNhbGxlZCBieSBjb25zdW1lcnMgKHVzdWFsbHkgd2l0aGluIG9uTmV4dCkuCisgICAgICogPHA+CisgICAgICogRXhlY3V0aW9uIGNvbnRyb2wgaXMgbWFuYWdlZCB1c2luZyB0aGUgQUNUSVZFIGN0bCBiaXQuIFdlCisgICAgICogZW5zdXJlIHRoYXQgYSB0YXNrIGlzIGFjdGl2ZSB3aGVuIGNvbnN1bWFibGUgaXRlbXMgKGFuZAorICAgICAqIHVzdWFsbHksIFNVQlNDUklCRSwgRVJST1Igb3IgQ09NUExFVEUgc2lnbmFscykgYXJlIHByZXNlbnQgYW5kCisgICAgICogdGhlcmUgaXMgZGVtYW5kICh1bmZpbGxlZCByZXF1ZXN0cykuICBUaGlzIGlzIGNvbXBsaWNhdGVkIG9uCisgICAgICogdGhlIGNyZWF0aW9uIHNpZGUgYnkgdGhlIHBvc3NpYmlsaXR5IG9mIGV4Y2VwdGlvbnMgd2hlbiB0cnlpbmcKKyAgICAgKiB0byBleGVjdXRlIHRhc2tzLiBUaGVzZSBldmVudHVhbGx5IGZvcmNlIERJU0FCTEVEIHN0YXRlLCBidXQKKyAgICAgKiBzb21ldGltZXMgbm90IGRpcmVjdGx5LiBPbiB0aGUgdGFzayBzaWRlLCB0ZXJtaW5hdGlvbiAoY2xlYXJpbmcKKyAgICAgKiBBQ1RJVkUpIHRoYXQgd291bGQgb3RoZXJ3aXNlIHJhY2Ugd2l0aCBwcm9kdWNlcnMgb3IgcmVxdWVzdCgpCisgICAgICogY2FsbHMgdXNlcyB0aGUgQ09OU1VNRSBrZWVwLWFsaXZlIGJpdCB0byBmb3JjZSBhIHJlY2hlY2suCisgICAgICogPHA+CisgICAgICogVGhlIGN0bCBmaWVsZCBhbHNvIG1hbmFnZXMgcnVuIHN0YXRlLiBXaGVuIERJU0FCTEVELCBubyBmdXJ0aGVyCisgICAgICogdXBkYXRlcyBhcmUgcG9zc2libGUuIERpc2FibGluZyBtYXkgYmUgcHJlY2VkZWQgYnkgc2V0dGluZworICAgICAqIEVSUk9SIG9yIENPTVBMRVRFIChvciBib3RoIC0tIEVSUk9SIGhhcyBwcmVjZWRlbmNlKSwgaW4gd2hpY2gKKyAgICAgKiBjYXNlIHRoZSBhc3NvY2lhdGVkIFN1YnNjcmliZXIgbWV0aG9kcyBhcmUgaW52b2tlZCwgcG9zc2libHkKKyAgICAgKiBzeW5jaHJvbm91c2x5IGlmIHRoZXJlIGlzIG5vIGFjdGl2ZSBjb25zdW1lciB0YXNrIChpbmNsdWRpbmcKKyAgICAgKiBjYXNlcyB3aGVyZSBleGVjdXRlKCkgZmFpbGVkKS4gVGhlIGNhbmNlbCgpIG1ldGhvZCBpcyBzdXBwb3J0ZWQKKyAgICAgKiBieSB0cmVhdGluZyBhcyBFUlJPUiBidXQgc3VwcHJlc3Npbmcgb25FcnJvciBzaWduYWwuCisgICAgICogPHA+CisgICAgICogU3VwcG9ydCBmb3IgYmxvY2tpbmcgYWxzbyBleHBsb2l0cyB0aGUgZmFjdCB0aGF0IHRoZXJlIGlzIG9ubHkKKyAgICAgKiBvbmUgcG9zc2libGUgd2FpdGVyLiBNYW5hZ2VkQmxvY2tlci1jb21wYXRpYmxlIGNvbnRyb2wgZmllbGRzCisgICAgICogYXJlIHBsYWNlZCBpbiB0aGlzIGNsYXNzIGl0c2VsZiByYXRoZXIgdGhhbiBpbiB3YWl0LW5vZGVzLgorICAgICAqIEJsb2NraW5nIGNvbnRyb2wgcmVsaWVzIG9uIHRoZSAid2FpdGVyIiBmaWVsZC4gUHJvZHVjZXJzIHNldAorICAgICAqIHRoZSBmaWVsZCBiZWZvcmUgdHJ5aW5nIHRvIGJsb2NrLCBidXQgbXVzdCB0aGVuIHJlY2hlY2sgKHZpYQorICAgICAqIG9mZmVyKSBiZWZvcmUgcGFya2luZy4gU2lnbmFsbGluZyB0aGVuIGp1c3QgdW5wYXJrcyBhbmQgY2xlYXJzCisgICAgICogd2FpdGVyIGZpZWxkLiBJZiB0aGUgcHJvZHVjZXIgYW5kL29yIGNvbnN1bWVyIGFyZSB1c2luZyBhCisgICAgICogRm9ya0pvaW5Qb29sLCB0aGUgcHJvZHVjZXIgYXR0ZW1wdHMgdG8gaGVscCBydW4gY29uc3VtZXIgdGFza3MKKyAgICAgKiB2aWEgRm9ya0pvaW5Qb29sLmhlbHBBc3luY0Jsb2NrZXIgYmVmb3JlIGJsb2NraW5nLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgY2xhc3MgdXNlcyBAQ29udGVuZGVkIGFuZCBoZXVyaXN0aWMgZmllbGQgZGVjbGFyYXRpb24KKyAgICAgKiBvcmRlcmluZyB0byByZWR1Y2UgZmFsc2Utc2hhcmluZy1iYXNlZCBtZW1vcnkgY29udGVudGlvbiBhbW9uZworICAgICAqIGluc3RhbmNlcyBvZiBCdWZmZXJlZFN1YnNjcmlwdGlvbiwgYnV0IGl0IGRvZXMgbm90IGN1cnJlbnRseQorICAgICAqIGF0dGVtcHQgdG8gYXZvaWQgbWVtb3J5IGNvbnRlbnRpb24gYW1vbmcgYnVmZmVycy4gVGhpcyBmaWVsZAorICAgICAqIGFuZCBlbGVtZW50IHBhY2tpbmcgY2FuIGh1cnQgcGVyZm9ybWFuY2UgZXNwZWNpYWxseSB3aGVuIGVhY2gKKyAgICAgKiBwdWJsaXNoZXIgaGFzIG9ubHkgb25lIGNsaWVudCBvcGVyYXRpbmcgYXQgYSBoaWdoIHJhdGUuCisgICAgICogQWRkcmVzc2luZyB0aGlzIG1heSByZXF1aXJlIGFsbG9jYXRpbmcgc3Vic3RhbnRpYWxseSBtb3JlIHNwYWNlCisgICAgICogdGhhbiB1c2VycyBleHBlY3QuCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInNlcmlhbCIpCisgICAgQHN1bi5taXNjLkNvbnRlbmRlZAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEJ1ZmZlcmVkU3Vic2NyaXB0aW9uPFQ+CisgICAgICAgICAgICBpbXBsZW1lbnRzIEZsb3cuU3Vic2NyaXB0aW9uLCBGb3JrSm9pblBvb2wuTWFuYWdlZEJsb2NrZXIgeworICAgICAgICAvLyBPcmRlci1zZW5zaXRpdmUgZmllbGQgZGVjbGFyYXRpb25zCisgICAgICAgIGxvbmcgdGltZW91dDsgICAgICAgICAgICAgICAgICAgICAgLy8gPiAwIGlmIHRpbWVkIHdhaXQKKyAgICAgICAgdm9sYXRpbGUgbG9uZyBkZW1hbmQ7ICAgICAgICAgICAgICAvLyAjIHVuZmlsbGVkIHJlcXVlc3RzCisgICAgICAgIGludCBtYXhDYXBhY2l0eTsgICAgICAgICAgICAgICAgICAgLy8gcmVkdWNlZCBvbiBPT01FCisgICAgICAgIGludCBwdXRTdGF0OyAgICAgICAgICAgICAgICAgICAgICAgLy8gb2ZmZXIgcmVzdWx0IGZvciBNYW5hZ2VkQmxvY2tlcgorICAgICAgICB2b2xhdGlsZSBpbnQgY3RsOyAgICAgICAgICAgICAgICAgIC8vIGF0b21pYyBydW4gc3RhdGUgZmxhZ3MKKyAgICAgICAgdm9sYXRpbGUgaW50IGhlYWQ7ICAgICAgICAgICAgICAgICAvLyBuZXh0IHBvc2l0aW9uIHRvIHRha2UKKyAgICAgICAgaW50IHRhaWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXh0IHBvc2l0aW9uIHRvIHB1dAorICAgICAgICBPYmplY3RbXSBhcnJheTsgICAgICAgICAgICAgICAgICAgIC8vIGJ1ZmZlcjogbnVsbCBpZiBkaXNhYmxlZAorICAgICAgICBGbG93LlN1YnNjcmliZXI8PyBzdXBlciBUPiBzdWJzY3JpYmVyOyAvLyBudWxsIGlmIGRpc2FibGVkCisgICAgICAgIEV4ZWN1dG9yIGV4ZWN1dG9yOyAgICAgICAgICAgICAgICAgLy8gbnVsbCBpZiBkaXNhYmxlZAorICAgICAgICBCaUNvbnN1bWVyPD8gc3VwZXIgRmxvdy5TdWJzY3JpYmVyPD8gc3VwZXIgVD4sID8gc3VwZXIgVGhyb3dhYmxlPiBvbk5leHRIYW5kbGVyOworICAgICAgICB2b2xhdGlsZSBUaHJvd2FibGUgcGVuZGluZ0Vycm9yOyAgIC8vIGhvbGRzIHVudGlsIG9uRXJyb3IgaXNzdWVkCisgICAgICAgIHZvbGF0aWxlIFRocmVhZCB3YWl0ZXI7ICAgICAgICAgICAgLy8gYmxvY2tlZCBwcm9kdWNlciB0aHJlYWQKKyAgICAgICAgVCBwdXRJdGVtOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3Igb2ZmZXIgd2l0aGluIE1hbmFnZWRCbG9ja2VyCisgICAgICAgIEJ1ZmZlcmVkU3Vic2NyaXB0aW9uPFQ+IG5leHQ7ICAgICAgLy8gdXNlZCBvbmx5IGJ5IHB1Ymxpc2hlcgorICAgICAgICBCdWZmZXJlZFN1YnNjcmlwdGlvbjxUPiBuZXh0UmV0cnk7IC8vIHVzZWQgb25seSBieSBwdWJsaXNoZXIKKworICAgICAgICAvLyBjdGwgdmFsdWVzCisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQUNUSVZFID0gMHgwMTsgLy8gY29uc3VtZXIgdGFzayBhY3RpdmUKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBDT05TVU1FID0gMHgwMjsgLy8ga2VlcC1hbGl2ZSBmb3IgY29uc3VtZXIgdGFzaworICAgICAgICBzdGF0aWMgZmluYWwgaW50IERJU0FCTEVEID0gMHgwNDsgLy8gZmluYWwgc3RhdGUKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBFUlJPUiA9IDB4MDg7IC8vIHNpZ25hbCBvbkVycm9yIHRoZW4gZGlzYWJsZQorICAgICAgICBzdGF0aWMgZmluYWwgaW50IFNVQlNDUklCRSA9IDB4MTA7IC8vIHNpZ25hbCBvblN1YnNjcmliZQorICAgICAgICBzdGF0aWMgZmluYWwgaW50IENPTVBMRVRFID0gMHgyMDsgLy8gc2lnbmFsIG9uQ29tcGxldGUgd2hlbiBkb25lCisKKyAgICAgICAgc3RhdGljIGZpbmFsIGxvbmcgSU5URVJSVVBURUQgPSAtMUw7IC8vIHRpbWVvdXQgdnMgaW50ZXJydXB0IHNlbnRpbmVsCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEluaXRpYWwgYnVmZmVyIGNhcGFjaXR5IHVzZWQgd2hlbiBtYXhCdWZmZXJDYXBhY2l0eSBpcworICAgICAgICAgKiBncmVhdGVyLiBNdXN0IGJlIGEgcG93ZXIgb2YgdHdvLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0lOSVRJQUxfQ0FQID0gMzI7CisKKyAgICAgICAgQnVmZmVyZWRTdWJzY3JpcHRpb24oRmxvdy5TdWJzY3JpYmVyPD8gc3VwZXIgVD4gc3Vic2NyaWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhlY3V0b3IgZXhlY3V0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpQ29uc3VtZXI8PyBzdXBlciBGbG93LlN1YnNjcmliZXI8PyBzdXBlciBUPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHN1cGVyIFRocm93YWJsZT4gb25OZXh0SGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heEJ1ZmZlckNhcGFjaXR5KSB7CisgICAgICAgICAgICB0aGlzLnN1YnNjcmliZXIgPSBzdWJzY3JpYmVyOworICAgICAgICAgICAgdGhpcy5leGVjdXRvciA9IGV4ZWN1dG9yOworICAgICAgICAgICAgdGhpcy5vbk5leHRIYW5kbGVyID0gb25OZXh0SGFuZGxlcjsKKyAgICAgICAgICAgIHRoaXMubWF4Q2FwYWNpdHkgPSBtYXhCdWZmZXJDYXBhY2l0eTsKKyAgICAgICAgICAgIHRoaXMuYXJyYXkgPSBuZXcgT2JqZWN0W21heEJ1ZmZlckNhcGFjaXR5IDwgREVGQVVMVF9JTklUSUFMX0NBUAorICAgICAgICAgICAgICAgICAgICA/IChtYXhCdWZmZXJDYXBhY2l0eSA8IDIgLy8gYXQgbGVhc3QgMiBzbG90cworICAgICAgICAgICAgICAgICAgICAgICAgPyAyIDogbWF4QnVmZmVyQ2FwYWNpdHkpCisgICAgICAgICAgICAgICAgICAgICAgICA6IERFRkFVTFRfSU5JVElBTF9DQVBdOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICBpZiAoc3Vic2NyaWJlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1YnNjcmliZXIudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBib29sZWFuIGlzRGlzYWJsZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gY3RsID09IERJU0FCTEVEOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgZXN0aW1hdGVkIG51bWJlciBvZiBidWZmZXJlZCBpdGVtcywgb3IgLTEgaWYKKyAgICAgICAgICogZGlzYWJsZWQuCisgICAgICAgICAqLworICAgICAgICBmaW5hbCBpbnQgZXN0aW1hdGVMYWcoKSB7CisgICAgICAgICAgICBpbnQgbjsKKyAgICAgICAgICAgIHJldHVybiAoY3RsID09IERJU0FCTEVEKSA/IC0xIDogKChuID0gdGFpbCAtIGhlYWQpID4gMCkgPyBuIDogMDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUcmllcyB0byBhZGQgaXRlbSBhbmQgc3RhcnQgY29uc3VtZXIgdGFzayBpZiBuZWNlc3NhcnkuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gLTEgaWYgZGlzYWJsZWQsIDAgaWYgZHJvcHBlZCwgZWxzZSBlc3RpbWF0ZWQgbGFnCisgICAgICAgICAqLworICAgICAgICBmaW5hbCBpbnQgb2ZmZXIoVCBpdGVtKSB7CisgICAgICAgICAgICBpbnQgaCA9IGhlYWQsIHQgPSB0YWlsLCBjYXAsIHNpemUsIHN0YXQ7CisgICAgICAgICAgICBPYmplY3RbXSBhID0gYXJyYXk7CisgICAgICAgICAgICBpZiAoYSAhPSBudWxsICYmIChjYXAgPSBhLmxlbmd0aCkgPiAwICYmIGNhcCA+PSAoc2l6ZSA9IHQgKyAxIC0gaCkpIHsKKyAgICAgICAgICAgICAgICBhWyhjYXAgLSAxKSAmIHRdID0gaXRlbTsgICAgLy8gcmVsYXhlZCB3cml0ZXMgT0sKKyAgICAgICAgICAgICAgICB0YWlsID0gdCArIDE7CisgICAgICAgICAgICAgICAgc3RhdCA9IHNpemU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0YXQgPSBncm93QW5kQWRkKGEsIGl0ZW0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIChzdGF0ID4gMCAmJiAoY3RsICYgKEFDVElWRSB8IENPTlNVTUUpKSAhPSAoQUNUSVZFIHwgQ09OU1VNRSkpID8gc3RhcnRPbk9mZmVyKHN0YXQpIDogc3RhdDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUcmllcyB0byBjcmVhdGUgb3IgZXhwYW5kIGJ1ZmZlciwgdGhlbiBhZGRzIGl0ZW0gaWYgcG9zc2libGUuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGludCBncm93QW5kQWRkKE9iamVjdFtdIGEsIFQgaXRlbSkgeworICAgICAgICAgICAgYm9vbGVhbiBhbGxvYzsKKyAgICAgICAgICAgIGludCBjYXAsIHN0YXQ7CisgICAgICAgICAgICBpZiAoKGN0bCAmIChFUlJPUiB8IERJU0FCTEVEKSkgIT0gMCkgeworICAgICAgICAgICAgICAgIGNhcCA9IDA7CisgICAgICAgICAgICAgICAgc3RhdCA9IC0xOworICAgICAgICAgICAgICAgIGFsbG9jID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGEgPT0gbnVsbCB8fCAoY2FwID0gYS5sZW5ndGgpIDw9IDApIHsKKyAgICAgICAgICAgICAgICBjYXAgPSAwOworICAgICAgICAgICAgICAgIHN0YXQgPSAxOworICAgICAgICAgICAgICAgIGFsbG9jID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgVS5mdWxsRmVuY2UoKTsgICAgICAgICAgICAgICAgICAgLy8gcmVjaGVjaworICAgICAgICAgICAgICAgIGludCBoID0gaGVhZCwgdCA9IHRhaWwsIHNpemUgPSB0ICsgMSAtIGg7CisgICAgICAgICAgICAgICAgaWYgKGNhcCA+PSBzaXplKSB7CisgICAgICAgICAgICAgICAgICAgIGFbKGNhcCAtIDEpICYgdF0gPSBpdGVtOworICAgICAgICAgICAgICAgICAgICB0YWlsID0gdCArIDE7CisgICAgICAgICAgICAgICAgICAgIHN0YXQgPSBzaXplOworICAgICAgICAgICAgICAgICAgICBhbGxvYyA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FwID49IG1heENhcGFjaXR5KSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXQgPSAwOyAgICAgICAgICAgICAgICAgICAgLy8gY2Fubm90IGdyb3cKKyAgICAgICAgICAgICAgICAgICAgYWxsb2MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzdGF0ID0gY2FwICsgMTsKKyAgICAgICAgICAgICAgICAgICAgYWxsb2MgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhbGxvYykgeworICAgICAgICAgICAgICAgIGludCBuZXdDYXAgPSAoY2FwID4gMCkgPyBjYXAgPDwgMSA6IDE7CisgICAgICAgICAgICAgICAgaWYgKG5ld0NhcCA8PSBjYXApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdCA9IDA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gbmV3QXJyYXkgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXJyYXkgPSBuZXcgT2JqZWN0W25ld0NhcF07CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBleCkgeyAgICAgLy8gdHJ5IHRvIGNvcGUgd2l0aCBPT01FCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG5ld0FycmF5ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYXAgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Q2FwYWNpdHkgPSBjYXA7ICAgLy8gYXZvaWQgY29udGludW91cyBmYWlsdXJlCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5ID0gbmV3QXJyYXk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdCA9IHRhaWw7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmV3TWFzayA9IG5ld0NhcCAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYSAhPSBudWxsICYmIGNhcCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWFzayA9IGNhcCAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IGhlYWQ7IGogIT0gdDsgKytqKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgayA9ICgobG9uZykgKGogJiBtYXNrKSA8PCBBU0hJRlQpICsgQUJBU0U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCB4ID0gVS5nZXRPYmplY3RWb2xhdGlsZShhLCBrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggIT0gbnVsbCAmJiAvLyByYWNlcyB3aXRoIGNvbnN1bWVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVS5jb21wYXJlQW5kU3dhcE9iamVjdChhLCBrLCB4LCBudWxsKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXJyYXlbaiAmIG5ld01hc2tdID0geDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0FycmF5W3QgJiBuZXdNYXNrXSA9IGl0ZW07CisgICAgICAgICAgICAgICAgICAgICAgICB0YWlsID0gdCArIDE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3RhdDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTcGlucy9oZWxwcy9ibG9ja3Mgd2hpbGUgb2ZmZXIgcmV0dXJucyAwLiAgQ2FsbGVkIG9ubHkgaWYKKyAgICAgICAgICogaW5pdGlhbCBvZmZlciByZXR1cm4gMC4KKyAgICAgICAgICovCisgICAgICAgIGZpbmFsIGludCBzdWJtaXQoVCBpdGVtKSB7CisgICAgICAgICAgICBpbnQgc3RhdDsKKyAgICAgICAgICAgIGlmICgoc3RhdCA9IG9mZmVyKGl0ZW0pKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcHV0SXRlbSA9IGl0ZW07CisgICAgICAgICAgICAgICAgdGltZW91dCA9IDBMOworICAgICAgICAgICAgICAgIHB1dFN0YXQgPSAwOworICAgICAgICAgICAgICAgIC8vIHNhZmUgdG8gY29tbWVudCBvdXQgd2hlbiBleGVjdXRvciAhPSBGb3JrSm9pblBvb2wgKFRPRE8pCisgICAgICAgICAgICAgICAgLy8gRm9ya0pvaW5Qb29sLmhlbHBBc3luY0Jsb2NrZXIoZXhlY3V0b3IsIHRoaXMpOworICAgICAgICAgICAgICAgIGlmICgoc3RhdCA9IHB1dFN0YXQpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZvcmtKb2luUG9vbC5tYW5hZ2VkQmxvY2sodGhpcyk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGllKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0ID0gSU5URVJSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3RhdCA9IHB1dFN0YXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICh0aW1lb3V0IDwgMEwpIHsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3RhdDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaW1lb3V0IHZlcnNpb247IHNpbWlsYXIgdG8gc3VibWl0LgorICAgICAgICAgKi8KKyAgICAgICAgZmluYWwgaW50IHRpbWVkT2ZmZXIoVCBpdGVtLCBsb25nIG5hbm9zKSB7CisgICAgICAgICAgICBpbnQgc3RhdDsKKyAgICAgICAgICAgIGlmICgoc3RhdCA9IG9mZmVyKGl0ZW0pKSA9PSAwICYmICh0aW1lb3V0ID0gbmFub3MpID4gMEwpIHsKKyAgICAgICAgICAgICAgICBwdXRJdGVtID0gaXRlbTsKKyAgICAgICAgICAgICAgICBwdXRTdGF0ID0gMDsKKyAgICAgICAgICAgICAgICAvLyBzYWZlIHRvIGNvbW1lbnQgb3V0IHdoZW4gZXhlY3V0b3IgIT0gRm9ya0pvaW5Qb29sIChUT0RPKQorICAgICAgICAgICAgICAgIC8vIEZvcmtKb2luUG9vbC5oZWxwQXN5bmNCbG9ja2VyKGV4ZWN1dG9yLCB0aGlzKTsKKyAgICAgICAgICAgICAgICBpZiAoKHN0YXQgPSBwdXRTdGF0KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBGb3JrSm9pblBvb2wubWFuYWdlZEJsb2NrKHRoaXMpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCA9IElOVEVSUlVQVEVEOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHN0YXQgPSBwdXRTdGF0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodGltZW91dCA8IDBMKSB7CisgICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN0YXQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVHJpZXMgdG8gc3RhcnQgY29uc3VtZXIgdGFzayBhZnRlciBvZmZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiAtMSBpZiBub3cgZGlzYWJsZWQsIGVsc2UgYXJndW1lbnQKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgaW50IHN0YXJ0T25PZmZlcihpbnQgc3RhdCkgeworICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgIEV4ZWN1dG9yIGU7CisgICAgICAgICAgICAgICAgaW50IGM7CisgICAgICAgICAgICAgICAgaWYgKChjID0gY3RsKSA9PSBESVNBQkxFRCB8fCAoZSA9IGV4ZWN1dG9yKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXQgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoYyAmIEFDVElWRSkgIT0gMCkgeyAvLyBlbnN1cmUga2VlcC1hbGl2ZQorICAgICAgICAgICAgICAgICAgICBpZiAoKGMgJiBDT05TVU1FKSAhPSAwIHx8IFUuY29tcGFyZUFuZFN3YXBJbnQodGhpcywgQ1RMLCBjLCBjIHwgQ09OU1VNRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkZW1hbmQgPT0gMEwgfHwgdGFpbCA9PSBoZWFkKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoVS5jb21wYXJlQW5kU3dhcEludCh0aGlzLCBDVEwsIGMsCisgICAgICAgICAgICAgICAgICAgICAgICBjIHwgKEFDVElWRSB8IENPTlNVTUUpKSkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZS5leGVjdXRlKG5ldyBDb25zdW1lclRhc2s8VD4odGhpcykpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gfCBFcnJvciBleCkgeyAvLyBiYWNrIG91dAorICAgICAgICAgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoKChjID0gY3RsKSAmIERJU0FCTEVEKSA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChjICYgQUNUSVZFKSAhPSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFVLmNvbXBhcmVBbmRTd2FwSW50KHRoaXMsIENUTCwgYywgYyAmIH5BQ1RJVkUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGV4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN0YXQ7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgc2lnbmFsV2FpdGVyKFRocmVhZCB3KSB7CisgICAgICAgICAgICB3YWl0ZXIgPSBudWxsOworICAgICAgICAgICAgTG9ja1N1cHBvcnQudW5wYXJrKHcpOyAgICAvLyByZWxlYXNlIHByb2R1Y2VyCisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogTnVsbHMgb3V0IG1vc3QgZmllbGRzLCBtYWlubHkgdG8gYXZvaWQgZ2FyYmFnZSByZXRlbnRpb24KKyAgICAgICAgICogdW50aWwgcHVibGlzaGVyIHVuc3Vic2NyaWJlcywgYnV0IGFsc28gdG8gaGVscCBjbGVhbmx5IHN0b3AKKyAgICAgICAgICogdXBvbiBlcnJvciBieSBudWxsaW5nIHJlcXVpcmVkIGNvbXBvbmVudHMuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgZGV0YWNoKCkgeworICAgICAgICAgICAgVGhyZWFkIHcgPSB3YWl0ZXI7CisgICAgICAgICAgICBleGVjdXRvciA9IG51bGw7CisgICAgICAgICAgICBzdWJzY3JpYmVyID0gbnVsbDsKKyAgICAgICAgICAgIHBlbmRpbmdFcnJvciA9IG51bGw7CisgICAgICAgICAgICBzaWduYWxXYWl0ZXIodyk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSXNzdWVzIGVycm9yIHNpZ25hbCwgYXN5bmNocm9ub3VzbHkgaWYgYSB0YXNrIGlzIHJ1bm5pbmcsCisgICAgICAgICAqIGVsc2Ugc3luY2hyb25vdXNseS4KKyAgICAgICAgICovCisgICAgICAgIGZpbmFsIHZvaWQgb25FcnJvcihUaHJvd2FibGUgZXgpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGM7OykgeworICAgICAgICAgICAgICAgIGlmICgoKGMgPSBjdGwpICYgKEVSUk9SIHwgRElTQUJMRUQpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGMgJiBBQ1RJVkUpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcGVuZGluZ0Vycm9yID0gZXg7CisgICAgICAgICAgICAgICAgICAgIGlmIChVLmNvbXBhcmVBbmRTd2FwSW50KHRoaXMsIENUTCwgYywgYyB8IEVSUk9SKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIGNhdXNlIGNvbnN1bWVyIHRhc2sgdG8gZXhpdAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChVLmNvbXBhcmVBbmRTd2FwSW50KHRoaXMsIENUTCwgYywgRElTQUJMRUQpKSB7CisgICAgICAgICAgICAgICAgICAgIEZsb3cuU3Vic2NyaWJlcjw/IHN1cGVyIFQ+IHMgPSBzdWJzY3JpYmVyOworICAgICAgICAgICAgICAgICAgICBpZiAocyAhPSBudWxsICYmIGV4ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5vbkVycm9yKGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkZXRhY2goKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRyaWVzIHRvIHN0YXJ0IGNvbnN1bWVyIHRhc2sgdXBvbiBhIHNpZ25hbCBvciByZXF1ZXN0OworICAgICAgICAgKiBkaXNhYmxlcyBvbiBmYWlsdXJlLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0T3JEaXNhYmxlKCkgeworICAgICAgICAgICAgRXhlY3V0b3IgZTsKKyAgICAgICAgICAgIGlmICgoZSA9IGV4ZWN1dG9yKSAhPSBudWxsKSB7IC8vIHNraXAgaWYgYWxyZWFkeSBkaXNhYmxlZAorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGUuZXhlY3V0ZShuZXcgQ29uc3VtZXJUYXNrPFQ+KHRoaXMpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZXgpIHsgIC8vIGJhY2sgb3V0IGFuZCBmb3JjZSBzaWduYWwKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgYzs7KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGMgPSBjdGwpID09IERJU0FCTEVEIHx8IChjICYgQUNUSVZFKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoVS5jb21wYXJlQW5kU3dhcEludCh0aGlzLCBDVEwsIGMsIGMgJiB+QUNUSVZFKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZmluYWwgdm9pZCBvbkNvbXBsZXRlKCkgeworICAgICAgICAgICAgZm9yIChpbnQgYzs7KSB7CisgICAgICAgICAgICAgICAgaWYgKChjID0gY3RsKSA9PSBESVNBQkxFRCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKFUuY29tcGFyZUFuZFN3YXBJbnQodGhpcywgQ1RMLCBjLAorICAgICAgICAgICAgICAgICAgICAgICAgYyB8IChBQ1RJVkUgfCBDT05TVU1FIHwgQ09NUExFVEUpKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKGMgJiBBQ1RJVkUpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0T3JEaXNhYmxlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZmluYWwgdm9pZCBvblN1YnNjcmliZSgpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGM7OykgeworICAgICAgICAgICAgICAgIGlmICgoYyA9IGN0bCkgPT0gRElTQUJMRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChVLmNvbXBhcmVBbmRTd2FwSW50KHRoaXMsIENUTCwgYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGMgfCAoQUNUSVZFIHwgQ09OU1VNRSB8IFNVQlNDUklCRSkpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoYyAmIEFDVElWRSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRPckRpc2FibGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2F1c2VzIGNvbnN1bWVyIHRhc2sgdG8gZXhpdCBpZiBhY3RpdmUgKHdpdGhvdXQgcmVwb3J0aW5nCisgICAgICAgICAqIG9uRXJyb3IgdW5sZXNzIHRoZXJlIGlzIGFscmVhZHkgYSBwZW5kaW5nIGVycm9yKSwgYW5kCisgICAgICAgICAqIGRpc2FibGVzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgY2FuY2VsKCkgeworICAgICAgICAgICAgZm9yIChpbnQgYzs7KSB7CisgICAgICAgICAgICAgICAgaWYgKChjID0gY3RsKSA9PSBESVNBQkxFRCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChjICYgQUNUSVZFKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChVLmNvbXBhcmVBbmRTd2FwSW50KHRoaXMsIENUTCwgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjIHwgKENPTlNVTUUgfCBFUlJPUikpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoVS5jb21wYXJlQW5kU3dhcEludCh0aGlzLCBDVEwsIGMsIERJU0FCTEVEKSkgeworICAgICAgICAgICAgICAgICAgICBkZXRhY2goKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZHMgdG8gZGVtYW5kIGFuZCBwb3NzaWJseSBzdGFydHMgdGFzay4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHJlcXVlc3QobG9uZyBuKSB7CisgICAgICAgICAgICBpZiAobiA+IDBMKSB7CisgICAgICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgICAgICBsb25nIHByZXYgPSBkZW1hbmQsIGQ7CisgICAgICAgICAgICAgICAgICAgIGlmICgoZCA9IHByZXYgKyBuKSA8IHByZXYpIHsgLy8gc2F0dXJhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBMb25nLk1BWF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoVS5jb21wYXJlQW5kU3dhcExvbmcodGhpcywgREVNQU5ELCBwcmV2LCBkKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgYywgaDs7ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYyA9IGN0bCkgPT0gRElTQUJMRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoYyAmIEFDVElWRSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGMgJiBDT05TVU1FKSAhPSAwIHx8IFUuY29tcGFyZUFuZFN3YXBJbnQodGhpcywgQ1RMLCBjLCBjIHwgQ09OU1VNRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoaCA9IGhlYWQpICE9IHRhaWwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFUuY29tcGFyZUFuZFN3YXBJbnQodGhpcywgQ1RMLCBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgfCAoQUNUSVZFIHwgQ09OU1VNRSkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydE9yRGlzYWJsZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhlYWQgPT0gaCAmJiB0YWlsID09IGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgIC8vIGVsc2Ugc3RhbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlbWFuZCA9PSAwTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAobiA8IDBMKSB7CisgICAgICAgICAgICAgICAgb25FcnJvcihuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIm5lZ2F0aXZlIHN1YnNjcmlwdGlvbiByZXF1ZXN0IikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNSZWxlYXNhYmxlKCkgeyAvLyBmb3IgTWFuYWdlZEJsb2NrZXIKKyAgICAgICAgICAgIFQgaXRlbSA9IHB1dEl0ZW07CisgICAgICAgICAgICBpZiAoaXRlbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKChwdXRTdGF0ID0gb2ZmZXIoaXRlbSkpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdXRJdGVtID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gYmxvY2soKSB7IC8vIGZvciBNYW5hZ2VkQmxvY2tlcgorICAgICAgICAgICAgVCBpdGVtID0gcHV0SXRlbTsKKyAgICAgICAgICAgIGlmIChpdGVtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwdXRJdGVtID0gbnVsbDsKKyAgICAgICAgICAgICAgICBsb25nIG5hbm9zID0gdGltZW91dDsKKyAgICAgICAgICAgICAgICBsb25nIGRlYWRsaW5lID0gKG5hbm9zID4gMEwpID8gU3lzdGVtLm5hbm9UaW1lKCkgKyBuYW5vcyA6IDBMOworICAgICAgICAgICAgICAgIHdoaWxlICgocHV0U3RhdCA9IG9mZmVyKGl0ZW0pKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChUaHJlYWQuaW50ZXJydXB0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGltZW91dCA9IElOVEVSUlVQVEVEOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbm9zID4gMEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuYW5vcyA+IDBMICYmIChuYW5vcyA9IGRlYWRsaW5lIC0gU3lzdGVtLm5hbm9UaW1lKCkpIDw9IDBMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3YWl0ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgd2FpdGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW5vcyA+IDBMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9ja1N1cHBvcnQucGFya05hbm9zKHRoaXMsIG5hbm9zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9ja1N1cHBvcnQucGFyayh0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRlciA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3YWl0ZXIgPSBudWxsOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3VtZXIgbG9vcCwgY2FsbGVkIGZyb20gQ29uc3VtZXJUYXNrLCBvciBpbmRpcmVjdGx5CisgICAgICAgICAqIHdoZW4gaGVscGluZyBkdXJpbmcgc3VibWl0LgorICAgICAgICAgKi8KKyAgICAgICAgZmluYWwgdm9pZCBjb25zdW1lKCkgeworICAgICAgICAgICAgRmxvdy5TdWJzY3JpYmVyPD8gc3VwZXIgVD4gczsKKyAgICAgICAgICAgIGludCBoID0gaGVhZDsKKyAgICAgICAgICAgIGlmICgocyA9IHN1YnNjcmliZXIpICE9IG51bGwpIHsgICAgICAgICAgIC8vIGVsc2UgZGlzYWJsZWQKKyAgICAgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgICAgIGxvbmcgZCA9IGRlbWFuZDsKKyAgICAgICAgICAgICAgICAgICAgaW50IGM7CisgICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIGE7CisgICAgICAgICAgICAgICAgICAgIGludCBuOworICAgICAgICAgICAgICAgICAgICBsb25nIGk7CisgICAgICAgICAgICAgICAgICAgIE9iamVjdCB4OworICAgICAgICAgICAgICAgICAgICBUaHJlYWQgdzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCgoYyA9IGN0bCkgJiAoRVJST1IgfCBTVUJTQ1JJQkUgfCBESVNBQkxFRCkpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hlY2tDb250cm9sKHMsIGMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGEgPSBhcnJheSkgPT0gbnVsbCB8fCBoID09IHRhaWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAobiA9IGEubGVuZ3RoKSA9PSAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHggPSBVLmdldE9iamVjdFZvbGF0aWxlKGEsIChpID0gKChsb25nKSAoKG4gLSAxKSAmIGgpIDw8IEFTSElGVCkgKyBBQkFTRSkpKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoZWNrRW1wdHkocywgYykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkID09IDBMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNoZWNrRGVtYW5kKGMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKChjICYgQ09OU1VNRSkgIT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IFUuY29tcGFyZUFuZFN3YXBJbnQodGhpcywgQ1RMLCBjLCBjIHwgQ09OU1VNRSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgVS5jb21wYXJlQW5kU3dhcE9iamVjdChhLCBpLCB4LCBudWxsKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgVS5wdXRPcmRlcmVkSW50KHRoaXMsIEhFQUQsICsraCk7CisgICAgICAgICAgICAgICAgICAgICAgICBVLmdldEFuZEFkZExvbmcodGhpcywgREVNQU5ELCAtMUwpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh3ID0gd2FpdGVyKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsV2FpdGVyKHcpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgVCB5ID0gKFQpIHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5vbk5leHQoeSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVPbk5leHQocywgZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlc3BvbmRzIHRvIGNvbnRyb2wgZXZlbnRzIGluIGNvbnN1bWUoKS4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja0NvbnRyb2woRmxvdy5TdWJzY3JpYmVyPD8gc3VwZXIgVD4gcywgaW50IGMpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gc3RhdCA9IHRydWU7CisgICAgICAgICAgICBpZiAoKGMgJiBTVUJTQ1JJQkUpICE9IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoVS5jb21wYXJlQW5kU3dhcEludCh0aGlzLCBDVEwsIGMsIGMgJiB+U1VCU0NSSUJFKSkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMub25TdWJzY3JpYmUodGhpcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcihleCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKChjICYgRVJST1IpICE9IDApIHsKKyAgICAgICAgICAgICAgICBUaHJvd2FibGUgZXggPSBwZW5kaW5nRXJyb3I7CisgICAgICAgICAgICAgICAgY3RsID0gRElTQUJMRUQ7ICAgICAgICAgICAvLyBubyBuZWVkIGZvciBDQVMKKyAgICAgICAgICAgICAgICBpZiAoZXggIT0gbnVsbCkgeyAgICAgICAgIC8vIG51bGwgaWYgZXJyb3JsZXNzIGNhbmNlbAorICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMub25FcnJvcihleCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBpZ25vcmUpIHsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZGV0YWNoKCk7CisgICAgICAgICAgICAgICAgc3RhdCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN0YXQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVzcG9uZHMgdG8gYXBwYXJlbnQgZW1wdGluZXNzIGluIGNvbnN1bWUoKS4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBjaGVja0VtcHR5KEZsb3cuU3Vic2NyaWJlcjw/IHN1cGVyIFQ+IHMsIGludCBjKSB7CisgICAgICAgICAgICBib29sZWFuIHN0YXQgPSB0cnVlOworICAgICAgICAgICAgaWYgKGhlYWQgPT0gdGFpbCkgeworICAgICAgICAgICAgICAgIGlmICgoYyAmIENPTlNVTUUpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgVS5jb21wYXJlQW5kU3dhcEludCh0aGlzLCBDVEwsIGMsIGMgJiB+Q09OU1VNRSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoYyAmIENPTVBMRVRFKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChVLmNvbXBhcmVBbmRTd2FwSW50KHRoaXMsIENUTCwgYywgRElTQUJMRUQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5vbkNvbXBsZXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGlnbm9yZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChVLmNvbXBhcmVBbmRTd2FwSW50KHRoaXMsIENUTCwgYywgYyAmIH5BQ1RJVkUpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3RhdDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXNwb25kcyB0byBhcHBhcmVudCB6ZXJvIGRlbWFuZCBpbiBjb25zdW1lKCkuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGJvb2xlYW4gY2hlY2tEZW1hbmQoaW50IGMpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gc3RhdCA9IHRydWU7CisgICAgICAgICAgICBpZiAoZGVtYW5kID09IDBMKSB7CisgICAgICAgICAgICAgICAgaWYgKChjICYgQ09OU1VNRSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBVLmNvbXBhcmVBbmRTd2FwSW50KHRoaXMsIENUTCwgYywgYyAmIH5DT05TVU1FKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFUuY29tcGFyZUFuZFN3YXBJbnQodGhpcywgQ1RMLCBjLCBjICYgfkFDVElWRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdGF0OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFByb2Nlc3NlcyBleGNlcHRpb24gaW4gU3Vic2NyaWJlci5vbk5leHQuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlT25OZXh0KEZsb3cuU3Vic2NyaWJlcjw/IHN1cGVyIFQ+IHMsIFRocm93YWJsZSBleCkgeworICAgICAgICAgICAgQmlDb25zdW1lcjw/IHN1cGVyIEZsb3cuU3Vic2NyaWJlcjw/IHN1cGVyIFQ+LCA/IHN1cGVyIFRocm93YWJsZT4gaDsKKyAgICAgICAgICAgIGlmICgoaCA9IG9uTmV4dEhhbmRsZXIpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBoLmFjY2VwdChzLCBleCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9uRXJyb3IoZXgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVW5zYWZlIG1lY2hhbmljcworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBzdW4ubWlzYy5VbnNhZmUgVSA9IFVuc2FmZUFjY2Vzc29yLmdldFVuc2FmZSgpOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIENUTDsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBUQUlMOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEhFQUQ7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgREVNQU5EOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQUJBU0U7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBU0hJRlQ7CisKKyAgICAgICAgc3RhdGljIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQ1RMID0gVS5vYmplY3RGaWVsZE9mZnNldChCdWZmZXJlZFN1YnNjcmlwdGlvbi5jbGFzcy5nZXREZWNsYXJlZEZpZWxkKCJjdGwiKSk7CisgICAgICAgICAgICAgICAgVEFJTCA9IFUub2JqZWN0RmllbGRPZmZzZXQoQnVmZmVyZWRTdWJzY3JpcHRpb24uY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZCgidGFpbCIpKTsKKyAgICAgICAgICAgICAgICBIRUFEID0gVS5vYmplY3RGaWVsZE9mZnNldChCdWZmZXJlZFN1YnNjcmlwdGlvbi5jbGFzcy5nZXREZWNsYXJlZEZpZWxkKCJoZWFkIikpOworICAgICAgICAgICAgICAgIERFTUFORCA9IFUub2JqZWN0RmllbGRPZmZzZXQoQnVmZmVyZWRTdWJzY3JpcHRpb24uY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZCgiZGVtYW5kIikpOworCisgICAgICAgICAgICAgICAgQUJBU0UgPSBVLmFycmF5QmFzZU9mZnNldChPYmplY3RbXS5jbGFzcyk7CisgICAgICAgICAgICAgICAgaW50IHNjYWxlID0gVS5hcnJheUluZGV4U2NhbGUoT2JqZWN0W10uY2xhc3MpOworICAgICAgICAgICAgICAgIGlmICgoc2NhbGUgJiAoc2NhbGUgLSAxKSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImRhdGEgdHlwZSBzY2FsZSBub3QgYSBwb3dlciBvZiB0d28iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQVNISUZUID0gMzEgLSBJbnRlZ2VyLm51bWJlck9mTGVhZGluZ1plcm9zKHNjYWxlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJlZmxlY3RpdmVPcGVyYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gUmVkdWNlIHRoZSByaXNrIG9mIHJhcmUgZGlzYXN0cm91cyBjbGFzc2xvYWRpbmcgaW4gZmlyc3QgY2FsbCB0bworICAgICAgICAgICAgLy8gTG9ja1N1cHBvcnQucGFyazogaHR0cHM6Ly9idWdzLm9wZW5qZGsuamF2YS5uZXQvYnJvd3NlL0pESy04MDc0NzczCisgICAgICAgICAgICBDbGFzczw/PiBlbnN1cmVMb2FkZWQgPSBMb2NrU3VwcG9ydC5jbGFzczsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvanNyMTY2L1Vuc2FmZUFjY2Vzc29yLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2pzcjE2Ni9VbnNhZmVBY2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2ODJiZWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2pzcjE2Ni9VbnNhZmVBY2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuanNyMTY2OworCitpbXBvcnQgc3VuLm1pc2MuVW5zYWZlOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uOworCisvKioKKyAqIEhlbHBlciBmb3IgY2xhc3NlcyBpbiB0aGUganNyMTY2IHBhY2thZ2UgdG8gYWNjZXNzIHRoZSB7QGNvZGUgc3VuLm1pc2MuVW5zYWZlfSBpbnN0YW5jZS4KKyAqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK2NsYXNzIFVuc2FmZUFjY2Vzc29yIHsKKyAgICBzdGF0aWMgc3VuLm1pc2MuVW5zYWZlIGdldFVuc2FmZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBzdW4ubWlzYy5VbnNhZmUuZ2V0VW5zYWZlKCk7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIHRyeVJlZmxlY3Rpb25JbnN0ZWFkKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKChQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uPFVuc2FmZT4pICgpIC0+IHsKKyAgICAgICAgICAgICAgICBDbGFzczxVbnNhZmU+IGsgPSBVbnNhZmUuY2xhc3M7CisgICAgICAgICAgICAgICAgZm9yIChGaWVsZCBmIDogay5nZXREZWNsYXJlZEZpZWxkcygpKSB7CisgICAgICAgICAgICAgICAgICAgIGYuc2V0QWNjZXNzaWJsZSh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHggPSBmLmdldChudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGsuaXNJbnN0YW5jZSh4KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGsuY2FzdCh4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRmllbGRFcnJvcigidGhlIFVuc2FmZSIpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0gY2F0Y2ggKGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IGluaXRpYWxpemUgaW50cmluc2ljcyIsIGUuZ2V0Q2F1c2UoKSk7CisgICAgICAgIH0KKworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9qc3IxNjYvcGFja2FnZS1pbmZvLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2pzcjE2Ni9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDBmMmU1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9qc3IxNjYvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoqCisgKiBDb250YWlucyBhIHN1YnNldCBvZiBjbGFzc2VzIHJlcGFja2FnZWQgZnJvbSB0aGUganNyMTY2IHdyaXR0ZW4gYnkgRG91ZyBMZWEuCisgKiBUaGUgc3Vic2V0IGNvbnRhaW5zIEpESyA5IEZsb3cgQVBJIChyZWFjdGl2ZSBzdHJlYW1zKS4KKyAqLworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5qc3IxNjY7CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2wxMG4vTG9jYWxpemFibGUuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvbDEwbi9Mb2NhbGl6YWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MTg4OTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2wxMG4vTG9jYWxpemFibGUuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmwxMG47CisKKy8qKgorICogTG9jYWxpemFibGUgbWVzc2FnZS4KKyAqCisgKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KKyAqLworcHVibGljIGludGVyZmFjZSBMb2NhbGl6YWJsZSB7CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWFsIGNvbnN0YW50IHRoYXQgcmVwcmVzZW50cyBhIG1lc3NhZ2UgdGhhdAorICAgICAqIGlzIG5vdCBsb2NhbGl6YWJsZS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFVzZSBvZiAibmV3IiBpcyB0byBjcmVhdGUgYW4gdW5pcXVlIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PVF9MT0NBTElaQUJMRSA9ICJcdTAwMDAiOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUga2V5IGluIHRoZSByZXNvdXJjZSBidW5kbGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGlmIHRoaXMgbWV0aG9kIHJldHVybnMge0BsaW5rICNOT1RfTE9DQUxJWkFCTEV9LCB0aGF0IG1lYW5zIHRoZQorICAgICAqICAgICBtZXNzYWdlIGlzIG5vdCBsb2NhbGl6YWJsZSwgYW5kIHRoZSBmaXJzdCBpdGVtIG9mIHtAbGluayAjZ2V0QXJndW1lbnRzKCl9CisgICAgICogICAgIGFycmF5IGhvbGRzIGEge0Bjb2RlIFN0cmluZ30uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRLZXkoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGFyZ3VtZW50cyBmb3IgbWVzc2FnZSBmb3JtYXR0aW5nLgorICAgICAqCisgICAgICogQHJldHVybiBjYW4gYmUgYW4gYXJyYXkgb2YgbGVuZ3RoIDAgYnV0IG5ldmVyIGJlIHtAY29kZSBudWxsfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0W10gZ2V0QXJndW1lbnRzKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIGxvY2FsaXphdGlvbiBtZXNzYWdlcyByZXNvdXJjZSBidW5kbGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBsb2NhbGl6YXRpb24gbWVzc2FnZXMgcmVzb3VyY2UgYnVuZGxlIG5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZUJ1bmRsZU5hbWUoKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvbDEwbi9Mb2NhbGl6YWJsZU1lc3NhZ2UuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvbDEwbi9Mb2NhbGl6YWJsZU1lc3NhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWU0MDJkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9sMTBuL0xvY2FsaXphYmxlTWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwubDEwbjsKKworLyoqCisgKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIExvY2FsaXphYmxlTWVzc2FnZSBpbXBsZW1lbnRzIExvY2FsaXphYmxlIHsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIF9idW5kbGVuYW1lOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIF9rZXk7CisgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3RbXSBfYXJnczsKKworICAgIHB1YmxpYyBMb2NhbGl6YWJsZU1lc3NhZ2UoU3RyaW5nIGJ1bmRsZW5hbWUsIFN0cmluZyBrZXksIE9iamVjdC4uLiBhcmdzKSB7CisgICAgICAgIF9idW5kbGVuYW1lID0gYnVuZGxlbmFtZTsKKyAgICAgICAgX2tleSA9IGtleTsKKyAgICAgICAgaWYgKGFyZ3MgPT0gbnVsbCkgeworICAgICAgICAgICAgYXJncyA9IG5ldyBPYmplY3RbMF07CisgICAgICAgIH0KKyAgICAgICAgX2FyZ3MgPSBhcmdzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0S2V5KCkgeworICAgICAgICByZXR1cm4gX2tleTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0W10gZ2V0QXJndW1lbnRzKCkgeworICAgICAgICByZXR1cm4gX2FyZ3MuY2xvbmUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlQnVuZGxlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIF9idW5kbGVuYW1lOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvbDEwbi9Mb2NhbGl6YWJsZU1lc3NhZ2VGYWN0b3J5LmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2wxMG4vTG9jYWxpemFibGVNZXNzYWdlRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4ODZmZTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2wxMG4vTG9jYWxpemFibGVNZXNzYWdlRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwubDEwbjsKKworLyoqCisgKiBAYXV0aG9yIFdTIERldmVsb3BtZW50IFRlYW0KKyAqLworcHVibGljIGNsYXNzIExvY2FsaXphYmxlTWVzc2FnZUZhY3RvcnkgeworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX2J1bmRsZW5hbWU7CisKKyAgICBwdWJsaWMgTG9jYWxpemFibGVNZXNzYWdlRmFjdG9yeShTdHJpbmcgYnVuZGxlbmFtZSkgeworICAgICAgICBfYnVuZGxlbmFtZSA9IGJ1bmRsZW5hbWU7CisgICAgfQorCisgICAgcHVibGljIExvY2FsaXphYmxlIGdldE1lc3NhZ2UoU3RyaW5nIGtleSwgT2JqZWN0Li4uIGFyZ3MpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBMb2NhbGl6YWJsZU1lc3NhZ2UoX2J1bmRsZW5hbWUsIGtleSwgYXJncyk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2wxMG4vTG9jYWxpemVyLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2wxMG4vTG9jYWxpemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgxMmQ2NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvbDEwbi9Mb2NhbGl6ZXIuamF2YQpAQCAtMCwwICsxLDE2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5sMTBuOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0eVJlc291cmNlQnVuZGxlOworaW1wb3J0IGphdmEudXRpbC5SZXNvdXJjZUJ1bmRsZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLk9zZ2lSZWdpc3RyeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlJlZmxlY3Rpb25IZWxwZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi5vc2dpcmVzb3VyY2Vsb2NhdG9yLlJlc291cmNlRmluZGVyOworCisvKioKKyAqIExvY2FsaXplcyB0aGUge0BsaW5rIExvY2FsaXphYmxlfSBpbnRvIGEgbWVzc2FnZQorICogYnkgdXNpbmcgYSBjb25maWd1cmVkIHtAbGluayBMb2NhbGV9LgorICoKKyAqIEBhdXRob3IgV1MgRGV2ZWxvcG1lbnQgVGVhbQorICovCitwdWJsaWMgY2xhc3MgTG9jYWxpemVyIHsKKworICAgIHByaXZhdGUgZmluYWwgTG9jYWxlIF9sb2NhbGU7CisgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFN0cmluZywgUmVzb3VyY2VCdW5kbGU+IF9yZXNvdXJjZUJ1bmRsZXM7CisKKyAgICBwdWJsaWMgTG9jYWxpemVyKCkgeworICAgICAgICB0aGlzKExvY2FsZS5nZXREZWZhdWx0KCkpOworICAgIH0KKworICAgIHB1YmxpYyBMb2NhbGl6ZXIoTG9jYWxlIGwpIHsKKyAgICAgICAgX2xvY2FsZSA9IGw7CisgICAgICAgIF9yZXNvdXJjZUJ1bmRsZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFJlc291cmNlQnVuZGxlPigpOworICAgIH0KKworICAgIHB1YmxpYyBMb2NhbGUgZ2V0TG9jYWxlKCkgeworICAgICAgICByZXR1cm4gX2xvY2FsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGxvY2FsaXplKExvY2FsaXphYmxlIGwpIHsKKyAgICAgICAgU3RyaW5nIGtleSA9IGwuZ2V0S2V5KCk7CisgICAgICAgIGlmIChMb2NhbGl6YWJsZS5OT1RfTE9DQUxJWkFCTEUuZXF1YWxzKGtleSkpIHsKKyAgICAgICAgICAgIC8vIHRoaXMgbWVzc2FnZSBpcyBub3QgbG9jYWxpemFibGUKKyAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKSBsLmdldEFyZ3VtZW50cygpWzBdOworICAgICAgICB9CisgICAgICAgIFN0cmluZyBidW5kbGVuYW1lID0gbC5nZXRSZXNvdXJjZUJ1bmRsZU5hbWUoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgUmVzb3VyY2VCdW5kbGUgYnVuZGxlID0gX3Jlc291cmNlQnVuZGxlcy5nZXQoYnVuZGxlbmFtZSk7CisKKyAgICAgICAgICAgIGlmIChidW5kbGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGJ1bmRsZSA9IFJlc291cmNlQnVuZGxlLmdldEJ1bmRsZShidW5kbGVuYW1lLCBfbG9jYWxlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyB3b3JrIGFyb3VuZCBhIGJ1ZyBpbiB0aGUgY29tLnN1bi5lbnRlcnByaXNlLmRlcGxveW1lbnQuV2ViQnVuZGxlQXJjaGl2aXN0OgorICAgICAgICAgICAgICAgICAgICAvLyAgIGFsbCBmaWxlcyB3aXRoIGFuIGV4dGVuc2lvbiBkaWZmZXJlbnQgZnJvbSAuY2xhc3MgKGhlbmNlIGFsbCB0aGUgLnByb3BlcnRpZXMgZmlsZXMpCisgICAgICAgICAgICAgICAgICAgIC8vICAgZ2V0IGNvcGllZCB0byB0aGUgdG9wIGxldmVsIGRpcmVjdG9yeSBpbnN0ZWFkIG9mIGJlaW5nIGluIHRoZSBwYWNrYWdlIHdoZXJlIHRoZXkKKyAgICAgICAgICAgICAgICAgICAgLy8gICBhcmUgZGVmaW5lZAorICAgICAgICAgICAgICAgICAgICAvLyBzbywgc2luY2Ugd2UgY2FuJ3QgZmluZCB0aGUgYnVuZGxlIHVuZGVyIGl0cyBwcm9wZXIgbmFtZSwgd2UgbG9vayBmb3IgaXQgdW5kZXIKKyAgICAgICAgICAgICAgICAgICAgLy8gICB0aGUgdG9wLWxldmVsIHBhY2thZ2UKKworICAgICAgICAgICAgICAgICAgICBpbnQgaSA9IGJ1bmRsZW5hbWUubGFzdEluZGV4T2YoJy4nKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhbHRlcm5hdGVCdW5kbGVOYW1lID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlbmFtZS5zdWJzdHJpbmcoaSArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidW5kbGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0ZXJuYXRlQnVuZGxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9sb2NhbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTWlzc2luZ1Jlc291cmNlRXhjZXB0aW9uIGUyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJ5IE9TR2kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3NnaVJlZ2lzdHJ5IG9zZ2lSZWdpc3RyeSA9IFJlZmxlY3Rpb25IZWxwZXIuZ2V0T3NnaVJlZ2lzdHJ5SW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9zZ2lSZWdpc3RyeSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidW5kbGUgPSBvc2dpUmVnaXN0cnkuZ2V0UmVzb3VyY2VCdW5kbGUoYnVuZGxlbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGF0aCA9IGJ1bmRsZW5hbWUucmVwbGFjZSgnLicsICcvJykgKyAiLnByb3BlcnRpZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVVJMIGJ1bmRsZVVybCA9IFJlc291cmNlRmluZGVyLmZpbmRFbnRyeShwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidW5kbGVVcmwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZSA9IG5ldyBQcm9wZXJ0eVJlc291cmNlQnVuZGxlKGJ1bmRsZVVybC5vcGVuU3RyZWFtKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGJ1bmRsZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXREZWZhdWx0TWVzc2FnZShsKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBfcmVzb3VyY2VCdW5kbGVzLnB1dChidW5kbGVuYW1lLCBidW5kbGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAga2V5ID0gInVuZGVmaW5lZCI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyBtc2c7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1zZyA9IGJ1bmRsZS5nZXRTdHJpbmcoa2V5KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gbm90aWNlIHRoYXQgdGhpcyBtYXkgdGhyb3cgYSBNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gb2YgaXRzIG93biAoY2F1Z2h0IGJlbG93KQorICAgICAgICAgICAgICAgIG1zZyA9IGJ1bmRsZS5nZXRTdHJpbmcoInVuZGVmaW5lZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBsb2NhbGl6ZSBhbGwgYXJndW1lbnRzIHRvIHRoZSBnaXZlbiBsb2NhbGl6YWJsZSBvYmplY3QKKyAgICAgICAgICAgIE9iamVjdFtdIGFyZ3MgPSBsLmdldEFyZ3VtZW50cygpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKGFyZ3NbaV0gaW5zdGFuY2VvZiBMb2NhbGl6YWJsZSkgeworICAgICAgICAgICAgICAgICAgICBhcmdzW2ldID0gbG9jYWxpemUoKExvY2FsaXphYmxlKSBhcmdzW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gTWVzc2FnZUZvcm1hdC5mb3JtYXQobXNnLCBhcmdzKTsKKyAgICAgICAgICAgIHJldHVybiBtZXNzYWdlOworCisgICAgICAgIH0gY2F0Y2ggKE1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdE1lc3NhZ2UobCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldERlZmF1bHRNZXNzYWdlKExvY2FsaXphYmxlIGwpIHsKKyAgICAgICAgU3RyaW5nIGtleSA9IGwuZ2V0S2V5KCk7CisgICAgICAgIE9iamVjdFtdIGFyZ3MgPSBsLmdldEFyZ3VtZW50cygpOworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgc2IuYXBwZW5kKCJbZmFpbGVkIHRvIGxvY2FsaXplXSAiKTsKKyAgICAgICAgc2IuYXBwZW5kKGtleSk7CisgICAgICAgIGlmIChhcmdzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgnKCcpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKGkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNiLmFwcGVuZChTdHJpbmcudmFsdWVPZihhcmdzW2ldKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYi5hcHBlbmQoJyknKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2wxMG4vcGFja2FnZS1pbmZvLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2wxMG4vcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVlMzMxNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvbDEwbi9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvKioKKyAqIENvbW1vbiBKZXJzZXkgaW50ZXJuYWwgbG9jYWxpemF0aW9uIHV0aWxpdHkgY2xhc3Nlcy4KKyAqLworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5sMTBuOwpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9wYWNrYWdlLWluZm8uamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFlNmMzNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoqCisgKiBDb21tb24gSmVyc2V5IGludGVybmFsIEFQSSBjbGFzc2VzLgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsOwpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9zb25hci9Tb25hckplcnNleUNvbW1vbi5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9zb25hci9Tb25hckplcnNleUNvbW1vbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMWU4NTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3NvbmFyL1NvbmFySmVyc2V5Q29tbW9uLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5zb25hcjsKKworLyoqCisgKiBUaGUgcHVycG9zZSBvZiB0aGlzIGNsYXNzIGlzIHRvIHZlcmlmeSB0aGUgcmVwb3J0ZWQgdGVzdCBjb3ZlcmFnZSBzaG93cyBjb3JyZWN0IHJlc3VsdHMgaW4gdmFyaW91cyBtb2RlcyBvZiB0ZXN0IGV4ZWN1dGlvbnMuCisgKiBGb3IgZnVydGhlciBkZXRhaWxzLCBzZWUgamF2YWRvYyBiZWxsb3cuCisgKgorICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYSBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgU29uYXJKZXJzZXlDb21tb24geworCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgaW52b2tlZCBpbmRpcmVjdGx5IGZyb20gdGhlIHRlc3RzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgY29tbW9uKCkgeworICAgICAgICByZXR1cm4gImNvbW1vbiI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBtZXRob2QgdGhhdCBpcyBleGVjdXRlZCBmcm9tIGEgdW5pdCB0ZXN0IGJ5IG1hdmVuIHN1cmVmaXJlIHBsdWdpbiB3aXRoaW4gdGhlIHNhbWUgTWF2ZW4gbW9kdWxlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdW5pdFRlc3QoKSB7CisgICAgICAgIHJldHVybiBjb21tb24oKSArICIgdW5pdCB0ZXN0IjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBleGVjdXRlZCBmcm9tIGEgdW5pdCB0ZXN0IGJ5IG1hdmVuIHN1cmVmaXJlIHBsdWdpbiBmcm9tIGEgZGVwZW5kYW50IG1vZHVsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGUyZSgpIHsKKyAgICAgICAgcmV0dXJuIGNvbW1vbigpICsgIiBlMmUiOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgbWV0aG9kIHRoYXQgaXMgZXhlY3V0ZWQgaW4gYSBKVk0gb2YgbWF2ZW4gZmFpbHNhZmUgcGx1Z2luIGZyb20gYSBkZXBlbmRhbnQgbWF2ZW4gbW9kdWxlLiBUaGUgY2FsbCBpcyBleGVjdXRlZCBkaXJlY3RseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGludGVncmF0aW9uVGVzdEp2bSgpIHsKKyAgICAgICAgcmV0dXJuIGNvbW1vbigpICsgIiB0ZXN0IGp2bSI7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgZXhlY3V0ZWQgZnJvbSBhIHNlcnZlciAoSmV0dHkgZm9yIGluc3RhbmNlKSBkdXJpbmcgdGhlIGludGVncmF0aW9uIHRlc3QgcGhhc2UuIFRoaXMgc2VydmVyIGlzIGNhbGxlZCBieSBhCisgICAgICogSlVuaXQgdGVzdCB0aGF0IGlzIGV4ZWN1dGVkIGJ5IG1hdmVuIGZhaWxzYWZlIHBsdWdpbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGludGVncmF0aW9uU2VydmVySnZtKCkgeworICAgICAgICByZXR1cm4gY29tbW9uKCkgKyAiIHNlcnZlciBqdm0iOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvc3BpL0F1dG9EaXNjb3ZlcmFibGUuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvc3BpL0F1dG9EaXNjb3ZlcmFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzcxNTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9zcGkvQXV0b0Rpc2NvdmVyYWJsZS5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuc3BpOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlQ29udGV4dDsKKworLyoqCisgKiBBIHNlcnZpY2UgcHJvdmlkZXIgY29udHJhY3QgZm9yIEpBWC1SUyBhbmQgSmVyc2V5IGNvbXBvbmVudHMgdGhhdCBuZWVkIHRvIGJlIGF1dG9tYXRpY2FsbHkgZGlzY292ZXJlZCBhbmQgcmVnaXN0ZXJlZCBpbgorICoge0BsaW5rIGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbiBydW50aW1lIGNvbmZpZ3VyYXRpb25zfS4KKyAqIDxwLz4KKyAqIEEgY29tcG9uZW50IGltcGxlbWVudGluZyB0aGlzIGNvbnRyYWN0IGJlY29tZXMgYXV0by1kaXNjb3ZlcmFibGUgYnkgYWRkaW5nIGEgbmV3IGVudHJ5IHdpdGggZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgaXRzCisgKiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBuYW1lIHRvIGEge0Bjb2RlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnNwaS5BdXRvRGlzY292ZXJhYmxlfSBmaWxlIGluIHRoZSB7QGNvZGUKKyAqIE1FVEEtSU5GL3NlcnZpY2VzfSBkaXJlY3RvcnkuCisgKiA8cC8+CisgKiBBbG1vc3QgYWxsIEplcnNleSB7QGNvZGUgQXV0b0Rpc2NvdmVyYWJsZX0gaW1wbGVtZW50YXRpb25zIGhhdmUKKyAqIHtAbGluayAjREVGQVVMVF9QUklPUklUWX0ge0BsaW5rIGphdmF4LmFubm90YXRpb24uUHJpb3JpdHkgcHJpb3JpdHl9IHNldC4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGludGVyZmFjZSBBdXRvRGlzY292ZXJhYmxlIHsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29tbW9uIHByaW9yaXR5IG9mIEplcnNleSBidWlsZC1pbiBhdXRvLWRpc2NvdmVyYWJsZXMuCisgICAgICogVXNlIGxvd2VyIG51bWJlciBvbiB5b3VyIHtAY29kZSBBdXRvRGlzY292ZXJhYmxlfSBpbXBsZW1lbnRhdGlvbiB0byBydW4gaXQgYmVmb3JlIEplcnNleSBhdXRvLWRpc2NvdmVyYWJsZXMKKyAgICAgKiBhbmQgdmljZSB2ZXJzYS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1BSSU9SSVRZID0gMjAwMDsKKworICAgIC8qKgorICAgICAqIEEgY2FsbC1iYWNrIG1ldGhvZCBjYWxsZWQgd2hlbiBhbiBhdXRvLWRpc2NvdmVyYWJsZSBjb21wb25lbnQgaXMgdG8gYmUgY29uZmlndXJlZCBpbiBhIGdpdmVuIHJ1bnRpbWUgY29uZmlndXJhdGlvbiBzY29wZS4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlIHRoYXQgYXMgd2l0aCB7QGxpbmsgamF2YXgud3MucnMuY29yZS5GZWF0dXJlIEpBWC1SUyBmZWF0dXJlc30sIGJlZm9yZSByZWdpc3RlcmluZyBuZXcgSkFYLVJTIGNvbXBvbmVudHMgaW4gYQorICAgICAqIGdpdmVuIGNvbmZpZ3VyYWJsZSBjb250ZXh0LCBhbiBhdXRvLWRpc2NvdmVyYWJsZSBjb21wb25lbnQgc2hvdWxkIHZlcmlmeSB0aGF0IG5ld2x5IHJlZ2lzdGVyZWQgY29tcG9uZW50cyBhcmUgbm90CisgICAgICogYWxyZWFkeSByZWdpc3RlcmVkIGluIHRoZSBjb25maWd1cmFibGUgY29udGV4dC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBjb25maWd1cmFibGUgY29udGV4dCBpbiB3aGljaCB0aGUgYXV0by1kaXNjb3ZlcmFibGUgc2hvdWxkIGJlIGNvbmZpZ3VyZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY29uZmlndXJlKEZlYXR1cmVDb250ZXh0IGNvbnRleHQpOworfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9zcGkvRm9yY2VkQXV0b0Rpc2NvdmVyYWJsZS5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9zcGkvRm9yY2VkQXV0b0Rpc2NvdmVyYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMmViNjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3NwaS9Gb3JjZWRBdXRvRGlzY292ZXJhYmxlLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5zcGk7CisKKy8qKgorICogQSBzZXJ2aWNlIHByb3ZpZGVyIGNvbnRyYWN0IGZvciBKQVgtUlMgYW5kIEplcnNleSBjb21wb25lbnRzIHRoYXQgbmVlZCB0byBiZSBhdXRvbWF0aWNhbGx5IGRpc2NvdmVyZWQgYW5kIHJlZ2lzdGVyZWQgaW4KKyAqIHtAbGluayBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb24gcnVudGltZSBjb25maWd1cmF0aW9uc30uCisgKiA8cC8+CisgKiBBIGNvbXBvbmVudCBpbXBsZW1lbnRpbmcgdGhpcyBjb250cmFjdCBiZWNvbWVzIGF1dG8tZGlzY292ZXJhYmxlIGJ5IGFkZGluZyBhIG5ldyBlbnRyeSB3aXRoIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIGl0cworICogaW1wbGVtZW50YXRpb24gY2xhc3MgbmFtZSB0byBhIHtAY29kZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5zcGkuQXV0b0Rpc2NvdmVyYWJsZX0gZmlsZSBpbiB0aGUge0Bjb2RlCisgKiBNRVRBLUlORi9zZXJ2aWNlc30gZGlyZWN0b3J5LgorICogPHAvPgorICogSW1wbGVtZW50YXRpb25zIG9mIHRoaXMgY29udHJhY3QgYXJlIGFsd2F5cyB7QGxpbmsgI2NvbmZpZ3VyZShqYXZheC53cy5ycy5jb3JlLkZlYXR1cmVDb250ZXh0KSBjb25maWd1cmVkfSByZWdhcmRsZXNzIG9mCisgKiB2YWx1ZXMgb2YgcHJvcGVydGllcyB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuQ29tbW9uUHJvcGVydGllcyNGRUFUVVJFX0FVVE9fRElTQ09WRVJZX0RJU0FCTEV9IGFuZAorICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LkNvbW1vblByb3BlcnRpZXMjTUVUQUlORl9TRVJWSUNFU19MT09LVVBfRElTQUJMRX0uCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKiBAc2VlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnNwaS5BdXRvRGlzY292ZXJhYmxlCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRm9yY2VkQXV0b0Rpc2NvdmVyYWJsZSBleHRlbmRzIEF1dG9EaXNjb3ZlcmFibGUgeworfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9zcGkvcGFja2FnZS1pbmZvLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3NwaS9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWIwNmU1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9zcGkvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoqCisgKiBDb21tb24gSmVyc2V5IGludGVybmFsIFNQSSBjbGFzc2VzL2ludGVyZmFjZXMuCisgKi8KK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuc3BpOwpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL0Jhc2U2NC5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL0Jhc2U2NC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYzZmNTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvQmFzZTY0LmphdmEKQEAgLTAsMCArMSwxODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbDsKKworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIHRoYXQgaW1wbGVtZW50cyBiYXNlNjQgZW5jb2RpbmcgYW5kIGRlY29kaW5nLgorICoKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitwdWJsaWMgY2xhc3MgQmFzZTY0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBDSEFSX1NFVDsKKworICAgIHN0YXRpYyB7CisgICAgICAgIGZpbmFsIFN0cmluZyBzID0gIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89IjsKKyAgICAgICAgYnl0ZVtdIGNzOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjcyA9IHMuZ2V0Qnl0ZXMoIkFTQ0lJIik7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIHNob3VsZCBuZXZlciBoYXBwZW4KKyAgICAgICAgICAgIGNzID0gcy5nZXRCeXRlcygpOworICAgICAgICB9CisgICAgICAgIENIQVJfU0VUID0gY3M7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIEJBU0U2NElOREVYRVMgPSB7CisgICAgICAgICAgICA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwKKyAgICAgICAgICAgIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LAorICAgICAgICAgICAgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2MiwgNjQsIDY0LCA2NCwgNjMsCisgICAgICAgICAgICA1MiwgNTMsIDU0LCA1NSwgNTYsIDU3LCA1OCwgNTksIDYwLCA2MSwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwKKyAgICAgICAgICAgIDY0LCAwLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsCisgICAgICAgICAgICAxNSwgMTYsIDE3LCAxOCwgMTksIDIwLCAyMSwgMjIsIDIzLCAyNCwgMjUsIDY0LCA2NCwgNjQsIDY0LCA2NCwKKyAgICAgICAgICAgIDY0LCAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLAorICAgICAgICAgICAgNDEsIDQyLCA0MywgNDQsIDQ1LCA0NiwgNDcsIDQ4LCA0OSwgNTAsIDUxLCA2NCwgNjQsIDY0LCA2NCwgNjQsCisgICAgICAgICAgICA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwKKyAgICAgICAgICAgIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LAorICAgICAgICAgICAgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsCisgICAgICAgICAgICA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwKKyAgICAgICAgICAgIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LAorICAgICAgICAgICAgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsCisgICAgICAgICAgICA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwKKyAgICAgICAgICAgIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0LCA2NCwgNjQsIDY0CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEVuY29kZXMgYXJyYXkgb2YgYnl0ZXMgdXNpbmcgYmFzZTY0IGVuY29kaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGJ1ZmZlciBBcnJheSBvZiBieXRlcyB0byBiZSBlbmNvZGVkLgorICAgICAqIEByZXR1cm4gRW5jb2RlZCByZXN1bHQgYXMgYW4gYXJyYXkgb2YgYnl0ZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBieXRlW10gZW5jb2RlKGZpbmFsIGJ5dGVbXSBidWZmZXIpIHsKKyAgICAgICAgZmluYWwgaW50IGNjb3VudCA9IGJ1ZmZlci5sZW5ndGggLyAzOworICAgICAgICBmaW5hbCBpbnQgcmVzdCA9IGJ1ZmZlci5sZW5ndGggJSAzOworICAgICAgICBmaW5hbCBieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbKGNjb3VudCArIChyZXN0ID4gMCA/IDEgOiAwKSkgKiA0XTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNjb3VudDsgaSsrKSB7CisgICAgICAgICAgICByZXN1bHRbaSAqIDRdID0gQ0hBUl9TRVRbKGJ1ZmZlcltpICogM10gPj4gMikgJiAweGZmXTsKKyAgICAgICAgICAgIHJlc3VsdFtpICogNCArIDFdID0gQ0hBUl9TRVRbKCgoYnVmZmVyW2kgKiAzXSAmIDB4MDMpIDw8IDQpIHwgKGJ1ZmZlcltpICogMyArIDFdID4+IDQpKSAmIDB4ZmZdOworICAgICAgICAgICAgcmVzdWx0W2kgKiA0ICsgMl0gPSBDSEFSX1NFVFsoKChidWZmZXJbaSAqIDMgKyAxXSAmIDB4MGYpIDw8IDIpIHwgKGJ1ZmZlcltpICogMyArIDJdID4+IDYpKSAmIDB4ZmZdOworICAgICAgICAgICAgcmVzdWx0W2kgKiA0ICsgM10gPSBDSEFSX1NFVFtidWZmZXJbaSAqIDMgKyAyXSAmIDB4M2ZdOworICAgICAgICB9CisKKyAgICAgICAgaW50IHRlbXAgPSAwOworCisgICAgICAgIGlmIChyZXN0ID4gMCkgeworICAgICAgICAgICAgaWYgKHJlc3QgPT0gMikgeworICAgICAgICAgICAgICAgIHJlc3VsdFtjY291bnQgKiA0ICsgMl0gPSBDSEFSX1NFVFsoKGJ1ZmZlcltjY291bnQgKiAzICsgMV0gJiAweDBmKSA8PCAyKSAmIDB4ZmZdOworICAgICAgICAgICAgICAgIHRlbXAgPSBidWZmZXJbY2NvdW50ICogMyArIDFdID4+IDQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlc3VsdFtjY291bnQgKiA0ICsgMl0gPSBDSEFSX1NFVFtDSEFSX1NFVC5sZW5ndGggLSAxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdFtjY291bnQgKiA0ICsgM10gPSBDSEFSX1NFVFtDSEFSX1NFVC5sZW5ndGggLSAxXTsKKyAgICAgICAgICAgIHJlc3VsdFtjY291bnQgKiA0ICsgMV0gPSBDSEFSX1NFVFsoKChidWZmZXJbY2NvdW50ICogM10gJiAweDAzKSA8PCA0KSB8IHRlbXApICYgMHhmZl07CisgICAgICAgICAgICByZXN1bHRbY2NvdW50ICogNF0gPSBDSEFSX1NFVFsoYnVmZmVyW2Njb3VudCAqIDNdID4+IDIpICYgMHhmZl07CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIERlY29kZXMgQmFzZTY0IGRhdGEgaW50byBvY3RlY3RzLgorICAgICAqCisgICAgICogQHBhcmFtIGJ1ZmZlciBCeXRlIGFycmF5IGNvbnRhaW5pbmcgQmFzZTY0IGRhdGEKKyAgICAgKiBAcmV0dXJuIEFycmF5IGNvbnRhaW5pbmcgZGVjb2RlZCBkYXRhLgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJmYWxsdGhyb3VnaCIpCisgICAgcHVibGljIHN0YXRpYyBieXRlW10gZGVjb2RlKGZpbmFsIGJ5dGVbXSBidWZmZXIpIHsKKyAgICAgICAgaWYgKGJ1ZmZlci5sZW5ndGggPCA0ICYmIChidWZmZXIubGVuZ3RoICUgNCkgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBieXRlWzBdOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgaW50IGNjb3VudCA9IGJ1ZmZlci5sZW5ndGggLyA0OworICAgICAgICBmaW5hbCBpbnQgcGFkZGluZ0NvdW50ID0gKGJ1ZmZlcltidWZmZXIubGVuZ3RoIC0gMV0gPT0gJz0nID8gMSA6IDApICsgKGJ1ZmZlcltidWZmZXIubGVuZ3RoIC0gMl0gPT0gJz0nID8gMSA6IDApOworICAgICAgICBmaW5hbCBieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbMyAqIChjY291bnQgLSAxKSArICgzIC0gcGFkZGluZ0NvdW50KV07CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoY2NvdW50IC0gMSk7IGkrKykgeworICAgICAgICAgICAgcmVzdWx0W2kgKiAzXSA9IChieXRlKSAoKEJBU0U2NElOREVYRVNbYnVmZmVyW2kgKiA0XV0gPDwgMikgfCAoQkFTRTY0SU5ERVhFU1tidWZmZXJbaSAqIDQgKyAxXV0gPj4gNCkpOworICAgICAgICAgICAgcmVzdWx0W2kgKiAzICsgMV0gPSAoYnl0ZSkgKChCQVNFNjRJTkRFWEVTW2J1ZmZlcltpICogNCArIDFdXSA8PCA0KSB8IChCQVNFNjRJTkRFWEVTW2J1ZmZlcltpICogNCArIDJdXSA+PiAyKSk7CisgICAgICAgICAgICByZXN1bHRbaSAqIDMgKyAyXSA9IChieXRlKSAoKEJBU0U2NElOREVYRVNbYnVmZmVyW2kgKiA0ICsgMl1dIDw8IDYpIHwgQkFTRTY0SU5ERVhFU1tidWZmZXJbaSAqIDQgKyAzXV0pOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgaW50IGkgPSBjY291bnQgLSAxOworICAgICAgICBzd2l0Y2ggKHBhZGRpbmdDb3VudCkgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIHJlc3VsdFtpICogMyArIDJdID0gKGJ5dGUpICgoQkFTRTY0SU5ERVhFU1tidWZmZXJbaSAqIDQgKyAyXV0gPDwgNikgfCBCQVNFNjRJTkRFWEVTW2J1ZmZlcltpICogNCArIDNdXSk7CisgICAgICAgICAgICAgICAgcmVzdWx0W2kgKiAzICsgMV0gPSAoYnl0ZSkgKChCQVNFNjRJTkRFWEVTW2J1ZmZlcltpICogNCArIDFdXSA8PCA0KSB8IChCQVNFNjRJTkRFWEVTW2J1ZmZlcltpICogNCArIDJdXSA+PiAyKSk7CisgICAgICAgICAgICAgICAgcmVzdWx0W2kgKiAzXSA9IChieXRlKSAoKEJBU0U2NElOREVYRVNbYnVmZmVyW2kgKiA0XV0gPDwgMikgfCAoQkFTRTY0SU5ERVhFU1tidWZmZXJbaSAqIDQgKyAxXV0gPj4gNCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIHJlc3VsdFtpICogMyArIDFdID0gKGJ5dGUpICgoQkFTRTY0SU5ERVhFU1tidWZmZXJbaSAqIDQgKyAxXV0gPDwgNCkgfCAoQkFTRTY0SU5ERVhFU1tidWZmZXJbaSAqIDQgKyAyXV0gPj4gMikpOworICAgICAgICAgICAgICAgIHJlc3VsdFtpICogM10gPSAoYnl0ZSkgKChCQVNFNjRJTkRFWEVTW2J1ZmZlcltpICogNF1dIDw8IDIpIHwgKEJBU0U2NElOREVYRVNbYnVmZmVyW2kgKiA0ICsgMV1dID4+IDQpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICByZXN1bHRbaSAqIDNdID0gKGJ5dGUpICgoQkFTRTY0SU5ERVhFU1tidWZmZXJbaSAqIDRdXSA8PCAyKSB8IChCQVNFNjRJTkRFWEVTW2J1ZmZlcltpICogNCArIDFdXSA+PiA0KSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuY29kZXMgYXJyYXkgb2YgYnl0ZXMgdXNpbmcgYmFzZTY0IGVuY29kaW5nIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgYXMgYSBzdHJpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVmZmVyIEFycmF5IG9mIGJ5dGVzIHRvIGJlIGVuY29kZWQuCisgICAgICogQHJldHVybiBSZXN1bHRpbmcgZW5jb2RlZCBzdHJpbmcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlQXNTdHJpbmcoZmluYWwgYnl0ZVtdIGJ1ZmZlcikgeworICAgICAgICBmaW5hbCBieXRlW10gcmVzdWx0ID0gZW5jb2RlKGJ1ZmZlcik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhyZXN1bHQsICJBU0NJSSIpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuCisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhyZXN1bHQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5jb2RlcyBhIHN0cmluZyB1c2luZyBiYXNlNjQgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBhcyBhbm90aGVyIHN0cmluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0IFN0cmluZyB0byBiZSBlbmNvZGVkLgorICAgICAqIEByZXR1cm4gUmVzdWx0aW5nIGVuY29kZWQgc3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY29kZUFzU3RyaW5nKGZpbmFsIFN0cmluZyB0ZXh0KSB7CisgICAgICAgIHJldHVybiBlbmNvZGVBc1N0cmluZyh0ZXh0LmdldEJ5dGVzKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlY29kZXMgYXJyYXkgb2YgYnl0ZXMgdXNpbmcgYmFzZTY0IGRlY29kaW5nIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgYXMgYSBzdHJpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVmZmVyIEFycmF5IG9mIGJ5dGVzIHRvIGJlIGRlY29kZWQuCisgICAgICogQHJldHVybiBSZXN1bHRpbmcgZGVjb2RlZCBzdHJpbmcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZGVjb2RlQXNTdHJpbmcoZmluYWwgYnl0ZVtdIGJ1ZmZlcikgeworICAgICAgICBmaW5hbCBieXRlW10gcmVzdWx0ID0gZGVjb2RlKGJ1ZmZlcik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhyZXN1bHQsICJBU0NJSSIpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuCisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhyZXN1bHQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVjb2RlcyBhIHN0cmluZyB1c2luZyBiYXNlNjQgYW5kIHJldHVybnMgdGhlIHJlc3VsdCBhcyBhbm90aGVyIHN0cmluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZXh0IFN0cmluZyB0byBiZSBkZWNvZGVkLgorICAgICAqIEByZXR1cm4gUmVzdWx0aW5nIGRlY29kZWQgc3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlY29kZUFzU3RyaW5nKGZpbmFsIFN0cmluZyB0ZXh0KSB7CisgICAgICAgIHJldHVybiBkZWNvZGVBc1N0cmluZyh0ZXh0LmdldEJ5dGVzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9DbG9zaW5nLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvQ2xvc2luZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYWIzNDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvQ2xvc2luZy5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworLyoqCisgKiBBIGhlbHBlciBjbGFzcyB0byBhaWQgdGhlIGNsb3Npbmcgb2Yge0BsaW5rIGphdmEuaW8uSW5wdXRTdHJlYW19LgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqLworcHVibGljIGNsYXNzIENsb3NpbmcgeworCisgICAgcHVibGljIHN0YXRpYyBDbG9zaW5nIHdpdGgoZmluYWwgSW5wdXRTdHJlYW0gaW4pIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDbG9zaW5nKGluKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIElucHV0U3RyZWFtIGluOworCisgICAgcHVibGljIENsb3NpbmcoZmluYWwgSW5wdXRTdHJlYW0gaW4pIHsKKyAgICAgICAgdGhpcy5pbiA9IGluOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGludm9rZShmaW5hbCBDbG9zdXJlPElucHV0U3RyZWFtPiBjKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoaW4gPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjLmludm9rZShpbik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGluLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHRocm93IGV4OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL0Nsb3N1cmUuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9DbG9zdXJlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODllM2NlMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9DbG9zdXJlLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsOworCisvKioKKyAqIENsb3N1cmUgaW50ZXJmYWNlLgorICoKKyAqIEBwYXJhbSA8VD4gZGF0YSB0eXBlLgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGludGVyZmFjZSBDbG9zdXJlPFQ+IHsKKyAgICAvKioKKyAgICAgKiBJbnZva2UgdGhlIGNsb3N1cmUgb24gdGhlIGRhdGEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGF0YSBpbnB1dCBkYXRhLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGludm9rZShUIGRhdGEpOworfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL0V4Y2VwdGlvblV0aWxzLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvRXhjZXB0aW9uVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTZjMjQyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL0V4Y2VwdGlvblV0aWxzLmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsOworCitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8qKgorICogVGhlIEV4Y2VwdGlvbiBVdGlscyBjbGFzcyBwcm92aWRlIHV0aWxpdHkgbWV0aG9kIGZvciBleGNlcHRpb24gaGFuZGxpbmcuCisgKgorICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYUBvcmFjbGUuY29tKQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRXhjZXB0aW9uVXRpbHMgeworCisgICAgcHJpdmF0ZSBFeGNlcHRpb25VdGlscygpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBzdGFjayB0cmFjZSBvZiB0aGUgcHJvdmlkZWQgdGhyb3dhYmxlIGFzIGEgc3RyaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIHQgdGhlIGV4Y2VwdGlvbiB0byBnZXQgdGhlIHN0YWNrIHRyYWNlIGZvci4KKyAgICAgKiBAcmV0dXJuIHRoZSBzdGFjayB0cmFjZSBhcyBhIHN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBleGNlcHRpb25TdGFja1RyYWNlQXNTdHJpbmcoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICB0LnByaW50U3RhY2tUcmFjZShuZXcgUHJpbnRXcml0ZXIoc3cpKTsKKyAgICAgICAgcmV0dXJuIHN3LnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQmFzZWQgb24gdGhlIHJldGhyb3cgcGFyYW1ldGVyLCBlaXRoZXIgcmV0aHJvd3MgdGhlIHN1cHBsaWVkIGV4Y2VwdGlvbiBvciBsb2dzIHRoZSBwcm92aWRlZCBtZXNzYWdlIGF0IHRoZSBnaXZlbiBsZXZlbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlICAgICAgIHRoZSBleGNlcHRpb24gdG8gcmV0aHJvdyBpZiByZXRocm93IGlzIHtAY29kZSB0cnVlfS4KKyAgICAgKiBAcGFyYW0gcmV0aHJvdyB3aGV0aGVyIHRvIHJldGhyb3cgYW4gZXhjZXB0aW9uIG9yIGp1c3QgbG9nIHRoZSBwcm92aWRlZCBtZXNzYWdlLgorICAgICAqIEBwYXJhbSBsb2dnZXIgIHRoZSBsb2dnZXIgdG8gcHJpbnQgdGhlIG1lc3NhZ2Ugd2l0aC4KKyAgICAgKiBAcGFyYW0gbSAgICAgICB0aGUgbWVzc2FnZSB0byBsb2cgaWYgcmV0aHJvdyBpcyB7QGNvZGUgZmFsc2V9LgorICAgICAqIEBwYXJhbSBsZXZlbCAgIHRoZSBsZXZlbCBvZiB0aGUgbG9nZ2VkIG1lc3NhZ2UuCisgICAgICogQHBhcmFtIDxUPiAgICAgdGhlIHR5cGUgb2YgdGhlIGV4Y2VwdGlvbiB0byBiZSBjb25kaXRpb25hbGx5IHJldGhyb3duLgorICAgICAqIEB0aHJvd3MgVCBpZiByZXRocm93IGlzIHtAY29kZSB0cnVlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgRXhjZXB0aW9uPiB2b2lkIGNvbmRpdGlvbmFsbHlSZVRocm93KFQgZSwgYm9vbGVhbiByZXRocm93LCBMb2dnZXIgbG9nZ2VyLCBTdHJpbmcgbSwgTGV2ZWwgbGV2ZWwpCisgICAgICAgICAgICB0aHJvd3MgVCB7CisgICAgICAgIGlmIChyZXRocm93KSB7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gZG8gbm90IG1hc2sgdGhlIG90aGVyIGV4Y2VwdGlvbiwganVzdCBsb2cgdGhpcyBvbmUKKyAgICAgICAgICAgIGxvZ2dlci5sb2cobGV2ZWwsIG0sIGUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL0V4dGVuZGVkTG9nZ2VyLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvRXh0ZW5kZWRMb2dnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjhmMzljCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL0V4dGVuZGVkTG9nZ2VyLmphdmEKQEAgLTAsMCArMSwzMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLlJlc291cmNlQnVuZGxlOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkZpbHRlcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5IYW5kbGVyOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8qKgorICogTG9nZ2VyIGV4dGVuc2lvbiB3aXRoIGFkZGl0aW9uYWwgbG9nZ2luZyB1dGlsaXR5ICYgY29udmVuaWVuY2UgbWV0aG9kcy4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQorcHVibGljIGZpbmFsIGNsYXNzIEV4dGVuZGVkTG9nZ2VyIHsKKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJOb25Db25zdGFudExvZ2dlciIpCisgICAgcHJpdmF0ZSBmaW5hbCBMb2dnZXIgbG9nZ2VyOworICAgIHByaXZhdGUgZmluYWwgTGV2ZWwgZGVidWdMZXZlbDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgbG9nZ2VyIGV4dGVuc2lvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2dnZXIgICAgIHdyYXBwZWQgbG9nZ2VyLgorICAgICAqIEBwYXJhbSBkZWJ1Z0xldmVsIGRlYnVnIG1lc3NhZ2UgbG9nZ2luZyBsZXZlbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRXh0ZW5kZWRMb2dnZXIoZmluYWwgTG9nZ2VyIGxvZ2dlciwgZmluYWwgTGV2ZWwgZGVidWdMZXZlbCkgeworICAgICAgICB0aGlzLmxvZ2dlciA9IGxvZ2dlcjsKKyAgICAgICAgdGhpcy5kZWJ1Z0xldmVsID0gZGVidWdMZXZlbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiB0aGUgZGVidWcgbGV2ZWwgaXMgbG9nZ2FibGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZGVidWcgbGV2ZWwgaXMgbG9nZ2FibGUsIHtAY29kZSBmYWxzZX0KKyAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0RlYnVnTG9nZ2FibGUoKSB7CisgICAgICAgIHJldHVybiBsb2dnZXIuaXNMb2dnYWJsZShkZWJ1Z0xldmVsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNvbmZpZ3VyZWQgZGVidWcgbGV2ZWwuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGNvbmZpZ3VyZWQgZGVidWcgbGV2ZWwuCisgICAgICovCisgICAgcHVibGljIExldmVsIGdldERlYnVnTGV2ZWwoKSB7CisgICAgICAgIHJldHVybiBkZWJ1Z0xldmVsOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvZyBhIGRlYnVnIG1lc3NhZ2UgdXNpbmcgdGhlIGNvbmZpZ3VyZWQgZGVidWcgbGV2ZWwuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBhcHBlbmRzIHRocmVhZCBuYW1lIGluZm9ybWF0aW9uIHRvIHRoZSBlbmQgb2YgdGhlIGxvZ2dlZCBtZXNzYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2UgZGVidWcgbWVzc2FnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZWJ1Z0xvZyhmaW5hbCBTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICBkZWJ1Z0xvZyhtZXNzYWdlLCAoT2JqZWN0W10pIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvZyBhIGRlYnVnIG1lc3NhZ2UgdXNpbmcgdGhlIGNvbmZpZ3VyZWQgZGVidWcgbGV2ZWwuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBhcHBlbmRzIHRocmVhZCBuYW1lIGluZm9ybWF0aW9uIHRvIHRoZSBlbmQgb2YgdGhlIGxvZ2dlZCBtZXNzYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2VUZW1wbGF0ZSBkZWJ1ZyBtZXNzYWdlIHRlbXBsYXRlLgorICAgICAqIEBwYXJhbSBhcmdzICAgICAgICAgICAgbWVzc2FnZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRlYnVnTG9nKGZpbmFsIFN0cmluZyBtZXNzYWdlVGVtcGxhdGUsIGZpbmFsIE9iamVjdC4uLiBhcmdzKSB7CisKKyAgICAgICAgaWYgKGxvZ2dlci5pc0xvZ2dhYmxlKGRlYnVnTGV2ZWwpKSB7CisgICAgICAgICAgICBmaW5hbCBPYmplY3RbXSBtZXNzYWdlQXJndW1lbnRzOworICAgICAgICAgICAgaWYgKGFyZ3MgPT0gbnVsbCB8fCBhcmdzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgbWVzc2FnZUFyZ3VtZW50cyA9IG5ldyBPYmplY3RbMV07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1lc3NhZ2VBcmd1bWVudHMgPSBBcnJheXMuY29weU9mKGFyZ3MsIGFyZ3MubGVuZ3RoICsgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZXNzYWdlQXJndW1lbnRzW21lc3NhZ2VBcmd1bWVudHMubGVuZ3RoIC0gMV0gPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKTsKKworICAgICAgICAgICAgbG9nZ2VyLmxvZyhkZWJ1Z0xldmVsLCAiW0RFQlVHXSAiICsgbWVzc2FnZVRlbXBsYXRlICsgIiBvbiB0aHJlYWQgeyIgKyAobWVzc2FnZUFyZ3VtZW50cy5sZW5ndGggLSAxKSArICd9JywKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUFyZ3VtZW50cyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIkV4dGVuZGVkTG9nZ2VyeyIgKyAibG9nZ2VyPSIgKyBsb2dnZXIgKyAiLCBkZWJ1Z0xldmVsPSIgKyBkZWJ1Z0xldmVsICsgJ30nOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgRXh0ZW5kZWRMb2dnZXIgb3RoZXIgPSAoRXh0ZW5kZWRMb2dnZXIpIG9iajsKKyAgICAgICAgaWYgKHRoaXMubG9nZ2VyICE9IG90aGVyLmxvZ2dlciAmJiAodGhpcy5sb2dnZXIgPT0gbnVsbCB8fCAhdGhpcy5sb2dnZXIuZXF1YWxzKG90aGVyLmxvZ2dlcikpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMuZGVidWdMZXZlbCAhPSBvdGhlci5kZWJ1Z0xldmVsICYmICh0aGlzLmRlYnVnTGV2ZWwgPT0gbnVsbCB8fCAhdGhpcy5kZWJ1Z0xldmVsLmVxdWFscyhvdGhlci5kZWJ1Z0xldmVsKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IDM7CisgICAgICAgIGhhc2ggPSAxNyAqIGhhc2ggKyAodGhpcy5sb2dnZXIgIT0gbnVsbCA/IHRoaXMubG9nZ2VyLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgaGFzaCA9IDE3ICogaGFzaCArICh0aGlzLmRlYnVnTGV2ZWwgIT0gbnVsbCA/IHRoaXMuZGVidWdMZXZlbC5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIHJldHVybiBoYXNoOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHdhcm5pbmcoZmluYWwgU3RyaW5nIG1zZykgeworICAgICAgICBsb2dnZXIud2FybmluZyhtc2cpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRocm93aW5nKGZpbmFsIFN0cmluZyBzb3VyY2VDbGFzcywgZmluYWwgU3RyaW5nIHNvdXJjZU1ldGhvZCwgZmluYWwgVGhyb3dhYmxlIHRocm93bikgeworICAgICAgICBsb2dnZXIudGhyb3dpbmcoc291cmNlQ2xhc3MsIHNvdXJjZU1ldGhvZCwgdGhyb3duKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXZlcmUoZmluYWwgU3RyaW5nIG1zZykgeworICAgICAgICBsb2dnZXIuc2V2ZXJlKG1zZyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXNlUGFyZW50SGFuZGxlcnMoZmluYWwgYm9vbGVhbiB1c2VQYXJlbnRIYW5kbGVycykgeworICAgICAgICBsb2dnZXIuc2V0VXNlUGFyZW50SGFuZGxlcnModXNlUGFyZW50SGFuZGxlcnMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBhcmVudChmaW5hbCBMb2dnZXIgcGFyZW50KSB7CisgICAgICAgIGxvZ2dlci5zZXRQYXJlbnQocGFyZW50KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMZXZlbChmaW5hbCBMZXZlbCBuZXdMZXZlbCkgdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIHsKKyAgICAgICAgbG9nZ2VyLnNldExldmVsKG5ld0xldmVsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGaWx0ZXIoZmluYWwgRmlsdGVyIG5ld0ZpbHRlcikgdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIHsKKyAgICAgICAgbG9nZ2VyLnNldEZpbHRlcihuZXdGaWx0ZXIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlbW92ZUhhbmRsZXIoZmluYWwgSGFuZGxlciBoYW5kbGVyKSB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24geworICAgICAgICBsb2dnZXIucmVtb3ZlSGFuZGxlcihoYW5kbGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2dyYihmaW5hbCBMZXZlbCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc291cmNlQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHNvdXJjZU1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYnVuZGxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnLAorICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFRocm93YWJsZSB0aHJvd24pIHsKKyAgICAgICAgbG9nZ2VyLmxvZ3JiKGxldmVsLCBzb3VyY2VDbGFzcywgc291cmNlTWV0aG9kLCBidW5kbGVOYW1lLCBtc2csIHRocm93bik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9ncmIoZmluYWwgTGV2ZWwgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHNvdXJjZUNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzb3VyY2VNZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGJ1bmRsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZywKKyAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3RbXSBwYXJhbXMpIHsKKyAgICAgICAgbG9nZ2VyLmxvZ3JiKGxldmVsLCBzb3VyY2VDbGFzcywgc291cmNlTWV0aG9kLCBidW5kbGVOYW1lLCBtc2csIHBhcmFtcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9ncmIoZmluYWwgTGV2ZWwgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHNvdXJjZUNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzb3VyY2VNZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGJ1bmRsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZywKKyAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgcGFyYW0xKSB7CisgICAgICAgIGxvZ2dlci5sb2dyYihsZXZlbCwgc291cmNlQ2xhc3MsIHNvdXJjZU1ldGhvZCwgYnVuZGxlTmFtZSwgbXNnLCBwYXJhbTEpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvZ3JiKGZpbmFsIExldmVsIGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzb3VyY2VDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc291cmNlTWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBidW5kbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2cpIHsKKyAgICAgICAgbG9nZ2VyLmxvZ3JiKGxldmVsLCBzb3VyY2VDbGFzcywgc291cmNlTWV0aG9kLCBidW5kbGVOYW1lLCBtc2cpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvZ3AoZmluYWwgTGV2ZWwgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc291cmNlQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc291cmNlTWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1zZywKKyAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFRocm93YWJsZSB0aHJvd24pIHsKKyAgICAgICAgbG9nZ2VyLmxvZ3AobGV2ZWwsIHNvdXJjZUNsYXNzLCBzb3VyY2VNZXRob2QsIG1zZywgdGhyb3duKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2dwKGZpbmFsIExldmVsIGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHNvdXJjZUNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHNvdXJjZU1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2csCisgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3RbXSBwYXJhbXMpIHsKKyAgICAgICAgbG9nZ2VyLmxvZ3AobGV2ZWwsIHNvdXJjZUNsYXNzLCBzb3VyY2VNZXRob2QsIG1zZywgcGFyYW1zKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBsb2dwKGZpbmFsIExldmVsIGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHNvdXJjZUNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHNvdXJjZU1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtc2csCisgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgcGFyYW0xKSB7CisgICAgICAgIGxvZ2dlci5sb2dwKGxldmVsLCBzb3VyY2VDbGFzcywgc291cmNlTWV0aG9kLCBtc2csIHBhcmFtMSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9ncChmaW5hbCBMZXZlbCBsZXZlbCwgZmluYWwgU3RyaW5nIHNvdXJjZUNsYXNzLCBmaW5hbCBTdHJpbmcgc291cmNlTWV0aG9kLCBmaW5hbCBTdHJpbmcgbXNnKSB7CisgICAgICAgIGxvZ2dlci5sb2dwKGxldmVsLCBzb3VyY2VDbGFzcywgc291cmNlTWV0aG9kLCBtc2cpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvZyhmaW5hbCBMZXZlbCBsZXZlbCwgZmluYWwgU3RyaW5nIG1zZywgZmluYWwgVGhyb3dhYmxlIHRocm93bikgeworICAgICAgICBsb2dnZXIubG9nKGxldmVsLCBtc2csIHRocm93bik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9nKGZpbmFsIExldmVsIGxldmVsLCBmaW5hbCBTdHJpbmcgbXNnLCBmaW5hbCBPYmplY3RbXSBwYXJhbXMpIHsKKyAgICAgICAgbG9nZ2VyLmxvZyhsZXZlbCwgbXNnLCBwYXJhbXMpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGxvZyhmaW5hbCBMZXZlbCBsZXZlbCwgZmluYWwgU3RyaW5nIG1zZywgZmluYWwgT2JqZWN0IHBhcmFtMSkgeworICAgICAgICBsb2dnZXIubG9nKGxldmVsLCBtc2csIHBhcmFtMSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9nKGZpbmFsIExldmVsIGxldmVsLCBmaW5hbCBTdHJpbmcgbXNnKSB7CisgICAgICAgIGxvZ2dlci5sb2cobGV2ZWwsIG1zZyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgbG9nKGZpbmFsIExvZ1JlY29yZCByZWNvcmQpIHsKKyAgICAgICAgbG9nZ2VyLmxvZyhyZWNvcmQpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzTG9nZ2FibGUoZmluYWwgTGV2ZWwgbGV2ZWwpIHsKKyAgICAgICAgcmV0dXJuIGxvZ2dlci5pc0xvZ2dhYmxlKGxldmVsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbmZvKGZpbmFsIFN0cmluZyBtc2cpIHsKKyAgICAgICAgbG9nZ2VyLmluZm8obXNnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRVc2VQYXJlbnRIYW5kbGVycygpIHsKKyAgICAgICAgcmV0dXJuIGxvZ2dlci5nZXRVc2VQYXJlbnRIYW5kbGVycygpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VCdW5kbGVOYW1lKCkgeworICAgICAgICByZXR1cm4gbG9nZ2VyLmdldFJlc291cmNlQnVuZGxlTmFtZSgpOworICAgIH0KKworICAgIHB1YmxpYyBSZXNvdXJjZUJ1bmRsZSBnZXRSZXNvdXJjZUJ1bmRsZSgpIHsKKyAgICAgICAgcmV0dXJuIGxvZ2dlci5nZXRSZXNvdXJjZUJ1bmRsZSgpOworICAgIH0KKworICAgIHB1YmxpYyBMb2dnZXIgZ2V0UGFyZW50KCkgeworICAgICAgICByZXR1cm4gbG9nZ2VyLmdldFBhcmVudCgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGxvZ2dlci5nZXROYW1lKCk7CisgICAgfQorCisgICAgcHVibGljIExldmVsIGdldExldmVsKCkgeworICAgICAgICByZXR1cm4gbG9nZ2VyLmdldExldmVsKCk7CisgICAgfQorCisgICAgcHVibGljIEhhbmRsZXJbXSBnZXRIYW5kbGVycygpIHsKKyAgICAgICAgcmV0dXJuIGxvZ2dlci5nZXRIYW5kbGVycygpOworICAgIH0KKworICAgIHB1YmxpYyBGaWx0ZXIgZ2V0RmlsdGVyKCkgeworICAgICAgICByZXR1cm4gbG9nZ2VyLmdldEZpbHRlcigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGZpbmVzdChmaW5hbCBTdHJpbmcgbXNnKSB7CisgICAgICAgIGxvZ2dlci5maW5lc3QobXNnKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBmaW5lcihmaW5hbCBTdHJpbmcgbXNnKSB7CisgICAgICAgIGxvZ2dlci5maW5lcihtc2cpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGZpbmUoZmluYWwgU3RyaW5nIG1zZykgeworICAgICAgICBsb2dnZXIuZmluZShtc2cpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGV4aXRpbmcoZmluYWwgU3RyaW5nIHNvdXJjZUNsYXNzLCBmaW5hbCBTdHJpbmcgc291cmNlTWV0aG9kLCBmaW5hbCBPYmplY3QgcmVzdWx0KSB7CisgICAgICAgIGxvZ2dlci5leGl0aW5nKHNvdXJjZUNsYXNzLCBzb3VyY2VNZXRob2QsIHJlc3VsdCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZXhpdGluZyhmaW5hbCBTdHJpbmcgc291cmNlQ2xhc3MsIGZpbmFsIFN0cmluZyBzb3VyY2VNZXRob2QpIHsKKyAgICAgICAgbG9nZ2VyLmV4aXRpbmcoc291cmNlQ2xhc3MsIHNvdXJjZU1ldGhvZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZW50ZXJpbmcoZmluYWwgU3RyaW5nIHNvdXJjZUNsYXNzLCBmaW5hbCBTdHJpbmcgc291cmNlTWV0aG9kLCBmaW5hbCBPYmplY3RbXSBwYXJhbXMpIHsKKyAgICAgICAgbG9nZ2VyLmVudGVyaW5nKHNvdXJjZUNsYXNzLCBzb3VyY2VNZXRob2QsIHBhcmFtcyk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZW50ZXJpbmcoZmluYWwgU3RyaW5nIHNvdXJjZUNsYXNzLCBmaW5hbCBTdHJpbmcgc291cmNlTWV0aG9kLCBmaW5hbCBPYmplY3QgcGFyYW0xKSB7CisgICAgICAgIGxvZ2dlci5lbnRlcmluZyhzb3VyY2VDbGFzcywgc291cmNlTWV0aG9kLCBwYXJhbTEpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGVudGVyaW5nKGZpbmFsIFN0cmluZyBzb3VyY2VDbGFzcywgZmluYWwgU3RyaW5nIHNvdXJjZU1ldGhvZCkgeworICAgICAgICBsb2dnZXIuZW50ZXJpbmcoc291cmNlQ2xhc3MsIHNvdXJjZU1ldGhvZCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY29uZmlnKGZpbmFsIFN0cmluZyBtc2cpIHsKKyAgICAgICAgbG9nZ2VyLmNvbmZpZyhtc2cpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEhhbmRsZXIoZmluYWwgSGFuZGxlciBoYW5kbGVyKSB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24geworICAgICAgICBsb2dnZXIuYWRkSGFuZGxlcihoYW5kbGVyKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvSmRrVmVyc2lvbi5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL0pka1ZlcnNpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTA1YmZlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL0pka1ZlcnNpb24uamF2YQpAQCAtMCwwICsxLDE2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsOworCisvKioKKyAqIEpESyBWZXJzaW9uIHJlbGF0ZWQgdXRpbGl0aWVzLiBQb3J0ZWQgZnJvbSBHcml6emx5IHByb2plY3QuCisgKgorICogQGF1dGhvciBSeWFuIEx1YmtlIChyeWFuLmx1YmtlIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIEFsZXhleSBTdGFzaG9rIChvbGVrc2l5LnN0YXNob2sgYXQgb3JhY2xlLmNvbSkKKyAqIEBzaW5jZSAyLjMKKyAqLworcHVibGljIGNsYXNzIEpka1ZlcnNpb24gaW1wbGVtZW50cyBDb21wYXJhYmxlPEpka1ZlcnNpb24+IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gSVNfVU5TQUZFX1NVUFBPUlRFRDsKKworICAgIHN0YXRpYyB7CisgICAgICAgIGJvb2xlYW4gdW5zYWZlU3VwcG9ydGVkOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBMb29rIGZvciBzdW4ubWlzYy5VbnNhZmUuCisgICAgICAgICAgICB1bnNhZmVTdXBwb3J0ZWQgPSBDbGFzcy5mb3JOYW1lKCJzdW4ubWlzYy5VbnNhZmUiKSAhPSBudWxsOworCisgICAgICAgICAgICAvLyBDaGVjayBlbnZpcm9ubWVudCBhdmFpbGFiaWxpdHkuCisgICAgICAgICAgICAvLyBHb29nbGUgQXBwIEVuZ2luZSAoc2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL2FwcGVuZ2luZS9kb2NzL2phdmEvI0phdmFfVGhlX2Vudmlyb25tZW50KS4KKyAgICAgICAgICAgIHVuc2FmZVN1cHBvcnRlZCAmPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImNvbS5nb29nbGUuYXBwZW5naW5lLnJ1bnRpbWUuZW52aXJvbm1lbnQiKSA9PSBudWxsOworICAgICAgICB9IGNhdGNoIChmaW5hbCBUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgLy8gTWFrZSBVbnNhZmUgbm90IHN1cHBvcnRlZCBpZiBlaXRoZXI6CisgICAgICAgICAgICAvLyAtIHN1bi5taXNjLlVuc2FmZSBub3QgZm91bmQuCisgICAgICAgICAgICAvLyAtIHdlJ3JlIG5vdCBncmFudGVkIHRvIHJlYWQgdGhlIHByb3BlcnR5ICgqIGlzIG5vdCBlbm91Z2gpLgorICAgICAgICAgICAgdW5zYWZlU3VwcG9ydGVkID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBJU19VTlNBRkVfU1VQUE9SVEVEID0gdW5zYWZlU3VwcG9ydGVkOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEpka1ZlcnNpb24gVU5LTk9XTl9WRVJTSU9OID0gbmV3IEpka1ZlcnNpb24oLTEsIC0xLCAtMSwgLTEpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEpka1ZlcnNpb24gSkRLX1ZFUlNJT04gPSBwYXJzZVZlcnNpb24oU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLnZlcnNpb24iKSk7CisKKyAgICBwcml2YXRlIGZpbmFsIGludCBtYWpvcjsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtaW5vcjsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtYWludGVuYW5jZTsKKyAgICBwcml2YXRlIGZpbmFsIGludCB1cGRhdGU7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ29uc3RydWN0b3JzCisKKyAgICBwcml2YXRlIEpka1ZlcnNpb24oZmluYWwgaW50IG1ham9yLCBmaW5hbCBpbnQgbWlub3IsIGZpbmFsIGludCBtYWludGVuYW5jZSwgZmluYWwgaW50IHVwZGF0ZSkgeworICAgICAgICB0aGlzLm1ham9yID0gbWFqb3I7CisgICAgICAgIHRoaXMubWlub3IgPSBtaW5vcjsKKyAgICAgICAgdGhpcy5tYWludGVuYW5jZSA9IG1haW50ZW5hbmNlOworICAgICAgICB0aGlzLnVwZGF0ZSA9IHVwZGF0ZTsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKyAgICBwdWJsaWMgc3RhdGljIEpka1ZlcnNpb24gcGFyc2VWZXJzaW9uKFN0cmluZyB2ZXJzaW9uU3RyaW5nKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgZGFzaElkeCA9IHZlcnNpb25TdHJpbmcuaW5kZXhPZignLScpOworICAgICAgICAgICAgaWYgKGRhc2hJZHggIT0gLTEpIHsKKyAgICAgICAgICAgICAgICB2ZXJzaW9uU3RyaW5nID0gdmVyc2lvblN0cmluZy5zdWJzdHJpbmcoMCwgZGFzaElkeCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBwYXJ0cyA9IHZlcnNpb25TdHJpbmcuc3BsaXQoIlxcLnxfIik7CisgICAgICAgICAgICBpZiAocGFydHMubGVuZ3RoID09IDMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEpka1ZlcnNpb24oSW50ZWdlci5wYXJzZUludChwYXJ0c1swXSksCisgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KHBhcnRzWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIucGFyc2VJbnQocGFydHNbMl0pLAorICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSmRrVmVyc2lvbihJbnRlZ2VyLnBhcnNlSW50KHBhcnRzWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIucGFyc2VJbnQocGFydHNbMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci5wYXJzZUludChwYXJ0c1syXSksCisgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLnBhcnNlSW50KHBhcnRzWzNdKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9WRVJTSU9OOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBKZGtWZXJzaW9uIGdldEpka1ZlcnNpb24oKSB7CisgICAgICAgIHJldHVybiBKREtfVkVSU0lPTjsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiVW51c2VkRGVjbGFyYXRpb24iKQorICAgIHB1YmxpYyBpbnQgZ2V0TWFqb3IoKSB7CisgICAgICAgIHJldHVybiBtYWpvcjsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiVW51c2VkRGVjbGFyYXRpb24iKQorICAgIHB1YmxpYyBpbnQgZ2V0TWlub3IoKSB7CisgICAgICAgIHJldHVybiBtaW5vcjsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiVW51c2VkRGVjbGFyYXRpb24iKQorICAgIHB1YmxpYyBpbnQgZ2V0TWFpbnRlbmFuY2UoKSB7CisgICAgICAgIHJldHVybiBtYWludGVuYW5jZTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiVW51c2VkRGVjbGFyYXRpb24iKQorICAgIHB1YmxpYyBpbnQgZ2V0VXBkYXRlKCkgeworICAgICAgICByZXR1cm4gdXBkYXRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgPHR0PnRydWU8L3R0PiBpZiB7QGNvZGUgc3VuLm1pc2MuVW5zYWZlfSBpcyBwcmVzZW50IGluIHRoZQorICAgICAqIGN1cnJlbnQgSkRLIHZlcnNpb24sIG9yIDx0dD5mYWxzZTwvdHQ+IG90aGVyd2lzZS4KKyAgICAgKgorICAgICAqIEBzaW5jZSAyLjMuNgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzVW5zYWZlU3VwcG9ydGVkKCkgeworICAgICAgICByZXR1cm4gSVNfVU5TQUZFX1NVUFBPUlRFRDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIkpka1ZlcnNpb24iICsgInttYWpvcj0iICsgbWFqb3IgKyAiLCBtaW5vcj0iICsgbWlub3IgKyAiLCBtYWludGVuYW5jZT0iICsgbWFpbnRlbmFuY2UKKyAgICAgICAgICAgICAgICArICIsIHVwZGF0ZT0iICsgdXBkYXRlICsgJ30nOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTWV0aG9kcyBmcm9tIENvbXBhcmFibGUKKworICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKGZpbmFsIFN0cmluZyB2ZXJzaW9uU3RyaW5nKSB7CisgICAgICAgIHJldHVybiBjb21wYXJlVG8oSmRrVmVyc2lvbi5wYXJzZVZlcnNpb24odmVyc2lvblN0cmluZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKGZpbmFsIEpka1ZlcnNpb24gb3RoZXJWZXJzaW9uKSB7CisgICAgICAgIGlmIChtYWpvciA8IG90aGVyVmVyc2lvbi5tYWpvcikgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChtYWpvciA+IG90aGVyVmVyc2lvbi5tYWpvcikgeworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1pbm9yIDwgb3RoZXJWZXJzaW9uLm1pbm9yKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1pbm9yID4gb3RoZXJWZXJzaW9uLm1pbm9yKSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAobWFpbnRlbmFuY2UgPCBvdGhlclZlcnNpb24ubWFpbnRlbmFuY2UpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAobWFpbnRlbmFuY2UgPiBvdGhlclZlcnNpb24ubWFpbnRlbmFuY2UpIHsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGlmICh1cGRhdGUgPCBvdGhlclZlcnNpb24udXBkYXRlKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHVwZGF0ZSA+IG90aGVyVmVyc2lvbi51cGRhdGUpIHsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9KZXJzZXlQdWJsaXNoZXIuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9KZXJzZXlQdWJsaXNoZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGIzNDY4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL0plcnNleVB1Ymxpc2hlci5qYXZhCkBAIC0wLDAgKzEsNDM2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db21wbGV0YWJsZUZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Gb3JrSm9pblBvb2w7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkJpUHJlZGljYXRlOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmpzcjE2Ni5GbG93OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmpzcjE2Ni5TdWJtaXNzaW9uUHVibGlzaGVyOworCisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIEZsb3cuUHVibGlzaGVyfSBjb3JyZXNwb25kaW5nIHRvIHJlYWN0aXZlIHN0cmVhbXMgc3BlY2lmaWNhdGlvbi4KKyAqIDxwPgorICogRGVsZWdhdGVzIHRvIHtAbGluayBTdWJtaXNzaW9uUHVibGlzaGVyfSByZXBhY2thZ2VkIGZyb20ganNyMTY2LgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEplcnNleVB1Ymxpc2hlcjxUPiBpbXBsZW1lbnRzIEZsb3cuUHVibGlzaGVyPFQ+IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0JVRkZFUl9DQVBBQ0lUWSA9IDI1NjsKKyAgICBwcml2YXRlIFN1Ym1pc3Npb25QdWJsaXNoZXI8VD4gc3VibWlzc2lvblB1Ymxpc2hlciA9IG5ldyBTdWJtaXNzaW9uUHVibGlzaGVyPD4oKTsKKworICAgIHByaXZhdGUgZmluYWwgUHVibGlzaGVyU3RyYXRlZ3kgc3RyYXRlZ3k7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IEplcnNleVB1Ymxpc2hlciB1c2luZyB0aGUge0BsaW5rIEZvcmtKb2luUG9vbCNjb21tb25Qb29sKCl9IGZvciBhc3luYyBkZWxpdmVyeSB0byBzdWJzY3JpYmVycworICAgICAqICh1bmxlc3MgaXQgZG9lcyBub3Qgc3VwcG9ydCBhIHBhcmFsbGVsaXNtIGxldmVsIG9mIGF0IGxlYXN0IHR3bywgaW4gd2hpY2ggY2FzZSwgYSBuZXcgVGhyZWFkIGlzIGNyZWF0ZWQgdG8gcnVuCisgICAgICogZWFjaCB0YXNrKSwgd2l0aCBtYXhpbXVtIGJ1ZmZlciBjYXBhY2l0eSBvZiB7QHZhbHVlIERFRkFVTFRfQlVGRkVSX0NBUEFDSVRZfSBhbmQgZGVmYXVsdCB7QGxpbmsgUHVibGlzaGVyU3RyYXRlZ3l9LAorICAgICAqIHdoaWNoIGlzIHtAbGluayBQdWJsaXNoZXJTdHJhdGVneSNCRVNUX0VGRk9SVH0uCisgICAgICovCisgICAgcHVibGljIEplcnNleVB1Ymxpc2hlcigpIHsKKyAgICAgICAgdGhpcyhGb3JrSm9pblBvb2wuY29tbW9uUG9vbCgpLCBERUZBVUxUX0JVRkZFUl9DQVBBQ0lUWSwgUHVibGlzaGVyU3RyYXRlZ3kuQkVTVF9FRkZPUlQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgSmVyc2V5UHVibGlzaGVyIHVzaW5nIHRoZSB7QGxpbmsgRm9ya0pvaW5Qb29sI2NvbW1vblBvb2woKX0gZm9yIGFzeW5jIGRlbGl2ZXJ5IHRvIHN1YnNjcmliZXJzCisgICAgICogKHVubGVzcyBpdCBkb2VzIG5vdCBzdXBwb3J0IGEgcGFyYWxsZWxpc20gbGV2ZWwgb2YgYXQgbGVhc3QgdHdvLCBpbiB3aGljaCBjYXNlLCBhIG5ldyBUaHJlYWQgaXMgY3JlYXRlZCB0byBydW4KKyAgICAgKiBlYWNoIHRhc2spLCB3aXRoIG1heGltdW0gYnVmZmVyIGNhcGFjaXR5IG9mIHtAdmFsdWUgREVGQVVMVF9CVUZGRVJfQ0FQQUNJVFl9IGFuZCBnaXZlbiB7QGxpbmsgUHVibGlzaGVyU3RyYXRlZ3l9LgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmF0ZWd5IHB1Ymxpc2hlciBkZWxpdmVyaW5nIHN0cmF0ZWd5CisgICAgICovCisgICAgcHVibGljIEplcnNleVB1Ymxpc2hlcihmaW5hbCBQdWJsaXNoZXJTdHJhdGVneSBzdHJhdGVneSkgeworICAgICAgICB0aGlzKEZvcmtKb2luUG9vbC5jb21tb25Qb29sKCksIERFRkFVTFRfQlVGRkVSX0NBUEFDSVRZLCBzdHJhdGVneSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBKZXJzZXlQdWJsaXNoZXIgdXNpbmcgdGhlIGdpdmVuIHtAbGluayBFeGVjdXRvcn0gZm9yIGFzeW5jIGRlbGl2ZXJ5IHRvIHN1YnNjcmliZXJzLCB3aXRoIHRoZSBkZWZhdWx0CisgICAgICogbWF4aW11bSBidWZmZXIgc2l6ZSBvZiB7QHZhbHVlIERFRkFVTFRfQlVGRkVSX0NBUEFDSVRZfSBhbmQgZGVmYXVsdCB7QGxpbmsgUHVibGlzaGVyU3RyYXRlZ3l9LCB3aGljaCBpcworICAgICAqIHtAbGluayBQdWJsaXNoZXJTdHJhdGVneSNCRVNUX0VGRk9SVH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXhlY3V0b3Ige0Bjb2RlIEV4ZWN1dG9yfSB0aGUgZXhlY3V0b3IgdG8gdXNlIGZvciBhc3luYyBkZWxpdmVyeSwKKyAgICAgKiAgICAgICAgICAgICAgICAgc3VwcG9ydGluZyBjcmVhdGlvbiBvZiBhdCBsZWFzdCBvbmUgaW5kZXBlbmRlbnQgdGhyZWFkCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiAgICAgaWYgZXhlY3V0b3IgaXMgbnVsbAorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIG1heEJ1ZmZlckNhcGFjaXR5IG5vdCBwb3NpdGl2ZQorICAgICAqLworICAgIHB1YmxpYyBKZXJzZXlQdWJsaXNoZXIoZmluYWwgRXhlY3V0b3IgZXhlY3V0b3IpIHsKKyAgICAgICAgdGhpcyhleGVjdXRvciwgUHVibGlzaGVyU3RyYXRlZ3kuQkVTVF9FRkZPUlQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgSmVyc2V5UHVibGlzaGVyIHVzaW5nIHRoZSBnaXZlbiB7QGxpbmsgRXhlY3V0b3J9IGZvciBhc3luYyBkZWxpdmVyeSB0byBzdWJzY3JpYmVycywgd2l0aCB0aGUgZGVmYXVsdAorICAgICAqIG1heGltdW0gYnVmZmVyIHNpemUgb2Yge0B2YWx1ZSBERUZBVUxUX0JVRkZFUl9DQVBBQ0lUWX0gYW5kIGdpdmVuIHtAbGluayBQdWJsaXNoZXJTdHJhdGVneX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXhlY3V0b3Ige0Bjb2RlIEV4ZWN1dG9yfSB0aGUgZXhlY3V0b3IgdG8gdXNlIGZvciBhc3luYyBkZWxpdmVyeSwKKyAgICAgKiAgICAgICAgICAgICAgICAgc3VwcG9ydGluZyBjcmVhdGlvbiBvZiBhdCBsZWFzdCBvbmUgaW5kZXBlbmRlbnQgdGhyZWFkCisgICAgICogQHBhcmFtIHN0cmF0ZWd5IHB1Ymxpc2hlciBkZWxpdmVyaW5nIHN0cmF0ZWd5CisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiAgICAgaWYgZXhlY3V0b3IgaXMgbnVsbAorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIG1heEJ1ZmZlckNhcGFjaXR5IG5vdCBwb3NpdGl2ZQorICAgICAqLworICAgIHB1YmxpYyBKZXJzZXlQdWJsaXNoZXIoZmluYWwgRXhlY3V0b3IgZXhlY3V0b3IsIGZpbmFsIFB1Ymxpc2hlclN0cmF0ZWd5IHN0cmF0ZWd5KSB7CisgICAgICAgIHRoaXMuc3RyYXRlZ3kgPSBzdHJhdGVneTsKKyAgICAgICAgc3VibWlzc2lvblB1Ymxpc2hlciA9IG5ldyBTdWJtaXNzaW9uUHVibGlzaGVyPD4oZXhlY3V0b3IsIERFRkFVTFRfQlVGRkVSX0NBUEFDSVRZKTsKKyAgICB9CisKKworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBKZXJzZXlQdWJsaXNoZXIgdXNpbmcgdGhlIHtAbGluayBGb3JrSm9pblBvb2wjY29tbW9uUG9vbCgpfSBmb3IgYXN5bmMgZGVsaXZlcnkgdG8gc3Vic2NyaWJlcnMKKyAgICAgKiAodW5sZXNzIGl0IGRvZXMgbm90IHN1cHBvcnQgYSBwYXJhbGxlbGlzbSBsZXZlbCBvZiBhdCBsZWFzdCB0d28sIGluIHdoaWNoIGNhc2UsIGEgbmV3IFRocmVhZCBpcyBjcmVhdGVkIHRvIHJ1bgorICAgICAqIGVhY2ggdGFzayksIHdpdGggc3BlY2lmaWVkIG1heGltdW0gYnVmZmVyIGNhcGFjaXR5IGFuZCBkZWZhdWx0IHtAbGluayBQdWJsaXNoZXJTdHJhdGVneX0sIHdoaWNoIGlzCisgICAgICoge0BsaW5rIFB1Ymxpc2hlclN0cmF0ZWd5I0JFU1RfRUZGT1JUfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXhCdWZmZXJDYXBhY2l0eSB0aGUgbWF4aW11bSBjYXBhY2l0eSBmb3IgZWFjaAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyJ3MgYnVmZmVyICh0aGUgZW5mb3JjZWQgY2FwYWNpdHkgbWF5IGJlIHJvdW5kZWQgdXAgdG8KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG5lYXJlc3QgcG93ZXIgb2YgdHdvIGFuZC9vciBib3VuZGVkIGJ5IHRoZSBsYXJnZXN0IHZhbHVlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uOyBtZXRob2Qge0BsaW5rICNnZXRNYXhCdWZmZXJDYXBhY2l0eX0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyB0aGUgYWN0dWFsIHZhbHVlKQorICAgICAqLworICAgIHB1YmxpYyBKZXJzZXlQdWJsaXNoZXIoZmluYWwgaW50IG1heEJ1ZmZlckNhcGFjaXR5KSB7CisgICAgICAgIHRoaXMoRm9ya0pvaW5Qb29sLmNvbW1vblBvb2woKSwgbWF4QnVmZmVyQ2FwYWNpdHksIFB1Ymxpc2hlclN0cmF0ZWd5LkJFU1RfRUZGT1JUKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IEplcnNleVB1Ymxpc2hlciB1c2luZyB0aGUgZ2l2ZW4ge0BsaW5rIEV4ZWN1dG9yfSBmb3IgYXN5bmMgZGVsaXZlcnkgdG8gc3Vic2NyaWJlcnMsIHdpdGggdGhlIGdpdmVuCisgICAgICogbWF4aW11bSBidWZmZXIgc2l6ZSBmb3IgZWFjaCBzdWJzY3JpYmVyIGFuZCBnaXZlbiB7QGxpbmsgUHVibGlzaGVyU3RyYXRlZ3l9LgorICAgICAqCisgICAgICogQHBhcmFtIGV4ZWN1dG9yICAgICAgICAgIHtAY29kZSBFeGVjdXRvcn0gdGhlIGV4ZWN1dG9yIHRvIHVzZSBmb3IgYXN5bmMgZGVsaXZlcnksCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRpbmcgY3JlYXRpb24gb2YgYXQgbGVhc3Qgb25lIGluZGVwZW5kZW50IHRocmVhZAorICAgICAqIEBwYXJhbSBtYXhCdWZmZXJDYXBhY2l0eSB0aGUgbWF4aW11bSBjYXBhY2l0eSBmb3IgZWFjaAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyJ3MgYnVmZmVyICh0aGUgZW5mb3JjZWQgY2FwYWNpdHkgbWF5IGJlIHJvdW5kZWQgdXAgdG8KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG5lYXJlc3QgcG93ZXIgb2YgdHdvIGFuZC9vciBib3VuZGVkIGJ5IHRoZSBsYXJnZXN0IHZhbHVlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZCBieSB0aGlzIGltcGxlbWVudGF0aW9uOyBtZXRob2Qge0BsaW5rICNnZXRNYXhCdWZmZXJDYXBhY2l0eX0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJucyB0aGUgYWN0dWFsIHZhbHVlKQorICAgICAqIEBwYXJhbSBzdHJhdGVneSAgICAgICAgICBwdWJsaXNoZXIgZGVsaXZlcmluZyBzdHJhdGVneQorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gICAgIGlmIGV4ZWN1dG9yIGlzIG51bGwKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBtYXhCdWZmZXJDYXBhY2l0eSBub3QgcG9zaXRpdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgSmVyc2V5UHVibGlzaGVyKGZpbmFsIEV4ZWN1dG9yIGV4ZWN1dG9yLCBmaW5hbCBpbnQgbWF4QnVmZmVyQ2FwYWNpdHksIFB1Ymxpc2hlclN0cmF0ZWd5IHN0cmF0ZWd5KSB7CisgICAgICAgIHRoaXMuc3RyYXRlZ3kgPSBzdHJhdGVneTsKKyAgICAgICAgc3VibWlzc2lvblB1Ymxpc2hlciA9IG5ldyBTdWJtaXNzaW9uUHVibGlzaGVyPD4oZXhlY3V0b3IsIG1heEJ1ZmZlckNhcGFjaXR5KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdWJzY3JpYmUoZmluYWwgRmxvdy5TdWJzY3JpYmVyPD8gc3VwZXIgVD4gc3Vic2NyaWJlcikgeworICAgICAgICBzdWJtaXNzaW9uUHVibGlzaGVyLnN1YnNjcmliZShuZXcgU3Vic2NyaWJlcldyYXBwZXI8VD4oc3Vic2NyaWJlcikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFB1Ymxpc2hlcyB0aGUgZ2l2ZW4gaXRlbSB0byBlYWNoIGN1cnJlbnQgc3Vic2NyaWJlciBieSBhc3luY2hyb25vdXNseSBpbnZva2luZyBpdHMgb25OZXh0IG1ldGhvZC4KKyAgICAgKiA8cD4KKyAgICAgKiBCbG9ja3MgdW5pbnRlcnJ1cHRpYmx5IHdoaWxlIHJlc291cmNlcyBmb3IgYW55IHN1YnNjcmliZXIgYXJlIHVuYXZhaWxhYmxlLgorICAgICAqCisgICAgICogQHBhcmFtIGRhdGEgcHVibGlzaGVkIGRhdGEKKyAgICAgKiBAcmV0dXJuIHRoZSBlc3RpbWF0ZWQgbWF4aW11bSBsYWcgYW1vbmcgc3Vic2NyaWJlcnMKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBjbG9zZWQKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGRhdGEgaXMgbnVsbAorICAgICAqIEB0aHJvd3MgamF2YS51dGlsLmNvbmN1cnJlbnQuUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb24gaWYgdGhyb3duIGJ5IEV4ZWN1dG9yCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgc3VibWl0KGZpbmFsIFQgZGF0YSkgeworICAgICAgICByZXR1cm4gc3VibWlzc2lvblB1Ymxpc2hlci5zdWJtaXQoZGF0YSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvY2Vzc2VzIGFsbCBwdWJsaXNoZWQgaXRlbXMgdXNpbmcgdGhlIGdpdmVuIENvbnN1bWVyIGZ1bmN0aW9uLiBSZXR1cm5zIGEgQ29tcGxldGFibGVGdXR1cmUgdGhhdCBpcyBjb21wbGV0ZWQKKyAgICAgKiBub3JtYWxseSB3aGVuIHRoaXMgcHVibGlzaGVyIHNpZ25hbHMge0Bjb2RlIG9uQ29tcGxldGUoKX0sIG9yIGNvbXBsZXRlZCBleGNlcHRpb25hbGx5IHVwb24gYW55IGVycm9yLCBvciBhbgorICAgICAqIGV4Y2VwdGlvbiBpcyB0aHJvd24gYnkgdGhlIENvbnN1bWVyLCBvciB0aGUgcmV0dXJuZWQgQ29tcGxldGFibGVGdXR1cmUgaXMgY2FuY2VsbGVkLCBpbiB3aGljaCBjYXNlIG5vIGZ1cnRoZXIKKyAgICAgKiBpdGVtcyBhcmUgcHJvY2Vzc2VkLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnN1bWVyIGZ1bmN0aW9uIHRvIHByb2Nlc3MgYWxsIHB1Ymxpc2hlZCBkYXRhCisgICAgICogQHJldHVybiBhIHtAbGluayBDb21wbGV0YWJsZUZ1dHVyZX0gdGhhdCBpcyBjb21wbGV0ZWQgbm9ybWFsbHkgd2hlbiB0aGUgcHVibGlzaGVyIHNpZ25hbHMgb25Db21wbGV0ZSwKKyAgICAgKiBhbmQgZXhjZXB0aW9uYWxseSB1cG9uIGFueSBlcnJvciBvciBjYW5jZWxsYXRpb24KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGNvbnN1bWVyIGlzIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29tcGxldGFibGVGdXR1cmU8Vm9pZD4gY29uc3VtZShmaW5hbCBDb25zdW1lcjw/IHN1cGVyIFQ+IGNvbnN1bWVyKSB7CisgICAgICAgIHJldHVybiBzdWJtaXNzaW9uUHVibGlzaGVyLmNvbnN1bWUoY29uc3VtZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFB1Ymxpc2hlcyB0aGUgZ2l2ZW4gaXRlbSwgaWYgcG9zc2libGUsIHRvIGVhY2ggY3VycmVudCBzdWJzY3JpYmVyCisgICAgICogYnkgYXN5bmNocm9ub3VzbHkgaW52b2tpbmcgaXRzCisgICAgICoge0BsaW5rIEZsb3cuU3Vic2NyaWJlciNvbk5leHQoT2JqZWN0KSBvbk5leHR9IG1ldGhvZC4KKyAgICAgKiBUaGUgaXRlbSBtYXkgYmUgZHJvcHBlZCBieSBvbmUgb3IgbW9yZSBzdWJzY3JpYmVycyBpZiByZXNvdXJjZQorICAgICAqIGxpbWl0cyBhcmUgZXhjZWVkZWQsIGluIHdoaWNoIGNhc2UgdGhlIGdpdmVuIGhhbmRsZXIgKGlmIG5vbi1udWxsKQorICAgICAqIGlzIGludm9rZWQsIGFuZCBpZiBpdCByZXR1cm5zIHRydWUsIHJldHJpZWQgb25jZS4gIE90aGVyIGNhbGxzIHRvCisgICAgICogbWV0aG9kcyBpbiB0aGlzIGNsYXNzIGJ5IG90aGVyIHRocmVhZHMgYXJlIGJsb2NrZWQgd2hpbGUgdGhlCisgICAgICogaGFuZGxlciBpcyBpbnZva2VkLiAgVW5sZXNzIHJlY292ZXJ5IGlzIGFzc3VyZWQsIG9wdGlvbnMgYXJlCisgICAgICogdXN1YWxseSBsaW1pdGVkIHRvIGxvZ2dpbmcgdGhlIGVycm9yIGFuZC9vciBpc3N1aW5nIGFuIHtAbGluaworICAgICAqIEZsb3cuU3Vic2NyaWJlciNvbkVycm9yKFRocm93YWJsZSkgb25FcnJvcn0KKyAgICAgKiBzaWduYWwgdG8gdGhlIHN1YnNjcmliZXIuCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhIHN0YXR1cyBpbmRpY2F0b3I6IElmIG5lZ2F0aXZlLCBpdAorICAgICAqIHJlcHJlc2VudHMgdGhlIChuZWdhdGl2ZSkgbnVtYmVyIG9mIGRyb3BzIChmYWlsZWQgYXR0ZW1wdHMgdG8KKyAgICAgKiBpc3N1ZSB0aGUgaXRlbSB0byBhIHN1YnNjcmliZXIpLiBPdGhlcndpc2UgaXQgaXMgYW4gZXN0aW1hdGUgb2YKKyAgICAgKiB0aGUgbWF4aW11bSBsYWcgKG51bWJlciBvZiBpdGVtcyBzdWJtaXR0ZWQgYnV0IG5vdCB5ZXQKKyAgICAgKiBjb25zdW1lZCkgYW1vbmcgYWxsIGN1cnJlbnQgc3Vic2NyaWJlcnMuIFRoaXMgdmFsdWUgaXMgYXQgbGVhc3QKKyAgICAgKiBvbmUgKGFjY291bnRpbmcgZm9yIHRoaXMgc3VibWl0dGVkIGl0ZW0pIGlmIHRoZXJlIGFyZSBhbnkKKyAgICAgKiBzdWJzY3JpYmVycywgZWxzZSB6ZXJvLgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSBFeGVjdXRvciBmb3IgdGhpcyBwdWJsaXNoZXIgdGhyb3dzIGEKKyAgICAgKiBSZWplY3RlZEV4ZWN1dGlvbkV4Y2VwdGlvbiAob3IgYW55IG90aGVyIFJ1bnRpbWVFeGNlcHRpb24gb3IKKyAgICAgKiBFcnJvcikgd2hlbiBhdHRlbXB0aW5nIHRvIGFzeW5jaHJvbm91c2x5IG5vdGlmeSBzdWJzY3JpYmVycywgb3IKKyAgICAgKiB0aGUgZHJvcCBoYW5kbGVyIHRocm93cyBhbiBleGNlcHRpb24gd2hlbiBwcm9jZXNzaW5nIGEgZHJvcHBlZAorICAgICAqIGl0ZW0sIHRoZW4gdGhpcyBleGNlcHRpb24gaXMgcmV0aHJvd24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaXRlbSAgIHRoZSAobm9uLW51bGwpIGl0ZW0gdG8gcHVibGlzaAorICAgICAqIEBwYXJhbSBvbkRyb3AgaWYgbm9uLW51bGwsIHRoZSBoYW5kbGVyIGludm9rZWQgdXBvbiBhIGRyb3AgdG8gYQorICAgICAqICAgICAgICAgICAgICAgc3Vic2NyaWJlciwgd2l0aCBhcmd1bWVudHMgb2YgdGhlIHN1YnNjcmliZXIgYW5kIGl0ZW07IGlmIGl0CisgICAgICogICAgICAgICAgICAgICByZXR1cm5zIHRydWUsIGFuIG9mZmVyIGlzIHJlLWF0dGVtcHRlZCAob25jZSkKKyAgICAgKiBAcmV0dXJuIGlmIG5lZ2F0aXZlLCB0aGUgKG5lZ2F0aXZlKSBudW1iZXIgb2YgZHJvcHM7IG90aGVyd2lzZQorICAgICAqIGFuIGVzdGltYXRlIG9mIG1heGltdW0gbGFnCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gICAgICBpZiBjbG9zZWQKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uICAgICAgIGlmIGl0ZW0gaXMgbnVsbAorICAgICAqIEB0aHJvd3MgUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb24gaWYgdGhyb3duIGJ5IEV4ZWN1dG9yCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgb2ZmZXIoVCBpdGVtLCBCaVByZWRpY2F0ZTxGbG93LlN1YnNjcmliZXI8PyBzdXBlciBUPiwgPyBzdXBlciBUPiBvbkRyb3ApIHsKKyAgICAgICAgcmV0dXJuIG9mZmVyKGl0ZW0sIDAsIFRpbWVVbml0Lk1JTExJU0VDT05EUywgb25Ecm9wKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQdWJsaXNoZXMgdGhlIGdpdmVuIGl0ZW0sIGlmIHBvc3NpYmxlLCB0byBlYWNoIGN1cnJlbnQgc3Vic2NyaWJlcgorICAgICAqIGJ5IGFzeW5jaHJvbm91c2x5IGludm9raW5nIGl0cyB7QGxpbmsKKyAgICAgKiBGbG93LlN1YnNjcmliZXIjb25OZXh0KE9iamVjdCkgb25OZXh0fSBtZXRob2QsCisgICAgICogYmxvY2tpbmcgd2hpbGUgcmVzb3VyY2VzIGZvciBhbnkgc3Vic2NyaXB0aW9uIGFyZSB1bmF2YWlsYWJsZSwKKyAgICAgKiB1cCB0byB0aGUgc3BlY2lmaWVkIHRpbWVvdXQgb3IgdW50aWwgdGhlIGNhbGxlciB0aHJlYWQgaXMKKyAgICAgKiBpbnRlcnJ1cHRlZCwgYXQgd2hpY2ggcG9pbnQgdGhlIGdpdmVuIGhhbmRsZXIgKGlmIG5vbi1udWxsKSBpcworICAgICAqIGludm9rZWQsIGFuZCBpZiBpdCByZXR1cm5zIHRydWUsIHJldHJpZWQgb25jZS4gKFRoZSBkcm9wIGhhbmRsZXIKKyAgICAgKiBtYXkgZGlzdGluZ3Vpc2ggdGltZW91dHMgZnJvbSBpbnRlcnJ1cHRzIGJ5IGNoZWNraW5nIHdoZXRoZXIKKyAgICAgKiB0aGUgY3VycmVudCB0aHJlYWQgaXMgaW50ZXJydXB0ZWQuKQorICAgICAqIE90aGVyIGNhbGxzIHRvIG1ldGhvZHMgaW4gdGhpcyBjbGFzcyBieSBvdGhlcgorICAgICAqIHRocmVhZHMgYXJlIGJsb2NrZWQgd2hpbGUgdGhlIGhhbmRsZXIgaXMgaW52b2tlZC4gIFVubGVzcworICAgICAqIHJlY292ZXJ5IGlzIGFzc3VyZWQsIG9wdGlvbnMgYXJlIHVzdWFsbHkgbGltaXRlZCB0byBsb2dnaW5nIHRoZQorICAgICAqIGVycm9yIGFuZC9vciBpc3N1aW5nIGFuCisgICAgICoge0BsaW5rIEZsb3cuU3Vic2NyaWJlciNvbkVycm9yKFRocm93YWJsZSkgb25FcnJvcn0KKyAgICAgKiBzaWduYWwgdG8gdGhlIHN1YnNjcmliZXIuCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhIHN0YXR1cyBpbmRpY2F0b3I6IElmIG5lZ2F0aXZlLCBpdAorICAgICAqIHJlcHJlc2VudHMgdGhlIChuZWdhdGl2ZSkgbnVtYmVyIG9mIGRyb3BzIChmYWlsZWQgYXR0ZW1wdHMgdG8KKyAgICAgKiBpc3N1ZSB0aGUgaXRlbSB0byBhIHN1YnNjcmliZXIpLiBPdGhlcndpc2UgaXQgaXMgYW4gZXN0aW1hdGUgb2YKKyAgICAgKiB0aGUgbWF4aW11bSBsYWcgKG51bWJlciBvZiBpdGVtcyBzdWJtaXR0ZWQgYnV0IG5vdCB5ZXQKKyAgICAgKiBjb25zdW1lZCkgYW1vbmcgYWxsIGN1cnJlbnQgc3Vic2NyaWJlcnMuIFRoaXMgdmFsdWUgaXMgYXQgbGVhc3QKKyAgICAgKiBvbmUgKGFjY291bnRpbmcgZm9yIHRoaXMgc3VibWl0dGVkIGl0ZW0pIGlmIHRoZXJlIGFyZSBhbnkKKyAgICAgKiBzdWJzY3JpYmVycywgZWxzZSB6ZXJvLgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSBFeGVjdXRvciBmb3IgdGhpcyBwdWJsaXNoZXIgdGhyb3dzIGEKKyAgICAgKiBSZWplY3RlZEV4ZWN1dGlvbkV4Y2VwdGlvbiAob3IgYW55IG90aGVyIFJ1bnRpbWVFeGNlcHRpb24gb3IKKyAgICAgKiBFcnJvcikgd2hlbiBhdHRlbXB0aW5nIHRvIGFzeW5jaHJvbm91c2x5IG5vdGlmeSBzdWJzY3JpYmVycywgb3IKKyAgICAgKiB0aGUgZHJvcCBoYW5kbGVyIHRocm93cyBhbiBleGNlcHRpb24gd2hlbiBwcm9jZXNzaW5nIGEgZHJvcHBlZAorICAgICAqIGl0ZW0sIHRoZW4gdGhpcyBleGNlcHRpb24gaXMgcmV0aHJvd24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaXRlbSAgICB0aGUgKG5vbi1udWxsKSBpdGVtIHRvIHB1Ymxpc2gKKyAgICAgKiBAcGFyYW0gdGltZW91dCBob3cgbG9uZyB0byB3YWl0IGZvciByZXNvdXJjZXMgZm9yIGFueSBzdWJzY3JpYmVyCisgICAgICogICAgICAgICAgICAgICAgYmVmb3JlIGdpdmluZyB1cCwgaW4gdW5pdHMgb2Yge0Bjb2RlIHVuaXR9CisgICAgICogQHBhcmFtIHVuaXQgICAgYSB7QGNvZGUgVGltZVVuaXR9IGRldGVybWluaW5nIGhvdyB0byBpbnRlcnByZXQgdGhlCisgICAgICogICAgICAgICAgICAgICAge0Bjb2RlIHRpbWVvdXR9IHBhcmFtZXRlcgorICAgICAqIEBwYXJhbSBvbkRyb3AgIGlmIG5vbi1udWxsLCB0aGUgaGFuZGxlciBpbnZva2VkIHVwb24gYSBkcm9wIHRvIGEKKyAgICAgKiAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLCB3aXRoIGFyZ3VtZW50cyBvZiB0aGUgc3Vic2NyaWJlciBhbmQgaXRlbTsgaWYgaXQKKyAgICAgKiAgICAgICAgICAgICAgICByZXR1cm5zIHRydWUsIGFuIG9mZmVyIGlzIHJlLWF0dGVtcHRlZCAob25jZSkKKyAgICAgKiBAcmV0dXJuIGlmIG5lZ2F0aXZlLCB0aGUgKG5lZ2F0aXZlKSBudW1iZXIgb2YgZHJvcHM7IG90aGVyd2lzZQorICAgICAqIGFuIGVzdGltYXRlIG9mIG1heGltdW0gbGFnCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gICAgICBpZiBjbG9zZWQKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uICAgICAgIGlmIGl0ZW0gaXMgbnVsbAorICAgICAqIEB0aHJvd3MgUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb24gaWYgdGhyb3duIGJ5IEV4ZWN1dG9yCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgb2ZmZXIoVCBpdGVtLAorICAgICAgICAgICAgICAgICAgICAgIGxvbmcgdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdCB1bml0LAorICAgICAgICAgICAgICAgICAgICAgIEJpUHJlZGljYXRlPEZsb3cuU3Vic2NyaWJlcjw/IHN1cGVyIFQ+LCA/IHN1cGVyIFQ+IG9uRHJvcCkgeworCisKKyAgICAgICAgQmlQcmVkaWNhdGU8Rmxvdy5TdWJzY3JpYmVyPD8gc3VwZXIgVD4sID8gc3VwZXIgVD4gY2FsbGJhY2s7CisKKyAgICAgICAgY2FsbGJhY2sgPSBvbkRyb3AgPT0gbnVsbAorICAgICAgICAgICAgICAgID8gdGhpczo6b25Ecm9wCisgICAgICAgICAgICAgICAgOiAoQmlQcmVkaWNhdGU8Rmxvdy5TdWJzY3JpYmVyPD8gc3VwZXIgVD4sIFQ+KQorICAgICAgICAgICAgICAgIChzdWJzY3JpYmVyLCBkYXRhKSAtPiB7CisgICAgICAgICAgICAgICAgICAgIG9uRHJvcC50ZXN0KGdldFN1YnNjcmliZXJXcmFwcGVyKHN1YnNjcmliZXIpLmdldFdyYXBwZWRTdWJzY3JpYmVyKCksIGRhdGEpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICByZXR1cm4gc3VibWlzc2lvblB1Ymxpc2hlci5vZmZlcihpdGVtLCB0aW1lb3V0LCB1bml0LCBjYWxsYmFjayk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIG9uRHJvcChGbG93LlN1YnNjcmliZXI8PyBzdXBlciBUPiBzdWJzY3JpYmVyLCBUIHQpIHsKKyAgICAgICAgc3Vic2NyaWJlci5vbkVycm9yKG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuU0xPV19TVUJTQ1JJQkVSKHQpKSk7CisgICAgICAgIGdldFN1YnNjcmliZXJXcmFwcGVyKHN1YnNjcmliZXIpLmdldFN1YnNjcmlwdGlvbigpLmNhbmNlbCgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdWJzY3JpYmVyV3JhcHBlciBnZXRTdWJzY3JpYmVyV3JhcHBlcihGbG93LlN1YnNjcmliZXIgc3Vic2NyaWJlcikgeworICAgICAgICBpZiAoc3Vic2NyaWJlciBpbnN0YW5jZW9mIFN1YnNjcmliZXJXcmFwcGVyKSB7CisgICAgICAgICAgICByZXR1cm4gKChTdWJzY3JpYmVyV3JhcHBlcikgc3Vic2NyaWJlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlVOS05PV05fU1VCU0NSSUJFUigpKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogUHVibGlzaGVzIHRoZSBnaXZlbiBpdGVtIHRvIGFsbCBjdXJyZW50IHN1YnNjcmliZXJzIGJ5IGludm9raW5nIGl0cyB7QGNvZGUgb25OZXh0KCkgbWV0aG9kfSB1c2luZyB7QGNvZGUgRXhlY3V0b3J9CisgICAgICogcHJvdmlkZWQgYXMgY29uc3RydWN0b3IgcGFyYW1ldGVyIChvciB0aGUgZGVmYXVsdCB7QGNvZGUgRXhlY3V0b3J9IGlmIG5vdCBwcm92aWRlZCkuCisgICAgICogPHA+CisgICAgICogQ29uY3JldGUgYmVoYXZpb3VyIGlzIHNwZWNpZmllZCBieSB7QGxpbmsgUHVibGlzaGVyU3RyYXRlZ3l9IHNlbGVjdGVkIHVwb24ge0Bjb2RlIEplcnNleVB1Ymxpc2hlcn0gY3JlYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaXRlbSB0aGUgKG5vbi1udWxsKSBpdGVtIHRvIHB1Ymxpc2guCisgICAgICogQHJldHVybiBpZiBuZWdhdGl2ZSwgdGhlIChuZWdhdGl2ZSkgbnVtYmVyIG9mIGRyb3BzOyBvdGhlcndpc2UgYW4gZXN0aW1hdGUgb2YgbWF4aW11bSBsYWcuCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gICAgICBpZiBjbG9zZWQKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uICAgICAgIGlmIGl0ZW0gaXMgbnVsbAorICAgICAqIEB0aHJvd3MgUmVqZWN0ZWRFeGVjdXRpb25FeGNlcHRpb24gaWYgdGhyb3duIGJ5IHtAY29kZSBFeGVjdXRvcn0KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHB1Ymxpc2goVCBpdGVtKSB7CisgICAgICAgIGlmIChQdWJsaXNoZXJTdHJhdGVneS5CTE9DS0lORyA9PSBzdHJhdGVneSkgeworICAgICAgICAgICAgcmV0dXJuIHN1Ym1pdChpdGVtKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFB1Ymxpc2hlclN0cmF0ZWd5LkJFU1RfRUZGT1JUCisgICAgICAgICAgICByZXR1cm4gc3VibWlzc2lvblB1Ymxpc2hlci5vZmZlcihpdGVtLCB0aGlzOjpvbkRyb3ApOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVW5sZXNzIGFscmVhZHkgY2xvc2VkLCBpc3N1ZXMge0Bjb2RlIG9uQ29tcGxldGUoKX0gc2lnbmFscyB0byBjdXJyZW50IHN1YnNjcmliZXJzLCBhbmQgZGlzYWxsb3dzIHN1YnNlcXVlbnQKKyAgICAgKiBhdHRlbXB0cyB0byBwdWJsaXNoLiBVcG9uIHJldHVybiwgdGhpcyBtZXRob2QgZG9lcyA8ZW0+Tk9UPC9lbT4gZ3VhcmFudGVlIHRoYXQgYWxsIHN1YnNjcmliZXJzIGhhdmUgeWV0CisgICAgICogY29tcGxldGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICBzdWJtaXNzaW9uUHVibGlzaGVyLmNsb3NlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXNzdWVzIG9uRXJyb3Igc2lnbmFscyB0byBjdXJyZW50IHN1YnNjcmliZXJzIHdpdGggdGhlIGdpdmVuIGVycm9yLCBhbmQgZGlzYWxsb3dzIHN1YnNlcXVlbnQgYXR0ZW1wdHMgdG8gcHVibGlzaC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlcnJvciB0aGUge0Bjb2RlIG9uRXJyb3J9IGFyZ3VtZW50IHNlbnQgdG8gc3Vic2NyaWJlcnMKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGVycm9yIGlzIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZUV4Y2VwdGlvbmFsbHkoZmluYWwgVGhyb3dhYmxlIGVycm9yKSB7CisgICAgICAgIHN1Ym1pc3Npb25QdWJsaXNoZXIuY2xvc2VFeGNlcHRpb25hbGx5KGVycm9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIGVzdGltYXRlIG9mIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpdGVtcyBwcm9kdWNlZCBidXQgbm90IHlldCBjb25zdW1lZCBhbW9uZyBhbGwgY3VycmVudCBzdWJzY3JpYmVycy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gZXN0aW1hdGVkIG1heGltdW0gbGFnCisgICAgICovCisgICAgcHVibGljIGludCBlc3RpbWF0ZU1heGltdW1MYWcoKSB7CisgICAgICAgIHJldHVybiBzdWJtaXNzaW9uUHVibGlzaGVyLmVzdGltYXRlTWF4aW11bUxhZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gZXN0aW1hdGUgb2YgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGl0ZW1zIHJlcXVlc3RlZCBidXQgbm90IHlldCBwcm9kdWNlZCwgYW1vbmcgYWxsIGN1cnJlbnQgc3Vic2NyaWJlcnMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGVzdGltYXRlZCBtaW5pbXVtIGRlbWFuZAorICAgICAqLworICAgIHB1YmxpYyBsb25nIGVzdGltYXRlTWluaW11bURlbWFuZCgpIHsKKyAgICAgICAgcmV0dXJuIHN1Ym1pc3Npb25QdWJsaXNoZXIuZXN0aW1hdGVNaW5pbXVtRGVtYW5kKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZXhjZXB0aW9uIGFzc29jaWF0ZWQgd2l0aCB7QGxpbmsgI2Nsb3NlRXhjZXB0aW9uYWxseX0sIG9yIG51bGwgaWYgbm90IGNsb3NlZCBvciBpZiBjbG9zZWQgbm9ybWFsbHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGV4Y2VwdGlvbiB0aHJvd24gb24gY2xvc2luZyBvciB7QGNvZGUgbnVsbH0KKyAgICAgKi8KKyAgICBwdWJsaWMgVGhyb3dhYmxlIGdldENsb3NlZEV4Y2VwdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHN1Ym1pc3Npb25QdWJsaXNoZXIuZ2V0Q2xvc2VkRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBwZXItc3Vic2NyaWJlciBidWZmZXIgY2FwYWNpdHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBtYXhpbXVtIHBlci1zdWJzY3JpYmVyIGJ1ZmZlciBjYXBhY2l0eQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0TWF4QnVmZmVyQ2FwYWNpdHkoKSB7CisgICAgICAgIHJldHVybiBzdWJtaXNzaW9uUHVibGlzaGVyLmdldE1heEJ1ZmZlckNhcGFjaXR5KCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdWJzY3JpYmVyV3JhcHBlcjxUPiBpbXBsZW1lbnRzIEZsb3cuU3Vic2NyaWJlcjxUPiB7CisgICAgICAgIHByaXZhdGUgRmxvdy5TdWJzY3JpYmVyPD8gc3VwZXIgVD4gc3Vic2NyaWJlcjsKKyAgICAgICAgcHJpdmF0ZSBGbG93LlN1YnNjcmlwdGlvbiBzdWJzY3JpcHRpb24gPSBudWxsOworCisgICAgICAgIHB1YmxpYyBTdWJzY3JpYmVyV3JhcHBlcihGbG93LlN1YnNjcmliZXI8PyBzdXBlciBUPiBzdWJzY3JpYmVyKSB7CisgICAgICAgICAgICB0aGlzLnN1YnNjcmliZXIgPSBzdWJzY3JpYmVyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU3Vic2NyaWJlKGZpbmFsIEZsb3cuU3Vic2NyaXB0aW9uIHN1YnNjcmlwdGlvbikgeworICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSBzdWJzY3JpcHRpb247CisgICAgICAgICAgICBzdWJzY3JpYmVyLm9uU3Vic2NyaWJlKG5ldyBGbG93LlN1YnNjcmlwdGlvbigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCByZXF1ZXN0KGZpbmFsIGxvbmcgbikgeworICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24ucmVxdWVzdChuKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBjYW5jZWwoKSB7CisgICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5jYW5jZWwoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbk5leHQoZmluYWwgVCBpdGVtKSB7CisgICAgICAgICAgICBzdWJzY3JpYmVyLm9uTmV4dChpdGVtKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKGZpbmFsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKKyAgICAgICAgICAgIHN1YnNjcmliZXIub25FcnJvcih0aHJvd2FibGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUoKSB7CisgICAgICAgICAgICBzdWJzY3JpYmVyLm9uQ29tcGxldGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBGbG93LlN1YnNjcmliZXI8PyBzdXBlciBUPiBnZXRXcmFwcGVkU3Vic2NyaWJlcigpIHsKKyAgICAgICAgICAgIHJldHVybiBzdWJzY3JpYmVyOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCByZWZlcmVuY2UgdG8gc3Vic2NyaWJlcidzIHtAbGluayBGbG93LlN1YnNjcmlwdGlvbn0uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gc3Vic2NyaWJlcidzIHtAY29kZSBzdWJzY3JpcHRpb259CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgRmxvdy5TdWJzY3JpcHRpb24gZ2V0U3Vic2NyaXB0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3Vic2NyaXB0aW9uOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGVudW0gUHVibGlzaGVyU3RyYXRlZ3l7CisgICAgICAgIC8qKgorICAgICAgICAgKiBCbG9ja2luZyBwdWJsaXNoZXIgc3RyYXRlZ3kgLSB0cmllcyB0byBkZWxpdmVyIHRvIGFsbCBzdWJzY3JpYmVycyByZWdhcmRsZXNzIHRoZSBjb3N0LgorICAgICAgICAgKgorICAgICAgICAgKiBUaGUgdGhyZWFkIGlzIGJsb2NrZWQgdW5pbnRlcnJ1cHRpYmx5IHdoaWxlIHJlc291cmNlcyBmb3IgYW55IHN1YnNjcmliZXIgYXJlIHVuYXZhaWxhYmxlLgorICAgICAgICAgKiBUaGlzIHN0cmF0ZWd5IGNvbWVzIHdpdGggYSByaXNrIG9mIHRocmVhZCBleGhhdXN0aW9uLCB0aGF0IHdpbGwgbGVhZCB0byBwdWJsaXNoZXIgYmVpbmcgY29tcGxldGVseSBibG9ja2VkIGJ5IHNsb3cKKyAgICAgICAgICogb3IgaW5jb3JyZWN0bHkgaW1wbGVtZW50ZWQgc3Vic2NyaWJlcnMuCisgICAgICAgICAqLworICAgICAgICBCTE9DS0lORywKKworICAgICAgICAvKioKKyAgICAgICAgICogQmVzdCBlZmZvcnQgcHVibGlzaGVyIHN0cmF0ZWd5IC0gdHJpZXMgdG8gZGVsaXZlciB0byBhbGwgc3Vic2NyaWJlcnMgaWYgcG9zc2libGUgd2l0aG91dCBibG9ja2luZyB0aGUgcHJvY2Vzc2luZy4KKyAgICAgICAgICoKKyAgICAgICAgICogSWYgdGhlIGJ1ZmZlciBpcyBmdWxsLCBwdWJsaXNoZXIgaW52b2tlcyB7QGNvZGUgb25FcnJvcigpfSBhbmQgY2FuY2VscyBzdWJzY3JpcHRpb24gb24gYSBzdWJzY3JpYmVyLCB0aGF0IGlzIG5vdAorICAgICAgICAgKiBjYXBhYmxlIG9mIHJlYWQgdGhlIG1lc3NhZ2VzIGF0IGEgc3BlZWQgc3VmZmljaWVudCB0byB1bmJsb2NrIHRoZSBwcm9jZXNzaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgQkVTVF9FRkZPUlQsCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL0xhenlVaWQuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9MYXp5VWlkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhiMzU3NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9MYXp5VWlkLmphdmEKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZTsKKworLyoqCisgKiBMYXppbHkgaW5pdGlhbGl6ZWQsIHRocmVhZC1zYWZlLCByYW5kb20gVVVJRC4gVXNlZnVsIGZvciBpZGVudGlmeWluZyBpbnN0YW5jZXMKKyAqIGZvciBsb2dnaW5nICYgZGVidWdnaW5nIHB1cnBvc2VzLgorICogPHAgLz4KKyAqIFRoZSBVVUlEIHZhbHVlIGdldHMgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZmlyc3QgY2FsbCB0byB7QGxpbmsgI3ZhbHVlKCl9IG1ldGhvZC4KKyAqIE9uY2UgaW5pdGlhbGl6ZWQsIHRoZSBVVUlEIHZhbHVlIHN0YXlzIHRoZSBzYW1lLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBMYXp5VWlkIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA0NjE4NjA5NDEzODc3MTM2ODY3TDsKKworICAgIHByaXZhdGUgZmluYWwgQXRvbWljUmVmZXJlbmNlPFN0cmluZz4gdWlkID0gbmV3IEF0b21pY1JlZmVyZW5jZTxTdHJpbmc+KCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gVVVJRCB2YWx1ZS4gVGhlIHJldHVybmVkIHZhbHVlIGlzIG5ldmVyIHtAY29kZSBudWxsfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVVVJRCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHZhbHVlKCkgeworICAgICAgICBpZiAodWlkLmdldCgpID09IG51bGwpIHsKKyAgICAgICAgICAgIHVpZC5jb21wYXJlQW5kU2V0KG51bGwsIFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHVpZC5nZXQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHRoYXQpIHsKKyAgICAgICAgaWYgKHRoYXQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRDbGFzcygpICE9IHRoYXQuZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIExhenlVaWQgb3RoZXIgPSAoTGF6eVVpZCkgdGhhdDsKKyAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUoKS5lcXVhbHMob3RoZXIudmFsdWUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGhhc2ggPSA3OworICAgICAgICBoYXNoID0gNzMgKiBoYXNoICsgdGhpcy52YWx1ZSgpLmhhc2hDb2RlKCk7CisgICAgICAgIHJldHVybiBoYXNoOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiB2YWx1ZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9QcmV0dHkuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9QcmV0dHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2EyNDhiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL1ByZXR0eS5qYXZhCkBAIC0wLDAgKzEsMjMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWw7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUGFyYW1ldGVyaXplZFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIHRvIHByaW50IHRoZSB2YXJpZXR5IG9mIHR5cGVzLCB1c2VmdWwgaW4ge0Bjb2RlIHRvU3RyaW5nfSBtZXRob2QuCisgKgorICogQGF1dGhvciBKb2huIFdlbGxzIChqb2huLndlbGxzIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBQcmV0dHkgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERPVCA9ICIuIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTlVMTF9TVFJJTkcgPSAibnVsbCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlNUUlVDVE9SX05BTUUgPSAiPGluaXQ+IjsKKworICAgIC8qKgorICAgICAqIFByaXZhdGUgY29uc3RydWN0b3IgdG8gZm9yYmlkIHRoZSBjcmVhdGlvbiBvZiBQcmV0dHkgaW5zdGFuY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBQcmV0dHkoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFrZXMgYSBuaWNlLCBwcmV0dHkgY2xhc3MgKHdpdGhvdXQgdGhlIHBhY2thZ2UgbmFtZSkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhenogTWFrZSBtZSBhIHByZXR0eSBjbGFzcy4KKyAgICAgKiBAcmV0dXJuIEEgbmljZSBzdHJpbmcgb2YgdGhlIGNsYXNzLCB3aXRoIG5vIHBhY2thZ2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY2xhenooQ2xhc3M8Pz4gY2xhenopIHsKKyAgICAgICAgaWYgKGNsYXp6ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMX1NUUklORzsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBjbiA9IGNsYXp6LmdldE5hbWUoKTsKKworICAgICAgICBpbnQgaW5kZXggPSBjbi5sYXN0SW5kZXhPZihET1QpOworICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gY247CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB0aGlzIGZhaWxzLCB0aGUgY2xhc3MgbmFtZSBzb21laG93IGVuZHMgaW4gZG90LCB3aGljaCBzaG91bGQgYmUgaWxsZWdhbAorICAgICAgICByZXR1cm4gY24uc3Vic3RyaW5nKGluZGV4ICsgMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnRzIGEgcHJldHR5IHBhcmFtZXRlcml6ZWQgdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwVHlwZSBUaGUgcGFyYW1ldGVyaXplZCB0eXBlIHRvIHByaW50LiBNYXkgbm90IGJlIG51bGwuCisgICAgICogQHJldHVybiBBIHByZXR0eSBzdHJpbmcgdmVyc2lvbiBvZiB0aGUgcGFyYW1ldGVyaXplZCB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHBUeXBlKFBhcmFtZXRlcml6ZWRUeXBlIHBUeXBlKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgICAgICBzYi5hcHBlbmQoY2xhenooUmVmbGVjdGlvbkhlbHBlci5nZXRSYXdDbGFzcyhwVHlwZSkpICsgIjwiKTsKKworICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgZm9yIChUeXBlIHQgOiBwVHlwZS5nZXRBY3R1YWxUeXBlQXJndW1lbnRzKCkpIHsKKyAgICAgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHR5cGUodCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiwiICsgdHlwZSh0KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzYi5hcHBlbmQoIj4iKTsKKworICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgcHJldHR5IHN0cmluZyBmb3IgdGhlIGdpdmVuIHR5cGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdCBBIHBvc3NpYmx5IG51bGwgdHlwZS4KKyAgICAgKiBAcmV0dXJuIEEgcHJldHR5IHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHR5cGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgdHlwZShUeXBlIHQpIHsKKyAgICAgICAgaWYgKHQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTExfU1RSSU5HOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBDbGFzcykgeworICAgICAgICAgICAgcmV0dXJuIGNsYXp6KChDbGFzczw/PikgdCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAodCBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gcFR5cGUoKFBhcmFtZXRlcml6ZWRUeXBlKSB0KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0LnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFrZSBhIG5pY2UgcHJldHR5IHN0cmluZyBvdXQgb2YgdGhlIGNvbnN0cnVjdG9yIGFuZCBhbGwgaXRzIHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uc3RydWN0b3IgVGhlIGNvbnN0cnVjdG9yIHRvIG1ha2UgcHJldHR5LgorICAgICAqIEByZXR1cm4gQSBuaWNlIHByZXR0eSBzdHJpbmcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29uc3RydWN0b3IoQ29uc3RydWN0b3I8Pz4gY29uc3RydWN0b3IpIHsKKyAgICAgICAgaWYgKGNvbnN0cnVjdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMX1NUUklORzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBDT05TVFJVQ1RPUl9OQU1FICsgcHJldHR5UHJpbnRQYXJhbWV0ZXJzKGNvbnN0cnVjdG9yLmdldFBhcmFtZXRlclR5cGVzKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ha2VzIGEgbmljZSBwcmV0dHkgc3RyaW5nIG9mIHRoZSBtZXRob2QsIHdpdGggdGhlIG1ldGhvZCBuYW1lIGFuZCBhbGwgcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXRob2QgVGhlIG1ldGhvZCB0byBtYWtlIHByZXR0eS4KKyAgICAgKiBAcmV0dXJuIEEgbmljZSBwcmV0dHkgc3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIG1ldGhvZChNZXRob2QgbWV0aG9kKSB7CisgICAgICAgIGlmIChtZXRob2QgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTExfU1RSSU5HOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1ldGhvZC5nZXROYW1lKCkgKyBwcmV0dHlQcmludFBhcmFtZXRlcnMobWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBwcmV0dHkgc3RyaW5nIHJlcHJlc2VudGluZyBhIEZpZWxkLgorICAgICAqCisgICAgICogQHBhcmFtIGZpZWxkIFRoZSBwb3NzaWJseSBudWxsIGZpZWxkLgorICAgICAqIEByZXR1cm4gQSBwcmV0dHkgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZmllbGQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZmllbGQoRmllbGQgZmllbGQpIHsKKyAgICAgICAgaWYgKGZpZWxkID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMX1NUUklORzsKKyAgICAgICAgfQorCisgICAgICAgIFR5cGUgdCA9IGZpZWxkLmdldEdlbmVyaWNUeXBlKCk7CisKKyAgICAgICAgU3RyaW5nIGJhc2VTdHJpbmc7CisgICAgICAgIGlmICh0IGluc3RhbmNlb2YgQ2xhc3MpIHsKKyAgICAgICAgICAgIGJhc2VTdHJpbmcgPSBjbGF6eigoQ2xhc3M8Pz4pIHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYmFzZVN0cmluZyA9IHR5cGUodCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gImZpZWxkKCIgKyBiYXNlU3RyaW5nICsgIiAiICsgZmllbGQuZ2V0TmFtZSgpICsgIiBpbiAiICsgZmllbGQuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXROYW1lKCkgKyAiKSI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHByZXR0eSBzdHJpbmcgZm9yIHRoZSBnaXZlbiBhcnJheS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcnJheSBUaGUgcG9zc2libHkgbnVsbCBhcnJheSB0byByZXByZXNlbnQuCisgICAgICogQHJldHVybiBBIHByZXR0eSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGFycmF5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGFycmF5KE9iamVjdFtdIGFycmF5KSB7CisgICAgICAgIGlmIChhcnJheSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTF9TVFJJTkc7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigieyIpOworCisgICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworICAgICAgICBmb3IgKE9iamVjdCBpdGVtIDogYXJyYXkpIHsKKyAgICAgICAgICAgIGlmIChpdGVtICE9IG51bGwgJiYgKGl0ZW0gaW5zdGFuY2VvZiBDbGFzcykpIHsKKyAgICAgICAgICAgICAgICBpdGVtID0gUHJldHR5LmNsYXp6KChDbGFzczw/PikgaXRlbSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoKGl0ZW0gPT0gbnVsbCkgPyAibnVsbCIgOiBpdGVtLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiwiICsgKChpdGVtID09IG51bGwpID8gIm51bGwiIDogaXRlbS50b1N0cmluZygpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzYi5hcHBlbmQoIn0iKTsKKworICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgcHJldHR5IHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGNvbGxlY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29sbGVjdGlvbiBBIHBvc3NpYmx5IG51bGwgY29sbGVjdGlvbiB0byByZXByZXNlbnQuCisgICAgICogQHJldHVybiBBIHByZXR0eSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBjb2xsZWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNvbGxlY3Rpb24oQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7CisgICAgICAgIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMX1NUUklORzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYXJyYXkoY29sbGVjdGlvbi50b0FycmF5KG5ldyBPYmplY3RbY29sbGVjdGlvbi5zaXplKCldKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHByZXR0eVByaW50UGFyYW1ldGVycyhDbGFzczw/PiBwYXJhbXNbXSkgeworICAgICAgICBpZiAocGFyYW1zID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMX1NUUklORzsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoIigiKTsKKworICAgICAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgZm9yIChDbGFzczw/PiBwYXJhbSA6IHBhcmFtcykgeworICAgICAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGNsYXp6KHBhcmFtKSk7CisgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIsIiArIGNsYXp6KHBhcmFtKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzYi5hcHBlbmQoIikiKTsKKworICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9Qcm9kdWNlci5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL1Byb2R1Y2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg0MDM1NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9Qcm9kdWNlci5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOworCisvKioKKyAqIFRoaXMgaW50ZXJmYWNlIGV4dGVuZHMge0BsaW5rIGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlfSBpbnRlcmZhY2UgYnV0IHJlbW92ZXMgdGhlCisgKiBleGNlcHRpb24gZnJvbSB7QGNvZGUgY2FsbH0gZGVjbGFyYXRpb24uCisgKiA8cD4KKyAqIFRoaXMgY29udmVuaWVuY2UgaW50ZXJmYWNlIG1heSBiZSB1c2VkIGluIHBsYWNlcyB3aGVyZSBhIHRhc2sKKyAqIHByb2R1Y2luZyBhIHJlc3VsdCBuZWVkcyB0byBiZSBleGVjdXRlZCBpbiB0aGUgcmVxdWVzdCBzY29wZSBidXQgbm8KKyAqIHtAbGluayBFeGNlcHRpb24gY2hlY2tlZCBleGNlcHRpb25zfSBhcmUgdGhyb3duIGR1cmluZyB0aGUgdGFzaworICogZXhlY3V0aW9uLgorICogPC9wPgorICoKKyAqIEBwYXJhbSA8VD4gdHlwZSBvZiB0aGUgcHJvZHVjZWQgcmVzdWx0LgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUHJvZHVjZXI8VD4gZXh0ZW5kcyBDYWxsYWJsZTxUPiB7CisgICAgQE92ZXJyaWRlCisgICAgVCBjYWxsKCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvUHJvcGVydGllc0NsYXNzLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvUHJvcGVydGllc0NsYXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFlNGRjOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9Qcm9wZXJ0aWVzQ2xhc3MuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWw7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworLyoqCisgKiBNYXJrZXIgYW5ub3RhdGlvbiBmb3IgcHJvcGVydHkgY2xhc3Nlcy4KKyAqCisgKiBBbGwgc3RhdGljIHtAY29kZSBTdHJpbmd9IGZpZWxkcyBpbiBhIGNsYXNzIGFubm90YXRlZCBieSB0aGlzIGFubm90YXRpb24gYXJlIGNvbnNpZGVyZWQgdG8gcmVwcmVzZW50CisgKiBwcm9wZXJ0eSBuYW1lcyByZWNvZ25pemVkIGJ5IEplcnNleSBydW50aW1lIG9yIG9uZSBvZiB0aGUgSmVyc2V5IGV4dGVuc2lvbiBtb2R1bGVzLgorICogPHA+CisgKiBQdXR0aW5nIHRoaXMgYW5ub3RhdGlvbiBvbiBhIGNsYXNzIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgcHV0dGluZyB0aGUge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUHJvcGVydHl9CisgKiBhbm5vdGF0aW9uIG9uIGVhY2ggaW5kaXZpZHVhbCBzdGF0aWMge0Bjb2RlIFN0cmluZ30gZmllbGQgaW4gdGhlIGNsYXNzLgorICogPC9wPgorICogPHA+CisgKiBKZXJzZXkgY29kZSBzaG91bGQgbm90IGNvbnRhaW4gb3ZlcmxhcHBpbmcgbm9yIGR1cGxpY2F0ZSBwcm9wZXJ0eSBuYW1lcy4gVGhpcyBpcyBjaGVja2VkIGluIGEgZGVkaWNhdGVkCisgKiAoQGNvZGUgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24ucHJvcGVydHljaGVjay5Qcm9wZXJ0eU92ZXJsYXBwaW5nQ2hlY2tUZXN0KSB1bml0IHRlc3QuCisgKiA8L3A+CisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqIEBzZWUgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5Qcm9wZXJ0eQorICogQHNlZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlByb3BlcnR5QWxpYXMKKyAqLworQFRhcmdldChFbGVtZW50VHlwZS5UWVBFKQorQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK3B1YmxpYyBAaW50ZXJmYWNlIFByb3BlcnRpZXNDbGFzcyB7Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvUHJvcGVydGllc0hlbHBlci5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL1Byb3BlcnRpZXNIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTQ3NDNiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL1Byb3BlcnRpZXNIZWxwZXIuamF2YQpAQCAtMCwwICsxLDM0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5SdW50aW1lVHlwZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworCisvKioKKyAqIEhlbHBlciBjbGFzcyBjb250YWluaW5nIGNvbnZlbmllbmNlIG1ldGhvZHMgZm9yIHJlYWRpbmcKKyAqIHtAY29kZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWd9IGFuZCB7QGxpbmsgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9ufSBwcm9wZXJ0aWVzLgorICoKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgUHJvcGVydGllc0hlbHBlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihQcm9wZXJ0aWVzSGVscGVyLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgc3lzdGVtIHByb3BlcnRpZXMuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBkZWxlZ2F0ZXMgdG8ge0BsaW5rIFN5c3RlbSNnZXRQcm9wZXJ0aWVzKCl9IHdoaWxlIHJ1bm5pbmcgaXQgaW4gYSBwcml2aWxlZ2VkCisgICAgICogY29kZSBibG9jay4KKyAgICAgKgorICAgICAqIEByZXR1cm4gcHJpdmlsZWdlZCBhY3Rpb24gdG8gb2J0YWluIHN5c3RlbSBwcm9wZXJ0aWVzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUHJpdmlsZWdlZEFjdGlvbjxQcm9wZXJ0aWVzPiBnZXRTeXN0ZW1Qcm9wZXJ0aWVzKCkgeworICAgICAgICByZXR1cm4gbmV3IFByaXZpbGVnZWRBY3Rpb248UHJvcGVydGllcz4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBQcm9wZXJ0aWVzIHJ1bigpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gU3lzdGVtLmdldFByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgc3lzdGVtIHByb3BlcnR5LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgZGVsZWdhdGVzIHRvIHtAbGluayBTeXN0ZW0jZ2V0UHJvcGVydHkoU3RyaW5nKX0gd2hpbGUgcnVubmluZyBpdCBpbiBhIHByaXZpbGVnZWQKKyAgICAgKiBjb2RlIGJsb2NrLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgc3lzdGVtIHByb3BlcnR5IG5hbWUuCisgICAgICogQHJldHVybiBwcml2aWxlZ2VkIGFjdGlvbiB0byBvYnRhaW4gc3lzdGVtIHByb3BlcnR5IHZhbHVlIHRoYXQgd2lsbCByZXR1cm4ge0Bjb2RlIG51bGx9CisgICAgICogICAgICAgICBpZiB0aGVyZSdzIG5vIHN1Y2ggc3lzdGVtIHByb3BlcnR5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUHJpdmlsZWdlZEFjdGlvbjxTdHJpbmc+IGdldFN5c3RlbVByb3BlcnR5KGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBuZXcgUHJpdmlsZWdlZEFjdGlvbjxTdHJpbmc+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHJ1bigpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KG5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBzeXN0ZW0gcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBkZWxlZ2F0ZXMgdG8ge0BsaW5rIFN5c3RlbSNnZXRQcm9wZXJ0eShTdHJpbmcpfSB3aGlsZSBydW5uaW5nIGl0IGluIGEgcHJpdmlsZWdlZAorICAgICAqIGNvZGUgYmxvY2suCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBzeXN0ZW0gcHJvcGVydHkgbmFtZS4KKyAgICAgKiBAcGFyYW0gZGVmICBkZWZhdWx0IHByb3BlcnR5IHZhbHVlLgorICAgICAqIEByZXR1cm4gcHJpdmlsZWdlZCBhY3Rpb24gdG8gb2J0YWluIHN5c3RlbSBwcm9wZXJ0eSB2YWx1ZSB0aGF0IHdpbGwgcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlCisgICAgICogICAgICAgICBpZiB0aGVyZSdzIG5vIHN1Y2ggc3lzdGVtIHByb3BlcnR5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUHJpdmlsZWdlZEFjdGlvbjxTdHJpbmc+IGdldFN5c3RlbVByb3BlcnR5KGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgZGVmKSB7CisgICAgICAgIHJldHVybiBuZXcgUHJpdmlsZWdlZEFjdGlvbjxTdHJpbmc+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHJ1bigpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KG5hbWUsIGRlZik7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHZhbHVlIG9mIGEgc3BlY2lmaWVkIHByb3BlcnR5LiBJZiB0aGUgcHJvcGVydHkgaXMgbm90IHNldCBvciB0aGUgcmVhbCB2YWx1ZSB0eXBlIGlzIG5vdCBjb21wYXRpYmxlIHdpdGgKKyAgICAgKiBkZWZhdWx0VmFsdWUgdHlwZSwgdGhlIHNwZWNpZmllZCBkZWZhdWx0VmFsdWUgaXMgcmV0dXJuZWQuIENhbGxpbmcgdGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nCisgICAgICoge0Bjb2RlIFByb3BlcnR5SGVscGVyLmdldFZhbHVlKHByb3BlcnRpZXMsIGtleSwgZGVmYXVsdFZhbHVlLCAoQ2xhc3M8VD4pIGRlZmF1bHRWYWx1ZS5nZXRDbGFzcygpKX0KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzICAgTWFwIG9mIHByb3BlcnRpZXMgdG8gZ2V0IHRoZSBwcm9wZXJ0eSB2YWx1ZSBmcm9tLgorICAgICAqIEBwYXJhbSBrZXkgICAgICAgICAgTmFtZSBvZiB0aGUgcHJvcGVydHkuCisgICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBEZWZhdWx0IHZhbHVlIHRvIGJlIHJldHVybmVkIGlmIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgaXMgbm90IHNldCBvciBjYW5ub3QgYmUgcmVhZC4KKyAgICAgKiBAcGFyYW0gPFQ+ICAgICAgICAgIFR5cGUgb2YgdGhlIHByb3BlcnR5IHZhbHVlLgorICAgICAqIEBwYXJhbSBsZWdhY3lNYXAgICAgTGVnYWN5IGZhbGxiYWNrIG1hcCwgd2hlcmUga2V5IGlzIHRoZSBhY3R1YWwgcHJvcGVydHkgbmFtZSwgdmFsdWUgaXMgdGhlIG9sZCBwcm9wZXJ0eSBuYW1lCisgICAgICogQHJldHVybiBWYWx1ZSBvZiB0aGUgcHJvcGVydHkgb3IgZGVmYXVsdFZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFQgZ2V0VmFsdWUoTWFwPFN0cmluZywgPz4gcHJvcGVydGllcywgU3RyaW5nIGtleSwgVCBkZWZhdWx0VmFsdWUsIE1hcDxTdHJpbmcsIFN0cmluZz4gbGVnYWN5TWFwKSB7CisgICAgICAgIHJldHVybiBnZXRWYWx1ZShwcm9wZXJ0aWVzLCBudWxsLCBrZXksIGRlZmF1bHRWYWx1ZSwgbGVnYWN5TWFwKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFJldHVybiB2YWx1ZSBvZiBhIHNwZWNpZmllZCBwcm9wZXJ0eS4gSWYgdGhlIHByb3BlcnR5IGlzIG5vdCBzZXQgb3IgdGhlIHJlYWwgdmFsdWUgdHlwZSBpcyBub3QgY29tcGF0aWJsZSB3aXRoCisgICAgICogZGVmYXVsdFZhbHVlIHR5cGUsIHRoZSBzcGVjaWZpZWQgZGVmYXVsdFZhbHVlIGlzIHJldHVybmVkLiBDYWxsaW5nIHRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZworICAgICAqIHtAY29kZSBQcm9wZXJ0eUhlbHBlci5nZXRWYWx1ZShwcm9wZXJ0aWVzLCBydW50aW1lVHlwZSwga2V5LCBkZWZhdWx0VmFsdWUsIChDbGFzczxUPikgZGVmYXVsdFZhbHVlLmdldENsYXNzKCkpfQorICAgICAqCisgICAgICogQHBhcmFtIHByb3BlcnRpZXMgICBNYXAgb2YgcHJvcGVydGllcyB0byBnZXQgdGhlIHByb3BlcnR5IHZhbHVlIGZyb20uCisgICAgICogQHBhcmFtIHJ1bnRpbWVUeXBlICBSdW50aW1lIHR5cGUgd2hpY2ggaXMgdXNlZCB0byBjaGVjayB3aGV0aGVyIHRoZXJlIGlzIGEgcHJvcGVydHkgd2l0aCB0aGUgc2FtZQorICAgICAqICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIGtleX0gYnV0IHBvc3QtZml4ZWQgYnkgcnVudGltZSB0eXBlICg8dHQ+LnNlcnZlcjwvdHQ+CisgICAgICogICAgICAgICAgICAgICAgICAgICBvciB7QGNvZGUgLmNsaWVudH0pIHdoaWNoIHdvdWxkIG92ZXJyaWRlIHRoZSB7QGNvZGUga2V5fSBwcm9wZXJ0eS4KKyAgICAgKiBAcGFyYW0ga2V5ICAgICAgICAgIE5hbWUgb2YgdGhlIHByb3BlcnR5LgorICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgRGVmYXVsdCB2YWx1ZSB0byBiZSByZXR1cm5lZCBpZiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IGlzIG5vdCBzZXQgb3IgY2Fubm90IGJlIHJlYWQuCisgICAgICogQHBhcmFtIDxUPiAgICAgICAgICBUeXBlIG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gbGVnYWN5TWFwICAgIExlZ2FjeSBmYWxsYmFjayBtYXAsIHdoZXJlIGtleSBpcyB0aGUgYWN0dWFsIHByb3BlcnR5IG5hbWUsIHZhbHVlIGlzIHRoZSBvbGQgcHJvcGVydHkgbmFtZQorICAgICAqIEByZXR1cm4gVmFsdWUgb2YgdGhlIHByb3BlcnR5IG9yIGRlZmF1bHRWYWx1ZS4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgc3RhdGljIDxUPiBUIGdldFZhbHVlKE1hcDxTdHJpbmcsID8+IHByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSdW50aW1lVHlwZSBydW50aW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIGRlZmF1bHRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gbGVnYWN5TWFwKSB7CisgICAgICAgIHJldHVybiBnZXRWYWx1ZShwcm9wZXJ0aWVzLCBydW50aW1lVHlwZSwga2V5LCBkZWZhdWx0VmFsdWUsIChDbGFzczxUPikgZGVmYXVsdFZhbHVlLmdldENsYXNzKCksIGxlZ2FjeU1hcCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB2YWx1ZSBvZiBhIHNwZWNpZmllZCBwcm9wZXJ0eS4gSWYgdGhlIHByb3BlcnR5IGlzIG5vdCBzZXQgb3IgdGhlIHJlYWwgdmFsdWUgdHlwZSBpcyBub3QgY29tcGF0aWJsZSB3aXRoCisgICAgICogdGhlIHNwZWNpZmllZCB2YWx1ZSB0eXBlLCByZXR1cm5zIGRlZmF1bHRWYWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzICAgTWFwIG9mIHByb3BlcnRpZXMgdG8gZ2V0IHRoZSBwcm9wZXJ0eSB2YWx1ZSBmcm9tLgorICAgICAqIEBwYXJhbSBrZXkgICAgICAgICAgTmFtZSBvZiB0aGUgcHJvcGVydHkuCisgICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSBEZWZhdWx0IHZhbHVlIG9mIHRoZSBwcm9wZXJ0eS4KKyAgICAgKiBAcGFyYW0gdHlwZSAgICAgICAgIFR5cGUgdG8gcmV0cmlldmUgdGhlIHZhbHVlIGFzLgorICAgICAqIEBwYXJhbSA8VD4gICAgICAgICAgVHlwZSBvZiB0aGUgcHJvcGVydHkgdmFsdWUuCisgICAgICogQHBhcmFtIGxlZ2FjeU1hcCAgICBMZWdhY3kgZmFsbGJhY2sgbWFwLCB3aGVyZSBrZXkgaXMgdGhlIGFjdHVhbCBwcm9wZXJ0eSBuYW1lLCB2YWx1ZSBpcyB0aGUgb2xkIHByb3BlcnR5IG5hbWUKKyAgICAgKiBAcmV0dXJuIFZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBvciBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFQgZ2V0VmFsdWUoTWFwPFN0cmluZywgPz4gcHJvcGVydGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIGRlZmF1bHRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPFQ+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGxlZ2FjeU1hcCkgeworICAgICAgICByZXR1cm4gZ2V0VmFsdWUocHJvcGVydGllcywgbnVsbCwga2V5LCBkZWZhdWx0VmFsdWUsIHR5cGUsIGxlZ2FjeU1hcCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHZhbHVlIG9mIGEgc3BlY2lmaWVkIHByb3BlcnR5LiBJZiB0aGUgcHJvcGVydHkgaXMgbm90IHNldCBvciB0aGUgcmVhbCB2YWx1ZSB0eXBlIGlzIG5vdCBjb21wYXRpYmxlIHdpdGgKKyAgICAgKiB0aGUgc3BlY2lmaWVkIHZhbHVlIHR5cGUsIHJldHVybnMgZGVmYXVsdFZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIHByb3BlcnRpZXMgICBNYXAgb2YgcHJvcGVydGllcyB0byBnZXQgdGhlIHByb3BlcnR5IHZhbHVlIGZyb20uCisgICAgICogQHBhcmFtIHJ1bnRpbWVUeXBlICBSdW50aW1lIHR5cGUgd2hpY2ggaXMgdXNlZCB0byBjaGVjayB3aGV0aGVyIHRoZXJlIGlzIGEgcHJvcGVydHkgd2l0aCB0aGUgc2FtZQorICAgICAqICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIGtleX0gYnV0IHBvc3QtZml4ZWQgYnkgcnVudGltZSB0eXBlICg8dHQ+LnNlcnZlcjwvdHQ+CisgICAgICogICAgICAgICAgICAgICAgICAgICBvciB7QGNvZGUgLmNsaWVudH0pIHdoaWNoIHdvdWxkIG92ZXJyaWRlIHRoZSB7QGNvZGUga2V5fSBwcm9wZXJ0eS4KKyAgICAgKiBAcGFyYW0ga2V5ICAgICAgICAgIE5hbWUgb2YgdGhlIHByb3BlcnR5LgorICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgRGVmYXVsdCB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCisgICAgICogQHBhcmFtIHR5cGUgICAgICAgICBUeXBlIHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBhcy4KKyAgICAgKiBAcGFyYW0gPFQ+ICAgICAgICAgIFR5cGUgb2YgdGhlIHByb3BlcnR5IHZhbHVlLgorICAgICAqIEBwYXJhbSBsZWdhY3lNYXAgICAgTGVnYWN5IGZhbGxiYWNrIG1hcCwgd2hlcmUga2V5IGlzIHRoZSBhY3R1YWwgcHJvcGVydHkgbmFtZSwgdmFsdWUgaXMgdGhlIG9sZCBwcm9wZXJ0eSBuYW1lCisgICAgICogQHJldHVybiBWYWx1ZSBvZiB0aGUgcHJvcGVydHkgb3IgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUPiBUIGdldFZhbHVlKE1hcDxTdHJpbmcsID8+IHByb3BlcnRpZXMsIFJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlLCBTdHJpbmcga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCBkZWZhdWx0VmFsdWUsIENsYXNzPFQ+IHR5cGUsIE1hcDxTdHJpbmcsIFN0cmluZz4gbGVnYWN5TWFwKSB7CisgICAgICAgIFQgdmFsdWUgPSBnZXRWYWx1ZShwcm9wZXJ0aWVzLCBydW50aW1lVHlwZSwga2V5LCB0eXBlLCBsZWdhY3lNYXApOworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdmFsdWUgPSBkZWZhdWx0VmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdmFsdWUgb2YgYSBzcGVjaWZpZWQgcHJvcGVydHkuIElmIHRoZSBwcm9wZXJ0eSBpcyBub3Qgc2V0IG9yIHRoZSByZWFsIHZhbHVlIHR5cGUgaXMgbm90IGNvbXBhdGlibGUgd2l0aAorICAgICAqIHRoZSBzcGVjaWZpZWQgdmFsdWUgdHlwZSwgcmV0dXJucyBudWxsLgorICAgICAqCisgICAgICogQHBhcmFtIHByb3BlcnRpZXMgTWFwIG9mIHByb3BlcnRpZXMgdG8gZ2V0IHRoZSBwcm9wZXJ0eSB2YWx1ZSBmcm9tLgorICAgICAqIEBwYXJhbSBrZXkgICAgICAgIE5hbWUgb2YgdGhlIHByb3BlcnR5LgorICAgICAqIEBwYXJhbSB0eXBlICAgICAgIFR5cGUgdG8gcmV0cmlldmUgdGhlIHZhbHVlIGFzLgorICAgICAqIEBwYXJhbSA8VD4gICAgICAgIFR5cGUgb2YgdGhlIHByb3BlcnR5IHZhbHVlLgorICAgICAqIEBwYXJhbSBsZWdhY3lNYXAgIExlZ2FjeSBmYWxsYmFjayBtYXAsIHdoZXJlIGtleSBpcyB0aGUgYWN0dWFsIHByb3BlcnR5IG5hbWUsIHZhbHVlIGlzIHRoZSBvbGQgcHJvcGVydHkgbmFtZQorICAgICAqIEByZXR1cm4gVmFsdWUgb2YgdGhlIHByb3BlcnR5IG9yIG51bGwuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8VD4gVCBnZXRWYWx1ZShNYXA8U3RyaW5nLCA/PiBwcm9wZXJ0aWVzLCBTdHJpbmcga2V5LCBDbGFzczxUPiB0eXBlLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGxlZ2FjeU1hcCkgeworICAgICAgICByZXR1cm4gZ2V0VmFsdWUocHJvcGVydGllcywgbnVsbCwga2V5LCB0eXBlLCBsZWdhY3lNYXApOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB2YWx1ZSBvZiBhIHNwZWNpZmllZCBwcm9wZXJ0eS4gSWYgdGhlIHByb3BlcnR5IGlzIG5vdCBzZXQgb3IgdGhlIHJlYWwgdmFsdWUgdHlwZSBpcyBub3QgY29tcGF0aWJsZSB3aXRoCisgICAgICogdGhlIHNwZWNpZmllZCB2YWx1ZSB0eXBlLCByZXR1cm5zIG51bGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvcGVydGllcyAgTWFwIG9mIHByb3BlcnRpZXMgdG8gZ2V0IHRoZSBwcm9wZXJ0eSB2YWx1ZSBmcm9tLgorICAgICAqIEBwYXJhbSBydW50aW1lVHlwZSBSdW50aW1lIHR5cGUgd2hpY2ggaXMgdXNlZCB0byBjaGVjayB3aGV0aGVyIHRoZXJlIGlzIGEgcHJvcGVydHkgd2l0aCB0aGUgc2FtZQorICAgICAqICAgICAgICAgICAgICAgICAgICB7QGNvZGUga2V5fSBidXQgcG9zdC1maXhlZCBieSBydW50aW1lIHR5cGUgKDx0dD4uc2VydmVyPC90dD4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgb3Ige0Bjb2RlIC5jbGllbnR9KSB3aGljaCB3b3VsZCBvdmVycmlkZSB0aGUge0Bjb2RlIGtleX0gcHJvcGVydHkuCisgICAgICogQHBhcmFtIGtleSAgICAgICAgIE5hbWUgb2YgdGhlIHByb3BlcnR5LgorICAgICAqIEBwYXJhbSB0eXBlICAgICAgICBUeXBlIHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBhcy4KKyAgICAgKiBAcGFyYW0gPFQ+ICAgICAgICAgVHlwZSBvZiB0aGUgcHJvcGVydHkgdmFsdWUuCisgICAgICogQHJldHVybiBWYWx1ZSBvZiB0aGUgcHJvcGVydHkgb3IgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUPiBUIGdldFZhbHVlKE1hcDxTdHJpbmcsID8+IHByb3BlcnRpZXMsIFJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlLCBTdHJpbmcga2V5LCBDbGFzczxUPiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBsZWdhY3lNYXApIHsKKyAgICAgICAgT2JqZWN0IHZhbHVlID0gbnVsbDsKKyAgICAgICAgaWYgKHJ1bnRpbWVUeXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBydW50aW1lQXdhcmVLZXkgPSBnZXRQcm9wZXJ0eU5hbWVGb3JSdW50aW1lKGtleSwgcnVudGltZVR5cGUpOworICAgICAgICAgICAgaWYgKGtleS5lcXVhbHMocnVudGltZUF3YXJlS2V5KSkgeworICAgICAgICAgICAgICAgIC8vIGxlZ2FjeSBiZWhhdmlvdXIKKyAgICAgICAgICAgICAgICBydW50aW1lQXdhcmVLZXkgPSBrZXkgKyAiLiIgKyBydW50aW1lVHlwZS5uYW1lKCkudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhbHVlID0gcHJvcGVydGllcy5nZXQocnVudGltZUF3YXJlS2V5KTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdmFsdWUgPSBwcm9wZXJ0aWVzLmdldChrZXkpOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICB2YWx1ZSA9IGdldExlZ2FjeUZhbGxiYWNrVmFsdWUocHJvcGVydGllcywgbGVnYWN5TWFwLCBrZXkpOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjb252ZXJ0VmFsdWUodmFsdWUsIHR5cGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgc3BlY2lmaWMgcHJvcGVydHkgdmFsdWUgZm9yIGdpdmVuIHtAbGluayBSdW50aW1lVHlwZX0uCisgICAgICoKKyAgICAgKiBTb21lIHByb3BlcnRpZXMgaGF2ZSBjb21wbGVtZW50YXJ5IGNsaWVudCBhbmQgc2VydmVyIHZlcnNpb25zIGFsb25nIHdpdGggYSBjb21tb24gdmVyc2lvbiAoZWZmZWN0aXZlIGZvciBib3RoIGVudmlyb25tZW50cywKKyAgICAgKiBpZiB0aGUgc3BlY2lmaWMgb25lIGlzIG5vdCBzZXQpLiBUaGlzIG1ldGhvZHMgcmV0dXJucyBhIHNwZWNpZmljIG5hbWUgZm9yIHRoZSBlbnZpcm9ubWVudCAoZGV0ZXJtaW5lZCBieSBjb252ZW50aW9uKSwKKyAgICAgKiBpZiBydW50aW1lIGlzIG5vdCBudWxsLCB0aGUgcHJvcGVydHkgaXMgYSBKZXJzZXkgcHJvcGVydHkgbmFtZSAoc3RhcnRzIHdpdGgge0Bjb2RlIGplcnNleS5jb25maWd9KSBhbmQgZG9lcyBub3QgY29udGFpbgorICAgICAqIGEgcnVudGltZSBzcGVjaWZpYyBwYXJ0IGFscmVhZHkuIElmIHRob3NlIGNvbmRpdGlvbnMgYXJlIG5vdCBtZXQsIG9yaWdpbmFsIHByb3BlcnR5IG5hbWUgaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5IHByb3BlcnR5IG5hbWUKKyAgICAgKiBAcGFyYW0gcnVudGltZVR5cGUgcnVudGltZSB0eXBlCisgICAgICogQHJldHVybiBydW50aW1lLXNwZWNpZmljIHByb3BlcnR5IG5hbWUsIHdoZXJlIHBvc3NpYmxlLCBvcmlnaW5hbCBrZXkgaW4gb3RoZXIgY2FzZXMuCisgICAgICogb3JpZ2luYWwga2V5CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lRm9yUnVudGltZShTdHJpbmcga2V5LCBSdW50aW1lVHlwZSBydW50aW1lVHlwZSkgeworICAgICAgICBpZiAocnVudGltZVR5cGUgIT0gbnVsbCAmJiBrZXkuc3RhcnRzV2l0aCgiamVyc2V5LmNvbmZpZyIpKSB7CisgICAgICAgICAgICBSdW50aW1lVHlwZVtdIHR5cGVzID0gUnVudGltZVR5cGUudmFsdWVzKCk7CisgICAgICAgICAgICBmb3IgKFJ1bnRpbWVUeXBlIHR5cGUgOiB0eXBlcykgeworICAgICAgICAgICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aCgiamVyc2V5LmNvbmZpZy4iICsgdHlwZS5uYW1lKCkudG9Mb3dlckNhc2UoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4ga2V5LnJlcGxhY2UoImplcnNleS5jb25maWciLCAiamVyc2V5LmNvbmZpZy4iICsgcnVudGltZVR5cGUubmFtZSgpLnRvTG93ZXJDYXNlKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBrZXk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGdldExlZ2FjeUZhbGxiYWNrVmFsdWUoTWFwPFN0cmluZywgPz4gcHJvcGVydGllcywgTWFwPFN0cmluZywgU3RyaW5nPiBsZWdhY3lGYWxsYmFja01hcCwgU3RyaW5nIGtleSkgeworICAgICAgICBpZiAobGVnYWN5RmFsbGJhY2tNYXAgPT0gbnVsbCB8fCAhbGVnYWN5RmFsbGJhY2tNYXAuY29udGFpbnNLZXkoa2V5KSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGZhbGxiYWNrS2V5ID0gbGVnYWN5RmFsbGJhY2tNYXAuZ2V0KGtleSk7CisgICAgICAgIE9iamVjdCB2YWx1ZSA9IHByb3BlcnRpZXMuZ2V0KGZhbGxiYWNrS2V5KTsKKyAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgTE9HR0VSLmlzTG9nZ2FibGUoTGV2ZWwuQ09ORklHKSkgeworICAgICAgICAgICAgTE9HR0VSLmNvbmZpZyhMb2NhbGl6YXRpb25NZXNzYWdlcy5QUk9QRVJUSUVTX0hFTFBFUl9ERVBSRUNBVEVEX1BST1BFUlRZX05BTUUoZmFsbGJhY2tLZXksIGtleSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IHtAY29kZSBPYmplY3R9IHZhbHVlIHRvIGEgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBjbGFzcyB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIHtAY29kZSBPYmplY3R9IHZhbHVlIHRvIGNvbnZlcnQuCisgICAgICogQHBhcmFtIHR5cGUgY29udmVyc2lvbiB0eXBlLgorICAgICAqIEBwYXJhbSA8VD4gY29udmVydGVkIHZhbHVlIHR5cGUuCisgICAgICogQHJldHVybiB2YWx1ZSBjb252ZXJ0ZWQgdG8gdGhlIHNwZWNpZmllZCBjbGFzcyB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFQgY29udmVydFZhbHVlKE9iamVjdCB2YWx1ZSwgQ2xhc3M8VD4gdHlwZSkgeworICAgICAgICBpZiAoIXR5cGUuaXNJbnN0YW5jZSh2YWx1ZSkpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IE1vdmUgc3RyaW5nIHZhbHVlIHJlYWRlcnMgZnJvbSBzZXJ2ZXIgdG8gY29tbW9uIGFuZCB1dGlsaXplIHRoZW0gaGVyZQorICAgICAgICAgICAgZmluYWwgQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChSZWZsZWN0aW9uSGVscGVyLmdldFN0cmluZ0NvbnN0cnVjdG9yUEEodHlwZSkpOworICAgICAgICAgICAgaWYgKGNvbnN0cnVjdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZS5jYXN0KGNvbnN0cnVjdG9yLm5ld0luc3RhbmNlKHZhbHVlKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2FsbGluZyB0aGUgY29uc3RydWN0b3Igd2Fzbid0IHN1Y2Nlc3NmdWwgLSBpZ25vcmUgYW5kIHRyeSB2YWx1ZU9mKCkKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIE1ldGhvZCB2YWx1ZU9mID0gQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoUmVmbGVjdGlvbkhlbHBlci5nZXRWYWx1ZU9mU3RyaW5nTWV0aG9kUEEodHlwZSkpOworICAgICAgICAgICAgaWYgKHZhbHVlT2YgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlLmNhc3QodmFsdWVPZi5pbnZva2UobnVsbCwgdmFsdWUpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBjYWxsaW5nIHZhbHVlT2Ygd2Fzbid0IHN1Y2Nlc3NmdWwKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGF0IHRoaXMgcG9pbnQgd2UgZG9uJ3Qga25vdyB3aGF0IHRvIHJldHVybiAtPiByZXR1cm4gbnVsbAorICAgICAgICAgICAgaWYgKExPR0dFUi5pc0xvZ2dhYmxlKExldmVsLldBUk5JTkcpKSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLndhcm5pbmcoTG9jYWxpemF0aW9uTWVzc2FnZXMuUFJPUEVSVElFU19IRUxQRVJfR0VUX1ZBTFVFX05PX1RSQU5TRk9STShTdHJpbmcudmFsdWVPZih2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5nZXRDbGFzcygpLmdldE5hbWUoKSwgdHlwZS5nZXROYW1lKCkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHlwZS5jYXN0KHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSB3aXRoIGEgZ2l2ZW4gbmFtZSBjb252ZXJ0ZWQgdG8ge0Bjb2RlIGJvb2xlYW59LiBSZXR1cm5zIHtAY29kZSBmYWxzZX0gaWYgdGhlIHZhbHVlIGlzCisgICAgICogbm90IGNvbnZlcnRpYmxlLgorICAgICAqCisgICAgICogQHBhcmFtIHByb3BlcnRpZXMga2V5LXZhbHVlIG1hcCBvZiBwcm9wZXJ0aWVzLgorICAgICAqIEBwYXJhbSBuYW1lICAgICAgIHByb3BlcnR5IG5hbWUuCisgICAgICogQHJldHVybiB7QGNvZGUgYm9vbGVhbn0gcHJvcGVydHkgdmFsdWUgb3Ige0Bjb2RlIGZhbHNlfSBpZiB0aGUgcHJvcGVydHkgaXMgbm90IGNvbnZlcnRpYmxlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Byb3BlcnR5KGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcywgZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIHByb3BlcnRpZXMuY29udGFpbnNLZXkobmFtZSkgJiYgaXNQcm9wZXJ0eShwcm9wZXJ0aWVzLmdldChuYW1lKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgY29udmVydGVkIHRvIHtAY29kZSBib29sZWFufS4gUmV0dXJucyB7QGNvZGUgZmFsc2V9IGlmIHRoZSB2YWx1ZSBpcyBub3QgY29udmVydGlibGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgcHJvcGVydHkgdmFsdWUuCisgICAgICogQHJldHVybiB7QGNvZGUgYm9vbGVhbn0gcHJvcGVydHkgdmFsdWUgb3Ige0Bjb2RlIGZhbHNlfSBpZiB0aGUgcHJvcGVydHkgaXMgbm90IGNvbnZlcnRpYmxlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Byb3BlcnR5KGZpbmFsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuKSB7CisgICAgICAgICAgICByZXR1cm4gQm9vbGVhbi5jbGFzcy5jYXN0KHZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIEJvb2xlYW4ucGFyc2VCb29sZWFuKHZhbHVlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJldmVudCBpbnN0YW50aWF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgUHJvcGVydGllc0hlbHBlcigpIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvUHJvcGVydHkuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9Qcm9wZXJ0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwOTlmYzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvUHJvcGVydHkuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWw7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworLyoqCisgKiBNYXJrZXIgYW5ub3RhdGlvbiBmb3Igc3RhdGljIGZpZWxkcyB0aGF0IHJlcHJlc2VudCBwcm9wZXJ0eSBuYW1lcy4KKyAqCisgKiBUaGlzIGFubm90YXRpb24gaXMgcHV0IG9uIHN0YXRpYyBmaWVsZHMgKHR5cGljYWxseSBpbiBjb25jcmV0ZSB7QGxpbmsgamF2YXgud3MucnMuY29yZS5GZWF0dXJlIEpBWC1SUyBGZWF0dXJlfSBjbGFzc2VzKQorICogdG8gbWFyayBhIHJlY29nbml6ZWQgcHJvcGVydHkgbmFtZS4KKyAqIDxwPgorICogSmVyc2V5IGNvZGUgc2hvdWxkIG5vdCBjb250YWluIG92ZXJsYXBwaW5nIG5vciBkdXBsaWNhdGUgcHJvcGVydHkgbmFtZXMuIFRoaXMgaXMgY2hlY2tlZCBpbiBhIGRlZGljYXRlZAorICogKEBjb2RlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnByb3BlcnR5Y2hlY2suUHJvcGVydHlPdmVybGFwcGluZ0NoZWNrVGVzdCkgdW5pdCB0ZXN0LgorICogPC9wPgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKiBAc2VlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUHJvcGVydGllc0NsYXNzCisgKiBAc2VlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUHJvcGVydHlBbGlhcworICovCitAVGFyZ2V0KEVsZW1lbnRUeXBlLkZJRUxEKQorQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK3B1YmxpYyBAaW50ZXJmYWNlIFByb3BlcnR5IHsKK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9Qcm9wZXJ0eUFsaWFzLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvUHJvcGVydHlBbGlhcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmMTE5MWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvUHJvcGVydHlBbGlhcy5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbDsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCisvKioKKyAqIE1hcmtlciBhbm5vdGF0aW9uIGZvciBzdGF0aWMgZmllbGRzIHRoYXQgcmVwcmVzZW50IHByb3BlcnR5IG5hbWUgYWxpYXNlcy4KKyAqIDxwPgorICogSmVyc2V5IGNvZGUgc2hvdWxkIG5vdCBjb250YWluIG92ZXJsYXBwaW5nIG5vciBkdXBsaWNhdGUgcHJvcGVydHkgbmFtZXMuIFRoaXMgaXMgY2hlY2tlZCBpbiBhIGRlZGljYXRlZAorICogKEBjb2RlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnByb3BlcnR5Y2hlY2suUHJvcGVydHlPdmVybGFwcGluZ0NoZWNrVGVzdCkgdW5pdCB0ZXN0LgorICogSG93ZXZlciwgc29tZXRpbWVzIGhhdmluZyBwcm9wZXJ0eSBhbGlhc2VzIGlzIHVzZWZ1bC4gSWYgdGhlIHByb3BlcnR5IG5hbWUgaXMgZXF1YWwgdG8gYW5vdGhlciBwcm9wZXJ0eSAoZnJvbSBhbm90aGVyIGZpbGUpLAorICogaXQgaGFzIHRvIGJlIG1hcmtlZCBieSB0aGlzIGFubm90YXRpb24sIG90aGVyd2lzZSB0aGUgdGVzdCB3aWxsIGZhaWwgYW5kIHByZXZlbnQgSmVyc2V5IGJ1aWxkIHRvIHN1Y2NlZWQuCisgKiA8L3A+CisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICogQHNlZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlByb3BlcnRpZXNDbGFzcworICogQHNlZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlByb3BlcnR5CisgKi8KK0BUYXJnZXQoRWxlbWVudFR5cGUuRklFTEQpCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorcHVibGljIEBpbnRlcmZhY2UgUHJvcGVydHlBbGlhcyB7Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvUmVmbGVjdGlvbkhlbHBlci5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL1JlZmxlY3Rpb25IZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmQyODBjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL1JlZmxlY3Rpb25IZWxwZXIuamF2YQpAQCAtMCwwICsxLDE1NjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFjY2Vzc2libGVPYmplY3Q7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQW5ub3RhdGVkRWxlbWVudDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5HZW5lcmljQXJyYXlUeXBlOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1lbWJlcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUGFyYW1ldGVyaXplZFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlVmFyaWFibGU7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuV2lsZGNhcmRUeXBlOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY1R5cGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Pc2dpUmVnaXN0cnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLkNsYXNzVHlwZVBhaXI7CisKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5GcmFtZXdvcmtVdGlsOworCisvKioKKyAqIFV0aWxpdHkgbWV0aG9kcyBmb3IgSmF2YSByZWZsZWN0aW9uLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBSZWZsZWN0aW9uSGVscGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFJlZmxlY3Rpb25IZWxwZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQcml2aWxlZ2VkQWN0aW9uPD8+IE5vT3BQcml2aWxlZ2VkQUNUSU9OID0gbmV3IFByaXZpbGVnZWRBY3Rpb248T2JqZWN0PigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPYmplY3QgcnVuKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogUHJldmVudHMgaW5zdGFudGlhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFJlZmxlY3Rpb25IZWxwZXIoKSB7CisgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiTm8gaW5zdGFuY2VzIGFsbG93ZWQuIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBkZWNsYXJpbmcgY2xhc3Mgb2YgYW4gYWNjZXNzaWJsZSBvYmplY3QuCisgICAgICogPHA+CisgICAgICogU3VwcG9ydGVkIGFyZSB7QGxpbmsgTWV0aG9kfSwge0BsaW5rIEZpZWxkfSBhbmQge0BsaW5rIENvbnN0cnVjdG9yfSBhY2Nlc3NpYmxlIG9iamVjdCB0eXBlcy4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gYW8gYW4gYWNjZXNzaWJsZSBvYmplY3QuCisgICAgICogQHJldHVybiB0aGUgZGVjbGFyaW5nIGNsYXNzIG9mIGFuIGFjY2Vzc2libGUgb2JqZWN0LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGluIGNhc2UgdGhlIHR5cGUgb2YgdGhlIGFjY2Vzc2libGUgb2JqZWN0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbm90IHN1cHBvcnRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENsYXNzPD8+IGdldERlY2xhcmluZ0NsYXNzKGZpbmFsIEFjY2Vzc2libGVPYmplY3QgYW8pIHsKKyAgICAgICAgaWYgKGFvIGluc3RhbmNlb2YgTWVtYmVyICYmIChhbyBpbnN0YW5jZW9mIEZpZWxkIHx8IGFvIGluc3RhbmNlb2YgTWV0aG9kIHx8IGFvIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7CisgICAgICAgICAgICByZXR1cm4gKChNZW1iZXIpIGFvKS5nZXREZWNsYXJpbmdDbGFzcygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgYWNjZXNzaWJsZSBvYmplY3QgdHlwZTogIiArIGFvLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhbiBvYmplY3QuCisgICAgICogPHA+CisgICAgICogUmV0dXJucyBhIHN0cmluZyBjb25zaXN0aW5nIG9mIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBvZiB3aGljaCB0aGUKKyAgICAgKiBvYmplY3QgaXMgYW4gaW5zdGFuY2UsIHRoZSBhdC1zaWduIGNoYXJhY3RlciB7QGNvZGUgJyYjNjQ7J30sIGFuZAorICAgICAqIHRoZSB1bnNpZ25lZCBoZXhhZGVjaW1hbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgaGFzaCBjb2RlIG9mIHRoZQorICAgICAqIG9iamVjdC4gSW4gb3RoZXIgd29yZHMsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBzdHJpbmcgZXF1YWwgdG8gdGhlCisgICAgICogdmFsdWUgb2Y6CisgICAgICogPC9wPgorICAgICAqIDxwcmU+CisgICAgICogby5nZXRDbGFzcygpLmdldE5hbWUoKSArICdAJyArIEludGVnZXIudG9IZXhTdHJpbmcoby5oYXNoQ29kZSgpKQorICAgICAqIDwvcHJlPgorICAgICAqCisgICAgICogQHBhcmFtIG8gdGhlIG9iamVjdC4KKyAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBvYmplY3RUb1N0cmluZyhmaW5hbCBPYmplY3QgbykgeworICAgICAgICBpZiAobyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gIm51bGwiOworICAgICAgICB9CisgICAgICAgIHJldHVybiBvLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgJ0AnICsgSW50ZWdlci50b0hleFN0cmluZyhvLmhhc2hDb2RlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBhIG1ldGhvZCBhbmQgYW4gaW5zdGFuY2Ugd2hvc2UKKyAgICAgKiBjbGFzcyBpbXBsZW1lbnRzIHRoZSBtZXRob2QuCisgICAgICogPHA+CisgICAgICogUmV0dXJucyBhIHN0cmluZyBjb25zaXN0aW5nIG9mIHRoZSBuYW1lIG9mIHRoZSBjbGFzcyBvZiB3aGljaCB0aGUgb2JqZWN0CisgICAgICogaXMgYW4gaW5zdGFuY2UsIHRoZSBhdC1zaWduIGNoYXJhY3RlciB7QGNvZGUgJyYjNjQ7J30sCisgICAgICogdGhlIHVuc2lnbmVkIGhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBoYXNoIGNvZGUgb2YgdGhlCisgICAgICogb2JqZWN0LCB0aGUgY2hhcmFjdGVyIHtAY29kZSAnLid9LCB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kLAorICAgICAqIHRoZSBjaGFyYWN0ZXIge0Bjb2RlICcoJ30sIHRoZSBsaXN0IG9mIG1ldGhvZCBwYXJhbWV0ZXJzLCBhbmQKKyAgICAgKiB0aGUgY2hhcmFjdGVyIHtAY29kZSAnKSd9LiBJbiBvdGhlciB3b3JkcywgdGhvc2UgbWV0aG9kIHJldHVybnMgYQorICAgICAqIHN0cmluZyBlcXVhbCB0byB0aGUgdmFsdWUgb2Y6CisgICAgICogPC9wPgorICAgICAqIDxwcmU+CisgICAgICogby5nZXRDbGFzcygpLmdldE5hbWUoKSArICdAJyArIEludGVnZXIudG9IZXhTdHJpbmcoby5oYXNoQ29kZSgpKSArCisgICAgICogICAgICAgICAnLicgKyBtLmdldE5hbWUoKSArICcoJyArICZsdDtwYXJhbWV0ZXJzJmd0OyArICcpJy48L3ByZT4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvIHRoZSBvYmplY3Qgd2hvc2UgY2xhc3MgaW1wbGVtZW50cyB7QGNvZGUgbX0uCisgICAgICogQHBhcmFtIG0gdGhlIG1ldGhvZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1ldGhvZCBhbmQgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgbWV0aG9kSW5zdGFuY2VUb1N0cmluZyhmaW5hbCBPYmplY3QgbywgZmluYWwgTWV0aG9kIG0pIHsKKyAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIHNiLmFwcGVuZChvLmdldENsYXNzKCkuZ2V0TmFtZSgpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoJ0AnKS5hcHBlbmQoSW50ZWdlci50b0hleFN0cmluZyhvLmhhc2hDb2RlKCkpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoJy4nKS5hcHBlbmQobS5nZXROYW1lKCkpLmFwcGVuZCgnKCcpOworCisgICAgICAgIGZpbmFsIENsYXNzW10gcGFyYW1zID0gbS5nZXRQYXJhbWV0ZXJUeXBlcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgc2IuYXBwZW5kKGdldFR5cGVOYW1lKHBhcmFtc1tpXSkpOworICAgICAgICAgICAgaWYgKGkgPCAocGFyYW1zLmxlbmd0aCAtIDEpKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIsIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzYi5hcHBlbmQoJyknKTsKKworICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIEphdmEgdHlwZSBvciBhcnJheSBuYW1lLgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSBjbGFzcyBpcyByZXByZXNlbnRpbmcgYW4gYXJyYXksIHRoZSB7QGNvZGUgIltdIn0gc3VmZml4IHdpbGwgYmUgYWRkZWQKKyAgICAgKiB0byB0aGUgbmFtZSBvZiB0aGUgdHlwZSBmb3IgZWFjaCBkaW1lbnNpb24gb2YgYW4gYXJyYXkuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgSmF2YSB0eXBlIChjYW4gcmVwcmVzZW50IGFuIGFycmF5KS4KKyAgICAgKiBAcmV0dXJuIEphdmEgdHlwZSBvciBhcnJheSBuYW1lLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRUeXBlTmFtZShmaW5hbCBDbGFzczw/PiB0eXBlKSB7CisgICAgICAgIGlmICh0eXBlLmlzQXJyYXkoKSkgeworICAgICAgICAgICAgQ2xhc3M8Pz4gY2wgPSB0eXBlOworICAgICAgICAgICAgaW50IGRpbWVuc2lvbnMgPSAwOworICAgICAgICAgICAgd2hpbGUgKGNsLmlzQXJyYXkoKSkgeworICAgICAgICAgICAgICAgIGRpbWVuc2lvbnMrKzsKKyAgICAgICAgICAgICAgICBjbCA9IGNsLmdldENvbXBvbmVudFR5cGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgc2IuYXBwZW5kKGNsLmdldE5hbWUoKSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpbWVuc2lvbnM7IGkrKykgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiW10iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0eXBlLmdldE5hbWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgcHJpdmlsZWdlZCBhY3Rpb24gdG8gb2J0YWluIENsYXNzIGZyb20gZ2l2ZW4gY2xhc3MgbmFtZS4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiBydW4gdXNpbmcgc2VjdXJpdHkgbWFuYWdlciwgdGhlIHJldHVybmVkIHByaXZpbGVnZWQgYWN0aW9uCisgICAgICogbXVzdCBiZSBpbnZva2VkIHdpdGhpbiBhIGRvUHJpdmlsZWdlZCBibG9jay4KKyAgICAgKiBUaGUgY29udGV4dCBjbGFzcyBsb2FkZXIgd2lsbCBiZSB1dGlsaXplZCBpZiBhY2Nlc3NpYmxlIGFuZCBub24tbnVsbC4KKyAgICAgKiBPdGhlcndpc2UgdGhlIGRlZmluaW5nIGNsYXNzIGxvYWRlciBvZiB0aGlzIGNsYXNzIHdpbGwKKyAgICAgKiBiZSB1dGlsaXplZC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gPFQ+ICBjbGFzcyB0eXBlLgorICAgICAqIEBwYXJhbSBuYW1lIGNsYXNzIG5hbWUuCisgICAgICogQHJldHVybiBwcml2aWxlZ2VkIGFjdGlvbiB0byBvYnRhaW4gZGVzaXJlZCBDbGFzcy4KKyAgICAgKiBUaGUgYWN0aW9uIGNvdWxkIHJldHVybiB7QGNvZGUgbnVsbH0gaWYgdGhlIGNsYXNzIGNhbm5vdCBiZSBmb3VuZC4KKyAgICAgKiBAc2VlIEFjY2Vzc0NvbnRyb2xsZXIjZG9Qcml2aWxlZ2VkKGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbikKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUPiBQcml2aWxlZ2VkQWN0aW9uPENsYXNzPFQ+PiBjbGFzc0Zvck5hbWVQQShmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gY2xhc3NGb3JOYW1lUEEobmFtZSwgZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBwcml2aWxlZ2VkIGFjdGlvbiB0byBvYnRhaW4gQ2xhc3MgZnJvbSBnaXZlbiBjbGFzcyBuYW1lLgorICAgICAqIElmIHJ1biB1c2luZyBzZWN1cml0eSBtYW5hZ2VyLCB0aGUgcmV0dXJuZWQgcHJpdmlsZWdlZCBhY3Rpb24KKyAgICAgKiBtdXN0IGJlIGludm9rZWQgd2l0aGluIGEgZG9Qcml2aWxlZ2VkIGJsb2NrLgorICAgICAqCisgICAgICogQHBhcmFtIDxUPiAgY2xhc3MgdHlwZS4KKyAgICAgKiBAcGFyYW0gbmFtZSBjbGFzcyBuYW1lLgorICAgICAqIEBwYXJhbSBjbCAgIGNsYXNzIGxvYWRlciB0byB1c2UsIGlmIHtAY29kZSBudWxsfSB0aGVuIHRoZSBkZWZpbmluZyBjbGFzcyBsb2FkZXIKKyAgICAgKiAgICAgICAgICAgICBvZiB0aGlzIGNsYXNzIHdpbGwgYmUgdXRpbGl6ZWQuCisgICAgICogQHJldHVybiBwcml2aWxlZ2VkIGFjdGlvbiB0byBvYnRhaW4gZGVzaXJlZCBDbGFzcy4gVGhlIGFjdGlvbiBjb3VsZCByZXR1cm4ge0Bjb2RlIG51bGx9IGlmIHRoZSBjbGFzcyBjYW5ub3QgYmUgZm91bmQuCisgICAgICogQHNlZSBBY2Nlc3NDb250cm9sbGVyI2RvUHJpdmlsZWdlZChqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb24pCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIHN0YXRpYyA8VD4gUHJpdmlsZWdlZEFjdGlvbjxDbGFzczxUPj4gY2xhc3NGb3JOYW1lUEEoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIENsYXNzTG9hZGVyIGNsKSB7CisgICAgICAgIHJldHVybiBuZXcgUHJpdmlsZWdlZEFjdGlvbjxDbGFzczxUPj4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBDbGFzczxUPiBydW4oKSB7CisgICAgICAgICAgICAgICAgaWYgKGNsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoQ2xhc3M8VD4pIENsYXNzLmZvck5hbWUobmFtZSwgZmFsc2UsIGNsKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExPR0dFUi5pc0xvZ2dhYmxlKExldmVsLkZJTkVSKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuRklORVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5hYmxlIHRvIGxvYWQgY2xhc3MgIiArIG5hbWUgKyAiIHVzaW5nIHRoZSBzdXBwbGllZCBjbGFzcyBsb2FkZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNsLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgIi4iLCBleCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChDbGFzczxUPikgQ2xhc3MuZm9yTmFtZShuYW1lKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChMT0dHRVIuaXNMb2dnYWJsZShMZXZlbC5GSU5FUikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuRklORVIsICJVbmFibGUgdG8gbG9hZCBjbGFzcyAiICsgbmFtZSArICIgdXNpbmcgdGhlIGN1cnJlbnQgY2xhc3MgbG9hZGVyLiIsIGV4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBwcml2aWxlZ2VkIGFjdGlvbiB0byBvYnRhaW4gY2xhc3MgbG9hZGVyIGZvciBnaXZlbiBjbGFzcy4KKyAgICAgKiBJZiBydW4gdXNpbmcgc2VjdXJpdHkgbWFuYWdlciwgdGhlIHJldHVybmVkIHByaXZpbGVnZWQgYWN0aW9uCisgICAgICogbXVzdCBiZSBpbnZva2VkIHdpdGhpbiBhIGRvUHJpdmlsZWdlZCBibG9jay4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGF6eiBjbGFzcyBmb3Igd2hpY2ggdG8gZ2V0IGNsYXNzIGxvYWRlci4KKyAgICAgKiBAcmV0dXJuIHByaXZpbGVnZWQgYWN0aW9uIHRvIG9idGFpbiBjbGFzcyBsb2FkZXIgZm9yIHRoZSB7QGNvZGUgY2xhenp9IGNsYXNzLgorICAgICAqIEBzZWUgQWNjZXNzQ29udHJvbGxlciNkb1ByaXZpbGVnZWQoamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUHJpdmlsZWdlZEFjdGlvbjxDbGFzc0xvYWRlcj4gZ2V0Q2xhc3NMb2FkZXJQQShmaW5hbCBDbGFzczw/PiBjbGF6eikgeworICAgICAgICByZXR1cm4gbmV3IFByaXZpbGVnZWRBY3Rpb248Q2xhc3NMb2FkZXI+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgQ2xhc3NMb2FkZXIgcnVuKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBjbGF6ei5nZXRDbGFzc0xvYWRlcigpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBwcml2aWxlZ2VkIGFjdGlvbiB0byBvYnRhaW4gZmllbGRzIGRlY2xhcmVkIG9uIGdpdmVuIGNsYXNzLgorICAgICAqIElmIHJ1biB1c2luZyBzZWN1cml0eSBtYW5hZ2VyLCB0aGUgcmV0dXJuZWQgcHJpdmlsZWdlZCBhY3Rpb24KKyAgICAgKiBtdXN0IGJlIGludm9rZWQgd2l0aGluIGEgZG9Qcml2aWxlZ2VkIGJsb2NrLgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXp6IGNsYXNzIGZvciB3aGljaCB0byBnZXQgdGhlIGRlY2xhcmVkIGZpZWxkcy4KKyAgICAgKiBAcmV0dXJuIHByaXZpbGVnZWQgYWN0aW9uIHRvIG9idGFpbiBmaWVsZHMgZGVjbGFyZWQgb24gdGhlIHtAY29kZSBjbGF6en0gY2xhc3MuCisgICAgICogQHNlZSBBY2Nlc3NDb250cm9sbGVyI2RvUHJpdmlsZWdlZChqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb24pCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBQcml2aWxlZ2VkQWN0aW9uPEZpZWxkW10+IGdldERlY2xhcmVkRmllbGRzUEEoZmluYWwgQ2xhc3M8Pz4gY2xhenopIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQcml2aWxlZ2VkQWN0aW9uPEZpZWxkW10+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgRmllbGRbXSBydW4oKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXp6LmdldERlY2xhcmVkRmllbGRzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHByaXZpbGVnZWQgYWN0aW9uIHRvIG9idGFpbiBmaWVsZHMgb24gZ2l2ZW4gY2xhc3MsIHJlY3Vyc2l2ZWx5IHRocm91Z2ggaW5oZXJpdGFuY2UgaGllcmFyY2h5LgorICAgICAqIElmIHJ1biB1c2luZyBzZWN1cml0eSBtYW5hZ2VyLCB0aGUgcmV0dXJuZWQgcHJpdmlsZWdlZCBhY3Rpb24KKyAgICAgKiBtdXN0IGJlIGludm9rZWQgd2l0aGluIGEgZG9Qcml2aWxlZ2VkIGJsb2NrLgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXp6IGNsYXNzIGZvciB3aGljaCB0byBnZXQgZmllbGRzLgorICAgICAqIEByZXR1cm4gcHJpdmlsZWdlZCBhY3Rpb24gdG8gb2J0YWluIGZpZWxkcyBkZWNsYXJlZCBvbiB0aGUge0Bjb2RlIGNsYXp6fSBjbGFzcy4KKyAgICAgKiBAc2VlIEFjY2Vzc0NvbnRyb2xsZXIjZG9Qcml2aWxlZ2VkKGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbikKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFByaXZpbGVnZWRBY3Rpb248RmllbGRbXT4gZ2V0QWxsRmllbGRzUEEoZmluYWwgQ2xhc3M8Pz4gY2xhenopIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQcml2aWxlZ2VkQWN0aW9uPEZpZWxkW10+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgRmllbGRbXSBydW4oKSB7CisgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxGaWVsZD4gZmllbGRzID0gbmV3IEFycmF5TGlzdDxGaWVsZD4oKTsKKyAgICAgICAgICAgICAgICByZWN1cnNlKGNsYXp6LCBmaWVsZHMpOworICAgICAgICAgICAgICAgIHJldHVybiBmaWVsZHMudG9BcnJheShuZXcgRmllbGRbZmllbGRzLnNpemUoKV0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIHZvaWQgcmVjdXJzZShmaW5hbCBDbGFzczw/PiBjbGF6eiwgZmluYWwgTGlzdDxGaWVsZD4gZmllbGRzKSB7CisgICAgICAgICAgICAgICAgZmllbGRzLmFkZEFsbChBcnJheXMuYXNMaXN0KGNsYXp6LmdldERlY2xhcmVkRmllbGRzKCkpKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xhenouZ2V0U3VwZXJjbGFzcygpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVjdXJzZShjbGF6ei5nZXRTdXBlcmNsYXNzKCksIGZpZWxkcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBwcml2aWxlZ2VkIGFjdGlvbiB0byBvYnRhaW4gbWV0aG9kcyBkZWNsYXJlZCBvbiBnaXZlbiBjbGFzcy4KKyAgICAgKiBJZiBydW4gdXNpbmcgc2VjdXJpdHkgbWFuYWdlciwgdGhlIHJldHVybmVkIHByaXZpbGVnZWQgYWN0aW9uCisgICAgICogbXVzdCBiZSBpbnZva2VkIHdpdGhpbiBhIGRvUHJpdmlsZWdlZCBibG9jay4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGF6eiBjbGFzcyBmb3Igd2hpY2ggdG8gZ2V0IHRoZSBkZWNsYXJlZCBtZXRob2RzLgorICAgICAqIEByZXR1cm4gcHJpdmlsZWdlZCBhY3Rpb24gdG8gb2J0YWluIG1ldGhvZHMgZGVjbGFyZWQgb24gdGhlIHtAY29kZSBjbGF6en0gY2xhc3MuCisgICAgICogQHNlZSBBY2Nlc3NDb250cm9sbGVyI2RvUHJpdmlsZWdlZChqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb24pCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBQcml2aWxlZ2VkQWN0aW9uPENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZD4+IGdldERlY2xhcmVkTWV0aG9kc1BBKGZpbmFsIENsYXNzPD8+IGNsYXp6KSB7CisgICAgICAgIHJldHVybiBuZXcgUHJpdmlsZWdlZEFjdGlvbjxDb2xsZWN0aW9uPD8gZXh0ZW5kcyBNZXRob2Q+PigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIENvbGxlY3Rpb248PyBleHRlbmRzIE1ldGhvZD4gcnVuKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KGNsYXp6LmdldERlY2xhcmVkTWV0aG9kcygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgcHJpdmlsZWdlZCBleGNlcHRpb24gYWN0aW9uIHRvIG9idGFpbiBDbGFzcyBmcm9tIGdpdmVuIGNsYXNzIG5hbWUuCisgICAgICogSWYgcnVuIHVzaW5nIHNlY3VyaXR5IG1hbmFnZXIsIHRoZSByZXR1cm5lZCBwcml2aWxlZ2VkIGV4Y2VwdGlvbiBhY3Rpb24KKyAgICAgKiBtdXN0IGJlIGludm9rZWQgd2l0aGluIGEgZG9Qcml2aWxlZ2VkIGJsb2NrLgorICAgICAqIDxwLz4KKyAgICAgKiBUaGUgYWN0dWFsIGNvbnRleHQgY2xhc3MgbG9hZGVyIHdpbGwgYmUgdXRpbGl6ZWQgaWYgYWNjZXNzaWJsZSBhbmQgbm9uLW51bGwuCisgICAgICogT3RoZXJ3aXNlIHRoZSBkZWZpbmluZyBjbGFzcyBsb2FkZXIgb2YgdGhlIGNhbGxpbmcgY2xhc3Mgd2lsbCBiZSB1dGlsaXplZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSA8VD4gIGNsYXNzIHR5cGUuCisgICAgICogQHBhcmFtIG5hbWUgY2xhc3MgbmFtZS4KKyAgICAgKiBAcmV0dXJuIHByaXZpbGVnZWQgZXhjZXB0aW9uIGFjdGlvbiB0byBvYnRhaW4gdGhlIENsYXNzLgorICAgICAqIFRoZSBhY3Rpb24gY291bGQgdGhyb3cge0BsaW5rIENsYXNzTm90Rm91bmRFeGNlcHRpb259IG9yIHJldHVybiB7QGNvZGUgbnVsbH0gaWYgdGhlIGNsYXNzIGNhbm5vdCBiZSBmb3VuZC4KKyAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gaW4gY2FzZSB0aGUgY2xhc3MgY2Fubm90IGJlIGxvYWRlZCB3aXRoIHRoZSBjb250ZXh0IGNsYXNzIGxvYWRlci4KKyAgICAgKiBAc2VlIEFjY2Vzc0NvbnRyb2xsZXIjZG9Qcml2aWxlZ2VkKGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbikKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUPiBQcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uPENsYXNzPFQ+PiBjbGFzc0Zvck5hbWVXaXRoRXhjZXB0aW9uUEVBKGZpbmFsIFN0cmluZyBuYW1lKQorICAgICAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gY2xhc3NGb3JOYW1lV2l0aEV4Y2VwdGlvblBFQShuYW1lLCBnZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHByaXZpbGVnZWQgZXhjZXB0aW9uIGFjdGlvbiB0byBvYnRhaW4gQ2xhc3MgZnJvbSBnaXZlbiBjbGFzcyBuYW1lLgorICAgICAqIElmIHJ1biB1c2luZyBzZWN1cml0eSBtYW5hZ2VyLCB0aGUgcmV0dXJuZWQgcHJpdmlsZWdlZCBleGNlcHRpb24gYWN0aW9uCisgICAgICogbXVzdCBiZSBpbnZva2VkIHdpdGhpbiBhIGRvUHJpdmlsZWdlZCBibG9jay4KKyAgICAgKgorICAgICAqIEBwYXJhbSA8VD4gIGNsYXNzIHR5cGUuCisgICAgICogQHBhcmFtIG5hbWUgY2xhc3MgbmFtZS4KKyAgICAgKiBAcGFyYW0gY2wgICBjbGFzcyBsb2FkZXIgdG8gdXNlLCBpZiB7QGNvZGUgbnVsbH0gdGhlbiB0aGUgZGVmaW5pbmcgY2xhc3MgbG9hZGVyCisgICAgICogICAgICAgICAgICAgb2YgdGhlIGNhbGxpbmcgY2xhc3Mgd2lsbCBiZSB1dGlsaXplZC4KKyAgICAgKiBAcmV0dXJuIHByaXZpbGVnZWQgZXhjZXB0aW9uIGFjdGlvbiB0byBvYnRhaW4gdGhlIENsYXNzLiBJZiB0aGUgY2xhc3MgY2Fubm90IGJlIGZvdW5kLCB0aGUgYWN0aW9uIHJldHVybnMge0Bjb2RlIG51bGx9LAorICAgICAqIG9yIHRocm93cyB7QGxpbmsgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbn0gaW4gY2FzZSB0aGUgY2xhc3MgbG9hZGVyIGhhcyBiZWVuIHNwZWNpZmllZC4KKyAgICAgKiBAdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gaW4gY2FzZSB0aGUgY2xhc3MgY2Fubm90IGJlIGxvYWRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgY2xhc3MgbG9hZGVyLgorICAgICAqIEBzZWUgQWNjZXNzQ29udHJvbGxlciNkb1ByaXZpbGVnZWQoamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uKQorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb248Q2xhc3M8VD4+IGNsYXNzRm9yTmFtZVdpdGhFeGNlcHRpb25QRUEoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIENsYXNzTG9hZGVyIGNsKQorICAgICAgICAgICAgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb248Q2xhc3M8VD4+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgQ2xhc3M8VD4gcnVuKCkgdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICAgICAgICAgIGlmIChjbCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKENsYXNzPFQ+KSBDbGFzcy5mb3JOYW1lKG5hbWUsIGZhbHNlLCBjbCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZWQgb24gcHVycG9zZQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiAoQ2xhc3M8VD4pIENsYXNzLmZvck5hbWUobmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHByaXZpbGVnZWQgYWN0aW9uIHRvIG9idGFpbiBjb250ZXh0IGNsYXNzIGxvYWRlci4KKyAgICAgKiBJZiBydW4gdXNpbmcgc2VjdXJpdHkgbWFuYWdlciwgdGhlIHJldHVybmVkIHByaXZpbGVnZWQgYWN0aW9uCisgICAgICogbXVzdCBiZSBpbnZva2VkIHdpdGhpbiBhIGRvUHJpdmlsZWdlZCBibG9jay4KKyAgICAgKgorICAgICAqIEByZXR1cm4gcHJpdmlsZWdlZCBhY3Rpb24gdG8gb2J0YWluIHRoZSBhY3R1YWwgY29udGV4dCBjbGFzcyBsb2FkZXIuIFRoZSBhY3Rpb24gY291bGQgcmV0dXJuIHtAY29kZSBudWxsfQorICAgICAqIGlmIHRoZSBjb250ZXh0IGNsYXNzIGxvYWRlciBoYXMgbm90IGJlZW4gc2V0LgorICAgICAqIEBzZWUgQWNjZXNzQ29udHJvbGxlciNkb1ByaXZpbGVnZWQoamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUHJpdmlsZWdlZEFjdGlvbjxDbGFzc0xvYWRlcj4gZ2V0Q29udGV4dENsYXNzTG9hZGVyUEEoKSB7CisgICAgICAgIHJldHVybiBuZXcgUHJpdmlsZWdlZEFjdGlvbjxDbGFzc0xvYWRlcj4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBDbGFzc0xvYWRlciBydW4oKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjb250ZXh0IGNsYXNzIGxvYWRlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGNvbnRleHQgY2xhc3MgbG9hZGVyLCBvdGhlcndpc2Uge0Bjb2RlIG51bGx9IGlmIG5vdCBzZXQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NMb2FkZXIgZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkgeworICAgICAgICByZXR1cm4gQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoZ2V0Q29udGV4dENsYXNzTG9hZGVyUEEoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHByaXZpbGVnZWQgYWN0aW9uIHRvIHNldCB0aGUgYWN0dWFsIGNvbnRleHQgY2xhc3MgbG9hZGVyLgorICAgICAqIElmIHJ1biB1c2luZyBzZWN1cml0eSBtYW5hZ2VyLCB0aGUgcmV0dXJuZWQgcHJpdmlsZWdlZCBhY3Rpb24KKyAgICAgKiBtdXN0IGJlIGludm9rZWQgd2l0aGluIGEgZG9Qcml2aWxlZ2VkIGJsb2NrLgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzTG9hZGVyIGNvbnRleHQgY2xhc3MgbG9hZGVyIHRvIGJlIHNldC4KKyAgICAgKiBAcmV0dXJuIHByaXZpbGVnZWQgYWN0aW9uIHRvIHNldCBjb250ZXh0IGNsYXNzIGxvYWRlci4KKyAgICAgKiBAc2VlIEFjY2Vzc0NvbnRyb2xsZXIjZG9Qcml2aWxlZ2VkKGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbikKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFByaXZpbGVnZWRBY3Rpb24gc2V0Q29udGV4dENsYXNzTG9hZGVyUEEoZmluYWwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQcml2aWxlZ2VkQWN0aW9uKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihjbGFzc0xvYWRlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHByaXZpbGVnZWQgYWN0aW9uIHRvIHNldCBhIG1ldGhvZCB0byBiZSBhY2Nlc3NpYmxlLgorICAgICAqIElmIHJ1biB1c2luZyBzZWN1cml0eSBtYW5hZ2VyLCB0aGUgcmV0dXJuZWQgcHJpdmlsZWdlZCBhY3Rpb24KKyAgICAgKiBtdXN0IGJlIGludm9rZWQgd2l0aGluIGEgZG9Qcml2aWxlZ2VkIGJsb2NrLgorICAgICAqCisgICAgICogQHBhcmFtIG0gbWV0aG9kIHRvIGJlIHNldCBhcyBhY2Nlc3NpYmxlLgorICAgICAqIEByZXR1cm4gcHJpdmlsZWdlZCBhY3Rpb24gdG8gc2V0IHRoZSBtZXRob2QgdG8gYmUgYWNjZXNzaWJsZS4KKyAgICAgKiBAc2VlIEFjY2Vzc0NvbnRyb2xsZXIjZG9Qcml2aWxlZ2VkKGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbikKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFByaXZpbGVnZWRBY3Rpb24gc2V0QWNjZXNzaWJsZU1ldGhvZFBBKGZpbmFsIE1ldGhvZCBtKSB7CisgICAgICAgIGlmIChNb2RpZmllci5pc1B1YmxpYyhtLmdldE1vZGlmaWVycygpKSkgeworICAgICAgICAgICAgcmV0dXJuIE5vT3BQcml2aWxlZ2VkQUNUSU9OOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ldyBQcml2aWxlZ2VkQWN0aW9uPE9iamVjdD4oKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtLmlzQWNjZXNzaWJsZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG0uc2V0QWNjZXNzaWJsZSh0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG07CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsaXN0IG9mIGNsYXNzZXMgdGhhdCByZXByZXNlbnQgdGhlIHR5cGUgYXJndW1lbnRzIG9mIGEKKyAgICAgKiB7QGxpbmsgUGFyYW1ldGVyaXplZFR5cGUgcGFyYW1ldGVyaXplZH0gaW5wdXQgdHlwZS4KKyAgICAgKiA8cC8+CisgICAgICogRm9yIGFueSBnaXZlbiBhcmd1bWVudCBpbiB0aGUgcmV0dXJuZWQgbGlzdCwgZm9sbG93aW5nIHJ1bGVzIGFwcGx5OgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+SWYgYSB0eXBlIGFyZ3VtZW50IGlzIGEgY2xhc3MgdGhlbiB0aGUgY2xhc3MgaXMgcmV0dXJuZWQuPC9saT4KKyAgICAgKiA8bGk+SWYgdGhlIHR5cGUgYXJndW1lbnQgaXMgYSBnZW5lcmljIGFycmF5IHR5cGUgYW5kIHRoZSBnZW5lcmljIGNvbXBvbmVudAorICAgICAqIHR5cGUgaXMgYSBjbGFzcyB0aGVuIGNsYXNzIG9mIHRoZSBhcnJheSBpcyByZXR1cm5lZC48L2xpPgorICAgICAqIDxsaT5JZiB0aGUgdHlwZSBhcmd1bWVudCBpcyBhIHBhcmFtZXRlcml6ZWQgdHlwZSBhbmQgaXQncyByYXcgdHlwZSBpcyBhCisgICAgICogY2xhc3MgdGhlbiB0aGF0IGNsYXNzIGlzIHJldHVybmVkLjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiBJZiB0aGUge0Bjb2RlIHR5cGV9IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBQYXJhbWV0ZXJpemVkVHlwZSBhbiBlbXB0eQorICAgICAqIGxpc3QgaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSBwYXJhbWV0ZXJpemVkIHR5cGUuCisgICAgICogQHJldHVybiB0aGUgbGlzdCBvZiBjbGFzc2VkIHJlcHJlc2VudGluZyB0aGUgYWN0dWFsIHR5cGUgYXJndW1lbnRzLiBNYXkgYmUgZW1wdHksCisgICAgICogYnV0IG1heSBuZXZlciBiZSB7QGNvZGUgbnVsbH0uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYW55IG9mIHRoZSBnZW5lcmljIHR5cGUgYXJndW1lbnRzIGlzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IGEgY2xhc3MsIG9yIGEgZ2VuZXJpYyBhcnJheSB0eXBlLCBvciB0aGUgZ2VuZXJpYyBjb21wb25lbnQgdHlwZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBnZW5lcmljIGFycmF5IHR5cGUgaXMgbm90IGNsYXNzLCBvciBub3QgYSBwYXJhbWV0ZXJpemVkIHR5cGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIGEgcmF3IHR5cGUgdGhhdCBpcyBub3QgYSBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8Q2xhc3M8Pz4+IGdldEdlbmVyaWNUeXBlQXJndW1lbnRDbGFzc2VzKGZpbmFsIFR5cGUgdHlwZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFR5cGVbXSB0eXBlcyA9IGdldFR5cGVBcmd1bWVudHModHlwZSk7CisgICAgICAgIGlmICh0eXBlcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gQXJyYXlzLnN0cmVhbSh0eXBlcykKKyAgICAgICAgICAgICAgICAgICAgIC5tYXAoKEZ1bmN0aW9uPFR5cGUsIENsYXNzPD8+PikgUmVmbGVjdGlvbkhlbHBlcjo6ZXJhc3VyZSkKKyAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbGlzdCBvZiBjbGFzcy10eXBlIHBhaXJzIHRoYXQgcmVwcmVzZW50IHRoZSB0eXBlIGFyZ3VtZW50cyBvZiBhCisgICAgICoge0BsaW5rIFBhcmFtZXRlcml6ZWRUeXBlIHBhcmFtZXRlcml6ZWR9IGlucHV0IHR5cGUuCisgICAgICogPHAvPgorICAgICAqIEZvciBhbnkgZ2l2ZW4ge0BsaW5rIENsYXNzVHlwZVBhaXIjcmF3Q2xhc3MoKSBjbGFzc30gcGFydCBvZiBlYWNoIHBhaXIKKyAgICAgKiBpbiB0aGUgcmV0dXJuZWQgbGlzdCwgZm9sbG93aW5nIHJ1bGVzIGFwcGx5OgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+SWYgYSB0eXBlIGFyZ3VtZW50IGlzIGEgY2xhc3MgdGhlbiB0aGUgY2xhc3MgaXMgcmV0dXJuZWQgYXMgcmF3IGNsYXNzLjwvbGk+CisgICAgICogPGxpPklmIHRoZSB0eXBlIGFyZ3VtZW50IGlzIGEgZ2VuZXJpYyBhcnJheSB0eXBlIGFuZCB0aGUgZ2VuZXJpYyBjb21wb25lbnQKKyAgICAgKiB0eXBlIGlzIGEgY2xhc3MgdGhlbiBjbGFzcyBvZiB0aGUgYXJyYXkgaXMgcmV0dXJuZWQgYXMgcmF3IGNsYXNzLjwvbGk+CisgICAgICogPGxpPklmIHRoZSB0eXBlIGFyZ3VtZW50IGlzIGEgcGFyYW1ldGVyaXplZCB0eXBlIGFuZCBpdCdzIHJhdyB0eXBlIGlzIGEKKyAgICAgKiBjbGFzcyB0aGVuIHRoYXQgY2xhc3MgaXMgcmV0dXJuZWQgYXMgcmF3IGNsYXNzLjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiBJZiB0aGUge0Bjb2RlIHR5cGV9IGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBQYXJhbWV0ZXJpemVkVHlwZSBhbiBlbXB0eQorICAgICAqIGxpc3QgaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSBwYXJhbWV0ZXJpemVkIHR5cGUuCisgICAgICogQHJldHVybiB0aGUgbGlzdCBvZiBjbGFzcy10eXBlIHBhaXJzIHJlcHJlc2VudGluZyB0aGUgYWN0dWFsIHR5cGUgYXJndW1lbnRzLiBNYXkgYmUgZW1wdHksIGJ1dCBtYXkgbmV2ZXIgYmUge0Bjb2RlIG51bGx9LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFueSBvZiB0aGUgZ2VuZXJpYyB0eXBlIGFyZ3VtZW50cyBpcworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdCBhIGNsYXNzLCBvciBhIGdlbmVyaWMgYXJyYXkgdHlwZSwgb3IgdGhlIGdlbmVyaWMgY29tcG9uZW50IHR5cGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgZ2VuZXJpYyBhcnJheSB0eXBlIGlzIG5vdCBjbGFzcywgb3Igbm90IGEgcGFyYW1ldGVyaXplZCB0eXBlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBhIHJhdyB0eXBlIHRoYXQgaXMgbm90IGEgY2xhc3MuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0PENsYXNzVHlwZVBhaXI+IGdldFR5cGVBcmd1bWVudEFuZENsYXNzKGZpbmFsIFR5cGUgdHlwZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFR5cGVbXSB0eXBlcyA9IGdldFR5cGVBcmd1bWVudHModHlwZSk7CisgICAgICAgIGlmICh0eXBlcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gQXJyYXlzLnN0cmVhbSh0eXBlcykKKyAgICAgICAgICAgICAgICAgICAgIC5tYXAodHlwZTEgLT4gQ2xhc3NUeXBlUGFpci5vZihlcmFzdXJlKHR5cGUxKSwgdHlwZTEpKQorICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIHR5cGUgaXMgYSBwcmltaXRpdmUgdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIHR5cGUgdG8gYmUgY2hlY2tlZC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpbiBjYXNlIHRoZSB0eXBlIHJlcHJlc2VudHMgYSBwcmltaXRpdmUgdHlwZSwgb3RoZXJ3aXNlIHJldHVybnMge0Bjb2RlIGZhbHNlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNQcmltaXRpdmUoZmluYWwgVHlwZSB0eXBlKSB7CisgICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgQ2xhc3MpIHsKKyAgICAgICAgICAgIGZpbmFsIENsYXNzIGMgPSAoQ2xhc3MpIHR5cGU7CisgICAgICAgICAgICByZXR1cm4gYy5pc1ByaW1pdGl2ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHR5cGUgYXJndW1lbnRzIGZvciBhIHBhcmFtZXRlcml6ZWQgdHlwZS4KKyAgICAgKiA8cC8+CisgICAgICogSW4gY2FzZSB0aGUgdHlwZSBpcyBub3QgYSB7QGxpbmsgUGFyYW1ldGVyaXplZFR5cGUgcGFyYW1ldGVyaXplZCB0eXBlfSwKKyAgICAgKiB0aGUgbWV0aG9kIHJldHVybnMge0Bjb2RlIG51bGx9LgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgcGFyYW1ldGVyaXplZCB0eXBlLgorICAgICAqIEByZXR1cm4gdHlwZSBhcmd1bWVudHMgZm9yIGEgcGFyYW1ldGVyaXplZCB0eXBlLCBvciB7QGNvZGUgbnVsbH0gaW4gY2FzZSB0aGUgaW5wdXQgdHlwZSBpcyBub3QgYSBwYXJhbWV0ZXJpemVkIHR5cGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBUeXBlW10gZ2V0VHlwZUFyZ3VtZW50cyhmaW5hbCBUeXBlIHR5cGUpIHsKKyAgICAgICAgaWYgKCEodHlwZSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRUeXBlKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gKChQYXJhbWV0ZXJpemVkVHlwZSkgdHlwZSkuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIHR5cGUgYXJndW1lbnQgYXQgcGFydGljdWxhciBpbmRleCBmb3IgYSBwYXJhbWV0ZXJpemVkIHR5cGUuCisgICAgICogPHAvPgorICAgICAqIEluIGNhc2UgdGhlIHR5cGUgaXMgbm90IGEge0BsaW5rIFBhcmFtZXRlcml6ZWRUeXBlIHBhcmFtZXRlcml6ZWQgdHlwZX0sCisgICAgICogdGhlIG1ldGhvZCByZXR1cm5zIHtAY29kZSBudWxsfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlICBwYXJhbWV0ZXJpemVkIHR5cGUuCisgICAgICogQHBhcmFtIGluZGV4IHR5cGUgcGFyYW1ldGVyIGluZGV4LgorICAgICAqIEByZXR1cm4gdHlwZSBhcmd1bWVudCBmb3IgYSBwYXJhbWV0ZXJpemVkIHR5cGUgYXQgYSBnaXZlbiBpbmRleCwgb3Ige0Bjb2RlIG51bGx9IGluIGNhc2UgdGhlIGlucHV0IHR5cGUgaXMgbm90CisgICAgICogYSBwYXJhbWV0ZXJpemVkIHR5cGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBUeXBlIGdldFR5cGVBcmd1bWVudChmaW5hbCBUeXBlIHR5cGUsIGZpbmFsIGludCBpbmRleCkgeworICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRUeXBlKSB7CisgICAgICAgICAgICBmaW5hbCBQYXJhbWV0ZXJpemVkVHlwZSBwID0gKFBhcmFtZXRlcml6ZWRUeXBlKSB0eXBlOworICAgICAgICAgICAgcmV0dXJuIGZpeChwLmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKVtpbmRleF0pOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogSkRLIDUuMCBoYXMgYSBidWcgb2YgY3JlYXRpbmcge0BsaW5rIEdlbmVyaWNBcnJheVR5cGV9IHdoZXJlIGl0IHNob3VsZG4ndC4KKyAgICAgKiBmaXggdGhhdCBtYW51YWxseSB0byB3b3JrIGFyb3VuZCB0aGUgcHJvYmxlbS4KKyAgICAgKiA8cC8+CisgICAgICogU2VlIGJ1ZyA2MjAyNzI1LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFR5cGUgZml4KGZpbmFsIFR5cGUgdCkgeworICAgICAgICBpZiAoISh0IGluc3RhbmNlb2YgR2VuZXJpY0FycmF5VHlwZSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0OworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgR2VuZXJpY0FycmF5VHlwZSBnYXQgPSAoR2VuZXJpY0FycmF5VHlwZSkgdDsKKyAgICAgICAgaWYgKGdhdC5nZXRHZW5lcmljQ29tcG9uZW50VHlwZSgpIGluc3RhbmNlb2YgQ2xhc3MpIHsKKyAgICAgICAgICAgIGZpbmFsIENsYXNzIGMgPSAoQ2xhc3MpIGdhdC5nZXRHZW5lcmljQ29tcG9uZW50VHlwZSgpOworICAgICAgICAgICAgcmV0dXJuIEFycmF5Lm5ld0luc3RhbmNlKGMsIDApLmdldENsYXNzKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRzIHRoZSBsb2dpYyBmb3Ige0BsaW5rICNlcmFzdXJlKFR5cGUpfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUeXBlVmlzaXRvcjxDbGFzcz4gZXJhc2VyID0gbmV3IFR5cGVWaXNpdG9yPENsYXNzPigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBDbGFzcyBvbkNsYXNzKGZpbmFsIENsYXNzIGNsYXp6KSB7CisgICAgICAgICAgICByZXR1cm4gY2xheno7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIENsYXNzIG9uUGFyYW1ldGVyaXplZFR5cGUoZmluYWwgUGFyYW1ldGVyaXplZFR5cGUgdHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHZpc2l0KHR5cGUuZ2V0UmF3VHlwZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQ2xhc3Mgb25HZW5lcmljQXJyYXkoZmluYWwgR2VuZXJpY0FycmF5VHlwZSB0eXBlKSB7CisgICAgICAgICAgICByZXR1cm4gQXJyYXkubmV3SW5zdGFuY2UodmlzaXQodHlwZS5nZXRHZW5lcmljQ29tcG9uZW50VHlwZSgpKSwgMCkuZ2V0Q2xhc3MoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQ2xhc3Mgb25WYXJpYWJsZShmaW5hbCBUeXBlVmFyaWFibGUgdHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHZpc2l0KHR5cGUuZ2V0Qm91bmRzKClbMF0pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBDbGFzcyBvbldpbGRjYXJkKGZpbmFsIFdpbGRjYXJkVHlwZSB0eXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdmlzaXQodHlwZS5nZXRVcHBlckJvdW5kcygpWzBdKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgUnVudGltZUV4Y2VwdGlvbiBjcmVhdGVFcnJvcihmaW5hbCBUeXBlIHR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlRZUEVfVE9fQ0xBU1NfQ09OVkVSU0lPTl9OT1RfU1VQUE9SVEVEKHR5cGUpKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHtAbGluayBDbGFzc30gcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIHR5cGUuCisgICAgICogPHAvPgorICAgICAqIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIG5vdGlvbiBvZiB0aGUgZXJhc3VyZSBpbiBKU1ItMTQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSB0eXBlIHRvIHByb3ZpZGUgdGhlIGVyYXN1cmUgZm9yLgorICAgICAqIEByZXR1cm4gdGhlIGdpdmVuIHR5cGUncyBlcmFzdXJlLgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBzdGF0aWMgPFQ+IENsYXNzPFQ+IGVyYXN1cmUoZmluYWwgVHlwZSB0eXBlKSB7CisgICAgICAgIHJldHVybiBlcmFzZXIudmlzaXQodHlwZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYge0Bjb2RlIHN1YlR5cGV9IGlzIGEgc3ViLXR5cGUgb2Yge0Bjb2RlIHN1cGVyVHlwZX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3ViVHlwZSAgIHN1Yi10eXBlIHR5cGUuCisgICAgICogQHBhcmFtIHN1cGVyVHlwZSBzdXBlci10eXBlIHR5cGUuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaW4gY2FzZSB0aGUge0Bjb2RlIHN1YlR5cGV9IGlzIGEgc3ViLXR5cGUgb2Yge0Bjb2RlIHN1cGVyVHlwZX0sCisgICAgICoge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU3ViQ2xhc3NPZihmaW5hbCBUeXBlIHN1YlR5cGUsIGZpbmFsIFR5cGUgc3VwZXJUeXBlKSB7CisgICAgICAgIHJldHVybiBlcmFzdXJlKHN1cGVyVHlwZSkuaXNBc3NpZ25hYmxlRnJvbShlcmFzdXJlKHN1YlR5cGUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgdGhlIHR5cGUgaXMgYW4gYXJyYXkgdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIHR5cGUgdG8gY2hlY2suCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaW4gY2FzZSB0aGUgdHlwZSBpcyBhbiBhcnJheSB0eXBlLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBcnJheShmaW5hbCBUeXBlIHR5cGUpIHsKKyAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBDbGFzcykgeworICAgICAgICAgICAgZmluYWwgQ2xhc3MgYyA9IChDbGFzcykgdHlwZTsKKyAgICAgICAgICAgIHJldHVybiBjLmlzQXJyYXkoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHlwZSBpbnN0YW5jZW9mIEdlbmVyaWNBcnJheVR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIHRoZSB0eXBlIGlzIGFuIGFycmF5IG9mIGEgZ2l2ZW4gY29tcG9uZW50IHR5cGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSAgICAgICAgICB0eXBlIHRvIGNoZWNrLgorICAgICAqIEBwYXJhbSBjb21wb25lbnRUeXBlIGFycmF5IGNvbXBvbmVudCB0eXBlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGluIGNhc2UgdGhlIHR5cGUgaXMgYW4gYXJyYXkgdHlwZSBvZiBhIGdpdmVuIGNvbXBvbmVudCB0eXBlLAorICAgICAqIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FycmF5T2ZUeXBlKGZpbmFsIFR5cGUgdHlwZSwgZmluYWwgQ2xhc3M8Pz4gY29tcG9uZW50VHlwZSkgeworICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIENsYXNzKSB7CisgICAgICAgICAgICBmaW5hbCBDbGFzcyBjID0gKENsYXNzKSB0eXBlOworICAgICAgICAgICAgcmV0dXJuIGMuaXNBcnJheSgpICYmIGMgIT0gYnl0ZVtdLmNsYXNzOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgR2VuZXJpY0FycmF5VHlwZSkgeworICAgICAgICAgICAgZmluYWwgVHlwZSBhcnJheUNvbXBvbmVudFR5cGUgPSAoKEdlbmVyaWNBcnJheVR5cGUpIHR5cGUpLmdldEdlbmVyaWNDb21wb25lbnRUeXBlKCk7CisgICAgICAgICAgICByZXR1cm4gYXJyYXlDb21wb25lbnRUeXBlID09IGNvbXBvbmVudFR5cGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGNvbXBvbmVudCB0eXBlIG9mIHRoZSBhcnJheS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIG11c3QgYmUgYW4gYXJyYXkuCisgICAgICogQHJldHVybiBhcnJheSBjb21wb25lbnQgdHlwZS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbiBjYXNlIHRoZSB0eXBlIGlzIG5vdCBhbiBhcnJheSB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgVHlwZSBnZXRBcnJheUNvbXBvbmVudFR5cGUoZmluYWwgVHlwZSB0eXBlKSB7CisgICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgQ2xhc3MpIHsKKyAgICAgICAgICAgIGZpbmFsIENsYXNzIGMgPSAoQ2xhc3MpIHR5cGU7CisgICAgICAgICAgICByZXR1cm4gYy5nZXRDb21wb25lbnRUeXBlKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBHZW5lcmljQXJyYXlUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gKChHZW5lcmljQXJyYXlUeXBlKSB0eXBlKS5nZXRHZW5lcmljQ29tcG9uZW50VHlwZSgpOworICAgICAgICB9CisKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBBcnJheSBjbGFzcyBvZiBjb21wb25lbnQgdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjIHRoZSBjb21wb25lbnQgY2xhc3Mgb2YgdGhlIGFycmF5CisgICAgICogQHJldHVybiB0aGUgYXJyYXkgY2xhc3MuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDbGFzczw/PiBnZXRBcnJheUZvckNvbXBvbmVudFR5cGUoZmluYWwgQ2xhc3M8Pz4gYykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgT2JqZWN0IG8gPSBBcnJheS5uZXdJbnN0YW5jZShjLCAwKTsKKyAgICAgICAgICAgIHJldHVybiBvLmdldENsYXNzKCk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHByaXZpbGVnZWQgYWN0aW9uIHRvIG9idGFpbiB0aGUgc3RhdGljIHZhbHVlT2YoU3RyaW5nICkgbWV0aG9kLgorICAgICAqIElmIHJ1biB1c2luZyBzZWN1cml0eSBtYW5hZ2VyLCB0aGUgcmV0dXJuZWQgcHJpdmlsZWdlZCBhY3Rpb24KKyAgICAgKiBtdXN0IGJlIGludm9rZWQgd2l0aGluIGEgZG9Qcml2aWxlZ2VkIGJsb2NrLgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXp6IGNsYXNzIHRvIG9idGFpbiB0aGUgbWV0aG9kLgorICAgICAqIEByZXR1cm4gcHJpdmlsZWdlZCBhY3Rpb24gdG8gZ2V0IHRoZSBtZXRob2QuCisgICAgICogVGhlIGFjdGlvbiBjb3VsZCByZXR1cm4ge0Bjb2RlIG51bGx9IGlmIHRoZSBtZXRob2QgaXMgbm90IHByZXNlbnQuCisgICAgICogQHNlZSBBY2Nlc3NDb250cm9sbGVyI2RvUHJpdmlsZWdlZChqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb24pCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIHN0YXRpYyBQcml2aWxlZ2VkQWN0aW9uPE1ldGhvZD4gZ2V0VmFsdWVPZlN0cmluZ01ldGhvZFBBKGZpbmFsIENsYXNzPD8+IGNsYXp6KSB7CisgICAgICAgIHJldHVybiBnZXRTdHJpbmdUb09iamVjdE1ldGhvZFBBKGNsYXp6LCAidmFsdWVPZiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBwcml2aWxlZ2VkIGFjdGlvbiB0byBnZXQgdGhlIHN0YXRpYyBmcm9tU3RyaW5nKFN0cmluZyApIG1ldGhvZC4KKyAgICAgKiBJZiBydW4gdXNpbmcgc2VjdXJpdHkgbWFuYWdlciwgdGhlIHJldHVybmVkIHByaXZpbGVnZWQgYWN0aW9uCisgICAgICogbXVzdCBiZSBpbnZva2VkIHdpdGhpbiBhIGRvUHJpdmlsZWdlZCBibG9jay4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGF6eiBjbGFzcyBmb3Igd2hpY2ggdG8gZ2V0IHRoZSBtZXRob2QuCisgICAgICogQHJldHVybiBwcml2aWxlZ2VkIGFjdGlvbiB0byBvYnRhaW4gdGhlIG1ldGhvZC4KKyAgICAgKiBUaGUgYWN0aW9uIGNvdWxkIHJldHVybiB7QGNvZGUgbnVsbH0gaWYgdGhlIG1ldGhvZCBpcyBub3QgcHJlc2VudC4KKyAgICAgKiBAc2VlIEFjY2Vzc0NvbnRyb2xsZXIjZG9Qcml2aWxlZ2VkKGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbikKKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgc3RhdGljIFByaXZpbGVnZWRBY3Rpb248TWV0aG9kPiBnZXRGcm9tU3RyaW5nU3RyaW5nTWV0aG9kUEEoZmluYWwgQ2xhc3M8Pz4gY2xhenopIHsKKyAgICAgICAgcmV0dXJuIGdldFN0cmluZ1RvT2JqZWN0TWV0aG9kUEEoY2xhenosICJmcm9tU3RyaW5nIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHByaXZpbGVnZWQgYWN0aW9uIHRvIGdldCB0aGUgc3RhdGljIG1ldGhvZCBvZiBnaXZlbiBuYW1lLiBJZiBydW4gdXNpbmcgc2VjdXJpdHkgbWFuYWdlciwgdGhlIHJldHVybmVkIHByaXZpbGVnZWQKKyAgICAgKiBhY3Rpb24KKyAgICAgKiBtdXN0IGJlIGludm9rZWQgd2l0aGluIGEgZG9Qcml2aWxlZ2VkIGJsb2NrLgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXp6ICAgICAgY2xhc3MgZm9yIHdoaWNoIHRvIGdldCB0aGUgbWV0aG9kLgorICAgICAqIEBwYXJhbSBtZXRob2ROYW1lIG5hbWUgb2YgdGhlIG1ldGhvZCB0byBiZSBvYnRhaW5lZC4KKyAgICAgKiBAcmV0dXJuIHByaXZpbGVnZWQgYWN0aW9uIHRvIG9idGFpbiB0aGUgbWV0aG9kLgorICAgICAqIFRoZSBhY3Rpb24gY291bGQgcmV0dXJuIHtAY29kZSBudWxsfSBpZiB0aGUgbWV0aG9kIGlzIG5vdCBwcmVzZW50LgorICAgICAqIEBzZWUgQWNjZXNzQ29udHJvbGxlciNkb1ByaXZpbGVnZWQoamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uKQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFByaXZpbGVnZWRBY3Rpb248TWV0aG9kPiBnZXRTdHJpbmdUb09iamVjdE1ldGhvZFBBKGZpbmFsIENsYXNzPD8+IGNsYXp6LCBmaW5hbCBTdHJpbmcgbWV0aG9kTmFtZSkgeworICAgICAgICByZXR1cm4gbmV3IFByaXZpbGVnZWRBY3Rpb248TWV0aG9kPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIE1ldGhvZCBydW4oKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgTWV0aG9kIG1ldGhvZCA9IGNsYXp6LmdldERlY2xhcmVkTWV0aG9kKG1ldGhvZE5hbWUsIFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChNb2RpZmllci5pc1N0YXRpYyhtZXRob2QuZ2V0TW9kaWZpZXJzKCkpICYmIG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkgPT0gY2xhenopIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXRob2Q7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIG5zbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBwcml2aWxlZ2VkIGFjdGlvbiB0byBvYnRhaW4gY29uc3RydWN0b3IgdGhhdCBoYXMgYSBzaW5nbGUgcGFyYW1ldGVyIG9mIFN0cmluZy4KKyAgICAgKiBJZiBydW4gdXNpbmcgc2VjdXJpdHkgbWFuYWdlciwgdGhlIHJldHVybmVkIHByaXZpbGVnZWQgYWN0aW9uCisgICAgICogbXVzdCBiZSBpbnZva2VkIHdpdGhpbiBhIGRvUHJpdmlsZWdlZCBibG9jay4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGF6eiBUaGUgY2xhc3MgZm9yIHdoaWNoIHRvIG9idGFpbiB0aGUgY29uc3RydWN0b3IuCisgICAgICogQHJldHVybiBwcml2aWxlZ2VkIGFjdGlvbiB0byBvYnRhaW4gdGhlIGNvbnN0cnVjdG9yLgorICAgICAqIFRoZSBhY3Rpb24gY291bGQgcmV0dXJuIHtAY29kZSBudWxsfSBpZiB0aGUgY29uc3RydWN0b3IgaXMgbm90IHByZXNlbnQuCisgICAgICogQHNlZSBBY2Nlc3NDb250cm9sbGVyI2RvUHJpdmlsZWdlZChqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb24pCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBQcml2aWxlZ2VkQWN0aW9uPENvbnN0cnVjdG9yPiBnZXRTdHJpbmdDb25zdHJ1Y3RvclBBKGZpbmFsIENsYXNzPD8+IGNsYXp6KSB7CisgICAgICAgIHJldHVybiBuZXcgUHJpdmlsZWdlZEFjdGlvbjxDb25zdHJ1Y3Rvcj4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBDb25zdHJ1Y3RvciBydW4oKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXp6LmdldENvbnN0cnVjdG9yKFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgU2VjdXJpdHlFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgcHJpdmlsZWdlZCBhY3Rpb24gdG8gb2J0YWluIGRlY2xhcmVkIGNvbnN0cnVjdG9ycyBvZiBnaXZlbiBjbGFzcy4KKyAgICAgKiBJZiBydW4gdXNpbmcgc2VjdXJpdHkgbWFuYWdlciwgdGhlIHJldHVybmVkIHByaXZpbGVnZWQgYWN0aW9uCisgICAgICogbXVzdCBiZSBpbnZva2VkIHdpdGhpbiBhIGRvUHJpdmlsZWdlZCBibG9jay4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGF6eiBUaGUgY2xhc3MgZm9yIHdoaWNoIHRvIG9idGFpbiB0aGUgY29uc3RydWN0b3JzLgorICAgICAqIEByZXR1cm4gcHJpdmlsZWdlZCBhY3Rpb24gdG8gb2J0YWluIHRoZSBhcnJheSBvZiBjb25zdHJ1Y3RvcnMuCisgICAgICogQHNlZSBBY2Nlc3NDb250cm9sbGVyI2RvUHJpdmlsZWdlZChqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb24pCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBQcml2aWxlZ2VkQWN0aW9uPENvbnN0cnVjdG9yPD8+W10+IGdldERlY2xhcmVkQ29uc3RydWN0b3JzUEEoZmluYWwgQ2xhc3M8Pz4gY2xhenopIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQcml2aWxlZ2VkQWN0aW9uPENvbnN0cnVjdG9yPD8+W10+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgQ29uc3RydWN0b3I8Pz5bXSBydW4oKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXp6LmdldERlY2xhcmVkQ29uc3RydWN0b3JzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHByaXZpbGVnZWQgYWN0aW9uIHRvIG9idGFpbiBkZWNsYXJlZCBjb25zdHJ1Y3RvciBvZiBnaXZlbiBjbGFzcyB3aXRoIGdpdmVuIHBhcmFtZXRlcnMuCisgICAgICogSWYgcnVuIHVzaW5nIHNlY3VyaXR5IG1hbmFnZXIsIHRoZSByZXR1cm5lZCBwcml2aWxlZ2VkIGFjdGlvbiBtdXN0IGJlIGludm9rZWQgd2l0aGluIGEgZG9Qcml2aWxlZ2VkIGJsb2NrLgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXp6ICBUaGUgY2xhc3MgZm9yIHdoaWNoIHRvIG9idGFpbiB0aGUgY29uc3RydWN0b3IuCisgICAgICogQHBhcmFtIHBhcmFtcyBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzLgorICAgICAqIEByZXR1cm4gcHJpdmlsZWdlZCBhY3Rpb24gdG8gb2J0YWluIHRoZSBjb25zdHJ1Y3RvciBvciB7QGNvZGUgbnVsbH0sIHdoZW4gY29uc3RydWN0b3Igd2l0aCBnaXZlbiBwYXJhbWV0ZXJzCisgICAgICogaXMgbm90IGZvdW5kLgorICAgICAqIEBzZWUgQWNjZXNzQ29udHJvbGxlciNkb1ByaXZpbGVnZWQoamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUHJpdmlsZWdlZEFjdGlvbjxDb25zdHJ1Y3Rvcjw/Pj4gZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvclBBKGZpbmFsIENsYXNzPD8+IGNsYXp6LCBmaW5hbCBDbGFzczw/Pi4uLiBwYXJhbXMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQcml2aWxlZ2VkQWN0aW9uPENvbnN0cnVjdG9yPD8+PigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIENvbnN0cnVjdG9yPD8+IHJ1bigpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xhenouZ2V0RGVjbGFyZWRDb25zdHJ1Y3RvcihwYXJhbXMpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGNvbGxlY3Rpb24gb2YgYWxsIGFubm90YXRpb24gdHlwZXMgYXR0YWNoZWQgdG8gYSBnaXZlbiBhbm5vdGF0ZWQgZWxlbWVudCB0aGF0IGhhdmUgdGhlIHByb3ZpZGVkIG1ldGEKKyAgICAgKiBhbm5vdGF0aW9uIGF0dGFjaGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkIGVsZW1lbnQuCisgICAgICogQHBhcmFtIG1ldGFBbm5vdGF0aW9uICAgbWV0YSBhbm5vdGF0aW9uIGF0dGFjaGVkIHRvIHRoZSBhbm5vdGF0aW9uIHR5cGVzIHdlIGFyZSBsb29raW5nIGZvciAoaWYgbnVsbCwgYW5ub3RhdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVzIG9mIGFsbCBhdHRhY2hlZCBhbm5vdGF0aW9ucyB3aWxsIGJlIHJldHVybmVkKS4KKyAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgYW5ub3RhdGlvbiB0eXBlcyB3aXRoIGEgZ2l2ZW4gbWV0YSBhbm5vdGF0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPj4gZ2V0QW5ub3RhdGlvblR5cGVzKGZpbmFsIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IG1ldGFBbm5vdGF0aW9uKSB7CisgICAgICAgIGZpbmFsIFNldDxDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4+IHJlc3VsdCA9IENvbGxlY3Rpb25zLm5ld1NldEZyb21NYXAobmV3IElkZW50aXR5SGFzaE1hcDw+KCkpOworICAgICAgICBmb3IgKGZpbmFsIEFubm90YXRpb24gYSA6IGFubm90YXRlZEVsZW1lbnQuZ2V0QW5ub3RhdGlvbnMoKSkgeworICAgICAgICAgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGFUeXBlID0gYS5hbm5vdGF0aW9uVHlwZSgpOworICAgICAgICAgICAgaWYgKG1ldGFBbm5vdGF0aW9uID09IG51bGwgfHwgYVR5cGUuZ2V0QW5ub3RhdGlvbihtZXRhQW5ub3RhdGlvbikgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoYVR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgYSBnaXZlbiBtZXRob2QgaXMge0Bjb2RlIGdldHRlcn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWV0aG9kIG1ldGhvZCB0byBiZSBleGFtaW5lZC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgbWV0aG9kIGlzIHtAY29kZSBnZXR0ZXJ9LCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNHZXR0ZXIoZmluYWwgTWV0aG9kIG1ldGhvZCkgeworICAgICAgICBpZiAobWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IDAKKyAgICAgICAgICAgICAgICAmJiBNb2RpZmllci5pc1B1YmxpYyhtZXRob2QuZ2V0TW9kaWZpZXJzKCkpKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWV0aG9kTmFtZSA9IG1ldGhvZC5nZXROYW1lKCk7CisKKyAgICAgICAgICAgIGlmIChtZXRob2ROYW1lLnN0YXJ0c1dpdGgoImdldCIpICYmIG1ldGhvZE5hbWUubGVuZ3RoKCkgPiAzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICF2b2lkLmNsYXNzLmVxdWFscyhtZXRob2QuZ2V0UmV0dXJuVHlwZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kTmFtZS5zdGFydHNXaXRoKCJpcyIpICYmIG1ldGhvZE5hbWUubGVuZ3RoKCkgPiAyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJvb2xlYW4uY2xhc3MuZXF1YWxzKG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkpIHx8IEJvb2xlYW4uY2xhc3MuZXF1YWxzKG1ldGhvZC5nZXRSZXR1cm5UeXBlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSB7QGxpbmsgamF2YXgud3MucnMuY29yZS5HZW5lcmljVHlwZSBnZW5lcmljIHR5cGV9IGluZm9ybWF0aW9uIGZvciBhIGdpdmVuCisgICAgICogSmF2YSB7QGNvZGUgaW5zdGFuY2V9LgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSBzdXBwbGllZCBpbnN0YW5jZSBpcyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgamF2YXgud3MucnMuY29yZS5HZW5lcmljRW50aXR5fSwgdGhlIGdlbmVyaWMgdHlwZQorICAgICAqIGluZm9ybWF0aW9uIHdpbGwgYmUgY29tcHV0ZWQgdXNpbmcgdGhlIHtAbGluayBqYXZheC53cy5ycy5jb3JlLkdlbmVyaWNFbnRpdHkjZ2V0VHlwZSgpfQorICAgICAqIGluZm9ybWF0aW9uLiBPdGhlcndpc2UgdGhlIHtAY29kZSBpbnN0YW5jZS5nZXRDbGFzcygpfSB3aWxsIGJlIHVzZWQuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGluc3RhbmNlIEphdmEgaW5zdGFuY2UgZm9yIHdoaWNoIHRoZSB7QGNvZGUgR2VuZXJpY1R5cGV9IGRlc2NyaXB0aW9uIHNob3VsZCBiZSBjcmVhdGVkLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIEdlbmVyaWNUeXBlfSBkZXNjcmliaW5nIHRoZSBKYXZhIHtAY29kZSBpbnN0YW5jZX0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBHZW5lcmljVHlwZSBnZW5lcmljVHlwZUZvcihmaW5hbCBPYmplY3QgaW5zdGFuY2UpIHsKKyAgICAgICAgZmluYWwgR2VuZXJpY1R5cGUgZ2VuZXJpY1R5cGU7CisgICAgICAgIGlmIChpbnN0YW5jZSBpbnN0YW5jZW9mIEdlbmVyaWNFbnRpdHkpIHsKKyAgICAgICAgICAgIGdlbmVyaWNUeXBlID0gbmV3IEdlbmVyaWNUeXBlKCgoR2VuZXJpY0VudGl0eSkgaW5zdGFuY2UpLmdldFR5cGUoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnZW5lcmljVHlwZSA9IChpbnN0YW5jZSA9PSBudWxsKSA/IG51bGwgOiBuZXcgR2VuZXJpY1R5cGUoaW5zdGFuY2UuZ2V0Q2xhc3MoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGdlbmVyaWNUeXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZSB3aGV0aGVyIGEgZ2l2ZW4gbWV0aG9kIGlzIHtAY29kZSBzZXR0ZXJ9LgorICAgICAqCisgICAgICogQHBhcmFtIG1ldGhvZCBtZXRob2QgdG8gYmUgZXhhbWluZWQuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG1ldGhvZCBpcyB7QGNvZGUgc2V0dGVyfSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzU2V0dGVyKGZpbmFsIE1ldGhvZCBtZXRob2QpIHsKKyAgICAgICAgcmV0dXJuIE1vZGlmaWVyLmlzUHVibGljKG1ldGhvZC5nZXRNb2RpZmllcnMoKSkKKyAgICAgICAgICAgICAgICAmJiB2b2lkLmNsYXNzLmVxdWFscyhtZXRob2QuZ2V0UmV0dXJuVHlwZSgpKQorICAgICAgICAgICAgICAgICYmIG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCA9PSAxCisgICAgICAgICAgICAgICAgJiYgbWV0aG9kLmdldE5hbWUoKS5zdGFydHNXaXRoKCJzZXQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmUgcHJvcGVydHkgKGZpZWxkKSBuYW1lIGZyb20gZ2l2ZW4gZ2V0dGVyL3NldHRlciBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWV0aG9kIG1ldGhvZCB0byBiZSBleGFtaW5lZC4KKyAgICAgKiBAcmV0dXJuIHByb3BlcnR5IChmaWVsZCkgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRQcm9wZXJ0eU5hbWUoZmluYWwgTWV0aG9kIG1ldGhvZCkgeworICAgICAgICBpZiAoIWlzR2V0dGVyKG1ldGhvZCkgJiYgIWlzU2V0dGVyKG1ldGhvZCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuTUVUSE9EX05PVF9HRVRURVJfTk9SX1NFVFRFUigpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFN0cmluZyBtZXRob2ROYW1lID0gbWV0aG9kLmdldE5hbWUoKTsKKyAgICAgICAgZmluYWwgaW50IG9mZnNldCA9IG1ldGhvZE5hbWUuc3RhcnRzV2l0aCgiaXMiKSA/IDIgOiAzOworCisgICAgICAgIGZpbmFsIGNoYXJbXSBjaGFycyA9IG1ldGhvZE5hbWUudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgY2hhcnNbb2Zmc2V0XSA9IENoYXJhY3Rlci50b0xvd2VyQ2FzZShjaGFyc1tvZmZzZXRdKTsKKworICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhjaGFycywgb2Zmc2V0LCBjaGFycy5sZW5ndGggLSBvZmZzZXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZSB0aGUgbW9zdCBzcGVjaWZpYyB0eXBlIGZyb20gZ2l2ZW4gc2V0LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRyYWN0VHlwZXMgdG8gYmUgdGFrZW4gaW50byBhY2NvdW50LgorICAgICAqIEByZXR1cm4gdGhlIG1vc3Qgc3BlY2lmaWMgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENsYXNzPD8+IHRoZU1vc3RTcGVjaWZpY1R5cGVPZihmaW5hbCBTZXQ8VHlwZT4gY29udHJhY3RUeXBlcykgeworICAgICAgICBDbGFzczw/PiByZXN1bHQgPSBudWxsOworICAgICAgICBmb3IgKGZpbmFsIFR5cGUgdCA6IGNvbnRyYWN0VHlwZXMpIHsKKyAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IG5leHQgPSAoQ2xhc3M8Pz4pIHQ7CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXh0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmlzQXNzaWduYWJsZUZyb20obmV4dCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV4dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHR1cGxlIGNvbnNpc3Rpbmcgb2YgYSBjb25jcmV0ZSBjbGFzcyBhbmQgYSBkZWNsYXJpbmcgY2xhc3MgdGhhdCBkZWNsYXJlcyBhCisgICAgICogZ2VuZXJpYyBpbnRlcmZhY2UgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERlY2xhcmluZ0NsYXNzSW50ZXJmYWNlUGFpciB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbmNyZXRlIGNsYXNzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGZpbmFsIENsYXNzPD8+IGNvbmNyZXRlQ2xhc3M7CisgICAgICAgIC8qKgorICAgICAgICAgKiBEZWNsYXJpbmcgY2xhc3MuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgZmluYWwgQ2xhc3M8Pz4gZGVjbGFyaW5nQ2xhc3M7CisgICAgICAgIC8qKgorICAgICAgICAgKiBHZW5lcmljIGludGVyZmFjZSB0eXBlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGZpbmFsIFR5cGUgZ2VuZXJpY0ludGVyZmFjZTsKKworICAgICAgICBwcml2YXRlIERlY2xhcmluZ0NsYXNzSW50ZXJmYWNlUGFpcihmaW5hbCBDbGFzczw/PiBjb25jcmV0ZUNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiBkZWNsYXJpbmdDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVHlwZSBnZW5lcmljSW50ZXJmYWNlKSB7CisgICAgICAgICAgICB0aGlzLmNvbmNyZXRlQ2xhc3MgPSBjb25jcmV0ZUNsYXNzOworICAgICAgICAgICAgdGhpcy5kZWNsYXJpbmdDbGFzcyA9IGRlY2xhcmluZ0NsYXNzOworICAgICAgICAgICAgdGhpcy5nZW5lcmljSW50ZXJmYWNlID0gZ2VuZXJpY0ludGVyZmFjZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcGFyYW1ldGVyaXplZCBjbGFzcyBhcmd1bWVudHMgZm9yIGEgZGVjbGFyaW5nIGNsYXNzIHRoYXQKKyAgICAgKiBkZWNsYXJlcyBhIGdlbmVyaWMgaW50ZXJmYWNlIHR5cGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcCB0aGUgZGVjbGFyaW5nIGNsYXNzCisgICAgICogQHJldHVybiB0aGUgcGFyYW1ldGVyaXplZCBjbGFzcyBhcmd1bWVudHMsIG9yIG51bGwgaWYgdGhlIGdlbmVyaWMKKyAgICAgKiBpbnRlcmZhY2UgdHlwZSBpcyBub3QgYSBwYXJhbWV0ZXJpemVkIHR5cGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDbGFzc1tdIGdldFBhcmFtZXRlcml6ZWRDbGFzc0FyZ3VtZW50cyhmaW5hbCBEZWNsYXJpbmdDbGFzc0ludGVyZmFjZVBhaXIgcCkgeworICAgICAgICBpZiAocC5nZW5lcmljSW50ZXJmYWNlIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFR5cGUpIHsKKyAgICAgICAgICAgIFBhcmFtZXRlcml6ZWRUeXBlIHB0ID0gKFBhcmFtZXRlcml6ZWRUeXBlKSBwLmdlbmVyaWNJbnRlcmZhY2U7CisgICAgICAgICAgICBmaW5hbCBUeXBlW10gYXMgPSBwdC5nZXRBY3R1YWxUeXBlQXJndW1lbnRzKCk7CisgICAgICAgICAgICBmaW5hbCBDbGFzc1tdIGNhcyA9IG5ldyBDbGFzc1thcy5sZW5ndGhdOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZmluYWwgVHlwZSBhID0gYXNbaV07CisgICAgICAgICAgICAgICAgaWYgKGEgaW5zdGFuY2VvZiBDbGFzcykgeworICAgICAgICAgICAgICAgICAgICBjYXNbaV0gPSAoQ2xhc3MpIGE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgcHQgPSAoUGFyYW1ldGVyaXplZFR5cGUpIGE7CisgICAgICAgICAgICAgICAgICAgIGNhc1tpXSA9IChDbGFzcykgcHQuZ2V0UmF3VHlwZSgpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYSBpbnN0YW5jZW9mIFR5cGVWYXJpYWJsZSkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlVmFyaWFibGUgdHYgPSAoVHlwZVZhcmlhYmxlKSBhOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzc1R5cGVQYWlyIGN0cCA9IHJlc29sdmVUeXBlVmFyaWFibGUocC5jb25jcmV0ZUNsYXNzLCBwLmRlY2xhcmluZ0NsYXNzLCB0dik7CisgICAgICAgICAgICAgICAgICAgIGNhc1tpXSA9IChjdHAgIT0gbnVsbCkgPyBjdHAucmF3Q2xhc3MoKSA6IChDbGFzczw/PikgKHR2LmdldEJvdW5kcygpWzBdKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGEgaW5zdGFuY2VvZiBHZW5lcmljQXJyYXlUeXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIEdlbmVyaWNBcnJheVR5cGUgZ2F0ID0gKEdlbmVyaWNBcnJheVR5cGUpIGE7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFR5cGUgdCA9IGdhdC5nZXRHZW5lcmljQ29tcG9uZW50VHlwZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAodCBpbnN0YW5jZW9mIENsYXNzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNbaV0gPSBnZXRBcnJheUZvckNvbXBvbmVudFR5cGUoKENsYXNzPD8+KSB0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjYXM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcGFyYW1ldGVyaXplZCB0eXBlIGFyZ3VtZW50cyBmb3IgYSBkZWNsYXJpbmcgY2xhc3MgdGhhdAorICAgICAqIGRlY2xhcmVzIGEgZ2VuZXJpYyBpbnRlcmZhY2UgdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwIHRoZSBkZWNsYXJpbmcgY2xhc3MKKyAgICAgKiBAcmV0dXJuIHRoZSBwYXJhbWV0ZXJpemVkIHR5cGUgYXJndW1lbnRzLCBvciBudWxsIGlmIHRoZSBnZW5lcmljCisgICAgICogaW50ZXJmYWNlIHR5cGUgaXMgbm90IGEgcGFyYW1ldGVyaXplZCB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgVHlwZVtdIGdldFBhcmFtZXRlcml6ZWRUeXBlQXJndW1lbnRzKGZpbmFsIERlY2xhcmluZ0NsYXNzSW50ZXJmYWNlUGFpciBwKSB7CisgICAgICAgIGlmIChwLmdlbmVyaWNJbnRlcmZhY2UgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkVHlwZSkgeworICAgICAgICAgICAgZmluYWwgUGFyYW1ldGVyaXplZFR5cGUgcHQgPSAoUGFyYW1ldGVyaXplZFR5cGUpIHAuZ2VuZXJpY0ludGVyZmFjZTsKKyAgICAgICAgICAgIGZpbmFsIFR5cGVbXSBhcyA9IHB0LmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKTsKKyAgICAgICAgICAgIGZpbmFsIFR5cGVbXSByYXMgPSBuZXcgVHlwZVthcy5sZW5ndGhdOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZmluYWwgVHlwZSBhID0gYXNbaV07CisgICAgICAgICAgICAgICAgaWYgKGEgaW5zdGFuY2VvZiBDbGFzcykgeworICAgICAgICAgICAgICAgICAgICByYXNbaV0gPSBhOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRUeXBlKSB7CisgICAgICAgICAgICAgICAgICAgIHJhc1tpXSA9IGE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhIGluc3RhbmNlb2YgVHlwZVZhcmlhYmxlKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzVHlwZVBhaXIgY3RwID0gcmVzb2x2ZVR5cGVWYXJpYWJsZShwLmNvbmNyZXRlQ2xhc3MsIHAuZGVjbGFyaW5nQ2xhc3MsIChUeXBlVmFyaWFibGUpIGEpOworICAgICAgICAgICAgICAgICAgICBpZiAoY3RwID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX1JFU09MVklOR19HRU5FUklDX1RZUEVfVkFMVUUocC5nZW5lcmljSW50ZXJmYWNlLCBwLmNvbmNyZXRlQ2xhc3MpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByYXNbaV0gPSBjdHAudHlwZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByYXM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmQgdGhlIGRlY2xhcmluZyBjbGFzcyB0aGF0IGltcGxlbWVudHMgb3IgZXh0ZW5kcyBhbiBpbnRlcmZhY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uY3JldGUgdGhlIGNvbmNyZXRlIGNsYXNzIHRoYW4gZGlyZWN0bHkgb3IgaW5kaXJlY3RseQorICAgICAqICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIG9yIGV4dGVuZHMgYW4gaW50ZXJmYWNlIGNsYXNzLgorICAgICAqIEBwYXJhbSBpZmFjZSAgICB0aGUgaW50ZXJmYWNlIGNsYXNzLgorICAgICAqIEByZXR1cm4gdGhlIHR1cGxlIG9mIHRoZSBkZWNsYXJpbmcgY2xhc3MgYW5kIHRoZSBnZW5lcmljIGludGVyZmFjZQorICAgICAqIHR5cGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBEZWNsYXJpbmdDbGFzc0ludGVyZmFjZVBhaXIgZ2V0Q2xhc3MoZmluYWwgQ2xhc3M8Pz4gY29uY3JldGUsIGZpbmFsIENsYXNzPD8+IGlmYWNlKSB7CisgICAgICAgIHJldHVybiBnZXRDbGFzcyhjb25jcmV0ZSwgaWZhY2UsIGNvbmNyZXRlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBEZWNsYXJpbmdDbGFzc0ludGVyZmFjZVBhaXIgZ2V0Q2xhc3MoZmluYWwgQ2xhc3M8Pz4gY29uY3JldGUsIGZpbmFsIENsYXNzPD8+IGlmYWNlLCBDbGFzczw/PiBjKSB7CisgICAgICAgIGZpbmFsIFR5cGVbXSBnaXMgPSBjLmdldEdlbmVyaWNJbnRlcmZhY2VzKCk7CisgICAgICAgIGZpbmFsIERlY2xhcmluZ0NsYXNzSW50ZXJmYWNlUGFpciBwID0gZ2V0VHlwZShjb25jcmV0ZSwgaWZhY2UsIGMsIGdpcyk7CisgICAgICAgIGlmIChwICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBwOworICAgICAgICB9CisKKyAgICAgICAgYyA9IGMuZ2V0U3VwZXJjbGFzcygpOworICAgICAgICBpZiAoYyA9PSBudWxsIHx8IGMgPT0gT2JqZWN0LmNsYXNzKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBnZXRDbGFzcyhjb25jcmV0ZSwgaWZhY2UsIGMpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIERlY2xhcmluZ0NsYXNzSW50ZXJmYWNlUGFpciBnZXRUeXBlKGZpbmFsIENsYXNzPD8+IGNvbmNyZXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IGlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVHlwZVtdIHRzKSB7CisgICAgICAgIGZvciAoZmluYWwgVHlwZSB0IDogdHMpIHsKKyAgICAgICAgICAgIGZpbmFsIERlY2xhcmluZ0NsYXNzSW50ZXJmYWNlUGFpciBwID0gZ2V0VHlwZShjb25jcmV0ZSwgaWZhY2UsIGMsIHQpOworICAgICAgICAgICAgaWYgKHAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIERlY2xhcmluZ0NsYXNzSW50ZXJmYWNlUGFpciBnZXRUeXBlKGZpbmFsIENsYXNzPD8+IGNvbmNyZXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IGlmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVHlwZSB0KSB7CisgICAgICAgIGlmICh0IGluc3RhbmNlb2YgQ2xhc3MpIHsKKyAgICAgICAgICAgIGlmICh0ID09IGlmYWNlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEZWNsYXJpbmdDbGFzc0ludGVyZmFjZVBhaXIoY29uY3JldGUsIGMsIHQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoY29uY3JldGUsIGlmYWNlLCAoQ2xhc3M8Pz4pIHQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHQgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkVHlwZSkgeworICAgICAgICAgICAgZmluYWwgUGFyYW1ldGVyaXplZFR5cGUgcHQgPSAoUGFyYW1ldGVyaXplZFR5cGUpIHQ7CisgICAgICAgICAgICBpZiAocHQuZ2V0UmF3VHlwZSgpID09IGlmYWNlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEZWNsYXJpbmdDbGFzc0ludGVyZmFjZVBhaXIoY29uY3JldGUsIGMsIHQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoY29uY3JldGUsIGlmYWNlLCAoQ2xhc3M8Pz4pIHB0LmdldFJhd1R5cGUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzb2x2ZSBnZW5lcmljIHR5cGUgcGFyYW1ldGVyKHMpIG9mIGEgcmF3IGNsYXNzIGFuZCBpdCdzIGdlbmVyaWMgdHlwZQorICAgICAqIGJhc2VkIG9uIHRoZSBjbGFzcyB0aGF0IGRlY2xhcmVzIHRoZSBnZW5lcmljIHR5cGUgcGFyYW1ldGVyKHMpIHRvIGJlIHJlc29sdmVkCisgICAgICogYW5kIGEgY29uY3JldGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGRlY2xhcmluZyBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25jcmV0ZUNsYXNzICAgICAgIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBkZWNsYXJpbmcgY2xhc3MuCisgICAgICogQHBhcmFtIGRlY2xhcmluZ0NsYXNzICAgICAgY2xhc3MgZGVjbGFyaW5nIHRoZSBnZW5lcmljIHR5cGUgcGFyYW1ldGVyKHMpIHRvIGJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZWQuCisgICAgICogQHBhcmFtIHJhd1Jlc29sdmVkVHlwZSAgICAgcmF3IGNsYXNzIG9mIHRoZSBnZW5lcmljIHR5cGUgdG8gYmUgcmVzb2x2ZWQuCisgICAgICogQHBhcmFtIGdlbmVyaWNSZXNvbHZlZFR5cGUgZ2VuZXJpYyB0eXBlIGluZm9ybWF0aW9uIG9mIHRoIHR5cGUgdG8gYmUgcmVzb2x2ZWQuCisgICAgICogQHJldHVybiBhIHBhaXIgb2YgY2xhc3MgYW5kIHRoZSBnZW5lcmljIHR5cGUgdmFsdWVzIHdpdGggdGhlIHRoZSByZXNvbHZlZAorICAgICAqIGdlbmVyaWMgcGFyYW1ldGVyIHR5cGVzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3NUeXBlUGFpciByZXNvbHZlR2VuZXJpY1R5cGUoZmluYWwgQ2xhc3MgY29uY3JldGVDbGFzcywgZmluYWwgQ2xhc3MgZGVjbGFyaW5nQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzcyByYXdSZXNvbHZlZFR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1Jlc29sdmVkVHlwZSkgeworICAgICAgICBpZiAoZ2VuZXJpY1Jlc29sdmVkVHlwZSBpbnN0YW5jZW9mIFR5cGVWYXJpYWJsZSkgeworICAgICAgICAgICAgZmluYWwgQ2xhc3NUeXBlUGFpciBjdCA9IHJlc29sdmVUeXBlVmFyaWFibGUoCisgICAgICAgICAgICAgICAgICAgIGNvbmNyZXRlQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgIGRlY2xhcmluZ0NsYXNzLAorICAgICAgICAgICAgICAgICAgICAoVHlwZVZhcmlhYmxlKSBnZW5lcmljUmVzb2x2ZWRUeXBlKTsKKworICAgICAgICAgICAgaWYgKGN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZ2VuZXJpY1Jlc29sdmVkVHlwZSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRUeXBlKSB7CisgICAgICAgICAgICBmaW5hbCBQYXJhbWV0ZXJpemVkVHlwZSBwdCA9IChQYXJhbWV0ZXJpemVkVHlwZSkgZ2VuZXJpY1Jlc29sdmVkVHlwZTsKKyAgICAgICAgICAgIGZpbmFsIFR5cGVbXSBwdHRzID0gcHQuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpOworICAgICAgICAgICAgYm9vbGVhbiBtb2RpZmllZCA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwdHRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3NUeXBlUGFpciBjdCA9CisgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlR2VuZXJpY1R5cGUoY29uY3JldGVDbGFzcywgZGVjbGFyaW5nQ2xhc3MsIChDbGFzcykgcHQuZ2V0UmF3VHlwZSgpLCBwdHRzW2ldKTsKKyAgICAgICAgICAgICAgICBpZiAoY3QudHlwZSgpICE9IHB0dHNbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgcHR0c1tpXSA9IGN0LnR5cGUoKTsKKyAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtb2RpZmllZCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFBhcmFtZXRlcml6ZWRUeXBlIHJwdCA9IG5ldyBQYXJhbWV0ZXJpemVkVHlwZSgpIHsKKworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIFR5cGVbXSBnZXRBY3R1YWxUeXBlQXJndW1lbnRzKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHB0dHMuY2xvbmUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgVHlwZSBnZXRSYXdUeXBlKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHB0LmdldFJhd1R5cGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgVHlwZSBnZXRPd25lclR5cGUoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHQuZ2V0T3duZXJUeXBlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIHJldHVybiBDbGFzc1R5cGVQYWlyLm9mKChDbGFzczw/PikgcHQuZ2V0UmF3VHlwZSgpLCBycHQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGdlbmVyaWNSZXNvbHZlZFR5cGUgaW5zdGFuY2VvZiBHZW5lcmljQXJyYXlUeXBlKSB7CisgICAgICAgICAgICBmaW5hbCBHZW5lcmljQXJyYXlUeXBlIGdhdCA9IChHZW5lcmljQXJyYXlUeXBlKSBnZW5lcmljUmVzb2x2ZWRUeXBlOworICAgICAgICAgICAgZmluYWwgQ2xhc3NUeXBlUGFpciBjdCA9CisgICAgICAgICAgICAgICAgICAgIHJlc29sdmVHZW5lcmljVHlwZShjb25jcmV0ZUNsYXNzLCBkZWNsYXJpbmdDbGFzcywgbnVsbCwgZ2F0LmdldEdlbmVyaWNDb21wb25lbnRUeXBlKCkpOworICAgICAgICAgICAgaWYgKGdhdC5nZXRHZW5lcmljQ29tcG9uZW50VHlwZSgpICE9IGN0LnR5cGUoKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzIGFjID0gUmVmbGVjdGlvbkhlbHBlci5nZXRBcnJheUZvckNvbXBvbmVudFR5cGUoY3QucmF3Q2xhc3MoKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDbGFzc1R5cGVQYWlyLm9mKGFjKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLkZJTkVTVCwgIiIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBDbGFzc1R5cGVQYWlyLm9mKHJhd1Jlc29sdmVkVHlwZSwgZ2VuZXJpY1Jlc29sdmVkVHlwZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2l2ZW4gYSB0eXBlIHZhcmlhYmxlIHJlc29sdmUgdGhlIEphdmEgY2xhc3Mgb2YgdGhhdCB2YXJpYWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjICB0aGUgY29uY3JldGUgY2xhc3MgZnJvbSB3aGljaCBhbGwgdHlwZSB2YXJpYWJsZXMgYXJlIHJlc29sdmVkLgorICAgICAqIEBwYXJhbSBkYyB0aGUgZGVjbGFyaW5nIGNsYXNzIHdoZXJlIHRoZSB0eXBlIHZhcmlhYmxlIHdhcyBkZWZpbmVkLgorICAgICAqIEBwYXJhbSB0diB0aGUgdHlwZSB2YXJpYWJsZS4KKyAgICAgKiBAcmV0dXJuIHRoZSByZXNvbHZlZCBKYXZhIGNsYXNzIGFuZCB0eXBlLCBvdGhlcndpc2UgbnVsbCBpZiB0aGUgdHlwZSB2YXJpYWJsZQorICAgICAqIGNvdWxkIG5vdCBiZSByZXNvbHZlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENsYXNzVHlwZVBhaXIgcmVzb2x2ZVR5cGVWYXJpYWJsZShmaW5hbCBDbGFzczw/PiBjLCBmaW5hbCBDbGFzczw/PiBkYywgZmluYWwgVHlwZVZhcmlhYmxlIHR2KSB7CisgICAgICAgIHJldHVybiByZXNvbHZlVHlwZVZhcmlhYmxlKGMsIGRjLCB0diwgbmV3IEhhc2hNYXA8VHlwZVZhcmlhYmxlLCBUeXBlPigpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBDbGFzc1R5cGVQYWlyIHJlc29sdmVUeXBlVmFyaWFibGUoZmluYWwgQ2xhc3M8Pz4gYywgZmluYWwgQ2xhc3M8Pz4gZGMsIGZpbmFsIFR5cGVWYXJpYWJsZSB0diwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWFwPFR5cGVWYXJpYWJsZSwgVHlwZT4gbWFwKSB7CisgICAgICAgIGZpbmFsIFR5cGVbXSBnaXMgPSBjLmdldEdlbmVyaWNJbnRlcmZhY2VzKCk7CisgICAgICAgIGZvciAoZmluYWwgVHlwZSBnaSA6IGdpcykgeworICAgICAgICAgICAgaWYgKGdpIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFR5cGUpIHsKKyAgICAgICAgICAgICAgICAvLyBwcm9jZXNzIHB0IG9mIGludGVyZmFjZQorICAgICAgICAgICAgICAgIGZpbmFsIFBhcmFtZXRlcml6ZWRUeXBlIHB0ID0gKFBhcmFtZXRlcml6ZWRUeXBlKSBnaTsKKyAgICAgICAgICAgICAgICBmaW5hbCBDbGFzc1R5cGVQYWlyIGN0cCA9IHJlc29sdmVUeXBlVmFyaWFibGUocHQsIChDbGFzczw/PikgcHQuZ2V0UmF3VHlwZSgpLCBkYywgdHYsIG1hcCk7CisgICAgICAgICAgICAgICAgaWYgKGN0cCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjdHA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZmluYWwgVHlwZSBnc2MgPSBjLmdldEdlbmVyaWNTdXBlcmNsYXNzKCk7CisgICAgICAgIGlmIChnc2MgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkVHlwZSkgeworICAgICAgICAgICAgLy8gcHJvY2VzcyBwdCBvZiBjbGFzcworICAgICAgICAgICAgZmluYWwgUGFyYW1ldGVyaXplZFR5cGUgcHQgPSAoUGFyYW1ldGVyaXplZFR5cGUpIGdzYzsKKyAgICAgICAgICAgIHJldHVybiByZXNvbHZlVHlwZVZhcmlhYmxlKHB0LCBjLmdldFN1cGVyY2xhc3MoKSwgZGMsIHR2LCBtYXApOworICAgICAgICB9IGVsc2UgaWYgKGdzYyBpbnN0YW5jZW9mIENsYXNzKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZVR5cGVWYXJpYWJsZShjLmdldFN1cGVyY2xhc3MoKSwgZGMsIHR2LCBtYXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIENsYXNzVHlwZVBhaXIgcmVzb2x2ZVR5cGVWYXJpYWJsZShQYXJhbWV0ZXJpemVkVHlwZSBwdCwgQ2xhc3M8Pz4gYywgZmluYWwgQ2xhc3M8Pz4gZGMsIGZpbmFsIFR5cGVWYXJpYWJsZSB0diwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWFwPFR5cGVWYXJpYWJsZSwgVHlwZT4gbWFwKSB7CisgICAgICAgIGZpbmFsIFR5cGVbXSB0eXBlQXJndW1lbnRzID0gcHQuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpOworCisgICAgICAgIGZpbmFsIFR5cGVWYXJpYWJsZVtdIHR5cGVQYXJhbWV0ZXJzID0gYy5nZXRUeXBlUGFyYW1ldGVycygpOworCisgICAgICAgIGZpbmFsIE1hcDxUeXBlVmFyaWFibGUsIFR5cGU+IHN1Yk1hcCA9IG5ldyBIYXNoTWFwPFR5cGVWYXJpYWJsZSwgVHlwZT4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlQXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAvLyBTdWJzdGl0dXRlIGEgdHlwZSB2YXJpYWJsZSB3aXRoIHRoZSBKYXZhIGNsYXNzCisgICAgICAgICAgICBmaW5hbCBUeXBlIHR5cGVBcmd1bWVudCA9IHR5cGVBcmd1bWVudHNbaV07CisgICAgICAgICAgICBpZiAodHlwZUFyZ3VtZW50IGluc3RhbmNlb2YgVHlwZVZhcmlhYmxlKSB7CisgICAgICAgICAgICAgICAgZmluYWwgVHlwZSB0ID0gbWFwLmdldCh0eXBlQXJndW1lbnQpOworICAgICAgICAgICAgICAgIHN1Yk1hcC5wdXQodHlwZVBhcmFtZXRlcnNbaV0sIHQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdWJNYXAucHV0KHR5cGVQYXJhbWV0ZXJzW2ldLCB0eXBlQXJndW1lbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGMgPT0gZGMpIHsKKyAgICAgICAgICAgIFR5cGUgdCA9IHN1Yk1hcC5nZXQodHYpOworICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBDbGFzcykgeworICAgICAgICAgICAgICAgIHJldHVybiBDbGFzc1R5cGVQYWlyLm9mKChDbGFzcykgdCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHQgaW5zdGFuY2VvZiBHZW5lcmljQXJyYXlUeXBlKSB7CisgICAgICAgICAgICAgICAgZmluYWwgR2VuZXJpY0FycmF5VHlwZSBnYXQgPSAoR2VuZXJpY0FycmF5VHlwZSkgdDsKKyAgICAgICAgICAgICAgICB0ID0gZ2F0LmdldEdlbmVyaWNDb21wb25lbnRUeXBlKCk7CisgICAgICAgICAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBDbGFzcykgeworICAgICAgICAgICAgICAgICAgICBjID0gKENsYXNzPD8+KSB0OworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENsYXNzVHlwZVBhaXIub2YoZ2V0QXJyYXlGb3JDb21wb25lbnRUeXBlKGMpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGlnbm9yZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZWQKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHQgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkVHlwZSkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIHJ0ID0gKChQYXJhbWV0ZXJpemVkVHlwZSkgdCkuZ2V0UmF3VHlwZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAocnQgaW5zdGFuY2VvZiBDbGFzcykgeworICAgICAgICAgICAgICAgICAgICAgICAgYyA9IChDbGFzczw/PikgcnQ7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENsYXNzVHlwZVBhaXIub2YoZ2V0QXJyYXlGb3JDb21wb25lbnRUeXBlKGMpLCBnYXQpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHQgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkVHlwZSkgeworICAgICAgICAgICAgICAgIHB0ID0gKFBhcmFtZXRlcml6ZWRUeXBlKSB0OworICAgICAgICAgICAgICAgIGlmIChwdC5nZXRSYXdUeXBlKCkgaW5zdGFuY2VvZiBDbGFzcykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ2xhc3NUeXBlUGFpci5vZigoQ2xhc3M8Pz4pIHB0LmdldFJhd1R5cGUoKSwgcHQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZVR5cGVWYXJpYWJsZShjLCBkYywgdHYsIHN1Yk1hcCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgcHJpdmlsZWdlZCBhY3Rpb24gdG8gZmluZCBhIG1ldGhvZCBvbiBhIGNsYXNzIGdpdmVuIGFuIGV4aXN0aW5nIG1ldGhvZC4KKyAgICAgKiBJZiBydW4gdXNpbmcgc2VjdXJpdHkgbWFuYWdlciwgdGhlIHJldHVybmVkIHByaXZpbGVnZWQgYWN0aW9uCisgICAgICogbXVzdCBiZSBpbnZva2VkIHdpdGhpbiBhIGRvUHJpdmlsZWdlZCBibG9jay4KKyAgICAgKiA8cC8+CisgICAgICogSWYgdGhlcmUgZXhpc3RzIGEgcHVibGljIG1ldGhvZCBvbiB0aGUgY2xhc3MgdGhhdCBoYXMgdGhlIHNhbWUgbmFtZQorICAgICAqIGFuZCBwYXJhbWV0ZXJzIGFzIHRoZSBleGlzdGluZyBtZXRob2QgdGhlbiB0aGF0IHB1YmxpYyBtZXRob2QgaXMKKyAgICAgKiByZXR1cm5lZCBmcm9tIHRoZSBhY3Rpb24uCisgICAgICogPHAvPgorICAgICAqIE90aGVyd2lzZSwgaWYgdGhlcmUgZXhpc3RzIGEgcHVibGljIG1ldGhvZCBvbiB0aGUgY2xhc3MgdGhhdCBoYXMKKyAgICAgKiB0aGUgc2FtZSBuYW1lIGFuZCB0aGUgc2FtZSBudW1iZXIgb2YgcGFyYW1ldGVycyBhcyB0aGUgZXhpc3RpbmcgbWV0aG9kLAorICAgICAqIGFuZCBlYWNoIGdlbmVyaWMgcGFyYW1ldGVyIHR5cGUsIGluIG9yZGVyLCBvZiB0aGUgcHVibGljIG1ldGhvZCBpcyBlcXVhbAorICAgICAqIHRvIHRoZSBnZW5lcmljIHBhcmFtZXRlciB0eXBlLCBpbiB0aGUgc2FtZSBvcmRlciwgb2YgdGhlIGV4aXN0aW5nIG1ldGhvZAorICAgICAqIG9yIGlzIGFuIGluc3RhbmNlIG9mIHtAbGluayBUeXBlVmFyaWFibGV9IHRoZW4gdGhhdCBwdWJsaWMgbWV0aG9kIGlzCisgICAgICogcmV0dXJuZWQgZnJvbSB0aGUgYWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGMgdGhlIGNsYXNzIHRvIHNlYXJjaCBmb3IgYSBwdWJsaWMgbWV0aG9kCisgICAgICogQHBhcmFtIG0gdGhlIG1ldGhvZCB0byBmaW5kCisgICAgICogQHJldHVybiBwcml2aWxlZ2VkIGFjdGlvbiB0byByZXR1cm4gcHVibGljIG1ldGhvZCBmb3VuZC4KKyAgICAgKiBAc2VlIEFjY2Vzc0NvbnRyb2xsZXIjZG9Qcml2aWxlZ2VkKGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbikKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFByaXZpbGVnZWRBY3Rpb248TWV0aG9kPiBmaW5kTWV0aG9kT25DbGFzc1BBKGZpbmFsIENsYXNzPD8+IGMsIGZpbmFsIE1ldGhvZCBtKSB7CisgICAgICAgIHJldHVybiBuZXcgUHJpdmlsZWdlZEFjdGlvbjxNZXRob2Q+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgTWV0aG9kIHJ1bigpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYy5nZXRNZXRob2QobS5nZXROYW1lKCksIG0uZ2V0UGFyYW1ldGVyVHlwZXMoKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIG5zbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChmaW5hbCBNZXRob2QgX20gOiBjLmdldE1ldGhvZHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9tLmdldE5hbWUoKS5lcXVhbHMobS5nZXROYW1lKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIF9tLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IG0uZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGFyZVBhcmFtZXRlclR5cGVzKG0uZ2V0R2VuZXJpY1BhcmFtZXRlclR5cGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbS5nZXRHZW5lcmljUGFyYW1ldGVyVHlwZXMoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9tOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHByaXZpbGVnZWQgYWN0aW9uIHRvIHJldHVybiBhbiBhcnJheSBjb250YWluaW5nIHtAbGluayBNZXRob2R9IG9iamVjdHMgcmVmbGVjdGluZyBhbGwKKyAgICAgKiB0aGUgcHVibGljIDxlbT5tZW1iZXI8L2VtPiBtZXRob2RzIG9mIHRoZSBzdXBwbGllZCBjbGFzcyBvciBpbnRlcmZhY2UKKyAgICAgKiBvYmplY3QsIGluY2x1ZGluZyB0aG9zZSBkZWNsYXJlZCBieSB0aGUgY2xhc3Mgb3IgaW50ZXJmYWNlIGFuZCB0aG9zZQorICAgICAqIGluaGVyaXRlZCBmcm9tIHN1cGVyY2xhc3NlcyBhbmQgc3VwZXJpbnRlcmZhY2VzLgorICAgICAqIDxwLz4KKyAgICAgKiBBcnJheSBjbGFzc2VzIHJldHVybiBhbGwgdGhlIChwdWJsaWMpIG1lbWJlciBtZXRob2RzCisgICAgICogaW5oZXJpdGVkIGZyb20gdGhlIHtAY29kZSBPYmplY3R9IGNsYXNzLiAgVGhlIGVsZW1lbnRzIGluIHRoZSBhcnJheQorICAgICAqIHJldHVybmVkIGFyZSBub3Qgc29ydGVkIGFuZCBhcmUgbm90IGluIGFueSBwYXJ0aWN1bGFyIG9yZGVyLiAgVGhpcworICAgICAqIG1ldGhvZCByZXR1cm5zIGFjdGlvbiBwcm92aWRpbmcgYW4gYXJyYXkgb2YgbGVuZ3RoIDAgaWYgdGhpcyB7QGNvZGUgQ2xhc3N9IG9iamVjdAorICAgICAqIHJlcHJlc2VudHMgYSBjbGFzcyBvciBpbnRlcmZhY2UgdGhhdCBoYXMgbm8gcHVibGljIG1lbWJlciBtZXRob2RzLCBvciBpZgorICAgICAqIHRoaXMge0Bjb2RlIENsYXNzfSBvYmplY3QgcmVwcmVzZW50cyBhIHByaW1pdGl2ZSB0eXBlIG9yIHZvaWQuCisgICAgICogPHAvPgorICAgICAqIDxwPgorICAgICAqIFRoZSBjbGFzcyBpbml0aWFsaXphdGlvbiBtZXRob2Qge0Bjb2RlIDxjbGluaXQ+fSBpcyBub3QKKyAgICAgKiBpbmNsdWRlZCBpbiB0aGUgcmV0dXJuZWQgYXJyYXkuIElmIHRoZSBjbGFzcyBkZWNsYXJlcyBtdWx0aXBsZSBwdWJsaWMKKyAgICAgKiBtZW1iZXIgbWV0aG9kcyB3aXRoIHRoZSBzYW1lIHBhcmFtZXRlciB0eXBlcywgdGhleSBhcmUgYWxsIGluY2x1ZGVkIGluCisgICAgICogdGhlIHJldHVybmVkIGFycmF5LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBTZWUgPGVtPlRoZSBKYXZhIExhbmd1YWdlIFNwZWNpZmljYXRpb248L2VtPiwgc2VjdGlvbnMgOC4yIGFuZCA4LjQuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGMgY2xhc3MgZm9yIHdoaWNoIHRoZSBtZXRob2RzIHNob3VsZCBiZSByZXR1cm5lZC4KKyAgICAgKiBAcmV0dXJuIHByaXZpbGVnZWQgYWN0aW9uIHRvIG9idGFpbiBhbiBhcnJheSBvZiB7QGNvZGUgTWV0aG9kfSBvYmplY3RzIHJlcHJlc2VudGluZyB0aGUKKyAgICAgKiBwdWJsaWMgbWV0aG9kcyBvZiB0aGUgY2xhc3MuCisgICAgICogQHNlZSBBY2Nlc3NDb250cm9sbGVyI2RvUHJpdmlsZWdlZChqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb24pCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBQcml2aWxlZ2VkQWN0aW9uPE1ldGhvZFtdPiBnZXRNZXRob2RzUEEoZmluYWwgQ2xhc3M8Pz4gYykgeworICAgICAgICByZXR1cm4gbmV3IFByaXZpbGVnZWRBY3Rpb248TWV0aG9kW10+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgTWV0aG9kW10gcnVuKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBjLmdldE1ldGhvZHMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBNZXRob2RbXSBfZ2V0TWV0aG9kcyhmaW5hbCBDbGFzczw/PiBjbGF6eikgeworICAgICAgICByZXR1cm4gQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoZ2V0TWV0aG9kc1BBKGNsYXp6KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCBhIHtAbGluayBNZXRob2QgbWV0aG9kfSB0aGF0IG92ZXJyaWRlcyB0aGUgZ2l2ZW4ge0Bjb2RlIG1ldGhvZH0gb24gdGhlIGdpdmVuIHtAbGluayBDbGFzcyBjbGFzc30uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhenogIGNsYXNzIHRvIGZpbmQgb3ZlcnJpZGluZyBtZXRob2Qgb24uCisgICAgICogQHBhcmFtIG1ldGhvZCBhbiBhYnN0cmFjdCBtZXRob2QgdG8gZmluZCBpbXBsZW1lbnRpbmcgbWV0aG9kIGZvci4KKyAgICAgKiBAcmV0dXJuIG1ldGhvZCB0aGF0IG92ZXJyaWRlcyB0aGUgZ2l2ZW4gbWV0aG9kIG9yIHRoZSBnaXZlbiBtZXRob2QgaXRzZWxmIGlmIGEgYmV0dGVyIGFsdGVybmF0aXZlIGNhbm5vdCBiZSBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE1ldGhvZCBmaW5kT3ZlcnJpZGluZ01ldGhvZE9uQ2xhc3MoZmluYWwgQ2xhc3M8Pz4gY2xhenosIGZpbmFsIE1ldGhvZCBtZXRob2QpIHsKKyAgICAgICAgZm9yIChmaW5hbCBNZXRob2QgX21ldGhvZCA6IF9nZXRNZXRob2RzKGNsYXp6KSkgeworICAgICAgICAgICAgaWYgKCFfbWV0aG9kLmlzQnJpZGdlKCkKKyAgICAgICAgICAgICAgICAgICAgJiYgIU1vZGlmaWVyLmlzQWJzdHJhY3QoX21ldGhvZC5nZXRNb2RpZmllcnMoKSkKKyAgICAgICAgICAgICAgICAgICAgJiYgX21ldGhvZC5nZXROYW1lKCkuZXF1YWxzKG1ldGhvZC5nZXROYW1lKCkpCisgICAgICAgICAgICAgICAgICAgICYmIF9tZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGggPT0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoKSB7CisKKyAgICAgICAgICAgICAgICBpZiAoY29tcGFyZVBhcmFtZXRlclR5cGVzKF9tZXRob2QuZ2V0R2VuZXJpY1BhcmFtZXRlclR5cGVzKCksIG1ldGhvZC5nZXRHZW5lcmljUGFyYW1ldGVyVHlwZXMoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9tZXRob2Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG1ldGhvZC5pc0JyaWRnZSgpIHx8IE1vZGlmaWVyLmlzQWJzdHJhY3QobWV0aG9kLmdldE1vZGlmaWVycygpKSkgeworICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5JTkZPLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5PVkVSUklESU5HX01FVEhPRF9DQU5OT1RfQkVfRk9VTkQobWV0aG9kLCBjbGF6eikpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1ldGhvZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlIGdlbmVyaWMgcGFyYW1ldGVyIHR5cGVzIG9mIHR3byBtZXRob2RzLgorICAgICAqCisgICAgICogQHBhcmFtIHRzICBnZW5lcmljIHBhcmFtZXRlciB0eXBlcyBvZiB0aGUgZmlyc3QgbWV0aG9kLgorICAgICAqIEBwYXJhbSBfdHMgZ2VuZXJpYyBwYXJhbWV0ZXIgdHlwZXMgb2YgdGhlIHNlY29uZCBtZXRob2QuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGdpdmVuIHR5cGVzIGFyZSB1bmRlcnN0b29kIHRvIGJlIGVxdWFsLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2VlICNjb21wYXJlUGFyYW1ldGVyVHlwZXMoamF2YS5sYW5nLnJlZmxlY3QuVHlwZSwgamF2YS5sYW5nLnJlZmxlY3QuVHlwZSkKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGNvbXBhcmVQYXJhbWV0ZXJUeXBlcyhmaW5hbCBUeXBlW10gdHMsIGZpbmFsIFR5cGVbXSBfdHMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKCF0c1tpXS5lcXVhbHMoX3RzW2ldKSkgeworICAgICAgICAgICAgICAgIGlmICghY29tcGFyZVBhcmFtZXRlclR5cGVzKHRzW2ldLCBfdHNbaV0pKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGFyZSByZXNwZWN0aXZlIGdlbmVyaWMgcGFyYW1ldGVyIHR5cGVzIG9mIHR3byBtZXRob2RzLgorICAgICAqCisgICAgICogQHBhcmFtIHRzICBnZW5lcmljIHBhcmFtZXRlciB0eXBlIG9mIHRoZSBmaXJzdCBtZXRob2QuCisgICAgICogQHBhcmFtIF90cyBnZW5lcmljIHBhcmFtZXRlciB0eXBlIG9mIHRoZSBzZWNvbmQgbWV0aG9kLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBnaXZlbiB0eXBlcyBhcmUgdW5kZXJzdG9vZCB0byBiZSBlcXVhbCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb21wYXJlUGFyYW1ldGVyVHlwZXMoZmluYWwgVHlwZSB0cywgZmluYWwgVHlwZSBfdHMpIHsKKyAgICAgICAgaWYgKHRzIGluc3RhbmNlb2YgQ2xhc3MpIHsKKyAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IGNsYXp6ID0gKENsYXNzPD8+KSB0czsKKworICAgICAgICAgICAgaWYgKF90cyBpbnN0YW5jZW9mIENsYXNzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICgoQ2xhc3MpIF90cykuaXNBc3NpZ25hYmxlRnJvbShjbGF6eik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKF90cyBpbnN0YW5jZW9mIFR5cGVWYXJpYWJsZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBjaGVja1R5cGVCb3VuZHMoY2xhenosICgoVHlwZVZhcmlhYmxlKSBfdHMpLmdldEJvdW5kcygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX3RzIGluc3RhbmNlb2YgVHlwZVZhcmlhYmxlOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY2hlY2tUeXBlQm91bmRzKGZpbmFsIENsYXNzIHR5cGUsIGZpbmFsIFR5cGVbXSBib3VuZHMpIHsKKyAgICAgICAgZm9yIChmaW5hbCBUeXBlIGJvdW5kIDogYm91bmRzKSB7CisgICAgICAgICAgICBpZiAoYm91bmQgaW5zdGFuY2VvZiBDbGFzcykgeworICAgICAgICAgICAgICAgIGlmICghKChDbGFzcykgYm91bmQpLmlzQXNzaWduYWJsZUZyb20odHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PiBidW5kbGVSZWZlcmVuY2VDbGFzcyA9IEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKAorICAgICAgICAgICAgY2xhc3NGb3JOYW1lUEEoIm9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVSZWZlcmVuY2UiLCBudWxsKSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIHtAbGluayBPc2dpUmVnaXN0cnl9IGluc3RhbmNlLgorICAgICAqCisgICAgICogQHJldHVybiBhbiB7QGxpbmsgT3NnaVJlZ2lzdHJ5fSBpbnN0YW5jZSBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIGNsYXNzIGNhbm5vdCBiZSBpbnN0YW50aWF0ZWQgKG5vdCBpbiBPU0dpIGVudmlyb25tZW50KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9zZ2lSZWdpc3RyeSBnZXRPc2dpUmVnaXN0cnlJbnN0YW5jZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChidW5kbGVSZWZlcmVuY2VDbGFzcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9zZ2lSZWdpc3RyeS5nZXRJbnN0YW5jZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gRG8gbm90aGluZyAtIGluc3RhbmNlIGlzIG51bGwuCisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb29rdXAgcmVzb3VyY2UgYnkgZ2l2ZW4gbmFtZS4gSWYgT1NHaSBydW50aW1lIGlzIGRldGVjdGVkIGFuZCB0aGUgb3JpZ2luQ2xhc3MgcGFyYW1ldGVyIGlzIG5vdCBudWxsLAorICAgICAqIGFuIGF0dGVtcHQgd2lsbCBiZSBtYWRlIHRvIGdldCB0aGUgcmVzb3VyY2UgaW5wdXQgc3RyZWFtIHZpYSBPU0dpIEFQSSBmcm9tIHRoZSBidW5kbGUgd2hlcmUgb3JpZ2luQ2xhc3MgaXMgaW5jbHVkZWQuCisgICAgICogT3RoZXJ3aXNlIChub24gT1NHaSBlbnZpcm9ubWVudCkgb3IgaWYgT1NHaSBmYWlscyB0byBwcm92aWRlIHRoZSBpbnB1dCBzdHJlYW0sIHRoZSByZXR1cm4gdmFsdWUKKyAgICAgKiB3aWxsIGJlIHRha2VuIGZyb20gdGhlIHByb3ZpZGVkIGxvYWRlciBnZXRSZXNvdXJjZUFzU3RyZWFtIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2FkZXIgICAgICBjbGFzcyBsb2FkZXIgd2hlcmUgdG8gbG9va3VwIHRoZSByZXNvdXJjZSBpbiBub24tT1NHaSBlbnZpcm9ubWVudCBvciBpZiBPU0dpIG1lYW5zIGZhaWwuCisgICAgICogQHBhcmFtIG9yaWdpbkNsYXNzIGlmIG5vdCBudWxsLCBhbmQgT1NHaSBlbnZpcm9ubWVudCBpcyBkZXRlY3RlZCwgdGhlIHJlc291cmNlIHdpbGwgYmUgdGFrZW4gZnJvbSB0aGUgYnVuZGxlIGluY2x1ZGluZworICAgICAqICAgICAgICAgICAgICAgICAgICB0aGUgb3JpZ2luQ2xhc3MgdHlwZS4KKyAgICAgKiBAcGFyYW0gbmFtZSAgICAgICAgZmlsZW5hbWUgb2YgdGhlIGRlc2lyZWQgcmVzb3VyY2UuCisgICAgICogQHJldHVybiBhbiBpbnB1dCBzdHJlYW0gY29ycmVzcG9uZGluZyB0byB0aGUgcmVxdWlyZWQgcmVzb3VyY2Ugb3IgbnVsbCBpZiB0aGUgcmVzb3VyY2UgY291bGQgbm90IGJlIGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgSW5wdXRTdHJlYW0gZ2V0UmVzb3VyY2VBc1N0cmVhbShmaW5hbCBDbGFzc0xvYWRlciBsb2FkZXIsIGZpbmFsIENsYXNzPD8+IG9yaWdpbkNsYXNzLCBmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGJ1bmRsZVJlZmVyZW5jZUNsYXNzICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgJiYgb3JpZ2luQ2xhc3MgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAmJiBidW5kbGVSZWZlcmVuY2VDbGFzcy5pc0luc3RhbmNlKFJlZmxlY3Rpb25IZWxwZXIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBCdW5kbGUgYnVuZGxlID0gRnJhbWV3b3JrVXRpbC5nZXRCdW5kbGUob3JpZ2luQ2xhc3MpOworICAgICAgICAgICAgICAgIGZpbmFsIFVSTCByZXNvdXJjZVVybCA9IChidW5kbGUgIT0gbnVsbCkgPyBidW5kbGUuZ2V0RW50cnkobmFtZSkgOiBudWxsOworICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZVVybCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvdXJjZVVybC5vcGVuU3RyZWFtKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxvYWRlci5nZXRSZXNvdXJjZUFzU3RyZWFtKG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdpdmVuIHRoZSB0eXBlIHBhcmFtZXRlciBnZXRzIHRoZSByYXcgdHlwZSByZXByZXNlbnRlZCBieSB0aGUgdHlwZSwgb3IgbnVsbCBpZiB0aGlzIGhhcyBubyBhc3NvY2lhdGVkIHJhdyBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIHRvIGZpbmQgdGhlIHJhdyBjbGFzcyBvbi4KKyAgICAgKiBAcmV0dXJuIHRoZSByYXcgY2xhc3MgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENsYXNzPD8+IGdldFJhd0NsYXNzKFR5cGUgdHlwZSkgeworICAgICAgICBpZiAodHlwZSA9PSBudWxsKSByZXR1cm4gbnVsbDsKKworICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIEdlbmVyaWNBcnJheVR5cGUpIHsKKyAgICAgICAgICAgIFR5cGUgY29tcG9uZW50VHlwZSA9ICgoR2VuZXJpY0FycmF5VHlwZSkgdHlwZSkuZ2V0R2VuZXJpY0NvbXBvbmVudFR5cGUoKTsKKworICAgICAgICAgICAgaWYgKCEoY29tcG9uZW50VHlwZSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRUeXBlKSAmJiAhKGNvbXBvbmVudFR5cGUgaW5zdGFuY2VvZiBDbGFzcykpIHsKKyAgICAgICAgICAgICAgICAvLyB0eXBlIHZhcmlhYmxlIGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ2xhc3M8Pz4gcmF3Q29tcG9uZW50Q2xhc3MgPSBnZXRSYXdDbGFzcyhjb21wb25lbnRUeXBlKTsKKworICAgICAgICAgICAgU3RyaW5nIGZvck5hbWVOYW1lID0gIltMIiArIHJhd0NvbXBvbmVudENsYXNzLmdldE5hbWUoKSArICI7IjsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUoZm9yTmFtZU5hbWUpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHRoKSB7CisgICAgICAgICAgICAgICAgLy8gaWdub3JlLCBidXQgcmV0dXJuIG51bGwKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgQ2xhc3MpIHsKKyAgICAgICAgICAgIHJldHVybiAoQ2xhc3M8Pz4pIHR5cGU7CisgICAgICAgIH0KKworICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRUeXBlKSB7CisgICAgICAgICAgICBUeXBlIHJhd1R5cGUgPSAoKFBhcmFtZXRlcml6ZWRUeXBlKSB0eXBlKS5nZXRSYXdUeXBlKCk7CisgICAgICAgICAgICBpZiAocmF3VHlwZSBpbnN0YW5jZW9mIENsYXNzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChDbGFzczw/PikgcmF3VHlwZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9TYXhIZWxwZXIuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9TYXhIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjI4NmFkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL1NheEhlbHBlci5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbDsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKKworLyoqCisgKiBDb21tb24gaGVscGVyIG1ldGhvZHMgZm9yIFNBWCBwYXJzZXJzLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgZmluYWwgY2xhc3MgU2F4SGVscGVyIHsKKworICAgIHByaXZhdGUgU2F4SGVscGVyKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgZ2l2ZW4gU0FYIHtAY29kZSBwYXJzZXJGYWN0b3J5fSBpcyBmcm9tIFhESyBwYWNrYWdlIG9yIG5vdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJzZXJGYWN0b3J5IFNBWCBwYXJzZXIgZmFjdG9yeSB0byBldmFsdWF0ZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZ2l2ZW4gU0FYIHBhcnNlciBmYWN0b3J5IGlzIGFuIFhESyBmYWN0b3J5LCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNYZGtQYXJzZXJGYWN0b3J5KGZpbmFsIFNBWFBhcnNlckZhY3RvcnkgcGFyc2VyRmFjdG9yeSkgeworICAgICAgICByZXR1cm4gaXNYZGtGYWN0b3J5KHBhcnNlckZhY3RvcnksICJvcmFjbGUueG1sLmpheHAuSlhTQVhQYXJzZXJGYWN0b3J5Iik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBnaXZlbiB7QGNvZGUgYnVpbGRlckZhY3Rvcnl9IGlzIGZyb20gWERLIHBhY2thZ2Ugb3Igbm90LgorICAgICAqCisgICAgICogQHBhcmFtIGJ1aWxkZXJGYWN0b3J5IGRvY3VtZW50IGJ1aWxkZXIgZmFjdG9yeSB0byBldmFsdWF0ZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZ2l2ZW4gZG9jdW1lbnQgYnVpbGRlciBmYWN0b3J5IGlzIGFuIFhESyBmYWN0b3J5LCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNYZGtEb2N1bWVudEJ1aWxkZXJGYWN0b3J5KGZpbmFsIERvY3VtZW50QnVpbGRlckZhY3RvcnkgYnVpbGRlckZhY3RvcnkpIHsKKyAgICAgICAgcmV0dXJuIGlzWGRrRmFjdG9yeShidWlsZGVyRmFjdG9yeSwgIm9yYWNsZS54bWwuamF4cC5KWERvY3VtZW50QnVpbGRlckZhY3RvcnkiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzWGRrRmFjdG9yeShmaW5hbCBPYmplY3QgZmFjdG9yeSwgZmluYWwgU3RyaW5nIGNsYXNzTmFtZSkgeworICAgICAgICBmaW5hbCBDbGFzczw/PiB4ZGtGYWN0b3J5Q2xhc3MgPSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChSZWZsZWN0aW9uSGVscGVyLmNsYXNzRm9yTmFtZVBBKGNsYXNzTmFtZSwgbnVsbCkpOworICAgICAgICBpZiAoeGRrRmFjdG9yeUNsYXNzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4geGRrRmFjdG9yeUNsYXNzLmlzQXNzaWduYWJsZUZyb20oZmFjdG9yeS5nZXRDbGFzcygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvU2ltcGxlTmFtZXNwYWNlUmVzb2x2ZXIuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9TaW1wbGVOYW1lc3BhY2VSZXNvbHZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZDU3NDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvU2ltcGxlTmFtZXNwYWNlUmVzb2x2ZXIuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBqYXZheC54bWwuWE1MQ29uc3RhbnRzOworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuTmFtZXNwYWNlQ29udGV4dDsKKworLyoqCisgKiBTaW1wbGUgbmFtZXNwYWNlIHJlc29sdmVyIHdoaWNoIHJlc29sdmVzIG9uZSBwcmVkZWZpbmVkIG5hbWVzcGFjZS4KKyAqCisgKiBAYXV0aG9yIEdlcmFyZCBEYXZpc29uCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBTaW1wbGVOYW1lc3BhY2VSZXNvbHZlciBpbXBsZW1lbnRzIE5hbWVzcGFjZUNvbnRleHQgeworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHByZWZpeDsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuc1VSSTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgbmFtZXNwYWNlIHJlc29sdmVyIGluaXRpYWxpemVkIHdpdGggdGhlCisgICAgICogZml4ZWQge0Bjb2RlIHByZWZpeH0gYW5kIHtAY29kZSBVUkl9IHRoYXQgdGhlIHJlc29sdmVyIHdpbGwgYmUgY2FwYWJsZSB0byByZXNvbHZlLgorICAgICAqCisgICAgICogQHBhcmFtIHByZWZpeCBOYW1lc3BhY2UgcHJlZml4LgorICAgICAqIEBwYXJhbSBuc1VSSSBOYW1lc3BhY2UgVVJJLgorICAgICAqLworICAgIHB1YmxpYyBTaW1wbGVOYW1lc3BhY2VSZXNvbHZlcihTdHJpbmcgcHJlZml4LCBTdHJpbmcgbnNVUkkpIHsKKyAgICAgICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7CisgICAgICAgIHRoaXMubnNVUkkgPSBuc1VSSTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZVVSSShTdHJpbmcgcHJlZml4KSB7CisgICAgICAgIGlmIChwcmVmaXguZXF1YWxzKHRoaXMucHJlZml4KSkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMubnNVUkk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gWE1MQ29uc3RhbnRzLk5VTExfTlNfVVJJOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRQcmVmaXgoU3RyaW5nIG5hbWVzcGFjZVVSSSkgeworICAgICAgICBpZiAobmFtZXNwYWNlVVJJLmVxdWFscyh0aGlzLm5zVVJJKSkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJlZml4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSXRlcmF0b3IgZ2V0UHJlZml4ZXMoU3RyaW5nIG5hbWVzcGFjZVVSSSkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvVG9rZW5pemVyLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvVG9rZW5pemVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGJiODMwNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9Ub2tlbml6ZXIuamF2YQpAQCAtMCwwICsxLDEzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKKy8qKgorICogQSB1dGlsaXR5IGNsYXNzIHByb3ZpZGluZyBtZXRob2RzIGNhcGFibGUgb2Ygc3BsaXR0aW5nIFN0cmluZyBlbnRyaWVzCisgKiBpbnRvIGFuIGFycmF5IG9mIHRva2VucyBiYXNlZCBvbiBlaXRoZXIgZGVmYXVsdCBvciBjdXN0b20gdG9rZW4gZGVsaW1pdGVycy4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVG9rZW5pemVyIHsKKyAgICBwcml2YXRlIFRva2VuaXplcigpIHsKKyAgICAgICAgLy8gcHJldmVudHMgaW5zdGFudGlhdGlvbi4KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21tb24gSmVyc2V5IGRlbGltaXRlcnMgdXNlZCBieSB2YXJpb3VzIHByb3BlcnRpZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTU9OX0RFTElNSVRFUlMgPSAiICw7XG4iOworCisgICAgLyoqCisgICAgICogR2V0IGEgY2Fub25pY2FsIGFycmF5IG9mIHRva2VucyBmcm9tIGFuIGFycmF5IG9mIFN0cmluZyBlbnRyaWVzCisgICAgICogd2hlcmUgZWFjaCBlbnRyeSBtYXkgY29udGFpbiB6ZXJvIG9yIG1vcmUgdG9rZW5zIHNlcGFyYXRlZCBieQorICAgICAqIGNvbW1vbiBkZWxpbWl0ZXJzIHtAY29kZSAiICw7XG4ifS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbnRyaWVzIGFuIGFycmF5IHdoZXJlIGVhY2ggU3RyaW5nIGVudHJ5IG1heSBjb250YWluIHplcm8gb3IgbW9yZQorICAgICAqICAgICAgICAgICAgICAgIHtAbGluayAjQ09NTU9OX0RFTElNSVRFUlMgY29tbW9uIGRlbGltaXRlcnN9IHNlcGFyYXRlZCB0b2tlbnMuCisgICAgICogQHJldHVybiB0aGUgYXJyYXkgb2YgdG9rZW5zLCBlYWNoIHRva2VuIGlzIHRyaW1tZWQsIHRoZSBhcnJheSB3aWxsCisgICAgICogICAgICAgICBub3QgY29udGFpbiBhbnkgZW1wdHkgb3Ige0Bjb2RlIG51bGx9IGVudHJpZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSB0b2tlbml6ZShmaW5hbCBTdHJpbmdbXSBlbnRyaWVzKSB7CisgICAgICAgIHJldHVybiB0b2tlbml6ZShlbnRyaWVzLCBDT01NT05fREVMSU1JVEVSUyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgY2Fub25pY2FsIGFycmF5IG9mIHRva2VucyBmcm9tIGFuIGFycmF5IG9mIFN0cmluZyBlbnRyaWVzCisgICAgICogd2hlcmUgZWFjaCBlbnRyeSBtYXkgY29udGFpbiB6ZXJvIG9yIG1vcmUgdG9rZW5zIHNlcGFyYXRlZCBieSBjaGFyYWN0ZXJzCisgICAgICogaW4gZGVsaW1pdGVycyBzdHJpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW50cmllcyAgICBhbiBhcnJheSB3aGVyZSBlYWNoIFN0cmluZyBlbnRyeSBtYXkgY29udGFpbiB6ZXJvIG9yIG1vcmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICBkZWxpbWl0ZXJzIHNlcGFyYXRlZCB0b2tlbnMuCisgICAgICogQHBhcmFtIGRlbGltaXRlcnMgc3RyaW5nIHdpdGggZGVsaW1pdGVycywgZXZlcnkgY2hhcmFjdGVyIHJlcHJlc2VudHMgb25lCisgICAgICogICAgICAgICAgICAgICAgICAgZGVsaW1pdGVyLgorICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIHRva2VucywgZWFjaCB0b2tlbiBpcyB0cmltbWVkLCB0aGUgYXJyYXkgd2lsbAorICAgICAqICAgICAgICAgbm90IGNvbnRhaW4gYW55IGVtcHR5IG9yIHtAY29kZSBudWxsfSBlbnRyaWVzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nW10gdG9rZW5pemUoZmluYWwgU3RyaW5nW10gZW50cmllcywgZmluYWwgU3RyaW5nIGRlbGltaXRlcnMpIHsKKyAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHRva2VucyA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oKTsKKworICAgICAgICBmb3IgKFN0cmluZyBlbnRyeSA6IGVudHJpZXMpIHsKKyAgICAgICAgICAgIGlmIChlbnRyeSA9PSBudWxsIHx8IGVudHJ5LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZW50cnkgPSBlbnRyeS50cmltKCk7CisgICAgICAgICAgICBpZiAoZW50cnkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0b2tlbml6ZShlbnRyeSwgZGVsaW1pdGVycywgdG9rZW5zKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0b2tlbnMudG9BcnJheShuZXcgU3RyaW5nW3Rva2Vucy5zaXplKCldKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBjYW5vbmljYWwgYXJyYXkgb2YgdG9rZW5zIGZyb20gYSBTdHJpbmcgZW50cnkgdGhhdCBtYXkgY29udGFpbgorICAgICAqIHplcm8gb3IgbW9yZSB0b2tlbnMgc2VwYXJhdGVkIGJ5IGNvbW1vbiBkZWxpbWl0ZXJzIHtAY29kZSAiICw7XG4ifS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbnRyeSBhIFN0cmluZyB0aGF0IG1heSBjb250YWluIHplcm8gb3IgbW9yZQorICAgICAqICAgICAgICAgICAgICB7QGxpbmsgI0NPTU1PTl9ERUxJTUlURVJTIGNvbW1vbiBkZWxpbWl0ZXJzfSBzZXBhcmF0ZWQgdG9rZW5zLgorICAgICAqIEByZXR1cm4gdGhlIGFycmF5IG9mIHRva2VucywgZWFjaCB0b2tlbnMgaXMgdHJpbW1lZCwgdGhlIGFycmF5IHdpbGwKKyAgICAgKiAgICAgICAgIG5vdCBjb250YWluIGFueSBlbXB0eSBvciB7QGNvZGUgbnVsbH0gZW50cmllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZ1tdIHRva2VuaXplKGZpbmFsIFN0cmluZyBlbnRyeSkgeworICAgICAgICByZXR1cm4gdG9rZW5pemUoZW50cnksIENPTU1PTl9ERUxJTUlURVJTKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBjYW5vbmljYWwgYXJyYXkgb2YgdG9rZW5zIGZyb20gYSBTdHJpbmcgZW50cnkKKyAgICAgKiB0aGF0IG1heSBjb250YWluIHplcm8gb3IgbW9yZSB0b2tlbnMgc2VwYXJhdGVkIGJ5IGNoYXJhY3RlcnMgaW4KKyAgICAgKiBkZWxpbWl0ZXJzIHN0cmluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbnRyeSAgICAgIGEgU3RyaW5nIHRoYXQgbWF5IGNvbnRhaW4gemVybyBvciBtb3JlCisgICAgICogICAgICAgICAgICAgICAgICAgZGVsaW1pdGVycyBzZXBhcmF0ZWQgdG9rZW5zLgorICAgICAqIEBwYXJhbSBkZWxpbWl0ZXJzIHN0cmluZyB3aXRoIGRlbGltaXRlcnMsIGV2ZXJ5IGNoYXJhY3RlciByZXByZXNlbnRzIG9uZQorICAgICAqICAgICAgICAgICAgICAgICAgIGRlbGltaXRlci4KKyAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiB0b2tlbnMsIGVhY2ggdG9rZW5zIGlzIHRyaW1tZWQsIHRoZSBhcnJheSB3aWxsCisgICAgICogICAgICAgICBub3QgY29udGFpbiBhbnkgZW1wdHkgb3Ige0Bjb2RlIG51bGx9IGVudHJpZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmdbXSB0b2tlbml6ZShmaW5hbCBTdHJpbmcgZW50cnksIGZpbmFsIFN0cmluZyBkZWxpbWl0ZXJzKSB7CisgICAgICAgIGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiB0b2tlbnMgPSB0b2tlbml6ZShlbnRyeSwgZGVsaW1pdGVycywgbmV3IExpbmtlZExpc3Q8U3RyaW5nPigpKTsKKyAgICAgICAgcmV0dXJuIHRva2Vucy50b0FycmF5KG5ldyBTdHJpbmdbdG9rZW5zLnNpemUoKV0pOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIENvbGxlY3Rpb248U3RyaW5nPiB0b2tlbml6ZShmaW5hbCBTdHJpbmcgZW50cnksIGZpbmFsIFN0cmluZyBkZWxpbWl0ZXJzLCBmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gdG9rZW5zKSB7CisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgcmVnZXhwQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKGRlbGltaXRlcnMubGVuZ3RoKCkgKiAzKTsKKyAgICAgICAgcmVnZXhwQnVpbGRlci5hcHBlbmQoJ1snKTsKKyAgICAgICAgZm9yIChmaW5hbCBjaGFyIGMgOiBkZWxpbWl0ZXJzLnRvQ2hhckFycmF5KCkpIHsKKyAgICAgICAgICAgIHJlZ2V4cEJ1aWxkZXIuYXBwZW5kKFBhdHRlcm4ucXVvdGUoU3RyaW5nLnZhbHVlT2YoYykpKTsKKyAgICAgICAgfQorICAgICAgICByZWdleHBCdWlsZGVyLmFwcGVuZCgnXScpOworCisgICAgICAgIGZpbmFsIFN0cmluZ1tdIHRva2VuQXJyYXkgPSBlbnRyeS5zcGxpdChyZWdleHBCdWlsZGVyLnRvU3RyaW5nKCkpOworICAgICAgICBmb3IgKFN0cmluZyB0b2tlbiA6IHRva2VuQXJyYXkpIHsKKyAgICAgICAgICAgIGlmICh0b2tlbiA9PSBudWxsIHx8IHRva2VuLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0b2tlbiA9IHRva2VuLnRyaW0oKTsKKyAgICAgICAgICAgIGlmICh0b2tlbi5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdG9rZW5zLmFkZCh0b2tlbik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdG9rZW5zOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9UeXBlVmlzaXRvci5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL1R5cGVWaXNpdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkzMGJjNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9UeXBlVmlzaXRvci5qYXZhCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWw7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5HZW5lcmljQXJyYXlUeXBlOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlBhcmFtZXRlcml6ZWRUeXBlOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZVZhcmlhYmxlOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LldpbGRjYXJkVHlwZTsKKworLyoqCisgKiBUeXBlIHZpc2l0b3IgY29udHJhY3QuCisgKgorICogQHBhcmFtIDxUPiB0eXBlIHZpc2l0aW5nIHJlc3VsdCB0eXBlLgorICogQGF1dGhvciBLb2hzdWtlIEthd2FndWNoaQorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworYWJzdHJhY3QgY2xhc3MgVHlwZVZpc2l0b3I8VD4geworCisgICAgLyoqCisgICAgICogVmlzaXQgdGhlIHR5cGUgYW5kIGEgZ2l2ZW4gcGFyYW1ldGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgdmlzaXRlZCB0eXBlLgorICAgICAqIEByZXR1cm4gdmlzaXRpbmcgcmVzdWx0LgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBUIHZpc2l0KGZpbmFsIFR5cGUgdHlwZSkgeworICAgICAgICBhc3NlcnQgdHlwZSAhPSBudWxsOworCisgICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgQ2xhc3MpIHsKKyAgICAgICAgICAgIHJldHVybiBvbkNsYXNzKChDbGFzcykgdHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIG9uUGFyYW1ldGVyaXplZFR5cGUoKFBhcmFtZXRlcml6ZWRUeXBlKSB0eXBlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIEdlbmVyaWNBcnJheVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBvbkdlbmVyaWNBcnJheSgoR2VuZXJpY0FycmF5VHlwZSkgdHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBXaWxkY2FyZFR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBvbldpbGRjYXJkKChXaWxkY2FyZFR5cGUpIHR5cGUpOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgVHlwZVZhcmlhYmxlKSB7CisgICAgICAgICAgICByZXR1cm4gb25WYXJpYWJsZSgoVHlwZVZhcmlhYmxlKSB0eXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNvdmVyZWQgYWxsIHRoZSBjYXNlcworICAgICAgICBhc3NlcnQgZmFsc2U7CisKKyAgICAgICAgdGhyb3cgY3JlYXRlRXJyb3IodHlwZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmlzaXQgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhenogdmlzaXRlZCBjbGFzcy4KKyAgICAgKiBAcmV0dXJuIHZpc2l0IHJlc3VsdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgVCBvbkNsYXNzKENsYXNzIGNsYXp6KTsKKworICAgIC8qKgorICAgICAqIFZpc2l0IHBhcmFtZXRlcml6ZWQgdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIHZpc2l0ZWQgcGFyYW1ldGVyaXplZCB0eXBlLgorICAgICAqIEByZXR1cm4gdmlzaXQgcmVzdWx0LgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBUIG9uUGFyYW1ldGVyaXplZFR5cGUoUGFyYW1ldGVyaXplZFR5cGUgdHlwZSk7CisKKyAgICAvKioKKyAgICAgKiBWaXNpdCBnZW5lcmljIGFycmF5IHR5cGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSB2aXNpdGVkIHBhcmFtZXRlcml6ZWQgdHlwZS4KKyAgICAgKiBAcmV0dXJuIHZpc2l0IHJlc3VsdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgVCBvbkdlbmVyaWNBcnJheShHZW5lcmljQXJyYXlUeXBlIHR5cGUpOworCisgICAgLyoqCisgICAgICogVmlzaXQgdHlwZSB2YXJpYWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIHZpc2l0ZWQgcGFyYW1ldGVyaXplZCB0eXBlLgorICAgICAqIEByZXR1cm4gdmlzaXQgcmVzdWx0LgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBUIG9uVmFyaWFibGUoVHlwZVZhcmlhYmxlIHR5cGUpOworCisgICAgLyoqCisgICAgICogVmlzaXQgd2lsZGNhcmQgdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIHZpc2l0ZWQgcGFyYW1ldGVyaXplZCB0eXBlLgorICAgICAqIEByZXR1cm4gdmlzaXQgcmVzdWx0LgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBUIG9uV2lsZGNhcmQoV2lsZGNhcmRUeXBlIHR5cGUpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIHZpc2l0aW5nIGVycm9yIChpbiBjYXNlIHRoZSB2aXNpdG9yIGNvdWxkIG5vdCByZWNvZ25pemUgdGhlIHZpc2l0IHR5cGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSB2aXNpdGVkIHBhcmFtZXRlcml6ZWQgdHlwZS4KKyAgICAgKiBAcmV0dXJuIHZpc2l0IHJlc3VsdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUnVudGltZUV4Y2VwdGlvbiBjcmVhdGVFcnJvcihmaW5hbCBUeXBlIHR5cGUpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9jb2xsZWN0aW9uL0J5dGVCdWZmZXJJbnB1dFN0cmVhbS5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL2NvbGxlY3Rpb24vQnl0ZUJ1ZmZlcklucHV0U3RyZWFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk3NTRlMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9jb2xsZWN0aW9uL0J5dGVCdWZmZXJJbnB1dFN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsMzE0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5CbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKKworLyoqCisgKiBBbiB7QGxpbmsgamF2YS5pby5JbnB1dFN0cmVhbX0gYmFja2VkIGJ5IGEgcXVldWUgb2Yge0BsaW5rIGphdmEubmlvLkJ5dGVCdWZmZXIgYnl0ZSBidWZmZXJzfQorICogdG8gYmUgcmVhZC4KKyAqIDxwPgorICogVGhpcyBpbnB1dCBzdHJlYW0gc2VydmVzIGFzIGEgYnJpZGdpbmcgaW5ib3VuZCBJL08gY29tcG9uZW50IGJldHdlZW4gYSBibG9ja2luZyB1cHBlciBJL08gbGF5ZXIKKyAqIGFuZCBhbiB1bmRlcmx5aW5nIG5vbi1ibG9ja2luZyBJL08gbGF5ZXIuIEluIGFkZGl0aW9uIHRvIHRoZSBibG9ja2luZyB7QGNvZGUgSW5wdXRTdHJlYW0ucmVhZH0gb3BlcmF0aW9ucywKKyAqIHRoaXMgaW5wdXQgc3RyZWFtIHByb3ZpZGVzIHRoZSBub24tYmxvY2tpbmcge0Bjb2RlIHRyeVJlYWR9IGNvdW50ZXJwYXJ0cy4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQnl0ZUJ1ZmZlcklucHV0U3RyZWFtIGV4dGVuZHMgTm9uQmxvY2tpbmdJbnB1dFN0cmVhbSB7CisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCBidWZmZXIgaW5kaWNhdGluZyBFT0YuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQnl0ZUJ1ZmZlciBFT0YgPSBCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbXSB7fSk7CisKKyAgICAvKioKKyAgICAgKiBSZWFkLXNpZGUgRU9GIGZsYWcuIERvZXMgbm90IGhhdmUgdG8gYmUgdm9sYXRpbGUsIGl0IGlzIHRyYW5zaWVudCBhbmQgb25seSBhY2Nlc3NlZCBmcm9tIHRoZSByZWFkZXIgdGhyZWFkLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBlb2YgPSBmYWxzZTsKKyAgICAvKioKKyAgICAgKiBDdXJyZW50bHkgcmVhZCBieXRlIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIEJ5dGVCdWZmZXIgY3VycmVudDsKKyAgICAvKioKKyAgICAgKiBRdWV1ZSBvZiBieXRlIGJ1ZmZlcnMgdG8gYmUgcmVhZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIEJsb2NraW5nUXVldWU8Qnl0ZUJ1ZmZlcj4gYnVmZmVyczsKKyAgICAvKioKKyAgICAgKiBDb250ZW50IHJlcHJlc2VudHMgdGhlIGJ1ZmZlciBxdWV1ZSBzdGF0dXMuCisgICAgICoKKyAgICAgKiBudWxsID0gb3BlbiwgUE9JU09OX1BJTEwgPSBjbG9zZWQsIFRocm93YWJsZSA9IGNsb3NlZCB3aXRoIGVycm9yCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNSZWZlcmVuY2U8T2JqZWN0PiBxdWV1ZVN0YXR1cyA9IG5ldyBBdG9taWNSZWZlcmVuY2U8T2JqZWN0PihudWxsKTsKKyAgICAvKioKKyAgICAgKiBDbG9zZWQgZmxhZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIEF0b21pY0Jvb2xlYW4gY2xvc2VkID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGlucHV0IHN0cmVhbSB0aGF0IGlzIGJhY2tlZCBieSBhIGEgcXVldWUgb2Yge0BsaW5rIGphdmEubmlvLkJ5dGVCdWZmZXIgYnl0ZSBidWZmZXJzfQorICAgICAqIHRvIGJlIHJlYWQuCisgICAgICovCisgICAgcHVibGljIEJ5dGVCdWZmZXJJbnB1dFN0cmVhbSgpIHsKKyAgICAgICAgdGhpcy5idWZmZXJzID0gRGF0YVN0cnVjdHVyZXMuY3JlYXRlTGlua2VkVHJhbnNmZXJRdWV1ZSgpOworICAgICAgICB0aGlzLmN1cnJlbnQgPSBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBmZXRjaENodW5rKGZpbmFsIGJvb2xlYW4gYmxvY2spIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChlb2YpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlYWQgdW50aWwgbm8gYnVmZmVycyBhdmFpbGFibGUgKHBvbGwgcmV0dXJuZWQgbnVsbCkKKyAgICAgICAgLy8gb3IgdW50aWwgYSBub24tZW1wdHkgYnVmZmVyIG9yIEVPRiBpcyByZWFjaGVkLgorICAgICAgICBkbyB7CisgICAgICAgICAgICBpZiAoY2xvc2VkLmdldCgpKSB7CisgICAgICAgICAgICAgICAgY3VycmVudCA9IEVPRjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY3VycmVudCA9IChibG9jaykgPyBidWZmZXJzLnRha2UoKSA6IGJ1ZmZlcnMucG9sbCgpOworICAgICAgICB9IHdoaWxlIChjdXJyZW50ICE9IG51bGwgJiYgY3VycmVudCAhPSBFT0YgJiYgIWN1cnJlbnQuaGFzUmVtYWluaW5nKCkpOworCisgICAgICAgIGVvZiA9IGN1cnJlbnQgPT0gRU9GOworICAgICAgICByZXR1cm4gIWVvZjsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tOb3RDbG9zZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoY2xvc2VkLmdldCgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuSU5QVVRfU1RSRUFNX0NMT1NFRCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja1Rocm93YWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIE9iamVjdCBvID0gcXVldWVTdGF0dXMuZ2V0KCk7CisgICAgICAgIGlmIChvICE9IG51bGwgJiYgbyAhPSBFT0YpIHsgLy8gc2hvdWxkIGJlIGZhc3RlciB0aGFuIGluc3RhbmNlb2YKKyAgICAgICAgICAgIC8vIGlmIG5vdCBudWxsIG9yIEVPRiwgdGhlbiBpdCBtdXN0IGJlIFRocm93YWJsZQorICAgICAgICAgICAgaWYgKHF1ZXVlU3RhdHVzLmNvbXBhcmVBbmRTZXQobywgRU9GKSkgeworICAgICAgICAgICAgICAgIC8vIGNsZWFyIHRocm93YWJsZSBmbGFnIGFuZCB0aHJvdyBleGNlcHRpb24KKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oKFRocm93YWJsZSkgbyk7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGF2YWlsYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChlb2YgfHwgY2xvc2VkLmdldCgpKSB7CisgICAgICAgICAgICBjaGVja1Rocm93YWJsZSgpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBpbnQgYXZhaWxhYmxlID0gMDsKKyAgICAgICAgaWYgKGN1cnJlbnQgIT0gbnVsbCAmJiBjdXJyZW50Lmhhc1JlbWFpbmluZygpKSB7CisgICAgICAgICAgICBhdmFpbGFibGUgPSBjdXJyZW50LnJlbWFpbmluZygpOworICAgICAgICB9CisgICAgICAgIGZvciAoZmluYWwgQnl0ZUJ1ZmZlciBidWZmZXIgOiBidWZmZXJzKSB7CisgICAgICAgICAgICBpZiAoYnVmZmVyID09IEVPRikgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXZhaWxhYmxlICs9IGJ1ZmZlci5yZW1haW5pbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIGNoZWNrVGhyb3dhYmxlKCk7CisgICAgICAgIHJldHVybiBjbG9zZWQuZ2V0KCkgPyAwIDogYXZhaWxhYmxlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiB0cnlSZWFkKHRydWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHRyeVJlYWQoYiwgb2ZmLCBsZW4sIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgdHJ5UmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiB0cnlSZWFkKGZhbHNlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHRyeVJlYWQoZmluYWwgYnl0ZVtdIGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiB0cnlSZWFkKGIsIDAsIGIubGVuZ3RoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHRyeVJlYWQoZmluYWwgYnl0ZVtdIGIsIGZpbmFsIGludCBvZmYsIGZpbmFsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiB0cnlSZWFkKGIsIG9mZiwgbGVuLCBmYWxzZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoY2xvc2VkLmNvbXBhcmVBbmRTZXQoZmFsc2UsIHRydWUpKSB7CisgICAgICAgICAgICBjbG9zZVF1ZXVlKCk7CisgICAgICAgICAgICAvLyB3ZSBjYW4gbm93IHNhZmVseSBjbGVhciB0aGUgcXVldWUgLSBhbnkgYmxvY2tpbmcgcmVhZCB3YWl0aW5nIGZvciBhIGJ1ZmZlcgorICAgICAgICAgICAgLy8gaGFzIGJlZW4gcmVzdW1lZCBieSB0aGUgRU9GIGJ1ZmZlcgorICAgICAgICAgICAgYnVmZmVycy5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIGNoZWNrVGhyb3dhYmxlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHV0IHRoZSB7QGNvZGUgQnl0ZUJ1ZmZlcn0gdG8gdGhlIGludGVybmFsIHF1ZXVlIHRvIGJlIGF2YWlsYWJsZSBmb3IgcmVhZGluZyBmcm9tIHRoZSBzdHJlYW0uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgc2luayBpcyBvcGVuLCB0aGUgbWV0aG9kIHtAbGluayBCbG9ja2luZ1F1ZXVlI3B1dChPYmplY3QpIHB1dHMgdGhlIGJ1ZmZlcn0gaW50byBhbiBpbnRlcm5hbAorICAgICAqIGJ5dGUgYnVmZmVyIHJlYWQgcXVldWUgLCB3YWl0aW5nIGlmIG5lY2Vzc2FyeSBmb3Igc3BhY2UgdG8gYmVjb21lIGF2YWlsYWJsZS4gVGhlbiB0aGUgbWV0aG9kIHJldHVybnMKKyAgICAgKiB7QGNvZGUgdHJ1ZX0gdG8gaW5kaWNhdGUgdGhlIGJ1ZmZlciBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgcXVldWVkLiBJbiBjYXNlIHRoZSBpbnRlcm5hbCByZWFkIHF1ZXVlIGhhcyBiZWVuCisgICAgICoge0BsaW5rICNjbG9zZVF1ZXVlKCkgY2xvc2VkfSBhbHJlYWR5LCB0aGUgbWV0aG9kIHNpbXBseSByZXR1cm5zIHtAY29kZSBmYWxzZX0gd2l0aG91dCByZWdpc3RlcmluZworICAgICAqIHRoZSBidWZmZXIgaW4gdGhlIGNsb3NlZCBxdWV1ZS4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gc3JjIHRoZSBzb3VyY2UgYnVmZmVyIHRvIGJlIHJlZ2lzdGVyZWQgaW4gdGhlIGJ5dGUgYnVmZmVyIHJlYWQgcXVldWUuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGJ5dGUgYnVmZmVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBwdXQgaW4gdGhlIHJlYWQgcXVldWUsCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IGlmIHRoZSByZWFkIHF1ZXVlIGhhcyBiZWVuIGNsb3NlZC4KKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGluIGNhc2UgdGhlIHB1dCBvcGVyYXRpb24gaGFzIGJlZW4gaW50ZXJydXB0ZWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcHV0KGZpbmFsIEJ5dGVCdWZmZXIgc3JjKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpZiAocXVldWVTdGF0dXMuZ2V0KCkgPT0gbnVsbCkgeworICAgICAgICAgICAgYnVmZmVycy5wdXQoc3JjKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIGJ5dGUgYnVmZmVyIHNpbmsgb2YgdGhpcyBpbnB1dCBzdHJlYW0gdG8gaW5kaWNhdGUgdGhhdCB3cml0aW5nIHRvIHRoZSBzdHJlYW0KKyAgICAgKiBoYXMgYmVlbiBmaW5pc2hlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgc2luayBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZCB0aGVuIHRoaXMgbWV0aG9kIHJldHVybnMgaW1tZWRpYXRlbHkuIE90aGVyd2lzZSB0aGUKKyAgICAgKiBzaW5rIGlzIG1hcmtlZCBhcyBjbG9zZWQgYW5kIG5vIG1vcmUgZGF0YSBjYW4gYmUgd3JpdHRlbiB0byBpdC4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2VRdWV1ZSgpIHsKKyAgICAgICAgaWYgKHF1ZXVlU3RhdHVzLmNvbXBhcmVBbmRTZXQobnVsbCwgRU9GKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBidWZmZXJzLnB1dChFT0YpOworICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIGJ5dGUgYnVmZmVyIHNpbmsgb2YgdGhpcyBpbnB1dCBzdHJlYW0gdG8gaW5kaWNhdGUgdGhhdCB3cml0aW5nIHRvIHRoZSBzdHJlYW0KKyAgICAgKiBoYXMgYmVlbiBmaW5pc2hlZCBkdWUgdG8gYSB0aHJvd2FibGUuCisgICAgICoKKyAgICAgKiBUaGUgdGhyb3dhYmxlIHNldCBieSB0aGlzIG1ldGhvZCB3aWxsIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIHJlYWRlciB0aHJlYWQgd2hlbiBhIG5ldyBhdHRlbXB0CisgICAgICogdG8gcmVhZCBieXRlcyBpcyBtYWRlLgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSBzaW5rIGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkIHRoZW4gdGhpcyBtZXRob2Qgb25seSBzZXRzIHRoZSB0aHJvd2FibGUgaW4gdGhlIHN0cmVhbSBhbmQKKyAgICAgKiB0aGVuIHJldHVybnMgaW1tZWRpYXRlbHkuIE90aGVyd2lzZSB0aGUgc2luayBpcyBhbHNvIG1hcmtlZCBhcyBjbG9zZWQgYW5kIG5vIG1vcmUgZGF0YSBjYW4gYmUKKyAgICAgKiB3cml0dGVuIHRvIGl0LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aHJvd2FibGUgdGhyb3dhYmxlIHRoYXQgaXMgc2V0IGluIHRoZSBzdHJlYW0uIEl0IHdpbGwgYmUgdGhyb3duIGJ5IHRoZSBzdHJlYW0gaW4gY2FzZQorICAgICAqICAgICAgICAgICAgICAgICAgYW4gYXR0ZW1wdCB0byByZWFkIG1vcmUgZGF0YSBvciBjaGVjayBhdmFpbGFibGUgYnl0ZXMgaXMgbWFkZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZVF1ZXVlKGZpbmFsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKKyAgICAgICAgaWYgKHF1ZXVlU3RhdHVzLmNvbXBhcmVBbmRTZXQobnVsbCwgdGhyb3dhYmxlKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBidWZmZXJzLnB1dChFT0YpOworICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGludCB0cnlSZWFkKGZpbmFsIGJ5dGVbXSBiLCBmaW5hbCBpbnQgb2ZmLCBmaW5hbCBpbnQgbGVuLCBib29sZWFuIGJsb2NrKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjaGVja1Rocm93YWJsZSgpOworICAgICAgICBjaGVja05vdENsb3NlZCgpOworCisgICAgICAgIGlmIChiID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgICB9IGVsc2UgaWYgKG9mZiA8IDAgfHwgbGVuIDwgMCB8fCBsZW4gPiBiLmxlbmd0aCAtIG9mZikgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICAgICAgfSBlbHNlIGlmIChsZW4gPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZW9mKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIHdoaWxlIChpIDwgbGVuKSB7CisgICAgICAgICAgICBpZiAoY3VycmVudCAhPSBudWxsICYmIGN1cnJlbnQuaGFzUmVtYWluaW5nKCkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgYXZhaWxhYmxlID0gY3VycmVudC5yZW1haW5pbmcoKTsKKyAgICAgICAgICAgICAgICBpZiAoYXZhaWxhYmxlIDwgbGVuIC0gaSkgeworICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmdldChiLCBvZmYgKyBpLCBhdmFpbGFibGUpOworICAgICAgICAgICAgICAgICAgICBpICs9IGF2YWlsYWJsZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmdldChiLCBvZmYgKyBpLCBsZW4gLSBpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghZmV0Y2hDaHVuayhibG9jaykgfHwgY3VycmVudCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgIC8vIGVvZiBvciBubyBkYXRhCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChibG9jaykgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGkgPT0gMCAmJiBlb2YgPyAtMSA6IGk7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgdHJ5UmVhZChib29sZWFuIGJsb2NrKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjaGVja1Rocm93YWJsZSgpOworICAgICAgICBjaGVja05vdENsb3NlZCgpOworCisgICAgICAgIGlmIChlb2YpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjdXJyZW50ICE9IG51bGwgJiYgY3VycmVudC5oYXNSZW1haW5pbmcoKSkgeworICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQuZ2V0KCkgJiAweEZGOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIHRyeSB0byBmZXRjaCwgYnV0IGRvbid0IGJsb2NrICYmIGNoZWNrIGlmIHNvbWV0aGluZyBoYXMgYmVlbiBmZXRjaGVkCisgICAgICAgICAgICBpZiAoZmV0Y2hDaHVuayhibG9jaykgJiYgY3VycmVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQuZ2V0KCkgJiAweEZGOworICAgICAgICAgICAgfSBlbHNlIGlmIChibG9jaykgeworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgIGlmIChibG9jaykgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoZW9mKSA/IC0xIDogTk9USElORzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvY29sbGVjdGlvbi9DYWNoZS5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL2NvbGxlY3Rpb24vQ2FjaGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmNhOTA5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL2NvbGxlY3Rpb24vQ2FjaGUuamF2YQpAQCAtMCwwICsxLDIyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZVRhc2s7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZW91dEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CisKKy8qKgorICogQ2FjaGUgaW1wbGVtZW50YXRpb24gdGhhdCByZWxpZXMgb24gRnV0dXJlVGFzay4KKyAqIERlc2lyZWQgdmFsdWUgd2lsbCBvbmx5IGJlIGNvbXB1dGVkIG9uY2UgYW5kIGNvbXB1dGVkIHZhbHVlIHN0b3JlZCBpbiB0aGUgY2FjaGUuCisgKiBUaGUgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gYW4gZXhhbXBsZSBmcm9tIHRoZSAiSmF2YSBDb25jdXJyZW5jeSBpbiBQcmFjdGljZSIgYm9vaworICogYXV0aG9yZWQgYnkgQnJpYW4gR29ldHogYW5kIGNvbXBhbnkuCisgKgorICogQHBhcmFtIDxLPiBUaGUgdHlwZSBvZiB0aGUga2V5IG9mIHRoZSBjYWNoZQorICogQHBhcmFtIDxWPiBUaGUgdHlwZSBvZiB0aGUgdmFsdWVzIGluIHRoZSBjYWNoZQorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIENhY2hlPEssIFY+IGltcGxlbWVudHMgRnVuY3Rpb248SywgVj4geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ3ljbGVIYW5kbGVyPE9iamVjdD4gRU1QVFlfSEFORExFUiA9IGtleSAtPiB7IH07CisgICAgcHJpdmF0ZSBmaW5hbCBDeWNsZUhhbmRsZXI8Sz4gY3ljbGVIYW5kbGVyOworICAgIHByaXZhdGUgZmluYWwgQ29uY3VycmVudEhhc2hNYXA8SywgT3JpZ2luVGhyZWFkQXdhcmVGdXR1cmU+IGNhY2hlID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIEZ1bmN0aW9uPEssIFY+IGNvbXB1dGFibGU7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IGNhY2hlIHdpdGggZ2l2ZW4gY29tcHV0YWJsZSB0byBjb21wdXRlIHZhbHVlcy4KKyAgICAgKiBEZXRlY3RlZCBjeWNsZXMgd2lsbCBiZSBpZ25vcmVkIGFzIHRoZXJlIGlzIGEgbm8tb3AgY3ljbGUgaGFuZGxlciByZWdpc3RlcmVkIGJ5IGRlZmF1bHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tcHV0YWJsZSBmdW5jdGlvbiBnZW5lcmF0ZWQgdGhlIG5ldyB2YWx1ZS4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgQ2FjaGUoRnVuY3Rpb248SywgVj4gY29tcHV0YWJsZSkgeworICAgICAgICB0aGlzKGNvbXB1dGFibGUsIChDeWNsZUhhbmRsZXI8Sz4pIEVNUFRZX0hBTkRMRVIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgY2FjaGUgd2l0aCBnaXZlbiBjb21wdXRhYmxlIGFuZCBjeWNsZSBoYW5kbGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbXB1dGFibGUgICBmdW5jdGlvbiBnZW5lcmF0ZWQgdGhlIG5ldyB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gY3ljbGVIYW5kbGVyIGhhbmRsZXIgdXNlZCBpZiB0aGUgdGhyZWFkIGN5Y2xlIGlzIG1ldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2FjaGUoRnVuY3Rpb248SywgVj4gY29tcHV0YWJsZSwgQ3ljbGVIYW5kbGVyPEs+IGN5Y2xlSGFuZGxlcikgeworICAgICAgICB0aGlzLmNvbXB1dGFibGUgPSBjb21wdXRhYmxlOworICAgICAgICB0aGlzLmN5Y2xlSGFuZGxlciA9IGN5Y2xlSGFuZGxlcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgViBhcHBseShmaW5hbCBLIGtleSkgeworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgT3JpZ2luVGhyZWFkQXdhcmVGdXR1cmUgZiA9IGNhY2hlLmdldChrZXkpOworICAgICAgICAgICAgaWYgKGYgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIE9yaWdpblRocmVhZEF3YXJlRnV0dXJlIGZ0ID0gbmV3IE9yaWdpblRocmVhZEF3YXJlRnV0dXJlKGtleSk7CisKKyAgICAgICAgICAgICAgICBmID0gY2FjaGUucHV0SWZBYnNlbnQoa2V5LCBmdCk7CisgICAgICAgICAgICAgICAgaWYgKGYgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmID0gZnQ7CisgICAgICAgICAgICAgICAgICAgIGZ0LnJ1bigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZmluYWwgbG9uZyB0aWQgPSBmLnRocmVhZElkOworICAgICAgICAgICAgICAgIGlmICgodGlkICE9IC0xKSAmJiAoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRJZCgpID09IGYudGhyZWFkSWQpKSB7CisgICAgICAgICAgICAgICAgICAgIGN5Y2xlSGFuZGxlci5oYW5kbGVDeWNsZShrZXkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGYuZ2V0KCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIGNhY2hlLnJlbW92ZShrZXkpOyAgLy8gb3RoZXJ3aXNlIHRoZSBleGNlcHRpb24gd291bGQgYmUgcmVtZW1iZXJlZAorICAgICAgICAgICAgICAgIFRocm93YWJsZSBjYXVzZSA9IGV4LmdldENhdXNlKCk7CisgICAgICAgICAgICAgICAgaWYgKGNhdXNlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY2F1c2UgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKSBjYXVzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oY2F1c2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRW1wdHkgY2FjaGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIGNhY2hlLmNsZWFyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBrZXkgaGFzIGFscmVhZHkgYmVlbiBjYWNoZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5IGl0ZW0ga2V5LgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBnaXZlbiBrZXkgaXMgcHJlc2VudCBpbiB0aGUgY2FjaGUuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoZmluYWwgSyBrZXkpIHsKKyAgICAgICAgcmV0dXJuIGNhY2hlLmNvbnRhaW5zS2V5KGtleSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIGl0ZW0gZnJvbSB0aGUgY2FjaGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5IGl0ZW0ga2V5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZShmaW5hbCBLIGtleSkgeworICAgICAgICBjYWNoZS5yZW1vdmUoa2V5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBjYWNoZQorICAgICAqCisgICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBjYWNoZQorICAgICAqLworICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIGNhY2hlLnNpemUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaG91bGQgYSBjeWNsZSBiZSBkZXRlY3RlZCBkdXJpbmcgY29tcHV0YXRpb24gb2YgYSB2YWx1ZQorICAgICAqIGZvciBnaXZlbiBrZXksIHRoaXMgaW50ZXJmYWNlIGFsbG93cyBjbGllbnQgY29kZSB0byByZWdpc3RlcgorICAgICAqIGEgY2FsbGJhY2sgdGhhdCB3b3VsZCBnZXQgaW52b2tlZCBpbiBzdWNoIGEgY2FzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSA8Sz4gS2V5IHR5cGUuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBDeWNsZUhhbmRsZXI8Sz4geworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGUgY3ljbGUgdGhhdCB3YXMgZGV0ZWN0ZWQgd2hpbGUgY29tcHV0aW5nIGEgY2FjaGUgdmFsdWUKKyAgICAgICAgICogZm9yIGdpdmVuIGtleS4gVGhpcyBtZXRob2Qgd291bGQgdHlwaWNhbGx5IGp1c3QgdGhyb3cgYSBydW50aW1lIGV4Y2VwdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGtleSBpbnN0YW5jZSB0aGF0IGNhdXNlZCB0aGUgY3ljbGUuCisgICAgICAgICAqLworICAgICAgICB2b2lkIGhhbmRsZUN5Y2xlKEsga2V5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgY2xhc3MsIHRoYXQgcmVtZW1iZXJzIHRoZSBmdXR1cmUgdGFzayBvcmlnaW4gdGhyZWFkLCBzbyB0aGF0IGN5Y2xlcyBjb3VsZCBiZSBkZXRlY3RlZC4KKyAgICAgKiBJZiBhbnkgdGhyZWFkIHN0YXJ0cyBjb21wdXRhdGlvbiBmb3IgZ2l2ZW4ga2V5IGFuZCB0aGUgc2FtZSB0aHJlYWQgcmVxdWVzdHMgdGhlIGNvbXB1dGVkIHZhbHVlCisgICAgICogYmVmb3JlIHRoZSBjb21wdXRhdGlvbiBzdG9wcywgYSBjeWNsZSBpcyBkZXRlY3RlZCBhbmQgcmVnaXN0ZXJlZCBjeWNsZSBoYW5kbGVyIGlzIGNhbGxlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIE9yaWdpblRocmVhZEF3YXJlRnV0dXJlIGltcGxlbWVudHMgRnV0dXJlPFY+IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBGdXR1cmVUYXNrPFY+IGZ1dHVyZTsKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBsb25nIHRocmVhZElkOworCisgICAgICAgIE9yaWdpblRocmVhZEF3YXJlRnV0dXJlKEsga2V5KSB7CisgICAgICAgICAgICB0aGlzLnRocmVhZElkID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRJZCgpOworICAgICAgICAgICAgQ2FsbGFibGU8Vj4gZXZhbCA9ICgpIC0+IHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcHV0YWJsZS5hcHBseShrZXkpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIHRocmVhZElkID0gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHRoaXMuZnV0dXJlID0gbmV3IEZ1dHVyZVRhc2s8PihldmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgcmV0dXJuIGZ1dHVyZS5oYXNoQ29kZSgpOworICAgICAgICB9CisKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIE9yaWdpblRocmVhZEF3YXJlRnV0dXJlIG90aGVyID0gKE9yaWdpblRocmVhZEF3YXJlRnV0dXJlKSBvYmo7CisgICAgICAgICAgICBpZiAodGhpcy5mdXR1cmUgIT0gb3RoZXIuZnV0dXJlICYmICh0aGlzLmZ1dHVyZSA9PSBudWxsIHx8ICF0aGlzLmZ1dHVyZS5lcXVhbHMob3RoZXIuZnV0dXJlKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBjYW5jZWwoYm9vbGVhbiBtYXlJbnRlcnJ1cHRJZlJ1bm5pbmcpIHsKKyAgICAgICAgICAgIHJldHVybiBmdXR1cmUuY2FuY2VsKG1heUludGVycnVwdElmUnVubmluZyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDYW5jZWxsZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gZnV0dXJlLmlzQ2FuY2VsbGVkKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEb25lKCkgeworICAgICAgICAgICAgcmV0dXJuIGZ1dHVyZS5pc0RvbmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgViBnZXQoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gZnV0dXJlLmdldCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWIGdldChsb25nIHRpbWVvdXQsIFRpbWVVbml0IHVuaXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uLCBUaW1lb3V0RXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBmdXR1cmUuZ2V0KHRpbWVvdXQsIHVuaXQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgZnV0dXJlLnJ1bigpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL2NvbGxlY3Rpb24vQ2xhc3NUeXBlUGFpci5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL2NvbGxlY3Rpb24vQ2xhc3NUeXBlUGFpci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4YTFjZTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvY29sbGVjdGlvbi9DbGFzc1R5cGVQYWlyLmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb247CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworCisvKioKKyAqIEEgcGFpciBvZiByYXcgY2xhc3MgYW5kIHRoZSByZWxhdGVkIHR5cGUuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIENsYXNzVHlwZVBhaXIgeworCisgICAgcHJpdmF0ZSBmaW5hbCBUeXBlIHR5cGU7CisgICAgcHJpdmF0ZSBmaW5hbCBDbGFzczw/PiByYXdDbGFzczsKKworICAgIHByaXZhdGUgQ2xhc3NUeXBlUGFpcihDbGFzczw/PiBjLCBUeXBlIHQpIHsKKyAgICAgICAgdGhpcy50eXBlID0gdDsKKyAgICAgICAgdGhpcy5yYXdDbGFzcyA9IGM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSByYXcgY2xhc3Mgb2YgdGhlIHtAbGluayAjdHlwZSgpIHR5cGV9LgorICAgICAqCisgICAgICogQHJldHVybiByYXcgY2xhc3Mgb2YgdGhlIHR5cGUuCisgICAgICovCisgICAgcHVibGljIENsYXNzPD8+IHJhd0NsYXNzKCkgeworICAgICAgICByZXR1cm4gcmF3Q2xhc3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBhY3R1YWwgdHlwZSBiZWhpbmQgdGhlIHtAbGluayAjcmF3Q2xhc3MoKSByYXcgY2xhc3N9LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgYWN0dWFsIHR5cGUgYmVoaW5kIHRoZSByYXcgY2xhc3MuCisgICAgICovCisgICAgcHVibGljIFR5cGUgdHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyB0eXBlLWNsYXNzIHBhaXIgZm9yIGEgbm9uLWdlbmVyaWMgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmF3Q2xhc3MgKHJhdykgY2xhc3MgcmVwcmVzZW50aW5nIHRoZSBub24tZ2VuZXJpYyB0eXBlLgorICAgICAqCisgICAgICogQHJldHVybiBuZXcgbm9uLWdlbmVyaWMgdHlwZS1jbGFzcyBwYWlyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3NUeXBlUGFpciBvZihDbGFzczw/PiByYXdDbGFzcykgeworICAgICAgICByZXR1cm4gbmV3IENsYXNzVHlwZVBhaXIocmF3Q2xhc3MsIHJhd0NsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IHR5cGUtY2xhc3MgcGFpci4KKyAgICAgKgorICAgICAqIEBwYXJhbSByYXdDbGFzcyByYXcgY2xhc3MgcmVwcmVzZW50aW5nIHRoZSB0eXBlLgorICAgICAqIEBwYXJhbSB0eXBlIHR5cGUgYmVoaW5kIHRoZSBjbGFzcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbmV3IHR5cGUtY2xhc3MgcGFpci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENsYXNzVHlwZVBhaXIgb2YoQ2xhc3M8Pz4gcmF3Q2xhc3MsIFR5cGUgdHlwZSkgeworICAgICAgICByZXR1cm4gbmV3IENsYXNzVHlwZVBhaXIocmF3Q2xhc3MsIHR5cGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9jb2xsZWN0aW9uL0NvbmN1cnJlbnRIYXNoTWFwVjguamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9jb2xsZWN0aW9uL0NvbmN1cnJlbnRIYXNoTWFwVjguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzQzNWQzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL2NvbGxlY3Rpb24vQ29uY3VycmVudEhhc2hNYXBWOC5qYXZhCkBAIC0wLDAgKzEsMzU0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoqCisgKiBXcml0dGVuIGJ5IERvdWcgTGVhIHdpdGggYXNzaXN0YW5jZSBmcm9tIG1lbWJlcnMgb2YgSkNQIEpTUi0xNjYKKyAqIEV4cGVydCBHcm91cCBhbmQgcmVsZWFzZWQgdG8gdGhlIHB1YmxpYyBkb21haW4sIGFzIGV4cGxhaW5lZCBhdAorICogaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvcHVibGljZG9tYWluL3plcm8vMS4wLworICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbjsKKworaW1wb3J0IGphdmEuaW8uT2JqZWN0U3RyZWFtRmllbGQ7CitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUGFyYW1ldGVyaXplZFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RNYXA7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLkxvY2tTdXBwb3J0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmxvY2tzLlJlZW50cmFudExvY2s7CisKKy8qKgorICogQSBoYXNoIHRhYmxlIHN1cHBvcnRpbmcgZnVsbCBjb25jdXJyZW5jeSBvZiByZXRyaWV2YWxzIGFuZAorICogaGlnaCBleHBlY3RlZCBjb25jdXJyZW5jeSBmb3IgdXBkYXRlcy4gVGhpcyBjbGFzcyBvYmV5cyB0aGUKKyAqIHNhbWUgZnVuY3Rpb25hbCBzcGVjaWZpY2F0aW9uIGFzIHtAbGluayBqYXZhLnV0aWwuSGFzaHRhYmxlfSwgYW5kCisgKiBpbmNsdWRlcyB2ZXJzaW9ucyBvZiBtZXRob2RzIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBtZXRob2Qgb2YKKyAqIHtAY29kZSBIYXNodGFibGV9LiBIb3dldmVyLCBldmVuIHRob3VnaCBhbGwgb3BlcmF0aW9ucyBhcmUKKyAqIHRocmVhZC1zYWZlLCByZXRyaWV2YWwgb3BlcmF0aW9ucyBkbyA8ZW0+bm90PC9lbT4gZW50YWlsIGxvY2tpbmcsCisgKiBhbmQgdGhlcmUgaXMgPGVtPm5vdDwvZW0+IGFueSBzdXBwb3J0IGZvciBsb2NraW5nIHRoZSBlbnRpcmUgdGFibGUKKyAqIGluIGEgd2F5IHRoYXQgcHJldmVudHMgYWxsIGFjY2Vzcy4gIFRoaXMgY2xhc3MgaXMgZnVsbHkKKyAqIGludGVyb3BlcmFibGUgd2l0aCB7QGNvZGUgSGFzaHRhYmxlfSBpbiBwcm9ncmFtcyB0aGF0IHJlbHkgb24gaXRzCisgKiB0aHJlYWQgc2FmZXR5IGJ1dCBub3Qgb24gaXRzIHN5bmNocm9uaXphdGlvbiBkZXRhaWxzLgorICoKKyAqIDxwPlJldHJpZXZhbCBvcGVyYXRpb25zIChpbmNsdWRpbmcge0Bjb2RlIGdldH0pIGdlbmVyYWxseSBkbyBub3QKKyAqIGJsb2NrLCBzbyBtYXkgb3ZlcmxhcCB3aXRoIHVwZGF0ZSBvcGVyYXRpb25zIChpbmNsdWRpbmcge0Bjb2RlIHB1dH0KKyAqIGFuZCB7QGNvZGUgcmVtb3ZlfSkuIFJldHJpZXZhbHMgcmVmbGVjdCB0aGUgcmVzdWx0cyBvZiB0aGUgbW9zdAorICogcmVjZW50bHkgPGVtPmNvbXBsZXRlZDwvZW0+IHVwZGF0ZSBvcGVyYXRpb25zIGhvbGRpbmcgdXBvbiB0aGVpcgorICogb25zZXQuIChNb3JlIGZvcm1hbGx5LCBhbiB1cGRhdGUgb3BlcmF0aW9uIGZvciBhIGdpdmVuIGtleSBiZWFycyBhCisgKiA8ZW0+aGFwcGVucy1iZWZvcmU8L2VtPiByZWxhdGlvbiB3aXRoIGFueSAobm9uLW51bGwpIHJldHJpZXZhbCBmb3IKKyAqIHRoYXQga2V5IHJlcG9ydGluZyB0aGUgdXBkYXRlZCB2YWx1ZS4pICBGb3IgYWdncmVnYXRlIG9wZXJhdGlvbnMKKyAqIHN1Y2ggYXMge0Bjb2RlIHB1dEFsbH0gYW5kIHtAY29kZSBjbGVhcn0sIGNvbmN1cnJlbnQgcmV0cmlldmFscyBtYXkKKyAqIHJlZmxlY3QgaW5zZXJ0aW9uIG9yIHJlbW92YWwgb2Ygb25seSBzb21lIGVudHJpZXMuICBTaW1pbGFybHksCisgKiBJdGVyYXRvcnMgYW5kIEVudW1lcmF0aW9ucyByZXR1cm4gZWxlbWVudHMgcmVmbGVjdGluZyB0aGUgc3RhdGUgb2YKKyAqIHRoZSBoYXNoIHRhYmxlIGF0IHNvbWUgcG9pbnQgYXQgb3Igc2luY2UgdGhlIGNyZWF0aW9uIG9mIHRoZQorICogaXRlcmF0b3IvZW51bWVyYXRpb24uICBUaGV5IGRvIDxlbT5ub3Q8L2VtPiB0aHJvdyB7QGxpbmsKKyAqIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb259LiAgSG93ZXZlciwgaXRlcmF0b3JzIGFyZSBkZXNpZ25lZAorICogdG8gYmUgdXNlZCBieSBvbmx5IG9uZSB0aHJlYWQgYXQgYSB0aW1lLiAgQmVhciBpbiBtaW5kIHRoYXQgdGhlCisgKiByZXN1bHRzIG9mIGFnZ3JlZ2F0ZSBzdGF0dXMgbWV0aG9kcyBpbmNsdWRpbmcge0Bjb2RlIHNpemV9LCB7QGNvZGUKKyAqIGlzRW1wdHl9LCBhbmQge0Bjb2RlIGNvbnRhaW5zVmFsdWV9IGFyZSB0eXBpY2FsbHkgdXNlZnVsIG9ubHkgd2hlbgorICogYSBtYXAgaXMgbm90IHVuZGVyZ29pbmcgY29uY3VycmVudCB1cGRhdGVzIGluIG90aGVyIHRocmVhZHMuCisgKiBPdGhlcndpc2UgdGhlIHJlc3VsdHMgb2YgdGhlc2UgbWV0aG9kcyByZWZsZWN0IHRyYW5zaWVudCBzdGF0ZXMKKyAqIHRoYXQgbWF5IGJlIGFkZXF1YXRlIGZvciBtb25pdG9yaW5nIG9yIGVzdGltYXRpb24gcHVycG9zZXMsIGJ1dCBub3QKKyAqIGZvciBwcm9ncmFtIGNvbnRyb2wuCisgKgorICogPHA+VGhlIHRhYmxlIGlzIGR5bmFtaWNhbGx5IGV4cGFuZGVkIHdoZW4gdGhlcmUgYXJlIHRvbyBtYW55CisgKiBjb2xsaXNpb25zIChpLmUuLCBrZXlzIHRoYXQgaGF2ZSBkaXN0aW5jdCBoYXNoIGNvZGVzIGJ1dCBmYWxsIGludG8KKyAqIHRoZSBzYW1lIHNsb3QgbW9kdWxvIHRoZSB0YWJsZSBzaXplKSwgd2l0aCB0aGUgZXhwZWN0ZWQgYXZlcmFnZQorICogZWZmZWN0IG9mIG1haW50YWluaW5nIHJvdWdobHkgdHdvIGJpbnMgcGVyIG1hcHBpbmcgKGNvcnJlc3BvbmRpbmcKKyAqIHRvIGEgMC43NSBsb2FkIGZhY3RvciB0aHJlc2hvbGQgZm9yIHJlc2l6aW5nKS4gVGhlcmUgbWF5IGJlIG11Y2gKKyAqIHZhcmlhbmNlIGFyb3VuZCB0aGlzIGF2ZXJhZ2UgYXMgbWFwcGluZ3MgYXJlIGFkZGVkIGFuZCByZW1vdmVkLCBidXQKKyAqIG92ZXJhbGwsIHRoaXMgbWFpbnRhaW5zIGEgY29tbW9ubHkgYWNjZXB0ZWQgdGltZS9zcGFjZSB0cmFkZW9mZiBmb3IKKyAqIGhhc2ggdGFibGVzLiAgSG93ZXZlciwgcmVzaXppbmcgdGhpcyBvciBhbnkgb3RoZXIga2luZCBvZiBoYXNoCisgKiB0YWJsZSBtYXkgYmUgYSByZWxhdGl2ZWx5IHNsb3cgb3BlcmF0aW9uLiBXaGVuIHBvc3NpYmxlLCBpdCBpcyBhCisgKiBnb29kIGlkZWEgdG8gcHJvdmlkZSBhIHNpemUgZXN0aW1hdGUgYXMgYW4gb3B0aW9uYWwge0Bjb2RlCisgKiBpbml0aWFsQ2FwYWNpdHl9IGNvbnN0cnVjdG9yIGFyZ3VtZW50LiBBbiBhZGRpdGlvbmFsIG9wdGlvbmFsCisgKiB7QGNvZGUgbG9hZEZhY3Rvcn0gY29uc3RydWN0b3IgYXJndW1lbnQgcHJvdmlkZXMgYSBmdXJ0aGVyIG1lYW5zIG9mCisgKiBjdXN0b21pemluZyBpbml0aWFsIHRhYmxlIGNhcGFjaXR5IGJ5IHNwZWNpZnlpbmcgdGhlIHRhYmxlIGRlbnNpdHkKKyAqIHRvIGJlIHVzZWQgaW4gY2FsY3VsYXRpbmcgdGhlIGFtb3VudCBvZiBzcGFjZSB0byBhbGxvY2F0ZSBmb3IgdGhlCisgKiBnaXZlbiBudW1iZXIgb2YgZWxlbWVudHMuICBBbHNvLCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHByZXZpb3VzCisgKiB2ZXJzaW9ucyBvZiB0aGlzIGNsYXNzLCBjb25zdHJ1Y3RvcnMgbWF5IG9wdGlvbmFsbHkgc3BlY2lmeSBhbgorICogZXhwZWN0ZWQge0Bjb2RlIGNvbmN1cnJlbmN5TGV2ZWx9IGFzIGFuIGFkZGl0aW9uYWwgaGludCBmb3IKKyAqIGludGVybmFsIHNpemluZy4gIE5vdGUgdGhhdCB1c2luZyBtYW55IGtleXMgd2l0aCBleGFjdGx5IHRoZSBzYW1lCisgKiB7QGNvZGUgaGFzaENvZGUoKX0gaXMgYSBzdXJlIHdheSB0byBzbG93IGRvd24gcGVyZm9ybWFuY2Ugb2YgYW55CisgKiBoYXNoIHRhYmxlLiBUbyBhbWVsaW9yYXRlIGltcGFjdCwgd2hlbiBrZXlzIGFyZSB7QGxpbmsgQ29tcGFyYWJsZX0sCisgKiB0aGlzIGNsYXNzIG1heSB1c2UgY29tcGFyaXNvbiBvcmRlciBhbW9uZyBrZXlzIHRvIGhlbHAgYnJlYWsgdGllcy4KKyAqCisgKiA8cD5BIHtAbGluayBTZXR9IHByb2plY3Rpb24gb2YgYSBDb25jdXJyZW50SGFzaE1hcFY4IG1heSBiZSBjcmVhdGVkCisgKiAodXNpbmcge0BsaW5rICNuZXdLZXlTZXQoKX0gb3Ige0BsaW5rICNuZXdLZXlTZXQoaW50KX0pLCBvciB2aWV3ZWQKKyAqICh1c2luZyB7QGxpbmsgI2tleVNldChPYmplY3QpfSB3aGVuIG9ubHkga2V5cyBhcmUgb2YgaW50ZXJlc3QsIGFuZCB0aGUKKyAqIG1hcHBlZCB2YWx1ZXMgYXJlIChwZXJoYXBzIHRyYW5zaWVudGx5KSBub3QgdXNlZCBvciBhbGwgdGFrZSB0aGUKKyAqIHNhbWUgbWFwcGluZyB2YWx1ZS4KKyAqCisgKiA8cD5UaGlzIGNsYXNzIGFuZCBpdHMgdmlld3MgYW5kIGl0ZXJhdG9ycyBpbXBsZW1lbnQgYWxsIG9mIHRoZQorICogPGVtPm9wdGlvbmFsPC9lbT4gbWV0aG9kcyBvZiB0aGUge0BsaW5rIE1hcH0gYW5kIHtAbGluayBJdGVyYXRvcn0KKyAqIGludGVyZmFjZXMuCisgKgorICogPHA+TGlrZSB7QGxpbmsgamF2YS51dGlsLkhhc2h0YWJsZX0gYnV0IHVubGlrZSB7QGxpbmsgSGFzaE1hcH0sIHRoaXMgY2xhc3MKKyAqIGRvZXMgPGVtPm5vdDwvZW0+IGFsbG93IHtAY29kZSBudWxsfSB0byBiZSB1c2VkIGFzIGEga2V5IG9yIHZhbHVlLgorICoKKyAqIDxwPkNvbmN1cnJlbnRIYXNoTWFwVjhzIHN1cHBvcnQgYSBzZXQgb2Ygc2VxdWVudGlhbCBhbmQgcGFyYWxsZWwgYnVsaworICogb3BlcmF0aW9ucyB0aGF0IGFyZSBkZXNpZ25lZAorICogdG8gYmUgc2FmZWx5LCBhbmQgb2Z0ZW4gc2Vuc2libHksIGFwcGxpZWQgZXZlbiB3aXRoIG1hcHMgdGhhdCBhcmUKKyAqIGJlaW5nIGNvbmN1cnJlbnRseSB1cGRhdGVkIGJ5IG90aGVyIHRocmVhZHM7IGZvciBleGFtcGxlLCB3aGVuCisgKiBjb21wdXRpbmcgYSBzbmFwc2hvdCBzdW1tYXJ5IG9mIHRoZSB2YWx1ZXMgaW4gYSBzaGFyZWQgcmVnaXN0cnkuCisgKiBUaGVyZSBhcmUgdGhyZWUga2luZHMgb2Ygb3BlcmF0aW9uLCBlYWNoIHdpdGggZm91ciBmb3JtcywgYWNjZXB0aW5nCisgKiBmdW5jdGlvbnMgd2l0aCBLZXlzLCBWYWx1ZXMsIEVudHJpZXMsIGFuZCAoS2V5LCBWYWx1ZSkgYXJndW1lbnRzCisgKiBhbmQvb3IgcmV0dXJuIHZhbHVlcy4gQmVjYXVzZSB0aGUgZWxlbWVudHMgb2YgYSBDb25jdXJyZW50SGFzaE1hcFY4CisgKiBhcmUgbm90IG9yZGVyZWQgaW4gYW55IHBhcnRpY3VsYXIgd2F5LCBhbmQgbWF5IGJlIHByb2Nlc3NlZCBpbgorICogZGlmZmVyZW50IG9yZGVycyBpbiBkaWZmZXJlbnQgcGFyYWxsZWwgZXhlY3V0aW9ucywgdGhlIGNvcnJlY3RuZXNzCisgKiBvZiBzdXBwbGllZCBmdW5jdGlvbnMgc2hvdWxkIG5vdCBkZXBlbmQgb24gYW55IG9yZGVyaW5nLCBvciBvbiBhbnkKKyAqIG90aGVyIG9iamVjdHMgb3IgdmFsdWVzIHRoYXQgbWF5IHRyYW5zaWVudGx5IGNoYW5nZSB3aGlsZQorICogY29tcHV0YXRpb24gaXMgaW4gcHJvZ3Jlc3M7IGFuZCBleGNlcHQgZm9yIGZvckVhY2ggYWN0aW9ucywgc2hvdWxkCisgKiBpZGVhbGx5IGJlIHNpZGUtZWZmZWN0LWZyZWUuIEJ1bGsgb3BlcmF0aW9ucyBvbiB7QGxpbmsgamF2YS51dGlsLk1hcC5FbnRyeX0KKyAqIG9iamVjdHMgZG8gbm90IHN1cHBvcnQgbWV0aG9kIHtAY29kZSBzZXRWYWx1ZX0uCisgKgorICogPHVsPgorICogPGxpPiBmb3JFYWNoOiBQZXJmb3JtIGEgZ2l2ZW4gYWN0aW9uIG9uIGVhY2ggZWxlbWVudC4KKyAqIEEgdmFyaWFudCBmb3JtIGFwcGxpZXMgYSBnaXZlbiB0cmFuc2Zvcm1hdGlvbiBvbiBlYWNoIGVsZW1lbnQKKyAqIGJlZm9yZSBwZXJmb3JtaW5nIHRoZSBhY3Rpb24uPC9saT4KKyAqCisgKiA8bGk+IHNlYXJjaDogUmV0dXJuIHRoZSBmaXJzdCBhdmFpbGFibGUgbm9uLW51bGwgcmVzdWx0IG9mCisgKiBhcHBseWluZyBhIGdpdmVuIGZ1bmN0aW9uIG9uIGVhY2ggZWxlbWVudDsgc2tpcHBpbmcgZnVydGhlcgorICogc2VhcmNoIHdoZW4gYSByZXN1bHQgaXMgZm91bmQuPC9saT4KKyAqCisgKiA8bGk+IHJlZHVjZTogQWNjdW11bGF0ZSBlYWNoIGVsZW1lbnQuICBUaGUgc3VwcGxpZWQgcmVkdWN0aW9uCisgKiBmdW5jdGlvbiBjYW5ub3QgcmVseSBvbiBvcmRlcmluZyAobW9yZSBmb3JtYWxseSwgaXQgc2hvdWxkIGJlCisgKiBib3RoIGFzc29jaWF0aXZlIGFuZCBjb21tdXRhdGl2ZSkuICBUaGVyZSBhcmUgZml2ZSB2YXJpYW50czoKKyAqCisgKiA8dWw+CisgKgorICogPGxpPiBQbGFpbiByZWR1Y3Rpb25zLiAoVGhlcmUgaXMgbm90IGEgZm9ybSBvZiB0aGlzIG1ldGhvZCBmb3IKKyAqIChrZXksIHZhbHVlKSBmdW5jdGlvbiBhcmd1bWVudHMgc2luY2UgdGhlcmUgaXMgbm8gY29ycmVzcG9uZGluZworICogcmV0dXJuIHR5cGUuKTwvbGk+CisgKgorICogPGxpPiBNYXBwZWQgcmVkdWN0aW9ucyB0aGF0IGFjY3VtdWxhdGUgdGhlIHJlc3VsdHMgb2YgYSBnaXZlbgorICogZnVuY3Rpb24gYXBwbGllZCB0byBlYWNoIGVsZW1lbnQuPC9saT4KKyAqCisgKiA8bGk+IFJlZHVjdGlvbnMgdG8gc2NhbGFyIGRvdWJsZXMsIGxvbmdzLCBhbmQgaW50cywgdXNpbmcgYQorICogZ2l2ZW4gYmFzaXMgdmFsdWUuPC9saT4KKyAqCisgKiA8L3VsPgorICogPC9saT4KKyAqIDwvdWw+CisgKgorICogPHA+VGhlc2UgYnVsayBvcGVyYXRpb25zIGFjY2VwdCBhIHtAY29kZSBwYXJhbGxlbGlzbVRocmVzaG9sZH0KKyAqIGFyZ3VtZW50LiBNZXRob2RzIHByb2NlZWQgc2VxdWVudGlhbGx5IGlmIHRoZSBjdXJyZW50IG1hcCBzaXplIGlzCisgKiBlc3RpbWF0ZWQgdG8gYmUgbGVzcyB0aGFuIHRoZSBnaXZlbiB0aHJlc2hvbGQuIFVzaW5nIGEgdmFsdWUgb2YKKyAqIHtAY29kZSBMb25nLk1BWF9WQUxVRX0gc3VwcHJlc3NlcyBhbGwgcGFyYWxsZWxpc20uICBVc2luZyBhIHZhbHVlCisgKiBvZiB7QGNvZGUgMX0gcmVzdWx0cyBpbiBtYXhpbWFsIHBhcmFsbGVsaXNtIGJ5IHBhcnRpdGlvbmluZyBpbnRvCisgKiBlbm91Z2ggc3VidGFza3MgdG8gZnVsbHkgdXRpbGl6ZSB0aGUge0Bjb2RlCisgKiBGb3JrSm9pblBvb2wjY29tbW9uUG9vbCgpfSB0aGF0IGlzIHVzZWQgZm9yIGFsbCBwYXJhbGxlbAorICogY29tcHV0YXRpb25zLiBOb3JtYWxseSwgeW91IHdvdWxkIGluaXRpYWxseSBjaG9vc2Ugb25lIG9mIHRoZXNlCisgKiBleHRyZW1lIHZhbHVlcywgYW5kIHRoZW4gbWVhc3VyZSBwZXJmb3JtYW5jZSBvZiB1c2luZyBpbi1iZXR3ZWVuCisgKiB2YWx1ZXMgdGhhdCB0cmFkZSBvZmYgb3ZlcmhlYWQgdmVyc3VzIHRocm91Z2hwdXQuCisgKgorICogPHA+VGhlIGNvbmN1cnJlbmN5IHByb3BlcnRpZXMgb2YgYnVsayBvcGVyYXRpb25zIGZvbGxvdworICogZnJvbSB0aG9zZSBvZiBDb25jdXJyZW50SGFzaE1hcFY4OiBBbnkgbm9uLW51bGwgcmVzdWx0IHJldHVybmVkCisgKiBmcm9tIHtAY29kZSBnZXQoa2V5KX0gYW5kIHJlbGF0ZWQgYWNjZXNzIG1ldGhvZHMgYmVhcnMgYQorICogaGFwcGVucy1iZWZvcmUgcmVsYXRpb24gd2l0aCB0aGUgYXNzb2NpYXRlZCBpbnNlcnRpb24gb3IKKyAqIHVwZGF0ZS4gIFRoZSByZXN1bHQgb2YgYW55IGJ1bGsgb3BlcmF0aW9uIHJlZmxlY3RzIHRoZQorICogY29tcG9zaXRpb24gb2YgdGhlc2UgcGVyLWVsZW1lbnQgcmVsYXRpb25zIChidXQgaXMgbm90CisgKiBuZWNlc3NhcmlseSBhdG9taWMgd2l0aCByZXNwZWN0IHRvIHRoZSBtYXAgYXMgYSB3aG9sZSB1bmxlc3MgaXQKKyAqIGlzIHNvbWVob3cga25vd24gdG8gYmUgcXVpZXNjZW50KS4gIENvbnZlcnNlbHksIGJlY2F1c2Uga2V5cworICogYW5kIHZhbHVlcyBpbiB0aGUgbWFwIGFyZSBuZXZlciBudWxsLCBudWxsIHNlcnZlcyBhcyBhIHJlbGlhYmxlCisgKiBhdG9taWMgaW5kaWNhdG9yIG9mIHRoZSBjdXJyZW50IGxhY2sgb2YgYW55IHJlc3VsdC4gIFRvCisgKiBtYWludGFpbiB0aGlzIHByb3BlcnR5LCBudWxsIHNlcnZlcyBhcyBhbiBpbXBsaWNpdCBiYXNpcyBmb3IKKyAqIGFsbCBub24tc2NhbGFyIHJlZHVjdGlvbiBvcGVyYXRpb25zLiBGb3IgdGhlIGRvdWJsZSwgbG9uZywgYW5kCisgKiBpbnQgdmVyc2lvbnMsIHRoZSBiYXNpcyBzaG91bGQgYmUgb25lIHRoYXQsIHdoZW4gY29tYmluZWQgd2l0aAorICogYW55IG90aGVyIHZhbHVlLCByZXR1cm5zIHRoYXQgb3RoZXIgdmFsdWUgKG1vcmUgZm9ybWFsbHksIGl0CisgKiBzaG91bGQgYmUgdGhlIGlkZW50aXR5IGVsZW1lbnQgZm9yIHRoZSByZWR1Y3Rpb24pLiBNb3N0IGNvbW1vbgorICogcmVkdWN0aW9ucyBoYXZlIHRoZXNlIHByb3BlcnRpZXM7IGZvciBleGFtcGxlLCBjb21wdXRpbmcgYSBzdW0KKyAqIHdpdGggYmFzaXMgMCBvciBhIG1pbmltdW0gd2l0aCBiYXNpcyBNQVhfVkFMVUUuCisgKgorICogPHA+U2VhcmNoIGFuZCB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbnMgcHJvdmlkZWQgYXMgYXJndW1lbnRzCisgKiBzaG91bGQgc2ltaWxhcmx5IHJldHVybiBudWxsIHRvIGluZGljYXRlIHRoZSBsYWNrIG9mIGFueSByZXN1bHQKKyAqIChpbiB3aGljaCBjYXNlIGl0IGlzIG5vdCB1c2VkKS4gSW4gdGhlIGNhc2Ugb2YgbWFwcGVkCisgKiByZWR1Y3Rpb25zLCB0aGlzIGFsc28gZW5hYmxlcyB0cmFuc2Zvcm1hdGlvbnMgdG8gc2VydmUgYXMKKyAqIGZpbHRlcnMsIHJldHVybmluZyBudWxsIChvciwgaW4gdGhlIGNhc2Ugb2YgcHJpbWl0aXZlCisgKiBzcGVjaWFsaXphdGlvbnMsIHRoZSBpZGVudGl0eSBiYXNpcykgaWYgdGhlIGVsZW1lbnQgc2hvdWxkIG5vdAorICogYmUgY29tYmluZWQuIFlvdSBjYW4gY3JlYXRlIGNvbXBvdW5kIHRyYW5zZm9ybWF0aW9ucyBhbmQKKyAqIGZpbHRlcmluZ3MgYnkgY29tcG9zaW5nIHRoZW0geW91cnNlbGYgdW5kZXIgdGhpcyAibnVsbCBtZWFucworICogdGhlcmUgaXMgbm90aGluZyB0aGVyZSBub3ciIHJ1bGUgYmVmb3JlIHVzaW5nIHRoZW0gaW4gc2VhcmNoIG9yCisgKiByZWR1Y2Ugb3BlcmF0aW9ucy4KKyAqCisgKiA8cD5NZXRob2RzIGFjY2VwdGluZyBhbmQvb3IgcmV0dXJuaW5nIEVudHJ5IGFyZ3VtZW50cyBtYWludGFpbgorICoga2V5LXZhbHVlIGFzc29jaWF0aW9ucy4gVGhleSBtYXkgYmUgdXNlZnVsIGZvciBleGFtcGxlIHdoZW4KKyAqIGZpbmRpbmcgdGhlIGtleSBmb3IgdGhlIGdyZWF0ZXN0IHZhbHVlLiBOb3RlIHRoYXQgInBsYWluIiBFbnRyeQorICogYXJndW1lbnRzIGNhbiBiZSBzdXBwbGllZCB1c2luZyB7QGNvZGUgbmV3CisgKiBBYnN0cmFjdE1hcC5TaW1wbGVFbnRyeShrLHYpfS4KKyAqCisgKiA8cD5CdWxrIG9wZXJhdGlvbnMgbWF5IGNvbXBsZXRlIGFicnVwdGx5LCB0aHJvd2luZyBhbgorICogZXhjZXB0aW9uIGVuY291bnRlcmVkIGluIHRoZSBhcHBsaWNhdGlvbiBvZiBhIHN1cHBsaWVkCisgKiBmdW5jdGlvbi4gQmVhciBpbiBtaW5kIHdoZW4gaGFuZGxpbmcgc3VjaCBleGNlcHRpb25zIHRoYXQgb3RoZXIKKyAqIGNvbmN1cnJlbnRseSBleGVjdXRpbmcgZnVuY3Rpb25zIGNvdWxkIGFsc28gaGF2ZSB0aHJvd24KKyAqIGV4Y2VwdGlvbnMsIG9yIHdvdWxkIGhhdmUgZG9uZSBzbyBpZiB0aGUgZmlyc3QgZXhjZXB0aW9uIGhhZAorICogbm90IG9jY3VycmVkLgorICoKKyAqIDxwPlNwZWVkdXBzIGZvciBwYXJhbGxlbCBjb21wYXJlZCB0byBzZXF1ZW50aWFsIGZvcm1zIGFyZSBjb21tb24KKyAqIGJ1dCBub3QgZ3VhcmFudGVlZC4gIFBhcmFsbGVsIG9wZXJhdGlvbnMgaW52b2x2aW5nIGJyaWVmIGZ1bmN0aW9ucworICogb24gc21hbGwgbWFwcyBtYXkgZXhlY3V0ZSBtb3JlIHNsb3dseSB0aGFuIHNlcXVlbnRpYWwgZm9ybXMgaWYgdGhlCisgKiB1bmRlcmx5aW5nIHdvcmsgdG8gcGFyYWxsZWxpemUgdGhlIGNvbXB1dGF0aW9uIGlzIG1vcmUgZXhwZW5zaXZlCisgKiB0aGFuIHRoZSBjb21wdXRhdGlvbiBpdHNlbGYuICBTaW1pbGFybHksIHBhcmFsbGVsaXphdGlvbiBtYXkgbm90CisgKiBsZWFkIHRvIG11Y2ggYWN0dWFsIHBhcmFsbGVsaXNtIGlmIGFsbCBwcm9jZXNzb3JzIGFyZSBidXN5CisgKiBwZXJmb3JtaW5nIHVucmVsYXRlZCB0YXNrcy4KKyAqCisgKiA8cD5BbGwgYXJndW1lbnRzIHRvIGFsbCB0YXNrIG1ldGhvZHMgbXVzdCBiZSBub24tbnVsbC4KKyAqCisgKiA8cD48ZW0+anNyMTY2ZSBub3RlOiBEdXJpbmcgdHJhbnNpdGlvbiwgdGhpcyBjbGFzcworICogdXNlcyBuZXN0ZWQgZnVuY3Rpb25hbCBpbnRlcmZhY2VzIHdpdGggZGlmZmVyZW50IG5hbWVzIGJ1dCB0aGUKKyAqIHNhbWUgZm9ybXMgYXMgdGhvc2UgZXhwZWN0ZWQgZm9yIEpESzguPC9lbT4KKyAqCisgKiA8cD5UaGlzIGNsYXNzIGlzIGEgbWVtYmVyIG9mIHRoZQorICogPGEgaHJlZj0ie0Bkb2NSb290fS8uLi90ZWNobm90ZXMvZ3VpZGVzL2NvbGxlY3Rpb25zL2luZGV4Lmh0bWwiPgorICogSmF2YSBDb2xsZWN0aW9ucyBGcmFtZXdvcms8L2E+LgorICoKKyAqIEBwYXJhbSA8Sz4gdGhlIHR5cGUgb2Yga2V5cyBtYWludGFpbmVkIGJ5IHRoaXMgbWFwCisgKiBAcGFyYW0gPFY+IHRoZSB0eXBlIG9mIG1hcHBlZCB2YWx1ZXMKKyAqIEBhdXRob3IgRG91ZyBMZWEKKyAqLworY2xhc3MgQ29uY3VycmVudEhhc2hNYXBWODxLLCBWPiBleHRlbmRzIEFic3RyYWN0TWFwPEssIFY+CisgICAgICAgIGltcGxlbWVudHMgQ29uY3VycmVudE1hcDxLLCBWPiwgU2VyaWFsaXphYmxlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA3MjQ5MDY5MjQ2NzYzMTgyMzk3TDsKKworICAgIC8qCisgICAgICogT3ZlcnZpZXc6CisgICAgICoKKyAgICAgKiBUaGUgcHJpbWFyeSBkZXNpZ24gZ29hbCBvZiB0aGlzIGhhc2ggdGFibGUgaXMgdG8gbWFpbnRhaW4KKyAgICAgKiBjb25jdXJyZW50IHJlYWRhYmlsaXR5ICh0eXBpY2FsbHkgbWV0aG9kIGdldCgpLCBidXQgYWxzbworICAgICAqIGl0ZXJhdG9ycyBhbmQgcmVsYXRlZCBtZXRob2RzKSB3aGlsZSBtaW5pbWl6aW5nIHVwZGF0ZQorICAgICAqIGNvbnRlbnRpb24uIFNlY29uZGFyeSBnb2FscyBhcmUgdG8ga2VlcCBzcGFjZSBjb25zdW1wdGlvbiBhYm91dAorICAgICAqIHRoZSBzYW1lIG9yIGJldHRlciB0aGFuIGphdmEudXRpbC5IYXNoTWFwLCBhbmQgdG8gc3VwcG9ydCBoaWdoCisgICAgICogaW5pdGlhbCBpbnNlcnRpb24gcmF0ZXMgb24gYW4gZW1wdHkgdGFibGUgYnkgbWFueSB0aHJlYWRzLgorICAgICAqCisgICAgICogVGhpcyBtYXAgdXN1YWxseSBhY3RzIGFzIGEgYmlubmVkIChidWNrZXRlZCkgaGFzaCB0YWJsZS4gIEVhY2gKKyAgICAgKiBrZXktdmFsdWUgbWFwcGluZyBpcyBoZWxkIGluIGEgTm9kZS4gIE1vc3Qgbm9kZXMgYXJlIGluc3RhbmNlcworICAgICAqIG9mIHRoZSBiYXNpYyBOb2RlIGNsYXNzIHdpdGggaGFzaCwga2V5LCB2YWx1ZSwgYW5kIG5leHQKKyAgICAgKiBmaWVsZHMuIEhvd2V2ZXIsIHZhcmlvdXMgc3ViY2xhc3NlcyBleGlzdDogVHJlZU5vZGVzIGFyZQorICAgICAqIGFycmFuZ2VkIGluIGJhbGFuY2VkIHRyZWVzLCBub3QgbGlzdHMuICBUcmVlQmlucyBob2xkIHRoZSByb290cworICAgICAqIG9mIHNldHMgb2YgVHJlZU5vZGVzLiBGb3J3YXJkaW5nTm9kZXMgYXJlIHBsYWNlZCBhdCB0aGUgaGVhZHMKKyAgICAgKiBvZiBiaW5zIGR1cmluZyByZXNpemluZy4gUmVzZXJ2YXRpb25Ob2RlcyBhcmUgdXNlZCBhcworICAgICAqIHBsYWNlaG9sZGVycyB3aGlsZSBlc3RhYmxpc2hpbmcgdmFsdWVzIGluIGNvbXB1dGVJZkFic2VudCBhbmQKKyAgICAgKiByZWxhdGVkIG1ldGhvZHMuICBUaGUgdHlwZXMgVHJlZUJpbiwgRm9yd2FyZGluZ05vZGUsIGFuZAorICAgICAqIFJlc2VydmF0aW9uTm9kZSBkbyBub3QgaG9sZCBub3JtYWwgdXNlciBrZXlzLCB2YWx1ZXMsIG9yCisgICAgICogaGFzaGVzLCBhbmQgYXJlIHJlYWRpbHkgZGlzdGluZ3Vpc2hhYmxlIGR1cmluZyBzZWFyY2ggZXRjCisgICAgICogYmVjYXVzZSB0aGV5IGhhdmUgbmVnYXRpdmUgaGFzaCBmaWVsZHMgYW5kIG51bGwga2V5IGFuZCB2YWx1ZQorICAgICAqIGZpZWxkcy4gKFRoZXNlIHNwZWNpYWwgbm9kZXMgYXJlIGVpdGhlciB1bmNvbW1vbiBvciB0cmFuc2llbnQsCisgICAgICogc28gdGhlIGltcGFjdCBvZiBjYXJyeWluZyBhcm91bmQgc29tZSB1bnVzZWQgZmllbGRzIGlzCisgICAgICogaW5zaWduaWZpY2FudC4pCisgICAgICoKKyAgICAgKiBUaGUgdGFibGUgaXMgbGF6aWx5IGluaXRpYWxpemVkIHRvIGEgcG93ZXItb2YtdHdvIHNpemUgdXBvbiB0aGUKKyAgICAgKiBmaXJzdCBpbnNlcnRpb24uICBFYWNoIGJpbiBpbiB0aGUgdGFibGUgbm9ybWFsbHkgY29udGFpbnMgYQorICAgICAqIGxpc3Qgb2YgTm9kZXMgKG1vc3Qgb2Z0ZW4sIHRoZSBsaXN0IGhhcyBvbmx5IHplcm8gb3Igb25lIE5vZGUpLgorICAgICAqIFRhYmxlIGFjY2Vzc2VzIHJlcXVpcmUgdm9sYXRpbGUvYXRvbWljIHJlYWRzLCB3cml0ZXMsIGFuZAorICAgICAqIENBU2VzLiAgQmVjYXVzZSB0aGVyZSBpcyBubyBvdGhlciB3YXkgdG8gYXJyYW5nZSB0aGlzIHdpdGhvdXQKKyAgICAgKiBhZGRpbmcgZnVydGhlciBpbmRpcmVjdGlvbnMsIHdlIHVzZSBpbnRyaW5zaWNzCisgICAgICogKHN1bi5taXNjLlVuc2FmZSkgb3BlcmF0aW9ucy4KKyAgICAgKgorICAgICAqIFdlIHVzZSB0aGUgdG9wIChzaWduKSBiaXQgb2YgTm9kZSBoYXNoIGZpZWxkcyBmb3IgY29udHJvbAorICAgICAqIHB1cnBvc2VzIC0tIGl0IGlzIGF2YWlsYWJsZSBhbnl3YXkgYmVjYXVzZSBvZiBhZGRyZXNzaW5nCisgICAgICogY29uc3RyYWludHMuICBOb2RlcyB3aXRoIG5lZ2F0aXZlIGhhc2ggZmllbGRzIGFyZSBzcGVjaWFsbHkKKyAgICAgKiBoYW5kbGVkIG9yIGlnbm9yZWQgaW4gbWFwIG1ldGhvZHMuCisgICAgICoKKyAgICAgKiBJbnNlcnRpb24gKHZpYSBwdXQgb3IgaXRzIHZhcmlhbnRzKSBvZiB0aGUgZmlyc3Qgbm9kZSBpbiBhbgorICAgICAqIGVtcHR5IGJpbiBpcyBwZXJmb3JtZWQgYnkganVzdCBDQVNpbmcgaXQgdG8gdGhlIGJpbi4gIFRoaXMgaXMKKyAgICAgKiBieSBmYXIgdGhlIG1vc3QgY29tbW9uIGNhc2UgZm9yIHB1dCBvcGVyYXRpb25zIHVuZGVyIG1vc3QKKyAgICAgKiBrZXkvaGFzaCBkaXN0cmlidXRpb25zLiAgT3RoZXIgdXBkYXRlIG9wZXJhdGlvbnMgKGluc2VydCwKKyAgICAgKiBkZWxldGUsIGFuZCByZXBsYWNlKSByZXF1aXJlIGxvY2tzLiAgV2UgZG8gbm90IHdhbnQgdG8gd2FzdGUKKyAgICAgKiB0aGUgc3BhY2UgcmVxdWlyZWQgdG8gYXNzb2NpYXRlIGEgZGlzdGluY3QgbG9jayBvYmplY3Qgd2l0aAorICAgICAqIGVhY2ggYmluLCBzbyBpbnN0ZWFkIHVzZSB0aGUgZmlyc3Qgbm9kZSBvZiBhIGJpbiBsaXN0IGl0c2VsZiBhcworICAgICAqIGEgbG9jay4gTG9ja2luZyBzdXBwb3J0IGZvciB0aGVzZSBsb2NrcyByZWxpZXMgb24gYnVpbHRpbgorICAgICAqICJzeW5jaHJvbml6ZWQiIG1vbml0b3JzLgorICAgICAqCisgICAgICogVXNpbmcgdGhlIGZpcnN0IG5vZGUgb2YgYSBsaXN0IGFzIGEgbG9jayBkb2VzIG5vdCBieSBpdHNlbGYKKyAgICAgKiBzdWZmaWNlIHRob3VnaDogV2hlbiBhIG5vZGUgaXMgbG9ja2VkLCBhbnkgdXBkYXRlIG11c3QgZmlyc3QKKyAgICAgKiB2YWxpZGF0ZSB0aGF0IGl0IGlzIHN0aWxsIHRoZSBmaXJzdCBub2RlIGFmdGVyIGxvY2tpbmcgaXQsIGFuZAorICAgICAqIHJldHJ5IGlmIG5vdC4gQmVjYXVzZSBuZXcgbm9kZXMgYXJlIGFsd2F5cyBhcHBlbmRlZCB0byBsaXN0cywKKyAgICAgKiBvbmNlIGEgbm9kZSBpcyBmaXJzdCBpbiBhIGJpbiwgaXQgcmVtYWlucyBmaXJzdCB1bnRpbCBkZWxldGVkCisgICAgICogb3IgdGhlIGJpbiBiZWNvbWVzIGludmFsaWRhdGVkICh1cG9uIHJlc2l6aW5nKS4KKyAgICAgKgorICAgICAqIFRoZSBtYWluIGRpc2FkdmFudGFnZSBvZiBwZXItYmluIGxvY2tzIGlzIHRoYXQgb3RoZXIgdXBkYXRlCisgICAgICogb3BlcmF0aW9ucyBvbiBvdGhlciBub2RlcyBpbiBhIGJpbiBsaXN0IHByb3RlY3RlZCBieSB0aGUgc2FtZQorICAgICAqIGxvY2sgY2FuIHN0YWxsLCBmb3IgZXhhbXBsZSB3aGVuIHVzZXIgZXF1YWxzKCkgb3IgbWFwcGluZworICAgICAqIGZ1bmN0aW9ucyB0YWtlIGEgbG9uZyB0aW1lLiAgSG93ZXZlciwgc3RhdGlzdGljYWxseSwgdW5kZXIKKyAgICAgKiByYW5kb20gaGFzaCBjb2RlcywgdGhpcyBpcyBub3QgYSBjb21tb24gcHJvYmxlbS4gIElkZWFsbHksIHRoZQorICAgICAqIGZyZXF1ZW5jeSBvZiBub2RlcyBpbiBiaW5zIGZvbGxvd3MgYSBQb2lzc29uIGRpc3RyaWJ1dGlvbgorICAgICAqIChodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1BvaXNzb25fZGlzdHJpYnV0aW9uKSB3aXRoIGEKKyAgICAgKiBwYXJhbWV0ZXIgb2YgYWJvdXQgMC41IG9uIGF2ZXJhZ2UsIGdpdmVuIHRoZSByZXNpemluZyB0aHJlc2hvbGQKKyAgICAgKiBvZiAwLjc1LCBhbHRob3VnaCB3aXRoIGEgbGFyZ2UgdmFyaWFuY2UgYmVjYXVzZSBvZiByZXNpemluZworICAgICAqIGdyYW51bGFyaXR5LiBJZ25vcmluZyB2YXJpYW5jZSwgdGhlIGV4cGVjdGVkIG9jY3VycmVuY2VzIG9mCisgICAgICogbGlzdCBzaXplIGsgYXJlIChleHAoLTAuNSkgKiBwb3coMC41LCBrKSAvIGZhY3RvcmlhbChrKSkuIFRoZQorICAgICAqIGZpcnN0IHZhbHVlcyBhcmU6CisgICAgICoKKyAgICAgKiAwOiAgICAwLjYwNjUzMDY2CisgICAgICogMTogICAgMC4zMDMyNjUzMworICAgICAqIDI6ICAgIDAuMDc1ODE2MzMKKyAgICAgKiAzOiAgICAwLjAxMjYzNjA2CisgICAgICogNDogICAgMC4wMDE1Nzk1MgorICAgICAqIDU6ICAgIDAuMDAwMTU3OTUKKyAgICAgKiA2OiAgICAwLjAwMDAxMzE2CisgICAgICogNzogICAgMC4wMDAwMDA5NAorICAgICAqIDg6ICAgIDAuMDAwMDAwMDYKKyAgICAgKiBtb3JlOiBsZXNzIHRoYW4gMSBpbiB0ZW4gbWlsbGlvbgorICAgICAqCisgICAgICogTG9jayBjb250ZW50aW9uIHByb2JhYmlsaXR5IGZvciB0d28gdGhyZWFkcyBhY2Nlc3NpbmcgZGlzdGluY3QKKyAgICAgKiBlbGVtZW50cyBpcyByb3VnaGx5IDEgLyAoOCAqICNlbGVtZW50cykgdW5kZXIgcmFuZG9tIGhhc2hlcy4KKyAgICAgKgorICAgICAqIEFjdHVhbCBoYXNoIGNvZGUgZGlzdHJpYnV0aW9ucyBlbmNvdW50ZXJlZCBpbiBwcmFjdGljZQorICAgICAqIHNvbWV0aW1lcyBkZXZpYXRlIHNpZ25pZmljYW50bHkgZnJvbSB1bmlmb3JtIHJhbmRvbW5lc3MuICBUaGlzCisgICAgICogaW5jbHVkZXMgdGhlIGNhc2Ugd2hlbiBOID4gKDE8PDMwKSwgc28gc29tZSBrZXlzIE1VU1QgY29sbGlkZS4KKyAgICAgKiBTaW1pbGFybHkgZm9yIGR1bWIgb3IgaG9zdGlsZSB1c2FnZXMgaW4gd2hpY2ggbXVsdGlwbGUga2V5cyBhcmUKKyAgICAgKiBkZXNpZ25lZCB0byBoYXZlIGlkZW50aWNhbCBoYXNoIGNvZGVzIG9yIG9uZXMgdGhhdCBkaWZmZXJzIG9ubHkKKyAgICAgKiBpbiBtYXNrZWQtb3V0IGhpZ2ggYml0cy4gU28gd2UgdXNlIGEgc2Vjb25kYXJ5IHN0cmF0ZWd5IHRoYXQKKyAgICAgKiBhcHBsaWVzIHdoZW4gdGhlIG51bWJlciBvZiBub2RlcyBpbiBhIGJpbiBleGNlZWRzIGEKKyAgICAgKiB0aHJlc2hvbGQuIFRoZXNlIFRyZWVCaW5zIHVzZSBhIGJhbGFuY2VkIHRyZWUgdG8gaG9sZCBub2RlcyAoYQorICAgICAqIHNwZWNpYWxpemVkIGZvcm0gb2YgcmVkLWJsYWNrIHRyZWVzKSwgYm91bmRpbmcgc2VhcmNoIHRpbWUgdG8KKyAgICAgKiBPKGxvZyBOKS4gIEVhY2ggc2VhcmNoIHN0ZXAgaW4gYSBUcmVlQmluIGlzIGF0IGxlYXN0IHR3aWNlIGFzCisgICAgICogc2xvdyBhcyBpbiBhIHJlZ3VsYXIgbGlzdCwgYnV0IGdpdmVuIHRoYXQgTiBjYW5ub3QgZXhjZWVkCisgICAgICogKDE8PDY0KSAoYmVmb3JlIHJ1bm5pbmcgb3V0IG9mIGFkZHJlc3NlcykgdGhpcyBib3VuZHMgc2VhcmNoCisgICAgICogc3RlcHMsIGxvY2sgaG9sZCB0aW1lcywgZXRjLCB0byByZWFzb25hYmxlIGNvbnN0YW50cyAocm91Z2hseQorICAgICAqIDEwMCBub2RlcyBpbnNwZWN0ZWQgcGVyIG9wZXJhdGlvbiB3b3JzdCBjYXNlKSBzbyBsb25nIGFzIGtleXMKKyAgICAgKiBhcmUgQ29tcGFyYWJsZSAod2hpY2ggaXMgdmVyeSBjb21tb24gLS0gU3RyaW5nLCBMb25nLCBldGMpLgorICAgICAqIFRyZWVCaW4gbm9kZXMgKFRyZWVOb2RlcykgYWxzbyBtYWludGFpbiB0aGUgc2FtZSAibmV4dCIKKyAgICAgKiB0cmF2ZXJzYWwgcG9pbnRlcnMgYXMgcmVndWxhciBub2Rlcywgc28gY2FuIGJlIHRyYXZlcnNlZCBpbgorICAgICAqIGl0ZXJhdG9ycyBpbiB0aGUgc2FtZSB3YXkuCisgICAgICoKKyAgICAgKiBUaGUgdGFibGUgaXMgcmVzaXplZCB3aGVuIG9jY3VwYW5jeSBleGNlZWRzIGEgcGVyY2VudGFnZQorICAgICAqIHRocmVzaG9sZCAobm9taW5hbGx5LCAwLjc1LCBidXQgc2VlIGJlbG93KS4gIEFueSB0aHJlYWQKKyAgICAgKiBub3RpY2luZyBhbiBvdmVyZnVsbCBiaW4gbWF5IGFzc2lzdCBpbiByZXNpemluZyBhZnRlciB0aGUKKyAgICAgKiBpbml0aWF0aW5nIHRocmVhZCBhbGxvY2F0ZXMgYW5kIHNldHMgdXAgdGhlIHJlcGxhY2VtZW50CisgICAgICogYXJyYXkuIEhvd2V2ZXIsIHJhdGhlciB0aGFuIHN0YWxsaW5nLCB0aGVzZSBvdGhlciB0aHJlYWRzIG1heQorICAgICAqIHByb2NlZWQgd2l0aCBpbnNlcnRpb25zIGV0Yy4gIFRoZSB1c2Ugb2YgVHJlZUJpbnMgc2hpZWxkcyB1cworICAgICAqIGZyb20gdGhlIHdvcnN0IGNhc2UgZWZmZWN0cyBvZiBvdmVyZmlsbGluZyB3aGlsZSByZXNpemVzIGFyZSBpbgorICAgICAqIHByb2dyZXNzLiAgUmVzaXppbmcgcHJvY2VlZHMgYnkgdHJhbnNmZXJyaW5nIGJpbnMsIG9uZSBieSBvbmUsCisgICAgICogZnJvbSB0aGUgdGFibGUgdG8gdGhlIG5leHQgdGFibGUuIFRvIGVuYWJsZSBjb25jdXJyZW5jeSwgdGhlCisgICAgICogbmV4dCB0YWJsZSBtdXN0IGJlIChpbmNyZW1lbnRhbGx5KSBwcmVmaWxsZWQgd2l0aCBwbGFjZS1ob2xkZXJzCisgICAgICogc2VydmluZyBhcyByZXZlcnNlIGZvcndhcmRlcnMgdG8gdGhlIG9sZCB0YWJsZS4gIEJlY2F1c2Ugd2UgYXJlCisgICAgICogdXNpbmcgcG93ZXItb2YtdHdvIGV4cGFuc2lvbiwgdGhlIGVsZW1lbnRzIGZyb20gZWFjaCBiaW4gbXVzdAorICAgICAqIGVpdGhlciBzdGF5IGF0IHNhbWUgaW5kZXgsIG9yIG1vdmUgd2l0aCBhIHBvd2VyIG9mIHR3bworICAgICAqIG9mZnNldC4gV2UgZWxpbWluYXRlIHVubmVjZXNzYXJ5IG5vZGUgY3JlYXRpb24gYnkgY2F0Y2hpbmcKKyAgICAgKiBjYXNlcyB3aGVyZSBvbGQgbm9kZXMgY2FuIGJlIHJldXNlZCBiZWNhdXNlIHRoZWlyIG5leHQgZmllbGRzCisgICAgICogd29uJ3QgY2hhbmdlLiAgT24gYXZlcmFnZSwgb25seSBhYm91dCBvbmUtc2l4dGggb2YgdGhlbSBuZWVkCisgICAgICogY2xvbmluZyB3aGVuIGEgdGFibGUgZG91Ymxlcy4gVGhlIG5vZGVzIHRoZXkgcmVwbGFjZSB3aWxsIGJlCisgICAgICogZ2FyYmFnZSBjb2xsZWN0YWJsZSBhcyBzb29uIGFzIHRoZXkgYXJlIG5vIGxvbmdlciByZWZlcmVuY2VkIGJ5CisgICAgICogYW55IHJlYWRlciB0aHJlYWQgdGhhdCBtYXkgYmUgaW4gdGhlIG1pZHN0IG9mIGNvbmN1cnJlbnRseQorICAgICAqIHRyYXZlcnNpbmcgdGFibGUuICBVcG9uIHRyYW5zZmVyLCB0aGUgb2xkIHRhYmxlIGJpbiBjb250YWlucworICAgICAqIG9ubHkgYSBzcGVjaWFsIGZvcndhcmRpbmcgbm9kZSAod2l0aCBoYXNoIGZpZWxkICJNT1ZFRCIpIHRoYXQKKyAgICAgKiBjb250YWlucyB0aGUgbmV4dCB0YWJsZSBhcyBpdHMga2V5LiBPbiBlbmNvdW50ZXJpbmcgYQorICAgICAqIGZvcndhcmRpbmcgbm9kZSwgYWNjZXNzIGFuZCB1cGRhdGUgb3BlcmF0aW9ucyByZXN0YXJ0LCB1c2luZworICAgICAqIHRoZSBuZXcgdGFibGUuCisgICAgICoKKyAgICAgKiBFYWNoIGJpbiB0cmFuc2ZlciByZXF1aXJlcyBpdHMgYmluIGxvY2ssIHdoaWNoIGNhbiBzdGFsbAorICAgICAqIHdhaXRpbmcgZm9yIGxvY2tzIHdoaWxlIHJlc2l6aW5nLiBIb3dldmVyLCBiZWNhdXNlIG90aGVyCisgICAgICogdGhyZWFkcyBjYW4gam9pbiBpbiBhbmQgaGVscCByZXNpemUgcmF0aGVyIHRoYW4gY29udGVuZCBmb3IKKyAgICAgKiBsb2NrcywgYXZlcmFnZSBhZ2dyZWdhdGUgd2FpdHMgYmVjb21lIHNob3J0ZXIgYXMgcmVzaXppbmcKKyAgICAgKiBwcm9ncmVzc2VzLiAgVGhlIHRyYW5zZmVyIG9wZXJhdGlvbiBtdXN0IGFsc28gZW5zdXJlIHRoYXQgYWxsCisgICAgICogYWNjZXNzaWJsZSBiaW5zIGluIGJvdGggdGhlIG9sZCBhbmQgbmV3IHRhYmxlIGFyZSB1c2FibGUgYnkgYW55CisgICAgICogdHJhdmVyc2FsLiAgVGhpcyBpcyBhcnJhbmdlZCBieSBwcm9jZWVkaW5nIGZyb20gdGhlIGxhc3QgYmluCisgICAgICogKHRhYmxlLmxlbmd0aCAtIDEpIHVwIHRvd2FyZHMgdGhlIGZpcnN0LiAgVXBvbiBzZWVpbmcgYQorICAgICAqIGZvcndhcmRpbmcgbm9kZSwgdHJhdmVyc2FscyAoc2VlIGNsYXNzIFRyYXZlcnNlcikgYXJyYW5nZSB0bworICAgICAqIG1vdmUgdG8gdGhlIG5ldyB0YWJsZSB3aXRob3V0IHJldmlzaXRpbmcgbm9kZXMuICBIb3dldmVyLCB0bworICAgICAqIGVuc3VyZSB0aGF0IG5vIGludGVydmVuaW5nIG5vZGVzIGFyZSBza2lwcGVkLCBiaW4gc3BsaXR0aW5nIGNhbgorICAgICAqIG9ubHkgYmVnaW4gYWZ0ZXIgdGhlIGFzc29jaWF0ZWQgcmV2ZXJzZS1mb3J3YXJkZXJzIGFyZSBpbgorICAgICAqIHBsYWNlLgorICAgICAqCisgICAgICogVGhlIHRyYXZlcnNhbCBzY2hlbWUgYWxzbyBhcHBsaWVzIHRvIHBhcnRpYWwgdHJhdmVyc2FscyBvZgorICAgICAqIHJhbmdlcyBvZiBiaW5zICh2aWEgYW4gYWx0ZXJuYXRlIFRyYXZlcnNlciBjb25zdHJ1Y3RvcikKKyAgICAgKiB0byBzdXBwb3J0IHBhcnRpdGlvbmVkIGFnZ3JlZ2F0ZSBvcGVyYXRpb25zLiAgQWxzbywgcmVhZC1vbmx5CisgICAgICogb3BlcmF0aW9ucyBnaXZlIHVwIGlmIGV2ZXIgZm9yd2FyZGVkIHRvIGEgbnVsbCB0YWJsZSwgd2hpY2gKKyAgICAgKiBwcm92aWRlcyBzdXBwb3J0IGZvciBzaHV0ZG93bi1zdHlsZSBjbGVhcmluZywgd2hpY2ggaXMgYWxzbyBub3QKKyAgICAgKiBjdXJyZW50bHkgaW1wbGVtZW50ZWQuCisgICAgICoKKyAgICAgKiBMYXp5IHRhYmxlIGluaXRpYWxpemF0aW9uIG1pbmltaXplcyBmb290cHJpbnQgdW50aWwgZmlyc3QgdXNlLAorICAgICAqIGFuZCBhbHNvIGF2b2lkcyByZXNpemluZ3Mgd2hlbiB0aGUgZmlyc3Qgb3BlcmF0aW9uIGlzIGZyb20gYQorICAgICAqIHB1dEFsbCwgY29uc3RydWN0b3Igd2l0aCBtYXAgYXJndW1lbnQsIG9yIGRlc2VyaWFsaXphdGlvbi4KKyAgICAgKiBUaGVzZSBjYXNlcyBhdHRlbXB0IHRvIG92ZXJyaWRlIHRoZSBpbml0aWFsIGNhcGFjaXR5IHNldHRpbmdzLAorICAgICAqIGJ1dCBoYXJtbGVzc2x5IGZhaWwgdG8gdGFrZSBlZmZlY3QgaW4gY2FzZXMgb2YgcmFjZXMuCisgICAgICoKKyAgICAgKiBUaGUgZWxlbWVudCBjb3VudCBpcyBtYWludGFpbmVkIHVzaW5nIGEgc3BlY2lhbGl6YXRpb24gb2YKKyAgICAgKiBMb25nQWRkZXIuIFdlIG5lZWQgdG8gaW5jb3Jwb3JhdGUgYSBzcGVjaWFsaXphdGlvbiByYXRoZXIgdGhhbgorICAgICAqIGp1c3QgdXNlIGEgTG9uZ0FkZGVyIGluIG9yZGVyIHRvIGFjY2VzcyBpbXBsaWNpdAorICAgICAqIGNvbnRlbnRpb24tc2Vuc2luZyB0aGF0IGxlYWRzIHRvIGNyZWF0aW9uIG9mIG11bHRpcGxlCisgICAgICogQ291bnRlckNlbGxzLiAgVGhlIGNvdW50ZXIgbWVjaGFuaWNzIGF2b2lkIGNvbnRlbnRpb24gb24KKyAgICAgKiB1cGRhdGVzIGJ1dCBjYW4gZW5jb3VudGVyIGNhY2hlIHRocmFzaGluZyBpZiByZWFkIHRvbworICAgICAqIGZyZXF1ZW50bHkgZHVyaW5nIGNvbmN1cnJlbnQgYWNjZXNzLiBUbyBhdm9pZCByZWFkaW5nIHNvIG9mdGVuLAorICAgICAqIHJlc2l6aW5nIHVuZGVyIGNvbnRlbnRpb24gaXMgYXR0ZW1wdGVkIG9ubHkgdXBvbiBhZGRpbmcgdG8gYQorICAgICAqIGJpbiBhbHJlYWR5IGhvbGRpbmcgdHdvIG9yIG1vcmUgbm9kZXMuIFVuZGVyIHVuaWZvcm0gaGFzaAorICAgICAqIGRpc3RyaWJ1dGlvbnMsIHRoZSBwcm9iYWJpbGl0eSBvZiB0aGlzIG9jY3VycmluZyBhdCB0aHJlc2hvbGQKKyAgICAgKiBpcyBhcm91bmQgMTMlLCBtZWFuaW5nIHRoYXQgb25seSBhYm91dCAxIGluIDggcHV0cyBjaGVjaworICAgICAqIHRocmVzaG9sZCAoYW5kIGFmdGVyIHJlc2l6aW5nLCBtYW55IGZld2VyIGRvIHNvKS4KKyAgICAgKgorICAgICAqIFRyZWVCaW5zIHVzZSBhIHNwZWNpYWwgZm9ybSBvZiBjb21wYXJpc29uIGZvciBzZWFyY2ggYW5kCisgICAgICogcmVsYXRlZCBvcGVyYXRpb25zICh3aGljaCBpcyB0aGUgbWFpbiByZWFzb24gd2UgY2Fubm90IHVzZQorICAgICAqIGV4aXN0aW5nIGNvbGxlY3Rpb25zIHN1Y2ggYXMgVHJlZU1hcHMpLiBUcmVlQmlucyBjb250YWluCisgICAgICogQ29tcGFyYWJsZSBlbGVtZW50cywgYnV0IG1heSBjb250YWluIG90aGVycywgYXMgd2VsbCBhcworICAgICAqIGVsZW1lbnRzIHRoYXQgYXJlIENvbXBhcmFibGUgYnV0IG5vdCBuZWNlc3NhcmlseSBDb21wYXJhYmxlIGZvcgorICAgICAqIHRoZSBzYW1lIFQsIHNvIHdlIGNhbm5vdCBpbnZva2UgY29tcGFyZVRvIGFtb25nIHRoZW0uIFRvIGhhbmRsZQorICAgICAqIHRoaXMsIHRoZSB0cmVlIGlzIG9yZGVyZWQgcHJpbWFyaWx5IGJ5IGhhc2ggdmFsdWUsIHRoZW4gYnkKKyAgICAgKiBDb21wYXJhYmxlLmNvbXBhcmVUbyBvcmRlciBpZiBhcHBsaWNhYmxlLiAgT24gbG9va3VwIGF0IGEgbm9kZSwKKyAgICAgKiBpZiBlbGVtZW50cyBhcmUgbm90IGNvbXBhcmFibGUgb3IgY29tcGFyZSBhcyAwIHRoZW4gYm90aCBsZWZ0CisgICAgICogYW5kIHJpZ2h0IGNoaWxkcmVuIG1heSBuZWVkIHRvIGJlIHNlYXJjaGVkIGluIHRoZSBjYXNlIG9mIHRpZWQKKyAgICAgKiBoYXNoIHZhbHVlcy4gKFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIGZ1bGwgbGlzdCBzZWFyY2ggdGhhdAorICAgICAqIHdvdWxkIGJlIG5lY2Vzc2FyeSBpZiBhbGwgZWxlbWVudHMgd2VyZSBub24tQ29tcGFyYWJsZSBhbmQgaGFkCisgICAgICogdGllZCBoYXNoZXMuKSBPbiBpbnNlcnRpb24sIHRvIGtlZXAgYSB0b3RhbCBvcmRlcmluZyAob3IgYXMKKyAgICAgKiBjbG9zZSBhcyBpcyByZXF1aXJlZCBoZXJlKSBhY3Jvc3MgcmViYWxhbmNpbmdzLCB3ZSBjb21wYXJlCisgICAgICogY2xhc3NlcyBhbmQgaWRlbnRpdHlIYXNoQ29kZXMgYXMgdGllLWJyZWFrZXJzLiBUaGUgcmVkLWJsYWNrCisgICAgICogYmFsYW5jaW5nIGNvZGUgaXMgdXBkYXRlZCBmcm9tIHByZS1qZGstY29sbGVjdGlvbnMKKyAgICAgKiAoaHR0cDovL2dlZS5jcy5vc3dlZ28uZWR1L2RsL2NsYXNzZXMvY29sbGVjdGlvbnMvUkJDZWxsLmphdmEpCisgICAgICogYmFzZWQgaW4gdHVybiBvbiBDb3JtZW4sIExlaXNlcnNvbiwgYW5kIFJpdmVzdCAiSW50cm9kdWN0aW9uIHRvCisgICAgICogQWxnb3JpdGhtcyIgKENMUikuCisgICAgICoKKyAgICAgKiBUcmVlQmlucyBhbHNvIHJlcXVpcmUgYW4gYWRkaXRpb25hbCBsb2NraW5nIG1lY2hhbmlzbS4gIFdoaWxlCisgICAgICogbGlzdCB0cmF2ZXJzYWwgaXMgYWx3YXlzIHBvc3NpYmxlIGJ5IHJlYWRlcnMgZXZlbiBkdXJpbmcKKyAgICAgKiB1cGRhdGVzLCB0cmVlIHRyYXZlcnNhbCBpcyBub3QsIG1haW5seSBiZWNhdXNlIG9mIHRyZWUtcm90YXRpb25zCisgICAgICogdGhhdCBtYXkgY2hhbmdlIHRoZSByb290IG5vZGUgYW5kL29yIGl0cyBsaW5rYWdlcy4gIFRyZWVCaW5zCisgICAgICogaW5jbHVkZSBhIHNpbXBsZSByZWFkLXdyaXRlIGxvY2sgbWVjaGFuaXNtIHBhcmFzaXRpYyBvbiB0aGUKKyAgICAgKiBtYWluIGJpbi1zeW5jaHJvbml6YXRpb24gc3RyYXRlZ3k6IFN0cnVjdHVyYWwgYWRqdXN0bWVudHMKKyAgICAgKiBhc3NvY2lhdGVkIHdpdGggYW4gaW5zZXJ0aW9uIG9yIHJlbW92YWwgYXJlIGFscmVhZHkgYmluLWxvY2tlZAorICAgICAqIChhbmQgc28gY2Fubm90IGNvbmZsaWN0IHdpdGggb3RoZXIgd3JpdGVycykgYnV0IG11c3Qgd2FpdCBmb3IKKyAgICAgKiBvbmdvaW5nIHJlYWRlcnMgdG8gZmluaXNoLiBTaW5jZSB0aGVyZSBjYW4gYmUgb25seSBvbmUgc3VjaAorICAgICAqIHdhaXRlciwgd2UgdXNlIGEgc2ltcGxlIHNjaGVtZSB1c2luZyBhIHNpbmdsZSAid2FpdGVyIiBmaWVsZCB0bworICAgICAqIGJsb2NrIHdyaXRlcnMuICBIb3dldmVyLCByZWFkZXJzIG5lZWQgbmV2ZXIgYmxvY2suICBJZiB0aGUgcm9vdAorICAgICAqIGxvY2sgaXMgaGVsZCwgdGhleSBwcm9jZWVkIGFsb25nIHRoZSBzbG93IHRyYXZlcnNhbCBwYXRoICh2aWEKKyAgICAgKiBuZXh0LXBvaW50ZXJzKSB1bnRpbCB0aGUgbG9jayBiZWNvbWVzIGF2YWlsYWJsZSBvciB0aGUgbGlzdCBpcworICAgICAqIGV4aGF1c3RlZCwgd2hpY2hldmVyIGNvbWVzIGZpcnN0LiBUaGVzZSBjYXNlcyBhcmUgbm90IGZhc3QsIGJ1dAorICAgICAqIG1heGltaXplIGFnZ3JlZ2F0ZSBleHBlY3RlZCB0aHJvdWdocHV0LgorICAgICAqCisgICAgICogTWFpbnRhaW5pbmcgQVBJIGFuZCBzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkgd2l0aCBwcmV2aW91cworICAgICAqIHZlcnNpb25zIG9mIHRoaXMgY2xhc3MgaW50cm9kdWNlcyBzZXZlcmFsIG9kZGl0aWVzLiBNYWlubHk6IFdlCisgICAgICogbGVhdmUgdW50b3VjaGVkIGJ1dCB1bnVzZWQgY29uc3RydWN0b3IgYXJndW1lbnRzIHJlZmVyaW5nIHRvCisgICAgICogY29uY3VycmVuY3lMZXZlbC4gV2UgYWNjZXB0IGEgbG9hZEZhY3RvciBjb25zdHJ1Y3RvciBhcmd1bWVudCwKKyAgICAgKiBidXQgYXBwbHkgaXQgb25seSB0byBpbml0aWFsIHRhYmxlIGNhcGFjaXR5ICh3aGljaCBpcyB0aGUgb25seQorICAgICAqIHRpbWUgdGhhdCB3ZSBjYW4gZ3VhcmFudGVlIHRvIGhvbm9yIGl0LikgV2UgYWxzbyBkZWNsYXJlIGFuCisgICAgICogdW51c2VkICJTZWdtZW50IiBjbGFzcyB0aGF0IGlzIGluc3RhbnRpYXRlZCBpbiBtaW5pbWFsIGZvcm0KKyAgICAgKiBvbmx5IHdoZW4gc2VyaWFsaXppbmcuCisgICAgICoKKyAgICAgKiBBbHNvLCBzb2xlbHkgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBwcmV2aW91cyB2ZXJzaW9ucyBvZiB0aGlzCisgICAgICogY2xhc3MsIGl0IGV4dGVuZHMgQWJzdHJhY3RNYXAsIGV2ZW4gdGhvdWdoIGFsbCBvZiBpdHMgbWV0aG9kcworICAgICAqIGFyZSBvdmVycmlkZGVuLCBzbyBpdCBpcyBqdXN0IHVzZWxlc3MgYmFnZ2FnZS4KKyAgICAgKgorICAgICAqIFRoaXMgZmlsZSBpcyBvcmdhbml6ZWQgdG8gbWFrZSB0aGluZ3MgYSBsaXR0bGUgZWFzaWVyIHRvIGZvbGxvdworICAgICAqIHdoaWxlIHJlYWRpbmcgdGhhbiB0aGV5IG1pZ2h0IG90aGVyd2lzZTogRmlyc3QgdGhlIG1haW4gc3RhdGljCisgICAgICogZGVjbGFyYXRpb25zIGFuZCB1dGlsaXRpZXMsIHRoZW4gZmllbGRzLCB0aGVuIG1haW4gcHVibGljCisgICAgICogbWV0aG9kcyAod2l0aCBhIGZldyBmYWN0b3JpbmdzIG9mIG11bHRpcGxlIHB1YmxpYyBtZXRob2RzIGludG8KKyAgICAgKiBpbnRlcm5hbCBvbmVzKSwgdGhlbiBzaXppbmcgbWV0aG9kcywgdHJlZXMsIHRyYXZlcnNlcnMsIGFuZAorICAgICAqIGJ1bGsgb3BlcmF0aW9ucy4KKyAgICAgKi8KKworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0gQ29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tICovCisKKyAgICAvKioKKyAgICAgKiBUaGUgbGFyZ2VzdCBwb3NzaWJsZSB0YWJsZSBjYXBhY2l0eS4gIFRoaXMgdmFsdWUgbXVzdCBiZQorICAgICAqIGV4YWN0bHkgMTw8MzAgdG8gc3RheSB3aXRoaW4gSmF2YSBhcnJheSBhbGxvY2F0aW9uIGFuZCBpbmRleGluZworICAgICAqIGJvdW5kcyBmb3IgcG93ZXIgb2YgdHdvIHRhYmxlIHNpemVzLCBhbmQgaXMgZnVydGhlciByZXF1aXJlZAorICAgICAqIGJlY2F1c2UgdGhlIHRvcCB0d28gYml0cyBvZiAzMmJpdCBoYXNoIGZpZWxkcyBhcmUgdXNlZCBmb3IKKyAgICAgKiBjb250cm9sIHB1cnBvc2VzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhJTVVNX0NBUEFDSVRZID0gMSA8PCAzMDsKKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGluaXRpYWwgdGFibGUgY2FwYWNpdHkuICBNdXN0IGJlIGEgcG93ZXIgb2YgMgorICAgICAqIChpLmUuLCBhdCBsZWFzdCAxKSBhbmQgYXQgbW9zdCBNQVhJTVVNX0NBUEFDSVRZLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0NBUEFDSVRZID0gMTY7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbGFyZ2VzdCBwb3NzaWJsZSAobm9uLXBvd2VyIG9mIHR3bykgYXJyYXkgc2l6ZS4KKyAgICAgKiBOZWVkZWQgYnkgdG9BcnJheSBhbmQgcmVsYXRlZCBtZXRob2RzLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0FSUkFZX1NJWkUgPSBJbnRlZ2VyLk1BWF9WQUxVRSAtIDg7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBjb25jdXJyZW5jeSBsZXZlbCBmb3IgdGhpcyB0YWJsZS4gVW51c2VkIGJ1dAorICAgICAqIGRlZmluZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBwcmV2aW91cyB2ZXJzaW9ucyBvZiB0aGlzIGNsYXNzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0NPTkNVUlJFTkNZX0xFVkVMID0gMTY7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbG9hZCBmYWN0b3IgZm9yIHRoaXMgdGFibGUuIE92ZXJyaWRlcyBvZiB0aGlzIHZhbHVlIGluCisgICAgICogY29uc3RydWN0b3JzIGFmZmVjdCBvbmx5IHRoZSBpbml0aWFsIHRhYmxlIGNhcGFjaXR5LiAgVGhlCisgICAgICogYWN0dWFsIGZsb2F0aW5nIHBvaW50IHZhbHVlIGlzbid0IG5vcm1hbGx5IHVzZWQgLS0gaXQgaXMKKyAgICAgKiBzaW1wbGVyIHRvIHVzZSBleHByZXNzaW9ucyBzdWNoIGFzIHtAY29kZSBuIC0gKG4gPj4+IDIpfSBmb3IKKyAgICAgKiB0aGUgYXNzb2NpYXRlZCByZXNpemluZyB0aHJlc2hvbGQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgTE9BRF9GQUNUT1IgPSAwLjc1ZjsKKworICAgIC8qKgorICAgICAqIFRoZSBiaW4gY291bnQgdGhyZXNob2xkIGZvciB1c2luZyBhIHRyZWUgcmF0aGVyIHRoYW4gbGlzdCBmb3IgYQorICAgICAqIGJpbi4gIEJpbnMgYXJlIGNvbnZlcnRlZCB0byB0cmVlcyB3aGVuIGFkZGluZyBhbiBlbGVtZW50IHRvIGEKKyAgICAgKiBiaW4gd2l0aCBhdCBsZWFzdCB0aGlzIG1hbnkgbm9kZXMuIFRoZSB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIKKyAgICAgKiB0aGFuIDIsIGFuZCBzaG91bGQgYmUgYXQgbGVhc3QgOCB0byBtZXNoIHdpdGggYXNzdW1wdGlvbnMgaW4KKyAgICAgKiB0cmVlIHJlbW92YWwgYWJvdXQgY29udmVyc2lvbiBiYWNrIHRvIHBsYWluIGJpbnMgdXBvbgorICAgICAqIHNocmlua2FnZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IFRSRUVJRllfVEhSRVNIT0xEID0gODsKKworICAgIC8qKgorICAgICAqIFRoZSBiaW4gY291bnQgdGhyZXNob2xkIGZvciB1bnRyZWVpZnlpbmcgYSAoc3BsaXQpIGJpbiBkdXJpbmcgYQorICAgICAqIHJlc2l6ZSBvcGVyYXRpb24uIFNob3VsZCBiZSBsZXNzIHRoYW4gVFJFRUlGWV9USFJFU0hPTEQsIGFuZCBhdAorICAgICAqIG1vc3QgNiB0byBtZXNoIHdpdGggc2hyaW5rYWdlIGRldGVjdGlvbiB1bmRlciByZW1vdmFsLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgVU5UUkVFSUZZX1RIUkVTSE9MRCA9IDY7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc21hbGxlc3QgdGFibGUgY2FwYWNpdHkgZm9yIHdoaWNoIGJpbnMgbWF5IGJlIHRyZWVpZmllZC4KKyAgICAgKiAoT3RoZXJ3aXNlIHRoZSB0YWJsZSBpcyByZXNpemVkIGlmIHRvbyBtYW55IG5vZGVzIGluIGEgYmluLikKKyAgICAgKiBUaGUgdmFsdWUgc2hvdWxkIGJlIGF0IGxlYXN0IDQgKiBUUkVFSUZZX1RIUkVTSE9MRCB0byBhdm9pZAorICAgICAqIGNvbmZsaWN0cyBiZXR3ZWVuIHJlc2l6aW5nIGFuZCB0cmVlaWZpY2F0aW9uIHRocmVzaG9sZHMuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBNSU5fVFJFRUlGWV9DQVBBQ0lUWSA9IDY0OworCisgICAgLyoqCisgICAgICogTWluaW11bSBudW1iZXIgb2YgcmViaW5uaW5ncyBwZXIgdHJhbnNmZXIgc3RlcC4gUmFuZ2VzIGFyZQorICAgICAqIHN1YmRpdmlkZWQgdG8gYWxsb3cgbXVsdGlwbGUgcmVzaXplciB0aHJlYWRzLiAgVGhpcyB2YWx1ZQorICAgICAqIHNlcnZlcyBhcyBhIGxvd2VyIGJvdW5kIHRvIGF2b2lkIHJlc2l6ZXJzIGVuY291bnRlcmluZworICAgICAqIGV4Y2Vzc2l2ZSBtZW1vcnkgY29udGVudGlvbi4gIFRoZSB2YWx1ZSBzaG91bGQgYmUgYXQgbGVhc3QKKyAgICAgKiBERUZBVUxUX0NBUEFDSVRZLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNSU5fVFJBTlNGRVJfU1RSSURFID0gMTY7CisKKyAgICAvKgorICAgICAqIEVuY29kaW5ncyBmb3IgTm9kZSBoYXNoIGZpZWxkcy4gU2VlIGFib3ZlIGZvciBleHBsYW5hdGlvbi4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IE1PVkVEID0gLTE7IC8vIGhhc2ggZm9yIGZvcndhcmRpbmcgbm9kZXMKKyAgICBzdGF0aWMgZmluYWwgaW50IFRSRUVCSU4gPSAtMjsgLy8gaGFzaCBmb3Igcm9vdHMgb2YgdHJlZXMKKyAgICBzdGF0aWMgZmluYWwgaW50IFJFU0VSVkVEID0gLTM7IC8vIGhhc2ggZm9yIHRyYW5zaWVudCByZXNlcnZhdGlvbnMKKyAgICBzdGF0aWMgZmluYWwgaW50IEhBU0hfQklUUyA9IDB4N2ZmZmZmZmY7IC8vIHVzYWJsZSBiaXRzIG9mIG5vcm1hbCBub2RlIGhhc2gKKworICAgIC8qKgorICAgICAqIE51bWJlciBvZiBDUFVTLCB0byBwbGFjZSBib3VuZHMgb24gc29tZSBzaXppbmdzCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBOQ1BVID0gUnVudGltZS5nZXRSdW50aW1lKCkuYXZhaWxhYmxlUHJvY2Vzc29ycygpOworCisgICAgLyoqCisgICAgICogRm9yIHNlcmlhbGl6YXRpb24gY29tcGF0aWJpbGl0eS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPYmplY3RTdHJlYW1GaWVsZFtdIHNlcmlhbFBlcnNpc3RlbnRGaWVsZHMgPSB7CisgICAgICAgICAgICBuZXcgT2JqZWN0U3RyZWFtRmllbGQoInNlZ21lbnRzIiwgU2VnbWVudFtdLmNsYXNzKSwKKyAgICAgICAgICAgIG5ldyBPYmplY3RTdHJlYW1GaWVsZCgic2VnbWVudE1hc2siLCBJbnRlZ2VyLlRZUEUpLAorICAgICAgICAgICAgbmV3IE9iamVjdFN0cmVhbUZpZWxkKCJzZWdtZW50U2hpZnQiLCBJbnRlZ2VyLlRZUEUpCisgICAgfTsKKworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0gTm9kZXMgLS0tLS0tLS0tLS0tLS0gKi8KKworICAgIC8qKgorICAgICAqIEtleS12YWx1ZSBlbnRyeS4gIFRoaXMgY2xhc3MgaXMgbmV2ZXIgZXhwb3J0ZWQgb3V0IGFzIGEKKyAgICAgKiB1c2VyLW11dGFibGUgTWFwLkVudHJ5IChpLmUuLCBvbmUgc3VwcG9ydGluZyBzZXRWYWx1ZTsgc2VlCisgICAgICogTWFwRW50cnkgYmVsb3cpLCBidXQgY2FuIGJlIHVzZWQgZm9yIHJlYWQtb25seSB0cmF2ZXJzYWxzIHVzZWQKKyAgICAgKiBpbiBidWxrIHRhc2tzLiAgU3ViY2xhc3NlcyBvZiBOb2RlIHdpdGggYSBuZWdhdGl2ZSBoYXNoIGZpZWxkCisgICAgICogYXJlIHNwZWNpYWwsIGFuZCBjb250YWluIG51bGwga2V5cyBhbmQgdmFsdWVzIChidXQgYXJlIG5ldmVyCisgICAgICogZXhwb3J0ZWQpLiAgT3RoZXJ3aXNlLCBrZXlzIGFuZCB2YWxzIGFyZSBuZXZlciBudWxsLgorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBOb2RlPEssIFY+IGltcGxlbWVudHMgTWFwLkVudHJ5PEssIFY+IHsKKyAgICAgICAgZmluYWwgaW50IGhhc2g7CisgICAgICAgIGZpbmFsIEsga2V5OworICAgICAgICB2b2xhdGlsZSBWIHZhbDsKKyAgICAgICAgdm9sYXRpbGUgTm9kZTxLLCBWPiBuZXh0OworCisgICAgICAgIE5vZGUoZmluYWwgaW50IGhhc2gsIGZpbmFsIEsga2V5LCBmaW5hbCBWIHZhbCwgZmluYWwgTm9kZTxLLCBWPiBuZXh0KSB7CisgICAgICAgICAgICB0aGlzLmhhc2ggPSBoYXNoOworICAgICAgICAgICAgdGhpcy5rZXkgPSBrZXk7CisgICAgICAgICAgICB0aGlzLnZhbCA9IHZhbDsKKyAgICAgICAgICAgIHRoaXMubmV4dCA9IG5leHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmluYWwgSyBnZXRLZXkoKSB7CisgICAgICAgICAgICByZXR1cm4ga2V5OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZpbmFsIFYgZ2V0VmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZpbmFsIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBrZXkuaGFzaENvZGUoKSBeIHZhbC5oYXNoQ29kZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBrZXkgKyAiPSIgKyB2YWw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmluYWwgViBzZXRWYWx1ZShmaW5hbCBWIHZhbHVlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3QgbykgeworICAgICAgICAgICAgZmluYWwgT2JqZWN0IGs7CisgICAgICAgICAgICBmaW5hbCBPYmplY3QgdjsKKyAgICAgICAgICAgIGZpbmFsIE9iamVjdCB1OworICAgICAgICAgICAgZmluYWwgTWFwLkVudHJ5PD8sID8+IGU7CisgICAgICAgICAgICByZXR1cm4gKChvIGluc3RhbmNlb2YgTWFwLkVudHJ5KSAmJgorICAgICAgICAgICAgICAgICAgICAoayA9IChlID0gKE1hcC5FbnRyeTw/LCA/PikgbykuZ2V0S2V5KCkpICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgKHYgPSBlLmdldFZhbHVlKCkpICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgKGsgPT0ga2V5IHx8IGsuZXF1YWxzKGtleSkpICYmCisgICAgICAgICAgICAgICAgICAgICh2ID09ICh1ID0gdmFsKSB8fCB2LmVxdWFscyh1KSkpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFZpcnR1YWxpemVkIHN1cHBvcnQgZm9yIG1hcC5nZXQoKTsgb3ZlcnJpZGRlbiBpbiBzdWJjbGFzc2VzLgorICAgICAgICAgKi8KKyAgICAgICAgTm9kZTxLLCBWPiBmaW5kKGZpbmFsIGludCBoLCBmaW5hbCBPYmplY3QgaykgeworICAgICAgICAgICAgTm9kZTxLLCBWPiBlID0gdGhpczsKKyAgICAgICAgICAgIGlmIChrICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIEsgZWs7CisgICAgICAgICAgICAgICAgICAgIGlmIChlLmhhc2ggPT0gaCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZWsgPSBlLmtleSkgPT0gayB8fCAoZWsgIT0gbnVsbCAmJiBrLmVxdWFscyhlaykpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKChlID0gZS5uZXh0KSAhPSBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLSBTdGF0aWMgdXRpbGl0aWVzIC0tLS0tLS0tLS0tLS0tICovCisKKyAgICAvKioKKyAgICAgKiBTcHJlYWRzIChYT1JzKSBoaWdoZXIgYml0cyBvZiBoYXNoIHRvIGxvd2VyIGFuZCBhbHNvIGZvcmNlcyB0b3AKKyAgICAgKiBiaXQgdG8gMC4gQmVjYXVzZSB0aGUgdGFibGUgdXNlcyBwb3dlci1vZi10d28gbWFza2luZywgc2V0cyBvZgorICAgICAqIGhhc2hlcyB0aGF0IHZhcnkgb25seSBpbiBiaXRzIGFib3ZlIHRoZSBjdXJyZW50IG1hc2sgd2lsbAorICAgICAqIGFsd2F5cyBjb2xsaWRlLiAoQW1vbmcga25vd24gZXhhbXBsZXMgYXJlIHNldHMgb2YgRmxvYXQga2V5cworICAgICAqIGhvbGRpbmcgY29uc2VjdXRpdmUgd2hvbGUgbnVtYmVycyBpbiBzbWFsbCB0YWJsZXMuKSAgU28gd2UKKyAgICAgKiBhcHBseSBhIHRyYW5zZm9ybSB0aGF0IHNwcmVhZHMgdGhlIGltcGFjdCBvZiBoaWdoZXIgYml0cworICAgICAqIGRvd253YXJkLiBUaGVyZSBpcyBhIHRyYWRlb2ZmIGJldHdlZW4gc3BlZWQsIHV0aWxpdHksIGFuZAorICAgICAqIHF1YWxpdHkgb2YgYml0LXNwcmVhZGluZy4gQmVjYXVzZSBtYW55IGNvbW1vbiBzZXRzIG9mIGhhc2hlcworICAgICAqIGFyZSBhbHJlYWR5IHJlYXNvbmFibHkgZGlzdHJpYnV0ZWQgKHNvIGRvbid0IGJlbmVmaXQgZnJvbQorICAgICAqIHNwcmVhZGluZyksIGFuZCBiZWNhdXNlIHdlIHVzZSB0cmVlcyB0byBoYW5kbGUgbGFyZ2Ugc2V0cyBvZgorICAgICAqIGNvbGxpc2lvbnMgaW4gYmlucywgd2UganVzdCBYT1Igc29tZSBzaGlmdGVkIGJpdHMgaW4gdGhlCisgICAgICogY2hlYXBlc3QgcG9zc2libGUgd2F5IHRvIHJlZHVjZSBzeXN0ZW1hdGljIGxvc3NhZ2UsIGFzIHdlbGwgYXMKKyAgICAgKiB0byBpbmNvcnBvcmF0ZSBpbXBhY3Qgb2YgdGhlIGhpZ2hlc3QgYml0cyB0aGF0IHdvdWxkIG90aGVyd2lzZQorICAgICAqIG5ldmVyIGJlIHVzZWQgaW4gaW5kZXggY2FsY3VsYXRpb25zIGJlY2F1c2Ugb2YgdGFibGUgYm91bmRzLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgc3ByZWFkKGZpbmFsIGludCBoKSB7CisgICAgICAgIHJldHVybiAoaCBeIChoID4+PiAxNikpICYgSEFTSF9CSVRTOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBwb3dlciBvZiB0d28gdGFibGUgc2l6ZSBmb3IgdGhlIGdpdmVuIGRlc2lyZWQgY2FwYWNpdHkuCisgICAgICogU2VlIEhhY2tlcnMgRGVsaWdodCwgc2VjIDMuMgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCB0YWJsZVNpemVGb3IoZmluYWwgaW50IGMpIHsKKyAgICAgICAgaW50IG4gPSBjIC0gMTsKKyAgICAgICAgbiB8PSBuID4+PiAxOworICAgICAgICBuIHw9IG4gPj4+IDI7CisgICAgICAgIG4gfD0gbiA+Pj4gNDsKKyAgICAgICAgbiB8PSBuID4+PiA4OworICAgICAgICBuIHw9IG4gPj4+IDE2OworICAgICAgICByZXR1cm4gKG4gPCAwKSA/IDEgOiAobiA+PSBNQVhJTVVNX0NBUEFDSVRZKSA/IE1BWElNVU1fQ0FQQUNJVFkgOiBuICsgMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHgncyBDbGFzcyBpZiBpdCBpcyBvZiB0aGUgZm9ybSAiY2xhc3MgQyBpbXBsZW1lbnRzCisgICAgICogQ29tcGFyYWJsZTxDPiIsIGVsc2UgbnVsbC4KKyAgICAgKi8KKyAgICBzdGF0aWMgQ2xhc3M8Pz4gY29tcGFyYWJsZUNsYXNzRm9yKGZpbmFsIE9iamVjdCB4KSB7CisgICAgICAgIGlmICh4IGluc3RhbmNlb2YgQ29tcGFyYWJsZSkgeworICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gYzsKKyAgICAgICAgICAgIGZpbmFsIFR5cGVbXSB0czsKKyAgICAgICAgICAgIFR5cGVbXSBhczsKKyAgICAgICAgICAgIFR5cGUgdDsKKyAgICAgICAgICAgIFBhcmFtZXRlcml6ZWRUeXBlIHA7CisgICAgICAgICAgICBpZiAoKGMgPSB4LmdldENsYXNzKCkpID09IFN0cmluZy5jbGFzcykgLy8gYnlwYXNzIGNoZWNrcworICAgICAgICAgICAgICAgIHJldHVybiBjOworICAgICAgICAgICAgaWYgKCh0cyA9IGMuZ2V0R2VuZXJpY0ludGVyZmFjZXMoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCgodCA9IHRzW2ldKSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRUeXBlKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocCA9IChQYXJhbWV0ZXJpemVkVHlwZSkgdCkuZ2V0UmF3VHlwZSgpID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wYXJhYmxlLmNsYXNzKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhcyA9IHAuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpKSAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMubGVuZ3RoID09IDEgJiYgYXNbMF0gPT0gYykgLy8gdHlwZSBhcmcgaXMgYworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgay5jb21wYXJlVG8oeCkgaWYgeCBtYXRjaGVzIGtjIChrJ3Mgc2NyZWVuZWQgY29tcGFyYWJsZQorICAgICAqIGNsYXNzKSwgZWxzZSAwLgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsicmF3dHlwZXMiLCAidW5jaGVja2VkIn0pIC8vIGZvciBjYXN0IHRvIENvbXBhcmFibGUKKyAgICBzdGF0aWMgaW50IGNvbXBhcmVDb21wYXJhYmxlcyhmaW5hbCBDbGFzczw/PiBrYywgZmluYWwgT2JqZWN0IGssIGZpbmFsIE9iamVjdCB4KSB7CisgICAgICAgIHJldHVybiAoeCA9PSBudWxsIHx8IHguZ2V0Q2xhc3MoKSAhPSBrYyA/IDAgOgorICAgICAgICAgICAgICAgICgoQ29tcGFyYWJsZSkgaykuY29tcGFyZVRvKHgpKTsKKyAgICB9CisKKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tIFRhYmxlIGVsZW1lbnQgYWNjZXNzIC0tLS0tLS0tLS0tLS0tICovCisKKyAgICAvKgorICAgICAqIFZvbGF0aWxlIGFjY2VzcyBtZXRob2RzIGFyZSB1c2VkIGZvciB0YWJsZSBlbGVtZW50cyBhcyB3ZWxsIGFzCisgICAgICogZWxlbWVudHMgb2YgaW4tcHJvZ3Jlc3MgbmV4dCB0YWJsZSB3aGlsZSByZXNpemluZy4gIEFsbCB1c2VzIG9mCisgICAgICogdGhlIHRhYiBhcmd1bWVudHMgbXVzdCBiZSBudWxsIGNoZWNrZWQgYnkgY2FsbGVycy4gIEFsbCBjYWxsZXJzCisgICAgICogYWxzbyBwYXJhbm9pY2FsbHkgcHJlY2hlY2sgdGhhdCB0YWIncyBsZW5ndGggaXMgbm90IHplcm8gKG9yIGFuCisgICAgICogZXF1aXZhbGVudCBjaGVjayksIHRodXMgZW5zdXJpbmcgdGhhdCBhbnkgaW5kZXggYXJndW1lbnQgdGFraW5nCisgICAgICogdGhlIGZvcm0gb2YgYSBoYXNoIHZhbHVlIGFuZGVkIHdpdGggKGxlbmd0aCAtIDEpIGlzIGEgdmFsaWQKKyAgICAgKiBpbmRleC4gIE5vdGUgdGhhdCwgdG8gYmUgY29ycmVjdCB3cnQgYXJiaXRyYXJ5IGNvbmN1cnJlbmN5CisgICAgICogZXJyb3JzIGJ5IHVzZXJzLCB0aGVzZSBjaGVja3MgbXVzdCBvcGVyYXRlIG9uIGxvY2FsIHZhcmlhYmxlcywKKyAgICAgKiB3aGljaCBhY2NvdW50cyBmb3Igc29tZSBvZGQtbG9va2luZyBpbmxpbmUgYXNzaWdubWVudHMgYmVsb3cuCisgICAgICogTm90ZSB0aGF0IGNhbGxzIHRvIHNldFRhYkF0IGFsd2F5cyBvY2N1ciB3aXRoaW4gbG9ja2VkIHJlZ2lvbnMsCisgICAgICogYW5kIHNvIGluIHByaW5jaXBsZSByZXF1aXJlIG9ubHkgcmVsZWFzZSBvcmRlcmluZywgbm90IG5lZWQKKyAgICAgKiBmdWxsIHZvbGF0aWxlIHNlbWFudGljcywgYnV0IGFyZSBjdXJyZW50bHkgY29kZWQgYXMgdm9sYXRpbGUKKyAgICAgKiB3cml0ZXMgdG8gYmUgY29uc2VydmF0aXZlLgorICAgICAqLworCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgc3RhdGljIGZpbmFsIDxLLCBWPiBOb2RlPEssIFY+IHRhYkF0KGZpbmFsIE5vZGU8SywgVj5bXSB0YWIsIGZpbmFsIGludCBpKSB7CisgICAgICAgIHJldHVybiAoTm9kZTxLLCBWPikgVS5nZXRPYmplY3RWb2xhdGlsZSh0YWIsICgobG9uZykgaSA8PCBBU0hJRlQpICsgQUJBU0UpOworICAgIH0KKworICAgIHN0YXRpYyBmaW5hbCA8SywgVj4gYm9vbGVhbiBjYXNUYWJBdChmaW5hbCBOb2RlPEssIFY+W10gdGFiLCBmaW5hbCBpbnQgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTm9kZTxLLCBWPiBjLCBmaW5hbCBOb2RlPEssIFY+IHYpIHsKKyAgICAgICAgcmV0dXJuIFUuY29tcGFyZUFuZFN3YXBPYmplY3QodGFiLCAoKGxvbmcpIGkgPDwgQVNISUZUKSArIEFCQVNFLCBjLCB2KTsKKyAgICB9CisKKyAgICBzdGF0aWMgZmluYWwgPEssIFY+IHZvaWQgc2V0VGFiQXQoZmluYWwgTm9kZTxLLCBWPltdIHRhYiwgZmluYWwgaW50IGksIGZpbmFsIE5vZGU8SywgVj4gdikgeworICAgICAgICBVLnB1dE9iamVjdFZvbGF0aWxlKHRhYiwgKChsb25nKSBpIDw8IEFTSElGVCkgKyBBQkFTRSwgdik7CisgICAgfQorCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLSBGaWVsZHMgLS0tLS0tLS0tLS0tLS0gKi8KKworICAgIC8qKgorICAgICAqIFRoZSBhcnJheSBvZiBiaW5zLiBMYXppbHkgaW5pdGlhbGl6ZWQgdXBvbiBmaXJzdCBpbnNlcnRpb24uCisgICAgICogU2l6ZSBpcyBhbHdheXMgYSBwb3dlciBvZiB0d28uIEFjY2Vzc2VkIGRpcmVjdGx5IGJ5IGl0ZXJhdG9ycy4KKyAgICAgKi8KKyAgICB0cmFuc2llbnQgdm9sYXRpbGUgTm9kZTxLLCBWPltdIHRhYmxlOworCisgICAgLyoqCisgICAgICogVGhlIG5leHQgdGFibGUgdG8gdXNlOyBub24tbnVsbCBvbmx5IHdoaWxlIHJlc2l6aW5nLgorICAgICAqLworICAgIHByaXZhdGUgdHJhbnNpZW50IHZvbGF0aWxlIE5vZGU8SywgVj5bXSBuZXh0VGFibGU7CisKKyAgICAvKioKKyAgICAgKiBCYXNlIGNvdW50ZXIgdmFsdWUsIHVzZWQgbWFpbmx5IHdoZW4gdGhlcmUgaXMgbm8gY29udGVudGlvbiwKKyAgICAgKiBidXQgYWxzbyBhcyBhIGZhbGxiYWNrIGR1cmluZyB0YWJsZSBpbml0aWFsaXphdGlvbgorICAgICAqIHJhY2VzLiBVcGRhdGVkIHZpYSBDQVMuCisgICAgICovCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgdm9sYXRpbGUgbG9uZyBiYXNlQ291bnQ7CisKKyAgICAvKioKKyAgICAgKiBUYWJsZSBpbml0aWFsaXphdGlvbiBhbmQgcmVzaXppbmcgY29udHJvbC4gIFdoZW4gbmVnYXRpdmUsIHRoZQorICAgICAqIHRhYmxlIGlzIGJlaW5nIGluaXRpYWxpemVkIG9yIHJlc2l6ZWQ6IC0xIGZvciBpbml0aWFsaXphdGlvbiwKKyAgICAgKiBlbHNlIC0oMSArIHRoZSBudW1iZXIgb2YgYWN0aXZlIHJlc2l6aW5nIHRocmVhZHMpLiAgT3RoZXJ3aXNlLAorICAgICAqIHdoZW4gdGFibGUgaXMgbnVsbCwgaG9sZHMgdGhlIGluaXRpYWwgdGFibGUgc2l6ZSB0byB1c2UgdXBvbgorICAgICAqIGNyZWF0aW9uLCBvciAwIGZvciBkZWZhdWx0LiBBZnRlciBpbml0aWFsaXphdGlvbiwgaG9sZHMgdGhlCisgICAgICogbmV4dCBlbGVtZW50IGNvdW50IHZhbHVlIHVwb24gd2hpY2ggdG8gcmVzaXplIHRoZSB0YWJsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHRyYW5zaWVudCB2b2xhdGlsZSBpbnQgc2l6ZUN0bDsKKworICAgIC8qKgorICAgICAqIFRoZSBuZXh0IHRhYmxlIGluZGV4IChwbHVzIG9uZSkgdG8gc3BsaXQgd2hpbGUgcmVzaXppbmcuCisgICAgICovCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgdm9sYXRpbGUgaW50IHRyYW5zZmVySW5kZXg7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbGVhc3QgYXZhaWxhYmxlIHRhYmxlIGluZGV4IHRvIHNwbGl0IHdoaWxlIHJlc2l6aW5nLgorICAgICAqLworICAgIHByaXZhdGUgdHJhbnNpZW50IHZvbGF0aWxlIGludCB0cmFuc2Zlck9yaWdpbjsKKworICAgIC8qKgorICAgICAqIFNwaW5sb2NrIChsb2NrZWQgdmlhIENBUykgdXNlZCB3aGVuIHJlc2l6aW5nIGFuZC9vciBjcmVhdGluZyBDb3VudGVyQ2VsbHMuCisgICAgICovCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgdm9sYXRpbGUgaW50IGNlbGxzQnVzeTsKKworICAgIC8qKgorICAgICAqIFRhYmxlIG9mIGNvdW50ZXIgY2VsbHMuIFdoZW4gbm9uLW51bGwsIHNpemUgaXMgYSBwb3dlciBvZiAyLgorICAgICAqLworICAgIHByaXZhdGUgdHJhbnNpZW50IHZvbGF0aWxlIENvdW50ZXJDZWxsW10gY291bnRlckNlbGxzOworCisgICAgLy8gdmlld3MKKyAgICBwcml2YXRlIHRyYW5zaWVudCBLZXlTZXRWaWV3PEssIFY+IGtleVNldDsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBWYWx1ZXNWaWV3PEssIFY+IHZhbHVlczsKKyAgICBwcml2YXRlIHRyYW5zaWVudCBFbnRyeVNldFZpZXc8SywgVj4gZW50cnlTZXQ7CisKKworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0gUHVibGljIG9wZXJhdGlvbnMgLS0tLS0tLS0tLS0tLS0gKi8KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcsIGVtcHR5IG1hcCB3aXRoIHRoZSBkZWZhdWx0IGluaXRpYWwgdGFibGUgc2l6ZSAoMTYpLgorICAgICAqLworICAgIENvbmN1cnJlbnRIYXNoTWFwVjgoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldywgZW1wdHkgbWFwIHdpdGggYW4gaW5pdGlhbCB0YWJsZSBzaXplCisgICAgICogYWNjb21tb2RhdGluZyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBlbGVtZW50cyB3aXRob3V0IHRoZSBuZWVkCisgICAgICogdG8gZHluYW1pY2FsbHkgcmVzaXplLgorICAgICAqCisgICAgICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eSBUaGUgaW1wbGVtZW50YXRpb24gcGVyZm9ybXMgaW50ZXJuYWwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHNpemluZyB0byBhY2NvbW1vZGF0ZSB0aGlzIG1hbnkgZWxlbWVudHMuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGluaXRpYWwgY2FwYWNpdHkgb2YKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50cyBpcyBuZWdhdGl2ZQorICAgICAqLworICAgIENvbmN1cnJlbnRIYXNoTWFwVjgoZmluYWwgaW50IGluaXRpYWxDYXBhY2l0eSkgeworICAgICAgICBpZiAoaW5pdGlhbENhcGFjaXR5IDwgMCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgZmluYWwgaW50IGNhcCA9ICgoaW5pdGlhbENhcGFjaXR5ID49IChNQVhJTVVNX0NBUEFDSVRZID4+PiAxKSkgPworICAgICAgICAgICAgICAgIE1BWElNVU1fQ0FQQUNJVFkgOgorICAgICAgICAgICAgICAgIHRhYmxlU2l6ZUZvcihpbml0aWFsQ2FwYWNpdHkgKyAoaW5pdGlhbENhcGFjaXR5ID4+PiAxKSArIDEpKTsKKyAgICAgICAgdGhpcy5zaXplQ3RsID0gY2FwOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgbWFwIHdpdGggdGhlIHNhbWUgbWFwcGluZ3MgYXMgdGhlIGdpdmVuIG1hcC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtIHRoZSBtYXAKKyAgICAgKi8KKyAgICBDb25jdXJyZW50SGFzaE1hcFY4KGZpbmFsIE1hcDw/IGV4dGVuZHMgSywgPyBleHRlbmRzIFY+IG0pIHsKKyAgICAgICAgdGhpcy5zaXplQ3RsID0gREVGQVVMVF9DQVBBQ0lUWTsKKyAgICAgICAgcHV0QWxsKG0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcsIGVtcHR5IG1hcCB3aXRoIGFuIGluaXRpYWwgdGFibGUgc2l6ZSBiYXNlZCBvbgorICAgICAqIHRoZSBnaXZlbiBudW1iZXIgb2YgZWxlbWVudHMgKHtAY29kZSBpbml0aWFsQ2FwYWNpdHl9KSBhbmQKKyAgICAgKiBpbml0aWFsIHRhYmxlIGRlbnNpdHkgKHtAY29kZSBsb2FkRmFjdG9yfSkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5pdGlhbENhcGFjaXR5IHRoZSBpbml0aWFsIGNhcGFjaXR5LiBUaGUgaW1wbGVtZW50YXRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1zIGludGVybmFsIHNpemluZyB0byBhY2NvbW1vZGF0ZSB0aGlzIG1hbnkgZWxlbWVudHMsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICBnaXZlbiB0aGUgc3BlY2lmaWVkIGxvYWQgZmFjdG9yLgorICAgICAqIEBwYXJhbSBsb2FkRmFjdG9yICAgICAgdGhlIGxvYWQgZmFjdG9yICh0YWJsZSBkZW5zaXR5KSBmb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGVzdGFibGlzaGluZyB0aGUgaW5pdGlhbCB0YWJsZSBzaXplCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGluaXRpYWwgY2FwYWNpdHkgb2YKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50cyBpcyBuZWdhdGl2ZSBvciB0aGUgbG9hZCBmYWN0b3IgaXMgbm9ucG9zaXRpdmUKKyAgICAgKiBAc2luY2UgMS42CisgICAgICovCisgICAgQ29uY3VycmVudEhhc2hNYXBWOChmaW5hbCBpbnQgaW5pdGlhbENhcGFjaXR5LCBmaW5hbCBmbG9hdCBsb2FkRmFjdG9yKSB7CisgICAgICAgIHRoaXMoaW5pdGlhbENhcGFjaXR5LCBsb2FkRmFjdG9yLCAxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3LCBlbXB0eSBtYXAgd2l0aCBhbiBpbml0aWFsIHRhYmxlIHNpemUgYmFzZWQgb24KKyAgICAgKiB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGVsZW1lbnRzICh7QGNvZGUgaW5pdGlhbENhcGFjaXR5fSksIHRhYmxlCisgICAgICogZGVuc2l0eSAoe0Bjb2RlIGxvYWRGYWN0b3J9KSwgYW5kIG51bWJlciBvZiBjb25jdXJyZW50bHkKKyAgICAgKiB1cGRhdGluZyB0aHJlYWRzICh7QGNvZGUgY29uY3VycmVuY3lMZXZlbH0pLgorICAgICAqCisgICAgICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eSAgdGhlIGluaXRpYWwgY2FwYWNpdHkuIFRoZSBpbXBsZW1lbnRhdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1zIGludGVybmFsIHNpemluZyB0byBhY2NvbW1vZGF0ZSB0aGlzIG1hbnkgZWxlbWVudHMsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gdGhlIHNwZWNpZmllZCBsb2FkIGZhY3Rvci4KKyAgICAgKiBAcGFyYW0gbG9hZEZhY3RvciAgICAgICB0aGUgbG9hZCBmYWN0b3IgKHRhYmxlIGRlbnNpdHkpIGZvcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGVzdGFibGlzaGluZyB0aGUgaW5pdGlhbCB0YWJsZSBzaXplCisgICAgICogQHBhcmFtIGNvbmN1cnJlbmN5TGV2ZWwgdGhlIGVzdGltYXRlZCBudW1iZXIgb2YgY29uY3VycmVudGx5CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRpbmcgdGhyZWFkcy4gVGhlIGltcGxlbWVudGF0aW9uIG1heSB1c2UgdGhpcyB2YWx1ZSBhcworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGEgc2l6aW5nIGhpbnQuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGluaXRpYWwgY2FwYWNpdHkgaXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWdhdGl2ZSBvciB0aGUgbG9hZCBmYWN0b3Igb3IgY29uY3VycmVuY3lMZXZlbCBhcmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub25wb3NpdGl2ZQorICAgICAqLworICAgIENvbmN1cnJlbnRIYXNoTWFwVjgoaW50IGluaXRpYWxDYXBhY2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGZsb2F0IGxvYWRGYWN0b3IsIGZpbmFsIGludCBjb25jdXJyZW5jeUxldmVsKSB7CisgICAgICAgIGlmICghKGxvYWRGYWN0b3IgPiAwLjBmKSB8fCBpbml0aWFsQ2FwYWNpdHkgPCAwIHx8IGNvbmN1cnJlbmN5TGV2ZWwgPD0gMCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgaWYgKGluaXRpYWxDYXBhY2l0eSA8IGNvbmN1cnJlbmN5TGV2ZWwpICAgLy8gVXNlIGF0IGxlYXN0IGFzIG1hbnkgYmlucworICAgICAgICAgICAgaW5pdGlhbENhcGFjaXR5ID0gY29uY3VycmVuY3lMZXZlbDsgICAvLyBhcyBlc3RpbWF0ZWQgdGhyZWFkcworICAgICAgICBmaW5hbCBsb25nIHNpemUgPSAobG9uZykgKDEuMCArIChsb25nKSBpbml0aWFsQ2FwYWNpdHkgLyBsb2FkRmFjdG9yKTsKKyAgICAgICAgZmluYWwgaW50IGNhcCA9IChzaXplID49IChsb25nKSBNQVhJTVVNX0NBUEFDSVRZKSA/CisgICAgICAgICAgICAgICAgTUFYSU1VTV9DQVBBQ0lUWSA6IHRhYmxlU2l6ZUZvcigoaW50KSBzaXplKTsKKyAgICAgICAgdGhpcy5zaXplQ3RsID0gY2FwOworICAgIH0KKworICAgIC8vIE9yaWdpbmFsIChzaW5jZSBKREsxLjIpIE1hcCBtZXRob2RzCisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICBmaW5hbCBsb25nIG4gPSBzdW1Db3VudCgpOworICAgICAgICByZXR1cm4gKChuIDwgMEwpID8gMCA6CisgICAgICAgICAgICAgICAgKG4gPiAobG9uZykgSW50ZWdlci5NQVhfVkFMVUUpID8gSW50ZWdlci5NQVhfVkFMVUUgOgorICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgbik7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgICAgIHJldHVybiBzdW1Db3VudCgpIDw9IDBMOyAvLyBpZ25vcmUgdHJhbnNpZW50IG5lZ2F0aXZlIHZhbHVlcworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIHRvIHdoaWNoIHRoZSBzcGVjaWZpZWQga2V5IGlzIG1hcHBlZCwKKyAgICAgKiBvciB7QGNvZGUgbnVsbH0gaWYgdGhpcyBtYXAgY29udGFpbnMgbm8gbWFwcGluZyBmb3IgdGhlIGtleS4KKyAgICAgKgorICAgICAqIDxwPk1vcmUgZm9ybWFsbHksIGlmIHRoaXMgbWFwIGNvbnRhaW5zIGEgbWFwcGluZyBmcm9tIGEga2V5CisgICAgICoge0Bjb2RlIGt9IHRvIGEgdmFsdWUge0Bjb2RlIHZ9IHN1Y2ggdGhhdCB7QGNvZGUga2V5LmVxdWFscyhrKX0sCisgICAgICogdGhlbiB0aGlzIG1ldGhvZCByZXR1cm5zIHtAY29kZSB2fTsgb3RoZXJ3aXNlIGl0IHJldHVybnMKKyAgICAgKiB7QGNvZGUgbnVsbH0uICAoVGhlcmUgY2FuIGJlIGF0IG1vc3Qgb25lIHN1Y2ggbWFwcGluZy4pCisgICAgICoKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQga2V5IGlzIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgViBnZXQoZmluYWwgT2JqZWN0IGtleSkgeworICAgICAgICBmaW5hbCBOb2RlPEssIFY+W10gdGFiOworICAgICAgICBOb2RlPEssIFY+IGU7CisgICAgICAgIGZpbmFsIE5vZGU8SywgVj4gcDsKKyAgICAgICAgZmluYWwgaW50IG47CisgICAgICAgIGZpbmFsIGludCBlaDsKKyAgICAgICAgSyBlazsKKyAgICAgICAgZmluYWwgaW50IGggPSBzcHJlYWQoa2V5Lmhhc2hDb2RlKCkpOworICAgICAgICBpZiAoKHRhYiA9IHRhYmxlKSAhPSBudWxsICYmIChuID0gdGFiLmxlbmd0aCkgPiAwICYmCisgICAgICAgICAgICAgICAgKGUgPSB0YWJBdCh0YWIsIChuIC0gMSkgJiBoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKChlaCA9IGUuaGFzaCkgPT0gaCkgeworICAgICAgICAgICAgICAgIGlmICgoZWsgPSBlLmtleSkgPT0ga2V5IHx8IChlayAhPSBudWxsICYmIGtleS5lcXVhbHMoZWspKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudmFsOworICAgICAgICAgICAgfSBlbHNlIGlmIChlaCA8IDApCisgICAgICAgICAgICAgICAgcmV0dXJuIChwID0gZS5maW5kKGgsIGtleSkpICE9IG51bGwgPyBwLnZhbCA6IG51bGw7CisgICAgICAgICAgICB3aGlsZSAoKGUgPSBlLm5leHQpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoZS5oYXNoID09IGggJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICgoZWsgPSBlLmtleSkgPT0ga2V5IHx8IChlayAhPSBudWxsICYmIGtleS5lcXVhbHMoZWspKSkpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnZhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBhIGtleSBpbiB0aGlzIHRhYmxlLgorICAgICAqCisgICAgICogQHBhcmFtIGtleSBwb3NzaWJsZSBrZXkKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBhbmQgb25seSBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdAorICAgICAqICAgICAgICAgaXMgYSBrZXkgaW4gdGhpcyB0YWJsZSwgYXMgZGV0ZXJtaW5lZCBieSB0aGUKKyAgICAgKiAgICAgICAgIHtAY29kZSBlcXVhbHN9IG1ldGhvZDsge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQga2V5IGlzIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShmaW5hbCBPYmplY3Qga2V5KSB7CisgICAgICAgIHJldHVybiBnZXQoa2V5KSAhPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgbWFwIG1hcHMgb25lIG9yIG1vcmUga2V5cyB0byB0aGUKKyAgICAgKiBzcGVjaWZpZWQgdmFsdWUuIE5vdGU6IFRoaXMgbWV0aG9kIG1heSByZXF1aXJlIGEgZnVsbCB0cmF2ZXJzYWwKKyAgICAgKiBvZiB0aGUgbWFwLCBhbmQgaXMgbXVjaCBzbG93ZXIgdGhhbiBtZXRob2Qge0Bjb2RlIGNvbnRhaW5zS2V5fS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSB3aG9zZSBwcmVzZW5jZSBpbiB0aGlzIG1hcCBpcyB0byBiZSB0ZXN0ZWQKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIG1hcCBtYXBzIG9uZSBvciBtb3JlIGtleXMgdG8gdGhlCisgICAgICogICAgICAgICBzcGVjaWZpZWQgdmFsdWUKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgbnVsbAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmFsdWUoZmluYWwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgICAgIGZpbmFsIE5vZGU8SywgVj5bXSB0OworICAgICAgICBpZiAoKHQgPSB0YWJsZSkgIT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgVHJhdmVyc2VyPEssIFY+IGl0ID0gbmV3IFRyYXZlcnNlcjxLLCBWPih0LCB0Lmxlbmd0aCwgMCwgdC5sZW5ndGgpOworICAgICAgICAgICAgZm9yIChOb2RlPEssIFY+IHA7IChwID0gaXQuYWR2YW5jZSgpKSAhPSBudWxsOyApIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBWIHY7CisgICAgICAgICAgICAgICAgaWYgKCh2ID0gcC52YWwpID09IHZhbHVlIHx8ICh2ICE9IG51bGwgJiYgdmFsdWUuZXF1YWxzKHYpKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1hcHMgdGhlIHNwZWNpZmllZCBrZXkgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZSBpbiB0aGlzIHRhYmxlLgorICAgICAqIE5laXRoZXIgdGhlIGtleSBub3IgdGhlIHZhbHVlIGNhbiBiZSBudWxsLgorICAgICAqCisgICAgICogPHA+VGhlIHZhbHVlIGNhbiBiZSByZXRyaWV2ZWQgYnkgY2FsbGluZyB0aGUge0Bjb2RlIGdldH0gbWV0aG9kCisgICAgICogd2l0aCBhIGtleSB0aGF0IGlzIGVxdWFsIHRvIHRoZSBvcmlnaW5hbCBrZXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5ICAga2V5IHdpdGggd2hpY2ggdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyB0byBiZSBhc3NvY2lhdGVkCisgICAgICogQHBhcmFtIHZhbHVlIHZhbHVlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleQorICAgICAqIEByZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB7QGNvZGUga2V5fSwgb3IKKyAgICAgKiAgICAgICAgIHtAY29kZSBudWxsfSBpZiB0aGVyZSB3YXMgbm8gbWFwcGluZyBmb3Ige0Bjb2RlIGtleX0KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQga2V5IG9yIHZhbHVlIGlzIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgViBwdXQoZmluYWwgSyBrZXksIGZpbmFsIFYgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIHB1dFZhbChrZXksIHZhbHVlLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50YXRpb24gZm9yIHB1dCBhbmQgcHV0SWZBYnNlbnQKKyAgICAgKi8KKyAgICBmaW5hbCBWIHB1dFZhbChmaW5hbCBLIGtleSwgZmluYWwgViB2YWx1ZSwgZmluYWwgYm9vbGVhbiBvbmx5SWZBYnNlbnQpIHsKKyAgICAgICAgaWYgKGtleSA9PSBudWxsIHx8IHZhbHVlID09IG51bGwpIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgICBmaW5hbCBpbnQgaGFzaCA9IHNwcmVhZChrZXkuaGFzaENvZGUoKSk7CisgICAgICAgIGludCBiaW5Db3VudCA9IDA7CisgICAgICAgIGZvciAoTm9kZTxLLCBWPltdIHRhYiA9IHRhYmxlOyA7ICkgeworICAgICAgICAgICAgZmluYWwgTm9kZTxLLCBWPiBmOworICAgICAgICAgICAgZmluYWwgaW50IG47CisgICAgICAgICAgICBmaW5hbCBpbnQgaTsKKyAgICAgICAgICAgIGZpbmFsIGludCBmaDsKKyAgICAgICAgICAgIGlmICh0YWIgPT0gbnVsbCB8fCAobiA9IHRhYi5sZW5ndGgpID09IDApCisgICAgICAgICAgICAgICAgdGFiID0gaW5pdFRhYmxlKCk7CisgICAgICAgICAgICBlbHNlIGlmICgoZiA9IHRhYkF0KHRhYiwgaSA9IChuIC0gMSkgJiBoYXNoKSkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChjYXNUYWJBdCh0YWIsIGksIG51bGwsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm9kZTxLLCBWPihoYXNoLCBrZXksIHZhbHVlLCBudWxsKSkpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAvLyBubyBsb2NrIHdoZW4gYWRkaW5nIHRvIGVtcHR5IGJpbgorICAgICAgICAgICAgfSBlbHNlIGlmICgoZmggPSBmLmhhc2gpID09IE1PVkVEKQorICAgICAgICAgICAgICAgIHRhYiA9IGhlbHBUcmFuc2Zlcih0YWIsIGYpOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgViBvbGRWYWwgPSBudWxsOworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoZikgeworICAgICAgICAgICAgICAgICAgICBpZiAodGFiQXQodGFiLCBpKSA9PSBmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbkNvdW50ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKE5vZGU8SywgVj4gZSA9IGY7IDsgKytiaW5Db3VudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBLIGVrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS5oYXNoID09IGhhc2ggJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGVrID0gZS5rZXkpID09IGtleSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVrICE9IG51bGwgJiYga2V5LmVxdWFscyhlaykpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkVmFsID0gZS52YWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9ubHlJZkFic2VudCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnZhbCA9IHZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTm9kZTxLLCBWPiBwcmVkID0gZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChlID0gZS5uZXh0KSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkLm5leHQgPSBuZXcgTm9kZTxLLCBWPihoYXNoLCBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmIGluc3RhbmNlb2YgVHJlZUJpbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE5vZGU8SywgVj4gcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5Db3VudCA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwID0gKChUcmVlQmluPEssIFY+KSBmKS5wdXRUcmVlVmFsKGhhc2gsIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRWYWwgPSBwLnZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvbmx5SWZBYnNlbnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLnZhbCA9IHZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYmluQ291bnQgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYmluQ291bnQgPj0gVFJFRUlGWV9USFJFU0hPTEQpCisgICAgICAgICAgICAgICAgICAgICAgICB0cmVlaWZ5QmluKHRhYiwgaSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvbGRWYWwgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvbGRWYWw7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhZGRDb3VudCgxTCwgYmluQ291bnQpOworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb3BpZXMgYWxsIG9mIHRoZSBtYXBwaW5ncyBmcm9tIHRoZSBzcGVjaWZpZWQgbWFwIHRvIHRoaXMgb25lLgorICAgICAqIFRoZXNlIG1hcHBpbmdzIHJlcGxhY2UgYW55IG1hcHBpbmdzIHRoYXQgdGhpcyBtYXAgaGFkIGZvciBhbnkgb2YgdGhlCisgICAgICoga2V5cyBjdXJyZW50bHkgaW4gdGhlIHNwZWNpZmllZCBtYXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbSBtYXBwaW5ncyB0byBiZSBzdG9yZWQgaW4gdGhpcyBtYXAKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwdXRBbGwoZmluYWwgTWFwPD8gZXh0ZW5kcyBLLCA/IGV4dGVuZHMgVj4gbSkgeworICAgICAgICB0cnlQcmVzaXplKG0uc2l6ZSgpKTsKKyAgICAgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8PyBleHRlbmRzIEssID8gZXh0ZW5kcyBWPiBlIDogbS5lbnRyeVNldCgpKQorICAgICAgICAgICAgcHV0VmFsKGUuZ2V0S2V5KCksIGUuZ2V0VmFsdWUoKSwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgdGhlIGtleSAoYW5kIGl0cyBjb3JyZXNwb25kaW5nIHZhbHVlKSBmcm9tIHRoaXMgbWFwLgorICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90aGluZyBpZiB0aGUga2V5IGlzIG5vdCBpbiB0aGUgbWFwLgorICAgICAqCisgICAgICogQHBhcmFtIGtleSB0aGUga2V5IHRoYXQgbmVlZHMgdG8gYmUgcmVtb3ZlZAorICAgICAqIEByZXR1cm4gdGhlIHByZXZpb3VzIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB7QGNvZGUga2V5fSwgb3IKKyAgICAgKiAgICAgICAgIHtAY29kZSBudWxsfSBpZiB0aGVyZSB3YXMgbm8gbWFwcGluZyBmb3Ige0Bjb2RlIGtleX0KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQga2V5IGlzIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgViByZW1vdmUoZmluYWwgT2JqZWN0IGtleSkgeworICAgICAgICByZXR1cm4gcmVwbGFjZU5vZGUoa2V5LCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGZvdXIgcHVibGljIHJlbW92ZS9yZXBsYWNlIG1ldGhvZHM6CisgICAgICogUmVwbGFjZXMgbm9kZSB2YWx1ZSB3aXRoIHYsIGNvbmRpdGlvbmFsIHVwb24gbWF0Y2ggb2YgY3YgaWYKKyAgICAgKiBub24tbnVsbC4gIElmIHJlc3VsdGluZyB2YWx1ZSBpcyBudWxsLCBkZWxldGUuCisgICAgICovCisgICAgZmluYWwgViByZXBsYWNlTm9kZShmaW5hbCBPYmplY3Qga2V5LCBmaW5hbCBWIHZhbHVlLCBmaW5hbCBPYmplY3QgY3YpIHsKKyAgICAgICAgZmluYWwgaW50IGhhc2ggPSBzcHJlYWQoa2V5Lmhhc2hDb2RlKCkpOworICAgICAgICBmb3IgKE5vZGU8SywgVj5bXSB0YWIgPSB0YWJsZTsgOyApIHsKKyAgICAgICAgICAgIGZpbmFsIE5vZGU8SywgVj4gZjsKKyAgICAgICAgICAgIGZpbmFsIGludCBuOworICAgICAgICAgICAgZmluYWwgaW50IGk7CisgICAgICAgICAgICBmaW5hbCBpbnQgZmg7CisgICAgICAgICAgICBpZiAodGFiID09IG51bGwgfHwgKG4gPSB0YWIubGVuZ3RoKSA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgIChmID0gdGFiQXQodGFiLCBpID0gKG4gLSAxKSAmIGhhc2gpKSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZWxzZSBpZiAoKGZoID0gZi5oYXNoKSA9PSBNT1ZFRCkKKyAgICAgICAgICAgICAgICB0YWIgPSBoZWxwVHJhbnNmZXIodGFiLCBmKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIFYgb2xkVmFsID0gbnVsbDsKKyAgICAgICAgICAgICAgICBib29sZWFuIHZhbGlkYXRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoZikgeworICAgICAgICAgICAgICAgICAgICBpZiAodGFiQXQodGFiLCBpKSA9PSBmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChOb2RlPEssIFY+IGUgPSBmLCBwcmVkID0gbnVsbDsgOyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSyBlazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuaGFzaCA9PSBoYXNoICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChlayA9IGUua2V5KSA9PSBrZXkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlayAhPSBudWxsICYmIGtleS5lcXVhbHMoZWspKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFYgZXYgPSBlLnZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdiA9PSBudWxsIHx8IGN2ID09IGV2IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChldiAhPSBudWxsICYmIGN2LmVxdWFscyhldikpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkVmFsID0gZXY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUudmFsID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocHJlZCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkLm5leHQgPSBlLm5leHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUYWJBdCh0YWIsIGksIGUubmV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkID0gZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChlID0gZS5uZXh0KSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmIGluc3RhbmNlb2YgVHJlZUJpbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVHJlZUJpbjxLLCBWPiB0ID0gKFRyZWVCaW48SywgVj4pIGY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVHJlZU5vZGU8SywgVj4gcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUcmVlTm9kZTxLLCBWPiBwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgociA9IHQucm9vdCkgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHAgPSByLmZpbmRUcmVlTm9kZShoYXNoLCBrZXksIG51bGwpKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFYgcHYgPSBwLnZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN2ID09IG51bGwgfHwgY3YgPT0gcHYgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHYgIT0gbnVsbCAmJiBjdi5lcXVhbHMocHYpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkVmFsID0gcHY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwLnZhbCA9IHZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodC5yZW1vdmVUcmVlTm9kZShwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUYWJBdCh0YWIsIGksIHVudHJlZWlmeSh0LmZpcnN0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRlZCkgeworICAgICAgICAgICAgICAgICAgICBpZiAob2xkVmFsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZENvdW50KC0xTCwgLTEpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9sZFZhbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhbGwgb2YgdGhlIG1hcHBpbmdzIGZyb20gdGhpcyBtYXAuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIGxvbmcgZGVsdGEgPSAwTDsgLy8gbmVnYXRpdmUgbnVtYmVyIG9mIGRlbGV0aW9ucworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIE5vZGU8SywgVj5bXSB0YWIgPSB0YWJsZTsKKyAgICAgICAgd2hpbGUgKHRhYiAhPSBudWxsICYmIGkgPCB0YWIubGVuZ3RoKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgZmg7CisgICAgICAgICAgICBmaW5hbCBOb2RlPEssIFY+IGYgPSB0YWJBdCh0YWIsIGkpOworICAgICAgICAgICAgaWYgKGYgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICArK2k7CisgICAgICAgICAgICBlbHNlIGlmICgoZmggPSBmLmhhc2gpID09IE1PVkVEKSB7CisgICAgICAgICAgICAgICAgdGFiID0gaGVscFRyYW5zZmVyKHRhYiwgZik7CisgICAgICAgICAgICAgICAgaSA9IDA7IC8vIHJlc3RhcnQKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChmKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0YWJBdCh0YWIsIGkpID09IGYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5vZGU8SywgVj4gcCA9IChmaCA+PSAwID8gZiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmIGluc3RhbmNlb2YgVHJlZUJpbikgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoVHJlZUJpbjxLLCBWPikgZikuZmlyc3QgOiBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChwICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLWRlbHRhOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBwLm5leHQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRUYWJBdCh0YWIsIGkrKywgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlbHRhICE9IDBMKQorICAgICAgICAgICAgYWRkQ291bnQoZGVsdGEsIC0xKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEge0BsaW5rIFNldH0gdmlldyBvZiB0aGUga2V5cyBjb250YWluZWQgaW4gdGhpcyBtYXAuCisgICAgICogVGhlIHNldCBpcyBiYWNrZWQgYnkgdGhlIG1hcCwgc28gY2hhbmdlcyB0byB0aGUgbWFwIGFyZQorICAgICAqIHJlZmxlY3RlZCBpbiB0aGUgc2V0LCBhbmQgdmljZS12ZXJzYS4gVGhlIHNldCBzdXBwb3J0cyBlbGVtZW50CisgICAgICogcmVtb3ZhbCwgd2hpY2ggcmVtb3ZlcyB0aGUgY29ycmVzcG9uZGluZyBtYXBwaW5nIGZyb20gdGhpcyBtYXAsCisgICAgICogdmlhIHRoZSB7QGNvZGUgSXRlcmF0b3IucmVtb3ZlfSwge0Bjb2RlIFNldC5yZW1vdmV9LAorICAgICAqIHtAY29kZSByZW1vdmVBbGx9LCB7QGNvZGUgcmV0YWluQWxsfSwgYW5kIHtAY29kZSBjbGVhcn0KKyAgICAgKiBvcGVyYXRpb25zLiAgSXQgZG9lcyBub3Qgc3VwcG9ydCB0aGUge0Bjb2RlIGFkZH0gb3IKKyAgICAgKiB7QGNvZGUgYWRkQWxsfSBvcGVyYXRpb25zLgorICAgICAqCisgICAgICogPHA+VGhlIHZpZXcncyB7QGNvZGUgaXRlcmF0b3J9IGlzIGEgIndlYWtseSBjb25zaXN0ZW50IiBpdGVyYXRvcgorICAgICAqIHRoYXQgd2lsbCBuZXZlciB0aHJvdyB7QGxpbmsgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbn0sCisgICAgICogYW5kIGd1YXJhbnRlZXMgdG8gdHJhdmVyc2UgZWxlbWVudHMgYXMgdGhleSBleGlzdGVkIHVwb24KKyAgICAgKiBjb25zdHJ1Y3Rpb24gb2YgdGhlIGl0ZXJhdG9yLCBhbmQgbWF5IChidXQgaXMgbm90IGd1YXJhbnRlZWQgdG8pCisgICAgICogcmVmbGVjdCBhbnkgbW9kaWZpY2F0aW9ucyBzdWJzZXF1ZW50IHRvIGNvbnN0cnVjdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHNldCB2aWV3CisgICAgICovCisgICAgcHVibGljIEtleVNldFZpZXc8SywgVj4ga2V5U2V0KCkgeworICAgICAgICBmaW5hbCBLZXlTZXRWaWV3PEssIFY+IGtzOworICAgICAgICByZXR1cm4gKGtzID0ga2V5U2V0KSAhPSBudWxsID8ga3MgOiAoa2V5U2V0ID0gbmV3IEtleVNldFZpZXc8SywgVj4odGhpcywgbnVsbCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSB7QGxpbmsgQ29sbGVjdGlvbn0gdmlldyBvZiB0aGUgdmFsdWVzIGNvbnRhaW5lZCBpbiB0aGlzIG1hcC4KKyAgICAgKiBUaGUgY29sbGVjdGlvbiBpcyBiYWNrZWQgYnkgdGhlIG1hcCwgc28gY2hhbmdlcyB0byB0aGUgbWFwIGFyZQorICAgICAqIHJlZmxlY3RlZCBpbiB0aGUgY29sbGVjdGlvbiwgYW5kIHZpY2UtdmVyc2EuICBUaGUgY29sbGVjdGlvbgorICAgICAqIHN1cHBvcnRzIGVsZW1lbnQgcmVtb3ZhbCwgd2hpY2ggcmVtb3ZlcyB0aGUgY29ycmVzcG9uZGluZworICAgICAqIG1hcHBpbmcgZnJvbSB0aGlzIG1hcCwgdmlhIHRoZSB7QGNvZGUgSXRlcmF0b3IucmVtb3ZlfSwKKyAgICAgKiB7QGNvZGUgQ29sbGVjdGlvbi5yZW1vdmV9LCB7QGNvZGUgcmVtb3ZlQWxsfSwKKyAgICAgKiB7QGNvZGUgcmV0YWluQWxsfSwgYW5kIHtAY29kZSBjbGVhcn0gb3BlcmF0aW9ucy4gIEl0IGRvZXMgbm90CisgICAgICogc3VwcG9ydCB0aGUge0Bjb2RlIGFkZH0gb3Ige0Bjb2RlIGFkZEFsbH0gb3BlcmF0aW9ucy4KKyAgICAgKgorICAgICAqIDxwPlRoZSB2aWV3J3Mge0Bjb2RlIGl0ZXJhdG9yfSBpcyBhICJ3ZWFrbHkgY29uc2lzdGVudCIgaXRlcmF0b3IKKyAgICAgKiB0aGF0IHdpbGwgbmV2ZXIgdGhyb3cge0BsaW5rIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb259LAorICAgICAqIGFuZCBndWFyYW50ZWVzIHRvIHRyYXZlcnNlIGVsZW1lbnRzIGFzIHRoZXkgZXhpc3RlZCB1cG9uCisgICAgICogY29uc3RydWN0aW9uIG9mIHRoZSBpdGVyYXRvciwgYW5kIG1heSAoYnV0IGlzIG5vdCBndWFyYW50ZWVkIHRvKQorICAgICAqIHJlZmxlY3QgYW55IG1vZGlmaWNhdGlvbnMgc3Vic2VxdWVudCB0byBjb25zdHJ1Y3Rpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjb2xsZWN0aW9uIHZpZXcKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxWPiB2YWx1ZXMoKSB7CisgICAgICAgIGZpbmFsIFZhbHVlc1ZpZXc8SywgVj4gdnM7CisgICAgICAgIHJldHVybiAodnMgPSB2YWx1ZXMpICE9IG51bGwgPyB2cyA6ICh2YWx1ZXMgPSBuZXcgVmFsdWVzVmlldzxLLCBWPih0aGlzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHtAbGluayBTZXR9IHZpZXcgb2YgdGhlIG1hcHBpbmdzIGNvbnRhaW5lZCBpbiB0aGlzIG1hcC4KKyAgICAgKiBUaGUgc2V0IGlzIGJhY2tlZCBieSB0aGUgbWFwLCBzbyBjaGFuZ2VzIHRvIHRoZSBtYXAgYXJlCisgICAgICogcmVmbGVjdGVkIGluIHRoZSBzZXQsIGFuZCB2aWNlLXZlcnNhLiAgVGhlIHNldCBzdXBwb3J0cyBlbGVtZW50CisgICAgICogcmVtb3ZhbCwgd2hpY2ggcmVtb3ZlcyB0aGUgY29ycmVzcG9uZGluZyBtYXBwaW5nIGZyb20gdGhlIG1hcCwKKyAgICAgKiB2aWEgdGhlIHtAY29kZSBJdGVyYXRvci5yZW1vdmV9LCB7QGNvZGUgU2V0LnJlbW92ZX0sCisgICAgICoge0Bjb2RlIHJlbW92ZUFsbH0sIHtAY29kZSByZXRhaW5BbGx9LCBhbmQge0Bjb2RlIGNsZWFyfQorICAgICAqIG9wZXJhdGlvbnMuCisgICAgICoKKyAgICAgKiA8cD5UaGUgdmlldydzIHtAY29kZSBpdGVyYXRvcn0gaXMgYSAid2Vha2x5IGNvbnNpc3RlbnQiIGl0ZXJhdG9yCisgICAgICogdGhhdCB3aWxsIG5ldmVyIHRocm93IHtAbGluayBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9ufSwKKyAgICAgKiBhbmQgZ3VhcmFudGVlcyB0byB0cmF2ZXJzZSBlbGVtZW50cyBhcyB0aGV5IGV4aXN0ZWQgdXBvbgorICAgICAqIGNvbnN0cnVjdGlvbiBvZiB0aGUgaXRlcmF0b3IsIGFuZCBtYXkgKGJ1dCBpcyBub3QgZ3VhcmFudGVlZCB0bykKKyAgICAgKiByZWZsZWN0IGFueSBtb2RpZmljYXRpb25zIHN1YnNlcXVlbnQgdG8gY29uc3RydWN0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgc2V0IHZpZXcKKyAgICAgKi8KKyAgICBwdWJsaWMgU2V0PE1hcC5FbnRyeTxLLCBWPj4gZW50cnlTZXQoKSB7CisgICAgICAgIGZpbmFsIEVudHJ5U2V0VmlldzxLLCBWPiBlczsKKyAgICAgICAgcmV0dXJuIChlcyA9IGVudHJ5U2V0KSAhPSBudWxsID8gZXMgOiAoZW50cnlTZXQgPSBuZXcgRW50cnlTZXRWaWV3PEssIFY+KHRoaXMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoaXMge0BsaW5rIE1hcH0sIGkuZS4sCisgICAgICogdGhlIHN1bSBvZiwgZm9yIGVhY2gga2V5LXZhbHVlIHBhaXIgaW4gdGhlIG1hcCwKKyAgICAgKiB7QGNvZGUga2V5Lmhhc2hDb2RlKCkgXiB2YWx1ZS5oYXNoQ29kZSgpfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGhhc2ggY29kZSB2YWx1ZSBmb3IgdGhpcyBtYXAKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaCA9IDA7CisgICAgICAgIGZpbmFsIE5vZGU8SywgVj5bXSB0OworICAgICAgICBpZiAoKHQgPSB0YWJsZSkgIT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgVHJhdmVyc2VyPEssIFY+IGl0ID0gbmV3IFRyYXZlcnNlcjxLLCBWPih0LCB0Lmxlbmd0aCwgMCwgdC5sZW5ndGgpOworICAgICAgICAgICAgZm9yIChOb2RlPEssIFY+IHA7IChwID0gaXQuYWR2YW5jZSgpKSAhPSBudWxsOyApCisgICAgICAgICAgICAgICAgaCArPSBwLmtleS5oYXNoQ29kZSgpIF4gcC52YWwuaGFzaENvZGUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgbWFwLiAgVGhlIHN0cmluZworICAgICAqIHJlcHJlc2VudGF0aW9uIGNvbnNpc3RzIG9mIGEgbGlzdCBvZiBrZXktdmFsdWUgbWFwcGluZ3MgKGluIG5vCisgICAgICogcGFydGljdWxhciBvcmRlcikgZW5jbG9zZWQgaW4gYnJhY2VzICgie0Bjb2RlIHt9fSIpLiAgQWRqYWNlbnQKKyAgICAgKiBtYXBwaW5ncyBhcmUgc2VwYXJhdGVkIGJ5IHRoZSBjaGFyYWN0ZXJzIHtAY29kZSAiLCAifSAoY29tbWEKKyAgICAgKiBhbmQgc3BhY2UpLiAgRWFjaCBrZXktdmFsdWUgbWFwcGluZyBpcyByZW5kZXJlZCBhcyB0aGUga2V5CisgICAgICogZm9sbG93ZWQgYnkgYW4gZXF1YWxzIHNpZ24gKCJ7QGNvZGUgPX0iKSBmb2xsb3dlZCBieSB0aGUKKyAgICAgKiBhc3NvY2lhdGVkIHZhbHVlLgorICAgICAqCisgICAgICogQHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG1hcAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIGZpbmFsIE5vZGU8SywgVj5bXSB0OworICAgICAgICBmaW5hbCBpbnQgZiA9ICh0ID0gdGFibGUpID09IG51bGwgPyAwIDogdC5sZW5ndGg7CisgICAgICAgIGZpbmFsIFRyYXZlcnNlcjxLLCBWPiBpdCA9IG5ldyBUcmF2ZXJzZXI8SywgVj4odCwgZiwgMCwgZik7CisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBzYi5hcHBlbmQoJ3snKTsKKyAgICAgICAgTm9kZTxLLCBWPiBwOworICAgICAgICBpZiAoKHAgPSBpdC5hZHZhbmNlKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoOyA7ICkgeworICAgICAgICAgICAgICAgIGZpbmFsIEsgayA9IHAua2V5OworICAgICAgICAgICAgICAgIGZpbmFsIFYgdiA9IHAudmFsOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChrID09IHRoaXMgPyAiKHRoaXMgTWFwKSIgOiBrKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJz0nKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQodiA9PSB0aGlzID8gIih0aGlzIE1hcCkiIDogdik7CisgICAgICAgICAgICAgICAgaWYgKChwID0gaXQuYWR2YW5jZSgpKSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJywnKS5hcHBlbmQoJyAnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2IuYXBwZW5kKCd9JykudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIG9iamVjdCB3aXRoIHRoaXMgbWFwIGZvciBlcXVhbGl0eS4KKyAgICAgKiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGEgbWFwIHdpdGggdGhlIHNhbWUKKyAgICAgKiBtYXBwaW5ncyBhcyB0aGlzIG1hcC4gIFRoaXMgb3BlcmF0aW9uIG1heSByZXR1cm4gbWlzbGVhZGluZworICAgICAqIHJlc3VsdHMgaWYgZWl0aGVyIG1hcCBpcyBjb25jdXJyZW50bHkgbW9kaWZpZWQgZHVyaW5nIGV4ZWN1dGlvbgorICAgICAqIG9mIHRoaXMgbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIG8gb2JqZWN0IHRvIGJlIGNvbXBhcmVkIGZvciBlcXVhbGl0eSB3aXRoIHRoaXMgbWFwCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHNwZWNpZmllZCBvYmplY3QgaXMgZXF1YWwgdG8gdGhpcyBtYXAKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKG8gIT0gdGhpcykgeworICAgICAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIE1hcCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgZmluYWwgTWFwPD8sID8+IG0gPSAoTWFwPD8sID8+KSBvOworICAgICAgICAgICAgZmluYWwgTm9kZTxLLCBWPltdIHQ7CisgICAgICAgICAgICBmaW5hbCBpbnQgZiA9ICh0ID0gdGFibGUpID09IG51bGwgPyAwIDogdC5sZW5ndGg7CisgICAgICAgICAgICBmaW5hbCBUcmF2ZXJzZXI8SywgVj4gaXQgPSBuZXcgVHJhdmVyc2VyPEssIFY+KHQsIGYsIDAsIGYpOworICAgICAgICAgICAgZm9yIChOb2RlPEssIFY+IHA7IChwID0gaXQuYWR2YW5jZSgpKSAhPSBudWxsOyApIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBWIHZhbCA9IHAudmFsOworICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2ID0gbS5nZXQocC5rZXkpOworICAgICAgICAgICAgICAgIGlmICh2ID09IG51bGwgfHwgKHYgIT0gdmFsICYmICF2LmVxdWFscyh2YWwpKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8PywgPz4gZSA6IG0uZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBtazsKKyAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgbXY7CisgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHY7CisgICAgICAgICAgICAgICAgaWYgKChtayA9IGUuZ2V0S2V5KCkpID09IG51bGwgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChtdiA9IGUuZ2V0VmFsdWUoKSkgPT0gbnVsbCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKHYgPSBnZXQobWspKSA9PSBudWxsIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAobXYgIT0gdiAmJiAhbXYuZXF1YWxzKHYpKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0cmlwcGVkLWRvd24gdmVyc2lvbiBvZiBoZWxwZXIgY2xhc3MgdXNlZCBpbiBwcmV2aW91cyB2ZXJzaW9uLAorICAgICAqIGRlY2xhcmVkIGZvciB0aGUgc2FrZSBvZiBzZXJpYWxpemF0aW9uIGNvbXBhdGliaWxpdHkKKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgU2VnbWVudDxLLCBWPiBleHRlbmRzIFJlZW50cmFudExvY2sgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAyMjQ5MDY5MjQ2NzYzMTgyMzk3TDsKKyAgICAgICAgZmluYWwgZmxvYXQgbG9hZEZhY3RvcjsKKworICAgICAgICBTZWdtZW50KGZpbmFsIGZsb2F0IGxmKSB7CisgICAgICAgICAgICB0aGlzLmxvYWRGYWN0b3IgPSBsZjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNhdmVzIHRoZSBzdGF0ZSBvZiB0aGUge0Bjb2RlIENvbmN1cnJlbnRIYXNoTWFwVjh9IGluc3RhbmNlIHRvIGEKKyAgICAgKiBzdHJlYW0gKGkuZS4sIHNlcmlhbGl6ZXMgaXQpLgorICAgICAqCisgICAgICogQHBhcmFtIHMgdGhlIHN0cmVhbQorICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiBpZiBhbiBJL08gZXJyb3Igb2NjdXJzCisgICAgICogQHNlcmlhbERhdGEgdGhlIGtleSAoT2JqZWN0KSBhbmQgdmFsdWUgKE9iamVjdCkKKyAgICAgKiBmb3IgZWFjaCBrZXktdmFsdWUgbWFwcGluZywgZm9sbG93ZWQgYnkgYSBudWxsIHBhaXIuCisgICAgICogVGhlIGtleS12YWx1ZSBtYXBwaW5ncyBhcmUgZW1pdHRlZCBpbiBubyBwYXJ0aWN1bGFyIG9yZGVyLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB3cml0ZU9iamVjdChmaW5hbCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbSBzKQorICAgICAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24geworICAgICAgICAvLyBGb3Igc2VyaWFsaXphdGlvbiBjb21wYXRpYmlsaXR5CisgICAgICAgIC8vIEVtdWxhdGUgc2VnbWVudCBjYWxjdWxhdGlvbiBmcm9tIHByZXZpb3VzIHZlcnNpb24gb2YgdGhpcyBjbGFzcworICAgICAgICBpbnQgc3NoaWZ0ID0gMDsKKyAgICAgICAgaW50IHNzaXplID0gMTsKKyAgICAgICAgd2hpbGUgKHNzaXplIDwgREVGQVVMVF9DT05DVVJSRU5DWV9MRVZFTCkgeworICAgICAgICAgICAgKytzc2hpZnQ7CisgICAgICAgICAgICBzc2l6ZSA8PD0gMTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBpbnQgc2VnbWVudFNoaWZ0ID0gMzIgLSBzc2hpZnQ7CisgICAgICAgIGZpbmFsIGludCBzZWdtZW50TWFzayA9IHNzaXplIC0gMTsKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIFNlZ21lbnQ8SywgVj5bXSBzZWdtZW50cyA9IChTZWdtZW50PEssIFY+W10pCisgICAgICAgICAgICAgICAgbmV3IFNlZ21lbnQ8PywgPz5bREVGQVVMVF9DT05DVVJSRU5DWV9MRVZFTF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VnbWVudHMubGVuZ3RoOyArK2kpCisgICAgICAgICAgICBzZWdtZW50c1tpXSA9IG5ldyBTZWdtZW50PEssIFY+KExPQURfRkFDVE9SKTsKKyAgICAgICAgcy5wdXRGaWVsZHMoKS5wdXQoInNlZ21lbnRzIiwgc2VnbWVudHMpOworICAgICAgICBzLnB1dEZpZWxkcygpLnB1dCgic2VnbWVudFNoaWZ0Iiwgc2VnbWVudFNoaWZ0KTsKKyAgICAgICAgcy5wdXRGaWVsZHMoKS5wdXQoInNlZ21lbnRNYXNrIiwgc2VnbWVudE1hc2spOworICAgICAgICBzLndyaXRlRmllbGRzKCk7CisKKyAgICAgICAgZmluYWwgTm9kZTxLLCBWPltdIHQ7CisgICAgICAgIGlmICgodCA9IHRhYmxlKSAhPSBudWxsKSB7CisgICAgICAgICAgICBmaW5hbCBUcmF2ZXJzZXI8SywgVj4gaXQgPSBuZXcgVHJhdmVyc2VyPEssIFY+KHQsIHQubGVuZ3RoLCAwLCB0Lmxlbmd0aCk7CisgICAgICAgICAgICBmb3IgKE5vZGU8SywgVj4gcDsgKHAgPSBpdC5hZHZhbmNlKCkpICE9IG51bGw7ICkgeworICAgICAgICAgICAgICAgIHMud3JpdGVPYmplY3QocC5rZXkpOworICAgICAgICAgICAgICAgIHMud3JpdGVPYmplY3QocC52YWwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHMud3JpdGVPYmplY3QobnVsbCk7CisgICAgICAgIHMud3JpdGVPYmplY3QobnVsbCk7CisgICAgICAgIHNlZ21lbnRzID0gbnVsbDsgLy8gdGhyb3cgYXdheQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlY29uc3RpdHV0ZXMgdGhlIGluc3RhbmNlIGZyb20gYSBzdHJlYW0gKHRoYXQgaXMsIGRlc2VyaWFsaXplcyBpdCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcyB0aGUgc3RyZWFtCisgICAgICogQHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGlmIHRoZSBjbGFzcyBvZiBhIHNlcmlhbGl6ZWQgb2JqZWN0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdWxkIG5vdCBiZSBmb3VuZAorICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoZmluYWwgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBzKQorICAgICAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICAvKgorICAgICAgICAgKiBUbyBpbXByb3ZlIHBlcmZvcm1hbmNlIGluIHR5cGljYWwgY2FzZXMsIHdlIGNyZWF0ZSBub2RlcworICAgICAgICAgKiB3aGlsZSByZWFkaW5nLCB0aGVuIHBsYWNlIGluIHRhYmxlIG9uY2Ugc2l6ZSBpcyBrbm93bi4KKyAgICAgICAgICogSG93ZXZlciwgd2UgbXVzdCBhbHNvIHZhbGlkYXRlIHVuaXF1ZW5lc3MgYW5kIGRlYWwgd2l0aAorICAgICAgICAgKiBvdmVycG9wdWxhdGVkIGJpbnMgd2hpbGUgZG9pbmcgc28sIHdoaWNoIHJlcXVpcmVzCisgICAgICAgICAqIHNwZWNpYWxpemVkIHZlcnNpb25zIG9mIHB1dFZhbCBtZWNoYW5pY3MuCisgICAgICAgICAqLworICAgICAgICBzaXplQ3RsID0gLTE7IC8vIGZvcmNlIGV4Y2x1c2lvbiBmb3IgdGFibGUgY29uc3RydWN0aW9uCisgICAgICAgIHMuZGVmYXVsdFJlYWRPYmplY3QoKTsKKyAgICAgICAgbG9uZyBzaXplID0gMEw7CisgICAgICAgIE5vZGU8SywgVj4gcCA9IG51bGw7CisgICAgICAgIGZvciAoOyA7ICkgeworICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIGZpbmFsIEsgayA9IChLKSBzLnJlYWRPYmplY3QoKTsKKyAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSBmaW5hbCBWIHYgPSAoVikgcy5yZWFkT2JqZWN0KCk7CisgICAgICAgICAgICBpZiAoayAhPSBudWxsICYmIHYgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHAgPSBuZXcgTm9kZTxLLCBWPihzcHJlYWQoay5oYXNoQ29kZSgpKSwgaywgdiwgcCk7CisgICAgICAgICAgICAgICAgKytzaXplOworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpemUgPT0gMEwpCisgICAgICAgICAgICBzaXplQ3RsID0gMDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgbjsKKyAgICAgICAgICAgIGlmIChzaXplID49IChsb25nKSAoTUFYSU1VTV9DQVBBQ0lUWSA+Pj4gMSkpCisgICAgICAgICAgICAgICAgbiA9IE1BWElNVU1fQ0FQQUNJVFk7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc3ogPSAoaW50KSBzaXplOworICAgICAgICAgICAgICAgIG4gPSB0YWJsZVNpemVGb3Ioc3ogKyAoc3ogPj4+IDEpICsgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InJhd3R5cGVzIiwgInVuY2hlY2tlZCJ9KSBmaW5hbAorICAgICAgICAgICAgTm9kZTxLLCBWPltdIHRhYiA9IChOb2RlPEssIFY+W10pIG5ldyBOb2RlW25dOworICAgICAgICAgICAgZmluYWwgaW50IG1hc2sgPSBuIC0gMTsKKyAgICAgICAgICAgIGxvbmcgYWRkZWQgPSAwTDsKKyAgICAgICAgICAgIHdoaWxlIChwICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBib29sZWFuIGluc2VydEF0RnJvbnQ7CisgICAgICAgICAgICAgICAgZmluYWwgTm9kZTxLLCBWPiBuZXh0ID0gcC5uZXh0OworICAgICAgICAgICAgICAgIGZpbmFsIE5vZGU8SywgVj4gZmlyc3Q7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGggPSBwLmhhc2g7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGogPSBoICYgbWFzazsKKyAgICAgICAgICAgICAgICBpZiAoKGZpcnN0ID0gdGFiQXQodGFiLCBqKSkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgaW5zZXJ0QXRGcm9udCA9IHRydWU7CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIEsgayA9IHAua2V5OworICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QuaGFzaCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFRyZWVCaW48SywgVj4gdCA9IChUcmVlQmluPEssIFY+KSBmaXJzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LnB1dFRyZWVWYWwoaCwgaywgcC52YWwpID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKythZGRlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydEF0RnJvbnQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBiaW5Db3VudCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRBdEZyb250ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE5vZGU8SywgVj4gcTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEsgcWs7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHEgPSBmaXJzdDsgcSAhPSBudWxsOyBxID0gcS5uZXh0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHEuaGFzaCA9PSBoICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHFrID0gcS5rZXkpID09IGsgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHFrICE9IG51bGwgJiYgay5lcXVhbHMocWspKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0QXRGcm9udCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytiaW5Db3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnNlcnRBdEZyb250ICYmIGJpbkNvdW50ID49IFRSRUVJRllfVEhSRVNIT0xEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0QXRGcm9udCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrYWRkZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC5uZXh0ID0gZmlyc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJlZU5vZGU8SywgVj4gaGQgPSBudWxsLCB0bCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChxID0gcDsgcSAhPSBudWxsOyBxID0gcS5uZXh0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFRyZWVOb2RlPEssIFY+IHQgPSBuZXcgVHJlZU5vZGU8SywgVj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocS5oYXNoLCBxLmtleSwgcS52YWwsIG51bGwsIG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHQucHJldiA9IHRsKSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGQgPSB0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bC5uZXh0ID0gdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGwgPSB0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUYWJBdCh0YWIsIGosIG5ldyBUcmVlQmluPEssIFY+KGhkKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGluc2VydEF0RnJvbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgKythZGRlZDsKKyAgICAgICAgICAgICAgICAgICAgcC5uZXh0ID0gZmlyc3Q7CisgICAgICAgICAgICAgICAgICAgIHNldFRhYkF0KHRhYiwgaiwgcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHAgPSBuZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGFibGUgPSB0YWI7CisgICAgICAgICAgICBzaXplQ3RsID0gbiAtIChuID4+PiAyKTsKKyAgICAgICAgICAgIGJhc2VDb3VudCA9IGFkZGVkOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ29uY3VycmVudE1hcCBtZXRob2RzCisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBwcmV2aW91cyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBrZXksCisgICAgICogICAgICAgICBvciB7QGNvZGUgbnVsbH0gaWYgdGhlcmUgd2FzIG5vIG1hcHBpbmcgZm9yIHRoZSBrZXkKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQga2V5IG9yIHZhbHVlIGlzIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgViBwdXRJZkFic2VudChmaW5hbCBLIGtleSwgZmluYWwgViB2YWx1ZSkgeworICAgICAgICByZXR1cm4gcHV0VmFsKGtleSwgdmFsdWUsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCBrZXkgaXMgbnVsbAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShmaW5hbCBPYmplY3Qga2V5LCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgaWYgKGtleSA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIHJlcGxhY2VOb2RlKGtleSwgbnVsbCwgdmFsdWUpICE9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiBhbnkgb2YgdGhlIGFyZ3VtZW50cyBhcmUgbnVsbAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHJlcGxhY2UoZmluYWwgSyBrZXksIGZpbmFsIFYgb2xkVmFsdWUsIGZpbmFsIFYgbmV3VmFsdWUpIHsKKyAgICAgICAgaWYgKGtleSA9PSBudWxsIHx8IG9sZFZhbHVlID09IG51bGwgfHwgbmV3VmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgICByZXR1cm4gcmVwbGFjZU5vZGUoa2V5LCBuZXdWYWx1ZSwgb2xkVmFsdWUpICE9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqCisgICAgICogQHJldHVybiB0aGUgcHJldmlvdXMgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LAorICAgICAqICAgICAgICAgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZXJlIHdhcyBubyBtYXBwaW5nIGZvciB0aGUga2V5CisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIGtleSBvciB2YWx1ZSBpcyBudWxsCisgICAgICovCisgICAgcHVibGljIFYgcmVwbGFjZShmaW5hbCBLIGtleSwgZmluYWwgViB2YWx1ZSkgeworICAgICAgICBpZiAoa2V5ID09IG51bGwgfHwgdmFsdWUgPT0gbnVsbCkKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgICByZXR1cm4gcmVwbGFjZU5vZGUoa2V5LCB2YWx1ZSwgbnVsbCk7CisgICAgfQorCisgICAgLy8gT3ZlcnJpZGVzIG9mIEpESzgrIE1hcCBleHRlbnNpb24gbWV0aG9kIGRlZmF1bHRzCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSB0byB3aGljaCB0aGUgc3BlY2lmaWVkIGtleSBpcyBtYXBwZWQsIG9yIHRoZQorICAgICAqIGdpdmVuIGRlZmF1bHQgdmFsdWUgaWYgdGhpcyBtYXAgY29udGFpbnMgbm8gbWFwcGluZyBmb3IgdGhlCisgICAgICoga2V5LgorICAgICAqCisgICAgICogQHBhcmFtIGtleSAgICAgICAgICB0aGUga2V5IHdob3NlIGFzc29jaWF0ZWQgdmFsdWUgaXMgdG8gYmUgcmV0dXJuZWQKKyAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHRoZSB2YWx1ZSB0byByZXR1cm4gaWYgdGhpcyBtYXAgY29udGFpbnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIG5vIG1hcHBpbmcgZm9yIHRoZSBnaXZlbiBrZXkKKyAgICAgKiBAcmV0dXJuIHRoZSBtYXBwaW5nIGZvciB0aGUga2V5LCBpZiBwcmVzZW50OyBlbHNlIHRoZSBkZWZhdWx0IHZhbHVlCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIGtleSBpcyBudWxsCisgICAgICovCisgICAgcHVibGljIFYgZ2V0T3JEZWZhdWx0KGZpbmFsIE9iamVjdCBrZXksIGZpbmFsIFYgZGVmYXVsdFZhbHVlKSB7CisgICAgICAgIGZpbmFsIFYgdjsKKyAgICAgICAgcmV0dXJuICh2ID0gZ2V0KGtleSkpID09IG51bGwgPyBkZWZhdWx0VmFsdWUgOiB2OworICAgIH0KKworCisgICAgLy8gSGFzaHRhYmxlIGxlZ2FjeSBtZXRob2RzCisKKyAgICAvKioKKyAgICAgKiBMZWdhY3kgbWV0aG9kIHRlc3RpbmcgaWYgc29tZSBrZXkgbWFwcyBpbnRvIHRoZSBzcGVjaWZpZWQgdmFsdWUKKyAgICAgKiBpbiB0aGlzIHRhYmxlLiAgVGhpcyBtZXRob2QgaXMgaWRlbnRpY2FsIGluIGZ1bmN0aW9uYWxpdHkgdG8KKyAgICAgKiB7QGxpbmsgI2NvbnRhaW5zVmFsdWUoT2JqZWN0KX0sIGFuZCBleGlzdHMgc29sZWx5IHRvIGVuc3VyZQorICAgICAqIGZ1bGwgY29tcGF0aWJpbGl0eSB3aXRoIGNsYXNzIHtAbGluayBqYXZhLnV0aWwuSGFzaHRhYmxlfSwKKyAgICAgKiB3aGljaCBzdXBwb3J0ZWQgdGhpcyBtZXRob2QgcHJpb3IgdG8gaW50cm9kdWN0aW9uIG9mIHRoZQorICAgICAqIEphdmEgQ29sbGVjdGlvbnMgZnJhbWV3b3JrLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIGEgdmFsdWUgdG8gc2VhcmNoIGZvcgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGFuZCBvbmx5IGlmIHNvbWUga2V5IG1hcHMgdG8gdGhlCisgICAgICogICAgICAgICB7QGNvZGUgdmFsdWV9IGFyZ3VtZW50IGluIHRoaXMgdGFibGUgYXMKKyAgICAgKiAgICAgICAgIGRldGVybWluZWQgYnkgdGhlIHtAY29kZSBlcXVhbHN9IG1ldGhvZDsKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIGlzIG51bGwKKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKGZpbmFsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gY29udGFpbnNWYWx1ZSh2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBlbnVtZXJhdGlvbiBvZiB0aGUga2V5cyBpbiB0aGlzIHRhYmxlLgorICAgICAqCisgICAgICogQHJldHVybiBhbiBlbnVtZXJhdGlvbiBvZiB0aGUga2V5cyBpbiB0aGlzIHRhYmxlCisgICAgICogQHNlZSAja2V5U2V0KCkKKyAgICAgKi8KKyAgICBwdWJsaWMgRW51bWVyYXRpb248Sz4ga2V5cygpIHsKKyAgICAgICAgZmluYWwgTm9kZTxLLCBWPltdIHQ7CisgICAgICAgIGZpbmFsIGludCBmID0gKHQgPSB0YWJsZSkgPT0gbnVsbCA/IDAgOiB0Lmxlbmd0aDsKKyAgICAgICAgcmV0dXJuIG5ldyBLZXlJdGVyYXRvcjxLLCBWPih0LCBmLCAwLCBmLCB0aGlzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIGVudW1lcmF0aW9uIG9mIHRoZSB2YWx1ZXMgaW4gdGhpcyB0YWJsZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYW4gZW51bWVyYXRpb24gb2YgdGhlIHZhbHVlcyBpbiB0aGlzIHRhYmxlCisgICAgICogQHNlZSAjdmFsdWVzKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgRW51bWVyYXRpb248Vj4gZWxlbWVudHMoKSB7CisgICAgICAgIGZpbmFsIE5vZGU8SywgVj5bXSB0OworICAgICAgICBmaW5hbCBpbnQgZiA9ICh0ID0gdGFibGUpID09IG51bGwgPyAwIDogdC5sZW5ndGg7CisgICAgICAgIHJldHVybiBuZXcgVmFsdWVJdGVyYXRvcjxLLCBWPih0LCBmLCAwLCBmLCB0aGlzKTsKKyAgICB9CisKKyAgICAvLyBDb25jdXJyZW50SGFzaE1hcFY4LW9ubHkgbWV0aG9kcworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIG1hcHBpbmdzLiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZAorICAgICAqIGluc3RlYWQgb2Yge0BsaW5rICNzaXplfSBiZWNhdXNlIGEgQ29uY3VycmVudEhhc2hNYXBWOCBtYXkKKyAgICAgKiBjb250YWluIG1vcmUgbWFwcGluZ3MgdGhhbiBjYW4gYmUgcmVwcmVzZW50ZWQgYXMgYW4gaW50LiBUaGUKKyAgICAgKiB2YWx1ZSByZXR1cm5lZCBpcyBhbiBlc3RpbWF0ZTsgdGhlIGFjdHVhbCBjb3VudCBtYXkgZGlmZmVyIGlmCisgICAgICogdGhlcmUgYXJlIGNvbmN1cnJlbnQgaW5zZXJ0aW9ucyBvciByZW1vdmFscy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBtYXBwaW5ncworICAgICAqIEBzaW5jZSAxLjgKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBtYXBwaW5nQ291bnQoKSB7CisgICAgICAgIGZpbmFsIGxvbmcgbiA9IHN1bUNvdW50KCk7CisgICAgICAgIHJldHVybiAobiA8IDBMKSA/IDBMIDogbjsgLy8gaWdub3JlIHRyYW5zaWVudCBuZWdhdGl2ZSB2YWx1ZXMKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBTZXR9IGJhY2tlZCBieSBhIENvbmN1cnJlbnRIYXNoTWFwVjgKKyAgICAgKiBmcm9tIHRoZSBnaXZlbiB0eXBlIHRvIHtAY29kZSBCb29sZWFuLlRSVUV9LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbmV3IHNldAorICAgICAqIEBzaW5jZSAxLjgKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxLPiBLZXlTZXRWaWV3PEssIEJvb2xlYW4+IG5ld0tleVNldCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBLZXlTZXRWaWV3PEssIEJvb2xlYW4+CisgICAgICAgICAgICAgICAgKG5ldyBDb25jdXJyZW50SGFzaE1hcFY4PEssIEJvb2xlYW4+KCksIEJvb2xlYW4uVFJVRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgU2V0fSBiYWNrZWQgYnkgYSBDb25jdXJyZW50SGFzaE1hcFY4CisgICAgICogZnJvbSB0aGUgZ2l2ZW4gdHlwZSB0byB7QGNvZGUgQm9vbGVhbi5UUlVFfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbml0aWFsQ2FwYWNpdHkgVGhlIGltcGxlbWVudGF0aW9uIHBlcmZvcm1zIGludGVybmFsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICBzaXppbmcgdG8gYWNjb21tb2RhdGUgdGhpcyBtYW55IGVsZW1lbnRzLgorICAgICAqIEByZXR1cm4gdGhlIG5ldyBzZXQKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgaW5pdGlhbCBjYXBhY2l0eSBvZgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzIGlzIG5lZ2F0aXZlCisgICAgICogQHNpbmNlIDEuOAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPEs+IEtleVNldFZpZXc8SywgQm9vbGVhbj4gbmV3S2V5U2V0KGZpbmFsIGludCBpbml0aWFsQ2FwYWNpdHkpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBLZXlTZXRWaWV3PEssIEJvb2xlYW4+CisgICAgICAgICAgICAgICAgKG5ldyBDb25jdXJyZW50SGFzaE1hcFY4PEssIEJvb2xlYW4+KGluaXRpYWxDYXBhY2l0eSksIEJvb2xlYW4uVFJVRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHtAbGluayBTZXR9IHZpZXcgb2YgdGhlIGtleXMgaW4gdGhpcyBtYXAsIHVzaW5nIHRoZQorICAgICAqIGdpdmVuIGNvbW1vbiBtYXBwZWQgdmFsdWUgZm9yIGFueSBhZGRpdGlvbnMgKGkuZS4sIHtAbGluaworICAgICAqIENvbGxlY3Rpb24jYWRkfSBhbmQge0BsaW5rIENvbGxlY3Rpb24jYWRkQWxsKENvbGxlY3Rpb24pfSkuCisgICAgICogVGhpcyBpcyBvZiBjb3Vyc2Ugb25seSBhcHByb3ByaWF0ZSBpZiBpdCBpcyBhY2NlcHRhYmxlIHRvIHVzZQorICAgICAqIHRoZSBzYW1lIHZhbHVlIGZvciBhbGwgYWRkaXRpb25zIGZyb20gdGhpcyB2aWV3LgorICAgICAqCisgICAgICogQHBhcmFtIG1hcHBlZFZhbHVlIHRoZSBtYXBwZWQgdmFsdWUgdG8gdXNlIGZvciBhbnkgYWRkaXRpb25zCisgICAgICogQHJldHVybiB0aGUgc2V0IHZpZXcKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBtYXBwZWRWYWx1ZSBpcyBudWxsCisgICAgICovCisgICAgcHVibGljIEtleVNldFZpZXc8SywgVj4ga2V5U2V0KGZpbmFsIFYgbWFwcGVkVmFsdWUpIHsKKyAgICAgICAgaWYgKG1hcHBlZFZhbHVlID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICAgICAgcmV0dXJuIG5ldyBLZXlTZXRWaWV3PEssIFY+KHRoaXMsIG1hcHBlZFZhbHVlKTsKKyAgICB9CisKKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tIFNwZWNpYWwgTm9kZXMgLS0tLS0tLS0tLS0tLS0gKi8KKworICAgIC8qKgorICAgICAqIEEgbm9kZSBpbnNlcnRlZCBhdCBoZWFkIG9mIGJpbnMgZHVyaW5nIHRyYW5zZmVyIG9wZXJhdGlvbnMuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIEZvcndhcmRpbmdOb2RlPEssIFY+IGV4dGVuZHMgTm9kZTxLLCBWPiB7CisgICAgICAgIGZpbmFsIE5vZGU8SywgVj5bXSBuZXh0VGFibGU7CisKKyAgICAgICAgRm9yd2FyZGluZ05vZGUoZmluYWwgTm9kZTxLLCBWPltdIHRhYikgeworICAgICAgICAgICAgc3VwZXIoTU9WRUQsIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICAgICAgdGhpcy5uZXh0VGFibGUgPSB0YWI7CisgICAgICAgIH0KKworICAgICAgICBOb2RlPEssIFY+IGZpbmQoZmluYWwgaW50IGgsIGZpbmFsIE9iamVjdCBrKSB7CisgICAgICAgICAgICAvLyBsb29wIHRvIGF2b2lkIGFyYml0cmFyaWx5IGRlZXAgcmVjdXJzaW9uIG9uIGZvcndhcmRpbmcgbm9kZXMKKyAgICAgICAgICAgIG91dGVyOgorICAgICAgICAgICAgZm9yIChOb2RlPEssIFY+W10gdGFiID0gbmV4dFRhYmxlOyA7ICkgeworICAgICAgICAgICAgICAgIE5vZGU8SywgVj4gZTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbjsKKyAgICAgICAgICAgICAgICBpZiAoayA9PSBudWxsIHx8IHRhYiA9PSBudWxsIHx8IChuID0gdGFiLmxlbmd0aCkgPT0gMCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKGUgPSB0YWJBdCh0YWIsIChuIC0gMSkgJiBoKSkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgZm9yICg7IDsgKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBlaDsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgSyBlazsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChlaCA9IGUuaGFzaCkgPT0gaCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZWsgPSBlLmtleSkgPT0gayB8fCAoZWsgIT0gbnVsbCAmJiBrLmVxdWFscyhlaykpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlOworICAgICAgICAgICAgICAgICAgICBpZiAoZWggPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEZvcndhcmRpbmdOb2RlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFiID0gKChGb3J3YXJkaW5nTm9kZTxLLCBWPikgZSkubmV4dFRhYmxlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuZmluZChoLCBrKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoKGUgPSBlLm5leHQpID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHBsYWNlLWhvbGRlciBub2RlIHVzZWQgaW4gY29tcHV0ZUlmQWJzZW50IGFuZCBjb21wdXRlCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIFJlc2VydmF0aW9uTm9kZTxLLCBWPiBleHRlbmRzIE5vZGU8SywgVj4geworICAgICAgICBSZXNlcnZhdGlvbk5vZGUoKSB7CisgICAgICAgICAgICBzdXBlcihSRVNFUlZFRCwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBOb2RlPEssIFY+IGZpbmQoZmluYWwgaW50IGgsIGZpbmFsIE9iamVjdCBrKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0gVGFibGUgSW5pdGlhbGl6YXRpb24gYW5kIFJlc2l6aW5nIC0tLS0tLS0tLS0tLS0tICovCisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplcyB0YWJsZSwgdXNpbmcgdGhlIHNpemUgcmVjb3JkZWQgaW4gc2l6ZUN0bC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIE5vZGU8SywgVj5bXSBpbml0VGFibGUoKSB7CisgICAgICAgIE5vZGU8SywgVj5bXSB0YWI7CisgICAgICAgIGludCBzYzsKKyAgICAgICAgd2hpbGUgKCh0YWIgPSB0YWJsZSkgPT0gbnVsbCB8fCB0YWIubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIGlmICgoc2MgPSBzaXplQ3RsKSA8IDApCisgICAgICAgICAgICAgICAgVGhyZWFkLnlpZWxkKCk7IC8vIGxvc3QgaW5pdGlhbGl6YXRpb24gcmFjZTsganVzdCBzcGluCisgICAgICAgICAgICBlbHNlIGlmIChVLmNvbXBhcmVBbmRTd2FwSW50KHRoaXMsIFNJWkVDVEwsIHNjLCAtMSkpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHRhYiA9IHRhYmxlKSA9PSBudWxsIHx8IHRhYi5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG4gPSAoc2MgPiAwKSA/IHNjIDogREVGQVVMVF9DQVBBQ0lUWTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsicmF3dHlwZXMiLCAidW5jaGVja2VkIn0pIGZpbmFsCisgICAgICAgICAgICAgICAgICAgICAgICBOb2RlPEssIFY+W10gbnQgPSAoTm9kZTxLLCBWPltdKSBuZXcgTm9kZVtuXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhYmxlID0gdGFiID0gbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBzYyA9IG4gLSAobiA+Pj4gMik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBzaXplQ3RsID0gc2M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0YWI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyB0byBjb3VudCwgYW5kIGlmIHRhYmxlIGlzIHRvbyBzbWFsbCBhbmQgbm90IGFscmVhZHkKKyAgICAgKiByZXNpemluZywgaW5pdGlhdGVzIHRyYW5zZmVyLiBJZiBhbHJlYWR5IHJlc2l6aW5nLCBoZWxwcworICAgICAqIHBlcmZvcm0gdHJhbnNmZXIgaWYgd29yayBpcyBhdmFpbGFibGUuICBSZWNoZWNrcyBvY2N1cGFuY3kKKyAgICAgKiBhZnRlciBhIHRyYW5zZmVyIHRvIHNlZSBpZiBhbm90aGVyIHJlc2l6ZSBpcyBhbHJlYWR5IG5lZWRlZAorICAgICAqIGJlY2F1c2UgcmVzaXppbmdzIGFyZSBsYWdnaW5nIGFkZGl0aW9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB4ICAgICB0aGUgY291bnQgdG8gYWRkCisgICAgICogQHBhcmFtIGNoZWNrIGlmIDwwLCBkb24ndCBjaGVjayByZXNpemUsIGlmIDw9IDEgb25seSBjaGVjayBpZiB1bmNvbnRlbmRlZAorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgdm9pZCBhZGRDb3VudChmaW5hbCBsb25nIHgsIGZpbmFsIGludCBjaGVjaykgeworICAgICAgICBmaW5hbCBDb3VudGVyQ2VsbFtdIGFzOworICAgICAgICBmaW5hbCBsb25nIGI7CisgICAgICAgIGxvbmcgczsKKyAgICAgICAgaWYgKChhcyA9IGNvdW50ZXJDZWxscykgIT0gbnVsbCB8fAorICAgICAgICAgICAgICAgICFVLmNvbXBhcmVBbmRTd2FwTG9uZyh0aGlzLCBCQVNFQ09VTlQsIGIgPSBiYXNlQ291bnQsIHMgPSBiICsgeCkpIHsKKyAgICAgICAgICAgIGZpbmFsIENvdW50ZXJIYXNoQ29kZSBoYzsKKyAgICAgICAgICAgIGZpbmFsIENvdW50ZXJDZWxsIGE7CisgICAgICAgICAgICBmaW5hbCBsb25nIHY7CisgICAgICAgICAgICBmaW5hbCBpbnQgbTsKKyAgICAgICAgICAgIGJvb2xlYW4gdW5jb250ZW5kZWQgPSB0cnVlOworICAgICAgICAgICAgaWYgKChoYyA9IHRocmVhZENvdW50ZXJIYXNoQ29kZS5nZXQoKSkgPT0gbnVsbCB8fAorICAgICAgICAgICAgICAgICAgICBhcyA9PSBudWxsIHx8IChtID0gYXMubGVuZ3RoIC0gMSkgPCAwIHx8CisgICAgICAgICAgICAgICAgICAgIChhID0gYXNbbSAmIGhjLmNvZGVdKSA9PSBudWxsIHx8CisgICAgICAgICAgICAgICAgICAgICEodW5jb250ZW5kZWQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFUuY29tcGFyZUFuZFN3YXBMb25nKGEsIENFTExWQUxVRSwgdiA9IGEudmFsdWUsIHYgKyB4KSkpIHsKKyAgICAgICAgICAgICAgICBmdWxsQWRkQ291bnQoeCwgaGMsIHVuY29udGVuZGVkKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2hlY2sgPD0gMSkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBzID0gc3VtQ291bnQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2hlY2sgPj0gMCkgeworICAgICAgICAgICAgTm9kZTxLLCBWPltdIHRhYiwgbnQ7CisgICAgICAgICAgICBpbnQgc2M7CisgICAgICAgICAgICB3aGlsZSAocyA+PSAobG9uZykgKHNjID0gc2l6ZUN0bCkgJiYgKHRhYiA9IHRhYmxlKSAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgICAgIHRhYi5sZW5ndGggPCBNQVhJTVVNX0NBUEFDSVRZKSB7CisgICAgICAgICAgICAgICAgaWYgKHNjIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc2MgPT0gLTEgfHwgdHJhbnNmZXJJbmRleCA8PSB0cmFuc2Zlck9yaWdpbiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChudCA9IG5leHRUYWJsZSkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBpZiAoVS5jb21wYXJlQW5kU3dhcEludCh0aGlzLCBTSVpFQ1RMLCBzYywgc2MgLSAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyKHRhYiwgbnQpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoVS5jb21wYXJlQW5kU3dhcEludCh0aGlzLCBTSVpFQ1RMLCBzYywgLTIpKQorICAgICAgICAgICAgICAgICAgICB0cmFuc2Zlcih0YWIsIG51bGwpOworICAgICAgICAgICAgICAgIHMgPSBzdW1Db3VudCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSGVscHMgdHJhbnNmZXIgaWYgYSByZXNpemUgaXMgaW4gcHJvZ3Jlc3MuCisgICAgICovCisgICAgZmluYWwgTm9kZTxLLCBWPltdIGhlbHBUcmFuc2ZlcihmaW5hbCBOb2RlPEssIFY+W10gdGFiLCBmaW5hbCBOb2RlPEssIFY+IGYpIHsKKyAgICAgICAgZmluYWwgTm9kZTxLLCBWPltdIG5leHRUYWI7CisgICAgICAgIGZpbmFsIGludCBzYzsKKyAgICAgICAgaWYgKChmIGluc3RhbmNlb2YgRm9yd2FyZGluZ05vZGUpICYmCisgICAgICAgICAgICAgICAgKG5leHRUYWIgPSAoKEZvcndhcmRpbmdOb2RlPEssIFY+KSBmKS5uZXh0VGFibGUpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChuZXh0VGFiID09IG5leHRUYWJsZSAmJiB0YWIgPT0gdGFibGUgJiYKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJJbmRleCA+IHRyYW5zZmVyT3JpZ2luICYmIChzYyA9IHNpemVDdGwpIDwgLTEgJiYKKyAgICAgICAgICAgICAgICAgICAgVS5jb21wYXJlQW5kU3dhcEludCh0aGlzLCBTSVpFQ1RMLCBzYywgc2MgLSAxKSkKKyAgICAgICAgICAgICAgICB0cmFuc2Zlcih0YWIsIG5leHRUYWIpOworICAgICAgICAgICAgcmV0dXJuIG5leHRUYWI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRhYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyaWVzIHRvIHByZXNpemUgdGFibGUgdG8gYWNjb21tb2RhdGUgdGhlIGdpdmVuIG51bWJlciBvZiBlbGVtZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzaXplIG51bWJlciBvZiBlbGVtZW50cyAoZG9lc24ndCBuZWVkIHRvIGJlIHBlcmZlY3RseSBhY2N1cmF0ZSkKKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIHZvaWQgdHJ5UHJlc2l6ZShmaW5hbCBpbnQgc2l6ZSkgeworICAgICAgICBmaW5hbCBpbnQgYyA9IChzaXplID49IChNQVhJTVVNX0NBUEFDSVRZID4+PiAxKSkgPyBNQVhJTVVNX0NBUEFDSVRZIDoKKyAgICAgICAgICAgICAgICB0YWJsZVNpemVGb3Ioc2l6ZSArIChzaXplID4+PiAxKSArIDEpOworICAgICAgICBpbnQgc2M7CisgICAgICAgIHdoaWxlICgoc2MgPSBzaXplQ3RsKSA+PSAwKSB7CisgICAgICAgICAgICBmaW5hbCBOb2RlPEssIFY+W10gdGFiID0gdGFibGU7CisgICAgICAgICAgICBpbnQgbjsKKyAgICAgICAgICAgIGlmICh0YWIgPT0gbnVsbCB8fCAobiA9IHRhYi5sZW5ndGgpID09IDApIHsKKyAgICAgICAgICAgICAgICBuID0gKHNjID4gYykgPyBzYyA6IGM7CisgICAgICAgICAgICAgICAgaWYgKFUuY29tcGFyZUFuZFN3YXBJbnQodGhpcywgU0laRUNUTCwgc2MsIC0xKSkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhYmxlID09IHRhYikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsicmF3dHlwZXMiLCAidW5jaGVja2VkIn0pIGZpbmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZTxLLCBWPltdIG50ID0gKE5vZGU8SywgVj5bXSkgbmV3IE5vZGVbbl07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFibGUgPSBudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYyA9IG4gLSAobiA+Pj4gMik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzaXplQ3RsID0gc2M7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPD0gc2MgfHwgbiA+PSBNQVhJTVVNX0NBUEFDSVRZKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZWxzZSBpZiAodGFiID09IHRhYmxlICYmCisgICAgICAgICAgICAgICAgICAgIFUuY29tcGFyZUFuZFN3YXBJbnQodGhpcywgU0laRUNUTCwgc2MsIC0yKSkKKyAgICAgICAgICAgICAgICB0cmFuc2Zlcih0YWIsIG51bGwpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTW92ZXMgYW5kL29yIGNvcGllcyB0aGUgbm9kZXMgaW4gZWFjaCBiaW4gdG8gbmV3IHRhYmxlLiBTZWUKKyAgICAgKiBhYm92ZSBmb3IgZXhwbGFuYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCB2b2lkIHRyYW5zZmVyKGZpbmFsIE5vZGU8SywgVj5bXSB0YWIsIE5vZGU8SywgVj5bXSBuZXh0VGFiKSB7CisgICAgICAgIGZpbmFsIGludCBuID0gdGFiLmxlbmd0aDsKKyAgICAgICAgaW50IHN0cmlkZTsKKyAgICAgICAgaWYgKChzdHJpZGUgPSAoTkNQVSA+IDEpID8gKG4gPj4+IDMpIC8gTkNQVSA6IG4pIDwgTUlOX1RSQU5TRkVSX1NUUklERSkKKyAgICAgICAgICAgIHN0cmlkZSA9IE1JTl9UUkFOU0ZFUl9TVFJJREU7IC8vIHN1YmRpdmlkZSByYW5nZQorICAgICAgICBpZiAobmV4dFRhYiA9PSBudWxsKSB7ICAgICAgICAgICAgLy8gaW5pdGlhdGluZworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InJhd3R5cGVzIiwgInVuY2hlY2tlZCJ9KSBmaW5hbAorICAgICAgICAgICAgICAgIE5vZGU8SywgVj5bXSBudCA9IChOb2RlPEssIFY+W10pIG5ldyBOb2RlW24gPDwgMV07CisgICAgICAgICAgICAgICAgbmV4dFRhYiA9IG50OworICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgVGhyb3dhYmxlIGV4KSB7ICAgICAgLy8gdHJ5IHRvIGNvcGUgd2l0aCBPT01FCisgICAgICAgICAgICAgICAgc2l6ZUN0bCA9IEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5leHRUYWJsZSA9IG5leHRUYWI7CisgICAgICAgICAgICB0cmFuc2Zlck9yaWdpbiA9IG47CisgICAgICAgICAgICB0cmFuc2ZlckluZGV4ID0gbjsKKyAgICAgICAgICAgIGZpbmFsIEZvcndhcmRpbmdOb2RlPEssIFY+IHJldiA9IG5ldyBGb3J3YXJkaW5nTm9kZTxLLCBWPih0YWIpOworICAgICAgICAgICAgZm9yIChpbnQgayA9IG47IGsgPiAwOyApIHsgICAgLy8gcHJvZ3Jlc3NpdmVseSByZXZlYWwgcmVhZHkgc2xvdHMKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbmV4dGsgPSAoayA+IHN0cmlkZSkgPyBrIC0gc3RyaWRlIDogMDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBtID0gbmV4dGs7IG0gPCBrOyArK20pCisgICAgICAgICAgICAgICAgICAgIG5leHRUYWJbbV0gPSByZXY7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgbSA9IG4gKyBuZXh0azsgbSA8IG4gKyBrOyArK20pCisgICAgICAgICAgICAgICAgICAgIG5leHRUYWJbbV0gPSByZXY7CisgICAgICAgICAgICAgICAgVS5wdXRPcmRlcmVkSW50KHRoaXMsIFRSQU5TRkVST1JJR0lOLCBrID0gbmV4dGspOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZpbmFsIGludCBuZXh0biA9IG5leHRUYWIubGVuZ3RoOworICAgICAgICBmaW5hbCBGb3J3YXJkaW5nTm9kZTxLLCBWPiBmd2QgPSBuZXcgRm9yd2FyZGluZ05vZGU8SywgVj4obmV4dFRhYik7CisgICAgICAgIGJvb2xlYW4gYWR2YW5jZSA9IHRydWU7CisgICAgICAgIGJvb2xlYW4gZmluaXNoaW5nID0gZmFsc2U7IC8vIHRvIGVuc3VyZSBzd2VlcCBiZWZvcmUgY29tbWl0dGluZyBuZXh0VGFiCisgICAgICAgIGZvciAoaW50IGkgPSAwLCBib3VuZCA9IDA7IDsgKSB7CisgICAgICAgICAgICBpbnQgbmV4dEluZGV4OworICAgICAgICAgICAgaW50IG5leHRCb3VuZDsKKyAgICAgICAgICAgIGZpbmFsIGludCBmaDsKKyAgICAgICAgICAgIGZpbmFsIE5vZGU8SywgVj4gZjsKKyAgICAgICAgICAgIHdoaWxlIChhZHZhbmNlKSB7CisgICAgICAgICAgICAgICAgaWYgKC0taSA+PSBib3VuZCB8fCBmaW5pc2hpbmcpCisgICAgICAgICAgICAgICAgICAgIGFkdmFuY2UgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICgobmV4dEluZGV4ID0gdHJhbnNmZXJJbmRleCkgPD0gdHJhbnNmZXJPcmlnaW4pIHsKKyAgICAgICAgICAgICAgICAgICAgaSA9IC0xOworICAgICAgICAgICAgICAgICAgICBhZHZhbmNlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChVLmNvbXBhcmVBbmRTd2FwSW50CisgICAgICAgICAgICAgICAgICAgICAgICAodGhpcywgVFJBTlNGRVJJTkRFWCwgbmV4dEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0Qm91bmQgPSAobmV4dEluZGV4ID4gc3RyaWRlID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0SW5kZXggLSBzdHJpZGUgOiAwKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgYm91bmQgPSBuZXh0Qm91bmQ7CisgICAgICAgICAgICAgICAgICAgIGkgPSBuZXh0SW5kZXggLSAxOworICAgICAgICAgICAgICAgICAgICBhZHZhbmNlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGkgPCAwIHx8IGkgPj0gbiB8fCBpICsgbiA+PSBuZXh0bikgeworICAgICAgICAgICAgICAgIGlmIChmaW5pc2hpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV4dFRhYmxlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgdGFibGUgPSBuZXh0VGFiOworICAgICAgICAgICAgICAgICAgICBzaXplQ3RsID0gKG4gPDwgMSkgLSAobiA+Pj4gMSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChpbnQgc2M7IDsgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChVLmNvbXBhcmVBbmRTd2FwSW50KHRoaXMsIFNJWkVDVEwsIHNjID0gc2l6ZUN0bCwgKytzYykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzYyAhPSAtMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hpbmcgPSBhZHZhbmNlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGkgPSBuOyAvLyByZWNoZWNrIGJlZm9yZSBjb21taXQKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICgoZiA9IHRhYkF0KHRhYiwgaSkpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2FzVGFiQXQodGFiLCBpLCBudWxsLCBmd2QpKSB7CisgICAgICAgICAgICAgICAgICAgIHNldFRhYkF0KG5leHRUYWIsIGksIG51bGwpOworICAgICAgICAgICAgICAgICAgICBzZXRUYWJBdChuZXh0VGFiLCBpICsgbiwgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIGFkdmFuY2UgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKGZoID0gZi5oYXNoKSA9PSBNT1ZFRCkKKyAgICAgICAgICAgICAgICBhZHZhbmNlID0gdHJ1ZTsgLy8gYWxyZWFkeSBwcm9jZXNzZWQKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoZikgeworICAgICAgICAgICAgICAgICAgICBpZiAodGFiQXQodGFiLCBpKSA9PSBmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBOb2RlPEssIFY+IGxuLCBobjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJ1bkJpdCA9IGZoICYgbjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlPEssIFY+IGxhc3RSdW4gPSBmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoTm9kZTxLLCBWPiBwID0gZi5uZXh0OyBwICE9IG51bGw7IHAgPSBwLm5leHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGIgPSBwLmhhc2ggJiBuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYiAhPSBydW5CaXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bkJpdCA9IGI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0UnVuID0gcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocnVuQml0ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG4gPSBsYXN0UnVuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBobiA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG4gPSBsYXN0UnVuOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbiA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoTm9kZTxLLCBWPiBwID0gZjsgcCAhPSBsYXN0UnVuOyBwID0gcC5uZXh0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBwaCA9IHAuaGFzaDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSyBwayA9IHAua2V5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBWIHB2ID0gcC52YWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocGggJiBuKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG4gPSBuZXcgTm9kZTxLLCBWPihwaCwgcGssIHB2LCBsbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhuID0gbmV3IE5vZGU8SywgVj4ocGgsIHBrLCBwdiwgaG4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUYWJBdChuZXh0VGFiLCBpLCBsbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGFiQXQobmV4dFRhYiwgaSArIG4sIGhuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUYWJBdCh0YWIsIGksIGZ3ZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWR2YW5jZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGYgaW5zdGFuY2VvZiBUcmVlQmluKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVHJlZUJpbjxLLCBWPiB0ID0gKFRyZWVCaW48SywgVj4pIGY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJlZU5vZGU8SywgVj4gbG8gPSBudWxsLCBsb1RhaWwgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyZWVOb2RlPEssIFY+IGhpID0gbnVsbCwgaGlUYWlsID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGMgPSAwLCBoYyA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChOb2RlPEssIFY+IGUgPSB0LmZpcnN0OyBlICE9IG51bGw7IGUgPSBlLm5leHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGggPSBlLmhhc2g7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFRyZWVOb2RlPEssIFY+IHAgPSBuZXcgVHJlZU5vZGU8SywgVj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaCwgZS5rZXksIGUudmFsLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChoICYgbikgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwLnByZXYgPSBsb1RhaWwpID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG8gPSBwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvVGFpbC5uZXh0ID0gcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvVGFpbCA9IHA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2xjOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwLnByZXYgPSBoaVRhaWwpID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGkgPSBwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpVGFpbC5uZXh0ID0gcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpVGFpbCA9IHA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2hjOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxuID0gKGxjIDw9IFVOVFJFRUlGWV9USFJFU0hPTEQpID8gdW50cmVlaWZ5KGxvKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaGMgIT0gMCkgPyBuZXcgVHJlZUJpbjxLLCBWPihsbykgOiB0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhuID0gKGhjIDw9IFVOVFJFRUlGWV9USFJFU0hPTEQpID8gdW50cmVlaWZ5KGhpKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGMgIT0gMCkgPyBuZXcgVHJlZUJpbjxLLCBWPihoaSkgOiB0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRhYkF0KG5leHRUYWIsIGksIGxuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUYWJBdChuZXh0VGFiLCBpICsgbiwgaG4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFRhYkF0KHRhYiwgaSwgZndkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZHZhbmNlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0gQ29udmVyc2lvbiBmcm9tL3RvIFRyZWVCaW5zIC0tLS0tLS0tLS0tLS0tICovCisKKyAgICAvKioKKyAgICAgKiBSZXBsYWNlcyBhbGwgbGlua2VkIG5vZGVzIGluIGJpbiBhdCBnaXZlbiBpbmRleCB1bmxlc3MgdGFibGUgaXMKKyAgICAgKiB0b28gc21hbGwsIGluIHdoaWNoIGNhc2UgcmVzaXplcyBpbnN0ZWFkLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgdm9pZCB0cmVlaWZ5QmluKGZpbmFsIE5vZGU8SywgVj5bXSB0YWIsIGZpbmFsIGludCBpbmRleCkgeworICAgICAgICBmaW5hbCBOb2RlPEssIFY+IGI7CisgICAgICAgIGZpbmFsIGludCBuOworICAgICAgICBmaW5hbCBpbnQgc2M7CisgICAgICAgIGlmICh0YWIgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKChuID0gdGFiLmxlbmd0aCkgPCBNSU5fVFJFRUlGWV9DQVBBQ0lUWSkgeworICAgICAgICAgICAgICAgIGlmICh0YWIgPT0gdGFibGUgJiYgKHNjID0gc2l6ZUN0bCkgPj0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgVS5jb21wYXJlQW5kU3dhcEludCh0aGlzLCBTSVpFQ1RMLCBzYywgLTIpKQorICAgICAgICAgICAgICAgICAgICB0cmFuc2Zlcih0YWIsIG51bGwpOworICAgICAgICAgICAgfSBlbHNlIGlmICgoYiA9IHRhYkF0KHRhYiwgaW5kZXgpKSAhPSBudWxsICYmIGIuaGFzaCA+PSAwKSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChiKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0YWJBdCh0YWIsIGluZGV4KSA9PSBiKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUcmVlTm9kZTxLLCBWPiBoZCA9IG51bGwsIHRsID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoTm9kZTxLLCBWPiBlID0gYjsgZSAhPSBudWxsOyBlID0gZS5uZXh0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVHJlZU5vZGU8SywgVj4gcCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVHJlZU5vZGU8SywgVj4oZS5oYXNoLCBlLmtleSwgZS52YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocC5wcmV2ID0gdGwpID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkID0gcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRsLm5leHQgPSBwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRsID0gcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNldFRhYkF0KHRhYiwgaW5kZXgsIG5ldyBUcmVlQmluPEssIFY+KGhkKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbGlzdCBvbiBub24tVHJlZU5vZGVzIHJlcGxhY2luZyB0aG9zZSBpbiBnaXZlbiBsaXN0LgorICAgICAqLworICAgIHN0YXRpYyA8SywgVj4gTm9kZTxLLCBWPiB1bnRyZWVpZnkoZmluYWwgTm9kZTxLLCBWPiBiKSB7CisgICAgICAgIE5vZGU8SywgVj4gaGQgPSBudWxsLCB0bCA9IG51bGw7CisgICAgICAgIGZvciAoTm9kZTxLLCBWPiBxID0gYjsgcSAhPSBudWxsOyBxID0gcS5uZXh0KSB7CisgICAgICAgICAgICBmaW5hbCBOb2RlPEssIFY+IHAgPSBuZXcgTm9kZTxLLCBWPihxLmhhc2gsIHEua2V5LCBxLnZhbCwgbnVsbCk7CisgICAgICAgICAgICBpZiAodGwgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBoZCA9IHA7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgdGwubmV4dCA9IHA7CisgICAgICAgICAgICB0bCA9IHA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGhkOworICAgIH0KKworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0gVHJlZU5vZGVzIC0tLS0tLS0tLS0tLS0tICovCisKKyAgICAvKioKKyAgICAgKiBOb2RlcyBmb3IgdXNlIGluIFRyZWVCaW5zCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIFRyZWVOb2RlPEssIFY+IGV4dGVuZHMgTm9kZTxLLCBWPiB7CisgICAgICAgIFRyZWVOb2RlPEssIFY+IHBhcmVudDsgIC8vIHJlZC1ibGFjayB0cmVlIGxpbmtzCisgICAgICAgIFRyZWVOb2RlPEssIFY+IGxlZnQ7CisgICAgICAgIFRyZWVOb2RlPEssIFY+IHJpZ2h0OworICAgICAgICBUcmVlTm9kZTxLLCBWPiBwcmV2OyAgICAvLyBuZWVkZWQgdG8gdW5saW5rIG5leHQgdXBvbiBkZWxldGlvbgorICAgICAgICBib29sZWFuIHJlZDsKKworICAgICAgICBUcmVlTm9kZShmaW5hbCBpbnQgaGFzaCwgZmluYWwgSyBrZXksIGZpbmFsIFYgdmFsLCBmaW5hbCBOb2RlPEssIFY+IG5leHQsCisgICAgICAgICAgICAgICAgIGZpbmFsIFRyZWVOb2RlPEssIFY+IHBhcmVudCkgeworICAgICAgICAgICAgc3VwZXIoaGFzaCwga2V5LCB2YWwsIG5leHQpOworICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisgICAgICAgIH0KKworICAgICAgICBOb2RlPEssIFY+IGZpbmQoZmluYWwgaW50IGgsIGZpbmFsIE9iamVjdCBrKSB7CisgICAgICAgICAgICByZXR1cm4gZmluZFRyZWVOb2RlKGgsIGssIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIFRyZWVOb2RlIChvciBudWxsIGlmIG5vdCBmb3VuZCkgZm9yIHRoZSBnaXZlbiBrZXkKKyAgICAgICAgICogc3RhcnRpbmcgYXQgZ2l2ZW4gcm9vdC4KKyAgICAgICAgICovCisgICAgICAgIGZpbmFsIFRyZWVOb2RlPEssIFY+IGZpbmRUcmVlTm9kZShmaW5hbCBpbnQgaCwgZmluYWwgT2JqZWN0IGssIENsYXNzPD8+IGtjKSB7CisgICAgICAgICAgICBpZiAoayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgVHJlZU5vZGU8SywgVj4gcCA9IHRoaXM7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcGg7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBkaXI7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIEsgcGs7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFRyZWVOb2RlPEssIFY+IHE7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFRyZWVOb2RlPEssIFY+IHBsID0gcC5sZWZ0OworICAgICAgICAgICAgICAgICAgICBmaW5hbCBUcmVlTm9kZTxLLCBWPiBwciA9IHAucmlnaHQ7CisgICAgICAgICAgICAgICAgICAgIGlmICgocGggPSBwLmhhc2gpID4gaCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHAgPSBwbDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocGggPCBoKQorICAgICAgICAgICAgICAgICAgICAgICAgcCA9IHByOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgocGsgPSBwLmtleSkgPT0gayB8fCAocGsgIT0gbnVsbCAmJiBrLmVxdWFscyhwaykpKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBsID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBwID0gcHI7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHByID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBwID0gcGw7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChrYyAhPSBudWxsIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGtjID0gY29tcGFyYWJsZUNsYXNzRm9yKGspKSAhPSBudWxsKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkaXIgPSBjb21wYXJlQ29tcGFyYWJsZXMoa2MsIGssIHBrKSkgIT0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHAgPSAoZGlyIDwgMCkgPyBwbCA6IHByOworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICgocSA9IHByLmZpbmRUcmVlTm9kZShoLCBrLCBrYykpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcCA9IHBsOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKHAgIT0gbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0gVHJlZUJpbnMgLS0tLS0tLS0tLS0tLS0gKi8KKworICAgIC8qKgorICAgICAqIFRyZWVOb2RlcyB1c2VkIGF0IHRoZSBoZWFkcyBvZiBiaW5zLiBUcmVlQmlucyBkbyBub3QgaG9sZCB1c2VyCisgICAgICoga2V5cyBvciB2YWx1ZXMsIGJ1dCBpbnN0ZWFkIHBvaW50IHRvIGxpc3Qgb2YgVHJlZU5vZGVzIGFuZAorICAgICAqIHRoZWlyIHJvb3QuIFRoZXkgYWxzbyBtYWludGFpbiBhIHBhcmFzaXRpYyByZWFkLXdyaXRlIGxvY2sKKyAgICAgKiBmb3JjaW5nIHdyaXRlcnMgKHdobyBob2xkIGJpbiBsb2NrKSB0byB3YWl0IGZvciByZWFkZXJzICh3aG8gZG8KKyAgICAgKiBub3QpIHRvIGNvbXBsZXRlIGJlZm9yZSB0cmVlIHJlc3RydWN0dXJpbmcgb3BlcmF0aW9ucy4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgVHJlZUJpbjxLLCBWPiBleHRlbmRzIE5vZGU8SywgVj4geworICAgICAgICBUcmVlTm9kZTxLLCBWPiByb290OworICAgICAgICB2b2xhdGlsZSBUcmVlTm9kZTxLLCBWPiBmaXJzdDsKKyAgICAgICAgdm9sYXRpbGUgVGhyZWFkIHdhaXRlcjsKKyAgICAgICAgdm9sYXRpbGUgaW50IGxvY2tTdGF0ZTsKKyAgICAgICAgLy8gdmFsdWVzIGZvciBsb2NrU3RhdGUKKyAgICAgICAgc3RhdGljIGZpbmFsIGludCBXUklURVIgPSAxOyAvLyBzZXQgd2hpbGUgaG9sZGluZyB3cml0ZSBsb2NrCisgICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgV0FJVEVSID0gMjsgLy8gc2V0IHdoZW4gd2FpdGluZyBmb3Igd3JpdGUgbG9jaworICAgICAgICBzdGF0aWMgZmluYWwgaW50IFJFQURFUiA9IDQ7IC8vIGluY3JlbWVudCB2YWx1ZSBmb3Igc2V0dGluZyByZWFkIGxvY2sKKworICAgICAgICAvKioKKyAgICAgICAgICogVGllLWJyZWFraW5nIHV0aWxpdHkgZm9yIG9yZGVyaW5nIGluc2VydGlvbnMgd2hlbiBlcXVhbAorICAgICAgICAgKiBoYXNoQ29kZXMgYW5kIG5vbi1jb21wYXJhYmxlLiBXZSBkb24ndCByZXF1aXJlIGEgdG90YWwKKyAgICAgICAgICogb3JkZXIsIGp1c3QgYSBjb25zaXN0ZW50IGluc2VydGlvbiBydWxlIHRvIG1haW50YWluCisgICAgICAgICAqIGVxdWl2YWxlbmNlIGFjcm9zcyByZWJhbGFuY2luZ3MuIFRpZS1icmVha2luZyBmdXJ0aGVyIHRoYW4KKyAgICAgICAgICogbmVjZXNzYXJ5IHNpbXBsaWZpZXMgdGVzdGluZyBhIGJpdC4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBpbnQgdGllQnJlYWtPcmRlcihmaW5hbCBPYmplY3QgYSwgZmluYWwgT2JqZWN0IGIpIHsKKyAgICAgICAgICAgIGludCBkOworICAgICAgICAgICAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwgfHwKKyAgICAgICAgICAgICAgICAgICAgKGQgPSBhLmdldENsYXNzKCkuZ2V0TmFtZSgpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVUbyhiLmdldENsYXNzKCkuZ2V0TmFtZSgpKSkgPT0gMCkKKyAgICAgICAgICAgICAgICBkID0gKFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKGEpIDw9IFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKGIpID8KKyAgICAgICAgICAgICAgICAgICAgICAgIC0xIDogMSk7CisgICAgICAgICAgICByZXR1cm4gZDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGJpbiB3aXRoIGluaXRpYWwgc2V0IG9mIG5vZGVzIGhlYWRlZCBieSBiLgorICAgICAgICAgKi8KKyAgICAgICAgVHJlZUJpbihmaW5hbCBUcmVlTm9kZTxLLCBWPiBiKSB7CisgICAgICAgICAgICBzdXBlcihUUkVFQklOLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIHRoaXMuZmlyc3QgPSBiOworICAgICAgICAgICAgVHJlZU5vZGU8SywgVj4gciA9IG51bGw7CisgICAgICAgICAgICBmb3IgKFRyZWVOb2RlPEssIFY+IHggPSBiLCBuZXh0OyB4ICE9IG51bGw7IHggPSBuZXh0KSB7CisgICAgICAgICAgICAgICAgbmV4dCA9IChUcmVlTm9kZTxLLCBWPikgeC5uZXh0OworICAgICAgICAgICAgICAgIHgubGVmdCA9IHgucmlnaHQgPSBudWxsOworICAgICAgICAgICAgICAgIGlmIChyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgeC5wYXJlbnQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICB4LnJlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICByID0geDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBLIGsgPSB4LmtleTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGggPSB4Lmhhc2g7CisgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IGtjID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChUcmVlTm9kZTxLLCBWPiBwID0gcjsgOyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBkaXI7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcGg7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBLIHBrID0gcC5rZXk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHBoID0gcC5oYXNoKSA+IGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyID0gLTE7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwaCA8IGgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChrYyA9PSBudWxsICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrYyA9IGNvbXBhcmFibGVDbGFzc0ZvcihrKSkgPT0gbnVsbCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpciA9IGNvbXBhcmVDb21wYXJhYmxlcyhrYywgaywgcGspKSA9PSAwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpciA9IHRpZUJyZWFrT3JkZXIoaywgcGspOworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVHJlZU5vZGU8SywgVj4geHAgPSBwOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChwID0gKGRpciA8PSAwKSA/IHAubGVmdCA6IHAucmlnaHQpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4LnBhcmVudCA9IHhwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXIgPD0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHAubGVmdCA9IHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4cC5yaWdodCA9IHg7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgciA9IGJhbGFuY2VJbnNlcnRpb24ociwgeCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLnJvb3QgPSByOworICAgICAgICAgICAgYXNzZXJ0IGNoZWNrSW52YXJpYW50cyhyb290KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBY3F1aXJlcyB3cml0ZSBsb2NrIGZvciB0cmVlIHJlc3RydWN0dXJpbmcuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGZpbmFsIHZvaWQgbG9ja1Jvb3QoKSB7CisgICAgICAgICAgICBpZiAoIVUuY29tcGFyZUFuZFN3YXBJbnQodGhpcywgTE9DS1NUQVRFLCAwLCBXUklURVIpKQorICAgICAgICAgICAgICAgIGNvbnRlbmRlZExvY2soKTsgLy8gb2ZmbG9hZCB0byBzZXBhcmF0ZSBtZXRob2QKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZWxlYXNlcyB3cml0ZSBsb2NrIGZvciB0cmVlIHJlc3RydWN0dXJpbmcuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGZpbmFsIHZvaWQgdW5sb2NrUm9vdCgpIHsKKyAgICAgICAgICAgIGxvY2tTdGF0ZSA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUG9zc2libHkgYmxvY2tzIGF3YWl0aW5nIHJvb3QgbG9jay4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgZmluYWwgdm9pZCBjb250ZW5kZWRMb2NrKCkgeworICAgICAgICAgICAgYm9vbGVhbiB3YWl0aW5nID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKGludCBzOyA7ICkgeworICAgICAgICAgICAgICAgIGlmICgoKHMgPSBsb2NrU3RhdGUpICYgV1JJVEVSKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChVLmNvbXBhcmVBbmRTd2FwSW50KHRoaXMsIExPQ0tTVEFURSwgcywgV1JJVEVSKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdhaXRpbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdGVyID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHMgJiBXQUlURVIpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFUuY29tcGFyZUFuZFN3YXBJbnQodGhpcywgTE9DS1NUQVRFLCBzLCBzIHwgV0FJVEVSKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgd2FpdGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB3YWl0ZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3YWl0aW5nKQorICAgICAgICAgICAgICAgICAgICBMb2NrU3VwcG9ydC5wYXJrKHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgbWF0Y2hpbmcgbm9kZSBvciBudWxsIGlmIG5vbmUuIFRyaWVzIHRvIHNlYXJjaAorICAgICAgICAgKiB1c2luZyB0cmVlIGNvbXBhcmlzb25zIGZyb20gcm9vdCwgYnV0IGNvbnRpbnVlcyBsaW5lYXIKKyAgICAgICAgICogc2VhcmNoIHdoZW4gbG9jayBub3QgYXZhaWxhYmxlLgorICAgICAgICAgKi8KKyAgICAgICAgZmluYWwgTm9kZTxLLCBWPiBmaW5kKGZpbmFsIGludCBoLCBmaW5hbCBPYmplY3QgaykgeworICAgICAgICAgICAgaWYgKGsgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoTm9kZTxLLCBWPiBlID0gZmlyc3Q7IGUgIT0gbnVsbDsgZSA9IGUubmV4dCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgczsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgSyBlazsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCgocyA9IGxvY2tTdGF0ZSkgJiAoV0FJVEVSIHwgV1JJVEVSKSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUuaGFzaCA9PSBoICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZWsgPSBlLmtleSkgPT0gayB8fCAoZWsgIT0gbnVsbCAmJiBrLmVxdWFscyhlaykpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChVLmNvbXBhcmVBbmRTd2FwSW50KHRoaXMsIExPQ0tTVEFURSwgcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzICsgUkVBREVSKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVHJlZU5vZGU8SywgVj4gcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRyZWVOb2RlPEssIFY+IHA7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAgPSAoKHIgPSByb290KSA9PSBudWxsID8gbnVsbCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmZpbmRUcmVlTm9kZShoLCBrLCBudWxsKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFRocmVhZCB3OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoIVUuY29tcGFyZUFuZFN3YXBJbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLCBMT0NLU1RBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxzID0gbG9ja1N0YXRlLCBscyAtIFJFQURFUikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChscyA9PSAoUkVBREVSIHwgV0FJVEVSKSAmJiAodyA9IHdhaXRlcikgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9ja1N1cHBvcnQudW5wYXJrKHcpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBGaW5kcyBvciBhZGRzIGEgbm9kZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBudWxsIGlmIGFkZGVkCisgICAgICAgICAqLworICAgICAgICBmaW5hbCBUcmVlTm9kZTxLLCBWPiBwdXRUcmVlVmFsKGZpbmFsIGludCBoLCBmaW5hbCBLIGssIGZpbmFsIFYgdikgeworICAgICAgICAgICAgQ2xhc3M8Pz4ga2MgPSBudWxsOworICAgICAgICAgICAgYm9vbGVhbiBzZWFyY2hlZCA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChUcmVlTm9kZTxLLCBWPiBwID0gcm9vdDsgOyApIHsKKyAgICAgICAgICAgICAgICBpbnQgZGlyOworICAgICAgICAgICAgICAgIGZpbmFsIGludCBwaDsKKyAgICAgICAgICAgICAgICBmaW5hbCBLIHBrOworICAgICAgICAgICAgICAgIGlmIChwID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSByb290ID0gbmV3IFRyZWVOb2RlPEssIFY+KGgsIGssIHYsIG51bGwsIG51bGwpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChwaCA9IHAuaGFzaCkgPiBoKQorICAgICAgICAgICAgICAgICAgICBkaXIgPSAtMTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChwaCA8IGgpCisgICAgICAgICAgICAgICAgICAgIGRpciA9IDE7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoKHBrID0gcC5rZXkpID09IGsgfHwgKHBrICE9IG51bGwgJiYgay5lcXVhbHMocGspKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoKGtjID09IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChrYyA9IGNvbXBhcmFibGVDbGFzc0ZvcihrKSkgPT0gbnVsbCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChkaXIgPSBjb21wYXJlQ29tcGFyYWJsZXMoa2MsIGssIHBrKSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXNlYXJjaGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUcmVlTm9kZTxLLCBWPiBxLCBjaDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoKGNoID0gcC5sZWZ0KSAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChxID0gY2guZmluZFRyZWVOb2RlKGgsIGssIGtjKSkgIT0gbnVsbCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjaCA9IHAucmlnaHQpICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocSA9IGNoLmZpbmRUcmVlTm9kZShoLCBrLCBrYykpICE9IG51bGwpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGRpciA9IHRpZUJyZWFrT3JkZXIoaywgcGspOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZpbmFsIFRyZWVOb2RlPEssIFY+IHhwID0gcDsKKyAgICAgICAgICAgICAgICBpZiAoKHAgPSAoZGlyIDw9IDApID8gcC5sZWZ0IDogcC5yaWdodCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBUcmVlTm9kZTxLLCBWPiB4OworICAgICAgICAgICAgICAgICAgICBmaW5hbCBUcmVlTm9kZTxLLCBWPiBmID0gZmlyc3Q7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0geCA9IG5ldyBUcmVlTm9kZTxLLCBWPihoLCBrLCB2LCBmLCB4cCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChmICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBmLnByZXYgPSB4OworICAgICAgICAgICAgICAgICAgICBpZiAoZGlyIDw9IDApCisgICAgICAgICAgICAgICAgICAgICAgICB4cC5sZWZ0ID0geDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgeHAucmlnaHQgPSB4OworICAgICAgICAgICAgICAgICAgICBpZiAoIXhwLnJlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHgucmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2NrUm9vdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290ID0gYmFsYW5jZUluc2VydGlvbihyb290LCB4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5sb2NrUm9vdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydCBjaGVja0ludmFyaWFudHMocm9vdCk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZW1vdmVzIHRoZSBnaXZlbiBub2RlLCB0aGF0IG11c3QgYmUgcHJlc2VudCBiZWZvcmUgdGhpcworICAgICAgICAgKiBjYWxsLiAgVGhpcyBpcyBtZXNzaWVyIHRoYW4gdHlwaWNhbCByZWQtYmxhY2sgZGVsZXRpb24gY29kZQorICAgICAgICAgKiBiZWNhdXNlIHdlIGNhbm5vdCBzd2FwIHRoZSBjb250ZW50cyBvZiBhbiBpbnRlcmlvciBub2RlCisgICAgICAgICAqIHdpdGggYSBsZWFmIHN1Y2Nlc3NvciB0aGF0IGlzIHBpbm5lZCBieSAibmV4dCIgcG9pbnRlcnMKKyAgICAgICAgICogdGhhdCBhcmUgYWNjZXNzaWJsZSBpbmRlcGVuZGVudGx5IG9mIGxvY2suIFNvIGluc3RlYWQgd2UKKyAgICAgICAgICogc3dhcCB0aGUgdHJlZSBsaW5rYWdlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB0cnVlIGlmIG5vdyB0b28gc21hbGwsIHNvIHNob3VsZCBiZSB1bnRyZWVpZmllZAorICAgICAgICAgKi8KKyAgICAgICAgZmluYWwgYm9vbGVhbiByZW1vdmVUcmVlTm9kZShmaW5hbCBUcmVlTm9kZTxLLCBWPiBwKSB7CisgICAgICAgICAgICBmaW5hbCBUcmVlTm9kZTxLLCBWPiBuZXh0ID0gKFRyZWVOb2RlPEssIFY+KSBwLm5leHQ7CisgICAgICAgICAgICBmaW5hbCBUcmVlTm9kZTxLLCBWPiBwcmVkID0gcC5wcmV2OyAgLy8gdW5saW5rIHRyYXZlcnNhbCBwb2ludGVycworICAgICAgICAgICAgVHJlZU5vZGU8SywgVj4gcjsKKyAgICAgICAgICAgIGZpbmFsIFRyZWVOb2RlPEssIFY+IHJsOworICAgICAgICAgICAgaWYgKHByZWQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBmaXJzdCA9IG5leHQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcHJlZC5uZXh0ID0gbmV4dDsKKyAgICAgICAgICAgIGlmIChuZXh0ICE9IG51bGwpCisgICAgICAgICAgICAgICAgbmV4dC5wcmV2ID0gcHJlZDsKKyAgICAgICAgICAgIGlmIChmaXJzdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcm9vdCA9IG51bGw7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHIgPSByb290KSA9PSBudWxsIHx8IHIucmlnaHQgPT0gbnVsbCB8fCAvLyB0b28gc21hbGwKKyAgICAgICAgICAgICAgICAgICAgKHJsID0gci5sZWZ0KSA9PSBudWxsIHx8IHJsLmxlZnQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIGxvY2tSb290KCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZpbmFsIFRyZWVOb2RlPEssIFY+IHJlcGxhY2VtZW50OworICAgICAgICAgICAgICAgIGZpbmFsIFRyZWVOb2RlPEssIFY+IHBsID0gcC5sZWZ0OworICAgICAgICAgICAgICAgIGZpbmFsIFRyZWVOb2RlPEssIFY+IHByID0gcC5yaWdodDsKKyAgICAgICAgICAgICAgICBpZiAocGwgIT0gbnVsbCAmJiBwciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIFRyZWVOb2RlPEssIFY+IHMgPSBwciwgc2w7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICgoc2wgPSBzLmxlZnQpICE9IG51bGwpIC8vIGZpbmQgc3VjY2Vzc29yCisgICAgICAgICAgICAgICAgICAgICAgICBzID0gc2w7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gYyA9IHMucmVkOworICAgICAgICAgICAgICAgICAgICBzLnJlZCA9IHAucmVkOworICAgICAgICAgICAgICAgICAgICBwLnJlZCA9IGM7IC8vIHN3YXAgY29sb3JzCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFRyZWVOb2RlPEssIFY+IHNyID0gcy5yaWdodDsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgVHJlZU5vZGU8SywgVj4gcHAgPSBwLnBhcmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMgPT0gcHIpIHsgLy8gcCB3YXMgcydzIGRpcmVjdCBwYXJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIHAucGFyZW50ID0gczsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMucmlnaHQgPSBwOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVHJlZU5vZGU8SywgVj4gc3AgPSBzLnBhcmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocC5wYXJlbnQgPSBzcCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzID09IHNwLmxlZnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwLmxlZnQgPSBwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3AucmlnaHQgPSBwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzLnJpZ2h0ID0gcHIpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHIucGFyZW50ID0gczsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwLmxlZnQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBpZiAoKHAucmlnaHQgPSBzcikgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyLnBhcmVudCA9IHA7CisgICAgICAgICAgICAgICAgICAgIGlmICgocy5sZWZ0ID0gcGwpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICBwbC5wYXJlbnQgPSBzOworICAgICAgICAgICAgICAgICAgICBpZiAoKHMucGFyZW50ID0gcHApID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICByID0gczsKKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocCA9PSBwcC5sZWZ0KQorICAgICAgICAgICAgICAgICAgICAgICAgcHAubGVmdCA9IHM7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHBwLnJpZ2h0ID0gczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNyICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9IHNyOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9IHA7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwbCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9IHBsOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKHByICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gcHI7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICByZXBsYWNlbWVudCA9IHA7CisgICAgICAgICAgICAgICAgaWYgKHJlcGxhY2VtZW50ICE9IHApIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgVHJlZU5vZGU8SywgVj4gcHAgPSByZXBsYWNlbWVudC5wYXJlbnQgPSBwLnBhcmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBwID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICByID0gcmVwbGFjZW1lbnQ7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHAgPT0gcHAubGVmdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHBwLmxlZnQgPSByZXBsYWNlbWVudDsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgcHAucmlnaHQgPSByZXBsYWNlbWVudDsKKyAgICAgICAgICAgICAgICAgICAgcC5sZWZ0ID0gcC5yaWdodCA9IHAucGFyZW50ID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByb290ID0gKHAucmVkKSA/IHIgOiBiYWxhbmNlRGVsZXRpb24ociwgcmVwbGFjZW1lbnQpOworCisgICAgICAgICAgICAgICAgaWYgKHAgPT0gcmVwbGFjZW1lbnQpIHsgIC8vIGRldGFjaCBwb2ludGVycworICAgICAgICAgICAgICAgICAgICBmaW5hbCBUcmVlTm9kZTxLLCBWPiBwcDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChwcCA9IHAucGFyZW50KSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocCA9PSBwcC5sZWZ0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBwLmxlZnQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocCA9PSBwcC5yaWdodCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcC5yaWdodCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICBwLnBhcmVudCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHVubG9ja1Jvb3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydCBjaGVja0ludmFyaWFudHMocm9vdCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKyAgICAgICAgLy8gUmVkLWJsYWNrIHRyZWUgbWV0aG9kcywgYWxsIGFkYXB0ZWQgZnJvbSBDTFIKKworICAgICAgICBzdGF0aWMgPEssIFY+IFRyZWVOb2RlPEssIFY+IHJvdGF0ZUxlZnQoVHJlZU5vZGU8SywgVj4gcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFRyZWVOb2RlPEssIFY+IHApIHsKKyAgICAgICAgICAgIGZpbmFsIFRyZWVOb2RlPEssIFY+IHI7CisgICAgICAgICAgICBmaW5hbCBUcmVlTm9kZTxLLCBWPiBwcDsKKyAgICAgICAgICAgIGZpbmFsIFRyZWVOb2RlPEssIFY+IHJsOworICAgICAgICAgICAgaWYgKHAgIT0gbnVsbCAmJiAociA9IHAucmlnaHQpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoKHJsID0gcC5yaWdodCA9IHIubGVmdCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgcmwucGFyZW50ID0gcDsKKyAgICAgICAgICAgICAgICBpZiAoKHBwID0gci5wYXJlbnQgPSBwLnBhcmVudCkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgKHJvb3QgPSByKS5yZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChwcC5sZWZ0ID09IHApCisgICAgICAgICAgICAgICAgICAgIHBwLmxlZnQgPSByOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcHAucmlnaHQgPSByOworICAgICAgICAgICAgICAgIHIubGVmdCA9IHA7CisgICAgICAgICAgICAgICAgcC5wYXJlbnQgPSByOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJvb3Q7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgPEssIFY+IFRyZWVOb2RlPEssIFY+IHJvdGF0ZVJpZ2h0KFRyZWVOb2RlPEssIFY+IHJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVHJlZU5vZGU8SywgVj4gcCkgeworICAgICAgICAgICAgZmluYWwgVHJlZU5vZGU8SywgVj4gbDsKKyAgICAgICAgICAgIGZpbmFsIFRyZWVOb2RlPEssIFY+IHBwOworICAgICAgICAgICAgZmluYWwgVHJlZU5vZGU8SywgVj4gbHI7CisgICAgICAgICAgICBpZiAocCAhPSBudWxsICYmIChsID0gcC5sZWZ0KSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKChsciA9IHAubGVmdCA9IGwucmlnaHQpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGxyLnBhcmVudCA9IHA7CisgICAgICAgICAgICAgICAgaWYgKChwcCA9IGwucGFyZW50ID0gcC5wYXJlbnQpID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIChyb290ID0gbCkucmVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAocHAucmlnaHQgPT0gcCkKKyAgICAgICAgICAgICAgICAgICAgcHAucmlnaHQgPSBsOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcHAubGVmdCA9IGw7CisgICAgICAgICAgICAgICAgbC5yaWdodCA9IHA7CisgICAgICAgICAgICAgICAgcC5wYXJlbnQgPSBsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJvb3Q7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgPEssIFY+IFRyZWVOb2RlPEssIFY+IGJhbGFuY2VJbnNlcnRpb24oVHJlZU5vZGU8SywgVj4gcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyZWVOb2RlPEssIFY+IHgpIHsKKyAgICAgICAgICAgIHgucmVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGZvciAoVHJlZU5vZGU8SywgVj4geHAsIHhwcCwgeHBwbCwgeHBwcjsgOyApIHsKKyAgICAgICAgICAgICAgICBpZiAoKHhwID0geC5wYXJlbnQpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgeC5yZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHg7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgheHAucmVkIHx8ICh4cHAgPSB4cC5wYXJlbnQpID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByb290OworICAgICAgICAgICAgICAgIGlmICh4cCA9PSAoeHBwbCA9IHhwcC5sZWZ0KSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHhwcHIgPSB4cHAucmlnaHQpICE9IG51bGwgJiYgeHBwci5yZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHhwcHIucmVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB4cC5yZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHhwcC5yZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgeCA9IHhwcDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4ID09IHhwLnJpZ2h0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdCA9IHJvdGF0ZUxlZnQocm9vdCwgeCA9IHhwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4cHAgPSAoeHAgPSB4LnBhcmVudCkgPT0gbnVsbCA/IG51bGwgOiB4cC5wYXJlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeHAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhwLnJlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4cHAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4cHAucmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdCA9IHJvdGF0ZVJpZ2h0KHJvb3QsIHhwcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHhwcGwgIT0gbnVsbCAmJiB4cHBsLnJlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgeHBwbC5yZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHhwLnJlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgeHBwLnJlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB4ID0geHBwOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHggPT0geHAubGVmdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3QgPSByb3RhdGVSaWdodChyb290LCB4ID0geHApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhwcCA9ICh4cCA9IHgucGFyZW50KSA9PSBudWxsID8gbnVsbCA6IHhwLnBhcmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4cCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHAucmVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHhwcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhwcC5yZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290ID0gcm90YXRlTGVmdChyb290LCB4cHApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyA8SywgVj4gVHJlZU5vZGU8SywgVj4gYmFsYW5jZURlbGV0aW9uKFRyZWVOb2RlPEssIFY+IHJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyZWVOb2RlPEssIFY+IHgpIHsKKyAgICAgICAgICAgIGZvciAoVHJlZU5vZGU8SywgVj4geHAsIHhwbCwgeHByOyA7ICkgeworICAgICAgICAgICAgICAgIGlmICh4ID09IG51bGwgfHwgeCA9PSByb290KQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm9vdDsKKyAgICAgICAgICAgICAgICBlbHNlIGlmICgoeHAgPSB4LnBhcmVudCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB4LnJlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4geDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHgucmVkKSB7CisgICAgICAgICAgICAgICAgICAgIHgucmVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByb290OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKHhwbCA9IHhwLmxlZnQpID09IHgpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCh4cHIgPSB4cC5yaWdodCkgIT0gbnVsbCAmJiB4cHIucmVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB4cHIucmVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB4cC5yZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgcm9vdCA9IHJvdGF0ZUxlZnQocm9vdCwgeHApOworICAgICAgICAgICAgICAgICAgICAgICAgeHByID0gKHhwID0geC5wYXJlbnQpID09IG51bGwgPyBudWxsIDogeHAucmlnaHQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHhwciA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgeCA9IHhwOworICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFRyZWVOb2RlPEssIFY+IHNsID0geHByLmxlZnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBUcmVlTm9kZTxLLCBWPiBzciA9IHhwci5yaWdodDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc3IgPT0gbnVsbCB8fCAhc3IucmVkKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2wgPT0gbnVsbCB8fCAhc2wucmVkKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhwci5yZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSB4cDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyID09IG51bGwgfHwgIXNyLnJlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2wgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsLnJlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4cHIucmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdCA9IHJvdGF0ZVJpZ2h0KHJvb3QsIHhwcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhwciA9ICh4cCA9IHgucGFyZW50KSA9PSBudWxsID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsIDogeHAucmlnaHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4cHIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4cHIucmVkID0gKHhwID09IG51bGwpID8gZmFsc2UgOiB4cC5yZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc3IgPSB4cHIucmlnaHQpICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzci5yZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHhwICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHAucmVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3QgPSByb3RhdGVMZWZ0KHJvb3QsIHhwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IHJvb3Q7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBzeW1tZXRyaWMKKyAgICAgICAgICAgICAgICAgICAgaWYgKHhwbCAhPSBudWxsICYmIHhwbC5yZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHhwbC5yZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHhwLnJlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICByb290ID0gcm90YXRlUmlnaHQocm9vdCwgeHApOworICAgICAgICAgICAgICAgICAgICAgICAgeHBsID0gKHhwID0geC5wYXJlbnQpID09IG51bGwgPyBudWxsIDogeHAubGVmdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoeHBsID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgICAgICB4ID0geHA7CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgVHJlZU5vZGU8SywgVj4gc2wgPSB4cGwubGVmdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFRyZWVOb2RlPEssIFY+IHNyID0geHBsLnJpZ2h0OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzbCA9PSBudWxsIHx8ICFzbC5yZWQpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzciA9PSBudWxsIHx8ICFzci5yZWQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeHBsLnJlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IHhwOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2wgPT0gbnVsbCB8fCAhc2wucmVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzciAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3IucmVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhwbC5yZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290ID0gcm90YXRlTGVmdChyb290LCB4cGwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4cGwgPSAoeHAgPSB4LnBhcmVudCkgPT0gbnVsbCA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCA6IHhwLmxlZnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh4cGwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4cGwucmVkID0gKHhwID09IG51bGwpID8gZmFsc2UgOiB4cC5yZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc2wgPSB4cGwubGVmdCkgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsLnJlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoeHAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4cC5yZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdCA9IHJvdGF0ZVJpZ2h0KHJvb3QsIHhwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCA9IHJvb3Q7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVjdXJzaXZlIGludmFyaWFudCBjaGVjaworICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIDxLLCBWPiBib29sZWFuIGNoZWNrSW52YXJpYW50cyhmaW5hbCBUcmVlTm9kZTxLLCBWPiB0KSB7CisgICAgICAgICAgICBmaW5hbCBUcmVlTm9kZTxLLCBWPiB0cCA9IHQucGFyZW50OworICAgICAgICAgICAgZmluYWwgVHJlZU5vZGU8SywgVj4gdGwgPSB0LmxlZnQ7CisgICAgICAgICAgICBmaW5hbCBUcmVlTm9kZTxLLCBWPiB0ciA9IHQucmlnaHQ7CisgICAgICAgICAgICBmaW5hbCBUcmVlTm9kZTxLLCBWPiB0YiA9IHQucHJldjsKKyAgICAgICAgICAgIGZpbmFsIFRyZWVOb2RlPEssIFY+IHRuID0gKFRyZWVOb2RlPEssIFY+KSB0Lm5leHQ7CisgICAgICAgICAgICBpZiAodGIgIT0gbnVsbCAmJiB0Yi5uZXh0ICE9IHQpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYgKHRuICE9IG51bGwgJiYgdG4ucHJldiAhPSB0KQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmICh0cCAhPSBudWxsICYmIHQgIT0gdHAubGVmdCAmJiB0ICE9IHRwLnJpZ2h0KQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmICh0bCAhPSBudWxsICYmICh0bC5wYXJlbnQgIT0gdCB8fCB0bC5oYXNoID4gdC5oYXNoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiAodHIgIT0gbnVsbCAmJiAodHIucGFyZW50ICE9IHQgfHwgdHIuaGFzaCA8IHQuaGFzaCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgaWYgKHQucmVkICYmIHRsICE9IG51bGwgJiYgdGwucmVkICYmIHRyICE9IG51bGwgJiYgdHIucmVkKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmICh0bCAhPSBudWxsICYmICFjaGVja0ludmFyaWFudHModGwpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmICh0ciAhPSBudWxsICYmICFjaGVja0ludmFyaWFudHModHIpKQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgc3VuLm1pc2MuVW5zYWZlIFU7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgTE9DS1NUQVRFOworCisgICAgICAgIHN0YXRpYyB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFUgPSBnZXRVbnNhZmUoKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiBrID0gVHJlZUJpbi5jbGFzczsKKyAgICAgICAgICAgICAgICBMT0NLU1RBVEUgPSBVLm9iamVjdEZpZWxkT2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAoay5nZXREZWNsYXJlZEZpZWxkKCJsb2NrU3RhdGUiKSk7CisgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS1UYWJsZSBUcmF2ZXJzYWwgLS0tLS0tLS0tLS0tLS0gKi8KKworICAgIC8qKgorICAgICAqIEVuY2Fwc3VsYXRlcyB0cmF2ZXJzYWwgZm9yIG1ldGhvZHMgc3VjaCBhcyBjb250YWluc1ZhbHVlOyBhbHNvCisgICAgICogc2VydmVzIGFzIGEgYmFzZSBjbGFzcyBmb3Igb3RoZXIgaXRlcmF0b3JzIGFuZCBzcGxpdGVyYXRvcnMuCisgICAgICoKKyAgICAgKiBNZXRob2QgYWR2YW5jZSB2aXNpdHMgb25jZSBlYWNoIHN0aWxsLXZhbGlkIG5vZGUgdGhhdCB3YXMKKyAgICAgKiByZWFjaGFibGUgdXBvbiBpdGVyYXRvciBjb25zdHJ1Y3Rpb24uIEl0IG1pZ2h0IG1pc3Mgc29tZSB0aGF0CisgICAgICogd2VyZSBhZGRlZCB0byBhIGJpbiBhZnRlciB0aGUgYmluIHdhcyB2aXNpdGVkLCB3aGljaCBpcyBPSyB3cnQKKyAgICAgKiBjb25zaXN0ZW5jeSBndWFyYW50ZWVzLiBNYWludGFpbmluZyB0aGlzIHByb3BlcnR5IGluIHRoZSBmYWNlCisgICAgICogb2YgcG9zc2libGUgb25nb2luZyByZXNpemVzIHJlcXVpcmVzIGEgZmFpciBhbW91bnQgb2YKKyAgICAgKiBib29ra2VlcGluZyBzdGF0ZSB0aGF0IGlzIGRpZmZpY3VsdCB0byBvcHRpbWl6ZSBhd2F5IGFtaWRzdAorICAgICAqIHZvbGF0aWxlIGFjY2Vzc2VzLiAgRXZlbiBzbywgdHJhdmVyc2FsIG1haW50YWlucyByZWFzb25hYmxlCisgICAgICogdGhyb3VnaHB1dC4KKyAgICAgKgorICAgICAqIE5vcm1hbGx5LCBpdGVyYXRpb24gcHJvY2VlZHMgYmluLWJ5LWJpbiB0cmF2ZXJzaW5nIGxpc3RzLgorICAgICAqIEhvd2V2ZXIsIGlmIHRoZSB0YWJsZSBoYXMgYmVlbiByZXNpemVkLCB0aGVuIGFsbCBmdXR1cmUgc3RlcHMKKyAgICAgKiBtdXN0IHRyYXZlcnNlIGJvdGggdGhlIGJpbiBhdCB0aGUgY3VycmVudCBpbmRleCBhcyB3ZWxsIGFzIGF0CisgICAgICogKGluZGV4ICsgYmFzZVNpemUpOyBhbmQgc28gb24gZm9yIGZ1cnRoZXIgcmVzaXppbmdzLiBUbworICAgICAqIHBhcmFub2ljYWxseSBjb3BlIHdpdGggcG90ZW50aWFsIHNoYXJpbmcgYnkgdXNlcnMgb2YgaXRlcmF0b3JzCisgICAgICogYWNyb3NzIHRocmVhZHMsIGl0ZXJhdGlvbiB0ZXJtaW5hdGVzIGlmIGEgYm91bmRzIGNoZWNrcyBmYWlscworICAgICAqIGZvciBhIHRhYmxlIHJlYWQuCisgICAgICovCisgICAgc3RhdGljIGNsYXNzIFRyYXZlcnNlcjxLLCBWPiB7CisgICAgICAgIE5vZGU8SywgVj5bXSB0YWI7ICAgICAgICAvLyBjdXJyZW50IHRhYmxlOyB1cGRhdGVkIGlmIHJlc2l6ZWQKKyAgICAgICAgTm9kZTxLLCBWPiBuZXh0OyAgICAgICAgIC8vIHRoZSBuZXh0IGVudHJ5IHRvIHVzZQorICAgICAgICBpbnQgaW5kZXg7ICAgICAgICAgICAgICAvLyBpbmRleCBvZiBiaW4gdG8gdXNlIG5leHQKKyAgICAgICAgaW50IGJhc2VJbmRleDsgICAgICAgICAgLy8gY3VycmVudCBpbmRleCBvZiBpbml0aWFsIHRhYmxlCisgICAgICAgIGludCBiYXNlTGltaXQ7ICAgICAgICAgIC8vIGluZGV4IGJvdW5kIGZvciBpbml0aWFsIHRhYmxlCisgICAgICAgIGZpbmFsIGludCBiYXNlU2l6ZTsgICAgIC8vIGluaXRpYWwgdGFibGUgc2l6ZQorCisgICAgICAgIFRyYXZlcnNlcihmaW5hbCBOb2RlPEssIFY+W10gdGFiLCBmaW5hbCBpbnQgc2l6ZSwgZmluYWwgaW50IGluZGV4LCBmaW5hbCBpbnQgbGltaXQpIHsKKyAgICAgICAgICAgIHRoaXMudGFiID0gdGFiOworICAgICAgICAgICAgdGhpcy5iYXNlU2l6ZSA9IHNpemU7CisgICAgICAgICAgICB0aGlzLmJhc2VJbmRleCA9IHRoaXMuaW5kZXggPSBpbmRleDsKKyAgICAgICAgICAgIHRoaXMuYmFzZUxpbWl0ID0gbGltaXQ7CisgICAgICAgICAgICB0aGlzLm5leHQgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkdmFuY2VzIGlmIHBvc3NpYmxlLCByZXR1cm5pbmcgbmV4dCB2YWxpZCBub2RlLCBvciBudWxsIGlmIG5vbmUuCisgICAgICAgICAqLworICAgICAgICBmaW5hbCBOb2RlPEssIFY+IGFkdmFuY2UoKSB7CisgICAgICAgICAgICBOb2RlPEssIFY+IGU7CisgICAgICAgICAgICBpZiAoKGUgPSBuZXh0KSAhPSBudWxsKQorICAgICAgICAgICAgICAgIGUgPSBlLm5leHQ7CisgICAgICAgICAgICBmb3IgKDsgOyApIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBOb2RlPEssIFY+W10gdDsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaTsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbjsKKyAgICAgICAgICAgICAgICBLIGVrOyAgLy8gbXVzdCB1c2UgbG9jYWxzIGluIGNoZWNrcworICAgICAgICAgICAgICAgIGlmIChlICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXh0ID0gZTsKKyAgICAgICAgICAgICAgICBpZiAoYmFzZUluZGV4ID49IGJhc2VMaW1pdCB8fCAodCA9IHRhYikgPT0gbnVsbCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKG4gPSB0Lmxlbmd0aCkgPD0gKGkgPSBpbmRleCkgfHwgaSA8IDApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXh0ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAoKGUgPSB0YWJBdCh0LCBpbmRleCkpICE9IG51bGwgJiYgZS5oYXNoIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEZvcndhcmRpbmdOb2RlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0YWIgPSAoKEZvcndhcmRpbmdOb2RlPEssIFY+KSBlKS5uZXh0VGFibGU7CisgICAgICAgICAgICAgICAgICAgICAgICBlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBUcmVlQmluKQorICAgICAgICAgICAgICAgICAgICAgICAgZSA9ICgoVHJlZUJpbjxLLCBWPikgZSkuZmlyc3Q7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGUgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKGluZGV4ICs9IGJhc2VTaXplKSA+PSBuKQorICAgICAgICAgICAgICAgICAgICBpbmRleCA9ICsrYmFzZUluZGV4OyAgICAvLyB2aXNpdCB1cHBlciBzbG90cyBpZiBwcmVzZW50CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCYXNlIG9mIGtleSwgdmFsdWUsIGFuZCBlbnRyeSBJdGVyYXRvcnMuIEFkZHMgZmllbGRzIHRvCisgICAgICogVHJhdmVyc2VyIHRvIHN1cHBvcnQgaXRlcmF0b3IucmVtb3ZlLgorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBCYXNlSXRlcmF0b3I8SywgVj4gZXh0ZW5kcyBUcmF2ZXJzZXI8SywgVj4geworICAgICAgICBmaW5hbCBDb25jdXJyZW50SGFzaE1hcFY4PEssIFY+IG1hcDsKKyAgICAgICAgTm9kZTxLLCBWPiBsYXN0UmV0dXJuZWQ7CisKKyAgICAgICAgQmFzZUl0ZXJhdG9yKGZpbmFsIE5vZGU8SywgVj5bXSB0YWIsIGZpbmFsIGludCBzaXplLCBmaW5hbCBpbnQgaW5kZXgsIGZpbmFsIGludCBsaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbmN1cnJlbnRIYXNoTWFwVjg8SywgVj4gbWFwKSB7CisgICAgICAgICAgICBzdXBlcih0YWIsIHNpemUsIGluZGV4LCBsaW1pdCk7CisgICAgICAgICAgICB0aGlzLm1hcCA9IG1hcDsKKyAgICAgICAgICAgIGFkdmFuY2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV4dCAhPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzTW9yZUVsZW1lbnRzKCkgeworICAgICAgICAgICAgcmV0dXJuIG5leHQgIT0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZSgpIHsKKyAgICAgICAgICAgIGZpbmFsIE5vZGU8SywgVj4gcDsKKyAgICAgICAgICAgIGlmICgocCA9IGxhc3RSZXR1cm5lZCkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgICAgICBsYXN0UmV0dXJuZWQgPSBudWxsOworICAgICAgICAgICAgbWFwLnJlcGxhY2VOb2RlKHAua2V5LCBudWxsLCBudWxsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBLZXlJdGVyYXRvcjxLLCBWPiBleHRlbmRzIEJhc2VJdGVyYXRvcjxLLCBWPgorICAgICAgICAgICAgaW1wbGVtZW50cyBJdGVyYXRvcjxLPiwgRW51bWVyYXRpb248Sz4geworICAgICAgICBLZXlJdGVyYXRvcihmaW5hbCBOb2RlPEssIFY+W10gdGFiLCBmaW5hbCBpbnQgaW5kZXgsIGZpbmFsIGludCBzaXplLCBmaW5hbCBpbnQgbGltaXQsCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbmN1cnJlbnRIYXNoTWFwVjg8SywgVj4gbWFwKSB7CisgICAgICAgICAgICBzdXBlcih0YWIsIGluZGV4LCBzaXplLCBsaW1pdCwgbWFwKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmaW5hbCBLIG5leHQoKSB7CisgICAgICAgICAgICBmaW5hbCBOb2RlPEssIFY+IHA7CisgICAgICAgICAgICBpZiAoKHAgPSBuZXh0KSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICBmaW5hbCBLIGsgPSBwLmtleTsKKyAgICAgICAgICAgIGxhc3RSZXR1cm5lZCA9IHA7CisgICAgICAgICAgICBhZHZhbmNlKCk7CisgICAgICAgICAgICByZXR1cm4gazsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmaW5hbCBLIG5leHRFbGVtZW50KCkgeworICAgICAgICAgICAgcmV0dXJuIG5leHQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBWYWx1ZUl0ZXJhdG9yPEssIFY+IGV4dGVuZHMgQmFzZUl0ZXJhdG9yPEssIFY+CisgICAgICAgICAgICBpbXBsZW1lbnRzIEl0ZXJhdG9yPFY+LCBFbnVtZXJhdGlvbjxWPiB7CisgICAgICAgIFZhbHVlSXRlcmF0b3IoZmluYWwgTm9kZTxLLCBWPltdIHRhYiwgZmluYWwgaW50IGluZGV4LCBmaW5hbCBpbnQgc2l6ZSwgZmluYWwgaW50IGxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbmN1cnJlbnRIYXNoTWFwVjg8SywgVj4gbWFwKSB7CisgICAgICAgICAgICBzdXBlcih0YWIsIGluZGV4LCBzaXplLCBsaW1pdCwgbWFwKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmaW5hbCBWIG5leHQoKSB7CisgICAgICAgICAgICBmaW5hbCBOb2RlPEssIFY+IHA7CisgICAgICAgICAgICBpZiAoKHAgPSBuZXh0KSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICBmaW5hbCBWIHYgPSBwLnZhbDsKKyAgICAgICAgICAgIGxhc3RSZXR1cm5lZCA9IHA7CisgICAgICAgICAgICBhZHZhbmNlKCk7CisgICAgICAgICAgICByZXR1cm4gdjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmaW5hbCBWIG5leHRFbGVtZW50KCkgeworICAgICAgICAgICAgcmV0dXJuIG5leHQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBFbnRyeUl0ZXJhdG9yPEssIFY+IGV4dGVuZHMgQmFzZUl0ZXJhdG9yPEssIFY+CisgICAgICAgICAgICBpbXBsZW1lbnRzIEl0ZXJhdG9yPE1hcC5FbnRyeTxLLCBWPj4geworICAgICAgICBFbnRyeUl0ZXJhdG9yKGZpbmFsIE5vZGU8SywgVj5bXSB0YWIsIGZpbmFsIGludCBpbmRleCwgZmluYWwgaW50IHNpemUsIGZpbmFsIGludCBsaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb25jdXJyZW50SGFzaE1hcFY4PEssIFY+IG1hcCkgeworICAgICAgICAgICAgc3VwZXIodGFiLCBpbmRleCwgc2l6ZSwgbGltaXQsIG1hcCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmluYWwgTWFwLkVudHJ5PEssIFY+IG5leHQoKSB7CisgICAgICAgICAgICBmaW5hbCBOb2RlPEssIFY+IHA7CisgICAgICAgICAgICBpZiAoKHAgPSBuZXh0KSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICBmaW5hbCBLIGsgPSBwLmtleTsKKyAgICAgICAgICAgIGZpbmFsIFYgdiA9IHAudmFsOworICAgICAgICAgICAgbGFzdFJldHVybmVkID0gcDsKKyAgICAgICAgICAgIGFkdmFuY2UoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTWFwRW50cnk8SywgVj4oaywgdiwgbWFwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEV4cG9ydGVkIEVudHJ5IGZvciBFbnRyeUl0ZXJhdG9yCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIE1hcEVudHJ5PEssIFY+IGltcGxlbWVudHMgTWFwLkVudHJ5PEssIFY+IHsKKyAgICAgICAgZmluYWwgSyBrZXk7IC8vIG5vbi1udWxsCisgICAgICAgIFYgdmFsOyAgICAgICAvLyBub24tbnVsbAorICAgICAgICBmaW5hbCBDb25jdXJyZW50SGFzaE1hcFY4PEssIFY+IG1hcDsKKworICAgICAgICBNYXBFbnRyeShmaW5hbCBLIGtleSwgZmluYWwgViB2YWwsIGZpbmFsIENvbmN1cnJlbnRIYXNoTWFwVjg8SywgVj4gbWFwKSB7CisgICAgICAgICAgICB0aGlzLmtleSA9IGtleTsKKyAgICAgICAgICAgIHRoaXMudmFsID0gdmFsOworICAgICAgICAgICAgdGhpcy5tYXAgPSBtYXA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSyBnZXRLZXkoKSB7CisgICAgICAgICAgICByZXR1cm4ga2V5OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFYgZ2V0VmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBrZXkuaGFzaENvZGUoKSBeIHZhbC5oYXNoQ29kZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBrZXkgKyAiPSIgKyB2YWw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIGZpbmFsIE9iamVjdCBrOworICAgICAgICAgICAgZmluYWwgT2JqZWN0IHY7CisgICAgICAgICAgICBmaW5hbCBNYXAuRW50cnk8PywgPz4gZTsKKyAgICAgICAgICAgIHJldHVybiAoKG8gaW5zdGFuY2VvZiBNYXAuRW50cnkpICYmCisgICAgICAgICAgICAgICAgICAgIChrID0gKGUgPSAoTWFwLkVudHJ5PD8sID8+KSBvKS5nZXRLZXkoKSkgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAodiA9IGUuZ2V0VmFsdWUoKSkgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAoayA9PSBrZXkgfHwgay5lcXVhbHMoa2V5KSkgJiYKKyAgICAgICAgICAgICAgICAgICAgKHYgPT0gdmFsIHx8IHYuZXF1YWxzKHZhbCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIG91ciBlbnRyeSdzIHZhbHVlIGFuZCB3cml0ZXMgdGhyb3VnaCB0byB0aGUgbWFwLiBUaGUKKyAgICAgICAgICogdmFsdWUgdG8gcmV0dXJuIGlzIHNvbWV3aGF0IGFyYml0cmFyeSBoZXJlLiBTaW5jZSB3ZSBkbyBub3QKKyAgICAgICAgICogbmVjZXNzYXJpbHkgdHJhY2sgYXN5bmNocm9ub3VzIGNoYW5nZXMsIHRoZSBtb3N0IHJlY2VudAorICAgICAgICAgKiAicHJldmlvdXMiIHZhbHVlIGNvdWxkIGJlIGRpZmZlcmVudCBmcm9tIHdoYXQgd2UgcmV0dXJuIChvcgorICAgICAgICAgKiBjb3VsZCBldmVuIGhhdmUgYmVlbiByZW1vdmVkLCBpbiB3aGljaCBjYXNlIHRoZSBwdXQgd2lsbAorICAgICAgICAgKiByZS1lc3RhYmxpc2gpLiBXZSBkbyBub3QgYW5kIGNhbm5vdCBndWFyYW50ZWUgbW9yZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBWIHNldFZhbHVlKGZpbmFsIFYgdmFsdWUpIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIGZpbmFsIFYgdiA9IHZhbDsKKyAgICAgICAgICAgIHZhbCA9IHZhbHVlOworICAgICAgICAgICAgbWFwLnB1dChrZXksIHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiB2OworICAgICAgICB9CisgICAgfQorCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLVZpZXdzIC0tLS0tLS0tLS0tLS0tICovCisKKyAgICAvKioKKyAgICAgKiBCYXNlIGNsYXNzIGZvciB2aWV3cy4KKyAgICAgKi8KKyAgICBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgQ29sbGVjdGlvblZpZXc8SywgViwgRT4KKyAgICAgICAgICAgIGltcGxlbWVudHMgQ29sbGVjdGlvbjxFPiwgamF2YS5pby5TZXJpYWxpemFibGUgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA3MjQ5MDY5MjQ2NzYzMTgyMzk3TDsKKyAgICAgICAgZmluYWwgQ29uY3VycmVudEhhc2hNYXBWODxLLCBWPiBtYXA7CisKKyAgICAgICAgQ29sbGVjdGlvblZpZXcoZmluYWwgQ29uY3VycmVudEhhc2hNYXBWODxLLCBWPiBtYXApIHsKKyAgICAgICAgICAgIHRoaXMubWFwID0gbWFwOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIG1hcCBiYWNraW5nIHRoaXMgdmlldy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB0aGUgbWFwIGJhY2tpbmcgdGhpcyB2aWV3CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQ29uY3VycmVudEhhc2hNYXBWODxLLCBWPiBnZXRNYXAoKSB7CisgICAgICAgICAgICByZXR1cm4gbWFwOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlbW92ZXMgYWxsIG9mIHRoZSBlbGVtZW50cyBmcm9tIHRoaXMgdmlldywgYnkgcmVtb3ZpbmcgYWxsCisgICAgICAgICAqIHRoZSBtYXBwaW5ncyBmcm9tIHRoZSBtYXAgYmFja2luZyB0aGlzIHZpZXcuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgZmluYWwgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgICAgIG1hcC5jbGVhcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZpbmFsIGludCBzaXplKCkgeworICAgICAgICAgICAgcmV0dXJuIG1hcC5zaXplKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBpc0VtcHR5KCkgeworICAgICAgICAgICAgcmV0dXJuIG1hcC5pc0VtcHR5KCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBpbXBsZW1lbnRhdGlvbnMgYmVsb3cgcmVseSBvbiBjb25jcmV0ZSBjbGFzc2VzIHN1cHBseWluZyB0aGVzZQorICAgICAgICAvLyBhYnN0cmFjdCBtZXRob2RzCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgYSAid2Vha2x5IGNvbnNpc3RlbnQiIGl0ZXJhdG9yIHRoYXQgd2lsbCBuZXZlcgorICAgICAgICAgKiB0aHJvdyB7QGxpbmsgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbn0sIGFuZAorICAgICAgICAgKiBndWFyYW50ZWVzIHRvIHRyYXZlcnNlIGVsZW1lbnRzIGFzIHRoZXkgZXhpc3RlZCB1cG9uCisgICAgICAgICAqIGNvbnN0cnVjdGlvbiBvZiB0aGUgaXRlcmF0b3IsIGFuZCBtYXkgKGJ1dCBpcyBub3QKKyAgICAgICAgICogZ3VhcmFudGVlZCB0bykgcmVmbGVjdCBhbnkgbW9kaWZpY2F0aW9ucyBzdWJzZXF1ZW50IHRvCisgICAgICAgICAqIGNvbnN0cnVjdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBJdGVyYXRvcjxFPiBpdGVyYXRvcigpOworCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKTsKKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pOworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBvb21lTXNnID0gIlJlcXVpcmVkIGFycmF5IHNpemUgdG9vIGxhcmdlIjsKKworICAgICAgICBwdWJsaWMgZmluYWwgT2JqZWN0W10gdG9BcnJheSgpIHsKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgc3ogPSBtYXAubWFwcGluZ0NvdW50KCk7CisgICAgICAgICAgICBpZiAoc3ogPiBNQVhfQVJSQVlfU0laRSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3V0T2ZNZW1vcnlFcnJvcihvb21lTXNnKTsKKyAgICAgICAgICAgIGludCBuID0gKGludCkgc3o7CisgICAgICAgICAgICBPYmplY3RbXSByID0gbmV3IE9iamVjdFtuXTsKKyAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgIGZvciAoZmluYWwgRSBlIDogdGhpcykgeworICAgICAgICAgICAgICAgIGlmIChpID09IG4pIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG4gPj0gTUFYX0FSUkFZX1NJWkUpCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3V0T2ZNZW1vcnlFcnJvcihvb21lTXNnKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG4gPj0gTUFYX0FSUkFZX1NJWkUgLSAoTUFYX0FSUkFZX1NJWkUgPj4+IDEpIC0gMSkKKyAgICAgICAgICAgICAgICAgICAgICAgIG4gPSBNQVhfQVJSQVlfU0laRTsKKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgbiArPSAobiA+Pj4gMSkgKyAxOworICAgICAgICAgICAgICAgICAgICByID0gQXJyYXlzLmNvcHlPZihyLCBuKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcltpKytdID0gZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAoaSA9PSBuKSA/IHIgOiBBcnJheXMuY29weU9mKHIsIGkpOworICAgICAgICB9CisKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgIHB1YmxpYyBmaW5hbCA8VD4gVFtdIHRvQXJyYXkoZmluYWwgVFtdIGEpIHsKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgc3ogPSBtYXAubWFwcGluZ0NvdW50KCk7CisgICAgICAgICAgICBpZiAoc3ogPiBNQVhfQVJSQVlfU0laRSkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT3V0T2ZNZW1vcnlFcnJvcihvb21lTXNnKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBtID0gKGludCkgc3o7CisgICAgICAgICAgICBUW10gciA9IChhLmxlbmd0aCA+PSBtKSA/IGEgOgorICAgICAgICAgICAgICAgICAgICAoVFtdKSBqYXZhLmxhbmcucmVmbGVjdC5BcnJheQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5uZXdJbnN0YW5jZShhLmdldENsYXNzKCkuZ2V0Q29tcG9uZW50VHlwZSgpLCBtKTsKKyAgICAgICAgICAgIGludCBuID0gci5sZW5ndGg7CisgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICBmb3IgKGZpbmFsIEUgZSA6IHRoaXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSBuKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChuID49IE1BWF9BUlJBWV9TSVpFKQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE91dE9mTWVtb3J5RXJyb3Iob29tZU1zZyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChuID49IE1BWF9BUlJBWV9TSVpFIC0gKE1BWF9BUlJBWV9TSVpFID4+PiAxKSAtIDEpCisgICAgICAgICAgICAgICAgICAgICAgICBuID0gTUFYX0FSUkFZX1NJWkU7CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIG4gKz0gKG4gPj4+IDEpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgciA9IEFycmF5cy5jb3B5T2Yociwgbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJbaSsrXSA9IChUKSBlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGEgPT0gciAmJiBpIDwgbikgeworICAgICAgICAgICAgICAgIHJbaV0gPSBudWxsOyAvLyBudWxsLXRlcm1pbmF0ZQorICAgICAgICAgICAgICAgIHJldHVybiByOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIChpID09IG4pID8gciA6IEFycmF5cy5jb3B5T2YociwgaSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNvbGxlY3Rpb24uCisgICAgICAgICAqIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gY29uc2lzdHMgb2YgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbnMKKyAgICAgICAgICogb2YgdGhlIGNvbGxlY3Rpb24ncyBlbGVtZW50cyBpbiB0aGUgb3JkZXIgdGhleSBhcmUgcmV0dXJuZWQgYnkKKyAgICAgICAgICogaXRzIGl0ZXJhdG9yLCBlbmNsb3NlZCBpbiBzcXVhcmUgYnJhY2tldHMgKHtAY29kZSAiW10ifSkuCisgICAgICAgICAqIEFkamFjZW50IGVsZW1lbnRzIGFyZSBzZXBhcmF0ZWQgYnkgdGhlIGNoYXJhY3RlcnMge0Bjb2RlICIsICJ9CisgICAgICAgICAqIChjb21tYSBhbmQgc3BhY2UpLiAgRWxlbWVudHMgYXJlIGNvbnZlcnRlZCB0byBzdHJpbmdzIGFzIGJ5CisgICAgICAgICAqIHtAbGluayBTdHJpbmcjdmFsdWVPZihPYmplY3QpfS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGNvbGxlY3Rpb24KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgnWycpOworICAgICAgICAgICAgZmluYWwgSXRlcmF0b3I8RT4gaXQgPSBpdGVyYXRvcigpOworICAgICAgICAgICAgaWYgKGl0Lmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIGZvciAoOyA7ICkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgZSA9IGl0Lm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGUgPT0gdGhpcyA/ICIodGhpcyBDb2xsZWN0aW9uKSIgOiBlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpdC5oYXNOZXh0KCkpCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCcsJykuYXBwZW5kKCcgJyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHNiLmFwcGVuZCgnXScpLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBjb250YWluc0FsbChmaW5hbCBDb2xsZWN0aW9uPD8+IGMpIHsKKyAgICAgICAgICAgIGlmIChjICE9IHRoaXMpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIE9iamVjdCBlIDogYykgeworICAgICAgICAgICAgICAgICAgICBpZiAoZSA9PSBudWxsIHx8ICFjb250YWlucyhlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHJlbW92ZUFsbChmaW5hbCBDb2xsZWN0aW9uPD8+IGMpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gbW9kaWZpZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoZmluYWwgSXRlcmF0b3I8RT4gaXQgPSBpdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgICAgIGlmIChjLmNvbnRhaW5zKGl0Lm5leHQoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbW9kaWZpZWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiByZXRhaW5BbGwoZmluYWwgQ29sbGVjdGlvbjw/PiBjKSB7CisgICAgICAgICAgICBib29sZWFuIG1vZGlmaWVkID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKGZpbmFsIEl0ZXJhdG9yPEU+IGl0ID0gaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKKyAgICAgICAgICAgICAgICBpZiAoIWMuY29udGFpbnMoaXQubmV4dCgpKSkgeworICAgICAgICAgICAgICAgICAgICBpdC5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtb2RpZmllZDsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogQSB2aWV3IG9mIGEgQ29uY3VycmVudEhhc2hNYXBWOCBhcyBhIHtAbGluayBTZXR9IG9mIGtleXMsIGluCisgICAgICogd2hpY2ggYWRkaXRpb25zIG1heSBvcHRpb25hbGx5IGJlIGVuYWJsZWQgYnkgbWFwcGluZyB0byBhCisgICAgICogY29tbW9uIHZhbHVlLiAgVGhpcyBjbGFzcyBjYW5ub3QgYmUgZGlyZWN0bHkgaW5zdGFudGlhdGVkLgorICAgICAqIFNlZSB7QGxpbmsgI2tleVNldCgpIGtleVNldCgpfSwKKyAgICAgKiB7QGxpbmsgI2tleVNldChPYmplY3QpIGtleVNldChWKX0sCisgICAgICoge0BsaW5rICNuZXdLZXlTZXQoKSBuZXdLZXlTZXQoKX0sCisgICAgICoge0BsaW5rICNuZXdLZXlTZXQoaW50KSBuZXdLZXlTZXQoaW50KX0uCisgICAgICoKKyAgICAgKiBAc2luY2UgMS44CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBLZXlTZXRWaWV3PEssIFY+IGV4dGVuZHMgQ29sbGVjdGlvblZpZXc8SywgViwgSz4KKyAgICAgICAgICAgIGltcGxlbWVudHMgU2V0PEs+LCBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDcyNDkwNjkyNDY3NjMxODIzOTdMOworICAgICAgICBwcml2YXRlIGZpbmFsIFYgdmFsdWU7CisKKyAgICAgICAgS2V5U2V0VmlldyhmaW5hbCBDb25jdXJyZW50SGFzaE1hcFY4PEssIFY+IG1hcCwgZmluYWwgViB2YWx1ZSkgeyAgLy8gbm9uLXB1YmxpYworICAgICAgICAgICAgc3VwZXIobWFwKTsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IG1hcHBlZCB2YWx1ZSBmb3IgYWRkaXRpb25zLAorICAgICAgICAgKiBvciB7QGNvZGUgbnVsbH0gaWYgYWRkaXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IG1hcHBlZCB2YWx1ZSBmb3IgYWRkaXRpb25zLCBvciB7QGNvZGUgbnVsbH0KKyAgICAgICAgICogICAgICAgICBpZiBub3Qgc3VwcG9ydGVkCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgViBnZXRNYXBwZWRWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICAgICAqCisgICAgICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCBrZXkgaXMgbnVsbAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoZmluYWwgT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIHJldHVybiBtYXAuY29udGFpbnNLZXkobyk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVtb3ZlcyB0aGUga2V5IGZyb20gdGhpcyBtYXAgdmlldywgYnkgcmVtb3ZpbmcgdGhlIGtleSAoYW5kIGl0cworICAgICAgICAgKiBjb3JyZXNwb25kaW5nIHZhbHVlKSBmcm9tIHRoZSBiYWNraW5nIG1hcC4gIFRoaXMgbWV0aG9kIGRvZXMKKyAgICAgICAgICogbm90aGluZyBpZiB0aGUga2V5IGlzIG5vdCBpbiB0aGUgbWFwLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbyB0aGUga2V5IHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgYmFja2luZyBtYXAKKyAgICAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGJhY2tpbmcgbWFwIGNvbnRhaW5lZCB0aGUgc3BlY2lmaWVkIGtleQorICAgICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQga2V5IGlzIG51bGwKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShmaW5hbCBPYmplY3QgbykgeworICAgICAgICAgICAgcmV0dXJuIG1hcC5yZW1vdmUobykgIT0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGtleXMgb2YgdGhlIGJhY2tpbmcgbWFwCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgSXRlcmF0b3I8Sz4gaXRlcmF0b3IoKSB7CisgICAgICAgICAgICBmaW5hbCBOb2RlPEssIFY+W10gdDsKKyAgICAgICAgICAgIGZpbmFsIENvbmN1cnJlbnRIYXNoTWFwVjg8SywgVj4gbSA9IG1hcDsKKyAgICAgICAgICAgIGZpbmFsIGludCBmID0gKHQgPSBtLnRhYmxlKSA9PSBudWxsID8gMCA6IHQubGVuZ3RoOworICAgICAgICAgICAgcmV0dXJuIG5ldyBLZXlJdGVyYXRvcjxLLCBWPih0LCBmLCAwLCBmLCBtKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGRzIHRoZSBzcGVjaWZpZWQga2V5IHRvIHRoaXMgc2V0IHZpZXcgYnkgbWFwcGluZyB0aGUga2V5IHRvCisgICAgICAgICAqIHRoZSBkZWZhdWx0IG1hcHBlZCB2YWx1ZSBpbiB0aGUgYmFja2luZyBtYXAsIGlmIGRlZmluZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBlIGtleSB0byBiZSBhZGRlZAorICAgICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIHNldCBjaGFuZ2VkIGFzIGEgcmVzdWx0IG9mIHRoZSBjYWxsCisgICAgICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gICAgICAgICAgaWYgdGhlIHNwZWNpZmllZCBrZXkgaXMgbnVsbAorICAgICAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIG5vIGRlZmF1bHQgbWFwcGVkIHZhbHVlCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGFkZGl0aW9ucyB3YXMgcHJvdmlkZWQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGFkZChmaW5hbCBLIGUpIHsKKyAgICAgICAgICAgIGZpbmFsIFYgdjsKKyAgICAgICAgICAgIGlmICgodiA9IHZhbHVlKSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgcmV0dXJuIG1hcC5wdXRWYWwoZSwgdiwgdHJ1ZSkgPT0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGRzIGFsbCBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIHRvIHRoaXMgc2V0LAorICAgICAgICAgKiBhcyBpZiBieSBjYWxsaW5nIHtAbGluayAjYWRkfSBvbiBlYWNoIG9uZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGMgdGhlIGVsZW1lbnRzIHRvIGJlIGluc2VydGVkIGludG8gdGhpcyBzZXQKKyAgICAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBzZXQgY2hhbmdlZCBhcyBhIHJlc3VsdCBvZiB0aGUgY2FsbAorICAgICAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uICAgICAgICAgIGlmIHRoZSBjb2xsZWN0aW9uIG9yIGFueSBvZiBpdHMKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50cyBhcmUge0Bjb2RlIG51bGx9CisgICAgICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgbm8gZGVmYXVsdCBtYXBwZWQgdmFsdWUKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYWRkaXRpb25zIHdhcyBwcm92aWRlZAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKGZpbmFsIENvbGxlY3Rpb248PyBleHRlbmRzIEs+IGMpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gYWRkZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGZpbmFsIFYgdjsKKyAgICAgICAgICAgIGlmICgodiA9IHZhbHVlKSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgZm9yIChmaW5hbCBLIGUgOiBjKSB7CisgICAgICAgICAgICAgICAgaWYgKG1hcC5wdXRWYWwoZSwgdiwgdHJ1ZSkgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgYWRkZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGFkZGVkOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIGludCBoID0gMDsKKyAgICAgICAgICAgIGZvciAoZmluYWwgSyBlIDogdGhpcykKKyAgICAgICAgICAgICAgICBoICs9IGUuaGFzaENvZGUoKTsKKyAgICAgICAgICAgIHJldHVybiBoOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvKSB7CisgICAgICAgICAgICBmaW5hbCBTZXQ8Pz4gYzsKKyAgICAgICAgICAgIHJldHVybiAoKG8gaW5zdGFuY2VvZiBTZXQpICYmCisgICAgICAgICAgICAgICAgICAgICgoYyA9IChTZXQ8Pz4pIG8pID09IHRoaXMgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29udGFpbnNBbGwoYykgJiYgYy5jb250YWluc0FsbCh0aGlzKSkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgdmlldyBvZiBhIENvbmN1cnJlbnRIYXNoTWFwVjggYXMgYSB7QGxpbmsgQ29sbGVjdGlvbn0gb2YKKyAgICAgKiB2YWx1ZXMsIGluIHdoaWNoIGFkZGl0aW9ucyBhcmUgZGlzYWJsZWQuIFRoaXMgY2xhc3MgY2Fubm90IGJlCisgICAgICogZGlyZWN0bHkgaW5zdGFudGlhdGVkLiBTZWUge0BsaW5rICN2YWx1ZXMoKX0uCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIFZhbHVlc1ZpZXc8SywgVj4gZXh0ZW5kcyBDb2xsZWN0aW9uVmlldzxLLCBWLCBWPgorICAgICAgICAgICAgaW1wbGVtZW50cyBDb2xsZWN0aW9uPFY+LCBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDIyNDkwNjkyNDY3NjMxODIzOTdMOworCisgICAgICAgIFZhbHVlc1ZpZXcoZmluYWwgQ29uY3VycmVudEhhc2hNYXBWODxLLCBWPiBtYXApIHsKKyAgICAgICAgICAgIHN1cGVyKG1hcCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBjb250YWlucyhmaW5hbCBPYmplY3QgbykgeworICAgICAgICAgICAgcmV0dXJuIG1hcC5jb250YWluc1ZhbHVlKG8pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gcmVtb3ZlKGZpbmFsIE9iamVjdCBvKSB7CisgICAgICAgICAgICBpZiAobyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChmaW5hbCBJdGVyYXRvcjxWPiBpdCA9IGl0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChvLmVxdWFscyhpdC5uZXh0KCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpdC5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZpbmFsIEl0ZXJhdG9yPFY+IGl0ZXJhdG9yKCkgeworICAgICAgICAgICAgZmluYWwgQ29uY3VycmVudEhhc2hNYXBWODxLLCBWPiBtID0gbWFwOworICAgICAgICAgICAgZmluYWwgTm9kZTxLLCBWPltdIHQ7CisgICAgICAgICAgICBmaW5hbCBpbnQgZiA9ICh0ID0gbS50YWJsZSkgPT0gbnVsbCA/IDAgOiB0Lmxlbmd0aDsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVmFsdWVJdGVyYXRvcjxLLCBWPih0LCBmLCAwLCBmLCBtKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGFkZChmaW5hbCBWIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gYWRkQWxsKGZpbmFsIENvbGxlY3Rpb248PyBleHRlbmRzIFY+IGMpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSB2aWV3IG9mIGEgQ29uY3VycmVudEhhc2hNYXBWOCBhcyBhIHtAbGluayBTZXR9IG9mIChrZXksIHZhbHVlKQorICAgICAqIGVudHJpZXMuICBUaGlzIGNsYXNzIGNhbm5vdCBiZSBkaXJlY3RseSBpbnN0YW50aWF0ZWQuIFNlZQorICAgICAqIHtAbGluayAjZW50cnlTZXQoKX0uCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIEVudHJ5U2V0VmlldzxLLCBWPiBleHRlbmRzIENvbGxlY3Rpb25WaWV3PEssIFYsIE1hcC5FbnRyeTxLLCBWPj4KKyAgICAgICAgICAgIGltcGxlbWVudHMgU2V0PE1hcC5FbnRyeTxLLCBWPj4sIGphdmEuaW8uU2VyaWFsaXphYmxlIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMjI0OTA2OTI0Njc2MzE4MjM5N0w7CisKKyAgICAgICAgRW50cnlTZXRWaWV3KGZpbmFsIENvbmN1cnJlbnRIYXNoTWFwVjg8SywgVj4gbWFwKSB7CisgICAgICAgICAgICBzdXBlcihtYXApOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoZmluYWwgT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIGZpbmFsIE9iamVjdCBrOworICAgICAgICAgICAgZmluYWwgT2JqZWN0IHY7CisgICAgICAgICAgICBmaW5hbCBPYmplY3QgcjsKKyAgICAgICAgICAgIGZpbmFsIE1hcC5FbnRyeTw/LCA/PiBlOworICAgICAgICAgICAgcmV0dXJuICgobyBpbnN0YW5jZW9mIE1hcC5FbnRyeSkgJiYKKyAgICAgICAgICAgICAgICAgICAgKGsgPSAoZSA9IChNYXAuRW50cnk8PywgPz4pIG8pLmdldEtleSgpKSAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgICAgIChyID0gbWFwLmdldChrKSkgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAodiA9IGUuZ2V0VmFsdWUoKSkgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAodiA9PSByIHx8IHYuZXF1YWxzKHIpKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoZmluYWwgT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIGZpbmFsIE9iamVjdCBrOworICAgICAgICAgICAgZmluYWwgT2JqZWN0IHY7CisgICAgICAgICAgICBmaW5hbCBNYXAuRW50cnk8PywgPz4gZTsKKyAgICAgICAgICAgIHJldHVybiAoKG8gaW5zdGFuY2VvZiBNYXAuRW50cnkpICYmCisgICAgICAgICAgICAgICAgICAgIChrID0gKGUgPSAoTWFwLkVudHJ5PD8sID8+KSBvKS5nZXRLZXkoKSkgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAodiA9IGUuZ2V0VmFsdWUoKSkgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICBtYXAucmVtb3ZlKGssIHYpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGVudHJpZXMgb2YgdGhlIGJhY2tpbmcgbWFwCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgSXRlcmF0b3I8TWFwLkVudHJ5PEssIFY+PiBpdGVyYXRvcigpIHsKKyAgICAgICAgICAgIGZpbmFsIENvbmN1cnJlbnRIYXNoTWFwVjg8SywgVj4gbSA9IG1hcDsKKyAgICAgICAgICAgIGZpbmFsIE5vZGU8SywgVj5bXSB0OworICAgICAgICAgICAgZmluYWwgaW50IGYgPSAodCA9IG0udGFibGUpID09IG51bGwgPyAwIDogdC5sZW5ndGg7CisgICAgICAgICAgICByZXR1cm4gbmV3IEVudHJ5SXRlcmF0b3I8SywgVj4odCwgZiwgMCwgZiwgbSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBhZGQoZmluYWwgRW50cnk8SywgVj4gZSkgeworICAgICAgICAgICAgcmV0dXJuIG1hcC5wdXRWYWwoZS5nZXRLZXkoKSwgZS5nZXRWYWx1ZSgpLCBmYWxzZSkgPT0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChmaW5hbCBDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFbnRyeTxLLCBWPj4gYykgeworICAgICAgICAgICAgYm9vbGVhbiBhZGRlZCA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChmaW5hbCBFbnRyeTxLLCBWPiBlIDogYykgeworICAgICAgICAgICAgICAgIGlmIChhZGQoZSkpCisgICAgICAgICAgICAgICAgICAgIGFkZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBhZGRlZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICBpbnQgaCA9IDA7CisgICAgICAgICAgICBmaW5hbCBOb2RlPEssIFY+W10gdDsKKyAgICAgICAgICAgIGlmICgodCA9IG1hcC50YWJsZSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFRyYXZlcnNlcjxLLCBWPiBpdCA9IG5ldyBUcmF2ZXJzZXI8SywgVj4odCwgdC5sZW5ndGgsIDAsIHQubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBmb3IgKE5vZGU8SywgVj4gcDsgKHAgPSBpdC5hZHZhbmNlKCkpICE9IG51bGw7ICkgeworICAgICAgICAgICAgICAgICAgICBoICs9IHAuaGFzaENvZGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gaDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3QgbykgeworICAgICAgICAgICAgZmluYWwgU2V0PD8+IGM7CisgICAgICAgICAgICByZXR1cm4gKChvIGluc3RhbmNlb2YgU2V0KSAmJgorICAgICAgICAgICAgICAgICAgICAoKGMgPSAoU2V0PD8+KSBvKSA9PSB0aGlzIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnRhaW5zQWxsKGMpICYmIGMuY29udGFpbnNBbGwodGhpcykpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tIENvdW50ZXJzIC0tLS0tLS0tLS0tLS0tICovCisKKyAgICAvLyBBZGFwdGVkIGZyb20gTG9uZ0FkZGVyIGFuZCBTdHJpcGVkNjQuCisgICAgLy8gU2VlIHRoZWlyIGludGVybmFsIGRvY3MgZm9yIGV4cGxhbmF0aW9uLgorCisgICAgLy8gQSBwYWRkZWQgY2VsbCBmb3IgZGlzdHJpYnV0aW5nIGNvdW50cworICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBDb3VudGVyQ2VsbCB7CisgICAgICAgIHZvbGF0aWxlIGxvbmcgcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDY7CisgICAgICAgIHZvbGF0aWxlIGxvbmcgdmFsdWU7CisgICAgICAgIHZvbGF0aWxlIGxvbmcgcTAsIHExLCBxMiwgcTMsIHE0LCBxNSwgcTY7CisKKyAgICAgICAgQ291bnRlckNlbGwoZmluYWwgbG9uZyB4KSB7CisgICAgICAgICAgICB2YWx1ZSA9IHg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIb2xkZXIgZm9yIHRoZSB0aHJlYWQtbG9jYWwgaGFzaCBjb2RlIGRldGVybWluaW5nIHdoaWNoCisgICAgICogQ291bnRlckNlbGwgdG8gdXNlLiBUaGUgY29kZSBpcyBpbml0aWFsaXplZCB2aWEgdGhlCisgICAgICogY291bnRlckhhc2hDb2RlR2VuZXJhdG9yLCBidXQgbWF5IGJlIG1vdmVkIHVwb24gY29sbGlzaW9ucy4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgY2xhc3MgQ291bnRlckhhc2hDb2RlIHsKKyAgICAgICAgaW50IGNvZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIGluaXRpYWwgdmFsdWUgZm9yIHBlci10aHJlYWQgQ291bnRlckhhc2hDb2Rlcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgQXRvbWljSW50ZWdlciBjb3VudGVySGFzaENvZGVHZW5lcmF0b3IgPSBuZXcgQXRvbWljSW50ZWdlcigpOworCisgICAgLyoqCisgICAgICogSW5jcmVtZW50IGZvciBjb3VudGVySGFzaENvZGVHZW5lcmF0b3IuIFNlZSBjbGFzcyBUaHJlYWRMb2NhbAorICAgICAqIGZvciBleHBsYW5hdGlvbi4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IFNFRURfSU5DUkVNRU5UID0gMHg2MWM4ODY0NzsKKworICAgIC8qKgorICAgICAqIFBlci10aHJlYWQgY291bnRlciBoYXNoIGNvZGVzLiBTaGFyZWQgYWNyb3NzIGFsbCBpbnN0YW5jZXMuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIFRocmVhZExvY2FsPENvdW50ZXJIYXNoQ29kZT4gdGhyZWFkQ291bnRlckhhc2hDb2RlID0KKyAgICAgICAgICAgIG5ldyBUaHJlYWRMb2NhbDxDb3VudGVySGFzaENvZGU+KCk7CisKKworICAgIGZpbmFsIGxvbmcgc3VtQ291bnQoKSB7CisgICAgICAgIGZpbmFsIENvdW50ZXJDZWxsW10gYXMgPSBjb3VudGVyQ2VsbHM7CisgICAgICAgIENvdW50ZXJDZWxsIGE7CisgICAgICAgIGxvbmcgc3VtID0gYmFzZUNvdW50OworICAgICAgICBpZiAoYXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgIGlmICgoYSA9IGFzW2ldKSAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICBzdW0gKz0gYS52YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VtOworICAgIH0KKworICAgIC8vIFNlZSBMb25nQWRkZXIgdmVyc2lvbiBmb3IgZXhwbGFuYXRpb24KKyAgICBwcml2YXRlIGZpbmFsIHZvaWQgZnVsbEFkZENvdW50KGZpbmFsIGxvbmcgeCwgQ291bnRlckhhc2hDb2RlIGhjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB3YXNVbmNvbnRlbmRlZCkgeworICAgICAgICBpbnQgaDsKKyAgICAgICAgaWYgKGhjID09IG51bGwpIHsKKyAgICAgICAgICAgIGhjID0gbmV3IENvdW50ZXJIYXNoQ29kZSgpOworICAgICAgICAgICAgZmluYWwgaW50IHMgPSBjb3VudGVySGFzaENvZGVHZW5lcmF0b3IuYWRkQW5kR2V0KFNFRURfSU5DUkVNRU5UKTsKKyAgICAgICAgICAgIGggPSBoYy5jb2RlID0gKHMgPT0gMCkgPyAxIDogczsgLy8gQXZvaWQgemVybworICAgICAgICAgICAgdGhyZWFkQ291bnRlckhhc2hDb2RlLnNldChoYyk7CisgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgaCA9IGhjLmNvZGU7CisgICAgICAgIGJvb2xlYW4gY29sbGlkZSA9IGZhbHNlOyAgICAgICAgICAgICAgICAvLyBUcnVlIGlmIGxhc3Qgc2xvdCBub25lbXB0eQorICAgICAgICBmb3IgKDsgOyApIHsKKyAgICAgICAgICAgIGZpbmFsIENvdW50ZXJDZWxsW10gYXM7CisgICAgICAgICAgICBmaW5hbCBDb3VudGVyQ2VsbCBhOworICAgICAgICAgICAgZmluYWwgaW50IG47CisgICAgICAgICAgICBmaW5hbCBsb25nIHY7CisgICAgICAgICAgICBpZiAoKGFzID0gY291bnRlckNlbGxzKSAhPSBudWxsICYmIChuID0gYXMubGVuZ3RoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoKGEgPSBhc1sobiAtIDEpICYgaF0pID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNlbGxzQnVzeSA9PSAwKSB7ICAgICAgICAgICAgLy8gVHJ5IHRvIGF0dGFjaCBuZXcgQ2VsbAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ291bnRlckNlbGwgciA9IG5ldyBDb3VudGVyQ2VsbCh4KTsgLy8gT3B0aW1pc3RpYyBjcmVhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjZWxsc0J1c3kgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVLmNvbXBhcmVBbmRTd2FwSW50KHRoaXMsIENFTExTQlVTWSwgMCwgMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGNyZWF0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeyAgICAgICAgICAgICAgIC8vIFJlY2hlY2sgdW5kZXIgbG9jaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb3VudGVyQ2VsbFtdIHJzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGo7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocnMgPSBjb3VudGVyQ2VsbHMpICE9IG51bGwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobSA9IHJzLmxlbmd0aCkgPiAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnNbaiA9IChtIC0gMSkgJiBoXSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByc1tqXSA9IHI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxzQnVzeSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjcmVhdGVkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgIC8vIFNsb3QgaXMgbm93IG5vbi1lbXB0eQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvbGxpZGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF3YXNVbmNvbnRlbmRlZCkgICAgICAgLy8gQ0FTIGFscmVhZHkga25vd24gdG8gZmFpbAorICAgICAgICAgICAgICAgICAgICB3YXNVbmNvbnRlbmRlZCA9IHRydWU7ICAgICAgLy8gQ29udGludWUgYWZ0ZXIgcmVoYXNoCisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVS5jb21wYXJlQW5kU3dhcExvbmcoYSwgQ0VMTFZBTFVFLCB2ID0gYS52YWx1ZSwgdiArIHgpKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChjb3VudGVyQ2VsbHMgIT0gYXMgfHwgbiA+PSBOQ1BVKQorICAgICAgICAgICAgICAgICAgICBjb2xsaWRlID0gZmFsc2U7ICAgICAgICAgICAgLy8gQXQgbWF4IHNpemUgb3Igc3RhbGUKKyAgICAgICAgICAgICAgICBlbHNlIGlmICghY29sbGlkZSkKKyAgICAgICAgICAgICAgICAgICAgY29sbGlkZSA9IHRydWU7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoY2VsbHNCdXN5ID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIFUuY29tcGFyZUFuZFN3YXBJbnQodGhpcywgQ0VMTFNCVVNZLCAwLCAxKSkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50ZXJDZWxscyA9PSBhcykgey8vIEV4cGFuZCB0YWJsZSB1bmxlc3Mgc3RhbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb3VudGVyQ2VsbFtdIHJzID0gbmV3IENvdW50ZXJDZWxsW24gPDwgMV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShhcywgMCwgcnMsIDAsIG4pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50ZXJDZWxscyA9IHJzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2VsbHNCdXN5ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb2xsaWRlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAvLyBSZXRyeSB3aXRoIGV4cGFuZGVkIHRhYmxlCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGggXj0gaCA8PCAxMzsgICAgICAgICAgICAgICAgICAgLy8gUmVoYXNoCisgICAgICAgICAgICAgICAgaCBePSBoID4+PiAxNzsKKyAgICAgICAgICAgICAgICBoIF49IGggPDwgNTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY2VsbHNCdXN5ID09IDAgJiYgY291bnRlckNlbGxzID09IGFzICYmCisgICAgICAgICAgICAgICAgICAgIFUuY29tcGFyZUFuZFN3YXBJbnQodGhpcywgQ0VMTFNCVVNZLCAwLCAxKSkgeworICAgICAgICAgICAgICAgIGJvb2xlYW4gaW5pdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHRyeSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0YWJsZQorICAgICAgICAgICAgICAgICAgICBpZiAoY291bnRlckNlbGxzID09IGFzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb3VudGVyQ2VsbFtdIHJzID0gbmV3IENvdW50ZXJDZWxsWzJdOworICAgICAgICAgICAgICAgICAgICAgICAgcnNbaCAmIDFdID0gbmV3IENvdW50ZXJDZWxsKHgpOworICAgICAgICAgICAgICAgICAgICAgICAgY291bnRlckNlbGxzID0gcnM7CisgICAgICAgICAgICAgICAgICAgICAgICBpbml0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGNlbGxzQnVzeSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpbml0KQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoVS5jb21wYXJlQW5kU3dhcExvbmcodGhpcywgQkFTRUNPVU5ULCB2ID0gYmFzZUNvdW50LCB2ICsgeCkpCisgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGYWxsIGJhY2sgb24gdXNpbmcgYmFzZQorICAgICAgICB9CisgICAgICAgIGhjLmNvZGUgPSBoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWNvcmQgaW5kZXggZm9yIG5leHQgdGltZQorICAgIH0KKworICAgIC8vIFVuc2FmZSBtZWNoYW5pY3MKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBzdW4ubWlzYy5VbnNhZmUgVTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFNJWkVDVEw7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBUUkFOU0ZFUklOREVYOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVFJBTlNGRVJPUklHSU47CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBCQVNFQ09VTlQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBDRUxMU0JVU1k7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBDRUxMVkFMVUU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBBQkFTRTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVNISUZUOworCisgICAgc3RhdGljIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFUgPSBnZXRVbnNhZmUoKTsKKyAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IGsgPSBDb25jdXJyZW50SGFzaE1hcFY4LmNsYXNzOworICAgICAgICAgICAgU0laRUNUTCA9IFUub2JqZWN0RmllbGRPZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgKGsuZ2V0RGVjbGFyZWRGaWVsZCgic2l6ZUN0bCIpKTsKKyAgICAgICAgICAgIFRSQU5TRkVSSU5ERVggPSBVLm9iamVjdEZpZWxkT2Zmc2V0CisgICAgICAgICAgICAgICAgICAgIChrLmdldERlY2xhcmVkRmllbGQoInRyYW5zZmVySW5kZXgiKSk7CisgICAgICAgICAgICBUUkFOU0ZFUk9SSUdJTiA9IFUub2JqZWN0RmllbGRPZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgKGsuZ2V0RGVjbGFyZWRGaWVsZCgidHJhbnNmZXJPcmlnaW4iKSk7CisgICAgICAgICAgICBCQVNFQ09VTlQgPSBVLm9iamVjdEZpZWxkT2Zmc2V0CisgICAgICAgICAgICAgICAgICAgIChrLmdldERlY2xhcmVkRmllbGQoImJhc2VDb3VudCIpKTsKKyAgICAgICAgICAgIENFTExTQlVTWSA9IFUub2JqZWN0RmllbGRPZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgKGsuZ2V0RGVjbGFyZWRGaWVsZCgiY2VsbHNCdXN5IikpOworICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gY2sgPSBDb3VudGVyQ2VsbC5jbGFzczsKKyAgICAgICAgICAgIENFTExWQUxVRSA9IFUub2JqZWN0RmllbGRPZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgKGNrLmdldERlY2xhcmVkRmllbGQoInZhbHVlIikpOworICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gYWsgPSBOb2RlW10uY2xhc3M7CisgICAgICAgICAgICBBQkFTRSA9IFUuYXJyYXlCYXNlT2Zmc2V0KGFrKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBzY2FsZSA9IFUuYXJyYXlJbmRleFNjYWxlKGFrKTsKKyAgICAgICAgICAgIGlmICgoc2NhbGUgJiAoc2NhbGUgLSAxKSkgIT0gMCkKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImRhdGEgdHlwZSBzY2FsZSBub3QgYSBwb3dlciBvZiB0d28iKTsKKyAgICAgICAgICAgIEFTSElGVCA9IDMxIC0gSW50ZWdlci5udW1iZXJPZkxlYWRpbmdaZXJvcyhzY2FsZSk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc3VuLm1pc2MuVW5zYWZlLiAgU3VpdGFibGUgZm9yIHVzZSBpbiBhIDNyZCBwYXJ0eSBwYWNrYWdlLgorICAgICAqIFJlcGxhY2Ugd2l0aCBhIHNpbXBsZSBjYWxsIHRvIFVuc2FmZS5nZXRVbnNhZmUgd2hlbiBpbnRlZ3JhdGluZworICAgICAqIGludG8gYSBqZGsuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgc3VuLm1pc2MuVW5zYWZlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgc3VuLm1pc2MuVW5zYWZlIGdldFVuc2FmZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBzdW4ubWlzYy5VbnNhZmUuZ2V0VW5zYWZlKCk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFNlY3VyaXR5RXhjZXB0aW9uIHRyeVJlZmxlY3Rpb25JbnN0ZWFkKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkCisgICAgICAgICAgICAgICAgICAgIChuZXcgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uPHN1bi5taXNjLlVuc2FmZT4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgc3VuLm1pc2MuVW5zYWZlIHJ1bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPHN1bi5taXNjLlVuc2FmZT4gayA9IHN1bi5taXNjLlVuc2FmZS5jbGFzczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkIGYgOiBrLmdldERlY2xhcmVkRmllbGRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5zZXRBY2Nlc3NpYmxlKHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgeCA9IGYuZ2V0KG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoay5pc0luc3RhbmNlKHgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGsuY2FzdCh4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEZpZWxkRXJyb3IoInRoZSBVbnNhZmUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IGluaXRpYWxpemUgaW50cmluc2ljcyIsCisgICAgICAgICAgICAgICAgICAgIGUuZ2V0Q2F1c2UoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvY29sbGVjdGlvbi9EYXRhU3RydWN0dXJlcy5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL2NvbGxlY3Rpb24vRGF0YVN0cnVjdHVyZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjRmMzU3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL2NvbGxlY3Rpb24vRGF0YVN0cnVjdHVyZXMuamF2YQpAQCAtMCwwICsxLDIxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb247CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkJsb2NraW5nUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5MaW5rZWRCbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuSmRrVmVyc2lvbjsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzLCB3aGljaCB0cmllcyB0byBwaWNrdXAgdGhlIGJlc3QgY29sbGVjdGlvbiBpbXBsZW1lbnRhdGlvbiBkZXBlbmRpbmcKKyAqIG9uIHJ1bm5pbmcgZW52aXJvbm1lbnQuCisgKgorICogQGF1dGhvciBHdXN0YXYgVHJlZGUKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKiBAc2luY2UgMi4zCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBEYXRhU3RydWN0dXJlcyB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PiBMVFFfQ0xBU1M7CisKKyAgICBzdGF0aWMgeworICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gbnVsbDsKKworICAgICAgICBDbGFzczw/PiBjOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgSmRrVmVyc2lvbiBqZGtWZXJzaW9uID0gSmRrVmVyc2lvbi5nZXRKZGtWZXJzaW9uKCk7CisgICAgICAgICAgICBmaW5hbCBKZGtWZXJzaW9uIG1pbmltdW1WZXJzaW9uID0gSmRrVmVyc2lvbi5wYXJzZVZlcnNpb24oIjEuNy4wIik7CisKKyAgICAgICAgICAgIGNsYXNzTmFtZSA9IChtaW5pbXVtVmVyc2lvbi5jb21wYXJlVG8oamRrVmVyc2lvbikgPD0gMCkKKyAgICAgICAgICAgICAgICAgICAgPyAiamF2YS51dGlsLmNvbmN1cnJlbnQuTGlua2VkVHJhbnNmZXJRdWV1ZSIKKyAgICAgICAgICAgICAgICAgICAgOiAib3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLkxpbmtlZFRyYW5zZmVyUXVldWUiOworCisgICAgICAgICAgICBjID0gZ2V0QW5kVmVyaWZ5KGNsYXNzTmFtZSk7CisgICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKERhdGFTdHJ1Y3R1cmVzLmNsYXNzLmdldE5hbWUoKSkubG9nKExldmVsLkZJTkUsICJVU0lORyBMVFEgY2xhc3M6ezB9IiwgYyk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKERhdGFTdHJ1Y3R1cmVzLmNsYXNzLmdldE5hbWUoKSkubG9nKExldmVsLkZJTkUsCisgICAgICAgICAgICAgICAgICAgICJmYWlsZWQgbG9hZGluZyBkYXRhIHN0cnVjdHVyZSBjbGFzczoiICsgY2xhc3NOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGZhbGxiYWNrIHRvIGVtYmVkZGVkIG9uZSIsIHQpOworCisgICAgICAgICAgICBjID0gTGlua2VkQmxvY2tpbmdRdWV1ZS5jbGFzczsgLy8gZmFsbGJhY2sgdG8gTGlua2VkQmxvY2tpbmdRdWV1ZQorICAgICAgICB9CisKKyAgICAgICAgTFRRX0NMQVNTID0gYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNvbmN1cnJlbmN5IGxldmVsIGNhbGN1bGF0ZWQgYmFzZWQgb24gdGhlIG51bWJlciBvZiBhdmFpbGFibGUgQ1BVcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0NPTkNVUkVOQ1lfTEVWRUwgPSBjZWlsaW5nTmV4dFBvd2VyT2ZUd28oUnVudGltZS5nZXRSdW50aW1lKCkuYXZhaWxhYmxlUHJvY2Vzc29ycygpKTsKKworICAgIHByaXZhdGUgc3RhdGljIGludCBjZWlsaW5nTmV4dFBvd2VyT2ZUd28oZmluYWwgaW50IHgpIHsKKyAgICAgICAgLy8gSGFja2VyJ3MgRGVsaWdodCwgQ2hhcHRlciAzLCBIYXJyeSBTLiBXYXJyZW4gSnIuCisgICAgICAgIHJldHVybiAxIDw8IChJbnRlZ2VyLlNJWkUgLSBJbnRlZ2VyLm51bWJlck9mTGVhZGluZ1plcm9zKHggLSAxKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3M8Pz4gZ2V0QW5kVmVyaWZ5KGZpbmFsIFN0cmluZyBjbikgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb248Q2xhc3M8Pz4+KCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBDbGFzczw/PiBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERhdGFTdHJ1Y3R1cmVzLmNsYXNzLmdldENsYXNzTG9hZGVyKCkubG9hZENsYXNzKGNuKS5uZXdJbnN0YW5jZSgpLmdldENsYXNzKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IGV4LmdldENhdXNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYSB7QGxpbmsgQmxvY2tpbmdRdWV1ZX0gdGhhdCBpcyBiYXNlZCBvbgorICAgICAqIHtAY29kZSBMaW5rZWRUcmFuc2ZlclF1ZXVlfSBpbXBsZW1lbnRhdGlvbiBmcm9tIEpESyA3LgorICAgICAqIDxwPgorICAgICAqIFdoZW4gcnVubmluZyBvbiBKREsgNyBvciBoaWdoZXIsIEpESyB7QGNvZGUgTGlua2VkVHJhbnNmZXJRdWV1ZX0gaW1wbGVtZW50YXRpb24gaXMgdXNlZCwKKyAgICAgKiBvbiBKREsgNiBhbiBpbnRlcm5hbCBKZXJzZXkgaW1wbGVtZW50YXRpb24gY2xhc3MgaXMgdXNlZC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gPEU+IHRoZSB0eXBlIG9mIGVsZW1lbnRzIGhlbGQgaW4gdGhlIHF1ZXVlLgorICAgICAqIEByZXR1cm4gbmV3IGluc3RhbmNlIG9mIGEge0BsaW5rIEJsb2NraW5nUXVldWV9IHRoYXQgaXMgYmFzZWQgb24ge0Bjb2RlIExpbmtlZFRyYW5zZmVyUXVldWV9CisgICAgICogICAgICAgICBpbXBsZW1lbnRhdGlvbiBmcm9tIEpESyA3LgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBzdGF0aWMgPEU+IEJsb2NraW5nUXVldWU8RT4gY3JlYXRlTGlua2VkVHJhbnNmZXJRdWV1ZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjxCbG9ja2luZ1F1ZXVlPEU+PigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgQmxvY2tpbmdRdWV1ZTxFPiBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChCbG9ja2luZ1F1ZXVlPEU+KSBMVFFfQ0xBU1MubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgZmluYWwgVGhyb3dhYmxlIGNhdXNlID0gZXguZ2V0Q2F1c2UoKTsKKyAgICAgICAgICAgIGlmIChjYXVzZSBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbikgY2F1c2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGNhdXNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcsIGVtcHR5IG1hcCB3aXRoIGEgZGVmYXVsdCBpbml0aWFsIGNhcGFjaXR5ICgxNiksCisgICAgICogbG9hZCBmYWN0b3IgKDAuNzUpIGFuZCBjb25jdXJyZW5jeUxldmVsICgxNikuCisgICAgICogPHA+CisgICAgICogT24gT3JhY2xlIEpESywgdGhlIGZhY3RvcnkgbWV0aG9kIHdpbGwgcmV0dXJuIGFuIGluc3RhbmNlIG9mCisgICAgICogPGEgaHJlZj0iaHR0cDovL2dlZS5jcy5vc3dlZ28uZWR1L2RsL2pzcjE2Ni9kaXN0L2pzcjE2NmVkb2NzL2pzcjE2NmUvQ29uY3VycmVudEhhc2hNYXBWOC5odG1sIj4KKyAgICAgKiB7QGNvZGUgQ29uY3VycmVudEhhc2hNYXBWOH08L2E+CisgICAgICogdGhhdCBpcyBzdXBwb3NlZCB0byBiZSBhdmFpbGFibGUgaW4gSkRLIDggYW5kIHByb3ZpZGVzIGJldHRlciBwZXJmb3JtYW5jZSBhbmQgbWVtb3J5IGNoYXJhY3RlcmlzdGljcyB0aGFuCisgICAgICoge0BsaW5rIENvbmN1cnJlbnRIYXNoTWFwfSBpbXBsZW1lbnRhdGlvbiBmcm9tIEpESyA3IG9yIGVhcmxpZXIuIE9uIG5vbi1PcmFjbGUgSkRLLAorICAgICAqIHRoZSBmYWN0b3J5IGluc3RhbnRpYXRlcyB0aGUgc3RhbmRhcmQge0Bjb2RlIENvbmN1cnJlbnRIYXNoTWFwfSBmcm9tIEpESy4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBtYXAuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8SywgVj4gQ29uY3VycmVudE1hcDxLLCBWPiBjcmVhdGVDb25jdXJyZW50TWFwKCkgeworICAgICAgICByZXR1cm4gSmRrVmVyc2lvbi5nZXRKZGtWZXJzaW9uKCkuaXNVbnNhZmVTdXBwb3J0ZWQoKQorICAgICAgICAgICAgICAgID8gbmV3IENvbmN1cnJlbnRIYXNoTWFwVjg8SywgVj4oKQorICAgICAgICAgICAgICAgIDogbmV3IENvbmN1cnJlbnRIYXNoTWFwPEssIFY+KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBtYXAgd2l0aCB0aGUgc2FtZSBtYXBwaW5ncyBhcyB0aGUgZ2l2ZW4gbWFwLgorICAgICAqIDxwPgorICAgICAqIE9uIE9yYWNsZSBKREssIHRoZSBmYWN0b3J5IG1ldGhvZCB3aWxsIHJldHVybiBhbiBpbnN0YW5jZSBvZgorICAgICAqIDxhIGhyZWY9Imh0dHA6Ly9nZWUuY3Mub3N3ZWdvLmVkdS9kbC9qc3IxNjYvZGlzdC9qc3IxNjZlZG9jcy9qc3IxNjZlL0NvbmN1cnJlbnRIYXNoTWFwVjguaHRtbCI+CisgICAgICoge0Bjb2RlIENvbmN1cnJlbnRIYXNoTWFwVjh9PC9hPgorICAgICAqIHRoYXQgaXMgc3VwcG9zZWQgdG8gYmUgYXZhaWxhYmxlIGluIEpESyA4IGFuZCBwcm92aWRlcyBiZXR0ZXIgcGVyZm9ybWFuY2UgYW5kIG1lbW9yeSBjaGFyYWN0ZXJpc3RpY3MgdGhhbgorICAgICAqIHtAbGluayBDb25jdXJyZW50SGFzaE1hcH0gaW1wbGVtZW50YXRpb24gZnJvbSBKREsgNyBvciBlYXJsaWVyLiBPbiBub24tT3JhY2xlIEpESywKKyAgICAgKiB0aGUgZmFjdG9yeSBpbnN0YW50aWF0ZXMgdGhlIHN0YW5kYXJkIHtAY29kZSBDb25jdXJyZW50SGFzaE1hcH0gZnJvbSBKREsuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIG1hcCB0aGUgbWFwLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPEssIFY+IENvbmN1cnJlbnRNYXA8SywgVj4gY3JlYXRlQ29uY3VycmVudE1hcCgKKyAgICAgICAgICAgIGZpbmFsIE1hcDw/IGV4dGVuZHMgSywgPyBleHRlbmRzIFY+IG1hcCkgeworICAgICAgICByZXR1cm4gSmRrVmVyc2lvbi5nZXRKZGtWZXJzaW9uKCkuaXNVbnNhZmVTdXBwb3J0ZWQoKQorICAgICAgICAgICAgICAgID8gbmV3IENvbmN1cnJlbnRIYXNoTWFwVjg8SywgVj4obWFwKQorICAgICAgICAgICAgICAgIDogbmV3IENvbmN1cnJlbnRIYXNoTWFwPEssIFY+KG1hcCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldywgZW1wdHkgbWFwIHdpdGggYW4gaW5pdGlhbCB0YWJsZSBzaXplICBhY2NvbW1vZGF0aW5nIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBudW1iZXIgb2YgZWxlbWVudHMgd2l0aG91dCB0aGUgbmVlZCB0byBkeW5hbWljYWxseSByZXNpemUuCisgICAgICogPHA+CisgICAgICogT24gT3JhY2xlIEpESywgdGhlIGZhY3RvcnkgbWV0aG9kIHdpbGwgcmV0dXJuIGFuIGluc3RhbmNlIG9mCisgICAgICogPGEgaHJlZj0iaHR0cDovL2dlZS5jcy5vc3dlZ28uZWR1L2RsL2pzcjE2Ni9kaXN0L2pzcjE2NmVkb2NzL2pzcjE2NmUvQ29uY3VycmVudEhhc2hNYXBWOC5odG1sIj4KKyAgICAgKiB7QGNvZGUgQ29uY3VycmVudEhhc2hNYXBWOH08L2E+CisgICAgICogdGhhdCBpcyBzdXBwb3NlZCB0byBiZSBhdmFpbGFibGUgaW4gSkRLIDggYW5kIHByb3ZpZGVzIGJldHRlciBwZXJmb3JtYW5jZSBhbmQgbWVtb3J5IGNoYXJhY3RlcmlzdGljcyB0aGFuCisgICAgICoge0BsaW5rIENvbmN1cnJlbnRIYXNoTWFwfSBpbXBsZW1lbnRhdGlvbiBmcm9tIEpESyA3IG9yIGVhcmxpZXIuIE9uIG5vbi1PcmFjbGUgSkRLLAorICAgICAqIHRoZSBmYWN0b3J5IGluc3RhbnRpYXRlcyB0aGUgc3RhbmRhcmQge0Bjb2RlIENvbmN1cnJlbnRIYXNoTWFwfSBmcm9tIEpESy4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5pdGlhbENhcGFjaXR5IFRoZSBpbXBsZW1lbnRhdGlvbiBwZXJmb3JtcyBpbnRlcm5hbAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgc2l6aW5nIHRvIGFjY29tbW9kYXRlIHRoaXMgbWFueSBlbGVtZW50cy4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgaW5pdGlhbCBjYXBhY2l0eSBvZgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzIGlzIG5lZ2F0aXZlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPEssIFY+IENvbmN1cnJlbnRNYXA8SywgVj4gY3JlYXRlQ29uY3VycmVudE1hcCgKKyAgICAgICAgICAgIGZpbmFsIGludCBpbml0aWFsQ2FwYWNpdHkpIHsKKyAgICAgICAgcmV0dXJuIEpka1ZlcnNpb24uZ2V0SmRrVmVyc2lvbigpLmlzVW5zYWZlU3VwcG9ydGVkKCkKKyAgICAgICAgICAgICAgICA/IG5ldyBDb25jdXJyZW50SGFzaE1hcFY4PEssIFY+KGluaXRpYWxDYXBhY2l0eSkKKyAgICAgICAgICAgICAgICA6IG5ldyBDb25jdXJyZW50SGFzaE1hcDxLLCBWPihpbml0aWFsQ2FwYWNpdHkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcsIGVtcHR5IG1hcCB3aXRoIGFuIGluaXRpYWwgdGFibGUgc2l6ZSBiYXNlZCBvbiB0aGUgZ2l2ZW4gbnVtYmVyIG9mIGVsZW1lbnRzCisgICAgICogKHtAY29kZSBpbml0aWFsQ2FwYWNpdHl9KSwgdGFibGUgZGVuc2l0eSAoe0Bjb2RlIGxvYWRGYWN0b3J9KSwgYW5kIG51bWJlciBvZiBjb25jdXJyZW50bHkKKyAgICAgKiB1cGRhdGluZyB0aHJlYWRzICh7QGNvZGUgY29uY3VycmVuY3lMZXZlbH0pLgorICAgICAqIDxwPgorICAgICAqIE9uIE9yYWNsZSBKREssIHRoZSBmYWN0b3J5IG1ldGhvZCB3aWxsIHJldHVybiBhbiBpbnN0YW5jZSBvZgorICAgICAqIDxhIGhyZWY9Imh0dHA6Ly9nZWUuY3Mub3N3ZWdvLmVkdS9kbC9qc3IxNjYvZGlzdC9qc3IxNjZlZG9jcy9qc3IxNjZlL0NvbmN1cnJlbnRIYXNoTWFwVjguaHRtbCI+CisgICAgICoge0Bjb2RlIENvbmN1cnJlbnRIYXNoTWFwVjh9PC9hPgorICAgICAqIHRoYXQgaXMgc3VwcG9zZWQgdG8gYmUgYXZhaWxhYmxlIGluIEpESyA4IGFuZCBwcm92aWRlcyBiZXR0ZXIgcGVyZm9ybWFuY2UgYW5kIG1lbW9yeSBjaGFyYWN0ZXJpc3RpY3MgdGhhbgorICAgICAqIHtAbGluayBDb25jdXJyZW50SGFzaE1hcH0gaW1wbGVtZW50YXRpb24gZnJvbSBKREsgNyBvciBlYXJsaWVyLiBPbiBub24tT3JhY2xlIEpESywKKyAgICAgKiB0aGUgZmFjdG9yeSBpbnN0YW50aWF0ZXMgdGhlIHN0YW5kYXJkIHtAY29kZSBDb25jdXJyZW50SGFzaE1hcH0gZnJvbSBKREsuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGluaXRpYWxDYXBhY2l0eSAgdGhlIGluaXRpYWwgY2FwYWNpdHkuIFRoZSBpbXBsZW1lbnRhdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1zIGludGVybmFsIHNpemluZyB0byBhY2NvbW1vZGF0ZSB0aGlzIG1hbnkgZWxlbWVudHMsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gdGhlIHNwZWNpZmllZCBsb2FkIGZhY3Rvci4KKyAgICAgKiBAcGFyYW0gbG9hZEZhY3RvciAgICAgICB0aGUgbG9hZCBmYWN0b3IgKHRhYmxlIGRlbnNpdHkpIGZvcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGVzdGFibGlzaGluZyB0aGUgaW5pdGlhbCB0YWJsZSBzaXplLgorICAgICAqIEBwYXJhbSBjb25jdXJyZW5jeUxldmVsIHRoZSBlc3RpbWF0ZWQgbnVtYmVyIG9mIGNvbmN1cnJlbnRseQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0aW5nIHRocmVhZHMuIFRoZSBpbXBsZW1lbnRhdGlvbiBtYXkgdXNlIHRoaXMgdmFsdWUgYXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBhIHNpemluZyBoaW50LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBpbml0aWFsIGNhcGFjaXR5IGlzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVnYXRpdmUgb3IgdGhlIGxvYWQgZmFjdG9yIG9yIGNvbmN1cnJlbmN5TGV2ZWwgYXJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90IHBvc2l0aXZlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPEssIFY+IENvbmN1cnJlbnRNYXA8SywgVj4gY3JlYXRlQ29uY3VycmVudE1hcCgKKyAgICAgICAgICAgIGZpbmFsIGludCBpbml0aWFsQ2FwYWNpdHksIGZpbmFsIGZsb2F0IGxvYWRGYWN0b3IsCisgICAgICAgICAgICBmaW5hbCBpbnQgY29uY3VycmVuY3lMZXZlbCkgeworICAgICAgICByZXR1cm4gSmRrVmVyc2lvbi5nZXRKZGtWZXJzaW9uKCkuaXNVbnNhZmVTdXBwb3J0ZWQoKQorICAgICAgICAgICAgICAgID8gbmV3IENvbmN1cnJlbnRIYXNoTWFwVjg8SywgVj4oaW5pdGlhbENhcGFjaXR5LCBsb2FkRmFjdG9yLCBjb25jdXJyZW5jeUxldmVsKQorICAgICAgICAgICAgICAgIDogbmV3IENvbmN1cnJlbnRIYXNoTWFwPEssIFY+KGluaXRpYWxDYXBhY2l0eSwgbG9hZEZhY3RvciwgY29uY3VycmVuY3lMZXZlbCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL2NvbGxlY3Rpb24vSW1tdXRhYmxlQ29sbGVjdG9ycy5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL2NvbGxlY3Rpb24vSW1tdXRhYmxlQ29sbGVjdG9ycy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3OTVhYjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvY29sbGVjdGlvbi9JbW11dGFibGVDb2xsZWN0b3JzLmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yOworCisvKioKKyAqIFNldCBvZiBjb252ZW5pZW50IGZ1bmN0aW9uIHJlZ2FyZGluZyBhIGNvbGxlY3Rpb24gaW1tdXRhYmlsaXR5LiBQYXJ0aWN1bGFybHkgdXNlZnVsIGluIHRoZSBjb25qdW5jdGlvbiB3aXRoCisgKiB7QGxpbmsgamF2YS51dGlsLnN0cmVhbS5TdHJlYW19LgorICovCitwdWJsaWMgY2xhc3MgSW1tdXRhYmxlQ29sbGVjdG9ycyB7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEge0BsaW5rIENvbGxlY3Rvcn0gb2YgYW4gaW1tdXRhYmxlIGxpc3QgZm9yIHtAbGluayBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbSNjb2xsZWN0KENvbGxlY3Rvcil9LgorICAgICAqCisgICAgICogQHBhcmFtIDxUPiB0eXBlIG9mIHRoZSBpbW11dGFibGUgbGlzdC4KKyAgICAgKiBAcmV0dXJuIGNvbGxlY3RvciBmb3IgaW1tdXRhYmxlIGxpc3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8VD4gQ29sbGVjdG9yPFQsIExpc3Q8VD4sIExpc3Q8VD4+IHRvSW1tdXRhYmxlTGlzdCgpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rvci5vZihBcnJheUxpc3Q6Om5ldywgTGlzdDo6YWRkLCAobGVmdCwgcmlnaHQpIC0+IHsKKyAgICAgICAgICAgIGxlZnQuYWRkQWxsKHJpZ2h0KTsKKyAgICAgICAgICAgIHJldHVybiBsZWZ0OworICAgICAgICB9LCBDb2xsZWN0aW9uczo6dW5tb2RpZmlhYmxlTGlzdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHtAbGluayBDb2xsZWN0b3J9IG9mIGFuIGltbXV0YWJsZSBTZXQgZm9yIHtAbGluayBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbSNjb2xsZWN0KENvbGxlY3Rvcil9LgorICAgICAqCisgICAgICogQHBhcmFtIDxUPiB0eXBlIG9mIHRoZSBpbW11dGFibGUgc2V0LgorICAgICAqIEByZXR1cm4gY29sbGVjdG9yIGZvciBpbW11dGFibGUgc2V0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IENvbGxlY3RvcjxULCBTZXQ8VD4sIFNldDxUPj4gdG9JbW11dGFibGVTZXQoKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0b3Iub2YoSGFzaFNldDo6bmV3LCBTZXQ6OmFkZCwgKGxlZnQsIHJpZ2h0KSAtPiB7CisgICAgICAgICAgICBsZWZ0LmFkZEFsbChyaWdodCk7CisgICAgICAgICAgICByZXR1cm4gbGVmdDsKKyAgICAgICAgfSwgQ29sbGVjdGlvbnM6OnVubW9kaWZpYWJsZVNldCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHtAbGluayBDb2xsZWN0b3J9IG9mIGFuIGltbXV0YWJsZSBTZXQgZm9yIHtAbGluayBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbSNjb2xsZWN0KENvbGxlY3Rvcil9LgorICAgICAqCisgICAgICogQHBhcmFtIDxUPiB0eXBlIG9mIHRoZSBpbW11dGFibGUgbGlua2VkIGhhc2ggc2V0LgorICAgICAqIEByZXR1cm4gY29sbGVjdG9yIGZvciBpbW11dGFibGUgbGlua2VkIGhhc2ggc2V0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IENvbGxlY3RvcjxULCBTZXQ8VD4sIFNldDxUPj4gdG9JbW11dGFibGVMaW5rZWRTZXQoKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0b3Iub2YoTGlua2VkSGFzaFNldDo6bmV3LCBTZXQ6OmFkZCwgKGxlZnQsIHJpZ2h0KSAtPiB7CisgICAgICAgICAgICBsZWZ0LmFkZEFsbChyaWdodCk7CisgICAgICAgICAgICByZXR1cm4gbGVmdDsKKyAgICAgICAgfSwgQ29sbGVjdGlvbnM6OnVubW9kaWZpYWJsZVNldCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL2NvbGxlY3Rpb24vSW1tdXRhYmxlTXVsdGl2YWx1ZWRNYXAuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9jb2xsZWN0aW9uL0ltbXV0YWJsZU11bHRpdmFsdWVkTWFwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMwZDY3ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9jb2xsZWN0aW9uL0ltbXV0YWJsZU11bHRpdmFsdWVkTWFwLmphdmEKQEAgLTAsMCArMSwxODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRIYXNoTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CisKKy8qKgorICogQW4gaW1tdXRhYmxlIHZpZXcgb2YgYSB7QGxpbmsgTXVsdGl2YWx1ZWRNYXB9LgorICoKKyAqIEBwYXJhbSA8Sz4gdGhlIGtleQorICogQHBhcmFtIDxWPiB0aGUgdmFsdWUKKyAqIEBhdXRob3IgR2lsaSBUemFiYXJpCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEltbXV0YWJsZU11bHRpdmFsdWVkTWFwPEssIFY+IGltcGxlbWVudHMgTXVsdGl2YWx1ZWRNYXA8SywgVj4geworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBlbXB0eSBpbW11dGFibGUgbWFwLgorICAgICAqCisgICAgICogQHJldHVybiBhbiBlbXB0eSBpbW11dGFibGUgbWFwLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPEssIFY+IEltbXV0YWJsZU11bHRpdmFsdWVkTWFwPEssIFY+IGVtcHR5KCkgeworICAgICAgICByZXR1cm4gbmV3IEltbXV0YWJsZU11bHRpdmFsdWVkTWFwPEssIFY+KG5ldyBNdWx0aXZhbHVlZEhhc2hNYXA8SywgVj4oKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBNdWx0aXZhbHVlZE1hcDxLLCBWPiBkZWxlZ2F0ZTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgSW1tdXRhYmxlTXVsdGl2YWx1ZWRNYXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVsZWdhdGUgdGhlIHVuZGVybHlpbmcgTXVsdGl2YWx1ZWRNYXAKKyAgICAgKi8KKyAgICBwdWJsaWMgSW1tdXRhYmxlTXVsdGl2YWx1ZWRNYXAoZmluYWwgTXVsdGl2YWx1ZWRNYXA8SywgVj4gZGVsZWdhdGUpIHsKKyAgICAgICAgaWYgKGRlbGVnYXRlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiSW1tdXRhYmxlTXVsdGl2YWx1ZWRNYXAgZGVsZWdhdGUgbXVzdCBub3QgYmUgJ251bGwnLiIpOworICAgICAgICB9CisgICAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHNJZ25vcmVWYWx1ZU9yZGVyKGZpbmFsIE11bHRpdmFsdWVkTWFwPEssIFY+IG90aGVyTWFwKSB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5lcXVhbHNJZ25vcmVWYWx1ZU9yZGVyKG90aGVyTWFwKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwdXRTaW5nbGUoZmluYWwgSyBrZXksIGZpbmFsIFYgdmFsdWUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGlzIE11bHRpdmFsdWVkTWFwIGltcGxlbWVudGF0aW9uIGlzIGltbXV0YWJsZS4iKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZGQoZmluYWwgSyBrZXksIGZpbmFsIFYgdmFsdWUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGlzIE11bHRpdmFsdWVkTWFwIGltcGxlbWVudGF0aW9uIGlzIGltbXV0YWJsZS4iKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgViBnZXRGaXJzdChmaW5hbCBLIGtleSkgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUuZ2V0Rmlyc3Qoa2V5KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZGRBbGwoZmluYWwgSyBrZXksIGZpbmFsIFYuLi4gbmV3VmFsdWVzKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhpcyBNdWx0aXZhbHVlZE1hcCBpbXBsZW1lbnRhdGlvbiBpcyBpbW11dGFibGUuIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWRkQWxsKGZpbmFsIEsga2V5LCBmaW5hbCBMaXN0PFY+IHZhbHVlTGlzdCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRoaXMgTXVsdGl2YWx1ZWRNYXAgaW1wbGVtZW50YXRpb24gaXMgaW1tdXRhYmxlLiIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFkZEZpcnN0KGZpbmFsIEsga2V5LCBmaW5hbCBWIHZhbHVlKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhpcyBNdWx0aXZhbHVlZE1hcCBpbXBsZW1lbnRhdGlvbiBpcyBpbW11dGFibGUuIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUuc2l6ZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5pc0VtcHR5KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoZmluYWwgT2JqZWN0IGtleSkgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUuY29udGFpbnNLZXkoa2V5KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKGZpbmFsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUuY29udGFpbnNWYWx1ZSh2YWx1ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8Vj4gZ2V0KGZpbmFsIE9iamVjdCBrZXkpIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldChrZXkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFY+IHB1dChmaW5hbCBLIGtleSwgZmluYWwgTGlzdDxWPiB2YWx1ZSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRoaXMgTXVsdGl2YWx1ZWRNYXAgaW1wbGVtZW50YXRpb24gaXMgaW1tdXRhYmxlLiIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFY+IHJlbW92ZShmaW5hbCBPYmplY3Qga2V5KSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhpcyBNdWx0aXZhbHVlZE1hcCBpbXBsZW1lbnRhdGlvbiBpcyBpbW11dGFibGUuIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcHV0QWxsKGZpbmFsIE1hcDw/IGV4dGVuZHMgSywgPyBleHRlbmRzIExpc3Q8Vj4+IG0pIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGlzIE11bHRpdmFsdWVkTWFwIGltcGxlbWVudGF0aW9uIGlzIGltbXV0YWJsZS4iKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGlzIE11bHRpdmFsdWVkTWFwIGltcGxlbWVudGF0aW9uIGlzIGltbXV0YWJsZS4iKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PEs+IGtleVNldCgpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChkZWxlZ2F0ZS5rZXlTZXQoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENvbGxlY3Rpb248TGlzdDxWPj4gdmFsdWVzKCkgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbihkZWxlZ2F0ZS52YWx1ZXMoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxFbnRyeTxLLCBMaXN0PFY+Pj4gZW50cnlTZXQoKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoZGVsZWdhdGUuZW50cnlTZXQoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvKSB7CisgICAgICAgIGlmICh0aGlzID09IG8pIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBJbW11dGFibGVNdWx0aXZhbHVlZE1hcCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIEltbXV0YWJsZU11bHRpdmFsdWVkTWFwIHRoYXQgPSAoSW1tdXRhYmxlTXVsdGl2YWx1ZWRNYXApIG87CisKKyAgICAgICAgaWYgKCFkZWxlZ2F0ZS5lcXVhbHModGhhdC5kZWxlZ2F0ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5oYXNoQ29kZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9jb2xsZWN0aW9uL0tleUNvbXBhcmF0b3IuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9jb2xsZWN0aW9uL0tleUNvbXBhcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGE0OWU4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL2NvbGxlY3Rpb24vS2V5Q29tcGFyYXRvci5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uOworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKKy8qKgorICogQSBrZXkgY29tcGFyYXRvci4KKyAqCisgKiBAcGFyYW0gPEs+IEtleSdzIHR5cGUKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqLworcHVibGljIGludGVyZmFjZSBLZXlDb21wYXJhdG9yPEs+IGV4dGVuZHMgU2VyaWFsaXphYmxlIHsKKworICAgIC8qKgorICAgICAqIENvbXBhcmUgdHdvIGtleXMgZm9yIGVxdWFsaXR5LgorICAgICAqCisgICAgICogQHBhcmFtIHggdGhlIGZpcnN0IGtleQorICAgICAqIEBwYXJhbSB5IHRoZSBzZWNvbmQga2V5CisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBrZXlzIGFyZSBlcXVhbC4KKyAgICAgKi8KKyAgICBib29sZWFuIGVxdWFscyhLIHgsIEsgeSk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGhhc2ggY29kZSBvZiBhIGtleS4KKyAgICAgKiBAcGFyYW0gayB0aGUga2V5LgorICAgICAqIEByZXR1cm4gdGhlIGhhc2ggY29kZSBvZiB0aGUga2V5LgorICAgICAqLworICAgIGludCBoYXNoKEsgayk7Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvY29sbGVjdGlvbi9LZXlDb21wYXJhdG9ySGFzaE1hcC5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL2NvbGxlY3Rpb24vS2V5Q29tcGFyYXRvckhhc2hNYXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWVmYmM1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL2NvbGxlY3Rpb24vS2V5Q29tcGFyYXRvckhhc2hNYXAuamF2YQpAQCAtMCwwICsxLDk5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RTZXQ7CitpbXBvcnQgamF2YS51dGlsLkNvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworCisvKioKKyAqIEEgaW1wbGVtZW50YXRpb24gc2ltaWxhciB0byB7QGxpbmsgamF2YS51dGlsLkhhc2hNYXB9IGJ1dCBzdXBwb3J0cyB0aGUKKyAqIGNvbXBhcmlzb24gb2Yga2V5cyB1c2luZyBhIHtAbGluayBLZXlDb21wYXJhdG9yfS4KKyAqCisgKiBAcGFyYW0gPEs+IFR5cGUgb2Yga2V5cworICogQHBhcmFtIDxWPiBUeXBlIG9mIHZhbHVlcworICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKK3B1YmxpYyBjbGFzcyBLZXlDb21wYXJhdG9ySGFzaE1hcDxLLCBWPiBleHRlbmRzIEFic3RyYWN0TWFwPEssIFY+IGltcGxlbWVudHMgTWFwPEssIFY+LCBDbG9uZWFibGUsIFNlcmlhbGl6YWJsZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAzMDAwMjczNjY1NjY1MTM3NDYzTDsKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCBpbml0aWFsIGNhcGFjaXR5IC0gTVVTVCBiZSBhIHBvd2VyIG9mIHR3by4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfSU5JVElBTF9DQVBBQ0lUWSA9IDE2OworICAgIC8qKgorICAgICAqIFRoZSBtYXhpbXVtIGNhcGFjaXR5LCB1c2VkIGlmIGEgaGlnaGVyIHZhbHVlIGlzIGltcGxpY2l0bHkgc3BlY2lmaWVkCisgICAgICogYnkgZWl0aGVyIG9mIHRoZSBjb25zdHJ1Y3RvcnMgd2l0aCBhcmd1bWVudHMuCisgICAgICogTVVTVCBiZSBhIHBvd2VyIG9mIHR3byA8PSAxPDwzMC4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IE1BWElNVU1fQ0FQQUNJVFkgPSAxIDw8IDMwOworICAgIC8qKgorICAgICAqIFRoZSBsb2FkIGZhY3RvciB1c2VkIHdoZW4gbm9uZSBzcGVjaWZpZWQgaW4gY29uc3RydWN0b3IuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGZsb2F0IERFRkFVTFRfTE9BRF9GQUNUT1IgPSAwLjc1ZjsKKyAgICAvKioKKyAgICAgKiBUaGUgdGFibGUsIHJlc2l6ZWQgYXMgbmVjZXNzYXJ5LiBMZW5ndGggTVVTVCBBbHdheXMgYmUgYSBwb3dlciBvZiB0d28uCisgICAgICovCisgICAgdHJhbnNpZW50IEVudHJ5PEssIFY+W10gdGFibGU7CisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBrZXktdmFsdWUgbWFwcGluZ3MgY29udGFpbmVkIGluIHRoaXMgaWRlbnRpdHkgaGFzaCBtYXAuCisgICAgICovCisgICAgdHJhbnNpZW50IGludCBzaXplOworICAgIC8qKgorICAgICAqIFRoZSBuZXh0IHNzIHZhbHVlIGF0IHdoaWNoIHRvIHJlc2l6ZSAoY2FwYWNpdHkgKiBsb2FkIGZhY3RvcikuCisgICAgICoKKyAgICAgKiBAc2VyaWFsCisgICAgICovCisgICAgaW50IHRocmVzaG9sZDsKKyAgICAvKioKKyAgICAgKiBUaGUgbG9hZCBmYWN0b3IgZm9yIHRoZSBoYXNoIHRhYmxlLgorICAgICAqCisgICAgICogQHNlcmlhbAorICAgICAqLworICAgIGZpbmFsIGZsb2F0IGxvYWRGYWN0b3I7CisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiB0aW1lcyB0aGlzIEhhc2hNYXAgaGFzIGJlZW4gc3RydWN0dXJhbGx5IG1vZGlmaWVkCisgICAgICogU3RydWN0dXJhbCBtb2RpZmljYXRpb25zIGFyZSB0aG9zZSB0aGF0IGNoYW5nZSB0aGUgbnVtYmVyIG9mIG1hcHBpbmdzIGluCisgICAgICogdGhlIEhhc2hNYXAgb3Igb3RoZXJ3aXNlIG1vZGlmeSBpdHMgaW50ZXJuYWwgc3RydWN0dXJlIChlLmcuLAorICAgICAqIHJlaGFzaCkuICBUaGlzIGZpZWxkIGlzIHVzZWQgdG8gbWFrZSBpdGVyYXRvcnMgb24gQ29sbGVjdGlvbi12aWV3cyBvZgorICAgICAqIHRoZSBIYXNoTWFwIGZhaWwtZmFzdC4gIChTZWUgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbikuCisgICAgICovCisgICAgdHJhbnNpZW50IHZvbGF0aWxlIGludCBtb2RDb3VudDsKKworICAgIGZpbmFsIEtleUNvbXBhcmF0b3I8Sz4ga2V5Q29tcGFyYXRvcjsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gZW1wdHkgPHR0Pkhhc2hNYXA8L3R0PiB3aXRoIHRoZSBzcGVjaWZpZWQgaW5pdGlhbAorICAgICAqIGNhcGFjaXR5IGFuZCBsb2FkIGZhY3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbml0aWFsQ2FwYWNpdHkgVGhlIGluaXRpYWwgY2FwYWNpdHkuCisgICAgICogQHBhcmFtIGxvYWRGYWN0b3IgICAgICBUaGUgbG9hZCBmYWN0b3IuCisgICAgICogQHBhcmFtIGtleUNvbXBhcmF0b3IgICB0aGUgbWFwIGtleSBjb21wYXJhdG9yLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBpbml0aWFsIGNhcGFjaXR5IGlzIG5lZ2F0aXZlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgdGhlIGxvYWQgZmFjdG9yIGlzIG5vbnBvc2l0aXZlLgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBLZXlDb21wYXJhdG9ySGFzaE1hcChpbnQgaW5pdGlhbENhcGFjaXR5LCBmaW5hbCBmbG9hdCBsb2FkRmFjdG9yLCBmaW5hbCBLZXlDb21wYXJhdG9yPEs+IGtleUNvbXBhcmF0b3IpIHsKKyAgICAgICAgaWYgKGluaXRpYWxDYXBhY2l0eSA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuSUxMRUdBTF9JTklUSUFMX0NBUEFDSVRZKGluaXRpYWxDYXBhY2l0eSkpOworICAgICAgICB9CisgICAgICAgIGlmIChpbml0aWFsQ2FwYWNpdHkgPiBNQVhJTVVNX0NBUEFDSVRZKSB7CisgICAgICAgICAgICBpbml0aWFsQ2FwYWNpdHkgPSBNQVhJTVVNX0NBUEFDSVRZOworICAgICAgICB9CisgICAgICAgIGlmIChsb2FkRmFjdG9yIDw9IDAgfHwgRmxvYXQuaXNOYU4obG9hZEZhY3RvcikpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuSUxMRUdBTF9MT0FEX0ZBQ1RPUihsb2FkRmFjdG9yKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBGaW5kIGEgcG93ZXIgb2YgMiA+PSBpbml0aWFsQ2FwYWNpdHkKKyAgICAgICAgaW50IGNhcGFjaXR5ID0gMTsKKyAgICAgICAgd2hpbGUgKGNhcGFjaXR5IDwgaW5pdGlhbENhcGFjaXR5KSB7CisgICAgICAgICAgICBjYXBhY2l0eSA8PD0gMTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMubG9hZEZhY3RvciA9IGxvYWRGYWN0b3I7CisgICAgICAgIHRocmVzaG9sZCA9IChpbnQpIChjYXBhY2l0eSAqIGxvYWRGYWN0b3IpOworICAgICAgICB0YWJsZSA9IG5ldyBFbnRyeVtjYXBhY2l0eV07CisgICAgICAgIHRoaXMua2V5Q29tcGFyYXRvciA9IGtleUNvbXBhcmF0b3I7CisKKyAgICAgICAgaW5pdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gZW1wdHkgPHR0Pkhhc2hNYXA8L3R0PiB3aXRoIHRoZSBzcGVjaWZpZWQgaW5pdGlhbAorICAgICAqIGNhcGFjaXR5IGFuZCB0aGUgZGVmYXVsdCBsb2FkIGZhY3RvciAoMC43NSkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5pdGlhbENhcGFjaXR5IHRoZSBpbml0aWFsIGNhcGFjaXR5LgorICAgICAqIEBwYXJhbSBrZXlDb21wYXJhdG9yICAgdGhlIG1hcCBrZXkgY29tcGFyYXRvci4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgaW5pdGlhbCBjYXBhY2l0eSBpcyBuZWdhdGl2ZS4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgS2V5Q29tcGFyYXRvckhhc2hNYXAoZmluYWwgaW50IGluaXRpYWxDYXBhY2l0eSwgZmluYWwgS2V5Q29tcGFyYXRvcjxLPiBrZXlDb21wYXJhdG9yKSB7CisgICAgICAgIHRoaXMoaW5pdGlhbENhcGFjaXR5LCBERUZBVUxUX0xPQURfRkFDVE9SLCBrZXlDb21wYXJhdG9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGVtcHR5IDx0dD5IYXNoTWFwPC90dD4gd2l0aCB0aGUgZGVmYXVsdCBpbml0aWFsIGNhcGFjaXR5CisgICAgICogKDE2KSBhbmQgdGhlIGRlZmF1bHQgbG9hZCBmYWN0b3IgKDAuNzUpLgorICAgICAqCisgICAgICogQHBhcmFtIGtleUNvbXBhcmF0b3IgdGhlIG1hcCBrZXkgY29tcGFyYXRvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgS2V5Q29tcGFyYXRvckhhc2hNYXAoZmluYWwgS2V5Q29tcGFyYXRvcjxLPiBrZXlDb21wYXJhdG9yKSB7CisgICAgICAgIHRoaXMoREVGQVVMVF9JTklUSUFMX0NBUEFDSVRZLCBERUZBVUxUX0xPQURfRkFDVE9SLCBrZXlDb21wYXJhdG9yKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IDx0dD5IYXNoTWFwPC90dD4gd2l0aCB0aGUgc2FtZSBtYXBwaW5ncyBhcyB0aGUKKyAgICAgKiBzcGVjaWZpZWQgPHR0Pk1hcDwvdHQ+LiAgVGhlIDx0dD5IYXNoTWFwPC90dD4gaXMgY3JlYXRlZCB3aXRoCisgICAgICogZGVmYXVsdCBsb2FkIGZhY3RvciAoMC43NSkgYW5kIGFuIGluaXRpYWwgY2FwYWNpdHkgc3VmZmljaWVudCB0bworICAgICAqIGhvbGQgdGhlIG1hcHBpbmdzIGluIHRoZSBzcGVjaWZpZWQgPHR0Pk1hcDwvdHQ+LgorICAgICAqCisgICAgICogQHBhcmFtIG0gICAgICAgICAgICAgdGhlIG1hcCB3aG9zZSBtYXBwaW5ncyBhcmUgdG8gYmUgcGxhY2VkIGluIHRoaXMgbWFwLgorICAgICAqIEBwYXJhbSBrZXlDb21wYXJhdG9yIHRoZSBjb21wYXJhdG9yCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIG1hcCBpcyBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBLZXlDb21wYXJhdG9ySGFzaE1hcChmaW5hbCBNYXA8PyBleHRlbmRzIEssID8gZXh0ZW5kcyBWPiBtLCBmaW5hbCBLZXlDb21wYXJhdG9yPEs+IGtleUNvbXBhcmF0b3IpIHsKKyAgICAgICAgdGhpcyhNYXRoLm1heCgoaW50KSAobS5zaXplKCkgLyBERUZBVUxUX0xPQURfRkFDVE9SKSArIDEsIERFRkFVTFRfSU5JVElBTF9DQVBBQ0lUWSksIERFRkFVTFRfTE9BRF9GQUNUT1IsIGtleUNvbXBhcmF0b3IpOworICAgICAgICBwdXRBbGxGb3JDcmVhdGUobSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBIYXNoTWFwIGhhcyBiZWVuIHN0cnVjdHVyYWxseSBtb2RpZmllZAorICAgICAqIFN0cnVjdHVyYWwgbW9kaWZpY2F0aW9ucyBhcmUgdGhvc2UgdGhhdCBjaGFuZ2UgdGhlIG51bWJlciBvZiBtYXBwaW5ncyBpbgorICAgICAqIHRoZSBIYXNoTWFwIG9yIG90aGVyd2lzZSBtb2RpZnkgaXRzIGludGVybmFsIHN0cnVjdHVyZSAoZS5nLiwKKyAgICAgKiByZWhhc2gpLgorICAgICAqCisgICAgICogQHJldHVybiByZXR1cm4gdGhlIG1vZGlmaWNhdGlvbiBjb3VudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE1vZENvdW50KCkgeworICAgICAgICByZXR1cm4gbW9kQ291bnQ7CisgICAgfQorCisgICAgLy8gaW50ZXJuYWwgdXRpbGl0aWVzCisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXphdGlvbiBob29rIGZvciBzdWJjbGFzc2VzLgorICAgICAqIDxwLz4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgaW4gYWxsIHBzZXVkby1jb25zdHJ1Y3RvcnMgKGNsb25lLCByZWFkT2JqZWN0KQorICAgICAqIGFmdGVyIEhhc2hNYXAgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYnV0IGJlZm9yZSBhbnkgZW50cmllcyBoYXZlCisgICAgICogYmVlbiBpbnNlcnRlZC4gIChJbiB0aGUgYWJzZW5jZSBvZiB0aGlzIG1ldGhvZCwgcmVhZE9iamVjdCB3b3VsZAorICAgICAqIHJlcXVpcmUgZXhwbGljaXQga25vd2xlZGdlIG9mIHN1YmNsYXNzZXMuKQorICAgICAqLworICAgIHZvaWQgaW5pdCgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWYWx1ZSByZXByZXNlbnRpbmcgbnVsbCBrZXlzIGluc2lkZSB0YWJsZXMuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIE9iamVjdCBOVUxMX0tFWSA9IG5ldyBPYmplY3QoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gZm9yIGtleS4gVXNlIE5VTExfS0VZIGlmIGtleSBpcyBudWxsLgorICAgICAqLworICAgIHN0YXRpYyA8VD4gVCBtYXNrTnVsbChmaW5hbCBUIGtleSkgeworICAgICAgICByZXR1cm4ga2V5ID09IG51bGwgPyAoVCkgTlVMTF9LRVkgOiBrZXk7CisgICAgfQorCisgICAgc3RhdGljIDxUPiBib29sZWFuIGlzTnVsbChmaW5hbCBUIGtleSkgeworICAgICAgICByZXR1cm4ga2V5ID09IE5VTExfS0VZOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMga2V5IHJlcHJlc2VudGVkIGJ5IHNwZWNpZmllZCBpbnRlcm5hbCByZXByZXNlbnRhdGlvbi4KKyAgICAgKi8KKyAgICBzdGF0aWMgPFQ+IFQgdW5tYXNrTnVsbChmaW5hbCBUIGtleSkgeworICAgICAgICByZXR1cm4ga2V5ID09IE5VTExfS0VZID8gbnVsbCA6IGtleTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgaGFzaCB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBvYmplY3QuICBJbiBhZGRpdGlvbiB0bworICAgICAqIHRoZSBvYmplY3QncyBvd24gaGFzaENvZGUsIHRoaXMgbWV0aG9kIGFwcGxpZXMgYSAic3VwcGxlbWVudGFsCisgICAgICogaGFzaCBmdW5jdGlvbiwiIHdoaWNoIGRlZmVuZHMgYWdhaW5zdCBwb29yIHF1YWxpdHkgaGFzaCBmdW5jdGlvbnMuCisgICAgICogVGhpcyBpcyBjcml0aWNhbCBiZWNhdXNlIEhhc2hNYXAgdXNlcyBwb3dlci1vZiB0d28gbGVuZ3RoCisgICAgICogaGFzaCB0YWJsZXMuPHA+CisgICAgICogPHAvPgorICAgICAqIFRoZSBzaGlmdCBkaXN0YW5jZXMgaW4gdGhpcyBmdW5jdGlvbiB3ZXJlIGNob3NlbiBhcyB0aGUgcmVzdWx0CisgICAgICogb2YgYW4gYXV0b21hdGVkIHNlYXJjaCBvdmVyIHRoZSBlbnRpcmUgZm91ci1kaW1lbnNpb25hbCBzZWFyY2ggc3BhY2UuCisgICAgICovCisgICAgc3RhdGljIGludCBoYXNoKGZpbmFsIE9iamVjdCB4KSB7CisgICAgICAgIGludCBoID0geC5oYXNoQ29kZSgpOworCisgICAgICAgIGggKz0gfihoIDw8IDkpOworICAgICAgICBoIF49IChoID4+PiAxNCk7CisgICAgICAgIGggKz0gKGggPDwgNCk7CisgICAgICAgIGggXj0gKGggPj4+IDEwKTsKKyAgICAgICAgcmV0dXJuIGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgZm9yIGVxdWFsaXR5IG9mIG5vbi1udWxsIHJlZmVyZW5jZSB4IGFuZCBwb3NzaWJseS1udWxsIHkuCisgICAgICovCisgICAgc3RhdGljIGJvb2xlYW4gZXEoZmluYWwgT2JqZWN0IHgsIGZpbmFsIE9iamVjdCB5KSB7CisgICAgICAgIHJldHVybiB4ID09IHkgfHwgeC5lcXVhbHMoeSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBpbmRleCBmb3IgaGFzaCBjb2RlIGguCisgICAgICovCisgICAgc3RhdGljIGludCBpbmRleEZvcihmaW5hbCBpbnQgaCwgZmluYWwgaW50IGxlbmd0aCkgeworICAgICAgICByZXR1cm4gaCAmIChsZW5ndGggLSAxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Yga2V5LXZhbHVlIG1hcHBpbmdzIGluIHRoaXMgbWFwLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGtleS12YWx1ZSBtYXBwaW5ncyBpbiB0aGlzIG1hcC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgIHJldHVybiBzaXplOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgPHR0PnRydWU8L3R0PiBpZiB0aGlzIG1hcCBjb250YWlucyBubyBrZXktdmFsdWUgbWFwcGluZ3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIDx0dD50cnVlPC90dD4gaWYgdGhpcyBtYXAgY29udGFpbnMgbm8ga2V5LXZhbHVlIG1hcHBpbmdzLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgICAgIHJldHVybiBzaXplID09IDA7CisgICAgfQorCisgICAgaW50IGtleUNvbXBhcmF0b3JIYXNoKGZpbmFsIEsgaykgeworICAgICAgICByZXR1cm4gaXNOdWxsKGspID8gaGFzaChrLmhhc2hDb2RlKCkpIDogaGFzaChrZXlDb21wYXJhdG9yLmhhc2goaykpOworICAgIH0KKworICAgIGludCBoYXNoKGludCBoKSB7CisgICAgICAgIGggKz0gfihoIDw8IDkpOworICAgICAgICBoIF49IChoID4+PiAxNCk7CisgICAgICAgIGggKz0gKGggPDwgNCk7CisgICAgICAgIGggXj0gKGggPj4+IDEwKTsKKyAgICAgICAgcmV0dXJuIGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgZm9yIGVxdWFsaXR5IG9mIG5vbi1udWxsIHJlZmVyZW5jZSB4IGFuZCBwb3NzaWJseS1udWxsIHkuCisgICAgICovCisgICAgYm9vbGVhbiBrZXlDb21wYXJhdG9yRXEoZmluYWwgSyB4LCBmaW5hbCBLIHkpIHsKKyAgICAgICAgaWYgKGlzTnVsbCh4KSkgeworICAgICAgICAgICAgcmV0dXJuIHggPT0geTsKKyAgICAgICAgfSBlbHNlIGlmIChpc051bGwoeSkpIHsKKyAgICAgICAgICAgIHJldHVybiB4ID09IHk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4geCA9PSB5IHx8IGtleUNvbXBhcmF0b3IuZXF1YWxzKHgsIHkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgdG8gd2hpY2ggdGhlIHNwZWNpZmllZCBrZXkgaXMgbWFwcGVkIGluIHRoaXMgaWRlbnRpdHkKKyAgICAgKiBoYXNoIG1hcCwgb3IgPHR0Pm51bGw8L3R0PiBpZiB0aGUgbWFwIGNvbnRhaW5zIG5vIG1hcHBpbmcgZm9yIHRoaXMga2V5LgorICAgICAqIEEgcmV0dXJuIHZhbHVlIG9mIDx0dD5udWxsPC90dD4gZG9lcyBub3QgPGk+bmVjZXNzYXJpbHk8L2k+IGluZGljYXRlCisgICAgICogdGhhdCB0aGUgbWFwIGNvbnRhaW5zIG5vIG1hcHBpbmcgZm9yIHRoZSBrZXk7IGl0IGlzIGFsc28gcG9zc2libGUgdGhhdAorICAgICAqIHRoZSBtYXAgZXhwbGljaXRseSBtYXBzIHRoZSBrZXkgdG8gPHR0Pm51bGw8L3R0Pi4gVGhlCisgICAgICogPHR0PmNvbnRhaW5zS2V5PC90dD4gbWV0aG9kIG1heSBiZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIHRoZXNlIHR3byBjYXNlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgdGhlIGtleSB3aG9zZSBhc3NvY2lhdGVkIHZhbHVlIGlzIHRvIGJlIHJldHVybmVkLgorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIHRvIHdoaWNoIHRoaXMgbWFwIG1hcHMgdGhlIHNwZWNpZmllZCBrZXksIG9yCisgICAgICogPHR0Pm51bGw8L3R0PiBpZiB0aGUgbWFwIGNvbnRhaW5zIG5vIG1hcHBpbmcgZm9yIHRoaXMga2V5LgorICAgICAqIEBzZWUgI3B1dChPYmplY3QsIE9iamVjdCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgViBnZXQoZmluYWwgT2JqZWN0IGtleSkgeworICAgICAgICBmaW5hbCBLIGsgPSAoSykgbWFza051bGwoa2V5KTsKKyAgICAgICAgZmluYWwgaW50IGhhc2ggPSBrZXlDb21wYXJhdG9ySGFzaChrKTsKKyAgICAgICAgZmluYWwgaW50IGkgPSBpbmRleEZvcihoYXNoLCB0YWJsZS5sZW5ndGgpOworICAgICAgICBFbnRyeTxLLCBWPiBlID0gdGFibGVbaV07CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpZiAoZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZS5oYXNoID09IGhhc2ggJiYga2V5Q29tcGFyYXRvckVxKGssIGUua2V5KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBlLnZhbHVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZSA9IGUubmV4dDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgPHR0PnRydWU8L3R0PiBpZiB0aGlzIG1hcCBjb250YWlucyBhIG1hcHBpbmcgZm9yIHRoZQorICAgICAqIHNwZWNpZmllZCBrZXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgd2hvc2UgcHJlc2VuY2UgaW4gdGhpcyBtYXAgaXMgdG8gYmUgdGVzdGVkCisgICAgICogQHJldHVybiA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoaXMgbWFwIGNvbnRhaW5zIGEgbWFwcGluZyBmb3IgdGhlIHNwZWNpZmllZAorICAgICAqIGtleS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0tleShmaW5hbCBPYmplY3Qga2V5KSB7CisgICAgICAgIGZpbmFsIEsgayA9IChLKSBtYXNrTnVsbChrZXkpOworICAgICAgICBmaW5hbCBpbnQgaGFzaCA9IGtleUNvbXBhcmF0b3JIYXNoKGspOworICAgICAgICBmaW5hbCBpbnQgaSA9IGluZGV4Rm9yKGhhc2gsIHRhYmxlLmxlbmd0aCk7CisgICAgICAgIEVudHJ5PEssIFY+IGUgPSB0YWJsZVtpXTsKKyAgICAgICAgd2hpbGUgKGUgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGUuaGFzaCA9PSBoYXNoICYmIGtleUNvbXBhcmF0b3JFcShrLCBlLmtleSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGUgPSBlLm5leHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGVudHJ5IGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBpbiB0aGUKKyAgICAgKiBIYXNoTWFwLiAgUmV0dXJucyBudWxsIGlmIHRoZSBIYXNoTWFwIGNvbnRhaW5zIG5vIG1hcHBpbmcKKyAgICAgKiBmb3IgdGhpcyBrZXkuCisgICAgICovCisgICAgRW50cnk8SywgVj4gZ2V0RW50cnkoZmluYWwgSyBrZXkpIHsKKyAgICAgICAgZmluYWwgSyBrID0gbWFza051bGwoa2V5KTsKKyAgICAgICAgZmluYWwgaW50IGhhc2ggPSBrZXlDb21wYXJhdG9ySGFzaChrKTsKKyAgICAgICAgZmluYWwgaW50IGkgPSBpbmRleEZvcihoYXNoLCB0YWJsZS5sZW5ndGgpOworICAgICAgICBFbnRyeTxLLCBWPiBlID0gdGFibGVbaV07CisgICAgICAgIHdoaWxlIChlICE9IG51bGwgJiYgIShlLmhhc2ggPT0gaGFzaCAmJiBrZXlDb21wYXJhdG9yRXEoaywgZS5rZXkpKSkgeworICAgICAgICAgICAgZSA9IGUubmV4dDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBc3NvY2lhdGVzIHRoZSBzcGVjaWZpZWQgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSBpbiB0aGlzIG1hcC4KKyAgICAgKiBJZiB0aGUgbWFwIHByZXZpb3VzbHkgY29udGFpbmVkIGEgbWFwcGluZyBmb3IgdGhpcyBrZXksIHRoZSBvbGQKKyAgICAgKiB2YWx1ZSBpcyByZXBsYWNlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBrZXkgICBrZXkgd2l0aCB3aGljaCB0aGUgc3BlY2lmaWVkIHZhbHVlIGlzIHRvIGJlIGFzc29jaWF0ZWQuCisgICAgICogQHBhcmFtIHZhbHVlIHZhbHVlIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleS4KKyAgICAgKiBAcmV0dXJuIHByZXZpb3VzIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBzcGVjaWZpZWQga2V5LCBvciA8dHQ+bnVsbDwvdHQ+CisgICAgICogaWYgdGhlcmUgd2FzIG5vIG1hcHBpbmcgZm9yIGtleS4gIEEgPHR0Pm51bGw8L3R0PiByZXR1cm4gY2FuCisgICAgICogYWxzbyBpbmRpY2F0ZSB0aGF0IHRoZSBIYXNoTWFwIHByZXZpb3VzbHkgYXNzb2NpYXRlZAorICAgICAqIDx0dD5udWxsPC90dD4gd2l0aCB0aGUgc3BlY2lmaWVkIGtleS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgViBwdXQoZmluYWwgSyBrZXksIGZpbmFsIFYgdmFsdWUpIHsKKyAgICAgICAgZmluYWwgSyBrID0gbWFza051bGwoa2V5KTsKKyAgICAgICAgZmluYWwgaW50IGhhc2ggPSBrZXlDb21wYXJhdG9ySGFzaChrKTsKKyAgICAgICAgZmluYWwgaW50IGkgPSBpbmRleEZvcihoYXNoLCB0YWJsZS5sZW5ndGgpOworCisgICAgICAgIGZvciAoRW50cnk8SywgVj4gZSA9IHRhYmxlW2ldOyBlICE9IG51bGw7IGUgPSBlLm5leHQpIHsKKyAgICAgICAgICAgIGlmIChlLmhhc2ggPT0gaGFzaCAmJiBrZXlDb21wYXJhdG9yRXEoaywgZS5rZXkpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgViBvbGRWYWx1ZSA9IGUudmFsdWU7CisgICAgICAgICAgICAgICAgZS52YWx1ZSA9IHZhbHVlOworICAgICAgICAgICAgICAgIGUucmVjb3JkQWNjZXNzKHRoaXMpOworICAgICAgICAgICAgICAgIHJldHVybiBvbGRWYWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG1vZENvdW50Kys7CisgICAgICAgIGFkZEVudHJ5KGhhc2gsIGssIHZhbHVlLCBpKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCBpbnN0ZWFkIG9mIHB1dCBieSBjb25zdHJ1Y3RvcnMgYW5kCisgICAgICogcHNldWRvY29uc3RydWN0b3JzIChjbG9uZSwgcmVhZE9iamVjdCkuICBJdCBkb2VzIG5vdCByZXNpemUgdGhlIHRhYmxlLAorICAgICAqIGNoZWNrIGZvciBjb21vZGlmaWNhdGlvbiwgZXRjLiAgSXQgY2FsbHMgY3JlYXRlRW50cnkgcmF0aGVyIHRoYW4KKyAgICAgKiBhZGRFbnRyeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcHV0Rm9yQ3JlYXRlKGZpbmFsIEsga2V5LCBmaW5hbCBWIHZhbHVlKSB7CisgICAgICAgIGZpbmFsIEsgayA9IG1hc2tOdWxsKGtleSk7CisgICAgICAgIGZpbmFsIGludCBoYXNoID0ga2V5Q29tcGFyYXRvckhhc2goayk7CisgICAgICAgIGZpbmFsIGludCBpID0gaW5kZXhGb3IoaGFzaCwgdGFibGUubGVuZ3RoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogTG9vayBmb3IgcHJlZXhpc3RpbmcgZW50cnkgZm9yIGtleS4gIFRoaXMgd2lsbCBuZXZlciBoYXBwZW4gZm9yCisgICAgICAgICAqIGNsb25lIG9yIGRlLXNlcmlhbGl6ZS4gIEl0IHdpbGwgb25seSBoYXBwZW4gZm9yIGNvbnN0cnVjdGlvbiBpZiB0aGUKKyAgICAgICAgICogaW5wdXQgTWFwIGlzIGEgc29ydGVkIG1hcCB3aG9zZSBvcmRlcmluZyBpcyBpbmNvbnNpc3RlbnQgdy8gZXF1YWxzLgorICAgICAgICAgKi8KKyAgICAgICAgZm9yIChFbnRyeTxLLCBWPiBlID0gdGFibGVbaV07IGUgIT0gbnVsbDsgZSA9IGUubmV4dCkgeworICAgICAgICAgICAgaWYgKGUuaGFzaCA9PSBoYXNoICYmIGtleUNvbXBhcmF0b3JFcShrLCBlLmtleSkpIHsKKyAgICAgICAgICAgICAgICBlLnZhbHVlID0gdmFsdWU7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY3JlYXRlRW50cnkoaGFzaCwgaywgdmFsdWUsIGkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwdXRBbGxGb3JDcmVhdGUoZmluYWwgTWFwPD8gZXh0ZW5kcyBLLCA/IGV4dGVuZHMgVj4gbSkgeworICAgICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTw/IGV4dGVuZHMgSywgPyBleHRlbmRzIFY+IGUgOiBtLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIHB1dEZvckNyZWF0ZShlLmdldEtleSgpLCBlLmdldFZhbHVlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVoYXNoZXMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgbWFwIGludG8gYSBuZXcgYXJyYXkgd2l0aCBhCisgICAgICogbGFyZ2VyIGNhcGFjaXR5LiAgVGhpcyBtZXRob2QgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUKKyAgICAgKiBudW1iZXIgb2Yga2V5cyBpbiB0aGlzIG1hcCByZWFjaGVzIGl0cyB0aHJlc2hvbGQuCisgICAgICogPHAvPgorICAgICAqIElmIGN1cnJlbnQgY2FwYWNpdHkgaXMgTUFYSU1VTV9DQVBBQ0lUWSwgdGhpcyBtZXRob2QgZG9lcyBub3QKKyAgICAgKiByZXNpemUgdGhlIG1hcCwgYnV0IHNldHMgdGhyZXNob2xkIHRvIEludGVnZXIuTUFYX1ZBTFVFLgorICAgICAqIFRoaXMgaGFzIHRoZSBlZmZlY3Qgb2YgcHJldmVudGluZyBmdXR1cmUgY2FsbHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmV3Q2FwYWNpdHkgdGhlIG5ldyBjYXBhY2l0eSwgTVVTVCBiZSBhIHBvd2VyIG9mIHR3bzsKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSBncmVhdGVyIHRoYW4gY3VycmVudCBjYXBhY2l0eSB1bmxlc3MgY3VycmVudAorICAgICAqICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eSBpcyBNQVhJTVVNX0NBUEFDSVRZIChpbiB3aGljaCBjYXNlIHZhbHVlCisgICAgICogICAgICAgICAgICAgICAgICAgIGlzIGlycmVsZXZhbnQpLgorICAgICAqLworICAgIHZvaWQgcmVzaXplKGZpbmFsIGludCBuZXdDYXBhY2l0eSkgeworICAgICAgICBmaW5hbCBFbnRyeTxLLCBWPltdIG9sZFRhYmxlID0gdGFibGU7CisgICAgICAgIGZpbmFsIGludCBvbGRDYXBhY2l0eSA9IG9sZFRhYmxlLmxlbmd0aDsKKyAgICAgICAgaWYgKG9sZENhcGFjaXR5ID09IE1BWElNVU1fQ0FQQUNJVFkpIHsKKyAgICAgICAgICAgIHRocmVzaG9sZCA9IEludGVnZXIuTUFYX1ZBTFVFOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgRW50cnk8SywgVj5bXSBuZXdUYWJsZSA9IG5ldyBFbnRyeVtuZXdDYXBhY2l0eV07CisgICAgICAgIHRyYW5zZmVyKG5ld1RhYmxlKTsKKyAgICAgICAgdGFibGUgPSBuZXdUYWJsZTsKKyAgICAgICAgdGhyZXNob2xkID0gKGludCkgKG5ld0NhcGFjaXR5ICogbG9hZEZhY3Rvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJhbnNmZXIgYWxsIGVudHJpZXMgZnJvbSBjdXJyZW50IHRhYmxlIHRvIG5ld1RhYmxlLgorICAgICAqLworICAgIHZvaWQgdHJhbnNmZXIoZmluYWwgRW50cnk8SywgVj5bXSBuZXdUYWJsZSkgeworICAgICAgICBmaW5hbCBFbnRyeTxLLCBWPltdIHNyYyA9IHRhYmxlOworICAgICAgICBmaW5hbCBpbnQgbmV3Q2FwYWNpdHkgPSBuZXdUYWJsZS5sZW5ndGg7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc3JjLmxlbmd0aDsgaisrKSB7CisgICAgICAgICAgICBFbnRyeTxLLCBWPiBlID0gc3JjW2pdOworICAgICAgICAgICAgaWYgKGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNyY1tqXSA9IG51bGw7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICBmaW5hbCBFbnRyeTxLLCBWPiBuZXh0ID0gZS5uZXh0OworICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaSA9IGluZGV4Rm9yKGUuaGFzaCwgbmV3Q2FwYWNpdHkpOworICAgICAgICAgICAgICAgICAgICBlLm5leHQgPSBuZXdUYWJsZVtpXTsKKyAgICAgICAgICAgICAgICAgICAgbmV3VGFibGVbaV0gPSBlOworICAgICAgICAgICAgICAgICAgICBlID0gbmV4dDsKKyAgICAgICAgICAgICAgICB9IHdoaWxlIChlICE9IG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29waWVzIGFsbCBvZiB0aGUgbWFwcGluZ3MgZnJvbSB0aGUgc3BlY2lmaWVkIG1hcCB0byB0aGlzIG1hcAorICAgICAqIFRoZXNlIG1hcHBpbmdzIHdpbGwgcmVwbGFjZSBhbnkgbWFwcGluZ3MgdGhhdAorICAgICAqIHRoaXMgbWFwIGhhZCBmb3IgYW55IG9mIHRoZSBrZXlzIGN1cnJlbnRseSBpbiB0aGUgc3BlY2lmaWVkIG1hcC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtIG1hcHBpbmdzIHRvIGJlIHN0b3JlZCBpbiB0aGlzIG1hcC4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgbWFwIGlzIG51bGwuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcHV0QWxsKGZpbmFsIE1hcDw/IGV4dGVuZHMgSywgPyBleHRlbmRzIFY+IG0pIHsKKyAgICAgICAgZmluYWwgaW50IG51bUtleXNUb0JlQWRkZWQgPSBtLnNpemUoKTsKKyAgICAgICAgaWYgKG51bUtleXNUb0JlQWRkZWQgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogRXhwYW5kIHRoZSBtYXAgaWYgdGhlIG1hcCBpZiB0aGUgbnVtYmVyIG9mIG1hcHBpbmdzIHRvIGJlIGFkZGVkCisgICAgICAgICAqIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aHJlc2hvbGQuICBUaGlzIGlzIGNvbnNlcnZhdGl2ZTsgdGhlCisgICAgICAgICAqIG9idmlvdXMgY29uZGl0aW9uIGlzIChtLnNzKCkgKyBzcykgPj0gdGhyZXNob2xkLCBidXQgdGhpcworICAgICAgICAgKiBjb25kaXRpb24gY291bGQgcmVzdWx0IGluIGEgbWFwIHdpdGggdHdpY2UgdGhlIGFwcHJvcHJpYXRlIGNhcGFjaXR5LAorICAgICAgICAgKiBpZiB0aGUga2V5cyB0byBiZSBhZGRlZCBvdmVybGFwIHdpdGggdGhlIGtleXMgYWxyZWFkeSBpbiB0aGlzIG1hcC4KKyAgICAgICAgICogQnkgdXNpbmcgdGhlIGNvbnNlcnZhdGl2ZSBjYWxjdWxhdGlvbiwgd2Ugc3ViamVjdCBvdXJzZWxmCisgICAgICAgICAqIHRvIGF0IG1vc3Qgb25lIGV4dHJhIHJlc2l6ZS4KKyAgICAgICAgICovCisgICAgICAgIGlmIChudW1LZXlzVG9CZUFkZGVkID4gdGhyZXNob2xkKSB7CisgICAgICAgICAgICBpbnQgdGFyZ2V0Q2FwYWNpdHkgPSAoaW50KSAobnVtS2V5c1RvQmVBZGRlZCAvIGxvYWRGYWN0b3IgKyAxKTsKKyAgICAgICAgICAgIGlmICh0YXJnZXRDYXBhY2l0eSA+IE1BWElNVU1fQ0FQQUNJVFkpIHsKKyAgICAgICAgICAgICAgICB0YXJnZXRDYXBhY2l0eSA9IE1BWElNVU1fQ0FQQUNJVFk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgbmV3Q2FwYWNpdHkgPSB0YWJsZS5sZW5ndGg7CisgICAgICAgICAgICB3aGlsZSAobmV3Q2FwYWNpdHkgPCB0YXJnZXRDYXBhY2l0eSkgeworICAgICAgICAgICAgICAgIG5ld0NhcGFjaXR5IDw8PSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5ld0NhcGFjaXR5ID4gdGFibGUubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgcmVzaXplKG5ld0NhcGFjaXR5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoZmluYWwgTWFwLkVudHJ5PD8gZXh0ZW5kcyBLLCA/IGV4dGVuZHMgVj4gZSA6IG0uZW50cnlTZXQoKSkgeworICAgICAgICAgICAgcHV0KGUuZ2V0S2V5KCksIGUuZ2V0VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIHRoZSBtYXBwaW5nIGZvciB0aGlzIGtleSBmcm9tIHRoaXMgbWFwIGlmIHByZXNlbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5IGtleSB3aG9zZSBtYXBwaW5nIGlzIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgbWFwLgorICAgICAqIEByZXR1cm4gcHJldmlvdXMgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHNwZWNpZmllZCBrZXksIG9yIDx0dD5udWxsPC90dD4KKyAgICAgKiBpZiB0aGVyZSB3YXMgbm8gbWFwcGluZyBmb3Iga2V5LiAgQSA8dHQ+bnVsbDwvdHQ+IHJldHVybiBjYW4KKyAgICAgKiBhbHNvIGluZGljYXRlIHRoYXQgdGhlIG1hcCBwcmV2aW91c2x5IGFzc29jaWF0ZWQgPHR0Pm51bGw8L3R0PgorICAgICAqIHdpdGggdGhlIHNwZWNpZmllZCBrZXkuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFYgcmVtb3ZlKGZpbmFsIE9iamVjdCBrZXkpIHsKKyAgICAgICAgZmluYWwgRW50cnk8SywgVj4gZSA9IHJlbW92ZUVudHJ5Rm9yS2V5KGtleSk7CisgICAgICAgIHJldHVybiAoZSA9PSBudWxsID8gbnVsbCA6IGUudmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYW5kIHJldHVybnMgdGhlIGVudHJ5IGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleQorICAgICAqIGluIHRoZSBIYXNoTWFwLiAgUmV0dXJucyBudWxsIGlmIHRoZSBIYXNoTWFwIGNvbnRhaW5zIG5vIG1hcHBpbmcKKyAgICAgKiBmb3IgdGhpcyBrZXkuCisgICAgICovCisgICAgRW50cnk8SywgVj4gcmVtb3ZlRW50cnlGb3JLZXkoZmluYWwgT2JqZWN0IGtleSkgeworICAgICAgICBmaW5hbCBLIGsgPSAoSykgbWFza051bGwoa2V5KTsKKyAgICAgICAgZmluYWwgaW50IGhhc2ggPSBrZXlDb21wYXJhdG9ySGFzaChrKTsKKyAgICAgICAgZmluYWwgaW50IGkgPSBpbmRleEZvcihoYXNoLCB0YWJsZS5sZW5ndGgpOworICAgICAgICBFbnRyeTxLLCBWPiBwcmV2ID0gdGFibGVbaV07CisgICAgICAgIEVudHJ5PEssIFY+IGUgPSBwcmV2OworCisgICAgICAgIHdoaWxlIChlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIEVudHJ5PEssIFY+IG5leHQgPSBlLm5leHQ7CisgICAgICAgICAgICBpZiAoZS5oYXNoID09IGhhc2ggJiYga2V5Q29tcGFyYXRvckVxKGssIGUua2V5KSkgeworICAgICAgICAgICAgICAgIG1vZENvdW50Kys7CisgICAgICAgICAgICAgICAgc2l6ZS0tOworICAgICAgICAgICAgICAgIGlmIChwcmV2ID09IGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGFibGVbaV0gPSBuZXh0OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHByZXYubmV4dCA9IG5leHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGUucmVjb3JkUmVtb3ZhbCh0aGlzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByZXYgPSBlOworICAgICAgICAgICAgZSA9IG5leHQ7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWFsIHZlcnNpb24gb2YgcmVtb3ZlIGZvciBFbnRyeVNldC4KKyAgICAgKi8KKyAgICBFbnRyeTxLLCBWPiByZW1vdmVNYXBwaW5nKGZpbmFsIE9iamVjdCBvKSB7CisgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBNYXAuRW50cnkpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIE1hcC5FbnRyeTxLLCBWPiBlbnRyeSA9IChNYXAuRW50cnk8SywgVj4pIG87CisgICAgICAgIGZpbmFsIEsgayA9IG1hc2tOdWxsKGVudHJ5LmdldEtleSgpKTsKKyAgICAgICAgZmluYWwgaW50IGhhc2ggPSBrZXlDb21wYXJhdG9ySGFzaChrKTsKKyAgICAgICAgZmluYWwgaW50IGkgPSBpbmRleEZvcihoYXNoLCB0YWJsZS5sZW5ndGgpOworICAgICAgICBFbnRyeTxLLCBWPiBwcmV2ID0gdGFibGVbaV07CisgICAgICAgIEVudHJ5PEssIFY+IGUgPSBwcmV2OworCisgICAgICAgIHdoaWxlIChlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIEVudHJ5PEssIFY+IG5leHQgPSBlLm5leHQ7CisgICAgICAgICAgICBpZiAoZS5oYXNoID09IGhhc2ggJiYgZS5lcXVhbHMoZW50cnkpKSB7CisgICAgICAgICAgICAgICAgbW9kQ291bnQrKzsKKyAgICAgICAgICAgICAgICBzaXplLS07CisgICAgICAgICAgICAgICAgaWYgKHByZXYgPT0gZSkgeworICAgICAgICAgICAgICAgICAgICB0YWJsZVtpXSA9IG5leHQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcHJldi5uZXh0ID0gbmV4dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZS5yZWNvcmRSZW1vdmFsKHRoaXMpOworICAgICAgICAgICAgICAgIHJldHVybiBlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJldiA9IGU7CisgICAgICAgICAgICBlID0gbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYWxsIG1hcHBpbmdzIGZyb20gdGhpcyBtYXAuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIG1vZENvdW50Kys7CisgICAgICAgIGZpbmFsIEVudHJ5W10gdGFiID0gdGFibGU7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFiLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0YWJbaV0gPSBudWxsOworICAgICAgICB9CisgICAgICAgIHNpemUgPSAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgPHR0PnRydWU8L3R0PiBpZiB0aGlzIG1hcCBtYXBzIG9uZSBvciBtb3JlIGtleXMgdG8gdGhlCisgICAgICogc3BlY2lmaWVkIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIHZhbHVlIHdob3NlIHByZXNlbmNlIGluIHRoaXMgbWFwIGlzIHRvIGJlIHRlc3RlZC4KKyAgICAgKiBAcmV0dXJuIDx0dD50cnVlPC90dD4gaWYgdGhpcyBtYXAgbWFwcyBvbmUgb3IgbW9yZSBrZXlzIHRvIHRoZQorICAgICAqIHNwZWNpZmllZCB2YWx1ZS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc1ZhbHVlKGZpbmFsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zTnVsbFZhbHVlKCk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBFbnRyeVtdIHRhYiA9IHRhYmxlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhYi5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgZm9yIChFbnRyeSBlID0gdGFiW2ldOyBlICE9IG51bGw7IGUgPSBlLm5leHQpIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUuZXF1YWxzKGUudmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3BlY2lhbC1jYXNlIGNvZGUgZm9yIGNvbnRhaW5zVmFsdWUgd2l0aCBudWxsIGFyZ3VtZW50CisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5zTnVsbFZhbHVlKCkgeworICAgICAgICBmaW5hbCBFbnRyeVtdIHRhYiA9IHRhYmxlOworICAgICAgICBmb3IgKGZpbmFsIEVudHJ5IGFUYWIgOiB0YWIpIHsKKyAgICAgICAgICAgIGZvciAoRW50cnkgZSA9IGFUYWI7IGUgIT0gbnVsbDsgZSA9IGUubmV4dCkgeworICAgICAgICAgICAgICAgIGlmIChlLnZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc2hhbGxvdyBjb3B5IG9mIHRoaXMgPHR0Pkhhc2hNYXA8L3R0PiBpbnN0YW5jZTogdGhlIGtleXMgYW5kCisgICAgICogdmFsdWVzIHRoZW1zZWx2ZXMgYXJlIG5vdCBjbG9uZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgc2hhbGxvdyBjb3B5IG9mIHRoaXMgbWFwLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgY2xvbmUoKSB7CisgICAgICAgIEtleUNvbXBhcmF0b3JIYXNoTWFwPEssIFY+IHJlc3VsdCA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc3VsdCA9IChLZXlDb21wYXJhdG9ySGFzaE1hcDxLLCBWPikgc3VwZXIuY2xvbmUoKTsKKworICAgICAgICAgICAgcmVzdWx0LnRhYmxlID0gbmV3IEVudHJ5W3RhYmxlLmxlbmd0aF07CisgICAgICAgICAgICByZXN1bHQuZW50cnlTZXQgPSBudWxsOworICAgICAgICAgICAgcmVzdWx0Lm1vZENvdW50ID0gMDsKKyAgICAgICAgICAgIHJlc3VsdC5zaXplID0gMDsKKyAgICAgICAgICAgIHJlc3VsdC5pbml0KCk7CisgICAgICAgICAgICByZXN1bHQucHV0QWxsRm9yQ3JlYXRlKHRoaXMpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBDbG9uZU5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBhc3NlcnQgZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBFbnRyeTxLLCBWPiBpbXBsZW1lbnRzIE1hcC5FbnRyeTxLLCBWPiB7CisKKyAgICAgICAgZmluYWwgSyBrZXk7CisgICAgICAgIFYgdmFsdWU7CisgICAgICAgIGZpbmFsIGludCBoYXNoOworICAgICAgICBFbnRyeTxLLCBWPiBuZXh0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgbmV3IGVudHJ5LgorICAgICAgICAgKi8KKyAgICAgICAgRW50cnkoZmluYWwgaW50IGgsIGZpbmFsIEsgaywgZmluYWwgViB2LCBmaW5hbCBFbnRyeTxLLCBWPiBuKSB7CisgICAgICAgICAgICB2YWx1ZSA9IHY7CisgICAgICAgICAgICBuZXh0ID0gbjsKKyAgICAgICAgICAgIGtleSA9IGs7CisgICAgICAgICAgICBoYXNoID0gaDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSyBnZXRLZXkoKSB7CisgICAgICAgICAgICByZXR1cm4gS2V5Q29tcGFyYXRvckhhc2hNYXAuPEs+dW5tYXNrTnVsbChrZXkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWIGdldFZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBWIHNldFZhbHVlKGZpbmFsIFYgbmV3VmFsdWUpIHsKKyAgICAgICAgICAgIGZpbmFsIFYgb2xkVmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgICAgIHZhbHVlID0gbmV3VmFsdWU7CisgICAgICAgICAgICByZXR1cm4gb2xkVmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvKSB7CisgICAgICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgTWFwLkVudHJ5KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIE1hcC5FbnRyeSBlID0gKE1hcC5FbnRyeSkgbzsKKyAgICAgICAgICAgIGZpbmFsIE9iamVjdCBrMSA9IGdldEtleSgpOworICAgICAgICAgICAgZmluYWwgT2JqZWN0IGsyID0gZS5nZXRLZXkoKTsKKyAgICAgICAgICAgIGlmIChrMSA9PSBrMiB8fCAoazEgIT0gbnVsbCAmJiBrMS5lcXVhbHMoazIpKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2MSA9IGdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHYyID0gZS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgICAgIGlmICh2MSA9PSB2MiB8fCAodjEgIT0gbnVsbCAmJiB2MS5lcXVhbHModjIpKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAoa2V5ID09IE5VTExfS0VZID8gMCA6IGtleS5oYXNoQ29kZSgpKSBeICh2YWx1ZSA9PSBudWxsID8gMCA6IHZhbHVlLmhhc2hDb2RlKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0S2V5KCkgKyAiPSIgKyBnZXRWYWx1ZSgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGludm9rZWQgd2hlbmV2ZXIgdGhlIHZhbHVlIGluIGFuIGVudHJ5IGlzCisgICAgICAgICAqIG92ZXJ3cml0dGVuIGJ5IGFuIGludm9jYXRpb24gb2YgcHV0KGssdikgZm9yIGEga2V5IGsgdGhhdCdzIGFscmVhZHkKKyAgICAgICAgICogaW4gdGhlIEhhc2hNYXAuCisgICAgICAgICAqLworICAgICAgICB2b2lkIHJlY29yZEFjY2VzcyhmaW5hbCBLZXlDb21wYXJhdG9ySGFzaE1hcDxLLCBWPiBtKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBtZXRob2QgaXMgaW52b2tlZCB3aGVuZXZlciB0aGUgZW50cnkgaXMKKyAgICAgICAgICogcmVtb3ZlZCBmcm9tIHRoZSB0YWJsZS4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgcmVjb3JkUmVtb3ZhbChmaW5hbCBLZXlDb21wYXJhdG9ySGFzaE1hcDxLLCBWPiBtKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgZW50cnkgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSwgdmFsdWUgYW5kIGhhc2ggY29kZSB0bworICAgICAqIHRoZSBzcGVjaWZpZWQgYnVja2V0LiAgSXQgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoaXMKKyAgICAgKiBtZXRob2QgdG8gcmVzaXplIHRoZSB0YWJsZSBpZiBhcHByb3ByaWF0ZS4KKyAgICAgKiA8cC8+CisgICAgICogU3ViY2xhc3Mgb3ZlcnJpZGVzIHRoaXMgdG8gYWx0ZXIgdGhlIGJlaGF2aW9yIG9mIHB1dCBtZXRob2QuCisgICAgICovCisgICAgdm9pZCBhZGRFbnRyeShmaW5hbCBpbnQgaGFzaCwgZmluYWwgSyBrZXksIGZpbmFsIFYgdmFsdWUsIGZpbmFsIGludCBidWNrZXRJbmRleCkgeworICAgICAgICBmaW5hbCBFbnRyeTxLLCBWPiBlID0gdGFibGVbYnVja2V0SW5kZXhdOworICAgICAgICB0YWJsZVtidWNrZXRJbmRleF0gPSBuZXcgRW50cnk8SywgVj4oaGFzaCwga2V5LCB2YWx1ZSwgZSk7CisgICAgICAgIGlmIChzaXplKysgPj0gdGhyZXNob2xkKSB7CisgICAgICAgICAgICByZXNpemUoMiAqIHRhYmxlLmxlbmd0aCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMaWtlIGFkZEVudHJ5IGV4Y2VwdCB0aGF0IHRoaXMgdmVyc2lvbiBpcyB1c2VkIHdoZW4gY3JlYXRpbmcgZW50cmllcworICAgICAqIGFzIHBhcnQgb2YgTWFwIGNvbnN0cnVjdGlvbiBvciAicHNldWRvLWNvbnN0cnVjdGlvbiIgKGNsb25pbmcsCisgICAgICogZGVzZXJpYWxpemF0aW9uKS4gIFRoaXMgdmVyc2lvbiBuZWVkbid0IHdvcnJ5IGFib3V0IHJlc2l6aW5nIHRoZSB0YWJsZS4KKyAgICAgKiA8cC8+CisgICAgICogU3ViY2xhc3Mgb3ZlcnJpZGVzIHRoaXMgdG8gYWx0ZXIgdGhlIGJlaGF2aW9yIG9mIEhhc2hNYXAoTWFwKSwKKyAgICAgKiBjbG9uZSwgYW5kIHJlYWRPYmplY3QuCisgICAgICovCisgICAgdm9pZCBjcmVhdGVFbnRyeShmaW5hbCBpbnQgaGFzaCwgZmluYWwgSyBrZXksIGZpbmFsIFYgdmFsdWUsIGZpbmFsIGludCBidWNrZXRJbmRleCkgeworICAgICAgICBmaW5hbCBFbnRyeTxLLCBWPiBlID0gdGFibGVbYnVja2V0SW5kZXhdOworICAgICAgICB0YWJsZVtidWNrZXRJbmRleF0gPSBuZXcgRW50cnk8SywgVj4oaGFzaCwga2V5LCB2YWx1ZSwgZSk7CisgICAgICAgIHNpemUrKzsKKyAgICB9CisKKyAgICBwcml2YXRlIGFic3RyYWN0IGNsYXNzIEhhc2hJdGVyYXRvcjxFPiBpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+IHsKKworICAgICAgICBFbnRyeTxLLCBWPiBuZXh0OyAgICAvLyBuZXh0IGVudHJ5IHRvIHJldHVybgorICAgICAgICBpbnQgZXhwZWN0ZWRNb2RDb3VudDsgICAgLy8gRm9yIGZhc3QtZmFpbAorICAgICAgICBpbnQgaW5kZXg7ICAgICAgICAvLyBjdXJyZW50IHNsb3QKKyAgICAgICAgRW50cnk8SywgVj4gY3VycmVudDsgICAgLy8gY3VycmVudCBlbnRyeQorCisgICAgICAgIEhhc2hJdGVyYXRvcigpIHsKKyAgICAgICAgICAgIGV4cGVjdGVkTW9kQ291bnQgPSBtb2RDb3VudDsKKyAgICAgICAgICAgIGZpbmFsIEVudHJ5PEssIFY+W10gdCA9IHRhYmxlOworICAgICAgICAgICAgaW50IGkgPSB0Lmxlbmd0aDsKKyAgICAgICAgICAgIEVudHJ5PEssIFY+IG4gPSBudWxsOworICAgICAgICAgICAgaWYgKHNpemUgIT0gMCkgeyAvLyBhZHZhbmNlIHRvIGZpcnN0IGVudHJ5CisgICAgICAgICAgICAgICAgLy9ub2luc3BlY3Rpb24gU3RhdGVtZW50V2l0aEVtcHR5Qm9keQorICAgICAgICAgICAgICAgIHdoaWxlIChpID4gMCAmJiAobiA9IHRbLS1pXSkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5leHQgPSBuOworICAgICAgICAgICAgaW5kZXggPSBpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV4dCAhPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgRW50cnk8SywgVj4gbmV4dEVudHJ5KCkgeworICAgICAgICAgICAgaWYgKG1vZENvdW50ICE9IGV4cGVjdGVkTW9kQ291bnQpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgRW50cnk8SywgVj4gZSA9IG5leHQ7CisgICAgICAgICAgICBpZiAoZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRW50cnk8SywgVj4gbiA9IGUubmV4dDsKKyAgICAgICAgICAgIGZpbmFsIEVudHJ5PEssIFY+W10gdCA9IHRhYmxlOworICAgICAgICAgICAgaW50IGkgPSBpbmRleDsKKyAgICAgICAgICAgIHdoaWxlIChuID09IG51bGwgJiYgaSA+IDApIHsKKyAgICAgICAgICAgICAgICBuID0gdFstLWldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5kZXggPSBpOworICAgICAgICAgICAgbmV4dCA9IG47CisgICAgICAgICAgICByZXR1cm4gY3VycmVudCA9IGU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeworICAgICAgICAgICAgaWYgKGN1cnJlbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtb2RDb3VudCAhPSBleHBlY3RlZE1vZENvdW50KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIEsgayA9IGN1cnJlbnQua2V5OworICAgICAgICAgICAgY3VycmVudCA9IG51bGw7CisgICAgICAgICAgICBLZXlDb21wYXJhdG9ySGFzaE1hcC50aGlzLnJlbW92ZUVudHJ5Rm9yS2V5KGspOworICAgICAgICAgICAgZXhwZWN0ZWRNb2RDb3VudCA9IG1vZENvdW50OworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBWYWx1ZUl0ZXJhdG9yIGV4dGVuZHMgSGFzaEl0ZXJhdG9yPFY+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFYgbmV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXh0RW50cnkoKS52YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgS2V5SXRlcmF0b3IgZXh0ZW5kcyBIYXNoSXRlcmF0b3I8Sz4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSyBuZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5leHRFbnRyeSgpLmdldEtleSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBFbnRyeUl0ZXJhdG9yIGV4dGVuZHMgSGFzaEl0ZXJhdG9yPE1hcC5FbnRyeTxLLCBWPj4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTWFwLkVudHJ5PEssIFY+IG5leHQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV4dEVudHJ5KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTdWJjbGFzcyBvdmVycmlkZXMgdGhlc2UgdG8gYWx0ZXIgYmVoYXZpb3Igb2Ygdmlld3MnIGl0ZXJhdG9yKCkgbWV0aG9kCisgICAgSXRlcmF0b3I8Sz4gbmV3S2V5SXRlcmF0b3IoKSB7CisgICAgICAgIHJldHVybiBuZXcgS2V5SXRlcmF0b3IoKTsKKyAgICB9CisKKyAgICBJdGVyYXRvcjxWPiBuZXdWYWx1ZUl0ZXJhdG9yKCkgeworICAgICAgICByZXR1cm4gbmV3IFZhbHVlSXRlcmF0b3IoKTsKKyAgICB9CisKKyAgICBJdGVyYXRvcjxNYXAuRW50cnk8SywgVj4+IG5ld0VudHJ5SXRlcmF0b3IoKSB7CisgICAgICAgIHJldHVybiBuZXcgRW50cnlJdGVyYXRvcigpOworICAgIH0KKworICAgIC8vIFZpZXdzCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgU2V0PE1hcC5FbnRyeTxLLCBWPj4gZW50cnlTZXQgPSBudWxsOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGNvbGxlY3Rpb24gdmlldyBvZiB0aGUgbWFwcGluZ3MgY29udGFpbmVkIGluIHRoaXMgbWFwLiAgRWFjaAorICAgICAqIGVsZW1lbnQgaW4gdGhlIHJldHVybmVkIGNvbGxlY3Rpb24gaXMgYSA8dHQ+TWFwLkVudHJ5PC90dD4uICBUaGUKKyAgICAgKiBjb2xsZWN0aW9uIGlzIGJhY2tlZCBieSB0aGUgbWFwLCBzbyBjaGFuZ2VzIHRvIHRoZSBtYXAgYXJlIHJlZmxlY3RlZCBpbgorICAgICAqIHRoZSBjb2xsZWN0aW9uLCBhbmQgdmljZS12ZXJzYS4gIFRoZSBjb2xsZWN0aW9uIHN1cHBvcnRzIGVsZW1lbnQKKyAgICAgKiByZW1vdmFsLCB3aGljaCByZW1vdmVzIHRoZSBjb3JyZXNwb25kaW5nIG1hcHBpbmcgZnJvbSB0aGUgbWFwLCB2aWEgdGhlCisgICAgICogPHR0Pkl0ZXJhdG9yLnJlbW92ZTwvdHQ+LCA8dHQ+Q29sbGVjdGlvbi5yZW1vdmU8L3R0PiwKKyAgICAgKiA8dHQ+cmVtb3ZlQWxsPC90dD4sIDx0dD5yZXRhaW5BbGw8L3R0PiwgYW5kIDx0dD5jbGVhcjwvdHQ+IG9wZXJhdGlvbnMuCisgICAgICogSXQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgPHR0PmFkZDwvdHQ+IG9yIDx0dD5hZGRBbGw8L3R0PiBvcGVyYXRpb25zLgorICAgICAqCisgICAgICogQHJldHVybiBhIGNvbGxlY3Rpb24gdmlldyBvZiB0aGUgbWFwcGluZ3MgY29udGFpbmVkIGluIHRoaXMgbWFwLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8TWFwLkVudHJ5PEssIFY+PiBlbnRyeVNldCgpIHsKKyAgICAgICAgZmluYWwgU2V0PE1hcC5FbnRyeTxLLCBWPj4gZXMgPSBlbnRyeVNldDsKKyAgICAgICAgcmV0dXJuIChlcyAhPSBudWxsID8gZXMgOiAoZW50cnlTZXQgPSAoU2V0PE1hcC5FbnRyeTxLLCBWPj4pIG5ldyBFbnRyeVNldCgpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBFbnRyeVNldCBleHRlbmRzIEFic3RyYWN0U2V0Lyo8TWFwLkVudHJ5PEssVj4+Ki8geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSXRlcmF0b3IvKjxNYXAuRW50cnk8SyxWPj4qLyBpdGVyYXRvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXdFbnRyeUl0ZXJhdG9yKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoZmluYWwgT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBNYXAuRW50cnkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgTWFwLkVudHJ5PEssIFY+IGUgPSAoTWFwLkVudHJ5PEssIFY+KSBvOworICAgICAgICAgICAgZmluYWwgRW50cnk8SywgVj4gY2FuZGlkYXRlID0gZ2V0RW50cnkoZS5nZXRLZXkoKSk7CisgICAgICAgICAgICByZXR1cm4gY2FuZGlkYXRlICE9IG51bGwgJiYgY2FuZGlkYXRlLmVxdWFscyhlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoZmluYWwgT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIHJldHVybiByZW1vdmVNYXBwaW5nKG8pICE9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICAgICAgcmV0dXJuIHNpemU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7CisgICAgICAgICAgICBLZXlDb21wYXJhdG9ySGFzaE1hcC50aGlzLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTYXZlIHRoZSBzdGF0ZSBvZiB0aGUgPHR0Pkhhc2hNYXA8L3R0PiBpbnN0YW5jZSB0byBhIHN0cmVhbSAoaS5lLiwKKyAgICAgKiBzZXJpYWxpemUgaXQpLgorICAgICAqCisgICAgICogQHNlcmlhbERhdGEgVGhlIDxpPmNhcGFjaXR5PC9pPiBvZiB0aGUgSGFzaE1hcCAodGhlIGxlbmd0aCBvZiB0aGUKKyAgICAgKiBidWNrZXQgYXJyYXkpIGlzIGVtaXR0ZWQgKGludCksIGZvbGxvd2VkICBieSB0aGUKKyAgICAgKiA8aT5zczwvaT4gb2YgdGhlIEhhc2hNYXAgKHRoZSBudW1iZXIgb2Yga2V5LXZhbHVlCisgICAgICogbWFwcGluZ3MpLCBmb2xsb3dlZCBieSB0aGUga2V5IChPYmplY3QpIGFuZCB2YWx1ZSAoT2JqZWN0KQorICAgICAqIGZvciBlYWNoIGtleS12YWx1ZSBtYXBwaW5nIHJlcHJlc2VudGVkIGJ5IHRoZSBIYXNoTWFwCisgICAgICogVGhlIGtleS12YWx1ZSBtYXBwaW5ncyBhcmUgZW1pdHRlZCBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5CisgICAgICogYXJlIHJldHVybmVkIGJ5IDx0dD5lbnRyeVNldCgpLml0ZXJhdG9yKCk8L3R0Pi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgd3JpdGVPYmplY3QoZmluYWwgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW0gcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSXRlcmF0b3I8TWFwLkVudHJ5PEssIFY+PiBpID0gZW50cnlTZXQoKS5pdGVyYXRvcigpOworCisgICAgICAgIC8vIFdyaXRlIG91dCB0aGUgdGhyZXNob2xkLCBsb2FkZmFjdG9yLCBhbmQgYW55IGhpZGRlbiBzdHVmZgorICAgICAgICBzLmRlZmF1bHRXcml0ZU9iamVjdCgpOworCisgICAgICAgIC8vIFdyaXRlIG91dCBudW1iZXIgb2YgYnVja2V0cworICAgICAgICBzLndyaXRlSW50KHRhYmxlLmxlbmd0aCk7CisKKyAgICAgICAgLy8gV3JpdGUgb3V0IHNzIChudW1iZXIgb2YgTWFwcGluZ3MpCisgICAgICAgIHMud3JpdGVJbnQoc2l6ZSk7CisKKyAgICAgICAgLy8gV3JpdGUgb3V0IGtleXMgYW5kIHZhbHVlcyAoYWx0ZXJuYXRpbmcpCisgICAgICAgIHdoaWxlIChpLmhhc05leHQoKSkgeworICAgICAgICAgICAgZmluYWwgTWFwLkVudHJ5PEssIFY+IGUgPSBpLm5leHQoKTsKKyAgICAgICAgICAgIHMud3JpdGVPYmplY3QoZS5nZXRLZXkoKSk7CisgICAgICAgICAgICBzLndyaXRlT2JqZWN0KGUuZ2V0VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWNvbnN0aXR1dGUgdGhlIDx0dD5IYXNoTWFwPC90dD4gaW5zdGFuY2UgZnJvbSBhIHN0cmVhbSAoaS5lLiwKKyAgICAgKiBkZXNlcmlhbGl6ZSBpdCkuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoZmluYWwgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbSBzKSB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICAvLyBSZWFkIGluIHRoZSB0aHJlc2hvbGQsIGxvYWRmYWN0b3IsIGFuZCBhbnkgaGlkZGVuIHN0dWZmCisgICAgICAgIHMuZGVmYXVsdFJlYWRPYmplY3QoKTsKKworICAgICAgICAvLyBSZWFkIGluIG51bWJlciBvZiBidWNrZXRzIGFuZCBhbGxvY2F0ZSB0aGUgYnVja2V0IGFycmF5OworICAgICAgICBmaW5hbCBpbnQgbnVtQnVja2V0cyA9IHMucmVhZEludCgpOworICAgICAgICB0YWJsZSA9IG5ldyBFbnRyeVtudW1CdWNrZXRzXTsKKworICAgICAgICBpbml0KCk7ICAvLyBHaXZlIHN1YmNsYXNzIGEgY2hhbmNlIHRvIGRvIGl0cyB0aGluZy4KKworICAgICAgICAvLyBSZWFkIGluIHNzIChudW1iZXIgb2YgTWFwcGluZ3MpCisgICAgICAgIGZpbmFsIGludCBzcyA9IHMucmVhZEludCgpOworCisgICAgICAgIC8vIFJlYWQgdGhlIGtleXMgYW5kIHZhbHVlcywgYW5kIHB1dCB0aGUgbWFwcGluZ3MgaW4gdGhlIEhhc2hNYXAKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzczsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBLIGtleSA9IChLKSBzLnJlYWRPYmplY3QoKTsKKyAgICAgICAgICAgIGZpbmFsIFYgdmFsdWUgPSAoVikgcy5yZWFkT2JqZWN0KCk7CisgICAgICAgICAgICBwdXRGb3JDcmVhdGUoa2V5LCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGVzZSBtZXRob2RzIGFyZSB1c2VkIHdoZW4gc2VyaWFsaXppbmcgSGFzaFNldHMKKyAgICBpbnQgY2FwYWNpdHkoKSB7CisgICAgICAgIHJldHVybiB0YWJsZS5sZW5ndGg7CisgICAgfQorCisgICAgZmxvYXQgbG9hZEZhY3RvcigpIHsKKyAgICAgICAgcmV0dXJuIGxvYWRGYWN0b3I7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL2NvbGxlY3Rpb24vS2V5Q29tcGFyYXRvckxpbmtlZEhhc2hNYXAuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9jb2xsZWN0aW9uL0tleUNvbXBhcmF0b3JMaW5rZWRIYXNoTWFwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBmMjkyOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9jb2xsZWN0aW9uL0tleUNvbXBhcmF0b3JMaW5rZWRIYXNoTWFwLmphdmEKQEAgLTAsMCArMSw0MzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkNvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CisKKy8qKgorICogQSBpbXBsZW1lbnRhdGlvbiBzaW1pbGFyIHRvIHtAbGluayBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcH0gYnV0IHN1cHBvcnRzIHRoZQorICogY29tcGFyaXNvbiBvZiBrZXlzIHVzaW5nIGEge0BsaW5rIEtleUNvbXBhcmF0b3J9LgorICoKKyAqIEBwYXJhbSA8Sz4gVHlwZSBvZiBrZXlzCisgKiBAcGFyYW0gPFY+IFR5cGUgb2YgdmFsdWVzCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKi8KK3B1YmxpYyBjbGFzcyBLZXlDb21wYXJhdG9yTGlua2VkSGFzaE1hcDxLLCBWPgorICAgICAgICBleHRlbmRzIEtleUNvbXBhcmF0b3JIYXNoTWFwPEssIFY+CisgICAgICAgIGltcGxlbWVudHMgTWFwPEssIFY+IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDM4MDExMjQyNDI4MjAyMTkxMzFMOworICAgIC8qKgorICAgICAqIFRoZSBoZWFkIG9mIHRoZSBkb3VibHkgbGlua2VkIGxpc3QuCisgICAgICovCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgRW50cnk8SywgVj4gaGVhZGVyOworICAgIC8qKgorICAgICAqIFRoZSBpdGVyYXRpb24gb3JkZXJpbmcgbWV0aG9kIGZvciB0aGlzIGxpbmtlZCBoYXNoIG1hcDogPHR0PnRydWU8L3R0PgorICAgICAqIGZvciBhY2Nlc3Mtb3JkZXIsIDx0dD5mYWxzZTwvdHQ+IGZvciBpbnNlcnRpb24tb3JkZXIuCisgICAgICoKKyAgICAgKiBAc2VyaWFsCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGFjY2Vzc09yZGVyOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBlbXB0eSBpbnNlcnRpb24tb3JkZXJlZCA8dHQ+TGlua2VkSGFzaE1hcDwvdHQ+IGluc3RhbmNlCisgICAgICogd2l0aCB0aGUgc3BlY2lmaWVkIGluaXRpYWwgY2FwYWNpdHkgYW5kIGxvYWQgZmFjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtICBpbml0aWFsQ2FwYWNpdHkgdGhlIGluaXRpYWwgY2FwYWNpdHkKKyAgICAgKiBAcGFyYW0gIGxvYWRGYWN0b3IgICAgICB0aGUgbG9hZCBmYWN0b3IKKyAgICAgKiBAcGFyYW0ga2V5Q29tcGFyYXRvciAgICB0aGUgY29tcGFyYXRvcgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBpbml0aWFsIGNhcGFjaXR5IGlzIG5lZ2F0aXZlCisgICAgICogICAgICAgICBvciB0aGUgbG9hZCBmYWN0b3IgaXMgbm9ucG9zaXRpdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgS2V5Q29tcGFyYXRvckxpbmtlZEhhc2hNYXAoaW50IGluaXRpYWxDYXBhY2l0eSwgZmxvYXQgbG9hZEZhY3RvciwKKyAgICAgICAgICAgIEtleUNvbXBhcmF0b3I8Sz4ga2V5Q29tcGFyYXRvcikgeworICAgICAgICBzdXBlcihpbml0aWFsQ2FwYWNpdHksIGxvYWRGYWN0b3IsIGtleUNvbXBhcmF0b3IpOworICAgICAgICBhY2Nlc3NPcmRlciA9IGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gZW1wdHkgaW5zZXJ0aW9uLW9yZGVyZWQgPHR0PkxpbmtlZEhhc2hNYXA8L3R0PiBpbnN0YW5jZQorICAgICAqIHdpdGggdGhlIHNwZWNpZmllZCBpbml0aWFsIGNhcGFjaXR5IGFuZCBhIGRlZmF1bHQgbG9hZCBmYWN0b3IgKDAuNzUpLgorICAgICAqCisgICAgICogQHBhcmFtICBpbml0aWFsQ2FwYWNpdHkgdGhlIGluaXRpYWwgY2FwYWNpdHkKKyAgICAgKiBAcGFyYW0ga2V5Q29tcGFyYXRvciB0aGUgY29tcGFyYXRvcgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBpbml0aWFsIGNhcGFjaXR5IGlzIG5lZ2F0aXZlCisgICAgICovCisgICAgcHVibGljIEtleUNvbXBhcmF0b3JMaW5rZWRIYXNoTWFwKGludCBpbml0aWFsQ2FwYWNpdHksCisgICAgICAgICAgICBLZXlDb21wYXJhdG9yPEs+IGtleUNvbXBhcmF0b3IpIHsKKyAgICAgICAgc3VwZXIoaW5pdGlhbENhcGFjaXR5LCBrZXlDb21wYXJhdG9yKTsKKyAgICAgICAgYWNjZXNzT3JkZXIgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGVtcHR5IGluc2VydGlvbi1vcmRlcmVkIDx0dD5MaW5rZWRIYXNoTWFwPC90dD4gaW5zdGFuY2UKKyAgICAgKiB3aXRoIHRoZSBkZWZhdWx0IGluaXRpYWwgY2FwYWNpdHkgKDE2KSBhbmQgbG9hZCBmYWN0b3IgKDAuNzUpLgorICAgICAqIEBwYXJhbSBrZXlDb21wYXJhdG9yIHRoZSBjb21wYXJhdG9yCisgICAgICovCisgICAgcHVibGljIEtleUNvbXBhcmF0b3JMaW5rZWRIYXNoTWFwKEtleUNvbXBhcmF0b3I8Sz4ga2V5Q29tcGFyYXRvcikgeworICAgICAgICBzdXBlcihrZXlDb21wYXJhdG9yKTsKKyAgICAgICAgYWNjZXNzT3JkZXIgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGluc2VydGlvbi1vcmRlcmVkIDx0dD5MaW5rZWRIYXNoTWFwPC90dD4gaW5zdGFuY2Ugd2l0aAorICAgICAqIHRoZSBzYW1lIG1hcHBpbmdzIGFzIHRoZSBzcGVjaWZpZWQgbWFwLiAgVGhlIDx0dD5MaW5rZWRIYXNoTWFwPC90dD4KKyAgICAgKiBpbnN0YW5jZSBpcyBjcmVhdGVkIHdpdGggYSBkZWZhdWx0IGxvYWQgZmFjdG9yICgwLjc1KSBhbmQgYW4gaW5pdGlhbAorICAgICAqIGNhcGFjaXR5IHN1ZmZpY2llbnQgdG8gaG9sZCB0aGUgbWFwcGluZ3MgaW4gdGhlIHNwZWNpZmllZCBtYXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gIG0gdGhlIG1hcCB3aG9zZSBtYXBwaW5ncyBhcmUgdG8gYmUgcGxhY2VkIGluIHRoaXMgbWFwCisgICAgICogQHBhcmFtIGtleUNvbXBhcmF0b3IgdGhlIGNvbXBhcmF0b3IKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgbWFwIGlzIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgS2V5Q29tcGFyYXRvckxpbmtlZEhhc2hNYXAoTWFwPD8gZXh0ZW5kcyBLLCA/IGV4dGVuZHMgVj4gbSwKKyAgICAgICAgICAgIEtleUNvbXBhcmF0b3I8Sz4ga2V5Q29tcGFyYXRvcikgeworICAgICAgICBzdXBlcihtLCBrZXlDb21wYXJhdG9yKTsKKyAgICAgICAgYWNjZXNzT3JkZXIgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGVtcHR5IDx0dD5MaW5rZWRIYXNoTWFwPC90dD4gaW5zdGFuY2Ugd2l0aCB0aGUKKyAgICAgKiBzcGVjaWZpZWQgaW5pdGlhbCBjYXBhY2l0eSwgbG9hZCBmYWN0b3IgYW5kIG9yZGVyaW5nIG1vZGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gIGluaXRpYWxDYXBhY2l0eSB0aGUgaW5pdGlhbCBjYXBhY2l0eQorICAgICAqIEBwYXJhbSAgbG9hZEZhY3RvciAgICAgIHRoZSBsb2FkIGZhY3RvcgorICAgICAqIEBwYXJhbSAgYWNjZXNzT3JkZXIgICAgIHRoZSBvcmRlcmluZyBtb2RlIC0gPHR0PnRydWU8L3R0PiBmb3IKKyAgICAgKiAgICAgICAgIGFjY2Vzcy1vcmRlciwgPHR0PmZhbHNlPC90dD4gZm9yIGluc2VydGlvbi1vcmRlcgorICAgICAqIEBwYXJhbSBrZXlDb21wYXJhdG9yIHRoZSBjb21wYXJhdG9yCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGluaXRpYWwgY2FwYWNpdHkgaXMgbmVnYXRpdmUKKyAgICAgKiAgICAgICAgIG9yIHRoZSBsb2FkIGZhY3RvciBpcyBub25wb3NpdGl2ZQorICAgICAqLworICAgIHB1YmxpYyBLZXlDb21wYXJhdG9yTGlua2VkSGFzaE1hcChpbnQgaW5pdGlhbENhcGFjaXR5LAorICAgICAgICAgICAgZmxvYXQgbG9hZEZhY3RvciwKKyAgICAgICAgICAgIGJvb2xlYW4gYWNjZXNzT3JkZXIsIEtleUNvbXBhcmF0b3I8Sz4ga2V5Q29tcGFyYXRvcikgeworICAgICAgICBzdXBlcihpbml0aWFsQ2FwYWNpdHksIGxvYWRGYWN0b3IsIGtleUNvbXBhcmF0b3IpOworICAgICAgICB0aGlzLmFjY2Vzc09yZGVyID0gYWNjZXNzT3JkZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsbGVkIGJ5IHN1cGVyY2xhc3MgY29uc3RydWN0b3JzIGFuZCBwc2V1ZG9jb25zdHJ1Y3RvcnMgKGNsb25lLAorICAgICAqIHJlYWRPYmplY3QpIGJlZm9yZSBhbnkgZW50cmllcyBhcmUgaW5zZXJ0ZWQgaW50byB0aGUgbWFwLiAgSW5pdGlhbGl6ZXMKKyAgICAgKiB0aGUgY2hhaW4uCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgdm9pZCBpbml0KCkgeworICAgICAgICBoZWFkZXIgPSBuZXcgRW50cnk8SywgVj4oLTEsIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICBoZWFkZXIuYmVmb3JlID0gaGVhZGVyLmFmdGVyID0gaGVhZGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyYW5zZmVycyBhbGwgZW50cmllcyB0byBuZXcgdGFibGUgYXJyYXkuICBUaGlzIG1ldGhvZCBpcyBjYWxsZWQKKyAgICAgKiBieSBzdXBlcmNsYXNzIHJlc2l6ZS4gIEl0IGlzIG92ZXJyaWRkZW4gZm9yIHBlcmZvcm1hbmNlLCBhcyBpdCBpcworICAgICAqIGZhc3RlciB0byBpdGVyYXRlIHVzaW5nIG91ciBsaW5rZWQgbGlzdC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICB2b2lkIHRyYW5zZmVyKEtleUNvbXBhcmF0b3JIYXNoTWFwLkVudHJ5W10gbmV3VGFibGUpIHsKKyAgICAgICAgaW50IG5ld0NhcGFjaXR5ID0gbmV3VGFibGUubGVuZ3RoOworICAgICAgICBmb3IgKEVudHJ5PEssIFY+IGUgPSBoZWFkZXIuYWZ0ZXI7IGUgIT0gaGVhZGVyOyBlID0gZS5hZnRlcikgeworICAgICAgICAgICAgaW50IGluZGV4ID0gaW5kZXhGb3IoZS5oYXNoLCBuZXdDYXBhY2l0eSk7CisgICAgICAgICAgICBlLm5leHQgPSBuZXdUYWJsZVtpbmRleF07CisgICAgICAgICAgICBuZXdUYWJsZVtpbmRleF0gPSBlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoaXMgbWFwIG1hcHMgb25lIG9yIG1vcmUga2V5cyB0byB0aGUKKyAgICAgKiBzcGVjaWZpZWQgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgdmFsdWUgd2hvc2UgcHJlc2VuY2UgaW4gdGhpcyBtYXAgaXMgdG8gYmUgdGVzdGVkCisgICAgICogQHJldHVybiA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoaXMgbWFwIG1hcHMgb25lIG9yIG1vcmUga2V5cyB0byB0aGUKKyAgICAgKiAgICAgICAgIHNwZWNpZmllZCB2YWx1ZQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zVmFsdWUoT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIC8vIE92ZXJyaWRkZW4gdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgZmFzdGVyIGl0ZXJhdG9yCisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKEVudHJ5IGUgPSBoZWFkZXIuYWZ0ZXI7IGUgIT0gaGVhZGVyOyBlID0gZS5hZnRlcikgeworICAgICAgICAgICAgICAgIGlmIChlLnZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChFbnRyeSBlID0gaGVhZGVyLmFmdGVyOyBlICE9IGhlYWRlcjsgZSA9IGUuYWZ0ZXIpIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUuZXF1YWxzKGUudmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUgdG8gd2hpY2ggdGhlIHNwZWNpZmllZCBrZXkgaXMgbWFwcGVkLAorICAgICAqIG9yIHtAY29kZSBudWxsfSBpZiB0aGlzIG1hcCBjb250YWlucyBubyBtYXBwaW5nIGZvciB0aGUga2V5LgorICAgICAqCisgICAgICogPHA+TW9yZSBmb3JtYWxseSwgaWYgdGhpcyBtYXAgY29udGFpbnMgYSBtYXBwaW5nIGZyb20gYSBrZXkKKyAgICAgKiB7QGNvZGUga30gdG8gYSB2YWx1ZSB7QGNvZGUgdn0gc3VjaCB0aGF0IHtAY29kZSAoa2V5PT1udWxsID8gaz09bnVsbCA6CisgICAgICoga2V5LmVxdWFscyhrKSl9LCB0aGVuIHRoaXMgbWV0aG9kIHJldHVybnMge0Bjb2RlIHZ9OyBvdGhlcndpc2UKKyAgICAgKiBpdCByZXR1cm5zIHtAY29kZSBudWxsfS4gIChUaGVyZSBjYW4gYmUgYXQgbW9zdCBvbmUgc3VjaCBtYXBwaW5nLikKKyAgICAgKgorICAgICAqIDxwPkEgcmV0dXJuIHZhbHVlIG9mIHtAY29kZSBudWxsfSBkb2VzIG5vdCA8aT5uZWNlc3NhcmlseTwvaT4KKyAgICAgKiBpbmRpY2F0ZSB0aGF0IHRoZSBtYXAgY29udGFpbnMgbm8gbWFwcGluZyBmb3IgdGhlIGtleTsgaXQncyBhbHNvCisgICAgICogcG9zc2libGUgdGhhdCB0aGUgbWFwIGV4cGxpY2l0bHkgbWFwcyB0aGUga2V5IHRvIHtAY29kZSBudWxsfS4KKyAgICAgKiBUaGUge0BsaW5rICNjb250YWluc0tleSBjb250YWluc0tleX0gb3BlcmF0aW9uIG1heSBiZSB1c2VkIHRvCisgICAgICogZGlzdGluZ3Vpc2ggdGhlc2UgdHdvIGNhc2VzLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBWIGdldChPYmplY3Qga2V5KSB7CisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICBFbnRyeTxLLCBWPiBlID0gKEVudHJ5PEssIFY+KSBnZXRFbnRyeSgoSykga2V5KTsKKyAgICAgICAgaWYgKGUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgZS5yZWNvcmRBY2Nlc3ModGhpcyk7CisgICAgICAgIHJldHVybiBlLnZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYWxsIG9mIHRoZSBtYXBwaW5ncyBmcm9tIHRoaXMgbWFwLgorICAgICAqIFRoZSBtYXAgd2lsbCBiZSBlbXB0eSBhZnRlciB0aGlzIGNhbGwgcmV0dXJucy4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgc3VwZXIuY2xlYXIoKTsKKyAgICAgICAgaGVhZGVyLmJlZm9yZSA9IGhlYWRlci5hZnRlciA9IGhlYWRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMaW5rZWRIYXNoTWFwIGVudHJ5LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEVudHJ5PEssIFY+IGV4dGVuZHMgS2V5Q29tcGFyYXRvckhhc2hNYXAuRW50cnk8SywgVj4geworICAgICAgICAvLyBUaGVzZSBmaWVsZHMgY29tcHJpc2UgdGhlIGRvdWJseSBsaW5rZWQgbGlzdCB1c2VkIGZvciBpdGVyYXRpb24uCisKKyAgICAgICAgRW50cnk8SywgVj4gYmVmb3JlLCBhZnRlcjsKKworICAgICAgICBFbnRyeShpbnQgaGFzaCwgSyBrZXksIFYgdmFsdWUsIEtleUNvbXBhcmF0b3JIYXNoTWFwLkVudHJ5PEssIFY+IG5leHQpIHsKKyAgICAgICAgICAgIHN1cGVyKGhhc2gsIGtleSwgdmFsdWUsIG5leHQpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlbW92ZXMgdGhpcyBlbnRyeSBmcm9tIHRoZSBsaW5rZWQgbGlzdC4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCByZW1vdmUoKSB7CisgICAgICAgICAgICBiZWZvcmUuYWZ0ZXIgPSBhZnRlcjsKKyAgICAgICAgICAgIGFmdGVyLmJlZm9yZSA9IGJlZm9yZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbnNlcnRzIHRoaXMgZW50cnkgYmVmb3JlIHRoZSBzcGVjaWZpZWQgZXhpc3RpbmcgZW50cnkgaW4gdGhlIGxpc3QuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgYWRkQmVmb3JlKEVudHJ5PEssIFY+IGV4aXN0aW5nRW50cnkpIHsKKyAgICAgICAgICAgIGFmdGVyID0gZXhpc3RpbmdFbnRyeTsKKyAgICAgICAgICAgIGJlZm9yZSA9IGV4aXN0aW5nRW50cnkuYmVmb3JlOworICAgICAgICAgICAgYmVmb3JlLmFmdGVyID0gdGhpczsKKyAgICAgICAgICAgIGFmdGVyLmJlZm9yZSA9IHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBtZXRob2QgaXMgaW52b2tlZCBieSB0aGUgc3VwZXJjbGFzcyB3aGVuZXZlciB0aGUgdmFsdWUKKyAgICAgICAgICogb2YgYSBwcmUtZXhpc3RpbmcgZW50cnkgaXMgcmVhZCBieSBNYXAuZ2V0IG9yIG1vZGlmaWVkIGJ5IE1hcC5zZXQuCisgICAgICAgICAqIElmIHRoZSBlbmNsb3NpbmcgTWFwIGlzIGFjY2Vzcy1vcmRlcmVkLCBpdCBtb3ZlcyB0aGUgZW50cnkKKyAgICAgICAgICogdG8gdGhlIGVuZCBvZiB0aGUgbGlzdDsgb3RoZXJ3aXNlLCBpdCBkb2VzIG5vdGhpbmcuCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgdm9pZCByZWNvcmRBY2Nlc3MoS2V5Q29tcGFyYXRvckhhc2hNYXA8SywgVj4gbSkgeworICAgICAgICAgICAgS2V5Q29tcGFyYXRvckxpbmtlZEhhc2hNYXA8SywgVj4gbG0gPSAoS2V5Q29tcGFyYXRvckxpbmtlZEhhc2hNYXA8SywgVj4pIG07CisgICAgICAgICAgICBpZiAobG0uYWNjZXNzT3JkZXIpIHsKKyAgICAgICAgICAgICAgICBsbS5tb2RDb3VudCsrOworICAgICAgICAgICAgICAgIHJlbW92ZSgpOworICAgICAgICAgICAgICAgIGFkZEJlZm9yZShsbS5oZWFkZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHZvaWQgcmVjb3JkUmVtb3ZhbChLZXlDb21wYXJhdG9ySGFzaE1hcDxLLCBWPiBtKSB7CisgICAgICAgICAgICByZW1vdmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmVxdWFscyhvYmopOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYWJzdHJhY3QgY2xhc3MgTGlua2VkSGFzaEl0ZXJhdG9yPFQ+IGltcGxlbWVudHMgSXRlcmF0b3I8VD4geworCisgICAgICAgIEVudHJ5PEssIFY+IG5leHRFbnRyeSA9IGhlYWRlci5hZnRlcjsKKyAgICAgICAgRW50cnk8SywgVj4gbGFzdFJldHVybmVkID0gbnVsbDsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBtb2RDb3VudCB2YWx1ZSB0aGF0IHRoZSBpdGVyYXRvciBiZWxpZXZlcyB0aGF0IHRoZSBiYWNraW5nCisgICAgICAgICAqIExpc3Qgc2hvdWxkIGhhdmUuICBJZiB0aGlzIGV4cGVjdGF0aW9uIGlzIHZpb2xhdGVkLCB0aGUgaXRlcmF0b3IKKyAgICAgICAgICogaGFzIGRldGVjdGVkIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgaW50IGV4cGVjdGVkTW9kQ291bnQgPSBtb2RDb3VudDsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXh0RW50cnkgIT0gaGVhZGVyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKKyAgICAgICAgICAgIGlmIChsYXN0UmV0dXJuZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtb2RDb3VudCAhPSBleHBlY3RlZE1vZENvdW50KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgS2V5Q29tcGFyYXRvckxpbmtlZEhhc2hNYXAudGhpcy5yZW1vdmUobGFzdFJldHVybmVkLmtleSk7CisgICAgICAgICAgICBsYXN0UmV0dXJuZWQgPSBudWxsOworICAgICAgICAgICAgZXhwZWN0ZWRNb2RDb3VudCA9IG1vZENvdW50OworICAgICAgICB9CisKKyAgICAgICAgRW50cnk8SywgVj4gbmV4dEVudHJ5KCkgeworICAgICAgICAgICAgaWYgKG1vZENvdW50ICE9IGV4cGVjdGVkTW9kQ291bnQpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5leHRFbnRyeSA9PSBoZWFkZXIpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBFbnRyeTxLLCBWPiBlID0gbGFzdFJldHVybmVkID0gbmV4dEVudHJ5OworICAgICAgICAgICAgbmV4dEVudHJ5ID0gZS5hZnRlcjsKKyAgICAgICAgICAgIHJldHVybiBlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBLZXlJdGVyYXRvciBleHRlbmRzIExpbmtlZEhhc2hJdGVyYXRvcjxLPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBLIG5leHQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV4dEVudHJ5KCkuZ2V0S2V5KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFZhbHVlSXRlcmF0b3IgZXh0ZW5kcyBMaW5rZWRIYXNoSXRlcmF0b3I8Vj4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgViBuZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5leHRFbnRyeSgpLnZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBFbnRyeUl0ZXJhdG9yIGV4dGVuZHMgTGlua2VkSGFzaEl0ZXJhdG9yPE1hcC5FbnRyeTxLLCBWPj4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTWFwLkVudHJ5PEssIFY+IG5leHQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV4dEVudHJ5KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBUaGVzZSBPdmVycmlkZXMgYWx0ZXIgdGhlIGJlaGF2aW9yIG9mIHN1cGVyY2xhc3MgdmlldyBpdGVyYXRvcigpIG1ldGhvZHMKKyAgICBAT3ZlcnJpZGUKKyAgICBJdGVyYXRvcjxLPiBuZXdLZXlJdGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBLZXlJdGVyYXRvcigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEl0ZXJhdG9yPFY+IG5ld1ZhbHVlSXRlcmF0b3IoKSB7CisgICAgICAgIHJldHVybiBuZXcgVmFsdWVJdGVyYXRvcigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEl0ZXJhdG9yPE1hcC5FbnRyeTxLLCBWPj4gbmV3RW50cnlJdGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFbnRyeUl0ZXJhdG9yKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBvdmVycmlkZSBhbHRlcnMgYmVoYXZpb3Igb2Ygc3VwZXJjbGFzcyBwdXQgbWV0aG9kLiBJdCBjYXVzZXMgbmV3bHkKKyAgICAgKiBhbGxvY2F0ZWQgZW50cnkgdG8gZ2V0IGluc2VydGVkIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmtlZCBsaXN0IGFuZAorICAgICAqIHJlbW92ZXMgdGhlIGVsZGVzdCBlbnRyeSBpZiBhcHByb3ByaWF0ZS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICB2b2lkIGFkZEVudHJ5KGludCBoYXNoLCBLIGtleSwgViB2YWx1ZSwgaW50IGJ1Y2tldEluZGV4KSB7CisgICAgICAgIGNyZWF0ZUVudHJ5KGhhc2gsIGtleSwgdmFsdWUsIGJ1Y2tldEluZGV4KTsKKworICAgICAgICAvLyBSZW1vdmUgZWxkZXN0IGVudHJ5IGlmIGluc3RydWN0ZWQsIGVsc2UgZ3JvdyBjYXBhY2l0eSBpZiBhcHByb3ByaWF0ZQorICAgICAgICBFbnRyeTxLLCBWPiBlbGRlc3QgPSBoZWFkZXIuYWZ0ZXI7CisgICAgICAgIGlmIChyZW1vdmVFbGRlc3RFbnRyeShlbGRlc3QpKSB7CisgICAgICAgICAgICByZW1vdmVFbnRyeUZvcktleShlbGRlc3Qua2V5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChzaXplID49IHRocmVzaG9sZCkgeworICAgICAgICAgICAgICAgIHJlc2l6ZSgyICogdGFibGUubGVuZ3RoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgb3ZlcnJpZGUgZGlmZmVycyBmcm9tIGFkZEVudHJ5IGluIHRoYXQgaXQgZG9lc24ndCByZXNpemUgdGhlCisgICAgICogdGFibGUgb3IgcmVtb3ZlIHRoZSBlbGRlc3QgZW50cnkuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgdm9pZCBjcmVhdGVFbnRyeShpbnQgaGFzaCwgSyBrZXksIFYgdmFsdWUsIGludCBidWNrZXRJbmRleCkgeworICAgICAgICBLZXlDb21wYXJhdG9ySGFzaE1hcC5FbnRyeTxLLCBWPiBvbGQgPSB0YWJsZVtidWNrZXRJbmRleF07CisgICAgICAgIEVudHJ5PEssIFY+IGUgPSBuZXcgRW50cnk8SywgVj4oaGFzaCwga2V5LCB2YWx1ZSwgb2xkKTsKKyAgICAgICAgdGFibGVbYnVja2V0SW5kZXhdID0gZTsKKyAgICAgICAgZS5hZGRCZWZvcmUoaGVhZGVyKTsKKyAgICAgICAgc2l6ZSsrOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgPHR0PnRydWU8L3R0PiBpZiB0aGlzIG1hcCBzaG91bGQgcmVtb3ZlIGl0cyBlbGRlc3QgZW50cnkuCisgICAgICogVGhpcyBtZXRob2QgaXMgaW52b2tlZCBieSA8dHQ+cHV0PC90dD4gYW5kIDx0dD5wdXRBbGw8L3R0PiBhZnRlcgorICAgICAqIGluc2VydGluZyBhIG5ldyBlbnRyeSBpbnRvIHRoZSBtYXAuICBJdCBwcm92aWRlcyB0aGUgaW1wbGVtZW50b3IKKyAgICAgKiB3aXRoIHRoZSBvcHBvcnR1bml0eSB0byByZW1vdmUgdGhlIGVsZGVzdCBlbnRyeSBlYWNoIHRpbWUgYSBuZXcgb25lCisgICAgICogaXMgYWRkZWQuICBUaGlzIGlzIHVzZWZ1bCBpZiB0aGUgbWFwIHJlcHJlc2VudHMgYSBjYWNoZTogaXQgYWxsb3dzCisgICAgICogdGhlIG1hcCB0byByZWR1Y2UgbWVtb3J5IGNvbnN1bXB0aW9uIGJ5IGRlbGV0aW5nIHN0YWxlIGVudHJpZXMuCisgICAgICoKKyAgICAgKiA8cD5TYW1wbGUgdXNlOiB0aGlzIG92ZXJyaWRlIHdpbGwgYWxsb3cgdGhlIG1hcCB0byBncm93IHVwIHRvIDEwMAorICAgICAqIGVudHJpZXMgYW5kIHRoZW4gZGVsZXRlIHRoZSBlbGRlc3QgZW50cnkgZWFjaCB0aW1lIGEgbmV3IGVudHJ5IGlzCisgICAgICogYWRkZWQsIG1haW50YWluaW5nIGEgc3RlYWR5IHN0YXRlIG9mIDEwMCBlbnRyaWVzLgorICAgICAqIDxwcmU+CisgICAgICogICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfRU5UUklFUyA9IDEwMDsKKyAgICAgKgorICAgICAqICAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVFbGRlc3RFbnRyeShNYXAuRW50cnkgZWxkZXN0KSB7CisgICAgICogICAgICAgIHJldHVybiBzaXplKCkgPiBNQVhfRU5UUklFUzsKKyAgICAgKiAgICAgfQorICAgICAqIDwvcHJlPgorICAgICAqCisgICAgICogPHA+VGhpcyBtZXRob2QgdHlwaWNhbGx5IGRvZXMgbm90IG1vZGlmeSB0aGUgbWFwIGluIGFueSB3YXksCisgICAgICogaW5zdGVhZCBhbGxvd2luZyB0aGUgbWFwIHRvIG1vZGlmeSBpdHNlbGYgYXMgZGlyZWN0ZWQgYnkgaXRzCisgICAgICogcmV0dXJuIHZhbHVlLiAgSXQgPGk+aXM8L2k+IHBlcm1pdHRlZCBmb3IgdGhpcyBtZXRob2QgdG8gbW9kaWZ5CisgICAgICogdGhlIG1hcCBkaXJlY3RseSwgYnV0IGlmIGl0IGRvZXMgc28sIGl0IDxpPm11c3Q8L2k+IHJldHVybgorICAgICAqIDx0dD5mYWxzZTwvdHQ+IChpbmRpY2F0aW5nIHRoYXQgdGhlIG1hcCBzaG91bGQgbm90IGF0dGVtcHQgYW55CisgICAgICogZnVydGhlciBtb2RpZmljYXRpb24pLiAgVGhlIGVmZmVjdHMgb2YgcmV0dXJuaW5nIDx0dD50cnVlPC90dD4KKyAgICAgKiBhZnRlciBtb2RpZnlpbmcgdGhlIG1hcCBmcm9tIHdpdGhpbiB0aGlzIG1ldGhvZCBhcmUgdW5zcGVjaWZpZWQuCisgICAgICoKKyAgICAgKiA8cD5UaGlzIGltcGxlbWVudGF0aW9uIG1lcmVseSByZXR1cm5zIDx0dD5mYWxzZTwvdHQ+IChzbyB0aGF0IHRoaXMKKyAgICAgKiBtYXAgYWN0cyBsaWtlIGEgbm9ybWFsIG1hcCAtIHRoZSBlbGRlc3QgZWxlbWVudCBpcyBuZXZlciByZW1vdmVkKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSAgICBlbGRlc3QgVGhlIGxlYXN0IHJlY2VudGx5IGluc2VydGVkIGVudHJ5IGluIHRoZSBtYXAsIG9yIGlmCisgICAgICogICAgICAgICAgIHRoaXMgaXMgYW4gYWNjZXNzLW9yZGVyZWQgbWFwLCB0aGUgbGVhc3QgcmVjZW50bHkgYWNjZXNzZWQKKyAgICAgKiAgICAgICAgICAgZW50cnkuICBUaGlzIGlzIHRoZSBlbnRyeSB0aGF0IHdpbGwgYmUgcmVtb3ZlZCBpdCB0aGlzCisgICAgICogICAgICAgICAgIG1ldGhvZCByZXR1cm5zIDx0dD50cnVlPC90dD4uICBJZiB0aGUgbWFwIHdhcyBlbXB0eSBwcmlvcgorICAgICAqICAgICAgICAgICB0byB0aGUgPHR0PnB1dDwvdHQ+IG9yIDx0dD5wdXRBbGw8L3R0PiBpbnZvY2F0aW9uIHJlc3VsdGluZworICAgICAqICAgICAgICAgICBpbiB0aGlzIGludm9jYXRpb24sIHRoaXMgd2lsbCBiZSB0aGUgZW50cnkgdGhhdCB3YXMganVzdAorICAgICAqICAgICAgICAgICBpbnNlcnRlZDsgaW4gb3RoZXIgd29yZHMsIGlmIHRoZSBtYXAgY29udGFpbnMgYSBzaW5nbGUKKyAgICAgKiAgICAgICAgICAgZW50cnksIHRoZSBlbGRlc3QgZW50cnkgaXMgYWxzbyB0aGUgbmV3ZXN0LgorICAgICAqIEByZXR1cm4gICA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoZSBlbGRlc3QgZW50cnkgc2hvdWxkIGJlIHJlbW92ZWQKKyAgICAgKiAgICAgICAgICAgZnJvbSB0aGUgbWFwOyA8dHQ+ZmFsc2U8L3R0PiBpZiBpdCBzaG91bGQgYmUgcmV0YWluZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gcmVtb3ZlRWxkZXN0RW50cnkoTWFwLkVudHJ5PEssIFY+IGVsZGVzdCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL2NvbGxlY3Rpb24vTGF6eVVuc2FmZVZhbHVlLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvY29sbGVjdGlvbi9MYXp5VW5zYWZlVmFsdWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTYzYzUyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL2NvbGxlY3Rpb24vTGF6eVVuc2FmZVZhbHVlLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb247CisKKy8qKgorICogTGF6aWx5IGluaXRpYWxpemVkIHtAbGluayBVbnNhZmVWYWx1ZSB1bnNhZmUgdmFsdWV9LgorICogPHA+CisgKiBJbnN0YW5jZXMgb2YgdGhpcyBpbnRlcmZhY2UgYXJlIGluaXRpYWxpemVkIGxhemlseSBkdXJpbmcgdGhlIGZpcnN0IGNhbGwgdG8gdGhlaXIKKyAqIHtAbGluayAjZ2V0KCkgdmFsdWUgcmV0cmlldmFsIG1ldGhvZH0uIEluZm9ybWF0aW9uIGFib3V0IHRoZSBpbml0aWFsaXphdGlvbiBzdGF0ZQorICogb2YgYSB7QGNvZGUgTGF6eVVuc2FmZVZhbHVlfSBpbnN0YW5jZSBpcyBhdmFpbGFibGUgdmlhIHtAbGluayAjaXNJbml0aWFsaXplZCgpfSBtZXRob2QuCisgKiA8L3A+CisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGludGVyZmFjZSBMYXp5VW5zYWZlVmFsdWU8VCwgRSBleHRlbmRzIFRocm93YWJsZT4gZXh0ZW5kcyBVbnNhZmVWYWx1ZTxULCBFPiB7CisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgdGhlIGxhenkgdmFsdWUgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgYWxyZWFkeSAoaS5lLiBpdHMge0BsaW5rICNnZXQoKX0gbWV0aG9kCisgICAgICogaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQgcHJldmlvdXNseSkgb3Igbm90LgorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGxhenkgdmFsdWUgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbGVhbiBpc0luaXRpYWxpemVkKCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvY29sbGVjdGlvbi9MYXp5VmFsdWUuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9jb2xsZWN0aW9uL0xhenlWYWx1ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiM2QwNzkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvY29sbGVjdGlvbi9MYXp5VmFsdWUuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbjsKKworLyoqCisgKiBMYXppbHkgaW5pdGlhbGl6ZWQge0BsaW5rIFZhbHVlIHZhbHVlfS4KKyAqIDxwPgorICogSW5zdGFuY2VzIG9mIHRoaXMgaW50ZXJmYWNlIGFyZSBpbml0aWFsaXplZCBsYXppbHkgZHVyaW5nIHRoZSBmaXJzdCBjYWxsIHRvIHRoZWlyCisgKiB7QGxpbmsgI2dldCgpIHZhbHVlIHJldHJpZXZhbCBtZXRob2R9LiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgaW5pdGlhbGl6YXRpb24gc3RhdGUKKyAqIG9mIGEge0Bjb2RlIExhenlWYWx1ZX0gaW5zdGFuY2UgaXMgYXZhaWxhYmxlIHZpYSB7QGxpbmsgI2lzSW5pdGlhbGl6ZWQoKX0gbWV0aG9kLgorICogPC9wPgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTGF6eVZhbHVlPFQ+IGV4dGVuZHMgVmFsdWU8VD4geworICAgIC8qKgorICAgICAqIENoZWNrIGlmIHRoZSBsYXp5IHZhbHVlIGhhcyBiZWVuIGluaXRpYWxpemVkIGFscmVhZHkgKGkuZS4gaXRzIHtAbGluayAjZ2V0KCl9IG1ldGhvZAorICAgICAqIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIHByZXZpb3VzbHkpIG9yIG5vdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBsYXp5IHZhbHVlIGhhcyBhbHJlYWR5IGJlZW4gaW5pdGlhbGl6ZWQsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpOworfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL2NvbGxlY3Rpb24vTGlua2VkVHJhbnNmZXJRdWV1ZS5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL2NvbGxlY3Rpb24vTGlua2VkVHJhbnNmZXJRdWV1ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkOTg3MzQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvY29sbGVjdGlvbi9MaW5rZWRUcmFuc2ZlclF1ZXVlLmphdmEKQEAgLTAsMCArMSwxMzcxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvKioKKyAqIFdyaXR0ZW4gYnkgRG91ZyBMZWEgd2l0aCBhc3Npc3RhbmNlIGZyb20gbWVtYmVycyBvZiBKQ1AgSlNSLTE2NgorICogRXhwZXJ0IEdyb3VwIGFuZCByZWxlYXNlZCB0byB0aGUgcHVibGljIGRvbWFpbiwgYXMgZXhwbGFpbmVkIGF0CisgKiBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9wdWJsaWNkb21haW4vemVyby8xLjAvCisgKi8KK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkFic3RyYWN0UXVldWU7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5RdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5Mb2NrU3VwcG9ydDsKKworLyoqCisgKiBBbiB1bmJvdW5kZWQge0BsaW5rIFRyYW5zZmVyUXVldWV9IGJhc2VkIG9uIGxpbmtlZCBub2Rlcy4KKyAqIFRoaXMgcXVldWUgb3JkZXJzIGVsZW1lbnRzIEZJRk8gKGZpcnN0LWluLWZpcnN0LW91dCkgd2l0aCByZXNwZWN0CisgKiB0byBhbnkgZ2l2ZW4gcHJvZHVjZXIuICBUaGUgPGVtPmhlYWQ8L2VtPiBvZiB0aGUgcXVldWUgaXMgdGhhdAorICogZWxlbWVudCB0aGF0IGhhcyBiZWVuIG9uIHRoZSBxdWV1ZSB0aGUgbG9uZ2VzdCB0aW1lIGZvciBzb21lCisgKiBwcm9kdWNlci4gIFRoZSA8ZW0+dGFpbDwvZW0+IG9mIHRoZSBxdWV1ZSBpcyB0aGF0IGVsZW1lbnQgdGhhdCBoYXMKKyAqIGJlZW4gb24gdGhlIHF1ZXVlIHRoZSBzaG9ydGVzdCB0aW1lIGZvciBzb21lIHByb2R1Y2VyLgorICoKKyAqIDxwPkJld2FyZSB0aGF0LCB1bmxpa2UgaW4gbW9zdCBjb2xsZWN0aW9ucywgdGhlIHtAY29kZSBzaXplfSBtZXRob2QKKyAqIGlzIDxlbT5OT1Q8L2VtPiBhIGNvbnN0YW50LXRpbWUgb3BlcmF0aW9uLiBCZWNhdXNlIG9mIHRoZQorICogYXN5bmNocm9ub3VzIG5hdHVyZSBvZiB0aGVzZSBxdWV1ZXMsIGRldGVybWluaW5nIHRoZSBjdXJyZW50IG51bWJlcgorICogb2YgZWxlbWVudHMgcmVxdWlyZXMgYSB0cmF2ZXJzYWwgb2YgdGhlIGVsZW1lbnRzLCBhbmQgc28gbWF5IHJlcG9ydAorICogaW5hY2N1cmF0ZSByZXN1bHRzIGlmIHRoaXMgY29sbGVjdGlvbiBpcyBtb2RpZmllZCBkdXJpbmcgdHJhdmVyc2FsLgorICogQWRkaXRpb25hbGx5LCB0aGUgYnVsayBvcGVyYXRpb25zIHtAY29kZSBhZGRBbGx9LAorICoge0Bjb2RlIHJlbW92ZUFsbH0sIHtAY29kZSByZXRhaW5BbGx9LCB7QGNvZGUgY29udGFpbnNBbGx9LAorICoge0Bjb2RlIGVxdWFsc30sIGFuZCB7QGNvZGUgdG9BcnJheX0gYXJlIDxlbT5ub3Q8L2VtPiBndWFyYW50ZWVkCisgKiB0byBiZSBwZXJmb3JtZWQgYXRvbWljYWxseS4gRm9yIGV4YW1wbGUsIGFuIGl0ZXJhdG9yIG9wZXJhdGluZworICogY29uY3VycmVudGx5IHdpdGggYW4ge0Bjb2RlIGFkZEFsbH0gb3BlcmF0aW9uIG1pZ2h0IHZpZXcgb25seSBzb21lCisgKiBvZiB0aGUgYWRkZWQgZWxlbWVudHMuCisgKgorICogPHA+VGhpcyBjbGFzcyBhbmQgaXRzIGl0ZXJhdG9yIGltcGxlbWVudCBhbGwgb2YgdGhlCisgKiA8ZW0+b3B0aW9uYWw8L2VtPiBtZXRob2RzIG9mIHRoZSB7QGxpbmsgQ29sbGVjdGlvbn0gYW5kIHtAbGluaworICogSXRlcmF0b3J9IGludGVyZmFjZXMuCisgKgorICogPHA+TWVtb3J5IGNvbnNpc3RlbmN5IGVmZmVjdHM6IEFzIHdpdGggb3RoZXIgY29uY3VycmVudAorICogY29sbGVjdGlvbnMsIGFjdGlvbnMgaW4gYSB0aHJlYWQgcHJpb3IgdG8gcGxhY2luZyBhbiBvYmplY3QgaW50byBhCisgKiB7QGNvZGUgTGlua2VkVHJhbnNmZXJRdWV1ZX0KKyAqIDxhIGhyZWY9InBhY2thZ2Utc3VtbWFyeS5odG1sI01lbW9yeVZpc2liaWxpdHkiPjxpPmhhcHBlbi1iZWZvcmU8L2k+PC9hPgorICogYWN0aW9ucyBzdWJzZXF1ZW50IHRvIHRoZSBhY2Nlc3Mgb3IgcmVtb3ZhbCBvZiB0aGF0IGVsZW1lbnQgZnJvbQorICogdGhlIHtAY29kZSBMaW5rZWRUcmFuc2ZlclF1ZXVlfSBpbiBhbm90aGVyIHRocmVhZC4KKyAqCisgKiA8cD5UaGlzIGNsYXNzIGlzIGEgbWVtYmVyIG9mIHRoZQorICogPGEgaHJlZj0ie0Bkb2NSb290fS8uLi90ZWNobm90ZXMvZ3VpZGVzL2NvbGxlY3Rpb25zL2luZGV4Lmh0bWwiPgorICogSmF2YSBDb2xsZWN0aW9ucyBGcmFtZXdvcms8L2E+LgorICoKKyAqIFRPRE86IERvIE5PVCByZW1vdmUgdGhpcyBjbGFzcy4gSXQncyByZWZlcmVuY2VkIGZyb20ge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5EYXRhU3RydWN0dXJlc30uCisgKgorICogQHBhcmFtIDxFPiB0aGUgdHlwZSBvZiBlbGVtZW50cyBoZWxkIGluIHRoaXMgY29sbGVjdGlvbi4KKyAqIEBhdXRob3IgRG91ZyBMZWEKKyAqLworY2xhc3MgTGlua2VkVHJhbnNmZXJRdWV1ZTxFPiBleHRlbmRzIEFic3RyYWN0UXVldWU8RT4KKyAgICAgICAgaW1wbGVtZW50cyBUcmFuc2ZlclF1ZXVlPEU+LCBqYXZhLmlvLlNlcmlhbGl6YWJsZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTMyMjMxMTM0MTAyNDgxNjM2ODZMOworCisgICAgLyoKKyAgICAgKiAqKiogT3ZlcnZpZXcgb2YgRHVhbCBRdWV1ZXMgd2l0aCBTbGFjayAqKioKKyAgICAgKgorICAgICAqIER1YWwgUXVldWVzLCBpbnRyb2R1Y2VkIGJ5IFNjaGVyZXIgYW5kIFNjb3R0CisgICAgICogKGh0dHA6Ly93d3cuY3MucmljZS5lZHUvfnduczEvcGFwZXJzLzIwMDQtRElTQy1ERFMucGRmKSBhcmUKKyAgICAgKiAobGlua2VkKSBxdWV1ZXMgaW4gd2hpY2ggbm9kZXMgbWF5IHJlcHJlc2VudCBlaXRoZXIgZGF0YSBvcgorICAgICAqIHJlcXVlc3RzLiAgV2hlbiBhIHRocmVhZCB0cmllcyB0byBlbnF1ZXVlIGEgZGF0YSBub2RlLCBidXQKKyAgICAgKiBlbmNvdW50ZXJzIGEgcmVxdWVzdCBub2RlLCBpdCBpbnN0ZWFkICJtYXRjaGVzIiBhbmQgcmVtb3ZlcyBpdDsKKyAgICAgKiBhbmQgdmljZSB2ZXJzYSBmb3IgZW5xdWV1aW5nIHJlcXVlc3RzLiBCbG9ja2luZyBEdWFsIFF1ZXVlcworICAgICAqIGFycmFuZ2UgdGhhdCB0aHJlYWRzIGVucXVldWluZyB1bm1hdGNoZWQgcmVxdWVzdHMgYmxvY2sgdW50aWwKKyAgICAgKiBvdGhlciB0aHJlYWRzIHByb3ZpZGUgdGhlIG1hdGNoLiBEdWFsIFN5bmNocm9ub3VzIFF1ZXVlcyAoc2VlCisgICAgICogU2NoZXJlciwgTGVhLCAmIFNjb3R0CisgICAgICogaHR0cDovL3d3dy5jcy5yb2NoZXN0ZXIuZWR1L3Uvc2NvdHQvcGFwZXJzLzIwMDlfU2NoZXJlcl9DQUNNX1NTUS5wZGYpCisgICAgICogYWRkaXRpb25hbGx5IGFycmFuZ2UgdGhhdCB0aHJlYWRzIGVucXVldWluZyB1bm1hdGNoZWQgZGF0YSBhbHNvCisgICAgICogYmxvY2suICBEdWFsIFRyYW5zZmVyIFF1ZXVlcyBzdXBwb3J0IGFsbCBvZiB0aGVzZSBtb2RlcywgYXMKKyAgICAgKiBkaWN0YXRlZCBieSBjYWxsZXJzLgorICAgICAqCisgICAgICogQSBGSUZPIGR1YWwgcXVldWUgbWF5IGJlIGltcGxlbWVudGVkIHVzaW5nIGEgdmFyaWF0aW9uIG9mIHRoZQorICAgICAqIE1pY2hhZWwgJiBTY290dCAoTSZTKSBsb2NrLWZyZWUgcXVldWUgYWxnb3JpdGhtCisgICAgICogKGh0dHA6Ly93d3cuY3Mucm9jaGVzdGVyLmVkdS91L3Njb3R0L3BhcGVycy8xOTk2X1BPRENfcXVldWVzLnBkZikuCisgICAgICogSXQgbWFpbnRhaW5zIHR3byBwb2ludGVyIGZpZWxkcywgImhlYWQiLCBwb2ludGluZyB0byBhCisgICAgICogKG1hdGNoZWQpIG5vZGUgdGhhdCBpbiB0dXJuIHBvaW50cyB0byB0aGUgZmlyc3QgYWN0dWFsCisgICAgICogKHVubWF0Y2hlZCkgcXVldWUgbm9kZSAob3IgbnVsbCBpZiBlbXB0eSk7IGFuZCAidGFpbCIgdGhhdAorICAgICAqIHBvaW50cyB0byB0aGUgbGFzdCBub2RlIG9uIHRoZSBxdWV1ZSAob3IgYWdhaW4gbnVsbCBpZgorICAgICAqIGVtcHR5KS4gRm9yIGV4YW1wbGUsIGhlcmUgaXMgYSBwb3NzaWJsZSBxdWV1ZSB3aXRoIGZvdXIgZGF0YQorICAgICAqIGVsZW1lbnRzOgorICAgICAqCisgICAgICogIGhlYWQgICAgICAgICAgICAgICAgdGFpbAorICAgICAqICAgIHwgICAgICAgICAgICAgICAgICAgfAorICAgICAqICAgIHYgICAgICAgICAgICAgICAgICAgdgorICAgICAqICAgIE0gLT4gVSAtPiBVIC0+IFUgLT4gVQorICAgICAqCisgICAgICogVGhlIE0mUyBxdWV1ZSBhbGdvcml0aG0gaXMga25vd24gdG8gYmUgcHJvbmUgdG8gc2NhbGFiaWxpdHkgYW5kCisgICAgICogb3ZlcmhlYWQgbGltaXRhdGlvbnMgd2hlbiBtYWludGFpbmluZyAodmlhIENBUykgdGhlc2UgaGVhZCBhbmQKKyAgICAgKiB0YWlsIHBvaW50ZXJzLiBUaGlzIGhhcyBsZWQgdG8gdGhlIGRldmVsb3BtZW50IG9mCisgICAgICogY29udGVudGlvbi1yZWR1Y2luZyB2YXJpYW50cyBzdWNoIGFzIGVsaW1pbmF0aW9uIGFycmF5cyAoc2VlCisgICAgICogTW9pciBldCBhbCBodHRwOi8vcG9ydGFsLmFjbS5vcmcvY2l0YXRpb24uY2ZtP2lkPTEwNzQwMTMpIGFuZAorICAgICAqIG9wdGltaXN0aWMgYmFjayBwb2ludGVycyAoc2VlIExhZGFuLU1vemVzICYgU2hhdml0CisgICAgICogaHR0cDovL3Blb3BsZS5jc2FpbC5taXQuZWR1L2VkeWEvcHVibGljYXRpb25zL09wdGltaXN0aWNGSUZPUXVldWUtam91cm5hbC5wZGYpLgorICAgICAqIEhvd2V2ZXIsIHRoZSBuYXR1cmUgb2YgZHVhbCBxdWV1ZXMgZW5hYmxlcyBhIHNpbXBsZXIgdGFjdGljIGZvcgorICAgICAqIGltcHJvdmluZyBNJlMtc3R5bGUgaW1wbGVtZW50YXRpb25zIHdoZW4gZHVhbC1uZXNzIGlzIG5lZWRlZC4KKyAgICAgKgorICAgICAqIEluIGEgZHVhbCBxdWV1ZSwgZWFjaCBub2RlIG11c3QgYXRvbWljYWxseSBtYWludGFpbiBpdHMgbWF0Y2gKKyAgICAgKiBzdGF0dXMuIFdoaWxlIHRoZXJlIGFyZSBvdGhlciBwb3NzaWJsZSB2YXJpYW50cywgd2UgaW1wbGVtZW50CisgICAgICogdGhpcyBoZXJlIGFzOiBmb3IgYSBkYXRhLW1vZGUgbm9kZSwgbWF0Y2hpbmcgZW50YWlscyBDQVNpbmcgYW4KKyAgICAgKiAiaXRlbSIgZmllbGQgZnJvbSBhIG5vbi1udWxsIGRhdGEgdmFsdWUgdG8gbnVsbCB1cG9uIG1hdGNoLCBhbmQKKyAgICAgKiB2aWNlLXZlcnNhIGZvciByZXF1ZXN0IG5vZGVzLCBDQVNpbmcgZnJvbSBudWxsIHRvIGEgZGF0YQorICAgICAqIHZhbHVlLiAoTm90ZSB0aGF0IHRoZSBsaW5lYXJpemF0aW9uIHByb3BlcnRpZXMgb2YgdGhpcyBzdHlsZSBvZgorICAgICAqIHF1ZXVlIGFyZSBlYXN5IHRvIHZlcmlmeSAtLSBlbGVtZW50cyBhcmUgbWFkZSBhdmFpbGFibGUgYnkKKyAgICAgKiBsaW5raW5nLCBhbmQgdW5hdmFpbGFibGUgYnkgbWF0Y2hpbmcuKSBDb21wYXJlZCB0byBwbGFpbiBNJlMKKyAgICAgKiBxdWV1ZXMsIHRoaXMgcHJvcGVydHkgb2YgZHVhbCBxdWV1ZXMgcmVxdWlyZXMgb25lIGFkZGl0aW9uYWwKKyAgICAgKiBzdWNjZXNzZnVsIGF0b21pYyBvcGVyYXRpb24gcGVyIGVucS9kZXEgcGFpci4gQnV0IGl0IGFsc28KKyAgICAgKiBlbmFibGVzIGxvd2VyIGNvc3QgdmFyaWFudHMgb2YgcXVldWUgbWFpbnRlbmFuY2UgbWVjaGFuaWNzLiAoQQorICAgICAqIHZhcmlhdGlvbiBvZiB0aGlzIGlkZWEgYXBwbGllcyBldmVuIGZvciBub24tZHVhbCBxdWV1ZXMgdGhhdAorICAgICAqIHN1cHBvcnQgZGVsZXRpb24gb2YgaW50ZXJpb3IgZWxlbWVudHMsIHN1Y2ggYXMKKyAgICAgKiBqLnUuYy5Db25jdXJyZW50TGlua2VkUXVldWUuKQorICAgICAqCisgICAgICogT25jZSBhIG5vZGUgaXMgbWF0Y2hlZCwgaXRzIG1hdGNoIHN0YXR1cyBjYW4gbmV2ZXIgYWdhaW4KKyAgICAgKiBjaGFuZ2UuICBXZSBtYXkgdGh1cyBhcnJhbmdlIHRoYXQgdGhlIGxpbmtlZCBsaXN0IG9mIHRoZW0KKyAgICAgKiBjb250YWluIGEgcHJlZml4IG9mIHplcm8gb3IgbW9yZSBtYXRjaGVkIG5vZGVzLCBmb2xsb3dlZCBieSBhCisgICAgICogc3VmZml4IG9mIHplcm8gb3IgbW9yZSB1bm1hdGNoZWQgbm9kZXMuIChOb3RlIHRoYXQgd2UgYWxsb3cKKyAgICAgKiBib3RoIHRoZSBwcmVmaXggYW5kIHN1ZmZpeCB0byBiZSB6ZXJvIGxlbmd0aCwgd2hpY2ggaW4gdHVybgorICAgICAqIG1lYW5zIHRoYXQgd2UgZG8gbm90IHVzZSBhIGR1bW15IGhlYWRlci4pICBJZiB3ZSB3ZXJlIG5vdAorICAgICAqIGNvbmNlcm5lZCB3aXRoIGVpdGhlciB0aW1lIG9yIHNwYWNlIGVmZmljaWVuY3ksIHdlIGNvdWxkCisgICAgICogY29ycmVjdGx5IHBlcmZvcm0gZW5xdWV1ZSBhbmQgZGVxdWV1ZSBvcGVyYXRpb25zIGJ5IHRyYXZlcnNpbmcKKyAgICAgKiBmcm9tIGEgcG9pbnRlciB0byB0aGUgaW5pdGlhbCBub2RlOyBDQVNpbmcgdGhlIGl0ZW0gb2YgdGhlCisgICAgICogZmlyc3QgdW5tYXRjaGVkIG5vZGUgb24gbWF0Y2ggYW5kIENBU2luZyB0aGUgbmV4dCBmaWVsZCBvZiB0aGUKKyAgICAgKiB0cmFpbGluZyBub2RlIG9uIGFwcGVuZHMuIChQbHVzIHNvbWUgc3BlY2lhbC1jYXNpbmcgd2hlbgorICAgICAqIGluaXRpYWxseSBlbXB0eSkuICBXaGlsZSB0aGlzIHdvdWxkIGJlIGEgdGVycmlibGUgaWRlYSBpbgorICAgICAqIGl0c2VsZiwgaXQgZG9lcyBoYXZlIHRoZSBiZW5lZml0IG9mIG5vdCByZXF1aXJpbmcgQU5ZIGF0b21pYworICAgICAqIHVwZGF0ZXMgb24gaGVhZC90YWlsIGZpZWxkcy4KKyAgICAgKgorICAgICAqIFdlIGludHJvZHVjZSBoZXJlIGFuIGFwcHJvYWNoIHRoYXQgbGllcyBiZXR3ZWVuIHRoZSBleHRyZW1lcyBvZgorICAgICAqIG5ldmVyIHZlcnN1cyBhbHdheXMgdXBkYXRpbmcgcXVldWUgKGhlYWQgYW5kIHRhaWwpIHBvaW50ZXJzLgorICAgICAqIFRoaXMgb2ZmZXJzIGEgdHJhZGVvZmYgYmV0d2VlbiBzb21ldGltZXMgcmVxdWlyaW5nIGV4dHJhCisgICAgICogdHJhdmVyc2FsIHN0ZXBzIHRvIGxvY2F0ZSB0aGUgZmlyc3QgYW5kL29yIGxhc3QgdW5tYXRjaGVkCisgICAgICogbm9kZXMsIHZlcnN1cyB0aGUgcmVkdWNlZCBvdmVyaGVhZCBhbmQgY29udGVudGlvbiBvZiBmZXdlcgorICAgICAqIHVwZGF0ZXMgdG8gcXVldWUgcG9pbnRlcnMuIEZvciBleGFtcGxlLCBhIHBvc3NpYmxlIHNuYXBzaG90IG9mCisgICAgICogYSBxdWV1ZSBpczoKKyAgICAgKgorICAgICAqICBoZWFkICAgICAgICAgICB0YWlsCisgICAgICogICAgfCAgICAgICAgICAgICAgfAorICAgICAqICAgIHYgICAgICAgICAgICAgIHYKKyAgICAgKiAgICBNIC0+IE0gLT4gVSAtPiBVIC0+IFUgLT4gVQorICAgICAqCisgICAgICogVGhlIGJlc3QgdmFsdWUgZm9yIHRoaXMgInNsYWNrIiAodGhlIHRhcmdldGVkIG1heGltdW0gZGlzdGFuY2UKKyAgICAgKiBiZXR3ZWVuIHRoZSB2YWx1ZSBvZiAiaGVhZCIgYW5kIHRoZSBmaXJzdCB1bm1hdGNoZWQgbm9kZSwgYW5kCisgICAgICogc2ltaWxhcmx5IGZvciAidGFpbCIpIGlzIGFuIGVtcGlyaWNhbCBtYXR0ZXIuIFdlIGhhdmUgZm91bmQKKyAgICAgKiB0aGF0IHVzaW5nIHZlcnkgc21hbGwgY29uc3RhbnRzIGluIHRoZSByYW5nZSBvZiAxLTMgd29yayBiZXN0CisgICAgICogb3ZlciBhIHJhbmdlIG9mIHBsYXRmb3Jtcy4gTGFyZ2VyIHZhbHVlcyBpbnRyb2R1Y2UgaW5jcmVhc2luZworICAgICAqIGNvc3RzIG9mIGNhY2hlIG1pc3NlcyBhbmQgcmlza3Mgb2YgbG9uZyB0cmF2ZXJzYWwgY2hhaW5zLCB3aGlsZQorICAgICAqIHNtYWxsZXIgdmFsdWVzIGluY3JlYXNlIENBUyBjb250ZW50aW9uIGFuZCBvdmVyaGVhZC4KKyAgICAgKgorICAgICAqIER1YWwgcXVldWVzIHdpdGggc2xhY2sgZGlmZmVyIGZyb20gcGxhaW4gTSZTIGR1YWwgcXVldWVzIGJ5CisgICAgICogdmlydHVlIG9mIG9ubHkgc29tZXRpbWVzIHVwZGF0aW5nIGhlYWQgb3IgdGFpbCBwb2ludGVycyB3aGVuCisgICAgICogbWF0Y2hpbmcsIGFwcGVuZGluZywgb3IgZXZlbiB0cmF2ZXJzaW5nIG5vZGVzOyBpbiBvcmRlciB0bworICAgICAqIG1haW50YWluIGEgdGFyZ2V0ZWQgc2xhY2suICBUaGUgaWRlYSBvZiAic29tZXRpbWVzIiBtYXkgYmUKKyAgICAgKiBvcGVyYXRpb25hbGl6ZWQgaW4gc2V2ZXJhbCB3YXlzLiBUaGUgc2ltcGxlc3QgaXMgdG8gdXNlIGEKKyAgICAgKiBwZXItb3BlcmF0aW9uIGNvdW50ZXIgaW5jcmVtZW50ZWQgb24gZWFjaCB0cmF2ZXJzYWwgc3RlcCwgYW5kCisgICAgICogdG8gdHJ5ICh2aWEgQ0FTKSB0byB1cGRhdGUgdGhlIGFzc29jaWF0ZWQgcXVldWUgcG9pbnRlcgorICAgICAqIHdoZW5ldmVyIHRoZSBjb3VudCBleGNlZWRzIGEgdGhyZXNob2xkLiBBbm90aGVyLCB0aGF0IHJlcXVpcmVzCisgICAgICogbW9yZSBvdmVyaGVhZCwgaXMgdG8gdXNlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9ycyB0byB1cGRhdGUKKyAgICAgKiB3aXRoIGEgZ2l2ZW4gcHJvYmFiaWxpdHkgcGVyIHRyYXZlcnNhbCBzdGVwLgorICAgICAqCisgICAgICogSW4gYW55IHN0cmF0ZWd5IGFsb25nIHRoZXNlIGxpbmVzLCBiZWNhdXNlIENBU2VzIHVwZGF0aW5nCisgICAgICogZmllbGRzIG1heSBmYWlsLCB0aGUgYWN0dWFsIHNsYWNrIG1heSBleGNlZWQgdGFyZ2V0ZWQKKyAgICAgKiBzbGFjay4gSG93ZXZlciwgdGhleSBtYXkgYmUgcmV0cmllZCBhdCBhbnkgdGltZSB0byBtYWludGFpbgorICAgICAqIHRhcmdldHMuICBFdmVuIHdoZW4gdXNpbmcgdmVyeSBzbWFsbCBzbGFjayB2YWx1ZXMsIHRoaXMKKyAgICAgKiBhcHByb2FjaCB3b3JrcyB3ZWxsIGZvciBkdWFsIHF1ZXVlcyBiZWNhdXNlIGl0IGFsbG93cyBhbGwKKyAgICAgKiBvcGVyYXRpb25zIHVwIHRvIHRoZSBwb2ludCBvZiBtYXRjaGluZyBvciBhcHBlbmRpbmcgYW4gaXRlbQorICAgICAqIChoZW5jZSBwb3RlbnRpYWxseSBhbGxvd2luZyBwcm9ncmVzcyBieSBhbm90aGVyIHRocmVhZCkgdG8gYmUKKyAgICAgKiByZWFkLW9ubHksIHRodXMgbm90IGludHJvZHVjaW5nIGFueSBmdXJ0aGVyIGNvbnRlbnRpb24uIEFzCisgICAgICogZGVzY3JpYmVkIGJlbG93LCB3ZSBpbXBsZW1lbnQgdGhpcyBieSBwZXJmb3JtaW5nIHNsYWNrCisgICAgICogbWFpbnRlbmFuY2UgcmV0cmllcyBvbmx5IGFmdGVyIHRoZXNlIHBvaW50cy4KKyAgICAgKgorICAgICAqIEFzIGFuIGFjY29tcGFuaW1lbnQgdG8gc3VjaCB0ZWNobmlxdWVzLCB0cmF2ZXJzYWwgb3ZlcmhlYWQgY2FuCisgICAgICogYmUgZnVydGhlciByZWR1Y2VkIHdpdGhvdXQgaW5jcmVhc2luZyBjb250ZW50aW9uIG9mIGhlYWQKKyAgICAgKiBwb2ludGVyIHVwZGF0ZXM6IFRocmVhZHMgbWF5IHNvbWV0aW1lcyBzaG9ydGN1dCB0aGUgIm5leHQiIGxpbmsKKyAgICAgKiBwYXRoIGZyb20gdGhlIGN1cnJlbnQgImhlYWQiIG5vZGUgdG8gYmUgY2xvc2VyIHRvIHRoZSBjdXJyZW50bHkKKyAgICAgKiBrbm93biBmaXJzdCB1bm1hdGNoZWQgbm9kZSwgYW5kIHNpbWlsYXJseSBmb3IgdGFpbC4gQWdhaW4sIHRoaXMKKyAgICAgKiBtYXkgYmUgdHJpZ2dlcmVkIHdpdGggdXNpbmcgdGhyZXNob2xkcyBvciByYW5kb21pemF0aW9uLgorICAgICAqCisgICAgICogVGhlc2UgaWRlYXMgbXVzdCBiZSBmdXJ0aGVyIGV4dGVuZGVkIHRvIGF2b2lkIHVuYm91bmRlZCBhbW91bnRzCisgICAgICogb2YgY29zdGx5LXRvLXJlY2xhaW0gZ2FyYmFnZSBjYXVzZWQgYnkgdGhlIHNlcXVlbnRpYWwgIm5leHQiCisgICAgICogbGlua3Mgb2Ygbm9kZXMgc3RhcnRpbmcgYXQgb2xkIGZvcmdvdHRlbiBoZWFkIG5vZGVzOiBBcyBmaXJzdAorICAgICAqIGRlc2NyaWJlZCBpbiBkZXRhaWwgYnkgQm9laG0KKyAgICAgKiAoaHR0cDovL3BvcnRhbC5hY20ub3JnL2NpdGF0aW9uLmNmbT9kb2lkPTUwMzI3Mi41MDMyODIpIGlmIGEgR0MKKyAgICAgKiBkZWxheXMgbm90aWNpbmcgdGhhdCBhbnkgYXJiaXRyYXJpbHkgb2xkIG5vZGUgaGFzIGJlY29tZQorICAgICAqIGdhcmJhZ2UsIGFsbCBuZXdlciBkZWFkIG5vZGVzIHdpbGwgYWxzbyBiZSB1bnJlY2xhaW1lZC4KKyAgICAgKiAoU2ltaWxhciBpc3N1ZXMgYXJpc2UgaW4gbm9uLUdDIGVudmlyb25tZW50cy4pICBUbyBjb3BlIHdpdGgKKyAgICAgKiB0aGlzIGluIG91ciBpbXBsZW1lbnRhdGlvbiwgdXBvbiBDQVNpbmcgdG8gYWR2YW5jZSB0aGUgaGVhZAorICAgICAqIHBvaW50ZXIsIHdlIHNldCB0aGUgIm5leHQiIGxpbmsgb2YgdGhlIHByZXZpb3VzIGhlYWQgdG8gcG9pbnQKKyAgICAgKiBvbmx5IHRvIGl0c2VsZjsgdGh1cyBsaW1pdGluZyB0aGUgbGVuZ3RoIG9mIGNvbm5lY3RlZCBkZWFkIGxpc3RzLgorICAgICAqIChXZSBhbHNvIHRha2Ugc2ltaWxhciBjYXJlIHRvIHdpcGUgb3V0IHBvc3NpYmx5IGdhcmJhZ2UKKyAgICAgKiByZXRhaW5pbmcgdmFsdWVzIGhlbGQgaW4gb3RoZXIgTm9kZSBmaWVsZHMuKSAgSG93ZXZlciwgZG9pbmcgc28KKyAgICAgKiBhZGRzIHNvbWUgZnVydGhlciBjb21wbGV4aXR5IHRvIHRyYXZlcnNhbDogSWYgYW55ICJuZXh0IgorICAgICAqIHBvaW50ZXIgbGlua3MgdG8gaXRzZWxmLCBpdCBpbmRpY2F0ZXMgdGhhdCB0aGUgY3VycmVudCB0aHJlYWQKKyAgICAgKiBoYXMgbGFnZ2VkIGJlaGluZCBhIGhlYWQtdXBkYXRlLCBhbmQgc28gdGhlIHRyYXZlcnNhbCBtdXN0CisgICAgICogY29udGludWUgZnJvbSB0aGUgImhlYWQiLiAgVHJhdmVyc2FscyB0cnlpbmcgdG8gZmluZCB0aGUKKyAgICAgKiBjdXJyZW50IHRhaWwgc3RhcnRpbmcgZnJvbSAidGFpbCIgbWF5IGFsc28gZW5jb3VudGVyCisgICAgICogc2VsZi1saW5rcywgaW4gd2hpY2ggY2FzZSB0aGV5IGFsc28gY29udGludWUgYXQgImhlYWQiLgorICAgICAqCisgICAgICogSXQgaXMgdGVtcHRpbmcgaW4gc2xhY2stYmFzZWQgc2NoZW1lIHRvIG5vdCBldmVuIHVzZSBDQVMgZm9yCisgICAgICogdXBkYXRlcyAoc2ltaWxhcmx5IHRvIExhZGFuLU1vemVzICYgU2hhdml0KS4gSG93ZXZlciwgdGhpcworICAgICAqIGNhbm5vdCBiZSBkb25lIGZvciBoZWFkIHVwZGF0ZXMgdW5kZXIgdGhlIGFib3ZlIGxpbmstZm9yZ2V0dGluZworICAgICAqIG1lY2hhbmljcyBiZWNhdXNlIGFuIHVwZGF0ZSBtYXkgbGVhdmUgaGVhZCBhdCBhIGRldGFjaGVkIG5vZGUuCisgICAgICogQW5kIHdoaWxlIGRpcmVjdCB3cml0ZXMgYXJlIHBvc3NpYmxlIGZvciB0YWlsIHVwZGF0ZXMsIHRoZXkKKyAgICAgKiBpbmNyZWFzZSB0aGUgcmlzayBvZiBsb25nIHJldHJhdmVyc2FscywgYW5kIGhlbmNlIGxvbmcgZ2FyYmFnZQorICAgICAqIGNoYWlucywgd2hpY2ggY2FuIGJlIG11Y2ggbW9yZSBjb3N0bHkgdGhhbiBpcyB3b3J0aHdoaWxlCisgICAgICogY29uc2lkZXJpbmcgdGhhdCB0aGUgY29zdCBkaWZmZXJlbmNlIG9mIHBlcmZvcm1pbmcgYSBDQVMgdnMKKyAgICAgKiB3cml0ZSBpcyBzbWFsbGVyIHdoZW4gdGhleSBhcmUgbm90IHRyaWdnZXJlZCBvbiBlYWNoIG9wZXJhdGlvbgorICAgICAqIChlc3BlY2lhbGx5IGNvbnNpZGVyaW5nIHRoYXQgd3JpdGVzIGFuZCBDQVNlcyBlcXVhbGx5IHJlcXVpcmUKKyAgICAgKiBhZGRpdGlvbmFsIEdDIGJvb2trZWVwaW5nICgid3JpdGUgYmFycmllcnMiKSB0aGF0IGFyZSBzb21ldGltZXMKKyAgICAgKiBtb3JlIGNvc3RseSB0aGFuIHRoZSB3cml0ZXMgdGhlbXNlbHZlcyBiZWNhdXNlIG9mIGNvbnRlbnRpb24pLgorICAgICAqCisgICAgICogKioqIE92ZXJ2aWV3IG9mIGltcGxlbWVudGF0aW9uICoqKgorICAgICAqCisgICAgICogV2UgdXNlIGEgdGhyZXNob2xkLWJhc2VkIGFwcHJvYWNoIHRvIHVwZGF0ZXMsIHdpdGggYSBzbGFjaworICAgICAqIHRocmVzaG9sZCBvZiB0d28gLS0gdGhhdCBpcywgd2UgdXBkYXRlIGhlYWQvdGFpbCB3aGVuIHRoZQorICAgICAqIGN1cnJlbnQgcG9pbnRlciBhcHBlYXJzIHRvIGJlIHR3byBvciBtb3JlIHN0ZXBzIGF3YXkgZnJvbSB0aGUKKyAgICAgKiBmaXJzdC9sYXN0IG5vZGUuIFRoZSBzbGFjayB2YWx1ZSBpcyBoYXJkLXdpcmVkOiBhIHBhdGggZ3JlYXRlcgorICAgICAqIHRoYW4gb25lIGlzIG5hdHVyYWxseSBpbXBsZW1lbnRlZCBieSBjaGVja2luZyBlcXVhbGl0eSBvZgorICAgICAqIHRyYXZlcnNhbCBwb2ludGVycyBleGNlcHQgd2hlbiB0aGUgbGlzdCBoYXMgb25seSBvbmUgZWxlbWVudCwKKyAgICAgKiBpbiB3aGljaCBjYXNlIHdlIGtlZXAgc2xhY2sgdGhyZXNob2xkIGF0IG9uZS4gQXZvaWRpbmcgdHJhY2tpbmcKKyAgICAgKiBleHBsaWNpdCBjb3VudHMgYWNyb3NzIG1ldGhvZCBjYWxscyBzbGlnaHRseSBzaW1wbGlmaWVzIGFuCisgICAgICogYWxyZWFkeS1tZXNzeSBpbXBsZW1lbnRhdGlvbi4gVXNpbmcgcmFuZG9taXphdGlvbiB3b3VsZAorICAgICAqIHByb2JhYmx5IHdvcmsgYmV0dGVyIGlmIHRoZXJlIHdlcmUgYSBsb3ctcXVhbGl0eSBkaXJ0LWNoZWFwCisgICAgICogcGVyLXRocmVhZCBvbmUgYXZhaWxhYmxlLCBidXQgZXZlbiBUaHJlYWRMb2NhbFJhbmRvbSBpcyB0b28KKyAgICAgKiBoZWF2eSBmb3IgdGhlc2UgcHVycG9zZXMuCisgICAgICoKKyAgICAgKiBXaXRoIHN1Y2ggYSBzbWFsbCBzbGFjayB0aHJlc2hvbGQgdmFsdWUsIGl0IGlzIG5vdCB3b3J0aHdoaWxlCisgICAgICogdG8gYXVnbWVudCB0aGlzIHdpdGggcGF0aCBzaG9ydC1jaXJjdWl0aW5nIChpLmUuLCB1bnNwbGljaW5nCisgICAgICogaW50ZXJpb3Igbm9kZXMpIGV4Y2VwdCBpbiB0aGUgY2FzZSBvZiBjYW5jZWxsYXRpb24vcmVtb3ZhbCAoc2VlCisgICAgICogYmVsb3cpLgorICAgICAqCisgICAgICogV2UgYWxsb3cgYm90aCB0aGUgaGVhZCBhbmQgdGFpbCBmaWVsZHMgdG8gYmUgbnVsbCBiZWZvcmUgYW55CisgICAgICogbm9kZXMgYXJlIGVucXVldWVkOyBpbml0aWFsaXppbmcgdXBvbiBmaXJzdCBhcHBlbmQuICBUaGlzCisgICAgICogc2ltcGxpZmllcyBzb21lIG90aGVyIGxvZ2ljLCBhcyB3ZWxsIGFzIHByb3ZpZGluZyBtb3JlCisgICAgICogZWZmaWNpZW50IGV4cGxpY2l0IGNvbnRyb2wgcGF0aHMgaW5zdGVhZCBvZiBsZXR0aW5nIEpWTXMgaW5zZXJ0CisgICAgICogaW1wbGljaXQgTnVsbFBvaW50ZXJFeGNlcHRpb25zIHdoZW4gdGhleSBhcmUgbnVsbC4gIFdoaWxlIG5vdAorICAgICAqIGN1cnJlbnRseSBmdWxseSBpbXBsZW1lbnRlZCwgd2UgYWxzbyBsZWF2ZSBvcGVuIHRoZSBwb3NzaWJpbGl0eQorICAgICAqIG9mIHJlLW51bGxpbmcgdGhlc2UgZmllbGRzIHdoZW4gZW1wdHkgKHdoaWNoIGlzIGNvbXBsaWNhdGVkIHRvCisgICAgICogYXJyYW5nZSwgZm9yIGxpdHRsZSBiZW5lZml0LikKKyAgICAgKgorICAgICAqIEFsbCBlbnF1ZXVlL2RlcXVldWUgb3BlcmF0aW9ucyBhcmUgaGFuZGxlZCBieSB0aGUgc2luZ2xlIG1ldGhvZAorICAgICAqICJ4ZmVyIiB3aXRoIHBhcmFtZXRlcnMgaW5kaWNhdGluZyB3aGV0aGVyIHRvIGFjdCBhcyBzb21lIGZvcm0KKyAgICAgKiBvZiBvZmZlciwgcHV0LCBwb2xsLCB0YWtlLCBvciB0cmFuc2ZlciAoZWFjaCBwb3NzaWJseSB3aXRoCisgICAgICogdGltZW91dCkuIFRoZSByZWxhdGl2ZSBjb21wbGV4aXR5IG9mIHVzaW5nIG9uZSBtb25vbGl0aGljCisgICAgICogbWV0aG9kIG91dHdlaWdocyB0aGUgY29kZSBidWxrIGFuZCBtYWludGVuYW5jZSBwcm9ibGVtcyBvZgorICAgICAqIHVzaW5nIHNlcGFyYXRlIG1ldGhvZHMgZm9yIGVhY2ggY2FzZS4KKyAgICAgKgorICAgICAqIE9wZXJhdGlvbiBjb25zaXN0cyBvZiB1cCB0byB0aHJlZSBwaGFzZXMuIFRoZSBmaXJzdCBpcworICAgICAqIGltcGxlbWVudGVkIHdpdGhpbiBtZXRob2QgeGZlciwgdGhlIHNlY29uZCBpbiB0cnlBcHBlbmQsIGFuZAorICAgICAqIHRoZSB0aGlyZCBpbiBtZXRob2QgYXdhaXRNYXRjaC4KKyAgICAgKgorICAgICAqIDEuIFRyeSB0byBtYXRjaCBhbiBleGlzdGluZyBub2RlCisgICAgICoKKyAgICAgKiAgICBTdGFydGluZyBhdCBoZWFkLCBza2lwIGFscmVhZHktbWF0Y2hlZCBub2RlcyB1bnRpbCBmaW5kaW5nCisgICAgICogICAgYW4gdW5tYXRjaGVkIG5vZGUgb2Ygb3Bwb3NpdGUgbW9kZSwgaWYgb25lIGV4aXN0cywgaW4gd2hpY2gKKyAgICAgKiAgICBjYXNlIG1hdGNoaW5nIGl0IGFuZCByZXR1cm5pbmcsIGFsc28gaWYgbmVjZXNzYXJ5IHVwZGF0aW5nCisgICAgICogICAgaGVhZCB0byBvbmUgcGFzdCB0aGUgbWF0Y2hlZCBub2RlIChvciB0aGUgbm9kZSBpdHNlbGYgaWYgdGhlCisgICAgICogICAgbGlzdCBoYXMgbm8gb3RoZXIgdW5tYXRjaGVkIG5vZGVzKS4gSWYgdGhlIENBUyBtaXNzZXMsIHRoZW4KKyAgICAgKiAgICBhIGxvb3AgcmV0cmllcyBhZHZhbmNpbmcgaGVhZCBieSB0d28gc3RlcHMgdW50aWwgZWl0aGVyCisgICAgICogICAgc3VjY2VzcyBvciB0aGUgc2xhY2sgaXMgYXQgbW9zdCB0d28uIEJ5IHJlcXVpcmluZyB0aGF0IGVhY2gKKyAgICAgKiAgICBhdHRlbXB0IGFkdmFuY2VzIGhlYWQgYnkgdHdvIChpZiBhcHBsaWNhYmxlKSwgd2UgZW5zdXJlIHRoYXQKKyAgICAgKiAgICB0aGUgc2xhY2sgZG9lcyBub3QgZ3JvdyB3aXRob3V0IGJvdW5kLiBUcmF2ZXJzYWxzIGFsc28gY2hlY2sKKyAgICAgKiAgICBpZiB0aGUgaW5pdGlhbCBoZWFkIGlzIG5vdyBvZmYtbGlzdCwgaW4gd2hpY2ggY2FzZSB0aGV5CisgICAgICogICAgc3RhcnQgYXQgdGhlIG5ldyBoZWFkLgorICAgICAqCisgICAgICogICAgSWYgbm8gY2FuZGlkYXRlcyBhcmUgZm91bmQgYW5kIHRoZSBjYWxsIHdhcyB1bnRpbWVkCisgICAgICogICAgcG9sbC9vZmZlciwgKGFyZ3VtZW50ICJob3ciIGlzIE5PVykgcmV0dXJuLgorICAgICAqCisgICAgICogMi4gVHJ5IHRvIGFwcGVuZCBhIG5ldyBub2RlIChtZXRob2QgdHJ5QXBwZW5kKQorICAgICAqCisgICAgICogICAgU3RhcnRpbmcgYXQgY3VycmVudCB0YWlsIHBvaW50ZXIsIGZpbmQgdGhlIGFjdHVhbCBsYXN0IG5vZGUKKyAgICAgKiAgICBhbmQgdHJ5IHRvIGFwcGVuZCBhIG5ldyBub2RlIChvciBpZiBoZWFkIHdhcyBudWxsLCBlc3RhYmxpc2gKKyAgICAgKiAgICB0aGUgZmlyc3Qgbm9kZSkuIE5vZGVzIGNhbiBiZSBhcHBlbmRlZCBvbmx5IGlmIHRoZWlyCisgICAgICogICAgcHJlZGVjZXNzb3JzIGFyZSBlaXRoZXIgYWxyZWFkeSBtYXRjaGVkIG9yIGFyZSBvZiB0aGUgc2FtZQorICAgICAqICAgIG1vZGUuIElmIHdlIGRldGVjdCBvdGhlcndpc2UsIHRoZW4gYSBuZXcgbm9kZSB3aXRoIG9wcG9zaXRlCisgICAgICogICAgbW9kZSBtdXN0IGhhdmUgYmVlbiBhcHBlbmRlZCBkdXJpbmcgdHJhdmVyc2FsLCBzbyB3ZSBtdXN0CisgICAgICogICAgcmVzdGFydCBhdCBwaGFzZSAxLiBUaGUgdHJhdmVyc2FsIGFuZCB1cGRhdGUgc3RlcHMgYXJlCisgICAgICogICAgb3RoZXJ3aXNlIHNpbWlsYXIgdG8gcGhhc2UgMTogUmV0cnlpbmcgdXBvbiBDQVMgbWlzc2VzIGFuZAorICAgICAqICAgIGNoZWNraW5nIGZvciBzdGFsZW5lc3MuICBJbiBwYXJ0aWN1bGFyLCBpZiBhIHNlbGYtbGluayBpcworICAgICAqICAgIGVuY291bnRlcmVkLCB0aGVuIHdlIGNhbiBzYWZlbHkganVtcCB0byBhIG5vZGUgb24gdGhlIGxpc3QKKyAgICAgKiAgICBieSBjb250aW51aW5nIHRoZSB0cmF2ZXJzYWwgYXQgY3VycmVudCBoZWFkLgorICAgICAqCisgICAgICogICAgT24gc3VjY2Vzc2Z1bCBhcHBlbmQsIGlmIHRoZSBjYWxsIHdhcyBBU1lOQywgcmV0dXJuLgorICAgICAqCisgICAgICogMy4gQXdhaXQgbWF0Y2ggb3IgY2FuY2VsbGF0aW9uIChtZXRob2QgYXdhaXRNYXRjaCkKKyAgICAgKgorICAgICAqICAgIFdhaXQgZm9yIGFub3RoZXIgdGhyZWFkIHRvIG1hdGNoIG5vZGU7IGluc3RlYWQgY2FuY2VsbGluZyBpZgorICAgICAqICAgIHRoZSBjdXJyZW50IHRocmVhZCB3YXMgaW50ZXJydXB0ZWQgb3IgdGhlIHdhaXQgdGltZWQgb3V0LiBPbgorICAgICAqICAgIG11bHRpcHJvY2Vzc29ycywgd2UgdXNlIGZyb250LW9mLXF1ZXVlIHNwaW5uaW5nOiBJZiBhIG5vZGUKKyAgICAgKiAgICBhcHBlYXJzIHRvIGJlIHRoZSBmaXJzdCB1bm1hdGNoZWQgbm9kZSBpbiB0aGUgcXVldWUsIGl0CisgICAgICogICAgc3BpbnMgYSBiaXQgYmVmb3JlIGJsb2NraW5nLiBJbiBlaXRoZXIgY2FzZSwgYmVmb3JlIGJsb2NraW5nCisgICAgICogICAgaXQgdHJpZXMgdG8gdW5zcGxpY2UgYW55IG5vZGVzIGJldHdlZW4gdGhlIGN1cnJlbnQgImhlYWQiCisgICAgICogICAgYW5kIHRoZSBmaXJzdCB1bm1hdGNoZWQgbm9kZS4KKyAgICAgKgorICAgICAqICAgIEZyb250LW9mLXF1ZXVlIHNwaW5uaW5nIHZhc3RseSBpbXByb3ZlcyBwZXJmb3JtYW5jZSBvZgorICAgICAqICAgIGhlYXZpbHkgY29udGVuZGVkIHF1ZXVlcy4gQW5kIHNvIGxvbmcgYXMgaXQgaXMgcmVsYXRpdmVseQorICAgICAqICAgIGJyaWVmIGFuZCAicXVpZXQiLCBzcGlubmluZyBkb2VzIG5vdCBtdWNoIGltcGFjdCBwZXJmb3JtYW5jZQorICAgICAqICAgIG9mIGxlc3MtY29udGVuZGVkIHF1ZXVlcy4gIER1cmluZyBzcGlucyB0aHJlYWRzIGNoZWNrIHRoZWlyCisgICAgICogICAgaW50ZXJydXB0IHN0YXR1cyBhbmQgZ2VuZXJhdGUgYSB0aHJlYWQtbG9jYWwgcmFuZG9tIG51bWJlcgorICAgICAqICAgIHRvIGRlY2lkZSB0byBvY2Nhc2lvbmFsbHkgcGVyZm9ybSBhIFRocmVhZC55aWVsZC4gV2hpbGUKKyAgICAgKiAgICB5aWVsZCBoYXMgdW5kZXJkZWZpbmVkIHNwZWNzLCB3ZSBhc3N1bWUgdGhhdCBpdCBtaWdodCBoZWxwLAorICAgICAqICAgIGFuZCB3aWxsIG5vdCBodXJ0LCBpbiBsaW1pdGluZyBpbXBhY3Qgb2Ygc3Bpbm5pbmcgb24gYnVzeQorICAgICAqICAgIHN5c3RlbXMuICBXZSBhbHNvIHVzZSBzbWFsbGVyICgxLzIpIHNwaW5zIGZvciBub2RlcyB0aGF0IGFyZQorICAgICAqICAgIG5vdCBrbm93biB0byBiZSBmcm9udCBidXQgd2hvc2UgcHJlZGVjZXNzb3JzIGhhdmUgbm90CisgICAgICogICAgYmxvY2tlZCAtLSB0aGVzZSAiY2hhaW5lZCIgc3BpbnMgYXZvaWQgYXJ0aWZhY3RzIG9mCisgICAgICogICAgZnJvbnQtb2YtcXVldWUgcnVsZXMgd2hpY2ggb3RoZXJ3aXNlIGxlYWQgdG8gYWx0ZXJuYXRpbmcKKyAgICAgKiAgICBub2RlcyBzcGlubmluZyB2cyBibG9ja2luZy4gRnVydGhlciwgZnJvbnQgdGhyZWFkcyB0aGF0CisgICAgICogICAgcmVwcmVzZW50IHBoYXNlIGNoYW5nZXMgKGZyb20gZGF0YSB0byByZXF1ZXN0IG5vZGUgb3IgdmljZQorICAgICAqICAgIHZlcnNhKSBjb21wYXJlZCB0byB0aGVpciBwcmVkZWNlc3NvcnMgcmVjZWl2ZSBhZGRpdGlvbmFsCisgICAgICogICAgY2hhaW5lZCBzcGlucywgcmVmbGVjdGluZyBsb25nZXIgcGF0aHMgdHlwaWNhbGx5IHJlcXVpcmVkIHRvCisgICAgICogICAgdW5ibG9jayB0aHJlYWRzIGR1cmluZyBwaGFzZSBjaGFuZ2VzLgorICAgICAqCisgICAgICoKKyAgICAgKiAqKiBVbmxpbmtpbmcgcmVtb3ZlZCBpbnRlcmlvciBub2RlcyAqKgorICAgICAqCisgICAgICogSW4gYWRkaXRpb24gdG8gbWluaW1pemluZyBnYXJiYWdlIHJldGVudGlvbiB2aWEgc2VsZi1saW5raW5nCisgICAgICogZGVzY3JpYmVkIGFib3ZlLCB3ZSBhbHNvIHVubGluayByZW1vdmVkIGludGVyaW9yIG5vZGVzLiBUaGVzZQorICAgICAqIG1heSBhcmlzZSBkdWUgdG8gdGltZWQgb3V0IG9yIGludGVycnVwdGVkIHdhaXRzLCBvciBjYWxscyB0bworICAgICAqIHJlbW92ZSh4KSBvciBJdGVyYXRvci5yZW1vdmUuICBOb3JtYWxseSwgZ2l2ZW4gYSBub2RlIHRoYXQgd2FzCisgICAgICogYXQgb25lIHRpbWUga25vd24gdG8gYmUgdGhlIHByZWRlY2Vzc29yIG9mIHNvbWUgbm9kZSBzIHRoYXQgaXMKKyAgICAgKiB0byBiZSByZW1vdmVkLCB3ZSBjYW4gdW5zcGxpY2UgcyBieSBDQVNpbmcgdGhlIG5leHQgZmllbGQgb2YKKyAgICAgKiBpdHMgcHJlZGVjZXNzb3IgaWYgaXQgc3RpbGwgcG9pbnRzIHRvIHMgKG90aGVyd2lzZSBzIG11c3QKKyAgICAgKiBhbHJlYWR5IGhhdmUgYmVlbiByZW1vdmVkIG9yIGlzIG5vdyBvZmZsaXN0KS4gQnV0IHRoZXJlIGFyZSB0d28KKyAgICAgKiBzaXR1YXRpb25zIGluIHdoaWNoIHdlIGNhbm5vdCBndWFyYW50ZWUgdG8gbWFrZSBub2RlIHMKKyAgICAgKiB1bnJlYWNoYWJsZSBpbiB0aGlzIHdheTogKDEpIElmIHMgaXMgdGhlIHRyYWlsaW5nIG5vZGUgb2YgbGlzdAorICAgICAqIChpLmUuLCB3aXRoIG51bGwgbmV4dCksIHRoZW4gaXQgaXMgcGlubmVkIGFzIHRoZSB0YXJnZXQgbm9kZQorICAgICAqIGZvciBhcHBlbmRzLCBzbyBjYW4gb25seSBiZSByZW1vdmVkIGxhdGVyIGFmdGVyIG90aGVyIG5vZGVzIGFyZQorICAgICAqIGFwcGVuZGVkLiAoMikgV2UgY2Fubm90IG5lY2Vzc2FyaWx5IHVubGluayBzIGdpdmVuIGEKKyAgICAgKiBwcmVkZWNlc3NvciBub2RlIHRoYXQgaXMgbWF0Y2hlZCAoaW5jbHVkaW5nIHRoZSBjYXNlIG9mIGJlaW5nCisgICAgICogY2FuY2VsbGVkKTogdGhlIHByZWRlY2Vzc29yIG1heSBhbHJlYWR5IGJlIHVuc3BsaWNlZCwgaW4gd2hpY2gKKyAgICAgKiBjYXNlIHNvbWUgcHJldmlvdXMgcmVhY2hhYmxlIG5vZGUgbWF5IHN0aWxsIHBvaW50IHRvIHMuCisgICAgICogKEZvciBmdXJ0aGVyIGV4cGxhbmF0aW9uIHNlZSBIZXJsaWh5ICYgU2hhdml0ICJUaGUgQXJ0IG9mCisgICAgICogTXVsdGlwcm9jZXNzb3IgUHJvZ3JhbW1pbmciIGNoYXB0ZXIgOSkuICBBbHRob3VnaCwgaW4gYm90aAorICAgICAqIGNhc2VzLCB3ZSBjYW4gcnVsZSBvdXQgdGhlIG5lZWQgZm9yIGZ1cnRoZXIgYWN0aW9uIGlmIGVpdGhlciBzCisgICAgICogb3IgaXRzIHByZWRlY2Vzc29yIGFyZSAob3IgY2FuIGJlIG1hZGUgdG8gYmUpIGF0LCBvciBmYWxsIG9mZgorICAgICAqIGZyb20sIHRoZSBoZWFkIG9mIGxpc3QuCisgICAgICoKKyAgICAgKiBXaXRob3V0IHRha2luZyB0aGVzZSBpbnRvIGFjY291bnQsIGl0IHdvdWxkIGJlIHBvc3NpYmxlIGZvciBhbgorICAgICAqIHVuYm91bmRlZCBudW1iZXIgb2Ygc3VwcG9zZWRseSByZW1vdmVkIG5vZGVzIHRvIHJlbWFpbgorICAgICAqIHJlYWNoYWJsZS4gIFNpdHVhdGlvbnMgbGVhZGluZyB0byBzdWNoIGJ1aWxkdXAgYXJlIHVuY29tbW9uIGJ1dAorICAgICAqIGNhbiBvY2N1ciBpbiBwcmFjdGljZTsgZm9yIGV4YW1wbGUgd2hlbiBhIHNlcmllcyBvZiBzaG9ydCB0aW1lZAorICAgICAqIGNhbGxzIHRvIHBvbGwgcmVwZWF0ZWRseSB0aW1lIG91dCBidXQgbmV2ZXIgb3RoZXJ3aXNlIGZhbGwgb2ZmCisgICAgICogdGhlIGxpc3QgYmVjYXVzZSBvZiBhbiB1bnRpbWVkIGNhbGwgdG8gdGFrZSBhdCB0aGUgZnJvbnQgb2YgdGhlCisgICAgICogcXVldWUuCisgICAgICoKKyAgICAgKiBXaGVuIHRoZXNlIGNhc2VzIGFyaXNlLCByYXRoZXIgdGhhbiBhbHdheXMgcmV0cmF2ZXJzaW5nIHRoZQorICAgICAqIGVudGlyZSBsaXN0IHRvIGZpbmQgYW4gYWN0dWFsIHByZWRlY2Vzc29yIHRvIHVubGluayAod2hpY2gKKyAgICAgKiB3b24ndCBoZWxwIGZvciBjYXNlICgxKSBhbnl3YXkpLCB3ZSByZWNvcmQgYSBjb25zZXJ2YXRpdmUKKyAgICAgKiBlc3RpbWF0ZSBvZiBwb3NzaWJsZSB1bnNwbGljZSBmYWlsdXJlcyAoaW4gInN3ZWVwVm90ZXMiKS4KKyAgICAgKiBXZSB0cmlnZ2VyIGEgZnVsbCBzd2VlcCB3aGVuIHRoZSBlc3RpbWF0ZSBleGNlZWRzIGEgdGhyZXNob2xkCisgICAgICogKCJTV0VFUF9USFJFU0hPTEQiKSBpbmRpY2F0aW5nIHRoZSBtYXhpbXVtIG51bWJlciBvZiBlc3RpbWF0ZWQKKyAgICAgKiByZW1vdmFsIGZhaWx1cmVzIHRvIHRvbGVyYXRlIGJlZm9yZSBzd2VlcGluZyB0aHJvdWdoLCB1bmxpbmtpbmcKKyAgICAgKiBjYW5jZWxsZWQgbm9kZXMgdGhhdCB3ZXJlIG5vdCB1bmxpbmtlZCB1cG9uIGluaXRpYWwgcmVtb3ZhbC4KKyAgICAgKiBXZSBwZXJmb3JtIHN3ZWVwcyBieSB0aGUgdGhyZWFkIGhpdHRpbmcgdGhyZXNob2xkIChyYXRoZXIgdGhhbgorICAgICAqIGJhY2tncm91bmQgdGhyZWFkcyBvciBieSBzcHJlYWRpbmcgd29yayB0byBvdGhlciB0aHJlYWRzKQorICAgICAqIGJlY2F1c2UgaW4gdGhlIG1haW4gY29udGV4dHMgaW4gd2hpY2ggcmVtb3ZhbCBvY2N1cnMsIHRoZQorICAgICAqIGNhbGxlciBpcyBhbHJlYWR5IHRpbWVkLW91dCwgY2FuY2VsbGVkLCBvciBwZXJmb3JtaW5nIGEKKyAgICAgKiBwb3RlbnRpYWxseSBPKG4pIG9wZXJhdGlvbiAoZS5nLiByZW1vdmUoeCkpLCBub25lIG9mIHdoaWNoIGFyZQorICAgICAqIHRpbWUtY3JpdGljYWwgZW5vdWdoIHRvIHdhcnJhbnQgdGhlIG92ZXJoZWFkIHRoYXQgYWx0ZXJuYXRpdmVzCisgICAgICogd291bGQgaW1wb3NlIG9uIG90aGVyIHRocmVhZHMuCisgICAgICoKKyAgICAgKiBCZWNhdXNlIHRoZSBzd2VlcFZvdGVzIGVzdGltYXRlIGlzIGNvbnNlcnZhdGl2ZSwgYW5kIGJlY2F1c2UKKyAgICAgKiBub2RlcyBiZWNvbWUgdW5saW5rZWQgIm5hdHVyYWxseSIgYXMgdGhleSBmYWxsIG9mZiB0aGUgaGVhZCBvZgorICAgICAqIHRoZSBxdWV1ZSwgYW5kIGJlY2F1c2Ugd2UgYWxsb3cgdm90ZXMgdG8gYWNjdW11bGF0ZSBldmVuIHdoaWxlCisgICAgICogc3dlZXBzIGFyZSBpbiBwcm9ncmVzcywgdGhlcmUgYXJlIHR5cGljYWxseSBzaWduaWZpY2FudGx5IGZld2VyCisgICAgICogc3VjaCBub2RlcyB0aGFuIGVzdGltYXRlZC4gIENob2ljZSBvZiBhIHRocmVzaG9sZCB2YWx1ZQorICAgICAqIGJhbGFuY2VzIHRoZSBsaWtlbGlob29kIG9mIHdhc3RlZCBlZmZvcnQgYW5kIGNvbnRlbnRpb24sIHZlcnN1cworICAgICAqIHByb3ZpZGluZyBhIHdvcnN0LWNhc2UgYm91bmQgb24gcmV0ZW50aW9uIG9mIGludGVyaW9yIG5vZGVzIGluCisgICAgICogcXVpZXNjZW50IHF1ZXVlcy4gVGhlIHZhbHVlIGRlZmluZWQgYmVsb3cgd2FzIGNob3NlbgorICAgICAqIGVtcGlyaWNhbGx5IHRvIGJhbGFuY2UgdGhlc2UgdW5kZXIgdmFyaW91cyB0aW1lb3V0IHNjZW5hcmlvcy4KKyAgICAgKgorICAgICAqIE5vdGUgdGhhdCB3ZSBjYW5ub3Qgc2VsZi1saW5rIHVubGlua2VkIGludGVyaW9yIG5vZGVzIGR1cmluZworICAgICAqIHN3ZWVwcy4gSG93ZXZlciwgdGhlIGFzc29jaWF0ZWQgZ2FyYmFnZSBjaGFpbnMgdGVybWluYXRlIHdoZW4KKyAgICAgKiBzb21lIHN1Y2Nlc3NvciB1bHRpbWF0ZWx5IGZhbGxzIG9mZiB0aGUgaGVhZCBvZiB0aGUgbGlzdCBhbmQgaXMKKyAgICAgKiBzZWxmLWxpbmtlZC4KKyAgICAgKi8KKworICAgIC8qKgorICAgICAqIFRydWUgaWYgb24gbXVsdGlwcm9jZXNzb3IKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIE1QID0KKyAgICAgICAgICAgIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmF2YWlsYWJsZVByb2Nlc3NvcnMoKSA+IDE7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIHNwaW4gKHdpdGggcmFuZG9tbHkgaW50ZXJzcGVyc2VkIGNhbGxzCisgICAgICogdG8gVGhyZWFkLnlpZWxkKSBvbiBtdWx0aXByb2Nlc3NvciBiZWZvcmUgYmxvY2tpbmcgd2hlbiBhIG5vZGUKKyAgICAgKiBpcyBhcHBhcmVudGx5IHRoZSBmaXJzdCB3YWl0ZXIgaW4gdGhlIHF1ZXVlLiAgU2VlIGFib3ZlIGZvcgorICAgICAqIGV4cGxhbmF0aW9uLiBNdXN0IGJlIGEgcG93ZXIgb2YgdHdvLiBUaGUgdmFsdWUgaXMgZW1waXJpY2FsbHkKKyAgICAgKiBkZXJpdmVkIC0tIGl0IHdvcmtzIHByZXR0eSB3ZWxsIGFjcm9zcyBhIHZhcmlldHkgb2YgcHJvY2Vzc29ycywKKyAgICAgKiBudW1iZXJzIG9mIENQVXMsIGFuZCBPU2VzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGUk9OVF9TUElOUyA9IDEgPDwgNzsKKworICAgIC8qKgorICAgICAqIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gc3BpbiBiZWZvcmUgYmxvY2tpbmcgd2hlbiBhIG5vZGUgaXMKKyAgICAgKiBwcmVjZWRlZCBieSBhbm90aGVyIG5vZGUgdGhhdCBpcyBhcHBhcmVudGx5IHNwaW5uaW5nLiAgQWxzbworICAgICAqIHNlcnZlcyBhcyBhbiBpbmNyZW1lbnQgdG8gRlJPTlRfU1BJTlMgb24gcGhhc2UgY2hhbmdlcywgYW5kIGFzCisgICAgICogYmFzZSBhdmVyYWdlIGZyZXF1ZW5jeSBmb3IgeWllbGRpbmcgZHVyaW5nIHNwaW5zLiBNdXN0IGJlIGEKKyAgICAgKiBwb3dlciBvZiB0d28uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENIQUlORURfU1BJTlMgPSBGUk9OVF9TUElOUyA+Pj4gMTsKKworICAgIC8qKgorICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBlc3RpbWF0ZWQgcmVtb3ZhbCBmYWlsdXJlcyAoc3dlZXBWb3RlcykKKyAgICAgKiB0byB0b2xlcmF0ZSBiZWZvcmUgc3dlZXBpbmcgdGhyb3VnaCB0aGUgcXVldWUgdW5saW5raW5nCisgICAgICogY2FuY2VsbGVkIG5vZGVzIHRoYXQgd2VyZSBub3QgdW5saW5rZWQgdXBvbiBpbml0aWFsCisgICAgICogcmVtb3ZhbC4gU2VlIGFib3ZlIGZvciBleHBsYW5hdGlvbi4gVGhlIHZhbHVlIG11c3QgYmUgYXQgbGVhc3QKKyAgICAgKiB0d28gdG8gYXZvaWQgdXNlbGVzcyBzd2VlcHMgd2hlbiByZW1vdmluZyB0cmFpbGluZyBub2Rlcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IFNXRUVQX1RIUkVTSE9MRCA9IDMyOworCisgICAgLyoqCisgICAgICogUXVldWUgbm9kZXMuIFVzZXMgT2JqZWN0LCBub3QgRSwgZm9yIGl0ZW1zIHRvIGFsbG93IGZvcmdldHRpbmcKKyAgICAgKiB0aGVtIGFmdGVyIHVzZS4gIFJlbGllcyBoZWF2aWx5IG9uIFVuc2FmZSBtZWNoYW5pY3MgdG8gbWluaW1pemUKKyAgICAgKiB1bm5lY2Vzc2FyeSBvcmRlcmluZyBjb25zdHJhaW50czogV3JpdGVzIHRoYXQgYXJlIGludHJpbnNpY2FsbHkKKyAgICAgKiBvcmRlcmVkIHdydCBvdGhlciBhY2Nlc3NlcyBvciBDQVNlcyB1c2Ugc2ltcGxlIHJlbGF4ZWQgZm9ybXMuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGNsYXNzIE5vZGUgeworICAgICAgICBmaW5hbCBib29sZWFuIGlzRGF0YTsgICAvLyBmYWxzZSBpZiB0aGlzIGlzIGEgcmVxdWVzdCBub2RlCisgICAgICAgIHZvbGF0aWxlIE9iamVjdCBpdGVtOyAgIC8vIGluaXRpYWxseSBub24tbnVsbCBpZiBpc0RhdGE7IENBU2VkIHRvIG1hdGNoCisgICAgICAgIHZvbGF0aWxlIE5vZGUgbmV4dDsKKyAgICAgICAgdm9sYXRpbGUgVGhyZWFkIHdhaXRlcjsgLy8gbnVsbCB1bnRpbCB3YWl0aW5nCisKKyAgICAgICAgLy8gQ0FTIG1ldGhvZHMgZm9yIGZpZWxkcworICAgICAgICBmaW5hbCBib29sZWFuIGNhc05leHQoTm9kZSBjbXAsIE5vZGUgdmFsKSB7CisgICAgICAgICAgICByZXR1cm4gVU5TQUZFLmNvbXBhcmVBbmRTd2FwT2JqZWN0KHRoaXMsIG5leHRPZmZzZXQsIGNtcCwgdmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGJvb2xlYW4gY2FzSXRlbShPYmplY3QgY21wLCBPYmplY3QgdmFsKSB7CisgICAgICAgICAgICAvLyBhc3NlcnQgY21wID09IG51bGwgfHwgY21wLmdldENsYXNzKCkgIT0gTm9kZS5jbGFzczsKKyAgICAgICAgICAgIHJldHVybiBVTlNBRkUuY29tcGFyZUFuZFN3YXBPYmplY3QodGhpcywgaXRlbU9mZnNldCwgY21wLCB2YWwpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdHMgYSBuZXcgbm9kZS4gIFVzZXMgcmVsYXhlZCB3cml0ZSBiZWNhdXNlIGl0ZW0gY2FuCisgICAgICAgICAqIG9ubHkgYmUgc2VlbiBhZnRlciBwdWJsaWNhdGlvbiB2aWEgY2FzTmV4dC4KKyAgICAgICAgICovCisgICAgICAgIE5vZGUoT2JqZWN0IGl0ZW0sIGJvb2xlYW4gaXNEYXRhKSB7CisgICAgICAgICAgICBVTlNBRkUucHV0T2JqZWN0KHRoaXMsIGl0ZW1PZmZzZXQsIGl0ZW0pOyAvLyByZWxheGVkIHdyaXRlCisgICAgICAgICAgICB0aGlzLmlzRGF0YSA9IGlzRGF0YTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBMaW5rcyBub2RlIHRvIGl0c2VsZiB0byBhdm9pZCBnYXJiYWdlIHJldGVudGlvbi4gIENhbGxlZAorICAgICAgICAgKiBvbmx5IGFmdGVyIENBU2luZyBoZWFkIGZpZWxkLCBzbyB1c2VzIHJlbGF4ZWQgd3JpdGUuCisgICAgICAgICAqLworICAgICAgICBmaW5hbCB2b2lkIGZvcmdldE5leHQoKSB7CisgICAgICAgICAgICBVTlNBRkUucHV0T2JqZWN0KHRoaXMsIG5leHRPZmZzZXQsIHRoaXMpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgaXRlbSB0byBzZWxmIGFuZCB3YWl0ZXIgdG8gbnVsbCwgdG8gYXZvaWQgZ2FyYmFnZQorICAgICAgICAgKiByZXRlbnRpb24gYWZ0ZXIgbWF0Y2hpbmcgb3IgY2FuY2VsbGluZy4gVXNlcyByZWxheGVkIHdyaXRlcworICAgICAgICAgKiBiZWNhdXNlIG9yZGVyIGlzIGFscmVhZHkgY29uc3RyYWluZWQgaW4gdGhlIG9ubHkgY2FsbGluZworICAgICAgICAgKiBjb250ZXh0czogaXRlbSBpcyBmb3Jnb3R0ZW4gb25seSBhZnRlciB2b2xhdGlsZS9hdG9taWMKKyAgICAgICAgICogbWVjaGFuaWNzIHRoYXQgZXh0cmFjdCBpdGVtcy4gIFNpbWlsYXJseSwgY2xlYXJpbmcgd2FpdGVyCisgICAgICAgICAqIGZvbGxvd3MgZWl0aGVyIENBUyBvciByZXR1cm4gZnJvbSBwYXJrIChpZiBldmVyIHBhcmtlZDsKKyAgICAgICAgICogZWxzZSB3ZSBkb24ndCBjYXJlKS4KKyAgICAgICAgICovCisgICAgICAgIGZpbmFsIHZvaWQgZm9yZ2V0Q29udGVudHMoKSB7CisgICAgICAgICAgICBVTlNBRkUucHV0T2JqZWN0KHRoaXMsIGl0ZW1PZmZzZXQsIHRoaXMpOworICAgICAgICAgICAgVU5TQUZFLnB1dE9iamVjdCh0aGlzLCB3YWl0ZXJPZmZzZXQsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG5vZGUgaGFzIGJlZW4gbWF0Y2hlZCwgaW5jbHVkaW5nIHRoZQorICAgICAgICAgKiBjYXNlIG9mIGFydGlmaWNpYWwgbWF0Y2hlcyBkdWUgdG8gY2FuY2VsbGF0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgZmluYWwgYm9vbGVhbiBpc01hdGNoZWQoKSB7CisgICAgICAgICAgICBPYmplY3QgeCA9IGl0ZW07CisgICAgICAgICAgICByZXR1cm4gKHggPT0gdGhpcykgfHwgKCh4ID09IG51bGwpID09IGlzRGF0YSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYW4gdW5tYXRjaGVkIHJlcXVlc3Qgbm9kZS4KKyAgICAgICAgICovCisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNVbm1hdGNoZWRSZXF1ZXN0KCkgeworICAgICAgICAgICAgcmV0dXJuICFpc0RhdGEgJiYgaXRlbSA9PSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiBhIG5vZGUgd2l0aCB0aGUgZ2l2ZW4gbW9kZSBjYW5ub3QgYmUKKyAgICAgICAgICogYXBwZW5kZWQgdG8gdGhpcyBub2RlIGJlY2F1c2UgdGhpcyBub2RlIGlzIHVubWF0Y2hlZCBhbmQKKyAgICAgICAgICogaGFzIG9wcG9zaXRlIGRhdGEgbW9kZS4KKyAgICAgICAgICovCisgICAgICAgIGZpbmFsIGJvb2xlYW4gY2Fubm90UHJlY2VkZShib29sZWFuIGhhdmVEYXRhKSB7CisgICAgICAgICAgICBib29sZWFuIGQgPSBpc0RhdGE7CisgICAgICAgICAgICBPYmplY3QgeDsKKyAgICAgICAgICAgIHJldHVybiBkICE9IGhhdmVEYXRhICYmICh4ID0gaXRlbSkgIT0gdGhpcyAmJiAoeCAhPSBudWxsKSA9PSBkOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRyaWVzIHRvIGFydGlmaWNpYWxseSBtYXRjaCBhIGRhdGEgbm9kZSAtLSB1c2VkIGJ5IHJlbW92ZS4KKyAgICAgICAgICovCisgICAgICAgIGZpbmFsIGJvb2xlYW4gdHJ5TWF0Y2hEYXRhKCkgeworICAgICAgICAgICAgLy8gYXNzZXJ0IGlzRGF0YTsKKyAgICAgICAgICAgIE9iamVjdCB4ID0gaXRlbTsKKyAgICAgICAgICAgIGlmICh4ICE9IG51bGwgJiYgeCAhPSB0aGlzICYmIGNhc0l0ZW0oeCwgbnVsbCkpIHsKKyAgICAgICAgICAgICAgICBMb2NrU3VwcG9ydC51bnBhcmsod2FpdGVyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0zMzc1OTc5ODYyMzE5ODExNzU0TDsKKworICAgICAgICAvLyBVbnNhZmUgbWVjaGFuaWNzCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIHN1bi5taXNjLlVuc2FmZSBVTlNBRkU7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgaXRlbU9mZnNldDsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBuZXh0T2Zmc2V0OworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHdhaXRlck9mZnNldDsKKworICAgICAgICBzdGF0aWMgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBVTlNBRkUgPSBnZXRVbnNhZmUoKTsKKyAgICAgICAgICAgICAgICBDbGFzczw/PiBrID0gTm9kZS5jbGFzczsKKyAgICAgICAgICAgICAgICBpdGVtT2Zmc2V0ID0gVU5TQUZFLm9iamVjdEZpZWxkT2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAoay5nZXREZWNsYXJlZEZpZWxkKCJpdGVtIikpOworICAgICAgICAgICAgICAgIG5leHRPZmZzZXQgPSBVTlNBRkUub2JqZWN0RmllbGRPZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgIChrLmdldERlY2xhcmVkRmllbGQoIm5leHQiKSk7CisgICAgICAgICAgICAgICAgd2FpdGVyT2Zmc2V0ID0gVU5TQUZFLm9iamVjdEZpZWxkT2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICAgICAoay5nZXREZWNsYXJlZEZpZWxkKCJ3YWl0ZXIiKSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIGhlYWQgb2YgdGhlIHF1ZXVlOyBudWxsIHVudGlsIGZpcnN0IGVucXVldWUKKyAgICAgKi8KKyAgICB0cmFuc2llbnQgdm9sYXRpbGUgTm9kZSBoZWFkOworCisgICAgLyoqCisgICAgICogdGFpbCBvZiB0aGUgcXVldWU7IG51bGwgdW50aWwgZmlyc3QgYXBwZW5kCisgICAgICovCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgdm9sYXRpbGUgTm9kZSB0YWlsOworCisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBhcHBhcmVudCBmYWlsdXJlcyB0byB1bnNwbGljZSByZW1vdmVkIG5vZGVzCisgICAgICovCisgICAgcHJpdmF0ZSB0cmFuc2llbnQgdm9sYXRpbGUgaW50IHN3ZWVwVm90ZXM7CisKKyAgICAvLyBDQVMgbWV0aG9kcyBmb3IgZmllbGRzCisgICAgcHJpdmF0ZSBib29sZWFuIGNhc1RhaWwoTm9kZSBjbXAsIE5vZGUgdmFsKSB7CisgICAgICAgIHJldHVybiBVTlNBRkUuY29tcGFyZUFuZFN3YXBPYmplY3QodGhpcywgdGFpbE9mZnNldCwgY21wLCB2YWwpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBjYXNIZWFkKE5vZGUgY21wLCBOb2RlIHZhbCkgeworICAgICAgICByZXR1cm4gVU5TQUZFLmNvbXBhcmVBbmRTd2FwT2JqZWN0KHRoaXMsIGhlYWRPZmZzZXQsIGNtcCwgdmFsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gY2FzU3dlZXBWb3RlcyhpbnQgY21wLCBpbnQgdmFsKSB7CisgICAgICAgIHJldHVybiBVTlNBRkUuY29tcGFyZUFuZFN3YXBJbnQodGhpcywgc3dlZXBWb3Rlc09mZnNldCwgY21wLCB2YWwpOworICAgIH0KKworICAgIC8qCisgICAgICogUG9zc2libGUgdmFsdWVzIGZvciAiaG93IiBhcmd1bWVudCBpbiB4ZmVyIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTk9XID0gMDsgLy8gZm9yIHVudGltZWQgcG9sbCwgdHJ5VHJhbnNmZXIKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVNZTkMgPSAxOyAvLyBmb3Igb2ZmZXIsIHB1dCwgYWRkCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNZTkMgPSAyOyAvLyBmb3IgdHJhbnNmZXIsIHRha2UKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVElNRUQgPSAzOyAvLyBmb3IgdGltZWQgcG9sbCwgdHJ5VHJhbnNmZXIKKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHN0YXRpYyA8RT4gRSBjYXN0KE9iamVjdCBpdGVtKSB7CisgICAgICAgIC8vIGFzc2VydCBpdGVtID09IG51bGwgfHwgaXRlbS5nZXRDbGFzcygpICE9IE5vZGUuY2xhc3M7CisgICAgICAgIHJldHVybiAoRSkgaXRlbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRzIGFsbCBxdWV1aW5nIG1ldGhvZHMuIFNlZSBhYm92ZSBmb3IgZXhwbGFuYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZSAgICAgICAgdGhlIGl0ZW0gb3IgbnVsbCBmb3IgdGFrZQorICAgICAqIEBwYXJhbSBoYXZlRGF0YSB0cnVlIGlmIHRoaXMgaXMgYSBwdXQsIGVsc2UgYSB0YWtlCisgICAgICogQHBhcmFtIGhvdyAgICAgIE5PVywgQVNZTkMsIFNZTkMsIG9yIFRJTUVECisgICAgICogQHBhcmFtIG5hbm9zICAgIHRpbWVvdXQgaW4gbmFub3NlY3MsIHVzZWQgb25seSBpZiBtb2RlIGlzIFRJTUVECisgICAgICogQHJldHVybiBhbiBpdGVtIGlmIG1hdGNoZWQsIGVsc2UgZQorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgaGF2ZURhdGEgbW9kZSBidXQgZSBpcyBudWxsCisgICAgICovCisgICAgcHJpdmF0ZSBFIHhmZXIoRSBlLCBib29sZWFuIGhhdmVEYXRhLCBpbnQgaG93LCBsb25nIG5hbm9zKSB7CisgICAgICAgIGlmIChoYXZlRGF0YSAmJiAoZSA9PSBudWxsKSkKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgICBOb2RlIHMgPSBudWxsOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBub2RlIHRvIGFwcGVuZCwgaWYgbmVlZGVkCisKKyAgICAgICAgcmV0cnk6CisgICAgICAgIGZvciAoOyA7ICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXN0YXJ0IG9uIGFwcGVuZCByYWNlCisKKyAgICAgICAgICAgIGZvciAoTm9kZSBoID0gaGVhZCwgcCA9IGg7IHAgIT0gbnVsbDsgKSB7IC8vIGZpbmQgJiBtYXRjaCBmaXJzdCBub2RlCisgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0RhdGEgPSBwLmlzRGF0YTsKKyAgICAgICAgICAgICAgICBPYmplY3QgaXRlbSA9IHAuaXRlbTsKKyAgICAgICAgICAgICAgICBpZiAoaXRlbSAhPSBwICYmIChpdGVtICE9IG51bGwpID09IGlzRGF0YSkgeyAvLyB1bm1hdGNoZWQKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzRGF0YSA9PSBoYXZlRGF0YSkgICAvLyBjYW4ndCBtYXRjaAorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGlmIChwLmNhc0l0ZW0oaXRlbSwgZSkpIHsgLy8gbWF0Y2gKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoTm9kZSBxID0gcDsgcSAhPSBoOyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlIG4gPSBxLm5leHQ7ICAvLyB1cGRhdGUgYnkgMiB1bmxlc3Mgc2luZ2xldG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhlYWQgPT0gaCAmJiBjYXNIZWFkKGgsIG4gPT0gbnVsbCA/IHEgOiBuKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoLmZvcmdldE5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgLy8gYWR2YW5jZSBhbmQgcmV0cnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGggPSBoZWFkKSA9PSBudWxsIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocSA9IGgubmV4dCkgPT0gbnVsbCB8fCAhcS5pc01hdGNoZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAvLyB1bmxlc3Mgc2xhY2sgPCAyCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBMb2NrU3VwcG9ydC51bnBhcmsocC53YWl0ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIExpbmtlZFRyYW5zZmVyUXVldWUuPEU+Y2FzdChpdGVtKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBOb2RlIG4gPSBwLm5leHQ7CisgICAgICAgICAgICAgICAgcCA9IChwICE9IG4pID8gbiA6IChoID0gaGVhZCk7IC8vIFVzZSBoZWFkIGlmIHAgb2ZmbGlzdAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaG93ICE9IE5PVykgeyAgICAgICAgICAgICAgICAgLy8gTm8gbWF0Y2hlcyBhdmFpbGFibGUKKyAgICAgICAgICAgICAgICBpZiAocyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBzID0gbmV3IE5vZGUoZSwgaGF2ZURhdGEpOworICAgICAgICAgICAgICAgIE5vZGUgcHJlZCA9IHRyeUFwcGVuZChzLCBoYXZlRGF0YSk7CisgICAgICAgICAgICAgICAgaWYgKHByZWQgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUgcmV0cnk7ICAgICAgICAgICAvLyBsb3N0IHJhY2UgdnMgb3Bwb3NpdGUgbW9kZQorICAgICAgICAgICAgICAgIGlmIChob3cgIT0gQVNZTkMpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhd2FpdE1hdGNoKHMsIHByZWQsIGUsIChob3cgPT0gVElNRUQpLCBuYW5vcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZTsgLy8gbm90IHdhaXRpbmcKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRyaWVzIHRvIGFwcGVuZCBub2RlIHMgYXMgdGFpbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzICAgICAgICB0aGUgbm9kZSB0byBhcHBlbmQKKyAgICAgKiBAcGFyYW0gaGF2ZURhdGEgdHJ1ZSBpZiBhcHBlbmRpbmcgaW4gZGF0YSBtb2RlCisgICAgICogQHJldHVybiBudWxsIG9uIGZhaWx1cmUgZHVlIHRvIGxvc2luZyByYWNlIHdpdGggYXBwZW5kIGluCisgICAgICogICAgICAgICBkaWZmZXJlbnQgbW9kZSwgZWxzZSBzJ3MgcHJlZGVjZXNzb3IsIG9yIHMgaXRzZWxmIGlmIG5vCisgICAgICogICAgICAgICBwcmVkZWNlc3NvcgorICAgICAqLworICAgIHByaXZhdGUgTm9kZSB0cnlBcHBlbmQoTm9kZSBzLCBib29sZWFuIGhhdmVEYXRhKSB7CisgICAgICAgIGZvciAoTm9kZSB0ID0gdGFpbCwgcCA9IHQ7IDsgKSB7ICAgICAgICAvLyBtb3ZlIHAgdG8gbGFzdCBub2RlIGFuZCBhcHBlbmQKKyAgICAgICAgICAgIE5vZGUgbiwgdTsgICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZW1wcyBmb3IgcmVhZHMgb2YgbmV4dCAmIHRhaWwKKyAgICAgICAgICAgIGlmIChwID09IG51bGwgJiYgKHAgPSBoZWFkKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGNhc0hlYWQobnVsbCwgcykpCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzOyAgICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZQorICAgICAgICAgICAgfSBlbHNlIGlmIChwLmNhbm5vdFByZWNlZGUoaGF2ZURhdGEpKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOyAgICAgICAgICAgICAgICAgIC8vIGxvc3QgcmFjZSB2cyBvcHBvc2l0ZSBtb2RlCisgICAgICAgICAgICBlbHNlIGlmICgobiA9IHAubmV4dCkgIT0gbnVsbCkgICAgLy8gbm90IGxhc3Q7IGtlZXAgdHJhdmVyc2luZworICAgICAgICAgICAgICAgIHAgPSBwICE9IHQgJiYgdCAhPSAodSA9IHRhaWwpID8gKHQgPSB1KSA6IC8vIHN0YWxlIHRhaWwKKyAgICAgICAgICAgICAgICAgICAgICAgIChwICE9IG4pID8gbiA6IG51bGw7ICAgICAgLy8gcmVzdGFydCBpZiBvZmYgbGlzdAorICAgICAgICAgICAgZWxzZSBpZiAoIXAuY2FzTmV4dChudWxsLCBzKSkKKyAgICAgICAgICAgICAgICBwID0gcC5uZXh0OyAgICAgICAgICAgICAgICAgICAvLyByZS1yZWFkIG9uIENBUyBmYWlsdXJlCisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAocCAhPSB0KSB7ICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgaWYgc2xhY2sgbm93ID49IDIKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCh0YWlsICE9IHQgfHwgIWNhc1RhaWwodCwgcykpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHQgPSB0YWlsKSAhPSBudWxsICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHMgPSB0Lm5leHQpICE9IG51bGwgJiYgLy8gYWR2YW5jZSBhbmQgcmV0cnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAocyA9IHMubmV4dCkgIT0gbnVsbCAmJiBzICE9IHQpIDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGlucy95aWVsZHMvYmxvY2tzIHVudGlsIG5vZGUgcyBpcyBtYXRjaGVkIG9yIGNhbGxlciBnaXZlcyB1cC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzICAgICB0aGUgd2FpdGluZyBub2RlCisgICAgICogQHBhcmFtIHByZWQgIHRoZSBwcmVkZWNlc3NvciBvZiBzLCBvciBzIGl0c2VsZiBpZiBpdCBoYXMgbm8KKyAgICAgKiAgICAgICAgICAgICAgcHJlZGVjZXNzb3IsIG9yIG51bGwgaWYgdW5rbm93biAodGhlIG51bGwgY2FzZSBkb2VzIG5vdCBvY2N1cgorICAgICAqICAgICAgICAgICAgICBpbiBhbnkgY3VycmVudCBjYWxscyBidXQgbWF5IGluIHBvc3NpYmxlIGZ1dHVyZSBleHRlbnNpb25zKQorICAgICAqIEBwYXJhbSBlICAgICB0aGUgY29tcGFyaXNvbiB2YWx1ZSBmb3IgY2hlY2tpbmcgbWF0Y2gKKyAgICAgKiBAcGFyYW0gdGltZWQgaWYgdHJ1ZSwgd2FpdCBvbmx5IHVudGlsIHRpbWVvdXQgZWxhcHNlcworICAgICAqIEBwYXJhbSBuYW5vcyB0aW1lb3V0IGluIG5hbm9zZWNzLCB1c2VkIG9ubHkgaWYgdGltZWQgaXMgdHJ1ZQorICAgICAqIEByZXR1cm4gbWF0Y2hlZCBpdGVtLCBvciBlIGlmIHVubWF0Y2hlZCBvbiBpbnRlcnJ1cHQgb3IgdGltZW91dAorICAgICAqLworICAgIHByaXZhdGUgRSBhd2FpdE1hdGNoKE5vZGUgcywgTm9kZSBwcmVkLCBFIGUsIGJvb2xlYW4gdGltZWQsIGxvbmcgbmFub3MpIHsKKyAgICAgICAgbG9uZyBsYXN0VGltZSA9IHRpbWVkID8gU3lzdGVtLm5hbm9UaW1lKCkgOiAwTDsKKyAgICAgICAgVGhyZWFkIHcgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOworICAgICAgICBpbnQgc3BpbnMgPSAtMTsgLy8gaW5pdGlhbGl6ZWQgYWZ0ZXIgZmlyc3QgaXRlbSBhbmQgY2FuY2VsIGNoZWNrcworICAgICAgICBUaHJlYWRMb2NhbFJhbmRvbSByYW5kb21ZaWVsZHMgPSBudWxsOyAvLyBib3VuZCBpZiBuZWVkZWQKKworICAgICAgICBmb3IgKDsgOyApIHsKKyAgICAgICAgICAgIE9iamVjdCBpdGVtID0gcy5pdGVtOworICAgICAgICAgICAgaWYgKGl0ZW0gIT0gZSkgeyAgICAgICAgICAgICAgICAgIC8vIG1hdGNoZWQKKyAgICAgICAgICAgICAgICAvLyBhc3NlcnQgaXRlbSAhPSBzOworICAgICAgICAgICAgICAgIHMuZm9yZ2V0Q29udGVudHMoKTsgICAgICAgICAgIC8vIGF2b2lkIGdhcmJhZ2UKKyAgICAgICAgICAgICAgICByZXR1cm4gTGlua2VkVHJhbnNmZXJRdWV1ZS48RT5jYXN0KGl0ZW0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCh3LmlzSW50ZXJydXB0ZWQoKSB8fCAodGltZWQgJiYgbmFub3MgPD0gMCkpICYmCisgICAgICAgICAgICAgICAgICAgIHMuY2FzSXRlbShlLCBzKSkgeyAgICAgICAgLy8gY2FuY2VsCisgICAgICAgICAgICAgICAgdW5zcGxpY2UocHJlZCwgcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzcGlucyA8IDApIHsgICAgICAgICAgICAgICAgICAvLyBlc3RhYmxpc2ggc3BpbnMgYXQvbmVhciBmcm9udAorICAgICAgICAgICAgICAgIGlmICgoc3BpbnMgPSBzcGluc0ZvcihwcmVkLCBzLmlzRGF0YSkpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgcmFuZG9tWWllbGRzID0gVGhyZWFkTG9jYWxSYW5kb20uY3VycmVudCgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChzcGlucyA+IDApIHsgICAgICAgICAgICAgLy8gc3BpbgorICAgICAgICAgICAgICAgIC0tc3BpbnM7CisgICAgICAgICAgICAgICAgaWYgKHJhbmRvbVlpZWxkcy5uZXh0SW50KENIQUlORURfU1BJTlMpID09IDApCisgICAgICAgICAgICAgICAgICAgIFRocmVhZC55aWVsZCgpOyAgICAgICAgICAgLy8gb2NjYXNpb25hbGx5IHlpZWxkCisgICAgICAgICAgICB9IGVsc2UgaWYgKHMud2FpdGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzLndhaXRlciA9IHc7ICAgICAgICAgICAgICAgICAvLyByZXF1ZXN0IHVucGFyayB0aGVuIHJlY2hlY2sKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodGltZWQpIHsKKyAgICAgICAgICAgICAgICBsb25nIG5vdyA9IFN5c3RlbS5uYW5vVGltZSgpOworICAgICAgICAgICAgICAgIGlmICgobmFub3MgLT0gbm93IC0gbGFzdFRpbWUpID4gMCkKKyAgICAgICAgICAgICAgICAgICAgTG9ja1N1cHBvcnQucGFya05hbm9zKHRoaXMsIG5hbm9zKTsKKyAgICAgICAgICAgICAgICBsYXN0VGltZSA9IG5vdzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTG9ja1N1cHBvcnQucGFyayh0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgc3Bpbi95aWVsZCB2YWx1ZSBmb3IgYSBub2RlIHdpdGggZ2l2ZW4gcHJlZGVjZXNzb3IgYW5kCisgICAgICogZGF0YSBtb2RlLiBTZWUgYWJvdmUgZm9yIGV4cGxhbmF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludCBzcGluc0ZvcihOb2RlIHByZWQsIGJvb2xlYW4gaGF2ZURhdGEpIHsKKyAgICAgICAgaWYgKE1QICYmIHByZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHByZWQuaXNEYXRhICE9IGhhdmVEYXRhKSAgICAgIC8vIHBoYXNlIGNoYW5nZQorICAgICAgICAgICAgICAgIHJldHVybiBGUk9OVF9TUElOUyArIENIQUlORURfU1BJTlM7CisgICAgICAgICAgICBpZiAocHJlZC5pc01hdGNoZWQoKSkgICAgICAgICAgICAgLy8gcHJvYmFibHkgYXQgZnJvbnQKKyAgICAgICAgICAgICAgICByZXR1cm4gRlJPTlRfU1BJTlM7CisgICAgICAgICAgICBpZiAocHJlZC53YWl0ZXIgPT0gbnVsbCkgICAgICAgICAgLy8gcHJlZCBhcHBhcmVudGx5IHNwaW5uaW5nCisgICAgICAgICAgICAgICAgcmV0dXJuIENIQUlORURfU1BJTlM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyogLS0tLS0tLS0tLS0tLS0gVHJhdmVyc2FsIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0gKi8KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHN1Y2Nlc3NvciBvZiBwLCBvciB0aGUgaGVhZCBub2RlIGlmIHAubmV4dCBoYXMgYmVlbgorICAgICAqIGxpbmtlZCB0byBzZWxmLCB3aGljaCB3aWxsIG9ubHkgYmUgdHJ1ZSBpZiB0cmF2ZXJzaW5nIHdpdGggYQorICAgICAqIHN0YWxlIHBvaW50ZXIgdGhhdCBpcyBub3cgb2ZmIHRoZSBsaXN0LgorICAgICAqLworICAgIGZpbmFsIE5vZGUgc3VjYyhOb2RlIHApIHsKKyAgICAgICAgTm9kZSBuZXh0ID0gcC5uZXh0OworICAgICAgICByZXR1cm4gKHAgPT0gbmV4dCkgPyBoZWFkIDogbmV4dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCB1bm1hdGNoZWQgbm9kZSBvZiB0aGUgZ2l2ZW4gbW9kZSwgb3IgbnVsbCBpZgorICAgICAqIG5vbmUuICBVc2VkIGJ5IG1ldGhvZHMgaXNFbXB0eSwgaGFzV2FpdGluZ0NvbnN1bWVyLgorICAgICAqLworICAgIHByaXZhdGUgTm9kZSBmaXJzdE9mTW9kZShib29sZWFuIGlzRGF0YSkgeworICAgICAgICBmb3IgKE5vZGUgcCA9IGhlYWQ7IHAgIT0gbnVsbDsgcCA9IHN1Y2MocCkpIHsKKyAgICAgICAgICAgIGlmICghcC5pc01hdGNoZWQoKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gKHAuaXNEYXRhID09IGlzRGF0YSkgPyBwIDogbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBpdGVtIGluIHRoZSBmaXJzdCB1bm1hdGNoZWQgbm9kZSB3aXRoIGlzRGF0YTsgb3IKKyAgICAgKiBudWxsIGlmIG5vbmUuICBVc2VkIGJ5IHBlZWsuCisgICAgICovCisgICAgcHJpdmF0ZSBFIGZpcnN0RGF0YUl0ZW0oKSB7CisgICAgICAgIGZvciAoTm9kZSBwID0gaGVhZDsgcCAhPSBudWxsOyBwID0gc3VjYyhwKSkgeworICAgICAgICAgICAgT2JqZWN0IGl0ZW0gPSBwLml0ZW07CisgICAgICAgICAgICBpZiAocC5pc0RhdGEpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXRlbSAhPSBudWxsICYmIGl0ZW0gIT0gcCkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIExpbmtlZFRyYW5zZmVyUXVldWUuPEU+Y2FzdChpdGVtKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbSA9PSBudWxsKQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyYXZlcnNlcyBhbmQgY291bnRzIHVubWF0Y2hlZCBub2RlcyBvZiB0aGUgZ2l2ZW4gbW9kZS4KKyAgICAgKiBVc2VkIGJ5IG1ldGhvZHMgc2l6ZSBhbmQgZ2V0V2FpdGluZ0NvbnN1bWVyQ291bnQuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgY291bnRPZk1vZGUoYm9vbGVhbiBkYXRhKSB7CisgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgIGZvciAoTm9kZSBwID0gaGVhZDsgcCAhPSBudWxsOyApIHsKKyAgICAgICAgICAgIGlmICghcC5pc01hdGNoZWQoKSkgeworICAgICAgICAgICAgICAgIGlmIChwLmlzRGF0YSAhPSBkYXRhKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICBpZiAoKytjb3VudCA9PSBJbnRlZ2VyLk1BWF9WQUxVRSkgLy8gc2F0dXJhdGVkCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTm9kZSBuID0gcC5uZXh0OworICAgICAgICAgICAgaWYgKG4gIT0gcCkKKyAgICAgICAgICAgICAgICBwID0gbjsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBwID0gaGVhZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorCisgICAgZmluYWwgY2xhc3MgSXRyIGltcGxlbWVudHMgSXRlcmF0b3I8RT4geworICAgICAgICBwcml2YXRlIE5vZGUgbmV4dE5vZGU7ICAgLy8gbmV4dCBub2RlIHRvIHJldHVybiBpdGVtIGZvcgorICAgICAgICBwcml2YXRlIEUgbmV4dEl0ZW07ICAgICAgLy8gdGhlIGNvcnJlc3BvbmRpbmcgaXRlbQorICAgICAgICBwcml2YXRlIE5vZGUgbGFzdFJldDsgICAgLy8gbGFzdCByZXR1cm5lZCBub2RlLCB0byBzdXBwb3J0IHJlbW92ZQorICAgICAgICBwcml2YXRlIE5vZGUgbGFzdFByZWQ7ICAgLy8gcHJlZGVjZXNzb3IgdG8gdW5saW5rIGxhc3RSZXQKKworICAgICAgICAvKioKKyAgICAgICAgICogTW92ZXMgdG8gbmV4dCBub2RlIGFmdGVyIHByZXYsIG9yIGZpcnN0IG5vZGUgaWYgcHJldiBudWxsLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSB2b2lkIGFkdmFuY2UoTm9kZSBwcmV2KSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVG8gdHJhY2sgYW5kIGF2b2lkIGJ1aWxkdXAgb2YgZGVsZXRlZCBub2RlcyBpbiB0aGUgZmFjZQorICAgICAgICAgICAgICogb2YgY2FsbHMgdG8gYm90aCBRdWV1ZS5yZW1vdmUgYW5kIEl0ci5yZW1vdmUsIHdlIG11c3QKKyAgICAgICAgICAgICAqIGluY2x1ZGUgdmFyaWFudHMgb2YgdW5zcGxpY2UgYW5kIHN3ZWVwIHVwb24gZWFjaAorICAgICAgICAgICAgICogYWR2YW5jZTogVXBvbiBJdHIucmVtb3ZlLCB3ZSBtYXkgbmVlZCB0byBjYXRjaCB1cCBsaW5rcworICAgICAgICAgICAgICogZnJvbSBsYXN0UHJlZCwgYW5kIHVwb24gb3RoZXIgcmVtb3Zlcywgd2UgbWlnaHQgbmVlZCB0bworICAgICAgICAgICAgICogc2tpcCBhaGVhZCBmcm9tIHN0YWxlIG5vZGVzIGFuZCB1bnNwbGljZSBkZWxldGVkIG9uZXMKKyAgICAgICAgICAgICAqIGZvdW5kIHdoaWxlIGFkdmFuY2luZy4KKyAgICAgICAgICAgICAqLworCisgICAgICAgICAgICBOb2RlIHIsIGI7IC8vIHJlc2V0IGxhc3RQcmVkIHVwb24gcG9zc2libGUgZGVsZXRpb24gb2YgbGFzdFJldAorICAgICAgICAgICAgaWYgKChyID0gbGFzdFJldCkgIT0gbnVsbCAmJiAhci5pc01hdGNoZWQoKSkKKyAgICAgICAgICAgICAgICBsYXN0UHJlZCA9IHI7ICAgIC8vIG5leHQgbGFzdFByZWQgaXMgb2xkIGxhc3RSZXQKKyAgICAgICAgICAgIGVsc2UgaWYgKChiID0gbGFzdFByZWQpID09IG51bGwgfHwgYi5pc01hdGNoZWQoKSkKKyAgICAgICAgICAgICAgICBsYXN0UHJlZCA9IG51bGw7IC8vIGF0IHN0YXJ0IG9mIGxpc3QKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIE5vZGUgcywgbjsgICAgICAgLy8gaGVscCB3aXRoIHJlbW92YWwgb2YgbGFzdFByZWQubmV4dAorICAgICAgICAgICAgICAgIHdoaWxlICgocyA9IGIubmV4dCkgIT0gbnVsbCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgcyAhPSBiICYmIHMuaXNNYXRjaGVkKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChuID0gcy5uZXh0KSAhPSBudWxsICYmIG4gIT0gcykKKyAgICAgICAgICAgICAgICAgICAgYi5jYXNOZXh0KHMsIG4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLmxhc3RSZXQgPSBwcmV2OworCisgICAgICAgICAgICBmb3IgKE5vZGUgcCA9IHByZXYsIHMsIG47IDsgKSB7CisgICAgICAgICAgICAgICAgcyA9IChwID09IG51bGwpID8gaGVhZCA6IHAubmV4dDsKKyAgICAgICAgICAgICAgICBpZiAocyA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzID09IHApIHsKKyAgICAgICAgICAgICAgICAgICAgcCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBPYmplY3QgaXRlbSA9IHMuaXRlbTsKKyAgICAgICAgICAgICAgICBpZiAocy5pc0RhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCAmJiBpdGVtICE9IHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHRJdGVtID0gTGlua2VkVHJhbnNmZXJRdWV1ZS48RT5jYXN0KGl0ZW0pOworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dE5vZGUgPSBzOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIC8vIGFzc2VydCBzLmlzTWF0Y2hlZCgpOworICAgICAgICAgICAgICAgIGlmIChwID09IG51bGwpCisgICAgICAgICAgICAgICAgICAgIHAgPSBzOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKChuID0gcy5uZXh0KSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChzID09IG4pCisgICAgICAgICAgICAgICAgICAgIHAgPSBudWxsOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgcC5jYXNOZXh0KHMsIG4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmV4dE5vZGUgPSBudWxsOworICAgICAgICAgICAgbmV4dEl0ZW0gPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgSXRyKCkgeworICAgICAgICAgICAgYWR2YW5jZShudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV4dE5vZGUgIT0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmaW5hbCBFIG5leHQoKSB7CisgICAgICAgICAgICBOb2RlIHAgPSBuZXh0Tm9kZTsKKyAgICAgICAgICAgIGlmIChwID09IG51bGwpIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICBFIGUgPSBuZXh0SXRlbTsKKyAgICAgICAgICAgIGFkdmFuY2UocCk7CisgICAgICAgICAgICByZXR1cm4gZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBmaW5hbCB2b2lkIHJlbW92ZSgpIHsKKyAgICAgICAgICAgIGZpbmFsIE5vZGUgbGFzdFJldCA9IHRoaXMubGFzdFJldDsKKyAgICAgICAgICAgIGlmIChsYXN0UmV0ID09IG51bGwpCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICAgICAgdGhpcy5sYXN0UmV0ID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChsYXN0UmV0LnRyeU1hdGNoRGF0YSgpKQorICAgICAgICAgICAgICAgIHVuc3BsaWNlKGxhc3RQcmVkLCBsYXN0UmV0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIC0tLS0tLS0tLS0tLS0tIFJlbW92YWwgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLSAqLworCisgICAgLyoqCisgICAgICogVW5zcGxpY2VzIChub3cgb3IgbGF0ZXIpIHRoZSBnaXZlbiBkZWxldGVkL2NhbmNlbGxlZCBub2RlIHdpdGgKKyAgICAgKiB0aGUgZ2l2ZW4gcHJlZGVjZXNzb3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJlZCBhIG5vZGUgdGhhdCB3YXMgYXQgb25lIHRpbWUga25vd24gdG8gYmUgdGhlCisgICAgICogICAgICAgICAgICAgcHJlZGVjZXNzb3Igb2Ygcywgb3IgbnVsbCBvciBzIGl0c2VsZiBpZiBzIGlzL3dhcyBhdCBoZWFkCisgICAgICogQHBhcmFtIHMgICAgdGhlIG5vZGUgdG8gYmUgdW5zcGxpY2VkCisgICAgICovCisgICAgZmluYWwgdm9pZCB1bnNwbGljZShOb2RlIHByZWQsIE5vZGUgcykgeworICAgICAgICBzLmZvcmdldENvbnRlbnRzKCk7IC8vIGZvcmdldCB1bm5lZWRlZCBmaWVsZHMKKyAgICAgICAgLyoKKyAgICAgICAgICogU2VlIGFib3ZlIGZvciByYXRpb25hbGUuIEJyaWVmbHk6IGlmIHByZWQgc3RpbGwgcG9pbnRzIHRvCisgICAgICAgICAqIHMsIHRyeSB0byB1bmxpbmsgcy4gIElmIHMgY2Fubm90IGJlIHVubGlua2VkLCBiZWNhdXNlIGl0IGlzCisgICAgICAgICAqIHRyYWlsaW5nIG5vZGUgb3IgcHJlZCBtaWdodCBiZSB1bmxpbmtlZCwgYW5kIG5laXRoZXIgcHJlZAorICAgICAgICAgKiBub3IgcyBhcmUgaGVhZCBvciBvZmZsaXN0LCBhZGQgdG8gc3dlZXBWb3RlcywgYW5kIGlmIGVub3VnaAorICAgICAgICAgKiB2b3RlcyBoYXZlIGFjY3VtdWxhdGVkLCBzd2VlcC4KKyAgICAgICAgICovCisgICAgICAgIGlmIChwcmVkICE9IG51bGwgJiYgcHJlZCAhPSBzICYmIHByZWQubmV4dCA9PSBzKSB7CisgICAgICAgICAgICBOb2RlIG4gPSBzLm5leHQ7CisgICAgICAgICAgICBpZiAobiA9PSBudWxsIHx8CisgICAgICAgICAgICAgICAgICAgIChuICE9IHMgJiYgcHJlZC5jYXNOZXh0KHMsIG4pICYmIHByZWQuaXNNYXRjaGVkKCkpKSB7CisgICAgICAgICAgICAgICAgZm9yICg7IDsgKSB7ICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgYXQsIG9yIGNvdWxkIGJlLCBoZWFkCisgICAgICAgICAgICAgICAgICAgIE5vZGUgaCA9IGhlYWQ7CisgICAgICAgICAgICAgICAgICAgIGlmIChoID09IHByZWQgfHwgaCA9PSBzIHx8IGggPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsgICAgICAgICAgLy8gYXQgaGVhZCBvciBsaXN0IGVtcHR5CisgICAgICAgICAgICAgICAgICAgIGlmICghaC5pc01hdGNoZWQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBOb2RlIGhuID0gaC5uZXh0OworICAgICAgICAgICAgICAgICAgICBpZiAoaG4gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsgICAgICAgICAgLy8gbm93IGVtcHR5CisgICAgICAgICAgICAgICAgICAgIGlmIChobiAhPSBoICYmIGNhc0hlYWQoaCwgaG4pKQorICAgICAgICAgICAgICAgICAgICAgICAgaC5mb3JnZXROZXh0KCk7ICAvLyBhZHZhbmNlIGhlYWQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHByZWQubmV4dCAhPSBwcmVkICYmIHMubmV4dCAhPSBzKSB7IC8vIHJlY2hlY2sgaWYgb2ZmbGlzdAorICAgICAgICAgICAgICAgICAgICBmb3IgKDsgOyApIHsgICAgICAgICAgIC8vIHN3ZWVwIG5vdyBpZiBlbm91Z2ggdm90ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCB2ID0gc3dlZXBWb3RlczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2IDwgU1dFRVBfVEhSRVNIT0xEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNhc1N3ZWVwVm90ZXModiwgdiArIDEpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FzU3dlZXBWb3Rlcyh2LCAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3ZWVwKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVbmxpbmtzIG1hdGNoZWQgKHR5cGljYWxseSBjYW5jZWxsZWQpIG5vZGVzIGVuY291bnRlcmVkIGluIGEKKyAgICAgKiB0cmF2ZXJzYWwgZnJvbSBoZWFkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzd2VlcCgpIHsKKyAgICAgICAgZm9yIChOb2RlIHAgPSBoZWFkLCBzLCBuOyBwICE9IG51bGwgJiYgKHMgPSBwLm5leHQpICE9IG51bGw7ICkgeworICAgICAgICAgICAgaWYgKCFzLmlzTWF0Y2hlZCgpKQorICAgICAgICAgICAgICAgIC8vIFVubWF0Y2hlZCBub2RlcyBhcmUgbmV2ZXIgc2VsZi1saW5rZWQKKyAgICAgICAgICAgICAgICBwID0gczsKKyAgICAgICAgICAgIGVsc2UgaWYgKChuID0gcy5uZXh0KSA9PSBudWxsKSAvLyB0cmFpbGluZyBub2RlIGlzIHBpbm5lZAorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZWxzZSBpZiAocyA9PSBuKSAgICAvLyBzdGFsZQorICAgICAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gYWxzbyBjaGVjayBmb3IgcCA9PSBzLCBzaW5jZSB0aGF0IGltcGxpZXMgcyA9PSBuCisgICAgICAgICAgICAgICAgcCA9IGhlYWQ7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcC5jYXNOZXh0KHMsIG4pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFpbiBpbXBsZW1lbnRhdGlvbiBvZiByZW1vdmUoT2JqZWN0KQorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBmaW5kQW5kUmVtb3ZlKE9iamVjdCBlKSB7CisgICAgICAgIGlmIChlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoTm9kZSBwcmVkID0gbnVsbCwgcCA9IGhlYWQ7IHAgIT0gbnVsbDsgKSB7CisgICAgICAgICAgICAgICAgT2JqZWN0IGl0ZW0gPSBwLml0ZW07CisgICAgICAgICAgICAgICAgaWYgKHAuaXNEYXRhKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtICE9IG51bGwgJiYgaXRlbSAhPSBwICYmIGUuZXF1YWxzKGl0ZW0pICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcC50cnlNYXRjaERhdGEoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdW5zcGxpY2UocHJlZCwgcCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbSA9PSBudWxsKQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBwcmVkID0gcDsKKyAgICAgICAgICAgICAgICBpZiAoKHAgPSBwLm5leHQpID09IHByZWQpIHsgLy8gc3RhbGUKKyAgICAgICAgICAgICAgICAgICAgcHJlZCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIHAgPSBoZWFkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIGluaXRpYWxseSBlbXB0eSB7QGNvZGUgTGlua2VkVHJhbnNmZXJRdWV1ZX0uCisgICAgICovCisgICAgcHVibGljIExpbmtlZFRyYW5zZmVyUXVldWUoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHtAY29kZSBMaW5rZWRUcmFuc2ZlclF1ZXVlfQorICAgICAqIGluaXRpYWxseSBjb250YWluaW5nIHRoZSBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gY29sbGVjdGlvbiwKKyAgICAgKiBhZGRlZCBpbiB0cmF2ZXJzYWwgb3JkZXIgb2YgdGhlIGNvbGxlY3Rpb24ncyBpdGVyYXRvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjIHRoZSBjb2xsZWN0aW9uIG9mIGVsZW1lbnRzIHRvIGluaXRpYWxseSBjb250YWluCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gb3IgYW55CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBpdHMgZWxlbWVudHMgYXJlIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlua2VkVHJhbnNmZXJRdWV1ZShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjKSB7CisgICAgICAgIHRoaXMoKTsKKyAgICAgICAgYWRkQWxsKGMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluc2VydHMgdGhlIHNwZWNpZmllZCBlbGVtZW50IGF0IHRoZSB0YWlsIG9mIHRoaXMgcXVldWUuCisgICAgICogQXMgdGhlIHF1ZXVlIGlzIHVuYm91bmRlZCwgdGhpcyBtZXRob2Qgd2lsbCBuZXZlciBibG9jay4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCBlbGVtZW50IGlzIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwdXQoRSBlKSB7CisgICAgICAgIHhmZXIoZSwgdHJ1ZSwgQVNZTkMsIDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluc2VydHMgdGhlIHNwZWNpZmllZCBlbGVtZW50IGF0IHRoZSB0YWlsIG9mIHRoaXMgcXVldWUuCisgICAgICogQXMgdGhlIHF1ZXVlIGlzIHVuYm91bmRlZCwgdGhpcyBtZXRob2Qgd2lsbCBuZXZlciBibG9jayBvcgorICAgICAqIHJldHVybiB7QGNvZGUgZmFsc2V9LgorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gKGFzIHNwZWNpZmllZCBieQorICAgICAqICAgICAgICAge0BsaW5rIGphdmEudXRpbC5jb25jdXJyZW50LkJsb2NraW5nUXVldWUjb2ZmZXIoT2JqZWN0LCBsb25nLCBUaW1lVW5pdCkKKyAgICAgKiAgICAgICAgIEJsb2NraW5nUXVldWUub2ZmZXJ9KQorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCBlbGVtZW50IGlzIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBvZmZlcihFIGUsIGxvbmcgdGltZW91dCwgVGltZVVuaXQgdW5pdCkgeworICAgICAgICB4ZmVyKGUsIHRydWUsIEFTWU5DLCAwKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5zZXJ0cyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgYXQgdGhlIHRhaWwgb2YgdGhpcyBxdWV1ZS4KKyAgICAgKiBBcyB0aGUgcXVldWUgaXMgdW5ib3VuZGVkLCB0aGlzIG1ldGhvZCB3aWxsIG5ldmVyIHJldHVybiB7QGNvZGUgZmFsc2V9LgorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gKGFzIHNwZWNpZmllZCBieSB7QGxpbmsgUXVldWUjb2ZmZXJ9KQorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCBlbGVtZW50IGlzIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBvZmZlcihFIGUpIHsKKyAgICAgICAgeGZlcihlLCB0cnVlLCBBU1lOQywgMCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluc2VydHMgdGhlIHNwZWNpZmllZCBlbGVtZW50IGF0IHRoZSB0YWlsIG9mIHRoaXMgcXVldWUuCisgICAgICogQXMgdGhlIHF1ZXVlIGlzIHVuYm91bmRlZCwgdGhpcyBtZXRob2Qgd2lsbCBuZXZlciB0aHJvdworICAgICAqIHtAbGluayBJbGxlZ2FsU3RhdGVFeGNlcHRpb259IG9yIHJldHVybiB7QGNvZGUgZmFsc2V9LgorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gKGFzIHNwZWNpZmllZCBieSB7QGxpbmsgQ29sbGVjdGlvbiNhZGR9KQorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCBlbGVtZW50IGlzIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBhZGQoRSBlKSB7CisgICAgICAgIHhmZXIoZSwgdHJ1ZSwgQVNZTkMsIDApOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2ZlcnMgdGhlIGVsZW1lbnQgdG8gYSB3YWl0aW5nIGNvbnN1bWVyIGltbWVkaWF0ZWx5LCBpZiBwb3NzaWJsZS4KKyAgICAgKgorICAgICAqIDxwPk1vcmUgcHJlY2lzZWx5LCB0cmFuc2ZlcnMgdGhlIHNwZWNpZmllZCBlbGVtZW50IGltbWVkaWF0ZWx5CisgICAgICogaWYgdGhlcmUgZXhpc3RzIGEgY29uc3VtZXIgYWxyZWFkeSB3YWl0aW5nIHRvIHJlY2VpdmUgaXQgKGluCisgICAgICoge0BsaW5rICN0YWtlfSBvciB0aW1lZCB7QGxpbmsgI3BvbGwobG9uZywgVGltZVVuaXQpIHBvbGx9KSwKKyAgICAgKiBvdGhlcndpc2UgcmV0dXJuaW5nIHtAY29kZSBmYWxzZX0gd2l0aG91dCBlbnF1ZXVpbmcgdGhlIGVsZW1lbnQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBpcyBudWxsCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gdHJ5VHJhbnNmZXIoRSBlKSB7CisgICAgICAgIHJldHVybiB4ZmVyKGUsIHRydWUsIE5PVywgMCkgPT0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2ZlcnMgdGhlIGVsZW1lbnQgdG8gYSBjb25zdW1lciwgd2FpdGluZyBpZiBuZWNlc3NhcnkgdG8gZG8gc28uCisgICAgICoKKyAgICAgKiA8cD5Nb3JlIHByZWNpc2VseSwgdHJhbnNmZXJzIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBpbW1lZGlhdGVseQorICAgICAqIGlmIHRoZXJlIGV4aXN0cyBhIGNvbnN1bWVyIGFscmVhZHkgd2FpdGluZyB0byByZWNlaXZlIGl0IChpbgorICAgICAqIHtAbGluayAjdGFrZX0gb3IgdGltZWQge0BsaW5rICNwb2xsKGxvbmcsIFRpbWVVbml0KSBwb2xsfSksCisgICAgICogZWxzZSBpbnNlcnRzIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBhdCB0aGUgdGFpbCBvZiB0aGlzIHF1ZXVlCisgICAgICogYW5kIHdhaXRzIHVudGlsIHRoZSBlbGVtZW50IGlzIHJlY2VpdmVkIGJ5IGEgY29uc3VtZXIuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBpcyBudWxsCisgICAgICovCisgICAgcHVibGljIHZvaWQgdHJhbnNmZXIoRSBlKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpZiAoeGZlcihlLCB0cnVlLCBTWU5DLCAwKSAhPSBudWxsKSB7CisgICAgICAgICAgICBUaHJlYWQuaW50ZXJydXB0ZWQoKTsgLy8gZmFpbHVyZSBwb3NzaWJsZSBvbmx5IGR1ZSB0byBpbnRlcnJ1cHQKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJhbnNmZXJzIHRoZSBlbGVtZW50IHRvIGEgY29uc3VtZXIgaWYgaXQgaXMgcG9zc2libGUgdG8gZG8gc28KKyAgICAgKiBiZWZvcmUgdGhlIHRpbWVvdXQgZWxhcHNlcy4KKyAgICAgKgorICAgICAqIDxwPk1vcmUgcHJlY2lzZWx5LCB0cmFuc2ZlcnMgdGhlIHNwZWNpZmllZCBlbGVtZW50IGltbWVkaWF0ZWx5CisgICAgICogaWYgdGhlcmUgZXhpc3RzIGEgY29uc3VtZXIgYWxyZWFkeSB3YWl0aW5nIHRvIHJlY2VpdmUgaXQgKGluCisgICAgICoge0BsaW5rICN0YWtlfSBvciB0aW1lZCB7QGxpbmsgI3BvbGwobG9uZywgVGltZVVuaXQpIHBvbGx9KSwKKyAgICAgKiBlbHNlIGluc2VydHMgdGhlIHNwZWNpZmllZCBlbGVtZW50IGF0IHRoZSB0YWlsIG9mIHRoaXMgcXVldWUKKyAgICAgKiBhbmQgd2FpdHMgdW50aWwgdGhlIGVsZW1lbnQgaXMgcmVjZWl2ZWQgYnkgYSBjb25zdW1lciwKKyAgICAgKiByZXR1cm5pbmcge0Bjb2RlIGZhbHNlfSBpZiB0aGUgc3BlY2lmaWVkIHdhaXQgdGltZSBlbGFwc2VzCisgICAgICogYmVmb3JlIHRoZSBlbGVtZW50IGNhbiBiZSB0cmFuc2ZlcnJlZC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhlIHNwZWNpZmllZCBlbGVtZW50IGlzIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiB0cnlUcmFuc2ZlcihFIGUsIGxvbmcgdGltZW91dCwgVGltZVVuaXQgdW5pdCkKKyAgICAgICAgICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICh4ZmVyKGUsIHRydWUsIFRJTUVELCB1bml0LnRvTmFub3ModGltZW91dCkpID09IG51bGwpCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKCFUaHJlYWQuaW50ZXJydXB0ZWQoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgdGhyb3cgbmV3IEludGVycnVwdGVkRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgcHVibGljIEUgdGFrZSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIEUgZSA9IHhmZXIobnVsbCwgZmFsc2UsIFNZTkMsIDApOworICAgICAgICBpZiAoZSAhPSBudWxsKQorICAgICAgICAgICAgcmV0dXJuIGU7CisgICAgICAgIFRocmVhZC5pbnRlcnJ1cHRlZCgpOworICAgICAgICB0aHJvdyBuZXcgSW50ZXJydXB0ZWRFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRSBwb2xsKGxvbmcgdGltZW91dCwgVGltZVVuaXQgdW5pdCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgRSBlID0geGZlcihudWxsLCBmYWxzZSwgVElNRUQsIHVuaXQudG9OYW5vcyh0aW1lb3V0KSk7CisgICAgICAgIGlmIChlICE9IG51bGwgfHwgIVRocmVhZC5pbnRlcnJ1cHRlZCgpKQorICAgICAgICAgICAgcmV0dXJuIGU7CisgICAgICAgIHRocm93IG5ldyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyBFIHBvbGwoKSB7CisgICAgICAgIHJldHVybiB4ZmVyKG51bGwsIGZhbHNlLCBOT1csIDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gICAgIHtAaW5oZXJpdERvY30KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgcHVibGljIGludCBkcmFpblRvKENvbGxlY3Rpb248PyBzdXBlciBFPiBjKSB7CisgICAgICAgIGlmIChjID09IG51bGwpCisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKKyAgICAgICAgaWYgKGMgPT0gdGhpcykKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgaW50IG4gPSAwOworICAgICAgICBmb3IgKEUgZTsgKGUgPSBwb2xsKCkpICE9IG51bGw7ICkgeworICAgICAgICAgICAgYy5hZGQoZSk7CisgICAgICAgICAgICArK247CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG47CisgICAgfQorCisgICAgLyoqCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiAgICAge0Bpbmhlcml0RG9jfQorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGRyYWluVG8oQ29sbGVjdGlvbjw/IHN1cGVyIEU+IGMsIGludCBtYXhFbGVtZW50cykgeworICAgICAgICBpZiAoYyA9PSBudWxsKQorICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7CisgICAgICAgIGlmIChjID09IHRoaXMpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIGludCBuID0gMDsKKyAgICAgICAgZm9yIChFIGU7IG4gPCBtYXhFbGVtZW50cyAmJiAoZSA9IHBvbGwoKSkgIT0gbnVsbDsgKSB7CisgICAgICAgICAgICBjLmFkZChlKTsKKyAgICAgICAgICAgICsrbjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGVsZW1lbnRzIGluIHRoaXMgcXVldWUgaW4gcHJvcGVyIHNlcXVlbmNlLgorICAgICAqIFRoZSBlbGVtZW50cyB3aWxsIGJlIHJldHVybmVkIGluIG9yZGVyIGZyb20gZmlyc3QgKGhlYWQpIHRvIGxhc3QgKHRhaWwpLgorICAgICAqCisgICAgICogPHA+VGhlIHJldHVybmVkIGl0ZXJhdG9yIGlzIGEgIndlYWtseSBjb25zaXN0ZW50IiBpdGVyYXRvciB0aGF0CisgICAgICogd2lsbCBuZXZlciB0aHJvdyB7QGxpbmsgamF2YS51dGlsLkNvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24KKyAgICAgKiBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9ufSwgYW5kIGd1YXJhbnRlZXMgdG8gdHJhdmVyc2UKKyAgICAgKiBlbGVtZW50cyBhcyB0aGV5IGV4aXN0ZWQgdXBvbiBjb25zdHJ1Y3Rpb24gb2YgdGhlIGl0ZXJhdG9yLCBhbmQKKyAgICAgKiBtYXkgKGJ1dCBpcyBub3QgZ3VhcmFudGVlZCB0bykgcmVmbGVjdCBhbnkgbW9kaWZpY2F0aW9ucworICAgICAqIHN1YnNlcXVlbnQgdG8gY29uc3RydWN0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBhbiBpdGVyYXRvciBvdmVyIHRoZSBlbGVtZW50cyBpbiB0aGlzIHF1ZXVlIGluIHByb3BlciBzZXF1ZW5jZQorICAgICAqLworICAgIHB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJdHIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRSBwZWVrKCkgeworICAgICAgICByZXR1cm4gZmlyc3REYXRhSXRlbSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoaXMgcXVldWUgY29udGFpbnMgbm8gZWxlbWVudHMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIHF1ZXVlIGNvbnRhaW5zIG5vIGVsZW1lbnRzCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKyAgICAgICAgZm9yIChOb2RlIHAgPSBoZWFkOyBwICE9IG51bGw7IHAgPSBzdWNjKHApKSB7CisgICAgICAgICAgICBpZiAoIXAuaXNNYXRjaGVkKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuICFwLmlzRGF0YTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNXYWl0aW5nQ29uc3VtZXIoKSB7CisgICAgICAgIHJldHVybiBmaXJzdE9mTW9kZShmYWxzZSkgIT0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBxdWV1ZS4gIElmIHRoaXMgcXVldWUKKyAgICAgKiBjb250YWlucyBtb3JlIHRoYW4ge0Bjb2RlIEludGVnZXIuTUFYX1ZBTFVFfSBlbGVtZW50cywgcmV0dXJucworICAgICAqIHtAY29kZSBJbnRlZ2VyLk1BWF9WQUxVRX0uCisgICAgICoKKyAgICAgKiA8cD5CZXdhcmUgdGhhdCwgdW5saWtlIGluIG1vc3QgY29sbGVjdGlvbnMsIHRoaXMgbWV0aG9kIGlzCisgICAgICogPGVtPk5PVDwvZW0+IGEgY29uc3RhbnQtdGltZSBvcGVyYXRpb24uIEJlY2F1c2Ugb2YgdGhlCisgICAgICogYXN5bmNocm9ub3VzIG5hdHVyZSBvZiB0aGVzZSBxdWV1ZXMsIGRldGVybWluaW5nIHRoZSBjdXJyZW50CisgICAgICogbnVtYmVyIG9mIGVsZW1lbnRzIHJlcXVpcmVzIGFuIE8obikgdHJhdmVyc2FsLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgcXVldWUKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHNpemUoKSB7CisgICAgICAgIHJldHVybiBjb3VudE9mTW9kZSh0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFdhaXRpbmdDb25zdW1lckNvdW50KCkgeworICAgICAgICByZXR1cm4gY291bnRPZk1vZGUoZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50IGZyb20gdGhpcyBxdWV1ZSwKKyAgICAgKiBpZiBpdCBpcyBwcmVzZW50LiAgTW9yZSBmb3JtYWxseSwgcmVtb3ZlcyBhbiBlbGVtZW50IHtAY29kZSBlfSBzdWNoCisgICAgICogdGhhdCB7QGNvZGUgby5lcXVhbHMoZSl9LCBpZiB0aGlzIHF1ZXVlIGNvbnRhaW5zIG9uZSBvciBtb3JlIHN1Y2gKKyAgICAgKiBlbGVtZW50cy4KKyAgICAgKiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIHF1ZXVlIGNvbnRhaW5lZCB0aGUgc3BlY2lmaWVkIGVsZW1lbnQKKyAgICAgKiAob3IgZXF1aXZhbGVudGx5LCBpZiB0aGlzIHF1ZXVlIGNoYW5nZWQgYXMgYSByZXN1bHQgb2YgdGhlIGNhbGwpLgorICAgICAqCisgICAgICogQHBhcmFtIG8gZWxlbWVudCB0byBiZSByZW1vdmVkIGZyb20gdGhpcyBxdWV1ZSwgaWYgcHJlc2VudAorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgcXVldWUgY2hhbmdlZCBhcyBhIHJlc3VsdCBvZiB0aGUgY2FsbAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgeworICAgICAgICByZXR1cm4gZmluZEFuZFJlbW92ZShvKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGlzIHF1ZXVlIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgZWxlbWVudC4KKyAgICAgKiBNb3JlIGZvcm1hbGx5LCByZXR1cm5zIHtAY29kZSB0cnVlfSBpZiBhbmQgb25seSBpZiB0aGlzIHF1ZXVlIGNvbnRhaW5zCisgICAgICogYXQgbGVhc3Qgb25lIGVsZW1lbnQge0Bjb2RlIGV9IHN1Y2ggdGhhdCB7QGNvZGUgby5lcXVhbHMoZSl9LgorICAgICAqCisgICAgICogQHBhcmFtIG8gb2JqZWN0IHRvIGJlIGNoZWNrZWQgZm9yIGNvbnRhaW5tZW50IGluIHRoaXMgcXVldWUKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIHF1ZXVlIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgZWxlbWVudAorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7CisgICAgICAgIGlmIChvID09IG51bGwpIHJldHVybiBmYWxzZTsKKyAgICAgICAgZm9yIChOb2RlIHAgPSBoZWFkOyBwICE9IG51bGw7IHAgPSBzdWNjKHApKSB7CisgICAgICAgICAgICBPYmplY3QgaXRlbSA9IHAuaXRlbTsKKyAgICAgICAgICAgIGlmIChwLmlzRGF0YSkgeworICAgICAgICAgICAgICAgIGlmIChpdGVtICE9IG51bGwgJiYgaXRlbSAhPSBwICYmIG8uZXF1YWxzKGl0ZW0pKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbSA9PSBudWxsKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbHdheXMgcmV0dXJucyB7QGNvZGUgSW50ZWdlci5NQVhfVkFMVUV9IGJlY2F1c2UgYQorICAgICAqIHtAY29kZSBMaW5rZWRUcmFuc2ZlclF1ZXVlfSBpcyBub3QgY2FwYWNpdHkgY29uc3RyYWluZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSBJbnRlZ2VyLk1BWF9WQUxVRX0gKGFzIHNwZWNpZmllZCBieQorICAgICAqICAgICAgICAge0BsaW5rIGphdmEudXRpbC5jb25jdXJyZW50LkJsb2NraW5nUXVldWUjcmVtYWluaW5nQ2FwYWNpdHkoKQorICAgICAqICAgICAgICAgQmxvY2tpbmdRdWV1ZS5yZW1haW5pbmdDYXBhY2l0eX0pCisgICAgICovCisgICAgcHVibGljIGludCByZW1haW5pbmdDYXBhY2l0eSgpIHsKKyAgICAgICAgcmV0dXJuIEludGVnZXIuTUFYX1ZBTFVFOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNhdmVzIHRoZSBzdGF0ZSB0byBhIHN0cmVhbSAodGhhdCBpcywgc2VyaWFsaXplcyBpdCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcyB0aGUgc3RyZWFtCisgICAgICogQHNlcmlhbERhdGEgQWxsIG9mIHRoZSBlbGVtZW50cyAoZWFjaCBhbiB7QGNvZGUgRX0pIGluCisgICAgICogdGhlIHByb3BlciBvcmRlciwgZm9sbG93ZWQgYnkgYSBudWxsCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlT2JqZWN0KGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtIHMpCisgICAgICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7CisgICAgICAgIHMuZGVmYXVsdFdyaXRlT2JqZWN0KCk7CisgICAgICAgIGZvciAoRSBlIDogdGhpcykKKyAgICAgICAgICAgIHMud3JpdGVPYmplY3QoZSk7CisgICAgICAgIC8vIFVzZSB0cmFpbGluZyBudWxsIGFzIHNlbnRpbmVsCisgICAgICAgIHMud3JpdGVPYmplY3QobnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVjb25zdGl0dXRlcyB0aGUgUXVldWUgaW5zdGFuY2UgZnJvbSBhIHN0cmVhbSAodGhhdCBpcywKKyAgICAgKiBkZXNlcmlhbGl6ZXMgaXQpLgorICAgICAqCisgICAgICogQHBhcmFtIHMgdGhlIHN0cmVhbQorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW0gcykKKyAgICAgICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgcy5kZWZhdWx0UmVhZE9iamVjdCgpOworICAgICAgICBmb3IgKDsgOyApIHsKKyAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICAgICAgRSBpdGVtID0gKEUpIHMucmVhZE9iamVjdCgpOworICAgICAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBvZmZlcihpdGVtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFVuc2FmZSBtZWNoYW5pY3MKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIHN1bi5taXNjLlVuc2FmZSBVTlNBRkU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBoZWFkT2Zmc2V0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgdGFpbE9mZnNldDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHN3ZWVwVm90ZXNPZmZzZXQ7CisKKyAgICBzdGF0aWMgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgVU5TQUZFID0gZ2V0VW5zYWZlKCk7CisgICAgICAgICAgICBDbGFzczw/PiBrID0gTGlua2VkVHJhbnNmZXJRdWV1ZS5jbGFzczsKKyAgICAgICAgICAgIGhlYWRPZmZzZXQgPSBVTlNBRkUub2JqZWN0RmllbGRPZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgKGsuZ2V0RGVjbGFyZWRGaWVsZCgiaGVhZCIpKTsKKyAgICAgICAgICAgIHRhaWxPZmZzZXQgPSBVTlNBRkUub2JqZWN0RmllbGRPZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgKGsuZ2V0RGVjbGFyZWRGaWVsZCgidGFpbCIpKTsKKyAgICAgICAgICAgIHN3ZWVwVm90ZXNPZmZzZXQgPSBVTlNBRkUub2JqZWN0RmllbGRPZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgKGsuZ2V0RGVjbGFyZWRGaWVsZCgic3dlZXBWb3RlcyIpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzdW4ubWlzYy5VbnNhZmUuICBTdWl0YWJsZSBmb3IgdXNlIGluIGEgM3JkIHBhcnR5IHBhY2thZ2UuCisgICAgICogUmVwbGFjZSB3aXRoIGEgc2ltcGxlIGNhbGwgdG8gVW5zYWZlLmdldFVuc2FmZSB3aGVuIGludGVncmF0aW5nCisgICAgICogaW50byBhIGpkay4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBzdW4ubWlzYy5VbnNhZmUKKyAgICAgKi8KKyAgICBzdGF0aWMgc3VuLm1pc2MuVW5zYWZlIGdldFVuc2FmZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBzdW4ubWlzYy5VbnNhZmUuZ2V0VW5zYWZlKCk7CisgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIHRyeVJlZmxlY3Rpb25JbnN0ZWFkKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkCisgICAgICAgICAgICAgICAgICAgIChuZXcgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkRXhjZXB0aW9uQWN0aW9uPHN1bi5taXNjLlVuc2FmZT4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgc3VuLm1pc2MuVW5zYWZlIHJ1bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPHN1bi5taXNjLlVuc2FmZT4gayA9IHN1bi5taXNjLlVuc2FmZS5jbGFzczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGphdmEubGFuZy5yZWZsZWN0LkZpZWxkIGYgOiBrLmdldERlY2xhcmVkRmllbGRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZi5zZXRBY2Nlc3NpYmxlKHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgeCA9IGYuZ2V0KG51bGwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoay5pc0luc3RhbmNlKHgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGsuY2FzdCh4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEZpZWxkRXJyb3IoInRoZSBVbnNhZmUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIH0gY2F0Y2ggKGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ291bGQgbm90IGluaXRpYWxpemUgaW50cmluc2ljcyIsCisgICAgICAgICAgICAgICAgICAgIGUuZ2V0Q2F1c2UoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvY29sbGVjdGlvbi9NdWx0aXZhbHVlZFN0cmluZ01hcC5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL2NvbGxlY3Rpb24vTXVsdGl2YWx1ZWRTdHJpbmdNYXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDgwNTVlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL2NvbGxlY3Rpb24vTXVsdGl2YWx1ZWRTdHJpbmdNYXAuamF2YQpAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb247CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRIYXNoTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CisKKy8qKgorICogQW4gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIE11bHRpdmFsdWVkTWFwfSB3aGVyZSBrZXlzIGFuZCB2YWx1ZXMgYXJlCisgKiBpbnN0YW5jZXMgb2YgU3RyaW5nLgorICogPHAgLz4KKyAqIFRoaXMgbWFwIGhhcyBhbiBhZGRpdGlvbmFsIGFiaWxpdHkgdG8gaW5zdGFudGlhdGUgY2xhc3NlcyB1c2luZyB0aGUKKyAqIGluZGl2aWR1YWwgc3RyaW5nIHZhbHVlcyBhcyBhIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIE11bHRpdmFsdWVkU3RyaW5nTWFwIGV4dGVuZHMgTXVsdGl2YWx1ZWRIYXNoTWFwPFN0cmluZywgU3RyaW5nPiB7CisKKyAgICBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTYwNTIzMjA0MDM3NjYzNjg5MDJMOworCisgICAgcHVibGljIE11bHRpdmFsdWVkU3RyaW5nTWFwKE11bHRpdmFsdWVkTWFwPD8gZXh0ZW5kcyBTdHJpbmcsID8gZXh0ZW5kcyBTdHJpbmc+IG1hcCkgeworICAgICAgICBzdXBlcihtYXApOworICAgIH0KKworICAgIHB1YmxpYyBNdWx0aXZhbHVlZFN0cmluZ01hcChpbnQgaW5pdGlhbENhcGFjaXR5LCBmbG9hdCBsb2FkRmFjdG9yKSB7CisgICAgICAgIHN1cGVyKGluaXRpYWxDYXBhY2l0eSwgbG9hZEZhY3Rvcik7CisgICAgfQorCisgICAgcHVibGljIE11bHRpdmFsdWVkU3RyaW5nTWFwKGludCBpbml0aWFsQ2FwYWNpdHkpIHsKKyAgICAgICAgc3VwZXIoaW5pdGlhbENhcGFjaXR5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgTXVsdGl2YWx1ZWRTdHJpbmdNYXAoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgYWRkRmlyc3ROdWxsKExpc3Q8U3RyaW5nPiB2YWx1ZXMpIHsKKyAgICAgICAgdmFsdWVzLmFkZCgiIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgYWRkTnVsbChMaXN0PFN0cmluZz4gdmFsdWVzKSB7CisgICAgICAgIHZhbHVlcy5hZGQoMCwgIiIpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCA8QT4gQSBnZXRGaXJzdChTdHJpbmcga2V5LCBDbGFzczxBPiB0eXBlKSB7CisgICAgICAgIFN0cmluZyB2YWx1ZSA9IGdldEZpcnN0KGtleSk7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBDb25zdHJ1Y3RvcjxBPiBjID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGMgPSB0eXBlLmdldENvbnN0cnVjdG9yKFN0cmluZy5jbGFzcyk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbih0eXBlLmdldE5hbWUoKSArICIgaGFzIG5vIFN0cmluZyBjb25zdHJ1Y3RvciIsIGV4KTsKKyAgICAgICAgfQorICAgICAgICBBIHJldFZhbCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXRWYWwgPSBjLm5ld0luc3RhbmNlKHZhbHVlKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgZmluYWwgPEE+IEEgZ2V0Rmlyc3QoU3RyaW5nIGtleSwgQSBkZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgU3RyaW5nIHZhbHVlID0gZ2V0Rmlyc3Qoa2V5KTsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBDbGFzczxBPiB0eXBlID0gKENsYXNzPEE+KSBkZWZhdWx0VmFsdWUuZ2V0Q2xhc3MoKTsKKworICAgICAgICBDb25zdHJ1Y3RvcjxBPiBjID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGMgPSB0eXBlLmdldENvbnN0cnVjdG9yKFN0cmluZy5jbGFzcyk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbih0eXBlLmdldE5hbWUoKSArICIgaGFzIG5vIFN0cmluZyBjb25zdHJ1Y3RvciIsIGV4KTsKKyAgICAgICAgfQorICAgICAgICBBIHJldFZhbCA9IGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldFZhbCA9IGMubmV3SW5zdGFuY2UodmFsdWUpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0VmFsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9jb2xsZWN0aW9uL05vbkJsb2NraW5nSW5wdXRTdHJlYW0uamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9jb2xsZWN0aW9uL05vbkJsb2NraW5nSW5wdXRTdHJlYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDhlYzM0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL2NvbGxlY3Rpb24vTm9uQmxvY2tpbmdJbnB1dFN0cmVhbS5qYXZhCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworLyoqCisgKiBBbiBhYnN0cmFjdCB7QGxpbmsgSW5wdXRTdHJlYW19IGV4dGVuc2lvbiB0aGF0IGRlZmluZXMgY29udHJhY3QgZm9yIG5vbi1ibG9ja2luZworICogc3RyZWFtaW5nIHtAY29kZSByZWFkfSBvcGVyYXRpb25zLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBOb25CbG9ja2luZ0lucHV0U3RyZWFtIGV4dGVuZHMgSW5wdXRTdHJlYW0geworICAgIC8qKgorICAgICAqIENvbnN0YW50IHVzZWQgYXMgYSByZXR1cm4gdmFsdWUgZnJvbSB7QGxpbmsgI3RyeVJlYWQoKX0gbWV0aG9kLCB0byBpbmRpY2F0ZSB0aGF0IG5vdGhpbmcKKyAgICAgKiBoYXMgYmVlbiByZWFkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE5PVEhJTkcgPSBJbnRlZ2VyLk1JTl9WQUxVRTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gZXN0aW1hdGUgb2YgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBiZSByZWFkIChvcgorICAgICAqIHNraXBwZWQgb3ZlcikgZnJvbSB0aGlzIGlucHV0IHN0cmVhbSB3aXRob3V0IGJsb2NraW5nIGJ5IHRoZSBuZXh0CisgICAgICogaW52b2NhdGlvbiBvZiBhIG1ldGhvZCBmb3IgdGhpcyBpbnB1dCBzdHJlYW0uIFRoZSBuZXh0IGludm9jYXRpb24KKyAgICAgKiBtaWdodCBiZSB0aGUgc2FtZSB0aHJlYWQgb3IgYW5vdGhlciB0aHJlYWQuICBBIHNpbmdsZSByZWFkIG9yIHNraXAgb2YgdGhpcworICAgICAqIG1hbnkgYnl0ZXMgd2lsbCBub3QgYmxvY2ssIGJ1dCBtYXkgcmVhZCBvciBza2lwIGZld2VyIGJ5dGVzLgorICAgICAqIDxwPgorICAgICAqIE5vdGUgdGhhdCB3aGlsZSBzb21lIGltcGxlbWVudGF0aW9ucyBvZiB7QGNvZGUgSW5wdXRTdHJlYW19IHdpbGwgcmV0dXJuCisgICAgICogdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyBpbiB0aGUgc3RyZWFtLCBtYW55IHdpbGwgbm90LiBJdCBpcworICAgICAqIG5ldmVyIGNvcnJlY3QgdG8gdXNlIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhpcyBtZXRob2QgdG8gYWxsb2NhdGUKKyAgICAgKiBhIGJ1ZmZlciBpbnRlbmRlZCB0byBob2xkIGFsbCBkYXRhIGluIHRoaXMgc3RyZWFtLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBBIHN1YmNsYXNzJyBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBtYXkgY2hvb3NlIHRvIHRocm93IGFuCisgICAgICoge0BsaW5rIGphdmEuaW8uSU9FeGNlcHRpb259IGlmIHRoaXMgaW5wdXQgc3RyZWFtIGhhcyBiZWVuIGNsb3NlZCBieQorICAgICAqIGludm9raW5nIHRoZSB7QGxpbmsgI2Nsb3NlKCl9IG1ldGhvZC4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgaW4ge0Bjb2RlIE5vbkJsb2NraW5nSW5wdXRTdHJlYW19CisgICAgICogdGhyb3dzIGFuIHtAbGluayBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbn0uIFRoaXMgbWV0aG9kIG11c3QgYmUgb3ZlcnJpZGRlbgorICAgICAqIGJ5IHN1YmNsYXNzZXMuIFRoZSBvdmVycmlkaW5nIGltcGxlbWVudGF0aW9ucyBtdXN0IGd1YXJhbnRlZSBub24tYmxvY2tpbmcgYmVoYXZpb3IKKyAgICAgKiBvZiB0aGUgbWV0aG9kLiBUaGUgb3ZlcnJpZGluZyBpbXBsZW1lbnRhdGlvbiBtdXN0IGFsc28gZ3VhcmFudGVlIHRoYXQgYSBub24tZW1wdHkKKyAgICAgKiBzdHJlYW0gZG9lcyBub3QgcmV0dXJuIHplcm8gZnJvbSB0aGUgbWV0aG9kLiBJT1csIGl0IG11c3QgYmUgcG9zc2libGUgdG8gdXNlIHRoZQorICAgICAqIG1ldGhvZCBmb3IgZW1wdHkgY2hlY2s6IHtAY29kZSBzdHJlYW0uYXZhaWxhYmxlKCkgPT0gMH0KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFuIGVzdGltYXRlIG9mIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgcmVhZCAob3Igc2tpcHBlZAorICAgICAqICAgICAgICAgb3ZlcikgZnJvbSB0aGlzIGlucHV0IHN0cmVhbSB3aXRob3V0IGJsb2NraW5nIG9yIHtAY29kZSAwfSB3aGVuCisgICAgICogICAgICAgICBpdCByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIGlucHV0IHN0cmVhbSBvciB0aGUgc3RyZWFtIGlzIGVtcHR5LgorICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiBpZiBhbiBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgYXZhaWxhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQmVoYXZlcyBtb3N0bHkgbGlrZSB7QGxpbmsgamF2YS5pby5JbnB1dFN0cmVhbSNyZWFkKCl9LgorICAgICAqCisgICAgICogVGhlIG1haW4gZGlmZmVyZW5jZSBpcyB0aGF0IHRoaXMgbWV0aG9kIGlzIG5vbi1ibG9ja2luZy4gSW4gY2FzZSB0aGVyZSBhcmUgbm8KKyAgICAgKiBkYXRhIGF2YWlsYWJsZSB0byBiZSByZWFkLCB0aGUgbWV0aG9kIHJldHVybnMge0BsaW5rICNOT1RISU5HfSBpbW1lZGlhdGVseS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbmV4dCBieXRlIG9mIGRhdGEsIHtAY29kZSAtMX0gaWYgZW5kIG9mIHRoZSBzdHJlYW0gaGFzIGJlZW4gcmVhY2hlZCBvcgorICAgICAqICAgICAgICAge0BsaW5rICNOT1RISU5HfSBpbiBjYXNlIG5vIGRhdGEgYXJlIGF2YWlsYWJsZSB0byBiZSByZWFkIGF0IHRoZSBtb21lbnQuCisgICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGludCB0cnlSZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogQmVoYXZlcyBtb3N0bHkgbGlrZSB7QGxpbmsgamF2YS5pby5JbnB1dFN0cmVhbSNyZWFkKGJ5dGVbXSl9LgorICAgICAqCisgICAgICogVGhlIG1haW4gZGlmZmVyZW5jZSBpcyB0aGF0IHRoaXMgbWV0aG9kIGlzIG5vbi1ibG9ja2luZy4gSW4gY2FzZSB0aGVyZSBhcmUgbm8KKyAgICAgKiBkYXRhIGF2YWlsYWJsZSB0byBiZSByZWFkLCB0aGUgbWV0aG9kIHJldHVybnMgemVybyBpbW1lZGlhdGVseS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiIHRoZSBidWZmZXIgaW50byB3aGljaCB0aGUgZGF0YSBpcyByZWFkLgorICAgICAqIEByZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyByZWFkIGludG8gdGhlIGJ1ZmZlciBvciB7QGNvZGUgLTF9IGlmIGVuZCBvZiB0aGUKKyAgICAgKiAgICAgICAgIHN0cmVhbSBoYXMgYmVlbiByZWFjaGVkIG9yIHtAY29kZSAwfSBpbiBjYXNlIG5vIGRhdGEgYXJlIGF2YWlsYWJsZSB0byBiZQorICAgICAqICAgICAgICAgcmVhZCBhdCB0aGUgbW9tZW50LgorICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiBpZiBhbiBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgdHJ5UmVhZChieXRlIGJbXSkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogQmVoYXZlcyBtb3N0bHkgbGlrZSB7QGxpbmsgamF2YS5pby5JbnB1dFN0cmVhbSNyZWFkKGJ5dGVbXSwgaW50LCBpbnQpfS4KKyAgICAgKgorICAgICAqIFRoZSBtYWluIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGlzIG1ldGhvZCBpcyBub24tYmxvY2tpbmcuIEluIGNhc2UgdGhlcmUgYXJlIG5vCisgICAgICogZGF0YSBhdmFpbGFibGUgdG8gYmUgcmVhZCwgdGhlIG1ldGhvZCByZXR1cm5zIHplcm8gaW1tZWRpYXRlbHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYiAgIHRoZSBidWZmZXIgaW50byB3aGljaCB0aGUgZGF0YSBpcyByZWFkLgorICAgICAqIEBwYXJhbSBvZmYgdGhlIHN0YXJ0IG9mZnNldCBpbiBhcnJheSB7QGNvZGUgYn0KKyAgICAgKiAgICAgICAgICAgIGF0IHdoaWNoIHRoZSBkYXRhIGlzIHdyaXR0ZW4uCisgICAgICogQHBhcmFtIGxlbiB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC4KKyAgICAgKiBAcmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgcmVhZCBpbnRvIHRoZSBidWZmZXIgb3Ige0Bjb2RlIC0xfSBpZiBlbmQgb2YgdGhlCisgICAgICogICAgICAgICBzdHJlYW0gaGFzIGJlZW4gcmVhY2hlZCBvciB7QGNvZGUgMH0gaW4gY2FzZSBubyBkYXRhIGFyZSBhdmFpbGFibGUgdG8gYmUKKyAgICAgKiAgICAgICAgIHJlYWQgYXQgdGhlIG1vbWVudC4KKyAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gaWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgaW50IHRyeVJlYWQoYnl0ZSBiW10sIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9jb2xsZWN0aW9uL051bGxhYmxlTXVsdGl2YWx1ZWRIYXNoTWFwLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvY29sbGVjdGlvbi9OdWxsYWJsZU11bHRpdmFsdWVkSGFzaE1hcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MmFhZjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvY29sbGVjdGlvbi9OdWxsYWJsZU11bHRpdmFsdWVkSGFzaE1hcC5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkSGFzaE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworCisvKioKKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBNdWx0aXZhbHVlZE1hcH0gd2hlcmUgdmFsdWVzIGNhbiBiZSB7QGNvZGUgbnVsbH0uCisgKgorICogQHBhcmFtIDxLPiB0aGUgdHlwZSBvZiBrZXlzIG1haW50YWluZWQgYnkgdGhpcyBtYXAKKyAqIEBwYXJhbSA8Vj4gdGhlIHR5cGUgb2YgbWFwcGVkIHZhbHVlcyB3aGljaCBjYW4gY29udGFpbiB7QGNvZGUgbnVsbH0gdmFsdWVzCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK3B1YmxpYyBjbGFzcyBOdWxsYWJsZU11bHRpdmFsdWVkSGFzaE1hcDxLLCBWPiBleHRlbmRzIE11bHRpdmFsdWVkSGFzaE1hcDxLLCBWPiB7CisKKyAgICBwdWJsaWMgTnVsbGFibGVNdWx0aXZhbHVlZEhhc2hNYXAoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorCisgICAgcHVibGljIE51bGxhYmxlTXVsdGl2YWx1ZWRIYXNoTWFwKGludCBpbml0aWFsQ2FwYWNpdHkpIHsKKyAgICAgICAgc3VwZXIoaW5pdGlhbENhcGFjaXR5KTsKKyAgICB9CisKKyAgICBwdWJsaWMgTnVsbGFibGVNdWx0aXZhbHVlZEhhc2hNYXAoaW50IGluaXRpYWxDYXBhY2l0eSwgZmxvYXQgbG9hZEZhY3RvcikgeworICAgICAgICBzdXBlcihpbml0aWFsQ2FwYWNpdHksIGxvYWRGYWN0b3IpOworICAgIH0KKworICAgIHB1YmxpYyBOdWxsYWJsZU11bHRpdmFsdWVkSGFzaE1hcChNdWx0aXZhbHVlZE1hcDw/IGV4dGVuZHMgSywgPyBleHRlbmRzIFY+IG1hcCkgeworICAgICAgICBzdXBlcihtYXApOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGFkZEZpcnN0TnVsbChmaW5hbCBMaXN0PFY+IHZhbHVlcykgeworICAgICAgICB2YWx1ZXMuYWRkKG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGFkZE51bGwoZmluYWwgTGlzdDxWPiB2YWx1ZXMpIHsKKyAgICAgICAgdmFsdWVzLmFkZChudWxsKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvY29sbGVjdGlvbi9SZWYuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9jb2xsZWN0aW9uL1JlZi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNTdlMzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvY29sbGVjdGlvbi9SZWYuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbjsKKworLyoqCisgKiBBIHBvc3NpYmx5IG11dGFibGUgdmFsdWUgcmVmZXJlbmNlLiBSZWZlcmVuY2UgY2FuIGJlIGluaXRpYWxpemVkIGJ5IHtAbGluayAjc2V0KE9iamVjdCl9CisgKiBhbmQgdGhlIHJlZmVyZW5jZSBjYW4gYmUgZ2V0IGJ5IHtAbGluayAjZ2V0KCl9LgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKgorICogQHBhcmFtIDxUPiByZWZlcnJlZCB2YWx1ZSB0eXBlCisgKgorICogQHNlZSBSZWZzCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUmVmPFQ+IGV4dGVuZHMgVmFsdWU8VD4sIFNldHRhYmxlPFQ+IHsKK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9jb2xsZWN0aW9uL1JlZnMuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9jb2xsZWN0aW9uL1JlZnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWNmOTVmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL2NvbGxlY3Rpb24vUmVmcy5qYXZhCkBAIC0wLDAgKzEsMjUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbjsKKworLyoqCisgKiBBIGNvbGxlY3Rpb24gb2Yge0BsaW5rIFJlZiByZWZlcmVuY2V9IGZhY3RvcnkgJiB1dGlsaXR5IG1ldGhvZHMuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFJlZnMgeworCisgICAgcHJpdmF0ZSBSZWZzKCkgeworICAgICAgICAvLyBwcmV2ZW50aW5nIGluc3RhbnRpYXRpb24KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbW11dGFibGUge0BsaW5rIFJlZn0gaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgSW1tdXRhYmxlUmVmSW1wbDxUPiBpbXBsZW1lbnRzIFJlZjxUPiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBUIHJlZmVyZW5jZTsKKworICAgICAgICBJbW11dGFibGVSZWZJbXBsKGZpbmFsIFQgdmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMucmVmZXJlbmNlID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFQgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIHJlZmVyZW5jZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXQoZmluYWwgVCB2YWx1ZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGlzIGltcGxlbWVudGF0aW9uIG9mIFJlZiBpbnRlcmZhY2UgaXMgaW1tdXRhYmxlLiIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIkltbXV0YWJsZVJlZkltcGx7IgorICAgICAgICAgICAgICAgICAgICArICJyZWZlcmVuY2U9IiArIHJlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICArICd9JzsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG9iaikgeworICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgUmVmKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgT2JqZWN0IG90aGVyUmVmID0gKChSZWYpIG9iaikuZ2V0KCk7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5yZWZlcmVuY2UgPT0gb3RoZXJSZWYgfHwgKHRoaXMucmVmZXJlbmNlICE9IG51bGwgJiYgdGhpcy5yZWZlcmVuY2UuZXF1YWxzKG90aGVyUmVmKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIGludCBoYXNoID0gNTsKKyAgICAgICAgICAgIGhhc2ggPSA0NyAqIGhhc2ggKyAodGhpcy5yZWZlcmVuY2UgIT0gbnVsbCA/IHRoaXMucmVmZXJlbmNlLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgICAgIHJldHVybiBoYXNoOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVmYXVsdCAobXV0YWJsZSkge0BsaW5rIFJlZn0gaW1wbGVtZW50YXRpb24uIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgbm90IHRocmVhZC1zYWZlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIERlZmF1bHRSZWZJbXBsPFQ+IGltcGxlbWVudHMgUmVmPFQ+IHsKKworICAgICAgICBwcml2YXRlIFQgcmVmZXJlbmNlOworCisgICAgICAgIERlZmF1bHRSZWZJbXBsKCkgeworICAgICAgICAgICAgdGhpcy5yZWZlcmVuY2UgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgRGVmYXVsdFJlZkltcGwoZmluYWwgVCB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy5yZWZlcmVuY2UgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVCBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gcmVmZXJlbmNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldChmaW5hbCBUIHZhbHVlKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRoaXMucmVmZXJlbmNlID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiRGVmYXVsdFJlZkltcGx7IgorICAgICAgICAgICAgICAgICAgICsgInJlZmVyZW5jZT0iICsgcmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgKyAnfSc7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvYmopIHsKKyAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFJlZikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE9iamVjdCBvdGhlclJlZiA9ICgoUmVmKSBvYmopLmdldCgpOworICAgICAgICAgICAgVCByZWYgPSB0aGlzLnJlZmVyZW5jZTsKKyAgICAgICAgICAgIHJldHVybiByZWYgPT0gb3RoZXJSZWYgfHwgKHJlZiAhPSBudWxsICYmIHJlZi5lcXVhbHMob3RoZXJSZWYpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgaW50IGhhc2ggPSA1OworICAgICAgICAgICAgaGFzaCA9IDQ3ICogaGFzaCArICh0aGlzLnJlZmVyZW5jZSAhPSBudWxsID8gdGhpcy5yZWZlcmVuY2UuaGFzaENvZGUoKSA6IDApOworICAgICAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaHJlYWQtc2FmZSB7QGxpbmsgUmVmfSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBUaHJlYWRTYWZlUmVmSW1wbDxUPiBpbXBsZW1lbnRzIFJlZjxUPiB7CisKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBUIHJlZmVyZW5jZTsKKworICAgICAgICBUaHJlYWRTYWZlUmVmSW1wbCgpIHsKKyAgICAgICAgICAgIHRoaXMucmVmZXJlbmNlID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIFRocmVhZFNhZmVSZWZJbXBsKGZpbmFsIFQgdmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMucmVmZXJlbmNlID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFQgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIHJlZmVyZW5jZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXQoZmluYWwgVCB2YWx1ZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aGlzLnJlZmVyZW5jZSA9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIlRocmVhZFNhZmVSZWZJbXBseyIKKyAgICAgICAgICAgICAgICAgICArICJyZWZlcmVuY2U9IiArIHJlZmVyZW5jZQorICAgICAgICAgICAgICAgICAgICsgJ30nOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3Qgb2JqKSB7CisgICAgICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBSZWYpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBPYmplY3Qgb3RoZXJSZWYgPSAoKFJlZikgb2JqKS5nZXQoKTsKKyAgICAgICAgICAgIFQgbG9jYWxSZWYgPSB0aGlzLnJlZmVyZW5jZTsKKyAgICAgICAgICAgIHJldHVybiBsb2NhbFJlZiA9PSBvdGhlclJlZiB8fCAobG9jYWxSZWYgIT0gbnVsbCAmJiBsb2NhbFJlZi5lcXVhbHMob3RoZXJSZWYpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgVCBsb2NhbFJlZiA9IHRoaXMucmVmZXJlbmNlOworICAgICAgICAgICAgaW50IGhhc2ggPSA1OworICAgICAgICAgICAgaGFzaCA9IDQ3ICogaGFzaCArIChsb2NhbFJlZiAhPSBudWxsID8gbG9jYWxSZWYuaGFzaENvZGUoKSA6IDApOworICAgICAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgbXV0YWJsZSB7QGxpbmsgUmVmfSBpbnN0YW5jZSByZWZlcmVuY2luZyB0aGUgZ2l2ZW4KKyAgICAgKiBpbnB1dCB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSA8VD4gICB0eXBlIG9mIHRoZSByZWZlcmVuY2VkIGluc3RhbmNlLgorICAgICAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSBvZiB0aGUgbmV3bHkgY29uc3RydWN0ZWQgcmVmZXJlbmNlLgorICAgICAqIEByZXR1cm4gYSBuZXcgbXV0YWJsZSB7QGxpbmsgUmVmfSBpbnN0YW5jZSByZWZlcmVuY2luZyB0aGUgZ2l2ZW4KKyAgICAgKiAgICAgICAgIGlucHV0IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFJlZjxUPiBvZihmaW5hbCBUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFJlZkltcGw8VD4odmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBlbXB0eSBtdXRhYmxlIHtAbGluayBSZWZ9IGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIDxUPiB0eXBlIG9mIHRoZSByZWZlcmVuY2VkIGluc3RhbmNlLgorICAgICAqIEByZXR1cm4gYSBuZXcgbXV0YWJsZSBlbXB0eSB7QGxpbmsgUmVmfSBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUPiBSZWY8VD4gZW1wdHlSZWYoKSB7CisgICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFJlZkltcGw8VD4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgZW1wdHkgbXV0YWJsZSB0aHJlYWQtc2FmZSB7QGxpbmsgUmVmfSBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSA8VD4gdHlwZSBvZiB0aGUgcmVmZXJlbmNlZCBpbnN0YW5jZS4KKyAgICAgKiBAcmV0dXJuIGEgbmV3IG11dGFibGUgZW1wdHkgdGhyZWFkLXNhZmUge0BsaW5rIFJlZn0gaW5zdGFuY2UuCisgICAgICogQHNpbmNlIDIuOAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFJlZjxUPiB0aHJlYWRTYWZlKCkgeworICAgICAgICByZXR1cm4gbmV3IFRocmVhZFNhZmVSZWZJbXBsPFQ+KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IG11dGFibGUgdGhyZWFkLXNhZmUge0BsaW5rIFJlZn0gaW5zdGFuY2UgcmVmZXJlbmNpbmcgdGhlIGdpdmVuCisgICAgICogaW5wdXQgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gPFQ+IHR5cGUgb2YgdGhlIHJlZmVyZW5jZWQgaW5zdGFuY2UuCisgICAgICogQHBhcmFtIHZhbHVlIHZhbHVlIG9mIHRoZSBuZXdseSBjb25zdHJ1Y3RlZCByZWZlcmVuY2UuCisgICAgICogQHJldHVybiBhIG5ldyBtdXRhYmxlIHRocmVhZC1zYWZlIHtAbGluayBSZWZ9IGluc3RhbmNlICByZWZlcmVuY2luZyB0aGUgZ2l2ZW4KKyAgICAgKiAgICAgICAgIGlucHV0IHZhbHVlLgorICAgICAqIEBzaW5jZSAyLjgKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUPiBSZWY8VD4gdGhyZWFkU2FmZShmaW5hbCBUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBuZXcgVGhyZWFkU2FmZVJlZkltcGw8VD4odmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBpbW11dGFibGUge0BsaW5rIFJlZn0gaW5zdGFuY2UgcmVmZXJlbmNpbmcgdGhlIGdpdmVuCisgICAgICogaW5wdXQgdmFsdWUuCisgICAgICogPHAvPgorICAgICAqIEludm9raW5nIGEge0BsaW5rIFJlZiNzZXQoamF2YS5sYW5nLk9iamVjdCl9IG9uIHRoZSByZXR1cm5lZCBpbnN0YW5jZQorICAgICAqIHdpbGwgcmVzdWx0IGluIGEge0BsaW5rIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbn0gYmVpbmcgdGhyb3duLgorICAgICAqCisgICAgICogQHBhcmFtIDxUPiAgIHR5cGUgb2YgdGhlIHJlZmVyZW5jZWQgaW5zdGFuY2UuCisgICAgICogQHBhcmFtIHZhbHVlIHZhbHVlIG9mIHRoZSBuZXdseSBjb25zdHJ1Y3RlZCByZWZlcmVuY2UuCisgICAgICogQHJldHVybiBhIG5ldyBpbW11dGFibGUge0BsaW5rIFJlZn0gaW5zdGFuY2UgcmVmZXJlbmNpbmcgdGhlIGdpdmVuCisgICAgICogICAgICAgICBpbnB1dCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUPiBSZWY8VD4gaW1tdXRhYmxlUmVmKGZpbmFsIFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJbW11dGFibGVSZWZJbXBsPFQ+KHZhbHVlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvY29sbGVjdGlvbi9TZXR0YWJsZS5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL2NvbGxlY3Rpb24vU2V0dGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODBjMTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL2NvbGxlY3Rpb24vU2V0dGFibGUuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbjsKKworLyoqCisgKiBBIGdlbmVyaWMgc2V0dGFibGUgdmFsdWUgY29udGFpbmVyLgorICoKKyAqIEBwYXJhbSA8VD4gVHlwZSBvZiB0aGUgdmFsdWUuCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU2V0dGFibGU8VD4geworICAgIC8qKgorICAgICAqIFNldCBhIG5ldyB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSB0byBiZSBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0KFQgdmFsdWUpOworfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL2NvbGxlY3Rpb24vU3RyaW5nSWdub3JlQ2FzZUtleUNvbXBhcmF0b3IuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9jb2xsZWN0aW9uL1N0cmluZ0lnbm9yZUNhc2VLZXlDb21wYXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZkZWE0YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9jb2xsZWN0aW9uL1N0cmluZ0lnbm9yZUNhc2VLZXlDb21wYXJhdG9yLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb247CisKKy8qKgorICogQ2FzZSBpbnNlbnNpdGl2ZSBTdHJpbmcga2V5IGNvbXBhcmF0b3IuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBTdHJpbmdJZ25vcmVDYXNlS2V5Q29tcGFyYXRvciBpbXBsZW1lbnRzIEtleUNvbXBhcmF0b3I8U3RyaW5nPiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA5MTA2OTAwMzI1NDY5MzYwNzIzTDsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nSWdub3JlQ2FzZUtleUNvbXBhcmF0b3IgU0lOR0xFVE9OID0gbmV3IFN0cmluZ0lnbm9yZUNhc2VLZXlDb21wYXJhdG9yKCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2goU3RyaW5nIGspIHsKKyAgICAgICAgcmV0dXJuIGsudG9Mb3dlckNhc2UoKS5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhTdHJpbmcgeCwgU3RyaW5nIHkpIHsKKyAgICAgICAgcmV0dXJuIHguZXF1YWxzSWdub3JlQ2FzZSh5KTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9jb2xsZWN0aW9uL1N0cmluZ0tleUlnbm9yZUNhc2VNdWx0aXZhbHVlZE1hcC5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL2NvbGxlY3Rpb24vU3RyaW5nS2V5SWdub3JlQ2FzZU11bHRpdmFsdWVkTWFwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdhZDRhNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9jb2xsZWN0aW9uL1N0cmluZ0tleUlnbm9yZUNhc2VNdWx0aXZhbHVlZE1hcC5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFic3RyYWN0TXVsdGl2YWx1ZWRNYXA7CisKKy8qKgorICogTXVsdGl2YWx1ZWQgbWFwIHdpdGggU3RyaW5nIGtleXMgdGhhdCBhcmUgY29tcGFyZWQgd2l0aCBlYWNoIG90aGVyIHVzaW5nIHRoZSBjYXNlIGluc2Vuc2l0aXZlIG1ldGhvZC4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIFN0cmluZ0tleUlnbm9yZUNhc2VNdWx0aXZhbHVlZE1hcDxWPiBleHRlbmRzIEFic3RyYWN0TXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBWPiB7CisKKyAgICBwdWJsaWMgU3RyaW5nS2V5SWdub3JlQ2FzZU11bHRpdmFsdWVkTWFwKCkgeworICAgICAgICBzdXBlcihuZXcgS2V5Q29tcGFyYXRvckxpbmtlZEhhc2hNYXA8U3RyaW5nLCBMaXN0PFY+PihTdHJpbmdJZ25vcmVDYXNlS2V5Q29tcGFyYXRvci5TSU5HTEVUT04pKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9jb2xsZWN0aW9uL1RocmVhZExvY2FsUmFuZG9tLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvY29sbGVjdGlvbi9UaHJlYWRMb2NhbFJhbmRvbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZjUwMTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvY29sbGVjdGlvbi9UaHJlYWRMb2NhbFJhbmRvbS5qYXZhCkBAIC0wLDAgKzEsMjEyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvKgorICogV3JpdHRlbiBieSBEb3VnIExlYSB3aXRoIGFzc2lzdGFuY2UgZnJvbSBtZW1iZXJzIG9mIEpDUCBKU1ItMTY2CisgKiBFeHBlcnQgR3JvdXAgYW5kIHJlbGVhc2VkIHRvIHRoZSBwdWJsaWMgZG9tYWluLCBhcyBleHBsYWluZWQgYXQKKyAqIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL3B1YmxpY2RvbWFpbi96ZXJvLzEuMC8KKyAqLworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworCisvKioKKyAqIEEgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IgaXNvbGF0ZWQgdG8gdGhlIGN1cnJlbnQgdGhyZWFkLiAgTGlrZSB0aGUKKyAqIGdsb2JhbCB7QGxpbmsgamF2YS51dGlsLlJhbmRvbX0gZ2VuZXJhdG9yIHVzZWQgYnkgdGhlIHtAbGluaworICogamF2YS5sYW5nLk1hdGh9IGNsYXNzLCBhIHtAY29kZSBUaHJlYWRMb2NhbFJhbmRvbX0gaXMgaW5pdGlhbGl6ZWQKKyAqIHdpdGggYW4gaW50ZXJuYWxseSBnZW5lcmF0ZWQgc2VlZCB0aGF0IG1heSBub3Qgb3RoZXJ3aXNlIGJlCisgKiBtb2RpZmllZC4gV2hlbiBhcHBsaWNhYmxlLCB1c2Ugb2Yge0Bjb2RlIFRocmVhZExvY2FsUmFuZG9tfSByYXRoZXIKKyAqIHRoYW4gc2hhcmVkIHtAY29kZSBSYW5kb219IG9iamVjdHMgaW4gY29uY3VycmVudCBwcm9ncmFtcyB3aWxsCisgKiB0eXBpY2FsbHkgZW5jb3VudGVyIG11Y2ggbGVzcyBvdmVyaGVhZCBhbmQgY29udGVudGlvbi4gIFVzZSBvZgorICoge0Bjb2RlIFRocmVhZExvY2FsUmFuZG9tfSBpcyBwYXJ0aWN1bGFybHkgYXBwcm9wcmlhdGUgd2hlbiBtdWx0aXBsZQorICogdGFza3MgKGZvciBleGFtcGxlLCBlYWNoIGEge0BsaW5rIEZvcmtKb2luVGFza30pIHVzZSByYW5kb20gbnVtYmVycworICogaW4gcGFyYWxsZWwgaW4gdGhyZWFkIHBvb2xzLgorICoKKyAqIDxwPlVzYWdlcyBvZiB0aGlzIGNsYXNzIHNob3VsZCB0eXBpY2FsbHkgYmUgb2YgdGhlIGZvcm06CisgKiB7QGNvZGUgVGhyZWFkTG9jYWxSYW5kb20uY3VycmVudCgpLm5leHRYKC4uLil9ICh3aGVyZQorICoge0Bjb2RlIFh9IGlzIHtAY29kZSBJbnR9LCB7QGNvZGUgTG9uZ30sIGV0YykuCisgKiBXaGVuIGFsbCB1c2FnZXMgYXJlIG9mIHRoaXMgZm9ybSwgaXQgaXMgbmV2ZXIgcG9zc2libGUgdG8KKyAqIGFjY2lkZW50bHkgc2hhcmUgYSB7QGNvZGUgVGhyZWFkTG9jYWxSYW5kb219IGFjcm9zcyBtdWx0aXBsZSB0aHJlYWRzLgorICoKKyAqIDxwPlRoaXMgY2xhc3MgYWxzbyBwcm92aWRlcyBhZGRpdGlvbmFsIGNvbW1vbmx5IHVzZWQgYm91bmRlZCByYW5kb20KKyAqIGdlbmVyYXRpb24gbWV0aG9kcy4KKyAqCisgKiBAYXV0aG9yIERvdWcgTGVhCisgKi8KK2NsYXNzIFRocmVhZExvY2FsUmFuZG9tIGV4dGVuZHMgUmFuZG9tIHsKKyAgICAvLyBzYW1lIGNvbnN0YW50cyBhcyBSYW5kb20sIGJ1dCBtdXN0IGJlIHJlZGVjbGFyZWQgYmVjYXVzZSBwcml2YXRlCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBtdWx0aXBsaWVyID0gMHg1REVFQ0U2NkRMOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgYWRkZW5kID0gMHhCTDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIG1hc2sgPSAoMUwgPDwgNDgpIC0gMTsKKworICAgIC8qKgorICAgICAqIFRoZSByYW5kb20gc2VlZC4gV2UgY2FuJ3QgdXNlIHN1cGVyLnNlZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBsb25nIHJuZDsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemF0aW9uIGZsYWcgdG8gcGVybWl0IGNhbGxzIHRvIHNldFNlZWQgdG8gc3VjY2VlZCBvbmx5CisgICAgICogd2hpbGUgZXhlY3V0aW5nIHRoZSBSYW5kb20gY29uc3RydWN0b3IuICBXZSBjYW4ndCBhbGxvdyBvdGhlcnMKKyAgICAgKiBzaW5jZSBpdCB3b3VsZCBjYXVzZSBzZXR0aW5nIHNlZWQgaW4gb25lIHBhcnQgb2YgYSBwcm9ncmFtIHRvCisgICAgICogdW5pbnRlbnRpb25hbGx5IGltcGFjdCBvdGhlciB1c2FnZXMgYnkgdGhlIHRocmVhZC4KKyAgICAgKi8KKyAgICBib29sZWFuIGluaXRpYWxpemVkOworCisgICAgLy8gUGFkZGluZyB0byBoZWxwIGF2b2lkIG1lbW9yeSBjb250ZW50aW9uIGFtb25nIHNlZWQgdXBkYXRlcyBpbgorICAgIC8vIGRpZmZlcmVudCBUTFJzIGluIHRoZSBjb21tb24gY2FzZSB0aGF0IHRoZXkgYXJlIGxvY2F0ZWQgbmVhcgorICAgIC8vIGVhY2ggb3RoZXIuCisgICAgcHJpdmF0ZSBsb25nIHBhZDAsIHBhZDEsIHBhZDIsIHBhZDMsIHBhZDQsIHBhZDUsIHBhZDYsIHBhZDc7CisKKyAgICAvKioKKyAgICAgKiBUaGUgYWN0dWFsIFRocmVhZExvY2FsCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGhyZWFkTG9jYWw8VGhyZWFkTG9jYWxSYW5kb20+IGxvY2FsUmFuZG9tID0KKyAgICAgICAgICAgIG5ldyBUaHJlYWRMb2NhbDxUaHJlYWRMb2NhbFJhbmRvbT4oKSB7CisgICAgICAgICAgICAgICAgcHJvdGVjdGVkIFRocmVhZExvY2FsUmFuZG9tIGluaXRpYWxWYWx1ZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUaHJlYWRMb2NhbFJhbmRvbSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGNhbGxlZCBvbmx5IGJ5IGxvY2FsUmFuZG9tLmluaXRpYWxWYWx1ZS4KKyAgICAgKi8KKyAgICBUaHJlYWRMb2NhbFJhbmRvbSgpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgaW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgdGhyZWFkJ3Mge0Bjb2RlIFRocmVhZExvY2FsUmFuZG9tfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnQgdGhyZWFkJ3Mge0Bjb2RlIFRocmVhZExvY2FsUmFuZG9tfQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgVGhyZWFkTG9jYWxSYW5kb20gY3VycmVudCgpIHsKKyAgICAgICAgcmV0dXJuIGxvY2FsUmFuZG9tLmdldCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRocm93cyB7QGNvZGUgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb259LiAgU2V0dGluZyBzZWVkcyBpbgorICAgICAqIHRoaXMgZ2VuZXJhdG9yIGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGFsd2F5cworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFNlZWQobG9uZyBzZWVkKSB7CisgICAgICAgIGlmIChpbml0aWFsaXplZCkKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICBybmQgPSAoc2VlZCBeIG11bHRpcGxpZXIpICYgbWFzazsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgaW50IG5leHQoaW50IGJpdHMpIHsKKyAgICAgICAgcm5kID0gKHJuZCAqIG11bHRpcGxpZXIgKyBhZGRlbmQpICYgbWFzazsKKyAgICAgICAgcmV0dXJuIChpbnQpIChybmQgPj4+ICg0OCAtIGJpdHMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgcHNldWRvcmFuZG9tLCB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQgdmFsdWUgYmV0d2VlbiB0aGUKKyAgICAgKiBnaXZlbiBsZWFzdCB2YWx1ZSAoaW5jbHVzaXZlKSBhbmQgYm91bmQgKGV4Y2x1c2l2ZSkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGVhc3QgdGhlIGxlYXN0IHZhbHVlIHJldHVybmVkCisgICAgICogQHBhcmFtIGJvdW5kIHRoZSB1cHBlciBib3VuZCAoZXhjbHVzaXZlKQorICAgICAqIEByZXR1cm4gdGhlIG5leHQgdmFsdWUKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBsZWFzdCBncmVhdGVyIHRoYW4gb3IgZXF1YWwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBib3VuZAorICAgICAqLworICAgIHB1YmxpYyBpbnQgbmV4dEludChpbnQgbGVhc3QsIGludCBib3VuZCkgeworICAgICAgICBpZiAobGVhc3QgPj0gYm91bmQpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIHJldHVybiBuZXh0SW50KGJvdW5kIC0gbGVhc3QpICsgbGVhc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHBzZXVkb3JhbmRvbSwgdW5pZm9ybWx5IGRpc3RyaWJ1dGVkIHZhbHVlCisgICAgICogYmV0d2VlbiAwIChpbmNsdXNpdmUpIGFuZCB0aGUgc3BlY2lmaWVkIHZhbHVlIChleGNsdXNpdmUpLgorICAgICAqCisgICAgICogQHBhcmFtIG4gdGhlIGJvdW5kIG9uIHRoZSByYW5kb20gbnVtYmVyIHRvIGJlIHJldHVybmVkLiAgTXVzdCBiZQorICAgICAqICAgICAgICAgIHBvc2l0aXZlLgorICAgICAqIEByZXR1cm4gdGhlIG5leHQgdmFsdWUKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBuIGlzIG5vdCBwb3NpdGl2ZQorICAgICAqLworICAgIHB1YmxpYyBsb25nIG5leHRMb25nKGxvbmcgbikgeworICAgICAgICBpZiAobiA8PSAwKQorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibiBtdXN0IGJlIHBvc2l0aXZlIik7CisgICAgICAgIC8vIERpdmlkZSBuIGJ5IHR3byB1bnRpbCBzbWFsbCBlbm91Z2ggZm9yIG5leHRJbnQuIE9uIGVhY2gKKyAgICAgICAgLy8gaXRlcmF0aW9uIChhdCBtb3N0IDMxIG9mIHRoZW0gYnV0IHVzdWFsbHkgbXVjaCBsZXNzKSwKKyAgICAgICAgLy8gcmFuZG9tbHkgY2hvb3NlIGJvdGggd2hldGhlciB0byBpbmNsdWRlIGhpZ2ggYml0IGluIHJlc3VsdAorICAgICAgICAvLyAob2Zmc2V0KSBhbmQgd2hldGhlciB0byBjb250aW51ZSB3aXRoIHRoZSBsb3dlciB2cyB1cHBlcgorICAgICAgICAvLyBoYWxmICh3aGljaCBtYWtlcyBhIGRpZmZlcmVuY2Ugb25seSBpZiBvZGQpLgorICAgICAgICBsb25nIG9mZnNldCA9IDA7CisgICAgICAgIHdoaWxlIChuID49IEludGVnZXIuTUFYX1ZBTFVFKSB7CisgICAgICAgICAgICBpbnQgYml0cyA9IG5leHQoMik7CisgICAgICAgICAgICBsb25nIGhhbGYgPSBuID4+PiAxOworICAgICAgICAgICAgbG9uZyBuZXh0biA9ICgoYml0cyAmIDIpID09IDApID8gaGFsZiA6IG4gLSBoYWxmOworICAgICAgICAgICAgaWYgKChiaXRzICYgMSkgPT0gMCkKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gbiAtIG5leHRuOworICAgICAgICAgICAgbiA9IG5leHRuOworICAgICAgICB9CisgICAgICAgIHJldHVybiBvZmZzZXQgKyBuZXh0SW50KChpbnQpIG4pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBwc2V1ZG9yYW5kb20sIHVuaWZvcm1seSBkaXN0cmlidXRlZCB2YWx1ZSBiZXR3ZWVuIHRoZQorICAgICAqIGdpdmVuIGxlYXN0IHZhbHVlIChpbmNsdXNpdmUpIGFuZCBib3VuZCAoZXhjbHVzaXZlKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsZWFzdCB0aGUgbGVhc3QgdmFsdWUgcmV0dXJuZWQKKyAgICAgKiBAcGFyYW0gYm91bmQgdGhlIHVwcGVyIGJvdW5kIChleGNsdXNpdmUpCisgICAgICogQHJldHVybiB0aGUgbmV4dCB2YWx1ZQorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGxlYXN0IGdyZWF0ZXIgdGhhbiBvciBlcXVhbAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGJvdW5kCisgICAgICovCisgICAgcHVibGljIGxvbmcgbmV4dExvbmcobG9uZyBsZWFzdCwgbG9uZyBib3VuZCkgeworICAgICAgICBpZiAobGVhc3QgPj0gYm91bmQpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIHJldHVybiBuZXh0TG9uZyhib3VuZCAtIGxlYXN0KSArIGxlYXN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBwc2V1ZG9yYW5kb20sIHVuaWZvcm1seSBkaXN0cmlidXRlZCB7QGNvZGUgZG91YmxlfSB2YWx1ZQorICAgICAqIGJldHdlZW4gMCAoaW5jbHVzaXZlKSBhbmQgdGhlIHNwZWNpZmllZCB2YWx1ZSAoZXhjbHVzaXZlKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuIHRoZSBib3VuZCBvbiB0aGUgcmFuZG9tIG51bWJlciB0byBiZSByZXR1cm5lZC4gIE11c3QgYmUKKyAgICAgKiAgICAgICAgICBwb3NpdGl2ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IHZhbHVlCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgbiBpcyBub3QgcG9zaXRpdmUKKyAgICAgKi8KKyAgICBwdWJsaWMgZG91YmxlIG5leHREb3VibGUoZG91YmxlIG4pIHsKKyAgICAgICAgaWYgKG4gPD0gMCkKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm4gbXVzdCBiZSBwb3NpdGl2ZSIpOworICAgICAgICByZXR1cm4gbmV4dERvdWJsZSgpICogbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgcHNldWRvcmFuZG9tLCB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQgdmFsdWUgYmV0d2VlbiB0aGUKKyAgICAgKiBnaXZlbiBsZWFzdCB2YWx1ZSAoaW5jbHVzaXZlKSBhbmQgYm91bmQgKGV4Y2x1c2l2ZSkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGVhc3QgdGhlIGxlYXN0IHZhbHVlIHJldHVybmVkCisgICAgICogQHBhcmFtIGJvdW5kIHRoZSB1cHBlciBib3VuZCAoZXhjbHVzaXZlKQorICAgICAqIEByZXR1cm4gdGhlIG5leHQgdmFsdWUKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBsZWFzdCBncmVhdGVyIHRoYW4gb3IgZXF1YWwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBib3VuZAorICAgICAqLworICAgIHB1YmxpYyBkb3VibGUgbmV4dERvdWJsZShkb3VibGUgbGVhc3QsIGRvdWJsZSBib3VuZCkgeworICAgICAgICBpZiAobGVhc3QgPj0gYm91bmQpCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIHJldHVybiBuZXh0RG91YmxlKCkgKiAoYm91bmQgLSBsZWFzdCkgKyBsZWFzdDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNTg1MTc3NzgwNzg1MTAzMDkyNUw7Cit9CisKZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9jb2xsZWN0aW9uL1RyYW5zZmVyUXVldWUuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9jb2xsZWN0aW9uL1RyYW5zZmVyUXVldWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTllM2U5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL2NvbGxlY3Rpb24vVHJhbnNmZXJRdWV1ZS5qYXZhCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDA5LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvKgorICogV3JpdHRlbiBieSBEb3VnIExlYSB3aXRoIGFzc2lzdGFuY2UgZnJvbSBtZW1iZXJzIG9mIEpDUCBKU1ItMTY2CisgKiBFeHBlcnQgR3JvdXAgYW5kIHJlbGVhc2VkIHRvIHRoZSBwdWJsaWMgZG9tYWluLCBhcyBleHBsYWluZWQgYXQKKyAqIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL3B1YmxpY2RvbWFpbgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkJsb2NraW5nUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU3luY2hyb25vdXNRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworLyoqCisgKiBBIHtAbGluayBCbG9ja2luZ1F1ZXVlfSBpbiB3aGljaCBwcm9kdWNlcnMgbWF5IHdhaXQgZm9yIGNvbnN1bWVycworICogdG8gcmVjZWl2ZSBlbGVtZW50cy4gIEEge0Bjb2RlIFRyYW5zZmVyUXVldWV9IG1heSBiZSB1c2VmdWwgZm9yCisgKiBleGFtcGxlIGluIG1lc3NhZ2UgcGFzc2luZyBhcHBsaWNhdGlvbnMgaW4gd2hpY2ggcHJvZHVjZXJzCisgKiBzb21ldGltZXMgKHVzaW5nIG1ldGhvZCB7QGNvZGUgdHJhbnNmZXJ9KSBhd2FpdCByZWNlaXB0IG9mCisgKiBlbGVtZW50cyBieSBjb25zdW1lcnMgaW52b2tpbmcge0Bjb2RlIHRha2V9IG9yIHtAY29kZSBwb2xsfSwKKyAqIHdoaWxlIGF0IG90aGVyIHRpbWVzIGVucXVldWUgZWxlbWVudHMgKHZpYSBtZXRob2Qge0Bjb2RlIHB1dH0pCisgKiB3aXRob3V0IHdhaXRpbmcgZm9yIHJlY2VpcHQuIE5vbi1ibG9ja2luZyBhbmQgdGltZS1vdXQgdmVyc2lvbnMgb2YKKyAqIHtAY29kZSB0cnlUcmFuc2Zlcn0gYXJlIGFsc28gYXZhaWxhYmxlLiAgQSBUcmFuc2ZlclF1ZXVlIG1heSBhbHNvCisgKiBiZSBxdWVyaWVkIHZpYSB7QGNvZGUgaGFzV2FpdGluZ0NvbnN1bWVyfSB3aGV0aGVyIHRoZXJlIGFyZSBhbnkKKyAqIHRocmVhZHMgd2FpdGluZyBmb3IgaXRlbXMsIHdoaWNoIGlzIGEgY29udmVyc2UgYW5hbG9neSB0byBhCisgKiB7QGNvZGUgcGVla30gb3BlcmF0aW9uLgorICoKKyAqIDxwPkxpa2UgYW55IHtAY29kZSBCbG9ja2luZ1F1ZXVlfSwgYSB7QGNvZGUgVHJhbnNmZXJRdWV1ZX0gbWF5IGJlCisgKiBjYXBhY2l0eSBib3VuZGVkLiBJZiBzbywgYW4gYXR0ZW1wdGVkIHtAY29kZSB0cmFuc2Zlcn0gb3BlcmF0aW9uCisgKiBtYXkgaW5pdGlhbGx5IGJsb2NrIHdhaXRpbmcgZm9yIGF2YWlsYWJsZSBzcGFjZSwgYW5kL29yCisgKiBzdWJzZXF1ZW50bHkgYmxvY2sgd2FpdGluZyBmb3IgcmVjZXB0aW9uIGJ5IGEgY29uc3VtZXIuICBOb3RlIHRoYXQKKyAqIGluIGEgcXVldWUgd2l0aCB6ZXJvIGNhcGFjaXR5LCBzdWNoIGFzIHtAbGluayBTeW5jaHJvbm91c1F1ZXVlfSwKKyAqIHtAY29kZSBwdXR9IGFuZCB7QGNvZGUgdHJhbnNmZXJ9IGFyZSBlZmZlY3RpdmVseSBzeW5vbnltb3VzLgorICoKKyAqIDxwPlRoaXMgaW50ZXJmYWNlIGlzIGEgbWVtYmVyIG9mIHRoZQorICogPGEgaHJlZj0ie0Bkb2NSb290fS8uLi90ZWNobm90ZXMvZ3VpZGVzL2NvbGxlY3Rpb25zL2luZGV4Lmh0bWwiPgorICogSmF2YSBDb2xsZWN0aW9ucyBGcmFtZXdvcms8L2E+LgorICoKKyAqIEBwYXJhbSA8RT4gdGhlIHR5cGUgb2YgZWxlbWVudHMgaGVsZCBpbiB0aGlzIGNvbGxlY3Rpb24KKyAqIEBhdXRob3IgRG91ZyBMZWEKKyAqLworcHVibGljIGludGVyZmFjZSBUcmFuc2ZlclF1ZXVlPEU+IGV4dGVuZHMgQmxvY2tpbmdRdWV1ZTxFPiB7CisgICAgLyoqCisgICAgICogVHJhbnNmZXJzIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBpZiB0aGVyZSBleGlzdHMgYSBjb25zdW1lcgorICAgICAqIGFscmVhZHkgd2FpdGluZyB0byByZWNlaXZlIGl0LCBvdGhlcndpc2UgcmV0dXJuaW5nIHtAY29kZSBmYWxzZX0KKyAgICAgKiB3aXRob3V0IGVucXVldWluZyB0aGUgZWxlbWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlIHRoZSBlbGVtZW50IHRvIHRyYW5zZmVyCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGVsZW1lbnQgd2FzIHRyYW5zZmVycmVkLCBlbHNlCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9CisgICAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gICAgICAgaWYgdGhlIGNsYXNzIG9mIHRoZSBzcGVjaWZpZWQgZWxlbWVudAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZlbnRzIGl0IGZyb20gYmVpbmcgYWRkZWQgdG8gdGhpcyBxdWV1ZQorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gICAgIGlmIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBpcyBudWxsCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgc29tZSBwcm9wZXJ0eSBvZiB0aGUgc3BlY2lmaWVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCBwcmV2ZW50cyBpdCBmcm9tIGJlaW5nIGFkZGVkIHRvIHRoaXMgcXVldWUKKyAgICAgKi8KKyAgICBib29sZWFuIHRyeVRyYW5zZmVyKEUgZSk7CisKKyAgICAvKioKKyAgICAgKiBJbnNlcnRzIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBpbnRvIHRoaXMgcXVldWUsIHdhaXRpbmcgaWYKKyAgICAgKiBuZWNlc3NhcnkgZm9yIHNwYWNlIHRvIGJlY29tZSBhdmFpbGFibGUgYW5kIHRoZSBlbGVtZW50IHRvIGJlCisgICAgICogZGVxdWV1ZWQgYnkgYSBjb25zdW1lciBpbnZva2luZyB7QGNvZGUgdGFrZX0gb3Ige0Bjb2RlIHBvbGx9LgorICAgICAqCisgICAgICogQHBhcmFtIGUgdGhlIGVsZW1lbnQgdG8gdHJhbnNmZXIKKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uICAgICBpZiBpbnRlcnJ1cHRlZCB3aGlsZSB3YWl0aW5nLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHdoaWNoIGNhc2UgdGhlIGVsZW1lbnQgaXMgbm90IGVucXVldWVkLgorICAgICAqIEB0aHJvd3MgQ2xhc3NDYXN0RXhjZXB0aW9uICAgICAgIGlmIHRoZSBjbGFzcyBvZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2ZW50cyBpdCBmcm9tIGJlaW5nIGFkZGVkIHRvIHRoaXMgcXVldWUKKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uICAgICBpZiB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgaXMgbnVsbAorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHNvbWUgcHJvcGVydHkgb2YgdGhlIHNwZWNpZmllZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgcHJldmVudHMgaXQgZnJvbSBiZWluZyBhZGRlZCB0byB0aGlzIHF1ZXVlCisgICAgICovCisgICAgdm9pZCB0cmFuc2ZlcihFIGUpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIEluc2VydHMgdGhlIHNwZWNpZmllZCBlbGVtZW50IGludG8gdGhpcyBxdWV1ZSwgd2FpdGluZyB1cCB0bworICAgICAqIHRoZSBzcGVjaWZpZWQgd2FpdCB0aW1lIGlmIG5lY2Vzc2FyeSBmb3Igc3BhY2UgdG8gYmVjb21lCisgICAgICogYXZhaWxhYmxlIGFuZCB0aGUgZWxlbWVudCB0byBiZSBkZXF1ZXVlZCBieSBhIGNvbnN1bWVyIGludm9raW5nCisgICAgICoge0Bjb2RlIHRha2V9IG9yIHtAY29kZSBwb2xsfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlICAgICAgIHRoZSBlbGVtZW50IHRvIHRyYW5zZmVyCisgICAgICogQHBhcmFtIHRpbWVvdXQgaG93IGxvbmcgdG8gd2FpdCBiZWZvcmUgZ2l2aW5nIHVwLCBpbiB1bml0cyBvZgorICAgICAqICAgICAgICAgICAgICAgIHtAY29kZSB1bml0fQorICAgICAqIEBwYXJhbSB1bml0ICAgIGEge0Bjb2RlIFRpbWVVbml0fSBkZXRlcm1pbmluZyBob3cgdG8gaW50ZXJwcmV0IHRoZQorICAgICAqICAgICAgICAgICAgICAgIHtAY29kZSB0aW1lb3V0fSBwYXJhbWV0ZXIKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBzdWNjZXNzZnVsLCBvciB7QGNvZGUgZmFsc2V9IGlmCisgICAgICogICAgICAgICB0aGUgc3BlY2lmaWVkIHdhaXRpbmcgdGltZSBlbGFwc2VzIGJlZm9yZSBjb21wbGV0aW9uLAorICAgICAqICAgICAgICAgaW4gd2hpY2ggY2FzZSB0aGUgZWxlbWVudCBpcyBub3QgZW5xdWV1ZWQuCisgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiAgICAgaWYgaW50ZXJydXB0ZWQgd2hpbGUgd2FpdGluZywKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiB3aGljaCBjYXNlIHRoZSBlbGVtZW50IGlzIG5vdCBlbnF1ZXVlZC4KKyAgICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiAgICAgICBpZiB0aGUgY2xhc3Mgb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmVudHMgaXQgZnJvbSBiZWluZyBhZGRlZCB0byB0aGlzIHF1ZXVlCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiAgICAgaWYgdGhlIHNwZWNpZmllZCBlbGVtZW50IGlzIG51bGwKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBzb21lIHByb3BlcnR5IG9mIHRoZSBzcGVjaWZpZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IHByZXZlbnRzIGl0IGZyb20gYmVpbmcgYWRkZWQgdG8gdGhpcyBxdWV1ZQorICAgICAqLworICAgIGJvb2xlYW4gdHJ5VHJhbnNmZXIoRSBlLCBsb25nIHRpbWVvdXQsIFRpbWVVbml0IHVuaXQpCisgICAgICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgY29uc3VtZXIgd2FpdGluZworICAgICAqIHRvIGRlcXVldWUgYW4gZWxlbWVudCB2aWEge0Bjb2RlIHRha2V9IG9yIHtAY29kZSBwb2xsfS4KKyAgICAgKiBUaGUgcmV0dXJuIHZhbHVlIHJlcHJlc2VudHMgYSBtb21lbnRhcnkgc3RhdGUgb2YgYWZmYWlycy4KKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSB3YWl0aW5nIGNvbnN1bWVyCisgICAgICovCisgICAgYm9vbGVhbiBoYXNXYWl0aW5nQ29uc3VtZXIoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gZXN0aW1hdGUgb2YgdGhlIG51bWJlciBvZiBjb25zdW1lcnMgd2FpdGluZyB0bworICAgICAqIGRlcXVldWUgZWxlbWVudHMgdmlhIHtAY29kZSB0YWtlfSBvciB7QGNvZGUgcG9sbH0uIFRoZSByZXR1cm4KKyAgICAgKiB2YWx1ZSBpcyBhbiBhcHByb3hpbWF0aW9uIG9mIGEgbW9tZW50YXJ5IHN0YXRlIG9mIGFmZmFpcnMsIHRoYXQKKyAgICAgKiBtYXkgYmUgaW5hY2N1cmF0ZSBpZiBjb25zdW1lcnMgaGF2ZSBjb21wbGV0ZWQgb3IgZ2l2ZW4gdXAKKyAgICAgKiB3YWl0aW5nLiBUaGUgdmFsdWUgbWF5IGJlIHVzZWZ1bCBmb3IgbW9uaXRvcmluZyBhbmQgaGV1cmlzdGljcywKKyAgICAgKiBidXQgbm90IGZvciBzeW5jaHJvbml6YXRpb24gY29udHJvbC4gSW1wbGVtZW50YXRpb25zIG9mIHRoaXMKKyAgICAgKiBtZXRob2QgYXJlIGxpa2VseSB0byBiZSBub3RpY2VhYmx5IHNsb3dlciB0aGFuIHRob3NlIGZvcgorICAgICAqIHtAbGluayAjaGFzV2FpdGluZ0NvbnN1bWVyfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjb25zdW1lcnMgd2FpdGluZyB0byBkZXF1ZXVlIGVsZW1lbnRzCisgICAgICovCisgICAgaW50IGdldFdhaXRpbmdDb25zdW1lckNvdW50KCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvY29sbGVjdGlvbi9VbnNhZmVWYWx1ZS5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL2NvbGxlY3Rpb24vVW5zYWZlVmFsdWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzIyOTU3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL2NvbGxlY3Rpb24vVW5zYWZlVmFsdWUuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbjsKKworLyoqCisgKiBBIGdlbmVyaWMgdmFsdWUgcHJvdmlkZXIsIHNpbWlsYXIgdG8ge0BsaW5rIFZhbHVlfSwgYnV0IGFibGUgdG8KKyAqIHRocm93IGFuIGV4Y2VwdGlvbi4KKyAqCisgKiBAcGFyYW0gPFQ+IHZhbHVlIHR5cGUuCisgKiBAcGFyYW0gPEU+IGV4Y2VwdGlvbiB0eXBlLgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGludGVyZmFjZSBVbnNhZmVWYWx1ZTxULCBFIGV4dGVuZHMgVGhyb3dhYmxlPiB7CisgICAgLyoqCisgICAgICogR2V0IHRoZSBzdG9yZWQgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHN0b3JlZCB2YWx1ZS4KKyAgICAgKiBAdGhyb3dzIEUgaW4gY2FzZSB0aGVyZSB3YXMgYW4gZXJyb3Igd2hpbGUgY29tcHV0aW5nIHRoZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVCBnZXQoKSB0aHJvd3MgRTsKK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9jb2xsZWN0aW9uL1ZhbHVlLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvY29sbGVjdGlvbi9WYWx1ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNjY4MTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvY29sbGVjdGlvbi9WYWx1ZS5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uOworCisvKioKKyAqIEEgZ2VuZXJpYyB2YWx1ZSBwcm92aWRlci4KKyAqCisgKiBAcGFyYW0gPFQ+IHZhbHVlIHR5cGUuCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgaW50ZXJmYWNlIFZhbHVlPFQ+IHsKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHN0b3JlZCB2YWx1ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gc3RvcmVkIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBUIGdldCgpOworfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL2NvbGxlY3Rpb24vVmFsdWVzLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvY29sbGVjdGlvbi9WYWx1ZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzUxMjI1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL2NvbGxlY3Rpb24vVmFsdWVzLmphdmEKQEAgLTAsMCArMSw0NDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uOworCisvKioKKyAqIEEgY29sbGVjdGlvbiBvZiB7QGxpbmsgVmFsdWUgVmFsdWUgcHJvdmlkZXJ9IGZhY3RvcnkgJiB1dGlsaXR5IG1ldGhvZHMuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFZhbHVlcyB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMYXp5VmFsdWUgRU1QVFkgPSBuZXcgTGF6eVZhbHVlKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGF6eVVuc2FmZVZhbHVlIEVNUFRZX1VOU0FGRSA9IG5ldyBMYXp5VW5zYWZlVmFsdWUoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0IGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzSW5pdGlhbGl6ZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIFZhbHVlcygpIHsKKyAgICAgICAgLy8gcHJldmVudHMgaW5zdGFudGlhdGlvbi4KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYW4gZW1wdHkge0BsaW5rIFZhbHVlIHZhbHVlIHByb3ZpZGVyfSB3aG9zZSB7QGxpbmsgVmFsdWUjZ2V0KCkgZ2V0KCl9CisgICAgICogbWV0aG9kIGFsd2F5cyByZXR1cm5zIHtAY29kZSBudWxsfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSA8VD4gdmFsdWUgdHlwZS4KKyAgICAgKiBAcmV0dXJuIGVtcHR5IHZhbHVlIHByb3ZpZGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFZhbHVlPFQ+IGVtcHR5KCkgeworICAgICAgICAvL25vaW5zcGVjdGlvbiB1bmNoZWNrZWQKKyAgICAgICAgcmV0dXJuIChWYWx1ZTxUPikgRU1QVFk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGFuIGVtcHR5IHtAbGluayBVbnNhZmVWYWx1ZSB2YWx1ZSBwcm92aWRlcn0gd2hvc2Uge0BsaW5rIFVuc2FmZVZhbHVlI2dldCgpIGdldCgpfQorICAgICAqIG1ldGhvZCBhbHdheXMgcmV0dXJucyB7QGNvZGUgbnVsbH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gPFQ+IHZhbHVlIHR5cGUuCisgICAgICogQHJldHVybiBlbXB0eSB1bnNhZmUgdmFsdWUgcHJvdmlkZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8VCwgRSBleHRlbmRzIFRocm93YWJsZT4gVW5zYWZlVmFsdWU8VCwgRT4gZW1wdHlVbnNhZmUoKSB7CisgICAgICAgIC8vbm9pbnNwZWN0aW9uIHVuY2hlY2tlZAorICAgICAgICByZXR1cm4gKFVuc2FmZVZhbHVlPFQsIEU+KSBFTVBUWV9VTlNBRkU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgbmV3IGNvbnN0YW50IHtAbGluayBWYWx1ZSB2YWx1ZSBwcm92aWRlcn0gd2hvc2Uge0BsaW5rIFZhbHVlI2dldCgpIGdldCgpfQorICAgICAqIG1ldGhvZCBhbHdheXMgcmV0dXJucyB0aGUgaW5zdGFuY2Ugc3VwcGxpZWQgdG8gdGhlIHtAY29kZSB2YWx1ZX0gcGFyYW1ldGVyLgorICAgICAqIDxwLz4KKyAgICAgKiBJbiBjYXNlIHRoZSBzdXBwbGllZCB2YWx1ZSBjb25zdGFudCBpcyB7QGNvZGUgbnVsbH0sIGFuIHtAbGluayAjZW1wdHkoKSBlbXB0eX0gdmFsdWUKKyAgICAgKiBwcm92aWRlciBpcyByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSA8VD4gICB2YWx1ZSB0eXBlLgorICAgICAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSBpbnN0YW5jZSB0byBiZSBwcm92aWRlZC4KKyAgICAgKiBAcmV0dXJuIGNvbnN0YW50IHZhbHVlIHByb3ZpZGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFZhbHVlPFQ+IG9mKGZpbmFsIFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuICh2YWx1ZSA9PSBudWxsKSA/IFZhbHVlcy48VD5lbXB0eSgpIDogbmV3IEluc3RhbmNlVmFsdWU8VD4odmFsdWUpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEluc3RhbmNlVmFsdWU8VD4gaW1wbGVtZW50cyBWYWx1ZTxUPiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBUIHZhbHVlOworCisgICAgICAgIHB1YmxpYyBJbnN0YW5jZVZhbHVlKGZpbmFsIFQgdmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVCBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvKSB7CisgICAgICAgICAgICBpZiAodGhpcyA9PSBvKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdmFsdWUuZXF1YWxzKCgoSW5zdGFuY2VWYWx1ZSkgbykudmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCA/IHZhbHVlLmhhc2hDb2RlKCkgOiAwOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIkluc3RhbmNlVmFsdWV7dmFsdWU9IiArIHZhbHVlICsgJ30nOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgbmV3IGNvbnN0YW50IHtAbGluayBVbnNhZmVWYWx1ZSB2YWx1ZSBwcm92aWRlcn0gd2hvc2Uge0BsaW5rIFVuc2FmZVZhbHVlI2dldCgpIGdldCgpfQorICAgICAqIG1ldGhvZCBhbHdheXMgcmV0dXJucyB0aGUgaW5zdGFuY2Ugc3VwcGxpZWQgdG8gdGhlIHtAY29kZSB2YWx1ZX0gcGFyYW1ldGVyLgorICAgICAqIDxwLz4KKyAgICAgKiBJbiBjYXNlIHRoZSBzdXBwbGllZCB2YWx1ZSBjb25zdGFudCBpcyB7QGNvZGUgbnVsbH0sIGFuIHtAbGluayAjZW1wdHlVbnNhZmUoKSBlbXB0eX0gdmFsdWUKKyAgICAgKiBwcm92aWRlciBpcyByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSA8VD4gICB2YWx1ZSB0eXBlLgorICAgICAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSBpbnN0YW5jZSB0byBiZSBwcm92aWRlZC4KKyAgICAgKiBAcmV0dXJuIGNvbnN0YW50IHZhbHVlIHByb3ZpZGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQsIEUgZXh0ZW5kcyBUaHJvd2FibGU+IFVuc2FmZVZhbHVlPFQsIEU+IHVuc2FmZShmaW5hbCBUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiAodmFsdWUgPT0gbnVsbCkgPyBWYWx1ZXMuPFQsIEU+ZW1wdHlVbnNhZmUoKSA6IG5ldyBJbnN0YW5jZVVuc2FmZVZhbHVlPFQsIEU+KHZhbHVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJbnN0YW5jZVVuc2FmZVZhbHVlPFQsIEUgZXh0ZW5kcyBUaHJvd2FibGU+IGltcGxlbWVudHMgVW5zYWZlVmFsdWU8VCwgRT4geworCisgICAgICAgIHByaXZhdGUgZmluYWwgVCB2YWx1ZTsKKworICAgICAgICBwdWJsaWMgSW5zdGFuY2VVbnNhZmVWYWx1ZShmaW5hbCBUIHZhbHVlKSB7CisgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFQgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3QgbykgeworICAgICAgICAgICAgaWYgKHRoaXMgPT0gbykgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmVxdWFscygoKEluc3RhbmNlVW5zYWZlVmFsdWUpIG8pLnZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlICE9IG51bGwgPyB2YWx1ZS5oYXNoQ29kZSgpIDogMDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJJbnN0YW5jZVVuc2FmZVZhbHVle3ZhbHVlPSIgKyB2YWx1ZSArICd9JzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIG5ldyAidGhyb3dpbmciIHtAbGluayBVbnNhZmVWYWx1ZSB1bnNhZmUgdmFsdWUgcHJvdmlkZXJ9IHdob3NlIHtAbGluayBVbnNhZmVWYWx1ZSNnZXQoKSBnZXQoKX0KKyAgICAgKiBtZXRob2QgYWx3YXlzIHRocm93cyB0aGUgZXhjZXB0aW9uIHN1cHBsaWVkIHRvIHRoZSB7QGNvZGUgdGhyb3dhYmxlfSBwYXJhbWV0ZXIuCisgICAgICogPHAvPgorICAgICAqIEluIGNhc2UgdGhlIHN1cHBsaWVkIHRocm93YWJsZSBpcyB7QGNvZGUgbnVsbH0sIGFuIHtAbGluayBOdWxsUG9pbnRlckV4Y2VwdGlvbn0gaXMgdGhyb3duLgorICAgICAqCisgICAgICogQHBhcmFtIDxUPiAgICAgICB2YWx1ZSB0eXBlLgorICAgICAqIEBwYXJhbSA8RT4gICAgICAgZXhjZXB0aW9uIHR5cGUuCisgICAgICogQHBhcmFtIHRocm93YWJsZSB0aHJvd2FibGUgaW5zdGFuY2UgdG8gYmUgdGhyb3duLgorICAgICAqIEByZXR1cm4gInRocm93aW5nIiB1bnNhZmUgdmFsdWUgcHJvdmlkZXIuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBjYXNlIHRoZSBzdXBwbGllZCB0aHJvd2FibGUgaW5zdGFuY2UgaXMge0Bjb2RlIG51bGx9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQsIEUgZXh0ZW5kcyBUaHJvd2FibGU+IFVuc2FmZVZhbHVlPFQsIEU+IHRocm93aW5nKGZpbmFsIEUgdGhyb3dhYmxlKSB7CisgICAgICAgIGlmICh0aHJvd2FibGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJTdXBwbGllZCB0aHJvd2FibGUgIik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3IEV4Y2VwdGlvblZhbHVlPFQsIEU+KHRocm93YWJsZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRXhjZXB0aW9uVmFsdWU8VCwgRSBleHRlbmRzIFRocm93YWJsZT4gaW1wbGVtZW50cyBVbnNhZmVWYWx1ZTxULCBFPiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBFIHRocm93YWJsZTsKKworICAgICAgICBwdWJsaWMgRXhjZXB0aW9uVmFsdWUoZmluYWwgRSB0aHJvd2FibGUpIHsKKyAgICAgICAgICAgIHRoaXMudGhyb3dhYmxlID0gdGhyb3dhYmxlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBUIGdldCgpIHRocm93cyBFIHsKKyAgICAgICAgICAgIHRocm93IHRocm93YWJsZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIGlmICh0aGlzID09IG8pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB0aHJvd2FibGUuZXF1YWxzKCgoRXhjZXB0aW9uVmFsdWUpIG8pLnRocm93YWJsZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB0aHJvd2FibGUgIT0gbnVsbCA/IHRocm93YWJsZS5oYXNoQ29kZSgpIDogMDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJFeGNlcHRpb25WYWx1ZXt0aHJvd2FibGU9IiArIHRocm93YWJsZSArICd9JzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIG5ldyBsYXppbHkgaW5pdGlhbGl6ZWQge0BsaW5rIFZhbHVlIHZhbHVlIHByb3ZpZGVyfS4KKyAgICAgKiA8cC8+CisgICAgICogVGhlIHZhbHVlIHJldHVybmVkIGJ5IGl0cyB7QGxpbmsgVmFsdWUjZ2V0KCkgZ2V0KCl9IG1ldGhvZCBpcyBsYXppbHkgcmV0cmlldmVkIGR1cmluZyBhIGZpcnN0CisgICAgICogY2FsbCB0byB0aGUgbWV0aG9kIGZyb20gdGhlIHN1cHBsaWVkIHtAY29kZSBkZWxlZ2F0ZX0gdmFsdWUgcHJvdmlkZXIgYW5kIGlzIHRoZW4gY2FjaGVkIGZvcgorICAgICAqIGEgc3Vic2VxdWVudCByZXRyaWV2YWwuCisgICAgICogPHA+CisgICAgICogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSByZXR1cm5lZCBsYXp5IHZhbHVlIHByb3ZpZGVyIGlzIHRocmVhZC1zYWZlIGFuZCBpcyBndWFyYW50ZWVkIHRvCisgICAgICogaW52b2tlIHRoZSB7QGNvZGUgZ2V0KCl9IG1ldGhvZCBvbiB0aGUgc3VwcGxpZWQge0Bjb2RlIGRlbGVnYXRlfSB2YWx1ZSBwcm92aWRlciBpbnN0YW5jZSBhdAorICAgICAqIG1vc3Qgb25jZS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogSWYgdGhlIHN1cHBsaWVkIHZhbHVlIHByb3ZpZGVyIGlzIHtAY29kZSBudWxsfSwgYW4ge0BsaW5rICNlbXB0eSgpIGVtcHR5fSB2YWx1ZQorICAgICAqIHByb3ZpZGVyIGlzIHJldHVybmVkLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSA8VD4gICAgICB2YWx1ZSB0eXBlLgorICAgICAqIEBwYXJhbSBkZWxlZ2F0ZSB2YWx1ZSBwcm92aWRlciBkZWxlZ2F0ZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBsYXppbHkgaW5pdGlhbGl6ZSB0aGUgdmFsdWUgcHJvdmlkZXIuCisgICAgICogQHJldHVybiBsYXppbHkgaW5pdGlhbGl6ZWQgdmFsdWUgcHJvdmlkZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8VD4gTGF6eVZhbHVlPFQ+IGxhenkoZmluYWwgVmFsdWU8VD4gZGVsZWdhdGUpIHsKKyAgICAgICAgLy9ub2luc3BlY3Rpb24gdW5jaGVja2VkCisgICAgICAgIHJldHVybiAoZGVsZWdhdGUgPT0gbnVsbCkgPyAoTGF6eVZhbHVlPFQ+KSBFTVBUWSA6IG5ldyBMYXp5VmFsdWVJbXBsPFQ+KGRlbGVnYXRlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBuZXcgZWFnZXJseSBpbml0aWFsaXplZCB7QGxpbmsgVmFsdWUgdmFsdWUgcHJvdmlkZXJ9LgorICAgICAqIDxwLz4KKyAgICAgKiBUaGUgdmFsdWUgcmV0dXJuZWQgYnkgaXRzIHtAbGluayBWYWx1ZSNnZXQoKSBnZXQoKX0gbWV0aG9kIGlzIGVhZ2VybHkgY29tcHV0ZWQgZnJvbSB0aGUgc3VwcGxpZWQKKyAgICAgKiB7QGNvZGUgZGVsZWdhdGV9IHZhbHVlIHByb3ZpZGVyIGFuZCBpcyB0aGVuIHN0b3JlZCBpbiBhIGZpbmFsIGZpZWxkIGZvciBhIHN1YnNlcXVlbnQgcmV0cmlldmFsLgorICAgICAqIDxwPgorICAgICAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcmV0dXJuZWQgZWFnZXIgdmFsdWUgcHJvdmlkZXIgaXMgdGhyZWFkLXNhZmUgYW5kIGlzIGd1YXJhbnRlZWQgdG8KKyAgICAgKiBpbnZva2UgdGhlIHtAY29kZSBnZXQoKX0gbWV0aG9kIG9uIHRoZSBzdXBwbGllZCB7QGNvZGUgZGVsZWdhdGV9IHZhbHVlIHByb3ZpZGVyIGluc3RhbmNlIG9uY2UKKyAgICAgKiBhbmQgb25seSBvbmNlLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgc3VwcGxpZWQgdmFsdWUgcHJvdmlkZXIgaXMge0Bjb2RlIG51bGx9LCBhbiB7QGxpbmsgI2VtcHR5KCkgZW1wdHl9IHZhbHVlCisgICAgICogcHJvdmlkZXIgaXMgcmV0dXJuZWQuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIDxUPiAgICAgIHZhbHVlIHR5cGUuCisgICAgICogQHBhcmFtIGRlbGVnYXRlIHZhbHVlIHByb3ZpZGVyIGRlbGVnYXRlIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGVhZ2VybHkgaW5pdGlhbGl6ZSB0aGUgdmFsdWUgcHJvdmlkZXIuCisgICAgICogQHJldHVybiBlYWdlcmx5IGluaXRpYWxpemVkLCBjb25zdGFudCB2YWx1ZSBwcm92aWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUPiBWYWx1ZTxUPiBlYWdlcihmaW5hbCBWYWx1ZTxUPiBkZWxlZ2F0ZSkgeworICAgICAgICByZXR1cm4gKGRlbGVnYXRlID09IG51bGwpID8gVmFsdWVzLjxUPmVtcHR5KCkgOiBuZXcgRWFnZXJWYWx1ZTxUPihkZWxlZ2F0ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRWFnZXJWYWx1ZTxUPiBpbXBsZW1lbnRzIFZhbHVlPFQ+IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFQgcmVzdWx0OworCisgICAgICAgIHByaXZhdGUgRWFnZXJWYWx1ZShmaW5hbCBWYWx1ZTxUPiB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy5yZXN1bHQgPSB2YWx1ZS5nZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVCBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTGF6eVZhbHVlSW1wbDxUPiBpbXBsZW1lbnRzIExhenlWYWx1ZTxUPiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbG9jazsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBWYWx1ZTxUPiBkZWxlZ2F0ZTsKKworICAgICAgICBwcml2YXRlIHZvbGF0aWxlIFZhbHVlPFQ+IHZhbHVlOworCisgICAgICAgIHB1YmxpYyBMYXp5VmFsdWVJbXBsKGZpbmFsIFZhbHVlPFQ+IGRlbGVnYXRlKSB7CisgICAgICAgICAgICB0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7CisgICAgICAgICAgICB0aGlzLmxvY2sgPSBuZXcgT2JqZWN0KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFQgZ2V0KCkgeworICAgICAgICAgICAgVmFsdWU8VD4gcmVzdWx0ID0gdmFsdWU7CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKGxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSByZXN1bHQgPSBWYWx1ZXMub2YoZGVsZWdhdGUuZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5nZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlICE9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvKSB7CisgICAgICAgICAgICBpZiAodGhpcyA9PSBvKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuZXF1YWxzKCgoTGF6eVZhbHVlSW1wbCkgbykuZGVsZWdhdGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUgIT0gbnVsbCA/IGRlbGVnYXRlLmhhc2hDb2RlKCkgOiAwOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIkxhenlWYWx1ZXtkZWxlZ2F0ZT0iICsgZGVsZWdhdGUudG9TdHJpbmcoKSArICd9JzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIG5ldyBsYXppbHkgaW5pdGlhbGl6ZWQge0BsaW5rIFVuc2FmZVZhbHVlIHVuc2FmZSB2YWx1ZSBwcm92aWRlcn0uCisgICAgICogPHAvPgorICAgICAqIFRoZSB2YWx1ZSByZXR1cm5lZCBieSBpdHMge0BsaW5rIFVuc2FmZVZhbHVlI2dldCgpIGdldCgpfSBtZXRob2QgaXMgbGF6aWx5IHJldHJpZXZlZCBkdXJpbmcgYSBmaXJzdAorICAgICAqIGNhbGwgdG8gdGhlIG1ldGhvZCBmcm9tIHRoZSBzdXBwbGllZCB7QGNvZGUgZGVsZWdhdGV9IHZhbHVlIHByb3ZpZGVyIGFuZCBpcyB0aGVuIGNhY2hlZCBmb3IKKyAgICAgKiBhIHN1YnNlcXVlbnQgcmV0cmlldmFsLgorICAgICAqIDxwPgorICAgICAqIEluIGNhc2UgdGhlIGNhbGwgdG8gdW5kZXJseWluZyB7QGNvZGUgZGVsZWdhdGUuZ2V0KCl9IHRocm93cyBhIHRocm93YWJsZSwgdGhlIHRocm93YWJsZSBpcyBjYWNoZWQKKyAgICAgKiBhbmQgdGhyb3duIG9uIGFsbCBzdWJzZXF1ZW50IHJldHJpZXZhbHMuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcmV0dXJuZWQgbGF6eSB2YWx1ZSBwcm92aWRlciBpcyB0aHJlYWQtc2FmZSBhbmQgaXMgZ3VhcmFudGVlZCB0bworICAgICAqIGludm9rZSB0aGUge0Bjb2RlIGdldCgpfSBtZXRob2Qgb24gdGhlIHN1cHBsaWVkIHtAY29kZSBkZWxlZ2F0ZX0gdmFsdWUgcHJvdmlkZXIgaW5zdGFuY2UgYXQKKyAgICAgKiBtb3N0IG9uY2UuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSBzdXBwbGllZCB2YWx1ZSBwcm92aWRlciBpcyB7QGNvZGUgbnVsbH0sIGFuIHtAbGluayAjZW1wdHkoKSBlbXB0eX0gdmFsdWUKKyAgICAgKiBwcm92aWRlciBpcyByZXR1cm5lZC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gPFQ+ICAgICAgdmFsdWUgdHlwZS4KKyAgICAgKiBAcGFyYW0gZGVsZWdhdGUgdmFsdWUgcHJvdmlkZXIgZGVsZWdhdGUgdGhhdCB3aWxsIGJlIHVzZWQgdG8gbGF6aWx5IGluaXRpYWxpemUgdGhlIHZhbHVlIHByb3ZpZGVyLgorICAgICAqIEByZXR1cm4gbGF6aWx5IGluaXRpYWxpemVkIHZhbHVlIHByb3ZpZGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQsIEUgZXh0ZW5kcyBUaHJvd2FibGU+IExhenlVbnNhZmVWYWx1ZTxULCBFPiBsYXp5KGZpbmFsIFVuc2FmZVZhbHVlPFQsIEU+IGRlbGVnYXRlKSB7CisgICAgICAgIC8vbm9pbnNwZWN0aW9uIHVuY2hlY2tlZAorICAgICAgICByZXR1cm4gKGRlbGVnYXRlID09IG51bGwpID8gKExhenlVbnNhZmVWYWx1ZTxULCBFPikgRU1QVFlfVU5TQUZFIDogbmV3IExhenlVbnNhZmVWYWx1ZUltcGw8VCwgRT4oZGVsZWdhdGUpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIExhenlVbnNhZmVWYWx1ZUltcGw8VCwgRSBleHRlbmRzIFRocm93YWJsZT4gaW1wbGVtZW50cyBMYXp5VW5zYWZlVmFsdWU8VCwgRT4geworCisgICAgICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IGxvY2s7CisgICAgICAgIHByaXZhdGUgZmluYWwgVW5zYWZlVmFsdWU8VCwgRT4gZGVsZWdhdGU7CisKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBVbnNhZmVWYWx1ZTxULCBFPiB2YWx1ZTsKKworICAgICAgICBwdWJsaWMgTGF6eVVuc2FmZVZhbHVlSW1wbChmaW5hbCBVbnNhZmVWYWx1ZTxULCBFPiBkZWxlZ2F0ZSkgeworICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlOworICAgICAgICAgICAgdGhpcy5sb2NrID0gbmV3IE9iamVjdCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBUIGdldCgpIHRocm93cyBFIHsKKyAgICAgICAgICAgIFVuc2FmZVZhbHVlPFQsIEU+IHJlc3VsdCA9IHZhbHVlOworICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChsb2NrKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHZhbHVlOworICAgICAgICAgICAgICAgICAgICAvL25vaW5zcGVjdGlvbiBDb25zdGFudENvbmRpdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFZhbHVlcy51bnNhZmUoZGVsZWdhdGUuZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL25vaW5zcGVjdGlvbiB1bmNoZWNrZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBWYWx1ZXMudGhyb3dpbmcoKEUpIGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0LmdldCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzSW5pdGlhbGl6ZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIGlmICh0aGlzID09IG8pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5lcXVhbHMoKChMYXp5VW5zYWZlVmFsdWVJbXBsKSBvKS5kZWxlZ2F0ZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZSAhPSBudWxsID8gZGVsZWdhdGUuaGFzaENvZGUoKSA6IDA7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiTGF6eVZhbHVle2RlbGVnYXRlPSIgKyBkZWxlZ2F0ZS50b1N0cmluZygpICsgJ30nOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL2NvbGxlY3Rpb24vVmlld3MuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9jb2xsZWN0aW9uL1ZpZXdzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlmZDcyOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9jb2xsZWN0aW9uL1ZpZXdzLmphdmEKQEAgLTAsMCArMSwyNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkFic3RyYWN0TWFwOworaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdFNlcXVlbnRpYWxMaXN0OworaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhLlByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsOworCisvKioKKyAqIENvbGxlY3Rpb25zIHV0aWxzLCB3aGljaCBwcm92aWRlIHRyYW5zZm9ybWluZyB2aWV3cyBmb3Ige0BsaW5rIExpc3R9IGFuZCB7QGxpbmsgTWFwfS4KKyAqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgVmlld3MgeworCisgICAgcHJpdmF0ZSBWaWV3cygpIHsKKyAgICAgICAgLy8gcHJldmVudCBpbnN0YW50aWF0aW9uLgorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHtAbGluayBMaXN0fSB2aWV3LCB3aGljaCB0cmFuc2Zvcm1zIHRoZSB2YWx1ZXMgb2YgcHJvdmlkZWQgb3JpZ2luYWwgbGlzdC4KKyAgICAgKiA8cD4KKyAgICAgKiBSZW1vdmluZyBlbGVtZW50cyBmcm9tIHRoZSB2aWV3IGlzIHN1cHBvcnRlZCwgYWRkaW5nIGFuZCBzZXR0aW5nIGlzbid0IGFuZAorICAgICAqIHRocm93cyB7QGxpbmsgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb259IHdoZW4gaW52b2tlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvcmlnaW5hbExpc3Qgb3JpZ2luYWwgbGlzdC4KKyAgICAgKiBAcGFyYW0gdHJhbnNmb3JtZXIgIHRyYW5zZm9ybWluZyBmdW5jdGlvbnMuCisgICAgICogQHBhcmFtIDxUPiAgICAgICAgICB0cmFuc2Zvcm1lZCB0eXBlIHBhcmFtZXRlci4KKyAgICAgKiBAcGFyYW0gPFI+ICAgICAgICAgIHR5cGUgb2YgdGhlIGVsZW1lbnQgZnJvbSBwcm92aWRlZCBsaXN0LgorICAgICAqIEByZXR1cm4gdHJhbnNmb3JtZWQgbGlzdCB2aWV3LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQsIFI+IExpc3Q8VD4gbGlzdFZpZXcoTGlzdDxSPiBvcmlnaW5hbExpc3QsIEZ1bmN0aW9uPFIsIFQ+IHRyYW5zZm9ybWVyKSB7CisgICAgICAgIHJldHVybiBuZXcgQWJzdHJhY3RTZXF1ZW50aWFsTGlzdDxUPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIExpc3RJdGVyYXRvcjxUPiBsaXN0SXRlcmF0b3IoaW50IGluZGV4KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMaXN0SXRlcmF0b3I8VD4oKSB7CisKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdEl0ZXJhdG9yPFI+IGl0ZXJhdG9yID0gb3JpZ2luYWxMaXN0Lmxpc3RJdGVyYXRvcihpbmRleCk7CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlcmF0b3IuaGFzTmV4dCgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBUIG5leHQoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtZXIuYXBwbHkoaXRlcmF0b3IubmV4dCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNQcmV2aW91cygpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVyYXRvci5oYXNQcmV2aW91cygpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBUIHByZXZpb3VzKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVyLmFwcGx5KGl0ZXJhdG9yLnByZXZpb3VzKCkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgbmV4dEluZGV4KCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yLm5leHRJbmRleCgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVyYXRvci5wcmV2aW91c0luZGV4KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IucmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0KFQgdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkLiIpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFkZChUIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbExpc3Quc2l6ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHtAbGluayBNYXB9IHZpZXcsIHdoaWNoIHRyYW5zZm9ybXMgdGhlIHZhbHVlcyBvZiBwcm92aWRlZCBvcmlnaW5hbCBtYXAuCisgICAgICogPHA+CisgICAgICogUmVtb3ZpbmcgZWxlbWVudHMgZnJvbSB0aGUgbWFwIHZpZXcgaXMgc3VwcG9ydGVkLCBhZGRpbmcgYW5kIHNldHRpbmcgaXNuJ3QgYW5kCisgICAgICogdGhyb3dzIHtAbGluayBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbn0gd2hlbiBpbnZva2VkLgorICAgICAqCisgICAgICogQHBhcmFtIG9yaWdpbmFsTWFwICAgICAgIHByb3ZpZGVkIG1hcC4KKyAgICAgKiBAcGFyYW0gdmFsdWVzVHJhbnNmb3JtZXIgdmFsdWVzIHRyYW5zZm9ybWVyLgorICAgICAqIEBwYXJhbSA8Sz4gICAgICAgICAgICAgICBrZXkgdHlwZS4KKyAgICAgKiBAcGFyYW0gPFY+ICAgICAgICAgICAgICAgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZS4KKyAgICAgKiBAcGFyYW0gPE8+ICAgICAgICAgICAgICAgb3JpZ2luYWwgdmFsdWUgdHlwZS4KKyAgICAgKiBAcmV0dXJuIHRyYW5zZm9ybWVkIG1hcCB2aWV3LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPEssIFYsIE8+IE1hcDxLLCBWPiBtYXBWaWV3KE1hcDxLLCBPPiBvcmlnaW5hbE1hcCwgRnVuY3Rpb248TywgVj4gdmFsdWVzVHJhbnNmb3JtZXIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBYnN0cmFjdE1hcDxLLCBWPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFNldDxFbnRyeTxLLCBWPj4gZW50cnlTZXQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBYnN0cmFjdFNldDxFbnRyeTxLLCBWPj4oKSB7CisKKworICAgICAgICAgICAgICAgICAgICBTZXQ8RW50cnk8SywgTz4+IG9yaWdpbmFsU2V0ID0gb3JpZ2luYWxNYXAuZW50cnlTZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8RW50cnk8SywgTz4+IG9yaWdpbmFsID0gb3JpZ2luYWxTZXQuaXRlcmF0b3IoKTsKKworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIEl0ZXJhdG9yPEVudHJ5PEssIFY+PiBpdGVyYXRvcigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSXRlcmF0b3I8RW50cnk8SywgVj4+KCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbC5oYXNOZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIEVudHJ5PEssIFY+IG5leHQoKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW50cnk8SywgTz4gbmV4dCA9IG9yaWdpbmFsLm5leHQoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVudHJ5PEssIFY+KCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgSyBnZXRLZXkoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5leHQuZ2V0S2V5KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFYgZ2V0VmFsdWUoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlc1RyYW5zZm9ybWVyLmFwcGx5KG5leHQuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFYgc2V0VmFsdWUoViB2YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsLnJlbW92ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsU2V0LnNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgdmlldyBvZiBhbiB1bmlvbiBvZiBwcm92aWRlZCBzZXRzLgorICAgICAqIDxwPgorICAgICAqIFZpZXcgaXMgdXBkYXRlZCB3aGVuZXZlciBhbnkgb2YgdGhlIHByb3ZpZGVkIHNldCBjaGFuZ2VzLgorICAgICAqCisgICAgICogQHBhcmFtIHNldDEgZmlyc3Qgc2V0LgorICAgICAqIEBwYXJhbSBzZXQyIHNlY29uZCBzZXQuCisgICAgICogQHBhcmFtIDxFPiAgc2V0IGl0ZW0gdHlwZS4KKyAgICAgKiBAcmV0dXJuIHVuaW9uIHZpZXcgb2YgZ2l2ZW4gc2V0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxFPiBTZXQ8RT4gc2V0VW5pb25WaWV3KGZpbmFsIFNldDw/IGV4dGVuZHMgRT4gc2V0MSwgZmluYWwgU2V0PD8gZXh0ZW5kcyBFPiBzZXQyKSB7CisgICAgICAgIGNoZWNrTm90TnVsbChzZXQxLCAic2V0MSIpOworICAgICAgICBjaGVja05vdE51bGwoc2V0MiwgInNldDIiKTsKKworICAgICAgICByZXR1cm4gbmV3IEFic3RyYWN0U2V0PEU+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgSXRlcmF0b3I8RT4gaXRlcmF0b3IoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFVuaW9uKHNldDEsIHNldDIpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGludCBzaXplKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBnZXRVbmlvbihzZXQxLCBzZXQyKS5zaXplKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgU2V0PEU+IGdldFVuaW9uKFNldDw/IGV4dGVuZHMgRT4gc2V0MSwgU2V0PD8gZXh0ZW5kcyBFPiBzZXQyKSB7CisgICAgICAgICAgICAgICAgSGFzaFNldDxFPiBoYXNoU2V0ID0gbmV3IEhhc2hTZXQ8PihzZXQxKTsKKyAgICAgICAgICAgICAgICBoYXNoU2V0LmFkZEFsbChzZXQyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaGFzaFNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSB2aWV3IG9mIGEgZGlmZmVyZW5jZSBvZiBwcm92aWRlZCBzZXRzLgorICAgICAqIDxwPgorICAgICAqIFZpZXcgaXMgdXBkYXRlZCB3aGVuZXZlciBhbnkgb2YgdGhlIHByb3ZpZGVkIHNldCBjaGFuZ2VzLgorICAgICAqCisgICAgICogQHBhcmFtIHNldDEgZmlyc3Qgc2V0LgorICAgICAqIEBwYXJhbSBzZXQyIHNlY29uZCBzZXQuCisgICAgICogQHBhcmFtIDxFPiAgc2V0IGl0ZW0gdHlwZS4KKyAgICAgKiBAcmV0dXJuIHVuaW9uIHZpZXcgb2YgZ2l2ZW4gc2V0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxFPiBTZXQ8RT4gc2V0RGlmZlZpZXcoZmluYWwgU2V0PD8gZXh0ZW5kcyBFPiBzZXQxLCBmaW5hbCBTZXQ8PyBleHRlbmRzIEU+IHNldDIpIHsKKyAgICAgICAgY2hlY2tOb3ROdWxsKHNldDEsICJzZXQxIik7CisgICAgICAgIGNoZWNrTm90TnVsbChzZXQyLCAic2V0MiIpOworCisgICAgICAgIHJldHVybiBuZXcgQWJzdHJhY3RTZXQ8RT4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RGlmZihzZXQxLCBzZXQyKS5pdGVyYXRvcigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RGlmZihzZXQxLCBzZXQyKS5zaXplKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgU2V0PEU+IGdldERpZmYoU2V0PD8gZXh0ZW5kcyBFPiBzZXQxLCBTZXQ8PyBleHRlbmRzIEU+IHNldDIpIHsKKyAgICAgICAgICAgICAgICBIYXNoU2V0PEU+IGhhc2hTZXQgPSBuZXcgSGFzaFNldDw+KCk7CisKKyAgICAgICAgICAgICAgICBoYXNoU2V0LmFkZEFsbChzZXQxKTsKKyAgICAgICAgICAgICAgICBoYXNoU2V0LmFkZEFsbChzZXQyKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBoYXNoU2V0LnN0cmVhbSgpLmZpbHRlcihuZXcgUHJlZGljYXRlPEU+KCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gdGVzdChFIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXQxLmNvbnRhaW5zKGUpICYmICFzZXQyLmNvbnRhaW5zKGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSkuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9jb2xsZWN0aW9uL3BhY2thZ2UtaW5mby5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL2NvbGxlY3Rpb24vcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMyMzAyNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9jb2xsZWN0aW9uL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKKy8qKgorICogQ29tbW9uIHNldCBvZiBKZXJzZXkgY29sbGVjdGlvbiBjbGFzc2VzLgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbjsKZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9wYWNrYWdlLWluZm8uamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTYzMjExCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKKy8qKgorICogQ29tbW9uIEplcnNleSBpbnRlcm5hbCBtaXNjZWxsYW5lb3VzIHV0aWxpdHkgY2xhc3Nlcy4KKyAqLworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsOwpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9sb2dnaW5nL0NsaWVudExvZ2dpbmdGaWx0ZXIuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbG9nZ2luZy9DbGllbnRMb2dnaW5nRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc2MzNkNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbG9nZ2luZy9DbGllbnRMb2dnaW5nRmlsdGVyLmphdmEKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3RyYWluZWRUbzsKK2ltcG9ydCBqYXZheC53cy5ycy5SdW50aW1lVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlc3BvbnNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVzcG9uc2VGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlByZU1hdGNoaW5nOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZS5WZXJib3NpdHk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5NZXNzYWdlVXRpbHM7CisKKy8qKgorICogQ2xpZW50IGZpbHRlciBsb2dzIHJlcXVlc3RzIGFuZCByZXNwb25zZXMgdG8gc3BlY2lmaWVkIGxvZ2dlciwgYXQgcmVxdWlyZWQgbGV2ZWwsIHdpdGggZW50aXR5IG9yIG5vdC4KKyAqIDxwPgorICogVGhlIGZpbHRlciBpcyByZWdpc3RlcmVkIGluIHtAbGluayBMb2dnaW5nRmVhdHVyZSNjb25maWd1cmUoRmVhdHVyZUNvbnRleHQpfSBhbmQgY2FuIGJlIHVzZWQgb24gY2xpZW50IHNpZGUgb25seS4gVGhlIHByaW9yaXR5CisgKiBpcyBzZXQgdG8gdGhlIG1pbmltdW0gdmFsdWUsIHdoaWNoIG1lYW5zIHRoYXQgZmlsdGVyIGlzIGNhbGxlZCBhcyB0aGUgbGFzdCBmaWx0ZXIgd2hlbiByZXF1ZXN0IGlzIHNlbnQgYW5kIHNpbWlsYXJseSBhcyB0aGUKKyAqIGZpcnN0IGZpbHRlciB3aGVuIHRoZSByZXNwb25zZSBpcyByZWNlaXZlZCwgc28gcmVxdWVzdCBhbmQgcmVzcG9uc2UgaXMgbG9nZ2VkIGFzIHNlbnQgb3IgYXMgcmVjZWl2ZWQuCisgKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICogQGF1dGhvciBPbmRyZWogS29zYXRrYSAob25kcmVqLmtvc2F0a2EgYXQgb3JhY2xlLmNvbSkKKyAqLworQENvbnN0cmFpbmVkVG8oUnVudGltZVR5cGUuQ0xJRU5UKQorQFByZU1hdGNoaW5nCitAUHJpb3JpdHkoSW50ZWdlci5NQVhfVkFMVUUpCitAU3VwcHJlc3NXYXJuaW5ncygiQ2xhc3NXaXRoTXVsdGlwbGVMb2dnZXJzIikKK2ZpbmFsIGNsYXNzIENsaWVudExvZ2dpbmdGaWx0ZXIgZXh0ZW5kcyBMb2dnaW5nSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBDbGllbnRSZXF1ZXN0RmlsdGVyLCBDbGllbnRSZXNwb25zZUZpbHRlciB7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBsb2dnaW5nIGZpbHRlciB3aXRoIGN1c3RvbSBsb2dnZXIgYW5kIGN1c3RvbSBzZXR0aW5ncyBvZiBlbnRpdHkKKyAgICAgKiBsb2dnaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGxvZ2dlciAgICAgICAgdGhlIGxvZ2dlciB0byBsb2cgbWVzc2FnZXMgdG8uCisgICAgICogQHBhcmFtIGxldmVsICAgICAgICAgbGV2ZWwgYXQgd2hpY2ggdGhlIG1lc3NhZ2VzIHdpbGwgYmUgbG9nZ2VkLgorICAgICAqIEBwYXJhbSB2ZXJib3NpdHkgICAgIHZlcmJvc2l0eSBvZiB0aGUgbG9nZ2VkIG1lc3NhZ2VzLiBTZWUge0BsaW5rIFZlcmJvc2l0eX0uCisgICAgICogQHBhcmFtIG1heEVudGl0eVNpemUgbWF4aW11bSBudW1iZXIgb2YgZW50aXR5IGJ5dGVzIHRvIGJlIGxvZ2dlZCAoYW5kIGJ1ZmZlcmVkKSAtIGlmIHRoZSBlbnRpdHkgaXMgbGFyZ2VyLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGxvZ2dpbmcgZmlsdGVyIHdpbGwgcHJpbnQgKGFuZCBidWZmZXIgaW4gbWVtb3J5KSBvbmx5IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgYW5kIHByaW50ICIuLi5tb3JlLi4uIiBzdHJpbmcgYXQgdGhlIGVuZC4gTmVnYXRpdmUgdmFsdWVzIGFyZSBpbnRlcnByZXRlZCBhcyB6ZXJvLgorICAgICAqLworICAgIHB1YmxpYyBDbGllbnRMb2dnaW5nRmlsdGVyKGZpbmFsIExvZ2dlciBsb2dnZXIsIGZpbmFsIExldmVsIGxldmVsLCBmaW5hbCBWZXJib3NpdHkgdmVyYm9zaXR5LCBmaW5hbCBpbnQgbWF4RW50aXR5U2l6ZSkgeworICAgICAgICBzdXBlcihsb2dnZXIsIGxldmVsLCB2ZXJib3NpdHksIG1heEVudGl0eVNpemUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZpbHRlcihmaW5hbCBDbGllbnRSZXF1ZXN0Q29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoIWxvZ2dlci5pc0xvZ2dhYmxlKGxldmVsKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZpbmFsIGxvbmcgaWQgPSBfaWQuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICAgIGNvbnRleHQuc2V0UHJvcGVydHkoTE9HR0lOR19JRF9QUk9QRVJUWSwgaWQpOworCisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKyAgICAgICAgcHJpbnRSZXF1ZXN0TGluZShiLCAiU2VuZGluZyBjbGllbnQgcmVxdWVzdCIsIGlkLCBjb250ZXh0LmdldE1ldGhvZCgpLCBjb250ZXh0LmdldFVyaSgpKTsKKyAgICAgICAgcHJpbnRQcmVmaXhlZEhlYWRlcnMoYiwgaWQsIFJFUVVFU1RfUFJFRklYLCBjb250ZXh0LmdldFN0cmluZ0hlYWRlcnMoKSk7CisKKyAgICAgICAgaWYgKGNvbnRleHQuaGFzRW50aXR5KCkgJiYgcHJpbnRFbnRpdHkodmVyYm9zaXR5LCBjb250ZXh0LmdldE1lZGlhVHlwZSgpKSkgeworICAgICAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBMb2dnaW5nU3RyZWFtKGIsIGNvbnRleHQuZ2V0RW50aXR5U3RyZWFtKCkpOworICAgICAgICAgICAgY29udGV4dC5zZXRFbnRpdHlTdHJlYW0oc3RyZWFtKTsKKyAgICAgICAgICAgIGNvbnRleHQuc2V0UHJvcGVydHkoRU5USVRZX0xPR0dFUl9QUk9QRVJUWSwgc3RyZWFtKTsKKyAgICAgICAgICAgIC8vIG5vdCBjYWxsaW5nIGxvZyhiKSBoZXJlIC0gaXQgd2lsbCBiZSBjYWxsZWQgYnkgdGhlIGludGVyY2VwdG9yCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsb2coYik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoZmluYWwgQ2xpZW50UmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsIGZpbmFsIENsaWVudFJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoIWxvZ2dlci5pc0xvZ2dhYmxlKGxldmVsKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZpbmFsIE9iamVjdCByZXF1ZXN0SWQgPSByZXF1ZXN0Q29udGV4dC5nZXRQcm9wZXJ0eShMT0dHSU5HX0lEX1BST1BFUlRZKTsKKyAgICAgICAgZmluYWwgbG9uZyBpZCA9IHJlcXVlc3RJZCAhPSBudWxsID8gKExvbmcpIHJlcXVlc3RJZCA6IF9pZC5pbmNyZW1lbnRBbmRHZXQoKTsKKworICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisgICAgICAgIHByaW50UmVzcG9uc2VMaW5lKGIsICJDbGllbnQgcmVzcG9uc2UgcmVjZWl2ZWQiLCBpZCwgcmVzcG9uc2VDb250ZXh0LmdldFN0YXR1cygpKTsKKyAgICAgICAgcHJpbnRQcmVmaXhlZEhlYWRlcnMoYiwgaWQsIFJFU1BPTlNFX1BSRUZJWCwgcmVzcG9uc2VDb250ZXh0LmdldEhlYWRlcnMoKSk7CisKKyAgICAgICAgaWYgKHJlc3BvbnNlQ29udGV4dC5oYXNFbnRpdHkoKSAmJiBwcmludEVudGl0eSh2ZXJib3NpdHksIHJlc3BvbnNlQ29udGV4dC5nZXRNZWRpYVR5cGUoKSkpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlQ29udGV4dC5zZXRFbnRpdHlTdHJlYW0obG9nSW5ib3VuZEVudGl0eShiLCByZXNwb25zZUNvbnRleHQuZ2V0RW50aXR5U3RyZWFtKCksCisgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VVdGlscy5nZXRDaGFyc2V0KHJlc3BvbnNlQ29udGV4dC5nZXRNZWRpYVR5cGUoKSkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGxvZyhiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xvZ2dpbmcvTG9nZ2luZ0ZlYXR1cmUuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbG9nZ2luZy9Mb2dnaW5nRmVhdHVyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMDc3NWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xvZ2dpbmcvTG9nZ2luZ0ZlYXR1cmUuamF2YQpAQCAtMCwwICsxLDMxNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5SdW50aW1lVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlQ29udGV4dDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LkNvbW1vblByb3BlcnRpZXM7CisKKy8qKgorICogVGhpcyBmZWF0dXJlIGVuYWJsZXMgbG9nZ2luZyByZXF1ZXN0IGFuZC9vciByZXNwb25zZSBvbiBjbGllbnQtc2lkZSBhbmQvb3Igc2VydmVyLXNpZGUgZGVwZW5kaW5nCisgKiBvbiB0aGUgY29udGV4dCdzIHtAbGluayBSdW50aW1lVHlwZX0uCisgKiA8cD4KKyAqIFRoZSBmZWF0dXJlIG1heSBiZSByZWdpc3RlciBwcm9ncmFtbWF0aWNhbGx5IGxpa2Ugb3RoZXIgZmVhdHVyZXMgYnkgY2FsbGluZyBhbnkgb2Yge0BsaW5rIGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhYmxlfQorICoge0Bjb2RlIHJlZ2lzdGVyKC4uLil9IG1ldGhvZCwgaS5lLiB7QGxpbmsgamF2YXgud3MucnMuY29yZS5Db25maWd1cmFibGUjcmVnaXN0ZXIoQ2xhc3MpfSBvciBieSBzZXR0aW5nIGFueSBvZiB0aGUKKyAqIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgbGlzdGVkIGJlbGxvdy4KKyAqIDxwPgorICogQ29tbW9uIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzIGFwcGxpZXMgZm9yIGJvdGggY2xpZW50IGFuZCBzZXJ2ZXIgYW5kIGFyZSBmb2xsb3dpbmc6CisgKiA8dWw+CisgKiA8bGk+e0BsaW5rICNMT0dHSU5HX0ZFQVRVUkVfTE9HR0VSX05BTUV9PC9saT4KKyAqIDxsaT57QGxpbmsgI0xPR0dJTkdfRkVBVFVSRV9MT0dHRVJfTEVWRUx9PC9saT4KKyAqIDxsaT57QGxpbmsgI0xPR0dJTkdfRkVBVFVSRV9WRVJCT1NJVFl9PC9saT4KKyAqIDxsaT57QGxpbmsgI0xPR0dJTkdfRkVBVFVSRV9NQVhfRU5USVRZX1NJWkV9PC9saT4KKyAqIDwvdWw+CisgKiA8cD4KKyAqIElmIGFueSBvZiB0aGUgY29uZmlndXJhdGlvbiB2YWx1ZSBpcyBub3Qgc2V0LCBmb2xsb3dpbmcgZGVmYXVsdCB2YWx1ZXMgYXJlIGFwcGxpZWQ6CisgKiA8dWw+CisgKiA8bGk+bG9nZ2VyIG5hbWU6IHtAY29kZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlfTwvbGk+CisgKiA8bGk+bG9nZ2VyIGxldmVsOiB7QGxpbmsgTGV2ZWwjRklORX08L2xpPgorICogPGxpPnZlcmJvc2l0eToge0BsaW5rIFZlcmJvc2l0eSNQQVlMT0FEX1RFWFR9PC9saT4KKyAqIDxsaT5tYXhpbXVtIGVudGl0eSBzaXplOiB7QHZhbHVlICNERUZBVUxUX01BWF9FTlRJVFlfU0laRX08L2xpPgorICogPC91bD4KKyAqIDxwPgorICogU2VydmVyIGNvbmZpZ3VyYWJsZSBwcm9wZXJ0aWVzOgorICogPHVsPgorICogPGxpPntAbGluayAjTE9HR0lOR19GRUFUVVJFX0xPR0dFUl9OQU1FX1NFUlZFUn08L2xpPgorICogPGxpPntAbGluayAjTE9HR0lOR19GRUFUVVJFX0xPR0dFUl9MRVZFTF9TRVJWRVJ9PC9saT4KKyAqIDxsaT57QGxpbmsgI0xPR0dJTkdfRkVBVFVSRV9WRVJCT1NJVFlfU0VSVkVSfTwvbGk+CisgKiA8bGk+e0BsaW5rICNMT0dHSU5HX0ZFQVRVUkVfTUFYX0VOVElUWV9TSVpFX1NFUlZFUn08L2xpPgorICogPC91bD4KKyAqIENsaWVudCBjb25maWd1cmFibGUgcHJvcGVydGllczoKKyAqIDx1bD4KKyAqIDxsaT57QGxpbmsgI0xPR0dJTkdfRkVBVFVSRV9MT0dHRVJfTkFNRV9DTElFTlR9PC9saT4KKyAqIDxsaT57QGxpbmsgI0xPR0dJTkdfRkVBVFVSRV9MT0dHRVJfTEVWRUxfQ0xJRU5UfTwvbGk+CisgKiA8bGk+e0BsaW5rICNMT0dHSU5HX0ZFQVRVUkVfVkVSQk9TSVRZX0NMSUVOVH08L2xpPgorICogPGxpPntAbGluayAjTE9HR0lOR19GRUFUVVJFX01BWF9FTlRJVFlfU0laRV9DTElFTlR9PC9saT4KKyAqIDwvdWw+CisgKgorICogQGF1dGhvciBPbmRyZWogS29zYXRrYSAob25kcmVqLmtvc2F0a2EgYXQgb3JhY2xlLmNvbSkKKyAqIEBzaW5jZSAyLjIzCisgKi8KK3B1YmxpYyBjbGFzcyBMb2dnaW5nRmVhdHVyZSBpbXBsZW1lbnRzIEZlYXR1cmUgeworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBsb2dnZXIgbmFtZSB0byBsb2cgcmVxdWVzdCBhbmQgcmVzcG9uc2UgbWVzc2FnZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9MT0dHRVJfTkFNRSA9IExvZ2dpbmdGZWF0dXJlLmNsYXNzLmdldE5hbWUoKTsKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGxvZ2dlciBsZXZlbCB3aGljaCB3aWxsIGJlIHVzZWQgZm9yIGxvZ2dpbmcgcmVxdWVzdCBhbmQgcmVzcG9uc2UgbWVzc2FnZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9MT0dHRVJfTEVWRUwgPSBMZXZlbC5GSU5FLmdldE5hbWUoKTsKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IG1heGltdW0gZW50aXR5IGJ5dGVzIHRvIGJlIGxvZ2dlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX01BWF9FTlRJVFlfU0laRSA9IDggKiAxMDI0OworICAgIC8qKgorICAgICAqIERlZmF1bHQgdmVyYm9zaXR5IGZvciBlbnRpdHkgbG9nZ2luZy4gU2VlIHtAbGluayBWZXJib3NpdHl9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVmVyYm9zaXR5IERFRkFVTFRfVkVSQk9TSVRZID0gVmVyYm9zaXR5LlBBWUxPQURfVEVYVDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dHRVJfTkFNRV9QT1NURklYID0gIi5sb2dnZXIubmFtZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR0dFUl9MRVZFTF9QT1NURklYID0gIi5sb2dnZXIubGV2ZWwiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJCT1NJVFlfUE9TVEZJWCA9ICIudmVyYm9zaXR5IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFYX0VOVElUWV9QT1NURklYID0gIi5lbnRpdHkubWF4U2l6ZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIExPR0dJTkdfRkVBVFVSRV9DT01NT05fUFJFRklYID0gImplcnNleS5jb25maWcubG9nZ2luZyI7CisgICAgLyoqCisgICAgICogQ29tbW9uIGxvZ2dlciBuYW1lIHByb3BlcnR5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPR0dJTkdfRkVBVFVSRV9MT0dHRVJfTkFNRSA9IExPR0dJTkdfRkVBVFVSRV9DT01NT05fUFJFRklYICsgTE9HR0VSX05BTUVfUE9TVEZJWDsKKyAgICAvKioKKyAgICAgKiBDb21tb24gbG9nZ2VyIGxldmVsIHByb3BlcnR5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPR0dJTkdfRkVBVFVSRV9MT0dHRVJfTEVWRUwgPSBMT0dHSU5HX0ZFQVRVUkVfQ09NTU9OX1BSRUZJWCArIExPR0dFUl9MRVZFTF9QT1NURklYOworICAgIC8qKgorICAgICAqIENvbW1vbiBwcm9wZXJ0eSBmb3IgY29uZmlndXJpbmcgYSB2ZXJib3NpdHkgb2YgZW50aXR5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPR0dJTkdfRkVBVFVSRV9WRVJCT1NJVFkgPSBMT0dHSU5HX0ZFQVRVUkVfQ09NTU9OX1BSRUZJWCArIFZFUkJPU0lUWV9QT1NURklYOworICAgIC8qKgorICAgICAqIENvbW1vbiBwcm9wZXJ0eSBmb3IgY29uZmlndXJpbmcgYSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyBvZiBlbnRpdHkgdG8gYmUgbG9nZ2VkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPR0dJTkdfRkVBVFVSRV9NQVhfRU5USVRZX1NJWkUgPSBMT0dHSU5HX0ZFQVRVUkVfQ09NTU9OX1BSRUZJWCArIE1BWF9FTlRJVFlfUE9TVEZJWDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dHSU5HX0ZFQVRVUkVfU0VSVkVSX1BSRUZJWCA9ICJqZXJzZXkuY29uZmlnLnNlcnZlci5sb2dnaW5nIjsKKyAgICAvKioKKyAgICAgKiBTZXJ2ZXIgbG9nZ2VyIG5hbWUgcHJvcGVydHkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HR0lOR19GRUFUVVJFX0xPR0dFUl9OQU1FX1NFUlZFUiA9IExPR0dJTkdfRkVBVFVSRV9TRVJWRVJfUFJFRklYICsgTE9HR0VSX05BTUVfUE9TVEZJWDsKKyAgICAvKioKKyAgICAgKiBTZXJ2ZXIgbG9nZ2VyIGxldmVsIHByb3BlcnR5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPR0dJTkdfRkVBVFVSRV9MT0dHRVJfTEVWRUxfU0VSVkVSID0gTE9HR0lOR19GRUFUVVJFX1NFUlZFUl9QUkVGSVggKyBMT0dHRVJfTEVWRUxfUE9TVEZJWDsKKyAgICAvKioKKyAgICAgKiBTZXJ2ZXIgcHJvcGVydHkgZm9yIGNvbmZpZ3VyaW5nIGEgdmVyYm9zaXR5IG9mIGVudGl0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dHSU5HX0ZFQVRVUkVfVkVSQk9TSVRZX1NFUlZFUiA9IExPR0dJTkdfRkVBVFVSRV9TRVJWRVJfUFJFRklYICsgVkVSQk9TSVRZX1BPU1RGSVg7CisgICAgLyoqCisgICAgICogU2VydmVyIHByb3BlcnR5IGZvciBjb25maWd1cmluZyBhIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIG9mIGVudGl0eSB0byBiZSBsb2dnZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HR0lOR19GRUFUVVJFX01BWF9FTlRJVFlfU0laRV9TRVJWRVIgPSBMT0dHSU5HX0ZFQVRVUkVfU0VSVkVSX1BSRUZJWCArIE1BWF9FTlRJVFlfUE9TVEZJWDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dHSU5HX0ZFQVRVUkVfQ0xJRU5UX1BSRUZJWCA9ICJqZXJzZXkuY29uZmlnLmNsaWVudC5sb2dnaW5nIjsKKyAgICAvKioKKyAgICAgKiBDbGllbnQgbG9nZ2VyIG5hbWUgcHJvcGVydHkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HR0lOR19GRUFUVVJFX0xPR0dFUl9OQU1FX0NMSUVOVCA9IExPR0dJTkdfRkVBVFVSRV9DTElFTlRfUFJFRklYICsgTE9HR0VSX05BTUVfUE9TVEZJWDsKKyAgICAvKioKKyAgICAgKiBDbGllbnQgbG9nZ2VyIGxldmVsIHByb3BlcnR5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPR0dJTkdfRkVBVFVSRV9MT0dHRVJfTEVWRUxfQ0xJRU5UID0gTE9HR0lOR19GRUFUVVJFX0NMSUVOVF9QUkVGSVggKyBMT0dHRVJfTEVWRUxfUE9TVEZJWDsKKyAgICAvKioKKyAgICAgKiBDbGllbnQgcHJvcGVydHkgZm9yIGNvbmZpZ3VyaW5nIGEgdmVyYm9zaXR5IG9mIGVudGl0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dHSU5HX0ZFQVRVUkVfVkVSQk9TSVRZX0NMSUVOVCA9IExPR0dJTkdfRkVBVFVSRV9DTElFTlRfUFJFRklYICsgVkVSQk9TSVRZX1BPU1RGSVg7CisgICAgLyoqCisgICAgICogQ2xpZW50IHByb3BlcnR5IGZvciBjb25maWd1cmluZyBhIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIG9mIGVudGl0eSB0byBiZSBsb2dnZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HR0lOR19GRUFUVVJFX01BWF9FTlRJVFlfU0laRV9DTElFTlQgPSBMT0dHSU5HX0ZFQVRVUkVfQ0xJRU5UX1BSRUZJWCArIE1BWF9FTlRJVFlfUE9TVEZJWDsKKworICAgIHByaXZhdGUgZmluYWwgTG9nZ2VyIGZpbHRlckxvZ2dlcjsKKyAgICBwcml2YXRlIGZpbmFsIFZlcmJvc2l0eSB2ZXJib3NpdHk7CisgICAgcHJpdmF0ZSBmaW5hbCBJbnRlZ2VyIG1heEVudGl0eVNpemU7CisgICAgcHJpdmF0ZSBmaW5hbCBMZXZlbCBsZXZlbDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgdGhlIGZlYXR1cmUgd2l0aCBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTG9nZ2luZ0ZlYXR1cmUoKSB7CisgICAgICAgIHRoaXMobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyB0aGUgZmVhdHVyZSB3aXRoIGN1c3RvbSBsb2dnZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9nZ2VyIHRoZSBsb2dnZXIgdG8gbG9nIHJlcXVlc3RzIGFuZCByZXNwb25zZXMuCisgICAgICovCisgICAgcHVibGljIExvZ2dpbmdGZWF0dXJlKExvZ2dlciBsb2dnZXIpIHsKKyAgICAgICAgdGhpcyhsb2dnZXIsIG51bGwsIG51bGwsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgdGhlIGZlYXR1cmUgd2l0aCBjdXN0b20gbG9nZ2VyIGFuZCB2ZXJib3NpdHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9nZ2VyICAgIHRoZSBsb2dnZXIgdG8gbG9nIHJlcXVlc3RzIGFuZCByZXNwb25zZXMuCisgICAgICogQHBhcmFtIHZlcmJvc2l0eSB2ZXJib3NpdHkgb2YgbG9nZ2VkIG1lc3NhZ2VzLiBTZWUge0BsaW5rIFZlcmJvc2l0eX0uCisgICAgICovCisgICAgcHVibGljIExvZ2dpbmdGZWF0dXJlKExvZ2dlciBsb2dnZXIsIFZlcmJvc2l0eSB2ZXJib3NpdHkpIHsKKyAgICAgICAgdGhpcyhsb2dnZXIsIG51bGwsIHZlcmJvc2l0eSwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyB0aGUgZmVhdHVyZSB3aXRoIGN1c3RvbSBsb2dnZXIgYW5kIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIG9mIGVudGl0eSB0byBsb2cuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9nZ2VyICAgICAgICB0aGUgbG9nZ2VyIHRvIGxvZyByZXF1ZXN0cyBhbmQgcmVzcG9uc2VzLgorICAgICAqIEBwYXJhbSBtYXhFbnRpdHlTaXplIG1heGltdW0gbnVtYmVyIG9mIGVudGl0eSBieXRlcyB0byBiZSBsb2dnZWQgKGFuZCBidWZmZXJlZCkgLSBpZiB0aGUgZW50aXR5IGlzIGxhcmdlciwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBsb2dnaW5nIGZpbHRlciB3aWxsIHByaW50IChhbmQgYnVmZmVyIGluIG1lbW9yeSkgb25seSB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcworICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFuZCBwcmludCAiLi4ubW9yZS4uLiIgc3RyaW5nIGF0IHRoZSBlbmQuIE5lZ2F0aXZlIHZhbHVlcyBhcmUgaW50ZXJwcmV0ZWQgYXMgemVyby4KKyAgICAgKi8KKyAgICBwdWJsaWMgTG9nZ2luZ0ZlYXR1cmUoTG9nZ2VyIGxvZ2dlciwgSW50ZWdlciBtYXhFbnRpdHlTaXplKSB7CisgICAgICAgIHRoaXMobG9nZ2VyLCBudWxsLCBERUZBVUxUX1ZFUkJPU0lUWSwgbWF4RW50aXR5U2l6ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyB0aGUgZmVhdHVyZSB3aXRoIGN1c3RvbSBsb2dnZXIsIGl0J3MgbGV2ZWwsIG1lc3NhZ2UgdmVyYm9zaXR5IGFuZCBtYXhpbXVtIG51bWJlciBvZiBieXRlcyBvZiBlbnRpdHkgdG8gbG9nLgorICAgICAqCisgICAgICogQHBhcmFtIGxvZ2dlciAgICAgICAgdGhlIGxvZ2dlciB0byBsb2cgcmVxdWVzdHMgYW5kIHJlc3BvbnNlcy4KKyAgICAgKiBAcGFyYW0gbGV2ZWwgICAgICAgICBsZXZlbCBvbiB3aGljaCB0aGUgbWVzc2FnZXMgd2lsbCBiZSBsb2dnZWQuCisgICAgICogQHBhcmFtIHZlcmJvc2l0eSAgICAgdmVyYm9zaXR5IG9mIGxvZ2dlZCBtZXNzYWdlcy4gU2VlIHtAbGluayBWZXJib3NpdHl9LgorICAgICAqIEBwYXJhbSBtYXhFbnRpdHlTaXplIG1heGltdW0gbnVtYmVyIG9mIGVudGl0eSBieXRlcyB0byBiZSBsb2dnZWQgKGFuZCBidWZmZXJlZCkgLSBpZiB0aGUgZW50aXR5IGlzIGxhcmdlciwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBsb2dnaW5nIGZpbHRlciB3aWxsIHByaW50IChhbmQgYnVmZmVyIGluIG1lbW9yeSkgb25seSB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcworICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFuZCBwcmludCAiLi4ubW9yZS4uLiIgc3RyaW5nIGF0IHRoZSBlbmQuIE5lZ2F0aXZlIHZhbHVlcyBhcmUgaW50ZXJwcmV0ZWQgYXMgemVyby4KKyAgICAgKi8KKyAgICBwdWJsaWMgTG9nZ2luZ0ZlYXR1cmUoTG9nZ2VyIGxvZ2dlciwgTGV2ZWwgbGV2ZWwsIFZlcmJvc2l0eSB2ZXJib3NpdHksIEludGVnZXIgbWF4RW50aXR5U2l6ZSkgeworICAgICAgICB0aGlzLmZpbHRlckxvZ2dlciA9IGxvZ2dlcjsKKyAgICAgICAgdGhpcy5sZXZlbCA9IGxldmVsOworICAgICAgICB0aGlzLnZlcmJvc2l0eSA9IHZlcmJvc2l0eTsKKyAgICAgICAgdGhpcy5tYXhFbnRpdHlTaXplID0gbWF4RW50aXR5U2l6ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmUoRmVhdHVyZUNvbnRleHQgY29udGV4dCkgeworICAgICAgICBib29sZWFuIGVuYWJsZWQgPSBmYWxzZTsKKworICAgICAgICBpZiAoY29udGV4dC5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UnVudGltZVR5cGUoKSA9PSBSdW50aW1lVHlwZS5DTElFTlQpIHsKKyAgICAgICAgICAgIENsaWVudExvZ2dpbmdGaWx0ZXIgY2xpZW50TG9nZ2luZ0ZpbHRlciA9IChDbGllbnRMb2dnaW5nRmlsdGVyKSBjcmVhdGVMb2dnaW5nRmlsdGVyKGNvbnRleHQsIFJ1bnRpbWVUeXBlLkNMSUVOVCk7CisgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKGNsaWVudExvZ2dpbmdGaWx0ZXIpOworICAgICAgICAgICAgZW5hYmxlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbnRleHQuZ2V0Q29uZmlndXJhdGlvbigpLmdldFJ1bnRpbWVUeXBlKCkgPT0gUnVudGltZVR5cGUuU0VSVkVSKSB7CisgICAgICAgICAgICBTZXJ2ZXJMb2dnaW5nRmlsdGVyIHNlcnZlckNsaWVudEZpbHRlciA9IChTZXJ2ZXJMb2dnaW5nRmlsdGVyKSBjcmVhdGVMb2dnaW5nRmlsdGVyKGNvbnRleHQsIFJ1bnRpbWVUeXBlLlNFUlZFUik7CisgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKHNlcnZlckNsaWVudEZpbHRlcik7CisgICAgICAgICAgICBlbmFibGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZW5hYmxlZDsKKyAgICB9CisKKyAgICBwcml2YXRlIExvZ2dpbmdJbnRlcmNlcHRvciBjcmVhdGVMb2dnaW5nRmlsdGVyKEZlYXR1cmVDb250ZXh0IGNvbnRleHQsIFJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlKSB7CisgICAgICAgIE1hcCBwcm9wZXJ0aWVzID0gY29udGV4dC5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UHJvcGVydGllcygpOworICAgICAgICBTdHJpbmcgZmlsdGVyTG9nZ2VyTmFtZSA9IENvbW1vblByb3BlcnRpZXMuZ2V0VmFsdWUoCisgICAgICAgICAgICAgICAgcHJvcGVydGllcywKKyAgICAgICAgICAgICAgICBydW50aW1lVHlwZSA9PSBSdW50aW1lVHlwZS5TRVJWRVIgPyBMT0dHSU5HX0ZFQVRVUkVfTE9HR0VSX05BTUVfU0VSVkVSIDogTE9HR0lOR19GRUFUVVJFX0xPR0dFUl9OQU1FX0NMSUVOVCwKKyAgICAgICAgICAgICAgICBDb21tb25Qcm9wZXJ0aWVzLmdldFZhbHVlKAorICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0dJTkdfRkVBVFVSRV9MT0dHRVJfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfTE9HR0VSX05BTUUKKyAgICAgICAgICAgICAgICApKTsKKyAgICAgICAgU3RyaW5nIGZpbHRlckxldmVsID0gQ29tbW9uUHJvcGVydGllcy5nZXRWYWx1ZSgKKyAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLAorICAgICAgICAgICAgICAgIHJ1bnRpbWVUeXBlID09IFJ1bnRpbWVUeXBlLlNFUlZFUiA/IExPR0dJTkdfRkVBVFVSRV9MT0dHRVJfTEVWRUxfU0VSVkVSIDogTE9HR0lOR19GRUFUVVJFX0xPR0dFUl9MRVZFTF9DTElFTlQsCisgICAgICAgICAgICAgICAgQ29tbW9uUHJvcGVydGllcy5nZXRWYWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnRpZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0dJTkdfRkVBVFVSRV9MT0dHRVJfTEVWRUwsCisgICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX0xPR0dFUl9MRVZFTCkpOworICAgICAgICBWZXJib3NpdHkgZmlsdGVyVmVyYm9zaXR5ID0gQ29tbW9uUHJvcGVydGllcy5nZXRWYWx1ZSgKKyAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLAorICAgICAgICAgICAgICAgIHJ1bnRpbWVUeXBlID09IFJ1bnRpbWVUeXBlLlNFUlZFUiA/IExPR0dJTkdfRkVBVFVSRV9WRVJCT1NJVFlfU0VSVkVSIDogTE9HR0lOR19GRUFUVVJFX1ZFUkJPU0lUWV9DTElFTlQsCisgICAgICAgICAgICAgICAgQ29tbW9uUHJvcGVydGllcy5nZXRWYWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBMT0dHSU5HX0ZFQVRVUkVfVkVSQk9TSVRZLAorICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9WRVJCT1NJVFkKKyAgICAgICAgICAgICAgICApKTsKKyAgICAgICAgaW50IGZpbHRlck1heEVudGl0eVNpemUgPSBDb21tb25Qcm9wZXJ0aWVzLmdldFZhbHVlKAorICAgICAgICAgICAgICAgIHByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgcnVudGltZVR5cGUgPT0gUnVudGltZVR5cGUuU0VSVkVSID8gTE9HR0lOR19GRUFUVVJFX01BWF9FTlRJVFlfU0laRV9TRVJWRVIKKyAgICAgICAgICAgICAgICAgICAgICAgIDogTE9HR0lOR19GRUFUVVJFX01BWF9FTlRJVFlfU0laRV9DTElFTlQsCisgICAgICAgICAgICAgICAgQ29tbW9uUHJvcGVydGllcy5nZXRWYWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBMT0dHSU5HX0ZFQVRVUkVfTUFYX0VOVElUWV9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9NQVhfRU5USVRZX1NJWkUKKyAgICAgICAgICAgICAgICApKTsKKworICAgICAgICBMZXZlbCBsb2dnZXJMZXZlbCA9IExldmVsLnBhcnNlKGZpbHRlckxldmVsKTsKKworICAgICAgICBpZiAocnVudGltZVR5cGUgPT0gUnVudGltZVR5cGUuU0VSVkVSKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFNlcnZlckxvZ2dpbmdGaWx0ZXIoZmlsdGVyTG9nZ2VyICE9IG51bGwgPyBmaWx0ZXJMb2dnZXIgOiBMb2dnZXIuZ2V0TG9nZ2VyKGZpbHRlckxvZ2dlck5hbWUpLAorICAgICAgICAgICAgICAgICAgICBsZXZlbCAhPSBudWxsID8gbGV2ZWwgOiBsb2dnZXJMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgdmVyYm9zaXR5ICE9IG51bGwgPyB2ZXJib3NpdHkgOiBmaWx0ZXJWZXJib3NpdHksCisgICAgICAgICAgICAgICAgICAgIG1heEVudGl0eVNpemUgIT0gbnVsbCA/IG1heEVudGl0eVNpemUgOiBmaWx0ZXJNYXhFbnRpdHlTaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ2xpZW50TG9nZ2luZ0ZpbHRlcihmaWx0ZXJMb2dnZXIgIT0gbnVsbCA/IGZpbHRlckxvZ2dlciA6IExvZ2dlci5nZXRMb2dnZXIoZmlsdGVyTG9nZ2VyTmFtZSksCisgICAgICAgICAgICAgICAgICAgIGxldmVsICE9IG51bGwgPyBsZXZlbCA6IGxvZ2dlckxldmVsLAorICAgICAgICAgICAgICAgICAgICB2ZXJib3NpdHkgIT0gbnVsbCA/IHZlcmJvc2l0eSA6IGZpbHRlclZlcmJvc2l0eSwKKyAgICAgICAgICAgICAgICAgICAgbWF4RW50aXR5U2l6ZSAhPSBudWxsID8gbWF4RW50aXR5U2l6ZSA6IGZpbHRlck1heEVudGl0eVNpemUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bjb2RlIFZlcmJvc2l0eX0gZGV0ZXJtaW5lcyBob3cgZGV0YWlsZWQgbWVzc2FnZSB3aWxsIGJlIGxvZ2dlZC4KKyAgICAgKiA8cD4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPlRoZSBsb3dlc3QgdmVyYm9zaXR5ICh7QGxpbmsgI0hFQURFUlNfT05MWX0pIHdpbGwgbG9nIG9ubHkgcmVxdWVzdC9yZXNwb25zZSBoZWFkZXJzLjwvbGk+CisgICAgICogPGxpPgorICAgICAqIFRoZSBtZWRpdW0gdmVyYm9zaXR5IHdpbGwgbG9nIHJlcXVlc3QvcmVzcG9uc2UgaGVhZGVycywgYXMgd2VsbCBhcyBhbiBlbnRpdHkgaWYgY29uc2lkZXJlZCBhIHJlYWRhYmxlIHRleHQuIFNlZSB7QGxpbmsKKyAgICAgKiAjUEFZTE9BRF9URVhUfS4KKyAgICAgKiA8L2xpPgorICAgICAqIDxsaT5UaGUgaGlnaGVzdCB2ZXJib3NpdHkgd2lsbCBsb2cgYWxsIHR5cGVzIG9mIGFuIGVudGl0eSAoYmVzaWRlcyB0aGUgcmVxdWVzdC9yZXNwb25zZSBoZWFkZXJzLjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlIHRoYXQgdGhlIGVudGl0eSBpcyBsb2dnZWQgdXAgdG8gdGhlIG1heGltdW0gbnVtYmVyIHNwZWNpZmllZCBpbiBhbnkgb2YgdGhlIGZvbGxvd2luZyBjb25zdHJ1Y3RvcnMge0BsaW5rCisgICAgICogTG9nZ2luZ0ZlYXR1cmUjTG9nZ2luZ0ZlYXR1cmUoTG9nZ2VyLCBJbnRlZ2VyKX0sIHtAbGluayBMb2dnaW5nRmVhdHVyZSNMb2dnaW5nRmVhdHVyZShMb2dnZXIsIExldmVsLCBWZXJib3NpdHksIEludGVnZXIpfQorICAgICAqIG9yIGJ5IHNvbWUgb2YgdGhlIGZlYXR1cmUncyBwcm9wZXJ0aWVzIChzZWUge0BsaW5rICNMT0dHSU5HX0ZFQVRVUkVfTUFYX0VOVElUWV9TSVpFfSwge0BsaW5rCisgICAgICogI0xPR0dJTkdfRkVBVFVSRV9NQVhfRU5USVRZX1NJWkVfQ0xJRU5UfSwge0BsaW5rICNMT0dHSU5HX0ZFQVRVUkVfTUFYX0VOVElUWV9TSVpFX1NFUlZFUn0uCisgICAgICovCisgICAgcHVibGljIGVudW0gVmVyYm9zaXR5IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIE9ubHkgY29udGVudCBvZiBIVFRQIGhlYWRlcnMgaXMgbG9nZ2VkLiBObyBtZXNzYWdlIHBheWxvYWQgZGF0YSBhcmUgbG9nZ2VkLgorICAgICAgICAgKi8KKyAgICAgICAgSEVBREVSU19PTkxZLAorICAgICAgICAvKioKKyAgICAgICAgICogQ29udGVudCBvZiBIVFRQIGhlYWRlcnMgYXMgd2VsbCBhcyBlbnRpdHkgY29udGVudCBvZiB0ZXh0dWFsIG1lZGlhIHR5cGVzIGlzIGxvZ2dlZC4gRm9sbG93aW5nIGlzIHRoZSBsaXN0IG9mIG1lZGlhCisgICAgICAgICAqIHR5cGVzIHRoYXQgYXJlIGNvbnNpZGVyZWQgdGV4dHVhbCBmb3IgdGhlIGxvZ2dpbmcgcHVycG9zZXM6CisgICAgICAgICAqIDx1bD4KKyAgICAgICAgICogPGxpPntAY29kZSB0ZXh0Lyp9PC9saT4KKyAgICAgICAgICogPGxpPntAY29kZSBhcHBsaWNhdGlvbi9hdG9tK3htbH08L2xpPgorICAgICAgICAgKiA8bGk+e0Bjb2RlIGFwcGxpY2F0aW9uL2pzb259PC9saT4KKyAgICAgICAgICogPGxpPntAY29kZSBhcHBsaWNhdGlvbi9zdmcreG1sfTwvbGk+CisgICAgICAgICAqIDxsaT57QGNvZGUgYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkfTwvbGk+CisgICAgICAgICAqIDxsaT57QGNvZGUgYXBwbGljYXRpb24veGh0bWwreG1sfTwvbGk+CisgICAgICAgICAqIDxsaT57QGNvZGUgYXBwbGljYXRpb24veG1sfTwvbGk+CisgICAgICAgICAqIDwvdWw+CisgICAgICAgICAqLworICAgICAgICBQQVlMT0FEX1RFWFQsCisgICAgICAgIC8qKgorICAgICAgICAgKiBGdWxsIHZlcmJvc2UgbG9nZ2luZy4gQ29udGVudCBvZiBIVFRQIGhlYWRlcnMgYXMgd2VsbCBhcyBhbnkgbWVzc2FnZSBwYXlsb2FkIGNvbnRlbnQgd2lsbCBiZSBsb2dnZWQuCisgICAgICAgICAqLworICAgICAgICBQQVlMT0FEX0FOWQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbG9nZ2luZy9Mb2dnaW5nRmVhdHVyZUF1dG9EaXNjb3ZlcmFibGUuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbG9nZ2luZy9Mb2dnaW5nRmVhdHVyZUF1dG9EaXNjb3ZlcmFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTFhODkxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9sb2dnaW5nL0xvZ2dpbmdGZWF0dXJlQXV0b0Rpc2NvdmVyYWJsZS5qYXZhCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZzsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC53cy5ycy5SdW50aW1lVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmVDb250ZXh0OworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qcmlvcml0eTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnNwaS5BdXRvRGlzY292ZXJhYmxlOworCitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmUuTE9HR0lOR19GRUFUVVJFX0xPR0dFUl9MRVZFTDsKK2ltcG9ydCBzdGF0aWMgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZS5MT0dHSU5HX0ZFQVRVUkVfTE9HR0VSX0xFVkVMX0NMSUVOVDsKK2ltcG9ydCBzdGF0aWMgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZS5MT0dHSU5HX0ZFQVRVUkVfTE9HR0VSX0xFVkVMX1NFUlZFUjsKK2ltcG9ydCBzdGF0aWMgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZS5MT0dHSU5HX0ZFQVRVUkVfTE9HR0VSX05BTUU7CitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmUuTE9HR0lOR19GRUFUVVJFX0xPR0dFUl9OQU1FX0NMSUVOVDsKK2ltcG9ydCBzdGF0aWMgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZS5MT0dHSU5HX0ZFQVRVUkVfTE9HR0VSX05BTUVfU0VSVkVSOworaW1wb3J0IHN0YXRpYyBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlLkxPR0dJTkdfRkVBVFVSRV9NQVhfRU5USVRZX1NJWkU7CitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmUuTE9HR0lOR19GRUFUVVJFX01BWF9FTlRJVFlfU0laRV9DTElFTlQ7CitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmUuTE9HR0lOR19GRUFUVVJFX01BWF9FTlRJVFlfU0laRV9TRVJWRVI7CitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmUuTE9HR0lOR19GRUFUVVJFX1ZFUkJPU0lUWTsKK2ltcG9ydCBzdGF0aWMgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZS5MT0dHSU5HX0ZFQVRVUkVfVkVSQk9TSVRZX0NMSUVOVDsKK2ltcG9ydCBzdGF0aWMgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZS5MT0dHSU5HX0ZFQVRVUkVfVkVSQk9TSVRZX1NFUlZFUjsKKworLyoqCisgKiBBdXRvLWRpc2NvdmVyYWJsZSBjbGFzcyB0aGF0IHJlZ2lzdGVycyB7QGxpbmsgTG9nZ2luZ0ZlYXR1cmV9IGJhc2VkIG9uIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcy4KKyAqIDxwPgorICogRmVhdHVyZSBpcyByZWdpc3RlcmVkIGlmIGFueSBvZiB0aGUgY29tbW9uIHByb3BlcnRpZXMgKHNlZSB7QGxpbmsgTG9nZ2luZ0ZlYXR1cmV9KSBpcyBzZXQgb3IgYW55IG9mIHRoZSBjbGllbnQgcHJvcGVydGllcyBpcworICogc2V0IGFuZCBjb250ZXh0J3Mge0BsaW5rIFJ1bnRpbWVUeXBlfSBpcyB7QGxpbmsgUnVudGltZVR5cGUjQ0xJRU5UfSBvciBhbnkgb2YgdGhlIHNlcnZlciBwcm9wZXJ0aWVzIGlzIHNldCBhbmQgY29udGV4dCdzCisgKiB7QGxpbmsgUnVudGltZVR5cGV9IGlzIHtAbGluayBSdW50aW1lVHlwZSNTRVJWRVJ9LgorICogPHA+CisgKiBUaGUgcmVnaXN0cmF0aW9uIGRvZXMgbm90IG9jY3VyIGlmIHRoZSBmZWF0dXJlIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCBvciBhdXRvLWRpc2NvdmVyYWJsZSBtZWNoYW5pc20gaXMgZGlzYWJsZWQuCisgKgorICogQGF1dGhvciBPbmRyZWogS29zYXRrYSAob25kcmVqLmtvc2F0a2EgYXQgb3JhY2xlLmNvbSkKKyAqIEBzaW5jZSAyLjIzCisgKi8KK0BQcmlvcml0eShBdXRvRGlzY292ZXJhYmxlLkRFRkFVTFRfUFJJT1JJVFkpCitwdWJsaWMgZmluYWwgY2xhc3MgTG9nZ2luZ0ZlYXR1cmVBdXRvRGlzY292ZXJhYmxlIGltcGxlbWVudHMgQXV0b0Rpc2NvdmVyYWJsZSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoRmVhdHVyZUNvbnRleHQgY29udGV4dCkgeworICAgICAgICBpZiAoIWNvbnRleHQuZ2V0Q29uZmlndXJhdGlvbigpLmlzUmVnaXN0ZXJlZChMb2dnaW5nRmVhdHVyZS5jbGFzcykpIHsKKworICAgICAgICAgICAgTWFwIHByb3BlcnRpZXMgPSBjb250ZXh0LmdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0aWVzKCk7CisKKyAgICAgICAgICAgIGlmIChjb21tb25Qcm9wZXJ0eUNvbmZpZ3VyZWQocHJvcGVydGllcykKKyAgICAgICAgICAgICAgICAgICAgfHwgKGNvbnRleHQuZ2V0Q29uZmlndXJhdGlvbigpLmdldFJ1bnRpbWVUeXBlKCkgPT0gUnVudGltZVR5cGUuQ0xJRU5UICYmIGNsaWVudENvbmZpZ3VyZWQocHJvcGVydGllcykpCisgICAgICAgICAgICAgICAgICAgIHx8IChjb250ZXh0LmdldENvbmZpZ3VyYXRpb24oKS5nZXRSdW50aW1lVHlwZSgpID09IFJ1bnRpbWVUeXBlLlNFUlZFUiAmJiBzZXJ2ZXJDb25maWd1cmVkKHByb3BlcnRpZXMpKSkgeworICAgICAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGNvbW1vblByb3BlcnR5Q29uZmlndXJlZChNYXAgcHJvcGVydGllcykgeworICAgICAgICByZXR1cm4gcHJvcGVydGllcy5jb250YWluc0tleShMT0dHSU5HX0ZFQVRVUkVfTE9HR0VSX05BTUUpCisgICAgICAgICAgICAgICAgfHwgcHJvcGVydGllcy5jb250YWluc0tleShMT0dHSU5HX0ZFQVRVUkVfTE9HR0VSX0xFVkVMKQorICAgICAgICAgICAgICAgIHx8IHByb3BlcnRpZXMuY29udGFpbnNLZXkoTE9HR0lOR19GRUFUVVJFX1ZFUkJPU0lUWSkKKyAgICAgICAgICAgICAgICB8fCBwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KExPR0dJTkdfRkVBVFVSRV9NQVhfRU5USVRZX1NJWkUpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBjbGllbnRDb25maWd1cmVkKE1hcCBwcm9wZXJ0aWVzKSB7CisgICAgICAgIHJldHVybiBwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KExPR0dJTkdfRkVBVFVSRV9MT0dHRVJfTkFNRV9DTElFTlQpCisgICAgICAgICAgICAgICAgfHwgcHJvcGVydGllcy5jb250YWluc0tleShMT0dHSU5HX0ZFQVRVUkVfTE9HR0VSX0xFVkVMX0NMSUVOVCkKKyAgICAgICAgICAgICAgICB8fCBwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KExPR0dJTkdfRkVBVFVSRV9WRVJCT1NJVFlfQ0xJRU5UKQorICAgICAgICAgICAgICAgIHx8IHByb3BlcnRpZXMuY29udGFpbnNLZXkoTE9HR0lOR19GRUFUVVJFX01BWF9FTlRJVFlfU0laRV9DTElFTlQpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBzZXJ2ZXJDb25maWd1cmVkKE1hcCBwcm9wZXJ0aWVzKSB7CisgICAgICAgIHJldHVybiBwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KExPR0dJTkdfRkVBVFVSRV9MT0dHRVJfTkFNRV9TRVJWRVIpCisgICAgICAgICAgICAgICAgfHwgcHJvcGVydGllcy5jb250YWluc0tleShMT0dHSU5HX0ZFQVRVUkVfTE9HR0VSX0xFVkVMX1NFUlZFUikKKyAgICAgICAgICAgICAgICB8fCBwcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KExPR0dJTkdfRkVBVFVSRV9WRVJCT1NJVFlfU0VSVkVSKQorICAgICAgICAgICAgICAgIHx8IHByb3BlcnRpZXMuY29udGFpbnNLZXkoTE9HR0lOR19GRUFUVVJFX01BWF9FTlRJVFlfU0laRV9TRVJWRVIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbG9nZ2luZy9Mb2dnaW5nSW50ZXJjZXB0b3IuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbG9nZ2luZy9Mb2dnaW5nSW50ZXJjZXB0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzdjMmM4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9sb2dnaW5nL0xvZ2dpbmdJbnRlcmNlcHRvci5qYXZhCkBAIC0wLDAgKzEsMjgyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmc7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWx0ZXJPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNMb25nOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvckNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlLlZlcmJvc2l0eTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLk1lc3NhZ2VVdGlsczsKKworLyoqCisgKiBBbiBpbnRlcmNlcHRvciB0aGF0IGxvZ3MgYW4gZW50aXR5IGlmIGNvbmZpZ3VyZWQgc28gYW5kIHByb3ZpZGVzIGEgY29tbW9uIGxvZ2ljIGZvciB7QGxpbmsgQ2xpZW50TG9nZ2luZ0ZpbHRlcn0KKyAqIGFuZCB7QGxpbmsgU2VydmVyTG9nZ2luZ0ZpbHRlcn0uCisgKgorICogQGF1dGhvciBPbmRyZWogS29zYXRrYSAob25kcmVqLmtvc2F0a2EgYXQgb3JhY2xlLmNvbSkKKyAqLworYWJzdHJhY3QgY2xhc3MgTG9nZ2luZ0ludGVyY2VwdG9yIGltcGxlbWVudHMgV3JpdGVySW50ZXJjZXB0b3IgeworCisgICAgLyoqCisgICAgICogUHJlZml4IHdpbGwgYmUgcHJpbnRlZCBiZWZvcmUgcmVxdWVzdHMKKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVFU1RfUFJFRklYID0gIj4gIjsKKyAgICAvKioKKyAgICAgKiBQcmVmaXggd2lsbCBiZSBwcmludGVkIGJlZm9yZSByZXNwb25zZQorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTUE9OU0VfUFJFRklYID0gIjwgIjsKKyAgICAvKioKKyAgICAgKiBUaGUgZW50aXR5IHN0cmVhbSBwcm9wZXJ0eQorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZX0xPR0dFUl9QUk9QRVJUWSA9IExvZ2dpbmdGZWF0dXJlLmNsYXNzLmdldE5hbWUoKSArICIuZW50aXR5TG9nZ2VyIjsKKyAgICAvKioKKyAgICAgKiBMb2dnaW5nIHJlY29yZCBpZCBwcm9wZXJ0eQorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HR0lOR19JRF9QUk9QRVJUWSA9IExvZ2dpbmdGZWF0dXJlLmNsYXNzLmdldE5hbWUoKSArICIuaWQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RJRklDQVRJT05fUFJFRklYID0gIiogIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZWRpYVR5cGUgVEVYVF9NRURJQV9UWVBFID0gbmV3IE1lZGlhVHlwZSgidGV4dCIsICIqIik7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8TWVkaWFUeXBlPiBSRUFEQUJMRV9BUFBfTUVESUFfVFlQRVMgPSBuZXcgSGFzaFNldDxNZWRpYVR5cGU+KCkge3sKKyAgICAgICAgYWRkKFRFWFRfTUVESUFfVFlQRSk7CisgICAgICAgIGFkZChNZWRpYVR5cGUuQVBQTElDQVRJT05fQVRPTV9YTUxfVFlQRSk7CisgICAgICAgIGFkZChNZWRpYVR5cGUuQVBQTElDQVRJT05fRk9STV9VUkxFTkNPREVEX1RZUEUpOworICAgICAgICBhZGQoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSk7CisgICAgICAgIGFkZChNZWRpYVR5cGUuQVBQTElDQVRJT05fU1ZHX1hNTF9UWVBFKTsKKyAgICAgICAgYWRkKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YSFRNTF9YTUxfVFlQRSk7CisgICAgICAgIGFkZChNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MX1RZUEUpOworICAgIH19OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxNYXAuRW50cnk8U3RyaW5nLCBMaXN0PFN0cmluZz4+PiBDT01QQVJBVE9SID0KKyAgICAgICAgICAgIG5ldyBDb21wYXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8U3RyaW5nPj4+KCkgeworCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlKGZpbmFsIE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gbzEsIGZpbmFsIE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gbzIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG8xLmdldEtleSgpLmNvbXBhcmVUb0lnbm9yZUNhc2UobzIuZ2V0S2V5KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiTm9uQ29uc3RhbnRMb2dnZXIiKQorICAgIGZpbmFsIExvZ2dlciBsb2dnZXI7CisgICAgZmluYWwgTGV2ZWwgbGV2ZWw7CisgICAgZmluYWwgQXRvbWljTG9uZyBfaWQgPSBuZXcgQXRvbWljTG9uZygwKTsKKyAgICBmaW5hbCBWZXJib3NpdHkgdmVyYm9zaXR5OworICAgIGZpbmFsIGludCBtYXhFbnRpdHlTaXplOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGxvZ2dpbmcgZmlsdGVyIHdpdGggY3VzdG9tIGxvZ2dlciBhbmQgZW50aXR5IGxvZ2dpbmcgdHVybmVkIG9uLCBidXQgcG90ZW50aWFsbHkgbGltaXRpbmcgdGhlIHNpemUKKyAgICAgKiBvZiBlbnRpdHkgdG8gYmUgYnVmZmVyZWQgYW5kIGxvZ2dlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2dnZXIgICAgICAgIHRoZSBsb2dnZXIgdG8gbG9nIG1lc3NhZ2VzIHRvLgorICAgICAqIEBwYXJhbSBsZXZlbCAgICAgICAgIGxldmVsIGF0IHdoaWNoIHRoZSBtZXNzYWdlcyB3aWxsIGJlIGxvZ2dlZC4KKyAgICAgKiBAcGFyYW0gdmVyYm9zaXR5ICAgICB2ZXJib3NpdHkgb2YgdGhlIGxvZ2dlZCBtZXNzYWdlcy4gU2VlIHtAbGluayBWZXJib3NpdHl9LgorICAgICAqIEBwYXJhbSBtYXhFbnRpdHlTaXplIG1heGltdW0gbnVtYmVyIG9mIGVudGl0eSBieXRlcyB0byBiZSBsb2dnZWQgKGFuZCBidWZmZXJlZCkgLSBpZiB0aGUgZW50aXR5IGlzIGxhcmdlciwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBsb2dnaW5nIGZpbHRlciB3aWxsIHByaW50IChhbmQgYnVmZmVyIGluIG1lbW9yeSkgb25seSB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcworICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFuZCBwcmludCAiLi4ubW9yZS4uLiIgc3RyaW5nIGF0IHRoZSBlbmQuIE5lZ2F0aXZlIHZhbHVlcyBhcmUgaW50ZXJwcmV0ZWQgYXMgemVyby4KKyAgICAgKi8KKyAgICBMb2dnaW5nSW50ZXJjZXB0b3IoZmluYWwgTG9nZ2VyIGxvZ2dlciwgZmluYWwgTGV2ZWwgbGV2ZWwsIGZpbmFsIFZlcmJvc2l0eSB2ZXJib3NpdHksIGZpbmFsIGludCBtYXhFbnRpdHlTaXplKSB7CisgICAgICAgIHRoaXMubG9nZ2VyID0gbG9nZ2VyOworICAgICAgICB0aGlzLmxldmVsID0gbGV2ZWw7CisgICAgICAgIHRoaXMudmVyYm9zaXR5ID0gdmVyYm9zaXR5OworICAgICAgICB0aGlzLm1heEVudGl0eVNpemUgPSBNYXRoLm1heCgwLCBtYXhFbnRpdHlTaXplKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb2dzIGEge0BsaW5rIFN0cmluZ0J1aWxkZXJ9IHBhcmFtZXRlciBhdCByZXF1aXJlZCBsZXZlbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiIG1lc3NhZ2UgdG8gbG9nCisgICAgICovCisgICAgdm9pZCBsb2coZmluYWwgU3RyaW5nQnVpbGRlciBiKSB7CisgICAgICAgIGlmIChsb2dnZXIgIT0gbnVsbCAmJiBsb2dnZXIuaXNMb2dnYWJsZShsZXZlbCkpIHsKKyAgICAgICAgICAgIGxvZ2dlci5sb2cobGV2ZWwsIGIudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZ0J1aWxkZXIgcHJlZml4SWQoZmluYWwgU3RyaW5nQnVpbGRlciBiLCBmaW5hbCBsb25nIGlkKSB7CisgICAgICAgIGIuYXBwZW5kKExvbmcudG9TdHJpbmcoaWQpKS5hcHBlbmQoIiAiKTsKKyAgICAgICAgcmV0dXJuIGI7CisgICAgfQorCisgICAgdm9pZCBwcmludFJlcXVlc3RMaW5lKGZpbmFsIFN0cmluZ0J1aWxkZXIgYiwgZmluYWwgU3RyaW5nIG5vdGUsIGZpbmFsIGxvbmcgaWQsIGZpbmFsIFN0cmluZyBtZXRob2QsIGZpbmFsIFVSSSB1cmkpIHsKKyAgICAgICAgcHJlZml4SWQoYiwgaWQpLmFwcGVuZChOT1RJRklDQVRJT05fUFJFRklYKQorICAgICAgICAgICAgICAgIC5hcHBlbmQobm90ZSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCIgb24gdGhyZWFkICIpLmFwcGVuZChUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJcbiIpOworICAgICAgICBwcmVmaXhJZChiLCBpZCkuYXBwZW5kKFJFUVVFU1RfUFJFRklYKS5hcHBlbmQobWV0aG9kKS5hcHBlbmQoIiAiKQorICAgICAgICAgICAgICAgIC5hcHBlbmQodXJpLnRvQVNDSUlTdHJpbmcoKSkuYXBwZW5kKCJcbiIpOworICAgIH0KKworICAgIHZvaWQgcHJpbnRSZXNwb25zZUxpbmUoZmluYWwgU3RyaW5nQnVpbGRlciBiLCBmaW5hbCBTdHJpbmcgbm90ZSwgZmluYWwgbG9uZyBpZCwgZmluYWwgaW50IHN0YXR1cykgeworICAgICAgICBwcmVmaXhJZChiLCBpZCkuYXBwZW5kKE5PVElGSUNBVElPTl9QUkVGSVgpCisgICAgICAgICAgICAgICAgLmFwcGVuZChub3RlKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoIiBvbiB0aHJlYWQgIikuYXBwZW5kKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKS5hcHBlbmQoIlxuIik7CisgICAgICAgIHByZWZpeElkKGIsIGlkKS5hcHBlbmQoUkVTUE9OU0VfUFJFRklYKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoSW50ZWdlci50b1N0cmluZyhzdGF0dXMpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoIlxuIik7CisgICAgfQorCisgICAgdm9pZCBwcmludFByZWZpeGVkSGVhZGVycyhmaW5hbCBTdHJpbmdCdWlsZGVyIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzKSB7CisgICAgICAgIGZvciAoZmluYWwgTWFwLkVudHJ5PFN0cmluZywgTGlzdDxTdHJpbmc+PiBoZWFkZXJFbnRyeSA6IGdldFNvcnRlZEhlYWRlcnMoaGVhZGVycy5lbnRyeVNldCgpKSkgeworICAgICAgICAgICAgZmluYWwgTGlzdDw/PiB2YWwgPSBoZWFkZXJFbnRyeS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGhlYWRlciA9IGhlYWRlckVudHJ5LmdldEtleSgpOworCisgICAgICAgICAgICBpZiAodmFsLnNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgcHJlZml4SWQoYiwgaWQpLmFwcGVuZChwcmVmaXgpLmFwcGVuZChoZWFkZXIpLmFwcGVuZCgiOiAiKS5hcHBlbmQodmFsLmdldCgwKSkuYXBwZW5kKCJcbiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICBib29sZWFuIGFkZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGZvciAoZmluYWwgT2JqZWN0IHMgOiB2YWwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFkZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCcsJyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYWRkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwcmVmaXhJZChiLCBpZCkuYXBwZW5kKHByZWZpeCkuYXBwZW5kKGhlYWRlcikuYXBwZW5kKCI6ICIpLmFwcGVuZChzYi50b1N0cmluZygpKS5hcHBlbmQoIlxuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTZXQ8TWFwLkVudHJ5PFN0cmluZywgTGlzdDxTdHJpbmc+Pj4gZ2V0U29ydGVkSGVhZGVycyhmaW5hbCBTZXQ8TWFwLkVudHJ5PFN0cmluZywgTGlzdDxTdHJpbmc+Pj4gaGVhZGVycykgeworICAgICAgICBmaW5hbCBUcmVlU2V0PE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8U3RyaW5nPj4+IHNvcnRlZEhlYWRlcnMgPSBuZXcgVHJlZVNldDxNYXAuRW50cnk8U3RyaW5nLCBMaXN0PFN0cmluZz4+PihDT01QQVJBVE9SKTsKKyAgICAgICAgc29ydGVkSGVhZGVycy5hZGRBbGwoaGVhZGVycyk7CisgICAgICAgIHJldHVybiBzb3J0ZWRIZWFkZXJzOworICAgIH0KKworICAgIElucHV0U3RyZWFtIGxvZ0luYm91bmRFbnRpdHkoZmluYWwgU3RyaW5nQnVpbGRlciBiLCBJbnB1dFN0cmVhbSBzdHJlYW0sIGZpbmFsIENoYXJzZXQgY2hhcnNldCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFzdHJlYW0ubWFya1N1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICBzdHJlYW0gPSBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShzdHJlYW0pOworICAgICAgICB9CisgICAgICAgIHN0cmVhbS5tYXJrKG1heEVudGl0eVNpemUgKyAxKTsKKyAgICAgICAgZmluYWwgYnl0ZVtdIGVudGl0eSA9IG5ldyBieXRlW21heEVudGl0eVNpemUgKyAxXTsKKyAgICAgICAgZmluYWwgaW50IGVudGl0eVNpemUgPSBzdHJlYW0ucmVhZChlbnRpdHkpOworICAgICAgICBiLmFwcGVuZChuZXcgU3RyaW5nKGVudGl0eSwgMCwgTWF0aC5taW4oZW50aXR5U2l6ZSwgbWF4RW50aXR5U2l6ZSksIGNoYXJzZXQpKTsKKyAgICAgICAgaWYgKGVudGl0eVNpemUgPiBtYXhFbnRpdHlTaXplKSB7CisgICAgICAgICAgICBiLmFwcGVuZCgiLi4ubW9yZS4uLiIpOworICAgICAgICB9CisgICAgICAgIGIuYXBwZW5kKCdcbicpOworICAgICAgICBzdHJlYW0ucmVzZXQoKTsKKyAgICAgICAgcmV0dXJuIHN0cmVhbTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhcm91bmRXcml0ZVRvKGZpbmFsIFdyaXRlckludGVyY2VwdG9yQ29udGV4dCB3cml0ZXJJbnRlcmNlcHRvckNvbnRleHQpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgTG9nZ2luZ1N0cmVhbSBzdHJlYW0gPSAoTG9nZ2luZ1N0cmVhbSkgd3JpdGVySW50ZXJjZXB0b3JDb250ZXh0LmdldFByb3BlcnR5KEVOVElUWV9MT0dHRVJfUFJPUEVSVFkpOworICAgICAgICB3cml0ZXJJbnRlcmNlcHRvckNvbnRleHQucHJvY2VlZCgpOworICAgICAgICBpZiAobG9nZ2VyLmlzTG9nZ2FibGUobGV2ZWwpICYmIHByaW50RW50aXR5KHZlcmJvc2l0eSwgd3JpdGVySW50ZXJjZXB0b3JDb250ZXh0LmdldE1lZGlhVHlwZSgpKSkgeworICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbG9nKHN0cmVhbS5nZXRTdHJpbmdCdWlsZGVyKE1lc3NhZ2VVdGlscy5nZXRDaGFyc2V0KHdyaXRlckludGVyY2VwdG9yQ29udGV4dC5nZXRNZWRpYVR5cGUoKSkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHNwZWNpZmllZCB7QGxpbmsgTWVkaWFUeXBlfSBpcyBjb25zaWRlcmVkIHRleHR1YWwuCisgICAgICogPHA+CisgICAgICogU2VlIHtAbGluayAjUkVBREFCTEVfQVBQX01FRElBX1RZUEVTfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZWRpYVR5cGUgdGhlIG1lZGlhIHR5cGUgb2YgdGhlIGVudGl0eQorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHNwZWNpZmllZCB7QGxpbmsgTWVkaWFUeXBlfSBpcyBjb25zaWRlcmVkIHRleHR1YWwuCisgICAgICovCisgICAgc3RhdGljIGJvb2xlYW4gaXNSZWFkYWJsZShNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIGlmIChtZWRpYVR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChNZWRpYVR5cGUgcmVhZGFibGVNZWRpYVR5cGUgOiBSRUFEQUJMRV9BUFBfTUVESUFfVFlQRVMpIHsKKyAgICAgICAgICAgICAgICBpZiAocmVhZGFibGVNZWRpYVR5cGUuaXNDb21wYXRpYmxlKG1lZGlhVHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiBlbnRpdHkgaGFzIHRvIGJlIHByaW50ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmVyYm9zaXR5IHRoZSBjb25maWd1cmVkIHZlcmJvc2l0eSAuCisgICAgICogQHBhcmFtIG1lZGlhVHlwZSB0aGUgbWVkaWEgdHlwZSBvZiB0aGUgcGF5bG9hZC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBlbnRpdHkgaGFzIHRvIGJlIHByaW50ZWQuCisgICAgICovCisgICAgc3RhdGljIGJvb2xlYW4gcHJpbnRFbnRpdHkoVmVyYm9zaXR5IHZlcmJvc2l0eSwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICByZXR1cm4gdmVyYm9zaXR5ID09IFZlcmJvc2l0eS5QQVlMT0FEX0FOWSB8fCAodmVyYm9zaXR5ID09IFZlcmJvc2l0eS5QQVlMT0FEX1RFWFQgJiYgaXNSZWFkYWJsZShtZWRpYVR5cGUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgY2xhc3MgdXNlZCB0byBsb2cgYW4gZW50aXR5IHRvIHRoZSBvdXRwdXQgc3RyZWFtIHVwIHRvIHRoZSBzcGVjaWZpZWQgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMuCisgICAgICovCisgICAgY2xhc3MgTG9nZ2luZ1N0cmVhbSBleHRlbmRzIEZpbHRlck91dHB1dFN0cmVhbSB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdCdWlsZGVyIGI7CisgICAgICAgIHByaXZhdGUgZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMge0Bjb2RlIExvZ2dpbmdTdHJlYW19IHdpdGggdGhlIGVudGl0eSBhbmQgdGhlIHVuZGVybHlpbmcgb3V0cHV0IHN0cmVhbSBhcyBwYXJhbWV0ZXJzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYiAgICAgY29udGFpbnMgdGhlIGVudGl0eSB0byBsb2cuCisgICAgICAgICAqIEBwYXJhbSBpbm5lciB0aGUgdW5kZXJseWluZyBvdXRwdXQgc3RyZWFtLgorICAgICAgICAgKi8KKyAgICAgICAgTG9nZ2luZ1N0cmVhbShmaW5hbCBTdHJpbmdCdWlsZGVyIGIsIGZpbmFsIE91dHB1dFN0cmVhbSBpbm5lcikgeworICAgICAgICAgICAgc3VwZXIoaW5uZXIpOworCisgICAgICAgICAgICB0aGlzLmIgPSBiOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nQnVpbGRlciBnZXRTdHJpbmdCdWlsZGVyKGZpbmFsIENoYXJzZXQgY2hhcnNldCkgeworICAgICAgICAgICAgLy8gd3JpdGUgZW50aXR5IHRvIHRoZSBidWlsZGVyCisgICAgICAgICAgICBmaW5hbCBieXRlW10gZW50aXR5ID0gYmFvcy50b0J5dGVBcnJheSgpOworCisgICAgICAgICAgICBiLmFwcGVuZChuZXcgU3RyaW5nKGVudGl0eSwgMCwgTWF0aC5taW4oZW50aXR5Lmxlbmd0aCwgbWF4RW50aXR5U2l6ZSksIGNoYXJzZXQpKTsKKyAgICAgICAgICAgIGlmIChlbnRpdHkubGVuZ3RoID4gbWF4RW50aXR5U2l6ZSkgeworICAgICAgICAgICAgICAgIGIuYXBwZW5kKCIuLi5tb3JlLi4uIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBiLmFwcGVuZCgnXG4nKTsKKworICAgICAgICAgICAgcmV0dXJuIGI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoZmluYWwgaW50IGkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoYmFvcy5zaXplKCkgPD0gbWF4RW50aXR5U2l6ZSkgeworICAgICAgICAgICAgICAgIGJhb3Mud3JpdGUoaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQud3JpdGUoaSk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbG9nZ2luZy9TZXJ2ZXJMb2dnaW5nRmlsdGVyLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xvZ2dpbmcvU2VydmVyTG9nZ2luZ0ZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MWRiNjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xvZ2dpbmcvU2VydmVyTG9nZ2luZ0ZpbHRlci5qYXZhCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN0cmFpbmVkVG87CitpbXBvcnQgamF2YXgud3MucnMuUnVudGltZVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlc3BvbnNlRmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5QcmVNYXRjaGluZzsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmVDb250ZXh0OworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qcmlvcml0eTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmUuVmVyYm9zaXR5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuTWVzc2FnZVV0aWxzOworCisvKioKKyAqIFNlcnZlciBmaWx0ZXIgbG9ncyByZXF1ZXN0cyBhbmQgcmVzcG9uc2VzIHRvIHNwZWNpZmllZCBsb2dnZXIsIGF0IHJlcXVpcmVkIGxldmVsLCB3aXRoIGVudGl0eSBvciBub3QuCisgKiA8cD4KKyAqIFRoZSBmaWx0ZXIgaXMgcmVnaXN0ZXJlZCBpbiB7QGxpbmsgTG9nZ2luZ0ZlYXR1cmUjY29uZmlndXJlKEZlYXR1cmVDb250ZXh0KX0gYW5kIGNhbiBiZSB1c2VkIG9uIHNlcnZlciBzaWRlIG9ubHkuIFRoZSBQcmlvcml0eQorICogaXMgc2V0IHRvIHRoZSBtYXhpbXVtIHZhbHVlLCB3aGljaCBtZWFucyB0aGF0IGZpbHRlciBpcyBjYWxsZWQgYXMgdGhlIGZpcnN0IGZpbHRlciB3aGVuIHJlcXVlc3QgYXJyaXZlcyBhbmQgc2ltaWxhcmx5IGFzIHRoZQorICogbGFzdCBmaWx0ZXIgd2hlbiB0aGUgcmVzcG9uc2UgaXMgZGlzcGF0Y2hlZCwgc28gcmVxdWVzdCBhbmQgcmVzcG9uc2UgaXMgbG9nZ2VkIGFzIGFycml2ZXMgb3IgYXMgZGlzcGF0Y2hlZC4KKyAqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKiBAYXV0aG9yIE9uZHJlaiBLb3NhdGthIChvbmRyZWoua29zYXRrYSBhdCBvcmFjbGUuY29tKQorICovCitAQ29uc3RyYWluZWRUbyhSdW50aW1lVHlwZS5TRVJWRVIpCitAUHJlTWF0Y2hpbmcKK0BQcmlvcml0eShJbnRlZ2VyLk1JTl9WQUxVRSkKK0BTdXBwcmVzc1dhcm5pbmdzKCJDbGFzc1dpdGhNdWx0aXBsZUxvZ2dlcnMiKQorZmluYWwgY2xhc3MgU2VydmVyTG9nZ2luZ0ZpbHRlciBleHRlbmRzIExvZ2dpbmdJbnRlcmNlcHRvciBpbXBsZW1lbnRzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIsIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyIHsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGxvZ2dpbmcgZmlsdGVyIHdpdGggY3VzdG9tIGxvZ2dlciBhbmQgY3VzdG9tIHNldHRpbmdzIG9mIGVudGl0eQorICAgICAqIGxvZ2dpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9nZ2VyICAgICAgICB0aGUgbG9nZ2VyIHRvIGxvZyBtZXNzYWdlcyB0by4KKyAgICAgKiBAcGFyYW0gbGV2ZWwgICAgICAgICBsZXZlbCBhdCB3aGljaCB0aGUgbWVzc2FnZXMgd2lsbCBiZSBsb2dnZWQuCisgICAgICogQHBhcmFtIHZlcmJvc2l0eSAgICAgdmVyYm9zaXR5IG9mIHRoZSBsb2dnZWQgbWVzc2FnZXMuIFNlZSB7QGxpbmsgVmVyYm9zaXR5fS4KKyAgICAgKiBAcGFyYW0gbWF4RW50aXR5U2l6ZSBtYXhpbXVtIG51bWJlciBvZiBlbnRpdHkgYnl0ZXMgdG8gYmUgbG9nZ2VkIChhbmQgYnVmZmVyZWQpIC0gaWYgdGhlIGVudGl0eSBpcyBsYXJnZXIsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgbG9nZ2luZyBmaWx0ZXIgd2lsbCBwcmludCAoYW5kIGJ1ZmZlciBpbiBtZW1vcnkpIG9ubHkgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhbmQgcHJpbnQgIi4uLm1vcmUuLi4iIHN0cmluZyBhdCB0aGUgZW5kLiBOZWdhdGl2ZSB2YWx1ZXMgYXJlIGludGVycHJldGVkIGFzIHplcm8uCisgICAgICovCisgICAgcHVibGljIFNlcnZlckxvZ2dpbmdGaWx0ZXIoZmluYWwgTG9nZ2VyIGxvZ2dlciwgZmluYWwgTGV2ZWwgbGV2ZWwsIGZpbmFsIFZlcmJvc2l0eSB2ZXJib3NpdHksIGZpbmFsIGludCBtYXhFbnRpdHlTaXplKSB7CisgICAgICAgIHN1cGVyKGxvZ2dlciwgbGV2ZWwsIHZlcmJvc2l0eSwgbWF4RW50aXR5U2l6ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZmlsdGVyKGZpbmFsIENvbnRhaW5lclJlcXVlc3RDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbG9nZ2VyLmlzTG9nZ2FibGUobGV2ZWwpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgbG9uZyBpZCA9IF9pZC5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgICAgY29udGV4dC5zZXRQcm9wZXJ0eShMT0dHSU5HX0lEX1BST1BFUlRZLCBpZCk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworICAgICAgICBwcmludFJlcXVlc3RMaW5lKGIsICJTZXJ2ZXIgaGFzIHJlY2VpdmVkIGEgcmVxdWVzdCIsIGlkLCBjb250ZXh0LmdldE1ldGhvZCgpLCBjb250ZXh0LmdldFVyaUluZm8oKS5nZXRSZXF1ZXN0VXJpKCkpOworICAgICAgICBwcmludFByZWZpeGVkSGVhZGVycyhiLCBpZCwgUkVRVUVTVF9QUkVGSVgsIGNvbnRleHQuZ2V0SGVhZGVycygpKTsKKworICAgICAgICBpZiAoY29udGV4dC5oYXNFbnRpdHkoKSAmJiBwcmludEVudGl0eSh2ZXJib3NpdHksIGNvbnRleHQuZ2V0TWVkaWFUeXBlKCkpKSB7CisgICAgICAgICAgICBjb250ZXh0LnNldEVudGl0eVN0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgbG9nSW5ib3VuZEVudGl0eShiLCBjb250ZXh0LmdldEVudGl0eVN0cmVhbSgpLCBNZXNzYWdlVXRpbHMuZ2V0Q2hhcnNldChjb250ZXh0LmdldE1lZGlhVHlwZSgpKSkpOworICAgICAgICB9CisKKyAgICAgICAgbG9nKGIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZpbHRlcihmaW5hbCBDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCwgZmluYWwgQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICghbG9nZ2VyLmlzTG9nZ2FibGUobGV2ZWwpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgT2JqZWN0IHJlcXVlc3RJZCA9IHJlcXVlc3RDb250ZXh0LmdldFByb3BlcnR5KExPR0dJTkdfSURfUFJPUEVSVFkpOworICAgICAgICBmaW5hbCBsb25nIGlkID0gcmVxdWVzdElkICE9IG51bGwgPyAoTG9uZykgcmVxdWVzdElkIDogX2lkLmluY3JlbWVudEFuZEdldCgpOworCisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKyAgICAgICAgcHJpbnRSZXNwb25zZUxpbmUoYiwgIlNlcnZlciByZXNwb25kZWQgd2l0aCBhIHJlc3BvbnNlIiwgaWQsIHJlc3BvbnNlQ29udGV4dC5nZXRTdGF0dXMoKSk7CisgICAgICAgIHByaW50UHJlZml4ZWRIZWFkZXJzKGIsIGlkLCBSRVNQT05TRV9QUkVGSVgsIHJlc3BvbnNlQ29udGV4dC5nZXRTdHJpbmdIZWFkZXJzKCkpOworCisgICAgICAgIGlmIChyZXNwb25zZUNvbnRleHQuaGFzRW50aXR5KCkgJiYgcHJpbnRFbnRpdHkodmVyYm9zaXR5LCByZXNwb25zZUNvbnRleHQuZ2V0TWVkaWFUeXBlKCkpKSB7CisgICAgICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gc3RyZWFtID0gbmV3IExvZ2dpbmdTdHJlYW0oYiwgcmVzcG9uc2VDb250ZXh0LmdldEVudGl0eVN0cmVhbSgpKTsKKyAgICAgICAgICAgIHJlc3BvbnNlQ29udGV4dC5zZXRFbnRpdHlTdHJlYW0oc3RyZWFtKTsKKyAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LnNldFByb3BlcnR5KEVOVElUWV9MT0dHRVJfUFJPUEVSVFksIHN0cmVhbSk7CisgICAgICAgICAgICAvLyBub3QgY2FsbGluZyBsb2coYikgaGVyZSAtIGl0IHdpbGwgYmUgY2FsbGVkIGJ5IHRoZSBpbnRlcmNlcHRvcgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbG9nKGIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9sb2dnaW5nL3BhY2thZ2UtaW5mby5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9sb2dnaW5nL3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMTc1OGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xvZ2dpbmcvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoqCisgKiBMb2dnaW5nIGZlYXR1cmUgcHJvdmlkZXMgdGhlIGxvZ2dpbmcgb2YgcmVxdWVzdHMgYW5kIHJlc3BvbnNlcyBvbiBzZXJ2ZXIgYW5kIGNsaWVudC4KKyAqIFRoZSBwYWNrYWdlIGNvbnRhaW5zIGludGVybmFsIHNlcnZlci1zaWRlIGFuZCBjbGllbnQtc2lkZSBmaWx0ZXJzLCBhIGJhc2UgYWJzdHJhY3QgbG9nZ2luZyBpbnRlcmNlcHRvciwgbG9nZ2luZyBmZWF0dXJlIGNsYXNzCisgKiBhbmQgaXQncyBhdXRvLWRpc2NvdmVyYWJsZSBjbGFzcy4KKyAqIDxwPgorICogU2VlIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAqLworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nOwpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL0Fic3RyYWN0RW50aXR5UHJvdmlkZXJNb2RlbC5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL0Fic3RyYWN0RW50aXR5UHJvdmlkZXJNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYmM0MGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvQWJzdHJhY3RFbnRpdHlQcm92aWRlck1vZGVsLmphdmEKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlJlZmxlY3Rpb25IZWxwZXI7CisKKy8qKgorICogQWJzdHJhY3QgZW50aXR5IHByb3ZpZGVyIG1vZGVsLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKiBAc2luY2UgMi4xNgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RFbnRpdHlQcm92aWRlck1vZGVsPFQ+IHsKKworICAgIHByaXZhdGUgZmluYWwgVCBwcm92aWRlcjsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8TWVkaWFUeXBlPiBkZWNsYXJlZFR5cGVzOworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBjdXN0b207CisgICAgcHJpdmF0ZSBmaW5hbCBDbGFzczw/PiBwcm92aWRlZFR5cGU7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IGVudGl0eSBwcm92aWRlciBtb2RlbC4KKyAgICAgKgorICAgICAqIE5PVEU6IFRoZSBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlIHByaXZhdGUgb24gcHVycG9zZSBhcyB3ZSBkbyBub3Qgc3VwcG9ydCBleHRlbnNpb25zIG9mIHRoaXMgY2xhc3MgZnJvbSBhbm90aGVyIHBhY2thZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvdmlkZXIgICAgICBlbnRpdHkgcHJvdmlkZXIgaW5zdGFuY2UuCisgICAgICogQHBhcmFtIGRlY2xhcmVkVHlwZXMgZGVjbGFyZWQgc3VwcG9ydGVkIG1lZGlhIHR5cGVzLgorICAgICAqIEBwYXJhbSBjdXN0b20gICAgICAgIGN1c3RvbSBmbGFnOyB7QGNvZGUgdHJ1ZX0gaXMgdGhlIHByb3ZpZGVyIGlzIGN1c3RvbSwge0Bjb2RlIGZhbHNlfSBpZiB0aGUgcHJvdmlkZXIgaXMgb25lIG9mIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgSmVyc2V5IHByb3ZpZGVycy4KKyAgICAgKiBAcGFyYW0gcHJvdmlkZXJUeXBlICBwYXJhbWV0ZXJpemVkIGVudGl0eSBwcm92aWRlciB0eXBlICh1c2VkIHRvIHJldHJpZXZlIHRoZSBwcm92aWRlZCBKYXZhIHR5cGUpLgorICAgICAqLworICAgIEFic3RyYWN0RW50aXR5UHJvdmlkZXJNb2RlbChmaW5hbCBUIHByb3ZpZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PE1lZGlhVHlwZT4gZGVjbGFyZWRUeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBjdXN0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPFQ+IHByb3ZpZGVyVHlwZSkgeworICAgICAgICB0aGlzLnByb3ZpZGVyID0gcHJvdmlkZXI7CisgICAgICAgIHRoaXMuZGVjbGFyZWRUeXBlcyA9IGRlY2xhcmVkVHlwZXM7CisgICAgICAgIHRoaXMuY3VzdG9tID0gY3VzdG9tOworICAgICAgICB0aGlzLnByb3ZpZGVkVHlwZSA9IGdldFByb3ZpZGVyQ2xhc3NQYXJhbShwcm92aWRlciwgcHJvdmlkZXJUeXBlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG1vZGVsbGVkIGVudGl0eSBwcm92aWRlciBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gZW50aXR5IHByb3ZpZGVyIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBUIHByb3ZpZGVyKCkgeworICAgICAgICByZXR1cm4gcHJvdmlkZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHR5cGVzIGRlY2xhcmVkIGFzIHN1cHBvcnRlZCAodmlhIHtAY29kZSBAUHJvZHVjZXN9IG9yIHtAY29kZSBAQ29uc3VtZXN9KSBvbiB0aGUgZW50aXR5IHByb3ZpZGVyLgorICAgICAqCisgICAgICogQHJldHVybiBkZWNsYXJlZCBzdXBwb3J0ZWQgdHlwZXMuCisgICAgICovCisgICAgcHVibGljIExpc3Q8TWVkaWFUeXBlPiBkZWNsYXJlZFR5cGVzKCkgeworICAgICAgICByZXR1cm4gZGVjbGFyZWRUeXBlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHtAY29kZSBjdXN0b219IGZsYWcgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgcHJvdmlkZXIgaXMgYSBjdXN0b20gaW1wbGVtZW50YXRpb24sIHtAY29kZSBmYWxzZX0gaWYgdGhlIHByb3ZpZGVyIGlzCisgICAgICogb25lIG9mIHRoZSBkZWZhdWx0IHByb3ZpZGVycyBzdXBwbGllZCB3aXRoIEplcnNleS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0N1c3RvbSgpIHsKKyAgICAgICAgcmV0dXJuIGN1c3RvbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHByb3ZpZGVkIEphdmEgdHlwZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gcHJvdmlkZWQgSmF2YSB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzczw/PiBwcm92aWRlZFR5cGUoKSB7CisgICAgICAgIHJldHVybiBwcm92aWRlZFR5cGU7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3M8Pz4gZ2V0UHJvdmlkZXJDbGFzc1BhcmFtKE9iamVjdCBwcm92aWRlciwgQ2xhc3M8Pz4gcHJvdmlkZXJUeXBlKSB7CisgICAgICAgIGZpbmFsIFJlZmxlY3Rpb25IZWxwZXIuRGVjbGFyaW5nQ2xhc3NJbnRlcmZhY2VQYWlyIHBhaXIgPQorICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25IZWxwZXIuZ2V0Q2xhc3MocHJvdmlkZXIuZ2V0Q2xhc3MoKSwgcHJvdmlkZXJUeXBlKTsKKyAgICAgICAgZmluYWwgQ2xhc3NbXSBjbGFzc0FyZ3MgPSBSZWZsZWN0aW9uSGVscGVyLmdldFBhcmFtZXRlcml6ZWRDbGFzc0FyZ3VtZW50cyhwYWlyKTsKKworICAgICAgICByZXR1cm4gY2xhc3NBcmdzICE9IG51bGwgPyBjbGFzc0FyZ3NbMF0gOiBPYmplY3QuY2xhc3M7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL0RlZmxhdGVFbmNvZGVyLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvRGVmbGF0ZUVuY29kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTJlNDE1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL0RlZmxhdGVFbmNvZGVyLmphdmEKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZTsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLnppcC5EZWZsYXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkRlZmxhdGVyT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC56aXAuSW5mbGF0ZXI7CitpbXBvcnQgamF2YS51dGlsLnppcC5JbmZsYXRlcklucHV0U3RyZWFtOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qcmlvcml0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcmlvcml0aWVzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuQ29udGVudEVuY29kZXI7CisKKy8qKgorICogRGVmbGF0ZSBlbmNvZGluZyBzdXBwb3J0LiBJbnRlcmNlcHRvciB0aGF0IGVuY29kZXMgdGhlIG91dHB1dCBvciBkZWNvZGVzIHRoZSBpbnB1dCBpZgorICoge0BsaW5rIGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnMjQ09OVEVOVF9FTkNPRElORyBDb250ZW50LUVuY29kaW5nIGhlYWRlcn0gdmFsdWUgZXF1YWxzIHRvIHtAY29kZSBkZWZsYXRlfS4KKyAqIFRoZSBkZWZhdWx0IGJlaGF2aW9yIG9mIHRoaXMgaW50ZXJjZXB0b3IgY2FuIGJlIHR3ZWFrZWQgdXNpbmcge0BsaW5rIE1lc3NhZ2VQcm9wZXJ0aWVzI0RFRkxBVEVfV0lUSE9VVF9aTElCfQorICogcHJvcGVydHkuCisgKgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK0BQcmlvcml0eShQcmlvcml0aWVzLkVOVElUWV9DT0RFUikKK3B1YmxpYyBjbGFzcyBEZWZsYXRlRW5jb2RlciBleHRlbmRzIENvbnRlbnRFbmNvZGVyIHsKKworICAgIC8vIFRPRE8gVGhpcyBwcm92aWRlciBzaG91bGQgYmUgcmVnaXN0ZXJlZCBhbmQgY29uZmlndXJlZCB2aWEgYSBmZWF0dXJlLgorICAgIHByaXZhdGUgZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWc7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIERlZmxhdGVFbmNvZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZyBKZXJzZXkgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLgorICAgICAqLworICAgIEBJbmplY3QKKyAgICBwdWJsaWMgRGVmbGF0ZUVuY29kZXIoZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWcpIHsKKyAgICAgICAgc3VwZXIoImRlZmxhdGUiKTsKKyAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElucHV0U3RyZWFtIGRlY29kZShTdHJpbmcgY29udGVudEVuY29kaW5nLCBJbnB1dFN0cmVhbSBlbmNvZGVkU3RyZWFtKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gY29ycmVjdCBpbXBsLiBzaG91bGQgd3JhcCBkZWZsYXRlIGluIHpsaWIsIGJ1dCBzb21lIGRvbid0IGRvIGl0IC0gaGF2ZSB0byBpZGVudGlmeSwgd2hpY2ggb25lIHdlIGdvdAorICAgICAgICBJbnB1dFN0cmVhbSBtYXJrU3VwcG9ydGluZ1N0cmVhbSA9IGVuY29kZWRTdHJlYW0ubWFya1N1cHBvcnRlZCgpID8gZW5jb2RlZFN0cmVhbQorICAgICAgICAgICAgICAgIDogbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oZW5jb2RlZFN0cmVhbSk7CisKKyAgICAgICAgbWFya1N1cHBvcnRpbmdTdHJlYW0ubWFyaygxKTsKKyAgICAgICAgLy8gcmVhZCB0aGUgZmlyc3QgYnl0ZQorICAgICAgICBpbnQgZmlyc3RCeXRlID0gbWFya1N1cHBvcnRpbmdTdHJlYW0ucmVhZCgpOworICAgICAgICBtYXJrU3VwcG9ydGluZ1N0cmVhbS5yZXNldCgpOworCisgICAgICAgIC8vIGlmIHVzaW5nIHpsaWIsIGZpcnN0IDMgYml0cyBzaG91bGQgYmUgMCwgNHRoIHNob3VsZCBiZSAxCisgICAgICAgIC8vIHRoYXQgc2hvdWxkIG5ldmVyIGJlIHRoZSBjYXNlIGlmIG5vIHpsaWIgd3JhcHBlcgorICAgICAgICBpZiAoKGZpcnN0Qnl0ZSAmIDE1KSA9PSA4KSB7CisgICAgICAgICAgICAvLyBvaywgemxpYiB3cmFwcGVkIHN0cmVhbQorICAgICAgICAgICAgcmV0dXJuIG5ldyBJbmZsYXRlcklucHV0U3RyZWFtKG1hcmtTdXBwb3J0aW5nU3RyZWFtKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIG5vIHpsaWIgd3JhcHBlcgorICAgICAgICAgICAgcmV0dXJuIG5ldyBJbmZsYXRlcklucHV0U3RyZWFtKG1hcmtTdXBwb3J0aW5nU3RyZWFtLCBuZXcgSW5mbGF0ZXIodHJ1ZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE91dHB1dFN0cmVhbSBlbmNvZGUoU3RyaW5nIGNvbnRlbnRFbmNvZGluZywgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIHNvbWUgaW1wbGVtZW50YXRpb25zIGRvbid0IHN1cHBvcnQgdGhlIGNvcnJlY3QgZGVmbGF0ZQorICAgICAgICAvLyBzbyB3ZSBoYXZlIGEgcHJvcGVydHkgdG8gY29uZmlndXJlIHRoZSBpbmNvcnJlY3QgZGVmbGF0ZSAobm8gemxpYiB3cmFwcGVyKSBzaG91bGQgYmUgdXNlZAorICAgICAgICAvLyBsZXQncyBjaGVjayB0aGF0CisgICAgICAgIE9iamVjdCB2YWx1ZSA9IGNvbmZpZy5nZXRQcm9wZXJ0eShNZXNzYWdlUHJvcGVydGllcy5ERUZMQVRFX1dJVEhPVVRfWkxJQik7CisgICAgICAgIGJvb2xlYW4gZGVmbGF0ZVdpdGhvdXRaTGliOworICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgICAgICAgIGRlZmxhdGVXaXRob3V0WkxpYiA9IEJvb2xlYW4udmFsdWVPZigoU3RyaW5nKSB2YWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuKSB7CisgICAgICAgICAgICBkZWZsYXRlV2l0aG91dFpMaWIgPSAoQm9vbGVhbikgdmFsdWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZWZsYXRlV2l0aG91dFpMaWIgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBkZWZsYXRlV2l0aG91dFpMaWIKKyAgICAgICAgICAgICAgICA/IG5ldyBEZWZsYXRlck91dHB1dFN0cmVhbShlbnRpdHlTdHJlYW0sIG5ldyBEZWZsYXRlcihEZWZsYXRlci5ERUZBVUxUX0NPTVBSRVNTSU9OLCB0cnVlKSkKKyAgICAgICAgICAgICAgICA6IG5ldyBEZWZsYXRlck91dHB1dFN0cmVhbShlbnRpdHlTdHJlYW0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9HWmlwRW5jb2Rlci5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL0daaXBFbmNvZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMzZDQ5MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9HWmlwRW5jb2Rlci5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkdaSVBJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkdaSVBPdXRwdXRTdHJlYW07CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5OworaW1wb3J0IGphdmF4LndzLnJzLlByaW9yaXRpZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5Db250ZW50RW5jb2RlcjsKKworLyoqCisgKiBHWklQIGVuY29kaW5nIHN1cHBvcnQuIEludGVyY2VwdG9yIHRoYXQgZW5jb2RlcyB0aGUgb3V0cHV0IG9yIGRlY29kZXMgdGhlIGlucHV0IGlmCisgKiB7QGxpbmsgSHR0cEhlYWRlcnMjQ09OVEVOVF9FTkNPRElORyBDb250ZW50LUVuY29kaW5nIGhlYWRlcn0gdmFsdWUgZXF1YWxzIHRvIHtAY29kZSBnemlwfSBvciB7QGNvZGUgeC1nemlwfS4KKyAqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworQFByaW9yaXR5KFByaW9yaXRpZXMuRU5USVRZX0NPREVSKQorcHVibGljIGNsYXNzIEdaaXBFbmNvZGVyIGV4dGVuZHMgQ29udGVudEVuY29kZXIgeworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgR1ppcEVuY29kZXIuCisgICAgICovCisgICAgcHVibGljIEdaaXBFbmNvZGVyKCkgeworICAgICAgICBzdXBlcigiZ3ppcCIsICJ4LWd6aXAiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZGVjb2RlKFN0cmluZyBjb250ZW50RW5jb2RpbmcsIElucHV0U3RyZWFtIGVuY29kZWRTdHJlYW0pCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEdaSVBJbnB1dFN0cmVhbShlbmNvZGVkU3RyZWFtKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGVuY29kZShTdHJpbmcgY29udGVudEVuY29kaW5nLCBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBHWklQT3V0cHV0U3RyZWFtKGVudGl0eVN0cmVhbSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL01lc3NhZ2VCb2R5V29ya2Vycy5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL01lc3NhZ2VCb2R5V29ya2Vycy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZjAzMmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvTWVzc2FnZUJvZHlXb3JrZXJzLmphdmEKQEAgLTAsMCArMSwzNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUmVhZGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuUHJvcGVydGllc0RlbGVnYXRlOworCisvKioKKyAqIEFuIGluamVjdGFibGUgaW50ZXJmYWNlIHByb3ZpZGluZyBsb29rdXAgb2Yge0BsaW5rIE1lc3NhZ2VCb2R5UmVhZGVyfSBhbmQKKyAqIHtAbGluayBNZXNzYWdlQm9keVdyaXRlcn0gaW5zdGFuY2VzLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBzZWUgamF2YXgud3MucnMuY29yZS5Db250ZXh0CisgKiBAc2VlIE1lc3NhZ2VCb2R5UmVhZGVyCisgKiBAc2VlIE1lc3NhZ2VCb2R5V3JpdGVyCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTWVzc2FnZUJvZHlXb3JrZXJzIHsKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG1hcCBvZiBtZWRpYSB0eXBlIHRvIGxpc3Qgb2YgbWVzc2FnZSBib2R5IHdyaXRlcnMgdGhhdCBhcmUgY29tcGF0aWJsZSB3aXRoCisgICAgICogYSBtZWRpYSB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIG1lZGlhVHlwZSB0aGUgY29tcGF0aWJsZSBtZWRpYSB0eXBlLgorICAgICAqIEByZXR1cm4gdGhlIG1hcCBvZiBtZWRpYSB0eXBlIHRvIGxpc3Qgb2YgbWVzc2FnZSBib2R5IHdyaXRlcnMuCisgICAgICovCisgICAgcHVibGljIE1hcDxNZWRpYVR5cGUsIExpc3Q8TWVzc2FnZUJvZHlSZWFkZXI+PiBnZXRSZWFkZXJzKE1lZGlhVHlwZSBtZWRpYVR5cGUpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBtYXAgb2YgbWVkaWEgdHlwZSB0byBsaXN0IG9mIG1lc3NhZ2UgYm9keSB3cml0ZXJzIHRoYXQgYXJlIGNvbXBhdGlibGUgd2l0aAorICAgICAqIGEgbWVkaWEgdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZWRpYVR5cGUgdGhlIGNvbXBhdGlibGUgbWVkaWEgdHlwZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBtYXAgb2YgbWVkaWEgdHlwZSB0byBsaXN0IG9mIG1lc3NhZ2UgYm9keSB3cml0ZXJzLgorICAgICAqLworICAgIHB1YmxpYyBNYXA8TWVkaWFUeXBlLCBMaXN0PE1lc3NhZ2VCb2R5V3JpdGVyPj4gZ2V0V3JpdGVycyhNZWRpYVR5cGUgbWVkaWFUeXBlKTsKKworICAgIC8qKgorICAgICAqIENvbnZlcnQgYSBtYXAgbWVkaWEgdHlwZSB0byBsaXN0IG9mIG1lc3NhZ2UgYm9keSByZWFkZXJzIHRvIGEgc3RyaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIHJlYWRlcnMgdGhlIG1hcCBtZWRpYSB0eXBlIHRvIGxpc3Qgb2YgbWVzc2FnZSBib2R5IHJlYWRlcnMKKyAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyByZWFkZXJzVG9TdHJpbmcoTWFwPE1lZGlhVHlwZSwgTGlzdDxNZXNzYWdlQm9keVJlYWRlcj4+IHJlYWRlcnMpOworCisgICAgLyoqCisgICAgICogQ29udmVydCBhIG1hcCBtZWRpYSB0eXBlIHRvIGxpc3Qgb2YgbWVzc2FnZSBib2R5IHdyaXRlcnMgdG8gYSBzdHJpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd3JpdGVycyB0aGUgbWFwIG1lZGlhIHR5cGUgdG8gbGlzdCBvZiBtZXNzYWdlIGJvZHkgcmVhZGVycworICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHdyaXRlcnNUb1N0cmluZyhNYXA8TWVkaWFUeXBlLCBMaXN0PE1lc3NhZ2VCb2R5V3JpdGVyPj4gd3JpdGVycyk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBtZXNzYWdlIGJvZHkgcmVhZGVyIHRoYXQgbWF0Y2hlcyBhIHNldCBvZiBjcml0ZXJpYS4KKyAgICAgKgorICAgICAqIEBwYXJhbSA8VD4gICAgICAgICB0aGUgdHlwZSBvZiBvYmplY3QgdG8gYmUgcmVhZC4KKyAgICAgKiBAcGFyYW0gdHlwZSAgICAgICAgdGhlIGNsYXNzIG9mIG9iamVjdCB0byBiZSByZWFkLgorICAgICAqIEBwYXJhbSBnZW5lcmljVHlwZSB0aGUgdHlwZSBvZiBvYmplY3QgdG8gYmUgcHJvZHVjZWQuIEUuZy4gaWYgdGhlIG1lc3NhZ2UgYm9keSBpcworICAgICAqICAgICAgICAgICAgICAgICAgICB0byBiZSBjb252ZXJ0ZWQgaW50byBhIG1ldGhvZCBwYXJhbWV0ZXIsIHRoaXMgd2lsbCBiZSB0aGUgZm9ybWFsIHR5cGUgb2YKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgdGhlIG1ldGhvZCBwYXJhbWV0ZXIgYXMgcmV0dXJuZWQgYnkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAge0Bjb2RlIENsYXNzLmdldEdlbmVyaWNQYXJhbWV0ZXJUeXBlc30uCisgICAgICogQHBhcmFtIGFubm90YXRpb25zIGFuIGFycmF5IG9mIHRoZSBhbm5vdGF0aW9ucyBvbiB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIGFydGlmYWN0CisgICAgICogICAgICAgICAgICAgICAgICAgIHRoYXQgd2lsbCBiZSBpbml0aWFsaXplZCB3aXRoIHRoZSBwcm9kdWNlZCBpbnN0YW5jZS4gRS5nLiBpZiB0aGUgbWVzc2FnZQorICAgICAqICAgICAgICAgICAgICAgICAgICBib2R5IGlzIHRvIGJlIGNvbnZlcnRlZCBpbnRvIGEgbWV0aG9kIHBhcmFtZXRlciwgdGhpcyB3aWxsIGJlIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucyBvbiB0aGF0IHBhcmFtZXRlciByZXR1cm5lZCBieQorICAgICAqICAgICAgICAgICAgICAgICAgICB7QGNvZGUgQ2xhc3MuZ2V0UGFyYW1ldGVyQW5ub3RhdGlvbnN9LgorICAgICAqIEBwYXJhbSBtZWRpYVR5cGUgICB0aGUgbWVkaWEgdHlwZSBvZiB0aGUgZGF0YSB0aGF0IHdpbGwgYmUgcmVhZCwgdGhpcyB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICAgICAgIGNvbXBhcmVkIHRvIHRoZSB2YWx1ZXMgb2Yge0BsaW5rIGphdmF4LndzLnJzLkNvbnN1bWVzfSBmb3IgZWFjaAorICAgICAqICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGUgcmVhZGVyIGFuZCBvbmx5IG1hdGNoaW5nIHJlYWRlcnMgd2lsbCBiZSBxdWVyaWVkLgorICAgICAqIEByZXR1cm4gYSBNZXNzYWdlQm9keVJlYWRlciB0aGF0IG1hdGNoZXMgdGhlIHN1cHBsaWVkIGNyaXRlcmlhIG9yIG51bGwgaWYgbm9uZSBpcworICAgICAqICAgICAgICAgZm91bmQuCisgICAgICovCisgICAgPFQ+IE1lc3NhZ2VCb2R5UmVhZGVyPFQ+IGdldE1lc3NhZ2VCb2R5UmVhZGVyKENsYXNzPFQ+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb24gYW5ub3RhdGlvbnNbXSwgTWVkaWFUeXBlIG1lZGlhVHlwZSk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBtZXNzYWdlIGJvZHkgcmVhZGVyIHRoYXQgbWF0Y2hlcyBhIHNldCBvZiBjcml0ZXJpYS4KKyAgICAgKgorICAgICAqIEBwYXJhbSA8VD4gICAgICAgICAgICAgICAgdGhlIHR5cGUgb2Ygb2JqZWN0IHRvIGJlIHJlYWQuCisgICAgICogQHBhcmFtIHR5cGUgICAgICAgICAgICAgICB0aGUgY2xhc3Mgb2Ygb2JqZWN0IHRvIGJlIHJlYWQuCisgICAgICogQHBhcmFtIGdlbmVyaWNUeXBlICAgICAgICB0aGUgdHlwZSBvZiBvYmplY3QgdG8gYmUgcHJvZHVjZWQuIEUuZy4gaWYgdGhlIG1lc3NhZ2UgYm9keSBpcworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgY29udmVydGVkIGludG8gYSBtZXRob2QgcGFyYW1ldGVyLCB0aGlzIHdpbGwgYmUgdGhlIGZvcm1hbCB0eXBlIG9mCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWV0aG9kIHBhcmFtZXRlciBhcyByZXR1cm5lZCBieQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIENsYXNzLmdldEdlbmVyaWNQYXJhbWV0ZXJUeXBlc30uCisgICAgICogQHBhcmFtIGFubm90YXRpb25zICAgICAgICBhbiBhcnJheSBvZiB0aGUgYW5ub3RhdGlvbnMgb24gdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBhcnRpZmFjdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB3aWxsIGJlIGluaXRpYWxpemVkIHdpdGggdGhlIHByb2R1Y2VkIGluc3RhbmNlLiBFLmcuIGlmIHRoZSBtZXNzYWdlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5IGlzIHRvIGJlIGNvbnZlcnRlZCBpbnRvIGEgbWV0aG9kIHBhcmFtZXRlciwgdGhpcyB3aWxsIGJlIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMgb24gdGhhdCBwYXJhbWV0ZXIgcmV0dXJuZWQgYnkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAY29kZSBDbGFzcy5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9uc30uCisgICAgICogQHBhcmFtIG1lZGlhVHlwZSAgICAgICAgICB0aGUgbWVkaWEgdHlwZSBvZiB0aGUgZGF0YSB0aGF0IHdpbGwgYmUgcmVhZCwgdGhpcyB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJlZCB0byB0aGUgdmFsdWVzIG9mIHtAbGluayBqYXZheC53cy5ycy5Db25zdW1lc30gZm9yIGVhY2gKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZSByZWFkZXIgYW5kIG9ubHkgbWF0Y2hpbmcgcmVhZGVycyB3aWxsIGJlIHF1ZXJpZWQuCisgICAgICogQHBhcmFtIHByb3BlcnRpZXNEZWxlZ2F0ZSByZXF1ZXN0LXNjb3BlZCBwcm9wZXJ0aWVzIGRlbGVnYXRlLgorICAgICAqIEByZXR1cm4gYSBNZXNzYWdlQm9keVJlYWRlciB0aGF0IG1hdGNoZXMgdGhlIHN1cHBsaWVkIGNyaXRlcmlhIG9yIG51bGwgaWYgbm9uZSBpcworICAgICAqICAgICAgICAgZm91bmQuCisgICAgICovCisgICAgPFQ+IE1lc3NhZ2VCb2R5UmVhZGVyPFQ+IGdldE1lc3NhZ2VCb2R5UmVhZGVyKENsYXNzPFQ+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb24gYW5ub3RhdGlvbnNbXSwgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydGllc0RlbGVnYXRlIHByb3BlcnRpZXNEZWxlZ2F0ZSk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBtZXNzYWdlIGJvZHkgd3JpdGVyIHRoYXQgbWF0Y2hlcyBhIHNldCBvZiBjcml0ZXJpYS4KKyAgICAgKgorICAgICAqIEBwYXJhbSA8VD4gICAgICAgICB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IHRoYXQgaXMgdG8gYmUgd3JpdHRlbi4KKyAgICAgKiBAcGFyYW0gdHlwZSAgICAgICAgdGhlIGNsYXNzIG9mIG9iamVjdCB0aGF0IGlzIHRvIGJlIHdyaXR0ZW4uCisgICAgICogQHBhcmFtIGdlbmVyaWNUeXBlIHRoZSB0eXBlIG9mIG9iamVjdCB0byBiZSB3cml0dGVuLiBFLmcuIGlmIHRoZSBtZXNzYWdlIGJvZHkgaXMgdG8KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgYmUgcHJvZHVjZWQgZnJvbSBhIGZpZWxkLCB0aGlzIHdpbGwgYmUgdGhlIGRlY2xhcmVkIHR5cGUgb2YgdGhlIGZpZWxkIGFzCisgICAgICogICAgICAgICAgICAgICAgICAgIHJldHVybmVkIGJ5IHtAY29kZSBGaWVsZC5nZXRHZW5lcmljVHlwZX0uCisgICAgICogQHBhcmFtIGFubm90YXRpb25zIGFuIGFycmF5IG9mIHRoZSBhbm5vdGF0aW9ucyBvbiB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIGFydGlmYWN0CisgICAgICogICAgICAgICAgICAgICAgICAgIHRoYXQgd2lsbCBiZSB3cml0dGVuLiBFLmcuIGlmIHRoZSBtZXNzYWdlIGJvZHkgaXMgdG8gYmUgcHJvZHVjZWQgZnJvbSBhCisgICAgICogICAgICAgICAgICAgICAgICAgIGZpZWxkLCB0aGlzIHdpbGwgYmUgdGhlIGFubm90YXRpb25zIG9uIHRoYXQgZmllbGQgcmV0dXJuZWQgYnkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAge0Bjb2RlIEZpZWxkLmdldERlY2xhcmVkQW5ub3RhdGlvbnN9LgorICAgICAqIEBwYXJhbSBtZWRpYVR5cGUgICB0aGUgbWVkaWEgdHlwZSBvZiB0aGUgZGF0YSB0aGF0IHdpbGwgYmUgd3JpdHRlbiwgdGhpcyB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICAgICAgIGNvbXBhcmVkIHRvIHRoZSB2YWx1ZXMgb2Yge0BsaW5rIGphdmF4LndzLnJzLlByb2R1Y2VzfSBmb3IgZWFjaAorICAgICAqICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGUgd3JpdGVyIGFuZCBvbmx5IG1hdGNoaW5nIHdyaXRlcnMgd2lsbCBiZSBxdWVyaWVkLgorICAgICAqIEByZXR1cm4gYSBNZXNzYWdlQm9keVJlYWRlciB0aGF0IG1hdGNoZXMgdGhlIHN1cHBsaWVkIGNyaXRlcmlhIG9yIG51bGwgaWYgbm9uZSBpcworICAgICAqICAgICAgICAgZm91bmQuCisgICAgICovCisgICAgPFQ+IE1lc3NhZ2VCb2R5V3JpdGVyPFQ+IGdldE1lc3NhZ2VCb2R5V3JpdGVyKENsYXNzPFQ+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb24gYW5ub3RhdGlvbnNbXSwgTWVkaWFUeXBlIG1lZGlhVHlwZSk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBtZXNzYWdlIGJvZHkgd3JpdGVyIHRoYXQgbWF0Y2hlcyBhIHNldCBvZiBjcml0ZXJpYS4KKyAgICAgKgorICAgICAqIEBwYXJhbSA8VD4gICAgICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIG9iamVjdCB0aGF0IGlzIHRvIGJlIHdyaXR0ZW4uCisgICAgICogQHBhcmFtIHR5cGUgICAgICAgICAgICAgICB0aGUgY2xhc3Mgb2Ygb2JqZWN0IHRoYXQgaXMgdG8gYmUgd3JpdHRlbi4KKyAgICAgKiBAcGFyYW0gZ2VuZXJpY1R5cGUgICAgICAgIHRoZSB0eXBlIG9mIG9iamVjdCB0byBiZSB3cml0dGVuLiBFLmcuIGlmIHRoZSBtZXNzYWdlIGJvZHkgaXMgdG8KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHByb2R1Y2VkIGZyb20gYSBmaWVsZCwgdGhpcyB3aWxsIGJlIHRoZSBkZWNsYXJlZCB0eXBlIG9mIHRoZSBmaWVsZCBhcworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQgYnkge0Bjb2RlIEZpZWxkLmdldEdlbmVyaWNUeXBlfS4KKyAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbnMgICAgICAgIGFuIGFycmF5IG9mIHRoZSBhbm5vdGF0aW9ucyBvbiB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIGFydGlmYWN0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHdpbGwgYmUgd3JpdHRlbi4gRS5nLiBpZiB0aGUgbWVzc2FnZSBib2R5IGlzIHRvIGJlIHByb2R1Y2VkIGZyb20gYQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQsIHRoaXMgd2lsbCBiZSB0aGUgYW5ub3RhdGlvbnMgb24gdGhhdCBmaWVsZCByZXR1cm5lZCBieQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIEZpZWxkLmdldERlY2xhcmVkQW5ub3RhdGlvbnN9LgorICAgICAqIEBwYXJhbSBtZWRpYVR5cGUgICAgICAgICAgdGhlIG1lZGlhIHR5cGUgb2YgdGhlIGRhdGEgdGhhdCB3aWxsIGJlIHdyaXR0ZW4sIHRoaXMgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyZWQgdG8gdGhlIHZhbHVlcyBvZiB7QGxpbmsgamF2YXgud3MucnMuUHJvZHVjZXN9IGZvciBlYWNoCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGUgd3JpdGVyIGFuZCBvbmx5IG1hdGNoaW5nIHdyaXRlcnMgd2lsbCBiZSBxdWVyaWVkLgorICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzRGVsZWdhdGUgcmVxdWVzdC1zY29wZWQgcHJvcGVydGllcyBkZWxlZ2F0ZS4KKyAgICAgKiBAcmV0dXJuIGEgTWVzc2FnZUJvZHlSZWFkZXIgdGhhdCBtYXRjaGVzIHRoZSBzdXBwbGllZCBjcml0ZXJpYSBvciBudWxsIGlmIG5vbmUgaXMKKyAgICAgKiAgICAgICAgIGZvdW5kLgorICAgICAqLworICAgIDxUPiBNZXNzYWdlQm9keVdyaXRlcjxUPiBnZXRNZXNzYWdlQm9keVdyaXRlcihDbGFzczxUPiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uIGFubm90YXRpb25zW10sIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnRpZXNEZWxlZ2F0ZSBwcm9wZXJ0aWVzRGVsZWdhdGUpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsaXN0IG9mIG1lZGlhIHR5cGVzIHN1cHBvcnRlZCBmb3IgYSBKYXZhIHR5cGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSAgICAgICAgdGhlIGNsYXNzIG9mIG9iamVjdCB0aGF0IGlzIHRvIGJlIHJlYWQuCisgICAgICogQHBhcmFtIGdlbmVyaWNUeXBlIHRoZSB0eXBlIG9mIG9iamVjdCB0byBiZSByZWFkLiBFLmcuIGlmIHRoZSBtZXNzYWdlIGJvZHkgaXMgdG8gYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgcmVhZCBhcyBhIG1ldGhvZCBwYXJhbWV0ZXIsIHRoaXMgd2lsbCBiZSB0aGUgZGVjbGFyZWQgdHlwZSBvZiB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIGFzIHJldHVybmVkIGJ5IHtAY29kZSBNZXRob2QuZ2V0R2VuZXJpY1BhcmFtZXRlclR5cGVzfS4KKyAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbnMgYW4gYXJyYXkgb2YgdGhlIGFubm90YXRpb25zIG9uIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgYXJ0aWZhY3QKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgdGhhdCB3aWxsIGJlIHJlYWQuIEUuZy4gaWYgdGhlIG1lc3NhZ2UgYm9keSBpcyB0byBiZSBjb25zdW1lZCBhcyBhCisgICAgICogICAgICAgICAgICAgICAgICAgIG1ldGhvZCBwYXJhbWV0ZXIsIHRoaXMgd2lsbCBiZSB0aGUgYW5ub3RhdGlvbnMgb24gdGhhdCBwYXJhbWV0ZXIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQgYnkge0Bjb2RlIE1ldGhvZC5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9uc30uCisgICAgICogQHJldHVybiB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgbWVkaWEgdHlwZXMsIHRoZSBsaXN0IGlzIG9yZGVyZWQgYXMgZm9sbG93czogYS9iICZsdAorICAgICAqICAgICAgICAgYS8qICZsdCAqXFwvKgorICAgICAqLworICAgIExpc3Q8TWVkaWFUeXBlPiBnZXRNZXNzYWdlQm9keVJlYWRlck1lZGlhVHlwZXMoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbGlzdCBvZiBtZWRpYSB0eXBlcyBzdXBwb3J0ZWQgZm9yIGEgSmF2YSB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgICAgICAgIHRoZSBjbGFzcyBvZiBvYmplY3QgdGhhdCBpcyB0byBiZSByZWFkLgorICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIG1lZGlhIHR5cGVzLCB0aGUgbGlzdCBpcyBvcmRlcmVkIGFzIGZvbGxvd3M6IGEvYiAmbHQKKyAgICAgKiAgICAgICAgIGEvKiAmbHQgKlxcLyoKKyAgICAgKi8KKyAgICBMaXN0PE1lZGlhVHlwZT4gZ2V0TWVzc2FnZUJvZHlSZWFkZXJNZWRpYVR5cGVzQnlUeXBlKENsYXNzPD8+IHR5cGUpOworCisgICAgLyoqCisgICAgICogR2V0IGEgbGlzdCBvZiB7QGNvZGUgTWVzc2FnZUJvZHlSZWFkZXJ9cyB0aGF0IGFyZSBzdWl0YWJsZSBmb3IgdGhlIGdpdmVuIHtAY29kZSB0eXBlfS4gVGhlIGxpc3QgaXMgc29ydGVkIGJhc2VkIG9uIHRoZQorICAgICAqIGNsYXNzIGhpZXJhcmNoeSAobW9zdCBzcGVjaWZpYyByZWFkZXJzIGFyZSBmaXJzdCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSB0aGUgY2xhc3Mgb2Ygb2JqZWN0IHJlYWRlcnMgYXJlIHJlcXVlc3RlZCBmb3IuCisgICAgICogQHJldHVybiB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQge0Bjb2RlIE1lc3NhZ2VCb2R5UmVhZGVyfXMgZm9yIGdpdmVuIGNsYXNzLgorICAgICAqLworICAgIExpc3Q8TWVzc2FnZUJvZHlSZWFkZXI+IGdldE1lc3NhZ2VCb2R5UmVhZGVyc0ZvclR5cGUoQ2xhc3M8Pz4gdHlwZSk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBsaXN0IG9mIHtAY29kZSBNZXNzYWdlQm9keVJlYWRlcn0gbW9kZWxzIHRoYXQgYXJlIHN1aXRhYmxlIGZvciB0aGUgZ2l2ZW4ge0Bjb2RlIHR5cGV9LgorICAgICAqCisgICAgICogVGhlIGxpc3QgaXMgc29ydGVkIGJhc2VkIG9uIHRoZSBjbGFzcyBoaWVyYXJjaHkgKG1vc3Qgc3BlY2lmaWMgcmVhZGVycyBhcmUgZmlyc3QpLgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgdGhlIGNsYXNzIG9mIG9iamVjdCByZWFkZXJzIGFyZSByZXF1ZXN0ZWQgZm9yLgorICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIHtAY29kZSBNZXNzYWdlQm9keVJlYWRlcn0gbW9kZWxzIGZvciBnaXZlbiBjbGFzcy4KKyAgICAgKiBAc2luY2UgMi4xNgorICAgICAqLworICAgIExpc3Q8UmVhZGVyTW9kZWw+IGdldFJlYWRlck1vZGVsc0ZvclR5cGUoQ2xhc3M8Pz4gdHlwZSk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGxpc3Qgb2YgbWVkaWEgdHlwZXMgc3VwcG9ydGVkIGZvciBhIEphdmEgdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlICAgICAgICB0aGUgY2xhc3Mgb2Ygb2JqZWN0IHRoYXQgaXMgdG8gYmUgd3JpdHRlbi4KKyAgICAgKiBAcGFyYW0gZ2VuZXJpY1R5cGUgdGhlIHR5cGUgb2Ygb2JqZWN0IHRvIGJlIHdyaXR0ZW4uIEUuZy4gaWYgdGhlIG1lc3NhZ2UgYm9keSBpcyB0bworICAgICAqICAgICAgICAgICAgICAgICAgICBiZSBwcm9kdWNlZCBmcm9tIGEgZmllbGQsIHRoaXMgd2lsbCBiZSB0aGUgZGVjbGFyZWQgdHlwZSBvZiB0aGUgZmllbGQgYXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQgYnkge0Bjb2RlIEZpZWxkLmdldEdlbmVyaWNUeXBlfS4KKyAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbnMgYW4gYXJyYXkgb2YgdGhlIGFubm90YXRpb25zIG9uIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgYXJ0aWZhY3QKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgdGhhdCB3aWxsIGJlIHdyaXR0ZW4uIEUuZy4gaWYgdGhlIG1lc3NhZ2UgYm9keSBpcyB0byBiZSBwcm9kdWNlZCBmcm9tIGEKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgZmllbGQsIHRoaXMgd2lsbCBiZSB0aGUgYW5ub3RhdGlvbnMgb24gdGhhdCBmaWVsZCByZXR1cm5lZCBieQorICAgICAqICAgICAgICAgICAgICAgICAgICB7QGNvZGUgRmllbGQuZ2V0RGVjbGFyZWRBbm5vdGF0aW9uc30uCisgICAgICogQHJldHVybiB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgbWVkaWEgdHlwZXMsIHRoZSBsaXN0IGlzIG9yZGVyZWQgYXMgZm9sbG93czogYS9iICZsdAorICAgICAqICAgICAgICAgYS8qICZsdCAqXFwvKgorICAgICAqLworICAgIExpc3Q8TWVkaWFUeXBlPiBnZXRNZXNzYWdlQm9keVdyaXRlck1lZGlhVHlwZXMoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbGlzdCBvZiBtZWRpYSB0eXBlcyBzdXBwb3J0ZWQgZm9yIGEgSmF2YSB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgICAgICAgIHRoZSBjbGFzcyBvZiBvYmplY3QgdGhhdCBpcyB0byBiZSB3cml0dGVuLgorICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIG1lZGlhIHR5cGVzLCB0aGUgbGlzdCBpcyBvcmRlcmVkIGFzIGZvbGxvd3M6IGEvYiAmbHQKKyAgICAgKiAgICAgICAgIGEvKiAmbHQgKlxcLyoKKyAgICAgKi8KKyAgICBMaXN0PE1lZGlhVHlwZT4gZ2V0TWVzc2FnZUJvZHlXcml0ZXJNZWRpYVR5cGVzQnlUeXBlKENsYXNzPD8+IHR5cGUpOworCisgICAgLyoqCisgICAgICogR2V0IGEgbGlzdCBvZiB7QGNvZGUgTWVzc2FnZUJvZHlXcml0ZXJ9cyB0aGF0IGFyZSBzdWl0YWJsZSBmb3IgdGhlIGdpdmVuIHtAY29kZSB0eXBlfS4gVGhlIGxpc3QgaXMgc29ydGVkIGJhc2VkIG9uIHRoZQorICAgICAqIGNsYXNzIGhpZXJhcmNoeSAobW9zdCBzcGVjaWZpYyB3cml0ZXJzIGFyZSBmaXJzdCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSB0aGUgY2xhc3Mgb2Ygb2JqZWN0IHdyaXRlcnMgYXJlIHJlcXVlc3RlZCBmb3IuCisgICAgICogQHJldHVybiB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQge0Bjb2RlIE1lc3NhZ2VCb2R5V3JpdGVyfXMgZm9yIGdpdmVuIGNsYXNzLgorICAgICAqLworICAgIExpc3Q8TWVzc2FnZUJvZHlXcml0ZXI+IGdldE1lc3NhZ2VCb2R5V3JpdGVyc0ZvclR5cGUoQ2xhc3M8Pz4gdHlwZSk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBsaXN0IG9mIHtAY29kZSBNZXNzYWdlQm9keVdyaXRlcn0gbW9kZWxzIHRoYXQgYXJlIHN1aXRhYmxlIGZvciB0aGUgZ2l2ZW4ge0Bjb2RlIHR5cGV9LgorICAgICAqCisgICAgICogVGhlIGxpc3QgaXMgc29ydGVkIGJhc2VkIG9uIHRoZSBjbGFzcyBoaWVyYXJjaHkgKG1vc3Qgc3BlY2lmaWMgd3JpdGVycyBhcmUgZmlyc3QpLgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgdGhlIGNsYXNzIG9mIG9iamVjdCB3cml0ZXJzIGFyZSByZXF1ZXN0ZWQgZm9yLgorICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIHtAY29kZSBNZXNzYWdlQm9keVdyaXRlcn0gbW9kZWxzIGZvciBnaXZlbiBjbGFzcy4KKyAgICAgKiBAc2luY2UgMi4xNgorICAgICAqLworICAgIExpc3Q8V3JpdGVyTW9kZWw+IGdldFdyaXRlcnNNb2RlbHNGb3JUeXBlKENsYXNzPD8+IHR5cGUpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBtb3N0IGFjY2VwdGFibGUgbWVkaWEgdHlwZSBzdXBwb3J0ZWQgZm9yIGEgSmF2YSB0eXBlIGdpdmVuIGEgc2V0IG9mCisgICAgICogYWNjZXB0YWJsZSBtZWRpYSB0eXBlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlICAgICAgICAgICAgICAgICB0aGUgY2xhc3Mgb2Ygb2JqZWN0IHRoYXQgaXMgdG8gYmUgd3JpdHRlbi4KKyAgICAgKiBAcGFyYW0gZ2VuZXJpY1R5cGUgICAgICAgICAgdGhlIHR5cGUgb2Ygb2JqZWN0IHRvIGJlIHdyaXR0ZW4uIEUuZy4gaWYgdGhlIG1lc3NhZ2UgYm9keSBpcyB0bworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBwcm9kdWNlZCBmcm9tIGEgZmllbGQsIHRoaXMgd2lsbCBiZSB0aGUgZGVjbGFyZWQgdHlwZSBvZiB0aGUgZmllbGQgYXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWQgYnkge0Bjb2RlIEZpZWxkLmdldEdlbmVyaWNUeXBlfS4KKyAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbnMgICAgICAgICAgYW4gYXJyYXkgb2YgdGhlIGFubm90YXRpb25zIG9uIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgYXJ0aWZhY3QKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCB3aWxsIGJlIHdyaXR0ZW4uIEUuZy4gaWYgdGhlIG1lc3NhZ2UgYm9keSBpcyB0byBiZSBwcm9kdWNlZCBmcm9tIGEKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQsIHRoaXMgd2lsbCBiZSB0aGUgYW5ub3RhdGlvbnMgb24gdGhhdCBmaWVsZCByZXR1cm5lZCBieQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7QGNvZGUgRmllbGQuZ2V0RGVjbGFyZWRBbm5vdGF0aW9uc30uCisgICAgICogQHBhcmFtIGFjY2VwdGFibGVNZWRpYVR5cGVzIHRoZSBsaXN0IG9mIGFjY2VwdGFibGUgbWVkaWEgdHlwZXMsIHNvcnRlZCBhY2NvcmRpbmcgdG8KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHF1YWxpdHkgd2l0aCB0aGUgbWVkaWEgdHlwZSBvZiBoaWdoZXN0IHF1YWxpdHkgb2NjdXJyaW5nIGZpcnN0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0LgorICAgICAqIEByZXR1cm4gdGhlIGJlc3QgbWVkaWEgdHlwZXMKKyAgICAgKi8KKyAgICBNZWRpYVR5cGUgZ2V0TWVzc2FnZUJvZHlXcml0ZXJNZWRpYVR5cGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1lZGlhVHlwZT4gYWNjZXB0YWJsZU1lZGlhVHlwZXMpOworCisgICAgLyoqCisgICAgICogUmVhZHMgYSB0eXBlIGZyb20gdGhlIHtAbGluayBJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW19IHVzaW5nIGludGVyY2VwdG9ycy4gSWYgdGhlCisgICAgICogcGFyYW1ldGVyIHtAY29kZSBpbnRlcmNlcHR9IGlzIHRydWUgdGhlbiB7QGxpbmsgUmVhZGVySW50ZXJjZXB0b3IgcmVhZGVyCisgICAgICogaW50ZXJjZXB0b3JzfSBhcmUgZXhlY3V0ZWQgYmVmb3JlIGNhbGxpbmcgdGhlIHtAbGluayBNZXNzYWdlQm9keVJlYWRlciBtZXNzYWdlCisgICAgICogYm9keSByZWFkZXJ9LiBUaGUgYXBwcm9wcmlhdGUge0BsaW5rIE1lc3NhZ2VCb2R5UmVhZGVyIG1lc3NhZ2UgYm9keSByZWFkZXJ9IGlzCisgICAgICogY2hvc2VuIGFmdGVyIHRoZSBpbnRlcmNlcHRvciBleGVjdXRpb24gYmFzZWQgb24gcGFyYW1ldGVyIHBhc3NlZCB0byB0aGlzIG1ldGhvZAorICAgICAqIGFuZCBtb2RpZmllZCBieSB0aGUgaW50ZXJjZXB0b3JzLgorICAgICAqCisgICAgICogQHBhcmFtIHJhd1R5cGUgICAgICAgICAgICByYXcgSmF2YSBlbnRpdHkgdHlwZS4KKyAgICAgKiBAcGFyYW0gdHlwZSAgICAgICAgICAgICAgIGdlbmVyaWMgSmF2YSBlbnRpdHkgdHlwZS4KKyAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbnMgICAgICAgIGFuIGFycmF5IG9mIHRoZSBhbm5vdGF0aW9ucyBvbiB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIGFydGlmYWN0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHdpbGwgYmUgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgcHJvZHVjZWQgaW5zdGFuY2UuIEUuZy4gaWYgdGhlIG1lc3NhZ2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgaXMgdG8gYmUgY29udmVydGVkIGludG8gYSBtZXRob2QgcGFyYW1ldGVyLCB0aGlzIHdpbGwgYmUgdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucyBvbiB0aGF0IHBhcmFtZXRlciByZXR1cm5lZCBieQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIE1ldGhvZC5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9uc30uCisgICAgICogQHBhcmFtIG1lZGlhVHlwZSAgICAgICAgICB0aGUgbWVkaWEgdHlwZSBvZiB0aGUgSFRUUCBlbnRpdHkuCisgICAgICogQHBhcmFtIGh0dHBIZWFkZXJzICAgICAgICB0aGUgbXV0YWJsZSBIVFRQIGhlYWRlcnMgYXNzb2NpYXRlZCB3aXRoIEhUVFAgZW50aXR5LgorICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzRGVsZWdhdGUgcmVxdWVzdC1zY29wZWQgcHJvcGVydGllcyBkZWxlZ2F0ZS4KKyAgICAgKiBAcGFyYW0gZW50aXR5U3RyZWFtICAgICAgIHRoZSB7QGxpbmsgSW5wdXRTdHJlYW19IG9mIHRoZSBIVFRQIGVudGl0eS4gVGhlIHN0cmVhbSBpcyBub3QKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlZCBhZnRlciByZWFkaW5nIHRoZSBlbnRpdHkuCisgICAgICogQHBhcmFtIHJlYWRlckludGVyY2VwdG9ycyBSZWFkZXIgaW50ZXJjZXB0b3IgdGhhdCBhcmUgdG8gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlIHJlYWRpbmcgb2YgYW4gZW50aXR5LiBUaGUgaW50ZXJjZXB0b3JzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGV4ZWN1dGVkIGluIHRoZSBzYW1lIG9yZGVyIGFzIGdpdmVuIGluIHRoaXMgcGFyYW1ldGVyLgorICAgICAqIEBwYXJhbSB0cmFuc2xhdGVOY2UgICAgICAgaWYge0Bjb2RlIHRydWV9LCB0aGUge0BsaW5rIGphdmF4LndzLnJzLmNvcmUuTm9Db250ZW50RXhjZXB0aW9ufSB0aHJvd24gYnkgYSBzZWxlY3RlZCBtZXNzYWdlIGJvZHkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlciB3aWxsIGJlIHRyYW5zbGF0ZWQgaW50byBhIHtAbGluayBqYXZheC53cy5ycy5CYWRSZXF1ZXN0RXhjZXB0aW9ufSBhcyByZXF1aXJlZCBieQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYLVJTIHNwZWNpZmljYXRpb24gb24gdGhlIHNlcnZlciBzaWRlLgorICAgICAqIEByZXR1cm4gdGhlIGVudGl0eSB0aGF0IHdhcyByZWFkIGZyb20gdGhlIHtAY29kZSBlbnRpdHlTdHJlYW19LgorICAgICAqIEB0aHJvd3MgV2ViQXBwbGljYXRpb25FeGNlcHRpb24gVGhyb3duIHdoZW4ge0BsaW5rIE1lc3NhZ2VCb2R5UmVhZGVyIG1lc3NhZ2UgYm9keQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyfSBmYWlscy4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uICAgICAgICAgICAgIFRocm93biB3aGVuIHJlYWRpbmcgZnJvbSB0aGUge0Bjb2RlIGVudGl0eVN0cmVhbX0gZmFpbHMuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCByZWFkRnJvbShDbGFzczw/PiByYXdUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnRpZXNEZWxlZ2F0ZSBwcm9wZXJ0aWVzRGVsZWdhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGVyYWJsZTxSZWFkZXJJbnRlcmNlcHRvcj4gcmVhZGVySW50ZXJjZXB0b3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiB0cmFuc2xhdGVOY2UpCisgICAgICAgICAgICB0aHJvd3MgV2ViQXBwbGljYXRpb25FeGNlcHRpb24sIElPRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogV3JpdGVycyBhIHR5cGUgdG8gdGhlIHtAbGluayBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtfSB1c2luZyBpbnRlcmNlcHRvcnMuIElmIHRoZQorICAgICAqIHBhcmFtZXRlciB7QGNvZGUgaW50ZXJjZXB0fSBpcyB0cnVlIHRoZW4ge0BsaW5rIFdyaXRlckludGVyY2VwdG9yIHdyaXRlcgorICAgICAqIGludGVyY2VwdG9yc30gYXJlIGV4ZWN1dGVkIGJlZm9yZSBjYWxsaW5nIHRoZSB7QGxpbmsgTWVzc2FnZUJvZHlXcml0ZXIgbWVzc2FnZQorICAgICAqIGJvZHkgd3JpdGVyfS4gVGhlIGFwcHJvcHJpYXRlIHtAbGluayBNZXNzYWdlQm9keVdyaXRlciBtZXNzYWdlIGJvZHkgd3JpdGVyfSBpcworICAgICAqIGNob3NlbiBhZnRlciB0aGUgaW50ZXJjZXB0b3IgZXhlY3V0aW9uIGJhc2VkIG9uIHBhcmFtZXRlciBwYXNzZWQgdG8gdGhpcyBtZXRob2QKKyAgICAgKiBhbmQgbW9kaWZpZWQgYnkgdGhlIGludGVyY2VwdG9ycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbnRpdHkgICAgICAgICAgICAgRW50aXR5IHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGVudGl0eVN0cmVhbQorICAgICAqIEBwYXJhbSByYXdUeXBlICAgICAgICAgICAgcmF3IEphdmEgZW50aXR5IHR5cGUuCisgICAgICogQHBhcmFtIHR5cGUgICAgICAgICAgICAgICBnZW5lcmljIEphdmEgZW50aXR5IHR5cGUuCisgICAgICogQHBhcmFtIGFubm90YXRpb25zICAgICAgICBhbiBhcnJheSBvZiB0aGUgYW5ub3RhdGlvbnMgb24gdGhlIHJlc291cmNlIG1ldGhvZCB0aGF0IHJldHVybnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBvYmplY3QuCisgICAgICogQHBhcmFtIG1lZGlhVHlwZSAgICAgICAgICB0aGUgbWVkaWEgdHlwZSBvZiB0aGUgSFRUUCBlbnRpdHkuCisgICAgICogQHBhcmFtIGh0dHBIZWFkZXJzICAgICAgICB0aGUgbXV0YWJsZSBIVFRQIGhlYWRlcnMgYXNzb2NpYXRlZCB3aXRoIEhUVFAgZW50aXR5LgorICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzRGVsZWdhdGUgcmVxdWVzdC1zY29wZWQgcHJvcGVydGllcyBkZWxlZ2F0ZS4KKyAgICAgKiBAcGFyYW0gZW50aXR5U3RyZWFtICAgICAgIHRoZSB7QGxpbmsgT3V0cHV0U3RyZWFtfSBmb3IgdGhlIEhUVFAgZW50aXR5LgorICAgICAqIEBwYXJhbSB3cml0ZXJJbnRlcmNlcHRvcnMgV3JpdGVyIGludGVyY2VwdG9yIHRoYXQgYXJlIHRvIGJlIHVzZWQgdG8gaW50ZXJjZXB0IHRoZSB3cml0aW5nIG9mIGFuIGVudGl0eS4gVGhlIGludGVyY2VwdG9ycworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBleGVjdXRlZCBpbiB0aGUgc2FtZSBvcmRlciBhcyBnaXZlbiBpbiB0aGlzIHBhcmFtZXRlci4KKyAgICAgKiBAcmV0dXJuIE91dGVyIG91dHB1dCBzdHJlYW0gdGhhdCBzaG91bGQgYmUgY2xvc2VkIGJ5IHRoZSBjYWxsZXIuCisgICAgICogQHRocm93cyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiBUaHJvd24gd2hlbiB7QGxpbmsgTWVzc2FnZUJvZHlSZWFkZXIgbWVzc2FnZSBib2R5CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXJ9IGZhaWxzLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gICAgICAgICAgICAgVGhyb3duIHdoZW4gcmVhZGluZyBmcm9tIHRoZSB7QGNvZGUgZW50aXR5U3RyZWFtfSBmYWlscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIHdyaXRlVG8oT2JqZWN0IGVudGl0eSwgQ2xhc3M8Pz4gcmF3VHlwZSwgVHlwZSB0eXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywgUHJvcGVydGllc0RlbGVnYXRlIHByb3BlcnRpZXNEZWxlZ2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmFibGU8V3JpdGVySW50ZXJjZXB0b3I+IHdyaXRlckludGVyY2VwdG9ycykKKyAgICAgICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKKworfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL01lc3NhZ2VQcm9wZXJ0aWVzLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvTWVzc2FnZVByb3BlcnRpZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yN2ZjY2JjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL01lc3NhZ2VQcm9wZXJ0aWVzLmphdmEKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUHJvcGVydGllc0NsYXNzOworCisvKioKKyAqIEplcnNleSBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgZm9yIG1lc3NhZ2UgJiBlbnRpdHkgcHJvY2Vzc2luZy4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitAUHJvcGVydGllc0NsYXNzCitwdWJsaWMgZmluYWwgY2xhc3MgTWVzc2FnZVByb3BlcnRpZXMgeworCisgICAgLyoqCisgICAgICogSWYgc2V0IHRvIHtAY29kZSB0cnVlfSB0aGVuIFhNTCByb290IGVsZW1lbnQgdGFnIG5hbWUgZm9yIGNvbGxlY3Rpb25zIHdpbGwKKyAgICAgKiBiZSBkZXJpdmVkIGZyb20ge0BsaW5rIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQgQFhtbFJvb3RFbGVtZW50fQorICAgICAqIGFubm90YXRpb24gdmFsdWUgYW5kIHdvbid0IGJlIGRlLWNhcGl0YWxpemVkLgorICAgICAqIDxwIC8+CisgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMge0Bjb2RlIGZhbHNlfS4KKyAgICAgKiA8cCAvPgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDxjb2RlPntAdmFsdWV9PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKQVhCX1BST0NFU1NfWE1MX1JPT1RfRUxFTUVOVCA9ICJqZXJzZXkuY29uZmlnLmpheGIuY29sbGVjdGlvbnMucHJvY2Vzc1htbFJvb3RFbGVtZW50IjsKKworICAgIC8qKgorICAgICAqIElmIHNldCB0byB7QGNvZGUgdHJ1ZX0gWE1MIHNlY3VyaXR5IGZlYXR1cmVzIHdoZW4gcGFyc2luZyBYTUwgZG9jdW1lbnRzIHdpbGwgYmUKKyAgICAgKiBkaXNhYmxlZC4KKyAgICAgKiA8cCAvPgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHtAY29kZSBmYWxzZX0uCisgICAgICogPHAgLz4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8Y29kZT57QHZhbHVlfTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWE1MX1NFQ1VSSVRZX0RJU0FCTEUgPSAiamVyc2V5LmNvbmZpZy54bWwuc2VjdXJpdHkuZGlzYWJsZSI7CisKKyAgICAvKioKKyAgICAgKiBJZiBzZXQgdG8ge0Bjb2RlIHRydWV9IGluZGljYXRlcyB0aGF0IHByb2R1Y2VkIFhNTCBvdXRwdXQgc2hvdWxkIGJlIGZvcm1hdHRlZAorICAgICAqIGlmIHBvc3NpYmxlIChzZWUgYmVsb3cpLgorICAgICAqIDxwIC8+CisgICAgICogQSBYTUwgbWVzc2FnZSBlbnRpdHkgd3JpdHRlbiBieSBhIHtAbGluayBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXJ9CisgICAgICogbWF5IGJlIGZvcm1hdHRlZCBmb3IgdGhlIHB1cnBvc2VzIG9mIGh1bWFuIHJlYWRhYmlsaXR5IHByb3ZpZGVkIHRoZSByZXNwZWN0aXZlCisgICAgICoge0Bjb2RlIE1lc3NhZ2VCb2R5V3JpdGVyfSBzdXBwb3J0cyBYTUwgb3V0cHV0IGZvcm1hdHRpbmcuIEFsbCBKQVhCLWJhc2VkIG1lc3NhZ2UKKyAgICAgKiBib2R5IHdyaXRlcnMgc3VwcG9ydCB0aGlzIHByb3BlcnR5LgorICAgICAqIDxwIC8+CisgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMge0Bjb2RlIGZhbHNlfS4KKyAgICAgKiA8cCAvPgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDxjb2RlPntAdmFsdWV9PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRk9STUFUX09VVFBVVCA9ICJqZXJzZXkuY29uZmlnLnhtbC5mb3JtYXRPdXRwdXQiOworCisgICAgLyoqCisgICAgICogVmFsdWUgb2YgdGhlIHByb3BlcnR5IGluZGljYXRlcyB0aGUgYnVmZmVyIHNpemUgdG8gYmUgdXNlZCBmb3IgSS9PIG9wZXJhdGlvbnMKKyAgICAgKiBvbiBieXRlIGFuZCBjaGFyYWN0ZXIgc3RyZWFtcy4gVGhlIHByb3BlcnR5IHZhbHVlIGlzIGV4cGVjdGVkIHRvIGJlIGEgcG9zaXRpdmUKKyAgICAgKiBpbnRlZ2VyIG90aGVyd2lzZSBpdCB3aWxsIGJlIGlnbm9yZWQuCisgICAgICogPHAgLz4KKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyA8Y29kZT57QHZhbHVlICNJT19ERUZBVUxUX0JVRkZFUl9TSVpFfTwvY29kZT4uCisgICAgICogPHAgLz4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8Y29kZT57QHZhbHVlfTwvY29kZT4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU9fQlVGRkVSX1NJWkUgPSAiamVyc2V5LmNvbmZpZy5pby5idWZmZXJTaXplIjsKKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IGJ1ZmZlciBzaXplICh7QHZhbHVlfSkgZm9yIEkvTyBvcGVyYXRpb25zIG9uIGJ5dGUgYW5kIGNoYXJhY3RlcgorICAgICAqIHN0cmVhbXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU9fREVGQVVMVF9CVUZGRVJfU0laRSA9IDgxOTI7CisKKyAgICAvKioKKyAgICAgKiBJZiBzZXQgdG8ge0Bjb2RlIHRydWV9LCB7QGNvZGUgRGVmbGF0ZUVuY29kZXIgZGVmbGF0ZSBlbmNvZGluZyBpbnRlcmNlcHRvcn0gd2lsbCB1c2Ugbm9uLXN0YW5kYXJkIHZlcnNpb24KKyAgICAgKiBvZiB0aGUgZGVmbGF0ZSBjb250ZW50IGVuY29kaW5nLCBza2lwcGluZyB0aGUgemxpYiB3cmFwcGVyLiBVbmZvcnR1bmF0ZWx5LCBkZWZsYXRlIGVuY29kaW5nCisgICAgICogaW1wbGVtZW50YXRpb25zIGluIHNvbWUgcHJvZHVjdHMgdXNlIHRoaXMgbm9uLWNvbXBsaWFudCB2ZXJzaW9uLCBoZW5jZSB0aGUgc3dpdGNoLgorICAgICAqIDxwIC8+CisgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMge0Bjb2RlIGZhbHNlfS4KKyAgICAgKiA8cCAvPgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDxjb2RlPntAdmFsdWV9PC9jb2RlPi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZMQVRFX1dJVEhPVVRfWkxJQiA9ICJqZXJzZXkuY29uZmlnLmRlZmxhdGUubm96bGliIjsKKworICAgIC8qKgorICAgICAqIElmIHNldCB0byB7QGNvZGUgdHJ1ZX0sIHtAbGluayBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXIgTWVzc2FnZUJvZHlSZWFkZXJzfSBhbmQKKyAgICAgKiB7QGxpbmsgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyIE1lc3NhZ2VCb2R5V3JpdGVyc30gd2lsbCBiZSBvcmRlcmVkIGJ5IHJ1bGVzIGZyb20gSkFYLVJTIDEueCwgd2hlcmUgY3VzdG9tCisgICAgICogcHJvdmlkZXJzIGhhdmUgYWx3YXlzIHByZWNlZGVuY2U7IHByb3ZpZGVycyBhcmUgc29ydGVkIGJ5IHtAbGluayBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZX0gYW5kIGFmdGVyd2FyZHMgYnkKKyAgICAgKiBkZWNsYXJhdGlvbiBkaXN0YW5jZSAtIHNlZSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5NZXNzYWdlQm9keUZhY3RvcnkuRGVjbGFyYXRpb25EaXN0YW5jZUNvbXBhcmF0b3J9LgorICAgICAqIE90aGVyd2lzZSBKQVgtUlMgMi54IG9yZGVyaW5nIHdpbGwgYmUgdXNlZCwgd2hpY2ggc29ydHMgcHJvdmlkZXJzIGZpcnN0bHkgYnkgZGVjbGFyYXRpb24gZGlzdGFuY2UsIHRoZW4gYnkKKyAgICAgKiB7QGxpbmsgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGV9IGFuZCBieSBvcmlnaW4gKGN1c3RvbS9wcm92aWRlZCkuCisgICAgICogPHAgLz4KKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB7QGNvZGUgZmFsc2V9LgorICAgICAqIDxwIC8+CisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaXMgPGNvZGU+e0B2YWx1ZX08L2NvZGU+LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExFR0FDWV9XT1JLRVJTX09SREVSSU5HID0gImplcnNleS5jb25maWcud29ya2Vycy5sZWdhY3lPcmRlcmluZyI7CisKKyAgICAvKioKKyAgICAgKiBQcmV2ZW50cyBpbnN0YW50aWF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgTWVzc2FnZVByb3BlcnRpZXMoKSB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL01lc3NhZ2VVdGlscy5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL01lc3NhZ2VVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NTc0NjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvTWVzc2FnZVV0aWxzLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlOworCitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLlJlYWRlcldyaXRlcjsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIHdpdGggbWVzc2FnZSByZWxhdGVkIG1ldGhvZHMuCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTWVzc2FnZVV0aWxzIHsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY2hhcmFjdGVyIHNldCBmcm9tIGEgbWVkaWEgdHlwZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY2hhcmFjdGVyIHNldCBpcyBvYnRhaW5lZCBmcm9tIHRoZSBtZWRpYSB0eXBlIHBhcmFtZXRlciAiY2hhcnNldCIuCisgICAgICogSWYgdGhlIHBhcmFtZXRlciBpcyBub3QgcHJlc2VudCB0aGUge0Bjb2RlIFVURjh9IGNoYXJzZXQgaXMgdXRpbGl6ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVkaWEgdGhlIG1lZGlhIHR5cGUuCisgICAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENoYXJzZXQgZ2V0Q2hhcnNldChmaW5hbCBNZWRpYVR5cGUgbWVkaWEpIHsKKyAgICAgICAgcmV0dXJuIFJlYWRlcldyaXRlci5nZXRDaGFyc2V0KG1lZGlhKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmV2ZW50IGluc3RhbnRpYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBNZXNzYWdlVXRpbHMoKSB7CisgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiTm8gaW5zdGFuY2VzIGFsbG93ZWQuIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL1JlYWRlck1vZGVsLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvUmVhZGVyTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjM1OWY1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL1JlYWRlck1vZGVsLmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5NZXNzYWdlQm9keUZhY3Rvcnk7CisKKy8qKgorICoge0BsaW5rIGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcn0gbW9kZWwuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqIEBzaW5jZSAyLjE2CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBSZWFkZXJNb2RlbCBleHRlbmRzIEFic3RyYWN0RW50aXR5UHJvdmlkZXJNb2RlbDxNZXNzYWdlQm9keVJlYWRlcj4geworCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyByZWFkZXIgbW9kZWwgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBOT1RFOiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZSBvbiBwdXJwb3NlLgorICAgICAqCisgICAgICogQHBhcmFtIHByb3ZpZGVyIG1vZGVsbGVkIG1lc3NhZ2UgYm9keSByZWFkZXIgaW5zdGFuY2UuCisgICAgICogQHBhcmFtIHR5cGVzICAgIHN1cHBvcnRlZCBtZWRpYSB0eXBlcyBhcyBkZWNsYXJlZCBpbiB7QGNvZGUgQENvbnN1bWVzfSBhbm5vdGF0aW9uIGF0dGFjaGVkIHRvIHRoZSBwcm92aWRlciBjbGFzcy4KKyAgICAgKiBAcGFyYW0gY3VzdG9tICAgY3VzdG9tIGZsYWcuCisgICAgICovCisgICAgcHVibGljIFJlYWRlck1vZGVsKE1lc3NhZ2VCb2R5UmVhZGVyIHByb3ZpZGVyLCBMaXN0PE1lZGlhVHlwZT4gdHlwZXMsIEJvb2xlYW4gY3VzdG9tKSB7CisgICAgICAgIHN1cGVyKHByb3ZpZGVyLCB0eXBlcywgY3VzdG9tLCBNZXNzYWdlQm9keVJlYWRlci5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2FmZWx5IGludm9rZXMge0BsaW5rIGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlciNpc1JlYWRhYmxlIGlzUmVhZGFibGV9IG1ldGhvZCBvbiB0aGUgdW5kZXJseWluZyBwcm92aWRlci4KKyAgICAgKgorICAgICAqIEFueSBleGNlcHRpb25zIHdpbGwgYmUgbG9nZ2VkIGF0IGZpbmVyIGxldmVsLgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgICAgICAgIHRoZSBjbGFzcyBvZiBpbnN0YW5jZSB0byBiZSBwcm9kdWNlZC4KKyAgICAgKiBAcGFyYW0gZ2VuZXJpY1R5cGUgdGhlIHR5cGUgb2YgaW5zdGFuY2UgdG8gYmUgcHJvZHVjZWQuIEUuZy4gaWYgdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgYm9keSBpcyB0byBiZSBjb252ZXJ0ZWQgaW50byBhIG1ldGhvZCBwYXJhbWV0ZXIsIHRoaXMgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICB0aGUgZm9ybWFsIHR5cGUgb2YgdGhlIG1ldGhvZCBwYXJhbWV0ZXIgYXMgcmV0dXJuZWQgYnkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAge0Bjb2RlIE1ldGhvZC5nZXRHZW5lcmljUGFyYW1ldGVyVHlwZXN9LgorICAgICAqIEBwYXJhbSBhbm5vdGF0aW9ucyBhbiBhcnJheSBvZiB0aGUgYW5ub3RhdGlvbnMgb24gdGhlIGRlY2xhcmF0aW9uIG9mIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICBhcnRpZmFjdCB0aGF0IHdpbGwgYmUgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgcHJvZHVjZWQgaW5zdGFuY2UuIEUuZy4gaWYgdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgYm9keSBpcyB0byBiZSBjb252ZXJ0ZWQgaW50byBhIG1ldGhvZCBwYXJhbWV0ZXIsIHRoaXMgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICB0aGUgYW5ub3RhdGlvbnMgb24gdGhhdCBwYXJhbWV0ZXIgcmV0dXJuZWQgYnkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAge0Bjb2RlIE1ldGhvZC5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9uc30uCisgICAgICogQHBhcmFtIG1lZGlhVHlwZSAgIHRoZSBtZWRpYSB0eXBlIG9mIHRoZSBIVFRQIGVudGl0eSwgaWYgb25lIGlzIG5vdAorICAgICAqICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3QgdGhlbiB7QGNvZGUgYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtfSBpcworICAgICAqICAgICAgICAgICAgICAgICAgICB1c2VkLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSB0eXBlIGlzIHN1cHBvcnRlZCwgb3RoZXJ3aXNlIHtAY29kZSBmYWxzZX0uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIE1lc3NhZ2VCb2R5RmFjdG9yeS5pc1JlYWRhYmxlKHN1cGVyLnByb3ZpZGVyKCksIHR5cGUsIGdlbmVyaWNUeXBlLCBhbm5vdGF0aW9ucywgbWVkaWFUeXBlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvV3JpdGVyTW9kZWwuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9Xcml0ZXJNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMzliNDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvV3JpdGVyTW9kZWwuamF2YQpAQCAtMCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2U7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLk1lc3NhZ2VCb2R5RmFjdG9yeTsKKworLyoqCisgKiB7QGxpbmsgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyfSBtb2RlbC4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICogQHNpbmNlIDIuMTYKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFdyaXRlck1vZGVsIGV4dGVuZHMgQWJzdHJhY3RFbnRpdHlQcm92aWRlck1vZGVsPE1lc3NhZ2VCb2R5V3JpdGVyPiB7CisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyB3cml0ZXIgbW9kZWwgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBOT1RFOiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBhY2thZ2UtcHJpdmF0ZSBvbiBwdXJwb3NlLgorICAgICAqCisgICAgICogQHBhcmFtIHByb3ZpZGVyIG1vZGVsbGVkIG1lc3NhZ2UgYm9keSB3cml0ZXIgaW5zdGFuY2UuCisgICAgICogQHBhcmFtIHR5cGVzICAgIHN1cHBvcnRlZCBtZWRpYSB0eXBlcyBhcyBkZWNsYXJlZCBpbiB7QGNvZGUgQENvbnN1bWVzfSBhbm5vdGF0aW9uIGF0dGFjaGVkIHRvIHRoZSBwcm92aWRlciBjbGFzcy4KKyAgICAgKiBAcGFyYW0gY3VzdG9tICAgY3VzdG9tIGZsYWcuCisgICAgICovCisgICAgcHVibGljIFdyaXRlck1vZGVsKE1lc3NhZ2VCb2R5V3JpdGVyIHByb3ZpZGVyLCBMaXN0PE1lZGlhVHlwZT4gdHlwZXMsIEJvb2xlYW4gY3VzdG9tKSB7CisgICAgICAgIHN1cGVyKHByb3ZpZGVyLCB0eXBlcywgY3VzdG9tLCBNZXNzYWdlQm9keVdyaXRlci5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2FmZWx5IGludm9rZXMge0BsaW5rIGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlciNpc1dyaXRlYWJsZSBpc1dyaXRlYWJsZX0gbWV0aG9kIG9uIHRoZSB1bmRlcmx5aW5nIHByb3ZpZGVyLgorICAgICAqCisgICAgICogQW55IGV4Y2VwdGlvbnMgd2lsbCBiZSBsb2dnZWQgYXQgZmluZXIgbGV2ZWwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSAgICAgICAgdGhlIGNsYXNzIG9mIGluc3RhbmNlIHRoYXQgaXMgdG8gYmUgd3JpdHRlbi4KKyAgICAgKiBAcGFyYW0gZ2VuZXJpY1R5cGUgdGhlIHR5cGUgb2YgaW5zdGFuY2UgdG8gYmUgd3JpdHRlbiwgb2J0YWluZWQgZWl0aGVyCisgICAgICogICAgICAgICAgICAgICAgICAgIGJ5IHJlZmxlY3Rpb24gb2YgYSByZXNvdXJjZSBtZXRob2QgcmV0dXJuIHR5cGUgb3IgdmlhIGluc3BlY3Rpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgb2YgdGhlIHJldHVybmVkIGluc3RhbmNlLiB7QGxpbmsgamF2YXgud3MucnMuY29yZS5HZW5lcmljRW50aXR5fQorICAgICAqICAgICAgICAgICAgICAgICAgICBwcm92aWRlcyBhIHdheSB0byBzcGVjaWZ5IHRoaXMgaW5mb3JtYXRpb24gYXQgcnVudGltZS4KKyAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbnMgYW4gYXJyYXkgb2YgdGhlIGFubm90YXRpb25zIGF0dGFjaGVkIHRvIHRoZSBtZXNzYWdlIGVudGl0eSBpbnN0YW5jZS4KKyAgICAgKiBAcGFyYW0gbWVkaWFUeXBlICAgdGhlIG1lZGlhIHR5cGUgb2YgdGhlIEhUVFAgZW50aXR5LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSB0eXBlIGlzIHN1cHBvcnRlZCwgb3RoZXJ3aXNlIHtAY29kZSBmYWxzZX0uCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiBNZXNzYWdlQm9keUZhY3RvcnkuaXNXcml0ZWFibGUoc3VwZXIucHJvdmlkZXIoKSwgdHlwZSwgZ2VuZXJpY1R5cGUsIGFubm90YXRpb25zLCBtZWRpYVR5cGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9YbWxIZWFkZXIuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9YbWxIZWFkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDljYTAxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL1htbEhlYWRlci5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZTsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCisvKioKKyAqIEFsbG93cyB0byBzcGVjaWZ5IFhNTCBoZWFkZXIgZm9yIFhNTCBvdXRwdXQgcHJvZHVjZWQgYnkgYSByZXNvdXJjZSBtZXRob2QKKyAqIGl0IGlzIGF0dGFjaGVkIHRvLgorICogPHA+CisgKiBFeGFtcGxlIHVzYWdlOgorICogPHByZT4KKyAqICYjNjQ7R0VUCisgKiAmIzY0O1Byb2R1Y2VzKCJhcHBsaWNhdGlvbi94bWwiKQorICogJiM2NDtYbWxIZWFkZXIoIiZsdDs/eG1sLXN0eWxlc2hlZXQgdHlwZT0ndGV4dC94c2wnIGhyZWY9J2Zvb2Jhci54c2wnID8mZ3Q7IikKKyAqIHB1YmxpYyBKYXhiQmVhbiBnZXQoKSB7CisgKiAgICAgLi4uCisgKiB9CisgKiA8L3ByZT4KKyAqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworQFRhcmdldChFbGVtZW50VHlwZS5NRVRIT0QpCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorcHVibGljIEBpbnRlcmZhY2UgWG1sSGVhZGVyIHsKKworICAgIFN0cmluZyB2YWx1ZSgpOworfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL0Fic3RyYWN0Rm9ybVByb3ZpZGVyLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvQWJzdHJhY3RGb3JtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWU2ODUwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL0Fic3RyYWN0Rm9ybVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LlVSTERlY29kZXI7CitpbXBvcnQgamF2YS5uZXQuVVJMRW5jb2RlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5CYWRSZXF1ZXN0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CisKKworLyoqCisgKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBmb3JtIGVudGl0eSB0eXBlcyBtYXJzaGFsbGluZyAmIHVuLW1hcnNoYWxsaW5nIHN1cHBvcnQuCisgKgorICogQHBhcmFtIDxUPiBmb3JtIHR5cGUuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Rm9ybVByb3ZpZGVyPFQ+IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlUmVhZGVyV3JpdGVyUHJvdmlkZXI8VD4geworCisgICAgcHVibGljIDxNIGV4dGVuZHMgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+PiBNIHJlYWRGcm9tKE0gbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLCBib29sZWFuIGRlY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZCA9IHJlYWRGcm9tQXNTdHJpbmcoZW50aXR5U3RyZWFtLCBtZWRpYVR5cGUpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBjaGFyc2V0TmFtZSA9IFJlYWRlcldyaXRlci5nZXRDaGFyc2V0KG1lZGlhVHlwZSkubmFtZSgpOworCisgICAgICAgIGZpbmFsIFN0cmluZ1Rva2VuaXplciB0b2tlbml6ZXIgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGVuY29kZWQsICImIik7CisgICAgICAgIFN0cmluZyB0b2tlbjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdoaWxlICh0b2tlbml6ZXIuaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbml6ZXIubmV4dFRva2VuKCk7CisgICAgICAgICAgICAgICAgaW50IGlkeCA9IHRva2VuLmluZGV4T2YoJz0nKTsKKyAgICAgICAgICAgICAgICBpZiAoaWR4IDwgMCkgeworICAgICAgICAgICAgICAgICAgICBtYXAuYWRkKGRlY29kZSA/IFVSTERlY29kZXIuZGVjb2RlKHRva2VuLCBjaGFyc2V0TmFtZSkgOiB0b2tlbiwgbnVsbCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpZHggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZWNvZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5hZGQoVVJMRGVjb2Rlci5kZWNvZGUodG9rZW4uc3Vic3RyaW5nKDAsIGlkeCksIGNoYXJzZXROYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMRGVjb2Rlci5kZWNvZGUodG9rZW4uc3Vic3RyaW5nKGlkeCArIDEpLCBjaGFyc2V0TmFtZSkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbWFwLmFkZCh0b2tlbi5zdWJzdHJpbmcoMCwgaWR4KSwgdG9rZW4uc3Vic3RyaW5nKGlkeCArIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtYXA7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIDxNIGV4dGVuZHMgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+PiB2b2lkIHdyaXRlVG8oCisgICAgICAgICAgICBNIHQsCisgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGNoYXJzZXROYW1lID0gUmVhZGVyV3JpdGVyLmdldENoYXJzZXQobWVkaWFUeXBlKS5uYW1lKCk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTGlzdDxTdHJpbmc+PiBlIDogdC5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBmb3IgKFN0cmluZyB2YWx1ZSA6IGUuZ2V0VmFsdWUoKSkgeworICAgICAgICAgICAgICAgIGlmIChzYi5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCcmJyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNiLmFwcGVuZChVUkxFbmNvZGVyLmVuY29kZShlLmdldEtleSgpLCBjaGFyc2V0TmFtZSkpOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnPScpOworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoVVJMRW5jb2Rlci5lbmNvZGUodmFsdWUsIGNoYXJzZXROYW1lKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgd3JpdGVUb0FzU3RyaW5nKHNiLnRvU3RyaW5nKCksIGVudGl0eVN0cmVhbSwgbWVkaWFUeXBlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvQWJzdHJhY3RNZXNzYWdlUmVhZGVyV3JpdGVyUHJvdmlkZXIuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9BYnN0cmFjdE1lc3NhZ2VSZWFkZXJXcml0ZXJQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjODc3YTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvQWJzdHJhY3RNZXNzYWdlUmVhZGVyV3JpdGVyUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworCisvKioKKyAqIEFic3RyYWN0IGVudGl0eSBwcm92aWRlciAocmVhZGVyIGFuZCB3cml0ZXIpIGJhc2UgY2xhc3MuCisgKgorICogQHBhcmFtIDxUPiBKYXZhIHR5cGUgc3VwcG9ydGVkIGJ5IHRoZSBwcm92aWRlcgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TWVzc2FnZVJlYWRlcldyaXRlclByb3ZpZGVyPFQ+IGltcGxlbWVudHMgTWVzc2FnZUJvZHlSZWFkZXI8VD4sIE1lc3NhZ2VCb2R5V3JpdGVyPFQ+IHsKKworICAgIC8vIFRPRE86IHJlZmFjdG9yIGF3YXkgYWxsIGNvbnN0YW50cyAmIHN0YXRpYyB3cmFwcGVycyBvZiBSZWFkZXJXcml0ZXIgbWV0aG9kcyBhbmQgY29uc3RhbnRzIC0gdGhvc2UgY2FuIGJlIHVzZWQgZGlyZWN0bHkuCisKKyAgICAvKioKKyAgICAgKiBUaGUgVVRGLTggQ2hhcnNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENoYXJzZXQgVVRGOCA9IFJlYWRlcldyaXRlci5VVEY4OworCisgICAgLyoqCisgICAgICogUmVhZGVyIGJ5dGVzIGZyb20gYW4gaW5wdXQgc3RyZWFtIGFuZCB3cml0ZSB0aGVuIHRvIGFuIG91dHB1dCBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW4gIHRoZSBpbnB1dCBzdHJlYW0gdG8gcmVhZCBmcm9tLgorICAgICAqIEBwYXJhbSBvdXQgdGhlIG91dHB1dCBzdHJlYW0gdG8gd3JpdGUgdG8uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvciByZWFkaW5nIG9yIHdyaXRpbmcgYnl0ZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlVG8oSW5wdXRTdHJlYW0gaW4sIE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFJlYWRlcldyaXRlci53cml0ZVRvKGluLCBvdXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRlciBjaGFyYWN0ZXJzIGZyb20gYW4gaW5wdXQgc3RyZWFtIGFuZCB3cml0ZSB0aGVuIHRvIGFuIG91dHB1dCBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW4gIHRoZSByZWFkZXIgdG8gcmVhZCBmcm9tLgorICAgICAqIEBwYXJhbSBvdXQgdGhlIHdyaXRlciB0byB3cml0ZSB0by4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yIHJlYWRpbmcgb3Igd3JpdGluZyBjaGFyYWN0ZXJzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVRvKFJlYWRlciBpbiwgV3JpdGVyIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgUmVhZGVyV3JpdGVyLndyaXRlVG8oaW4sIG91dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjaGFyYWN0ZXIgc2V0IGZyb20gYSBtZWRpYSB0eXBlLgorICAgICAqIDxwPgorICAgICAqIFRoZSBjaGFyYWN0ZXIgc2V0IGlzIG9idGFpbmVkIGZyb20gdGhlIG1lZGlhIHR5cGUgcGFyYW1ldGVyICJjaGFyc2V0Ii4KKyAgICAgKiBJZiB0aGUgcGFyYW1ldGVyIGlzIG5vdCBwcmVzZW50IHRoZSB7QGxpbmsgI1VURjh9IGNoYXJzZXQgaXMgdXRpbGl6ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbSB0aGUgbWVkaWEgdHlwZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBjaGFyYWN0ZXIgc2V0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ2hhcnNldCBnZXRDaGFyc2V0KE1lZGlhVHlwZSBtKSB7CisgICAgICAgIHJldHVybiBSZWFkZXJXcml0ZXIuZ2V0Q2hhcnNldChtKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIHRoZSBieXRlcyBvZiBhbiBpbnB1dCBzdHJlYW0gYW5kIGNvbnZlcnQgdG8gYSBzdHJpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW4gICB0aGUgaW5wdXQgc3RyZWFtIHRvIHJlYWQgZnJvbS4KKyAgICAgKiBAcGFyYW0gdHlwZSB0aGUgbWVkaWEgdHlwZSB0aGF0IGRldGVybWluZXMgdGhlIGNoYXJhY3RlciBzZXQgZGVmaW5pbmcKKyAgICAgKiAgICAgICAgICAgICBob3cgdG8gZGVjb2RlIGJ5dGVzIHRvIGNoYXJhY3RlcnMuCisgICAgICogQHJldHVybiB0aGUgc3RyaW5nLgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvciByZWFkaW5nIGZyb20gdGhlIGlucHV0IHN0cmVhbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkRnJvbUFzU3RyaW5nKElucHV0U3RyZWFtIGluLCBNZWRpYVR5cGUgdHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIFJlYWRlcldyaXRlci5yZWFkRnJvbUFzU3RyaW5nKGluLCB0eXBlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGEgc3RyaW5nIHRvIGJ5dGVzIGFuZCB3cml0ZSB0aG9zZSBieXRlcyB0byBhbiBvdXRwdXQgc3RyZWFtLgorICAgICAqCisgICAgICogQHBhcmFtIHMgICAgdGhlIHN0cmluZyB0byBjb252ZXJ0IHRvIGJ5dGVzLgorICAgICAqIEBwYXJhbSBvdXQgIHRoZSBvdXRwdXQgc3RyZWFtIHRvIHdyaXRlIHRvLgorICAgICAqIEBwYXJhbSB0eXBlIHRoZSBtZWRpYSB0eXBlIHRoYXQgZGV0ZXJtaW5lcyB0aGUgY2hhcmFjdGVyIHNldCBkZWZpbmluZworICAgICAqICAgICAgICAgICAgIGhvdyB0byBkZWNvZGUgYnl0ZXMgdG8gY2hhcmFjdGVycy4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB3cml0ZSBmYWlsdXJlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVRvQXNTdHJpbmcoU3RyaW5nIHMsIE91dHB1dFN0cmVhbSBvdXQsIE1lZGlhVHlwZSB0eXBlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBSZWFkZXJXcml0ZXIud3JpdGVUb0FzU3RyaW5nKHMsIG91dCwgdHlwZSk7CisgICAgfQorCisgICAgLy8gTWVzc2FnZUJvZHlXcml0ZXIKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBnZXRTaXplKFQgdCwgQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvQWNjZXB0YWJsZUxhbmd1YWdlVGFnLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvQWNjZXB0YWJsZUxhbmd1YWdlVGFnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNhYjFlZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9BY2NlcHRhYmxlTGFuZ3VhZ2VUYWcuamF2YQpAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247CisKKy8qKgorICogQW4gYWNjZXB0YWJsZSBsYW5ndWFnZSB0YWcuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEFjY2VwdGFibGVMYW5ndWFnZVRhZyBleHRlbmRzIExhbmd1YWdlVGFnIGltcGxlbWVudHMgUXVhbGlmaWVkIHsKKworICAgIHByaXZhdGUgZmluYWwgaW50IHF1YWxpdHk7CisKKyAgICBwdWJsaWMgQWNjZXB0YWJsZUxhbmd1YWdlVGFnKFN0cmluZyBwcmltYXJ5VGFnLCBTdHJpbmcgc3ViVGFncykgeworICAgICAgICBzdXBlcihwcmltYXJ5VGFnLCBzdWJUYWdzKTsKKyAgICAgICAgdGhpcy5xdWFsaXR5ID0gUXVhbGl0eS5ERUZBVUxUOworICAgIH0KKworICAgIHB1YmxpYyBBY2NlcHRhYmxlTGFuZ3VhZ2VUYWcoU3RyaW5nIGhlYWRlcikgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcyhIdHRwSGVhZGVyUmVhZGVyLm5ld0luc3RhbmNlKGhlYWRlcikpOworICAgIH0KKworICAgIHB1YmxpYyBBY2NlcHRhYmxlTGFuZ3VhZ2VUYWcoSHR0cEhlYWRlclJlYWRlciByZWFkZXIpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFNraXAgYW55IHdoaXRlIHNwYWNlCisgICAgICAgIHJlYWRlci5oYXNOZXh0KCk7CisKKyAgICAgICAgdGFnID0gcmVhZGVyLm5leHRUb2tlbigpLnRvU3RyaW5nKCk7CisgICAgICAgIGlmICghdGFnLmVxdWFscygiKiIpKSB7CisgICAgICAgICAgICBwYXJzZSh0YWcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbWFyeVRhZyA9IHRhZzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZWFkZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBxdWFsaXR5ID0gSHR0cEhlYWRlclJlYWRlci5yZWFkUXVhbGl0eUZhY3RvclBhcmFtZXRlcihyZWFkZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcXVhbGl0eSA9IFF1YWxpdHkuREVGQVVMVDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0UXVhbGl0eSgpIHsKKyAgICAgICAgcmV0dXJuIHF1YWxpdHk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKCFzdXBlci5lcXVhbHMob2JqKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIEFjY2VwdGFibGVMYW5ndWFnZVRhZyBvdGhlciA9IChBY2NlcHRhYmxlTGFuZ3VhZ2VUYWcpIG9iajsKKyAgICAgICAgcmV0dXJuIHRoaXMucXVhbGl0eSA9PSBvdGhlci5xdWFsaXR5OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCBoYXNoID0gc3VwZXIuaGFzaENvZGUoKTsKKyAgICAgICAgaGFzaCA9IDQ3ICogaGFzaCArIHRoaXMucXVhbGl0eTsKKyAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL0FjY2VwdGFibGVNZWRpYVR5cGUuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9BY2NlcHRhYmxlTWVkaWFUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZmOTRlMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9BY2NlcHRhYmxlTWVkaWFUeXBlLmphdmEKQEAgLTAsMCArMSwxODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKKy8qKgorICogQW4gYWNjZXB0YWJsZSBtZWRpYSB0eXBlLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBBY2NlcHRhYmxlTWVkaWFUeXBlIGV4dGVuZHMgTWVkaWFUeXBlIGltcGxlbWVudHMgUXVhbGlmaWVkIHsKKyAgICAvKioKKyAgICAgKiBDb21wYXJhdG9yIGZvciBjb2xsZWN0aW9ucyBvZiBhY2NlcHRhYmxlIG1lZGlhIHR5cGVzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxBY2NlcHRhYmxlTWVkaWFUeXBlPiBDT01QQVJBVE9SID0gbmV3IENvbXBhcmF0b3I8QWNjZXB0YWJsZU1lZGlhVHlwZT4oKSB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShBY2NlcHRhYmxlTWVkaWFUeXBlIG8xLCBBY2NlcHRhYmxlTWVkaWFUeXBlIG8yKSB7CisgICAgICAgICAgICBpbnQgaSA9IFF1YWxpdHkuUVVBTElGSUVEX0NPTVBBUkFUT1IuY29tcGFyZShvMSwgbzIpOworICAgICAgICAgICAgaWYgKGkgIT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gTWVkaWFUeXBlcy5QQVJUSUFMX09SREVSX0NPTVBBUkFUT1IuY29tcGFyZShvMSwgbzIpOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgZmluYWwgaW50IHE7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IGFjY2VwdGFibGUgbWVkaWEgdHlwZSBpbnN0YW5jZSB3aXRoIGEge0BsaW5rIFF1YWxpdHkjREVGQVVMVAorICAgICAqIGRlZmF1bHQgcXVhbGl0eSBmYWN0b3J9IHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgICAgdGhlIHByaW1hcnkgdHlwZSwge0Bjb2RlIG51bGx9IGlzIGVxdWl2YWxlbnQgdG8KKyAgICAgKiAgICAgICAgICAgICAgICB7QGxpbmsgI01FRElBX1RZUEVfV0lMRENBUkR9CisgICAgICogQHBhcmFtIHN1YnR5cGUgdGhlIHN1YnR5cGUsIG51bGwgaXMgZXF1aXZhbGVudCB0bworICAgICAqICAgICAgICAgICAgICAgIHtAbGluayAjTUVESUFfVFlQRV9XSUxEQ0FSRH0KKyAgICAgKi8KKyAgICBwdWJsaWMgQWNjZXB0YWJsZU1lZGlhVHlwZShTdHJpbmcgdHlwZSwgU3RyaW5nIHN1YnR5cGUpIHsKKyAgICAgICAgc3VwZXIodHlwZSwgc3VidHlwZSk7IC8vIG5vIG5lZWQgdG8gYWRkIGRlZmF1bHQgcXVhbGl0eSBwYXJhbWV0ZXIuCisgICAgICAgIHEgPSBRdWFsaXR5LkRFRkFVTFQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyBhY2NlcHRhYmxlIG1lZGlhIHR5cGUgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSAgICAgICB0aGUgcHJpbWFyeSB0eXBlLCB7QGNvZGUgbnVsbH0gaXMgZXF1aXZhbGVudCB0bworICAgICAqICAgICAgICAgICAgICAgICAgIHtAbGluayAjTUVESUFfVFlQRV9XSUxEQ0FSRH0KKyAgICAgKiBAcGFyYW0gc3VidHlwZSAgICB0aGUgc3VidHlwZSwge0Bjb2RlIG51bGx9IGlzIGVxdWl2YWxlbnQgdG8KKyAgICAgKiAgICAgICAgICAgICAgICAgICB7QGxpbmsgI01FRElBX1RZUEVfV0lMRENBUkR9CisgICAgICogQHBhcmFtIHF1YWxpdHkgICAgcXVhbGl0eSBmYWN0b3IgdmFsdWUgaW4gW3BwdF0uIFNlZSB7QGxpbmsgUXVhbGlmaWVkfS4KKyAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyBhIG1hcCBvZiBtZWRpYSB0eXBlIHBhcmFtZXRlcnMsIHtAY29kZSBudWxsfSBpcyB0aGUgc2FtZSBhcyBhbgorICAgICAqICAgICAgICAgICAgICAgICAgIGVtcHR5IG1hcC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQWNjZXB0YWJsZU1lZGlhVHlwZShTdHJpbmcgdHlwZSwgU3RyaW5nIHN1YnR5cGUsIGludCBxdWFsaXR5LCBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMpIHsKKyAgICAgICAgc3VwZXIodHlwZSwgc3VidHlwZSwgUXVhbGl0eS5lbmhhbmNlV2l0aFF1YWxpdHlQYXJhbWV0ZXIocGFyYW1ldGVycywgUXVhbGl0eS5RVUFMSVRZX1BBUkFNRVRFUl9OQU1FLCBxdWFsaXR5KSk7CisgICAgICAgIHRoaXMucSA9IHF1YWxpdHk7CisgICAgfQorCisKKyAgICAvLyB1c2VkIGJ5IEFjY2VwdGFibGVNZWRpYVR5cGUudmFsdWVPZiBtZXRob2RzOyBubyBuZWVkIHRvIGZpeCBwYXJhbWV0ZXIgbWFwCisgICAgcHJpdmF0ZSBBY2NlcHRhYmxlTWVkaWFUeXBlKFN0cmluZyB0eXBlLCBTdHJpbmcgc3VidHlwZSwgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzLCBpbnQgcXVhbGl0eSkgeworICAgICAgICBzdXBlcih0eXBlLCBzdWJ0eXBlLCBwYXJhbWV0ZXJzKTsKKyAgICAgICAgdGhpcy5xID0gcXVhbGl0eTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldFF1YWxpdHkoKSB7CisgICAgICAgIHJldHVybiBxOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgYWNjZXB0YWJsZSBtZWRpYSB0eXBlIGluc3RhbmNlIGZyb20gdGhlIHN1cHBsaWVkCisgICAgICoge0BsaW5rIEh0dHBIZWFkZXJSZWFkZXIgSFRUUCBoZWFkZXIgcmVhZGVyfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWFkZXIgSFRUUCBoZWFkZXIgcmVhZGVyLgorICAgICAqIEByZXR1cm4gbmV3IGFjY2VwdGFibGUgbWVkaWEgdHlwZSBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgUGFyc2VFeGNlcHRpb24gaW4gY2FzZSB0aGUgaW5wdXQgZGF0YSBwYXJzaW5nIGZhaWxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEFjY2VwdGFibGVNZWRpYVR5cGUgdmFsdWVPZihIdHRwSGVhZGVyUmVhZGVyIHJlYWRlcikgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gU2tpcCBhbnkgd2hpdGUgc3BhY2UKKyAgICAgICAgcmVhZGVyLmhhc05leHQoKTsKKworICAgICAgICAvLyBHZXQgdGhlIHR5cGUKKyAgICAgICAgU3RyaW5nIHR5cGUgPSByZWFkZXIubmV4dFRva2VuKCkudG9TdHJpbmcoKTsKKyAgICAgICAgU3RyaW5nIHN1YlR5cGUgPSAiKiI7CisgICAgICAgIC8vIFNvbWUgSFRUUCBpbXBsZW1lbnRzIHVzZSAiKiIgdG8gbWVhbiAiKi8qIgorICAgICAgICBpZiAocmVhZGVyLmhhc05leHRTZXBhcmF0b3IoJy8nLCBmYWxzZSkpIHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0KGZhbHNlKTsKKyAgICAgICAgICAgIC8vIEdldCB0aGUgc3VidHlwZQorICAgICAgICAgICAgc3ViVHlwZSA9IHJlYWRlci5uZXh0VG9rZW4oKS50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzID0gbnVsbDsKKyAgICAgICAgaW50IHF1YWxpdHkgPSBRdWFsaXR5LkRFRkFVTFQ7CisgICAgICAgIGlmIChyZWFkZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBwYXJhbWV0ZXJzID0gSHR0cEhlYWRlclJlYWRlci5yZWFkUGFyYW1ldGVycyhyZWFkZXIpOworICAgICAgICAgICAgaWYgKHBhcmFtZXRlcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZyB2ID0gcGFyYW1ldGVycy5nZXQoUXVhbGl0eS5RVUFMSVRZX1BBUkFNRVRFUl9OQU1FKTsKKyAgICAgICAgICAgICAgICBpZiAodiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHF1YWxpdHkgPSBIdHRwSGVhZGVyUmVhZGVyLnJlYWRRdWFsaXR5RmFjdG9yKHYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHVzZSBwcml2YXRlIGNvbnN0cnVjdG9yIHRvIHNraXAgcXVhbGl0eSB2YWx1ZSB2YWxpZGF0aW9uIHN0ZXAKKyAgICAgICAgcmV0dXJuIG5ldyBBY2NlcHRhYmxlTWVkaWFUeXBlKHR5cGUsIHN1YlR5cGUsIHBhcmFtZXRlcnMsIHF1YWxpdHkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgYWNjZXB0YWJsZSBtZWRpYSB0eXBlIGluc3RhbmNlIGZyb20gdGhlIHN1cHBsaWVkCisgICAgICoge0BsaW5rIGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlIG1lZGlhIHR5cGV9LgorICAgICAqCisgICAgICogQHBhcmFtIG1lZGlhVHlwZSBnZW5lcmFsLXB1cnBvc2UgbWVkaWEgdHlwZS4KKyAgICAgKiBAcmV0dXJuIG5ldyBhY2NlcHRhYmxlIG1lZGlhIHR5cGUgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFBhcnNlRXhjZXB0aW9uIGluIGNhc2UgdGhlIHF1YWxpdHkgcGFyYW1ldGVyIHBhcnNpbmcgZmFpbGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQWNjZXB0YWJsZU1lZGlhVHlwZSB2YWx1ZU9mKE1lZGlhVHlwZSBtZWRpYVR5cGUpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChtZWRpYVR5cGUgaW5zdGFuY2VvZiBBY2NlcHRhYmxlTWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gKEFjY2VwdGFibGVNZWRpYVR5cGUpIG1lZGlhVHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycyA9IG1lZGlhVHlwZS5nZXRQYXJhbWV0ZXJzKCk7CisKKyAgICAgICAgaW50IHF1YWxpdHkgPSBRdWFsaXR5LkRFRkFVTFQ7CisgICAgICAgIGlmIChwYXJhbWV0ZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2ID0gcGFyYW1ldGVycy5nZXQoUXVhbGl0eS5RVUFMSVRZX1BBUkFNRVRFUl9OQU1FKTsKKyAgICAgICAgICAgIGlmICh2ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBxdWFsaXR5ID0gSHR0cEhlYWRlclJlYWRlci5yZWFkUXVhbGl0eUZhY3Rvcih2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHVzZSBwcml2YXRlIGNvbnN0cnVjdG9yIHRvIHNraXAgcXVhbGl0eSB2YWx1ZSB2YWxpZGF0aW9uIHN0ZXAKKyAgICAgICAgcmV0dXJuIG5ldyBBY2NlcHRhYmxlTWVkaWFUeXBlKG1lZGlhVHlwZS5nZXRUeXBlKCksIG1lZGlhVHlwZS5nZXRTdWJ0eXBlKCksIHBhcmFtZXRlcnMsIHF1YWxpdHkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmICghc3VwZXIuZXF1YWxzKG9iaikpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBBY2NlcHRhYmxlTWVkaWFUeXBlKSB7CisgICAgICAgICAgICBmaW5hbCBBY2NlcHRhYmxlTWVkaWFUeXBlIG90aGVyID0gKEFjY2VwdGFibGVNZWRpYVR5cGUpIG9iajsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnEgPT0gb3RoZXIucTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIG9iaiBpcyBhIHBsYWluIE1lZGlhVHlwZSBpbnN0YW5jZQorICAgICAgICAgICAgLy8gd2l0aCBhIHF1YWxpdHkgZmFjdG9yIHNldCB0byBkZWZhdWx0ICgxLjApCisgICAgICAgICAgICByZXR1cm4gdGhpcy5xID09IFF1YWxpdHkuREVGQVVMVDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCBoYXNoID0gc3VwZXIuaGFzaENvZGUoKTsKKyAgICAgICAgcmV0dXJuICh0aGlzLnEgPT0gUXVhbGl0eS5ERUZBVUxUKSA/IGhhc2ggOiA0NyAqIGhhc2ggKyB0aGlzLnE7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL0FjY2VwdGFibGVUb2tlbi5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL0FjY2VwdGFibGVUb2tlbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZjU5YzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvQWNjZXB0YWJsZVRva2VuLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsOworCitpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOworCisvKioKKyAqIEFuIGFjY2VwdGFibGUgdG9rZW4uCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEFjY2VwdGFibGVUb2tlbiBleHRlbmRzIFRva2VuIGltcGxlbWVudHMgUXVhbGlmaWVkIHsKKworICAgIHByb3RlY3RlZCBpbnQgcXVhbGl0eSA9IFF1YWxpdHkuREVGQVVMVDsKKworICAgIHB1YmxpYyBBY2NlcHRhYmxlVG9rZW4oU3RyaW5nIGhlYWRlcikgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcyhIdHRwSGVhZGVyUmVhZGVyLm5ld0luc3RhbmNlKGhlYWRlcikpOworICAgIH0KKworICAgIHB1YmxpYyBBY2NlcHRhYmxlVG9rZW4oSHR0cEhlYWRlclJlYWRlciByZWFkZXIpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFNraXAgYW55IHdoaXRlIHNwYWNlCisgICAgICAgIHJlYWRlci5oYXNOZXh0KCk7CisKKyAgICAgICAgdG9rZW4gPSByZWFkZXIubmV4dFRva2VuKCkudG9TdHJpbmcoKTsKKworICAgICAgICBpZiAocmVhZGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgcXVhbGl0eSA9IEh0dHBIZWFkZXJSZWFkZXIucmVhZFF1YWxpdHlGYWN0b3JQYXJhbWV0ZXIocmVhZGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0UXVhbGl0eSgpIHsKKyAgICAgICAgcmV0dXJuIHF1YWxpdHk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL0Jhc2ljVHlwZXNNZXNzYWdlUHJvdmlkZXIuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9CYXNpY1R5cGVzTWVzc2FnZVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZjOTM1MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9CYXNpY1R5cGVzTWVzc2FnZVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwyMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNMb25nOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk5vQ29udGVudEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlJlZmxlY3Rpb25IZWxwZXI7CisKKy8qKgorICogVGhlIGJhc2ljIHR5cGVzIG1lc3NhZ2UgYm9keSBwcm92aWRlciBmb3Ige0BsaW5rIE1lZGlhVHlwZSNURVhUX1BMQUlOfSBtZWRpYSB0eXBlLgorICogPHAvPgorICogVGhlIHByb3ZpZGVyIHByb2Nlc3NlcyBwcmltaXRpdmUgdHlwZXMgYW5kIGFsc28gb3RoZXIge0BsaW5rIE51bWJlcn0gaW1wbGVtZW50YXRpb25zIGxpa2Uge0BsaW5rIGphdmEubWF0aC5CaWdEZWNpbWFsfSwKKyAqIHtAbGluayBqYXZhLm1hdGguQmlnSW50ZWdlcn0sIHtAbGluayBBdG9taWNJbnRlZ2VyfSwgIHtAbGluayBBdG9taWNMb25nfSBhbmQgYWxsIG90aGVyIGltcGxlbWVudGF0aW9ucyB3aGljaCBoYXMgb25lIFN0cmluZworICogYXJndW1lbnQgY29uc3RydWN0b3IuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQFByb2R1Y2VzKHsidGV4dC9wbGFpbiJ9KQorQENvbnN1bWVzKHsidGV4dC9wbGFpbiJ9KQorQFNpbmdsZXRvbgorZmluYWwgY2xhc3MgQmFzaWNUeXBlc01lc3NhZ2VQcm92aWRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVJlYWRlcldyaXRlclByb3ZpZGVyPE9iamVjdD4geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZW51bSBQcmltaXRpdmVUeXBlcyB7CisgICAgICAgIEJZVEUoQnl0ZS5jbGFzcywgYnl0ZS5jbGFzcykgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGNvbnZlcnQoU3RyaW5nIHMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQnl0ZS52YWx1ZU9mKHMpOworICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBTSE9SVChTaG9ydC5jbGFzcywgc2hvcnQuY2xhc3MpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIE9iamVjdCBjb252ZXJ0KFN0cmluZyBzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFNob3J0LnZhbHVlT2Yocyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIElOVEVHRVIoSW50ZWdlci5jbGFzcywgaW50LmNsYXNzKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgY29udmVydChTdHJpbmcgcykgeworICAgICAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnZhbHVlT2Yocyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIExPTkcoTG9uZy5jbGFzcywgbG9uZy5jbGFzcykgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGNvbnZlcnQoU3RyaW5nIHMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTG9uZy52YWx1ZU9mKHMpOworICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBGTE9BVChGbG9hdC5jbGFzcywgZmxvYXQuY2xhc3MpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIE9iamVjdCBjb252ZXJ0KFN0cmluZyBzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZsb2F0LnZhbHVlT2Yocyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIERPVUJMRShEb3VibGUuY2xhc3MsIGRvdWJsZS5jbGFzcykgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGNvbnZlcnQoU3RyaW5nIHMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRG91YmxlLnZhbHVlT2Yocyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIEJPT0xFQU4oQm9vbGVhbi5jbGFzcywgYm9vbGVhbi5jbGFzcykgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGNvbnZlcnQoU3RyaW5nIHMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbi52YWx1ZU9mKHMpOworICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICBDSEFSKENoYXJhY3Rlci5jbGFzcywgY2hhci5jbGFzcykgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGNvbnZlcnQoU3RyaW5nIHMpIHsKKyAgICAgICAgICAgICAgICBpZiAocy5sZW5ndGgoKSAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNZXNzYWdlQm9keVByb2Nlc3NpbmdFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRVJST1JfRU5USVRZX1BST1ZJREVSX0JBU0lDVFlQRVNfQ0hBUkFDVEVSX01PUkVDSEFSUygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHMuY2hhckF0KDApOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUHJpbWl0aXZlVHlwZXMgZm9yVHlwZShDbGFzczw/PiB0eXBlKSB7CisgICAgICAgICAgICBmb3IgKFByaW1pdGl2ZVR5cGVzIHByaW1pdGl2ZSA6IFByaW1pdGl2ZVR5cGVzLnZhbHVlcygpKSB7CisgICAgICAgICAgICAgICAgaWYgKHByaW1pdGl2ZS5zdXBwb3J0cyh0eXBlKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJpbWl0aXZlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDbGFzczw/PiB3cmFwcGVyOworICAgICAgICBwcml2YXRlIGZpbmFsIENsYXNzPD8+IHByaW1pdGl2ZTsKKworICAgICAgICBwcml2YXRlIFByaW1pdGl2ZVR5cGVzKENsYXNzPD8+IHdyYXBwZXIsIENsYXNzPD8+IHByaW1pdGl2ZSkgeworICAgICAgICAgICAgdGhpcy53cmFwcGVyID0gd3JhcHBlcjsKKyAgICAgICAgICAgIHRoaXMucHJpbWl0aXZlID0gcHJpbWl0aXZlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGFic3RyYWN0IE9iamVjdCBjb252ZXJ0KFN0cmluZyBzKTsKKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhDbGFzczw/PiB0eXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSB3cmFwcGVyIHx8IHR5cGUgPT0gcHJpbWl0aXZlOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIGNhblByb2Nlc3ModHlwZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdCByZWFkRnJvbSgKKyAgICAgICAgICAgIENsYXNzPE9iamVjdD4gdHlwZSwKKyAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGVudGl0eVN0cmluZyA9IHJlYWRGcm9tQXNTdHJpbmcoZW50aXR5U3RyZWFtLCBtZWRpYVR5cGUpOworICAgICAgICBpZiAoZW50aXR5U3RyaW5nLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5vQ29udGVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9SRUFESU5HX0VOVElUWV9NSVNTSU5HKCkpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFByaW1pdGl2ZVR5cGVzIHByaW1pdGl2ZVR5cGUgPSBQcmltaXRpdmVUeXBlcy5mb3JUeXBlKHR5cGUpOworICAgICAgICBpZiAocHJpbWl0aXZlVHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gcHJpbWl0aXZlVHlwZS5jb252ZXJ0KGVudGl0eVN0cmluZyk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKFJlZmxlY3Rpb25IZWxwZXIuZ2V0U3RyaW5nQ29uc3RydWN0b3JQQSh0eXBlKSk7CisgICAgICAgIGlmIChjb25zdHJ1Y3RvciAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiB0eXBlLmNhc3QoY29uc3RydWN0b3IubmV3SW5zdGFuY2UoZW50aXR5U3RyaW5nKSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBNZXNzYWdlQm9keVByb2Nlc3NpbmdFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfRU5USVRZX1BST1ZJREVSX0JBU0lDVFlQRVNfQ09OU1RSVUNUT1IodHlwZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKEF0b21pY0ludGVnZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0eXBlKSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBBdG9taWNJbnRlZ2VyKChJbnRlZ2VyKSBQcmltaXRpdmVUeXBlcy5JTlRFR0VSLmNvbnZlcnQoZW50aXR5U3RyaW5nKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoQXRvbWljTG9uZy5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEF0b21pY0xvbmcoKExvbmcpIFByaW1pdGl2ZVR5cGVzLkxPTkcuY29udmVydChlbnRpdHlTdHJpbmcpKTsKKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBNZXNzYWdlQm9keVByb2Nlc3NpbmdFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfRU5USVRZX1BST1ZJREVSX0JBU0lDVFlQRVNfVU5LV05PV04odHlwZSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICByZXR1cm4gY2FuUHJvY2Vzcyh0eXBlKTsKKworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBjYW5Qcm9jZXNzKENsYXNzPD8+IHR5cGUpIHsKKyAgICAgICAgaWYgKFByaW1pdGl2ZVR5cGVzLmZvclR5cGUodHlwZSkgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKE51bWJlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpKSB7CisgICAgICAgICAgICBmaW5hbCBDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciA9IEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKFJlZmxlY3Rpb25IZWxwZXIuZ2V0U3RyaW5nQ29uc3RydWN0b3JQQSh0eXBlKSk7CisgICAgICAgICAgICBpZiAoY29uc3RydWN0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKEF0b21pY0ludGVnZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0eXBlKSB8fCBBdG9taWNMb25nLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBnZXRTaXplKE9iamVjdCB0LCBDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHQudG9TdHJpbmcoKS5sZW5ndGgoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKAorICAgICAgICAgICAgT2JqZWN0IG8sCisgICAgICAgICAgICBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVUb0FzU3RyaW5nKG8udG9TdHJpbmcoKSwgZW50aXR5U3RyZWFtLCBtZWRpYVR5cGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9CeXRlQXJyYXlQcm92aWRlci5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL0J5dGVBcnJheVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU2MDYzZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9CeXRlQXJyYXlQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworCisvKioKKyAqIERlZmF1bHQgSmVyc2V5IGJ5dGUgYXJyYXkgZW50aXR5IHByb3ZpZGVyIChyZWFkZXIgYW5kIHdyaXRlcikuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQFByb2R1Y2VzKHsiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIiwgIiovKiJ9KQorQENvbnN1bWVzKHsiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIiwgIiovKiJ9KQorcHVibGljIGZpbmFsIGNsYXNzIEJ5dGVBcnJheVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlUmVhZGVyV3JpdGVyUHJvdmlkZXI8Ynl0ZVtdPiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICByZXR1cm4gdHlwZSA9PSBieXRlW10uY2xhc3M7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJ5dGVbXSByZWFkRnJvbSgKKyAgICAgICAgICAgIENsYXNzPGJ5dGVbXT4gdHlwZSwKKyAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb25zW10sCisgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICB3cml0ZVRvKGVudGl0eVN0cmVhbSwgb3V0KTsKKyAgICAgICAgcmV0dXJuIG91dC50b0J5dGVBcnJheSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICByZXR1cm4gdHlwZSA9PSBieXRlW10uY2xhc3M7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGVUbygKKyAgICAgICAgICAgIGJ5dGVbXSB0LAorICAgICAgICAgICAgQ2xhc3M8Pz4gdHlwZSwKKyAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb25zW10sCisgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZW50aXR5U3RyZWFtLndyaXRlKHQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGdldFNpemUoYnl0ZVtdIHQsIENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICByZXR1cm4gdC5sZW5ndGg7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL0NhY2hlQ29udHJvbFByb3ZpZGVyLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvQ2FjaGVDb250cm9sUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjNiMDFmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL0NhY2hlQ29udHJvbFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwyMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNhY2hlQ29udHJvbDsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuSGVhZGVyRGVsZWdhdGVQcm92aWRlcjsKK2ltcG9ydCBzdGF0aWMgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5VdGlscy50aHJvd0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbklmTnVsbDsKKworLyoqCisgKiB7QGNvZGUgQ2FjaGUtQ29udHJvbH0ge0BsaW5rIEhlYWRlckRlbGVnYXRlUHJvdmlkZXIgaGVhZGVyIGRlbGVnYXRlIHByb3ZpZGVyfS4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBodWJpY2tAamF2YS5uZXQKKyAqLworQFNpbmdsZXRvbgorcHVibGljIGZpbmFsIGNsYXNzIENhY2hlQ29udHJvbFByb3ZpZGVyIGltcGxlbWVudHMgSGVhZGVyRGVsZWdhdGVQcm92aWRlcjxDYWNoZUNvbnRyb2w+IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gV0hJVEVTUEFDRSA9IFBhdHRlcm4uY29tcGlsZSgiXFxzIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBDT01NQV9TRVBBUkFURURfTElTVCA9IFBhdHRlcm4uY29tcGlsZSgiW1xcc10qLFtcXHNdKiIpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoQ2xhc3M8Pz4gdHlwZSkgeworICAgICAgICByZXR1cm4gdHlwZSA9PSBDYWNoZUNvbnRyb2wuY2xhc3M7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZyhDYWNoZUNvbnRyb2wgaGVhZGVyKSB7CisKKyAgICAgICAgdGhyb3dJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25JZk51bGwoaGVhZGVyLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5DQUNIRV9DT05UUk9MX0lTX05VTEwoKSk7CisKKyAgICAgICAgU3RyaW5nQnVpbGRlciBiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgaWYgKGhlYWRlci5pc1ByaXZhdGUoKSkgeworICAgICAgICAgICAgYXBwZW5kUXVvdGVkV2l0aFNlcGFyYXRvcihiLCAicHJpdmF0ZSIsIGJ1aWxkTGlzdFZhbHVlKGhlYWRlci5nZXRQcml2YXRlRmllbGRzKCkpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaGVhZGVyLmlzTm9DYWNoZSgpKSB7CisgICAgICAgICAgICBhcHBlbmRRdW90ZWRXaXRoU2VwYXJhdG9yKGIsICJuby1jYWNoZSIsIGJ1aWxkTGlzdFZhbHVlKGhlYWRlci5nZXROb0NhY2hlRmllbGRzKCkpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaGVhZGVyLmlzTm9TdG9yZSgpKSB7CisgICAgICAgICAgICBhcHBlbmRXaXRoU2VwYXJhdG9yKGIsICJuby1zdG9yZSIpOworICAgICAgICB9CisgICAgICAgIGlmIChoZWFkZXIuaXNOb1RyYW5zZm9ybSgpKSB7CisgICAgICAgICAgICBhcHBlbmRXaXRoU2VwYXJhdG9yKGIsICJuby10cmFuc2Zvcm0iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaGVhZGVyLmlzTXVzdFJldmFsaWRhdGUoKSkgeworICAgICAgICAgICAgYXBwZW5kV2l0aFNlcGFyYXRvcihiLCAibXVzdC1yZXZhbGlkYXRlIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhlYWRlci5pc1Byb3h5UmV2YWxpZGF0ZSgpKSB7CisgICAgICAgICAgICBhcHBlbmRXaXRoU2VwYXJhdG9yKGIsICJwcm94eS1yZXZhbGlkYXRlIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhlYWRlci5nZXRNYXhBZ2UoKSAhPSAtMSkgeworICAgICAgICAgICAgYXBwZW5kV2l0aFNlcGFyYXRvcihiLCAibWF4LWFnZSIsIGhlYWRlci5nZXRNYXhBZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhlYWRlci5nZXRTTWF4QWdlKCkgIT0gLTEpIHsKKyAgICAgICAgICAgIGFwcGVuZFdpdGhTZXBhcmF0b3IoYiwgInMtbWF4YWdlIiwgaGVhZGVyLmdldFNNYXhBZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gZSA6IGhlYWRlci5nZXRDYWNoZUV4dGVuc2lvbigpLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIGFwcGVuZFdpdGhTZXBhcmF0b3IoYiwgZS5nZXRLZXkoKSwgcXVvdGVJZldoaXRlc3BhY2UoZS5nZXRWYWx1ZSgpKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYi50b1N0cmluZygpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWFkRmllbGROYW1lcyhMaXN0PFN0cmluZz4gZmllbGROYW1lcywgSHR0cEhlYWRlclJlYWRlciByZWFkZXIpCisgICAgICAgICAgICB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICBpZiAoIXJlYWRlci5oYXNOZXh0U2VwYXJhdG9yKCc9JywgZmFsc2UpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgcmVhZGVyLm5leHRTZXBhcmF0b3IoJz0nKTsKKyAgICAgICAgZmllbGROYW1lcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChDT01NQV9TRVBBUkFURURfTElTVC5zcGxpdChyZWFkZXIubmV4dFF1b3RlZFN0cmluZygpKSkpOworICAgIH0KKworICAgIHByaXZhdGUgaW50IHJlYWRJbnRWYWx1ZShIdHRwSGVhZGVyUmVhZGVyIHJlYWRlciwgU3RyaW5nIGRpcmVjdGl2ZU5hbWUpCisgICAgICAgICAgICB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICByZWFkZXIubmV4dFNlcGFyYXRvcignPScpOworICAgICAgICBpbnQgaW5kZXggPSByZWFkZXIuZ2V0SW5kZXgoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHJlYWRlci5uZXh0VG9rZW4oKS50b1N0cmluZygpKTsKKyAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgeworICAgICAgICAgICAgUGFyc2VFeGNlcHRpb24gcGUgPSBuZXcgUGFyc2VFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJFcnJvciBwYXJzaW5nIGludGVnZXIgdmFsdWUgZm9yICIgKyBkaXJlY3RpdmVOYW1lICsgIiBkaXJlY3RpdmUiLCBpbmRleCk7CisgICAgICAgICAgICBwZS5pbml0Q2F1c2UobmZlKTsKKyAgICAgICAgICAgIHRocm93IHBlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlYWREaXJlY3RpdmUoQ2FjaGVDb250cm9sIGNhY2hlQ29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwSGVhZGVyUmVhZGVyIHJlYWRlcikgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKworICAgICAgICBmaW5hbCBTdHJpbmcgZGlyZWN0aXZlTmFtZSA9IHJlYWRlci5uZXh0VG9rZW4oKS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7CisgICAgICAgIGlmICgicHJpdmF0ZSIuZXF1YWxzKGRpcmVjdGl2ZU5hbWUpKSB7CisgICAgICAgICAgICBjYWNoZUNvbnRyb2wuc2V0UHJpdmF0ZSh0cnVlKTsKKyAgICAgICAgICAgIHJlYWRGaWVsZE5hbWVzKGNhY2hlQ29udHJvbC5nZXRQcml2YXRlRmllbGRzKCksIHJlYWRlcik7CisgICAgICAgIH0gZWxzZSBpZiAoInB1YmxpYyIuZXF1YWxzKGRpcmVjdGl2ZU5hbWUpKSB7CisgICAgICAgICAgICAvLyBDYWNoZUNvbnRyb2wgQVBJIGRvZXNuJ3Qgc3VwcG9ydCAncHVibGljJyBmb3Igc29tZSByZWFzb24uCisgICAgICAgICAgICBjYWNoZUNvbnRyb2wuZ2V0Q2FjaGVFeHRlbnNpb24oKS5wdXQoZGlyZWN0aXZlTmFtZSwgbnVsbCk7CisgICAgICAgIH0gZWxzZSBpZiAoIm5vLWNhY2hlIi5lcXVhbHMoZGlyZWN0aXZlTmFtZSkpIHsKKyAgICAgICAgICAgIGNhY2hlQ29udHJvbC5zZXROb0NhY2hlKHRydWUpOworICAgICAgICAgICAgcmVhZEZpZWxkTmFtZXMoY2FjaGVDb250cm9sLmdldE5vQ2FjaGVGaWVsZHMoKSwgcmVhZGVyKTsKKyAgICAgICAgfSBlbHNlIGlmICgibm8tc3RvcmUiLmVxdWFscyhkaXJlY3RpdmVOYW1lKSkgeworICAgICAgICAgICAgY2FjaGVDb250cm9sLnNldE5vU3RvcmUodHJ1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoIm5vLXRyYW5zZm9ybSIuZXF1YWxzKGRpcmVjdGl2ZU5hbWUpKSB7CisgICAgICAgICAgICBjYWNoZUNvbnRyb2wuc2V0Tm9UcmFuc2Zvcm0odHJ1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoIm11c3QtcmV2YWxpZGF0ZSIuZXF1YWxzKGRpcmVjdGl2ZU5hbWUpKSB7CisgICAgICAgICAgICBjYWNoZUNvbnRyb2wuc2V0TXVzdFJldmFsaWRhdGUodHJ1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoInByb3h5LXJldmFsaWRhdGUiLmVxdWFscyhkaXJlY3RpdmVOYW1lKSkgeworICAgICAgICAgICAgY2FjaGVDb250cm9sLnNldFByb3h5UmV2YWxpZGF0ZSh0cnVlKTsKKyAgICAgICAgfSBlbHNlIGlmICgibWF4LWFnZSIuZXF1YWxzKGRpcmVjdGl2ZU5hbWUpKSB7CisgICAgICAgICAgICBjYWNoZUNvbnRyb2wuc2V0TWF4QWdlKHJlYWRJbnRWYWx1ZShyZWFkZXIsIGRpcmVjdGl2ZU5hbWUpKTsKKyAgICAgICAgfSBlbHNlIGlmICgicy1tYXhhZ2UiLmVxdWFscyhkaXJlY3RpdmVOYW1lKSkgeworICAgICAgICAgICAgY2FjaGVDb250cm9sLnNldFNNYXhBZ2UocmVhZEludFZhbHVlKHJlYWRlciwgZGlyZWN0aXZlTmFtZSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gbnVsbDsKKyAgICAgICAgICAgIGlmIChyZWFkZXIuaGFzTmV4dFNlcGFyYXRvcignPScsIGZhbHNlKSkgeworICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0U2VwYXJhdG9yKCc9Jyk7CisgICAgICAgICAgICAgICAgdmFsdWUgPSByZWFkZXIubmV4dFRva2VuT3JRdW90ZWRTdHJpbmcoKS50b1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FjaGVDb250cm9sLmdldENhY2hlRXh0ZW5zaW9uKCkucHV0KGRpcmVjdGl2ZU5hbWUsIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDYWNoZUNvbnRyb2wgZnJvbVN0cmluZyhTdHJpbmcgaGVhZGVyKSB7CisKKyAgICAgICAgdGhyb3dJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25JZk51bGwoaGVhZGVyLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5DQUNIRV9DT05UUk9MX0lTX05VTEwoKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEh0dHBIZWFkZXJSZWFkZXIgcmVhZGVyID0gSHR0cEhlYWRlclJlYWRlci5uZXdJbnN0YW5jZShoZWFkZXIpOworICAgICAgICAgICAgQ2FjaGVDb250cm9sIGNhY2hlQ29udHJvbCA9IG5ldyBDYWNoZUNvbnRyb2woKTsKKyAgICAgICAgICAgIGNhY2hlQ29udHJvbC5zZXROb1RyYW5zZm9ybShmYWxzZSk7IC8vIGRlZmF1bHRzIHRvIHRydWUKKyAgICAgICAgICAgIHdoaWxlIChyZWFkZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgcmVhZERpcmVjdGl2ZShjYWNoZUNvbnRyb2wsIHJlYWRlcik7CisgICAgICAgICAgICAgICAgaWYgKHJlYWRlci5oYXNOZXh0U2VwYXJhdG9yKCcsJywgdHJ1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVhZGVyLm5leHRTZXBhcmF0b3IoJywnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY2FjaGVDb250cm9sOworICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBwZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkVycm9yIHBhcnNpbmcgY2FjaGUgY29udHJvbCAnIiArIGhlYWRlciArICInIiwgcGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFwcGVuZFdpdGhTZXBhcmF0b3IoU3RyaW5nQnVpbGRlciBiLCBTdHJpbmcgZmllbGQpIHsKKyAgICAgICAgaWYgKGIubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICBiLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgfQorICAgICAgICBiLmFwcGVuZChmaWVsZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFwcGVuZFF1b3RlZFdpdGhTZXBhcmF0b3IoU3RyaW5nQnVpbGRlciBiLCBTdHJpbmcgZmllbGQsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBhcHBlbmRXaXRoU2VwYXJhdG9yKGIsIGZpZWxkKTsKKyAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgIXZhbHVlLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgYi5hcHBlbmQoIj1cIiIpOworICAgICAgICAgICAgYi5hcHBlbmQodmFsdWUpOworICAgICAgICAgICAgYi5hcHBlbmQoIlwiIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXBwZW5kV2l0aFNlcGFyYXRvcihTdHJpbmdCdWlsZGVyIGIsIFN0cmluZyBmaWVsZCwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIGFwcGVuZFdpdGhTZXBhcmF0b3IoYiwgZmllbGQpOworICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiAhdmFsdWUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBiLmFwcGVuZCgiPSIpOworICAgICAgICAgICAgYi5hcHBlbmQodmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFwcGVuZFdpdGhTZXBhcmF0b3IoU3RyaW5nQnVpbGRlciBiLCBTdHJpbmcgZmllbGQsIGludCB2YWx1ZSkgeworICAgICAgICBhcHBlbmRXaXRoU2VwYXJhdG9yKGIsIGZpZWxkKTsKKyAgICAgICAgYi5hcHBlbmQoIj0iKTsKKyAgICAgICAgYi5hcHBlbmQodmFsdWUpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGJ1aWxkTGlzdFZhbHVlKExpc3Q8U3RyaW5nPiB2YWx1ZXMpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgZm9yIChTdHJpbmcgdmFsdWUgOiB2YWx1ZXMpIHsKKyAgICAgICAgICAgIGFwcGVuZFdpdGhTZXBhcmF0b3IoYiwgdmFsdWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgcXVvdGVJZldoaXRlc3BhY2UoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBNYXRjaGVyIG0gPSBXSElURVNQQUNFLm1hdGNoZXIodmFsdWUpOworICAgICAgICBpZiAobS5maW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAiXCIiICsgdmFsdWUgKyAiXCIiOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvQ29tbWl0dGluZ091dHB1dFN0cmVhbS5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL0NvbW1pdHRpbmdPdXRwdXRTdHJlYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDNhNWVkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL0NvbW1pdHRpbmdPdXRwdXRTdHJlYW0uamF2YQpAQCAtMCwwICsxLDI4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YS5QcmVjb25kaXRpb25zOworCisvKioKKyAqIEEgY29tbWl0dGluZyBvdXRwdXQgc3RyZWFtIHdpdGggb3B0aW9uYWwgc2VyaWFsaXplZCBlbnRpdHkgYnVmZmVyaW5nIGZ1bmN0aW9uYWxpdHkKKyAqIHdoaWNoIGFsbG93cyBtZWFzdXJpbmcgb2YgdGhlIGVudGl0eSBzaXplLgorICogPHA+CisgKiBXaGVuIGJ1ZmZlcmluZyBmdW5jdGlvbmFsaXR5IGlzIGVuYWJsZWQgdGhlIG91dHB1dCBzdHJlYW0gYnVmZmVycworICogdGhlIHdyaXR0ZW4gYnl0ZXMgaW50byBhbiBpbnRlcm5hbCBidWZmZXIgb2YgYSBjb25maWd1cmFibGUgc2l6ZS4gQWZ0ZXIgdGhlIGxhc3QKKyAqIHdyaXR0ZW4gYnl0ZSB0aGUge0BsaW5rICNjb21taXQoKX0gbWV0aG9kIGlzIGV4cGVjdGVkIHRvIGJlIGNhbGxlZCB0byBub3RpZnkKKyAqIGEge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuT3V0Ym91bmRNZXNzYWdlQ29udGV4dC5TdHJlYW1Qcm92aWRlciNnZXRPdXRwdXRTdHJlYW0oaW50KSBjYWxsYmFja30KKyAqIHdpdGggYW4gYWN0dWFsIG1lYXN1cmVkIGVudGl0eSBzaXplLiBJZiB0aGUgZW50aXR5IGlzIHRvbyBsYXJnZSB0bworICogZml0IGludG8gdGhlIGludGVybmFsIGJ1ZmZlciBhbmQgdGhlIGJ1ZmZlciBleGNlZWRzIGJlZm9yZSB0aGUge0BsaW5rICNjb21taXQoKX0KKyAqIGlzIGNhbGxlZCB0aGVuIHRoZSBzdHJlYW0gaXMgYXV0b21hdGljYWxseSBjb21taXR0ZWQgYW5kIHRoZSBjYWxsYmFjayBpcyBjYWxsZWQKKyAqIHdpdGggcGFyYW1ldGVyIHtAY29kZSBzaXplfSB2YWx1ZSBvZiB7QGNvZGUgLTF9LgorICogPC9wPgorICogPHA+CisgKiBDYWxsYmFjayBtZXRob2QgYWxzbyByZXR1cm5zIHRoZSBvdXRwdXQgc3RyZWFtIGluIHdoaWNoIHRoZSBvdXRwdXQgd2lsbCBiZSB3cml0dGVuLiBUaGUgY29tbWl0dGluZyBvdXRwdXQgc3RyZWFtCisgKiBtdXN0IGJlIGluaXRpYWxpemVkIHdpdGggdGhlIGNhbGxiYWNrIHVzaW5nCisgKiB7QGxpbmsgI3NldFN0cmVhbVByb3ZpZGVyKG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuT3V0Ym91bmRNZXNzYWdlQ29udGV4dC5TdHJlYW1Qcm92aWRlcil9CisgKiBiZWZvcmUgZmlyc3QgYnl0ZSBpcyB3cml0dGVuLgorICogPC9wPgorICogVGhlIGJ1ZmZlcmluZyBpcyBieSBkZWZhdWx0IGRpc2FibGVkIGFuZCBjYW4gYmUgZW5hYmxlZCBieSBjYWxsaW5nIHtAbGluayAjZW5hYmxlQnVmZmVyaW5nKCl9CisgKiBvciB7QGxpbmsgI2VuYWJsZUJ1ZmZlcmluZyhpbnQpfSBiZWZvcmUgd3JpdGluZyB0aGUgZmlyc3QgYnl0ZSBpbnRvIHRoaXMgb3V0cHV0IHN0cmVhbS4gVGhlIGZvcm1lcgorICogbWV0aG9kIGVuYWJsZXMgYnVmZmVyaW5nIHdpdGggdGhlIGRlZmF1bHQgc2l6ZQorICogPHR0PntAdmFsdWUgQ29tbWl0dGluZ091dHB1dFN0cmVhbSNERUZBVUxUX0JVRkZFUl9TSVpFfTwvdHQ+IGJ5dGVzIHNwZWNpZmllZCBpbiB7QGxpbmsgI0RFRkFVTFRfQlVGRkVSX1NJWkV9LgorICogPC9wPgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBDb21taXR0aW5nT3V0cHV0U3RyZWFtIGV4dGVuZHMgT3V0cHV0U3RyZWFtIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKENvbW1pdHRpbmdPdXRwdXRTdHJlYW0uY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAvKioKKyAgICAgKiBOdWxsIHN0cmVhbSBwcm92aWRlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPdXRib3VuZE1lc3NhZ2VDb250ZXh0LlN0cmVhbVByb3ZpZGVyIE5VTExfU1RSRUFNX1BST1ZJREVSID0KKyAgICAgICAgICAgIGNvbnRlbnRMZW5ndGggLT4gbmV3IE51bGxPdXRwdXRTdHJlYW0oKTsKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IHNpemUgb2YgdGhlIGJ1ZmZlciB3aGljaCB3aWxsIGJlIHVzZWQgaWYgbm8gdXNlciBkZWZpbmVkIHNpemUgaXMgc3BlY2lmaWVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQlVGRkVSX1NJWkUgPSA4MTkyOworICAgIC8qKgorICAgICAqIEFkYXB0ZWQgb3V0cHV0IHN0cmVhbS4KKyAgICAgKi8KKyAgICBwcml2YXRlIE91dHB1dFN0cmVhbSBhZGFwdGVkT3V0cHV0OworICAgIC8qKgorICAgICAqIEJ1ZmZlcmluZyBzdHJlYW0gcHJvdmlkZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBPdXRib3VuZE1lc3NhZ2VDb250ZXh0LlN0cmVhbVByb3ZpZGVyIHN0cmVhbVByb3ZpZGVyOworICAgIC8qKgorICAgICAqIEludGVybmFsIGJ1ZmZlciBzaXplLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGJ1ZmZlclNpemUgPSAwOworICAgIC8qKgorICAgICAqIEVudGl0eSBidWZmZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnVmZmVyOworICAgIC8qKgorICAgICAqIFdoZW4ge0Bjb2RlIHRydWV9LCB0aGUgZGF0YSBhcmUgd3JpdHRlbiBkaXJlY3RseSB0byBvdXRwdXQgc3RyZWFtIGFuZCBub3QgdG8gdGhlIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZGlyZWN0V3JpdGUgPSB0cnVlOworICAgIC8qKgorICAgICAqIFdoZW4ge0Bjb2RlIHRydWV9LCB0aGUgc3RyZWFtIGlzIGFscmVhZHkgY29tbWl0dGVkIChyZWRpcmVjdGVkIHRvIGFkYXB0ZWRPdXRwdXQpLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc0NvbW1pdHRlZDsKKyAgICAvKioKKyAgICAgKiBXaGVuIHtAY29kZSB0cnVlfSwgdGhlIHN0cmVhbSBpcyBhbHJlYWR5IGNsb3NlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNDbG9zZWQ7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSRUFNX1BST1ZJREVSX05VTEwgPSBMb2NhbGl6YXRpb25NZXNzYWdlcy5TVFJFQU1fUFJPVklERVJfTlVMTCgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NSVRUSU5HX1NUUkVBTV9CVUZGRVJJTkdfSUxMRUdBTF9TVEFURSA9IExvY2FsaXphdGlvbk1lc3NhZ2VzCisgICAgICAgICAgICAuQ09NTUlUVElOR19TVFJFQU1fQlVGRkVSSU5HX0lMTEVHQUxfU1RBVEUoKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgbmV3IGNvbW1pdHRpbmcgb3V0cHV0IHN0cmVhbS4gVGhlIHJldHVybmVkIHN0cmVhbSBpbnN0YW5jZSBzdGlsbCBuZWVkcyB0byBiZSBpbml0aWFsaXplZCBiZWZvcmUKKyAgICAgKiB3cml0aW5nIGZpcnN0IGJ5dGVzLgorICAgICAqLworICAgIHB1YmxpYyBDb21taXR0aW5nT3V0cHV0U3RyZWFtKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYnVmZmVyaW5nIG91dHB1dCBzdHJlYW0gcHJvdmlkZXIuIElmIHRoZSBjb21taXR0aW5nIG91dHB1dCBzdHJlYW0gd29ya3MgaW4gYnVmZmVyaW5nIG1vZGUKKyAgICAgKiB0aGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgZmlyc3QgYnl0ZXMgYXJlIHdyaXR0ZW4gaW50byB0aGlzIHN0cmVhbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJlYW1Qcm92aWRlciBub24tbnVsbCBzdHJlYW0gcHJvdmlkZXIgY2FsbGJhY2suCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3RyZWFtUHJvdmlkZXIoT3V0Ym91bmRNZXNzYWdlQ29udGV4dC5TdHJlYW1Qcm92aWRlciBzdHJlYW1Qcm92aWRlcikgeworICAgICAgICBpZiAoaXNDbG9zZWQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuT1VUUFVUX1NUUkVBTV9DTE9TRUQoKSk7CisgICAgICAgIH0KKyAgICAgICAgT2JqZWN0cy5ub25OdWxsKHN0cmVhbVByb3ZpZGVyKTsKKworICAgICAgICBpZiAodGhpcy5zdHJlYW1Qcm92aWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLldBUk5JTkcsIExvY2FsaXphdGlvbk1lc3NhZ2VzLkNPTU1JVFRJTkdfU1RSRUFNX0FMUkVBRFlfSU5JVElBTElaRUQoKSk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5zdHJlYW1Qcm92aWRlciA9IHN0cmVhbVByb3ZpZGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuYWJsZSBidWZmZXJpbmcgb2YgdGhlIHNlcmlhbGl6ZWQgZW50aXR5LgorICAgICAqCisgICAgICogQHBhcmFtIGJ1ZmZlclNpemUgc2l6ZSBvZiB0aGUgYnVmZmVyLiBXaGVuIHRoZSB2YWx1ZSBpcyBsZXNzIG9yIGVxdWFsIHRvIHplcm8gdGhlIGJ1ZmZlcmluZyB3aWxsIGJlIGRpc2FibGVkIGFuZCB7QGNvZGUgLTF9CisgICAgICogICAgICAgICAgICAgICAgICAgd2lsbCBiZSBwYXNzZWQgdG8gdGhlCisgICAgICogICAgICAgICAgICAgICAgICAge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuT3V0Ym91bmRNZXNzYWdlQ29udGV4dC5TdHJlYW1Qcm92aWRlciNnZXRPdXRwdXRTdHJlYW0oaW50KSBjYWxsYmFja30uCisgICAgICovCisgICAgcHVibGljIHZvaWQgZW5hYmxlQnVmZmVyaW5nKGludCBidWZmZXJTaXplKSB7CisgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tTdGF0ZSghaXNDb21taXR0ZWQgJiYgKHRoaXMuYnVmZmVyID09IG51bGwgfHwgdGhpcy5idWZmZXIuc2l6ZSgpID09IDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09NTUlUVElOR19TVFJFQU1fQlVGRkVSSU5HX0lMTEVHQUxfU1RBVEUpOworICAgICAgICB0aGlzLmJ1ZmZlclNpemUgPSBidWZmZXJTaXplOworICAgICAgICBpZiAoYnVmZmVyU2l6ZSA8PSAwKSB7CisgICAgICAgICAgICB0aGlzLmRpcmVjdFdyaXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIHRoaXMuYnVmZmVyID0gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRpcmVjdFdyaXRlID0gZmFsc2U7CisgICAgICAgICAgICBidWZmZXIgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKGJ1ZmZlclNpemUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5hYmxlIGJ1ZmZlcmluZyBvZiB0aGUgc2VyaWFsaXplZCBlbnRpdHkgd2l0aCB0aGUge0BsaW5rICNERUZBVUxUX0JVRkZFUl9TSVpFIGRlZmF1bHQgYnVmZmVyIHNpemUgfS4KKyAgICAgKi8KKyAgICB2b2lkIGVuYWJsZUJ1ZmZlcmluZygpIHsKKyAgICAgICAgZW5hYmxlQnVmZmVyaW5nKERFRkFVTFRfQlVGRkVSX1NJWkUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZSB3aGV0aGVyIHRoZSBzdHJlYW0gd2FzIGFscmVhZHkgY29tbWl0dGVkIG9yIG5vdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgc3RyZWFtIHdhcyBhbHJlYWR5IGNvbW1pdHRlZCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNDb21taXR0ZWQoKSB7CisgICAgICAgIHJldHVybiBpc0NvbW1pdHRlZDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY29tbWl0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY29tbWl0U3RyZWFtKC0xKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY29tbWl0U3RyZWFtKGludCBjdXJyZW50U2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFpc0NvbW1pdHRlZCkgeworICAgICAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja1N0YXRlKHN0cmVhbVByb3ZpZGVyICE9IG51bGwsIFNUUkVBTV9QUk9WSURFUl9OVUxMKTsKKyAgICAgICAgICAgIGFkYXB0ZWRPdXRwdXQgPSBzdHJlYW1Qcm92aWRlci5nZXRPdXRwdXRTdHJlYW0oY3VycmVudFNpemUpOworICAgICAgICAgICAgaWYgKGFkYXB0ZWRPdXRwdXQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGFkYXB0ZWRPdXRwdXQgPSBuZXcgTnVsbE91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkaXJlY3RXcml0ZSA9IHRydWU7CisgICAgICAgICAgICBpc0NvbW1pdHRlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlIGJbXSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGRpcmVjdFdyaXRlKSB7CisgICAgICAgICAgICBjb21taXRTdHJlYW0oKTsKKyAgICAgICAgICAgIGFkYXB0ZWRPdXRwdXQud3JpdGUoYik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoYi5sZW5ndGggKyBidWZmZXIuc2l6ZSgpID4gYnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgICAgIGZsdXNoQnVmZmVyKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBhZGFwdGVkT3V0cHV0LndyaXRlKGIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBidWZmZXIud3JpdGUoYik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlIGJbXSwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGRpcmVjdFdyaXRlKSB7CisgICAgICAgICAgICBjb21taXRTdHJlYW0oKTsKKyAgICAgICAgICAgIGFkYXB0ZWRPdXRwdXQud3JpdGUoYiwgb2ZmLCBsZW4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGxlbiArIGJ1ZmZlci5zaXplKCkgPiBidWZmZXJTaXplKSB7CisgICAgICAgICAgICAgICAgZmx1c2hCdWZmZXIoZmFsc2UpOworICAgICAgICAgICAgICAgIGFkYXB0ZWRPdXRwdXQud3JpdGUoYiwgb2ZmLCBsZW4pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBidWZmZXIud3JpdGUoYiwgb2ZmLCBsZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChkaXJlY3RXcml0ZSkgeworICAgICAgICAgICAgY29tbWl0U3RyZWFtKCk7CisgICAgICAgICAgICBhZGFwdGVkT3V0cHV0LndyaXRlKGIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGJ1ZmZlci5zaXplKCkgKyAxID4gYnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgICAgIGZsdXNoQnVmZmVyKGZhbHNlKTsKKyAgICAgICAgICAgICAgICBhZGFwdGVkT3V0cHV0LndyaXRlKGIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBidWZmZXIud3JpdGUoYik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21taXQgdGhlIG91dHB1dCBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIHdoZW4gdW5kZXJseWluZyBzdHJlYW0gcmV0dXJuZWQgZnJvbSB0aGUgY2FsbGJhY2sgbWV0aG9kIHRocm93cyB0aGUgaW8gZXhjZXB0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvbW1pdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZsdXNoQnVmZmVyKHRydWUpOworICAgICAgICBjb21taXRTdHJlYW0oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpc0Nsb3NlZCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaXNDbG9zZWQgPSB0cnVlOworCisgICAgICAgIGlmIChzdHJlYW1Qcm92aWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICBzdHJlYW1Qcm92aWRlciA9IE5VTExfU1RSRUFNX1BST1ZJREVSOworICAgICAgICB9CisgICAgICAgIGNvbW1pdCgpOworICAgICAgICBhZGFwdGVkT3V0cHV0LmNsb3NlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgdGhlIGNvbW1pdHRpbmcgb3V0cHV0IHN0cmVhbSBoYXMgYmVlbiBjbG9zZWQgYWxyZWFkeS4KKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzdHJlYW0gaGFzIGJlZW4gY2xvc2VkLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Nsb3NlZCgpIHsKKyAgICAgICAgcmV0dXJuIGlzQ2xvc2VkOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGlzQ29tbWl0dGVkKCkpIHsKKyAgICAgICAgICAgIGFkYXB0ZWRPdXRwdXQuZmx1c2goKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBmbHVzaEJ1ZmZlcihib29sZWFuIGVuZE9mU3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAoIWRpcmVjdFdyaXRlKSB7CisgICAgICAgICAgICBpbnQgY3VycmVudFNpemU7CisgICAgICAgICAgICBpZiAoZW5kT2ZTdHJlYW0pIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50U2l6ZSA9IGJ1ZmZlciA9PSBudWxsID8gMCA6IGJ1ZmZlci5zaXplKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGN1cnJlbnRTaXplID0gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbW1pdFN0cmVhbShjdXJyZW50U2l6ZSk7CisgICAgICAgICAgICBpZiAoYnVmZmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBidWZmZXIud3JpdGVUbyhhZGFwdGVkT3V0cHV0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL0NvbXBsZXRhYmxlUmVhZGVyLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvQ29tcGxldGFibGVSZWFkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDcwMjZlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL0NvbXBsZXRhYmxlUmVhZGVyLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsOworCitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyOworCisvKioKKyAqIEEge0BsaW5rIE1lc3NhZ2VCb2R5UmVhZGVyfSBtYXkgaW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIHRvIHNpZ25hbCB0aGF0CisgKiByZWFkaW5nIGZyb20gdGhlIHVuZGVybHlpbmcgaW5wdXQgc3RyZWFtIGNhbiBiZSBmdWxseSBjb21wbGV0ZWQuCisgKiA8cD4KKyAqIFRoaXMgaXMgdXNlZnVsIGluIHNjZW5hcmlvcyB3aGVyZSBhbiBpbnN0YW5jZSBvZiB0aGUgdHlwZSB3aWxsIGJlIHByb2Nlc3NlZAorICogYWZ0ZXIgdGhlIGlucHV0IHN0cmVhbSwgZnJvbSB3aGljaCBpdCB3YXMgcmVhZCwgaGFzIGJlZW4gY2xvc2VkLgorICoKKyAqIEBwYXJhbSA8VD4gdGhlIHR5cGUgcmV0dXJuZWQgZnJvbSBhIHtAbGluayBNZXNzYWdlQm9keVJlYWRlcn0uCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQHNlZSBNZXNzYWdlQm9keVJlYWRlcgorICovCitwdWJsaWMgaW50ZXJmYWNlIENvbXBsZXRhYmxlUmVhZGVyPFQ+IHsKKworICAgIC8qKgorICAgICAqIENvbXBsZXRlIHRoZSByZWFkaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIHQgYW4gaW5zdGFuY2Ugb2YgdGhlIFR5cGUge0Bjb2RlIFR9LgorICAgICAqIEByZXR1cm4gdGhlIGNvbXBsZXRlIGluc3RhbmNlIG9mIHtAY29kZSBUfS4KKyAgICAgKi8KKyAgICBUIGNvbXBsZXRlKFQgdCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvQ29va2llUHJvdmlkZXIuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9Db29raWVQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNjNkYmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvQ29va2llUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvb2tpZTsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuSGVhZGVyRGVsZWdhdGVQcm92aWRlcjsKKworaW1wb3J0IHN0YXRpYyBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLlV0aWxzLnRocm93SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uSWZOdWxsOworCisvKioKKyAqIFJlcXVlc3Qge0Bjb2RlIENvb2tpZX0ge0BsaW5rIEhlYWRlckRlbGVnYXRlUHJvdmlkZXIgaGVhZGVyIGRlbGVnYXRlIHByb3ZpZGVyfS4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitAU2luZ2xldG9uCitwdWJsaWMgY2xhc3MgQ29va2llUHJvdmlkZXIgaW1wbGVtZW50cyBIZWFkZXJEZWxlZ2F0ZVByb3ZpZGVyPENvb2tpZT4geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoQ2xhc3M8Pz4gdHlwZSkgeworICAgICAgICByZXR1cm4gdHlwZSA9PSBDb29raWUuY2xhc3M7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZyhDb29raWUgY29va2llKSB7CisKKyAgICAgICAgdGhyb3dJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25JZk51bGwoY29va2llLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5DT09LSUVfSVNfTlVMTCgpKTsKKworICAgICAgICBTdHJpbmdCdWlsZGVyIGIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisgICAgICAgIGIuYXBwZW5kKCIkVmVyc2lvbj0iKS5hcHBlbmQoY29va2llLmdldFZlcnNpb24oKSkuYXBwZW5kKCc7Jyk7CisKKyAgICAgICAgYi5hcHBlbmQoY29va2llLmdldE5hbWUoKSkuYXBwZW5kKCc9Jyk7CisgICAgICAgIFN0cmluZ0J1aWxkZXJVdGlscy5hcHBlbmRRdW90ZWRJZldoaXRlc3BhY2UoYiwgY29va2llLmdldFZhbHVlKCkpOworCisgICAgICAgIGlmIChjb29raWUuZ2V0RG9tYWluKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgYi5hcHBlbmQoIjskRG9tYWluPSIpOworICAgICAgICAgICAgU3RyaW5nQnVpbGRlclV0aWxzLmFwcGVuZFF1b3RlZElmV2hpdGVzcGFjZShiLCBjb29raWUuZ2V0RG9tYWluKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChjb29raWUuZ2V0UGF0aCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGIuYXBwZW5kKCI7JFBhdGg9Iik7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyVXRpbHMuYXBwZW5kUXVvdGVkSWZXaGl0ZXNwYWNlKGIsIGNvb2tpZS5nZXRQYXRoKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENvb2tpZSBmcm9tU3RyaW5nKFN0cmluZyBoZWFkZXIpIHsKKyAgICAgICAgdGhyb3dJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25JZk51bGwoaGVhZGVyLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5DT09LSUVfSVNfTlVMTCgpKTsKKyAgICAgICAgcmV0dXJuIEh0dHBIZWFkZXJSZWFkZXIucmVhZENvb2tpZShoZWFkZXIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9Db29raWVzUGFyc2VyLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvQ29va2llc1BhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NjBjZWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvQ29va2llc1BhcnNlci5qYXZhCkBAIC0wLDAgKzEsMTcyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvb2tpZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk5ld0Nvb2tpZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworCisvKioKKyAqIENvb2tpZXMgcGFyc2VyLgorICoKKyAqIEBhdXRob3IgTWFyYyBIYWRsZXkKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBDb29raWVzUGFyc2VyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKENvb2tpZXNQYXJzZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE11dGFibGVDb29raWUgeworCisgICAgICAgIFN0cmluZyBuYW1lOworICAgICAgICBTdHJpbmcgdmFsdWU7CisgICAgICAgIGludCB2ZXJzaW9uID0gQ29va2llLkRFRkFVTFRfVkVSU0lPTjsKKyAgICAgICAgU3RyaW5nIHBhdGggPSBudWxsOworICAgICAgICBTdHJpbmcgZG9tYWluID0gbnVsbDsKKworICAgICAgICBwdWJsaWMgTXV0YWJsZUNvb2tpZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvb2tpZSBnZXRJbW11dGFibGVDb29raWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENvb2tpZShuYW1lLCB2YWx1ZSwgcGF0aCwgZG9tYWluLCB2ZXJzaW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgQ29va2llPiBwYXJzZUNvb2tpZXMoU3RyaW5nIGhlYWRlcikgeworICAgICAgICBTdHJpbmcgYml0ZXNbXSA9IGhlYWRlci5zcGxpdCgiWzssXSIpOworICAgICAgICBNYXA8U3RyaW5nLCBDb29raWU+IGNvb2tpZXMgPSBuZXcgTGlua2VkSGFzaE1hcDxTdHJpbmcsIENvb2tpZT4oKTsKKyAgICAgICAgaW50IHZlcnNpb24gPSAwOworICAgICAgICBNdXRhYmxlQ29va2llIGNvb2tpZSA9IG51bGw7CisgICAgICAgIGZvciAoU3RyaW5nIGJpdGUgOiBiaXRlcykgeworICAgICAgICAgICAgU3RyaW5nIGNydW1ic1tdID0gYml0ZS5zcGxpdCgiPSIsIDIpOworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBjcnVtYnMubGVuZ3RoID4gMCA/IGNydW1ic1swXS50cmltKCkgOiAiIjsKKyAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGNydW1icy5sZW5ndGggPiAxID8gY3J1bWJzWzFdLnRyaW0oKSA6ICIiOworICAgICAgICAgICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoIlwiIikgJiYgdmFsdWUuZW5kc1dpdGgoIlwiIikgJiYgdmFsdWUubGVuZ3RoKCkgPiAxKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMSwgdmFsdWUubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbmFtZS5zdGFydHNXaXRoKCIkIikpIHsKKyAgICAgICAgICAgICAgICBpZiAoY29va2llICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY29va2llcy5wdXQoY29va2llLm5hbWUsIGNvb2tpZS5nZXRJbW11dGFibGVDb29raWUoKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY29va2llID0gbmV3IE11dGFibGVDb29raWUobmFtZSwgdmFsdWUpOworICAgICAgICAgICAgICAgIGNvb2tpZS52ZXJzaW9uID0gdmVyc2lvbjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5zdGFydHNXaXRoKCIkVmVyc2lvbiIpKSB7CisgICAgICAgICAgICAgICAgdmVyc2lvbiA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLnN0YXJ0c1dpdGgoIiRQYXRoIikgJiYgY29va2llICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb29raWUucGF0aCA9IHZhbHVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChuYW1lLnN0YXJ0c1dpdGgoIiREb21haW4iKSAmJiBjb29raWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvb2tpZS5kb21haW4gPSB2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY29va2llICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvb2tpZXMucHV0KGNvb2tpZS5uYW1lLCBjb29raWUuZ2V0SW1tdXRhYmxlQ29va2llKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb29raWVzOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQ29va2llIHBhcnNlQ29va2llKFN0cmluZyBoZWFkZXIpIHsKKyAgICAgICAgTWFwPFN0cmluZywgQ29va2llPiBjb29raWVzID0gcGFyc2VDb29raWVzKGhlYWRlcik7CisgICAgICAgIHJldHVybiBjb29raWVzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0VmFsdWUoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNdXRhYmxlTmV3Q29va2llIHsKKworICAgICAgICBTdHJpbmcgbmFtZSA9IG51bGw7CisgICAgICAgIFN0cmluZyB2YWx1ZSA9IG51bGw7CisgICAgICAgIFN0cmluZyBwYXRoID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIGRvbWFpbiA9IG51bGw7CisgICAgICAgIGludCB2ZXJzaW9uID0gQ29va2llLkRFRkFVTFRfVkVSU0lPTjsKKyAgICAgICAgU3RyaW5nIGNvbW1lbnQgPSBudWxsOworICAgICAgICBpbnQgbWF4QWdlID0gTmV3Q29va2llLkRFRkFVTFRfTUFYX0FHRTsKKyAgICAgICAgYm9vbGVhbiBzZWN1cmUgPSBmYWxzZTsKKyAgICAgICAgYm9vbGVhbiBodHRwT25seSA9IGZhbHNlOworICAgICAgICBEYXRlIGV4cGlyeSA9IG51bGw7CisKKyAgICAgICAgcHVibGljIE11dGFibGVOZXdDb29raWUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBOZXdDb29raWUgZ2V0SW1tdXRhYmxlTmV3Q29va2llKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBOZXdDb29raWUobmFtZSwgdmFsdWUsIHBhdGgsIGRvbWFpbiwgdmVyc2lvbiwgY29tbWVudCwgbWF4QWdlLCBleHBpcnksIHNlY3VyZSwgaHR0cE9ubHkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBOZXdDb29raWUgcGFyc2VOZXdDb29raWUoU3RyaW5nIGhlYWRlcikgeworICAgICAgICBTdHJpbmcgYml0ZXNbXSA9IGhlYWRlci5zcGxpdCgiWzssXSIpOworCisgICAgICAgIE11dGFibGVOZXdDb29raWUgY29va2llID0gbnVsbDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiaXRlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIGNydW1ic1tdID0gYml0ZXNbaV0uc3BsaXQoIj0iLCAyKTsKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gY3J1bWJzLmxlbmd0aCA+IDAgPyBjcnVtYnNbMF0udHJpbSgpIDogIiI7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBjcnVtYnMubGVuZ3RoID4gMSA/IGNydW1ic1sxXS50cmltKCkgOiAiIjsKKworICAgICAgICAgICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoIlwiIikgJiYgdmFsdWUuZW5kc1dpdGgoIlwiIikgJiYgdmFsdWUubGVuZ3RoKCkgPiAxKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMSwgdmFsdWUubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvb2tpZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29va2llID0gbmV3IE11dGFibGVOZXdDb29raWUobmFtZSwgdmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGFyYW0gPSBuYW1lLnRvTG93ZXJDYXNlKCk7CisKKyAgICAgICAgICAgICAgICBpZiAocGFyYW0uc3RhcnRzV2l0aCgiY29tbWVudCIpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvb2tpZS5jb21tZW50ID0gdmFsdWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbS5zdGFydHNXaXRoKCJkb21haW4iKSkgeworICAgICAgICAgICAgICAgICAgICBjb29raWUuZG9tYWluID0gdmFsdWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbS5zdGFydHNXaXRoKCJtYXgtYWdlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgY29va2llLm1heEFnZSA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW0uc3RhcnRzV2l0aCgicGF0aCIpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvb2tpZS5wYXRoID0gdmFsdWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbS5zdGFydHNXaXRoKCJzZWN1cmUiKSkgeworICAgICAgICAgICAgICAgICAgICBjb29raWUuc2VjdXJlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtLnN0YXJ0c1dpdGgoInZlcnNpb24iKSkgeworICAgICAgICAgICAgICAgICAgICBjb29raWUudmVyc2lvbiA9IEludGVnZXIucGFyc2VJbnQodmFsdWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW0uc3RhcnRzV2l0aCgiZG9tYWluIikpIHsKKyAgICAgICAgICAgICAgICAgICAgY29va2llLmRvbWFpbiA9IHZhbHVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW0uc3RhcnRzV2l0aCgiaHR0cG9ubHkiKSkgeworICAgICAgICAgICAgICAgICAgICBjb29raWUuaHR0cE9ubHkgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gIGVsc2UgaWYgKHBhcmFtLnN0YXJ0c1dpdGgoImV4cGlyZXMiKSkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29va2llLmV4cGlyeSA9IEh0dHBEYXRlRm9ybWF0LnJlYWREYXRlKHZhbHVlICsgIiwgIiArIGJpdGVzWysraV0pOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLkZJTkUsIExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX05FV0NPT0tJRV9FWFBJUkVTKHZhbHVlKSwgZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY29va2llLmdldEltbXV0YWJsZU5ld0Nvb2tpZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByZXZlbnRzIGluc3RhbnRpYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBDb29raWVzUGFyc2VyKCkgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9EYXRhU291cmNlUHJvdmlkZXIuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9EYXRhU291cmNlUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmEyNTAzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL0RhdGFTb3VyY2VQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTcwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworCitpbXBvcnQgamF2YXguYWN0aXZhdGlvbi5EYXRhU291cmNlOworCisvKioKKyAqIFByb3ZpZGVyIGZvciBtYXJzaGFsbGluZy91bi1tYXJzaGFsbGluZyBvZiB7QGNvZGUgYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtfQorICogZW50aXR5IHR5cGUgdG8vZnJvbSBhIHtAbGluayBEYXRhU291cmNlfSBpbnN0YW5jZS4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitAUHJvZHVjZXMoeyJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLCAiKi8qIn0pCitAQ29uc3VtZXMoeyJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLCAiKi8qIn0pCitwdWJsaWMgY2xhc3MgRGF0YVNvdXJjZVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlUmVhZGVyV3JpdGVyUHJvdmlkZXI8RGF0YVNvdXJjZT4geworCisgICAgLyoqCisgICAgICogTW9kaWZpZWQgZnJvbSBqYXZheC5tYWlsLnV0aWwuQnl0ZUFycmF5RGF0YVNvdXJjZQorICAgICAqCisgICAgICogQSBEYXRhU291cmNlIGJhY2tlZCBieSBhIGJ5dGUgYXJyYXkuICBUaGUgYnl0ZSBhcnJheSBtYXkgYmUKKyAgICAgKiBwYXNzZWQgaW4gZGlyZWN0bHksIG9yIG1heSBiZSBpbml0aWFsaXplZCBmcm9tIGFuIElucHV0U3RyZWFtCisgICAgICogb3IgYSBTdHJpbmcuCisgICAgICoKKyAgICAgKiBAc2luY2UgSmF2YU1haWwgMS40CisgICAgICogQGF1dGhvciBKb2huIE1hbmkKKyAgICAgKiBAYXV0aG9yIEJpbGwgU2hhbm5vbgorICAgICAqIEBhdXRob3IgTWF4IFNwaXZhaworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnl0ZUFycmF5RGF0YVNvdXJjZSBpbXBsZW1lbnRzIERhdGFTb3VyY2UgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHR5cGU7CisKKyAgICAgICAgcHJpdmF0ZSBieXRlW10gZGF0YTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbGVuID0gLTE7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG5hbWUgPSAiIjsKKworICAgICAgICBzdGF0aWMgY2xhc3MgRFNCeXRlQXJyYXlPdXRwdXRTdHJlYW0gZXh0ZW5kcyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0geworCisgICAgICAgICAgICBwdWJsaWMgYnl0ZVtdIGdldEJ1ZigpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYnVmOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdWJsaWMgaW50IGdldENvdW50KCkgeworICAgICAgICAgICAgICAgIHJldHVybiBjb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCeXRlQXJyYXlEYXRhU291cmNlKGZpbmFsIElucHV0U3RyZWFtIGlzLCBmaW5hbCBTdHJpbmcgdHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIERTQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG9zID0gbmV3IERTQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICBSZWFkZXJXcml0ZXIud3JpdGVUbyhpcywgb3MpOworICAgICAgICAgICAgdGhpcy5kYXRhID0gb3MuZ2V0QnVmKCk7CisgICAgICAgICAgICB0aGlzLmxlbiA9IG9zLmdldENvdW50KCk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gZG91YmxlcyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIGV2ZXJ5IHRpbWUKKyAgICAgICAgICAgICAqIGl0IG5lZWRzIHRvIGV4cGFuZCwgd2hpY2ggY2FuIHdhc3RlIGEgbG90IG9mIG1lbW9yeSBpbiB0aGUgd29yc3QKKyAgICAgICAgICAgICAqIGNhc2Ugd2l0aCBsYXJnZSBidWZmZXJzLiAgQ2hlY2sgaG93IG11Y2ggaXMgd2FzdGVkIGhlcmUgYW5kIGlmCisgICAgICAgICAgICAgKiBpdCdzIHRvbyBtdWNoLCBjb3B5IHRoZSBkYXRhIGludG8gYSBuZXcgYnVmZmVyIGFuZCBhbGxvdyB0aGUKKyAgICAgICAgICAgICAqIG9sZCBidWZmZXIgdG8gYmUgZ2FyYmFnZSBjb2xsZWN0ZWQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICh0aGlzLmRhdGEubGVuZ3RoIC0gdGhpcy5sZW4gPiAyNTYgKiAxMDI0KSB7CisgICAgICAgICAgICAgICAgdGhpcy5kYXRhID0gb3MudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgICAgICAgICB0aGlzLmxlbiA9IHRoaXMuZGF0YS5sZW5ndGg7ICAgIC8vIHNob3VsZCBiZSB0aGUgc2FtZQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigibm8gZGF0YSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxlbiA8IDApIHsKKyAgICAgICAgICAgICAgICBsZW4gPSBkYXRhLmxlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZGF0YSwgMCwgbGVuKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oImNhbm5vdCBkbyB0aGlzIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0TmFtZShmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoZmluYWwgQ2xhc3M8Pz4gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiBEYXRhU291cmNlLmNsYXNzID09IHR5cGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIERhdGFTb3VyY2UgcmVhZEZyb20oCisgICAgICAgICAgICBmaW5hbCBDbGFzczxEYXRhU291cmNlPiB0eXBlLAorICAgICAgICAgICAgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgQnl0ZUFycmF5RGF0YVNvdXJjZShlbnRpdHlTdHJlYW0sIChtZWRpYVR5cGUgPT0gbnVsbCkgPyBudWxsIDogbWVkaWFUeXBlLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKGZpbmFsIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICByZXR1cm4gRGF0YVNvdXJjZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oCisgICAgICAgICAgICBmaW5hbCBEYXRhU291cmNlIHQsCisgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBpbiA9IHQuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdyaXRlVG8oaW4sIGVudGl0eVN0cmVhbSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpbi5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL0RhdGVQcm92aWRlci5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL0RhdGVQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMjc3OTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvRGF0ZVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsOworCitpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5IZWFkZXJEZWxlZ2F0ZVByb3ZpZGVyOworCitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuVXRpbHMudGhyb3dJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25JZk51bGw7CisKKy8qKgorICoge0Bjb2RlIERhdGV9IHtAbGluayBIZWFkZXJEZWxlZ2F0ZVByb3ZpZGVyIGhlYWRlciBkZWxlZ2F0ZSBwcm92aWRlcn0uCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQFNpbmdsZXRvbgorcHVibGljIGNsYXNzIERhdGVQcm92aWRlciBpbXBsZW1lbnRzIEhlYWRlckRlbGVnYXRlUHJvdmlkZXI8RGF0ZT4geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoZmluYWwgQ2xhc3M8Pz4gdHlwZSkgeworICAgICAgICByZXR1cm4gRGF0ZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoZmluYWwgRGF0ZSBoZWFkZXIpIHsKKyAgICAgICAgdGhyb3dJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25JZk51bGwoaGVhZGVyLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5EQVRFX0lTX05VTEwoKSk7CisgICAgICAgIHJldHVybiBIdHRwRGF0ZUZvcm1hdC5nZXRQcmVmZXJyZWREYXRlRm9ybWF0KCkuZm9ybWF0KGhlYWRlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIERhdGUgZnJvbVN0cmluZyhmaW5hbCBTdHJpbmcgaGVhZGVyKSB7CisKKyAgICAgICAgdGhyb3dJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25JZk51bGwoaGVhZGVyLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5EQVRFX0lTX05VTEwoKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBIdHRwSGVhZGVyUmVhZGVyLnJlYWREYXRlKGhlYWRlcik7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFBhcnNlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiRXJyb3IgcGFyc2luZyBkYXRlICciICsgaGVhZGVyICsgIiciLCBleCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvRW50aXR5SW5wdXRTdHJlYW0uamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9FbnRpdHlJbnB1dFN0cmVhbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlNDgxZTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvRW50aXR5SW5wdXRTdHJlYW0uamF2YQpAQCAtMCwwICsxLDIzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUHVzaGJhY2tJbnB1dFN0cmVhbTsKKworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKKworLyoqCisgKiBFbnRpdHkgaW5wdXQgc3RyZWFtIGN1c3RvbWl6ZWQgZm9yIGVudGl0eSBtZXNzYWdlIHByb2Nlc3Npbmc6CisgKiA8dWw+CisgKiA8bGk+Y29udGFpbnMge0BsaW5rICNpc0VtcHR5KCl9IG1ldGhvZC48L2xpPgorICogPGxpPntAbGluayAjY2xvc2UoKX0gbWV0aG9kIHRocm93cyBKZXJzZXktc3BlY2lmaWMgcnVudGltZSBleGNlcHRpb24gaW4gY2FzZSBvZiBhbiBJTyBlcnJvci48L2xpPgorICogPC91bD4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgRW50aXR5SW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7CisKKyAgICBwcml2YXRlIElucHV0U3RyZWFtIGlucHV0OworICAgIHByaXZhdGUgYm9vbGVhbiBjbG9zZWQgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiBlbnRpdHkgaW5wdXQgc3RyZWFtIGluc3RhbmNlIHdyYXBwaW5nIHRoZSBvcmlnaW5hbCBpbnB1dCBzdHJlYW0uCisgICAgICogPHAvPgorICAgICAqIEluIGNhc2UgdGhlIG9yaWdpbmFsIGVudGl0eSBzdHJlYW0gaXMgYWxyZWFkeSBvZiB0eXBlIHtAY29kZSBFbnRpdHlJbnB1dFN0cmVhbX0sCisgICAgICogdGhlIHN0cmVhbSBpcyByZXR1cm5lZCB3aXRob3V0IHdyYXBwaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGlucHV0U3RyZWFtIGlucHV0IHN0cmVhbS4KKyAgICAgKiBAcmV0dXJuIGVudGl0eSBpbnB1dCBzdHJlYW0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBFbnRpdHlJbnB1dFN0cmVhbSBjcmVhdGUoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHsKKyAgICAgICAgaWYgKGlucHV0U3RyZWFtIGluc3RhbmNlb2YgRW50aXR5SW5wdXRTdHJlYW0pIHsKKyAgICAgICAgICAgIHJldHVybiAoRW50aXR5SW5wdXRTdHJlYW0pIGlucHV0U3RyZWFtOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ldyBFbnRpdHlJbnB1dFN0cmVhbShpbnB1dFN0cmVhbSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXh0ZW5zaW9uIGNvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGlucHV0IHVuZGVybHlpbmcgd3JhcHBlZCBpbnB1dCBzdHJlYW0uCisgICAgICovCisgICAgcHVibGljIEVudGl0eUlucHV0U3RyZWFtKElucHV0U3RyZWFtIGlucHV0KSB7CisgICAgICAgIHRoaXMuaW5wdXQgPSBpbnB1dDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gaW5wdXQucmVhZCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGlucHV0LnJlYWQoYik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gaW5wdXQucmVhZChiLCBvZmYsIGxlbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgc2tpcChsb25nIG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBpbnB1dC5za2lwKG4pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgYXZhaWxhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGlucHV0LmF2YWlsYWJsZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG1hcmsoaW50IHJlYWRMaW1pdCkgeworICAgICAgICBpbnB1dC5tYXJrKHJlYWRMaW1pdCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKKyAgICAgICAgcmV0dXJuIGlucHV0Lm1hcmtTdXBwb3J0ZWQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICogPHA+CisgICAgICogVGhlIG1ldGhvZCBpcyBjdXN0b21pemVkIHRvIG5vdCB0aHJvdyBhbiB7QGxpbmsgSU9FeGNlcHRpb259IGlmIHRoZSByZXNldCBvcGVyYXRpb24gZmFpbHMuIEluc3RlYWQsCisgICAgICogYSBydW50aW1lIHtAbGluayBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9ufSBpcyB0aHJvd24uCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHRocm93cyBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uIGluIGNhc2UgdGhlIHJlc2V0IG9wZXJhdGlvbiBvbiB0aGUgdW5kZXJseWluZyBlbnRpdHkgaW5wdXQgc3RyZWFtIGZhaWxlZC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlucHV0LnJlc2V0KCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5NRVNTQUdFX0NPTlRFTlRfQlVGRkVSX1JFU0VUX0ZBSUxFRCgpLCBleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICogPHA+CisgICAgICogVGhlIG1ldGhvZCBpcyBjdXN0b21pemVkIHRvIG5vdCB0aHJvdyBhbiB7QGxpbmsgSU9FeGNlcHRpb259IGlmIHRoZSBjbG9zZSBvcGVyYXRpb24gZmFpbHMuIEluc3RlYWQsCisgICAgICogYSB3YXJuaW5nIG1lc3NhZ2UgaXMgbG9nZ2VkLgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gaW4gPSBpbnB1dDsKKyAgICAgICAgaWYgKGluID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWNsb3NlZCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGUuZy4gbWVhbnMgdGhhdCB0aGUgdW5kZXJseWluZyBzb2NrZXQgc3RyZWFtIGdvdCBjbG9zZWQgYnkgb3RoZXIgdGhyZWFkIHNvbWVob3cuLi4KKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5NRVNTQUdFX0NPTlRFTlRfSU5QVVRfU1RSRUFNX0NMT1NFX0ZBSUxFRCgpLCBleCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGNsb3NlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiB0aGUgdW5kZXJseWluZyBlbnRpdHkgc3RyZWFtIGlzIGVtcHR5LgorICAgICAqIDxwPgorICAgICAqIE5vdGUgdGhhdCB0aGUgb3BlcmF0aW9uIG1heSBuZWVkIHRvIGJsb2NrIHVudGlsIGEgZmlyc3QgYnl0ZSAob3IgRU9GKSBpcyBhdmFpbGFibGUgaW4gdGhlIHN0cmVhbS4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZW50aXR5IHN0cmVhbSBpcyBlbXB0eSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKKyAgICAgICAgZW5zdXJlTm90Q2xvc2VkKCk7CisKKyAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gaW4gPSBpbnB1dDsKKyAgICAgICAgaWYgKGluID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIFRyeSAjbWFya1N1cHBvcnRlZCBmaXJzdCAtICNhdmFpbGFibGUgb24gV0xTIHdhaXRzIHVudGlsIHNvY2tlZCB0aW1lb3V0IGlzIHJlYWNoZWQgd2hlbiBjaHVua2VkIGVuY29kaW5nIGlzIHVzZWQuCisgICAgICAgICAgICBpZiAoaW4ubWFya1N1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICAgICAgaW4ubWFyaygxKTsKKyAgICAgICAgICAgICAgICBpbnQgaSA9IGluLnJlYWQoKTsKKyAgICAgICAgICAgICAgICBpbi5yZXNldCgpOworICAgICAgICAgICAgICAgIHJldHVybiBpID09IC0xOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW4uYXZhaWxhYmxlKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTk9PUC4gVHJ5IG90aGVyIGFwcHJvYWNoZXMgYXMgdGhpcyBjYW4gZmFpbCBvbiBXTFMuCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50IGIgPSBpbi5yZWFkKCk7CisgICAgICAgICAgICAgICAgaWYgKGIgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgUHVzaGJhY2tJbnB1dFN0cmVhbSBwYmlzOworICAgICAgICAgICAgICAgIGlmIChpbiBpbnN0YW5jZW9mIFB1c2hiYWNrSW5wdXRTdHJlYW0pIHsKKyAgICAgICAgICAgICAgICAgICAgcGJpcyA9IChQdXNoYmFja0lucHV0U3RyZWFtKSBpbjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwYmlzID0gbmV3IFB1c2hiYWNrSW5wdXRTdHJlYW0oaW4sIDEpOworICAgICAgICAgICAgICAgICAgICBpbnB1dCA9IHBiaXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBiaXMudW5yZWFkKGIpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgdGhhdCB0aGUgZW50aXR5IGlucHV0IHN0cmVhbSBoYXMgbm90IGJlZW4gY2xvc2VkIHlldC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGluIGNhc2UgdGhlIGVudGl0eSBpbnB1dCBzdHJlYW0gaGFzIGJlZW4gY2xvc2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGVuc3VyZU5vdENsb3NlZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgICAgICBpZiAoY2xvc2VkKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX0VOVElUWV9TVFJFQU1fQ0xPU0VEKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjbG9zZWQgc3RhdHVzIG9mIHRoaXMgaW5wdXQgc3RyZWFtLgorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHN0cmVhbSBoYXMgYmVlbiBjbG9zZWQsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCkgeworICAgICAgICByZXR1cm4gY2xvc2VkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgd3JhcHBlZCBpbnB1dCBzdHJlYW0gaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHdyYXBwZWQgaW5wdXQgc3RyZWFtIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBJbnB1dFN0cmVhbSBnZXRXcmFwcGVkU3RyZWFtKCkgeworICAgICAgICByZXR1cm4gaW5wdXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB3cmFwcGVkIGlucHV0IHN0cmVhbSBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3cmFwcGVkIG5ldyBpbnB1dCBzdHJlYW0gaW5zdGFuY2UgdG8gYmUgd3JhcHBlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXRXcmFwcGVkU3RyZWFtKElucHV0U3RyZWFtIHdyYXBwZWQpIHsKKyAgICAgICAgaW5wdXQgPSB3cmFwcGVkOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9FbnRpdHlUYWdQcm92aWRlci5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL0VudGl0eVRhZ1Byb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZlOWRjMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9FbnRpdHlUYWdQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRW50aXR5VGFnOworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuSHR0cEhlYWRlclJlYWRlci5FdmVudDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuSGVhZGVyRGVsZWdhdGVQcm92aWRlcjsKKworaW1wb3J0IHN0YXRpYyBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLlV0aWxzLnRocm93SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uSWZOdWxsOworCisvKioKKyAqIHtAY29kZSBFVGFnfSB7QGxpbmsgSGVhZGVyRGVsZWdhdGVQcm92aWRlciBoZWFkZXIgZGVsZWdhdGUgcHJvdmlkZXJ9LgorICoKKyAqIEBhdXRob3IgTWFyYyBIYWRsZXkKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTaW5nbGV0b24KK3B1YmxpYyBjbGFzcyBFbnRpdHlUYWdQcm92aWRlciBpbXBsZW1lbnRzIEhlYWRlckRlbGVnYXRlUHJvdmlkZXI8RW50aXR5VGFnPiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhDbGFzczw/PiB0eXBlKSB7CisgICAgICAgIHJldHVybiB0eXBlID09IEVudGl0eVRhZy5jbGFzczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKEVudGl0eVRhZyBoZWFkZXIpIHsKKworICAgICAgICB0aHJvd0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbklmTnVsbChoZWFkZXIsIExvY2FsaXphdGlvbk1lc3NhZ2VzLkVOVElUWV9UQUdfSVNfTlVMTCgpKTsKKworICAgICAgICBTdHJpbmdCdWlsZGVyIGIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBpZiAoaGVhZGVyLmlzV2VhaygpKSB7CisgICAgICAgICAgICBiLmFwcGVuZCgiVy8iKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmdCdWlsZGVyVXRpbHMuYXBwZW5kUXVvdGVkKGIsIGhlYWRlci5nZXRWYWx1ZSgpKTsKKyAgICAgICAgcmV0dXJuIGIudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRW50aXR5VGFnIGZyb21TdHJpbmcoU3RyaW5nIGhlYWRlcikgeworCisgICAgICAgIHRocm93SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uSWZOdWxsKGhlYWRlciwgTG9jYWxpemF0aW9uTWVzc2FnZXMuRU5USVRZX1RBR19JU19OVUxMKCkpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBIdHRwSGVhZGVyUmVhZGVyIHJlYWRlciA9IEh0dHBIZWFkZXJSZWFkZXIubmV3SW5zdGFuY2UoaGVhZGVyKTsKKyAgICAgICAgICAgIEV2ZW50IGUgPSByZWFkZXIubmV4dChmYWxzZSk7CisgICAgICAgICAgICBpZiAoZSA9PSBFdmVudC5RdW90ZWRTdHJpbmcpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVudGl0eVRhZyhyZWFkZXIuZ2V0RXZlbnRWYWx1ZSgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChlID09IEV2ZW50LlRva2VuKSB7CisgICAgICAgICAgICAgICAgZmluYWwgQ2hhclNlcXVlbmNlIGV2ID0gcmVhZGVyLmdldEV2ZW50VmFsdWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoZXYgIT0gbnVsbCAmJiBldi5sZW5ndGgoKSA+IDAgJiYgZXYuY2hhckF0KDApID09ICdXJykgeworICAgICAgICAgICAgICAgICAgICByZWFkZXIubmV4dFNlcGFyYXRvcignLycpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVudGl0eVRhZyhyZWFkZXIubmV4dFF1b3RlZFN0cmluZygpLnRvU3RyaW5nKCksIHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJFcnJvciBwYXJzaW5nIGVudGl0eSB0YWcgJyIgKyBoZWFkZXIgKyAiJyIsIGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgIkVycm9yIHBhcnNpbmcgZW50aXR5IHRhZyAnIiArIGhlYWRlciArICInIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL0ZpbGVQcm92aWRlci5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL0ZpbGVQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZDM1MDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvRmlsZVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCisvKioKKyAqIFByb3ZpZGVyIGZvciBtYXJzaGFsbGluZy91bi1tYXJzaGFsbGluZyBvZiB7QGNvZGUgYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtfQorICogZW50aXR5IHR5cGUgdG8vZnJvbSBhIHtAbGluayBGaWxlfSBpbnN0YW5jZS4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitAUHJvZHVjZXMoeyJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLCAiKi8qIn0pCitAQ29uc3VtZXMoeyJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLCAiKi8qIn0pCitAU2luZ2xldG9uCitwdWJsaWMgZmluYWwgY2xhc3MgRmlsZVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlUmVhZGVyV3JpdGVyUHJvdmlkZXI8RmlsZT4geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZShmaW5hbCBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIEZpbGUuY2xhc3MgPT0gdHlwZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRmlsZSByZWFkRnJvbShmaW5hbCBDbGFzczxGaWxlPiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgRmlsZSBmaWxlID0gVXRpbHMuY3JlYXRlVGVtcEZpbGUoKTsKKyAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdyaXRlVG8oZW50aXR5U3RyZWFtLCBzdHJlYW0pOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmlsZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShmaW5hbCBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIEZpbGUuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0eXBlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIEZpbGUgdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKG5ldyBGaWxlSW5wdXRTdHJlYW0odCksIFJlYWRlcldyaXRlci5CVUZGRVJfU0laRSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdyaXRlVG8oc3RyZWFtLCBlbnRpdHlTdHJlYW0pOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBnZXRTaXplKGZpbmFsIEZpbGUgdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICByZXR1cm4gdC5sZW5ndGgoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvRm9ybU11bHRpdmFsdWVkTWFwUHJvdmlkZXIuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9Gb3JtTXVsdGl2YWx1ZWRNYXBQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkY2UwNDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvRm9ybU11bHRpdmFsdWVkTWFwUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDg4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5QYXJhbWV0ZXJpemVkVHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uTnVsbGFibGVNdWx0aXZhbHVlZEhhc2hNYXA7CisKKy8qKgorICogUHJvdmlkZXIgZm9yIG1hcnNoYWxsaW5nL3VuLW1hcnNoYWxsaW5nIG9mIHtAY29kZSBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWR9CisgKiBlbnRpdHkgdHlwZSB0by9mcm9tIHtAbGluayBNdWx0aXZhbHVlZE1hcCBtdWx0aS12YWx1ZWQgbWFwfSBpbnN0YW5jZS4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpCitAQ29uc3VtZXMoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpCitAU2luZ2xldG9uCitwdWJsaWMgZmluYWwgY2xhc3MgRm9ybU11bHRpdmFsdWVkTWFwUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEZvcm1Qcm92aWRlcjxNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4+IHsKKworICAgIHByaXZhdGUgZmluYWwgVHlwZSBtYXBUeXBlOworCisgICAgcHVibGljIEZvcm1NdWx0aXZhbHVlZE1hcFByb3ZpZGVyKCkgeworICAgICAgICBQYXJhbWV0ZXJpemVkVHlwZSBpZmFjZSA9IChQYXJhbWV0ZXJpemVkVHlwZSkgdGhpcy5nZXRDbGFzcygpLmdldEdlbmVyaWNTdXBlcmNsYXNzKCk7CisgICAgICAgIG1hcFR5cGUgPSBpZmFjZS5nZXRBY3R1YWxUeXBlQXJndW1lbnRzKClbMF07CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgLy8gT25seSBhbGxvdyB0eXBlcyBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gYW5kIE11bHRpdmFsdWVkTWFwLgorICAgICAgICByZXR1cm4gdHlwZSA9PSBNdWx0aXZhbHVlZE1hcC5jbGFzcworICAgICAgICAgICAgICAgICYmICh0eXBlID09IGdlbmVyaWNUeXBlIHx8IG1hcFR5cGUuZXF1YWxzKGdlbmVyaWNUeXBlKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiByZWFkRnJvbSgKKyAgICAgICAgICAgIENsYXNzPE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPj4gdHlwZSwKKyAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb25zW10sCisgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gcmVhZEZyb20obmV3IE51bGxhYmxlTXVsdGl2YWx1ZWRIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpLCBtZWRpYVR5cGUsIHRydWUsIGVudGl0eVN0cmVhbSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiBNdWx0aXZhbHVlZE1hcC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oCisgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gdCwKKyAgICAgICAgICAgIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uc1tdLAorICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlVG8odCwgbWVkaWFUeXBlLCBlbnRpdHlTdHJlYW0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9Gb3JtUHJvdmlkZXIuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9Gb3JtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWI3OGFhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL0Zvcm1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5FbmNvZGVkOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRm9ybTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5OdWxsYWJsZU11bHRpdmFsdWVkSGFzaE1hcDsKKworLyoqCisgKiBQcm92aWRlciBmb3IgbWFyc2hhbGxpbmcvdW4tbWFyc2hhbGxpbmcgb2Yge0Bjb2RlIGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZH0KKyAqIGVudGl0eSB0eXBlIHRvL2Zyb20ge0BsaW5rIEZvcm0gSkFYLVJTIEZvcm19IGluc3RhbmNlLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQcm9kdWNlcyh7ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIsICIqLyoifSkKK0BDb25zdW1lcyh7ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIsICIqLyoifSkKK0BTaW5nbGV0b24KK3B1YmxpYyBmaW5hbCBjbGFzcyBGb3JtUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEZvcm1Qcm92aWRlcjxGb3JtPiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICByZXR1cm4gdHlwZSA9PSBGb3JtLmNsYXNzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBGb3JtIHJlYWRGcm9tKAorICAgICAgICAgICAgQ2xhc3M8Rm9ybT4gdHlwZSwKKyAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb25zW10sCisgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIHJldHVybiBuZXcgRm9ybShyZWFkRnJvbShuZXcgTnVsbGFibGVNdWx0aXZhbHVlZEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCksIG1lZGlhVHlwZSwgZGVjb2RlKGFubm90YXRpb25zKSwgZW50aXR5U3RyZWFtKSk7CisgICAgfQorCisKKyAgICBwcml2YXRlIGJvb2xlYW4gZGVjb2RlKEFubm90YXRpb24gYW5ub3RhdGlvbnNbXSkgeworICAgICAgICBmb3IgKEFubm90YXRpb24gYW5ub3RhdGlvbiA6IGFubm90YXRpb25zKSB7CisgICAgICAgICAgICBpZiAoYW5ub3RhdGlvbi5hbm5vdGF0aW9uVHlwZSgpLmVxdWFscyhFbmNvZGVkLmNsYXNzKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHR5cGUgPT0gRm9ybS5jbGFzczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKAorICAgICAgICAgICAgRm9ybSB0LAorICAgICAgICAgICAgQ2xhc3M8Pz4gdHlwZSwKKyAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb25zW10sCisgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgd3JpdGVUbyh0LmFzTWFwKCksIG1lZGlhVHlwZSwgZW50aXR5U3RyZWFtKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvR3JhbW1hclV0aWwuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9HcmFtbWFyVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZWY1OWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvR3JhbW1hclV0aWwuamF2YQpAQCAtMCwwICsxLDI2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsOworCisvKioKKyAqIENsYXNzIGNvbnRhaW5pbmcgc3RhdGljIHV0aWxpdHkgbWV0aG9kcyB0byB3b3JrIHdpdGggSFRUUCBoZWFkZXJzLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitmaW5hbCBjbGFzcyBHcmFtbWFyVXRpbCB7CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIHRva2VuIHR5cGUgaW4gdGhlIFRZUEVfVEFCTEUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVE9LRU4gPSAwOworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgcXVvdGVzIHR5cGUgaW4gdGhlIFRZUEVfVEFCTEUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUVVPVEVEX1NUUklORyA9IDE7CisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyBjb21tZW50IHR5cGUgaW4gdGhlIFRZUEVfVEFCTEUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09NTUVOVCA9IDI7CisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyBzZXBhcmF0b3IgdHlwZSBpbiB0aGUgVFlQRV9UQUJMRS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVBBUkFUT1IgPSAzOworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgY29udHJvbCB0eXBlIGluIHRoZSBUWVBFX1RBQkxFLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRST0wgPSA0OworICAgIC8qKgorICAgICAqIEFycmF5IG9mIGNoYXJzIHJlcHJlc2VudGluZyB3aGl0ZSBzcGFjZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIFdISVRFX1NQQUNFID0geydcdCcsICdccicsICdcbicsICcgJ307CisgICAgLyoqCisgICAgICogQXJyYXkgb2YgY2hhcnMgcmVwcmVzZW50aW5nIHNlcGFyYXRvcnMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhcltdIFNFUEFSQVRPUlMgPQorICAgICAgICAgICAgeycoJywgJyknLCAnPCcsICc+JywgJ0AnLCAnLCcsICc7JywgJzonLCAnXFwnLCAnIicsICcvJywgJ1snLCAnXScsICc/JywgJz0nLCAneycsICd9JywgJyAnLCAnXHQnfTsKKyAgICAvKioKKyAgICAgKiBNYXBwaW5nIG9mIGNoYXJzIHRvIHR5cGVzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIFRZUEVfVEFCTEUgPSBjcmVhdGVFdmVudFRhYmxlKCk7CisgICAgLyoqCisgICAgICogQ29udmVuaWVuY2UgdGFibGUgbWFwcGluZyBjaGFycyB0byB0cnVlIGlmIHRoZXkgYXJlIHdoaXRlIHNwYWNlIGNoYXJzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW5bXSBJU19XSElURV9TUEFDRSA9IGNyZWF0ZVdoaXRlU3BhY2VUYWJsZSgpOworICAgIC8qKgorICAgICAqIGNvbnZlbmllbmNlIHRhYmxlIG1hcHBpbmcgY2hhcnMgdG8gdHJ1ZSBpZiB0aGV5IGFyZSB0b2tlbnMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbltdIElTX1RPS0VOID0gY3JlYXRlVG9rZW5UYWJsZSgpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50W10gY3JlYXRlRXZlbnRUYWJsZSgpIHsKKyAgICAgICAgaW50W10gdGFibGUgPSBuZXcgaW50W0J5dGUuTUFYX1ZBTFVFICsgMV07CisKKyAgICAgICAgLy8gQ29udHJvbAorICAgICAgICBmaW5hbCBpbnQgY29udHJvbF9jaGFyX2JvdW5kID0gMzI7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udHJvbF9jaGFyX2JvdW5kOyBpKyspIHsKKyAgICAgICAgICAgIHRhYmxlW2ldID0gQ09OVFJPTDsKKyAgICAgICAgfQorICAgICAgICB0YWJsZVtCeXRlLk1BWF9WQUxVRV0gPSBDT05UUk9MOworCisgICAgICAgIC8vIFRva2VuCisgICAgICAgIGZvciAoaW50IGkgPSBjb250cm9sX2NoYXJfYm91bmQ7IGkgPCBCeXRlLk1BWF9WQUxVRTsgaSsrKSB7CisgICAgICAgICAgICB0YWJsZVtpXSA9IFRPS0VOOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2VwYXJhdG9yCisgICAgICAgIGZvciAoY2hhciBjIDogU0VQQVJBVE9SUykgeworICAgICAgICAgICAgdGFibGVbY10gPSBTRVBBUkFUT1I7CisgICAgICAgIH0KKworICAgICAgICAvLyBDb21tZW50CisgICAgICAgIHRhYmxlWycoJ10gPSBDT01NRU5UOworCisgICAgICAgIC8vIFF1b3RlZFN0cmluZworICAgICAgICB0YWJsZVsnIiddID0gUVVPVEVEX1NUUklORzsKKworICAgICAgICAvLyBXaGl0ZSBzcGFjZQorICAgICAgICBmb3IgKGNoYXIgYyA6IFdISVRFX1NQQUNFKSB7CisgICAgICAgICAgICB0YWJsZVtjXSA9IC0xOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRhYmxlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW5bXSBjcmVhdGVXaGl0ZVNwYWNlVGFibGUoKSB7CisgICAgICAgIGJvb2xlYW5bXSB0YWJsZSA9IG5ldyBib29sZWFuW0J5dGUuTUFYX1ZBTFVFICsgMV07CisKKyAgICAgICAgZm9yIChjaGFyIGMgOiBXSElURV9TUEFDRSkgeworICAgICAgICAgICAgdGFibGVbY10gPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRhYmxlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW5bXSBjcmVhdGVUb2tlblRhYmxlKCkgeworICAgICAgICBib29sZWFuW10gdGFibGUgPSBuZXcgYm9vbGVhbltCeXRlLk1BWF9WQUxVRSArIDFdOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IEJ5dGUuTUFYX1ZBTFVFOyBpKyspIHsKKyAgICAgICAgICAgIHRhYmxlW2ldID0gKFRZUEVfVEFCTEVbaV0gPT0gVE9LRU4pOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRhYmxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoZSBwcm92aWRlZCBjaGFyIGlzIGEgd2hpdGUgc3BhY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyBjaGFyIHRvIGNoZWNrLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGMgaXMgYSB3aGl0ZSBzcGFjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNXaGl0ZVNwYWNlKGZpbmFsIGNoYXIgYykgeworICAgICAgICByZXR1cm4gKGMgPD0gQnl0ZS5NQVhfVkFMVUUgJiYgSVNfV0hJVEVfU1BBQ0VbY10pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoZSBwcm92aWRlZCBjaGFyIGlzIGEgdG9rZW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyBjaGFyIHRvIGNoZWNrLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGMgaXMgYSB0b2tlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNUb2tlbihmaW5hbCBjaGFyIGMpIHsKKyAgICAgICAgcmV0dXJuIChjIDw9IEJ5dGUuTUFYX1ZBTFVFICYmIElTX1RPS0VOW2NdKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNoYXJhY3RlciB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIGMgY2hhciB0byBjaGVjay4KKyAgICAgKiBAcmV0dXJuIGNoYXJhY3RlciB0eXBlIGlkZW50aWZpZXIuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbiBjYXNlIHRoZSBjaGFyYWN0ZXIgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIDEyNy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRUeXBlKGZpbmFsIGNoYXIgYykgeworICAgICAgICBpZiAoYyA+IEJ5dGUuTUFYX1ZBTFVFKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBjaGFyYWN0ZXIgLSBvcmRpbmFsIHZhbHVlIHRvbyBoaWdoOiAiICsgYyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFRZUEVfVEFCTEVbY107CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHByb3ZpZGVkIGNoYXIgaXMgYSBzZXBhcmF0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyBjaGFyIHRvIGNoZWNrLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGMgaXMgYSB0b2tlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNTZXBhcmF0b3IoZmluYWwgY2hhciBjKSB7CisgICAgICAgIHJldHVybiAoYyA8PSBCeXRlLk1BWF9WQUxVRSAmJiBUWVBFX1RBQkxFW2NdID09IFNFUEFSQVRPUik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgYWxsIGNoYXJzIGluIHN0cmluZyBzIGFyZSB0b2tlbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcyBzdHJpbmcgdG8gY2hlY2sgZm9yIHRva2Vucy4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBhbGwgY2hhcnMgaW4gcyBhcmUgdG9rZW5zLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Rva2VuU3RyaW5nKGZpbmFsIFN0cmluZyBzKSB7CisgICAgICAgIGZvciAoY2hhciBjIDogcy50b0NoYXJBcnJheSgpKSB7CisgICAgICAgICAgICBpZiAoIWlzVG9rZW4oYykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgc3RyaW5nIHMgY29udGFpbnMgYSB3aGl0ZSBzcGFjZSBjaGFyLgorICAgICAqCisgICAgICogQHBhcmFtIHMgc3RyaW5nIHRvIGNoZWNrIGZvciB3aGl0ZSBzcGFjZXMuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgcyBjb250YWlucyB3aGl0ZSBzcGFjZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGNvbnRhaW5zV2hpdGVTcGFjZShmaW5hbCBTdHJpbmcgcykgeworICAgICAgICBmb3IgKGNoYXIgYyA6IHMudG9DaGFyQXJyYXkoKSkgeworICAgICAgICAgICAgaWYgKGlzV2hpdGVTcGFjZShjKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaWx0ZXIgYSBzdWJzdHJpbmcgb2YgYSBzdHJpbmcgYnkgcmVtb3ZpbmcgYW55IG5ldy1saW5lIGNoYXJhY3RlcnMgYW5kCisgICAgICogdW4tZXNjYXBpbmcgZXNjYXBlZCBjaGFyYWN0ZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIHMgICAgIGNoYXJhY3RlciBzZXF1ZW5jZSB0byB1c2UgZm9yIHN1YnN0cmluZyB0b2tlbiBmaWx0ZXJpbmcuCisgICAgICogQHBhcmFtIHN0YXJ0IHN0YXJ0IGZpbHRlcmluZyBwb3NpdGlvbiBpbiB0aGUgc3RyaW5nLgorICAgICAqIEBwYXJhbSBlbmQgICBlbmQgZmlsdGVyaW5nIHBvc2l0aW9uIGluIHRoZSBzdHJpbmcuCisgICAgICogQHJldHVybiBmaWx0ZXJlZCBzdWJzdHJpbmcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZmlsdGVyVG9rZW4oZmluYWwgQ2hhclNlcXVlbmNlIHMsIGZpbmFsIGludCBzdGFydCwgZmluYWwgaW50IGVuZCkgeworICAgICAgICByZXR1cm4gZmlsdGVyVG9rZW4ocywgc3RhcnQsIGVuZCwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbHRlciBhIHN1YnN0cmluZyBvZiBhIHN0cmluZyBieSByZW1vdmluZyBhbnkgbmV3LWxpbmUgY2hhcmFjdGVycyBhbmQKKyAgICAgKiB1bi1lc2NhcGluZyBlc2NhcGVkIGNoYXJhY3RlcnMgKHVubGVzcyBwcmVzZXJ2ZUJhY2tzbGFzaCBpcyBzZXQgdG8ge0Bjb2RlIHRydWV9KS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzICAgICAgICAgICAgICAgICBjaGFyYWN0ZXIgc2VxdWVuY2UgdG8gdXNlIGZvciBzdWJzdHJpbmcgdG9rZW4gZmlsdGVyaW5nLgorICAgICAqIEBwYXJhbSBzdGFydCAgICAgICAgICAgICBzdGFydCBmaWx0ZXJpbmcgcG9zaXRpb24gaW4gdGhlIHN0cmluZy4KKyAgICAgKiBAcGFyYW0gZW5kICAgICAgICAgICAgICAgZW5kIGZpbHRlcmluZyBwb3NpdGlvbiBpbiB0aGUgc3RyaW5nLgorICAgICAqIEBwYXJhbSBwcmVzZXJ2ZUJhY2tzbGFzaCBpZiBzZXQgdG8ge0Bjb2RlIHRydWV9LCB0aGlzIG1ldGhvZCBkb2VzIG5vdCB0cmVhdCBiYWNrc2xhc2ggYXMgYW4gZXNjYXBlIGNoYXJhY3RlcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAodHJlYXRzIGl0IGFzIGEgcmVndWxhciBjaGFyYWN0ZXIgaW5zdGVhZCkKKyAgICAgKiBAcmV0dXJuIGZpbHRlcmVkIHN1YnN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmaWx0ZXJUb2tlbihmaW5hbCBDaGFyU2VxdWVuY2UgcywgZmluYWwgaW50IHN0YXJ0LCBmaW5hbCBpbnQgZW5kLCBmaW5hbCBib29sZWFuIHByZXNlcnZlQmFja3NsYXNoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBjaGFyIGM7CisgICAgICAgIGJvb2xlYW4gZ290RXNjYXBlID0gZmFsc2U7CisgICAgICAgIGJvb2xlYW4gZ290Q1IgPSBmYWxzZTsKKworICAgICAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgeworICAgICAgICAgICAgYyA9IHMuY2hhckF0KGkpOworICAgICAgICAgICAgaWYgKGMgPT0gJ1xuJyAmJiBnb3RDUikgeworICAgICAgICAgICAgICAgIC8vIFRoaXMgTEYgaXMgcGFydCBvZiBhbiB1bmVzY2FwZWQKKyAgICAgICAgICAgICAgICAvLyBDUkxGIHNlcXVlbmNlIChpLmUsIExXU1ApLiBTa2lwIGl0LgorICAgICAgICAgICAgICAgIGdvdENSID0gZmFsc2U7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGdvdENSID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoIWdvdEVzY2FwZSkgeworICAgICAgICAgICAgICAgIC8vIFByZXZpb3VzIGNoYXJhY3RlciB3YXMgTk9UICdcJworICAgICAgICAgICAgICAgIGlmICghcHJlc2VydmVCYWNrc2xhc2ggJiYgYyA9PSAnXFwnKSB7IC8vIHNraXAgdGhpcyBjaGFyYWN0ZXIKKyAgICAgICAgICAgICAgICAgICAgZ290RXNjYXBlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJ1xyJykgeyAvLyBza2lwIHRoaXMgY2hhcmFjdGVyCisgICAgICAgICAgICAgICAgICAgIGdvdENSID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBhcHBlbmQgdGhpcyBjaGFyYWN0ZXIKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gUHJldmlvdXMgY2hhcmFjdGVyIHdhcyAnXCcuIFNvIG5vIG5lZWQgdG8KKyAgICAgICAgICAgICAgICAvLyBib3RoZXIgd2l0aCBhbnkgc3BlY2lhbCBwcm9jZXNzaW5nLCBqdXN0CisgICAgICAgICAgICAgICAgLy8gYXBwZW5kIHRoaXMgY2hhcmFjdGVyCisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGMpOworICAgICAgICAgICAgICAgIGdvdEVzY2FwZSA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByZXZlbnRzIGluc3RhbnRpYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBHcmFtbWFyVXRpbCgpIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvSGVhZGVyVXRpbHMuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9IZWFkZXJVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MTgyZTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvSGVhZGVyVXRpbHMuamF2YQpAQCAtMCwwICsxLDI1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQWJzdHJhY3RNdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SdW50aW1lRGVsZWdhdGU7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJ1bnRpbWVEZWxlZ2F0ZS5IZWFkZXJEZWxlZ2F0ZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5JbW11dGFibGVNdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uU3RyaW5nS2V5SWdub3JlQ2FzZU11bHRpdmFsdWVkTWFwOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5WaWV3czsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIHN1cHBvcnRpbmcgdGhlIHByb2Nlc3Npbmcgb2YgbWVzc2FnZSBoZWFkZXJzLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBIZWFkZXJVdGlscyB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihIZWFkZXJVdGlscy5jbGFzcy5nZXROYW1lKCkpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIGVtcHR5IGluYm91bmQgbWVzc2FnZSBoZWFkZXJzIGNvbnRhaW5lci4gQ3JlYXRlZCBjb250YWluZXIgaXMgbXV0YWJsZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBuZXcgZW1wdHkgbXV0YWJsZSBjb250YWluZXIgZm9yIHN0b3JpbmcgaW5ib3VuZCBtZXNzYWdlIGhlYWRlcnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBBYnN0cmFjdE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBjcmVhdGVJbmJvdW5kKCkgeworICAgICAgICByZXR1cm4gbmV3IFN0cmluZ0tleUlnbm9yZUNhc2VNdWx0aXZhbHVlZE1hcDxTdHJpbmc+KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGltbXV0YWJsZSBlbXB0eSBtZXNzYWdlIGhlYWRlcnMgY29udGFpbmVyLiBUaGUgZmFjdG9yeSBtZXRob2QgY2FuIGJlCisgICAgICogdXNlZCB0byBmb3IgYm90aCBtZXNzYWdlIGhlYWRlciBjb250YWluZXIgdHlwZXMmbmJzcDsmbmJzcDsmbmRhc2g7Jm5ic3A7Jm5ic3A7aW5ib3VuZAorICAgICAqIGFzIHdlbGwgYXMgb3V0Ym91bmQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gPFY+IGhlYWRlciB2YWx1ZSB0eXBlLiBUeXBpY2FsbHkge0BsaW5rIE9iamVjdH0gaW4gY2FzZSBvZiB0aGUgb3V0Ym91bmQKKyAgICAgKiAgICAgICAgICAgIGhlYWRlcnMgYW5kIHtAbGluayBTdHJpbmd9IGluIGNhc2Ugb2YgdGhlIGluYm91bmQgaGVhZGVycy4KKyAgICAgKiBAcmV0dXJuIGFuIGltbXV0YWJsZSBlbXB0eSBtZXNzYWdlIGhlYWRlcnMgY29udGFpbmVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFY+IE11bHRpdmFsdWVkTWFwPFN0cmluZywgVj4gZW1wdHkoKSB7CisgICAgICAgIHJldHVybiBJbW11dGFibGVNdWx0aXZhbHVlZE1hcC5lbXB0eSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiBlbXB0eSBvdXRib3VuZCBtZXNzYWdlIGhlYWRlcnMgY29udGFpbmVyLiBDcmVhdGVkIGNvbnRhaW5lciBpcyBtdXRhYmxlLgorICAgICAqCisgICAgICogQHJldHVybiBhIG5ldyBlbXB0eSBtdXRhYmxlIGNvbnRhaW5lciBmb3Igc3RvcmluZyBvdXRib3VuZCBtZXNzYWdlIGhlYWRlcnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBBYnN0cmFjdE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBjcmVhdGVPdXRib3VuZCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdLZXlJZ25vcmVDYXNlTXVsdGl2YWx1ZWRNYXA8T2JqZWN0PigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgYSBtZXNzYWdlIGhlYWRlciB2YWx1ZSwgcmVwcmVzZW50ZWQgYXMgYSBnZW5lcmFsIG9iamVjdCwgdG8gaXQncworICAgICAqIHN0cmluZyByZXByZXNlbnRhdGlvbi4gSWYgdGhlIHN1cHBsaWVkIGhlYWRlciB2YWx1ZSBpcyB7QGNvZGUgbnVsbH0sCisgICAgICogdGhpcyBtZXRob2QgcmV0dXJucyB7QGNvZGUgbnVsbH0uCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgZGVmZXJzIHRvIHtAbGluayBSdW50aW1lRGVsZWdhdGUjY3JlYXRlSGVhZGVyRGVsZWdhdGV9IHRvCisgICAgICogb2J0YWluIGEge0BsaW5rIEhlYWRlckRlbGVnYXRlfSB0byBjb252ZXJ0IHRoZSB2YWx1ZSB0byBhIHtAY29kZSBTdHJpbmd9LgorICAgICAqIElmIGEge0BsaW5rIEhlYWRlckRlbGVnYXRlfSBpcyBub3QgZm91bmQgdGhlbiB0aGUge0Bjb2RlIHRvU3RyaW5nKCl9CisgICAgICogbWV0aG9kIG9uIHRoZSBoZWFkZXIgb2JqZWN0IGlzIHV0aWxpemVkLgorICAgICAqCisgICAgICogQHBhcmFtIGhlYWRlclZhbHVlIHRoZSBoZWFkZXIgdmFsdWUgcmVwcmVzZW50ZWQgYXMgYW4gb2JqZWN0LgorICAgICAqIEBwYXJhbSByZCAgICAgICAgICBydW50aW1lIGRlbGVnYXRlIGluc3RhbmNlIHRvIGJlIHVzZWQgZm9yIGhlYWRlciBkZWxlZ2F0ZQorICAgICAqICAgICAgICAgICAgICAgICAgICByZXRyaWV2YWwuIElmIHtAY29kZSBudWxsfSwgYSBkZWZhdWx0IHtAY29kZSBSdW50aW1lRGVsZWdhdGV9CisgICAgICogICAgICAgICAgICAgICAgICAgIGluc3RhbmNlIHdpbGwgYmUge0BsaW5rIFJ1bnRpbWVEZWxlZ2F0ZSNnZXRJbnN0YW5jZSgpIG9idGFpbmVkfSBhbmQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgdXNlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHN1cHBsaWVkIGhlYWRlciB2YWx1ZSBvciB7QGNvZGUgbnVsbH0KKyAgICAgKiAgICAgICAgIGlmIHRoZSBzdXBwbGllZCBoZWFkZXIgdmFsdWUgaXMge0Bjb2RlIG51bGx9LgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGFzU3RyaW5nKGZpbmFsIE9iamVjdCBoZWFkZXJWYWx1ZSwgUnVudGltZURlbGVnYXRlIHJkKSB7CisgICAgICAgIGlmIChoZWFkZXJWYWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaGVhZGVyVmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgICAgICAgIHJldHVybiAoU3RyaW5nKSBoZWFkZXJWYWx1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmQgPSBSdW50aW1lRGVsZWdhdGUuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIEhlYWRlckRlbGVnYXRlIGhwID0gcmQuY3JlYXRlSGVhZGVyRGVsZWdhdGUoaGVhZGVyVmFsdWUuZ2V0Q2xhc3MoKSk7CisgICAgICAgIHJldHVybiAoaHAgIT0gbnVsbCkgPyBocC50b1N0cmluZyhoZWFkZXJWYWx1ZSkgOiBoZWFkZXJWYWx1ZS50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgc3RyaW5nIHZpZXcgb2YgbGlzdCBvZiBoZWFkZXIgdmFsdWVzLiBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGUgdW5kZXJseWluZyBsaXN0IGFyZSB2aXNpYmxlIHRvIHRoZSB2aWV3LAorICAgICAqIHRoZSB2aWV3IGFsc28gc3VwcG9ydHMgcmVtb3ZhbCBvZiBlbGVtZW50cy4gRG9lcyBub3Qgc3VwcG9ydCBvdGhlciBtb2RpZmljYXRpb25zLgorICAgICAqCisgICAgICogQHBhcmFtIGhlYWRlclZhbHVlcyBoZWFkZXIgdmFsdWVzLgorICAgICAqIEBwYXJhbSByZCAgICAgICAgICAgUnVudGltZURlbGVnYXRlIGluc3RhbmNlIG9yIHtAY29kZSBudWxsfSAoaW4gdGhhdCBjYXNlIHtAbGluayBSdW50aW1lRGVsZWdhdGUjZ2V0SW5zdGFuY2UoKX0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgY2FsbGVkIGZvciBiZWZvcmUgZWxlbWVudCBjb252ZXJzaW9uLgorICAgICAqIEByZXR1cm4gU3RyaW5nIHZpZXcgb2YgaGVhZGVyIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBhc1N0cmluZ0xpc3QoZmluYWwgTGlzdDxPYmplY3Q+IGhlYWRlclZhbHVlcywgZmluYWwgUnVudGltZURlbGVnYXRlIHJkKSB7CisgICAgICAgIGlmIChoZWFkZXJWYWx1ZXMgPT0gbnVsbCB8fCBoZWFkZXJWYWx1ZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBSdW50aW1lRGVsZWdhdGUgZGVsZWdhdGU7CisgICAgICAgIGlmIChyZCA9PSBudWxsKSB7CisgICAgICAgICAgICBkZWxlZ2F0ZSA9IFJ1bnRpbWVEZWxlZ2F0ZS5nZXRJbnN0YW5jZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVsZWdhdGUgPSByZDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBWaWV3cy5saXN0VmlldyhoZWFkZXJWYWx1ZXMsIGlucHV0IC0+IChpbnB1dCA9PSBudWxsKQorICAgICAgICAgICAgICAgID8gIltudWxsXSIKKyAgICAgICAgICAgICAgICA6IEhlYWRlclV0aWxzLmFzU3RyaW5nKGlucHV0LCBkZWxlZ2F0ZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgc3RyaW5nIHZpZXcgb2YgcGFzc2VkIGhlYWRlcnMuIEFueSBtb2RpZmljYXRpb25zIHRvIHRoZSBoZWFkZXJzIGFyZSB2aXNpYmxlIHRvIHRoZSB2aWV3LCB0aGUgdmlldyBhbHNvCisgICAgICogc3VwcG9ydHMgcmVtb3ZhbCBvZiBlbGVtZW50cy4gRG9lcyBub3Qgc3VwcG9ydCBvdGhlciBtb2RpZmljYXRpb25zLgorICAgICAqCisgICAgICogQHBhcmFtIGhlYWRlcnMgaGVhZGVycy4KKyAgICAgKiBAcmV0dXJuIFN0cmluZyB2aWV3IG9mIGhlYWRlcnMgb3Ige0Bjb2RlIG51bGx9IGlmIHtjb2RlIGhlYWRlcnN9IGlucHV0IHBhcmFtZXRlciBpcyB7QGNvZGUgbnVsbH0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gYXNTdHJpbmdIZWFkZXJzKGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBoZWFkZXJzKSB7CisgICAgICAgIGlmIChoZWFkZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgUnVudGltZURlbGVnYXRlIHJkID0gUnVudGltZURlbGVnYXRlLmdldEluc3RhbmNlKCk7CisgICAgICAgIHJldHVybiBuZXcgQWJzdHJhY3RNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4oCisgICAgICAgICAgICAgICAgVmlld3MubWFwVmlldyhoZWFkZXJzLCBpbnB1dCAtPiBIZWFkZXJVdGlscy5hc1N0cmluZ0xpc3QoaW5wdXQsIHJkKSkKKyAgICAgICAgKSB7CisgICAgICAgIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJhbnNmb3JtcyBtdWx0aSB2YWx1ZSBtYXAgb2YgaGVhZGVycyB0byBzaW5nbGUge0Bjb2RlIFN0cmluZ30gdmFsdWUgbWFwLgorICAgICAqCisgICAgICogUmV0dXJuZWQgbWFwIGlzIGltbXV0YWJsZS4gTWFwIHZhbHVlcyBhcmUgZm9ybWF0dGVkIHVzaW5nIG1ldGhvZCB7QGxpbmsgI2FzSGVhZGVyU3RyaW5nfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBoZWFkZXJzIGhlYWRlcnMgdG8gYmUgZm9ybWF0dGVkCisgICAgICogQHJldHVybiBpbW11dGFibGUgc2luZ2xlIHtAY29kZSBTdHJpbmd9IHZhbHVlIG1hcCBvcgorICAgICAqICAgICAge0Bjb2RlIG51bGx9IGlmIHtAY29kZSBoZWFkZXJzfSBpbnB1dCBwYXJhbWV0ZXIgaXMge0Bjb2RlIG51bGx9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBhc1N0cmluZ0hlYWRlcnNTaW5nbGVWYWx1ZShmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaGVhZGVycykgeworICAgICAgICBpZiAoaGVhZGVycyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFJ1bnRpbWVEZWxlZ2F0ZSByZCA9IFJ1bnRpbWVEZWxlZ2F0ZS5nZXRJbnN0YW5jZSgpOworCisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAoaGVhZGVycy5lbnRyeVNldCgpLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b01hcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcC5FbnRyeTo6Z2V0S2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkgLT4gYXNIZWFkZXJTdHJpbmcoZW50cnkuZ2V0VmFsdWUoKSwgcmQpKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIGEgbGlzdCBvZiBtZXNzYWdlIGhlYWRlciB2YWx1ZXMgdG8gYSBzaW5nbGUgc3RyaW5nIHZhbHVlICh3aXRoIGluZGl2aWR1YWwgdmFsdWVzIHNlcGFyYXRlZCBieQorICAgICAqIHtAY29kZSAnLCd9KS4KKyAgICAgKgorICAgICAqIEVhY2ggc2luZ2xlIGhlYWRlciB2YWx1ZSBpcyBjb252ZXJ0ZWQgdG8gU3RyaW5nIHVzaW5nIGEKKyAgICAgKiB7QGxpbmsgamF2YXgud3MucnMuZXh0LlJ1bnRpbWVEZWxlZ2F0ZS5IZWFkZXJEZWxlZ2F0ZX0gaWYgb25lIGlzIGF2YWlsYWJsZQorICAgICAqIHZpYSB7QGxpbmsgamF2YXgud3MucnMuZXh0LlJ1bnRpbWVEZWxlZ2F0ZSNjcmVhdGVIZWFkZXJEZWxlZ2F0ZShqYXZhLmxhbmcuQ2xhc3MpfQorICAgICAqIGZvciB0aGUgaGVhZGVyIHZhbHVlIGNsYXNzIG9yIHVzaW5nIGl0cyB7QGNvZGUgdG9TdHJpbmcoKX0gbWV0aG9kIGlmIGEgaGVhZGVyCisgICAgICogZGVsZWdhdGUgaXMgbm90IGF2YWlsYWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZXMgbGlzdCBvZiBpbmRpdmlkdWFsIGhlYWRlciB2YWx1ZXMuCisgICAgICogQHBhcmFtIHJkICAgICB7QGxpbmsgUnVudGltZURlbGVnYXRlfSBpbnN0YW5jZSBvciB7QGNvZGUgbnVsbH0gKGluIHRoYXQgY2FzZSB7QGxpbmsgUnVudGltZURlbGVnYXRlI2dldEluc3RhbmNlKCl9CisgICAgICogICAgICAgICAgICAgICB3aWxsIGJlIGNhbGxlZCBmb3IgYmVmb3JlIGNvbnZlcnNpb24gb2YgZWxlbWVudHMpLgorICAgICAqIEByZXR1cm4gc2luZ2xlIHN0cmluZyBjb25zaXN0aW5nIG9mIGFsbCB0aGUgdmFsdWVzIHBhc3NlZCBpbiBhcyBhIHBhcmFtZXRlci4gSWYgdmFsdWVzIHBhcmFtZXRlciBpcyB7QGNvZGUgbnVsbH0sCisgICAgICogICAgICAgICB7QGNvZGUgbnVsbH0gaXMgcmV0dXJuZWQuIElmIHRoZSBsaXN0IG9mIHZhbHVlcyBpcyBlbXB0eSwgYW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGFzSGVhZGVyU3RyaW5nKGZpbmFsIExpc3Q8T2JqZWN0PiB2YWx1ZXMsIGZpbmFsIFJ1bnRpbWVEZWxlZ2F0ZSByZCkgeworICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGZpbmFsIEl0ZXJhdG9yPFN0cmluZz4gc3RyaW5nVmFsdWVzID0gYXNTdHJpbmdMaXN0KHZhbHVlcywgcmQpLml0ZXJhdG9yKCk7CisgICAgICAgIGlmICghc3RyaW5nVmFsdWVzLmhhc05leHQoKSkgeworICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVpbGRlcihzdHJpbmdWYWx1ZXMubmV4dCgpKTsKKyAgICAgICAgd2hpbGUgKHN0cmluZ1ZhbHVlcy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoJywnKS5hcHBlbmQoc3RyaW5nVmFsdWVzLm5leHQoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGFyZXMgdHdvIHNuYXBzaG90cyBvZiBoZWFkZXJzIGZyb20gamVyc2V5IHtAY29kZSBDbGllbnRSZXF1ZXN0fSBhbmQgbG9ncyB7QGNvZGUgV0FSTklOR30gaW4gY2FzZSBvZiBkaWZmZXJlbmNlLgorICAgICAqCisgICAgICogQ3VycmVudCBjb250YWluZXIgaW1wbGVtZW50YXRpb25zIGRvZXMgbm90IHN1cHBvcnQgaGVhZGVyIG1vZGlmaWNhdGlvbiBpbiB7QGxpbmsgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yfQorICAgICAqIGFuZCB7QGxpbmsgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyfS4gVGhlIG1ldGhvZCBjaGVja3MgdGhlcmUgYXJlIHNvbWUgbmV3bHkgYWRkZWQgaGVhZGVycworICAgICAqIChwcm9iYWJseSBieSBXSSBvciBNQlcpIGFuZCBsb2dzIHtAY29kZSBXQVJOSU5HfSBtZXNzYWdlIGFib3V0IGl0LgorICAgICAqCisgICAgICogQHBhcmFtIGhlYWRlcnNTbmFwc2hvdCBmaXJzdCBpbW11dGFibGUgc25hcHNob3Qgb2YgaGVhZGVycworICAgICAqIEBwYXJhbSBjdXJyZW50SGVhZGVycyAgY3VycmVudCBpbnN0YW5jZSBvZiBoZWFkZXJzIHRvYmUgY29tcGFyZWQgdG8KKyAgICAgKiBAcGFyYW0gY29ubmVjdG9yTmFtZSAgIG5hbWUgb2YgY29ubmVjdG9yIHRoZSBtZXRob2QgaXMgaW52b2tlZCBmcm9tLCB1c2VkIGp1c3QgaW4gbG9nZ2VkIG1lc3NhZ2UKKyAgICAgKiBAc2VlIDxhIGhyZWY9Imh0dHBzOi8vamF2YS5uZXQvamlyYS9icm93c2UvSkVSU0VZLTIzNDEiPkpFUlNFWS0yMzQxPC9hPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja0hlYWRlckNoYW5nZXMoZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzU25hcHNob3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gY3VycmVudEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY29ubmVjdG9yTmFtZSkgeworICAgICAgICBpZiAoSGVhZGVyVXRpbHMuTE9HR0VSLmlzTG9nZ2FibGUoTGV2ZWwuV0FSTklORykpIHsKKyAgICAgICAgICAgIGZpbmFsIFJ1bnRpbWVEZWxlZ2F0ZSByZCA9IFJ1bnRpbWVEZWxlZ2F0ZS5nZXRJbnN0YW5jZSgpOworICAgICAgICAgICAgZmluYWwgU2V0PFN0cmluZz4gY2hhbmdlZEhlYWRlck5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgICAgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8PyBleHRlbmRzIFN0cmluZywgPyBleHRlbmRzIExpc3Q8T2JqZWN0Pj4gZW50cnkgOiBjdXJyZW50SGVhZGVycy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFoZWFkZXJzU25hcHNob3QuY29udGFpbnNLZXkoZW50cnkuZ2V0S2V5KCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYW5nZWRIZWFkZXJOYW1lcy5hZGQoZW50cnkuZ2V0S2V5KCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcmV2VmFsdWUgPSBoZWFkZXJzU25hcHNob3QuZ2V0KGVudHJ5LmdldEtleSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5ld1ZhbHVlID0gYXNIZWFkZXJTdHJpbmcoY3VycmVudEhlYWRlcnMuZ2V0KGVudHJ5LmdldEtleSgpKSwgcmQpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXByZXZWYWx1ZS5lcXVhbHMobmV3VmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkSGVhZGVyTmFtZXMuYWRkKGVudHJ5LmdldEtleSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghY2hhbmdlZEhlYWRlck5hbWVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGlmIChIZWFkZXJVdGlscy5MT0dHRVIuaXNMb2dnYWJsZShMZXZlbC5XQVJOSU5HKSkgeworICAgICAgICAgICAgICAgICAgICBIZWFkZXJVdGlscy5MT0dHRVIud2FybmluZyhMb2NhbGl6YXRpb25NZXNzYWdlcy5TT01FX0hFQURFUlNfTk9UX1NFTlQoY29ubmVjdG9yTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkSGVhZGVyTmFtZXMudG9TdHJpbmcoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFByZXZlbnRpbmcgaW5zdGFudGlhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIEhlYWRlclV0aWxzKCkgeworICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIk5vIGluc3RhbmNlcyBhbGxvd2VkLiIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9IZWFkZXJWYWx1ZUV4Y2VwdGlvbi5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL0hlYWRlclZhbHVlRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZlNGEyMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9IZWFkZXJWYWx1ZUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CisKKy8qKgorICoge0BsaW5rIFByb2Nlc3NpbmdFeGNlcHRpb24gUHJvY2Vzc2luZyBleGNlcHRpb259IGluZGljYXRpbmcgdGhhdCBhbiBhdHRlbXB0IHRvCisgKiByZWFkIGEgdmFsdWUgb2YgYSBoZWFkZXIgZmFpbGVkLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBIZWFkZXJWYWx1ZUV4Y2VwdGlvbiBleHRlbmRzIFByb2Nlc3NpbmdFeGNlcHRpb24geworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDk4MTgxMDc3MzYwMTIzMTE1N0w7CisgICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IGNvbnRleHQ7CisKKyAgICAvKioKKyAgICAgKiBDb250ZXh0IHRoYXQgY29udGFpbnMgaGVhZGVyIHByb2JsZW1zIGNhdXNpbmcgdGhpcyBleGNlcHRpb24gKGUuZy4gZm9yIHtAbGluayBJbmJvdW5kTWVzc2FnZUNvbnRleHR9CisgICAgICogdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgaXMge0BsaW5rIENvbnRleHQjSU5CT1VORH0pLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZW51bSBDb250ZXh0IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEluYm91bmQgY29udGV4dC4KKyAgICAgICAgICovCisgICAgICAgIElOQk9VTkQsCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE91dGJvdW5kIGNvbnRleHQuCisgICAgICAgICAqLworICAgICAgICBPVVRCT1VORAorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBoZWFkZXIgdmFsdWUgZXhjZXB0aW9uIGZyb20gbWVzc2FnZSwgY2F1c2UgYW5kIGNvbnRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBFeGNlcHRpb24gbWVzc2FnZS4KKyAgICAgKiBAcGFyYW0gY2F1c2UgRXhjZXB0aW9uIGNhdXNlLgorICAgICAqIEBwYXJhbSBjb250ZXh0IENvbnRleHQgaW4gd2hpY2ggdGhpcyBleGNlcHRpb24gd2FzIHRocm93bi4KKyAgICAgKi8KKyAgICBwdWJsaWMgSGVhZGVyVmFsdWVFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSwgQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKKyAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgaGVhZGVyIHZhbHVlIGV4Y2VwdGlvbiBmcm9tIG1lc3NhZ2UgYW5kIGNvbnRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBFeGNlcHRpb24gbWVzc2FnZS4KKyAgICAgKiBAcGFyYW0gY29udGV4dCBDb250ZXh0IGluIHdoaWNoIHRoaXMgZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgICAgICovCisgICAgcHVibGljIEhlYWRlclZhbHVlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIobWVzc2FnZSk7CisgICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBleGNlcHRpb24gY29udGV4dC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQ29udGV4dCBpbiB3aGljaCB0aGUgZXhjZXB0aW9uIHdhcyB0aHJvd24uCisgICAgICovCisgICAgcHVibGljIENvbnRleHQgZ2V0Q29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL0h0dHBEYXRlRm9ybWF0LmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvSHR0cERhdGVGb3JtYXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTkxMTZjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL0h0dHBEYXRlRm9ybWF0LmphdmEKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKKworLyoqCisgKiBIZWxwZXIgY2xhc3MgZm9yIEhUVFAgc3BlY2lmaWVkIGRhdGUgZm9ybWF0cy4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgSHR0cERhdGVGb3JtYXQgeworCisgICAgcHJpdmF0ZSBIdHRwRGF0ZUZvcm1hdCgpIHsKKyAgICB9CisgICAgLyoqCisgICAgICogVGhlIGRhdGUgZm9ybWF0IHBhdHRlcm4gZm9yIFJGQyAxMTIzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRkMxMTIzX0RBVEVfRk9STUFUX1BBVFRFUk4gPSAiRUVFLCBkZCBNTU0geXl5eSBISDptbTpzcyB6enoiOworICAgIC8qKgorICAgICAqIFRoZSBkYXRlIGZvcm1hdCBwYXR0ZXJuIGZvciBSRkMgMTAzNi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkZDMTAzNl9EQVRFX0ZPUk1BVF9QQVRURVJOID0gIkVFRUUsIGRkLU1NTS15eSBISDptbTpzcyB6enoiOworICAgIC8qKgorICAgICAqIFRoZSBkYXRlIGZvcm1hdCBwYXR0ZXJuIGZvciBBTlNJIEMgYXNjdGltZSgpLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBTlNJX0NfQVNDVElNRV9EQVRFX0ZPUk1BVF9QQVRURVJOID0gIkVFRSBNTU0gZCBISDptbTpzcyB5eXl5IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFRpbWVab25lIEdNVF9USU1FX1pPTkUgPSBUaW1lWm9uZS5nZXRUaW1lWm9uZSgiR01UIik7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUaHJlYWRMb2NhbDxMaXN0PFNpbXBsZURhdGVGb3JtYXQ+PiBkYXRlRm9ybWF0cyA9IG5ldyBUaHJlYWRMb2NhbDxMaXN0PFNpbXBsZURhdGVGb3JtYXQ+PigpIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBMaXN0PFNpbXBsZURhdGVGb3JtYXQ+IGluaXRpYWxWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBjcmVhdGVEYXRlRm9ybWF0cygpOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIExpc3Q8U2ltcGxlRGF0ZUZvcm1hdD4gY3JlYXRlRGF0ZUZvcm1hdHMoKSB7CisgICAgICAgIGZpbmFsIFNpbXBsZURhdGVGb3JtYXRbXSBmb3JtYXRzID0gbmV3IFNpbXBsZURhdGVGb3JtYXRbXXsKKyAgICAgICAgICAgIG5ldyBTaW1wbGVEYXRlRm9ybWF0KFJGQzExMjNfREFURV9GT1JNQVRfUEFUVEVSTiwgTG9jYWxlLlVTKSwKKyAgICAgICAgICAgIG5ldyBTaW1wbGVEYXRlRm9ybWF0KFJGQzEwMzZfREFURV9GT1JNQVRfUEFUVEVSTiwgTG9jYWxlLlVTKSwKKyAgICAgICAgICAgIG5ldyBTaW1wbGVEYXRlRm9ybWF0KEFOU0lfQ19BU0NUSU1FX0RBVEVfRk9STUFUX1BBVFRFUk4sIExvY2FsZS5VUykKKyAgICAgICAgfTsKKyAgICAgICAgZm9ybWF0c1swXS5zZXRUaW1lWm9uZShHTVRfVElNRV9aT05FKTsKKyAgICAgICAgZm9ybWF0c1sxXS5zZXRUaW1lWm9uZShHTVRfVElNRV9aT05FKTsKKyAgICAgICAgZm9ybWF0c1syXS5zZXRUaW1lWm9uZShHTVRfVElNRV9aT05FKTsKKworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KGZvcm1hdHMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gdW5tb2RpZmlhYmxlIGxpc3Qgb2YgSFRUUCBzcGVjaWZpZWQgZGF0ZSBmb3JtYXRzIHRvIHVzZSBmb3IKKyAgICAgKiBwYXJzaW5nIG9yIGZvcm1hdHRpbmcge0BsaW5rIERhdGV9LgorICAgICAqIDxwPgorICAgICAqIFRoZSBsaXN0IG9mIGRhdGUgZm9ybWF0cyBhcmUgc2NvcGVkIHRvIHRoZSBjdXJyZW50IHRocmVhZCBhbmQgbWF5IGJlCisgICAgICogdXNlZCB3aXRob3V0IHJlcXVpcmluZyB0byBzeW5jaHJvbml6ZSBhY2Nlc3MgdG8gdGhlIGluc3RhbmNlcyB3aGVuCisgICAgICogcGFyc2luZyBvciBmb3JtYXR0aW5nLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbGlzdCBvZiBkYXRhIGZvcm1hdHMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxTaW1wbGVEYXRlRm9ybWF0PiBnZXREYXRlRm9ybWF0cygpIHsKKyAgICAgICAgcmV0dXJuIGRhdGVGb3JtYXRzLmdldCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcHJlZmVycmVkIEhUVFAgc3BlY2lmaWVkIGRhdGUgZm9ybWF0IChSRkMgMTEyMykuCisgICAgICogPHA+CisgICAgICogVGhlIGRhdGUgZm9ybWF0IGlzIHNjb3BlZCB0byB0aGUgY3VycmVudCB0aHJlYWQgYW5kIG1heSBiZQorICAgICAqIHVzZWQgd2l0aG91dCByZXF1aXJpbmcgdG8gc3luY2hyb25pemUgYWNjZXNzIHRvIHRoZSBpbnN0YW5jZSB3aGVuCisgICAgICogcGFyc2luZyBvciBmb3JtYXR0aW5nLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgcHJlZmVycmVkIG9mIGRhdGEgZm9ybWF0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU2ltcGxlRGF0ZUZvcm1hdCBnZXRQcmVmZXJyZWREYXRlRm9ybWF0KCkgeworICAgICAgICAvLyByZXR1cm5zIGNsb25lIGJlY2F1c2UgY2FsbGluZyBTREYucGFyc2UoLi4uKSBjYW4gY2hhbmdlIHRpbWUgem9uZQorICAgICAgICByZXR1cm4gKFNpbXBsZURhdGVGb3JtYXQpIGRhdGVGb3JtYXRzLmdldCgpLmdldCgwKS5jbG9uZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgYSBkYXRlLgorICAgICAqCisgICAgICogQHBhcmFtIGRhdGUgdGhlIGRhdGUgYXMgYSBzdHJpbmcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBkYXRlCisgICAgICogQHRocm93cyBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb24gaW4gY2FzZSB0aGUgZGF0ZSBzdHJpbmcgY2Fubm90IGJlIHBhcnNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIERhdGUgcmVhZERhdGUoZmluYWwgU3RyaW5nIGRhdGUpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIFBhcnNlRXhjZXB0aW9uIHBlID0gbnVsbDsKKyAgICAgICAgZm9yIChmaW5hbCBTaW1wbGVEYXRlRm9ybWF0IGYgOiBIdHRwRGF0ZUZvcm1hdC5nZXREYXRlRm9ybWF0cygpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIERhdGUgcmVzdWx0ID0gZi5wYXJzZShkYXRlKTsKKyAgICAgICAgICAgICAgICAvLyBwYXJzZSBjYW4gY2hhbmdlIHRpbWUgem9uZSAtPiBzZXQgaXQgYmFjayB0byBHTVQKKyAgICAgICAgICAgICAgICBmLnNldFRpbWVab25lKEdNVF9USU1FX1pPTkUpOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBQYXJzZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgcGUgPSAocGUgPT0gbnVsbCkgPyBlIDogcGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0aHJvdyBwZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvSHR0cEhlYWRlckxpc3RBZGFwdGVyLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvSHR0cEhlYWRlckxpc3RBZGFwdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFjNjMwNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9IdHRwSGVhZGVyTGlzdEFkYXB0ZXIuamF2YQpAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsOworCitpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOworCisvKioKKyAqIFdyYXBwaW5nIGFkYXB0ZXIgZm9yIHtAbGluayBIdHRwSGVhZGVyUmVhZGVyfSB0aGF0IGFkZHMgYWJpbGl0eSB0byByZWFkCisgKiBoZWFkZXJzIGNvbnRhaW5pbmcgY29tbWEtc2VwYXJhdGVkIHZhbHVlIGxpc3RzLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KKy8qIHBhY2thZ2UgKi8gY2xhc3MgSHR0cEhlYWRlckxpc3RBZGFwdGVyIGV4dGVuZHMgSHR0cEhlYWRlclJlYWRlciB7CisKKyAgICBwcml2YXRlIGZpbmFsIEh0dHBIZWFkZXJSZWFkZXIgcmVhZGVyOworICAgIHByaXZhdGUgYm9vbGVhbiBpc1Rlcm1pbmF0ZWQ7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IGFkYXB0ZXIgZm9yIHtAbGluayBIdHRwSGVhZGVyUmVhZGVyfSB0aGF0IGFkZHMgYWJpbGl0eSB0byByZWFkCisgICAgICogaGVhZGVycyBjb250YWluaW5nIGNvbW1hLXNlcGFyYXRlZCB2YWx1ZSBsaXN0cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWFkZXIgaHR0cCBoZWFkZXIgcmVhZGVyIHRvIGJlIHdyYXBwZWQuCisgICAgICovCisgICAgcHVibGljIEh0dHBIZWFkZXJMaXN0QWRhcHRlcihIdHRwSGVhZGVyUmVhZGVyIHJlYWRlcikgeworICAgICAgICB0aGlzLnJlYWRlciA9IHJlYWRlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgaXNUZXJtaW5hdGVkID0gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgaWYgKGlzVGVybWluYXRlZCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlYWRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIGlmIChyZWFkZXIuaGFzTmV4dFNlcGFyYXRvcignLCcsIHRydWUpKSB7CisgICAgICAgICAgICAgICAgaXNUZXJtaW5hdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGhhc05leHRTZXBhcmF0b3IoY2hhciBzZXBhcmF0b3IsIGJvb2xlYW4gc2tpcFdoaXRlU3BhY2UpIHsKKyAgICAgICAgaWYgKGlzVGVybWluYXRlZCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlYWRlci5oYXNOZXh0U2VwYXJhdG9yKCcsJywgc2tpcFdoaXRlU3BhY2UpKSB7CisgICAgICAgICAgICBpc1Rlcm1pbmF0ZWQgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5oYXNOZXh0U2VwYXJhdG9yKHNlcGFyYXRvciwgc2tpcFdoaXRlU3BhY2UpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEV2ZW50IG5leHQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV4dCh0cnVlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSHR0cEhlYWRlclJlYWRlci5FdmVudCBuZXh0KGJvb2xlYW4gc2tpcFdoaXRlU3BhY2UpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXh0KHNraXBXaGl0ZVNwYWNlLCBmYWxzZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEh0dHBIZWFkZXJSZWFkZXIuRXZlbnQgbmV4dChib29sZWFuIHNraXBXaGl0ZVNwYWNlLCBib29sZWFuIHByZXNlcnZlQmFja3NsYXNoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICBpZiAoaXNUZXJtaW5hdGVkKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIkVuZCBvZiBoZWFkZXIiLCBnZXRJbmRleCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZWFkZXIuaGFzTmV4dFNlcGFyYXRvcignLCcsIHNraXBXaGl0ZVNwYWNlKSkgeworICAgICAgICAgICAgaXNUZXJtaW5hdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigiRW5kIG9mIGhlYWRlciIsIGdldEluZGV4KCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlYWRlci5uZXh0KHNraXBXaGl0ZVNwYWNlLCBwcmVzZXJ2ZUJhY2tzbGFzaCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBuZXh0U2VwYXJhdGVkU3RyaW5nKGNoYXIgc3RhcnRTZXBhcmF0b3IsIGNoYXIgZW5kU2VwYXJhdG9yKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICBpZiAoaXNUZXJtaW5hdGVkKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIkVuZCBvZiBoZWFkZXIiLCBnZXRJbmRleCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZWFkZXIuaGFzTmV4dFNlcGFyYXRvcignLCcsIHRydWUpKSB7CisgICAgICAgICAgICBpc1Rlcm1pbmF0ZWQgPSB0cnVlOworICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCJFbmQgb2YgaGVhZGVyIiwgZ2V0SW5kZXgoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVhZGVyLm5leHRTZXBhcmF0ZWRTdHJpbmcoc3RhcnRTZXBhcmF0b3IsIGVuZFNlcGFyYXRvcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEh0dHBIZWFkZXJSZWFkZXIuRXZlbnQgZ2V0RXZlbnQoKSB7CisgICAgICAgIHJldHVybiByZWFkZXIuZ2V0RXZlbnQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldEV2ZW50VmFsdWUoKSB7CisgICAgICAgIHJldHVybiByZWFkZXIuZ2V0RXZlbnRWYWx1ZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0UmVtYWluZGVyKCkgeworICAgICAgICByZXR1cm4gcmVhZGVyLmdldFJlbWFpbmRlcigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7CisgICAgICAgIHJldHVybiByZWFkZXIuZ2V0SW5kZXgoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvSHR0cEhlYWRlclJlYWRlci5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL0h0dHBIZWFkZXJSZWFkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWFjMTZmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL0h0dHBIZWFkZXJSZWFkZXIuamF2YQpAQCAtMCwwICsxLDU3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsOworCitpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29va2llOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTmV3Q29va2llOworCisvKioKKyAqIEFuIGFic3RyYWN0IHB1bGwtYmFzZWQgcmVhZGVyIG9mIEhUVFAgaGVhZGVycy4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSHR0cEhlYWRlclJlYWRlciB7CisKKyAgICAvKioKKyAgICAgKiBUT0RPIGphdmFkb2MuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBlbnVtIEV2ZW50IHsKKworICAgICAgICBUb2tlbiwgUXVvdGVkU3RyaW5nLCBDb21tZW50LCBTZXBhcmF0b3IsIENvbnRyb2wKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUT0RPIGphdmFkb2MuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gaGFzTmV4dCgpOworCisgICAgLyoqCisgICAgICogVE9ETyBqYXZhZG9jLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGhhc05leHRTZXBhcmF0b3IoY2hhciBzZXBhcmF0b3IsIGJvb2xlYW4gc2tpcFdoaXRlU3BhY2UpOworCisgICAgLyoqCisgICAgICogVE9ETyBqYXZhZG9jLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBFdmVudCBuZXh0KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogVE9ETyBqYXZhZG9jLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBFdmVudCBuZXh0KGJvb2xlYW4gc2tpcFdoaXRlU3BhY2UpIHRocm93cyBQYXJzZUV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFRPRE8gamF2YWRvYy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgRXZlbnQgbmV4dChib29sZWFuIHNraXBXaGl0ZVNwYWNlLCBib29sZWFuIHByZXNlcnZlQmFja3NsYXNoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBGSVhNRSByZW1vdmUuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IENoYXJTZXF1ZW5jZSBuZXh0U2VwYXJhdGVkU3RyaW5nKGNoYXIgc3RhcnRTZXBhcmF0b3IsIGNoYXIgZW5kU2VwYXJhdG9yKSB0aHJvd3MgUGFyc2VFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBGSVhNRSByZW1vdmUuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IEV2ZW50IGdldEV2ZW50KCk7CisKKyAgICAvKioKKyAgICAgKiBUT0RPIGphdmFkb2MuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IENoYXJTZXF1ZW5jZSBnZXRFdmVudFZhbHVlKCk7CisKKyAgICAvKioKKyAgICAgKiBUT0RPIGphdmFkb2MuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IENoYXJTZXF1ZW5jZSBnZXRSZW1haW5kZXIoKTsKKworICAgIC8qKgorICAgICAqIFRPRE8gamF2YWRvYy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgaW50IGdldEluZGV4KCk7CisKKyAgICAvKioKKyAgICAgKiBUT0RPIGphdmFkb2MuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIENoYXJTZXF1ZW5jZSBuZXh0VG9rZW4oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICBFdmVudCBlID0gbmV4dChmYWxzZSk7CisgICAgICAgIGlmIChlICE9IEV2ZW50LlRva2VuKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIk5leHQgZXZlbnQgaXMgbm90IGEgVG9rZW4iLCBnZXRJbmRleCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBnZXRFdmVudFZhbHVlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVE9ETyBqYXZhZG9jLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIG5leHRTZXBhcmF0b3IoY2hhciBjKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICBFdmVudCBlID0gbmV4dChmYWxzZSk7CisgICAgICAgIGlmIChlICE9IEV2ZW50LlNlcGFyYXRvcikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCJOZXh0IGV2ZW50IGlzIG5vdCBhIFNlcGFyYXRvciIsIGdldEluZGV4KCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGMgIT0gZ2V0RXZlbnRWYWx1ZSgpLmNoYXJBdCgwKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCJFeHBlY3RlZCBzZXBhcmF0b3IgJyIgKyBjICsgIicgaW5zdGVhZCBvZiAnIgorICAgICAgICAgICAgICAgICAgICArIGdldEV2ZW50VmFsdWUoKS5jaGFyQXQoMCkgKyAiJyIsIGdldEluZGV4KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVE9ETyBqYXZhZG9jLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBDaGFyU2VxdWVuY2UgbmV4dFF1b3RlZFN0cmluZygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIEV2ZW50IGUgPSBuZXh0KGZhbHNlKTsKKyAgICAgICAgaWYgKGUgIT0gRXZlbnQuUXVvdGVkU3RyaW5nKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIk5leHQgZXZlbnQgaXMgbm90IGEgUXVvdGVkIFN0cmluZyIsIGdldEluZGV4KCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGdldEV2ZW50VmFsdWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUT0RPIGphdmFkb2MuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIENoYXJTZXF1ZW5jZSBuZXh0VG9rZW5PclF1b3RlZFN0cmluZygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXh0VG9rZW5PclF1b3RlZFN0cmluZyhmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBDaGFyU2VxdWVuY2UgbmV4dFRva2VuT3JRdW90ZWRTdHJpbmcoYm9vbGVhbiBwcmVzZXJ2ZUJhY2tzbGFzaCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgRXZlbnQgZSA9IG5leHQoZmFsc2UsIHByZXNlcnZlQmFja3NsYXNoKTsKKyAgICAgICAgaWYgKGUgIT0gRXZlbnQuVG9rZW4gJiYgZSAhPSBFdmVudC5RdW90ZWRTdHJpbmcpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigiTmV4dCBldmVudCBpcyBub3QgYSBUb2tlbiBvciBhIFF1b3RlZCBTdHJpbmcsICIKKyAgICAgICAgICAgICAgICAgICAgKyBnZXRFdmVudFZhbHVlKCksIGdldEluZGV4KCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGdldEV2ZW50VmFsdWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUT0RPIGphdmFkb2MuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBIdHRwSGVhZGVyUmVhZGVyIG5ld0luc3RhbmNlKFN0cmluZyBoZWFkZXIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBIdHRwSGVhZGVyUmVhZGVySW1wbChoZWFkZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRPRE8gamF2YWRvYy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEh0dHBIZWFkZXJSZWFkZXIgbmV3SW5zdGFuY2UoU3RyaW5nIGhlYWRlciwgYm9vbGVhbiBwcm9jZXNzQ29tbWVudHMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBIdHRwSGVhZGVyUmVhZGVySW1wbChoZWFkZXIsIHByb2Nlc3NDb21tZW50cyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVE9ETyBqYXZhZG9jLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRGF0ZSByZWFkRGF0ZShTdHJpbmcgZGF0ZSkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIEh0dHBEYXRlRm9ybWF0LnJlYWREYXRlKGRhdGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRPRE8gamF2YWRvYy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCByZWFkUXVhbGl0eUZhY3RvcihDaGFyU2VxdWVuY2UgcSkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHEgPT0gbnVsbCB8fCBxLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigiUXVhbGl0eSB2YWx1ZSBjYW5ub3QgYmUgbnVsbCBvciBhbiBlbXB0eSBTdHJpbmciLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBxLmxlbmd0aCgpOworICAgICAgICBpZiAobGVuZ3RoID4gNSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCJRdWFsaXR5IHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbWF4aW11bSBsZW5ndGgsIDUiLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBhcnNlIHRoZSB3aG9sZSBudW1iZXIgYW5kIGRlY2ltYWwgcG9pbnQKKyAgICAgICAgZmluYWwgY2hhciB3aG9sZU51bWJlcjsKKyAgICAgICAgY2hhciBjID0gd2hvbGVOdW1iZXIgPSBxLmNoYXJBdChpbmRleCsrKTsKKyAgICAgICAgaWYgKGMgPT0gJzAnIHx8IGMgPT0gJzEnKSB7CisgICAgICAgICAgICBpZiAoaW5kZXggPT0gbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChjIC0gJzAnKSAqIDEwMDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjID0gcS5jaGFyQXQoaW5kZXgrKyk7CisgICAgICAgICAgICBpZiAoYyAhPSAnLicpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgcGFyc2luZyBRdWFsaXR5IHZhbHVlOiBhIGRlY2ltYWwgcGxhY2UgaXMgZXhwZWN0ZWQgcmF0aGVyIHRoYW4gJyIgKyBjICsgIiciLCBpbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW5kZXggPT0gbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChjIC0gJzAnKSAqIDEwMDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnLicpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgbm90IGNvbmZvcm1pbmcgdG8gdGhlIEhUVFAgc3BlY2lmaWNhdGlvbiBidXQgc29tZSBpbXBsZW1lbnRhdGlvbnMKKyAgICAgICAgICAgIC8vIGRvIHRoaXMsIGZvciBleGFtcGxlIEh0dHBVUkxDb25uZWN0aW9uLgorICAgICAgICAgICAgaWYgKGluZGV4ID09IGxlbmd0aCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciBwYXJzaW5nIFF1YWxpdHkgdmFsdWU6IGEgZGVjaW1hbCBudW1lcmFsIGlzIGV4cGVjdGVkIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50IiwgaW5kZXgpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJFcnJvciBwYXJzaW5nIFF1YWxpdHkgdmFsdWU6IGEgZGVjaW1hbCBudW1lcmFsICcwJyBvciAnMScgaXMgZXhwZWN0ZWQgcmF0aGVyIHRoYW4gJyIgKyBjICsgIiciLCBpbmRleCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBQYXJzZSB0aGUgZnJhY3Rpb24KKyAgICAgICAgaW50IHZhbHVlID0gMDsKKyAgICAgICAgaW50IGV4cG9uZW50ID0gMTAwOworICAgICAgICB3aGlsZSAoaW5kZXggPCBsZW5ndGgpIHsKKyAgICAgICAgICAgIGMgPSBxLmNoYXJBdChpbmRleCsrKTsKKyAgICAgICAgICAgIGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykgeworICAgICAgICAgICAgICAgIHZhbHVlICs9IChjIC0gJzAnKSAqIGV4cG9uZW50OworICAgICAgICAgICAgICAgIGV4cG9uZW50IC89IDEwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgcGFyc2luZyBRdWFsaXR5IHZhbHVlOiBhIGRlY2ltYWwgbnVtZXJhbCBpcyBleHBlY3RlZCByYXRoZXIgdGhhbiAnIiArIGMgKyAiJyIsIGluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICh3aG9sZU51bWJlciA9PSAnMScpIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA+IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIlRoZSBRdWFsaXR5IHZhbHVlLCAiICsgcSArICIsIGlzIGdyZWF0ZXIgdGhhbiAxIiwgaW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIFF1YWxpdHkuREVGQVVMVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRPRE8gamF2YWRvYy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCByZWFkUXVhbGl0eUZhY3RvclBhcmFtZXRlcihIdHRwSGVhZGVyUmVhZGVyIHJlYWRlcikgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgd2hpbGUgKHJlYWRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0U2VwYXJhdG9yKCc7Jyk7CisKKyAgICAgICAgICAgIC8vIElnbm9yZSBhICc7JyB3aXRoIG5vIHBhcmFtZXRlcnMKKyAgICAgICAgICAgIGlmICghcmVhZGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBRdWFsaXR5LkRFRkFVTFQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEdldCB0aGUgcGFyYW1ldGVyIG5hbWUKKyAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBuYW1lID0gcmVhZGVyLm5leHRUb2tlbigpOworICAgICAgICAgICAgcmVhZGVyLm5leHRTZXBhcmF0b3IoJz0nKTsKKyAgICAgICAgICAgIC8vIEdldCB0aGUgcGFyYW1ldGVyIHZhbHVlCisgICAgICAgICAgICBDaGFyU2VxdWVuY2UgdmFsdWUgPSByZWFkZXIubmV4dFRva2VuT3JRdW90ZWRTdHJpbmcoKTsKKworICAgICAgICAgICAgaWYgKG5hbWUubGVuZ3RoKCkgPT0gMSAmJiAobmFtZS5jaGFyQXQoMCkgPT0gJ3EnIHx8IG5hbWUuY2hhckF0KDApID09ICdRJykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVhZFF1YWxpdHlGYWN0b3IodmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIFF1YWxpdHkuREVGQVVMVDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUT0RPIGphdmFkb2MuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IHJlYWRQYXJhbWV0ZXJzKEh0dHBIZWFkZXJSZWFkZXIgcmVhZGVyKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICByZXR1cm4gcmVhZFBhcmFtZXRlcnMocmVhZGVyLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVE9ETyBqYXZhZG9jLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiByZWFkUGFyYW1ldGVycyhIdHRwSGVhZGVyUmVhZGVyIHJlYWRlciwgYm9vbGVhbiBmaWxlTmFtZUZpeCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBtID0gbnVsbDsKKworICAgICAgICB3aGlsZSAocmVhZGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgcmVhZGVyLm5leHRTZXBhcmF0b3IoJzsnKTsKKyAgICAgICAgICAgIHdoaWxlIChyZWFkZXIuaGFzTmV4dFNlcGFyYXRvcignOycsIHRydWUpKSB7CisgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWdub3JlIGEgJzsnIHdpdGggbm8gcGFyYW1ldGVycworICAgICAgICAgICAgaWYgKCFyZWFkZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEdldCB0aGUgcGFyYW1ldGVyIG5hbWUKKyAgICAgICAgICAgIFN0cmluZyBuYW1lID0gcmVhZGVyLm5leHRUb2tlbigpLnRvU3RyaW5nKCkudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgICAgIHJlYWRlci5uZXh0U2VwYXJhdG9yKCc9Jyk7CisgICAgICAgICAgICAvLyBHZXQgdGhlIHBhcmFtZXRlciB2YWx1ZQorICAgICAgICAgICAgU3RyaW5nIHZhbHVlOworICAgICAgICAgICAgLy8gZml4IGZvciBodHRwOi8vamF2YS5uZXQvamlyYS9icm93c2UvSkVSU0VZLTc1OQorICAgICAgICAgICAgaWYgKCJmaWxlbmFtZSIuZXF1YWxzKG5hbWUpICYmIGZpbGVOYW1lRml4KSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSByZWFkZXIubmV4dFRva2VuT3JRdW90ZWRTdHJpbmcodHJ1ZSkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZyh2YWx1ZS5sYXN0SW5kZXhPZignXFwnKSArIDEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHJlYWRlci5uZXh0VG9rZW5PclF1b3RlZFN0cmluZyhmYWxzZSkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtID0gbmV3IExpbmtlZEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIExvd2VyIGNhc2UgdGhlIHBhcmFtZXRlciBuYW1lCisgICAgICAgICAgICBtLnB1dChuYW1lLCB2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUT0RPIGphdmFkb2MuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBDb29raWU+IHJlYWRDb29raWVzKFN0cmluZyBoZWFkZXIpIHsKKyAgICAgICAgcmV0dXJuIENvb2tpZXNQYXJzZXIucGFyc2VDb29raWVzKGhlYWRlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVE9ETyBqYXZhZG9jLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ29va2llIHJlYWRDb29raWUoU3RyaW5nIGhlYWRlcikgeworICAgICAgICByZXR1cm4gQ29va2llc1BhcnNlci5wYXJzZUNvb2tpZShoZWFkZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRPRE8gamF2YWRvYy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE5ld0Nvb2tpZSByZWFkTmV3Q29va2llKFN0cmluZyBoZWFkZXIpIHsKKyAgICAgICAgcmV0dXJuIENvb2tpZXNQYXJzZXIucGFyc2VOZXdDb29raWUoaGVhZGVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnRlcmZhY2UgTGlzdEVsZW1lbnRDcmVhdG9yPFQ+IHsKKworICAgICAgICBUIGNyZWF0ZShIdHRwSGVhZGVyUmVhZGVyIHJlYWRlcikgdGhyb3dzIFBhcnNlRXhjZXB0aW9uOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3RFbGVtZW50Q3JlYXRvcjxNYXRjaGluZ0VudGl0eVRhZz4gTUFUQ0hJTkdfRU5USVRZX1RBR19DUkVBVE9SID0KKyAgICAgICAgICAgIG5ldyBMaXN0RWxlbWVudENyZWF0b3I8TWF0Y2hpbmdFbnRpdHlUYWc+KCkgeworCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIE1hdGNoaW5nRW50aXR5VGFnIGNyZWF0ZShIdHRwSGVhZGVyUmVhZGVyIHJlYWRlcikgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1hdGNoaW5nRW50aXR5VGFnLnZhbHVlT2YocmVhZGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgLyoqCisgICAgICogVE9ETyBqYXZhZG9jLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU2V0PE1hdGNoaW5nRW50aXR5VGFnPiByZWFkTWF0Y2hpbmdFbnRpdHlUYWcoU3RyaW5nIGhlYWRlcikgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCIqIi5lcXVhbHMoaGVhZGVyKSkgeworICAgICAgICAgICAgcmV0dXJuIE1hdGNoaW5nRW50aXR5VGFnLkFOWV9NQVRDSDsKKyAgICAgICAgfQorCisgICAgICAgIEh0dHBIZWFkZXJSZWFkZXIgcmVhZGVyID0gbmV3IEh0dHBIZWFkZXJSZWFkZXJJbXBsKGhlYWRlcik7CisgICAgICAgIFNldDxNYXRjaGluZ0VudGl0eVRhZz4gbCA9IG5ldyBIYXNoU2V0PE1hdGNoaW5nRW50aXR5VGFnPigxKTsKKyAgICAgICAgSHR0cEhlYWRlckxpc3RBZGFwdGVyIGFkYXB0ZXIgPSBuZXcgSHR0cEhlYWRlckxpc3RBZGFwdGVyKHJlYWRlcik7CisgICAgICAgIHdoaWxlIChyZWFkZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBsLmFkZChNQVRDSElOR19FTlRJVFlfVEFHX0NSRUFUT1IuY3JlYXRlKGFkYXB0ZXIpKTsKKyAgICAgICAgICAgIGFkYXB0ZXIucmVzZXQoKTsKKyAgICAgICAgICAgIGlmIChyZWFkZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBsOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3RFbGVtZW50Q3JlYXRvcjxNZWRpYVR5cGU+IE1FRElBX1RZUEVfQ1JFQVRPUiA9CisgICAgICAgICAgICBuZXcgTGlzdEVsZW1lbnRDcmVhdG9yPE1lZGlhVHlwZT4oKSB7CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgTWVkaWFUeXBlIGNyZWF0ZShIdHRwSGVhZGVyUmVhZGVyIHJlYWRlcikgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1lZGlhVHlwZVByb3ZpZGVyLnZhbHVlT2YocmVhZGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgLyoqCisgICAgICogVE9ETyBqYXZhZG9jLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxNZWRpYVR5cGU+IHJlYWRNZWRpYVR5cGVzKExpc3Q8TWVkaWFUeXBlPiBsLCBTdHJpbmcgaGVhZGVyKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICByZXR1cm4gSHR0cEhlYWRlclJlYWRlci5yZWFkTGlzdCgKKyAgICAgICAgICAgICAgICBsLAorICAgICAgICAgICAgICAgIE1FRElBX1RZUEVfQ1JFQVRPUiwKKyAgICAgICAgICAgICAgICBoZWFkZXIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3RFbGVtZW50Q3JlYXRvcjxBY2NlcHRhYmxlTWVkaWFUeXBlPiBBQ0NFUFRBQkxFX01FRElBX1RZUEVfQ1JFQVRPUiA9CisgICAgICAgICAgICBuZXcgTGlzdEVsZW1lbnRDcmVhdG9yPEFjY2VwdGFibGVNZWRpYVR5cGU+KCkgeworCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIEFjY2VwdGFibGVNZWRpYVR5cGUgY3JlYXRlKEh0dHBIZWFkZXJSZWFkZXIgcmVhZGVyKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQWNjZXB0YWJsZU1lZGlhVHlwZS52YWx1ZU9mKHJlYWRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgIC8qKgorICAgICAqIFRPRE8gamF2YWRvYy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8QWNjZXB0YWJsZU1lZGlhVHlwZT4gcmVhZEFjY2VwdE1lZGlhVHlwZShTdHJpbmcgaGVhZGVyKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICByZXR1cm4gSHR0cEhlYWRlclJlYWRlci5yZWFkUXVhbGlmaWVkTGlzdCgKKyAgICAgICAgICAgICAgICBBY2NlcHRhYmxlTWVkaWFUeXBlLkNPTVBBUkFUT1IsCisgICAgICAgICAgICAgICAgQUNDRVBUQUJMRV9NRURJQV9UWVBFX0NSRUFUT1IsCisgICAgICAgICAgICAgICAgaGVhZGVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0RWxlbWVudENyZWF0b3I8UXVhbGl0eVNvdXJjZU1lZGlhVHlwZT4gUVVBTElUWV9TT1VSQ0VfTUVESUFfVFlQRV9DUkVBVE9SID0KKyAgICAgICAgICAgIG5ldyBMaXN0RWxlbWVudENyZWF0b3I8UXVhbGl0eVNvdXJjZU1lZGlhVHlwZT4oKSB7CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgUXVhbGl0eVNvdXJjZU1lZGlhVHlwZSBjcmVhdGUoSHR0cEhlYWRlclJlYWRlciByZWFkZXIpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBRdWFsaXR5U291cmNlTWVkaWFUeXBlLnZhbHVlT2YocmVhZGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgLyoqCisgICAgICogRklYTUUgdXNlIHNvbWV3aGVyZSBpbiBwcm9kdWN0aW9uIGNvZGUgb3IgcmVtb3ZlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxRdWFsaXR5U291cmNlTWVkaWFUeXBlPiByZWFkUXVhbGl0eVNvdXJjZU1lZGlhVHlwZShTdHJpbmcgaGVhZGVyKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICByZXR1cm4gSHR0cEhlYWRlclJlYWRlci5yZWFkUXVhbGlmaWVkTGlzdCgKKyAgICAgICAgICAgICAgICBRdWFsaXR5U291cmNlTWVkaWFUeXBlLkNPTVBBUkFUT1IsCisgICAgICAgICAgICAgICAgUVVBTElUWV9TT1VSQ0VfTUVESUFfVFlQRV9DUkVBVE9SLAorICAgICAgICAgICAgICAgIGhlYWRlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVE9ETyBqYXZhZG9jLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxRdWFsaXR5U291cmNlTWVkaWFUeXBlPiByZWFkUXVhbGl0eVNvdXJjZU1lZGlhVHlwZShTdHJpbmdbXSBoZWFkZXIpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChoZWFkZXIubGVuZ3RoIDwgMikgeworICAgICAgICAgICAgcmV0dXJuIHJlYWRRdWFsaXR5U291cmNlTWVkaWFUeXBlKGhlYWRlclswXSk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgZm9yIChTdHJpbmcgaCA6IGhlYWRlcikgeworICAgICAgICAgICAgaWYgKHNiLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzYi5hcHBlbmQoaCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVhZFF1YWxpdHlTb3VyY2VNZWRpYVR5cGUoc2IudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVE9ETyBqYXZhZG9jLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxBY2NlcHRhYmxlTWVkaWFUeXBlPiByZWFkQWNjZXB0TWVkaWFUeXBlKAorICAgICAgICAgICAgZmluYWwgU3RyaW5nIGhlYWRlciwgZmluYWwgTGlzdDxRdWFsaXR5U291cmNlTWVkaWFUeXBlPiBwcmlvcml0eU1lZGlhVHlwZXMpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmV0dXJuIEh0dHBIZWFkZXJSZWFkZXIucmVhZFF1YWxpZmllZExpc3QoCisgICAgICAgICAgICAgICAgbmV3IENvbXBhcmF0b3I8QWNjZXB0YWJsZU1lZGlhVHlwZT4oKSB7CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShBY2NlcHRhYmxlTWVkaWFUeXBlIG8xLCBBY2NlcHRhYmxlTWVkaWFUeXBlIG8yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSB3aGF0IGlzIGdvaW5nIG9uIGhlcmU/CisgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHFfbzFfc2V0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcV9vMSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHFfbzJfc2V0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcV9vMiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFF1YWxpdHlTb3VyY2VNZWRpYVR5cGUgcHJpb3JpdHlUeXBlIDogcHJpb3JpdHlNZWRpYVR5cGVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFxX28xX3NldCAmJiBNZWRpYVR5cGVzLnR5cGVFcXVhbChvMSwgcHJpb3JpdHlUeXBlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxX28xID0gbzEuZ2V0UXVhbGl0eSgpICogcHJpb3JpdHlUeXBlLmdldFF1YWxpdHkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcV9vMV9zZXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXFfbzJfc2V0ICYmIE1lZGlhVHlwZXMudHlwZUVxdWFsKG8yLCBwcmlvcml0eVR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHFfbzIgPSBvMi5nZXRRdWFsaXR5KCkgKiBwcmlvcml0eVR5cGUuZ2V0UXVhbGl0eSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxX28yX3NldCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGkgPSBxX28yIC0gcV9vMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaSA9IG8yLmdldFF1YWxpdHkoKSAtIG8xLmdldFF1YWxpdHkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1lZGlhVHlwZXMuUEFSVElBTF9PUkRFUl9DT01QQVJBVE9SLmNvbXBhcmUobzEsIG8yKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgQUNDRVBUQUJMRV9NRURJQV9UWVBFX0NSRUFUT1IsCisgICAgICAgICAgICAgICAgaGVhZGVyKTsKKyAgICB9CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdEVsZW1lbnRDcmVhdG9yPEFjY2VwdGFibGVUb2tlbj4gQUNDRVBUQUJMRV9UT0tFTl9DUkVBVE9SID0KKyAgICAgICAgICAgIG5ldyBMaXN0RWxlbWVudENyZWF0b3I8QWNjZXB0YWJsZVRva2VuPigpIHsKKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBBY2NlcHRhYmxlVG9rZW4gY3JlYXRlKEh0dHBIZWFkZXJSZWFkZXIgcmVhZGVyKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFjY2VwdGFibGVUb2tlbihyZWFkZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAvKioKKyAgICAgKiBUT0RPIGphdmFkb2MuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0PEFjY2VwdGFibGVUb2tlbj4gcmVhZEFjY2VwdFRva2VuKFN0cmluZyBoZWFkZXIpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBIdHRwSGVhZGVyUmVhZGVyLnJlYWRRdWFsaWZpZWRMaXN0KEFDQ0VQVEFCTEVfVE9LRU5fQ1JFQVRPUiwgaGVhZGVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0RWxlbWVudENyZWF0b3I8QWNjZXB0YWJsZUxhbmd1YWdlVGFnPiBMQU5HVUFHRV9DUkVBVE9SID0KKyAgICAgICAgICAgIG5ldyBMaXN0RWxlbWVudENyZWF0b3I8QWNjZXB0YWJsZUxhbmd1YWdlVGFnPigpIHsKKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBBY2NlcHRhYmxlTGFuZ3VhZ2VUYWcgY3JlYXRlKEh0dHBIZWFkZXJSZWFkZXIgcmVhZGVyKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEFjY2VwdGFibGVMYW5ndWFnZVRhZyhyZWFkZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAvKioKKyAgICAgKiBUT0RPIGphdmFkb2MuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0PEFjY2VwdGFibGVMYW5ndWFnZVRhZz4gcmVhZEFjY2VwdExhbmd1YWdlKFN0cmluZyBoZWFkZXIpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBIdHRwSGVhZGVyUmVhZGVyLnJlYWRRdWFsaWZpZWRMaXN0KExBTkdVQUdFX0NSRUFUT1IsIGhlYWRlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgPFQgZXh0ZW5kcyBRdWFsaWZpZWQ+IExpc3Q8VD4gcmVhZFF1YWxpZmllZExpc3QoTGlzdEVsZW1lbnRDcmVhdG9yPFQ+IGMsIFN0cmluZyBoZWFkZXIpCisgICAgICAgICAgICB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworCisgICAgICAgIExpc3Q8VD4gbCA9IHJlYWRMaXN0KGMsIGhlYWRlcik7CisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQobCwgUXVhbGl0eS5RVUFMSUZJRURfQ09NUEFSQVRPUik7CisgICAgICAgIHJldHVybiBsOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIDxUPiBMaXN0PFQ+IHJlYWRRdWFsaWZpZWRMaXN0KGZpbmFsIENvbXBhcmF0b3I8VD4gY29tcGFyYXRvciwgTGlzdEVsZW1lbnRDcmVhdG9yPFQ+IGMsIFN0cmluZyBoZWFkZXIpCisgICAgICAgICAgICB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworCisgICAgICAgIExpc3Q8VD4gbCA9IHJlYWRMaXN0KGMsIGhlYWRlcik7CisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQobCwgY29tcGFyYXRvcik7CisgICAgICAgIHJldHVybiBsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRPRE8gamF2YWRvYy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiByZWFkU3RyaW5nTGlzdChTdHJpbmcgaGVhZGVyKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICByZXR1cm4gcmVhZExpc3QobmV3IExpc3RFbGVtZW50Q3JlYXRvcjxTdHJpbmc+KCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlKEh0dHBIZWFkZXJSZWFkZXIgcmVhZGVyKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICAgICAgICAgIHJlYWRlci5oYXNOZXh0KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5uZXh0VG9rZW4oKS50b1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICB9LCBoZWFkZXIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIDxUPiBMaXN0PFQ+IHJlYWRMaXN0KGZpbmFsIExpc3RFbGVtZW50Q3JlYXRvcjxUPiBjLCBmaW5hbCBTdHJpbmcgaGVhZGVyKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICByZXR1cm4gcmVhZExpc3QobmV3IEFycmF5TGlzdDxUPigpLCBjLCBoZWFkZXIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIDxUPiBMaXN0PFQ+IHJlYWRMaXN0KGZpbmFsIExpc3Q8VD4gbCwgZmluYWwgTGlzdEVsZW1lbnRDcmVhdG9yPFQ+IGMsIGZpbmFsIFN0cmluZyBoZWFkZXIpCisgICAgICAgICAgICB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworCisgICAgICAgIEh0dHBIZWFkZXJSZWFkZXIgcmVhZGVyID0gbmV3IEh0dHBIZWFkZXJSZWFkZXJJbXBsKGhlYWRlcik7CisgICAgICAgIEh0dHBIZWFkZXJMaXN0QWRhcHRlciBhZGFwdGVyID0gbmV3IEh0dHBIZWFkZXJMaXN0QWRhcHRlcihyZWFkZXIpOworCisgICAgICAgIHdoaWxlIChyZWFkZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBsLmFkZChjLmNyZWF0ZShhZGFwdGVyKSk7CisgICAgICAgICAgICBhZGFwdGVyLnJlc2V0KCk7CisgICAgICAgICAgICBpZiAocmVhZGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvSHR0cEhlYWRlclJlYWRlckltcGwuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9IdHRwSGVhZGVyUmVhZGVySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ODI4MjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvSHR0cEhlYWRlclJlYWRlckltcGwuamF2YQpAQCAtMCwwICsxLDI0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsOworCitpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5HcmFtbWFyVXRpbC5DT01NRU5UOworaW1wb3J0IHN0YXRpYyBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkdyYW1tYXJVdGlsLkNPTlRST0w7CitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuR3JhbW1hclV0aWwuUVVPVEVEX1NUUklORzsKK2ltcG9ydCBzdGF0aWMgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5HcmFtbWFyVXRpbC5TRVBBUkFUT1I7CitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuR3JhbW1hclV0aWwuVE9LRU47CitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuR3JhbW1hclV0aWwuZmlsdGVyVG9rZW47CitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuR3JhbW1hclV0aWwuZ2V0VHlwZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5HcmFtbWFyVXRpbC5pc1NlcGFyYXRvcjsKK2ltcG9ydCBzdGF0aWMgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5HcmFtbWFyVXRpbC5pc1Rva2VuOworaW1wb3J0IHN0YXRpYyBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkdyYW1tYXJVdGlsLmlzV2hpdGVTcGFjZTsKKworLyoqCisgKiBDb25jcmV0ZSBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBvZiBwdWxsLWJhc2VkIEhUVFAgcmVhZGVyLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCisvKiBwYWNrYWdlICovIGZpbmFsIGNsYXNzIEh0dHBIZWFkZXJSZWFkZXJJbXBsIGV4dGVuZHMgSHR0cEhlYWRlclJlYWRlciB7CisKKyAgICBwcml2YXRlIGZpbmFsIENoYXJTZXF1ZW5jZSBoZWFkZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHByb2Nlc3NDb21tZW50czsKKyAgICBwcml2YXRlIGZpbmFsIGludCBsZW5ndGg7CisKKyAgICBwcml2YXRlIGludCBpbmRleDsKKyAgICBwcml2YXRlIEV2ZW50IGV2ZW50OworICAgIHByaXZhdGUgQ2hhclNlcXVlbmNlIHZhbHVlOworCisgICAgSHR0cEhlYWRlclJlYWRlckltcGwoU3RyaW5nIGhlYWRlciwgYm9vbGVhbiBwcm9jZXNzQ29tbWVudHMpIHsKKyAgICAgICAgdGhpcy5oZWFkZXIgPSAoaGVhZGVyID09IG51bGwpID8gIiIgOiBoZWFkZXI7CisgICAgICAgIHRoaXMucHJvY2Vzc0NvbW1lbnRzID0gcHJvY2Vzc0NvbW1lbnRzOworICAgICAgICB0aGlzLmluZGV4ID0gMDsKKyAgICAgICAgdGhpcy5sZW5ndGggPSB0aGlzLmhlYWRlci5sZW5ndGgoKTsKKyAgICB9CisKKyAgICBIdHRwSGVhZGVyUmVhZGVySW1wbChTdHJpbmcgaGVhZGVyKSB7CisgICAgICAgIHRoaXMoaGVhZGVyLCBmYWxzZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgcmV0dXJuIHNraXBXaGl0ZVNwYWNlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dFNlcGFyYXRvcihjaGFyIHNlcGFyYXRvciwgYm9vbGVhbiBza2lwV2hpdGVTcGFjZSkgeworICAgICAgICBpZiAoc2tpcFdoaXRlU3BhY2UpIHsKKyAgICAgICAgICAgIHNraXBXaGl0ZVNwYWNlKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW5kZXggPj0gbGVuZ3RoKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBjaGFyIGMgPSBoZWFkZXIuY2hhckF0KGluZGV4KTsKKyAgICAgICAgcmV0dXJuIGlzU2VwYXJhdG9yKGMpICYmIGMgPT0gc2VwYXJhdG9yOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgbmV4dFNlcGFyYXRlZFN0cmluZyhjaGFyIHN0YXJ0U2VwYXJhdG9yLCBjaGFyIGVuZFNlcGFyYXRvcikgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgbmV4dFNlcGFyYXRvcihzdGFydFNlcGFyYXRvcik7CisgICAgICAgIGZpbmFsIGludCBzdGFydCA9IGluZGV4OworICAgICAgICBmb3IgKDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHsKKyAgICAgICAgICAgIGlmIChoZWFkZXIuY2hhckF0KGluZGV4KSA9PSBlbmRTZXBhcmF0b3IpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzdGFydCA9PSBpbmRleCkgeworICAgICAgICAgICAgLy8gbm8gdG9rZW4gYmV0d2VlbiBzZXBhcmF0b3JzCisgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuSFRUUF9IRUFERVJfTk9fQ0hBUlNfQkVUV0VFTl9TRVBBUkFUT1JTKHN0YXJ0U2VwYXJhdG9yLCBlbmRTZXBhcmF0b3IpLAorICAgICAgICAgICAgICAgICAgICBpbmRleCk7CisgICAgICAgIH0gZWxzZSBpZiAoaW5kZXggPT0gbGVuZ3RoKSB7CisgICAgICAgICAgICAvLyBubyBlbmQgc2VwYXJhdG9yCisgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuSFRUUF9IRUFERVJfTk9fRU5EX1NFUEFSQVRPUihlbmRTZXBhcmF0b3IpLCBpbmRleCk7CisgICAgICAgIH0KKworICAgICAgICBldmVudCA9IEV2ZW50LlRva2VuOworICAgICAgICB2YWx1ZSA9IGhlYWRlci5zdWJTZXF1ZW5jZShzdGFydCwgaW5kZXgrKyk7CisgICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBFdmVudCBuZXh0KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5leHQodHJ1ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEV2ZW50IG5leHQoYm9vbGVhbiBza2lwV2hpdGVTcGFjZSkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5leHQoc2tpcFdoaXRlU3BhY2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRXZlbnQgbmV4dChib29sZWFuIHNraXBXaGl0ZVNwYWNlLCBib29sZWFuIHByZXNlcnZlQmFja3NsYXNoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZXZlbnQgPSBwcm9jZXNzKGdldE5leHRDaGFyYWN0ZXIoc2tpcFdoaXRlU3BhY2UpLCBwcmVzZXJ2ZUJhY2tzbGFzaCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEV2ZW50IGdldEV2ZW50KCkgeworICAgICAgICByZXR1cm4gZXZlbnQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRFdmVudFZhbHVlKCkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRSZW1haW5kZXIoKSB7CisgICAgICAgIHJldHVybiAoaW5kZXggPCBsZW5ndGgpID8gaGVhZGVyLnN1YlNlcXVlbmNlKGluZGV4LCBoZWFkZXIubGVuZ3RoKCkpIDogbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldEluZGV4KCkgeworICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHNraXBXaGl0ZVNwYWNlKCkgeworICAgICAgICBmb3IgKDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHsKKyAgICAgICAgICAgIGlmICghaXNXaGl0ZVNwYWNlKGhlYWRlci5jaGFyQXQoaW5kZXgpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgY2hhciBnZXROZXh0Q2hhcmFjdGVyKGJvb2xlYW4gc2tpcFdoaXRlU3BhY2UpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChza2lwV2hpdGVTcGFjZSkgeworICAgICAgICAgICAgc2tpcFdoaXRlU3BhY2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbmRleCA+PSBsZW5ndGgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5IVFRQX0hFQURFUl9FTkRfT0ZfSEVBREVSKCksIGluZGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBoZWFkZXIuY2hhckF0KGluZGV4KTsKKyAgICB9CisKKyAgICBwcml2YXRlIEV2ZW50IHByb2Nlc3MoY2hhciBjLCBib29sZWFuIHByZXNlcnZlQmFja3NsYXNoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICBpZiAoYyA+IEJ5dGUuTUFYX1ZBTFVFKSB7CisgICAgICAgICAgICBpbmRleCsrOworICAgICAgICAgICAgcmV0dXJuIEV2ZW50LkNvbnRyb2w7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGdldFR5cGUoYykpIHsKKyAgICAgICAgICAgIGNhc2UgVE9LRU46IHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc3RhcnQgPSBpbmRleDsKKyAgICAgICAgICAgICAgICBmb3IgKGluZGV4Kys7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghaXNUb2tlbihoZWFkZXIuY2hhckF0KGluZGV4KSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZhbHVlID0gaGVhZGVyLnN1YlNlcXVlbmNlKHN0YXJ0LCBpbmRleCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEV2ZW50LlRva2VuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBRVU9URURfU1RSSU5HOgorICAgICAgICAgICAgICAgIHByb2Nlc3NRdW90ZWRTdHJpbmcocHJlc2VydmVCYWNrc2xhc2gpOworICAgICAgICAgICAgICAgIHJldHVybiBFdmVudC5RdW90ZWRTdHJpbmc7CisgICAgICAgICAgICBjYXNlIENPTU1FTlQ6CisgICAgICAgICAgICAgICAgaWYgKCFwcm9jZXNzQ29tbWVudHMpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLkhUVFBfSEVBREVSX0NPTU1FTlRTX05PVF9BTExPV0VEKCksIGluZGV4KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcm9jZXNzQ29tbWVudCgpOworICAgICAgICAgICAgICAgIHJldHVybiBFdmVudC5Db21tZW50OworICAgICAgICAgICAgY2FzZSBTRVBBUkFUT1I6CisgICAgICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IFN0cmluZy52YWx1ZU9mKGMpOworICAgICAgICAgICAgICAgIHJldHVybiBFdmVudC5TZXBhcmF0b3I7CisgICAgICAgICAgICBjYXNlIENPTlRST0w6CisgICAgICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IFN0cmluZy52YWx1ZU9mKGMpOworICAgICAgICAgICAgICAgIHJldHVybiBFdmVudC5Db250cm9sOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvLyBXaGl0ZSBzcGFjZQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5IVFRQX0hFQURFUl9XSElURVNQQUNFX05PVF9BTExPV0VEKCksIGluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQ29tbWVudCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIGJvb2xlYW4gZmlsdGVyID0gZmFsc2U7CisgICAgICAgIGludCBuZXN0aW5nOworICAgICAgICBpbnQgc3RhcnQ7CisgICAgICAgIGZvciAoc3RhcnQgPSArK2luZGV4LCBuZXN0aW5nID0gMTsgbmVzdGluZyA+IDAgJiYgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHsKKyAgICAgICAgICAgIGNoYXIgYyA9IGhlYWRlci5jaGFyQXQoaW5kZXgpOworICAgICAgICAgICAgaWYgKGMgPT0gJ1xcJykgeworICAgICAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgICAgICAgICAgZmlsdGVyID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnXHInKSB7CisgICAgICAgICAgICAgICAgZmlsdGVyID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnKCcpIHsKKyAgICAgICAgICAgICAgICBuZXN0aW5nKys7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJyknKSB7CisgICAgICAgICAgICAgICAgbmVzdGluZy0tOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChuZXN0aW5nICE9IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5IVFRQX0hFQURFUl9VTkJBTEFOQ0VEX0NPTU1FTlRTKCksIGluZGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIHZhbHVlID0gKGZpbHRlcikgPyBmaWx0ZXJUb2tlbihoZWFkZXIsIHN0YXJ0LCBpbmRleCAtIDEpIDogaGVhZGVyLnN1YlNlcXVlbmNlKHN0YXJ0LCBpbmRleCAtIDEpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzUXVvdGVkU3RyaW5nKGJvb2xlYW4gcHJlc2VydmVCYWNrc2xhc2gpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIGJvb2xlYW4gZmlsdGVyID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IHN0YXJ0ID0gKytpbmRleDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHsKKyAgICAgICAgICAgIGNoYXIgYyA9IHRoaXMuaGVhZGVyLmNoYXJBdChpbmRleCk7CisgICAgICAgICAgICBpZiAoIXByZXNlcnZlQmFja3NsYXNoICYmIGMgPT0gJ1xcJykgeworICAgICAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgICAgICAgICAgZmlsdGVyID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnXHInKSB7CisgICAgICAgICAgICAgICAgZmlsdGVyID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnIicpIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IChmaWx0ZXIpID8gZmlsdGVyVG9rZW4oaGVhZGVyLCBzdGFydCwgaW5kZXgsIHByZXNlcnZlQmFja3NsYXNoKSA6IGhlYWRlci5zdWJTZXF1ZW5jZShzdGFydCwgaW5kZXgpOworCisgICAgICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuSFRUUF9IRUFERVJfVU5CQUxBTkNFRF9RVU9URUQoKSwgaW5kZXgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9JbmJvdW5kTWVzc2FnZUNvbnRleHQuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9JbmJvdW5kTWVzc2FnZUNvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDA1MzEwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL0luYm91bmRNZXNzYWdlQ29udGV4dC5qYXZhCkBAIC0wLDAgKzEsOTI3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29va2llOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRW50aXR5VGFnOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5MaW5rOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5OZXdDb29raWU7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJlYWRlckludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SdW50aW1lRGVsZWdhdGU7CisKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLlByb3BlcnRpZXNEZWxlZ2F0ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLk1lc3NhZ2VCb2R5V29ya2VyczsKKworLyoqCisgKiBCYXNlIGluYm91bmQgbWVzc2FnZSBjb250ZXh0IGltcGxlbWVudGF0aW9uLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBJbmJvdW5kTWVzc2FnZUNvbnRleHQgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW5wdXRTdHJlYW0gRU1QVFkgPSBuZXcgSW5wdXRTdHJlYW0oKSB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgbWFyayhpbnQgcmVhZGxpbWl0KSB7CisgICAgICAgICAgICAvLyBuby1vcAorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIC8vIG5vLW9wCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uW10gRU1QVFlfQU5OT1RBVElPTlMgPSBuZXcgQW5ub3RhdGlvblswXTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PEFjY2VwdGFibGVNZWRpYVR5cGU+IFdJTERDQVJEX0FDQ0VQVEFCTEVfVFlQRV9TSU5HTEVUT05fTElTVCA9CisgICAgICAgICAgICBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KE1lZGlhVHlwZXMuV0lMRENBUkRfQUNDRVBUQUJMRV9UWVBFKTsKKworICAgIHByaXZhdGUgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnM7CisgICAgcHJpdmF0ZSBmaW5hbCBFbnRpdHlDb250ZW50IGVudGl0eUNvbnRlbnQ7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHRyYW5zbGF0ZU5jZTsKKyAgICBwcml2YXRlIE1lc3NhZ2VCb2R5V29ya2VycyB3b3JrZXJzOworCisgICAgLyoqCisgICAgICogSW5wdXQgc3RyZWFtIGFuZCBpdHMgc3RhdGUuIFN0YXRlIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSB7QGxpbmsgVHlwZSBUeXBlIGVudW19IGFuZAorICAgICAqIGlzIHVzZWQgdG8gY29udHJvbCB0aGUgZXhlY3V0aW9uIG9mIGludGVyY2VwdG9ycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBFbnRpdHlDb250ZW50IGV4dGVuZHMgRW50aXR5SW5wdXRTdHJlYW0geworCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBidWZmZXJlZDsKKworICAgICAgICBFbnRpdHlDb250ZW50KCkgeworICAgICAgICAgICAgc3VwZXIoRU1QVFkpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzZXRDb250ZW50KElucHV0U3RyZWFtIGNvbnRlbnQsIGJvb2xlYW4gYnVmZmVyZWQpIHsKKyAgICAgICAgICAgIHRoaXMuYnVmZmVyZWQgPSBidWZmZXJlZDsKKyAgICAgICAgICAgIHNldFdyYXBwZWRTdHJlYW0oY29udGVudCk7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGhhc0NvbnRlbnQoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0V3JhcHBlZFN0cmVhbSgpICE9IEVNUFRZOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBpc0J1ZmZlcmVkKCkgeworICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlcmVkOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICAgICAgY2xvc2UoZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBjbG9zZShib29sZWFuIGZvcmNlKSB7CisgICAgICAgICAgICBpZiAoYnVmZmVyZWQgJiYgIWZvcmNlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzdXBlci5jbG9zZSgpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBidWZmZXJlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHNldFdyYXBwZWRTdHJlYW0obnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IGluYm91bmQgbWVzc2FnZSBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBJbmJvdW5kTWVzc2FnZUNvbnRleHQoKSB7CisgICAgICAgIHRoaXMoZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgaW5ib3VuZCBtZXNzYWdlIGNvbnRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJhbnNsYXRlTmNlIGlmIHtAY29kZSB0cnVlfSwgdGhlIHtAbGluayBqYXZheC53cy5ycy5jb3JlLk5vQ29udGVudEV4Y2VwdGlvbn0gdGhyb3duIGJ5IGEKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkIG1lc3NhZ2UgYm9keSByZWFkZXIgd2lsbCBiZSB0cmFuc2xhdGVkIGludG8gYSB7QGxpbmsgamF2YXgud3MucnMuQmFkUmVxdWVzdEV4Y2VwdGlvbn0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIGFzIHJlcXVpcmVkIGJ5IEpBWC1SUyBzcGVjaWZpY2F0aW9uIG9uIHRoZSBzZXJ2ZXIgc2lkZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSW5ib3VuZE1lc3NhZ2VDb250ZXh0KGJvb2xlYW4gdHJhbnNsYXRlTmNlKSB7CisgICAgICAgIHRoaXMuaGVhZGVycyA9IEhlYWRlclV0aWxzLmNyZWF0ZUluYm91bmQoKTsKKyAgICAgICAgdGhpcy5lbnRpdHlDb250ZW50ID0gbmV3IEVudGl0eUNvbnRlbnQoKTsKKyAgICAgICAgdGhpcy50cmFuc2xhdGVOY2UgPSB0cmFuc2xhdGVOY2U7CisgICAgfQorCisgICAgLy8gTWVzc2FnZSBoZWFkZXJzCisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgaGVhZGVyIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgIGhlYWRlciBuYW1lLgorICAgICAqIEBwYXJhbSB2YWx1ZSBoZWFkZXIgdmFsdWUuCisgICAgICogQHJldHVybiB1cGRhdGVkIGNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIEluYm91bmRNZXNzYWdlQ29udGV4dCBoZWFkZXIoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBnZXRIZWFkZXJzKCkuYWRkKG5hbWUsIEhlYWRlclV0aWxzLmFzU3RyaW5nKHZhbHVlLCBSdW50aW1lRGVsZWdhdGUuZ2V0SW5zdGFuY2UoKSkpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgbmV3IGhlYWRlciB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSAgIGhlYWRlciBuYW1lLgorICAgICAqIEBwYXJhbSB2YWx1ZXMgaGVhZGVyIHZhbHVlcy4KKyAgICAgKiBAcmV0dXJuIHVwZGF0ZWQgY29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgSW5ib3VuZE1lc3NhZ2VDb250ZXh0IGhlYWRlcnMoU3RyaW5nIG5hbWUsIE9iamVjdC4uLiB2YWx1ZXMpIHsKKyAgICAgICAgdGhpcy5nZXRIZWFkZXJzKCkuYWRkQWxsKG5hbWUsIEhlYWRlclV0aWxzLmFzU3RyaW5nTGlzdChBcnJheXMuYXNMaXN0KHZhbHVlcyksIFJ1bnRpbWVEZWxlZ2F0ZS5nZXRJbnN0YW5jZSgpKSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBuZXcgaGVhZGVyIHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lICAgaGVhZGVyIG5hbWUuCisgICAgICogQHBhcmFtIHZhbHVlcyBoZWFkZXIgdmFsdWVzLgorICAgICAqIEByZXR1cm4gdXBkYXRlZCBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBJbmJvdW5kTWVzc2FnZUNvbnRleHQgaGVhZGVycyhTdHJpbmcgbmFtZSwgSXRlcmFibGU8Pz4gdmFsdWVzKSB7CisgICAgICAgIHRoaXMuZ2V0SGVhZGVycygpLmFkZEFsbChuYW1lLCBpdGVyYWJsZVRvTGlzdCh2YWx1ZXMpKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIG5ldyBoZWFkZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIG5ld0hlYWRlcnMgbmV3IGhlYWRlcnMuCisgICAgICogQHJldHVybiB1cGRhdGVkIGNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIEluYm91bmRNZXNzYWdlQ29udGV4dCBoZWFkZXJzKE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBuZXdIZWFkZXJzKSB7CisgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTGlzdDxTdHJpbmc+PiBoZWFkZXIgOiBuZXdIZWFkZXJzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIGhlYWRlcnMuYWRkQWxsKGhlYWRlci5nZXRLZXkoKSwgaGVhZGVyLmdldFZhbHVlKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBuZXcgaGVhZGVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuZXdIZWFkZXJzIG5ldyBoZWFkZXJzLgorICAgICAqIEByZXR1cm4gdXBkYXRlZCBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBJbmJvdW5kTWVzc2FnZUNvbnRleHQgaGVhZGVycyhNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IG5ld0hlYWRlcnMpIHsKKyAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGhlYWRlciA6IG5ld0hlYWRlcnMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgaGVhZGVycy5hZGRBbGwoaGVhZGVyLmdldEtleSgpLCBoZWFkZXIuZ2V0VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgaGVhZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgaGVhZGVyIG5hbWUuCisgICAgICogQHJldHVybiB1cGRhdGVkIGNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIEluYm91bmRNZXNzYWdlQ29udGV4dCByZW1vdmUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5nZXRIZWFkZXJzKCkucmVtb3ZlKG5hbWUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gaXRlcmFibGVUb0xpc3QoZmluYWwgSXRlcmFibGU8Pz4gdmFsdWVzKSB7CisgICAgICAgIGZpbmFsIExpbmtlZExpc3Q8U3RyaW5nPiBsaW5rZWRMaXN0ID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPigpOworCisgICAgICAgIGZpbmFsIFJ1bnRpbWVEZWxlZ2F0ZSByZCA9IFJ1bnRpbWVEZWxlZ2F0ZS5nZXRJbnN0YW5jZSgpOworICAgICAgICBmb3IgKE9iamVjdCBlbGVtZW50IDogdmFsdWVzKSB7CisgICAgICAgICAgICBsaW5rZWRMaXN0LmFkZChIZWFkZXJVdGlscy5hc1N0cmluZyhlbGVtZW50LCByZCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGxpbmtlZExpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgbWVzc2FnZSBoZWFkZXIgYXMgYSBzaW5nbGUgc3RyaW5nIHZhbHVlLgorICAgICAqIDxwLz4KKyAgICAgKiBFYWNoIHNpbmdsZSBoZWFkZXIgdmFsdWUgaXMgY29udmVydGVkIHRvIFN0cmluZyB1c2luZyBhCisgICAgICoge0BsaW5rIGphdmF4LndzLnJzLmV4dC5SdW50aW1lRGVsZWdhdGUuSGVhZGVyRGVsZWdhdGV9IGlmIG9uZSBpcyBhdmFpbGFibGUKKyAgICAgKiB2aWEge0BsaW5rIGphdmF4LndzLnJzLmV4dC5SdW50aW1lRGVsZWdhdGUjY3JlYXRlSGVhZGVyRGVsZWdhdGUoamF2YS5sYW5nLkNsYXNzKX0KKyAgICAgKiBmb3IgdGhlIGhlYWRlciB2YWx1ZSBjbGFzcyBvciB1c2luZyBpdHMge0Bjb2RlIHRvU3RyaW5nfSBtZXRob2QgIGlmIGEgaGVhZGVyCisgICAgICogZGVsZWdhdGUgaXMgbm90IGF2YWlsYWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBtZXNzYWdlIGhlYWRlci4KKyAgICAgKiBAcmV0dXJuIHRoZSBtZXNzYWdlIGhlYWRlciB2YWx1ZS4gSWYgdGhlIG1lc3NhZ2UgaGVhZGVyIGlzIG5vdCBwcmVzZW50IHRoZW4KKyAgICAgKiB7QGNvZGUgbnVsbH0gaXMgcmV0dXJuZWQuIElmIHRoZSBtZXNzYWdlIGhlYWRlciBpcyBwcmVzZW50IGJ1dCBoYXMgbm8KKyAgICAgKiB2YWx1ZSB0aGVuIHRoZSBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuIElmIHRoZSBtZXNzYWdlIGhlYWRlciBpcyBwcmVzZW50CisgICAgICogbW9yZSB0aGFuIG9uY2UgdGhlbiB0aGUgdmFsdWVzIG9mIGpvaW5lZCB0b2dldGhlciBhbmQgc2VwYXJhdGVkIGJ5IGEgJywnCisgICAgICogY2hhcmFjdGVyLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SGVhZGVyU3RyaW5nKFN0cmluZyBuYW1lKSB7CisgICAgICAgIExpc3Q8U3RyaW5nPiB2YWx1ZXMgPSB0aGlzLmhlYWRlcnMuZ2V0KG5hbWUpOworICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBJdGVyYXRvcjxTdHJpbmc+IHZhbHVlc0l0ZXJhdG9yID0gdmFsdWVzLml0ZXJhdG9yKCk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1aWxkZXIodmFsdWVzSXRlcmF0b3IubmV4dCgpKTsKKyAgICAgICAgd2hpbGUgKHZhbHVlc0l0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgYnVmZmVyLmFwcGVuZCgnLCcpLmFwcGVuZCh2YWx1ZXNJdGVyYXRvci5uZXh0KCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIHNpbmdsZSB0eXBlZCBoZWFkZXIgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSAgICAgICAgaGVhZGVyIG5hbWUuCisgICAgICogQHBhcmFtIGNvbnZlcnRlciAgIGZyb20gc3RyaW5nIGNvbnZlcnNpb24gZnVuY3Rpb24uIElzIGV4cGVjdGVkIHRvIHRocm93IHtAbGluayBQcm9jZXNzaW5nRXhjZXB0aW9ufQorICAgICAqICAgICAgICAgICAgICAgICAgICBpZiBjb252ZXJzaW9uIGZhaWxzLgorICAgICAqIEBwYXJhbSBjb252ZXJ0TnVsbCBpZiB7QGNvZGUgdHJ1ZX0gdGhpcyBtZXRob2QgY2FsbHMgdGhlIHByb3ZpZGVkIGNvbnZlcnRlciBldmVuIGZvciB7QGNvZGUgbnVsbH0uIE90aGVyd2lzZSB0aGlzCisgICAgICogICAgICAgICAgICAgICAgICAgIG1ldGhvZCByZXR1cm5zIHRoZSB7QGNvZGUgbnVsbH0gd2l0aG91dCBjYWxsaW5nIHRoZSBjb252ZXJ0ZXIuCisgICAgICogQHJldHVybiB2YWx1ZSBvZiB0aGUgaGVhZGVyLCBvciAocG9zc2libHkgY29udmVydGVkKSB7QGNvZGUgbnVsbH0gaWYgbm90IHByZXNlbnQuCisgICAgICovCisgICAgcHJpdmF0ZSA8VD4gVCBzaW5nbGVIZWFkZXIoU3RyaW5nIG5hbWUsIEZ1bmN0aW9uPFN0cmluZywgVD4gY29udmVydGVyLCBib29sZWFuIGNvbnZlcnROdWxsKSB7CisgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiB2YWx1ZXMgPSB0aGlzLmhlYWRlcnMuZ2V0KG5hbWUpOworCisgICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCB8fCB2YWx1ZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gY29udmVydE51bGwgPyBjb252ZXJ0ZXIuYXBwbHkobnVsbCkgOiBudWxsOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZXMuc2l6ZSgpID4gMSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEhlYWRlclZhbHVlRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlRPT19NQU5ZX0hFQURFUl9WQUxVRVMobmFtZSwgdmFsdWVzLnRvU3RyaW5nKCkpLAorICAgICAgICAgICAgICAgICAgICBIZWFkZXJWYWx1ZUV4Y2VwdGlvbi5Db250ZXh0LklOQk9VTkQpOworICAgICAgICB9CisKKyAgICAgICAgT2JqZWN0IHZhbHVlID0gdmFsdWVzLmdldCgwKTsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0TnVsbCA/IGNvbnZlcnRlci5hcHBseShudWxsKSA6IG51bGw7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlci5hcHBseShIZWFkZXJVdGlscy5hc1N0cmluZyh2YWx1ZSwgbnVsbCkpOworICAgICAgICB9IGNhdGNoIChQcm9jZXNzaW5nRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBleGNlcHRpb24obmFtZSwgdmFsdWUsIGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEhlYWRlclZhbHVlRXhjZXB0aW9uIGV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgaGVhZGVyTmFtZSwgT2JqZWN0IGhlYWRlclZhbHVlLCBFeGNlcHRpb24gZSkgeworICAgICAgICByZXR1cm4gbmV3IEhlYWRlclZhbHVlRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlVOQUJMRV9UT19QQVJTRV9IRUFERVJfVkFMVUUoaGVhZGVyTmFtZSwgaGVhZGVyVmFsdWUpLCBlLAorICAgICAgICAgICAgICAgIEhlYWRlclZhbHVlRXhjZXB0aW9uLkNvbnRleHQuSU5CT1VORCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBtdXRhYmxlIG1lc3NhZ2UgaGVhZGVycyBtdWx0aXZhbHVlZCBtYXAuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIG11dGFibGUgbXVsdGl2YWx1ZWQgbWFwIG9mIG1lc3NhZ2UgaGVhZGVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGdldEhlYWRlcnMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmhlYWRlcnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IG1lc3NhZ2UgZGF0ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG1lc3NhZ2UgZGF0ZSwgb3RoZXJ3aXNlIHtAY29kZSBudWxsfSBpZiBub3QgcHJlc2VudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRGF0ZSBnZXREYXRlKCkgeworICAgICAgICByZXR1cm4gc2luZ2xlSGVhZGVyKEh0dHBIZWFkZXJzLkRBVEUsIG5ldyBGdW5jdGlvbjxTdHJpbmcsIERhdGU+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgRGF0ZSBhcHBseShTdHJpbmcgaW5wdXQpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gSHR0cEhlYWRlclJlYWRlci5yZWFkRGF0ZShpbnB1dCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBJZi1NYXRjaCBoZWFkZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBJZi1NYXRjaCBoZWFkZXIgdmFsdWUsIG90aGVyd2lzZSB7QGNvZGUgbnVsbH0gaWYgbm90IHByZXNlbnQuCisgICAgICovCisgICAgcHVibGljIFNldDxNYXRjaGluZ0VudGl0eVRhZz4gZ2V0SWZNYXRjaCgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGlmTWF0Y2ggPSBnZXRIZWFkZXJTdHJpbmcoSHR0cEhlYWRlcnMuSUZfTUFUQ0gpOworICAgICAgICBpZiAoaWZNYXRjaCA9PSBudWxsIHx8IGlmTWF0Y2guaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIEh0dHBIZWFkZXJSZWFkZXIucmVhZE1hdGNoaW5nRW50aXR5VGFnKGlmTWF0Y2gpOworICAgICAgICB9IGNhdGNoIChqYXZhLnRleHQuUGFyc2VFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgZXhjZXB0aW9uKEh0dHBIZWFkZXJzLklGX01BVENILCBpZk1hdGNoLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBJZi1Ob25lLU1hdGNoIGhlYWRlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIElmLU5vbmUtTWF0Y2ggaGVhZGVyIHZhbHVlLCBvdGhlcndpc2Uge0Bjb2RlIG51bGx9IGlmIG5vdCBwcmVzZW50LgorICAgICAqLworICAgIHB1YmxpYyBTZXQ8TWF0Y2hpbmdFbnRpdHlUYWc+IGdldElmTm9uZU1hdGNoKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgaWZOb25lTWF0Y2ggPSBnZXRIZWFkZXJTdHJpbmcoSHR0cEhlYWRlcnMuSUZfTk9ORV9NQVRDSCk7CisgICAgICAgIGlmIChpZk5vbmVNYXRjaCA9PSBudWxsIHx8IGlmTm9uZU1hdGNoLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBIdHRwSGVhZGVyUmVhZGVyLnJlYWRNYXRjaGluZ0VudGl0eVRhZyhpZk5vbmVNYXRjaCk7CisgICAgICAgIH0gY2F0Y2ggKGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBleGNlcHRpb24oSHR0cEhlYWRlcnMuSUZfTk9ORV9NQVRDSCwgaWZOb25lTWF0Y2gsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsYW5ndWFnZSBvZiB0aGUgZW50aXR5LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbGFuZ3VhZ2Ugb2YgdGhlIGVudGl0eSBvciB7QGNvZGUgbnVsbH0gaWYgbm90IHNwZWNpZmllZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTG9jYWxlIGdldExhbmd1YWdlKCkgeworICAgICAgICByZXR1cm4gc2luZ2xlSGVhZGVyKEh0dHBIZWFkZXJzLkNPTlRFTlRfTEFOR1VBR0UsIG5ldyBGdW5jdGlvbjxTdHJpbmcsIExvY2FsZT4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBMb2NhbGUgYXBwbHkoU3RyaW5nIGlucHV0KSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMYW5ndWFnZVRhZyhpbnB1dCkuZ2V0QXNMb2NhbGUoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBDb250ZW50LUxlbmd0aCB2YWx1ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQ29udGVudC1MZW5ndGggYXMgaW50ZWdlciBpZiBwcmVzZW50IGFuZCB2YWxpZCBudW1iZXIuIEluIG90aGVyIGNhc2VzIHJldHVybnMgLTEuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRMZW5ndGgoKSB7CisgICAgICAgIHJldHVybiBzaW5nbGVIZWFkZXIoSHR0cEhlYWRlcnMuQ09OVEVOVF9MRU5HVEgsIG5ldyBGdW5jdGlvbjxTdHJpbmcsIEludGVnZXI+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgSW50ZWdlciBhcHBseShTdHJpbmcgaW5wdXQpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGlucHV0ICE9IG51bGwgJiYgIWlucHV0LmlzRW1wdHkoKSkgPyBJbnRlZ2VyLnBhcnNlSW50KGlucHV0KSA6IC0xOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbihleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9LCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG1lZGlhIHR5cGUgb2YgdGhlIGVudGl0eS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG1lZGlhIHR5cGUgb3Ige0Bjb2RlIG51bGx9IGlmIG5vdCBzcGVjaWZpZWQgKGUuZy4gdGhlcmUncyBubworICAgICAqIG1lc3NhZ2UgZW50aXR5KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVkaWFUeXBlIGdldE1lZGlhVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHNpbmdsZUhlYWRlcihIdHRwSGVhZGVycy5DT05URU5UX1RZUEUsIG5ldyBGdW5jdGlvbjxTdHJpbmcsIE1lZGlhVHlwZT4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBNZWRpYVR5cGUgYXBwbHkoU3RyaW5nIGlucHV0KSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1lZGlhVHlwZS52YWx1ZU9mKGlucHV0KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKGlhZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9LCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgbGlzdCBvZiBtZWRpYSB0eXBlcyB0aGF0IGFyZSBhY2NlcHRhYmxlIGZvciBhIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgcmVhZC1vbmx5IGxpc3Qgb2YgcmVxdWVzdGVkIHJlc3BvbnNlIG1lZGlhIHR5cGVzIHNvcnRlZCBhY2NvcmRpbmcKKyAgICAgKiB0byB0aGVpciBxLXZhbHVlLCB3aXRoIGhpZ2hlc3QgcHJlZmVyZW5jZSBmaXJzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxBY2NlcHRhYmxlTWVkaWFUeXBlPiBnZXRRdWFsaWZpZWRBY2NlcHRhYmxlTWVkaWFUeXBlcygpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlID0gZ2V0SGVhZGVyU3RyaW5nKEh0dHBIZWFkZXJzLkFDQ0VQVCk7CisKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gV0lMRENBUkRfQUNDRVBUQUJMRV9UWVBFX1NJTkdMRVRPTl9MSVNUOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEh0dHBIZWFkZXJSZWFkZXIucmVhZEFjY2VwdE1lZGlhVHlwZSh2YWx1ZSkpOworICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBleGNlcHRpb24oSHR0cEhlYWRlcnMuQUNDRVBULCB2YWx1ZSwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBsaXN0IG9mIGxhbmd1YWdlcyB0aGF0IGFyZSBhY2NlcHRhYmxlIGZvciB0aGUgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSByZWFkLW9ubHkgbGlzdCBvZiBhY2NlcHRhYmxlIGxhbmd1YWdlcyBzb3J0ZWQgYWNjb3JkaW5nCisgICAgICogdG8gdGhlaXIgcS12YWx1ZSwgd2l0aCBoaWdoZXN0IHByZWZlcmVuY2UgZmlyc3QuCisgICAgICovCisgICAgcHVibGljIExpc3Q8QWNjZXB0YWJsZUxhbmd1YWdlVGFnPiBnZXRRdWFsaWZpZWRBY2NlcHRhYmxlTGFuZ3VhZ2VzKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUgPSBnZXRIZWFkZXJTdHJpbmcoSHR0cEhlYWRlcnMuQUNDRVBUX0xBTkdVQUdFKTsKKworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG5ldyBBY2NlcHRhYmxlTGFuZ3VhZ2VUYWcoIioiLCBudWxsKSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoSHR0cEhlYWRlclJlYWRlci5yZWFkQWNjZXB0TGFuZ3VhZ2UodmFsdWUpKTsKKyAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgZXhjZXB0aW9uKEh0dHBIZWFkZXJzLkFDQ0VQVF9MQU5HVUFHRSwgdmFsdWUsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsaXN0IG9mIGxhbmd1YWdlIHRhZyBmcm9tIHRoZSAiQWNjZXB0LUNoYXJzZXQiIG9mIGFuIEhUVFAgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgQWNjZXB0YWJsZVRva2VuLiBUaGlzIGxpc3QKKyAgICAgKiBpcyBvcmRlcmVkIHdpdGggdGhlIGhpZ2hlc3QgcXVhbGl0eSBhY2NlcHRhYmxlIGNoYXJzZXQgb2NjdXJyaW5nIGZpcnN0LgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PEFjY2VwdGFibGVUb2tlbj4gZ2V0UXVhbGlmaWVkQWNjZXB0Q2hhcnNldCgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGFjY2VwdENoYXJzZXQgPSBnZXRIZWFkZXJTdHJpbmcoSHR0cEhlYWRlcnMuQUNDRVBUX0NIQVJTRVQpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGFjY2VwdENoYXJzZXQgPT0gbnVsbCB8fCBhY2NlcHRDaGFyc2V0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG5ldyBBY2NlcHRhYmxlVG9rZW4oIioiKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gSHR0cEhlYWRlclJlYWRlci5yZWFkQWNjZXB0VG9rZW4oYWNjZXB0Q2hhcnNldCk7CisgICAgICAgIH0gY2F0Y2ggKGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBleGNlcHRpb24oSHR0cEhlYWRlcnMuQUNDRVBUX0NIQVJTRVQsIGFjY2VwdENoYXJzZXQsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsaXN0IG9mIGxhbmd1YWdlIHRhZyBmcm9tIHRoZSAiQWNjZXB0LUNoYXJzZXQiIG9mIGFuIEhUVFAgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgQWNjZXB0YWJsZVRva2VuLiBUaGlzIGxpc3QKKyAgICAgKiBpcyBvcmRlcmVkIHdpdGggdGhlIGhpZ2hlc3QgcXVhbGl0eSBhY2NlcHRhYmxlIGNoYXJzZXQgb2NjdXJyaW5nIGZpcnN0LgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PEFjY2VwdGFibGVUb2tlbj4gZ2V0UXVhbGlmaWVkQWNjZXB0RW5jb2RpbmcoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBhY2NlcHRFbmNvZGluZyA9IGdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5BQ0NFUFRfRU5DT0RJTkcpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGFjY2VwdEVuY29kaW5nID09IG51bGwgfHwgYWNjZXB0RW5jb2RpbmcuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QobmV3IEFjY2VwdGFibGVUb2tlbigiKiIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBIdHRwSGVhZGVyUmVhZGVyLnJlYWRBY2NlcHRUb2tlbihhY2NlcHRFbmNvZGluZyk7CisgICAgICAgIH0gY2F0Y2ggKGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBleGNlcHRpb24oIkFjY2VwdC1FbmNvZGluZyIsIGFjY2VwdEVuY29kaW5nLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhbnkgY29va2llcyB0aGF0IGFjY29tcGFuaWVkIHRoZSByZXF1ZXN0LgorICAgICAqCisgICAgICogQHJldHVybiBhIHJlYWQtb25seSBtYXAgb2YgY29va2llIG5hbWUgKFN0cmluZykgdG8ge0BsaW5rIGphdmF4LndzLnJzLmNvcmUuQ29va2llfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwPFN0cmluZywgQ29va2llPiBnZXRSZXF1ZXN0Q29va2llcygpIHsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGNvb2tpZXMgPSB0aGlzLmhlYWRlcnMuZ2V0KEh0dHBIZWFkZXJzLkNPT0tJRSk7CisgICAgICAgIGlmIChjb29raWVzID09IG51bGwgfHwgY29va2llcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpOworICAgICAgICB9CisKKyAgICAgICAgTWFwPFN0cmluZywgQ29va2llPiByZXN1bHQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENvb2tpZT4oKTsKKyAgICAgICAgZm9yIChTdHJpbmcgY29va2llIDogY29va2llcykgeworICAgICAgICAgICAgaWYgKGNvb2tpZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0LnB1dEFsbChIdHRwSGVhZGVyUmVhZGVyLnJlYWRDb29raWVzKGNvb2tpZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBhbGxvd2VkIEhUVFAgbWV0aG9kcyBmcm9tIHRoZSBBbGxvdyBIVFRQIGhlYWRlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGFsbG93ZWQgSFRUUCBtZXRob2RzLCBhbGwgbWV0aG9kcyB3aWxsIHJldHVybmVkIGFzIHVwcGVyIGNhc2UKKyAgICAgKiBzdHJpbmdzLgorICAgICAqLworICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRBbGxvd2VkTWV0aG9kcygpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGFsbG93ZWQgPSBnZXRIZWFkZXJTdHJpbmcoSHR0cEhlYWRlcnMuQUxMT1cpOworICAgICAgICBpZiAoYWxsb3dlZCA9PSBudWxsIHx8IGFsbG93ZWQuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBIYXNoU2V0PFN0cmluZz4oSHR0cEhlYWRlclJlYWRlci5yZWFkU3RyaW5nTGlzdChhbGxvd2VkLnRvVXBwZXJDYXNlKCkpKTsKKyAgICAgICAgfSBjYXRjaCAoamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbihIdHRwSGVhZGVycy5BTExPVywgYWxsb3dlZCwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYW55IG5ldyBjb29raWVzIHNldCBvbiB0aGUgcmVzcG9uc2UgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSByZWFkLW9ubHkgbWFwIG9mIGNvb2tpZSBuYW1lIChTdHJpbmcpIHRvIGEge0BsaW5rIGphdmF4LndzLnJzLmNvcmUuTmV3Q29va2llIG5ldyBjb29raWV9LgorICAgICAqLworICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBOZXdDb29raWU+IGdldFJlc3BvbnNlQ29va2llcygpIHsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGNvb2tpZXMgPSB0aGlzLmhlYWRlcnMuZ2V0KEh0dHBIZWFkZXJzLlNFVF9DT09LSUUpOworICAgICAgICBpZiAoY29va2llcyA9PSBudWxsIHx8IGNvb2tpZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsKKyAgICAgICAgfQorCisgICAgICAgIE1hcDxTdHJpbmcsIE5ld0Nvb2tpZT4gcmVzdWx0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBOZXdDb29raWU+KCk7CisgICAgICAgIGZvciAoU3RyaW5nIGNvb2tpZSA6IGNvb2tpZXMpIHsKKyAgICAgICAgICAgIGlmIChjb29raWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIE5ld0Nvb2tpZSBuZXdDb29raWUgPSBIdHRwSGVhZGVyUmVhZGVyLnJlYWROZXdDb29raWUoY29va2llKTsKKyAgICAgICAgICAgICAgICByZXN1bHQucHV0KG5ld0Nvb2tpZS5nZXROYW1lKCksIG5ld0Nvb2tpZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGVudGl0eSB0YWcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBlbnRpdHkgdGFnLCBvdGhlcndpc2Uge0Bjb2RlIG51bGx9IGlmIG5vdCBwcmVzZW50LgorICAgICAqLworICAgIHB1YmxpYyBFbnRpdHlUYWcgZ2V0RW50aXR5VGFnKCkgeworICAgICAgICByZXR1cm4gc2luZ2xlSGVhZGVyKEh0dHBIZWFkZXJzLkVUQUcsIG5ldyBGdW5jdGlvbjxTdHJpbmcsIEVudGl0eVRhZz4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBFbnRpdHlUYWcgYXBwbHkoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVudGl0eVRhZy52YWx1ZU9mKHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbGFzdCBtb2RpZmllZCBkYXRlLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbGFzdCBtb2RpZmllZCBkYXRlLCBvdGhlcndpc2Uge0Bjb2RlIG51bGx9IGlmIG5vdCBwcmVzZW50LgorICAgICAqLworICAgIHB1YmxpYyBEYXRlIGdldExhc3RNb2RpZmllZCgpIHsKKyAgICAgICAgcmV0dXJuIHNpbmdsZUhlYWRlcihIdHRwSGVhZGVycy5MQVNUX01PRElGSUVELCBuZXcgRnVuY3Rpb248U3RyaW5nLCBEYXRlPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIERhdGUgYXBwbHkoU3RyaW5nIGlucHV0KSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEh0dHBIZWFkZXJSZWFkZXIucmVhZERhdGUoaW5wdXQpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9LCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsb2NhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGxvY2F0aW9uIFVSSSwgb3RoZXJ3aXNlIHtAY29kZSBudWxsfSBpZiBub3QgcHJlc2VudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVVJJIGdldExvY2F0aW9uKCkgeworICAgICAgICByZXR1cm4gc2luZ2xlSGVhZGVyKEh0dHBIZWFkZXJzLkxPQ0FUSU9OLCBuZXcgRnVuY3Rpb248U3RyaW5nLCBVUkk+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgVVJJIGFwcGx5KFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBVUkkuY3JlYXRlKHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbGlua3MgYXR0YWNoZWQgdG8gdGhlIG1lc3NhZ2UgYXMgaGVhZGVyLgorICAgICAqCisgICAgICogQHJldHVybiBsaW5rcywgbWF5IHJldHVybiBlbXB0eSB7QGxpbmsgamF2YS51dGlsLlNldH0gaWYgbm8gbGlua3MgYXJlIHByZXNlbnQuIE5ldmVyCisgICAgICogcmV0dXJucyB7QGNvZGUgbnVsbH0uCisgICAgICovCisgICAgcHVibGljIFNldDxMaW5rPiBnZXRMaW5rcygpIHsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGxpbmtzID0gdGhpcy5oZWFkZXJzLmdldChIdHRwSGVhZGVycy5MSU5LKTsKKyAgICAgICAgaWYgKGxpbmtzID09IG51bGwgfHwgbGlua3MuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTZXQ8TGluaz4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8TGluaz4obGlua3Muc2l6ZSgpKTsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgbGlua1N0cmluZzsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIGxpbmsgOiBsaW5rcykgeworICAgICAgICAgICAgICAgIGxpbmtTdHJpbmcgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIobGluaywgIjw+LCIsIHRydWUpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gbGlua09wZW4gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBuID0gc3QubmV4dFRva2VuKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChuLmVxdWFscygiPCIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5rT3BlbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobi5lcXVhbHMoIj4iKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGlua09wZW4gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghbGlua09wZW4gJiYgbi5lcXVhbHMoIiwiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChMaW5rLnZhbHVlT2YobGlua1N0cmluZy50b1N0cmluZygpLnRyaW0oKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgbGlua1N0cmluZyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gZG9uJ3QgYWRkIHRoZSAiLCIKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGxpbmtTdHJpbmcuYXBwZW5kKG4pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChsaW5rU3RyaW5nLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKExpbmsudmFsdWVPZihsaW5rU3RyaW5nLnRvU3RyaW5nKCkudHJpbSgpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbihIdHRwSGVhZGVycy5MSU5LLCBsaW5rcywgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiBsaW5rIGZvciByZWxhdGlvbiBleGlzdHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVsYXRpb24gbGluayByZWxhdGlvbi4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZm9yIHRoZSByZWxhdGlvbiBsaW5rIGV4aXN0cywge0Bjb2RlIGZhbHNlfQorICAgICAqIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNMaW5rKFN0cmluZyByZWxhdGlvbikgeworICAgICAgICBmb3IgKExpbmsgbGluayA6IGdldExpbmtzKCkpIHsKKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiByZWxhdGlvbnMgPSBMaW5rUHJvdmlkZXIuZ2V0TGlua1JlbGF0aW9ucyhsaW5rLmdldFJlbCgpKTsKKworICAgICAgICAgICAgaWYgKHJlbGF0aW9ucyAhPSBudWxsICYmIHJlbGF0aW9ucy5jb250YWlucyhyZWxhdGlvbikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsaW5rIGZvciB0aGUgcmVsYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVsYXRpb24gbGluayByZWxhdGlvbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBsaW5rIGZvciB0aGUgcmVsYXRpb24sIG90aGVyd2lzZSB7QGNvZGUgbnVsbH0gaWYgbm90IHByZXNlbnQuCisgICAgICovCisgICAgcHVibGljIExpbmsgZ2V0TGluayhTdHJpbmcgcmVsYXRpb24pIHsKKyAgICAgICAgZm9yIChMaW5rIGxpbmsgOiBnZXRMaW5rcygpKSB7CisgICAgICAgICAgICBMaXN0PFN0cmluZz4gcmVsYXRpb25zID0gTGlua1Byb3ZpZGVyLmdldExpbmtSZWxhdGlvbnMobGluay5nZXRSZWwoKSk7CisgICAgICAgICAgICBpZiAocmVsYXRpb25zICE9IG51bGwgJiYgcmVsYXRpb25zLmNvbnRhaW5zKHJlbGF0aW9uKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBsaW5rOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0aGF0IHJldHVybnMgYSB7QGxpbmsgamF2YXgud3MucnMuY29yZS5MaW5rLkJ1aWxkZXIgTGluay5CdWlsZGVyfQorICAgICAqIGZvciB0aGUgcmVsYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVsYXRpb24gbGluayByZWxhdGlvbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBsaW5rIGJ1aWxkZXIgZm9yIHRoZSByZWxhdGlvbiwgb3RoZXJ3aXNlIHtAY29kZSBudWxsfSBpZiBub3QKKyAgICAgKiBwcmVzZW50LgorICAgICAqLworICAgIHB1YmxpYyBMaW5rLkJ1aWxkZXIgZ2V0TGlua0J1aWxkZXIoU3RyaW5nIHJlbGF0aW9uKSB7CisgICAgICAgIExpbmsgbGluayA9IGdldExpbmsocmVsYXRpb24pOworICAgICAgICBpZiAobGluayA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBMaW5rLmZyb21MaW5rKGxpbmspOworICAgIH0KKworICAgIC8vIE1lc3NhZ2UgZW50aXR5CisKKyAgICAvKioKKyAgICAgKiBHZXQgY29udGV4dCBtZXNzYWdlIGJvZHkgd29ya2Vycy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gY29udGV4dCBtZXNzYWdlIGJvZHkgd29ya2Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVzc2FnZUJvZHlXb3JrZXJzIGdldFdvcmtlcnMoKSB7CisgICAgICAgIHJldHVybiB3b3JrZXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBjb250ZXh0IG1lc3NhZ2UgYm9keSB3b3JrZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIHdvcmtlcnMgY29udGV4dCBtZXNzYWdlIGJvZHkgd29ya2Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXb3JrZXJzKE1lc3NhZ2VCb2R5V29ya2VycyB3b3JrZXJzKSB7CisgICAgICAgIHRoaXMud29ya2VycyA9IHdvcmtlcnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgdGhlcmUgaXMgYSBub24tZW1wdHkgZW50aXR5IGlucHV0IHN0cmVhbSBpcyBhdmFpbGFibGUgaW4gdGhlCisgICAgICogbWVzc2FnZS4KKyAgICAgKiA8cC8+CisgICAgICogVGhlIG1ldGhvZCByZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGUgZW50aXR5IGlzIHByZXNlbnQsIHJldHVybnMKKyAgICAgKiB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZXJlIGlzIGFuIGVudGl0eSBwcmVzZW50IGluIHRoZSBtZXNzYWdlLAorICAgICAqIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGhhc0VudGl0eSgpIHsKKyAgICAgICAgZW50aXR5Q29udGVudC5lbnN1cmVOb3RDbG9zZWQoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuICFlbnRpdHlDb250ZW50LmlzRW1wdHkoKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBpbnB1dCBzdHJlYW0gaGFzIGJlZW4gY2xvc2VkLgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBlbnRpdHkgaW5wdXQgc3RyZWFtLgorICAgICAqCisgICAgICogQHJldHVybiBlbnRpdHkgaW5wdXQgc3RyZWFtLgorICAgICAqLworICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRFbnRpdHlTdHJlYW0oKSB7CisgICAgICAgIGVudGl0eUNvbnRlbnQuZW5zdXJlTm90Q2xvc2VkKCk7CisKKyAgICAgICAgcmV0dXJuIGVudGl0eUNvbnRlbnQuZ2V0V3JhcHBlZFN0cmVhbSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBhIG5ldyBlbnRpdHkgaW5wdXQgc3RyZWFtLgorICAgICAqCisgICAgICogQHBhcmFtIGlucHV0IG5ldyBlbnRpdHkgaW5wdXQgc3RyZWFtLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVudGl0eVN0cmVhbShJbnB1dFN0cmVhbSBpbnB1dCkgeworICAgICAgICB0aGlzLmVudGl0eUNvbnRlbnQuc2V0Q29udGVudChpbnB1dCwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgZW50aXR5IGZyb20gYSBjb250ZXh0IGVudGl0eSBpbnB1dCBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gPFQ+ICAgICAgICAgICAgICAgIGVudGl0eSBKYXZhIG9iamVjdCB0eXBlLgorICAgICAqIEBwYXJhbSByYXdUeXBlICAgICAgICAgICAgcmF3IEphdmEgZW50aXR5IHR5cGUuCisgICAgICogQHBhcmFtIHByb3BlcnRpZXNEZWxlZ2F0ZSByZXF1ZXN0LXNjb3BlZCBwcm9wZXJ0aWVzIGRlbGVnYXRlLgorICAgICAqIEByZXR1cm4gZW50aXR5IHJlYWQgZnJvbSBhIGNvbnRleHQgZW50aXR5IGlucHV0IHN0cmVhbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgPFQ+IFQgcmVhZEVudGl0eShDbGFzczxUPiByYXdUeXBlLCBQcm9wZXJ0aWVzRGVsZWdhdGUgcHJvcGVydGllc0RlbGVnYXRlKSB7CisgICAgICAgIHJldHVybiByZWFkRW50aXR5KHJhd1R5cGUsIHJhd1R5cGUsIEVNUFRZX0FOTk9UQVRJT05TLCBwcm9wZXJ0aWVzRGVsZWdhdGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgZW50aXR5IGZyb20gYSBjb250ZXh0IGVudGl0eSBpbnB1dCBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gPFQ+ICAgICAgICAgICAgICAgIGVudGl0eSBKYXZhIG9iamVjdCB0eXBlLgorICAgICAqIEBwYXJhbSByYXdUeXBlICAgICAgICAgICAgcmF3IEphdmEgZW50aXR5IHR5cGUuCisgICAgICogQHBhcmFtIGFubm90YXRpb25zICAgICAgICBlbnRpdHkgYW5ub3RhdGlvbnMuCisgICAgICogQHBhcmFtIHByb3BlcnRpZXNEZWxlZ2F0ZSByZXF1ZXN0LXNjb3BlZCBwcm9wZXJ0aWVzIGRlbGVnYXRlLgorICAgICAqIEByZXR1cm4gZW50aXR5IHJlYWQgZnJvbSBhIGNvbnRleHQgZW50aXR5IGlucHV0IHN0cmVhbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgPFQ+IFQgcmVhZEVudGl0eShDbGFzczxUPiByYXdUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIFByb3BlcnRpZXNEZWxlZ2F0ZSBwcm9wZXJ0aWVzRGVsZWdhdGUpIHsKKyAgICAgICAgcmV0dXJuIHJlYWRFbnRpdHkocmF3VHlwZSwgcmF3VHlwZSwgYW5ub3RhdGlvbnMsIHByb3BlcnRpZXNEZWxlZ2F0ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBlbnRpdHkgZnJvbSBhIGNvbnRleHQgZW50aXR5IGlucHV0IHN0cmVhbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSA8VD4gICAgICAgICAgICAgICAgZW50aXR5IEphdmEgb2JqZWN0IHR5cGUuCisgICAgICogQHBhcmFtIHJhd1R5cGUgICAgICAgICAgICByYXcgSmF2YSBlbnRpdHkgdHlwZS4KKyAgICAgKiBAcGFyYW0gdHlwZSAgICAgICAgICAgICAgIGdlbmVyaWMgSmF2YSBlbnRpdHkgdHlwZS4KKyAgICAgKiBAcGFyYW0gcHJvcGVydGllc0RlbGVnYXRlIHJlcXVlc3Qtc2NvcGVkIHByb3BlcnRpZXMgZGVsZWdhdGUuCisgICAgICogQHJldHVybiBlbnRpdHkgcmVhZCBmcm9tIGEgY29udGV4dCBlbnRpdHkgaW5wdXQgc3RyZWFtLgorICAgICAqLworICAgIHB1YmxpYyA8VD4gVCByZWFkRW50aXR5KENsYXNzPFQ+IHJhd1R5cGUsIFR5cGUgdHlwZSwgUHJvcGVydGllc0RlbGVnYXRlIHByb3BlcnRpZXNEZWxlZ2F0ZSkgeworICAgICAgICByZXR1cm4gcmVhZEVudGl0eShyYXdUeXBlLCB0eXBlLCBFTVBUWV9BTk5PVEFUSU9OUywgcHJvcGVydGllc0RlbGVnYXRlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGVudGl0eSBmcm9tIGEgY29udGV4dCBlbnRpdHkgaW5wdXQgc3RyZWFtLgorICAgICAqCisgICAgICogQHBhcmFtIDxUPiAgICAgICAgICAgICAgICBlbnRpdHkgSmF2YSBvYmplY3QgdHlwZS4KKyAgICAgKiBAcGFyYW0gcmF3VHlwZSAgICAgICAgICAgIHJhdyBKYXZhIGVudGl0eSB0eXBlLgorICAgICAqIEBwYXJhbSB0eXBlICAgICAgICAgICAgICAgZ2VuZXJpYyBKYXZhIGVudGl0eSB0eXBlLgorICAgICAqIEBwYXJhbSBhbm5vdGF0aW9ucyAgICAgICAgZW50aXR5IGFubm90YXRpb25zLgorICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzRGVsZWdhdGUgcmVxdWVzdC1zY29wZWQgcHJvcGVydGllcyBkZWxlZ2F0ZS4KKyAgICAgKiBAcmV0dXJuIGVudGl0eSByZWFkIGZyb20gYSBjb250ZXh0IGVudGl0eSBpbnB1dCBzdHJlYW0uCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIDxUPiBUIHJlYWRFbnRpdHkoQ2xhc3M8VD4gcmF3VHlwZSwgVHlwZSB0eXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIFByb3BlcnRpZXNEZWxlZ2F0ZSBwcm9wZXJ0aWVzRGVsZWdhdGUpIHsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBidWZmZXJlZCA9IGVudGl0eUNvbnRlbnQuaXNCdWZmZXJlZCgpOworICAgICAgICBpZiAoYnVmZmVyZWQpIHsKKyAgICAgICAgICAgIGVudGl0eUNvbnRlbnQucmVzZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGVudGl0eUNvbnRlbnQuZW5zdXJlTm90Q2xvc2VkKCk7CisKKyAgICAgICAgLy8gVE9ETzogcmV2aXNlIGlmIHdlIG5lZWQgdG8gcmUtaW50cm9kdWNlIHRoZSBjaGVjayBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucyBvciBvbmNlIG5vbi1ibG9ja2luZyBJL08gaXMgc3VwcG9ydGVkLgorICAgICAgICAvLyBUaGUgY29kZSBoYXMgYmVlbiBjb21tZW5kZWQgb3V0IGJlY2F1c2UgaW4gY2FzZSBvZiBzdHJlYW1pbmcgaW5wdXQgKGUuZy4gU1NFKSB0aGUgY2FsbCBtaWdodCBibG9jayB1bnRpbCBhIGZpcnN0CisgICAgICAgIC8vIGJ5dGUgaXMgYXZhaWxhYmxlLCB3aGljaCB3b3VsZCBtYWtlIGUuZy4gdGhlIFNTRSBFdmVudFNvdXJjZSBjb25zdHJ1Y3Rpb24gb3IgRXZlbnRTb3VyY2Uub3BlbigpIG1ldGhvZCB0byBibG9jaworICAgICAgICAvLyB1bnRpbCBhIGZpcnN0IGV2ZW50IGlzIHJlY2VpdmVkLCB3aGljaCBpcyB1bmRlc2lyYWJsZS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gICAgICAgIGlmIChlbnRpdHlDb250ZW50LmlzRW1wdHkoKSkgeworICAgICAgICAvLyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAvLyAgICAgICAgfQorCisgICAgICAgIGlmICh3b3JrZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSA9IGdldE1lZGlhVHlwZSgpOworICAgICAgICBtZWRpYVR5cGUgPSBtZWRpYVR5cGUgPT0gbnVsbCA/IE1lZGlhVHlwZS5BUFBMSUNBVElPTl9PQ1RFVF9TVFJFQU1fVFlQRSA6IG1lZGlhVHlwZTsKKworICAgICAgICBib29sZWFuIHNob3VsZENsb3NlID0gIWJ1ZmZlcmVkOworICAgICAgICB0cnkgeworICAgICAgICAgICAgVCB0ID0gKFQpIHdvcmtlcnMucmVhZEZyb20oCisgICAgICAgICAgICAgICAgICAgIHJhd1R5cGUsCisgICAgICAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgIGhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXNEZWxlZ2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgZW50aXR5Q29udGVudC5nZXRXcmFwcGVkU3RyZWFtKCksCisgICAgICAgICAgICAgICAgICAgIGVudGl0eUNvbnRlbnQuaGFzQ29udGVudCgpID8gZ2V0UmVhZGVySW50ZXJjZXB0b3JzKCkgOiBDb2xsZWN0aW9ucy48UmVhZGVySW50ZXJjZXB0b3I+ZW1wdHlMaXN0KCksCisgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZU5jZSk7CisKKyAgICAgICAgICAgIHNob3VsZENsb3NlID0gc2hvdWxkQ2xvc2UgJiYgISh0IGluc3RhbmNlb2YgQ2xvc2VhYmxlKSAmJiAhKHQgaW5zdGFuY2VvZiBTb3VyY2UpOworCisgICAgICAgICAgICByZXR1cm4gdDsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX1JFQURJTkdfRU5USVRZX0ZST01fSU5QVVRfU1RSRUFNKCksIGV4KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChzaG91bGRDbG9zZSkgeworICAgICAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIEpSRkNBRi0xMzQ0OiB0aGUgdW5kZXJseWluZyBzdHJlYW0gY2xvc2UoKSBpbXBsZW1lbnRhdGlvbiBtYXkgYmUgdGhyZWFkLXVuc2FmZQorICAgICAgICAgICAgICAgIC8vIGFuZCBhcyBzdWNoIHRoZSBjbG9zZSgpIG1heSByZXN1bHQgaW4gYW4gSU9FeGNlcHRpb24gYXQgdGhlIHNvY2tldCBpbnB1dCBzdHJlYW0gbGV2ZWwsCisgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGNsb3NlKCkgZ2V0cyBjYWxsZWQgYXQgb25jZSBmcm9tIG11bHRpcGxlIHRocmVhZHMgc29tZWhvdy4KKyAgICAgICAgICAgICAgICAvLyBXZSB3YW50IHRvIGlnbm9yZSB0aGVzZSBleGNlcHRpb25zIGluIHRoZSByZWFkRW50aXR5L2J1ZmZlckVudGl0eSBvcGVyYXRpb25zIHRob3VnaC4KKyAgICAgICAgICAgICAgICBSZWFkZXJXcml0ZXIuc2FmZWx5Q2xvc2UoZW50aXR5Q29udGVudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCdWZmZXIgdGhlIGVudGl0eSBzdHJlYW0gKGlmIG5vdCBlbXB0eSkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZW50aXR5IGlucHV0IHN0cmVhbSB3YXMgc3VjY2Vzc2Z1bGx5IGJ1ZmZlcmVkLgorICAgICAqIEB0aHJvd3MgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbiBpbiBjYXNlIG9mIGFuIElPIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGJ1ZmZlckVudGl0eSgpIHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgZW50aXR5Q29udGVudC5lbnN1cmVOb3RDbG9zZWQoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGVudGl0eUNvbnRlbnQuaXNCdWZmZXJlZCgpIHx8ICFlbnRpdHlDb250ZW50Lmhhc0NvbnRlbnQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0gPSBlbnRpdHlDb250ZW50LmdldFdyYXBwZWRTdHJlYW0oKTsKKyAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBSZWFkZXJXcml0ZXIud3JpdGVUbyhlbnRpdHlTdHJlYW0sIGJhb3MpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBKUkZDQUYtMTM0NDogdGhlIHVuZGVybHlpbmcgc3RyZWFtIGNsb3NlKCkgaW1wbGVtZW50YXRpb24gbWF5IGJlIHRocmVhZC11bnNhZmUKKyAgICAgICAgICAgICAgICAvLyBhbmQgYXMgc3VjaCB0aGUgY2xvc2UoKSBtYXkgcmVzdWx0IGluIGFuIElPRXhjZXB0aW9uIGF0IHRoZSBzb2NrZXQgaW5wdXQgc3RyZWFtIGxldmVsLAorICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBjbG9zZSgpIGdldHMgY2FsbGVkIGF0IG9uY2UgZnJvbSBtdWx0aXBsZSB0aHJlYWRzIHNvbWVob3cuCisgICAgICAgICAgICAgICAgLy8gV2Ugd2FudCB0byBpZ25vcmUgdGhlc2UgZXhjZXB0aW9ucyBpbiB0aGUgcmVhZEVudGl0eS9idWZmZXJFbnRpdHkgb3BlcmF0aW9ucyB0aG91Z2guCisgICAgICAgICAgICAgICAgUmVhZGVyV3JpdGVyLnNhZmVseUNsb3NlKGVudGl0eVN0cmVhbSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVudGl0eUNvbnRlbnQuc2V0Q29udGVudChuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYmFvcy50b0J5dGVBcnJheSgpKSwgdHJ1ZSk7CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuTUVTU0FHRV9DT05URU5UX0JVRkZFUklOR19GQUlMRUQoKSwgZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2VzIHRoZSB1bmRlcmx5aW5nIGNvbnRlbnQgc3RyZWFtLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICBlbnRpdHlDb250ZW50LmNsb3NlKHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCByZWFkZXIgaW50ZXJjZXB0b3JzIGJvdW5kIHRvIHRoaXMgY29udGV4dC4KKyAgICAgKiA8cD4KKyAgICAgKiBJbnRlcmNlcHRvcnMgd2lsbCBiZSB1c2VkIHdoZW4gb25lIG9mIHRoZSB7QGNvZGUgcmVhZEVudGl0eX0gbWV0aG9kcyBpcyBpbnZva2VkLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gcmVhZGVyIGludGVyY2VwdG9ycyBib3VuZCB0byB0aGlzIGNvbnRleHQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IEl0ZXJhYmxlPFJlYWRlckludGVyY2VwdG9yPiBnZXRSZWFkZXJJbnRlcmNlcHRvcnMoKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9JbnB1dFN0cmVhbVByb3ZpZGVyLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvSW5wdXRTdHJlYW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MTlkZGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvSW5wdXRTdHJlYW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCisvKioKKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKi8KK0BQcm9kdWNlcyh7ImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIsICIqLyoifSkKK0BDb25zdW1lcyh7ImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIsICIqLyoifSkKK0BTaW5nbGV0b24KK3B1YmxpYyBmaW5hbCBjbGFzcyBJbnB1dFN0cmVhbVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlUmVhZGVyV3JpdGVyUHJvdmlkZXI8SW5wdXRTdHJlYW0+IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiBJbnB1dFN0cmVhbS5jbGFzcyA9PSB0eXBlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJbnB1dFN0cmVhbSByZWFkRnJvbSgKKyAgICAgICAgICAgIENsYXNzPElucHV0U3RyZWFtPiB0eXBlLAorICAgICAgICAgICAgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbnNbXSwKKyAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICBJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBSZWFkZXJJbnRlcmNlcHRvckV4ZWN1dG9yLmNsb3NlYWJsZUlucHV0U3RyZWFtKGVudGl0eVN0cmVhbSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uc1tdLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiBJbnB1dFN0cmVhbS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGdldFNpemUoSW5wdXRTdHJlYW0gdCwgQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIGlmICh0IGluc3RhbmNlb2YgQnl0ZUFycmF5SW5wdXRTdHJlYW0pIHsKKyAgICAgICAgICAgIHJldHVybiAoKEJ5dGVBcnJheUlucHV0U3RyZWFtKSB0KS5hdmFpbGFibGUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oCisgICAgICAgICAgICBJbnB1dFN0cmVhbSB0LAorICAgICAgICAgICAgQ2xhc3M8Pz4gdHlwZSwKKyAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb25zW10sCisgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdyaXRlVG8odCwgZW50aXR5U3RyZWFtKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHQuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9JbnRlcmNlcHRvckV4ZWN1dG9yLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvSW50ZXJjZXB0b3JFeGVjdXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzYzZmZjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvSW50ZXJjZXB0b3JFeGVjdXRvci5qYXZhCkBAIC0wLDAgKzEsMjAwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuSW50ZXJjZXB0b3JDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SZWFkZXJJbnRlcmNlcHRvckNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yQ29udGV4dDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLlByb3BlcnRpZXNEZWxlZ2F0ZTsKKworLyoqCisgKiBBYnN0cmFjdCBjbGFzcyB3aXRoIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJbnRlcmNlcHRvckNvbnRleHR9IHdoaWNoIGlzIGNvbW1vbiBmb3Ige0BsaW5rIFJlYWRlckludGVyY2VwdG9yQ29udGV4dH0KKyAqIGFuZCB7QGxpbmsgV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0fSBpbXBsZW1lbnRhdGlvbnMuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCithYnN0cmFjdCBjbGFzcyBJbnRlcmNlcHRvckV4ZWN1dG9yPFQ+IGltcGxlbWVudHMgSW50ZXJjZXB0b3JDb250ZXh0LCBQcm9wZXJ0aWVzRGVsZWdhdGUgeworCisgICAgcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0aWVzRGVsZWdhdGUgcHJvcGVydGllc0RlbGVnYXRlOworICAgIHByaXZhdGUgQW5ub3RhdGlvbltdIGFubm90YXRpb25zOworICAgIHByaXZhdGUgQ2xhc3M8Pz4gdHlwZTsKKyAgICBwcml2YXRlIFR5cGUgZ2VuZXJpY1R5cGU7CisgICAgcHJpdmF0ZSBNZWRpYVR5cGUgbWVkaWFUeXBlOworCisgICAgcHJpdmF0ZSBmaW5hbCBUcmFjaW5nTG9nZ2VyIHRyYWNpbmdMb2dnZXI7CisgICAgcHJpdmF0ZSBJbnRlcmNlcHRvclRpbWVzdGFtcFBhaXI8VD4gbGFzdFRyYWNlZEludGVyY2VwdG9yOworCisgICAgLyoqCisgICAgICogSG9sZGVyIG9mIGludGVyY2VwdG9yIGluc3RhbmNlIGFuZCB0aW1lc3RhbXAgb2YgdGhlIGludGVyY2VwdG9yIGludm9jYXRpb24gKGluIG5zKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBJbnRlcmNlcHRvclRpbWVzdGFtcFBhaXI8VD4geworCisgICAgICAgIHByaXZhdGUgZmluYWwgVCBpbnRlcmNlcHRvcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIHRpbWVzdGFtcDsKKworICAgICAgICBwcml2YXRlIEludGVyY2VwdG9yVGltZXN0YW1wUGFpcihmaW5hbCBUIGludGVyY2VwdG9yLCBmaW5hbCBsb25nIHRpbWVzdGFtcCkgeworICAgICAgICAgICAgdGhpcy5pbnRlcmNlcHRvciA9IGludGVyY2VwdG9yOworICAgICAgICAgICAgdGhpcy50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFQgZ2V0SW50ZXJjZXB0b3IoKSB7CisgICAgICAgICAgICByZXR1cm4gaW50ZXJjZXB0b3I7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGxvbmcgZ2V0VGltZXN0YW1wKCkgeworICAgICAgICAgICAgcmV0dXJuIHRpbWVzdGFtcDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIGluaXRpYWxpemVzIGNvbW1vbiBwcm9wZXJ0aWVzIG9mIHRoaXMgYWJzdHJhY3QgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmF3VHlwZSAgICAgICAgICAgIHJhdyBKYXZhIGVudGl0eSB0eXBlLgorICAgICAqIEBwYXJhbSB0eXBlICAgICAgICAgICAgICAgZ2VuZXJpYyBKYXZhIGVudGl0eSB0eXBlLgorICAgICAqIEBwYXJhbSBhbm5vdGF0aW9ucyAgICAgICAgQW5ub3RhdGlvbnMgb24gdGhlIGZvcm1hbCBkZWNsYXJhdGlvbiBvZiB0aGUgcmVzb3VyY2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCBwYXJhbWV0ZXIgdGhhdCBpcyB0aGUgdGFyZ2V0IG9mIHRoZSBtZXNzYWdlIGJvZHkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb24uIFNlZSB7QGxpbmsgSW50ZXJjZXB0b3JDb250ZXh0I2dldEFubm90YXRpb25zKCl9LgorICAgICAqIEBwYXJhbSBtZWRpYVR5cGUgICAgICAgICAgTWVkaWFUeXBlIG9mIEhUVFAgZW50aXR5LiBTZWUge0BsaW5rIEludGVyY2VwdG9yQ29udGV4dCNnZXRNZWRpYVR5cGUoKX0uCisgICAgICogQHBhcmFtIHByb3BlcnRpZXNEZWxlZ2F0ZSByZXF1ZXN0LXNjb3BlZCBwcm9wZXJ0aWVzIGRlbGVnYXRlLgorICAgICAqLworICAgIHB1YmxpYyBJbnRlcmNlcHRvckV4ZWN1dG9yKGZpbmFsIENsYXNzPD8+IHJhd1R5cGUsIGZpbmFsIFR5cGUgdHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFByb3BlcnRpZXNEZWxlZ2F0ZSBwcm9wZXJ0aWVzRGVsZWdhdGUpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy50eXBlID0gcmF3VHlwZTsKKyAgICAgICAgdGhpcy5nZW5lcmljVHlwZSA9IHR5cGU7CisgICAgICAgIHRoaXMuYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uczsKKyAgICAgICAgdGhpcy5tZWRpYVR5cGUgPSBtZWRpYVR5cGU7CisgICAgICAgIHRoaXMucHJvcGVydGllc0RlbGVnYXRlID0gcHJvcGVydGllc0RlbGVnYXRlOworICAgICAgICB0aGlzLnRyYWNpbmdMb2dnZXIgPSBUcmFjaW5nTG9nZ2VyLmdldEluc3RhbmNlKHByb3BlcnRpZXNEZWxlZ2F0ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gcHJvcGVydGllc0RlbGVnYXRlLmdldFByb3BlcnR5KG5hbWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0UHJvcGVydHlOYW1lcygpIHsKKyAgICAgICAgcmV0dXJuIHByb3BlcnRpZXNEZWxlZ2F0ZS5nZXRQcm9wZXJ0eU5hbWVzKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIE9iamVjdCBvYmplY3QpIHsKKyAgICAgICAgcHJvcGVydGllc0RlbGVnYXRlLnNldFByb3BlcnR5KG5hbWUsIG9iamVjdCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVtb3ZlUHJvcGVydHkoZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcHJvcGVydGllc0RlbGVnYXRlLnJlbW92ZVByb3BlcnR5KG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0cmFjaW5nIGxvZ2dlciBpbnN0YW5jZSBjb25maWd1cmVkIGluIHZpYSBwcm9wZXJ0aWVzLgorICAgICAqCisgICAgICogQHJldHVybiB0cmFjaW5nIGxvZ2dlciBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgVHJhY2luZ0xvZ2dlciBnZXRUcmFjaW5nTG9nZ2VyKCkgeworICAgICAgICByZXR1cm4gdHJhY2luZ0xvZ2dlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmFjaW5nIHN1cHBvcnQgLSBsb2cgaW52b2NhdGlvbiBvZiBpbnRlcmNlcHRvciBCRUZPUkUgY29udGV4dC5wcm9jZWVkKCkgY2FsbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnRlcmNlcHRvciBpbnZva2VkIGludGVyY2VwdG9yCisgICAgICogQHBhcmFtIGV2ZW50ICAgICAgIGV2ZW50IHR5cGUgdG8gYmUgdGVzdGVkCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgdHJhY2VCZWZvcmUoZmluYWwgVCBpbnRlcmNlcHRvciwgZmluYWwgVHJhY2luZ0xvZ2dlci5FdmVudCBldmVudCkgeworICAgICAgICBpZiAodHJhY2luZ0xvZ2dlci5pc0xvZ0VuYWJsZWQoZXZlbnQpKSB7CisgICAgICAgICAgICBpZiAoKGxhc3RUcmFjZWRJbnRlcmNlcHRvciAhPSBudWxsKSAmJiAoaW50ZXJjZXB0b3IgIT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICB0cmFjaW5nTG9nZ2VyLmxvZ0R1cmF0aW9uKGV2ZW50LCBsYXN0VHJhY2VkSW50ZXJjZXB0b3IuZ2V0VGltZXN0YW1wKCksIGxhc3RUcmFjZWRJbnRlcmNlcHRvci5nZXRJbnRlcmNlcHRvcigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxhc3RUcmFjZWRJbnRlcmNlcHRvciA9IG5ldyBJbnRlcmNlcHRvclRpbWVzdGFtcFBhaXI8VD4oaW50ZXJjZXB0b3IsIFN5c3RlbS5uYW5vVGltZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRyYWNpbmcgc3VwcG9ydCAtIGxvZyBpbnZvY2F0aW9uIG9mIGludGVyY2VwdG9yIEFGVEVSIGNvbnRleHQucHJvY2VlZCgpIGNhbGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW50ZXJjZXB0b3IgaW52b2tlZCBpbnRlcmNlcHRvcgorICAgICAqIEBwYXJhbSBldmVudCAgICAgICBldmVudCB0eXBlIHRvIGJlIHRlc3RlZAorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHRyYWNlQWZ0ZXIoZmluYWwgVCBpbnRlcmNlcHRvciwgZmluYWwgVHJhY2luZ0xvZ2dlci5FdmVudCBldmVudCkgeworICAgICAgICBpZiAodHJhY2luZ0xvZ2dlci5pc0xvZ0VuYWJsZWQoZXZlbnQpKSB7CisgICAgICAgICAgICBpZiAoKGxhc3RUcmFjZWRJbnRlcmNlcHRvciAhPSBudWxsKSAmJiAobGFzdFRyYWNlZEludGVyY2VwdG9yLmdldEludGVyY2VwdG9yKCkgIT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICB0cmFjaW5nTG9nZ2VyLmxvZ0R1cmF0aW9uKGV2ZW50LCBsYXN0VHJhY2VkSW50ZXJjZXB0b3IuZ2V0VGltZXN0YW1wKCksIGludGVyY2VwdG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxhc3RUcmFjZWRJbnRlcmNlcHRvciA9IG5ldyBJbnRlcmNlcHRvclRpbWVzdGFtcFBhaXI8VD4oaW50ZXJjZXB0b3IsIFN5c3RlbS5uYW5vVGltZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENsZWFyIGxhc3QgdHJhY2VkIGludGVyY2VwdG9yIGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGNsZWFyTGFzdFRyYWNlZEludGVyY2VwdG9yKCkgeworICAgICAgICBsYXN0VHJhY2VkSW50ZXJjZXB0b3IgPSBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBbm5vdGF0aW9uW10gZ2V0QW5ub3RhdGlvbnMoKSB7CisgICAgICAgIHJldHVybiBhbm5vdGF0aW9uczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRBbm5vdGF0aW9ucyhmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgaWYgKGFubm90YXRpb25zID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiQW5ub3RhdGlvbnMgbXVzdCBub3QgYmUgbnVsbC4iKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmFubm90YXRpb25zID0gYW5ub3RhdGlvbnM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENsYXNzIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnR5cGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VHlwZShmaW5hbCBDbGFzcyB0eXBlKSB7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFR5cGUgZ2V0R2VuZXJpY1R5cGUoKSB7CisgICAgICAgIHJldHVybiBnZW5lcmljVHlwZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRHZW5lcmljVHlwZShmaW5hbCBUeXBlIGdlbmVyaWNUeXBlKSB7CisgICAgICAgIHRoaXMuZ2VuZXJpY1R5cGUgPSBnZW5lcmljVHlwZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWVkaWFUeXBlIGdldE1lZGlhVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIG1lZGlhVHlwZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRNZWRpYVR5cGUoZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICB0aGlzLm1lZGlhVHlwZSA9IG1lZGlhVHlwZTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9KZXJzZXlMaW5rLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvSmVyc2V5TGluay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhY2FjZGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvSmVyc2V5TGluay5qYXZhCkBAIC0wLDAgKzEsMjIyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTGluazsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS51cmkuVXJpVGVtcGxhdGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudXJpLmludGVybmFsLkplcnNleVVyaUJ1aWxkZXI7CisKKy8qKgorICogSmVyc2V5IGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBqYXZheC53cy5ycy5jb3JlLkxpbmsgSkFYLVJTIExpbmt9IGNvbnRyYWN0LgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBKZXJzZXlMaW5rIGV4dGVuZHMgamF2YXgud3MucnMuY29yZS5MaW5rIHsKKyAgICAvKioKKyAgICAgKiBVbmRlcmx5aW5nIGJ1aWxkZXIgZm9yIGxpbmsncyBVUkkuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBVUkkgdXJpOworICAgIC8qKgorICAgICAqIEEgbWFwIGZvciBhbGwgdGhlIGxpbmsgcGFyYW1ldGVycyBzdWNoIGFzICJyZWwiLCAidHlwZSIsIGV0Yy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zOworCisgICAgLyoqCisgICAgICogSmVyc2V5IGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBqYXZheC53cy5ycy5jb3JlLkxpbmsuQnVpbGRlciBKQVgtUlMgTGluay5CdWlsZGVyfSBjb250cmFjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXIgaW1wbGVtZW50cyBqYXZheC53cy5ycy5jb3JlLkxpbmsuQnVpbGRlciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBVbmRlcmx5aW5nIGJ1aWxkZXIgZm9yIGxpbmsncyBVUkkuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIFVyaUJ1aWxkZXIgdXJpQnVpbGRlciA9IG5ldyBKZXJzZXlVcmlCdWlsZGVyKCk7CisgICAgICAgIC8qKgorICAgICAgICAgKiBCYXNlIFVSSSBmb3IgcmVzb2x1dGlvbiBvZiBhIGxpbmsgVVJJIChpZiByZWxhdGl2ZSkuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIFVSSSBiYXNlVXJpID0gbnVsbDsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEEgbWFwIGZvciBhbGwgdGhlIGxpbmsgcGFyYW1ldGVycyBzdWNoIGFzICJyZWwiLCAidHlwZSIsIGV0Yy4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgbGluayhqYXZheC53cy5ycy5jb3JlLkxpbmsgbGluaykgeworICAgICAgICAgICAgdXJpQnVpbGRlci51cmkobGluay5nZXRVcmkoKSk7CisgICAgICAgICAgICBwYXJhbXMuY2xlYXIoKTsKKyAgICAgICAgICAgIHBhcmFtcy5wdXRBbGwobGluay5nZXRQYXJhbXMoKSk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnVpbGRlciBsaW5rKFN0cmluZyBsaW5rKSB7CisgICAgICAgICAgICBMaW5rUHJvdmlkZXIuaW5pdEJ1aWxkZXIodGhpcywgbGluayk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnVpbGRlciB1cmkoVVJJIHVyaSkgeworICAgICAgICAgICAgdGhpcy51cmlCdWlsZGVyID0gVXJpQnVpbGRlci5mcm9tVXJpKHVyaSk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnVpbGRlciB1cmkoU3RyaW5nIHVyaSkgeworICAgICAgICAgICAgdGhpcy51cmlCdWlsZGVyID0gVXJpQnVpbGRlci5mcm9tVXJpKHVyaSk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnVpbGRlciB1cmlCdWlsZGVyKFVyaUJ1aWxkZXIgdXJpQnVpbGRlcikgeworICAgICAgICAgICAgdGhpcy51cmlCdWlsZGVyID0gVXJpQnVpbGRlci5mcm9tVXJpKHVyaUJ1aWxkZXIudG9UZW1wbGF0ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBMaW5rLkJ1aWxkZXIgYmFzZVVyaShVUkkgdXJpKSB7CisgICAgICAgICAgICB0aGlzLmJhc2VVcmkgPSB1cmk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTGluay5CdWlsZGVyIGJhc2VVcmkoU3RyaW5nIHVyaSkgeworICAgICAgICAgICAgdGhpcy5iYXNlVXJpID0gVVJJLmNyZWF0ZSh1cmkpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgcmVsKFN0cmluZyByZWwpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZWxzID0gcGFyYW1zLmdldChSRUwpOworICAgICAgICAgICAgcGFyYW0oUkVMLCByZWxzID09IG51bGwgPyByZWwgOiByZWxzICsgIiAiICsgcmVsKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHRpdGxlKFN0cmluZyB0aXRsZSkgeworICAgICAgICAgICAgcGFyYW0oVElUTEUsIHRpdGxlKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHR5cGUoU3RyaW5nIHR5cGUpIHsKKyAgICAgICAgICAgIHBhcmFtKFRZUEUsIHR5cGUpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgcGFyYW0oU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCB8fCB2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTGluayBwYXJhbWV0ZXIgbmFtZSBvciB2YWx1ZSBpcyBudWxsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXJhbXMucHV0KG5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBKZXJzZXlMaW5rIGJ1aWxkKE9iamVjdC4uLiB2YWx1ZXMpIHsKKyAgICAgICAgICAgIGZpbmFsIFVSSSBsaW5rVXJpID0gcmVzb2x2ZUxpbmtVcmkodmFsdWVzKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSmVyc2V5TGluayhsaW5rVXJpLCBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAobmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KHBhcmFtcykpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTGluayBidWlsZFJlbGF0aXZpemVkKFVSSSB1cmksIE9iamVjdC4uLiB2YWx1ZXMpIHsKKyAgICAgICAgICAgIGZpbmFsIFVSSSBsaW5rVXJpID0gVXJpVGVtcGxhdGUucmVsYXRpdml6ZSh1cmksIHJlc29sdmVMaW5rVXJpKHZhbHVlcykpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBKZXJzZXlMaW5rKGxpbmtVcmksIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4ocGFyYW1zKSkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBVUkkgcmVzb2x2ZUxpbmtVcmkoT2JqZWN0W10gdmFsdWVzKSB7CisgICAgICAgICAgICBmaW5hbCBVUkkgbGlua1VyaSA9IHVyaUJ1aWxkZXIuYnVpbGQodmFsdWVzKTsKKyAgICAgICAgICAgIGlmIChiYXNlVXJpID09IG51bGwgfHwgbGlua1VyaS5pc0Fic29sdXRlKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVXJpVGVtcGxhdGUubm9ybWFsaXplKGxpbmtVcmkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIFVyaVRlbXBsYXRlLnJlc29sdmUoYmFzZVVyaSwgbGlua1VyaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIEplcnNleUxpbmsoVVJJIHVyaSwgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbXMpIHsKKyAgICAgICAgdGhpcy51cmkgPSB1cmk7CisgICAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBVUkkgZ2V0VXJpKCkgeworICAgICAgICByZXR1cm4gdXJpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBVcmlCdWlsZGVyIGdldFVyaUJ1aWxkZXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgSmVyc2V5VXJpQnVpbGRlcigpLnVyaSh1cmkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVsKCkgeworICAgICAgICByZXR1cm4gcGFyYW1zLmdldChSRUwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UmVscygpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlbHMgPSBwYXJhbXMuZ2V0KFJFTCk7CisgICAgICAgIHJldHVybiByZWxzID09IG51bGwgPyBDb2xsZWN0aW9ucy48U3RyaW5nPmVtcHR5TGlzdCgpIDogQXJyYXlzLmFzTGlzdChyZWxzLnNwbGl0KCIgKyIpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgeworICAgICAgICByZXR1cm4gcGFyYW1zLmdldChUSVRMRSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gcGFyYW1zLmdldChUWVBFKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRQYXJhbXMoKSB7CisgICAgICAgIHJldHVybiBwYXJhbXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIExpbmtQcm92aWRlci5zdHJpbmdmeSh0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7CisgICAgICAgIGlmICh0aGlzID09IG90aGVyKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAob3RoZXIgaW5zdGFuY2VvZiBMaW5rKSB7CisgICAgICAgICAgICBmaW5hbCBMaW5rIG90aGVyTGluayA9IChMaW5rKSBvdGhlcjsKKyAgICAgICAgICAgIHJldHVybiB1cmkuZXF1YWxzKG90aGVyTGluay5nZXRVcmkoKSkgJiYgcGFyYW1zLmVxdWFscyhvdGhlckxpbmsuZ2V0UGFyYW1zKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IDM7CisgICAgICAgIGhhc2ggPSA4OSAqIGhhc2ggKyAodGhpcy51cmkgIT0gbnVsbCA/IHRoaXMudXJpLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgaGFzaCA9IDg5ICogaGFzaCArICh0aGlzLnBhcmFtcyAhPSBudWxsID8gdGhpcy5wYXJhbXMuaGFzaENvZGUoKSA6IDApOworICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvTGFuZ3VhZ2VUYWcuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9MYW5ndWFnZVRhZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZTRkN2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvTGFuZ3VhZ2VUYWcuamF2YQpAQCAtMCwwICsxLDE4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsOworCitpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKKy8qKgorICogQSBsYW5ndWFnZSB0YWcuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIExhbmd1YWdlVGFnIHsKKworICAgIFN0cmluZyB0YWc7CisgICAgU3RyaW5nIHByaW1hcnlUYWc7CisgICAgU3RyaW5nIHN1YlRhZ3M7CisKKyAgICBwcm90ZWN0ZWQgTGFuZ3VhZ2VUYWcoKSB7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMYW5ndWFnZVRhZyB2YWx1ZU9mKGZpbmFsIFN0cmluZyBzKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgTGFuZ3VhZ2VUYWcgbHQgPSBuZXcgTGFuZ3VhZ2VUYWcoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbHQucGFyc2Uocyk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFBhcnNlRXhjZXB0aW9uIHBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgTGFuZ3VhZ2VUYWcoZmluYWwgU3RyaW5nIHByaW1hcnlUYWcsIGZpbmFsIFN0cmluZyBzdWJUYWdzKSB7CisgICAgICAgIGlmIChzdWJUYWdzICE9IG51bGwgJiYgc3ViVGFncy5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIHRoaXMudGFnID0gcHJpbWFyeVRhZyArICItIiArIHN1YlRhZ3M7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLnRhZyA9IHByaW1hcnlUYWc7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLnByaW1hcnlUYWcgPSBwcmltYXJ5VGFnOworCisgICAgICAgIHRoaXMuc3ViVGFncyA9IHN1YlRhZ3M7CisgICAgfQorCisgICAgcHVibGljIExhbmd1YWdlVGFnKGZpbmFsIFN0cmluZyBoZWFkZXIpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMoSHR0cEhlYWRlclJlYWRlci5uZXdJbnN0YW5jZShoZWFkZXIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGFuZ3VhZ2VUYWcoZmluYWwgSHR0cEhlYWRlclJlYWRlciByZWFkZXIpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFNraXAgYW55IHdoaXRlIHNwYWNlCisgICAgICAgIHJlYWRlci5oYXNOZXh0KCk7CisKKyAgICAgICAgdGFnID0gcmVhZGVyLm5leHRUb2tlbigpLnRvU3RyaW5nKCk7CisKKyAgICAgICAgaWYgKHJlYWRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigiSW52YWxpZCBMYW5ndWFnZSB0YWciLCByZWFkZXIuZ2V0SW5kZXgoKSk7CisgICAgICAgIH0KKworICAgICAgICBwYXJzZSh0YWcpOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzQ29tcGF0aWJsZShmaW5hbCBMb2NhbGUgdGFnKSB7CisgICAgICAgIGlmICh0aGlzLnRhZy5lcXVhbHMoIioiKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3ViVGFncyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gcHJpbWFyeVRhZy5lcXVhbHNJZ25vcmVDYXNlKHRhZy5nZXRMYW5ndWFnZSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBwcmltYXJ5VGFnLmVxdWFsc0lnbm9yZUNhc2UodGFnLmdldExhbmd1YWdlKCkpCisgICAgICAgICAgICAgICAgICAgICYmIHN1YlRhZ3MuZXF1YWxzSWdub3JlQ2FzZSh0YWcuZ2V0Q291bnRyeSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBMb2NhbGUgZ2V0QXNMb2NhbGUoKSB7CisgICAgICAgIHJldHVybiAoc3ViVGFncyA9PSBudWxsKQorICAgICAgICAgICAgICAgID8gbmV3IExvY2FsZShwcmltYXJ5VGFnKQorICAgICAgICAgICAgICAgIDogbmV3IExvY2FsZShwcmltYXJ5VGFnLCBzdWJUYWdzKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBwYXJzZShmaW5hbCBTdHJpbmcgbGFuZ3VhZ2VUYWcpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghaXNWYWxpZChsYW5ndWFnZVRhZykpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigiU3RyaW5nLCAiICsgbGFuZ3VhZ2VUYWcgKyAiLCBpcyBub3QgYSB2YWxpZCBsYW5ndWFnZSB0YWciLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGludCBpbmRleCA9IGxhbmd1YWdlVGFnLmluZGV4T2YoJy0nKTsKKyAgICAgICAgaWYgKGluZGV4ID09IC0xKSB7CisgICAgICAgICAgICBwcmltYXJ5VGFnID0gbGFuZ3VhZ2VUYWc7CisgICAgICAgICAgICBzdWJUYWdzID0gbnVsbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByaW1hcnlUYWcgPSBsYW5ndWFnZVRhZy5zdWJzdHJpbmcoMCwgaW5kZXgpOworICAgICAgICAgICAgc3ViVGFncyA9IGxhbmd1YWdlVGFnLnN1YnN0cmluZyhpbmRleCArIDEsIGxhbmd1YWdlVGFnLmxlbmd0aCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFZhbGlkYXRlIGlucHV0IHRhZyAoaGVhZGVyIHZhbHVlKSBhY2NvcmRpbmcgdG8gSFRUUCAxLjEgc3BlYyArIGFsbG93IHJlZ2lvbiBjb2RlIChudW1lcmljKSBpbnN0ZWFkIG9mIGNvdW50cnkgY29kZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YWcgYWNjZXB0LWxhbmd1YWdlIGhlYWRlciB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgdmFsaWQgbGFuZ3VhZ2UgdGFnLCB7QGNvZGUgZmFsc2V9IGluc3RlYWQuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzVmFsaWQoZmluYWwgU3RyaW5nIHRhZykgeworICAgICAgICBpbnQgYWxwaGFudW1Db3VudCA9IDA7CisgICAgICAgIGludCBkYXNoID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YWcubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgZmluYWwgY2hhciBjID0gdGFnLmNoYXJBdChpKTsKKyAgICAgICAgICAgIGlmIChjID09ICctJykgeworICAgICAgICAgICAgICAgIGlmIChhbHBoYW51bUNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhbHBoYW51bUNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICBkYXNoKys7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCgnQScgPD0gYyAmJiBjIDw9ICdaJykgfHwgKCdhJyA8PSBjICYmIGMgPD0gJ3onKSB8fCAoZGFzaCA+IDAgJiYgJzAnIDw9IGMgJiYgYyA8PSAnOScpKSB7CisgICAgICAgICAgICAgICAgYWxwaGFudW1Db3VudCsrOworICAgICAgICAgICAgICAgIGlmIChhbHBoYW51bUNvdW50ID4gOCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChhbHBoYW51bUNvdW50ICE9IDApOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0VGFnKCkgeworICAgICAgICByZXR1cm4gdGFnOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0UHJpbWFyeVRhZygpIHsKKyAgICAgICAgcmV0dXJuIHByaW1hcnlUYWc7CisgICAgfQorCisgICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRTdWJUYWdzKCkgeworICAgICAgICByZXR1cm4gc3ViVGFnczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKHRoaXMgPT0gbykgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIExhbmd1YWdlVGFnKSB8fCBvLmdldENsYXNzKCkgIT0gdGhpcy5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBMYW5ndWFnZVRhZyB0aGF0ID0gKExhbmd1YWdlVGFnKSBvOworCisgICAgICAgIGlmIChwcmltYXJ5VGFnICE9IG51bGwgPyAhcHJpbWFyeVRhZy5lcXVhbHModGhhdC5wcmltYXJ5VGFnKSA6IHRoYXQucHJpbWFyeVRhZyAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN1YlRhZ3MgIT0gbnVsbCA/ICFzdWJUYWdzLmVxdWFscyh0aGF0LnN1YlRhZ3MpIDogdGhhdC5zdWJUYWdzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gISh0YWcgIT0gbnVsbCA/ICF0YWcuZXF1YWxzKHRoYXQudGFnKSA6IHRoYXQudGFnICE9IG51bGwpOworCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IHRhZyAhPSBudWxsID8gdGFnLmhhc2hDb2RlKCkgOiAwOworICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIChwcmltYXJ5VGFnICE9IG51bGwgPyBwcmltYXJ5VGFnLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyAoc3ViVGFncyAhPSBudWxsID8gc3ViVGFncy5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIHByaW1hcnlUYWcgKyAoc3ViVGFncyA9PSBudWxsID8gIiIgOiBzdWJUYWdzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvTGlua1Byb3ZpZGVyLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvTGlua1Byb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY0NTM0OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9MaW5rUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5MaW5rOworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuVG9rZW5pemVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5IZWFkZXJEZWxlZ2F0ZVByb3ZpZGVyOworCitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuVXRpbHMudGhyb3dJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25JZk51bGw7CisKKy8qKgorICogUHJvdmlkZXIgZm9yIExpbmsgSGVhZGVycy4KKyAqCisgKiBAYXV0aG9yIFNhbnRpYWdvIFBlcmljYXMtR2VlcnRzZW4KKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTaW5nbGV0b24KK3B1YmxpYyBjbGFzcyBMaW5rUHJvdmlkZXIgaW1wbGVtZW50cyBIZWFkZXJEZWxlZ2F0ZVByb3ZpZGVyPExpbms+IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKExpbmtQcm92aWRlci5jbGFzcy5nZXROYW1lKCkpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoZmluYWwgQ2xhc3M8Pz4gdHlwZSkgeworICAgICAgICByZXR1cm4gTGluay5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaW5rIGZyb21TdHJpbmcoZmluYWwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGluaXRCdWlsZGVyKG5ldyBKZXJzZXlMaW5rLkJ1aWxkZXIoKSwgdmFsdWUpLmJ1aWxkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSBhbiBleGlzdGluZyBKZXJzZXkgbGluayBidWlsZGVyIHdpdGggdGhlIGxpbmsgZGF0YSBwcm92aWRlZCBpbiBhIGZvcm0gb2YgYSBzdHJpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGIgICAgbGluayBidWlsZGVyIHRvIGJlIGluaXRpYWxpemVkLgorICAgICAqIEBwYXJhbSB2YWx1ZSBsaW5rIGRhdGEgYXMgYSBzdHJpbmcuCisgICAgICogQHJldHVybiBpbml0aWFsaXplZCBsaW5rIGJ1aWxkZXIuCisgICAgICovCisgICAgc3RhdGljIEplcnNleUxpbmsuQnVpbGRlciBpbml0QnVpbGRlcihKZXJzZXlMaW5rLkJ1aWxkZXIgbGIsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0aHJvd0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbklmTnVsbCh2YWx1ZSwgTG9jYWxpemF0aW9uTWVzc2FnZXMuTElOS19JU19OVUxMKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50cmltKCk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGFyYW1zOworICAgICAgICAgICAgaWYgKHZhbHVlLnN0YXJ0c1dpdGgoIjwiKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBndEluZGV4ID0gdmFsdWUuaW5kZXhPZignPicpOworICAgICAgICAgICAgICAgIGlmIChndEluZGV4ICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGxiLnVyaSh2YWx1ZS5zdWJzdHJpbmcoMSwgZ3RJbmRleCkudHJpbSgpKTsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0gdmFsdWUuc3Vic3RyaW5nKGd0SW5kZXggKyAxKS50cmltKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTWlzc2luZyB0b2tlbiA+IGluICIgKyB2YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNaXNzaW5nIHN0YXJ0aW5nIHRva2VuIDwgaW4gIiArIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgU3RyaW5nVG9rZW5pemVyIHN0ID0gbmV3IFN0cmluZ1Rva2VuaXplcihwYXJhbXMsICI7PVwiIiwgdHJ1ZSk7CisgICAgICAgICAgICB3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICAgICAgY2hlY2tUb2tlbihzdCwgIjsiKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbiA9IHN0Lm5leHRUb2tlbigpLnRyaW0oKTsKKyAgICAgICAgICAgICAgICBjaGVja1Rva2VuKHN0LCAiPSIpOworCisgICAgICAgICAgICAgICAgU3RyaW5nIHYgPSBuZXh0Tm9uRW1wdHlUb2tlbihzdCk7CisgICAgICAgICAgICAgICAgaWYgKHYuZXF1YWxzKCJcIiIpKSB7CisgICAgICAgICAgICAgICAgICAgIHYgPSBzdC5uZXh0VG9rZW4oKTsKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tUb2tlbihzdCwgIlwiIik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbGIucGFyYW0obiwgdik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICBpZiAoTE9HR0VSLmlzTG9nZ2FibGUoTGV2ZWwuRklORVIpKSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5GSU5FUiwgIkVycm9yIHBhcnNpbmcgbGluayB2YWx1ZSAnIiArIHZhbHVlICsgIiciLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxiID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAobGIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5hYmxlIHRvIHBhcnNlIGxpbmsgIiArIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGI7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG5leHROb25FbXB0eVRva2VuKGZpbmFsIFN0cmluZ1Rva2VuaXplciBzdCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyB0b2tlbjsKKyAgICAgICAgZG8geworICAgICAgICAgICAgdG9rZW4gPSBzdC5uZXh0VG9rZW4oKS50cmltKCk7CisgICAgICAgIH0gd2hpbGUgKHRva2VuLmxlbmd0aCgpID09IDApOworCisgICAgICAgIHJldHVybiB0b2tlbjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrVG9rZW4oZmluYWwgU3RyaW5nVG9rZW5pemVyIHN0LCBmaW5hbCBTdHJpbmcgZXhwZWN0ZWQpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgdG9rZW47CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHRva2VuID0gc3QubmV4dFRva2VuKCkudHJpbSgpOworICAgICAgICB9IHdoaWxlICh0b2tlbi5sZW5ndGgoKSA9PSAwKTsKKyAgICAgICAgaWYgKCF0b2tlbi5lcXVhbHMoZXhwZWN0ZWQpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJFeHBlY3RlZCB0b2tlbiAiICsgZXhwZWN0ZWQgKyAiIGJ1dCBmb3VuZCAiICsgdG9rZW4pOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZyhmaW5hbCBMaW5rIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBzdHJpbmdmeSh2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCB7QGxpbmsgTGlua30gaW5zdGFuY2UgdG8gYSBzdHJpbmcgdmVyc2lvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSBsaW5rIGluc3RhbmNlIHRvIGJlIHN0cmluZ2lmaWVkLgorICAgICAqIEByZXR1cm4gc3RyaW5nIHZlcnNpb24gb2YgYSBnaXZlbiBsaW5rIGluc3RhbmNlLgorICAgICAqLworICAgIHN0YXRpYyBTdHJpbmcgc3RyaW5nZnkoZmluYWwgTGluayB2YWx1ZSkgeworICAgICAgICB0aHJvd0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbklmTnVsbCh2YWx1ZSwgTG9jYWxpemF0aW9uTWVzc2FnZXMuTElOS19JU19OVUxMKCkpOworCisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gbWFwID0gdmFsdWUuZ2V0UGFyYW1zKCk7CisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBzYi5hcHBlbmQoJzwnKS5hcHBlbmQodmFsdWUuZ2V0VXJpKCkpLmFwcGVuZCgnPicpOworCisgICAgICAgIGZvciAoZmluYWwgTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA6IG1hcC5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIjsgIikuYXBwZW5kKGVudHJ5LmdldEtleSgpKS5hcHBlbmQoIj1cIiIpLmFwcGVuZChlbnRyeS5nZXRWYWx1ZSgpKS5hcHBlbmQoIlwiIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXh0cmFjdCB0aGUgbGlzdCBvZiBsaW5rIHJlbGF0aW9ucyBmcm9tIHRoZSBzdHJpbmcgdmFsdWUgb2YgYSB7QGxpbmsgTGluayNSRUx9IGF0dHJpYnV0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWwgc3RyaW5nIHZhbHVlIG9mIHRoZSBsaW5rIHtAY29kZSAicmVsIn0gYXR0cmlidXRlLgorICAgICAqIEByZXR1cm4gbGlzdCBvZiByZWxhdGlvbnMgaW4gdGhlIHtAY29kZSAicmVsIn0gYXR0cmlidXRlIHN0cmluZyB2YWx1ZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldExpbmtSZWxhdGlvbnMoZmluYWwgU3RyaW5nIHJlbCkgeworICAgICAgICByZXR1cm4gKHJlbCA9PSBudWxsKSA/IG51bGwgOiBBcnJheXMuYXNMaXN0KFRva2VuaXplci50b2tlbml6ZShyZWwsICJcIiAiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL0xvY2FsZVByb3ZpZGVyLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvTG9jYWxlUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmUxZDFiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL0xvY2FsZVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsOworCitpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLkhlYWRlckRlbGVnYXRlUHJvdmlkZXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5VdGlscy50aHJvd0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbklmTnVsbDsKKworLyoqCisgKiB7QGNvZGUgTG9jYWxlfSB7QGxpbmsgSGVhZGVyRGVsZWdhdGVQcm92aWRlciBoZWFkZXIgZGVsZWdhdGUgcHJvdmlkZXJ9LgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTaW5nbGV0b24KK3B1YmxpYyBjbGFzcyBMb2NhbGVQcm92aWRlciBpbXBsZW1lbnRzIEhlYWRlckRlbGVnYXRlUHJvdmlkZXI8TG9jYWxlPiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhmaW5hbCBDbGFzczw/PiB0eXBlKSB7CisgICAgICAgIHJldHVybiBMb2NhbGUuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0eXBlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGZpbmFsIExvY2FsZSBoZWFkZXIpIHsKKworICAgICAgICB0aHJvd0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbklmTnVsbChoZWFkZXIsIExvY2FsaXphdGlvbk1lc3NhZ2VzLkxPQ0FMRV9JU19OVUxMKCkpOworCisgICAgICAgIGlmIChoZWFkZXIuZ2V0Q291bnRyeSgpLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBoZWFkZXIuZ2V0TGFuZ3VhZ2UoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBoZWFkZXIuZ2V0TGFuZ3VhZ2UoKSArICctJyArIGhlYWRlci5nZXRDb3VudHJ5KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTG9jYWxlIGZyb21TdHJpbmcoZmluYWwgU3RyaW5nIGhlYWRlcikgeworCisgICAgICAgIHRocm93SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uSWZOdWxsKGhlYWRlciwgTG9jYWxpemF0aW9uTWVzc2FnZXMuTE9DQUxFX0lTX05VTEwoKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIExhbmd1YWdlVGFnIGx0ID0gbmV3IExhbmd1YWdlVGFnKGhlYWRlcik7CisgICAgICAgICAgICByZXR1cm4gbHQuZ2V0QXNMb2NhbGUoKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgUGFyc2VFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJFcnJvciBwYXJzaW5nIGRhdGUgJyIgKyBoZWFkZXIgKyAiJyIsIGV4KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9NYXRjaGluZ0VudGl0eVRhZy5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL01hdGNoaW5nRW50aXR5VGFnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBlYjA5NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9NYXRjaGluZ0VudGl0eVRhZy5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRW50aXR5VGFnOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CisKKy8qKgorICogQSBtYXRjaGluZyBlbnRpdHkgdGFnLgorICogPHA+CisgKiBOb3RlIHRoYXQgdGhpcyB0eXBlIGFuZCBpdCdzIHN1cGVyIHR5cGUgY2Fubm90IGJlIHVzZWQgdG8gY3JlYXRlIHJlcXVlc3QKKyAqIGhlYWRlciB2YWx1ZXMgZm9yIHtAY29kZSBJZi1NYXRjaH0gYW5kIHtAY29kZSBJZi1Ob25lLU1hdGNofQorICogb2YgdGhlIGZvcm0ge0Bjb2RlIElmLU1hdGNoOiAqfSBvciB7QGNvZGUgSWYtTm9uZS1NYXRjaDogKn0gYXMKKyAqIHtAY29kZSAqfSBpcyBub3QgYSB2YWxpZCBlbnRpdHkgdGFnLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBNYXRjaGluZ0VudGl0eVRhZyBleHRlbmRzIEVudGl0eVRhZyB7CisKKyAgICAvKioKKyAgICAgKiBBbiBlbXB0eSBzZXQgdGhhdCBjb3JyZXNwb25kcyB0byB7QGNvZGUgSWYtTWF0Y2g6ICp9IG9yIHtAY29kZSBJZi1Ob25lLU1hdGNoOiAqfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNldDxNYXRjaGluZ0VudGl0eVRhZz4gQU5ZX01BVENIID0gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgc3Ryb25nbHkgdmFsaWRhdGluZyBlbnRpdHkgdGFnLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIEVUYWcgaGVhZGVyIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBNYXRjaGluZ0VudGl0eVRhZyhTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgc3VwZXIodmFsdWUsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IG1hdGNoaW5nIGVudGl0eSB0YWcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgRVRhZyBoZWFkZXIgdmFsdWUuCisgICAgICogQHBhcmFtIHdlYWsgc2hvdWxkIGJlIHNldCB0byBmYWxzZSwgaWYgc3Ryb25nIHZhbGlkYXRpb24gaXMgcmVxdWlyZWQsCisgICAgICogICAgICAgICAgICBvdGhlcndpc2Ugc2hvdWxkIGJlIHNldCB0byB0cnVlLgorICAgICAqLworICAgIHB1YmxpYyBNYXRjaGluZ0VudGl0eVRhZyhTdHJpbmcgdmFsdWUsIGJvb2xlYW4gd2VhaykgeworICAgICAgICBzdXBlcih2YWx1ZSwgd2Vhayk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyBtYXRjaGluZyBlbnRpdHkgdGFnIG91dCBvZiBwcm92aWRlZCBoZWFkZXIgcmVhZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHJlYWRlciBIVFRQIGhlYWRlciBjb250ZW50IHJlYWRlci4KKyAgICAgKiBAcmV0dXJuIGEgbmV3IG1hdGNoaW5nIGVudGl0eSB0YWcuCisgICAgICogQHRocm93cyBQYXJzZUV4Y2VwdGlvbiBpbiBjYXNlIHRoZSBoZWFkZXIgY291bGQgbm90IGJlIHBhcnNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE1hdGNoaW5nRW50aXR5VGFnIHZhbHVlT2YoSHR0cEhlYWRlclJlYWRlciByZWFkZXIpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENoYXJTZXF1ZW5jZSB0YWdTdHJpbmcgPSByZWFkZXIuZ2V0UmVtYWluZGVyKCk7CisKKyAgICAgICAgSHR0cEhlYWRlclJlYWRlci5FdmVudCBlID0gcmVhZGVyLm5leHQoZmFsc2UpOworICAgICAgICBpZiAoZSA9PSBIdHRwSGVhZGVyUmVhZGVyLkV2ZW50LlF1b3RlZFN0cmluZykgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBNYXRjaGluZ0VudGl0eVRhZyhyZWFkZXIuZ2V0RXZlbnRWYWx1ZSgpLnRvU3RyaW5nKCkpOworICAgICAgICB9IGVsc2UgaWYgKGUgPT0gSHR0cEhlYWRlclJlYWRlci5FdmVudC5Ub2tlbikgeworICAgICAgICAgICAgQ2hhclNlcXVlbmNlIGV2ID0gcmVhZGVyLmdldEV2ZW50VmFsdWUoKTsKKyAgICAgICAgICAgIGlmIChldiAhPSBudWxsICYmIGV2Lmxlbmd0aCgpID09IDEgJiYgJ1cnID09IGV2LmNoYXJBdCgwKSkgeworICAgICAgICAgICAgICAgIHJlYWRlci5uZXh0U2VwYXJhdG9yKCcvJyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNYXRjaGluZ0VudGl0eVRhZyhyZWFkZXIubmV4dFF1b3RlZFN0cmluZygpLnRvU3RyaW5nKCksIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX1BBUlNJTkdfRU5USVRZX1RBRyh0YWdTdHJpbmcpLCByZWFkZXIuZ2V0SW5kZXgoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL01lZGlhVHlwZVByb3ZpZGVyLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvTWVkaWFUeXBlUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzYyM2UyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL01lZGlhVHlwZVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLkhlYWRlckRlbGVnYXRlUHJvdmlkZXI7CitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuVXRpbHMudGhyb3dJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25JZk51bGw7CisKKy8qKgorICogSGVhZGVyIGRlbGVnYXRlIHByb3ZpZGVyIGZvciBNZWRpYVR5cGUuCisgKgorICogQGF1dGhvciBNYXJjIEhhZGxleQorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitAU2luZ2xldG9uCitwdWJsaWMgY2xhc3MgTWVkaWFUeXBlUHJvdmlkZXIgaW1wbGVtZW50cyBIZWFkZXJEZWxlZ2F0ZVByb3ZpZGVyPE1lZGlhVHlwZT4geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FRElBX1RZUEVfSVNfTlVMTCA9IExvY2FsaXphdGlvbk1lc3NhZ2VzLk1FRElBX1RZUEVfSVNfTlVMTCgpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoQ2xhc3M8Pz4gdHlwZSkgeworICAgICAgICByZXR1cm4gTWVkaWFUeXBlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZyhNZWRpYVR5cGUgaGVhZGVyKSB7CisKKyAgICAgICAgdGhyb3dJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25JZk51bGwoaGVhZGVyLCBNRURJQV9UWVBFX0lTX05VTEwpOworCisgICAgICAgIFN0cmluZ0J1aWxkZXIgYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGIuYXBwZW5kKGhlYWRlci5nZXRUeXBlKCkpLmFwcGVuZCgnLycpLmFwcGVuZChoZWFkZXIuZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGUgOiBoZWFkZXIuZ2V0UGFyYW1ldGVycygpLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIGIuYXBwZW5kKCI7IikuYXBwZW5kKGUuZ2V0S2V5KCkpLmFwcGVuZCgnPScpOworICAgICAgICAgICAgU3RyaW5nQnVpbGRlclV0aWxzLmFwcGVuZFF1b3RlZElmTm9uVG9rZW4oYiwgZS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYi50b1N0cmluZygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNZWRpYVR5cGUgZnJvbVN0cmluZyhTdHJpbmcgaGVhZGVyKSB7CisKKyAgICAgICAgdGhyb3dJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25JZk51bGwoaGVhZGVyLCBNRURJQV9UWVBFX0lTX05VTEwpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWVPZihIdHRwSGVhZGVyUmVhZGVyLm5ld0luc3RhbmNlKGhlYWRlcikpOworICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIkVycm9yIHBhcnNpbmcgbWVkaWEgdHlwZSAnIiArIGhlYWRlciArICInIiwgZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IHtAbGluayBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZX0gaW5zdGFuY2UgZnJvbSBhIGhlYWRlciByZWFkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVhZGVyIGhlYWRlciByZWFkZXIuCisgICAgICogQHJldHVybiBuZXcge0Bjb2RlIE1lZGlhVHlwZX0gaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIFBhcnNlRXhjZXB0aW9uIGluIGNhc2Ugb2YgYSBoZWFkZXIgcGFyc2luZyBlcnJvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE1lZGlhVHlwZSB2YWx1ZU9mKEh0dHBIZWFkZXJSZWFkZXIgcmVhZGVyKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICAvLyBTa2lwIGFueSB3aGl0ZSBzcGFjZQorICAgICAgICByZWFkZXIuaGFzTmV4dCgpOworCisgICAgICAgIC8vIEdldCB0aGUgdHlwZQorICAgICAgICBmaW5hbCBTdHJpbmcgdHlwZSA9IHJlYWRlci5uZXh0VG9rZW4oKS50b1N0cmluZygpOworICAgICAgICByZWFkZXIubmV4dFNlcGFyYXRvcignLycpOworICAgICAgICAvLyBHZXQgdGhlIHN1YnR5cGUKKyAgICAgICAgZmluYWwgU3RyaW5nIHN1YlR5cGUgPSByZWFkZXIubmV4dFRva2VuKCkudG9TdHJpbmcoKTsKKworICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtcyA9IG51bGw7CisKKyAgICAgICAgaWYgKHJlYWRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIHBhcmFtcyA9IEh0dHBIZWFkZXJSZWFkZXIucmVhZFBhcmFtZXRlcnMocmVhZGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgTWVkaWFUeXBlKHR5cGUsIHN1YlR5cGUsIHBhcmFtcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL01lZGlhVHlwZXMuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9NZWRpYVR5cGVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU4YzJkZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9NZWRpYVR5cGVzLmphdmEKQEAgLTAsMCArMSwzOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKKy8qKgorICogQ29tbW9uIG1lZGlhIHR5cGVzIGFuZCBmdW5jdGlvbmFsaXR5LgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBNZWRpYVR5cGVzIHsKKworICAgIC8qKgorICAgICAqIFdBREwgTWVkaWEgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE1lZGlhVHlwZSBXQURMX1RZUEUgPSBNZWRpYVR5cGUudmFsdWVPZigiYXBwbGljYXRpb24vdm5kLnN1bi53YWRsK3htbCIpOworCisgICAgLyoqCisgICAgICogQSBjb21wYXJhdG9yIGZvciBtZWRpYSB0eXBlcywgdGhhdCBpbXBsZW1lbnRzIHRoZSAicGFydGlhbCBvcmRlciIgZGVmaW5lZCBpbiB0aGUgcmVzb3VyY2UgbWF0Y2hpbmcgYWxnb3JpdGhtCisgICAgICogc2VjdGlvbiBvZiB0aGUgSkFYLVJTIHNwZWNpZmljYXRpb24sIGV4Y2VwdCB0aGF0IHRoaXMgY29tcGFyYXRvciBpcyAiaW52ZXJ0ZWQiIHNvIHRoYXQgaXQgYWxsb3dzIGZvciBuYXR1cmFsCisgICAgICogc29ydGluZyBpbiBKYXZhIGNvbGxlY3Rpb25zLCB3aGVyZSAibG93ZXIiIHZhbHVlcyBhcmUgcHV0IHRvIHRoZSBmcm9udCBvZiBhIGNvbGxlY3Rpb24uCisgICAgICoKKyAgICAgKiBJT1csIHdoZW4gdXNlZCB0byBzb3J0IGEgY29sbGVjdGlvbiwgdGhlIHJlc3VsdGluZyBjb2xsZWN0aW9uIGNhbiBiZSBpdGVyYXRlZCBpbiBhIHdheSB0aGF0IHRoZSBtb3JlIHNwZWNpZmljCisgICAgICogbWVkaWEgdHlwZXMgYXJlIHByZWZlcnJlZCBvdmVyIHRoZSBsZXNzIHNwZWNpZmljIG9uZXM6CisgICAgICoKKyAgICAgKiA8cHJlPgorICAgICAqICAgbS9uICZsdDsgbS8mIzQyOyAmbHQ7ICYjNDI7LyYjNDI7PC9wcmU+CisgICAgICoKKyAgICAgKiBUaGUgYWN0dWFsIG1lZGlhIHR5cGUgdmFsdWVzIGFyZSBpZ25vcmVkLCBpLmUuIHRoZSBkaWZmZXJlbnQgbWVkaWEgdHlwZXMgYXJlIGNvbnNpZGVyZWQgZXF1YWwgaWYgdGhleSBhcmUKKyAgICAgKiBjb21wYXJhYmx5IHNwZWNpZmljOgorICAgICAqCisgICAgICogPHByZT4KKyAgICAgKiAgIGNvbXBhcmUobS9uLCB4L3kpID09IDAKKyAgICAgKiAgIGNvbXBhcmUobS8mIzQyOywgeC8mIzQyOykgPT0gMDwvcHJlPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxNZWRpYVR5cGU+IFBBUlRJQUxfT1JERVJfQ09NUEFSQVRPUiA9IG5ldyBDb21wYXJhdG9yPE1lZGlhVHlwZT4oKSB7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgcmFuayhmaW5hbCBNZWRpYVR5cGUgdHlwZSkgeworICAgICAgICAgICAgLy8gIm0vbiIgPSAwOyAibS8qIiA9IDE7ICIqLyoiID0gMzsgLi4uYWxzbyAiKi9uIiA9IDIsIGJ1dCB0aGF0J3MganVzdCBub25zZW5zZS4uLgorICAgICAgICAgICAgcmV0dXJuICgodHlwZS5pc1dpbGRjYXJkVHlwZSgpID8gMSA6IDApIDw8IDEpIHwgKHR5cGUuaXNXaWxkY2FyZFN1YnR5cGUoKSA/IDEgOiAwKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoTWVkaWFUeXBlIHR5cGVBLCBNZWRpYVR5cGUgdHlwZUIpIHsKKyAgICAgICAgICAgIHJldHVybiByYW5rKHR5cGVBKSAtIHJhbmsodHlwZUIpOworICAgICAgICB9CisgICAgfTsKKworICAgIC8qKgorICAgICAqIENvbXBhcmF0b3IgZm9yIGxpc3RzIG9mIG1lZGlhIHR5cGVzLgorICAgICAqIDxwPgorICAgICAqIFRoZSBsZWFzdCBzcGVjaWZpYyBjb250ZW50IHR5cGUgb2YgZWFjaCBsaXN0IGlzIG9idGFpbmVkIGFuZCB0aGVuIGNvbXBhcmVkCisgICAgICogdXNpbmcge0BsaW5rICNQQVJUSUFMX09SREVSX0NPTVBBUkFUT1J9LgorICAgICAqIDxwPgorICAgICAqIEFzc3VtZXMgZWFjaCBsaXN0IGlzIGFscmVhZHkgb3JkZXJlZCBhY2NvcmRpbmcgdG8ge0BsaW5rICNQQVJUSUFMX09SREVSX0NPTVBBUkFUT1J9CisgICAgICogYW5kIHRoZXJlZm9yZSB0aGUgbGVhc3Qgc3BlY2lmaWMgbWVkaWEgdHlwZSBpcyBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxMaXN0PD8gZXh0ZW5kcyBNZWRpYVR5cGU+PiBNRURJQV9UWVBFX0xJU1RfQ09NUEFSQVRPUiA9CisgICAgICAgICAgICBuZXcgQ29tcGFyYXRvcjxMaXN0PD8gZXh0ZW5kcyBNZWRpYVR5cGU+PigpIHsKKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShMaXN0PD8gZXh0ZW5kcyBNZWRpYVR5cGU+IG8xLCBMaXN0PD8gZXh0ZW5kcyBNZWRpYVR5cGU+IG8yKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBQQVJUSUFMX09SREVSX0NPTVBBUkFUT1IuY29tcGFyZShnZXRMZWFzdFNwZWNpZmljKG8xKSwgZ2V0TGVhc3RTcGVjaWZpYyhvMikpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByaXZhdGUgTWVkaWFUeXBlIGdldExlYXN0U3BlY2lmaWMoTGlzdDw/IGV4dGVuZHMgTWVkaWFUeXBlPiBsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiByZWFsbHkgY29tcGFyaW5nIGp1c3QgbGFzdCBvbmU/CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsLmdldChsLnNpemUoKSAtIDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgLyoqCisgICAgICogQSBzaW5nbGV0b24gbGlzdCBjb250YWluaW5nIHRoZSB3aWxkY2FyZCBtZWRpYSB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTGlzdDxNZWRpYVR5cGU+IFdJTERDQVJEX1RZUEVfU0lOR0xFVE9OX0xJU1QgPQorICAgICAgICAgICAgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChNZWRpYVR5cGUuV0lMRENBUkRfVFlQRSk7CisgICAgLyoqCisgICAgICogQW4gYWNjZXB0YWJsZSBtZWRpYSB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gYSB3aWxkY2FyZCB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQWNjZXB0YWJsZU1lZGlhVHlwZSBXSUxEQ0FSRF9BQ0NFUFRBQkxFX1RZUEUgPSBuZXcgQWNjZXB0YWJsZU1lZGlhVHlwZSgiKiIsICIqIik7CisgICAgLyoqCisgICAgICogQW4gYWNjZXB0YWJsZSBtZWRpYSB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gYSB3aWxkY2FyZCB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUXVhbGl0eVNvdXJjZU1lZGlhVHlwZSBXSUxEQ0FSRF9RU19UWVBFID0gbmV3IFF1YWxpdHlTb3VyY2VNZWRpYVR5cGUoIioiLCAiKiIpOworICAgIC8qKgorICAgICAqIEEgc2luZ2xldG9uIGxpc3QgY29udGFpbmluZyB0aGUgd2lsZGNhcmQgbWVkaWEgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExpc3Q8TWVkaWFUeXBlPiBXSUxEQ0FSRF9RU19UWVBFX1NJTkdMRVRPTl9MSVNUID0KKyAgICAgICAgICAgIENvbGxlY3Rpb25zLjxNZWRpYVR5cGU+c2luZ2xldG9uTGlzdChXSUxEQ0FSRF9RU19UWVBFKTsKKworICAgIC8qKgorICAgICAqIENhY2hlIGNvbnRhaW5pbmcgZnJlcXVlbnRseSByZXF1ZXN0ZWQgbWVkaWEgdHlwZSB2YWx1ZXMgd2l0aCBhIHdpbGRjYXJkIHN1YnR5cGUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgTWVkaWFUeXBlPiBXSUxEQ0FSRF9TVUJUWVBFX0NBQ0hFID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNZWRpYVR5cGU+KCkgeworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDMxMDkyNTY3NzMyMTgxNjA0ODVMOworCisgICAgICAgIHsKKyAgICAgICAgICAgIHB1dCgiYXBwbGljYXRpb24iLCBuZXcgTWVkaWFUeXBlKCJhcHBsaWNhdGlvbiIsIE1lZGlhVHlwZS5NRURJQV9UWVBFX1dJTERDQVJEKSk7CisgICAgICAgICAgICBwdXQoIm11bHRpcGFydCIsIG5ldyBNZWRpYVR5cGUoIm11bHRpcGFydCIsIE1lZGlhVHlwZS5NRURJQV9UWVBFX1dJTERDQVJEKSk7CisgICAgICAgICAgICBwdXQoInRleHQiLCBuZXcgTWVkaWFUeXBlKCJ0ZXh0IiwgTWVkaWFUeXBlLk1FRElBX1RZUEVfV0lMRENBUkQpKTsKKyAgICAgICAgfQorICAgIH07CisgICAgLyoqCisgICAgICogUHJlZGljYXRlIGZvciBjb25zdHJ1Y3RpbmcgZmlsdGVyaW5nIHBhcmFtZXRlciBtYXBzIHRoYXQgaWdub3JlIHRoZSAicSIgYW5kICJxcyIgcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQcmVkaWNhdGU8U3RyaW5nPiBRVUFMSVRZX1BBUkFNX0ZJTFRFUklOR19QUkVESUNBVEUgPQorICAgICAgICAgICAgaW5wdXQgLT4gIVF1YWxpdHkuUVVBTElUWV9TT1VSQ0VfUEFSQU1FVEVSX05BTUUuZXF1YWxzKGlucHV0KQorICAgICAgICAgICAgICAgICAgICAgJiYgIVF1YWxpdHkuUVVBTElUWV9QQVJBTUVURVJfTkFNRS5lcXVhbHMoaW5wdXQpOworCisgICAgLyoqCisgICAgICogUHJldmVudHMgaW5pdGlhbGl6YXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBNZWRpYVR5cGVzKCkgeworICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIkluc3RhbnRpYXRpb24gbm90IGFsbG93ZWQuIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lIGlmIHRoZSB0d28gbWVkaWEgdHlwZXMgYXJlIHR5cGUtZXF1YWwgKHRoZWlyIHtAbGluayBNZWRpYVR5cGUjZ2V0VHlwZSgpIHR5cGV9CisgICAgICogYW5kIHtAbGluayBNZWRpYVR5cGUjZ2V0U3VidHlwZSgpIHN1YnR5cGV9IGFyZSBlcXVhbCkuIEZvciBleGFtcGxlOgorICAgICAqIDxwcmU+CisgICAgICogIG0vbiA9PSBtL24KKyAgICAgKiAgbS9uO3AxID09IG0vbjtwMgorICAgICAqCisgICAgICogIG0vbiAhPSBtL3kKKyAgICAgKiAgbS9uICE9IHgvbgorICAgICAqICBtL24gIT0geC95PC9wcmU+CisgICAgICoKKyAgICAgKiBAcGFyYW0gbTEgZmlyc3QgbWVkaWEgdHlwZS4KKyAgICAgKiBAcGFyYW0gbTIgc2Vjb25kIG1lZGlhIHR5cGUuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHR3byBtZWRpYSB0eXBlcyBhcmUgb2YgdGhlIHNhbWUgdHlwZSBhbmQgc3VidHlwZSwKKyAgICAgKiB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdHlwZUVxdWFsKE1lZGlhVHlwZSBtMSwgTWVkaWFUeXBlIG0yKSB7CisgICAgICAgIGlmIChtMSA9PSBudWxsIHx8IG0yID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtMS5nZXRTdWJ0eXBlKCkuZXF1YWxzSWdub3JlQ2FzZShtMi5nZXRTdWJ0eXBlKCkpICYmIG0xLmdldFR5cGUoKS5lcXVhbHNJZ25vcmVDYXNlKG0yLmdldFR5cGUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lIGlmIHRoZSB0d28gbGlzdCBvZiBtZWRpYSB0eXBlcyBzaGFyZSBhIGNvbW1vbgorICAgICAqIHtAbGluayAjdHlwZUVxdWFsKGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlLCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZSkgdHlwZS1lcXVhbH0KKyAgICAgKiBzdWItbGlzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtbDEgZmlyc3QgbWVkaWEgdHlwZSBsaXN0LgorICAgICAqIEBwYXJhbSBtbDIgc2Vjb25kIG1lZGlhIHR5cGUgbGlzdC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgdHdvIG1lZGlhIHR5cGUgbGlzdHMgaW50ZXJzZWN0IGJ5IHNoYXJpbmcgYQorICAgICAqIGNvbW1vbiB0eXBlLWVxdWFsIHN1Yi1saXN0LCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaW50ZXJzZWN0KExpc3Q8PyBleHRlbmRzIE1lZGlhVHlwZT4gbWwxLCBMaXN0PD8gZXh0ZW5kcyBNZWRpYVR5cGU+IG1sMikgeworICAgICAgICBmb3IgKE1lZGlhVHlwZSBtMSA6IG1sMSkgeworICAgICAgICAgICAgZm9yIChNZWRpYVR5cGUgbTIgOiBtbDIpIHsKKyAgICAgICAgICAgICAgICBpZiAoTWVkaWFUeXBlcy50eXBlRXF1YWwobTEsIG0yKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbW9zdCBzcGVjaWZpYyBtZWRpYSB0eXBlIGZyb20gYSBwYWlyIG9mIG1lZGlhIHR5cGVzLiBUaGUgbW9zdAorICAgICAqIHNwZWNpZmljIG1lZGlhIHR5cGUgaXMgdGhlIG1lZGlhIHR5cGUgZnJvbSB0aGUgcGFpciB0aGF0IGhhcyBsZWFzdAorICAgICAqIHdpbGQgY2FyZHMgcHJlc2VudCwgb3IgaGFzIG1vcmUgcGFyYW1ldGVycyBzcGVjaWZpZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbTEgdGhlIGZpcnN0IG1lZGlhIHR5cGUuCisgICAgICogQHBhcmFtIG0yIHRoZSBzZWNvbmQgbWVkaWEgdHlwZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBtb3N0IHNwZWNpZmljIG1lZGlhIHR5cGUuIElmIHRoZSBtZWRpYSB0eXBlcyBhcmUgZXF1YWxseQorICAgICAqIHNwZWNpZmljIHRoZW4gdGhlIGZpcnN0IG1lZGlhIHR5cGUgaXMgcmV0dXJuZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBNZWRpYVR5cGUgbW9zdFNwZWNpZmljKE1lZGlhVHlwZSBtMSwgTWVkaWFUeXBlIG0yKSB7CisgICAgICAgIGlmIChtMS5pc1dpbGRjYXJkVHlwZSgpICYmICFtMi5pc1dpbGRjYXJkVHlwZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gbTI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG0xLmlzV2lsZGNhcmRTdWJ0eXBlKCkgJiYgIW0yLmlzV2lsZGNhcmRTdWJ0eXBlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBtMjsKKyAgICAgICAgfQorICAgICAgICBpZiAobTIuZ2V0UGFyYW1ldGVycygpLnNpemUoKSA+IG0xLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBtMjsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gdW5tb2RpZmlhYmxlIGxpc3Qgb2YgbWVkaWEgdHlwZXMgZnJvbSB0aGUgdmFsdWVzIGRlY2xhcmVkIGluIHRoZSB7QGxpbmsgQ29uc3VtZXN9CisgICAgICogYW5ub3RhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIHRoZSBDb25zdW1lcyBhbm5vdGF0aW9uLgorICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2Yge0BsaW5rIE1lZGlhVHlwZX0sIG9yZGVyZWQgYWNjb3JkaW5nIHRvIHtAbGluayAjUEFSVElBTF9PUkRFUl9DT01QQVJBVE9SfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8TWVkaWFUeXBlPiBjcmVhdGVGcm9tKENvbnN1bWVzIGFubm90YXRpb24pIHsKKyAgICAgICAgaWYgKGFubm90YXRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIFdJTERDQVJEX1RZUEVfU0lOR0xFVE9OX0xJU1Q7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY3JlYXRlRnJvbShhbm5vdGF0aW9uLnZhbHVlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiB1bm1vZGlmaWFibGUgbGlzdCBvZiBtZWRpYSB0eXBlcyBmcm9tIHRoZSB2YWx1ZXMgZGVjbGFyZWQgaW4gdGhlIHtAbGluayBQcm9kdWNlc30KKyAgICAgKiBhbm5vdGF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGFubm90YXRpb24gdGhlIFByb2R1Y2VzIGFubm90YXRpb24uCisgICAgICogQHJldHVybiB0aGUgbGlzdCBvZiB7QGxpbmsgTWVkaWFUeXBlfSwgb3JkZXJlZCBhY2NvcmRpbmcgdG8ge0BsaW5rICNQQVJUSUFMX09SREVSX0NPTVBBUkFUT1J9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxNZWRpYVR5cGU+IGNyZWF0ZUZyb20oUHJvZHVjZXMgYW5ub3RhdGlvbikgeworICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gV0lMRENBUkRfVFlQRV9TSU5HTEVUT05fTElTVDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjcmVhdGVGcm9tKGFubm90YXRpb24udmFsdWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIHVubW9kaWZpYWJsZSBsaXN0IG9mIG1lZGlhIHR5cGUgZnJvbSBhIHN0cmluZyBhcnJheSBvZiBtZWRpYSB0eXBlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZWRpYVR5cGVzIHRoZSBzdHJpbmcgYXJyYXkgb2YgbWVkaWEgdHlwZXMuCisgICAgICogQHJldHVybiB0aGUgbGlzdCBvZiB7QGxpbmsgTWVkaWFUeXBlfSwgb3JkZXJlZCBhY2NvcmRpbmcgdG8ge0BsaW5rICNQQVJUSUFMX09SREVSX0NPTVBBUkFUT1J9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxNZWRpYVR5cGU+IGNyZWF0ZUZyb20oU3RyaW5nW10gbWVkaWFUeXBlcykgeworICAgICAgICBMaXN0PE1lZGlhVHlwZT4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDxNZWRpYVR5cGU+KCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIG1lZGlhVHlwZSA6IG1lZGlhVHlwZXMpIHsKKyAgICAgICAgICAgICAgICBIdHRwSGVhZGVyUmVhZGVyLnJlYWRNZWRpYVR5cGVzKHJlc3VsdCwgbWVkaWFUeXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZXgpOworICAgICAgICB9CisKKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChyZXN1bHQsIFBBUlRJQUxfT1JERVJfQ09NUEFSQVRPUik7CisKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QocmVzdWx0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBsaXN0IG9mIHF1YWxpdHkgc291cmNlIG1lZGlhIHR5cGUgZnJvbSB0aGUgUHJvZHVjZXMgYW5ub3RhdGlvbi4KKyAgICAgKiA8cD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtaW1lIHRoZSBQcm9kdWNlcyBhbm5vdGF0aW9uLgorICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2Yge0BsaW5rIFF1YWxpdHlTb3VyY2VNZWRpYVR5cGV9LCBvcmRlcmVkIGFjY29yZGluZyB0bworICAgICAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLlF1YWxpdHlTb3VyY2VNZWRpYVR5cGUjQ09NUEFSQVRPUn0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0PE1lZGlhVHlwZT4gY3JlYXRlUXVhbGl0eVNvdXJjZU1lZGlhVHlwZXMoUHJvZHVjZXMgbWltZSkgeworICAgICAgICBpZiAobWltZSA9PSBudWxsIHx8IG1pbWUudmFsdWUoKS5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIFdJTERDQVJEX1FTX1RZUEVfU0lOR0xFVE9OX0xJU1Q7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDxNZWRpYVR5cGU+KGNyZWF0ZVF1YWxpdHlTb3VyY2VNZWRpYVR5cGVzKG1pbWUudmFsdWUoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGxpc3Qgb2YgcXVhbGl0eSBzb3VyY2UgbWVkaWEgdHlwZSBmcm9tIGFuIGFycmF5IG9mIG1lZGlhIHR5cGVzLgorICAgICAqIDxwPgorICAgICAqCisgICAgICogQHBhcmFtIG1lZGlhVHlwZXMgdGhlIGFycmF5IG9mIG1lZGlhIHR5cGVzLgorICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2Yge0BsaW5rIFF1YWxpdHlTb3VyY2VNZWRpYVR5cGV9LCBvcmRlcmVkIGFjY29yZGluZyB0bworICAgICAqIHRoZSBxdWFsaXR5IHNvdXJjZSBhcyB0aGUgcHJpbWFyeSBrZXkgYW5kIHtAbGluayAjUEFSVElBTF9PUkRFUl9DT01QQVJBVE9SfQorICAgICAqIGFzIHRoZSBzZWNvbmRhcnkga2V5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxRdWFsaXR5U291cmNlTWVkaWFUeXBlPiBjcmVhdGVRdWFsaXR5U291cmNlTWVkaWFUeXBlcyhTdHJpbmdbXSBtZWRpYVR5cGVzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gSHR0cEhlYWRlclJlYWRlci5yZWFkUXVhbGl0eVNvdXJjZU1lZGlhVHlwZShtZWRpYVR5cGVzKTsKKyAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgcXVhbGl0eSBmYWN0b3IgZnJvbSBnaXZlbiBtZWRpYSB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIG10IG1lZGlhIHR5cGUgdG8gcmVhZCBxdWFsaXR5IHBhcmFtZXRlciBmcm9tCisgICAgICogQHJldHVybiBxdWFsaXR5IGZhY3RvciBvZiBpbnB1dCBtZWRpYSB0eXBlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0UXVhbGl0eShNZWRpYVR5cGUgbXQpIHsKKworICAgICAgICBmaW5hbCBTdHJpbmcgcVBhcmFtID0gbXQuZ2V0UGFyYW1ldGVycygpLmdldChRdWFsaXR5LlFVQUxJVFlfUEFSQU1FVEVSX05BTUUpOworICAgICAgICByZXR1cm4gcmVhZFF1YWxpdHlGYWN0b3IocVBhcmFtKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgcmVhZFF1YWxpdHlGYWN0b3IoZmluYWwgU3RyaW5nIHFQYXJhbSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChxUGFyYW0gPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIFF1YWxpdHkuREVGQVVMVDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEh0dHBIZWFkZXJSZWFkZXIucmVhZFF1YWxpdHlGYWN0b3IocVBhcmFtKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdHJpcHMgYW55IHF1YWxpdHkgcGFyYW1ldGVycywgaS5lLiBxIGFuZCBxcyBmcm9tIGdpdmVuIG1lZGlhIHR5cGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVkaWFUeXBlIHR5cGUgdG8gc3RyaXAgcXVhbGl0eSBwYXJhbWV0ZXJzIGZyb20KKyAgICAgKiBAcmV0dXJuIG1lZGlhIHR5cGUgaW5zdGFuY2UgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gb25lIHdpdGggcXVhbGl0eSBwYXJhbWV0ZXJzIHN0cmlwcGVkIG9mZgorICAgICAqIG9yIHRoZSBvcmlnaW5hbCBpbnN0YW5jZSBpZiBubyBzdWNoIHBhcmFtZXRlcnMgYXJlIHByZXNlbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE1lZGlhVHlwZSBzdHJpcFF1YWxpdHlQYXJhbXMoTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IG9sZFBhcmFtZXRlcnMgPSBtZWRpYVR5cGUuZ2V0UGFyYW1ldGVycygpOworICAgICAgICBpZiAob2xkUGFyYW1ldGVycy5pc0VtcHR5KCkKKyAgICAgICAgICAgICAgICB8fCAoIW9sZFBhcmFtZXRlcnMuY29udGFpbnNLZXkoUXVhbGl0eS5RVUFMSVRZX1NPVVJDRV9QQVJBTUVURVJfTkFNRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhb2xkUGFyYW1ldGVycy5jb250YWluc0tleShRdWFsaXR5LlFVQUxJVFlfUEFSQU1FVEVSX05BTUUpKSkgeworICAgICAgICAgICAgcmV0dXJuIG1lZGlhVHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgTWVkaWFUeXBlKG1lZGlhVHlwZS5nZXRUeXBlKCksIG1lZGlhVHlwZS5nZXRTdWJ0eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZFBhcmFtZXRlcnMuZW50cnlTZXQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGVudHJ5IC0+IFFVQUxJVFlfUEFSQU1fRklMVEVSSU5HX1BSRURJQ0FURS50ZXN0KGVudHJ5LmdldEtleSgpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9NYXAoTWFwLkVudHJ5OjpnZXRLZXksIE1hcC5FbnRyeTo6Z2V0VmFsdWUpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBNZWRpYVR5cGUgd2l0aCB3aWxkY2FyZCBpbiBzdWJ0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIG1lZGlhVHlwZSBvcmlnaW5hbCBNZWRpYVR5cGUuCisgICAgICogQHJldHVybiBNZWRpYVR5cGUgd2l0aCB3aWxkY2FyZCBpbiBzdWJ0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFUeXBlIGdldFR5cGVXaWxkQ2FydChNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIE1lZGlhVHlwZSBtdCA9IFdJTERDQVJEX1NVQlRZUEVfQ0FDSEUuZ2V0KG1lZGlhVHlwZS5nZXRUeXBlKCkpOworCisgICAgICAgIGlmIChtdCA9PSBudWxsKSB7CisgICAgICAgICAgICBtdCA9IG5ldyBNZWRpYVR5cGUobWVkaWFUeXBlLmdldFR5cGUoKSwgTWVkaWFUeXBlLk1FRElBX1RZUEVfV0lMRENBUkQpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG10OworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgbWVkaWEgdHlwZXMgaW50byB7QGxpbmsgamF2YS5sYW5nLlN0cmluZ30uIFRoZSByZXN1bHQgc3RyaW5nIGNvbnRhaW5zCisgICAgICogbWVkaWEgdHlwZXMgaW4gdGhlIHNhbWUgb3JkZXIsIHNlcGFyYXRlZCBieSBjb21tYSAnLCcgYW5kIGVuY2xvc2VkIGludG8gcXVvdGVzLgorICAgICAqIEZvciBleGFtcGxlIGZvciBpbnB1dCBtZWRpYSB0eXBlcworICAgICAqIHtAbGluayBNZWRpYVR5cGUjVEVYVF9QTEFJTl9UWVBFfSwge0BsaW5rIE1lZGlhVHlwZSNURVhUX1BMQUlOX1RZUEV9IGFuZAorICAgICAqIHtAbGluayBNZWRpYVR5cGUjQVBQTElDQVRJT05fSlNPTl9UWVBFfSB0aGUgcmVzdWx0IHdpbGwgYmUKKyAgICAgKiAidGV4dC9wbGFpbiIsICJhcHBsaWNhdGlvbi9qc29uIiwgInRleHQvaHRtbCIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVkaWFUeXBlcyB7QGxpbmsgSXRlcmFibGUgaXRlcmFibGV9IHdpdGgge0BsaW5rIE1lZGlhVHlwZSBtZWRpYSB0eXBlc30uCisgICAgICogQHJldHVybiBNZWRpYSB0eXBlcyBjb252ZXJ0ZWQgaW50byBTdHJpbmcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29udmVydFRvU3RyaW5nKEl0ZXJhYmxlPE1lZGlhVHlwZT4gbWVkaWFUeXBlcykgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgYm9vbGVhbiBpc0ZpcnN0ID0gdHJ1ZTsKKyAgICAgICAgZm9yIChNZWRpYVR5cGUgbWVkaWFUeXBlIDogbWVkaWFUeXBlcykgeworICAgICAgICAgICAgaWYgKCFpc0ZpcnN0KSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpc0ZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYi5hcHBlbmQoIlwiIikuYXBwZW5kKG1lZGlhVHlwZS50b1N0cmluZygpKS5hcHBlbmQoIlwiIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gbWVkaWEgdHlwZSBpcyBhIHdpbGRjYXJkIHR5cGUuCisgICAgICoKKyAgICAgKiBBIG1lZGlhIHR5cGUgaXMgY29uc2lkZXJlZCB0byBiZSBhIHdpbGRjYXJkIGlmIGVpdGhlciB0aGUgbWVkaWEgdHlwZSdzIHR5cGUgb3Igc3VidHlwZSBpcyBhIHdpbGRjYXJkIHR5cGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVkaWFUeXBlIG1lZGlhIHR5cGUuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG1lZGlhIHR5cGUgaXMgYSB3aWxkY2FyZCB0eXBlLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNXaWxkY2FyZChmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiBtZWRpYVR5cGUuaXNXaWxkY2FyZFR5cGUoKSB8fCBtZWRpYVR5cGUuaXNXaWxkY2FyZFN1YnR5cGUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvTWVzc2FnZUJvZHlGYWN0b3J5LmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvTWVzc2FnZUJvZHlGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUzNjFlZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9NZXNzYWdlQm9keUZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDExODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJlYWRlckludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvcjsKKworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuQm9vdHN0cmFwQmFnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkJvb3RzdHJhcENvbmZpZ3VyYXRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Qcm9wZXJ0aWVzRGVsZWdhdGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmEuUHJpbWl0aXZlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQmluZGluZ3M7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0Lkluc3RhbmNlQmluZGluZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuUHJvdmlkZXJzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUHJvcGVydGllc0hlbHBlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlJlZmxlY3Rpb25IZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5SZWZsZWN0aW9uSGVscGVyLkRlY2xhcmluZ0NsYXNzSW50ZXJmYWNlUGFpcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uRGF0YVN0cnVjdHVyZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLktleUNvbXBhcmF0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLktleUNvbXBhcmF0b3JIYXNoTWFwOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5LZXlDb21wYXJhdG9yTGlua2VkSGFzaE1hcDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLkFic3RyYWN0RW50aXR5UHJvdmlkZXJNb2RlbDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLk1lc3NhZ2VCb2R5V29ya2VyczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLk1lc3NhZ2VQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuUmVhZGVyTW9kZWw7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5Xcml0ZXJNb2RlbDsKKworLyoqCisgKiBBIGZhY3RvcnkgZm9yIG1hbmFnaW5nIHtAbGluayBNZXNzYWdlQm9keVJlYWRlcn0sIHtAbGluayBNZXNzYWdlQm9keVdyaXRlcn0gaW5zdGFuY2VzLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgTWVzc2FnZUJvZHlGYWN0b3J5IGltcGxlbWVudHMgTWVzc2FnZUJvZHlXb3JrZXJzIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKE1lc3NhZ2VCb2R5RmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOworCisgICAgLyoqCisgICAgICogQ29uZmlndXJhdG9yIHdoaWNoIGluaXRpYWxpemVzIGFuZCByZWdpc3RlciB7QGxpbmsgTWVzc2FnZUJvZHlXb3JrZXJzfSBpbnN0YW5jZSBpbnRvIHtAbGluayBJbmplY3Rpb25NYW5hZ2VyfSBhbmQKKyAgICAgKiB7QGxpbmsgQm9vdHN0cmFwQmFnfS4KKyAgICAgKgorICAgICAqIEBhdXRob3IgUGV0ciBCb3VkYQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWVzc2FnZUJvZHlXb3JrZXJzQ29uZmlndXJhdG9yIGltcGxlbWVudHMgQm9vdHN0cmFwQ29uZmlndXJhdG9yIHsKKworICAgICAgICBwcml2YXRlIE1lc3NhZ2VCb2R5RmFjdG9yeSBtZXNzYWdlQm9keUZhY3Rvcnk7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGluaXQoSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyLCBCb290c3RyYXBCYWcgYm9vdHN0cmFwQmFnKSB7CisgICAgICAgICAgICBtZXNzYWdlQm9keUZhY3RvcnkgPSBuZXcgTWVzc2FnZUJvZHlGYWN0b3J5KGJvb3RzdHJhcEJhZy5nZXRDb25maWd1cmF0aW9uKCkpOworICAgICAgICAgICAgSW5zdGFuY2VCaW5kaW5nPE1lc3NhZ2VCb2R5RmFjdG9yeT4gYmluZGluZyA9CisgICAgICAgICAgICAgICAgICAgIEJpbmRpbmdzLnNlcnZpY2UobWVzc2FnZUJvZHlGYWN0b3J5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50byhNZXNzYWdlQm9keVdvcmtlcnMuY2xhc3MpOworICAgICAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5yZWdpc3RlcihiaW5kaW5nKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBwb3N0SW5pdChJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIsIEJvb3RzdHJhcEJhZyBib290c3RyYXBCYWcpIHsKKyAgICAgICAgICAgIG1lc3NhZ2VCb2R5RmFjdG9yeS5pbml0aWFsaXplKGluamVjdGlvbk1hbmFnZXIpOworICAgICAgICAgICAgYm9vdHN0cmFwQmFnLnNldE1lc3NhZ2VCb2R5V29ya2VycyhtZXNzYWdlQm9keUZhY3RvcnkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTWVkaWEgdHlwZSBjb21wYXJhdG9yLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgS2V5Q29tcGFyYXRvcjxNZWRpYVR5cGU+IE1FRElBX1RZUEVfS0VZX0NPTVBBUkFUT1IgPQorICAgICAgICAgICAgbmV3IEtleUNvbXBhcmF0b3I8TWVkaWFUeXBlPigpIHsKKyAgICAgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxNjE2ODE5ODI4NjMwODI3NzYzTDsKKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBNZWRpYVR5cGUgbXQxLCBmaW5hbCBNZWRpYVR5cGUgbXQyKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHRyZWF0IGNvbXBhdGlibGUgdHlwZXMgYXMgZXF1YWwKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG10MS5pc0NvbXBhdGlibGUobXQyKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgaW50IGhhc2goZmluYWwgTWVkaWFUeXBlIG10KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHRyZWF0IGNvbXBhdGlibGUgdHlwZXMgYXMgZXF1YWwKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG10LmdldFR5cGUoKS50b0xvd2VyQ2FzZSgpLmhhc2hDb2RlKCkgKyBtdC5nZXRTdWJ0eXBlKCkudG9Mb3dlckNhc2UoKS5oYXNoQ29kZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgLyoqCisgICAgICogQ29tcGFyZXMgZW50aXR5IHByb3ZpZGVycyBieSB0aGUgcHJvdmlkZWQgY2xhc3MgKG1vc3Qgc3BlY2lmaWMgZmlyc3QpCisgICAgICogYW5kIHRoZW4gYnkgdGhlIGRlY2xhcmVkIHN1cHBvcnRlZCBtZWRpYSB0eXBlcywgaWYgdGhlIHByb3ZpZGVkIGNsYXNzZXMKKyAgICAgKiBhcmUgdGhlIHNhbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxBYnN0cmFjdEVudGl0eVByb3ZpZGVyTW9kZWw8Pz4+IFdPUktFUl9CWV9UWVBFX0NPTVBBUkFUT1IgPQorICAgICAgICAgICAgbmV3IENvbXBhcmF0b3I8QWJzdHJhY3RFbnRpdHlQcm92aWRlck1vZGVsPD8+PigpIHsKKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShmaW5hbCBBYnN0cmFjdEVudGl0eVByb3ZpZGVyTW9kZWw8Pz4gbzEsIGZpbmFsIEFic3RyYWN0RW50aXR5UHJvdmlkZXJNb2RlbDw/PiBvMikgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiBvMVByb3ZpZGVyQ2xhc3NQYXJhbSA9IG8xLnByb3ZpZGVkVHlwZSgpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiBvMlByb3ZpZGVyQ2xhc3NQYXJhbSA9IG8yLnByb3ZpZGVkVHlwZSgpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChvMVByb3ZpZGVyQ2xhc3NQYXJhbSA9PSBvMlByb3ZpZGVyQ2xhc3NQYXJhbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29tcGFyZSBwcm9kdWNpYmxlIG1lZGlhIHR5cGVzLgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmUobzIuZGVjbGFyZWRUeXBlcygpLCBvMS5kZWNsYXJlZFR5cGVzKCkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG8xUHJvdmlkZXJDbGFzc1BhcmFtLmlzQXNzaWduYWJsZUZyb20obzJQcm92aWRlckNsYXNzUGFyYW0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvMlByb3ZpZGVyQ2xhc3NQYXJhbS5pc0Fzc2lnbmFibGVGcm9tKG8xUHJvdmlkZXJDbGFzc1BhcmFtKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByaXZhdGUgaW50IGNvbXBhcmUoTGlzdDxNZWRpYVR5cGU+IG1lZGlhVHlwZUxpc3QxLCBMaXN0PE1lZGlhVHlwZT4gbWVkaWFUeXBlTGlzdDIpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlTGlzdDEgPSBtZWRpYVR5cGVMaXN0MS5pc0VtcHR5KCkgPyBNZWRpYVR5cGVzLldJTERDQVJEX1RZUEVfU0lOR0xFVE9OX0xJU1QgOiBtZWRpYVR5cGVMaXN0MTsKKyAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlTGlzdDIgPSBtZWRpYVR5cGVMaXN0Mi5pc0VtcHR5KCkgPyBNZWRpYVR5cGVzLldJTERDQVJEX1RZUEVfU0lOR0xFVE9OX0xJU1QgOiBtZWRpYVR5cGVMaXN0MjsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWVkaWFUeXBlcy5NRURJQV9UWVBFX0xJU1RfQ09NUEFSQVRPUi5jb21wYXJlKG1lZGlhVHlwZUxpc3QyLCBtZWRpYVR5cGVMaXN0MSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgIHByaXZhdGUgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyOworCisgICAgcHJpdmF0ZSBmaW5hbCBCb29sZWFuIGxlZ2FjeVByb3ZpZGVyT3JkZXJpbmc7CisKKyAgICBwcml2YXRlIExpc3Q8UmVhZGVyTW9kZWw+IHJlYWRlcnM7CisgICAgcHJpdmF0ZSBMaXN0PFdyaXRlck1vZGVsPiB3cml0ZXJzOworCisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8TWVkaWFUeXBlLCBMaXN0PE1lc3NhZ2VCb2R5UmVhZGVyPj4gcmVhZGVyc0NhY2hlID0gbmV3IEtleUNvbXBhcmF0b3JIYXNoTWFwPD4oTUVESUFfVFlQRV9LRVlfQ09NUEFSQVRPUik7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8TWVkaWFUeXBlLCBMaXN0PE1lc3NhZ2VCb2R5V3JpdGVyPj4gd3JpdGVyc0NhY2hlID0gbmV3IEtleUNvbXBhcmF0b3JIYXNoTWFwPD4oTUVESUFfVFlQRV9LRVlfQ09NUEFSQVRPUik7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTE9PS1VQX0NBQ0hFX0lOSVRJQUxfQ0FQQUNJVFkgPSAzMjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBMT09LVVBfQ0FDSEVfTE9BRF9GQUNUT1IgPSAwLjc1ZjsKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxDbGFzczw/PiwgTGlzdDxSZWFkZXJNb2RlbD4+IG1iclR5cGVMb29rdXBDYWNoZSA9IERhdGFTdHJ1Y3R1cmVzLmNyZWF0ZUNvbmN1cnJlbnRNYXAoCisgICAgICAgICAgICBMT09LVVBfQ0FDSEVfSU5JVElBTF9DQVBBQ0lUWSwgTE9PS1VQX0NBQ0hFX0xPQURfRkFDVE9SLCBEYXRhU3RydWN0dXJlcy5ERUZBVUxUX0NPTkNVUkVOQ1lfTEVWRUwpOworICAgIHByaXZhdGUgZmluYWwgTWFwPENsYXNzPD8+LCBMaXN0PFdyaXRlck1vZGVsPj4gbWJ3VHlwZUxvb2t1cENhY2hlID0gRGF0YVN0cnVjdHVyZXMuY3JlYXRlQ29uY3VycmVudE1hcCgKKyAgICAgICAgICAgIExPT0tVUF9DQUNIRV9JTklUSUFMX0NBUEFDSVRZLCBMT09LVVBfQ0FDSEVfTE9BRF9GQUNUT1IsIERhdGFTdHJ1Y3R1cmVzLkRFRkFVTFRfQ09OQ1VSRU5DWV9MRVZFTCk7CisKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxDbGFzczw/PiwgTGlzdDxNZWRpYVR5cGU+PiB0eXBlVG9NZWRpYVR5cGVSZWFkZXJzQ2FjaGUgPSBEYXRhU3RydWN0dXJlcy5jcmVhdGVDb25jdXJyZW50TWFwKAorICAgICAgICAgICAgTE9PS1VQX0NBQ0hFX0lOSVRJQUxfQ0FQQUNJVFksIExPT0tVUF9DQUNIRV9MT0FEX0ZBQ1RPUiwgRGF0YVN0cnVjdHVyZXMuREVGQVVMVF9DT05DVVJFTkNZX0xFVkVMKTsKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxDbGFzczw/PiwgTGlzdDxNZWRpYVR5cGU+PiB0eXBlVG9NZWRpYVR5cGVXcml0ZXJzQ2FjaGUgPSBEYXRhU3RydWN0dXJlcy5jcmVhdGVDb25jdXJyZW50TWFwKAorICAgICAgICAgICAgTE9PS1VQX0NBQ0hFX0lOSVRJQUxfQ0FQQUNJVFksIExPT0tVUF9DQUNIRV9MT0FEX0ZBQ1RPUiwgRGF0YVN0cnVjdHVyZXMuREVGQVVMVF9DT05DVVJFTkNZX0xFVkVMKTsKKworICAgIHByaXZhdGUgZmluYWwgTWFwPE1vZGVsTG9va3VwS2V5LCBMaXN0PFJlYWRlck1vZGVsPj4gbWJyTG9va3VwQ2FjaGUgPSBEYXRhU3RydWN0dXJlcy5jcmVhdGVDb25jdXJyZW50TWFwKAorICAgICAgICAgICAgTE9PS1VQX0NBQ0hFX0lOSVRJQUxfQ0FQQUNJVFksIExPT0tVUF9DQUNIRV9MT0FEX0ZBQ1RPUiwgRGF0YVN0cnVjdHVyZXMuREVGQVVMVF9DT05DVVJFTkNZX0xFVkVMKTsKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxNb2RlbExvb2t1cEtleSwgTGlzdDxXcml0ZXJNb2RlbD4+IG1id0xvb2t1cENhY2hlID0gRGF0YVN0cnVjdHVyZXMuY3JlYXRlQ29uY3VycmVudE1hcCgKKyAgICAgICAgICAgIExPT0tVUF9DQUNIRV9JTklUSUFMX0NBUEFDSVRZLCBMT09LVVBfQ0FDSEVfTE9BRF9GQUNUT1IsIERhdGFTdHJ1Y3R1cmVzLkRFRkFVTFRfQ09OQ1VSRU5DWV9MRVZFTCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgbWVzc2FnZSBib2R5IGZhY3RvcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLiBPcHRpb25hbCAtIGNhbiBiZSBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBNZXNzYWdlQm9keUZhY3RvcnkoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7CisgICAgICAgIHRoaXMubGVnYWN5UHJvdmlkZXJPcmRlcmluZyA9IGNvbmZpZ3VyYXRpb24gIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIFByb3BlcnRpZXNIZWxwZXIuaXNQcm9wZXJ0eShjb25maWd1cmF0aW9uLmdldFByb3BlcnR5KE1lc3NhZ2VQcm9wZXJ0aWVzLkxFR0FDWV9XT1JLRVJTX09SREVSSU5HKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTXVzdCBiZSBpbml0aWFsaXplIGF0IHRoZSB0aW1lIG9mIGNvbXBsZXRlZCBwb3B1bGF0ZWQge0BsaW5rIEluamVjdGlvbk1hbmFnZXJ9LgorICAgICAqCisgICAgICogQHBhcmFtIGluamVjdGlvbk1hbmFnZXIgY29tcGxldGVkIGluamVjdGlvbiBtYW5hZ2VyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyKSB7CisgICAgICAgIHRoaXMuaW5qZWN0aW9uTWFuYWdlciA9IGluamVjdGlvbk1hbmFnZXI7CisgICAgICAgIC8vIEluaXRpYWxpemUgcmVhZGVycworICAgICAgICB0aGlzLnJlYWRlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgZmluYWwgU2V0PE1lc3NhZ2VCb2R5UmVhZGVyPiBjdXN0b21NYnJzID0gUHJvdmlkZXJzLmdldEN1c3RvbVByb3ZpZGVycyhpbmplY3Rpb25NYW5hZ2VyLCBNZXNzYWdlQm9keVJlYWRlci5jbGFzcyk7CisgICAgICAgIGZpbmFsIFNldDxNZXNzYWdlQm9keVJlYWRlcj4gbWJycyA9IFByb3ZpZGVycy5nZXRQcm92aWRlcnMoaW5qZWN0aW9uTWFuYWdlciwgTWVzc2FnZUJvZHlSZWFkZXIuY2xhc3MpOworCisgICAgICAgIGFkZFJlYWRlcnMocmVhZGVycywgY3VzdG9tTWJycywgdHJ1ZSk7CisgICAgICAgIG1icnMucmVtb3ZlQWxsKGN1c3RvbU1icnMpOworICAgICAgICBhZGRSZWFkZXJzKHJlYWRlcnMsIG1icnMsIGZhbHNlKTsKKworICAgICAgICBpZiAobGVnYWN5UHJvdmlkZXJPcmRlcmluZykgeworICAgICAgICAgICAgcmVhZGVycy5zb3J0KG5ldyBMZWdhY3lXb3JrZXJDb21wYXJhdG9yPD4oTWVzc2FnZUJvZHlSZWFkZXIuY2xhc3MpKTsKKworICAgICAgICAgICAgZm9yIChmaW5hbCBSZWFkZXJNb2RlbCBtb2RlbCA6IHJlYWRlcnMpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIE1lZGlhVHlwZSBtdCA6IG1vZGVsLmRlY2xhcmVkVHlwZXMoKSkgeworICAgICAgICAgICAgICAgICAgICBMaXN0PE1lc3NhZ2VCb2R5UmVhZGVyPiByZWFkZXJMaXN0ID0gcmVhZGVyc0NhY2hlLmdldChtdCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWRlckxpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyc0NhY2hlLnB1dChtdCwgcmVhZGVyTGlzdCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmVhZGVyTGlzdC5hZGQobW9kZWwucHJvdmlkZXIoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSB3cml0ZXJzCisgICAgICAgIHRoaXMud3JpdGVycyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgICAgIGZpbmFsIFNldDxNZXNzYWdlQm9keVdyaXRlcj4gY3VzdG9tTWJ3cyA9IFByb3ZpZGVycy5nZXRDdXN0b21Qcm92aWRlcnMoaW5qZWN0aW9uTWFuYWdlciwgTWVzc2FnZUJvZHlXcml0ZXIuY2xhc3MpOworICAgICAgICBmaW5hbCBTZXQ8TWVzc2FnZUJvZHlXcml0ZXI+IG1id3MgPSBQcm92aWRlcnMuZ2V0UHJvdmlkZXJzKGluamVjdGlvbk1hbmFnZXIsIE1lc3NhZ2VCb2R5V3JpdGVyLmNsYXNzKTsKKworICAgICAgICBhZGRXcml0ZXJzKHdyaXRlcnMsIGN1c3RvbU1id3MsIHRydWUpOworICAgICAgICBtYndzLnJlbW92ZUFsbChjdXN0b21NYndzKTsKKyAgICAgICAgYWRkV3JpdGVycyh3cml0ZXJzLCBtYndzLCBmYWxzZSk7CisKKyAgICAgICAgaWYgKGxlZ2FjeVByb3ZpZGVyT3JkZXJpbmcpIHsKKyAgICAgICAgICAgIHdyaXRlcnMuc29ydChuZXcgTGVnYWN5V29ya2VyQ29tcGFyYXRvcjw+KE1lc3NhZ2VCb2R5V3JpdGVyLmNsYXNzKSk7CisKKyAgICAgICAgICAgIGZvciAoZmluYWwgQWJzdHJhY3RFbnRpdHlQcm92aWRlck1vZGVsPE1lc3NhZ2VCb2R5V3JpdGVyPiBtb2RlbCA6IHdyaXRlcnMpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIE1lZGlhVHlwZSBtdCA6IG1vZGVsLmRlY2xhcmVkVHlwZXMoKSkgeworICAgICAgICAgICAgICAgICAgICBMaXN0PE1lc3NhZ2VCb2R5V3JpdGVyPiB3cml0ZXJMaXN0ID0gd3JpdGVyc0NhY2hlLmdldChtdCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdyaXRlckxpc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyc0NhY2hlLnB1dChtdCwgd3JpdGVyTGlzdCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgd3JpdGVyTGlzdC5hZGQobW9kZWwucHJvdmlkZXIoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGFyZXMgMiBpbnN0YW5jZXMgaW1wbGVtZW50aW5nL2luaGVyaXRpbmcgdGhlIHNhbWUgc3VwZXItdHlwZSBhbmQgcmV0dXJucworICAgICAqIHdoaWNoIG9mIHRoZSB0d28gaW5zdGFuY2VzIGhhcyB0aGUgc3VwZXItdHlwZSBkZWNsYXJhdGlvbiBjbG9zZXIgaW4gaXQncworICAgICAqIGluaGVyaXRhbmNlIGhpZXJhcmNoeSB0cmVlLgorICAgICAqIDxwLz4KKyAgICAgKiBUaGUgY29tcGFyYXRvciBpcyBvcHRpbWl6ZWQgdG8gY2FjaGUgcmVzdWx0cyBvZiB0aGUgcHJldmlvdXMgZGlzdGFuY2UgZGVjbGFyYXRpb24KKyAgICAgKiBjb21wdXRhdGlvbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gPFQ+IGNvbW1vbiBzdXBlci10eXBlIHVzZWQgZm9yIGNvbXB1dGluZyB0aGUgZGVjbGFyYXRpb24gZGlzdGFuY2UgYW5kCisgICAgICogICAgICAgICAgICBjb21wYXJpbmcgaW5zdGFuY2VzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIERlY2xhcmF0aW9uRGlzdGFuY2VDb21wYXJhdG9yPFQ+IGltcGxlbWVudHMgQ29tcGFyYXRvcjxUPiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDbGFzczxUPiBkZWNsYXJlZDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBNYXA8Q2xhc3MsIEludGVnZXI+IGRpc3RhbmNlTWFwID0gbmV3IEhhc2hNYXA8PigpOworCisgICAgICAgIERlY2xhcmF0aW9uRGlzdGFuY2VDb21wYXJhdG9yKGZpbmFsIENsYXNzPFQ+IGRlY2xhcmVkKSB7CisgICAgICAgICAgICB0aGlzLmRlY2xhcmVkID0gZGVjbGFyZWQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBjb21wYXJlKGZpbmFsIFQgbzEsIGZpbmFsIFQgbzIpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBkMSA9IGdldERpc3RhbmNlKG8xKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBkMiA9IGdldERpc3RhbmNlKG8yKTsKKyAgICAgICAgICAgIHJldHVybiBkMiAtIGQxOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgZ2V0RGlzdGFuY2UoZmluYWwgVCB0KSB7CisgICAgICAgICAgICBJbnRlZ2VyIGRpc3RhbmNlID0gZGlzdGFuY2VNYXAuZ2V0KHQuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICBpZiAoZGlzdGFuY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBkaXN0YW5jZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgRGVjbGFyaW5nQ2xhc3NJbnRlcmZhY2VQYWlyIHAgPSBSZWZsZWN0aW9uSGVscGVyLmdldENsYXNzKAorICAgICAgICAgICAgICAgICAgICB0LmdldENsYXNzKCksIGRlY2xhcmVkKTsKKworICAgICAgICAgICAgZmluYWwgQ2xhc3NbXSBhcyA9IFJlZmxlY3Rpb25IZWxwZXIuZ2V0UGFyYW1ldGVyaXplZENsYXNzQXJndW1lbnRzKHApOworICAgICAgICAgICAgQ2xhc3MgYSA9IChhcyAhPSBudWxsKSA/IGFzWzBdIDogbnVsbDsKKyAgICAgICAgICAgIGRpc3RhbmNlID0gMDsKKyAgICAgICAgICAgIHdoaWxlIChhICE9IG51bGwgJiYgYSAhPSBPYmplY3QuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICBkaXN0YW5jZSsrOworICAgICAgICAgICAgICAgIGEgPSBhLmdldFN1cGVyY2xhc3MoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGlzdGFuY2VNYXAucHV0KHQuZ2V0Q2xhc3MoKSwgZGlzdGFuY2UpOworICAgICAgICAgICAgcmV0dXJuIGRpc3RhbmNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICoge0BsaW5rIEFic3RyYWN0RW50aXR5UHJvdmlkZXJNb2RlbH0gY29tcGFyYXRvcgorICAgICAqIHdoaWNoIHdvcmtzIGFzIGl0IGlzIGRlc2NyaWJlZCBpbiBKQVgtUlMgMi54IHNwZWNpZmljYXRpb24uCisgICAgICoKKyAgICAgKiBQYWlycyBhcmUgc29ydGVkIGJ5IGRpc3RhbmNlIGZyb20gcmVxdWlyZWQgdHlwZSwgbWVkaWEgdHlwZSBhbmQgY3VzdG9tL3Byb3ZpZGVkIChwcm92aWRlZCBnb2VzIGZpcnN0KS4KKyAgICAgKgorICAgICAqIEBwYXJhbSA8VD4gTWVzc2FnZUJvZHlSZWFkZXIgb3IgTWVzc2FnZUJvZHlXcml0ZXIuCisgICAgICogQHNlZSBEZWNsYXJhdGlvbkRpc3RhbmNlQ29tcGFyYXRvcgorICAgICAqIEBzZWUgI01FRElBX1RZUEVfS0VZX0NPTVBBUkFUT1IKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBXb3JrZXJDb21wYXJhdG9yPFQ+IGltcGxlbWVudHMgQ29tcGFyYXRvcjxBYnN0cmFjdEVudGl0eVByb3ZpZGVyTW9kZWw8VD4+IHsKKworICAgICAgICBmaW5hbCBDbGFzcyB3YW50ZWRUeXBlOworICAgICAgICBmaW5hbCBNZWRpYVR5cGUgd2FudGVkTWVkaWFUeXBlOworCisgICAgICAgIHByaXZhdGUgV29ya2VyQ29tcGFyYXRvcihmaW5hbCBDbGFzcyB3YW50ZWRUeXBlLCBmaW5hbCBNZWRpYVR5cGUgd2FudGVkTWVkaWFUeXBlKSB7CisgICAgICAgICAgICB0aGlzLndhbnRlZFR5cGUgPSB3YW50ZWRUeXBlOworICAgICAgICAgICAgdGhpcy53YW50ZWRNZWRpYVR5cGUgPSB3YW50ZWRNZWRpYVR5cGU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBjb21wYXJlKGZpbmFsIEFic3RyYWN0RW50aXR5UHJvdmlkZXJNb2RlbDxUPiBtb2RlbEEsIGZpbmFsIEFic3RyYWN0RW50aXR5UHJvdmlkZXJNb2RlbDxUPiBtb2RlbEIpIHsKKworICAgICAgICAgICAgZmluYWwgaW50IGRpc3RhbmNlID0gY29tcGFyZVR5cGVEaXN0YW5jZXMobW9kZWxBLnByb3ZpZGVkVHlwZSgpLCBtb2RlbEIucHJvdmlkZWRUeXBlKCkpOworICAgICAgICAgICAgaWYgKGRpc3RhbmNlICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGlzdGFuY2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIGludCBtZWRpYVR5cGVDb21wYXJpc29uID0gZ2V0TWVkaWFUeXBlRGlzdGFuY2Uod2FudGVkTWVkaWFUeXBlLCBtb2RlbEEuZGVjbGFyZWRUeXBlcygpKQorICAgICAgICAgICAgICAgICAgICAtIGdldE1lZGlhVHlwZURpc3RhbmNlKHdhbnRlZE1lZGlhVHlwZSwgbW9kZWxCLmRlY2xhcmVkVHlwZXMoKSk7CisgICAgICAgICAgICBpZiAobWVkaWFUeXBlQ29tcGFyaXNvbiAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1lZGlhVHlwZUNvbXBhcmlzb247CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtb2RlbEEuaXNDdXN0b20oKSBeIG1vZGVsQi5pc0N1c3RvbSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChtb2RlbEEuaXNDdXN0b20oKSkgPyAtMSA6IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgaW50IGdldE1lZGlhVHlwZURpc3RhbmNlKGZpbmFsIE1lZGlhVHlwZSB3YW50ZWQsIGZpbmFsIExpc3Q8TWVkaWFUeXBlPiBtdGwpIHsKKyAgICAgICAgICAgIGlmICh3YW50ZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgZGlzdGFuY2UgPSAyOworCisgICAgICAgICAgICBmb3IgKGZpbmFsIE1lZGlhVHlwZSBtdCA6IG10bCkgeworICAgICAgICAgICAgICAgIGlmIChNZWRpYVR5cGVzLnR5cGVFcXVhbCh3YW50ZWQsIG10KSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoZGlzdGFuY2UgPiAxICYmIE1lZGlhVHlwZXMudHlwZUVxdWFsKE1lZGlhVHlwZXMuZ2V0VHlwZVdpbGRDYXJ0KHdhbnRlZCksIG10KSkgeworICAgICAgICAgICAgICAgICAgICBkaXN0YW5jZSA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZGlzdGFuY2U7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGludCBjb21wYXJlVHlwZURpc3RhbmNlcyhmaW5hbCBDbGFzczw/PiBwcm92aWRlckNsYXNzUGFyYW0xLCBmaW5hbCBDbGFzczw/PiBwcm92aWRlckNsYXNzUGFyYW0yKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VHlwZURpc3RhbmNlKHByb3ZpZGVyQ2xhc3NQYXJhbTEpIC0gZ2V0VHlwZURpc3RhbmNlKHByb3ZpZGVyQ2xhc3NQYXJhbTIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgZ2V0VHlwZURpc3RhbmNlKGZpbmFsIENsYXNzPD8+IGNsYXNzUGFyYW0pIHsKKyAgICAgICAgICAgIC8vIGNhY2hlPworCisgICAgICAgICAgICBDbGFzczw/PiB0bXAxID0gd2FudGVkVHlwZTsKKyAgICAgICAgICAgIENsYXNzPD8+IHRtcDIgPSBjbGFzc1BhcmFtOworCisgICAgICAgICAgICBmaW5hbCBJdGVyYXRvcjxDbGFzczw/Pj4gaXQxID0gZ2V0Q2xhc3NIaWVyYXJjaHlJdGVyYXRvcih0bXAxKTsKKyAgICAgICAgICAgIGZpbmFsIEl0ZXJhdG9yPENsYXNzPD8+PiBpdDIgPSBnZXRDbGFzc0hpZXJhcmNoeUl0ZXJhdG9yKHRtcDIpOworCisgICAgICAgICAgICBpbnQgZGlzdGFuY2UgPSAwOworICAgICAgICAgICAgd2hpbGUgKCF3YW50ZWRUeXBlLmVxdWFscyh0bXAyKSAmJiAhY2xhc3NQYXJhbS5lcXVhbHModG1wMSkpIHsKKyAgICAgICAgICAgICAgICBkaXN0YW5jZSsrOworCisgICAgICAgICAgICAgICAgaWYgKCF3YW50ZWRUeXBlLmVxdWFscyh0bXAyKSkgeworICAgICAgICAgICAgICAgICAgICB0bXAyID0gaXQyLmhhc05leHQoKSA/IGl0Mi5uZXh0KCkgOiBudWxsOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghY2xhc3NQYXJhbS5lcXVhbHModG1wMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wMSA9IGl0MS5oYXNOZXh0KCkgPyBpdDEubmV4dCgpIDogbnVsbDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAodG1wMiA9PSBudWxsICYmIHRtcDEgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gSW50ZWdlci5NQVhfVkFMVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZGlzdGFuY2U7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEl0ZXJhdG9yPENsYXNzPD8+PiBnZXRDbGFzc0hpZXJhcmNoeUl0ZXJhdG9yKGZpbmFsIENsYXNzPD8+IGNsYXNzUGFyYW0pIHsKKyAgICAgICAgICAgIGlmIChjbGFzc1BhcmFtID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuPENsYXNzPD8+PmVtcHR5TGlzdCgpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIEFycmF5TGlzdDxDbGFzczw/Pj4gY2xhc3NlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgZmluYWwgTGlua2VkTGlzdDxDbGFzczw/Pj4gdW5wcm9jZXNzZWQgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisKKyAgICAgICAgICAgIC8vIE9iamVjdCBpcyBzcGVjaWFsIC0gbmVlZHMgdG8gYmUgYWx3YXlzIHRoZSBmdXJ0aGVzdCB0eXBlLgorICAgICAgICAgICAgYm9vbGVhbiBvYmplY3RGb3VuZCA9IGZhbHNlOworCisgICAgICAgICAgICB1bnByb2Nlc3NlZC5hZGQoY2xhc3NQYXJhbSk7CisgICAgICAgICAgICB3aGlsZSAoIXVucHJvY2Vzc2VkLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IGNsYXp6ID0gdW5wcm9jZXNzZWQucmVtb3ZlRmlyc3QoKTsKKworICAgICAgICAgICAgICAgIGlmIChPYmplY3QuY2xhc3MuZXF1YWxzKGNsYXp6KSkgeworICAgICAgICAgICAgICAgICAgICBvYmplY3RGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY2xhc3Nlcy5hZGQoY2xhenopOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB1bnByb2Nlc3NlZC5hZGRBbGwoQXJyYXlzLmFzTGlzdChjbGF6ei5nZXRJbnRlcmZhY2VzKCkpKTsKKworICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IHN1cGVyY2xhenogPSBjbGF6ei5nZXRTdXBlcmNsYXNzKCk7CisgICAgICAgICAgICAgICAgaWYgKHN1cGVyY2xhenogIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB1bnByb2Nlc3NlZC5hZGQoc3VwZXJjbGF6eik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAob2JqZWN0Rm91bmQpIHsKKyAgICAgICAgICAgICAgICBjbGFzc2VzLmFkZChPYmplY3QuY2xhc3MpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gY2xhc3Nlcy5pdGVyYXRvcigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICoge0BsaW5rIEFic3RyYWN0RW50aXR5UHJvdmlkZXJNb2RlbH0gY29tcGFyYXRvciB3aGljaAorICAgICAqIHdvcmtzIGFzIGl0IGlzIGRlc2NyaWJlZCBpbiBKQVgtUlMgMS54IHNwZWNpZmljYXRpb24uCisgICAgICoKKyAgICAgKiBQYWlycyBhcmUgc29ydGVkIGJ5IGN1c3RvbS9wcm92aWRlZCAoY3VzdG9tIGdvZXMgZmlyc3QpLCBtZWRpYSB0eXBlIGFuZCBkZWNsYXJhdGlvbiBkaXN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSA8VD4gTWVzc2FnZUJvZHlSZWFkZXIgb3IgTWVzc2FnZUJvZHlXcml0ZXIuCisgICAgICogQHNlZSBEZWNsYXJhdGlvbkRpc3RhbmNlQ29tcGFyYXRvcgorICAgICAqIEBzZWUgI01FRElBX1RZUEVfS0VZX0NPTVBBUkFUT1IKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBMZWdhY3lXb3JrZXJDb21wYXJhdG9yPFQ+IGltcGxlbWVudHMgQ29tcGFyYXRvcjxBYnN0cmFjdEVudGl0eVByb3ZpZGVyTW9kZWw8VD4+IHsKKworICAgICAgICBmaW5hbCBEZWNsYXJhdGlvbkRpc3RhbmNlQ29tcGFyYXRvcjxUPiBkaXN0YW5jZUNvbXBhcmF0b3I7CisKKyAgICAgICAgcHJpdmF0ZSBMZWdhY3lXb3JrZXJDb21wYXJhdG9yKGZpbmFsIENsYXNzPFQ+IHR5cGUpIHsKKyAgICAgICAgICAgIGRpc3RhbmNlQ29tcGFyYXRvciA9IG5ldyBEZWNsYXJhdGlvbkRpc3RhbmNlQ29tcGFyYXRvcjw+KHR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShmaW5hbCBBYnN0cmFjdEVudGl0eVByb3ZpZGVyTW9kZWw8VD4gbW9kZWxBLCBmaW5hbCBBYnN0cmFjdEVudGl0eVByb3ZpZGVyTW9kZWw8VD4gbW9kZWxCKSB7CisKKyAgICAgICAgICAgIGlmIChtb2RlbEEuaXNDdXN0b20oKSBeIG1vZGVsQi5pc0N1c3RvbSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChtb2RlbEEuaXNDdXN0b20oKSkgPyAtMSA6IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbXRBID0gbW9kZWxBLmRlY2xhcmVkVHlwZXMoKS5nZXQoMCk7CisgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbXRCID0gbW9kZWxCLmRlY2xhcmVkVHlwZXMoKS5nZXQoMCk7CisKKyAgICAgICAgICAgIGZpbmFsIGludCBtZWRpYVR5cGVDb21wYXJpc29uID0gTWVkaWFUeXBlcy5QQVJUSUFMX09SREVSX0NPTVBBUkFUT1IuY29tcGFyZShtdEEsIG10Qik7CisgICAgICAgICAgICBpZiAobWVkaWFUeXBlQ29tcGFyaXNvbiAhPSAwICYmICFtdEEuaXNDb21wYXRpYmxlKG10QikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWVkaWFUeXBlQ29tcGFyaXNvbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBkaXN0YW5jZUNvbXBhcmF0b3IuY29tcGFyZShtb2RlbEEucHJvdmlkZXIoKSwgbW9kZWxCLnByb3ZpZGVyKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTW9kZWxMb29rdXBLZXkgeworCisgICAgICAgIGZpbmFsIENsYXNzPD8+IGNsYXp6OworICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlOworCisgICAgICAgIHByaXZhdGUgTW9kZWxMb29rdXBLZXkoZmluYWwgQ2xhc3M8Pz4gY2xhenosIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHRoaXMuY2xhenogPSBjbGF6ejsKKyAgICAgICAgICAgIHRoaXMubWVkaWFUeXBlID0gbWVkaWFUeXBlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3QgbykgeworICAgICAgICAgICAgaWYgKHRoaXMgPT0gbykgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgTW9kZWxMb29rdXBLZXkgdGhhdCA9IChNb2RlbExvb2t1cEtleSkgbzsKKworICAgICAgICAgICAgcmV0dXJuICEoY2xhenogIT0gbnVsbCA/ICFjbGF6ei5lcXVhbHModGhhdC5jbGF6eikgOiB0aGF0LmNsYXp6ICE9IG51bGwpCisgICAgICAgICAgICAgICAgICAgICYmICEobWVkaWFUeXBlICE9IG51bGwgPyAhbWVkaWFUeXBlLmVxdWFscyh0aGF0Lm1lZGlhVHlwZSkgOiB0aGF0Lm1lZGlhVHlwZSAhPSBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgaW50IHJlc3VsdCA9IGNsYXp6ICE9IG51bGwgPyBjbGF6ei5oYXNoQ29kZSgpIDogMDsKKyAgICAgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgKG1lZGlhVHlwZSAhPSBudWxsID8gbWVkaWFUeXBlLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFJlYWRlcnMoZmluYWwgTGlzdDxSZWFkZXJNb2RlbD4gbW9kZWxzLCBmaW5hbCBTZXQ8TWVzc2FnZUJvZHlSZWFkZXI+IHJlYWRlcnMsIGZpbmFsIGJvb2xlYW4gY3VzdG9tKSB7CisgICAgICAgIGZvciAoZmluYWwgTWVzc2FnZUJvZHlSZWFkZXIgcHJvdmlkZXIgOiByZWFkZXJzKSB7CisgICAgICAgICAgICBmaW5hbCBMaXN0PE1lZGlhVHlwZT4gdmFsdWVzID0gTWVkaWFUeXBlcy5jcmVhdGVGcm9tKHByb3ZpZGVyLmdldENsYXNzKCkuZ2V0QW5ub3RhdGlvbihDb25zdW1lcy5jbGFzcykpOworICAgICAgICAgICAgbW9kZWxzLmFkZChuZXcgUmVhZGVyTW9kZWwocHJvdmlkZXIsIHZhbHVlcywgY3VzdG9tKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFdyaXRlcnMoZmluYWwgTGlzdDxXcml0ZXJNb2RlbD4gbW9kZWxzLCBmaW5hbCBTZXQ8TWVzc2FnZUJvZHlXcml0ZXI+IHdyaXRlcnMsIGZpbmFsIGJvb2xlYW4gY3VzdG9tKSB7CisgICAgICAgIGZvciAoZmluYWwgTWVzc2FnZUJvZHlXcml0ZXIgcHJvdmlkZXIgOiB3cml0ZXJzKSB7CisgICAgICAgICAgICBmaW5hbCBMaXN0PE1lZGlhVHlwZT4gdmFsdWVzID0gTWVkaWFUeXBlcy5jcmVhdGVGcm9tKHByb3ZpZGVyLmdldENsYXNzKCkuZ2V0QW5ub3RhdGlvbihQcm9kdWNlcy5jbGFzcykpOworICAgICAgICAgICAgbW9kZWxzLmFkZChuZXcgV3JpdGVyTW9kZWwocHJvdmlkZXIsIHZhbHVlcywgY3VzdG9tKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBNZXNzYWdlQm9keVdvcmtlcnMKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWFwPE1lZGlhVHlwZSwgTGlzdDxNZXNzYWdlQm9keVJlYWRlcj4+IGdldFJlYWRlcnMoZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICBmaW5hbCBNYXA8TWVkaWFUeXBlLCBMaXN0PE1lc3NhZ2VCb2R5UmVhZGVyPj4gc3ViU2V0ID0gbmV3IEtleUNvbXBhcmF0b3JMaW5rZWRIYXNoTWFwPD4oTUVESUFfVFlQRV9LRVlfQ09NUEFSQVRPUik7CisgICAgICAgIGdldENvbXBhdGlibGVQcm92aWRlcnNNYXAobWVkaWFUeXBlLCByZWFkZXJzLCBzdWJTZXQpOworICAgICAgICByZXR1cm4gc3ViU2V0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNYXA8TWVkaWFUeXBlLCBMaXN0PE1lc3NhZ2VCb2R5V3JpdGVyPj4gZ2V0V3JpdGVycyhmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIGZpbmFsIE1hcDxNZWRpYVR5cGUsIExpc3Q8TWVzc2FnZUJvZHlXcml0ZXI+PiBzdWJTZXQgPSBuZXcgS2V5Q29tcGFyYXRvckxpbmtlZEhhc2hNYXA8PihNRURJQV9UWVBFX0tFWV9DT01QQVJBVE9SKTsKKyAgICAgICAgZ2V0Q29tcGF0aWJsZVByb3ZpZGVyc01hcChtZWRpYVR5cGUsIHdyaXRlcnMsIHN1YlNldCk7CisgICAgICAgIHJldHVybiBzdWJTZXQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyByZWFkZXJzVG9TdHJpbmcoZmluYWwgTWFwPE1lZGlhVHlwZSwgTGlzdDxNZXNzYWdlQm9keVJlYWRlcj4+IHJlYWRlcnMpIHsKKyAgICAgICAgcmV0dXJuIHRvU3RyaW5nKHJlYWRlcnMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgd3JpdGVyc1RvU3RyaW5nKGZpbmFsIE1hcDxNZWRpYVR5cGUsIExpc3Q8TWVzc2FnZUJvZHlXcml0ZXI+PiB3cml0ZXJzKSB7CisgICAgICAgIHJldHVybiB0b1N0cmluZyh3cml0ZXJzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIDxUPiBTdHJpbmcgdG9TdHJpbmcoZmluYWwgTWFwPE1lZGlhVHlwZSwgTGlzdDxUPj4gc2V0KSB7CisgICAgICAgIGZpbmFsIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgZmluYWwgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoc3cpOworICAgICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxNZWRpYVR5cGUsIExpc3Q8VD4+IGUgOiBzZXQuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgcHcuYXBwZW5kKGUuZ2V0S2V5KCkudG9TdHJpbmcoKSkucHJpbnRsbigiIC0+Iik7CisgICAgICAgICAgICBmb3IgKGZpbmFsIFQgdCA6IGUuZ2V0VmFsdWUoKSkgeworICAgICAgICAgICAgICAgIHB3LmFwcGVuZCgiICAiKS5wcmludGxuKHQuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHB3LmZsdXNoKCk7CisgICAgICAgIHJldHVybiBzdy50b1N0cmluZygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gTWVzc2FnZUJvZHlSZWFkZXI8VD4gZ2V0TWVzc2FnZUJvZHlSZWFkZXIoZmluYWwgQ2xhc3M8VD4gYywgZmluYWwgVHlwZSB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICByZXR1cm4gZ2V0TWVzc2FnZUJvZHlSZWFkZXIoYywgdCwgYXMsIG1lZGlhVHlwZSwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxUPiBNZXNzYWdlQm9keVJlYWRlcjxUPiBnZXRNZXNzYWdlQm9keVJlYWRlcihmaW5hbCBDbGFzczxUPiBjLCBmaW5hbCBUeXBlIHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUHJvcGVydGllc0RlbGVnYXRlIHByb3BlcnRpZXNEZWxlZ2F0ZSkgeworCisgICAgICAgIE1lc3NhZ2VCb2R5UmVhZGVyPFQ+IHAgPSBudWxsOworICAgICAgICBpZiAobGVnYWN5UHJvdmlkZXJPcmRlcmluZykgeworICAgICAgICAgICAgaWYgKG1lZGlhVHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcCA9IF9nZXRNZXNzYWdlQm9keVJlYWRlcihjLCB0LCBhcywgbWVkaWFUeXBlLCBtZWRpYVR5cGUsIHByb3BlcnRpZXNEZWxlZ2F0ZSk7CisgICAgICAgICAgICAgICAgaWYgKHAgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBwID0gX2dldE1lc3NhZ2VCb2R5UmVhZGVyKGMsIHQsIGFzLCBtZWRpYVR5cGUsIE1lZGlhVHlwZXMuZ2V0VHlwZVdpbGRDYXJ0KG1lZGlhVHlwZSksIHByb3BlcnRpZXNEZWxlZ2F0ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHAgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHAgPSBfZ2V0TWVzc2FnZUJvZHlSZWFkZXIoYywgdCwgYXMsIG1lZGlhVHlwZSwgTWVkaWFUeXBlLldJTERDQVJEX1RZUEUsIHByb3BlcnRpZXNEZWxlZ2F0ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwID0gX2dldE1lc3NhZ2VCb2R5UmVhZGVyKGMsIHQsIGFzLCBtZWRpYVR5cGUsIHJlYWRlcnMsIHByb3BlcnRpZXNEZWxlZ2F0ZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgTGlzdDxNZWRpYVR5cGU+IGdldE1lc3NhZ2VCb2R5UmVhZGVyTWVkaWFUeXBlcyhmaW5hbCBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zKSB7CisgICAgICAgIGZpbmFsIFNldDxNZWRpYVR5cGU+IHJlYWRhYmxlTWVkaWFUeXBlcyA9IG5ldyBMaW5rZWRIYXNoU2V0PD4oKTsKKworICAgICAgICBmb3IgKGZpbmFsIFJlYWRlck1vZGVsIG1vZGVsIDogcmVhZGVycykgeworICAgICAgICAgICAgYm9vbGVhbiByZWFkYWJsZVdvcmtlciA9IGZhbHNlOworCisgICAgICAgICAgICBmb3IgKGZpbmFsIE1lZGlhVHlwZSBtdCA6IG1vZGVsLmRlY2xhcmVkVHlwZXMoKSkgeworICAgICAgICAgICAgICAgIGlmIChtb2RlbC5pc1JlYWRhYmxlKHR5cGUsIGdlbmVyaWNUeXBlLCBhbm5vdGF0aW9ucywgbXQpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlYWRhYmxlTWVkaWFUeXBlcy5hZGQobXQpOworICAgICAgICAgICAgICAgICAgICByZWFkYWJsZVdvcmtlciA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFyZWFkYWJsZU1lZGlhVHlwZXMuY29udGFpbnMoTWVkaWFUeXBlLldJTERDQVJEX1RZUEUpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiByZWFkYWJsZVdvcmtlcgorICAgICAgICAgICAgICAgICAgICAgICAgJiYgbW9kZWwuZGVjbGFyZWRUeXBlcygpLmNvbnRhaW5zKE1lZGlhVHlwZS5XSUxEQ0FSRF9UWVBFKSkgeworICAgICAgICAgICAgICAgICAgICByZWFkYWJsZU1lZGlhVHlwZXMuYWRkKE1lZGlhVHlwZS5XSUxEQ0FSRF9UWVBFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBMaXN0PE1lZGlhVHlwZT4gbXRsID0gbmV3IEFycmF5TGlzdDw+KHJlYWRhYmxlTWVkaWFUeXBlcyk7CisgICAgICAgIG10bC5zb3J0KE1lZGlhVHlwZXMuUEFSVElBTF9PUkRFUl9DT01QQVJBVE9SKTsKKyAgICAgICAgcmV0dXJuIG10bDsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwcml2YXRlIDxUPiBib29sZWFuIGlzQ29tcGF0aWJsZShmaW5hbCBBYnN0cmFjdEVudGl0eVByb3ZpZGVyTW9kZWw8VD4gbW9kZWwsIGZpbmFsIENsYXNzIGMsIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgaWYgKG1vZGVsLnByb3ZpZGVkVHlwZSgpLmVxdWFscyhPYmplY3QuY2xhc3MpCisgICAgICAgICAgICAgICAgfHwgLy8gbG9va3Mgd2VpcmQuIENvdWxkLyhzaG91bGQ/KSBiZSBzZXBhcmF0ZWQgdG8gV3JpdGVyL1JlYWRlciBjaGVjaworICAgICAgICAgICAgICAgIG1vZGVsLnByb3ZpZGVkVHlwZSgpLmlzQXNzaWduYWJsZUZyb20oYykKKyAgICAgICAgICAgICAgICB8fCBjLmlzQXNzaWduYWJsZUZyb20obW9kZWwucHJvdmlkZWRUeXBlKCkpCisgICAgICAgICAgICAgICAgKSB7CisgICAgICAgICAgICBmb3IgKGZpbmFsIE1lZGlhVHlwZSBtdCA6IG1vZGVsLmRlY2xhcmVkVHlwZXMoKSkgeworICAgICAgICAgICAgICAgIGlmIChtZWRpYVR5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1lZGlhVHlwZS5pc0NvbXBhdGlibGUobXQpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwcml2YXRlIDxUPiBNZXNzYWdlQm9keVJlYWRlcjxUPiBfZ2V0TWVzc2FnZUJvZHlSZWFkZXIoZmluYWwgQ2xhc3M8VD4gYywgZmluYWwgVHlwZSB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8UmVhZGVyTW9kZWw+IG1vZGVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUHJvcGVydGllc0RlbGVnYXRlIHByb3BlcnRpZXNEZWxlZ2F0ZSkgeworCisgICAgICAgIC8vIEVuc3VyZSBhIHBhcmFtZXRlci1sZXNzIGxvb2t1cCB0eXBlIHRvIHByZXZlbnQgZXhjZXNzaXZlIG1lbW9yeSBjb25zdW1wdGlvbgorICAgICAgICAvLyByZXBvcnRlZCBpbiBKRVJTRVktMjI5NworICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbG9va3VwVHlwZSA9IG1lZGlhVHlwZSA9PSBudWxsIHx8IG1lZGlhVHlwZS5nZXRQYXJhbWV0ZXJzKCkuaXNFbXB0eSgpCisgICAgICAgICAgICAgICAgPyBtZWRpYVR5cGUKKyAgICAgICAgICAgICAgICA6IG5ldyBNZWRpYVR5cGUobWVkaWFUeXBlLmdldFR5cGUoKSwgbWVkaWFUeXBlLmdldFN1YnR5cGUoKSk7CisKKyAgICAgICAgZmluYWwgTW9kZWxMb29rdXBLZXkgbG9va3VwS2V5ID0gbmV3IE1vZGVsTG9va3VwS2V5KGMsIGxvb2t1cFR5cGUpOworICAgICAgICBMaXN0PFJlYWRlck1vZGVsPiByZWFkZXJzID0gbWJyTG9va3VwQ2FjaGUuZ2V0KGxvb2t1cEtleSk7CisgICAgICAgIGlmIChyZWFkZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlYWRlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgICAgICAgICAgZm9yIChmaW5hbCBSZWFkZXJNb2RlbCBtb2RlbCA6IG1vZGVscykgeworICAgICAgICAgICAgICAgIGlmIChpc0NvbXBhdGlibGUobW9kZWwsIGMsIG1lZGlhVHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVhZGVycy5hZGQobW9kZWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlYWRlcnMuc29ydChuZXcgV29ya2VyQ29tcGFyYXRvcjw+KGMsIG1lZGlhVHlwZSkpOworICAgICAgICAgICAgbWJyTG9va3VwQ2FjaGUucHV0KGxvb2t1cEtleSwgcmVhZGVycyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVhZGVycy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgVHJhY2luZ0xvZ2dlciB0cmFjaW5nTG9nZ2VyID0gVHJhY2luZ0xvZ2dlci5nZXRJbnN0YW5jZShwcm9wZXJ0aWVzRGVsZWdhdGUpOworICAgICAgICBNZXNzYWdlQm9keVJlYWRlcjxUPiBzZWxlY3RlZCA9IG51bGw7CisgICAgICAgIGZpbmFsIEl0ZXJhdG9yPFJlYWRlck1vZGVsPiBpdGVyYXRvciA9IHJlYWRlcnMuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgZmluYWwgUmVhZGVyTW9kZWwgbW9kZWwgPSBpdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICBpZiAobW9kZWwuaXNSZWFkYWJsZShjLCB0LCBhcywgbWVkaWFUeXBlKSkgeworICAgICAgICAgICAgICAgIHNlbGVjdGVkID0gKE1lc3NhZ2VCb2R5UmVhZGVyPFQ+KSBtb2RlbC5wcm92aWRlcigpOworICAgICAgICAgICAgICAgIHRyYWNpbmdMb2dnZXIubG9nKE1zZ1RyYWNlRXZlbnQuTUJSX1NFTEVDVEVELCBzZWxlY3RlZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cmFjaW5nTG9nZ2VyLmxvZyhNc2dUcmFjZUV2ZW50Lk1CUl9OT1RfUkVBREFCTEUsIG1vZGVsLnByb3ZpZGVyKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRyYWNpbmdMb2dnZXIuaXNMb2dFbmFibGVkKE1zZ1RyYWNlRXZlbnQuTUJSX1NLSVBQRUQpKSB7CisgICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgUmVhZGVyTW9kZWwgbW9kZWwgPSBpdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICAgICAgdHJhY2luZ0xvZ2dlci5sb2coTXNnVHJhY2VFdmVudC5NQlJfU0tJUFBFRCwgbW9kZWwucHJvdmlkZXIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc2VsZWN0ZWQ7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHJpdmF0ZSA8VD4gTWVzc2FnZUJvZHlSZWFkZXI8VD4gX2dldE1lc3NhZ2VCb2R5UmVhZGVyKGZpbmFsIENsYXNzPFQ+IGMsIGZpbmFsIFR5cGUgdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLCBmaW5hbCBNZWRpYVR5cGUgbG9va3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBQcm9wZXJ0aWVzRGVsZWdhdGUgcHJvcGVydGllc0RlbGVnYXRlKSB7CisKKyAgICAgICAgZmluYWwgTGlzdDxNZXNzYWdlQm9keVJlYWRlcj4gcmVhZGVycyA9IHJlYWRlcnNDYWNoZS5nZXQobG9va3VwKTsKKworICAgICAgICBpZiAocmVhZGVycyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFRyYWNpbmdMb2dnZXIgdHJhY2luZ0xvZ2dlciA9IFRyYWNpbmdMb2dnZXIuZ2V0SW5zdGFuY2UocHJvcGVydGllc0RlbGVnYXRlKTsKKyAgICAgICAgTWVzc2FnZUJvZHlSZWFkZXI8VD4gc2VsZWN0ZWQgPSBudWxsOworICAgICAgICBmaW5hbCBJdGVyYXRvcjxNZXNzYWdlQm9keVJlYWRlcj4gaXRlcmF0b3IgPSByZWFkZXJzLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2VCb2R5UmVhZGVyIHAgPSBpdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICBpZiAoaXNSZWFkYWJsZShwLCBjLCB0LCBhcywgbWVkaWFUeXBlKSkgeworICAgICAgICAgICAgICAgIHNlbGVjdGVkID0gKE1lc3NhZ2VCb2R5UmVhZGVyPFQ+KSBwOworICAgICAgICAgICAgICAgIHRyYWNpbmdMb2dnZXIubG9nKE1zZ1RyYWNlRXZlbnQuTUJSX1NFTEVDVEVELCBzZWxlY3RlZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cmFjaW5nTG9nZ2VyLmxvZyhNc2dUcmFjZUV2ZW50Lk1CUl9OT1RfUkVBREFCTEUsIHApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRyYWNpbmdMb2dnZXIuaXNMb2dFbmFibGVkKE1zZ1RyYWNlRXZlbnQuTUJSX1NLSVBQRUQpKSB7CisgICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgTWVzc2FnZUJvZHlSZWFkZXIgcCA9IGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgICAgICB0cmFjaW5nTG9nZ2VyLmxvZyhNc2dUcmFjZUV2ZW50Lk1CUl9TS0lQUEVELCBwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzZWxlY3RlZDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFQ+IE1lc3NhZ2VCb2R5V3JpdGVyPFQ+IGdldE1lc3NhZ2VCb2R5V3JpdGVyKGZpbmFsIENsYXNzPFQ+IGMsIGZpbmFsIFR5cGUgdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIGdldE1lc3NhZ2VCb2R5V3JpdGVyKGMsIHQsIGFzLCBtZWRpYVR5cGUsIG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gTWVzc2FnZUJvZHlXcml0ZXI8VD4gZ2V0TWVzc2FnZUJvZHlXcml0ZXIoZmluYWwgQ2xhc3M8VD4gYywgZmluYWwgVHlwZSB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFByb3BlcnRpZXNEZWxlZ2F0ZSBwcm9wZXJ0aWVzRGVsZWdhdGUpIHsKKyAgICAgICAgTWVzc2FnZUJvZHlXcml0ZXI8VD4gcCA9IG51bGw7CisKKyAgICAgICAgaWYgKGxlZ2FjeVByb3ZpZGVyT3JkZXJpbmcpIHsKKyAgICAgICAgICAgIGlmIChtZWRpYVR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHAgPSBfZ2V0TWVzc2FnZUJvZHlXcml0ZXIoYywgdCwgYXMsIG1lZGlhVHlwZSwgbWVkaWFUeXBlLCBwcm9wZXJ0aWVzRGVsZWdhdGUpOworICAgICAgICAgICAgICAgIGlmIChwID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcCA9IF9nZXRNZXNzYWdlQm9keVdyaXRlcihjLCB0LCBhcywgbWVkaWFUeXBlLCBNZWRpYVR5cGVzLmdldFR5cGVXaWxkQ2FydChtZWRpYVR5cGUpLCBwcm9wZXJ0aWVzRGVsZWdhdGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwID0gX2dldE1lc3NhZ2VCb2R5V3JpdGVyKGMsIHQsIGFzLCBtZWRpYVR5cGUsIE1lZGlhVHlwZS5XSUxEQ0FSRF9UWVBFLCBwcm9wZXJ0aWVzRGVsZWdhdGUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcCA9IF9nZXRNZXNzYWdlQm9keVdyaXRlcihjLCB0LCBhcywgbWVkaWFUeXBlLCB3cml0ZXJzLCBwcm9wZXJ0aWVzRGVsZWdhdGUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHA7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHJpdmF0ZSA8VD4gTWVzc2FnZUJvZHlXcml0ZXI8VD4gX2dldE1lc3NhZ2VCb2R5V3JpdGVyKGZpbmFsIENsYXNzPFQ+IGMsIGZpbmFsIFR5cGUgdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PFdyaXRlck1vZGVsPiBtb2RlbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFByb3BlcnRpZXNEZWxlZ2F0ZSBwcm9wZXJ0aWVzRGVsZWdhdGUpIHsKKyAgICAgICAgLy8gRW5zdXJlICBhIHBhcmFtZXRlci1sZXNzIGxvb2t1cCB0eXBlIHRvIHByZXZlbnQgZXhjZXNzaXZlIG1lbW9yeSBjb25zdW1wdGlvbgorICAgICAgICAvLyByZXBvcnRlZCBpbiBKRVJTRVktMjI5NworICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbG9va3VwVHlwZSA9IG1lZGlhVHlwZSA9PSBudWxsIHx8IG1lZGlhVHlwZS5nZXRQYXJhbWV0ZXJzKCkuaXNFbXB0eSgpCisgICAgICAgICAgICAgICAgPyBtZWRpYVR5cGUKKyAgICAgICAgICAgICAgICA6IG5ldyBNZWRpYVR5cGUobWVkaWFUeXBlLmdldFR5cGUoKSwgbWVkaWFUeXBlLmdldFN1YnR5cGUoKSk7CisKKyAgICAgICAgZmluYWwgTW9kZWxMb29rdXBLZXkgbG9va3VwS2V5ID0gbmV3IE1vZGVsTG9va3VwS2V5KGMsIGxvb2t1cFR5cGUpOworICAgICAgICBMaXN0PFdyaXRlck1vZGVsPiB3cml0ZXJzID0gbWJ3TG9va3VwQ2FjaGUuZ2V0KGxvb2t1cEtleSk7CisgICAgICAgIGlmICh3cml0ZXJzID09IG51bGwpIHsKKworICAgICAgICAgICAgd3JpdGVycyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgICAgICAgICBmb3IgKGZpbmFsIFdyaXRlck1vZGVsIG1vZGVsIDogbW9kZWxzKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzQ29tcGF0aWJsZShtb2RlbCwgYywgbWVkaWFUeXBlKSkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZXJzLmFkZChtb2RlbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgd3JpdGVycy5zb3J0KG5ldyBXb3JrZXJDb21wYXJhdG9yPD4oYywgbWVkaWFUeXBlKSk7CisgICAgICAgICAgICBtYndMb29rdXBDYWNoZS5wdXQobG9va3VwS2V5LCB3cml0ZXJzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh3cml0ZXJzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBUcmFjaW5nTG9nZ2VyIHRyYWNpbmdMb2dnZXIgPSBUcmFjaW5nTG9nZ2VyLmdldEluc3RhbmNlKHByb3BlcnRpZXNEZWxlZ2F0ZSk7CisgICAgICAgIE1lc3NhZ2VCb2R5V3JpdGVyPFQ+IHNlbGVjdGVkID0gbnVsbDsKKyAgICAgICAgZmluYWwgSXRlcmF0b3I8V3JpdGVyTW9kZWw+IGl0ZXJhdG9yID0gd3JpdGVycy5pdGVyYXRvcigpOworICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBmaW5hbCBXcml0ZXJNb2RlbCBtb2RlbCA9IGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChtb2RlbC5pc1dyaXRlYWJsZShjLCB0LCBhcywgbWVkaWFUeXBlKSkgeworICAgICAgICAgICAgICAgIHNlbGVjdGVkID0gKE1lc3NhZ2VCb2R5V3JpdGVyPFQ+KSBtb2RlbC5wcm92aWRlcigpOworICAgICAgICAgICAgICAgIHRyYWNpbmdMb2dnZXIubG9nKE1zZ1RyYWNlRXZlbnQuTUJXX1NFTEVDVEVELCBzZWxlY3RlZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cmFjaW5nTG9nZ2VyLmxvZyhNc2dUcmFjZUV2ZW50Lk1CV19OT1RfV1JJVEVBQkxFLCBtb2RlbC5wcm92aWRlcigpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0cmFjaW5nTG9nZ2VyLmlzTG9nRW5hYmxlZChNc2dUcmFjZUV2ZW50Lk1CV19TS0lQUEVEKSkgeworICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFdyaXRlck1vZGVsIG1vZGVsID0gaXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgICAgIHRyYWNpbmdMb2dnZXIubG9nKE1zZ1RyYWNlRXZlbnQuTUJXX1NLSVBQRUQsIG1vZGVsLnByb3ZpZGVyKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNlbGVjdGVkOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHByaXZhdGUgPFQ+IE1lc3NhZ2VCb2R5V3JpdGVyPFQ+IF9nZXRNZXNzYWdlQm9keVdyaXRlcihmaW5hbCBDbGFzczxUPiBjLCBmaW5hbCBUeXBlIHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwgZmluYWwgTWVkaWFUeXBlIGxvb2t1cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUHJvcGVydGllc0RlbGVnYXRlIHByb3BlcnRpZXNEZWxlZ2F0ZSkgeworICAgICAgICBmaW5hbCBMaXN0PE1lc3NhZ2VCb2R5V3JpdGVyPiB3cml0ZXJzID0gd3JpdGVyc0NhY2hlLmdldChsb29rdXApOworCisgICAgICAgIGlmICh3cml0ZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgVHJhY2luZ0xvZ2dlciB0cmFjaW5nTG9nZ2VyID0gVHJhY2luZ0xvZ2dlci5nZXRJbnN0YW5jZShwcm9wZXJ0aWVzRGVsZWdhdGUpOworICAgICAgICBNZXNzYWdlQm9keVdyaXRlcjxUPiBzZWxlY3RlZCA9IG51bGw7CisgICAgICAgIGZpbmFsIEl0ZXJhdG9yPE1lc3NhZ2VCb2R5V3JpdGVyPiBpdGVyYXRvciA9IHdyaXRlcnMuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgZmluYWwgTWVzc2FnZUJvZHlXcml0ZXIgcCA9IGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChpc1dyaXRlYWJsZShwLCBjLCB0LCBhcywgbWVkaWFUeXBlKSkgeworICAgICAgICAgICAgICAgIHNlbGVjdGVkID0gKE1lc3NhZ2VCb2R5V3JpdGVyPFQ+KSBwOworICAgICAgICAgICAgICAgIHRyYWNpbmdMb2dnZXIubG9nKE1zZ1RyYWNlRXZlbnQuTUJXX1NFTEVDVEVELCBzZWxlY3RlZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cmFjaW5nTG9nZ2VyLmxvZyhNc2dUcmFjZUV2ZW50Lk1CV19OT1RfV1JJVEVBQkxFLCBwKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0cmFjaW5nTG9nZ2VyLmlzTG9nRW5hYmxlZChNc2dUcmFjZUV2ZW50Lk1CV19TS0lQUEVEKSkgeworICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2VCb2R5V3JpdGVyIHAgPSBpdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICAgICAgdHJhY2luZ0xvZ2dlci5sb2coTXNnVHJhY2VFdmVudC5NQldfU0tJUFBFRCwgcCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNlbGVjdGVkOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIDxUPiB2b2lkIGdldENvbXBhdGlibGVQcm92aWRlcnNNYXAoCisgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgZmluYWwgTGlzdDw/IGV4dGVuZHMgQWJzdHJhY3RFbnRpdHlQcm92aWRlck1vZGVsPFQ+PiBzZXQsCisgICAgICAgICAgICBmaW5hbCBNYXA8TWVkaWFUeXBlLCBMaXN0PFQ+PiBzdWJTZXQpIHsKKworICAgICAgICBpZiAobWVkaWFUeXBlLmlzV2lsZGNhcmRUeXBlKCkpIHsKKyAgICAgICAgICAgIGdldENvbXBhdGlibGVQcm92aWRlcnNMaXN0KG1lZGlhVHlwZSwgc2V0LCBzdWJTZXQpOworICAgICAgICB9IGVsc2UgaWYgKG1lZGlhVHlwZS5pc1dpbGRjYXJkU3VidHlwZSgpKSB7CisgICAgICAgICAgICBnZXRDb21wYXRpYmxlUHJvdmlkZXJzTGlzdChtZWRpYVR5cGUsIHNldCwgc3ViU2V0KTsKKyAgICAgICAgICAgIGdldENvbXBhdGlibGVQcm92aWRlcnNMaXN0KE1lZGlhVHlwZS5XSUxEQ0FSRF9UWVBFLCBzZXQsIHN1YlNldCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnZXRDb21wYXRpYmxlUHJvdmlkZXJzTGlzdChtZWRpYVR5cGUsIHNldCwgc3ViU2V0KTsKKyAgICAgICAgICAgIGdldENvbXBhdGlibGVQcm92aWRlcnNMaXN0KAorICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGVzLmdldFR5cGVXaWxkQ2FydChtZWRpYVR5cGUpLAorICAgICAgICAgICAgICAgICAgICBzZXQsIHN1YlNldCk7CisgICAgICAgICAgICBnZXRDb21wYXRpYmxlUHJvdmlkZXJzTGlzdChNZWRpYVR5cGUuV0lMRENBUkRfVFlQRSwgc2V0LCBzdWJTZXQpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyA8VD4gdm9pZCBnZXRDb21wYXRpYmxlUHJvdmlkZXJzTGlzdCgKKyAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICBmaW5hbCBMaXN0PD8gZXh0ZW5kcyBBYnN0cmFjdEVudGl0eVByb3ZpZGVyTW9kZWw8VD4+IHNldCwKKyAgICAgICAgICAgIGZpbmFsIE1hcDxNZWRpYVR5cGUsIExpc3Q8VD4+IHN1YlNldCkgeworCisgICAgICAgIGZpbmFsIExpc3Q8VD4gcHJvdmlkZXJzID0gc2V0LnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihtb2RlbCAtPiBtb2RlbC5kZWNsYXJlZFR5cGVzKCkuY29udGFpbnMobWVkaWFUeXBlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKEFic3RyYWN0RW50aXR5UHJvdmlkZXJNb2RlbDo6cHJvdmlkZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisKKyAgICAgICAgaWYgKCFwcm92aWRlcnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBzdWJTZXQucHV0KG1lZGlhVHlwZSwgQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChwcm92aWRlcnMpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBMaXN0PE1lZGlhVHlwZT4gZ2V0TWVzc2FnZUJvZHlXcml0ZXJNZWRpYVR5cGVzKGZpbmFsIENsYXNzPD8+IGMsIGZpbmFsIFR5cGUgdCwgZmluYWwgQW5ub3RhdGlvbltdIGFzKSB7CisgICAgICAgIGZpbmFsIFNldDxNZWRpYVR5cGU+IHdyaXRlYWJsZU1lZGlhVHlwZXMgPSBuZXcgTGlua2VkSGFzaFNldDw+KCk7CisKKyAgICAgICAgZm9yIChmaW5hbCBXcml0ZXJNb2RlbCBtb2RlbCA6IHdyaXRlcnMpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gd3JpdGVhYmxlV29ya2VyID0gZmFsc2U7CisKKyAgICAgICAgICAgIGZvciAoZmluYWwgTWVkaWFUeXBlIG10IDogbW9kZWwuZGVjbGFyZWRUeXBlcygpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1vZGVsLmlzV3JpdGVhYmxlKGMsIHQsIGFzLCBtdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVhYmxlTWVkaWFUeXBlcy5hZGQobXQpOworICAgICAgICAgICAgICAgICAgICB3cml0ZWFibGVXb3JrZXIgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghd3JpdGVhYmxlTWVkaWFUeXBlcy5jb250YWlucyhNZWRpYVR5cGUuV0lMRENBUkRfVFlQRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHdyaXRlYWJsZVdvcmtlcgorICAgICAgICAgICAgICAgICAgICAgICAgJiYgbW9kZWwuZGVjbGFyZWRUeXBlcygpLmNvbnRhaW5zKE1lZGlhVHlwZS5XSUxEQ0FSRF9UWVBFKSkgeworICAgICAgICAgICAgICAgICAgICB3cml0ZWFibGVNZWRpYVR5cGVzLmFkZChNZWRpYVR5cGUuV0lMRENBUkRfVFlQRSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZmluYWwgTGlzdDxNZWRpYVR5cGU+IG10bCA9IG5ldyBBcnJheUxpc3Q8Pih3cml0ZWFibGVNZWRpYVR5cGVzKTsKKyAgICAgICAgbXRsLnNvcnQoTWVkaWFUeXBlcy5QQVJUSUFMX09SREVSX0NPTVBBUkFUT1IpOworICAgICAgICByZXR1cm4gbXRsOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZ1bmN0aW9uPFdyaXRlck1vZGVsLCBNZXNzYWdlQm9keVdyaXRlcj4gTU9ERUxfVE9fV1JJVEVSID0gQWJzdHJhY3RFbnRpdHlQcm92aWRlck1vZGVsOjpwcm92aWRlcjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PE1lc3NhZ2VCb2R5V3JpdGVyPiBnZXRNZXNzYWdlQm9keVdyaXRlcnNGb3JUeXBlKGZpbmFsIENsYXNzPD8+IHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIGdldFdyaXRlcnNNb2RlbHNGb3JUeXBlKHR5cGUpLnN0cmVhbSgpLm1hcChNT0RFTF9UT19XUklURVIpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8V3JpdGVyTW9kZWw+IGdldFdyaXRlcnNNb2RlbHNGb3JUeXBlKGZpbmFsIENsYXNzPD8+IHR5cGUpIHsKKyAgICAgICAgZmluYWwgTGlzdDxXcml0ZXJNb2RlbD4gd3JpdGVyTW9kZWxzID0gbWJ3VHlwZUxvb2t1cENhY2hlLmdldCh0eXBlKTsKKyAgICAgICAgaWYgKHdyaXRlck1vZGVscyAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gd3JpdGVyTW9kZWxzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwcm9jZXNzTWVzc2FnZUJvZHlXcml0ZXJzRm9yVHlwZSh0eXBlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8V3JpdGVyTW9kZWw+IHByb2Nlc3NNZXNzYWdlQm9keVdyaXRlcnNGb3JUeXBlKGZpbmFsIENsYXNzPD8+IGNsYXp6KSB7CisgICAgICAgIGZpbmFsIExpc3Q8V3JpdGVyTW9kZWw+IHN1aXRhYmxlV3JpdGVycyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgICAgIGlmIChSZXNwb25zZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNsYXp6KSkgeworICAgICAgICAgICAgc3VpdGFibGVXcml0ZXJzLmFkZEFsbCh3cml0ZXJzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IHdyYXBwZWQgPSBQcmltaXRpdmVzLndyYXAoY2xhenopOworICAgICAgICAgICAgZm9yIChmaW5hbCBXcml0ZXJNb2RlbCBtb2RlbCA6IHdyaXRlcnMpIHsKKworICAgICAgICAgICAgICAgIGlmIChtb2RlbC5wcm92aWRlZFR5cGUoKSA9PSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBtb2RlbC5wcm92aWRlZFR5cGUoKSA9PSBjbGF6egorICAgICAgICAgICAgICAgICAgICAgICAgfHwgbW9kZWwucHJvdmlkZWRUeXBlKCkuaXNBc3NpZ25hYmxlRnJvbSh3cmFwcGVkKSkgeworCisgICAgICAgICAgICAgICAgICAgIHN1aXRhYmxlV3JpdGVycy5hZGQobW9kZWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBUeXBlIC0+IFdyaXRlci4KKyAgICAgICAgc3VpdGFibGVXcml0ZXJzLnNvcnQoV09SS0VSX0JZX1RZUEVfQ09NUEFSQVRPUik7CisgICAgICAgIG1id1R5cGVMb29rdXBDYWNoZS5wdXQoY2xhenosIHN1aXRhYmxlV3JpdGVycyk7CisKKyAgICAgICAgLy8gVHlwZSAtPiBNZWRpYVR5cGUuCisgICAgICAgIHR5cGVUb01lZGlhVHlwZVdyaXRlcnNDYWNoZS5wdXQoY2xhenosIGdldE1lc3NhZ2VCb2R5V29ya2Vyc01lZGlhVHlwZXNCeVR5cGUoc3VpdGFibGVXcml0ZXJzKSk7CisKKyAgICAgICAgcmV0dXJuIHN1aXRhYmxlV3JpdGVyczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxNZWRpYVR5cGU+IGdldE1lc3NhZ2VCb2R5V3JpdGVyTWVkaWFUeXBlc0J5VHlwZShmaW5hbCBDbGFzczw/PiB0eXBlKSB7CisgICAgICAgIGlmICghdHlwZVRvTWVkaWFUeXBlV3JpdGVyc0NhY2hlLmNvbnRhaW5zS2V5KHR5cGUpKSB7CisgICAgICAgICAgICBwcm9jZXNzTWVzc2FnZUJvZHlXcml0ZXJzRm9yVHlwZSh0eXBlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHlwZVRvTWVkaWFUeXBlV3JpdGVyc0NhY2hlLmdldCh0eXBlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxNZWRpYVR5cGU+IGdldE1lc3NhZ2VCb2R5UmVhZGVyTWVkaWFUeXBlc0J5VHlwZShmaW5hbCBDbGFzczw/PiB0eXBlKSB7CisgICAgICAgIGlmICghdHlwZVRvTWVkaWFUeXBlUmVhZGVyc0NhY2hlLmNvbnRhaW5zS2V5KHR5cGUpKSB7CisgICAgICAgICAgICBwcm9jZXNzTWVzc2FnZUJvZHlSZWFkZXJzRm9yVHlwZSh0eXBlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHlwZVRvTWVkaWFUeXBlUmVhZGVyc0NhY2hlLmdldCh0eXBlKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwcml2YXRlIHN0YXRpYyA8VD4gTGlzdDxNZWRpYVR5cGU+IGdldE1lc3NhZ2VCb2R5V29ya2Vyc01lZGlhVHlwZXNCeVR5cGUoCisgICAgICAgICAgICBmaW5hbCBMaXN0PD8gZXh0ZW5kcyBBYnN0cmFjdEVudGl0eVByb3ZpZGVyTW9kZWw8VD4+IHdvcmtlck1vZGVscykgeworCisgICAgICAgIGZpbmFsIFNldDxNZWRpYVR5cGU+IG1lZGlhVHlwZVNldCA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgZm9yIChmaW5hbCBBYnN0cmFjdEVudGl0eVByb3ZpZGVyTW9kZWw8VD4gbW9kZWwgOiB3b3JrZXJNb2RlbHMpIHsKKyAgICAgICAgICAgIG1lZGlhVHlwZVNldC5hZGRBbGwobW9kZWwuZGVjbGFyZWRUeXBlcygpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIExpc3Q8TWVkaWFUeXBlPiBtZWRpYVR5cGVzID0gbmV3IEFycmF5TGlzdDw+KG1lZGlhVHlwZVNldCk7CisgICAgICAgIG1lZGlhVHlwZXMuc29ydChNZWRpYVR5cGVzLlBBUlRJQUxfT1JERVJfQ09NUEFSQVRPUik7CisgICAgICAgIHJldHVybiBtZWRpYVR5cGVzOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZ1bmN0aW9uPFJlYWRlck1vZGVsLCBNZXNzYWdlQm9keVJlYWRlcj4gTU9ERUxfVE9fUkVBREVSID0gQWJzdHJhY3RFbnRpdHlQcm92aWRlck1vZGVsOjpwcm92aWRlcjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PE1lc3NhZ2VCb2R5UmVhZGVyPiBnZXRNZXNzYWdlQm9keVJlYWRlcnNGb3JUeXBlKGZpbmFsIENsYXNzPD8+IHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIGdldFJlYWRlck1vZGVsc0ZvclR5cGUodHlwZSkuc3RyZWFtKCkubWFwKE1PREVMX1RPX1JFQURFUikuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxSZWFkZXJNb2RlbD4gZ2V0UmVhZGVyTW9kZWxzRm9yVHlwZShmaW5hbCBDbGFzczw/PiB0eXBlKSB7CisgICAgICAgIGlmICghbWJyVHlwZUxvb2t1cENhY2hlLmNvbnRhaW5zS2V5KHR5cGUpKSB7CisgICAgICAgICAgICBwcm9jZXNzTWVzc2FnZUJvZHlSZWFkZXJzRm9yVHlwZSh0eXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtYnJUeXBlTG9va3VwQ2FjaGUuZ2V0KHR5cGUpOworICAgIH0KKworICAgIHByaXZhdGUgTGlzdDxSZWFkZXJNb2RlbD4gcHJvY2Vzc01lc3NhZ2VCb2R5UmVhZGVyc0ZvclR5cGUoZmluYWwgQ2xhc3M8Pz4gY2xhenopIHsKKyAgICAgICAgZmluYWwgTGlzdDxSZWFkZXJNb2RlbD4gc3VpdGFibGVSZWFkZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICAgICAgZmluYWwgQ2xhc3M8Pz4gd3JhcHBlZCA9IFByaW1pdGl2ZXMud3JhcChjbGF6eik7CisgICAgICAgIGZvciAoZmluYWwgUmVhZGVyTW9kZWwgcmVhZGVyIDogcmVhZGVycykgeworICAgICAgICAgICAgaWYgKHJlYWRlci5wcm92aWRlZFR5cGUoKSA9PSBudWxsCisgICAgICAgICAgICAgICAgICAgIHx8IHJlYWRlci5wcm92aWRlZFR5cGUoKSA9PSBjbGF6egorICAgICAgICAgICAgICAgICAgICB8fCByZWFkZXIucHJvdmlkZWRUeXBlKCkuaXNBc3NpZ25hYmxlRnJvbSh3cmFwcGVkKSkgeworICAgICAgICAgICAgICAgIHN1aXRhYmxlUmVhZGVycy5hZGQocmVhZGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFR5cGUgLT4gV3JpdGVyLgorICAgICAgICBzdWl0YWJsZVJlYWRlcnMuc29ydChXT1JLRVJfQllfVFlQRV9DT01QQVJBVE9SKTsKKyAgICAgICAgbWJyVHlwZUxvb2t1cENhY2hlLnB1dChjbGF6eiwgc3VpdGFibGVSZWFkZXJzKTsKKworICAgICAgICAvLyBUeXBlIC0+IE1lZGlhVHlwZS4KKyAgICAgICAgdHlwZVRvTWVkaWFUeXBlUmVhZGVyc0NhY2hlLnB1dChjbGF6eiwgZ2V0TWVzc2FnZUJvZHlXb3JrZXJzTWVkaWFUeXBlc0J5VHlwZShzdWl0YWJsZVJlYWRlcnMpKTsKKworICAgICAgICByZXR1cm4gc3VpdGFibGVSZWFkZXJzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBNZWRpYVR5cGUgZ2V0TWVzc2FnZUJvZHlXcml0ZXJNZWRpYVR5cGUoCisgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiBjLCBmaW5hbCBUeXBlIHQsIGZpbmFsIEFubm90YXRpb25bXSBhcywgZmluYWwgTGlzdDxNZWRpYVR5cGU+IGFjY2VwdGFibGVNZWRpYVR5cGVzKSB7CisKKyAgICAgICAgZm9yIChmaW5hbCBNZWRpYVR5cGUgYWNjZXB0YWJsZSA6IGFjY2VwdGFibGVNZWRpYVR5cGVzKSB7CisgICAgICAgICAgICBmb3IgKGZpbmFsIFdyaXRlck1vZGVsIG1vZGVsIDogd3JpdGVycykgeworICAgICAgICAgICAgICAgIGZvciAoZmluYWwgTWVkaWFUeXBlIG10IDogbW9kZWwuZGVjbGFyZWRUeXBlcygpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtdC5pc0NvbXBhdGlibGUoYWNjZXB0YWJsZSkgJiYgbW9kZWwuaXNXcml0ZWFibGUoYywgdCwgYXMsIGFjY2VwdGFibGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWVkaWFUeXBlcy5tb3N0U3BlY2lmaWMobXQsIGFjY2VwdGFibGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdCByZWFkRnJvbShmaW5hbCBDbGFzczw/PiByYXdUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFByb3BlcnRpZXNEZWxlZ2F0ZSBwcm9wZXJ0aWVzRGVsZWdhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJdGVyYWJsZTxSZWFkZXJJbnRlcmNlcHRvcj4gcmVhZGVySW50ZXJjZXB0b3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiB0cmFuc2xhdGVOY2UpIHRocm93cyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCisgICAgICAgIGZpbmFsIFJlYWRlckludGVyY2VwdG9yRXhlY3V0b3IgZXhlY3V0b3IgPSBuZXcgUmVhZGVySW50ZXJjZXB0b3JFeGVjdXRvcigKKyAgICAgICAgICAgICAgICByYXdUeXBlLAorICAgICAgICAgICAgICAgIHR5cGUsCisgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgIGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgIHByb3BlcnRpZXNEZWxlZ2F0ZSwKKyAgICAgICAgICAgICAgICBlbnRpdHlTdHJlYW0sCisgICAgICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgICAgICByZWFkZXJJbnRlcmNlcHRvcnMsCisgICAgICAgICAgICAgICAgdHJhbnNsYXRlTmNlLCBpbmplY3Rpb25NYW5hZ2VyKTsKKworICAgICAgICBmaW5hbCBUcmFjaW5nTG9nZ2VyIHRyYWNpbmdMb2dnZXIgPSBUcmFjaW5nTG9nZ2VyLmdldEluc3RhbmNlKHByb3BlcnRpZXNEZWxlZ2F0ZSk7CisgICAgICAgIGZpbmFsIGxvbmcgdGltZXN0YW1wID0gdHJhY2luZ0xvZ2dlci50aW1lc3RhbXAoTXNnVHJhY2VFdmVudC5SSV9TVU1NQVJZKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgT2JqZWN0IGluc3RhbmNlID0gZXhlY3V0b3IucHJvY2VlZCgpOworICAgICAgICAgICAgaWYgKCEoaW5zdGFuY2UgaW5zdGFuY2VvZiBDbG9zZWFibGUpICYmICEoaW5zdGFuY2UgaW5zdGFuY2VvZiBTb3VyY2UpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gc3RyZWFtID0gZXhlY3V0b3IuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RyZWFtICE9IGVudGl0eVN0cmVhbSAmJiBzdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBXZSBvbmx5IGNsb3NlIHN0cmVhbSBpZiBpdCBkaWZmZXJzIGZyb20gdGhlIHJlY2VpdmVkIGVudGl0eSBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSB3ZSBsZXQgdGhlIGNhbGxlciBjbG9zZSB0aGUgc3RyZWFtLgorICAgICAgICAgICAgICAgICAgICBSZWFkZXJXcml0ZXIuc2FmZWx5Q2xvc2Uoc3RyZWFtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHRyYWNpbmdMb2dnZXIubG9nRHVyYXRpb24oTXNnVHJhY2VFdmVudC5SSV9TVU1NQVJZLCB0aW1lc3RhbXAsIGV4ZWN1dG9yLmdldFByb2Nlc3NlZENvdW50KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE91dHB1dFN0cmVhbSB3cml0ZVRvKGZpbmFsIE9iamVjdCB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiByYXdUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBQcm9wZXJ0aWVzRGVsZWdhdGUgcHJvcGVydGllc0RlbGVnYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJdGVyYWJsZTxXcml0ZXJJbnRlcmNlcHRvcj4gd3JpdGVySW50ZXJjZXB0b3JzKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgZmluYWwgV3JpdGVySW50ZXJjZXB0b3JFeGVjdXRvciBleGVjdXRvciA9IG5ldyBXcml0ZXJJbnRlcmNlcHRvckV4ZWN1dG9yKAorICAgICAgICAgICAgICAgIHQsCisgICAgICAgICAgICAgICAgcmF3VHlwZSwKKyAgICAgICAgICAgICAgICB0eXBlLAorICAgICAgICAgICAgICAgIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzRGVsZWdhdGUsCisgICAgICAgICAgICAgICAgZW50aXR5U3RyZWFtLAorICAgICAgICAgICAgICAgIHRoaXMsCisgICAgICAgICAgICAgICAgd3JpdGVySW50ZXJjZXB0b3JzLCBpbmplY3Rpb25NYW5hZ2VyKTsKKworICAgICAgICBmaW5hbCBUcmFjaW5nTG9nZ2VyIHRyYWNpbmdMb2dnZXIgPSBUcmFjaW5nTG9nZ2VyLmdldEluc3RhbmNlKHByb3BlcnRpZXNEZWxlZ2F0ZSk7CisgICAgICAgIGZpbmFsIGxvbmcgdGltZXN0YW1wID0gdHJhY2luZ0xvZ2dlci50aW1lc3RhbXAoTXNnVHJhY2VFdmVudC5XSV9TVU1NQVJZKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZXhlY3V0b3IucHJvY2VlZCgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdHJhY2luZ0xvZ2dlci5sb2dEdXJhdGlvbihNc2dUcmFjZUV2ZW50LldJX1NVTU1BUlksIHRpbWVzdGFtcCwgZXhlY3V0b3IuZ2V0UHJvY2Vzc2VkQ291bnQoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZXhlY3V0b3IuZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2FmZWx5IGludm9rZXMge0BsaW5rIGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlciNpc1dyaXRlYWJsZSBpc1dyaXRlYWJsZX0gbWV0aG9kIG9uIHRoZSBzdXBwbGllZCBwcm92aWRlci4KKyAgICAgKgorICAgICAqIEFueSBleGNlcHRpb25zIHdpbGwgYmUgbG9nZ2VkIGF0IGZpbmVyIGxldmVsLgorICAgICAqCisgICAgICogQHBhcmFtIHByb3ZpZGVyICAgIG1lc3NhZ2UgYm9keSB3cml0ZXIgb24gd2hpY2ggdGhlIHtAY29kZSBpc1dyaXRlYWJsZX0gc2hvdWxkIGJlIGludm9rZWQuCisgICAgICogQHBhcmFtIHR5cGUgICAgICAgIHRoZSBjbGFzcyBvZiBpbnN0YW5jZSB0aGF0IGlzIHRvIGJlIHdyaXR0ZW4uCisgICAgICogQHBhcmFtIGdlbmVyaWNUeXBlIHRoZSB0eXBlIG9mIGluc3RhbmNlIHRvIGJlIHdyaXR0ZW4sIG9idGFpbmVkIGVpdGhlcgorICAgICAqICAgICAgICAgICAgICAgICAgICBieSByZWZsZWN0aW9uIG9mIGEgcmVzb3VyY2UgbWV0aG9kIHJldHVybiB0eXBlIG9yIHZpYSBpbnNwZWN0aW9uCisgICAgICogICAgICAgICAgICAgICAgICAgIG9mIHRoZSByZXR1cm5lZCBpbnN0YW5jZS4ge0BsaW5rIGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY0VudGl0eX0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXMgYSB3YXkgdG8gc3BlY2lmeSB0aGlzIGluZm9ybWF0aW9uIGF0IHJ1bnRpbWUuCisgICAgICogQHBhcmFtIGFubm90YXRpb25zIGFuIGFycmF5IG9mIHRoZSBhbm5vdGF0aW9ucyBhdHRhY2hlZCB0byB0aGUgbWVzc2FnZSBlbnRpdHkgaW5zdGFuY2UuCisgICAgICogQHBhcmFtIG1lZGlhVHlwZSAgIHRoZSBtZWRpYSB0eXBlIG9mIHRoZSBIVFRQIGVudGl0eS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgdHlwZSBpcyBzdXBwb3J0ZWQsIG90aGVyd2lzZSB7QGNvZGUgZmFsc2V9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1dyaXRlYWJsZSgKKyAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2VCb2R5V3JpdGVyPD8+IHByb3ZpZGVyLAorICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gdHlwZSwKKyAgICAgICAgICAgIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gcHJvdmlkZXIuaXNXcml0ZWFibGUodHlwZSwgZ2VuZXJpY1R5cGUsIGFubm90YXRpb25zLCBtZWRpYVR5cGUpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGlmIChMT0dHRVIuaXNMb2dnYWJsZShMZXZlbC5GSU5FKSkgeworICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuRklORSwgTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfTUJXX0lTV1JJVEFCTEUocHJvdmlkZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpLCBleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNhZmVseSBpbnZva2VzIHtAbGluayBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXIjaXNSZWFkYWJsZSBpc1JlYWRhYmxlfSBtZXRob2Qgb24gdGhlIHN1cHBsaWVkIHByb3ZpZGVyLgorICAgICAqCisgICAgICogQW55IGV4Y2VwdGlvbnMgd2lsbCBiZSBsb2dnZWQgYXQgZmluZXIgbGV2ZWwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvdmlkZXIgICAgbWVzc2FnZSBib2R5IHJlYWRlciBvbiB3aGljaCB0aGUge0Bjb2RlIGlzUmVhZGFibGV9IHNob3VsZCBiZSBpbnZva2VkLgorICAgICAqICAgICAgICAgICAgICAgICAgICBTYWZlbHkgaW52b2tlcyB7QGxpbmsgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyI2lzUmVhZGFibGUgaXNSZWFkYWJsZX0gbWV0aG9kIG9uIHRoZSB1bmRlcmx5aW5nCisgICAgICogICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyLgorICAgICAqIEBwYXJhbSB0eXBlICAgICAgICB0aGUgY2xhc3Mgb2YgaW5zdGFuY2UgdG8gYmUgcHJvZHVjZWQuCisgICAgICogQHBhcmFtIGdlbmVyaWNUeXBlIHRoZSB0eXBlIG9mIGluc3RhbmNlIHRvIGJlIHByb2R1Y2VkLiBFLmcuIGlmIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICBtZXNzYWdlIGJvZHkgaXMgdG8gYmUgY29udmVydGVkIGludG8gYSBtZXRob2QgcGFyYW1ldGVyLCB0aGlzIHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGZvcm1hbCB0eXBlIG9mIHRoZSBtZXRob2QgcGFyYW1ldGVyIGFzIHJldHVybmVkIGJ5CisgICAgICogICAgICAgICAgICAgICAgICAgIHtAY29kZSBNZXRob2QuZ2V0R2VuZXJpY1BhcmFtZXRlclR5cGVzfS4KKyAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbnMgYW4gYXJyYXkgb2YgdGhlIGFubm90YXRpb25zIG9uIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgYXJ0aWZhY3QgdGhhdCB3aWxsIGJlIGluaXRpYWxpemVkIHdpdGggdGhlIHByb2R1Y2VkIGluc3RhbmNlLiBFLmcuIGlmIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICBtZXNzYWdlIGJvZHkgaXMgdG8gYmUgY29udmVydGVkIGludG8gYSBtZXRob2QgcGFyYW1ldGVyLCB0aGlzIHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgdGhlIGFubm90YXRpb25zIG9uIHRoYXQgcGFyYW1ldGVyIHJldHVybmVkIGJ5CisgICAgICogICAgICAgICAgICAgICAgICAgIHtAY29kZSBNZXRob2QuZ2V0UGFyYW1ldGVyQW5ub3RhdGlvbnN9LgorICAgICAqIEBwYXJhbSBtZWRpYVR5cGUgICB0aGUgbWVkaWEgdHlwZSBvZiB0aGUgSFRUUCBlbnRpdHksIGlmIG9uZSBpcyBub3QKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0IHRoZW4ge0Bjb2RlIGFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbX0gaXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgdXNlZC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgdHlwZSBpcyBzdXBwb3J0ZWQsIG90aGVyd2lzZSB7QGNvZGUgZmFsc2V9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1JlYWRhYmxlKGZpbmFsIE1lc3NhZ2VCb2R5UmVhZGVyPD8+IHByb3ZpZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyLmlzUmVhZGFibGUodHlwZSwgZ2VuZXJpY1R5cGUsIGFubm90YXRpb25zLCBtZWRpYVR5cGUpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGlmIChMT0dHRVIuaXNMb2dnYWJsZShMZXZlbC5GSU5FKSkgeworICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuRklORSwgTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfTUJSX0lTUkVBREFCTEUocHJvdmlkZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpLCBleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9NZXNzYWdlQm9keVByb2Nlc3NpbmdFeGNlcHRpb24uamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9NZXNzYWdlQm9keVByb2Nlc3NpbmdFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTY2NDcwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL01lc3NhZ2VCb2R5UHJvY2Vzc2luZ0V4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CisKKy8qKgorICogSmVyc2V5IGV4Y2VwdGlvbiBzaWduYWxpbmcgdGhhdCBlcnJvciBvY2N1cnJlZCBkdXJpbmcgcmVhZGluZyBvciB3cml0aW5nIG1lc3NhZ2UgYm9keSAoZW50aXR5KS4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBNZXNzYWdlQm9keVByb2Nlc3NpbmdFeGNlcHRpb24gZXh0ZW5kcyBQcm9jZXNzaW5nRXhjZXB0aW9uIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDIwOTMxNzU2ODE3MDIxMTgzODBMOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBuZXcgaW5zdGFuY2UgaW5pdGlhbGl6ZWQgd2l0aCBleGNlcHRpb24gY2F1c2UuCisgICAgICogQHBhcmFtIGNhdXNlIEV4Y2VwdGlvbiBjYXVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVzc2FnZUJvZHlQcm9jZXNzaW5nRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgeworICAgICAgICBzdXBlcihjYXVzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBuZXcgaW5zdGFuY2UgaW5pdGlhbGl6ZWQgd2l0aCBleGNlcHRpb24gbWVzc2FnZSBhbmQgZXhjZXB0aW9uIGNhdXNlLgorICAgICAqIEBwYXJhbSBtZXNzYWdlIE1lc3NhZ2UuCisgICAgICogQHBhcmFtIGNhdXNlIEV4Y2VwdGlvbiBjYXVzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVzc2FnZUJvZHlQcm9jZXNzaW5nRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgbmV3IGluc3RhbmNlIGluaXRpYWxpemVkIHdpdGggZXhjZXB0aW9uIG1lc3NhZ2UuCisgICAgICogQHBhcmFtIG1lc3NhZ2UgTWVzc2FnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVzc2FnZUJvZHlQcm9jZXNzaW5nRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIHN1cGVyKG1lc3NhZ2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9NZXNzYWdlQm9keVByb3ZpZGVyTm90Rm91bmRFeGNlcHRpb24uamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9NZXNzYWdlQm9keVByb3ZpZGVyTm90Rm91bmRFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGM2ZmJhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL01lc3NhZ2VCb2R5UHJvdmlkZXJOb3RGb3VuZEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CisKKy8qKgorICogSmVyc2V5IHByb2Nlc3NpbmcgZXhjZXB0aW9uIHNpZ25hbGluZyB0aGF0IG5vIGFwcHJvcHJpYXRlIE1lc3NhZ2VCb2R5UmVhZGVyIG9yIE1lc3NhZ2VCb2R5V3JpdGVyIHdhcyBmb3VuZC4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBNZXNzYWdlQm9keVByb3ZpZGVyTm90Rm91bmRFeGNlcHRpb24gZXh0ZW5kcyBQcm9jZXNzaW5nRXhjZXB0aW9uIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDIwOTMxNzU2ODE3MDIxMTgzODBMOworCisgICAgcHVibGljIE1lc3NhZ2VCb2R5UHJvdmlkZXJOb3RGb3VuZEV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgICAgc3VwZXIoY2F1c2UpOworICAgIH0KKworICAgIHB1YmxpYyBNZXNzYWdlQm9keVByb3ZpZGVyTm90Rm91bmRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgeworICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7CisgICAgfQorCisgICAgcHVibGljIE1lc3NhZ2VCb2R5UHJvdmlkZXJOb3RGb3VuZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICBzdXBlcihtZXNzYWdlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvTWVzc2FnaW5nQmluZGVycy5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL01lc3NhZ2luZ0JpbmRlcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2ExNWUxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL01lc3NhZ2luZ0JpbmRlcnMuamF2YQpAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuUnVudGltZVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5TZXJ2aWNlRmluZGVyQmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5BYnN0cmFjdEJpbmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuSGVhZGVyRGVsZWdhdGVQcm92aWRlcjsKKworLyoqCisgKiBCaW5kaW5nIGRlZmluaXRpb25zIGZvciB0aGUgZGVmYXVsdCBzZXQgb2YgbWVzc2FnZSByZWxhdGVkIHByb3ZpZGVycyAocmVhZGVycywKKyAqIHdyaXRlcnMsIGhlYWRlciBkZWxlZ2F0ZXMpLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTWVzc2FnaW5nQmluZGVycyB7CisKKyAgICAvKioKKyAgICAgKiBQcmV2ZW50cyBpbnN0YW50aWF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgTWVzc2FnaW5nQmluZGVycygpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZXNzYWdlIGJvZHkgcHJvdmlkZXJzIGluamVjdGlvbiBiaW5kZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNZXNzYWdlQm9keVByb3ZpZGVycyBleHRlbmRzIEFic3RyYWN0QmluZGVyIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gYXBwbGljYXRpb25Qcm9wZXJ0aWVzOworCisgICAgICAgIHByaXZhdGUgZmluYWwgUnVudGltZVR5cGUgcnVudGltZVR5cGU7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBuZXcgbWVzc2FnZSBib2R5IHByb3ZpZGVycyBpbmplY3Rpb24gYmluZGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYXBwbGljYXRpb25Qcm9wZXJ0aWVzIG1hcCBjb250YWluaW5nIGFwcGxpY2F0aW9uIHByb3BlcnRpZXMuIE1heSBiZSB7QGNvZGUgbnVsbH0uCisgICAgICAgICAqIEBwYXJhbSBydW50aW1lVHlwZSAgICAgICAgICAgcnVudGltZSAoY2xpZW50IG9yIHNlcnZlcikgd2hlcmUgdGhlIGJpbmRlciBpcyB1c2VkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE1lc3NhZ2VCb2R5UHJvdmlkZXJzKGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gYXBwbGljYXRpb25Qcm9wZXJ0aWVzLCBmaW5hbCBSdW50aW1lVHlwZSBydW50aW1lVHlwZSkgeworICAgICAgICAgICAgdGhpcy5hcHBsaWNhdGlvblByb3BlcnRpZXMgPSBhcHBsaWNhdGlvblByb3BlcnRpZXM7CisgICAgICAgICAgICB0aGlzLnJ1bnRpbWVUeXBlID0gcnVudGltZVR5cGU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworCisgICAgICAgICAgICAvLyBNZXNzYWdlIGJvZHkgcHJvdmlkZXJzIChib3RoIHJlYWRlcnMgJiB3cml0ZXJzKQorICAgICAgICAgICAgYmluZFNpbmdsZXRvbldvcmtlcihCeXRlQXJyYXlQcm92aWRlci5jbGFzcyk7CisgICAgICAgICAgICBiaW5kU2luZ2xldG9uV29ya2VyKERhdGFTb3VyY2VQcm92aWRlci5jbGFzcyk7CisgICAgICAgICAgICBiaW5kU2luZ2xldG9uV29ya2VyKEZpbGVQcm92aWRlci5jbGFzcyk7CisgICAgICAgICAgICBiaW5kU2luZ2xldG9uV29ya2VyKEZvcm1NdWx0aXZhbHVlZE1hcFByb3ZpZGVyLmNsYXNzKTsKKyAgICAgICAgICAgIGJpbmRTaW5nbGV0b25Xb3JrZXIoRm9ybVByb3ZpZGVyLmNsYXNzKTsKKyAgICAgICAgICAgIGJpbmRTaW5nbGV0b25Xb3JrZXIoSW5wdXRTdHJlYW1Qcm92aWRlci5jbGFzcyk7CisgICAgICAgICAgICBiaW5kU2luZ2xldG9uV29ya2VyKEJhc2ljVHlwZXNNZXNzYWdlUHJvdmlkZXIuY2xhc3MpOworICAgICAgICAgICAgYmluZFNpbmdsZXRvbldvcmtlcihSZWFkZXJQcm92aWRlci5jbGFzcyk7CisgICAgICAgICAgICBiaW5kU2luZ2xldG9uV29ya2VyKFJlbmRlcmVkSW1hZ2VQcm92aWRlci5jbGFzcyk7CisgICAgICAgICAgICBiaW5kU2luZ2xldG9uV29ya2VyKFN0cmluZ01lc3NhZ2VQcm92aWRlci5jbGFzcyk7CisKKyAgICAgICAgICAgIC8vIE1lc3NhZ2UgYm9keSByZWFkZXJzCisgICAgICAgICAgICBiaW5kKFNvdXJjZVByb3ZpZGVyLlN0cmVhbVNvdXJjZVJlYWRlci5jbGFzcykudG8oTWVzc2FnZUJvZHlSZWFkZXIuY2xhc3MpLmluKFNpbmdsZXRvbi5jbGFzcyk7CisgICAgICAgICAgICBiaW5kKFNvdXJjZVByb3ZpZGVyLlNheFNvdXJjZVJlYWRlci5jbGFzcykudG8oTWVzc2FnZUJvZHlSZWFkZXIuY2xhc3MpLmluKFNpbmdsZXRvbi5jbGFzcyk7CisgICAgICAgICAgICBiaW5kKFNvdXJjZVByb3ZpZGVyLkRvbVNvdXJjZVJlYWRlci5jbGFzcykudG8oTWVzc2FnZUJvZHlSZWFkZXIuY2xhc3MpLmluKFNpbmdsZXRvbi5jbGFzcyk7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVE9ETzogY29tLnN1bi5qZXJzZXkuY29yZS5pbXBsLnByb3ZpZGVyLmVudGl0eS5FbnRpdHlIb2xkZXJSZWFkZXIKKyAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAvLyBNZXNzYWdlIGJvZHkgd3JpdGVycworICAgICAgICAgICAgYmluZChTdHJlYW1pbmdPdXRwdXRQcm92aWRlci5jbGFzcykudG8oTWVzc2FnZUJvZHlXcml0ZXIuY2xhc3MpLmluKFNpbmdsZXRvbi5jbGFzcyk7CisgICAgICAgICAgICBiaW5kKFNvdXJjZVByb3ZpZGVyLlNvdXJjZVdyaXRlci5jbGFzcykudG8oTWVzc2FnZUJvZHlXcml0ZXIuY2xhc3MpLmluKFNpbmdsZXRvbi5jbGFzcyk7CisKKyAgICAgICAgICAgIC8vIEhlYWRlciBEZWxlZ2F0ZSBQcm92aWRlcnMgcmVnaXN0ZXJlZCBpbiBNRVRBLUlORi5zZXJ2aWNlcworICAgICAgICAgICAgaW5zdGFsbChuZXcgU2VydmljZUZpbmRlckJpbmRlcjw+KEhlYWRlckRlbGVnYXRlUHJvdmlkZXIuY2xhc3MsIGFwcGxpY2F0aW9uUHJvcGVydGllcywgcnVudGltZVR5cGUpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgPFQgZXh0ZW5kcyBNZXNzYWdlQm9keVJlYWRlciAmIE1lc3NhZ2VCb2R5V3JpdGVyPiB2b2lkIGJpbmRTaW5nbGV0b25Xb3JrZXIoZmluYWwgQ2xhc3M8VD4gd29ya2VyKSB7CisgICAgICAgICAgICBiaW5kKHdvcmtlcikudG8oTWVzc2FnZUJvZHlSZWFkZXIuY2xhc3MpLnRvKE1lc3NhZ2VCb2R5V3JpdGVyLmNsYXNzKS5pbihTaW5nbGV0b24uY2xhc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSGVhZGVyIGRlbGVnYXRlIHByb3ZpZGVyIGluamVjdGlvbiBiaW5kZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBIZWFkZXJEZWxlZ2F0ZVByb3ZpZGVycyBleHRlbmRzIEFic3RyYWN0QmluZGVyIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFNldDxIZWFkZXJEZWxlZ2F0ZVByb3ZpZGVyPiBwcm92aWRlcnM7CisKKyAgICAgICAgcHVibGljIEhlYWRlckRlbGVnYXRlUHJvdmlkZXJzKCkgeworICAgICAgICAgICAgU2V0PEhlYWRlckRlbGVnYXRlUHJvdmlkZXI+IHByb3ZpZGVycyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgICAgIHByb3ZpZGVycy5hZGQobmV3IENhY2hlQ29udHJvbFByb3ZpZGVyKCkpOworICAgICAgICAgICAgcHJvdmlkZXJzLmFkZChuZXcgQ29va2llUHJvdmlkZXIoKSk7CisgICAgICAgICAgICBwcm92aWRlcnMuYWRkKG5ldyBEYXRlUHJvdmlkZXIoKSk7CisgICAgICAgICAgICBwcm92aWRlcnMuYWRkKG5ldyBFbnRpdHlUYWdQcm92aWRlcigpKTsKKyAgICAgICAgICAgIHByb3ZpZGVycy5hZGQobmV3IExpbmtQcm92aWRlcigpKTsKKyAgICAgICAgICAgIHByb3ZpZGVycy5hZGQobmV3IExvY2FsZVByb3ZpZGVyKCkpOworICAgICAgICAgICAgcHJvdmlkZXJzLmFkZChuZXcgTWVkaWFUeXBlUHJvdmlkZXIoKSk7CisgICAgICAgICAgICBwcm92aWRlcnMuYWRkKG5ldyBOZXdDb29raWVQcm92aWRlcigpKTsKKyAgICAgICAgICAgIHByb3ZpZGVycy5hZGQobmV3IFN0cmluZ0hlYWRlclByb3ZpZGVyKCkpOworICAgICAgICAgICAgcHJvdmlkZXJzLmFkZChuZXcgVXJpUHJvdmlkZXIoKSk7CisgICAgICAgICAgICB0aGlzLnByb3ZpZGVycyA9IHByb3ZpZGVyczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgICAgICBwcm92aWRlcnMuZm9yRWFjaChwcm92aWRlciAtPiBiaW5kKHByb3ZpZGVyKS50byhIZWFkZXJEZWxlZ2F0ZVByb3ZpZGVyLmNsYXNzKSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyBhbGwge0BsaW5rIEhlYWRlckRlbGVnYXRlUHJvdmlkZXJ9IHJlZ2lzdGVyIGludGVybmFsbHkgYnkgSmVyc2V5LgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIGFsbCBpbnRlcm5hbGx5IHJlZ2lzdGVyZWQge0BsaW5rIEhlYWRlckRlbGVnYXRlUHJvdmlkZXJ9LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFNldDxIZWFkZXJEZWxlZ2F0ZVByb3ZpZGVyPiBnZXRIZWFkZXJEZWxlZ2F0ZVByb3ZpZGVycygpIHsKKyAgICAgICAgICAgIHJldHVybiBwcm92aWRlcnM7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvTXNnVHJhY2VFdmVudC5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL01zZ1RyYWNlRXZlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTk0NzAwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL01zZ1RyYWNlRXZlbnQuamF2YQpAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsOworCisvKioKKyAqIENvbW1vbiB0cmFjaW5nIGV2ZW50cy4KKyAqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICogQHNpbmNlIDIuMworICovCitwdWJsaWMgZW51bSBNc2dUcmFjZUV2ZW50IGltcGxlbWVudHMgVHJhY2luZ0xvZ2dlci5FdmVudCB7CisgICAgLyoqCisgICAgICoge0BsaW5rIGphdmF4LndzLnJzLmV4dC5SZWFkZXJJbnRlcmNlcHRvcn0gaW52b2NhdGlvbiBiZWZvcmUgYSBjYWxsIHRvIHtAY29kZSBjb250ZXh0LnByb2NlZWQoKX0uCisgICAgICovCisgICAgUklfQkVGT1JFKFRyYWNpbmdMb2dnZXIuTGV2ZWwuVFJBQ0UsICJSSSIsICIlcyBCRUZPUkUgY29udGV4dC5wcm9jZWVkKCkiKSwKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgamF2YXgud3MucnMuZXh0LlJlYWRlckludGVyY2VwdG9yfSBpbnZvY2F0aW9uIGFmdGVyIGEgY2FsbCB0byB7QGNvZGUgY29udGV4dC5wcm9jZWVkKCl9LgorICAgICAqLworICAgIFJJX0FGVEVSKFRyYWNpbmdMb2dnZXIuTGV2ZWwuVFJBQ0UsICJSSSIsICIlcyBBRlRFUiBjb250ZXh0LnByb2NlZWQoKSIpLAorICAgIC8qKgorICAgICAqIHtAbGluayBqYXZheC53cy5ycy5leHQuUmVhZGVySW50ZXJjZXB0b3J9IGludm9jYXRpb24gc3VtbWFyeS4KKyAgICAgKi8KKyAgICBSSV9TVU1NQVJZKFRyYWNpbmdMb2dnZXIuTGV2ZWwuU1VNTUFSWSwgIlJJIiwgIlJlYWRGcm9tIHN1bW1hcnk6ICVzIGludGVyY2VwdG9ycyIpLAorICAgIC8qKgorICAgICAqIHtAbGluayBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXJ9IGxvb2t1cC4KKyAgICAgKi8KKyAgICBNQlJfRklORChUcmFjaW5nTG9nZ2VyLkxldmVsLlRSQUNFLCAiTUJSIiwgIkZpbmQgTUJSIGZvciB0eXBlPVslc10gZ2VuZXJpY1R5cGU9WyVzXSBtZWRpYVR5cGU9WyVzXSBhbm5vdGF0aW9ucz0lcyIpLAorICAgIC8qKgorICAgICAqIHtAbGluayBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXIjaXNSZWFkYWJsZX0gcmV0dXJuZWQge0Bjb2RlIGZhbHNlfS4KKyAgICAgKi8KKyAgICBNQlJfTk9UX1JFQURBQkxFKFRyYWNpbmdMb2dnZXIuTGV2ZWwuVkVSQk9TRSwgIk1CUiIsICIlcyBpcyBOT1QgcmVhZGFibGUiKSwKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyfSBzZWxlY3RlZC4KKyAgICAgKi8KKyAgICBNQlJfU0VMRUNURUQoVHJhY2luZ0xvZ2dlci5MZXZlbC5UUkFDRSwgIk1CUiIsICIlcyBJUyByZWFkYWJsZSIpLAorICAgIC8qKgorICAgICAqIHtAbGluayBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXJ9IHNraXBwZWQgYXMgaGlnaGVyLXByaW9yaXR5IHJlYWRlciBoYXMgYmVlbiBzZWxlY3RlZCBhbHJlYWR5LgorICAgICAqLworICAgIE1CUl9TS0lQUEVEKFRyYWNpbmdMb2dnZXIuTGV2ZWwuVkVSQk9TRSwgIk1CUiIsICIlcyBpcyBza2lwcGVkIiksCisgICAgLyoqCisgICAgICoge0BsaW5rIGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlciNyZWFkRnJvbX0gaW52b2tlZC4KKyAgICAgKi8KKyAgICBNQlJfUkVBRF9GUk9NKFRyYWNpbmdMb2dnZXIuTGV2ZWwuVFJBQ0UsICJNQlIiLCAiUmVhZEZyb20gYnkgJXMiKSwKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyfSBsb29rdXAuCisgICAgICovCisgICAgTUJXX0ZJTkQoVHJhY2luZ0xvZ2dlci5MZXZlbC5UUkFDRSwgIk1CVyIsICJGaW5kIE1CVyBmb3IgdHlwZT1bJXNdIGdlbmVyaWNUeXBlPVslc10gbWVkaWFUeXBlPVslc10gYW5ub3RhdGlvbnM9JXMiKSwKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyI2lzV3JpdGVhYmxlfSByZXR1cm5lZCB7QGNvZGUgZmFsc2V9LgorICAgICAqLworICAgIE1CV19OT1RfV1JJVEVBQkxFKFRyYWNpbmdMb2dnZXIuTGV2ZWwuVkVSQk9TRSwgIk1CVyIsICIlcyBpcyBOT1Qgd3JpdGVhYmxlIiksCisgICAgLyoqCisgICAgICoge0BsaW5rIGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlciNpc1dyaXRlYWJsZX0gc2VsZWN0ZWQuCisgICAgICovCisgICAgTUJXX1NFTEVDVEVEKFRyYWNpbmdMb2dnZXIuTGV2ZWwuVFJBQ0UsICJNQlciLCAiJXMgSVMgd3JpdGVhYmxlIiksCisgICAgLyoqCisgICAgICoge0BsaW5rIGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcn0gc2tpcHBlZCBhcyBoaWdoZXItcHJpb3JpdHkgd3JpdGVyIGhhcyBiZWVuIHNlbGVjdGVkIGFscmVhZHkuCisgICAgICovCisgICAgTUJXX1NLSVBQRUQoVHJhY2luZ0xvZ2dlci5MZXZlbC5WRVJCT1NFLCAiTUJXIiwgIiVzIGlzIHNraXBwZWQiKSwKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyI3dyaXRlVG99IGludm9rZWQuCisgICAgICovCisgICAgTUJXX1dSSVRFX1RPKFRyYWNpbmdMb2dnZXIuTGV2ZWwuVFJBQ0UsICJNQlciLCAiV3JpdGVUbyBieSAlcyIpLAorICAgIC8qKgorICAgICAqIHtAbGluayBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3J9IGludm9jYXRpb24gYmVmb3JlIGEgY2FsbCB0byB7QGNvZGUgY29udGV4dC5wcm9jZWVkKCl9LgorICAgICAqLworICAgIFdJX0JFRk9SRShUcmFjaW5nTG9nZ2VyLkxldmVsLlRSQUNFLCAiV0kiLCAiJXMgQkVGT1JFIGNvbnRleHQucHJvY2VlZCgpIiksCisgICAgLyoqCisgICAgICoge0BsaW5rIGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvcn0gaW52b2NhdGlvbiBhZnRlciBhIGNhbGwgdG8ge0Bjb2RlIGNvbnRleHQucHJvY2VlZCgpfS4KKyAgICAgKi8KKyAgICBXSV9BRlRFUihUcmFjaW5nTG9nZ2VyLkxldmVsLlRSQUNFLCAiV0kiLCAiJXMgQUZURVIgY29udGV4dC5wcm9jZWVkKCkiKSwKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgamF2YXgud3MucnMuZXh0LlJlYWRlckludGVyY2VwdG9yfSBpbnZvY2F0aW9uIHN1bW1hcnkuCisgICAgICovCisgICAgV0lfU1VNTUFSWShUcmFjaW5nTG9nZ2VyLkxldmVsLlNVTU1BUlksICJXSSIsICJXcml0ZVRvIHN1bW1hcnk6ICVzIGludGVyY2VwdG9ycyIpOworCisgICAgcHJpdmF0ZSBmaW5hbCBUcmFjaW5nTG9nZ2VyLkxldmVsIGxldmVsOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGNhdGVnb3J5OworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1lc3NhZ2VGb3JtYXQ7CisKKyAgICBwcml2YXRlIE1zZ1RyYWNlRXZlbnQoVHJhY2luZ0xvZ2dlci5MZXZlbCBsZXZlbCwgU3RyaW5nIGNhdGVnb3J5LCBTdHJpbmcgbWVzc2FnZUZvcm1hdCkgeworICAgICAgICB0aGlzLmxldmVsID0gbGV2ZWw7CisgICAgICAgIHRoaXMuY2F0ZWdvcnkgPSBjYXRlZ29yeTsKKyAgICAgICAgdGhpcy5tZXNzYWdlRm9ybWF0ID0gbWVzc2FnZUZvcm1hdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGNhdGVnb3J5KCkgeworICAgICAgICByZXR1cm4gY2F0ZWdvcnk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRyYWNpbmdMb2dnZXIuTGV2ZWwgbGV2ZWwoKSB7CisgICAgICAgIHJldHVybiBsZXZlbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIG1lc3NhZ2VGb3JtYXQoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlRm9ybWF0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9OZXdDb29raWVQcm92aWRlci5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL05ld0Nvb2tpZVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFhNjJlYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9OZXdDb29raWVQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTmV3Q29va2llOworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5IZWFkZXJEZWxlZ2F0ZVByb3ZpZGVyOworCitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuVXRpbHMudGhyb3dJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25JZk51bGw7CisKKy8qKgorICogUmVzcG9uc2Uge0Bjb2RlIFNldC1Db29raWV9IHtAbGluayBIZWFkZXJEZWxlZ2F0ZVByb3ZpZGVyIGhlYWRlciBkZWxlZ2F0ZSBwcm92aWRlcn0uCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQFNpbmdsZXRvbgorcHVibGljIGNsYXNzIE5ld0Nvb2tpZVByb3ZpZGVyIGltcGxlbWVudHMgSGVhZGVyRGVsZWdhdGVQcm92aWRlcjxOZXdDb29raWU+IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzKGZpbmFsIENsYXNzPD8+IHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHR5cGUgPT0gTmV3Q29va2llLmNsYXNzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoZmluYWwgTmV3Q29va2llIGNvb2tpZSkgeworCisgICAgICAgIHRocm93SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uSWZOdWxsKGNvb2tpZSwgTG9jYWxpemF0aW9uTWVzc2FnZXMuTkVXX0NPT0tJRV9JU19OVUxMKCkpOworCisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKyAgICAgICAgYi5hcHBlbmQoY29va2llLmdldE5hbWUoKSkuYXBwZW5kKCc9Jyk7CisgICAgICAgIFN0cmluZ0J1aWxkZXJVdGlscy5hcHBlbmRRdW90ZWRJZldoaXRlc3BhY2UoYiwgY29va2llLmdldFZhbHVlKCkpOworCisgICAgICAgIGIuYXBwZW5kKCI7IikuYXBwZW5kKCJWZXJzaW9uPSIpLmFwcGVuZChjb29raWUuZ2V0VmVyc2lvbigpKTsKKworICAgICAgICBpZiAoY29va2llLmdldENvbW1lbnQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBiLmFwcGVuZCgiO0NvbW1lbnQ9Iik7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyVXRpbHMuYXBwZW5kUXVvdGVkSWZXaGl0ZXNwYWNlKGIsIGNvb2tpZS5nZXRDb21tZW50KCkpOworICAgICAgICB9CisgICAgICAgIGlmIChjb29raWUuZ2V0RG9tYWluKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgYi5hcHBlbmQoIjtEb21haW49Iik7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyVXRpbHMuYXBwZW5kUXVvdGVkSWZXaGl0ZXNwYWNlKGIsIGNvb2tpZS5nZXREb21haW4oKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvb2tpZS5nZXRQYXRoKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgYi5hcHBlbmQoIjtQYXRoPSIpOworICAgICAgICAgICAgU3RyaW5nQnVpbGRlclV0aWxzLmFwcGVuZFF1b3RlZElmV2hpdGVzcGFjZShiLCBjb29raWUuZ2V0UGF0aCgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29va2llLmdldE1heEFnZSgpICE9IC0xKSB7CisgICAgICAgICAgICBiLmFwcGVuZCgiO01heC1BZ2U9Iik7CisgICAgICAgICAgICBiLmFwcGVuZChjb29raWUuZ2V0TWF4QWdlKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChjb29raWUuaXNTZWN1cmUoKSkgeworICAgICAgICAgICAgYi5hcHBlbmQoIjtTZWN1cmUiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29va2llLmlzSHR0cE9ubHkoKSkgeworICAgICAgICAgICAgYi5hcHBlbmQoIjtIdHRwT25seSIpOworICAgICAgICB9CisgICAgICAgIGlmIChjb29raWUuZ2V0RXhwaXJ5KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgYi5hcHBlbmQoIjtFeHBpcmVzPSIpOworICAgICAgICAgICAgYi5hcHBlbmQoSHR0cERhdGVGb3JtYXQuZ2V0UHJlZmVycmVkRGF0ZUZvcm1hdCgpLmZvcm1hdChjb29raWUuZ2V0RXhwaXJ5KCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE5ld0Nvb2tpZSBmcm9tU3RyaW5nKGZpbmFsIFN0cmluZyBoZWFkZXIpIHsKKyAgICAgICAgdGhyb3dJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25JZk51bGwoaGVhZGVyLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5ORVdfQ09PS0lFX0lTX05VTEwoKSk7CisgICAgICAgIHJldHVybiBIdHRwSGVhZGVyUmVhZGVyLnJlYWROZXdDb29raWUoaGVhZGVyKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvTnVsbE91dHB1dFN0cmVhbS5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL051bGxPdXRwdXRTdHJlYW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGY5YzUzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL051bGxPdXRwdXRTdHJlYW0uamF2YQpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CisKKy8qKgorICogQSB7QGNvZGUgImRldi9udWxsIn0gb3V0cHV0IHN0cmVhbSAtIGFuIG91dHB1dCBzdHJlYW0gaW1wbGVtZW50YXRpb24gdGhhdCBkaXNjYXJkcyBhbGwgdGhlCisgKiBkYXRhIHdyaXR0ZW4gdG8gaXQuIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgbm90IHRocmVhZC1zYWZlLgorICoKKyAqIE5vdGUgdGhhdCBvbmNlIGEgbnVsbCBvdXRwdXQgc3RyZWFtIGluc3RhbmNlIGlzIHtAbGluayAjY2xvc2UoKSBjbG9zZWR9LCBhbnkgc3Vic2VxdWVudCBhdHRlbXB0cworICogdG8gd3JpdGUgdGhlIGRhdGEgdG8gdGhlIGNsb3NlZCBzdHJlYW0gcmVzdWx0IGluIGFuIHtAbGluayBqYXZhLmlvLklPRXhjZXB0aW9ufSBiZWluZyB0aHJvd24uCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIE51bGxPdXRwdXRTdHJlYW0gZXh0ZW5kcyBPdXRwdXRTdHJlYW0geworCisgICAgcHJpdmF0ZSBib29sZWFuIGlzQ2xvc2VkOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNoZWNrQ2xvc2VkKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNoZWNrQ2xvc2VkKCk7CisgICAgICAgIGlmIChiID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOworICAgICAgICB9IGVsc2UgaWYgKChvZmYgPCAwKSB8fCAob2ZmID4gYi5sZW5ndGgpIHx8IChsZW4gPCAwKSB8fCAoKG9mZiArIGxlbikgPiBiLmxlbmd0aCkgfHwgKChvZmYgKyBsZW4pIDwgMCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNoZWNrQ2xvc2VkKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrQ2xvc2VkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGlzQ2xvc2VkKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuT1VUUFVUX1NUUkVBTV9DTE9TRUQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlzQ2xvc2VkID0gdHJ1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvT3V0Ym91bmRKYXhyc1Jlc3BvbnNlLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvT3V0Ym91bmRKYXhyc1Jlc3BvbnNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY4Njk5ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9PdXRib3VuZEpheHJzUmVzcG9uc2UuamF2YQpAQCAtMCwwICsxLDY3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5DYWNoZUNvbnRyb2w7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5FbnRpdHlUYWc7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTGluazsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTmV3Q29va2llOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVmFyaWFudDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworCisvKioKKyAqIEFuIG91dGJvdW5kIEpBWC1SUyByZXNwb25zZSBtZXNzYWdlLgorICoKKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiBkZWxlZ2F0ZXMgbWV0aG9kIGNhbGxzIHRvIGFuIHtAbGluayAjZ2V0Q29udGV4dCgpIHVuZGVybHlpbmcKKyAqIG91dGJvdW5kIG1lc3NhZ2UgY29udGV4dH0uCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIE91dGJvdW5kSmF4cnNSZXNwb25zZSBleHRlbmRzIGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2UgeworCisgICAgcHJpdmF0ZSBmaW5hbCBPdXRib3VuZE1lc3NhZ2VDb250ZXh0IGNvbnRleHQ7CisgICAgcHJpdmF0ZSBmaW5hbCBTdGF0dXNUeXBlIHN0YXR1czsKKworICAgIHByaXZhdGUgYm9vbGVhbiBjbG9zZWQgPSBmYWxzZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gYnVmZmVyZWQgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIEdldCBhbiBPdXRib3VuZEpheHJzUmVzcG9uc2UgaW5zdGFuY2UgZm9yIGEgZ2l2ZW4gSkFYLVJTIHJlc3BvbnNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc3BvbnNlIHJlc3BvbnNlIGluc3RhbmNlIHRvIGZyb20uCisgICAgICogQHJldHVybiBjb3JyZXNwb25kaW5nIHtAY29kZSBPdXRib3VuZEpheHJzUmVzcG9uc2V9IGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT3V0Ym91bmRKYXhyc1Jlc3BvbnNlIGZyb20oamF2YXgud3MucnMuY29yZS5SZXNwb25zZSByZXNwb25zZSkgeworICAgICAgICBpZiAocmVzcG9uc2UgaW5zdGFuY2VvZiBPdXRib3VuZEpheHJzUmVzcG9uc2UpIHsKKyAgICAgICAgICAgIHJldHVybiAoT3V0Ym91bmRKYXhyc1Jlc3BvbnNlKSByZXNwb25zZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbmFsIFN0YXR1c1R5cGUgc3RhdHVzID0gcmVzcG9uc2UuZ2V0U3RhdHVzSW5mbygpOworICAgICAgICAgICAgZmluYWwgT3V0Ym91bmRNZXNzYWdlQ29udGV4dCBjb250ZXh0ID0gbmV3IE91dGJvdW5kTWVzc2FnZUNvbnRleHQoKTsKKyAgICAgICAgICAgIGNvbnRleHQuZ2V0SGVhZGVycygpLnB1dEFsbChyZXNwb25zZS5nZXRNZXRhZGF0YSgpKTsKKyAgICAgICAgICAgIGNvbnRleHQuc2V0RW50aXR5KHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgT3V0Ym91bmRKYXhyc1Jlc3BvbnNlKHN0YXR1cywgY29udGV4dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IG91dGJvdW5kIEpBWC1SUyByZXNwb25zZSBtZXNzYWdlIGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHN0YXR1cyAgcmVzcG9uc2Ugc3RhdHVzLgorICAgICAqIEBwYXJhbSBjb250ZXh0IHVuZGVybHlpbmcgb3V0Ym91bmQgbWVzc2FnZSBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBPdXRib3VuZEpheHJzUmVzcG9uc2UoU3RhdHVzVHlwZSBzdGF0dXMsIE91dGJvdW5kTWVzc2FnZUNvbnRleHQgY29udGV4dCkgeworICAgICAgICB0aGlzLnN0YXR1cyA9IHN0YXR1czsKKyAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHVuZGVybHlpbmcgb3V0Ym91bmQgbWVzc2FnZSBjb250ZXh0LgorICAgICAqCisgICAgICogQHJldHVybiB1bmRlcmx5aW5nIG91dGJvdW5kIG1lc3NhZ2UgY29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgT3V0Ym91bmRNZXNzYWdlQ29udGV4dCBnZXRDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gY29udGV4dDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldFN0YXR1cygpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1cy5nZXRTdGF0dXNDb2RlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0YXR1c1R5cGUgZ2V0U3RhdHVzSW5mbygpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IGdldEVudGl0eSgpIHsKKyAgICAgICAgaWYgKGNsb3NlZCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5SRVNQT05TRV9DTE9TRUQoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0RW50aXR5KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxUPiBUIHJlYWRFbnRpdHkoQ2xhc3M8VD4gdHlwZSkgdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLk5PVF9TVVBQT1JURURfT05fT1VUQk9VTkRfTUVTU0FHRSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFQ+IFQgcmVhZEVudGl0eShHZW5lcmljVHlwZTxUPiBlbnRpdHlUeXBlKSB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuTk9UX1NVUFBPUlRFRF9PTl9PVVRCT1VORF9NRVNTQUdFKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gVCByZWFkRW50aXR5KENsYXNzPFQ+IHR5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucykgdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLk5PVF9TVVBQT1JURURfT05fT1VUQk9VTkRfTUVTU0FHRSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFQ+IFQgcmVhZEVudGl0eShHZW5lcmljVHlwZTxUPiBlbnRpdHlUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMpIHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5OT1RfU1VQUE9SVEVEX09OX09VVEJPVU5EX01FU1NBR0UoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaGFzRW50aXR5KCkgeworICAgICAgICBpZiAoY2xvc2VkKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlJFU1BPTlNFX0NMT1NFRCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29udGV4dC5oYXNFbnRpdHkoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBidWZmZXJFbnRpdHkoKSB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjbG9zZWQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuUkVTUE9OU0VfQ0xPU0VEKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFjb250ZXh0Lmhhc0VudGl0eSgpIHx8ICFJbnB1dFN0cmVhbS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNvbnRleHQuZ2V0RW50aXR5Q2xhc3MoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChidWZmZXJlZCkgeworICAgICAgICAgICAgLy8gYWxyZWFkeSBidWZmZXJlZAorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gaW4gPSBJbnB1dFN0cmVhbS5jbGFzcy5jYXN0KGNvbnRleHQuZ2V0RW50aXR5KCkpOworICAgICAgICBmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbMTAyNF07CisgICAgICAgIGludCBsZW47CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3aGlsZSAoKGxlbiA9IGluLnJlYWQoYnVmZmVyKSkgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBvdXQud3JpdGUoYnVmZmVyLCAwLCBsZW4pOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oZXgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpbi5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbihleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjb250ZXh0LnNldEVudGl0eShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob3V0LnRvQnl0ZUFycmF5KCkpKTsKKyAgICAgICAgYnVmZmVyZWQgPSB0cnVlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgY2xvc2VkID0gdHJ1ZTsKKyAgICAgICAgY29udGV4dC5jbG9zZSgpOworICAgICAgICBpZiAoYnVmZmVyZWQpIHsKKyAgICAgICAgICAgIC8vIHJlbGVhc2UgYnVmZmVyCisgICAgICAgICAgICBjb250ZXh0LnNldEVudGl0eShudWxsKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lmhhc0VudGl0eSgpICYmIElucHV0U3RyZWFtLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY29udGV4dC5nZXRFbnRpdHlDbGFzcygpKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbS5jbGFzcy5jYXN0KGNvbnRleHQuZ2V0RW50aXR5KCkpLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0U3RyaW5nSGVhZGVycygpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0U3RyaW5nSGVhZGVycygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0SGVhZGVyU3RyaW5nKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBjb250ZXh0LmdldEhlYWRlclN0cmluZyhuYW1lKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWVkaWFUeXBlIGdldE1lZGlhVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0TWVkaWFUeXBlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExvY2FsZSBnZXRMYW5ndWFnZSgpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0TGFuZ3VhZ2UoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldExlbmd0aCgpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0TGVuZ3RoKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1hcDxTdHJpbmcsIE5ld0Nvb2tpZT4gZ2V0Q29va2llcygpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0UmVzcG9uc2VDb29raWVzKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEVudGl0eVRhZyBnZXRFbnRpdHlUYWcoKSB7CisgICAgICAgIHJldHVybiBjb250ZXh0LmdldEVudGl0eVRhZygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBEYXRlIGdldERhdGUoKSB7CisgICAgICAgIHJldHVybiBjb250ZXh0LmdldERhdGUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRGF0ZSBnZXRMYXN0TW9kaWZpZWQoKSB7CisgICAgICAgIHJldHVybiBjb250ZXh0LmdldExhc3RNb2RpZmllZCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRBbGxvd2VkTWV0aG9kcygpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0QWxsb3dlZE1ldGhvZHMoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVVJJIGdldExvY2F0aW9uKCkgeworICAgICAgICByZXR1cm4gY29udGV4dC5nZXRMb2NhdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8TGluaz4gZ2V0TGlua3MoKSB7CisgICAgICAgIHJldHVybiBjb250ZXh0LmdldExpbmtzKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaGFzTGluayhTdHJpbmcgcmVsYXRpb24pIHsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQuaGFzTGluayhyZWxhdGlvbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpbmsgZ2V0TGluayhTdHJpbmcgcmVsYXRpb24pIHsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0TGluayhyZWxhdGlvbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpbmsuQnVpbGRlciBnZXRMaW5rQnVpbGRlcihTdHJpbmcgcmVsYXRpb24pIHsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0TGlua0J1aWxkZXIocmVsYXRpb24pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0TWV0YWRhdGEoKSB7CisgICAgICAgIHJldHVybiBjb250ZXh0LmdldEhlYWRlcnMoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIk91dGJvdW5kSmF4cnNSZXNwb25zZXsiCisgICAgICAgICAgICAgICAgKyAic3RhdHVzPSIgKyBzdGF0dXMuZ2V0U3RhdHVzQ29kZSgpCisgICAgICAgICAgICAgICAgKyAiLCByZWFzb249IiArIHN0YXR1cy5nZXRSZWFzb25QaHJhc2UoKQorICAgICAgICAgICAgICAgICsgIiwgaGFzRW50aXR5PSIgKyBjb250ZXh0Lmhhc0VudGl0eSgpCisgICAgICAgICAgICAgICAgKyAiLCBjbG9zZWQ9IiArIGNsb3NlZAorICAgICAgICAgICAgICAgICsgIiwgYnVmZmVyZWQ9IiArIGJ1ZmZlcmVkICsgIn0iOworICAgIH0KKworICAgIC8qKgorICAgICAqIE91dGJvdW5kIEpBWC1SUyB7QGNvZGUgUmVzcG9uc2UuUmVzcG9uc2VCdWlsZGVyfSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKgorICAgICAqIFRoZSBpbXBsZW1lbnRhdGlvbiBkZWxlZ2F0ZXMgbWV0aG9kIGNhbGxzIHRvIGFuIHtAbGluayAjZ2V0Q29udGV4dCgpIHVuZGVybHlpbmcKKyAgICAgKiBvdXRib3VuZCBtZXNzYWdlIGNvbnRleHR9LiBVcG9uIGEgY2FsbCB0byBhIHtAbGluayAjYnVpbGQoKX0gbWV0aG9kCisgICAgICogYSBuZXcgaW5zdGFuY2Ugb2Yge0BsaW5rIE91dGJvdW5kSmF4cnNSZXNwb25zZX0gaXMgcHJvZHVjZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyIGV4dGVuZHMgUmVzcG9uc2VCdWlsZGVyIHsKKworICAgICAgICBwcml2YXRlIFN0YXR1c1R5cGUgc3RhdHVzOworICAgICAgICBwcml2YXRlIGZpbmFsIE91dGJvdW5kTWVzc2FnZUNvbnRleHQgY29udGV4dDsKKworICAgICAgICAvKiB0aHJlYWQtbG9jYWwgc3RvcmFnZSBmb3IgcmVxdWVzdCBiYXNlVXJpIGZvciB1c2UgaW4gdGhlIHJlc3BvbnNlIGhlYWRlcnMgKi8KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW5oZXJpdGFibGVUaHJlYWRMb2NhbDxVUkk+IGJhc2VVcmlUaHJlYWRMb2NhbCA9IG5ldyBJbmhlcml0YWJsZVRocmVhZExvY2FsPFVSST4oKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSB7QGNvZGUgYmFzZVVyaX0gb2YgdGhlIGFjdHVhbCByZXF1ZXN0IGludG8gdGhlIHtAbGluayBJbmhlcml0YWJsZVRocmVhZExvY2FsfS4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoZSB7QGNvZGUgYmFzZVVyaX0gd2lsbCBiZSB1c2VkIGZvciBhYnNvbHV0aXppbmcgdGhlIGxvY2F0aW9uIGhlYWRlcgorICAgICAgICAgKiBjb250ZW50IGluIGNhc2UgdGhhdCBvbmx5IGEgcmVsYXRpdmUgVVJJIGlzIHByb3ZpZGVkLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBBZnRlciByZXNvdXJjZSBtZXRob2QgaW52b2NhdGlvbiB3aGVuIHRoZSB2YWx1ZSBpcyBub3QgbmVlZGVkCisgICAgICAgICAqIGFueSBtb3JlIHRvIGJlIHN0b3JlZCBpbiB7QGNvZGUgVGhyZWFkTG9jYWx9IHtAbGluayAjY2xlYXJCYXNlVXJpKCkgY2xlYXJCYXNlVXJpKCl9IHNob3VsZCBiZQorICAgICAgICAgKiBjYWxsZWQgZm9yIGNsZWFudXAgaW4gb3JkZXIgdG8gcHJldmVudCBwb3NzaWJsZSBtZW1vcnkgbGVha3MuCisgICAgICAgICAqIDwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGJhc2VVcmkgLSBiYXNlVXJpIG9mIHRoZSBhY3R1YWwgcmVxdWVzdAorICAgICAgICAgKiBAc2VlICNsb2NhdGlvbihqYXZhLm5ldC5VUkkpCisgICAgICAgICAqIEBzaW5jZSAyLjQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRCYXNlVXJpKFVSSSBiYXNlVXJpKSB7CisgICAgICAgICAgICBiYXNlVXJpVGhyZWFkTG9jYWwuc2V0KGJhc2VVcmkpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybiByZXF1ZXN0IGJhc2VVcmkgcHJldmlvdXNseSBzZXQgYnkge0BsaW5rICNzZXRCYXNlVXJpKGphdmEubmV0LlVSSSl9LgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5lZCB7QGxpbmsgVVJJfSBpcyB1c2VkIGZvciBhYnNvbHV0aXphdGlvbiBvZiB0aGUgbG9jYXRpb24gaGVhZGVyIGluIGNhc2UgdGhhdCBvbmx5IGEgcmVsYXRpdmUKKyAgICAgICAgICoge0Bjb2RlIFVSSX0gd2FzIHByb3ZpZGVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIGJhc2VVcmkgb2YgdGhlIGFjdHVhbCByZXF1ZXN0CisgICAgICAgICAqIEBzZWUgI2xvY2F0aW9uKGphdmEubmV0LlVSSSkKKyAgICAgICAgICogQHNpbmNlIDIuNAorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgVVJJIGdldEJhc2VVcmkoKSB7CisgICAgICAgICAgICByZXR1cm4gYmFzZVVyaVRocmVhZExvY2FsLmdldCgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlbW92ZSB0aGUgY3VycmVudCB0aHJlYWQncyB2YWx1ZSBmb3IgYmFzZVVyaSB0aHJlYWQtbG9jYWwgdmFyaWFibGUgKHNldCBieSB7QGxpbmsgI3NldEJhc2VVcmkoamF2YS5uZXQuVVJJKX0pLgorICAgICAgICAgKgorICAgICAgICAgKiBTaG91bGQgYmUgY2FsbGVkIGFmdGVyIHJlc291cmNlIG1ldGhvZCBpbnZvY2F0aW9uIGZvciBjbGVhbnVwLgorICAgICAgICAgKgorICAgICAgICAgKiBAc2VlICNsb2NhdGlvbihqYXZhLm5ldC5VUkkpCisgICAgICAgICAqIEBzaW5jZSAyLjQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjbGVhckJhc2VVcmkoKSB7CisgICAgICAgICAgICBiYXNlVXJpVGhyZWFkTG9jYWwucmVtb3ZlKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIG5ldyBvdXRib3VuZCBKQVgtUlMgcmVzcG9uc2UgYnVpbGRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNvbnRleHQgdW5kZXJseWluZyBvdXRib3VuZCBtZXNzYWdlIGNvbnRleHQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlcihmaW5hbCBPdXRib3VuZE1lc3NhZ2VDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2UgYnVpbGQoKSB7CisgICAgICAgICAgICBTdGF0dXNUeXBlIHN0ID0gc3RhdHVzOworICAgICAgICAgICAgaWYgKHN0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzdCA9IGNvbnRleHQuaGFzRW50aXR5KCkgPyBTdGF0dXMuT0sgOiBTdGF0dXMuTk9fQ09OVEVOVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgT3V0Ym91bmRKYXhyc1Jlc3BvbnNlKHN0LCBuZXcgT3V0Ym91bmRNZXNzYWdlQ29udGV4dChjb250ZXh0KSk7CisgICAgICAgIH0KKworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IkNsb25lRG9lc250Q2FsbFN1cGVyQ2xvbmUiLCAiQ2xvbmVEb2VzbnREZWNsYXJlQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24ifSkKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNwb25zZUJ1aWxkZXIgY2xvbmUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIobmV3IE91dGJvdW5kTWVzc2FnZUNvbnRleHQoY29udGV4dCkpLnN0YXR1cyhzdGF0dXMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlLlJlc3BvbnNlQnVpbGRlciBzdGF0dXMoU3RhdHVzVHlwZSBzdGF0dXMpIHsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlc3BvbnNlIHN0YXR1cyBtdXN0IG5vdCBiZSAnbnVsbCciKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzcG9uc2VCdWlsZGVyIHN0YXR1cyhpbnQgc3RhdHVzLCBmaW5hbCBTdHJpbmcgcmVhc29uUGhyYXNlKSB7CisgICAgICAgICAgICBpZiAoc3RhdHVzIDwgMTAwIHx8IHN0YXR1cyA+IDU5OSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlc3BvbnNlIHN0YXR1cyBtdXN0IG5vdCBiZSBsZXNzIHRoYW4gJzEwMCcgb3IgZ3JlYXRlciB0aGFuICc1OTknIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIFN0YXR1cy5GYW1pbHkgZmFtaWx5ID0gU3RhdHVzLkZhbWlseS5mYW1pbHlPZihzdGF0dXMpOworCisgICAgICAgICAgICB0aGlzLnN0YXR1cyA9IG5ldyBTdGF0dXNUeXBlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0U3RhdHVzQ29kZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgU3RhdHVzLkZhbWlseSBnZXRGYW1pbHkoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYW1pbHk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRSZWFzb25QaHJhc2UoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFzb25QaHJhc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2UuUmVzcG9uc2VCdWlsZGVyIHN0YXR1cyhpbnQgY29kZSkgeworICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSBTdGF0dXNlcy5mcm9tKGNvZGUpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2UuUmVzcG9uc2VCdWlsZGVyIGVudGl0eShPYmplY3QgZW50aXR5KSB7CisgICAgICAgICAgICBjb250ZXh0LnNldEVudGl0eShlbnRpdHkpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc3BvbnNlQnVpbGRlciBlbnRpdHkoT2JqZWN0IGVudGl0eSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zKSB7CisgICAgICAgICAgICBjb250ZXh0LnNldEVudGl0eShlbnRpdHksIGFubm90YXRpb25zKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlLlJlc3BvbnNlQnVpbGRlciB0eXBlKE1lZGlhVHlwZSB0eXBlKSB7CisgICAgICAgICAgICBjb250ZXh0LnNldE1lZGlhVHlwZSh0eXBlKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlLlJlc3BvbnNlQnVpbGRlciB0eXBlKFN0cmluZyB0eXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZSh0eXBlID09IG51bGwgPyBudWxsIDogTWVkaWFUeXBlLnZhbHVlT2YodHlwZSkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlLlJlc3BvbnNlQnVpbGRlciB2YXJpYW50KFZhcmlhbnQgdmFyaWFudCkgeworICAgICAgICAgICAgaWYgKHZhcmlhbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHR5cGUoKE1lZGlhVHlwZSkgbnVsbCk7CisgICAgICAgICAgICAgICAgbGFuZ3VhZ2UoKFN0cmluZykgbnVsbCk7CisgICAgICAgICAgICAgICAgZW5jb2RpbmcobnVsbCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHR5cGUodmFyaWFudC5nZXRNZWRpYVR5cGUoKSk7CisgICAgICAgICAgICBsYW5ndWFnZSh2YXJpYW50LmdldExhbmd1YWdlKCkpOworICAgICAgICAgICAgZW5jb2RpbmcodmFyaWFudC5nZXRFbmNvZGluZygpKTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2UuUmVzcG9uc2VCdWlsZGVyIHZhcmlhbnRzKExpc3Q8VmFyaWFudD4gdmFyaWFudHMpIHsKKyAgICAgICAgICAgIGlmICh2YXJpYW50cyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaGVhZGVyKEh0dHBIZWFkZXJzLlZBUlksIG51bGwpOworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodmFyaWFudHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE1lZGlhVHlwZSBhY2NlcHQgPSB2YXJpYW50cy5nZXQoMCkuZ2V0TWVkaWFUeXBlKCk7CisgICAgICAgICAgICBib29sZWFuIHZBY2NlcHQgPSBmYWxzZTsKKworICAgICAgICAgICAgTG9jYWxlIGFjY2VwdExhbmd1YWdlID0gdmFyaWFudHMuZ2V0KDApLmdldExhbmd1YWdlKCk7CisgICAgICAgICAgICBib29sZWFuIHZBY2NlcHRMYW5ndWFnZSA9IGZhbHNlOworCisgICAgICAgICAgICBTdHJpbmcgYWNjZXB0RW5jb2RpbmcgPSB2YXJpYW50cy5nZXQoMCkuZ2V0RW5jb2RpbmcoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gdkFjY2VwdEVuY29kaW5nID0gZmFsc2U7CisKKyAgICAgICAgICAgIGZvciAoVmFyaWFudCB2IDogdmFyaWFudHMpIHsKKyAgICAgICAgICAgICAgICB2QWNjZXB0IHw9ICF2QWNjZXB0ICYmIHZhcnkodi5nZXRNZWRpYVR5cGUoKSwgYWNjZXB0KTsKKyAgICAgICAgICAgICAgICB2QWNjZXB0TGFuZ3VhZ2UgfD0gIXZBY2NlcHRMYW5ndWFnZSAmJiB2YXJ5KHYuZ2V0TGFuZ3VhZ2UoKSwgYWNjZXB0TGFuZ3VhZ2UpOworICAgICAgICAgICAgICAgIHZBY2NlcHRFbmNvZGluZyB8PSAhdkFjY2VwdEVuY29kaW5nICYmIHZhcnkodi5nZXRFbmNvZGluZygpLCBhY2NlcHRFbmNvZGluZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgdmFyeSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBhcHBlbmQodmFyeSwgdkFjY2VwdCwgSHR0cEhlYWRlcnMuQUNDRVBUKTsKKyAgICAgICAgICAgIGFwcGVuZCh2YXJ5LCB2QWNjZXB0TGFuZ3VhZ2UsIEh0dHBIZWFkZXJzLkFDQ0VQVF9MQU5HVUFHRSk7CisgICAgICAgICAgICBhcHBlbmQodmFyeSwgdkFjY2VwdEVuY29kaW5nLCBIdHRwSGVhZGVycy5BQ0NFUFRfRU5DT0RJTkcpOworCisgICAgICAgICAgICBpZiAodmFyeS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBoZWFkZXIoSHR0cEhlYWRlcnMuVkFSWSwgdmFyeS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIHZhcnkoTWVkaWFUeXBlIHYsIE1lZGlhVHlwZSB2YXJ5KSB7CisgICAgICAgICAgICByZXR1cm4gdiAhPSBudWxsICYmICF2LmVxdWFscyh2YXJ5KTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiB2YXJ5KExvY2FsZSB2LCBMb2NhbGUgdmFyeSkgeworICAgICAgICAgICAgcmV0dXJuIHYgIT0gbnVsbCAmJiAhdi5lcXVhbHModmFyeSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gdmFyeShTdHJpbmcgdiwgU3RyaW5nIHZhcnkpIHsKKyAgICAgICAgICAgIHJldHVybiB2ICE9IG51bGwgJiYgIXYuZXF1YWxzSWdub3JlQ2FzZSh2YXJ5KTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBhcHBlbmQoU3RyaW5nQnVpbGRlciBzYiwgYm9vbGVhbiB2LCBTdHJpbmcgcykgeworICAgICAgICAgICAgaWYgKHYpIHsKKyAgICAgICAgICAgICAgICBpZiAoc2IubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnLCcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQocyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2UuUmVzcG9uc2VCdWlsZGVyIGxhbmd1YWdlKFN0cmluZyBsYW5ndWFnZSkgeworICAgICAgICAgICAgaGVhZGVyU2luZ2xlKEh0dHBIZWFkZXJzLkNPTlRFTlRfTEFOR1VBR0UsIGxhbmd1YWdlKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlLlJlc3BvbnNlQnVpbGRlciBsYW5ndWFnZShMb2NhbGUgbGFuZ3VhZ2UpIHsKKyAgICAgICAgICAgIGhlYWRlclNpbmdsZShIdHRwSGVhZGVycy5DT05URU5UX0xBTkdVQUdFLCBsYW5ndWFnZSk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgamF2YXgud3MucnMuY29yZS5SZXNwb25zZS5SZXNwb25zZUJ1aWxkZXIgbG9jYXRpb24oVVJJIGxvY2F0aW9uKSB7CisgICAgICAgICAgICBVUkkgbG9jYXRpb25VcmkgPSBsb2NhdGlvbjsKKyAgICAgICAgICAgIGlmIChsb2NhdGlvbiAhPSBudWxsICYmICFsb2NhdGlvbi5pc0Fic29sdXRlKCkpIHsKKyAgICAgICAgICAgICAgICBVUkkgYmFzZVVyaSA9IGdldEJhc2VVcmkoKTsKKyAgICAgICAgICAgICAgICBpZiAoYmFzZVVyaSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uVXJpID0gYmFzZVVyaS5yZXNvbHZlKGxvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoZWFkZXJTaW5nbGUoSHR0cEhlYWRlcnMuTE9DQVRJT04sIGxvY2F0aW9uVXJpKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlLlJlc3BvbnNlQnVpbGRlciBjb250ZW50TG9jYXRpb24oVVJJIGxvY2F0aW9uKSB7CisgICAgICAgICAgICBoZWFkZXJTaW5nbGUoSHR0cEhlYWRlcnMuQ09OVEVOVF9MT0NBVElPTiwgbG9jYXRpb24pOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2UuUmVzcG9uc2VCdWlsZGVyIGVuY29kaW5nKFN0cmluZyBlbmNvZGluZykgeworICAgICAgICAgICAgaGVhZGVyU2luZ2xlKEh0dHBIZWFkZXJzLkNPTlRFTlRfRU5DT0RJTkcsIGVuY29kaW5nKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlLlJlc3BvbnNlQnVpbGRlciB0YWcoRW50aXR5VGFnIHRhZykgeworICAgICAgICAgICAgaGVhZGVyU2luZ2xlKEh0dHBIZWFkZXJzLkVUQUcsIHRhZyk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgamF2YXgud3MucnMuY29yZS5SZXNwb25zZS5SZXNwb25zZUJ1aWxkZXIgdGFnKFN0cmluZyB0YWcpIHsKKyAgICAgICAgICAgIHJldHVybiB0YWcodGFnID09IG51bGwgPyBudWxsIDogbmV3IEVudGl0eVRhZyh0YWcpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgamF2YXgud3MucnMuY29yZS5SZXNwb25zZS5SZXNwb25zZUJ1aWxkZXIgbGFzdE1vZGlmaWVkKERhdGUgbGFzdE1vZGlmaWVkKSB7CisgICAgICAgICAgICBoZWFkZXJTaW5nbGUoSHR0cEhlYWRlcnMuTEFTVF9NT0RJRklFRCwgbGFzdE1vZGlmaWVkKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlLlJlc3BvbnNlQnVpbGRlciBjYWNoZUNvbnRyb2woQ2FjaGVDb250cm9sIGNhY2hlQ29udHJvbCkgeworICAgICAgICAgICAgaGVhZGVyU2luZ2xlKEh0dHBIZWFkZXJzLkNBQ0hFX0NPTlRST0wsIGNhY2hlQ29udHJvbCk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgamF2YXgud3MucnMuY29yZS5SZXNwb25zZS5SZXNwb25zZUJ1aWxkZXIgZXhwaXJlcyhEYXRlIGV4cGlyZXMpIHsKKyAgICAgICAgICAgIGhlYWRlclNpbmdsZShIdHRwSGVhZGVycy5FWFBJUkVTLCBleHBpcmVzKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlLlJlc3BvbnNlQnVpbGRlciBjb29raWUoTmV3Q29va2llLi4uIGNvb2tpZXMpIHsKKyAgICAgICAgICAgIGlmIChjb29raWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKE5ld0Nvb2tpZSBjb29raWUgOiBjb29raWVzKSB7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcihIdHRwSGVhZGVycy5TRVRfQ09PS0lFLCBjb29raWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaGVhZGVyKEh0dHBIZWFkZXJzLlNFVF9DT09LSUUsIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2UuUmVzcG9uc2VCdWlsZGVyIGhlYWRlcihTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gaGVhZGVyKG5hbWUsIHZhbHVlLCBmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2UuUmVzcG9uc2VCdWlsZGVyIGhlYWRlclNpbmdsZShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gaGVhZGVyKG5hbWUsIHZhbHVlLCB0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgamF2YXgud3MucnMuY29yZS5SZXNwb25zZS5SZXNwb25zZUJ1aWxkZXIgaGVhZGVyKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUsIGJvb2xlYW4gc2luZ2xlKSB7CisgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChzaW5nbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRIZWFkZXJzKCkucHV0U2luZ2xlKG5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldEhlYWRlcnMoKS5hZGQobmFtZSwgdmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5nZXRIZWFkZXJzKCkucmVtb3ZlKG5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc3BvbnNlQnVpbGRlciB2YXJpYW50cyhWYXJpYW50Li4uIHZhcmlhbnRzKSB7CisgICAgICAgICAgICByZXR1cm4gdmFyaWFudHMoQXJyYXlzLmFzTGlzdCh2YXJpYW50cykpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNwb25zZUJ1aWxkZXIgbGlua3MoTGluay4uLiBsaW5rcykgeworICAgICAgICAgICAgaWYgKGxpbmtzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKExpbmsgbGluayA6IGxpbmtzKSB7CisgICAgICAgICAgICAgICAgICAgIGhlYWRlcihIdHRwSGVhZGVycy5MSU5LLCBsaW5rKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGhlYWRlcihIdHRwSGVhZGVycy5MSU5LLCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNwb25zZUJ1aWxkZXIgbGluayhVUkkgdXJpLCBTdHJpbmcgcmVsKSB7CisgICAgICAgICAgICBoZWFkZXIoSHR0cEhlYWRlcnMuTElOSywgTGluay5mcm9tVXJpKHVyaSkucmVsKHJlbCkuYnVpbGQoKSk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzcG9uc2VCdWlsZGVyIGxpbmsoU3RyaW5nIHVyaSwgU3RyaW5nIHJlbCkgeworICAgICAgICAgICAgaGVhZGVyKEh0dHBIZWFkZXJzLkxJTkssIExpbmsuZnJvbVVyaSh1cmkpLnJlbChyZWwpLmJ1aWxkKCkpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc3BvbnNlQnVpbGRlciBhbGxvdyhTdHJpbmcuLi4gbWV0aG9kcykgeworICAgICAgICAgICAgaWYgKG1ldGhvZHMgPT0gbnVsbCB8fCAobWV0aG9kcy5sZW5ndGggPT0gMSAmJiBtZXRob2RzWzBdID09IG51bGwpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFsbG93KChTZXQ8U3RyaW5nPikgbnVsbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBhbGxvdyhuZXcgSGFzaFNldDxTdHJpbmc+KEFycmF5cy5hc0xpc3QobWV0aG9kcykpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzcG9uc2VCdWlsZGVyIGFsbG93KFNldDxTdHJpbmc+IG1ldGhvZHMpIHsKKyAgICAgICAgICAgIGlmIChtZXRob2RzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaGVhZGVyKEh0dHBIZWFkZXJzLkFMTE9XLCBudWxsLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBhbGxvdyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBtIDogbWV0aG9kcykgeworICAgICAgICAgICAgICAgIGFwcGVuZChhbGxvdywgdHJ1ZSwgbSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gaGVhZGVyKEh0dHBIZWFkZXJzLkFMTE9XLCBhbGxvdywgdHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc3BvbnNlQnVpbGRlciByZXBsYWNlQWxsKE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBoZWFkZXJzKSB7CisgICAgICAgICAgICBjb250ZXh0LnJlcGxhY2VIZWFkZXJzKGhlYWRlcnMpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9PdXRib3VuZE1lc3NhZ2VDb250ZXh0LmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvT3V0Ym91bmRNZXNzYWdlQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiNzYxODIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvT3V0Ym91bmRNZXNzYWdlQ29udGV4dC5qYXZhCkBAIC0wLDAgKzEsODQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db29raWU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5FbnRpdHlUYWc7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY1R5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkxpbms7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk5ld0Nvb2tpZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUnVudGltZURlbGVnYXRlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuQ29tbW9uUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlJlZmxlY3Rpb25IZWxwZXI7CisKKy8qKgorICogQmFzZSBvdXRib3VuZCBtZXNzYWdlIGNvbnRleHQgaW1wbGVtZW50YXRpb24uCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIE91dGJvdW5kTWVzc2FnZUNvbnRleHQgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25bXSBFTVBUWV9BTk5PVEFUSU9OUyA9IG5ldyBBbm5vdGF0aW9uWzBdOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3Q8TWVkaWFUeXBlPiBXSUxEQ0FSRF9BQ0NFUFRBQkxFX1RZUEVfU0lOR0xFVE9OX0xJU1QgPQorICAgICAgICAgICAgQ29sbGVjdGlvbnMuPE1lZGlhVHlwZT5zaW5nbGV0b25MaXN0KE1lZGlhVHlwZXMuV0lMRENBUkRfQUNDRVBUQUJMRV9UWVBFKTsKKworICAgIHByaXZhdGUgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGhlYWRlcnM7CisgICAgcHJpdmF0ZSBmaW5hbCBDb21taXR0aW5nT3V0cHV0U3RyZWFtIGNvbW1pdHRpbmdPdXRwdXRTdHJlYW07CisKKyAgICBwcml2YXRlIE9iamVjdCBlbnRpdHk7CisgICAgcHJpdmF0ZSBHZW5lcmljVHlwZTw/PiBlbnRpdHlUeXBlOworICAgIHByaXZhdGUgQW5ub3RhdGlvbltdIGVudGl0eUFubm90YXRpb25zID0gRU1QVFlfQU5OT1RBVElPTlM7CisgICAgcHJpdmF0ZSBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtOworCisKKyAgICAvKioKKyAgICAgKiBUaGUgY2FsbGJhY2sgaW50ZXJmYWNlIHdoaWNoIGlzIHVzZWQgdG8gZ2V0IHRoZSB0ZXJtaW5hbCBvdXRwdXQgc3RyZWFtIGludG8gd2hpY2ggdGhlIGVudGl0eSBzaG91bGQgYmUKKyAgICAgKiB3cml0dGVuIGFuZCB0byBpbmZvcm0gdGhlIGltcGxlbWVudGF0aW9uIGFib3V0IHRoZSBlbnRpdHkgc2l6ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBTdHJlYW1Qcm92aWRlciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIG91dHB1dCBzdHJlYW0uIFRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIGFmdGVyIGFsbCB0aGUKKyAgICAgICAgICoge0BsaW5rIGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvciB3cml0ZXIgaW50ZXJjZXB0b3JzfSBhcmUgY2FsbGVkIGFuZCB3cml0dGVuIGVudGl0eSBpcyBidWZmZXJlZAorICAgICAgICAgKiBpbnRvIHRoZSBidWZmZXIgb3IgdGhlIGJ1ZmZlciBleGNlZWRzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29udGVudExlbmd0aCB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyZWQgZW50aXR5IG9yIC0xIGlmIHRoZSBlbnRpdHkgZXhjZWVkZWQgdGhlIG1heGltdW0gYnVmZmVyCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgIHNpemUgb3IgaWYgdGhlIGJ1ZmZlcmluZyBpcyBkaXNhYmxlZC4KKyAgICAgICAgICogQHJldHVybiB0aGUgYWRhcHRlZCBvdXRwdXQgc3RyZWFtIGludG8gd2hpY2ggdGhlIHNlcmlhbGl6ZWQgZW50aXR5IHNob3VsZCBiZSB3cml0dGVuLiBNYXkgcmV0dXJuIG51bGwKKyAgICAgICAgICogd2hpY2ggd2lsbCBjYXVzZSBpZ25vcmluZyB0aGUgd3JpdHRlbiBlbnRpdHkgKGluIHRoYXQgY2FzZSB0aGUgZW50aXR5IHdpbGwKKyAgICAgICAgICogc3RpbGwgYmUgd3JpdHRlbiBieSB7QGxpbmsgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyIG1lc3NhZ2UgYm9keSB3cml0ZXJzfQorICAgICAgICAgKiBidXQgdGhlIG91dHB1dCB3aWxsIGJlIGlnbm9yZWQpLgorICAgICAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gaW4gY2FzZSBvZiBhbiBJTyBlcnJvci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKGludCBjb250ZW50TGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyBvdXRib3VuZCBtZXNzYWdlIGNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIE91dGJvdW5kTWVzc2FnZUNvbnRleHQoKSB7CisgICAgICAgIHRoaXMuaGVhZGVycyA9IEhlYWRlclV0aWxzLmNyZWF0ZU91dGJvdW5kKCk7CisgICAgICAgIHRoaXMuY29tbWl0dGluZ091dHB1dFN0cmVhbSA9IG5ldyBDb21taXR0aW5nT3V0cHV0U3RyZWFtKCk7CisgICAgICAgIHRoaXMuZW50aXR5U3RyZWFtID0gY29tbWl0dGluZ091dHB1dFN0cmVhbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IG91dGJvdW5kIG1lc3NhZ2UgY29udGV4dCBjb3B5aW5nIHRoZSBjb250ZW50CisgICAgICogb2YgYW5vdGhlciBjb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIG9yaWdpbmFsIHRoZSBvcmlnaW5hbCBvdXRib3VuZCBtZXNzYWdlIGNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIE91dGJvdW5kTWVzc2FnZUNvbnRleHQoT3V0Ym91bmRNZXNzYWdlQ29udGV4dCBvcmlnaW5hbCkgeworICAgICAgICB0aGlzLmhlYWRlcnMgPSBIZWFkZXJVdGlscy5jcmVhdGVPdXRib3VuZCgpOworICAgICAgICB0aGlzLmhlYWRlcnMucHV0QWxsKG9yaWdpbmFsLmhlYWRlcnMpOworICAgICAgICB0aGlzLmNvbW1pdHRpbmdPdXRwdXRTdHJlYW0gPSBuZXcgQ29tbWl0dGluZ091dHB1dFN0cmVhbSgpOworICAgICAgICB0aGlzLmVudGl0eVN0cmVhbSA9IGNvbW1pdHRpbmdPdXRwdXRTdHJlYW07CisKKyAgICAgICAgdGhpcy5lbnRpdHkgPSBvcmlnaW5hbC5lbnRpdHk7CisgICAgICAgIHRoaXMuZW50aXR5VHlwZSA9IG9yaWdpbmFsLmVudGl0eVR5cGU7CisgICAgICAgIHRoaXMuZW50aXR5QW5ub3RhdGlvbnMgPSBvcmlnaW5hbC5lbnRpdHlBbm5vdGF0aW9uczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXBsYWNlIGFsbCBoZWFkZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIGhlYWRlcnMgbmV3IGhlYWRlcnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVwbGFjZUhlYWRlcnMoTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGhlYWRlcnMpIHsKKyAgICAgICAgZ2V0SGVhZGVycygpLmNsZWFyKCk7CisgICAgICAgIGlmIChoZWFkZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGdldEhlYWRlcnMoKS5wdXRBbGwoaGVhZGVycyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBtdWx0aS12YWx1ZWQgbWFwIHJlcHJlc2VudGluZyBvdXRib3VuZCBtZXNzYWdlIGhlYWRlcnMgd2l0aCB0aGVpciB2YWx1ZXMgY29udmVydGVkCisgICAgICogdG8gc3RyaW5ncy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbXVsdGktdmFsdWVkIG1hcCBvZiBvdXRib3VuZCBtZXNzYWdlIGhlYWRlciBuYW1lcyB0byB0aGVpciBzdHJpbmctY29udmVydGVkIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFN0cmluZ0hlYWRlcnMoKSB7CisgICAgICAgIHJldHVybiBIZWFkZXJVdGlscy5hc1N0cmluZ0hlYWRlcnMoaGVhZGVycyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgbWVzc2FnZSBoZWFkZXIgYXMgYSBzaW5nbGUgc3RyaW5nIHZhbHVlLgorICAgICAqIDxwPgorICAgICAqIEVhY2ggc2luZ2xlIGhlYWRlciB2YWx1ZSBpcyBjb252ZXJ0ZWQgdG8gU3RyaW5nIHVzaW5nIGEKKyAgICAgKiB7QGxpbmsgamF2YXgud3MucnMuZXh0LlJ1bnRpbWVEZWxlZ2F0ZS5IZWFkZXJEZWxlZ2F0ZX0gaWYgb25lIGlzIGF2YWlsYWJsZQorICAgICAqIHZpYSB7QGxpbmsgamF2YXgud3MucnMuZXh0LlJ1bnRpbWVEZWxlZ2F0ZSNjcmVhdGVIZWFkZXJEZWxlZ2F0ZShqYXZhLmxhbmcuQ2xhc3MpfQorICAgICAqIGZvciB0aGUgaGVhZGVyIHZhbHVlIGNsYXNzIG9yIHVzaW5nIGl0cyB7QGNvZGUgdG9TdHJpbmd9IG1ldGhvZCAgaWYgYSBoZWFkZXIKKyAgICAgKiBkZWxlZ2F0ZSBpcyBub3QgYXZhaWxhYmxlLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG1lc3NhZ2UgaGVhZGVyLgorICAgICAqIEByZXR1cm4gdGhlIG1lc3NhZ2UgaGVhZGVyIHZhbHVlLiBJZiB0aGUgbWVzc2FnZSBoZWFkZXIgaXMgbm90IHByZXNlbnQgdGhlbgorICAgICAqIHtAY29kZSBudWxsfSBpcyByZXR1cm5lZC4gSWYgdGhlIG1lc3NhZ2UgaGVhZGVyIGlzIHByZXNlbnQgYnV0IGhhcyBubworICAgICAqIHZhbHVlIHRoZW4gdGhlIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4gSWYgdGhlIG1lc3NhZ2UgaGVhZGVyIGlzIHByZXNlbnQKKyAgICAgKiBtb3JlIHRoYW4gb25jZSB0aGVuIHRoZSB2YWx1ZXMgb2Ygam9pbmVkIHRvZ2V0aGVyIGFuZCBzZXBhcmF0ZWQgYnkgYSAnLCcKKyAgICAgKiBjaGFyYWN0ZXIuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRIZWFkZXJTdHJpbmcoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIEhlYWRlclV0aWxzLmFzSGVhZGVyU3RyaW5nKGhlYWRlcnMuZ2V0KG5hbWUpLCBSdW50aW1lRGVsZWdhdGUuZ2V0SW5zdGFuY2UoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgc2luZ2xlIHR5cGVkIGhlYWRlciB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSA8VD4gICAgICAgICBoZWFkZXIgdmFsdWUgdHlwZS4KKyAgICAgKiBAcGFyYW0gbmFtZSAgICAgICAgaGVhZGVyIG5hbWUuCisgICAgICogQHBhcmFtIHZhbHVlVHlwZSAgIGhlYWRlciB2YWx1ZSBjbGFzcy4KKyAgICAgKiBAcGFyYW0gY29udmVydGVyICAgZnJvbSBzdHJpbmcgY29udmVyc2lvbiBmdW5jdGlvbi4gSXMgZXhwZWN0ZWQgdG8gdGhyb3cge0BsaW5rIFByb2Nlc3NpbmdFeGNlcHRpb259CisgICAgICogICAgICAgICAgICAgICAgICAgIGlmIGNvbnZlcnNpb24gZmFpbHMuCisgICAgICogQHBhcmFtIGNvbnZlcnROdWxsIGlmIHtAY29kZSB0cnVlfSB0aGlzIG1ldGhvZCBjYWxscyB0aGUgcHJvdmlkZWQgY29udmVydGVyIGV2ZW4gZm9yIHtAY29kZSBudWxsfS4gT3RoZXJ3aXNlIHRoaXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgbWV0aG9kIHJldHVybnMgdGhlIHtAY29kZSBudWxsfSB3aXRob3V0IGNhbGxpbmcgdGhlIGNvbnZlcnRlci4KKyAgICAgKiBAcmV0dXJuIHZhbHVlIG9mIHRoZSBoZWFkZXIsIG9yIChwb3NzaWJseSBjb252ZXJ0ZWQpIHtAY29kZSBudWxsfSBpZiBub3QgcHJlc2VudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIDxUPiBUIHNpbmdsZUhlYWRlcihTdHJpbmcgbmFtZSwgQ2xhc3M8VD4gdmFsdWVUeXBlLCBGdW5jdGlvbjxTdHJpbmcsIFQ+IGNvbnZlcnRlciwgYm9vbGVhbiBjb252ZXJ0TnVsbCkgeworICAgICAgICBmaW5hbCBMaXN0PE9iamVjdD4gdmFsdWVzID0gaGVhZGVycy5nZXQobmFtZSk7CisKKyAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsIHx8IHZhbHVlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0TnVsbCA/IGNvbnZlcnRlci5hcHBseShudWxsKSA6IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhbHVlcy5zaXplKCkgPiAxKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSGVhZGVyVmFsdWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIExvY2FsaXphdGlvbk1lc3NhZ2VzLlRPT19NQU5ZX0hFQURFUl9WQUxVRVMobmFtZSwgdmFsdWVzLnRvU3RyaW5nKCkpLAorICAgICAgICAgICAgICAgICAgICBIZWFkZXJWYWx1ZUV4Y2VwdGlvbi5Db250ZXh0Lk9VVEJPVU5EKTsKKyAgICAgICAgfQorCisgICAgICAgIE9iamVjdCB2YWx1ZSA9IHZhbHVlcy5nZXQoMCk7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gY29udmVydE51bGwgPyBjb252ZXJ0ZXIuYXBwbHkobnVsbCkgOiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHZhbHVlVHlwZS5pc0luc3RhbmNlKHZhbHVlKSkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlVHlwZS5jYXN0KHZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRlci5hcHBseShIZWFkZXJVdGlscy5hc1N0cmluZyh2YWx1ZSwgbnVsbCkpOworICAgICAgICAgICAgfSBjYXRjaCAoUHJvY2Vzc2luZ0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbihuYW1lLCB2YWx1ZSwgZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgSGVhZGVyVmFsdWVFeGNlcHRpb24gZXhjZXB0aW9uKGZpbmFsIFN0cmluZyBoZWFkZXJOYW1lLCBPYmplY3QgaGVhZGVyVmFsdWUsIEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIHJldHVybiBuZXcgSGVhZGVyVmFsdWVFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuVU5BQkxFX1RPX1BBUlNFX0hFQURFUl9WQUxVRShoZWFkZXJOYW1lLCBoZWFkZXJWYWx1ZSksIGUsCisgICAgICAgICAgICAgICAgSGVhZGVyVmFsdWVFeGNlcHRpb24uQ29udGV4dC5PVVRCT1VORCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBtdXRhYmxlIG1lc3NhZ2UgaGVhZGVycyBtdWx0aXZhbHVlZCBtYXAuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIG11dGFibGUgbXVsdGl2YWx1ZWQgbWFwIG9mIG1lc3NhZ2UgaGVhZGVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGdldEhlYWRlcnMoKSB7CisgICAgICAgIHJldHVybiBoZWFkZXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBtZXNzYWdlIGRhdGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBtZXNzYWdlIGRhdGUsIG90aGVyd2lzZSB7QGNvZGUgbnVsbH0gaWYgbm90IHByZXNlbnQuCisgICAgICovCisgICAgcHVibGljIERhdGUgZ2V0RGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHNpbmdsZUhlYWRlcihIdHRwSGVhZGVycy5EQVRFLCBEYXRlLmNsYXNzLCBpbnB1dCAtPiB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBIdHRwSGVhZGVyUmVhZGVyLnJlYWREYXRlKGlucHV0KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbGFuZ3VhZ2Ugb2YgdGhlIGVudGl0eS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGxhbmd1YWdlIG9mIHRoZSBlbnRpdHkgb3Ige0Bjb2RlIG51bGx9IGlmIG5vdCBzcGVjaWZpZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgTG9jYWxlIGdldExhbmd1YWdlKCkgeworICAgICAgICByZXR1cm4gc2luZ2xlSGVhZGVyKEh0dHBIZWFkZXJzLkNPTlRFTlRfTEFOR1VBR0UsIExvY2FsZS5jbGFzcywgaW5wdXQgLT4geworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IExhbmd1YWdlVGFnKGlucHV0KS5nZXRBc0xvY2FsZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9LCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBtZWRpYSB0eXBlIG9mIHRoZSBlbnRpdHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBtZWRpYSB0eXBlIG9yIHtAY29kZSBudWxsfSBpZiBub3Qgc3BlY2lmaWVkIChlLmcuIHRoZXJlJ3Mgbm8KKyAgICAgKiBtZXNzYWdlIGVudGl0eSkuCisgICAgICovCisgICAgcHVibGljIE1lZGlhVHlwZSBnZXRNZWRpYVR5cGUoKSB7CisgICAgICAgIHJldHVybiBzaW5nbGVIZWFkZXIoSHR0cEhlYWRlcnMuQ09OVEVOVF9UWVBFLCBNZWRpYVR5cGUuY2xhc3MsIE1lZGlhVHlwZTo6dmFsdWVPZiwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIGxpc3Qgb2YgbWVkaWEgdHlwZXMgdGhhdCBhcmUgYWNjZXB0YWJsZSBmb3IgdGhlIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgcmVhZC1vbmx5IGxpc3Qgb2YgcmVxdWVzdGVkIG1lc3NhZ2UgbWVkaWEgdHlwZXMgc29ydGVkIGFjY29yZGluZworICAgICAqIHRvIHRoZWlyIHEtdmFsdWUsIHdpdGggaGlnaGVzdCBwcmVmZXJlbmNlIGZpcnN0LgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBMaXN0PE1lZGlhVHlwZT4gZ2V0QWNjZXB0YWJsZU1lZGlhVHlwZXMoKSB7CisgICAgICAgIGZpbmFsIExpc3Q8T2JqZWN0PiB2YWx1ZXMgPSBoZWFkZXJzLmdldChIdHRwSGVhZGVycy5BQ0NFUFQpOworCisgICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCB8fCB2YWx1ZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gV0lMRENBUkRfQUNDRVBUQUJMRV9UWVBFX1NJTkdMRVRPTl9MSVNUOworICAgICAgICB9CisgICAgICAgIGZpbmFsIExpc3Q8TWVkaWFUeXBlPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4odmFsdWVzLnNpemUoKSk7CisgICAgICAgIGZpbmFsIFJ1bnRpbWVEZWxlZ2F0ZSByZCA9IFJ1bnRpbWVEZWxlZ2F0ZS5nZXRJbnN0YW5jZSgpOworICAgICAgICBib29sZWFuIGNvbnZlcnNpb25BcHBsaWVkID0gZmFsc2U7CisgICAgICAgIGZvciAoZmluYWwgT2JqZWN0IHZhbHVlIDogdmFsdWVzKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE1lZGlhVHlwZSkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBBY2NlcHRhYmxlTWVkaWFUeXBlIF92YWx1ZSA9IEFjY2VwdGFibGVNZWRpYVR5cGUudmFsdWVPZigoTWVkaWFUeXBlKSB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb25BcHBsaWVkID0gX3ZhbHVlICE9IHZhbHVlOyAvLyB0cnVlIGlmIHZhbHVlIHdhcyBub3QgYW4gaW5zdGFuY2Ugb2YgQWNjZXB0YWJsZU1lZGlhVHlwZSBhbHJlYWR5CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoX3ZhbHVlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uQXBwbGllZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwoSHR0cEhlYWRlclJlYWRlci5yZWFkQWNjZXB0TWVkaWFUeXBlKEhlYWRlclV0aWxzLmFzU3RyaW5nKHZhbHVlLCByZCkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChqYXZhLnRleHQuUGFyc2VFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbihIdHRwSGVhZGVycy5BQ0NFUFQsIHZhbHVlLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb252ZXJzaW9uQXBwbGllZCkgeworICAgICAgICAgICAgLy8gY2FjaGUgY29udmVydGVkCisgICAgICAgICAgICBoZWFkZXJzLnB1dChIdHRwSGVhZGVycy5BQ0NFUFQsCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKEZ1bmN0aW9uPE1lZGlhVHlwZSwgT2JqZWN0PikgbWVkaWFUeXBlIC0+IG1lZGlhVHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHJlc3VsdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgbGlzdCBvZiBsYW5ndWFnZXMgdGhhdCBhcmUgYWNjZXB0YWJsZSBmb3IgdGhlIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgcmVhZC1vbmx5IGxpc3Qgb2YgYWNjZXB0YWJsZSBsYW5ndWFnZXMgc29ydGVkIGFjY29yZGluZworICAgICAqIHRvIHRoZWlyIHEtdmFsdWUsIHdpdGggaGlnaGVzdCBwcmVmZXJlbmNlIGZpcnN0LgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PExvY2FsZT4gZ2V0QWNjZXB0YWJsZUxhbmd1YWdlcygpIHsKKyAgICAgICAgZmluYWwgTGlzdDxPYmplY3Q+IHZhbHVlcyA9IGhlYWRlcnMuZ2V0KEh0dHBIZWFkZXJzLkFDQ0VQVF9MQU5HVUFHRSk7CisKKyAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsIHx8IHZhbHVlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KG5ldyBBY2NlcHRhYmxlTGFuZ3VhZ2VUYWcoIioiLCBudWxsKS5nZXRBc0xvY2FsZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIExpc3Q8TG9jYWxlPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PExvY2FsZT4odmFsdWVzLnNpemUoKSk7CisgICAgICAgIGZpbmFsIFJ1bnRpbWVEZWxlZ2F0ZSByZCA9IFJ1bnRpbWVEZWxlZ2F0ZS5nZXRJbnN0YW5jZSgpOworICAgICAgICBib29sZWFuIGNvbnZlcnNpb25BcHBsaWVkID0gZmFsc2U7CisgICAgICAgIGZvciAoZmluYWwgT2JqZWN0IHZhbHVlIDogdmFsdWVzKSB7CisgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBMb2NhbGUpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkKChMb2NhbGUpIHZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29udmVyc2lvbkFwcGxpZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwoSHR0cEhlYWRlclJlYWRlci5yZWFkQWNjZXB0TGFuZ3VhZ2UoSGVhZGVyVXRpbHMuYXNTdHJpbmcodmFsdWUsIHJkKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoTGFuZ3VhZ2VUYWc6OmdldEFzTG9jYWxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXhjZXB0aW9uKEh0dHBIZWFkZXJzLkFDQ0VQVF9MQU5HVUFHRSwgdmFsdWUsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb252ZXJzaW9uQXBwbGllZCkgeworICAgICAgICAgICAgLy8gY2FjaGUgY29udmVydGVkCisgICAgICAgICAgICBoZWFkZXJzLnB1dChIdHRwSGVhZGVycy5BQ0NFUFRfTEFOR1VBR0UsCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKEZ1bmN0aW9uPExvY2FsZSwgT2JqZWN0PikgbG9jYWxlIC0+IGxvY2FsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHJlc3VsdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGFueSBjb29raWVzIHRoYXQgYWNjb21wYW5pZWQgdGhlIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgcmVhZC1vbmx5IG1hcCBvZiBjb29raWUgbmFtZSAoU3RyaW5nKSB0byB7QGxpbmsgamF2YXgud3MucnMuY29yZS5Db29raWV9LgorICAgICAqLworICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBDb29raWU+IGdldFJlcXVlc3RDb29raWVzKCkgeworICAgICAgICBmaW5hbCBMaXN0PE9iamVjdD4gY29va2llcyA9IGhlYWRlcnMuZ2V0KEh0dHBIZWFkZXJzLkNPT0tJRSk7CisgICAgICAgIGlmIChjb29raWVzID09IG51bGwgfHwgY29va2llcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpOworICAgICAgICB9CisKKyAgICAgICAgTWFwPFN0cmluZywgQ29va2llPiByZXN1bHQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIENvb2tpZT4oKTsKKyAgICAgICAgZm9yIChTdHJpbmcgY29va2llIDogSGVhZGVyVXRpbHMuYXNTdHJpbmdMaXN0KGNvb2tpZXMsIFJ1bnRpbWVEZWxlZ2F0ZS5nZXRJbnN0YW5jZSgpKSkgeworICAgICAgICAgICAgaWYgKGNvb2tpZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0LnB1dEFsbChIdHRwSGVhZGVyUmVhZGVyLnJlYWRDb29raWVzKGNvb2tpZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBhbGxvd2VkIEhUVFAgbWV0aG9kcyBmcm9tIHRoZSBBbGxvdyBIVFRQIGhlYWRlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGFsbG93ZWQgSFRUUCBtZXRob2RzLCBhbGwgbWV0aG9kcyB3aWxsIHJldHVybmVkIGFzIHVwcGVyIGNhc2UKKyAgICAgKiBzdHJpbmdzLgorICAgICAqLworICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRBbGxvd2VkTWV0aG9kcygpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGFsbG93ZWQgPSBnZXRIZWFkZXJTdHJpbmcoSHR0cEhlYWRlcnMuQUxMT1cpOworICAgICAgICBpZiAoYWxsb3dlZCA9PSBudWxsIHx8IGFsbG93ZWQuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBIYXNoU2V0PFN0cmluZz4oSHR0cEhlYWRlclJlYWRlci5yZWFkU3RyaW5nTGlzdChhbGxvd2VkKSk7CisgICAgICAgIH0gY2F0Y2ggKGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBleGNlcHRpb24oSHR0cEhlYWRlcnMuQUxMT1csIGFsbG93ZWQsIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IENvbnRlbnQtTGVuZ3RoIHZhbHVlLgorICAgICAqIDxwPgorICAgICAqIDxCPk5vdGU8L0I+OiB7QGxpbmsgI2dldExlbmd0aExvbmcoKSBnZXRMZW5ndGhMb25nKCl9CisgICAgICogc2hvdWxkIGJlIHByZWZlcnJlZCBvdmVyIHRoaXMgbWV0aG9kLCBzaW5jZSBpdCByZXR1cm5zIGEge0Bjb2RlIGxvbmd9CisgICAgICogaW5zdGVhZCBhbmQgaXMgdGhlcmVmb3JlIG1vcmUgcG9ydGFibGUuPC9QPgorICAgICAqCisgICAgICogQHJldHVybiBDb250ZW50LUxlbmd0aCBhcyBhIHBvc3RpdmUgaW50ZWdlciBpZiBwcmVzZW50IGFuZCB2YWxpZCBudW1iZXIsIHtAY29kZSAtMX0gaWYgbmVnYXRpdmUgbnVtYmVyLgorICAgICAqIEB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiB3aGVuIHtAbGluayBJbnRlZ2VyI3BhcnNlSW50KFN0cmluZyl9IChTdHJpbmcpfSB0aHJvd3Mge0BsaW5rIE51bWJlckZvcm1hdEV4Y2VwdGlvbn0uCisgICAgICovCisgICAgcHVibGljIGludCBnZXRMZW5ndGgoKSB7CisKKyAgICAgICAgcmV0dXJuIHNpbmdsZUhlYWRlcihIdHRwSGVhZGVycy5DT05URU5UX0xFTkdUSCwgSW50ZWdlci5jbGFzcywgaW5wdXQgLT4geworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCAmJiAhaW5wdXQuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBpID0gSW50ZWdlci5wYXJzZUludChpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9LCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgQ29udGVudC1MZW5ndGggdmFsdWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIENvbnRlbnQtTGVuZ3RoIGFzIGEgcG9zaXRpdmUgbG9uZyBpZiBwcmVzZW50IGFuZCB2YWxpZCBudW1iZXIsIHtAY29kZSAtMX0gaWYgbmVnYXRpdmUgbnVtYmVyLgorICAgICAqIEB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiB3aGVuIHtAbGluayBMb25nI3BhcnNlTG9uZyhTdHJpbmcpfSB0aHJvd3Mge0BsaW5rIE51bWJlckZvcm1hdEV4Y2VwdGlvbn0uCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0TGVuZ3RoTG9uZygpIHsKKyAgICAgICAgcmV0dXJuIHNpbmdsZUhlYWRlcihIdHRwSGVhZGVycy5DT05URU5UX0xFTkdUSCwgTG9uZy5jbGFzcywgaW5wdXQgLT4geworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoaW5wdXQgIT0gbnVsbCAmJiAhaW5wdXQuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGxvbmcgbCA9IExvbmcucGFyc2VMb25nKGlucHV0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGwgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xTDsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGFueSBuZXcgY29va2llcyBzZXQgb24gdGhlIG1lc3NhZ2UgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSByZWFkLW9ubHkgbWFwIG9mIGNvb2tpZSBuYW1lIChTdHJpbmcpIHRvIGEge0BsaW5rIGphdmF4LndzLnJzLmNvcmUuTmV3Q29va2llIG5ldyBjb29raWV9LgorICAgICAqLworICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBOZXdDb29raWU+IGdldFJlc3BvbnNlQ29va2llcygpIHsKKyAgICAgICAgTGlzdDxPYmplY3Q+IGNvb2tpZXMgPSBoZWFkZXJzLmdldChIdHRwSGVhZGVycy5TRVRfQ09PS0lFKTsKKyAgICAgICAgaWYgKGNvb2tpZXMgPT0gbnVsbCB8fCBjb29raWVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7CisgICAgICAgIH0KKworICAgICAgICBNYXA8U3RyaW5nLCBOZXdDb29raWU+IHJlc3VsdCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTmV3Q29va2llPigpOworICAgICAgICBmb3IgKFN0cmluZyBjb29raWUgOiBIZWFkZXJVdGlscy5hc1N0cmluZ0xpc3QoY29va2llcywgUnVudGltZURlbGVnYXRlLmdldEluc3RhbmNlKCkpKSB7CisgICAgICAgICAgICBpZiAoY29va2llICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBOZXdDb29raWUgbmV3Q29va2llID0gSHR0cEhlYWRlclJlYWRlci5yZWFkTmV3Q29va2llKGNvb2tpZSk7CisgICAgICAgICAgICAgICAgcmVzdWx0LnB1dChuZXdDb29raWUuZ2V0TmFtZSgpLCBuZXdDb29raWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBlbnRpdHkgdGFnLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZW50aXR5IHRhZywgb3RoZXJ3aXNlIHtAY29kZSBudWxsfSBpZiBub3QgcHJlc2VudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRW50aXR5VGFnIGdldEVudGl0eVRhZygpIHsKKyAgICAgICAgcmV0dXJuIHNpbmdsZUhlYWRlcihIdHRwSGVhZGVycy5FVEFHLCBFbnRpdHlUYWcuY2xhc3MsIG5ldyBGdW5jdGlvbjxTdHJpbmcsIEVudGl0eVRhZz4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBFbnRpdHlUYWcgYXBwbHkoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlID09IG51bGwgPyBudWxsIDogRW50aXR5VGFnLnZhbHVlT2YodmFsdWUpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbihleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9LCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsYXN0IG1vZGlmaWVkIGRhdGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBsYXN0IG1vZGlmaWVkIGRhdGUsIG90aGVyd2lzZSB7QGNvZGUgbnVsbH0gaWYgbm90IHByZXNlbnQuCisgICAgICovCisgICAgcHVibGljIERhdGUgZ2V0TGFzdE1vZGlmaWVkKCkgeworICAgICAgICByZXR1cm4gc2luZ2xlSGVhZGVyKEh0dHBIZWFkZXJzLkxBU1RfTU9ESUZJRUQsIERhdGUuY2xhc3MsIG5ldyBGdW5jdGlvbjxTdHJpbmcsIERhdGU+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgRGF0ZSBhcHBseShTdHJpbmcgaW5wdXQpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gSHR0cEhlYWRlclJlYWRlci5yZWFkRGF0ZShpbnB1dCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0sIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGxvY2F0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbG9jYXRpb24gVVJJLCBvdGhlcndpc2Uge0Bjb2RlIG51bGx9IGlmIG5vdCBwcmVzZW50LgorICAgICAqLworICAgIHB1YmxpYyBVUkkgZ2V0TG9jYXRpb24oKSB7CisgICAgICAgIHJldHVybiBzaW5nbGVIZWFkZXIoSHR0cEhlYWRlcnMuTE9DQVRJT04sIFVSSS5jbGFzcywgbmV3IEZ1bmN0aW9uPFN0cmluZywgVVJJPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFVSSSBhcHBseShTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/IG51bGwgOiBVUkkuY3JlYXRlKHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbGlua3MgYXR0YWNoZWQgdG8gdGhlIG1lc3NhZ2UgYXMgaGVhZGVyLgorICAgICAqCisgICAgICogQHJldHVybiBsaW5rcywgbWF5IHJldHVybiBlbXB0eSB7QGxpbmsgamF2YS51dGlsLlNldH0gaWYgbm8gbGlua3MgYXJlIHByZXNlbnQuIE5ldmVyCisgICAgICogcmV0dXJucyB7QGNvZGUgbnVsbH0uCisgICAgICovCisgICAgcHVibGljIFNldDxMaW5rPiBnZXRMaW5rcygpIHsKKyAgICAgICAgTGlzdDxPYmplY3Q+IHZhbHVlcyA9IGhlYWRlcnMuZ2V0KEh0dHBIZWFkZXJzLkxJTkspOworICAgICAgICBpZiAodmFsdWVzID09IG51bGwgfHwgdmFsdWVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBTZXQ8TGluaz4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8TGluaz4odmFsdWVzLnNpemUoKSk7CisgICAgICAgIGZpbmFsIFJ1bnRpbWVEZWxlZ2F0ZSByZCA9IFJ1bnRpbWVEZWxlZ2F0ZS5nZXRJbnN0YW5jZSgpOworICAgICAgICBib29sZWFuIGNvbnZlcnNpb25BcHBsaWVkID0gZmFsc2U7CisgICAgICAgIGZvciAoZmluYWwgT2JqZWN0IHZhbHVlIDogdmFsdWVzKSB7CisgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBMaW5rKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZCgoTGluaykgdmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb252ZXJzaW9uQXBwbGllZCA9IHRydWU7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChMaW5rLnZhbHVlT2YoSGVhZGVyVXRpbHMuYXNTdHJpbmcodmFsdWUsIHJkKSkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbihIdHRwSGVhZGVycy5MSU5LLCB2YWx1ZSwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbnZlcnNpb25BcHBsaWVkKSB7CisgICAgICAgICAgICAvLyBjYWNoZSBjb252ZXJ0ZWQKKyAgICAgICAgICAgIGhlYWRlcnMucHV0KEh0dHBIZWFkZXJzLkxJTkssCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKEZ1bmN0aW9uPExpbmssIE9iamVjdD4pIGxpbmsgLT4gbGluaykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQocmVzdWx0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiBsaW5rIGZvciByZWxhdGlvbiBleGlzdHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVsYXRpb24gbGluayByZWxhdGlvbi4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZm9yIHRoZSByZWxhdGlvbiBsaW5rIGV4aXN0cywge0Bjb2RlIGZhbHNlfQorICAgICAqIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNMaW5rKFN0cmluZyByZWxhdGlvbikgeworICAgICAgICBmb3IgKExpbmsgbGluayA6IGdldExpbmtzKCkpIHsKKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiByZWxhdGlvbnMgPSBMaW5rUHJvdmlkZXIuZ2V0TGlua1JlbGF0aW9ucyhsaW5rLmdldFJlbCgpKTsKKyAgICAgICAgICAgIGlmIChyZWxhdGlvbnMgIT0gbnVsbCAmJiByZWxhdGlvbnMuY29udGFpbnMocmVsYXRpb24pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbGluayBmb3IgdGhlIHJlbGF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHJlbGF0aW9uIGxpbmsgcmVsYXRpb24uCisgICAgICogQHJldHVybiB0aGUgbGluayBmb3IgdGhlIHJlbGF0aW9uLCBvdGhlcndpc2Uge0Bjb2RlIG51bGx9IGlmIG5vdCBwcmVzZW50LgorICAgICAqLworICAgIHB1YmxpYyBMaW5rIGdldExpbmsoU3RyaW5nIHJlbGF0aW9uKSB7CisgICAgICAgIGZvciAoTGluayBsaW5rIDogZ2V0TGlua3MoKSkgeworICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHJlbGF0aW9ucyA9IExpbmtQcm92aWRlci5nZXRMaW5rUmVsYXRpb25zKGxpbmsuZ2V0UmVsKCkpOworICAgICAgICAgICAgaWYgKHJlbGF0aW9ucyAhPSBudWxsICYmIHJlbGF0aW9ucy5jb250YWlucyhyZWxhdGlvbikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGluazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdGhhdCByZXR1cm5zIGEge0BsaW5rIGphdmF4LndzLnJzLmNvcmUuTGluay5CdWlsZGVyIExpbmsuQnVpbGRlcn0KKyAgICAgKiBmb3IgdGhlIHJlbGF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHJlbGF0aW9uIGxpbmsgcmVsYXRpb24uCisgICAgICogQHJldHVybiB0aGUgbGluayBidWlsZGVyIGZvciB0aGUgcmVsYXRpb24sIG90aGVyd2lzZSB7QGNvZGUgbnVsbH0gaWYgbm90CisgICAgICogcHJlc2VudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGluay5CdWlsZGVyIGdldExpbmtCdWlsZGVyKFN0cmluZyByZWxhdGlvbikgeworICAgICAgICBMaW5rIGxpbmsgPSBnZXRMaW5rKHJlbGF0aW9uKTsKKyAgICAgICAgaWYgKGxpbmsgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gTGluay5mcm9tTGluayhsaW5rKTsKKyAgICB9CisKKyAgICAvLyBNZXNzYWdlIGVudGl0eQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgdGhlcmUgaXMgYW4gZW50aXR5IGF2YWlsYWJsZSBpbiB0aGUgbWVzc2FnZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbWV0aG9kIHJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoZSBlbnRpdHkgaXMgcHJlc2VudCwgcmV0dXJucworICAgICAqIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlcmUgaXMgYW4gZW50aXR5IHByZXNlbnQgaW4gdGhlIG1lc3NhZ2UsCisgICAgICoge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzRW50aXR5KCkgeworICAgICAgICByZXR1cm4gZW50aXR5ICE9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBtZXNzYWdlIGVudGl0eSBKYXZhIGluc3RhbmNlLgorICAgICAqIDxwPgorICAgICAqIFJldHVybnMge0Bjb2RlIG51bGx9IGlmIHRoZSBtZXNzYWdlIGRvZXMgbm90IGNvbnRhaW4gYW4gZW50aXR5LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbWVzc2FnZSBlbnRpdHkgb3Ige0Bjb2RlIG51bGx9IGlmIG1lc3NhZ2UgZG9lcyBub3QgY29udGFpbiBhbgorICAgICAqIGVudGl0eSBib2R5LgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0RW50aXR5KCkgeworICAgICAgICByZXR1cm4gZW50aXR5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBhIG5ldyBtZXNzYWdlIG1lc3NhZ2UgZW50aXR5LgorICAgICAqCisgICAgICogQHBhcmFtIGVudGl0eSBlbnRpdHkgb2JqZWN0LgorICAgICAqIEBzZWUgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW50aXR5KE9iamVjdCBlbnRpdHkpIHsKKyAgICAgICAgc2V0RW50aXR5KGVudGl0eSwgUmVmbGVjdGlvbkhlbHBlci5nZW5lcmljVHlwZUZvcihlbnRpdHkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBuZXcgbWVzc2FnZSBtZXNzYWdlIGVudGl0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbnRpdHkgICAgICBlbnRpdHkgb2JqZWN0LgorICAgICAqIEBwYXJhbSBhbm5vdGF0aW9ucyBhbm5vdGF0aW9ucyBhdHRhY2hlZCB0byB0aGUgZW50aXR5LgorICAgICAqIEBzZWUgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW50aXR5KE9iamVjdCBlbnRpdHksIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucykgeworICAgICAgICBzZXRFbnRpdHkoZW50aXR5LCBSZWZsZWN0aW9uSGVscGVyLmdlbmVyaWNUeXBlRm9yKGVudGl0eSkpOworICAgICAgICBzZXRFbnRpdHlBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGEgbmV3IG1lc3NhZ2UgbWVzc2FnZSBlbnRpdHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW50aXR5IGVudGl0eSBvYmplY3QuCisgICAgICogQHBhcmFtIHR5cGUgICBlbnRpdHkgZ2VuZXJpYyB0eXBlIGluZm9ybWF0aW9uLgorICAgICAqIEBzZWUgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHNldEVudGl0eShPYmplY3QgZW50aXR5LCBHZW5lcmljVHlwZTw/PiB0eXBlKSB7CisgICAgICAgIGlmIChlbnRpdHkgaW5zdGFuY2VvZiBHZW5lcmljRW50aXR5KSB7CisgICAgICAgICAgICB0aGlzLmVudGl0eSA9ICgoR2VuZXJpY0VudGl0eSkgZW50aXR5KS5nZXRFbnRpdHkoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMuZW50aXR5ID0gZW50aXR5OworICAgICAgICB9CisgICAgICAgIC8vIGlnbm9yaW5nIG92ZXJyaWRkZW4gZ2VuZXJpYyBlbnRpdHkgdHlwZSBpbmZvcm1hdGlvbgorICAgICAgICB0aGlzLmVudGl0eVR5cGUgPSB0eXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBhIG5ldyBtZXNzYWdlIG1lc3NhZ2UgZW50aXR5LgorICAgICAqCisgICAgICogQHBhcmFtIGVudGl0eSAgICAgIGVudGl0eSBvYmplY3QuCisgICAgICogQHBhcmFtIHR5cGUgICAgICAgIGRlY2xhcmVkIGVudGl0eSBjbGFzcy4KKyAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbnMgYW5ub3RhdGlvbnMgYXR0YWNoZWQgdG8gdGhlIGVudGl0eS4KKyAgICAgKiBAc2VlIGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVudGl0eShPYmplY3QgZW50aXR5LCBUeXBlIHR5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucykgeworICAgICAgICBzZXRFbnRpdHkoZW50aXR5LCBuZXcgR2VuZXJpY1R5cGUodHlwZSkpOworICAgICAgICBzZXRFbnRpdHlBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IGEgbmV3IG1lc3NhZ2UgbWVzc2FnZSBlbnRpdHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW50aXR5ICAgICAgZW50aXR5IG9iamVjdC4KKyAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbnMgYW5ub3RhdGlvbnMgYXR0YWNoZWQgdG8gdGhlIGVudGl0eS4KKyAgICAgKiBAcGFyYW0gbWVkaWFUeXBlICAgZW50aXR5IG1lZGlhIHR5cGUuCisgICAgICogQHNlZSBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbnRpdHkoT2JqZWN0IGVudGl0eSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHNldEVudGl0eShlbnRpdHksIGFubm90YXRpb25zKTsKKyAgICAgICAgc2V0TWVkaWFUeXBlKG1lZGlhVHlwZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBtZXNzYWdlIGNvbnRlbnQgbWVkaWEgdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZWRpYVR5cGUgbWVzc2FnZSBjb250ZW50IG1lZGlhIHR5cGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWVkaWFUeXBlKE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgdGhpcy5oZWFkZXJzLnB1dFNpbmdsZShIdHRwSGVhZGVycy5DT05URU5UX1RZUEUsIG1lZGlhVHlwZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSByYXcgbWVzc2FnZSBlbnRpdHkgdHlwZSBpbmZvcm1hdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gcmF3IG1lc3NhZ2UgZW50aXR5IHR5cGUgaW5mb3JtYXRpb24uCisgICAgICovCisgICAgcHVibGljIENsYXNzPD8+IGdldEVudGl0eUNsYXNzKCkgeworICAgICAgICByZXR1cm4gZW50aXR5VHlwZSA9PSBudWxsID8gbnVsbCA6IGVudGl0eVR5cGUuZ2V0UmF3VHlwZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbWVzc2FnZSBlbnRpdHkgdHlwZSBpbmZvcm1hdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbWVzc2FnZSBlbnRpdHkgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVHlwZSBnZXRFbnRpdHlUeXBlKCkgeworICAgICAgICByZXR1cm4gZW50aXR5VHlwZSA9PSBudWxsID8gbnVsbCA6IGVudGl0eVR5cGUuZ2V0VHlwZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbWVzc2FnZSBlbnRpdHkgdHlwZSBpbmZvcm1hdGlvbi4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBvdmVycmlkZXMgYW55IGNvbXB1dGVkIG9yIHByZXZpb3VzbHkgc2V0IGVudGl0eSB0eXBlIGluZm9ybWF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgb3ZlcnJpZGluZyBtZXNzYWdlIGVudGl0eSB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVudGl0eVR5cGUoVHlwZSB0eXBlKSB7CisgICAgICAgIHRoaXMuZW50aXR5VHlwZSA9IG5ldyBHZW5lcmljVHlwZSh0eXBlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGFubm90YXRpb25zIGF0dGFjaGVkIHRvIHRoZSBlbnRpdHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGVudGl0eSBhbm5vdGF0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQW5ub3RhdGlvbltdIGdldEVudGl0eUFubm90YXRpb25zKCkgeworICAgICAgICByZXR1cm4gZW50aXR5QW5ub3RhdGlvbnMuY2xvbmUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFubm90YXRpb25zIGF0dGFjaGVkIHRvIHRoZSBlbnRpdHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbnMgZW50aXR5IGFubm90YXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVudGl0eUFubm90YXRpb25zKEFubm90YXRpb25bXSBhbm5vdGF0aW9ucykgeworICAgICAgICB0aGlzLmVudGl0eUFubm90YXRpb25zID0gKGFubm90YXRpb25zID09IG51bGwpID8gRU1QVFlfQU5OT1RBVElPTlMgOiBhbm5vdGF0aW9uczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGVudGl0eSBvdXRwdXQgc3RyZWFtLgorICAgICAqCisgICAgICogQHJldHVybiBlbnRpdHkgb3V0cHV0IHN0cmVhbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldEVudGl0eVN0cmVhbSgpIHsKKyAgICAgICAgcmV0dXJuIGVudGl0eVN0cmVhbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBuZXcgZW50aXR5IG91dHB1dCBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3V0cHV0U3RyZWFtIG5ldyBlbnRpdHkgb3V0cHV0IHN0cmVhbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbnRpdHlTdHJlYW0oT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkgeworICAgICAgICB0aGlzLmVudGl0eVN0cmVhbSA9IG91dHB1dFN0cmVhbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmFibGUgYSBidWZmZXJpbmcgb2Ygc2VyaWFsaXplZCBlbnRpdHkuIFRoZSBidWZmZXJpbmcgd2lsbCBiZSBjb25maWd1cmVkIGZyb20gY29uZmlndXJhdGlvbi4gVGhlIHByb3BlcnR5CisgICAgICogZGV0ZXJtaW5pbmcgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciBpcyB7QGxpbmsgQ29tbW9uUHJvcGVydGllcyNPVVRCT1VORF9DT05URU5UX0xFTkdUSF9CVUZGRVJ9LgorICAgICAqIDwvcD4KKyAgICAgKiBUaGUgYnVmZmVyaW5nIGZ1bmN0aW9uYWxpdHkgaXMgYnkgZGVmYXVsdCBkaXNhYmxlZCBhbmQgY291bGQgYmUgZW5hYmxlZCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kLiBJbiB0aGlzIGNhc2UKKyAgICAgKiB0aGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgZmlyc3QgYnl0ZXMgYXJlIHdyaXR0ZW4gdG8gdGhlIHtAbGluayAjZ2V0RW50aXR5U3RyZWFtKCkgZW50aXR5IHN0cmVhbX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbiBydW50aW1lIGNvbmZpZ3VyYXRpb24uCisgICAgICovCisgICAgcHVibGljIHZvaWQgZW5hYmxlQnVmZmVyaW5nKENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgeworICAgICAgICBmaW5hbCBJbnRlZ2VyIGJ1ZmZlclNpemUgPSBDb21tb25Qcm9wZXJ0aWVzLmdldFZhbHVlKGNvbmZpZ3VyYXRpb24uZ2V0UHJvcGVydGllcygpLAorICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uZ2V0UnVudGltZVR5cGUoKSwgQ29tbW9uUHJvcGVydGllcy5PVVRCT1VORF9DT05URU5UX0xFTkdUSF9CVUZGRVIsIEludGVnZXIuY2xhc3MpOworICAgICAgICBpZiAoYnVmZmVyU2l6ZSAhPSBudWxsKSB7CisgICAgICAgICAgICBjb21taXR0aW5nT3V0cHV0U3RyZWFtLmVuYWJsZUJ1ZmZlcmluZyhidWZmZXJTaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbW1pdHRpbmdPdXRwdXRTdHJlYW0uZW5hYmxlQnVmZmVyaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBzdHJlYW0gcHJvdmlkZXIgY2FsbGJhY2suCisgICAgICogPHAvPgorICAgICAqIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBmaXJzdCBieXRlcyBhcmUgd3JpdHRlbiB0byB0aGUge0BsaW5rICNnZXRFbnRpdHlTdHJlYW0oKSBlbnRpdHkgc3RyZWFtfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJlYW1Qcm92aWRlciBub24te0Bjb2RlIG51bGx9IG91dHB1dCBzdHJlYW0gcHJvdmlkZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3RyZWFtUHJvdmlkZXIoU3RyZWFtUHJvdmlkZXIgc3RyZWFtUHJvdmlkZXIpIHsKKyAgICAgICAgY29tbWl0dGluZ091dHB1dFN0cmVhbS5zZXRTdHJlYW1Qcm92aWRlcihzdHJlYW1Qcm92aWRlcik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb21taXRzIHRoZSB7QGxpbmsgI2dldEVudGl0eVN0cmVhbSgpIGVudGl0eSBzdHJlYW19IGlmIGl0IHdhc24ndCBhbHJlYWR5IGNvbW1pdHRlZC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaW4gY2FzZSBvZiB0aGUgSU8gZXJyb3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY29tbWl0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFjb21taXR0aW5nT3V0cHV0U3RyZWFtLmlzQ29tbWl0dGVkKCkpIHsKKyAgICAgICAgICAgIGVudGl0eVN0cmVhbS5mbHVzaCgpOworICAgICAgICAgICAgaWYgKCFjb21taXR0aW5nT3V0cHV0U3RyZWFtLmlzQ29tbWl0dGVkKCkpIHsKKyAgICAgICAgICAgICAgICBjb21taXR0aW5nT3V0cHV0U3RyZWFtLmNvbW1pdCgpOworICAgICAgICAgICAgICAgIGNvbW1pdHRpbmdPdXRwdXRTdHJlYW0uZmx1c2goKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoZSBlbnRpdHkgc3RyZWFtIGhhcyBiZWVuIGNvbW1pdHRlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBlbnRpdHkgc3RyZWFtIGhhcyBiZWVuIGNvbW1pdHRlZC4gT3RoZXJ3aXNlIHJldHVybnMge0Bjb2RlIGZhbHNlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbW1pdHRlZCgpIHsKKyAgICAgICAgcmV0dXJuIGNvbW1pdHRpbmdPdXRwdXRTdHJlYW0uaXNDb21taXR0ZWQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIGNvbnRleHQuIEZsdXNoZXMgYW5kIGNsb3NlcyB0aGUgZW50aXR5IHN0cmVhbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgaWYgKGhhc0VudGl0eSgpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbSBlcyA9IGdldEVudGl0eVN0cmVhbSgpOworICAgICAgICAgICAgICAgIGVzLmZsdXNoKCk7CisgICAgICAgICAgICAgICAgZXMuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBIYXBwZW5zIHdoZW4gdGhlIGNsaWVudCBjbG9zZWQgY29ubmVjdGlvbiBiZWZvcmUgcmVjZWl2aW5nIHRoZSBmdWxsIHJlc3BvbnNlLgorICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgT0sgYW5kIG5vdCBpbnRlcmVzdGluZyBpbiB2YXN0IG1ham9yaXR5IG9mIHRoZSBjYXNlcworICAgICAgICAgICAgICAgIC8vIGhlbmNlIHRoZSBsb2cgbGV2ZWwgc2V0IHRvIEZJTkUgdG8gbWFrZSBzdXJlIGl0IGRvZXMgbm90IGZsb29kIHRoZSBsb2cgdW5uZWNlc3NhcmlseQorICAgICAgICAgICAgICAgIC8vIChlc3BlY2lhbGx5IGZvciBjbGllbnRzIGRpc2Nvbm5lY3RpbmcgZnJvbSBTU0UgbGlzdGVuaW5nLCB3aGljaCBpcyB2ZXJ5IGNvbW1vbikuCisgICAgICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihPdXRib3VuZE1lc3NhZ2VDb250ZXh0LmNsYXNzLmdldE5hbWUoKSkubG9nKExldmVsLkZJTkUsIGUuZ2V0TWVzc2FnZSgpLCBlKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgLy8gSW4gY2FzZSBzb21lIG9mIHRoZSBvdXRwdXQgc3RyZWFtIHdyYXBwZXIgZG9lcyBub3QgZGVsZWdhdGUgY2xvc2UoKSBjYWxsIHdlCisgICAgICAgICAgICAgICAgLy8gY2xvc2UgdGhlIHJvb3Qgc3RyZWFtIG1hbnVhbGx5IHRvIG1ha2Ugc3VyZSBpdCBjb21taXRzIHRoZSBkYXRhLgorICAgICAgICAgICAgICAgIGlmICghY29tbWl0dGluZ091dHB1dFN0cmVhbS5pc0Nsb3NlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb21taXR0aW5nT3V0cHV0U3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEp1c3QgbG9nIHRoZSBleGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoT3V0Ym91bmRNZXNzYWdlQ29udGV4dC5jbGFzcy5nZXROYW1lKCkpLmxvZyhMZXZlbC5GSU5FLCBlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvUGFyYW1ldGVyaXplZEhlYWRlci5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL1BhcmFtZXRlcml6ZWRIZWFkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGQwMTU0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL1BhcmFtZXRlcml6ZWRIZWFkZXIuamF2YQpAQCAtMCwwICsxLDkyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogQSBnZW5lcmFsIHBhcmFtZXRlcml6ZWQgaGVhZGVyLgorICogPHAvPgorICogVGhlIGhlYWRlciBjb25zaXN0cyBvZiBhIHZhbHVlIGFuZCB6ZXJvIG9yIG1vcmUgcGFyYW1ldGVycy4gQSB2YWx1ZSBjb25zaXN0cyBvZiB6ZXJvIG9yIG1vcmUgdG9rZW5zIGFuZCBzZXBhcmF0b3JzIHVwIHRvIGJ1dAorICogbm90IGluY2x1ZGluZyBhICc7JyBzZXBhcmF0b3IgaWYgcHJlc2VudC4gVGhlIHRva2VucyBhbmQgc2VwYXJhdG9ycyBvZiBhIHZhbHVlIG1heSBiZSBzZXBhcmF0ZWQgYnkgemVybyBvciBtb3JlIHdoaXRlIHNwYWNlLAorICogd2hpY2ggaXMgaWdub3JlZCBhbmQgaXMgbm90IGNvbnNpZGVyZWQgcGFydCBvZiB0aGUgdmFsdWUuIFRoZSB2YWx1ZSBpcyBzZXBhcmF0ZWQgZnJvbSB0aGUgcGFyYW1ldGVycyB3aXRoIGEgJzsnLiBFYWNoCisgKiBwYXJhbWV0ZXIgaXMgc2VwYXJhdGVkIHdpdGggYSAnOycuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFBhcmFtZXRlcml6ZWRIZWFkZXIgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnM7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBwYXJhbWV0ZXJpemVkIGhlYWRlciBmcm9tIGdpdmVuIHN0cmluZyB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBoZWFkZXIgaGVhZGVyIHRvIGNyZWF0ZSBwYXJhbWV0ZXJpemVkIGhlYWRlciBmcm9tLgorICAgICAqIEB0aHJvd3MgUGFyc2VFeGNlcHRpb24gaWYgYW4gdW4tZXhwZWN0ZWQvaW4tY29ycmVjdCB2YWx1ZSBpcyBmb3VuZCBkdXJpbmcgcGFyc2luZyB0aGUgaGVhZGVyLgorICAgICAqLworICAgIHB1YmxpYyBQYXJhbWV0ZXJpemVkSGVhZGVyKGZpbmFsIFN0cmluZyBoZWFkZXIpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMoSHR0cEhlYWRlclJlYWRlci5uZXdJbnN0YW5jZShoZWFkZXIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBwYXJhbWV0ZXJpemVkIGhlYWRlciBmcm9tIGdpdmVuIHtAbGluayBIdHRwSGVhZGVyUmVhZGVyIGh0dHAgaGVhZGVyIHJlYWRlcn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVhZGVyIHJlYWRlciB0byBpbml0aWFsaXplIG5ldyBwYXJhbWV0ZXJpemVkIGhlYWRlciBmcm9tLgorICAgICAqIEB0aHJvd3MgUGFyc2VFeGNlcHRpb24gaWYgYW4gdW4tZXhwZWN0ZWQvaW4tY29ycmVjdCB2YWx1ZSBpcyBmb3VuZCBkdXJpbmcgcGFyc2luZyB0aGUgaGVhZGVyLgorICAgICAqLworICAgIHB1YmxpYyBQYXJhbWV0ZXJpemVkSGVhZGVyKGZpbmFsIEh0dHBIZWFkZXJSZWFkZXIgcmVhZGVyKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICByZWFkZXIuaGFzTmV4dCgpOworCisgICAgICAgIHZhbHVlID0gIiI7CisgICAgICAgIHdoaWxlIChyZWFkZXIuaGFzTmV4dCgpICYmICFyZWFkZXIuaGFzTmV4dFNlcGFyYXRvcignOycsIGZhbHNlKSkgeworICAgICAgICAgICAgcmVhZGVyLm5leHQoKTsKKyAgICAgICAgICAgIHZhbHVlICs9IHJlYWRlci5nZXRFdmVudFZhbHVlKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVhZGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgcGFyYW1ldGVycyA9IEh0dHBIZWFkZXJSZWFkZXIucmVhZFBhcmFtZXRlcnMocmVhZGVyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocGFyYW1ldGVycyA9PSBudWxsKSB7CisgICAgICAgICAgICBwYXJhbWV0ZXJzID0gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBhcmFtZXRlcnMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAocGFyYW1ldGVycyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHZhbHVlLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRQYXJhbWV0ZXJzKCkgeworICAgICAgICByZXR1cm4gcGFyYW1ldGVyczsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9RdWFsaWZpZWQuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9RdWFsaWZpZWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWI3YTViCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL1F1YWxpZmllZC5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbDsKKworLyoqCisgKiBRdWFsaXR5IGZhY3RvciBmb3IgYWNjZXB0YWJsZSBoZWFkZXIgdHlwZXMgcmVwcmVzZW50ZWQgYXMgYSAicGFydHMgcGVyIHRob3VzYW5kIiAoaS5lLiBwZXIgbWlsbGUpIHZhbHVlLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUXVhbGlmaWVkIHsKKworICAgIC8qKgorICAgICAqIEdldCBxdWFsaXR5IGZhY3RvciB2YWx1ZSAoaW4gW3BwdF0pLgorICAgICAqCisgICAgICogQHJldHVybiBxdWFsaXR5IGZhY3RvciB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFF1YWxpdHkoKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9RdWFsaXR5LmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvUXVhbGl0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYmVkMzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvUXVhbGl0eS5qYXZhCkBAIC0wLDAgKzEsMTUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIFF1YWxpdHkgcGFyYW1ldGVyIGNvbnN0YW50cy4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgUXVhbGl0eSB7CisKKyAgICAvKioKKyAgICAgKiBBICJoaWdoZXN0IGZpcnN0IiBxdWFsaWZpZWQgZWxlbWVudCBjb21wYXJhdG9yLgorICAgICAqCisgICAgICogQW4gZWxlbWVudCB3aXRoIGhpZ2hlciBxdWFsaXR5IHZhbHVlIHdpbGwgYmUgc29ydGVkIGFoZWFkIG9mIGVsZW1lbnRzIHdpdGggbG93ZXIgcXVhbGl0eSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBhcmF0b3I8UXVhbGlmaWVkPiBRVUFMSUZJRURfQ09NUEFSQVRPUiA9IG5ldyBDb21wYXJhdG9yPFF1YWxpZmllZD4oKSB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShmaW5hbCBRdWFsaWZpZWQgbzEsIGZpbmFsIFF1YWxpZmllZCBvMikgeworICAgICAgICAgICAgLy8gcmV2ZXJzZSBjb21wYXJpc29uIHRvIGFjaGlldmUgdGhlICJoaWdoZXIgZmlyc3QiIGJlaGF2aW9yLgorICAgICAgICAgICAgcmV0dXJuIFF1YWxpdHkuY29tcGFyZShvMi5nZXRRdWFsaXR5KCksIG8xLmdldFF1YWxpdHkoKSk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogQSAiaGlnaGVzdCBmaXJzdCIgcXVhbGl0eSB2YWx1ZSBjb21wYXJhdG9yLgorICAgICAqCisgICAgICogQSBoaWdoZXIgcXVhbGl0eSB2YWx1ZSB3aWxsIGJlIHNvcnRlZCBhaGVhZCBvZiBhIGxvd2VyIHF1YWxpdHkgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPEludGVnZXI+IFFVQUxJVFlfVkFMVUVfQ09NUEFSQVRPUiA9IG5ldyBDb21wYXJhdG9yPEludGVnZXI+KCkgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoZmluYWwgSW50ZWdlciBxMSwgZmluYWwgSW50ZWdlciBxMikgeworICAgICAgICAgICAgLy8gcmV2ZXJzZSBjb21wYXJpc29uIHRvIGFjaGlldmUgdGhlICJoaWdoZXIgZmlyc3QiIGJlaGF2aW9yLgorICAgICAgICAgICAgcmV0dXJuIFF1YWxpdHkuY29tcGFyZShxMiwgcTEpOworICAgICAgICB9CisgICAgfTsKKworICAgIC8qKgorICAgICAqIFByZXZlbnRzIGluc3RhbnRpYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBRdWFsaXR5KCkgeworICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIkluc3RhbnRpYXRpb24gbm90IGFsbG93ZWQuIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUXVhbGl0eSBIVFRQIGhlYWRlciBwYXJhbWV0ZXIgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUFMSVRZX1BBUkFNRVRFUl9OQU1FID0gInEiOworICAgIC8qKgorICAgICAqIFF1YWxpdHkgc291cmNlIEhUVFAgaGVhZGVyIHBhcmFtZXRlciBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFFVQUxJVFlfU09VUkNFX1BBUkFNRVRFUl9OQU1FID0gInFzIjsKKyAgICAvKioKKyAgICAgKiBNaW5pbXVtIHF1YWxpdHkgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUlOSU1VTSA9IDA7CisgICAgLyoqCisgICAgICogTWF4aW11bSBxdWFsaXR5IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWElNVU0gPSAxMDAwOworICAgIC8qKgorICAgICAqIERlZmF1bHQgcXVhbGl0eSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUID0gTUFYSU1VTTsKKworICAgIC8qKgorICAgICAqIEFkZCBhIHF1YWxpdHkgcGFyYW1ldGVyIHRvIGEgSFRUUCBoZWFkZXIgcGFyYW1ldGVyIG1hcCAoaWYgbmVlZGVkKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzICAgICAgIGEgbWFwIG9mIEhUVFAgaGVhZGVyIHBhcmFtZXRlcnMuCisgICAgICogQHBhcmFtIHF1YWxpdHlQYXJhbU5hbWUgbmFtZSBvZiB0aGUgcXVhbGl0eSBwYXJhbWV0ZXIgKCJxIiBvciAicXMiKS4KKyAgICAgKiBAcGFyYW0gcXVhbGl0eSAgICAgICAgICBxdWFsaXR5IHZhbHVlIGluIFtwcG1dLgorICAgICAqIEByZXR1cm4gcGFyYW1ldGVyIG1hcCBjb250YWluaW5nIHRoZSBwcm9wZXIgcXVhbGl0eSBwYXJhbWV0ZXIgaWYgbmVjZXNzYXJ5LgorICAgICAqLworICAgIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGVuaGFuY2VXaXRoUXVhbGl0eVBhcmFtZXRlcigKKyAgICAgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycywgZmluYWwgU3RyaW5nIHF1YWxpdHlQYXJhbU5hbWUsIGZpbmFsIGludCBxdWFsaXR5KSB7CisKKyAgICAgICAgaWYgKHF1YWxpdHkgPT0gREVGQVVMVCkgeworICAgICAgICAgICAgLy8gc3BlY2lhbCBoYW5kbGluZworICAgICAgICAgICAgaWYgKHBhcmFtZXRlcnMgPT0gbnVsbCB8fCBwYXJhbWV0ZXJzLmlzRW1wdHkoKSB8fCAhcGFyYW1ldGVycy5jb250YWluc0tleShxdWFsaXR5UGFyYW1OYW1lKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbWV0ZXJzOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgICAgICBpZiAocGFyYW1ldGVycyA9PSBudWxsIHx8IHBhcmFtZXRlcnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTWFwKHF1YWxpdHlQYXJhbU5hbWUsIHF1YWxpdHlWYWx1ZVRvU3RyaW5nKHF1YWxpdHkpKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBUcnkgdG8gdXBkYXRlIHRoZSBvcmlnaW5hbCBtYXAgZmlyc3QuLi4KKyAgICAgICAgICAgIHBhcmFtZXRlcnMucHV0KHF1YWxpdHlQYXJhbU5hbWUsIHF1YWxpdHlWYWx1ZVRvU3RyaW5nKHF1YWxpdHkpKTsKKyAgICAgICAgICAgIHJldHVybiBwYXJhbWV0ZXJzOworICAgICAgICB9IGNhdGNoIChmaW5hbCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiB1b2UpIHsKKyAgICAgICAgICAgIC8vIFVubW9kaWZpYWJsZSBtYXAgLSBsZXQncyBjcmVhdGUgYSBuZXcgY29weS4uLgorICAgICAgICAgICAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiByZXN1bHQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4ocGFyYW1ldGVycyk7CisgICAgICAgICAgICByZXN1bHQucHV0KHF1YWxpdHlQYXJhbU5hbWUsIHF1YWxpdHlWYWx1ZVRvU3RyaW5nKHF1YWxpdHkpKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJlcyB0d28ge0Bjb2RlIGludH0gdmFsdWVzIG51bWVyaWNhbGx5LgorICAgICAqIFRoZSB2YWx1ZSByZXR1cm5lZCBpcyBpZGVudGljYWwgdG8gd2hhdCB3b3VsZCBiZSByZXR1cm5lZCBieToKKyAgICAgKiA8cHJlPgorICAgICAqICAgIEludGVnZXIudmFsdWVPZih4KS5jb21wYXJlVG8oSW50ZWdlci52YWx1ZU9mKHkpKQorICAgICAqIDwvcHJlPgorICAgICAqCisgICAgICogTm90ZTogVGFrZW4gZnJvbSB7QGNvZGUgSW50ZWdlci5jb21wYXJlKCl9IGZyb20gSkRLIDcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gIHggdGhlIGZpcnN0IHtAY29kZSBpbnR9IHRvIGNvbXBhcmUKKyAgICAgKiBAcGFyYW0gIHkgdGhlIHNlY29uZCB7QGNvZGUgaW50fSB0byBjb21wYXJlCisgICAgICogQHJldHVybiB0aGUgdmFsdWUge0Bjb2RlIDB9IGlmIHtAY29kZSB4ID09IHl9OworICAgICAqICAgICAgICAgYSB2YWx1ZSBsZXNzIHRoYW4ge0Bjb2RlIDB9IGlmIHtAY29kZSB4IDwgeX07IGFuZAorICAgICAqICAgICAgICAgYSB2YWx1ZSBncmVhdGVyIHRoYW4ge0Bjb2RlIDB9IGlmIHtAY29kZSB4ID4geX0KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgY29tcGFyZShmaW5hbCBpbnQgeCwgZmluYWwgaW50IHkpIHsKKyAgICAgICAgcmV0dXJuICh4IDwgeSkgPyAtMSA6ICgoeCA9PSB5KSA/IDAgOiAxKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcXVhbGl0eVZhbHVlVG9TdHJpbmcoZmluYWwgZmxvYXQgcXVhbGl0eSkgeworICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHFzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKFN0cmluZy5mb3JtYXQoTG9jYWxlLlVTLCAiJTMuM2YiLCAocXVhbGl0eSAvIDEwMDApKSk7CisKKyAgICAgICAgaW50IGxhc3RJbmRleDsKKyAgICAgICAgd2hpbGUgKChsYXN0SW5kZXggPSBxc2IubGVuZ3RoKCkgLSAxKSA+IDIgJiYgcXNiLmNoYXJBdChsYXN0SW5kZXgpID09ICcwJykgeworICAgICAgICAgICAgcXNiLmRlbGV0ZUNoYXJBdChsYXN0SW5kZXgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBxc2IudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvUXVhbGl0eVNvdXJjZU1lZGlhVHlwZS5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL1F1YWxpdHlTb3VyY2VNZWRpYVR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNThhODNkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL1F1YWxpdHlTb3VyY2VNZWRpYVR5cGUuamF2YQpAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsOworCitpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworLyoqCisgKiBBIHF1YWxpdHkgc291cmNlIG1lZGlhIHR5cGUuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFF1YWxpdHlTb3VyY2VNZWRpYVR5cGUgZXh0ZW5kcyBNZWRpYVR5cGUgaW1wbGVtZW50cyBRdWFsaWZpZWQgeworICAgIC8qKgorICAgICAqIENvbXBhcmF0b3IgZm9yIGxpc3RzIG9mIHF1YWxpdHkgc291cmNlIG1lZGlhIHR5cGVzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxRdWFsaXR5U291cmNlTWVkaWFUeXBlPiBDT01QQVJBVE9SID0KKyAgICAgICAgICAgIG5ldyBDb21wYXJhdG9yPFF1YWxpdHlTb3VyY2VNZWRpYVR5cGU+KCkgeworCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlKFF1YWxpdHlTb3VyY2VNZWRpYVR5cGUgbzEsIFF1YWxpdHlTb3VyY2VNZWRpYVR5cGUgbzIpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGkgPSBRdWFsaXR5LlFVQUxJRklFRF9DT01QQVJBVE9SLmNvbXBhcmUobzEsIG8yKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1lZGlhVHlwZXMuUEFSVElBTF9PUkRFUl9DT01QQVJBVE9SLmNvbXBhcmUobzEsIG8yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgcXM7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IHF1YWxpdHkgc291cmNlIG1lZGlhIHR5cGUgaW5zdGFuY2Ugd2l0aCBhIHtAbGluayBRdWFsaXR5I0RFRkFVTFQKKyAgICAgKiBkZWZhdWx0IHF1YWxpdHkgZmFjdG9yfSB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlICAgIHRoZSBwcmltYXJ5IHR5cGUsIHtAY29kZSBudWxsfSBpcyBlcXVpdmFsZW50IHRvCisgICAgICogICAgICAgICAgICAgICAge0BsaW5rICNNRURJQV9UWVBFX1dJTERDQVJEfQorICAgICAqIEBwYXJhbSBzdWJ0eXBlIHRoZSBzdWJ0eXBlLCB7QGNvZGUgbnVsbH0gaXMgZXF1aXZhbGVudCB0bworICAgICAqICAgICAgICAgICAgICAgIHtAbGluayAjTUVESUFfVFlQRV9XSUxEQ0FSRH0KKyAgICAgKi8KKyAgICBwdWJsaWMgUXVhbGl0eVNvdXJjZU1lZGlhVHlwZShTdHJpbmcgdHlwZSwgU3RyaW5nIHN1YnR5cGUpIHsKKyAgICAgICAgc3VwZXIodHlwZSwgc3VidHlwZSk7IC8vIG5vIG5lZWQgdG8gYWRkIGRlZmF1bHQgcXVhbGl0eSBwYXJhbWV0ZXIuCisgICAgICAgIHFzID0gUXVhbGl0eS5ERUZBVUxUOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgcXVhbGl0eSBzb3VyY2UgbWVkaWEgdHlwZSBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlICAgICAgIHRoZSBwcmltYXJ5IHR5cGUsIHtAY29kZSBudWxsfSBpcyBlcXVpdmFsZW50IHRvCisgICAgICogICAgICAgICAgICAgICAgICAge0BsaW5rICNNRURJQV9UWVBFX1dJTERDQVJEfQorICAgICAqIEBwYXJhbSBzdWJ0eXBlICAgIHRoZSBzdWJ0eXBlLCB7QGNvZGUgbnVsbH0gaXMgZXF1aXZhbGVudCB0bworICAgICAqICAgICAgICAgICAgICAgICAgIHtAbGluayAjTUVESUFfVFlQRV9XSUxEQ0FSRH0KKyAgICAgKiBAcGFyYW0gcXVhbGl0eSAgICBxdWFsaXR5IHNvdXJjZSBmYWN0b3IgdmFsdWUgaW4gW3BwdF0uIFNlZSB7QGxpbmsgUXVhbGlmaWVkfS4KKyAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyBhIG1hcCBvZiBtZWRpYSB0eXBlIHBhcmFtZXRlcnMsIHtAY29kZSBudWxsfSBpcyB0aGUgc2FtZSBhcyBhbgorICAgICAqICAgICAgICAgICAgICAgICAgIGVtcHR5IG1hcC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUXVhbGl0eVNvdXJjZU1lZGlhVHlwZShTdHJpbmcgdHlwZSwgU3RyaW5nIHN1YnR5cGUsIGludCBxdWFsaXR5LCBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMpIHsKKyAgICAgICAgc3VwZXIodHlwZSwgc3VidHlwZSwgUXVhbGl0eS5lbmhhbmNlV2l0aFF1YWxpdHlQYXJhbWV0ZXIocGFyYW1ldGVycywgUXVhbGl0eS5RVUFMSVRZX1NPVVJDRV9QQVJBTUVURVJfTkFNRSwgcXVhbGl0eSkpOworICAgICAgICB0aGlzLnFzID0gcXVhbGl0eTsKKyAgICB9CisKKyAgICAvLyB1c2VkIGJ5IFF1YWxpdHlTb3VyY2VNZWRpYVR5cGUudmFsdWVPZiBtZXRob2Q7IG5vIG5lZWQgdG8gZml4IHBhcmFtZXRlciBtYXAKKyAgICBwcml2YXRlIFF1YWxpdHlTb3VyY2VNZWRpYVR5cGUoU3RyaW5nIHR5cGUsIFN0cmluZyBzdWJ0eXBlLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMsIGludCBxdWFsaXR5KSB7CisgICAgICAgIHN1cGVyKHR5cGUsIHN1YnR5cGUsIHBhcmFtZXRlcnMpOworICAgICAgICB0aGlzLnFzID0gcXVhbGl0eTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgcXVhbGl0eSBzb3VyY2UgZmFjdG9yIHZhbHVlIChpbiBbcHB0XSkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHF1YWxpdHkgc291cmNlIGZhY3RvciB2YWx1ZS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldFF1YWxpdHkoKSB7CisgICAgICAgIHJldHVybiBxczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IHF1YWxpdHkgc291cmNlIG1lZGlhIHR5cGUgaW5zdGFuY2UgZnJvbSB0aGUgc3VwcGxpZWQKKyAgICAgKiB7QGxpbmsgSHR0cEhlYWRlclJlYWRlciBIVFRQIGhlYWRlciByZWFkZXJ9LgorICAgICAqCisgICAgICogQHBhcmFtIHJlYWRlciBIVFRQIGhlYWRlciByZWFkZXIuCisgICAgICogQHJldHVybiBuZXcgYWNjZXB0YWJsZSBtZWRpYSB0eXBlIGluc3RhbmNlLgorICAgICAqCisgICAgICogQHRocm93cyBQYXJzZUV4Y2VwdGlvbiBpbiBjYXNlIHRoZSBpbnB1dCBkYXRhIHBhcnNpbmcgZmFpbGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUXVhbGl0eVNvdXJjZU1lZGlhVHlwZSB2YWx1ZU9mKEh0dHBIZWFkZXJSZWFkZXIgcmVhZGVyKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICAvLyBTa2lwIGFueSB3aGl0ZSBzcGFjZQorICAgICAgICByZWFkZXIuaGFzTmV4dCgpOworCisgICAgICAgIC8vIEdldCB0aGUgdHlwZQorICAgICAgICBTdHJpbmcgdHlwZSA9IHJlYWRlci5uZXh0VG9rZW4oKS50b1N0cmluZygpOworICAgICAgICByZWFkZXIubmV4dFNlcGFyYXRvcignLycpOworICAgICAgICAvLyBHZXQgdGhlIHN1YnR5cGUKKyAgICAgICAgU3RyaW5nIHN1YlR5cGUgPSByZWFkZXIubmV4dFRva2VuKCkudG9TdHJpbmcoKTsKKworICAgICAgICBpbnQgcXMgPSBRdWFsaXR5LkRFRkFVTFQ7CisgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycyA9IG51bGw7CisgICAgICAgIGlmIChyZWFkZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBwYXJhbWV0ZXJzID0gSHR0cEhlYWRlclJlYWRlci5yZWFkUGFyYW1ldGVycyhyZWFkZXIpOworICAgICAgICAgICAgaWYgKHBhcmFtZXRlcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHFzID0gZ2V0UXMocGFyYW1ldGVycy5nZXQoUXVhbGl0eS5RVUFMSVRZX1NPVVJDRV9QQVJBTUVURVJfTkFNRSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gdXNlIHByaXZhdGUgY29uc3RydWN0b3IgdG8gc2tpcCBxdWFsaXR5IHZhbHVlIHZhbGlkYXRpb24gc3RlcAorICAgICAgICByZXR1cm4gbmV3IFF1YWxpdHlTb3VyY2VNZWRpYVR5cGUodHlwZSwgc3ViVHlwZSwgcGFyYW1ldGVycywgcXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4dHJhY3QgcXVhbGl0eSBzb3VyY2UgaW5mb3JtYXRpb24gZnJvbSB0aGUgc3VwcGxpZWQge0BsaW5rIE1lZGlhVHlwZX0gdmFsdWUuCisgICAgICoKKyAgICAgKiBJZiBubyBxdWFsaXR5IHNvdXJjZSBwYXJhbWV0ZXIgaXMgcHJlc2VudCBpbiB0aGUgbWVkaWEgdHlwZSwge0BsaW5rIFF1YWxpdHkjREVGQVVMVAorICAgICAqIGRlZmF1bHQgcXVhbGl0eX0gaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVkaWFUeXBlIG1lZGlhIHR5cGUuCisgICAgICogQHJldHVybiBxdWFsaXR5IHNvdXJjZSBwYXJhbWV0ZXIgdmFsdWUgb3Ige0BsaW5rIFF1YWxpdHkjREVGQVVMVCBkZWZhdWx0IHF1YWxpdHl9LAorICAgICAqIGlmIG5vIHF1YWxpdHkgc291cmNlIHBhcmFtZXRlciBpcyBwcmVzZW50LgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW4gY2FzZSB0aGUgcXVhbGl0eSBzb3VyY2UgcGFyYW1ldGVyIHZhbHVlIGNvdWxkIG5vdCBiZSBwYXJzZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0UXVhbGl0eVNvdXJjZShmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG1lZGlhVHlwZSBpbnN0YW5jZW9mIFF1YWxpdHlTb3VyY2VNZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAoKFF1YWxpdHlTb3VyY2VNZWRpYVR5cGUpIG1lZGlhVHlwZSkuZ2V0UXVhbGl0eSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGdldFFzKG1lZGlhVHlwZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0UXMoTWVkaWFUeXBlIG10KSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBnZXRRcyhtdC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KFF1YWxpdHkuUVVBTElUWV9TT1VSQ0VfUEFSQU1FVEVSX05BTUUpKTsKKyAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldFFzKFN0cmluZyB2KSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICBpZiAodiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gUXVhbGl0eS5ERUZBVUxUOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIEh0dHBIZWFkZXJSZWFkZXIucmVhZFF1YWxpdHlGYWN0b3Iodik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKCFzdXBlci5lcXVhbHMob2JqKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIFF1YWxpdHlTb3VyY2VNZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIGZpbmFsIFF1YWxpdHlTb3VyY2VNZWRpYVR5cGUgb3RoZXIgPSAoUXVhbGl0eVNvdXJjZU1lZGlhVHlwZSkgb2JqOworICAgICAgICAgICAgcmV0dXJuIHRoaXMucXMgPT0gb3RoZXIucXM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBvYmogaXMgYSBwbGFpbiBNZWRpYVR5cGUgaW5zdGFuY2UKKyAgICAgICAgICAgIC8vIHdpdGggYSBxdWFsaXR5IHNvdXJjZSBmYWN0b3Igc2V0IHRvIGRlZmF1bHQgKDEuMCkKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnFzID09IFF1YWxpdHkuREVGQVVMVDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCBoYXNoID0gc3VwZXIuaGFzaENvZGUoKTsKKyAgICAgICAgcmV0dXJuICh0aGlzLnFzID09IFF1YWxpdHkuREVGQVVMVCkgPyBoYXNoIDogNDcgKiBoYXNoICsgdGhpcy5xczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gInsiICsgc3VwZXIudG9TdHJpbmcoKSArICIsIHFzPSIgKyBxcyArICJ9IjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvUmVhZGVySW50ZXJjZXB0b3JFeGVjdXRvci5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL1JlYWRlckludGVyY2VwdG9yRXhlY3V0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjJhMjVmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL1JlYWRlckludGVyY2VwdG9yRXhlY3V0b3IuamF2YQpAQCAtMCwwICsxLDMyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbVN1cHBvcnQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5CYWRSZXF1ZXN0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTm9Db250ZW50RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUmVhZGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJlYWRlckludGVyY2VwdG9yQ29udGV4dDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLlByb3BlcnRpZXNEZWxlZ2F0ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlclN1cHBsaWVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuTWVzc2FnZUJvZHlXb3JrZXJzOworCisvKioKKyAqIFJlcHJlc2VudHMgcmVhZGVyIGludGVyY2VwdG9yIGNoYWluIGV4ZWN1dG9yIGZvciBib3RoIGNsaWVudCBhbmQgc2VydmVyIHNpZGUuCisgKiBJdCBjb25zdHJ1Y3RzIHdyYXBwZWQgaW50ZXJjZXB0b3IgY2hhaW4gYW5kIGludm9rZXMgaXQuIEF0IHRoZSBlbmQgb2YgdGhlIGNoYWluCisgKiBhIHtAbGluayBNZXNzYWdlQm9keVJlYWRlciBtZXNzYWdlIGJvZHkgcmVhZGVyfSBleGVjdXRpb24gaW50ZXJjZXB0b3IgaXMgaW5zZXJ0ZWQsCisgKiB3aGljaCBmaW5hbGx5IHJlYWRzIGFuIGVudGl0eSBmcm9tIHRoZSBvdXRwdXQgc3RyZWFtIHByb3ZpZGVkIGJ5IHRoZSBjaGFpbi4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgUmVhZGVySW50ZXJjZXB0b3JFeGVjdXRvciBleHRlbmRzIEludGVyY2VwdG9yRXhlY3V0b3I8UmVhZGVySW50ZXJjZXB0b3I+CisgICAgICAgIGltcGxlbWVudHMgUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0LCBJbmplY3Rpb25NYW5hZ2VyU3VwcGxpZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoUmVhZGVySW50ZXJjZXB0b3JFeGVjdXRvci5jbGFzcy5nZXROYW1lKCkpOworCisgICAgcHJpdmF0ZSBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyczsKKyAgICBwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPFJlYWRlckludGVyY2VwdG9yPiBpbnRlcmNlcHRvcnM7CisgICAgcHJpdmF0ZSBmaW5hbCBNZXNzYWdlQm9keVdvcmtlcnMgd29ya2VyczsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gdHJhbnNsYXRlTmNlOworCisgICAgcHJpdmF0ZSBmaW5hbCBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXI7CisKKyAgICBwcml2YXRlIElucHV0U3RyZWFtIGlucHV0U3RyZWFtOworICAgIHByaXZhdGUgaW50IHByb2Nlc3NlZENvdW50OworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBleGVjdXRvciB0byByZWFkIGdpdmVuIHR5cGUgZnJvbSBwcm92aWRlZCB7QGxpbmsgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByYXdUeXBlICAgICAgICAgICAgcmF3IEphdmEgZW50aXR5IHR5cGUuCisgICAgICogQHBhcmFtIHR5cGUgICAgICAgICAgICAgICBnZW5lcmljIEphdmEgZW50aXR5IHR5cGUuCisgICAgICogQHBhcmFtIGFubm90YXRpb25zICAgICAgICBhcnJheSBvZiBhbm5vdGF0aW9ucyBvbiB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIGFydGlmYWN0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IHdpbGwgYmUgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgcHJvZHVjZWQgaW5zdGFuY2UuIEUuZy4gaWYgdGhlIG1lc3NhZ2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgaXMgdG8gYmUgY29udmVydGVkIGludG8gYSBtZXRob2QgcGFyYW1ldGVyLCB0aGlzIHdpbGwgYmUgdGhlIGFubm90YXRpb25zCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBvbiB0aGF0IHBhcmFtZXRlciByZXR1cm5lZCBieSB7QGNvZGUgTWV0aG9kLmdldFBhcmFtZXRlckFubm90YXRpb25zfS4KKyAgICAgKiBAcGFyYW0gbWVkaWFUeXBlICAgICAgICAgIG1lZGlhIHR5cGUgb2YgdGhlIEhUVFAgZW50aXR5LgorICAgICAqIEBwYXJhbSBoZWFkZXJzICAgICAgICAgICAgbXV0YWJsZSBtZXNzYWdlIGhlYWRlcnMuCisgICAgICogQHBhcmFtIHByb3BlcnRpZXNEZWxlZ2F0ZSByZXF1ZXN0LXNjb3BlZCBwcm9wZXJ0aWVzIGRlbGVnYXRlLgorICAgICAqIEBwYXJhbSBpbnB1dFN0cmVhbSAgICAgICAgZW50aXR5IGlucHV0IHN0cmVhbS4KKyAgICAgKiBAcGFyYW0gd29ya2VycyAgICAgICAgICAgIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLk1lc3NhZ2VCb2R5V29ya2VycyBNZXNzYWdlIGJvZHkgd29ya2Vyc30uCisgICAgICogQHBhcmFtIHJlYWRlckludGVyY2VwdG9ycyBSZWFkZXIgaW50ZXJjZXB0b3IgdGhhdCBhcmUgdG8gYmUgdXNlZCB0byBpbnRlcmNlcHQgdGhlIHJlYWRpbmcgb2YgYW4gZW50aXR5LgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGludGVyY2VwdG9ycyB3aWxsIGJlIGV4ZWN1dGVkIGluIHRoZSBzYW1lIG9yZGVyIGFzIGdpdmVuIGluIHRoaXMgcGFyYW1ldGVyLgorICAgICAqIEBwYXJhbSB0cmFuc2xhdGVOY2UgICAgICAgaWYge0Bjb2RlIHRydWV9LCB0aGUge0BsaW5rIGphdmF4LndzLnJzLmNvcmUuTm9Db250ZW50RXhjZXB0aW9ufSB0aHJvd24gYnkgYSBzZWxlY3RlZCBtZXNzYWdlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIgd2lsbCBiZSB0cmFuc2xhdGVkIGludG8gYSB7QGxpbmsgamF2YXgud3MucnMuQmFkUmVxdWVzdEV4Y2VwdGlvbn0gYXMgcmVxdWlyZWQgYnkKKyAgICAgKiBAcGFyYW0gaW5qZWN0aW9uTWFuYWdlciAgIGluamVjdGlvbiBtYW5hZ2VyLgorICAgICAqLworICAgIFJlYWRlckludGVyY2VwdG9yRXhlY3V0b3IoZmluYWwgQ2xhc3M8Pz4gcmF3VHlwZSwgZmluYWwgVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUHJvcGVydGllc0RlbGVnYXRlIHByb3BlcnRpZXNEZWxlZ2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVzc2FnZUJvZHlXb3JrZXJzIHdvcmtlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJdGVyYWJsZTxSZWFkZXJJbnRlcmNlcHRvcj4gcmVhZGVySW50ZXJjZXB0b3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiB0cmFuc2xhdGVOY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIpIHsKKworICAgICAgICBzdXBlcihyYXdUeXBlLCB0eXBlLCBhbm5vdGF0aW9ucywgbWVkaWFUeXBlLCBwcm9wZXJ0aWVzRGVsZWdhdGUpOworICAgICAgICB0aGlzLmhlYWRlcnMgPSBoZWFkZXJzOworICAgICAgICB0aGlzLmlucHV0U3RyZWFtID0gaW5wdXRTdHJlYW07CisgICAgICAgIHRoaXMud29ya2VycyA9IHdvcmtlcnM7CisgICAgICAgIHRoaXMudHJhbnNsYXRlTmNlID0gdHJhbnNsYXRlTmNlOworICAgICAgICB0aGlzLmluamVjdGlvbk1hbmFnZXIgPSBpbmplY3Rpb25NYW5hZ2VyOworCisgICAgICAgIGZpbmFsIExpc3Q8UmVhZGVySW50ZXJjZXB0b3I+IGVmZmVjdGl2ZUludGVyY2VwdG9ycyA9IFN0cmVhbVN1cHBvcnQuc3RyZWFtKHJlYWRlckludGVyY2VwdG9ycy5zcGxpdGVyYXRvcigpLCBmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgICAgICBlZmZlY3RpdmVJbnRlcmNlcHRvcnMuYWRkKG5ldyBUZXJtaW5hbFJlYWRlckludGVyY2VwdG9yKCkpOworCisgICAgICAgIHRoaXMuaW50ZXJjZXB0b3JzID0gZWZmZWN0aXZlSW50ZXJjZXB0b3JzLml0ZXJhdG9yKCk7CisgICAgICAgIHRoaXMucHJvY2Vzc2VkQ291bnQgPSAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0cyB0aGUgaW50ZXJjZXB0b3IgY2hhaW4gZXhlY3V0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBhbiBlbnRpdHkgcmVhZCBmcm9tIHRoZSBzdHJlYW0uCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIE9iamVjdCBwcm9jZWVkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFpbnRlcmNlcHRvcnMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9JTlRFUkNFUFRPUl9SRUFERVJfUFJPQ0VFRCgpKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBSZWFkZXJJbnRlcmNlcHRvciBpbnRlcmNlcHRvciA9IGludGVyY2VwdG9ycy5uZXh0KCk7CisgICAgICAgIHRyYWNlQmVmb3JlKGludGVyY2VwdG9yLCBNc2dUcmFjZUV2ZW50LlJJX0JFRk9SRSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gaW50ZXJjZXB0b3IuYXJvdW5kUmVhZEZyb20odGhpcyk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBwcm9jZXNzZWRDb3VudCsrOworICAgICAgICAgICAgdHJhY2VBZnRlcihpbnRlcmNlcHRvciwgTXNnVHJhY2VFdmVudC5SSV9BRlRFUik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB7CisgICAgICAgIHJldHVybiB0aGlzLmlucHV0U3RyZWFtOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldElucHV0U3RyZWFtKGZpbmFsIElucHV0U3RyZWFtIGlzKSB7CisgICAgICAgIHRoaXMuaW5wdXRTdHJlYW0gPSBpczsKKworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0SGVhZGVycygpIHsKKyAgICAgICAgcmV0dXJuIGhlYWRlcnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IG51bWJlciBvZiBwcm9jZXNzZWQgaW50ZXJjZXB0b3JzLgorICAgICAqCisgICAgICogQHJldHVybiBudW1iZXIgb2YgcHJvY2Vzc2VkIGludGVyY2VwdG9ycy4KKyAgICAgKi8KKyAgICBpbnQgZ2V0UHJvY2Vzc2VkQ291bnQoKSB7CisgICAgICAgIHJldHVybiBwcm9jZXNzZWRDb3VudDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSW5qZWN0aW9uTWFuYWdlciBnZXRJbmplY3Rpb25NYW5hZ2VyKCkgeworICAgICAgICByZXR1cm4gaW5qZWN0aW9uTWFuYWdlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXJtaW5hbCByZWFkZXIgaW50ZXJjZXB0b3Igd2hpY2ggY2hvb3NlIHRoZSBhcHByb3ByaWF0ZSB7QGxpbmsgTWVzc2FnZUJvZHlSZWFkZXJ9CisgICAgICogYW5kIHJlYWRzIHRoZSBlbnRpdHkgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLiBUaGUgb3JkZXIgb2YgYWN0aW9ucyBpcyB0aGUgZm9sbG93aW5nOiA8YnI+CisgICAgICogMS4gY2hvb3NlIHRoZSBhcHByb3ByaWF0ZSB7QGxpbmsgTWVzc2FnZUJvZHlSZWFkZXJ9IDxicj4KKyAgICAgKiAzLiByZWFkcyB0aGUgZW50aXR5IGZyb20gdGhlIG91dHB1dCBzdHJlYW0gPGJyPgorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgVGVybWluYWxSZWFkZXJJbnRlcmNlcHRvciBpbXBsZW1lbnRzIFJlYWRlckludGVyY2VwdG9yIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgIHB1YmxpYyBPYmplY3QgYXJvdW5kUmVhZEZyb20oZmluYWwgUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgcHJvY2Vzc2VkQ291bnQtLTsgLy90aGlzIGlzIG5vdCByZWd1bGFyIGludGVyY2VwdG9yIC0+IGNvdW50IGRvd24KKworICAgICAgICAgICAgdHJhY2VCZWZvcmUobnVsbCwgTXNnVHJhY2VFdmVudC5SSV9CRUZPUkUpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmaW5hbCBUcmFjaW5nTG9nZ2VyIHRyYWNpbmdMb2dnZXIgPSBnZXRUcmFjaW5nTG9nZ2VyKCk7CisgICAgICAgICAgICAgICAgaWYgKHRyYWNpbmdMb2dnZXIuaXNMb2dFbmFibGVkKE1zZ1RyYWNlRXZlbnQuTUJSX0ZJTkQpKSB7CisgICAgICAgICAgICAgICAgICAgIHRyYWNpbmdMb2dnZXIubG9nKE1zZ1RyYWNlRXZlbnQuTUJSX0ZJTkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRUeXBlKCkuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb250ZXh0LmdldEdlbmVyaWNUeXBlKCkgaW5zdGFuY2VvZiBDbGFzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoKENsYXNzKSBjb250ZXh0LmdldEdlbmVyaWNUeXBlKCkpLmdldE5hbWUoKSA6IGNvbnRleHQuZ2V0R2VuZXJpY1R5cGUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoY29udGV4dC5nZXRNZWRpYVR5cGUoKSksIGphdmEudXRpbC5BcnJheXMudG9TdHJpbmcoY29udGV4dC5nZXRBbm5vdGF0aW9ucygpKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZmluYWwgTWVzc2FnZUJvZHlSZWFkZXIgYm9keVJlYWRlciA9IHdvcmtlcnMuZ2V0TWVzc2FnZUJvZHlSZWFkZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0R2VuZXJpY1R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0QW5ub3RhdGlvbnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0TWVkaWFUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICBSZWFkZXJJbnRlcmNlcHRvckV4ZWN1dG9yLnRoaXMpOworCisgICAgICAgICAgICAgICAgZmluYWwgRW50aXR5SW5wdXRTdHJlYW0gaW5wdXQgPSBuZXcgRW50aXR5SW5wdXRTdHJlYW0oY29udGV4dC5nZXRJbnB1dFN0cmVhbSgpKTsKKworICAgICAgICAgICAgICAgIGlmIChib2R5UmVhZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0LmlzRW1wdHkoKSAmJiAhY29udGV4dC5nZXRIZWFkZXJzKCkuY29udGFpbnNLZXkoSHR0cEhlYWRlcnMuQ09OVEVOVF9UWVBFKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLkZJTkUsIExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX05PVEZPVU5EX01FU1NBR0VCT0RZUkVBREVSKGNvbnRleHQuZ2V0TWVkaWFUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0VHlwZSgpLCBjb250ZXh0LmdldEdlbmVyaWNUeXBlKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNZXNzYWdlQm9keVByb3ZpZGVyTm90Rm91bmRFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfTk9URk9VTkRfTUVTU0FHRUJPRFlSRUFERVIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0TWVkaWFUeXBlKCksIGNvbnRleHQuZ2V0VHlwZSgpLCBjb250ZXh0LmdldEdlbmVyaWNUeXBlKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBPYmplY3QgZW50aXR5ID0gaW52b2tlUmVhZEZyb20oY29udGV4dCwgYm9keVJlYWRlciwgaW5wdXQpOworCisgICAgICAgICAgICAgICAgaWYgKGJvZHlSZWFkZXIgaW5zdGFuY2VvZiBDb21wbGV0YWJsZVJlYWRlcikgeworICAgICAgICAgICAgICAgICAgICBlbnRpdHkgPSAoKENvbXBsZXRhYmxlUmVhZGVyKSBib2R5UmVhZGVyKS5jb21wbGV0ZShlbnRpdHkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZW50aXR5OworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBjbGVhckxhc3RUcmFjZWRJbnRlcmNlcHRvcigpOworICAgICAgICAgICAgICAgIHRyYWNlQWZ0ZXIobnVsbCwgTXNnVHJhY2VFdmVudC5SSV9BRlRFUik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgcHJpdmF0ZSBPYmplY3QgaW52b2tlUmVhZEZyb20oZmluYWwgUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQsIGZpbmFsIE1lc3NhZ2VCb2R5UmVhZGVyIHJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRW50aXR5SW5wdXRTdHJlYW0gaW5wdXQpIHRocm93cyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworCisgICAgICAgICAgICBmaW5hbCBUcmFjaW5nTG9nZ2VyIHRyYWNpbmdMb2dnZXIgPSBnZXRUcmFjaW5nTG9nZ2VyKCk7CisgICAgICAgICAgICBmaW5hbCBsb25nIHRpbWVzdGFtcCA9IHRyYWNpbmdMb2dnZXIudGltZXN0YW1wKE1zZ1RyYWNlRXZlbnQuTUJSX1JFQURfRlJPTSk7CisgICAgICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgVW5DbG9zZWFibGVJbnB1dFN0cmVhbShpbnB1dCwgcmVhZGVyKTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVhZGVyLnJlYWRGcm9tKGNvbnRleHQuZ2V0VHlwZSgpLCBjb250ZXh0LmdldEdlbmVyaWNUeXBlKCksIGNvbnRleHQuZ2V0QW5ub3RhdGlvbnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0TWVkaWFUeXBlKCksIGNvbnRleHQuZ2V0SGVhZGVycygpLCBzdHJlYW0pOworICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgTm9Db250ZW50RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgaWYgKHRyYW5zbGF0ZU5jZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihleCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICB0cmFjaW5nTG9nZ2VyLmxvZ0R1cmF0aW9uKE1zZ1RyYWNlRXZlbnQuTUJSX1JFQURfRlJPTSwgdGltZXN0YW1wLCByZWFkZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICoge0BsaW5rIGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcn1zIHNob3VsZCBub3QgY2xvc2UgdGhlIGdpdmVuIHtAbGluayBqYXZhLmlvLklucHV0U3RyZWFtIHN0cmVhbX0uIFRoaXMgaW5wdXQKKyAgICAgKiBzdHJlYW0gbWFrZXMgc3VyZSB0aGF0IHRoZSBzdHJlYW0gaXMgbm90IGNsb3NlZCBldmVuIGlmIE1CUiB0cmllcyB0byBkbyBpdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBVbkNsb3NlYWJsZUlucHV0U3RyZWFtIGV4dGVuZHMgSW5wdXRTdHJlYW0geworCisgICAgICAgIHByaXZhdGUgZmluYWwgSW5wdXRTdHJlYW0gb3JpZ2luYWw7CisgICAgICAgIHByaXZhdGUgZmluYWwgTWVzc2FnZUJvZHlSZWFkZXIgcmVhZGVyOworCisgICAgICAgIHByaXZhdGUgVW5DbG9zZWFibGVJbnB1dFN0cmVhbShmaW5hbCBJbnB1dFN0cmVhbSBvcmlnaW5hbCwgZmluYWwgTWVzc2FnZUJvZHlSZWFkZXIgcmVhZGVyKSB7CisgICAgICAgICAgICB0aGlzLm9yaWdpbmFsID0gb3JpZ2luYWw7CisgICAgICAgICAgICB0aGlzLnJlYWRlciA9IHJlYWRlcjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsLnJlYWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHJlYWQoZmluYWwgYnl0ZVtdIGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwucmVhZChiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHJlYWQoZmluYWwgYnl0ZVtdIGIsIGZpbmFsIGludCBvZmYsIGZpbmFsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwucmVhZChiLCBvZmYsIGxlbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgc2tpcChmaW5hbCBsb25nIGwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwuc2tpcChsKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGF2YWlsYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWwuYXZhaWxhYmxlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIG1hcmsoZmluYWwgaW50IGkpIHsKKyAgICAgICAgICAgIG9yaWdpbmFsLm1hcmsoaSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlc2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIG9yaWdpbmFsLnJlc2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbC5tYXJrU3VwcG9ydGVkKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKExPR0dFUi5pc0xvZ2dhYmxlKExldmVsLkZJTkUpKSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5GSU5FLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5NQlJfVFJZSU5HX1RPX0NMT1NFX1NUUkVBTShyZWFkZXIuZ2V0Q2xhc3MoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSB1bndyYXAoKSB7CisgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYWtlIHRoZSB7QGxpbmsgSW5wdXRTdHJlYW19IGFibGUgdG8gY2xvc2UuCisgICAgICogPHAvPgorICAgICAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgdXRpbGl0eSBtZXRob2QgaXMgdG8gdW5kbyBlZmZlY3Qgb2Yge0BsaW5rIFJlYWRlckludGVyY2VwdG9yRXhlY3V0b3IuVW5DbG9zZWFibGVJbnB1dFN0cmVhbX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5wdXRTdHJlYW0gUG90ZW50aWFsIHtAbGluayBSZWFkZXJJbnRlcmNlcHRvckV4ZWN1dG9yLlVuQ2xvc2VhYmxlSW5wdXRTdHJlYW19IHRvIHVuZG8gaXRzIGVmZmVjdAorICAgICAqIEByZXR1cm4gSW5wdXQgc3RyZWFtIHRoYXQgaXMgcG9zc2libGUgdG8gY2xvc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIElucHV0U3RyZWFtIGNsb3NlYWJsZUlucHV0U3RyZWFtKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB7CisgICAgICAgIGlmIChpbnB1dFN0cmVhbSBpbnN0YW5jZW9mIFVuQ2xvc2VhYmxlSW5wdXRTdHJlYW0pIHsKKyAgICAgICAgICAgIHJldHVybiAoKFVuQ2xvc2VhYmxlSW5wdXRTdHJlYW0pIGlucHV0U3RyZWFtKS51bndyYXAoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBpbnB1dFN0cmVhbTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9SZWFkZXJQcm92aWRlci5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL1JlYWRlclByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNmNGNjNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9SZWFkZXJQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuTWVzc2FnZVV0aWxzOworCisvKioKKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKi8KK0BQcm9kdWNlcyh7InRleHQvcGxhaW4iLCAiKi8qIn0pCitAQ29uc3VtZXMoeyJ0ZXh0L3BsYWluIiwgIiovKiJ9KQorQFNpbmdsZXRvbgorcHVibGljIGZpbmFsIGNsYXNzIFJlYWRlclByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlUmVhZGVyV3JpdGVyUHJvdmlkZXI8UmVhZGVyPiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIFJlYWRlci5jbGFzcyA9PSB0eXBlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZWFkZXIgcmVhZEZyb20oCisgICAgICAgICAgICBmaW5hbCBDbGFzczxSZWFkZXI+IHR5cGUsCisgICAgICAgICAgICBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBodHRwSGVhZGVycywKKyAgICAgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGZpbmFsIEVudGl0eUlucHV0U3RyZWFtIGVudGl0eVN0cmVhbSA9IEVudGl0eUlucHV0U3RyZWFtLmNyZWF0ZShpbnB1dFN0cmVhbSk7CisgICAgICAgIGlmIChlbnRpdHlTdHJlYW0uaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcigKKyAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlWzBdKSwgTWVzc2FnZVV0aWxzLmdldENoYXJzZXQobWVkaWFUeXBlKSkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoZW50aXR5U3RyZWFtLCBnZXRDaGFyc2V0KG1lZGlhVHlwZSkpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICByZXR1cm4gUmVhZGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGVUbygKKyAgICAgICAgICAgIGZpbmFsIFJlYWRlciB0LAorICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gdHlwZSwKKyAgICAgICAgICAgIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbVdyaXRlciBvdXQgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGVudGl0eVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgZ2V0Q2hhcnNldChtZWRpYVR5cGUpKTsKKyAgICAgICAgICAgIHdyaXRlVG8odCwgb3V0KTsKKyAgICAgICAgICAgIG91dC5mbHVzaCgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdC5jbG9zZSgpOworICAgICAgICB9CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvUmVhZGVyV3JpdGVyLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvUmVhZGVyV3JpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYyZGQyZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9SZWFkZXJXcml0ZXIuamF2YQpAQCAtMCwwICsxLDE5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5DbG9zZWFibGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5Qcm9wZXJ0aWVzSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuTWVzc2FnZVByb3BlcnRpZXM7CisKKy8qKgorICogQSB1dGlsaXR5IGNsYXNzIGZvciByZWFkaW5nIGFuZCB3cml0aW5nIHVzaW5nIGJ5dGUgYW5kIGNoYXJhY3RlciBzdHJlYW1zLgorICogPHA+CisgKiBJZiBhIGJ5dGUgb3IgY2hhcmFjdGVyIGFycmF5IGlzIHV0aWxpemVkIHRoZW4gdGhlIHNpemUgb2YgdGhlIGFycmF5CisgKiBpcyBieSBkZWZhdWx0IHRoZSB2YWx1ZSBvZiB7QHZhbHVlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuTWVzc2FnZVByb3BlcnRpZXMjSU9fREVGQVVMVF9CVUZGRVJfU0laRX0uCisgKiBUaGlzIHZhbHVlIGNhbiBiZSBzZXQgdXNpbmcgdGhlIHN5c3RlbSBwcm9wZXJ0eQorICoge0B2YWx1ZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLk1lc3NhZ2VQcm9wZXJ0aWVzI0lPX0JVRkZFUl9TSVpFfS4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBSZWFkZXJXcml0ZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoUmVhZGVyV3JpdGVyLmNsYXNzLmdldE5hbWUoKSk7CisgICAgLyoqCisgICAgICogVGhlIFVURi04IENoYXJzZXQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDaGFyc2V0IFVURjggPSBDaGFyc2V0LmZvck5hbWUoIlVURi04Iik7CisgICAgLyoqCisgICAgICogVGhlIGJ1ZmZlciBzaXplIGZvciBhcnJheXMgb2YgYnl0ZSBhbmQgY2hhcmFjdGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gZ2V0QnVmZmVyU2l6ZSgpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldEJ1ZmZlclNpemUoKSB7CisgICAgICAgIC8vIFRPRE8gc2hvdWxkIHdlIHVuaWZ5IHRoaXMgYnVmZmVyIHNpemUgYW5kIENvbW1pdHRpbmdPdXRwdXRTdHJlYW0gYnVmZmVyIHNpemUgKGNvbnRyb2xsZWQgYnkgQ29tbW9uUHJvcGVydGllcy5PVVRCT1VORF9DT05URU5UX0xFTkdUSF9CVUZGRVIpPworICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUgPSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChQcm9wZXJ0aWVzSGVscGVyLmdldFN5c3RlbVByb3BlcnR5KE1lc3NhZ2VQcm9wZXJ0aWVzLklPX0JVRkZFUl9TSVpFKSk7CisgICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBpID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7CisgICAgICAgICAgICAgICAgaWYgKGkgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKCJWYWx1ZSBub3QgcG9zaXRpdmUuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLkNPTkZJRywKKyAgICAgICAgICAgICAgICAgICAgICAgICJWYWx1ZSBvZiAiICsgTWVzc2FnZVByb3BlcnRpZXMuSU9fQlVGRkVSX1NJWkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHByb3BlcnR5IGlzIG5vdCBhIHZhbGlkIHBvc2l0aXZlIGludGVnZXIgWyIgKyB2YWx1ZSArICJdLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIFJldmVydGluZyB0byBkZWZhdWx0IFsiICsgTWVzc2FnZVByb3BlcnRpZXMuSU9fREVGQVVMVF9CVUZGRVJfU0laRSArICJdLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTWVzc2FnZVByb3BlcnRpZXMuSU9fREVGQVVMVF9CVUZGRVJfU0laRTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGJ5dGVzIGZyb20gYW4gaW5wdXQgc3RyZWFtIGFuZCB3cml0ZSB0aGVtIHRvIGFuIG91dHB1dCBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW4gIHRoZSBpbnB1dCBzdHJlYW0gdG8gcmVhZCBmcm9tLgorICAgICAqIEBwYXJhbSBvdXQgdGhlIG91dHB1dCBzdHJlYW0gdG8gd3JpdGUgdG8uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvciByZWFkaW5nIG9yIHdyaXRpbmcgYnl0ZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHdyaXRlVG8oSW5wdXRTdHJlYW0gaW4sIE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGludCByZWFkOworICAgICAgICBmaW5hbCBieXRlW10gZGF0YSA9IG5ldyBieXRlW0JVRkZFUl9TSVpFXTsKKyAgICAgICAgd2hpbGUgKChyZWFkID0gaW4ucmVhZChkYXRhKSkgIT0gLTEpIHsKKyAgICAgICAgICAgIG91dC53cml0ZShkYXRhLCAwLCByZWFkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgY2hhcmFjdGVycyBmcm9tIGFuIGlucHV0IHN0cmVhbSBhbmQgd3JpdGUgdGhlbSB0byBhbiBvdXRwdXQgc3RyZWFtLgorICAgICAqCisgICAgICogQHBhcmFtIGluICB0aGUgcmVhZGVyIHRvIHJlYWQgZnJvbS4KKyAgICAgKiBAcGFyYW0gb3V0IHRoZSB3cml0ZXIgdG8gd3JpdGUgdG8uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvciByZWFkaW5nIG9yIHdyaXRpbmcgY2hhcmFjdGVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVUbyhSZWFkZXIgaW4sIFdyaXRlciBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGludCByZWFkOworICAgICAgICBmaW5hbCBjaGFyW10gZGF0YSA9IG5ldyBjaGFyW0JVRkZFUl9TSVpFXTsKKyAgICAgICAgd2hpbGUgKChyZWFkID0gaW4ucmVhZChkYXRhKSkgIT0gLTEpIHsKKyAgICAgICAgICAgIG91dC53cml0ZShkYXRhLCAwLCByZWFkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY2hhcmFjdGVyIHNldCBmcm9tIGEgbWVkaWEgdHlwZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY2hhcmFjdGVyIHNldCBpcyBvYnRhaW5lZCBmcm9tIHRoZSBtZWRpYSB0eXBlIHBhcmFtZXRlciAiY2hhcnNldCIuCisgICAgICogSWYgdGhlIHBhcmFtZXRlciBpcyBub3QgcHJlc2VudCB0aGUge0BsaW5rICNVVEY4fSBjaGFyc2V0IGlzIHV0aWxpemVkLgorICAgICAqCisgICAgICogQHBhcmFtIG0gdGhlIG1lZGlhIHR5cGUuCisgICAgICogQHJldHVybiB0aGUgY2hhcmFjdGVyIHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENoYXJzZXQgZ2V0Q2hhcnNldChNZWRpYVR5cGUgbSkgeworICAgICAgICBTdHJpbmcgbmFtZSA9IChtID09IG51bGwpID8gbnVsbCA6IG0uZ2V0UGFyYW1ldGVycygpLmdldChNZWRpYVR5cGUuQ0hBUlNFVF9QQVJBTUVURVIpOworICAgICAgICByZXR1cm4gKG5hbWUgPT0gbnVsbCkgPyBVVEY4IDogQ2hhcnNldC5mb3JOYW1lKG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgdGhlIGJ5dGVzIG9mIGFuIGlucHV0IHN0cmVhbSBhbmQgY29udmVydCB0byBhIHN0cmluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbiAgIHRoZSBpbnB1dCBzdHJlYW0gdG8gcmVhZCBmcm9tLgorICAgICAqIEBwYXJhbSB0eXBlIHRoZSBtZWRpYSB0eXBlIHRoYXQgZGV0ZXJtaW5lcyB0aGUgY2hhcmFjdGVyIHNldCBkZWZpbmluZworICAgICAqICAgICAgICAgICAgIGhvdyB0byBkZWNvZGUgYnl0ZXMgdG8gY2hhcmFjdGVycy4KKyAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yIHJlYWRpbmcgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlYWRGcm9tQXNTdHJpbmcoSW5wdXRTdHJlYW0gaW4sIE1lZGlhVHlwZSB0eXBlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gcmVhZEZyb21Bc1N0cmluZyhuZXcgSW5wdXRTdHJlYW1SZWFkZXIoaW4sIGdldENoYXJzZXQodHlwZSkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIHRoZSBjaGFyYWN0ZXJzIG9mIGEgcmVhZGVyIGFuZCBjb252ZXJ0IHRvIGEgc3RyaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIHJlYWRlciB0aGUgcmVhZGVyCisgICAgICogQHJldHVybiB0aGUgc3RyaW5nCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yIHJlYWRpbmcgZnJvbSB0aGUgcmVhZGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlYWRGcm9tQXNTdHJpbmcoUmVhZGVyIHJlYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGNoYXJbXSBjID0gbmV3IGNoYXJbQlVGRkVSX1NJWkVdOworICAgICAgICBpbnQgbDsKKyAgICAgICAgd2hpbGUgKChsID0gcmVhZGVyLnJlYWQoYykpICE9IC0xKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoYywgMCwgbCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCBhIHN0cmluZyB0byBieXRlcyBhbmQgd3JpdGUgdGhvc2UgYnl0ZXMgdG8gYW4gb3V0cHV0IHN0cmVhbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzICAgIHRoZSBzdHJpbmcgdG8gY29udmVydCB0byBieXRlcy4KKyAgICAgKiBAcGFyYW0gb3V0ICB0aGUgb3V0cHV0IHN0cmVhbSB0byB3cml0ZSB0by4KKyAgICAgKiBAcGFyYW0gdHlwZSB0aGUgbWVkaWEgdHlwZSB0aGF0IGRldGVybWluZXMgdGhlIGNoYXJhY3RlciBzZXQgZGVmaW5pbmcKKyAgICAgKiAgICAgICAgICAgICBob3cgdG8gZGVjb2RlIGJ5dGVzIHRvIGNoYXJhY3RlcnMuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgd3JpdGUgZmFpbHVyZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVUb0FzU3RyaW5nKFN0cmluZyBzLCBPdXRwdXRTdHJlYW0gb3V0LCBNZWRpYVR5cGUgdHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgV3JpdGVyIG9zdyA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0LCBnZXRDaGFyc2V0KHR5cGUpKTsKKyAgICAgICAgb3N3LndyaXRlKHMsIDAsIHMubGVuZ3RoKCkpOworICAgICAgICBvc3cuZmx1c2goKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTYWZlbHkgY2xvc2UgYSBjbG9zZWFibGUsIHdpdGhvdXQgdGhyb3dpbmcgYW4gZXhjZXB0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNsb3NlYWJsZSBvYmplY3QgdG8gYmUgY2xvc2VkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzYWZlbHlDbG9zZShDbG9zZWFibGUgY2xvc2VhYmxlKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjbG9zZWFibGUuY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLkZJTkUsIExvY2FsaXphdGlvbk1lc3NhZ2VzLk1FU1NBR0VfQ09OVEVOVF9JTlBVVF9TVFJFQU1fQ0xPU0VfRkFJTEVEKCksIGlvZSk7CisgICAgICAgIH0gY2F0Y2ggKFByb2Nlc3NpbmdFeGNlcHRpb24gcGUpIHsKKyAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuRklORSwgTG9jYWxpemF0aW9uTWVzc2FnZXMuTUVTU0FHRV9DT05URU5UX0lOUFVUX1NUUkVBTV9DTE9TRV9GQUlMRUQoKSwgcGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJldmVudHMgaW5zdGFudGlhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFJlYWRlcldyaXRlcigpIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvUmVuZGVyZWRJbWFnZVByb3ZpZGVyLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvUmVuZGVyZWRJbWFnZVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNlNzkyZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9SZW5kZXJlZEltYWdlUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsOworCitpbXBvcnQgamF2YS5hd3QuaW1hZ2UuQnVmZmVyZWRJbWFnZTsKK2ltcG9ydCBqYXZhLmF3dC5pbWFnZS5SZW5kZXJlZEltYWdlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKKworaW1wb3J0IGphdmF4LmltYWdlaW8uSW1hZ2VJTzsKK2ltcG9ydCBqYXZheC5pbWFnZWlvLkltYWdlUmVhZGVyOworaW1wb3J0IGphdmF4LmltYWdlaW8uSW1hZ2VXcml0ZXI7CitpbXBvcnQgamF2YXguaW1hZ2Vpby5zdHJlYW0uSW1hZ2VJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCisvKioKKyAqIFByb3ZpZGVyIGZvciBtYXJzaGFsbGluZy91bi1tYXJzaGFsbGluZyBvZiBncmFwaGljYWwgaW1hZ2UgZGF0YSByZXByZXNlbnRlZCBhcworICoge0Bjb2RlIGltYWdlLyosIGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZH0gZW50aXR5IHR5cGVzIHRvCisgKiB7QGxpbmsgUmVuZGVyZWRJbWFnZSByZW5kZXJlZH0gYW5kIGZyb20ge0BsaW5rIFJlbmRlcmVkSW1hZ2UgcmVuZGVyZWR9IG9yCisgKiB7QGxpbmsgQnVmZmVyZWRJbWFnZSBidWZmZXJlZH0gaW1hZ2UgaW5zdGFuY2UuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQFByb2R1Y2VzKCJpbWFnZS8qIikKK0BDb25zdW1lcyh7ImltYWdlLyoiLCAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIn0pCitAU2luZ2xldG9uCitwdWJsaWMgZmluYWwgY2xhc3MgUmVuZGVyZWRJbWFnZVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlUmVhZGVyV3JpdGVyUHJvdmlkZXI8UmVuZGVyZWRJbWFnZT4geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWVkaWFUeXBlIElNQUdFX01FRElBX1RZUEUgPSBuZXcgTWVkaWFUeXBlKCJpbWFnZSIsICIqIik7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICByZXR1cm4gUmVuZGVyZWRJbWFnZS5jbGFzcyA9PSB0eXBlIHx8IEJ1ZmZlcmVkSW1hZ2UuY2xhc3MgPT0gdHlwZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVuZGVyZWRJbWFnZSByZWFkRnJvbSgKKyAgICAgICAgICAgIENsYXNzPFJlbmRlcmVkSW1hZ2U+IHR5cGUsCisgICAgICAgICAgICBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uc1tdLAorICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBodHRwSGVhZGVycywKKyAgICAgICAgICAgIElucHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKElNQUdFX01FRElBX1RZUEUuaXNDb21wYXRpYmxlKG1lZGlhVHlwZSkpIHsKKyAgICAgICAgICAgIEl0ZXJhdG9yPEltYWdlUmVhZGVyPiByZWFkZXJzID0gSW1hZ2VJTy5nZXRJbWFnZVJlYWRlcnNCeU1JTUVUeXBlKG1lZGlhVHlwZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGlmICghcmVhZGVycy5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIlRoZSBpbWFnZS1iYXNlZCBtZWRpYSB0eXBlICIgKyBtZWRpYVR5cGUgKyAiaXMgbm90IHN1cHBvcnRlZCBmb3IgcmVhZGluZyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSW1hZ2VSZWFkZXIgcmVhZGVyID0gcmVhZGVycy5uZXh0KCk7CisKKyAgICAgICAgICAgIEltYWdlSW5wdXRTdHJlYW0gaW4gPSBJbWFnZUlPLmNyZWF0ZUltYWdlSW5wdXRTdHJlYW0oZW50aXR5U3RyZWFtKTsKKyAgICAgICAgICAgIHJlYWRlci5zZXRJbnB1dChpbiwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgICAgICBCdWZmZXJlZEltYWdlIGJpID0gcmVhZGVyLnJlYWQoMCwgcmVhZGVyLmdldERlZmF1bHRSZWFkUGFyYW0oKSk7CisgICAgICAgICAgICBpbi5jbG9zZSgpOworICAgICAgICAgICAgcmVhZGVyLmRpc3Bvc2UoKTsKKyAgICAgICAgICAgIHJldHVybiBiaTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBJbWFnZUlPLnJlYWQoZW50aXR5U3RyZWFtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICByZXR1cm4gUmVuZGVyZWRJbWFnZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oCisgICAgICAgICAgICBSZW5kZXJlZEltYWdlIHQsCisgICAgICAgICAgICBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbnNbXSwKKyAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgZm9ybWF0TmFtZSA9IGdldFdyaXRlckZvcm1hdE5hbWUobWVkaWFUeXBlKTsKKyAgICAgICAgaWYgKGZvcm1hdE5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJUaGUgaW1hZ2UtYmFzZWQgbWVkaWEgdHlwZSAiICsgbWVkaWFUeXBlICsgIiBpcyBub3Qgc3VwcG9ydGVkIGZvciB3cml0aW5nIik7CisgICAgICAgIH0KKyAgICAgICAgSW1hZ2VJTy53cml0ZSh0LCBmb3JtYXROYW1lLCBlbnRpdHlTdHJlYW0pOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldFdyaXRlckZvcm1hdE5hbWUoTWVkaWFUeXBlIHQpIHsKKyAgICAgICAgcmV0dXJuIGdldFdyaXRlckZvcm1hdE5hbWUodC50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRXcml0ZXJGb3JtYXROYW1lKFN0cmluZyB0KSB7CisgICAgICAgIEl0ZXJhdG9yPEltYWdlV3JpdGVyPiBpID0gSW1hZ2VJTy5nZXRJbWFnZVdyaXRlcnNCeU1JTUVUeXBlKHQpOworICAgICAgICBpZiAoIWkuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBpLm5leHQoKS5nZXRPcmlnaW5hdGluZ1Byb3ZpZGVyKCkuZ2V0Rm9ybWF0TmFtZXMoKVswXTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvU291cmNlUHJvdmlkZXIuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9Tb3VyY2VQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZTUzMGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvU291cmNlUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDIyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKKworaW1wb3J0IGphdmF4LndzLnJzLkJhZFJlcXVlc3RFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworCitpbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYU291cmNlOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7CisKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247CisKKy8qKgorICogQ29sbGVjdGlvbiBvZiB7QGxpbmsgU291cmNlIFhNTCBzb3VyY2V9IHByb3ZpZGVycy4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitAU2luZ2xldG9uCitwdWJsaWMgZmluYWwgY2xhc3MgU291cmNlUHJvdmlkZXIgeworCisgICAgLyoqCisgICAgICogUHJvdmlkZXIgZm9yIHVuLW1hcnNoYWxsaW5nIHtAbGluayBTdHJlYW1Tb3VyY2V9IGluc3RhbmNlcy4KKyAgICAgKi8KKyAgICBAUHJvZHVjZXMoeyJhcHBsaWNhdGlvbi94bWwiLCAidGV4dC94bWwiLCAiKi8qIn0pCisgICAgQENvbnN1bWVzKHsiYXBwbGljYXRpb24veG1sIiwgInRleHQveG1sIiwgIiovKiJ9KQorICAgIEBTaW5nbGV0b24KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFN0cmVhbVNvdXJjZVJlYWRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5UmVhZGVyPFN0cmVhbVNvdXJjZT4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKENsYXNzPD8+IHQsIFR5cGUgZ3QsIEFubm90YXRpb25bXSBhcywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIFN0cmVhbVNvdXJjZS5jbGFzcyA9PSB0IHx8IFNvdXJjZS5jbGFzcyA9PSB0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJlYW1Tb3VyY2UgcmVhZEZyb20oCisgICAgICAgICAgICAgICAgQ2xhc3M8U3RyZWFtU291cmNlPiB0LAorICAgICAgICAgICAgICAgIFR5cGUgZ3QsCisgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFzLAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyZWFtU291cmNlKGVudGl0eVN0cmVhbSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlciBmb3IgdW4tbWFyc2hhbGxpbmcge0BsaW5rIFNBWFNvdXJjZX0gaW5zdGFuY2VzLgorICAgICAqLworICAgIEBQcm9kdWNlcyh7ImFwcGxpY2F0aW9uL3htbCIsICJ0ZXh0L3htbCIsICIqLyoifSkKKyAgICBAQ29uc3VtZXMoeyJhcHBsaWNhdGlvbi94bWwiLCAidGV4dC94bWwiLCAiKi8qIn0pCisgICAgQFNpbmdsZXRvbgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgU2F4U291cmNlUmVhZGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlSZWFkZXI8U0FYU291cmNlPiB7CisgICAgICAgIC8vIERlbGF5IGNvbnN0cnVjdGlvbiBvZiBmYWN0b3J5CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxTQVhQYXJzZXJGYWN0b3J5PiBzcGY7CisKKyAgICAgICAgcHVibGljIFNheFNvdXJjZVJlYWRlcihAQ29udGV4dCBQcm92aWRlcjxTQVhQYXJzZXJGYWN0b3J5PiBzcGYpIHsKKyAgICAgICAgICAgIHRoaXMuc3BmID0gc3BmOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoQ2xhc3M8Pz4gdCwgVHlwZSBndCwgQW5ub3RhdGlvbltdIGFzLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gU0FYU291cmNlLmNsYXNzID09IHQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFNBWFNvdXJjZSByZWFkRnJvbSgKKyAgICAgICAgICAgICAgICBDbGFzczxTQVhTb3VyY2U+IHQsCisgICAgICAgICAgICAgICAgVHlwZSBndCwKKyAgICAgICAgICAgICAgICBBbm5vdGF0aW9uW10gYXMsCisgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNBWFNvdXJjZShzcGYuZ2V0KCkubmV3U0FYUGFyc2VyKCkuZ2V0WE1MUmVhZGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW5wdXRTb3VyY2UoZW50aXR5U3RyZWFtKSk7CisgICAgICAgICAgICB9IGNhdGNoIChTQVhQYXJzZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKGV4KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbihleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlciBmb3IgbWFyc2hhbGxpbmcvdW4tbWFyc2hhbGxpbmcge0BsaW5rIERPTVNvdXJjZX0gaW5zdGFuY2VzLgorICAgICAqLworICAgIEBQcm9kdWNlcyh7ImFwcGxpY2F0aW9uL3htbCIsICJ0ZXh0L3htbCIsICIqLyoifSkKKyAgICBAQ29uc3VtZXMoeyJhcHBsaWNhdGlvbi94bWwiLCAidGV4dC94bWwiLCAiKi8qIn0pCisgICAgQFNpbmdsZXRvbgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRG9tU291cmNlUmVhZGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlSZWFkZXI8RE9NU291cmNlPiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxEb2N1bWVudEJ1aWxkZXJGYWN0b3J5PiBkYmY7CisKKyAgICAgICAgcHVibGljIERvbVNvdXJjZVJlYWRlcihAQ29udGV4dCBQcm92aWRlcjxEb2N1bWVudEJ1aWxkZXJGYWN0b3J5PiBkYmYpIHsKKyAgICAgICAgICAgIHRoaXMuZGJmID0gZGJmOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoQ2xhc3M8Pz4gdCwgVHlwZSBndCwgQW5ub3RhdGlvbltdIGFzLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gRE9NU291cmNlLmNsYXNzID09IHQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIERPTVNvdXJjZSByZWFkRnJvbSgKKyAgICAgICAgICAgICAgICBDbGFzczxET01Tb3VyY2U+IHQsCisgICAgICAgICAgICAgICAgVHlwZSBndCwKKyAgICAgICAgICAgICAgICBBbm5vdGF0aW9uW10gYXMsCisgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBEb2N1bWVudCBkID0gZGJmLmdldCgpLm5ld0RvY3VtZW50QnVpbGRlcigpLnBhcnNlKGVudGl0eVN0cmVhbSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBET01Tb3VyY2UoZCk7CisgICAgICAgICAgICB9IGNhdGNoIChTQVhQYXJzZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKGV4KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbihleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlciBmb3IgbWFyc2hhbGluZyB7QGxpbmsgU291cmNlfSBpbnN0YW5jZXMuCisgICAgICovCisgICAgQFByb2R1Y2VzKHsiYXBwbGljYXRpb24veG1sIiwgInRleHQveG1sIiwgIiovKiJ9KQorICAgIEBDb25zdW1lcyh7ImFwcGxpY2F0aW9uL3htbCIsICJ0ZXh0L3htbCIsICIqLyoifSkKKyAgICBAU2luZ2xldG9uCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBTb3VyY2VXcml0ZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVdyaXRlcjxTb3VyY2U+IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFNBWFBhcnNlckZhY3Rvcnk+IHNheFBhcnNlckZhY3Rvcnk7CisgICAgICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8VHJhbnNmb3JtZXJGYWN0b3J5PiB0cmFuc2Zvcm1lckZhY3Rvcnk7CisKKyAgICAgICAgcHVibGljIFNvdXJjZVdyaXRlcihAQ29udGV4dCBQcm92aWRlcjxTQVhQYXJzZXJGYWN0b3J5PiBzcGYsCisgICAgICAgICAgICAgICAgQENvbnRleHQgUHJvdmlkZXI8VHJhbnNmb3JtZXJGYWN0b3J5PiB0ZikgeworICAgICAgICAgICAgdGhpcy5zYXhQYXJzZXJGYWN0b3J5ID0gc3BmOworICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1lckZhY3RvcnkgPSB0ZjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShDbGFzczw/PiB0LCBUeXBlIGd0LCBBbm5vdGF0aW9uW10gYXMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBTb3VyY2UuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKFNvdXJjZSBvLCBDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKFNvdXJjZSBzb3VyY2UsIENsYXNzPD8+IHQsIFR5cGUgZ3QsIEFubm90YXRpb25bXSBhcywgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFN0cmVhbVNvdXJjZSkgeworICAgICAgICAgICAgICAgICAgICBTdHJlYW1Tb3VyY2Ugc3RyZWFtID0gKFN0cmVhbVNvdXJjZSkgc291cmNlOworICAgICAgICAgICAgICAgICAgICBJbnB1dFNvdXJjZSBpbnB1dFN0cmVhbSA9IG5ldyBJbnB1dFNvdXJjZShzdHJlYW0uZ2V0SW5wdXRTdHJlYW0oKSk7CisgICAgICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtLnNldENoYXJhY3RlclN0cmVhbShpbnB1dFN0cmVhbS5nZXRDaGFyYWN0ZXJTdHJlYW0oKSk7CisgICAgICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtLnNldFB1YmxpY0lkKHN0cmVhbS5nZXRQdWJsaWNJZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0uc2V0U3lzdGVtSWQoc291cmNlLmdldFN5c3RlbUlkKCkpOworICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPSBuZXcgU0FYU291cmNlKHNheFBhcnNlckZhY3RvcnkuZ2V0KCkubmV3U0FYUGFyc2VyKCkuZ2V0WE1MUmVhZGVyKCksIGlucHV0U3RyZWFtKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBTdHJlYW1SZXN1bHQgc3IgPSBuZXcgU3RyZWFtUmVzdWx0KGVudGl0eVN0cmVhbSk7CisgICAgICAgICAgICAgICAgdHJhbnNmb3JtZXJGYWN0b3J5LmdldCgpLm5ld1RyYW5zZm9ybWVyKCkudHJhbnNmb3JtKHNvdXJjZSwgc3IpOworCisgICAgICAgICAgICB9IGNhdGNoIChTQVhFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbihleCk7CisgICAgICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24oZXgpOworICAgICAgICAgICAgfSBjYXRjaCAoVHJhbnNmb3JtZXJFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbihleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvU3RhdHVzZXMuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9TdGF0dXNlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3Mjg2MWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvU3RhdHVzZXMuamF2YQpAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlLlN0YXR1cy5GYW1pbHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZS5TdGF0dXNUeXBlOworCisvKioKKyAqIEZhY3RvcnkgZm9yIHByb2R1Y2luZyBjdXN0b20gSkFYLVJTIHtAbGluayBTdGF0dXNUeXBlIHJlc3BvbnNlIHN0YXR1cyB0eXBlfQorICogaW5zdGFuY2VzLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFN0YXR1c2VzIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFN0YXR1c0ltcGwgaW1wbGVtZW50cyBTdGF0dXNUeXBlIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBjb2RlOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyByZWFzb247CisgICAgICAgIHByaXZhdGUgZmluYWwgRmFtaWx5IGZhbWlseTsKKworICAgICAgICBwcml2YXRlIFN0YXR1c0ltcGwoaW50IGNvZGUsIFN0cmluZyByZWFzb24pIHsKKyAgICAgICAgICAgIHRoaXMuY29kZSA9IGNvZGU7CisgICAgICAgICAgICB0aGlzLnJlYXNvbiA9IHJlYXNvbjsKKyAgICAgICAgICAgIHRoaXMuZmFtaWx5ID0gRmFtaWx5LmZhbWlseU9mKGNvZGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0U3RhdHVzQ29kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBjb2RlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVhc29uUGhyYXNlKCkgeworICAgICAgICAgICAgcmV0dXJuIHJlYXNvbjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIHJlYXNvbjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRmFtaWx5IGdldEZhbWlseSgpIHsKKyAgICAgICAgICAgIHJldHVybiBmYW1pbHk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoIlJlZHVuZGFudElmU3RhdGVtZW50IikKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvKSB7CisgICAgICAgICAgICBpZiAodGhpcyA9PSBvKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgU3RhdHVzVHlwZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIFN0YXR1c1R5cGUgc3RhdHVzID0gKFN0YXR1c1R5cGUpIG87CisKKyAgICAgICAgICAgIGlmIChjb2RlICE9IHN0YXR1cy5nZXRTdGF0dXNDb2RlKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmFtaWx5ICE9IHN0YXR1cy5nZXRGYW1pbHkoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZWFzb24gIT0gbnVsbCA/ICFyZWFzb24uZXF1YWxzKHN0YXR1cy5nZXRSZWFzb25QaHJhc2UoKSkgOiBzdGF0dXMuZ2V0UmVhc29uUGhyYXNlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIGludCByZXN1bHQgPSBjb2RlOworICAgICAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyAocmVhc29uICE9IG51bGwgPyByZWFzb24uaGFzaENvZGUoKSA6IDApOworICAgICAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyBmYW1pbHkuaGFzaENvZGUoKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgc3RhdHVzIHR5cGUgaW5zdGFuY2UuCisgICAgICogPHA+CisgICAgICogRm9yIHN0YW5kYXJkIHN0YXR1cyBjb2RlcyBsaXN0ZWQgaW4ge0BsaW5rIGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2UuU3RhdHVzfSBlbnVtLCB0aGUgZGVmYXVsdCByZWFzb24gcGhyYXNlCisgICAgICogaXMgdXNlZC4gRm9yIGFueSBvdGhlciBzdGF0dXMgY29kZSBhbiBlbXB0eSBzdHJpbmcgaXMgdXNlZCBhcyBhIHJlYXNvbiBwaHJhc2UuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGNvZGUgcmVzcG9uc2Ugc3RhdHVzIGNvZGUuCisgICAgICogQHJldHVybiBuZXcgc3RhdHVzIHR5cGUgaW5zdGFuY2UgcmVwcmVzZW50aW5nIGEgZ2l2ZW4gcmVzcG9uc2Ugc3RhdHVzIGNvZGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdGF0dXNUeXBlIGZyb20oaW50IGNvZGUpIHsKKyAgICAgICAgU3RhdHVzVHlwZSByZXN1bHQgPSBSZXNwb25zZS5TdGF0dXMuZnJvbVN0YXR1c0NvZGUoY29kZSk7CisgICAgICAgIHJldHVybiAocmVzdWx0ICE9IG51bGwpID8gcmVzdWx0IDogbmV3IFN0YXR1c0ltcGwoY29kZSwgIiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBzdGF0dXMgdHlwZSBpbnN0YW5jZSB3aXRoIGEgY3VzdG9tIHJlYXNvbiBwaHJhc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29kZSAgIHJlc3BvbnNlIHN0YXR1cyBjb2RlLgorICAgICAqIEBwYXJhbSByZWFzb24gY3VzdG9tIHJlc3BvbnNlIHN0YXR1cyByZWFzb24gcGhyYXNlLgorICAgICAqIEByZXR1cm4gbmV3IHN0YXR1cyB0eXBlIGluc3RhbmNlIHJlcHJlc2VudGluZyBhIGdpdmVuIHJlc3BvbnNlIHN0YXR1cyBjb2RlIGFuZCBjdXN0b20gcmVhc29uIHBocmFzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0YXR1c1R5cGUgZnJvbShpbnQgY29kZSwgU3RyaW5nIHJlYXNvbikgeworICAgICAgICByZXR1cm4gbmV3IFN0YXR1c0ltcGwoY29kZSwgcmVhc29uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgc3RhdHVzIHR5cGUgaW5zdGFuY2Ugd2l0aCBhIGN1c3RvbSByZWFzb24gcGhyYXNlLgorICAgICAqCisgICAgICogQHBhcmFtIHN0YXR1cyByZXNwb25zZSBzdGF0dXMgdHlwZS4KKyAgICAgKiBAcGFyYW0gcmVhc29uIGN1c3RvbSByZXNwb25zZSBzdGF0dXMgcmVhc29uIHBocmFzZS4KKyAgICAgKiBAcmV0dXJuIG5ldyBzdGF0dXMgdHlwZSBpbnN0YW5jZSByZXByZXNlbnRpbmcgYSBnaXZlbiByZXNwb25zZSBzdGF0dXMgY29kZSBhbmQgY3VzdG9tIHJlYXNvbiBwaHJhc2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdGF0dXNUeXBlIGZyb20oU3RhdHVzVHlwZSBzdGF0dXMsIFN0cmluZyByZWFzb24pIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdGF0dXNJbXBsKHN0YXR1cy5nZXRTdGF0dXNDb2RlKCksIHJlYXNvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJldmVudHMgaW5zdGFudGlhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0YXR1c2VzKCkgeworICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIkluc3RhbnRpYXRpb24gbm90IGFsbG93ZWQuIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL1N0cmVhbWluZ091dHB1dFByb3ZpZGVyLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvU3RyZWFtaW5nT3V0cHV0UHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDU2NTA2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL1N0cmVhbWluZ091dHB1dFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuU3RyZWFtaW5nT3V0cHV0OworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKKy8qKgorICogTWVzc2FnZSBib2R5IHdyaXRlciB0aGF0IHN1cHBvcnRzIHtAbGluayBTdHJlYW1pbmdPdXRwdXQgc3RyZWFtaW5nIG91dHB1dH0gbWFyc2hhbGxpbmcuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitAUHJvZHVjZXMoeyJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLCAiKi8qIn0pCitAU2luZ2xldG9uCitwdWJsaWMgZmluYWwgY2xhc3MgU3RyZWFtaW5nT3V0cHV0UHJvdmlkZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVdyaXRlcjxTdHJlYW1pbmdPdXRwdXQ+IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKENsYXNzPD8+IHQsIFR5cGUgZ3QsIEFubm90YXRpb25bXSBhcywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICByZXR1cm4gU3RyZWFtaW5nT3V0cHV0LmNsYXNzLmlzQXNzaWduYWJsZUZyb20odCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShTdHJlYW1pbmdPdXRwdXQgbywgQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKFN0cmVhbWluZ091dHB1dCBvLCBDbGFzczw/PiB0LCBUeXBlIGd0LCBBbm5vdGF0aW9uW10gYXMsCisgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gZW50aXR5KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBvLndyaXRlKGVudGl0eSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL1N0cmluZ0J1aWxkZXJVdGlscy5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL1N0cmluZ0J1aWxkZXJVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZDZhNjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvU3RyaW5nQnVpbGRlclV0aWxzLmphdmEKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbDsKKworLyoqCisgKiBJbnRlcm5hbCB7QGxpbmsgU3RyaW5nQnVpbGRlciBzdHJpbmcgYnVpbGRlcn0gdXRpbGl0aWVzIGZvciBidWlsZGluZyBIVFRQIGhlYWRlcgorICogdmFsdWVzLgorICoKKyAqIEBhdXRob3IgTWFyYyBIYWRsZXkKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIFN0cmluZ0J1aWxkZXJVdGlscyB7CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgYSBuZXcgdmFsdWUgdG8gdGhlIHN0cmluZyBidWlsZGVyLgorICAgICAqCisgICAgICogSWYgdGhlIHZhbHVlIGNvbnRhaW5zIG5vbi10b2tlbiBjaGFyYWN0ZXJzIChlLmcuIGNvbnRyb2wsIHdoaXRlLXNwYWNlLAorICAgICAqIHF1b3Rlcywgc2VwYXJhdG9ycywgZXRjLiksIHRoZSBhcHBlbmRlZCB2YWx1ZSBpcyBxdW90ZWQgYW5kIGFsbCB0aGUgcXVvdGVzCisgICAgICogaW4gdGhlIHZhbHVlIGFyZSBlc2NhcGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGIgc3RyaW5nIGJ1aWxkZXIgdG8gYmUgdXBkYXRlZC4KKyAgICAgKiBAcGFyYW0gdmFsdWUgdmFsdWUgdG8gYmUgYXBwZW5kZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFwcGVuZFF1b3RlZElmTm9uVG9rZW4oU3RyaW5nQnVpbGRlciBiLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBib29sZWFuIHF1b3RlID0gIUdyYW1tYXJVdGlsLmlzVG9rZW5TdHJpbmcodmFsdWUpOworICAgICAgICBpZiAocXVvdGUpIHsKKyAgICAgICAgICAgIGIuYXBwZW5kKCciJyk7CisgICAgICAgIH0KKyAgICAgICAgYXBwZW5kRXNjYXBpbmdRdW90ZXMoYiwgdmFsdWUpOworICAgICAgICBpZiAocXVvdGUpIHsKKyAgICAgICAgICAgIGIuYXBwZW5kKCciJyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgYSBuZXcgdmFsdWUgdG8gdGhlIHN0cmluZyBidWlsZGVyLgorICAgICAqCisgICAgICogSWYgdGhlIHZhbHVlIGNvbnRhaW5zIHdoaXRlLXNwYWNlIGNoYXJhY3RlcnMsIHRoZSBhcHBlbmRlZAorICAgICAqIHZhbHVlIGlzIHF1b3RlZCBhbmQgYWxsIHRoZSBxdW90ZXMgaW4gdGhlIHZhbHVlIGFyZSBlc2NhcGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGIgc3RyaW5nIGJ1aWxkZXIgdG8gYmUgdXBkYXRlZC4KKyAgICAgKiBAcGFyYW0gdmFsdWUgdmFsdWUgdG8gYmUgYXBwZW5kZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFwcGVuZFF1b3RlZElmV2hpdGVzcGFjZShTdHJpbmdCdWlsZGVyIGIsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gcXVvdGUgPSBHcmFtbWFyVXRpbC5jb250YWluc1doaXRlU3BhY2UodmFsdWUpOworICAgICAgICBpZiAocXVvdGUpIHsKKyAgICAgICAgICAgIGIuYXBwZW5kKCciJyk7CisgICAgICAgIH0KKyAgICAgICAgYXBwZW5kRXNjYXBpbmdRdW90ZXMoYiwgdmFsdWUpOworICAgICAgICBpZiAocXVvdGUpIHsKKyAgICAgICAgICAgIGIuYXBwZW5kKCciJyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBcHBlbmQgYSBuZXcgcXVvdGVkIHZhbHVlIHRvIHRoZSBzdHJpbmcgYnVpbGRlci4KKyAgICAgKgorICAgICAqIFRoZSBhcHBlbmRlZCB2YWx1ZSBpcyBxdW90ZWQgYW5kIGFsbCB0aGUgcXVvdGVzIGluIHRoZSB2YWx1ZSBhcmUgZXNjYXBlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiIHN0cmluZyBidWlsZGVyIHRvIGJlIHVwZGF0ZWQuCisgICAgICogQHBhcmFtIHZhbHVlIHZhbHVlIHRvIGJlIGFwcGVuZGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhcHBlbmRRdW90ZWQoU3RyaW5nQnVpbGRlciBiLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgYi5hcHBlbmQoJyInKTsKKyAgICAgICAgYXBwZW5kRXNjYXBpbmdRdW90ZXMoYiwgdmFsdWUpOworICAgICAgICBiLmFwcGVuZCgnIicpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFwcGVuZCBhIG5ldyB2YWx1ZSB0byB0aGUgc3RyaW5nIGJ1aWxkZXIuCisgICAgICoKKyAgICAgKiBBbGwgdGhlIHF1b3RlcyBpbiB0aGUgdmFsdWUgYXJlIGVzY2FwZWQgYmVmb3JlIGFwcGVuZGluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiIHN0cmluZyBidWlsZGVyIHRvIGJlIHVwZGF0ZWQuCisgICAgICogQHBhcmFtIHZhbHVlIHZhbHVlIHRvIGJlIGFwcGVuZGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhcHBlbmRFc2NhcGluZ1F1b3RlcyhTdHJpbmdCdWlsZGVyIGIsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgIGNoYXIgYyA9IHZhbHVlLmNoYXJBdChpKTsKKyAgICAgICAgICAgIGlmIChjID09ICciJykgeworICAgICAgICAgICAgICAgIGIuYXBwZW5kKCdcXCcpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYi5hcHBlbmQoYyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmV2ZW50cyBpbnN0YW50aWF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nQnVpbGRlclV0aWxzKCkgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9TdHJpbmdIZWFkZXJQcm92aWRlci5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL1N0cmluZ0hlYWRlclByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM3NTY5MwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9TdHJpbmdIZWFkZXJQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbDsKKworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5IZWFkZXJEZWxlZ2F0ZVByb3ZpZGVyOworCitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuVXRpbHMudGhyb3dJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25JZk51bGw7CisKKy8qKgorICoge0Bjb2RlIFN0cmluZ30ge0BsaW5rIEhlYWRlckRlbGVnYXRlUHJvdmlkZXIgaGVhZGVyIGRlbGVnYXRlIHByb3ZpZGVyfS4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitAU2luZ2xldG9uCitwdWJsaWMgY2xhc3MgU3RyaW5nSGVhZGVyUHJvdmlkZXIgaW1wbGVtZW50cyBIZWFkZXJEZWxlZ2F0ZVByb3ZpZGVyPFN0cmluZz4geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHMoQ2xhc3M8Pz4gdHlwZSkgeworICAgICAgICByZXR1cm4gdHlwZSA9PSBTdHJpbmcuY2xhc3M7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZyhTdHJpbmcgaGVhZGVyKSB7CisKKyAgICAgICAgdGhyb3dJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25JZk51bGwoaGVhZGVyLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5TVFJJTkdfSVNfTlVMTCgpKTsKKworICAgICAgICByZXR1cm4gaGVhZGVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZnJvbVN0cmluZyhTdHJpbmcgaGVhZGVyKSB7CisKKyAgICAgICAgdGhyb3dJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25JZk51bGwoaGVhZGVyLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5TVFJJTkdfSVNfTlVMTCgpKTsKKworICAgICAgICByZXR1cm4gaGVhZGVyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9TdHJpbmdNZXNzYWdlUHJvdmlkZXIuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9TdHJpbmdNZXNzYWdlUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWNkNTQyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL1N0cmluZ01lc3NhZ2VQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworLyoqCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitAUHJvZHVjZXMoeyJ0ZXh0L3BsYWluIiwgIiovKiJ9KQorQENvbnN1bWVzKHsidGV4dC9wbGFpbiIsICIqLyoifSkKK0BTaW5nbGV0b24KK2ZpbmFsIGNsYXNzIFN0cmluZ01lc3NhZ2VQcm92aWRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVJlYWRlcldyaXRlclByb3ZpZGVyPFN0cmluZz4geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uIGFubm90YXRpb25zW10sIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHR5cGUgPT0gU3RyaW5nLmNsYXNzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgcmVhZEZyb20oCisgICAgICAgICAgICBDbGFzczxTdHJpbmc+IHR5cGUsCisgICAgICAgICAgICBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uc1tdLAorICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBodHRwSGVhZGVycywKKyAgICAgICAgICAgIElucHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHJlYWRGcm9tQXNTdHJpbmcoZW50aXR5U3RyZWFtLCBtZWRpYVR5cGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb24gYW5ub3RhdGlvbnNbXSwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICByZXR1cm4gdHlwZSA9PSBTdHJpbmcuY2xhc3M7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShTdHJpbmcgcywgQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiBzLmxlbmd0aCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oCisgICAgICAgICAgICBTdHJpbmcgdCwKKyAgICAgICAgICAgIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uc1tdLAorICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHdyaXRlVG9Bc1N0cmluZyh0LCBlbnRpdHlTdHJlYW0sIG1lZGlhVHlwZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL1Rva2VuLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvVG9rZW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWUyMTBmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL1Rva2VuLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsOworCitpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOworCisvKioKKyAqIEEgdG9rZW4uCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFRva2VuIHsKKworICAgIHByb3RlY3RlZCBTdHJpbmcgdG9rZW47CisKKyAgICBwcm90ZWN0ZWQgVG9rZW4oKSB7CisgICAgfQorCisgICAgcHVibGljIFRva2VuKFN0cmluZyBoZWFkZXIpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMoSHR0cEhlYWRlclJlYWRlci5uZXdJbnN0YW5jZShoZWFkZXIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVG9rZW4oSHR0cEhlYWRlclJlYWRlciByZWFkZXIpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFNraXAgYW55IHdoaXRlIHNwYWNlCisgICAgICAgIHJlYWRlci5oYXNOZXh0KCk7CisKKyAgICAgICAgdG9rZW4gPSByZWFkZXIubmV4dFRva2VuKCkudG9TdHJpbmcoKTsKKworICAgICAgICBpZiAocmVhZGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCJJbnZhbGlkIHRva2VuIiwgcmVhZGVyLmdldEluZGV4KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUb2tlbigpIHsKKyAgICAgICAgcmV0dXJuIHRva2VuOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzQ29tcGF0aWJsZShTdHJpbmcgdG9rZW4pIHsKKyAgICAgICAgaWYgKHRoaXMudG9rZW4uZXF1YWxzKCIqIikpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRoaXMudG9rZW4uZXF1YWxzKHRva2VuKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvVHJhY2luZ0F3YXJlUHJvcGVydGllc0RlbGVnYXRlLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvVHJhY2luZ0F3YXJlUHJvcGVydGllc0RlbGVnYXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgyNDEyMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9UcmFjaW5nQXdhcmVQcm9wZXJ0aWVzRGVsZWdhdGUuamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLlByb3BlcnRpZXNEZWxlZ2F0ZTsKKworLyoqCisgKiBEZWxlZ2F0aW5nIHByb3BlcnRpZXMgZGVsZWdhdGUgYmFja2VkIGJ5IGFub3RoZXIge0Bjb2RlIFByb3BlcnRpZXNEZWxlZ2F0ZX0gd2l0aCBpbXBsZW1lbnRlZCAiY2FjaGUiIG9yIGRpcmVjdCByZWZlcmVuY2UgdG8KKyAqIHRyYWNpbmcgc3VwcG9ydCByZWxhdGVkIGNsYXNzZXMgKGUuZy4ge0Bjb2RlIFRyYWNpbmdMb2dnZXJ9KSB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIG9mIGxvb2t1cCB0cmFjaW5nIGNvbnRleHQgaW5zdGFuY2UuCisgKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqIEBzaW5jZSAyLjMKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFRyYWNpbmdBd2FyZVByb3BlcnRpZXNEZWxlZ2F0ZSBpbXBsZW1lbnRzIFByb3BlcnRpZXNEZWxlZ2F0ZSB7CisKKyAgICBwcml2YXRlIGZpbmFsIFByb3BlcnRpZXNEZWxlZ2F0ZSBwcm9wZXJ0aWVzRGVsZWdhdGU7CisKKyAgICBwcml2YXRlIFRyYWNpbmdMb2dnZXIgdHJhY2luZ0xvZ2dlcjsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgdHJhY2luZyBhd2FyZSBwcm9wZXJ0aWVzIGRlbGVnYXRlIHdyYXBwZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvcGVydGllc0RlbGVnYXRlIHdyYXBwZWQgZGVsZWdhdGUuCisgICAgICovCisgICAgcHVibGljIFRyYWNpbmdBd2FyZVByb3BlcnRpZXNEZWxlZ2F0ZShQcm9wZXJ0aWVzRGVsZWdhdGUgcHJvcGVydGllc0RlbGVnYXRlKSB7CisgICAgICAgIHRoaXMucHJvcGVydGllc0RlbGVnYXRlID0gcHJvcGVydGllc0RlbGVnYXRlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5KFN0cmluZyBuYW1lKSB7CisgICAgICAgIGlmIChUcmFjaW5nTG9nZ2VyLlBST1BFUlRZX05BTUUuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICB0cmFjaW5nTG9nZ2VyID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBwcm9wZXJ0aWVzRGVsZWdhdGUucmVtb3ZlUHJvcGVydHkobmFtZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIG5hbWUsIE9iamVjdCBvYmplY3QpIHsKKyAgICAgICAgaWYgKFRyYWNpbmdMb2dnZXIuUFJPUEVSVFlfTkFNRS5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgIHRyYWNpbmdMb2dnZXIgPSAoVHJhY2luZ0xvZ2dlcikgb2JqZWN0OworICAgICAgICB9CisgICAgICAgIHByb3BlcnRpZXNEZWxlZ2F0ZS5zZXRQcm9wZXJ0eShuYW1lLCBvYmplY3QpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgaWYgKHRyYWNpbmdMb2dnZXIgIT0gbnVsbCAmJiBUcmFjaW5nTG9nZ2VyLlBST1BFUlRZX05BTUUuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJhY2luZ0xvZ2dlcjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcHJvcGVydGllc0RlbGVnYXRlLmdldFByb3BlcnR5KG5hbWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0UHJvcGVydHlOYW1lcygpIHsKKyAgICAgICAgcmV0dXJuIHByb3BlcnRpZXNEZWxlZ2F0ZS5nZXRQcm9wZXJ0eU5hbWVzKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL1RyYWNpbmdJbmZvLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvVHJhY2luZ0luZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzZjMzBhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL1RyYWNpbmdJbmZvLmphdmEKQEAgLTAsMCArMSwxNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQ29sbGVjdHMgdHJhY2luZyBtZXNzYWdlcyBmb3IgYSByZXF1ZXN0LgorICoKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKiBAc2luY2UgMi4zCisgKi8KK2ZpbmFsIGNsYXNzIFRyYWNpbmdJbmZvIHsKKworICAgIHByaXZhdGUgZmluYWwgTGlzdDxNZXNzYWdlPiBtZXNzYWdlTGlzdCA9IG5ldyBBcnJheUxpc3Q8TWVzc2FnZT4oKTsKKworICAgIC8qKgorICAgICAqIEZvcm1hdCB0aW1lIGR1cmF0aW9uIGluIG1pbGxpcyB3aXRoIGFjY3VyYXRlIHRvIDIgZGVjaW1hbCBwbGFjZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZHVyYXRpb24gdGltZSBkdXJhdGlvbiBpbiBuYW5vcworICAgICAqIEByZXR1cm4gRm9ybWF0dGVkIGR1cmF0aW9uIGluIG1pbGxpcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JtYXREdXJhdGlvbihmaW5hbCBsb25nIGR1cmF0aW9uKSB7CisgICAgICAgIGlmIChkdXJhdGlvbiA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gIiAtLS0tIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlNS4yZiIsIChkdXJhdGlvbiAvIDEwMDAwMDAuMCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRm9ybWF0IHRpbWUgZHVyYXRpb24gaW4gbWlsbGlzIHdpdGggYWNjdXJhdGUgdG8gMiBkZWNpbWFsIHBsYWNlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcm9tVGltZXN0YW1wIHN0YXJ0IG9mIHRpbWUgaW50ZXJ2YWwgaW4gbmFub3MKKyAgICAgKiBAcGFyYW0gdG9UaW1lc3RhbXAgICBlbmQgb2YgdGltZSBpbnRlcnZhbCBpbiBuYW5vcworICAgICAqIEByZXR1cm4gRm9ybWF0dGVkIGR1cmF0aW9uIGluIG1pbGxpcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBmb3JtYXREdXJhdGlvbihmaW5hbCBsb25nIGZyb21UaW1lc3RhbXAsIGZpbmFsIGxvbmcgdG9UaW1lc3RhbXApIHsKKyAgICAgICAgcmV0dXJuIGZvcm1hdER1cmF0aW9uKHRvVGltZXN0YW1wIC0gZnJvbVRpbWVzdGFtcCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRm9ybWF0IHtAY29kZSB2YWx1ZX0gZnJvbSB7QGNvZGUgdG9wfSB2YWx1ZSBpbiBwZXJjZW50IHdpdGggYWNjdXJhdGUgdG8gMiBkZWNpbWFsIHBsYWNlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZSBwYXJ0IHZhbHVlIGFjY29yZGluZyB0byB0b3AKKyAgICAgKiBAcGFyYW0gdG9wICAgMTAwJSB2YWx1ZQorICAgICAqIEByZXR1cm4gRm9ybWF0dGVkIHZhbHVlIGluIHBlcmNlbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZm9ybWF0UGVyY2VudChmaW5hbCBsb25nIHZhbHVlLCBmaW5hbCBsb25nIHRvcCkgeworICAgICAgICBpZiAodmFsdWUgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuICIgIC0tLS0iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiU2LjJmIiwgMTAwLjAgKiB2YWx1ZSAvIHRvcCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFsbCBjb2xsZWN0ZWQgbWVzc2FnZXMgZW5oYW5jZWQgYnkgdGltZSBkdXJhdGlvbiBkYXRhLgorICAgICAqCisgICAgICogQHJldHVybiBhbGwgZm9ybWF0dGVkIG1lc3NhZ2VzCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldE1lc3NhZ2VzKCkgeworICAgICAgICAvLyBGb3JtYXQ6IEV2ZW50Q2F0ZWdvcnkgW2R1cmF0aW9uIC8gc2luY2VSZXF1ZXN0VGltZSB8IGR1cmF0aW9uL3JlcXVlc3RUaW1lICUgXQorICAgICAgICAvLyBlLmcuOiAgIFJJIFsgMy44OCAvIDguOTMgbXMgfCAxLjM3ICVdIG1lc3NhZ2UgdGV4dAorCisgICAgICAgIGZpbmFsIGxvbmcgZnJvbVRpbWVzdGFtcCA9IG1lc3NhZ2VMaXN0LmdldCgwKS5nZXRUaW1lc3RhbXAoKSAtIG1lc3NhZ2VMaXN0LmdldCgwKS5nZXREdXJhdGlvbigpOworICAgICAgICBmaW5hbCBsb25nIHRvVGltZXN0YW1wID0gbWVzc2FnZUxpc3QuZ2V0KG1lc3NhZ2VMaXN0LnNpemUoKSAtIDEpLmdldFRpbWVzdGFtcCgpOworCisgICAgICAgIGZpbmFsIFN0cmluZ1tdIG1lc3NhZ2VzID0gbmV3IFN0cmluZ1ttZXNzYWdlTGlzdC5zaXplKCldOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2UgbWVzc2FnZSA9IG1lc3NhZ2VMaXN0LmdldChpKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgdGV4dFNCID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIC8vIGV2ZW50CisgICAgICAgICAgICB0ZXh0U0IuYXBwZW5kKFN0cmluZy5mb3JtYXQoIiUtMTFzICIsIG1lc3NhZ2UuZ2V0RXZlbnQoKS5jYXRlZ29yeSgpKSk7CisgICAgICAgICAgICAvLyBkdXJhdGlvbgorICAgICAgICAgICAgdGV4dFNCLmFwcGVuZCgnWycpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoZm9ybWF0RHVyYXRpb24obWVzc2FnZS5nZXREdXJhdGlvbigpKSkKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiIC8gIikKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChmb3JtYXREdXJhdGlvbihmcm9tVGltZXN0YW1wLCBtZXNzYWdlLmdldFRpbWVzdGFtcCgpKSkKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiIG1zIHwiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGZvcm1hdFBlcmNlbnQobWVzc2FnZS5nZXREdXJhdGlvbigpLCB0b1RpbWVzdGFtcCAtIGZyb21UaW1lc3RhbXApKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIgJV0gIik7CisgICAgICAgICAgICAvLyB0ZXh0CisgICAgICAgICAgICB0ZXh0U0IuYXBwZW5kKG1lc3NhZ2UudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBtZXNzYWdlc1tpXSA9IHRleHRTQi50b1N0cmluZygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtZXNzYWdlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgb3RoZXIgdHJhY2luZyBtZXNzYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2UgdHJhY2luZyBtZXNzYWdlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZE1lc3NhZ2UoZmluYWwgTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgIG1lc3NhZ2VMaXN0LmFkZChtZXNzYWdlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHRyYWNlIG1lc3NhZ2UuCisgICAgICogSXQgaW1wbGVtZW50cyBtZXNzYWdlIGZvcm1hdHRpbmcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNZXNzYWdlIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogRXZlbnQgdHlwZS4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgZmluYWwgVHJhY2luZ0xvZ2dlci5FdmVudCBldmVudDsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEluIG5hbm9zLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIGR1cmF0aW9uOworICAgICAgICAvKioKKyAgICAgICAgICogSW4gbmFub3MuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGZpbmFsIGxvbmcgdGltZXN0YW1wOworICAgICAgICAvKioKKyAgICAgICAgICogQWxyZWFkeSBmb3JtYXR0ZWQgdGV4dC4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHRleHQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhIG5ldyB0cmFjZSBtZXNzYWdlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZXZlbnQgdHJhY2UgZXZlbnQuCisgICAgICAgICAqIEBwYXJhbSBkdXJhdGlvbiBldmVudCBkdXJhdGlvbi4KKyAgICAgICAgICogQHBhcmFtIGFyZ3MgbWVzc2FnZSBhcmd1bWVudHMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTWVzc2FnZShmaW5hbCBUcmFjaW5nTG9nZ2VyLkV2ZW50IGV2ZW50LCBmaW5hbCBsb25nIGR1cmF0aW9uLCBmaW5hbCBTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgICAgICB0aGlzLmV2ZW50ID0gZXZlbnQ7CisgICAgICAgICAgICB0aGlzLmR1cmF0aW9uID0gZHVyYXRpb247CisKKyAgICAgICAgICAgIHRoaXMudGltZXN0YW1wID0gU3lzdGVtLm5hbm9UaW1lKCk7CisgICAgICAgICAgICBpZiAoZXZlbnQubWVzc2FnZUZvcm1hdCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnRleHQgPSBTdHJpbmcuZm9ybWF0KGV2ZW50Lm1lc3NhZ2VGb3JtYXQoKSwgKE9iamVjdFtdKSBhcmdzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciB0ZXh0U0IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIGFyZyA6IGFyZ3MpIHsKKyAgICAgICAgICAgICAgICAgICAgdGV4dFNCLmFwcGVuZChhcmcpLmFwcGVuZCgnICcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0aGlzLnRleHQgPSB0ZXh0U0IudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgVHJhY2luZ0xvZ2dlci5FdmVudCBnZXRFdmVudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBldmVudDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgbG9uZyBnZXREdXJhdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBkdXJhdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgbG9uZyBnZXRUaW1lc3RhbXAoKSB7CisgICAgICAgICAgICByZXR1cm4gdGltZXN0YW1wOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gdGV4dDsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL1RyYWNpbmdMb2dnZXIuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9UcmFjaW5nTG9nZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM4NDRjMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9UcmFjaW5nTG9nZ2VyLmphdmEKQEAgLTAsMCArMSw0MTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuUHJvcGVydGllc0RlbGVnYXRlOworCisvKioKKyAqIExvdyBsZXZlbCBUcmFjaW5nIHN1cHBvcnQgQVBJLgorICoKKyAqIFVzZSBvbmUgaW5zdGFuY2UgcGVyIHJlcXVlc3QuCisgKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqIEBzaW5jZSAyLjMKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFRyYWNpbmdMb2dnZXIgeworCisgICAgLyoqCisgICAgICoge0Bjb2RlIFRyYWNpbmdMb2dnZXJ9IGluc3RhbmNlIGlzIHBsYWNlZCBpbiByZXF1ZXN0IGNvbnRleHQgcHJvcGVydGllcyB1bmRlciB0aGlzIG5hbWUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfTkFNRSA9IFRyYWNpbmdMb2dnZXIuY2xhc3MuZ2V0TmFtZSgpOworICAgIC8qKgorICAgICAqIEhUVFAgaGVhZGVyIHByZWZpeC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1RSQUNJTkdfUFJFRklYID0gIlgtSmVyc2V5LVRyYWNpbmctIjsKKyAgICAvKioKKyAgICAgKiBSZXF1ZXN0IGhlYWRlciBuYW1lIHRvIGNoYW5nZSBhcHBsaWNhdGlvbiBkZWZhdWx0IHRyYWNpbmcgbGV2ZWwuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1RIUkVTSE9MRCA9IEhFQURFUl9UUkFDSU5HX1BSRUZJWCArICJUaHJlc2hvbGQiOworICAgIC8qKgorICAgICAqIFJlcXVlc3QgaGVhZGVyIG5hbWUgdG8gc3dpdGNoIG9uIHJlcXVlc3QgdHJhY2luZy4KKyAgICAgKiBNYWtlIHNlbnNlIGluIGNhc2Ugb2YgdHJhY2luZyBzdXBwb3J0IGVuYWJsZWQgYnkgT05fREVNQU5EIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9BQ0NFUFQgPSBIRUFERVJfVFJBQ0lOR19QUkVGSVggKyAiQWNjZXB0IjsKKyAgICAvKioKKyAgICAgKiBSZXF1ZXN0IGhlYWRlciBuYW1lIHRvIHNldCBKREsgbG9nZ2VyIG5hbWUgc3VmZml4IHRvIGlkZW50aWZ5IGEgcmVxdWVzdCBsb2dzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9MT0dHRVIgPSBIRUFERVJfVFJBQ0lOR19QUkVGSVggKyAiTG9nZ2VyIjsKKyAgICAvKioKKyAgICAgKiBSZXNwb25zZSBoZWFkZXIgbmFtZSBmb3JtYXQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9SRVNQT05TRV9GT1JNQVQgPSBIRUFERVJfVFJBQ0lOR19QUkVGSVggKyAiJTAzZCI7CisgICAgLyoqCisgICAgICogRGVmYXVsdCBldmVudCBsZXZlbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIExldmVsIERFRkFVTFRfTEVWRUwgPSBMZXZlbC5UUkFDRTsKKyAgICAvKioKKyAgICAgKiBKREsgbG9nZ2VyIG5hbWUgcHJlZml4LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUUkFDSU5HX0xPR0dFUl9OQU1FX1BSRUZJWCA9ICJvcmcuZ2xhc3NmaXNoLmplcnNleS50cmFjaW5nIjsKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IEpESyBsb2dnZXIgbmFtZSBzdWZmaXguIFRoaXMgY2FuIGJlIG92ZXJ3cml0ZSBieSBoZWFkZXIge0BsaW5rICNIRUFERVJfTE9HR0VSfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9MT0dHRVJfTkFNRV9TVUZGSVggPSAiZ2VuZXJhbCI7CisgICAgLyoqCisgICAgICogRW1wdHkgKG5vLW9wKSB0cmFjaW5nIGxvZ2dlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUcmFjaW5nTG9nZ2VyIEVNUFRZID0gbmV3IFRyYWNpbmdMb2dnZXIoKSB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzTG9nRW5hYmxlZChmaW5hbCBFdmVudCBldmVudCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGxvZyhmaW5hbCBFdmVudCBldmVudCwgZmluYWwgT2JqZWN0Li4uIGFyZ3MpIHsKKyAgICAgICAgICAgIC8vIG5vLW9wCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgbG9nRHVyYXRpb24oZmluYWwgRXZlbnQgZXZlbnQsIGZpbmFsIGxvbmcgZnJvbVRpbWVzdGFtcCwgZmluYWwgT2JqZWN0Li4uIGFyZ3MpIHsKKyAgICAgICAgICAgIC8vIG5vLW9wCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgdGltZXN0YW1wKGZpbmFsIEV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmx1c2goZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGhlYWRlcnMpIHsKKyAgICAgICAgICAgIC8vIG5vLW9wCisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBpbnN0YW5jZSBvZiB7QGNvZGUgVHJhY2luZ0xvZ2dlcn0gYXNzb2NpYXRlZCB3aXRoIGN1cnJlbnQgcmVxdWVzdCBwcm9jZXNzaW5nCisgICAgICogKHtAY29kZSBwcm9wZXJ0aWVzRGVsZWdhdGV9KS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzRGVsZWdhdGUgcmVxdWVzdCBhc3NvY2lhdGVkIHJ1bnRpbWUgcHJvcGVydGllcy4gQ2FuIGJlIHtAY29kZSBudWxsfSBpZiBub3QgcnVubmluZyBvbiBzZXJ2ZXIgc2lkZS4KKyAgICAgKiBAcmV0dXJuIHJldHVybnMgaW5zdGFuY2Ugb2Yge0Bjb2RlIFRyYWNpbmdMb2dnZXJ9IGZyb20ge0Bjb2RlIHByb3BlcnRpZXNEZWxlZ2F0ZX0uIERvZXMgbm90IHJldHVybiB7QGNvZGUgbnVsbH0uCisgICAgICovCisgICAgLy8gVE9ETyBsb29rIGZvciBwbGFjZXMgd2hlcmUgZ2V0SW5zdGFuY2UoUmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0KSB3b3VsZCBtYWtlIHNlbnNlCisgICAgcHVibGljIHN0YXRpYyBUcmFjaW5nTG9nZ2VyIGdldEluc3RhbmNlKGZpbmFsIFByb3BlcnRpZXNEZWxlZ2F0ZSBwcm9wZXJ0aWVzRGVsZWdhdGUpIHsKKyAgICAgICAgaWYgKHByb3BlcnRpZXNEZWxlZ2F0ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAvL25vdCBzZXJ2ZXIgc2lkZQorICAgICAgICAgICAgcmV0dXJuIEVNUFRZOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFRyYWNpbmdMb2dnZXIgdHJhY2luZ0xvZ2dlciA9IChUcmFjaW5nTG9nZ2VyKSBwcm9wZXJ0aWVzRGVsZWdhdGUuZ2V0UHJvcGVydHkoUFJPUEVSVFlfTkFNRSk7CisgICAgICAgIHJldHVybiAodHJhY2luZ0xvZ2dlciAhPSBudWxsKSA/IHRyYWNpbmdMb2dnZXIgOiBFTVBUWTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IFRyYWNpbmcgbG9nZ2VyLgorICAgICAqCisgICAgICogQHBhcmFtIHRocmVzaG9sZCAgICAgICAgdHJhY2luZyBsZXZlbCB0aHJlc2hvbGQuCisgICAgICogQHBhcmFtIGxvZ2dlck5hbWVTdWZmaXggdHJhY2luZyBsb2dnZXIgbmFtZSBzdWZmaXguCisgICAgICogQHJldHVybiBuZXcgdHJhY2luZyBsb2dnZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBUcmFjaW5nTG9nZ2VyIGNyZWF0ZShmaW5hbCBMZXZlbCB0aHJlc2hvbGQsIGZpbmFsIFN0cmluZyBsb2dnZXJOYW1lU3VmZml4KSB7CisgICAgICAgIHJldHVybiBuZXcgVHJhY2luZ0xvZ2dlckltcGwodGhyZXNob2xkLCBsb2dnZXJOYW1lU3VmZml4KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYW4gZW1wdHkgKG5vLW9wKSB0cmFjaW5nIGxvZ2dlciBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gZW1wdHkgdHJhY2luZyBsb2dnZXIgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBUcmFjaW5nTG9nZ2VyIGVtcHR5KCkgeworICAgICAgICByZXR1cm4gRU1QVFk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBpZiBhIHRyYWNpbmcgc3VwcG9ydCBpcyBlbmFibGVkIChhY2NvcmRpbmcgdG8ge0Bjb2RlIHByb3BlcnRpZXNEZWxlZ2F0ZX0gc2V0dGluZykgYW5kCisgICAgICogaWYge0Bjb2RlIGV2ZW50fSBjYW4gYmUgbG9nZ2VkIChhY2NvcmRpbmcgdG8ge0Bjb2RlIGV2ZW50LmxldmVsfSBhbmQgdGhyZXNob2xkIGxldmVsIHNldCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgZXZlbnQgdHlwZSB0byBiZSB0ZXN0ZWQKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB7QGNvZGUgZXZlbnR9IGNhbiBiZSBsb2dnZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0xvZ0VuYWJsZWQoRXZlbnQgZXZlbnQpOworCisgICAgLyoqCisgICAgICogVHJ5IHRvIGxvZyBldmVudCBhY2NvcmRpbmcgdG8gZXZlbnQgbGV2ZWwgYW5kIHJlcXVlc3QgY29udGV4dCB0aHJlc2hvbGQgbGV2ZWwgc2V0dGluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBldmVudCB0eXBlIHRvIGJlIGxvZ2dlZAorICAgICAqIEBwYXJhbSBhcmdzICBtZXNzYWdlIGFyZ3VtZW50cyAoaW4gcmVsYXRpb24gdG8ge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuVHJhY2luZ0xvZ2dlcgorICAgICAqIC5FdmVudCNtZXNzYWdlRm9ybWF0KCl9CisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgbG9nKEV2ZW50IGV2ZW50LCBPYmplY3QuLi4gYXJncyk7CisKKyAgICAvKioKKyAgICAgKiBUcnkgdG8gbG9nIGV2ZW50IGFjY29yZGluZyB0byBldmVudCBsZXZlbCBhbmQgcmVxdWVzdCBjb250ZXh0IHRocmVzaG9sZCBsZXZlbCBzZXR0aW5nLgorICAgICAqCisgICAgICogSWYgbG9nZ2luZyBzdXBwb3J0IGlzIHN3aXRjaGVkIG9uIGZvciBjdXJyZW50IHJlcXVlc3QgYW5kIGV2ZW50IHNldHRpbmcgdGhlIG1ldGhvZCBjb21wdXRlcyBkdXJhdGlvbiBvZiBldmVudCBhbmQgbG9nCisgICAgICogbWVzc2FnZS4gSWYge0Bjb2RlIGZyb21UaW1lc3RhbXB9IGlzIG5vdCBzZXQgKGkuZS4ge0Bjb2RlIC0xfSkgdGhlbiBkdXJhdGlvbiBvZiBldmVudAorICAgICAqIGlzIHtAY29kZSAwfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCAgICAgICAgIGV2ZW50IHR5cGUgdG8gYmUgbG9nZ2VkCisgICAgICogQHBhcmFtIGZyb21UaW1lc3RhbXAgbG9nZ2VkIGV2ZW50IGlzIHJ1bm5pbmcgZnJvbSB0aGUgdGltZXN0YW1wIGluIG5hbm9zLiB7QGNvZGUgLTF9IGluIGNhc2UgZXZlbnQgaGFzIG5vIGR1cmF0aW9uCisgICAgICogQHBhcmFtIGFyZ3MgICAgICAgICAgbWVzc2FnZSBhcmd1bWVudHMgKGluIHJlbGF0aW9uIHRvIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLlRyYWNpbmdMb2dnZXIKKyAgICAgKiAuRXZlbnQjbWVzc2FnZUZvcm1hdCgpfQorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGxvZ0R1cmF0aW9uKEV2ZW50IGV2ZW50LCBsb25nIGZyb21UaW1lc3RhbXAsIE9iamVjdC4uLiBhcmdzKTsKKworICAgIC8qKgorICAgICAqIElmIGxvZ2dpbmcgc3VwcG9ydCBpcyBzd2l0Y2hlZCBvbiBmb3IgY3VycmVudCByZXF1ZXN0IGFuZCBldmVudCBzZXR0aW5nIHRoZSBtZXRob2QgcmV0dXJucyBjdXJyZW50IHRpbWVzdGFtcCBpbiBuYW5vcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBldmVudCB0eXBlIHRvIGJlIGxvZ2dlZAorICAgICAqIEByZXR1cm4gQ3VycmVudCB0aW1lc3RhbXAgaW4gbmFub3Mgb3Ige0Bjb2RlIC0xfSBpZiB0cmFjaW5nIGlzIG5vdCBlbmFibGVkCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IGxvbmcgdGltZXN0YW1wKEV2ZW50IGV2ZW50KTsKKworICAgIC8qKgorICAgICAqIFN0b3JlcyBjb2xsZWN0ZWQgdHJhY2luZyBtZXNzYWdlcyB0byByZXNwb25zZSBIVFRQIGhlYWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBoZWFkZXJzIG1lc3NhZ2UgaGVhZGVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBmbHVzaChNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaGVhZGVycyk7CisKKyAgICAvKioKKyAgICAgKiBSZWFsIGltcGxlbWVudGF0aW9uIG9mIHRyYWNpbmcgbG9nZ2VyLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFRyYWNpbmdMb2dnZXJJbXBsIGV4dGVuZHMgVHJhY2luZ0xvZ2dlciB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBMb2dnZXIgbG9nZ2VyOworICAgICAgICBwcml2YXRlIGZpbmFsIExldmVsIHRocmVzaG9sZDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBUcmFjaW5nSW5mbyB0cmFjaW5nSW5mbzsKKworICAgICAgICBwdWJsaWMgVHJhY2luZ0xvZ2dlckltcGwoZmluYWwgTGV2ZWwgdGhyZXNob2xkLCBTdHJpbmcgbG9nZ2VyTmFtZVN1ZmZpeCkgeworICAgICAgICAgICAgdGhpcy50aHJlc2hvbGQgPSB0aHJlc2hvbGQ7CisKKyAgICAgICAgICAgIHRoaXMudHJhY2luZ0luZm8gPSBuZXcgVHJhY2luZ0luZm8oKTsKKworICAgICAgICAgICAgbG9nZ2VyTmFtZVN1ZmZpeCA9IGxvZ2dlck5hbWVTdWZmaXggIT0gbnVsbCA/IGxvZ2dlck5hbWVTdWZmaXggOiBERUZBVUxUX0xPR0dFUl9OQU1FX1NVRkZJWDsKKyAgICAgICAgICAgIHRoaXMubG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihUUkFDSU5HX0xPR0dFUl9OQU1FX1BSRUZJWCArICIuIiArIGxvZ2dlck5hbWVTdWZmaXgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzTG9nRW5hYmxlZChmaW5hbCBFdmVudCBldmVudCkgeworICAgICAgICAgICAgcmV0dXJuIGlzRW5hYmxlZChldmVudC5sZXZlbCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBsb2coZmluYWwgRXZlbnQgZXZlbnQsIGZpbmFsIE9iamVjdC4uLiBhcmdzKSB7CisgICAgICAgICAgICBsb2dEdXJhdGlvbihldmVudCwgLTEsIGFyZ3MpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGxvZ0R1cmF0aW9uKGZpbmFsIEV2ZW50IGV2ZW50LCBmaW5hbCBsb25nIGZyb21UaW1lc3RhbXAsIGZpbmFsIE9iamVjdC4uLiBhcmdzKSB7CisgICAgICAgICAgICBpZiAoaXNFbmFibGVkKGV2ZW50LmxldmVsKCkpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgbG9uZyB0b1RpbWVzdGFtcDsKKyAgICAgICAgICAgICAgICBpZiAoZnJvbVRpbWVzdGFtcCA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICB0b1RpbWVzdGFtcCA9IC0xOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRvVGltZXN0YW1wID0gU3lzdGVtLm5hbm9UaW1lKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxvbmcgZHVyYXRpb24gPSAwOworICAgICAgICAgICAgICAgIGlmICgoZnJvbVRpbWVzdGFtcCAhPSAtMSkgJiYgKHRvVGltZXN0YW1wICE9IC0xKSkgeworICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IHRvVGltZXN0YW1wIC0gZnJvbVRpbWVzdGFtcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbG9nSW1wbChldmVudCwgZHVyYXRpb24sIGFyZ3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIHRpbWVzdGFtcChmaW5hbCBFdmVudCBldmVudCkgeworICAgICAgICAgICAgaWYgKGlzRW5hYmxlZChldmVudC5sZXZlbCgpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBTeXN0ZW0ubmFub1RpbWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmbHVzaChmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaGVhZGVycykgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gbWVzc2FnZXMgPSB0cmFjaW5nSW5mby5nZXRNZXNzYWdlcygpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGhlYWRlcnMucHV0U2luZ2xlKFN0cmluZy5mb3JtYXQoVHJhY2luZ0xvZ2dlci5IRUFERVJfUkVTUE9OU0VfRk9STUFULCBpKSwgbWVzc2FnZXNbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIExvZyBtZXNzYWdlIGZvciBzcGVjaWZpZWQgZXZlbnQgdHlwZS4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhlIGV2ZW50IGNvbnRhaW5zIG5hbWUsIGNhdGVnb3J5LCBsZXZlbCBhbmQgYWxzbyBtZXNzYWdlIGZvcm1hdC4KKyAgICAgICAgICogTWVzc2FnZSBmb3JtYXQgd2lsbCBiZSBmb3JtYXR0ZWQgYnkgcGFyYW1ldGVyIHtAY29kZSBtZXNzYWdlQXJnc30gaXMgdXNlZCB0byBmb3JtYXQgZXZlbnQuCisgICAgICAgICAqIElmIHRoZXJlIGlzIG5vIG1lc3NhZ2UgZm9ybWF0IHRoZW4gZWFjaCBtZXNzYWdlIGFyZyBpcyBzZXBhcmF0ZWQgYnkgc3BhY2UuCisgICAgICAgICAqIEZpbmFsIG1lc3NhZ2UgYWxzbyBjb250YWlucyBldmVudCBuYW1lIChKREsgTG9nKSBvciBjYXRlZ29yeSAoSFRUUCBoZWFkZXIpIGFuZCB0aW1lIHN0YW1wLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZXZlbnQgICAgICAgRXZlbnQgdHlwZSBvZiBsb2cKKyAgICAgICAgICogQHBhcmFtIGR1cmF0aW9uICAgIFRpbWUgZHVyYXRpb24gb2YgbG9nZ2VkIGV2ZW50LiBDYW4gYmUge0Bjb2RlIDB9LgorICAgICAgICAgKiBAcGFyYW0gbWVzc2FnZUFyZ3MgbWVzc2FnZSBhcmd1bWVudHMKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCBsb2dJbXBsKGZpbmFsIEV2ZW50IGV2ZW50LCBmaW5hbCBsb25nIGR1cmF0aW9uLCBmaW5hbCBPYmplY3QuLi4gbWVzc2FnZUFyZ3MpIHsKKyAgICAgICAgICAgIGlmIChpc0VuYWJsZWQoZXZlbnQubGV2ZWwoKSkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBtZXNzYWdlQXJnc1N0ciA9IG5ldyBTdHJpbmdbbWVzc2FnZUFyZ3MubGVuZ3RoXTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VBcmdzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VBcmdzU3RyW2ldID0gZm9ybWF0SW5zdGFuY2UobWVzc2FnZUFyZ3NbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5hbCBUcmFjaW5nSW5mby5NZXNzYWdlIG1lc3NhZ2UgPSBuZXcgVHJhY2luZ0luZm8uTWVzc2FnZShldmVudCwgZHVyYXRpb24sIG1lc3NhZ2VBcmdzU3RyKTsKKyAgICAgICAgICAgICAgICB0cmFjaW5nSW5mby5hZGRNZXNzYWdlKG1lc3NhZ2UpOworCisgICAgICAgICAgICAgICAgZmluYWwgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwgbG9nZ2luZ0xldmVsOworICAgICAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQubGV2ZWwoKSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIFNVTU1BUlk6CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dnaW5nTGV2ZWwgPSBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbC5GSU5FOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgVFJBQ0U6CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dnaW5nTGV2ZWwgPSBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbC5GSU5FUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFZFUkJPU0U6CisgICAgICAgICAgICAgICAgICAgICAgICBsb2dnaW5nTGV2ZWwgPSBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbC5GSU5FU1Q7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dpbmdMZXZlbCA9IGphdmEudXRpbC5sb2dnaW5nLkxldmVsLk9GRjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxvZ2dlci5pc0xvZ2dhYmxlKGxvZ2dpbmdMZXZlbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhsb2dnaW5nTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQubmFtZSgpICsgJyAnICsgbWVzc2FnZS50b1N0cmluZygpICsgIiBbIiArIFRyYWNpbmdJbmZvLmZvcm1hdER1cmF0aW9uKGR1cmF0aW9uKSArICIgbXNdIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzRW5hYmxlZChmaW5hbCBMZXZlbCBsZXZlbCkgeworICAgICAgICAgICAgcmV0dXJuIHRocmVzaG9sZC5vcmRpbmFsKCkgPj0gbGV2ZWwub3JkaW5hbCgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZvcm1hdCBpbmZvIG9mIGluc3RhbmNlLgorICAgICAgICAgKgorICAgICAgICAgKiBJdCBzaG93cyBpdHMgY2xhc3MgbmFtZSwgaWRlbnRpdHkgaGFzaCBjb2RlLCBhbmQgZm9sbG93aW5nIGluZm8gaWYgYXZhaWxhYmxlOiBwcmlvcml0eSB2YWx1ZSwgcmVzcG9uc2UgZGV0YWlsLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gaW5zdGFuY2UgaW5zdGFuY2UgdG8gYmUgZm9ybWF0dGVkCisgICAgICAgICAqIEByZXR1cm4gRm9ybWF0dGVkIGluZm8gb2YgaW5zdGFuY2UuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZm9ybWF0SW5zdGFuY2UoZmluYWwgT2JqZWN0IGluc3RhbmNlKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHRleHRTQiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRleHRTQi5hcHBlbmQoIm51bGwiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKGluc3RhbmNlIGluc3RhbmNlb2YgTnVtYmVyKSB8fCAoaW5zdGFuY2UgaW5zdGFuY2VvZiBTdHJpbmcpIHx8IChpbnN0YW5jZSBpbnN0YW5jZW9mIE1ldGhvZCkpIHsKKyAgICAgICAgICAgICAgICB0ZXh0U0IuYXBwZW5kKGluc3RhbmNlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChpbnN0YW5jZSBpbnN0YW5jZW9mIFJlc3BvbnNlLlN0YXR1c1R5cGUpIHsKKyAgICAgICAgICAgICAgICB0ZXh0U0IuYXBwZW5kKGZvcm1hdFN0YXR1c0luZm8oKFJlc3BvbnNlLlN0YXR1c1R5cGUpIGluc3RhbmNlKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRleHRTQi5hcHBlbmQoJ1snKTsKKyAgICAgICAgICAgICAgICBmb3JtYXRJbnN0YW5jZShpbnN0YW5jZSwgdGV4dFNCKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UuZ2V0Q2xhc3MoKS5pc0Fubm90YXRpb25QcmVzZW50KFByaW9yaXR5LmNsYXNzKSkgeworICAgICAgICAgICAgICAgICAgICB0ZXh0U0IuYXBwZW5kKCIgIyIpLmFwcGVuZChpbnN0YW5jZS5nZXRDbGFzcygpLmdldEFubm90YXRpb24oUHJpb3JpdHkuY2xhc3MpLnZhbHVlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UgaW5zdGFuY2VvZiBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgICAgICBmb3JtYXRSZXNwb25zZSgoKFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKSBpbnN0YW5jZSkuZ2V0UmVzcG9uc2UoKSwgdGV4dFNCKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluc3RhbmNlIGluc3RhbmNlb2YgUmVzcG9uc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0UmVzcG9uc2UoKChSZXNwb25zZSkgaW5zdGFuY2UpLCB0ZXh0U0IpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0ZXh0U0IuYXBwZW5kKCddJyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdGV4dFNCLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQmFzaWMgZm9ybWF0IG9mIGluc3RhbmNlIC0ganVzdCBjbGFzcyBuYW1lIGFuZCBpZGVudGl0eSBoYXNoIGNvZGUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBpbnN0YW5jZSBpbnN0YW5jZSB0byBiZSBmb3JtYXR0ZWQKKyAgICAgICAgICogQHBhcmFtIHRleHRTQiAgIEZvcm1hdHRlZCBpbmZvIHdpbGwgYmUgYXBwZW5kZWQgdG8ge0Bjb2RlIFN0cmluZ0J1aWxkZXJ9CisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGZvcm1hdEluc3RhbmNlKGZpbmFsIE9iamVjdCBpbnN0YW5jZSwgZmluYWwgU3RyaW5nQnVpbGRlciB0ZXh0U0IpIHsKKyAgICAgICAgICAgIHRleHRTQi5hcHBlbmQoaW5zdGFuY2UuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpLmFwcGVuZCgiIEAiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKEludGVnZXIudG9IZXhTdHJpbmcoU3lzdGVtLmlkZW50aXR5SGFzaENvZGUoaW5zdGFuY2UpKSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRm9ybWF0IG9mIHJlc3BvbnNlIC0gc3RhdHVzIGNvZGUsIHN0YXR1cyBmYW1pbHksIHJlYXNvbiBwaHJhc2UgYW5kIGluZm8gYWJvdXQgZW50aXR5LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcmVzcG9uc2UgcmVzcG9uc2UgdG8gYmUgZm9ybWF0dGVkCisgICAgICAgICAqIEBwYXJhbSB0ZXh0U0IgICBGb3JtYXR0ZWQgaW5mbyB3aWxsIGJlIGFwcGVuZGVkIHRvIHtAY29kZSBTdHJpbmdCdWlsZGVyfQorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBmb3JtYXRSZXNwb25zZShmaW5hbCBSZXNwb25zZSByZXNwb25zZSwgZmluYWwgU3RyaW5nQnVpbGRlciB0ZXh0U0IpIHsKKyAgICAgICAgICAgIHRleHRTQi5hcHBlbmQoIiA8IikuYXBwZW5kKGZvcm1hdFN0YXR1c0luZm8ocmVzcG9uc2UuZ2V0U3RhdHVzSW5mbygpKSkuYXBwZW5kKCd8Jyk7CisgICAgICAgICAgICBpZiAocmVzcG9uc2UuaGFzRW50aXR5KCkpIHsKKyAgICAgICAgICAgICAgICBmb3JtYXRJbnN0YW5jZShyZXNwb25zZS5nZXRFbnRpdHkoKSwgdGV4dFNCKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGV4dFNCLmFwcGVuZCgiLW5vLWVudGl0eS0iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRleHRTQi5hcHBlbmQoJz4nKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmb3JtYXRTdGF0dXNJbmZvKGZpbmFsIFJlc3BvbnNlLlN0YXR1c1R5cGUgc3RhdHVzSW5mbykgeworICAgICAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKHN0YXR1c0luZm8uZ2V0U3RhdHVzQ29kZSgpKSArICcvJyArIHN0YXR1c0luZm8uZ2V0RmFtaWx5KCkgKyAnfCcgKyBzdGF0dXNJbmZvLmdldFJlYXNvblBocmFzZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTGV2ZWwgb2YgdHJhY2luZyBtZXNzYWdlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZW51bSBMZXZlbCB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBCcmllZiB0cmFjaW5nIGluZm9ybWF0aW9uIGxldmVsLgorICAgICAgICAgKi8KKyAgICAgICAgU1VNTUFSWSwKKyAgICAgICAgLyoqCisgICAgICAgICAqIERldGFpbGVkIHRyYWNpbmcgaW5mb3JtYXRpb24gbGV2ZWwuCisgICAgICAgICAqLworICAgICAgICBUUkFDRSwKKyAgICAgICAgLyoqCisgICAgICAgICAqIEV4dHJlbWVseSBkZXRhaWxlZCB0cmFjaW5nIGluZm9ybWF0aW9uIGxldmVsLgorICAgICAgICAgKi8KKyAgICAgICAgVkVSQk9TRQorICAgIH0KKworICAgIC8qKgorICAgICAqIFR5cGUgb2YgZXZlbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgRXZlbnQgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBOYW1lIG9mIGV2ZW50LCBzaG91bGQgYmUgdW5pcXVlLgorICAgICAgICAgKiBJcyBsb2dnZWQgYnkgSkRLIGxvZ2dlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBldmVudCBuYW1lLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBuYW1lKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENhdGVnb3J5IG9mIGV2ZW50LCBtb3JlIGV2ZW50cyBzaGFyZSBzYW1lIGNhdGVnb3J5LgorICAgICAgICAgKiBJcyB1c2VkIHRvIGZvcm1hdCByZXNwb25zZSBIVFRQIGhlYWRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBldmVudCBjYXRlZ29yeS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgY2F0ZWdvcnkoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogTGV2ZWwgb2YgZXZlbnQuCisgICAgICAgICAqIElzIHVzZWQgdG8gY2hlY2sgaWYgdGhlIGV2ZW50IGlzIGxvZ2dlZCBhY2NvcmRpbmcgdG8gYXBwbGljYXRpb24vcmVxdWVzdCBzZXR0aW5ncy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBldmVudCB0cmFjZSBsZXZlbC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBMZXZlbCBsZXZlbCgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBNZXNzYWdlIGZvcm1hdC4gVXNlIHtAbGluayBTdHJpbmcjZm9ybWF0KFN0cmluZywgT2JqZWN0Li4uKX0gZm9ybWF0LgorICAgICAgICAgKiBDYW4gYmUgbnVsbC4gSW4gdGhhdCBjYXNlIG1lc3NhZ2UgYXJndW1lbnRzIGFyZSBzZXBhcmF0ZWQgYnkgc3BhY2UuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gbWVzc2FnZSBmb3JtYXQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgbWVzc2FnZUZvcm1hdCgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL1VyaVByb3ZpZGVyLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvVXJpUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDFiNjlkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL1VyaVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuSGVhZGVyRGVsZWdhdGVQcm92aWRlcjsKKworaW1wb3J0IHN0YXRpYyBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLlV0aWxzLnRocm93SWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uSWZOdWxsOworCisvKioKKyAqIHtAY29kZSBVUkl9IHtAbGluayBIZWFkZXJEZWxlZ2F0ZVByb3ZpZGVyIGhlYWRlciBkZWxlZ2F0ZSBwcm92aWRlcn0uCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQFNpbmdsZXRvbgorcHVibGljIGNsYXNzIFVyaVByb3ZpZGVyIGltcGxlbWVudHMgSGVhZGVyRGVsZWdhdGVQcm92aWRlcjxVUkk+IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzKENsYXNzPD8+IHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHR5cGUgPT0gVVJJLmNsYXNzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoVVJJIGhlYWRlcikgeworICAgICAgICB0aHJvd0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbklmTnVsbChoZWFkZXIsIExvY2FsaXphdGlvbk1lc3NhZ2VzLlVSSV9JU19OVUxMKCkpOworICAgICAgICByZXR1cm4gaGVhZGVyLnRvQVNDSUlTdHJpbmcoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVVJJIGZyb21TdHJpbmcoU3RyaW5nIGhlYWRlcikgeworICAgICAgICB0aHJvd0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbklmTnVsbChoZWFkZXIsIExvY2FsaXphdGlvbk1lc3NhZ2VzLlVSSV9JU19OVUxMKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkkoaGVhZGVyKTsKKyAgICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJFcnJvciBwYXJzaW5nIHVyaSAnIiArIGhlYWRlciArICInIiwgZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvVXRpbHMuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9VdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZmE4OTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvVXRpbHMuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBVdGlscyB7CisKKyAgICAvKioKKyAgICAgKiBUaHJvd3MgYW4gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdpdGggZ2l2ZW4gZXJyb3IgbWVzc2FnZSBpZiB0aGUgZmlyc3QsIHRvQ2hlY2ssCisgICAgICogcGFyYW1ldGVyIGlzIHtAY29kZSBudWxsfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0b0NoZWNrIGFuIGluc3RhbmNlIHRvIGNoZWNrLgorICAgICAqIEBwYXJhbSBlcnJvck1lc3NhZ2UgbWVzc2FnZSB0byBzZXQgdG8gdGhlIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB0aHJvd24uCisgICAgICovCisgICAgc3RhdGljIHZvaWQgdGhyb3dJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25JZk51bGwoZmluYWwgT2JqZWN0IHRvQ2hlY2ssIGZpbmFsIFN0cmluZyBlcnJvck1lc3NhZ2UpIHsKKyAgICAgICAgaWYgKHRvQ2hlY2sgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihlcnJvck1lc3NhZ2UpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIGVtcHR5IGZpbGUgaW4gdGhlIGRlZmF1bHQgdGVtcG9yYXJ5LWZpbGUgZGlyZWN0b3J5LgorICAgICAqCisgICAgICogQHJldHVybiBBbiBhYnN0cmFjdCBwYXRobmFtZSBkZW5vdGluZyBhIG5ld2x5LWNyZWF0ZWQgZW1wdHkgZmlsZS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGEgZmlsZSBjb3VsZCBub3QgYmUgY3JlYXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEZpbGUgY3JlYXRlVGVtcEZpbGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBGaWxlIGZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJyZXAiLCAidG1wIik7CisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZmlsZSBpcyBkZWxldGVkIHdoZW4gSlZNIGlzIHNodXRkb3duIGF0IGxhc3QuCisgICAgICAgIGZpbGUuZGVsZXRlT25FeGl0KCk7CisgICAgICAgIHJldHVybiBmaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByZXZlbnQgaW5zdGFudGlhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFV0aWxzKCkgeworICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIk5vIGluc3RhbmNlcyBhbGxvd2VkLiIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9WYXJpYW50TGlzdEJ1aWxkZXIuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9WYXJpYW50TGlzdEJ1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmI3Nzc2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL1ZhcmlhbnRMaXN0QnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVmFyaWFudDsKKworLyoqCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgVmFyaWFudExpc3RCdWlsZGVyfS4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgVmFyaWFudExpc3RCdWlsZGVyIGV4dGVuZHMgVmFyaWFudC5WYXJpYW50TGlzdEJ1aWxkZXIgeworCisgICAgcHJpdmF0ZSBMaXN0PFZhcmlhbnQ+IHZhcmlhbnRzOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxNZWRpYVR5cGU+IG1lZGlhVHlwZXMgPSBuZXcgQXJyYXlMaXN0PE1lZGlhVHlwZT4oKTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8TG9jYWxlPiBsYW5ndWFnZXMgPSBuZXcgQXJyYXlMaXN0PExvY2FsZT4oKTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8U3RyaW5nPiBlbmNvZGluZ3MgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFZhcmlhbnQ+IGJ1aWxkKCkgeworICAgICAgICBpZiAoIW1lZGlhVHlwZXMuaXNFbXB0eSgpIHx8ICFsYW5ndWFnZXMuaXNFbXB0eSgpIHx8ICFlbmNvZGluZ3MuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAvLyBpZiBjdXJyZW50IHN0YXRlIGlzIG5vdCBlbXB0eSwgYWRkIGNvbWJpbmF0aW9ucyB0byB0aGUgdmFyaWFudCBsaXN0CisgICAgICAgICAgICBhZGQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFyaWFudHMgPT0gbnVsbCkgeworICAgICAgICAgICAgdmFyaWFudHMgPSBuZXcgQXJyYXlMaXN0PFZhcmlhbnQ+KCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdmFyaWFudHM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFZhcmlhbnRMaXN0QnVpbGRlciBhZGQoKSB7CisgICAgICAgIGlmICh2YXJpYW50cyA9PSBudWxsKSB7CisgICAgICAgICAgICB2YXJpYW50cyA9IG5ldyBBcnJheUxpc3Q8VmFyaWFudD4oKTsKKyAgICAgICAgfQorCisgICAgICAgIGFkZE1lZGlhVHlwZXMoKTsKKworICAgICAgICBsYW5ndWFnZXMuY2xlYXIoKTsKKyAgICAgICAgZW5jb2RpbmdzLmNsZWFyKCk7CisgICAgICAgIG1lZGlhVHlwZXMuY2xlYXIoKTsKKworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkTWVkaWFUeXBlcygpIHsKKyAgICAgICAgaWYgKG1lZGlhVHlwZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBhZGRMYW5ndWFnZXMobnVsbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKE1lZGlhVHlwZSBtZWRpYVR5cGUgOiBtZWRpYVR5cGVzKSB7CisgICAgICAgICAgICAgICAgYWRkTGFuZ3VhZ2VzKG1lZGlhVHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkTGFuZ3VhZ2VzKE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgaWYgKGxhbmd1YWdlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGFkZEVuY29kaW5ncyhtZWRpYVR5cGUsIG51bGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChMb2NhbGUgbGFuZ3VhZ2UgOiBsYW5ndWFnZXMpIHsKKyAgICAgICAgICAgICAgICBhZGRFbmNvZGluZ3MobWVkaWFUeXBlLCBsYW5ndWFnZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkRW5jb2RpbmdzKE1lZGlhVHlwZSBtZWRpYVR5cGUsIExvY2FsZSBsYW5ndWFnZSkgeworICAgICAgICBpZiAoZW5jb2RpbmdzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgYWRkVmFyaWFudChtZWRpYVR5cGUsIGxhbmd1YWdlLCBudWxsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIGVuY29kaW5nIDogZW5jb2RpbmdzKSB7CisgICAgICAgICAgICAgICAgYWRkVmFyaWFudChtZWRpYVR5cGUsIGxhbmd1YWdlLCBlbmNvZGluZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkVmFyaWFudChNZWRpYVR5cGUgbWVkaWFUeXBlLCBMb2NhbGUgbGFuZ3VhZ2UsIFN0cmluZyBlbmNvZGluZykgeworICAgICAgICB2YXJpYW50cy5hZGQobmV3IFZhcmlhbnQobWVkaWFUeXBlLCBsYW5ndWFnZSwgZW5jb2RpbmcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVmFyaWFudExpc3RCdWlsZGVyIGxhbmd1YWdlcyhMb2NhbGUuLi4gbGFuZ3VhZ2VzKSB7CisgICAgICAgIHRoaXMubGFuZ3VhZ2VzLmFkZEFsbChBcnJheXMuYXNMaXN0KGxhbmd1YWdlcykpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVmFyaWFudExpc3RCdWlsZGVyIGVuY29kaW5ncyhTdHJpbmcuLi4gZW5jb2RpbmdzKSB7CisgICAgICAgIHRoaXMuZW5jb2RpbmdzLmFkZEFsbChBcnJheXMuYXNMaXN0KGVuY29kaW5ncykpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVmFyaWFudExpc3RCdWlsZGVyIG1lZGlhVHlwZXMoTWVkaWFUeXBlLi4uIG1lZGlhVHlwZXMpIHsKKyAgICAgICAgdGhpcy5tZWRpYVR5cGVzLmFkZEFsbChBcnJheXMuYXNMaXN0KG1lZGlhVHlwZXMpKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL1ZhcmlhbnRTZWxlY3Rvci5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL1ZhcmlhbnRTZWxlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZWZkNDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvVmFyaWFudFNlbGVjdG9yLmphdmEKQEAgLTAsMCArMSwzMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5WYXJpYW50OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLlJlZjsKKworLyoqCisgKiBVdGlsaXR5IGZvciBzZWxlY3RpbmcgdmFyaWFudCB0aGF0IGJlc3QgbWF0Y2hlcyByZXF1ZXN0IGZyb20gYSBsaXN0IG9mIHZhcmlhbnRzLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBWYXJpYW50U2VsZWN0b3IgeworCisgICAgcHJpdmF0ZSBWYXJpYW50U2VsZWN0b3IoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJmYWNlIHRvIGdldCBhIGRpbWVuc2lvbiB2YWx1ZSBmcm9tIGEgdmFyaWFudCBhbmQgY2hlY2sgaWYgYW4KKyAgICAgKiBhY2NlcHRhYmxlIGRpbWVuc2lvbiB2YWx1ZSBpcyBjb21wYXRpYmxlIHdpdGggYSBkaW1lbnNpb24gdmFsdWUuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnRlcmZhY2UgRGltZW5zaW9uQ2hlY2tlcjxULCBVPiB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgZGltZW5zaW9uIHZhbHVlIGZyb20gdGhlIHZhcmlhbnQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB2IHRoZSB2YXJpYW50LgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBkaW1lbnNpb24gdmFsdWUuCisgICAgICAgICAqLworICAgICAgICBVIGdldERpbWVuc2lvbihWYXJpYW50SG9sZGVyIHYpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIHF1YWxpdHkgc291cmNlIG9mIHRoZSBkaW1lbnNpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gcXVhbGl0eSBzb3VyY2UuCisgICAgICAgICAqLworICAgICAgICBpbnQgZ2V0UXVhbGl0eVNvdXJjZShWYXJpYW50SG9sZGVyIHYsIFUgdSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFzY2VydGFpbiBpZiB0aGUgYWNjZXB0YWJsZSBkaW1lbnNpb24gdmFsdWUgaXMgY29tcGF0aWJsZSB3aXRoCisgICAgICAgICAqIHRoZSBkaW1lbnNpb24gdmFsdWUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB0IHRoZSBhY2NlcHRhYmxlIGRpbWVuc2lvbiB2YWx1ZS4KKyAgICAgICAgICogQHBhcmFtIHUgdGhlIGRpbWVuc2lvbiB2YWx1ZS4KKyAgICAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGFjY2VwdGFibGUgZGltZW5zaW9uIHZhbHVlIGlzIGNvbXBhdGlibGUgd2l0aAorICAgICAgICAgKiAgICAgICAgIHRoZSBkaW1lbnNpb24gdmFsdWUuCisgICAgICAgICAqLworICAgICAgICBib29sZWFuIGlzQ29tcGF0aWJsZShUIHQsIFUgdSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIFZhcnkgaGVhZGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgVmFyeSBoZWFkZXIuCisgICAgICAgICAqLworICAgICAgICBTdHJpbmcgZ2V0VmFyeUhlYWRlclZhbHVlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRGltZW5zaW9uQ2hlY2tlcjxBY2NlcHRhYmxlTWVkaWFUeXBlLCBNZWRpYVR5cGU+IE1FRElBX1RZUEVfREMgPQorICAgICAgICAgICAgbmV3IERpbWVuc2lvbkNoZWNrZXI8QWNjZXB0YWJsZU1lZGlhVHlwZSwgTWVkaWFUeXBlPigpIHsKKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBNZWRpYVR5cGUgZ2V0RGltZW5zaW9uKGZpbmFsIFZhcmlhbnRIb2xkZXIgdikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdi52LmdldE1lZGlhVHlwZSgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ29tcGF0aWJsZShmaW5hbCBBY2NlcHRhYmxlTWVkaWFUeXBlIHQsIGZpbmFsIE1lZGlhVHlwZSB1KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0LmlzQ29tcGF0aWJsZSh1KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgaW50IGdldFF1YWxpdHlTb3VyY2UoZmluYWwgVmFyaWFudEhvbGRlciB2LCBmaW5hbCBNZWRpYVR5cGUgdSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdi5tZWRpYVR5cGVRczsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFZhcnlIZWFkZXJWYWx1ZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEh0dHBIZWFkZXJzLkFDQ0VQVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIERpbWVuc2lvbkNoZWNrZXI8QWNjZXB0YWJsZUxhbmd1YWdlVGFnLCBMb2NhbGU+IExBTkdVQUdFX1RBR19EQyA9CisgICAgICAgICAgICBuZXcgRGltZW5zaW9uQ2hlY2tlcjxBY2NlcHRhYmxlTGFuZ3VhZ2VUYWcsIExvY2FsZT4oKSB7CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgTG9jYWxlIGdldERpbWVuc2lvbihmaW5hbCBWYXJpYW50SG9sZGVyIHYpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHYudi5nZXRMYW5ndWFnZSgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ29tcGF0aWJsZShmaW5hbCBBY2NlcHRhYmxlTGFuZ3VhZ2VUYWcgdCwgZmluYWwgTG9jYWxlIHUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuaXNDb21wYXRpYmxlKHUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0UXVhbGl0eVNvdXJjZShmaW5hbCBWYXJpYW50SG9sZGVyIHFzdiwgZmluYWwgTG9jYWxlIHUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFF1YWxpdHkuTUlOSU1VTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFZhcnlIZWFkZXJWYWx1ZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEh0dHBIZWFkZXJzLkFDQ0VQVF9MQU5HVUFHRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIERpbWVuc2lvbkNoZWNrZXI8QWNjZXB0YWJsZVRva2VuLCBTdHJpbmc+IENIQVJTRVRfREMgPQorICAgICAgICAgICAgbmV3IERpbWVuc2lvbkNoZWNrZXI8QWNjZXB0YWJsZVRva2VuLCBTdHJpbmc+KCkgeworCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXREaW1lbnNpb24oZmluYWwgVmFyaWFudEhvbGRlciB2KSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtID0gdi52LmdldE1lZGlhVHlwZSgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG0gIT0gbnVsbCkgPyBtLmdldFBhcmFtZXRlcnMoKS5nZXQoImNoYXJzZXQiKSA6IG51bGw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDb21wYXRpYmxlKGZpbmFsIEFjY2VwdGFibGVUb2tlbiB0LCBmaW5hbCBTdHJpbmcgdSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5pc0NvbXBhdGlibGUodSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGludCBnZXRRdWFsaXR5U291cmNlKGZpbmFsIFZhcmlhbnRIb2xkZXIgcXN2LCBmaW5hbCBTdHJpbmcgdSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gUXVhbGl0eS5NSU5JTVVNOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFyeUhlYWRlclZhbHVlKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gSHR0cEhlYWRlcnMuQUNDRVBUX0NIQVJTRVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBEaW1lbnNpb25DaGVja2VyPEFjY2VwdGFibGVUb2tlbiwgU3RyaW5nPiBFTkNPRElOR19EQyA9CisgICAgICAgICAgICBuZXcgRGltZW5zaW9uQ2hlY2tlcjxBY2NlcHRhYmxlVG9rZW4sIFN0cmluZz4oKSB7CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERpbWVuc2lvbihmaW5hbCBWYXJpYW50SG9sZGVyIHYpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHYudi5nZXRFbmNvZGluZygpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ29tcGF0aWJsZShmaW5hbCBBY2NlcHRhYmxlVG9rZW4gdCwgZmluYWwgU3RyaW5nIHUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQuaXNDb21wYXRpYmxlKHUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0UXVhbGl0eVNvdXJjZShmaW5hbCBWYXJpYW50SG9sZGVyIHFzdiwgZmluYWwgU3RyaW5nIHUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFF1YWxpdHkuTUlOSU1VTTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFZhcnlIZWFkZXJWYWx1ZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEh0dHBIZWFkZXJzLkFDQ0VQVF9FTkNPRElORzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgLyoqCisgICAgICogU2VsZWN0IHZhcmlhbnRzIGZvciBhIGdpdmVuIGRpbWVuc2lvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YXJpYW50SG9sZGVycyAgIGNvbGxlY3Rpb24gb2YgdmFyaWFudHMuCisgICAgICogQHBhcmFtIGFjY2VwdGFibGVWYWx1ZXMgdGhlIGxpc3Qgb2YgYWNjZXB0YWJsZSBkaW1lbnNpb24gdmFsdWVzLCBvcmRlcmVkIGJ5IHRoZSBxdWFsaXR5CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyLCB3aXRoIHRoZSBoaWdoZXN0IHF1YWxpdHkgZGltZW5zaW9uIHZhbHVlIG9jY3VycmluZworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0LgorICAgICAqIEBwYXJhbSBkaW1lbnNpb25DaGVja2VyIHRoZSBkaW1lbnNpb24gY2hlY2tlcgorICAgICAqIEBwYXJhbSB2YXJ5ICAgICAgICAgICAgIG91dHB1dCBsaXN0IG9mIGdlbmVyYXRlZCB2YXJ5IGhlYWRlcnMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgPFQgZXh0ZW5kcyBRdWFsaWZpZWQsIFU+IExpbmtlZExpc3Q8VmFyaWFudEhvbGRlcj4gc2VsZWN0VmFyaWFudHMoCisgICAgICAgICAgICBmaW5hbCBMaXN0PFZhcmlhbnRIb2xkZXI+IHZhcmlhbnRIb2xkZXJzLAorICAgICAgICAgICAgZmluYWwgTGlzdDxUPiBhY2NlcHRhYmxlVmFsdWVzLAorICAgICAgICAgICAgZmluYWwgRGltZW5zaW9uQ2hlY2tlcjxULCBVPiBkaW1lbnNpb25DaGVja2VyLAorICAgICAgICAgICAgZmluYWwgU2V0PFN0cmluZz4gdmFyeSkgeworICAgICAgICBpbnQgY3EgPSBRdWFsaXR5Lk1JTklNVU07CisgICAgICAgIGludCBjcXMgPSBRdWFsaXR5Lk1JTklNVU07CisKKyAgICAgICAgZmluYWwgTGlua2VkTGlzdDxWYXJpYW50SG9sZGVyPiBzZWxlY3RlZCA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKworICAgICAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIGFjY2VwdGFibGUgZW50cmllcworICAgICAgICAvLyBUaGlzIGFzc3VtZXMgdGhlIGVudHJpZXMgYXJlIG9yZGVyZWQgYnkgdGhlIHF1YWxpdHkKKyAgICAgICAgZm9yIChmaW5hbCBUIGEgOiBhY2NlcHRhYmxlVmFsdWVzKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgcSA9IGEuZ2V0UXVhbGl0eSgpOworCisgICAgICAgICAgICBmaW5hbCBJdGVyYXRvcjxWYXJpYW50SG9sZGVyPiBpdiA9IHZhcmlhbnRIb2xkZXJzLml0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoaXYuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgVmFyaWFudEhvbGRlciB2ID0gaXYubmV4dCgpOworCisgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBkaW1lbnNpb24gIHZhbHVlIG9mIHRoZSB2YXJpYW50IHRvIGNoZWNrCisgICAgICAgICAgICAgICAgZmluYWwgVSBkID0gZGltZW5zaW9uQ2hlY2tlci5nZXREaW1lbnNpb24odik7CisKKyAgICAgICAgICAgICAgICBpZiAoZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHZhcnkuYWRkKGRpbWVuc2lvbkNoZWNrZXIuZ2V0VmFyeUhlYWRlclZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgYWNjZXB0YWJsZSBlbnRyeSBpcyBjb21wYXRhYmxlIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGRpbWVuc2lvbiB2YWx1ZQorICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcXMgPSBkaW1lbnNpb25DaGVja2VyLmdldFF1YWxpdHlTb3VyY2UodiwgZCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChxcyA+PSBjcXMgJiYgZGltZW5zaW9uQ2hlY2tlci5pc0NvbXBhdGlibGUoYSwgZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxcyA+IGNxcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNxcyA9IHFzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNxID0gcTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgYWxsIGVudHJpZXMgdGhhdCB3ZXJlIGFkZGVkIGZvciBxcyA8IGNxcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQuYWRkKHYpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChxID4gY3EpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcSA9IHE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIHZhcmlhbnQgd2l0aCBoaWdoZXIgYWNjZXB0IHF1YWxpdHkgYXQgdGhlIGZyb250CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQuYWRkRmlyc3Qodik7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHEgPT0gY3EpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbnN1cmUgc2VsZWN0aW9uIGlzIHN0YWJsZSB3aXRoIG9yZGVyIG9mIHZhcmlhbnRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2l0aCBzYW1lIHF1YWxpdHkgb2Ygc291cmNlIGFuZCBhY2NlcHQgcXVhbGl0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkLmFkZCh2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGl2LnJlbW92ZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQWRkIGFsbCB2YXJpYW50cyB0aGF0IGFyZSBub3QgY29tcGF0aWJsZSB3aXRoIHRoaXMgZGltZW5zaW9uCisgICAgICAgIC8vIHRvIHRoZSBlbmQKKyAgICAgICAgZm9yIChmaW5hbCBWYXJpYW50SG9sZGVyIHYgOiB2YXJpYW50SG9sZGVycykgeworICAgICAgICAgICAgaWYgKGRpbWVuc2lvbkNoZWNrZXIuZ2V0RGltZW5zaW9uKHYpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzZWxlY3RlZC5hZGQodik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNlbGVjdGVkOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFZhcmlhbnRIb2xkZXIgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgVmFyaWFudCB2OworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtZWRpYVR5cGVRczsKKworICAgICAgICBWYXJpYW50SG9sZGVyKGZpbmFsIFZhcmlhbnQgdikgeworICAgICAgICAgICAgdGhpcyh2LCBRdWFsaXR5LkRFRkFVTFQpOworICAgICAgICB9CisKKyAgICAgICAgVmFyaWFudEhvbGRlcihmaW5hbCBWYXJpYW50IHYsIGZpbmFsIGludCBtZWRpYVR5cGVRcykgeworICAgICAgICAgICAgdGhpcy52ID0gdjsKKyAgICAgICAgICAgIHRoaXMubWVkaWFUeXBlUXMgPSBtZWRpYVR5cGVRczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIExpbmtlZExpc3Q8VmFyaWFudEhvbGRlcj4gZ2V0VmFyaWFudEhvbGRlckxpc3QoZmluYWwgTGlzdDxWYXJpYW50PiB2YXJpYW50cykgeworICAgICAgICBmaW5hbCBMaW5rZWRMaXN0PFZhcmlhbnRIb2xkZXI+IGwgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIGZvciAoZmluYWwgVmFyaWFudCB2IDogdmFyaWFudHMpIHsKKyAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtdCA9IHYuZ2V0TWVkaWFUeXBlKCk7CisgICAgICAgICAgICBpZiAobXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChtdCBpbnN0YW5jZW9mIFF1YWxpdHlTb3VyY2VNZWRpYVR5cGUgfHwgbXQuZ2V0UGFyYW1ldGVycygpCisgICAgICAgICAgICAgICAgICAgICAgICAuY29udGFpbnNLZXkoUXVhbGl0eS5RVUFMSVRZX1NPVVJDRV9QQVJBTUVURVJfTkFNRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHFzID0gUXVhbGl0eVNvdXJjZU1lZGlhVHlwZS5nZXRRdWFsaXR5U291cmNlKG10KTsKKyAgICAgICAgICAgICAgICAgICAgbC5hZGQobmV3IFZhcmlhbnRIb2xkZXIodiwgcXMpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsLmFkZChuZXcgVmFyaWFudEhvbGRlcih2KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsLmFkZChuZXcgVmFyaWFudEhvbGRlcih2KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZWxlY3QgdGhlIHJlcHJlc2VudGF0aW9uIHZhcmlhbnQgdGhhdCBiZXN0IG1hdGNoZXMgdGhlIHJlcXVlc3QuIE1vcmUgZXhwbGljaXQKKyAgICAgKiB2YXJpYW50cyBhcmUgY2hvc2VuIGFoZWFkIG9mIGxlc3MgZXhwbGljaXQgb25lcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0ICAgICAgICAgIGluYm91bmQgbWVzc2FnZSBjb250ZXh0LgorICAgICAqIEBwYXJhbSB2YXJpYW50cyAgICAgICAgIGxpc3Qgb2YgcG9zc2libGUgdmFyaWFudHMuCisgICAgICogQHBhcmFtIHZhcnlIZWFkZXJWYWx1ZSBhbiBvdXRwdXQgcmVmZXJlbmNlIG9mIHZhcnkgaGVhZGVyIHZhbHVlIHRoYXQgc2hvdWxkIGJlIHB1dAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGludG8gdGhlIHJlc3BvbnNlIFZhcnkgaGVhZGVyLgorICAgICAqIEByZXR1cm4gc2VsZWN0ZWQgdmFyaWFudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFZhcmlhbnQgc2VsZWN0VmFyaWFudChmaW5hbCBJbmJvdW5kTWVzc2FnZUNvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PFZhcmlhbnQ+IHZhcmlhbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlZjxTdHJpbmc+IHZhcnlIZWFkZXJWYWx1ZSkgeworICAgICAgICBmaW5hbCBMaXN0PFZhcmlhbnQ+IHNlbGVjdGVkVmFyaWFudHMgPSBzZWxlY3RWYXJpYW50cyhjb250ZXh0LCB2YXJpYW50cywgdmFyeUhlYWRlclZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHNlbGVjdGVkVmFyaWFudHMuaXNFbXB0eSgpID8gbnVsbCA6IHNlbGVjdGVkVmFyaWFudHMuZ2V0KDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbGVjdCBwb3NzaWJsZSByZXByZXNlbnRhdGlvbiB2YXJpYW50cyBpbiBvcmRlciBpbiB3aGljaCB0aGV5IGJlc3QgbWF0Y2hlcyB0aGUgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IGluYm91bmQgbWVzc2FnZSBjb250ZXh0LgorICAgICAqIEBwYXJhbSB2YXJpYW50cyBsaXN0IG9mIHBvc3NpYmxlIHZhcmlhbnRzLgorICAgICAqIEBwYXJhbSB2YXJ5SGVhZGVyVmFsdWUgYW4gb3V0cHV0IHJlZmVyZW5jZSBvZiB2YXJ5IGhlYWRlciB2YWx1ZSB0aGF0IHNob3VsZCBiZSBwdXQgaW50byB0aGUgcmVzcG9uc2UgVmFyeSBoZWFkZXIuCisgICAgICogQHJldHVybiBwb3NzaWJsZSB2YXJpYW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8VmFyaWFudD4gc2VsZWN0VmFyaWFudHMoZmluYWwgSW5ib3VuZE1lc3NhZ2VDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8VmFyaWFudD4gdmFyaWFudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlZjxTdHJpbmc+IHZhcnlIZWFkZXJWYWx1ZSkgeworICAgICAgICBMaW5rZWRMaXN0PFZhcmlhbnRIb2xkZXI+IHZocyA9IGdldFZhcmlhbnRIb2xkZXJMaXN0KHZhcmlhbnRzKTsKKworICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiB2YXJ5ID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICB2aHMgPSBzZWxlY3RWYXJpYW50cyh2aHMsIGNvbnRleHQuZ2V0UXVhbGlmaWVkQWNjZXB0YWJsZU1lZGlhVHlwZXMoKSwgTUVESUFfVFlQRV9EQywgdmFyeSk7CisgICAgICAgIHZocyA9IHNlbGVjdFZhcmlhbnRzKHZocywgY29udGV4dC5nZXRRdWFsaWZpZWRBY2NlcHRhYmxlTGFuZ3VhZ2VzKCksIExBTkdVQUdFX1RBR19EQywgdmFyeSk7CisgICAgICAgIHZocyA9IHNlbGVjdFZhcmlhbnRzKHZocywgY29udGV4dC5nZXRRdWFsaWZpZWRBY2NlcHRDaGFyc2V0KCksIENIQVJTRVRfREMsIHZhcnkpOworICAgICAgICB2aHMgPSBzZWxlY3RWYXJpYW50cyh2aHMsIGNvbnRleHQuZ2V0UXVhbGlmaWVkQWNjZXB0RW5jb2RpbmcoKSwgRU5DT0RJTkdfREMsIHZhcnkpOworCisgICAgICAgIGlmICh2aHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHZhcnlIZWFkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgdiA6IHZhcnkpIHsKKyAgICAgICAgICAgICAgICBpZiAodmFyeUhlYWRlci5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdmFyeUhlYWRlci5hcHBlbmQoJywnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdmFyeUhlYWRlci5hcHBlbmQodik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFyeVZhbHVlID0gdmFyeUhlYWRlci50b1N0cmluZygpOworICAgICAgICAgICAgaWYgKCF2YXJ5VmFsdWUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgdmFyeUhlYWRlclZhbHVlLnNldCh2YXJ5VmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHZocy5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgIC5tYXAodmFyaWFudEhvbGRlciAtPiB2YXJpYW50SG9sZGVyLnYpCisgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvV3JpdGVySW50ZXJjZXB0b3JFeGVjdXRvci5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL1dyaXRlckludGVyY2VwdG9yRXhlY3V0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGU5NTY0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL1dyaXRlckludGVyY2VwdG9yRXhlY3V0b3IuamF2YQpAQCAtMCwwICsxLDI5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbVN1cHBvcnQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuUHJvcGVydGllc0RlbGVnYXRlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyU3VwcGxpZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5NZXNzYWdlQm9keVdvcmtlcnM7CisKKy8qKgorICogUmVwcmVzZW50cyB3cml0ZXIgaW50ZXJjZXB0b3IgY2hhaW4gZXhlY3V0b3IgZm9yIGJvdGggY2xpZW50IGFuZCBzZXJ2ZXIgc2lkZS4KKyAqIEl0IGNvbnN0cnVjdHMgd3JhcHBlZCBpbnRlcmNlcHRvciBjaGFpbiBhbmQgaW52b2tlcyBpdC4gQXQgdGhlIGVuZCBvZiB0aGUgY2hhaW4KKyAqIGEge0BsaW5rIE1lc3NhZ2VCb2R5V3JpdGVyIG1lc3NhZ2UgYm9keSB3cml0ZXJ9IGV4ZWN1dGlvbiBpbnRlcmNlcHRvciBpcyBpbnNlcnRlZCwKKyAqIHdoaWNoIHdyaXRlcyBlbnRpdHkgdG8gdGhlIG91dHB1dCBzdHJlYW0gcHJvdmlkZWQgYnkgdGhlIGNoYWluLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBXcml0ZXJJbnRlcmNlcHRvckV4ZWN1dG9yIGV4dGVuZHMgSW50ZXJjZXB0b3JFeGVjdXRvcjxXcml0ZXJJbnRlcmNlcHRvcj4KKyAgICAgICAgaW1wbGVtZW50cyBXcml0ZXJJbnRlcmNlcHRvckNvbnRleHQsIEluamVjdGlvbk1hbmFnZXJTdXBwbGllciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihXcml0ZXJJbnRlcmNlcHRvckV4ZWN1dG9yLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBwcml2YXRlIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW07CisgICAgcHJpdmF0ZSBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaGVhZGVyczsKKyAgICBwcml2YXRlIE9iamVjdCBlbnRpdHk7CisKKyAgICBwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPFdyaXRlckludGVyY2VwdG9yPiBpdGVyYXRvcjsKKyAgICBwcml2YXRlIGludCBwcm9jZXNzZWRDb3VudDsKKworICAgIHByaXZhdGUgZmluYWwgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyOworCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGV4ZWN1dG9yIHRvIHdyaXRlIGdpdmVuIHR5cGUgdG8gcHJvdmlkZWQge0BsaW5rIElucHV0U3RyZWFtIGVudGl0eVN0cmVhbX0uCisKKyAgICAgKgorICAgICAqIEBwYXJhbSBlbnRpdHkgZW50aXR5IG9iamVjdCB0byBiZSBwcm9jZXNzZWQuCisgICAgICogQHBhcmFtIHJhd1R5cGUgICAgIHJhdyBKYXZhIGVudGl0eSB0eXBlLgorICAgICAqIEBwYXJhbSB0eXBlICAgICAgICBnZW5lcmljIEphdmEgZW50aXR5IHR5cGUuCisgICAgICogQHBhcmFtIGFubm90YXRpb25zIGFycmF5IG9mIGFubm90YXRpb25zIG9uIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgYXJ0aWZhY3QKKyAgICAgKiAgICAgICAgICAgIHRoYXQgd2lsbCBiZSBpbml0aWFsaXplZCB3aXRoIHRoZSBwcm9kdWNlZCBpbnN0YW5jZS4gRS5nLiBpZiB0aGUgbWVzc2FnZQorICAgICAqICAgICAgICAgICAgYm9keSBpcyB0byBiZSBjb252ZXJ0ZWQgaW50byBhIG1ldGhvZCBwYXJhbWV0ZXIsIHRoaXMgd2lsbCBiZSB0aGUKKyAgICAgKiAgICAgICAgICAgIGFubm90YXRpb25zIG9uIHRoYXQgcGFyYW1ldGVyIHJldHVybmVkIGJ5CisgICAgICogICAgICAgICAgICB7QGNvZGUgTWV0aG9kLmdldFBhcmFtZXRlckFubm90YXRpb25zfS4KKyAgICAgKiBAcGFyYW0gbWVkaWFUeXBlIG1lZGlhIHR5cGUgb2YgdGhlIEhUVFAgZW50aXR5LgorICAgICAqIEBwYXJhbSBoZWFkZXJzIG11dGFibGUgSFRUUCBoZWFkZXJzIGFzc29jaWF0ZWQgd2l0aCBIVFRQIGVudGl0eS4KKyAgICAgKiBAcGFyYW0gcHJvcGVydGllc0RlbGVnYXRlIHJlcXVlc3Qtc2NvcGVkIHByb3BlcnRpZXMgZGVsZWdhdGUuCisgICAgICogQHBhcmFtIGVudGl0eVN0cmVhbSB7QGxpbmsgamF2YS5pby5JbnB1dFN0cmVhbX0gZnJvbSB3aGljaCBhbiBlbnRpdHkgd2lsbCBiZSByZWFkLiBUaGUgc3RyZWFtIGlzIG5vdAorICAgICAqICAgICAgICAgICAgY2xvc2VkIGFmdGVyIHJlYWRpbmcgdGhlIGVudGl0eS4KKyAgICAgKiBAcGFyYW0gd29ya2VycyB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5NZXNzYWdlQm9keVdvcmtlcnMgTWVzc2FnZSBib2R5IHdvcmtlcnN9LgorICAgICAqIEBwYXJhbSB3cml0ZXJJbnRlcmNlcHRvcnMgV3JpdGVyIGludGVyY2VwdG9ycyB0aGF0IGFyZSB0byBiZSB1c2VkIHRvIGludGVyY2VwdCB3cml0aW5nIG9mIGFuIGVudGl0eS4KKyAgICAgKiBAcGFyYW0gaW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb24gbWFuYWdlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgV3JpdGVySW50ZXJjZXB0b3JFeGVjdXRvcihmaW5hbCBPYmplY3QgZW50aXR5LCBmaW5hbCBDbGFzczw/PiByYXdUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBQcm9wZXJ0aWVzRGVsZWdhdGUgcHJvcGVydGllc0RlbGVnYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVzc2FnZUJvZHlXb3JrZXJzIHdvcmtlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSXRlcmFibGU8V3JpdGVySW50ZXJjZXB0b3I+IHdyaXRlckludGVyY2VwdG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIpIHsKKworICAgICAgICBzdXBlcihyYXdUeXBlLCB0eXBlLCBhbm5vdGF0aW9ucywgbWVkaWFUeXBlLCBwcm9wZXJ0aWVzRGVsZWdhdGUpOworICAgICAgICB0aGlzLmVudGl0eSA9IGVudGl0eTsKKyAgICAgICAgdGhpcy5oZWFkZXJzID0gaGVhZGVyczsKKyAgICAgICAgdGhpcy5vdXRwdXRTdHJlYW0gPSBlbnRpdHlTdHJlYW07CisgICAgICAgIHRoaXMuaW5qZWN0aW9uTWFuYWdlciA9IGluamVjdGlvbk1hbmFnZXI7CisKKyAgICAgICAgZmluYWwgTGlzdDxXcml0ZXJJbnRlcmNlcHRvcj4gZWZmZWN0aXZlSW50ZXJjZXB0b3JzID0gU3RyZWFtU3VwcG9ydC5zdHJlYW0od3JpdGVySW50ZXJjZXB0b3JzLnNwbGl0ZXJhdG9yKCksIGZhbHNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgICAgIGVmZmVjdGl2ZUludGVyY2VwdG9ycy5hZGQobmV3IFRlcm1pbmFsV3JpdGVySW50ZXJjZXB0b3Iod29ya2VycykpOworCisgICAgICAgIHRoaXMuaXRlcmF0b3IgPSBlZmZlY3RpdmVJbnRlcmNlcHRvcnMuaXRlcmF0b3IoKTsKKyAgICAgICAgdGhpcy5wcm9jZXNzZWRDb3VudCA9IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBuZXh0IHtAbGluayBXcml0ZXJJbnRlcmNlcHRvciBpbnRlcmNlcHRvcn0gaW4gdGhlIGNoYWluLiBTdGF0ZWZ1bCBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE5leHQgaW50ZXJjZXB0b3IuCisgICAgICovCisgICAgcHJpdmF0ZSBXcml0ZXJJbnRlcmNlcHRvciBnZXROZXh0SW50ZXJjZXB0b3IoKSB7CisgICAgICAgIGlmICghaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaXRlcmF0b3IubmV4dCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0cyB0aGUgaW50ZXJjZXB0b3IgY2hhaW4gZXhlY3V0aW9uLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyB2b2lkIHByb2NlZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBXcml0ZXJJbnRlcmNlcHRvciBuZXh0SW50ZXJjZXB0b3IgPSBnZXROZXh0SW50ZXJjZXB0b3IoKTsKKyAgICAgICAgaWYgKG5leHRJbnRlcmNlcHRvciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9JTlRFUkNFUFRPUl9XUklURVJfUFJPQ0VFRCgpKTsKKyAgICAgICAgfQorICAgICAgICB0cmFjZUJlZm9yZShuZXh0SW50ZXJjZXB0b3IsIE1zZ1RyYWNlRXZlbnQuV0lfQkVGT1JFKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5leHRJbnRlcmNlcHRvci5hcm91bmRXcml0ZVRvKHRoaXMpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcHJvY2Vzc2VkQ291bnQrKzsKKyAgICAgICAgICAgIHRyYWNlQWZ0ZXIobmV4dEludGVyY2VwdG9yLCBNc2dUcmFjZUV2ZW50LldJX0FGVEVSKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgZ2V0RW50aXR5KCkgeworICAgICAgICByZXR1cm4gZW50aXR5OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEVudGl0eShmaW5hbCBPYmplY3QgZW50aXR5KSB7CisgICAgICAgIHRoaXMuZW50aXR5ID0gZW50aXR5OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKCkgeworICAgICAgICByZXR1cm4gdGhpcy5vdXRwdXRTdHJlYW07CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0T3V0cHV0U3RyZWFtKGZpbmFsIE91dHB1dFN0cmVhbSBvcykgeworICAgICAgICB0aGlzLm91dHB1dFN0cmVhbSA9IG9zOworCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBnZXRIZWFkZXJzKCkgeworICAgICAgICByZXR1cm4gdGhpcy5oZWFkZXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBudW1iZXIgb2YgcHJvY2Vzc2VkIGludGVyY2VwdG9ycy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIHByb2Nlc3NlZCBpbnRlcmNlcHRvcnMuCisgICAgICovCisgICAgaW50IGdldFByb2Nlc3NlZENvdW50KCkgeworICAgICAgICByZXR1cm4gcHJvY2Vzc2VkQ291bnQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEluamVjdGlvbk1hbmFnZXIgZ2V0SW5qZWN0aW9uTWFuYWdlcigpIHsKKyAgICAgICAgcmV0dXJuIGluamVjdGlvbk1hbmFnZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVybWluYWwgd3JpdGVyIGludGVyY2VwdG9yIHdoaWNoIGNob29zZSB0aGUgYXBwcm9wcmlhdGUge0BsaW5rIE1lc3NhZ2VCb2R5V3JpdGVyfQorICAgICAqIGFuZCB3cml0ZXMgdGhlIGVudGl0eSB0byB0aGUgb3V0cHV0IHN0cmVhbS4gVGhlIG9yZGVyIG9mIGFjdGlvbnMgaXMgdGhlIGZvbGxvd2luZzogPGJyPgorICAgICAqIDEuIGNob29zZSB0aGUgYXBwcm9wcmlhdGUge0BsaW5rIE1lc3NhZ2VCb2R5V3JpdGVyfSA8YnI+CisgICAgICogMi4gaWYgY2FsbGJhY2sgaXMgZGVmaW5lZCB0aGVuIGl0IHJldHJpZXZlcyBzaXplIGFuZCBwYXNzZXMgaXQgdG8gdGhlIGNhbGxiYWNrIDxicj4KKyAgICAgKiAzLiB3cml0ZXMgdGhlIGVudGl0eSB0byB0aGUgb3V0cHV0IHN0cmVhbSA8YnI+CisgICAgICoKKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIFRlcm1pbmFsV3JpdGVySW50ZXJjZXB0b3IgaW1wbGVtZW50cyBXcml0ZXJJbnRlcmNlcHRvciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgTWVzc2FnZUJvZHlXb3JrZXJzIHdvcmtlcnM7CisKKyAgICAgICAgVGVybWluYWxXcml0ZXJJbnRlcmNlcHRvcihmaW5hbCBNZXNzYWdlQm9keVdvcmtlcnMgd29ya2VycykgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgICAgIHRoaXMud29ya2VycyA9IHdvcmtlcnM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgIHB1YmxpYyB2b2lkIGFyb3VuZFdyaXRlVG8oZmluYWwgV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcHJvY2Vzc2VkQ291bnQtLTsgLy90aGlzIGlzIG5vdCByZWd1bGFyIGludGVyY2VwdG9yIC0+IGNvdW50IGRvd24KKworICAgICAgICAgICAgdHJhY2VCZWZvcmUobnVsbCwgTXNnVHJhY2VFdmVudC5XSV9CRUZPUkUpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmaW5hbCBUcmFjaW5nTG9nZ2VyIHRyYWNpbmdMb2dnZXIgPSBnZXRUcmFjaW5nTG9nZ2VyKCk7CisgICAgICAgICAgICAgICAgaWYgKHRyYWNpbmdMb2dnZXIuaXNMb2dFbmFibGVkKE1zZ1RyYWNlRXZlbnQuTUJXX0ZJTkQpKSB7CisgICAgICAgICAgICAgICAgICAgIHRyYWNpbmdMb2dnZXIubG9nKE1zZ1RyYWNlRXZlbnQuTUJXX0ZJTkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRUeXBlKCkuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb250ZXh0LmdldEdlbmVyaWNUeXBlKCkgaW5zdGFuY2VvZiBDbGFzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoKENsYXNzKSBjb250ZXh0LmdldEdlbmVyaWNUeXBlKCkpLmdldE5hbWUoKSA6IGNvbnRleHQuZ2V0R2VuZXJpY1R5cGUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRNZWRpYVR5cGUoKSwgamF2YS51dGlsLkFycmF5cy50b1N0cmluZyhjb250ZXh0LmdldEFubm90YXRpb25zKCkpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmaW5hbCBNZXNzYWdlQm9keVdyaXRlciB3cml0ZXIgPSB3b3JrZXJzLmdldE1lc3NhZ2VCb2R5V3JpdGVyKGNvbnRleHQuZ2V0VHlwZSgpLCBjb250ZXh0LmdldEdlbmVyaWNUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldEFubm90YXRpb25zKCksIGNvbnRleHQuZ2V0TWVkaWFUeXBlKCksIFdyaXRlckludGVyY2VwdG9yRXhlY3V0b3IudGhpcyk7CisKKyAgICAgICAgICAgICAgICBpZiAod3JpdGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5TRVZFUkUsIExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX05PVEZPVU5EX01FU1NBR0VCT0RZV1JJVEVSKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0TWVkaWFUeXBlKCksIGNvbnRleHQuZ2V0VHlwZSgpLCBjb250ZXh0LmdldEdlbmVyaWNUeXBlKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1lc3NhZ2VCb2R5UHJvdmlkZXJOb3RGb3VuZEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9OT1RGT1VORF9NRVNTQUdFQk9EWVdSSVRFUigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldE1lZGlhVHlwZSgpLCBjb250ZXh0LmdldFR5cGUoKSwgY29udGV4dC5nZXRHZW5lcmljVHlwZSgpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGludm9rZVdyaXRlVG8oY29udGV4dCwgd3JpdGVyKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgY2xlYXJMYXN0VHJhY2VkSW50ZXJjZXB0b3IoKTsKKyAgICAgICAgICAgICAgICB0cmFjZUFmdGVyKG51bGwsIE1zZ1RyYWNlRXZlbnQuV0lfQUZURVIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgIHByaXZhdGUgdm9pZCBpbnZva2VXcml0ZVRvKGZpbmFsIFdyaXRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0LCBmaW5hbCBNZXNzYWdlQm9keVdyaXRlciB3cml0ZXIpCisgICAgICAgICAgICAgICAgdGhyb3dzIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBUcmFjaW5nTG9nZ2VyIHRyYWNpbmdMb2dnZXIgPSBnZXRUcmFjaW5nTG9nZ2VyKCk7CisgICAgICAgICAgICBmaW5hbCBsb25nIHRpbWVzdGFtcCA9IHRyYWNpbmdMb2dnZXIudGltZXN0YW1wKE1zZ1RyYWNlRXZlbnQuTUJXX1dSSVRFX1RPKTsKKyAgICAgICAgICAgIGZpbmFsIFVuQ2xvc2VhYmxlT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSA9IG5ldyBVbkNsb3NlYWJsZU91dHB1dFN0cmVhbShjb250ZXh0LmdldE91dHB1dFN0cmVhbSgpLCB3cml0ZXIpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZVRvKGNvbnRleHQuZ2V0RW50aXR5KCksIGNvbnRleHQuZ2V0VHlwZSgpLCBjb250ZXh0LmdldEdlbmVyaWNUeXBlKCksIGNvbnRleHQuZ2V0QW5ub3RhdGlvbnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZ2V0TWVkaWFUeXBlKCksIGNvbnRleHQuZ2V0SGVhZGVycygpLCBlbnRpdHlTdHJlYW0pOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICB0cmFjaW5nTG9nZ2VyLmxvZ0R1cmF0aW9uKE1zZ1RyYWNlRXZlbnQuTUJXX1dSSVRFX1RPLCB0aW1lc3RhbXAsIHdyaXRlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyfXMgc2hvdWxkIG5vdCBjbG9zZSB0aGUgZ2l2ZW4ge0BsaW5rIGphdmEuaW8uT3V0cHV0U3RyZWFtIHN0cmVhbX0uIFRoaXMgb3V0cHV0CisgICAgICogc3RyZWFtIG1ha2VzIHN1cmUgdGhhdCB0aGUgc3RyZWFtIGlzIG5vdCBjbG9zZWQgZXZlbiBpZiBNQlcgdHJpZXMgdG8gZG8gaXQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVW5DbG9zZWFibGVPdXRwdXRTdHJlYW0gZXh0ZW5kcyBPdXRwdXRTdHJlYW0geworCisgICAgICAgIHByaXZhdGUgZmluYWwgT3V0cHV0U3RyZWFtIG9yaWdpbmFsOworICAgICAgICBwcml2YXRlIGZpbmFsIE1lc3NhZ2VCb2R5V3JpdGVyIHdyaXRlcjsKKworICAgICAgICBwcml2YXRlIFVuQ2xvc2VhYmxlT3V0cHV0U3RyZWFtKGZpbmFsIE91dHB1dFN0cmVhbSBvcmlnaW5hbCwgZmluYWwgTWVzc2FnZUJvZHlXcml0ZXIgd3JpdGVyKSB7CisgICAgICAgICAgICB0aGlzLm9yaWdpbmFsID0gb3JpZ2luYWw7CisgICAgICAgICAgICB0aGlzLndyaXRlciA9IHdyaXRlcjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShmaW5hbCBpbnQgaSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIG9yaWdpbmFsLndyaXRlKGkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKGZpbmFsIGJ5dGVbXSBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgb3JpZ2luYWwud3JpdGUoYik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoZmluYWwgYnl0ZVtdIGIsIGZpbmFsIGludCBvZmYsIGZpbmFsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBvcmlnaW5hbC53cml0ZShiLCBvZmYsIGxlbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgb3JpZ2luYWwuZmx1c2goKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoTE9HR0VSLmlzTG9nZ2FibGUoTGV2ZWwuRklORSkpIHsKKyAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLkZJTkUsIExvY2FsaXphdGlvbk1lc3NhZ2VzLk1CV19UUllJTkdfVE9fQ0xPU0VfU1RSRUFNKHdyaXRlci5nZXRDbGFzcygpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvcGFja2FnZS1pbmZvLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFlMGZkMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvKioKKyAqIENvbW1vbiBKZXJzZXkgaW50ZXJuYWwgbWVzc2FnaW5nIGNsYXNzZXMuCisgKi8KK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbDsKZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9wYWNrYWdlLWluZm8uamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTQ1NDNhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKKy8qKgorICogQ29tbW9uIEplcnNleSBtZXNzYWdpbmcgY2xhc3Nlcy4KKyAqLworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlOwpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tb2RlbC9Db250cmFjdFByb3ZpZGVyLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21vZGVsL0NvbnRyYWN0UHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTQ3OWVlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tb2RlbC9Db250cmFjdFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwzMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubW9kZWw7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworLyoqCisgKiBKZXJzZXkgY29udHJhY3QgcHJvdmlkZXIgbW9kZWwuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIENvbnRyYWN0UHJvdmlkZXIgaW1wbGVtZW50cyBTY29wZWQsIE5hbWVCb3VuZCB7CisgICAgLyoqCisgICAgICogIk5vIHByaW9yaXR5IiBjb25zdGFudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOT19QUklPUklUWSA9IC0xOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyBjb250cmFjdCBwcm92aWRlciBtb2RlbCBidWlsZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGltcGxlbWVudGF0aW9uQ2xhc3MgY2xhc3Mgd2hpY2ggdGhlIGNvbnRyYWN0cyBiZWxvbmcgdG8uCisgICAgICogQHJldHVybiBuZXcgY29udHJhY3QgcHJvdmlkZXIgYnVpbGRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgYnVpbGRlcihDbGFzczw/PiBpbXBsZW1lbnRhdGlvbkNsYXNzKSB7CisgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihpbXBsZW1lbnRhdGlvbkNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IGNvbnRyYWN0IHByb3ZpZGVyIG1vZGVsIGJ1aWxkZXIgZnJvbSBhbiBleGlzdGluZyBvbmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3JpZ2luYWwgZXhpc3RpbmcgY29udHJhY3QgcHJvdmlkZXIgbW9kZWwuCisgICAgICogQHJldHVybiBuZXcgY29udHJhY3QgcHJvdmlkZXIgYnVpbGRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgYnVpbGRlcihmaW5hbCBDb250cmFjdFByb3ZpZGVyIG9yaWdpbmFsKSB7CisgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihvcmlnaW5hbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udHJhY3QgcHJvdmlkZXIgbW9kZWwgYnVpbGRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgeworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbnRyYWN0UHJvdmlkZXIgRU1QVFlfTU9ERUwgPQorICAgICAgICAgICAgICAgIG5ldyBDb250cmFjdFByb3ZpZGVyKG51bGwsIFNpbmdsZXRvbi5jbGFzcywgQ29sbGVjdGlvbnMuZW1wdHlNYXAoKSwgTk9fUFJJT1JJVFksIENvbGxlY3Rpb25zLmVtcHR5U2V0KCkpOworCisgICAgICAgIHByaXZhdGUgQ2xhc3M8Pz4gaW1wbGVtZW50YXRpb25DbGFzcyA9IG51bGw7CisgICAgICAgIHByaXZhdGUgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IHNjb3BlID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBNYXA8Q2xhc3M8Pz4sIEludGVnZXI+IGNvbnRyYWN0cyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgcHJpdmF0ZSBpbnQgZGVmYXVsdFByaW9yaXR5ID0gTk9fUFJJT1JJVFk7CisgICAgICAgIHByaXZhdGUgU2V0PENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPj4gbmFtZUJpbmRpbmdzID0gQ29sbGVjdGlvbnMubmV3U2V0RnJvbU1hcChuZXcgSWRlbnRpdHlIYXNoTWFwPD4oKSk7CisKKyAgICAgICAgcHJpdmF0ZSBCdWlsZGVyKENsYXNzPD8+IGltcGxlbWVudGF0aW9uQ2xhc3MpIHsKKyAgICAgICAgICAgIHRoaXMuaW1wbGVtZW50YXRpb25DbGFzcyA9IGltcGxlbWVudGF0aW9uQ2xhc3M7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEJ1aWxkZXIoZmluYWwgQ29udHJhY3RQcm92aWRlciBvcmlnaW5hbCkgeworICAgICAgICAgICAgdGhpcy5pbXBsZW1lbnRhdGlvbkNsYXNzID0gb3JpZ2luYWwuaW1wbGVtZW50YXRpb25DbGFzczsKKyAgICAgICAgICAgIHRoaXMuc2NvcGUgPSBvcmlnaW5hbC5zY29wZTsKKyAgICAgICAgICAgIHRoaXMuY29udHJhY3RzLnB1dEFsbChvcmlnaW5hbC5jb250cmFjdHMpOworICAgICAgICAgICAgdGhpcy5kZWZhdWx0UHJpb3JpdHkgPSBvcmlnaW5hbC5kZWZhdWx0UHJpb3JpdHk7CisgICAgICAgICAgICB0aGlzLm5hbWVCaW5kaW5ncy5hZGRBbGwob3JpZ2luYWwubmFtZUJpbmRpbmdzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDaGFuZ2UgY29udHJhY3QgcHJvdmlkZXIgc2NvcGUuIChEZWZhdWx0IHNjb3BlIGlzIHtAbGluayBTaW5nbGV0b259LikKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHNjb3BlIGNvbnRyYWN0IHByb3ZpZGVyIHNjb3BlLgorICAgICAgICAgKiBAcmV0dXJuIHVwZGF0ZWQgYnVpbGRlci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNjb3BlKGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBzY29wZSkgeworICAgICAgICAgICAgdGhpcy5zY29wZSA9IHNjb3BlOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIGEgbmV3IHByb3ZpZGVkIGNvbnRyYWN0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29udHJhY3QgYWRkaXRpb25hbCBwcm92aWRlZCBjb250cmFjdC4KKyAgICAgICAgICogQHJldHVybiB1cGRhdGVkIGJ1aWxkZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRDb250cmFjdChmaW5hbCBDbGFzczw/PiBjb250cmFjdCkgeworICAgICAgICAgICAgcmV0dXJuIGFkZENvbnRyYWN0KGNvbnRyYWN0LCBkZWZhdWx0UHJpb3JpdHkpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBhIG5ldyBwcm92aWRlZCBjb250cmFjdCB3aXRoIHByaW9yaXR5LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29udHJhY3QgYWRkaXRpb25hbCBwcm92aWRlZCBjb250cmFjdC4KKyAgICAgICAgICogQHBhcmFtIHByaW9yaXR5IHByaW9yaXR5IGZvciB0aGUgY29udHJhY3QuCisgICAgICAgICAqIEByZXR1cm4gdXBkYXRlZCBidWlsZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkQ29udHJhY3QoZmluYWwgQ2xhc3M8Pz4gY29udHJhY3QsIGZpbmFsIGludCBwcmlvcml0eSkgeworICAgICAgICAgICAgY29udHJhY3RzLnB1dChjb250cmFjdCwgcHJpb3JpdHkpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIGEgbmV3IHByb3ZpZGVkIGNvbnRyYWN0cy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNvbnRyYWN0cyBhZGRpdGlvbmFsIHByb3ZpZGVkIGNvbnRyYWN0cy4KKyAgICAgICAgICogQHJldHVybiB1cGRhdGVkIGJ1aWxkZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRDb250cmFjdHMoZmluYWwgTWFwPENsYXNzPD8+LCBJbnRlZ2VyPiBjb250cmFjdHMpIHsKKyAgICAgICAgICAgIHRoaXMuY29udHJhY3RzLnB1dEFsbChjb250cmFjdHMpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIGEgbmV3IHByb3ZpZGVkIGNvbnRyYWN0cy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNvbnRyYWN0cyBhZGRpdGlvbmFsIHByb3ZpZGVkIGNvbnRyYWN0cy4KKyAgICAgICAgICogQHJldHVybiB1cGRhdGVkIGJ1aWxkZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRDb250cmFjdHMoZmluYWwgQ29sbGVjdGlvbjxDbGFzczw/Pj4gY29udHJhY3RzKSB7CisgICAgICAgICAgICBmb3IgKGZpbmFsIENsYXNzPD8+IGNvbnRyYWN0IDogY29udHJhY3RzKSB7CisgICAgICAgICAgICAgICAgYWRkQ29udHJhY3QoY29udHJhY3QsIGRlZmF1bHRQcmlvcml0eSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIGNvbnRyYWN0IGRlZmF1bHQgcHJvdmlkZXIgcHJpb3JpdHkuIChEZWZhdWx0IHZhbHVlIGlzIHtAbGluayBDb250cmFjdFByb3ZpZGVyI05PX1BSSU9SSVRZfSkKKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGRlZmF1bHRQcmlvcml0eSBkZWZhdWx0IGNvbnRyYWN0IHByb3ZpZGVyIHByaW9yaXR5LgorICAgICAgICAgKiBAcmV0dXJuIHVwZGF0ZWQgYnVpbGRlci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGRlZmF1bHRQcmlvcml0eShmaW5hbCBpbnQgZGVmYXVsdFByaW9yaXR5KSB7CisgICAgICAgICAgICB0aGlzLmRlZmF1bHRQcmlvcml0eSA9IGRlZmF1bHRQcmlvcml0eTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBhIG5ldyBjb250cmFjdCBwcm92aWRlciBuYW1lIGJpbmRpbmcuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBiaW5kaW5nIG5hbWUgYmluZGluZy4KKyAgICAgICAgICogQHJldHVybiB1cGRhdGVkIGJ1aWxkZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGROYW1lQmluZGluZyhmaW5hbCBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gYmluZGluZykgeworICAgICAgICAgICAgdGhpcy5uYW1lQmluZGluZ3MuYWRkKGJpbmRpbmcpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBzY29wZSBvZiB0aGUgYnVpbHQgY29udHJhY3QgcHJvdmlkZXIgbW9kZWwuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gc2NvcGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBtb2RlbCBvciB7QGNvZGUgbnVsbH0gaWYgbm8gc2NvcGUKKyAgICAgICAgICogaGFzIGJlZW4gc2V0IGV4cGxpY2l0bHkuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGdldFNjb3BlKCkgeworICAgICAgICAgICAgcmV0dXJuIHNjb3BlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgbWFwIG9mIGNvbnRyYWN0cyBmb3IgdGhlIGJ1aWx0IGNvbnRyYWN0IHByb3ZpZGVyIG1vZGVsLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIGNvbnRyYWN0cyBhc3NvY2lhdGVkIHdpdGggdGhlIG1vZGVsLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE1hcDxDbGFzczw/PiwgSW50ZWdlcj4gZ2V0Q29udHJhY3RzKCkgeworICAgICAgICAgICAgcmV0dXJuIGNvbnRyYWN0czsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIGRlZmF1bHQgcHJpb3JpdHkgb2YgdGhlIGJ1aWx0IGNvbnRyYWN0IHByb3ZpZGVyIG1vZGVsLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIGRlZmF1bHQgcHJpb3JpdHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBtb2RlbC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0RGVmYXVsdFByaW9yaXR5KCkgeworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRQcmlvcml0eTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgbmFtZSBiaW5kaW5ncyBvZiB0aGUgYnVpbHQgY29udHJhY3QgcHJvdmlkZXIgbW9kZWwuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gbmFtZSBiaW5kaW5ncyBhc3NvY2lhdGVkIHdpdGggdGhlIG1vZGVsLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFNldDxDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4+IGdldE5hbWVCaW5kaW5ncygpIHsKKyAgICAgICAgICAgIHJldHVybiBuYW1lQmluZGluZ3M7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQnVpbGQgYSBuZXcgY29udHJhY3QgcHJvdmlkZXIgbW9kZWwuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gbmV3IGNvbnRyYWN0IHByb3ZpZGVyIG1vZGVsLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIENvbnRyYWN0UHJvdmlkZXIgYnVpbGQoKSB7CisgICAgICAgICAgICBpZiAoc2NvcGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNjb3BlID0gU2luZ2xldG9uLmNsYXNzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBNYXA8Q2xhc3M8Pz4sIEludGVnZXI+IF9jb250cmFjdHMgPSAoY29udHJhY3RzLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICAgICAgPyBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpCisgICAgICAgICAgICAgICAgICAgIDogY29udHJhY3RzLmVudHJ5U2V0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTWFwKChGdW5jdGlvbjxNYXAuRW50cnk8Q2xhc3M8Pz4sIEludGVnZXI+LCBDbGFzczw/Pj4pIE1hcC5FbnRyeTo6Z2V0S2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NJbnRlZ2VyRW50cnkgLT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIgcHJpb3JpdHkgPSBjbGFzc0ludGVnZXJFbnRyeS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocHJpb3JpdHkgIT0gTk9fUFJJT1JJVFkpID8gcHJpb3JpdHkgOiBkZWZhdWx0UHJpb3JpdHk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CisKKyAgICAgICAgICAgIGZpbmFsIFNldDxDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4+IGJpbmRpbmdzID0gKG5hbWVCaW5kaW5ncy5pc0VtcHR5KCkpCisgICAgICAgICAgICAgICAgICAgID8gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSA6IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChuYW1lQmluZGluZ3MpOworCisgICAgICAgICAgICBpZiAoaW1wbGVtZW50YXRpb25DbGFzcyA9PSBudWxsICYmIHNjb3BlID09IFNpbmdsZXRvbi5jbGFzcyAmJiBfY29udHJhY3RzLmlzRW1wdHkoKSAmJiBkZWZhdWx0UHJpb3JpdHkgPT0gTk9fUFJJT1JJVFkKKyAgICAgICAgICAgICAgICAgICAgJiYgYmluZGluZ3MuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVNUFRZX01PREVMOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbmV3IENvbnRyYWN0UHJvdmlkZXIoaW1wbGVtZW50YXRpb25DbGFzcywgc2NvcGUsIF9jb250cmFjdHMsIGRlZmF1bHRQcmlvcml0eSwgYmluZGluZ3MpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBDbGFzczw/PiBpbXBsZW1lbnRhdGlvbkNsYXNzOworICAgIHByaXZhdGUgZmluYWwgTWFwPENsYXNzPD8+LCBJbnRlZ2VyPiBjb250cmFjdHM7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgZGVmYXVsdFByaW9yaXR5OworICAgIHByaXZhdGUgZmluYWwgU2V0PENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPj4gbmFtZUJpbmRpbmdzOworICAgIHByaXZhdGUgZmluYWwgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IHNjb3BlOworCisgICAgcHJpdmF0ZSBDb250cmFjdFByb3ZpZGVyKAorICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gaW1wbGVtZW50YXRpb25DbGFzcywKKyAgICAgICAgICAgIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBzY29wZSwKKyAgICAgICAgICAgIGZpbmFsIE1hcDxDbGFzczw/PiwgSW50ZWdlcj4gY29udHJhY3RzLAorICAgICAgICAgICAgZmluYWwgaW50IGRlZmF1bHRQcmlvcml0eSwKKyAgICAgICAgICAgIGZpbmFsIFNldDxDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4+IG5hbWVCaW5kaW5ncykgeworCisgICAgICAgIHRoaXMuaW1wbGVtZW50YXRpb25DbGFzcyA9IGltcGxlbWVudGF0aW9uQ2xhc3M7CisgICAgICAgIHRoaXMuc2NvcGUgPSBzY29wZTsKKyAgICAgICAgdGhpcy5jb250cmFjdHMgPSBjb250cmFjdHM7CisgICAgICAgIHRoaXMuZGVmYXVsdFByaW9yaXR5ID0gZGVmYXVsdFByaW9yaXR5OworICAgICAgICB0aGlzLm5hbWVCaW5kaW5ncyA9IG5hbWVCaW5kaW5nczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGdldFNjb3BlKCkgeworICAgICAgICByZXR1cm4gc2NvcGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyB3aGljaCB0aGUgY29udHJhY3RzIGJlbG9uZyB0by4KKyAgICAgKgorICAgICAqIEByZXR1cm4gaW1wbGVtZW50YXRpb24gY2xhc3MuCisgICAgICovCisgICAgcHVibGljIENsYXNzPD8+IGdldEltcGxlbWVudGF0aW9uQ2xhc3MoKSB7CisgICAgICAgIHJldHVybiBpbXBsZW1lbnRhdGlvbkNsYXNzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBwcm92aWRlZCBjb250cmFjdHMgcmVjb2duaXplZCBieSBKZXJzZXkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHByb3ZpZGVkIGNvbnRyYWN0cy4KKyAgICAgKgorICAgICAqIEBzZWUgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLkNvbnRyYWN0CisgICAgICovCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q29udHJhY3RzKCkgeworICAgICAgICByZXR1cm4gY29udHJhY3RzLmtleVNldCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbWFwIG9mIGNvbnRyYWN0cyBhbmQgdGhlaXIgcHJpb3JpdGllcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gY29udHJhY3RzIGFuZCB0aGVpciBwcmlvcml0aWVzLgorICAgICAqLworICAgIHB1YmxpYyBNYXA8Q2xhc3M8Pz4sIEludGVnZXI+IGdldENvbnRyYWN0TWFwKCkgeworICAgICAgICByZXR1cm4gY29udHJhY3RzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzTmFtZUJvdW5kKCkgeworICAgICAgICByZXR1cm4gIW5hbWVCaW5kaW5ncy5pc0VtcHR5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBwcm92aWRlciBjb250cmFjdCBwcmlvcml0eSwgaWYgc2V0LCBkZWZhdWx0IGNvbXBvbmVudCBwcm92aWRlciwgaWYgbm90IHNldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250cmFjdCBwcm92aWRlciBjb250cmFjdC4KKyAgICAgKiBAcmV0dXJuIHByb3ZpZGVyIHByaW9yaXR5LgorICAgICAqCisgICAgICogQHNlZSBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5CisgICAgICovCisgICAgcHVibGljIGludCBnZXRQcmlvcml0eShmaW5hbCBDbGFzczw/PiBjb250cmFjdCkgeworICAgICAgICBpZiAoY29udHJhY3RzLmNvbnRhaW5zS2V5KGNvbnRyYWN0KSkgeworICAgICAgICAgICAgcmV0dXJuIGNvbnRyYWN0cy5nZXQoY29udHJhY3QpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBkZWZhdWx0UHJpb3JpdHk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4+IGdldE5hbWVCaW5kaW5ncygpIHsKKyAgICAgICAgcmV0dXJuIG5hbWVCaW5kaW5nczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21vZGVsL05hbWVCb3VuZC5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tb2RlbC9OYW1lQm91bmQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmZhNzU0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tb2RlbC9OYW1lQm91bmQuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1vZGVsOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworLyoqCisgKiBNb2RlbCBjb21wb25lbnQgdGhhdCBjYW4gYmUgbmFtZSBib3VuZC4KKyAqCisgKiBBIGNvbXBvbmVudCBpbXBsZW1lbnRpbmcgdGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dAorICogdGhlIG5hbWUgYmluZGluZ3MgYXR0YWNoZWQgdG8gaXQuCisgKgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKiBAc2VlIGphdmF4LndzLnJzLk5hbWVCaW5kaW5nCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTmFtZUJvdW5kIHsKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiB0aGUgY29tcG9uZW50IGlzIGJvdW5kIG9yIG5vdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBjb21wb25lbnQgaXMgYm91bmQsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTmFtZUJvdW5kKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNvbGxlY3Rpb24gb2YgbmFtZSBiaW5kaW5ncyBhdHRhY2hlZCB0byB0aGlzIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gY29sbGVjdGlvbiBvZiBuYW1lIGJpbmRpbmcgYW5ub3RhdGlvbiB0eXBlcy4KKyAgICAgKi8KKyAgICBDb2xsZWN0aW9uPENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPj4gZ2V0TmFtZUJpbmRpbmdzKCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21vZGVsL1Njb3BlZC5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tb2RlbC9TY29wZWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTRiNDllCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tb2RlbC9TY29wZWQuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1vZGVsOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKKworLyoqCisgKiBTY29wZWQgSmVyc2V5IGFwcGxpY2F0aW9uIG1vZGVsIGNvbXBvbmVudC4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgaW50ZXJmYWNlIFNjb3BlZCB7CisgICAgLyoqCisgICAgICogR2V0IG1vZGVsIGNvbXBvbmVudCBzY29wZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbW9kZWwgY29tcG9uZW50IHNjb3BlLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gZ2V0U2NvcGUoKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbW9kZWwvaW50ZXJuYWwvQ29tbW9uQ29uZmlnLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21vZGVsL2ludGVybmFsL0NvbW1vbkNvbmZpZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkZWRiODAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21vZGVsL2ludGVybmFsL0NvbW1vbkNvbmZpZy5qYXZhCkBAIC0wLDAgKzEsNzM3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1vZGVsLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3RyYWluZWRUbzsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcmlvcml0aWVzOworaW1wb3J0IGphdmF4LndzLnJzLlJ1bnRpbWVUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlQ29udGV4dDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJpb3JpdHk7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5FeHRlbmRlZENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5TZXJ2aWNlRmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5CaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkNvbXBvc2l0ZUJpbmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5zcGkuQXV0b0Rpc2NvdmVyYWJsZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5zcGkuRm9yY2VkQXV0b0Rpc2NvdmVyYWJsZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlByb3BlcnRpZXNIZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW9kZWwuQ29udHJhY3RQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLkluZmxlY3RvcjsKKworLyoqCisgKiBDb21tb24gaW1tdXRhYmxlIHtAbGluayBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb259IGltcGxlbWVudGF0aW9uIGZvcgorICogc2VydmVyIGFuZCBjbGllbnQuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQ29tbW9uQ29uZmlnIGltcGxlbWVudHMgRmVhdHVyZUNvbnRleHQsIEV4dGVuZGVkQ29uZmlnIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKENvbW1vbkNvbmZpZy5jbGFzcy5nZXROYW1lKCkpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZ1bmN0aW9uPE9iamVjdCwgQmluZGVyPiBDQVNUX1RPX0JJTkRFUiA9IEJpbmRlci5jbGFzczo6Y2FzdDsKKworICAgIC8qKgorICAgICAqIENvbmZpZ3VyYXRpb24gcnVudGltZSB0eXBlLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgUnVudGltZVR5cGUgdHlwZTsKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmF0aW9uIHByb3BlcnRpZXMgY29sbGVjdGlvbiBhbmQgaXQncyBpbW11dGFibGUgdmlld3MuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXM7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IGltbXV0YWJsZVByb3BlcnRpZXNWaWV3OworICAgIHByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IGltbXV0YWJsZVByb3BlcnR5TmFtZXM7CisgICAgLyoqCisgICAgICogQ29uZmlndXJlZCBwcm92aWRlcnMsIGRvZXMgbm90IGluY2x1ZGUgZmVhdHVyZXMgYW5kIGJpbmRlcnMuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBDb21wb25lbnRCYWcgY29tcG9uZW50QmFnOworICAgIC8qKgorICAgICAqIENvbGxlY3Rpb24gb2YgdW5wcm9jZXNzZWQgZmVhdHVyZSByZWdpc3RyYXRpb25zLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgTGlzdDxGZWF0dXJlUmVnaXN0cmF0aW9uPiBuZXdGZWF0dXJlUmVnaXN0cmF0aW9uczsKKyAgICAvKioKKyAgICAgKiBDb2xsZWN0aW9uIG9mIGVuYWJsZWQgZmVhdHVyZSBjbGFzc2VzLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgU2V0PENsYXNzPD8gZXh0ZW5kcyBGZWF0dXJlPj4gZW5hYmxlZEZlYXR1cmVDbGFzc2VzOworICAgIC8qKgorICAgICAqIENvbGxlY3Rpb24gb2YgZW5hYmxlZCBmZWF0dXJlIGluc3RhbmNlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIFNldDxGZWF0dXJlPiBlbmFibGVkRmVhdHVyZXM7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIGRldGVybWluaW5nIHdoZXRoZXIgdGhlIGNvbmZpZ3VyYXRpb24gb2YgbWV0YS1wcm92aWRlcnMgKGV4Y2wuIGJpbmRlcnMpIHNob3VsZCBiZSBkaXNhYmxlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gZGlzYWJsZU1ldGFQcm92aWRlckNvbmZpZ3VyYXRpb247CisKKyAgICAvKioKKyAgICAgKiBBIHNpbmdsZSBmZWF0dXJlIHJlZ2lzdHJhdGlvbiByZWNvcmQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgRmVhdHVyZVJlZ2lzdHJhdGlvbiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDbGFzczw/IGV4dGVuZHMgRmVhdHVyZT4gZmVhdHVyZUNsYXNzOworICAgICAgICBwcml2YXRlIGZpbmFsIEZlYXR1cmUgZmVhdHVyZTsKKworICAgICAgICBwcml2YXRlIEZlYXR1cmVSZWdpc3RyYXRpb24oZmluYWwgQ2xhc3M8PyBleHRlbmRzIEZlYXR1cmU+IGZlYXR1cmVDbGFzcykgeworICAgICAgICAgICAgdGhpcy5mZWF0dXJlQ2xhc3MgPSBmZWF0dXJlQ2xhc3M7CisgICAgICAgICAgICB0aGlzLmZlYXR1cmUgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBGZWF0dXJlUmVnaXN0cmF0aW9uKGZpbmFsIEZlYXR1cmUgZmVhdHVyZSkgeworICAgICAgICAgICAgdGhpcy5mZWF0dXJlQ2xhc3MgPSBmZWF0dXJlLmdldENsYXNzKCk7CisgICAgICAgICAgICB0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgcmVnaXN0ZXJlZCBmZWF0dXJlIGNsYXNzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHJlZ2lzdGVyZWQgZmVhdHVyZSBjbGFzcy4KKyAgICAgICAgICovCisgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBGZWF0dXJlPiBnZXRGZWF0dXJlQ2xhc3MoKSB7CisgICAgICAgICAgICByZXR1cm4gZmVhdHVyZUNsYXNzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgcmVnaXN0ZXJlZCBmZWF0dXJlIGluc3RhbmNlIG9yIHtAY29kZSBudWxsfSBpZiB0aGlzIGlzIGEKKyAgICAgICAgICogY2xhc3MgYmFzZWQgZmVhdHVyZSByZWdpc3RyYXRpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gdGhlIHJlZ2lzdGVyZWQgZmVhdHVyZSBpbnN0YW5jZSBvciB7QGNvZGUgbnVsbH0gaWYgdGhpcyBpcyBhCisgICAgICAgICAqICAgICAgICAgY2xhc3MgYmFzZWQgZmVhdHVyZSByZWdpc3RyYXRpb24uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgRmVhdHVyZSBnZXRGZWF0dXJlKCkgeworICAgICAgICAgICAgcmV0dXJuIGZlYXR1cmU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvYmopIHsKKyAgICAgICAgICAgIGlmICh0aGlzID09IG9iaikgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgRmVhdHVyZVJlZ2lzdHJhdGlvbikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBGZWF0dXJlUmVnaXN0cmF0aW9uIG90aGVyID0gKEZlYXR1cmVSZWdpc3RyYXRpb24pIG9iajsKKworICAgICAgICAgICAgcmV0dXJuIChmZWF0dXJlQ2xhc3MgPT0gb3RoZXIuZmVhdHVyZUNsYXNzKQorICAgICAgICAgICAgICAgICAgICB8fCAoZmVhdHVyZSAhPSBudWxsICYmIChmZWF0dXJlID09IG90aGVyLmZlYXR1cmUgfHwgZmVhdHVyZS5lcXVhbHMob3RoZXIuZmVhdHVyZSkpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgaW50IGhhc2ggPSA0NzsKKyAgICAgICAgICAgIGhhc2ggPSAxMyAqIGhhc2ggKyAoZmVhdHVyZSAhPSBudWxsID8gZmVhdHVyZS5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgICAgICBoYXNoID0gMTMgKiBoYXNoICsgKGZlYXR1cmVDbGFzcyAhPSBudWxsID8gZmVhdHVyZUNsYXNzLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgICAgIHJldHVybiBoYXNoOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IHtAY29kZSBSdW50aW1lQ29uZmlnfSBpbnN0YW5jZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY29uc3RydWN0b3IgcHJvdmlkZXMgYSB3YXkgZm9yIGRlZmluaW5nIGEge0BsaW5rIENvbnRyYWN0UHJvdmlkZXIgY29udHJhY3QKKyAgICAgKiBwcm92aWRlciBtb2RlbH0gcmVnaXN0cmF0aW9uIHN0cmF0ZWd5LiBPbmNlIGEgcmVnaXN0cmF0aW9uIG1vZGVsIGlzIGJ1aWx0CisgICAgICogZm9yIGEgbmV3bHkgcmVnaXN0ZXJlZCBjb250cmFjdCwgdGhlIHByb3ZpZGVkIHJlZ2lzdHJhdGlvbiBzdHJhdGVneSBmaWx0ZXIgaXMKKyAgICAgKiBjb25zdWx0ZWQgd2hldGhlciB0aGUgbW9kZWwgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgb3Igbm90LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBDbGllbnRzIGNhbiB1c2UgdGhlIG1ldGhvZCB0byBjYW5jZWwgYW55IGNvbnRyYWN0IHByb3ZpZGVyIG1vZGVsIHJlZ2lzdHJhdGlvbgorICAgICAqIHRoYXQgZG9lcyBub3QgbWVldCB0aGUgY3JpdGVyaWEgb2YgYSBnaXZlbiBjb25maWd1cmF0aW9uIGNvbnRleHQsIHN1Y2ggYXMgYSBtb2RlbAorICAgICAqIHRoYXQgZG9lcyBub3QgaGF2ZSBhbnkgcmVjb2duaXplZCBjb250cmFjdHMgYXNzb2NpYXRlZCB3aXRoIGl0LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIHJ1bnRpbWUgdHlwZS4KKyAgICAgKiBAcGFyYW0gcmVnaXN0cmF0aW9uU3RyYXRlZ3kgZnVuY3Rpb24gZHJpdmluZyB0aGUgZGVjaXNpb24gKGJhc2VkIG9uIHRoZSBpbnRyb3NwZWN0ZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0BsaW5rIENvbnRyYWN0UHJvdmlkZXIgY29udHJhY3QgcHJvdmlkZXIgbW9kZWx9KSB3aGV0aGVyCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIG5vdCBzaG91bGQgdGhlIGNvbXBvbmVudCBjbGFzcyByZWdpc3RyYXRpb24gY29udGludWUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG93YXJkcyBhIHN1Y2Nlc3NmdWwgY29tcGxldGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29tbW9uQ29uZmlnKGZpbmFsIFJ1bnRpbWVUeXBlIHR5cGUsIGZpbmFsIFByZWRpY2F0ZTxDb250cmFjdFByb3ZpZGVyPiByZWdpc3RyYXRpb25TdHJhdGVneSkgeworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworCisgICAgICAgIHRoaXMucHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgdGhpcy5pbW11dGFibGVQcm9wZXJ0aWVzVmlldyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChwcm9wZXJ0aWVzKTsKKyAgICAgICAgdGhpcy5pbW11dGFibGVQcm9wZXJ0eU5hbWVzID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbihwcm9wZXJ0aWVzLmtleVNldCgpKTsKKworICAgICAgICB0aGlzLmNvbXBvbmVudEJhZyA9IENvbXBvbmVudEJhZy5uZXdJbnN0YW5jZShyZWdpc3RyYXRpb25TdHJhdGVneSk7CisKKyAgICAgICAgdGhpcy5uZXdGZWF0dXJlUmVnaXN0cmF0aW9ucyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKworICAgICAgICB0aGlzLmVuYWJsZWRGZWF0dXJlQ2xhc3NlcyA9IENvbGxlY3Rpb25zLm5ld1NldEZyb21NYXAobmV3IElkZW50aXR5SGFzaE1hcDw+KCkpOworICAgICAgICB0aGlzLmVuYWJsZWRGZWF0dXJlcyA9IG5ldyBIYXNoU2V0PD4oKTsKKworICAgICAgICB0aGlzLmRpc2FibGVNZXRhUHJvdmlkZXJDb25maWd1cmF0aW9uID0gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29weSBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25maWcgY29uZmlndXJhYmxlIHRvIGNvcHkgY2xhc3MgcHJvcGVydGllcyBmcm9tLgorICAgICAqLworICAgIHB1YmxpYyBDb21tb25Db25maWcoZmluYWwgQ29tbW9uQ29uZmlnIGNvbmZpZykgeworICAgICAgICB0aGlzLnR5cGUgPSBjb25maWcudHlwZTsKKworICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDw+KGNvbmZpZy5wcm9wZXJ0aWVzLnNpemUoKSk7CisgICAgICAgIHRoaXMuaW1tdXRhYmxlUHJvcGVydGllc1ZpZXcgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAodGhpcy5wcm9wZXJ0aWVzKTsKKyAgICAgICAgdGhpcy5pbW11dGFibGVQcm9wZXJ0eU5hbWVzID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbih0aGlzLnByb3BlcnRpZXMua2V5U2V0KCkpOworCisgICAgICAgIHRoaXMuY29tcG9uZW50QmFnID0gY29uZmlnLmNvbXBvbmVudEJhZy5jb3B5KCk7CisKKyAgICAgICAgdGhpcy5uZXdGZWF0dXJlUmVnaXN0cmF0aW9ucyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICAgICAgdGhpcy5lbmFibGVkRmVhdHVyZUNsYXNzZXMgPSBDb2xsZWN0aW9ucy5uZXdTZXRGcm9tTWFwKG5ldyBJZGVudGl0eUhhc2hNYXA8PigpKTsKKyAgICAgICAgdGhpcy5lbmFibGVkRmVhdHVyZXMgPSBuZXcgSGFzaFNldDw+KCk7CisKKyAgICAgICAgY29weShjb25maWcsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb3B5IGNvbmZpZyBwcm9wZXJ0aWVzLCBwcm92aWRlcnMgZnJvbSBnaXZlbiB7QGNvZGUgY29uZmlnfSB0byB0aGlzIGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZyBjb25maWd1cmFibGUgdG8gY29weSBjbGFzcyBwcm9wZXJ0aWVzIGZyb20uCisgICAgICogQHBhcmFtIGxvYWRDb21wb25lbnRCYWcge0Bjb2RlIHRydWV9IGlmIHRoZSBjb21wb25lbnQgYmFnIGZyb20gY29uZmlnIHNob3VsZCBiZSBjb3BpZWQgYXMgd2VsbCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNvcHkoZmluYWwgQ29tbW9uQ29uZmlnIGNvbmZpZywgZmluYWwgYm9vbGVhbiBsb2FkQ29tcG9uZW50QmFnKSB7CisgICAgICAgIHRoaXMucHJvcGVydGllcy5jbGVhcigpOworICAgICAgICB0aGlzLnByb3BlcnRpZXMucHV0QWxsKGNvbmZpZy5wcm9wZXJ0aWVzKTsKKworICAgICAgICB0aGlzLm5ld0ZlYXR1cmVSZWdpc3RyYXRpb25zLmNsZWFyKCk7CisgICAgICAgIHRoaXMubmV3RmVhdHVyZVJlZ2lzdHJhdGlvbnMuYWRkQWxsKGNvbmZpZy5uZXdGZWF0dXJlUmVnaXN0cmF0aW9ucyk7CisKKyAgICAgICAgdGhpcy5lbmFibGVkRmVhdHVyZUNsYXNzZXMuY2xlYXIoKTsKKyAgICAgICAgdGhpcy5lbmFibGVkRmVhdHVyZUNsYXNzZXMuYWRkQWxsKGNvbmZpZy5lbmFibGVkRmVhdHVyZUNsYXNzZXMpOworCisgICAgICAgIHRoaXMuZW5hYmxlZEZlYXR1cmVzLmNsZWFyKCk7CisgICAgICAgIHRoaXMuZW5hYmxlZEZlYXR1cmVzLmFkZEFsbChjb25maWcuZW5hYmxlZEZlYXR1cmVzKTsKKworICAgICAgICB0aGlzLmRpc2FibGVNZXRhUHJvdmlkZXJDb25maWd1cmF0aW9uID0gY29uZmlnLmRpc2FibGVNZXRhUHJvdmlkZXJDb25maWd1cmF0aW9uOworCisgICAgICAgIGlmIChsb2FkQ29tcG9uZW50QmFnKSB7CisgICAgICAgICAgICB0aGlzLmNvbXBvbmVudEJhZy5sb2FkRnJvbShjb25maWcuY29tcG9uZW50QmFnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBFeHRlbmRlZENvbmZpZyBnZXRDb25maWd1cmF0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUnVudGltZVR5cGUgZ2V0UnVudGltZVR5cGUoKSB7CisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFByb3BlcnRpZXMoKSB7CisgICAgICAgIHJldHVybiBpbW11dGFibGVQcm9wZXJ0aWVzVmlldzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBwcm9wZXJ0aWVzLmdldChuYW1lKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Byb3BlcnR5KGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBQcm9wZXJ0aWVzSGVscGVyLmlzUHJvcGVydHkoZ2V0UHJvcGVydHkobmFtZSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0UHJvcGVydHlOYW1lcygpIHsKKyAgICAgICAgcmV0dXJuIGltbXV0YWJsZVByb3BlcnR5TmFtZXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBGZWF0dXJlPiBmZWF0dXJlQ2xhc3MpIHsKKyAgICAgICAgcmV0dXJuIGVuYWJsZWRGZWF0dXJlQ2xhc3Nlcy5jb250YWlucyhmZWF0dXJlQ2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChmaW5hbCBGZWF0dXJlIGZlYXR1cmUpIHsKKyAgICAgICAgcmV0dXJuIGVuYWJsZWRGZWF0dXJlcy5jb250YWlucyhmZWF0dXJlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlZ2lzdGVyZWQoZmluYWwgT2JqZWN0IGNvbXBvbmVudCkgeworICAgICAgICByZXR1cm4gY29tcG9uZW50QmFnLmdldEluc3RhbmNlcygpLmNvbnRhaW5zKGNvbXBvbmVudCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNSZWdpc3RlcmVkKGZpbmFsIENsYXNzPD8+IGNvbXBvbmVudENsYXNzKSB7CisgICAgICAgIHJldHVybiBjb21wb25lbnRCYWcuZ2V0UmVnaXN0cmF0aW9ucygpLmNvbnRhaW5zKGNvbXBvbmVudENsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWFwPENsYXNzPD8+LCBJbnRlZ2VyPiBnZXRDb250cmFjdHMoZmluYWwgQ2xhc3M8Pz4gY29tcG9uZW50Q2xhc3MpIHsKKyAgICAgICAgZmluYWwgQ29udHJhY3RQcm92aWRlciBtb2RlbCA9IGNvbXBvbmVudEJhZy5nZXRNb2RlbChjb21wb25lbnRDbGFzcyk7CisgICAgICAgIHJldHVybiAobW9kZWwgPT0gbnVsbCkgPyBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpIDogbW9kZWwuZ2V0Q29udHJhY3RNYXAoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICByZXR1cm4gY29tcG9uZW50QmFnLmdldENsYXNzZXMoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PE9iamVjdD4gZ2V0SW5zdGFuY2VzKCkgeworICAgICAgICByZXR1cm4gY29tcG9uZW50QmFnLmdldEluc3RhbmNlcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSB7QGxpbmsgQ29tcG9uZW50QmFnfSBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbmZpZ3VyYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgbm9uLW51bGwgY29tcG9uZW50IGJhZyBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgQ29tcG9uZW50QmFnIGdldENvbXBvbmVudEJhZygpIHsKKyAgICAgICAgcmV0dXJuIGNvbXBvbmVudEJhZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbiBleHRlbnNpb24gcG9pbnQgdGhhdCBwcm92aWRlcyBhIHdheSBob3cgdG8gZGVmaW5lIGEgY3VzdG9tIGVuaGFuY2VtZW50L3VwZGF0ZQorICAgICAqIG9wZXJhdGlvbiBvZiBhIGNvbnRyYWN0IHByb3ZpZGVyIG1vZGVsIHJlZ2lzdHJhdGlvbiBiZWluZyBwcm9kdWNlZCBmb3IgYSBnaXZlbgorICAgICAqIGNvbXBvbmVudCBjbGFzcy4KKyAgICAgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybiBhbiBlbmhhbmNlciBqdXN0IGJ1aWxkcyB0aGUgbW9kZWwuCisgICAgICogPHA+CisgICAgICogRGVyaXZlZCBpbXBsZW1lbnRhdGlvbnMgbWF5IHVzZSB0aGlzIG1ldGhvZCB0byBlLmcuIGZpbHRlciBvdXQgYWxsIGNvbnRyYWN0cyBub3QKKyAgICAgKiBhcHBsaWNhYmxlIGluIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uIGNvbnRleHQgb3IgY2hhbmdlIHRoZSBtb2RlbCBzY29wZS4gVGhlIHJldHVybmVkCisgICAgICogc2V0IG9mIGZpbHRlcmVkIGNvbnRyYWN0cyBpcyB0aGVuIHVzZWQgZm9yIHRoZSBhY3R1YWwgcHJvdmlkZXIgcmVnaXN0cmF0aW9uLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb21wb25lbnRDbGFzcyBjbGFzcyBvZiB0aGUgY29tcG9uZW50IGJlaW5nIHJlZ2lzdGVyZWQuCisgICAgICogQHJldHVybiBmaWx0ZXIgZm9yIHRoZSBjb250cmFjdHMgdGhhdCBiZWluZyByZWdpc3RlcmVkIGZvciBhIGdpdmVuIGNvbXBvbmVudCBjbGFzcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSW5mbGVjdG9yPENvbnRyYWN0UHJvdmlkZXIuQnVpbGRlciwgQ29udHJhY3RQcm92aWRlcj4gZ2V0TW9kZWxFbmhhbmNlcihmaW5hbCBDbGFzczw/PiBjb21wb25lbnRDbGFzcykgeworICAgICAgICByZXR1cm4gQ29tcG9uZW50QmFnLkFTX0lTOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29uZmlndXJlZCBwcm9wZXJ0aWVzIHRvIHRoZSBwcm92aWRlZCBtYXAgb2YgcHJvcGVydGllcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzIG5ldyBtYXAgb2YgcHJvcGVydGllcyB0byBiZSBzZXQuCisgICAgICogQHJldHVybiB1cGRhdGVkIGNvbmZpZ3VyYXRpb24gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIENvbW1vbkNvbmZpZyBzZXRQcm9wZXJ0aWVzKGZpbmFsIE1hcDxTdHJpbmcsID8+IHByb3BlcnRpZXMpIHsKKyAgICAgICAgdGhpcy5wcm9wZXJ0aWVzLmNsZWFyKCk7CisKKyAgICAgICAgaWYgKHByb3BlcnRpZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5wcm9wZXJ0aWVzLnB1dEFsbChwcm9wZXJ0aWVzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgcHJvcGVydGllcyB0byB7QGNvZGUgUmVzb3VyY2VDb25maWd9LgorICAgICAqCisgICAgICogSWYgYW55IG9mIHRoZSBhZGRlZCBwcm9wZXJ0aWVzIGV4aXN0cyBhbHJlYWR5LCBoZSB2YWx1ZXMgb2YgdGhlIGV4aXN0aW5nCisgICAgICogcHJvcGVydGllcyB3aWxsIGJlIHJlcGxhY2VkIHdpdGggbmV3IHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzIHByb3BlcnRpZXMgdG8gYWRkLgorICAgICAqIEByZXR1cm4gdXBkYXRlZCBjb25maWd1cmF0aW9uIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBDb21tb25Db25maWcgYWRkUHJvcGVydGllcyhmaW5hbCBNYXA8U3RyaW5nLCA/PiBwcm9wZXJ0aWVzKSB7CisgICAgICAgIGlmIChwcm9wZXJ0aWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMucHJvcGVydGllcy5wdXRBbGwocHJvcGVydGllcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENvbW1vbkNvbmZpZyBwcm9wZXJ0eShmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICBwcm9wZXJ0aWVzLnJlbW92ZShuYW1lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByb3BlcnRpZXMucHV0KG5hbWUsIHZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29tbW9uQ29uZmlnIHJlZ2lzdGVyKGZpbmFsIENsYXNzPD8+IGNvbXBvbmVudENsYXNzKSB7CisgICAgICAgIGNoZWNrQ29tcG9uZW50Q2xhc3NOb3ROdWxsKGNvbXBvbmVudENsYXNzKTsKKyAgICAgICAgaWYgKGNvbXBvbmVudEJhZy5yZWdpc3Rlcihjb21wb25lbnRDbGFzcywgZ2V0TW9kZWxFbmhhbmNlcihjb21wb25lbnRDbGFzcykpKSB7CisgICAgICAgICAgICBwcm9jZXNzRmVhdHVyZVJlZ2lzdHJhdGlvbihudWxsLCBjb21wb25lbnRDbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29tbW9uQ29uZmlnIHJlZ2lzdGVyKGZpbmFsIENsYXNzPD8+IGNvbXBvbmVudENsYXNzLCBmaW5hbCBpbnQgYmluZGluZ1ByaW9yaXR5KSB7CisgICAgICAgIGNoZWNrQ29tcG9uZW50Q2xhc3NOb3ROdWxsKGNvbXBvbmVudENsYXNzKTsKKyAgICAgICAgaWYgKGNvbXBvbmVudEJhZy5yZWdpc3Rlcihjb21wb25lbnRDbGFzcywgYmluZGluZ1ByaW9yaXR5LCBnZXRNb2RlbEVuaGFuY2VyKGNvbXBvbmVudENsYXNzKSkpIHsKKyAgICAgICAgICAgIHByb2Nlc3NGZWF0dXJlUmVnaXN0cmF0aW9uKG51bGwsIGNvbXBvbmVudENsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb21tb25Db25maWcgcmVnaXN0ZXIoZmluYWwgQ2xhc3M8Pz4gY29tcG9uZW50Q2xhc3MsIGZpbmFsIENsYXNzPD8+Li4uIGNvbnRyYWN0cykgeworICAgICAgICBjaGVja0NvbXBvbmVudENsYXNzTm90TnVsbChjb21wb25lbnRDbGFzcyk7CisgICAgICAgIGlmIChjb250cmFjdHMgPT0gbnVsbCB8fCBjb250cmFjdHMubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIExPR0dFUi53YXJuaW5nKExvY2FsaXphdGlvbk1lc3NhZ2VzLkNPTVBPTkVOVF9DT05UUkFDVFNfRU1QVFlfT1JfTlVMTChjb21wb25lbnRDbGFzcykpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbXBvbmVudEJhZy5yZWdpc3Rlcihjb21wb25lbnRDbGFzcywgYXNOZXdJZGVudGl0eVNldChjb250cmFjdHMpLCBnZXRNb2RlbEVuaGFuY2VyKGNvbXBvbmVudENsYXNzKSkpIHsKKyAgICAgICAgICAgIHByb2Nlc3NGZWF0dXJlUmVnaXN0cmF0aW9uKG51bGwsIGNvbXBvbmVudENsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb21tb25Db25maWcgcmVnaXN0ZXIoZmluYWwgQ2xhc3M8Pz4gY29tcG9uZW50Q2xhc3MsIGZpbmFsIE1hcDxDbGFzczw/PiwgSW50ZWdlcj4gY29udHJhY3RzKSB7CisgICAgICAgIGNoZWNrQ29tcG9uZW50Q2xhc3NOb3ROdWxsKGNvbXBvbmVudENsYXNzKTsKKyAgICAgICAgaWYgKGNvbXBvbmVudEJhZy5yZWdpc3Rlcihjb21wb25lbnRDbGFzcywgY29udHJhY3RzLCBnZXRNb2RlbEVuaGFuY2VyKGNvbXBvbmVudENsYXNzKSkpIHsKKyAgICAgICAgICAgIHByb2Nlc3NGZWF0dXJlUmVnaXN0cmF0aW9uKG51bGwsIGNvbXBvbmVudENsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb21tb25Db25maWcgcmVnaXN0ZXIoZmluYWwgT2JqZWN0IGNvbXBvbmVudCkgeworICAgICAgICBjaGVja1Byb3ZpZGVyTm90TnVsbChjb21wb25lbnQpOworCisgICAgICAgIGZpbmFsIENsYXNzPD8+IGNvbXBvbmVudENsYXNzID0gY29tcG9uZW50LmdldENsYXNzKCk7CisgICAgICAgIGlmIChjb21wb25lbnRCYWcucmVnaXN0ZXIoY29tcG9uZW50LCBnZXRNb2RlbEVuaGFuY2VyKGNvbXBvbmVudENsYXNzKSkpIHsKKyAgICAgICAgICAgIHByb2Nlc3NGZWF0dXJlUmVnaXN0cmF0aW9uKGNvbXBvbmVudCwgY29tcG9uZW50Q2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENvbW1vbkNvbmZpZyByZWdpc3RlcihmaW5hbCBPYmplY3QgY29tcG9uZW50LCBmaW5hbCBpbnQgYmluZGluZ1ByaW9yaXR5KSB7CisgICAgICAgIGNoZWNrUHJvdmlkZXJOb3ROdWxsKGNvbXBvbmVudCk7CisgICAgICAgIGZpbmFsIENsYXNzPD8+IGNvbXBvbmVudENsYXNzID0gY29tcG9uZW50LmdldENsYXNzKCk7CisgICAgICAgIGlmIChjb21wb25lbnRCYWcucmVnaXN0ZXIoY29tcG9uZW50LCBiaW5kaW5nUHJpb3JpdHksIGdldE1vZGVsRW5oYW5jZXIoY29tcG9uZW50Q2xhc3MpKSkgeworICAgICAgICAgICAgcHJvY2Vzc0ZlYXR1cmVSZWdpc3RyYXRpb24oY29tcG9uZW50LCBjb21wb25lbnRDbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29tbW9uQ29uZmlnIHJlZ2lzdGVyKGZpbmFsIE9iamVjdCBjb21wb25lbnQsIGZpbmFsIENsYXNzPD8+Li4uIGNvbnRyYWN0cykgeworICAgICAgICBjaGVja1Byb3ZpZGVyTm90TnVsbChjb21wb25lbnQpOworICAgICAgICBmaW5hbCBDbGFzczw/PiBjb21wb25lbnRDbGFzcyA9IGNvbXBvbmVudC5nZXRDbGFzcygpOworICAgICAgICBpZiAoY29udHJhY3RzID09IG51bGwgfHwgY29udHJhY3RzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICBMT0dHRVIud2FybmluZyhMb2NhbGl6YXRpb25NZXNzYWdlcy5DT01QT05FTlRfQ09OVFJBQ1RTX0VNUFRZX09SX05VTEwoY29tcG9uZW50Q2xhc3MpKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisgICAgICAgIGlmIChjb21wb25lbnRCYWcucmVnaXN0ZXIoY29tcG9uZW50LCBhc05ld0lkZW50aXR5U2V0KGNvbnRyYWN0cyksIGdldE1vZGVsRW5oYW5jZXIoY29tcG9uZW50Q2xhc3MpKSkgeworICAgICAgICAgICAgcHJvY2Vzc0ZlYXR1cmVSZWdpc3RyYXRpb24oY29tcG9uZW50LCBjb21wb25lbnRDbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29tbW9uQ29uZmlnIHJlZ2lzdGVyKGZpbmFsIE9iamVjdCBjb21wb25lbnQsIGZpbmFsIE1hcDxDbGFzczw/PiwgSW50ZWdlcj4gY29udHJhY3RzKSB7CisgICAgICAgIGNoZWNrUHJvdmlkZXJOb3ROdWxsKGNvbXBvbmVudCk7CisgICAgICAgIGZpbmFsIENsYXNzPD8+IGNvbXBvbmVudENsYXNzID0gY29tcG9uZW50LmdldENsYXNzKCk7CisgICAgICAgIGlmIChjb21wb25lbnRCYWcucmVnaXN0ZXIoY29tcG9uZW50LCBjb250cmFjdHMsIGdldE1vZGVsRW5oYW5jZXIoY29tcG9uZW50Q2xhc3MpKSkgeworICAgICAgICAgICAgcHJvY2Vzc0ZlYXR1cmVSZWdpc3RyYXRpb24oY29tcG9uZW50LCBjb21wb25lbnRDbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0ZlYXR1cmVSZWdpc3RyYXRpb24oZmluYWwgT2JqZWN0IGNvbXBvbmVudCwgZmluYWwgQ2xhc3M8Pz4gY29tcG9uZW50Q2xhc3MpIHsKKyAgICAgICAgZmluYWwgQ29udHJhY3RQcm92aWRlciBtb2RlbCA9IGNvbXBvbmVudEJhZy5nZXRNb2RlbChjb21wb25lbnRDbGFzcyk7CisgICAgICAgIGlmIChtb2RlbC5nZXRDb250cmFjdHMoKS5jb250YWlucyhGZWF0dXJlLmNsYXNzKSkgeworICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgICAgICBmaW5hbCBGZWF0dXJlUmVnaXN0cmF0aW9uIHJlZ2lzdHJhdGlvbiA9IChjb21wb25lbnQgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgPyBuZXcgRmVhdHVyZVJlZ2lzdHJhdGlvbigoRmVhdHVyZSkgY29tcG9uZW50KQorICAgICAgICAgICAgICAgICAgICA6IG5ldyBGZWF0dXJlUmVnaXN0cmF0aW9uKChDbGFzczw/IGV4dGVuZHMgRmVhdHVyZT4pIGNvbXBvbmVudENsYXNzKTsKKyAgICAgICAgICAgIG5ld0ZlYXR1cmVSZWdpc3RyYXRpb25zLmFkZChyZWdpc3RyYXRpb24pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZCB0aGUgaW50ZXJuYWwgY29uZmlndXJhdGlvbiBzdGF0ZSBmcm9tIGFuIGV4dGVybmFsbHkgcHJvdmlkZWQgY29uZmlndXJhdGlvbiBzdGF0ZS4KKyAgICAgKiA8cC8+CisgICAgICogQ2FsbGluZyB0aGlzIG1ldGhvZCBlZmZlY3RpdmVseSByZXBsYWNlcyBleGlzdGluZyBjb25maWd1cmF0aW9uIHN0YXRlIG9mIHRoZSBpbnN0YW5jZSB3aXRoIHRoZSBzdGF0ZSByZXByZXNlbnRlZCBieSB0aGUKKyAgICAgKiBleHRlcm5hbGx5IHByb3ZpZGVkIGNvbmZpZ3VyYXRpb24uIElmIHRoZSBmZWF0dXJlcywgYXV0by1kaXNjb3ZlcmFibGVzIG9mIGdpdmVuIGNvbmZpZyBoYXMgYmVlbiBhbHJlYWR5IGNvbmZpZ3VyZWQgdGhlbgorICAgICAqIHRoaXMgbWV0aG9kIHdpbGwgbWFrZSBzdXJlIHRvIG5vdCBjb25maWd1cmUgdGhlbSBmb3IgdGhlIHNlY29uZCB0aW1lLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZyBleHRlcm5hbCBjb25maWd1cmF0aW9uIHN0YXRlIHRvIHJlcGxhY2UgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhpcyBjb25maWd1cmFibGUgaW5zdGFuY2UuCisgICAgICogQHJldHVybiB0aGUgdXBkYXRlZCBjb21tb24gY29uZmlndXJhdGlvbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29tbW9uQ29uZmlnIGxvYWRGcm9tKGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlnKSB7CisgICAgICAgIGlmIChjb25maWcgaW5zdGFuY2VvZiBDb21tb25Db25maWcpIHsKKyAgICAgICAgICAgIC8vIElmIGxvYWRpbmcgZnJvbSBDb21tb25Db25maWcgdGhlbiBzaW1wbHkgY29weSBwcm9wZXJ0aWVzIGFuZCBjaGVjayB3aGV0aGVyIGdpdmVuIGNvbmZpZyBoYXMgYmVlbiBpbml0aWFsaXplZC4KKyAgICAgICAgICAgIGZpbmFsIENvbW1vbkNvbmZpZyBjb21tb25Db25maWcgPSAoQ29tbW9uQ29uZmlnKSBjb25maWc7CisKKyAgICAgICAgICAgIGNvcHkoY29tbW9uQ29uZmlnLCB0cnVlKTsKKyAgICAgICAgICAgIHRoaXMuZGlzYWJsZU1ldGFQcm92aWRlckNvbmZpZ3VyYXRpb24gPSAhY29tbW9uQ29uZmlnLmVuYWJsZWRGZWF0dXJlQ2xhc3Nlcy5pc0VtcHR5KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZXRQcm9wZXJ0aWVzKGNvbmZpZy5nZXRQcm9wZXJ0aWVzKCkpOworCisgICAgICAgICAgICB0aGlzLmVuYWJsZWRGZWF0dXJlcy5jbGVhcigpOworICAgICAgICAgICAgdGhpcy5lbmFibGVkRmVhdHVyZUNsYXNzZXMuY2xlYXIoKTsKKworICAgICAgICAgICAgY29tcG9uZW50QmFnLmNsZWFyKCk7CisgICAgICAgICAgICByZXNldFJlZ2lzdHJhdGlvbnMoKTsKKworICAgICAgICAgICAgZm9yIChmaW5hbCBDbGFzczw/PiBjbGF6eiA6IGNvbmZpZy5nZXRDbGFzc2VzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoRmVhdHVyZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNsYXp6KSAmJiBjb25maWcuaXNFbmFibGVkKChDbGFzczw/IGV4dGVuZHMgRmVhdHVyZT4pIGNsYXp6KSkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVNZXRhUHJvdmlkZXJDb25maWd1cmF0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZWdpc3RlcihjbGF6eiwgY29uZmlnLmdldENvbnRyYWN0cyhjbGF6eikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGZpbmFsIE9iamVjdCBpbnN0YW5jZSA6IGNvbmZpZy5nZXRJbnN0YW5jZXMoKSkgeworICAgICAgICAgICAgICAgIGlmIChpbnN0YW5jZSBpbnN0YW5jZW9mIEZlYXR1cmUgJiYgY29uZmlnLmlzRW5hYmxlZCgoRmVhdHVyZSkgaW5zdGFuY2UpKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZU1ldGFQcm92aWRlckNvbmZpZ3VyYXRpb24gPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJlZ2lzdGVyKGluc3RhbmNlLCBjb25maWcuZ2V0Q29udHJhY3RzKGluc3RhbmNlLmdldENsYXNzKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHByaXZhdGUgU2V0PENsYXNzPD8+PiBhc05ld0lkZW50aXR5U2V0KGZpbmFsIENsYXNzPD8+Li4uIGNvbnRyYWN0cykgeworICAgICAgICBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IHJlc3VsdCA9IENvbGxlY3Rpb25zLm5ld1NldEZyb21NYXAobmV3IElkZW50aXR5SGFzaE1hcDw+KCkpOworICAgICAgICByZXN1bHQuYWRkQWxsKEFycmF5cy5hc0xpc3QoY29udHJhY3RzKSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrUHJvdmlkZXJOb3ROdWxsKGZpbmFsIE9iamVjdCBwcm92aWRlcikgeworICAgICAgICBpZiAocHJvdmlkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5DT01QT05FTlRfQ0FOTk9UX0JFX05VTEwoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tDb21wb25lbnRDbGFzc05vdE51bGwoZmluYWwgQ2xhc3M8Pz4gY29tcG9uZW50Q2xhc3MpIHsKKyAgICAgICAgaWYgKGNvbXBvbmVudENsYXNzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuQ09NUE9ORU5UX0NMQVNTX0NBTk5PVF9CRV9OVUxMKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uZmlndXJlIHtAbGluayBBdXRvRGlzY292ZXJhYmxlIGF1dG8tZGlzY292ZXJhYmxlc30gaW4gdGhlIGluamVjdGlvbiBtYW5hZ2VyLgorICAgICAqCisgICAgICogQHBhcmFtIGluamVjdGlvbk1hbmFnZXIgIGluamVjdGlvbiBtYW5hZ2VyIGluIHdoaWNoIHRoZSBhdXRvLWRpc2NvdmVyYWJsZXMgc2hvdWxkIGJlIGNvbmZpZ3VyZWQuCisgICAgICogQHBhcmFtIGF1dG9EaXNjb3ZlcmFibGVzIGxpc3Qgb2YgcmVnaXN0ZXJlZCBhdXRvIGRpc2NvdmVyYWJsZSBjb21wb25lbnRzLgorICAgICAqIEBwYXJhbSBmb3JjZWRPbmx5ICAgICAgICBkZWZpbmVzIHdoZXRoZXIgYWxsIG9yIG9ubHkgZm9yY2VkIGF1dG8tZGlzY292ZXJhYmxlcyBzaG91bGQgYmUgY29uZmlndXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb25maWd1cmVBdXRvRGlzY292ZXJhYmxlUHJvdmlkZXJzKGZpbmFsIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciwKKyAgICAgICAgICAgIGZpbmFsIENvbGxlY3Rpb248QXV0b0Rpc2NvdmVyYWJsZT4gYXV0b0Rpc2NvdmVyYWJsZXMsIGZpbmFsIGJvb2xlYW4gZm9yY2VkT25seSkgeworICAgICAgICAvLyBDaGVjayB3aGV0aGVyIG1ldGEgcHJvdmlkZXJzIGhhdmUgYmVlbiBpbml0aWFsaXplZCBmb3IgYSBjb25maWcgdGhpcyBjb25maWcgaGFzIGJlZW4gbG9hZGVkIGZyb20uCisgICAgICAgIGlmICghZGlzYWJsZU1ldGFQcm92aWRlckNvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgICAgIGZpbmFsIFNldDxBdXRvRGlzY292ZXJhYmxlPiBwcm92aWRlcnMgPSBuZXcgVHJlZVNldDw+KChvMSwgbzIpIC0+IHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcDEgPSBvMS5nZXRDbGFzcygpLmlzQW5ub3RhdGlvblByZXNlbnQoUHJpb3JpdHkuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICA/IG8xLmdldENsYXNzKCkuZ2V0QW5ub3RhdGlvbihQcmlvcml0eS5jbGFzcykudmFsdWUoKSA6IFByaW9yaXRpZXMuVVNFUjsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcDIgPSBvMi5nZXRDbGFzcygpLmlzQW5ub3RhdGlvblByZXNlbnQoUHJpb3JpdHkuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICA/IG8yLmdldENsYXNzKCkuZ2V0QW5ub3RhdGlvbihQcmlvcml0eS5jbGFzcykudmFsdWUoKSA6IFByaW9yaXRpZXMuVVNFUjsKKworICAgICAgICAgICAgICAgIHJldHVybiAocDEgPCBwMiB8fCBwMSA9PSBwMikgPyAtMSA6IDE7CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgLy8gRm9yY2VkIChhbHdheXMgaW52b2tlZCkuCisgICAgICAgICAgICBmaW5hbCBMaXN0PEZvcmNlZEF1dG9EaXNjb3ZlcmFibGU+IGZvcmNlZEF1dG9EaXNjcm92ZXJhYmxlcyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICAgICAgICAgIGZvciAoQ2xhc3M8Rm9yY2VkQXV0b0Rpc2NvdmVyYWJsZT4gZm9yY2VkQURUeXBlIDogU2VydmljZUZpbmRlci5maW5kKEZvcmNlZEF1dG9EaXNjb3ZlcmFibGUuY2xhc3MsIHRydWUpCisgICAgICAgICAgICAgICAgICAgIC50b0NsYXNzQXJyYXkoKSkgeworICAgICAgICAgICAgICAgIGZvcmNlZEF1dG9EaXNjcm92ZXJhYmxlcy5hZGQoaW5qZWN0aW9uTWFuYWdlci5jcmVhdGVBbmRJbml0aWFsaXplKGZvcmNlZEFEVHlwZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJvdmlkZXJzLmFkZEFsbChmb3JjZWRBdXRvRGlzY3JvdmVyYWJsZXMpOworCisgICAgICAgICAgICAvLyBSZWd1bGFyLgorICAgICAgICAgICAgaWYgKCFmb3JjZWRPbmx5KSB7CisgICAgICAgICAgICAgICAgcHJvdmlkZXJzLmFkZEFsbChhdXRvRGlzY292ZXJhYmxlcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoZmluYWwgQXV0b0Rpc2NvdmVyYWJsZSBhdXRvRGlzY292ZXJhYmxlIDogcHJvdmlkZXJzKSB7CisgICAgICAgICAgICAgICAgZmluYWwgQ29uc3RyYWluZWRUbyBjb25zdHJhaW5lZFRvID0gYXV0b0Rpc2NvdmVyYWJsZS5nZXRDbGFzcygpLmdldEFubm90YXRpb24oQ29uc3RyYWluZWRUby5jbGFzcyk7CisKKyAgICAgICAgICAgICAgICBpZiAoY29uc3RyYWluZWRUbyA9PSBudWxsIHx8IHR5cGUuZXF1YWxzKGNvbnN0cmFpbmVkVG8udmFsdWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9EaXNjb3ZlcmFibGUuY29uZmlndXJlKHRoaXMpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5GSU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGl6YXRpb25NZXNzYWdlcy5BVVRPRElTQ09WRVJBQkxFX0NPTkZJR1VSQVRJT05fRkFJTEVEKGF1dG9EaXNjb3ZlcmFibGUuZ2V0Q2xhc3MoKSksIGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uZmlndXJlIGJpbmRlcnMgaW4gdGhlIGluamVjdGlvbiBtYW5hZ2VyIGFuZCBlbmFibGUgSkFYLVJTIGZlYXR1cmVzLgorICAgICAqCisgICAgICogQHBhcmFtIGluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uIG1hbmFnZXIgaW4gd2hpY2ggdGhlIGJpbmRlcnMgYW5kIGZlYXR1cmVzIHNob3VsZCBiZSBjb25maWd1cmVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZU1ldGFQcm92aWRlcnMoSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyLCBNYW5hZ2VkT2JqZWN0c0ZpbmFsaXplciBmaW5hbGl6ZXIpIHsKKyAgICAgICAgLy8gRmlyc3QsIGNvbmZpZ3VyZSBleGlzdGluZyBiaW5kZXJzCisgICAgICAgIFNldDxCaW5kZXI+IGNvbmZpZ3VyZWRCaW5kZXJzID0gY29uZmlndXJlQmluZGVycyhpbmplY3Rpb25NYW5hZ2VyLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpKTsKKworICAgICAgICAvLyBDaGVjayB3aGV0aGVyIG1ldGEgcHJvdmlkZXJzIGhhdmUgYmVlbiBpbml0aWFsaXplZCBmb3IgYSBjb25maWcgdGhpcyBjb25maWcgaGFzIGJlZW4gbG9hZGVkIGZyb20uCisgICAgICAgIGlmICghZGlzYWJsZU1ldGFQcm92aWRlckNvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgICAgIC8vIFJlZ2lzdGVyIGV4dGVybmFsIG1ldGEgb2JqZWN0cworICAgICAgICAgICAgY29uZmlndXJlRXh0ZXJuYWxPYmplY3RzKGluamVjdGlvbk1hbmFnZXIpOworICAgICAgICAgICAgLy8gTmV4dCwgY29uZmlndXJlIGFsbCBmZWF0dXJlcworICAgICAgICAgICAgY29uZmlndXJlRmVhdHVyZXMoaW5qZWN0aW9uTWFuYWdlciwgbmV3IEhhc2hTZXQ8PigpLCByZXNldFJlZ2lzdHJhdGlvbnMoKSwgZmluYWxpemVyKTsKKyAgICAgICAgICAgIC8vIEF0IGxhc3QsIGNvbmZpZ3VyZSBhbnkgbmV3IGJpbmRlcnMgYWRkZWQgYnkgZmVhdHVyZXMKKyAgICAgICAgICAgIGNvbmZpZ3VyZUJpbmRlcnMoaW5qZWN0aW9uTWFuYWdlciwgY29uZmlndXJlZEJpbmRlcnMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBTZXQ8QmluZGVyPiBjb25maWd1cmVCaW5kZXJzKEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciwgU2V0PEJpbmRlcj4gY29uZmlndXJlZCkgeworICAgICAgICBTZXQ8QmluZGVyPiBhbGxDb25maWd1cmVkID0gQ29sbGVjdGlvbnMubmV3U2V0RnJvbU1hcChuZXcgSWRlbnRpdHlIYXNoTWFwPD4oKSk7CisgICAgICAgIGFsbENvbmZpZ3VyZWQuYWRkQWxsKGNvbmZpZ3VyZWQpOworCisgICAgICAgIENvbGxlY3Rpb248QmluZGVyPiBiaW5kZXJzID0gZ2V0QmluZGVyKGNvbmZpZ3VyZWQpOworICAgICAgICBpZiAoIWJpbmRlcnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyKENvbXBvc2l0ZUJpbmRlci53cmFwKGJpbmRlcnMpKTsKKyAgICAgICAgICAgIGFsbENvbmZpZ3VyZWQuYWRkQWxsKGJpbmRlcnMpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGFsbENvbmZpZ3VyZWQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPEJpbmRlcj4gZ2V0QmluZGVyKFNldDxCaW5kZXI+IGNvbmZpZ3VyZWQpIHsKKyAgICAgICAgcmV0dXJuIGNvbXBvbmVudEJhZy5nZXRJbnN0YW5jZXMoQ29tcG9uZW50QmFnLkJJTkRFUlNfT05MWSkKKyAgICAgICAgICAgICAgICAuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAubWFwKENBU1RfVE9fQklOREVSKQorICAgICAgICAgICAgICAgIC5maWx0ZXIoYmluZGVyIC0+ICFjb25maWd1cmVkLmNvbnRhaW5zKGJpbmRlcikpCisgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNvbmZpZ3VyZUV4dGVybmFsT2JqZWN0cyhJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIpIHsKKyAgICAgICAgICBjb21wb25lbnRCYWcuZ2V0SW5zdGFuY2VzKG1vZGVsIC0+IENvbXBvbmVudEJhZy5FWFRFUk5BTF9PTkxZLnRlc3QobW9kZWwsIGluamVjdGlvbk1hbmFnZXIpKQorICAgICAgICAgICAgICAgICAgLmZvckVhY2goaW5qZWN0aW9uTWFuYWdlcjo6cmVnaXN0ZXIpOworICAgICAgICAgIGNvbXBvbmVudEJhZy5nZXRDbGFzc2VzKG1vZGVsIC0+IENvbXBvbmVudEJhZy5FWFRFUk5BTF9PTkxZLnRlc3QobW9kZWwsIGluamVjdGlvbk1hbmFnZXIpKQorICAgICAgICAgICAgICAgICAgLmZvckVhY2goaW5qZWN0aW9uTWFuYWdlcjo6cmVnaXN0ZXIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjb25maWd1cmVGZWF0dXJlcyhJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldDxGZWF0dXJlUmVnaXN0cmF0aW9uPiBwcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8RmVhdHVyZVJlZ2lzdHJhdGlvbj4gdW5wcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hbmFnZWRPYmplY3RzRmluYWxpemVyIG1hbmFnZWRPYmplY3RzRmluYWxpemVyKSB7CisgICAgICAgIEZlYXR1cmVDb250ZXh0V3JhcHBlciBmZWF0dXJlQ29udGV4dFdyYXBwZXIgPSBudWxsOworICAgICAgICBmb3IgKGZpbmFsIEZlYXR1cmVSZWdpc3RyYXRpb24gcmVnaXN0cmF0aW9uIDogdW5wcm9jZXNzZWQpIHsKKyAgICAgICAgICAgIGlmIChwcm9jZXNzZWQuY29udGFpbnMocmVnaXN0cmF0aW9uKSkgeworICAgICAgICAgICAgICAgIExPR0dFUi5jb25maWcoTG9jYWxpemF0aW9uTWVzc2FnZXMuRkVBVFVSRV9IQVNfQUxSRUFEWV9CRUVOX1BST0NFU1NFRChyZWdpc3RyYXRpb24uZ2V0RmVhdHVyZUNsYXNzKCkpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRmVhdHVyZSBmZWF0dXJlID0gcmVnaXN0cmF0aW9uLmdldEZlYXR1cmUoKTsKKyAgICAgICAgICAgIGlmIChmZWF0dXJlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmZWF0dXJlID0gaW5qZWN0aW9uTWFuYWdlci5jcmVhdGVBbmRJbml0aWFsaXplKHJlZ2lzdHJhdGlvbi5nZXRGZWF0dXJlQ2xhc3MoKSk7CisgICAgICAgICAgICAgICAgbWFuYWdlZE9iamVjdHNGaW5hbGl6ZXIucmVnaXN0ZXJGb3JQcmVEZXN0cm95Q2FsbChmZWF0dXJlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gRGlzYWJsZSBpbmplY3Rpb24gb2YgRmVhdHVyZSBpbnN0YW5jZXMgb24gdGhlIGNsaWVudC1zaWRlLiBJbnN0YW5jZXMgbWF5IGJlIHJlZ2lzdGVyZWQgaW50byBtdWx0aXBsZQorICAgICAgICAgICAgICAgIC8vIHdlYi10YXJnZXRzIHdoaWNoIG1lYW5zIHRoYXQgaW5qZWN0aW5nIGFueXRoaW5nIGludG8gdGhlc2UgaW5zdGFuY2VzIGlzIG5vdCBzYWZlLgorICAgICAgICAgICAgICAgIGlmICghUnVudGltZVR5cGUuQ0xJRU5ULmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLmluamVjdChmZWF0dXJlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChlbmFibGVkRmVhdHVyZXMuY29udGFpbnMoZmVhdHVyZSkpIHsKKyAgICAgICAgICAgICAgICBMT0dHRVIuY29uZmlnKExvY2FsaXphdGlvbk1lc3NhZ2VzLkZFQVRVUkVfSEFTX0FMUkVBRFlfQkVFTl9QUk9DRVNTRUQoZmVhdHVyZSkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZmVhdHVyZUNvbnRleHRXcmFwcGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBpbml0IGxhemlseQorICAgICAgICAgICAgICAgIGZlYXR1cmVDb250ZXh0V3JhcHBlciA9IG5ldyBGZWF0dXJlQ29udGV4dFdyYXBwZXIodGhpcywgaW5qZWN0aW9uTWFuYWdlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIHN1Y2Nlc3MgPSBmZWF0dXJlLmNvbmZpZ3VyZShmZWF0dXJlQ29udGV4dFdyYXBwZXIpOworCisgICAgICAgICAgICBpZiAoc3VjY2VzcykgeworICAgICAgICAgICAgICAgIHByb2Nlc3NlZC5hZGQocmVnaXN0cmF0aW9uKTsKKyAgICAgICAgICAgICAgICBjb25maWd1cmVGZWF0dXJlcyhpbmplY3Rpb25NYW5hZ2VyLCBwcm9jZXNzZWQsIHJlc2V0UmVnaXN0cmF0aW9ucygpLCBtYW5hZ2VkT2JqZWN0c0ZpbmFsaXplcik7CisgICAgICAgICAgICAgICAgZW5hYmxlZEZlYXR1cmVDbGFzc2VzLmFkZChyZWdpc3RyYXRpb24uZ2V0RmVhdHVyZUNsYXNzKCkpOworICAgICAgICAgICAgICAgIGVuYWJsZWRGZWF0dXJlcy5hZGQoZmVhdHVyZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8RmVhdHVyZVJlZ2lzdHJhdGlvbj4gcmVzZXRSZWdpc3RyYXRpb25zKCkgeworICAgICAgICBmaW5hbCBMaXN0PEZlYXR1cmVSZWdpc3RyYXRpb24+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PihuZXdGZWF0dXJlUmVnaXN0cmF0aW9ucyk7CisgICAgICAgIG5ld0ZlYXR1cmVSZWdpc3RyYXRpb25zLmNsZWFyKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvKSB7CisgICAgICAgIGlmICh0aGlzID09IG8pIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBDb21tb25Db25maWcpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBDb21tb25Db25maWcgdGhhdCA9IChDb21tb25Db25maWcpIG87CisKKyAgICAgICAgaWYgKHR5cGUgIT0gdGhhdC50eXBlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFwcm9wZXJ0aWVzLmVxdWFscyh0aGF0LnByb3BlcnRpZXMpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjb21wb25lbnRCYWcuZXF1YWxzKHRoYXQuY29tcG9uZW50QmFnKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICghZW5hYmxlZEZlYXR1cmVDbGFzc2VzLmVxdWFscyh0aGF0LmVuYWJsZWRGZWF0dXJlQ2xhc3NlcykpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWVuYWJsZWRGZWF0dXJlcy5lcXVhbHModGhhdC5lbmFibGVkRmVhdHVyZXMpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFuZXdGZWF0dXJlUmVnaXN0cmF0aW9ucy5lcXVhbHModGhhdC5uZXdGZWF0dXJlUmVnaXN0cmF0aW9ucykpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCByZXN1bHQgPSB0eXBlLmhhc2hDb2RlKCk7CisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgcHJvcGVydGllcy5oYXNoQ29kZSgpOworICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIGNvbXBvbmVudEJhZy5oYXNoQ29kZSgpOworICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIG5ld0ZlYXR1cmVSZWdpc3RyYXRpb25zLmhhc2hDb2RlKCk7CisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgZW5hYmxlZEZlYXR1cmVzLmhhc2hDb2RlKCk7CisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgZW5hYmxlZEZlYXR1cmVDbGFzc2VzLmhhc2hDb2RlKCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tb2RlbC9pbnRlcm5hbC9Db21wb25lbnRCYWcuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbW9kZWwvaW50ZXJuYWwvQ29tcG9uZW50QmFnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ExZWEzMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbW9kZWwvaW50ZXJuYWwvQ29tcG9uZW50QmFnLmphdmEKQEAgLTAsMCArMSw3NjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubW9kZWwuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkJpUHJlZGljYXRlOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IGphdmF4LndzLnJzLk5hbWVCaW5kaW5nOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZTsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJpb3JpdHk7CitpbXBvcnQgamF2YXguaW5qZWN0LlNjb3BlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuU2V2ZXJpdHk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuRXJyb3JzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5CaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkJpbmRpbmc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkJpbmRpbmdzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5DbGFzc0JpbmRpbmc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0Lkluc3RhbmNlQmluZGluZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuUHJvdmlkZXJzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1vZGVsLkNvbnRyYWN0UHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5JbmZsZWN0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLkV4ZWN1dG9yU2VydmljZVByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5TY2hlZHVsZWRFeGVjdXRvclNlcnZpY2VQcm92aWRlcjsKKworLyoqCisgKiBBbiBpbnRlcm5hbCBKZXJzZXkgY29udGFpbmVyIGZvciBjdXN0b20gY29tcG9uZW50IGNsYXNzZXMgYW5kIGluc3RhbmNlcy4KKyAqIDxwLz4KKyAqIFRoZSBjb21wb25lbnQgYmFnIGNhbiBhdXRvbWF0aWNhbGx5IGNvbXB1dGUgYSB7QGxpbmsgQ29udHJhY3RQcm92aWRlciBjb250cmFjdCBwcm92aWRlcn0gbW9kZWwKKyAqIGZvciB0aGUgcmVnaXN0ZXJlZCBjb21wb25lbnQgdHlwZSBhbmQgc3RvcmVzIGl0IHdpdGggdGhlIGNvbXBvbmVudCByZWdpc3RyYXRpb24uCisgKiA8cD4KKyAqIFRoZSBydWxlcyBmb3IgbWFuYWdpbmcgY29tcG9uZW50cyBpbnNpZGUgYSBjb21wb25lbnQgYmFnIGFyZSBkZXJpdmVkIGZyb20gdGhlCisgKiBydWxlcyBvZiBKQVgtUlMge0BsaW5rIGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhYmxlfSBBUEkuIEluIHNob3J0OgorICogPHVsPgorICogPGxpPlRoZSBpdGVyYXRpb24gb3JkZXIgb2YgcmVnaXN0ZXJlZCBjb21wb25lbnRzIG1pcnJvcnMgdGhlIHJlZ2lzdHJhdGlvbiBvcmRlcgorICogb2YgdGhlc2UgY29tcG9uZW50cy48L2xpPgorICogPGxpPlRoZXJlIGNhbiBiZSBvbmx5IG9uZSByZWdpc3RyYXRpb24gZm9yIGFueSBnaXZlbiBjb21wb25lbnQgdHlwZS48L2xpPgorICogPGxpPkV4aXN0aW5nIHJlZ2lzdHJhdGlvbnMgY2Fubm90IGJlIG92ZXJyaWRkZW4gKGFueSBhdHRlbXB0IHRvIG92ZXJyaWRlCisgKiBhbiBleGlzdGluZyByZWdpc3RyYXRpb24gd2lsbCBiZSByZWplY3RlZCkuPC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIENvbXBvbmVudEJhZyB7CisgICAgLyoqCisgICAgICogQSBmaWx0ZXJpbmcgc3RyYXRlZ3kgdGhhdCBleGNsdWRlcyBhbGwgcHVyZSBtZXRhLXByb3ZpZGVyIG1vZGVscyAoaS5lLiBtb2RlbHMgdGhhdCBvbmx5IGNvbnRhaW4KKyAgICAgKiByZWNvZ25pemVkIG1ldGEtcHJvdmlkZXIgY29udHJhY3RzIC0ge0BsaW5rIGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZX0gYW5kL29yIHtAbGluayBCaW5kZXJ9IGFuZC9vciBleHRlcm5hbCBtZXRhLXByb3ZpZGVyCisgICAgICogZnJvbSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXIjaXNSZWdpc3RyYWJsZShDbGFzcyl9KS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGZpbHRlciBwcmVkaWNhdGUgcmV0dXJucyB7QGNvZGUgZmFsc2V9IGZvciBhbGwge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1vZGVsLkNvbnRyYWN0UHJvdmlkZXIgY29udHJhY3QgcHJvdmlkZXIgbW9kZWxzfQorICAgICAqIHRoYXQgcmVwcmVzZW50IGEgbW9kZWwgY29udGFpbmluZyBvbmx5IHJlY29nbml6ZWQgbWV0YS1wcm92aWRlciBjb250cmFjdHMuCisgICAgICogPC9wPgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFByZWRpY2F0ZTxDb250cmFjdFByb3ZpZGVyPiBFWENMVURFX01FVEFfUFJPVklERVJTID0gbW9kZWwgLT4geworICAgICAgICBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IGNvbnRyYWN0cyA9IG1vZGVsLmdldENvbnRyYWN0cygpOworICAgICAgICBpZiAoY29udHJhY3RzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBieXRlIGNvdW50ID0gMDsKKyAgICAgICAgaWYgKGNvbnRyYWN0cy5jb250YWlucyhGZWF0dXJlLmNsYXNzKSkgeworICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29udHJhY3RzLmNvbnRhaW5zKEJpbmRlci5jbGFzcykpIHsKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbnRyYWN0cy5zaXplKCkgPiBjb3VudDsKKyAgICB9OworCisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGdW5jdGlvbjxPYmplY3QsIEJpbmRlcj4gQ0FTVF9UT19CSU5ERVIgPSBCaW5kZXIuY2xhc3M6OmNhc3Q7CisKKyAgICAvKioKKyAgICAgKiBBIG1ldGhvZCBjcmVhdGVzIHRoZSB7QGxpbmsgUHJlZGljYXRlfSB3aGljaCBpcyBhYmxlIHRvIGZpbHRlciBhbGwgSmVyc2V5IG1ldGEtcHJvdmlkZXJzIGFsb25nIHdpdGggdGhlIGNvbXBvbmVudHMgd2hpY2gKKyAgICAgKiBpcyBhYmxlIHRvIHJlZ2lzdGVyIHRoZSBjdXJyZW50IHVzZWQge0BsaW5rIEluamVjdGlvbk1hbmFnZXJ9LgorICAgICAqCisgICAgICogQHBhcmFtIGluamVjdGlvbk1hbmFnZXIgY3VycmVudCBpbmplY3Rpb24gbWFuYWdlci4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSBQcmVkaWNhdGV9IGV4Y2x1ZGluZyBKZXJzZXkgbWV0YS1wcm92aWRlcnMgYW5kIHRoZSBzcGVjaWZpYyBvbmVzIGZvciBhIGN1cnJlbnQge0Bjb2RlIEluamVjdGlvbk1hbmFnZXJ9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUHJlZGljYXRlPENvbnRyYWN0UHJvdmlkZXI+IGV4Y2x1ZGVNZXRhUHJvdmlkZXJzKEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlcikgeworICAgICAgICByZXR1cm4gRVhDTFVERV9NRVRBX1BST1ZJREVSUy5hbmQobW9kZWwgLT4gIWluamVjdGlvbk1hbmFnZXIuaXNSZWdpc3RyYWJsZShtb2RlbC5nZXRJbXBsZW1lbnRhdGlvbkNsYXNzKCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGZpbHRlcmluZyBzdHJhdGVneSB0aGF0IGluY2x1ZGVzIG9ubHkgbW9kZWxzIHRoYXQgY29udGFpbiBjb250cmFjdCByZWdpc3RyYWJsZSBieQorICAgICAqIHtAbGluayBJbmplY3Rpb25NYW5hZ2VyfS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGZpbHRlciBwcmVkaWNhdGUgcmV0dXJucyB7QGNvZGUgdHJ1ZX0gZm9yIGFsbCB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW9kZWwuQ29udHJhY3RQcm92aWRlciBjb250cmFjdCBwcm92aWRlciBtb2RlbHN9CisgICAgICogdGhhdCByZXByZXNlbnQgYW4gb2JqZWN0IHdoaWNoIGNhbiBiZSByZWdpc3RlcmVkIHVzaW5nIHNwZWNpZmljIHtAbGluayBJbmplY3Rpb25NYW5hZ2VyfQorICAgICAqIGNvbnRyYWN0LgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEJpUHJlZGljYXRlPENvbnRyYWN0UHJvdmlkZXIsIEluamVjdGlvbk1hbmFnZXI+IEVYVEVSTkFMX09OTFkgPSAobW9kZWwsIGluamVjdGlvbk1hbmFnZXIpIC0+CisgICAgICAgICAgICBtb2RlbC5nZXRJbXBsZW1lbnRhdGlvbkNsYXNzKCkgIT0gbnVsbCAmJiBpbmplY3Rpb25NYW5hZ2VyLmlzUmVnaXN0cmFibGUobW9kZWwuZ2V0SW1wbGVtZW50YXRpb25DbGFzcygpKTsKKworICAgIC8qKgorICAgICAqIEEgZmlsdGVyaW5nIHN0cmF0ZWd5IHRoYXQgaW5jbHVkZXMgb25seSBtb2RlbHMgdGhhdCBjb250YWluIHtAbGluayBCaW5kZXJ9IHByb3ZpZGVyIGNvbnRyYWN0LgorICAgICAqIDxwPgorICAgICAqIFRoaXMgZmlsdGVyIHByZWRpY2F0ZSByZXR1cm5zIHtAY29kZSB0cnVlfSBmb3IgYWxsIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb2RlbC5Db250cmFjdFByb3ZpZGVyIGNvbnRyYWN0IHByb3ZpZGVyIG1vZGVsc30KKyAgICAgKiB0aGF0IHJlcHJlc2VudCBhIHByb3ZpZGVyIHJlZ2lzdGVyZWQgdG8gcHJvdmlkZSB7QGxpbmsgQmluZGVyfSBjb250cmFjdC4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQcmVkaWNhdGU8Q29udHJhY3RQcm92aWRlcj4gQklOREVSU19PTkxZID0gbW9kZWwgLT4gbW9kZWwuZ2V0Q29udHJhY3RzKCkuY29udGFpbnMoQmluZGVyLmNsYXNzKTsKKworICAgIC8qKgorICAgICAqIEEgZmlsdGVyaW5nIHN0cmF0ZWd5IHRoYXQgaW5jbHVkZXMgb25seSBtb2RlbHMgdGhhdCBjb250YWluIHtAbGluayBFeGVjdXRvclNlcnZpY2VQcm92aWRlcn0gcHJvdmlkZXIgY29udHJhY3QuCisgICAgICogPHA+CisgICAgICogVGhpcyBmaWx0ZXIgcHJlZGljYXRlIHJldHVybnMge0Bjb2RlIHRydWV9IGZvciBhbGwge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1vZGVsLkNvbnRyYWN0UHJvdmlkZXIgY29udHJhY3QgcHJvdmlkZXIgbW9kZWxzfQorICAgICAqIHRoYXQgcmVwcmVzZW50IGEgcHJvdmlkZXIgcmVnaXN0ZXJlZCB0byBwcm92aWRlIHtAbGluayBFeGVjdXRvclNlcnZpY2VQcm92aWRlcn0gY29udHJhY3QuCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUHJlZGljYXRlPENvbnRyYWN0UHJvdmlkZXI+IEVYRUNVVE9SX1NFUlZJQ0VfUFJPVklERVJfT05MWSA9CisgICAgICAgICAgICBtb2RlbCAtPiBtb2RlbC5nZXRDb250cmFjdHMoKS5jb250YWlucyhFeGVjdXRvclNlcnZpY2VQcm92aWRlci5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgJiYgIW1vZGVsLmdldENvbnRyYWN0cygpLmNvbnRhaW5zKFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyLmNsYXNzKTsKKworICAgIC8qKgorICAgICAqIEEgZmlsdGVyaW5nIHN0cmF0ZWd5IHRoYXQgaW5jbHVkZXMgb25seSBtb2RlbHMgdGhhdCBjb250YWluIHtAbGluayBTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2VQcm92aWRlcn0gcHJvdmlkZXIgY29udHJhY3QuCisgICAgICogPHA+CisgICAgICogVGhpcyBmaWx0ZXIgcHJlZGljYXRlIHJldHVybnMge0Bjb2RlIHRydWV9IGZvciBhbGwge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1vZGVsLkNvbnRyYWN0UHJvdmlkZXIgY29udHJhY3QgcHJvdmlkZXIgbW9kZWxzfQorICAgICAqIHRoYXQgcmVwcmVzZW50IGEgcHJvdmlkZXIgcmVnaXN0ZXJlZCB0byBwcm92aWRlIHtAbGluayBTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2VQcm92aWRlcn0gY29udHJhY3QuCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUHJlZGljYXRlPENvbnRyYWN0UHJvdmlkZXI+IFNDSEVEVUxFRF9FWEVDVVRPUl9TRVJWSUNFX1BST1ZJREVSX09OTFkgPQorICAgICAgICAgICAgbW9kZWwgLT4gbW9kZWwuZ2V0Q29udHJhY3RzKCkuY29udGFpbnMoU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXIuY2xhc3MpOworCisgICAgLyoqCisgICAgICogQSBmaWx0ZXJpbmcgc3RyYXRlZ3kgdGhhdCBleGNsdWRlcyBtb2RlbHMgd2l0aCBubyByZWNvZ25pemVkIGNvbnRyYWN0cy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGZpbHRlciBwcmVkaWNhdGUgcmV0dXJucyB7QGNvZGUgZmFsc2V9IGZvciBhbGwge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1vZGVsLkNvbnRyYWN0UHJvdmlkZXIgY29udHJhY3QgcHJvdmlkZXIgbW9kZWxzfQorICAgICAqIHRoYXQgYXJlIGVtcHR5LCBpLmUuIGRvIG5vdCBjb250YWluIGFueSByZWNvZ25pemVkIGNvbnRyYWN0cy4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQcmVkaWNhdGU8Q29udHJhY3RQcm92aWRlcj4gRVhDTFVERV9FTVBUWSA9IG1vZGVsIC0+ICFtb2RlbC5nZXRDb250cmFjdHMoKS5pc0VtcHR5KCk7CisKKyAgICAvKioKKyAgICAgKiBBIGZpbHRlcmluZyBzdHJhdGVneSB0aGF0IGFjY2VwdHMgYW55IGNvbnRyYWN0IHByb3ZpZGVyIG1vZGVsLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgZmlsdGVyIHByZWRpY2F0ZSByZXR1cm5zIHtAY29kZSB0cnVlfSBmb3IgYW55IGNvbnRyYWN0IHByb3ZpZGVyIG1vZGVsLgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFByZWRpY2F0ZTxDb250cmFjdFByb3ZpZGVyPiBJTkNMVURFX0FMTCA9IGNvbnRyYWN0UHJvdmlkZXIgLT4gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIENvbnRyYWN0IHByb3ZpZGVyIG1vZGVsIGVuaGFuY2VyIHRoYXQgYnVpbGRzIGEgbW9kZWwgYXMgaXMsIHdpdGhvdXQgYW55CisgICAgICogbW9kaWZpY2F0aW9ucy4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgSW5mbGVjdG9yPENvbnRyYWN0UHJvdmlkZXIuQnVpbGRlciwgQ29udHJhY3RQcm92aWRlcj4gQVNfSVMgPSBDb250cmFjdFByb3ZpZGVyLkJ1aWxkZXI6OmJ1aWxkOworCisgICAgLyoqCisgICAgICogQ29udHJhY3QgcHJvdmlkZXIgbW9kZWwgcmVnaXN0cmF0aW9uIHN0cmF0ZWd5LgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgUHJlZGljYXRlPENvbnRyYWN0UHJvdmlkZXI+IHJlZ2lzdHJhdGlvblN0cmF0ZWd5OworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyZWQgY29tcG9uZW50IGNsYXNzZXMgY29sbGVjdGlvbiBhbmQgaXQncyBpbW11dGFibGUgdmlldy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIFNldDxDbGFzczw/Pj4gY2xhc3NlczsKKyAgICBwcml2YXRlIGZpbmFsIFNldDxDbGFzczw/Pj4gY2xhc3Nlc1ZpZXc7CisgICAgLyoqCisgICAgICogUmVnaXN0ZXJlZCBjb21wb25lbnQgaW5zdGFuY2VzIGNvbGxlY3Rpb24gYW5kIGl0J3MgaW1tdXRhYmxlIHZpZXcuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8T2JqZWN0PiBpbnN0YW5jZXM7CisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8T2JqZWN0PiBpbnN0YW5jZXNWaWV3OworICAgIC8qKgorICAgICAqIE1hcCBvZiBjb250cmFjdCBwcm92aWRlciBtb2RlbHMgZm9yIHRoZSByZWdpc3RlcmVkIGNvbXBvbmVudCBjbGFzc2VzIGFuZCBpbnN0YW5jZXMKKyAgICAgKiBpdCdzIGltbXV0YWJsZSB2aWV3LgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgTWFwPENsYXNzPD8+LCBDb250cmFjdFByb3ZpZGVyPiBtb2RlbHM7CisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IG1vZGVsS2V5c1ZpZXc7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IGVtcHR5IGNvbXBvbmVudCBiYWcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVnaXN0cmF0aW9uU3RyYXRlZ3kgZnVuY3Rpb24gZHJpdmluZyB0aGUgZGVjaXNpb24gKGJhc2VkIG9uIHRoZSBpbnRyb3NwZWN0ZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1vZGVsLkNvbnRyYWN0UHJvdmlkZXIgY29udHJhY3QgcHJvdmlkZXIgbW9kZWx9KSB3aGV0aGVyCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIG5vdCBzaG91bGQgdGhlIGNvbXBvbmVudCBjbGFzcyByZWdpc3RyYXRpb24gY29udGludWUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG93YXJkcyBhIHN1Y2Nlc3NmdWwgY29tcGxldGlvbi4KKyAgICAgKiBAcmV0dXJuIGEgbmV3IGVtcHR5IGNvbXBvbmVudCBiYWcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDb21wb25lbnRCYWcgbmV3SW5zdGFuY2UoUHJlZGljYXRlPENvbnRyYWN0UHJvdmlkZXI+IHJlZ2lzdHJhdGlvblN0cmF0ZWd5KSB7CisgICAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50QmFnKHJlZ2lzdHJhdGlvblN0cmF0ZWd5KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiB7QGNvZGUgVH0gb2JqZWN0IGlzIHJlZ2lzdGVyZWQgaW4ge0BsaW5rIENvbXBvbmVudEJhZ30gdXNpbmcgdGhlIHtAbGluayBCaW5kZXJ9LCB7QGNvZGUgVH0gaXMgbm90IHZpc2libGUgdXNpbmcgdGhlCisgICAgICogbWV0aG9kcyBmb3IgZ2V0dGluZyBjbGFzc2VzIGFuZCBpbnN0YW5jZXMge0BsaW5rIENvbXBvbmVudEJhZyNnZXRDbGFzc2VzKFByZWRpY2F0ZSl9IGFuZAorICAgICAqIHtAbGluayBDb21wb25lbnRCYWcjZ2V0SW5zdGFuY2VzKFByZWRpY2F0ZSl9LgorICAgICAqIDxwPgorICAgICAqIE1ldGhvZCBzZWxlY3RzIGFsbCB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkJpbmRpbmcgYmluZGluZ3N9IGFuZCBwaWNrcyB1cCB0aGUgaW5zdGFuY2VzIG9yIGNyZWF0ZXMKKyAgICAgKiB0aGUgaW5zdGFuY2VzIGZyb20ge0BsaW5rIENsYXNzQmluZGluZ30gKGluamVjdGlvbiBkb2VzIG5vdCB3b3JrIGF0IHRoaXMgbW9tZW50KS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbiBtYW5hZ2VyIHRvIGNyZWF0ZSBhbiBvYmplY3QgZnJvbSB7QGNvZGUgVH0gY2xhc3MuCisgICAgICogQHBhcmFtIGNvbXBvbmVudEJhZyAgICAgY29tcG9uZW50IGJhZyB3aGljaCBwcm92aWRlcyByZWdpc3RlcmVkIGJpbmRlcnMuCisgICAgICogQHJldHVybiBhbGwgaW5zdGFuY2VzL2NsYXNzZXMgcmVnaXN0ZXJlZCB1c2luZyBiaW5kZXJzLgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBzdGF0aWMgPFQ+IExpc3Q8VD4gZ2V0RnJvbUJpbmRlcnMoSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyLCBDb21wb25lbnRCYWcgY29tcG9uZW50QmFnLAorICAgICAgICAgICAgRnVuY3Rpb248T2JqZWN0LCBUPiBjYXN0LCBQcmVkaWNhdGU8QmluZGluZz4gZmlsdGVyKSB7CisKKyAgICAgICAgRnVuY3Rpb248QmluZGluZywgT2JqZWN0PiBiaW5kaW5nVG9PYmplY3QgPSBiaW5kaW5nIC0+IHsKKyAgICAgICAgICAgIGlmIChiaW5kaW5nIGluc3RhbmNlb2YgQ2xhc3NCaW5kaW5nKSB7CisgICAgICAgICAgICAgICAgQ2xhc3NCaW5kaW5nIGNsYXNzQmluZGluZyA9IChDbGFzc0JpbmRpbmcpIGJpbmRpbmc7CisgICAgICAgICAgICAgICAgcmV0dXJuIGluamVjdGlvbk1hbmFnZXIuY3JlYXRlQW5kSW5pdGlhbGl6ZShjbGFzc0JpbmRpbmcuZ2V0U2VydmljZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgSW5zdGFuY2VCaW5kaW5nIGluc3RhbmNlQmluZGluZyA9IChJbnN0YW5jZUJpbmRpbmcpIGJpbmRpbmc7CisgICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlQmluZGluZy5nZXRTZXJ2aWNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgcmV0dXJuIGNvbXBvbmVudEJhZy5nZXRJbnN0YW5jZXMoQ29tcG9uZW50QmFnLkJJTkRFUlNfT05MWSkuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAubWFwKENBU1RfVE9fQklOREVSKQorICAgICAgICAgICAgICAgIC5mbGF0TWFwKGJpbmRlciAtPiBCaW5kaW5ncy5nZXRCaW5kaW5ncyhpbmplY3Rpb25NYW5hZ2VyLCBiaW5kZXIpLnN0cmVhbSgpKQorICAgICAgICAgICAgICAgIC5maWx0ZXIoZmlsdGVyKQorICAgICAgICAgICAgICAgIC5tYXAoYmluZGluZ1RvT2JqZWN0KQorICAgICAgICAgICAgICAgIC5tYXAoY2FzdCkKKyAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIENvbXBvbmVudEJhZyhQcmVkaWNhdGU8Q29udHJhY3RQcm92aWRlcj4gcmVnaXN0cmF0aW9uU3RyYXRlZ3kpIHsKKyAgICAgICAgdGhpcy5yZWdpc3RyYXRpb25TdHJhdGVneSA9IHJlZ2lzdHJhdGlvblN0cmF0ZWd5OworCisgICAgICAgIHRoaXMuY2xhc3NlcyA9IG5ldyBMaW5rZWRIYXNoU2V0PD4oKTsKKyAgICAgICAgdGhpcy5pbnN0YW5jZXMgPSBuZXcgTGlua2VkSGFzaFNldDw+KCk7CisgICAgICAgIHRoaXMubW9kZWxzID0gbmV3IElkZW50aXR5SGFzaE1hcDw+KCk7CisKKyAgICAgICAgdGhpcy5jbGFzc2VzVmlldyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChjbGFzc2VzKTsKKyAgICAgICAgdGhpcy5pbnN0YW5jZXNWaWV3ID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KGluc3RhbmNlcyk7CisgICAgICAgIHRoaXMubW9kZWxLZXlzVmlldyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChtb2RlbHMua2V5U2V0KCkpOworICAgIH0KKworICAgIHByaXZhdGUgQ29tcG9uZW50QmFnKFByZWRpY2F0ZTxDb250cmFjdFByb3ZpZGVyPiByZWdpc3RyYXRpb25TdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTZXQ8Q2xhc3M8Pz4+IGNsYXNzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgU2V0PE9iamVjdD4gaW5zdGFuY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxDbGFzczw/PiwgQ29udHJhY3RQcm92aWRlcj4gbW9kZWxzKSB7CisgICAgICAgIHRoaXMucmVnaXN0cmF0aW9uU3RyYXRlZ3kgPSByZWdpc3RyYXRpb25TdHJhdGVneTsKKworICAgICAgICB0aGlzLmNsYXNzZXMgPSBjbGFzc2VzOworICAgICAgICB0aGlzLmluc3RhbmNlcyA9IGluc3RhbmNlczsKKyAgICAgICAgdGhpcy5tb2RlbHMgPSBtb2RlbHM7CisKKyAgICAgICAgdGhpcy5jbGFzc2VzVmlldyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChjbGFzc2VzKTsKKyAgICAgICAgdGhpcy5pbnN0YW5jZXNWaWV3ID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KGluc3RhbmNlcyk7CisgICAgICAgIHRoaXMubW9kZWxLZXlzVmlldyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChtb2RlbHMua2V5U2V0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGEgY29tcG9uZW50IGNsYXNzIHVzaW5nIGEgZ2l2ZW4gcmVnaXN0cmF0aW9uIHN0cmF0ZWd5LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbXBvbmVudENsYXNzIGNsYXNzIHRvIGJlIGludHJvc3BlY3RlZCBhcyBhIGNvbnRyYWN0IHByb3ZpZGVyIGFuZCByZWdpc3RlcmVkLCBiYXNlZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBvbiB0aGUgcmVnaXN0cmF0aW9uIHN0cmF0ZWd5IGRlY2lzaW9uLgorICAgICAqIEBwYXJhbSBtb2RlbEVuaGFuY2VyICBjdXN0b20gY29udHJhY3QgcHJvdmlkZXIgbW9kZWwgZW5oYW5jZXIuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGNvbXBvbmVudCByZWdpc3RyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcmVnaXN0ZXIoQ2xhc3M8Pz4gY29tcG9uZW50Q2xhc3MsIEluZmxlY3RvcjxDb250cmFjdFByb3ZpZGVyLkJ1aWxkZXIsIENvbnRyYWN0UHJvdmlkZXI+IG1vZGVsRW5oYW5jZXIpIHsKKyAgICAgICAgZmluYWwgYm9vbGVhbiByZXN1bHQgPSByZWdpc3Rlck1vZGVsKGNvbXBvbmVudENsYXNzLCBDb250cmFjdFByb3ZpZGVyLk5PX1BSSU9SSVRZLCBudWxsLCBtb2RlbEVuaGFuY2VyKTsKKyAgICAgICAgaWYgKHJlc3VsdCkgeworICAgICAgICAgICAgY2xhc3Nlcy5hZGQoY29tcG9uZW50Q2xhc3MpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgYSBjb21wb25lbnQgY2xhc3MgYXMgYSBjb250cmFjdCBwcm92aWRlciB3aXRoIGFuIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGJpbmRpbmcgcHJpb3JpdHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tcG9uZW50Q2xhc3MgY2xhc3MgdG8gYmUgaW50cm9zcGVjdGVkIGFzIGEgY29udHJhY3QgcHJvdmlkZXIgYW5kIHJlZ2lzdGVyZWQuCisgICAgICogQHBhcmFtIHByaW9yaXR5ICAgICAgIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGJpbmRpbmcgcHJpb3JpdHkgZm9yIHRoZSBwcm92aWRlciBjb250cmFjdHMgaW1wbGVtZW50ZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhlIGNvbXBvbmVudC4KKyAgICAgKiBAcGFyYW0gbW9kZWxFbmhhbmNlciAgY3VzdG9tIGNvbnRyYWN0IHByb3ZpZGVyIG1vZGVsIGVuaGFuY2VyLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBjb21wb25lbnQgcmVnaXN0cmF0aW9uIHdhcyBzdWNjZXNzZnVsLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHJlZ2lzdGVyKENsYXNzPD8+IGNvbXBvbmVudENsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmZsZWN0b3I8Q29udHJhY3RQcm92aWRlci5CdWlsZGVyLCBDb250cmFjdFByb3ZpZGVyPiBtb2RlbEVuaGFuY2VyKSB7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVzdWx0ID0gcmVnaXN0ZXJNb2RlbChjb21wb25lbnRDbGFzcywgcHJpb3JpdHksIG51bGwsIG1vZGVsRW5oYW5jZXIpOworICAgICAgICBpZiAocmVzdWx0KSB7CisgICAgICAgICAgICBjbGFzc2VzLmFkZChjb21wb25lbnRDbGFzcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBhIGNvbXBvbmVudCBjbGFzcyBhcyBhIGNvbnRyYWN0IHByb3ZpZGVyIGZvciB0aGUgc3BlY2lmaWVkIGNvbnRyYWN0cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb21wb25lbnRDbGFzcyBjbGFzcyB0byBiZSBpbnRyb3NwZWN0ZWQgYXMgYSBjb250cmFjdCBwcm92aWRlciBhbmQgcmVnaXN0ZXJlZC4KKyAgICAgKiBAcGFyYW0gY29udHJhY3RzICAgICAgY29udHJhY3RzIHRvIGJpbmQgdGhlIGNvbXBvbmVudCBjbGFzcyB0by4KKyAgICAgKiBAcGFyYW0gbW9kZWxFbmhhbmNlciAgY3VzdG9tIGNvbnRyYWN0IHByb3ZpZGVyIG1vZGVsIGVuaGFuY2VyLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBjb21wb25lbnQgcmVnaXN0cmF0aW9uIHdhcyBzdWNjZXNzZnVsLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHJlZ2lzdGVyKENsYXNzPD8+IGNvbXBvbmVudENsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldDxDbGFzczw/Pj4gY29udHJhY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZmxlY3RvcjxDb250cmFjdFByb3ZpZGVyLkJ1aWxkZXIsIENvbnRyYWN0UHJvdmlkZXI+IG1vZGVsRW5oYW5jZXIpIHsKKyAgICAgICAgZmluYWwgYm9vbGVhbiByZXN1bHQgPQorICAgICAgICAgICAgICAgIHJlZ2lzdGVyTW9kZWwoY29tcG9uZW50Q2xhc3MsIENvbnRyYWN0UHJvdmlkZXIuTk9fUFJJT1JJVFksIGFzTWFwKGNvbnRyYWN0cyksIG1vZGVsRW5oYW5jZXIpOworICAgICAgICBpZiAocmVzdWx0KSB7CisgICAgICAgICAgICBjbGFzc2VzLmFkZChjb21wb25lbnRDbGFzcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBhIGNvbXBvbmVudCBjbGFzcyBhcyBhIGNvbnRyYWN0IHByb3ZpZGVyIGZvciB0aGUgc3BlY2lmaWVkIGNvbnRyYWN0cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb21wb25lbnRDbGFzcyBjbGFzcyB0byBiZSBpbnRyb3NwZWN0ZWQgYXMgYSBjb250cmFjdCBwcm92aWRlciBhbmQgcmVnaXN0ZXJlZC4KKyAgICAgKiBAcGFyYW0gY29udHJhY3RzICAgICAgY29udHJhY3RzIHdpdGggdGhlaXIgcHJpb3JpdGllcyB0byBiaW5kIHRoZSBjb21wb25lbnQgY2xhc3MgdG8uCisgICAgICogQHBhcmFtIG1vZGVsRW5oYW5jZXIgIGN1c3RvbSBjb250cmFjdCBwcm92aWRlciBtb2RlbCBlbmhhbmNlci4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgY29tcG9uZW50IHJlZ2lzdHJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZWdpc3RlcihDbGFzczw/PiBjb21wb25lbnRDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8Q2xhc3M8Pz4sIEludGVnZXI+IGNvbnRyYWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmZsZWN0b3I8Q29udHJhY3RQcm92aWRlci5CdWlsZGVyLCBDb250cmFjdFByb3ZpZGVyPiBtb2RlbEVuaGFuY2VyKSB7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVzdWx0ID0KKyAgICAgICAgICAgICAgICByZWdpc3Rlck1vZGVsKGNvbXBvbmVudENsYXNzLCBDb250cmFjdFByb3ZpZGVyLk5PX1BSSU9SSVRZLCBjb250cmFjdHMsIG1vZGVsRW5oYW5jZXIpOworICAgICAgICBpZiAocmVzdWx0KSB7CisgICAgICAgICAgICBjbGFzc2VzLmFkZChjb21wb25lbnRDbGFzcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBhIGNvbXBvbmVudCB1c2luZyBhIGdpdmVuIHJlZ2lzdHJhdGlvbiBzdHJhdGVneS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb21wb25lbnQgICAgIGluc3RhbmNlIHRvIGJlIGludHJvc3BlY3RlZCBhcyBhIGNvbnRyYWN0IHByb3ZpZGVyIGFuZCByZWdpc3RlcmVkLCBiYXNlZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIG9uIHRoZSByZWdpc3RyYXRpb24gc3RyYXRlZ3kgZGVjaXNpb24uCisgICAgICogQHBhcmFtIG1vZGVsRW5oYW5jZXIgY3VzdG9tIGNvbnRyYWN0IHByb3ZpZGVyIG1vZGVsIGVuaGFuY2VyLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBjb21wb25lbnQgcmVnaXN0cmF0aW9uIHdhcyBzdWNjZXNzZnVsLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHJlZ2lzdGVyKE9iamVjdCBjb21wb25lbnQsIEluZmxlY3RvcjxDb250cmFjdFByb3ZpZGVyLkJ1aWxkZXIsIENvbnRyYWN0UHJvdmlkZXI+IG1vZGVsRW5oYW5jZXIpIHsKKyAgICAgICAgZmluYWwgQ2xhc3M8Pz4gY29tcG9uZW50Q2xhc3MgPSBjb21wb25lbnQuZ2V0Q2xhc3MoKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiByZXN1bHQgPSByZWdpc3Rlck1vZGVsKGNvbXBvbmVudENsYXNzLCBDb250cmFjdFByb3ZpZGVyLk5PX1BSSU9SSVRZLCBudWxsLCBtb2RlbEVuaGFuY2VyKTsKKyAgICAgICAgaWYgKHJlc3VsdCkgeworICAgICAgICAgICAgaW5zdGFuY2VzLmFkZChjb21wb25lbnQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgYSBjb21wb25lbnQgYXMgYSBjb250cmFjdCBwcm92aWRlciB3aXRoIGFuIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGJpbmRpbmcgcHJpb3JpdHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tcG9uZW50ICAgICBpbnN0YW5jZSB0byBiZSBpbnRyb3NwZWN0ZWQgYXMgYSBjb250cmFjdCBwcm92aWRlciBhbmQgcmVnaXN0ZXJlZCwgYmFzZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvbiB0aGUgcmVnaXN0cmF0aW9uIHN0cmF0ZWd5IGRlY2lzaW9uLgorICAgICAqIEBwYXJhbSBwcmlvcml0eSAgICAgIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGJpbmRpbmcgcHJpb3JpdHkgZm9yIHRoZSBwcm92aWRlciBjb250cmFjdHMgaW1wbGVtZW50ZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBieSB0aGUgY29tcG9uZW50LgorICAgICAqIEBwYXJhbSBtb2RlbEVuaGFuY2VyIGN1c3RvbSBjb250cmFjdCBwcm92aWRlciBtb2RlbCBlbmhhbmNlci4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgY29tcG9uZW50IHJlZ2lzdHJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZWdpc3RlcihPYmplY3QgY29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmZsZWN0b3I8Q29udHJhY3RQcm92aWRlci5CdWlsZGVyLCBDb250cmFjdFByb3ZpZGVyPiBtb2RlbEVuaGFuY2VyKSB7CisgICAgICAgIGZpbmFsIENsYXNzPD8+IGNvbXBvbmVudENsYXNzID0gY29tcG9uZW50LmdldENsYXNzKCk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVzdWx0ID0gcmVnaXN0ZXJNb2RlbChjb21wb25lbnRDbGFzcywgcHJpb3JpdHksIG51bGwsIG1vZGVsRW5oYW5jZXIpOworICAgICAgICBpZiAocmVzdWx0KSB7CisgICAgICAgICAgICBpbnN0YW5jZXMuYWRkKGNvbXBvbmVudCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBhIGNvbXBvbmVudCBhcyBhIGNvbnRyYWN0IHByb3ZpZGVyIGZvciB0aGUgc3BlY2lmaWVkIGNvbnRyYWN0cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb21wb25lbnQgICAgIGluc3RhbmNlIHRvIGJlIGludHJvc3BlY3RlZCBhcyBhIGNvbnRyYWN0IHByb3ZpZGVyIGFuZCByZWdpc3RlcmVkLCBiYXNlZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIG9uIHRoZSByZWdpc3RyYXRpb24gc3RyYXRlZ3kgZGVjaXNpb24uCisgICAgICogQHBhcmFtIGNvbnRyYWN0cyAgICAgY29udHJhY3RzIHRvIGJpbmQgdGhlIGNvbXBvbmVudCB0by4KKyAgICAgKiBAcGFyYW0gbW9kZWxFbmhhbmNlciBjdXN0b20gY29udHJhY3QgcHJvdmlkZXIgbW9kZWwgZW5oYW5jZXIuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGNvbXBvbmVudCByZWdpc3RyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcmVnaXN0ZXIoT2JqZWN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQ8Q2xhc3M8Pz4+IGNvbnRyYWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmZsZWN0b3I8Q29udHJhY3RQcm92aWRlci5CdWlsZGVyLCBDb250cmFjdFByb3ZpZGVyPiBtb2RlbEVuaGFuY2VyKSB7CisgICAgICAgIGZpbmFsIENsYXNzPD8+IGNvbXBvbmVudENsYXNzID0gY29tcG9uZW50LmdldENsYXNzKCk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVzdWx0ID0KKyAgICAgICAgICAgICAgICByZWdpc3Rlck1vZGVsKGNvbXBvbmVudENsYXNzLCBDb250cmFjdFByb3ZpZGVyLk5PX1BSSU9SSVRZLCBhc01hcChjb250cmFjdHMpLCBtb2RlbEVuaGFuY2VyKTsKKyAgICAgICAgaWYgKHJlc3VsdCkgeworICAgICAgICAgICAgaW5zdGFuY2VzLmFkZChjb21wb25lbnQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgYSBjb21wb25lbnQgYXMgYSBjb250cmFjdCBwcm92aWRlciBmb3IgdGhlIHNwZWNpZmllZCBjb250cmFjdHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tcG9uZW50ICAgICBpbnN0YW5jZSB0byBiZSBpbnRyb3NwZWN0ZWQgYXMgYSBjb250cmFjdCBwcm92aWRlciBhbmQgcmVnaXN0ZXJlZCwgYmFzZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvbiB0aGUgcmVnaXN0cmF0aW9uIHN0cmF0ZWd5IGRlY2lzaW9uLgorICAgICAqIEBwYXJhbSBjb250cmFjdHMgICAgIGNvbnRyYWN0cyB3aXRoIHRoZWlyIHByaW9yaXRpZXMgdG8gYmluZCB0aGUgY29tcG9uZW50IHRvLgorICAgICAqIEBwYXJhbSBtb2RlbEVuaGFuY2VyIGN1c3RvbSBjb250cmFjdCBwcm92aWRlciBtb2RlbCBlbmhhbmNlci4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgY29tcG9uZW50IHJlZ2lzdHJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiByZWdpc3RlcihPYmplY3QgY29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxDbGFzczw/PiwgSW50ZWdlcj4gY29udHJhY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZmxlY3RvcjxDb250cmFjdFByb3ZpZGVyLkJ1aWxkZXIsIENvbnRyYWN0UHJvdmlkZXI+IG1vZGVsRW5oYW5jZXIpIHsKKyAgICAgICAgZmluYWwgQ2xhc3M8Pz4gY29tcG9uZW50Q2xhc3MgPSBjb21wb25lbnQuZ2V0Q2xhc3MoKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiByZXN1bHQgPQorICAgICAgICAgICAgICAgIHJlZ2lzdGVyTW9kZWwoY29tcG9uZW50Q2xhc3MsIENvbnRyYWN0UHJvdmlkZXIuTk9fUFJJT1JJVFksIGNvbnRyYWN0cywgbW9kZWxFbmhhbmNlcik7CisgICAgICAgIGlmIChyZXN1bHQpIHsKKyAgICAgICAgICAgIGluc3RhbmNlcy5hZGQoY29tcG9uZW50KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGEge0BsaW5rIENvbnRyYWN0UHJvdmlkZXIgY29udHJhY3QgcHJvdmlkZXIgbW9kZWx9IGZvciBhIGdpdmVuICBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb21wb25lbnRDbGFzcyAgcmVnaXN0ZXJlZCBjb21wb25lbnQgY2xhc3MuCisgICAgICogQHBhcmFtIGRlZmF1bHRQcmlvcml0eSBkZWZhdWx0IGNvbXBvbmVudCBwcmlvcml0eS4gSWYge0B2YWx1ZSBDb250cmFjdFByb3ZpZGVyI05PX1BSSU9SSVRZfSwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB2YWx1ZSBmcm9tIHRoZSBjb21wb25lbnQgY2xhc3Mge0BsaW5rIGphdmF4LmFubm90YXRpb24uUHJpb3JpdHl9IGFubm90YXRpb24gd2lsbCBiZSB1c2VkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAoaWYgYW55KS4KKyAgICAgKiBAcGFyYW0gY29udHJhY3RNYXAgICAgIG1hcCBvZiBjb250cmFjdHMgYW5kIHRoZWlyIGJpbmRpbmcgcHJpb3JpdGllcy4gSWYge0Bjb2RlIG51bGx9LCB0aGUgY29udHJhY3RzIHdpbGwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIGdhdGhlcmVkIGJ5IGludHJvc3BlY3RpbmcgdGhlIGNvbXBvbmVudCBjbGFzcy4gQ29udGVudCBvZiB0aGUgY29udHJhY3QgbWFwCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICBtYXkgYmUgbW9kaWZpZWQgZHVyaW5nIHRoZSByZWdpc3RyYXRpb24gcHJvY2Vzc2luZy4KKyAgICAgKiBAcGFyYW0gbW9kZWxFbmhhbmNlciAgIGN1c3RvbSBjb250cmFjdCBwcm92aWRlciBtb2RlbCBlbmhhbmNlci4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSB1cG9uIHN1Y2Nlc3NmdWwgcmVnaXN0cmF0aW9uIG9mIGEgY29udHJhY3QgcHJvdmlkZXIgbW9kZWwgZm9yIGEgZ2l2ZW4gY29tcG9uZW50IGNsYXNzLAorICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIHJlZ2lzdGVyTW9kZWwoZmluYWwgQ2xhc3M8Pz4gY29tcG9uZW50Q2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGRlZmF1bHRQcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNYXA8Q2xhc3M8Pz4sIEludGVnZXI+IGNvbnRyYWN0TWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEluZmxlY3RvcjxDb250cmFjdFByb3ZpZGVyLkJ1aWxkZXIsIENvbnRyYWN0UHJvdmlkZXI+IG1vZGVsRW5oYW5jZXIpIHsKKworICAgICAgICByZXR1cm4gRXJyb3JzLnByb2Nlc3MoKCkgLT4geworICAgICAgICAgICAgaWYgKG1vZGVscy5jb250YWluc0tleShjb21wb25lbnRDbGFzcykpIHsKKyAgICAgICAgICAgICAgICBFcnJvcnMuZXJyb3IoTG9jYWxpemF0aW9uTWVzc2FnZXMuQ09NUE9ORU5UX1RZUEVfQUxSRUFEWV9SRUdJU1RFUkVEKGNvbXBvbmVudENsYXNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V2ZXJpdHkuSElOVCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBSZWdpc3RlciBjb250cmFjdHMKKyAgICAgICAgICAgIGZpbmFsIENvbnRyYWN0UHJvdmlkZXIgbW9kZWwgPSBtb2RlbEZvcihjb21wb25lbnRDbGFzcywgZGVmYXVsdFByaW9yaXR5LCBjb250cmFjdE1hcCwgbW9kZWxFbmhhbmNlcik7CisKKyAgICAgICAgICAgIC8vIEFwcGx5IHJlZ2lzdHJhdGlvbiBzdHJhdGVneQorICAgICAgICAgICAgaWYgKCFyZWdpc3RyYXRpb25TdHJhdGVneS50ZXN0KG1vZGVsKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbW9kZWxzLnB1dChjb21wb25lbnRDbGFzcywgbW9kZWwpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGNvbnRyYWN0IHByb3ZpZGVyIG1vZGVsIGJ5IGludHJvc3BlY3RpbmcgYSBjb21wb25lbnQgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tcG9uZW50Q2xhc3MgY29tcG9uZW50IGNsYXNzIHRvIGNyZWF0ZSBjb250cmFjdCBwcm92aWRlciBtb2RlbCBmb3IuCisgICAgICogQHJldHVybiBjb250cmFjdCBwcm92aWRlciBtb2RlbCBmb3IgdGhlIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ29udHJhY3RQcm92aWRlciBtb2RlbEZvcihmaW5hbCBDbGFzczw/PiBjb21wb25lbnRDbGFzcykgeworICAgICAgICByZXR1cm4gbW9kZWxGb3IoY29tcG9uZW50Q2xhc3MsIENvbnRyYWN0UHJvdmlkZXIuTk9fUFJJT1JJVFksIG51bGwsIEFTX0lTKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBjb250cmFjdCBwcm92aWRlciBmb3IgYSBnaXZlbiBjb21wb25lbnQgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tcG9uZW50Q2xhc3MgIGNvbXBvbmVudCBjbGFzcyB0byBjcmVhdGUgY29udHJhY3QgcHJvdmlkZXIgbW9kZWwgZm9yLgorICAgICAqIEBwYXJhbSBkZWZhdWx0UHJpb3JpdHkgZGVmYXVsdCBjb21wb25lbnQgcHJpb3JpdHkuIElmIHtAdmFsdWUgQ29udHJhY3RQcm92aWRlciNOT19QUklPUklUWX0sCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICB0aGUgdmFsdWUgZnJvbSB0aGUgY29tcG9uZW50IGNsYXNzIHtAbGluayBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5fSBhbm5vdGF0aW9uIHdpbGwgYmUgdXNlZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgKGlmIGFueSkuCisgICAgICogQHBhcmFtIGNvbnRyYWN0TWFwICAgICBtYXAgb2YgY29udHJhY3RzIGFuZCB0aGVpciBiaW5kaW5nIHByaW9yaXRpZXMuIElmIHtAY29kZSBudWxsfSwgdGhlIGNvbnRyYWN0cyB3aWxsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICBnYXRoZXJlZCBieSBpbnRyb3NwZWN0aW5nIHRoZSBjb21wb25lbnQgY2xhc3MuIENvbnRlbnQgb2YgdGhlIGNvbnRyYWN0IG1hcAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgbWF5IGJlIG1vZGlmaWVkIGR1cmluZyB0aGUgcmVnaXN0cmF0aW9uIHByb2Nlc3NpbmcuCisgICAgICogQHBhcmFtIG1vZGVsRW5oYW5jZXIgICBjdXN0b20gY29udHJhY3QgcHJvdmlkZXIgbW9kZWwgZW5oYW5jZXIuCisgICAgICogQHJldHVybiBjb250cmFjdCBwcm92aWRlciBtb2RlbCBmb3IgdGhlIGNsYXNzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIENvbnRyYWN0UHJvdmlkZXIgbW9kZWxGb3IoZmluYWwgQ2xhc3M8Pz4gY29tcG9uZW50Q2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZGVmYXVsdFByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWFwPENsYXNzPD8+LCBJbnRlZ2VyPiBjb250cmFjdE1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEluZmxlY3RvcjxDb250cmFjdFByb3ZpZGVyLkJ1aWxkZXIsIENvbnRyYWN0UHJvdmlkZXI+IG1vZGVsRW5oYW5jZXIpIHsKKyAgICAgICAgTWFwPENsYXNzPD8+LCBJbnRlZ2VyPiBjb250cmFjdHMgPSBjb250cmFjdE1hcDsKKyAgICAgICAgaWYgKGNvbnRyYWN0cyA9PSBudWxsKSB7IC8vIGludHJvc3BlY3QKKyAgICAgICAgICAgIGNvbnRyYWN0cyA9IGFzTWFwKFByb3ZpZGVycy5nZXRQcm92aWRlckNvbnRyYWN0cyhjb21wb25lbnRDbGFzcykpOworICAgICAgICB9IGVsc2UgeyAvLyBmaWx0ZXIgY3VzdG9tIGNvbnRyYWN0cworICAgICAgICAgICAgZmluYWwgSXRlcmF0b3I8Q2xhc3M8Pz4+IGl0ID0gY29udHJhY3RzLmtleVNldCgpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gY29udHJhY3QgPSBpdC5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRyYWN0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJvb2xlYW4gZmFpbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKCFQcm92aWRlcnMuaXNTdXBwb3J0ZWRDb250cmFjdChjb250cmFjdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgRXJyb3JzLmVycm9yKExvY2FsaXphdGlvbk1lc3NhZ2VzLkNPTlRSQUNUX05PVF9TVVBQT1JURUQoY29udHJhY3QsIGNvbXBvbmVudENsYXNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldmVyaXR5LldBUk5JTkcpOworICAgICAgICAgICAgICAgICAgICBmYWlsZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWNvbnRyYWN0LmlzQXNzaWduYWJsZUZyb20oY29tcG9uZW50Q2xhc3MpKSB7CisgICAgICAgICAgICAgICAgICAgIEVycm9ycy5lcnJvcihMb2NhbGl6YXRpb25NZXNzYWdlcy5DT05UUkFDVF9OT1RfQVNTSUdOQUJMRShjb250cmFjdCwgY29tcG9uZW50Q2xhc3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V2ZXJpdHkuV0FSTklORyk7CisgICAgICAgICAgICAgICAgICAgIGZhaWxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChmYWlsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZpbmFsIENvbnRyYWN0UHJvdmlkZXIuQnVpbGRlciBidWlsZGVyID0gQ29udHJhY3RQcm92aWRlci5idWlsZGVyKGNvbXBvbmVudENsYXNzKQorICAgICAgICAgICAgICAgIC5hZGRDb250cmFjdHMoY29udHJhY3RzKQorICAgICAgICAgICAgICAgIC5kZWZhdWx0UHJpb3JpdHkoZGVmYXVsdFByaW9yaXR5KTsKKworICAgICAgICAvLyBQcm9jZXNzIGFubm90YXRpb25zIChwcmlvcml0eSwgbmFtZSBiaW5kaW5ncywgc2NvcGUpCisgICAgICAgIGZpbmFsIGJvb2xlYW4gdXNlQW5ub3RhdGlvblByaW9yaXR5ID0gZGVmYXVsdFByaW9yaXR5ID09IENvbnRyYWN0UHJvdmlkZXIuTk9fUFJJT1JJVFk7CisgICAgICAgIGZvciAoQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogY29tcG9uZW50Q2xhc3MuZ2V0QW5ub3RhdGlvbnMoKSkgeworICAgICAgICAgICAgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBQcmlvcml0eSkgeworICAgICAgICAgICAgICAgIGlmICh1c2VBbm5vdGF0aW9uUHJpb3JpdHkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5kZWZhdWx0UHJpb3JpdHkoKChQcmlvcml0eSkgYW5ub3RhdGlvbikudmFsdWUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKEFubm90YXRpb24gbWV0YUFubm90YXRpb24gOiBhbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkuZ2V0QW5ub3RhdGlvbnMoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobWV0YUFubm90YXRpb24gaW5zdGFuY2VvZiBOYW1lQmluZGluZykgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hZGROYW1lQmluZGluZyhhbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChtZXRhQW5ub3RhdGlvbiBpbnN0YW5jZW9mIFNjb3BlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLnNjb3BlKGFubm90YXRpb24uYW5ub3RhdGlvblR5cGUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbW9kZWxFbmhhbmNlci5hcHBseShidWlsZGVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBNYXA8Q2xhc3M8Pz4sIEludGVnZXI+IGFzTWFwKFNldDxDbGFzczw/Pj4gY29udHJhY3RTZXQpIHsKKyAgICAgICAgTWFwPENsYXNzPD8+LCBJbnRlZ2VyPiBjb250cmFjdHMgPSBuZXcgSWRlbnRpdHlIYXNoTWFwPD4oKTsKKyAgICAgICAgZm9yIChDbGFzczw/PiBjb250cmFjdCA6IGNvbnRyYWN0U2V0KSB7CisgICAgICAgICAgICBjb250cmFjdHMucHV0KGNvbnRyYWN0LCBDb250cmFjdFByb3ZpZGVyLk5PX1BSSU9SSVRZKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29udHJhY3RzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhbGwgcmVnaXN0ZXJlZCBjb21wb25lbnQgY2xhc3NlcywgaW5jbHVkaW5nIHtAbGluayBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmUgZmVhdHVyZXN9CisgICAgICogYW5kIHtAbGluayBCaW5kZXIgYmluZGVyc30gbWV0YS1wcm92aWRlcnMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFsbCByZWdpc3RlcmVkIGNvbXBvbmVudCBjbGFzc2VzLgorICAgICAqLworICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgIHJldHVybiBjbGFzc2VzVmlldzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYWxsIHJlZ2lzdGVyZWQgY29tcG9uZW50IGluc3RhbmNlcywgaW5jbHVkaW5nIHtAbGluayBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmUgZmVhdHVyZXN9CisgICAgICogYW5kIHtAbGluayBCaW5kZXIgYmluZGVyc30gbWV0YS1wcm92aWRlcnMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFsbCByZWdpc3RlcmVkIGNvbXBvbmVudCBpbnN0YW5jZXMuCisgICAgICovCisgICAgcHVibGljIFNldDxPYmplY3Q+IGdldEluc3RhbmNlcygpIHsKKyAgICAgICAgcmV0dXJuIGluc3RhbmNlc1ZpZXc7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgc3Vic2V0IG9mIGFsbCByZWdpc3RlcmVkIGNvbXBvbmVudCBjbGFzc2VzIHVzaW5nIHRoZSB7QGNvZGUgZmlsdGVyfSBwcmVkaWNhdGUKKyAgICAgKiB0byBkZXRlcm1pbmUgZm9yIGVhY2ggY29tcG9uZW50IGNsYXNzIGJhc2VkIG9uIGl0J3MgY29udHJhY3QgcHJvdmlkZXIgY2xhc3MgbW9kZWwgd2hldGhlcgorICAgICAqIGl0IHNob3VsZCBiZSBrZXB0IG9yIGZpbHRlcmVkIG91dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWx0ZXIgZnVuY3Rpb24gdGhhdCBkZWNpZGVzIHdoZXRoZXIgYSBwYXJ0aWN1bGFyIGNsYXNzIHNob3VsZCBiZSByZXR1cm5lZAorICAgICAqICAgICAgICAgICAgICAgb3Igbm90LgorICAgICAqIEByZXR1cm4gZmlsdGVyZWQgc3Vic2V0IG9mIHJlZ2lzdGVyZWQgY29tcG9uZW50IGNsYXNzZXMuCisgICAgICovCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcyhmaW5hbCBQcmVkaWNhdGU8Q29udHJhY3RQcm92aWRlcj4gZmlsdGVyKSB7CisgICAgICAgIHJldHVybiBjbGFzc2VzVmlldy5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGlucHV0IC0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbnRyYWN0UHJvdmlkZXIgbW9kZWwgPSBnZXRNb2RlbChpbnB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsdGVyLnRlc3QobW9kZWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIHN1YnNldCBvZiBhbGwgcmVnaXN0ZXJlZCBjb21wb25lbnQgaW5zdGFuY2VzIHVzaW5nIHRoZSB7QGNvZGUgZmlsdGVyfSBwcmVkaWNhdGUKKyAgICAgKiB0byBkZXRlcm1pbmUgZm9yIGVhY2ggY29tcG9uZW50IGluc3RhbmNlIGJhc2VkIG9uIGl0J3MgY29udHJhY3QgcHJvdmlkZXIgY2xhc3MgbW9kZWwgd2hldGhlcgorICAgICAqIGl0IHNob3VsZCBiZSBrZXB0IG9yIGZpbHRlcmVkIG91dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWx0ZXIgZnVuY3Rpb24gdGhhdCBkZWNpZGVzIHdoZXRoZXIgYSBwYXJ0aWN1bGFyIGNsYXNzIHNob3VsZCBiZSByZXR1cm5lZAorICAgICAqICAgICAgICAgICAgICAgb3Igbm90LgorICAgICAqIEByZXR1cm4gZmlsdGVyZWQgc3Vic2V0IG9mIHJlZ2lzdGVyZWQgY29tcG9uZW50IGluc3RhbmNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2V0PE9iamVjdD4gZ2V0SW5zdGFuY2VzKGZpbmFsIFByZWRpY2F0ZTxDb250cmFjdFByb3ZpZGVyPiBmaWx0ZXIpIHsKKworICAgICAgICByZXR1cm4gaW5zdGFuY2VzVmlldy5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoaW5wdXQgLT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb250cmFjdFByb3ZpZGVyIG1vZGVsID0gZ2V0TW9kZWwoaW5wdXQuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWx0ZXIudGVzdChtb2RlbCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhbiB1bm1vZGlmaWFibGUgdmlldyBvZiBhbGwgY29tcG9uZW50IGNsYXNzZXMsIGZvciB3aGljaCBhIHJlZ2lzdHJhdGlvbiBleGlzdHMKKyAgICAgKiAoZWl0aGVyIGNsYXNzIG9yIGluc3RhbmNlIGJhc2VkKSBpbiB0aGUgY29tcG9uZW50IGJhZy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gc2V0IG9mIGNsYXNzZXMgb2YgYWxsIGNvbXBvbmVudCBjbGFzc2VzIGFuZCBpbnN0YW5jZXMgcmVnaXN0ZXJlZCBpbiB0aGlzCisgICAgICogICAgICAgICBjb21wb25lbnQgYmFnLgorICAgICAqLworICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldFJlZ2lzdHJhdGlvbnMoKSB7CisgICAgICAgIHJldHVybiBtb2RlbEtleXNWaWV3OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIG1vZGVsIGZvciBhIGdpdmVuIGNvbXBvbmVudCBjbGFzcywgb3Ige0Bjb2RlIG51bGx9IGlmIG5vIHN1Y2ggY29tcG9uZW50IGlzIHJlZ2lzdGVyZWQKKyAgICAgKiBpbiB0aGUgY29tcG9uZW50IGJhZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb21wb25lbnRDbGFzcyBjbGFzcyBvZiB0aGUgcmVnaXN0ZXJlZCBjb21wb25lbnQgdG8gcmV0cmlldmUgdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIGNvbnRyYWN0IHByb3ZpZGVyIG1vZGVsIGZvci4KKyAgICAgKiBAcmV0dXJuIG1vZGVsIGZvciBhIGdpdmVuIGNvbXBvbmVudCBjbGFzcywgb3Ige0Bjb2RlIG51bGx9IGlmIG5vIHN1Y2ggY29tcG9uZW50IGlzIHJlZ2lzdGVyZWQuCisgICAgICovCisgICAgcHVibGljIENvbnRyYWN0UHJvdmlkZXIgZ2V0TW9kZWwoQ2xhc3M8Pz4gY29tcG9uZW50Q2xhc3MpIHsKKyAgICAgICAgcmV0dXJuIG1vZGVscy5nZXQoY29tcG9uZW50Q2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIGNvcHkgb2YgdGhpcyBjb21wb25lbnQgYmFnLgorICAgICAqCisgICAgICogQHJldHVybiBjb21wb25lbnQgYmFnIGNvcHkuCisgICAgICovCisgICAgcHVibGljIENvbXBvbmVudEJhZyBjb3B5KCkgeworICAgICAgICByZXR1cm4gbmV3IENvbXBvbmVudEJhZygKKyAgICAgICAgICAgICAgICByZWdpc3RyYXRpb25TdHJhdGVneSwKKyAgICAgICAgICAgICAgICBuZXcgTGlua2VkSGFzaFNldDw+KGNsYXNzZXMpLAorICAgICAgICAgICAgICAgIG5ldyBMaW5rZWRIYXNoU2V0PD4oaW5zdGFuY2VzKSwKKyAgICAgICAgICAgICAgICBuZXcgSWRlbnRpdHlIYXNoTWFwPD4obW9kZWxzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGltbXV0YWJsZSBjb3B5IG9mIGEgY29tcG9uZW50IGJhZy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gaW1tdXRhYmxlIHZpZXcgb2YgYSBjb21wb25lbnQgYmFnLgorICAgICAqLworICAgIHB1YmxpYyBDb21wb25lbnRCYWcgaW1tdXRhYmxlQ29weSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJbW11dGFibGVDb21wb25lbnRCYWcodGhpcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhbGwgdGhlIGNvbXBvbmVudCByZWdpc3RyYXRpb25zIGFuZCByZXNldHMgdGhlIGNvbXBvbmVudCBiYWcgaW5zdGFuY2UgdG8KKyAgICAgKiBhIHN0YXRlIGFzIGlmIGl0IHdhcyBjcmVhdGUgYW5ldy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgdGhpcy5jbGFzc2VzLmNsZWFyKCk7CisgICAgICAgIHRoaXMuaW5zdGFuY2VzLmNsZWFyKCk7CisgICAgICAgIHRoaXMubW9kZWxzLmNsZWFyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYXIgYW5kIGluaXRpYWxpemUgdGhlIGNvbXBvbmVudCByZWdpc3RyYXRpb25zIGZyb20gZ2l2ZW4gYmFnIGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIGJhZyBjb21wb25lbnQgYmFnIHRvIGluaXRpYWxpemUgdGhpcyBvbmUgd2l0aC4KKyAgICAgKi8KKyAgICB2b2lkIGxvYWRGcm9tKGZpbmFsIENvbXBvbmVudEJhZyBiYWcpIHsKKyAgICAgICAgY2xlYXIoKTsKKworICAgICAgICB0aGlzLmNsYXNzZXMuYWRkQWxsKGJhZy5jbGFzc2VzKTsKKyAgICAgICAgdGhpcy5pbnN0YW5jZXMuYWRkQWxsKGJhZy5pbnN0YW5jZXMpOworICAgICAgICB0aGlzLm1vZGVscy5wdXRBbGwoYmFnLm1vZGVscyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1tdXRhYmxlIHZlcnNpb24gb2Yge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1vZGVsLmludGVybmFsLkNvbXBvbmVudEJhZ30uCisgICAgICoKKyAgICAgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEltbXV0YWJsZUNvbXBvbmVudEJhZyBleHRlbmRzIENvbXBvbmVudEJhZyB7CisgICAgICAgIEltbXV0YWJsZUNvbXBvbmVudEJhZyhDb21wb25lbnRCYWcgb3JpZ2luYWwpIHsKKyAgICAgICAgICAgIHN1cGVyKG9yaWdpbmFsLnJlZ2lzdHJhdGlvblN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgbmV3IExpbmtlZEhhc2hTZXQ8PihvcmlnaW5hbC5jbGFzc2VzKSwKKyAgICAgICAgICAgICAgICAgIG5ldyBMaW5rZWRIYXNoU2V0PD4ob3JpZ2luYWwuaW5zdGFuY2VzKSwKKyAgICAgICAgICAgICAgICAgIG5ldyBJZGVudGl0eUhhc2hNYXA8PihvcmlnaW5hbC5tb2RlbHMpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiByZWdpc3RlcihDbGFzczw/PiBjb21wb25lbnRDbGFzcywgSW5mbGVjdG9yPENvbnRyYWN0UHJvdmlkZXIuQnVpbGRlciwgQ29udHJhY3RQcm92aWRlcj4gbW9kZWxFbmhhbmNlcikgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhpcyBpbnN0YW5jZSBpcyByZWFkLW9ubHkuIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcmVnaXN0ZXIoQ2xhc3M8Pz4gY29tcG9uZW50Q2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5mbGVjdG9yPENvbnRyYWN0UHJvdmlkZXIuQnVpbGRlciwgQ29udHJhY3RQcm92aWRlcj4gbW9kZWxFbmhhbmNlcikgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhpcyBpbnN0YW5jZSBpcyByZWFkLW9ubHkuIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcmVnaXN0ZXIoQ2xhc3M8Pz4gY29tcG9uZW50Q2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldDxDbGFzczw/Pj4gY29udHJhY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmZsZWN0b3I8Q29udHJhY3RQcm92aWRlci5CdWlsZGVyLCBDb250cmFjdFByb3ZpZGVyPiBtb2RlbEVuaGFuY2VyKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGlzIGluc3RhbmNlIGlzIHJlYWQtb25seS4iKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiByZWdpc3RlcihDbGFzczw/PiBjb21wb25lbnRDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPENsYXNzPD8+LCBJbnRlZ2VyPiBjb250cmFjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZmxlY3RvcjxDb250cmFjdFByb3ZpZGVyLkJ1aWxkZXIsIENvbnRyYWN0UHJvdmlkZXI+IG1vZGVsRW5oYW5jZXIpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoaXMgaW5zdGFuY2UgaXMgcmVhZC1vbmx5LiIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHJlZ2lzdGVyKE9iamVjdCBjb21wb25lbnQsIEluZmxlY3RvcjxDb250cmFjdFByb3ZpZGVyLkJ1aWxkZXIsIENvbnRyYWN0UHJvdmlkZXI+IG1vZGVsRW5oYW5jZXIpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoaXMgaW5zdGFuY2UgaXMgcmVhZC1vbmx5LiIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHJlZ2lzdGVyKE9iamVjdCBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5mbGVjdG9yPENvbnRyYWN0UHJvdmlkZXIuQnVpbGRlciwgQ29udHJhY3RQcm92aWRlcj4gbW9kZWxFbmhhbmNlcikgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhpcyBpbnN0YW5jZSBpcyByZWFkLW9ubHkuIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcmVnaXN0ZXIoT2JqZWN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0PENsYXNzPD8+PiBjb250cmFjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZmxlY3RvcjxDb250cmFjdFByb3ZpZGVyLkJ1aWxkZXIsIENvbnRyYWN0UHJvdmlkZXI+IG1vZGVsRW5oYW5jZXIpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoaXMgaW5zdGFuY2UgaXMgcmVhZC1vbmx5LiIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHJlZ2lzdGVyKE9iamVjdCBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxDbGFzczw/PiwgSW50ZWdlcj4gY29udHJhY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmZsZWN0b3I8Q29udHJhY3RQcm92aWRlci5CdWlsZGVyLCBDb250cmFjdFByb3ZpZGVyPiBtb2RlbEVuaGFuY2VyKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGlzIGluc3RhbmNlIGlzIHJlYWQtb25seS4iKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ29tcG9uZW50QmFnIGNvcHkoKSB7CisgICAgICAgICAgICAvLyB3ZSdyZSBpbW11dGFibGUgPT4gbm8gbmVlZCB0byBjb3B5CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ29tcG9uZW50QmFnIGltbXV0YWJsZUNvcHkoKSB7CisgICAgICAgICAgICAvLyB3ZSdyZSBpbW11dGFibGUgPT4gbm8gbmVlZCB0byBjb3B5CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoaXMgaW5zdGFuY2UgaXMgcmVhZC1vbmx5LiIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tb2RlbC9pbnRlcm5hbC9GZWF0dXJlQ29udGV4dFdyYXBwZXIuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbW9kZWwvaW50ZXJuYWwvRmVhdHVyZUNvbnRleHRXcmFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY0OTc2MwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbW9kZWwvaW50ZXJuYWwvRmVhdHVyZUNvbnRleHRXcmFwcGVyLmphdmEKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubW9kZWwuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlclN1cHBsaWVyOworCisvKioKKyAqIFdyYXBwZXIgb2Yge0BsaW5rIGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHR9IHRoYXQgY2FuIHN1cHBseSBpbnN0YW5jZSBvZgorICoge0BsaW5rIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uIG1hbmFnZXJ9LgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIEZlYXR1cmVDb250ZXh0V3JhcHBlciBpbXBsZW1lbnRzIEZlYXR1cmVDb250ZXh0LCBJbmplY3Rpb25NYW5hZ2VyU3VwcGxpZXIgeworCisgICAgcHJpdmF0ZSBmaW5hbCBGZWF0dXJlQ29udGV4dCBjb250ZXh0OworICAgIHByaXZhdGUgZmluYWwgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHdyYXBwZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCAgICAgRmVhdHVyZSBjb250ZXh0IGluc3RhbmNlIHRoYXQgc2hvdWxkIGJlIHdyYXBwZWQuCisgICAgICogQHBhcmFtIGluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uIG1hbmFnZXIuCisgICAgICovCisgICAgcHVibGljIEZlYXR1cmVDb250ZXh0V3JhcHBlcihGZWF0dXJlQ29udGV4dCBjb250ZXh0LCBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIpIHsKKyAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgdGhpcy5pbmplY3Rpb25NYW5hZ2VyID0gaW5qZWN0aW9uTWFuYWdlcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29uZmlndXJhdGlvbiBnZXRDb25maWd1cmF0aW9uKCkgeworICAgICAgICByZXR1cm4gY29udGV4dC5nZXRDb25maWd1cmF0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEZlYXR1cmVDb250ZXh0IHByb3BlcnR5KFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQucHJvcGVydHkobmFtZSwgdmFsdWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBGZWF0dXJlQ29udGV4dCByZWdpc3RlcihDbGFzczw/PiBjb21wb25lbnRDbGFzcykgeworICAgICAgICByZXR1cm4gY29udGV4dC5yZWdpc3Rlcihjb21wb25lbnRDbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEZlYXR1cmVDb250ZXh0IHJlZ2lzdGVyKENsYXNzPD8+IGNvbXBvbmVudENsYXNzLCBpbnQgcHJpb3JpdHkpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQucmVnaXN0ZXIoY29tcG9uZW50Q2xhc3MsIHByaW9yaXR5KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRmVhdHVyZUNvbnRleHQgcmVnaXN0ZXIoQ2xhc3M8Pz4gY29tcG9uZW50Q2xhc3MsIENsYXNzPD8+Li4uIGNvbnRyYWN0cykgeworICAgICAgICByZXR1cm4gY29udGV4dC5yZWdpc3Rlcihjb21wb25lbnRDbGFzcywgY29udHJhY3RzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRmVhdHVyZUNvbnRleHQgcmVnaXN0ZXIoQ2xhc3M8Pz4gY29tcG9uZW50Q2xhc3MsIE1hcDxDbGFzczw/PiwgSW50ZWdlcj4gY29udHJhY3RzKSB7CisgICAgICAgIHJldHVybiBjb250ZXh0LnJlZ2lzdGVyKGNvbXBvbmVudENsYXNzLCBjb250cmFjdHMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBGZWF0dXJlQ29udGV4dCByZWdpc3RlcihPYmplY3QgY29tcG9uZW50KSB7CisgICAgICAgIHJldHVybiBjb250ZXh0LnJlZ2lzdGVyKGNvbXBvbmVudCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEZlYXR1cmVDb250ZXh0IHJlZ2lzdGVyKE9iamVjdCBjb21wb25lbnQsIGludCBwcmlvcml0eSkgeworICAgICAgICByZXR1cm4gY29udGV4dC5yZWdpc3Rlcihjb21wb25lbnQsIHByaW9yaXR5KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRmVhdHVyZUNvbnRleHQgcmVnaXN0ZXIoT2JqZWN0IGNvbXBvbmVudCwgQ2xhc3M8Pz4uLi4gY29udHJhY3RzKSB7CisgICAgICAgIHJldHVybiBjb250ZXh0LnJlZ2lzdGVyKGNvbXBvbmVudCwgY29udHJhY3RzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRmVhdHVyZUNvbnRleHQgcmVnaXN0ZXIoT2JqZWN0IGNvbXBvbmVudCwgTWFwPENsYXNzPD8+LCBJbnRlZ2VyPiBjb250cmFjdHMpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQucmVnaXN0ZXIoY29tcG9uZW50LCBjb250cmFjdHMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJbmplY3Rpb25NYW5hZ2VyIGdldEluamVjdGlvbk1hbmFnZXIoKSB7CisgICAgICAgIHJldHVybiBpbmplY3Rpb25NYW5hZ2VyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbW9kZWwvaW50ZXJuYWwvSW1tdXRhYmxlQ29tbW9uQ29uZmlnLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21vZGVsL2ludGVybmFsL0ltbXV0YWJsZUNvbW1vbkNvbmZpZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNmFhNTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21vZGVsL2ludGVybmFsL0ltbXV0YWJsZUNvbW1vbkNvbmZpZy5qYXZhCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1vZGVsLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworCisvKioKKyAqIEltbXV0YWJsZSBydW50aW1lIGNvbmZpZ3VyYXRpb24uCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEltbXV0YWJsZUNvbW1vbkNvbmZpZyBleHRlbmRzIENvbW1vbkNvbmZpZyB7CisKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBlcnJvck1lc3NhZ2U7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IGltbXV0YWJsZSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBydW50aW1lIGNvbmZpZ3VyYXRpb24KKyAgICAgKiB3aXRoIGEgY3VzdG9tIG1vZGlmaWNhdGlvbiBlcnJvciBtZXNzYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZyBvcmlnaW5hbCBydW50aW1lIGNvbmZpZ3VyYXRpb24uCisgICAgICogQHBhcmFtIG1vZGlmaWNhdGlvbkVycm9yTWVzc2FnZSBjdXN0b20gbW9kaWZpY2F0aW9uIGVycm9yIG1lc3NhZ2UuCisgICAgICovCisgICAgcHVibGljIEltbXV0YWJsZUNvbW1vbkNvbmZpZyhmaW5hbCBDb21tb25Db25maWcgY29uZmlnLCBmaW5hbCBTdHJpbmcgbW9kaWZpY2F0aW9uRXJyb3JNZXNzYWdlKSB7CisgICAgICAgIHN1cGVyKGNvbmZpZyk7CisKKyAgICAgICAgdGhpcy5lcnJvck1lc3NhZ2UgPSBtb2RpZmljYXRpb25FcnJvck1lc3NhZ2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyBpbW11dGFibGUgY29weSBvZiB0aGUgb3JpZ2luYWwgcnVudGltZSBjb25maWd1cmF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZyBvcmlnaW5hbCBydW50aW1lIGNvbmZpZ3VyYXRpb24uCisgICAgICovCisgICAgcHVibGljIEltbXV0YWJsZUNvbW1vbkNvbmZpZyhmaW5hbCBDb21tb25Db25maWcgY29uZmlnKSB7CisgICAgICAgIHRoaXMoY29uZmlnLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5DT05GSUdVUkFUSU9OX05PVF9NT0RJRklBQkxFKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJbW11dGFibGVDb21tb25Db25maWcgcHJvcGVydHkoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGVycm9yTWVzc2FnZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEltbXV0YWJsZUNvbW1vbkNvbmZpZyBzZXRQcm9wZXJ0aWVzKGZpbmFsIE1hcDxTdHJpbmcsID8+IHByb3BlcnRpZXMpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihlcnJvck1lc3NhZ2UpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJbW11dGFibGVDb21tb25Db25maWcgcmVnaXN0ZXIoZmluYWwgQ2xhc3M8Pz4gY29tcG9uZW50Q2xhc3MpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihlcnJvck1lc3NhZ2UpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJbW11dGFibGVDb21tb25Db25maWcgcmVnaXN0ZXIoZmluYWwgQ2xhc3M8Pz4gY29tcG9uZW50Q2xhc3MsIGZpbmFsIGludCBiaW5kaW5nUHJpb3JpdHkpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihlcnJvck1lc3NhZ2UpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJbW11dGFibGVDb21tb25Db25maWcgcmVnaXN0ZXIoZmluYWwgQ2xhc3M8Pz4gY29tcG9uZW50Q2xhc3MsIGZpbmFsIENsYXNzPD8+Li4uIGNvbnRyYWN0cykgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGVycm9yTWVzc2FnZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENvbW1vbkNvbmZpZyByZWdpc3RlcihDbGFzczw/PiBjb21wb25lbnRDbGFzcywgTWFwPENsYXNzPD8+LCBJbnRlZ2VyPiBjb250cmFjdHMpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihlcnJvck1lc3NhZ2UpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJbW11dGFibGVDb21tb25Db25maWcgcmVnaXN0ZXIoZmluYWwgT2JqZWN0IGNvbXBvbmVudCkgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGVycm9yTWVzc2FnZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEltbXV0YWJsZUNvbW1vbkNvbmZpZyByZWdpc3RlcihmaW5hbCBPYmplY3QgY29tcG9uZW50LCBmaW5hbCBpbnQgYmluZGluZ1ByaW9yaXR5KSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZXJyb3JNZXNzYWdlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSW1tdXRhYmxlQ29tbW9uQ29uZmlnIHJlZ2lzdGVyKGZpbmFsIE9iamVjdCBjb21wb25lbnQsIGZpbmFsIENsYXNzPD8+Li4uIGNvbnRyYWN0cykgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGVycm9yTWVzc2FnZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENvbW1vbkNvbmZpZyByZWdpc3RlcihPYmplY3QgY29tcG9uZW50LCBNYXA8Q2xhc3M8Pz4sIEludGVnZXI+IGNvbnRyYWN0cykgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGVycm9yTWVzc2FnZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENvbW1vbkNvbmZpZyBsb2FkRnJvbShDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGVycm9yTWVzc2FnZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tb2RlbC9pbnRlcm5hbC9NYW5hZ2VkT2JqZWN0c0ZpbmFsaXplci5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tb2RlbC9pbnRlcm5hbC9NYW5hZ2VkT2JqZWN0c0ZpbmFsaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlZGFhMWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21vZGVsL2ludGVybmFsL01hbmFnZWRPYmplY3RzRmluYWxpemVyLmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb2RlbC5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByZURlc3Ryb3k7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworCisvKioKKyAqIEludm9rZXMge0BsaW5rIFByZURlc3Ryb3l9IG1ldGhvZHMgb24gYWxsIHJlZ2lzdGVyZWQgb2JqZWN0cywgd2hlbiB0aGUgaW5qZWN0aW9uIG1hbmFnZXIgaXMgc2h1dCBkb3duLgorICogPHAvPgorICogU29tZSBvYmplY3RzIG1hbmFnZWQgYnkgSmVyc2V5IGFyZSBjcmVhdGVkIHVzaW5nIHtAbGluayBJbmplY3Rpb25NYW5hZ2VyI2NyZWF0ZUFuZEluaXRpYWxpemV9LiBUaGlzIG1lYW5zCisgKiB0aGF0IHN1Y2ggb2JqZWN0cyBhcmUgY3JlYXRlZCwgZGVwZW5kZW5jaWVzIGluamVjdGVkIGFuZCBtZXRob2RzIGFubm90YXRlZCB3aXRoIHtAbGluayBqYXZheC5hbm5vdGF0aW9uLlBvc3RDb25zdHJ1Y3R9CisgKiBpbnZva2VkLiBUaGVyZWZvcmUgbWV0aG9kcyBhbm5vdGF0ZWQgd2l0aCB7QGxpbmsgUHJlRGVzdHJveX0gc2hvdWxkIGJlIGludm9rZWQgb24gc3VjaCBvYmplY3RzIHRvbywgd2hlbiB0aGV5IGFyZSBkZXN0cm95ZWQuCisgKiA8cC8+CisgKiBUaGlzIHNlcnZpY2UgaW52b2tlcyB7QGxpbmsgUHJlRGVzdHJveX0gb24gYWxsIHJlZ2lzdGVyZWQgb2JqZWN0cyB3aGVuIHtAbGluayBJbmplY3Rpb25NYW5hZ2VyI3NodXRkb3duKCl9IGlzIGludm9rZWQKKyAqIG9uIHRoZSBpbmplY3Rpb24gbWFuYWdlciB3aGVyZSB0aGlzIHNlcnZpY2UgaXMgcmVnaXN0ZXJlZC4gVGhlcmVmb3JlIG9ubHkgY2xhc3NlcyB3aXRoIHRoZWlyIGxpZmVjeWNsZSBsaW5rZWQKKyAqIHRvIHRoZSBpbmplY3Rpb24gbWFuYWdlciB0aGF0IGNyZWF0ZWQgdGhlbSBzaG91bGQgYmUgcmVnaXN0ZXJlZCBoZXJlLgorICoKKyAqIEBhdXRob3IgUGV0ciBKYW5vdWNoIChwZXRyLmphbm91Y2ggYXQgb3JhY2xlLmNvbSkKKyAqLworQFNpbmdsZXRvbgorcHVibGljIGNsYXNzIE1hbmFnZWRPYmplY3RzRmluYWxpemVyIHsKKworICAgIHByaXZhdGUgZmluYWwgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyOworCisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8T2JqZWN0PiBtYW5hZ2VkT2JqZWN0cyA9IG5ldyBIYXNoU2V0PD4oKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2Yge0BsaW5rIE1hbmFnZWRPYmplY3RzRmluYWxpemVyfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbiBtYW5hZ2VyIGNhbGwge0Bjb2RlIHByZURlc3Ryb3l9IG9uIG1hbmFnZWQgb2JqZWN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWFuYWdlZE9iamVjdHNGaW5hbGl6ZXIoZmluYWwgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyKSB7CisgICAgICAgIHRoaXMuaW5qZWN0aW9uTWFuYWdlciA9IGluamVjdGlvbk1hbmFnZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgYW4gb2JqZWN0IGZvciBpbnZvY2F0aW9uIG9mIGl0cyB7QGxpbmsgUHJlRGVzdHJveX0gbWV0aG9kLgorICAgICAqIEl0IHdpbGwgYmUgaW52b2tlZCB3aGVuIHRoZSBpbmplY3Rpb24gbWFuYWdlciBpcyBzaHV0IGRvd24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JqZWN0IGFuIG9iamVjdCB0byBiZSByZWdpc3RlcmVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRm9yUHJlRGVzdHJveUNhbGwoT2JqZWN0IG9iamVjdCkgeworICAgICAgICBtYW5hZ2VkT2JqZWN0cy5hZGQob2JqZWN0KTsKKyAgICB9CisKKyAgICBAUHJlRGVzdHJveQorICAgIHB1YmxpYyB2b2lkIHByZURlc3Ryb3koKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmb3IgKE9iamVjdCBvIDogbWFuYWdlZE9iamVjdHMpIHsKKyAgICAgICAgICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLnByZURlc3Ryb3kobyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIG1hbmFnZWRPYmplY3RzLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21vZGVsL2ludGVybmFsL1JhbmtlZENvbXBhcmF0b3IuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbW9kZWwvaW50ZXJuYWwvUmFua2VkQ29tcGFyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYzYxMWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21vZGVsL2ludGVybmFsL1JhbmtlZENvbXBhcmF0b3IuamF2YQpAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1vZGVsLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CisKKy8qKgorICogQ29tcGFyYXRvciB1c2VkIHRvIHNvcnQgdHlwZXMgYnkgdGhlaXIgcHJpb3JpdGllcyBkZWZpbmVkIGJ5IHRoZWlycyBiaW5kaW5nIHByaW9yaXR5IHNldCBkdXJpbmcgdGhlIGNvbmZpZ3VyYXRpb24gcGhhc2UKKyAqICh7QGxpbmsgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9ufSkgaW4ge0BsaW5rIFJhbmtlZFByb3ZpZGVyIHJhbmtlZCBwcm92aWRlcn0uCisgKgorICogQHBhcmFtIDxUPiBUeXBlIG9mIHRoZSBlbGVtZW50cyB0byBiZSBzb3J0ZWQuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBSYW5rZWRDb21wYXJhdG9yPFQ+IGltcGxlbWVudHMgQ29tcGFyYXRvcjxSYW5rZWRQcm92aWRlcjxUPj4geworCisgICAgLyoqCisgICAgICogRGVmaW5lcyB3aGljaCBvcmRlcmluZyBzaG91bGQgYmUgdXNlZCBmb3Igc29ydGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZW51bSBPcmRlciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBBc2NlbmRpbmcgb3JkZXIuIFRoZSBsb3dlc3QgcHJpb3JpdHkgZmlyc3QsIHRoZSBoaWdoZXN0IHByaW9yaXR5IGxhc3QuCisgICAgICAgICAqLworICAgICAgICBBU0NFTkRJTkcoMSksCisgICAgICAgIC8qKgorICAgICAgICAgKiBBc2NlbmRpbmcgb3JkZXIuIFRoZSBoaWdoZXN0IHByaW9yaXR5IGZpcnN0LCB0aGUgbG93ZXN0IHByaW9yaXR5IGxhc3QuCisgICAgICAgICAqLworICAgICAgICBERVNDRU5ESU5HKC0xKTsKKworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBvcmRlcmluZzsKKworICAgICAgICBwcml2YXRlIE9yZGVyKGludCBvcmRlcmluZykgeworICAgICAgICAgICAgdGhpcy5vcmRlcmluZyA9IG9yZGVyaW5nOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBPcmRlciBvcmRlcjsKKworICAgIHB1YmxpYyBSYW5rZWRDb21wYXJhdG9yKCkgeworICAgICAgICB0aGlzKE9yZGVyLkFTQ0VORElORyk7CisgICAgfQorCisgICAgcHVibGljIFJhbmtlZENvbXBhcmF0b3IoZmluYWwgT3JkZXIgb3JkZXIpIHsKKyAgICAgICAgdGhpcy5vcmRlciA9IG9yZGVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgY29tcGFyZShmaW5hbCBSYW5rZWRQcm92aWRlcjxUPiBvMSwgZmluYWwgUmFua2VkUHJvdmlkZXI8VD4gbzIpIHsKKyAgICAgICAgcmV0dXJuICgoZ2V0UHJpb3JpdHkobzEpID4gZ2V0UHJpb3JpdHkobzIpKSA/IG9yZGVyLm9yZGVyaW5nIDogLW9yZGVyLm9yZGVyaW5nKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgaW50IGdldFByaW9yaXR5KGZpbmFsIFJhbmtlZFByb3ZpZGVyPFQ+IHJhbmtlZFByb3ZpZGVyKSB7CisgICAgICAgIHJldHVybiByYW5rZWRQcm92aWRlci5nZXRSYW5rKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tb2RlbC9pbnRlcm5hbC9SYW5rZWRQcm92aWRlci5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tb2RlbC9pbnRlcm5hbC9SYW5rZWRQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhOGI3OGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21vZGVsL2ludGVybmFsL1JhbmtlZFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubW9kZWwuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcmlvcml0aWVzOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qcmlvcml0eTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1vZGVsLkNvbnRyYWN0UHJvdmlkZXI7CisKKy8qKgorICogSmVyc2V5IHJhbmtlZCBwcm92aWRlciBtb2RlbC4KKyAqCisgKiBAcGFyYW0gPFQ+IHNlcnZpY2UgcHJvdmlkZXIgY29udHJhY3QgSmF2YSB0eXBlLgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBSYW5rZWRQcm92aWRlcjxUPiB7CisKKyAgICBwcml2YXRlIGZpbmFsIFQgcHJvdmlkZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgcmFuazsKKyAgICBwcml2YXRlIGZpbmFsIFNldDxUeXBlPiBjb250cmFjdFR5cGVzOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgUmFua2VkUHJvdmlkZXJ9IGluc3RhbmNlLiBUaGUgcmFuayBvZiB0aGUgcHJvdmlkZXIgaXMgb2J0YWluZWQgZnJvbSB0aGUge0BsaW5rIGphdmF4LmFubm90YXRpb24uUHJpb3JpdHl9CisgICAgICogYW5ub3RhdGlvbiBvciBpcyBzZXQgdG8ge0B2YWx1ZSBqYXZheC53cy5ycy5Qcmlvcml0aWVzI1VTRVJ9IGlmIHRoZSBhbm5vdGF0aW9uIGlzIG5vdCBwcmVzZW50LgorICAgICAqCisgICAgICogQHBhcmFtIHByb3ZpZGVyIHNlcnZpY2UgcHJvdmlkZXIgdG8gY3JlYXRlIGEge0Bjb2RlIFJhbmtlZFByb3ZpZGVyfSBpbnN0YW5jZSBmcm9tLgorICAgICAqLworICAgIHB1YmxpYyBSYW5rZWRQcm92aWRlcihmaW5hbCBUIHByb3ZpZGVyKSB7CisgICAgICAgIHRoaXMucHJvdmlkZXIgPSBwcm92aWRlcjsKKyAgICAgICAgdGhpcy5yYW5rID0gY29tcHV0ZVJhbmsocHJvdmlkZXIsIENvbnRyYWN0UHJvdmlkZXIuTk9fUFJJT1JJVFkpOworICAgICAgICB0aGlzLmNvbnRyYWN0VHlwZXMgPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIFJhbmtlZFByb3ZpZGVyfSBpbnN0YW5jZSBmb3IgZ2l2ZW4ge0Bjb2RlIHByb3ZpZGVyfSB3aXRoIHNwZWNpZmljIHtAY29kZSByYW5rfSAoPiAwKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm92aWRlciBzZXJ2aWNlIHByb3ZpZGVyIHRvIGNyZWF0ZSBhIHtAY29kZSBSYW5rZWRQcm92aWRlcn0gaW5zdGFuY2UgZnJvbS4KKyAgICAgKiBAcGFyYW0gcmFuayByYW5rIG9mIHRoaXMgcHJvdmlkZXIuCisgICAgICovCisgICAgcHVibGljIFJhbmtlZFByb3ZpZGVyKGZpbmFsIFQgcHJvdmlkZXIsIGZpbmFsIGludCByYW5rKSB7CisgICAgICAgIHRoaXMocHJvdmlkZXIsIHJhbmssIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIFJhbmtlZFByb3ZpZGVyfSBpbnN0YW5jZSBmb3IgZ2l2ZW4ge0Bjb2RlIHByb3ZpZGVyfSB3aXRoIHNwZWNpZmljIHtAY29kZSByYW5rfSAoPiAwKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm92aWRlciBzZXJ2aWNlIHByb3ZpZGVyIHRvIGNyZWF0ZSBhIHtAY29kZSBSYW5rZWRQcm92aWRlcn0gaW5zdGFuY2UgZnJvbS4KKyAgICAgKiBAcGFyYW0gcmFuayByYW5rIG9mIHRoaXMgcHJvdmlkZXIuCisgICAgICogQHBhcmFtIGNvbnRyYWN0cyBjb250cmFjdHMgaW1wbGVtZW50ZWQgYnkgdGhlIHNlcnZpY2UgcHJvdmlkZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgUmFua2VkUHJvdmlkZXIoZmluYWwgVCBwcm92aWRlciwgZmluYWwgaW50IHJhbmssIGZpbmFsIFNldDxUeXBlPiBjb250cmFjdHMpIHsKKyAgICAgICAgdGhpcy5wcm92aWRlciA9IHByb3ZpZGVyOworICAgICAgICB0aGlzLnJhbmsgPSBjb21wdXRlUmFuayhwcm92aWRlciwgcmFuayk7CisgICAgICAgIHRoaXMuY29udHJhY3RUeXBlcyA9IGNvbnRyYWN0czsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBjb21wdXRlUmFuayhmaW5hbCBUIHByb3ZpZGVyLCBmaW5hbCBpbnQgcmFuaykgeworICAgICAgICBpZiAocmFuayA+IDApIHsKKyAgICAgICAgICAgIHJldHVybiByYW5rOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQ2xhc3M8Pz4gY2xhenogPSBwcm92aWRlci5nZXRDbGFzcygpOworCisgICAgICAgICAgICAvLyB3aGVuIHByb3ZpZGVkIGluc3RhbmNlIGlzIGEgcHJveHkgKGZyb20gd2VsZCksIHdlIG5lZWQgdG8gZ2V0IHRoZSByaWdodCBjbGFzcyB0byBjaGVjayBmb3IKKyAgICAgICAgICAgIC8vIEBQcmlvcml0eSBhbm5vdGF0aW9uIC0gcHJveHkgZG9lc24ndCBwcm9wYWdhdGUgaXNBbm5vdGF0aW9uUHJlc2VudCB0byB0aGUgcGFyZW50IGNsYXNzLgorICAgICAgICAgICAgd2hpbGUgKGNsYXp6LmlzU3ludGhldGljKCkpIHsKKyAgICAgICAgICAgICAgICBjbGF6eiA9IGNsYXp6LmdldFN1cGVyY2xhc3MoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNsYXp6LmlzQW5ub3RhdGlvblByZXNlbnQoUHJpb3JpdHkuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXp6LmdldEFubm90YXRpb24oUHJpb3JpdHkuY2xhc3MpLnZhbHVlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBQcmlvcml0aWVzLlVTRVI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgVCBnZXRQcm92aWRlcigpIHsKKyAgICAgICAgcmV0dXJuIHByb3ZpZGVyOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UmFuaygpIHsKKyAgICAgICAgcmV0dXJuIHJhbms7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IG1lIHNldCBvZiBpbXBsZW1lbnRlZCBjb250cmFjdHMuCisgICAgICogUmV0dXJucyBudWxsIGlmIG5vIGNvbnRyYWN0cyBhcmUgaW1wbGVtZW50ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHNldCBvZiBjb250cmFjdHMgb3IgbnVsbCBpZiBubyBjb250cmFjdHMgaGF2ZSBiZWVuIGltcGxlbWVudGVkLgorICAgICAqLworICAgIHB1YmxpYyBTZXQ8VHlwZT4gZ2V0Q29udHJhY3RUeXBlcygpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRyYWN0VHlwZXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIHByb3ZpZGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbW9kZWwvaW50ZXJuYWwvcGFja2FnZS1pbmZvLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21vZGVsL2ludGVybmFsL3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMTkyMGMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21vZGVsL2ludGVybmFsL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKKy8qKgorICogQ29tbW9uIEplcnNleSBpbnRlcm5hbCBtb2RlbCByZWxhdGVkIGNsYXNzZXMgYW5kIGludGVyZmFjZXMuIEluIHRoaXMgcGFja2FnZSBjYW4gYmUgZm91bmQgY2xhc3NlcyByZWxhdGVkIHRvCisgKiBpbmplY3Rpb24gc2NvcGVzLCBjb21tb24gY29uZmlndXJhdGlvbiwgaW5qZWN0aW9ucyBhbmQgcHJvdmlkZXJzLgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1vZGVsLmludGVybmFsOwpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tb2RlbC9wYWNrYWdlLWluZm8uamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbW9kZWwvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFlOWM3YwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbW9kZWwvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoqCisgKiBDb21tb24gSmVyc2V5IG1vZGVsIHJlbGF0ZWQgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcy4gSW4gdGhpcyBwYWNrYWdlIGNhbiBiZSBmb3VuZCBjbGFzc2VzIHJlbGF0ZWQgdG8KKyAqIGluamVjdGlvbiBzY29wZXMsIGNvbW1vbiBjb25maWd1cmF0aW9uLCBpbmplY3Rpb25zIGFuZCBwcm92aWRlcnMuCisgKi8KK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubW9kZWw7CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3BhY2thZ2UtaW5mby5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTEwNmRiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvKioKKyAqIENvbW1vbiBKZXJzZXkgY29yZSBjbGFzc2VzLgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5OwpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9wcm9jZXNzL0luZmxlY3Rvci5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9wcm9jZXNzL0luZmxlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMGJhMjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Byb2Nlc3MvSW5mbGVjdG9yLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzOworCisvKioKKyAqIEEgZ2VuZXJpYyBpbnRlcmZhY2UgZm9yIHRyYW5zZm9ybWluZyBkYXRhIGludG8gYSByZXN1bHQuCisgKgorICogQHBhcmFtIDxEQVRBPiB0cmFuc2Zvcm1hYmxlIGRhdGEgdHlwZS4KKyAqIEBwYXJhbSA8UkVTVUxUPiB0eXBlIG9mIHJlc3VsdCBwcm9kdWNlZCBieSBhIHN1Y2Nlc3NmdWwgaW5mbGVjdG9yIGRhdGEgdHJhbnNmb3JtYXRpb24uCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGludGVyZmFjZSBJbmZsZWN0b3I8REFUQSwgUkVTVUxUPiB7CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2Zvcm0gZGF0YSBvZiBhIGdpdmVuIHR5cGUgaW50byBhIHJlc3VsdCBvZiB0aGUgZGlmZmVyZW50IHR5cGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGF0YSBkYXRhIHRvIGJlIHRyYW5zZm9ybWVkIGludG8gYSByZXN1bHQuCisgICAgICogQHJldHVybiBkYXRhIHRyYW5zZm9ybWF0aW9uIHJlc3VsdC4gUmV0dXJuIHZhbHVlIG11c3Qgbm90IGJlIHtAY29kZSBudWxsfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUkVTVUxUIGFwcGx5KERBVEEgZGF0YSk7Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Byb2Nlc3MvSmVyc2V5UHJvY2Vzc2luZ1VuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlci5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9wcm9jZXNzL0plcnNleVByb2Nlc3NpbmdVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2ZkOGYyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9wcm9jZXNzL0plcnNleVByb2Nlc3NpbmdVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3M7CisKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKKworLyoqCisgKiBVbmNhdWdodCBleGNlcHRpb24gaGFuZGxlciB0aGF0IGNhbiBiZSB1c2VkIGJ5IHZhcmlvdXMgSmVyc2V5IHJlcXVlc3QgcHJvY2Vzc2luZyB0aHJlYWQgcG9vbHMgdW5jYXVnaHQgZXhjZXB0aW9ucy4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICogQHNpbmNlIDIuMTcKKyAqLworcHVibGljIGNsYXNzIEplcnNleVByb2Nlc3NpbmdVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIgaW1wbGVtZW50cyBUaHJlYWQuVW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihKZXJzZXlQcm9jZXNzaW5nVW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBwcml2YXRlIGZpbmFsIExldmVsIGxvZ0xldmVsOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyBKZXJzZXkgcHJvY2Vzc2luZyB1bmNhdWdodCBleGNlcHRpb24gaGFuZGxlci4KKyAgICAgKiA8cD4KKyAgICAgKiBBbGwgdW5jYXVnaHQgZXhjZXB0aW9ucyB3aWxsIGJlIGxvZ2dlZCB1c2luZyB0aGUge0BsaW5rIExldmVsI1dBUk5JTkcgV0FSTklOR30gbG9nZ2luZyBsZXZlbC4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIEplcnNleVByb2Nlc3NpbmdVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIoKSB7CisgICAgICAgIHRoaXMoTGV2ZWwuV0FSTklORyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyBKZXJzZXkgcHJvY2Vzc2luZyB1bmNhdWdodCBleGNlcHRpb24gaGFuZGxlci4KKyAgICAgKiA8cD4KKyAgICAgKiBBbGwgdW5jYXVnaHQgZXhjZXB0aW9ucyB3aWxsIGJlIGxvZ2dlZCB1c2luZyB0aGUgc3VwcGxpZWQgbG9nZ2luZyBsZXZlbC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9nTGV2ZWwgY3VzdG9tIGxvZ2dpbmcgbGV2ZWwgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBsb2cgdW5jYXVnaHQgZXhjZXB0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgSmVyc2V5UHJvY2Vzc2luZ1VuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcihMZXZlbCBsb2dMZXZlbCkgeworICAgICAgICB0aGlzLmxvZ0xldmVsID0gbG9nTGV2ZWw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdW5jYXVnaHRFeGNlcHRpb24oVGhyZWFkIHQsIFRocm93YWJsZSBlKSB7CisgICAgICAgIExPR0dFUi5sb2cobG9nTGV2ZWwsIExvY2FsaXphdGlvbk1lc3NhZ2VzLlVOSEFORExFRF9FWENFUFRJT05fREVURUNURUQodC5nZXROYW1lKCkpLCBlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Byb2Nlc3MvaW50ZXJuYWwvQWJzdHJhY3RDaGFpbmFibGVTdGFnZS5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9wcm9jZXNzL2ludGVybmFsL0Fic3RyYWN0Q2hhaW5hYmxlU3RhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGYxY2JlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9wcm9jZXNzL2ludGVybmFsL0Fic3RyYWN0Q2hhaW5hYmxlU3RhZ2UuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWw7CisKKy8qKgorICogQWJzdHJhY3QgY2hhaW5hYmxlIGxpbmVhciBhY2NlcHRvci4KKyAqCisgKiBJbXBsZW1lbnRzIHN1cHBvcnQgZm9yIG1hbmFnaW5nIHRoZSBkZWZhdWx0IG5leHQgc3RhZ2UgdmFsdWUuCisgKgorICogQHBhcmFtIDxEQVRBPiBwcm9jZXNzZWQgZGF0YSB0eXBlLgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q2hhaW5hYmxlU3RhZ2U8REFUQT4gaW1wbGVtZW50cyBDaGFpbmFibGVTdGFnZTxEQVRBPiB7CisKKyAgICBwcml2YXRlIFN0YWdlPERBVEE+IG5leHRTdGFnZTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBjaGFpbmFibGUgYWNjZXB0b3Igd2l0aCBubyBuZXh0IHN0YWdlIHNldC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQWJzdHJhY3RDaGFpbmFibGVTdGFnZSgpIHsKKyAgICAgICAgdGhpcyhudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgY2hhaW5hYmxlIGFjY2VwdG9yIHdpdGggYW4gaW5pdGlhbGl6ZWQgZGVmYXVsdAorICAgICAqIG5leHQgc3RhZ2UgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmV4dFN0YWdlIGRlZmF1bHQgbmV4dCBzdGFnZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQWJzdHJhY3RDaGFpbmFibGVTdGFnZShTdGFnZTxEQVRBPiBuZXh0U3RhZ2UpIHsKKyAgICAgICAgdGhpcy5uZXh0U3RhZ2UgPSBuZXh0U3RhZ2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZpbmFsIHZvaWQgc2V0RGVmYXVsdE5leHQoU3RhZ2U8REFUQT4gbmV4dCkgeworICAgICAgICB0aGlzLm5leHRTdGFnZSA9IG5leHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBkZWZhdWx0IG5leHQgc3RhZ2UgY3VycmVudGx5IGNvbmZpZ3VyZWQgb24gdGhlIGFjY2VwdG9yLgorICAgICAqCisgICAgICogQHJldHVybiBkZWZhdWx0IG5leHQgc3RhZ2UgY3VycmVudGx5IGNvbmZpZ3VyZWQgb24gdGhlIGFjY2VwdG9yLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBTdGFnZTxEQVRBPiBnZXREZWZhdWx0TmV4dCgpIHsKKyAgICAgICAgcmV0dXJuIG5leHRTdGFnZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Byb2Nlc3MvaW50ZXJuYWwvQWJzdHJhY3RFeGVjdXRvclByb3ZpZGVyc0NvbmZpZ3VyYXRvci5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9wcm9jZXNzL2ludGVybmFsL0Fic3RyYWN0RXhlY3V0b3JQcm92aWRlcnNDb25maWd1cmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWQyNTJlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9wcm9jZXNzL2ludGVybmFsL0Fic3RyYWN0RXhlY3V0b3JQcm92aWRlcnNDb25maWd1cmF0b3IuamF2YQpAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuQm9vdHN0cmFwQ29uZmlndXJhdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1vZGVsLmludGVybmFsLkNvbXBvbmVudEJhZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLlNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyOworCisvKioKKyAqIEFic3RyYWN0IENvbmZpZ3VyYXRvciB3aGljaCBpbml0aWFsaXplcyBhbmQgcmVnaXN0ZXIge0BsaW5rIEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyfSBhbmQKKyAqIHtAbGluayBTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2VQcm92aWRlcn0uCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEV4ZWN1dG9yUHJvdmlkZXJzQ29uZmlndXJhdG9yIGltcGxlbWVudHMgQm9vdHN0cmFwQ29uZmlndXJhdG9yIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZ1bmN0aW9uPE9iamVjdCwgRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXI+IENBU1RfVE9fRVhFQ1VUT1JfUFJPVklERVIgPQorICAgICAgICAgICAgRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXIuY2xhc3M6OmNhc3Q7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGdW5jdGlvbjxPYmplY3QsIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyPiBDQVNUX1RPX1NDSEVEVUxFRF9FWEVDVVRPUl9QUk9WSURFUiA9CisgICAgICAgICAgICBTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2VQcm92aWRlci5jbGFzczo6Y2FzdDsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyByZWdpc3RlcmVkIHtAbGluayBFeGVjdXRvclNlcnZpY2VQcm92aWRlcn0gYW5kIHtAbGluayBTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2VQcm92aWRlcn0gYnkgYW4gYXBwbGljYXRpb24gYW5kCisgICAgICogYWRkcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhvc2UgaW50ZXJmYWNlcyB0byBiaW5kcyB0aGVtIGludG8ge0BsaW5rIEluamVjdGlvbk1hbmFnZXJ9LgorICAgICAqCisgICAgICogQHBhcmFtIGluamVjdGlvbk1hbmFnZXIgICAgICAgICAgICAgICAgIGluamVjdGlvbiBtYW5hZ2VyIHVzZWQgZm9yIGJpbmRpbmcgc2VsZWN0ZWQgZXhlY3V0b3Igc2VydmljZSBwcm92aWRlcnMuCisgICAgICogQHBhcmFtIGNvbXBvbmVudEJhZyAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVzIGV4ZWN1dG9yIHNlcnZpY2UgcHJvdmlkZXJzIHJlZ2lzdGVyZWQgYnkgYW4gYXBwbGljYXRpb24uCisgICAgICogQHBhcmFtIGRlZmF1bHRBc3luY0V4ZWN1dG9yUHJvdmlkZXIgICAgIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyfS4KKyAgICAgKiBAcGFyYW0gZGVmYXVsdFNjaGVkdWxlZEV4ZWN1dG9yUHJvdmlkZXIgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXJ9LgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJlZ2lzdGVyRXhlY3V0b3JzKAorICAgICAgICAgICAgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyLAorICAgICAgICAgICAgQ29tcG9uZW50QmFnIGNvbXBvbmVudEJhZywKKyAgICAgICAgICAgIEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyIGRlZmF1bHRBc3luY0V4ZWN1dG9yUHJvdmlkZXIsCisgICAgICAgICAgICBTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2VQcm92aWRlciBkZWZhdWx0U2NoZWR1bGVkRXhlY3V0b3JQcm92aWRlcikgeworCisgICAgICAgIExpc3Q8RXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXI+IGN1c3RvbUV4ZWN1dG9ycyA9CisgICAgICAgICAgICAgICAgU3RyZWFtLmNvbmNhdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEJhZy5nZXRDbGFzc2VzKENvbXBvbmVudEJhZy5FWEVDVVRPUl9TRVJWSUNFX1BST1ZJREVSX09OTFkpLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoaW5qZWN0aW9uTWFuYWdlcjo6Y3JlYXRlQW5kSW5pdGlhbGl6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRCYWcuZ2V0SW5zdGFuY2VzKENvbXBvbmVudEJhZy5FWEVDVVRPUl9TRVJWSUNFX1BST1ZJREVSX09OTFkpLnN0cmVhbSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChDQVNUX1RPX0VYRUNVVE9SX1BST1ZJREVSKQorICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgICAgIGN1c3RvbUV4ZWN1dG9ycy5hZGQoZGVmYXVsdEFzeW5jRXhlY3V0b3JQcm92aWRlcik7CisKKyAgICAgICAgTGlzdDxTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2VQcm92aWRlcj4gY3VzdG9tU2NoZWR1bGVkRXhlY3V0b3JzID0KKyAgICAgICAgICAgICAgICBTdHJlYW0uY29uY2F0KAorICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50QmFnLmdldENsYXNzZXMoQ29tcG9uZW50QmFnLlNDSEVEVUxFRF9FWEVDVVRPUl9TRVJWSUNFX1BST1ZJREVSX09OTFkpLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoaW5qZWN0aW9uTWFuYWdlcjo6Y3JlYXRlQW5kSW5pdGlhbGl6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRCYWcuZ2V0SW5zdGFuY2VzKENvbXBvbmVudEJhZy5TQ0hFRFVMRURfRVhFQ1VUT1JfU0VSVklDRV9QUk9WSURFUl9PTkxZKS5zdHJlYW0oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoQ0FTVF9UT19TQ0hFRFVMRURfRVhFQ1VUT1JfUFJPVklERVIpCisgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICAgICAgY3VzdG9tU2NoZWR1bGVkRXhlY3V0b3JzLmFkZChkZWZhdWx0U2NoZWR1bGVkRXhlY3V0b3JQcm92aWRlcik7CisKKyAgICAgICAgRXhlY3V0b3JQcm92aWRlcnMucmVnaXN0ZXJFeGVjdXRvckJpbmRpbmdzKGluamVjdGlvbk1hbmFnZXIsIGN1c3RvbUV4ZWN1dG9ycywgY3VzdG9tU2NoZWR1bGVkRXhlY3V0b3JzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Byb2Nlc3MvaW50ZXJuYWwvQ2hhaW5hYmxlU3RhZ2UuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvcHJvY2Vzcy9pbnRlcm5hbC9DaGFpbmFibGVTdGFnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYzEwM2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Byb2Nlc3MvaW50ZXJuYWwvQ2hhaW5hYmxlU3RhZ2UuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CisKKy8qKgorICogTGluZWFyIGFjY2VwdG9yIHRoYXQgY2FuIGJlIGNvbXBvc2VkIGludG8gYSBjaGFpbi4KKyAqCisgKiBUaGUgYWNjZXB0b3IgZXhwb3NlcyBhIG1ldGhvZCBmb3Igc2V0dGluZyBhIHZhbHVlIG9mIHRoZQorICoge0BsaW5rICNzZXREZWZhdWx0TmV4dChTdGFnZSkgbmV4dCBhY2NlcHRvcn0gaW4gdGhlIGNoYWluIHRoYXQKKyAqIHNob3VsZCBiZSByZXR1cm5lZCBmcm9tIHRoZSBjaGFpbiBieSBkZWZhdWx0LgorICogPHA+CisgKiBUaGUgdHlwaWNhbCB1c2UgY2FzZSBmb3IgaW1wbGVtZW50aW5nIHRoZSBhY2NlcHRvciBpcyBhIGxvZ2ljIHRoYXQgdXN1YWxseQorICogbmVlZHMgdG8gcGVyZm9ybSBzb21lIGxvZ2ljLCBidXQgdW5saWtlIGFuIHtAbGluayBTdGFnZS5CdWlsZGVyI3RvKEZ1bmN0aW9uKX0KKyAqIGFjY2VwdG9yIGNyZWF0ZWQgZnJvbSBhIGZ1bmN0aW9ufSBpdCBhbHNvIG5lZWRzIHRvIGJlIGFibGUgdG8gZGVjaWRlIHRvIG92ZXJyaWRlCisgKiB0aGUgZGVmYXVsdCBuZXh0IGFjY2VwdG9yIGFuZCByZXR1cm4gYSBkaWZmZXJlbnQgYWNjZXB0b3IsIGVmZmVjdGl2ZWx5IGJyYW5jaGluZworICogYXdheSBmcm9tIHRoZSBvcmlnaW5hbCBsaW5lYXIgYWNjZXB0b3IgY2hhaW4uIFRoaXMgdGVjaG5pcXVlIGNhbiBiZSBlLmcuIHVzZWQKKyAqIHRvIGJyZWFrIHRoZSBhY2NlcHRpbmcgY2hhaW4gYnkgcmV0dXJuaW5nIGEgY3VzdG9tIHtAbGluayBJbmZsZWN0aW5nIGluZmxlY3Rpbmd9CisgKiBhY2NlcHRvciwgZXRjLgorICogPC9wPgorICoKKyAqIEBwYXJhbSA8REFUQT4gcHJvY2Vzc2VkIGRhdGEgdHlwZS4KKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ2hhaW5hYmxlU3RhZ2U8REFUQT4gZXh0ZW5kcyBTdGFnZTxEQVRBPiB7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRlZmF1bHQgbmV4dCBzdGFnZSB0aGF0IHNob3VsZCBiZSByZXR1cm5lZCBmcm9tIHRoaXMKKyAgICAgKiBzdGFnZSBhZnRlciBpdCBoYXMgYmVlbiBpbnZva2VkIGJ5IGRlZmF1bHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmV4dCB0aGUgbmV4dCBkZWZhdWx0IHN0YWdlIGluIHRoZSBjaGFpbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0TmV4dChTdGFnZTxEQVRBPiBuZXh0KTsKK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvcHJvY2Vzcy9pbnRlcm5hbC9FeGVjdXRvclByb3ZpZGVycy5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9wcm9jZXNzL2ludGVybmFsL0V4ZWN1dG9yUHJvdmlkZXJzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTViY2Y1NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvcHJvY2Vzcy9pbnRlcm5hbC9FeGVjdXRvclByb3ZpZGVycy5qYXZhCkBAIC0wLDAgKzEsMjcxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuTmFtZWQ7CitpbXBvcnQgamF2YXguaW5qZWN0LlF1YWxpZmllcjsKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkJpbmRpbmdzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5EaXNwb3NhYmxlU3VwcGxpZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LlByb3ZpZGVyczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuU3VwcGxpZXJJbnN0YW5jZUJpbmRpbmc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5FeHRlbmRlZExvZ2dlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlJlZmxlY3Rpb25IZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLkV4ZWN1dG9yU2VydmljZVByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5TY2hlZHVsZWRFeGVjdXRvclNlcnZpY2VQcm92aWRlcjsKKworLyoqCisgKiBBIHV0aWxpdHkgY2xhc3Mgd2l0aCBhIG1ldGhvZHMgZm9yIGhhbmRsaW5nIGV4ZWN1dG9yIGluamVjdGlvbiByZWdpc3RyYXRpb24gYW5kIHByb3BlciBkaXNwb3NhbC4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRXhlY3V0b3JQcm92aWRlcnMgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXh0ZW5kZWRMb2dnZXIgTE9HR0VSID0KKyAgICAgICAgICAgIG5ldyBFeHRlbmRlZExvZ2dlcihMb2dnZXIuZ2V0TG9nZ2VyKEV4ZWN1dG9yUHJvdmlkZXJzLmNsYXNzLmdldE5hbWUoKSksIExldmVsLkZJTkVTVCk7CisKKyAgICBwcml2YXRlIEV4ZWN1dG9yUHJvdmlkZXJzKCkgeworICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIkluc3RhbnRpYXRpb24gbm90IGFsbG93ZWQuIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIHF1YWxpZmllZCB7QGxpbmsgRXhlY3V0b3JTZXJ2aWNlfSBhbmQge0BsaW5rIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZX0gaW5qZWN0aW9uIGJpbmRpbmdzIGJhc2VkIG9uIHRoZSByZWdpc3RlcmVkCisgICAgICogcHJvdmlkZXJzIGltcGxlbWVudGluZyB0aGUge0BsaW5rIEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyfSBhbmQvb3Ige0BsaW5rIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyfSBTUEkuCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2Qgc3VwcG9ydHMgY3JlYXRpb24gb2YgcXVhbGlmaWVkIGluamVjdGlvbiBiaW5kaW5ncyBiYXNlZCBvbiBjdXN0b20ge0BsaW5rIFF1YWxpZmllciBxdWFsaWZpZXIgYW5ub3RhdGlvbnN9CisgICAgICogYXR0YWNoZWQgdG8gdGhlIHJlZ2lzdGVyZWQgcHJvdmlkZXIgaW1wbGVtZW50YXRpb24gY2xhc3NlcyBhcyB3ZWxsIGFzIG5hbWVkIGluamVjdGlvbiBiaW5kaW5ncyBiYXNlZCBvbiB0aGUge0BsaW5rIE5hbWVkfQorICAgICAqIHF1YWxpZmllciBhbm5vdGF0aW9uIGF0dGFjaGVkIHRvIHRoZSByZWdpc3RlcmVkIHByb3ZpZGVyIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuIHtAbGluayBFeGVjdXRvclNlcnZpY2VQcm92aWRlcn0gYW5kCisgICAgICoge0BsaW5rIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyfSB3aWxsIGJlIHJldHJpZXZlZCBmcm9tIHtAbGluayBJbmplY3Rpb25NYW5hZ2VyfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmplY3Rpb25NYW5hZ2VyIGFwcGxpY2F0aW9uJ3MgaW5qZWN0aW9uIG1hbmFnZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyRXhlY3V0b3JCaW5kaW5ncyhJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIpIHsKKyAgICAgICAgTGlzdDxFeGVjdXRvclNlcnZpY2VQcm92aWRlcj4gZXhlY3V0b3JQcm92aWRlcnMgPQorICAgICAgICAgICAgICAgIGdldEV4ZWN1dG9yUHJvdmlkZXJzKGluamVjdGlvbk1hbmFnZXIsIEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyLmNsYXNzKTsKKyAgICAgICAgTGlzdDxTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2VQcm92aWRlcj4gc2NoZWR1bGVkUHJvdmlkZXJzID0KKyAgICAgICAgICAgICAgICBnZXRFeGVjdXRvclByb3ZpZGVycyhpbmplY3Rpb25NYW5hZ2VyLCBTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2VQcm92aWRlci5jbGFzcyk7CisKKyAgICAgICAgcmVnaXN0ZXJFeGVjdXRvckJpbmRpbmdzKGluamVjdGlvbk1hbmFnZXIsIGV4ZWN1dG9yUHJvdmlkZXJzLCBzY2hlZHVsZWRQcm92aWRlcnMpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIDxUPiBMaXN0PFQ+IGdldEV4ZWN1dG9yUHJvdmlkZXJzKEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciwgQ2xhc3M8VD4gcHJvdmlkZXJDbGFzcykgeworICAgICAgICBTZXQ8VD4gY3VzdG9tUHJvdmlkZXJzID0gUHJvdmlkZXJzLmdldEN1c3RvbVByb3ZpZGVycyhpbmplY3Rpb25NYW5hZ2VyLCBwcm92aWRlckNsYXNzKTsKKyAgICAgICAgU2V0PFQ+IGRlZmF1bHRQcm92aWRlcnMgPSBQcm92aWRlcnMuZ2V0UHJvdmlkZXJzKGluamVjdGlvbk1hbmFnZXIsIHByb3ZpZGVyQ2xhc3MpOworICAgICAgICAvLyBHZXQgb25seSBkZWZhdWx0IHByb3ZpZGVycworICAgICAgICBkZWZhdWx0UHJvdmlkZXJzLnJlbW92ZUFsbChjdXN0b21Qcm92aWRlcnMpOworCisgICAgICAgIExpc3Q8VD4gZXhlY3V0b3JQcm92aWRlcnMgPSBuZXcgTGlua2VkTGlzdDw+KGN1c3RvbVByb3ZpZGVycyk7CisgICAgICAgIGV4ZWN1dG9yUHJvdmlkZXJzLmFkZEFsbChkZWZhdWx0UHJvdmlkZXJzKTsKKyAgICAgICAgcmV0dXJuIGV4ZWN1dG9yUHJvdmlkZXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBxdWFsaWZpZWQge0BsaW5rIEV4ZWN1dG9yU2VydmljZX0gYW5kIHtAbGluayBTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2V9IGluamVjdGlvbiBiaW5kaW5ncyBiYXNlZCBvbiB0aGUgcmVnaXN0ZXJlZAorICAgICAqIHByb3ZpZGVycyBpbXBsZW1lbnRpbmcgdGhlIHtAbGluayBFeGVjdXRvclNlcnZpY2VQcm92aWRlcn0gYW5kL29yIHtAbGluayBTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2VQcm92aWRlcn0gU1BJLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIHN1cHBvcnRzIGNyZWF0aW9uIG9mIHF1YWxpZmllZCBpbmplY3Rpb24gYmluZGluZ3MgYmFzZWQgb24gY3VzdG9tIHtAbGluayBRdWFsaWZpZXIgcXVhbGlmaWVyIGFubm90YXRpb25zfQorICAgICAqIGF0dGFjaGVkIHRvIHRoZSByZWdpc3RlcmVkIHByb3ZpZGVyIGltcGxlbWVudGF0aW9uIGNsYXNzZXMgYXMgd2VsbCBhcyBuYW1lZCBpbmplY3Rpb24gYmluZGluZ3MgYmFzZWQgb24gdGhlIHtAbGluayBOYW1lZH0KKyAgICAgKiBxdWFsaWZpZXIgYW5ub3RhdGlvbiBhdHRhY2hlZCB0byB0aGUgcmVnaXN0ZXJlZCBwcm92aWRlciBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLgorICAgICAqCisgICAgICogQHBhcmFtIGluamVjdGlvbk1hbmFnZXIgICBpbmplY3Rpb24gbWFuYWdlciB0byByZWdpc3RlciBuZXdseSBjcmVhdGVkIGV4ZWN1dG9yIGJpbmRpbmdzLgorICAgICAqIEBwYXJhbSBleGVjdXRvclByb3ZpZGVycyAgYWxsIGV4ZWN1dG9yIHByb3ZpZGVycyByZWdpc3RlcmVkIGludGVybmFsbHkgaW4gSmVyc2V5IGFuZCBpbiBjb25maWd1cmF0aW9uLgorICAgICAqIEBwYXJhbSBzY2hlZHVsZWRQcm92aWRlcnMgYWxsIHNjaGVkdWxlZCBleGVjdXRvciBwcm92aWRlcnMgcmVnaXN0ZXJlZCBpbnRlcm5hbGx5IGluIEplcnNleSBhbmQgaW4gY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJFeGVjdXRvckJpbmRpbmdzKAorICAgICAgICAgICAgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyLAorICAgICAgICAgICAgTGlzdDxFeGVjdXRvclNlcnZpY2VQcm92aWRlcj4gZXhlY3V0b3JQcm92aWRlcnMsCisgICAgICAgICAgICBMaXN0PFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyPiBzY2hlZHVsZWRQcm92aWRlcnMpIHsKKworICAgICAgICBNYXA8Q2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+LCBMaXN0PEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyPj4gZXhlY3V0b3JQcm92aWRlck1hcCA9CisgICAgICAgICAgICAgICAgZ2V0UXVhbGlmaWVyVG9Qcm92aWRlck1hcChleGVjdXRvclByb3ZpZGVycyk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQWRkIEV4ZWN1dG9yU2VydmljZSBpbnRvIERJIGZyYW1ld29yay4KKyAgICAgICAgICovCisgICAgICAgIGZvciAoTWFwLkVudHJ5PENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiwgTGlzdDxFeGVjdXRvclNlcnZpY2VQcm92aWRlcj4+IHF1YWxpZmllclRvUHJvdmlkZXJzCisgICAgICAgICAgICAgICAgOiBleGVjdXRvclByb3ZpZGVyTWFwLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBxdWFsaWZpZXJBbm5vdGF0aW9uQ2xhc3MgPSBxdWFsaWZpZXJUb1Byb3ZpZGVycy5nZXRLZXkoKTsKKworICAgICAgICAgICAgSXRlcmF0b3I8RXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXI+IGJ1Y2tldFByb3ZpZGVySXRlcmF0b3IgPSBxdWFsaWZpZXJUb1Byb3ZpZGVycy5nZXRWYWx1ZSgpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICBFeGVjdXRvclNlcnZpY2VQcm92aWRlciBleGVjdXRvclByb3ZpZGVyID0gYnVja2V0UHJvdmlkZXJJdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICBsb2dFeGVjdXRvclNlcnZpY2VQcm92aWRlcihxdWFsaWZpZXJBbm5vdGF0aW9uQ2xhc3MsIGJ1Y2tldFByb3ZpZGVySXRlcmF0b3IsIGV4ZWN1dG9yUHJvdmlkZXIpOworCisgICAgICAgICAgICBTdXBwbGllckluc3RhbmNlQmluZGluZzxFeGVjdXRvclNlcnZpY2U+IGRlc2NyaXB0b3IgPQorICAgICAgICAgICAgICAgICAgICBCaW5kaW5ncy5zdXBwbGllcihuZXcgRXhlY3V0b3JTZXJ2aWNlU3VwcGxpZXIoZXhlY3V0b3JQcm92aWRlcikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmluKFNpbmdsZXRvbi5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG8oRXhlY3V0b3JTZXJ2aWNlLmNsYXNzKTsKKworICAgICAgICAgICAgQW5ub3RhdGlvbiBxdWFsaWZpZXIgPSBleGVjdXRvclByb3ZpZGVyLmdldENsYXNzKCkuZ2V0QW5ub3RhdGlvbihxdWFsaWZpZXJBbm5vdGF0aW9uQ2xhc3MpOworICAgICAgICAgICAgaWYgKHF1YWxpZmllciBpbnN0YW5jZW9mIE5hbWVkKSB7CisgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5uYW1lZCgoKE5hbWVkKSBxdWFsaWZpZXIpLnZhbHVlKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLnF1YWxpZmllZEJ5KHF1YWxpZmllcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGluamVjdGlvbk1hbmFnZXIucmVnaXN0ZXIoZGVzY3JpcHRvcik7CisgICAgICAgIH0KKworICAgICAgICBNYXA8Q2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+LCBMaXN0PFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyPj4gc2NoZWR1bGVyUHJvdmlkZXJNYXAgPQorICAgICAgICAgICAgICAgIGdldFF1YWxpZmllclRvUHJvdmlkZXJNYXAoc2NoZWR1bGVkUHJvdmlkZXJzKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBBZGQgU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlIGludG8gREkgZnJhbWV3b3JrLgorICAgICAgICAgKi8KKyAgICAgICAgZm9yIChNYXAuRW50cnk8Q2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+LCBMaXN0PFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyPj4gcXVhbGlmaWVyVG9Qcm92aWRlcnMKKyAgICAgICAgICAgICAgICA6IHNjaGVkdWxlclByb3ZpZGVyTWFwLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBxdWFsaWZpZXJBbm5vdGF0aW9uQ2xhc3MgPSBxdWFsaWZpZXJUb1Byb3ZpZGVycy5nZXRLZXkoKTsKKworICAgICAgICAgICAgSXRlcmF0b3I8U2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXI+IGJ1Y2tldFByb3ZpZGVySXRlcmF0b3IgPSBxdWFsaWZpZXJUb1Byb3ZpZGVycy5nZXRWYWx1ZSgpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICBTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2VQcm92aWRlciBleGVjdXRvclByb3ZpZGVyID0gYnVja2V0UHJvdmlkZXJJdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICBsb2dTY2hlZHVsZWRFeGVjdXRvclByb3ZpZGVyKHF1YWxpZmllckFubm90YXRpb25DbGFzcywgYnVja2V0UHJvdmlkZXJJdGVyYXRvciwgZXhlY3V0b3JQcm92aWRlcik7CisKKyAgICAgICAgICAgIFN1cHBsaWVySW5zdGFuY2VCaW5kaW5nPFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZT4gZGVzY3JpcHRvciA9CisgICAgICAgICAgICAgICAgICAgIEJpbmRpbmdzLnN1cHBsaWVyKG5ldyBTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2VTdXBwbGllcihleGVjdXRvclByb3ZpZGVyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW4oU2luZ2xldG9uLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50byhTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UuY2xhc3MpOworCisgICAgICAgICAgICBpZiAoIWV4ZWN1dG9yUHJvdmlkZXJNYXAuY29udGFpbnNLZXkocXVhbGlmaWVyQW5ub3RhdGlvbkNsYXNzKSkgeworICAgICAgICAgICAgICAgIC8vIGl0IGlzIHNhZmUgdG8gcmVnaXN0ZXIgYmluZGluZyBmb3IgRXhlY3V0b3JTZXJ2aWNlIHRvby4uLgorICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IudG8oRXhlY3V0b3JTZXJ2aWNlLmNsYXNzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQW5ub3RhdGlvbiBxdWFsaWZpZXIgPSBleGVjdXRvclByb3ZpZGVyLmdldENsYXNzKCkuZ2V0QW5ub3RhdGlvbihxdWFsaWZpZXJBbm5vdGF0aW9uQ2xhc3MpOworICAgICAgICAgICAgaWYgKHF1YWxpZmllciBpbnN0YW5jZW9mIE5hbWVkKSB7CisgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5uYW1lZCgoKE5hbWVkKSBxdWFsaWZpZXIpLnZhbHVlKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLnF1YWxpZmllZEJ5KHF1YWxpZmllcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGluamVjdGlvbk1hbmFnZXIucmVnaXN0ZXIoZGVzY3JpcHRvcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGxvZ1NjaGVkdWxlZEV4ZWN1dG9yUHJvdmlkZXIoQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IHF1YWxpZmllckFubm90YXRpb25DbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8U2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXI+IGJ1Y2tldFByb3ZpZGVySXRlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyIGV4ZWN1dG9yUHJvdmlkZXIpIHsKKyAgICAgICAgaWYgKExPR0dFUi5pc0xvZ2dhYmxlKExldmVsLkNPTkZJRykpIHsKKyAgICAgICAgICAgIExPR0dFUi5jb25maWcoTG9jYWxpemF0aW9uTWVzc2FnZXMuVVNJTkdfU0NIRURVTEVSX1BST1ZJREVSKAorICAgICAgICAgICAgICAgICAgICBleGVjdXRvclByb3ZpZGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpLCBxdWFsaWZpZXJBbm5vdGF0aW9uQ2xhc3MuZ2V0TmFtZSgpKSk7CisKKyAgICAgICAgICAgIGlmIChidWNrZXRQcm92aWRlckl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgbXNnID0gbmV3IFN0cmluZ0J1aWxkZXIoYnVja2V0UHJvdmlkZXJJdGVyYXRvci5uZXh0KCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIHdoaWxlIChidWNrZXRQcm92aWRlckl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBtc2cuYXBwZW5kKCIsICIpLmFwcGVuZChidWNrZXRQcm92aWRlckl0ZXJhdG9yLm5leHQoKS5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIExPR0dFUi5jb25maWcoTG9jYWxpemF0aW9uTWVzc2FnZXMuSUdOT1JFRF9TQ0hFRFVMRVJfUFJPVklERVJTKAorICAgICAgICAgICAgICAgICAgICAgICAgbXNnLnRvU3RyaW5nKCksIHF1YWxpZmllckFubm90YXRpb25DbGFzcy5nZXROYW1lKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbG9nRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXIoQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IHF1YWxpZmllckFubm90YXRpb25DbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyPiBidWNrZXRQcm92aWRlckl0ZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXIgZXhlY3V0b3JQcm92aWRlcikgeworICAgICAgICBpZiAoTE9HR0VSLmlzTG9nZ2FibGUoTGV2ZWwuQ09ORklHKSkgeworICAgICAgICAgICAgTE9HR0VSLmNvbmZpZyhMb2NhbGl6YXRpb25NZXNzYWdlcy5VU0lOR19FWEVDVVRPUl9QUk9WSURFUigKKyAgICAgICAgICAgICAgICAgICAgZXhlY3V0b3JQcm92aWRlci5nZXRDbGFzcygpLmdldE5hbWUoKSwgcXVhbGlmaWVyQW5ub3RhdGlvbkNsYXNzLmdldE5hbWUoKSkpOworCisgICAgICAgICAgICBpZiAoYnVja2V0UHJvdmlkZXJJdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIG1zZyA9IG5ldyBTdHJpbmdCdWlsZGVyKGJ1Y2tldFByb3ZpZGVySXRlcmF0b3IubmV4dCgpLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoYnVja2V0UHJvdmlkZXJJdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbXNnLmFwcGVuZCgiLCAiKS5hcHBlbmQoYnVja2V0UHJvdmlkZXJJdGVyYXRvci5uZXh0KCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBMT0dHRVIuY29uZmlnKExvY2FsaXphdGlvbk1lc3NhZ2VzLklHTk9SRURfRVhFQ1VUT1JfUFJPVklERVJTKAorICAgICAgICAgICAgICAgICAgICAgICAgbXNnLnRvU3RyaW5nKCksIHF1YWxpZmllckFubm90YXRpb25DbGFzcy5nZXROYW1lKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIDxUIGV4dGVuZHMgRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXI+IE1hcDxDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4sIExpc3Q8VD4+IGdldFF1YWxpZmllclRvUHJvdmlkZXJNYXAoCisgICAgICAgICAgICBMaXN0PFQ+IGV4ZWN1dG9yUHJvdmlkZXJzKSB7CisKKyAgICAgICAgLy8gaXRlcmF0ZSBvdmVyIHByb3ZpZGVycyBhbmQgbWFwIHRoZW0gYnkgUXVhbGlmaWVyIGFubm90YXRpb25zIChjdXN0b20gb25lcyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBidWNrZXRzIGZpcnN0KQorICAgICAgICBmaW5hbCBNYXA8Q2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+LCBMaXN0PFQ+PiBleGVjdXRvclByb3ZpZGVyTWFwID0gbmV3IEhhc2hNYXA8PigpOworCisgICAgICAgIGZvciAoVCBwcm92aWRlciA6IGV4ZWN1dG9yUHJvdmlkZXJzKSB7CisgICAgICAgICAgICBmb3IgKENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBxdWFsaWZpZXIKKyAgICAgICAgICAgICAgICAgICAgOiBSZWZsZWN0aW9uSGVscGVyLmdldEFubm90YXRpb25UeXBlcyhwcm92aWRlci5nZXRDbGFzcygpLCBRdWFsaWZpZXIuY2xhc3MpKSB7CisKKyAgICAgICAgICAgICAgICBMaXN0PFQ+IHByb3ZpZGVyc0ZvclF1YWxpZmllcjsKKyAgICAgICAgICAgICAgICBpZiAoIWV4ZWN1dG9yUHJvdmlkZXJNYXAuY29udGFpbnNLZXkocXVhbGlmaWVyKSkgeworICAgICAgICAgICAgICAgICAgICBwcm92aWRlcnNGb3JRdWFsaWZpZXIgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9yUHJvdmlkZXJNYXAucHV0KHF1YWxpZmllciwgcHJvdmlkZXJzRm9yUXVhbGlmaWVyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwcm92aWRlcnNGb3JRdWFsaWZpZXIgPSBleGVjdXRvclByb3ZpZGVyTWFwLmdldChxdWFsaWZpZXIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByb3ZpZGVyc0ZvclF1YWxpZmllci5hZGQocHJvdmlkZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGV4ZWN1dG9yUHJvdmlkZXJNYXA7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRXhlY3V0b3JTZXJ2aWNlU3VwcGxpZXIgaW1wbGVtZW50cyBEaXNwb3NhYmxlU3VwcGxpZXI8RXhlY3V0b3JTZXJ2aWNlPiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBFeGVjdXRvclNlcnZpY2VQcm92aWRlciBleGVjdXRvclByb3ZpZGVyOworCisgICAgICAgIHByaXZhdGUgRXhlY3V0b3JTZXJ2aWNlU3VwcGxpZXIoRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXIgZXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXIpIHsKKyAgICAgICAgICAgIGV4ZWN1dG9yUHJvdmlkZXIgPSBleGVjdXRvclNlcnZpY2VQcm92aWRlcjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRXhlY3V0b3JTZXJ2aWNlIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBleGVjdXRvclByb3ZpZGVyLmdldEV4ZWN1dG9yU2VydmljZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGluc3RhbmNlKSB7CisgICAgICAgICAgICBleGVjdXRvclByb3ZpZGVyLmRpc3Bvc2UoaW5zdGFuY2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlU3VwcGxpZXIgaW1wbGVtZW50cyBEaXNwb3NhYmxlU3VwcGxpZXI8U2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlPiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2VQcm92aWRlciBleGVjdXRvclByb3ZpZGVyOworCisgICAgICAgIHByaXZhdGUgU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlU3VwcGxpZXIoU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXIgZXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXIpIHsKKyAgICAgICAgICAgIGV4ZWN1dG9yUHJvdmlkZXIgPSBleGVjdXRvclNlcnZpY2VQcm92aWRlcjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBleGVjdXRvclByb3ZpZGVyLmdldEV4ZWN1dG9yU2VydmljZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoZmluYWwgU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlIGluc3RhbmNlKSB7CisgICAgICAgICAgICBleGVjdXRvclByb3ZpZGVyLmRpc3Bvc2UoaW5zdGFuY2UpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Byb2Nlc3MvaW50ZXJuYWwvSW5mbGVjdGluZy5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9wcm9jZXNzL2ludGVybmFsL0luZmxlY3RpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTdmNDY4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9wcm9jZXNzL2ludGVybmFsL0luZmxlY3RpbmcuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLkluZmxlY3RvcjsKKworLyoqCisgKiBJbnRlcmZhY2UgdGhhdCBpcyB1c2VkIHRvIGluZGljYXRlIHRoYXQgdGhlIGluc3RhbmNlIHByb3ZpZGVzIGFuIHtAbGluayBJbmZsZWN0b3J9LgorICogPHA+CisgKiBBIHR5cGljYWwgdXNlIGNhc2UgaXMgYSB0ZXJtaW5hbCAobGVhZikgcmVxdWVzdCBwcm9jZXNzaW5nIHN0YWdlCisgKiBub2RlIHRoYXQgdHJhbnNmb3JtcyBhIHJlcXVlc3QgaW50byBhIHJlc3BvbnNlLgorICogPC9wPgorICoKKyAqIEBwYXJhbSA8REFUQT4gZGF0YSB0eXBlIHRyYW5zZm9ybWFibGUgYnkgdGhlIHByb3ZpZGVkIGluZmxlY3Rvci4KKyAqIEBwYXJhbSA8UkVTVUxUPiB0eXBlIG9mIGEgcmVzdWx0IHByb2R1Y2VkIGJ5IHRoZSBwcm92aWRlZCBpbmZsZWN0b3Igb24gc3VjY2Vzcy4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgaW50ZXJmYWNlIEluZmxlY3Rpbmc8REFUQSwgUkVTVUxUPiB7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGluZmxlY3RvciBjYXBhYmxlIG9mIHRyYW5zZm9ybWluZyBzdXBwbGllZCBkYXRhIGludG8gYSByZXN1bHQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGRhdGEgdG8gcmVzdWx0IHRyYW5zZm9ybWF0aW9uLgorICAgICAqLworICAgIEluZmxlY3RvcjxEQVRBLCBSRVNVTFQ+IGluZmxlY3RvcigpOworfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9wcm9jZXNzL2ludGVybmFsL1JlcXVlc3RDb250ZXh0LmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Byb2Nlc3MvaW50ZXJuYWwvUmVxdWVzdENvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjEyZTdjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9wcm9jZXNzL2ludGVybmFsL1JlcXVlc3RDb250ZXh0LmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLmludGVybmFsOworCisvKioKKyAqIFdyYXBwZXIgZm9yIGV4dGVybmFsbHkgcHJvdmlkZWQgcmVxdWVzdCBjb250ZXh0IGRhdGEuCisgICoKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitwdWJsaWMgaW50ZXJmYWNlIFJlcXVlc3RDb250ZXh0IHsKKworICAgIC8qKgorICAgICAqIEdldCBhICJuZXciIHJlZmVyZW5jZSBvZiB0aGUgc2NvcGUgaW5zdGFuY2UuIHtAbGluayBSZXF1ZXN0Q29udGV4dH0gaW1wbGVtZW50YXRpb24gaXMgYWJsZSB0byB0cmFjayByZWZlcmVuY2VkIGluc3RhbmNlcworICAgICAqIGFuZCB0aGVuIHByb3ZpZGUgYW55IGFkZGl0aW9uYWwgbG9naWMgZHVyaW5nIHRoZSByZWxlYXNpbmcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHJlZmVyZW5jZWQgc2NvcGUgaW5zdGFuY2UuCisgICAgICovCisgICAgUmVxdWVzdENvbnRleHQgZ2V0UmVmZXJlbmNlKCk7CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIGEgc2luZ2xlIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCByZXF1ZXN0IHNjb3BlIGluc3RhbmNlLiBPbmNlIGFsbCBpbnN0YW5jZSByZWZlcmVuY2VzIGFyZSByZWxlYXNlZCwgdGhlIGluc3RhbmNlCisgICAgICogd2lsbCBiZSByZWN5Y2xlZC4KKyAgICAgKi8KKyAgICB2b2lkIHJlbGVhc2UoKTsKKworfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9wcm9jZXNzL2ludGVybmFsL1JlcXVlc3RTY29wZS5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9wcm9jZXNzL2ludGVybmFsL1JlcXVlc3RTY29wZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NjcxOTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Byb2Nlc3MvaW50ZXJuYWwvUmVxdWVzdFNjb3BlLmphdmEKQEAgLTAsMCArMSw0MTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkJvb3RzdHJhcEJhZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Cb290c3RyYXBDb25maWd1cmF0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuRXJyb3JzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuRXh0ZW5kZWRMb2dnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5Qcm9kdWNlcjsKKworaW1wb3J0IHN0YXRpYyBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YS5QcmVjb25kaXRpb25zLmNoZWNrU3RhdGU7CisKKy8qKgorICogU2NvcGVzIGEgc2luZ2xlIHJlcXVlc3QvcmVzcG9uc2UgcHJvY2Vzc2luZyBleGVjdXRpb24gb24gYSBzaW5nbGUgdGhyZWFkLgorICogPHA+CisgKiBUbyBleGVjdXRlIGEgY29kZSBpbnNpZGUgb2YgdGhlIHJlcXVlc3Qgc2NvcGUgdXNlIG9uZSBvZiB0aGUge0Bjb2RlIHJ1bkluU2NvcGUoLi4uKX0KKyAqIG1ldGhvZHMgYW5kIHN1cHBseSB0aGUgdGFzayBlbmNhcHN1bGF0aW5nIHRoZSBjb2RlIHRoYXQgc2hvdWxkIGJlIGV4ZWN1dGVkIGluIHRoZSBzY29wZS4KKyAqIDwvcD4KKyAqIDxwPgorICogRXhhbXBsZToKKyAqIDwvcD4KKyAqIDxwcmU+CisgKiAmIzA2NDtJbmplY3QKKyAqIFJlcXVlc3RTY29wZSByZXF1ZXN0U2NvcGU7CisgKgorICogLi4uCisgKgorICogcmVxdWVzdFNjb3BlLnJ1bkluU2NvcGUobmV3IFJ1bm5hYmxlKCkgeworICogICAgICYjMDY0O092ZXJyaWRlCisgKiAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICogICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaGlzIGlzIGV4ZWN1dGVkIGluIHRoZSByZXF1ZXN0IHNjb3BlLi4uIik7CisgKiAgICAgfQorICogfSk7CisgKiA8L3ByZT4KKyAqIDxwPgorICogQW4gaW5zdGFuY2Ugb2YgdGhlIHJlcXVlc3Qgc2NvcGUgY2FuIGJlIHN1c3BlbmRlZCBhbmQgcmV0cmlldmVkIHZpYSBhIGNhbGwgdG8KKyAqIHtAbGluayBSZXF1ZXN0U2NvcGUjc3VzcGVuZEN1cnJlbnR9IG1ldGhvZC4gVGhpcyBpbnN0YW5jZSBjYW4gYmUgbGF0ZXIKKyAqIHVzZWQgdG8gcmVzdW1lIHRoZSBzYW1lIHJlcXVlc3Qgc2NvcGUgYW5kIHJ1biBhbm90aGVyIHRhc2sgaW4gdGhlIHNhbWUgc2NvcGU6CisgKiA8L3A+CisgKiA8cHJlPgorICogIFJlcXVlc3RDb250ZXh0IHJlcXVlc3RTY29wZUNvbnRleHQgPQorICogICAgICByZXF1ZXN0U2NvcGUucnVuSW5TY29wZShuZXcgQ2FsbGFibGUmbHQ7SW5zdGFuY2UmZ3Q7KCkgeworICogICAgICAgICAgJiMwNjQ7T3ZlcnJpZGUKKyAqICAgICAgICAgIHB1YmxpYyBSZXF1ZXN0Q29udGV4dCBjYWxsKCkgeworICogICAgICAgICAgICAgIC8vIFRoaXMgaXMgZXhlY3V0ZWQgaW4gdGhlIG5ldyByZXF1ZXN0IHNjb3BlLgorICoKKyAqICAgICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGNhbGwgd2lsbCBjYXVzZSB0aGF0IHRoZQorICogICAgICAgICAgICAgIC8vIFJlcXVlc3RDb250ZXh0IHdpbGwgbm90IGJlIHJlbGVhc2VkCisgKiAgICAgICAgICAgICAgLy8gYXV0b21hdGljYWxseSBhbmQgd2Ugd2lsbCBoYXZlIHRvIHJlbGVhc2UKKyAqICAgICAgICAgICAgICAvLyBpdCBleHBsaWNpdGx5IGF0IHRoZSBlbmQuCisgKiAgICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3RTY29wZS5zdXNwZW5kQ3VycmVudCgpOworICogICAgICAgICAgfQorICogICAgICB9KTsKKyAqCisgKiAgcmVxdWVzdFNjb3BlLnJ1bkluU2NvcGUocmVxdWVzdFNjb3BlQ29udGV4dCwgbmV3IFJ1bm5hYmxlKCkgeworICoKKyAqICAgICAgJiMwNjQ7T3ZlcnJpZGUKKyAqICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICogICAgICAgICAgLy8gVGhpcyBpcyBleGVjdXRlZCBpbiB0aGUgc2FtZSByZXF1ZXN0IHNjb3BlIGFzIGNvZGUgYWJvdmUuCisgKiAgICAgIH0KKyAqICB9KTsKKyAqCisgKiAgLy8gVGhlIHNjb3BlIGNvbnRleHQgbXVzdCBiZSBleHBsaWNpdGx5IHJlbGVhc2VkLgorICogIHJlcXVlc3RTY29wZUNvbnRleHQucmVsZWFzZSgpOworICogPC9wcmU+CisgKiA8cD4KKyAqIEluIHRoZSBwcmV2aW91cyBleGFtcGxlIHRoZSB7QGxpbmsgUmVxdWVzdENvbnRleHQgcmVxdWVzdCBzY29wZSBjb250ZXh0fQorICogd2FzIHN1c3BlbmRlZCBhbmQgcmV0cmlldmVkIHdoaWNoIGFsc28gaW5mb3JtcyB7QGNvZGUgcmVxdWVzdFNjb3BlfSB0aGF0IGl0CisgKiBzaG91bGQgbm90IGF1dG9tYXRpY2FsbHkgcmVsZWFzZSB0aGUgaW5zdGFuY2Ugb25jZSB0aGUgcnVubmluZyB0YXNrIGlzIGZpbmlzaGVkLgorICogVGhlIHtAY29kZSByZXF1ZXN0U2NvcGVDb250ZXh0fSBpcyB0aGVuIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgbmV4dAorICogcmVxdWVzdC1zY29wZWQgZXhlY3V0aW9uLiBUaGUgc2Vjb25kIHRhc2sgd2lsbCBydW4gaW4gdGhlIHNhbWUgcmVxdWVzdCBzY29wZSBhcyB0aGUKKyAqIGZpcnN0IHRhc2suIEF0IHRoZSBlbmQgdGhlIHN1c3BlbmRlZCB7QGNvZGUgcmVxdWVzdFNjb3BlQ29udGV4dH0gbXVzdCBiZQorICogbWFudWFsbHkge0BsaW5rIFJlcXVlc3RDb250ZXh0I3JlbGVhc2UgcmVsZWFzZWR9LiBOb3QgcmVsZWFzaW5nIHRoZSBpbnN0YW5jZQorICogY291bGQgY2F1c2UgbWVtb3J5IGxlYWtzLiBQbGVhc2Ugbm90ZSB0aGF0IGNhbGxpbmcge0BsaW5rIFJlcXVlc3RTY29wZSNzdXNwZW5kQ3VycmVudH0KKyAqIGRvZXMgbm90IHJldHJpZXZlIGFuIGltbXV0YWJsZSBzbmFwc2hvdCBvZiB0aGUgY3VycmVudCByZXF1ZXN0IHNjb3BlIGJ1dAorICogYSBsaXZlIHJlZmVyZW5jZSB0byB0aGUgaW50ZXJuYWwge0BsaW5rIFJlcXVlc3RDb250ZXh0IHJlcXVlc3Qgc2NvcGUgY29udGV4dH0KKyAqIHdoaWNoIG1heSBjaGFuZ2UgaXQncyBzdGF0ZSBkdXJpbmcgZWFjaCByZXF1ZXN0LXNjb3BlZCB0YXNrIGV4ZWN1dGlvbiBmb3IKKyAqIHdoaWNoIHRoaXMgc2NvcGUgY29udGV4dCBpcyB1c2VkLgorICogPC9wPgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZXF1ZXN0U2NvcGUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXh0ZW5kZWRMb2dnZXIgbG9nZ2VyID0gbmV3IEV4dGVuZGVkTG9nZ2VyKExvZ2dlci5nZXRMb2dnZXIoUmVxdWVzdFNjb3BlLmNsYXNzLmdldE5hbWUoKSksIExldmVsLkZJTkVTVCk7CisKKyAgICAvKioKKyAgICAgKiBBIHRocmVhZCBsb2NhbCBjb3B5IG9mIHRoZSBjdXJyZW50IHNjb3BlIGNvbnRleHQuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBUaHJlYWRMb2NhbDxSZXF1ZXN0Q29udGV4dD4gY3VycmVudFJlcXVlc3RDb250ZXh0ID0gbmV3IFRocmVhZExvY2FsPD4oKTsKKyAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gaXNBY3RpdmUgPSB0cnVlOworCisgICAgcHVibGljIGJvb2xlYW4gaXNBY3RpdmUoKSB7CisgICAgICAgIHJldHVybiBpc0FjdGl2ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHsKKyAgICAgICAgaXNBY3RpdmUgPSBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBuZXcgcmVmZXJlbmNlIGZvciB0byBjdXJyZW50bHkgcnVubmluZyByZXF1ZXN0IHNjb3BlIGNvbnRleHQuIFRoaXMgY2FsbAorICAgICAqIHByZXZlbnRzIGF1dG9tYXRpYyB7QGxpbmsgUmVxdWVzdENvbnRleHQjcmVsZWFzZSgpIHJlbGVhc2V9IG9mIHRoZSBzY29wZQorICAgICAqIGNvbnRleHQgb25jZSB0aGUgdGFzayB0aGF0IHJ1bnMgaW4gdGhlIHNjb3BlIGhhcyBmaW5pc2hlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgcmV0dXJuZWQgc2NvcGUgY29udGV4dCBtYXkgYmUgdXNlZCB0byBydW4gYWRkaXRpb25hbCB0YXNrKHMpIGluIHRoZQorICAgICAqIHNhbWUgcmVxdWVzdCBzY29wZSB1c2luZyBvbmUgb2YgdGhlIHtAY29kZSAjcnVuSW5TY29wZShSZXF1ZXN0Q29udGV4dCwgLi4uKX0gbWV0aG9kcy4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogTm90ZSB0aGF0IHRoZSByZXR1cm5lZCBjb250ZXh0IG11c3QgYmUge0BsaW5rIFJlcXVlc3RDb250ZXh0I3JlbGVhc2UoKQorICAgICAqIHJlbGVhc2VkfSBtYW51YWxseSBvbmNlIG5vdCBuZWVkZWQgYW55bW9yZSB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcy4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIGN1cnJlbnRseSBhY3RpdmUge0BsaW5rIFJlcXVlc3RDb250ZXh0IHJlcXVlc3Qgc2NvcGUgY29udGV4dH0uCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaW4gY2FzZSB0aGVyZSBpcyBubyBhY3RpdmUgcmVxdWVzdCBzY29wZSBhc3NvY2lhdGVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCB0aGUgY3VycmVudCB0aHJlYWQgb3IgaWYgdGhlIHJlcXVlc3Qgc2NvcGUgaGFzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVlbiBhbHJlYWR5IHNodXQgZG93bi4KKyAgICAgKiBAc2VlICNzdXNwZW5kQ3VycmVudCgpCisgICAgICovCisgICAgcHVibGljIFJlcXVlc3RDb250ZXh0IHJlZmVyZW5jZUN1cnJlbnQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGN1cnJlbnQoKS5nZXRSZWZlcmVuY2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHtAbGluayBSZXF1ZXN0Q29udGV4dH0gd2hpY2ggaGFzIHRvIGJlIGFjdGl2ZSBvbiB0aGUgZ2l2ZW4gdGhyZWFkLgorICAgICAqCisgICAgICogQHJldHVybiBjdXJyZW50IGFjdGl2ZSByZXF1ZXN0IGNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIFJlcXVlc3RDb250ZXh0IGN1cnJlbnQoKSB7CisgICAgICAgIGNoZWNrU3RhdGUoaXNBY3RpdmUsICJSZXF1ZXN0IHNjb3BlIGhhcyBiZWVuIGFscmVhZHkgc2h1dCBkb3duLiIpOworCisgICAgICAgIGZpbmFsIFJlcXVlc3RDb250ZXh0IHNjb3BlSW5zdGFuY2UgPSBjdXJyZW50UmVxdWVzdENvbnRleHQuZ2V0KCk7CisgICAgICAgIGNoZWNrU3RhdGUoc2NvcGVJbnN0YW5jZSAhPSBudWxsLCAiTm90IGluc2lkZSBhIHJlcXVlc3Qgc2NvcGUuIik7CisKKyAgICAgICAgcmV0dXJuIHNjb3BlSW5zdGFuY2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZXF1ZXN0Q29udGV4dCByZXRyaWV2ZUN1cnJlbnQoKSB7CisgICAgICAgIGNoZWNrU3RhdGUoaXNBY3RpdmUsICJSZXF1ZXN0IHNjb3BlIGhhcyBiZWVuIGFscmVhZHkgc2h1dCBkb3duLiIpOworICAgICAgICByZXR1cm4gY3VycmVudFJlcXVlc3RDb250ZXh0LmdldCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY3VycmVudCB7QGxpbmsgUmVxdWVzdENvbnRleHQgcmVxdWVzdCBzY29wZSBjb250ZXh0fQorICAgICAqIGFuZCBtYXJrIGl0IGFzIHN1c3BlbmRlZC4gVGhpcyBjYWxsIHByZXZlbnRzIGF1dG9tYXRpYworICAgICAqIHtAbGluayBSZXF1ZXN0Q29udGV4dCNyZWxlYXNlKCkgcmVsZWFzZX0gb2YgdGhlIHNjb3BlIGNvbnRleHQKKyAgICAgKiBvbmNlIHRoZSB0YXNrIHRoYXQgcnVucyBpbiB0aGUgc2NvcGUgaGFzIGZpbmlzaGVkLgorICAgICAqIDxwPgorICAgICAqIFRoZSByZXR1cm5lZCBzY29wZSBjb250ZXh0IG1heSBiZSB1c2VkIHRvIHJ1biBhZGRpdGlvbmFsIHRhc2socykgaW4gdGhlCisgICAgICogc2FtZSByZXF1ZXN0IHNjb3BlIHVzaW5nIG9uZSBvZiB0aGUge0Bjb2RlICNydW5JblNjb3BlKFJlcXVlc3RDb250ZXh0LCAuLi4pfQorICAgICAqIG1ldGhvZHMuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIE5vdGUgdGhhdCB0aGUgcmV0dXJuZWQgY29udGV4dCBtdXN0IGJlIHtAbGluayBSZXF1ZXN0Q29udGV4dCNyZWxlYXNlKCkKKyAgICAgKiByZWxlYXNlZH0gbWFudWFsbHkgb25jZSBub3QgbmVlZGVkIGFueW1vcmUgdG8gcHJldmVudCBtZW1vcnkgbGVha3MuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHJldHVybiBjdXJyZW50bHkgYWN0aXZlIHtAbGluayBSZXF1ZXN0Q29udGV4dCByZXF1ZXN0IHNjb3BlIGNvbnRleHR9CisgICAgICogdGhhdCB3YXMgc3VzcGVuZGVkIG9yIHtAY29kZSBudWxsfSBpZiB0aGUgdGhyZWFkIGlzIG5vdCBjdXJyZW50bHkgcnVubmluZworICAgICAqIGluIGFuIGFjdGl2ZSByZXF1ZXN0IHNjb3BlLgorICAgICAqIEBzZWUgI3JlZmVyZW5jZUN1cnJlbnQoKQorICAgICAqLworICAgIHB1YmxpYyBSZXF1ZXN0Q29udGV4dCBzdXNwZW5kQ3VycmVudCgpIHsKKyAgICAgICAgZmluYWwgUmVxdWVzdENvbnRleHQgY29udGV4dCA9IHJldHJpZXZlQ3VycmVudCgpOworICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgUmVxdWVzdENvbnRleHQgcmVmZXJlbmNlZENvbnRleHQgPSBjb250ZXh0LmdldFJlZmVyZW5jZSgpOworICAgICAgICAgICAgc3VzcGVuZChyZWZlcmVuY2VkQ29udGV4dCk7CisgICAgICAgICAgICByZXR1cm4gcmVmZXJlbmNlZENvbnRleHQ7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBsb2dnZXIuZGVidWdMb2coIlJldHVybmVkIGEgbmV3IHJlZmVyZW5jZSBvZiB0aGUgcmVxdWVzdCBzY29wZSBjb250ZXh0IHswfSIsIGNvbnRleHQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRXhlY3V0ZXMgdGhlIGFjdGlvbiB3aGVuIHRoZSByZXF1ZXN0IHNjb3BlIGNvbWVzIGludG8gc3VzcGVuZGVkIHN0YXRlLiBGb3IgZXhhbXBsZSwgaW1wbGVtZW50YXRpb24gY2FuIGNhbGwgZGVhY3RpdmF0aW9uCisgICAgICogb2YgdGhlIHVuZGVybHlpbmcgcmVxdWVzdCBzY29wZSBzdG9yYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgY3VycmVudCByZXF1ZXN0IGNvbnRleHQgdG8gYmUgc3VzcGVuZGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHN1c3BlbmQoUmVxdWVzdENvbnRleHQgY29udGV4dCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHtAbGluayBSZXF1ZXN0Q29udGV4dCByZXF1ZXN0IHNjb3BlIGNvbnRleHR9LgorICAgICAqIFRoaXMgaW5zdGFuY2UgY2FuIGJlIHRoZW4gdXNlZCB0byBydW4gdGFzayBpbiB0aGUgcmVxdWVzdCBzY29wZS4gUmV0dXJuZWQgY29udGV4dAorICAgICAqIGlzIHN1c3BlbmRlZCBieSBkZWZhdWx0IGFuZCBtdXN0IHRoZXJlZm9yZSBiZSBjbG9zZWQgZXhwbGljaXRseSBhcyBpdCBpcyBzaG93biBpbgorICAgICAqIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKKyAgICAgKiA8cHJlPgorICAgICAqIFJlcXVlc3RDb250ZXh0IGNvbnRleHQgPSByZXF1ZXN0U2NvcGUuY3JlYXRlQ29udGV4dCgpOworICAgICAqIHJlcXVlc3RTY29wZS5ydW5JblNjb3BlKGNvbnRleHQsIHNvbWVSdW5uYWJsZVRhc2spOworICAgICAqIGNvbnRleHQucmVsZWFzZSgpOworICAgICAqIDwvcHJlPgorICAgICAqCisgICAgICogQHJldHVybiBOZXcgc3VzcGVuZGVkIHJlcXVlc3Qgc2NvcGUgY29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgUmVxdWVzdENvbnRleHQgY3JlYXRlQ29udGV4dCgpOworCisgICAgLyoqCisgICAgICogU3RvcmVzIHRoZSBwcm92aWRlZCB7QGxpbmsgUmVxdWVzdENvbnRleHR9IHRvIHRocmVhZC1sb2NhbCB2YXJpYWJsZSBiZWxvbmdpbmcgdG8gY3VycmVudCByZXF1ZXN0IHNjb3BlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgc3RvcmFnZSB3aXRoIHJlcXVlc3Qgc2NvcGVkIG9iamVjdHMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgYWN0aXZhdGUoUmVxdWVzdENvbnRleHQgY29udGV4dCwgUmVxdWVzdENvbnRleHQgb2xkQ29udGV4dCkgeworICAgICAgICBjaGVja1N0YXRlKGlzQWN0aXZlLCAiUmVxdWVzdCBzY29wZSBoYXMgYmVlbiBhbHJlYWR5IHNodXQgZG93bi4iKTsKKyAgICAgICAgY3VycmVudFJlcXVlc3RDb250ZXh0LnNldChjb250ZXh0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXN1bWVzIHRoZSBwcm92aWRlZCB7QGxpbmsgUmVxdWVzdENvbnRleHR9IHRvIHRocmVhZC1sb2NhbCB2YXJpYWJsZSBiZWxvbmdpbmcgdG8gY3VycmVudCByZXF1ZXN0IHNjb3BlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgc3RvcmFnZSB3aXRoIHJlcXVlc3Qgc2NvcGVkIG9iamVjdHMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgcmVzdW1lKFJlcXVlc3RDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgY3VycmVudFJlcXVlc3RDb250ZXh0LnNldChjb250ZXh0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlcyB0aGUgcHJvdmlkZWQge0BsaW5rIFJlcXVlc3RDb250ZXh0fSB0byB0aHJlYWQtbG9jYWwgdmFyaWFibGUgYmVsb25naW5nIHRvIGN1cnJlbnQgcmVxdWVzdCBzY29wZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IHN0b3JhZ2Ugd2l0aCByZXF1ZXN0IHNjb3BlZCBvYmplY3RzLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHJlbGVhc2UoUmVxdWVzdENvbnRleHQgY29udGV4dCkgeworICAgICAgICBjb250ZXh0LnJlbGVhc2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSdW5zIHRoZSB7QGxpbmsgUnVubmFibGUgdGFza30gaW4gdGhlIHJlcXVlc3Qgc2NvcGUgaW5pdGlhbGl6ZWQgZnJvbSB0aGUKKyAgICAgKiB7QGxpbmsgUmVxdWVzdENvbnRleHQgc2NvcGUgY29udGV4dH0uIFRoZSB7QGxpbmsgUmVxdWVzdENvbnRleHQKKyAgICAgKiBzY29wZSBjb250ZXh0fSBpcyBOT1QgcmVsZWFzZWQgYnkgdGhlIG1ldGhvZCAodGhpcyBtdXN0IGJlIGRvbmUgZXhwbGljaXRseSkuIFRoZQorICAgICAqIGN1cnJlbnQgdGhyZWFkIG1pZ2h0IGJlIGFscmVhZHkgaW4gYW55IHJlcXVlc3Qgc2NvcGUgYW5kIGluIHRoYXQgY2FzZSB0aGUgc2NvcGUKKyAgICAgKiB3aWxsIGJlIGNoYW5nZWQgdG8gdGhlIHNjb3BlIGRlZmluZWQgYnkgdGhlIHtAbGluayBSZXF1ZXN0Q29udGV4dCBzY29wZQorICAgICAqIGluc3RhbmNlfS4gQXQgdGhlIGVuZCBvZiB0aGUgbWV0aG9kIHRoZSByZXF1ZXN0IHNjb3BlIGlzIHJldHVybmVkIHRvIGl0cyBvcmlnaW5hbAorICAgICAqIHN0YXRlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIHJlcXVlc3Qgc2NvcGUgY29udGV4dCBmcm9tIHdoaWNoIHRoZSByZXF1ZXN0IHNjb3BlIHdpbGwgYmUgaW5pdGlhbGl6ZWQuCisgICAgICogQHBhcmFtIHRhc2sgICAgVGFzayB0byBiZSBleGVjdXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBydW5JblNjb3BlKFJlcXVlc3RDb250ZXh0IGNvbnRleHQsIFJ1bm5hYmxlIHRhc2spIHsKKyAgICAgICAgZmluYWwgUmVxdWVzdENvbnRleHQgb2xkQ29udGV4dCA9IHJldHJpZXZlQ3VycmVudCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYWN0aXZhdGUoY29udGV4dC5nZXRSZWZlcmVuY2UoKSwgb2xkQ29udGV4dCk7CisgICAgICAgICAgICBFcnJvcnMucHJvY2Vzcyh0YXNrKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHJlbGVhc2UoY29udGV4dCk7CisgICAgICAgICAgICByZXN1bWUob2xkQ29udGV4dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSdW5zIHRoZSB7QGxpbmsgUnVubmFibGUgdGFza30gaW4gdGhlIG5ldyByZXF1ZXN0IHNjb3BlLiBUaGUgY3VycmVudCB0aHJlYWQgbWlnaHQKKyAgICAgKiBiZSBhbHJlYWR5IGluIGFueSByZXF1ZXN0IHNjb3BlIGFuZCBpbiB0aGF0IGNhc2UgdGhlIHNjb3BlIHdpbGwgYmUgY2hhbmdlZCB0byB0aGUKKyAgICAgKiBzY29wZSBkZWZpbmVkIGJ5IHRoZSB7QGxpbmsgUmVxdWVzdENvbnRleHQgc2NvcGUgY29udGV4dH0uIEF0IHRoZSBlbmQgb2YKKyAgICAgKiB0aGUgbWV0aG9kIHRoZSByZXF1ZXN0IHNjb3BlIGlzIHJldHVybmVkIHRvIGl0cyBvcmlnaW5hbCBzdGF0ZS4gVGhlIG5ld2x5IGNyZWF0ZWQKKyAgICAgKiB7QGxpbmsgUmVxdWVzdENvbnRleHQgc2NvcGUgY29udGV4dH0gd2lsbCBiZSBpbXBsaWNpdGx5IHJlbGVhc2VkIGF0IHRoZSBlbmQKKyAgICAgKiBvZiB0aGUgbWV0aG9kIGNhbGwgZXhjZXB0IHRoZSB0YXNrIHdpbGwgY2FsbAorICAgICAqIHtAbGluayBSZXF1ZXN0U2NvcGUjc3VzcGVuZEN1cnJlbnR9LgorICAgICAqCisgICAgICogQHBhcmFtIHRhc2sgVGFzayB0byBiZSBleGVjdXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBydW5JblNjb3BlKFJ1bm5hYmxlIHRhc2spIHsKKyAgICAgICAgZmluYWwgUmVxdWVzdENvbnRleHQgb2xkQ29udGV4dCA9IHJldHJpZXZlQ3VycmVudCgpOworICAgICAgICBmaW5hbCBSZXF1ZXN0Q29udGV4dCBjb250ZXh0ID0gY3JlYXRlQ29udGV4dCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYWN0aXZhdGUoY29udGV4dCwgb2xkQ29udGV4dCk7CisgICAgICAgICAgICBFcnJvcnMucHJvY2Vzcyh0YXNrKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHJlbGVhc2UoY29udGV4dCk7CisgICAgICAgICAgICByZXN1bWUob2xkQ29udGV4dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSdW5zIHRoZSB7QGxpbmsgQ2FsbGFibGUgdGFza30gaW4gdGhlIHJlcXVlc3Qgc2NvcGUgaW5pdGlhbGl6ZWQgZnJvbSB0aGUKKyAgICAgKiB7QGxpbmsgUmVxdWVzdENvbnRleHQgc2NvcGUgY29udGV4dH0uIFRoZSB7QGxpbmsgUmVxdWVzdENvbnRleHQKKyAgICAgKiBzY29wZSBjb250ZXh0fSBpcyBOT1QgcmVsZWFzZWQgYnkgdGhlIG1ldGhvZCAodGhpcyBtdXN0IGJlIGRvbmUgZXhwbGljaXRseSkuIFRoZQorICAgICAqIGN1cnJlbnQgdGhyZWFkIG1pZ2h0IGJlIGFscmVhZHkgaW4gYW55IHJlcXVlc3Qgc2NvcGUgYW5kIGluIHRoYXQgY2FzZSB0aGUgc2NvcGUKKyAgICAgKiB3aWxsIGJlIGNoYW5nZWQgdG8gdGhlIHNjb3BlIGRlZmluZWQgYnkgdGhlIHtAbGluayBSZXF1ZXN0Q29udGV4dCBzY29wZQorICAgICAqIGluc3RhbmNlfS4gQXQgdGhlIGVuZCBvZiB0aGUgbWV0aG9kIHRoZSByZXF1ZXN0IHNjb3BlIGlzIHJldHVybmVkIHRvIGl0cyBvcmlnaW5hbAorICAgICAqIHN0YXRlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgVGhlIHJlcXVlc3Qgc2NvcGUgY29udGV4dCBmcm9tIHdoaWNoIHRoZSByZXF1ZXN0IHNjb3BlIHdpbGwgYmUgaW5pdGlhbGl6ZWQuCisgICAgICogQHBhcmFtIHRhc2sgICAgVGFzayB0byBiZSBleGVjdXRlZC4KKyAgICAgKiBAcGFyYW0gPFQ+ICAgICB7QGNvZGUgdGFza30gcmVzdWx0IHR5cGUuCisgICAgICogQHJldHVybiByZXN1bHQgcmV0dXJuZWQgYnkgdGhlIHtAY29kZSB0YXNrfS4KKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBFeGNlcHRpb24gdGhyb3duIGJ5IHRoZSB7QGNvZGUgdGFza30uCisgICAgICovCisgICAgcHVibGljIDxUPiBUIHJ1bkluU2NvcGUoUmVxdWVzdENvbnRleHQgY29udGV4dCwgQ2FsbGFibGU8VD4gdGFzaykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlcXVlc3RDb250ZXh0IG9sZENvbnRleHQgPSByZXRyaWV2ZUN1cnJlbnQoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFjdGl2YXRlKGNvbnRleHQuZ2V0UmVmZXJlbmNlKCksIG9sZENvbnRleHQpOworICAgICAgICAgICAgcmV0dXJuIEVycm9ycy5wcm9jZXNzKHRhc2spOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcmVsZWFzZShjb250ZXh0KTsKKyAgICAgICAgICAgIHJlc3VtZShvbGRDb250ZXh0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJ1bnMgdGhlIHtAbGluayBDYWxsYWJsZSB0YXNrfSBpbiB0aGUgbmV3IHJlcXVlc3Qgc2NvcGUuIFRoZSBjdXJyZW50IHRocmVhZCBtaWdodAorICAgICAqIGJlIGFscmVhZHkgaW4gYW55IHJlcXVlc3Qgc2NvcGUgYW5kIGluIHRoYXQgY2FzZSB0aGUgc2NvcGUgd2lsbCBiZSBjaGFuZ2VkIHRvIHRoZQorICAgICAqIHNjb3BlIGRlZmluZWQgYnkgdGhlIHtAbGluayBSZXF1ZXN0Q29udGV4dCBzY29wZSBjb250ZXh0fS4gQXQgdGhlIGVuZCBvZgorICAgICAqIHRoZSBtZXRob2QgdGhlIHJlcXVlc3Qgc2NvcGUgaXMgcmV0dXJuZWQgdG8gaXRzIG9yaWdpbmFsIHN0YXRlLiBUaGUgbmV3bHkgY3JlYXRlZAorICAgICAqIHtAbGluayBSZXF1ZXN0Q29udGV4dCBzY29wZSBjb250ZXh0fSB3aWxsIGJlIGltcGxpY2l0bHkgcmVsZWFzZWQgYXQgdGhlIGVuZAorICAgICAqIG9mIHRoZSBtZXRob2QgY2FsbCBleGNlcHQgdGhlIHRhc2sgd2lsbCBjYWxsCisgICAgICoge0BsaW5rIFJlcXVlc3RTY29wZSNzdXNwZW5kQ3VycmVudH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFzayBUYXNrIHRvIGJlIGV4ZWN1dGVkLgorICAgICAqIEBwYXJhbSA8VD4gIHtAY29kZSB0YXNrfSByZXN1bHQgdHlwZS4KKyAgICAgKiBAcmV0dXJuIHJlc3VsdCByZXR1cm5lZCBieSB0aGUge0Bjb2RlIHRhc2t9LgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIEV4Y2VwdGlvbiB0aHJvd24gYnkgdGhlIHtAY29kZSB0YXNrfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgPFQ+IFQgcnVuSW5TY29wZShDYWxsYWJsZTxUPiB0YXNrKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVxdWVzdENvbnRleHQgb2xkQ29udGV4dCA9IHJldHJpZXZlQ3VycmVudCgpOworICAgICAgICBmaW5hbCBSZXF1ZXN0Q29udGV4dCBjb250ZXh0ID0gY3JlYXRlQ29udGV4dCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYWN0aXZhdGUoY29udGV4dCwgb2xkQ29udGV4dCk7CisgICAgICAgICAgICByZXR1cm4gRXJyb3JzLnByb2Nlc3ModGFzayk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICByZWxlYXNlKGNvbnRleHQpOworICAgICAgICAgICAgcmVzdW1lKG9sZENvbnRleHQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUnVucyB0aGUge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUHJvZHVjZXIgdGFza30gaW4gdGhlIHJlcXVlc3Qgc2NvcGUgaW5pdGlhbGl6ZWQKKyAgICAgKiBmcm9tIHRoZSB7QGxpbmsgUmVxdWVzdENvbnRleHQgc2NvcGUgY29udGV4dH0uCisgICAgICogVGhlIHtAbGluayBSZXF1ZXN0Q29udGV4dCBzY29wZSBjb250ZXh0fSBpcyBOT1QgcmVsZWFzZWQgYnkgdGhlIG1ldGhvZCAodGhpcworICAgICAqIG11c3QgYmUgZG9uZSBleHBsaWNpdGx5KS4gVGhlIGN1cnJlbnQgdGhyZWFkIG1pZ2h0IGJlIGFscmVhZHkgaW4gYW55IHJlcXVlc3Qgc2NvcGUKKyAgICAgKiBhbmQgaW4gdGhhdCBjYXNlIHRoZSBzY29wZSB3aWxsIGJlIGNoYW5nZWQgdG8gdGhlIHNjb3BlIGRlZmluZWQgYnkgdGhlCisgICAgICoge0BsaW5rIFJlcXVlc3RDb250ZXh0IHNjb3BlIGNvbnRleHR9LiBBdCB0aGUgZW5kIG9mIHRoZSBtZXRob2QgdGhlIHJlcXVlc3QKKyAgICAgKiBzY29wZSBpcyByZXR1cm5lZCB0byBpdHMgb3JpZ2luYWwgc3RhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgcmVxdWVzdCBzY29wZSBjb250ZXh0IGZyb20gd2hpY2ggdGhlIHJlcXVlc3Qgc2NvcGUgd2lsbCBiZSBpbml0aWFsaXplZC4KKyAgICAgKiBAcGFyYW0gdGFzayAgICBUYXNrIHRvIGJlIGV4ZWN1dGVkLgorICAgICAqIEBwYXJhbSA8VD4gICAgIHtAY29kZSB0YXNrfSByZXN1bHQgdHlwZS4KKyAgICAgKiBAcmV0dXJuIHJlc3VsdCByZXR1cm5lZCBieSB0aGUge0Bjb2RlIHRhc2t9CisgICAgICovCisgICAgcHVibGljIDxUPiBUIHJ1bkluU2NvcGUoUmVxdWVzdENvbnRleHQgY29udGV4dCwgUHJvZHVjZXI8VD4gdGFzaykgeworICAgICAgICBmaW5hbCBSZXF1ZXN0Q29udGV4dCBvbGRDb250ZXh0ID0gcmV0cmlldmVDdXJyZW50KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhY3RpdmF0ZShjb250ZXh0LmdldFJlZmVyZW5jZSgpLCBvbGRDb250ZXh0KTsKKyAgICAgICAgICAgIHJldHVybiBFcnJvcnMucHJvY2Vzcyh0YXNrKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHJlbGVhc2UoY29udGV4dCk7CisgICAgICAgICAgICByZXN1bWUob2xkQ29udGV4dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSdW5zIHRoZSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5Qcm9kdWNlciB0YXNrfSBpbiB0aGUgbmV3IHJlcXVlc3Qgc2NvcGUuIFRoZQorICAgICAqIGN1cnJlbnQgdGhyZWFkIG1pZ2h0IGJlIGFscmVhZHkgaW4gYW55IHJlcXVlc3Qgc2NvcGUgYW5kIGluIHRoYXQgY2FzZSB0aGUgc2NvcGUKKyAgICAgKiB3aWxsIGJlIGNoYW5nZWQgdG8gdGhlIHNjb3BlIGRlZmluZWQgYnkgdGhlIHtAbGluayBSZXF1ZXN0Q29udGV4dCBzY29wZQorICAgICAqIGluc3RhbmNlfS4gQXQgdGhlIGVuZCBvZiB0aGUgbWV0aG9kIHRoZSByZXF1ZXN0IHNjb3BlIGlzIHJldHVybmVkIHRvIGl0cyBvcmlnaW5hbAorICAgICAqIHN0YXRlLiBUaGUgbmV3bHkgY3JlYXRlZCB7QGxpbmsgUmVxdWVzdENvbnRleHQgc2NvcGUgY29udGV4dH0gd2lsbCBiZQorICAgICAqIGltcGxpY2l0bHkgcmVsZWFzZWQgYXQgdGhlIGVuZCBvZiB0aGUgbWV0aG9kIGNhbGwgZXhjZXB0IHRoZSB0YXNrIHdpbGwgY2FsbAorICAgICAqIHtAbGluayBSZXF1ZXN0U2NvcGUjc3VzcGVuZEN1cnJlbnR9LgorICAgICAqCisgICAgICogQHBhcmFtIHRhc2sgVGFzayB0byBiZSBleGVjdXRlZC4KKyAgICAgKiBAcGFyYW0gPFQ+ICB7QGNvZGUgdGFza30gcmVzdWx0IHR5cGUuCisgICAgICogQHJldHVybiByZXN1bHQgcmV0dXJuZWQgYnkgdGhlIHtAY29kZSB0YXNrfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgPFQ+IFQgcnVuSW5TY29wZShQcm9kdWNlcjxUPiB0YXNrKSB7CisgICAgICAgIGZpbmFsIFJlcXVlc3RDb250ZXh0IG9sZENvbnRleHQgPSByZXRyaWV2ZUN1cnJlbnQoKTsKKyAgICAgICAgZmluYWwgUmVxdWVzdENvbnRleHQgY29udGV4dCA9IGNyZWF0ZUNvbnRleHQoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGFjdGl2YXRlKGNvbnRleHQsIG9sZENvbnRleHQpOworICAgICAgICAgICAgcmV0dXJuIEVycm9ycy5wcm9jZXNzKHRhc2spOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcmVsZWFzZShjb250ZXh0KTsKKyAgICAgICAgICAgIHJlc3VtZShvbGRDb250ZXh0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbmZpZ3VyYXRvciB3aGljaCBpbml0aWFsaXplcyBhbmQgcmVnaXN0ZXIge0BsaW5rIFJlcXVlc3RTY29wZX0gaW5zdGFuY2UgaW50IHtAbGluayBJbmplY3Rpb25NYW5hZ2VyfSBhbmQKKyAgICAgKiB7QGxpbmsgQm9vdHN0cmFwQmFnfS4KKyAgICAgKgorICAgICAqIEBhdXRob3IgUGV0ciBCb3VkYQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVxdWVzdFNjb3BlQ29uZmlndXJhdG9yIGltcGxlbWVudHMgQm9vdHN0cmFwQ29uZmlndXJhdG9yIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaW5pdChJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXJGYWN0b3J5LCBCb290c3RyYXBCYWcgYm9vdHN0cmFwQmFnKSB7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcG9zdEluaXQoSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyLCBCb290c3RyYXBCYWcgYm9vdHN0cmFwQmFnKSB7CisgICAgICAgICAgICBSZXF1ZXN0U2NvcGUgcmVxdWVzdFNjb3BlID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShSZXF1ZXN0U2NvcGUuY2xhc3MpOworICAgICAgICAgICAgYm9vdHN0cmFwQmFnLnNldFJlcXVlc3RTY29wZShyZXF1ZXN0U2NvcGUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9wcm9jZXNzL2ludGVybmFsL1JlcXVlc3RTY29wZWQuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvcHJvY2Vzcy9pbnRlcm5hbC9SZXF1ZXN0U2NvcGVkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJiZmZhMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvcHJvY2Vzcy9pbnRlcm5hbC9SZXF1ZXN0U2NvcGVkLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLmludGVybmFsOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKKworaW1wb3J0IGphdmF4LmluamVjdC5TY29wZTsKKworLyoqCisgKiBSZXF1ZXN0IHNjb3BlIGJpbmRpbmcgYW5ub3RhdGlvbi4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitAVGFyZ2V0KHtUWVBFLCBNRVRIT0R9KQorQFJldGVudGlvbihSVU5USU1FKQorQFNjb3BlCitwdWJsaWMgQGludGVyZmFjZSBSZXF1ZXN0U2NvcGVkIHsKK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvcHJvY2Vzcy9pbnRlcm5hbC9TdGFnZS5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9wcm9jZXNzL2ludGVybmFsL1N0YWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE3OGMyYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvcHJvY2Vzcy9pbnRlcm5hbC9TdGFnZS5qYXZhCkBAIC0wLDAgKzEsMTgxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CisKKy8qKgorICogRGF0YSBwcm9jZXNzaW5nIHN0YWdlIHRoYXQgY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGR5bmFtaWMgZGF0YSBwcm9jZXNzaW5nIGNoYWlucy4KKyAqIDxwPgorICogQW4gc3RhZ2UgaXMgYSBzdGF0ZWxlc3MgZGF0YSBwcm9jZXNzaW5nIHVuaXQgdGhhdCByZXR1cm5zIGEKKyAqIHtAbGluayBDb250aW51YXRpb24gcHJvY2Vzc2luZyBjb250aW51YXRpb259LgorICogPC9wPgorICoKKyAqIEBwYXJhbSA8REFUQT4gcHJvY2Vzc2VkIGRhdGEgdHlwZS4KKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU3RhZ2U8REFUQT4geworCisgICAgLyoqCisgICAgICogRGF0YSBwcm9jZXNzaW5nIHN0YWdlIGNvbnRpbnVhdGlvbi4KKyAgICAgKiA8cD4KKyAgICAgKiBBIGNvbnRpbnVhdGlvbiBvZiBhIHByb2Nlc3Npbmcgc3RhZ2UgaXMgYSBwcm9jZXNzaW5nIHJlc3VsdCByZXByZXNlbnRlZCBieSBhbgorICAgICAqICh7QGxpbmsgI2hhc05leHQoKSBvcHRpb25hbH0pIHN0YWdlIHRoYXQgc2hvdWxkIGJlIGludm9rZWQge0BsaW5rICNuZXh0KCkgbmV4dH0KKyAgICAgKiBhbmQgdGhlIHByb2Nlc3NlZCBkYXRhIHtAbGluayAjcmVzdWx0KCkgcmVzdWx0fS4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gPERBVEE+IHByb2Nlc3NlZCBkYXRhIHR5cGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBDb250aW51YXRpb248REFUQT4geworICAgICAgICBwcml2YXRlIGZpbmFsIERBVEEgcmVzdWx0OworICAgICAgICBwcml2YXRlIGZpbmFsIFN0YWdlPERBVEE+IG5leHQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhIG5ldyBjb250aW51YXRpb24gaW5zdGFuY2UuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSByZXN1bHQgcHJvY2Vzc2VkIGRhdGEuCisgICAgICAgICAqIEBwYXJhbSBuZXh0ICAgbmV4dCBwcm9jZXNzaW5nIHN0YWdlLgorICAgICAgICAgKi8KKyAgICAgICAgQ29udGludWF0aW9uKGZpbmFsIERBVEEgcmVzdWx0LCBmaW5hbCBTdGFnZTxEQVRBPiBuZXh0KSB7CisgICAgICAgICAgICB0aGlzLnJlc3VsdCA9IHJlc3VsdDsKKyAgICAgICAgICAgIHRoaXMubmV4dCA9IG5leHQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGEgY29udGludWF0aW9uIGZyb20gdGhlIHByb2Nlc3NlZCBkYXRhIHJlc3VsdCBhbmQgdGhlIHN0YWdlCisgICAgICAgICAqIHRvIGJlIGludm9rZWQgbmV4dC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIDxEQVRBPiBwcm9jZXNzZWQgZGF0YSB0eXBlLgorICAgICAgICAgKiBAcGFyYW0gcmVzdWx0IGRhdGEgcHJvY2Vzc2luZyByZXN1bHQuCisgICAgICAgICAqIEBwYXJhbSBuZXh0ICAgc3RhZ2UgdG8gYmUgaW52b2tlZCBuZXh0LgorICAgICAgICAgKiBAcmV0dXJuIGEgY29udGludWF0aW9uIHdpdGggdGhlIHN1cHBsaWVkIHN0YWdlIHRvIGJlIGludm9rZWQKKyAgICAgICAgICogICAgICAgICB7QGxpbmsgU3RhZ2UuQ29udGludWF0aW9uI25leHQoKSBuZXh0fSBpbiB0aGUgcHJvY2Vzc2luZyBjaGFpbgorICAgICAgICAgKiAgICAgICAgIGFuZCB0aGUgc3VwcGxpZWQgcHJvY2Vzc2luZyByZXN1bHQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIDxEQVRBPiBDb250aW51YXRpb248REFUQT4gb2YoZmluYWwgREFUQSByZXN1bHQsIFN0YWdlPERBVEE+IG5leHQpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ29udGludWF0aW9uPERBVEE+KHJlc3VsdCwgbmV4dCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGEgdGVybWluYWwgY29udGludWF0aW9uIGZyb20gdGhlIHByb2Nlc3NlZCBkYXRhIHJlc3VsdC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIDxEQVRBPiBwcm9jZXNzZWQgZGF0YSB0eXBlLgorICAgICAgICAgKiBAcGFyYW0gcmVzdWx0IGRhdGEgcHJvY2Vzc2luZyByZXN1bHQuCisgICAgICAgICAqIEByZXR1cm4gdGVybWluYWwgY29udGludWF0aW9uIHdpdGggbm8ge0BsaW5rIFN0YWdlLkNvbnRpbnVhdGlvbiNuZXh0KCkgbmV4dH0KKyAgICAgICAgICogICAgICAgICBzdGFnZSBpbiB0aGUgcHJvY2Vzc2luZyBjaGFpbiBhbmQgdGhlIHN1cHBsaWVkIHByb2Nlc3NpbmcgcmVzdWx0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyA8REFUQT4gQ29udGludWF0aW9uPERBVEE+IG9mKGZpbmFsIERBVEEgcmVzdWx0KSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENvbnRpbnVhdGlvbjxEQVRBPihyZXN1bHQsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgZGF0YSBwcm9jZXNzaW5nIHJlc3VsdC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBkYXRhIHByb2Nlc3NpbmcgcmVzdWx0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIERBVEEgcmVzdWx0KCkgeworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIHN0YWdlIHRvIGJlIGludm9rZWQgbmV4dCBvciB7QGNvZGUgbnVsbH0gaWYgbm8gbmV4dCBzdGFnZSBpcworICAgICAgICAgKiB7QGxpbmsgI2hhc05leHQoKSBwcmVzZW50fS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB0aGUgc3RhZ2UgdG8gYmUgaW52b2tlZCBuZXh0IG9yIHtAY29kZSBudWxsfSBpZiBub3QgcHJlc2VudC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdGFnZTxEQVRBPiBuZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5leHQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2hlY2sgaWYgdGhlcmUgaXMgYSBuZXh0IHN0YWdlIHByZXNlbnQgaW4gdGhlIGNvbnRpbnVhdGlvbi4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoZSBhYnNlbmNlIG9mIGEgbmV4dCBzdGFnZSBpbiB0aGUgY29udGludWF0aW9uIGluZGljYXRlcyB0aGF0IHRoZSBkYXRhIHByb2Nlc3NpbmcKKyAgICAgICAgICogcmVhY2hlZCBhIHRlcm1pbmFsIHN0YWdlIGFuZCB0aGUge0BsaW5rICNyZXN1bHQoKSByZXN1bHR9IG9mIHRoZSBjb250aW51YXRpb24gcmVwcmVzZW50cworICAgICAgICAgKiB0aGUgZmluYWwgcmVzdWx0IG9mIHRoZSB3aG9sZSBwcm9jZXNzaW5nIGNoYWluLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZXJlIGlzIGEgbmV4dCBzdGFnZSBwcmVzZW50IGluIHRoZSBjb250aW51YXRpb24sCisgICAgICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5leHQgIT0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIExpbmVhciBzdGFnZSBjaGFpbiBidWlsZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIDxEQVRBPiBwcm9jZXNzZWQgZGF0YSB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEJ1aWxkZXI8REFUQT4geworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgYSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbiBhcyBhIG5leHQgc3RhZ2UgdG8gdGhlIHN0YWdlIGNoYWluLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhlIG9yZGVyIG9mIHRoZSB7QGNvZGUgdG8oLi4uKX0gbWV0aG9kIGludm9jYXRpb25zIG1hdGNoZXMgdGhlIG9yZGVyCisgICAgICAgICAqIG9mIHRoZSBzdGFnZSBleGVjdXRpb24gYXQgcnVudGltZS4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdHJhbnNmb3JtYXRpb24gYSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbiB0byBiZSBhZGRlZCBhcyBhIG5leHQKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgIHN0YWdlIHRvIHRoZSBzdGFnZSBjaGFpbi4KKyAgICAgICAgICogQHJldHVybiB1cGRhdGVkIGJ1aWxkZXIgaW5zdGFuY2UuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlcjxEQVRBPiB0byhGdW5jdGlvbjxEQVRBLCBEQVRBPiB0cmFuc2Zvcm1hdGlvbik7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBhIG5ldyB7QGxpbmsgQ2hhaW5hYmxlU3RhZ2UgY2hhaW5hYmxlIHN0YWdlfSBhcyBhIG5leHQgc3RhZ2UgdG8gdGhlCisgICAgICAgICAqIHN0YWdlIGNoYWluLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhlIG9yZGVyIG9mIHRoZSB7QGNvZGUgdG8oLi4uKX0gbWV0aG9kIGludm9jYXRpb25zIG1hdGNoZXMgdGhlIG9yZGVyCisgICAgICAgICAqIG9mIHRoZSBzdGFnZSBleGVjdXRpb24gYXQgcnVudGltZS4KKyAgICAgICAgICogQSBzdWJzZXF1ZW50IGNhbGwgdG8gYSB7QGNvZGUgdG8oLi4uKX0gbWV0aG9kICB3aWxsIGF1dG9tYXRpY2FsbHkgaW52b2tlIHRoZQorICAgICAgICAgKiB7QGxpbmsgQ2hhaW5hYmxlU3RhZ2Ujc2V0RGVmYXVsdE5leHQoU3RhZ2UpfSBtZXRob2Qgb24gdGhlIGNoYWluYWJsZQorICAgICAgICAgKiBzdGFnZS4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc3RhZ2UgYSBjaGFpbmFibGUgc3RhZ2UgdG8gYmUgYWRkZWQgYXMgYSBuZXh0CisgICAgICAgICAqICAgICAgICAgICAgICAgICBzdGFnZSB0byB0aGUgc3RhZ2UgY2hhaW4uCisgICAgICAgICAqIEByZXR1cm4gdXBkYXRlZCBidWlsZGVyIGluc3RhbmNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXI8REFUQT4gdG8oQ2hhaW5hYmxlU3RhZ2U8REFUQT4gc3RhZ2UpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBCdWlsZCBhIHN0YWdlIGNoYWluLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIGJ1aWx0IGFjY2VwdG9yIGNoYWluLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0YWdlPERBVEE+IGJ1aWxkKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBhIHRlcm1pbmFsIHN0YWdlIHRvIHRoZSBzdGFnZSBjaGFpbiBhbmQgYnVpbGQgdGhlIGNoYWluLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdGVybWluYWwgbGFzdCBzdGFnZSB0byBiZSBhZGRlZCB0byB0aGUgc3RhZ2UgY2hhaW4uCisgICAgICAgICAqIEByZXR1cm4gYnVpbHQgc3RhZ2UgY2hhaW4uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RhZ2U8REFUQT4gYnVpbGQoU3RhZ2U8REFUQT4gdGVybWluYWwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm1zIGEgZGF0YSBwcm9jZXNzaW5nIHRhc2sgYW5kIHJldHVybnMgdGhlIHByb2Nlc3NlZCBkYXRhIHRvZ2V0aGVyIHdpdGgKKyAgICAgKiBhIHtAbGluayBDb250aW51YXRpb24gcHJvY2Vzc2luZyBjb250aW51YXRpb259LgorICAgICAqCisgICAgICogQHBhcmFtIGRhdGEgZGF0YSB0byBiZSB0cmFuc2Zvcm1lZC4KKyAgICAgKiBAcmV0dXJuIGEgcHJvY2Vzc2luZyBjb250aW51YXRpb24uCisgICAgICovCisgICAgcHVibGljIENvbnRpbnVhdGlvbjxEQVRBPiBhcHBseShEQVRBIGRhdGEpOworfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9wcm9jZXNzL2ludGVybmFsL1N0YWdlcy5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9wcm9jZXNzL2ludGVybmFsL1N0YWdlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjODdkMDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Byb2Nlc3MvaW50ZXJuYWwvU3RhZ2VzLmphdmEKQEAgLTAsMCArMSwyODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudXRpbC5EZXF1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uUmVmOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuSW5mbGVjdG9yOworCisvKioKKyAqIEEgc3RhZ2UtcmVsYXRlZCBjb2xsZWN0aW9uIG9mIHV0aWxpdHkgbWV0aG9kcy4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgU3RhZ2VzIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDaGFpbmFibGVTdGFnZSBJREVOVElUWSA9IG5ldyBBYnN0cmFjdENoYWluYWJsZVN0YWdlKCkgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ29udGludWF0aW9uIGFwcGx5KE9iamVjdCBvKSB7CisgICAgICAgICAgICAvL25vaW5zcGVjdGlvbiB1bmNoZWNrZWQKKyAgICAgICAgICAgIHJldHVybiBDb250aW51YXRpb24ub2YobywgZ2V0RGVmYXVsdE5leHQoKSk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogUHJldmVudHMgaW5zdGFudGlhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0YWdlcygpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBjaGFpbmFibGUgImlkZW50aXR5IiBzdGFnZS4KKyAgICAgKgorICAgICAqIFRoaXMgc3RhZ2UsIHdoZW4gYXBwbGllZCByZXR1cm5zIHRoZSB1bm1vZGlmaWVkIGlucHV0IGRhdGEgb2JqZWN0CisgICAgICogYXMgcGFydCBvZiBpdCdzIGNvbnRpbnVhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSA8REFUQT4gZGF0YSB0eXBlIHRyYW5zZm9ybWFibGUgYnkgdGhlIHN0YWdlLgorICAgICAqIEByZXR1cm4gaWRlbnRpdHkgc3RhZ2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8REFUQT4gQ2hhaW5hYmxlU3RhZ2U8REFUQT4gaWRlbnRpdHkoKSB7CisgICAgICAgIC8vbm9pbnNwZWN0aW9uIHVuY2hlY2tlZAorICAgICAgICByZXR1cm4gSURFTlRJVFk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHRlcm1pbmFsIHtAbGluayBTdGFnZX0gdGhhdCBpbXBsZW1lbnRzIHtAbGluayBJbmZsZWN0aW5nfQorICAgICAqIGludGVyZmFjZSBhbmQgcmV0dXJucyB0aGUgcHJvdmlkZWQge0BsaW5rIEluZmxlY3Rvcn0gaW5zdGFuY2UKKyAgICAgKiB3aGVuIHRoZSB7QGxpbmsgSW5mbGVjdGluZyNpbmZsZWN0b3IoKX0gbWV0aG9kIGlzIGNhbGxlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSA8REFUQT4gICAgZGF0YSB0eXBlIHRyYW5zZm9ybWFibGUgYnkgdGhlIHN0YWdlIGFuZCByZXR1cm5lZCBpbmZsZWN0b3IuCisgICAgICogQHBhcmFtIDxSRVNVTFQ+ICB0eXBlIG9mIHJlc3VsdCBwcm9kdWNlZCBieSBhIHN1Y2Nlc3NmdWwgaW5mbGVjdG9yIGRhdGEgdHJhbnNmb3JtYXRpb24uCisgICAgICogQHBhcmFtIGluZmxlY3RvciBhIHJlcXVlc3QgdG8gcmVzcG9uc2UgdHJhbnNmb3JtYXRpb24gdG8gYmUgd3JhcHBlZCBpbgorICAgICAqICAgICAgICAgICAgICAgICAgYSBzdGFnZS4KKyAgICAgKiBAcmV0dXJuIGEgc3RhZ2UgdGhhdCB3cmFwcyB0aGUgc3VwcGxpZWQge0Bjb2RlIEluZmxlY3Rvcn0uCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIHN0YXRpYyA8REFUQSwgUkVTVUxUPiBTdGFnZTxEQVRBPiBhc1N0YWdlKGZpbmFsIEluZmxlY3RvcjxEQVRBLCBSRVNVTFQ+IGluZmxlY3RvcikgeworICAgICAgICByZXR1cm4gbmV3IEluZmxlY3RpbmdTdGFnZTxEQVRBLCBSRVNVTFQ+KGluZmxlY3Rvcik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSW5mbGVjdGluZ1N0YWdlPERBVEEsIFJFU1VMVD4gaW1wbGVtZW50cyBTdGFnZTxEQVRBPiwgSW5mbGVjdGluZzxEQVRBLCBSRVNVTFQ+IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIEluZmxlY3RvcjxEQVRBLCBSRVNVTFQ+IGluZmxlY3RvcjsKKworICAgICAgICBwdWJsaWMgSW5mbGVjdGluZ1N0YWdlKEluZmxlY3RvcjxEQVRBLCBSRVNVTFQ+IGluZmxlY3RvcikgeworICAgICAgICAgICAgdGhpcy5pbmZsZWN0b3IgPSBpbmZsZWN0b3I7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEluZmxlY3RvcjxEQVRBLCBSRVNVTFQ+IGluZmxlY3RvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBpbmZsZWN0b3I7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0YWdlLkNvbnRpbnVhdGlvbjxEQVRBPiBhcHBseShEQVRBIHJlcXVlc3QpIHsKKyAgICAgICAgICAgIHJldHVybiBDb250aW51YXRpb24ub2YocmVxdWVzdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiAoT3B0aW9uYWxseSkgZXh0cmFjdHMgYW4ge0BsaW5rIEluZmxlY3RvciBpbmZsZWN0b3J9IGZyb20gYSBwcm9jZXNzaW5nIHN0YWdlLAorICAgICAqIHByb3ZpZGVkIHRoZSBzdGFnZSBpbXBsZW1lbnRzIHtAbGluayBJbmZsZWN0aW5nfSBpbnRlcmZhY2UuIE90aGVyd2lzZSBtZXRob2QKKyAgICAgKiByZXR1cm5zIHtAY29kZSBudWxsfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSA8REFUQT4gICBkYXRhIHR5cGUgdHJhbnNmb3JtYWJsZSBieSB0aGUgc3RhZ2UgYW5kIHJldHVybmVkIGluZmxlY3Rvci4KKyAgICAgKiBAcGFyYW0gPFJFU1VMVD4gdHlwZSBvZiByZXN1bHQgcHJvZHVjZWQgYnkgYSBzdWNjZXNzZnVsIGluZmxlY3RvciBkYXRhIHRyYW5zZm9ybWF0aW9uLgorICAgICAqIEBwYXJhbSBzdGFnZSAgICBhIHN0YWdlIHRvIGV4dHJhY3QgdGhlIGluZmxlY3RvciBmcm9tLgorICAgICAqIEByZXR1cm4gZXh0cmFjdGVkIGluZmxlY3RvciBpZiBwcmVzZW50LCB7QGNvZGUgbnVsbH0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBzdGF0aWMgPERBVEEsIFJFU1VMVCwgVCBleHRlbmRzIEluZmxlY3RvcjxEQVRBLCBSRVNVTFQ+PiBUIGV4dHJhY3RJbmZsZWN0b3IoT2JqZWN0IHN0YWdlKSB7CisgICAgICAgIGlmIChzdGFnZSBpbnN0YW5jZW9mIEluZmxlY3RpbmcpIHsKKyAgICAgICAgICAgIHJldHVybiAoVCkgKChJbmZsZWN0aW5nPERBVEEsIFJFU1VMVD4pIHN0YWdlKS5pbmZsZWN0b3IoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IGJ1aWxkaW5nIGEgc3RhZ2UgY2hhaW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJhbnNmb3JtYXRpb24gcm9vdCB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbi4KKyAgICAgKiBAcmV0dXJuIGxpbmVhciBhY2NlcHRpbmcgY2hhaW4gYnVpbGRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxEQVRBPiBTdGFnZS5CdWlsZGVyPERBVEE+IGNoYWluKEZ1bmN0aW9uPERBVEEsIERBVEE+IHRyYW5zZm9ybWF0aW9uKSB7CisgICAgICAgIHJldHVybiBuZXcgU3RhZ2VDaGFpbkJ1aWxkZXI8REFUQT4odHJhbnNmb3JtYXRpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IGJ1aWxkaW5nIGEgc3RhZ2UgY2hhaW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9vdFN0YWdlIHJvb3Qge0BsaW5rIENoYWluYWJsZVN0YWdlIGNoYWluYWJsZSBsaW5lYXIgc3RhZ2V9LgorICAgICAqIEByZXR1cm4gbGluZWFyIGFjY2VwdGluZyBjaGFpbiBidWlsZGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPERBVEE+IFN0YWdlLkJ1aWxkZXI8REFUQT4gY2hhaW4oQ2hhaW5hYmxlU3RhZ2U8REFUQT4gcm9vdFN0YWdlKSB7CisgICAgICAgIHJldHVybiBuZXcgU3RhZ2VDaGFpbkJ1aWxkZXI8REFUQT4ocm9vdFN0YWdlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSdW4gdGhlIGRhdGEgdGhyb3VnaCBhIGNoYWluIG9mIHN0YWdlcyBpZGVudGlmaWVkIGJ5IHRoZSByb290IHN0YWdlLgorICAgICAqCisgICAgICogQHBhcmFtIDxEQVRBPiAgICBwcm9jZXNzZWQgZGF0YSB0eXBlLgorICAgICAqIEBwYXJhbSBkYXRhICAgICAgZGF0YSB0byBiZSBwcm9jZXNzZWQuCisgICAgICogQHBhcmFtIHJvb3RTdGFnZSByb290IHN0YWdlIG9mIHRoZSBzdGFnZSBjaGFpbi4KKyAgICAgKiBAcmV0dXJuIHByb2Nlc3NpbmcgcmVzdWx0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPERBVEE+IERBVEEgcHJvY2VzcyhEQVRBIGRhdGEsIFN0YWdlPERBVEE+IHJvb3RTdGFnZSkgeworICAgICAgICBTdGFnZS5Db250aW51YXRpb248REFUQT4gY29udGludWF0aW9uID0gU3RhZ2UuQ29udGludWF0aW9uLm9mKGRhdGEsIHJvb3RTdGFnZSk7CisgICAgICAgIFN0YWdlPERBVEE+IGN1cnJlbnRTdGFnZTsKKyAgICAgICAgd2hpbGUgKChjdXJyZW50U3RhZ2UgPSBjb250aW51YXRpb24ubmV4dCgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICBjb250aW51YXRpb24gPSBjdXJyZW50U3RhZ2UuYXBwbHkoY29udGludWF0aW9uLnJlc3VsdCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29udGludWF0aW9uLnJlc3VsdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJ1biB0aGUgZGF0YSB0aHJvdWdoIGEgY2hhaW4gb2Ygc3RhZ2VzIGlkZW50aWZpZWQgYnkgdGhlIHJvb3Qgc3RhZ2UuCisgICAgICoKKyAgICAgKiBJZiBhbiBpbmZsZWN0b3IgaXMgZm91bmQgaW4gdGhlIGxlYWYgc3RhZ2UsIGl0J3MgcmVmZXJlbmNlIGlzIHNldCBpbnRvIHRoZSB7QGNvZGUgaW5mbGVjdG9yUmVmfQorICAgICAqIHBhcmFtZXRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSA8REFUQT4gICAgICAgcHJvY2Vzc2VkIGRhdGEgdHlwZS4KKyAgICAgKiBAcGFyYW0gZGF0YSAgICAgICAgIGRhdGEgdG8gYmUgcHJvY2Vzc2VkLgorICAgICAqIEBwYXJhbSByb290U3RhZ2UgICAgcm9vdCBzdGFnZSBvZiB0aGUgc3RhZ2UgY2hhaW4uCisgICAgICogQHBhcmFtIGluZmxlY3RvclJlZiBhIG11dGFibGUgcmVmZXJlbmNlIHRvIGFuIGluZmxlY3Rvci4KKyAgICAgKiBAcmV0dXJuIHByb2Nlc3NpbmcgcmVzdWx0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPERBVEEsIFJFU1VMVCwgVCBleHRlbmRzIEluZmxlY3RvcjxEQVRBLCBSRVNVTFQ+PiBEQVRBIHByb2Nlc3MoCisgICAgICAgICAgICBEQVRBIGRhdGEsCisgICAgICAgICAgICBTdGFnZTxEQVRBPiByb290U3RhZ2UsCisgICAgICAgICAgICBSZWY8VD4gaW5mbGVjdG9yUmVmKSB7CisKKyAgICAgICAgU3RhZ2U8REFUQT4gbGFzdFN0YWdlID0gcm9vdFN0YWdlOworICAgICAgICBTdGFnZS5Db250aW51YXRpb248REFUQT4gY29udGludWF0aW9uID0gU3RhZ2UuQ29udGludWF0aW9uLm9mKGRhdGEsIGxhc3RTdGFnZSk7CisgICAgICAgIHdoaWxlIChjb250aW51YXRpb24ubmV4dCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGxhc3RTdGFnZSA9IGNvbnRpbnVhdGlvbi5uZXh0KCk7CisgICAgICAgICAgICBjb250aW51YXRpb24gPSBsYXN0U3RhZ2UuYXBwbHkoY29udGludWF0aW9uLnJlc3VsdCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGluZmxlY3RvclJlZi5zZXQoU3RhZ2VzLjxEQVRBLCBSRVNVTFQsIFQ+ZXh0cmFjdEluZmxlY3RvcihsYXN0U3RhZ2UpKTsKKworICAgICAgICByZXR1cm4gY29udGludWF0aW9uLnJlc3VsdCgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN0YWdlQ2hhaW5CdWlsZGVyPERBVEE+IGltcGxlbWVudHMgU3RhZ2UuQnVpbGRlcjxEQVRBPiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBEZXF1ZTxGdW5jdGlvbjxEQVRBLCBEQVRBPj4gdHJhbnNmb3JtYXRpb25zID0gbmV3IExpbmtlZExpc3Q8RnVuY3Rpb248REFUQSwgREFUQT4+KCk7CisgICAgICAgIHByaXZhdGUgU3RhZ2U8REFUQT4gcm9vdFN0YWdlOworICAgICAgICBwcml2YXRlIENoYWluYWJsZVN0YWdlPERBVEE+IGxhc3RTdGFnZTsKKworICAgICAgICBwcml2YXRlIFN0YWdlQ2hhaW5CdWlsZGVyKEZ1bmN0aW9uPERBVEEsIERBVEE+IHRyYW5zZm9ybWF0aW9uKSB7CisgICAgICAgICAgICB0cmFuc2Zvcm1hdGlvbnMucHVzaCh0cmFuc2Zvcm1hdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFN0YWdlQ2hhaW5CdWlsZGVyKENoYWluYWJsZVN0YWdlPERBVEE+IHJvb3RTdGFnZSkgeworICAgICAgICAgICAgdGhpcy5yb290U3RhZ2UgPSByb290U3RhZ2U7CisgICAgICAgICAgICB0aGlzLmxhc3RTdGFnZSA9IHJvb3RTdGFnZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RhZ2UuQnVpbGRlcjxEQVRBPiB0byhGdW5jdGlvbjxEQVRBLCBEQVRBPiB0cmFuc2Zvcm1hdGlvbikgeworICAgICAgICAgICAgdHJhbnNmb3JtYXRpb25zLnB1c2godHJhbnNmb3JtYXRpb24pOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0YWdlLkJ1aWxkZXI8REFUQT4gdG8oZmluYWwgQ2hhaW5hYmxlU3RhZ2U8REFUQT4gc3RhZ2UpIHsKKyAgICAgICAgICAgIGFkZFRhaWxTdGFnZShzdGFnZSk7CisgICAgICAgICAgICBsYXN0U3RhZ2UgPSBzdGFnZTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgYWRkVGFpbFN0YWdlKFN0YWdlPERBVEE+IGxhc3RTdGFnZSkgeworICAgICAgICAgICAgU3RhZ2U8REFUQT4gdGFpbCA9IGxhc3RTdGFnZTsKKyAgICAgICAgICAgIGlmICghdHJhbnNmb3JtYXRpb25zLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHRhaWwgPSBjb252ZXJ0VHJhbnNmb3JtYXRpb25zKGxhc3RTdGFnZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocm9vdFN0YWdlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmxhc3RTdGFnZS5zZXREZWZhdWx0TmV4dCh0YWlsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcm9vdFN0YWdlID0gdGFpbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RhZ2U8REFUQT4gYnVpbGQoU3RhZ2U8REFUQT4gc3RhZ2UpIHsKKyAgICAgICAgICAgIGFkZFRhaWxTdGFnZShzdGFnZSk7CisKKyAgICAgICAgICAgIHJldHVybiByb290U3RhZ2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0YWdlPERBVEE+IGJ1aWxkKCkgeworICAgICAgICAgICAgcmV0dXJuIGJ1aWxkKG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTdGFnZTxEQVRBPiBjb252ZXJ0VHJhbnNmb3JtYXRpb25zKFN0YWdlPERBVEE+IHN1Y2Nlc3NvcikgeworICAgICAgICAgICAgU3RhZ2U8REFUQT4gc3RhZ2U7CisgICAgICAgICAgICBpZiAoc3VjY2Vzc29yID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzdGFnZSA9IG5ldyBMaW5rZWRTdGFnZTxEQVRBPih0cmFuc2Zvcm1hdGlvbnMucG9sbCgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RhZ2UgPSBuZXcgTGlua2VkU3RhZ2U8REFUQT4odHJhbnNmb3JtYXRpb25zLnBvbGwoKSwgc3VjY2Vzc29yKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgRnVuY3Rpb248REFUQSwgREFUQT4gdDsKKyAgICAgICAgICAgIHdoaWxlICgodCA9IHRyYW5zZm9ybWF0aW9ucy5wb2xsKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzdGFnZSA9IG5ldyBMaW5rZWRTdGFnZTxEQVRBPih0LCBzdGFnZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBzdGFnZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIExpbmtlZCBsaW5lYXIgc3RhZ2UgaW1wbGVtZW50YXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gPERBVEE+IHByb2Nlc3NlZCBkYXRhIHR5cGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBMaW5rZWRTdGFnZTxEQVRBPiBpbXBsZW1lbnRzIFN0YWdlPERBVEE+IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFN0YWdlPERBVEE+IG5leHRTdGFnZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBGdW5jdGlvbjxEQVRBLCBEQVRBPiB0cmFuc2Zvcm1hdGlvbjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGEgbmV3IHN0YWdlIHRoYXQgd2lsbCByZXR1cm4gdGhlIHN1cHBsaWVkIHN0YWdlIGluIHRoZQorICAgICAgICAgKiBjb250aW51YXRpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB0cmFuc2Zvcm1hdGlvbiBSZXF1ZXN0IHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uIHRvIGJlIGFwcGxpZWQgaW4gdGhlIHN0YWdlLgorICAgICAgICAgKiBAcGFyYW0gbmV4dFN0YWdlICAgICAgbmV4dCBzdGFnZSByZXR1cm5lZCBpbiB0aGUgY29udGludWF0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIExpbmtlZFN0YWdlKEZ1bmN0aW9uPERBVEEsIERBVEE+IHRyYW5zZm9ybWF0aW9uLCBTdGFnZTxEQVRBPiBuZXh0U3RhZ2UpIHsKKyAgICAgICAgICAgIHRoaXMubmV4dFN0YWdlID0gbmV4dFN0YWdlOworICAgICAgICAgICAgdGhpcy50cmFuc2Zvcm1hdGlvbiA9IHRyYW5zZm9ybWF0aW9uOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhIG5ldyB0ZXJtaW5hbCBzdGFnZSAuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB0cmFuc2Zvcm1hdGlvbiBSZXF1ZXN0IHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uIHRvIGJlIGFwcGxpZWQgaW4gdGhlIHN0YWdlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIExpbmtlZFN0YWdlKEZ1bmN0aW9uPERBVEEsIERBVEE+IHRyYW5zZm9ybWF0aW9uKSB7CisgICAgICAgICAgICB0aGlzKHRyYW5zZm9ybWF0aW9uLCBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RhZ2UuQ29udGludWF0aW9uPERBVEE+IGFwcGx5KERBVEEgZGF0YSkgeworICAgICAgICAgICAgcmV0dXJuIENvbnRpbnVhdGlvbi5vZih0cmFuc2Zvcm1hdGlvbi5hcHBseShkYXRhKSwgbmV4dFN0YWdlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvcHJvY2Vzcy9pbnRlcm5hbC9wYWNrYWdlLWluZm8uamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvcHJvY2Vzcy9pbnRlcm5hbC9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODg2ZDExCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9wcm9jZXNzL2ludGVybmFsL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKKy8qKgorICogQ29tbW9uIEplcnNleSBpbnRlcm5hbCBwcm9jZXNzaW5nIGNsYXNzZXMuCisgKi8KK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5pbnRlcm5hbDsKZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvcHJvY2Vzcy9wYWNrYWdlLWluZm8uamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvcHJvY2Vzcy9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGI1YWFjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9wcm9jZXNzL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKKy8qKgorICogQ29tbW9uIEplcnNleSBwcm9jZXNzaW5nIGNsYXNzZXMuCisgKi8KK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2VzczsKZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc3BpL0Fic3RyYWN0VGhyZWFkUG9vbFByb3ZpZGVyLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NwaS9BYnN0cmFjdFRocmVhZFBvb2xQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzYTAyYzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NwaS9BYnN0cmFjdFRocmVhZFBvb2xQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMzU3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaTsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5SZWplY3RlZEV4ZWN1dGlvbkhhbmRsZXI7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkRmFjdG9yeTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRQb29sRXhlY3V0b3I7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmEuVGhyZWFkRmFjdG9yeUJ1aWxkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5FeHRlbmRlZExvZ2dlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uTGF6eVZhbHVlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5WYWx1ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uVmFsdWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuSmVyc2V5UHJvY2Vzc2luZ1VuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcjsKKworLyoqCisgKiBBYnN0cmFjdCB0aHJlYWQgcG9vbCBleGVjdXRvciBwcm92aWRlci4KKyAqIDxwPgorICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIHNrZWxldG9uIGltcGxlbWVudGF0aW9uIGZvciBwcm92aXNpb25pbmcgYW5kIGJhc2ljIGxpZmVjeWNsZSBtYW5hZ2VtZW50IG9mIHRocmVhZCBwb29sIGV4ZWN1dG9ycy4KKyAqIEV2ZXJ5IGluc3RhbmNlIG9mIHRoZSBjb25jcmV0ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIHByb3ZpZGVyIGNsYXNzIGNyZWF0ZXMgYXQgbW9zdCBvbmUgc2hhcmVkIGFuZCBsYXppbHkgaW5pdGlhbGl6ZWQKKyAqIHRocmVhZCBwb29sIGV4ZWN1dG9yIGluc3RhbmNlLCB3aGljaCBjYW4gYmUgcmV0cmlldmVkIGJ5IGludm9raW5nIHRoZSB7QGxpbmsgI2dldEV4ZWN1dG9yKCl9IG1ldGhvZC4gVGhpcyBwcm92aWRlciBhbHNvIG1ha2VzCisgKiBzdXJlIHRoYXQgdGhlIHByb3Zpc2lvbmVkIHRocmVhZCBwb29sIGV4ZWN1dG9yIGluc3RhbmNlIGlzIHByb3Blcmx5IHNodXQgZG93biB3aGVuIHRoZSBtYW5hZ2luZyBwcm92aWRlciBpbnN0YW5jZSBpcworICoge0BsaW5rICNjbG9zZSgpIGNsb3NlZH0gKGluIGNhc2UgaXQgaGFzIG5vdCBiZWVuIGFscmVhZHkgc2h1dCBkb3duKS4KKyAqIDwvcD4KKyAqIDxwPgorICogQXQgbWluaW11bSwgY29uY3JldGUgc3ViY2xhc3NlcyBvZiB0aGlzIHByb3ZpZGVyIGFyZSBleHBlY3RlZCB0byBpbXBsZW1lbnQgdGhlIHtAbGluayAjY3JlYXRlRXhlY3V0b3J9IG1ldGhvZCB0aGF0IGlzIHVzZWQKKyAqIGFzIGEgdGhyZWFkIHBvb2wgaW5zdGFuY2UgZmFjdG9yeS4gVGhlIG1ldGhvZCBpcyBpbnZva2VkIGxhemlseSwgd2l0aCB0aGUgZmlyc3QgY2FsbCB0byB0aGUge0Bjb2RlIGdldEV4ZWN1dG9yKCl9IG1ldGhvZC4KKyAqIFRoZSByZXN1bHQgcmV0dXJuZWQgZnJvbSB0aGUge0Bjb2RlIGNyZWF0ZUV4ZWN1dG9yKCl9IG1ldGhvZCBpcyBjYWNoZWQgaW50ZXJuYWxseSBhbmQgaXMgdXNlZCBhcyBhIHJldHVybiB2YWx1ZSBmb3Igc3Vic2VxdWVudAorICogY2FsbHMgdG8gdGhlIHtAY29kZSBnZXRFeGVjdXRvcigpfSBtZXRob2QuIFRoaXMgbWVhbnMsIHRoYXQge0Bjb2RlIGNyZWF0ZUV4ZWN1dG9yKCl9IG1ldGhvZCBpcyBndWFyYW50ZWVkIHRvIGJlIGludm9rZWQKKyAqIDxlbT5hdCBtb3N0IG9uY2U8L2VtPiBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIGFueSBwYXJ0aWN1bGFyIHByb3ZpZGVyIGluc3RhbmNlLgorICogPC9wPgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKiBAc2luY2UgMi4xOAorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RUaHJlYWRQb29sUHJvdmlkZXI8RSBleHRlbmRzIFRocmVhZFBvb2xFeGVjdXRvcj4gaW1wbGVtZW50cyBBdXRvQ2xvc2VhYmxlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEV4dGVuZGVkTG9nZ2VyIExPR0dFUiA9IG5ldyBFeHRlbmRlZExvZ2dlcigKKyAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoQWJzdHJhY3RUaHJlYWRQb29sUHJvdmlkZXIuY2xhc3MuZ2V0TmFtZSgpKSwgTGV2ZWwuRklORVNUKTsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgdGhyZWFkIHBvb2wgZXhlY3V0b3IgdGVybWluYXRpb24gdGltZW91dCBpbiBtaWxsaXNlY29uZHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9URVJNSU5BVElPTl9USU1FT1VUID0gNTAwMDsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNCb29sZWFuIGNsb3NlZCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKyAgICBwcml2YXRlIGZpbmFsIExhenlWYWx1ZTxFPiBsYXp5RXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXIgPQorICAgICAgICAgICAgVmFsdWVzLmxhenkoKFZhbHVlPEU+KSAoKSAtPiBjcmVhdGVFeGVjdXRvcihnZXRDb3JlUG9vbFNpemUoKSwgY3JlYXRlVGhyZWFkRmFjdG9yeSgpLCBnZXRSZWplY3RlZEV4ZWN1dGlvbkhhbmRsZXIoKSkpOworCisgICAgLyoqCisgICAgICogSW5oZXJpdGFuY2UgY29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBuYW1lIG9mIHRoZSBwcm92aWRlZCB0aHJlYWQgcG9vbCBleGVjdXRvci4gV2lsbCBiZSB1c2VkIGluIHRoZSBuYW1lcyBvZiB0aHJlYWRzIGNyZWF0ZWQgJiB1c2VkIGJ5IHRoZQorICAgICAqICAgICAgICAgICAgIHByb3ZpZGVkIHRocmVhZCBwb29sIGV4ZWN1dG9yLgorICAgICAqLworICAgIHByb3RlY3RlZCBBYnN0cmFjdFRocmVhZFBvb2xQcm92aWRlcihmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdGhyZWFkIHBvb2wgZXhlY3V0b3IuCisgICAgICogPHAvPgorICAgICAqIFRoZSBmaXJzdCBpbnZvY2F0aW9uIG9mIHRoaXMgbWV0aG9kIHdpbGwgaW52b2tlIHRoZSBvdmVycmlkZGVuIHtAbGluayAjY3JlYXRlRXhlY3V0b3J9IG1ldGhvZCB0byByZXRyaWV2ZSB0aGUKKyAgICAgKiBwcm92aWRlZCB0aHJlYWQgcG9vbCBleGVjdXRvciBpbnN0YW5jZS4gVGhlIGNyZWF0ZWQgdGhyZWFkIHBvb2wgZXhlY3V0b3IgaW5zdGFuY2UgaXMgdGhlbiBjYWNoZWQgYW5kIHdpbGwgYmUgcmV0dXJuZWQgdXBvbgorICAgICAqIHN1YnNlcXVlbnQgY2FsbHMgdG8gdGhpcyBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHByb3ZpZGVkIHRocmVhZCBwb29sIGV4ZWN1dG9yLgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpbiBjYXNlIHRoZSBwcm92aWRlciBoYXMgYmVlbiB7QGxpbmsgI2Nsb3NlKCkgY2xvc2VkfSBhbHJlYWR5LgorICAgICAqIEBzZWUgI2NyZWF0ZUV4ZWN1dG9yCisgICAgICogQHNlZSAjY2xvc2UoKQorICAgICAqIEBzZWUgI2lzQ2xvc2VkKCkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgRSBnZXRFeGVjdXRvcigpIHsKKyAgICAgICAgaWYgKGlzQ2xvc2VkKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuVEhSRUFEX1BPT0xfRVhFQ1VUT1JfUFJPVklERVJfQ0xPU0VEKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBsYXp5RXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXIuZ2V0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0aHJlYWQgcG9vbCBleGVjdXRvciB0aGF0IHNob3VsZCBiZSBwcm92aWRlZCBieSB0aGUge0BsaW5rICNnZXRFeGVjdXRvcigpfSBtZXRob2QuCisgICAgICogPHA+CisgICAgICogQ29uY3JldGUgaW1wbGVtZW50YXRpb25zIG9mIHRoaXMgY2xhc3MgbXVzdCBvdmVycmlkZSB0aGlzIG1ldGhvZCBhbmQgaW1wbGVtZW50IHRoZSBsb2dpYyB0aGF0IGNyZWF0ZXMgdGhlIGV4ZWN1dG9yCisgICAgICogc2VydmljZSB0byBiZSBwcm92aWRlZC4gVGhlIHJldHVybmVkIHRocmVhZCBwb29sIGV4ZWN1dG9yIHdpbGwgYmUgc2h1dCBkb3duIHdoZW4gdGhpcyBwcm92aWRlciBpbnN0YW5jZSBpcworICAgICAqIHtAbGluayAjY2xvc2UoKSBjbG9zZWR9LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGF0IG1vc3Qgb25jZSwgZHVyaW5nIHRoZSBmaXJzdCBjYWxsIHRvIHRoZSB7QGNvZGUgZ2V0RXhlY3V0b3IoKX0gbWV0aG9kLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb3JlUG9vbFNpemUgIG51bWJlciBvZiBjb3JlIHRocmVhZHMgdGhlIHByb3Zpc2lvbmVkIHRocmVhZCBwb29sIGV4ZWN1dG9yIHNob3VsZCBwcm92aWRlLgorICAgICAqIEBwYXJhbSB0aHJlYWRGYWN0b3J5IHRocmVhZCBmYWN0b3J5IHRvIGJlIHVzZWQgYnkgdGhlIHByb3Zpc2lvbmVkIHRocmVhZCBwb29sIGV4ZWN1dG9yIHdoZW4gY3JlYXRpbmcgbmV3IHRocmVhZHMuCisgICAgICogQHBhcmFtIGhhbmRsZXIgICAgICAgaGFuZGxlciBmb3IgdGFza3MgdGhhdCBjYW5ub3QgYmUgZXhlY3V0ZWQgYnkgdGhlIHByb3Zpc2lvbmVkIHRocmVhZCBwb29sIGV4ZWN1dG9yIChlLmcuIGR1ZSB0byBhCisgICAgICogICAgICAgICAgICAgICAgICAgICAgc2h1dGRvd24pLgorICAgICAqIEByZXR1cm4gbmV3IGluc3RhbmNlIG9mIHRoZSBwcm92aWRlZCB0aHJlYWQgcG9vbCBleGVjdXRvci4KKyAgICAgKiBAc2VlICNnZXRFeGVjdXRvcigpCisgICAgICogQHNlZSAjY2xvc2UoKQorICAgICAqIEBzZWUgI2dldENvcmVQb29sU2l6ZSgpCisgICAgICogQHNlZSAjZ2V0QmFja2luZ1RocmVhZEZhY3RvcnkoKQorICAgICAqIEBzZWUgI2dldFJlamVjdGVkRXhlY3V0aW9uSGFuZGxlcigpCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IEUgY3JlYXRlRXhlY3V0b3IoCisgICAgICAgICAgICBmaW5hbCBpbnQgY29yZVBvb2xTaXplLCBmaW5hbCBUaHJlYWRGYWN0b3J5IHRocmVhZEZhY3RvcnksIGZpbmFsIFJlamVjdGVkRXhlY3V0aW9uSGFuZGxlciBoYW5kbGVyKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcHJvdmlzaW9uZWQgdGhyZWFkIHBvb2wgZXhlY3V0b3IgdGVybWluYXRpb24gdGltZSBvdXQgKGluIG1pbGxpc2Vjb25kcykuCisgICAgICogPHA+CisgICAgICogVGhlIG1ldGhvZCBpcyB1c2VkIGR1cmluZyB0aGUgdGhyZWFkIHBvb2wgZXhlY3V0b3Igc2h1dGRvd24gc2VxdWVuY2UgdG8gZGV0ZXJtaW5lIHRoZSBzaHV0ZG93biB0aW1lb3V0LCB3aGVuIHRoaXMgcHJvdmlkZXIKKyAgICAgKiBpbnN0YW5jZSBpcyB7QGxpbmsgI2Nsb3NlKCkgY2xvc2VkfS4KKyAgICAgKiBJbiBjYXNlIHRoZSB0aHJlYWQgcG9vbCBleGVjdXRvciBzaHV0ZG93biBpcyBpbnRlcnJ1cHRlZCBvciB0aGUgdGltZW91dCBleHBpcmVzLCB0aGUgcHJvdmlzaW9uZWQgdGhyZWFkIHBvb2wgZXhlY3V0b3IgaXMKKyAgICAgKiB7QGxpbmsgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlI3NodXRkb3duTm93KCkgc2h1dGRvd24gZm9yY2VmdWxseX0uCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gdG8gY3VzdG9taXplIHRoZSB0aHJlYWQgcG9vbCBleGVjdXRvciB0ZXJtaW5hdGlvbiB0aW1lIG91dC4gSWYgbm90IGN1c3RvbWl6ZWQsIHRoZQorICAgICAqIG1ldGhvZCBkZWZhdWx0cyB0byB7QHZhbHVlICNERUZBVUxUX1RFUk1JTkFUSU9OX1RJTUVPVVR9IG1zLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gcHJvdmlzaW9uZWQgdGhyZWFkIHBvb2wgZXhlY3V0b3IgdGVybWluYXRpb24gdGltZSBvdXQgKGluIG1pbGxpc2Vjb25kcykuCisgICAgICogQHNlZSAjY2xvc2UoKQorICAgICAqIEBzZWUgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlI2F3YWl0VGVybWluYXRpb24obG9uZywgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQpCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBnZXRUZXJtaW5hdGlvblRpbWVvdXQoKSB7CisgICAgICAgIHJldHVybiBERUZBVUxUX1RFUk1JTkFUSU9OX1RJTUVPVVQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBudW1iZXIgb2YgdGhlIGNvcmUgdGhyZWFkcyBvZiB0aGUgdGhlIHByb3Zpc2lvbmVkIHRocmVhZCBwb29sIGV4ZWN1dG9yLgorICAgICAqIDxwPgorICAgICAqIFRoZSB2YWx1ZSBmcm9tIHRoaXMgbWV0aG9kIGlzIHBhc3NlZCBhcyBvbmUgb2YgdGhlIGlucHV0IHBhcmFtZXRlcnMgaW4gYSBjYWxsIHRvIHRoZSB7QGxpbmsgI2NyZWF0ZUV4ZWN1dG9yfSBtZXRob2QuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gdG8gY3VzdG9taXplIHRoZSBudW1iZXIgb2YgY29yZSB0aHJlYWRzIG9mIHRoZSBwcm92aXNpb25lZCB0aHJlYWQgcG9vbCBleGVjdXRvci4KKyAgICAgKiBJZiBub3QgY3VzdG9taXplZCwgdGhlIG1ldGhvZCBkZWZhdWx0cyB0byB0aGUgbnVtYmVyIG9mIHtAbGluayBSdW50aW1lI2F2YWlsYWJsZVByb2Nlc3NvcnMoKSBhdmFpbGFibGUgcHJvY2Vzc29yc30KKyAgICAgKiBpbiB0aGUgc3lzdGVtLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIGNvcmUgdGhyZWFkcyBpbiB0aGUgcHJvdmlzaW9uZWQgdGhyZWFkIHBvb2wgZXhlY3V0b3IuCisgICAgICogQHNlZSAjY3JlYXRlRXhlY3V0b3IKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgaW50IGdldENvcmVQb29sU2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmF2YWlsYWJsZVByb2Nlc3NvcnMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGhhbmRsZXIgZm9yIHRhc2tzIHRoYXQgY291bGQgbm90IGJlIGV4ZWN1dGVkIGJ5IHRoZSBwcm92aXNpb25lZCB0aHJlYWQgcG9vbCBleGVjdXRvci4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgdmFsdWUgZnJvbSB0aGlzIG1ldGhvZCBpcyBwYXNzZWQgYXMgb25lIG9mIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGluIGEgY2FsbCB0byB0aGUge0BsaW5rICNjcmVhdGVFeGVjdXRvcn0gbWV0aG9kLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIHRvIGN1c3RvbWl6ZSB0aGUgcmVqZWN0ZWQgdGFzayBoYW5kbGVyIHVzZWQgYnkgdGhlIHByb3Zpc2lvbmVkIHRocmVhZCBwb29sIGV4ZWN1dG9yLgorICAgICAqIElmIG5vdCBjdXN0b21pemVkLCB0aGUgbWV0aG9kIHByb3ZpZGVzIGEgYmFzaWMgZGVmYXVsdCBOTy1PUCBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIGhhbmRsZXIgZm9yIHRhc2tzIHRoYXQgY291bGQgbm90IGJlIGV4ZWN1dGVkIGJ5IHRoZSBwcm92aXNpb25lZCB0aHJlYWQgcG9vbCBleGVjdXRvci4KKyAgICAgKiBAc2VlICNjcmVhdGVFeGVjdXRvcgorICAgICAqLworICAgIHByb3RlY3RlZCBSZWplY3RlZEV4ZWN1dGlvbkhhbmRsZXIgZ2V0UmVqZWN0ZWRFeGVjdXRpb25IYW5kbGVyKCkgeworICAgICAgICByZXR1cm4gKHIsIGV4ZWN1dG9yKSAtPiB7CisgICAgICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhlIHJlamVjdGVkIGV4ZWN1dGlvbiBoYW5kbGVyIG1ldGhvZC4KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBiYWNraW5nIHRocmVhZCBmYWN0b3J5IHRoYXQgc2hvdWxkIGJlIHVzZWQgYXMgYSBkZWxlZ2F0ZSBmb3IgY3JlYXRpbmcgdGhlIG5ldyB0aHJlYWRzIGZvciB0aGUgcHJvdmlzaW9uZWQgZXhlY3V0b3IKKyAgICAgKiBzZXJ2aWNlLgorICAgICAqIDxwPgorICAgICAqIFRoZSB2YWx1ZSBmcm9tIHRoaXMgbWV0aG9kIGlzIHVzZWQgYXMgYSBiYWNraW5nIHtAbGluayBUaHJlYWRGYWN0b3J5fSBmb3IgYW4gaW50ZXJuYWxseSBjb25zdHJ1Y3RlZCB0aHJlYWQgZmFjdG9yeQorICAgICAqIGluc3RhbmNlCisgICAgICogdGhhdCBpcyBwYXNzZWQgYXMgb25lIG9mIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGluIGEgY2FsbCB0byB0aGUge0BsaW5rICNjcmVhdGVFeGVjdXRvcn0gbWV0aG9kLgorICAgICAqIFdoZW4gbm90IHtAY29kZSBudWxsfSwgdGhlIG5ldyB0aHJlYWRzIHdpbGwgYmUgY3JlYXRlZCBieSBpbnZva2luZyB0aGUge0BsaW5rIFRocmVhZEZhY3RvcnkjbmV3VGhyZWFkKFJ1bm5hYmxlKX0gb24KKyAgICAgKiB0aGlzIGJhY2tpbmcge0Bjb2RlIFRocmVhZEZhY3Rvcnl9LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIHRvIGN1c3RvbWl6ZSB0aGUgYmFja2luZyB0aHJlYWQgZmFjdG9yeSBmb3IgdGhlIHByb3Zpc2lvbmVkIHRocmVhZCBwb29sIGV4ZWN1dG9yLgorICAgICAqIElmIG5vdCBjdXN0b21pemVkLCB0aGUgbWV0aG9kIHJldHVybnMge0Bjb2RlIG51bGx9IGJ5IGRlZmF1bHQuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHJldHVybiBiYWNraW5nIHRocmVhZCBmYWN0b3J5IGZvciB0aGUgcHJvdmlzaW9uZWQgdGhyZWFkIHBvb2wgZXhlY3V0b3IuIE1heSByZXR1cm4ge0Bjb2RlIG51bGx9LCBpbiB3aGljaCBjYXNlIG5vIGJhY2tpbmcKKyAgICAgKiB0aHJlYWQgZmFjdG9yeSB3aWxsIGJlIHVzZWQuCisgICAgICogQHNlZSAjY3JlYXRlRXhlY3V0b3IKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVGhyZWFkRmFjdG9yeSBnZXRCYWNraW5nVGhyZWFkRmFjdG9yeSgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBUaHJlYWRGYWN0b3J5IGNyZWF0ZVRocmVhZEZhY3RvcnkoKSB7CisgICAgICAgIGZpbmFsIFRocmVhZEZhY3RvcnlCdWlsZGVyIGZhY3RvcnlCdWlsZGVyID0gbmV3IFRocmVhZEZhY3RvcnlCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0TmFtZUZvcm1hdChuYW1lICsgIi0lZCIpCisgICAgICAgICAgICAgICAgLnNldFVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcihuZXcgSmVyc2V5UHJvY2Vzc2luZ1VuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcigpKTsKKworICAgICAgICBmaW5hbCBUaHJlYWRGYWN0b3J5IGJhY2tpbmdUaHJlYWRGYWN0b3J5ID0gZ2V0QmFja2luZ1RocmVhZEZhY3RvcnkoKTsKKyAgICAgICAgaWYgKGJhY2tpbmdUaHJlYWRGYWN0b3J5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZhY3RvcnlCdWlsZGVyLnNldFRocmVhZEZhY3RvcnkoYmFja2luZ1RocmVhZEZhY3RvcnkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhY3RvcnlCdWlsZGVyLmJ1aWxkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgdGhpcyB0aHJlYWQgcG9vbCBleGVjdXRvciBwcm92aWRlciBoYXMgYmVlbiB7QGxpbmsgI2Nsb3NlKCkgY2xvc2VkfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoaXMgcHJvdmlkZXIgaGFzIGJlZW4gY2xvc2VkLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2VlICNjbG9zZSgpCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNDbG9zZWQoKSB7CisgICAgICAgIHJldHVybiBjbG9zZWQuZ2V0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2UgZXZlbnQgaGFuZGxlciwgdGhhdCBpbnZva2VkIGR1cmluZyB0aGUge0BsaW5rICNjbG9zZSgpfSBvcGVyYXRpb24uCisgICAgICogPHA+CisgICAgICogQ29uY3JldGUgaW1wbGVtZW50YXRpb25zIG9mIHRoaXMgcHJvdmlkZXIgY2xhc3MgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHBlcmZvcm0gYW55IGFkZGl0aW9uYWwgcmVzb3VyY2UgY2xlYW4tdXAuCisgICAgICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBhIE5PLU9QLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgI2Nsb3NlKCkKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBvbkNsb3NlKCkgeworICAgICAgICAvLyBOTy1PUCBkZWZhdWx0IGltcGxlbWVudGF0aW9uLgorICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlIHRoaXMgdGhyZWFkIHBvb2wgZXhlY3V0b3IgcHJvdmlkZXIuCisgICAgICogPHA+CisgICAgICogT25jZSB0aGUgcHJvdmlkZXIgaXMgY2xvc2VkLCBpdCB3aWxsIHN0b3AgcHJvdmlkaW5nIHRoZSB0aHJlYWQgcG9vbCBleGVjdXRvciBhbmQgc3Vic2VxdWVudCBpbnZvY2F0aW9ucyB0bworICAgICAqIHtAbGluayAjZ2V0RXhlY3V0b3IoKX0gbWV0aG9kIHdpbGwgcmVzdWx0IGluIGFuIHtAbGluayBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9ufSBiZWluZyB0aHJvd24uIFRoZSBjdXJyZW50CisgICAgICogc3RhdHVzIG9mIHRoZSBwcm92aWRlciBjYW4gYmUgY2hlY2tlZCB2aWEge0BsaW5rICNpc0Nsb3NlZCgpfSBtZXRob2QuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFVwb24gaW52b2NhdGlvbiwgdGhlIGZvbGxvd2luZyB0YXNrcyBhcmUgcGVyZm9ybWVkOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+VGhlIHRocmVhZCBwb29sIGV4ZWN1dG9yIGluc3RhbmNlIHByb3Zpc2lvbmluZyB2aWEge0Bjb2RlIGdldEV4ZWN1dG9yKCl9IG1ldGhvZCBpcyBzdG9wcGVkLjwvbGk+CisgICAgICogPGxpPlRoZSB7QGxpbmsgI29uQ2xvc2UoKX0gZXZlbnQgaGFuZGxlciBpcyBpbnZva2VkLjwvbGk+CisgICAgICogPGxpPlRoZSB0aHJlYWQgcG9vbCBleGVjdXRvciwgaWYgcHJldmlvdXNseSB7QGxpbmsgI2NyZWF0ZUV4ZWN1dG9yIGNyZWF0ZWR9IGFuZCB7QGxpbmsgI2dldEV4ZWN1dG9yKCkgcHJvdmlzaW9uZWR9LAorICAgICAqIGlzIHNodXQgZG93bi48L2xpPgorICAgICAqIDwvdWw+CisgICAgICogVGhlIGFjdHVhbCB0aHJlYWQgcG9vbCBleGVjdXRvciBzaHV0ZG93biBpcyBwZXJmb3JtZWQgYXMgZm9sbG93czoKKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogRmlyc3QsIGEge0BsaW5rIGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZSNzaHV0ZG93bigpIGdyYWNlZnVsIHNodXRkb3dufSBpcyBhdHRlbXB0ZWQuIFRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tCisgICAgICogYSBjYWxsIHRvIHtAbGluayAjZ2V0VGVybWluYXRpb25UaW1lb3V0KCl9IG1ldGhvZCBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgZ3JhY2VmdWwgc2h1dGRvd24gdGltZW91dCBwZXJpb2QuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIEluIGNhc2UgdGhlIHRocmVhZCBwb29sIGV4ZWN1dG9yIGdyYWNlZnVsIHNodXRkb3duIGlzIGludGVycnVwdGVkIG9yIHRoZSB0aW1lb3V0IGV4cGlyZXMsIHRoZSBwcm92aXNpb25lZCB0aHJlYWQgcG9vbAorICAgICAqIGV4ZWN1dG9yIGlzCisgICAgICoge0BsaW5rIGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZSNzaHV0ZG93bk5vdygpIHNodXRkb3duIGZvcmNlZnVsbHl9LiBBbGwgdGFza3MgdGhhdCBoYXZlIG5ldmVyIGNvbW1lbmNlZAorICAgICAqIGV4ZWN1dGlvbiBhcmUgdGhlbiB7QGxpbmsgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlI2NhbmNlbCBjYW5jZWxsZWQgaW50ZXJydXB0aW5nbHl9LCBpZiBwb3NzaWJsZS4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAc2VlICNpc0Nsb3NlZCgpCisgICAgICogQHNlZSAjb25DbG9zZSgpCisgICAgICogQHNlZSAjZ2V0RXhlY3V0b3IoKQorICAgICAqIEBzZWUgI2dldFRlcm1pbmF0aW9uVGltZW91dCgpCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIGlmICghY2xvc2VkLmNvbXBhcmVBbmRTZXQoZmFsc2UsIHRydWUpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgb25DbG9zZSgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGxhenlFeGVjdXRvclNlcnZpY2VQcm92aWRlci5pc0luaXRpYWxpemVkKCkpIHsKKyAgICAgICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChzaHV0ZG93bkV4ZWN1dG9yKAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhenlFeGVjdXRvclNlcnZpY2VQcm92aWRlci5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFRlcm1pbmF0aW9uVGltZW91dCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSB7QGxpbmsgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9ufSB0aGF0IGNvbnRhaW5zIGxvZ2ljIGZvciBhIHByb3BlciBzaHV0LWRvd24gc2VxdWVuY2Ugb2YgYW4gZXhlY3V0b3IKKyAgICAgKiBzZXJ2aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIGV4ZWN1dG9yTmFtZSAgICAgICAgZXhlY3V0b3Igc2VydmljZSBpZGVudGlmaWNhdGlvbi4KKyAgICAgKiBAcGFyYW0gZXhlY3V0b3JTZXJ2aWNlICAgICBleGVjdXRvciBzZXJ2aWNlIGluc3RhbmNlLgorICAgICAqIEBwYXJhbSB0ZXJtaW5hdGlvblRpbWVvdXQgIG9yZGVybHkgc2h1dC1kb3duIHRlcm1pbmF0aW9uIHRpbWUtb3V0IHZhbHVlIChtYXhpbXVtIHRpbWUgdG8gd2FpdCBmb3IgdGhlIHRlcm1pbmF0aW9uKS4KKyAgICAgKiBAcGFyYW0gdGVybWluYXRpb25UaW1lVW5pdCBvcmRlcmx5IHNodXQtZG93biB0ZXJtaW5hdGlvbiB0aW1lLW91dCB0aW1lIHVuaXQuCisgICAgICogQHJldHVybiBhbiBleGVjdXRvciBzaHV0LWRvd24gbG9naWMgd3JhcHBlZCBpbiBhIHByaXZpbGVnZWQgYWN0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFByaXZpbGVnZWRBY3Rpb248Pz4gc2h1dGRvd25FeGVjdXRvcigKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBleGVjdXRvck5hbWUsCisgICAgICAgICAgICBmaW5hbCBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlLAorICAgICAgICAgICAgZmluYWwgaW50IHRlcm1pbmF0aW9uVGltZW91dCwKKyAgICAgICAgICAgIGZpbmFsIFRpbWVVbml0IHRlcm1pbmF0aW9uVGltZVVuaXQpIHsKKworICAgICAgICByZXR1cm4gKFByaXZpbGVnZWRBY3Rpb248Vm9pZD4pICgpIC0+IHsKKyAgICAgICAgICAgIGlmICghZXhlY3V0b3JTZXJ2aWNlLmlzU2h1dGRvd24oKSkgeworICAgICAgICAgICAgICAgIGV4ZWN1dG9yU2VydmljZS5zaHV0ZG93bigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGV4ZWN1dG9yU2VydmljZS5pc1Rlcm1pbmF0ZWQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sZWFuIHRlcm1pbmF0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGJvb2xlYW4gaW50ZXJydXB0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdGVybWluYXRlZCA9IGV4ZWN1dG9yU2VydmljZS5hd2FpdFRlcm1pbmF0aW9uKHRlcm1pbmF0aW9uVGltZW91dCwgdGVybWluYXRpb25UaW1lVW5pdCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgaWYgKExPR0dFUi5pc0RlYnVnTG9nZ2FibGUoKSkgeworICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExPR0dFUi5nZXREZWJ1Z0xldmVsKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludGVycnVwdGVkIHdoaWxlIHdhaXRpbmcgZm9yIHRocmVhZCBwb29sIGV4ZWN1dG9yICIgKyBleGVjdXRvck5hbWUgKyAiIHRvIHNodXRkb3duLiIsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnRlcnJ1cHRlZCA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKCF0ZXJtaW5hdGVkKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8UnVubmFibGU+IGNhbmNlbGxlZFRhc2tzID0gZXhlY3V0b3JTZXJ2aWNlLnNodXRkb3duTm93KCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoUnVubmFibGUgY2FuY2VsbGVkVGFzayA6IGNhbmNlbGxlZFRhc2tzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FuY2VsbGVkVGFzayBpbnN0YW5jZW9mIEZ1dHVyZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoRnV0dXJlKSBjYW5jZWxsZWRUYXNrKS5jYW5jZWwodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoTE9HR0VSLmlzRGVidWdMb2dnYWJsZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dHRVIuZGVidWdMb2coIlRocmVhZCBwb29sIGV4ZWN1dG9yIHswfSBmb3JjZWQtc2h1dCBkb3duLiBMaXN0IG9mIGNhbmNlbGxlZCB0YXNrczogezF9IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0b3JOYW1lLCBjYW5jZWxsZWRUYXNrcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChpbnRlcnJ1cHRlZCkgeworICAgICAgICAgICAgICAgICAgICAvLyByZXN0b3JpbmcgdGhlIGludGVycnVwdCBmbGFnCisgICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zcGkvQ29udGVudEVuY29kZXIuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc3BpL0NvbnRlbnRFbmNvZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVlMmJlZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc3BpL0NvbnRlbnRFbmNvZGVyLmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgamF2YXgud3MucnMuUHJpb3JpdGllczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SZWFkZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0OworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qcmlvcml0eTsKKworLyoqCisgKiBTdGFuZGFyZCBjb250cmFjdCBmb3IgcGx1Z2dpbmcgaW4gY29udGVudCBlbmNvZGluZyBzdXBwb3J0LiBQcm92aWRlcyBhIHN0YW5kYXJkIHdheSBvZiBpbXBsZW1lbnRpbmcgZW5jb2RpbmcKKyAqIHtAbGluayBXcml0ZXJJbnRlcmNlcHRvcn0gYW5kIGRlY29kaW5nIHtAbGluayBSZWFkZXJJbnRlcmNlcHRvcn0uIEltcGxlbWVudGluZyB0aGlzIGNsYXNzIGVuc3VyZXMgdGhlIGVuY29kaW5nCisgKiBzdXBwb3J0ZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uIHdpbGwgYmUgY29uc2lkZXJlZCBkdXJpbmcgdGhlIGNvbnRlbnQgbmVnb3RpYXRpb24gcGhhc2Ugd2hlbiBkZWNpZGluZyB3aGljaCBlbmNvZGluZworICogc2hvdWxkIGJlIHVzZWQgYmFzZWQgb24gdGhlIGFjY2VwdGVkIGVuY29kaW5ncyAoYW5kIHRoZSBhc3NvY2lhdGVkIHF1YWxpdHkgcGFyYW1ldGVycykgaW4gdGhlIHJlcXVlc3QgaGVhZGVycy4KKyAqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworQFByaW9yaXR5KFByaW9yaXRpZXMuRU5USVRZX0NPREVSKQorQENvbnRyYWN0CitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQ29udGVudEVuY29kZXIgaW1wbGVtZW50cyBSZWFkZXJJbnRlcmNlcHRvciwgV3JpdGVySW50ZXJjZXB0b3IgeworICAgIHByaXZhdGUgZmluYWwgU2V0PFN0cmluZz4gc3VwcG9ydGVkRW5jb2RpbmdzOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXMgdGhpcyBlbmNvZGVyIGltcGxlbWVudGF0aW9uIHdpdGggdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGNvbnRlbnQgZW5jb2RpbmdzLgorICAgICAqCisgICAgICogQHBhcmFtIHN1cHBvcnRlZEVuY29kaW5ncyBWYWx1ZXMgb2YgQ29udGVudC1FbmNvZGluZyBoZWFkZXIgc3VwcG9ydGVkIGJ5IHRoaXMgZW5jb2RpbmcgcHJvdmlkZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIENvbnRlbnRFbmNvZGVyKFN0cmluZy4uLiBzdXBwb3J0ZWRFbmNvZGluZ3MpIHsKKyAgICAgICAgaWYgKHN1cHBvcnRlZEVuY29kaW5ncy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIHRoaXMuc3VwcG9ydGVkRW5jb2RpbmdzID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KEFycmF5cy5zdHJlYW0oc3VwcG9ydGVkRW5jb2RpbmdzKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdmFsdWVzIG9mIENvbnRlbnQtRW5jb2RpbmcgaGVhZGVyIHN1cHBvcnRlZCBieSB0aGlzIGVuY29kZXIuCisgICAgICogQHJldHVybiBTZXQgb2Ygc3VwcG9ydGVkIENvbnRlbnQtRW5jb2RpbmcgdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBTZXQ8U3RyaW5nPiBnZXRTdXBwb3J0ZWRFbmNvZGluZ3MoKSB7CisgICAgICAgIHJldHVybiBzdXBwb3J0ZWRFbmNvZGluZ3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW1wbGVtZW50YXRpb25zIG9mIHRoaXMgbWV0aG9kIHNob3VsZCB0YWtlIHRoZSBlbmNvZGVkIHN0cmVhbSwgd3JhcCBpdCBhbmQgcmV0dXJuIGEgc3RyZWFtIHRoYXQgY2FuIGJlIHVzZWQKKyAgICAgKiB0byByZWFkIHRoZSBkZWNvZGVkIGVudGl0eS4KKyAgICAgKgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRlbnRFbmNvZGluZyBFbmNvZGluZyB0byBiZSB1c2VkIHRvIGRlY29kZSB0aGUgc3RyZWFtIC0gZ3VhcmFudGVlZCB0byBiZSBvbmUgb2YgdGhlIHN1cHBvcnRlZCBlbmNvZGluZworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLgorICAgICAqIEBwYXJhbSBlbmNvZGVkU3RyZWFtIEVuY29kZWQgaW5wdXQgc3RyZWFtLgorICAgICAqIEByZXR1cm4gRGVjb2RlZCBlbnRpdHkgc3RyZWFtLgorICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiBpZiBhbiBJTyBlcnJvciBhcmlzZXMuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IElucHV0U3RyZWFtIGRlY29kZShTdHJpbmcgY29udGVudEVuY29kaW5nLCBJbnB1dFN0cmVhbSBlbmNvZGVkU3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBJbXBsZW1lbnRhdGlvbnMgb2YgdGhpcyBtZXRob2Qgc2hvdWxkIHRha2UgdGhlIGVudGl0eSBzdHJlYW0sIHdyYXAgaXQgYW5kIHJldHVybiBhIHN0cmVhbSB0aGF0IGlzIGVuY29kZWQKKyAgICAgKiB1c2luZyB0aGUgc3BlY2lmaWVkIGVuY29kaW5nLgorICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGVudEVuY29kaW5nIEVuY29kaW5nIHRvIGJlIHVzZWQgdG8gZW5jb2RlIHRoZSBlbnRpdHkgLSBndWFyYW50ZWVkIHRvIGJlIG9uZSBvZiB0aGUgc3VwcG9ydGVkIGVuY29kaW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMuCisgICAgICogQHBhcmFtIGVudGl0eVN0cmVhbSBFbnRpdHkgc3RyZWFtIHRvIGJlIGVuY29kZWQuCisgICAgICogQHJldHVybiBFbmNvZGVkIHN0cmVhbS4KKyAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gaWYgYW4gSU8gZXJyb3IgYXJpc2VzLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBPdXRwdXRTdHJlYW0gZW5jb2RlKFN0cmluZyBjb250ZW50RW5jb2RpbmcsIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmaW5hbCBPYmplY3QgYXJvdW5kUmVhZEZyb20oUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgY29udGVudEVuY29kaW5nID0gY29udGV4dC5nZXRIZWFkZXJzKCkuZ2V0Rmlyc3QoSHR0cEhlYWRlcnMuQ09OVEVOVF9FTkNPRElORyk7CisgICAgICAgIGlmIChjb250ZW50RW5jb2RpbmcgIT0gbnVsbCAmJiBnZXRTdXBwb3J0ZWRFbmNvZGluZ3MoKS5jb250YWlucyhjb250ZW50RW5jb2RpbmcpKSB7CisgICAgICAgICAgICBjb250ZXh0LnNldElucHV0U3RyZWFtKGRlY29kZShjb250ZW50RW5jb2RpbmcsIGNvbnRleHQuZ2V0SW5wdXRTdHJlYW0oKSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb250ZXh0LnByb2NlZWQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgdm9pZCBhcm91bmRXcml0ZVRvKFdyaXRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gbXVzdCByZW1vdmUgQ29udGVudC1MZW5ndGggaGVhZGVyIHNpbmNlIHRoZSBlbmNvZGVkIG1lc3NhZ2Ugd2lsbCBoYXZlIGEgZGlmZmVyZW50IGxlbmd0aAorCisgICAgICAgIFN0cmluZyBjb250ZW50RW5jb2RpbmcgPSAoU3RyaW5nKSBjb250ZXh0LmdldEhlYWRlcnMoKS5nZXRGaXJzdChIdHRwSGVhZGVycy5DT05URU5UX0VOQ09ESU5HKTsKKyAgICAgICAgaWYgKGNvbnRlbnRFbmNvZGluZyAhPSBudWxsICYmIGdldFN1cHBvcnRlZEVuY29kaW5ncygpLmNvbnRhaW5zKGNvbnRlbnRFbmNvZGluZykpIHsKKyAgICAgICAgICAgIGNvbnRleHQuc2V0T3V0cHV0U3RyZWFtKGVuY29kZShjb250ZW50RW5jb2RpbmcsIGNvbnRleHQuZ2V0T3V0cHV0U3RyZWFtKCkpKTsKKyAgICAgICAgfQorICAgICAgICBjb250ZXh0LnByb2NlZWQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NwaS9Db250ZXh0UmVzb2x2ZXJzLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NwaS9Db250ZXh0UmVzb2x2ZXJzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA5NjgxNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc3BpL0NvbnRleHRSZXNvbHZlcnMuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaTsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuQ29udGV4dFJlc29sdmVyOworCisvKioKKyAqIEFuIGluamVjdGFibGUgaW50ZXJmYWNlIHByb3ZpZGluZyBsb29rLXVwIGZvciB7QGxpbmsgQ29udGV4dFJlc29sdmVyIENvbnRleHRSZXNvbHZlciZsdDtUJmd0O30KKyAqIHByb3ZpZGVyIGluc3RhbmNlcy4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgaW50ZXJmYWNlIENvbnRleHRSZXNvbHZlcnMgeworCisgICAgLyoqCisgICAgICogR2V0IHtAbGluayBDb250ZXh0UmVzb2x2ZXIgQ29udGV4dFJlc29sdmVyJmx0O1QmZ3Q7fSBpbnN0YW5jZSBmb3IgYSBnaXZlbiB0eXBlCisgICAgICogYW5kIG1lZGlhIHR5cGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gPFQ+IEphdmEgdHlwZSBwcm9kdWNlZCBieSB0aGUgY29udGV4dCByZXNvbHZlci4KKyAgICAgKiBAcGFyYW0gdHlwZSB0eXBlIHN1cHBvcnRlZCBieSB0aGUgY29udGV4dCByZXNvbHZlci4KKyAgICAgKiBAcGFyYW0gbWVkaWFUeXBlIG1lZGlhIHR5cGUgc3VwcG9ydGVkIGJ5IHRoZSBjb250ZXh0IHJlc29sdmVyLgorICAgICAqIEByZXR1cm4gcHJvcGVyIGNvbnRleHQgcmVzb2x2ZXIgaW5zdGFuY2UgaWYgZm91bmQsIG90aGVyd2lzZSB7QGNvZGUgbnVsbH0uCisgICAgICovCisgICAgPFQ+IENvbnRleHRSZXNvbHZlcjxUPiByZXNvbHZlKFR5cGUgdHlwZSwgTWVkaWFUeXBlIG1lZGlhVHlwZSk7Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NwaS9Db250cmFjdC5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zcGkvQ29udHJhY3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGY1YWZhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zcGkvQ29udHJhY3QuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaTsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKKy8qKgorICogVXNlZCB0byBhbm5vdGF0ZSBTUEkgcHJvdmlkZXIgY29udHJhY3RzIHJlY29nbml6ZWQgYnkgSmVyc2V5IChpbiBhZGRpdGlvbiB0byB0aGUgSkFYLVJTIHByb3ZpZGVycykuCisgKgorICogQWxsIHByb3ByaWV0YXJ5IEplcnNleSBleHRlbnNpb24gQVBJcyBhcmUgYW5ub3RhdGVkIHdpdGggdGhlIHtAY29kZSAmIzA2NDtDb250cmFjdH0gYW5ub3RhdGlvbi4KKyAqIDxwPgorICogU2ltaWxhcmx5LCBhbnkgY3VzdG9tIChpLmUuIG5vdCBKQVgtUlMgb3IgSmVyc2V5KSBleHRlbnNpb24gcHJvdmlkZXIgY29udHJhY3QgbXVzdCBiZSBhbm5vdGF0ZWQgd2l0aCB0aGlzCisgKiBhbm5vdGF0aW9uIG90aGVyd2lzZSBjb25jcmV0ZSBzZXJ2aWNlIGNsYXNzZXMgaW1wbGVtZW50aW5nIHRoZSBwcm92aWRlciBjb250cmFjdCB3b3VsZCBub3QgYmUgcmVjb2duaXplZAorICogYW5kIHRyZWF0ZWQgYXMgZXh0ZW5zaW9uIHNlcnZpY2UgcHJvdmlkZXIgYnkgSmVyc2V5IHJ1bnRpbWUuCisgKiA8L3A+CisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BUYXJnZXQoRWxlbWVudFR5cGUuVFlQRSkKK0BEb2N1bWVudGVkCitwdWJsaWMgQGludGVyZmFjZSBDb250cmFjdCB7Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NwaS9FeGNlcHRpb25NYXBwZXJzLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NwaS9FeGNlcHRpb25NYXBwZXJzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE5NDE1YwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc3BpL0V4Y2VwdGlvbk1hcHBlcnMuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaTsKKworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5FeGNlcHRpb25NYXBwZXI7CisKKy8qKgorICogUHJvdmlkZXMgbG9va3VwIG9mIHtAbGluayBFeGNlcHRpb25NYXBwZXJ9IGluc3RhbmNlcyB0aGF0IGNhbiBiZSB1c2VkCisgKiB0byBtYXAgZXhjZXB0aW9ucyB0byByZXNwb25zZXMuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitwdWJsaWMgaW50ZXJmYWNlIEV4Y2VwdGlvbk1hcHBlcnMgeworCisgICAgLyoqCisgICAgICogR2V0IGFuIGV4Y2VwdGlvbiBtYXBwaW5nIHByb3ZpZGVyIGZvciBhIHBhcnRpY3VsYXIgY2xhc3Mgb2YgZXhjZXB0aW9uLgorICAgICAqIFJldHVybnMgdGhlIHByb3ZpZGVyIHdob3NlIGdlbmVyaWMgdHlwZSBpcyB0aGUgbmVhcmVzdCBzdXBlcmNsYXNzIG9mCisgICAgICoge0Bjb2RlIHR5cGV9LgorICAgICAqCisgICAgICogQHBhcmFtIDxUPiB0eXBlIG9mIHRoZSBleGNlcHRpb24gaGFuZGxlZCBieSB0aGUgZXhjZXB0aW9uIG1hcHBpbmcgcHJvdmlkZXIuCisgICAgICogQHBhcmFtIHR5cGUgdGhlIGNsYXNzIG9mIGV4Y2VwdGlvbi4KKyAgICAgKiBAcmV0dXJuIGFuIHtAbGluayBFeGNlcHRpb25NYXBwZXJ9IGZvciB0aGUgc3VwcGxpZWQgdHlwZSBvciB7QGNvZGUgbnVsbH0KKyAgICAgKiAgICAgaWYgbm9uZSBpcyBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgPFQgZXh0ZW5kcyBUaHJvd2FibGU+IEV4Y2VwdGlvbk1hcHBlcjxUPiBmaW5kKENsYXNzPFQ+IHR5cGUpOworCisgICAgLyoqCisgICAgICogR2V0IGFuIGV4Y2VwdGlvbiBtYXBwaW5nIHByb3ZpZGVyIGZvciBhIHBhcnRpY3VsYXIgZXhjZXB0aW9uIGluc3RhbmNlLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIGlzIHNpbWlsYXIgdG8gbWV0aG9kIHtAbGluayAjZmluZChDbGFzcyl9LiBJbiBhZGRpdGlvbiBpdCB0YWtlcworICAgICAqIGludG8gYW4gYWNjb3VudCB0aGUgcmVzdWx0IG9mIHRoZSB7QGxpbmsgRXh0ZW5kZWRFeGNlcHRpb25NYXBwZXIjaXNNYXBwYWJsZShUaHJvd2FibGUpfQorICAgICAqIG9mIGFueSBtYXBwZXIgdGhhdCBpbXBsZW1lbnRzIEplcnNleSB7QGxpbmsgRXh0ZW5kZWRFeGNlcHRpb25NYXBwZXJ9IEFQSS4KKyAgICAgKiBJZiBhbiBleHRlbmRlZCBleGNlcHRpb24gbWFwcGVyIHJldHVybnMge0Bjb2RlIGZhbHNlfSBmcm9tIHtAY29kZSBpc01hcHBhYmxlKFRocm93YWJsZSl9LAorICAgICAqIHRoZSBtYXBwZXIgaXMgZGlzcmVnYXJkZWQgZnJvbSB0aGUgc2VhcmNoLgorICAgICAqIEV4Y2VwdGlvbiBtYXBwaW5nIHByb3ZpZGVycyBhcmUgY2hlY2tlZCBvbmUgYnkgb25lIHVudGlsIGEgZmlyc3QgcHJvdmlkZXIgcmV0dXJucworICAgICAqIHtAY29kZSB0cnVlfSBmcm9tIHRoZSB7QGNvZGUgaXNNYXBwYWJsZShUaHJvd2FibGUpfSBtZXRob2Qgb3IgdW50aWwgYSBmaXJzdCBwcm92aWRlcgorICAgICAqIGlzIGZvdW5kIHdoaWNoIGJlc3Qgc3VwcG9ydHMgdGhlIGV4Y2VwdGlvbiB0eXBlIGFuZCBkb2VzIG5vdCBpbXBsZW1lbnQge0Bjb2RlIEV4dGVuZGVkRXhjZXB0aW9uTWFwcGVyfQorICAgICAqIEFQSSAoaS5lLiBpdCBpcyBhIHN0YW5kYXJkIEpBWC1SUyB7QGxpbmsgRXhjZXB0aW9uTWFwcGVyfSkuIFRoZSBvcmRlciBpbiB3aGljaCB0aGUgcHJvdmlkZXJzIGFyZQorICAgICAqIGNoZWNrZWQgaXMgZGV0ZXJtaW5lZCBieSB0aGUgZGlzdGFuY2Ugb2YgdGhlIGRlY2xhcmVkIGV4Y2VwdGlvbiBtYXBwZXIgdHlwZSBhbmQgdGhlIGFjdHVhbCBleGNlcHRpb24KKyAgICAgKiB0eXBlLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlIHRoYXQgaWYgYW4gZXhjZXB0aW9uIG1hcHBpbmcgcHJvdmlkZXIgZG9lcyBub3QgaW1wbGVtZW50IHtAbGluayBFeHRlbmRlZEV4Y2VwdGlvbk1hcHBlcn0KKyAgICAgKiBpdCBpcyBhbHdheXMgY29uc2lkZXJlZCBhcHBsaWNhYmxlIGZvciBhIGdpdmVuIGV4Y2VwdGlvbiBpbnN0YW5jZS4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gZXhjZXB0aW9uSW5zdGFuY2UgZXhjZXB0aW9uIHRvIGJlIGhhbmRsZWQgYnkgdGhlIGV4Y2VwdGlvbiBtYXBwaW5nIHByb3ZpZGVyLgorICAgICAqIEBwYXJhbSA8VD4gdHlwZSBvZiB0aGUgZXhjZXB0aW9uIGhhbmRsZWQgYnkgdGhlIGV4Y2VwdGlvbiBtYXBwaW5nIHByb3ZpZGVyLgorICAgICAqIEByZXR1cm4gYW4ge0BsaW5rIEV4Y2VwdGlvbk1hcHBlcn0gZm9yIHRoZSBzdXBwbGllZCBleGNlcHRpb24gaW5zdGFuY2UgdHlwZSBvciB7QGNvZGUgbnVsbH0gaWYgbm9uZQorICAgICAqICAgICAgICAgIGlzIGZvdW5kLgorICAgICAqLworICAgIHB1YmxpYyA8VCBleHRlbmRzIFRocm93YWJsZT4gRXhjZXB0aW9uTWFwcGVyPFQ+IGZpbmRNYXBwaW5nKFQgZXhjZXB0aW9uSW5zdGFuY2UpOworfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zcGkvRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXIuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc3BpL0V4ZWN1dG9yU2VydmljZVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlmNjIzYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc3BpL0V4ZWN1dG9yU2VydmljZVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGk7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CisKKy8qKgorICogQW4gZXh0ZW5zaW9uIGNvbnRyYWN0IGZvciBwcm92aWRpbmcgcGx1Z2dhYmxlIGV4ZWN1dG9yIHNlcnZpY2UgcHJvdmlkZXJzIHRvIGJlIHVzZWQgYnkKKyAqIEplcnNleSBjbGllbnQgb3Igc2VydmVyIHJ1bnRpbWUgd2hlbmV2ZXIgYSBzcGVjaWZpYyBleGVjdXRvciBzZXJ2aWNlIGlzIG5lZWRlZCB0byBleGVjdXRlIGEgSmVyc2V5IHJ1bnRpbWUgcHJvY2Vzc2luZyB0YXNrLgorICogPHA+CisgKiBUaGlzIG1lY2hhbmlzbSBhbGxvd3MgSmVyc2V5IHRvIHJ1biBpbiBlbnZpcm9ubWVudHMgdGhhdCBoYXZlIHNwZWNpZmljIHRocmVhZCBtYW5hZ2VtZW50IGFuZCBwcm92aXNpb25pbmcgcmVxdWlyZW1lbnRzLAorICogc3VjaCBhcyBhcHBsaWNhdGlvbiBzZXJ2ZXJzLCBjbG91ZCBlbnZpcm9ubWVudHMgZXRjLgorICogRGVkaWNhdGVkIEplcnNleSBleHRlbnNpb24gbW9kdWxlcyBvciBhcHBsaWNhdGlvbnMgcnVubmluZyBpbiBzdWNoIGVudmlyb25tZW50IG1heSBwcm92aWRlIGEgY3VzdG9tCisgKiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0Bjb2RlIEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyfSBpbnRlcmZhY2UgdG8gY3VzdG9taXplIHRoZSBkZWZhdWx0CisgKiBKZXJzZXkgcnVudGltZSB0aHJlYWQgbWFuYWdlbWVudCAmIHByb3Zpc2lvbmluZyBzdHJhdGVneSBpbiBvcmRlciB0byBjb21wbHkgd2l0aCB0aGUgdGhyZWFkaW5nIHJlcXVpcmVtZW50cywKKyAqIG1vZGVscyBhbmQgcG9saWNpZXMgc3BlY2lmaWMgdG8gZWFjaCBwYXJ0aWN1bGFyIGVudmlyb25tZW50LgorICogPC9wPgorICogPHA+CisgKiBXaGVuIEplcnNleSBydW50aW1lIG5vIGxvbmdlciByZXF1aXJlcyB0aGUgdXNlIG9mIGEgcHJvdmlkZWQgZXhlY3V0b3Igc2VydmljZSBpbnN0YW5jZSwgaXQgaW52b2tlcyB0aGUgcHJvdmlkZXIncworICoge0BsaW5rICNkaXNwb3NlfSBtZXRob2QgdG8gc2lnbmFsIHRoZSBwcm92aWRlciB0aGF0IHRoZSBleGVjdXRvciBzZXJ2aWNlIGluc3RhbmNlIGNhbiBiZSBkaXNwb3NlZCBvZi4gSW4gdGhpcyBtZXRob2QsCisgKiBwcm92aWRlciBpcyBmcmVlIHRvIGltcGxlbWVudCB0aGUgcHJvcGVyIHNodXQtZG93biBsb2dpYyBmb3IgdGhlIGRpc3Bvc2VkIGV4ZWN1dG9yIHNlcnZpY2UgaW5zdGFuY2UgYW5kIHBlcmZvcm0gb3RoZXIKKyAqIG5lY2Vzc2FyeSBjbGVhbnVwLiBZZXQsIHNvbWUgcHJvdmlkZXJzIG1heSB3aXNoIHRvIGltcGxlbWVudCBhIHNoYXJlZCBleGVjdXRvciBzZXJ2aWNlIHN0cmF0ZWd5LiBJbiBzdWNoIGNhc2UsCisgKiBpdCBtYXkgbm90IGJlIGRlc2lyYWJsZSB0byBzaHV0IGRvd24gdGhlIHJlbGVhc2VkIGV4ZWN1dG9yIHNlcnZpY2UgaW4gdGhlIHtAbGluayAjZGlzcG9zZX0gbWV0aG9kLiBJbnN0ZWFkLCB0byBwZXJmb3JtIHRoZQorICogZXZlbnR1YWwgc2h1dC1kb3duIHByb2NlZHVyZSwgdGhlIHByb3ZpZGVyIG1heSBlaXRoZXIgcmVseSBvbiBhbiBleHBsaWNpdCBpbnZvY2F0aW9uIG9mIGl0J3Mgc3BlY2lmaWMgY2xlYW4tdXAgbWV0aG9kLgorICogU2luY2UgYWxsIEplcnNleSBwcm92aWRlcnMgb3BlcmF0ZSBpbiBhIDxlbT5jb250YWluZXI8L2VtPiBlbnZpcm9ubWVudCwgYSBnb29kIGNsZWFuLXVwIHN0cmF0ZWd5IGZvciBhIHNoYXJlZCBleGVjdXRvcgorICogc2VydmljZSBwcm92aWRlciBpbXBsZW1lbnRhdGlvbiBpcyB0byBleHBvc2UgYSB7QGxpbmsgamF2YXguYW5ub3RhdGlvbi5QcmVEZXN0cm95ICYjNjQ7UHJlRGVzdHJveX0tYW5ub3RhdGVkIG1ldGhvZAorICogdGhhdCB3aWxsIGJlIGludm9rZWQgZm9yIGFsbCBpbnN0YW5jZXMgbWFuYWdlZCBieSB0aGUgY29udGFpbmVyLCBiZWZvcmUgdGhlIGNvbnRhaW5lciBzaHV0cyBkb3duLgorICogPC9wPgorICogPHA+CisgKiBJTVBPUlRBTlQ6IFBsZWFzZSBub3RlIHRoYXQgYW55IHByZS1kZXN0cm95IG1ldGhvZHMgbWF5IG5vdCBiZSBpbnZva2VkIGZvciBpbnN0YW5jZXMgY3JlYXRlZCBvdXRzaWRlIG9mIHRoZSBjb250YWluZXIKKyAqIGFuZCBsYXRlciByZWdpc3RlcmVkIHdpdGhpbiB0aGUgY29udGFpbmVyLiBQcmUtZGVzdHJveSBtZXRob2RzIGFyZSBvbmx5IGd1YXJhbnRlZWQgdG8gYmUgaW52b2tlZCBmb3IgdGhvc2UgaW5zdGFuY2VzCisgKiB0aGF0IGFyZSBjcmVhdGVkIGFuZCBtYW5hZ2VkIGJ5IHRoZSBjb250YWluZXIuCisgKiA8L3A+CisgKiA8cD4KKyAqIEplcnNleSBydW50aW1lIGV4cGVjdHMgdGhhdCBhIGNvbmNyZXRlIGV4ZWN1dG9yIHNlcnZpY2UgcHJvdmlkZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgaXMgYW5ub3RhdGVkIHdpdGggYQorICoge0BsaW5rIGphdmF4LmluamVjdC5RdWFsaWZpZXIgcXVhbGlmaWVyfSBhbm5vdGF0aW9uLiBUaGlzIHF1YWxpZmllciBpcyB0aGVuIHVzZWQgdG8gY3JlYXRlQW5kSW5pdGlhbGl6ZSBhIHF1YWxpZmllZCBpbmplY3Rpb24gcG9pbnQKKyAqIGZvciBpbmplY3RpbmcgdGhlIGV4ZWN1dG9yIHNlcnZpY2UgaW5zdGFuY2UgcHJvdmlkZWQgYnkgdGhlIGFubm90YXRlZCBwcm92aWRlci4ge0BsaW5rIGphdmF4LmluamVjdC5OYW1lZCBOYW1lZH0gcHJvdmlkZXJzCisgKiBhcmUgYWxzbyBzdXBwb3J0ZWQuIEZvciBleGFtcGxlOgorICogPC9wPgorICogPHByZT4KKyAqICYjNjQ7TmFtZWQoIm15LWV4ZWN1dG9yIikKKyAqIHB1YmxpYyBNeUV4ZWN1dG9yUHJvdmlkZXIgaW1wbGVtZW50cyBFeGVjdXRvclNlcnZpY2VQcm92aWRlciB7CisgKiAgICAgLi4uCisgKiB9CisgKgorICogLi4uCisgKgorICogLy8gSW5qZWN0aW5nIEV4ZWN1dG9yU2VydmljZSBwcm92aWRlZCBieSB0aGUgTXlFeGVjdXRvclByb3ZpZGVyCisgKiAmIzY0O0luamVjdCAmIzY0O05hbWVkKCJteS1leGVjdXRvciIpIEV4ZWN1dG9yU2VydmljZSBteUV4ZWN1dG9yOworICogPC9wcmU+CisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqIEBzZWUgU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXIKKyAqIEBzZWUgVGhyZWFkUG9vbEV4ZWN1dG9yUHJvdmlkZXIKKyAqIEBzaW5jZSAyLjE4CisgKi8KK0BDb250cmFjdAorcHVibGljIGludGVyZmFjZSBFeGVjdXRvclNlcnZpY2VQcm92aWRlciB7CisKKyAgICAvKioKKyAgICAgKiBHZXQgYW4gZXhlY3V0b3Igc2VydmljZSB0byBiZSB1c2VkIGJ5IEplcnNleSBjbGllbnQgb3Igc2VydmVyIHJ1bnRpbWUgdG8gZXhlY3V0ZSBzcGVjaWZpYyB0YXNrcy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyA8ZW0+dXN1YWxseTwvZW0+IGludm9rZWQganVzdCBvbmNlIGF0IGVpdGhlciBKZXJzZXkgY2xpZW50IG9yIHNlcnZlciBhcHBsaWNhdGlvbiBydW50aW1lIGluaXRpYWxpemF0aW9uLAorICAgICAqIGl0IDxlbT5tYXk8L2VtPiBob3dldmVyIGJlIGludm9rZWQgbXVsdGlwbGUgdGltZXMuIE9uY2UgdGhlIGluc3RhbmNlIG9mIHRoZSBwcm92aWRlZCBleGVjdXRvciBzZXJ2aWNlIGlzIG5vdAorICAgICAqIG5lZWRlZCBhbnltb3JlIGJ5IEplcnNleSBhcHBsaWNhdGlvbiBydW50aW1lLCBpdCB3aWxsIGJlIHtAbGluayAjZGlzcG9zZSBkaXNwb3NlZH0uCisgICAgICogVGhpcyB0eXBpY2FsbHkgaGFwcGVucyBpbiBvbmUgb2YgdGhlIGZvbGxvd2luZyBzaXR1YXRpb25zOgorICAgICAqIDwvcD4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPkplcnNleSBjbGllbnQgaW5zdGFuY2UgaXMgY2xvc2VkIChjbGllbnQgcnVudGltZSBpcyBzaHV0IGRvd24pLjwvbGk+CisgICAgICogPGxpPkplcnNleSBjb250YWluZXIgcnVubmluZyBhIHNlcnZlci1zaWRlIEplcnNleSBhcHBsaWNhdGlvbiBpcyBzaHV0IGRvd24uPC9saT4KKyAgICAgKiA8bGk+SmVyc2V5IHNlcnZlci1zaWRlIGFwcGxpY2F0aW9uIGlzIHVuLWRlcGxveWVkLjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYW4gZXhlY3V0b3Igc2VydmljZS4gTXVzdCBub3QgcmV0dXJuIHtAY29kZSBudWxsfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRXhlY3V0b3JTZXJ2aWNlIGdldEV4ZWN1dG9yU2VydmljZSgpOworCisgICAgLyoqCisgICAgICogSW52b2tlZCB3aGVuIEplcnNleSBydW50aW1lIG5vIGxvbmdlciByZXF1aXJlcyB1c2Ugb2YgdGhlIHByb3ZpZGVkIGV4ZWN1dG9yIHNlcnZpY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yIHNlcnZpY2UgdG8gYmUgZGlzcG9zZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGlzcG9zZShFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc3BpL0V4dGVuZGVkRXhjZXB0aW9uTWFwcGVyLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NwaS9FeHRlbmRlZEV4Y2VwdGlvbk1hcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYmViZTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NwaS9FeHRlbmRlZEV4Y2VwdGlvbk1hcHBlci5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpOworCitpbXBvcnQgamF2YXgud3MucnMuZXh0LkV4Y2VwdGlvbk1hcHBlcjsKKworLyoqCisgKiBFeHRlbnNpb24gb2YgYSB7QGxpbmsgRXhjZXB0aW9uTWFwcGVyIGV4Y2VwdGlvbiBtYXBwZXIgaW50ZXJmYWNlfS4gVGhlIGV4Y2VwdGlvbiBtYXBwaW5nCisgKiBwcm92aWRlcnMgY2FuIGV4dGVuZCBmcm9tIHRoaXMgaW50ZXJmYWNlIHRvIGFkZCBqZXJzZXkgc3BlY2lmaWMgZnVuY3Rpb25hbGl0eSB0byB0aGVzZQorICogcHJvdmlkZXJzLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqCisgKiBAcGFyYW0gPFQ+IEEgdHlwZSBvZiB0aGUgZXhjZXB0aW9uIHByb2Nlc3NlZCBieSB0aGUgZXhjZXB0aW9uIG1hcHBlci4KKyAqLworcHVibGljIGludGVyZmFjZSBFeHRlbmRlZEV4Y2VwdGlvbk1hcHBlcjxUIGV4dGVuZHMgVGhyb3dhYmxlPiBleHRlbmRzIEV4Y2VwdGlvbk1hcHBlcjxUPiB7CisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBwcm92aWRlciBpcyBhYmxlIHRvIHByb2Nlc3MgYSBzdXBwbGllZCBleGNlcHRpb24gaW5zdGFuY2UuCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIG9ubHkgb24gdGhvc2UgZXhjZXB0aW9uIG1hcHBpbmcgcHJvdmlkZXJzIHRoYXQgYXJlIGFibGUgdG8KKyAgICAgKiBwcm9jZXNzIHRoZSB0eXBlIG9mIHRoZSB7QGNvZGUgZXhjZXB0aW9ufSBhcyBkZWZpbmVkIGJ5IHRoZSBKQVgtUlMKKyAgICAgKiB7QGxpbmsgRXhjZXB0aW9uTWFwcGVyfSBjb250cmFjdC4gQnkgcmV0dXJuaW5nIHtAY29kZSBmYWxzZX0gdGhpcyBtZXRob2QgY2FuIHJlamVjdAorICAgICAqIGFueSBnaXZlbiBleGNlcHRpb24gaW5zdGFuY2UgYW5kIGNoYW5nZSB0aGUgZGVmYXVsdCBKQVgtUlMgZXhjZXB0aW9uIG1hcHBlcgorICAgICAqIHNlbGVjdGlvbiBiZWhhdmlvdXIuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGV4Y2VwdGlvbiBleGNlcHRpb24gaW5zdGFuY2Ugd2hpY2ggc2hvdWxkIGJlIHByb2Nlc3NlZC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgbWFwcGVyIGlzIGFibGUgdG8gbWFwIHRoZSBwYXJ0aWN1bGFyIGV4Y2VwdGlvbiBpbnN0YW5jZSwKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzTWFwcGFibGUoVCBleGNlcHRpb24pOworfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zcGkvSGVhZGVyRGVsZWdhdGVQcm92aWRlci5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zcGkvSGVhZGVyRGVsZWdhdGVQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5OTNlMzAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NwaS9IZWFkZXJEZWxlZ2F0ZVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUnVudGltZURlbGVnYXRlLkhlYWRlckRlbGVnYXRlOworCisvKioKKyAqIEEgcHJvdmlkZXIgdGhhdCBzdXBwb3J0cyB0aGUgY29udmVyc2lvbiBvZiBhbiBIVFRQIGhlYWRlciwgb2YgdHlwZSBULCB0byBhbmQKKyAqIGZyb20gYSB7QGxpbmsgU3RyaW5nfS4KKyAqIDxwPgorICogQW4gaW1wbGVtZW50YXRpb24gKGEgc2VydmljZS1wcm92aWRlcikgaWRlbnRpZmllcyBpdHNlbGYgYnkgcGxhY2luZyBhCisgKiBwcm92aWRlci1jb25maWd1cmF0aW9uIGZpbGUgKGlmIG5vdCBhbHJlYWR5IHByZXNlbnQpLAorICogIm9yZy5nbGFzc2Zpc2guamVyc2V5LmhlYWRlci5zcGkuSGVhZGVyRGVsZWdhdGVQcm92aWRlciIgaW4gdGhlCisgKiByZXNvdXJjZSBkaXJlY3RvcnkgPHR0Pk1FVEEtSU5GL3NlcnZpY2VzPC90dD4sIGFuZCBpbmNsdWRpbmcgdGhlIGZ1bGx5IHF1YWxpZmllZAorICogc2VydmljZS1wcm92aWRlci1jbGFzcyBvZiB0aGUgaW1wbGVtZW50YXRpb24gaW4gdGhlIGZpbGUuCisKKyAqIEBwYXJhbSA8VD4gdGhlIHR5cGUgb2YgdGhlIGhlYWRlci4KKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK0BDb250cmFjdAorcHVibGljIGludGVyZmFjZSBIZWFkZXJEZWxlZ2F0ZVByb3ZpZGVyPFQ+IGV4dGVuZHMgSGVhZGVyRGVsZWdhdGU8VD4geworCisgICAgLyoqCisgICAgICogQXNjZXJ0YWluIGlmIHRoZSBQcm92aWRlciBzdXBwb3J0cyBhIHBhcnRpY3VsYXIgdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIHRoYXQgaXMgdG8gYmUgc3VwcG9ydGVkLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdHlwZSBpcyBzdXBwb3J0ZWQsIG90aGVyd2lzZSBmYWxzZS4KKyAgICAgKi8KKyAgICBib29sZWFuIHN1cHBvcnRzKENsYXNzPD8+IHR5cGUpOworfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zcGkvU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXIuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc3BpL1NjaGVkdWxlZEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThmODAxYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc3BpL1NjaGVkdWxlZEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGk7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRFeGVjdXRvclNlcnZpY2U7CisKKy8qKgorICogQW4gZXh0ZW5zaW9uIGNvbnRyYWN0IGZvciBwcm92aWRpbmcgcGx1Z2dhYmxlIHNjaGVkdWxlZCBleGVjdXRvciBzZXJ2aWNlIHByb3ZpZGVycyB0byBiZSB1c2VkIGJ5CisgKiBKZXJzZXkgY2xpZW50IG9yIHNlcnZlciBydW50aW1lIHdoZW5ldmVyIGEgc3BlY2lmaWMgc2NoZWR1bGVyIGlzIG5lZWRlZCB0byBzY2hlZHVsZSBleGVjdXRpb24gb2YgYQorICogSmVyc2V5IHJ1bnRpbWUgcHJvY2Vzc2luZyB0YXNrLgorICogPHA+CisgKiBUaGlzIG1lY2hhbmlzbSBhbGxvd3MgSmVyc2V5IHRvIHJ1biBpbiBlbnZpcm9ubWVudHMgdGhhdCBoYXZlIHNwZWNpZmljIHRocmVhZCBtYW5hZ2VtZW50IGFuZCBwcm92aXNpb25pbmcgcmVxdWlyZW1lbnRzLAorICogc3VjaCBhcyBhcHBsaWNhdGlvbiBzZXJ2ZXJzLCBjbG91ZCBlbnZpcm9ubWVudHMgZXRjLgorICogRGVkaWNhdGVkIEplcnNleSBleHRlbnNpb24gbW9kdWxlcyBvciBhcHBsaWNhdGlvbnMgcnVubmluZyBpbiBzdWNoIGVudmlyb25tZW50IG1heSBwcm92aWRlIGEgY3VzdG9tCisgKiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0Bjb2RlIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyfSBpbnRlcmZhY2UgdG8gY3VzdG9taXplIHRoZSBkZWZhdWx0CisgKiBKZXJzZXkgcnVudGltZSB0aHJlYWQgbWFuYWdlbWVudCAmIHByb3Zpc2lvbmluZyBzdHJhdGVneSBpbiBvcmRlciB0byBjb21wbHkgd2l0aCB0aGUgdGhyZWFkaW5nIHJlcXVpcmVtZW50cywKKyAqIG1vZGVscyBhbmQgcG9saWNpZXMgc3BlY2lmaWMgdG8gZWFjaCBwYXJ0aWN1bGFyIGVudmlyb25tZW50LgorICogPC9wPgorICogSmVyc2V5IHJ1bnRpbWUgZXhwZWN0cyB0aGF0IGEgY29uY3JldGUgc2NoZWR1bGVkIGV4ZWN1dG9yIHNlcnZpY2UgcHJvdmlkZXIgaW1wbGVtZW50YXRpb24gY2xhc3MgaXMgYW5ub3RhdGVkIHdpdGggYQorICoge0BsaW5rIGphdmF4LmluamVjdC5RdWFsaWZpZXIgcXVhbGlmaWVyfSBhbm5vdGF0aW9uLiBUaGlzIHF1YWxpZmllciBpcyB0aGVuIHVzZWQgdG8gY3JlYXRlQW5kSW5pdGlhbGl6ZSBhIHF1YWxpZmllZCBpbmplY3Rpb24gcG9pbnQKKyAqIGZvciBpbmplY3RpbmcgdGhlIHNjaGVkdWxlZCBleGVjdXRvciBzZXJ2aWNlIGluc3RhbmNlIHByb3ZpZGVkIGJ5IHRoZSBhbm5vdGF0ZWQgcHJvdmlkZXIuIHtAbGluayBqYXZheC5pbmplY3QuTmFtZWQgTmFtZWR9CisgKiBwcm92aWRlcnMgYXJlIGFsc28gc3VwcG9ydGVkLiBGb3IgZXhhbXBsZToKKyAqIDwvcD4KKyAqIDxwcmU+CisgKiAmIzY0O05hbWVkKCJteS1zY2hlZHVsZXIiKQorICogcHVibGljIE15U2NoZWR1bGVyUHJvdmlkZXIgaW1wbGVtZW50cyBTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2VQcm92aWRlciB7CisgKiAgICAgLi4uCisgKiB9CisgKgorICogLi4uCisgKgorICogLy8gSW5qZWN0aW5nIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSBwcm92aWRlZCBieSB0aGUgTXlTY2hlZHVsZXJQcm92aWRlcgorICogJiM2NDtJbmplY3QgJiM2NDtOYW1lZCgibXktc2NoZWR1bGVyIikgU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlIG15U2NoZWR1bGVyOworICogPC9wcmU+CisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqIEBzZWUgRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXIKKyAqIEBzZWUgU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yUHJvdmlkZXIKKyAqIEBzaW5jZSAyLjE4CisgKi8KK0BDb250cmFjdAorcHVibGljIGludGVyZmFjZSBTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2VQcm92aWRlciBleHRlbmRzIEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyIHsKKworICAgIC8qKgorICAgICAqIEdldCBhIHNjaGVkdWxlZCBleGVjdXRvciBzZXJ2aWNlIHRvIGJlIHVzZWQgYnkgSmVyc2V5IGNsaWVudCBvciBzZXJ2ZXIgcnVudGltZSB0byBzY2hlZHVsZSBleGVjdXRpb24gb2YKKyAgICAgKiBzcGVjaWZpYyB0YXNrcy4KKyAgICAgKiA8cD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyA8ZW0+dXN1YWxseTwvZW0+IGludm9rZWQganVzdCBvbmNlIGF0IGVpdGhlciBKZXJzZXkgY2xpZW50IG9yIHNlcnZlciBhcHBsaWNhdGlvbiBydW50aW1lIGluaXRpYWxpemF0aW9uLAorICAgICAqIGl0IDxlbT5tYXk8L2VtPiBob3dldmVyIGJlIGludm9rZWQgbXVsdGlwbGUgdGltZXMuIE9uY2UgdGhlIGluc3RhbmNlIG9mIHRoZSBwcm92aWRlZCBzY2hlZHVsZWQgZXhlY3V0b3Igc2VydmljZSBpcyBub3QKKyAgICAgKiBuZWVkZWQgYW55bW9yZSBieSBKZXJzZXkgYXBwbGljYXRpb24gcnVudGltZSwgaXQgd2lsbCBiZSB7QGxpbmsgI2Rpc3Bvc2UgZGlzcG9zZWR9LgorICAgICAqIFRoaXMgdHlwaWNhbGx5IGhhcHBlbnMgaW4gb25lIG9mIHRoZSBmb2xsb3dpbmcgc2l0dWF0aW9uczoKKyAgICAgKiA8L3A+CisgICAgICogPHVsPgorICAgICAqIDxsaT5KZXJzZXkgY2xpZW50IGluc3RhbmNlIGlzIGNsb3NlZCAoY2xpZW50IHJ1bnRpbWUgaXMgc2h1dCBkb3duKS48L2xpPgorICAgICAqIDxsaT5KZXJzZXkgY29udGFpbmVyIHJ1bm5pbmcgYSBzZXJ2ZXItc2lkZSBKZXJzZXkgYXBwbGljYXRpb24gaXMgc2h1dCBkb3duLjwvbGk+CisgICAgICogPGxpPkplcnNleSBzZXJ2ZXItc2lkZSBhcHBsaWNhdGlvbiBpcyB1bi1kZXBsb3llZC48L2xpPgorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgc2NoZWR1bGVkIGV4ZWN1dG9yIHNlcnZpY2UuIE11c3Qgbm90IHJldHVybiB7QGNvZGUgbnVsbH0uCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSBnZXRFeGVjdXRvclNlcnZpY2UoKTsKKworfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zcGkvU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yUHJvdmlkZXIuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc3BpL1NjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvclByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcxNDkxYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc3BpL1NjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvclByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGk7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuUmVqZWN0ZWRFeGVjdXRpb25IYW5kbGVyOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3I7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkRmFjdG9yeTsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJlRGVzdHJveTsKKworLyoqCisgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBKZXJzZXkge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5TY2hlZHVsZWRFeGVjdXRvclNlcnZpY2VQcm92aWRlcgorICogc2NoZWR1bGVkIGV4ZWN1dG9yIHNlcnZpY2UgcHJvdmlkZXIgU1BJfS4KKyAqIDxwPgorICogVGhpcyBwcm92aWRlciBjcmVhdGVzIGFuZCBwcm92aXNpb25zIGEgc2hhcmVkIHtAbGluayBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3J9IGluc3RhbmNlCisgKiB1c2luZyB0aGUgY3VzdG9taXphYmxlIHtAbGluayAjZ2V0Q29yZVBvb2xTaXplKCkgY29yZSB0aHJlYWRzfSwge0BsaW5rICNnZXRCYWNraW5nVGhyZWFkRmFjdG9yeSgpIGJhY2tpbmcgdGhyZWFkIGZhY3Rvcnl9CisgKiBhbmQge0BsaW5rICNnZXRSZWplY3RlZEV4ZWN1dGlvbkhhbmRsZXIoKSByZWplY3RlZCB0YXNrIGhhbmRsZXJ9IHZhbHVlcy4gU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhlIHJlc3BlY3RpdmUgbWV0aG9kcworICogdG8gY3VzdG9taXplIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBwcm92aXNpb25lZCBzY2hlZHVsZXIuCisgKiA8L3A+CisgKiA8cD4KKyAqIFdoZW4gSmVyc2V5IHJ1bnRpbWUgbm8gbG9uZ2VyIHJlcXVpcmVzIHRoZSB1c2Ugb2YgYSBwcm92aWRlZCBleGVjdXRvciBzZXJ2aWNlIGluc3RhbmNlLCBpdCBpbnZva2VzIHRoZSBwcm92aWRlcidzCisgKiB7QGxpbmsgI2Rpc3Bvc2V9IG1ldGhvZCB0byBzaWduYWwgdGhlIHByb3ZpZGVyIHRoYXQgdGhlIGV4ZWN1dG9yIHNlcnZpY2UgaW5zdGFuY2UgY2FuIGJlIGRpc3Bvc2VkIG9mLiBJbiB0aGlzIG1ldGhvZCwKKyAqIHByb3ZpZGVyIGlzIGZyZWUgdG8gaW1wbGVtZW50IHRoZSBwcm9wZXIgc2h1dC1kb3duIGxvZ2ljIGZvciB0aGUgZGlzcG9zZWQgZXhlY3V0b3Igc2VydmljZSBpbnN0YW5jZSBhbmQgcGVyZm9ybSBvdGhlcgorICogbmVjZXNzYXJ5IGNsZWFudXAuIFlldCwgc29tZSBwcm92aWRlcnMgbWF5IHdpc2ggdG8gaW1wbGVtZW50IGEgc2hhcmVkIGV4ZWN1dG9yIHNlcnZpY2Ugc3RyYXRlZ3kuIEluIHN1Y2ggY2FzZSwKKyAqIGl0IG1heSBub3QgYmUgZGVzaXJhYmxlIHRvIHNodXQgZG93biB0aGUgcmVsZWFzZWQgZXhlY3V0b3Igc2VydmljZSBpbiB0aGUge0BsaW5rICNkaXNwb3NlfSBtZXRob2QuIEluc3RlYWQsIHRvIHBlcmZvcm0gdGhlCisgKiBldmVudHVhbCBzaHV0LWRvd24gcHJvY2VkdXJlLCB0aGUgcHJvdmlkZXIgbWF5IGVpdGhlciByZWx5IG9uIGFuIGV4cGxpY2l0IGludm9jYXRpb24gb2YgaXQncyBzcGVjaWZpYyBjbGVhbi11cCBtZXRob2QuCisgKiBTaW5jZSBhbGwgSmVyc2V5IHByb3ZpZGVycyBvcGVyYXRlIGluIGEgPGVtPmNvbnRhaW5lcjwvZW0+IGVudmlyb25tZW50LCBhIGdvb2QgY2xlYW4tdXAgc3RyYXRlZ3kgZm9yIGEgc2hhcmVkIGV4ZWN1dG9yCisgKiBzZXJ2aWNlIHByb3ZpZGVyIGltcGxlbWVudGF0aW9uIGlzIHRvIGV4cG9zZSBhIHtAbGluayBqYXZheC5hbm5vdGF0aW9uLlByZURlc3Ryb3kgJiM2NDtQcmVEZXN0cm95fS1hbm5vdGF0ZWQgbWV0aG9kCisgKiB0aGF0IHdpbGwgYmUgaW52b2tlZCBmb3IgYWxsIGluc3RhbmNlcyBtYW5hZ2VkIGJ5IHRoZSBjb250YWluZXIsIGJlZm9yZSB0aGUgY29udGFpbmVyIHNodXRzIGRvd24uCisgKiA8L3A+CisgKiA8cD4KKyAqIElNUE9SVEFOVDogUGxlYXNlIG5vdGUgdGhhdCBhbnkgcHJlLWRlc3Ryb3kgbWV0aG9kcyBtYXkgbm90IGJlIGludm9rZWQgZm9yIGluc3RhbmNlcyBjcmVhdGVkIG91dHNpZGUgb2YgdGhlIGNvbnRhaW5lcgorICogYW5kIGxhdGVyIHJlZ2lzdGVyZWQgd2l0aGluIHRoZSBjb250YWluZXIuIFByZS1kZXN0cm95IG1ldGhvZHMgYXJlIG9ubHkgZ3VhcmFudGVlZCB0byBiZSBpbnZva2VkIGZvciB0aG9zZSBpbnN0YW5jZXMKKyAqIHRoYXQgYXJlIGNyZWF0ZWQgYW5kIG1hbmFnZWQgYnkgdGhlIGNvbnRhaW5lci4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICogQHNpbmNlIDIuMTgKKyAqLworcHVibGljIGNsYXNzIFNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvclByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RUaHJlYWRQb29sUHJvdmlkZXI8U2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yPgorICAgICAgICBpbXBsZW1lbnRzIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyIHsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc2NoZWR1bGVkIHRocmVhZCBwb29sIGV4ZWN1dG9yIHByb3ZpZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgcHJvdmlkZXIgbmFtZS4gVGhlIG5hbWUgd2lsbCBiZSB1c2VkIHRvIG5hbWUgdGhlIHRocmVhZHMgY3JlYXRlZCAmIHVzZWQgYnkgdGhlCisgICAgICogICAgICAgICAgICAgcHJvdmlzaW9uZWQgc2NoZWR1bGVkIHRocmVhZCBwb29sIGV4ZWN1dG9yLgorICAgICAqLworICAgIHB1YmxpYyBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3JQcm92aWRlcihmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlIGdldEV4ZWN1dG9yU2VydmljZSgpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmdldEV4ZWN1dG9yKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvciBjcmVhdGVFeGVjdXRvcigKKyAgICAgICAgICAgIGZpbmFsIGludCBjb3JlUG9vbFNpemUsIGZpbmFsIFRocmVhZEZhY3RvcnkgdGhyZWFkRmFjdG9yeSwgZmluYWwgUmVqZWN0ZWRFeGVjdXRpb25IYW5kbGVyIGhhbmRsZXIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IoY29yZVBvb2xTaXplLCB0aHJlYWRGYWN0b3J5LCBoYW5kbGVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKGZpbmFsIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvclNlcnZpY2UpIHsKKyAgICAgICAgLy8gTk8tT1AuCisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udGFpbmVyIHByZS1kZXN0cm95IGhhbmRsZXIgbWV0aG9kLgorICAgICAqIDxwPgorICAgICAqIEludm9raW5nIHRoZSBtZXRob2Qge0BsaW5rICNjbG9zZSgpIGNsb3Nlc30gdGhpcyBwcm92aWRlci4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgQFByZURlc3Ryb3kKKyAgICBwdWJsaWMgdm9pZCBwcmVEZXN0cm95KCkgeworICAgICAgICBjbG9zZSgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zcGkvVGhyZWFkUG9vbEV4ZWN1dG9yUHJvdmlkZXIuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc3BpL1RocmVhZFBvb2xFeGVjdXRvclByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJhYTM4MwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc3BpL1RocmVhZFBvb2xFeGVjdXRvclByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwyMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQmxvY2tpbmdRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuTGlua2VkQmxvY2tpbmdRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5SZWplY3RlZEV4ZWN1dGlvbkhhbmRsZXI7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU3luY2hyb25vdXNRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRGYWN0b3J5OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZFBvb2xFeGVjdXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJlRGVzdHJveTsKKworLyoqCisgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBKZXJzZXkge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5FeGVjdXRvclNlcnZpY2VQcm92aWRlciBleGVjdXRvciBzZXJ2aWNlIHByb3ZpZGVyIFNQSX0uCisgKiA8cD4KKyAqIFRoaXMgcHJvdmlkZXIgY3JlYXRlcyBhbmQgcHJvdmlzaW9ucyBhIHNoYXJlZCB7QGxpbmsgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkUG9vbEV4ZWN1dG9yfSBpbnN0YW5jZQorICogdXNpbmcgdGhlIGN1c3RvbWl6YWJsZSB2YWx1ZXMgZm9yIDoKKyAqIDx1bD4KKyAqIDxsaT57QGxpbmsgI2dldENvcmVQb29sU2l6ZSgpIG51bWJlciBvZiBjb3JlIHBvb2wgdGhyZWFkc308L2xpPgorICogPGxpPntAbGluayAjZ2V0TWF4aW11bVBvb2xTaXplKCkgbWF4aW11bSBudW1iZXIgb2YgdGhyZWFkcyBpbiB0aGUgcG9vbH08L2xpPgorICogPGxpPntAbGluayAjZ2V0S2VlcEFsaXZlVGltZSgpIHRocmVhZCBrZWVwLWFsaXZlIHRpbWUgKGluIHNlY29uZHMpfTwvbGk+CisgKiA8bGk+e0BsaW5rICNnZXRXb3JrUXVldWUoKSBiYWNraW5nIHRocmVhZCBwb29sIHdvcmsgcXVldWV9PC9saT4KKyAqIDxsaT57QGxpbmsgI2dldEJhY2tpbmdUaHJlYWRGYWN0b3J5KCkgYmFja2luZyB0aHJlYWQgZmFjdG9yeX08L2xpPgorICogPGxpPntAbGluayAjZ2V0UmVqZWN0ZWRFeGVjdXRpb25IYW5kbGVyKCkgcmVqZWN0ZWQgdGFzayBoYW5kbGVyfTwvbGk+CisgKiA8L3VsPgorICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhlIHJlc3BlY3RpdmUgbWV0aG9kcyB0byBjdXN0b21pemUgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIHByb3Zpc2lvbmVkIHRocmVhZCBwb29sIGV4ZWN1dG9yLgorICogPC9wPgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKiBAc2luY2UgMi4xOAorICovCitwdWJsaWMgY2xhc3MgVGhyZWFkUG9vbEV4ZWN1dG9yUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFRocmVhZFBvb2xQcm92aWRlcjxUaHJlYWRQb29sRXhlY3V0b3I+CisgICAgICAgIGltcGxlbWVudHMgRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBDQUNIRURfUE9PTF9LRUVQX0FMSVZFX0RFRkFVTFRfVElNRU9VVCA9IDYwTDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdGhyZWFkIHBvb2wgZXhlY3V0b3IgcHJvdmlkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBwcm92aWRlciBuYW1lLiBUaGUgbmFtZSB3aWxsIGJlIHVzZWQgdG8gbmFtZSB0aGUgdGhyZWFkcyBjcmVhdGVkICYgdXNlZCBieSB0aGUKKyAgICAgKiAgICAgICAgICAgICBwcm92aXNpb25lZCB0aHJlYWQgcG9vbCBleGVjdXRvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGhyZWFkUG9vbEV4ZWN1dG9yUHJvdmlkZXIoZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEV4ZWN1dG9yU2VydmljZSBnZXRFeGVjdXRvclNlcnZpY2UoKSB7CisgICAgICAgIHJldHVybiBzdXBlci5nZXRFeGVjdXRvcigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBmaW5hbCBUaHJlYWRQb29sRXhlY3V0b3IgY3JlYXRlRXhlY3V0b3IoCisgICAgICAgICAgICBmaW5hbCBpbnQgY29yZVBvb2xTaXplLCBmaW5hbCBUaHJlYWRGYWN0b3J5IHRocmVhZEZhY3RvcnksIGZpbmFsIFJlamVjdGVkRXhlY3V0aW9uSGFuZGxlciBoYW5kbGVyKSB7CisgICAgICAgIHJldHVybiBjcmVhdGVFeGVjdXRvcigKKyAgICAgICAgICAgICAgICBjb3JlUG9vbFNpemUsCisgICAgICAgICAgICAgICAgZ2V0TWF4aW11bVBvb2xTaXplKCksCisgICAgICAgICAgICAgICAgZ2V0S2VlcEFsaXZlVGltZSgpLAorICAgICAgICAgICAgICAgIGdldFdvcmtRdWV1ZSgpLAorICAgICAgICAgICAgICAgIHRocmVhZEZhY3RvcnksCisgICAgICAgICAgICAgICAgaGFuZGxlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgVGhyZWFkUG9vbEV4ZWN1dG9yfSB3aXRoIHRoZSBnaXZlbiBpbml0aWFsIHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29yZVBvb2xTaXplICAgIHRoZSBudW1iZXIgb2YgdGhyZWFkcyB0byBrZWVwIGluIHRoZSB0aHJlYWQgcG9vbCwgZXZlbiBpZiB0aGV5IGFyZSBpZGxlLgorICAgICAqIEBwYXJhbSBtYXhpbXVtUG9vbFNpemUgdGhlIG1heGltdW0gbnVtYmVyIG9mIHRocmVhZHMgdG8gYWxsb3cgaW4gdGhlIHRocmVhZCBwb29sLgorICAgICAqIEBwYXJhbSBrZWVwQWxpdmVUaW1lICAgd2hlbiB0aGUgbnVtYmVyIG9mIHRocmVhZHMgaXMgZ3JlYXRlciB0aGFuIHRoZSBjb3JlLCB0aGlzIGlzIHRoZSBtYXhpbXVtIHRpbWUgKGluIHNlY29uZHMpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGV4Y2VzcyBpZGxlIHRocmVhZHMgd2lsbCB3YWl0IGZvciBuZXcgdGFza3MgYmVmb3JlIHRlcm1pbmF0aW5nLgorICAgICAqIEBwYXJhbSB3b3JrUXVldWUgICAgICAgdGhlIHF1ZXVlIHRvIHVzZSBmb3IgaG9sZGluZyB0YXNrcyBiZWZvcmUgdGhleSBhcmUgZXhlY3V0ZWQuICBUaGlzIHF1ZXVlIHdpbGwgaG9sZCBvbmx5IHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIFJ1bm5hYmxlfSB0YXNrcyBzdWJtaXR0ZWQgYnkgdGhlIHtAY29kZSBleGVjdXRlfSBtZXRob2QuCisgICAgICogQHBhcmFtIHRocmVhZEZhY3RvcnkgICB0aGUgZmFjdG9yeSB0byB1c2Ugd2hlbiB0aGUgZXhlY3V0b3IgY3JlYXRlcyBhIG5ldyB0aHJlYWQuCisgICAgICogQHBhcmFtIGhhbmRsZXIgICAgICAgICB0aGUgaGFuZGxlciB0byB1c2Ugd2hlbiBleGVjdXRpb24gaXMgYmxvY2tlZCBiZWNhdXNlIHRoZSB0aHJlYWQgYm91bmRzIGFuZCBxdWV1ZSBjYXBhY2l0aWVzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICBhcmUgcmVhY2hlZC4KKyAgICAgKiBAcmV0dXJuIG5ldyBjb25maWd1cmVkIHRocmVhZCBwb29sIGluc3RhbmNlLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIGhvbGRzOjxicj4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7QGNvZGUgY29yZVBvb2xTaXplIDwgMH08YnI+CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIGtlZXBBbGl2ZVRpbWUgPCAwfTxicj4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7QGNvZGUgbWF4aW11bVBvb2xTaXplIDw9IDB9PGJyPgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAY29kZSBtYXhpbXVtUG9vbFNpemUgPCBjb3JlUG9vbFNpemV9CisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiAgICAgaWYge0Bjb2RlIHdvcmtRdWV1ZX0gb3Ige0Bjb2RlIHRocmVhZEZhY3Rvcnl9IG9yIHtAY29kZSBoYW5kbGVyfSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICovCisgICAgcHJvdGVjdGVkIFRocmVhZFBvb2xFeGVjdXRvciBjcmVhdGVFeGVjdXRvcigKKyAgICAgICAgICAgIGZpbmFsIGludCBjb3JlUG9vbFNpemUsCisgICAgICAgICAgICBmaW5hbCBpbnQgbWF4aW11bVBvb2xTaXplLAorICAgICAgICAgICAgZmluYWwgbG9uZyBrZWVwQWxpdmVUaW1lLAorICAgICAgICAgICAgZmluYWwgQmxvY2tpbmdRdWV1ZTxSdW5uYWJsZT4gd29ya1F1ZXVlLAorICAgICAgICAgICAgZmluYWwgVGhyZWFkRmFjdG9yeSB0aHJlYWRGYWN0b3J5LAorICAgICAgICAgICAgZmluYWwgUmVqZWN0ZWRFeGVjdXRpb25IYW5kbGVyIGhhbmRsZXIpIHsKKworICAgICAgICByZXR1cm4gbmV3IFRocmVhZFBvb2xFeGVjdXRvcigKKyAgICAgICAgICAgICAgICBjb3JlUG9vbFNpemUsCisgICAgICAgICAgICAgICAgbWF4aW11bVBvb2xTaXplLAorICAgICAgICAgICAgICAgIGtlZXBBbGl2ZVRpbWUsCisgICAgICAgICAgICAgICAgVGltZVVuaXQuU0VDT05EUywKKyAgICAgICAgICAgICAgICB3b3JrUXVldWUsCisgICAgICAgICAgICAgICAgdGhyZWFkRmFjdG9yeSwKKyAgICAgICAgICAgICAgICBoYW5kbGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHRocmVhZHMgdG8gYWxsb3cgaW4gdGhlIHRocmVhZCBwb29sLgorICAgICAqIDxwPgorICAgICAqIFRoZSB2YWx1ZSBmcm9tIHRoaXMgbWV0aG9kIGlzIHBhc3NlZCBhcyBvbmUgb2YgdGhlIGlucHV0IHBhcmFtZXRlcnMgaW4gYSBjYWxsIHRvIHRoZQorICAgICAqIHtAbGluayAjY3JlYXRlRXhlY3V0b3IoaW50LCBpbnQsIGxvbmcsIGphdmEudXRpbC5jb25jdXJyZW50LkJsb2NraW5nUXVldWUsIGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZEZhY3RvcnksCisgICAgICogamF2YS51dGlsLmNvbmN1cnJlbnQuUmVqZWN0ZWRFeGVjdXRpb25IYW5kbGVyKX0gbWV0aG9kLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIHRvIGN1c3RvbWl6ZSB0aGUgbWF4aW11bSBudW1iZXIgb2YgdGhyZWFkcyBhbGxvd2VkIGluIHRoZSBwcm92aXNpb25lZCB0aHJlYWQgcG9vbCBleGVjdXRvci4KKyAgICAgKiBJZiBub3QgY3VzdG9taXplZCwgdGhlIG1ldGhvZCBkZWZhdWx0cyB0byB7QGxpbmsgamF2YS5sYW5nLkludGVnZXIjTUFYX1ZBTFVFfS4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIG1heGltdW0gbnVtYmVyIG9mIHRocmVhZHMgYWxsb3dlZCBpbiB0aGUgdGhyZWFkIHBvb2wuCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBnZXRNYXhpbXVtUG9vbFNpemUoKSB7CisgICAgICAgIHJldHVybiBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHRocmVhZCBrZWVwLWFsaXZlIHRpbWUgKGluIHNlY29uZHMpLgorICAgICAqIDxwPgorICAgICAqIFdoZW4gdGhlIG51bWJlciBvZiB0aHJlYWRzIGluIHRoZSBwcm92aXNpb25lZCB0aHJlYWQgcG9vbCBpcyBncmVhdGVyIHRoYW4gdGhlIGNvcmUsIHRoaXMgaXMgdGhlIG1heGltdW0gdGltZSAoaW4gc2Vjb25kcykKKyAgICAgKiB0aGF0IGV4Y2VzcyBpZGxlIHRocmVhZHMgd2lsbCB3YWl0IGZvciBuZXcgdGFza3MgYmVmb3JlIHRlcm1pbmF0aW5nLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgdmFsdWUgZnJvbSB0aGlzIG1ldGhvZCBpcyBwYXNzZWQgYXMgb25lIG9mIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGluIGEgY2FsbCB0byB0aGUKKyAgICAgKiB7QGxpbmsgI2NyZWF0ZUV4ZWN1dG9yKGludCwgaW50LCBsb25nLCBqYXZhLnV0aWwuY29uY3VycmVudC5CbG9ja2luZ1F1ZXVlLCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRGYWN0b3J5LAorICAgICAqIGphdmEudXRpbC5jb25jdXJyZW50LlJlamVjdGVkRXhlY3V0aW9uSGFuZGxlcil9IG1ldGhvZC4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiB0byBjdXN0b21pemUgdGhlIHRocmVhZCBrZWVwLWFsaXZlIHRpbWUgaW4gdGhlIHByb3Zpc2lvbmVkIHRocmVhZCBwb29sIGV4ZWN1dG9yLgorICAgICAqIElmIG5vdCBjdXN0b21pemVkLCB0aGUgbWV0aG9kIGRlZmF1bHRzIHRvOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0B2YWx1ZSAjQ0FDSEVEX1BPT0xfS0VFUF9BTElWRV9ERUZBVUxUX1RJTUVPVVR9IGluIGNhc2UgdGhlIHtAbGluayAjZ2V0TWF4aW11bVBvb2xTaXplKCkgbWF4aW11bSBwb29sIHNpemV9CisgICAgICogaXMgZXF1YWwgdG8ge0BsaW5rIGphdmEubGFuZy5JbnRlZ2VyI01BWF9WQUxVRX08L2xpPgorICAgICAqIDxsaT57QGNvZGUgMEx9IGluIGNhc2UgdGhlIG1heGltdW0gcG9vbCBzaXplIGlzIGxvd2VyIHRoYW4KKyAgICAgKiB7QGNvZGUgamF2YS5sYW5nLkludGVnZXIjTUFYX1ZBTFVFfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBjb21wdXRhdGlvbiBjbG9zZWx5IGNvcnJlc3BvbmRzIHRvIHRoZSB0aHJlYWQgcG9vbCBleGVjdXRvciBjb25maWd1cmF0aW9ucyB1c2VkIGluCisgICAgICoge0BsaW5rIGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9ycyNuZXdDYWNoZWRUaHJlYWRQb29sKCl9IGFuZAorICAgICAqIHtAbGluayBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnMjbmV3Rml4ZWRUaHJlYWRQb29sKGludCl9IG1ldGhvZHMuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHJldHVybiB0aHJlYWQga2VlcC1hbGl2ZSB0aW1lIChpbiBzZWNvbmRzKSBmb3IgdGhlIHByb3Zpc2lvbmVkIHRocmVhZCBwb29sIGV4ZWN1dG9yLgorICAgICAqLworICAgIHByb3RlY3RlZCBsb25nIGdldEtlZXBBbGl2ZVRpbWUoKSB7CisgICAgICAgIHJldHVybiBDQUNIRURfUE9PTF9LRUVQX0FMSVZFX0RFRkFVTFRfVElNRU9VVDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHdvcmsgcXVldWUgZm9yIHRoZSBwcm92aXNpb25lZCB0aHJlYWQgcG9vbCBleGVjdXRvci4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgd29yayBxdWV1ZSBpcyB1c2VkIHRvIGhvbGQgdGhlIHRhc2tzIGJlZm9yZSB0aGV5IGFyZSBleGVjdXRlZCBieSB0aGUgcHJvdmlzaW9uZWQgdGhyZWFkIHBvb2wgZXhlY3V0b3IuCisgICAgICogVGhlIHF1ZXVlIHdpbGwgaG9sZCBvbmx5IHRoZSB7QGxpbmsgUnVubmFibGV9IHRhc2tzIHN1Ym1pdHRlZCBieSB0aGUge0BsaW5rIFRocmVhZFBvb2xFeGVjdXRvciNleGVjdXRlfSBtZXRob2QuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSB2YWx1ZSBmcm9tIHRoaXMgbWV0aG9kIGlzIHBhc3NlZCBhcyBvbmUgb2YgdGhlIGlucHV0IHBhcmFtZXRlcnMgaW4gYSBjYWxsIHRvIHRoZQorICAgICAqIHtAbGluayAjY3JlYXRlRXhlY3V0b3IoaW50LCBpbnQsIGxvbmcsIGphdmEudXRpbC5jb25jdXJyZW50LkJsb2NraW5nUXVldWUsIGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZEZhY3RvcnksCisgICAgICogamF2YS51dGlsLmNvbmN1cnJlbnQuUmVqZWN0ZWRFeGVjdXRpb25IYW5kbGVyKX0gbWV0aG9kLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIHRvIGN1c3RvbWl6ZSB0aGUgd29yayBxdWV1ZSB1c2VkIGJ5IHRoZSBwcm92aXNpb25lZCB0aHJlYWQgcG9vbCBleGVjdXRvci4KKyAgICAgKiBJZiBub3QgY3VzdG9taXplZCwgdGhlIG1ldGhvZCBkZWZhdWx0cyB0bzoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAbGluayBqYXZhLnV0aWwuY29uY3VycmVudC5TeW5jaHJvbm91c1F1ZXVlfSBpbiBjYXNlIHRoZSB7QGxpbmsgI2dldE1heGltdW1Qb29sU2l6ZSgpIG1heGltdW0gcG9vbCBzaXplfQorICAgICAqIGlzIGVxdWFsIHRvIHtAbGluayBqYXZhLmxhbmcuSW50ZWdlciNNQVhfVkFMVUV9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIGphdmEudXRpbC5jb25jdXJyZW50LkxpbmtlZEJsb2NraW5nUXVldWV9IGluIGNhc2UgdGhlIG1heGltdW0gcG9vbCBzaXplIGlzIGxvd2VyIHRoYW4KKyAgICAgKiB7QGNvZGUgamF2YS5sYW5nLkludGVnZXIjTUFYX1ZBTFVFfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBjb21wdXRhdGlvbiBjbG9zZWx5IGNvcnJlc3BvbmRzIHRvIHRoZSB0aHJlYWQgcG9vbCBleGVjdXRvciBjb25maWd1cmF0aW9ucyB1c2VkIGluCisgICAgICoge0BsaW5rIGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9ycyNuZXdDYWNoZWRUaHJlYWRQb29sKCl9IGFuZAorICAgICAqIHtAbGluayBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnMjbmV3Rml4ZWRUaHJlYWRQb29sKGludCl9IG1ldGhvZHMuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHJldHVybiB3b3JrIHF1ZXVlIGZvciB0aGUgcHJvdmlzaW9uZWQgdGhyZWFkIHBvb2wgZXhlY3V0b3IuCisgICAgICovCisgICAgcHJvdGVjdGVkIEJsb2NraW5nUXVldWU8UnVubmFibGU+IGdldFdvcmtRdWV1ZSgpIHsKKyAgICAgICAgcmV0dXJuIChnZXRNYXhpbXVtUG9vbFNpemUoKSA9PSBJbnRlZ2VyLk1BWF9WQUxVRSkKKyAgICAgICAgICAgICAgICA/IG5ldyBTeW5jaHJvbm91c1F1ZXVlPFJ1bm5hYmxlPigpIDogbmV3IExpbmtlZEJsb2NraW5nUXVldWU8UnVubmFibGU+KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZGlzcG9zZShmaW5hbCBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlKSB7CisgICAgICAgIC8vIE5PLU9QLgorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnRhaW5lciBwcmUtZGVzdHJveSBoYW5kbGVyIG1ldGhvZC4KKyAgICAgKiA8cD4KKyAgICAgKiBJbnZva2luZyB0aGUgbWV0aG9kIHtAbGluayAjY2xvc2UoKSBjbG9zZXN9IHRoaXMgcHJvdmlkZXIuCisgICAgICogPC9wPgorICAgICAqLworICAgIEBQcmVEZXN0cm95CisgICAgcHVibGljIHZvaWQgcHJlRGVzdHJveSgpIHsKKyAgICAgICAgY2xvc2UoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NwaS9wYWNrYWdlLWluZm8uamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc3BpL3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NmJhOGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NwaS9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvKioKKyAqIENvbW1vbiBKZXJzZXkgc2VydmljZSBwcm92aWRlciBjb250cmFjdCAoU1BJKSBjbGFzc2VzLgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaTsKZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdXJpL1BhdGhQYXR0ZXJuLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3VyaS9QYXRoUGF0dGVybi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNjMyMmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3VyaS9QYXRoUGF0dGVybi5qYXZhCkBAIC0wLDAgKzEsMTg1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnVyaTsKKworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworCisvKioKKyAqIEEgcGF0aCBwYXR0ZXJuIHRoYXQgaXMgYSByZWd1bGFyIGV4cHJlc3Npb24gZ2VuZXJhdGVkIGZyb20gYSBVUkkgcGF0aAorICogdGVtcGxhdGUuCisgKiA8cD4KKyAqIFRoZSBwYXRoIHBhdHRlcm4gaXMgbm9ybWFsaXplZCBieSByZW1vdmluZyBhIHRlcm1pbmF0aW5nICIvIiBpZiBwcmVzZW50LgorICogPHA+CisgKiBUaGUgcGF0aCBwYXR0ZXJuIGlzIHBvc3QtZml4ZWQgd2l0aCBhIHJpZ2h0IGhhbmQgcGF0dGVybiB0aGF0IGNvbnNpc3RzIG9mIGVpdGhlcgorICogYSBtYXRjaGluZyBncm91cCB0aGF0IG1hdGNoZXMgemVybyBvciBtb3JlIHBhdGggc2VnbWVudHMsCisgKiBzZWUge0BsaW5rIFJpZ2h0SGFuZFBhdGgjY2FwdHVyaW5nWmVyb09yTW9yZVNlZ21lbnRzfSwgb3IgemVybyBwYXRoCisgKiBzZWdtZW50cywgc2VlIHtAbGluayBSaWdodEhhbmRQYXRoI2NhcHR1cmluZ1plcm9TZWdtZW50c30uCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitwdWJsaWMgZmluYWwgY2xhc3MgUGF0aFBhdHRlcm4gZXh0ZW5kcyBQYXR0ZXJuV2l0aEdyb3VwcyB7CisKKyAgICAvKioKKyAgICAgKiBFbXB0eSBwYXRoIHBhdHRlcm4gbWF0Y2hpbmcgb25seSBlbXB0eSBzdHJpbmcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBQYXRoUGF0dGVybiBFTVBUWV9QQVRURVJOID0gbmV3IFBhdGhQYXR0ZXJuKCk7CisgICAgLyoqCisgICAgICogUGF0aCBwYXR0ZXJuIG1hdGNoaW5nIHRoZSBlbmQgb2YgYSBVUkkgcGF0aC4gQ2FuIGJlIGVpdGhlciBlbXB0eSB7QGNvZGUgIiJ9CisgICAgICogb3IgY29udGFpbiBhIHRyYWlsaW5nIHNsYXNoIHtAY29kZSAiLyJ9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGF0aFBhdHRlcm4gRU5EX09GX1BBVEhfUEFUVEVSTiA9IG5ldyBQYXRoUGF0dGVybigiIiwgUGF0aFBhdHRlcm4uUmlnaHRIYW5kUGF0aC5jYXB0dXJpbmdaZXJvU2VnbWVudHMpOworICAgIC8qKgorICAgICAqIFBhdGggcGF0dGVybiBtYXRjaGluZyB0aGUgYW55IFVSSSBwYXRoLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGF0aFBhdHRlcm4gT1BFTl9ST09UX1BBVEhfUEFUVEVSTiA9IG5ldyBQYXRoUGF0dGVybigiIiwgUmlnaHRIYW5kUGF0aC5jYXB0dXJpbmdaZXJvT3JNb3JlU2VnbWVudHMpOworICAgIC8qKgorICAgICAqIFBhdGggcGF0dGVybiBjb21wYXJhdG9yIHRoYXQgZGVmZXJzIHRvIHtAbGluayBVcmlUZW1wbGF0ZSNDT01QQVJBVE9SIGNvbXBhcmluZworICAgICAqIHRoZSB0ZW1wbGF0ZXN9IGFzc29jaWF0ZWQgd2l0aCB0aGUgcGF0dGVybnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPFBhdGhQYXR0ZXJuPiBDT01QQVJBVE9SID0gbmV3IENvbXBhcmF0b3I8UGF0aFBhdHRlcm4+KCkgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoUGF0aFBhdHRlcm4gbzEsIFBhdGhQYXR0ZXJuIG8yKSB7CisgICAgICAgICAgICByZXR1cm4gVXJpVGVtcGxhdGUuQ09NUEFSQVRPUi5jb21wYXJlKG8xLnRlbXBsYXRlLCBvMi50ZW1wbGF0ZSk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogVGhlIHNldCBvZiByaWdodCBoYW5kIHBhdGggcGF0dGVybnMgdGhhdCBtYXkgYmUgYXBwZW5kZWQgdG8gYSBwYXRoCisgICAgICogcGF0dGVybi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGVudW0gUmlnaHRIYW5kUGF0aCB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEEgY2FwdHVyaW5nIGdyb3VwIHRoYXQgbWF0Y2hlcyB6ZXJvIG9yIG1vcmUgcGF0aCBzZWdtZW50cyBhbmQKKyAgICAgICAgICoga2VlcHMgdGhlIG1hdGNoaW5nIHBhdGggdGVtcGxhdGUgb3Blbi4KKyAgICAgICAgICovCisgICAgICAgIGNhcHR1cmluZ1plcm9Pck1vcmVTZWdtZW50cygiKC8uKik/IiksCisgICAgICAgIC8qKgorICAgICAgICAgKiBBIGNhcHR1cmluZyBncm91cCB0aGF0IG1hdGNoZXMgemVybyBzZWdtZW50cyBhbmQgZWZmZWN0aXZlbHkKKyAgICAgICAgICogY2xvc2VzIHRoZSBtYXRjaGluZyBwYXRoIHRlbXBsYXRlLgorICAgICAgICAgKi8KKyAgICAgICAgY2FwdHVyaW5nWmVyb1NlZ21lbnRzKCIoLyk/Iik7CisgICAgICAgIC8vCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHJlZ2V4OworCisgICAgICAgIHByaXZhdGUgUmlnaHRIYW5kUGF0aChTdHJpbmcgcmVnZXgpIHsKKyAgICAgICAgICAgIHRoaXMucmVnZXggPSByZWdleDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGdldFJlZ2V4KCkgeworICAgICAgICAgICAgcmV0dXJuIHJlZ2V4OworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGEgbmV3IHBhdGggcGF0dGVybiB3aXRoIGEgc2FtZSBwYXRoIHRlbXBsYXRlIGJ1dAorICAgICAqIGEge0BsaW5rIFJpZ2h0SGFuZFBhdGgjY2FwdHVyaW5nWmVyb1NlZ21lbnRzIGNsb3NlZH0gcmlnaHQgaGFuZCBwYXRoLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdHRlcm4gYW4gKG9wZW4pIHBhdGggcGF0dGVybiB0byBjb252ZXJ0IHRvIGEgY2xvc2VkIHBhdHRlcm4uCisgICAgICogQHJldHVybiBjbG9zZWQgcGF0aCBwYXR0ZXJuIGZvciB0aGUgc2FtZSBwYXRoIHRlbXBsYXRlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUGF0aFBhdHRlcm4gYXNDbG9zZWQoUGF0aFBhdHRlcm4gcGF0dGVybikgeworICAgICAgICByZXR1cm4gbmV3IFBhdGhQYXR0ZXJuKHBhdHRlcm4uZ2V0VGVtcGxhdGUoKS5nZXRUZW1wbGF0ZSgpLCBSaWdodEhhbmRQYXRoLmNhcHR1cmluZ1plcm9TZWdtZW50cyk7CisgICAgfQorCisgICAgLy8KKyAgICBwcml2YXRlIGZpbmFsIFVyaVRlbXBsYXRlIHRlbXBsYXRlOworCisgICAgcHJpdmF0ZSBQYXRoUGF0dGVybigpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgdGhpcy50ZW1wbGF0ZSA9IFVyaVRlbXBsYXRlLkVNUFRZOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHBhdGggcGF0dGVybiBhbmQgcG9zdCBmaXggd2l0aAorICAgICAqIHtAbGluayBSaWdodEhhbmRQYXRoI2NhcHR1cmluZ1plcm9Pck1vcmVTZWdtZW50c30uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGVtcGxhdGUgdGhlIHBhdGggdGVtcGxhdGUuCisgICAgICogQHNlZSAjUGF0aFBhdHRlcm4oU3RyaW5nLCBQYXRoUGF0dGVybi5SaWdodEhhbmRQYXRoKQorICAgICAqLworICAgIHB1YmxpYyBQYXRoUGF0dGVybihTdHJpbmcgdGVtcGxhdGUpIHsKKyAgICAgICAgdGhpcyhuZXcgUGF0aFRlbXBsYXRlKHRlbXBsYXRlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgcGF0aCBwYXR0ZXJuIGFuZCBwb3N0IGZpeCB3aXRoCisgICAgICoge0BsaW5rIFJpZ2h0SGFuZFBhdGgjY2FwdHVyaW5nWmVyb09yTW9yZVNlZ21lbnRzfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZW1wbGF0ZSB0aGUgcGF0aCB0ZW1wbGF0ZQorICAgICAqIEBzZWUgI1BhdGhQYXR0ZXJuKFBhdGhUZW1wbGF0ZSwgUGF0aFBhdHRlcm4uUmlnaHRIYW5kUGF0aCkKKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aFBhdHRlcm4oUGF0aFRlbXBsYXRlIHRlbXBsYXRlKSB7CisgICAgICAgIHN1cGVyKHBvc3RmaXhXaXRoQ2FwdHVyaW5nR3JvdXAodGVtcGxhdGUuZ2V0UGF0dGVybigpLmdldFJlZ2V4KCkpLAorICAgICAgICAgICAgICAgIGFkZEluZGV4Rm9yUmlnaHRIYW5kUGF0aENhcHR1cmluZ0dyb3VwKHRlbXBsYXRlLmdldE51bWJlck9mUmVnZXhHcm91cHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLmdldFBhdHRlcm4oKS5nZXRHcm91cEluZGV4ZXMoKSkpOworCisgICAgICAgIHRoaXMudGVtcGxhdGUgPSB0ZW1wbGF0ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBwYXRoIHBhdHRlcm4gYW5kIHBvc3QgZml4IHdpdGggYSByaWdodCBoYW5kIHBhdGggcGF0dGVybi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZW1wbGF0ZSB0aGUgcGF0aCB0ZW1wbGF0ZS4KKyAgICAgKiBAcGFyYW0gcmhwcCAgICAgdGhlIHJpZ2h0IGhhbmQgcGF0aCBwYXR0ZXJuIHBvc3RmaXguCisgICAgICovCisgICAgcHVibGljIFBhdGhQYXR0ZXJuKFN0cmluZyB0ZW1wbGF0ZSwgUmlnaHRIYW5kUGF0aCByaHBwKSB7CisgICAgICAgIHRoaXMobmV3IFBhdGhUZW1wbGF0ZSh0ZW1wbGF0ZSksIHJocHApOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHBhdGggcGF0dGVybiBhbmQgcG9zdCBmaXggd2l0aCBhIHJpZ2h0IGhhbmQgcGF0aCBwYXR0ZXJuLgorICAgICAqCisgICAgICogQHBhcmFtIHRlbXBsYXRlIHRoZSBwYXRoIHRlbXBsYXRlLgorICAgICAqIEBwYXJhbSByaHBwICAgICB0aGUgcmlnaHQgaGFuZCBwYXRoIHBhdHRlcm4gcG9zdGZpeC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aFBhdHRlcm4oUGF0aFRlbXBsYXRlIHRlbXBsYXRlLCBSaWdodEhhbmRQYXRoIHJocHApIHsKKyAgICAgICAgc3VwZXIocG9zdGZpeFdpdGhDYXB0dXJpbmdHcm91cCh0ZW1wbGF0ZS5nZXRQYXR0ZXJuKCkuZ2V0UmVnZXgoKSwgcmhwcCksCisgICAgICAgICAgICAgICAgYWRkSW5kZXhGb3JSaWdodEhhbmRQYXRoQ2FwdHVyaW5nR3JvdXAodGVtcGxhdGUuZ2V0TnVtYmVyT2ZSZWdleEdyb3VwcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUuZ2V0UGF0dGVybigpLmdldEdyb3VwSW5kZXhlcygpKSk7CisKKyAgICAgICAgdGhpcy50ZW1wbGF0ZSA9IHRlbXBsYXRlOworICAgIH0KKworICAgIHB1YmxpYyBVcmlUZW1wbGF0ZSBnZXRUZW1wbGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHRlbXBsYXRlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBwb3N0Zml4V2l0aENhcHR1cmluZ0dyb3VwKFN0cmluZyByZWdleCkgeworICAgICAgICByZXR1cm4gcG9zdGZpeFdpdGhDYXB0dXJpbmdHcm91cChyZWdleCwgUmlnaHRIYW5kUGF0aC5jYXB0dXJpbmdaZXJvT3JNb3JlU2VnbWVudHMpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBwb3N0Zml4V2l0aENhcHR1cmluZ0dyb3VwKFN0cmluZyByZWdleCwgUmlnaHRIYW5kUGF0aCByaHBwKSB7CisgICAgICAgIGlmIChyZWdleC5lbmRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICByZWdleCA9IHJlZ2V4LnN1YnN0cmluZygwLCByZWdleC5sZW5ndGgoKSAtIDEpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlZ2V4ICsgcmhwcC5nZXRSZWdleCgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludFtdIGFkZEluZGV4Rm9yUmlnaHRIYW5kUGF0aENhcHR1cmluZ0dyb3VwKGludCBudW1iZXJPZkdyb3VwcywgaW50W10gaW5kZXhlcykgeworICAgICAgICBpZiAoaW5kZXhlcy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGluZGV4ZXM7CisgICAgICAgIH0KKworICAgICAgICBpbnRbXSBjZ0luZGV4ZXMgPSBuZXcgaW50W2luZGV4ZXMubGVuZ3RoICsgMV07CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoaW5kZXhlcywgMCwgY2dJbmRleGVzLCAwLCBpbmRleGVzLmxlbmd0aCk7CisKKyAgICAgICAgY2dJbmRleGVzW2luZGV4ZXMubGVuZ3RoXSA9IG51bWJlck9mR3JvdXBzICsgMTsKKyAgICAgICAgcmV0dXJuIGNnSW5kZXhlczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3VyaS9QYXRoVGVtcGxhdGUuamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdXJpL1BhdGhUZW1wbGF0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NTI2NDQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3VyaS9QYXRoVGVtcGxhdGUuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnVyaTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnVyaS5pbnRlcm5hbC5VcmlUZW1wbGF0ZVBhcnNlcjsKKworLyoqCisgKiBBIFVSSSB0ZW1wbGF0ZSBmb3IgYSBVUkkgcGF0aC4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIFllZ29yIEJ1Z2F5ZW5rbyAoeWVnb3IyNTYgYXQgamF2YS5uZXQpCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBQYXRoVGVtcGxhdGUgZXh0ZW5kcyBVcmlUZW1wbGF0ZSB7CisKKyAgICAvKioKKyAgICAgKiBJbnRlcm5hbCBwYXJzZXIgb2YgdGhpcyBQYXRoVGVtcGxhdGUuCisgICAgICogQHNlZSAjUGF0aFRlbXBsYXRlKFN0cmluZykKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBQYXRoVGVtcGxhdGVQYXJzZXIgZXh0ZW5kcyBVcmlUZW1wbGF0ZVBhcnNlciB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFB1YmxpYyBjb25zdHJ1Y3Rvci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHBhdGggdGhlIFVSSSBwYXRoIHRlbXBsYXRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgUGF0aFRlbXBsYXRlUGFyc2VyKGZpbmFsIFN0cmluZyBwYXRoKSB7CisgICAgICAgICAgICBzdXBlcihwYXRoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIGVuY29kZUxpdGVyYWxDaGFyYWN0ZXJzKGZpbmFsIFN0cmluZyBsaXRlcmFsQ2hhcmFjdGVycykgeworCisgICAgICAgICAgICByZXR1cm4gVXJpQ29tcG9uZW50LmNvbnRleHR1YWxFbmNvZGUoCisgICAgICAgICAgICAgICAgICAgIGxpdGVyYWxDaGFyYWN0ZXJzLAorICAgICAgICAgICAgICAgICAgICBVcmlDb21wb25lbnQuVHlwZS5QQVRIKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIFVSSSBwYXRoIHRlbXBsYXRlIGFuZCBlbmNvZGUgKHBlcmNlbnQgZXNjYXBlKSBhbnkgY2hhcmFjdGVycyBvZgorICAgICAqIHRoZSB0ZW1wbGF0ZSB0aGF0IGFyZSBub3QgdmFsaWQgVVJJIGNoYXJhY3RlcnMuIFBhdGhzIHRoYXQgZG9uJ3Qgc3RhcnQgd2l0aAorICAgICAqIGEgc2xhc2ggKHtAY29kZSAnLyd9KSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgcHJlZml4ZWQgd2l0aCBvbmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCB0aGUgVVJJIHBhdGggdGVtcGxhdGUuCisgICAgICovCisgICAgcHVibGljIFBhdGhUZW1wbGF0ZShmaW5hbCBTdHJpbmcgcGF0aCkgeworICAgICAgICBzdXBlcihuZXcgUGF0aFRlbXBsYXRlUGFyc2VyKFBhdGhUZW1wbGF0ZS5wcmVmaXhXaXRoU2xhc2gocGF0aCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0cyB0aGUgcGF0aCBwcm92aWRlZCB0byBhIHNsYXNoLWxlYWRpbmcgZm9ybSwgbm8gbWF0dGVyIHdoYXQgaXMgcHJvdmlkZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCB0aGUgVVJJIHBhdGggdGVtcGxhdGUuCisgICAgICogQHJldHVybiBzbGFzaC1wcmVmaXhlZCBwYXRoLgorICAgICAqIEBzZWUgI1BhdGhUZW1wbGF0ZShTdHJpbmcpCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHByZWZpeFdpdGhTbGFzaChmaW5hbCBTdHJpbmcgcGF0aCkgeworICAgICAgICByZXR1cm4gIXBhdGguaXNFbXB0eSgpICYmIHBhdGguY2hhckF0KDApID09ICcvJyA/IHBhdGggOiAiLyIgKyBwYXRoOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdXJpL1BhdHRlcm5XaXRoR3JvdXBzLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3VyaS9QYXR0ZXJuV2l0aEdyb3Vwcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMGM5ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3VyaS9QYXR0ZXJuV2l0aEdyb3Vwcy5qYXZhCkBAIC0wLDAgKzEsMzk4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnVyaTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoUmVzdWx0OworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuU3ludGF4RXhjZXB0aW9uOworCisvKioKKyAqIEEgcGF0dGVybiBmb3IgbWF0Y2hpbmcgYSBzdHJpbmcgYWdhaW5zdCBhIHJlZ3VsYXIgZXhwcmVzc2lvbgorICogYW5kIHJldHVybmluZyBjYXB0dXJpbmcgZ3JvdXAgdmFsdWVzIGZvciBhbnkgY2FwdHVyaW5nIGdyb3VwcyBwcmVzZW50IGluCisgKiB0aGUgZXhwcmVzc2lvbi4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIEdlcmFyZCBEYXZpc29uIChnZXJhcmQuZGF2aXNvbiBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgUGF0dGVybldpdGhHcm91cHMgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gRU1QVFlfSU5UX0FSUkFZID0gbmV3IGludFswXTsKKyAgICAvKioKKyAgICAgKiBUaGUgZW1wdHkgcGF0dGVybiB0aGF0IG1hdGNoZXMgdGhlIG51bGwgb3IgZW1wdHkgc3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybldpdGhHcm91cHMgRU1QVFkgPSBuZXcgUGF0dGVybldpdGhHcm91cHMoKTsKKyAgICAvKioKKyAgICAgKiBUaGUgcmVndWxhciBleHByZXNzaW9uIGZvciBtYXRjaGluZyBhbmQgb2J0YWluaW5nIGNhcHR1cmluZyBncm91cCB2YWx1ZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcmVnZXg7CisgICAgLyoqCisgICAgICogVGhlIGNvbXBpbGVkIHJlZ3VsYXIgZXhwcmVzc2lvbiBvZiB7QGxpbmsgI3JlZ2V4fS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIFBhdHRlcm4gcmVnZXhQYXR0ZXJuOworICAgIC8qKgorICAgICAqIFRoZSBhcnJheSBvZiBncm91cCBpbmRleGVzIHRvIGNhcHR1cmluZyBncm91cHMuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBpbnRbXSBncm91cEluZGV4ZXM7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYW4gZW1wdHkgcGF0dGVybi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUGF0dGVybldpdGhHcm91cHMoKSB7CisgICAgICAgIHRoaXMucmVnZXggPSAiIjsKKyAgICAgICAgdGhpcy5yZWdleFBhdHRlcm4gPSBudWxsOworICAgICAgICB0aGlzLmdyb3VwSW5kZXhlcyA9IEVNUFRZX0lOVF9BUlJBWTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgcGF0dGVybi4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWdleCB0aGUgcmVndWxhciBleHByZXNzaW9uLiBJZiB0aGUgZXhwcmVzc2lvbiBpcyB7QGNvZGUgbnVsbH0gb3IgYW4gZW1wdHkgc3RyaW5nIHRoZW4gdGhlIHBhdHRlcm4gd2lsbCBvbmx5IG1hdGNoCisgICAgICogICAgICAgICAgICAgIGEge0Bjb2RlIG51bGx9IG9yIGVtcHR5IHN0cmluZy4KKyAgICAgKiBAdGhyb3dzIGphdmEudXRpbC5yZWdleC5QYXR0ZXJuU3ludGF4RXhjZXB0aW9uIGlmIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gY291bGQgbm90IGJlIGNvbXBpbGVkLgorICAgICAqLworICAgIHB1YmxpYyBQYXR0ZXJuV2l0aEdyb3VwcyhmaW5hbCBTdHJpbmcgcmVnZXgpIHRocm93cyBQYXR0ZXJuU3ludGF4RXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcyhyZWdleCwgRU1QVFlfSU5UX0FSUkFZKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgcGF0dGVybi4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWdleCAgICAgICAgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbi4gSWYgdGhlIGV4cHJlc3Npb24gaXMge0Bjb2RlIG51bGx9IG9yIGFuIGVtcHR5IHN0cmluZyB0aGVuIHRoZSBwYXR0ZXJuIHdpbGwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIG9ubHkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIG1hdGNoCisgICAgICogICAgICAgICAgICAgICAgICAgICBhIHtAY29kZSBudWxsfSBvciBlbXB0eSBzdHJpbmcuCisgICAgICogQHBhcmFtIGdyb3VwSW5kZXhlcyB0aGUgYXJyYXkgb2YgZ3JvdXAgaW5kZXhlcyB0byBjYXB0dXJpbmcgZ3JvdXBzLgorICAgICAqIEB0aHJvd3MgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm5TeW50YXhFeGNlcHRpb24gaWYgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBjb3VsZCBub3QgYmUgY29tcGlsZWQuCisgICAgICovCisgICAgcHVibGljIFBhdHRlcm5XaXRoR3JvdXBzKGZpbmFsIFN0cmluZyByZWdleCwgZmluYWwgaW50W10gZ3JvdXBJbmRleGVzKSB0aHJvd3MgUGF0dGVyblN5bnRheEV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMoY29tcGlsZShyZWdleCksIGdyb3VwSW5kZXhlcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgUGF0dGVybiBjb21waWxlKGZpbmFsIFN0cmluZyByZWdleCkgdGhyb3dzIFBhdHRlcm5TeW50YXhFeGNlcHRpb24geworICAgICAgICByZXR1cm4gKHJlZ2V4ID09IG51bGwgfHwgcmVnZXguaXNFbXB0eSgpKSA/IG51bGwgOiBQYXR0ZXJuLmNvbXBpbGUocmVnZXgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBwYXR0ZXJuLgorICAgICAqCisgICAgICogQHBhcmFtIHJlZ2V4UGF0dGVybiB0aGUgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHJlZ2V4UGF0dGVybiBpcyB7QGNvZGUgbnVsbH0uCisgICAgICovCisgICAgcHVibGljIFBhdHRlcm5XaXRoR3JvdXBzKGZpbmFsIFBhdHRlcm4gcmVnZXhQYXR0ZXJuKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcyhyZWdleFBhdHRlcm4sIEVNUFRZX0lOVF9BUlJBWSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IHBhdHRlcm4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVnZXhQYXR0ZXJuIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybi4KKyAgICAgKiBAcGFyYW0gZ3JvdXBJbmRleGVzIHRoZSBhcnJheSBvZiBncm91cCBpbmRleGVzIHRvIGNhcHR1cmluZyBncm91cHMuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHJlZ2V4UGF0dGVybiBpcyB7QGNvZGUgbnVsbH0uCisgICAgICovCisgICAgcHVibGljIFBhdHRlcm5XaXRoR3JvdXBzKGZpbmFsIFBhdHRlcm4gcmVnZXhQYXR0ZXJuLCBmaW5hbCBpbnRbXSBncm91cEluZGV4ZXMpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgICAgICBpZiAocmVnZXhQYXR0ZXJuID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMucmVnZXggPSByZWdleFBhdHRlcm4udG9TdHJpbmcoKTsKKyAgICAgICAgdGhpcy5yZWdleFBhdHRlcm4gPSByZWdleFBhdHRlcm47CisgICAgICAgIHRoaXMuZ3JvdXBJbmRleGVzID0gZ3JvdXBJbmRleGVzLmNsb25lKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICovCisgICAgcHVibGljIGZpbmFsIFN0cmluZyBnZXRSZWdleCgpIHsKKyAgICAgICAgcmV0dXJuIHJlZ2V4OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZ3JvdXAgaW5kZXhlcyB0byBjYXB0dXJpbmcgZ3JvdXBzLgorICAgICAqIDxwPgorICAgICAqIEFueSBuZXN0ZWQgY2FwdHVyaW5nIGdyb3VwcyB3aWxsIGJlIGlnbm9yZWQgYW5kIHRoZQorICAgICAqIHRoZSBncm91cCBpbmRleCB3aWxsIHJlZmVyIHRvIHRoZSB0b3AtbGV2ZWwgY2FwdHVyaW5nCisgICAgICogZ3JvdXBzIGFzc29jaWF0ZWQgd2l0aCB0aGUgdGVtcGxhdGVzIHZhcmlhYmxlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGdyb3VwIGluZGV4ZXMgdG8gY2FwdHVyaW5nIGdyb3Vwcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50W10gZ2V0R3JvdXBJbmRleGVzKCkgeworICAgICAgICByZXR1cm4gZ3JvdXBJbmRleGVzLmNsb25lKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgRW1wdHlTdHJpbmdNYXRjaFJlc3VsdCBpbXBsZW1lbnRzIE1hdGNoUmVzdWx0IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBzdGFydCgpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgc3RhcnQoZmluYWwgaW50IGdyb3VwKSB7CisgICAgICAgICAgICBpZiAoZ3JvdXAgIT0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gc3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGVuZCgpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZW5kKGZpbmFsIGludCBncm91cCkgeworICAgICAgICAgICAgaWYgKGdyb3VwICE9IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGVuZCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ3JvdXAoKSB7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBncm91cChmaW5hbCBpbnQgZ3JvdXApIHsKKyAgICAgICAgICAgIGlmIChncm91cCAhPSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBncm91cCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZ3JvdXBDb3VudCgpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRW1wdHlTdHJpbmdNYXRjaFJlc3VsdCBFTVBUWV9TVFJJTkdfTUFUQ0hfUkVTVUxUID0gbmV3IEVtcHR5U3RyaW5nTWF0Y2hSZXN1bHQoKTsKKworICAgIHByaXZhdGUgZmluYWwgY2xhc3MgR3JvdXBJbmRleE1hdGNoUmVzdWx0IGltcGxlbWVudHMgTWF0Y2hSZXN1bHQgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgTWF0Y2hSZXN1bHQgcmVzdWx0OworCisgICAgICAgIEdyb3VwSW5kZXhNYXRjaFJlc3VsdChmaW5hbCBNYXRjaFJlc3VsdCByKSB7CisgICAgICAgICAgICB0aGlzLnJlc3VsdCA9IHI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBzdGFydCgpIHsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQuc3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHN0YXJ0KGZpbmFsIGludCBncm91cCkgeworICAgICAgICAgICAgaWYgKGdyb3VwID4gZ3JvdXBDb3VudCgpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIChncm91cCA+IDApID8gcmVzdWx0LnN0YXJ0KGdyb3VwSW5kZXhlc1tncm91cCAtIDFdKSA6IHJlc3VsdC5zdGFydCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZW5kKCkgeworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5lbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGVuZChmaW5hbCBpbnQgZ3JvdXApIHsKKyAgICAgICAgICAgIGlmIChncm91cCA+IGdyb3VwQ291bnQoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiAoZ3JvdXAgPiAwKSA/IHJlc3VsdC5lbmQoZ3JvdXBJbmRleGVzW2dyb3VwIC0gMV0pIDogcmVzdWx0LmVuZCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ3JvdXAoKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0Lmdyb3VwKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBncm91cChmaW5hbCBpbnQgZ3JvdXApIHsKKyAgICAgICAgICAgIGlmIChncm91cCA+IGdyb3VwQ291bnQoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiAoZ3JvdXAgPiAwKSA/IHJlc3VsdC5ncm91cChncm91cEluZGV4ZXNbZ3JvdXAgLSAxXSkgOiByZXN1bHQuZ3JvdXAoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGdyb3VwQ291bnQoKSB7CisgICAgICAgICAgICByZXR1cm4gZ3JvdXBJbmRleGVzLmxlbmd0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE1hdGNoIGFnYWluc3QgdGhlIHBhdHRlcm4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3MgdGhlIGNoYXIgc2VxdWVuY2UgdG8gbWF0Y2ggYWdhaW5zdCB0aGUgdGVtcGxhdGUuCisgICAgICogQHJldHVybiB0aGUgbWF0Y2ggcmVzdWx0LCBvdGhlcndpc2UgbnVsbCBpZiBubyBtYXRjaCBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIE1hdGNoUmVzdWx0IG1hdGNoKGZpbmFsIENoYXJTZXF1ZW5jZSBjcykgeworICAgICAgICAvLyBDaGVjayBmb3IgbWF0Y2ggYWdhaW5zdCB0aGUgZW1wdHkgcGF0dGVybgorICAgICAgICBpZiAoY3MgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIChyZWdleFBhdHRlcm4gPT0gbnVsbCkgPyBFTVBUWV9TVFJJTkdfTUFUQ0hfUkVTVUxUIDogbnVsbDsKKyAgICAgICAgfSBlbHNlIGlmIChyZWdleFBhdHRlcm4gPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvLyBNYXRjaCByZWd1bGFyIGV4cHJlc3Npb24KKyAgICAgICAgTWF0Y2hlciBtID0gcmVnZXhQYXR0ZXJuLm1hdGNoZXIoY3MpOworICAgICAgICBpZiAoIW0ubWF0Y2hlcygpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjcy5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gRU1QVFlfU1RSSU5HX01BVENIX1JFU1VMVDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoZ3JvdXBJbmRleGVzLmxlbmd0aCA+IDApID8gbmV3IEdyb3VwSW5kZXhNYXRjaFJlc3VsdChtKSA6IG07CisgICAgfQorCisgICAgLyoqCisgICAgICogTWF0Y2ggYWdhaW5zdCB0aGUgcGF0dGVybi4KKyAgICAgKiA8cC8+CisgICAgICogSWYgYSBtYXRjaGVkIHRoZW4gdGhlIGNhcHR1cmluZyBncm91cCB2YWx1ZXMgKGlmIGFueSkgd2lsbCBiZSBhZGRlZCB0byBhIGxpc3QgcGFzc2VkIGluIGFzIHBhcmFtZXRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjcyAgICAgICAgICB0aGUgY2hhciBzZXF1ZW5jZSB0byBtYXRjaCBhZ2FpbnN0IHRoZSB0ZW1wbGF0ZS4KKyAgICAgKiBAcGFyYW0gZ3JvdXBWYWx1ZXMgdGhlIGxpc3QgdG8gYWRkIHRoZSB2YWx1ZXMgb2YgYSBwYXR0ZXJuJ3MgY2FwdHVyaW5nIGdyb3VwcyBpZiBtYXRjaGluZyBpcyBzdWNjZXNzZnVsLiBUaGUgdmFsdWVzIGFyZQorICAgICAqICAgICAgICAgICAgICAgICAgICBhZGRlZCBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGUgcGF0dGVybidzIGNhcHR1cmluZyBncm91cHMuIFRoZSBsaXN0IGlzIGNsZWFyZWQgYmVmb3JlIHZhbHVlcyBhcmUgYWRkZWQuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGNoYXIgc2VxdWVuY2UgbWF0Y2hlcyB0aGUgcGF0dGVybiwgb3RoZXJ3aXNlIHtAY29kZSBmYWxzZX0uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgZ3JvdXAgdmFsdWVzIGlzIHtAY29kZSBudWxsfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBtYXRjaChmaW5hbCBDaGFyU2VxdWVuY2UgY3MsIGZpbmFsIExpc3Q8U3RyaW5nPiBncm91cFZhbHVlcykgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChncm91cFZhbHVlcyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayBmb3IgbWF0Y2ggYWdhaW5zdCB0aGUgZW1wdHkgcGF0dGVybgorICAgICAgICBpZiAoY3MgPT0gbnVsbCB8fCBjcy5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gcmVnZXhQYXR0ZXJuID09IG51bGw7CisgICAgICAgIH0gZWxzZSBpZiAocmVnZXhQYXR0ZXJuID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE1hdGNoIHRoZSByZWd1bGFyIGV4cHJlc3Npb24KKyAgICAgICAgTWF0Y2hlciBtID0gcmVnZXhQYXR0ZXJuLm1hdGNoZXIoY3MpOworICAgICAgICBpZiAoIW0ubWF0Y2hlcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBncm91cFZhbHVlcy5jbGVhcigpOworICAgICAgICBpZiAoZ3JvdXBJbmRleGVzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ3JvdXBJbmRleGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZ3JvdXBWYWx1ZXMuYWRkKG0uZ3JvdXAoZ3JvdXBJbmRleGVzW2ldKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBtLmdyb3VwQ291bnQoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgZ3JvdXBWYWx1ZXMuYWRkKG0uZ3JvdXAoaSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETyBjaGVjayBmb3IgY29uc2lzdGVuY3kgb2YgZGlmZmVyZW50IGNhcHR1cmluZyBncm91cHMKKyAgICAgICAgLy8gdGhhdCBtdXN0IGhhdmUgdGhlIHNhbWUgdmFsdWUKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYXRjaCBhZ2FpbnN0IHRoZSBwYXR0ZXJuLgorICAgICAqIDxwLz4KKyAgICAgKiBJZiBhIG1hdGNoZWQgdGhlbiB0aGUgY2FwdHVyaW5nIGdyb3VwIHZhbHVlcyAoaWYgYW55KSB3aWxsIGJlIGFkZGVkIHRvIGEgbGlzdCBwYXNzZWQgaW4gYXMgcGFyYW1ldGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGNzICAgICAgICAgIHRoZSBjaGFyIHNlcXVlbmNlIHRvIG1hdGNoIGFnYWluc3QgdGhlIHRlbXBsYXRlLgorICAgICAqIEBwYXJhbSBncm91cE5hbWVzICB0aGUgbGlzdCBuYW1lcyBhc3NvY2lhdGVkIHdpdGggYSBwYXR0ZXJuJ3MgY2FwdHVyaW5nIGdyb3Vwcy4gVGhlIG5hbWVzIE1VU1QgYmUgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgIHBhdHRlcm4ncyBjYXB0dXJpbmcgZ3JvdXBzIGFuZCB0aGUgc2l6ZSBNVVNUIGJlIGVxdWFsIHRvIG9yIGxlc3MgdGhhbiB0aGUgbnVtYmVyIG9mIGNhcHR1cmluZyBncm91cHMuCisgICAgICogQHBhcmFtIGdyb3VwVmFsdWVzIHRoZSBtYXAgdG8gYWRkIHRoZSB2YWx1ZXMgb2YgYSBwYXR0ZXJuJ3MgY2FwdHVyaW5nIGdyb3VwcyBpZiBtYXRjaGluZyBpcyBzdWNjZXNzZnVsLiBBIHZhbHVlcyBpcyBwdXQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgaW50byB0aGUgbWFwIHVzaW5nIHRoZSBncm91cCBuYW1lIGFzc29jaWF0ZWQgd2l0aCB0aGUgY2FwdHVyaW5nIGdyb3VwLiBUaGUgbWFwIGlzIGNsZWFyZWQgYmVmb3JlIHZhbHVlcworICAgICAqICAgICAgICAgICAgICAgICAgICBhcmUgYWRkZWQuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG1hdGNoZXMgdGhlIHBhdHRlcm4sIG90aGVyd2lzZSB7QGNvZGUgZmFsc2V9LgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgZ3JvdXAgdmFsdWVzIGlzIHtAY29kZSBudWxsfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBtYXRjaChmaW5hbCBDaGFyU2VxdWVuY2UgY3MsIGZpbmFsIExpc3Q8U3RyaW5nPiBncm91cE5hbWVzLCBmaW5hbCBNYXA8U3RyaW5nLAorICAgICAgICAgICAgU3RyaW5nPiBncm91cFZhbHVlcykgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChncm91cFZhbHVlcyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayBmb3IgbWF0Y2ggYWdhaW5zdCB0aGUgZW1wdHkgcGF0dGVybgorICAgICAgICBpZiAoY3MgPT0gbnVsbCB8fCBjcy5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gcmVnZXhQYXR0ZXJuID09IG51bGw7CisgICAgICAgIH0gZWxzZSBpZiAocmVnZXhQYXR0ZXJuID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE1hdGNoIHRoZSByZWd1bGFyIGV4cHJlc3Npb24KKyAgICAgICAgTWF0Y2hlciBtID0gcmVnZXhQYXR0ZXJuLm1hdGNoZXIoY3MpOworICAgICAgICBpZiAoIW0ubWF0Y2hlcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBBc3NpZ24gdGhlIG1hdGNoZWQgZ3JvdXAgdmFsdWVzIHRvIGdyb3VwIG5hbWVzCisgICAgICAgIGdyb3VwVmFsdWVzLmNsZWFyKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBncm91cE5hbWVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IGdyb3VwTmFtZXMuZ2V0KGkpOworICAgICAgICAgICAgU3RyaW5nIGN1cnJlbnRWYWx1ZSA9IG0uZ3JvdXAoKGdyb3VwSW5kZXhlcy5sZW5ndGggPiAwKSA/IGdyb3VwSW5kZXhlc1tpXSA6IGkgKyAxKTsKKworICAgICAgICAgICAgLy8gR3JvdXAgbmFtZXMgY2FuIGhhdmUgdGhlIHNhbWUgbmFtZSBvY2N1cnJpbmcgbW9yZSB0aGFuIG9uY2UsCisgICAgICAgICAgICAvLyBjaGVjayB0aGF0IGdyb3VwcyB2YWx1ZXMgYXJlIHNhbWUuCisgICAgICAgICAgICBTdHJpbmcgcHJldmlvdXNWYWx1ZSA9IGdyb3VwVmFsdWVzLmdldChuYW1lKTsKKyAgICAgICAgICAgIGlmIChwcmV2aW91c1ZhbHVlICE9IG51bGwgJiYgIXByZXZpb3VzVmFsdWUuZXF1YWxzKGN1cnJlbnRWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGdyb3VwVmFsdWVzLnB1dChuYW1lLCBjdXJyZW50VmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZpbmFsIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIHJlZ2V4Lmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBQYXR0ZXJuV2l0aEdyb3VwcyB0aGF0ID0gKFBhdHRlcm5XaXRoR3JvdXBzKSBvYmo7CisgICAgICAgIGlmICh0aGlzLnJlZ2V4ICE9IHRoYXQucmVnZXggJiYgKHRoaXMucmVnZXggPT0gbnVsbCB8fCAhdGhpcy5yZWdleC5lcXVhbHModGhhdC5yZWdleCkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZpbmFsIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIHJlZ2V4OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdXJpL1VyaUNvbXBvbmVudC5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS91cmkvVXJpQ29tcG9uZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVlNWFmNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdXJpL1VyaUNvbXBvbmVudC5qYXZhCkBAIC0wLDAgKzEsOTE4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnVyaTsKKworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEubmlvLkNoYXJCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5QYXRoU2VnbWVudDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5NdWx0aXZhbHVlZFN0cmluZ01hcDsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIGZvciB2YWxpZGF0aW5nLCBlbmNvZGluZyBhbmQgZGVjb2RpbmcgY29tcG9uZW50cworICogb2YgYSBVUkkuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFVyaUNvbXBvbmVudCB7CisKKyAgICAvLyBUT0RPIHJld3JpdGUgdG8gdXNlIG1hc2tzIGFuZCBub3QgbG9va3VwIHRhYmxlcworCisgICAgLyoqCisgICAgICogVGhlIFVSSSBjb21wb25lbnQgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZW51bSBUeXBlIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogQUxQSEEgLyBESUdJVCAvICItIiAvICIuIiAvICJfIiAvICJ+IiBjaGFyYWN0ZXJzLgorICAgICAgICAgKi8KKyAgICAgICAgVU5SRVNFUlZFRCwKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBVUkkgc2NoZW1lIGNvbXBvbmVudCB0eXBlLgorICAgICAgICAgKi8KKyAgICAgICAgU0NIRU1FLAorICAgICAgICAvKioKKyAgICAgICAgICogVGhlIFVSSSBhdXRob3JpdHkgY29tcG9uZW50IHR5cGUuCisgICAgICAgICAqLworICAgICAgICBBVVRIT1JJVFksCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgVVJJIHVzZXIgaW5mbyBjb21wb25lbnQgdHlwZS4KKyAgICAgICAgICovCisgICAgICAgIFVTRVJfSU5GTywKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBVUkkgaG9zdCBjb21wb25lbnQgdHlwZS4KKyAgICAgICAgICovCisgICAgICAgIEhPU1QsCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgVVJJIHBvcnQgY29tcG9uZW50IHR5cGUuCisgICAgICAgICAqLworICAgICAgICBQT1JULAorICAgICAgICAvKioKKyAgICAgICAgICogVGhlIFVSSSBwYXRoIGNvbXBvbmVudCB0eXBlLgorICAgICAgICAgKi8KKyAgICAgICAgUEFUSCwKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBVUkkgcGF0aCBjb21wb25lbnQgdHlwZSB0aGF0IGlzIGEgcGF0aCBzZWdtZW50LgorICAgICAgICAgKi8KKyAgICAgICAgUEFUSF9TRUdNRU5ULAorICAgICAgICAvKioKKyAgICAgICAgICogVGhlIFVSSSBwYXRoIGNvbXBvbmVudCB0eXBlIHRoYXQgaXMgYSBtYXRyaXggcGFyYW1ldGVyLgorICAgICAgICAgKi8KKyAgICAgICAgTUFUUklYX1BBUkFNLAorICAgICAgICAvKioKKyAgICAgICAgICogVGhlIFVSSSBxdWVyeSBjb21wb25lbnQgdHlwZSwgZW5jb2RlZCB1c2luZyBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQgcnVsZXMuCisgICAgICAgICAqLworICAgICAgICBRVUVSWSwKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBVUkkgcXVlcnkgY29tcG9uZW50IHR5cGUgdGhhdCBpcyBhIHF1ZXJ5IHBhcmFtZXRlciwgZW5jb2RlZCB1c2luZworICAgICAgICAgKiBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQgcnVsZXMgKHNwYWNlIGNoYXJhY3RlciBpcyBlbmNvZGVkCisgICAgICAgICAqIGFzIHtAY29kZSArfSkuCisgICAgICAgICAqLworICAgICAgICBRVUVSWV9QQVJBTSwKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBVUkkgcXVlcnkgY29tcG9uZW50IHR5cGUgdGhhdCBpcyBhIHF1ZXJ5IHBhcmFtZXRlciwgZW5jb2RlZCB1c2luZworICAgICAgICAgKiBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQgKHNwYWNlIGNoYXJhY3RlciBpcyBlbmNvZGVkIGFzCisgICAgICAgICAqIHtAY29kZSAlMjB9KS4KKyAgICAgICAgICovCisgICAgICAgIFFVRVJZX1BBUkFNX1NQQUNFX0VOQ09ERUQsCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgVVJJIGZyYWdtZW50IGNvbXBvbmVudCB0eXBlLgorICAgICAgICAgKi8KKyAgICAgICAgRlJBR01FTlQsCisgICAgfQorCisgICAgcHJpdmF0ZSBVcmlDb21wb25lbnQoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmFsaWRhdGVzIHRoZSBsZWdhbCBjaGFyYWN0ZXJzIG9mIGEgcGVyY2VudC1lbmNvZGVkIHN0cmluZyB0aGF0CisgICAgICogcmVwcmVzZW50cyBhIFVSSSBjb21wb25lbnQgdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzIHRoZSBlbmNvZGVkIHN0cmluZy4KKyAgICAgKiBAcGFyYW0gdCB0aGUgVVJJIGNvbXBvbmVudCB0eXBlIGlkZW50aWZ5aW5nIHRoZSBsZWdhbCBjaGFyYWN0ZXJzLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBlbmNvZGVkIHN0cmluZyBjb250YWlucyBpbGxlZ2FsCisgICAgICogY2hhcmFjdGVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGUoZmluYWwgU3RyaW5nIHMsIGZpbmFsIFR5cGUgdCkgeworICAgICAgICB2YWxpZGF0ZShzLCB0LCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmFsaWRhdGVzIHRoZSBsZWdhbCBjaGFyYWN0ZXJzIG9mIGEgcGVyY2VudC1lbmNvZGVkIHN0cmluZyB0aGF0CisgICAgICogcmVwcmVzZW50cyBhIFVSSSBjb21wb25lbnQgdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzIHRoZSBlbmNvZGVkIHN0cmluZy4KKyAgICAgKiBAcGFyYW0gdCB0aGUgVVJJIGNvbXBvbmVudCB0eXBlIGlkZW50aWZ5aW5nIHRoZSBsZWdhbCBjaGFyYWN0ZXJzLgorICAgICAqIEBwYXJhbSB0ZW1wbGF0ZSB0cnVlIGlmIHRoZSBlbmNvZGVkIHN0cmluZyBjb250YWlucyBVUkkgdGVtcGxhdGUgdmFyaWFibGVzCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGVuY29kZWQgc3RyaW5nIGNvbnRhaW5zIGlsbGVnYWwKKyAgICAgKiBjaGFyYWN0ZXJzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB2YWxpZGF0ZShmaW5hbCBTdHJpbmcgcywgZmluYWwgVHlwZSB0LCBmaW5hbCBib29sZWFuIHRlbXBsYXRlKSB7CisgICAgICAgIGZpbmFsIGludCBpID0gX3ZhbGlkKHMsIHQsIHRlbXBsYXRlKTsKKyAgICAgICAgaWYgKGkgPiAtMSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5VUklfQ09NUE9ORU5UX0lOVkFMSURfQ0hBUkFDVEVSKHMsIHQsIHMuY2hhckF0KGkpLCBpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZXMgdGhlIGxlZ2FsIGNoYXJhY3RlcnMgb2YgYSBwZXJjZW50LWVuY29kZWQgc3RyaW5nIHRoYXQKKyAgICAgKiByZXByZXNlbnRzIGEgVVJJIGNvbXBvbmVudCB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIHMgdGhlIGVuY29kZWQgc3RyaW5nLgorICAgICAqIEBwYXJhbSB0IHRoZSBVUkkgY29tcG9uZW50IHR5cGUgaWRlbnRpZnlpbmcgdGhlIGxlZ2FsIGNoYXJhY3RlcnMuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBlbmNvZGVkIHN0cmluZyBpcyB2YWxpZCwgb3RoZXJ3aXNlIGZhbHNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZChmaW5hbCBTdHJpbmcgcywgZmluYWwgVHlwZSB0KSB7CisgICAgICAgIHJldHVybiB2YWxpZChzLCB0LCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmFsaWRhdGVzIHRoZSBsZWdhbCBjaGFyYWN0ZXJzIG9mIGEgcGVyY2VudC1lbmNvZGVkIHN0cmluZyB0aGF0CisgICAgICogcmVwcmVzZW50cyBhIFVSSSBjb21wb25lbnQgdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzIHRoZSBlbmNvZGVkIHN0cmluZy4KKyAgICAgKiBAcGFyYW0gdCB0aGUgVVJJIGNvbXBvbmVudCB0eXBlIGlkZW50aWZ5aW5nIHRoZSBsZWdhbCBjaGFyYWN0ZXJzLgorICAgICAqIEBwYXJhbSB0ZW1wbGF0ZSB0cnVlIGlmIHRoZSBlbmNvZGVkIHN0cmluZyBjb250YWlucyBVUkkgdGVtcGxhdGUgdmFyaWFibGVzCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBlbmNvZGVkIHN0cmluZyBpcyB2YWxpZCwgb3RoZXJ3aXNlIGZhbHNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2YWxpZChmaW5hbCBTdHJpbmcgcywgZmluYWwgVHlwZSB0LCBmaW5hbCBib29sZWFuIHRlbXBsYXRlKSB7CisgICAgICAgIHJldHVybiBfdmFsaWQocywgdCwgdGVtcGxhdGUpID09IC0xOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludCBfdmFsaWQoZmluYWwgU3RyaW5nIHMsIGZpbmFsIFR5cGUgdCwgZmluYWwgYm9vbGVhbiB0ZW1wbGF0ZSkgeworICAgICAgICBmaW5hbCBib29sZWFuW10gdGFibGUgPSBFTkNPRElOR19UQUJMRVNbdC5vcmRpbmFsKCldOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBjaGFyIGMgPSBzLmNoYXJBdChpKTsKKyAgICAgICAgICAgIGlmICgoYyA8IDB4ODAgJiYgYyAhPSAnJScgJiYgIXRhYmxlW2NdKSB8fCBjID49IDB4ODApIHsKKyAgICAgICAgICAgICAgICBpZiAoIXRlbXBsYXRlIHx8IChjICE9ICd7JyAmJiBjICE9ICd9JykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb250ZXh0dWFsbHkgZW5jb2RlcyB0aGUgY2hhcmFjdGVycyBvZiBzdHJpbmcgdGhhdCBhcmUgZWl0aGVyIG5vbi1BU0NJSQorICAgICAqIGNoYXJhY3RlcnMgb3IgYXJlIEFTQ0lJIGNoYXJhY3RlcnMgdGhhdCBtdXN0IGJlIHBlcmNlbnQtZW5jb2RlZCB1c2luZyB0aGUKKyAgICAgKiBVVEYtOCBlbmNvZGluZy4gUGVyY2VudC1lbmNvZGVkIGNoYXJhY3RlcnMgd2lsbCBiZSByZWNvZ25pemVkIGFuZCBub3QKKyAgICAgKiBkb3VibGUgZW5jb2RlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzIHRoZSBzdHJpbmcgdG8gYmUgZW5jb2RlZC4KKyAgICAgKiBAcGFyYW0gdCB0aGUgVVJJIGNvbXBvbmVudCB0eXBlIGlkZW50aWZ5aW5nIHRoZSBBU0NJSSBjaGFyYWN0ZXJzIHRoYXQKKyAgICAgKiBtdXN0IGJlIHBlcmNlbnQtZW5jb2RlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBlbmNvZGVkIHN0cmluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb250ZXh0dWFsRW5jb2RlKGZpbmFsIFN0cmluZyBzLCBmaW5hbCBUeXBlIHQpIHsKKyAgICAgICAgcmV0dXJuIF9lbmNvZGUocywgdCwgZmFsc2UsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnRleHR1YWxseSBlbmNvZGVzIHRoZSBjaGFyYWN0ZXJzIG9mIHN0cmluZyB0aGF0IGFyZSBlaXRoZXIgbm9uLUFTQ0lJCisgICAgICogY2hhcmFjdGVycyBvciBhcmUgQVNDSUkgY2hhcmFjdGVycyB0aGF0IG11c3QgYmUgcGVyY2VudC1lbmNvZGVkIHVzaW5nIHRoZQorICAgICAqIFVURi04IGVuY29kaW5nLiBQZXJjZW50LWVuY29kZWQgY2hhcmFjdGVycyB3aWxsIGJlIHJlY29nbml6ZWQgYW5kIG5vdAorICAgICAqIGRvdWJsZSBlbmNvZGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHMgdGhlIHN0cmluZyB0byBiZSBlbmNvZGVkLgorICAgICAqIEBwYXJhbSB0IHRoZSBVUkkgY29tcG9uZW50IHR5cGUgaWRlbnRpZnlpbmcgdGhlIEFTQ0lJIGNoYXJhY3RlcnMgdGhhdAorICAgICAqIG11c3QgYmUgcGVyY2VudC1lbmNvZGVkLgorICAgICAqIEBwYXJhbSB0ZW1wbGF0ZSB0cnVlIGlmIHRoZSBlbmNvZGVkIHN0cmluZyBjb250YWlucyBVUkkgdGVtcGxhdGUgdmFyaWFibGVzCisgICAgICogQHJldHVybiB0aGUgZW5jb2RlZCBzdHJpbmcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY29udGV4dHVhbEVuY29kZShmaW5hbCBTdHJpbmcgcywgZmluYWwgVHlwZSB0LCBmaW5hbCBib29sZWFuIHRlbXBsYXRlKSB7CisgICAgICAgIHJldHVybiBfZW5jb2RlKHMsIHQsIHRlbXBsYXRlLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmNvZGVzIHRoZSBjaGFyYWN0ZXJzIG9mIHN0cmluZyB0aGF0IGFyZSBlaXRoZXIgbm9uLUFTQ0lJIGNoYXJhY3RlcnMKKyAgICAgKiBvciBhcmUgQVNDSUkgY2hhcmFjdGVycyB0aGF0IG11c3QgYmUgcGVyY2VudC1lbmNvZGVkIHVzaW5nIHRoZQorICAgICAqIFVURi04IGVuY29kaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIHMgdGhlIHN0cmluZyB0byBiZSBlbmNvZGVkLgorICAgICAqIEBwYXJhbSB0IHRoZSBVUkkgY29tcG9uZW50IHR5cGUgaWRlbnRpZnlpbmcgdGhlIEFTQ0lJIGNoYXJhY3RlcnMgdGhhdAorICAgICAqIG11c3QgYmUgcGVyY2VudC1lbmNvZGVkLgorICAgICAqIEByZXR1cm4gdGhlIGVuY29kZWQgc3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY29kZShmaW5hbCBTdHJpbmcgcywgZmluYWwgVHlwZSB0KSB7CisgICAgICAgIHJldHVybiBfZW5jb2RlKHMsIHQsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5jb2RlcyB0aGUgY2hhcmFjdGVycyBvZiBzdHJpbmcgdGhhdCBhcmUgZWl0aGVyIG5vbi1BU0NJSSBjaGFyYWN0ZXJzCisgICAgICogb3IgYXJlIEFTQ0lJIGNoYXJhY3RlcnMgdGhhdCBtdXN0IGJlIHBlcmNlbnQtZW5jb2RlZCB1c2luZyB0aGUKKyAgICAgKiBVVEYtOCBlbmNvZGluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzIHRoZSBzdHJpbmcgdG8gYmUgZW5jb2RlZC4KKyAgICAgKiBAcGFyYW0gdCB0aGUgVVJJIGNvbXBvbmVudCB0eXBlIGlkZW50aWZ5aW5nIHRoZSBBU0NJSSBjaGFyYWN0ZXJzIHRoYXQKKyAgICAgKiBtdXN0IGJlIHBlcmNlbnQtZW5jb2RlZC4KKyAgICAgKiBAcGFyYW0gdGVtcGxhdGUgdHJ1ZSBpZiB0aGUgZW5jb2RlZCBzdHJpbmcgY29udGFpbnMgVVJJIHRlbXBsYXRlIHZhcmlhYmxlcworICAgICAqIEByZXR1cm4gdGhlIGVuY29kZWQgc3RyaW5nLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY29kZShmaW5hbCBTdHJpbmcgcywgZmluYWwgVHlwZSB0LCBmaW5hbCBib29sZWFuIHRlbXBsYXRlKSB7CisgICAgICAgIHJldHVybiBfZW5jb2RlKHMsIHQsIHRlbXBsYXRlLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5jb2RlcyBhIHN0cmluZyB3aXRoIHRlbXBsYXRlIHBhcmFtZXRlcnMgbmFtZXMgcHJlc2VudCwgc3BlY2lmaWNhbGx5IHRoZQorICAgICAqIGNoYXJhY3RlcnMgJ3snIGFuZCAnfScgd2lsbCBiZSBwZXJjZW50LWVuY29kZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcyB0aGUgc3RyaW5nIHdpdGggemVybyBvciBtb3JlIHRlbXBsYXRlIHBhcmFtZXRlcnMgbmFtZXMKKyAgICAgKiBAcmV0dXJuIHRoZSBzdHJpbmcgd2l0aCBlbmNvZGVkIHRlbXBsYXRlIHBhcmFtZXRlcnMgbmFtZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlVGVtcGxhdGVOYW1lcyhTdHJpbmcgcykgeworICAgICAgICBpbnQgaSA9IHMuaW5kZXhPZigneycpOworICAgICAgICBpZiAoaSAhPSAtMSkgeworICAgICAgICAgICAgcyA9IHMucmVwbGFjZSgieyIsICIlN0IiKTsKKyAgICAgICAgfQorICAgICAgICBpID0gcy5pbmRleE9mKCd9Jyk7CisgICAgICAgIGlmIChpICE9IC0xKSB7CisgICAgICAgICAgICBzID0gcy5yZXBsYWNlKCJ9IiwgIiU3RCIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHM7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIF9lbmNvZGUoZmluYWwgU3RyaW5nIHMsIGZpbmFsIFR5cGUgdCwgZmluYWwgYm9vbGVhbiB0ZW1wbGF0ZSwgZmluYWwgYm9vbGVhbiBjb250ZXh0dWFsRW5jb2RlKSB7CisgICAgICAgIGZpbmFsIGJvb2xlYW5bXSB0YWJsZSA9IEVOQ09ESU5HX1RBQkxFU1t0Lm9yZGluYWwoKV07CisgICAgICAgIGJvb2xlYW4gaW5zaWRlVGVtcGxhdGVQYXJhbSA9IGZhbHNlOworCisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBudWxsOworICAgICAgICBmb3IgKGludCBvZmZzZXQgPSAwLCBjb2RlUG9pbnQ7IG9mZnNldCA8IHMubGVuZ3RoKCk7IG9mZnNldCArPSBDaGFyYWN0ZXIuY2hhckNvdW50KGNvZGVQb2ludCkpIHsKKyAgICAgICAgICAgIGNvZGVQb2ludCA9IHMuY29kZVBvaW50QXQob2Zmc2V0KTsKKworICAgICAgICAgICAgaWYgKGNvZGVQb2ludCA8IDB4ODAgJiYgdGFibGVbY29kZVBvaW50XSkgeworICAgICAgICAgICAgICAgIGlmIChzYiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgoY2hhcikgY29kZVBvaW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZSkgeworICAgICAgICAgICAgICAgICAgICBib29sZWFuIGxlYXZpbmdUZW1wbGF0ZVBhcmFtID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlUG9pbnQgPT0gJ3snKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnNpZGVUZW1wbGF0ZVBhcmFtID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPT0gJ30nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnNpZGVUZW1wbGF0ZVBhcmFtID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBsZWF2aW5nVGVtcGxhdGVQYXJhbSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGluc2lkZVRlbXBsYXRlUGFyYW0gfHwgbGVhdmluZ1RlbXBsYXRlUGFyYW0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzYiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKENoYXJhY3Rlci50b0NoYXJzKGNvZGVQb2ludCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoY29udGV4dHVhbEVuY29kZQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgY29kZVBvaW50ID09ICclJworICAgICAgICAgICAgICAgICAgICAgICAgJiYgb2Zmc2V0ICsgMiA8IHMubGVuZ3RoKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGlzSGV4Q2hhcmFjdGVyKHMuY2hhckF0KG9mZnNldCArIDEpKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgaXNIZXhDaGFyYWN0ZXIocy5jaGFyQXQob2Zmc2V0ICsgMikpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzYiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJyUnKS5hcHBlbmQocy5jaGFyQXQob2Zmc2V0ICsgMSkpLmFwcGVuZChzLmNoYXJBdChvZmZzZXQgKyAyKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDI7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChzYiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHMuc3Vic3RyaW5nKDAsIG9mZnNldCkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChjb2RlUG9pbnQgPCAweDgwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlUG9pbnQgPT0gJyAnICYmICh0ID09IFR5cGUuUVVFUllfUEFSQU0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJysnKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZFBlcmNlbnRFbmNvZGVkT2N0ZXQoc2IsIChjaGFyKSBjb2RlUG9pbnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYXBwZW5kVVRGOEVuY29kZWRDaGFyYWN0ZXIoc2IsIGNvZGVQb2ludCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChzYiA9PSBudWxsKSA/IHMgOiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBIRVhfRElHSVRTID0geworICAgICAgICAgICAgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLCAnQScsICdCJywgJ0MnLCAnRCcsICdFJywgJ0YnCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYXBwZW5kUGVyY2VudEVuY29kZWRPY3RldChmaW5hbCBTdHJpbmdCdWlsZGVyIHNiLCBmaW5hbCBpbnQgYikgeworICAgICAgICBzYi5hcHBlbmQoJyUnKTsKKyAgICAgICAgc2IuYXBwZW5kKEhFWF9ESUdJVFNbYiA+PiA0XSk7CisgICAgICAgIHNiLmFwcGVuZChIRVhfRElHSVRTW2IgJiAweDBGXSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhcHBlbmRVVEY4RW5jb2RlZENoYXJhY3RlcihmaW5hbCBTdHJpbmdCdWlsZGVyIHNiLCBmaW5hbCBpbnQgY29kZVBvaW50KSB7CisgICAgICAgIGZpbmFsIENoYXJCdWZmZXIgY2hhcnMgPSBDaGFyQnVmZmVyLndyYXAoQ2hhcmFjdGVyLnRvQ2hhcnMoY29kZVBvaW50KSk7CisgICAgICAgIGZpbmFsIEJ5dGVCdWZmZXIgYnl0ZXMgPSBVVEZfOF9DSEFSU0VULmVuY29kZShjaGFycyk7CisKKyAgICAgICAgd2hpbGUgKGJ5dGVzLmhhc1JlbWFpbmluZygpKSB7CisgICAgICAgICAgICBhcHBlbmRQZXJjZW50RW5jb2RlZE9jdGV0KHNiLCBieXRlcy5nZXQoKSAmIDB4RkYpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gU0NIRU1FID0geyIwLTkiLCAiQS1aIiwgImEteiIsICIrIiwgIi0iLCAiLiJ9OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFVOUkVTRVJWRUQgPSB7IjAtOSIsICJBLVoiLCAiYS16IiwgIi0iLCAiLiIsICJfIiwgIn4ifTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBTVUJfREVMSU1TID0geyIhIiwgIiQiLCAiJiIsICInIiwgIigiLCAiKSIsICIqIiwgIisiLCAiLCIsICI7IiwgIj0ifTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuW11bXSBFTkNPRElOR19UQUJMRVMgPSBpbml0RW5jb2RpbmdUYWJsZXMoKTsKKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW5bXVtdIGluaXRFbmNvZGluZ1RhYmxlcygpIHsKKyAgICAgICAgZmluYWwgYm9vbGVhbltdW10gdGFibGVzID0gbmV3IGJvb2xlYW5bVHlwZS52YWx1ZXMoKS5sZW5ndGhdW107CisKKyAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGwgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgbC5hZGRBbGwoQXJyYXlzLmFzTGlzdChTQ0hFTUUpKTsKKyAgICAgICAgdGFibGVzW1R5cGUuU0NIRU1FLm9yZGluYWwoKV0gPSBpbml0RW5jb2RpbmdUYWJsZShsKTsKKworICAgICAgICBsLmNsZWFyKCk7CisKKyAgICAgICAgbC5hZGRBbGwoQXJyYXlzLmFzTGlzdChVTlJFU0VSVkVEKSk7CisgICAgICAgIHRhYmxlc1tUeXBlLlVOUkVTRVJWRUQub3JkaW5hbCgpXSA9IGluaXRFbmNvZGluZ1RhYmxlKGwpOworCisgICAgICAgIGwuYWRkQWxsKEFycmF5cy5hc0xpc3QoU1VCX0RFTElNUykpOworCisgICAgICAgIHRhYmxlc1tUeXBlLkhPU1Qub3JkaW5hbCgpXSA9IGluaXRFbmNvZGluZ1RhYmxlKGwpOworCisgICAgICAgIHRhYmxlc1tUeXBlLlBPUlQub3JkaW5hbCgpXSA9IGluaXRFbmNvZGluZ1RhYmxlKEFycmF5cy5hc0xpc3QoIjAtOSIpKTsKKworICAgICAgICBsLmFkZCgiOiIpOworCisgICAgICAgIHRhYmxlc1tUeXBlLlVTRVJfSU5GTy5vcmRpbmFsKCldID0gaW5pdEVuY29kaW5nVGFibGUobCk7CisKKyAgICAgICAgbC5hZGQoIkAiKTsKKworICAgICAgICB0YWJsZXNbVHlwZS5BVVRIT1JJVFkub3JkaW5hbCgpXSA9IGluaXRFbmNvZGluZ1RhYmxlKGwpOworCisgICAgICAgIHRhYmxlc1tUeXBlLlBBVEhfU0VHTUVOVC5vcmRpbmFsKCldID0gaW5pdEVuY29kaW5nVGFibGUobCk7CisgICAgICAgIHRhYmxlc1tUeXBlLlBBVEhfU0VHTUVOVC5vcmRpbmFsKCldWyc7J10gPSBmYWxzZTsKKworICAgICAgICB0YWJsZXNbVHlwZS5NQVRSSVhfUEFSQU0ub3JkaW5hbCgpXSA9IHRhYmxlc1tUeXBlLlBBVEhfU0VHTUVOVC5vcmRpbmFsKCldLmNsb25lKCk7CisgICAgICAgIHRhYmxlc1tUeXBlLk1BVFJJWF9QQVJBTS5vcmRpbmFsKCldWyc9J10gPSBmYWxzZTsKKworICAgICAgICBsLmFkZCgiLyIpOworCisgICAgICAgIHRhYmxlc1tUeXBlLlBBVEgub3JkaW5hbCgpXSA9IGluaXRFbmNvZGluZ1RhYmxlKGwpOworCisgICAgICAgIHRhYmxlc1tUeXBlLlFVRVJZLm9yZGluYWwoKV0gPSBpbml0RW5jb2RpbmdUYWJsZShsKTsKKyAgICAgICAgdGFibGVzW1R5cGUuUVVFUlkub3JkaW5hbCgpXVsnISddID0gZmFsc2U7CisgICAgICAgIHRhYmxlc1tUeXBlLlFVRVJZLm9yZGluYWwoKV1bJyonXSA9IGZhbHNlOworICAgICAgICB0YWJsZXNbVHlwZS5RVUVSWS5vcmRpbmFsKCldWydcJyddID0gZmFsc2U7CisgICAgICAgIHRhYmxlc1tUeXBlLlFVRVJZLm9yZGluYWwoKV1bJygnXSA9IGZhbHNlOworICAgICAgICB0YWJsZXNbVHlwZS5RVUVSWS5vcmRpbmFsKCldWycpJ10gPSBmYWxzZTsKKyAgICAgICAgdGFibGVzW1R5cGUuUVVFUlkub3JkaW5hbCgpXVsnOyddID0gZmFsc2U7CisgICAgICAgIHRhYmxlc1tUeXBlLlFVRVJZLm9yZGluYWwoKV1bJzonXSA9IGZhbHNlOworICAgICAgICB0YWJsZXNbVHlwZS5RVUVSWS5vcmRpbmFsKCldWydAJ10gPSBmYWxzZTsKKyAgICAgICAgdGFibGVzW1R5cGUuUVVFUlkub3JkaW5hbCgpXVsnJCddID0gZmFsc2U7CisgICAgICAgIHRhYmxlc1tUeXBlLlFVRVJZLm9yZGluYWwoKV1bJywnXSA9IGZhbHNlOworICAgICAgICB0YWJsZXNbVHlwZS5RVUVSWS5vcmRpbmFsKCldWycvJ10gPSBmYWxzZTsKKyAgICAgICAgdGFibGVzW1R5cGUuUVVFUlkub3JkaW5hbCgpXVsnPyddID0gZmFsc2U7CisKKyAgICAgICAgdGFibGVzW1R5cGUuUVVFUllfUEFSQU0ub3JkaW5hbCgpXSA9IEFycmF5cy5jb3B5T2YoCisgICAgICAgICAgICAgICAgdGFibGVzW1R5cGUuUVVFUlkub3JkaW5hbCgpXSwKKyAgICAgICAgICAgICAgICB0YWJsZXNbVHlwZS5RVUVSWS5vcmRpbmFsKCldLmxlbmd0aCk7CisgICAgICAgIHRhYmxlc1tUeXBlLlFVRVJZX1BBUkFNLm9yZGluYWwoKV1bJz0nXSA9IGZhbHNlOworICAgICAgICB0YWJsZXNbVHlwZS5RVUVSWV9QQVJBTS5vcmRpbmFsKCldWycrJ10gPSBmYWxzZTsKKyAgICAgICAgdGFibGVzW1R5cGUuUVVFUllfUEFSQU0ub3JkaW5hbCgpXVsnJiddID0gZmFsc2U7CisKKyAgICAgICAgdGFibGVzW1R5cGUuUVVFUllfUEFSQU1fU1BBQ0VfRU5DT0RFRC5vcmRpbmFsKCldID0gdGFibGVzW1R5cGUuUVVFUllfUEFSQU0ub3JkaW5hbCgpXTsKKworICAgICAgICB0YWJsZXNbVHlwZS5GUkFHTUVOVC5vcmRpbmFsKCldID0gdGFibGVzW1R5cGUuUVVFUlkub3JkaW5hbCgpXTsKKworICAgICAgICByZXR1cm4gdGFibGVzOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW5bXSBpbml0RW5jb2RpbmdUYWJsZShmaW5hbCBMaXN0PFN0cmluZz4gYWxsb3dlZCkgeworICAgICAgICBmaW5hbCBib29sZWFuW10gdGFibGUgPSBuZXcgYm9vbGVhblsweDgwXTsKKyAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgcmFuZ2UgOiBhbGxvd2VkKSB7CisgICAgICAgICAgICBpZiAocmFuZ2UubGVuZ3RoKCkgPT0gMSkgeworICAgICAgICAgICAgICAgIHRhYmxlW3JhbmdlLmNoYXJBdCgwKV0gPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChyYW5nZS5sZW5ndGgoKSA9PSAzICYmIHJhbmdlLmNoYXJBdCgxKSA9PSAnLScpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gcmFuZ2UuY2hhckF0KDApOyBpIDw9IHJhbmdlLmNoYXJBdCgyKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHRhYmxlW2ldID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdGFibGU7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2hhcnNldCBVVEZfOF9DSEFSU0VUID0gQ2hhcnNldC5mb3JOYW1lKCJVVEYtOCIpOworCisgICAgLyoqCisgICAgICogRGVjb2RlcyBjaGFyYWN0ZXJzIG9mIGEgc3RyaW5nIHRoYXQgYXJlIHBlcmNlbnQtZW5jb2RlZCBvY3RldHMgdXNpbmcKKyAgICAgKiBVVEYtOCBkZWNvZGluZyAoaWYgbmVlZGVkKS4KKyAgICAgKiA8cC8+CisgICAgICogSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBzdHJpbmcgaXMgdmFsaWQgYWNjb3JkaW5nIHRvIGFuICh1bnNwZWNpZmllZCkgVVJJCisgICAgICogY29tcG9uZW50IHR5cGUuIElmIGEgc2VxdWVuY2Ugb2YgY29udGlndW91cyBwZXJjZW50LWVuY29kZWQgb2N0ZXRzIGlzCisgICAgICogbm90IGEgdmFsaWQgVVRGLTggY2hhcmFjdGVyIHRoZW4gdGhlIG9jdGV0cyBhcmUgcmVwbGFjZWQgd2l0aCAnXHVGRkZEJy4KKyAgICAgKiA8cC8+CisgICAgICogSWYgdGhlIFVSSSBjb21wb25lbnQgaXMgb2YgdHlwZSBIT1NUIHRoZW4gYW55ICIlIiBmb3VuZCBiZXR3ZWVuICJbXSIgaXMKKyAgICAgKiBsZWZ0IGFsb25lLiBJdCBpcyBhbiBJUHY2IGxpdGVyYWwgd2l0aCBhIHNjb3BlX2lkLgorICAgICAqIDxwLz4KKyAgICAgKiBJZiB0aGUgVVJJIGNvbXBvbmVudCBpcyBvZiB0eXBlIFFVRVJZX1BBUkFNIHRoZW4gYW55ICIrIiBpcyBkZWNvZGVkIGFzCisgICAgICogYXMgJyAnLgorICAgICAqIDxwLz4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzIHRoZSBzdHJpbmcgdG8gYmUgZGVjb2RlZC4KKyAgICAgKiBAcGFyYW0gdCB0aGUgVVJJIGNvbXBvbmVudCB0eXBlLCBtYXkgYmUgbnVsbC4KKyAgICAgKiBAcmV0dXJuIHRoZSBkZWNvZGVkIHN0cmluZy4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBhIG1hbGZvcm1lZCBwZXJjZW50LWVuY29kZWQgb2N0ZXQgaXMKKyAgICAgKiBkZXRlY3RlZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGRlY29kZShmaW5hbCBTdHJpbmcgcywgZmluYWwgVHlwZSB0KSB7CisgICAgICAgIGlmIChzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGludCBuID0gcy5sZW5ndGgoKTsKKyAgICAgICAgaWYgKG4gPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHM7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gcGVyY2VudC1lc2NhcGVkIG9jdGV0cworICAgICAgICBpZiAocy5pbmRleE9mKCclJykgPCAwKSB7CisgICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gJysnIGNoYXJhY3RlcnMgZm9yIHF1ZXJ5IHBhcmFtCisgICAgICAgICAgICBpZiAodCA9PSBUeXBlLlFVRVJZX1BBUkFNKSB7CisgICAgICAgICAgICAgICAgaWYgKHMuaW5kZXhPZignKycpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBzOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gTWFsZm9ybWVkIHBlcmNlbnQtZXNjYXBlZCBvY3RldCBhdCB0aGUgZW5kCisgICAgICAgICAgICBpZiAobiA8IDIpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlVSSV9DT01QT05FTlRfRU5DT0RFRF9PQ1RFVF9NQUxGT1JNRUQoMSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBNYWxmb3JtZWQgcGVyY2VudC1lc2NhcGVkIG9jdGV0IGF0IHRoZSBlbmQKKyAgICAgICAgICAgIGlmIChzLmNoYXJBdChuIC0gMikgPT0gJyUnKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5VUklfQ09NUE9ORU5UX0VOQ09ERURfT0NURVRfTUFMRk9STUVEKG4gLSAyKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAodCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZGVjb2RlKHMsIG4pOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoICh0KSB7CisgICAgICAgICAgICBjYXNlIEhPU1Q6CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlY29kZUhvc3Qocywgbik7CisgICAgICAgICAgICBjYXNlIFFVRVJZX1BBUkFNOgorICAgICAgICAgICAgICAgIHJldHVybiBkZWNvZGVRdWVyeVBhcmFtKHMsIG4pOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVjb2RlKHMsIG4pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVjb2RlIHRoZSBxdWVyeSBjb21wb25lbnQgb2YgYSBVUkkuCisgICAgICogPHA+CisgICAgICogUXVlcnkgcGFyYW1ldGVyIG5hbWVzIGluIHRoZSByZXR1cm5lZCBtYXAgYXJlIGFsd2F5cyBkZWNvZGVkLiBEZWNvZGluZyBvZiBxdWVyeSBwYXJhbWV0ZXIKKyAgICAgKiB2YWx1ZXMgY2FuIGJlIGNvbnRyb2xsZWQgdXNpbmcgdGhlIHtAY29kZSBkZWNvZGV9IHBhcmFtZXRlciBmbGFnLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1IHRoZSBVUkkuCisgICAgICogQHBhcmFtIGRlY29kZSB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHJldHVybmVkIHF1ZXJ5IHBhcmFtZXRlciB2YWx1ZXMgb2YgdGhlIHF1ZXJ5IGNvbXBvbmVudAorICAgICAqIHNob3VsZCBiZSBpbiBkZWNvZGVkIGZvcm0uCisgICAgICogQHJldHVybiB0aGUgbXVsdGl2YWx1ZWQgbWFwIG9mIHF1ZXJ5IHBhcmFtZXRlcnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gZGVjb2RlUXVlcnkoZmluYWwgVVJJIHUsIGZpbmFsIGJvb2xlYW4gZGVjb2RlKSB7CisgICAgICAgIHJldHVybiBkZWNvZGVRdWVyeSh1LmdldFJhd1F1ZXJ5KCksIGRlY29kZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVjb2RlIHRoZSBxdWVyeSBjb21wb25lbnQgb2YgYSBVUkkuCisgICAgICogPHA+CisgICAgICogUXVlcnkgcGFyYW1ldGVyIG5hbWVzIGluIHRoZSByZXR1cm5lZCBtYXAgYXJlIGFsd2F5cyBkZWNvZGVkLiBEZWNvZGluZyBvZiBxdWVyeSBwYXJhbWV0ZXIKKyAgICAgKiB2YWx1ZXMgY2FuIGJlIGNvbnRyb2xsZWQgdXNpbmcgdGhlIHtAY29kZSBkZWNvZGV9IHBhcmFtZXRlciBmbGFnLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBxIHRoZSBxdWVyeSBjb21wb25lbnQgaW4gZW5jb2RlZCBmb3JtLgorICAgICAqIEBwYXJhbSBkZWNvZGUge0Bjb2RlIHRydWV9IGlmIHRoZSByZXR1cm5lZCBxdWVyeSBwYXJhbWV0ZXIgdmFsdWVzIG9mIHRoZSBxdWVyeSBjb21wb25lbnQKKyAgICAgKiBzaG91bGQgYmUgaW4gZGVjb2RlZCBmb3JtLgorICAgICAqIEByZXR1cm4gdGhlIG11bHRpdmFsdWVkIG1hcCBvZiBxdWVyeSBwYXJhbWV0ZXJzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGRlY29kZVF1ZXJ5KGZpbmFsIFN0cmluZyBxLCBmaW5hbCBib29sZWFuIGRlY29kZSkgeworICAgICAgICByZXR1cm4gZGVjb2RlUXVlcnkocSwgdHJ1ZSwgZGVjb2RlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWNvZGUgdGhlIHF1ZXJ5IGNvbXBvbmVudCBvZiBhIFVSSS4KKyAgICAgKiA8cD4KKyAgICAgKiBEZWNvZGluZyBvZiBxdWVyeSBwYXJhbWV0ZXIgbmFtZXMgYW5kIHZhbHVlcyBjYW4gYmUgY29udHJvbGxlZCB1c2luZyB0aGUge0Bjb2RlIGRlY29kZU5hbWVzfQorICAgICAqIGFuZCB7QGNvZGUgZGVjb2RlVmFsdWVzfSBwYXJhbWV0ZXIgZmxhZ3MuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHEgdGhlIHF1ZXJ5IGNvbXBvbmVudCBpbiBlbmNvZGVkIGZvcm0uCisgICAgICogQHBhcmFtIGRlY29kZU5hbWVzIHtAY29kZSB0cnVlfSBpZiB0aGUgcmV0dXJuZWQgcXVlcnkgcGFyYW1ldGVyIG5hbWVzIG9mIHRoZSBxdWVyeSBjb21wb25lbnQKKyAgICAgKiBzaG91bGQgYmUgaW4gZGVjb2RlZCBmb3JtLgorICAgICAqIEBwYXJhbSBkZWNvZGVWYWx1ZXMge0Bjb2RlIHRydWV9IGlmIHRoZSByZXR1cm5lZCBxdWVyeSBwYXJhbWV0ZXIgdmFsdWVzIG9mIHRoZSBxdWVyeSBjb21wb25lbnQKKyAgICAgKiBzaG91bGQgYmUgaW4gZGVjb2RlZCBmb3JtLgorICAgICAqIEByZXR1cm4gdGhlIG11bHRpdmFsdWVkIG1hcCBvZiBxdWVyeSBwYXJhbWV0ZXJzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGRlY29kZVF1ZXJ5KGZpbmFsIFN0cmluZyBxLCBmaW5hbCBib29sZWFuIGRlY29kZU5hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gZGVjb2RlVmFsdWVzKSB7CisgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBxdWVyeVBhcmFtZXRlcnMgPSBuZXcgTXVsdGl2YWx1ZWRTdHJpbmdNYXAoKTsKKworICAgICAgICBpZiAocSA9PSBudWxsIHx8IHEubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5UGFyYW1ldGVyczsKKyAgICAgICAgfQorCisgICAgICAgIGludCBzID0gMDsKKyAgICAgICAgZG8geworICAgICAgICAgICAgZmluYWwgaW50IGUgPSBxLmluZGV4T2YoJyYnLCBzKTsKKworICAgICAgICAgICAgaWYgKGUgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBkZWNvZGVRdWVyeVBhcmFtKHF1ZXJ5UGFyYW1ldGVycywgcS5zdWJzdHJpbmcocyksIGRlY29kZU5hbWVzLCBkZWNvZGVWYWx1ZXMpOworICAgICAgICAgICAgfSBlbHNlIGlmIChlID4gcykgeworICAgICAgICAgICAgICAgIGRlY29kZVF1ZXJ5UGFyYW0ocXVlcnlQYXJhbWV0ZXJzLCBxLnN1YnN0cmluZyhzLCBlKSwgZGVjb2RlTmFtZXMsIGRlY29kZVZhbHVlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzID0gZSArIDE7CisgICAgICAgIH0gd2hpbGUgKHMgPiAwICYmIHMgPCBxLmxlbmd0aCgpKTsKKworICAgICAgICByZXR1cm4gcXVlcnlQYXJhbWV0ZXJzOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJTdGF0ZW1lbnRXaXRoRW1wdHlCb2R5IikKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGRlY29kZVF1ZXJ5UGFyYW0oZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtcywgZmluYWwgU3RyaW5nIHBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGRlY29kZU5hbWVzLCBmaW5hbCBib29sZWFuIGRlY29kZVZhbHVlcykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgaW50IGVxdWFscyA9IHBhcmFtLmluZGV4T2YoJz0nKTsKKyAgICAgICAgICAgIGlmIChlcXVhbHMgPiAwKSB7CisgICAgICAgICAgICAgICAgcGFyYW1zLmFkZCgoZGVjb2RlTmFtZXMpID8gVVJMRGVjb2Rlci5kZWNvZGUocGFyYW0uc3Vic3RyaW5nKDAsIGVxdWFscyksICJVVEYtOCIpIDogcGFyYW0uc3Vic3RyaW5nKDAsIGVxdWFscyksCisgICAgICAgICAgICAgICAgICAgICAgICAoZGVjb2RlVmFsdWVzKSA/IFVSTERlY29kZXIuZGVjb2RlKHBhcmFtLnN1YnN0cmluZyhlcXVhbHMgKyAxKSwgIlVURi04IikgOiBwYXJhbS5zdWJzdHJpbmcoZXF1YWxzICsgMSkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChlcXVhbHMgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIG5vIGtleSBkZWNsYXJlZCwgaWdub3JlCisgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIHBhcmFtcy5hZGQoKGRlY29kZU5hbWVzKSA/IFVSTERlY29kZXIuZGVjb2RlKHBhcmFtLCAiVVRGLTgiKSA6IHBhcmFtLCAiIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIG9jY3VyCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFBhdGhTZWdtZW50SW1wbCBpbXBsZW1lbnRzIFBhdGhTZWdtZW50IHsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXRoU2VnbWVudCBFTVBUWV9QQVRIX1NFR01FTlQgPSBuZXcgUGF0aFNlZ21lbnRJbXBsKCIiLCBmYWxzZSk7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHBhdGg7CisgICAgICAgIHByaXZhdGUgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IG1hdHJpeFBhcmFtZXRlcnM7CisKKyAgICAgICAgUGF0aFNlZ21lbnRJbXBsKGZpbmFsIFN0cmluZyBwYXRoLCBmaW5hbCBib29sZWFuIGRlY29kZSkgeworICAgICAgICAgICAgdGhpcyhwYXRoLCBkZWNvZGUsIG5ldyBNdWx0aXZhbHVlZFN0cmluZ01hcCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIFBhdGhTZWdtZW50SW1wbChmaW5hbCBTdHJpbmcgcGF0aCwgZmluYWwgYm9vbGVhbiBkZWNvZGUsIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBtYXRyaXhQYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICB0aGlzLnBhdGggPSAoZGVjb2RlKSA/IFVyaUNvbXBvbmVudC5kZWNvZGUocGF0aCwgVXJpQ29tcG9uZW50LlR5cGUuUEFUSF9TRUdNRU5UKSA6IHBhdGg7CisgICAgICAgICAgICB0aGlzLm1hdHJpeFBhcmFtZXRlcnMgPSBtYXRyaXhQYXJhbWV0ZXJzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKKyAgICAgICAgICAgIHJldHVybiBwYXRoOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0TWF0cml4UGFyYW1ldGVycygpIHsKKyAgICAgICAgICAgIHJldHVybiBtYXRyaXhQYXJhbWV0ZXJzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gcGF0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERlY29kZSB0aGUgcGF0aCBjb21wb25lbnQgb2YgYSBVUkkgYXMgcGF0aCBzZWdtZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1IHRoZSBVUkkuIElmIHRoZSBwYXRoIGNvbXBvbmVudCBpcyBhbiBhYnNvbHV0ZSBwYXRoIGNvbXBvbmVudAorICAgICAqIHRoZW4gdGhlIGxlYWRpbmcgJy8nIGlzIGlnbm9yZWQgYW5kIGlzIG5vdCBjb25zaWRlcmVkIGEgZGVsaW1pYXRvcgorICAgICAqIG9mIGEgcGF0aCBzZWdtZW50LgorICAgICAqIEBwYXJhbSBkZWNvZGUgdHJ1ZSBpZiB0aGUgcGF0aCBzZWdtZW50cyBvZiB0aGUgcGF0aCBjb21wb25lbnQKKyAgICAgKiBzaG91bGQgYmUgaW4gZGVjb2RlZCBmb3JtLgorICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgcGF0aCBzZWdtZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8UGF0aFNlZ21lbnQ+IGRlY29kZVBhdGgoZmluYWwgVVJJIHUsIGZpbmFsIGJvb2xlYW4gZGVjb2RlKSB7CisgICAgICAgIFN0cmluZyByYXdQYXRoID0gdS5nZXRSYXdQYXRoKCk7CisgICAgICAgIGlmIChyYXdQYXRoICE9IG51bGwgJiYgcmF3UGF0aC5sZW5ndGgoKSA+IDAgJiYgcmF3UGF0aC5jaGFyQXQoMCkgPT0gJy8nKSB7CisgICAgICAgICAgICByYXdQYXRoID0gcmF3UGF0aC5zdWJzdHJpbmcoMSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRlY29kZVBhdGgocmF3UGF0aCwgZGVjb2RlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWNvZGUgdGhlIHBhdGggY29tcG9uZW50IG9mIGEgVVJJIGFzIHBhdGggc2VnbWVudHMuCisgICAgICogPHA+CisgICAgICogQW55ICcvJyBjaGFyYWN0ZXIgaW4gdGhlIHBhdGggaXMgY29uc2lkZXJlZCB0byBiZSBhIGRlbGltaW5hdG9yCisgICAgICogYmV0d2VlbiB0d28gcGF0aCBzZWdtZW50cy4gVGh1cyBpZiB0aGUgcGF0aCBpcyAnLycgdGhlbiB0aGUgcGF0aCBzZWdtZW50CisgICAgICogbGlzdCB3aWxsIGNvbnRhaW4gdHdvIGVtcHR5IHBhdGggc2VnbWVudHMuIElmIHRoZSBwYXRoIGlzICIvLyIgdGhlbgorICAgICAqIHRoZSBwYXRoIHNlZ21lbnQgbGlzdCB3aWxsIGNvbnRhaW4gdGhyZWUgZW1wdHkgcGF0aCBzZWdtZW50cy4gSWYgdGhlIHBhdGgKKyAgICAgKiBpcyAiL2EvIiB0aGUgcGF0aCBzZWdtZW50IGxpc3Qgd2lsbCBjb25zaXN0IG9mIHRoZSBmb2xsb3dpbmcgcGF0aAorICAgICAqIHNlZ21lbnRzIGluIG9yZGVyOiAiIiwgImEiIGFuZCAiIi4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCB0aGUgcGF0aCBjb21wb25lbnQgaW4gZW5jb2RlZCBmb3JtLgorICAgICAqIEBwYXJhbSBkZWNvZGUgdHJ1ZSBpZiB0aGUgcGF0aCBzZWdtZW50cyBvZiB0aGUgcGF0aCBjb21wb25lbnQKKyAgICAgKiBzaG91bGQgYmUgaW4gZGVjb2RlZCBmb3JtLgorICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgcGF0aCBzZWdtZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8UGF0aFNlZ21lbnQ+IGRlY29kZVBhdGgoZmluYWwgU3RyaW5nIHBhdGgsIGZpbmFsIGJvb2xlYW4gZGVjb2RlKSB7CisgICAgICAgIGZpbmFsIExpc3Q8UGF0aFNlZ21lbnQ+IHNlZ21lbnRzID0gbmV3IExpbmtlZExpc3Q8UGF0aFNlZ21lbnQ+KCk7CisKKyAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHNlZ21lbnRzOworICAgICAgICB9CisKKyAgICAgICAgaW50IHM7CisgICAgICAgIGludCBlID0gLTE7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHMgPSBlICsgMTsKKyAgICAgICAgICAgIGUgPSBwYXRoLmluZGV4T2YoJy8nLCBzKTsKKworICAgICAgICAgICAgaWYgKGUgPiBzKSB7CisgICAgICAgICAgICAgICAgZGVjb2RlUGF0aFNlZ21lbnQoc2VnbWVudHMsIHBhdGguc3Vic3RyaW5nKHMsIGUpLCBkZWNvZGUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChlID09IHMpIHsKKyAgICAgICAgICAgICAgICBzZWdtZW50cy5hZGQoUGF0aFNlZ21lbnRJbXBsLkVNUFRZX1BBVEhfU0VHTUVOVCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKGUgIT0gLTEpOworICAgICAgICBpZiAocyA8IHBhdGgubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgIGRlY29kZVBhdGhTZWdtZW50KHNlZ21lbnRzLCBwYXRoLnN1YnN0cmluZyhzKSwgZGVjb2RlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNlZ21lbnRzLmFkZChQYXRoU2VnbWVudEltcGwuRU1QVFlfUEFUSF9TRUdNRU5UKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2VnbWVudHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVjb2RlIHRoZSBwYXRoIHNlZ21lbnQgYW5kIGFkZCBpdCB0byB0aGUgbGlzdCBvZiBwYXRoIHNlZ21lbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIHNlZ21lbnRzIG11dGFibGUgbGlzdCBvZiBwYXRoIHNlZ21lbnRzLgorICAgICAqIEBwYXJhbSBzZWdtZW50IHBhdGggc2VnbWVudCB0byBiZSBkZWNvZGVkLgorICAgICAqIEBwYXJhbSBkZWNvZGUge0Bjb2RlIHRydWV9IGlmIHRoZSBwYXRoIHNlZ21lbnQgc2hvdWxkIGJlIGluIGEgZGVjb2RlZCBmb3JtLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkZWNvZGVQYXRoU2VnbWVudChmaW5hbCBMaXN0PFBhdGhTZWdtZW50PiBzZWdtZW50cywgZmluYWwgU3RyaW5nIHNlZ21lbnQsIGZpbmFsIGJvb2xlYW4gZGVjb2RlKSB7CisgICAgICAgIGZpbmFsIGludCBjb2xvbiA9IHNlZ21lbnQuaW5kZXhPZignOycpOworICAgICAgICBpZiAoY29sb24gIT0gLTEpIHsKKyAgICAgICAgICAgIHNlZ21lbnRzLmFkZChuZXcgUGF0aFNlZ21lbnRJbXBsKChjb2xvbiA9PSAwKSA/ICIiIDogc2VnbWVudC5zdWJzdHJpbmcoMCwgY29sb24pLCBkZWNvZGUsIGRlY29kZU1hdHJpeChzZWdtZW50LAorICAgICAgICAgICAgICAgICAgICBkZWNvZGUpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzZWdtZW50cy5hZGQobmV3IFBhdGhTZWdtZW50SW1wbChzZWdtZW50LCBkZWNvZGUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERlY29kZSB0aGUgbWF0cml4IGNvbXBvbmVudCBvZiBhIFVSSSBwYXRoIHNlZ21lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aFNlZ21lbnQgdGhlIHBhdGggc2VnbWVudCBjb21wb25lbnQgaW4gZW5jb2RlZCBmb3JtLgorICAgICAqIEBwYXJhbSBkZWNvZGUgdHJ1ZSBpZiB0aGUgbWF0cml4IHBhcmFtZXRlcnMgb2YgdGhlIHBhdGggc2VnbWVudCBjb21wb25lbnQKKyAgICAgKiBzaG91bGQgYmUgaW4gZGVjb2RlZCBmb3JtLgorICAgICAqIEByZXR1cm4gdGhlIG11bHRpdmFsdWVkIG1hcCBvZiBtYXRyaXggcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBkZWNvZGVNYXRyaXgoZmluYWwgU3RyaW5nIHBhdGhTZWdtZW50LCBmaW5hbCBib29sZWFuIGRlY29kZSkgeworICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gbWF0cml4TWFwID0gbmV3IE11bHRpdmFsdWVkU3RyaW5nTWFwKCk7CisKKyAgICAgICAgLy8gU2tpcCBvdmVyIHBhdGggc2VnbWVudAorICAgICAgICBpbnQgcyA9IHBhdGhTZWdtZW50LmluZGV4T2YoJzsnKSArIDE7CisgICAgICAgIGlmIChzID09IDAgfHwgcyA9PSBwYXRoU2VnbWVudC5sZW5ndGgoKSkgeworICAgICAgICAgICAgcmV0dXJuIG1hdHJpeE1hcDsKKyAgICAgICAgfQorCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBlID0gcGF0aFNlZ21lbnQuaW5kZXhPZignOycsIHMpOworCisgICAgICAgICAgICBpZiAoZSA9PSAtMSkgeworICAgICAgICAgICAgICAgIGRlY29kZU1hdHJpeFBhcmFtKG1hdHJpeE1hcCwgcGF0aFNlZ21lbnQuc3Vic3RyaW5nKHMpLCBkZWNvZGUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChlID4gcykgeworICAgICAgICAgICAgICAgIGRlY29kZU1hdHJpeFBhcmFtKG1hdHJpeE1hcCwgcGF0aFNlZ21lbnQuc3Vic3RyaW5nKHMsIGUpLCBkZWNvZGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcyA9IGUgKyAxOworICAgICAgICB9IHdoaWxlIChzID4gMCAmJiBzIDwgcGF0aFNlZ21lbnQubGVuZ3RoKCkpOworCisgICAgICAgIHJldHVybiBtYXRyaXhNYXA7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoIlN0YXRlbWVudFdpdGhFbXB0eUJvZHkiKQorICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZGVjb2RlTWF0cml4UGFyYW0oZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtcywgZmluYWwgU3RyaW5nIHBhcmFtLCBmaW5hbCBib29sZWFuIGRlY29kZSkgeworICAgICAgICBmaW5hbCBpbnQgZXF1YWxzID0gcGFyYW0uaW5kZXhPZignPScpOworICAgICAgICBpZiAoZXF1YWxzID4gMCkgeworICAgICAgICAgICAgcGFyYW1zLmFkZChVcmlDb21wb25lbnQuZGVjb2RlKHBhcmFtLnN1YnN0cmluZygwLCBlcXVhbHMpLCBVcmlDb21wb25lbnQuVHlwZS5NQVRSSVhfUEFSQU0pLAorICAgICAgICAgICAgICAgICAgICAoZGVjb2RlKSA/IFVyaUNvbXBvbmVudC5kZWNvZGUocGFyYW0uc3Vic3RyaW5nKGVxdWFscyArIDEpLCBVcmlDb21wb25lbnQuVHlwZS5NQVRSSVhfUEFSQU0pIDogcGFyYW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKGVxdWFscyArIDEpKTsKKyAgICAgICAgfSBlbHNlIGlmIChlcXVhbHMgPT0gMCkgeworICAgICAgICAgICAgLy8gbm8ga2V5IGRlY2xhcmVkLCBpZ25vcmUKKyAgICAgICAgfSBlbHNlIGlmIChwYXJhbS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIHBhcmFtcy5hZGQoVXJpQ29tcG9uZW50LmRlY29kZShwYXJhbSwgVXJpQ29tcG9uZW50LlR5cGUuTUFUUklYX1BBUkFNKSwgIiIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlY29kZShmaW5hbCBTdHJpbmcgcywgZmluYWwgaW50IG4pIHsKKyAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKG4pOworICAgICAgICBCeXRlQnVmZmVyIGJiID0gbnVsbDsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICkgeworICAgICAgICAgICAgZmluYWwgY2hhciBjID0gcy5jaGFyQXQoaSsrKTsKKyAgICAgICAgICAgIGlmIChjICE9ICclJykgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChjKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYmIgPSBkZWNvZGVQZXJjZW50RW5jb2RlZE9jdGV0cyhzLCBpLCBiYik7CisgICAgICAgICAgICAgICAgaSA9IGRlY29kZU9jdGV0cyhpLCBiYiwgc2IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlY29kZVF1ZXJ5UGFyYW0oZmluYWwgU3RyaW5nIHMsIGZpbmFsIGludCBuKSB7CisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihuKTsKKyAgICAgICAgQnl0ZUJ1ZmZlciBiYiA9IG51bGw7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyApIHsKKyAgICAgICAgICAgIGZpbmFsIGNoYXIgYyA9IHMuY2hhckF0KGkrKyk7CisgICAgICAgICAgICBpZiAoYyAhPSAnJScpIHsKKyAgICAgICAgICAgICAgICBpZiAoYyAhPSAnKycpIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnICcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYmIgPSBkZWNvZGVQZXJjZW50RW5jb2RlZE9jdGV0cyhzLCBpLCBiYik7CisgICAgICAgICAgICAgICAgaSA9IGRlY29kZU9jdGV0cyhpLCBiYiwgc2IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGRlY29kZUhvc3QoZmluYWwgU3RyaW5nIHMsIGZpbmFsIGludCBuKSB7CisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihuKTsKKyAgICAgICAgQnl0ZUJ1ZmZlciBiYiA9IG51bGw7CisKKyAgICAgICAgYm9vbGVhbiBiZXR3ZWVuQnJhY2tldHMgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyApIHsKKyAgICAgICAgICAgIGZpbmFsIGNoYXIgYyA9IHMuY2hhckF0KGkrKyk7CisgICAgICAgICAgICBpZiAoYyA9PSAnWycpIHsKKyAgICAgICAgICAgICAgICBiZXR3ZWVuQnJhY2tldHMgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChiZXR3ZWVuQnJhY2tldHMgJiYgYyA9PSAnXScpIHsKKyAgICAgICAgICAgICAgICBiZXR3ZWVuQnJhY2tldHMgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGMgIT0gJyUnIHx8IGJldHdlZW5CcmFja2V0cykgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChjKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYmIgPSBkZWNvZGVQZXJjZW50RW5jb2RlZE9jdGV0cyhzLCBpLCBiYik7CisgICAgICAgICAgICAgICAgaSA9IGRlY29kZU9jdGV0cyhpLCBiYiwgc2IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVjb2RlIGEgY29udGludW91cyBzZXF1ZW5jZSBvZiBwZXJjZW50IGVuY29kZWQgb2N0ZXRzLgorICAgICAqIDxwLz4KKyAgICAgKiBBc3N1bWVzIHRoZSBpbmRleCwgaSwgc3RhcnRzIHRoYXQgdGhlIGZpcnN0IGhleCBkaWdpdCBvZiB0aGUgZmlyc3QKKyAgICAgKiBwZXJjZW50LWVuY29kZWQgb2N0ZXQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQnl0ZUJ1ZmZlciBkZWNvZGVQZXJjZW50RW5jb2RlZE9jdGV0cyhmaW5hbCBTdHJpbmcgcywgaW50IGksIEJ5dGVCdWZmZXIgYmIpIHsKKyAgICAgICAgaWYgKGJiID09IG51bGwpIHsKKyAgICAgICAgICAgIGJiID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJiLmNsZWFyKCk7CisgICAgICAgIH0KKworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgLy8gRGVjb2RlIHRoZSBoZXggZGlnaXRzCisgICAgICAgICAgICBiYi5wdXQoKGJ5dGUpIChkZWNvZGVIZXgocywgaSsrKSA8PCA0IHwgZGVjb2RlSGV4KHMsIGkrKykpKTsKKworICAgICAgICAgICAgLy8gRmluaXNoIGlmIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZworICAgICAgICAgICAgaWYgKGkgPT0gcy5sZW5ndGgoKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBGaW5pc2ggaWYgbm8gbW9yZSBwZXJjZW50LWVuY29kZWQgb2N0ZXRzIGZvbGxvdworICAgICAgICAgICAgaWYgKHMuY2hhckF0KGkrKykgIT0gJyUnKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBieXRlIGJ1ZmZlciBuZWVkcyB0byBiZSBpbmNyZWFzZWQgaW4gc2l6ZQorICAgICAgICAgICAgaWYgKGJiLnBvc2l0aW9uKCkgPT0gYmIuY2FwYWNpdHkoKSkgeworICAgICAgICAgICAgICAgIGJiLmZsaXAoKTsKKyAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgYnl0ZSBidWZmZXIgd2l0aCB0aGUgbWF4aW11bSBudW1iZXIgb2YgcG9zc2libGUKKyAgICAgICAgICAgICAgICAvLyBvY3RldHMsIGhlbmNlIHJlc2l6ZSBzaG91bGQgb25seSBvY2N1ciBvbmNlCisgICAgICAgICAgICAgICAgZmluYWwgQnl0ZUJ1ZmZlciBiYl9uZXcgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKHMubGVuZ3RoKCkgLyAzKTsKKyAgICAgICAgICAgICAgICBiYl9uZXcucHV0KGJiKTsKKyAgICAgICAgICAgICAgICBiYiA9IGJiX25ldzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGJiLmZsaXAoKTsKKyAgICAgICAgcmV0dXJuIGJiOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlY29kZXMgb2N0ZXRzIHRvIGNoYXJhY3RlcnMgdXNpbmcgdGhlIFVURi04IGRlY29kaW5nIGFuZCBhcHBlbmRzCisgICAgICogdGhlIGNoYXJhY3RlcnMgdG8gYSBTdHJpbmdCdWZmZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCB0byB0aGUgbmV4dCB1bmNoZWNrZWQgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcgdG8gZGVjb2RlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGRlY29kZU9jdGV0cyhmaW5hbCBpbnQgaSwgZmluYWwgQnl0ZUJ1ZmZlciBiYiwgZmluYWwgU3RyaW5nQnVpbGRlciBzYikgeworICAgICAgICAvLyBJZiB0aGVyZSBpcyBvbmx5IG9uZSBvY3RldCBhbmQgaXMgYW4gQVNDSUkgY2hhcmFjdGVyCisgICAgICAgIGlmIChiYi5saW1pdCgpID09IDEgJiYgKGJiLmdldCgwKSAmIDB4RkYpIDwgMHg4MCkgeworICAgICAgICAgICAgLy8gT2N0ZXQgY2FuIGJlIGFwcGVuZGVkIGRpcmVjdGx5CisgICAgICAgICAgICBzYi5hcHBlbmQoKGNoYXIpIGJiLmdldCgwKSk7CisgICAgICAgICAgICByZXR1cm4gaSArIDI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgZmluYWwgQ2hhckJ1ZmZlciBjYiA9IFVURl84X0NIQVJTRVQuZGVjb2RlKGJiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChjYi50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiBpICsgYmIubGltaXQoKSAqIDMgLSAxOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGRlY29kZUhleChmaW5hbCBTdHJpbmcgcywgZmluYWwgaW50IGkpIHsKKyAgICAgICAgZmluYWwgaW50IHYgPSBkZWNvZGVIZXgocy5jaGFyQXQoaSkpOworICAgICAgICBpZiAodiA9PSAtMSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5VUklfQ09NUE9ORU5UX0VOQ09ERURfT0NURVRfSU5WQUxJRF9ESUdJVChpLCBzLmNoYXJBdChpKSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludFtdIEhFWF9UQUJMRSA9IGluaXRIZXhUYWJsZSgpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50W10gaW5pdEhleFRhYmxlKCkgeworICAgICAgICBmaW5hbCBpbnRbXSB0YWJsZSA9IG5ldyBpbnRbMHg4MF07CisgICAgICAgIEFycmF5cy5maWxsKHRhYmxlLCAtMSk7CisKKyAgICAgICAgZm9yIChjaGFyIGMgPSAnMCc7IGMgPD0gJzknOyBjKyspIHsKKyAgICAgICAgICAgIHRhYmxlW2NdID0gYyAtICcwJzsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNoYXIgYyA9ICdBJzsgYyA8PSAnRic7IGMrKykgeworICAgICAgICAgICAgdGFibGVbY10gPSBjIC0gJ0EnICsgMTA7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjaGFyIGMgPSAnYSc7IGMgPD0gJ2YnOyBjKyspIHsKKyAgICAgICAgICAgIHRhYmxlW2NdID0gYyAtICdhJyArIDEwOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0YWJsZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZGVjb2RlSGV4KGZpbmFsIGNoYXIgYykgeworICAgICAgICByZXR1cm4gKGMgPCAxMjgpID8gSEVYX1RBQkxFW2NdIDogLTE7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGNoYXJhY3RlciB7QGNvZGUgY30gaXMgaGV4YWRlY2ltYWwgY2hhcmFjdGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGMgQW55IGNoYXJhY3RlcgorICAgICAqIEByZXR1cm4gVGhlIGlzIHtAY29kZSBjfSBpcyBhIGhleGFkZWNpbWFsIGNoYXJhY3RlciAoZS5nLiAwLCA1LCBhLCBBLCBmLCAuLi4pCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzSGV4Q2hhcmFjdGVyKGZpbmFsIGNoYXIgYykgeworICAgICAgICByZXR1cm4gYyA8IDEyOCAmJiBIRVhfVEFCTEVbY10gIT0gLTE7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSB7QGNvZGUgUmVxdWVzdC1Vcml9IHJlcHJlc2VudGF0aW9uIGFzIGRlZmluZWQgYnkgSFRUUCBzcGVjLiBGb3IgZXhhbXBsZToKKyAgICAgKiA8cHJlPiZsdDtNZXRob2Q+ICZsdDtSZXF1ZXN0LVVSST4gSFRUUC8mbHQ7VmVyc2lvbj4gKGUuZy4gR0VUIC9hdXRoO2Zvbz1iYXIvaGVsbG8/Zm9vPWJhciBIVFRQLzEuMSk8L3ByZT4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgdXJpIHRvIG9idGFpbiB7QGNvZGUgUmVxdWVzdC1Vcml9IGZyb20uCisgICAgICogQHJldHVybiB7QGNvZGUgUmVxdWVzdC1Vcml9IHJlcHJlc2VudGF0aW9uIG9yIHtAY29kZSBudWxsfSBpZiB7QGNvZGUgdXJpfSBpcyBub3QgcHJvdmlkZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZnVsbFJlbGF0aXZlVXJpKGZpbmFsIFVSSSB1cmkpIHsKKyAgICAgICAgaWYgKHVyaSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFN0cmluZyBxdWVyeSA9IHVyaS5nZXRSYXdRdWVyeSgpOworCisgICAgICAgIHJldHVybiB1cmkuZ2V0UmF3UGF0aCgpICsgKHF1ZXJ5ICE9IG51bGwgJiYgcXVlcnkubGVuZ3RoKCkgPiAwID8gIj8iICsgcXVlcnkgOiAiIik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3VyaS9VcmlUZW1wbGF0ZS5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS91cmkvVXJpVGVtcGxhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODc2ZjIwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS91cmkvVXJpVGVtcGxhdGUuamF2YQpAQCAtMCwwICsxLDEwNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudXJpOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5BcnJheURlcXVlOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuRGVxdWU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVyblN5bnRheEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhLlByZWNvbmRpdGlvbnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudXJpLmludGVybmFsLlVyaVRlbXBsYXRlUGFyc2VyOworCisvKioKKyAqIEEgVVJJIHRlbXBsYXRlLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICogQGF1dGhvciBHZXJhcmQgRGF2aXNvbiAoZ2VyYXJkLmRhdmlzb24gYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFVyaVRlbXBsYXRlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBFTVBUWV9WQUxVRVMgPSBuZXcgU3RyaW5nWzBdOworCisgICAgLyoqCisgICAgICogT3JkZXIgdGhlIHRlbXBsYXRlcyBhY2NvcmRpbmcgdG8gSkFYLVJTIHNwZWNpZmljYXRpb24uCisgICAgICogPHA+CisgICAgICogU29ydCB0aGUgc2V0IG9mIG1hdGNoaW5nIHJlc291cmNlIGNsYXNzZXMgdXNpbmcgdGhlIG51bWJlciBvZgorICAgICAqIGNoYXJhY3RlcnMgaW4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBub3QgcmVzdWx0aW5nIGZyb20gdGVtcGxhdGUKKyAgICAgKiB2YXJpYWJsZXMgYXMgdGhlIHByaW1hcnkga2V5LCB0aGUgbnVtYmVyIG9mIG1hdGNoaW5nIGdyb3VwcworICAgICAqIGFzIGEgc2Vjb25kYXJ5IGtleSwgYW5kIHRoZSBudW1iZXIgb2YgZXhwbGljaXQgcmVndWxhciBleHByZXNzaW9uCisgICAgICogZGVjbGFyYXRpb25zIGFzIHRoZSB0ZXJ0aWFyeSBrZXkuCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxVcmlUZW1wbGF0ZT4gQ09NUEFSQVRPUiA9IG5ldyBDb21wYXJhdG9yPFVyaVRlbXBsYXRlPigpIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBjb21wYXJlKFVyaVRlbXBsYXRlIG8xLCBVcmlUZW1wbGF0ZSBvMikgeworICAgICAgICAgICAgaWYgKG8xID09IG51bGwgJiYgbzIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG8xID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvMiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobzEgPT0gRU1QVFkgJiYgbzIgPT0gRU1QVFkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvMSA9PSBFTVBUWSkgeworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG8yID09IEVNUFRZKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDb21wYXJlIHRoZSBudW1iZXIgb2YgZXhwbGljaXQgY2hhcmFjdGVycworICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGl0IGlzIGltcG9ydGFudCB0aGF0IG8yIGlzIGNvbXBhcmVkIGFnYWluc3QgbzEKKyAgICAgICAgICAgIC8vIHNvIHRoYXQgYSByZWd1bGFyIGV4cHJlc3Npb24gd2l0aCBzYXkgMTAgZXhwbGljaXQgY2hhcmFjdGVycworICAgICAgICAgICAgLy8gaXMgbGVzcyB0aGFuIGEgcmVndWxhciBleHByZXNzaW9uIHdpdGggc2F5IDUgZXhwbGljaXQgY2hhcmFjdGVycy4KKyAgICAgICAgICAgIGludCBpID0gbzIuZ2V0TnVtYmVyT2ZFeHBsaWNpdENoYXJhY3RlcnMoKSAtIG8xLmdldE51bWJlck9mRXhwbGljaXRDaGFyYWN0ZXJzKCk7CisgICAgICAgICAgICBpZiAoaSAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIElmIHRoZSBudW1iZXIgb2YgZXhwbGljaXQgY2hhcmFjdGVycyBpcyBlcXVhbAorICAgICAgICAgICAgLy8gY29tcGFyZSB0aGUgbnVtYmVyIG9mIHRlbXBsYXRlIHZhcmlhYmxlcworICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGl0IGlzIGltcG9ydGFudCB0aGF0IG8yIGlzIGNvbXBhcmVkIGFnYWluc3QgbzEKKyAgICAgICAgICAgIC8vIHNvIHRoYXQgYSByZWd1bGFyIGV4cHJlc3Npb24gd2l0aCBzYXkgMTAgdGVtcGxhdGUgdmFyaWFibGVzCisgICAgICAgICAgICAvLyBpcyBsZXNzIHRoYW4gYSByZWd1bGFyIGV4cHJlc3Npb24gd2l0aCBzYXkgNSB0ZW1wbGF0ZSB2YXJpYWJsZXMuCisgICAgICAgICAgICBpID0gbzIuZ2V0TnVtYmVyT2ZUZW1wbGF0ZVZhcmlhYmxlcygpIC0gbzEuZ2V0TnVtYmVyT2ZUZW1wbGF0ZVZhcmlhYmxlcygpOworICAgICAgICAgICAgaWYgKGkgIT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJZiB0aGUgbnVtYmVyIG9mIHRlbXBsYXRlIHZhcmlhYmxlcyBpcyBlcXVhbAorICAgICAgICAgICAgLy8gY29tcGFyZSB0aGUgbnVtYmVyIG9mIGV4cGxpY2l0IHJlZ2V4ZXMKKyAgICAgICAgICAgIGkgPSBvMi5nZXROdW1iZXJPZkV4cGxpY2l0UmVnZXhlcygpIC0gbzEuZ2V0TnVtYmVyT2ZFeHBsaWNpdFJlZ2V4ZXMoKTsKKyAgICAgICAgICAgIGlmIChpICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSWYgdGhlIG51bWJlciBvZiBleHBsaWNpdCBjaGFyYWN0ZXJzIGFuZCB0ZW1wbGF0ZSB2YXJpYWJsZXMKKyAgICAgICAgICAgIC8vIGFyZSBlcXVhbCB0aGVuIGNvbWFwcmUgdGhlIHJlZ2V4ZXMKKyAgICAgICAgICAgIC8vIFRoZSBvcmRlciBkb2VzIG5vdCBtYXR0ZXIgYXMgbG9uZyBhcyB0ZW1wbGF0ZXMgd2l0aCBkaWZmZXJlbnQKKyAgICAgICAgICAgIC8vIGV4cGxpY2l0IGNoYXJhY3RlcnMgYXJlIGRpc3Rpbmd1aXNoYWJsZQorICAgICAgICAgICAgcmV0dXJuIG8yLnBhdHRlcm4uZ2V0UmVnZXgoKS5jb21wYXJlVG8obzEucGF0dGVybi5nZXRSZWdleCgpKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBBIHN0cmF0ZWd5IGludGVyZmFjZSBmb3IgcHJvY2Vzc2luZyBwYXJhbWV0ZXJzLCBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aAorICAgICAqIGEgSkRLIDggb25lIGRheSBpbiB0aGUgZnV0dXJlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGludGVyZmFjZSBUZW1wbGF0ZVZhbHVlU3RyYXRlZ3kgeworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IGEgdmFsdWUgZm9yIGEgZ2l2ZW4gdGVtcGxhdGUgdmFyaWFibGUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB0ZW1wbGF0ZVZhcmlhYmxlIHRlbXBsYXRlIHZhcmlhYmxlLgorICAgICAgICAgKiBAcGFyYW0gbWF0Y2hlZEdyb3VwICAgICBtYXRjaGVkIGdyb3VwIHN0cmluZyBmb3IgYSBnaXZlbiB0ZW1wbGF0ZSB2YXJpYWJsZS4KKyAgICAgICAgICogQHJldHVybiB0ZW1wbGF0ZSB2YWx1ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGluIGNhc2Ugbm8gdmFsdWUgaGFzIGJlZW4gZm91bmQgYW5kIHRoZSBzdHJhdGVneQorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9lcyBub3Qgc3VwcG9ydCB7QGNvZGUgbnVsbH0gdmFsdWVzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyB2YWx1ZUZvcihTdHJpbmcgdGVtcGxhdGVWYXJpYWJsZSwgU3RyaW5nIG1hdGNoZWRHcm91cCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBmb3IgbWF0Y2hpbmcgVVJJIHRlbXBsYXRlcyBhbmQgbmFtZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBURU1QTEFURV9OQU1FU19QQVRURVJOID0gUGF0dGVybi5jb21waWxlKCJcXHsoW1xcd1xcPztdWy1cXHdcXC4sXSopXFx9Iik7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZW1wdHkgVVJJIHRlbXBsYXRlIHRoYXQgbWF0Y2hlcyB0aGUge0Bjb2RlIG51bGx9IG9yIGVtcHR5IFVSSSBwYXRoLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVXJpVGVtcGxhdGUgRU1QVFkgPSBuZXcgVXJpVGVtcGxhdGUoKTsKKyAgICAvKioKKyAgICAgKiBUaGUgVVJJIHRlbXBsYXRlLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHRlbXBsYXRlOworICAgIC8qKgorICAgICAqIFRoZSBub3JtYWxpemVkIFVSSSB0ZW1wbGF0ZS4gQW55IGV4cGxpY2l0IHJlZ2V4IGFyZSByZW1vdmVkIHRvIGxlYXZlCisgICAgICogdGhlIHRlbXBsYXRlIHZhcmlhYmxlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBub3JtYWxpemVkVGVtcGxhdGU7CisgICAgLyoqCisgICAgICogVGhlIHBhdHRlcm4gZ2VuZXJhdGVkIGZyb20gdGhlIHRlbXBsYXRlLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgUGF0dGVybldpdGhHcm91cHMgcGF0dGVybjsKKyAgICAvKioKKyAgICAgKiBUcnVlIGlmIHRoZSBVUkkgdGVtcGxhdGUgZW5kcyBpbiBhICcvJyBjaGFyYWN0ZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGVuZHNXaXRoU2xhc2g7CisgICAgLyoqCisgICAgICogVGhlIHRlbXBsYXRlIHZhcmlhYmxlcyBpbiB0aGUgVVJJIHRlbXBsYXRlLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgTGlzdDxTdHJpbmc+IHRlbXBsYXRlVmFyaWFibGVzOworICAgIC8qKgorICAgICAqIFRoZSBudW1iZXIgb2YgZXhwbGljaXQgcmVndWxhciBleHByZXNzaW9ucyBkZWNsYXJlZCBmb3IgdGVtcGxhdGUKKyAgICAgKiB2YXJpYWJsZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbnVtT2ZFeHBsaWNpdFJlZ2V4ZXM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbiBncm91cHMgaW4gdGhpcyBwYXR0ZXJuLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgaW50IG51bU9mUmVnZXhHcm91cHM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBub3QgcmVzdWx0aW5nCisgICAgICogZnJvbSBjb252ZXJzaW9uIG9mIHRlbXBsYXRlIHZhcmlhYmxlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGludCBudW1PZkNoYXJhY3RlcnM7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3Ige0Bjb2RlIE5VTEx9IHRlbXBsYXRlLgorICAgICAqLworICAgIHByaXZhdGUgVXJpVGVtcGxhdGUoKSB7CisgICAgICAgIHRoaXMudGVtcGxhdGUgPSB0aGlzLm5vcm1hbGl6ZWRUZW1wbGF0ZSA9ICIiOworICAgICAgICB0aGlzLnBhdHRlcm4gPSBQYXR0ZXJuV2l0aEdyb3Vwcy5FTVBUWTsKKyAgICAgICAgdGhpcy5lbmRzV2l0aFNsYXNoID0gZmFsc2U7CisgICAgICAgIHRoaXMudGVtcGxhdGVWYXJpYWJsZXMgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICAgICAgdGhpcy5udW1PZkV4cGxpY2l0UmVnZXhlcyA9IHRoaXMubnVtT2ZDaGFyYWN0ZXJzID0gdGhpcy5udW1PZlJlZ2V4R3JvdXBzID0gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgVVJJIHRlbXBsYXRlLgorICAgICAqIDxwPgorICAgICAqIFRoZSB0ZW1wbGF0ZSB3aWxsIGJlIHBhcnNlZCB0byBleHRyYWN0IHRlbXBsYXRlIHZhcmlhYmxlcy4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogQSBzcGVjaWZpYyByZWd1bGFyIGV4cHJlc3Npb24gd2lsbCBiZSBnZW5lcmF0ZWQgZnJvbSB0aGUgdGVtcGxhdGUKKyAgICAgKiB0byBtYXRjaCBVUklzIGFjY29yZGluZyB0byB0aGUgdGVtcGxhdGUgYW5kIG1hcCB0ZW1wbGF0ZSB2YXJpYWJsZXMgdG8KKyAgICAgKiB0ZW1wbGF0ZSB2YWx1ZXMuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHRlbXBsYXRlIHRoZSB0ZW1wbGF0ZS4KKyAgICAgKiBAdGhyb3dzIFBhdHRlcm5TeW50YXhFeGNlcHRpb24gICBpZiB0aGUgc3BlY2lmaWVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVndWxhciBleHByZXNzaW9uIGNvdWxkIG5vdCBiZSBnZW5lcmF0ZWQKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgdGVtcGxhdGUgaXMge0Bjb2RlIG51bGx9IG9yCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW4gZW1wdHkgc3RyaW5nLgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJEdXBsaWNhdGVUaHJvd3MiKQorICAgIHB1YmxpYyBVcmlUZW1wbGF0ZShTdHJpbmcgdGVtcGxhdGUpIHRocm93cyBQYXR0ZXJuU3ludGF4RXhjZXB0aW9uLCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgICAgICB0aGlzKG5ldyBVcmlUZW1wbGF0ZVBhcnNlcih0ZW1wbGF0ZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBVUkkgdGVtcGxhdGUuCisgICAgICogPHA+CisgICAgICogVGhlIHRlbXBsYXRlIHdpbGwgYmUgcGFyc2VkIHRvIGV4dHJhY3QgdGVtcGxhdGUgdmFyaWFibGVzLgorICAgICAqIDxwPgorICAgICAqIEEgc3BlY2lmaWMgcmVndWxhciBleHByZXNzaW9uIHdpbGwgYmUgZ2VuZXJhdGVkIGZyb20gdGhlIHRlbXBsYXRlCisgICAgICogdG8gbWF0Y2ggVVJJcyBhY2NvcmRpbmcgdG8gdGhlIHRlbXBsYXRlIGFuZCBtYXAgdGVtcGxhdGUgdmFyaWFibGVzIHRvCisgICAgICogdGVtcGxhdGUgdmFsdWVzLgorICAgICAqIDxwPgorICAgICAqCisgICAgICogQHBhcmFtIHRlbXBsYXRlUGFyc2VyIHRoZSBwYXJzZXIgdG8gcGFyc2UgdGhlIHRlbXBsYXRlLgorICAgICAqIEB0aHJvd3MgUGF0dGVyblN5bnRheEV4Y2VwdGlvbiAgIGlmIHRoZSBzcGVjaWZpZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWd1bGFyIGV4cHJlc3Npb24gY291bGQgbm90IGJlIGdlbmVyYXRlZAorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSB0ZW1wbGF0ZSBpcyB7QGNvZGUgbnVsbH0gb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbiBlbXB0eSBzdHJpbmcuCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoIkR1cGxpY2F0ZVRocm93cyIpCisgICAgcHJvdGVjdGVkIFVyaVRlbXBsYXRlKFVyaVRlbXBsYXRlUGFyc2VyIHRlbXBsYXRlUGFyc2VyKSB0aHJvd3MgUGF0dGVyblN5bnRheEV4Y2VwdGlvbiwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy50ZW1wbGF0ZSA9IHRlbXBsYXRlUGFyc2VyLmdldFRlbXBsYXRlKCk7CisKKyAgICAgICAgdGhpcy5ub3JtYWxpemVkVGVtcGxhdGUgPSB0ZW1wbGF0ZVBhcnNlci5nZXROb3JtYWxpemVkVGVtcGxhdGUoKTsKKworICAgICAgICB0aGlzLnBhdHRlcm4gPSBpbml0VXJpUGF0dGVybih0ZW1wbGF0ZVBhcnNlcik7CisKKyAgICAgICAgdGhpcy5udW1PZkV4cGxpY2l0UmVnZXhlcyA9IHRlbXBsYXRlUGFyc2VyLmdldE51bWJlck9mRXhwbGljaXRSZWdleGVzKCk7CisKKyAgICAgICAgdGhpcy5udW1PZlJlZ2V4R3JvdXBzID0gdGVtcGxhdGVQYXJzZXIuZ2V0TnVtYmVyT2ZSZWdleEdyb3VwcygpOworCisgICAgICAgIHRoaXMubnVtT2ZDaGFyYWN0ZXJzID0gdGVtcGxhdGVQYXJzZXIuZ2V0TnVtYmVyT2ZMaXRlcmFsQ2hhcmFjdGVycygpOworCisgICAgICAgIHRoaXMuZW5kc1dpdGhTbGFzaCA9IHRlbXBsYXRlLmNoYXJBdCh0ZW1wbGF0ZS5sZW5ndGgoKSAtIDEpID09ICcvJzsKKworICAgICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVzID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCh0ZW1wbGF0ZVBhcnNlci5nZXROYW1lcygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgdGhlIFVSSSBwYXR0ZXJuIGZyb20gYSBVUkkgdGVtcGxhdGUgcGFyc2VyLgorICAgICAqCisgICAgICogQHBhcmFtIHRlbXBsYXRlUGFyc2VyIHRoZSBVUkkgdGVtcGxhdGUgcGFyc2VyLgorICAgICAqIEByZXR1cm4gdGhlIFVSSSBwYXR0ZXJuLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFBhdHRlcm5XaXRoR3JvdXBzIGluaXRVcmlQYXR0ZXJuKFVyaVRlbXBsYXRlUGFyc2VyIHRlbXBsYXRlUGFyc2VyKSB7CisgICAgICAgIHJldHVybiBuZXcgUGF0dGVybldpdGhHcm91cHModGVtcGxhdGVQYXJzZXIuZ2V0UGF0dGVybigpLCB0ZW1wbGF0ZVBhcnNlci5nZXRHcm91cEluZGV4ZXMoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzb2x2ZSBhIHJlbGF0aXZlIFVSSSByZWZlcmVuY2UgYWdhaW5zdCBhIGJhc2UgVVJJIGFzIGRlZmluZWQgaW4KKyAgICAgKiA8YSBocmVmPSJodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tNS40Ij5SRkMgMzk4NjwvYT4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmFzZVVyaSBiYXNlIFVSSSB0byBiZSB1c2VkIGZvciByZXNvbHV0aW9uLgorICAgICAqIEBwYXJhbSByZWZVcmkgIHJlZmVyZW5jZSBVUkkgc3RyaW5nIHRvIGJlIHJlc29sdmVkIGFnYWluc3QgdGhlIGJhc2UgVVJJLgorICAgICAqIEByZXR1cm4gcmVzb2x2ZWQgVVJJLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gSWYgdGhlIGdpdmVuIHN0cmluZyB2aW9sYXRlcyB0aGUgVVJJIHNwZWNpZmljYXRpb24gUkZDLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgVVJJIHJlc29sdmUoZmluYWwgVVJJIGJhc2VVcmksIFN0cmluZyByZWZVcmkpIHsKKyAgICAgICAgcmV0dXJuIHJlc29sdmUoYmFzZVVyaSwgVVJJLmNyZWF0ZShyZWZVcmkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNvbHZlIGEgcmVsYXRpdmUgVVJJIHJlZmVyZW5jZSBhZ2FpbnN0IGEgYmFzZSBVUkkgYXMgZGVmaW5lZCBpbgorICAgICAqIDxhIGhyZWY9Imh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM5ODYjc2VjdGlvbi01LjQiPlJGQyAzOTg2PC9hPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiYXNlVXJpIGJhc2UgVVJJIHRvIGJlIHVzZWQgZm9yIHJlc29sdXRpb24uCisgICAgICogQHBhcmFtIHJlZlVyaSAgcmVmZXJlbmNlIFVSSSB0byBiZSByZXNvbHZlZCBhZ2FpbnN0IHRoZSBiYXNlIFVSSS4KKyAgICAgKiBAcmV0dXJuIHJlc29sdmVkIFVSSS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFVSSSByZXNvbHZlKGZpbmFsIFVSSSBiYXNlVXJpLCBVUkkgcmVmVXJpKSB7CisgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsKGJhc2VVcmksICJJbnB1dCBiYXNlIFVSSSBwYXJhbWV0ZXIgbXVzdCBub3QgYmUgbnVsbC4iKTsKKyAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGwocmVmVXJpLCAiSW5wdXQgcmVmZXJlbmNlIFVSSSBwYXJhbWV0ZXIgbXVzdCBub3QgYmUgbnVsbC4iKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgcmVmU3RyaW5nID0gcmVmVXJpLnRvU3RyaW5nKCk7CisgICAgICAgIGlmIChyZWZTdHJpbmcuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAvLyB3ZSBuZWVkIHNvbWV0aGluZyB0byByZXNvbHZlIGFnYWluc3QKKyAgICAgICAgICAgIHJlZlVyaSA9IFVSSS5jcmVhdGUoIiMiKTsKKyAgICAgICAgfSBlbHNlIGlmIChyZWZTdHJpbmcuc3RhcnRzV2l0aCgiPyIpKSB7CisgICAgICAgICAgICBTdHJpbmcgYmFzZVN0cmluZyA9IGJhc2VVcmkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBxSW5kZXggPSBiYXNlU3RyaW5nLmluZGV4T2YoJz8nKTsKKyAgICAgICAgICAgIGJhc2VTdHJpbmcgPSBxSW5kZXggPiAtMSA/IGJhc2VTdHJpbmcuc3Vic3RyaW5nKDAsIHFJbmRleCkgOiBiYXNlU3RyaW5nOworICAgICAgICAgICAgcmV0dXJuIFVSSS5jcmVhdGUoYmFzZVN0cmluZyArIHJlZlN0cmluZyk7CisgICAgICAgIH0KKworICAgICAgICBVUkkgcmVzdWx0ID0gYmFzZVVyaS5yZXNvbHZlKHJlZlVyaSk7CisgICAgICAgIGlmIChyZWZTdHJpbmcuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVzb2x2ZWRTdHJpbmcgPSByZXN1bHQudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IFVSSS5jcmVhdGUocmVzb2x2ZWRTdHJpbmcuc3Vic3RyaW5nKDAsIHJlc29sdmVkU3RyaW5nLmluZGV4T2YoJyMnKSkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZShyZXN1bHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vcm1hbGl6ZSB0aGUgVVJJIGJ5IHJlc29sdmUgdGhlIGRvdCAmIGRvdC1kb3QgcGF0aCBzZWdtZW50cyBhcyBkZXNjcmliZWQgaW4KKyAgICAgKiA8YSBocmVmPSJodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tNS4yLjQiPlJGQyAzOTg2PC9hPi4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGEgd29ya2Fyb3VuZCBmb3IgaXNzdWVzIHdpdGgge0BsaW5rIGphdmEubmV0LlVSSSNub3JtYWxpemUoKX0gd2hpY2gKKyAgICAgKiBpcyBub3QgYWJsZSB0byBwcm9wZXJseSBub3JtYWxpemUgYWJzb2x1dGUgcGF0aHMgdGhhdCBzdGFydCB3aXRoIGEge0Bjb2RlICIuLiJ9IHNlZ21lbnQsCisgICAgICogZS5nLiB7QGNvZGUgIi8uLi9hL2IifSBhcyByZXF1aXJlZCBieSBSRkMgMzk4NiAoYWNjb3JkaW5nIHRvIFJGQyAzOTg2IHRoZSBwYXRoIHtAY29kZSAiLy4uL2EvYiJ9CisgICAgICogc2hvdWxkIHJlc29sdmUgdG8ge0Bjb2RlICIvYS9iIn0sIHdoaWxlIHtAY29kZSBVUkkubm9ybWFsaXplKCl9IGtlZXBzIHRoZSB7QGNvZGUgIi4uIn0gc2VnbWVudAorICAgICAqIGluIHRoZSBVUkkgcGF0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgdGhlIG9yaWdpbmFsIFVSSSBzdHJpbmcuCisgICAgICogQHJldHVybiB0aGUgVVJJIHdpdGggZG90IGFuZCBkb3QtZG90IHNlZ21lbnRzIHJlc29sdmVkLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gSWYgdGhlIGdpdmVuIHN0cmluZyB2aW9sYXRlcyB0aGUgVVJJIHNwZWNpZmljYXRpb24gUkZDLgorICAgICAqIEBzZWUgamF2YS5uZXQuVVJJI25vcm1hbGl6ZSgpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBVUkkgbm9ybWFsaXplKGZpbmFsIFN0cmluZyB1cmkpIHsKKyAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZShVUkkuY3JlYXRlKHVyaSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vcm1hbGl6ZSB0aGUgVVJJIGJ5IHJlc29sdmUgdGhlIGRvdCAmIGRvdC1kb3QgcGF0aCBzZWdtZW50cyBhcyBkZXNjcmliZWQgaW4KKyAgICAgKiA8YSBocmVmPSJodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tNS4yLjQiPlJGQyAzOTg2PC9hPi4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGEgd29ya2Fyb3VuZCBmb3IgaXNzdWVzIHdpdGgge0BsaW5rIGphdmEubmV0LlVSSSNub3JtYWxpemUoKX0gd2hpY2gKKyAgICAgKiBpcyBub3QgYWJsZSB0byBwcm9wZXJseSBub3JtYWxpemUgYWJzb2x1dGUgcGF0aHMgdGhhdCBzdGFydCB3aXRoIGEge0Bjb2RlICIuLiJ9IHNlZ21lbnQsCisgICAgICogZS5nLiB7QGNvZGUgIi8uLi9hL2IifSBhcyByZXF1aXJlZCBieSBSRkMgMzk4NiAoYWNjb3JkaW5nIHRvIFJGQyAzOTg2IHRoZSBwYXRoIHtAY29kZSAiLy4uL2EvYiJ9CisgICAgICogc2hvdWxkIHJlc29sdmUgdG8ge0Bjb2RlICIvYS9iIn0sIHdoaWxlIHtAY29kZSBVUkkubm9ybWFsaXplKCl9IGtlZXBzIHRoZSB7QGNvZGUgIi4uIn0gc2VnbWVudAorICAgICAqIGluIHRoZSBVUkkgcGF0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgdGhlIG9yaWdpbmFsIFVSSS4KKyAgICAgKiBAcmV0dXJuIHRoZSBVUkkgd2l0aCBkb3QgYW5kIGRvdC1kb3Qgc2VnbWVudHMgcmVzb2x2ZWQuCisgICAgICoKKyAgICAgKiBAc2VlIGphdmEubmV0LlVSSSNub3JtYWxpemUoKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgVVJJIG5vcm1hbGl6ZShmaW5hbCBVUkkgdXJpKSB7CisgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsKHVyaSwgIklucHV0IHJlZmVyZW5jZSBVUkkgcGFyYW1ldGVyIG11c3Qgbm90IGJlIG51bGwuIik7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHBhdGggPSB1cmkuZ2V0UGF0aCgpOworCisgICAgICAgIGlmIChwYXRoID09IG51bGwgfHwgcGF0aC5pc0VtcHR5KCkgfHwgIXBhdGguY29udGFpbnMoIi8uIikpIHsKKyAgICAgICAgICAgIHJldHVybiB1cmk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBTdHJpbmdbXSBzZWdtZW50cyA9IHBhdGguc3BsaXQoIi8iKTsKKyAgICAgICAgZmluYWwgRGVxdWU8U3RyaW5nPiByZXNvbHZlZFNlZ21lbnRzID0gbmV3IEFycmF5RGVxdWU8U3RyaW5nPihzZWdtZW50cy5sZW5ndGgpOworCisgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIHNlZ21lbnQgOiBzZWdtZW50cykgeworICAgICAgICAgICAgaWYgKHNlZ21lbnQuaXNFbXB0eSgpIHx8ICIuIi5lcXVhbHMoc2VnbWVudCkpIHsKKyAgICAgICAgICAgICAgICAvLyBza2lwCisgICAgICAgICAgICB9IGVsc2UgaWYgKCIuLiIuZXF1YWxzKHNlZ21lbnQpKSB7CisgICAgICAgICAgICAgICAgcmVzb2x2ZWRTZWdtZW50cy5wb2xsTGFzdCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXNvbHZlZFNlZ21lbnRzLm9mZmVyKHNlZ21lbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBwYXRoQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIHNlZ21lbnQgOiByZXNvbHZlZFNlZ21lbnRzKSB7CisgICAgICAgICAgICBwYXRoQnVpbGRlci5hcHBlbmQoJy8nKS5hcHBlbmQoc2VnbWVudCk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcmVzdWx0U3RyaW5nID0gY3JlYXRlVVJJV2l0aFN0cmluZ1ZhbHVlcyh1cmkuZ2V0U2NoZW1lKCksCisgICAgICAgICAgICAgICAgdXJpLmdldEF1dGhvcml0eSgpLAorICAgICAgICAgICAgICAgIG51bGwsCisgICAgICAgICAgICAgICAgbnVsbCwKKyAgICAgICAgICAgICAgICBudWxsLAorICAgICAgICAgICAgICAgIHBhdGhCdWlsZGVyLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgdXJpLmdldFF1ZXJ5KCksCisgICAgICAgICAgICAgICAgdXJpLmdldEZyYWdtZW50KCksCisgICAgICAgICAgICAgICAgRU1QVFlfVkFMVUVTLAorICAgICAgICAgICAgICAgIGZhbHNlLAorICAgICAgICAgICAgICAgIGZhbHNlKTsKKworICAgICAgICByZXR1cm4gVVJJLmNyZWF0ZShyZXN1bHRTdHJpbmcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlbGF0aXZpemUgVVJJIHdpdGggcmVzcGVjdCB0byBhIGJhc2UgVVJJLgorICAgICAqCisgICAgICogQWZ0ZXIgdGhlIHJlbGF0aXZpemF0aW9uIGlzIGRvbmUsIGRvdHMgaW4gcGF0aHMgb2YgYm90aCBVUklzIGFyZSB7QGxpbmsgI25vcm1hbGl6ZShqYXZhLm5ldC5VUkkpIHJlc29sdmVkfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiYXNlVXJpIGJhc2UgVVJJIHRvIGJlIHVzZWQgZm9yIHJlbGF0aXZpemF0aW9uLgorICAgICAqIEBwYXJhbSByZWZVcmkgIFVSSSB0byBiZSByZWxhdGl2aXplZC4KKyAgICAgKiBAcmV0dXJuIHJlbGF0aXZpemVkIFVSSS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFVSSSByZWxhdGl2aXplKFVSSSBiYXNlVXJpLCBVUkkgcmVmVXJpKSB7CisgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsKGJhc2VVcmksICJJbnB1dCBiYXNlIFVSSSBwYXJhbWV0ZXIgbXVzdCBub3QgYmUgbnVsbC4iKTsKKyAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGwocmVmVXJpLCAiSW5wdXQgcmVmZXJlbmNlIFVSSSBwYXJhbWV0ZXIgbXVzdCBub3QgYmUgbnVsbC4iKTsKKworICAgICAgICByZXR1cm4gbm9ybWFsaXplKGJhc2VVcmkucmVsYXRpdml6ZShyZWZVcmkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIFVSSSB0ZW1wbGF0ZSBhcyBhIFN0cmluZy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIFVSSSB0ZW1wbGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFRlbXBsYXRlKCkgeworICAgICAgICByZXR1cm4gdGVtcGxhdGU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIFVSSSBwYXR0ZXJuLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgVVJJIHBhdHRlcm4uCisgICAgICovCisgICAgcHVibGljIGZpbmFsIFBhdHRlcm5XaXRoR3JvdXBzIGdldFBhdHRlcm4oKSB7CisgICAgICAgIHJldHVybiBwYXR0ZXJuOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIHRoZSBVUkkgdGVtcGxhdGUgZW5kcyBpbiBhIHNsYXNoICh7QGNvZGUgJy8nfSkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgdGVtcGxhdGUgZW5kcyBpbiBhICcvJywgb3RoZXJ3aXNlIGZhbHNlLgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJVbnVzZWREZWNsYXJhdGlvbiIpCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gZW5kc1dpdGhTbGFzaCgpIHsKKyAgICAgICAgcmV0dXJuIGVuZHNXaXRoU2xhc2g7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsaXN0IG9mIHRlbXBsYXRlIHZhcmlhYmxlcyBmb3IgdGhlIHRlbXBsYXRlLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbGlzdCBvZiB0ZW1wbGF0ZSB2YXJpYWJsZXMuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIExpc3Q8U3RyaW5nPiBnZXRUZW1wbGF0ZVZhcmlhYmxlcygpIHsKKyAgICAgICAgcmV0dXJuIHRlbXBsYXRlVmFyaWFibGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzY2VydGFpbiBpZiBhIHRlbXBsYXRlIHZhcmlhYmxlIGlzIGEgbWVtYmVyIG9mIHRoaXMKKyAgICAgKiB0ZW1wbGF0ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIG5hbWUgVGhlIHRlbXBsYXRlIHZhcmlhYmxlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSB0ZW1wbGF0ZSB2YXJpYWJsZSBpcyBhIG1lbWJlciBvZiB0aGUgdGVtcGxhdGUsIG90aGVyd2lzZSB7QGNvZGUgZmFsc2V9LgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJVbnVzZWREZWNsYXJhdGlvbiIpCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNUZW1wbGF0ZVZhcmlhYmxlUHJlc2VudChTdHJpbmcgbmFtZSkgeworICAgICAgICBmb3IgKFN0cmluZyBzIDogdGVtcGxhdGVWYXJpYWJsZXMpIHsKKyAgICAgICAgICAgIGlmIChzLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbnVtYmVyIG9mIGV4cGxpY2l0IHJlZ3VsYXIgZXhwcmVzc2lvbnMgZGVjbGFyZWQgaW4gdGhlIHRlbXBsYXRlIHZhcmlhYmxlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBleHBsaWNpdCByZWd1bGFyIGV4cHJlc3Npb25zIGluIHRoZSB0ZW1wbGF0ZSB2YXJpYWJsZXMuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGludCBnZXROdW1iZXJPZkV4cGxpY2l0UmVnZXhlcygpIHsKKyAgICAgICAgcmV0dXJuIG51bU9mRXhwbGljaXRSZWdleGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbnVtYmVyIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbiBncm91cHMKKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiByZWd1bGFyIGV4cHJlc3Npb25zIGdyb3VwcworICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0TnVtYmVyT2ZSZWdleEdyb3VwcygpIHsKKyAgICAgICAgcmV0dXJuIG51bU9mUmVnZXhHcm91cHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgcmVndWxhciBleHByZXNzaW9uIG5vdCByZXN1bHRpbmcKKyAgICAgKiBmcm9tIGNvbnZlcnNpb24gb2YgdGVtcGxhdGUgdmFyaWFibGVzLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGV4cGxpY2l0IGNoYXJhY3RlcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IGdldE51bWJlck9mRXhwbGljaXRDaGFyYWN0ZXJzKCkgeworICAgICAgICByZXR1cm4gbnVtT2ZDaGFyYWN0ZXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbnVtYmVyIG9mIHRlbXBsYXRlIHZhcmlhYmxlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiB0ZW1wbGF0ZSB2YXJpYWJsZXMuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGludCBnZXROdW1iZXJPZlRlbXBsYXRlVmFyaWFibGVzKCkgeworICAgICAgICByZXR1cm4gdGVtcGxhdGVWYXJpYWJsZXMuc2l6ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1hdGNoIGEgVVJJIGFnYWluc3QgdGhlIHRlbXBsYXRlLgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSBVUkkgbWF0Y2hlcyBhZ2FpbnN0IHRoZSBwYXR0ZXJuIHRoZW4gdGhlIHRlbXBsYXRlIHZhcmlhYmxlIHRvIHZhbHVlCisgICAgICogbWFwIHdpbGwgYmUgZmlsbGVkIHdpdGggdGVtcGxhdGUgdmFyaWFibGVzIGFzIGtleXMgYW5kIHRlbXBsYXRlIHZhbHVlcyBhcworICAgICAqIHZhbHVlcy4KKyAgICAgKiA8cD4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgICAgICAgICAgICAgICAgICAgICB0aGUgdXJpIHRvIG1hdGNoIGFnYWluc3QgdGhlIHRlbXBsYXRlLgorICAgICAqIEBwYXJhbSB0ZW1wbGF0ZVZhcmlhYmxlVG9WYWx1ZSB0aGUgbWFwIHdoZXJlIHRvIHB1dCB0ZW1wbGF0ZSB2YXJpYWJsZXMgKGFzIGtleXMpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCB0ZW1wbGF0ZSB2YWx1ZXMgKGFzIHZhbHVlcykuIFRoZSBtYXAgaXMgY2xlYXJlZCBiZWZvcmUgYW55CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJpZXMgYXJlIHB1dC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIFVSSSBtYXRjaGVzIHRoZSB0ZW1wbGF0ZSwgb3RoZXJ3aXNlIGZhbHNlLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHVyaSBvcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVmFyaWFibGVUb1ZhbHVlIGlzIG51bGwuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gbWF0Y2goQ2hhclNlcXVlbmNlIHVyaSwgTWFwPFN0cmluZywgU3RyaW5nPiB0ZW1wbGF0ZVZhcmlhYmxlVG9WYWx1ZSkgdGhyb3dzCisgICAgICAgICAgICBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgICAgICBpZiAodGVtcGxhdGVWYXJpYWJsZVRvVmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHBhdHRlcm4ubWF0Y2godXJpLCB0ZW1wbGF0ZVZhcmlhYmxlcywgdGVtcGxhdGVWYXJpYWJsZVRvVmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1hdGNoIGEgVVJJIGFnYWluc3QgdGhlIHRlbXBsYXRlLgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSBVUkkgbWF0Y2hlcyBhZ2FpbnN0IHRoZSBwYXR0ZXJuIHRoZSBjYXB0dXJpbmcgZ3JvdXAgdmFsdWVzIChpZiBhbnkpCisgICAgICogd2lsbCBiZSBhZGRlZCB0byBhIGxpc3QgcGFzc2VkIGluIGFzIHBhcmFtZXRlci4KKyAgICAgKiA8cD4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgICAgICAgICB0aGUgdXJpIHRvIG1hdGNoIGFnYWluc3QgdGhlIHRlbXBsYXRlLgorICAgICAqIEBwYXJhbSBncm91cFZhbHVlcyB0aGUgbGlzdCB0byBzdG9yZSB0aGUgdmFsdWVzIG9mIGEgcGF0dGVybidzCisgICAgICogICAgICAgICAgICAgICAgICAgIGNhcHR1cmluZyBncm91cHMgaXMgbWF0Y2hpbmcgaXMgc3VjY2Vzc2Z1bC4gVGhlIHZhbHVlcyBhcmUgc3RvcmVkCisgICAgICogICAgICAgICAgICAgICAgICAgIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBwYXR0ZXJuJ3MgY2FwdHVyaW5nIGdyb3Vwcy4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIFVSSSBtYXRjaGVzIHRoZSB0ZW1wbGF0ZSwgb3RoZXJ3aXNlIGZhbHNlLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIHVyaSBvcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVmFyaWFibGVUb1ZhbHVlIGlzIG51bGwuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gbWF0Y2goQ2hhclNlcXVlbmNlIHVyaSwgTGlzdDxTdHJpbmc+IGdyb3VwVmFsdWVzKSB0aHJvd3MKKyAgICAgICAgICAgIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChncm91cFZhbHVlcyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcGF0dGVybi5tYXRjaCh1cmksIGdyb3VwVmFsdWVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBVUkkgYnkgc3Vic3RpdHV0aW5nIGFueSB0ZW1wbGF0ZSB2YXJpYWJsZXMKKyAgICAgKiBmb3IgY29ycmVzcG9uZGluZyB0ZW1wbGF0ZSB2YWx1ZXMuCisgICAgICogPHA+CisgICAgICogQSBVUkkgdGVtcGxhdGUgdmFyaWFibGUgd2l0aG91dCBhIHZhbHVlIHdpbGwgYmUgc3Vic3RpdHV0ZWQgYnkgdGhlCisgICAgICogZW1wdHkgc3RyaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlcyB0aGUgbWFwIG9mIHRlbXBsYXRlIHZhcmlhYmxlcyB0byB0ZW1wbGF0ZSB2YWx1ZXMuCisgICAgICogQHJldHVybiB0aGUgVVJJLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgY3JlYXRlVVJJKGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gdmFsdWVzKSB7CisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICByZXNvbHZlVGVtcGxhdGUobm9ybWFsaXplZFRlbXBsYXRlLCBzYiwgbmV3IFRlbXBsYXRlVmFsdWVTdHJhdGVneSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyB2YWx1ZUZvcihTdHJpbmcgdGVtcGxhdGVWYXJpYWJsZSwgU3RyaW5nIG1hdGNoZWRHcm91cCkgeworICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZXMuZ2V0KHRlbXBsYXRlVmFyaWFibGUpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgVVJJIGJ5IHN1YnN0aXR1dGluZyBhbnkgdGVtcGxhdGUgdmFyaWFibGVzCisgICAgICogZm9yIGNvcnJlc3BvbmRpbmcgdGVtcGxhdGUgdmFsdWVzLgorICAgICAqIDxwPgorICAgICAqIEEgVVJJIHRlbXBsYXRlIHZhcmlhYmxlIHdpdGhvdXQgYSB2YWx1ZSB3aWxsIGJlIHN1YnN0aXR1dGVkIGJ5IHRoZQorICAgICAqIGVtcHR5IHN0cmluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZXMgdGhlIGFycmF5IG9mIHRlbXBsYXRlIHZhbHVlcy4gVGhlIHZhbHVlcyB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICBzdWJzdGl0dXRlZCBpbiBvcmRlciBvZiBvY2N1cnJlbmNlIG9mIHVuaXF1ZSB0ZW1wbGF0ZSB2YXJpYWJsZXMuCisgICAgICogQHJldHVybiB0aGUgVVJJLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgY3JlYXRlVVJJKFN0cmluZy4uLiB2YWx1ZXMpIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZVVSSSh2YWx1ZXMsIDAsIHZhbHVlcy5sZW5ndGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIFVSSSBieSBzdWJzdGl0dXRpbmcgYW55IHRlbXBsYXRlIHZhcmlhYmxlcworICAgICAqIGZvciBjb3JyZXNwb25kaW5nIHRlbXBsYXRlIHZhbHVlcy4KKyAgICAgKiA8cD4KKyAgICAgKiBBIFVSSSB0ZW1wbGF0ZSB2YXJpYWJsZSB3aXRob3V0IGEgdmFsdWUgd2lsbCBiZSBzdWJzdGl0dXRlZCBieSB0aGUKKyAgICAgKiBlbXB0eSBzdHJpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWVzIHRoZSBhcnJheSBvZiB0ZW1wbGF0ZSB2YWx1ZXMuIFRoZSB2YWx1ZXMgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgc3Vic3RpdHV0ZWQgaW4gb3JkZXIgb2Ygb2NjdXJyZW5jZSBvZiB1bmlxdWUgdGVtcGxhdGUgdmFyaWFibGVzLgorICAgICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCBpbnRvIHRoZSB0ZW1wbGF0ZSB2YWx1ZSBhcnJheS4KKyAgICAgKiBAcGFyYW0gbGVuZ3RoIHRoZSBsZW5ndGggb2YgdGhlIHRlbXBsYXRlIHZhbHVlIGFycmF5LgorICAgICAqIEByZXR1cm4gdGhlIFVSSS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGNyZWF0ZVVSSShmaW5hbCBTdHJpbmdbXSB2YWx1ZXMsIGZpbmFsIGludCBvZmZzZXQsIGZpbmFsIGludCBsZW5ndGgpIHsKKworICAgICAgICBUZW1wbGF0ZVZhbHVlU3RyYXRlZ3kgbnMgPSBuZXcgVGVtcGxhdGVWYWx1ZVN0cmF0ZWd5KCkgeworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbGVuZ3RoUGx1c09mZnNldCA9IGxlbmd0aCArIG9mZnNldDsKKyAgICAgICAgICAgIHByaXZhdGUgaW50IHYgPSBvZmZzZXQ7CisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gbWFwVmFsdWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyB2YWx1ZUZvcihTdHJpbmcgdGVtcGxhdGVWYXJpYWJsZSwgU3RyaW5nIG1hdGNoZWRHcm91cCkgeworICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIGEgdGVtcGxhdGUgdmFyaWFibGUgaGFzIGFscmVhZHkgb2NjdXJyZWQKKyAgICAgICAgICAgICAgICAvLyBJZiBzbyB1c2UgdGhlIHZhbHVlIHRvIGVuc3VyZSB0aGF0IHR3byBvciBtb3JlIGRlY2xhcmF0aW9ucyBvZgorICAgICAgICAgICAgICAgIC8vIGEgdGVtcGxhdGUgdmFyaWFibGUgaGF2ZSB0aGUgc2FtZSB2YWx1ZQorICAgICAgICAgICAgICAgIFN0cmluZyB0VmFsdWUgPSBtYXBWYWx1ZXMuZ2V0KHRlbXBsYXRlVmFyaWFibGUpOworICAgICAgICAgICAgICAgIGlmICh0VmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAodiA8IGxlbmd0aFBsdXNPZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRWYWx1ZSA9IHZhbHVlc1t2KytdOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwVmFsdWVzLnB1dCh0ZW1wbGF0ZVZhcmlhYmxlLCB0VmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIHRWYWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgcmVzb2x2ZVRlbXBsYXRlKG5vcm1hbGl6ZWRUZW1wbGF0ZSwgc2IsIG5zKTsKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQnVpbGQgYSBVUkkgYmFzZWQgb24gdGhlIHBhcmFtZXRlcnMgcHJvdmlkZWQgYnkgdGhlIHZhcmlhYmxlIG5hbWUgc3RyYXRlZ3kuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbm9ybWFsaXplZFRlbXBsYXRlIG5vcm1hbGl6ZWQgVVJJIHRlbXBsYXRlLiBBIG5vcm1hbGl6ZWQgdGVtcGxhdGUgaXMgYSB0ZW1wbGF0ZSB3aXRob3V0IGFueSBleHBsaWNpdCByZWd1bGFyCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBleHByZXNzaW9ucy4KKyAgICAgKiBAcGFyYW0gYnVpbGRlciAgICAgICAgICAgIFVSSSBzdHJpbmcgYnVpbGRlciB0byBiZSB1c2VkLgorICAgICAqIEBwYXJhbSB2YWx1ZVN0cmF0ZWd5ICAgICAgVGhlIHRlbXBsYXRlIHZhbHVlIHByb2R1Y2VyIHN0cmF0ZWd5IHRvIHVzZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHJlc29sdmVUZW1wbGF0ZSgKKyAgICAgICAgICAgIFN0cmluZyBub3JtYWxpemVkVGVtcGxhdGUsCisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIsCisgICAgICAgICAgICBUZW1wbGF0ZVZhbHVlU3RyYXRlZ3kgdmFsdWVTdHJhdGVneSkgeworICAgICAgICAvLyBGaW5kIGFsbCB0ZW1wbGF0ZSB2YXJpYWJsZXMKKyAgICAgICAgTWF0Y2hlciBtID0gVEVNUExBVEVfTkFNRVNfUEFUVEVSTi5tYXRjaGVyKG5vcm1hbGl6ZWRUZW1wbGF0ZSk7CisKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICB3aGlsZSAobS5maW5kKCkpIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKG5vcm1hbGl6ZWRUZW1wbGF0ZSwgaSwgbS5zdGFydCgpKTsKKyAgICAgICAgICAgIFN0cmluZyB2YXJpYWJsZU5hbWUgPSBtLmdyb3VwKDEpOworICAgICAgICAgICAgLy8gVE9ETyBtYXRyaXgKKyAgICAgICAgICAgIGNoYXIgZmlyc3RDaGFyID0gdmFyaWFibGVOYW1lLmNoYXJBdCgwKTsKKyAgICAgICAgICAgIGlmIChmaXJzdENoYXIgPT0gJz8nIHx8IGZpcnN0Q2hhciA9PSAnOycpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBjaGFyIHByZWZpeDsKKyAgICAgICAgICAgICAgICBmaW5hbCBjaGFyIHNlcGFyYXRvcjsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW1wdHlWYWx1ZUFzc2lnbm1lbnQ7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0Q2hhciA9PSAnPycpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcXVlcnkKKyAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gJz8nOworICAgICAgICAgICAgICAgICAgICBzZXBhcmF0b3IgPSAnJic7CisgICAgICAgICAgICAgICAgICAgIGVtcHR5VmFsdWVBc3NpZ25tZW50ID0gIj0iOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG1hdHJpeAorICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSAnOyc7CisgICAgICAgICAgICAgICAgICAgIHNlcGFyYXRvciA9ICc7JzsKKyAgICAgICAgICAgICAgICAgICAgZW1wdHlWYWx1ZUFzc2lnbm1lbnQgPSAiIjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBidWlsZGVyLmxlbmd0aCgpOworICAgICAgICAgICAgICAgIFN0cmluZ1tdIHZhcmlhYmxlcyA9IHZhcmlhYmxlTmFtZS5zdWJzdHJpbmcoMSkuc3BsaXQoIiwgPyIpOworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHZhcmlhYmxlIDogdmFyaWFibGVzKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSB2YWx1ZVN0cmF0ZWd5LnZhbHVlRm9yKHZhcmlhYmxlLCBtLmdyb3VwKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT0gYnVpbGRlci5sZW5ndGgoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChzZXBhcmF0b3IpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHZhcmlhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGVtcHR5VmFsdWVBc3NpZ25tZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnPScpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHZhbHVlIGZvdW5kID0+IGlnbm9yZSB0aGUgdmFyaWFibGUKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPSBidWlsZGVyLmxlbmd0aCgpICYmIChpbmRleCA9PSAwIHx8IGJ1aWxkZXIuY2hhckF0KGluZGV4IC0gMSkgIT0gcHJlZml4KSkgeworICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmluc2VydChpbmRleCwgcHJlZml4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHZhbHVlU3RyYXRlZ3kudmFsdWVGb3IodmFyaWFibGVOYW1lLCBtLmdyb3VwKCkpOworCisgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQodmFsdWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaSA9IG0uZW5kKCk7CisgICAgICAgIH0KKyAgICAgICAgYnVpbGRlci5hcHBlbmQobm9ybWFsaXplZFRlbXBsYXRlLCBpLCBub3JtYWxpemVkVGVtcGxhdGUubGVuZ3RoKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBwYXR0ZXJuLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSGFzaCBjb2RlIGlzIGNhbGN1bGF0ZWQgZnJvbSBTdHJpbmcgb2YgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbgorICAgICAqIGdlbmVyYXRlZCBmcm9tIHRoZSB0ZW1wbGF0ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGhhc2ggY29kZS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gcGF0dGVybi5oYXNoQ29kZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVxdWFsaXR5IGlzIGNhbGN1bGF0ZWQgZnJvbSB0aGUgU3RyaW5nIG9mIHRoZSByZWd1bGFyIGV4cHJlc3Npb24KKyAgICAgKiBnZW5lcmF0ZWQgZnJvbSB0aGUgdGVtcGxhdGVzLgorICAgICAqCisgICAgICogQHBhcmFtIG8gdGhlIHJlZmVyZW5jZSBvYmplY3Qgd2l0aCB3aGljaCB0byBjb21wYXJlLgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBlcXVhbHMsIG90aGVyd2lzZSBmYWxzZS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBVcmlUZW1wbGF0ZSkgeworICAgICAgICAgICAgVXJpVGVtcGxhdGUgdGhhdCA9IChVcmlUZW1wbGF0ZSkgbzsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnBhdHRlcm4uZXF1YWxzKHRoYXQucGF0dGVybik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBVUkkgZnJvbSB0aGUgY29tcG9uZW50IHBhcnRzIGVhY2ggb2Ygd2hpY2ggbWF5IGNvbnRhaW4KKyAgICAgKiB0ZW1wbGF0ZSB2YXJpYWJsZXMuCisgICAgICogPHA+CisgICAgICogQSB0ZW1wbGF0ZSB2YWx1ZXMgaXMgYW4gT2JqZWN0IGluc3RhbmNlIE1VU1Qgc3VwcG9ydCB0aGUgdG9TdHJpbmcoKQorICAgICAqIG1ldGhvZCB0byBjb252ZXJ0IHRoZSB0ZW1wbGF0ZSB2YWx1ZSB0byBhIFN0cmluZyBpbnN0YW5jZS4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gc2NoZW1lICAgICAgICAgICAgdGhlIFVSSSBzY2hlbWUgY29tcG9uZW50LgorICAgICAqIEBwYXJhbSBhdXRob3JpdHkgICAgICAgICB0aGUgVVJJIGF1dGhvcml0eSBjb21wb25lbnQuCisgICAgICogQHBhcmFtIHVzZXJJbmZvICAgICAgICAgIHRoZSBVUkkgdXNlciBpbmZvIGNvbXBvbmVudC4KKyAgICAgKiBAcGFyYW0gaG9zdCAgICAgICAgICAgICAgdGhlIFVSSSBob3N0IGNvbXBvbmVudC4KKyAgICAgKiBAcGFyYW0gcG9ydCAgICAgICAgICAgICAgdGhlIFVSSSBwb3J0IGNvbXBvbmVudC4KKyAgICAgKiBAcGFyYW0gcGF0aCAgICAgICAgICAgICAgdGhlIFVSSSBwYXRoIGNvbXBvbmVudC4KKyAgICAgKiBAcGFyYW0gcXVlcnkgICAgICAgICAgICAgdGhlIFVSSSBxdWVyeSBjb21wb25lbnQuCisgICAgICogQHBhcmFtIGZyYWdtZW50ICAgICAgICAgIHRoZSBVUkkgZnJhZ21lbnQgY29tcG9uZW50LgorICAgICAqIEBwYXJhbSB2YWx1ZXMgICAgICAgICAgICB0aGUgdGVtcGxhdGUgdmFyaWFibGUgdG8gdmFsdWUgbWFwLgorICAgICAqIEBwYXJhbSBlbmNvZGUgICAgICAgICAgICBpZiB0cnVlIGVuY29kZSBhIHRlbXBsYXRlIHZhbHVlIGFjY29yZGluZyB0byB0aGUgY29ycmVzcG9uZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgdHlwZSBvZiB0aGUgYXNzb2NpYXRlZCB0ZW1wbGF0ZSB2YXJpYWJsZSwgb3RoZXJ3aXNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHR1YWxseSBlbmNvZGUgdGhlIHRlbXBsYXRlIHZhbHVlLgorICAgICAqIEBwYXJhbSBlbmNvZGVTbGFzaEluUGF0aCBpZiB7QGNvZGUgdHJ1ZX0sIHRoZSBzbGFzaCAoe0Bjb2RlICcvJ30pIGNoYXJhY3RlcnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gcGFyYW1ldGVyIHZhbHVlcyB3aWxsIGJlIGVuY29kZWQgaWYgdGhlIHRlbXBsYXRlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHBsYWNlZCBpbiB0aGUgVVJJIHBhdGggY29tcG9uZW50LCBvdGhlcndpc2UgdGhlIHNsYXNoCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlcnMgd2lsbCBub3QgYmUgZW5jb2RlZCBpbiBwYXRoIHRlbXBsYXRlcy4KKyAgICAgKiBAcmV0dXJuIGEgVVJJLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZVVSSSgKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzY2hlbWUsIFN0cmluZyBhdXRob3JpdHksCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdXNlckluZm8sIGZpbmFsIFN0cmluZyBob3N0LCBmaW5hbCBTdHJpbmcgcG9ydCwKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwYXRoLCBmaW5hbCBTdHJpbmcgcXVlcnksIGZpbmFsIFN0cmluZyBmcmFnbWVudCwKKyAgICAgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsID8+IHZhbHVlcywgZmluYWwgYm9vbGVhbiBlbmNvZGUsIGZpbmFsIGJvb2xlYW4gZW5jb2RlU2xhc2hJblBhdGgpIHsKKworICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHN0cmluZ1ZhbHVlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsID8+IGUgOiB2YWx1ZXMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgaWYgKGUuZ2V0VmFsdWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc3RyaW5nVmFsdWVzLnB1dChlLmdldEtleSgpLCBlLmdldFZhbHVlKCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY3JlYXRlVVJJV2l0aFN0cmluZ1ZhbHVlcyhzY2hlbWUsIGF1dGhvcml0eSwKKyAgICAgICAgICAgICAgICB1c2VySW5mbywgaG9zdCwgcG9ydCwgcGF0aCwgcXVlcnksIGZyYWdtZW50LAorICAgICAgICAgICAgICAgIHN0cmluZ1ZhbHVlcywgZW5jb2RlLCBlbmNvZGVTbGFzaEluUGF0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgVVJJIGZyb20gdGhlIGNvbXBvbmVudCBwYXJ0cyBlYWNoIG9mIHdoaWNoIG1heSBjb250YWluCisgICAgICogdGVtcGxhdGUgdmFyaWFibGVzLgorICAgICAqIDxwPgorICAgICAqIEEgdGVtcGxhdGUgdmFsdWUgaXMgYW4gT2JqZWN0IGluc3RhbmNlIHRoYXQgTVVTVCBzdXBwb3J0IHRoZSB0b1N0cmluZygpCisgICAgICogbWV0aG9kIHRvIGNvbnZlcnQgdGhlIHRlbXBsYXRlIHZhbHVlIHRvIGEgU3RyaW5nIGluc3RhbmNlLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzY2hlbWUgICAgICAgICAgICB0aGUgVVJJIHNjaGVtZSBjb21wb25lbnQuCisgICAgICogQHBhcmFtIGF1dGhvcml0eSAgICAgICAgIHRoZSBVUkkgYXV0aG9yaXR5IGluZm8gY29tcG9uZW50LgorICAgICAqIEBwYXJhbSB1c2VySW5mbyAgICAgICAgICB0aGUgVVJJIHVzZXIgaW5mbyBjb21wb25lbnQuCisgICAgICogQHBhcmFtIGhvc3QgICAgICAgICAgICAgIHRoZSBVUkkgaG9zdCBjb21wb25lbnQuCisgICAgICogQHBhcmFtIHBvcnQgICAgICAgICAgICAgIHRoZSBVUkkgcG9ydCBjb21wb25lbnQuCisgICAgICogQHBhcmFtIHBhdGggICAgICAgICAgICAgIHRoZSBVUkkgcGF0aCBjb21wb25lbnQuCisgICAgICogQHBhcmFtIHF1ZXJ5ICAgICAgICAgICAgIHRoZSBVUkkgcXVlcnkgY29tcG9uZW50LgorICAgICAqIEBwYXJhbSBmcmFnbWVudCAgICAgICAgICB0aGUgVVJJIGZyYWdtZW50IGNvbXBvbmVudC4KKyAgICAgKiBAcGFyYW0gdmFsdWVzICAgICAgICAgICAgdGhlIHRlbXBsYXRlIHZhcmlhYmxlIHRvIHZhbHVlIG1hcC4KKyAgICAgKiBAcGFyYW0gZW5jb2RlICAgICAgICAgICAgaWYgdHJ1ZSBlbmNvZGUgYSB0ZW1wbGF0ZSB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIGNvcnJlc3BvbmQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IHR5cGUgb2YgdGhlIGFzc29jaWF0ZWQgdGVtcGxhdGUgdmFyaWFibGUsIG90aGVyd2lzZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0dWFsbHkgZW5jb2RlIHRoZSB0ZW1wbGF0ZSB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gZW5jb2RlU2xhc2hJblBhdGggaWYge0Bjb2RlIHRydWV9LCB0aGUgc2xhc2ggKHtAY29kZSAnLyd9KSBjaGFyYWN0ZXJzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGluIHBhcmFtZXRlciB2YWx1ZXMgd2lsbCBiZSBlbmNvZGVkIGlmIHRoZSB0ZW1wbGF0ZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBwbGFjZWQgaW4gdGhlIFVSSSBwYXRoIGNvbXBvbmVudCwgb3RoZXJ3aXNlIHRoZSBzbGFzaAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzIHdpbGwgbm90IGJlIGVuY29kZWQgaW4gcGF0aCB0ZW1wbGF0ZXMuCisgICAgICogQHJldHVybiBhIFVSSS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVVUklXaXRoU3RyaW5nVmFsdWVzKAorICAgICAgICAgICAgZmluYWwgU3RyaW5nIHNjaGVtZSwgZmluYWwgU3RyaW5nIGF1dGhvcml0eSwKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB1c2VySW5mbywgZmluYWwgU3RyaW5nIGhvc3QsIGZpbmFsIFN0cmluZyBwb3J0LAorICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBhdGgsIGZpbmFsIFN0cmluZyBxdWVyeSwgZmluYWwgU3RyaW5nIGZyYWdtZW50LAorICAgICAgICAgICAgZmluYWwgTWFwPFN0cmluZywgPz4gdmFsdWVzLCBmaW5hbCBib29sZWFuIGVuY29kZSwgZmluYWwgYm9vbGVhbiBlbmNvZGVTbGFzaEluUGF0aCkgeworCisgICAgICAgIHJldHVybiBjcmVhdGVVUklXaXRoU3RyaW5nVmFsdWVzKAorICAgICAgICAgICAgICAgIHNjaGVtZSwgYXV0aG9yaXR5LCB1c2VySW5mbywgaG9zdCwgcG9ydCwgcGF0aCwgcXVlcnksIGZyYWdtZW50LCBFTVBUWV9WQUxVRVMsIGVuY29kZSwgZW5jb2RlU2xhc2hJblBhdGgsIHZhbHVlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgVVJJIGZyb20gdGhlIGNvbXBvbmVudCBwYXJ0cyBlYWNoIG9mIHdoaWNoIG1heSBjb250YWluCisgICAgICogdGVtcGxhdGUgdmFyaWFibGVzLgorICAgICAqIDxwPgorICAgICAqIFRoZSB0ZW1wbGF0ZSB2YWx1ZXMgYXJlIGFuIGFycmF5IG9mIE9iamVjdCBhbmQgZWFjaCBPYmplY3QgaW5zdGFuY2UKKyAgICAgKiBNVVNUIHN1cHBvcnQgdGhlIHRvU3RyaW5nKCkgbWV0aG9kIHRvIGNvbnZlcnQgdGhlIHRlbXBsYXRlIHZhbHVlIHRvCisgICAgICogYSBTdHJpbmcgaW5zdGFuY2UuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHNjaGVtZSAgICAgICAgICAgIHRoZSBVUkkgc2NoZW1lIGNvbXBvbmVudC4KKyAgICAgKiBAcGFyYW0gYXV0aG9yaXR5ICAgICAgICAgdGhlIFVSSSBhdXRob3JpdHkgY29tcG9uZW50LgorICAgICAqIEBwYXJhbSB1c2VySW5mbyAgICAgICAgICB0aGUgVVJJIHVzZXIgaW5mbyBjb21wb25lbnQuCisgICAgICogQHBhcmFtIGhvc3QgICAgICAgICAgICAgIHRoZSBVUkkgaG9zdCBjb21wb25lbnQuCisgICAgICogQHBhcmFtIHBvcnQgICAgICAgICAgICAgIHRoZSBVUkkgcG9ydCBjb21wb25lbnQuCisgICAgICogQHBhcmFtIHBhdGggICAgICAgICAgICAgIHRoZSBVUkkgcGF0aCBjb21wb25lbnQuCisgICAgICogQHBhcmFtIHF1ZXJ5ICAgICAgICAgICAgIHRoZSBVUkkgcXVlcnkgY29tcG9uZW50LgorICAgICAqIEBwYXJhbSBmcmFnbWVudCAgICAgICAgICB0aGUgVVJJIGZyYWdtZW50IGNvbXBvbmVudC4KKyAgICAgKiBAcGFyYW0gdmFsdWVzICAgICAgICAgICAgdGhlIGFycmF5IG9mIHRlbXBsYXRlIHZhbHVlcy4KKyAgICAgKiBAcGFyYW0gZW5jb2RlICAgICAgICAgICAgaWYgdHJ1ZSBlbmNvZGUgYSB0ZW1wbGF0ZSB2YWx1ZSBhY2NvcmRpbmcgdG8gdGhlIGNvcnJlc3BvbmQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IHR5cGUgb2YgdGhlIGFzc29jaWF0ZWQgdGVtcGxhdGUgdmFyaWFibGUsIG90aGVyd2lzZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0dWFsbHkgZW5jb2RlIHRoZSB0ZW1wbGF0ZSB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gZW5jb2RlU2xhc2hJblBhdGggaWYge0Bjb2RlIHRydWV9LCB0aGUgc2xhc2ggKHtAY29kZSAnLyd9KSBjaGFyYWN0ZXJzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGluIHBhcmFtZXRlciB2YWx1ZXMgd2lsbCBiZSBlbmNvZGVkIGlmIHRoZSB0ZW1wbGF0ZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBwbGFjZWQgaW4gdGhlIFVSSSBwYXRoIGNvbXBvbmVudCwgb3RoZXJ3aXNlIHRoZSBzbGFzaAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyYWN0ZXJzIHdpbGwgbm90IGJlIGVuY29kZWQgaW4gcGF0aCB0ZW1wbGF0ZXMuCisgICAgICogQHJldHVybiBhIFVSSS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjcmVhdGVVUkkoCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc2NoZW1lLCBTdHJpbmcgYXV0aG9yaXR5LAorICAgICAgICAgICAgZmluYWwgU3RyaW5nIHVzZXJJbmZvLCBmaW5hbCBTdHJpbmcgaG9zdCwgZmluYWwgU3RyaW5nIHBvcnQsCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGF0aCwgZmluYWwgU3RyaW5nIHF1ZXJ5LCBmaW5hbCBTdHJpbmcgZnJhZ21lbnQsCisgICAgICAgICAgICBmaW5hbCBPYmplY3RbXSB2YWx1ZXMsIGZpbmFsIGJvb2xlYW4gZW5jb2RlLCBmaW5hbCBib29sZWFuIGVuY29kZVNsYXNoSW5QYXRoKSB7CisKKyAgICAgICAgU3RyaW5nW10gc3RyaW5nVmFsdWVzID0gbmV3IFN0cmluZ1t2YWx1ZXMubGVuZ3RoXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZXNbaV0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHN0cmluZ1ZhbHVlc1tpXSA9IHZhbHVlc1tpXS50b1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNyZWF0ZVVSSVdpdGhTdHJpbmdWYWx1ZXMoCisgICAgICAgICAgICAgICAgc2NoZW1lLCBhdXRob3JpdHksCisgICAgICAgICAgICAgICAgdXNlckluZm8sIGhvc3QsIHBvcnQsIHBhdGgsIHF1ZXJ5LCBmcmFnbWVudCwKKyAgICAgICAgICAgICAgICBzdHJpbmdWYWx1ZXMsIGVuY29kZSwgZW5jb2RlU2xhc2hJblBhdGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIFVSSSBmcm9tIHRoZSBjb21wb25lbnQgcGFydHMgZWFjaCBvZiB3aGljaCBtYXkgY29udGFpbgorICAgICAqIHRlbXBsYXRlIHZhcmlhYmxlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzY2hlbWUgICAgICAgICAgICB0aGUgVVJJIHNjaGVtZSBjb21wb25lbnQuCisgICAgICogQHBhcmFtIGF1dGhvcml0eSAgICAgICAgIHRoZSBVUkkgYXV0aG9yaXR5IGNvbXBvbmVudC4KKyAgICAgKiBAcGFyYW0gdXNlckluZm8gICAgICAgICAgdGhlIFVSSSB1c2VyIGluZm8gY29tcG9uZW50LgorICAgICAqIEBwYXJhbSBob3N0ICAgICAgICAgICAgICB0aGUgVVJJIGhvc3QgY29tcG9uZW50LgorICAgICAqIEBwYXJhbSBwb3J0ICAgICAgICAgICAgICB0aGUgVVJJIHBvcnQgY29tcG9uZW50LgorICAgICAqIEBwYXJhbSBwYXRoICAgICAgICAgICAgICB0aGUgVVJJIHBhdGggY29tcG9uZW50LgorICAgICAqIEBwYXJhbSBxdWVyeSAgICAgICAgICAgICB0aGUgVVJJIHF1ZXJ5IGNvbXBvbmVudC4KKyAgICAgKiBAcGFyYW0gZnJhZ21lbnQgICAgICAgICAgdGhlIFVSSSBmcmFnbWVudCBjb21wb25lbnQuCisgICAgICogQHBhcmFtIHZhbHVlcyAgICAgICAgICAgIHRoZSBhcnJheSBvZiB0ZW1wbGF0ZSB2YWx1ZXMuCisgICAgICogQHBhcmFtIGVuY29kZSAgICAgICAgICAgIGlmIHRydWUgZW5jb2RlIGEgdGVtcGxhdGUgdmFsdWUgYWNjb3JkaW5nIHRvIHRoZSBjb3JyZXNwb25kCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCB0eXBlIG9mIHRoZSBhc3NvY2lhdGVkIHRlbXBsYXRlIHZhcmlhYmxlLCBvdGhlcndpc2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dHVhbGx5IGVuY29kZSB0aGUgdGVtcGxhdGUgdmFsdWUuCisgICAgICogQHBhcmFtIGVuY29kZVNsYXNoSW5QYXRoIGlmIHtAY29kZSB0cnVlfSwgdGhlIHNsYXNoICh7QGNvZGUgJy8nfSkgY2hhcmFjdGVycworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBpbiBwYXJhbWV0ZXIgdmFsdWVzIHdpbGwgYmUgZW5jb2RlZCBpZiB0aGUgdGVtcGxhdGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgcGxhY2VkIGluIHRoZSBVUkkgcGF0aCBjb21wb25lbnQsIG90aGVyd2lzZSB0aGUgc2xhc2gKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhcmFjdGVycyB3aWxsIG5vdCBiZSBlbmNvZGVkIGluIHBhdGggdGVtcGxhdGVzLgorICAgICAqIEByZXR1cm4gYSBVUkkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgY3JlYXRlVVJJV2l0aFN0cmluZ1ZhbHVlcygKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzY2hlbWUsIGZpbmFsIFN0cmluZyBhdXRob3JpdHksCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdXNlckluZm8sIGZpbmFsIFN0cmluZyBob3N0LCBmaW5hbCBTdHJpbmcgcG9ydCwKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwYXRoLCBmaW5hbCBTdHJpbmcgcXVlcnksIGZpbmFsIFN0cmluZyBmcmFnbWVudCwKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIHZhbHVlcywgZmluYWwgYm9vbGVhbiBlbmNvZGUsIGZpbmFsIGJvb2xlYW4gZW5jb2RlU2xhc2hJblBhdGgpIHsKKworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcFZhbHVlcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICByZXR1cm4gY3JlYXRlVVJJV2l0aFN0cmluZ1ZhbHVlcygKKyAgICAgICAgICAgICAgICBzY2hlbWUsIGF1dGhvcml0eSwgdXNlckluZm8sIGhvc3QsIHBvcnQsIHBhdGgsIHF1ZXJ5LCBmcmFnbWVudCwgdmFsdWVzLCBlbmNvZGUsIGVuY29kZVNsYXNoSW5QYXRoLCBtYXBWYWx1ZXMpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjcmVhdGVVUklXaXRoU3RyaW5nVmFsdWVzKAorICAgICAgICAgICAgZmluYWwgU3RyaW5nIHNjaGVtZSwgZmluYWwgU3RyaW5nIGF1dGhvcml0eSwgZmluYWwgU3RyaW5nIHVzZXJJbmZvLCBmaW5hbCBTdHJpbmcgaG9zdCwgZmluYWwgU3RyaW5nIHBvcnQsCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGF0aCwgZmluYWwgU3RyaW5nIHF1ZXJ5LCBmaW5hbCBTdHJpbmcgZnJhZ21lbnQsIGZpbmFsIFN0cmluZ1tdIHZhbHVlcywgZmluYWwgYm9vbGVhbiBlbmNvZGUsCisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGVuY29kZVNsYXNoSW5QYXRoLCBmaW5hbCBNYXA8U3RyaW5nLCA/PiBtYXBWYWx1ZXMpIHsKKworICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgaW50IG9mZnNldCA9IDA7CisKKyAgICAgICAgaWYgKHNjaGVtZSAhPSBudWxsKSB7CisgICAgICAgICAgICBvZmZzZXQgPSBjcmVhdGVVcmlDb21wb25lbnQoVXJpQ29tcG9uZW50LlR5cGUuU0NIRU1FLCBzY2hlbWUsIHZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCBmYWxzZSwgbWFwVmFsdWVzLCBzYik7CisgICAgICAgICAgICBzYi5hcHBlbmQoJzonKTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gaGFzQXV0aG9yaXR5ID0gZmFsc2U7CisgICAgICAgIGlmIChub3RFbXB0eSh1c2VySW5mbykgfHwgbm90RW1wdHkoaG9zdCkgfHwgbm90RW1wdHkocG9ydCkpIHsKKyAgICAgICAgICAgIGhhc0F1dGhvcml0eSA9IHRydWU7CisgICAgICAgICAgICBzYi5hcHBlbmQoIi8vIik7CisKKyAgICAgICAgICAgIGlmIChub3RFbXB0eSh1c2VySW5mbykpIHsKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSBjcmVhdGVVcmlDb21wb25lbnQoVXJpQ29tcG9uZW50LlR5cGUuVVNFUl9JTkZPLCB1c2VySW5mbywgdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCBlbmNvZGUsIG1hcFZhbHVlcywgc2IpOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnQCcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobm90RW1wdHkoaG9zdCkpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPIGNoZWNrIElQdjYgYWRkcmVzcworICAgICAgICAgICAgICAgIG9mZnNldCA9IGNyZWF0ZVVyaUNvbXBvbmVudChVcmlDb21wb25lbnQuVHlwZS5IT1NULCBob3N0LCB2YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsIGVuY29kZSwgbWFwVmFsdWVzLCBzYik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChub3RFbXB0eShwb3J0KSkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnOicpOworICAgICAgICAgICAgICAgIG9mZnNldCA9IGNyZWF0ZVVyaUNvbXBvbmVudChVcmlDb21wb25lbnQuVHlwZS5QT1JULCBwb3J0LCB2YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsIGZhbHNlLCBtYXBWYWx1ZXMsIHNiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChub3RFbXB0eShhdXRob3JpdHkpKSB7CisgICAgICAgICAgICBoYXNBdXRob3JpdHkgPSB0cnVlOworICAgICAgICAgICAgc2IuYXBwZW5kKCIvLyIpOworCisgICAgICAgICAgICBvZmZzZXQgPSBjcmVhdGVVcmlDb21wb25lbnQoVXJpQ29tcG9uZW50LlR5cGUuQVVUSE9SSVRZLCBhdXRob3JpdHksIHZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCBlbmNvZGUsIG1hcFZhbHVlcywgc2IpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5vdEVtcHR5KHBhdGgpIHx8IG5vdEVtcHR5KHF1ZXJ5KSB8fCBub3RFbXB0eShmcmFnbWVudCkpIHsKKyAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBhcHBlbmQgYXQgbGVhc3QgdGhlIHJvb3QgcGF0aCBpZiBvbmx5IHF1ZXJ5IG9yIGZyYWdtZW50IGlzIHByZXNlbnQKKyAgICAgICAgICAgIGlmIChoYXNBdXRob3JpdHkgJiYgKHBhdGggPT0gbnVsbCB8fCBwYXRoLmlzRW1wdHkoKSB8fCBwYXRoLmNoYXJBdCgwKSAhPSAnLycpKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCcvJyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChub3RFbXB0eShwYXRoKSkgeworICAgICAgICAgICAgICAgIC8vIHBhdGggdGVtcGxhdGUgdmFsdWVzIGFyZSB0cmVhdGVkIGFzIHBhdGggc2VnbWVudHMgdW5sZXNzIGVuY29kZVNsYXNoSW5QYXRoIGlzIGZhbHNlLgorICAgICAgICAgICAgICAgIFVyaUNvbXBvbmVudC5UeXBlIHQgPSAoZW5jb2RlU2xhc2hJblBhdGgpID8gVXJpQ29tcG9uZW50LlR5cGUuUEFUSF9TRUdNRU5UIDogVXJpQ29tcG9uZW50LlR5cGUuUEFUSDsKKworICAgICAgICAgICAgICAgIG9mZnNldCA9IGNyZWF0ZVVyaUNvbXBvbmVudCh0LCBwYXRoLCB2YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsIGVuY29kZSwgbWFwVmFsdWVzLCBzYik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChub3RFbXB0eShxdWVyeSkpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJz8nKTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSBjcmVhdGVVcmlDb21wb25lbnQoVXJpQ29tcG9uZW50LlR5cGUuUVVFUllfUEFSQU0sIHF1ZXJ5LCB2YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsIGVuY29kZSwgbWFwVmFsdWVzLCBzYik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChub3RFbXB0eShmcmFnbWVudCkpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJyMnKTsKKyAgICAgICAgICAgICAgICBjcmVhdGVVcmlDb21wb25lbnQoVXJpQ29tcG9uZW50LlR5cGUuRlJBR01FTlQsIGZyYWdtZW50LCB2YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsIGVuY29kZSwgbWFwVmFsdWVzLCBzYik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBub3RFbXB0eShTdHJpbmcgc3RyaW5nKSB7CisgICAgICAgIHJldHVybiBzdHJpbmcgIT0gbnVsbCAmJiAhc3RyaW5nLmlzRW1wdHkoKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgY3JlYXRlVXJpQ29tcG9uZW50KGZpbmFsIFVyaUNvbXBvbmVudC5UeXBlIGNvbXBvbmVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdGVtcGxhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSB2YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdmFsdWVPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGVuY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsID8+IF9tYXBWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGIpIHsKKworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcFZhbHVlcyA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBfbWFwVmFsdWVzOworCisgICAgICAgIGlmICh0ZW1wbGF0ZS5pbmRleE9mKCd7JykgPT0gLTEpIHsKKyAgICAgICAgICAgIGIuYXBwZW5kKHRlbXBsYXRlKTsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZU9mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZpbmQgYWxsIHRlbXBsYXRlIHZhcmlhYmxlcworICAgICAgICB0ZW1wbGF0ZSA9IG5ldyBVcmlUZW1wbGF0ZVBhcnNlcih0ZW1wbGF0ZSkuZ2V0Tm9ybWFsaXplZFRlbXBsYXRlKCk7CisKKworICAgICAgICBjbGFzcyBWYWx1ZXNGcm9tQXJyYXlTdHJhdGVneSBpbXBsZW1lbnRzIFRlbXBsYXRlVmFsdWVTdHJhdGVneSB7CisgICAgICAgICAgICBwcml2YXRlIGludCBvZmZzZXQgPSB2YWx1ZU9mZnNldDsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHZhbHVlRm9yKFN0cmluZyB0ZW1wbGF0ZVZhcmlhYmxlLCBTdHJpbmcgbWF0Y2hlZEdyb3VwKSB7CisKKyAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBtYXBWYWx1ZXMuZ2V0KHRlbXBsYXRlVmFyaWFibGUpOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsICYmIG9mZnNldCA8IHZhbHVlcy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZXNbb2Zmc2V0KytdOworICAgICAgICAgICAgICAgICAgICBtYXBWYWx1ZXMucHV0KHRlbXBsYXRlVmFyaWFibGUsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJUaGUgdGVtcGxhdGUgdmFyaWFibGUgJyVzJyBoYXMgbm8gdmFsdWUiLCB0ZW1wbGF0ZVZhcmlhYmxlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChlbmNvZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVyaUNvbXBvbmVudC5lbmNvZGUodmFsdWUudG9TdHJpbmcoKSwgY29tcG9uZW50VHlwZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVyaUNvbXBvbmVudC5jb250ZXh0dWFsRW5jb2RlKHZhbHVlLnRvU3RyaW5nKCksIGNvbXBvbmVudFR5cGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBWYWx1ZXNGcm9tQXJyYXlTdHJhdGVneSBjcyA9IG5ldyBWYWx1ZXNGcm9tQXJyYXlTdHJhdGVneSgpOworICAgICAgICByZXNvbHZlVGVtcGxhdGUodGVtcGxhdGUsIGIsIGNzKTsKKworICAgICAgICByZXR1cm4gY3Mub2Zmc2V0OworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmVzb2x2ZXMgdGVtcGxhdGUgdmFyaWFibGVzIGluIHRoZSBnaXZlbiB7QGNvZGUgdGVtcGxhdGV9IGZyb20ge0Bjb2RlIF9tYXBWYWx1ZXN9LiBSZXNvbHZlcyBvbmx5IHRoZXNlIHZhcmlhYmxlcyB3aGljaCBhcmUKKyAgICAgKiBkZWZpbmVkIGluIHRoZSB7QGNvZGUgX21hcFZhbHVlc30gbGVhdmluZyBvdGhlciB2YXJpYWJsZXMgdW5jaGFuZ2VkLgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgICAgICAgVHlwZSBvZiB0aGUge0Bjb2RlIHRlbXBsYXRlfSAocG9ydCwgcGF0aCwgcXVlcnksIC4uLikuCisgICAgICogQHBhcmFtIHRlbXBsYXRlICAgSW5wdXQgdXJpIGNvbXBvbmVudCB0byByZXNvbHZlLgorICAgICAqIEBwYXJhbSBlbmNvZGUgICAgIFRydWUgaWYgdGVtcGxhdGUgdmFsdWVzIGZyb20ge0Bjb2RlIF9tYXBWYWx1ZXN9IHNob3VsZCBiZSBwZXJjZW50IGVuY29kZWQuCisgICAgICogQHBhcmFtIF9tYXBWYWx1ZXMgTWFwIHdpdGggdGVtcGxhdGUgdmFyaWFibGVzIGFzIGtleXMgYW5kIHRlbXBsYXRlIHZhbHVlcyBhcyB2YWx1ZXMuIE5vbmUgb2YgdGhlbSBzaG91bGQgYmUgbnVsbC4KKyAgICAgKiBAcmV0dXJuIFN0cmluZyB3aXRoIHJlc29sdmVkIHRlbXBsYXRlIHZhcmlhYmxlcy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdoZW4ge0Bjb2RlIF9tYXBWYWx1ZXN9IHZhbHVlIGlzIG51bGwuCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVzb2x2ZVRlbXBsYXRlVmFsdWVzKGZpbmFsIFVyaUNvbXBvbmVudC5UeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0ZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBlbmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsID8+IF9tYXBWYWx1ZXMpIHsKKworICAgICAgICBpZiAodGVtcGxhdGUgPT0gbnVsbCB8fCB0ZW1wbGF0ZS5pc0VtcHR5KCkgfHwgdGVtcGxhdGUuaW5kZXhPZigneycpID09IC0xKSB7CisgICAgICAgICAgICByZXR1cm4gdGVtcGxhdGU7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcFZhbHVlcyA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSBfbWFwVmFsdWVzOworCisgICAgICAgIC8vIEZpbmQgYWxsIHRlbXBsYXRlIHZhcmlhYmxlcworICAgICAgICB0ZW1wbGF0ZSA9IG5ldyBVcmlUZW1wbGF0ZVBhcnNlcih0ZW1wbGF0ZSkuZ2V0Tm9ybWFsaXplZFRlbXBsYXRlKCk7CisKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIHJlc29sdmVUZW1wbGF0ZSh0ZW1wbGF0ZSwgc2IsIG5ldyBUZW1wbGF0ZVZhbHVlU3RyYXRlZ3koKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgdmFsdWVGb3IoU3RyaW5nIHRlbXBsYXRlVmFyaWFibGUsIFN0cmluZyBtYXRjaGVkR3JvdXApIHsKKworICAgICAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IG1hcFZhbHVlcy5nZXQodGVtcGxhdGVWYXJpYWJsZSk7CisKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZW5jb2RlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IFVyaUNvbXBvbmVudC5lbmNvZGUodmFsdWUudG9TdHJpbmcoKSwgdHlwZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IFVyaUNvbXBvbmVudC5jb250ZXh0dWFsRW5jb2RlKHZhbHVlLnRvU3RyaW5nKCksIHR5cGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtYXBWYWx1ZXMuY29udGFpbnNLZXkodGVtcGxhdGVWYXJpYWJsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIlRoZSB2YWx1ZSBhc3NvY2lhdGVkIG9mIHRoZSB0ZW1wbGF0ZSB2YWx1ZSBtYXAgZm9yIGtleSAnJXMnIGlzICdudWxsJy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVmFyaWFibGUpCisgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hdGNoZWRHcm91cDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdXJpL2ludGVybmFsL0NoYXJhY3Rlckl0ZXJhdG9yLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3VyaS9pbnRlcm5hbC9DaGFyYWN0ZXJJdGVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMjJiYzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3VyaS9pbnRlcm5hbC9DaGFyYWN0ZXJJdGVyYXRvci5qYXZhCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnVyaS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworCisvKioKKyAqIEl0ZXJhdG9yIHdoaWNoIGl0ZXJhdGVzIHRocm91Z2ggdGhlIGlucHV0IHN0cmluZyBhbmQgcmV0dXJucyBjaGFyYWN0ZXJzIGZyb20gdGhhdCBzdHJpbmcuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitmaW5hbCBjbGFzcyBDaGFyYWN0ZXJJdGVyYXRvciB7CisgICAgcHJpdmF0ZSBpbnQgcG9zOworICAgIHByaXZhdGUgU3RyaW5nIHM7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGl0ZXJhdG9yIGluaXRpYWxpemVkIHdpdGggdGhlIGdpdmVuIGlucHV0IHN0cmluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzIFN0cmluZyB0cm91Z2ggd2hpY2ggdGhlIGl0ZXJhdG9yIGl0ZXJhdGVzLgorICAgICAqLworICAgIHB1YmxpYyBDaGFyYWN0ZXJJdGVyYXRvcihmaW5hbCBTdHJpbmcgcykgeworICAgICAgICB0aGlzLnMgPSBzOworICAgICAgICB0aGlzLnBvcyA9IC0xOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGVyZSBpcyBuZXh0IGNoYXJhY3RlciBpbiB0aGUgaXRlcmF0aW9uIGNoYWluLgorICAgICAqCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZXJlIGlzIGEgY2hhcmFjdGVyIHdoaWNoIGNhbiBiZSByZXRyaWV2ZWQgYnkge0BsaW5rICNuZXh0KCl9LCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgcmV0dXJuIHBvcyA8IHMubGVuZ3RoKCkgLSAxOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgbmV4dCBjaGFyYWN0ZXIgaW4gdGhlIGl0ZXJhdGlvbiBjaGFpbiBhbmQgaW5jcmVhc2UgdGhlIGN1cnJlbnQgcG9zaXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE5leHQgY2hhcmFjdGVyLgorICAgICAqIEB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiBUaGUgbWV0aG9kIG1pZ2h0IHRocm93IGV4Y2VwdGlvbiB3aGVuIHRoZXJlIGlzIG5vIG1vcmUgY2hhcmFjdGVyIHRvIGJlIHJldHJpZXZlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgY2hhciBuZXh0KCkgeworICAgICAgICBpZiAoIWhhc05leHQoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcy5jaGFyQXQoKytwb3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5leHQgY2hhcmFjdGVyIHdpdGhvdXQgaW5jcmVhc2luZyB0aGUgcG9zaXRpb24uIFRoZSBtZXRob2QgZG9lcyB0aGUgc2FtZSBhcyB7QGxpbmsgI25leHQoKX0gYnV0CisgICAgICogdGhlIHBvc2l0aW9uIGlzIG5vdCBjaGFuZ2VkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE5leHQgY2hhcmFjdGVyLgorICAgICAqLworICAgIHB1YmxpYyBjaGFyIHBlZWsoKSB7CisgICAgICAgIGlmICghaGFzTmV4dCgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHMuY2hhckF0KHBvcyArIDEpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBpbnRlcm5hbCBwb3NpdGlvbiBvZiB0aGUgaXRlcmF0b3IuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIGl0ZXJhdG9yCisgICAgICovCisgICAgcHVibGljIGludCBwb3MoKSB7CisgICAgICAgIHJldHVybiBwb3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgaW5wdXQgU3RyaW5nIG9uIHdoaWNoIHRoaXMge0BsaW5rIENoYXJhY3Rlckl0ZXJhdG9yIGl0ZXJhdG9yfSBvcGVyYXRlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gU3RyaW5nIHdoaWNoIGluaXRpYWxpemVkIHRoaXMgaXRlcmF0b3IuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbnB1dCgpIHsKKyAgICAgICAgcmV0dXJuIHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hhbmdlcyB0aGUgY3VycmVudCBwb3NpdGlvbiB0byB0aGUgcG9zaXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmV3UG9zaXRpb24gTmV3IHBvc2l0aW9uIGZvciB0aGUgaXRlcmF0b3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UG9zaXRpb24oaW50IG5ld1Bvc2l0aW9uKSB7CisgICAgICAgIGlmIChuZXdQb3NpdGlvbiA+IHRoaXMucy5sZW5ndGgoKSAtIDEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJHaXZlbiBwb3NpdGlvbiAiICsgbmV3UG9zaXRpb24gKyAiIGlzIG91dHNpZGUgdGhlIGlucHV0IHN0cmluZyByYW5nZS4iKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnBvcyA9IG5ld1Bvc2l0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgY2hhcmFjdGVyIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBDaGFyYWN0ZXIgZnJvbSBjdXJyZW50IHBvc2l0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBjaGFyIGN1cnJlbnQoKSB7CisgICAgICAgIGlmIChwb3MgPT0gLTEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkl0ZXJhdG9yIG5vdCB1c2VkIHlldC4iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcy5jaGFyQXQocG9zKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3VyaS9pbnRlcm5hbC9KZXJzZXlVcmlCdWlsZGVyLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3VyaS9pbnRlcm5hbC9KZXJzZXlVcmlCdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU4ZGZkMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdXJpL2ludGVybmFsL0plcnNleVVyaUJ1aWxkZXIuamF2YQpAQCAtMCwwICsxLDkyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS51cmkuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Bbm5vdGF0ZWRFbGVtZW50OworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXJFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YS5JbmV0QWRkcmVzc2VzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUmVmbGVjdGlvbkhlbHBlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uTXVsdGl2YWx1ZWRTdHJpbmdNYXA7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudXJpLlVyaUNvbXBvbmVudDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS51cmkuVXJpVGVtcGxhdGU7CisKKy8qKgorICogQSBKZXJzZXkgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFVyaUJ1aWxkZXJ9LgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICogQGF1dGhvciBWZXRsZSBMZWlub25lbi1Sb2VpbSAodmV0bGUgYXQgcm9laW0ubmV0KQorICovCitwdWJsaWMgY2xhc3MgSmVyc2V5VXJpQnVpbGRlciBleHRlbmRzIFVyaUJ1aWxkZXIgeworCisgICAgLy8gQWxsIGZpZWxkcyBzaG91bGQgYmUgaW4gdGhlIHBlcmNlbnQtZW5jb2RlZCBmb3JtCisgICAgcHJpdmF0ZSBTdHJpbmcgc2NoZW1lOworCisgICAgcHJpdmF0ZSBTdHJpbmcgc3NwOworCisgICAgcHJpdmF0ZSBTdHJpbmcgYXV0aG9yaXR5OworCisgICAgcHJpdmF0ZSBTdHJpbmcgdXNlckluZm87CisKKyAgICBwcml2YXRlIFN0cmluZyBob3N0OworCisgICAgcHJpdmF0ZSBTdHJpbmcgcG9ydDsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nQnVpbGRlciBwYXRoOworCisgICAgcHJpdmF0ZSBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gbWF0cml4UGFyYW1zOworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdCdWlsZGVyIHF1ZXJ5OworCisgICAgcHJpdmF0ZSBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gcXVlcnlQYXJhbXM7CisKKyAgICBwcml2YXRlIFN0cmluZyBmcmFnbWVudDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgaW1wbGVtZW50YXRpb24gb2Yge0Bjb2RlIFVyaUJ1aWxkZXJ9LgorICAgICAqLworICAgIHB1YmxpYyBKZXJzZXlVcmlCdWlsZGVyKCkgeworICAgICAgICBwYXRoID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgcXVlcnkgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgIH0KKworICAgIHByaXZhdGUgSmVyc2V5VXJpQnVpbGRlcihmaW5hbCBKZXJzZXlVcmlCdWlsZGVyIHRoYXQpIHsKKyAgICAgICAgdGhpcy5zY2hlbWUgPSB0aGF0LnNjaGVtZTsKKyAgICAgICAgdGhpcy5zc3AgPSB0aGF0LnNzcDsKKyAgICAgICAgdGhpcy5hdXRob3JpdHkgPSB0aGF0LmF1dGhvcml0eTsKKyAgICAgICAgdGhpcy51c2VySW5mbyA9IHRoYXQudXNlckluZm87CisgICAgICAgIHRoaXMuaG9zdCA9IHRoYXQuaG9zdDsKKyAgICAgICAgdGhpcy5wb3J0ID0gdGhhdC5wb3J0OworICAgICAgICB0aGlzLnBhdGggPSBuZXcgU3RyaW5nQnVpbGRlcih0aGF0LnBhdGgpOworICAgICAgICB0aGlzLm1hdHJpeFBhcmFtcyA9IHRoYXQubWF0cml4UGFyYW1zID09IG51bGwgPyBudWxsIDogbmV3IE11bHRpdmFsdWVkU3RyaW5nTWFwKHRoYXQubWF0cml4UGFyYW1zKTsKKyAgICAgICAgdGhpcy5xdWVyeSA9IG5ldyBTdHJpbmdCdWlsZGVyKHRoYXQucXVlcnkpOworICAgICAgICB0aGlzLnF1ZXJ5UGFyYW1zID0gdGhhdC5xdWVyeVBhcmFtcyA9PSBudWxsID8gbnVsbCA6IG5ldyBNdWx0aXZhbHVlZFN0cmluZ01hcCh0aGF0LnF1ZXJ5UGFyYW1zKTsKKyAgICAgICAgdGhpcy5mcmFnbWVudCA9IHRoYXQuZnJhZ21lbnQ7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoIkNsb25lRG9lc250Q2FsbFN1cGVyQ2xvbmUiKQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBKZXJzZXlVcmlCdWlsZGVyIGNsb25lKCkgeworICAgICAgICByZXR1cm4gbmV3IEplcnNleVVyaUJ1aWxkZXIodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEplcnNleVVyaUJ1aWxkZXIgdXJpKGZpbmFsIFVSSSB1cmkpIHsKKyAgICAgICAgaWYgKHVyaSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlBBUkFNX05VTEwoInVyaSIpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh1cmkuZ2V0UmF3RnJhZ21lbnQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBmcmFnbWVudCA9IHVyaS5nZXRSYXdGcmFnbWVudCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHVyaS5pc09wYXF1ZSgpKSB7CisgICAgICAgICAgICBzY2hlbWUgPSB1cmkuZ2V0U2NoZW1lKCk7CisgICAgICAgICAgICBzc3AgPSB1cmkuZ2V0UmF3U2NoZW1lU3BlY2lmaWNQYXJ0KCk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh1cmkuZ2V0U2NoZW1lKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHNzcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKHVyaS5nZXRSYXdTY2hlbWVTcGVjaWZpY1BhcnQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHNzcCA9IHVyaS5nZXRSYXdTY2hlbWVTcGVjaWZpY1BhcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2NoZW1lID0gdXJpLmdldFNjaGVtZSgpOworICAgICAgICB9CisKKyAgICAgICAgc3NwID0gbnVsbDsKKyAgICAgICAgaWYgKHVyaS5nZXRSYXdBdXRob3JpdHkoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAodXJpLmdldFJhd1VzZXJJbmZvKCkgPT0gbnVsbCAmJiB1cmkuZ2V0SG9zdCgpID09IG51bGwgJiYgdXJpLmdldFBvcnQoKSA9PSAtMSkgeworICAgICAgICAgICAgICAgIGF1dGhvcml0eSA9IHVyaS5nZXRSYXdBdXRob3JpdHkoKTsKKyAgICAgICAgICAgICAgICB1c2VySW5mbyA9IG51bGw7CisgICAgICAgICAgICAgICAgaG9zdCA9IG51bGw7CisgICAgICAgICAgICAgICAgcG9ydCA9IG51bGw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGF1dGhvcml0eSA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKHVyaS5nZXRSYXdVc2VySW5mbygpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdXNlckluZm8gPSB1cmkuZ2V0UmF3VXNlckluZm8oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHVyaS5nZXRIb3N0KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBob3N0ID0gdXJpLmdldEhvc3QoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHVyaS5nZXRQb3J0KCkgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgcG9ydCA9IFN0cmluZy52YWx1ZU9mKHVyaS5nZXRQb3J0KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICh1cmkuZ2V0UmF3UGF0aCgpICE9IG51bGwgJiYgIXVyaS5nZXRSYXdQYXRoKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBwYXRoLnNldExlbmd0aCgwKTsKKyAgICAgICAgICAgIHBhdGguYXBwZW5kKHVyaS5nZXRSYXdQYXRoKCkpOworICAgICAgICB9CisgICAgICAgIGlmICh1cmkuZ2V0UmF3UXVlcnkoKSAhPSBudWxsICYmICF1cmkuZ2V0UmF3UXVlcnkoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHF1ZXJ5LnNldExlbmd0aCgwKTsKKyAgICAgICAgICAgIHF1ZXJ5LmFwcGVuZCh1cmkuZ2V0UmF3UXVlcnkoKSk7CisKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBKZXJzZXlVcmlCdWlsZGVyIHVyaShmaW5hbCBTdHJpbmcgdXJpVGVtcGxhdGUpIHsKKyAgICAgICAgaWYgKHVyaVRlbXBsYXRlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuUEFSQU1fTlVMTCgidXJpVGVtcGxhdGUiKSk7CisgICAgICAgIH0KKworICAgICAgICBVcmlQYXJzZXIgcGFyc2VyID0gbmV3IFVyaVBhcnNlcih1cmlUZW1wbGF0ZSk7CisgICAgICAgIHBhcnNlci5wYXJzZSgpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBwYXJzZWRTY2hlbWUgPSBwYXJzZXIuZ2V0U2NoZW1lKCk7CisgICAgICAgIGlmIChwYXJzZWRTY2hlbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgc2NoZW1lKHBhcnNlZFNjaGVtZSk7CisgICAgICAgIH0gZWxzZSBpZiAoc3NwICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFRoZSBwcmV2aW91c2x5IHNldCBzY2hlbWUgd2FzIG9wYXF1ZSBhbmQgdXJpVGVtcGxhdGUgZG9lcyBub3QgY29udGFpbiBhIHNjaGVtZSBwYXJ0LgorICAgICAgICAgICAgLy8gSG93ZXZlciwgdGhlIHNjaGVtZSBtaWdodCBoYXZlIGFscmVhZHkgY2hhbmdlZCwgYXMgZGVtb25zdHJhdGVkIGluCisgICAgICAgICAgICAvLyBKZXJzZXlVcmlCdWlsZGVyVGVzdC50ZXN0Q2hhbmdlVXJpU3RyaW5nQWZ0ZXJDaGFuZ2luZ09wYXF1ZVNjaGVtZVRvSHR0cCgpLgorICAgICAgICAgICAgLy8gU28gdG8gYmUgc2FmZSwgd2UgbmVlZCB0byBlcmFzZSB0aGUgZXhpc3RpbmcgaW50ZXJuYWwgU1NQIHZhbHVlIGFuZAorICAgICAgICAgICAgLy8gcmUtcGFyc2UgdGhlIG5ldyB1cmlUZW1wbGF0ZSB1c2luZyB0aGUgY3VycmVudCBzY2hlbWUgYW5kIHRyeSB0byBzZXQgdGhlIFNTUAorICAgICAgICAgICAgLy8gYWdhaW4gdXNpbmcgdGhlIHJlLXBhcnNlZCBkYXRhLgorICAgICAgICAgICAgLy8gU2VlIGFsc28gSkVSU0VZLTE0NTcgYW5kIHJlbGF0ZWQgdGVzdC4KKyAgICAgICAgICAgIHNzcCA9IG51bGw7CisgICAgICAgICAgICBwYXJzZXIgPSBuZXcgVXJpUGFyc2VyKHNjaGVtZSArICI6IiArIHVyaVRlbXBsYXRlKTsKKyAgICAgICAgICAgIHBhcnNlci5wYXJzZSgpOworICAgICAgICB9CisKKyAgICAgICAgc2NoZW1lU3BlY2lmaWNQYXJ0KHBhcnNlcik7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHBhcnNlckZyYWdtZW50ID0gcGFyc2VyLmdldEZyYWdtZW50KCk7CisgICAgICAgIGlmIChwYXJzZXJGcmFnbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBmcmFnbWVudChwYXJzZXJGcmFnbWVudCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgc2NoZW1lIHNwZWNpZmljIHBhcnQgZnJvbSB0aGUgVVJJIHBhcnNlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJzZXIgaW5pdGlhbGl6ZWQgVVJJIHBhcnNlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2NoZW1lU3BlY2lmaWNQYXJ0KGZpbmFsIFVyaVBhcnNlciBwYXJzZXIpIHsKKyAgICAgICAgaWYgKHBhcnNlci5pc09wYXF1ZSgpKSB7CisgICAgICAgICAgICBpZiAocGFyc2VyLmdldFNzcCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmF1dGhvcml0eSA9IHRoaXMuaG9zdCA9IHRoaXMucG9ydCA9IG51bGw7CisgICAgICAgICAgICAgICAgdGhpcy5wYXRoLnNldExlbmd0aCgwKTsKKyAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5LnNldExlbmd0aCgwKTsKKworICAgICAgICAgICAgICAgIC8vIFRPRE8gZW5jb2RlIG9yIHZhbGlkYXRlIHNjaGVtZSBzcGVjaWZpYyBwYXJ0CisgICAgICAgICAgICAgICAgdGhpcy5zc3AgPSBwYXJzZXIuZ2V0U3NwKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB0aGlzLnNzcCA9IG51bGw7CisgICAgICAgIGlmIChwYXJzZXIuZ2V0QXV0aG9yaXR5KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHBhcnNlci5nZXRVc2VySW5mbygpID09IG51bGwgJiYgcGFyc2VyLmdldEhvc3QoKSA9PSBudWxsICYmIHBhcnNlci5nZXRQb3J0KCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRoaXMuYXV0aG9yaXR5ID0gZW5jb2RlKHBhcnNlci5nZXRBdXRob3JpdHkoKSwgVXJpQ29tcG9uZW50LlR5cGUuQVVUSE9SSVRZKTsKKyAgICAgICAgICAgICAgICB0aGlzLnVzZXJJbmZvID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0aGlzLmhvc3QgPSBudWxsOworICAgICAgICAgICAgICAgIHRoaXMucG9ydCA9IG51bGw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRoaXMuYXV0aG9yaXR5ID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAocGFyc2VyLmdldFVzZXJJbmZvKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB1c2VySW5mbyhwYXJzZXIuZ2V0VXNlckluZm8oKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwYXJzZXIuZ2V0SG9zdCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaG9zdChwYXJzZXIuZ2V0SG9zdCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHBhcnNlci5nZXRQb3J0KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcnQgPSBwYXJzZXIuZ2V0UG9ydCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChwYXJzZXIuZ2V0UGF0aCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMucGF0aC5zZXRMZW5ndGgoMCk7CisgICAgICAgICAgICBwYXRoKHBhcnNlci5nZXRQYXRoKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChwYXJzZXIuZ2V0UXVlcnkoKSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLnF1ZXJ5LnNldExlbmd0aCgwKTsKKyAgICAgICAgICAgIHRoaXMucXVlcnkuYXBwZW5kKHBhcnNlci5nZXRRdWVyeSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBKZXJzZXlVcmlCdWlsZGVyIHNjaGVtZShmaW5hbCBTdHJpbmcgc2NoZW1lKSB7CisgICAgICAgIGlmIChzY2hlbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5zY2hlbWUgPSBzY2hlbWU7CisgICAgICAgICAgICBVcmlDb21wb25lbnQudmFsaWRhdGUoc2NoZW1lLCBVcmlDb21wb25lbnQuVHlwZS5TQ0hFTUUsIHRydWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5zY2hlbWUgPSBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBKZXJzZXlVcmlCdWlsZGVyIHNjaGVtZVNwZWNpZmljUGFydChmaW5hbCBTdHJpbmcgc3NwKSB7CisgICAgICAgIGlmIChzc3AgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5VUklfQlVJTERFUl9TQ0hFTUVfUEFSVF9OVUxMKCkpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgVXJpUGFyc2VyIHBhcnNlciA9IG5ldyBVcmlQYXJzZXIoKHNjaGVtZSAhPSBudWxsKSA/IHNjaGVtZSArICI6IiArIHNzcCA6IHNzcCk7CisgICAgICAgIHBhcnNlci5wYXJzZSgpOworCisgICAgICAgIGlmIChwYXJzZXIuZ2V0U2NoZW1lKCkgIT0gbnVsbCAmJiAhcGFyc2VyLmdldFNjaGVtZSgpLmVxdWFscyhzY2hlbWUpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBMb2NhbGl6YXRpb25NZXNzYWdlcy5VUklfQlVJTERFUl9TQ0hFTUVfUEFSVF9VTkVYUEVDVEVEX0NPTVBPTkVOVChzc3AsIHBhcnNlci5nZXRTY2hlbWUoKSkpOworICAgICAgICB9CisgICAgICAgIGlmIChwYXJzZXIuZ2V0RnJhZ21lbnQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBMb2NhbGl6YXRpb25NZXNzYWdlcy5VUklfQlVJTERFUl9VUklfUEFSVF9GUkFHTUVOVChzc3AsIHBhcnNlci5nZXRGcmFnbWVudCgpKSk7CisgICAgICAgIH0KKworICAgICAgICBzY2hlbWVTcGVjaWZpY1BhcnQocGFyc2VyKTsKKworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmVyc2V5VXJpQnVpbGRlciB1c2VySW5mbyhmaW5hbCBTdHJpbmcgdWkpIHsKKyAgICAgICAgY2hlY2tTc3AoKTsKKyAgICAgICAgdGhpcy51c2VySW5mbyA9ICh1aSAhPSBudWxsKQorICAgICAgICAgICAgICAgID8gZW5jb2RlKHVpLCBVcmlDb21wb25lbnQuVHlwZS5VU0VSX0lORk8pIDogbnVsbDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEplcnNleVVyaUJ1aWxkZXIgaG9zdChmaW5hbCBTdHJpbmcgaG9zdCkgeworICAgICAgICBjaGVja1NzcCgpOworICAgICAgICBpZiAoaG9zdCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoaG9zdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLklOVkFMSURfSE9TVCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChJbmV0QWRkcmVzc2VzLmlzTWFwcGVkSVB2NEFkZHJlc3MoaG9zdCkgfHwgSW5ldEFkZHJlc3Nlcy5pc1VyaUluZXRBZGRyZXNzKGhvc3QpKSB7CisgICAgICAgICAgICAgICAgdGhpcy5ob3N0ID0gaG9zdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhpcy5ob3N0ID0gZW5jb2RlKGhvc3QsIFVyaUNvbXBvbmVudC5UeXBlLkhPU1QpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gbnVsbCBpcyB1c2VkIHRvIHJlc2V0IGhvc3Qgc2V0dGluZworICAgICAgICAgICAgdGhpcy5ob3N0ID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmVyc2V5VXJpQnVpbGRlciBwb3J0KGZpbmFsIGludCBwb3J0KSB7CisgICAgICAgIGNoZWNrU3NwKCk7CisgICAgICAgIGlmIChwb3J0IDwgLTEpIHsKKyAgICAgICAgICAgIC8vIC0xIGlzIHVzZWQgdG8gcmVzZXQgcG9ydCBzZXR0aW5nIGFuZCBzaW5jZSBVUkkgYWxsb3dzCisgICAgICAgICAgICAvLyBhcyBwb3J0IGFueSBwb3NpdGl2ZSBpbnRlZ2VyLCBzbyBkbyB3ZS4KKworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5JTlZBTElEX1BPUlQoKSk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5wb3J0ID0gcG9ydCA9PSAtMSA/IG51bGwgOiBTdHJpbmcudmFsdWVPZihwb3J0KTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEplcnNleVVyaUJ1aWxkZXIgcmVwbGFjZVBhdGgoZmluYWwgU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgY2hlY2tTc3AoKTsKKyAgICAgICAgdGhpcy5wYXRoLnNldExlbmd0aCgwKTsKKyAgICAgICAgaWYgKHBhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgYXBwZW5kUGF0aChwYXRoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmVyc2V5VXJpQnVpbGRlciBwYXRoKGZpbmFsIFN0cmluZyBwYXRoKSB7CisgICAgICAgIGNoZWNrU3NwKCk7CisgICAgICAgIGFwcGVuZFBhdGgocGF0aCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBVcmlCdWlsZGVyIHBhdGgoZmluYWwgQ2xhc3MgcmVzb3VyY2UpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgICAgICBjaGVja1NzcCgpOworICAgICAgICBpZiAocmVzb3VyY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5QQVJBTV9OVUxMKCJyZXNvdXJjZSIpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFBhdGggcCA9IFBhdGguY2xhc3MuY2FzdChyZXNvdXJjZS5nZXRBbm5vdGF0aW9uKFBhdGguY2xhc3MpKTsKKyAgICAgICAgaWYgKHAgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5VUklfQlVJTERFUl9DTEFTU19QQVRIX0FOTk9UQVRJT05fTUlTU0lORyhyZXNvdXJjZSkpOworICAgICAgICB9CisgICAgICAgIGFwcGVuZFBhdGgocCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBKZXJzZXlVcmlCdWlsZGVyIHBhdGgoZmluYWwgQ2xhc3MgcmVzb3VyY2UsIGZpbmFsIFN0cmluZyBtZXRob2ROYW1lKSB7CisgICAgICAgIGNoZWNrU3NwKCk7CisgICAgICAgIGlmIChyZXNvdXJjZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlBBUkFNX05VTEwoInJlc291cmNlIikpOworICAgICAgICB9CisgICAgICAgIGlmIChtZXRob2ROYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuUEFSQU1fTlVMTCgibWV0aG9kTmFtZSIpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIE1ldGhvZFtdIG1ldGhvZHMgPSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChSZWZsZWN0aW9uSGVscGVyLmdldE1ldGhvZHNQQShyZXNvdXJjZSkpOworICAgICAgICBNZXRob2QgZm91bmQgPSBudWxsOworICAgICAgICBmb3IgKGZpbmFsIE1ldGhvZCBtIDogbWV0aG9kcykgeworICAgICAgICAgICAgaWYgKG1ldGhvZE5hbWUuZXF1YWxzKG0uZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgIGlmIChmb3VuZCA9PSBudWxsIHx8IGZvdW5kLmlzU3ludGhldGljKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW0uaXNTeW50aGV0aWMoKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGZvdW5kID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuVVJJX0JVSUxERVJfTUVUSE9ETkFNRV9OT1RfU1BFQ0lGSUVEKG1ldGhvZE5hbWUsIHJlc291cmNlKSk7CisgICAgICAgIH0KKworICAgICAgICBhcHBlbmRQYXRoKGdldFBhdGgoZm91bmQpKTsKKworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmVyc2V5VXJpQnVpbGRlciBwYXRoKGZpbmFsIE1ldGhvZCBtZXRob2QpIHsKKyAgICAgICAgY2hlY2tTc3AoKTsKKyAgICAgICAgaWYgKG1ldGhvZCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlBBUkFNX05VTEwoIm1ldGhvZCIpKTsKKyAgICAgICAgfQorICAgICAgICBhcHBlbmRQYXRoKGdldFBhdGgobWV0aG9kKSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHByaXZhdGUgUGF0aCBnZXRQYXRoKGZpbmFsIEFubm90YXRlZEVsZW1lbnQgYWUpIHsKKyAgICAgICAgZmluYWwgUGF0aCBwID0gYWUuZ2V0QW5ub3RhdGlvbihQYXRoLmNsYXNzKTsKKyAgICAgICAgaWYgKHAgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5VUklfQlVJTERFUl9BTk5PVEFURURFTEVNRU5UX1BBVEhfQU5OT1RBVElPTl9NSVNTSU5HKGFlKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEplcnNleVVyaUJ1aWxkZXIgc2VnbWVudChmaW5hbCBTdHJpbmcuLi4gc2VnbWVudHMpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgICAgICBjaGVja1NzcCgpOworICAgICAgICBpZiAoc2VnbWVudHMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5QQVJBTV9OVUxMKCJzZWdtZW50cyIpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIHNlZ21lbnQgOiBzZWdtZW50cykgeworICAgICAgICAgICAgYXBwZW5kUGF0aChzZWdtZW50LCB0cnVlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmVyc2V5VXJpQnVpbGRlciByZXBsYWNlTWF0cml4KGZpbmFsIFN0cmluZyBtYXRyaXgpIHsKKyAgICAgICAgY2hlY2tTc3AoKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiB0cmFpbGluZ1NsYXNoID0gcGF0aC5jaGFyQXQocGF0aC5sZW5ndGgoKSAtIDEpID09ICcvJzsKKyAgICAgICAgZmluYWwgaW50IHNsYXNoSW5kZXggPSB0cmFpbGluZ1NsYXNoID8gcGF0aC5sYXN0SW5kZXhPZigiLyIsIHBhdGgubGVuZ3RoKCkgLSAyKSA6IHBhdGgubGFzdEluZGV4T2YoIi8iKTsKKworICAgICAgICBmaW5hbCBpbnQgaSA9IHBhdGguaW5kZXhPZigiOyIsIHNsYXNoSW5kZXgpOworCisgICAgICAgIGlmIChpICE9IC0xKSB7CisgICAgICAgICAgICBwYXRoLnNldExlbmd0aChpICsgMSk7CisgICAgICAgIH0gZWxzZSBpZiAobWF0cml4ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHBhdGguYXBwZW5kKCc7Jyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWF0cml4ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHBhdGguYXBwZW5kKGVuY29kZShtYXRyaXgsIFVyaUNvbXBvbmVudC5UeXBlLlBBVEgpKTsKKyAgICAgICAgfSBlbHNlIGlmIChpICE9IC0xKSB7CisgICAgICAgICAgICBwYXRoLnNldExlbmd0aChpKTsKKworICAgICAgICAgICAgaWYgKHRyYWlsaW5nU2xhc2gpIHsKKyAgICAgICAgICAgICAgICBwYXRoLmFwcGVuZCgiLyIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEplcnNleVVyaUJ1aWxkZXIgbWF0cml4UGFyYW0oU3RyaW5nIG5hbWUsIGZpbmFsIE9iamVjdC4uLiB2YWx1ZXMpIHsKKyAgICAgICAgY2hlY2tTc3AoKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5QQVJBTV9OVUxMKCJuYW1lIikpOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5QQVJBTV9OVUxMKCJ2YWx1ZSIpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIG5hbWUgPSBlbmNvZGUobmFtZSwgVXJpQ29tcG9uZW50LlR5cGUuTUFUUklYX1BBUkFNKTsKKyAgICAgICAgaWYgKG1hdHJpeFBhcmFtcyA9PSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGZpbmFsIE9iamVjdCB2YWx1ZSA6IHZhbHVlcykgeworICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kKCc7JykuYXBwZW5kKG5hbWUpOworCisgICAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5NQVRSSVhfUEFSQU1fTlVMTCgpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc3RyaW5nVmFsdWUgPSB2YWx1ZS50b1N0cmluZygpOworICAgICAgICAgICAgICAgIGlmICghc3RyaW5nVmFsdWUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kKCc9JykuYXBwZW5kKGVuY29kZShzdHJpbmdWYWx1ZSwgVXJpQ29tcG9uZW50LlR5cGUuTUFUUklYX1BBUkFNKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChmaW5hbCBPYmplY3QgdmFsdWUgOiB2YWx1ZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLk1BVFJJWF9QQVJBTV9OVUxMKCkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1hdHJpeFBhcmFtcy5hZGQobmFtZSwgZW5jb2RlKHZhbHVlLnRvU3RyaW5nKCksIFVyaUNvbXBvbmVudC5UeXBlLk1BVFJJWF9QQVJBTSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBKZXJzZXlVcmlCdWlsZGVyIHJlcGxhY2VNYXRyaXhQYXJhbShTdHJpbmcgbmFtZSwgZmluYWwgT2JqZWN0Li4uIHZhbHVlcykgeworICAgICAgICBjaGVja1NzcCgpOworCisgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuUEFSQU1fTlVMTCgibmFtZSIpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtYXRyaXhQYXJhbXMgPT0gbnVsbCkgeworICAgICAgICAgICAgaW50IGkgPSBwYXRoLmxhc3RJbmRleE9mKCIvIik7CisgICAgICAgICAgICBpZiAoaSA9PSAtMSkgeworICAgICAgICAgICAgICAgIGkgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWF0cml4UGFyYW1zID0gVXJpQ29tcG9uZW50LmRlY29kZU1hdHJpeChwYXRoLnN1YnN0cmluZyhpKSwgZmFsc2UpOworICAgICAgICAgICAgaSA9IHBhdGguaW5kZXhPZigiOyIsIGkpOworICAgICAgICAgICAgaWYgKGkgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBwYXRoLnNldExlbmd0aChpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG5hbWUgPSBlbmNvZGUobmFtZSwgVXJpQ29tcG9uZW50LlR5cGUuTUFUUklYX1BBUkFNKTsKKyAgICAgICAgbWF0cml4UGFyYW1zLnJlbW92ZShuYW1lKTsKKyAgICAgICAgaWYgKHZhbHVlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGZpbmFsIE9iamVjdCB2YWx1ZSA6IHZhbHVlcykgeworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuTUFUUklYX1BBUkFNX05VTEwoKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbWF0cml4UGFyYW1zLmFkZChuYW1lLCBlbmNvZGUodmFsdWUudG9TdHJpbmcoKSwgVXJpQ29tcG9uZW50LlR5cGUuTUFUUklYX1BBUkFNKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEplcnNleVVyaUJ1aWxkZXIgcmVwbGFjZVF1ZXJ5KGZpbmFsIFN0cmluZyBxdWVyeSkgeworICAgICAgICBjaGVja1NzcCgpOworICAgICAgICB0aGlzLnF1ZXJ5LnNldExlbmd0aCgwKTsKKyAgICAgICAgaWYgKHF1ZXJ5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMucXVlcnkuYXBwZW5kKGVuY29kZShxdWVyeSwgVXJpQ29tcG9uZW50LlR5cGUuUVVFUlkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmVyc2V5VXJpQnVpbGRlciBxdWVyeVBhcmFtKFN0cmluZyBuYW1lLCBmaW5hbCBPYmplY3QuLi4gdmFsdWVzKSB7CisgICAgICAgIGNoZWNrU3NwKCk7CisgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuUEFSQU1fTlVMTCgibmFtZSIpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuUEFSQU1fTlVMTCgidmFsdWVzIikpOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZXMubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgbmFtZSA9IGVuY29kZShuYW1lLCBVcmlDb21wb25lbnQuVHlwZS5RVUVSWV9QQVJBTSk7CisgICAgICAgIGlmIChxdWVyeVBhcmFtcyA9PSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGZpbmFsIE9iamVjdCB2YWx1ZSA6IHZhbHVlcykgeworICAgICAgICAgICAgICAgIGlmIChxdWVyeS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcXVlcnkuYXBwZW5kKCcmJyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHF1ZXJ5LmFwcGVuZChuYW1lKTsKKworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuUVVFUllfUEFSQU1fTlVMTCgpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBxdWVyeS5hcHBlbmQoJz0nKS5hcHBlbmQoZW5jb2RlKHZhbHVlLnRvU3RyaW5nKCksIFVyaUNvbXBvbmVudC5UeXBlLlFVRVJZX1BBUkFNKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGZpbmFsIE9iamVjdCB2YWx1ZSA6IHZhbHVlcykgeworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuUVVFUllfUEFSQU1fTlVMTCgpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBxdWVyeVBhcmFtcy5hZGQobmFtZSwgZW5jb2RlKHZhbHVlLnRvU3RyaW5nKCksIFVyaUNvbXBvbmVudC5UeXBlLlFVRVJZX1BBUkFNKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEplcnNleVVyaUJ1aWxkZXIgcmVwbGFjZVF1ZXJ5UGFyYW0oU3RyaW5nIG5hbWUsIGZpbmFsIE9iamVjdC4uLiB2YWx1ZXMpIHsKKyAgICAgICAgY2hlY2tTc3AoKTsKKworICAgICAgICBpZiAocXVlcnlQYXJhbXMgPT0gbnVsbCkgeworICAgICAgICAgICAgcXVlcnlQYXJhbXMgPSBVcmlDb21wb25lbnQuZGVjb2RlUXVlcnkocXVlcnkudG9TdHJpbmcoKSwgZmFsc2UsIGZhbHNlKTsKKyAgICAgICAgICAgIHF1ZXJ5LnNldExlbmd0aCgwKTsKKyAgICAgICAgfQorCisgICAgICAgIG5hbWUgPSBlbmNvZGUobmFtZSwgVXJpQ29tcG9uZW50LlR5cGUuUVVFUllfUEFSQU0pOworICAgICAgICBxdWVyeVBhcmFtcy5yZW1vdmUobmFtZSk7CisKKyAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoZmluYWwgT2JqZWN0IHZhbHVlIDogdmFsdWVzKSB7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuUVVFUllfUEFSQU1fTlVMTCgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcXVlcnlQYXJhbXMuYWRkKG5hbWUsIGVuY29kZSh2YWx1ZS50b1N0cmluZygpLCBVcmlDb21wb25lbnQuVHlwZS5RVUVSWV9QQVJBTSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBKZXJzZXlVcmlCdWlsZGVyIHJlc29sdmVUZW1wbGF0ZShmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgT2JqZWN0IHZhbHVlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgcmVzb2x2ZVRlbXBsYXRlKG5hbWUsIHZhbHVlLCB0cnVlLCB0cnVlKTsKKworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmVyc2V5VXJpQnVpbGRlciByZXNvbHZlVGVtcGxhdGUoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIE9iamVjdCB2YWx1ZSwgZmluYWwgYm9vbGVhbiBlbmNvZGVTbGFzaEluUGF0aCkgeworICAgICAgICByZXNvbHZlVGVtcGxhdGUobmFtZSwgdmFsdWUsIHRydWUsIGVuY29kZVNsYXNoSW5QYXRoKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEplcnNleVVyaUJ1aWxkZXIgcmVzb2x2ZVRlbXBsYXRlRnJvbUVuY29kZWQoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICByZXNvbHZlVGVtcGxhdGUobmFtZSwgdmFsdWUsIGZhbHNlLCBmYWxzZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHByaXZhdGUgSmVyc2V5VXJpQnVpbGRlciByZXNvbHZlVGVtcGxhdGUoZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGVuY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gZW5jb2RlU2xhc2hJblBhdGgpIHsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5QQVJBTV9OVUxMKCJuYW1lIikpOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlBBUkFNX05VTEwoInZhbHVlIikpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiB0ZW1wbGF0ZVZhbHVlcyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgdGVtcGxhdGVWYWx1ZXMucHV0KG5hbWUsIHZhbHVlKTsKKyAgICAgICAgcmVzb2x2ZVRlbXBsYXRlcyh0ZW1wbGF0ZVZhbHVlcywgZW5jb2RlLCBlbmNvZGVTbGFzaEluUGF0aCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBKZXJzZXlVcmlCdWlsZGVyIHJlc29sdmVUZW1wbGF0ZXMoZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiB0ZW1wbGF0ZVZhbHVlcykgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgIHJlc29sdmVUZW1wbGF0ZXModGVtcGxhdGVWYWx1ZXMsIHRydWUsIHRydWUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmVyc2V5VXJpQnVpbGRlciByZXNvbHZlVGVtcGxhdGVzKGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gdGVtcGxhdGVWYWx1ZXMsIGZpbmFsIGJvb2xlYW4gZW5jb2RlU2xhc2hJblBhdGgpIHRocm93cworICAgICAgICAgICAgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgcmVzb2x2ZVRlbXBsYXRlcyh0ZW1wbGF0ZVZhbHVlcywgdHJ1ZSwgZW5jb2RlU2xhc2hJblBhdGgpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmVyc2V5VXJpQnVpbGRlciByZXNvbHZlVGVtcGxhdGVzRnJvbUVuY29kZWQoZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiB0ZW1wbGF0ZVZhbHVlcykgeworICAgICAgICByZXNvbHZlVGVtcGxhdGVzKHRlbXBsYXRlVmFsdWVzLCBmYWxzZSwgZmFsc2UpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwcml2YXRlIEplcnNleVVyaUJ1aWxkZXIgcmVzb2x2ZVRlbXBsYXRlcyhmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IHRlbXBsYXRlVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gZW5jb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gZW5jb2RlU2xhc2hJblBhdGgpIHsKKyAgICAgICAgaWYgKHRlbXBsYXRlVmFsdWVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuUEFSQU1fTlVMTCgidGVtcGxhdGVWYWx1ZXMiKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeSBlbnRyeSA6IHRlbXBsYXRlVmFsdWVzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnkuZ2V0S2V5KCkgPT0gbnVsbCB8fCBlbnRyeS5nZXRWYWx1ZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5URU1QTEFURV9QQVJBTV9OVUxMKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNjaGVtZSA9IFVyaVRlbXBsYXRlLnJlc29sdmVUZW1wbGF0ZVZhbHVlcyhVcmlDb21wb25lbnQuVHlwZS5TQ0hFTUUsIHNjaGVtZSwgZmFsc2UsIHRlbXBsYXRlVmFsdWVzKTsKKyAgICAgICAgdXNlckluZm8gPSBVcmlUZW1wbGF0ZS5yZXNvbHZlVGVtcGxhdGVWYWx1ZXMoVXJpQ29tcG9uZW50LlR5cGUuVVNFUl9JTkZPLCB1c2VySW5mbywgZW5jb2RlLCB0ZW1wbGF0ZVZhbHVlcyk7CisgICAgICAgIGhvc3QgPSBVcmlUZW1wbGF0ZS5yZXNvbHZlVGVtcGxhdGVWYWx1ZXMoVXJpQ29tcG9uZW50LlR5cGUuSE9TVCwgaG9zdCwgZW5jb2RlLCB0ZW1wbGF0ZVZhbHVlcyk7CisgICAgICAgIHBvcnQgPSBVcmlUZW1wbGF0ZS5yZXNvbHZlVGVtcGxhdGVWYWx1ZXMoVXJpQ29tcG9uZW50LlR5cGUuUE9SVCwgcG9ydCwgZmFsc2UsIHRlbXBsYXRlVmFsdWVzKTsKKyAgICAgICAgYXV0aG9yaXR5ID0gVXJpVGVtcGxhdGUucmVzb2x2ZVRlbXBsYXRlVmFsdWVzKFVyaUNvbXBvbmVudC5UeXBlLkFVVEhPUklUWSwgYXV0aG9yaXR5LCBlbmNvZGUsIHRlbXBsYXRlVmFsdWVzKTsKKworICAgICAgICAvLyBwYXRoIHRlbXBsYXRlIHZhbHVlcyBhcmUgdHJlYXRlZCBhcyBwYXRoIHNlZ21lbnRzIHVubGVzcyBlbmNvZGVTbGFzaEluUGF0aCBpcyBmYWxzZS4KKyAgICAgICAgZmluYWwgVXJpQ29tcG9uZW50LlR5cGUgcGF0aENvbXBvbmVudCA9IChlbmNvZGVTbGFzaEluUGF0aCkgPyBVcmlDb21wb25lbnQuVHlwZS5QQVRIX1NFR01FTlQgOiBVcmlDb21wb25lbnQuVHlwZS5QQVRIOworICAgICAgICBmaW5hbCBTdHJpbmcgbmV3UGF0aCA9IFVyaVRlbXBsYXRlLnJlc29sdmVUZW1wbGF0ZVZhbHVlcyhwYXRoQ29tcG9uZW50LCBwYXRoLnRvU3RyaW5nKCksIGVuY29kZSwgdGVtcGxhdGVWYWx1ZXMpOworICAgICAgICBwYXRoLnNldExlbmd0aCgwKTsKKyAgICAgICAgcGF0aC5hcHBlbmQobmV3UGF0aCk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIG5ld1F1ZXJ5ID0gVXJpVGVtcGxhdGUucmVzb2x2ZVRlbXBsYXRlVmFsdWVzKFVyaUNvbXBvbmVudC5UeXBlLlFVRVJZX1BBUkFNLCBxdWVyeS50b1N0cmluZygpLCBlbmNvZGUsCisgICAgICAgICAgICAgICAgdGVtcGxhdGVWYWx1ZXMpOworICAgICAgICBxdWVyeS5zZXRMZW5ndGgoMCk7CisgICAgICAgIHF1ZXJ5LmFwcGVuZChuZXdRdWVyeSk7CisKKyAgICAgICAgZnJhZ21lbnQgPSBVcmlUZW1wbGF0ZS5yZXNvbHZlVGVtcGxhdGVWYWx1ZXMoVXJpQ29tcG9uZW50LlR5cGUuRlJBR01FTlQsIGZyYWdtZW50LCBlbmNvZGUsIHRlbXBsYXRlVmFsdWVzKTsKKworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSmVyc2V5VXJpQnVpbGRlciBmcmFnbWVudChmaW5hbCBTdHJpbmcgZnJhZ21lbnQpIHsKKyAgICAgICAgdGhpcy5mcmFnbWVudCA9IChmcmFnbWVudCAhPSBudWxsKQorICAgICAgICAgICAgICAgID8gZW5jb2RlKGZyYWdtZW50LCBVcmlDb21wb25lbnQuVHlwZS5GUkFHTUVOVCkKKyAgICAgICAgICAgICAgICA6IG51bGw7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja1NzcCgpIHsKKyAgICAgICAgaWYgKHNzcCAhPSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlVSSV9CVUlMREVSX1NDSEVNQV9QQVJUX09QQVFVRSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhcHBlbmRQYXRoKGZpbmFsIFBhdGggcGF0aCkgeworICAgICAgICBpZiAocGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlBBUkFNX05VTEwoInBhdGgiKSk7CisgICAgICAgIH0KKworICAgICAgICBhcHBlbmRQYXRoKHBhdGgudmFsdWUoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFwcGVuZFBhdGgoZmluYWwgU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgYXBwZW5kUGF0aChwYXRoLCBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFwcGVuZFBhdGgoU3RyaW5nIHNlZ21lbnRzLCBmaW5hbCBib29sZWFuIGlzU2VnbWVudCkgeworICAgICAgICBpZiAoc2VnbWVudHMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5QQVJBTV9OVUxMKCJzZWdtZW50cyIpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2VnbWVudHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBFbmNvZGUgbWF0cml4IHBhcmFtZXRlcnMgb24gY3VycmVudCBwYXRoIHNlZ21lbnQKKyAgICAgICAgZW5jb2RlTWF0cml4KCk7CisKKyAgICAgICAgc2VnbWVudHMgPSBlbmNvZGUoc2VnbWVudHMsCisgICAgICAgICAgICAgICAgKGlzU2VnbWVudCkgPyBVcmlDb21wb25lbnQuVHlwZS5QQVRIX1NFR01FTlQgOiBVcmlDb21wb25lbnQuVHlwZS5QQVRIKTsKKworICAgICAgICBmaW5hbCBib29sZWFuIHBhdGhFbmRzSW5TbGFzaCA9IHBhdGgubGVuZ3RoKCkgPiAwICYmIHBhdGguY2hhckF0KHBhdGgubGVuZ3RoKCkgLSAxKSA9PSAnLyc7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gc2VnbWVudFN0YXJ0c1dpdGhTbGFzaCA9IHNlZ21lbnRzLmNoYXJBdCgwKSA9PSAnLyc7CisKKyAgICAgICAgaWYgKHBhdGgubGVuZ3RoKCkgPiAwICYmICFwYXRoRW5kc0luU2xhc2ggJiYgIXNlZ21lbnRTdGFydHNXaXRoU2xhc2gpIHsKKyAgICAgICAgICAgIHBhdGguYXBwZW5kKCcvJyk7CisgICAgICAgIH0gZWxzZSBpZiAocGF0aEVuZHNJblNsYXNoICYmIHNlZ21lbnRTdGFydHNXaXRoU2xhc2gpIHsKKyAgICAgICAgICAgIHNlZ21lbnRzID0gc2VnbWVudHMuc3Vic3RyaW5nKDEpOworICAgICAgICAgICAgaWYgKHNlZ21lbnRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHBhdGguYXBwZW5kKHNlZ21lbnRzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5jb2RlTWF0cml4KCkgeworICAgICAgICBpZiAobWF0cml4UGFyYW1zID09IG51bGwgfHwgbWF0cml4UGFyYW1zLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGUgOiBtYXRyaXhQYXJhbXMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSBlLmdldEtleSgpOworCisgICAgICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyB2YWx1ZSA6IGUuZ2V0VmFsdWUoKSkgeworICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kKCc7JykuYXBwZW5kKG5hbWUpOworICAgICAgICAgICAgICAgIGlmICghdmFsdWUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHBhdGguYXBwZW5kKCc9JykuYXBwZW5kKHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbWF0cml4UGFyYW1zID0gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5jb2RlUXVlcnkoKSB7CisgICAgICAgIGlmIChxdWVyeVBhcmFtcyA9PSBudWxsIHx8IHF1ZXJ5UGFyYW1zLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGUgOiBxdWVyeVBhcmFtcy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IGUuZ2V0S2V5KCk7CisKKyAgICAgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIHZhbHVlIDogZS5nZXRWYWx1ZSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKHF1ZXJ5Lmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBxdWVyeS5hcHBlbmQoJyYnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcXVlcnkuYXBwZW5kKG5hbWUpLmFwcGVuZCgnPScpLmFwcGVuZCh2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcXVlcnlQYXJhbXMgPSBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGVuY29kZShmaW5hbCBTdHJpbmcgcywgZmluYWwgVXJpQ29tcG9uZW50LlR5cGUgdHlwZSkgeworICAgICAgICByZXR1cm4gVXJpQ29tcG9uZW50LmNvbnRleHR1YWxFbmNvZGUocywgdHlwZSwgdHJ1ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFVSSSBidWlsZEZyb21NYXAoZmluYWwgTWFwPFN0cmluZywgPz4gdmFsdWVzKSB7CisgICAgICAgIHJldHVybiBfYnVpbGRGcm9tTWFwKHRydWUsIHRydWUsIHZhbHVlcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFVSSSBidWlsZEZyb21NYXAoZmluYWwgTWFwPFN0cmluZywgPz4gdmFsdWVzLCBmaW5hbCBib29sZWFuIGVuY29kZVNsYXNoSW5QYXRoKSB7CisgICAgICAgIHJldHVybiBfYnVpbGRGcm9tTWFwKHRydWUsIGVuY29kZVNsYXNoSW5QYXRoLCB2YWx1ZXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBVUkkgYnVpbGRGcm9tRW5jb2RlZE1hcChmaW5hbCBNYXA8U3RyaW5nLCA/PiB2YWx1ZXMpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIFVyaUJ1aWxkZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gX2J1aWxkRnJvbU1hcChmYWxzZSwgZmFsc2UsIHZhbHVlcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBVUkkgX2J1aWxkRnJvbU1hcChmaW5hbCBib29sZWFuIGVuY29kZSwgZmluYWwgYm9vbGVhbiBlbmNvZGVTbGFzaEluUGF0aCwgZmluYWwgTWFwPFN0cmluZywgPz4gdmFsdWVzKSB7CisgICAgICAgIGlmIChzc3AgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5VUklfQlVJTERFUl9TQ0hFTUFfUEFSVF9PUEFRVUUoKSk7CisgICAgICAgIH0KKworICAgICAgICBlbmNvZGVNYXRyaXgoKTsKKyAgICAgICAgZW5jb2RlUXVlcnkoKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgdXJpID0gVXJpVGVtcGxhdGUuY3JlYXRlVVJJKAorICAgICAgICAgICAgICAgIHNjaGVtZSwgYXV0aG9yaXR5LAorICAgICAgICAgICAgICAgIHVzZXJJbmZvLCBob3N0LCBwb3J0LAorICAgICAgICAgICAgICAgIHBhdGgudG9TdHJpbmcoKSwgcXVlcnkudG9TdHJpbmcoKSwgZnJhZ21lbnQsIHZhbHVlcywgZW5jb2RlLCBlbmNvZGVTbGFzaEluUGF0aCk7CisgICAgICAgIHJldHVybiBjcmVhdGVVUkkodXJpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVVJJIGJ1aWxkKGZpbmFsIE9iamVjdC4uLiB2YWx1ZXMpIHsKKyAgICAgICAgcmV0dXJuIF9idWlsZCh0cnVlLCB0cnVlLCB2YWx1ZXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBVUkkgYnVpbGQoZmluYWwgT2JqZWN0W10gdmFsdWVzLCBmaW5hbCBib29sZWFuIGVuY29kZVNsYXNoSW5QYXRoKSB7CisgICAgICAgIHJldHVybiBfYnVpbGQodHJ1ZSwgZW5jb2RlU2xhc2hJblBhdGgsIHZhbHVlcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFVSSSBidWlsZEZyb21FbmNvZGVkKGZpbmFsIE9iamVjdC4uLiB2YWx1ZXMpIHsKKyAgICAgICAgcmV0dXJuIF9idWlsZChmYWxzZSwgZmFsc2UsIHZhbHVlcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1RlbXBsYXRlKCkgeworICAgICAgICBlbmNvZGVNYXRyaXgoKTsKKyAgICAgICAgZW5jb2RlUXVlcnkoKTsKKworICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworICAgICAgICBpZiAoc2NoZW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZChzY2hlbWUpLmFwcGVuZCgnOicpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNzcCAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoc3NwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJvb2xlYW4gaGFzQXV0aG9yaXR5ID0gZmFsc2U7CisgICAgICAgICAgICBpZiAodXNlckluZm8gIT0gbnVsbCB8fCBob3N0ICE9IG51bGwgfHwgcG9ydCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaGFzQXV0aG9yaXR5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIi8vIik7CisKKyAgICAgICAgICAgICAgICBpZiAodXNlckluZm8gIT0gbnVsbCAmJiAhdXNlckluZm8uaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCh1c2VySW5mbykuYXBwZW5kKCdAJyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGhvc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIGNoZWNrIElQdjYgYWRkcmVzcworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoaG9zdCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHBvcnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJzonKS5hcHBlbmQocG9ydCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChhdXRob3JpdHkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGhhc0F1dGhvcml0eSA9IHRydWU7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIvLyIpLmFwcGVuZChhdXRob3JpdHkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocGF0aC5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoaGFzQXV0aG9yaXR5ICYmIHBhdGguY2hhckF0KDApICE9ICcvJykgeworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIi8iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHBhdGgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChoYXNBdXRob3JpdHkgJiYgKHF1ZXJ5Lmxlbmd0aCgpID4gMCB8fCAoZnJhZ21lbnQgIT0gbnVsbCAmJiAhZnJhZ21lbnQuaXNFbXB0eSgpKSkpIHsKKyAgICAgICAgICAgICAgICAvLyBpZiBoYXMgYXV0aG9yaXR5IGFuZCBxdWVyeSBvciBmcmFnbWVudCBhbmQgbm8gcGF0aCB2YWx1ZSwgd2UgbmVlZCB0byBhcHBlbmQgcm9vdCAnLycgdG8gdGhlIHBhdGgKKyAgICAgICAgICAgICAgICAvLyBzZWUgVVJJIFJGQyAzOTg2IHNlY3Rpb24gMy4zCisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIvIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChxdWVyeS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJz8nKS5hcHBlbmQocXVlcnkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGZyYWdtZW50ICE9IG51bGwgJiYgIWZyYWdtZW50LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCcjJykuYXBwZW5kKGZyYWdtZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIHByaXZhdGUgVVJJIF9idWlsZChmaW5hbCBib29sZWFuIGVuY29kZSwgZmluYWwgYm9vbGVhbiBlbmNvZGVTbGFzaEluUGF0aCwgZmluYWwgT2JqZWN0Li4uIHZhbHVlcykgeworICAgICAgICBpZiAoc3NwICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCB8fCB2YWx1ZXMubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlVVJJKGNyZWF0ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuVVJJX0JVSUxERVJfU0NIRU1BX1BBUlRfT1BBUVVFKCkpOworICAgICAgICB9CisKKyAgICAgICAgZW5jb2RlTWF0cml4KCk7CisgICAgICAgIGVuY29kZVF1ZXJ5KCk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHVyaSA9IFVyaVRlbXBsYXRlLmNyZWF0ZVVSSSgKKyAgICAgICAgICAgICAgICBzY2hlbWUsIGF1dGhvcml0eSwKKyAgICAgICAgICAgICAgICB1c2VySW5mbywgaG9zdCwgcG9ydCwKKyAgICAgICAgICAgICAgICBwYXRoLnRvU3RyaW5nKCksIHF1ZXJ5LnRvU3RyaW5nKCksIGZyYWdtZW50LCB2YWx1ZXMsIGVuY29kZSwgZW5jb2RlU2xhc2hJblBhdGgpOworICAgICAgICByZXR1cm4gY3JlYXRlVVJJKHVyaSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlKCkgeworICAgICAgICByZXR1cm4gVXJpQ29tcG9uZW50LmVuY29kZVRlbXBsYXRlTmFtZXModG9UZW1wbGF0ZSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFVSSSBjcmVhdGVVUkkoZmluYWwgU3RyaW5nIHVyaSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkkodXJpKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgVVJJU3ludGF4RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVXJpQnVpbGRlckV4Y2VwdGlvbihleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gdG9UZW1wbGF0ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSBVUkkgcmVwcmVzZW50ZWQgYnkgdGhpcyB7QGNvZGUgVXJpQnVpbGRlcn0gaXMgYWJzb2x1dGUuCisgICAgICogPHAvPgorICAgICAqIEEgVVJJIGlzIGFic29sdXRlIGlmLCBhbmQgb25seSBpZiwgaXQgaGFzIGEgc2NoZW1lIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmLCBhbmQgb25seSBpZiwgdGhlIFVSSSByZXByZXNlbnRlZCBieSB0aGlzIHtAY29kZSBVcmlCdWlsZGVyfSBpcyBhYnNvbHV0ZS4KKyAgICAgKiBAc2luY2UgMi43CisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNBYnNvbHV0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHNjaGVtZSAhPSBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdXJpL2ludGVybmFsL1VyaVBhcnNlci5qYXZhIGIvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS91cmkvaW50ZXJuYWwvVXJpUGFyc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBjODM4NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdXJpL2ludGVybmFsL1VyaVBhcnNlci5qYXZhCkBAIC0wLDAgKzEsMzYwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnVyaS5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworCisvKioKKyAqIFBhcnNlciBmb3Igc3RyaW5nIFVSSSB3aXRoIHRlbXBsYXRlIHBhcmFtZXRlcnMgd2hpY2ggcHJvZHVjZXMge0BsaW5rIGphdmEubmV0LlVSSSBVUklzfSBmcm9tIFN0cmluZ3MuCisgKiBFeGFtcGxlIG9mIHBhcnNlZCB1cmk6IHtAY29kZSAiaHR0cDovL3VzZXJAe2hvc3R9Ontwb3J0fS9hL3twYXRofT9xdWVyeT0xI2ZyYWdtZW50In0uCisgKiBUaGUgcGFyc2VyIGlzIG5vdCB0aHJlYWQgc2FmZS4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitjbGFzcyBVcmlQYXJzZXIgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9TVEFURSA9IExvY2FsaXphdGlvbk1lc3NhZ2VzLlVSSV9QQVJTRVJfTk9UX0VYRUNVVEVEKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaW5wdXQ7CisgICAgcHJpdmF0ZSBDaGFyYWN0ZXJJdGVyYXRvciBjaTsKKyAgICBwcml2YXRlIFN0cmluZyBzY2hlbWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgdXNlckluZm87CisgICAgcHJpdmF0ZSBTdHJpbmcgaG9zdDsKKyAgICBwcml2YXRlIFN0cmluZyBwb3J0OworICAgIHByaXZhdGUgU3RyaW5nIHF1ZXJ5OworICAgIHByaXZhdGUgU3RyaW5nIHBhdGg7CisgICAgcHJpdmF0ZSBTdHJpbmcgZnJhZ21lbnQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgc3NwOworICAgIHByaXZhdGUgU3RyaW5nIGF1dGhvcml0eTsKKyAgICBwcml2YXRlIGJvb2xlYW4gb3BhcXVlOworICAgIHByaXZhdGUgYm9vbGVhbiBwYXJzZXJFeGVjdXRlZDsKKworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBuZXcgcGFyc2VyIGluaXRpYWxpemVkIHdpdGgge0Bjb2RlIHVyaX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpIFN0cmluZyB3aXRoIFVSSSB0byBiZSBwYXJzZWQuIE1heSBjb250YWluIHRlbXBsYXRlIHBhcmFtZXRlcnMuCisgICAgICovCisgICAgVXJpUGFyc2VyKFN0cmluZyB1cmkpIHsKKyAgICAgICAgdGhpcy5pbnB1dCA9IHVyaTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBwYXJzZUNvbXBvbmVudFdpdGhJUChTdHJpbmcgZGVsaW1pdGVycywgYm9vbGVhbiBtYXlFbmQpIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlQ29tcG9uZW50KGRlbGltaXRlcnMsIG1heUVuZCwgdHJ1ZSk7CisgICAgfQorCisKKyAgICBwcml2YXRlIFN0cmluZyBwYXJzZUNvbXBvbmVudChTdHJpbmcgZGVsaW1pdGVycywgYm9vbGVhbiBtYXlFbmQpIHsKKyAgICAgICAgcmV0dXJuIHBhcnNlQ29tcG9uZW50KGRlbGltaXRlcnMsIG1heUVuZCwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnNlcyB0aGUgVVJJIGNvbXBvbmVudC4gUGFyc2luZyBzdGFydHMgYXQgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBvZgorICAgICAqIGNvbXBvbmVudCBhbmQgZW5kcyB3aXRoIHBvc2l0aW9uIG9mIG9uZSBvZiB0aGUgZGVsaW1pdGVycy4gVGhlIHN0cmluZyBhbmQgY3VycmVudAorICAgICAqIHBvc2l0aW9uIGlzIHRha2VuIGZyb20gdGhlIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS51cmkuaW50ZXJuYWwuQ2hhcmFjdGVySXRlcmF0b3J9LgorICAgICAqCisgICAgICogQHBhcmFtIGRlbGltaXRlcnMgU3RyaW5nIHdpdGggZGVsaW1pdGVycyB3aGljaCB0ZXJtaW5hdGVzIHRoZSBjb21wb25lbnQuCisgICAgICogQHBhcmFtIG1heUVuZCAgICAgVHJ1ZSBpZiBjb21wb25lbnQgbWlnaHQgYmUgdGhlIGxhc3QgcGFydCBvZiB0aGUgVVJJLgorICAgICAqIEBwYXJhbSBpc0lwICAgICAgIFRydWUgaWYgdGhlIGNvbXBvbmVudCBtaWdodCBjb250YWluIElQdjYgYWRkcmVzcy4KKyAgICAgKiBAcmV0dXJuIEV4dHJhY3RlZCBjb21wb25lbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcGFyc2VDb21wb25lbnQoU3RyaW5nIGRlbGltaXRlcnMsIGJvb2xlYW4gbWF5RW5kLCBib29sZWFuIGlzSXApIHsKKworICAgICAgICBpbnQgY3VybHlCcmFja2V0c0NvdW50ID0gMDsKKyAgICAgICAgaW50IHNxdWFyZUJyYWNrZXRzQ291bnQgPSAwOworCisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisgICAgICAgIGJvb2xlYW4gZW5kT2ZJbnB1dCA9IGZhbHNlOworICAgICAgICBjaGFyIGMgPSBjaS5jdXJyZW50KCk7CisgICAgICAgIHdoaWxlICghZW5kT2ZJbnB1dCkgeworICAgICAgICAgICAgaWYgKGMgPT0gJ3snKSB7CisgICAgICAgICAgICAgICAgY3VybHlCcmFja2V0c0NvdW50Kys7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGMpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICd9JykgeworICAgICAgICAgICAgICAgIGN1cmx5QnJhY2tldHNDb3VudC0tOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChjKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNJcCAmJiBjID09ICdbJykgeworICAgICAgICAgICAgICAgIHNxdWFyZUJyYWNrZXRzQ291bnQrKzsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoYyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGlzSXAgJiYgYyA9PSAnXScpIHsKKyAgICAgICAgICAgICAgICBzcXVhcmVCcmFja2V0c0NvdW50LS07CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGMpOworCisgICAgICAgICAgICAgICAgLy8gdGVzdCBJUHY2IG9yIHJlZ3VsYXIgZXhwcmVzc2lvbnMgaW4gdGhlIHRlbXBsYXRlIHBhcmFtcworICAgICAgICAgICAgfSBlbHNlIGlmICgoIWlzSXAgfHwgc3F1YXJlQnJhY2tldHNDb3VudCA9PSAwKSAmJiAoY3VybHlCcmFja2V0c0NvdW50ID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICYmIChkZWxpbWl0ZXJzICE9IG51bGwgJiYgZGVsaW1pdGVycy5pbmRleE9mKGMpID49IDApKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHNiLmxlbmd0aCgpID09IDAgPyBudWxsIDogc2IudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZW5kT2ZJbnB1dCA9ICFjaS5oYXNOZXh0KCk7CisgICAgICAgICAgICBpZiAoIWVuZE9mSW5wdXQpIHsKKyAgICAgICAgICAgICAgICBjID0gY2kubmV4dCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtYXlFbmQpIHsKKyAgICAgICAgICAgIHJldHVybiBzYi5sZW5ndGgoKSA9PSAwID8gbnVsbCA6IHNiLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5VUklfUEFSU0VSX0NPTVBPTkVOVF9ERUxJTUlURVIoZGVsaW1pdGVycywgY2kucG9zKCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgdGhlIGlucHV0IHN0cmluZyBVUkkuIEFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2QgVGhlIHJlc3VsdCBjb21wb25lbnRzIGNhbiBiZSByZXRyaWV2ZWQgYnkgY2FsbGluZyBhcHByb3ByaWF0ZQorICAgICAqIGdldHRlciBtZXRob2RzIGxpa2Uge0BsaW5rICNnZXRIb3N0KCl9LCB7QGxpbmsgI2dldFBvcnQoKX0sIGV0Yy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwYXJzZSgpIHsKKyAgICAgICAgdGhpcy5wYXJzZXJFeGVjdXRlZCA9IHRydWU7CisgICAgICAgIHRoaXMuY2kgPSBuZXcgQ2hhcmFjdGVySXRlcmF0b3IoaW5wdXQpOworICAgICAgICBpZiAoIWNpLmhhc05leHQoKSkgeworICAgICAgICAgICAgLy8gZW1wdHkgc3RyaW5nIG9uIGlucHV0IC0+IHNldCBib3RoIFNTUCBhbmQgcGF0aCB0byAiIgorICAgICAgICAgICAgdGhpcy5wYXRoID0gIiI7CisgICAgICAgICAgICB0aGlzLnNzcCA9ICIiOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNpLm5leHQoKTsKKyAgICAgICAgU3RyaW5nIGNvbXAgPSBwYXJzZUNvbXBvbmVudCgiOi8/IyIsIHRydWUpOworCisgICAgICAgIGlmIChjaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIHRoaXMuc3NwID0gY2kuZ2V0SW5wdXQoKS5zdWJzdHJpbmcoY2kucG9zKCkgKyAxKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMub3BhcXVlID0gZmFsc2U7CisgICAgICAgIGlmIChjaS5jdXJyZW50KCkgPT0gJzonKSB7CisgICAgICAgICAgICAvLyBhYnNvbHV0ZQorICAgICAgICAgICAgaWYgKGNvbXAgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuVVJJX1BBUlNFUl9TQ0hFTUVfRVhQRUNURUQoY2kucG9zKCksIGlucHV0KSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzY2hlbWUgPSBjb21wOworICAgICAgICAgICAgaWYgKCFjaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBlbXB0eSBTU1AvcGF0aCAtPiBzZXQgYm90aCBTU1AgYW5kIHBhdGggdG8gIiIKKyAgICAgICAgICAgICAgICB0aGlzLnBhdGggPSAiIjsKKyAgICAgICAgICAgICAgICB0aGlzLnNzcCA9ICIiOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoYXIgYyA9IGNpLm5leHQoKTsKKyAgICAgICAgICAgIGlmIChjID09ICcvJykgeworICAgICAgICAgICAgICAgIC8vIGhpZXJhcmNoaWNhbAorICAgICAgICAgICAgICAgIHBhcnNlSGllcmFyY2hpY2FsVXJpKCk7CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gb3BhcXVlCisgICAgICAgICAgICAgICAgdGhpcy5vcGFxdWUgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2kuc2V0UG9zaXRpb24oMCk7CisgICAgICAgICAgICAvLyByZWxhdGl2ZQorICAgICAgICAgICAgaWYgKGNpLmN1cnJlbnQoKSA9PSAnLycpIHsKKyAgICAgICAgICAgICAgICBwYXJzZUhpZXJhcmNoaWNhbFVyaSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwYXJzZVBhdGgoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwYXJzZUhpZXJhcmNoaWNhbFVyaSgpIHsKKyAgICAgICAgaWYgKGNpLmhhc05leHQoKSAmJiBjaS5wZWVrKCkgPT0gJy8nKSB7CisgICAgICAgICAgICAvLyBhdXRob3JpdHkKKyAgICAgICAgICAgIGNpLm5leHQoKTsKKyAgICAgICAgICAgIGNpLm5leHQoKTsKKyAgICAgICAgICAgIHBhcnNlQXV0aG9yaXR5KCk7CisKKyAgICAgICAgfQorICAgICAgICBpZiAoIWNpLmhhc05leHQoKSkgeworICAgICAgICAgICAgaWYgKGNpLmN1cnJlbnQoKSA9PSAnLycpIHsKKyAgICAgICAgICAgICAgICBwYXRoID0gIi8iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHBhcnNlUGF0aCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwYXJzZUF1dGhvcml0eSgpIHsKKyAgICAgICAgaW50IHN0YXJ0ID0gY2kucG9zKCk7CisgICAgICAgIFN0cmluZyBjb21wID0gcGFyc2VDb21wb25lbnRXaXRoSVAoIkAvPyMiLCB0cnVlKTsKKyAgICAgICAgaWYgKGNpLmN1cnJlbnQoKSA9PSAnQCcpIHsKKyAgICAgICAgICAgIHRoaXMudXNlckluZm8gPSBjb21wOworICAgICAgICAgICAgaWYgKCFjaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaS5uZXh0KCk7CisgICAgICAgICAgICBjb21wID0gcGFyc2VDb21wb25lbnRXaXRoSVAoIjovPyMiLCB0cnVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNpLnNldFBvc2l0aW9uKHN0YXJ0KTsKKyAgICAgICAgICAgIGNvbXAgPSBwYXJzZUNvbXBvbmVudFdpdGhJUCgiQDovPyMiLCB0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuaG9zdCA9IGNvbXA7CisKKyAgICAgICAgaWYgKGNpLmN1cnJlbnQoKSA9PSAnOicpIHsKKyAgICAgICAgICAgIGlmICghY2kuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2kubmV4dCgpOworICAgICAgICAgICAgdGhpcy5wb3J0ID0gcGFyc2VDb21wb25lbnQoIi8/IyIsIHRydWUpOworICAgICAgICB9CisgICAgICAgIHRoaXMuYXV0aG9yaXR5ID0gY2kuZ2V0SW5wdXQoKS5zdWJzdHJpbmcoc3RhcnQsIGNpLnBvcygpKTsKKyAgICAgICAgaWYgKHRoaXMuYXV0aG9yaXR5Lmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIHRoaXMuYXV0aG9yaXR5ID0gbnVsbDsKKyAgICAgICAgfQorCisKKyAgICB9CisKKworICAgIHByaXZhdGUgdm9pZCBwYXJzZVBhdGgoKSB7CisgICAgICAgIHRoaXMucGF0aCA9IHBhcnNlQ29tcG9uZW50KCI/IyIsIHRydWUpOworCisKKyAgICAgICAgaWYgKGNpLmN1cnJlbnQoKSA9PSAnPycpIHsKKyAgICAgICAgICAgIGlmICghY2kuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2kubmV4dCgpOyAvLyBza2lwID8KKworICAgICAgICAgICAgdGhpcy5xdWVyeSA9IHBhcnNlQ29tcG9uZW50KCIjIiwgdHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2kuY3VycmVudCgpID09ICcjJykgeworICAgICAgICAgICAgaWYgKCFjaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaS5uZXh0KCk7IC8vIHNraXAgIworCisgICAgICAgICAgICB0aGlzLmZyYWdtZW50ID0gcGFyc2VDb21wb25lbnQobnVsbCwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHBhcnNlZCBzY2hlbWUgc3BlY2lmaWMgcGFydC4gVGhlIHtAbGluayAjcGFyc2UoKSBtZXRob2R9IG11c3QgYmUgY2FsbGVkIGJlZm9yZSBleGVjdXRpbmcgdGhpcyBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFNjaGVtZSBzcGVjaWZpYyBwYXJ0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3NwKCkgeworICAgICAgICBpZiAoIXBhcnNlckV4ZWN1dGVkKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKEVSUk9SX1NUQVRFKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3NwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgcGFyc2VkIHNjaGVtZSBjb21wb25lbnQuIFRoZSB7QGxpbmsgI3BhcnNlKCkgbWV0aG9kfSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgZXhlY3V0aW5nIHRoaXMgbWV0aG9kLgorICAgICAqCisgICAgICogQHJldHVybiBTY2hlbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTY2hlbWUoKSB7CisgICAgICAgIGlmICghcGFyc2VyRXhlY3V0ZWQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oRVJST1JfU1RBVEUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzY2hlbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBwYXJzZWQgdXNlciBpbmZvIGNvbXBvbmVudC4gVGhlIHtAbGluayAjcGFyc2UoKSBtZXRob2R9IG11c3QgYmUgY2FsbGVkIGJlZm9yZSBleGVjdXRpbmcgdGhpcyBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFVzZXIgaW5mby4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJJbmZvKCkgeworICAgICAgICBpZiAoIXBhcnNlckV4ZWN1dGVkKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKEVSUk9SX1NUQVRFKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdXNlckluZm87CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBwYXJzZWQgaG9zdCBjb21wb25lbnQuIFRoZSB7QGxpbmsgI3BhcnNlKCkgbWV0aG9kfSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgZXhlY3V0aW5nIHRoaXMgbWV0aG9kLgorICAgICAqCisgICAgICogQHJldHVybiBIb3N0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SG9zdCgpIHsKKyAgICAgICAgaWYgKCFwYXJzZXJFeGVjdXRlZCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihFUlJPUl9TVEFURSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGhvc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBwYXJzZWQgcG9ydCBjb21wb25lbnQuIFRoZSB7QGxpbmsgI3BhcnNlKCkgbWV0aG9kfSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgZXhlY3V0aW5nIHRoaXMgbWV0aG9kLgorICAgICAqCisgICAgICogQHJldHVybiBQb3J0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UG9ydCgpIHsKKyAgICAgICAgaWYgKCFwYXJzZXJFeGVjdXRlZCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihFUlJPUl9TVEFURSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBvcnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBwYXJzZWQgcXVlcnkgY29tcG9uZW50LiBUaGUge0BsaW5rICNwYXJzZSgpIG1ldGhvZH0gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGV4ZWN1dGluZyB0aGlzIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gUXVlcnkuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRRdWVyeSgpIHsKKyAgICAgICAgaWYgKCFwYXJzZXJFeGVjdXRlZCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihFUlJPUl9TVEFURSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHF1ZXJ5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgcGFyc2VkIHBhdGggY29tcG9uZW50LiBUaGUge0BsaW5rICNwYXJzZSgpIG1ldGhvZH0gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGV4ZWN1dGluZyB0aGlzIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gUGF0aC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7CisgICAgICAgIGlmICghcGFyc2VyRXhlY3V0ZWQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oRVJST1JfU1RBVEUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwYXRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgcGFyc2VkIGZyYWdtZW50IGNvbXBvbmVudC4gVGhlIHtAbGluayAjcGFyc2UoKSBtZXRob2R9IG11c3QgYmUgY2FsbGVkIGJlZm9yZSBleGVjdXRpbmcgdGhpcyBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEZyYWdtZW50LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RnJhZ21lbnQoKSB7CisgICAgICAgIGlmICghcGFyc2VyRXhlY3V0ZWQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oRVJST1JfU1RBVEUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmcmFnbWVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHBhcnNlZCBhdXRob3JpdHkgY29tcG9uZW50LiBUaGUge0BsaW5rICNwYXJzZSgpIG1ldGhvZH0gbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGV4ZWN1dGluZyB0aGlzIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQXV0aG9yaXR5LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXV0aG9yaXR5KCkgeworICAgICAgICBpZiAoIXBhcnNlckV4ZWN1dGVkKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKEVSUk9SX1NUQVRFKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYXV0aG9yaXR5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgaW5wdXQgc3RyaW5nIFVSSSBpcyBvcGFxdWUuIFRoZSB7QGxpbmsgI3BhcnNlKCkgbWV0aG9kfSBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgZXhlY3V0aW5nIHRoaXMgbWV0aG9kLgorICAgICAqCisgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSB1cmkgaXMgb3BhcXVlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzT3BhcXVlKCkgeworICAgICAgICBpZiAoIXBhcnNlckV4ZWN1dGVkKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKEVSUk9SX1NUQVRFKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb3BhcXVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdXJpL2ludGVybmFsL1VyaVRlbXBsYXRlUGFyc2VyLmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3VyaS9pbnRlcm5hbC9VcmlUZW1wbGF0ZVBhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZGNiNDkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3VyaS9pbnRlcm5hbC9VcmlUZW1wbGF0ZVBhcnNlci5qYXZhCkBAIC0wLDAgKzEsNDU3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnVyaS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuU3ludGF4RXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudXJpLlVyaUNvbXBvbmVudDsKKworLyoqCisgKiBBIFVSSSB0ZW1wbGF0ZSBwYXJzZXIgdGhhdCBwYXJzZXMgSkFYLVJTIHNwZWNpZmljIFVSSSB0ZW1wbGF0ZXMuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBHZXJhcmQgRGF2aXNvbiAoZ2VyYXJkLmRhdmlzb24gYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFVyaVRlbXBsYXRlUGFyc2VyIHsKKworICAgIC8qIHBhY2thZ2UgKi8gc3RhdGljIGZpbmFsIGludFtdIEVNUFRZX0lOVF9BUlJBWSA9IG5ldyBpbnRbMF07CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PENoYXJhY3Rlcj4gUkVTRVJWRURfUkVHRVhfQ0hBUkFDVEVSUyA9IGluaXRSZXNlcnZlZCgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIEhFWF9UT19VUFBFUkNBU0VfUkVHRVggPSBpbml0SGV4VG9VcHBlckNhc2VSZWdleCgpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgU2V0PENoYXJhY3Rlcj4gaW5pdFJlc2VydmVkKCkgeworICAgICAgICBjaGFyW10gcmVzZXJ2ZWQgPSB7CisgICAgICAgICAgICAgICAgJy4nLCAnXicsICcmJywgJyEnLAorICAgICAgICAgICAgICAgICc/JywgJy0nLCAnOicsICc8JywKKyAgICAgICAgICAgICAgICAnKCcsICdbJywgJyQnLCAnPScsCisgICAgICAgICAgICAgICAgJyknLCAnXScsICcsJywgJz4nLAorICAgICAgICAgICAgICAgICcqJywgJysnLCAnfCd9OworCisgICAgICAgIFNldDxDaGFyYWN0ZXI+IHMgPSBuZXcgSGFzaFNldDxDaGFyYWN0ZXI+KHJlc2VydmVkLmxlbmd0aCk7CisgICAgICAgIGZvciAoY2hhciBjIDogcmVzZXJ2ZWQpIHsKKyAgICAgICAgICAgIHMuYWRkKGMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmF1bHQgVVJJIHRlbXBsYXRlIHZhbHVlIHJlZ2V4cCBwYXR0ZXJuLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUGF0dGVybiBURU1QTEFURV9WQUxVRV9QQVRURVJOID0gUGF0dGVybi5jb21waWxlKCJbXi9dKyIpOworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdGVtcGxhdGU7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdCdWZmZXIgcmVnZXggPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdCdWZmZXIgbm9ybWFsaXplZFRlbXBsYXRlID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nQnVmZmVyIGxpdGVyYWxDaGFyYWN0ZXJzQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgIHByaXZhdGUgZmluYWwgUGF0dGVybiBwYXR0ZXJuOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxTdHJpbmc+IG5hbWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEludGVnZXI+IGdyb3VwQ291bnRzID0gbmV3IEFycmF5TGlzdDxJbnRlZ2VyPigpOworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgUGF0dGVybj4gbmFtZVRvUGF0dGVybiA9IG5ldyBIYXNoTWFwPFN0cmluZywgUGF0dGVybj4oKTsKKyAgICBwcml2YXRlIGludCBudW1PZkV4cGxpY2l0UmVnZXhlczsKKyAgICBwcml2YXRlIGludCBza2lwR3JvdXA7CisKKyAgICBwcml2YXRlIGludCBsaXRlcmFsQ2hhcmFjdGVyczsKKworICAgIC8qKgorICAgICAqIFBhcnNlIGEgdGVtcGxhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGVtcGxhdGUgdGhlIHRlbXBsYXRlLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSB0ZW1wbGF0ZSBpcyBudWxsLCBhbiBlbXB0eSBzdHJpbmcKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBkb2VzIG5vdCBjb25mb3JtIHRvIGEgSkFYLVJTIFVSSSB0ZW1wbGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVXJpVGVtcGxhdGVQYXJzZXIoZmluYWwgU3RyaW5nIHRlbXBsYXRlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHRlbXBsYXRlID09IG51bGwgfHwgdGVtcGxhdGUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUZW1wbGF0ZSBpcyBudWxsIG9yIGhhcyB6ZXJvIGxlbmd0aCIpOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy50ZW1wbGF0ZSA9IHRlbXBsYXRlOworICAgICAgICBwYXJzZShuZXcgQ2hhcmFjdGVySXRlcmF0b3IodGVtcGxhdGUpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHBhdHRlcm4gPSBQYXR0ZXJuLmNvbXBpbGUocmVnZXgudG9TdHJpbmcoKSk7CisgICAgICAgIH0gY2F0Y2ggKFBhdHRlcm5TeW50YXhFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgc3ludGF4IGZvciB0aGUgdGVtcGxhdGUgZXhwcmVzc2lvbiAnIgorICAgICAgICAgICAgICAgICAgICArIHJlZ2V4ICsgIiciLAorICAgICAgICAgICAgICAgICAgICBleAorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdGVtcGxhdGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSB0ZW1wbGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldFRlbXBsYXRlKCkgeworICAgICAgICByZXR1cm4gdGVtcGxhdGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBwYXR0ZXJuLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgcGF0dGVybi4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgUGF0dGVybiBnZXRQYXR0ZXJuKCkgeworICAgICAgICByZXR1cm4gcGF0dGVybjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG5vcm1hbGl6ZWQgdGVtcGxhdGUuCisgICAgICogPHA+CisgICAgICogQSBub3JtYWxpemVkIHRlbXBsYXRlIGlzIGEgdGVtcGxhdGUgd2l0aG91dCBhbnkgZXhwbGljaXQgcmVndWxhcgorICAgICAqIGV4cHJlc3Npb25zLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbm9ybWFsaXplZCB0ZW1wbGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGdldE5vcm1hbGl6ZWRUZW1wbGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRUZW1wbGF0ZS50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbWFwIG9mIHRlbXBsYXRlIG5hbWVzIHRvIHBhdHRlcm5zLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbWFwIG9mIHRlbXBsYXRlIG5hbWVzIHRvIHBhdHRlcm5zLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBNYXA8U3RyaW5nLCBQYXR0ZXJuPiBnZXROYW1lVG9QYXR0ZXJuKCkgeworICAgICAgICByZXR1cm4gbmFtZVRvUGF0dGVybjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGxpc3Qgb2YgdGVtcGxhdGUgbmFtZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIHRlbXBsYXRlIG5hbWVzLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBMaXN0PFN0cmluZz4gZ2V0TmFtZXMoKSB7CisgICAgICAgIHJldHVybiBuYW1lczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNhcHR1cmluZyBncm91cCBjb3VudHMgZm9yIGVhY2ggdGVtcGxhdGUgdmFyaWFibGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjYXB0dXJpbmcgZ3JvdXAgY291bnRzLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBMaXN0PEludGVnZXI+IGdldEdyb3VwQ291bnRzKCkgeworICAgICAgICByZXR1cm4gZ3JvdXBDb3VudHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBncm91cCBpbmRleGVzIHRvIGNhcHR1cmluZyBncm91cHMuCisgICAgICogPHA+CisgICAgICogQW55IG5lc3RlZCBjYXB0dXJpbmcgZ3JvdXBzIHdpbGwgYmUgaWdub3JlZCBhbmQgdGhlCisgICAgICogdGhlIGdyb3VwIGluZGV4IHdpbGwgcmVmZXIgdG8gdGhlIHRvcC1sZXZlbCBjYXB0dXJpbmcKKyAgICAgKiBncm91cHMgYXNzb2NpYXRlZCB3aXRoIHRoZSB0ZW1wbGF0ZXMgdmFyaWFibGVzLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZ3JvdXAgaW5kZXhlcyB0byBjYXB0dXJpbmcgZ3JvdXBzLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBpbnRbXSBnZXRHcm91cEluZGV4ZXMoKSB7CisgICAgICAgIGlmIChuYW1lcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBFTVBUWV9JTlRfQVJSQVk7CisgICAgICAgIH0KKworICAgICAgICBpbnRbXSBpbmRleGVzID0gbmV3IGludFtuYW1lcy5zaXplKCldOworICAgICAgICBpbmRleGVzWzBdID0gMCArIGdyb3VwQ291bnRzLmdldCgwKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBpbmRleGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpbmRleGVzW2ldID0gaW5kZXhlc1tpIC0gMV0gKyBncm91cENvdW50cy5nZXQoaSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gaW5kZXhlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG51bWJlciBvZiBleHBsaWNpdCByZWd1bGFyIGV4cHJlc3Npb25zLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGV4cGxpY2l0IHJlZ3VsYXIgZXhwcmVzc2lvbnMuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIGludCBnZXROdW1iZXJPZkV4cGxpY2l0UmVnZXhlcygpIHsKKyAgICAgICAgcmV0dXJuIG51bU9mRXhwbGljaXRSZWdleGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbnVtYmVyIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbiBncm91cHMKKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiByZWd1bGFyIGV4cHJlc3Npb25zIGdyb3VwcworICAgICAqCisgICAgICogQHNpbmNlIDIuOQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0TnVtYmVyT2ZSZWdleEdyb3VwcygpIHsKKyAgICAgICAgaWYgKGdyb3VwQ291bnRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnRbXSBncm91cEluZGV4ID0gZ2V0R3JvdXBJbmRleGVzKCk7CisgICAgICAgICAgICByZXR1cm4gZ3JvdXBJbmRleFtncm91cEluZGV4Lmxlbmd0aCAtIDFdICsgc2tpcEdyb3VwOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBudW1iZXIgb2YgbGl0ZXJhbCBjaGFyYWN0ZXJzLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGxpdGVyYWwgY2hhcmFjdGVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgaW50IGdldE51bWJlck9mTGl0ZXJhbENoYXJhY3RlcnMoKSB7CisgICAgICAgIHJldHVybiBsaXRlcmFsQ2hhcmFjdGVyczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmNvZGUgbGl0ZXJhbCBjaGFyYWN0ZXJzIG9mIGEgdGVtcGxhdGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2hhcmFjdGVycyB0aGUgbGl0ZXJhbCBjaGFyYWN0ZXJzCisgICAgICogQHJldHVybiB0aGUgZW5jb2RlZCBsaXRlcmFsIGNoYXJhY3RlcnMuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBlbmNvZGVMaXRlcmFsQ2hhcmFjdGVycyhmaW5hbCBTdHJpbmcgY2hhcmFjdGVycykgeworICAgICAgICByZXR1cm4gY2hhcmFjdGVyczsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcGFyc2UoZmluYWwgQ2hhcmFjdGVySXRlcmF0b3IgY2kpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdoaWxlIChjaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBjaGFyIGMgPSBjaS5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gJ3snKSB7CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NMaXRlcmFsQ2hhcmFjdGVycygpOworICAgICAgICAgICAgICAgICAgICBza2lwR3JvdXAgPSBwYXJzZU5hbWUoY2ksIHNraXBHcm91cCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbGl0ZXJhbENoYXJhY3RlcnNCdWZmZXIuYXBwZW5kKGMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByb2Nlc3NMaXRlcmFsQ2hhcmFjdGVycygpOworICAgICAgICB9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX1RFTVBMQVRFX1BBUlNFUl9JTlZBTElEX1NZTlRBWF9URVJNSU5BVEVEKAorICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSksIGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTGl0ZXJhbENoYXJhY3RlcnMoKSB7CisgICAgICAgIGlmIChsaXRlcmFsQ2hhcmFjdGVyc0J1ZmZlci5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIGxpdGVyYWxDaGFyYWN0ZXJzICs9IGxpdGVyYWxDaGFyYWN0ZXJzQnVmZmVyLmxlbmd0aCgpOworCisgICAgICAgICAgICBTdHJpbmcgcyA9IGVuY29kZUxpdGVyYWxDaGFyYWN0ZXJzKGxpdGVyYWxDaGFyYWN0ZXJzQnVmZmVyLnRvU3RyaW5nKCkpOworCisgICAgICAgICAgICBub3JtYWxpemVkVGVtcGxhdGUuYXBwZW5kKHMpOworCisgICAgICAgICAgICAvLyBFc2NhcGUgaWYgcmVzZXJ2ZWQgcmVnZXggY2hhcmFjdGVyCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGNoYXIgYyA9IHMuY2hhckF0KGkpOworICAgICAgICAgICAgICAgIGlmIChSRVNFUlZFRF9SRUdFWF9DSEFSQUNURVJTLmNvbnRhaW5zKGMpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlZ2V4LmFwcGVuZCgiXFwiKTsKKyAgICAgICAgICAgICAgICAgICAgcmVnZXguYXBwZW5kKGMpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnJScpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgY2hhciBjMSA9IHMuY2hhckF0KGkgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgY2hhciBjMiA9IHMuY2hhckF0KGkgKyAyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFVyaUNvbXBvbmVudC5pc0hleENoYXJhY3RlcihjMSkgJiYgVXJpQ29tcG9uZW50LmlzSGV4Q2hhcmFjdGVyKGMyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXguYXBwZW5kKCIlIikuYXBwZW5kKEhFWF9UT19VUFBFUkNBU0VfUkVHRVhbYzFdKS5hcHBlbmQoSEVYX1RPX1VQUEVSQ0FTRV9SRUdFWFtjMl0pOworICAgICAgICAgICAgICAgICAgICAgICAgaSArPSAyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmVnZXguYXBwZW5kKGMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxpdGVyYWxDaGFyYWN0ZXJzQnVmZmVyLnNldExlbmd0aCgwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGluaXRIZXhUb1VwcGVyQ2FzZVJlZ2V4KCkgeworICAgICAgICBTdHJpbmdbXSB0YWJsZSA9IG5ldyBTdHJpbmdbMHg4MF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFibGUubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRhYmxlW2ldID0gU3RyaW5nLnZhbHVlT2YoKGNoYXIpIGkpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChjaGFyIGMgPSAnYSc7IGMgPD0gJ2YnOyBjKyspIHsKKyAgICAgICAgICAgIC8vIGluaXRpYWxpemUgdGFibGUgdmFsdWVzOiB0YWJsZVthXSA9IChbYUFdKSAuLi4KKyAgICAgICAgICAgIHRhYmxlW2NdID0gIlsiICsgYyArIChjaGFyKSAoYyAtICdhJyArICdBJykgKyAiXSI7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGNoYXIgYyA9ICdBJzsgYyA8PSAnRic7IGMrKykgeworICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSB0YWJsZSB2YWx1ZXM6IHRhYmxlW0FdID0gKFthQV0pIC4uLgorICAgICAgICAgICAgdGFibGVbY10gPSAiWyIgKyAoY2hhcikgKGMgLSAnQScgKyAnYScpICsgYyArICJdIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGFibGU7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgcGFyc2VOYW1lKGZpbmFsIENoYXJhY3Rlckl0ZXJhdG9yIGNpLCBpbnQgc2tpcEdyb3VwKSB7CisgICAgICAgIGNoYXIgYyA9IGNvbnN1bWVXaGl0ZVNwYWNlKGNpKTsKKworICAgICAgICBjaGFyIHBhcmFtVHlwZSA9ICdwJzsgLy8gTm9ybWFsIHBhdGggcGFyYW0gdW5sZXNzIG90aGVyd2lzZSBzdGF0ZWQKKyAgICAgICAgU3RyaW5nQnVpbGRlciBuYW1lQnVmZmVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworICAgICAgICAvLyBMb29rIGZvciBxdWVyeSBvciBtYXRyaXggdHlwZXMKKyAgICAgICAgaWYgKGMgPT0gJz8nIHx8IGMgPT0gJzsnKSB7CisgICAgICAgICAgICBwYXJhbVR5cGUgPSBjOworICAgICAgICAgICAgYyA9IGNpLm5leHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChDaGFyYWN0ZXIuaXNMZXR0ZXJPckRpZ2l0KGMpIHx8IGMgPT0gJ18nKSB7CisgICAgICAgICAgICAvLyBUZW1wbGF0ZSBuYW1lIGNoYXJhY3RlcgorICAgICAgICAgICAgbmFtZUJ1ZmZlci5hcHBlbmQoYyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX1RFTVBMQVRFX1BBUlNFUl9JTExFR0FMX0NIQVJfU1RBUlRfTkFNRShjLCBjaS5wb3MoKSwKKyAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUpKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBuYW1lUmVnZXhTdHJpbmcgPSAiIjsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGMgPSBjaS5uZXh0KCk7CisgICAgICAgICAgICAvLyAiXFx7KFxcd1stXFx3XFwuXSopCisgICAgICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzTGV0dGVyT3JEaWdpdChjKSB8fCBjID09ICdfJyB8fCBjID09ICctJyB8fCBjID09ICcuJykgeworICAgICAgICAgICAgICAgIC8vIFRlbXBsYXRlIG5hbWUgY2hhcmFjdGVyCisgICAgICAgICAgICAgICAgbmFtZUJ1ZmZlci5hcHBlbmQoYyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJywnICYmIHBhcmFtVHlwZSAhPSAncCcpIHsKKyAgICAgICAgICAgICAgICAvLyBzZXBhcmF0b3IgYWxsb3dlZCBmb3Igbm9uLXBhdGggcGFyYW1ldGVyIG5hbWVzCisgICAgICAgICAgICAgICAgbmFtZUJ1ZmZlci5hcHBlbmQoYyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJzonICYmIHBhcmFtVHlwZSA9PSAncCcpIHsKKyAgICAgICAgICAgICAgICBuYW1lUmVnZXhTdHJpbmcgPSBwYXJzZVJlZ2V4KGNpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnfScpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSAnICcpIHsKKyAgICAgICAgICAgICAgICBjID0gY29uc3VtZVdoaXRlU3BhY2UoY2kpOworCisgICAgICAgICAgICAgICAgaWYgKGMgPT0gJzonKSB7CisgICAgICAgICAgICAgICAgICAgIG5hbWVSZWdleFN0cmluZyA9IHBhcnNlUmVnZXgoY2kpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJ30nKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEVycm9yCisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfVEVNUExBVEVfUEFSU0VSX0lMTEVHQUxfQ0hBUl9BRlRFUl9OQU1FKGMsIGNpLnBvcygpLCB0ZW1wbGF0ZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX1RFTVBMQVRFX1BBUlNFUl9JTExFR0FMX0NIQVJfUEFSVF9PRl9OQU1FKGMsIGNpLnBvcygpLCB0ZW1wbGF0ZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBuYW1lQnVmZmVyLnRvU3RyaW5nKCk7CisgICAgICAgIFBhdHRlcm4gbmFtZVBhdHRlcm47CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAocGFyYW1UeXBlID09ICc/JyB8fCBwYXJhbVR5cGUgPT0gJzsnKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nW10gc3ViTmFtZXMgPSBuYW1lLnNwbGl0KCIsXFxzPyIpOworCisgICAgICAgICAgICAgICAgLy8gQnVpbGQgdXAgdGhlIHJlZ2V4IGZvciBlYWNoIG9mIHRoZXNlIHByb3BlcnRpZXMKKyAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHJlZ2V4QnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKHBhcmFtVHlwZSA9PSAnPycgPyAiXFw/IiA6ICI7Iik7CisgICAgICAgICAgICAgICAgU3RyaW5nIHNlcGFyYXRvciA9IHBhcmFtVHlwZSA9PSAnPycgPyAiXFwmIiA6ICI7L1xcPyI7CisKKyAgICAgICAgICAgICAgICAvLyBTdGFydCBhIGdyb3VwIGJlY2F1c2UgZWFjaCBwYXJhbWV0ZXIgY291bGQgcmVwZWF0CisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgbmFtZXMuYWRkKCJfXyIgKyAocGFyYW1UeXBlID09ICc/JyA/ICJxdWVyeSIgOiAibWF0cml4IikpOworCisgICAgICAgICAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7CisKKyAgICAgICAgICAgICAgICByZWdleEJ1aWxkZXIuYXBwZW5kKCIoIik7CisgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgc3ViTmFtZSA6IHN1Yk5hbWVzKSB7CisgICAgICAgICAgICAgICAgICAgIHJlZ2V4QnVpbGRlci5hcHBlbmQoIigmPyIpOworICAgICAgICAgICAgICAgICAgICByZWdleEJ1aWxkZXIuYXBwZW5kKHN1Yk5hbWUpOworICAgICAgICAgICAgICAgICAgICByZWdleEJ1aWxkZXIuYXBwZW5kKCIoPShbXiIpOworICAgICAgICAgICAgICAgICAgICByZWdleEJ1aWxkZXIuYXBwZW5kKHNlcGFyYXRvcik7CisgICAgICAgICAgICAgICAgICAgIHJlZ2V4QnVpbGRlci5hcHBlbmQoIl0qKSk/Iik7CisgICAgICAgICAgICAgICAgICAgIHJlZ2V4QnVpbGRlci5hcHBlbmQoIikiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmaXJzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVnZXhCdWlsZGVyLmFwcGVuZCgifCIpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbmFtZXMuYWRkKHN1Yk5hbWUpOworICAgICAgICAgICAgICAgICAgICBncm91cENvdW50cy5hZGQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPyA1IDogMyk7CisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgZ3JvdXBDb3VudHMuYWRkKDEpOworICAgICAgICAgICAgICAgIHNraXBHcm91cCA9IDE7CisKKyAgICAgICAgICAgICAgICAvLyBLbm9jayBvZiBsYXN0IGJhcgorICAgICAgICAgICAgICAgIHJlZ2V4QnVpbGRlci5hcHBlbmQoIikqIik7CisKKyAgICAgICAgICAgICAgICBuYW1lUGF0dGVybiA9IFBhdHRlcm4uY29tcGlsZShyZWdleEJ1aWxkZXIudG9TdHJpbmcoKSk7CisKKyAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZGlzcGxheSBzb21ldGhpbmcgdXNlZnVsCisgICAgICAgICAgICAgICAgbmFtZSA9IHBhcmFtVHlwZSArIG5hbWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG5hbWVzLmFkZChuYW1lKTsKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgIGdyb3VwQ291bnRzLmFkZCgxICsgc2tpcEdyb3VwKTsKKworICAgICAgICAgICAgICAgIGlmICghbmFtZVJlZ2V4U3RyaW5nLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBudW1PZkV4cGxpY2l0UmVnZXhlcysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBuYW1lUGF0dGVybiA9IChuYW1lUmVnZXhTdHJpbmcuaXNFbXB0eSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgPyBURU1QTEFURV9WQUxVRV9QQVRURVJOIDogUGF0dGVybi5jb21waWxlKG5hbWVSZWdleFN0cmluZyk7CisgICAgICAgICAgICAgICAgaWYgKG5hbWVUb1BhdHRlcm4uY29udGFpbnNLZXkobmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFuYW1lVG9QYXR0ZXJuLmdldChuYW1lKS5lcXVhbHMobmFtZVBhdHRlcm4pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9URU1QTEFURV9QQVJTRVJfTkFNRV9NT1JFX1RIQU5fT05DRShuYW1lLCB0ZW1wbGF0ZSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbmFtZVRvUGF0dGVybi5wdXQobmFtZSwgbmFtZVBhdHRlcm4pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIERldGVybWluZSBncm91cCBjb3VudCBvZiBwYXR0ZXJuCisgICAgICAgICAgICAgICAgTWF0Y2hlciBtID0gbmFtZVBhdHRlcm4ubWF0Y2hlcigiIik7CisgICAgICAgICAgICAgICAgaW50IGcgPSBtLmdyb3VwQ291bnQoKTsKKyAgICAgICAgICAgICAgICBncm91cENvdW50cy5hZGQoMSArIHNraXBHcm91cCk7CisgICAgICAgICAgICAgICAgc2tpcEdyb3VwID0gZzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVnZXguYXBwZW5kKCcoJykKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChuYW1lUGF0dGVybikKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgnKScpOworCisgICAgICAgICAgICBub3JtYWxpemVkVGVtcGxhdGUuYXBwZW5kKCd7JykKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChuYW1lKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCd9Jyk7CisgICAgICAgIH0gY2F0Y2ggKFBhdHRlcm5TeW50YXhFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX1RFTVBMQVRFX1BBUlNFUl9JTlZBTElEX1NZTlRBWChuYW1lUmVnZXhTdHJpbmcsIG5hbWUsIHRlbXBsYXRlKSwgZXgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGVsbCB0aGUgbmV4dCB0aW1lIHRocm91Z2ggdGhlIGxvb3AgaG93IG1hbnkgdG8gc2tpcAorICAgICAgICByZXR1cm4gc2tpcEdyb3VwOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHBhcnNlUmVnZXgoZmluYWwgQ2hhcmFjdGVySXRlcmF0b3IgY2kpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciByZWdleEJ1ZmZlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKyAgICAgICAgaW50IGJyYWNlQ291bnQgPSAxOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgY2hhciBjID0gY2kubmV4dCgpOworICAgICAgICAgICAgaWYgKGMgPT0gJ3snKSB7CisgICAgICAgICAgICAgICAgYnJhY2VDb3VudCsrOworICAgICAgICAgICAgfSBlbHNlIGlmIChjID09ICd9JykgeworICAgICAgICAgICAgICAgIGJyYWNlQ291bnQtLTsKKyAgICAgICAgICAgICAgICBpZiAoYnJhY2VDb3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlZ2V4QnVmZmVyLmFwcGVuZChjKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZWdleEJ1ZmZlci50b1N0cmluZygpLnRyaW0oKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNoYXIgY29uc3VtZVdoaXRlU3BhY2UoZmluYWwgQ2hhcmFjdGVySXRlcmF0b3IgY2kpIHsKKyAgICAgICAgY2hhciBjOworICAgICAgICBkbyB7CisgICAgICAgICAgICBjID0gY2kubmV4dCgpOworICAgICAgICB9IHdoaWxlIChDaGFyYWN0ZXIuaXNXaGl0ZXNwYWNlKGMpKTsKKworICAgICAgICByZXR1cm4gYzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3VyaS9pbnRlcm5hbC9wYWNrYWdlLWluZm8uamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdXJpL2ludGVybmFsL3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNjNiODAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3VyaS9pbnRlcm5hbC9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDIxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvKioKKyAqIENvbW1vbiBKZXJzZXkgaW50ZXJuYWwgY2xhc3NlcyB0aGF0IHByb3ZpZGUgc3VwcG9ydCBmb3IgSkFYLVJTIFVSSSB0ZW1wbGF0ZXMgYW5kCisgKiBlbmNvZGluZy9kZWNvZGluZyBvZiBVUkkgY29tcG9uZW50cy4KKyAqLworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS51cmkuaW50ZXJuYWw7CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3VyaS9wYWNrYWdlLWluZm8uamF2YSBiL2NvcmUtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdXJpL3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZTM4YTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3VyaS9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDIxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvKioKKyAqIENvbW1vbiBKZXJzZXkgY2xhc3NlcyB0aGF0IHByb3ZpZGUgc3VwcG9ydCBmb3IgSkFYLVJTIFVSSSB0ZW1wbGF0ZXMgYW5kCisgKiBlbmNvZGluZy9kZWNvZGluZyBvZiBVUkkgY29tcG9uZW50cy4KKyAqLworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS51cmk7CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFLm1kIGIvY29yZS1jb21tb24vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjBhNzU0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRS5tZApAQCAtMCwwICsxLDQ0IEBACisjIE5vdGljZSBmb3IgSmVyc2V5IENvcmUgQ29tbW9uIG1vZHVsZSANCitUaGlzIGNvbnRlbnQgaXMgcHJvZHVjZWQgYW5kIG1haW50YWluZWQgYnkgdGhlIEVjbGlwc2UgSmVyc2V5IHByb2plY3QuDQorDQorDQorKiBodHRwczovL3Byb2plY3RzLmVjbGlwc2Uub3JnL3Byb2plY3RzL2VlNGouamVyc2V5DQorDQorIyMgVHJhZGVtYXJrcw0KK0VjbGlwc2UgSmVyc2V5IGlzIGEgdHJhZGVtYXJrIG9mIHRoZSBFY2xpcHNlIEZvdW5kYXRpb24uDQorDQorIyMgQ29weXJpZ2h0DQorDQorQWxsIGNvbnRlbnQgaXMgdGhlIHByb3BlcnR5IG9mIHRoZSByZXNwZWN0aXZlIGF1dGhvcnMgb3IgdGhlaXIgZW1wbG95ZXJzLiBGb3INCittb3JlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBhdXRob3JzaGlwIG9mIGNvbnRlbnQsIHBsZWFzZSBjb25zdWx0IHRoZSBsaXN0ZWQNCitzb3VyY2UgY29kZSByZXBvc2l0b3J5IGxvZ3MuDQorDQorIyMgRGVjbGFyZWQgUHJvamVjdCBMaWNlbnNlcw0KKw0KK1RoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSB0ZXJtcw0KK29mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCB3aGljaCBpcyBhdmFpbGFibGUgYXQNCitodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZQ0KK2F2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeSBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoDQorYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VDQorR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uIHdoaWNoIGlzDQorYXZhaWxhYmxlIGF0IGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4NCisNCitTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjANCisNCisjIyBTb3VyY2UgQ29kZQ0KK1RoZSBwcm9qZWN0IG1haW50YWlucyB0aGUgZm9sbG93aW5nIHNvdXJjZSBjb2RlIHJlcG9zaXRvcmllczoNCisNCisqIGh0dHBzOi8vZ2l0aHViLmNvbS9lY2xpcHNlLWVlNGovamVyc2V5DQorDQorIyMgVGhpcmQtcGFydHkgQ29udGVudA0KKw0KK0dvb2dsZSBHdWF2YSBWZXJzaW9uIDE4LjANCisqIExpY2Vuc2U6IEFwYWNoZSBMaWNlbnNlLCAyLjANCisqIENvcHlyaWdodDogKEMpIDIwMDkgVGhlIEd1YXZhIEF1dGhvcnMNCisNCitKU1ItMTY2IEV4dGVuc2lvbiAtIEpFUCAyNjYNCisqIExpY2Vuc2U6IENyZWF0aXZlIENvbW1vbnMgMS4wIChDQzApDQorKiBObyBjb3B5cmlnaHQNCisqIFdyaXR0ZW4gYnkgRG91ZyBMZWEgd2l0aCBhc3Npc3RhbmNlIGZyb20gbWVtYmVycyBvZiBKQ1AgSlNSLTE2Ng0KKyogRXhwZXJ0IEdyb3VwIGFuZCByZWxlYXNlZCB0byB0aGUgcHVibGljIGRvbWFpbiwgYXMgZXhwbGFpbmVkIGF0DQorKiBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9wdWJsaWNkb21haW4vemVyby8xLjAvDQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnNwaS5BdXRvRGlzY292ZXJhYmxlIGIvY29yZS1jb21tb24vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnNwaS5BdXRvRGlzY292ZXJhYmxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MWIzN2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuc3BpLkF1dG9EaXNjb3ZlcmFibGUKQEAgLTAsMCArMSBAQAorb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZUF1dG9EaXNjb3ZlcmFibGUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvYnVpbGQucHJvcGVydGllcyBiL2NvcmUtY29tbW9uL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9idWlsZC5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMGJhNWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvYnVpbGQucHJvcGVydGllcwpAQCAtMCwwICsxLDE4IEBACisjCisjIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorIworIyBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisjIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyMgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisjIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyMKKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisjCisKK0J1aWxkLVZlcnNpb246ICR7cHJvamVjdC52ZXJzaW9ufQorQnVpbGQtVGltZXN0YW1wOiAke2J1aWxkTnVtYmVyfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2xvY2FsaXphdGlvbi5wcm9wZXJ0aWVzIGIvY29yZS1jb21tb24vc3JjL21haW4vcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2xvY2FsaXphdGlvbi5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MTk5N2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxOTAgQEAKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisjCisjIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyMgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorIyBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyMgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorIworIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyMKKworCisjIHswfSAtIGZ1bGwgY2xhc3NuYW1lCithdXRvZGlzY292ZXJhYmxlLmNvbmZpZ3VyYXRpb24uZmFpbGVkPUNvbmZpZ3VyYXRpb24gb2YgezB9IGF1dG8tZGlzY292ZXJhYmxlIGZhaWxlZC4KK2NhY2hlLmNvbnRyb2wuaXMubnVsbD1DYWNoZSBjb250cm9sIGlzIG51bGwuCitjb21taXR0aW5nLnN0cmVhbS5hbHJlYWR5LmluaXRpYWxpemVkPVN0cmVhbSBwcm92aWRlciBoYXMgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkLgorY29tbWl0dGluZy5zdHJlYW0uYnVmZmVyaW5nLmlsbGVnYWwuc3RhdGU9Q2Fubm90IHNldHVwIGJ1ZmZlcmluZyBhcyBieXRlcyBoYXZlIGFscmVhZHkgYmVlbiB3cml0dGVuIHRvIHRoZSBvdXRwdXQgc3RyZWFtLiBUaGUgZW50aXR5IGJ1ZmZlcmluZyBjYW4gYmUgaW5pdGlhbGl6ZWQgb25seSBiZWZvcmUgZmlyc3QgYnl0ZXMgYXJlIHdyaXR0ZW4gdG8gdGhlIGVudGl0eSBvdXRwdXQgc3RyZWFtLgorY29tcG9uZW50LmNhbm5vdC5iZS5udWxsPVJlZ2lzdGVyZWQgY29tcG9uZW50IGluc3RhbmNlIGNhbm5vdCBiZSBudWxsLgorY29tcG9uZW50LmNsYXNzLmNhbm5vdC5iZS5udWxsPVJlZ2lzdGVyZWQgY29tcG9uZW50IGNsYXNzIGNhbm5vdCBiZSBudWxsLgorY29tcG9uZW50LnR5cGUuYWxyZWFkeS5yZWdpc3RlcmVkPUNhbm5vdCBjcmVhdGUgbmV3IHJlZ2lzdHJhdGlvbiBmb3IgY29tcG9uZW50IHR5cGUgezB9OiBFeGlzdGluZyBwcmV2aW91cyByZWdpc3RyYXRpb24gZm91bmQgZm9yIHRoZSB0eXBlLgorY29tcG9uZW50LmNvbnRyYWN0cy5lbXB0eS5vci5udWxsPUF0dGVtcHQgdG8gcmVnaXN0ZXIgY29tcG9uZW50IG9mIHR5cGUgezB9IHRvIG51bGwgb3IgZW1wdHkgYXJyYXkgb2YgY29udHJhY3RzICBpcyBpZ25vcmVkLgorY29uZmlndXJhdGlvbi5ub3QubW9kaWZpYWJsZT1UaGUgY29uZmlndXJhdGlvbiBpcyBub3QgbW9kaWZpYWJsZSBpbiB0aGlzIGNvbnRleHQuCitjb250cmFjdC5ub3QuYXNzaWduYWJsZT1Db250cmFjdCB7MH0gY2FuIG5vdCBiZSByZWdpc3RlcmVkIGZvciBjb21wb25lbnQgezF9OiBDb250cmFjdCBub3QgYXNzaWduYWJsZSB0byBjb21wb25lbnQuCitjb250cmFjdC5ub3Quc3VwcG9ydGVkPUNvbnRyYWN0IHswfSBjYW4gbm90IGJlIHJlZ2lzdGVyZWQgZm9yIGNvbXBvbmVudCB7MX06IENvbnRyYWN0IHR5cGUgbm90IHN1cHBvcnRlZC4KK2Nvb2tpZS5pcy5udWxsPUNvb2tpZSBpcyBudWxsLgorZGF0ZS5pcy5udWxsPURhdGUgaXMgbnVsbC4KK2RlcGVuZGVudC5jbGFzcy5vZi5wcm92aWRlci5mb3JtYXQuZXJyb3I9ezB9LiBBIGRlcGVuZGVudCBjbGFzcyBvZiB0aGUgY2xhc3MgezF9IGltcGxlbWVudGluZyB0aGUgcHJvdmlkZXIgezJ9IGlzIG1hbGZvcm1lZC4gVGhlIHByb3ZpZGVyIGltcGxlbWVudGF0aW9uIGlzIGlnbm9yZWQuIENoZWNrIGlmIHRoZSBtYWxmb3JtZWQgY2xhc3MgaXMgcGFydCBvZiBhIHN0dWJiZWQgamFyIHRoYXQgdXNlZCBmb3IgY29tcGlsaW5nIG9ubHkuCitkZXBlbmRlbnQuY2xhc3Mub2YucHJvdmlkZXIubm90LmZvdW5kPUEgZGVwZW5kZW50IGNsYXNzLCB7MH0sIG9mIHRoZSBjbGFzcyB7MX0gaW1wbGVtZW50aW5nIHRoZSBwcm92aWRlciB7Mn0gaXMgbm90IGZvdW5kLiBUaGUgcHJvdmlkZXIgaW1wbGVtZW50YXRpb24gaXMgaWdub3JlZC4KK2VudGl0eS50YWcuaXMubnVsbD1FbnRpdHkgdGFnIGlzIG51bGwuCitlcnJvci5jYXVnaHQud2hpbGUubG9hZGluZy5zcGkucHJvdmlkZXJzPUVycm9yIGNhdWdodCB3aGlsZSBsb2FkaW5nIFNQSSBwcm92aWRlcnMuCitlcnJvci5lbnRpdHkuc3RyZWFtLmNsb3NlZD1FbnRpdHkgaW5wdXQgc3RyZWFtIGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkLgorZXJyb3IuZW50aXR5LnByb3ZpZGVyLmJhc2ljdHlwZXMuY2hhcmFjdGVyLm1vcmVjaGFycz1BIHNpbmdsZSBjaGFyYWN0ZXIgZXhwZWN0ZWQgaW4gdGhlIGVudGl0eSBpbnB1dCBzdHJlYW0uCitlcnJvci5lbnRpdHkucHJvdmlkZXIuYmFzaWN0eXBlcy5jb25zdHJ1Y3Rvcj1FcnJvciBjb252ZXJ0aW5nIGVudGl0eSB0byB7MH0gdHlwZSBieSBzaW5nbGUgU3RyaW5nIGNvbnN0cnVjdG9yLgorZXJyb3IuZW50aXR5LnByb3ZpZGVyLmJhc2ljdHlwZXMudW5rd25vd249VW5zdXBwb3J0ZWQgYmFzaWMgdHlwZSB7MH0uCitlcnJvci5maW5kaW5nLmV4Y2VwdGlvbi5tYXBwZXIudHlwZT1Db3VsZCBub3QgZmluZCBleGNlcHRpb24gdHlwZSBmb3IgZ2l2ZW4gRXhjZXB0aW9uTWFwcGVyIGNsYXNzOiB7MH0uCitlcnJvci5pbnRlcmNlcHRvci5yZWFkZXIucHJvY2VlZD1MYXN0IHJlYWRlciBpbnRlcmNlcHRvciBpbiB0aGUgY2hhaW4gY2FsbGVkIHRoZSBtZXRob2QgcHJvY2VlZC4KK2Vycm9yLmludGVyY2VwdG9yLndyaXRlci5wcm9jZWVkPUxhc3Qgd3JpdGVyIGludGVyY2VwdG9yIGluIHRoZSBjaGFpbiBjYWxsZWQgdGhlIG1ldGhvZCBwcm9jZWVkLgorZXJyb3IubWJyLmlzcmVhZGFibGU9TWVzc3NhZ2VCb2R5UmVhZGVyIHswfSB0aHJldyBleGNlcHRpb24gaW4gaXNSZWFkYWJsZSAtIHNraXBwaW5nLgorZXJyb3IubWJ3Lmlzd3JpdGFibGU9TWVzc3NhZ2VCb2R5V3JpdGVyIHswfSB0aHJldyBleGNlcHRpb24gaW4gaXNXcml0YWJsZSAtIHNraXBwaW5nLgorIyB7MH0gLSBBcmJpdHJhcnkgbG9jYWxpemVkIG1lc3NhZ2UsIGUuZy46IFtOT05GQVRBTF0gPGxvY2FsaXplZF9tZXNzYWdlPjsgc291cmNlPTxvYmplY3Q+CitlcnJvci5tc2c9V0FSTklORzogezB9CitlcnJvci5uZXdjb29raWUuZXhwaXJlcz1OZXdDb29raWUgRXhwaXJlcyBoZWFkZXIgdmFsdWUgKHswfSkgY2Fubm90IGJlIHJlYWQuCitlcnJvci5ub3Rmb3VuZC5tZXNzYWdlYm9keXdyaXRlcj1NZXNzYWdlQm9keVdyaXRlciBub3QgZm91bmQgZm9yIG1lZGlhIHR5cGU9ezB9LCB0eXBlPXsxfSwgZ2VuZXJpY1R5cGU9ezJ9LgorZXJyb3Iubm90Zm91bmQubWVzc2FnZWJvZHlyZWFkZXI9TWVzc2FnZUJvZHlSZWFkZXIgbm90IGZvdW5kIGZvciBtZWRpYSB0eXBlPXswfSwgdHlwZT17MX0sIGdlbmVyaWNUeXBlPXsyfS4KK2Vycm9yLnBhcnNpbmcuZW50aXR5LnRhZz1FcnJvciBwYXJzaW5nIGVudGl0eSB0YWc6IHswfQorZXJyb3IucHJvdmlkZXIuY29uc3RyYWluZWRUby53cm9uZy5wYWNrYWdlPUEgcmVnaXN0ZXJlZCBwcm92aWRlciB7MH0gaXMgY29uc3RyYWluZWQgKHZpYSBAQ29uc3RyYWluZWRUbykgdG8gezF9IHJ1bnRpbWUgYnV0IGRvZXMgbm90IGltcGxlbWVudCBhbnkgcHJvdmlkZXIgaW50ZXJmYWNlIHVzYWJsZSBpbiB0aGUgcnVudGltZS4KK2Vycm9yLnByb3ZpZGVyLmNvbnN0cmFpbmVkVG8ud3JvbmcucnVudGltZT1BIHByb3ZpZGVyIHswfSByZWdpc3RlcmVkIGluIHsyfSBydW50aW1lIGlzIGNvbnN0cmFpbmVkICh2aWEgQENvbnN0cmFpbmVkVG8pIHRvIHsxfSBydW50aW1lLgorZXJyb3IucHJvdmlkZXIuYW5kLnJlc291cmNlLmNvbnN0cmFpbmVkVG8uaWdub3JlZD1EdWUgdG8gY29uc3RyYWludCBjb25maWd1cmF0aW9uIHByb2JsZW1zIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgcHJvdmlkZXJzIGluIHRoZSByZXNvdXJjZSBjbGFzcyB7MH0gd2lsbCBiZSBpZ25vcmVkLiBIb3dldmVyLCB0aGUgcmVzb3VyY2UgY2xhc3Mgd2lsbCBiZSBsb2FkZWQgYW5kIHVzZWQgYXMgYW4gcmVzb3VyY2UuCitlcnJvci5wcm92aWRlci5jb25zdHJhaW5lZFRvLmlnbm9yZWQ9RHVlIHRvIGNvbnN0cmFpbnQgY29uZmlndXJhdGlvbiBwcm9ibGVtcyB0aGUgcHJvdmlkZXIgezB9IHdpbGwgYmUgaWdub3JlZC4KK2Vycm9yLnByb3ZpZGVyLnJlZ2lzdGVyZWQud3JvbmcucnVudGltZT1BIHByb3ZpZGVyIHswfSByZWdpc3RlcmVkIGluIHsxfSBydW50aW1lIGRvZXMgbm90IGltcGxlbWVudCBhbnkgcHJvdmlkZXIgaW50ZXJmYWNlcyBhcHBsaWNhYmxlIGluIHRoZSB7MX0gcnVudGltZS4KK2Vycm9yLnJlYWRpbmcuZW50aXR5LmZyb20uaW5wdXQuc3RyZWFtPUVycm9yIHJlYWRpbmcgZW50aXR5IGZyb20gaW5wdXQgc3RyZWFtLgorZXJyb3IucmVhZGluZy5lbnRpdHkubWlzc2luZz1NaXNzaW5nIGVudGl0eS4KK2Vycm9yLnJlc29sdmluZy5nZW5lcmljLnR5cGUudmFsdWU9VW5hYmxlIHRvIHJlc29sdmUgZ2VuZXJpYyB0eXBlIHZhbHVlIG9mIHswfSBmb3IgYW4gaW5zdGFuY2Ugb2YgezF9LgorZXJyb3Iuc2VydmljZS5sb2NhdG9yLnByb3ZpZGVyLmluc3RhbmNlLmZlYXR1cmUuY29udGV4dD1JbmNvcnJlY3QgdHlwZSBvZiBmZWF0dXJlIGNvbnRleHQgaW5zdGFuY2UgezB9LiBQYXJhbWV0ZXIgbXVzdCBiZSBhIGRlZmF1bHQgSmVyc2V5IEZlYXR1cmVDb250ZXh0IGltcGxlbWVudGF0aW9uLgorZXJyb3Iuc2VydmljZS5sb2NhdG9yLnByb3ZpZGVyLmluc3RhbmNlLmZlYXR1cmUud3JpdGVyLmludGVyY2VwdG9yLmNvbnRleHQ9SW5jb3JyZWN0IHR5cGUgb2Ygd3JpdGVyIGludGVyY2VwdG9yIGNvbnRleHQgaW5zdGFuY2UgezB9LiBQYXJhbWV0ZXIgbXVzdCBiZSBhIGRlZmF1bHQgSmVyc2V5IFdyaXRlckludGVyY2VwdG9yQ29udGV4dCBpbXBsZW1lbnRhdGlvbi4KK2Vycm9yLnNlcnZpY2UubG9jYXRvci5wcm92aWRlci5pbnN0YW5jZS5mZWF0dXJlLnJlYWRlci5pbnRlcmNlcHRvci5jb250ZXh0PUluY29ycmVjdCB0eXBlIG9mIHJlYWRlciBpbnRlcmNlcHRvciBjb250ZXh0IGluc3RhbmNlIHswfS4gUGFyYW1ldGVyIG11c3QgYmUgYSBkZWZhdWx0IEplcnNleSBSZWFkZXJJbnRlcmNlcHRvckNvbnRleHQgaW1wbGVtZW50YXRpb24uCitlcnJvci50ZW1wbGF0ZS5wYXJzZXIuaWxsZWdhbC5jaGFyLmFmdGVyLm5hbWU9SWxsZWdhbCBjaGFyYWN0ZXIgInswfSIgYXQgcG9zaXRpb24gezF9IGlzIG5vdCBhbGxvd2VkIGFmdGVyIGEgbmFtZSBpbiBhIHBhdGggdGVtcGxhdGUgInsyfSIuCitlcnJvci50ZW1wbGF0ZS5wYXJzZXIuaWxsZWdhbC5jaGFyLnBhcnRPZi5uYW1lPUlsbGVnYWwgY2hhcmFjdGVyICJ7MH0iIGF0IHBvc2l0aW9uIHsxfSBpcyBub3QgYWxsb3dlZCBhcyBhIHBhcnQgb2YgYSBuYW1lIGluIGEgcGF0aCB0ZW1wbGF0ZSAiezJ9Ii4KK2Vycm9yLnRlbXBsYXRlLnBhcnNlci5pbGxlZ2FsLmNoYXIuc3RhcnQubmFtZT1JbGxlZ2FsIGNoYXJhY3RlciAiezB9IiBhdCBwb3NpdGlvbiB7MX0gaXMgbm90IGFsbG93ZWQgYXMgYSBzdGFydCBvZiBhIG5hbWUgaW4gYSBwYXRoIHRlbXBsYXRlICJ7Mn0iLgorZXJyb3IudGVtcGxhdGUucGFyc2VyLmludmFsaWQuc3ludGF4PUludmFsaWQgc3ludGF4IGZvciB0aGUgZXhwcmVzc2lvbiAiezB9IiBhc3NvY2lhdGVkIHdpdGggdGhlIG5hbWUgInsxfSIgaW4gYSBwYXRoIHRlbXBsYXRlICJ7Mn0iLgorZXJyb3IudGVtcGxhdGUucGFyc2VyLmludmFsaWQuc3ludGF4LnRlcm1pbmF0ZWQ9SW52YWxpZCBzeW50YXggaW4gdGhlIHRlbXBsYXRlICJ7MH0iLiBDaGVjayBpZiBhIHBhdGggcGFyYW1ldGVyIGlzIHRlcm1pbmF0ZWQgd2l0aCBhICJ9Ii4KK2Vycm9yLnRlbXBsYXRlLnBhcnNlci5uYW1lLm1vcmUudGhhbi5vbmNlPVRoZSBuYW1lICJ7MH0iIGlzIGRlY2xhcmVkIG1vcmUgdGhhbiBvbmNlIHdpdGggZGlmZmVyZW50IHJlZ3VsYXIgZXhwcmVzc2lvbnMgaW4gYSBwYXRoIHRlbXBsYXRlICJ7MX0iLgorIyB7MH0gLSBMaXN0IG9mIGxvY2FsaXplZCBtZXNzYWdlcywgZS5nLjogW0ZBVEFMXSA8bG9jYWxpemVkX21lc3NhZ2U+OyBzb3VyY2U9PG9iamVjdD4KK2Vycm9ycy5hbmQud2FybmluZ3MuZGV0ZWN0ZWQ9Rm9sbG93aW5nIGlzc3VlcyBoYXZlIGJlZW4gZGV0ZWN0ZWQ6IHswfQorZXhjZXB0aW9uLmNhdWdodC53aGlsZS5sb2FkaW5nLnNwaS5wcm92aWRlcnM9RXhjZXB0aW9uIGNhdWdodCB3aGlsZSBsb2FkaW5nIFNQSSBwcm92aWRlcnMuCitleGNlcHRpb24ubWFwcGVyLnN1cHBvcnRlZC50eXBlLnVua25vd249VW5hYmxlIHRvIHJldHJpZXZlIHRoZSBzdXBwb3J0ZWQgZXhjZXB0aW9uIHR5cGUgZm9yIGEgcmVnaXN0ZXJlZCBleGNlcHRpb24gbWFwcGVyIHNlcnZpY2UgY2xhc3MgInswfSIuCitmZWF0dXJlLmhhcy5hbHJlYWR5LmJlZW4ucHJvY2Vzc2VkPUZlYXR1cmUgW3swfV0gaGFzIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQuCitoaW50Lm1zZz1ISU5UOiB7MH0KK2hpbnRzLmRldGVjdGVkPVRoZSBmb2xsb3dpbmcgaGludHMgaGF2ZSBiZWVuIGRldGVjdGVkOiB7MH0KK2h0dHAuaGVhZGVyLmNvbW1lbnRzLm5vdC5hbGxvd2VkPUNvbW1lbnRzIGFyZSBub3QgYWxsb3dlZC4KK2h0dHAuaGVhZGVyLmVuZC5vZi5oZWFkZXI9RW5kIG9mIGhlYWRlci4KK2h0dHAuaGVhZGVyLm5vLmNoYXJzLmJldHdlZW4uc2VwYXJhdG9ycz1ObyBjaGFyYWN0ZXJzIGJldHdlZW4gdGhlIHNlcGFyYXRvcnMgInswfSIgYW5kICJ7MX0iLgoraHR0cC5oZWFkZXIubm8uZW5kLnNlcGFyYXRvcj1ObyBlbmQgc2VwYXJhdG9yICJ7MH0iLgoraHR0cC5oZWFkZXIudW5iYWxhbmNlZC5jb21tZW50cz1VbmJhbGFuY2VkIGNvbW1lbnRzLgoraHR0cC5oZWFkZXIudW5iYWxhbmNlZC5xdW90ZWQ9VW5iYWxhbmNlZCBxdW90ZWQgc3RyaW5nLgoraHR0cC5oZWFkZXIud2hpdGVzcGFjZS5ub3QuYWxsb3dlZD1XaGl0ZSBzcGFjZSBub3QgYWxsb3dlZC4KK2lnbm9yZWQuZXhlY3V0b3IucHJvdmlkZXJzPU11bHRpcGxlIEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyIHJlZ2lzdHJhdGlvbnMgZm91bmQgZm9yIHF1YWxpZmllciBhbm5vdGF0aW9uIFt7MX1dLiBUaGUgZm9sbG93aW5nIHByb3ZpZGVyIHJlZ2lzdHJhdGlvbnMgd2lsbCBiZSBpZ25vcmVkOiBbezB9XQoraWdub3JlZC5zY2hlZHVsZXIucHJvdmlkZXJzPU11bHRpcGxlIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyIHJlZ2lzdHJhdGlvbnMgZm91bmQgZm9yIHF1YWxpZmllciBhbm5vdGF0aW9uIFt7MX1dLiBUaGUgZm9sbG93aW5nIHByb3ZpZGVyIHJlZ2lzdHJhdGlvbnMgd2lsbCBiZSBpZ25vcmVkOiBbezB9XQoraWxsZWdhbC5jb25maWcuc3ludGF4PUlsbGVnYWwgY29uZmlndXJhdGlvbi1maWxlIHN5bnRheC4KK2lsbGVnYWwuaW5pdGlhbC5jYXBhY2l0eT1JbGxlZ2FsIGluaXRpYWwgY2FwYWNpdHk6IHswfS4KK2lsbGVnYWwubG9hZC5mYWN0b3I9SWxsZWdhbCBsb2FkIGZhY3RvcjogezB9LgoraWxsZWdhbC5wcm92aWRlci5jbGFzcy5uYW1lPUlsbGVnYWwgcHJvdmlkZXItY2xhc3MgbmFtZTogezB9LgoraW5qZWN0aW9uLmVycm9yLnN1aXRhYmxlLmNvbnN0cnVjdG9yLm5vdC5mb3VuZD1Db3VsZCBub3QgZmluZCBhIHN1aXRhYmxlIGNvbnN0cnVjdG9yIGluIHswfSBjbGFzcy4KK2luamVjdGlvbi5lcnJvci5sb2NhbC5jbGFzcy5ub3Quc3VwcG9ydGVkPUNhbm5vdCBpbnN0YW50aWF0ZSB7MH0gY2xhc3MuIEluc3RhbnRpYXRpb24gb2YgbG9jYWwgY2xhc3NlcyBpcyBub3Qgc3VwcG9ydGVkLgoraW5qZWN0aW9uLmVycm9yLm5vbnN0YXRpYy5tZW1iZXIuY2xhc3Mubm90LnN1cHBvcnRlZD1DYW5ub3QgaW5zdGFudGlhdGUgezB9IGNsYXNzLiBJbnN0YW50aWF0aW9uIG9mIG5vbi1zdGF0aWMgbWVtYmVyIGNsYXNzZXMgaXMgbm90IHN1cHBvcnRlZC4KK2luamVjdGlvbi5tYW5hZ2VyLmZhY3Rvcnkubm90LmZvdW5kPUluamVjdGlvbk1hbmFnZXJGYWN0b3J5IG5vdCBmb3VuZC4KK2luamVjdGlvbi5tYW5hZ2VyLm5vdC5wcm92aWRlZD1JbmplY3Rpb25NYW5hZ2VyIGlzIG5vdCBwcm92aWRlZC4KK2luamVjdGlvbi5tYW5hZ2VyLnN0cmF0ZWd5Lm5vdC5zdXBwb3J0ZWQ9SW5qZWN0aW9uTWFuYWdlclN0cmF0ZWd5IGlzIG5vdCBzdXBwb3J0ZWQ6IHswfS4KK2lucHV0LnN0cmVhbS5jbG9zZWQ9SW5wdXQgc3RyZWFtIGhhcyBiZWVuIGNsb3NlZC4KK2ludmFsaWQuaG9zdD1JbnZhbGlkIGhvc3QgbmFtZS4KK2ludmFsaWQucG9ydD1JbnZhbGlkIHBvcnQgdmFsdWUuCitpbnZhbGlkLnNwaS5jbGFzc2VzPVN1cHBsaWVkIHByb3ZpZGVyIGNsYXNzKGVzKSBkbyBub3QgaW1wbGVtZW50IHRoZSBleHBlY3RlZCB7MH0gU1BJOiBbezF9XQorbGluay5pcy5udWxsPUxpbmsgaXMgbnVsbC4KK2xvY2FsZS5pcy5udWxsPUxvY2FsZSBpcyBudWxsLgorbWF0cml4LnBhcmFtLm51bGw9T25lIG9yIG1vcmUgb2YgbWF0cml4IHZhbHVlIHBhcmFtZXRlcnMgYXJlIG51bGwuCisjIHswfSAtIGNsYXNzIG5hbWUKK21ici50cnlpbmcudG8uY2xvc2Uuc3RyZWFtPU1lc3NhZ2UgYm9keSByZWFkZXIgKHswfSkgaXMgdHJ5aW5nIHRvIGNsb3NlIHRoZSBlbnRpdHkgaW5wdXQgc3RyZWFtLiBOb3QgY2xvc2luZy4KKyMgezB9IC0gY2xhc3MgbmFtZQorbWJ3LnRyeWluZy50by5jbG9zZS5zdHJlYW09TWVzc2FnZSBib2R5IHdyaXRlciAoezB9KSBpcyB0cnlpbmcgdG8gY2xvc2UgdGhlIGVudGl0eSBvdXRwdXQgc3RyZWFtLiBOb3QgY2xvc2luZy4KK21lZGlhLnR5cGUuaXMubnVsbD1NZWRpYSB0eXBlIGlzIG51bGwuCittZXNzYWdlLmNvbnRlbnQuYnVmZmVyaW5nLmZhaWxlZD1GYWlsZWQgdG8gYnVmZmVyIHRoZSBtZXNzYWdlIGNvbnRlbnQgaW5wdXQgc3RyZWFtLgorbWVzc2FnZS5jb250ZW50LmlucHV0LnN0cmVhbS5jbG9zZS5mYWlsZWQ9RXJyb3IgY2xvc2luZyBtZXNzYWdlIGNvbnRlbnQgaW5wdXQgc3RyZWFtLgorbWVzc2FnZS5jb250ZW50LmJ1ZmZlci5yZXNldC5mYWlsZWQ9RXJyb3IgcmVzZXR0aW5nIHRoZSBidWZmZXJlZCBtZXNzYWdlIGNvbnRlbnQgaW5wdXQgc3RyZWFtLgorbWV0aG9kLm5vdC5nZXR0ZXIubm9yLnNldHRlcj1NZXRob2QgaXMgbmVpdGhlciBnZXR0ZXIgbm9yIHNldHRlci4KK211bHRpcGxlLm1hdGNoaW5nLmNvbnN0cnVjdG9ycy5mb3VuZD1Gb3VuZCB7MH0gY29uc3RydWN0b3JzIHdpdGggezF9IHBhcmFtZXRlcnMgaW4gezJ9IGNsYXNzLiBTZWxlY3RpbmcgdGhlIGZpcnN0IGZvdW5kIGNvbnN0cnVjdG9yOiB7M30KK25ldy5jb29raWUuaXMubnVsbD1OZXcgY29va2llIGlzIG51bGwuCituby5jb250YWluZXIuYXZhaWxhYmxlPU5vIGNvbnRhaW5lciBhdmFpbGFibGUuCituby5lcnJvci5wcm9jZXNzaW5nLmluLnNjb3BlPVRoZXJlIGlzIG5vIGVycm9yIHByb2Nlc3NpbmcgaW4gc2NvcGUuCitub3Quc3VwcG9ydGVkLm9uLm91dGJvdW5kLm1lc3NhZ2U9TWV0aG9kIG5vdCBzdXBwb3J0ZWQgb24gYW4gb3V0Ym91bmQgbWVzc2FnZS4KK29zZ2kucmVnaXN0cnkuZXJyb3Iub3BlbmluZy5yZXNvdXJjZS5zdHJlYW09VW5hYmxlIHRvIG9wZW4gYW4gaW5wdXQgc3RyZWFtIGZvciByZXNvdXJjZSB7MH0uCitvc2dpLnJlZ2lzdHJ5LmVycm9yLnByb2Nlc3NpbmcucmVzb3VyY2Uuc3RyZWFtPVVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJyZWQgd2hpbGUgcHJvY2Vzc2luZyByZXNvdXJjZSBzdHJlYW0gezB9Lgorb3V0cHV0LnN0cmVhbS5jbG9zZWQ9VGhlIG91dHB1dCBzdHJlYW0gaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQuCitvdmVycmlkaW5nLm1ldGhvZC5jYW5ub3QuYmUuZm91bmQ9TWV0aG9kIHRoYXQgb3ZlcnJpZGVzIHswfSBjYW5ub3QgYmUgZm91bmQgb24gY2xhc3MgezF9LgorcGFyYW0ubnVsbD0iezB9IiBwYXJhbWV0ZXIgaXMgbnVsbC4KKyMgezB9IC0gdmFsdWUgdG8gc3RyaW5nOyB7MX0gLSB0eXBlIG9mIHZhbHVlOyB7Mn0gLSBkZXNpcmVkIHZhbHVlIHR5cGUvY2xhc3MKK3Byb3BlcnRpZXMuaGVscGVyLmdldC52YWx1ZS5uby50cmFuc2Zvcm09VGhlcmUgaXMgbm8gd2F5IGhvdyB0byB0cmFuc2Zvcm0gdmFsdWUgInswfSIgW3sxfV0gdG8gdHlwZSBbezJ9XS4KK3Byb3BlcnRpZXMuaGVscGVyLmRlcHJlY2F0ZWQucHJvcGVydHkubmFtZT1EZXByZWNhdGVkIHByb3BlcnR5IG5hbWUgInswfSIgdXNhZ2Ugd2FzIGZvdW5kLiBQbGVhc2UgdXNlICJ7MX0iIGluc3RlYWQuCitwcm92aWRlci5jbGFzcy5jb3VsZC5ub3QuYmUubG9hZGVkPVRoZSBjbGFzcyB7MH0gaW1wbGVtZW50aW5nIHByb3ZpZGVyIHsxfSBjb3VsZCBub3QgYmUgbG9hZGVkOiB7Mn0KK3Byb3ZpZGVyLmNvdWxkLm5vdC5iZS5jcmVhdGVkPVRoZSBjbGFzcyB7MH0gaW1wbGVtZW50aW5nIHByb3ZpZGVyIHsxfSBjb3VsZCBub3QgYmUgaW5zdGFudGlhdGVkOiB7Mn0KK3Byb3ZpZGVyLm5vdC5mb3VuZD1UaGUgY2xhc3MgezB9IGltcGxlbWVudGluZyB0aGUgcHJvdmlkZXIgezF9IGlzIG5vdCBmb3VuZC4gVGhlIHByb3ZpZGVyIGltcGxlbWVudGF0aW9uIGlzIGlnbm9yZWQuCitxdWVyeS5wYXJhbS5udWxsPU9uZSBvciBtb3JlIG9mIHF1ZXJ5IHZhbHVlIHBhcmFtZXRlcnMgYXJlIG51bGwuCityZXNwb25zZS5jbG9zZWQ9UmVzcG9uc2UgaXMgY2xvc2VkLgorIyB7MH0gLSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBjb25uZWN0b3IgY2xhc3M7IHsxfSAtIGhlYWRlciBuYW1lcworc29tZS5oZWFkZXJzLm5vdC5zZW50PVRoZXJlIGFyZSBzb21lIHJlcXVlc3QgaGVhZGVycyB0aGF0IGhhdmUgbm90IGJlZW4gc2VudCBieSBjb25uZWN0b3IgW3swfV0uIFByb2JhYmx5IHlvdSBhZGRlZCBcCit0aG9zZSBoZWFkZXJzIGluIFdyaXRlckludGVyY2VwdG9yIG9yIE1lc3NhZ2VCb2R5V3JpdGVyLiBUaGF0IGZlYXR1cmUgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY29ubmVjdG9yLiBQbGVhc2UsIFwKK2RvIG5vdCBtb2RpZnkgaGVhZGVycyBpbiBXcml0ZXJJbnRlcmNlcHRvciBvciBNZXNzYWdlQm9keVdyaXRlciBvciB1c2UgZGVmYXVsdCBIdHRwVXJsQ29ubmVjdG9yIGluc3RlYWQuXG5cCitVbnNlbnQgaGVhZGVyIGNoYW5nZXM6IHsxfQorc2xvdy5zdWJzY3JpYmVyPVNsb3cgU3Vic2NyaWJlci4gU3Vic2NyaXB0aW9uIHdpbGwgYmUgY2FuY2VsZWQuIEl0ZW0gezB9IGFuZCBhbGwgdGhlIGl0ZW1zIHNlbnQgYWZ0ZXIgd2lsbCBub3QgYmUgcmVjZWl2ZWQuCitzc2wuY3R4LmFsZ29yaXRobS5ub3Quc3VwcG9ydGVkPUVycm9yIGNyZWF0aW5nIFNTTCBjb250ZXh0IChhbGdvcml0aG0gbm90IHN1cHBvcnRlZCkuCitzc2wuY3R4LmluaXQuZmFpbGVkPUVycm9yIGluaXRpYWxpemluZyBTU0wgY29udGV4dCAob3BlcmF0aW9uIGZhaWxlZCkuCitzc2wua3MuY2VydC5sb2FkLmVycm9yPUNhbm5vdCBsb2FkIGtleSBzdG9yZSBjZXJ0aWZpY2F0ZXMuCitzc2wua3MuZmlsZS5ub3QuZm91bmQ9Q2Fubm90IGZpbmQga2V5IHN0b3JlIGZpbGUgInswfSIuCitzc2wua3MuaW1wbC5ub3QuZm91bmQ9RXJyb3IgaW5pdGlhbGl6aW5nIGtleSBzdG9yZSAoaW1wbGVtZW50YXRpb24gbm90IGF2YWlsYWJsZSkuCitzc2wua3MuaW50ZWdyaXR5LmFsZ29yaXRobS5ub3QuZm91bmQ9RXJyb3IgaW5pdGlhbGl6aW5nIGtleSBzdG9yZSAoYWxnb3JpdGhtIHRvIGNoZWNrIGtleSBzdG9yZSBpbnRlZ3JpdHkgbm90IGZvdW5kKS4KK3NzbC5rcy5sb2FkLmVycm9yPUVycm9yIGxvYWRpbmcga2V5IHN0b3JlIGZyb20gZmlsZSAiezB9Ii4KK3NzbC5rcy5wcm92aWRlcnMubm90LnJlZ2lzdGVyZWQ9RXJyb3IgaW5pdGlhbGl6aW5nIGtleSBzdG9yZSAocHJvdmlkZXIgbm90IHJlZ2lzdGVyZWQpLgorc3NsLmttZi5hbGdvcml0aG0ubm90LnN1cHBvcnRlZD1FcnJvciBpbml0aWFsaXppbmcga2V5IG1hbmFnZXIgZmFjdG9yeSAoYWxnb3JpdGhtIG5vdCBzdXBwb3J0ZWQpLgorc3NsLmttZi5pbml0LmZhaWxlZD1FcnJvciBpbml0aWFsaXppbmcga2V5IG1hbmFnZXIgZmFjdG9yeSAob3BlcmF0aW9uIGZhaWxlZCkuCitzc2wua21mLnVucmVjb3ZlcmFibGUua2V5PUVycm9yIGluaXRpYWxpemluZyBrZXkgbWFuYWdlciBmYWN0b3J5ICh1bnJlY292ZXJhYmxlIGtleSkuCitzc2wua21mLm5vLnBhc3N3b3JkLnNldD1OZWl0aGVyIGtleSBwYXNzd29yZCBub3Iga2V5IHN0b3JlIHBhc3N3b3JkIGhhcyBiZWVuIHNldCBmb3IgezB9IGtleSBzdG9yZS4gXAorICBJZ25vcmluZyB0aGUga2V5IHN0b3JlIGNvbmZpZ3VyYXRpb24gYW5kIHNraXBwaW5nIHRoZSBrZXkgbWFuYWdlciBmYWN0b3J5IGluaXRpYWxpemF0aW9uLiBcCisgIEtleSBtYW5hZ2VyIGZhY3Rvcnkgd2lsbCBub3QgYmUgY29uZmlndXJlZCBpbiB0aGUgY3VycmVudCBTU0wgY29udGV4dC4KK3NzbC5rbWYubm8ucGFzc3dvcmQuZm9yLnByb3ZpZGVyLmJhc2VkLmtzPSJwcm92aWRlciBiYXNlZCIKK3NzbC5rbWYubm8ucGFzc3dvcmQuZm9yLmJ5dGUuYmFzZWQua3M9ImJ5dGUgYXJyYXkgYmFzZWQiCitzc2wua21mLnByb3ZpZGVyLm5vdC5yZWdpc3RlcmVkPUVycm9yIGluaXRpYWxpemluZyBrZXkgbWFuYWdlciBmYWN0b3J5IChwcm92aWRlciBub3QgcmVnaXN0ZXJlZCkuCitzc2wudHMuY2VydC5sb2FkLmVycm9yPUNhbm5vdCBsb2FkIHRydXN0IHN0b3JlIGNlcnRpZmljYXRlcy4KK3NzbC50cy5maWxlLm5vdC5mb3VuZD1DYW5ub3QgZmluZCB0cnVzdCBzdG9yZSBmaWxlICJ7MH0iLgorc3NsLnRzLmltcGwubm90LmZvdW5kPUVycm9yIGluaXRpYWxpemluZyB0cnVzdCBzdG9yZSAoaW1wbGVtZW50YXRpb24gbm90IGF2YWlsYWJsZSkuCitzc2wudHMuaW50ZWdyaXR5LmFsZ29yaXRobS5ub3QuZm91bmQ9RXJyb3IgaW5pdGlhbGl6aW5nIHRydXN0IHN0b3JlIChhbGdvcml0aG0gdG8gY2hlY2sgdHJ1c3Qgc3RvcmUgaW50ZWdyaXR5IG5vdCBmb3VuZCkuCitzc2wudHMubG9hZC5lcnJvcj1FcnJvciBsb2FkaW5nIHRydXN0IHN0b3JlIGZyb20gZmlsZSAiezB9Ii4KK3NzbC50cy5wcm92aWRlcnMubm90LnJlZ2lzdGVyZWQ9RXJyb3IgaW5pdGlhbGl6aW5nIHRydXN0IHN0b3JlIChwcm92aWRlciBub3QgcmVnaXN0ZXJlZCkuCitzc2wudG1mLmFsZ29yaXRobS5ub3Quc3VwcG9ydGVkPUVycm9yIGluaXRpYWxpemluZyB0cnVzdCBtYW5hZ2VyIGZhY3RvcnkgKGFsZ29yaXRobSBub3Qgc3VwcG9ydGVkKS4KK3NzbC50bWYuaW5pdC5mYWlsZWQ9RXJyb3IgaW5pdGlhbGl6aW5nIHRydXN0IG1hbmFnZXIgZmFjdG9yeSAob3BlcmF0aW9uIGZhaWxlZCkuCitzc2wudG1mLnByb3ZpZGVyLm5vdC5yZWdpc3RlcmVkPUVycm9yIGluaXRpYWxpemluZyB0cnVzdCBtYW5hZ2VyIGZhY3RvcnkgKHByb3ZpZGVyIG5vdCByZWdpc3RlcmVkKS4KK3N0cmVhbS5wcm92aWRlci5udWxsPVN0cmVhbSBwcm92aWRlciBpcyBub3QgZGVmaW5lZC4gSXQgbXVzdCBiZSBzZXQgYmVmb3JlIHdyaXRpbmcgZmlyc3QgYnl0ZXMgdG8gdGhlIGVudGl0eSBvdXRwdXQgc3RyZWFtLgorc3RyaW5nLmlzLm51bGw9U3RyaW5nIGlzIG51bGwuCit0ZW1wbGF0ZS5wYXJhbS5udWxsPU9uZSBvciBtb3JlIG9mIHRlbXBsYXRlIGtleXMgb3IgdmFsdWVzIGFyZSBudWxsLgordGhyZWFkLnBvb2wuZXhlY3V0b3IucHJvdmlkZXIuY2xvc2VkPVRocmVhZCBwb29sIGV4ZWN1dG9yIHByb3ZpZGVyIGhhcyBiZWVuIGNsb3NlZC4KK3Rvby5tYW55LmhlYWRlci52YWx1ZXM9VG9vIG1hbnkgInswfSIgaGVhZGVyIHZhbHVlczogInsxfSIKK3R5cGUudG8uY2xhc3MuY29udmVyc2lvbi5ub3Quc3VwcG9ydGVkPVR5cGUtdG8tY2xhc3MgY29udmVyc2lvbiBub3Qgc3VwcG9ydGVkIGZvcjogezB9LgordW5hYmxlLnRvLnBhcnNlLmhlYWRlci52YWx1ZT1VbmFibGUgdG8gcGFyc2UgInswfSIgaGVhZGVyIHZhbHVlOiAiezF9IgordW5oYW5kbGVkLmV4Y2VwdGlvbi5kZXRlY3RlZD1VbmhhbmRsZWQgZXhjZXB0aW9uIGRldGVjdGVkIG9uIHRocmVhZCB7MH0uCit1bmtub3duLmRlc2NyaXB0b3IudHlwZT1VbmFibGUgdG8gcmVnaXN0ZXIgYSBzZXJ2aWNlIGJlY2F1c2Ugb2YgdW5rbm93biBkZXNjcmlwdG9yIHR5cGU6IHswfS4KK3Vua25vd24uc3Vic2NyaWJlcj1Vbmtub3duIHN1YnNjcmliZXIuCit1cmkuYnVpbGRlci5zY2hlbWUucGFydC5udWxsPVN1cHBsaWVkIHNjaGVtZS1zcGVjaWZpYyBwYXJ0IHBhcmFtZXRlciBpcyBudWxsLgordXJpLmJ1aWxkZXIuc2NoZW1lLnBhcnQudW5leHBlY3RlZC5jb21wb25lbnQ9U3VwcGxpZWQgc2NoZW1lLXNwZWNpZmljIFVSSSBwYXJ0ICJ7MH0iIGNvbnRhaW5zIHVuZXhwZWN0ZWQgVVJJIFNjaGVtZSBjb21wb25lbnQ6IHsxfS4KK3VyaS5idWlsZGVyLnVyaS5wYXJ0LmZyYWdtZW50PVN1cHBsaWVkIHNjaGVtZS1zcGVjaWZpYyBVUkkgcGFydCAiezB9IiBjb250YWlucyBVUkkgRnJhZ21lbnQgY29tcG9uZW50OiB7MX0uCit1cmkuYnVpbGRlci5jbGFzcy5wYXRoLmFubm90YXRpb24ubWlzc2luZz1UaGUgY2xhc3MsIHswfSBpcyBub3QgYW5ub3RhdGVkIHdpdGggQFBhdGguCit1cmkuYnVpbGRlci5tZXRob2RuYW1lLm5vdC5zcGVjaWZpZWQ9VGhlIG1ldGhvZCBuYW1lZCAiezB9IiBpcyBub3Qgc3BlY2lmaWVkIGJ5IHsxfS4KK3VyaS5idWlsZGVyLmFubm90YXRlZGVsZW1lbnQucGF0aC5hbm5vdGF0aW9uLm1pc3Npbmc9VGhlIGFubm90YXRlZCBlbGVtZW50ICJ7MH0iIGlzIG5vdCBhbm5vdGF0ZWQgd2l0aCBAUGF0aC4KK3VyaS5idWlsZGVyLnNjaGVtYS5wYXJ0Lm9wYXF1ZT1TY2hlbWEgc3BlY2lmaWMgcGFydCBpcyBvcGFxdWUuCit1cmkuY29tcG9uZW50LmVuY29kZWQub2N0ZXQuaW52YWxpZC5kaWdpdD1NYWxmb3JtZWQgcGVyY2VudC1lbmNvZGVkIG9jdGV0IGF0IGluZGV4IHswfSwgaW52YWxpZCBoZXhhZGVjaW1hbCBkaWdpdCAnJ3sxfScnLgordXJpLmNvbXBvbmVudC5lbmNvZGVkLm9jdGV0Lm1hbGZvcm1lZD1NYWxmb3JtZWQgcGVyY2VudC1lbmNvZGVkIG9jdGV0IGF0IGluZGV4IHswfS4KK3VyaS5jb21wb25lbnQuaW52YWxpZC5jaGFyYWN0ZXI9VGhlIHN0cmluZyAiezB9IiBmb3IgdGhlIFVSSSBjb21wb25lbnQgezF9IGNvbnRhaW5zIGFuIGludmFsaWQgY2hhcmFjdGVyLCAnJ3syfScnLCBhdCBpbmRleCB7M30uCit1cmkuaXMubnVsbD1VcmkgaXMgbnVsbC4KK3VyaS5wYXJzZXIuY29tcG9uZW50LmRlbGltaXRlcj1Db21wb25lbnQgZG9lcyBub3QgZW5kIGJ5IGEgZGVsaW1pdGVyICcnezB9JycgYXQgaW5kZXggezF9LgordXJpLnBhcnNlci5ub3QuZXhlY3V0ZWQ9VGhlIHBhcnNlciB3YXMgbm90IGV4ZWN1dGVkIHlldC4gQ2FsbCB0aGUgcGFyc2UoKSBtZXRob2QgZmlyc3QuCit1cmkucGFyc2VyLnNjaGVtZS5leHBlY3RlZD1FeHBlY3RlZCBzY2hlbWUgbmFtZSBhdCBpbmRleCB7MH06ICcnezF9JycuCit1c2luZy5leGVjdXRvci5wcm92aWRlcj1TZWxlY3RlZCBFeGVjdXRvclNlcnZpY2VQcm92aWRlciBpbXBsZW1lbnRhdGlvbiBbezB9XSB0byBiZSB1c2VkIGZvciBpbmplY3Rpb24gb2YgZXhlY3V0b3IgcXVhbGlmaWVkIGJ5IFt7MX1dIGFubm90YXRpb24uCit1c2luZy5zY2hlZHVsZXIucHJvdmlkZXI9U2VsZWN0ZWQgU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXIgaW1wbGVtZW50YXRpb24gW3swfV0gdG8gYmUgdXNlZCBmb3IgaW5qZWN0aW9uIG9mIHNjaGVkdWxlciBxdWFsaWZpZWQgYnkgW3sxfV0gYW5ub3RhdGlvbi4KKyMgezB9IC0gQXJiaXRyYXJ5IGxvY2FsaXplZCBtZXNzYWdlLCBlLmcuOiBbRkFUQUxdIDxsb2NhbGl6ZWRfbWVzc2FnZT47IHNvdXJjZT08b2JqZWN0Pgord2FybmluZy5tc2c9V0FSTklORzogezB9Cit3YXJuaW5nLnByb3ZpZGVyLmNvbnN0cmFpbmVkVG8ud3JvbmcucGFja2FnZT1BIHJlZ2lzdGVyZWQgcHJvdmlkZXIgezB9IGNvbnN0cmFpbmVkICh2aWEgQENvbnN0cmFpbmVkVG8pIHRvIHsxfSBydW50aW1lIGltcGxlbWVudHMgaW50ZXJmYWNlIHsyfSB3aGljaCBpcyBvbmx5IHVzYWJsZSBpbiBhIHszfSBydW50aW1lIGNvbnRleHQuCisjIHswfSAtIExpc3Qgb2YgYXJiaXRyYXJ5IGxvY2FsaXplZCBtZXNzYWdlcywgZS5nLjogW0ZBVEFMXSA8bG9jYWxpemVkX21lc3NhZ2U+OyBzb3VyY2U9PG9iamVjdD4KK3dhcm5pbmdzLmRldGVjdGVkPVRoZSBmb2xsb3dpbmcgd2FybmluZ3MgaGF2ZSBiZWVuIGRldGVjdGVkOiB7MH0KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvU2VjdXJpdHlNYW5hZ2VyQ29uZmlndXJlZFRlc3QuamF2YSBiL2NvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvU2VjdXJpdHlNYW5hZ2VyQ29uZmlndXJlZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDhkMDE0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9TZWN1cml0eU1hbmFnZXJDb25maWd1cmVkVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworCisvKioKKyAqIFRlc3QgdGhhdCB2ZXJpZmllcyB0aGF0IHNlY3VyaXR5IG1hbmFnZXIgaXMgc2V0dXAgdG8gcnVuIHRoZSBKZXJzZXkgY29yZSBzZXJ2ZXIgdW5pdCB0ZXN0cy4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgU2VjdXJpdHlNYW5hZ2VyQ29uZmlndXJlZFRlc3QgeworICAgIC8qKgorICAgICAqIENoZWNrIHRoYXQgc3lzdGVtIHNlY3VyaXR5IG1hbmFnZXIgaGFzIGJlZW4gY29uZmlndXJlZC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZWN1cml0eU1hbmFnZXJJc0NvbmZpZ3VyZWQoKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwoIkplcnNleSBjb3JlIHNlcnZlciB1bml0IHRlc3RzIHNob3VsZCBydW4gd2l0aCBhY3RpdmUgc2VjdXJpdHkgbWFuYWdlciIsCisgICAgICAgICAgICAgICAgU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL1Rlc3RSdW50aW1lRGVsZWdhdGUuamF2YSBiL2NvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvVGVzdFJ1bnRpbWVEZWxlZ2F0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkOWUxZDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL1Rlc3RSdW50aW1lRGVsZWdhdGUuamF2YQpAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsOworCitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkxpbms7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5WYXJpYW50OworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SdW50aW1lRGVsZWdhdGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLk1lc3NhZ2luZ0JpbmRlcnM7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworCisvKioKKyAqIFRlc3QgcnVudGltZSBkZWxlZ2F0ZS4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgVGVzdFJ1bnRpbWVEZWxlZ2F0ZSBleHRlbmRzIEFic3RyYWN0UnVudGltZURlbGVnYXRlIHsKKworICAgIHB1YmxpYyBUZXN0UnVudGltZURlbGVnYXRlKCkgeworICAgICAgICBzdXBlcihuZXcgTWVzc2FnaW5nQmluZGVycy5IZWFkZXJEZWxlZ2F0ZVByb3ZpZGVycygpLmdldEhlYWRlckRlbGVnYXRlUHJvdmlkZXJzKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gVCBjcmVhdGVFbmRwb2ludChBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiwgQ2xhc3M8VD4gZW5kcG9pbnRUeXBlKQorICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgeWV0LiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNZWRpYVR5cGUoKSB7CisgICAgICAgIE1lZGlhVHlwZSBtID0gbmV3IE1lZGlhVHlwZSgidGV4dCIsICJwbGFpbiIpOworICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChtKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXJpQnVpbGRlcigpIHsKKyAgICAgICAgVXJpQnVpbGRlciB1YiA9IFJ1bnRpbWVEZWxlZ2F0ZS5nZXRJbnN0YW5jZSgpLmNyZWF0ZVVyaUJ1aWxkZXIoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwodWIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNwb25zZUJ1aWxkZXIoKSB7CisgICAgICAgIFJlc3BvbnNlLlJlc3BvbnNlQnVpbGRlciByYiA9IFJ1bnRpbWVEZWxlZ2F0ZS5nZXRJbnN0YW5jZSgpLmNyZWF0ZVJlc3BvbnNlQnVpbGRlcigpOworICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChyYik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFZhcmlhbnRMaXN0QnVpbGRlcigpIHsKKyAgICAgICAgVmFyaWFudC5WYXJpYW50TGlzdEJ1aWxkZXIgdmxiID0gUnVudGltZURlbGVnYXRlLmdldEluc3RhbmNlKCkuY3JlYXRlVmFyaWFudExpc3RCdWlsZGVyKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKHZsYik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExpbmtCdWlsZGVyKCkgeworICAgICAgICBmaW5hbCBMaW5rLkJ1aWxkZXIgbGlua0J1aWxkZXIgPSBSdW50aW1lRGVsZWdhdGUuZ2V0SW5zdGFuY2UoKS5jcmVhdGVMaW5rQnVpbGRlcigpOworICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChsaW5rQnVpbGRlcik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKCkgeworICAgICAgICBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB3YWUgPSBuZXcgV2ViQXBwbGljYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwod2FlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2luamVjdC9Qcm92aWRlcnNUZXN0LmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL2luamVjdC9Qcm92aWRlcnNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE5YjFlZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvaW5qZWN0L1Byb3ZpZGVyc1Rlc3QuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5Db250cmFjdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0cyB7QGxpbmsgUHJvdmlkZXJzfS4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgUHJvdmlkZXJzVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc1Byb3ZpZGVySW50ZXJmYWNlKCkgeworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgUHJvdmlkZXJzLmlzUHJvdmlkZXIoUHJvdmlkZXIuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBQcm92aWRlcnMuaXNQcm92aWRlcihOb3RQcm92aWRlci5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgUHJvdmlkZXJzLmlzUHJvdmlkZXIoSmF4UnNQcm92aWRlci5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgUHJvdmlkZXJzLmlzUHJvdmlkZXIoQ2xhc3NCYXNlZFByb3ZpZGVyLmNsYXNzKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgTm9uQ29udHJhY3RJbnRlcmZhY2UgeworICAgIH0KKworICAgIEBDb250cmFjdAorICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIENvbnRyYWN0SW50ZXJmYWNlIHsKKyAgICB9CisKKyAgICBAQ29udHJhY3QKKyAgICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIENvbnRyYWN0Q2xhc3MgeworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHJvdmlkZXIgaW1wbGVtZW50cyBDb250cmFjdEludGVyZmFjZSB7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBOb3RQcm92aWRlciBpbXBsZW1lbnRzIE5vbkNvbnRyYWN0SW50ZXJmYWNlIHsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpheFJzUHJvdmlkZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVJlYWRlcjxTdHJpbmc+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHJlYWRGcm9tKENsYXNzPFN0cmluZz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBodHRwSGVhZGVycywgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sCisgICAgICAgICAgICAgICAgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENsYXNzQmFzZWRQcm92aWRlciBleHRlbmRzIENvbnRyYWN0Q2xhc3MgeworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9zb25hci9Tb25hckplcnNleUNvbW1vblRlc3QuamF2YSBiL2NvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvc29uYXIvU29uYXJKZXJzZXlDb21tb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM1YTUwNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvc29uYXIvU29uYXJKZXJzZXlDb21tb25UZXN0LmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5zb25hcjsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYSBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgU29uYXJKZXJzZXlDb21tb25UZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVuaXRUZXN0KCkgeworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJjb21tb24gdW5pdCB0ZXN0IiwgbmV3IFNvbmFySmVyc2V5Q29tbW9uKCkudW5pdFRlc3QoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL0Jhc2U2NFRlc3QuamF2YSBiL2NvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9CYXNlNjRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlkZmE5OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9CYXNlNjRUZXN0LmphdmEKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCisvKioKKyAqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIEJhc2U2NFRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZGVjb2RlZCA9IG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICAiYW55IGNhcm5hbCBwbGVhc3VyZS4iLAorICAgICAgICAgICAgImFueSBjYXJuYWwgcGxlYXN1cmUiLAorICAgICAgICAgICAgImFueSBjYXJuYWwgcGxlYXN1ciIsCisgICAgICAgICAgICAiYW55IGNhcm5hbCBwbGVhc3UiLAorICAgICAgICAgICAgImFueSBjYXJuYWwgcGxlYXMiCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGVuY29kZWQgPSBuZXcgU3RyaW5nW10geworICAgICAgICAgICAgIllXNTVJR05oY201aGJDQndiR1ZoYzNWeVpTND0iLAorICAgICAgICAgICAgIllXNTVJR05oY201aGJDQndiR1ZoYzNWeVpRPT0iLAorICAgICAgICAgICAgIllXNTVJR05oY201aGJDQndiR1ZoYzNWeSIsCisgICAgICAgICAgICAiWVc1NUlHTmhjbTVoYkNCd2JHVmhjM1U9IiwKKyAgICAgICAgICAgICJZVzU1SUdOaGNtNWhiQ0J3YkdWaGN3PT0iCisgICAgfTsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVuY29kZVN0cmluZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlY29kZWQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhlbmNvZGVkW2ldLCBuZXcgU3RyaW5nKEJhc2U2NC5lbmNvZGUoZGVjb2RlZFtpXS5nZXRCeXRlcygiQVNDSUkiKSksICJBU0NJSSIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlY29kZVN0cmluZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVuY29kZWQubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhkZWNvZGVkW2ldLCBuZXcgU3RyaW5nKEJhc2U2NC5kZWNvZGUoZW5jb2RlZFtpXS5nZXRCeXRlcygiQVNDSUkiKSksICJBU0NJSSIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJvdW5kdHJpcExlbmd0aE1vZDNFcXVhbHMwKCkgeworICAgICAgICBieXRlW10gZGF0YSA9IHswLCAxLCAyLCAzLCA0LCA1LCA2LCA3LCA4fTsKKyAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IEJhc2U2NC5kZWNvZGUoQmFzZTY0LmVuY29kZShkYXRhKSk7CisgICAgICAgIGFzc2VydFRydWUoImZhaWxlZCB0byByb3VuZHRyaXAgdmFsdWUgdG8gYmFzZTY0IiwgQXJyYXlzLmVxdWFscyhkYXRhLCByZXN1bHQpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSb3VuZHRyaXBMZW5ndGhNb2QzRXF1YWxzMSgpIHsKKyAgICAgICAgYnl0ZVtdIGRhdGEgPSB7MCwgMSwgMiwgMywgNCwgNSwgNiwgNywgOCwgOX07CisgICAgICAgIGJ5dGVbXSByZXN1bHQgPSBCYXNlNjQuZGVjb2RlKEJhc2U2NC5lbmNvZGUoZGF0YSkpOworICAgICAgICBhc3NlcnRUcnVlKCJmYWlsZWQgdG8gcm91bmR0cmlwIHZhbHVlIHRvIGJhc2U2NCIsIEFycmF5cy5lcXVhbHMoZGF0YSwgcmVzdWx0KSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Um91bmR0cmlwTGVuZ3RoTW9kM0VxdWFsczIoKSB7CisgICAgICAgIGJ5dGVbXSBkYXRhID0gezAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwfTsKKyAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IEJhc2U2NC5kZWNvZGUoQmFzZTY0LmVuY29kZShkYXRhKSk7CisgICAgICAgIGFzc2VydFRydWUoImZhaWxlZCB0byByb3VuZHRyaXAgdmFsdWUgdG8gYmFzZTY0IiwgQXJyYXlzLmVxdWFscyhkYXRhLCByZXN1bHQpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSb3VuZHRyaXBPbmVCeXRlR3JlYXRlclRoYW4xMjcoKSB7CisgICAgICAgIGJ5dGVbXSBkYXRhID0geyhieXRlKSAxMjh9OworICAgICAgICB0cnkgeworICAgICAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IEJhc2U2NC5kZWNvZGUoQmFzZTY0LmVuY29kZShkYXRhKSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBvaworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Um91bmR0cmlwQXNzb3J0ZWRWYWx1ZXMoKSB7CisgICAgICAgIGJ5dGVbXSBkYXRhID0gezAsIDEsIDYzLCA2NCwgNjUsIChieXRlKSAxMjcsIChieXRlKSAxMjgsIChieXRlKSAxMjk5LCAoYnl0ZSkgMjU0LCAoYnl0ZSkgMjU1fTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEJhc2U2NC5kZWNvZGUoQmFzZTY0LmVuY29kZShkYXRhKSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBvaworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5jb2RlQnl0ZUFycmF5KCkgeworICAgICAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlWzI1Nl07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKKyAgICAgICAgICAgIGRhdGFbaV0gPSAoYnl0ZSkgKDI1NSAtIGkpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgU3RyaW5nKEJhc2U2NC5lbmNvZGUoZGF0YSkpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gb2sKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlY29kZVN0cmluZzIoKSB7CisgICAgICAgIFN0cmluZyBkYXRhID0gIkFBRUNBd1FGQmdjSUNRb0xEQTBPRHhBUkVoTVVGUllYR0JrYUd4d2RIaDhnSVNJakpDVW1KeWdwS2lzc0xTNHZNREV5TXpRMU5qYzRPVG83UEQwIgorICAgICAgICAgICAgICAgICsgIitQMEJCUWtORVJVWkhTRWxLUzB4TlRrOVFVVkpUVkZWV1YxaFpXbHRjWFY1ZllHRmlZMlJsWm1kb2FXcHJiRzF1YjNCeGNuTjBkWFozZUhsNmUzeDlmbiIKKyAgICAgICAgICAgICAgICArICIrQWdZS0RoSVdHaDRpSmlvdU1qWTZQa0pHU2s1U1ZscGVZbVpxYm5KMmVuNkNob3FPa3BhYW5xS21xcTZ5dHJxK3dzYkt6dExXMnQ3aTV1cnU4dmI2IgorICAgICAgICAgICAgICAgICsgIi93TUhDdzhURnhzZkl5Y3JMek0zT3o5RFIwdFBVMWRiWDJObmEyOXpkM3QvZzRlTGo1T1htNStqcDZ1dnM3ZTd2OFBIeTgvVDE5dmY0K2ZyNy9QMysvdz09IjsKKyAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IEJhc2U2NC5kZWNvZGUoZGF0YS5nZXRCeXRlcygpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImluY29ycmVjdCBsZW5ndGgiLCByZXN1bHQubGVuZ3RoLCAyNTYpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NjsgKytpKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImluY29ycmVjdCB2YWx1ZSIsIHJlc3VsdFtpXSwgKGJ5dGUpIGkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL0plcnNleVB1Ymxpc2hlclRlc3QuamF2YSBiL2NvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9KZXJzZXlQdWJsaXNoZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNhNDJjNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9KZXJzZXlQdWJsaXNoZXJUZXN0LmphdmEKQEAgLTAsMCArMSwyMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbDsKKworCitpbXBvcnQgamF2YS51dGlsLlF1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRMaW5rZWRRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuanNyMTY2LkZsb3c7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIFRlc3QgSmVyc2V5IHtAbGluayBGbG93LlB1Ymxpc2hlcn0gaW1wbGVtZW50YXRpb24sIHtAbGluayBKZXJzZXlQdWJsaXNoZXJ9LgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEplcnNleVB1Ymxpc2hlclRlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBvcGVuTGF0Y2gxID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBvcGVuTGF0Y2gyID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBvcGVuTGF0Y2gzID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworCisgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIHdyaXRlTGF0Y2gxID0gbmV3IENvdW50RG93bkxhdGNoKDMpOworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCB3cml0ZUxhdGNoMiA9IG5ldyBDb3VudERvd25MYXRjaCgyKTsKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggd3JpdGVMYXRjaDMgPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggY2xvc2VMYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgzKTsKKworICAgICAgICBmaW5hbCBKZXJzZXlQdWJsaXNoZXI8U3RyaW5nPiBwdWJsaXNoZXIgPSBuZXcgSmVyc2V5UHVibGlzaGVyPD4oSmVyc2V5UHVibGlzaGVyLlB1Ymxpc2hlclN0cmF0ZWd5LkJMT0NLSU5HKTsKKyAgICAgICAgZmluYWwgUHVibGlzaGVyVGVzdFN1YnNjcmliZXIgc3Vic2NyaWJlcjEgPQorICAgICAgICAgICAgICAgIG5ldyBQdWJsaXNoZXJUZXN0U3Vic2NyaWJlcigiU1VCU0NSSUJFUi0xIiwgb3BlbkxhdGNoMSwgd3JpdGVMYXRjaDEsIGNsb3NlTGF0Y2gpOworICAgICAgICBmaW5hbCBQdWJsaXNoZXJUZXN0U3Vic2NyaWJlciBzdWJzY3JpYmVyMiA9CisgICAgICAgICAgICAgICAgbmV3IFB1Ymxpc2hlclRlc3RTdWJzY3JpYmVyKCJTVUJTQ1JJQkVSLTIiLCBvcGVuTGF0Y2gyLCB3cml0ZUxhdGNoMiwgY2xvc2VMYXRjaCk7CisgICAgICAgIGZpbmFsIFB1Ymxpc2hlclRlc3RTdWJzY3JpYmVyIHN1YnNjcmliZXIzID0KKyAgICAgICAgICAgICAgICBuZXcgUHVibGlzaGVyVGVzdFN1YnNjcmliZXIoIlNVQlNDUklCRVItMyIsIG9wZW5MYXRjaDMsIHdyaXRlTGF0Y2gzLCBjbG9zZUxhdGNoKTsKKworICAgICAgICBwdWJsaXNoZXIucHVibGlzaCgiU1RBUlQiKTsgIC8vIHNlbnQgYmVmb3JlIGFueSBzdWJzY3JpYmVyIHN1YnNjcmliZWQgLSBzaG91bGQgbm90IGJlIHJlY2VpdmVkCisKKyAgICAgICAgcHVibGlzaGVyLnN1YnNjcmliZShzdWJzY3JpYmVyMSk7CisgICAgICAgIHB1Ymxpc2hlci5wdWJsaXNoKCJaZXJvIik7ICAgLy8gYmVmb3JlIHJlY2VpdmUsIGJ1dCBzaG91bGQgYmUgcmVjZWl2ZWQgYnkgU1VCU0NSSUJFUi0xCisgICAgICAgIGFzc2VydFRydWUob3BlbkxhdGNoMS5hd2FpdCgyMDAsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworCisgICAgICAgIHN1YnNjcmliZXIxLnJlY2VpdmUoMyk7CisgICAgICAgIHB1Ymxpc2hlci5wdWJsaXNoKCJPbmUiKTsgICAgLy8gc2hvdWxkIGJlIHJlY2VpdmVkIGJ5IFNVQlNDUklCRVItMQorCisgICAgICAgIHB1Ymxpc2hlci5zdWJzY3JpYmUoc3Vic2NyaWJlcjIpOworICAgICAgICBhc3NlcnRUcnVlKG9wZW5MYXRjaDIuYXdhaXQoMjAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKyAgICAgICAgc3Vic2NyaWJlcjIucmVjZWl2ZSg1KTsKKworICAgICAgICBwdWJsaXNoZXIucHVibGlzaCgiVHdvIik7ICAgIC8vIHNob3VsZCBiZSByZWNlaXZlZCBieSBTVUJTQ1JJQkVSLTEgYW5kIFNVQlNDUklCRVItMgorCisgICAgICAgIHB1Ymxpc2hlci5zdWJzY3JpYmUoc3Vic2NyaWJlcjMpOworICAgICAgICBhc3NlcnRUcnVlKG9wZW5MYXRjaDMuYXdhaXQoMjAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKyAgICAgICAgc3Vic2NyaWJlcjMucmVjZWl2ZSg1KTsKKworICAgICAgICBwdWJsaXNoZXIucHVibGlzaCgiVGhyZWUiKTsgIC8vIHNob3VsZCBiZSByZWNlaXZlZCBieSBTVUJTQ1JJQkVSLTIgYW5kIFNVQlNDUklCRVItMworCisgICAgICAgIGFzc2VydFRydWUod3JpdGVMYXRjaDEuYXdhaXQoMTAwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgIGFzc2VydFRydWUod3JpdGVMYXRjaDIuYXdhaXQoMTAwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgIGFzc2VydFRydWUod3JpdGVMYXRjaDMuYXdhaXQoMTAwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisKKyAgICAgICAgUXVldWU8U3RyaW5nPiByZXN1bHQgPSBzdWJzY3JpYmVyMS5nZXRSZWNlaXZlZERhdGEoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHJlc3VsdC5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlplcm8iLCByZXN1bHQucG9sbCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJPbmUiLCByZXN1bHQucG9sbCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUd28iLCByZXN1bHQucG9sbCgpKTsKKworICAgICAgICByZXN1bHQgPSBzdWJzY3JpYmVyMi5nZXRSZWNlaXZlZERhdGEoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHJlc3VsdC5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlR3byIsIHJlc3VsdC5wb2xsKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlRocmVlIiwgcmVzdWx0LnBvbGwoKSk7CisKKyAgICAgICAgcmVzdWx0ID0gc3Vic2NyaWJlcjMuZ2V0UmVjZWl2ZWREYXRhKCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCByZXN1bHQuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaHJlZSIsIHJlc3VsdC5wb2xsKCkpOworCisgICAgICAgIHB1Ymxpc2hlci5jbG9zZSgpOworICAgICAgICBzdWJzY3JpYmVyMS5yZWNlaXZlKDEpOyAgICAgLy8gLS0+IHdpdGggdGhpcywgdGhlIENETCBpcyBzdWNjZXNzZnVsbHkgY291bnRlZCBkb3duIGFuZCBhd2FpdCByZXR1cm5zIHRydWUKKyAgICAgICAgYXNzZXJ0VHJ1ZShjbG9zZUxhdGNoLmF3YWl0KDEwMDAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKyAgICAgICAgLy8gdGhpcyBiZWhhdmlvdXIgaXMgYSBsaXR0bGUgY291bnRlci1pbnR1aXRpdmUsIGJ1dCBjb25maXJtZWQgYXMgY29ycmVjdCBieSBGbG93LlN1Ym1pc3Npb25QdWJsaXNoZXIgYXV0aG9yLAorICAgICAgICAvLyBEb3VnaCBMZWEgb24gdGhlIEpESyBtYWlsaW5nIGxpc3QKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb25CbG9ja2luZygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGludCBNU0dfQ09VTlQgPSAzMDA7CisKKyAgICAgICAgZmluYWwgSmVyc2V5UHVibGlzaGVyPFN0cmluZz4gcHVibGlzaGVyID0gbmV3IEplcnNleVB1Ymxpc2hlcjw+KCk7CisKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggb3BlbkxhdGNoQWN0aXZlID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCB3cml0ZUxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKE1TR19DT1VOVCk7CisgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGNsb3NlTGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggb3BlbkxhdGNoRGVhZCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKworICAgICAgICBmaW5hbCBQdWJsaXNoZXJUZXN0U3Vic2NyaWJlciBkZWFkU3Vic2NyaWJlciA9CisgICAgICAgICAgICAgICAgbmV3IFB1Ymxpc2hlclRlc3RTdWJzY3JpYmVyKCJkZWFkIiwgb3BlbkxhdGNoRGVhZCwgbmV3IENvdW50RG93bkxhdGNoKDApLCBuZXcgQ291bnREb3duTGF0Y2goMCkpOworCisgICAgICAgIGZpbmFsIFB1Ymxpc2hlclRlc3RTdWJzY3JpYmVyIGFjdGl2ZVN1YnNjcmliZXIgPQorICAgICAgICAgICAgICAgIG5ldyBQdWJsaXNoZXJUZXN0U3Vic2NyaWJlcigiYWN0aXZlIiwgb3BlbkxhdGNoQWN0aXZlLCB3cml0ZUxhdGNoLCBjbG9zZUxhdGNoKTsKKworICAgICAgICAvLyBzdWJzY3JpYmUgdG8gcHVibGlzaGVyCisgICAgICAgIHB1Ymxpc2hlci5zdWJzY3JpYmUoZGVhZFN1YnNjcmliZXIpOworICAgICAgICBhc3NlcnRUcnVlKG9wZW5MYXRjaERlYWQuYXdhaXQoMjAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKyAgICAgICAgcHVibGlzaGVyLnN1YnNjcmliZShhY3RpdmVTdWJzY3JpYmVyKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShvcGVuTGF0Y2hBY3RpdmUuYXdhaXQoMjAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKworICAgICAgICBhY3RpdmVTdWJzY3JpYmVyLnJlY2VpdmUoMTAwMCk7CisKKyAgICAgICAgQXRvbWljSW50ZWdlciBjb3VudGVyID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CisgICAgICAgIGZpbmFsIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSBzY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UgPSBFeGVjdXRvcnMubmV3U2luZ2xlVGhyZWFkU2NoZWR1bGVkRXhlY3V0b3IoKTsKKyAgICAgICAgc2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlLnNjaGVkdWxlV2l0aEZpeGVkRGVsYXkoKCkgLT4geworICAgICAgICAgICAgaW50IGkgPSBjb3VudGVyLmdldEFuZEluY3JlbWVudCgpOworCisgICAgICAgICAgICBpZiAoaSA+PSBNU0dfQ09VTlQpIHsKKyAgICAgICAgICAgICAgICBzY2hlZHVsZWRFeGVjdXRvclNlcnZpY2Uuc2h1dGRvd24oKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1Ymxpc2hlci5wdWJsaXNoKCJNU0ctIiArIGkpOworICAgICAgICB9LCAwLCAxMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKworICAgICAgICBhc3NlcnRUcnVlKHdyaXRlTGF0Y2guYXdhaXQoNjAwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1TR19DT1VOVCwgYWN0aXZlU3Vic2NyaWJlci5nZXRSZWNlaXZlZERhdGEoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgZGVhZFN1YnNjcmliZXIuZ2V0UmVjZWl2ZWREYXRhKCkuc2l6ZSgpKTsKKworICAgICAgICBhc3NlcnRGYWxzZShhY3RpdmVTdWJzY3JpYmVyLmhhc0Vycm9yKCkpOworICAgICAgICBhc3NlcnRUcnVlKGRlYWRTdWJzY3JpYmVyLmhhc0Vycm9yKCkpOworCisgICAgICAgIHB1Ymxpc2hlci5jbG9zZSgpOworCisgICAgICAgIGFzc2VydFRydWUoY2xvc2VMYXRjaC5hd2FpdCg2MDAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShhY3RpdmVTdWJzY3JpYmVyLmlzQ29tcGxldGVkKCkpOworICAgICAgICBhc3NlcnRGYWxzZShkZWFkU3Vic2NyaWJlci5pc0NvbXBsZXRlZCgpKTsKKyAgICB9CisKKyAgICBjbGFzcyBQdWJsaXNoZXJUZXN0U3Vic2NyaWJlciBpbXBsZW1lbnRzIEZsb3cuU3Vic2NyaWJlcjxTdHJpbmc+IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworICAgICAgICBwcml2YXRlIGZpbmFsIENvdW50RG93bkxhdGNoIG9wZW5MYXRjaDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb3VudERvd25MYXRjaCB3cml0ZUxhdGNoOworICAgICAgICBwcml2YXRlIGZpbmFsIENvdW50RG93bkxhdGNoIGNsb3NlTGF0Y2g7CisgICAgICAgIHByaXZhdGUgRmxvdy5TdWJzY3JpcHRpb24gc3Vic2NyaXB0aW9uOworICAgICAgICBwcml2YXRlIGZpbmFsIFF1ZXVlPFN0cmluZz4gZGF0YTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGhhc0Vycm9yID0gZmFsc2U7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBjb21wbGV0ZWQgPSBmYWxzZTsKKworICAgICAgICBQdWJsaXNoZXJUZXN0U3Vic2NyaWJlcihmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggb3BlbkxhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCB3cml0ZUxhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBjbG9zZUxhdGNoKSB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICAgICAgdGhpcy5vcGVuTGF0Y2ggPSBvcGVuTGF0Y2g7CisgICAgICAgICAgICB0aGlzLndyaXRlTGF0Y2ggPSB3cml0ZUxhdGNoOworICAgICAgICAgICAgdGhpcy5jbG9zZUxhdGNoID0gY2xvc2VMYXRjaDsKKyAgICAgICAgICAgIHRoaXMuZGF0YSA9IG5ldyBDb25jdXJyZW50TGlua2VkUXVldWU8PigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU3Vic2NyaWJlKGZpbmFsIEZsb3cuU3Vic2NyaXB0aW9uIHN1YnNjcmlwdGlvbikgeworICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb24gPSBzdWJzY3JpcHRpb247CisgICAgICAgICAgICBvcGVuTGF0Y2guY291bnREb3duKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25OZXh0KGZpbmFsIFN0cmluZyBpdGVtKSB7CisgICAgICAgICAgICBkYXRhLmFkZChpdGVtKTsKKyAgICAgICAgICAgIHdyaXRlTGF0Y2guY291bnREb3duKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihmaW5hbCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7CisgICAgICAgICAgICB0aHJvd2FibGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBoYXNFcnJvciA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZSgpIHsKKyAgICAgICAgICAgIGNvbXBsZXRlZCA9IHRydWU7CisgICAgICAgICAgICBjbG9zZUxhdGNoLmNvdW50RG93bigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5uYW1lICsgIiAiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZWNlaXZlKGZpbmFsIGxvbmcgbikgeworICAgICAgICAgICAgaWYgKHN1YnNjcmlwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnJlcXVlc3Qobik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0cmlldmUgc3RvcmVkIChyZWNlaXZlZCkgZGF0YSBmb3IgYXNzZXJ0aW9ucy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBhbGwgdGhlIGRhdGEgcmVjZWl2ZWQgYnkgc3Vic2NyaWJlci4KKyAgICAgICAgICovCisgICAgICAgIFF1ZXVlPFN0cmluZz4gZ2V0UmVjZWl2ZWREYXRhKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2xlYW4gaGFzRXJyb3IoKSB7CisgICAgICAgICAgICByZXR1cm4gaGFzRXJyb3I7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIGlzQ29tcGxldGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9Pc2dpUmVnaXN0cnlUZXN0LmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvT3NnaVJlZ2lzdHJ5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NmNiNmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvT3NnaVJlZ2lzdHJ5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWw7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Pc2dpUmVnaXN0cnk7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFV0aWxpdHkgY2xhc3Mge0BsaW5nIE9zZ2lSZWdpc3RyeX0gdGVzdHMuCisgKgorICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYSBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgT3NnaVJlZ2lzdHJ5VGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJJbmZDbGFzc2VzQnVuZGxlRW50cnlQYXRoVHJhbnNsYXRpb24oKSB7CisgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBPc2dpUmVnaXN0cnkKKyAgICAgICAgICAgICAgICAuYnVuZGxlRW50cnlQYXRoVG9DbGFzc05hbWUoIm9yZy9nbGFzc2Zpc2gvamVyc2V5IiwgIi9XRUItSU5GL2NsYXNzZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvVGVzdC5jbGFzcyIpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJvcmcuZ2xhc3NmaXNoLmplcnNleS5UZXN0IiwgY2xhc3NOYW1lKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJJbmZDbGFzc2VzQnVuZGxlRW50cnlQYXRoVHJhbnNsYXRpb25QYWNrYWdlVHJhaWxpbmdTbGFzaCgpIHsKKyAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IE9zZ2lSZWdpc3RyeQorICAgICAgICAgICAgICAgIC5idW5kbGVFbnRyeVBhdGhUb0NsYXNzTmFtZSgib3JnL2dsYXNzZmlzaC9qZXJzZXkvIiwgIi9XRUItSU5GL2NsYXNzZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvVGVzdC5jbGFzcyIpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJvcmcuZ2xhc3NmaXNoLmplcnNleS5UZXN0IiwgY2xhc3NOYW1lKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJJbmZDbGFzc2VzQnVuZGxlRW50cnlQYXRoVHJhbnNsYXRpb25QYWNrYWdlTGVhZGluZ1NsYXNoKCkgeworICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gT3NnaVJlZ2lzdHJ5CisgICAgICAgICAgICAgICAgLmJ1bmRsZUVudHJ5UGF0aFRvQ2xhc3NOYW1lKCIvb3JnL2dsYXNzZmlzaC9qZXJzZXkiLCAiL1dFQi1JTkYvY2xhc3Nlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9UZXN0LmNsYXNzIik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIm9yZy5nbGFzc2Zpc2guamVyc2V5LlRlc3QiLCBjbGFzc05hbWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdlYkluZkNsYXNzZXNCdW5kbGVFbnRyeVBhdGhUcmFuc2xhdGlvbkJ1bmRsZU5vTGVhZGluZ1NsYXNoKCkgeworICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gT3NnaVJlZ2lzdHJ5CisgICAgICAgICAgICAgICAgLmJ1bmRsZUVudHJ5UGF0aFRvQ2xhc3NOYW1lKCIvb3JnL2dsYXNzZmlzaC9qZXJzZXkiLCAiV0VCLUlORi9jbGFzc2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L1Rlc3QuY2xhc3MiKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygib3JnLmdsYXNzZmlzaC5qZXJzZXkuVGVzdCIsIGNsYXNzTmFtZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3NnaUluZkNsYXNzZXNCdW5kbGVFbnRyeVBhdGhUcmFuc2xhdGlvbigpIHsKKyAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IE9zZ2lSZWdpc3RyeQorICAgICAgICAgICAgICAgIC5idW5kbGVFbnRyeVBhdGhUb0NsYXNzTmFtZSgiL29yZy9nbGFzc2Zpc2gvamVyc2V5IiwgIk9TR0ktSU5GL2RpcmVjdG9yeS9vcmcvZ2xhc3NmaXNoL2plcnNleS9UZXN0LmNsYXNzIik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIm9yZy5nbGFzc2Zpc2guamVyc2V5LlRlc3QiLCBjbGFzc05hbWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ1bmRsZUVudHJ5UGF0aFRyYW5zbGF0aW9uKCkgeworICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gT3NnaVJlZ2lzdHJ5LmJ1bmRsZUVudHJ5UGF0aFRvQ2xhc3NOYW1lKCIvb3JnL2dsYXNzZmlzaC9qZXJzZXkiLCAiL29yZy9nbGFzc2Zpc2gvamVyc2V5L1Rlc3QuY2xhc3MiKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygib3JnLmdsYXNzZmlzaC5qZXJzZXkuVGVzdCIsIGNsYXNzTmFtZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnVuZGxlRW50cnlQYXRoVHJhbnNsYXRpb25CdW5kbGVOb0xlYWRpbmdTbGFzaCgpIHsKKyAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IE9zZ2lSZWdpc3RyeS5idW5kbGVFbnRyeVBhdGhUb0NsYXNzTmFtZSgiL29yZy9nbGFzc2Zpc2gvamVyc2V5IiwgIm9yZy9nbGFzc2Zpc2gvamVyc2V5L1Rlc3QuY2xhc3MiKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygib3JnLmdsYXNzZmlzaC5qZXJzZXkuVGVzdCIsIGNsYXNzTmFtZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnVuZGxlRW50cnlQYXRoVHJhbnNsYXRpb25Ob3RNYXRjaGluZygpIHsKKyAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IE9zZ2lSZWdpc3RyeS5idW5kbGVFbnRyeVBhdGhUb0NsYXNzTmFtZSgiL2NvbS9vcmFjbGUiLCAib3JnL2dsYXNzZmlzaC9qZXJzZXkvVGVzdC5jbGFzcyIpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJjb20ub3JhY2xlLlRlc3QiLCBjbGFzc05hbWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdlYkluZkNsYXNzZXNCdW5kbGVFbnRyeVBhdGhUcmFuc2xhdGlvbk5vdE1hdGNoaW5nKCkgeworICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gT3NnaVJlZ2lzdHJ5CisgICAgICAgICAgICAgICAgLmJ1bmRsZUVudHJ5UGF0aFRvQ2xhc3NOYW1lKCIvY29tL29yYWNsZS8iLCAiL1dFQi1JTkYvY2xhc3Nlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9UZXN0LmNsYXNzIik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImNvbS5vcmFjbGUuVGVzdCIsIGNsYXNzTmFtZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViSW5mQ2xhc3Nlc0J1bmRsZUVudHJ5UGF0aFRyYW5zbGF0aW9uTm90TWF0Y2hpbmcyKCkgeworICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gT3NnaVJlZ2lzdHJ5LmJ1bmRsZUVudHJ5UGF0aFRvQ2xhc3NOYW1lKCJjb20vb3JhY2xlIiwgIi9vcmcvZ2xhc3NmaXNoL2plcnNleS9UZXN0LmNsYXNzIik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImNvbS5vcmFjbGUuVGVzdCIsIGNsYXNzTmFtZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Um9vdEJ1bmRsZUVudHJ5UGF0aFRyYW5zbGF0aW9uKCkgeworICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gT3NnaVJlZ2lzdHJ5LmJ1bmRsZUVudHJ5UGF0aFRvQ2xhc3NOYW1lKCIvIiwgIi9vcmcvZ2xhc3NmaXNoL2plcnNleS9UZXN0LmNsYXNzIik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIm9yZy5nbGFzc2Zpc2guamVyc2V5LlRlc3QiLCBjbGFzc05hbWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJvb3RCdW5kbGVFbnRyeVBhdGhUcmFuc2xhdGlvbk5vTGVhZGluZ1NsYXNoKCkgeworICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gT3NnaVJlZ2lzdHJ5LmJ1bmRsZUVudHJ5UGF0aFRvQ2xhc3NOYW1lKCIvIiwgIm9yZy9nbGFzc2Zpc2gvamVyc2V5L1Rlc3QuY2xhc3MiKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygib3JnLmdsYXNzZmlzaC5qZXJzZXkuVGVzdCIsIGNsYXNzTmFtZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Um9vdFdlYkluZkNsYXNzZXNCdW5kbGVFbnRyeVBhdGhUcmFuc2xhdGlvbk5vTGVhZGluZ1NsYXNoKCkgeworICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gT3NnaVJlZ2lzdHJ5LmJ1bmRsZUVudHJ5UGF0aFRvQ2xhc3NOYW1lKCIvIiwgIi9XRUItSU5GL2NsYXNzZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvVGVzdC5jbGFzcyIpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJvcmcuZ2xhc3NmaXNoLmplcnNleS5UZXN0IiwgY2xhc3NOYW1lKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSb290V2ViSW5mQ2xhc3Nlc0J1bmRsZUVudHJ5UGF0aEVzVHJhbnNsYXRpb24oKSB7CisgICAgICAgIFN0cmluZyBjbGFzc05hbWUgPSBPc2dpUmVnaXN0cnkuYnVuZGxlRW50cnlQYXRoVG9DbGFzc05hbWUoImVzIiwgIi9XRUItSU5GL2NsYXNzZXMvZXMvYS9UZXN0LmNsYXNzIik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImVzLmEuVGVzdCIsIGNsYXNzTmFtZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNUb3BMZXZlbEVudHJ5KCkgeworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShPc2dpUmVnaXN0cnkuaXNQYWNrYWdlTGV2ZWxFbnRyeSgiYSIsICIvYS9Gb28uY2xhc3MiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNUb3BMZXZlbEVudHJ5U2VxdWVuY2VSZXBlYXRzKCkgeworICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoT3NnaVJlZ2lzdHJ5LmlzUGFja2FnZUxldmVsRW50cnkoIm8iLCAiL2EvRm9vLmNsYXNzIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElzVG9wTGV2ZWxFbnRyeU5vU2xhc2goKSB7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKE9zZ2lSZWdpc3RyeS5pc1BhY2thZ2VMZXZlbEVudHJ5KCJhIiwgImEvRm9vLmNsYXNzIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElzVG9wTGV2ZWxFbnRyeVNlcXVlbmNlUmVwZWF0c05vU2xhc2goKSB7CisgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShPc2dpUmVnaXN0cnkuaXNQYWNrYWdlTGV2ZWxFbnRyeSgibyIsICJhL0Zvby5jbGFzcyIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc1RvcExldmVsRW50cnlTbGFzaCgpIHsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoT3NnaVJlZ2lzdHJ5LmlzUGFja2FnZUxldmVsRW50cnkoImEvIiwgIi9hL0Zvby5jbGFzcyIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc1RvcExldmVsRW50cnlTZXF1ZW5jZVJlcGVhdHNTbGFzaCgpIHsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKE9zZ2lSZWdpc3RyeS5pc1BhY2thZ2VMZXZlbEVudHJ5KCJvLyIsICIvYS9Gb28uY2xhc3MiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNUb3BMZXZlbEVudHJ5Um9vdCgpIHsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoT3NnaVJlZ2lzdHJ5LmlzUGFja2FnZUxldmVsRW50cnkoIi8iLCAiL0Zvby5jbGFzcyIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJc1RvcExldmVsRW50cnlSb290RmFsc2UoKSB7CisgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShPc2dpUmVnaXN0cnkuaXNQYWNrYWdlTGV2ZWxFbnRyeSgiLyIsICIvYS9Gb28uY2xhc3MiKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvUHJvcGVydGllc0hlbHBlclRlc3QuamF2YSBiL2NvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9Qcm9wZXJ0aWVzSGVscGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZDUzZTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvUHJvcGVydGllc0hlbHBlclRlc3QuamF2YQpAQCAtMCwwICsxLDE3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LndzLnJzLlJ1bnRpbWVUeXBlOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CisKKy8qKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICoKKyAqLworcHVibGljIGNsYXNzIFByb3BlcnRpZXNIZWxwZXJUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFZhbHVlV2l0aFR5cGUoKSB7CisgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGtleSA9ICJteS5wcm9wZXJ0eSI7CisgICAgICAgIHByb3BlcnRpZXMucHV0KGtleSwgIjE1Iik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNSIsIFByb3BlcnRpZXNIZWxwZXIuZ2V0VmFsdWUocHJvcGVydGllcywga2V5LCBTdHJpbmcuY2xhc3MsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxNSksIFByb3BlcnRpZXNIZWxwZXIuZ2V0VmFsdWUocHJvcGVydGllcywga2V5LCBJbnRlZ2VyLmNsYXNzLCBudWxsKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhMb25nLnZhbHVlT2YoMTUpLCBQcm9wZXJ0aWVzSGVscGVyLmdldFZhbHVlKHByb3BlcnRpZXMsIGtleSwgTG9uZy5jbGFzcywgbnVsbCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFZhbHVlV2l0aFR5cGVBbmREZWZhdWx0VmFsdWUoKSB7CisgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGtleSA9ICJteS5wcm9wZXJ0eSI7CisgICAgICAgIHByb3BlcnRpZXMucHV0KGtleSwgIjE1Iik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNSIsIFByb3BlcnRpZXNIZWxwZXIuZ2V0VmFsdWUocHJvcGVydGllcywga2V5LCAiODAiLCBTdHJpbmcuY2xhc3MsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigzMCksIFByb3BlcnRpZXNIZWxwZXIuZ2V0VmFsdWUocHJvcGVydGllcywgIm5vbi5leGlzdGluZyIsIDMwLCBJbnRlZ2VyLmNsYXNzLCBudWxsKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhMb25nLnZhbHVlT2YoMjApLCBQcm9wZXJ0aWVzSGVscGVyLmdldFZhbHVlKHByb3BlcnRpZXMsICJub24uZXhpc3RpbmciLCAyMEwsIExvbmcuY2xhc3MsIG51bGwpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZVdpdGhEZWZhdWx0VmFsdWUoKSB7CisgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGtleSA9ICJteS5wcm9wZXJ0eSI7CisgICAgICAgIHByb3BlcnRpZXMucHV0KGtleSwgIjE1Iik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxNSIsIFByb3BlcnRpZXNIZWxwZXIuZ2V0VmFsdWUocHJvcGVydGllcywga2V5LCAiODAiLCBudWxsKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMzApLCBQcm9wZXJ0aWVzSGVscGVyLmdldFZhbHVlKHByb3BlcnRpZXMsICJub24uZXhpc3RpbmciLCAzMCwgbnVsbCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTG9uZy52YWx1ZU9mKDIwKSwgUHJvcGVydGllc0hlbHBlci5nZXRWYWx1ZShwcm9wZXJ0aWVzLCAibm9uLmV4aXN0aW5nIiwgMjBMLCBudWxsKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVCeUlnbm9yZWRSdW50aW1lKCkgeworICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBrZXkgPSAibXkucHJvcGVydHkiOworICAgICAgICBwcm9wZXJ0aWVzLnB1dChrZXksICIxNSIpOworCisgICAgICAgIGFzc2VydEVxdWFscygiMTUiLCBQcm9wZXJ0aWVzSGVscGVyLmdldFZhbHVlKHByb3BlcnRpZXMsIFJ1bnRpbWVUeXBlLkNMSUVOVCwga2V5LCBTdHJpbmcuY2xhc3MsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxNSksIFByb3BlcnRpZXNIZWxwZXIuZ2V0VmFsdWUocHJvcGVydGllcywgUnVudGltZVR5cGUuQ0xJRU5ULCBrZXksIEludGVnZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgbnVsbCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTG9uZy52YWx1ZU9mKDE1KSwgUHJvcGVydGllc0hlbHBlci5nZXRWYWx1ZShwcm9wZXJ0aWVzLCBSdW50aW1lVHlwZS5TRVJWRVIsIGtleSwgTG9uZy5jbGFzcywgbnVsbCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFZhbHVlQnlSdW50aW1lMSgpIHsKKyAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBmaW5hbCBTdHJpbmcga2V5ID0gImplcnNleS5jb25maWcubXkucHJvcGVydHkiOworICAgICAgICBwcm9wZXJ0aWVzLnB1dChrZXksICIxNSIpOworICAgICAgICBwcm9wZXJ0aWVzLnB1dCgiamVyc2V5LmNvbmZpZy5jbGllbnQubXkucHJvcGVydHkiLCAiOTk5Iik7CisgICAgICAgIHByb3BlcnRpZXMucHV0KCJqZXJzZXkuY29uZmlnLnNlcnZlci5teS5wcm9wZXJ0eSIsICIxIik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI5OTkiLCBQcm9wZXJ0aWVzSGVscGVyLmdldFZhbHVlKHByb3BlcnRpZXMsIFJ1bnRpbWVUeXBlLkNMSUVOVCwga2V5LCBTdHJpbmcuY2xhc3MsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZig5OTkpLCBQcm9wZXJ0aWVzSGVscGVyLmdldFZhbHVlKHByb3BlcnRpZXMsIFJ1bnRpbWVUeXBlLkNMSUVOVCwga2V5LCBJbnRlZ2VyLmNsYXNzLAorICAgICAgICAgICAgICAgIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExvbmcudmFsdWVPZigxKSwgUHJvcGVydGllc0hlbHBlci5nZXRWYWx1ZShwcm9wZXJ0aWVzLCBSdW50aW1lVHlwZS5TRVJWRVIsIGtleSwgTG9uZy5jbGFzcywgbnVsbCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygiMTUiLCBQcm9wZXJ0aWVzSGVscGVyLmdldFZhbHVlKHByb3BlcnRpZXMsIGtleSwgU3RyaW5nLmNsYXNzLCBudWxsKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMTUpLCBQcm9wZXJ0aWVzSGVscGVyLmdldFZhbHVlKHByb3BlcnRpZXMsIGtleSwgSW50ZWdlci5jbGFzcywgbnVsbCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTG9uZy52YWx1ZU9mKDE1KSwgUHJvcGVydGllc0hlbHBlci5nZXRWYWx1ZShwcm9wZXJ0aWVzLCBrZXksIExvbmcuY2xhc3MsIG51bGwpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZUJ5UnVudGltZTIoKSB7CisgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGtleSA9ICJqZXJzZXkuY29uZmlnLm15LnByb3BlcnR5IjsKKyAgICAgICAgcHJvcGVydGllcy5wdXQoa2V5LCAiMTUiKTsKKyAgICAgICAgcHJvcGVydGllcy5wdXQoImplcnNleS5jb25maWcuY2xpZW50Lm15LnByb3BlcnR5IiwgIjk5OSIpOworCisgICAgICAgIGFzc2VydEVxdWFscygiOTk5IiwgUHJvcGVydGllc0hlbHBlci5nZXRWYWx1ZShwcm9wZXJ0aWVzLCBSdW50aW1lVHlwZS5DTElFTlQsIGtleSwgU3RyaW5nLmNsYXNzLCBudWxsKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoOTk5KSwgUHJvcGVydGllc0hlbHBlci5nZXRWYWx1ZShwcm9wZXJ0aWVzLCBSdW50aW1lVHlwZS5DTElFTlQsIGtleSwgSW50ZWdlci5jbGFzcywKKyAgICAgICAgICAgICAgICBudWxsKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhMb25nLnZhbHVlT2YoMTUpLCBQcm9wZXJ0aWVzSGVscGVyLmdldFZhbHVlKHByb3BlcnRpZXMsIFJ1bnRpbWVUeXBlLlNFUlZFUiwga2V5LCBMb25nLmNsYXNzLCBudWxsKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhMb25nLnZhbHVlT2YoMTUpLCBQcm9wZXJ0aWVzSGVscGVyLmdldFZhbHVlKHByb3BlcnRpZXMsIFJ1bnRpbWVUeXBlLlNFUlZFUiwga2V5LCA4MDBMLCBMb25nLmNsYXNzLAorICAgICAgICAgICAgICAgIG51bGwpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIjE1IiwgUHJvcGVydGllc0hlbHBlci5nZXRWYWx1ZShwcm9wZXJ0aWVzLCBrZXksIFN0cmluZy5jbGFzcywgbnVsbCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDE1KSwgUHJvcGVydGllc0hlbHBlci5nZXRWYWx1ZShwcm9wZXJ0aWVzLCBrZXksIEludGVnZXIuY2xhc3MsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExvbmcudmFsdWVPZigxNSksIFByb3BlcnRpZXNIZWxwZXIuZ2V0VmFsdWUocHJvcGVydGllcywga2V5LCBMb25nLmNsYXNzLCBudWxsKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVCeVJ1bnRpbWUzKCkgeworICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBrZXkgPSAiamVyc2V5LmNvbmZpZy5teS5wcm9wZXJ0eSI7CisgICAgICAgIHByb3BlcnRpZXMucHV0KCJqZXJzZXkuY29uZmlnLmNsaWVudC5teS5wcm9wZXJ0eSIsICI5OTkiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIjk5OSIsIFByb3BlcnRpZXNIZWxwZXIuZ2V0VmFsdWUocHJvcGVydGllcywgUnVudGltZVR5cGUuQ0xJRU5ULCBrZXksIFN0cmluZy5jbGFzcywgbnVsbCkpOworICAgICAgICBhc3NlcnROdWxsKFByb3BlcnRpZXNIZWxwZXIuZ2V0VmFsdWUocHJvcGVydGllcywga2V5LCBTdHJpbmcuY2xhc3MsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChQcm9wZXJ0aWVzSGVscGVyLmdldFZhbHVlKHByb3BlcnRpZXMsIFJ1bnRpbWVUeXBlLlNFUlZFUiwga2V5LCBTdHJpbmcuY2xhc3MsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI1NSIsIFByb3BlcnRpZXNIZWxwZXIuZ2V0VmFsdWUocHJvcGVydGllcywga2V5LCAiNTUiLCBTdHJpbmcuY2xhc3MsIG51bGwpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGVyZSBpcyBhIHZhbHVlIGJ1dCBvZiBkaWZmZXJlbnQgdHlwZSBhbmQgbm8gd2F5IGhvdyB0byB0cmFuc2Zvcm0uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVOb1RyYW5zZm9ybWF0aW9uKCkgeworICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBrZXkgPSAibXkucHJvcGVydHkiOworICAgICAgICBwcm9wZXJ0aWVzLnB1dChrZXksIEJvb2xlYW4uVFJVRSk7CisKKyAgICAgICAgYXNzZXJ0TnVsbChQcm9wZXJ0aWVzSGVscGVyLmdldFZhbHVlKHByb3BlcnRpZXMsIGtleSwgSW50ZWdlci5jbGFzcywgbnVsbCkpOworICAgICAgICAvL2xvb2sgYXQgU3lzdGVtLm91dCwgdGhlcmUgaXMgYSBtZXNzYWdlOgorICAgICAgICAvLyAgICAgIFdBUk5JTkc6IFRoZXJlIGlzIG5vIHdheSBob3cgdG8gdHJhbnNmb3JtIHZhbHVlICJ0cnVlIiBbamF2YS5sYW5nLkJvb2xlYW5dIHRvIHR5cGUgW2phdmEubGFuZy5JbnRlZ2VyXS4KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGYWxsYmFjaygpIHsKKyAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBmYWxsYmFjayA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgZmFsbGJhY2sucHV0KCJteS5wcm9wZXJ0eSIsICJteS5vbGQucHJvcGVydHkiKTsKKworICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIHByb3BlcnRpZXMucHV0KCJteS5vbGQucHJvcGVydHkiLCAiZm9vIik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCBQcm9wZXJ0aWVzSGVscGVyLmdldFZhbHVlKHByb3BlcnRpZXMsICJteS5wcm9wZXJ0eSIsIFN0cmluZy5jbGFzcywgZmFsbGJhY2spKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0eU5hbWVEZWNsaW5hdGlvbigpIHsKKyAgICAgICAgU3RyaW5nIG15UHJvcGVydHkgPSAiamVyc2V5LmNvbmZpZy5teS5wcm9wZXJ0eSI7CisgICAgICAgIFN0cmluZyBteUNsaWVudFByb3BlcnR5ID0gImplcnNleS5jb25maWcuY2xpZW50Lm15LnByb3BlcnR5IjsKKyAgICAgICAgU3RyaW5nIG15U2VydmVyUHJvcGVydHkgPSAiamVyc2V5LmNvbmZpZy5zZXJ2ZXIubXkucHJvcGVydHkiOworICAgICAgICBTdHJpbmcgbXlOb25KZXJzZXlQcm9wZXJ0eSA9ICJteS5wcm9wZXJ0eSI7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG15UHJvcGVydHksIFByb3BlcnRpZXNIZWxwZXIuZ2V0UHJvcGVydHlOYW1lRm9yUnVudGltZShteVByb3BlcnR5LCBudWxsKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG15Q2xpZW50UHJvcGVydHksIFByb3BlcnRpZXNIZWxwZXIuZ2V0UHJvcGVydHlOYW1lRm9yUnVudGltZShteVByb3BlcnR5LCBSdW50aW1lVHlwZS5DTElFTlQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG15U2VydmVyUHJvcGVydHksIFByb3BlcnRpZXNIZWxwZXIuZ2V0UHJvcGVydHlOYW1lRm9yUnVudGltZShteVByb3BlcnR5LCBSdW50aW1lVHlwZS5TRVJWRVIpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMobXlTZXJ2ZXJQcm9wZXJ0eSwgUHJvcGVydGllc0hlbHBlci5nZXRQcm9wZXJ0eU5hbWVGb3JSdW50aW1lKG15U2VydmVyUHJvcGVydHksIFJ1bnRpbWVUeXBlLlNFUlZFUikpOworICAgICAgICBhc3NlcnRFcXVhbHMobXlTZXJ2ZXJQcm9wZXJ0eSwgUHJvcGVydGllc0hlbHBlci5nZXRQcm9wZXJ0eU5hbWVGb3JSdW50aW1lKG15U2VydmVyUHJvcGVydHksIFJ1bnRpbWVUeXBlLkNMSUVOVCkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhteUNsaWVudFByb3BlcnR5LCBQcm9wZXJ0aWVzSGVscGVyLmdldFByb3BlcnR5TmFtZUZvclJ1bnRpbWUobXlDbGllbnRQcm9wZXJ0eSwgUnVudGltZVR5cGUuU0VSVkVSKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhteUNsaWVudFByb3BlcnR5LCBQcm9wZXJ0aWVzSGVscGVyLmdldFByb3BlcnR5TmFtZUZvclJ1bnRpbWUobXlDbGllbnRQcm9wZXJ0eSwgUnVudGltZVR5cGUuQ0xJRU5UKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG15Tm9uSmVyc2V5UHJvcGVydHksIFByb3BlcnRpZXNIZWxwZXIuZ2V0UHJvcGVydHlOYW1lRm9yUnVudGltZShteU5vbkplcnNleVByb3BlcnR5LCBSdW50aW1lVHlwZS5DTElFTlQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG15Tm9uSmVyc2V5UHJvcGVydHksIFByb3BlcnRpZXNIZWxwZXIuZ2V0UHJvcGVydHlOYW1lRm9yUnVudGltZShteU5vbkplcnNleVByb3BlcnR5LCBSdW50aW1lVHlwZS5DTElFTlQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG15Tm9uSmVyc2V5UHJvcGVydHksIFByb3BlcnRpZXNIZWxwZXIuZ2V0UHJvcGVydHlOYW1lRm9yUnVudGltZShteU5vbkplcnNleVByb3BlcnR5LCBudWxsKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvUmVmbGVjdGlvbkhlbHBlclRlc3QuamF2YSBiL2NvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9SZWZsZWN0aW9uSGVscGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMzU4ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvUmVmbGVjdGlvbkhlbHBlclRlc3QuamF2YQpAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5udWxsVmFsdWU7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICoge0Bjb2RlIFJlZmxlY3Rpb25IZWxwZXJ9IHVuaXQgdGVzdHMuCisgKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCitwdWJsaWMgY2xhc3MgUmVmbGVjdGlvbkhlbHBlclRlc3QgeworCisgICAgQFN1cHByZXNzV2FybmluZ3MoIlVudXNlZERlY2xhcmF0aW9uIikKKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBJPFQ+IHsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEE8VD4gaW1wbGVtZW50cyBJPFQ+IHsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3ROb0ludGVyZmFjZSBleHRlbmRzIEE8Ynl0ZVtdPiB7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0SW50ZXJmYWNlIGV4dGVuZHMgQTxieXRlW10+IGltcGxlbWVudHMgSTxieXRlW10+IHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZWUgSkVSU0VZLTE1OTguCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBnZXRQYXJhbWV0ZXJpemVkQ2xhc3NBcmd1bWVudHNUZXN0KCkgeworICAgICAgICBSZWZsZWN0aW9uSGVscGVyLkRlY2xhcmluZ0NsYXNzSW50ZXJmYWNlUGFpciBkY2lwID0gUmVmbGVjdGlvbkhlbHBlci5nZXRDbGFzcyhUZXN0Tm9JbnRlcmZhY2UuY2xhc3MsIEkuY2xhc3MpOworICAgICAgICBDbGFzc1tdIGFyZ3VtZW50cyA9IFJlZmxlY3Rpb25IZWxwZXIuZ2V0UGFyYW1ldGVyaXplZENsYXNzQXJndW1lbnRzKGRjaXApOworICAgICAgICBmaW5hbCBDbGFzcyBhQ2xhc3MgPSBhcmd1bWVudHNbMF07CisKKyAgICAgICAgZGNpcCA9IFJlZmxlY3Rpb25IZWxwZXIuZ2V0Q2xhc3MoVGVzdEludGVyZmFjZS5jbGFzcywgSS5jbGFzcyk7CisgICAgICAgIGFyZ3VtZW50cyA9IFJlZmxlY3Rpb25IZWxwZXIuZ2V0UGFyYW1ldGVyaXplZENsYXNzQXJndW1lbnRzKGRjaXApOworICAgICAgICBhc3NlcnRFcXVhbHMoYUNsYXNzLCBhcmd1bWVudHNbMF0pOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gQWNjZXNzQ29udHJvbEV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCBzZWN1cml0eU1hbmFnZXJTZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ2xhc3NMb2FkZXIgbG9hZGVyID0gUmVmbGVjdGlvbkhlbHBlci5jbGFzcy5nZXRDbGFzc0xvYWRlcigpOworCisgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKGxvYWRlcik7CisgICAgICAgIGZhaWwoIkl0IHNob3VsZCBub3QgYmUgcG9zc2libGUgdG8gc2V0IGNvbnRleHQgY2xhc3MgbG9hZGVyIGZyb20gdW5wcml2aWxlZ2VkIGJsb2NrIik7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBBY2Nlc3NDb250cm9sRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHNlY3VyaXR5TWFuYWdlclNldENvbnRleHRDbGFzc0xvYWRlclBBKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENsYXNzTG9hZGVyIGxvYWRlciA9IFJlZmxlY3Rpb25IZWxwZXIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsKKworICAgICAgICBSZWZsZWN0aW9uSGVscGVyLnNldENvbnRleHRDbGFzc0xvYWRlclBBKGxvYWRlcikucnVuKCk7CisgICAgICAgIGZhaWwoIkl0IHNob3VsZCBub3QgYmUgcG9zc2libGUgdG8gc2V0IGNvbnRleHQgY2xhc3MgbG9hZGVyIGZyb20gdW5wcml2aWxlZ2VkIGJsb2NrIGV2ZW4gdmlhIEplcnNleSBSZWZsZWN0aW9uSGVscGVyIik7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBBY2Nlc3NDb250cm9sRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHNlY3VyaXR5TWFuYWdlclNldENvbnRleHRDbGFzc0xvYWRlckluRG9Qcml2aWxlZ2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENsYXNzTG9hZGVyIGxvYWRlciA9IFJlZmxlY3Rpb25IZWxwZXIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsKKworICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChSZWZsZWN0aW9uSGVscGVyLnNldENvbnRleHRDbGFzc0xvYWRlclBBKGxvYWRlcikpOworICAgICAgICBmYWlsKCJJdCBzaG91bGQgbm90IGJlIHBvc3NpYmxlIHRvIHNldCBjb250ZXh0IGNsYXNzIGxvYWRlciBldmVuIGZyb20gcHJpdmlsZWdlZCBibG9jayB2aWEgSmVyc2V5IFJlZmxlY3Rpb25IZWxwZXIgIgorICAgICAgICAgICAgICAgICsgInV0aWxpdHkiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZyb21TdHJpbmdDbGFzcyB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdmFsdWU7CisKKyAgICAgICAgcHVibGljIEZyb21TdHJpbmdDbGFzcyhmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRnJvbVN0cmluZ0NsYXNzIHZhbHVlT2YoZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEZyb21TdHJpbmdDbGFzcyh2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIEZyb21TdHJpbmdDbGFzcyBmcm9tU3RyaW5nKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBGcm9tU3RyaW5nQ2xhc3ModmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbnZhbGlkRnJvbVN0cmluZ0NsYXNzIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB2YWx1ZTsKKworICAgICAgICBwdWJsaWMgSW52YWxpZEZyb21TdHJpbmdDbGFzcyhmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQm9vbGVhbiB2YWx1ZU9mKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJTaG91bGQgbm90IGJlIGludm9rZWQiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQm9vbGVhbiBmcm9tU3RyaW5nKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJTaG91bGQgbm90IGJlIGludm9rZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJvZHVjZXIgZm9yIEpFUlNFWS0yODAxLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFZhbHVlT2ZTdHJpbmdNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUHJpdmlsZWdlZEFjdGlvbjxNZXRob2Q+IG1ldGhvZFBBID0gUmVmbGVjdGlvbkhlbHBlci5nZXRWYWx1ZU9mU3RyaW5nTWV0aG9kUEEoRnJvbVN0cmluZ0NsYXNzLmNsYXNzKTsKKyAgICAgICAgZmluYWwgRnJvbVN0cmluZ0NsYXNzIHZhbHVlID0gKEZyb21TdHJpbmdDbGFzcykgbWV0aG9kUEEucnVuKCkuaW52b2tlKG51bGwsICJ2YWx1ZSIpOworCisgICAgICAgIGFzc2VydFRoYXQoIkluY29ycmVjdCBpbnN0YW5jZSBvZiBGcm9tU3RyaW5nQ2xhc3MgY3JlYXRlZC4iLCB2YWx1ZS52YWx1ZSwgaXMoInZhbHVlIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5lZ2F0aXZlIHJlcHJvZHVjZXIgZm9yIEpFUlNFWS0yODAxLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFZhbHVlT2ZTdHJpbmdNZXRob2ROZWdhdGl2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBQcml2aWxlZ2VkQWN0aW9uPE1ldGhvZD4gbWV0aG9kUEEgPSBSZWZsZWN0aW9uSGVscGVyLmdldFZhbHVlT2ZTdHJpbmdNZXRob2RQQShJbnZhbGlkRnJvbVN0cmluZ0NsYXNzLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRUaGF0KCJJbnZhbGlkIHZhbHVlT2YgbWV0aG9kIGZvdW5kLiIsIG1ldGhvZFBBLnJ1bigpLCBudWxsVmFsdWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcm9kdWNlciBmb3IgSkVSU0VZLTI4MDEuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RnJvbVN0cmluZ1N0cmluZ01ldGhvZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBQcml2aWxlZ2VkQWN0aW9uPE1ldGhvZD4gbWV0aG9kUEEgPSBSZWZsZWN0aW9uSGVscGVyLmdldEZyb21TdHJpbmdTdHJpbmdNZXRob2RQQShGcm9tU3RyaW5nQ2xhc3MuY2xhc3MpOworICAgICAgICBmaW5hbCBGcm9tU3RyaW5nQ2xhc3MgdmFsdWUgPSAoRnJvbVN0cmluZ0NsYXNzKSBtZXRob2RQQS5ydW4oKS5pbnZva2UobnVsbCwgInZhbHVlIik7CisKKyAgICAgICAgYXNzZXJ0VGhhdCgiSW5jb3JyZWN0IGluc3RhbmNlIG9mIEZyb21TdHJpbmdDbGFzcyBjcmVhdGVkLiIsIHZhbHVlLnZhbHVlLCBpcygidmFsdWUiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTmVnYXRpdmUgcmVwcm9kdWNlciBmb3IgSkVSU0VZLTI4MDEuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RnJvbVN0cmluZ1N0cmluZ01ldGhvZE5lZ2F0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFByaXZpbGVnZWRBY3Rpb248TWV0aG9kPiBtZXRob2RQQSA9IFJlZmxlY3Rpb25IZWxwZXIuZ2V0RnJvbVN0cmluZ1N0cmluZ01ldGhvZFBBKEludmFsaWRGcm9tU3RyaW5nQ2xhc3MuY2xhc3MpOworCisgICAgICAgIGFzc2VydFRoYXQoIkludmFsaWQgdmFsdWVPZiBtZXRob2QgZm91bmQuIiwgbWV0aG9kUEEucnVuKCksIG51bGxWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIElzR2V0dGVyVGVzdGVyIHsKKworICAgICAgICBwdWJsaWMgaW50IGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXMoKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0U29tZXRoaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1NvbWV0aGluZygpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNHZXR0ZXJXaXRoR2V0T25seU5lZ2F0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFRoYXQoImlzR2V0dGVyIHNob3VsZCBoYXZlIHJldHVybmVkIGZhbHNlIGZvciBtZXRob2QgbmFtZWQgJ2dldCciLAorICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25IZWxwZXIuaXNHZXR0ZXIoSXNHZXR0ZXJUZXN0ZXIuY2xhc3MuZ2V0TWV0aG9kKCJnZXQiKSksIGlzKGZhbHNlKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNHZXR0ZXJXaXRoSXNPbmx5TmVnYXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0VGhhdCgiaXNHZXR0ZXIgc2hvdWxkIGhhdmUgcmV0dXJuZWQgZmFsc2UgZm9yIG1ldGhvZCBuYW1lZCAnaXMnIiwKKyAgICAgICAgICAgICAgICBSZWZsZWN0aW9uSGVscGVyLmlzR2V0dGVyKElzR2V0dGVyVGVzdGVyLmNsYXNzLmdldE1ldGhvZCgiaXMiKSksIGlzKGZhbHNlKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNHZXR0ZXJXaXRoUmVhbEdldHRlclBvc2l0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFRoYXQoImlzR2V0dGVyIHNob3VsZCBoYXZlIHJldHVybmVkIHRydWUgZm9yIG1ldGhvZCBuYW1lZCAnZ2V0U29tZXRoaW5nJyIsCisgICAgICAgICAgICAgICAgUmVmbGVjdGlvbkhlbHBlci5pc0dldHRlcihJc0dldHRlclRlc3Rlci5jbGFzcy5nZXRNZXRob2QoImdldFNvbWV0aGluZyIpKSwgaXModHJ1ZSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElzR2V0dGVyV2l0aFJlYWxJc1Bvc2l0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFRoYXQoImlzR2V0dGVyIHNob3VsZCBoYXZlIHJldHVybmVkIHRydWUgZm9yIG1ldGhvZCBuYW1lZCAnaXNTb21ldGhpbmcnIiwKKyAgICAgICAgICAgICAgICBSZWZsZWN0aW9uSGVscGVyLmlzR2V0dGVyKElzR2V0dGVyVGVzdGVyLmNsYXNzLmdldE1ldGhvZCgiaXNTb21ldGhpbmciKSksIGlzKHRydWUpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvVG9rZW5pemVyVGVzdC5qYXZhIGIvY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL1Rva2VuaXplclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDc0NmI0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL1Rva2VuaXplclRlc3QuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWw7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRBcnJheUVxdWFsczsKKworLyoqCisgKiBUb2tlbml6ZXIgdXRpbGl0eSB1bml0IHRlc3QuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFRva2VuaXplclRlc3QgeworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRva2VuaXplQXJyYXlDb21tb25EZWxpbWl0ZXJzKCkgeworICAgICAgICBmaW5hbCBTdHJpbmdbXSBleHBlY3RlZCA9IG5ldyBTdHJpbmdbXSB7ImFiIiwgImMiLCAiZCJ9OworICAgICAgICBmaW5hbCBTdHJpbmdbXSBpbnB1dCA9IG5ldyBTdHJpbmdbXSB7ImFiIGMiLCAiIiwgbnVsbCwgIiAgZCJ9OworCisgICAgICAgIGZpbmFsIFN0cmluZ1tdIGFjdHVhbCA9IFRva2VuaXplci50b2tlbml6ZShpbnB1dCk7CisKKyAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9rZW5pemVBcnJheUN1c3RvbURlbGltaXRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nW10gZXhwZWN0ZWQgPSBuZXcgU3RyaW5nW10geyJhYiIsICJjIiwgImQifTsKKyAgICAgICAgZmluYWwgU3RyaW5nW10gaW5wdXQgPSBuZXcgU3RyaW5nW10geyJhYmtjIiwgImsiLCBudWxsLCAiIGsgZCJ9OworCisgICAgICAgIGZpbmFsIFN0cmluZ1tdIGFjdHVhbCA9IFRva2VuaXplci50b2tlbml6ZShpbnB1dCwgImsiKTsKKworICAgICAgICBhc3NlcnRBcnJheUVxdWFscyhleHBlY3RlZCwgYWN0dWFsKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUb2tlbml6ZUNvbW1vbkRlbGltaXRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nW10gZXhwZWN0ZWQgPSBuZXcgU3RyaW5nW10geyJhYiIsICJjIiwgImQifTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGlucHV0ID0gImFiIGMgIGQiOworCisgICAgICAgIGZpbmFsIFN0cmluZ1tdIGFjdHVhbCA9IFRva2VuaXplci50b2tlbml6ZShpbnB1dCk7CisKKyAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9rZW5pemVDdXN0b21EZWxpbWl0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZ1tdIGV4cGVjdGVkID0gbmV3IFN0cmluZ1tdIHsiYWIiLCAiYyIsICJkIn07CisgICAgICAgIGZpbmFsIFN0cmluZyBpbnB1dCA9ICJhYmtja2tkIjsKKworICAgICAgICBmaW5hbCBTdHJpbmdbXSBhY3R1YWwgPSBUb2tlbml6ZXIudG9rZW5pemUoaW5wdXQsICJrIik7CisKKyAgICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvY29sbGVjdGlvbi9BYnN0cmFjdEtleUNvbXBhcmF0b3JIYXNoTWFwVGVzdC5qYXZhIGIvY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL2NvbGxlY3Rpb24vQWJzdHJhY3RLZXlDb21wYXJhdG9ySGFzaE1hcFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTAwOGRkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL2NvbGxlY3Rpb24vQWJzdHJhY3RLZXlDb21wYXJhdG9ySGFzaE1hcFRlc3QuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbjsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworCisvKioKKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEtleUNvbXBhcmF0b3JIYXNoTWFwVGVzdCB7CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBfdGVzdChLZXlDb21wYXJhdG9ySGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gaykgeworICAgICAgICBhc3NlcnROdWxsKGsuZ2V0KG51bGwpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2Uoay5jb250YWluc0tleShudWxsKSk7CisKKyAgICAgICAgay5wdXQoImEiLCAiYSIpOworICAgICAgICBrLnB1dCgiYiIsICJiIik7CisgICAgICAgIGsucHV0KCJjIiwgImMiKTsKKworICAgICAgICBhc3NlcnROdWxsKGsuZ2V0KG51bGwpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgay5nZXQoImEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYiIsIGsuZ2V0KCJiIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoImMiLCBrLmdldCgiYyIpKTsKKworICAgICAgICBrLnB1dChudWxsLCAibnVsbCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm51bGwiLCBrLmdldChudWxsKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIGsuZ2V0KCJhIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoImIiLCBrLmdldCgiYiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjIiwgay5nZXQoImMiKSk7CisKKworICAgICAgICBrLnB1dChudWxsLCAiTlVMTCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk5VTEwiLCBrLmdldChudWxsKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIGsuZ2V0KCJhIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoImIiLCBrLmdldCgiYiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjIiwgay5nZXQoImMiKSk7CisKKyAgICAgICAgay5yZW1vdmUobnVsbCk7CisgICAgICAgIGFzc2VydE51bGwoay5nZXQobnVsbCkpOworICAgICAgICBhc3NlcnRGYWxzZShrLmNvbnRhaW5zS2V5KG51bGwpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgay5nZXQoImEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYiIsIGsuZ2V0KCJiIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoImMiLCBrLmdldCgiYyIpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9jb2xsZWN0aW9uL0J5dGVCdWZmZXJJbnB1dFN0cmVhbVRlc3QuamF2YSBiL2NvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9jb2xsZWN0aW9uL0J5dGVCdWZmZXJJbnB1dFN0cmVhbVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDViYzI4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL2NvbGxlY3Rpb24vQnl0ZUJ1ZmZlcklucHV0U3RyZWFtVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTkyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuUmFuZG9tOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2VtYXBob3JlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICoge0BsaW5rIEJ5dGVCdWZmZXJJbnB1dFN0cmVhbX0gdW5pdCB0ZXN0cy4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQnl0ZUJ1ZmZlcklucHV0U3RyZWFtVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCbG9ja2luZ1JlYWRBQnl0ZUVtcHR5U3RyZWFtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEJ5dGVCdWZmZXJJbnB1dFN0cmVhbSBiYmlzID0gbmV3IEJ5dGVCdWZmZXJJbnB1dFN0cmVhbSgpOworICAgICAgICBiYmlzLmNsb3NlUXVldWUoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBiYmlzLnJlYWQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uQmxvY2tpbmdSZWFkQUJ5dGVFbXB0eVN0cmVhbSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBCeXRlQnVmZmVySW5wdXRTdHJlYW0gYmJpcyA9IG5ldyBCeXRlQnVmZmVySW5wdXRTdHJlYW0oKTsKKyAgICAgICAgYmJpcy5jbG9zZVF1ZXVlKCk7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgYmJpcy50cnlSZWFkKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJsb2NraW5nUmVhZEJ5dGVBcnJheUVtcHR5U3RyZWFtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEJ5dGVCdWZmZXJJbnB1dFN0cmVhbSBiYmlzID0gbmV3IEJ5dGVCdWZmZXJJbnB1dFN0cmVhbSgpOworICAgICAgICBiYmlzLmNsb3NlUXVldWUoKTsKKyAgICAgICAgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzEwMjRdOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIGJiaXMucmVhZChidWYpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb25CbG9ja2luZ1JlYWRCeXRlQXJyYXlFbXB0eVN0cmVhbSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBCeXRlQnVmZmVySW5wdXRTdHJlYW0gYmJpcyA9IG5ldyBCeXRlQnVmZmVySW5wdXRTdHJlYW0oKTsKKyAgICAgICAgYmJpcy5jbG9zZVF1ZXVlKCk7CisgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsxMDI0XTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBiYmlzLnRyeVJlYWQoYnVmKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmxvY2tpbmdSZWFkQnl0ZUFycmF5RnJvbUZpbmlzaGVkRXhhY3RMZW5ndGhTdHJlYW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQnl0ZUJ1ZmZlcklucHV0U3RyZWFtIGJiaXMgPSBuZXcgQnl0ZUJ1ZmZlcklucHV0U3RyZWFtKCk7CisgICAgICAgIGJ5dGVbXSBzb3VyY2VEYXRhID0gbmV3IGJ5dGVbMTAyNF07CisgICAgICAgIG5ldyBSYW5kb20oKS5uZXh0Qnl0ZXMoc291cmNlRGF0YSk7CisgICAgICAgIEJ5dGVCdWZmZXIgYnl0ZUJ1ZiA9IEJ5dGVCdWZmZXIud3JhcChzb3VyY2VEYXRhKTsKKyAgICAgICAgYmJpcy5wdXQoYnl0ZUJ1Zik7CisgICAgICAgIGJiaXMuY2xvc2VRdWV1ZSgpOworICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbMTAyNF07CisgICAgICAgIGFzc2VydEVxdWFscygxMDI0LCBiYmlzLnJlYWQoYnVmKSk7CisgICAgICAgIC8vIG5vIG1vcmUgZGF0YSB0byByZWFkOyBzbyBpdCBzaG91bGQgcmV0dXJuIC0xCisgICAgICAgIGFzc2VydEVxdWFscygtMSwgYmJpcy5yZWFkKGJ1ZikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vbkJsb2NraW5nUmVhZEJ5dGVBcnJheUZyb21GaW5pc2hlZEV4YWN0TGVuZ3RoU3RyZWFtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEJ5dGVCdWZmZXJJbnB1dFN0cmVhbSBiYmlzID0gbmV3IEJ5dGVCdWZmZXJJbnB1dFN0cmVhbSgpOworICAgICAgICBieXRlW10gc291cmNlRGF0YSA9IG5ldyBieXRlWzEwMjRdOworICAgICAgICBuZXcgUmFuZG9tKCkubmV4dEJ5dGVzKHNvdXJjZURhdGEpOworICAgICAgICBCeXRlQnVmZmVyIGJ5dGVCdWYgPSBCeXRlQnVmZmVyLndyYXAoc291cmNlRGF0YSk7CisgICAgICAgIGJiaXMucHV0KGJ5dGVCdWYpOworICAgICAgICBieXRlW10gYnVmID0gbmV3IGJ5dGVbMTAyNF07CisgICAgICAgIGFzc2VydEVxdWFscygxMDI0LCBiYmlzLnRyeVJlYWQoYnVmKSk7CisgICAgICAgIC8vIHRoZSBxdWV1ZSBoYXMgbm90IGJlZW4gY2xvc2U7IHNvIGl0IHNob3VsZCByZXR1cm4gMAorICAgICAgICBhc3NlcnRFcXVhbHMoMCwgYmJpcy50cnlSZWFkKGJ1ZikpOworICAgICAgICBiYmlzLmNsb3NlUXVldWUoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCbG9ja2luZ1JlYWRCeXRlQXJyYXlGcm9tVW5maW5pc2hlZEV4YWN0TGVuZ3RoU3RyZWFtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEJ5dGVCdWZmZXJJbnB1dFN0cmVhbSBiYmlzID0gbmV3IEJ5dGVCdWZmZXJJbnB1dFN0cmVhbSgpOworICAgICAgICBieXRlW10gc291cmNlRGF0YSA9IG5ldyBieXRlWzEwMjRdOworICAgICAgICBuZXcgUmFuZG9tKCkubmV4dEJ5dGVzKHNvdXJjZURhdGEpOworICAgICAgICBCeXRlQnVmZmVyIGJ5dGVCdWYgPSBCeXRlQnVmZmVyLndyYXAoc291cmNlRGF0YSk7CisgICAgICAgIGJiaXMucHV0KGJ5dGVCdWYpOworICAgICAgICBmaW5hbCBieXRlW10gYnVmID0gbmV3IGJ5dGVbMTAyNF07CisgICAgICAgIGFzc2VydEVxdWFscygxMDI0LCBiYmlzLnJlYWQoYnVmKSk7CisgICAgICAgIGZpbmFsIEF0b21pY0Jvb2xlYW4gY2xvc2VkID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOworICAgICAgICBmaW5hbCBTZW1hcGhvcmUgcyA9IG5ldyBTZW1hcGhvcmUoMSk7CisgICAgICAgIHMuYWNxdWlyZSgpOworICAgICAgICBUaHJlYWQgdCA9IG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaXQgc2hvdWxkIHJldHVybiAtMSBzaW5jZSB0aGVyZSBpcyBubyBtb3JlIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBiYmlzLnJlYWQoYnVmKSk7CisgICAgICAgICAgICAgICAgICAgIC8vIGl0IHNob3VsZCBvbmx5IHJlYWNoIGhlcmUgaWYgdGhlIHN0cmVhbSBoYXMgYmVlbiBjbG9zZWQKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjbG9zZWQuZ2V0KCkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBzLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgIFRocmVhZC5zbGVlcCg1MDApOworICAgICAgICBjbG9zZWQuc2V0KHRydWUpOworICAgICAgICBiYmlzLmNsb3NlUXVldWUoKTsKKyAgICAgICAgLy8gd2FpdCB1bnRpbCB0aGUgam9iIGlzIGRvbmUKKyAgICAgICAgcy5hY3F1aXJlKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uQmxvY2tpbmdSZWFkQnl0ZUFycmF5RnJvbVVuZmluaXNoZWRFeGFjdExlbmd0aFN0cmVhbSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBCeXRlQnVmZmVySW5wdXRTdHJlYW0gYmJpcyA9IG5ldyBCeXRlQnVmZmVySW5wdXRTdHJlYW0oKTsKKyAgICAgICAgYnl0ZVtdIHNvdXJjZURhdGEgPSBuZXcgYnl0ZVsxMDI0XTsKKyAgICAgICAgbmV3IFJhbmRvbSgpLm5leHRCeXRlcyhzb3VyY2VEYXRhKTsKKyAgICAgICAgQnl0ZUJ1ZmZlciBieXRlQnVmID0gQnl0ZUJ1ZmZlci53cmFwKHNvdXJjZURhdGEpOworICAgICAgICBiYmlzLnB1dChieXRlQnVmKTsKKyAgICAgICAgYmJpcy5jbG9zZVF1ZXVlKCk7CisgICAgICAgIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsxMDI0XTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEwMjQsIGJiaXMudHJ5UmVhZChidWYpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBiYmlzLnRyeVJlYWQoYnVmKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3Igbm9uIGJsb2NraW5nIHNpbmdsZS1ieXRlIHJlYWQgb2YgdGhlIHN0cmVhbS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGluIGNhc2Ugb2YgZXJyb3IuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uQmxvY2tpbmdSZWFkU2luZ2xlQnl0ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBpbnQgUk9VTkRTID0gMTAwMDsKKyAgICAgICAgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gNzY5OworICAgICAgICBmaW5hbCBCeXRlQnVmZmVySW5wdXRTdHJlYW0gYmJpcyA9IG5ldyBCeXRlQnVmZmVySW5wdXRTdHJlYW0oKTsKKworICAgICAgICBmaW5hbCBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3IgPSBFeGVjdXRvcnMubmV3U2luZ2xlVGhyZWFkRXhlY3V0b3IoKTsKKyAgICAgICAgZXhlY3V0b3Iuc3VibWl0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUk9VTkRTOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEJ5dGVCdWZmZXIgZGF0YSA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoQlVGRkVSX1NJWkUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaXNJbnRlcnJ1cHRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJHb3QgaW50ZXJydXB0ZWQuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5jbGVhcigpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBkYXRhLmNhcGFjaXR5KCk7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEucHV0KChieXRlKSAoaSAmIDB4RkYpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZmxpcCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFiYmlzLnB1dChkYXRhKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUGlwZSBzaW5rIGNsb3NlZCBiZWZvcmUgd3JpdGluZyBhbGwgdGhlIGRhdGEuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEpOyAvLyBHaXZlIHRoZSBvdGhlciB0aHJlYWQgYSBjaGFuY2UgdG8gcnVuLgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGJiaXMuY2xvc2VRdWV1ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgIGludCBqID0gMDsKKyAgICAgICAgICAgIGludCBjOworICAgICAgICAgICAgd2hpbGUgKChjID0gYmJpcy50cnlSZWFkKCkpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gSW50ZWdlci5NSU5fVkFMVUUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZyB0byByZWFkCisgICAgICAgICAgICAgICAgICAgIFRocmVhZC55aWVsZCgpOyAvLyBHaXZlIHRoZSBvdGhlciB0aHJlYWQgYSBjaGFuY2UgdG8gcnVuLgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJBdCBwb3NpdGlvbjogIiArIGosIChieXRlKSAoaSAmIDB4RkYpLCAoYnl0ZSkgKGMgJiAweEZGKSk7CisgICAgICAgICAgICAgICAgaWYgKCsraiAlIEJVRkZFUl9TSVpFID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICBUaHJlYWQueWllbGQoKTsgLy8gR2l2ZSB0aGUgb3RoZXIgdGhyZWFkIGEgY2hhbmNlIHRvIHJ1bi4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiTnVtYmVyIG9mIGJ5dGVzIHByb2R1Y2VkIGFuZCBieXRlcyByZWFkIGRvZXMgbm90IG1hdGNoLiIsIFJPVU5EUyAqIEJVRkZFUl9TSVpFLCBqKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGV4ZWN1dG9yLnNodXRkb3duTm93KCk7CisgICAgICAgICAgICBiYmlzLmNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWV4ZWN1dG9yLmF3YWl0VGVybWluYXRpb24oNSwgVGltZVVuaXQuU0VDT05EUykpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV2FpdGluZyBmb3IgdGhlIHRhc2sgdG8gZmluaXNoIGhhcyB0aW1lZCBvdXQuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciBub24gYmxvY2tpbmcgYnl0ZSBidWZmZXIgYmFzZWQgcmVhZCBvZiB0aGUgc3RyZWFtLgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24gaW4gY2FzZSBvZiBlcnJvci4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb25CbG9ja2luZ1JlYWRCeXRlQXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgaW50IFJPVU5EUyA9IDEwMDA7CisgICAgICAgIGZpbmFsIGludCBCVUZGRVJfU0laRSA9IDc2OTsKKyAgICAgICAgZmluYWwgQnl0ZUJ1ZmZlcklucHV0U3RyZWFtIGJiaXMgPSBuZXcgQnl0ZUJ1ZmZlcklucHV0U3RyZWFtKCk7CisKKyAgICAgICAgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yKCk7CisgICAgICAgIGV4ZWN1dG9yLnN1Ym1pdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFJPVU5EUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBCeXRlQnVmZmVyIGRhdGEgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKEJVRkZFUl9TSVpFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChUaHJlYWQuY3VycmVudFRocmVhZCgpLmlzSW50ZXJydXB0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiR290IGludGVycnVwdGVkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZGF0YS5jYXBhY2l0eSgpOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnB1dCgoYnl0ZSkgKGkgJiAweEZGKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZsaXAoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYmJpcy5wdXQoZGF0YSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlBpcGUgc2luayBjbG9zZWQgYmVmb3JlIHdyaXRpbmcgYWxsIHRoZSBkYXRhLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxKTsgLy8gR2l2ZSB0aGUgb3RoZXIgdGhyZWFkIGEgY2hhbmNlIHRvIHJ1bi4KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBiYmlzLmNsb3NlUXVldWUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICBpbnQgaiA9IDA7CisgICAgICAgICAgICBpbnQgYzsKKyAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs0NDNdOworICAgICAgICAgICAgd2hpbGUgKChjID0gYmJpcy50cnlSZWFkKGJ1ZmZlcikpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgaWYgKGMgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIHJlYWQKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnlpZWxkKCk7IC8vIEdpdmUgdGhlIG90aGVyIHRocmVhZCBhIGNoYW5jZSB0byBydW4uCisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGludCBwID0gMDsgcCA8IGM7IHArKykgeworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkF0IHBvc2l0aW9uOiAiICsgaiwgKGJ5dGUpIChpICYgMHhGRiksIChieXRlKSBidWZmZXJbcF0pOworICAgICAgICAgICAgICAgICAgICBpZiAoKytqICUgQlVGRkVSX1NJWkUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnlpZWxkKCk7IC8vIEdpdmUgdGhlIG90aGVyIHRocmVhZCBhIGNoYW5jZSB0byBydW4uCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiTnVtYmVyIG9mIGJ5dGVzIHByb2R1Y2VkIGFuZCBieXRlcyByZWFkIGRvZXMgbm90IG1hdGNoLiIsIFJPVU5EUyAqIEJVRkZFUl9TSVpFLCBqKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGV4ZWN1dG9yLnNodXRkb3duTm93KCk7CisgICAgICAgICAgICBiYmlzLmNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWV4ZWN1dG9yLmF3YWl0VGVybWluYXRpb24oNSwgVGltZVVuaXQuU0VDT05EUykpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV2FpdGluZyBmb3IgdGhlIHRhc2sgdG8gZmluaXNoIGhhcyB0aW1lZCBvdXQuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciBibG9ja2luZyBzaW5nbGUtYnl0ZSByZWFkIG9mIHRoZSBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGVycm9yLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJsb2NraW5nUmVhZFNpbmdsZUJ5dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgaW50IFJPVU5EUyA9IDEwMDA7CisgICAgICAgIGZpbmFsIGludCBCVUZGRVJfU0laRSA9IDc2OTsKKyAgICAgICAgZmluYWwgQnl0ZUJ1ZmZlcklucHV0U3RyZWFtIGJiaXMgPSBuZXcgQnl0ZUJ1ZmZlcklucHV0U3RyZWFtKCk7CisKKyAgICAgICAgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yKCk7CisgICAgICAgIGV4ZWN1dG9yLnN1Ym1pdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFJPVU5EUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBCeXRlQnVmZmVyIGRhdGEgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKEJVRkZFUl9TSVpFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChUaHJlYWQuY3VycmVudFRocmVhZCgpLmlzSW50ZXJydXB0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiR290IGludGVycnVwdGVkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZGF0YS5jYXBhY2l0eSgpOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnB1dCgoYnl0ZSkgKGkgJiAweEZGKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZsaXAoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYmJpcy5wdXQoZGF0YSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlBpcGUgc2luayBjbG9zZWQgYmVmb3JlIHdyaXRpbmcgYWxsIHRoZSBkYXRhLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxKTsgLy8gR2l2ZSB0aGUgb3RoZXIgdGhyZWFkIGEgY2hhbmNlIHRvIHJ1bi4KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBiYmlzLmNsb3NlUXVldWUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICBpbnQgaiA9IDA7CisgICAgICAgICAgICBpbnQgYzsKKyAgICAgICAgICAgIHdoaWxlICgoYyA9IGJiaXMucmVhZCgpKSAhPSAtMSkgeworICAgICAgICAgICAgICAgIGFzc2VydE5vdEVxdWFscygiU2hvdWxkIG5vdCByZWFkICdub3RoaW5nJyBpbiBibG9ja2luZyBtb2RlLiIsIEludGVnZXIuTUlOX1ZBTFVFLCBjKTsKKworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiQXQgcG9zaXRpb246ICIgKyBqLCAoYnl0ZSkgKGkgJiAweEZGKSwgKGJ5dGUpIGMpOworICAgICAgICAgICAgICAgIGlmICgrK2ogJSBCVUZGRVJfU0laRSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnlpZWxkKCk7IC8vIEdpdmUgdGhlIG90aGVyIHRocmVhZCBhIGNoYW5jZSB0byBydW4uCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIk51bWJlciBvZiBieXRlcyBwcm9kdWNlZCBhbmQgYnl0ZXMgcmVhZCBkb2VzIG5vdCBtYXRjaC4iLCBST1VORFMgKiBCVUZGRVJfU0laRSwgaik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBleGVjdXRvci5zaHV0ZG93bk5vdygpOworICAgICAgICAgICAgYmJpcy5jbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFleGVjdXRvci5hd2FpdFRlcm1pbmF0aW9uKDUsIFRpbWVVbml0LlNFQ09ORFMpKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIldhaXRpbmcgZm9yIHRoZSB0YXNrIHRvIGZpbmlzaCBoYXMgdGltZWQgb3V0LiIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBmb3IgYmxvY2tpbmcgYnl0ZSBidWZmZXIgYmFzZWQgcmVhZCBvZiB0aGUgc3RyZWFtLgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24gaW4gY2FzZSBvZiBlcnJvci4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCbG9ja2luZ1JlYWRCeXRlQXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgaW50IFJPVU5EUyA9IDEwMDA7CisgICAgICAgIGZpbmFsIGludCBCVUZGRVJfU0laRSA9IDc2OTsKKyAgICAgICAgZmluYWwgQnl0ZUJ1ZmZlcklucHV0U3RyZWFtIGJiaXMgPSBuZXcgQnl0ZUJ1ZmZlcklucHV0U3RyZWFtKCk7CisKKyAgICAgICAgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yKCk7CisgICAgICAgIGV4ZWN1dG9yLnN1Ym1pdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFJPVU5EUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBCeXRlQnVmZmVyIGRhdGEgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKEJVRkZFUl9TSVpFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChUaHJlYWQuY3VycmVudFRocmVhZCgpLmlzSW50ZXJydXB0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiR290IGludGVycnVwdGVkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZGF0YS5jYXBhY2l0eSgpOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnB1dCgoYnl0ZSkgKGkgJiAweEZGKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZsaXAoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYmJpcy5wdXQoZGF0YSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlBpcGUgc2luayBjbG9zZWQgYmVmb3JlIHdyaXRpbmcgYWxsIHRoZSBkYXRhLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxKTsgLy8gR2l2ZSB0aGUgb3RoZXIgdGhyZWFkIGEgY2hhbmNlIHRvIHJ1bi4KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBiYmlzLmNsb3NlUXVldWUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICBpbnQgaiA9IDA7CisgICAgICAgICAgICBpbnQgYzsKKyAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs0NDNdOworICAgICAgICAgICAgd2hpbGUgKChjID0gYmJpcy5yZWFkKGJ1ZmZlcikpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0Tm90RXF1YWxzKCJTaG91bGQgbm90IHJlYWQgMCBieXRlcyBpbiBibG9ja2luZyBtb2RlLiIsIDAsIGMpOworCisgICAgICAgICAgICAgICAgZm9yIChpbnQgcCA9IDA7IHAgPCBjOyBwKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJBdCBwb3NpdGlvbjogIiArIGosIChieXRlKSAoaSAmIDB4RkYpLCBidWZmZXJbcF0pOworICAgICAgICAgICAgICAgICAgICBpZiAoKytqICUgQlVGRkVSX1NJWkUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnlpZWxkKCk7IC8vIEdpdmUgdGhlIG90aGVyIHRocmVhZCBhIGNoYW5jZSB0byBydW4uCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiTnVtYmVyIG9mIGJ5dGVzIHByb2R1Y2VkIGFuZCBieXRlcyByZWFkIGRvZXMgbm90IG1hdGNoLiIsIFJPVU5EUyAqIEJVRkZFUl9TSVpFLCBqKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGV4ZWN1dG9yLnNodXRkb3duTm93KCk7CisgICAgICAgICAgICBiYmlzLmNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWV4ZWN1dG9yLmF3YWl0VGVybWluYXRpb24oNSwgVGltZVVuaXQuU0VDT05EUykpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV2FpdGluZyBmb3IgdGhlIHRhc2sgdG8gZmluaXNoIGhhcyB0aW1lZCBvdXQuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciAgYXZhaWxhYmxlKCkgbWV0aG9kLgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24gaW4gY2FzZSBvZiBlcnJvci4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdmFpbGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gNzY5OworICAgICAgICBmaW5hbCBCeXRlQnVmZmVySW5wdXRTdHJlYW0gYmJpcyA9IG5ldyBCeXRlQnVmZmVySW5wdXRTdHJlYW0oKTsKKworICAgICAgICBCeXRlQnVmZmVyIGRhdGEgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKEJVRkZFUl9TSVpFKTsKKyAgICAgICAgZGF0YS5jbGVhcigpOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGRhdGEuY2FwYWNpdHkoKTsgaisrKSB7CisgICAgICAgICAgICBkYXRhLnB1dCgoYnl0ZSkgJ0EnKTsKKyAgICAgICAgfQorICAgICAgICBkYXRhLmZsaXAoKTsKKyAgICAgICAgYmJpcy5wdXQoZGF0YSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBdmFpbGFibGUgYnl0ZXMiLCBCVUZGRVJfU0laRSwgYmJpcy5hdmFpbGFibGUoKSk7CisKKyAgICAgICAgZGF0YSA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoQlVGRkVSX1NJWkUpOworICAgICAgICBkYXRhLmNsZWFyKCk7CisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZGF0YS5jYXBhY2l0eSgpOyBqKyspIHsKKyAgICAgICAgICAgIGRhdGEucHV0KChieXRlKSAnQicpOworICAgICAgICB9CisgICAgICAgIGRhdGEuZmxpcCgpOworICAgICAgICBiYmlzLnB1dChkYXRhKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIkF2YWlsYWJsZSBieXRlcyIsIDIgKiBCVUZGRVJfU0laRSwgYmJpcy5hdmFpbGFibGUoKSk7CisKKyAgICAgICAgaW50IGMgPSBiYmlzLnJlYWQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJCeXRlIHJlYWQiLCAnQScsIGMpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkF2YWlsYWJsZSBieXRlcyIsIDIgKiBCVUZGRVJfU0laRSAtIDEsIGJiaXMuYXZhaWxhYmxlKCkpOworCisgICAgICAgIGJ5dGVbXSBidWZmID0gbmV3IGJ5dGVbMTk5XTsKKyAgICAgICAgaW50IGwgPSBiYmlzLnJlYWQoYnVmZik7CisgICAgICAgIGFzc2VydEVxdWFscygiTnVtYmVyIG9mIGJ5dGVzIHJlYWQiLCBidWZmLmxlbmd0aCwgbCk7CisgICAgICAgIGFzc2VydEVxdWFscygiQXZhaWxhYmxlIGJ5dGVzIiwgMiAqIEJVRkZFUl9TSVpFIC0gMjAwLCBiYmlzLmF2YWlsYWJsZSgpKTsKKworICAgICAgICBidWZmID0gbmV3IGJ5dGVbMTAwMF07CisgICAgICAgIGwgPSBiYmlzLnJlYWQoYnVmZik7CisgICAgICAgIGFzc2VydEVxdWFscygiTnVtYmVyIG9mIGJ5dGVzIHJlYWQiLCBidWZmLmxlbmd0aCwgbCk7CisgICAgICAgIGFzc2VydEVxdWFscygiQXZhaWxhYmxlIGJ5dGVzIiwgMiAqIEJVRkZFUl9TSVpFIC0gMTIwMCwgYmJpcy5hdmFpbGFibGUoKSk7CisKKyAgICAgICAgYmJpcy5jbG9zZVF1ZXVlKCk7CisKKyAgICAgICAgbCA9IGJiaXMucmVhZChidWZmKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJOdW1iZXIgb2YgYnl0ZXMgcmVhZCIsIDIgKiBCVUZGRVJfU0laRSAtIDEyMDAsIGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkF2YWlsYWJsZSBieXRlcyIsIDAsIGJiaXMuYXZhaWxhYmxlKCkpOworCisgICAgICAgIGJiaXMuY2xvc2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZvciAgYXZhaWxhYmxlKCkgbWV0aG9kLgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24gaW4gY2FzZSBvZiBlcnJvci4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZVdpdGhUaHJvd2FibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gNzY5OworICAgICAgICBCeXRlQnVmZmVyIGRhdGEgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKEJVRkZFUl9TSVpFKTsKKyAgICAgICAgZGF0YS5jbGVhcigpOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGRhdGEuY2FwYWNpdHkoKTsgaisrKSB7CisgICAgICAgICAgICBkYXRhLnB1dCgoYnl0ZSkgJ0EnKTsKKyAgICAgICAgfQorICAgICAgICBkYXRhLmZsaXAoKTsKKworICAgICAgICAvLyBmaXJzdCBpbnZvY2F0aW9uIG9mIGF2YWlsYWJsZSBzaG91bGQgZmFpbCB3aXRoIGV4Y2VwdGlvbiwgYnV0IG5vdCBzdWJzZXF1ZW50bHkgZHVlIHRvIGNsb3NlZCBzdHJlYW0KKyAgICAgICAgdGVzdEFjdGlvbihuZXcgVGFzayhjcmVhdGVDbG9zZWRFeGNlcHRpb25TdHJlYW0oZGF0YSwgIkZBSUxFRCIpKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgYmJpcygpLmF2YWlsYWJsZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9LCAiRkFJTEVEIiwgZmFsc2UpOworCisgICAgICAgIC8vIGZpcnN0IGludm9jYXRpb24gb2YgcmVhZCBzaG91bGQgZmFpbCB3aXRoIGV4Y2VwdGlvbiwgYW5kIHN1YnNlcXVlbnRseSBkdWUgdG8gY2xvc2VkIHN0cmVhbQorICAgICAgICB0ZXN0QWN0aW9uKG5ldyBUYXNrKGNyZWF0ZUNsb3NlZEV4Y2VwdGlvblN0cmVhbShkYXRhLCAiRkFJTEVEIikpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBiYmlzKCkucmVhZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9LCAiRkFJTEVEIiwgdHJ1ZSk7CisKKyAgICAgICAgLy8gZmlyc3QgaW52b2NhdGlvbiBvZiByZWFkIHNob3VsZCBmYWlsIHdpdGggZXhjZXB0aW9uLCBhbmQgc3Vic2VxdWVudGx5IGR1ZSB0byBjbG9zZWQgc3RyZWFtCisgICAgICAgIHRlc3RBY3Rpb24obmV3IFRhc2soY3JlYXRlQ2xvc2VkRXhjZXB0aW9uU3RyZWFtKGRhdGEsICJGQUlMRUQiKSkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIGJiaXMoKS5yZWFkKG5ldyBieXRlWzEwXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sICJGQUlMRUQiLCB0cnVlKTsKKworICAgICAgICAvLyBmaXJzdCBpbnZvY2F0aW9uIG9mIHRyeVJlYWQgc2hvdWxkIGZhaWwgd2l0aCBleGNlcHRpb24sIGFuZCBzdWJzZXF1ZW50bHkgZHVlIHRvIGNsb3NlZCBzdHJlYW0KKyAgICAgICAgdGVzdEFjdGlvbihuZXcgVGFzayhjcmVhdGVDbG9zZWRFeGNlcHRpb25TdHJlYW0oZGF0YSwgIkZBSUxFRCIpKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgYmJpcygpLnRyeVJlYWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwgIkZBSUxFRCIsIHRydWUpOworCisgICAgICAgIC8vIGZpcnN0IGludm9jYXRpb24gb2YgdHJ5UmVhZCBzaG91bGQgZmFpbCB3aXRoIGV4Y2VwdGlvbiwgYW5kIHN1YnNlcXVlbnRseSBkdWUgdG8gY2xvc2VkIHN0cmVhbQorICAgICAgICB0ZXN0QWN0aW9uKG5ldyBUYXNrKGNyZWF0ZUNsb3NlZEV4Y2VwdGlvblN0cmVhbShkYXRhLCAiRkFJTEVEIikpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBiYmlzKCkudHJ5UmVhZChuZXcgYnl0ZVsxMF0pOworICAgICAgICAgICAgfQorICAgICAgICB9LCAiRkFJTEVEIiwgdHJ1ZSk7CisKKyAgICAgICAgLy8gZmlyc3QgaW52b2NhdGlvbiBvZiBjbG9zZSBzaG91bGQgZmFpbCB3aXRoIGV4Y2VwdGlvbiwgYnV0IG5vdCBzdWJzZXF1ZW50bHkgZHVlIGNsb3NlZCBzdHJlYW0KKyAgICAgICAgdGVzdEFjdGlvbihuZXcgVGFzayhjcmVhdGVDbG9zZWRFeGNlcHRpb25TdHJlYW0oZGF0YSwgIkZBSUxFRCIpKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgYmJpcygpLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sICJGQUlMRUQiLCBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBCeXRlQnVmZmVySW5wdXRTdHJlYW0gY3JlYXRlQ2xvc2VkRXhjZXB0aW9uU3RyZWFtKEJ5dGVCdWZmZXIgZGF0YSwgU3RyaW5nIGV4TXNnKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBCeXRlQnVmZmVySW5wdXRTdHJlYW0gYmJpcyA9IG5ldyBCeXRlQnVmZmVySW5wdXRTdHJlYW0oKTsKKyAgICAgICAgYmJpcy5wdXQoZGF0YSk7CisgICAgICAgIGJiaXMuY2xvc2VRdWV1ZShuZXcgRXhjZXB0aW9uKGV4TXNnKSk7CisgICAgICAgIHJldHVybiBiYmlzOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0QWN0aW9uKFRhc2sgdGFzaywgU3RyaW5nIGV4TXNnLCBib29sZWFuIHJldHJ5RmFpbE9uQ2xvc2VkKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGFzay5ydW4oKTsKKyAgICAgICAgICAgIGZhaWwoIklPRXhjZXB0aW9uIGV4cGVjdGVkLiIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiQ3VzdG9tIGV4Y2VwdGlvbiBjYXVzZSIsIGV4LmdldENhdXNlKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJDdXN0b20gZXhjZXB0aW9uIGNhdXNlIG1lc3NhZ2UiLCBleE1zZywgZXguZ2V0Q2F1c2UoKS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJldHJ5RmFpbE9uQ2xvc2VkKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHRhc2sucnVuKCk7CisgICAgICAgICAgICAgICAgZmFpbCgiSU9FeGNlcHRpb24gZXhwZWN0ZWQuIik7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiQ2xvc2VkIElPRXhjZXB0aW9uIG1lc3NhZ2UiLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5JTlBVVF9TVFJFQU1fQ0xPU0VEKCksIGV4LmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0TnVsbCgiQ2xvc2VkIElPRXhjZXB0aW9uIGNhdXNlIiwgZXguZ2V0Q2F1c2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0YXNrLnJ1bigpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwcml2YXRlIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBUYXNrIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIEJ5dGVCdWZmZXJJbnB1dFN0cmVhbSBiYmlzOworCisgICAgICAgIHByb3RlY3RlZCBUYXNrKEJ5dGVCdWZmZXJJbnB1dFN0cmVhbSBiYmlzKSB7CisgICAgICAgICAgICB0aGlzLmJiaXMgPSBiYmlzOworICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGZpbmFsIEJ5dGVCdWZmZXJJbnB1dFN0cmVhbSBiYmlzKCkgeworICAgICAgICAgICAgcmV0dXJuIGJiaXM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBydW4oKSB0aHJvd3MgSU9FeGNlcHRpb247CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL2NvbGxlY3Rpb24vS2V5Q29tcGFyYXRvckhhc2hNYXBUZXN0LmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvY29sbGVjdGlvbi9LZXlDb21wYXJhdG9ySGFzaE1hcFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDcxYzFkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL2NvbGxlY3Rpb24vS2V5Q29tcGFyYXRvckhhc2hNYXBUZXN0LmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb247CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitwdWJsaWMgY2xhc3MgS2V5Q29tcGFyYXRvckhhc2hNYXBUZXN0IGV4dGVuZHMgQWJzdHJhY3RLZXlDb21wYXJhdG9ySGFzaE1hcFRlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TnVsbCgpIHsKKyAgICAgICAgZmluYWwgS2V5Q29tcGFyYXRvckhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGsgPSBuZXcgS2V5Q29tcGFyYXRvckhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KAorICAgICAgICAgICAgICAgIG5ldyBLZXlDb21wYXJhdG9yPFN0cmluZz4oKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhTdHJpbmcgczEsIFN0cmluZyBzMikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMxLmVxdWFscyhzMik7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwdWJsaWMgaW50IGhhc2goU3RyaW5nIHMxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gczEuaGFzaENvZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShTdHJpbmcgczEsIFN0cmluZyBzMikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHMxLmNvbXBhcmVUbyhzMik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICBfdGVzdChrKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvY29sbGVjdGlvbi9LZXlDb21wYXJhdG9yTGlua2VkSGFzaE1hcFRlc3QuamF2YSBiL2NvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9jb2xsZWN0aW9uL0tleUNvbXBhcmF0b3JMaW5rZWRIYXNoTWFwVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MDAwYjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2ludGVybmFsL3V0aWwvY29sbGVjdGlvbi9LZXlDb21wYXJhdG9yTGlua2VkSGFzaE1hcFRlc3QuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqLworcHVibGljIGNsYXNzIEtleUNvbXBhcmF0b3JMaW5rZWRIYXNoTWFwVGVzdCBleHRlbmRzIEFic3RyYWN0S2V5Q29tcGFyYXRvckhhc2hNYXBUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE51bGwoKSB7CisgICAgICAgIGZpbmFsIEtleUNvbXBhcmF0b3JIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBrID0gbmV3IEtleUNvbXBhcmF0b3JMaW5rZWRIYXNoTWFwPFN0cmluZywgU3RyaW5nPigKKyAgICAgICAgICAgICAgICBuZXcgS2V5Q29tcGFyYXRvcjxTdHJpbmc+KCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKFN0cmluZyBzMSwgU3RyaW5nIHMyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gczEuZXF1YWxzKHMyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgaW50IGhhc2goU3RyaW5nIHMxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gczEuaGFzaENvZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgIF90ZXN0KGspOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9jb2xsZWN0aW9uL1ZpZXdzVGVzdC5qYXZhIGIvY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC91dGlsL2NvbGxlY3Rpb24vVmlld3NUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNkNGU1NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW50ZXJuYWwvdXRpbC9jb2xsZWN0aW9uL1ZpZXdzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzI5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFZpZXdzVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFuc2Zvcm1pbmdMaXN0Vmlld1NpemUoKSB7CisgICAgICAgIExpc3Q8U3RyaW5nPiBzdHJpbmdzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIExpc3Q8SW50ZWdlcj4gaW50cyA9IFZpZXdzLmxpc3RWaWV3KHN0cmluZ3MsIEludGVnZXI6OnBhcnNlSW50KTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoc3RyaW5ncy5zaXplKCksIGludHMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGludHMuc2l6ZSgpKTsKKyAgICAgICAgc3RyaW5ncy5hZGQoIjEiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHN0cmluZ3Muc2l6ZSgpLCBpbnRzLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBpbnRzLnNpemUoKSk7CisgICAgICAgIHN0cmluZ3MucmVtb3ZlKCIxIik7CisgICAgICAgIGFzc2VydEVxdWFscyhzdHJpbmdzLnNpemUoKSwgaW50cy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgaW50cy5zaXplKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRyYW5zZm9ybWluZ0xpc3RWaWV3Q29udGVudCgpIHsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHN0cmluZ3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxJbnRlZ2VyPiBpbnRzID0gVmlld3MubGlzdFZpZXcoc3RyaW5ncywgSW50ZWdlcjo6cGFyc2VJbnQpOworCisgICAgICAgIHN0cmluZ3MuYWRkKCIxIik7CisgICAgICAgIHN0cmluZ3MuYWRkKCIyIik7CisgICAgICAgIHN0cmluZ3MuYWRkKCIzIik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxKSwgaW50cy5nZXQoMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDIpLCBpbnRzLmdldCgxKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMyksIGludHMuZ2V0KDIpKTsKKworICAgICAgICBzdHJpbmdzLnJlbW92ZSgiMiIpOworCisgICAgICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMSksIGludHMuZ2V0KDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigzKSwgaW50cy5nZXQoMSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRyYW5zZm9ybWluZ0xpc3RWaWV3UmVtb3ZlKCkgeworICAgICAgICBMaXN0PFN0cmluZz4gc3RyaW5ncyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBMaXN0PEludGVnZXI+IGludHMgPSBWaWV3cy5saXN0VmlldyhzdHJpbmdzLCBJbnRlZ2VyOjpwYXJzZUludCk7CisKKyAgICAgICAgc3RyaW5ncy5hZGQoIjEiKTsKKyAgICAgICAgc3RyaW5ncy5hZGQoIjIiKTsKKyAgICAgICAgc3RyaW5ncy5hZGQoIjMiKTsKKworICAgICAgICBpbnRzLnJlbW92ZShJbnRlZ2VyLnZhbHVlT2YoMSkpOworCisgICAgICAgIGFzc2VydEVxdWFscygyLCBpbnRzLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoMiksIGludHMuZ2V0KDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigzKSwgaW50cy5nZXQoMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjIiLCBzdHJpbmdzLmdldCgwKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMyIsIHN0cmluZ3MuZ2V0KDEpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFuc2Zvcm1pbmdMaXN0Vmlld01vZGlmeUFkZCgpIHsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHN0cmluZ3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxJbnRlZ2VyPiBpbnRzID0gVmlld3MubGlzdFZpZXcoc3RyaW5ncywgSW50ZWdlcjo6cGFyc2VJbnQpOworCisgICAgICAgIHN0cmluZ3MuYWRkKCIxIik7CisgICAgICAgIHN0cmluZ3MuYWRkKCIyIik7CisgICAgICAgIHN0cmluZ3MuYWRkKCIzIik7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludHMuYWRkKDQpOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmYWlsKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleHBlY3RlZC4iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFuc2Zvcm1pbmdMaXN0Vmlld01vZGlmeVNldCgpIHsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHN0cmluZ3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxJbnRlZ2VyPiBpbnRzID0gVmlld3MubGlzdFZpZXcoc3RyaW5ncywgSW50ZWdlcjo6cGFyc2VJbnQpOworCisgICAgICAgIHN0cmluZ3MuYWRkKCIxIik7CisgICAgICAgIHN0cmluZ3MuYWRkKCIyIik7CisgICAgICAgIHN0cmluZ3MuYWRkKCIzIik7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludHMuc2V0KDAsIDQpOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmYWlsKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleHBlY3RlZC4iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFuc2Zvcm1pbmdNYXBWaWV3U2l6ZSgpIHsKKyAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBzdHJpbmdNYXAgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIE1hcDxTdHJpbmcsIEludGVnZXI+IGludE1hcCA9IFZpZXdzLm1hcFZpZXcoc3RyaW5nTWFwLCBJbnRlZ2VyOjpwYXJzZUludCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHN0cmluZ01hcC5zaXplKCksIGludE1hcC5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgaW50TWFwLnNpemUoKSk7CisgICAgICAgIHN0cmluZ01hcC5wdXQoImtleTEiLCAiMSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoc3RyaW5nTWFwLnNpemUoKSwgaW50TWFwLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBpbnRNYXAuc2l6ZSgpKTsKKyAgICAgICAgc3RyaW5nTWFwLnJlbW92ZSgia2V5MSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoc3RyaW5nTWFwLnNpemUoKSwgaW50TWFwLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBpbnRNYXAuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFuc2Zvcm1pbmdNYXBWaWV3Q29udGVudCgpIHsKKyAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBzdHJpbmdNYXAgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIE1hcDxTdHJpbmcsIEludGVnZXI+IGludE1hcCA9IFZpZXdzLm1hcFZpZXcoc3RyaW5nTWFwLCBJbnRlZ2VyOjpwYXJzZUludCk7CisKKyAgICAgICAgc3RyaW5nTWFwLnB1dCgia2V5MSIsICIxIik7CisgICAgICAgIHN0cmluZ01hcC5wdXQoImtleTIiLCAiMiIpOworICAgICAgICBzdHJpbmdNYXAucHV0KCJrZXkzIiwgIjMiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDEpLCBpbnRNYXAuZ2V0KCJrZXkxIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDIpLCBpbnRNYXAuZ2V0KCJrZXkyIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDMpLCBpbnRNYXAuZ2V0KCJrZXkzIikpOworCisgICAgICAgIHN0cmluZ01hcC5yZW1vdmUoImtleTIiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDEpLCBpbnRNYXAuZ2V0KCJrZXkxIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKDMpLCBpbnRNYXAuZ2V0KCJrZXkzIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRyYW5zZm9ybWluZ01hcFZpZXdSZW1vdmUoKSB7CisgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gc3RyaW5nTWFwID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBpbnRNYXAgPSBWaWV3cy5tYXBWaWV3KHN0cmluZ01hcCwgSW50ZWdlcjo6cGFyc2VJbnQpOworCisgICAgICAgIHN0cmluZ01hcC5wdXQoImtleTEiLCAiMSIpOworICAgICAgICBzdHJpbmdNYXAucHV0KCJrZXkyIiwgIjIiKTsKKyAgICAgICAgc3RyaW5nTWFwLnB1dCgia2V5MyIsICIzIik7CisKKyAgICAgICAgaW50TWFwLnJlbW92ZSgia2V5MiIpOworCisgICAgICAgIGFzc2VydEVxdWFscygyLCBpbnRNYXAuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxKSwgaW50TWFwLmdldCgia2V5MSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigzKSwgaW50TWFwLmdldCgia2V5MyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgc3RyaW5nTWFwLmdldCgia2V5MSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIzIiwgc3RyaW5nTWFwLmdldCgia2V5MyIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFuc2Zvcm1pbmdNYXBWaWV3TW9kaWZ5QWRkKCkgeworICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHN0cmluZ01hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgTWFwPFN0cmluZywgSW50ZWdlcj4gaW50TWFwID0gVmlld3MubWFwVmlldyhzdHJpbmdNYXAsIEludGVnZXI6OnBhcnNlSW50KTsKKworICAgICAgICBzdHJpbmdNYXAucHV0KCJrZXkxIiwgIjEiKTsKKyAgICAgICAgc3RyaW5nTWFwLnB1dCgia2V5MiIsICIyIik7CisgICAgICAgIHN0cmluZ01hcC5wdXQoImtleTMiLCAiMyIpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnRNYXAucHV0KCJrZXk0IiwgNCk7CisgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZhaWwoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4cGVjdGVkLiIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRyYW5zZm9ybWluZ01hcFZpZXdNb2RpZnlTZXQoKSB7CisgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gc3RyaW5nTWFwID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBNYXA8U3RyaW5nLCBJbnRlZ2VyPiBpbnRNYXAgPSBWaWV3cy5tYXBWaWV3KHN0cmluZ01hcCwgSW50ZWdlcjo6cGFyc2VJbnQpOworCisgICAgICAgIHN0cmluZ01hcC5wdXQoImtleTEiLCAiMSIpOworICAgICAgICBzdHJpbmdNYXAucHV0KCJrZXkyIiwgIjIiKTsKKyAgICAgICAgc3RyaW5nTWFwLnB1dCgia2V5MyIsICIzIik7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludE1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCkubmV4dCgpLnNldFZhbHVlKDQpOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmYWlsKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleHBlY3RlZC4iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRVbmlvblZpZXdOdWxscygpIHsKKyAgICAgICAgLy8gc2hvdWxkIHBhc3MKKyAgICAgICAgU2V0PE9iamVjdD4gdW5pb24gPSBWaWV3cy5zZXRVbmlvblZpZXcoQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSwgQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSk7CisKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh1bmlvbik7CisKKyAgICAgICAgLy8gc2hvdWxkIGZhaWwKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFZpZXdzLnNldFVuaW9uVmlldyhDb2xsZWN0aW9ucy5lbXB0eVNldCgpLCBudWxsKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQuCisgICAgICAgIH0KKworICAgICAgICAvLyBzaG91bGQgZmFpbAorICAgICAgICB0cnkgeworICAgICAgICAgICAgVmlld3Muc2V0VW5pb25WaWV3KG51bGwsIENvbGxlY3Rpb25zLmVtcHR5U2V0KCkpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZC4KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNldFVuaW9uVmlld01vZGlmeSgpIHsKKyAgICAgICAgSGFzaFNldDxTdHJpbmc+IHNldDEgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgIEhhc2hTZXQ8U3RyaW5nPiBzZXQyID0gbmV3IEhhc2hTZXQ8PigpOworCisgICAgICAgIC8vIHNob3VsZCBwYXNzCisgICAgICAgIFNldDxPYmplY3Q+IHVuaW9uID0gVmlld3Muc2V0VW5pb25WaWV3KHNldDEsIHNldDIpOworCisgICAgICAgIGFzc2VydE5vdE51bGwodW5pb24pOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdW5pb24uc2l6ZSgpKTsKKworICAgICAgICBzZXQxLmFkZCgidGVzdDEiKTsKKyAgICAgICAgc2V0Mi5hZGQoInRlc3QyIik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHVuaW9uLnNpemUoKSk7CisKKyAgICAgICAgc2V0MS5jbGVhcigpOworCisgICAgICAgIGFzc2VydEVxdWFscygxLCB1bmlvbi5zaXplKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNldERpZmZWaWV3TnVsbHMoKSB7CisgICAgICAgIC8vIHNob3VsZCBwYXNzCisgICAgICAgIFNldDxPYmplY3Q+IGRpZmYgPSBWaWV3cy5zZXREaWZmVmlldyhDb2xsZWN0aW9ucy5lbXB0eVNldCgpLCBDb2xsZWN0aW9ucy5lbXB0eVNldCgpKTsKKworICAgICAgICBhc3NlcnROb3ROdWxsKGRpZmYpOworCisgICAgICAgIC8vIHNob3VsZCBmYWlsCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBWaWV3cy5zZXREaWZmVmlldyhDb2xsZWN0aW9ucy5lbXB0eVNldCgpLCBudWxsKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQuCisgICAgICAgIH0KKworICAgICAgICAvLyBzaG91bGQgZmFpbAorICAgICAgICB0cnkgeworICAgICAgICAgICAgVmlld3Muc2V0RGlmZlZpZXcobnVsbCwgQ29sbGVjdGlvbnMuZW1wdHlTZXQoKSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkLgorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0RGlmZlZpZXdNb2RpZnkoKSB7CisgICAgICAgIEhhc2hTZXQ8U3RyaW5nPiBzZXQxID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICBIYXNoU2V0PFN0cmluZz4gc2V0MiA9IG5ldyBIYXNoU2V0PD4oKTsKKworICAgICAgICAvLyBzaG91bGQgcGFzcworICAgICAgICBTZXQ8T2JqZWN0PiBkaWZmID0gVmlld3Muc2V0RGlmZlZpZXcoc2V0MSwgc2V0Mik7CisKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChkaWZmKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGRpZmYuc2l6ZSgpKTsKKworICAgICAgICBzZXQxLmFkZCgidGVzdDEiKTsKKyAgICAgICAgc2V0MS5hZGQoInRlc3QyIik7CisgICAgICAgIHNldDEuYWRkKCJ0ZXN0MyIpOworCisgICAgICAgIHNldDIuYWRkKCJ0ZXN0MyIpOworICAgICAgICBzZXQyLmFkZCgidGVzdDQiKTsKKyAgICAgICAgc2V0Mi5hZGQoInRlc3Q1Iik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGRpZmYuc2l6ZSgpKTsKKworICAgICAgICBzZXQxLmNsZWFyKCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGRpZmYuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXREaWZmVmlld0VtcHR5KCkgeworICAgICAgICBTZXQ8U3RyaW5nPiBzZXQxID0gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKKyAgICAgICAgSGFzaFNldDxTdHJpbmc+IHNldDIgPSBuZXcgSGFzaFNldDw+KCk7CisKKyAgICAgICAgLy8gc2hvdWxkIHBhc3MKKyAgICAgICAgU2V0PE9iamVjdD4gZGlmZiA9IFZpZXdzLnNldERpZmZWaWV3KHNldDEsIHNldDIpOworCisgICAgICAgIGFzc2VydE5vdE51bGwoZGlmZik7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBkaWZmLnNpemUoKSk7CisKKyAgICAgICAgc2V0Mi5hZGQoInRlc3QzIik7CisgICAgICAgIHNldDIuYWRkKCJ0ZXN0NCIpOworICAgICAgICBzZXQyLmFkZCgidGVzdDUiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgZGlmZi5zaXplKCkpOworCisgICAgICAgIHNldDIuY2xlYXIoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgZGlmZi5zaXplKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbG9nZ2luZy9Mb2dnaW5nSW50ZXJjZXB0b3JUZXN0LmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xvZ2dpbmcvTG9nZ2luZ0ludGVyY2VwdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZGViNjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xvZ2dpbmcvTG9nZ2luZ0ludGVyY2VwdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmc7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlLlZlcmJvc2l0eS5IRUFERVJTX09OTFk7CitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmUuVmVyYm9zaXR5LlBBWUxPQURfQU5ZOworaW1wb3J0IHN0YXRpYyBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlLlZlcmJvc2l0eS5QQVlMT0FEX1RFWFQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IHN0YXRpYyBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZS5BUFBMSUNBVElPTl9PQ1RFVF9TVFJFQU1fVFlQRTsKK2ltcG9ydCBzdGF0aWMgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGUuVEVYVF9IVE1MX1RZUEU7CisKKy8qKgorICogQGF1dGhvciBPbmRyZWogS29zYXRrYSAob25kcmVqLmtvc2F0a2EgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIExvZ2dpbmdJbnRlcmNlcHRvclRlc3QgeworCisgICAgLy8KKyAgICAvLyBpc1JlYWRhYmxlCisgICAgLy8KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRhYmxlVHlwZVRlc3RTdWJXaWxkKCkgeworICAgICAgICBhc3NlcnRUcnVlKExvZ2dpbmdJbnRlcmNlcHRvci5pc1JlYWRhYmxlKG5ldyBNZWRpYVR5cGUoInRleHQiLCAiKiIpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZGFibGVUeXBlVGVzdFN1YlNvbWV0aGluZygpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShMb2dnaW5nSW50ZXJjZXB0b3IuaXNSZWFkYWJsZShuZXcgTWVkaWFUeXBlKCJ0ZXh0IiwgInNvbWV0aGluZyIpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZGFibGVUeXBlQXBwU3ViSnNvbigpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShMb2dnaW5nSW50ZXJjZXB0b3IuaXNSZWFkYWJsZShuZXcgTWVkaWFUeXBlKCJhcHBsaWNhdGlvbiIsICJqc29uIikpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkYWJsZVR5cGVBcHBTdWJCaW5hcnkoKSB7CisgICAgICAgIGFzc2VydEZhbHNlKExvZ2dpbmdJbnRlcmNlcHRvci5pc1JlYWRhYmxlKG5ldyBNZWRpYVR5cGUoImFwcGxpY2F0aW9uIiwgIm9jdGV0LXN0cmVhbSIpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZGFibGVUeXBlQXBwU3ViVW5rbm93bigpIHsKKyAgICAgICAgYXNzZXJ0RmFsc2UoTG9nZ2luZ0ludGVyY2VwdG9yLmlzUmVhZGFibGUobmV3IE1lZGlhVHlwZSgiYXBwbGljYXRpb24iLCAidW5rbm93biIpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZGFibGVUeXBlVW5rbm93blN1YlVua25vd24oKSB7CisgICAgICAgIGFzc2VydEZhbHNlKExvZ2dpbmdJbnRlcmNlcHRvci5pc1JlYWRhYmxlKG5ldyBNZWRpYVR5cGUoInVua25vd24iLCAidW5rbm93biIpKSk7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBwcmludEVudGl0eQorICAgIC8vCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJib3NpdHlUZXh0UHJpbnRUZXh0RW50aXR5KCkgeworICAgICAgICBhc3NlcnRUcnVlKExvZ2dpbmdJbnRlcmNlcHRvci5wcmludEVudGl0eShQQVlMT0FEX1RFWFQsIFRFWFRfSFRNTF9UWVBFKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyYm9zaXR5VGV4dFByaW50QmluYXJ5RW50aXR5KCkgeworICAgICAgICBhc3NlcnRGYWxzZShMb2dnaW5nSW50ZXJjZXB0b3IucHJpbnRFbnRpdHkoUEFZTE9BRF9URVhULCBBUFBMSUNBVElPTl9PQ1RFVF9TVFJFQU1fVFlQRSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZlcmJvc2l0eUFueVByaW50VGV4dEVudGl0eSgpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShMb2dnaW5nSW50ZXJjZXB0b3IucHJpbnRFbnRpdHkoUEFZTE9BRF9BTlksIFRFWFRfSFRNTF9UWVBFKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyYm9zaXR5QW55UHJpbnRCaW5hcnlFbnRpdHkoKSB7CisgICAgICAgIGFzc2VydFRydWUoTG9nZ2luZ0ludGVyY2VwdG9yLnByaW50RW50aXR5KFBBWUxPQURfQU5ZLCBBUFBMSUNBVElPTl9PQ1RFVF9TVFJFQU1fVFlQRSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZlcmJvc2l0eUhlYWRlcnNQcmludFRleHRFbnRpdHkoKSB7CisgICAgICAgIGFzc2VydEZhbHNlKExvZ2dpbmdJbnRlcmNlcHRvci5wcmludEVudGl0eShIRUFERVJTX09OTFksIFRFWFRfSFRNTF9UWVBFKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyYm9zaXR5SGVhZGVyc1ByaW50QmluYXJ5RW50aXR5KCkgeworICAgICAgICBhc3NlcnRGYWxzZShMb2dnaW5nSW50ZXJjZXB0b3IucHJpbnRFbnRpdHkoSEVBREVSU19PTkxZLCBBUFBMSUNBVElPTl9PQ1RFVF9TVFJFQU1fVFlQRSkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL0Fic3RyYWN0RW5jb2RpbmdUZXN0LmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvQWJzdHJhY3RFbmNvZGluZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWEzYTk3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL0Fic3RyYWN0RW5jb2RpbmdUZXN0LmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRBcnJheUVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogU3VwZXIgY2xhc3MgZm9yIGVuY29kaW5nIHRlc3RzIC0gY29udGFpbnMgY29udmVuaWVudCB3YXkgb2YgZGVmaW5pbmcgdGhlIHRlc3QgYnkgc2ltcGx5IHByb3ZpZGluZyB0aGUgZW5jb2RpbmcgYW5kCisgKiBkZWNvZGluZyBzdHJlYW1zLgorICoKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitwdWJsaWMgY2xhc3MgQWJzdHJhY3RFbmNvZGluZ1Rlc3QgeworICAgIC8qKgorICAgICAqIE1haW4gdGVzdGluZyBtZXRob2QgdGhhdCBydW5zIHRoZSB0ZXN0IGJhc2VkIG9uIHRoZSBwYXNzZWQgdGVzdCBzcGVjLgorICAgICAqCisgICAgICogQHBhcmFtIHRlc3RTcGVjIFRlc3Qtc3BlY2lmaWMgcm91dGluZXMgKHByb3ZpZGluZyBlbmNvZGluZy9kZWNvZGluZyBzdHJlYW1zKS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIEkvTyBleGNlcHRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgdGVzdChUZXN0U3BlYyB0ZXN0U3BlYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYnl0ZVtdIGVudGl0eSA9ICJIZWxsbyB3b3JsZCEiLmdldEJ5dGVzKCk7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBPdXRwdXRTdHJlYW0gZW5jb2RlZCA9IHRlc3RTcGVjLmdldEVuY29kZWQoYmFvcyk7CisgICAgICAgIGVuY29kZWQud3JpdGUoZW50aXR5KTsKKyAgICAgICAgZW5jb2RlZC5jbG9zZSgpOworICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSk7CisgICAgICAgIGJ5dGVbXSByZXN1bHQgPSBuZXcgYnl0ZVtlbnRpdHkubGVuZ3RoXTsKKyAgICAgICAgSW5wdXRTdHJlYW0gZGVjb2RlZCA9IHRlc3RTcGVjLmdldERlY29kZWQoYmFpcyk7CisgICAgICAgIGludCBsZW4gPSBkZWNvZGVkLnJlYWQocmVzdWx0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBkZWNvZGVkLnJlYWQoKSk7CisgICAgICAgIGRlY29kZWQuY2xvc2UoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGVudGl0eS5sZW5ndGgsIGxlbik7CisgICAgICAgIGFzc2VydEFycmF5RXF1YWxzKGVudGl0eSwgcmVzdWx0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnRlcmZhY2UgdGhhdCBhIHRlc3QgdHlwaWNhbGx5IGltcGxlbWVudHMgdXNpbmcgYW4gYW5vbnltb3VzIGNsYXNzIHRvIHByb3ZpZGUgdGhlIHRlc3Qtc3BlY2lmaWMgZnVuY3Rpb25hbGl0eS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGludGVyZmFjZSBUZXN0U3BlYyB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIGVuY29kZWQgc3RyZWFtLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc3RyZWFtIE9yaWdpbmFsIHN0cmVhbS4KKyAgICAgICAgICogQHJldHVybiBFbmNvZGVkIHN0cmVhbS4KKyAgICAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBJL08gZXhjZXB0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgT3V0cHV0U3RyZWFtIGdldEVuY29kZWQoT3V0cHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIGRlY29kZWQgc3RyZWFtLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc3RyZWFtIE9yaWdpbmFsIHN0cmVhbS4KKyAgICAgICAgICogQHJldHVybiBEZWNvZGVkIHN0cmVhbS4KKyAgICAgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBJL08gZXhjZXB0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgSW5wdXRTdHJlYW0gZ2V0RGVjb2RlZChJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvRGVmbGF0ZUVuY29kaW5nVGVzdC5qYXZhIGIvY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL0RlZmxhdGVFbmNvZGluZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDE0ODYxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL0RlZmxhdGVFbmNvZGluZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDIwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLnppcC5EZWZsYXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkRlZmxhdGVyT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC56aXAuSW5mbGF0ZXI7CitpbXBvcnQgamF2YS51dGlsLnppcC5JbmZsYXRlcklucHV0U3RyZWFtOworCitpbXBvcnQgamF2YXgud3MucnMuUnVudGltZVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZTsKKworaW1wb3J0IGphdmF4LmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitwdWJsaWMgY2xhc3MgRGVmbGF0ZUVuY29kaW5nVGVzdCBleHRlbmRzIEFic3RyYWN0RW5jb2RpbmdUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIER1bW15Q29uZmlndXJhdGlvbiBpbXBsZW1lbnRzIENvbmZpZ3VyYXRpb24sIFByb3ZpZGVyPENvbmZpZ3VyYXRpb24+IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXM7CisKKyAgICAgICAgRHVtbXlDb25maWd1cmF0aW9uKGJvb2xlYW4gbm9aTGliKSB7CisgICAgICAgICAgICBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICAgICAgcHJvcGVydGllcy5wdXQoTWVzc2FnZVByb3BlcnRpZXMuREVGTEFURV9XSVRIT1VUX1pMSUIsIG5vWkxpYik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJ1bnRpbWVUeXBlIGdldFJ1bnRpbWVUeXBlKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRQcm9wZXJ0eShTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIHByb3BlcnRpZXMuZ2V0KG5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0UHJvcGVydHlOYW1lcygpIHsKKyAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0aWVzLmtleVNldCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChGZWF0dXJlIGZlYXR1cmUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoQ2xhc3M8PyBleHRlbmRzIEZlYXR1cmU+IGZlYXR1cmVDbGFzcykgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmVnaXN0ZXJlZChPYmplY3QgcHJvdmlkZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlZ2lzdGVyZWQoQ2xhc3M8Pz4gcHJvdmlkZXJDbGFzcykgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRQcm9wZXJ0aWVzKCkgeworICAgICAgICAgICAgcmV0dXJuIHByb3BlcnRpZXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENvbmZpZ3VyYXRpb24gZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE1hcDxDbGFzczw/PiwgSW50ZWdlcj4gZ2V0Q29udHJhY3RzKENsYXNzPD8+IGNvbXBvbmVudENsYXNzKSB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFNldDxPYmplY3Q+IGdldEluc3RhbmNlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5jb2RlWkxpYigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRlc3QobmV3IFRlc3RTcGVjKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldEVuY29kZWQoT3V0cHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERlZmxhdGVFbmNvZGVyKG5ldyBEdW1teUNvbmZpZ3VyYXRpb24oZmFsc2UpKS5lbmNvZGUoImRlZmxhdGUiLCBzdHJlYW0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXREZWNvZGVkKElucHV0U3RyZWFtIHN0cmVhbSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW5mbGF0ZXJJbnB1dFN0cmVhbShzdHJlYW0pOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbmNvZGVOb1pMaWIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0ZXN0KG5ldyBUZXN0U3BlYygpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIE91dHB1dFN0cmVhbSBnZXRFbmNvZGVkKE91dHB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEZWZsYXRlRW5jb2RlcihuZXcgRHVtbXlDb25maWd1cmF0aW9uKHRydWUpKS5lbmNvZGUoImRlZmxhdGUiLCBzdHJlYW0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXREZWNvZGVkKElucHV0U3RyZWFtIHN0cmVhbSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW5mbGF0ZXJJbnB1dFN0cmVhbShzdHJlYW0sIG5ldyBJbmZsYXRlcih0cnVlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlY29kZVpMaWIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0ZXN0KG5ldyBUZXN0U3BlYygpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIE91dHB1dFN0cmVhbSBnZXRFbmNvZGVkKE91dHB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEZWZsYXRlck91dHB1dFN0cmVhbShzdHJlYW0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXREZWNvZGVkKElucHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERlZmxhdGVFbmNvZGVyKG5ldyBEdW1teUNvbmZpZ3VyYXRpb24oZmFsc2UpKS5kZWNvZGUoImRlZmxhdGUiLCBzdHJlYW0pOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZWNvZGVOb1pMaWIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0ZXN0KG5ldyBUZXN0U3BlYygpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIE91dHB1dFN0cmVhbSBnZXRFbmNvZGVkKE91dHB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEZWZsYXRlck91dHB1dFN0cmVhbShzdHJlYW0sIG5ldyBEZWZsYXRlcihEZWZsYXRlci5ERUZBVUxUX0NPTVBSRVNTSU9OLCB0cnVlKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIElucHV0U3RyZWFtIGdldERlY29kZWQoSW5wdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGVmbGF0ZUVuY29kZXIobmV3IER1bW15Q29uZmlndXJhdGlvbihmYWxzZSkpLmRlY29kZSgiZGVmbGF0ZSIsIHN0cmVhbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVuY29kZURlY29kZVpMaWIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0ZXN0KG5ldyBUZXN0U3BlYygpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIE91dHB1dFN0cmVhbSBnZXRFbmNvZGVkKE91dHB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEZWZsYXRlRW5jb2RlcihuZXcgRHVtbXlDb25maWd1cmF0aW9uKGZhbHNlKSkuZW5jb2RlKCJkZWZsYXRlIiwgc3RyZWFtKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0RGVjb2RlZChJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEZWZsYXRlRW5jb2RlcihuZXcgRHVtbXlDb25maWd1cmF0aW9uKGZhbHNlKSkuZGVjb2RlKCJkZWZsYXRlIiwgc3RyZWFtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5jb2RlRGVjb2RlTm9aTGliKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdChuZXcgVGVzdFNwZWMoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0RW5jb2RlZChPdXRwdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGVmbGF0ZUVuY29kZXIobmV3IER1bW15Q29uZmlndXJhdGlvbih0cnVlKSkuZW5jb2RlKCJkZWZsYXRlIiwgc3RyZWFtKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0RGVjb2RlZChJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEZWZsYXRlRW5jb2RlcihuZXcgRHVtbXlDb25maWd1cmF0aW9uKGZhbHNlKSkuZGVjb2RlKCJkZWZsYXRlIiwgc3RyZWFtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL0daaXBFbmNvZGluZ1Rlc3QuamF2YSBiL2NvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9HWmlwRW5jb2RpbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNkODFiYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9HWmlwRW5jb2RpbmdUZXN0LmphdmEKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC56aXAuR1pJUElucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC56aXAuR1pJUE91dHB1dFN0cmVhbTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitwdWJsaWMgY2xhc3MgR1ppcEVuY29kaW5nVGVzdCBleHRlbmRzIEFic3RyYWN0RW5jb2RpbmdUZXN0IHsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbmNvZGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0ZXN0KG5ldyBUZXN0U3BlYygpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIE91dHB1dFN0cmVhbSBnZXRFbmNvZGVkKE91dHB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBHWmlwRW5jb2RlcigpLmVuY29kZSgiZ3ppcCIsIHN0cmVhbSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIElucHV0U3RyZWFtIGdldERlY29kZWQoSW5wdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgR1pJUElucHV0U3RyZWFtKHN0cmVhbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlY29kZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRlc3QobmV3IFRlc3RTcGVjKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldEVuY29kZWQoT3V0cHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEdaSVBPdXRwdXRTdHJlYW0oc3RyZWFtKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0RGVjb2RlZChJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBHWmlwRW5jb2RlcigpLmRlY29kZSgiZ3ppcCIsIHN0cmVhbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVuY29kZURlY29kZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRlc3QobmV3IFRlc3RTcGVjKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldEVuY29kZWQoT3V0cHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEdaaXBFbmNvZGVyKCkuZW5jb2RlKCJnemlwIiwgc3RyZWFtKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0RGVjb2RlZChJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBHWmlwRW5jb2RlcigpLmRlY29kZSgiZ3ppcCIsIHN0cmVhbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9EYXRlUHJvdmlkZXJUZXN0LmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvRGF0ZVByb3ZpZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwN2NhOWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvRGF0ZVByb3ZpZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBEYXRlUHJvdmlkZXJUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZyb21TdHJpbmdab25lSXNHbXQoKSB7CisgICAgICAgIERhdGVQcm92aWRlciBkcCA9IG5ldyBEYXRlUHJvdmlkZXIoKTsKKyAgICAgICAgRGF0ZSBub3cgPSBuZXcgRGF0ZSgpOworICAgICAgICBhc3NlcnRUcnVlKGRwLnRvU3RyaW5nKG5vdykuZW5kc1dpdGgoIkdNVCIpKTsKKyAgICAgICAgRGF0ZSBmcm9tU3RyaW5nID0gZHAuZnJvbVN0cmluZygiVGh1LCAxMSBTZXAgMjAxNCAyMjozMDowNiBDRVNUIik7CisgICAgICAgIFN0cmluZyB0b1N0cmluZyA9IGRwLnRvU3RyaW5nKGZyb21TdHJpbmcpOworICAgICAgICBhc3NlcnRUcnVlKHRvU3RyaW5nLmVuZHNXaXRoKCJHTVQiKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvRm9ybU11bHRpdmFsdWVkTWFwUHJvdmlkZXJUZXN0LmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvRm9ybU11bHRpdmFsdWVkTWFwUHJvdmlkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZiZmE4NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9Gb3JtTXVsdGl2YWx1ZWRNYXBQcm92aWRlclRlc3QuamF2YQpAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRIYXNoTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLkFzc2VydC5hc3NlcnROdWxsOworCisvKioKKyAqIHtAbGluayBGb3JtUHJvdmlkZXJ9IHVuaXQgdGVzdHMKKyAqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworcHVibGljIGNsYXNzIEZvcm1NdWx0aXZhbHVlZE1hcFByb3ZpZGVyVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGb3JtTXVsdGl2YWx1ZWRNYXBQcm92aWRlciBQUk9WSURFUiA9IG5ldyBGb3JtTXVsdGl2YWx1ZWRNYXBQcm92aWRlcigpOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEZvcm1QYXJhbSgpIHsKKyAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCA9IHJlYWRGcm9tKCJuYW1lJmFnZT0yNiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbWFwLnNpemUoKSk7CisKKyAgICAgICAgTGlzdDxTdHJpbmc+IG5hbWVFbnRyeSA9IG1hcC5nZXQoIm5hbWUiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG5hbWVFbnRyeS5zaXplKCkpOworICAgICAgICBhc3NlcnROdWxsKG5hbWVFbnRyeS5nZXQoMCkpOworCisgICAgICAgIExpc3Q8U3RyaW5nPiBhZ2VFbnRyeSA9IG1hcC5nZXQoImFnZSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYWdlRW50cnkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIyNiIsIGFnZUVudHJ5LmdldCgwKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZE11bHRpcGxlU2FtZUZvcm1QYXJhbSgpIHsKKyAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCA9IHJlYWRGcm9tKCJuYW1lJm5hbWU9R2VvcmdlIik7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtYXAuc2l6ZSgpKTsKKworICAgICAgICBMaXN0PFN0cmluZz4gbmFtZUVudHJ5ID0gbWFwLmdldCgibmFtZSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbmFtZUVudHJ5LnNpemUoKSk7CisgICAgICAgIGFzc2VydE51bGwobmFtZUVudHJ5LmdldCgwKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiR2VvcmdlIiwgbmFtZUVudHJ5LmdldCgxKSk7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHJpdmF0ZSBzdGF0aWMgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IHJlYWRGcm9tKFN0cmluZyBib2R5KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYm9keS5nZXRCeXRlcyhTdGFuZGFyZENoYXJzZXRzLlVURl84KSk7CisgICAgICAgICAgICBDbGFzczxNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4+IGNsYXp6ID0KKyAgICAgICAgICAgICAgICAgICAgKENsYXNzPE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPj4pIChDbGFzczw/PikgTXVsdGl2YWx1ZWRIYXNoTWFwLmNsYXNzOworICAgICAgICAgICAgcmV0dXJuIFBST1ZJREVSLnJlYWRGcm9tKGNsYXp6LCBjbGF6eiwgbmV3IEFubm90YXRpb25bXSB7fSwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0ZPUk1fVVJMRU5DT0RFRF9UWVBFLCBudWxsLCBzdHJlYW0pOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBleGNlcHRpb24iLCBlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9Gb3JtUHJvdmlkZXJUZXN0LmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvRm9ybVByb3ZpZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YzU2NzUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvRm9ybVByb3ZpZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Gb3JtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLkFzc2VydC5hc3NlcnROdWxsOworCisvKioKKyAqIHtAbGluayBGb3JtUHJvdmlkZXJ9IHVuaXQgdGVzdHMKKyAqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworcHVibGljIGNsYXNzIEZvcm1Qcm92aWRlclRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRm9ybVByb3ZpZGVyIFBST1ZJREVSID0gbmV3IEZvcm1Qcm92aWRlcigpOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEZvcm1QYXJhbSgpIHsKKyAgICAgICAgRm9ybSBmb3JtID0gcmVhZEZyb20oIm5hbWUmYWdlPTI2Iik7CisgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBtYXAgPSBmb3JtLmFzTWFwKCk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBtYXAuc2l6ZSgpKTsKKworICAgICAgICBMaXN0PFN0cmluZz4gbmFtZUVudHJ5ID0gbWFwLmdldCgibmFtZSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbmFtZUVudHJ5LnNpemUoKSk7CisgICAgICAgIGFzc2VydE51bGwobmFtZUVudHJ5LmdldCgwKSk7CisKKyAgICAgICAgTGlzdDxTdHJpbmc+IGFnZUVudHJ5ID0gbWFwLmdldCgiYWdlIik7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBhZ2VFbnRyeS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjI2IiwgYWdlRW50cnkuZ2V0KDApKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkTXVsdGlwbGVTYW1lRm9ybVBhcmFtKCkgeworICAgICAgICBGb3JtIGZvcm0gPSByZWFkRnJvbSgibmFtZSZuYW1lPUdlb3JnZSIpOworICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gbWFwID0gZm9ybS5hc01hcCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbWFwLnNpemUoKSk7CisKKyAgICAgICAgTGlzdDxTdHJpbmc+IG5hbWVFbnRyeSA9IG1hcC5nZXQoIm5hbWUiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG5hbWVFbnRyeS5zaXplKCkpOworICAgICAgICBhc3NlcnROdWxsKG5hbWVFbnRyeS5nZXQoMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkdlb3JnZSIsIG5hbWVFbnRyeS5nZXQoMSkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEZvcm0gcmVhZEZyb20oU3RyaW5nIGJvZHkpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShib2R5LmdldEJ5dGVzKFN0YW5kYXJkQ2hhcnNldHMuVVRGXzgpKTsKKyAgICAgICAgICAgIHJldHVybiBQUk9WSURFUi5yZWFkRnJvbShGb3JtLmNsYXNzLCBGb3JtLmNsYXNzLCBuZXcgQW5ub3RhdGlvbltdIHt9LAorICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUuQVBQTElDQVRJT05fRk9STV9VUkxFTkNPREVEX1RZUEUsIG51bGwsIHN0cmVhbSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmV4cGVjdGVkIGV4Y2VwdGlvbiIsIGUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL0xhbmd1YWdlVGFnVGVzdC5qYXZhIGIvY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL0xhbmd1YWdlVGFnVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YmU3NjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvTGFuZ3VhZ2VUYWdUZXN0LmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuZXF1YWxUb0lnbm9yaW5nQ2FzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIFRlc3RzIGZvciB7QGxpbmsgTGFuZ3VhZ2VUYWd9IGNsYXNzLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgTGFuZ3VhZ2VUYWdUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExhbmd1YWdlQ291bnRyeSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgiZW4iLCAiZ2IiKTsKKyAgICAgICAgX3Rlc3QoInNrIiwgIlNLIik7CisgICAgICAgIF90ZXN0KCJDWiIsICJjcyIpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RMYW5ndWFnZUNvdW50cnlJbnZhbGlkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJlbiIsICJnYmdiZ2JnYmdiIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGFuZ3VhZ2VSZWdpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoImVzIiwgIjQxOSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVxdWFscygpIHsKKyAgICAgICAgTGFuZ3VhZ2VUYWcgbHQxID0gbmV3IExhbmd1YWdlVGFnKCJlbiIsICJ1cyIpOworICAgICAgICBMYW5ndWFnZVRhZyBsdDIgPSBuZXcgTGFuZ3VhZ2VUYWcoImVuIiwgInVzIik7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShsdDEuZXF1YWxzKGx0MikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vbkVxdWFscygpIHsKKyAgICAgICAgTGFuZ3VhZ2VUYWcgbHQxID0gbmV3IExhbmd1YWdlVGFnKCJlbiIsICJ1cyIpOworICAgICAgICBMYW5ndWFnZVRhZyBsdDIgPSBuZXcgTGFuZ3VhZ2VUYWcoImVuIiwgImdiIik7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UobHQxLmVxdWFscyhsdDIpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3QoZmluYWwgU3RyaW5nIHByaW1hcnksIGZpbmFsIFN0cmluZyBzdWIpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBMYW5ndWFnZVRhZyB0YWcgPSBMYW5ndWFnZVRhZy52YWx1ZU9mKHByaW1hcnkgKyAiLSIgKyBzdWIpOworCisgICAgICAgIGFzc2VydFRoYXQodGFnLmdldFByaW1hcnlUYWcoKSwgZXF1YWxUb0lnbm9yaW5nQ2FzZShwcmltYXJ5KSk7CisgICAgICAgIGFzc2VydFRoYXQodGFnLmdldFN1YlRhZ3MoKSwgZXF1YWxUb0lnbm9yaW5nQ2FzZShzdWIpKTsKKworICAgICAgICBmaW5hbCBMb2NhbGUgbG9jYWxlID0gdGFnLmdldEFzTG9jYWxlKCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChsb2NhbGUuZ2V0TGFuZ3VhZ2UoKSwgZXF1YWxUb0lnbm9yaW5nQ2FzZShwcmltYXJ5KSk7CisgICAgICAgIGFzc2VydFRoYXQobG9jYWxlLmdldENvdW50cnkoKSwgZXF1YWxUb0lnbm9yaW5nQ2FzZShzdWIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvUXVhbGl0eVRlc3QuamF2YSBiL2NvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9RdWFsaXR5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2N2I4NmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvUXVhbGl0eVRlc3QuamF2YQpAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsOworCitpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBRdWFsaXR5IHVuaXQgdGVzdHMuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBRdWFsaXR5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGUgT1JJR0lOQUxfTE9DQUxFID0gTG9jYWxlLmdldERlZmF1bHQoKTsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMobmFtZSA9ICJ7MH0iKQorICAgIHB1YmxpYyBzdGF0aWMgSXRlcmFibGU8T2JqZWN0W10+IGRhdGEoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXVtde3tMb2NhbGUuVVN9LCB7TG9jYWxlLkdFUk1BTll9fSk7CisgICAgfQorCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyKDApCisgICAgcHVibGljIExvY2FsZSBsb2NhbGU7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTG9jYWxlLnNldERlZmF1bHQobG9jYWxlKTsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMb2NhbGUuc2V0RGVmYXVsdChPUklHSU5BTF9MT0NBTEUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZW5oYW5jaW5nIEhUVCBoZWFkZXIgcGFyYW1ldGVyIG1hcCB3aXRoIGEgcXVhbGl0eSBwYXJhbWV0ZXIuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5oYW5jZVdpdGhRdWFsaXR5UGFyYW1ldGVyKCkgeworICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IHJlc3VsdDsKKworICAgICAgICByZXN1bHQgPSBRdWFsaXR5LmVuaGFuY2VXaXRoUXVhbGl0eVBhcmFtZXRlcihudWxsLCAicSIsIDEwMDApOworICAgICAgICBhc3NlcnRUaGF0KHJlc3VsdCwgZXF1YWxUbyhudWxsKSk7CisKKyAgICAgICAgcmVzdWx0ID0gUXVhbGl0eS5lbmhhbmNlV2l0aFF1YWxpdHlQYXJhbWV0ZXIobnVsbCwgInEiLCAyMDApOworICAgICAgICBhc3NlcnRUaGF0KHJlc3VsdCwgZXF1YWxUbyhhc01hcCgicT0wLjIiKSkpOworCisgICAgICAgIHJlc3VsdCA9IFF1YWxpdHkuZW5oYW5jZVdpdGhRdWFsaXR5UGFyYW1ldGVyKG51bGwsICJxIiwgMjIwKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXN1bHQsIGVxdWFsVG8oYXNNYXAoInE9MC4yMiIpKSk7CisKKyAgICAgICAgcmVzdWx0ID0gUXVhbGl0eS5lbmhhbmNlV2l0aFF1YWxpdHlQYXJhbWV0ZXIobnVsbCwgInEiLCAyMjIpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3VsdCwgZXF1YWxUbyhhc01hcCgicT0wLjIyMiIpKSk7CisKKyAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzOworCisgICAgICAgIHBhcmFtZXRlcnMgPSBhc01hcCgiYT1iIik7CisgICAgICAgIHJlc3VsdCA9IFF1YWxpdHkuZW5oYW5jZVdpdGhRdWFsaXR5UGFyYW1ldGVyKHBhcmFtZXRlcnMsICJxIiwgMTAwMCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzdWx0LCBlcXVhbFRvKHBhcmFtZXRlcnMpKTsKKworICAgICAgICByZXN1bHQgPSBRdWFsaXR5LmVuaGFuY2VXaXRoUXVhbGl0eVBhcmFtZXRlcihwYXJhbWV0ZXJzLCAicSIsIDIwMCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzdWx0LCBlcXVhbFRvKGFzTWFwKCJhPWI7cT0wLjIiKSkpOworCisgICAgICAgIHJlc3VsdCA9IFF1YWxpdHkuZW5oYW5jZVdpdGhRdWFsaXR5UGFyYW1ldGVyKHBhcmFtZXRlcnMsICJxIiwgMjIwKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXN1bHQsIGVxdWFsVG8oYXNNYXAoImE9YjtxPTAuMjIiKSkpOworCisgICAgICAgIHJlc3VsdCA9IFF1YWxpdHkuZW5oYW5jZVdpdGhRdWFsaXR5UGFyYW1ldGVyKHBhcmFtZXRlcnMsICJxIiwgMjIyKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXN1bHQsIGVxdWFsVG8oYXNNYXAoImE9YjtxPTAuMjIyIikpKTsKKworICAgICAgICAvLyB0ZXN0IHF1YWxpdHkgcGFyYW1ldGVyIG92ZXJyaWRlCisgICAgICAgIHBhcmFtZXRlcnMgPSBhc01hcCgiYT1iO3E9MC4zIik7CisgICAgICAgIHJlc3VsdCA9IFF1YWxpdHkuZW5oYW5jZVdpdGhRdWFsaXR5UGFyYW1ldGVyKHBhcmFtZXRlcnMsICJxIiwgMTAwMCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzdWx0LCBlcXVhbFRvKGFzTWFwKCJhPWI7cT0xLjAiKSkpOworCisgICAgICAgIHJlc3VsdCA9IFF1YWxpdHkuZW5oYW5jZVdpdGhRdWFsaXR5UGFyYW1ldGVyKHBhcmFtZXRlcnMsICJxIiwgMjAwKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXN1bHQsIGVxdWFsVG8oYXNNYXAoImE9YjtxPTAuMiIpKSk7CisKKyAgICAgICAgcmVzdWx0ID0gUXVhbGl0eS5lbmhhbmNlV2l0aFF1YWxpdHlQYXJhbWV0ZXIocGFyYW1ldGVycywgInEiLCAyMjApOworICAgICAgICBhc3NlcnRUaGF0KHJlc3VsdCwgZXF1YWxUbyhhc01hcCgiYT1iO3E9MC4yMiIpKSk7CisKKyAgICAgICAgcmVzdWx0ID0gUXVhbGl0eS5lbmhhbmNlV2l0aFF1YWxpdHlQYXJhbWV0ZXIocGFyYW1ldGVycywgInEiLCAyMjIpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3VsdCwgZXF1YWxUbyhhc01hcCgiYT1iO3E9MC4yMjIiKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBtYXAgZnJvbSBIVFRQIGhlYWRlciBwYXJhbWV0ZXIgc3RyaW5ncy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIEhUVFAgaGVhZGVyIHBhcmFtZXRlcnMgc3RyaW5nLgorICAgICAqIEByZXR1cm4gSFRUUCBoZWFkZXIgcGFyYW1ldGVycyBtYXAuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGFzTWFwKFN0cmluZyBwYXJhbWV0ZXJzKSB7CisgICAgICAgIEh0dHBIZWFkZXJSZWFkZXIgcmVhZGVyID0gSHR0cEhlYWRlclJlYWRlci5uZXdJbnN0YW5jZSgiOyIgKyBwYXJhbWV0ZXJzKTsKKworICAgICAgICBpZiAocmVhZGVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSHR0cEhlYWRlclJlYWRlci5yZWFkUGFyYW1ldGVycyhyZWFkZXIpOworICAgICAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL1Jlc3BvbnNlVGVzdC5qYXZhIGIvY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ludGVybmFsL1Jlc3BvbnNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhN2U2YmQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvUmVzcG9uc2VUZXN0LmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlLlN0YXR1czsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlLlN0YXR1cy5GYW1pbHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZS5TdGF0dXNUeXBlOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKKworLyoqCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitwdWJsaWMgY2xhc3MgUmVzcG9uc2VUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlY2xhcmVkU3RhdHVzQ29kZXMoKSB7CisgICAgICAgIGZvciAoU3RhdHVzIHMgOiBTdGF0dXMudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIFN0YXR1c1R5cGUgX3MgPSBSZXNwb25zZS5zdGF0dXMocy5nZXRTdGF0dXNDb2RlKCkpLmJ1aWxkKCkuZ2V0U3RhdHVzSW5mbygpOworICAgICAgICAgICAgYXNzZXJ0U2FtZShzLCBfcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVbmRlY2xhcmVkU3RhdHVzQ29kZXMoKSB7CisgICAgICAgIFN0YXR1c1R5cGUgc3QgPSBSZXNwb25zZS5zdGF0dXMoMTk5KS5idWlsZCgpLmdldFN0YXR1c0luZm8oKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChzdCk7CisgICAgICAgIGFzc2VydEVxdWFscygxOTksIHN0LmdldFN0YXR1c0NvZGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgc3QuZ2V0UmVhc29uUGhyYXNlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoRmFtaWx5LklORk9STUFUSU9OQUwsIHN0LmdldEZhbWlseSgpKTsKKworICAgICAgICBzdCA9IFJlc3BvbnNlLnN0YXR1cygyOTkpLmJ1aWxkKCkuZ2V0U3RhdHVzSW5mbygpOworICAgICAgICBhc3NlcnROb3ROdWxsKHN0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDI5OSwgc3QuZ2V0U3RhdHVzQ29kZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBzdC5nZXRSZWFzb25QaHJhc2UoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhGYW1pbHkuU1VDQ0VTU0ZVTCwgc3QuZ2V0RmFtaWx5KCkpOworCisgICAgICAgIHN0ID0gUmVzcG9uc2Uuc3RhdHVzKDM5OSkuYnVpbGQoKS5nZXRTdGF0dXNJbmZvKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoc3QpOworICAgICAgICBhc3NlcnRFcXVhbHMoMzk5LCBzdC5nZXRTdGF0dXNDb2RlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIHN0LmdldFJlYXNvblBocmFzZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEZhbWlseS5SRURJUkVDVElPTiwgc3QuZ2V0RmFtaWx5KCkpOworCisgICAgICAgIHN0ID0gUmVzcG9uc2Uuc3RhdHVzKDQ5OSkuYnVpbGQoKS5nZXRTdGF0dXNJbmZvKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoc3QpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDk5LCBzdC5nZXRTdGF0dXNDb2RlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIHN0LmdldFJlYXNvblBocmFzZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEZhbWlseS5DTElFTlRfRVJST1IsIHN0LmdldEZhbWlseSgpKTsKKworICAgICAgICBzdCA9IFJlc3BvbnNlLnN0YXR1cyg1OTkpLmJ1aWxkKCkuZ2V0U3RhdHVzSW5mbygpOworICAgICAgICBhc3NlcnROb3ROdWxsKHN0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDU5OSwgc3QuZ2V0U3RhdHVzQ29kZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBzdC5nZXRSZWFzb25QaHJhc2UoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhGYW1pbHkuU0VSVkVSX0VSUk9SLCBzdC5nZXRGYW1pbHkoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZWFzb25QaHJhc2VUZXN0KCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IFJlc3BvbnNlLnN0YXR1cygxMjMsICJ0ZXN0IikuYnVpbGQoKTsKKworICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEyMywgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QiLCByZXNwb25zZS5nZXRTdGF0dXNJbmZvKCkuZ2V0UmVhc29uUGhyYXNlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9TdHJpbmdCdWlsZGVyVXRpbHNUZXN0LmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvU3RyaW5nQnVpbGRlclV0aWxzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMTYyN2QKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvU3RyaW5nQnVpbGRlclV0aWxzVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlckNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICoKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitwdWJsaWMgY2xhc3MgU3RyaW5nQnVpbGRlclV0aWxzVGVzdCB7CisKKyAgICBwdWJsaWMgU3RyaW5nQnVpbGRlclV0aWxzVGVzdCgpIHsKKyAgICB9CisKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXBDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworICAgIH0KKworICAgIEBBZnRlckNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHRlYXJEb3duQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBlbmRRdW90ZWRJZk5vblRva2VuKCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgU3RyaW5nQnVpbGRlclV0aWxzLmFwcGVuZFF1b3RlZElmTm9uVG9rZW4oc2IsICJhOmIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJcImE6YlwiIiwgc2IudG9TdHJpbmcoKSk7CisgICAgICAgIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgU3RyaW5nQnVpbGRlclV0aWxzLmFwcGVuZFF1b3RlZElmTm9uVG9rZW4oc2IsICJhYmMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhYmMiLCBzYi50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBlbmRRdW90ZWRJZldoaXRlc3BhY2UoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBTdHJpbmdCdWlsZGVyVXRpbHMuYXBwZW5kUXVvdGVkSWZXaGl0ZXNwYWNlKHNiLCAiYSBiIik7CisgICAgICAgIGFzc2VydEVxdWFscygiXCJhIGJcIiIsIHNiLnRvU3RyaW5nKCkpOworICAgICAgICBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIFN0cmluZ0J1aWxkZXJVdGlscy5hcHBlbmRRdW90ZWRJZldoaXRlc3BhY2Uoc2IsICJhOmIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhOmIiLCBzYi50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBlbmRRdW90ZWQoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBTdHJpbmdCdWlsZGVyVXRpbHMuYXBwZW5kUXVvdGVkKHNiLCAiYWJjIik7CisgICAgICAgIGFzc2VydEVxdWFscygiXCJhYmNcIiIsIHNiLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFwcGVuZEVzY2FwaW5nUXVvdGVzKCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgU3RyaW5nQnVpbGRlclV0aWxzLmFwcGVuZEVzY2FwaW5nUXVvdGVzKHNiLCAiYVwiYiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFcXFwiYiIsIHNiLnRvU3RyaW5nKCkpOworICAgICAgICBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIFN0cmluZ0J1aWxkZXJVdGlscy5hcHBlbmRFc2NhcGluZ1F1b3RlcyhzYiwgImFiYyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFiYyIsIHNiLnRvU3RyaW5nKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9pbnRlcm5hbC9WYXJpYW50TGlzdEJ1aWxkZXJUZXN0LmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvVmFyaWFudExpc3RCdWlsZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NWYyOGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvaW50ZXJuYWwvVmFyaWFudExpc3RCdWlsZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlZhcmlhbnQ7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBUT0RPOiBqYXZhZG9jLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBWYXJpYW50TGlzdEJ1aWxkZXJUZXN0IHsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBZGRBbmROb0FkZEJlZm9yZUJ1aWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFZhcmlhbnQgdjEgPSBuZXcgVmFyaWFudChNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFLCBMb2NhbGUuRU5HTElTSCwgbnVsbCk7CisgICAgICAgIGZpbmFsIFZhcmlhbnQgdjIgPSBuZXcgVmFyaWFudChNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFLCBMb2NhbGUuRlJFTkNILCBudWxsKTsKKyAgICAgICAgZmluYWwgVmFyaWFudCB2MyA9IG5ldyBWYXJpYW50KE1lZGlhVHlwZS5URVhUX0hUTUxfVFlQRSwgTG9jYWxlLkVOR0xJU0gsIG51bGwpOworICAgICAgICBmaW5hbCBWYXJpYW50IHY0ID0gbmV3IFZhcmlhbnQoTWVkaWFUeXBlLlRFWFRfSFRNTF9UWVBFLCBMb2NhbGUuRlJFTkNILCBudWxsKTsKKworICAgICAgICBMaXN0PFZhcmlhbnQ+IHZhcmlhbnRzOworICAgICAgICB2YXJpYW50cyA9IG5ldyBWYXJpYW50TGlzdEJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5tZWRpYVR5cGVzKE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUsIE1lZGlhVHlwZS5URVhUX0hUTUxfVFlQRSkubGFuZ3VhZ2VzKExvY2FsZS5FTkdMSVNILCBMb2NhbGUuRlJFTkNIKQorICAgICAgICAgICAgICAgIC5hZGQoKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgIGFzc2VydEVxdWFscyg0LCB2YXJpYW50cy5zaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKHZhcmlhbnRzLmNvbnRhaW5zKHYxKSk7CisgICAgICAgIGFzc2VydFRydWUodmFyaWFudHMuY29udGFpbnModjIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh2YXJpYW50cy5jb250YWlucyh2MykpOworICAgICAgICBhc3NlcnRUcnVlKHZhcmlhbnRzLmNvbnRhaW5zKHY0KSk7CisKKyAgICAgICAgdmFyaWFudHMgPSBuZXcgVmFyaWFudExpc3RCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAubWVkaWFUeXBlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFLCBNZWRpYVR5cGUuVEVYVF9IVE1MX1RZUEUpLmxhbmd1YWdlcyhMb2NhbGUuRU5HTElTSCwgTG9jYWxlLkZSRU5DSCkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNCwgdmFyaWFudHMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh2YXJpYW50cy5jb250YWlucyh2MSkpOworICAgICAgICBhc3NlcnRUcnVlKHZhcmlhbnRzLmNvbnRhaW5zKHYyKSk7CisgICAgICAgIGFzc2VydFRydWUodmFyaWFudHMuY29udGFpbnModjMpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh2YXJpYW50cy5jb250YWlucyh2NCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvcHJvY2Vzcy9pbnRlcm5hbC9SYW5rZWRDb21wYXJhdG9yVGVzdC5qYXZhIGIvY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9wcm9jZXNzL2ludGVybmFsL1JhbmtlZENvbXBhcmF0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNjZjdiNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvcHJvY2Vzcy9pbnRlcm5hbC9SYW5rZWRDb21wYXJhdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW9kZWwuaW50ZXJuYWwuUmFua2VkQ29tcGFyYXRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb2RlbC5pbnRlcm5hbC5SYW5rZWRQcm92aWRlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogVGVzdHMge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1vZGVsLmludGVybmFsLlJhbmtlZENvbXBhcmF0b3J9LgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICoKKyAqLworcHVibGljIGNsYXNzIFJhbmtlZENvbXBhcmF0b3JUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByaW9yaXR5Q29tcGFyYXRvcigpIHsKKyAgICAgICAgTGlzdDxSYW5rZWRQcm92aWRlcjxPYmplY3Q+PiBsaXN0ID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgICAgICBsaXN0LmFkZChuZXcgUmFua2VkUHJvdmlkZXI8T2JqZWN0PihuZXcgRjEwMDAoKSkpOworICAgICAgICBsaXN0LmFkZChuZXcgUmFua2VkUHJvdmlkZXI8T2JqZWN0PihuZXcgRkYyMDAoKSkpOworICAgICAgICBsaXN0LmFkZChuZXcgUmFua2VkUHJvdmlkZXI8T2JqZWN0PihuZXcgRjAoKSkpOworICAgICAgICBsaXN0LmFkZChuZXcgUmFua2VkUHJvdmlkZXI8T2JqZWN0PihuZXcgRjAoKSkpOworICAgICAgICBsaXN0LmFkZChuZXcgUmFua2VkUHJvdmlkZXI8T2JqZWN0PihuZXcgRjMwMCgpKSk7CisgICAgICAgIGxpc3QuYWRkKG5ldyBSYW5rZWRQcm92aWRlcjxPYmplY3Q+KG5ldyBGMTAwMCgpKSk7CisgICAgICAgIGxpc3QuYWRkKG5ldyBSYW5rZWRQcm92aWRlcjxPYmplY3Q+KG5ldyBGMTAwKCkpKTsKKyAgICAgICAgbGlzdC5hZGQobmV3IFJhbmtlZFByb3ZpZGVyPE9iamVjdD4obmV3IEYyMDAoKSkpOworICAgICAgICBsaXN0LmFkZChuZXcgUmFua2VkUHJvdmlkZXI8T2JqZWN0PihuZXcgRjIwMCgpKSk7CisgICAgICAgIGxpc3QuYWRkKG5ldyBSYW5rZWRQcm92aWRlcjxPYmplY3Q+KG5ldyBGX0lOVF9NSU4oKSkpOworICAgICAgICBsaXN0LmFkZChuZXcgUmFua2VkUHJvdmlkZXI8T2JqZWN0PihuZXcgRl9JTlRfTUFYKCkpKTsKKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChsaXN0LCBuZXcgUmFua2VkQ29tcGFyYXRvcjxPYmplY3Q+KFJhbmtlZENvbXBhcmF0b3IuT3JkZXIuQVNDRU5ESU5HKSk7CisgICAgICAgIGludCBtYXggPSBJbnRlZ2VyLk1JTl9WQUxVRTsKKyAgICAgICAgZm9yIChSYW5rZWRQcm92aWRlcjxPYmplY3Q+IG8gOiBsaXN0KSB7CisgICAgICAgICAgICBpbnQgdmFsID0gby5nZXRSYW5rKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHZhbCA+PSBtYXgpOworICAgICAgICAgICAgbWF4ID0gdmFsOworICAgICAgICB9CisKKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChsaXN0LCBuZXcgUmFua2VkQ29tcGFyYXRvcjxPYmplY3Q+KFJhbmtlZENvbXBhcmF0b3IuT3JkZXIuREVTQ0VORElORykpOworICAgICAgICBtYXggPSBJbnRlZ2VyLk1BWF9WQUxVRTsKKyAgICAgICAgZm9yIChSYW5rZWRQcm92aWRlcjxPYmplY3Q+IG8gOiBsaXN0KSB7CisgICAgICAgICAgICBpbnQgdmFsID0gby5nZXRSYW5rKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHZhbCA8PSBtYXgpOworICAgICAgICAgICAgbWF4ID0gdmFsOworICAgICAgICB9CisgICAgfQorCisgICAgQFByaW9yaXR5KDApCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRjAgeworICAgIH0KKworICAgIEBQcmlvcml0eSgxMDApCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRjEwMCB7CisgICAgfQorCisgICAgQFByaW9yaXR5KDIwMCkKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBGMjAwIHsKKyAgICB9CisKKyAgICBAUHJpb3JpdHkoMjAwKQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEZGMjAwIHsKKyAgICB9CisKKyAgICBAUHJpb3JpdHkoMzAwKQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEYzMDAgeworICAgIH0KKworICAgIEBQcmlvcml0eSgxMDAwKQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEYxMDAwIHsKKyAgICB9CisKKyAgICBAUHJpb3JpdHkoSW50ZWdlci5NSU5fVkFMVUUpCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRl9JTlRfTUlOIHsKKyAgICB9CisKKyAgICBAUHJpb3JpdHkoSW50ZWdlci5NQVhfVkFMVUUpCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRl9JTlRfTUFYIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3VyaS9QYXRoUGF0dGVyblRlc3QuamF2YSBiL2NvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdXJpL1BhdGhQYXR0ZXJuVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YjY2ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3VyaS9QYXRoUGF0dGVyblRlc3QuamF2YQpAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS51cmk7CisKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hSZXN1bHQ7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CisKKy8qKgorICogVGVzdHMge0BsaW5rIFBhdGhUZW1wbGF0ZX0uCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgR2VyYXJkIERhdmlzb24gKGdlcmFyZC5kYXZpc29uIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBQYXRoUGF0dGVyblRlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGVybWluYWxQYXRoUGF0dGVyTWF0Y2hpbmcoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZ1tdIHJvb3RQYXRocyA9IG5ldyBTdHJpbmdbXXsKKyAgICAgICAgICAgICAgICAiL2EvYi9jIiwKKyAgICAgICAgICAgICAgICAiL2EvYi9jLyIKKyAgICAgICAgfTsKKworICAgICAgICBmaW5hbCBTdHJpbmdbXSBzdWJQYXRocyA9IG5ldyBTdHJpbmdbXXsKKyAgICAgICAgICAgICAgICAiZC9lIiwKKyAgICAgICAgICAgICAgICAiZC9lLyIsCisgICAgICAgICAgICAgICAgIi9kL2UiLAorICAgICAgICAgICAgICAgICIvZC9lLyIsCisgICAgICAgIH07CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHBhdGgxID0gIi9hL2IvYyI7CisgICAgICAgIGZpbmFsIFN0cmluZyBwYXRoMiA9ICIvYS9iL2MvIjsKKworICAgICAgICBmaW5hbCBQYXRoUGF0dGVybltdIHBhdHRlcm5zID0gbmV3IFBhdGhQYXR0ZXJuW117CisgICAgICAgICAgICAgICAgbmV3IFBhdGhQYXR0ZXJuKCJhIiksCisgICAgICAgICAgICAgICAgbmV3IFBhdGhQYXR0ZXJuKCJiIiksCisgICAgICAgICAgICAgICAgbmV3IFBhdGhQYXR0ZXJuKCJjIiksCisgICAgICAgICAgICAgICAgbmV3IFBhdGhQYXR0ZXJuKCIiLCBQYXRoUGF0dGVybi5SaWdodEhhbmRQYXRoLmNhcHR1cmluZ1plcm9TZWdtZW50cykKKyAgICAgICAgfTsKKworICAgICAgICBTdHJpbmcgcmhwID0gcGF0aDE7CisgICAgICAgIE1hdGNoUmVzdWx0IG1hdGNoUmVzdWx0OworCisgICAgICAgIGZvciAoUGF0aFBhdHRlcm4gcGF0dGVybiA6IHBhdHRlcm5zKSB7CisgICAgICAgICAgICBtYXRjaFJlc3VsdCA9IHBhdHRlcm4ubWF0Y2gocmhwKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIk5vIG1hdGNoIG9mICIgKyByaHAgKyAiIGZvciBwYXR0ZXJuICIgKyBwYXR0ZXJuLCBtYXRjaFJlc3VsdCk7CisgICAgICAgICAgICByaHAgPSBtYXRjaFJlc3VsdC5ncm91cChtYXRjaFJlc3VsdC5ncm91cENvdW50KCkpOworICAgICAgICAgICAgcmhwID0gKHJocCA9PSBudWxsKSA/ICIiIDogcmhwOworICAgICAgICB9CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiIiwgcmhwKTsKKworICAgICAgICByaHAgPSBwYXRoMjsKKworICAgICAgICBmb3IgKFBhdGhQYXR0ZXJuIHBhdHRlcm4gOiBwYXR0ZXJucykgeworICAgICAgICAgICAgbWF0Y2hSZXN1bHQgPSBwYXR0ZXJuLm1hdGNoKHJocCk7CisgICAgICAgICAgICByaHAgPSBtYXRjaFJlc3VsdC5ncm91cChtYXRjaFJlc3VsdC5ncm91cENvdW50KCkpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvIiwgcmhwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVQYXR0ZXJuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFBhdGhQYXR0ZXJuIHBhdHRlcm4gPSBuZXcgUGF0aFBhdHRlcm4oIi90ZXN0Iik7CisgICAgICAgIGFzc2VydE51bGwocGF0dGVybi5tYXRjaCgiZG9lc24ndCBtYXRjaCIpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwYXR0ZXJuLm1hdGNoKCIvdGVzdC9tZSIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVQYXR0ZXJuV2l0aFJpZ2h0SGFuZFNpZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBQYXRoUGF0dGVybiBwYXR0ZXJuID0gbmV3IFBhdGhQYXR0ZXJuKG5ldyBQYXRoVGVtcGxhdGUoIi90ZXN0L3t0ZW1wbGF0ZTogYWJjLip9IikpOworICAgICAgICBhc3NlcnROdWxsKCJXaHkgbWF0Y2hlZD8iLCBwYXR0ZXJuLm1hdGNoKCIvdGVzdC9tZSIpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiV2h5IG5vdCBtYXRjaGVkPyIsIHBhdHRlcm4ubWF0Y2goIi90ZXN0L2FiYy1zaG91bGRfd29yayIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRzQW5kR2V0c1VyaVRlbXBsYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFBhdGhUZW1wbGF0ZSB0bXBsID0gbmV3IFBhdGhUZW1wbGF0ZSgiL3Rlc3QiKTsKKyAgICAgICAgUGF0aFBhdHRlcm4gcGF0dGVybiA9IG5ldyBQYXRoUGF0dGVybih0bXBsKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICJXZSBqdXN0IGluamVjdGVkIHRoZSB2YWx1ZSwgd2h5IGl0IGlzIGRpZmZlcmVudD8iLAorICAgICAgICAgICAgICAgIHRtcGwsCisgICAgICAgICAgICAgICAgcGF0dGVybi5nZXRUZW1wbGF0ZSgpCisgICAgICAgICk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGFzdEVsZW1lbnRPZk1hdGNoSXNSZXN0T2ZQYXRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFBhdGhQYXR0ZXJuIHBhdGggPSBuZXcgUGF0aFBhdHRlcm4oInthOiAoXFxkKShcXGQqKX0te2I6IChcXGQpKFxcZCopfS17YzogKFxcZCkoXFxkKil9Iik7CisKKworICAgICAgICBNYXRjaFJlc3VsdCBtID0gcGF0aC5tYXRjaCgiLzEyMy00NTYtNzg5L2QiKTsKKyAgICAgICAgU3RyaW5nIHZhbHVlID0gbS5ncm91cChtLmdyb3VwQ291bnQoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICJMYXN0IHZhbHVlIHNob3VsZCBtYXRjaCBhbGwgb2YgdGhlIHRyYWlsaW5nIHBhcnQiLAorICAgICAgICAgICAgICAgICIvZCIsCisgICAgICAgICAgICAgICAgdmFsdWUKKyAgICAgICAgKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3VyaS9VcmlDb21wb25lbnRUZXN0LmphdmEgYi9jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3VyaS9VcmlDb21wb25lbnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY3ZTNlYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdXJpL1VyaUNvbXBvbmVudFRlc3QuamF2YQpAQCAtMCwwICsxLDM4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS51cmk7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5QYXRoU2VnbWVudDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIFVuaXQgdGVzdCBmb3Ige0BsaW5rIFVyaUNvbXBvbmVudH0gY2xhc3MuCisgKiA8cC8+CisgKiBNaWdyYXRlZCBmcm9tIEplcnNleSAxLnggRTJFIHRlc3RzOgorICogPHVsPgorICogPGxpPntAY29kZSBjb20uc3VuLmplcnNleS5pbXBsLnVyaS5yaUNvbXBvbmVudERlY29kZVRlc3R9PC9saT4KKyAqIDxsaT57QGNvZGUgY29tLnN1bi5qZXJzZXkuaW1wbC51cmkucmlDb21wb25lbnRFbmNvZGVUZXN0fTwvbGk+CisgKiA8bGk+e0Bjb2RlIGNvbS5zdW4uamVyc2V5LmltcGwudXJpLnJpQ29tcG9uZW50VmFsaWRhdGVUZXN0fTwvbGk+CisgKiA8L3VsPgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBVcmlDb21wb25lbnRUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE51bGwoKSB7CisgICAgICAgIGRlY29kZUNhdGNoKG51bGwpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5KCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIFVyaUNvbXBvbmVudC5kZWNvZGUoIiIsIG51bGwpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb1BlcmNlbnRFc2NhcGVkT2N0ZXRzKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoInh5eiIsIFVyaUNvbXBvbmVudC5kZWNvZGUoInh5eiIsIG51bGwpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RaZXJvVmFsdWVQZXJjZW50RXNjYXBlZE9jdGV0KCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIlx1MDAwMCIsIFVyaUNvbXBvbmVudC5kZWNvZGUoIiUwMCIsIG51bGwpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBU0NJSVBlcmNlbnRFc2NhcGVkT2N0ZXRzKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIiAiLCBVcmlDb21wb25lbnQuZGVjb2RlKCIlMjAiLCBudWxsKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiICAgIiwgVXJpQ29tcG9uZW50LmRlY29kZSgiJTIwJTIwJTIwIiwgbnVsbCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEgYiBjICIsIFVyaUNvbXBvbmVudC5kZWNvZGUoImElMjBiJTIwYyUyMCIsIG51bGwpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhICBiICBjICAiLCBVcmlDb21wb25lbnQuZGVjb2RlKCJhJTIwJTIwYiUyMCUyMGMlMjAlMjAiLCBudWxsKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIwMTIzNDU2Nzg5IiwgVXJpQ29tcG9uZW50LmRlY29kZSgiJTMwJTMxJTMyJTMzJTM0JTM1JTM2JTM3JTM4JTM5IiwgbnVsbCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjAwMTEyMjMzNDQ1NTY2Nzc4ODk5IiwgVXJpQ29tcG9uZW50LmRlY29kZSgiJTMwMCUzMTElMzIyJTMzMyUzNDQlMzU1JTM2NiUzNzclMzg4JTM5OSIsIG51bGwpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQZXJjZW50VW5pY29kZUVzY2FwZWRPY3RldHMoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiY29weXJpZ2h0XHUwMGE5IiwgVXJpQ29tcG9uZW50LmRlY29kZSgiY29weXJpZ2h0JWMyJWE5IiwgbnVsbCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvcHlyaWdodFx1MDBhOSIsIFVyaUNvbXBvbmVudC5kZWNvZGUoImNvcHlyaWdodCVDMiVBOSIsIG51bGwpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoInRodW1ic3VwXHVkODNkXHVkYzRkIiwgVXJpQ29tcG9uZW50LmRlY29kZSgidGh1bWJzdXAlZjAlOWYlOTElOGQiLCBudWxsKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGh1bWJzdXBcdWQ4M2RcdWRjNGQiLCBVcmlDb21wb25lbnQuZGVjb2RlKCJ0aHVtYnN1cCVGMCU5RiU5MSU4RCIsIG51bGwpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIb3N0KCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIltmZWMwOjphYmNkJTI1MV0iLCBVcmlDb21wb25lbnQuZGVjb2RlKCJbZmVjMDo6YWJjZCUyNTFdIiwgVXJpQ29tcG9uZW50LlR5cGUuSE9TVCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRQZXJjZW50RXNjYXBlZE9jdGV0cygpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkZWNvZGVDYXRjaCgiJSIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkZWNvZGVDYXRjaCgiJTEiKSk7CisgICAgICAgIGFzc2VydFRydWUoZGVjb2RlQ2F0Y2goIiAlMSIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShkZWNvZGVDYXRjaCgiJXoxIikpOworICAgICAgICBhc3NlcnRUcnVlKGRlY29kZUNhdGNoKCIlMXoiKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGRlY29kZUNhdGNoKGZpbmFsIFN0cmluZyBzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBVcmlDb21wb25lbnQuZGVjb2RlKHMsIG51bGwpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGNhdGNoIChmaW5hbCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZWNvZGVQYXRoRW1wdHlTbGFzaCgpIHsKKyAgICAgICAgX3Rlc3REZWNvZGVQYXRoKCIiLCAiIik7CisgICAgICAgIF90ZXN0RGVjb2RlUGF0aCgiLyIsICIiLCAiIik7CisgICAgICAgIF90ZXN0RGVjb2RlUGF0aCgiLy8iLCAiIiwgIiIsICIiKTsKKyAgICAgICAgX3Rlc3REZWNvZGVQYXRoKCIvLy8iLCAiIiwgIiIsICIiLCAiIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjb2RlUGF0aCgpIHsKKyAgICAgICAgX3Rlc3REZWNvZGVQYXRoKCJhIiwgImEiKTsKKyAgICAgICAgX3Rlc3REZWNvZGVQYXRoKCIvYSIsICIiLCAiYSIpOworICAgICAgICBfdGVzdERlY29kZVBhdGgoIi9hLyIsICIiLCAiYSIsICIiKTsKKyAgICAgICAgX3Rlc3REZWNvZGVQYXRoKCIvYS8vIiwgIiIsICJhIiwgIiIsICIiKTsKKyAgICAgICAgX3Rlc3REZWNvZGVQYXRoKCIvYS8vLyIsICIiLCAiYSIsICIiLCAiIiwgIiIpOworCisgICAgICAgIF90ZXN0RGVjb2RlUGF0aCgiYS9iL2MiLCAiYSIsICJiIiwgImMiKTsKKyAgICAgICAgX3Rlc3REZWNvZGVQYXRoKCJhLy9iLy9jLy8iLCAiYSIsICIiLCAiYiIsICIiLCAiYyIsICIiLCAiIik7CisgICAgICAgIF90ZXN0RGVjb2RlUGF0aCgiLy9hLy9iLy9jLy8iLCAiIiwgIiIsICJhIiwgIiIsICJiIiwgIiIsICJjIiwgIiIsICIiKTsKKyAgICAgICAgX3Rlc3REZWNvZGVQYXRoKCIvLy9hLy8vYi8vL2MvLy8iLCAiIiwgIiIsICIiLCAiYSIsICIiLCAiIiwgImIiLCAiIiwgIiIsICJjIiwgIiIsICIiLCAiIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjb2RlVW5pY29kZVBhdGgoKSB7CisgICAgICAgIF90ZXN0RGVjb2RlUGF0aCgiLyVGMCU5RiU5MSU4RC90aHVtYnN1cCIsICIiLCAiXHVkODNkXHVkYzRkIiwgInRodW1ic3VwIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0RGVjb2RlUGF0aChmaW5hbCBTdHJpbmcgcGF0aCwgZmluYWwgU3RyaW5nLi4uIHNlZ21lbnRzKSB7CisgICAgICAgIGZpbmFsIExpc3Q8UGF0aFNlZ21lbnQ+IHBzID0gVXJpQ29tcG9uZW50LmRlY29kZVBhdGgocGF0aCwgdHJ1ZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzZWdtZW50cy5sZW5ndGgsIHBzLnNpemUoKSk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNlZ21lbnRzW2ldLCBwcy5nZXQoaSkuZ2V0UGF0aCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlY29kZVF1ZXJ5KCkgeworICAgICAgICBfdGVzdERlY29kZVF1ZXJ5KCIiKTsKKyAgICAgICAgX3Rlc3REZWNvZGVRdWVyeSgiJiIpOworICAgICAgICBfdGVzdERlY29kZVF1ZXJ5KCI9Iik7CisgICAgICAgIF90ZXN0RGVjb2RlUXVlcnkoIiY9anVuayIpOworICAgICAgICBfdGVzdERlY29kZVF1ZXJ5KCImJiIpOworICAgICAgICBfdGVzdERlY29kZVF1ZXJ5KCJhIiwgImEiLCAiIik7CisgICAgICAgIF90ZXN0RGVjb2RlUXVlcnkoImEmIiwgImEiLCAiIik7CisgICAgICAgIF90ZXN0RGVjb2RlUXVlcnkoIiZhJiIsICJhIiwgIiIpOworICAgICAgICBfdGVzdERlY29kZVF1ZXJ5KCJhJiYiLCAiYSIsICIiKTsKKyAgICAgICAgX3Rlc3REZWNvZGVRdWVyeSgiYT0iLCAiYSIsICIiKTsKKyAgICAgICAgX3Rlc3REZWNvZGVRdWVyeSgiYT0mIiwgImEiLCAiIik7CisgICAgICAgIF90ZXN0RGVjb2RlUXVlcnkoImE9JiYiLCAiYSIsICIiKTsKKyAgICAgICAgX3Rlc3REZWNvZGVRdWVyeSgiYT14IiwgImEiLCAieCIpOworICAgICAgICBfdGVzdERlY29kZVF1ZXJ5KCJhPT14IiwgImEiLCAiPXgiKTsKKyAgICAgICAgX3Rlc3REZWNvZGVRdWVyeSgiYT14JiIsICJhIiwgIngiKTsKKyAgICAgICAgX3Rlc3REZWNvZGVRdWVyeSgiYT14JiYiLCAiYSIsICJ4Iik7CisgICAgICAgIF90ZXN0RGVjb2RlUXVlcnkoImE9eCZiPXkiLCAiYSIsICJ4IiwgImIiLCAieSIpOworICAgICAgICBfdGVzdERlY29kZVF1ZXJ5KCJhPXgmJmI9eSIsICJhIiwgIngiLCAiYiIsICJ5Iik7CisKKyAgICAgICAgX3Rlc3REZWNvZGVRdWVyeSgiK2ErIiwgdHJ1ZSwgIiBhICIsICIiKTsKKyAgICAgICAgX3Rlc3REZWNvZGVRdWVyeSgiK2ErPSIsIHRydWUsICIgYSAiLCAiIik7CisgICAgICAgIF90ZXN0RGVjb2RlUXVlcnkoIithKz0reCsiLCB0cnVlLCAiIGEgIiwgIiB4ICIpOworICAgICAgICBfdGVzdERlY29kZVF1ZXJ5KCIlMjBhJTIwPSUyMHglMjAiLCB0cnVlLCAiIGEgIiwgIiB4ICIpOworCisgICAgICAgIF90ZXN0RGVjb2RlUXVlcnkoIithKyIsIGZhbHNlLCAiIGEgIiwgIiIpOworICAgICAgICBfdGVzdERlY29kZVF1ZXJ5KCIrYSs9IiwgZmFsc2UsICIgYSAiLCAiIik7CisgICAgICAgIF90ZXN0RGVjb2RlUXVlcnkoIithKz0reCsiLCBmYWxzZSwgIiBhICIsICIreCsiKTsKKyAgICAgICAgX3Rlc3REZWNvZGVRdWVyeSgiJTIwYSUyMD0lMjB4JTIwIiwgZmFsc2UsICIgYSAiLCAiJTIweCUyMCIpOworCisgICAgICAgIF90ZXN0RGVjb2RlUXVlcnkoIithKyIsIGZhbHNlLCB0cnVlLCAiK2ErIiwgIiIpOworICAgICAgICBfdGVzdERlY29kZVF1ZXJ5KCIrYSs9IiwgZmFsc2UsIHRydWUsICIrYSsiLCAiIik7CisgICAgICAgIF90ZXN0RGVjb2RlUXVlcnkoIithKz0reCsiLCBmYWxzZSwgdHJ1ZSwgIithKyIsICIgeCAiKTsKKyAgICAgICAgX3Rlc3REZWNvZGVRdWVyeSgiJTIwYSUyMD0lMjB4JTIwIiwgZmFsc2UsIHRydWUsICIlMjBhJTIwIiwgIiB4ICIpOworCisgICAgICAgIF90ZXN0RGVjb2RlUXVlcnkoIithKyIsIGZhbHNlLCBmYWxzZSwgIithKyIsICIiKTsKKyAgICAgICAgX3Rlc3REZWNvZGVRdWVyeSgiK2ErPSIsIGZhbHNlLCBmYWxzZSwgIithKyIsICIiKTsKKyAgICAgICAgX3Rlc3REZWNvZGVRdWVyeSgiK2ErPSt4KyIsIGZhbHNlLCBmYWxzZSwgIithKyIsICIreCsiKTsKKyAgICAgICAgX3Rlc3REZWNvZGVRdWVyeSgiJTIwYSUyMD0lMjB4JTIwIiwgZmFsc2UsIGZhbHNlLCAiJTIwYSUyMCIsICIlMjB4JTIwIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjb2RlVW5pY29kZVF1ZXJ5KCkgeworICAgICAgICBfdGVzdERlY29kZVF1ZXJ5KCIrdGh1bWJzdXAlRjAlOUYlOTElOEQrPStjaGlja2VuJUYwJTlGJTkwJTk0KyIsIHRydWUsICIgdGh1bWJzdXBcdWQ4M2RcdWRjNGQgIiwgIiBjaGlja2VuXHVkODNkXHVkYzE0ICIpOworICAgICAgICBfdGVzdERlY29kZVF1ZXJ5KCIlMjB0aHVtYnN1cCVGMCU5RiU5MSU4RCUyMD0lMjBjaGlja2VuJUYwJTlGJTkwJTk0JTIwIiwgdHJ1ZSwgIiB0aHVtYnN1cFx1ZDgzZFx1ZGM0ZCAiLAorICAgICAgICAgICAgICAgICIgY2hpY2tlblx1ZDgzZFx1ZGMxNCAiKTsKKyAgICAgICAgX3Rlc3REZWNvZGVRdWVyeSgiK3RodW1ic3VwJUYwJTlGJTkxJThEKz0rY2hpY2tlbiVGMCU5RiU5MCU5NCsiLCBmYWxzZSwgIiB0aHVtYnN1cFx1ZDgzZFx1ZGM0ZCAiLAorICAgICAgICAgICAgICAgICIrY2hpY2tlbiVGMCU5RiU5MCU5NCsiKTsKKyAgICAgICAgX3Rlc3REZWNvZGVRdWVyeSgiJTIwdGh1bWJzdXAlRjAlOUYlOTElOEQlMjA9JTIwY2hpY2tlbiVGMCU5RiU5MCU5NCUyMCIsIGZhbHNlLCAiIHRodW1ic3VwXHVkODNkXHVkYzRkICIsCisgICAgICAgICAgICAgICAgIiUyMGNoaWNrZW4lRjAlOUYlOTAlOTQlMjAiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZWNvZGVRdWVyeVBhcmFtKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIiAiLCBVcmlDb21wb25lbnQuZGVjb2RlKCIrIiwgVXJpQ29tcG9uZW50LlR5cGUuUVVFUllfUEFSQU0pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIGIgYyAiLCBVcmlDb21wb25lbnQuZGVjb2RlKCJhK2IrYysiLCBVcmlDb21wb25lbnQuVHlwZS5RVUVSWV9QQVJBTSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiAiLCBVcmlDb21wb25lbnQuZGVjb2RlKCIlMjAiLCBVcmlDb21wb25lbnQuVHlwZS5RVUVSWV9QQVJBTSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEgYiBjICIsIFVyaUNvbXBvbmVudC5kZWNvZGUoImElMjBiJTIwYyUyMCIsIFVyaUNvbXBvbmVudC5UeXBlLlFVRVJZX1BBUkFNKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjb2RlVW5pY29kZVF1ZXJ5UGFyYW0oKSB7CisgICAgICAgIGFzc2VydEVxdWFscygidGh1bWJzdXAgXHVkODNkXHVkYzRkIGNoaWNrZW4gXHVkODNkXHVkYzE0IiwKKyAgICAgICAgICAgICAgICBVcmlDb21wb25lbnQuZGVjb2RlKCJ0aHVtYnN1cCslRjAlOUYlOTElOEQrY2hpY2tlbislRjAlOUYlOTAlOTQiLCBVcmlDb21wb25lbnQuVHlwZS5RVUVSWV9QQVJBTSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlY29kZVF1ZXJ5UGFyYW1TcGFjZUVuY29kZWQoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiKyIsIFVyaUNvbXBvbmVudC5kZWNvZGUoIisiLCBVcmlDb21wb25lbnQuVHlwZS5RVUVSWV9QQVJBTV9TUEFDRV9FTkNPREVEKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYStiK2MrIiwgVXJpQ29tcG9uZW50LmRlY29kZSgiYStiK2MrIiwgVXJpQ29tcG9uZW50LlR5cGUuUVVFUllfUEFSQU1fU1BBQ0VfRU5DT0RFRCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiAiLCBVcmlDb21wb25lbnQuZGVjb2RlKCIlMjAiLCBVcmlDb21wb25lbnQuVHlwZS5RVUVSWV9QQVJBTV9TUEFDRV9FTkNPREVEKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSBiIGMgIiwgVXJpQ29tcG9uZW50LmRlY29kZSgiYSUyMGIlMjBjJTIwIiwgVXJpQ29tcG9uZW50LlR5cGUuUVVFUllfUEFSQU1fU1BBQ0VfRU5DT0RFRCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfdGVzdERlY29kZVF1ZXJ5KGZpbmFsIFN0cmluZyBxLCBmaW5hbCBTdHJpbmcuLi4gcXVlcnkpIHsKKyAgICAgICAgX3Rlc3REZWNvZGVRdWVyeShxLCB0cnVlLCBxdWVyeSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0RGVjb2RlUXVlcnkoZmluYWwgU3RyaW5nIHEsIGZpbmFsIGJvb2xlYW4gZGVjb2RlLCBmaW5hbCBTdHJpbmcuLi4gcXVlcnkpIHsKKyAgICAgICAgX3Rlc3REZWNvZGVRdWVyeShxLCB0cnVlLCBkZWNvZGUsIHF1ZXJ5KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3REZWNvZGVRdWVyeShmaW5hbCBTdHJpbmcgcSwgZmluYWwgYm9vbGVhbiBkZWNvZGVOYW1lcywgZmluYWwgYm9vbGVhbiBkZWNvZGVWYWx1ZXMsIGZpbmFsIFN0cmluZy4uLiBxdWVyeSkgeworICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gcXVlcnlQYXJhbWV0ZXJzID0gVXJpQ29tcG9uZW50LmRlY29kZVF1ZXJ5KHEsIGRlY29kZU5hbWVzLCBkZWNvZGVWYWx1ZXMpOworCisgICAgICAgIGFzc2VydEVxdWFscyhxdWVyeS5sZW5ndGggLyAyLCBxdWVyeVBhcmFtZXRlcnMuc2l6ZSgpKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHF1ZXJ5Lmxlbmd0aDsgaSArPSAyKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocXVlcnlbaSArIDFdLCBxdWVyeVBhcmFtZXRlcnMuZ2V0Rmlyc3QocXVlcnlbaV0pKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlY29kZU1hdHJpeCgpIHsKKyAgICAgICAgX3Rlc3REZWNvZGVNYXRyaXgoInBhdGgiLCAicGF0aCIpOworICAgICAgICBfdGVzdERlY29kZU1hdHJpeCgicGF0aDsiLCAicGF0aCIpOworICAgICAgICBfdGVzdERlY29kZU1hdHJpeCgicGF0aDs9IiwgInBhdGgiKTsKKyAgICAgICAgX3Rlc3REZWNvZGVNYXRyaXgoInBhdGg7PWp1bmsiLCAicGF0aCIpOworICAgICAgICBfdGVzdERlY29kZU1hdHJpeCgicGF0aDs7IiwgInBhdGgiKTsKKyAgICAgICAgX3Rlc3REZWNvZGVNYXRyaXgoInBhdGg7YSIsICJwYXRoIiwgImEiLCAiIik7CisgICAgICAgIF90ZXN0RGVjb2RlTWF0cml4KCJwYXRoOzthIiwgInBhdGgiLCAiYSIsICIiKTsKKyAgICAgICAgX3Rlc3REZWNvZGVNYXRyaXgoInBhdGg7YTsiLCAicGF0aCIsICJhIiwgIiIpOworICAgICAgICBfdGVzdERlY29kZU1hdHJpeCgicGF0aDthOzsiLCAicGF0aCIsICJhIiwgIiIpOworICAgICAgICBfdGVzdERlY29kZU1hdHJpeCgicGF0aDthPSIsICJwYXRoIiwgImEiLCAiIik7CisgICAgICAgIF90ZXN0RGVjb2RlTWF0cml4KCJwYXRoO2E9OyIsICJwYXRoIiwgImEiLCAiIik7CisgICAgICAgIF90ZXN0RGVjb2RlTWF0cml4KCJwYXRoO2E9OzsiLCAicGF0aCIsICJhIiwgIiIpOworICAgICAgICBfdGVzdERlY29kZU1hdHJpeCgicGF0aDthPXgiLCAicGF0aCIsICJhIiwgIngiKTsKKyAgICAgICAgX3Rlc3REZWNvZGVNYXRyaXgoInBhdGg7YT14OyIsICJwYXRoIiwgImEiLCAieCIpOworICAgICAgICBfdGVzdERlY29kZU1hdHJpeCgicGF0aDthPXg7OyIsICJwYXRoIiwgImEiLCAieCIpOworICAgICAgICBfdGVzdERlY29kZU1hdHJpeCgicGF0aDthPXg7Yj15IiwgInBhdGgiLCAiYSIsICJ4IiwgImIiLCAieSIpOworICAgICAgICBfdGVzdERlY29kZU1hdHJpeCgicGF0aDthPXg7O2I9eSIsICJwYXRoIiwgImEiLCAieCIsICJiIiwgInkiKTsKKyAgICAgICAgX3Rlc3REZWNvZGVNYXRyaXgoInBhdGg7YT09eDsiLCAicGF0aCIsICJhIiwgIj14Iik7CisKKyAgICAgICAgX3Rlc3REZWNvZGVNYXRyaXgoIiIsICIiKTsKKyAgICAgICAgX3Rlc3REZWNvZGVNYXRyaXgoIjsiLCAiIik7CisgICAgICAgIF90ZXN0RGVjb2RlTWF0cml4KCI7PSIsICIiKTsKKyAgICAgICAgX3Rlc3REZWNvZGVNYXRyaXgoIjs9anVuayIsICIiKTsKKyAgICAgICAgX3Rlc3REZWNvZGVNYXRyaXgoIjs7IiwgIiIpOworICAgICAgICBfdGVzdERlY29kZU1hdHJpeCgiO2EiLCAiIiwgImEiLCAiIik7CisgICAgICAgIF90ZXN0RGVjb2RlTWF0cml4KCI7O2EiLCAiIiwgImEiLCAiIik7CisgICAgICAgIF90ZXN0RGVjb2RlTWF0cml4KCI7YTsiLCAiIiwgImEiLCAiIik7CisgICAgICAgIF90ZXN0RGVjb2RlTWF0cml4KCI7YTs7IiwgIiIsICJhIiwgIiIpOworICAgICAgICBfdGVzdERlY29kZU1hdHJpeCgiO2E9IiwgIiIsICJhIiwgIiIpOworICAgICAgICBfdGVzdERlY29kZU1hdHJpeCgiO2E9OyIsICIiLCAiYSIsICIiKTsKKyAgICAgICAgX3Rlc3REZWNvZGVNYXRyaXgoIjthPTs7IiwgIiIsICJhIiwgIiIpOworICAgICAgICBfdGVzdERlY29kZU1hdHJpeCgiO2E9eCIsICIiLCAiYSIsICJ4Iik7CisgICAgICAgIF90ZXN0RGVjb2RlTWF0cml4KCI7YT09eCIsICIiLCAiYSIsICI9eCIpOworICAgICAgICBfdGVzdERlY29kZU1hdHJpeCgiO2E9eDsiLCAiIiwgImEiLCAieCIpOworICAgICAgICBfdGVzdERlY29kZU1hdHJpeCgiO2E9eDs7IiwgIiIsICJhIiwgIngiKTsKKyAgICAgICAgX3Rlc3REZWNvZGVNYXRyaXgoIjthPXg7Yj15IiwgIiIsICJhIiwgIngiLCAiYiIsICJ5Iik7CisgICAgICAgIF90ZXN0RGVjb2RlTWF0cml4KCI7YT14OztiPXkiLCAiIiwgImEiLCAieCIsICJiIiwgInkiKTsKKworICAgICAgICBfdGVzdERlY29kZU1hdHJpeCgiOyUyMGElMjA9JTIweCUyMCIsICIiLCB0cnVlLCAiIGEgIiwgIiB4ICIpOworICAgICAgICBfdGVzdERlY29kZU1hdHJpeCgiOyUyMGElMjA9JTIweCUyMCIsICIiLCBmYWxzZSwgIiBhICIsICIlMjB4JTIwIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjb2RlVW5pY29kZU1hdHJpeCgpIHsKKyAgICAgICAgX3Rlc3REZWNvZGVNYXRyaXgoIjt0aHVtYnN1cCVGMCU5RiU5MSU4RD1jaGlja2VuJUYwJTlGJTkwJTk0IiwgIiIsIHRydWUsICJ0aHVtYnN1cFx1ZDgzZFx1ZGM0ZCIsICJjaGlja2VuXHVkODNkXHVkYzE0Iik7CisgICAgICAgIF90ZXN0RGVjb2RlTWF0cml4KCI7dGh1bWJzdXAlRjAlOUYlOTElOEQ9Y2hpY2tlbiVGMCU5RiU5MCU5NCIsICIiLCBmYWxzZSwgInRodW1ic3VwXHVkODNkXHVkYzRkIiwgImNoaWNrZW4lRjAlOUYlOTAlOTQiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3REZWNvZGVNYXRyaXgoZmluYWwgU3RyaW5nIHBhdGgsIGZpbmFsIFN0cmluZyBwYXRoU2VnbWVudCwgZmluYWwgU3RyaW5nLi4uIG1hdHJpeCkgeworICAgICAgICBfdGVzdERlY29kZU1hdHJpeChwYXRoLCBwYXRoU2VnbWVudCwgdHJ1ZSwgbWF0cml4KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3REZWNvZGVNYXRyaXgoZmluYWwgU3RyaW5nIHBhdGgsIGZpbmFsIFN0cmluZyBwYXRoU2VnbWVudCwgZmluYWwgYm9vbGVhbiBkZWNvZGUsIGZpbmFsIFN0cmluZy4uLiBtYXRyaXgpIHsKKyAgICAgICAgZmluYWwgTGlzdDxQYXRoU2VnbWVudD4gcHMgPSBVcmlDb21wb25lbnQuZGVjb2RlUGF0aChwYXRoLCBkZWNvZGUpOworICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gbWF0cml4UGFyYW1ldGVycyA9IHBzLmdldCgwKS5nZXRNYXRyaXhQYXJhbWV0ZXJzKCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBhdGhTZWdtZW50LCBwcy5nZXQoMCkuZ2V0UGF0aCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1hdHJpeC5sZW5ndGggLyAyLCBtYXRyaXhQYXJhbWV0ZXJzLnNpemUoKSk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXRyaXgubGVuZ3RoOyBpICs9IDIpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhtYXRyaXhbaSArIDFdLCBtYXRyaXhQYXJhbWV0ZXJzLmdldEZpcnN0KG1hdHJpeFtpXSkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5jb2RlUGF0aFNlZ21lbnQoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiJTJGYSUyRmIlMkZjIiwgVXJpQ29tcG9uZW50LmVuY29kZSgiL2EvYi9jIiwgVXJpQ29tcG9uZW50LlR5cGUuUEFUSF9TRUdNRU5UKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiJTJGYSUyMCUyRmIlMjAlMkZjJTIwIiwgVXJpQ29tcG9uZW50LmVuY29kZSgiL2EgL2IgL2MgIiwgVXJpQ29tcG9uZW50LlR5cGUuUEFUSF9TRUdNRU5UKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiJTJGY29weXJpZ2h0JUMyJUE5IiwgVXJpQ29tcG9uZW50LmVuY29kZSgiL2NvcHlyaWdodFx1MDBhOSIsIFVyaUNvbXBvbmVudC5UeXBlLlBBVEhfU0VHTUVOVCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiUyRmElM0J4JTJGYiUzQnglMkZjJTNCeCIsIFVyaUNvbXBvbmVudC5lbmNvZGUoIi9hO3gvYjt4L2M7eCIsIFVyaUNvbXBvbmVudC5UeXBlLlBBVEhfU0VHTUVOVCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiUyRnRodW1ic3VwJUYwJTlGJTkxJThEIiwgVXJpQ29tcG9uZW50LmVuY29kZSgiL3RodW1ic3VwXHVkODNkXHVkYzRkIiwgVXJpQ29tcG9uZW50LlR5cGUuUEFUSF9TRUdNRU5UKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5jb2RlUGF0aCgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvYS9iL2MiLCBVcmlDb21wb25lbnQuZW5jb2RlKCIvYS9iL2MiLCBVcmlDb21wb25lbnQuVHlwZS5QQVRIKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiL2ElMjAvYiUyMC9jJTIwIiwgVXJpQ29tcG9uZW50LmVuY29kZSgiL2EgL2IgL2MgIiwgVXJpQ29tcG9uZW50LlR5cGUuUEFUSCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9jb3B5cmlnaHQlQzIlQTkiLCBVcmlDb21wb25lbnQuZW5jb2RlKCIvY29weXJpZ2h0XHUwMGE5IiwgVXJpQ29tcG9uZW50LlR5cGUuUEFUSCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9hO3gvYjt4L2M7eCIsIFVyaUNvbXBvbmVudC5lbmNvZGUoIi9hO3gvYjt4L2M7eCIsIFVyaUNvbXBvbmVudC5UeXBlLlBBVEgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvdGh1bWJzdXAlRjAlOUYlOTElOEQiLCBVcmlDb21wb25lbnQuZW5jb2RlKCIvdGh1bWJzdXBcdWQ4M2RcdWRjNGQiLCBVcmlDb21wb25lbnQuVHlwZS5QQVRIKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGV4dHVhbEVuY29kZVBhdGgoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiL2EvYi9jIiwgVXJpQ29tcG9uZW50LmNvbnRleHR1YWxFbmNvZGUoIi9hL2IvYyIsIFVyaUNvbXBvbmVudC5UeXBlLlBBVEgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvYSUyMC9iJTIwL2MlMjAiLCBVcmlDb21wb25lbnQuY29udGV4dHVhbEVuY29kZSgiL2EgL2IgL2MgIiwgVXJpQ29tcG9uZW50LlR5cGUuUEFUSCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9jb3B5cmlnaHQlQzIlQTkiLCBVcmlDb21wb25lbnQuY29udGV4dHVhbEVuY29kZSgiL2NvcHlyaWdodFx1MDBhOSIsIFVyaUNvbXBvbmVudC5UeXBlLlBBVEgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvdGh1bWJzdXAlRjAlOUYlOTElOEQiLCBVcmlDb21wb25lbnQuY29udGV4dHVhbEVuY29kZSgiL3RodW1ic3VwXHVkODNkXHVkYzRkIiwgVXJpQ29tcG9uZW50LlR5cGUuUEFUSCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygiL2ElMjAvYiUyMC9jJTIwIiwgVXJpQ29tcG9uZW50LmNvbnRleHR1YWxFbmNvZGUoIi9hJTIwL2IlMjAvYyUyMCIsIFVyaUNvbXBvbmVudC5UeXBlLlBBVEgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvY29weXJpZ2h0JUMyJUE5IiwgVXJpQ29tcG9uZW50LmNvbnRleHR1YWxFbmNvZGUoIi9jb3B5cmlnaHQlQzIlQTkiLCBVcmlDb21wb25lbnQuVHlwZS5QQVRIKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiL3RodW1ic3VwJUYwJTlGJTkxJThEIiwgVXJpQ29tcG9uZW50LmNvbnRleHR1YWxFbmNvZGUoIi90aHVtYnN1cCVGMCU5RiU5MSU4RCIsIFVyaUNvbXBvbmVudC5UeXBlLlBBVEgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbmNvZGVRdWVyeSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhJTIwYiUyMGMuLSUyQV89KyYlMjV4eCUyNTIwIiwKKyAgICAgICAgICAgICAgICBVcmlDb21wb25lbnQuZW5jb2RlKCJhIGIgYy4tKl89KyYleHglMjAiLCBVcmlDb21wb25lbnQuVHlwZS5RVUVSWSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImErYitjLi0lMkFfJTNEJTJCJTI2JTI1eHglMjUyMCIsCisgICAgICAgICAgICAgICAgVXJpQ29tcG9uZW50LmVuY29kZSgiYSBiIGMuLSpfPSsmJXh4JTIwIiwgVXJpQ29tcG9uZW50LlR5cGUuUVVFUllfUEFSQU0pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhJTIwYiUyMGMuLSUyQV8lM0QlMkIlMjYlMjV4eCUyNTIwIiwKKyAgICAgICAgICAgICAgICBVcmlDb21wb25lbnQuZW5jb2RlKCJhIGIgYy4tKl89KyYleHglMjAiLCBVcmlDb21wb25lbnQuVHlwZS5RVUVSWV9QQVJBTV9TUEFDRV9FTkNPREVEKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0aHVtYnN1cCVGMCU5RiU5MSU4RCIsIFVyaUNvbXBvbmVudC5lbmNvZGUoInRodW1ic3VwXHVkODNkXHVkYzRkIiwgVXJpQ29tcG9uZW50LlR5cGUuUVVFUlkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0aHVtYnN1cCVGMCU5RiU5MSU4RCIsIFVyaUNvbXBvbmVudC5lbmNvZGUoInRodW1ic3VwXHVkODNkXHVkYzRkIiwgVXJpQ29tcG9uZW50LlR5cGUuUVVFUllfUEFSQU0pKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb250ZXh0dWFsRW5jb2RlUXVlcnkoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiYSUyMGIlMjBjLi0lMkFfPSsmJTI1eHglMjAiLAorICAgICAgICAgICAgICAgIFVyaUNvbXBvbmVudC5jb250ZXh0dWFsRW5jb2RlKCJhIGIgYy4tKl89KyYleHglMjAiLCBVcmlDb21wb25lbnQuVHlwZS5RVUVSWSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImErYitjLi0lMkFfJTNEJTJCJTI2JTI1eHglMjAiLAorICAgICAgICAgICAgICAgIFVyaUNvbXBvbmVudC5jb250ZXh0dWFsRW5jb2RlKCJhIGIgYy4tKl89KyYleHglMjAiLCBVcmlDb21wb25lbnQuVHlwZS5RVUVSWV9QQVJBTSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImElMjBiJTIwYy4tJTJBXyUzRCUyQiUyNiUyNXh4JTIwIiwKKyAgICAgICAgICAgICAgICBVcmlDb21wb25lbnQuY29udGV4dHVhbEVuY29kZSgiYSBiIGMuLSpfPSsmJXh4JTIwIiwgVXJpQ29tcG9uZW50LlR5cGUuUVVFUllfUEFSQU1fU1BBQ0VfRU5DT0RFRCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygidGh1bWJzdXAlRjAlOUYlOTElOER0aHVtYnN1cCVGMCU5RiU5MSU4RCIsCisgICAgICAgICAgICAgICAgVXJpQ29tcG9uZW50LmNvbnRleHR1YWxFbmNvZGUoInRodW1ic3VwJUYwJTlGJTkxJThEdGh1bWJzdXBcdWQ4M2RcdWRjNGQiLCBVcmlDb21wb25lbnQuVHlwZS5RVUVSWSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRodW1ic3VwJUYwJTlGJTkxJThEdGh1bWJzdXAlRjAlOUYlOTElOEQiLAorICAgICAgICAgICAgICAgIFVyaUNvbXBvbmVudC5jb250ZXh0dWFsRW5jb2RlKCJ0aHVtYnN1cCVGMCU5RiU5MSU4RHRodW1ic3VwXHVkODNkXHVkYzRkIiwgVXJpQ29tcG9uZW50LlR5cGUuUVVFUllfUEFSQU0pKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb250ZXh0dWFsRW5jb2RlTWF0cml4UGFyYW0oKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiYSUzRGIlMjBjJTNCeCIsIFVyaUNvbXBvbmVudC5jb250ZXh0dWFsRW5jb2RlKCJhPWIgYzt4IiwgVXJpQ29tcG9uZW50LlR5cGUuTUFUUklYX1BBUkFNKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhJTNEYiUyMGMlM0J4JTNEdGh1bWJzdXAlRjAlOUYlOTElOEQiLCBVcmlDb21wb25lbnQuY29udGV4dHVhbEVuY29kZSgiYT1iIGM7eD10aHVtYnN1cFx1ZDgzZFx1ZGM0ZCIsCisgICAgICAgICAgICAgICAgVXJpQ29tcG9uZW50LlR5cGUuTUFUUklYX1BBUkFNKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGV4dHVhbEVuY29kZVBlcmNlbnQoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiJTI1IiwgVXJpQ29tcG9uZW50LmNvbnRleHR1YWxFbmNvZGUoIiUiLCBVcmlDb21wb25lbnQuVHlwZS5QQVRIKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSUyNSIsIFVyaUNvbXBvbmVudC5jb250ZXh0dWFsRW5jb2RlKCJhJSIsIFVyaUNvbXBvbmVudC5UeXBlLlBBVEgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhJTI1eCIsIFVyaUNvbXBvbmVudC5jb250ZXh0dWFsRW5jb2RlKCJhJXgiLCBVcmlDb21wb25lbnQuVHlwZS5QQVRIKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSUyNSUyMCUyMCIsIFVyaUNvbXBvbmVudC5jb250ZXh0dWFsRW5jb2RlKCJhJSAgIiwgVXJpQ29tcG9uZW50LlR5cGUuUEFUSCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygiYSUyMGElMjAlMjAiLCBVcmlDb21wb25lbnQuY29udGV4dHVhbEVuY29kZSgiYSBhJTIwICIsIFVyaUNvbXBvbmVudC5UeXBlLlBBVEgpKTsKKworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVuY29kZVRlbXBsYXRlTmFtZXMoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiJTdCZm9vJTdEIiwgVXJpQ29tcG9uZW50LmVuY29kZVRlbXBsYXRlTmFtZXMoIntmb299IikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlUGF0aCgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBVcmlDb21wb25lbnQudmFsaWQoIi94IHkiLCBVcmlDb21wb25lbnQuVHlwZS5QQVRIKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCBVcmlDb21wb25lbnQudmFsaWQoIi94MjB5IiwgVXJpQ29tcG9uZW50LlR5cGUuUEFUSCkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgVXJpQ29tcG9uZW50LnZhbGlkKCIveCUyMHkiLCBVcmlDb21wb25lbnQuVHlwZS5QQVRIKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3VyaS9VcmlUZW1wbGF0ZVRlc3QuamF2YSBiL2NvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdXJpL1VyaVRlbXBsYXRlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OTY2MDIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3VyaS9VcmlUZW1wbGF0ZVRlc3QuamF2YQpAQCAtMCwwICsxLDc2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS51cmk7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hSZXN1bHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS51cmkuaW50ZXJuYWwuVXJpVGVtcGxhdGVQYXJzZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBUYWtlbiBmcm9tIEplcnNleSAxOiBqZXJzZXktdGVzdHM6IGNvbS5zdW4uamVyc2V5LmltcGwudXJpLlVyaVRlbXBsYXRlVGVzdAorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgR2VyYXJkIERhdmlzb24gKGdlcmFyZC5kYXZpc29uIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBVcmlUZW1wbGF0ZVRlc3QgeworCisgICAgLyoqCisgICAgICogVGVzdCB0aGUgVVJJIHJlc29sdXRpb24gYXMgZGVmaW5lZCBpbiBSRkMgMzk4NiwKKyAgICAgKiA8YSBocmVmPSJodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzOTg2I3NlY3Rpb24tNS40LjEiPnNlY3QuIDUuNC4xPC9hPiBhbmQKKyAgICAgKiBhbmQgPGEgaHJlZj0iaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzk4NiNzZWN0aW9uLTUuNC4yIj5zZWN0LiA1LjQuMjwvYT4uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZVVyaSgpIHsKKyAgICAgICAgZmluYWwgVVJJIGJhc2VVcmkgPSBVUkkuY3JlYXRlKCJodHRwOi8vYS9iL2MvZDtwP3EiKTsKKworICAgICAgICAvLyBOb3JtYWwgZXhhbXBsZXMgKFJGQyAzOTg2LCBzZWN0LiA1LjQuMSkKKyAgICAgICAgYXNzZXJ0VGhhdChVcmlUZW1wbGF0ZS5yZXNvbHZlKGJhc2VVcmksIFVSSS5jcmVhdGUoImc6aCIpKSwgZXF1YWxUbyhVUkkuY3JlYXRlKCJnOmgiKSkpOworICAgICAgICBhc3NlcnRUaGF0KFVyaVRlbXBsYXRlLnJlc29sdmUoYmFzZVVyaSwgVVJJLmNyZWF0ZSgiZzpoIikpLCBlcXVhbFRvKFVSSS5jcmVhdGUoImc6aCIpKSk7CisgICAgICAgIGFzc2VydFRoYXQoVXJpVGVtcGxhdGUucmVzb2x2ZShiYXNlVXJpLCBVUkkuY3JlYXRlKCJnIikpLCBlcXVhbFRvKFVSSS5jcmVhdGUoImh0dHA6Ly9hL2IvYy9nIikpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChVcmlUZW1wbGF0ZS5yZXNvbHZlKGJhc2VVcmksIFVSSS5jcmVhdGUoIi4vZyIpKSwgZXF1YWxUbyhVUkkuY3JlYXRlKCJodHRwOi8vYS9iL2MvZyIpKSk7CisgICAgICAgIGFzc2VydFRoYXQoVXJpVGVtcGxhdGUucmVzb2x2ZShiYXNlVXJpLCBVUkkuY3JlYXRlKCJnLyIpKSwgZXF1YWxUbyhVUkkuY3JlYXRlKCJodHRwOi8vYS9iL2MvZy8iKSkpOworICAgICAgICBhc3NlcnRUaGF0KFVyaVRlbXBsYXRlLnJlc29sdmUoYmFzZVVyaSwgVVJJLmNyZWF0ZSgiL2ciKSksIGVxdWFsVG8oVVJJLmNyZWF0ZSgiaHR0cDovL2EvZyIpKSk7CisgICAgICAgIGFzc2VydFRoYXQoVXJpVGVtcGxhdGUucmVzb2x2ZShiYXNlVXJpLCBVUkkuY3JlYXRlKCIvL2ciKSksIGVxdWFsVG8oVVJJLmNyZWF0ZSgiaHR0cDovL2ciKSkpOworICAgICAgICBhc3NlcnRUaGF0KFVyaVRlbXBsYXRlLnJlc29sdmUoYmFzZVVyaSwgVVJJLmNyZWF0ZSgiP3kiKSksIGVxdWFsVG8oVVJJLmNyZWF0ZSgiaHR0cDovL2EvYi9jL2Q7cD95IikpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChVcmlUZW1wbGF0ZS5yZXNvbHZlKGJhc2VVcmksIFVSSS5jcmVhdGUoImc/eSIpKSwgZXF1YWxUbyhVUkkuY3JlYXRlKCJodHRwOi8vYS9iL2MvZz95IikpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChVcmlUZW1wbGF0ZS5yZXNvbHZlKGJhc2VVcmksIFVSSS5jcmVhdGUoIiNzIikpLCBlcXVhbFRvKFVSSS5jcmVhdGUoImh0dHA6Ly9hL2IvYy9kO3A/cSNzIikpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChVcmlUZW1wbGF0ZS5yZXNvbHZlKGJhc2VVcmksIFVSSS5jcmVhdGUoImcjcyIpKSwgZXF1YWxUbyhVUkkuY3JlYXRlKCJodHRwOi8vYS9iL2MvZyNzIikpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChVcmlUZW1wbGF0ZS5yZXNvbHZlKGJhc2VVcmksIFVSSS5jcmVhdGUoImc/eSNzIikpLCBlcXVhbFRvKFVSSS5jcmVhdGUoImh0dHA6Ly9hL2IvYy9nP3kjcyIpKSk7CisgICAgICAgIGFzc2VydFRoYXQoVXJpVGVtcGxhdGUucmVzb2x2ZShiYXNlVXJpLCBVUkkuY3JlYXRlKCI7eCIpKSwgZXF1YWxUbyhVUkkuY3JlYXRlKCJodHRwOi8vYS9iL2MvO3giKSkpOworICAgICAgICBhc3NlcnRUaGF0KFVyaVRlbXBsYXRlLnJlc29sdmUoYmFzZVVyaSwgVVJJLmNyZWF0ZSgiZzt4IikpLCBlcXVhbFRvKFVSSS5jcmVhdGUoImh0dHA6Ly9hL2IvYy9nO3giKSkpOworICAgICAgICBhc3NlcnRUaGF0KFVyaVRlbXBsYXRlLnJlc29sdmUoYmFzZVVyaSwgVVJJLmNyZWF0ZSgiZzt4P3kjcyIpKSwgZXF1YWxUbyhVUkkuY3JlYXRlKCJodHRwOi8vYS9iL2MvZzt4P3kjcyIpKSk7CisgICAgICAgIGFzc2VydFRoYXQoVXJpVGVtcGxhdGUucmVzb2x2ZShiYXNlVXJpLCBVUkkuY3JlYXRlKCIiKSksIGVxdWFsVG8oVVJJLmNyZWF0ZSgiaHR0cDovL2EvYi9jL2Q7cD9xIikpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChVcmlUZW1wbGF0ZS5yZXNvbHZlKGJhc2VVcmksIFVSSS5jcmVhdGUoIi4iKSksIGVxdWFsVG8oVVJJLmNyZWF0ZSgiaHR0cDovL2EvYi9jLyIpKSk7CisgICAgICAgIGFzc2VydFRoYXQoVXJpVGVtcGxhdGUucmVzb2x2ZShiYXNlVXJpLCBVUkkuY3JlYXRlKCIuLyIpKSwgZXF1YWxUbyhVUkkuY3JlYXRlKCJodHRwOi8vYS9iL2MvIikpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChVcmlUZW1wbGF0ZS5yZXNvbHZlKGJhc2VVcmksIFVSSS5jcmVhdGUoIi4uIikpLCBlcXVhbFRvKFVSSS5jcmVhdGUoImh0dHA6Ly9hL2IvIikpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChVcmlUZW1wbGF0ZS5yZXNvbHZlKGJhc2VVcmksIFVSSS5jcmVhdGUoIi4uLyIpKSwgZXF1YWxUbyhVUkkuY3JlYXRlKCJodHRwOi8vYS9iLyIpKSk7CisgICAgICAgIGFzc2VydFRoYXQoVXJpVGVtcGxhdGUucmVzb2x2ZShiYXNlVXJpLCBVUkkuY3JlYXRlKCIuLi9nIikpLCBlcXVhbFRvKFVSSS5jcmVhdGUoImh0dHA6Ly9hL2IvZyIpKSk7CisgICAgICAgIGFzc2VydFRoYXQoVXJpVGVtcGxhdGUucmVzb2x2ZShiYXNlVXJpLCBVUkkuY3JlYXRlKCIuLi8uLiIpKSwgZXF1YWxUbyhVUkkuY3JlYXRlKCJodHRwOi8vYS8iKSkpOworICAgICAgICBhc3NlcnRUaGF0KFVyaVRlbXBsYXRlLnJlc29sdmUoYmFzZVVyaSwgVVJJLmNyZWF0ZSgiLi4vLi4vIikpLCBlcXVhbFRvKFVSSS5jcmVhdGUoImh0dHA6Ly9hLyIpKSk7CisgICAgICAgIGFzc2VydFRoYXQoVXJpVGVtcGxhdGUucmVzb2x2ZShiYXNlVXJpLCBVUkkuY3JlYXRlKCIuLi8uLi9nIikpLCBlcXVhbFRvKFVSSS5jcmVhdGUoImh0dHA6Ly9hL2ciKSkpOworCisgICAgICAgIC8vIEFibm9ybWFsIGV4YW1wbGVzIChSRkMgMzk4Niwgc2VjdC4gNS40LjIpCisgICAgICAgIGFzc2VydFRoYXQoVXJpVGVtcGxhdGUucmVzb2x2ZShiYXNlVXJpLCBVUkkuY3JlYXRlKCIuLi8uLi8uLi9nIikpLCBlcXVhbFRvKFVSSS5jcmVhdGUoImh0dHA6Ly9hL2ciKSkpOworICAgICAgICBhc3NlcnRUaGF0KFVyaVRlbXBsYXRlLnJlc29sdmUoYmFzZVVyaSwgVVJJLmNyZWF0ZSgiLi4vLi4vLi4vLi4vZyIpKSwgZXF1YWxUbyhVUkkuY3JlYXRlKCJodHRwOi8vYS9nIikpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChVcmlUZW1wbGF0ZS5yZXNvbHZlKGJhc2VVcmksIFVSSS5jcmVhdGUoIi8uL2ciKSksIGVxdWFsVG8oVVJJLmNyZWF0ZSgiaHR0cDovL2EvZyIpKSk7CisgICAgICAgIGFzc2VydFRoYXQoVXJpVGVtcGxhdGUucmVzb2x2ZShiYXNlVXJpLCBVUkkuY3JlYXRlKCIvLi4vZyIpKSwgZXF1YWxUbyhVUkkuY3JlYXRlKCJodHRwOi8vYS9nIikpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChVcmlUZW1wbGF0ZS5yZXNvbHZlKGJhc2VVcmksIFVSSS5jcmVhdGUoImcuIikpLCBlcXVhbFRvKFVSSS5jcmVhdGUoImh0dHA6Ly9hL2IvYy9nLiIpKSk7CisgICAgICAgIGFzc2VydFRoYXQoVXJpVGVtcGxhdGUucmVzb2x2ZShiYXNlVXJpLCBVUkkuY3JlYXRlKCIuZyIpKSwgZXF1YWxUbyhVUkkuY3JlYXRlKCJodHRwOi8vYS9iL2MvLmciKSkpOworICAgICAgICBhc3NlcnRUaGF0KFVyaVRlbXBsYXRlLnJlc29sdmUoYmFzZVVyaSwgVVJJLmNyZWF0ZSgiZy4uIikpLCBlcXVhbFRvKFVSSS5jcmVhdGUoImh0dHA6Ly9hL2IvYy9nLi4iKSkpOworICAgICAgICBhc3NlcnRUaGF0KFVyaVRlbXBsYXRlLnJlc29sdmUoYmFzZVVyaSwgVVJJLmNyZWF0ZSgiLi5nIikpLCBlcXVhbFRvKFVSSS5jcmVhdGUoImh0dHA6Ly9hL2IvYy8uLmciKSkpOworICAgICAgICBhc3NlcnRUaGF0KFVyaVRlbXBsYXRlLnJlc29sdmUoYmFzZVVyaSwgVVJJLmNyZWF0ZSgiLi8uLi9nIikpLCBlcXVhbFRvKFVSSS5jcmVhdGUoImh0dHA6Ly9hL2IvZyIpKSk7CisgICAgICAgIGFzc2VydFRoYXQoVXJpVGVtcGxhdGUucmVzb2x2ZShiYXNlVXJpLCBVUkkuY3JlYXRlKCIuL2cvLiIpKSwgZXF1YWxUbyhVUkkuY3JlYXRlKCJodHRwOi8vYS9iL2MvZy8iKSkpOworICAgICAgICBhc3NlcnRUaGF0KFVyaVRlbXBsYXRlLnJlc29sdmUoYmFzZVVyaSwgVVJJLmNyZWF0ZSgiZy8uL2giKSksIGVxdWFsVG8oVVJJLmNyZWF0ZSgiaHR0cDovL2EvYi9jL2cvaCIpKSk7CisgICAgICAgIGFzc2VydFRoYXQoVXJpVGVtcGxhdGUucmVzb2x2ZShiYXNlVXJpLCBVUkkuY3JlYXRlKCJnLy4uL2giKSksIGVxdWFsVG8oVVJJLmNyZWF0ZSgiaHR0cDovL2EvYi9jL2giKSkpOworICAgICAgICBhc3NlcnRUaGF0KFVyaVRlbXBsYXRlLnJlc29sdmUoYmFzZVVyaSwgVVJJLmNyZWF0ZSgiZzt4PTEvLi95IikpLCBlcXVhbFRvKFVSSS5jcmVhdGUoImh0dHA6Ly9hL2IvYy9nO3g9MS95IikpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChVcmlUZW1wbGF0ZS5yZXNvbHZlKGJhc2VVcmksIFVSSS5jcmVhdGUoImc7eD0xLy4uL3kiKSksIGVxdWFsVG8oVVJJLmNyZWF0ZSgiaHR0cDovL2EvYi9jL3kiKSkpOworICAgICAgICBhc3NlcnRUaGF0KFVyaVRlbXBsYXRlLnJlc29sdmUoYmFzZVVyaSwgVVJJLmNyZWF0ZSgiZz95Ly4veCIpKSwgZXF1YWxUbyhVUkkuY3JlYXRlKCJodHRwOi8vYS9iL2MvZz95Ly4veCIpKSk7CisgICAgICAgIGFzc2VydFRoYXQoVXJpVGVtcGxhdGUucmVzb2x2ZShiYXNlVXJpLCBVUkkuY3JlYXRlKCJnP3kvLi4veCIpKSwgZXF1YWxUbyhVUkkuY3JlYXRlKCJodHRwOi8vYS9iL2MvZz95Ly4uL3giKSkpOworICAgICAgICBhc3NlcnRUaGF0KFVyaVRlbXBsYXRlLnJlc29sdmUoYmFzZVVyaSwgVVJJLmNyZWF0ZSgiZyNzLy4veCIpKSwgZXF1YWxUbyhVUkkuY3JlYXRlKCJodHRwOi8vYS9iL2MvZyNzLy4veCIpKSk7CisgICAgICAgIGFzc2VydFRoYXQoVXJpVGVtcGxhdGUucmVzb2x2ZShiYXNlVXJpLCBVUkkuY3JlYXRlKCJnI3MvLi4veCIpKSwgZXF1YWxUbyhVUkkuY3JlYXRlKCJodHRwOi8vYS9iL2MvZyNzLy4uL3giKSkpOworICAgICAgICAvLyBQZXIgUkZDIDM5ODYsIHRlc3QgYmVsb3cgc2hvdWxkIHJlc29sdmUgdG8gImh0dHA6ZyIgZm9yIHN0cmljdCBwYXJzZXJzIGFuZCAiaHR0cDovL2EvYi9jL2ciIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CisgICAgICAgIGFzc2VydFRoYXQoVXJpVGVtcGxhdGUucmVzb2x2ZShiYXNlVXJpLCBVUkkuY3JlYXRlKCJodHRwOmciKSksIGVxdWFsVG8oVVJJLmNyZWF0ZSgiaHR0cDpnIikpKTsKKworICAgICAgICAvLyBKREsgYnVnIGh0dHA6Ly9idWdzLnN1bi5jb20vYnVnZGF0YWJhc2Uvdmlld19idWcuZG8/YnVnX2lkPTQ3MDg1MzUKKyAgICAgICAgYXNzZXJ0VGhhdChVcmlUZW1wbGF0ZS5yZXNvbHZlKGJhc2VVcmksIFVSSS5jcmVhdGUoIiIpKSwgZXF1YWxUbyhiYXNlVXJpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVsYXRpdml6ZVVyaSgpIHsKKyAgICAgICAgVVJJIGJhc2VVcmk7CisKKyAgICAgICAgYmFzZVVyaSA9IFVSSS5jcmVhdGUoImh0dHA6Ly9hL2IvYy9kIik7CisgICAgICAgIGFzc2VydFRoYXQoVXJpVGVtcGxhdGUucmVsYXRpdml6ZShiYXNlVXJpLCBVUkkuY3JlYXRlKCJodHRwOi8vYS9iL2MvZC9lIikpLCBlcXVhbFRvKFVSSS5jcmVhdGUoImUiKSkpOworICAgICAgICBhc3NlcnRUaGF0KFVyaVRlbXBsYXRlLnJlbGF0aXZpemUoYmFzZVVyaSwgVVJJLmNyZWF0ZSgiaHR0cDovL2EvYi9jL2QvLi9lIikpLCBlcXVhbFRvKFVSSS5jcmVhdGUoImUiKSkpOworICAgICAgICBhc3NlcnRUaGF0KFVyaVRlbXBsYXRlLnJlbGF0aXZpemUoYmFzZVVyaSwgVVJJLmNyZWF0ZSgiaHR0cDovL2EvYi9jL2QvZS8uLi9mIikpLCBlcXVhbFRvKFVSSS5jcmVhdGUoImYiKSkpOworICAgICAgICBhc3NlcnRUaGF0KFVyaVRlbXBsYXRlLnJlbGF0aXZpemUoYmFzZVVyaSwgVVJJLmNyZWF0ZSgiaHR0cDovL2EvYi9jL2QvZS8uLi8uL2YiKSksIGVxdWFsVG8oVVJJLmNyZWF0ZSgiZiIpKSk7CisKKyAgICAgICAgYmFzZVVyaSA9IFVSSS5jcmVhdGUoImh0dHA6Ly9hL2IvYy9kP3E9diIpOworICAgICAgICBhc3NlcnRUaGF0KFVyaVRlbXBsYXRlLnJlbGF0aXZpemUoYmFzZVVyaSwgVVJJLmNyZWF0ZSgiaHR0cDovL2EvYi9jL2QvZSIpKSwgZXF1YWxUbyhVUkkuY3JlYXRlKCJlIikpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChVcmlUZW1wbGF0ZS5yZWxhdGl2aXplKGJhc2VVcmksIFVSSS5jcmVhdGUoImh0dHA6Ly9hL2IvYy9kLy4vZSIpKSwgZXF1YWxUbyhVUkkuY3JlYXRlKCJlIikpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChVcmlUZW1wbGF0ZS5yZWxhdGl2aXplKGJhc2VVcmksIFVSSS5jcmVhdGUoImh0dHA6Ly9hL2IvYy9kL2UvLi4vZiIpKSwgZXF1YWxUbyhVUkkuY3JlYXRlKCJmIikpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChVcmlUZW1wbGF0ZS5yZWxhdGl2aXplKGJhc2VVcmksIFVSSS5jcmVhdGUoImh0dHA6Ly9hL2IvYy9kL2UvLi4vLi9mIikpLCBlcXVhbFRvKFVSSS5jcmVhdGUoImYiKSkpOworCisgICAgICAgIC8vIE5PVEU6IEF0IHRoZSBtb21lbnQsIGluIHN5bmMgd2l0aCB0aGUgSkRLIGltcGxlbWVudGF0aW9uIG9mIHJlbGF0aXZpemUoKSBtZXRob2QsCisgICAgICAgIC8vIHdlIGRvIG5vdCBzdXBwb3J0IHJlbGF0aXZpemF0aW9uIG9mIFVSSXMgdGhhdCBkbyBub3QgZnVsbHkgcHJlZml4IHRoZSBiYXNlIFVSSS4KKyAgICAgICAgLy8gT25jZSAoaWYpIHdlIGRlY2lkZSB0byBpbXByb3ZlIHRoaXMgc3VwcG9ydCBiZXlvbmQgd2hhdCBKREsgc3VwcG9ydHMsIHdlIG1heSBuZWVkCisgICAgICAgIC8vIHRvIHVwZGF0ZSB0aGUgYXNzZXJ0aW9ucyBiZWxvdy4KKyAgICAgICAgYmFzZVVyaSA9IFVSSS5jcmVhdGUoImh0dHA6Ly9hL2IvYy9kIik7CisgICAgICAgIGFzc2VydFRoYXQoVXJpVGVtcGxhdGUucmVsYXRpdml6ZShiYXNlVXJpLCBVUkkuY3JlYXRlKCJodHRwOi8vYS9iL2MvZSIpKSwgZXF1YWxUbyhVUkkuY3JlYXRlKCJodHRwOi8vYS9iL2MvZSIpKSk7CisgICAgICAgIGFzc2VydFRoYXQoVXJpVGVtcGxhdGUucmVsYXRpdml6ZShiYXNlVXJpLCBVUkkuY3JlYXRlKCJodHRwOi8vYS9iL2MvLi9lIikpLCBlcXVhbFRvKFVSSS5jcmVhdGUoImh0dHA6Ly9hL2IvYy9lIikpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChVcmlUZW1wbGF0ZS5yZWxhdGl2aXplKGJhc2VVcmksIFVSSS5jcmVhdGUoImh0dHA6Ly9hL2IvYy9kLy4uLy4vZSIpKSwgZXF1YWxUbyhVUkkuY3JlYXRlKCJodHRwOi8vYS9iL2MvZSIpKSk7CisKKyAgICAgICAgYmFzZVVyaSA9IFVSSS5jcmVhdGUoImh0dHA6Ly9hL2IvYy9kP3E9diIpOworICAgICAgICBhc3NlcnRUaGF0KFVyaVRlbXBsYXRlLnJlbGF0aXZpemUoYmFzZVVyaSwgVVJJLmNyZWF0ZSgiaHR0cDovL2EvYi9jL2UiKSksIGVxdWFsVG8oVVJJLmNyZWF0ZSgiaHR0cDovL2EvYi9jL2UiKSkpOworICAgICAgICBhc3NlcnRUaGF0KFVyaVRlbXBsYXRlLnJlbGF0aXZpemUoYmFzZVVyaSwgVVJJLmNyZWF0ZSgiaHR0cDovL2EvYi9jLy4vZSIpKSwgZXF1YWxUbyhVUkkuY3JlYXRlKCJodHRwOi8vYS9iL2MvZSIpKSk7CisgICAgICAgIGFzc2VydFRoYXQoVXJpVGVtcGxhdGUucmVsYXRpdml6ZShiYXNlVXJpLCBVUkkuY3JlYXRlKCJodHRwOi8vYS9iL2MvZC8uLi8uL2UiKSksIGVxdWFsVG8oVVJJLmNyZWF0ZSgiaHR0cDovL2EvYi9jL2UiKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRlbXBsYXRlTmFtZXMoKSB7CisgICAgICAgIF90ZXN0VGVtcGxhdGVOYW1lcygie2F9IiwgImEiKTsKKyAgICAgICAgX3Rlc3RUZW1wbGF0ZU5hbWVzKCJ7ICBhfSIsICJhIik7CisgICAgICAgIF90ZXN0VGVtcGxhdGVOYW1lcygieyAgYSAgfSIsICJhIik7CisgICAgICAgIF90ZXN0VGVtcGxhdGVOYW1lcygie2E6fSIsICJhIik7CisgICAgICAgIF90ZXN0VGVtcGxhdGVOYW1lcygie2EgOn0iLCAiYSIpOworICAgICAgICBfdGVzdFRlbXBsYXRlTmFtZXMoInthIDogfSIsICJhIik7CisKKyAgICAgICAgX3Rlc3RUZW1wbGF0ZU5hbWVzKCJodHRwOi8vZXhhbXBsZS5vcmcve2F9L3tifS8iLCAiYSIsICJiIik7CisgICAgICAgIF90ZXN0VGVtcGxhdGVOYW1lcygiaHR0cDovL2V4YW1wbGUub3JnL3BhZ2UxI3thfSIsICJhIik7CisgICAgICAgIF90ZXN0VGVtcGxhdGVOYW1lcygie3NjaGVtZX06Ly97MjB9LmV4YW1wbGUub3JnP2RhdGU9e3dpbG1hfSZvcHRpb249e2F9IiwgInNjaGVtZSIsICIyMCIsICJ3aWxtYSIsICJhIik7CisgICAgICAgIF90ZXN0VGVtcGxhdGVOYW1lcygiaHR0cDovL2V4YW1wbGUub3JnL3thLWJ9IiwgImEtYiIpOworICAgICAgICBfdGVzdFRlbXBsYXRlTmFtZXMoImh0dHA6Ly9leGFtcGxlLm9yZz97cH0iLCAicCIpOworICAgICAgICBfdGVzdFRlbXBsYXRlTmFtZXMoImh0dHA6Ly9leGFtcGxlLmNvbS9vcmRlci97Y30ve2N9L3tjfS8iLCAiYyIsICJjIiwgImMiKTsKKyAgICB9CisKKyAgICB2b2lkIF90ZXN0VGVtcGxhdGVOYW1lcyhmaW5hbCBTdHJpbmcgdGVtcGxhdGUsIGZpbmFsIFN0cmluZy4uLiBuYW1lcykgeworICAgICAgICBmaW5hbCBVcmlUZW1wbGF0ZSB0ID0gbmV3IFVyaVRlbXBsYXRlKHRlbXBsYXRlKTsKKyAgICAgICAgX3Rlc3RUZW1wbGF0ZU5hbWVzKHQuZ2V0VGVtcGxhdGVWYXJpYWJsZXMoKSwgbmFtZXMpOworICAgIH0KKworICAgIHZvaWQgX3Rlc3RUZW1wbGF0ZU5hbWVzKGZpbmFsIExpc3Q8U3RyaW5nPiByZWdleE5hbWVzLCBmaW5hbCBTdHJpbmcuLi4gbmFtZXMpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5hbWVzLmxlbmd0aCwgcmVnZXhOYW1lcy5zaXplKCkpOworCisgICAgICAgIGZpbmFsIEl0ZXJhdG9yPFN0cmluZz4gaSA9IHJlZ2V4TmFtZXMuaXRlcmF0b3IoKTsKKyAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgbmFtZSA6IG5hbWVzKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobmFtZSwgaS5uZXh0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWF0Y2hpbmcoKSB7CisgICAgICAgIF90ZXN0TWF0Y2hpbmcoImh0dHA6Ly9leGFtcGxlLm9yZy97YX0ve2J9LyIsCisgICAgICAgICAgICAgICAgImh0dHA6Ly9leGFtcGxlLm9yZy9mcmVkL2Jhcm5leS8iLAorICAgICAgICAgICAgICAgICJmcmVkIiwgImJhcm5leSIpOworICAgICAgICBfdGVzdE1hdGNoaW5nKCJodHRwOi8vZXhhbXBsZS5vcmcvcGFnZTEje2F9IiwKKyAgICAgICAgICAgICAgICAiaHR0cDovL2V4YW1wbGUub3JnL3BhZ2UxI2ZyZWQiLAorICAgICAgICAgICAgICAgICJmcmVkIik7CisgICAgICAgIF90ZXN0TWF0Y2hpbmcoIntzY2hlbWV9Oi8vezIwfS5leGFtcGxlLm9yZz9kYXRlPXt3aWxtYX0mb3B0aW9uPXthfSIsCisgICAgICAgICAgICAgICAgImh0dHBzOi8vdGhpcy1pcy1zcGluYWwtdGFwLmV4YW1wbGUub3JnP2RhdGU9MjAwOCZvcHRpb249ZnJlZCIsCisgICAgICAgICAgICAgICAgImh0dHBzIiwgInRoaXMtaXMtc3BpbmFsLXRhcCIsICIyMDA4IiwgImZyZWQiKTsKKyAgICAgICAgX3Rlc3RNYXRjaGluZygiaHR0cDovL2V4YW1wbGUub3JnL3thLWJ9IiwKKyAgICAgICAgICAgICAgICAiaHR0cDovL2V4YW1wbGUub3JnL25vbmUlMjBvZiUyMHRoZSUyMGFib3ZlIiwKKyAgICAgICAgICAgICAgICAibm9uZSUyMG9mJTIwdGhlJTIwYWJvdmUiKTsKKyAgICAgICAgX3Rlc3RNYXRjaGluZygiaHR0cDovL2V4YW1wbGUub3JnP3twfSIsCisgICAgICAgICAgICAgICAgImh0dHA6Ly9leGFtcGxlLm9yZz9xdW90ZT10bytibytvcitub3QrdG8rYmUiLAorICAgICAgICAgICAgICAgICJxdW90ZT10bytibytvcitub3QrdG8rYmUiKTsKKyAgICAgICAgX3Rlc3RNYXRjaGluZygiaHR0cDovL2V4YW1wbGUuY29tL29yZGVyL3tjfS97Y30ve2N9LyIsCisgICAgICAgICAgICAgICAgImh0dHA6Ly9leGFtcGxlLmNvbS9vcmRlci9jaGVlc2VidXJnZXIvY2hlZXNlYnVyZ2VyL2NoZWVzZWJ1cmdlci8iLAorICAgICAgICAgICAgICAgICJjaGVlc2VidXJnZXIiLCAiY2hlZXNlYnVyZ2VyIiwgImNoZWVzZWJ1cmdlciIpOworICAgICAgICBfdGVzdE1hdGNoaW5nKCJodHRwOi8vZXhhbXBsZS5jb20ve3F9IiwKKyAgICAgICAgICAgICAgICAiaHR0cDovL2V4YW1wbGUuY29tL2h1bGxvI3dvcmxkIiwKKyAgICAgICAgICAgICAgICAiaHVsbG8jd29ybGQiKTsKKyAgICAgICAgX3Rlc3RNYXRjaGluZygiaHR0cDovL2V4YW1wbGUuY29tL3tlfS8iLAorICAgICAgICAgICAgICAgICJodHRwOi8vZXhhbXBsZS5jb20veHh4LyIsCisgICAgICAgICAgICAgICAgInh4eCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRlbXBsYXRlUmVnZXhlcygpIHsKKyAgICAgICAgX3Rlc3RUZW1wbGF0ZVJlZ2V4KCJ7YTp9IiwgIigiICsgVXJpVGVtcGxhdGVQYXJzZXIuVEVNUExBVEVfVkFMVUVfUEFUVEVSTi5wYXR0ZXJuKCkgKyAiKSIpOworICAgICAgICBfdGVzdFRlbXBsYXRlUmVnZXgoInthOi4qfSIsICIoLiopIik7CisgICAgICAgIF90ZXN0VGVtcGxhdGVSZWdleCgie2E6ICAuKn0iLCAiKC4qKSIpOworICAgICAgICBfdGVzdFRlbXBsYXRlUmVnZXgoInthOiAgLiogIH0iLCAiKC4qKSIpOworICAgICAgICBfdGVzdFRlbXBsYXRlUmVnZXgoInthIDogIC4qICB9IiwgIiguKikiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3RUZW1wbGF0ZVJlZ2V4KGZpbmFsIFN0cmluZyB0ZW1wbGF0ZSwgZmluYWwgU3RyaW5nIHJlZ2V4KSB7CisgICAgICAgIGZpbmFsIFVyaVRlbXBsYXRlIHQgPSBuZXcgVXJpVGVtcGxhdGUodGVtcGxhdGUpOworICAgICAgICBhc3NlcnRFcXVhbHMocmVnZXgsIHQuZ2V0UGF0dGVybigpLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlZ2V4TWF0Y2hpbmcoKSB7CisgICAgICAgIF90ZXN0TWF0Y2hpbmcoIntiOiAuK30iLAorICAgICAgICAgICAgICAgICIxIiwKKyAgICAgICAgICAgICAgICAiMSIpOworCisgICAgICAgIF90ZXN0TWF0Y2hpbmcoIntiOiAuK30iLAorICAgICAgICAgICAgICAgICIxLzIvMyIsCisgICAgICAgICAgICAgICAgIjEvMi8zIik7CisKKyAgICAgICAgX3Rlc3RNYXRjaGluZygiaHR0cDovL2V4YW1wbGUub3JnL3thfS97YjogLit9IiwKKyAgICAgICAgICAgICAgICAiaHR0cDovL2V4YW1wbGUub3JnL2ZyZWQvYmFybmV5L3gveS96IiwKKyAgICAgICAgICAgICAgICAiZnJlZCIsICJiYXJuZXkveC95L3oiKTsKKworICAgICAgICBfdGVzdE1hdGNoaW5nKCJ7YjogXFxkK30iLAorICAgICAgICAgICAgICAgICIxMjM0NTY3ODkwIiwKKyAgICAgICAgICAgICAgICAiMTIzNDU2Nzg5MCIpOworCisgICAgICAgIF90ZXN0TWF0Y2hpbmcoInthfS97YjogLit9L3tjfXtkOiAoLy4qKT99IiwKKyAgICAgICAgICAgICAgICAiMS8yLzMvNCIsCisgICAgICAgICAgICAgICAgIjEiLCAiMi8zIiwgIjQiLCAiIik7CisKKyAgICAgICAgX3Rlc3RNYXRjaGluZygie2F9L3tiOiAuK30ve2N9e2Q6ICgvLiopP30iLAorICAgICAgICAgICAgICAgICIxLzIvMy80LyIsCisgICAgICAgICAgICAgICAgIjEiLCAiMi8zIiwgIjQiLCAiLyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlZ2V4TWF0Y2hpbmdXaXRoTmVzdGVkR3JvdXBzKCkgeworICAgICAgICBfdGVzdE1hdGNoaW5nKCJ7YjogKFxcZCspfSIsCisgICAgICAgICAgICAgICAgIjEyMzQ1Njc4OTAiLAorICAgICAgICAgICAgICAgICIxMjM0NTY3ODkwIik7CisKKyAgICAgICAgX3Rlc3RNYXRjaGluZygie2I6IChcXGQrKS0oXFxkKyktKFxcZCspfSIsCisgICAgICAgICAgICAgICAgIjEyLTM0LTU2IiwKKyAgICAgICAgICAgICAgICAiMTItMzQtNTYiKTsKKworICAgICAgICBfdGVzdE1hdGNoaW5nKCJ7YTogKFxcZCkoXFxkKil9LXtiOiAoXFxkKShcXGQqKX0te2M6IChcXGQpKFxcZCopfSIsCisgICAgICAgICAgICAgICAgIjEyLTM0LTU2IiwKKyAgICAgICAgICAgICAgICAiMTIiLCAiMzQiLCAiNTYiKTsKKyAgICB9CisKKyAgICB2b2lkIF90ZXN0TWF0Y2hpbmcoZmluYWwgU3RyaW5nIHRlbXBsYXRlLCBmaW5hbCBTdHJpbmcgdXJpLCBmaW5hbCBTdHJpbmcuLi4gdmFsdWVzKSB7CisgICAgICAgIGZpbmFsIFVyaVRlbXBsYXRlIHQgPSBuZXcgVXJpVGVtcGxhdGUodGVtcGxhdGUpOworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IG0gPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKworICAgICAgICBib29sZWFuIGlzTWF0Y2ggPSB0Lm1hdGNoKHVyaSwgbSk7CisgICAgICAgIGFzc2VydFRydWUoaXNNYXRjaCk7CisgICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZXMubGVuZ3RoLCB0LmdldFRlbXBsYXRlVmFyaWFibGVzKCkuc2l6ZSgpKTsKKworICAgICAgICBmaW5hbCBJdGVyYXRvcjxTdHJpbmc+IG5hbWVzID0gdC5nZXRUZW1wbGF0ZVZhcmlhYmxlcygpLml0ZXJhdG9yKCk7CisgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIHZhbHVlIDogdmFsdWVzKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWFwVmFsdWUgPSBtLmdldChuYW1lcy5uZXh0KCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlLCBtYXBWYWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gbWF0Y2hlZFZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICBpc01hdGNoID0gdC5tYXRjaCh1cmksIG1hdGNoZWRWYWx1ZXMpOworICAgICAgICBhc3NlcnRUcnVlKGlzTWF0Y2gpOworICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVzLmxlbmd0aCwgbWF0Y2hlZFZhbHVlcy5zaXplKCkpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVzW2ldLCBtYXRjaGVkVmFsdWVzLmdldChpKSk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBNYXRjaFJlc3VsdCBtciA9IHQuZ2V0UGF0dGVybigpLm1hdGNoKHVyaSk7CisgICAgICAgIGFzc2VydE5vdE51bGwobXIpOworICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVzLmxlbmd0aCwgbXIuZ3JvdXBDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHVyaSwgbXIuZ3JvdXAoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh1cmksIG1yLmdyb3VwKDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1yLnN0YXJ0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHModXJpLmxlbmd0aCgpLCBtci5lbmQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtci5zdGFydCgwKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh1cmkubGVuZ3RoKCksIG1yLmVuZCgwKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbXIuZ3JvdXBDb3VudCgpOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZXNbaV0sIG1yLmdyb3VwKGkgKyAxKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModmFsdWVzW2ldLCB1cmkuc3Vic3RyaW5nKG1yLnN0YXJ0KGkgKyAxKSwgbXIuZW5kKGkgKyAxKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TnVsbE1hdGNoaW5nKCkgeworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IG0gPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKworICAgICAgICBVcmlUZW1wbGF0ZSB0ID0gVXJpVGVtcGxhdGUuRU1QVFk7CisgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgdC5tYXRjaCgiLyIsIG0pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHQubWF0Y2gobnVsbCwgbSkpOworICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgdC5tYXRjaCgiIiwgbSkpOworCisgICAgICAgIHQgPSBuZXcgVXJpVGVtcGxhdGUoIi97dn0iKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCB0Lm1hdGNoKG51bGwsIG0pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHQubWF0Y2goIi9vbmUiLCBtKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3JkZXIoKSB7CisgICAgICAgIGZpbmFsIExpc3Q8VXJpVGVtcGxhdGU+IGwgPSBuZXcgQXJyYXlMaXN0PFVyaVRlbXBsYXRlPigpOworCisgICAgICAgIGwuYWRkKFVyaVRlbXBsYXRlLkVNUFRZKTsKKyAgICAgICAgbC5hZGQobmV3IFVyaVRlbXBsYXRlKCIve2F9IikpOworICAgICAgICBsLmFkZChuZXcgVXJpVGVtcGxhdGUoIi97YX0ve2J9IikpOworICAgICAgICBsLmFkZChuZXcgVXJpVGVtcGxhdGUoIi97YX0vb25lL3tifSIpKTsKKworICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGwsIFVyaVRlbXBsYXRlLkNPTVBBUkFUT1IpOworCisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgVXJpVGVtcGxhdGUoIi97YX0vb25lL3tifSIpLmdldFRlbXBsYXRlKCksCisgICAgICAgICAgICAgICAgbC5nZXQoMCkuZ2V0VGVtcGxhdGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgVXJpVGVtcGxhdGUoIi97YX0ve2J9IikuZ2V0VGVtcGxhdGUoKSwKKyAgICAgICAgICAgICAgICBsLmdldCgxKS5nZXRUZW1wbGF0ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBVcmlUZW1wbGF0ZSgiL3thfSIpLmdldFRlbXBsYXRlKCksCisgICAgICAgICAgICAgICAgbC5nZXQoMikuZ2V0VGVtcGxhdGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhVcmlUZW1wbGF0ZS5FTVBUWS5nZXRUZW1wbGF0ZSgpLAorICAgICAgICAgICAgICAgIGwuZ2V0KDMpLmdldFRlbXBsYXRlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9yZGVyRHVwbGljaXRQYXJhbXMoKSB7CisgICAgICAgIGZpbmFsIExpc3Q8VXJpVGVtcGxhdGU+IGwgPSBuZXcgQXJyYXlMaXN0PFVyaVRlbXBsYXRlPigpOworCisgICAgICAgIGwuYWRkKG5ldyBVcmlUZW1wbGF0ZSgiL3thfSIpKTsKKyAgICAgICAgbC5hZGQobmV3IFVyaVRlbXBsYXRlKCIve2F9L3thfSIpKTsKKworICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGwsIFVyaVRlbXBsYXRlLkNPTVBBUkFUT1IpOworCisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgVXJpVGVtcGxhdGUoIi97YX0ve2F9IikuZ2V0VGVtcGxhdGUoKSwKKyAgICAgICAgICAgICAgICBsLmdldCgwKS5nZXRUZW1wbGF0ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBVcmlUZW1wbGF0ZSgiL3thfSIpLmdldFRlbXBsYXRlKCksCisgICAgICAgICAgICAgICAgbC5nZXQoMSkuZ2V0VGVtcGxhdGUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3Vic3RpdHV0aW9uQXJyYXkoKSB7CisgICAgICAgIF90ZXN0U3Vic3RpdHV0aW9uQXJyYXkoImh0dHA6Ly9leGFtcGxlLm9yZy97YX0ve2J9LyIsCisgICAgICAgICAgICAgICAgImh0dHA6Ly9leGFtcGxlLm9yZy9mcmVkL2Jhcm5leS8iLAorICAgICAgICAgICAgICAgICJmcmVkIiwgImJhcm5leSIpOworICAgICAgICBfdGVzdFN1YnN0aXR1dGlvbkFycmF5KCJodHRwOi8vZXhhbXBsZS5vcmcvcGFnZTEje2F9IiwKKyAgICAgICAgICAgICAgICAiaHR0cDovL2V4YW1wbGUub3JnL3BhZ2UxI2ZyZWQiLAorICAgICAgICAgICAgICAgICJmcmVkIik7CisgICAgICAgIF90ZXN0U3Vic3RpdHV0aW9uQXJyYXkoIntzY2hlbWV9Oi8vezIwfS5leGFtcGxlLm9yZz9kYXRlPXt3aWxtYX0mb3B0aW9uPXthfSIsCisgICAgICAgICAgICAgICAgImh0dHBzOi8vdGhpcy1pcy1zcGluYWwtdGFwLmV4YW1wbGUub3JnP2RhdGU9Jm9wdGlvbj1mcmVkIiwKKyAgICAgICAgICAgICAgICAiaHR0cHMiLCAidGhpcy1pcy1zcGluYWwtdGFwIiwgIiIsICJmcmVkIik7CisgICAgICAgIF90ZXN0U3Vic3RpdHV0aW9uQXJyYXkoImh0dHA6Ly9leGFtcGxlLm9yZy97YS1ifSIsCisgICAgICAgICAgICAgICAgImh0dHA6Ly9leGFtcGxlLm9yZy9ub25lJTIwb2YlMjB0aGUlMjBhYm92ZSIsCisgICAgICAgICAgICAgICAgIm5vbmUlMjBvZiUyMHRoZSUyMGFib3ZlIik7CisgICAgICAgIF90ZXN0U3Vic3RpdHV0aW9uQXJyYXkoImh0dHA6Ly9leGFtcGxlLm9yZz97cH0iLAorICAgICAgICAgICAgICAgICJodHRwOi8vZXhhbXBsZS5vcmc/cXVvdGU9dG8rYm8rb3Irbm90K3RvK2JlIiwKKyAgICAgICAgICAgICAgICAicXVvdGU9dG8rYm8rb3Irbm90K3RvK2JlIik7CisgICAgICAgIF90ZXN0U3Vic3RpdHV0aW9uQXJyYXkoImh0dHA6Ly9leGFtcGxlLmNvbS9vcmRlci97Y30ve2N9L3tjfS8iLAorICAgICAgICAgICAgICAgICJodHRwOi8vZXhhbXBsZS5jb20vb3JkZXIvY2hlZXNlYnVyZ2VyL2NoZWVzZWJ1cmdlci9jaGVlc2VidXJnZXIvIiwKKyAgICAgICAgICAgICAgICAiY2hlZXNlYnVyZ2VyIik7CisgICAgICAgIF90ZXN0U3Vic3RpdHV0aW9uQXJyYXkoImh0dHA6Ly9leGFtcGxlLmNvbS97cX0iLAorICAgICAgICAgICAgICAgICJodHRwOi8vZXhhbXBsZS5jb20vaHVsbG8jd29ybGQiLAorICAgICAgICAgICAgICAgICJodWxsbyN3b3JsZCIpOworICAgICAgICBfdGVzdFN1YnN0aXR1dGlvbkFycmF5KCJodHRwOi8vZXhhbXBsZS5jb20ve2V9LyIsCisgICAgICAgICAgICAgICAgImh0dHA6Ly9leGFtcGxlLmNvbS8vIiwKKyAgICAgICAgICAgICAgICAiIik7CisgICAgICAgIF90ZXN0U3Vic3RpdHV0aW9uQXJyYXkoImh0dHA6Ly9leGFtcGxlLmNvbS97YX0ve2J9L3thfSIsCisgICAgICAgICAgICAgICAgImh0dHA6Ly9leGFtcGxlLmNvbS9mcmVkL2Jhcm5leS9mcmVkIiwKKyAgICAgICAgICAgICAgICAiZnJlZCIsICJiYXJuZXkiLCAiam9lIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R3JvdXBJbmRleGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFVyaVRlbXBsYXRlIHRlbXBsYXRlID0gbmV3IFVyaVRlbXBsYXRlKCIvYSIpOworICAgICAgICBhc3NlcnRUaGF0KHRlbXBsYXRlLmdldFBhdHRlcm4oKS5nZXRHcm91cEluZGV4ZXMoKSwgZXF1YWxUbyhuZXcgaW50WzBdKSk7CisKKyAgICAgICAgdGVtcGxhdGUgPSBuZXcgVXJpVGVtcGxhdGUoIi97YX0iKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh0ZW1wbGF0ZS5nZXRQYXR0ZXJuKCkuZ2V0R3JvdXBJbmRleGVzKCksIGVxdWFsVG8obmV3IGludFtdIHsxfSkpOworCisgICAgICAgIHRlbXBsYXRlID0gbmV3IFVyaVRlbXBsYXRlKCIve2F9L2IiKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh0ZW1wbGF0ZS5nZXRQYXR0ZXJuKCkuZ2V0R3JvdXBJbmRleGVzKCksIGVxdWFsVG8obmV3IGludFtdIHsxfSkpOworCisgICAgICAgIHRlbXBsYXRlID0gbmV3IFVyaVRlbXBsYXRlKCIve2F9L3tifSIpOworICAgICAgICBhc3NlcnRUaGF0KHRlbXBsYXRlLmdldFBhdHRlcm4oKS5nZXRHcm91cEluZGV4ZXMoKSwgZXF1YWxUbyhuZXcgaW50W10gezEsIDJ9KSk7CisKKyAgICAgICAgdGVtcGxhdGUgPSBuZXcgVXJpVGVtcGxhdGUoIi97YX0ve2J9Iik7CisgICAgICAgIGFzc2VydFRoYXQodGVtcGxhdGUuZ2V0UGF0dGVybigpLmdldEdyb3VwSW5kZXhlcygpLCBlcXVhbFRvKG5ldyBpbnRbXSB7MSwgMn0pKTsKKworICAgICAgICB0ZW1wbGF0ZSA9IG5ldyBVcmlUZW1wbGF0ZSgiL3thfS9iL3tjfSIpOworICAgICAgICBhc3NlcnRUaGF0KHRlbXBsYXRlLmdldFBhdHRlcm4oKS5nZXRHcm91cEluZGV4ZXMoKSwgZXF1YWxUbyhuZXcgaW50W10gezEsIDJ9KSk7CisKKyAgICAgICAgdGVtcGxhdGUgPSBuZXcgVXJpVGVtcGxhdGUoIi97YTogKGFiYykrfSIpOworICAgICAgICBhc3NlcnRUaGF0KHRlbXBsYXRlLmdldFBhdHRlcm4oKS5nZXRHcm91cEluZGV4ZXMoKSwgZXF1YWxUbyhuZXcgaW50W10gezF9KSk7CisKKyAgICAgICAgdGVtcGxhdGUgPSBuZXcgVXJpVGVtcGxhdGUoIi97YTogKGFiYykrfS9iIik7CisgICAgICAgIGFzc2VydFRoYXQodGVtcGxhdGUuZ2V0UGF0dGVybigpLmdldEdyb3VwSW5kZXhlcygpLCBlcXVhbFRvKG5ldyBpbnRbXSB7MX0pKTsKKworICAgICAgICB0ZW1wbGF0ZSA9IG5ldyBVcmlUZW1wbGF0ZSgiL3thOiAoYWJjKSt9L3tifSIpOworICAgICAgICBhc3NlcnRUaGF0KHRlbXBsYXRlLmdldFBhdHRlcm4oKS5nZXRHcm91cEluZGV4ZXMoKSwgZXF1YWxUbyhuZXcgaW50W10gezEsIDN9KSk7CisKKyAgICAgICAgdGVtcGxhdGUgPSBuZXcgVXJpVGVtcGxhdGUoIi97YTogKGFiYykrfS9iL3tjfSIpOworICAgICAgICBhc3NlcnRUaGF0KHRlbXBsYXRlLmdldFBhdHRlcm4oKS5nZXRHcm91cEluZGV4ZXMoKSwgZXF1YWxUbyhuZXcgaW50W10gezEsIDN9KSk7CisgICAgfQorCisgICAgdm9pZCBfdGVzdFN1YnN0aXR1dGlvbkFycmF5KGZpbmFsIFN0cmluZyB0ZW1wbGF0ZSwgZmluYWwgU3RyaW5nIHVyaSwgZmluYWwgU3RyaW5nLi4uIHZhbHVlcykgeworICAgICAgICBmaW5hbCBVcmlUZW1wbGF0ZSB0ID0gbmV3IFVyaVRlbXBsYXRlKHRlbXBsYXRlKTsKKworICAgICAgICBhc3NlcnRFcXVhbHModXJpLCB0LmNyZWF0ZVVSSSh2YWx1ZXMpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJzdGl0dXRpb25NYXAoKSB7CisgICAgICAgIF90ZXN0U3Vic3RpdHV0aW9uTWFwKCJodHRwOi8vZXhhbXBsZS5vcmcve2F9L3tifS8iLAorICAgICAgICAgICAgICAgICJodHRwOi8vZXhhbXBsZS5vcmcvZnJlZC9iYXJuZXkvIiwKKyAgICAgICAgICAgICAgICAiYSIsICJmcmVkIiwKKyAgICAgICAgICAgICAgICAiYiIsICJiYXJuZXkiKTsKKyAgICAgICAgX3Rlc3RTdWJzdGl0dXRpb25NYXAoImh0dHA6Ly9leGFtcGxlLm9yZy9wYWdlMSN7YX0iLAorICAgICAgICAgICAgICAgICJodHRwOi8vZXhhbXBsZS5vcmcvcGFnZTEjZnJlZCIsCisgICAgICAgICAgICAgICAgImEiLCAiZnJlZCIpOworICAgICAgICBfdGVzdFN1YnN0aXR1dGlvbk1hcCgie3NjaGVtZX06Ly97MjB9LmV4YW1wbGUub3JnP2RhdGU9e3dpbG1hfSZvcHRpb249e2F9IiwKKyAgICAgICAgICAgICAgICAiaHR0cHM6Ly90aGlzLWlzLXNwaW5hbC10YXAuZXhhbXBsZS5vcmc/ZGF0ZT0mb3B0aW9uPWZyZWQiLAorICAgICAgICAgICAgICAgICJzY2hlbWUiLCAiaHR0cHMiLAorICAgICAgICAgICAgICAgICIyMCIsICJ0aGlzLWlzLXNwaW5hbC10YXAiLAorICAgICAgICAgICAgICAgICJ3aWxtYSIsICIiLAorICAgICAgICAgICAgICAgICJhIiwgImZyZWQiKTsKKyAgICAgICAgX3Rlc3RTdWJzdGl0dXRpb25NYXAoImh0dHA6Ly9leGFtcGxlLm9yZy97YS1ifSIsCisgICAgICAgICAgICAgICAgImh0dHA6Ly9leGFtcGxlLm9yZy9ub25lJTIwb2YlMjB0aGUlMjBhYm92ZSIsCisgICAgICAgICAgICAgICAgImEtYiIsICJub25lJTIwb2YlMjB0aGUlMjBhYm92ZSIpOworICAgICAgICBfdGVzdFN1YnN0aXR1dGlvbk1hcCgiaHR0cDovL2V4YW1wbGUub3JnP3twfSIsCisgICAgICAgICAgICAgICAgImh0dHA6Ly9leGFtcGxlLm9yZz9xdW90ZT10bytibytvcitub3QrdG8rYmUiLAorICAgICAgICAgICAgICAgICJwIiwgInF1b3RlPXRvK2JvK29yK25vdCt0bytiZSIpOworICAgICAgICBfdGVzdFN1YnN0aXR1dGlvbk1hcCgiaHR0cDovL2V4YW1wbGUuY29tL29yZGVyL3tjfS97Y30ve2N9LyIsCisgICAgICAgICAgICAgICAgImh0dHA6Ly9leGFtcGxlLmNvbS9vcmRlci9jaGVlc2VidXJnZXIvY2hlZXNlYnVyZ2VyL2NoZWVzZWJ1cmdlci8iLAorICAgICAgICAgICAgICAgICJjIiwgImNoZWVzZWJ1cmdlciIpOworICAgICAgICBfdGVzdFN1YnN0aXR1dGlvbk1hcCgiaHR0cDovL2V4YW1wbGUuY29tL3txfSIsCisgICAgICAgICAgICAgICAgImh0dHA6Ly9leGFtcGxlLmNvbS9odWxsbyN3b3JsZCIsCisgICAgICAgICAgICAgICAgInEiLCAiaHVsbG8jd29ybGQiKTsKKyAgICAgICAgX3Rlc3RTdWJzdGl0dXRpb25NYXAoImh0dHA6Ly9leGFtcGxlLmNvbS97ZX0vIiwKKyAgICAgICAgICAgICAgICAiaHR0cDovL2V4YW1wbGUuY29tLy8iLAorICAgICAgICAgICAgICAgICJlIiwgIiIpOworICAgIH0KKworICAgIHZvaWQgX3Rlc3RTdWJzdGl0dXRpb25NYXAoZmluYWwgU3RyaW5nIHRlbXBsYXRlLCBmaW5hbCBTdHJpbmcgdXJpLCBmaW5hbCBTdHJpbmcuLi4gdmFyaWFibGVzQW5kdmFsdWVzKSB7CisgICAgICAgIGZpbmFsIFVyaVRlbXBsYXRlIHQgPSBuZXcgVXJpVGVtcGxhdGUodGVtcGxhdGUpOworCisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gdmFyaWFibGVNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YXJpYWJsZXNBbmR2YWx1ZXMubGVuZ3RoOyBpICs9IDIpIHsKKyAgICAgICAgICAgIHZhcmlhYmxlTWFwLnB1dCh2YXJpYWJsZXNBbmR2YWx1ZXNbaV0sIHZhcmlhYmxlc0FuZHZhbHVlc1tpICsgMV0pOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHVyaSwgdC5jcmVhdGVVUkkodmFyaWFibGVNYXApKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb3JtYWxpemVzVVJJcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0aGlzLnZhbGlkYXRlTm9ybWFsaXplKCIvc29tZS1wYXRoIiwgIi9zb21lLXBhdGgiKTsKKyAgICAgICAgdGhpcy52YWxpZGF0ZU5vcm1hbGl6ZSgiaHR0cDovL2V4YW1wbGUuY29tL3NvbWUvLi4vcGF0aCIsICJodHRwOi8vZXhhbXBsZS5jb20vcGF0aCIpOworICAgICAgICAvLyBub3RlLCB0aGF0IGZvbGxvd2luZyBiZWhhdmlvdXIgZGlmZmVycyBmcm9tIEplcnNleS0xLnggVXJpSGVscGVyLm5vcm1hbGl6ZSgpLCB0aGUgJy4uJyBzZWdtZW50IGlzIHNpbXBseSBsZWZ0IG91dCBpbgorICAgICAgICAvLyB0aGlzIGNhc2UsIHdoZXJlIG9sZGVyIFVyaUhlbHBlci5ub3JtYWxpemUoKSB3b3VsZCByZXR1cm4gdGhlIHBhdGggaW5jbHVkaW5nIHRoZSAnLi4nIHNlZ21lbnQuIEl0IGlzIGFsc28gbWVudGlvbmVkCisgICAgICAgIC8vIGluIHRoZSBVcmlUZW1wbGF0ZS5ub3JtYWxpemUoKSBqYXZhZG9jLgorICAgICAgICB0aGlzLnZhbGlkYXRlTm9ybWFsaXplKCJodHRwOi8vZXhhbXBsZS5jb20vLi4vcGF0aCIsICJodHRwOi8vZXhhbXBsZS5jb20vcGF0aCIpOworICAgICAgICB0aGlzLnZhbGlkYXRlTm9ybWFsaXplKCJodHRwOi8vZXhhbXBsZS5jb20vL3BhdGgiLCAiaHR0cDovL2V4YW1wbGUuY29tLy9wYXRoIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlTm9ybWFsaXplKGZpbmFsIFN0cmluZyBwYXRoLCBmaW5hbCBTdHJpbmcgZXhwZWN0ZWQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBVUkkgcmVzdWx0ID0gVXJpVGVtcGxhdGUubm9ybWFsaXplKHBhdGgpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHJlc3VsdC50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVRdWVyeVBhcmFtZXRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBVcmlUZW1wbGF0ZSB0bXBsID0gbmV3IFVyaVRlbXBsYXRlKCIvdGVzdHs/cXVlcnl9Iik7CisKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiByZXN1bHQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgdG1wbC5tYXRjaCgiL3Rlc3Q/cXVlcnk9eCIsIHJlc3VsdCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICJpbmNvcnJlY3Qgc2l6ZSBmb3IgbWF0Y2ggc3RyaW5nIiwKKyAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgIHJlc3VsdC5zaXplKCkKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgInF1ZXJ5IHBhcmFtZXRlciBpcyBub3QgbWF0Y2hlZCIsCisgICAgICAgICAgICAgICAgIngiLAorICAgICAgICAgICAgICAgIHJlc3VsdC5nZXQoInF1ZXJ5IikKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REb3VibGVRdWVyeVBhcmFtZXRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBVcmlUZW1wbGF0ZSB0bXBsID0gbmV3IFVyaVRlbXBsYXRlKCIvdGVzdHs/cXVlcnksc2Vjb25kUXVlcnl9Iik7CisKKyAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgdG1wbC5tYXRjaCgiL3Rlc3Q/cXVlcnk9eCZzZWNvbmRRdWVyeT15IiwgbGlzdCk7CisKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiByZXN1bHQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgdG1wbC5tYXRjaCgiL3Rlc3Q/cXVlcnk9eCZzZWNvbmRRdWVyeT15IiwgcmVzdWx0KTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgImluY29ycmVjdCBzaXplIGZvciBtYXRjaCBzdHJpbmciLAorICAgICAgICAgICAgICAgIDIsCisgICAgICAgICAgICAgICAgcmVzdWx0LnNpemUoKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAicXVlcnkgcGFyYW1ldGVyIGlzIG5vdCBtYXRjaGVkIiwKKyAgICAgICAgICAgICAgICAieCIsCisgICAgICAgICAgICAgICAgcmVzdWx0LmdldCgicXVlcnkiKQorICAgICAgICApOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgInF1ZXJ5IHBhcmFtZXRlciBpcyBub3QgbWF0Y2hlZCIsCisgICAgICAgICAgICAgICAgInkiLAorICAgICAgICAgICAgICAgIHJlc3VsdC5nZXQoInNlY29uZFF1ZXJ5IikKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXR0aW5nUXVlcnlQYXJhbWV0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgVXJpVGVtcGxhdGUgdG1wbCA9IG5ldyBVcmlUZW1wbGF0ZSgiL3Rlc3R7P3F1ZXJ5fSIpOworCisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gdmFsdWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgICAgIHZhbHVlcy5wdXQoInF1ZXJ5IiwgImV4YW1wbGUiKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgdXJpID0gdG1wbC5jcmVhdGVVUkkodmFsdWVzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICJxdWVyeSBzdHJpbmcgaXMgbm90IHNldCIsCisgICAgICAgICAgICAgICAgIi90ZXN0P3F1ZXJ5PWV4YW1wbGUiLAorICAgICAgICAgICAgICAgIHVyaQorICAgICAgICApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNldHRpbmdUd29RdWVyeVBhcmFtZXRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBVcmlUZW1wbGF0ZSB0bXBsID0gbmV3IFVyaVRlbXBsYXRlKCIvdGVzdHs/cXVlcnksb3RoZXJ9Iik7CisKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiB2YWx1ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgdmFsdWVzLnB1dCgicXVlcnkiLCAiZXhhbXBsZSIpOworICAgICAgICB2YWx1ZXMucHV0KCJvdGhlciIsICJvdGhlckV4YW1wbGUiKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgdXJpID0gdG1wbC5jcmVhdGVVUkkodmFsdWVzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICJxdWVyeSBzdHJpbmcgaXMgbm90IHNldCIsCisgICAgICAgICAgICAgICAgIi90ZXN0P3F1ZXJ5PWV4YW1wbGUmb3RoZXI9b3RoZXJFeGFtcGxlIiwKKyAgICAgICAgICAgICAgICB1cmkKKyAgICAgICAgKTsKKworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vdFNldHRpbmdRdWVyeVBhcmFtZXRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBVcmlUZW1wbGF0ZSB0bXBsID0gbmV3IFVyaVRlbXBsYXRlKCIvdGVzdHs/cXVlcnl9Iik7CisKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiB2YWx1ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgdXJpID0gdG1wbC5jcmVhdGVVUkkodmFsdWVzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICJxdWVyeSBzdHJpbmcgaXMgc2V0IiwKKyAgICAgICAgICAgICAgICAiL3Rlc3QiLAorICAgICAgICAgICAgICAgIHVyaQorICAgICAgICApOworCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0dGluZ01hdHJpeFBhcmFtZXRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBVcmlUZW1wbGF0ZSB0bXBsID0gbmV3IFVyaVRlbXBsYXRlKCIvdGVzdHs7bWF0cml4fS9vdGhlciIpOworCisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gdmFsdWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgICAgIHZhbHVlcy5wdXQoIm1hdHJpeCIsICJleGFtcGxlIik7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHVyaSA9IHRtcGwuY3JlYXRlVVJJKHZhbHVlcyk7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAicXVlcnkgc3RyaW5nIGlzIG5vdCBzZXQiLAorICAgICAgICAgICAgICAgICIvdGVzdDttYXRyaXg9ZXhhbXBsZS9vdGhlciIsCisgICAgICAgICAgICAgICAgdXJpCisgICAgICAgICk7CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXR0aW5nVHdvTWF0cml4UGFyYW1ldGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFVyaVRlbXBsYXRlIHRtcGwgPSBuZXcgVXJpVGVtcGxhdGUoIi90ZXN0ezttYXRyaXgsb3RoZXJ9L290aGVyIik7CisKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiB2YWx1ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgdmFsdWVzLnB1dCgibWF0cml4IiwgImV4YW1wbGUiKTsKKyAgICAgICAgdmFsdWVzLnB1dCgib3RoZXIiLCAib3RoZXJFeGFtcGxlIik7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHVyaSA9IHRtcGwuY3JlYXRlVVJJKHZhbHVlcyk7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAicXVlcnkgc3RyaW5nIGlzIG5vdCBzZXQiLAorICAgICAgICAgICAgICAgICIvdGVzdDttYXRyaXg9ZXhhbXBsZTtvdGhlcj1vdGhlckV4YW1wbGUvb3RoZXIiLAorICAgICAgICAgICAgICAgIHVyaQorICAgICAgICApOworCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0dGluZ1R3b1NlcGVyYXRlZE1hdHJpeFBhcmFtZXRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBVcmlUZW1wbGF0ZSB0bXBsID0gbmV3IFVyaVRlbXBsYXRlKCIvdGVzdHs7bWF0cml4fS9vdGhlcns7b3RoZXJ9Iik7CisKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiB2YWx1ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgdmFsdWVzLnB1dCgibWF0cml4IiwgImV4YW1wbGUiKTsKKyAgICAgICAgdmFsdWVzLnB1dCgib3RoZXIiLCAib3RoZXJFeGFtcGxlIik7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHVyaSA9IHRtcGwuY3JlYXRlVVJJKHZhbHVlcyk7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAicXVlcnkgc3RyaW5nIGlzIG5vdCBzZXQiLAorICAgICAgICAgICAgICAgICIvdGVzdDttYXRyaXg9ZXhhbXBsZS9vdGhlcjtvdGhlcj1vdGhlckV4YW1wbGUiLAorICAgICAgICAgICAgICAgIHVyaQorICAgICAgICApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vdFNldHRpbmdNYXRyaXhQYXJhbWV0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgVXJpVGVtcGxhdGUgdG1wbCA9IG5ldyBVcmlUZW1wbGF0ZSgiL3Rlc3R7O3F1ZXJ5fS9vdGhlciIpOworCisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gdmFsdWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHVyaSA9IHRtcGwuY3JlYXRlVVJJKHZhbHVlcyk7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAicXVlcnkgc3RyaW5nIGlzIHNldCIsCisgICAgICAgICAgICAgICAgIi90ZXN0L290aGVyIiwKKyAgICAgICAgICAgICAgICB1cmkKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICAvKgorICAgICAgICBSRkMgNjU3MCwgc2VjdGlvbiAzLjI6CisKKyAgICAgICAgICAgICBjb3VudCA6PSAoIm9uZSIsICJ0d28iLCAidGhyZWUiKQorICAgICAgICAgICAgIGRvbSAgIDo9ICgiZXhhbXBsZSIsICJjb20iKQorICAgICAgICAgICAgIGR1YiAgIDo9ICJtZS90b28iCisgICAgICAgICAgICAgaGVsbG8gOj0gIkhlbGxvIFdvcmxkISIKKyAgICAgICAgICAgICBoYWxmICA6PSAiNTAlIgorICAgICAgICAgICAgIHZhciAgIDo9ICJ2YWx1ZSIKKyAgICAgICAgICAgICB3aG8gICA6PSAiZnJlZCIKKyAgICAgICAgICAgICBiYXNlICA6PSAiaHR0cDovL2V4YW1wbGUuY29tL2hvbWUvIgorICAgICAgICAgICAgIHBhdGggIDo9ICIvZm9vL2JhciIKKyAgICAgICAgICAgICBsaXN0ICA6PSAoInJlZCIsICJncmVlbiIsICJibHVlIikKKyAgICAgICAgICAgICBrZXlzICA6PSBbKCJzZW1pIiwiOyIpLCgiZG90IiwiLiIpLCgiY29tbWEiLCIsIildCisgICAgICAgICAgICAgdiAgICAgOj0gIjYiCisgICAgICAgICAgICAgeCAgICAgOj0gIjEwMjQiCisgICAgICAgICAgICAgeSAgICAgOj0gIjc2OCIKKyAgICAgICAgICAgICBlbXB0eSA6PSAiIgorICAgICAgICAgICAgIGVtcHR5X2tleXMgIDo9IFtdCisgICAgICAgICAgICAgdW5kZWYgOj0gbnVsbAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3Q8U3RyaW5nPiBjb3VudCA9IEFycmF5cy5hc0xpc3QoIm9uZSIsICJ0d28iLCAidGhyZWUiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PFN0cmluZz4gZG9tID0gQXJyYXlzLmFzTGlzdCgiZXhhbXBsZSIsICJjb20iKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZHViID0gIm1lL3RvbyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGhlbGxvID0gIkhlbGxvIFdvcmxkISI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGhhbGYgPSAiNTAlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgdmFyID0gInZhbHVlIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgd2hvID0gImZyZWQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBiYXNlID0gImh0dHA6Ly9leGFtcGxlLmNvbS9ob21lLyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHBhdGggPSAiL2Zvby9iYXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3Q8U3RyaW5nPiBsaXN0ID0gQXJyYXlzLmFzTGlzdCgicmVkIiwgImdyZWVuIiwgImJsdWUiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IGtleXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKSB7eworICAgICAgICBwdXQoInNlbWkiLCAiOyIpOworICAgICAgICBwdXQoImRvdCIsICIuIik7CisgICAgICAgIHB1dCgiY29tbWEiLCAiLCIpOworICAgIH19OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB2ID0gIjYiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB4ID0gIjEwMjQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB5ID0gIjc2OCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGVtcHR5ID0gIiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBlbXB0eUtleXMgPSBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmZjNjU3MFF1ZXJ5VGVtcGxhdGVFeGFtcGxlcygpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICAgIFJGQyA2NTcwLCBzZWN0aW9uIDMuMi44OgorCisgICAgICAgICAgICAgICB7P3dob30gICAgICAgICAgICAgP3dobz1mcmVkCisgICAgICAgICAgICAgICB7P2hhbGZ9ICAgICAgICAgICAgP2hhbGY9NTAlMjUKKyAgICAgICAgICAgICAgIHs/eCx5fSAgICAgICAgICAgICA/eD0xMDI0Jnk9NzY4CisgICAgICAgICAgICAgICB7P3gseSxlbXB0eX0gICAgICAgP3g9MTAyNCZ5PTc2OCZlbXB0eT0KKyAgICAgICAgICAgICAgIHs/eCx5LHVuZGVmfSAgICAgICA/eD0xMDI0Jnk9NzY4CisgICAgICAgICAgICAgICB7P3ZhcjozfSAgICAgICAgICAgP3Zhcj12YWwKKyAgICAgICAgICAgICAgIHs/bGlzdH0gICAgICAgICAgICA/bGlzdD1yZWQsZ3JlZW4sYmx1ZQorICAgICAgICAgICAgICAgez9saXN0Kn0gICAgICAgICAgID9saXN0PXJlZCZsaXN0PWdyZWVuJmxpc3Q9Ymx1ZQorICAgICAgICAgICAgICAgez9rZXlzfSAgICAgICAgICAgID9rZXlzPXNlbWksJTNCLGRvdCwuLGNvbW1hLCUyQworICAgICAgICAgICAgICAgez9rZXlzKn0gICAgICAgICAgID9zZW1pPSUzQiZkb3Q9LiZjb21tYT0lMkMKKyAgICAgICAgKi8KKworICAgICAgICBhc3NlcnRFbmNvZGVkUXVlcnlUZW1wbGF0ZUV4cGFuc2lvbigiP3dobz1mcmVkIiwgIns/d2hvfSIsIHdobyk7CisgICAgICAgIGFzc2VydEVuY29kZWRRdWVyeVRlbXBsYXRlRXhwYW5zaW9uKCI/aGFsZj01MCUyNSIsICJ7P2hhbGZ9IiwgaGFsZik7CisgICAgICAgIGFzc2VydEVuY29kZWRRdWVyeVRlbXBsYXRlRXhwYW5zaW9uKCI/eD0xMDI0Jnk9NzY4IiwgIns/eCx5fSIsIHgsIHkpOworICAgICAgICBhc3NlcnRFbmNvZGVkUXVlcnlUZW1wbGF0ZUV4cGFuc2lvbigiP3g9MTAyNCZ5PTc2OCZlbXB0eT0iLCAiez94LHksZW1wdHl9IiwgeCwgeSwgZW1wdHkpOworICAgICAgICBhc3NlcnRFbmNvZGVkUXVlcnlUZW1wbGF0ZUV4cGFuc2lvbigiP3g9MTAyNCZ5PTc2OCIsICJ7P3gseSx1bmRlZn0iLCB4LCB5KTsKKworICAgICAgICAvLyBUT0RPIGFzc2VydEVuY29kZWRRdWVyeVRlbXBsYXRlRXhwYW5zaW9uKCI/dmFyPXZhbCIsICJ7P3ZhcjozfSIsIHZhcik7CisgICAgICAgIC8vIFRPRE8gYXNzZXJ0RW5jb2RlZFF1ZXJ5VGVtcGxhdGVFeHBhbnNpb24oIj9saXN0PXJlZCxncmVlbixibHVlIiwgIns/bGlzdH0iLCBsaXN0KTsKKyAgICAgICAgLy8gVE9ETyBhc3NlcnRFbmNvZGVkUXVlcnlUZW1wbGF0ZUV4cGFuc2lvbigiP2xpc3Q9cmVkJmxpc3Q9Z3JlZW4mbGlzdD1ibHVlIiwgIns/bGlzdCp9IiwgbGlzdCk7CisgICAgICAgIC8vIFRPRE8gYXNzZXJ0RW5jb2RlZFF1ZXJ5VGVtcGxhdGVFeHBhbnNpb24oIj9rZXlzPXNlbWksJTNCLGRvdCwuLGNvbW1hLCUyQyIsICJ7P2tleXN9Iiwga2V5cyk7CisgICAgICAgIC8vIFRPRE8gYXNzZXJ0RW5jb2RlZFF1ZXJ5VGVtcGxhdGVFeHBhbnNpb24oIj9zZW1pPSUzQiZkb3Q9LiZjb21tYT0lMkMiLCAiez9rZXlzKn0iLCBrZXlzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RW5jb2RlZFF1ZXJ5VGVtcGxhdGVFeHBhbnNpb24oZmluYWwgU3RyaW5nIGV4cGVjdGVkRXhwYW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcXVlcnlUZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0Li4uIHZhbHVlcykgeworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgZW5jb2RlZCBxdWVyeSB0ZW1wbGF0ZSBleHBhbnNpb24gcmVzdWx0LiIsCisgICAgICAgICAgICAgICAgZXhwZWN0ZWRFeHBhbnNpb24sCisgICAgICAgICAgICAgICAgVXJpVGVtcGxhdGUuY3JlYXRlVVJJKG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIHF1ZXJ5VGVtcGxhdGUsIG51bGwsIHZhbHVlcywgdHJ1ZSwgZmFsc2UpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RW5jb2RlZFF1ZXJ5VGVtcGxhdGVFeHBhbnNpb24oZmluYWwgU3RyaW5nIGV4cGVjdGVkRXhwYW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcXVlcnlUZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWFwPFN0cmluZywgPz4gdmFsdWVzKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBlbmNvZGVkIHF1ZXJ5IHRlbXBsYXRlIGV4cGFuc2lvbiByZXN1bHQuIiwKKyAgICAgICAgICAgICAgICBleHBlY3RlZEV4cGFuc2lvbiwKKyAgICAgICAgICAgICAgICBVcmlUZW1wbGF0ZS5jcmVhdGVVUkkobnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgcXVlcnlUZW1wbGF0ZSwgbnVsbCwgdmFsdWVzLCB0cnVlLCBmYWxzZSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJmYzY1NzBNYXRyaXhUZW1wbGF0ZUV4YW1wbGVzKCkgeworICAgICAgICAvKgorICAgICAgICAgICAgUkZDIDY1NzAsIHNlY3Rpb24gMy4yLjc6CisKKyAgICAgICAgICAgICAgIHs7d2hvfSAgICAgICAgICAgICA7d2hvPWZyZWQKKyAgICAgICAgICAgICAgIHs7aGFsZn0gICAgICAgICAgICA7aGFsZj01MCUyNQorICAgICAgICAgICAgICAgeztlbXB0eX0gICAgICAgICAgIDtlbXB0eQorICAgICAgICAgICAgICAgezt2LGVtcHR5LHdob30gICAgIDt2PTY7ZW1wdHk7d2hvPWZyZWQKKyAgICAgICAgICAgICAgIHs7dixiYXIsd2hvfSAgICAgICA7dj02O3dobz1mcmVkCisgICAgICAgICAgICAgICB7O3gseX0gICAgICAgICAgICAgO3g9MTAyNDt5PTc2OAorICAgICAgICAgICAgICAgezt4LHksZW1wdHl9ICAgICAgIDt4PTEwMjQ7eT03Njg7ZW1wdHkKKyAgICAgICAgICAgICAgIHs7eCx5LHVuZGVmfSAgICAgICA7eD0xMDI0O3k9NzY4CisgICAgICAgICAgICAgICB7O2hlbGxvOjV9ICAgICAgICAgO2hlbGxvPUhlbGxvCisgICAgICAgICAgICAgICB7O2xpc3R9ICAgICAgICAgICAgO2xpc3Q9cmVkLGdyZWVuLGJsdWUKKyAgICAgICAgICAgICAgIHs7bGlzdCp9ICAgICAgICAgICA7bGlzdD1yZWQ7bGlzdD1ncmVlbjtsaXN0PWJsdWUKKyAgICAgICAgICAgICAgIHs7a2V5c30gICAgICAgICAgICA7a2V5cz1zZW1pLCUzQixkb3QsLixjb21tYSwlMkMKKyAgICAgICAgICAgICAgIHs7a2V5cyp9ICAgICAgICAgICA7c2VtaT0lM0I7ZG90PS47Y29tbWE9JTJDCisgICAgICAgKi8KKyAgICAgICAgYXNzZXJ0RW5jb2RlZFBhdGhUZW1wbGF0ZUV4cGFuc2lvbigiO3dobz1mcmVkIiwgIns7d2hvfSIsIHdobyk7CisgICAgICAgIGFzc2VydEVuY29kZWRQYXRoVGVtcGxhdGVFeHBhbnNpb24oIjtoYWxmPTUwJTI1IiwgIns7aGFsZn0iLCBoYWxmKTsKKyAgICAgICAgYXNzZXJ0RW5jb2RlZFBhdGhUZW1wbGF0ZUV4cGFuc2lvbigiO2VtcHR5IiwgIns7ZW1wdHl9IiwgZW1wdHkpOworICAgICAgICBhc3NlcnRFbmNvZGVkUGF0aFRlbXBsYXRlRXhwYW5zaW9uKCI7dj02O2VtcHR5O3dobz1mcmVkIiwgIns7dixlbXB0eSx3aG99IiwgdiwgZW1wdHksIHdobyk7CisgICAgICAgIGFzc2VydEVuY29kZWRQYXRoVGVtcGxhdGVFeHBhbnNpb24oIjt2PTY7d2hvPWZyZWQiLCAiezt2LGJhcix3aG99IiwgbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCkge3sKKyAgICAgICAgICAgIHB1dCgidiIsIHYpOworICAgICAgICAgICAgcHV0KCJ3aG8iLCB3aG8pOworICAgICAgICB9fSk7CisgICAgICAgIGFzc2VydEVuY29kZWRQYXRoVGVtcGxhdGVFeHBhbnNpb24oIjt4PTEwMjQ7eT03NjgiLCAiezt4LHl9IiwgeCwgeSk7CisgICAgICAgIGFzc2VydEVuY29kZWRQYXRoVGVtcGxhdGVFeHBhbnNpb24oIjt4PTEwMjQ7eT03Njg7ZW1wdHkiLCAiezt4LHksZW1wdHl9IiwgeCwgeSwgZW1wdHkpOworICAgICAgICBhc3NlcnRFbmNvZGVkUGF0aFRlbXBsYXRlRXhwYW5zaW9uKCI7eD0xMDI0O3k9NzY4IiwgIns7eCx5LHVuZGVmfSIsIHgsIHkpOworICAgICAgICAvLyBUT0RPIGFzc2VydEVuY29kZWRQYXRoVGVtcGxhdGVFeHBhbnNpb24oIjtoZWxsbz1IZWxsbyIsICJ7O2hlbGxvOjV9IiwgaGVsbG8pOworICAgICAgICAvLyBUT0RPIGFzc2VydEVuY29kZWRQYXRoVGVtcGxhdGVFeHBhbnNpb24oIjtsaXN0PXJlZCxncmVlbixibHVlIiwgIns7bGlzdH0iLCBsaXN0KTsKKyAgICAgICAgLy8gVE9ETyBhc3NlcnRFbmNvZGVkUGF0aFRlbXBsYXRlRXhwYW5zaW9uKCI7bGlzdD1yZWQ7bGlzdD1ncmVlbjtsaXN0PWJsdWUiLCAieztsaXN0Kn0iLCBsaXN0KTsKKyAgICAgICAgLy8gVE9ETyBhc3NlcnRFbmNvZGVkUGF0aFRlbXBsYXRlRXhwYW5zaW9uKCI7a2V5cz1zZW1pLCUzQixkb3QsLixjb21tYSwlMkMiLCAieztrZXlzfSIsIGtleXMpOworICAgICAgICAvLyBUT0RPIGFzc2VydEVuY29kZWRQYXRoVGVtcGxhdGVFeHBhbnNpb24oIjtzZW1pPSUzQjtkb3Q9Ljtjb21tYT0lMkMiLCAieztrZXlzKn0iLCBrZXlzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RW5jb2RlZFBhdGhUZW1wbGF0ZUV4cGFuc2lvbihmaW5hbCBTdHJpbmcgZXhwZWN0ZWRFeHBhbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBhdGhUZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QuLi4gdmFsdWVzKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBlbmNvZGVkIG1hdHJpeCBwYXJhbWV0ZXIgdGVtcGxhdGUgZXhwYW5zaW9uIHJlc3VsdC4iLAorICAgICAgICAgICAgICAgIGV4cGVjdGVkRXhwYW5zaW9uLAorICAgICAgICAgICAgICAgIFVyaVRlbXBsYXRlLmNyZWF0ZVVSSShudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBwYXRoVGVtcGxhdGUsIG51bGwsIG51bGwsIHZhbHVlcywgdHJ1ZSwgZmFsc2UpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0RW5jb2RlZFBhdGhUZW1wbGF0ZUV4cGFuc2lvbihmaW5hbCBTdHJpbmcgZXhwZWN0ZWRFeHBhbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBhdGhUZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCA/PiB2YWx1ZXMpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGVuY29kZWQgbWF0cml4IHBhcmFtZXRlciB0ZW1wbGF0ZSBleHBhbnNpb24gcmVzdWx0LiIsCisgICAgICAgICAgICAgICAgZXhwZWN0ZWRFeHBhbnNpb24sCisgICAgICAgICAgICAgICAgVXJpVGVtcGxhdGUuY3JlYXRlVVJJKG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIHBhdGhUZW1wbGF0ZSwgbnVsbCwgbnVsbCwgdmFsdWVzLCB0cnVlLCBmYWxzZSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdXJpL2ludGVybmFsL1BhdGhUZW1wbGF0ZVRlc3QuamF2YSBiL2NvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdXJpL2ludGVybmFsL1BhdGhUZW1wbGF0ZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODIyZTRhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS91cmkvaW50ZXJuYWwvUGF0aFRlbXBsYXRlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudXJpLmludGVybmFsOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudXJpLlBhdGhUZW1wbGF0ZTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworCisvKioKKyAqIEBhdXRob3IgWWVnb3IgQnVnYXllbmtvICh5ZWdvcjI1NkBqYXZhLm5ldCkKKyAqLworcHVibGljIGNsYXNzIFBhdGhUZW1wbGF0ZVRlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFzaWNPcGVyYXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFBhdGhUZW1wbGF0ZSB0bXBsID0gbmV3IFBhdGhUZW1wbGF0ZSgiL3tpZCA6IFxcZCt9L3Rlc3QiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICJnZXROdW1iZXJPZlRlbXBsYXRlVmFyaWFibGVzKCkgcmV0dXJuZWQgaW52YWxpZCBudW1iZXIiLAorICAgICAgICAgICAgICAgIDEsCisgICAgICAgICAgICAgICAgdG1wbC5nZXROdW1iZXJPZlRlbXBsYXRlVmFyaWFibGVzKCkKKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICJnZXROdW1iZXJPZkV4cGxpY2l0UmVnZXhlcygpIHJldHVybmVkIGludmFsaWQgbnVtYmVyIiwKKyAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgIHRtcGwuZ2V0TnVtYmVyT2ZFeHBsaWNpdFJlZ2V4ZXMoKQorICAgICAgICApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtY29tbW9uL3NyYy90ZXN0L3Jlc291cmNlcy9zdXJlZmlyZS5wb2xpY3kgYi9jb3JlLWNvbW1vbi9zcmMvdGVzdC9yZXNvdXJjZXMvc3VyZWZpcmUucG9saWN5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxODFmZTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLWNvbW1vbi9zcmMvdGVzdC9yZXNvdXJjZXMvc3VyZWZpcmUucG9saWN5CkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKKy8vIHdlIGRvIG5vdCBjYXJlIGFib3V0IGphdmEgbGliIGl0c2VsZgorZ3JhbnQgY29kZWJhc2UgImZpbGU6JHtqYXZhLmhvbWV9Ly0iIHsKKyAgcGVybWlzc2lvbiBqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb247Cit9OworCisvLyB3ZSBkbyBub3QgY2FyZSBhYm91dCBvdXIgZGVwZW5kZW5jaWVzCitncmFudCBjb2RlYmFzZSAiZmlsZToke3NldHRpbmdzLmxvY2FsUmVwb3NpdG9yeX0vLSIgeworICBwZXJtaXNzaW9uIGphdmEuc2VjdXJpdHkuQWxsUGVybWlzc2lvbjsKK307CisKKy8vIHRoaXMgaXMgdG8gYmUgYWJsZSB0byBzZXQgcnVudGltZSBkZWxlZ2F0ZSBpbnN0YW5jZSBpbiBqYXgtcnMgZnJvbSB0aGUgdGVzdHMKKy8vIGFuZCB0byBydW4gbXVsdGktdGhyZWFkZWQgdGVzdHMKK2dyYW50IGNvZGViYXNlICJmaWxlOiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3Rlc3QtY2xhc3Nlcy8tIiB7CisgIHBlcm1pc3Npb24gamF2YS5sYW5nLnJlZmxlY3QuUmVmbGVjdFBlcm1pc3Npb24gInN1cHByZXNzQWNjZXNzQ2hlY2tzIjsKKyAgcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gIm1vZGlmeVRocmVhZCI7CisgIHBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAiKiIsICJ3cml0ZSI7CisgIHBlcm1pc3Npb24gamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uICJnZXRDbGFzc0xvYWRlciI7CisgIHBlcm1pc3Npb24gamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uICJhY2Nlc3NDbGFzc0luUGFja2FnZS5zdW4ubWlzYyI7CisgIHBlcm1pc3Npb24gamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uICJhY2Nlc3NDbGFzc0luUGFja2FnZS5zdW4ubWlzYy4qIjsKKyAgcGVybWlzc2lvbiBqYXZhLmxhbmcucmVmbGVjdC5SZWZsZWN0UGVybWlzc2lvbiAic3VwcHJlc3NBY2Nlc3NDaGVja3MiOworfTsKKworZ3JhbnQgY29kZWJhc2UgImZpbGU6JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vY2xhc3Nlcy8tIiB7CisgIHBlcm1pc3Npb24gamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uICJhY2Nlc3NDbGFzc0luUGFja2FnZS5zdW4ubWlzYyI7CisgIHBlcm1pc3Npb24gamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uICJhY2Nlc3NEZWNsYXJlZE1lbWJlcnMiOworICBwZXJtaXNzaW9uIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiAiZ2V0Q2xhc3NMb2FkZXIiOworICBwZXJtaXNzaW9uIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiAibW9kaWZ5VGhyZWFkIjsKKyAgcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICIqIiwgInJlYWQiOworICBwZXJtaXNzaW9uIGphdmEuaW8uRmlsZVBlcm1pc3Npb24gIjw8QUxMIEZJTEVTPj4iLCAicmVhZCI7CisgIHBlcm1pc3Npb24gamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uICJhY2Nlc3NDbGFzc0luUGFja2FnZS5zdW4ubWlzYyI7CisgIHBlcm1pc3Npb24gamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uICJhY2Nlc3NDbGFzc0luUGFja2FnZS5zdW4ubWlzYy4qIjsKKyAgcGVybWlzc2lvbiBqYXZhLmxhbmcucmVmbGVjdC5SZWZsZWN0UGVybWlzc2lvbiAic3VwcHJlc3NBY2Nlc3NDaGVja3MiOworfTsKZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL2V0Yy9YTUxTY2hlbWEuZHRkIGIvY29yZS1zZXJ2ZXIvZXRjL1hNTFNjaGVtYS5kdGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlkZDdmMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL2V0Yy9YTUxTY2hlbWEuZHRkCkBAIC0wLDAgKzEsNDIwIEBACis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPCEtLSBEVEQgZm9yIFhNTCBTY2hlbWFzOiBQYXJ0IDE6IFN0cnVjdHVyZXMKKyAgICAgUHVibGljIElkZW50aWZpZXI6ICItLy9XM0MvL0RURCBYTUxTQ0hFTUEgMjAwMTAyLy9FTiIKKyAgICAgT2ZmaWNpYWwgTG9jYXRpb246IGh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLmR0ZCAtLT4KKzwhLS0gJElkOiBYTUxTY2hlbWEuZHRkLHYgMS4zMSAyMDAxLzEwLzI0IDE1OjUwOjE2IGh0IEV4cCAkIC0tPgorPCEtLSBOb3RlIHRoaXMgRFREIGlzIE5PVCBub3JtYXRpdmUsIG9yIGV2ZW4gZGVmaW5pdGl2ZS4gLS0+ICAgICAgICAgICA8IS0tZC0tPgorPCEtLSBwcm9zZSBjb3B5IGluIHRoZSBzdHJ1Y3R1cmVzIFJFQyBpcyB0aGUgZGVmaW5pdGl2ZSB2ZXJzaW9uIC0tPiAgICA8IS0tZC0tPgorPCEtLSAod2hpY2ggc2hvdWxkbid0IGRpZmZlciBmcm9tIHRoaXMgb25lIGV4Y2VwdCBmb3IgdGhpcyAtLT4gICAgICAgICA8IS0tZC0tPgorPCEtLSBjb21tZW50IGFuZCBlbnRpdHkgZXhwYW5zaW9ucywgYnV0IGp1c3QgaW4gY2FzZSkgLS0+ICAgICAgICAgICAgICA8IS0tZC0tPgorPCEtLSBXaXRoIHRoZSBleGNlcHRpb24gb2YgY2FzZXMgd2l0aCBtdWx0aXBsZSBuYW1lc3BhY2UKKyAgICAgcHJlZml4ZXMgZm9yIHRoZSBYTUwgU2NoZW1hIG5hbWVzcGFjZSwgYW55IFhNTCBkb2N1bWVudCB3aGljaCBpcworICAgICBub3QgdmFsaWQgcGVyIHRoaXMgRFREIGdpdmVuIHJlZGVmaW5pdGlvbnMgaW4gaXRzIGludGVybmFsIHN1YnNldCBvZiB0aGUKKyAgICAgJ3AnIGFuZCAncycgcGFyYW1ldGVyIGVudGl0aWVzIGJlbG93IGFwcHJvcHJpYXRlIHRvIGl0cyBuYW1lc3BhY2UKKyAgICAgZGVjbGFyYXRpb24gb2YgdGhlIFhNTCBTY2hlbWEgbmFtZXNwYWNlIGlzIGFsbW9zdCBjZXJ0YWlubHkgbm90CisgICAgIGEgdmFsaWQgc2NoZW1hLiAtLT4KKworPCEtLSBUaGUgc2ltcGxlVHlwZSBlbGVtZW50IGFuZCBpdHMgY29uc3RpdHVlbnQgcGFydHMKKyAgICAgYXJlIGRlZmluZWQgaW4gWE1MIFNjaGVtYTogUGFydCAyOiBEYXRhdHlwZXMgLS0+Cis8IUVOVElUWSAlIHhzLWRhdGF0eXBlcyBQVUJMSUMgJ2RhdGF0eXBlcycgJ2RhdGF0eXBlcy5kdGQnID4KKworPCFFTlRJVFkgJSBwICd4czonPiA8IS0tIGNhbiBiZSBvdmVycmlkZW4gaW4gdGhlIGludGVybmFsIHN1YnNldCBvZiBhCisgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZW1hIGRvY3VtZW50IHRvIGVzdGFibGlzaCBhIGRpZmZlcmVudAorICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZSBwcmVmaXggLS0+Cis8IUVOVElUWSAlIHMgJzp4cyc+IDwhLS0gaWYgJXAgaXMgZGVmaW5lZCAoZS5nLiBhcyBmb286KSB0aGVuIHlvdSBtdXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgYWxzbyBkZWZpbmUgJXMgYXMgdGhlIHN1ZmZpeCBmb3IgdGhlIGFwcHJvcHJpYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIChlLmcuIDpmb28pIC0tPgorPCFFTlRJVFkgJSBuZHMgJ3htbG5zJXM7Jz4KKworPCEtLSBEZWZpbmUgYWxsIHRoZSBlbGVtZW50IG5hbWVzLCB3aXRoIG9wdGlvbmFsIHByZWZpeCAtLT4KKzwhRU5USVRZICUgc2NoZW1hICIlcDtzY2hlbWEiPgorPCFFTlRJVFkgJSBjb21wbGV4VHlwZSAiJXA7Y29tcGxleFR5cGUiPgorPCFFTlRJVFkgJSBjb21wbGV4Q29udGVudCAiJXA7Y29tcGxleENvbnRlbnQiPgorPCFFTlRJVFkgJSBzaW1wbGVDb250ZW50ICIlcDtzaW1wbGVDb250ZW50Ij4KKzwhRU5USVRZICUgZXh0ZW5zaW9uICIlcDtleHRlbnNpb24iPgorPCFFTlRJVFkgJSBlbGVtZW50ICIlcDtlbGVtZW50Ij4KKzwhRU5USVRZICUgdW5pcXVlICIlcDt1bmlxdWUiPgorPCFFTlRJVFkgJSBrZXkgIiVwO2tleSI+Cis8IUVOVElUWSAlIGtleXJlZiAiJXA7a2V5cmVmIj4KKzwhRU5USVRZICUgc2VsZWN0b3IgIiVwO3NlbGVjdG9yIj4KKzwhRU5USVRZICUgZmllbGQgIiVwO2ZpZWxkIj4KKzwhRU5USVRZICUgZ3JvdXAgIiVwO2dyb3VwIj4KKzwhRU5USVRZICUgYWxsICIlcDthbGwiPgorPCFFTlRJVFkgJSBjaG9pY2UgIiVwO2Nob2ljZSI+Cis8IUVOVElUWSAlIHNlcXVlbmNlICIlcDtzZXF1ZW5jZSI+Cis8IUVOVElUWSAlIGFueSAiJXA7YW55Ij4KKzwhRU5USVRZICUgYW55QXR0cmlidXRlICIlcDthbnlBdHRyaWJ1dGUiPgorPCFFTlRJVFkgJSBhdHRyaWJ1dGUgIiVwO2F0dHJpYnV0ZSI+Cis8IUVOVElUWSAlIGF0dHJpYnV0ZUdyb3VwICIlcDthdHRyaWJ1dGVHcm91cCI+Cis8IUVOVElUWSAlIGluY2x1ZGUgIiVwO2luY2x1ZGUiPgorPCFFTlRJVFkgJSBpbXBvcnQgIiVwO2ltcG9ydCI+Cis8IUVOVElUWSAlIHJlZGVmaW5lICIlcDtyZWRlZmluZSI+Cis8IUVOVElUWSAlIG5vdGF0aW9uICIlcDtub3RhdGlvbiI+CisKKzwhLS0gYW5ub3RhdGlvbiBlbGVtZW50cyAtLT4KKzwhRU5USVRZICUgYW5ub3RhdGlvbiAiJXA7YW5ub3RhdGlvbiI+Cis8IUVOVElUWSAlIGFwcGluZm8gIiVwO2FwcGluZm8iPgorPCFFTlRJVFkgJSBkb2N1bWVudGF0aW9uICIlcDtkb2N1bWVudGF0aW9uIj4KKworPCEtLSBDdXN0b21pc2F0aW9uIGVudGl0aWVzIGZvciB0aGUgQVRUTElTVCBvZiBlYWNoIGVsZW1lbnQgdHlwZS4KKyAgICAgRGVmaW5lIG9uZSBvZiB0aGVzZSBpZiB5b3VyIHNjaGVtYSB0YWtlcyBhZHZhbnRhZ2Ugb2YgdGhlCisgICAgIGFueUF0dHJpYnV0ZT0nIyNvdGhlcicgaW4gdGhlIHNjaGVtYSBmb3Igc2NoZW1hcyAtLT4KKworPCFFTlRJVFkgJSBzY2hlbWFBdHRycyAnJz4KKzwhRU5USVRZICUgY29tcGxleFR5cGVBdHRycyAnJz4KKzwhRU5USVRZICUgY29tcGxleENvbnRlbnRBdHRycyAnJz4KKzwhRU5USVRZICUgc2ltcGxlQ29udGVudEF0dHJzICcnPgorPCFFTlRJVFkgJSBleHRlbnNpb25BdHRycyAnJz4KKzwhRU5USVRZICUgZWxlbWVudEF0dHJzICcnPgorPCFFTlRJVFkgJSBncm91cEF0dHJzICcnPgorPCFFTlRJVFkgJSBhbGxBdHRycyAnJz4KKzwhRU5USVRZICUgY2hvaWNlQXR0cnMgJyc+Cis8IUVOVElUWSAlIHNlcXVlbmNlQXR0cnMgJyc+Cis8IUVOVElUWSAlIGFueUF0dHJzICcnPgorPCFFTlRJVFkgJSBhbnlBdHRyaWJ1dGVBdHRycyAnJz4KKzwhRU5USVRZICUgYXR0cmlidXRlQXR0cnMgJyc+Cis8IUVOVElUWSAlIGF0dHJpYnV0ZUdyb3VwQXR0cnMgJyc+Cis8IUVOVElUWSAlIHVuaXF1ZUF0dHJzICcnPgorPCFFTlRJVFkgJSBrZXlBdHRycyAnJz4KKzwhRU5USVRZICUga2V5cmVmQXR0cnMgJyc+Cis8IUVOVElUWSAlIHNlbGVjdG9yQXR0cnMgJyc+Cis8IUVOVElUWSAlIGZpZWxkQXR0cnMgJyc+Cis8IUVOVElUWSAlIGluY2x1ZGVBdHRycyAnJz4KKzwhRU5USVRZICUgaW1wb3J0QXR0cnMgJyc+Cis8IUVOVElUWSAlIHJlZGVmaW5lQXR0cnMgJyc+Cis8IUVOVElUWSAlIG5vdGF0aW9uQXR0cnMgJyc+Cis8IUVOVElUWSAlIGFubm90YXRpb25BdHRycyAnJz4KKzwhRU5USVRZICUgYXBwaW5mb0F0dHJzICcnPgorPCFFTlRJVFkgJSBkb2N1bWVudGF0aW9uQXR0cnMgJyc+CisKKzwhRU5USVRZICUgY29tcGxleERlcml2YXRpb25TZXQgIkNEQVRBIj4KKyAgICAgIDwhLS0gI2FsbCBvciBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBkcmF3biBmcm9tIGRlcml2YXRpb25DaG9pY2UgLS0+Cis8IUVOVElUWSAlIGJsb2NrU2V0ICJDREFUQSI+CisgICAgICA8IS0tICNhbGwgb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3QgZHJhd24gZnJvbQorICAgICAgICAgICAgICAgICAgICAgIGRlcml2YXRpb25DaG9pY2UgKyAnc3Vic3RpdHV0aW9uJyAtLT4KKworPCFFTlRJVFkgJSBtZ3MgJyVhbGw7IHwgJWNob2ljZTsgfCAlc2VxdWVuY2U7Jz4KKzwhRU5USVRZICUgY3MgJyVjaG9pY2U7IHwgJXNlcXVlbmNlOyc+Cis8IUVOVElUWSAlIGZvcm1WYWx1ZXMgJyhxdWFsaWZpZWR8dW5xdWFsaWZpZWQpJz4KKworCis8IUVOVElUWSAlIGF0dHJEZWNscyAgICAnKCglYXR0cmlidXRlO3wgJWF0dHJpYnV0ZUdyb3VwOykqLCglYW55QXR0cmlidXRlOyk/KSc+CisKKzwhRU5USVRZICUgcGFydGljbGVBbmRBdHRycyAnKCglbWdzOyB8ICVncm91cDspPywgJWF0dHJEZWNsczspJz4KKworPCEtLSBUaGlzIGlzIHVzZWQgaW4gcGFydDIgLS0+Cis8IUVOVElUWSAlIHJlc3RyaWN0aW9uMSAnKCglbWdzOyB8ICVncm91cDspPyknPgorCisleHMtZGF0YXR5cGVzOworCis8IS0tIHRoZSBkdXBsaWNhdGlvbiBiZWxvdyBpcyB0byBwcm9kdWNlIGFuIHVuYW1iaWd1b3VzIGNvbnRlbnQgbW9kZWwKKyAgICAgd2hpY2ggYWxsb3dzIGFubm90YXRpb24gZXZlcnl3aGVyZSAtLT4KKzwhRUxFTUVOVCAlc2NoZW1hOyAoKCVpbmNsdWRlOyB8ICVpbXBvcnQ7IHwgJXJlZGVmaW5lOyB8ICVhbm5vdGF0aW9uOykqLAorICAgICAgICAgICAgICAgICAgICAoKCVzaW1wbGVUeXBlOyB8ICVjb21wbGV4VHlwZTsKKyAgICAgICAgICAgICAgICAgICAgICB8ICVlbGVtZW50OyB8ICVhdHRyaWJ1dGU7CisgICAgICAgICAgICAgICAgICAgICAgfCAlYXR0cmlidXRlR3JvdXA7IHwgJWdyb3VwOworICAgICAgICAgICAgICAgICAgICAgIHwgJW5vdGF0aW9uOyApLAorICAgICAgICAgICAgICAgICAgICAgKCVhbm5vdGF0aW9uOykqKSogKT4KKzwhQVRUTElTVCAlc2NoZW1hOworICAgdGFyZ2V0TmFtZXNwYWNlICAgICAgJVVSSXJlZjsgICAgICAgICAgICAgICAjSU1QTElFRAorICAgdmVyc2lvbiAgICAgICAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAjSU1QTElFRAorICAgJW5kczsgICAgICAgICAgICAgICAgJVVSSXJlZjsgICAgICAgICAgICAgICAjRklYRUQgJ2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hJworICAgeG1sbnMgICAgICAgICAgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAjSU1QTElFRAorICAgZmluYWxEZWZhdWx0ICAgICAgICAgJWNvbXBsZXhEZXJpdmF0aW9uU2V0OyAnJworICAgYmxvY2tEZWZhdWx0ICAgICAgICAgJWJsb2NrU2V0OyAgICAgICAgICAgICAnJworICAgaWQgICAgICAgICAgICAgICAgICAgSUQgICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAorICAgZWxlbWVudEZvcm1EZWZhdWx0ICAgJWZvcm1WYWx1ZXM7ICAgICAgICAgICAndW5xdWFsaWZpZWQnCisgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdCAlZm9ybVZhbHVlczsgICAgICAgICAgICd1bnF1YWxpZmllZCcKKyAgIHhtbDpsYW5nICAgICAgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgI0lNUExJRUQKKyAgICVzY2hlbWFBdHRyczs+Cis8IS0tIE5vdGUgdGhlIHhtbG5zIGRlY2xhcmF0aW9uIGlzIE5PVCBpbiB0aGUgU2NoZW1hIGZvciBTY2hlbWFzLAorICAgICBiZWNhdXNlIGF0IHRoZSBJbmZvc2V0IGxldmVsIHdoZXJlIHNjaGVtYXMgb3BlcmF0ZSwKKyAgICAgeG1sbnMoOnByZWZpeCkgaXMgTk9UIGFuIGF0dHJpYnV0ZSEgLS0+Cis8IS0tIFRoZSBkZWNsYXJhdGlvbiBvZiB4bWxucyBpcyBhIGNvbnZlbmllbmNlIGZvciBzY2hlbWEgYXV0aG9ycyAtLT4KKyAKKzwhLS0gVGhlIGlkIGF0dHJpYnV0ZSBoZXJlIGFuZCBiZWxvdyBpcyBmb3IgdXNlIGluIGV4dGVybmFsIHJlZmVyZW5jZXMKKyAgICAgZnJvbSBub24tc2NoZW1hcyB1c2luZyBzaW1wbGUgZnJhZ21lbnQgaWRlbnRpZmllcnMuCisgICAgIEl0IGlzIE5PVCB1c2VkIGZvciBzY2hlbWEtdG8tc2NoZW1hIHJlZmVyZW5jZSwgaW50ZXJuYWwgb3IKKyAgICAgZXh0ZXJuYWwuIC0tPgorCis8IS0tIGEgdHlwZSBpcyBhIG5hbWVkIGNvbnRlbnQgdHlwZSBzcGVjaWZpY2F0aW9uIHdoaWNoIGFsbG93cyBhdHRyaWJ1dGUKKyAgICAgZGVjbGFyYXRpb25zLS0+Cis8IS0tIC0tPgorCis8IUVMRU1FTlQgJWNvbXBsZXhUeXBlOyAoKCVhbm5vdGF0aW9uOyk/LAorICAgICAgICAgICAgICAgICAgICAgICAgICglc2ltcGxlQ29udGVudDt8JWNvbXBsZXhDb250ZW50O3wKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJXBhcnRpY2xlQW5kQXR0cnM7KSk+CisKKzwhQVRUTElTVCAlY29tcGxleFR5cGU7CisgICAgICAgICAgbmFtZSAgICAgICVOQ05hbWU7ICAgICAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKKyAgICAgICAgICBpZCAgICAgICAgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAorICAgICAgICAgIGFic3RyYWN0ICAlYm9vbGVhbjsgICAgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECisgICAgICAgICAgZmluYWwgICAgICVjb21wbGV4RGVyaXZhdGlvblNldDsgICAgICAgICAgI0lNUExJRUQKKyAgICAgICAgICBibG9jayAgICAgJWNvbXBsZXhEZXJpdmF0aW9uU2V0OyAgICAgICAgICAjSU1QTElFRAorICAgICAgICAgIG1peGVkICh0cnVlfGZhbHNlKSAnZmFsc2UnCisgICAgICAgICAgJWNvbXBsZXhUeXBlQXR0cnM7PgorCis8IS0tIHBhcnRpY2xlQW5kQXR0cnMgaXMgc2hvcnRoYW5kIGZvciBhIHJvb3QgdHlwZSAtLT4KKzwhLS0gbWl4ZWQgaXMgZGlzYWxsb3dlZCBpZiBzaW1wbGVDb250ZW50LCBvdmVycmlkZW4gaWYgY29tcGxleENvbnRlbnQKKyAgICAgaGFzIG9uZSB0b28uIC0tPgorCis8IS0tIElmIGFueUF0dHJpYnV0ZSBhcHBlYXJzIGluIG9uZSBvciBtb3JlIHJlZmVyZW5jZWQgYXR0cmlidXRlR3JvdXBzCisgICAgIGFuZC9vciBleHBsaWNpdGx5LCB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSBwZXJtaXNzaW9ucyBpcyB1c2VkIC0tPgorCis8IUVMRU1FTlQgJWNvbXBsZXhDb250ZW50OyAoKCVhbm5vdGF0aW9uOyk/LCAoJXJlc3RyaWN0aW9uO3wlZXh0ZW5zaW9uOykpPgorPCFBVFRMSVNUICVjb21wbGV4Q29udGVudDsKKyAgICAgICAgICBtaXhlZCAodHJ1ZXxmYWxzZSkgI0lNUExJRUQKKyAgICAgICAgICBpZCAgICBJRCAgICAgICAgICAgI0lNUExJRUQKKyAgICAgICAgICAlY29tcGxleENvbnRlbnRBdHRyczs+CisKKzwhLS0gcmVzdHJpY3Rpb24gc2hvdWxkIHVzZSB0aGUgYnJhbmNoIGRlZmluZWQgYWJvdmUsIG5vdCB0aGUgc2ltcGxlCisgICAgIG9uZSBmcm9tIHBhcnQyOyBleHRlbnNpb24gc2hvdWxkIHVzZSB0aGUgZnVsbCBtb2RlbCAgLS0+CisKKzwhRUxFTUVOVCAlc2ltcGxlQ29udGVudDsgKCglYW5ub3RhdGlvbjspPywgKCVyZXN0cmljdGlvbjt8JWV4dGVuc2lvbjspKT4KKzwhQVRUTElTVCAlc2ltcGxlQ29udGVudDsKKyAgICAgICAgICBpZCAgICBJRCAgICAgICAgICAgI0lNUExJRUQKKyAgICAgICAgICAlc2ltcGxlQ29udGVudEF0dHJzOz4KKworPCEtLSByZXN0cmljdGlvbiBzaG91bGQgdXNlIHRoZSBzaW1wbGUgYnJhbmNoIGZyb20gcGFydDIsIG5vdCB0aGUgCisgICAgIG9uZSBkZWZpbmVkIGFib3ZlOyBleHRlbnNpb24gc2hvdWxkIGhhdmUgbm8gcGFydGljbGUgIC0tPgorCis8IUVMRU1FTlQgJWV4dGVuc2lvbjsgKCglYW5ub3RhdGlvbjspPywgKCVwYXJ0aWNsZUFuZEF0dHJzOykpPgorPCFBVFRMSVNUICVleHRlbnNpb247CisgICAgICAgICAgYmFzZSAgJVFOYW1lOyAgICAgICNSRVFVSVJFRAorICAgICAgICAgIGlkICAgIElEICAgICAgICAgICAjSU1QTElFRAorICAgICAgICAgICVleHRlbnNpb25BdHRyczs+CisKKzwhLS0gYW4gZWxlbWVudCBpcyBkZWNsYXJlZCBieSBlaXRoZXI6CisgYSBuYW1lIGFuZCBhIHR5cGUgKGVpdGhlciBuZXN0ZWQgb3IgcmVmZXJlbmNlZCB2aWEgdGhlIHR5cGUgYXR0cmlidXRlKQorIG9yIGEgcmVmIHRvIGFuIGV4aXN0aW5nIGVsZW1lbnQgZGVjbGFyYXRpb24gLS0+CisKKzwhRUxFTUVOVCAlZWxlbWVudDsgKCglYW5ub3RhdGlvbjspPywgKCVjb21wbGV4VHlwZTt8ICVzaW1wbGVUeXBlOyk/LAorICAgICAgICAgICAgICAgICAgICAgKCV1bmlxdWU7IHwgJWtleTsgfCAla2V5cmVmOykqKT4KKzwhLS0gc2ltcGxlVHlwZSBvciBjb21wbGV4VHlwZSBvbmx5IGlmIG5vIHR5cGV8cmVmIGF0dHJpYnV0ZSAtLT4KKzwhLS0gcmVmIG5vdCBhbGxvd2VkIGF0IHRvcCBsZXZlbCAtLT4KKzwhQVRUTElTVCAlZWxlbWVudDsKKyAgICAgICAgICAgIG5hbWUgICAgICAgICAgICAgICAlTkNOYW1lOyAgICAgICAgICAgICAgICNJTVBMSUVECisgICAgICAgICAgICBpZCAgICAgICAgICAgICAgICAgSUQgICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAorICAgICAgICAgICAgcmVmICAgICAgICAgICAgICAgICVRTmFtZTsgICAgICAgICAgICAgICAgI0lNUExJRUQKKyAgICAgICAgICAgIHR5cGUgICAgICAgICAgICAgICAlUU5hbWU7ICAgICAgICAgICAgICAgICNJTVBMSUVECisgICAgICAgICAgICBtaW5PY2N1cnMgICAgICAgICAgJW5vbk5lZ2F0aXZlSW50ZWdlcjsgICAjSU1QTElFRAorICAgICAgICAgICAgbWF4T2NjdXJzICAgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgI0lNUExJRUQKKyAgICAgICAgICAgIG5pbGxhYmxlICAgICAgICAgICAlYm9vbGVhbjsgICAgICAgICAgICAgICNJTVBMSUVECisgICAgICAgICAgICBzdWJzdGl0dXRpb25Hcm91cCAgJVFOYW1lOyAgICAgICAgICAgICAgICAjSU1QTElFRAorICAgICAgICAgICAgYWJzdHJhY3QgICAgICAgICAgICVib29sZWFuOyAgICAgICAgICAgICAgI0lNUExJRUQKKyAgICAgICAgICAgIGZpbmFsICAgICAgICAgICAgICAlY29tcGxleERlcml2YXRpb25TZXQ7ICNJTVBMSUVECisgICAgICAgICAgICBibG9jayAgICAgICAgICAgICAgJWJsb2NrU2V0OyAgICAgICAgICAgICAjSU1QTElFRAorICAgICAgICAgICAgZGVmYXVsdCAgICAgICAgICAgIENEQVRBICAgICAgICAgICAgICAgICAgI0lNUExJRUQKKyAgICAgICAgICAgIGZpeGVkICAgICAgICAgICAgICBDREFUQSAgICAgICAgICAgICAgICAgICNJTVBMSUVECisgICAgICAgICAgICBmb3JtICAgICAgICAgICAgICAgJWZvcm1WYWx1ZXM7ICAgICAgICAgICAjSU1QTElFRAorICAgICAgICAgICAgJWVsZW1lbnRBdHRyczs+Cis8IS0tIHR5cGUgYW5kIHJlZiBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLgorICAgICBuYW1lIGFuZCByZWYgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSwgb25lIGlzIHJlcXVpcmVkIC0tPgorPCEtLSBJbiB0aGUgYWJzZW5jZSBvZiB0eXBlIEFORCByZWYsIHR5cGUgZGVmYXVsdHMgdG8gdHlwZSBvZgorICAgICBzdWJzdGl0dXRpb25Hcm91cCwgaWYgYW55LCBlbHNlIHRoZSB1ci10eXBlLCBpLmUuIHVuY29uc3RyYWluZWQgLS0+Cis8IS0tIGRlZmF1bHQgYW5kIGZpeGVkIGFyZSBtdXR1YWxseSBleGNsdXNpdmUgLS0+CisKKzwhRUxFTUVOVCAlZ3JvdXA7ICgoJWFubm90YXRpb247KT8sKCVtZ3M7KT8pPgorPCFBVFRMSVNUICVncm91cDsgCisgICAgICAgICAgbmFtZSAgICAgICAgJU5DTmFtZTsgICAgICAgICAgICAgICAjSU1QTElFRAorICAgICAgICAgIHJlZiAgICAgICAgICVRTmFtZTsgICAgICAgICAgICAgICAgI0lNUExJRUQKKyAgICAgICAgICBtaW5PY2N1cnMgICAlbm9uTmVnYXRpdmVJbnRlZ2VyOyAgICNJTVBMSUVECisgICAgICAgICAgbWF4T2NjdXJzICAgQ0RBVEEgICAgICAgICAgICAgICAgICAjSU1QTElFRAorICAgICAgICAgIGlkICAgICAgICAgIElEICAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKKyAgICAgICAgICAlZ3JvdXBBdHRyczs+CisKKzwhRUxFTUVOVCAlYWxsOyAoKCVhbm5vdGF0aW9uOyk/LCAoJWVsZW1lbnQ7KSopPgorPCFBVFRMSVNUICVhbGw7CisgICAgICAgICAgbWluT2NjdXJzICAgKDEpICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAorICAgICAgICAgIG1heE9jY3VycyAgICgxKSAgICAgICAgICAgICAgICAgICAgI0lNUExJRUQKKyAgICAgICAgICBpZCAgICAgICAgICBJRCAgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECisgICAgICAgICAgJWFsbEF0dHJzOz4KKworPCFFTEVNRU5UICVjaG9pY2U7ICgoJWFubm90YXRpb247KT8sICglZWxlbWVudDt8ICVncm91cDt8ICVjczsgfCAlYW55OykqKT4KKzwhQVRUTElTVCAlY2hvaWNlOworICAgICAgICAgIG1pbk9jY3VycyAgICVub25OZWdhdGl2ZUludGVnZXI7ICAgI0lNUExJRUQKKyAgICAgICAgICBtYXhPY2N1cnMgICBDREFUQSAgICAgICAgICAgICAgICAgICNJTVBMSUVECisgICAgICAgICAgaWQgICAgICAgICAgSUQgICAgICAgICAgICAgICAgICAgICAjSU1QTElFRAorICAgICAgICAgICVjaG9pY2VBdHRyczs+CisKKzwhRUxFTUVOVCAlc2VxdWVuY2U7ICgoJWFubm90YXRpb247KT8sICglZWxlbWVudDt8ICVncm91cDt8ICVjczsgfCAlYW55OykqKT4KKzwhQVRUTElTVCAlc2VxdWVuY2U7CisgICAgICAgICAgbWluT2NjdXJzICAgJW5vbk5lZ2F0aXZlSW50ZWdlcjsgICAjSU1QTElFRAorICAgICAgICAgIG1heE9jY3VycyAgIENEQVRBICAgICAgICAgICAgICAgICAgI0lNUExJRUQKKyAgICAgICAgICBpZCAgICAgICAgICBJRCAgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECisgICAgICAgICAgJXNlcXVlbmNlQXR0cnM7PgorCis8IS0tIGFuIGFub255bW91cyBncm91cGluZyBpbiBhIG1vZGVsLCBvcgorICAgICBhIHRvcC1sZXZlbCBuYW1lZCBncm91cCBkZWZpbml0aW9uLCBvciBhIHJlZmVyZW5jZSB0byBzYW1lIC0tPgorCis8IS0tIE5vdGUgdGhhdCBpZiBvcmRlciBpcyAnYWxsJywgZ3JvdXAgaXMgbm90IGFsbG93ZWQgaW5zaWRlLgorICAgICBJZiBvcmRlciBpcyAnYWxsJyBUSElTIGdyb3VwIG11c3QgYmUgYWxvbmUgKG9yIHJlZmVyZW5jZWQgYWxvbmUpIGF0CisgICAgIHRoZSB0b3AgbGV2ZWwgb2YgYSBjb250ZW50IG1vZGVsIC0tPgorPCEtLSBJZiBvcmRlciBpcyAnYWxsJywgbWluT2NjdXJzPT1tYXhPY2N1cnM9PTEgb24gZWxlbWVudC9hbnkgaW5zaWRlIC0tPgorPCEtLSBTaG91bGQgYWxsb3cgbWluT2NjdXJzPTAgaW5zaWRlIG9yZGVyPSdhbGwnIC4gLiAuIC0tPgorCis8IUVMRU1FTlQgJWFueTsgKCVhbm5vdGF0aW9uOyk/PgorPCFBVFRMSVNUICVhbnk7CisgICAgICAgICAgICBuYW1lc3BhY2UgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAnIyNhbnknCisgICAgICAgICAgICBwcm9jZXNzQ29udGVudHMgKHNraXB8bGF4fHN0cmljdCkgICAgICAnc3RyaWN0JworICAgICAgICAgICAgbWluT2NjdXJzICAgICAgICVub25OZWdhdGl2ZUludGVnZXI7ICAgJzEnCisgICAgICAgICAgICBtYXhPY2N1cnMgICAgICAgQ0RBVEEgICAgICAgICAgICAgICAgICAnMScKKyAgICAgICAgICAgIGlkICAgICAgICAgICAgICBJRCAgICAgICAgICAgICAgICAgICAgICNJTVBMSUVECisgICAgICAgICAgICAlYW55QXR0cnM7PgorCis8IS0tIG5hbWVzcGFjZSBpcyBpbnRlcnByZXRlZCBhcyBmb2xsb3dzOgorICAgICAgICAgICAgICAgICAgIyNhbnkgICAgICAtIC0gYW55IG5vbi1jb25mbGljdGluZyBXRlhNTCBhdCBhbGwKKworICAgICAgICAgICAgICAgICAgIyNvdGhlciAgICAtIC0gYW55IG5vbi1jb25mbGljdGluZyBXRlhNTCBmcm9tIG5hbWVzcGFjZSBvdGhlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYW4gdGFyZ2V0TmFtZXNwYWNlCisKKyAgICAgICAgICAgICAgICAgICMjbG9jYWwgICAgLSAtIGFueSB1bnF1YWxpZmllZCBub24tY29uZmxpY3RpbmcgV0ZYTUwvYXR0cmlidXRlCisgICAgICAgICAgICAgICAgICBvbmUgb3IgICAgIC0gLSBhbnkgbm9uLWNvbmZsaWN0aW5nIFdGWE1MIGZyb20KKyAgICAgICAgICAgICAgICAgIG1vcmUgVVJJICAgICAgICB0aGUgbGlzdGVkIG5hbWVzcGFjZXMKKyAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZXMKKworICAgICAgICAgICAgICAgICAgIyN0YXJnZXROYW1lc3BhY2UgIyNsb2NhbCBtYXkgYXBwZWFyIGluIHRoZSBhYm92ZSBsaXN0LAorICAgICAgICAgICAgICAgICAgICB3aXRoIHRoZSBvYnZpb3VzIG1lYW5pbmcgLS0+CisKKzwhRUxFTUVOVCAlYW55QXR0cmlidXRlOyAoJWFubm90YXRpb247KT8+Cis8IUFUVExJU1QgJWFueUF0dHJpYnV0ZTsKKyAgICAgICAgICAgIG5hbWVzcGFjZSAgICAgICBDREFUQSAgICAgICAgICAgICAgJyMjYW55JworICAgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzIChza2lwfGxheHxzdHJpY3QpICAnc3RyaWN0JworICAgICAgICAgICAgaWQgICAgICAgICAgICAgIElEICAgICAgICAgICAgICAgICAjSU1QTElFRAorICAgICAgICAgICAgJWFueUF0dHJpYnV0ZUF0dHJzOz4KKzwhLS0gbmFtZXNwYWNlIGlzIGludGVycHJldGVkIGFzIGZvciAnYW55JyBhYm92ZSAtLT4KKworPCEtLSBzaW1wbGVUeXBlIG9ubHkgaWYgbm8gdHlwZXxyZWYgYXR0cmlidXRlIC0tPgorPCEtLSByZWYgbm90IGFsbG93ZWQgYXQgdG9wIGxldmVsLCBuYW1lIGlmZiBhdCB0b3AgbGV2ZWwgLS0+Cis8IUVMRU1FTlQgJWF0dHJpYnV0ZTsgKCglYW5ub3RhdGlvbjspPywgKCVzaW1wbGVUeXBlOyk/KT4KKzwhQVRUTElTVCAlYXR0cmlidXRlOworICAgICAgICAgIG5hbWUgICAgICAlTkNOYW1lOyAgICAgICNJTVBMSUVECisgICAgICAgICAgaWQgICAgICAgIElEICAgICAgICAgICAgI0lNUExJRUQKKyAgICAgICAgICByZWYgICAgICAgJVFOYW1lOyAgICAgICAjSU1QTElFRAorICAgICAgICAgIHR5cGUgICAgICAlUU5hbWU7ICAgICAgICNJTVBMSUVECisgICAgICAgICAgdXNlICAgICAgIChwcm9oaWJpdGVkfG9wdGlvbmFsfHJlcXVpcmVkKSAjSU1QTElFRAorICAgICAgICAgIGRlZmF1bHQgICBDREFUQSAgICAgICAgICNJTVBMSUVECisgICAgICAgICAgZml4ZWQgICAgIENEQVRBICAgICAgICAgI0lNUExJRUQKKyAgICAgICAgICBmb3JtICAgICAgJWZvcm1WYWx1ZXM7ICAjSU1QTElFRAorICAgICAgICAgICVhdHRyaWJ1dGVBdHRyczs+Cis8IS0tIHR5cGUgYW5kIHJlZiBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLgorICAgICBuYW1lIGFuZCByZWYgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSwgb25lIGlzIHJlcXVpcmVkIC0tPgorPCEtLSBkZWZhdWx0IGZvciB1c2UgaXMgb3B0aW9uYWwgd2hlbiBuZXN0ZWQsIG5vbmUgb3RoZXJ3aXNlIC0tPgorPCEtLSBkZWZhdWx0IGFuZCBmaXhlZCBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlIC0tPgorPCEtLSB0eXBlIGF0dHIgYW5kIHNpbXBsZVR5cGUgY29udGVudCBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlIC0tPgorCis8IS0tIGFuIGF0dHJpYnV0ZUdyb3VwIGlzIGEgbmFtZWQgY29sbGVjdGlvbiBvZiBhdHRyaWJ1dGUgZGVjbHMsIG9yIGEKKyAgICAgcmVmZXJlbmNlIHRoZXJldG8gLS0+Cis8IUVMRU1FTlQgJWF0dHJpYnV0ZUdyb3VwOyAoKCVhbm5vdGF0aW9uOyk/LAorICAgICAgICAgICAgICAgICAgICAgICAoJWF0dHJpYnV0ZTsgfCAlYXR0cmlidXRlR3JvdXA7KSosCisgICAgICAgICAgICAgICAgICAgICAgICglYW55QXR0cmlidXRlOyk/KSA+Cis8IUFUVExJU1QgJWF0dHJpYnV0ZUdyb3VwOworICAgICAgICAgICAgICAgICBuYW1lICAgICAgICVOQ05hbWU7ICAgICAgICNJTVBMSUVECisgICAgICAgICAgICAgICAgIGlkICAgICAgICAgSUQgICAgICAgICAgICAgI0lNUExJRUQKKyAgICAgICAgICAgICAgICAgcmVmICAgICAgICAlUU5hbWU7ICAgICAgICAjSU1QTElFRAorICAgICAgICAgICAgICAgICAlYXR0cmlidXRlR3JvdXBBdHRyczs+CisKKzwhLS0gcmVmIGlmZiBubyBjb250ZW50LCBubyBuYW1lLiAgcmVmIGlmZiBub3QgdG9wIGxldmVsIC0tPgorCis8IS0tIGJldHRlciByZWZlcmVuY2UgbWVjaGFuaXNtcyAtLT4KKzwhRUxFTUVOVCAldW5pcXVlOyAoKCVhbm5vdGF0aW9uOyk/LCAlc2VsZWN0b3I7LCAoJWZpZWxkOykrKT4KKzwhQVRUTElTVCAldW5pcXVlOworICAgICAgICAgIG5hbWUgICAgICVOQ05hbWU7ICAgICAgICNSRVFVSVJFRAorCSAgaWQgICAgICAgSUQgICAgICAgICAgICAgI0lNUExJRUQKKwkgICV1bmlxdWVBdHRyczs+CisKKzwhRUxFTUVOVCAla2V5OyAgICAoKCVhbm5vdGF0aW9uOyk/LCAlc2VsZWN0b3I7LCAoJWZpZWxkOykrKT4KKzwhQVRUTElTVCAla2V5OworICAgICAgICAgIG5hbWUgICAgICVOQ05hbWU7ICAgICAgICNSRVFVSVJFRAorCSAgaWQgICAgICAgSUQgICAgICAgICAgICAgI0lNUExJRUQKKwkgICVrZXlBdHRyczs+CisKKzwhRUxFTUVOVCAla2V5cmVmOyAoKCVhbm5vdGF0aW9uOyk/LCAlc2VsZWN0b3I7LCAoJWZpZWxkOykrKT4KKzwhQVRUTElTVCAla2V5cmVmOworICAgICAgICAgIG5hbWUgICAgICVOQ05hbWU7ICAgICAgICNSRVFVSVJFRAorCSAgcmVmZXIgICAgJVFOYW1lOyAgICAgICAgI1JFUVVJUkVECisJICBpZCAgICAgICBJRCAgICAgICAgICAgICAjSU1QTElFRAorCSAgJWtleXJlZkF0dHJzOz4KKworPCFFTEVNRU5UICVzZWxlY3RvcjsgKCglYW5ub3RhdGlvbjspPyk+Cis8IUFUVExJU1QgJXNlbGVjdG9yOworICAgICAgICAgIHhwYXRoICVYUGF0aEV4cHI7ICNSRVFVSVJFRAorICAgICAgICAgIGlkICAgIElEICAgICAgICAgICNJTVBMSUVECisgICAgICAgICAgJXNlbGVjdG9yQXR0cnM7PgorPCFFTEVNRU5UICVmaWVsZDsgKCglYW5ub3RhdGlvbjspPyk+Cis8IUFUVExJU1QgJWZpZWxkOworICAgICAgICAgIHhwYXRoICVYUGF0aEV4cHI7ICNSRVFVSVJFRAorICAgICAgICAgIGlkICAgIElEICAgICAgICAgICNJTVBMSUVECisgICAgICAgICAgJWZpZWxkQXR0cnM7PgorCis8IS0tIFNjaGVtYSBjb21iaW5hdGlvbiBtZWNoYW5pc21zIC0tPgorPCFFTEVNRU5UICVpbmNsdWRlOyAoJWFubm90YXRpb247KT8+Cis8IUFUVExJU1QgJWluY2x1ZGU7CisgICAgICAgICAgc2NoZW1hTG9jYXRpb24gJVVSSXJlZjsgI1JFUVVJUkVECisgICAgICAgICAgaWQgICAgICAgICAgICAgSUQgICAgICAgI0lNUExJRUQKKyAgICAgICAgICAlaW5jbHVkZUF0dHJzOz4KKworPCFFTEVNRU5UICVpbXBvcnQ7ICglYW5ub3RhdGlvbjspPz4KKzwhQVRUTElTVCAlaW1wb3J0OworICAgICAgICAgIG5hbWVzcGFjZSAgICAgICVVUklyZWY7ICNJTVBMSUVECisgICAgICAgICAgc2NoZW1hTG9jYXRpb24gJVVSSXJlZjsgI0lNUExJRUQKKyAgICAgICAgICBpZCAgICAgICAgICAgICBJRCAgICAgICAjSU1QTElFRAorICAgICAgICAgICVpbXBvcnRBdHRyczs+CisKKzwhRUxFTUVOVCAlcmVkZWZpbmU7ICglYW5ub3RhdGlvbjsgfCAlc2ltcGxlVHlwZTsgfCAlY29tcGxleFR5cGU7IHwKKyAgICAgICAgICAgICAgICAgICAgICAlYXR0cmlidXRlR3JvdXA7IHwgJWdyb3VwOykqPgorPCFBVFRMSVNUICVyZWRlZmluZTsKKyAgICAgICAgICBzY2hlbWFMb2NhdGlvbiAlVVJJcmVmOyAjUkVRVUlSRUQKKyAgICAgICAgICBpZCAgICAgICAgICAgICBJRCAgICAgICAjSU1QTElFRAorICAgICAgICAgICVyZWRlZmluZUF0dHJzOz4KKworPCFFTEVNRU5UICVub3RhdGlvbjsgKCVhbm5vdGF0aW9uOyk/PgorPCFBVFRMSVNUICVub3RhdGlvbjsKKwkgIG5hbWUgICAgICAgICVOQ05hbWU7ICAgICNSRVFVSVJFRAorCSAgaWQgICAgICAgICAgSUQgICAgICAgICAgI0lNUExJRUQKKwkgIHB1YmxpYyAgICAgIENEQVRBICAgICAgICNSRVFVSVJFRAorCSAgc3lzdGVtICAgICAgJVVSSXJlZjsgICAgI0lNUExJRUQKKwkgICVub3RhdGlvbkF0dHJzOz4KKworPCEtLSBBbm5vdGF0aW9uIGlzIGVpdGhlciBhcHBsaWNhdGlvbiBpbmZvcm1hdGlvbiBvciBkb2N1bWVudGF0aW9uIC0tPgorPCEtLSBCeSBoYXZpbmcgdGhlc2UgaGVyZSB0aGV5IGFyZSBhdmFpbGFibGUgZm9yIGRhdGF0eXBlcyBhcyB3ZWxsCisgICAgIGFzIGFsbCB0aGUgc3RydWN0dXJlcyBlbGVtZW50cyAtLT4KKworPCFFTEVNRU5UICVhbm5vdGF0aW9uOyAoJWFwcGluZm87IHwgJWRvY3VtZW50YXRpb247KSo+Cis8IUFUVExJU1QgJWFubm90YXRpb247ICVhbm5vdGF0aW9uQXR0cnM7PgorCis8IS0tIFVzZXIgbXVzdCBkZWZpbmUgYW5ub3RhdGlvbiBlbGVtZW50cyBpbiBpbnRlcm5hbCBzdWJzZXQgZm9yIHRoaXMKKyAgICAgdG8gd29yayAtLT4KKzwhRUxFTUVOVCAlYXBwaW5mbzsgQU5ZPiAgIDwhLS0gdG9vIHJlc3RyaWN0aXZlIC0tPgorPCFBVFRMSVNUICVhcHBpbmZvOworICAgICAgICAgIHNvdXJjZSAgICAgJVVSSXJlZjsgICAgICAjSU1QTElFRAorICAgICAgICAgIGlkICAgICAgICAgSUQgICAgICAgICAjSU1QTElFRAorICAgICAgICAgICVhcHBpbmZvQXR0cnM7PgorPCFFTEVNRU5UICVkb2N1bWVudGF0aW9uOyBBTlk+ICAgPCEtLSB0b28gcmVzdHJpY3RpdmUgLS0+Cis8IUFUVExJU1QgJWRvY3VtZW50YXRpb247CisgICAgICAgICAgc291cmNlICAgICAlVVJJcmVmOyAgICNJTVBMSUVECisgICAgICAgICAgaWQgICAgICAgICBJRCAgICAgICAgICNJTVBMSUVECisgICAgICAgICAgeG1sOmxhbmcgICBDREFUQSAgICAgICNJTVBMSUVECisgICAgICAgICAgJWRvY3VtZW50YXRpb25BdHRyczs+CisKKzwhTk9UQVRJT04gWE1MU2NoZW1hU3RydWN0dXJlcyBQVUJMSUMKKyAgICAgICAgICAgJ3N0cnVjdHVyZXMnICdodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS54c2QnID4KKzwhTk9UQVRJT04gWE1MIFBVQkxJQworICAgICAgICAgICAnUkVDLXhtbC0xOTk4LTAyMTAnICdodHRwOi8vd3d3LnczLm9yZy9UUi8xOTk4L1JFQy14bWwtMTk5ODAyMTAnID4KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL2V0Yy9jYXRhbG9nLnhtbCBiL2NvcmUtc2VydmVyL2V0Yy9jYXRhbG9nLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTkwYjhkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvZXRjL2NhdGFsb2cueG1sCkBAIC0wLDAgKzEsMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPGNhdGFsb2cgeG1sbnM9InVybjpvYXNpczpuYW1lczp0YzplbnRpdHk6eG1sbnM6eG1sOmNhdGFsb2ciIHByZWZlcj0ic3lzdGVtIj4KKyAgPHN5c3RlbSBzeXN0ZW1JZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS94bWwueHNkIgorICAgICAgICAgIHVyaT0ieG1sLnhzZCIvPgorICA8dXJpIG5hbWU9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZCIKKyAgICAgICB1cmk9InhtbC54c2QiLz4KKzwvY2F0YWxvZz4KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL2V0Yy9kYXRhdHlwZXMuZHRkIGIvY29yZS1zZXJ2ZXIvZXRjL2RhdGF0eXBlcy5kdGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNiNTM2MwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL2V0Yy9kYXRhdHlwZXMuZHRkCkBAIC0wLDAgKzEsMjIxIEBACis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPCEtLQorICAgICAgICBEVEQgZm9yIFhNTCBTY2hlbWFzOiBQYXJ0IDI6IERhdGF0eXBlcworICAgICAgICAkSWQ6IGRhdGF0eXBlcy5kdGQsdiAxLjIzIDIwMDEvMDMvMTYgMTc6MzY6MzAgaHQgRXhwICQKKyAgICAgICAgTm90ZSB0aGlzIERURCBpcyBOT1Qgbm9ybWF0aXZlLCBvciBldmVuIGRlZmluaXRpdmUuIC0gLSB0aGUKKyAgICAgICAgcHJvc2UgY29weSBpbiB0aGUgZGF0YXR5cGVzIFJFQyBpcyB0aGUgZGVmaW5pdGl2ZSB2ZXJzaW9uCisgICAgICAgICh3aGljaCBzaG91bGRuJ3QgZGlmZmVyIGZyb20gdGhpcyBvbmUgZXhjZXB0IGZvciB0aGlzIGNvbW1lbnQKKyAgICAgICAgYW5kIGVudGl0eSBleHBhbnNpb25zLCBidXQganVzdCBpbiBjYXNlKQorICAtLT4KKworPCEtLQorICAgICAgICBUaGlzIERURCBjYW5ub3QgYmUgdXNlZCBvbiBpdHMgb3duLCBpdCBpcyBpbnRlbmRlZAorICAgICAgICBvbmx5IGZvciBpbmNvcnBvcmF0aW9uIGluIFhNTFNjaGVtYS5kdGQsIHEudi4KKyAgLS0+CisKKzwhLS0gRGVmaW5lIGFsbCB0aGUgZWxlbWVudCBuYW1lcywgd2l0aCBvcHRpb25hbCBwcmVmaXggLS0+Cis8IUVOVElUWSAlIHNpbXBsZVR5cGUgIiVwO3NpbXBsZVR5cGUiPgorPCFFTlRJVFkgJSByZXN0cmljdGlvbiAiJXA7cmVzdHJpY3Rpb24iPgorPCFFTlRJVFkgJSBsaXN0ICIlcDtsaXN0Ij4KKzwhRU5USVRZICUgdW5pb24gIiVwO3VuaW9uIj4KKzwhRU5USVRZICUgbWF4RXhjbHVzaXZlICIlcDttYXhFeGNsdXNpdmUiPgorPCFFTlRJVFkgJSBtaW5FeGNsdXNpdmUgIiVwO21pbkV4Y2x1c2l2ZSI+Cis8IUVOVElUWSAlIG1heEluY2x1c2l2ZSAiJXA7bWF4SW5jbHVzaXZlIj4KKzwhRU5USVRZICUgbWluSW5jbHVzaXZlICIlcDttaW5JbmNsdXNpdmUiPgorPCFFTlRJVFkgJSB0b3RhbERpZ2l0cyAiJXA7dG90YWxEaWdpdHMiPgorPCFFTlRJVFkgJSBmcmFjdGlvbkRpZ2l0cyAiJXA7ZnJhY3Rpb25EaWdpdHMiPgorPCFFTlRJVFkgJSBsZW5ndGggIiVwO2xlbmd0aCI+Cis8IUVOVElUWSAlIG1pbkxlbmd0aCAiJXA7bWluTGVuZ3RoIj4KKzwhRU5USVRZICUgbWF4TGVuZ3RoICIlcDttYXhMZW5ndGgiPgorPCFFTlRJVFkgJSBlbnVtZXJhdGlvbiAiJXA7ZW51bWVyYXRpb24iPgorPCFFTlRJVFkgJSB3aGl0ZVNwYWNlICIlcDt3aGl0ZVNwYWNlIj4KKzwhRU5USVRZICUgcGF0dGVybiAiJXA7cGF0dGVybiI+CisKKzwhLS0KKyAgICAgICAgQ3VzdG9taXNhdGlvbiBlbnRpdGllcyBmb3IgdGhlIEFUVExJU1Qgb2YgZWFjaCBlbGVtZW50CisgICAgICAgIHR5cGUuIERlZmluZSBvbmUgb2YgdGhlc2UgaWYgeW91ciBzY2hlbWEgdGFrZXMgYWR2YW50YWdlCisgICAgICAgIG9mIHRoZSBhbnlBdHRyaWJ1dGU9JyMjb3RoZXInIGluIHRoZSBzY2hlbWEgZm9yIHNjaGVtYXMKKyAgLS0+CisKKzwhRU5USVRZICUgc2ltcGxlVHlwZUF0dHJzICIiPgorPCFFTlRJVFkgJSByZXN0cmljdGlvbkF0dHJzICIiPgorPCFFTlRJVFkgJSBsaXN0QXR0cnMgIiI+Cis8IUVOVElUWSAlIHVuaW9uQXR0cnMgIiI+Cis8IUVOVElUWSAlIG1heEV4Y2x1c2l2ZUF0dHJzICIiPgorPCFFTlRJVFkgJSBtaW5FeGNsdXNpdmVBdHRycyAiIj4KKzwhRU5USVRZICUgbWF4SW5jbHVzaXZlQXR0cnMgIiI+Cis8IUVOVElUWSAlIG1pbkluY2x1c2l2ZUF0dHJzICIiPgorPCFFTlRJVFkgJSB0b3RhbERpZ2l0c0F0dHJzICIiPgorPCFFTlRJVFkgJSBmcmFjdGlvbkRpZ2l0c0F0dHJzICIiPgorPCFFTlRJVFkgJSBsZW5ndGhBdHRycyAiIj4KKzwhRU5USVRZICUgbWluTGVuZ3RoQXR0cnMgIiI+Cis8IUVOVElUWSAlIG1heExlbmd0aEF0dHJzICIiPgorPCFFTlRJVFkgJSBlbnVtZXJhdGlvbkF0dHJzICIiPgorPCFFTlRJVFkgJSB3aGl0ZVNwYWNlQXR0cnMgIiI+Cis8IUVOVElUWSAlIHBhdHRlcm5BdHRycyAiIj4KKworPCEtLSBEZWZpbmUgc29tZSBlbnRpdGllcyBmb3IgaW5mb3JtYXRpdmUgdXNlIGFzIGF0dHJpYnV0ZQorICAgICAgICB0eXBlcyAtLT4KKzwhRU5USVRZICUgVVJJcmVmICJDREFUQSI+Cis8IUVOVElUWSAlIFhQYXRoRXhwciAiQ0RBVEEiPgorPCFFTlRJVFkgJSBRTmFtZSAiTk1UT0tFTiI+Cis8IUVOVElUWSAlIFFOYW1lcyAiTk1UT0tFTlMiPgorPCFFTlRJVFkgJSBOQ05hbWUgIk5NVE9LRU4iPgorPCFFTlRJVFkgJSBub25OZWdhdGl2ZUludGVnZXIgIk5NVE9LRU4iPgorPCFFTlRJVFkgJSBib29sZWFuICIodHJ1ZXxmYWxzZSkiPgorPCFFTlRJVFkgJSBzaW1wbGVEZXJpdmF0aW9uU2V0ICJDREFUQSI+Cis8IS0tCisgICAgICAgICNhbGwgb3Igc3BhY2Utc2VwYXJhdGVkIGxpc3QgZHJhd24gZnJvbSBkZXJpdmF0aW9uQ2hvaWNlCisgIC0tPgorCis8IS0tCisgICAgICAgIE5vdGUgdGhhdCB0aGUgdXNlIG9mICdmYWNldCcgYmVsb3cgaXMgbGVzcyByZXN0cmljdGl2ZQorICAgICAgICB0aGFuIGlzIHJlYWxseSBpbnRlbmRlZDogIFRoZXJlIHNob3VsZCBpbiBmYWN0IGJlIG5vCisgICAgICAgIG1vcmUgdGhhbiBvbmUgb2YgZWFjaCBvZiBtaW5JbmNsdXNpdmUsIG1pbkV4Y2x1c2l2ZSwKKyAgICAgICAgbWF4SW5jbHVzaXZlLCBtYXhFeGNsdXNpdmUsIHRvdGFsRGlnaXRzLCBmcmFjdGlvbkRpZ2l0cywKKyAgICAgICAgbGVuZ3RoLCBtYXhMZW5ndGgsIG1pbkxlbmd0aCB3aXRoaW4gZGF0YXR5cGUsCisgICAgICAgIGFuZCB0aGUgbWluLSBhbmQgbWF4LSB2YXJpYW50cyBvZiBJbmNsdXNpdmUgYW5kIEV4Y2x1c2l2ZQorICAgICAgICBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLiBPbiB0aGUgb3RoZXIgaGFuZCwgIHBhdHRlcm4gYW5kCisgICAgICAgIGVudW1lcmF0aW9uIG1heSByZXBlYXQuCisgIC0tPgorPCFFTlRJVFkgJSBtaW5Cb3VuZCAiKCVtaW5JbmNsdXNpdmU7IHwgJW1pbkV4Y2x1c2l2ZTspIj4KKzwhRU5USVRZICUgbWF4Qm91bmQgIiglbWF4SW5jbHVzaXZlOyB8ICVtYXhFeGNsdXNpdmU7KSI+Cis8IUVOVElUWSAlIGJvdW5kcyAiJW1pbkJvdW5kOyB8ICVtYXhCb3VuZDsiPgorPCFFTlRJVFkgJSBudW1lcmljICIldG90YWxEaWdpdHM7IHwgJWZyYWN0aW9uRGlnaXRzOyI+Cis8IUVOVElUWSAlIG9yZGVyZWQgIiVib3VuZHM7IHwgJW51bWVyaWM7Ij4KKzwhRU5USVRZICUgdW5vcmRlcmVkCisgICAiJXBhdHRlcm47IHwgJWVudW1lcmF0aW9uOyB8ICV3aGl0ZVNwYWNlOyB8ICVsZW5ndGg7IHwKKyAgICVtYXhMZW5ndGg7IHwgJW1pbkxlbmd0aDsiPgorPCFFTlRJVFkgJSBmYWNldCAiJW9yZGVyZWQ7IHwgJXVub3JkZXJlZDsiPgorPCFFTlRJVFkgJSBmYWNldEF0dHIgCisgICAgICAgICJ2YWx1ZSBDREFUQSAjUkVRVUlSRUQKKyAgICAgICAgaWQgSUQgI0lNUExJRUQiPgorPCFFTlRJVFkgJSBmaXhlZEF0dHIgImZpeGVkICVib29sZWFuOyAjSU1QTElFRCI+Cis8IUVOVElUWSAlIGZhY2V0TW9kZWwgIiglYW5ub3RhdGlvbjspPyI+Cis8IUVMRU1FTlQgJXNpbXBsZVR5cGU7CisgICAgICAgICgoJWFubm90YXRpb247KT8sICglcmVzdHJpY3Rpb247IHwgJWxpc3Q7IHwgJXVuaW9uOykpPgorPCFBVFRMSVNUICVzaW1wbGVUeXBlOworICAgIG5hbWUgICAgICAlTkNOYW1lOyAjSU1QTElFRAorICAgIGZpbmFsICAgICAlc2ltcGxlRGVyaXZhdGlvblNldDsgI0lNUExJRUQKKyAgICBpZCAgICAgICAgSUQgICAgICAgI0lNUExJRUQKKyAgICAlc2ltcGxlVHlwZUF0dHJzOz4KKzwhLS0gbmFtZSBpcyByZXF1aXJlZCBhdCB0b3AgbGV2ZWwgLS0+Cis8IUVMRU1FTlQgJXJlc3RyaWN0aW9uOyAoKCVhbm5vdGF0aW9uOyk/LAorICAgICAgICAgICAgICAgICAgICAgICAgICglcmVzdHJpY3Rpb24xOyB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICgoJXNpbXBsZVR5cGU7KT8sKCVmYWNldDspKikpLAorICAgICAgICAgICAgICAgICAgICAgICAgICglYXR0ckRlY2xzOykpPgorPCFBVFRMSVNUICVyZXN0cmljdGlvbjsKKyAgICBiYXNlICAgICAgJVFOYW1lOyAgICAgICAgICAgICAgICAgICNJTVBMSUVECisgICAgaWQgICAgICAgIElEICAgICAgICNJTVBMSUVECisgICAgJXJlc3RyaWN0aW9uQXR0cnM7PgorPCEtLQorICAgICAgICBiYXNlIGFuZCBzaW1wbGVUeXBlIGNoaWxkIGFyZSBtdXR1YWxseSBleGNsdXNpdmUsCisgICAgICAgIG9uZSBpcyByZXF1aXJlZC4KKworICAgICAgICByZXN0cmljdGlvbiBpcyBzaGFyZWQgYmV0d2VlbiBzaW1wbGVUeXBlIGFuZAorICAgICAgICBzaW1wbGVDb250ZW50IGFuZCBjb21wbGV4Q29udGVudCAoaW4gWE1MU2NoZW1hLnhzZCkuCisgICAgICAgIHJlc3RyaWN0aW9uMSBpcyBmb3IgdGhlIGxhdHRlciBjYXNlcywgd2hlbiB0aGlzCisgICAgICAgIGlzIHJlc3RyaWN0aW5nIGEgY29tcGxleCB0eXBlLCBhcyBpcyBhdHRyRGVjbHMuCisgIC0tPgorPCFFTEVNRU5UICVsaXN0OyAoKCVhbm5vdGF0aW9uOyk/LCglc2ltcGxlVHlwZTspPyk+Cis8IUFUVExJU1QgJWxpc3Q7CisgICAgaXRlbVR5cGUgICAgICAlUU5hbWU7ICAgICAgICAgICAgICNJTVBMSUVECisgICAgaWQgICAgICAgIElEICAgICAgICNJTVBMSUVECisgICAgJWxpc3RBdHRyczs+Cis8IS0tCisgICAgICAgIGl0ZW1UeXBlIGFuZCBzaW1wbGVUeXBlIGNoaWxkIGFyZSBtdXR1YWxseSBleGNsdXNpdmUsCisgICAgICAgIG9uZSBpcyByZXF1aXJlZAorICAtLT4KKzwhRUxFTUVOVCAldW5pb247ICgoJWFubm90YXRpb247KT8sKCVzaW1wbGVUeXBlOykqKT4KKzwhQVRUTElTVCAldW5pb247CisgICAgaWQgICAgICAgICAgICBJRCAgICAgICAjSU1QTElFRAorICAgIG1lbWJlclR5cGVzICAgJVFOYW1lczsgICAgICAgICAgICAjSU1QTElFRAorICAgICV1bmlvbkF0dHJzOz4KKzwhLS0KKyAgICAgICAgQXQgbGVhc3Qgb25lIGl0ZW0gaW4gbWVtYmVyVHlwZXMgb3Igb25lIHNpbXBsZVR5cGUKKyAgICAgICAgY2hpbGQgaXMgcmVxdWlyZWQKKyAgLS0+CisKKzwhRUxFTUVOVCAlbWF4RXhjbHVzaXZlOyAlZmFjZXRNb2RlbDs+Cis8IUFUVExJU1QgJW1heEV4Y2x1c2l2ZTsKKyAgICAgICAgJWZhY2V0QXR0cjsKKyAgICAgICAgJWZpeGVkQXR0cjsKKyAgICAgICAgJW1heEV4Y2x1c2l2ZUF0dHJzOz4KKzwhRUxFTUVOVCAlbWluRXhjbHVzaXZlOyAlZmFjZXRNb2RlbDs+Cis8IUFUVExJU1QgJW1pbkV4Y2x1c2l2ZTsKKyAgICAgICAgJWZhY2V0QXR0cjsKKyAgICAgICAgJWZpeGVkQXR0cjsKKyAgICAgICAgJW1pbkV4Y2x1c2l2ZUF0dHJzOz4KKworPCFFTEVNRU5UICVtYXhJbmNsdXNpdmU7ICVmYWNldE1vZGVsOz4KKzwhQVRUTElTVCAlbWF4SW5jbHVzaXZlOworICAgICAgICAlZmFjZXRBdHRyOworICAgICAgICAlZml4ZWRBdHRyOworICAgICAgICAlbWF4SW5jbHVzaXZlQXR0cnM7PgorPCFFTEVNRU5UICVtaW5JbmNsdXNpdmU7ICVmYWNldE1vZGVsOz4KKzwhQVRUTElTVCAlbWluSW5jbHVzaXZlOworICAgICAgICAlZmFjZXRBdHRyOworICAgICAgICAlZml4ZWRBdHRyOworICAgICAgICAlbWluSW5jbHVzaXZlQXR0cnM7PgorCis8IUVMRU1FTlQgJXRvdGFsRGlnaXRzOyAlZmFjZXRNb2RlbDs+Cis8IUFUVExJU1QgJXRvdGFsRGlnaXRzOworICAgICAgICAlZmFjZXRBdHRyOworICAgICAgICAlZml4ZWRBdHRyOworICAgICAgICAldG90YWxEaWdpdHNBdHRyczs+Cis8IUVMRU1FTlQgJWZyYWN0aW9uRGlnaXRzOyAlZmFjZXRNb2RlbDs+Cis8IUFUVExJU1QgJWZyYWN0aW9uRGlnaXRzOworICAgICAgICAlZmFjZXRBdHRyOworICAgICAgICAlZml4ZWRBdHRyOworICAgICAgICAlZnJhY3Rpb25EaWdpdHNBdHRyczs+CisKKzwhRUxFTUVOVCAlbGVuZ3RoOyAlZmFjZXRNb2RlbDs+Cis8IUFUVExJU1QgJWxlbmd0aDsKKyAgICAgICAgJWZhY2V0QXR0cjsKKyAgICAgICAgJWZpeGVkQXR0cjsKKyAgICAgICAgJWxlbmd0aEF0dHJzOz4KKzwhRUxFTUVOVCAlbWluTGVuZ3RoOyAlZmFjZXRNb2RlbDs+Cis8IUFUVExJU1QgJW1pbkxlbmd0aDsKKyAgICAgICAgJWZhY2V0QXR0cjsKKyAgICAgICAgJWZpeGVkQXR0cjsKKyAgICAgICAgJW1pbkxlbmd0aEF0dHJzOz4KKzwhRUxFTUVOVCAlbWF4TGVuZ3RoOyAlZmFjZXRNb2RlbDs+Cis8IUFUVExJU1QgJW1heExlbmd0aDsKKyAgICAgICAgJWZhY2V0QXR0cjsKKyAgICAgICAgJWZpeGVkQXR0cjsKKyAgICAgICAgJW1heExlbmd0aEF0dHJzOz4KKworPCEtLSBUaGlzIG9uZSBjYW4gYmUgcmVwZWF0ZWQgLS0+Cis8IUVMRU1FTlQgJWVudW1lcmF0aW9uOyAlZmFjZXRNb2RlbDs+Cis8IUFUVExJU1QgJWVudW1lcmF0aW9uOworICAgICAgICAlZmFjZXRBdHRyOworICAgICAgICAlZW51bWVyYXRpb25BdHRyczs+CisKKzwhRUxFTUVOVCAld2hpdGVTcGFjZTsgJWZhY2V0TW9kZWw7PgorPCFBVFRMSVNUICV3aGl0ZVNwYWNlOworICAgICAgICAlZmFjZXRBdHRyOworICAgICAgICAlZml4ZWRBdHRyOworICAgICAgICAld2hpdGVTcGFjZUF0dHJzOz4KKworPCEtLSBUaGlzIG9uZSBjYW4gYmUgcmVwZWF0ZWQgLS0+Cis8IUVMRU1FTlQgJXBhdHRlcm47ICVmYWNldE1vZGVsOz4KKzwhQVRUTElTVCAlcGF0dGVybjsKKyAgICAgICAgJWZhY2V0QXR0cjsKKyAgICAgICAgJXBhdHRlcm5BdHRyczs+CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9ldGMvd2FkbC54c2QgYi9jb3JlLXNlcnZlci9ldGMvd2FkbC54c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIyZDBmMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL2V0Yy93YWRsLnhzZApAQCAtMCwwICsxLDI4MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8eHM6c2NoZW1hIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKKyAgdGFyZ2V0TmFtZXNwYWNlPSJodHRwOi8vd2FkbC5kZXYuamF2YS5uZXQvMjAwOS8wMiIKKyAgeG1sbnM6dG5zPSJodHRwOi8vd2FkbC5kZXYuamF2YS5uZXQvMjAwOS8wMiIKKyAgeG1sbnM6eG1sPSJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiCisgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIj4KKworICA8eHM6aW1wb3J0IG5hbWVzcGFjZT0iaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIgorICAgIHNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2QiLz4KKworICA8eHM6ZWxlbWVudCBuYW1lPSJhcHBsaWNhdGlvbiI+CisgICAgPHhzOmNvbXBsZXhUeXBlPgorICAgICAgPHhzOnNlcXVlbmNlPgorICAgICAgICA8eHM6ZWxlbWVudCByZWY9InRuczpkb2MiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ0bnM6Z3JhbW1hcnMiIG1pbk9jY3Vycz0iMCIvPgorICAgICAgICA8eHM6ZWxlbWVudCByZWY9InRuczpyZXNvdXJjZXMiIG1pbk9jY3Vycz0iMCIKKyAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICAgIDx4czplbGVtZW50IHJlZj0idG5zOnJlc291cmNlX3R5cGUiLz4KKyAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InRuczptZXRob2QiLz4KKyAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InRuczpyZXByZXNlbnRhdGlvbiIvPgorICAgICAgICAgIDx4czplbGVtZW50IHJlZj0idG5zOnBhcmFtIi8+CisgICAgICAgIDwveHM6Y2hvaWNlPgorICAgICAgICA8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG1pbk9jY3Vycz0iMCIKKyAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPC94czpzZXF1ZW5jZT4KKyAgICA8L3hzOmNvbXBsZXhUeXBlPgorICA8L3hzOmVsZW1lbnQ+CisKKyAgPHhzOmVsZW1lbnQgbmFtZT0iZG9jIj4KKyAgICA8eHM6Y29tcGxleFR5cGUgbWl4ZWQ9InRydWUiPgorICAgICAgPHhzOnNlcXVlbmNlPgorICAgICAgICA8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG1pbk9jY3Vycz0iMCIKKyAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPC94czpzZXF1ZW5jZT4KKyAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idGl0bGUiIHR5cGU9InhzOnN0cmluZyIvPgorICAgICAgPHhzOmF0dHJpYnV0ZSByZWY9InhtbDpsYW5nIi8+CisgICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KKyAgICA8L3hzOmNvbXBsZXhUeXBlPgorICA8L3hzOmVsZW1lbnQ+CisKKyAgPHhzOmVsZW1lbnQgbmFtZT0iZ3JhbW1hcnMiPgorICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgIDx4czpzZXF1ZW5jZT4KKyAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ0bnM6ZG9jIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgIDx4czplbGVtZW50IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIHJlZj0idG5zOmluY2x1ZGUiLz4KKyAgICAgICAgPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiBtaW5PY2N1cnM9IjAiCisgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDwveHM6c2VxdWVuY2U+CisgICAgPC94czpjb21wbGV4VHlwZT4KKyAgPC94czplbGVtZW50PgorCisgIDx4czplbGVtZW50IG5hbWU9InJlc291cmNlcyI+CisgICAgPHhzOmNvbXBsZXhUeXBlPgorICAgICAgPHhzOnNlcXVlbmNlPgorICAgICAgICA8eHM6ZWxlbWVudCByZWY9InRuczpkb2MiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ0bnM6cmVzb3VyY2UiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgIDx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgbWluT2NjdXJzPSIwIgorICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8L3hzOnNlcXVlbmNlPgorICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJiYXNlIiB0eXBlPSJ4czphbnlVUkkiLz4KKyAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgorICAgIDwveHM6Y29tcGxleFR5cGU+CisgIDwveHM6ZWxlbWVudD4KKworICA8eHM6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZSI+CisgICAgPHhzOmNvbXBsZXhUeXBlPgorICAgICAgPHhzOnNlcXVlbmNlPgorICAgICAgICA8eHM6ZWxlbWVudCByZWY9InRuczpkb2MiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ0bnM6cGFyYW0iIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InRuczptZXRob2QiLz4KKyAgICAgICAgICA8eHM6ZWxlbWVudCByZWY9InRuczpyZXNvdXJjZSIvPgorICAgICAgICA8L3hzOmNob2ljZT4KKyAgICAgICAgPHhzOmFueSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBuYW1lc3BhY2U9IiMjb3RoZXIiCisgICAgICAgICAgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KKyAgICAgIDwveHM6c2VxdWVuY2U+CisgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ4czpJRCIvPgorICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ0bnM6cmVzb3VyY2VfdHlwZV9saXN0Ii8+CisgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InF1ZXJ5VHlwZSIgdHlwZT0ieHM6c3RyaW5nIgorICAgICAgICBkZWZhdWx0PSJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiLz4KKyAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icGF0aCIgdHlwZT0ieHM6c3RyaW5nIi8+CisgICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KKyAgICA8L3hzOmNvbXBsZXhUeXBlPgorICA8L3hzOmVsZW1lbnQ+CisKKyAgPHhzOnNpbXBsZVR5cGUgbmFtZT0icmVzb3VyY2VfdHlwZV9saXN0Ij4KKyAgICA8eHM6bGlzdCBpdGVtVHlwZT0ieHM6YW55VVJJIi8+CisgIDwveHM6c2ltcGxlVHlwZT4KKworICA8eHM6ZWxlbWVudCBuYW1lPSJyZXNvdXJjZV90eXBlIj4KKyAgICA8eHM6Y29tcGxleFR5cGU+CisgICAgICA8eHM6c2VxdWVuY2U+CisgICAgICAgIDx4czplbGVtZW50IHJlZj0idG5zOmRvYyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICA8eHM6ZWxlbWVudCByZWY9InRuczpwYXJhbSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICAgIDx4czplbGVtZW50IHJlZj0idG5zOm1ldGhvZCIvPgorICAgICAgICAgIDx4czplbGVtZW50IHJlZj0idG5zOnJlc291cmNlIi8+CisgICAgICAgIDwveHM6Y2hvaWNlPgorICAgICAgICA8eHM6YW55IG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG5hbWVzcGFjZT0iIyNvdGhlciIKKyAgICAgICAgICBwcm9jZXNzQ29udGVudHM9ImxheCIvPgorICAgICAgPC94czpzZXF1ZW5jZT4KKyAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzOklEIi8+CisgICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KKyAgICA8L3hzOmNvbXBsZXhUeXBlPgorICA8L3hzOmVsZW1lbnQ+CisKKyAgPHhzOmVsZW1lbnQgbmFtZT0ibWV0aG9kIj4KKyAgICA8eHM6Y29tcGxleFR5cGU+CisgICAgICA8eHM6c2VxdWVuY2U+CisgICAgICAgIDx4czplbGVtZW50IHJlZj0idG5zOmRvYyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICA8eHM6ZWxlbWVudCByZWY9InRuczpyZXF1ZXN0IiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ0bnM6cmVzcG9uc2UiIG1pbk9jY3Vycz0iMCIKKyAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICA8eHM6YW55IG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiIG1pbk9jY3Vycz0iMCIKKyAgICAgICAgICBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgPC94czpzZXF1ZW5jZT4KKyAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9InhzOklEIi8+CisgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InRuczpNZXRob2QiLz4KKyAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaHJlZiIgdHlwZT0ieHM6YW55VVJJIi8+CisgICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KKyAgICA8L3hzOmNvbXBsZXhUeXBlPgorICA8L3hzOmVsZW1lbnQ+CisKKyAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iTWV0aG9kIj4KKyAgICA8eHM6dW5pb24gbWVtYmVyVHlwZXM9InRuczpIVFRQTWV0aG9kcyB4czpOTVRPS0VOIi8+CisgIDwveHM6c2ltcGxlVHlwZT4KKworICA8eHM6c2ltcGxlVHlwZSBuYW1lPSJIVFRQTWV0aG9kcyI+CisgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOk5NVE9LRU4iPgorICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJHRVQiLz4KKyAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iUE9TVCIvPgorICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJQVVQiLz4KKyAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0iSEVBRCIvPgorICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJERUxFVEUiLz4KKyAgICA8L3hzOnJlc3RyaWN0aW9uPgorICA8L3hzOnNpbXBsZVR5cGU+CisKKyAgPHhzOmVsZW1lbnQgbmFtZT0iaW5jbHVkZSI+CisgICAgPHhzOmNvbXBsZXhUeXBlPgorICAgICAgPHhzOnNlcXVlbmNlPgorICAgICAgICA8eHM6ZWxlbWVudCByZWY9InRuczpkb2MiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDwveHM6c2VxdWVuY2U+CisgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImhyZWYiIHR5cGU9InhzOmFueVVSSSIvPgorICAgICAgPHhzOmFueUF0dHJpYnV0ZSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4Ii8+CisgICAgPC94czpjb21wbGV4VHlwZT4KKyAgPC94czplbGVtZW50PgorCisgIDx4czplbGVtZW50IG5hbWU9InJlcXVlc3QiPgorICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgIDx4czpzZXF1ZW5jZT4KKyAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ0bnM6ZG9jIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgIDx4czplbGVtZW50IHJlZj0idG5zOnBhcmFtIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgIDx4czplbGVtZW50IHJlZj0idG5zOnJlcHJlc2VudGF0aW9uIiBtaW5PY2N1cnM9IjAiCisgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiBtaW5PY2N1cnM9IjAiCisgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDwveHM6c2VxdWVuY2U+CisgICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KKyAgICA8L3hzOmNvbXBsZXhUeXBlPgorICA8L3hzOmVsZW1lbnQ+CisKKyAgPHhzOmVsZW1lbnQgbmFtZT0icmVzcG9uc2UiPgorICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgIDx4czpzZXF1ZW5jZT4KKyAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ0bnM6ZG9jIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgIDx4czplbGVtZW50IHJlZj0idG5zOnBhcmFtIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgIDx4czplbGVtZW50IHJlZj0idG5zOnJlcHJlc2VudGF0aW9uIiBtaW5PY2N1cnM9IjAiCisgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiBtaW5PY2N1cnM9IjAiCisgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDwveHM6c2VxdWVuY2U+CisgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InN0YXR1cyIgdHlwZT0idG5zOnN0YXR1c0NvZGVMaXN0Ii8+CisgICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KKyAgICA8L3hzOmNvbXBsZXhUeXBlPgorICA8L3hzOmVsZW1lbnQ+CisKKyAgPHhzOnNpbXBsZVR5cGUgbmFtZT0idXJpTGlzdCI+CisgICAgPHhzOmxpc3QgaXRlbVR5cGU9InhzOmFueVVSSSIvPgorICA8L3hzOnNpbXBsZVR5cGU+CisKKyAgPHhzOmVsZW1lbnQgbmFtZT0icmVwcmVzZW50YXRpb24iPgorICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgIDx4czpzZXF1ZW5jZT4KKyAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ0bnM6ZG9jIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgIDx4czplbGVtZW50IHJlZj0idG5zOnBhcmFtIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgIDx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgbWluT2NjdXJzPSIwIgorICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8L3hzOnNlcXVlbmNlPgorICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHM6SUQiLz4KKyAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZWxlbWVudCIgdHlwZT0ieHM6UU5hbWUiLz4KKyAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWVkaWFUeXBlIiB0eXBlPSJ4czpzdHJpbmciLz4KKyAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaHJlZiIgdHlwZT0ieHM6YW55VVJJIi8+CisgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InByb2ZpbGUiIHR5cGU9InRuczp1cmlMaXN0Ii8+CisgICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KKyAgICA8L3hzOmNvbXBsZXhUeXBlPgorICA8L3hzOmVsZW1lbnQ+CisKKyAgPHhzOnNpbXBsZVR5cGUgbmFtZT0ic3RhdHVzQ29kZUxpc3QiPgorICAgIDx4czpsaXN0IGl0ZW1UeXBlPSJ4czp1bnNpZ25lZEludCIvPgorICA8L3hzOnNpbXBsZVR5cGU+CisKKyAgPHhzOnNpbXBsZVR5cGUgbmFtZT0iUGFyYW1TdHlsZSI+CisgICAgPHhzOnJlc3RyaWN0aW9uIGJhc2U9InhzOnN0cmluZyI+CisgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InBsYWluIi8+CisgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InF1ZXJ5Ii8+CisgICAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9Im1hdHJpeCIvPgorICAgICAgPHhzOmVudW1lcmF0aW9uIHZhbHVlPSJoZWFkZXIiLz4KKyAgICAgIDx4czplbnVtZXJhdGlvbiB2YWx1ZT0idGVtcGxhdGUiLz4KKyAgICA8L3hzOnJlc3RyaWN0aW9uPgorICA8L3hzOnNpbXBsZVR5cGU+CisKKyAgPHhzOmVsZW1lbnQgbmFtZT0icGFyYW0iPgorICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgIDx4czpzZXF1ZW5jZT4KKyAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ0bnM6ZG9jIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgIDx4czplbGVtZW50IHJlZj0idG5zOm9wdGlvbiIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICA8eHM6ZWxlbWVudCByZWY9InRuczpsaW5rIiBtaW5PY2N1cnM9IjAiLz4KKyAgICAgICAgPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiBtaW5PY2N1cnM9IjAiCisgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDwveHM6c2VxdWVuY2U+CisgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImhyZWYiIHR5cGU9InhzOmFueVVSSSIvPgorICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpOTVRPS0VOIi8+CisgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InN0eWxlIiB0eXBlPSJ0bnM6UGFyYW1TdHlsZSIvPgorICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ieHM6SUQiLz4KKyAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ieHM6UU5hbWUiIGRlZmF1bHQ9InhzOnN0cmluZyIvPgorICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0IiB0eXBlPSJ4czpzdHJpbmciLz4KKyAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVxdWlyZWQiIHR5cGU9InhzOmJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIi8+CisgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlcGVhdGluZyIgdHlwZT0ieHM6Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiLz4KKyAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZml4ZWQiIHR5cGU9InhzOnN0cmluZyIvPgorICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJwYXRoIiB0eXBlPSJ4czpzdHJpbmciLz4KKyAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgorICAgIDwveHM6Y29tcGxleFR5cGU+CisgIDwveHM6ZWxlbWVudD4KKworICA8eHM6ZWxlbWVudCBuYW1lPSJvcHRpb24iPgorICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgIDx4czpzZXF1ZW5jZT4KKyAgICAgICAgPHhzOmVsZW1lbnQgcmVmPSJ0bnM6ZG9jIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgIDx4czphbnkgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIgbWluT2NjdXJzPSIwIgorICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICA8L3hzOnNlcXVlbmNlPgorICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHM6c3RyaW5nIiB1c2U9InJlcXVpcmVkIi8+CisgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1lZGlhVHlwZSIgdHlwZT0ieHM6c3RyaW5nIi8+CisgICAgICA8eHM6YW55QXR0cmlidXRlIG5hbWVzcGFjZT0iIyNvdGhlciIgcHJvY2Vzc0NvbnRlbnRzPSJsYXgiLz4KKyAgICA8L3hzOmNvbXBsZXhUeXBlPgorICA8L3hzOmVsZW1lbnQ+CisKKyAgPHhzOmVsZW1lbnQgbmFtZT0ibGluayI+CisgICAgPHhzOmNvbXBsZXhUeXBlPgorICAgICAgPHhzOnNlcXVlbmNlPgorICAgICAgICA8eHM6ZWxlbWVudCByZWY9InRuczpkb2MiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgPHhzOmFueSBuYW1lc3BhY2U9IiMjb3RoZXIiIHByb2Nlc3NDb250ZW50cz0ibGF4IiBtaW5PY2N1cnM9IjAiCisgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgIDwveHM6c2VxdWVuY2U+CisgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlc291cmNlX3R5cGUiIHR5cGU9InhzOmFueVVSSSIvPgorICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyZWwiIHR5cGU9InhzOnRva2VuIi8+CisgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJldiIgdHlwZT0ieHM6dG9rZW4iLz4KKyAgICAgIDx4czphbnlBdHRyaWJ1dGUgbmFtZXNwYWNlPSIjI290aGVyIiBwcm9jZXNzQ29udGVudHM9ImxheCIvPgorICAgIDwveHM6Y29tcGxleFR5cGU+CisgIDwveHM6ZWxlbWVudD4KKworPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9ldGMveG1sLnhzZCBiL2NvcmUtc2VydmVyL2V0Yy94bWwueHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNmE1ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9ldGMveG1sLnhzZApAQCAtMCwwICsxLDEzNSBAQAorPD94bWwgdmVyc2lvbj0nMS4wJz8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPCFET0NUWVBFIHhzOnNjaGVtYSBQVUJMSUMgIi0vL1czQy8vRFREIFhNTFNDSEVNQSAyMDAxMDIvL0VOIiAiWE1MU2NoZW1hLmR0ZCIgPgorPHhzOnNjaGVtYSB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB4bWw6bGFuZz0iZW4iPgorCisgPHhzOmFubm90YXRpb24+CisgIDx4czpkb2N1bWVudGF0aW9uPgorICAgU2VlIGh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZS5odG1sIGFuZAorICAgaHR0cDovL3d3dy53My5vcmcvVFIvUkVDLXhtbCBmb3IgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBuYW1lc3BhY2UuCisKKyAgICBUaGlzIHNjaGVtYSBkb2N1bWVudCBkZXNjcmliZXMgdGhlIFhNTCBuYW1lc3BhY2UsIGluIGEgZm9ybQorICAgIHN1aXRhYmxlIGZvciBpbXBvcnQgYnkgb3RoZXIgc2NoZW1hIGRvY3VtZW50cy4gIAorCisgICAgTm90ZSB0aGF0IGxvY2FsIG5hbWVzIGluIHRoaXMgbmFtZXNwYWNlIGFyZSBpbnRlbmRlZCB0byBiZSBkZWZpbmVkCisgICAgb25seSBieSB0aGUgV29ybGQgV2lkZSBXZWIgQ29uc29ydGl1bSBvciBpdHMgc3ViZ3JvdXBzLiAgVGhlCisgICAgZm9sbG93aW5nIG5hbWVzIGFyZSBjdXJyZW50bHkgZGVmaW5lZCBpbiB0aGlzIG5hbWVzcGFjZSBhbmQgc2hvdWxkCisgICAgbm90IGJlIHVzZWQgd2l0aCBjb25mbGljdGluZyBzZW1hbnRpY3MgYnkgYW55IFdvcmtpbmcgR3JvdXAsCisgICAgc3BlY2lmaWNhdGlvbiwgb3IgZG9jdW1lbnQgaW5zdGFuY2U6CisKKyAgICBiYXNlIChhcyBhbiBhdHRyaWJ1dGUgbmFtZSk6IGRlbm90ZXMgYW4gYXR0cmlidXRlIHdob3NlIHZhbHVlCisgICAgICAgICBwcm92aWRlcyBhIFVSSSB0byBiZSB1c2VkIGFzIHRoZSBiYXNlIGZvciBpbnRlcnByZXRpbmcgYW55CisgICAgICAgICByZWxhdGl2ZSBVUklzIGluIHRoZSBzY29wZSBvZiB0aGUgZWxlbWVudCBvbiB3aGljaCBpdAorICAgICAgICAgYXBwZWFyczsgaXRzIHZhbHVlIGlzIGluaGVyaXRlZC4gIFRoaXMgbmFtZSBpcyByZXNlcnZlZAorICAgICAgICAgYnkgdmlydHVlIG9mIGl0cyBkZWZpbml0aW9uIGluIHRoZSBYTUwgQmFzZSBzcGVjaWZpY2F0aW9uLgorCisgICAgbGFuZyAoYXMgYW4gYXR0cmlidXRlIG5hbWUpOiBkZW5vdGVzIGFuIGF0dHJpYnV0ZSB3aG9zZSB2YWx1ZQorICAgICAgICAgaXMgYSBsYW5ndWFnZSBjb2RlIGZvciB0aGUgbmF0dXJhbCBsYW5ndWFnZSBvZiB0aGUgY29udGVudCBvZgorICAgICAgICAgYW55IGVsZW1lbnQ7IGl0cyB2YWx1ZSBpcyBpbmhlcml0ZWQuICBUaGlzIG5hbWUgaXMgcmVzZXJ2ZWQKKyAgICAgICAgIGJ5IHZpcnR1ZSBvZiBpdHMgZGVmaW5pdGlvbiBpbiB0aGUgWE1MIHNwZWNpZmljYXRpb24uCisgIAorICAgIHNwYWNlIChhcyBhbiBhdHRyaWJ1dGUgbmFtZSk6IGRlbm90ZXMgYW4gYXR0cmlidXRlIHdob3NlCisgICAgICAgICB2YWx1ZSBpcyBhIGtleXdvcmQgaW5kaWNhdGluZyB3aGF0IHdoaXRlc3BhY2UgcHJvY2Vzc2luZworICAgICAgICAgZGlzY2lwbGluZSBpcyBpbnRlbmRlZCBmb3IgdGhlIGNvbnRlbnQgb2YgdGhlIGVsZW1lbnQ7IGl0cworICAgICAgICAgdmFsdWUgaXMgaW5oZXJpdGVkLiAgVGhpcyBuYW1lIGlzIHJlc2VydmVkIGJ5IHZpcnR1ZSBvZiBpdHMKKyAgICAgICAgIGRlZmluaXRpb24gaW4gdGhlIFhNTCBzcGVjaWZpY2F0aW9uLgorCisgICAgRmF0aGVyIChpbiBhbnkgY29udGV4dCBhdCBhbGwpOiBkZW5vdGVzIEpvbiBCb3NhaywgdGhlIGNoYWlyIG9mIAorICAgICAgICAgdGhlIG9yaWdpbmFsIFhNTCBXb3JraW5nIEdyb3VwLiAgVGhpcyBuYW1lIGlzIHJlc2VydmVkIGJ5IAorICAgICAgICAgdGhlIGZvbGxvd2luZyBkZWNpc2lvbiBvZiB0aGUgVzNDIFhNTCBQbGVuYXJ5IGFuZCAKKyAgICAgICAgIFhNTCBDb29yZGluYXRpb24gZ3JvdXBzOgorCisgICAgICAgICAgICAgSW4gYXBwcmVjaWF0aW9uIGZvciBoaXMgdmlzaW9uLCBsZWFkZXJzaGlwIGFuZCBkZWRpY2F0aW9uCisgICAgICAgICAgICAgdGhlIFczQyBYTUwgUGxlbmFyeSBvbiB0aGlzIDEwdGggZGF5IG9mIEZlYnJ1YXJ5LCAyMDAwCisgICAgICAgICAgICAgcmVzZXJ2ZXMgZm9yIEpvbiBCb3NhayBpbiBwZXJwZXR1aXR5IHRoZSBYTUwgbmFtZQorICAgICAgICAgICAgIHhtbDpGYXRoZXIKKyAgPC94czpkb2N1bWVudGF0aW9uPgorIDwveHM6YW5ub3RhdGlvbj4KKworIDx4czphbm5vdGF0aW9uPgorICA8eHM6ZG9jdW1lbnRhdGlvbj5UaGlzIHNjaGVtYSBkZWZpbmVzIGF0dHJpYnV0ZXMgYW5kIGFuIGF0dHJpYnV0ZSBncm91cAorICAgICAgICBzdWl0YWJsZSBmb3IgdXNlIGJ5CisgICAgICAgIHNjaGVtYXMgd2lzaGluZyB0byBhbGxvdyB4bWw6YmFzZSwgeG1sOmxhbmcgb3IgeG1sOnNwYWNlIGF0dHJpYnV0ZXMKKyAgICAgICAgb24gZWxlbWVudHMgdGhleSBkZWZpbmUuCisKKyAgICAgICAgVG8gZW5hYmxlIHRoaXMsIHN1Y2ggYSBzY2hlbWEgbXVzdCBpbXBvcnQgdGhpcyBzY2hlbWEKKyAgICAgICAgZm9yIHRoZSBYTUwgbmFtZXNwYWNlLCBlLmcuIGFzIGZvbGxvd3M6CisgICAgICAgICZsdDtzY2hlbWEgLiAuIC4+CisgICAgICAgICAuIC4gLgorICAgICAgICAgJmx0O2ltcG9ydCBuYW1lc3BhY2U9Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIKKyAgICAgICAgICAgICAgICAgICAgc2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvMDMveG1sLnhzZCIvPgorCisgICAgICAgIFN1YnNlcXVlbnRseSwgcXVhbGlmaWVkIHJlZmVyZW5jZSB0byBhbnkgb2YgdGhlIGF0dHJpYnV0ZXMKKyAgICAgICAgb3IgdGhlIGdyb3VwIGRlZmluZWQgYmVsb3cgd2lsbCBoYXZlIHRoZSBkZXNpcmVkIGVmZmVjdCwgZS5nLgorCisgICAgICAgICZsdDt0eXBlIC4gLiAuPgorICAgICAgICAgLiAuIC4KKyAgICAgICAgICZsdDthdHRyaWJ1dGVHcm91cCByZWY9InhtbDpzcGVjaWFsQXR0cnMiLz4KKyAKKyAgICAgICAgIHdpbGwgZGVmaW5lIGEgdHlwZSB3aGljaCB3aWxsIHNjaGVtYS12YWxpZGF0ZSBhbiBpbnN0YW5jZQorICAgICAgICAgZWxlbWVudCB3aXRoIGFueSBvZiB0aG9zZSBhdHRyaWJ1dGVzPC94czpkb2N1bWVudGF0aW9uPgorIDwveHM6YW5ub3RhdGlvbj4KKworIDx4czphbm5vdGF0aW9uPgorICA8eHM6ZG9jdW1lbnRhdGlvbj5JbiBrZWVwaW5nIHdpdGggdGhlIFhNTCBTY2hlbWEgV0cncyBzdGFuZGFyZCB2ZXJzaW9uaW5nCisgICBwb2xpY3ksIHRoaXMgc2NoZW1hIGRvY3VtZW50IHdpbGwgcGVyc2lzdCBhdAorICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS8wMy94bWwueHNkLgorICAgQXQgdGhlIGRhdGUgb2YgaXNzdWUgaXQgY2FuIGFsc28gYmUgZm91bmQgYXQKKyAgIGh0dHA6Ly93d3cudzMub3JnLzIwMDEveG1sLnhzZC4KKyAgIFRoZSBzY2hlbWEgZG9jdW1lbnQgYXQgdGhhdCBVUkkgbWF5IGhvd2V2ZXIgY2hhbmdlIGluIHRoZSBmdXR1cmUsCisgICBpbiBvcmRlciB0byByZW1haW4gY29tcGF0aWJsZSB3aXRoIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBYTUwgU2NoZW1hCisgICBpdHNlbGYuICBJbiBvdGhlciB3b3JkcywgaWYgdGhlIFhNTCBTY2hlbWEgbmFtZXNwYWNlIGNoYW5nZXMsIHRoZSB2ZXJzaW9uCisgICBvZiB0aGlzIGRvY3VtZW50IGF0CisgICBodHRwOi8vd3d3LnczLm9yZy8yMDAxL3htbC54c2Qgd2lsbCBjaGFuZ2UKKyAgIGFjY29yZGluZ2x5OyB0aGUgdmVyc2lvbiBhdAorICAgaHR0cDovL3d3dy53My5vcmcvMjAwMS8wMy94bWwueHNkIHdpbGwgbm90IGNoYW5nZS4KKyAgPC94czpkb2N1bWVudGF0aW9uPgorIDwveHM6YW5ub3RhdGlvbj4KKworIDx4czphdHRyaWJ1dGUgbmFtZT0ibGFuZyIgdHlwZT0ieHM6bGFuZ3VhZ2UiPgorICA8eHM6YW5ub3RhdGlvbj4KKyAgIDx4czpkb2N1bWVudGF0aW9uPkluIGR1ZSBjb3Vyc2UsIHdlIHNob3VsZCBpbnN0YWxsIHRoZSByZWxldmFudCBJU08gMi0gYW5kIDMtbGV0dGVyCisgICAgICAgICBjb2RlcyBhcyB0aGUgZW51bWVyYXRlZCBwb3NzaWJsZSB2YWx1ZXMgLiAuIC48L3hzOmRvY3VtZW50YXRpb24+CisgIDwveHM6YW5ub3RhdGlvbj4KKyA8L3hzOmF0dHJpYnV0ZT4KKworIDx4czphdHRyaWJ1dGUgbmFtZT0ic3BhY2UiIGRlZmF1bHQ9InByZXNlcnZlIj4KKyAgPHhzOnNpbXBsZVR5cGU+CisgICA8eHM6cmVzdHJpY3Rpb24gYmFzZT0ieHM6TkNOYW1lIj4KKyAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9ImRlZmF1bHQiLz4KKyAgICA8eHM6ZW51bWVyYXRpb24gdmFsdWU9InByZXNlcnZlIi8+CisgICA8L3hzOnJlc3RyaWN0aW9uPgorICA8L3hzOnNpbXBsZVR5cGU+CisgPC94czphdHRyaWJ1dGU+CisKKyA8eHM6YXR0cmlidXRlIG5hbWU9ImJhc2UiIHR5cGU9InhzOmFueVVSSSI+CisgIDx4czphbm5vdGF0aW9uPgorICAgPHhzOmRvY3VtZW50YXRpb24+U2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL3htbGJhc2UvIGZvcgorICAgICAgICAgICAgICAgICAgICAgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBhdHRyaWJ1dGUuPC94czpkb2N1bWVudGF0aW9uPgorICA8L3hzOmFubm90YXRpb24+CisgPC94czphdHRyaWJ1dGU+CisKKyA8eHM6YXR0cmlidXRlR3JvdXAgbmFtZT0ic3BlY2lhbEF0dHJzIj4KKyAgPHhzOmF0dHJpYnV0ZSByZWY9InhtbDpiYXNlIi8+CisgIDx4czphdHRyaWJ1dGUgcmVmPSJ4bWw6bGFuZyIvPgorICA8eHM6YXR0cmlidXRlIHJlZj0ieG1sOnNwYWNlIi8+CisgPC94czphdHRyaWJ1dGVHcm91cD4KKworPC94czpzY2hlbWE+CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9wb20ueG1sIGIvY29yZS1zZXJ2ZXIvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjI5NGM1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvcG9tLnhtbApAQCAtMCwwICsxLDI4NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleTwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+amVyc2V5LXNlcnZlcjwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS1jb3JlLXNlcnZlcjwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgY29yZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb248L2Rlc2NyaXB0aW9uPgorCisgICAgPGxpY2Vuc2VzPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICAgIDxuYW1lPkVQTCAyLjA8L25hbWU+CisgICAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMDwvdXJsPgorICAgICAgICAgICAgPGRpc3RyaWJ1dGlvbj5yZXBvPC9kaXN0cmlidXRpb24+CisgICAgICAgICAgICA8Y29tbWVudHM+RXhjZXB0IGZvciBHdWF2YSwgSlNSLTE2NiBmaWxlcywgRHJvcHdpemFyZCBNb25pdG9yaW5nIGluc3BpcmVkIGNsYXNzZXMsIEFTTSBhbmQgSmFja3NvbiBKQVgtUlMgUHJvdmlkZXJzLgorICAgICAgICAgICAgICAgIFNlZSBhbHNvIGh0dHBzOi8vZ2l0aHViLmNvbS9lY2xpcHNlLWVlNGovamVyc2V5L2Jsb2IvbWFzdGVyL05PVElDRS5tZDwvY29tbWVudHM+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgICA8bmFtZT5UaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKEdQTCksIFZlcnNpb24gMiwgV2l0aCBDbGFzc3BhdGggRXhjZXB0aW9uPC9uYW1lPgorICAgICAgICAgICAgPHVybD5odHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWw8L3VybD4KKyAgICAgICAgICAgIDxkaXN0cmlidXRpb24+cmVwbzwvZGlzdHJpYnV0aW9uPgorICAgICAgICAgICAgPGNvbW1lbnRzPkV4Y2VwdCBmb3IgRHJvcHdpemFyZCBNb25pdG9yaW5nIGluc3BpcmVkIGNsYXNzZXMgYW5kIEFTTS4KKyAgICAgICAgICAgICAgICBTZWUgYWxzbyBodHRwczovL2dpdGh1Yi5jb20vZWNsaXBzZS1lZTRqL2plcnNleS9ibG9iL21hc3Rlci9OT1RJQ0UubWQ8L2NvbW1lbnRzPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgICAgPG5hbWU+QXBhY2hlIExpY2Vuc2UsIDIuMDwvbmFtZT4KKyAgICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wLmh0bWw8L3VybD4KKyAgICAgICAgICAgIDxkaXN0cmlidXRpb24+cmVwbzwvZGlzdHJpYnV0aW9uPgorICAgICAgICAgICAgPGNvbW1lbnRzPkRyb3B3aXphcmQgTW9uaXRvcmluZyBpbnNwaXJlZCBjbGFzc2VzIEAgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLm1vbml0b3JpbmcuY29yZTwvY29tbWVudHM+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgICA8bmFtZT5Nb2RpZmllZCBCU0Q8L25hbWU+CisgICAgICAgICAgICA8dXJsPmh0dHA6Ly9hc20ub2JqZWN0d2ViLm9yZy9saWNlbnNlLmh0bWw8L3VybD4KKyAgICAgICAgICAgIDxkaXN0cmlidXRpb24+cmVwbzwvZGlzdHJpYnV0aW9uPgorICAgICAgICAgICAgPGNvbW1lbnRzPkFTTSBAIGplcnNleS5yZXBhY2thZ2VkLm9yZy5vYmplY3R3ZWIuYXNtPC9jb21tZW50cz4KKyAgICAgICAgPC9saWNlbnNlPgorICAgIDwvbGljZW5zZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDx0ZXN0UmVzb3VyY2VzPgorICAgICAgICAgICAgPHRlc3RSZXNvdXJjZT4KKyAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL3Rlc3QvcmVzb3VyY2VzPC9kaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgPGZpbHRlcmluZz50cnVlPC9maWx0ZXJpbmc+CisgICAgICAgICAgICA8L3Rlc3RSZXNvdXJjZT4KKyAgICAgICAgPC90ZXN0UmVzb3VyY2VzPgorCisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLmlzdGFjazwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1pc3RhY2stY29tbW9ucy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YnVpbGQtaGVscGVyLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmZlbGl4PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWJ1bmRsZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+CisgICAgICAgICAgICAgICAgPGV4dGVuc2lvbnM+dHJ1ZTwvZXh0ZW5zaW9ucz4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGluc3RydWN0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTm90ZTogV2hlbiB5b3UncmUgY2hhbmdpbmcgdGhlc2UgcHJvcGVydGllcyBjaGFuZ2UgdGhlbSBhbHNvIGluIGJ1bmRsZXMvamF4cnMtcmkvcG9tLnhtbC4gLS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8RXhwb3J0LVBhY2thZ2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLio7dmVyc2lvbj0ke3Byb2plY3QudmVyc2lvbn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tLnN1bi5yZXNlYXJjaC53cy53YWRsLio7dmVyc2lvbj0ke3Byb2plY3QudmVyc2lvbn0KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvRXhwb3J0LVBhY2thZ2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8SW1wb3J0LVBhY2thZ2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgamF2YXgudmFsaWRhdGlvbi4qO3Jlc29sdXRpb246PW9wdGlvbmFsO3ZlcnNpb249IiR7cmFuZ2U7Wz09LDMpOyR7amF2YXgudmFsaWRhdGlvbi5hcGkudmVyc2lvbn19IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICAgICAgICA8L0ltcG9ydC1QYWNrYWdlPgorICAgICAgICAgICAgICAgICAgICA8L2luc3RydWN0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPHVucGFja0J1bmRsZT50cnVlPC91bnBhY2tCdW5kbGU+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDwhLS0KKyAgICAgICAgICAgICAgICBOb3RlOiBJZiB5b3UgbmVlZCB0byByZS1nZW5lcmF0ZSBXQURMIGNsYXNzZXMgZG8gc28gYnkgaW52b2tpbmc6CisKKyAgICAgICAgICAgICAgICAgICAgbXZuIGNvbS5zdW4udG9vbHMueGpjLm1hdmVuMjptYXZlbi1qYXhiLXBsdWdpbjpnZW5lcmF0ZQorICAgICAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4udG9vbHMueGpjLm1hdmVuMjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXhiLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LnhtbC5iaW5kPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF4Yi1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2pheGIuYXBpLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi54bWwuYmluZDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpheGItaW1wbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7amF4Yi5yaS52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4ueG1sLmJpbmQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXhiLXhqYzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7amF4Yi5yaS52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8Z2VuZXJhdGVEaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9qYXZhPC9nZW5lcmF0ZURpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgICAgPGdlbmVyYXRlUGFja2FnZT5jb20uc3VuLnJlc2VhcmNoLndzLndhZGw8L2dlbmVyYXRlUGFja2FnZT4KKyAgICAgICAgICAgICAgICAgICAgPGNhdGFsb2c+JHtiYXNlZGlyfS9ldGMvY2F0YWxvZy54bWw8L2NhdGFsb2c+CisgICAgICAgICAgICAgICAgICAgIDxzY2hlbWFEaXJlY3Rvcnk+JHtiYXNlZGlyfS9ldGM8L3NjaGVtYURpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGVTY2hlbWFzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGVTY2hlbWE+d2FkbC54c2Q8L2luY2x1ZGVTY2hlbWE+CisgICAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZVNjaGVtYXM+CisgICAgICAgICAgICAgICAgICAgIDxyZW1vdmVPbGRPdXRwdXQ+dHJ1ZTwvcmVtb3ZlT2xkT3V0cHV0PgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8IS0tIEV4ZWN1dGUgdGVzdCBjbGFzc2VzIGluIHBhcmFsbGVsIC0gMSB0aHJlYWQgcGVyIENQVSBjb3JlLiAtLT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmFsbGVsPmNsYXNzZXM8L3BhcmFsbGVsPgorICAgICAgICAgICAgICAgICAgICA8cGVyQ29yZVRocmVhZENvdW50PnRydWU8L3BlckNvcmVUaHJlYWRDb3VudD4KKyAgICAgICAgICAgICAgICAgICAgPHRocmVhZENvdW50PjE8L3RocmVhZENvdW50PgorICAgICAgICAgICAgICAgICAgICA8Zm9ya0NvdW50PjFDPC9mb3JrQ291bnQ+CisgICAgICAgICAgICAgICAgICAgIDxyZXVzZUZvcmtzPnRydWU8L3JldXNlRm9ya3M+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPGRlcGVuZGVuY2llcz4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29tbW9uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNsaWVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgud3MucnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC53cy5ycy1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLWpheGI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LmFubm90YXRpb248L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5hbm5vdGF0aW9uLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5oazIuZXh0ZXJuYWw8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5pbmplY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnZhbGlkYXRpb248L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD52YWxpZGF0aW9uLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm9zZ2k8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcub3NnaS5jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmptb2NraXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qbW9ja2l0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5oYW1jcmVzdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmhhbWNyZXN0LWxpYnJhcnk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5qYm9zczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmpib3NzLXZmczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjMuMi42LkZpbmFsPC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktaGsyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnNlY3VyaXR5T2ZmPC9pZD4KKyAgICAgICAgICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgIDxzdXJlZmlyZS5zZWN1cml0eS5hcmdsaW5lIC8+CisgICAgICAgICAgICA8L3Byb3BlcnRpZXM+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL1NlY3VyaXR5TWFuYWdlckNvbmZpZ3VyZWRUZXN0LmphdmE8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5zb25hcjwvaWQ+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGRpc2FibGUgcGFyYWxsZWwgZXhlY3V0aW9uIHNvIHRoYXQgSmFDb0NvIGxpc3RlbmVyIGNhbiBwcm9wZXJseSB3b3JrIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhbGxlbD5ub25lPC9wYXJhbGxlbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGVyQ29yZVRocmVhZENvdW50PmZhbHNlPC9wZXJDb3JlVGhyZWFkQ291bnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZvcmtDb3VudD4xPC9mb3JrQ291bnQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc2hhZGUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPnNoYWRlLWFyY2hpdmU8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+bm9uZTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICA8L3Byb2ZpbGVzPgorCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxzdXJlZmlyZS5zZWN1cml0eS5hcmdsaW5lPi1EamF2YS5zZWN1cml0eS5tYW5hZ2VyIC1EamF2YS5zZWN1cml0eS5wb2xpY3k9JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vdGVzdC1jbGFzc2VzL3NlcnZlci5wb2xpY3k8L3N1cmVmaXJlLnNlY3VyaXR5LmFyZ2xpbmU+CisgICAgPC9wcm9wZXJ0aWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vcmVzZWFyY2gvd3Mvd2FkbC9BcHBsaWNhdGlvbi5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vc3VuL3Jlc2VhcmNoL3dzL3dhZGwvQXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTUwNjE1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vc3VuL3Jlc2VhcmNoL3dzL3dhZGwvQXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDIxOSBAQAorLy8KKy8vIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKYXZhVE0gQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyhKQVhCKSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24sIHYyLjIuNworLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+CisvLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4KKy8vIEdlbmVyYXRlZCBvbjogMjAxNC4wOC4wNiBhdCAxMTo1NzozMSBBTSBDRVNUCisvLworCitwYWNrYWdlIGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBbnlFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnRzOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOworCitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKKworLyoqCisgKiA8cD5KYXZhIGNsYXNzIGZvciBhbm9ueW1vdXMgY29tcGxleCB0eXBlLgorICoKKyAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCisgKgorICogPHByZT4KKyAqICZsdDtjb21wbGV4VHlwZT4KKyAqICAgJmx0O2NvbXBsZXhDb250ZW50PgorICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+CisgKiAgICAgICAmbHQ7c2VxdWVuY2U+CisgKiAgICAgICAgICZsdDtlbGVtZW50IHJlZj0ie2h0dHA6Ly93YWRsLmRldi5qYXZhLm5ldC8yMDA5LzAyfWRvYyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIvPgorICogICAgICAgICAmbHQ7ZWxlbWVudCByZWY9IntodHRwOi8vd2FkbC5kZXYuamF2YS5uZXQvMjAwOS8wMn1ncmFtbWFycyIgbWluT2NjdXJzPSIwIi8+CisgKiAgICAgICAgICZsdDtlbGVtZW50IHJlZj0ie2h0dHA6Ly93YWRsLmRldi5qYXZhLm5ldC8yMDA5LzAyfXJlc291cmNlcyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIvPgorICogICAgICAgICAmbHQ7Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgorICogICAgICAgICAgICZsdDtlbGVtZW50IHJlZj0ie2h0dHA6Ly93YWRsLmRldi5qYXZhLm5ldC8yMDA5LzAyfXJlc291cmNlX3R5cGUiLz4KKyAqICAgICAgICAgICAmbHQ7ZWxlbWVudCByZWY9IntodHRwOi8vd2FkbC5kZXYuamF2YS5uZXQvMjAwOS8wMn1tZXRob2QiLz4KKyAqICAgICAgICAgICAmbHQ7ZWxlbWVudCByZWY9IntodHRwOi8vd2FkbC5kZXYuamF2YS5uZXQvMjAwOS8wMn1yZXByZXNlbnRhdGlvbiIvPgorICogICAgICAgICAgICZsdDtlbGVtZW50IHJlZj0ie2h0dHA6Ly93YWRsLmRldi5qYXZhLm5ldC8yMDA5LzAyfXBhcmFtIi8+CisgKiAgICAgICAgICZsdDsvY2hvaWNlPgorICogICAgICAgICAmbHQ7YW55IHByb2Nlc3NDb250ZW50cz0nbGF4JyBuYW1lc3BhY2U9JyMjb3RoZXInIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiLz4KKyAqICAgICAgICZsdDsvc2VxdWVuY2U+CisgKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KKyAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4KKyAqICZsdDsvY29tcGxleFR5cGU+CisgKiA8L3ByZT4KKyAqCisgKgorICovCitAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCitAWG1sVHlwZShuYW1lID0gIiIsIHByb3BPcmRlciA9IHsKKyAgICAgICAgImRvYyIsCisgICAgICAgICJncmFtbWFycyIsCisgICAgICAgICJyZXNvdXJjZXMiLAorICAgICAgICAicmVzb3VyY2VUeXBlT3JNZXRob2RPclJlcHJlc2VudGF0aW9uIiwKKyAgICAgICAgImFueSIKK30pCitAWG1sUm9vdEVsZW1lbnQobmFtZSA9ICJhcHBsaWNhdGlvbiIpCitwdWJsaWMgY2xhc3MgQXBwbGljYXRpb24geworCisgICAgcHJvdGVjdGVkIExpc3Q8RG9jPiBkb2M7CisgICAgcHJvdGVjdGVkIEdyYW1tYXJzIGdyYW1tYXJzOworICAgIHByb3RlY3RlZCBMaXN0PFJlc291cmNlcz4gcmVzb3VyY2VzOworICAgIEBYbWxFbGVtZW50cyh7CisgICAgICAgICAgICBAWG1sRWxlbWVudChuYW1lID0gInJlc291cmNlX3R5cGUiLCB0eXBlID0gUmVzb3VyY2VUeXBlLmNsYXNzKSwKKyAgICAgICAgICAgIEBYbWxFbGVtZW50KG5hbWUgPSAibWV0aG9kIiwgdHlwZSA9IE1ldGhvZC5jbGFzcyksCisgICAgICAgICAgICBAWG1sRWxlbWVudChuYW1lID0gInJlcHJlc2VudGF0aW9uIiwgdHlwZSA9IFJlcHJlc2VudGF0aW9uLmNsYXNzKSwKKyAgICAgICAgICAgIEBYbWxFbGVtZW50KG5hbWUgPSAicGFyYW0iLCB0eXBlID0gUGFyYW0uY2xhc3MpCisgICAgfSkKKyAgICBwcm90ZWN0ZWQgTGlzdDxPYmplY3Q+IHJlc291cmNlVHlwZU9yTWV0aG9kT3JSZXByZXNlbnRhdGlvbjsKKyAgICBAWG1sQW55RWxlbWVudChsYXggPSB0cnVlKQorICAgIHByb3RlY3RlZCBMaXN0PE9iamVjdD4gYW55OworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGRvYyBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwKKyAgICAgKiBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueSBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlCisgICAgICogcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4KKyAgICAgKiBUaGlzIGlzIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIGRvYyBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKKyAgICAgKiA8cHJlPgorICAgICAqICAgIGdldERvYygpLmFkZChuZXdJdGVtKTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKgorICAgICAqCisgICAgICogPHA+CisgICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3QKKyAgICAgKiB7QGxpbmsgRG9jIH0KKyAgICAgKgorICAgICAqCisgICAgICovCisgICAgcHVibGljIExpc3Q8RG9jPiBnZXREb2MoKSB7CisgICAgICAgIGlmIChkb2MgPT0gbnVsbCkgeworICAgICAgICAgICAgZG9jID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMuZG9jOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBncmFtbWFycyBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgcG9zc2libGUgb2JqZWN0IGlzCisgICAgICogICAgIHtAbGluayBHcmFtbWFycyB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgR3JhbW1hcnMgZ2V0R3JhbW1hcnMoKSB7CisgICAgICAgIHJldHVybiBncmFtbWFyczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZ3JhbW1hcnMgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiAgICAgYWxsb3dlZCBvYmplY3QgaXMKKyAgICAgKiAgICAge0BsaW5rIEdyYW1tYXJzIH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEdyYW1tYXJzKEdyYW1tYXJzIHZhbHVlKSB7CisgICAgICAgIHRoaXMuZ3JhbW1hcnMgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcmVzb3VyY2VzIHByb3BlcnR5LgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LAorICAgICAqIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55IG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUKKyAgICAgKiByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LgorICAgICAqIFRoaXMgaXMgd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgcmVzb3VyY2VzIHByb3BlcnR5LgorICAgICAqCisgICAgICogPHA+CisgICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgorICAgICAqIDxwcmU+CisgICAgICogICAgZ2V0UmVzb3VyY2VzKCkuYWRkKG5ld0l0ZW0pOworICAgICAqIDwvcHJlPgorICAgICAqCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdAorICAgICAqIHtAbGluayBSZXNvdXJjZXMgfQorICAgICAqCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxSZXNvdXJjZXM+IGdldFJlc291cmNlcygpIHsKKyAgICAgICAgaWYgKHJlc291cmNlcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpcy5yZXNvdXJjZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHJlc291cmNlVHlwZU9yTWV0aG9kT3JSZXByZXNlbnRhdGlvbiBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwKKyAgICAgKiBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueSBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlCisgICAgICogcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4KKyAgICAgKiBUaGlzIGlzIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIHJlc291cmNlVHlwZU9yTWV0aG9kT3JSZXByZXNlbnRhdGlvbiBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKKyAgICAgKiA8cHJlPgorICAgICAqICAgIGdldFJlc291cmNlVHlwZU9yTWV0aG9kT3JSZXByZXNlbnRhdGlvbigpLmFkZChuZXdJdGVtKTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKgorICAgICAqCisgICAgICogPHA+CisgICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3QKKyAgICAgKiB7QGxpbmsgUmVzb3VyY2VUeXBlIH0KKyAgICAgKiB7QGxpbmsgTWV0aG9kIH0KKyAgICAgKiB7QGxpbmsgUmVwcmVzZW50YXRpb24gfQorICAgICAqIHtAbGluayBQYXJhbSB9CisgICAgICoKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PE9iamVjdD4gZ2V0UmVzb3VyY2VUeXBlT3JNZXRob2RPclJlcHJlc2VudGF0aW9uKCkgeworICAgICAgICBpZiAocmVzb3VyY2VUeXBlT3JNZXRob2RPclJlcHJlc2VudGF0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlc291cmNlVHlwZU9yTWV0aG9kT3JSZXByZXNlbnRhdGlvbiA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLnJlc291cmNlVHlwZU9yTWV0aG9kT3JSZXByZXNlbnRhdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgYW55IHByb3BlcnR5LgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LAorICAgICAqIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55IG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUKKyAgICAgKiByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LgorICAgICAqIFRoaXMgaXMgd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgYW55IHByb3BlcnR5LgorICAgICAqCisgICAgICogPHA+CisgICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgorICAgICAqIDxwcmU+CisgICAgICogICAgZ2V0QW55KCkuYWRkKG5ld0l0ZW0pOworICAgICAqIDwvcHJlPgorICAgICAqCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdAorICAgICAqIHtAbGluayBPYmplY3QgfQorICAgICAqIHtAbGluayBFbGVtZW50IH0KKyAgICAgKgorICAgICAqCisgICAgICovCisgICAgcHVibGljIExpc3Q8T2JqZWN0PiBnZXRBbnkoKSB7CisgICAgICAgIGlmIChhbnkgPT0gbnVsbCkgeworICAgICAgICAgICAgYW55ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMuYW55OworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vc3VuL3Jlc2VhcmNoL3dzL3dhZGwvRG9jLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vcmVzZWFyY2gvd3Mvd2FkbC9Eb2MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYThkMDRiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vc3VuL3Jlc2VhcmNoL3dzL3dhZGwvRG9jLmphdmEKQEAgLTAsMCArMSwxNjYgQEAKKy8vCisvLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4yLjcKKy8vIFNlZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiIj5odHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiPC9hPgorLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuCisvLyBHZW5lcmF0ZWQgb246IDIwMTQuMDguMDYgYXQgMTE6NTc6MzEgQU0gQ0VTVAorLy8KKworcGFja2FnZSBjb20uc3VuLnJlc2VhcmNoLndzLndhZGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBbnlBdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBbnlFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sTWl4ZWQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNjaGVtYVR5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuQ29sbGFwc2VkU3RyaW5nQWRhcHRlcjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLlhtbEphdmFUeXBlQWRhcHRlcjsKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworCitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKKworLyoqCisgKiA8cD5KYXZhIGNsYXNzIGZvciBhbm9ueW1vdXMgY29tcGxleCB0eXBlLgorICoKKyAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCisgKgorICogPHByZT4KKyAqICZsdDtjb21wbGV4VHlwZT4KKyAqICAgJmx0O2NvbXBsZXhDb250ZW50PgorICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+CisgKiAgICAgICAmbHQ7c2VxdWVuY2U+CisgKiAgICAgICAgICZsdDthbnkgcHJvY2Vzc0NvbnRlbnRzPSdsYXgnIG5hbWVzcGFjZT0nIyNvdGhlcicgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIvPgorICogICAgICAgJmx0Oy9zZXF1ZW5jZT4KKyAqICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0idGl0bGUiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1zdHJpbmciIC8+CisgKiAgICAgICAmbHQ7YXR0cmlidXRlIHJlZj0ie2h0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZX1sYW5nIi8+CisgKiAgICAgICAmbHQ7YW55QXR0cmlidXRlIHByb2Nlc3NDb250ZW50cz0nbGF4JyBuYW1lc3BhY2U9JyMjb3RoZXInLz4KKyAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPgorICogICAmbHQ7L2NvbXBsZXhDb250ZW50PgorICogJmx0Oy9jb21wbGV4VHlwZT4KKyAqIDwvcHJlPgorICovCitAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCitAWG1sVHlwZShuYW1lID0gIiIsIHByb3BPcmRlciA9IHsKKyAgICAgICAgImNvbnRlbnQiCit9KQorQFhtbFJvb3RFbGVtZW50KG5hbWUgPSAiZG9jIikKK3B1YmxpYyBjbGFzcyBEb2MgeworCisgICAgQFhtbE1peGVkCisgICAgQFhtbEFueUVsZW1lbnQobGF4ID0gdHJ1ZSkKKyAgICBwcm90ZWN0ZWQgTGlzdDxPYmplY3Q+IGNvbnRlbnQ7CisgICAgQFhtbEF0dHJpYnV0ZShuYW1lID0gInRpdGxlIikKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHRpdGxlOworICAgIEBYbWxBdHRyaWJ1dGUobmFtZSA9ICJsYW5nIiwgbmFtZXNwYWNlID0gImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIpCisgICAgQFhtbEphdmFUeXBlQWRhcHRlcihDb2xsYXBzZWRTdHJpbmdBZGFwdGVyLmNsYXNzKQorICAgIEBYbWxTY2hlbWFUeXBlKG5hbWUgPSAibGFuZ3VhZ2UiKQorICAgIHByb3RlY3RlZCBTdHJpbmcgbGFuZzsKKyAgICBAWG1sQW55QXR0cmlidXRlCisgICAgcHJpdmF0ZSBNYXA8UU5hbWUsIFN0cmluZz4gb3RoZXJBdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXA8UU5hbWUsIFN0cmluZz4oKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBjb250ZW50IHByb3BlcnR5LgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LAorICAgICAqIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55IG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUKKyAgICAgKiByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LgorICAgICAqIFRoaXMgaXMgd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgY29udGVudCBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKKyAgICAgKiA8cHJlPgorICAgICAqICAgIGdldENvbnRlbnQoKS5hZGQobmV3SXRlbSk7CisgICAgICogPC9wcmU+CisgICAgICoKKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0CisgICAgICoge0BsaW5rIFN0cmluZyB9CisgICAgICoge0BsaW5rIE9iamVjdCB9CisgICAgICoge0BsaW5rIEVsZW1lbnQgfQorICAgICAqCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxPYmplY3Q+IGdldENvbnRlbnQoKSB7CisgICAgICAgIGlmIChjb250ZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIGNvbnRlbnQgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSB0aXRsZSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgcG9zc2libGUgb2JqZWN0IGlzCisgICAgICogICAgIHtAbGluayBTdHJpbmcgfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIHRpdGxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSB0aXRsZSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZQorICAgICAqICAgICBhbGxvd2VkIG9iamVjdCBpcworICAgICAqICAgICB7QGxpbmsgU3RyaW5nIH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlKFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0aGlzLnRpdGxlID0gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGxhbmcgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgIHBvc3NpYmxlIG9iamVjdCBpcworICAgICAqICAgICB7QGxpbmsgU3RyaW5nIH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFuZygpIHsKKyAgICAgICAgcmV0dXJuIGxhbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGxhbmcgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiAgICAgYWxsb3dlZCBvYmplY3QgaXMKKyAgICAgKiAgICAge0BsaW5rIFN0cmluZyB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMYW5nKFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0aGlzLmxhbmcgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGEgbWFwIHRoYXQgY29udGFpbnMgYXR0cmlidXRlcyB0aGF0IGFyZW4ndCBib3VuZCB0byBhbnkgdHlwZWQgcHJvcGVydHkgb24gdGhpcyBjbGFzcy4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIHRoZSBtYXAgaXMga2V5ZWQgYnkgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBhbmQKKyAgICAgKiB0aGUgdmFsdWUgaXMgdGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlLgorICAgICAqCisgICAgICogdGhlIG1hcCByZXR1cm5lZCBieSB0aGlzIG1ldGhvZCBpcyBsaXZlLCBhbmQgeW91IGNhbiBhZGQgbmV3IGF0dHJpYnV0ZQorICAgICAqIGJ5IHVwZGF0aW5nIHRoZSBtYXAgZGlyZWN0bHkuIEJlY2F1c2Ugb2YgdGhpcyBkZXNpZ24sIHRoZXJlJ3Mgbm8gc2V0dGVyLgorICAgICAqCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgIGFsd2F5cyBub24tbnVsbAorICAgICAqLworICAgIHB1YmxpYyBNYXA8UU5hbWUsIFN0cmluZz4gZ2V0T3RoZXJBdHRyaWJ1dGVzKCkgeworICAgICAgICByZXR1cm4gb3RoZXJBdHRyaWJ1dGVzOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vc3VuL3Jlc2VhcmNoL3dzL3dhZGwvR3JhbW1hcnMuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL3N1bi9yZXNlYXJjaC93cy93YWRsL0dyYW1tYXJzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNhMjljMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL3N1bi9yZXNlYXJjaC93cy93YWRsL0dyYW1tYXJzLmphdmEKQEAgLTAsMCArMSwxNDQgQEAKKy8vCisvLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4yLjcKKy8vIFNlZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiIj5odHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiPC9hPgorLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuCisvLyBHZW5lcmF0ZWQgb246IDIwMTQuMDguMDYgYXQgMTE6NTc6MzEgQU0gQ0VTVAorLy8KKworcGFja2FnZSBjb20uc3VuLnJlc2VhcmNoLndzLndhZGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQW55RWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKKworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CisKKy8qKgorICogPHA+SmF2YSBjbGFzcyBmb3IgYW5vbnltb3VzIGNvbXBsZXggdHlwZS4KKyAqCisgKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgorICoKKyAqIDxwcmU+CisgKiAmbHQ7Y29tcGxleFR5cGU+CisgKiAgICZsdDtjb21wbGV4Q29udGVudD4KKyAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPgorICogICAgICAgJmx0O3NlcXVlbmNlPgorICogICAgICAgICAmbHQ7ZWxlbWVudCByZWY9IntodHRwOi8vd2FkbC5kZXYuamF2YS5uZXQvMjAwOS8wMn1kb2MiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiLz4KKyAqICAgICAgICAgJmx0O2VsZW1lbnQgcmVmPSJ7aHR0cDovL3dhZGwuZGV2LmphdmEubmV0LzIwMDkvMDJ9aW5jbHVkZSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIvPgorICogICAgICAgICAmbHQ7YW55IHByb2Nlc3NDb250ZW50cz0nbGF4JyBuYW1lc3BhY2U9JyMjb3RoZXInIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiLz4KKyAqICAgICAgICZsdDsvc2VxdWVuY2U+CisgKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KKyAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4KKyAqICZsdDsvY29tcGxleFR5cGU+CisgKiA8L3ByZT4KKyAqCisgKgorICovCitAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCitAWG1sVHlwZShuYW1lID0gIiIsIHByb3BPcmRlciA9IHsKKyAgICAgICAgImRvYyIsCisgICAgICAgICJpbmNsdWRlIiwKKyAgICAgICAgImFueSIKK30pCitAWG1sUm9vdEVsZW1lbnQobmFtZSA9ICJncmFtbWFycyIpCitwdWJsaWMgY2xhc3MgR3JhbW1hcnMgeworCisgICAgcHJvdGVjdGVkIExpc3Q8RG9jPiBkb2M7CisgICAgcHJvdGVjdGVkIExpc3Q8SW5jbHVkZT4gaW5jbHVkZTsKKyAgICBAWG1sQW55RWxlbWVudChsYXggPSB0cnVlKQorICAgIHByb3RlY3RlZCBMaXN0PE9iamVjdD4gYW55OworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGRvYyBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwKKyAgICAgKiBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueSBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlCisgICAgICogcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4KKyAgICAgKiBUaGlzIGlzIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIGRvYyBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKKyAgICAgKiA8cHJlPgorICAgICAqICAgIGdldERvYygpLmFkZChuZXdJdGVtKTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKgorICAgICAqCisgICAgICogPHA+CisgICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3QKKyAgICAgKiB7QGxpbmsgRG9jIH0KKyAgICAgKgorICAgICAqCisgICAgICovCisgICAgcHVibGljIExpc3Q8RG9jPiBnZXREb2MoKSB7CisgICAgICAgIGlmIChkb2MgPT0gbnVsbCkgeworICAgICAgICAgICAgZG9jID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMuZG9jOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBpbmNsdWRlIHByb3BlcnR5LgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LAorICAgICAqIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55IG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUKKyAgICAgKiByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LgorICAgICAqIFRoaXMgaXMgd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgaW5jbHVkZSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKKyAgICAgKiA8cHJlPgorICAgICAqICAgIGdldEluY2x1ZGUoKS5hZGQobmV3SXRlbSk7CisgICAgICogPC9wcmU+CisgICAgICoKKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0CisgICAgICoge0BsaW5rIEluY2x1ZGUgfQorICAgICAqCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxJbmNsdWRlPiBnZXRJbmNsdWRlKCkgeworICAgICAgICBpZiAoaW5jbHVkZSA9PSBudWxsKSB7CisgICAgICAgICAgICBpbmNsdWRlID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMuaW5jbHVkZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgYW55IHByb3BlcnR5LgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LAorICAgICAqIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55IG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUKKyAgICAgKiByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LgorICAgICAqIFRoaXMgaXMgd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgYW55IHByb3BlcnR5LgorICAgICAqCisgICAgICogPHA+CisgICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgorICAgICAqIDxwcmU+CisgICAgICogICAgZ2V0QW55KCkuYWRkKG5ld0l0ZW0pOworICAgICAqIDwvcHJlPgorICAgICAqCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdAorICAgICAqIHtAbGluayBPYmplY3QgfQorICAgICAqIHtAbGluayBFbGVtZW50IH0KKyAgICAgKgorICAgICAqCisgICAgICovCisgICAgcHVibGljIExpc3Q8T2JqZWN0PiBnZXRBbnkoKSB7CisgICAgICAgIGlmIChhbnkgPT0gbnVsbCkgeworICAgICAgICAgICAgYW55ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMuYW55OworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vc3VuL3Jlc2VhcmNoL3dzL3dhZGwvSFRUUE1ldGhvZHMuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL3N1bi9yZXNlYXJjaC93cy93YWRsL0hUVFBNZXRob2RzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGEwNmFjNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL3N1bi9yZXNlYXJjaC93cy93YWRsL0hUVFBNZXRob2RzLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLy8KKy8vIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKYXZhVE0gQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyhKQVhCKSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24sIHYyLjIuNworLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+CisvLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4KKy8vIEdlbmVyYXRlZCBvbjogMjAxNC4wOC4wNiBhdCAxMTo1NzozMSBBTSBDRVNUCisvLworCitwYWNrYWdlIGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbDsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRW51bTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7CisKKy8qKgorICogPHA+SmF2YSBjbGFzcyBmb3IgSFRUUE1ldGhvZHMuCisgKgorICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KKyAqIDxwPgorICogPHByZT4KKyAqICZsdDtzaW1wbGVUeXBlIG5hbWU9IkhUVFBNZXRob2RzIj4KKyAqICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1OTVRPS0VOIj4KKyAqICAgICAmbHQ7ZW51bWVyYXRpb24gdmFsdWU9IkdFVCIvPgorICogICAgICZsdDtlbnVtZXJhdGlvbiB2YWx1ZT0iUE9TVCIvPgorICogICAgICZsdDtlbnVtZXJhdGlvbiB2YWx1ZT0iUFVUIi8+CisgKiAgICAgJmx0O2VudW1lcmF0aW9uIHZhbHVlPSJIRUFEIi8+CisgKiAgICAgJmx0O2VudW1lcmF0aW9uIHZhbHVlPSJERUxFVEUiLz4KKyAqICAgJmx0Oy9yZXN0cmljdGlvbj4KKyAqICZsdDsvc2ltcGxlVHlwZT4KKyAqIDwvcHJlPgorICoKKyAqLworQFhtbFR5cGUobmFtZSA9ICJIVFRQTWV0aG9kcyIpCitAWG1sRW51bQorcHVibGljIGVudW0gSFRUUE1ldGhvZHMgeworCisgICAgR0VULAorICAgIFBPU1QsCisgICAgUFVULAorICAgIEhFQUQsCisgICAgREVMRVRFOworCisgICAgcHVibGljIFN0cmluZyB2YWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEhUVFBNZXRob2RzIGZyb21WYWx1ZShTdHJpbmcgdikgeworICAgICAgICByZXR1cm4gdmFsdWVPZih2KTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL3N1bi9yZXNlYXJjaC93cy93YWRsL0luY2x1ZGUuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL3N1bi9yZXNlYXJjaC93cy93YWRsL0luY2x1ZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjBjNTViCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vc3VuL3Jlc2VhcmNoL3dzL3dhZGwvSW5jbHVkZS5qYXZhCkBAIC0wLDAgKzEsMTMwIEBACisvLworLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMi43CisvLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4KKy8vIEFueSBtb2RpZmljYXRpb25zIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3QgdXBvbiByZWNvbXBpbGF0aW9uIG9mIHRoZSBzb3VyY2Ugc2NoZW1hLgorLy8gR2VuZXJhdGVkIG9uOiAyMDE0LjA4LjA2IGF0IDExOjU3OjMxIEFNIENFU1QKKy8vCisKK3BhY2thZ2UgY29tLnN1bi5yZXNlYXJjaC53cy53YWRsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQW55QXR0cmlidXRlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxTY2hlbWFUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworCisvKioKKyAqIDxwPkphdmEgY2xhc3MgZm9yIGFub255bW91cyBjb21wbGV4IHR5cGUuCisgKgorICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KKyAqCisgKiA8cHJlPgorICogJmx0O2NvbXBsZXhUeXBlPgorICogICAmbHQ7Y29tcGxleENvbnRlbnQ+CisgKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4KKyAqICAgICAgICZsdDtzZXF1ZW5jZT4KKyAqICAgICAgICAgJmx0O2VsZW1lbnQgcmVmPSJ7aHR0cDovL3dhZGwuZGV2LmphdmEubmV0LzIwMDkvMDJ9ZG9jIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIi8+CisgKiAgICAgICAmbHQ7L3NlcXVlbmNlPgorICogICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJocmVmIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VVJJIiAvPgorICogICAgICAgJmx0O2FueUF0dHJpYnV0ZSBwcm9jZXNzQ29udGVudHM9J2xheCcgbmFtZXNwYWNlPScjI290aGVyJy8+CisgKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KKyAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4KKyAqICZsdDsvY29tcGxleFR5cGU+CisgKiA8L3ByZT4KKyAqCisgKgorICovCitAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCitAWG1sVHlwZShuYW1lID0gIiIsIHByb3BPcmRlciA9IHsKKyAgICAgICAgImRvYyIKK30pCitAWG1sUm9vdEVsZW1lbnQobmFtZSA9ICJpbmNsdWRlIikKK3B1YmxpYyBjbGFzcyBJbmNsdWRlIHsKKworICAgIHByb3RlY3RlZCBMaXN0PERvYz4gZG9jOworICAgIEBYbWxBdHRyaWJ1dGUobmFtZSA9ICJocmVmIikKKyAgICBAWG1sU2NoZW1hVHlwZShuYW1lID0gImFueVVSSSIpCisgICAgcHJvdGVjdGVkIFN0cmluZyBocmVmOworICAgIEBYbWxBbnlBdHRyaWJ1dGUKKyAgICBwcml2YXRlIE1hcDxRTmFtZSwgU3RyaW5nPiBvdGhlckF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcDxRTmFtZSwgU3RyaW5nPigpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGRvYyBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwKKyAgICAgKiBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueSBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlCisgICAgICogcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4KKyAgICAgKiBUaGlzIGlzIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIGRvYyBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKKyAgICAgKiA8cHJlPgorICAgICAqICAgIGdldERvYygpLmFkZChuZXdJdGVtKTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKgorICAgICAqCisgICAgICogPHA+CisgICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3QKKyAgICAgKiB7QGxpbmsgRG9jIH0KKyAgICAgKgorICAgICAqCisgICAgICovCisgICAgcHVibGljIExpc3Q8RG9jPiBnZXREb2MoKSB7CisgICAgICAgIGlmIChkb2MgPT0gbnVsbCkgeworICAgICAgICAgICAgZG9jID0gbmV3IEFycmF5TGlzdDxEb2M+KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMuZG9jOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBocmVmIHByb3BlcnR5LgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICBwb3NzaWJsZSBvYmplY3QgaXMKKyAgICAgKiAgICAge0BsaW5rIFN0cmluZyB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEhyZWYoKSB7CisgICAgICAgIHJldHVybiBocmVmOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBocmVmIHByb3BlcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICogICAgIGFsbG93ZWQgb2JqZWN0IGlzCisgICAgICogICAgIHtAbGluayBTdHJpbmcgfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SHJlZihTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgdGhpcy5ocmVmID0gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBhIG1hcCB0aGF0IGNvbnRhaW5zIGF0dHJpYnV0ZXMgdGhhdCBhcmVuJ3QgYm91bmQgdG8gYW55IHR5cGVkIHByb3BlcnR5IG9uIHRoaXMgY2xhc3MuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiB0aGUgbWFwIGlzIGtleWVkIGJ5IHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgYW5kCisgICAgICogdGhlIHZhbHVlIGlzIHRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZS4KKyAgICAgKgorICAgICAqIHRoZSBtYXAgcmV0dXJuZWQgYnkgdGhpcyBtZXRob2QgaXMgbGl2ZSwgYW5kIHlvdSBjYW4gYWRkIG5ldyBhdHRyaWJ1dGUKKyAgICAgKiBieSB1cGRhdGluZyB0aGUgbWFwIGRpcmVjdGx5LiBCZWNhdXNlIG9mIHRoaXMgZGVzaWduLCB0aGVyZSdzIG5vIHNldHRlci4KKyAgICAgKgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICBhbHdheXMgbm9uLW51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwPFFOYW1lLCBTdHJpbmc+IGdldE90aGVyQXR0cmlidXRlcygpIHsKKyAgICAgICAgcmV0dXJuIG90aGVyQXR0cmlidXRlczsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL3N1bi9yZXNlYXJjaC93cy93YWRsL0xpbmsuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL3N1bi9yZXNlYXJjaC93cy93YWRsL0xpbmsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzcwNDg0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vc3VuL3Jlc2VhcmNoL3dzL3dhZGwvTGluay5qYXZhCkBAIC0wLDAgKzEsMjI3IEBACisvLworLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMi43CisvLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4KKy8vIEFueSBtb2RpZmljYXRpb25zIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3QgdXBvbiByZWNvbXBpbGF0aW9uIG9mIHRoZSBzb3VyY2Ugc2NoZW1hLgorLy8gR2VuZXJhdGVkIG9uOiAyMDE0LjA4LjA2IGF0IDExOjU3OjMxIEFNIENFU1QKKy8vCisKKworcGFja2FnZSBjb20uc3VuLnJlc2VhcmNoLndzLndhZGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQW55QXR0cmlidXRlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQW55RWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2NoZW1hVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5Db2xsYXBzZWRTdHJpbmdBZGFwdGVyOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sSmF2YVR5cGVBZGFwdGVyOworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKKworCisvKioKKyAqIDxwPkphdmEgY2xhc3MgZm9yIGFub255bW91cyBjb21wbGV4IHR5cGUuCisgKgorICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KKyAqCisgKiA8cHJlPgorICogJmx0O2NvbXBsZXhUeXBlPgorICogICAmbHQ7Y29tcGxleENvbnRlbnQ+CisgKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4KKyAqICAgICAgICZsdDtzZXF1ZW5jZT4KKyAqICAgICAgICAgJmx0O2VsZW1lbnQgcmVmPSJ7aHR0cDovL3dhZGwuZGV2LmphdmEubmV0LzIwMDkvMDJ9ZG9jIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIi8+CisgKiAgICAgICAgICZsdDthbnkgcHJvY2Vzc0NvbnRlbnRzPSdsYXgnIG5hbWVzcGFjZT0nIyNvdGhlcicgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIvPgorICogICAgICAgJmx0Oy9zZXF1ZW5jZT4KKyAqICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0icmVzb3VyY2VfdHlwZSIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVVSSSIgLz4KKyAqICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0icmVsIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9dG9rZW4iIC8+CisgKiAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9InJldiIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfXRva2VuIiAvPgorICogICAgICAgJmx0O2FueUF0dHJpYnV0ZSBwcm9jZXNzQ29udGVudHM9J2xheCcgbmFtZXNwYWNlPScjI290aGVyJy8+CisgKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KKyAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4KKyAqICZsdDsvY29tcGxleFR5cGU+CisgKiA8L3ByZT4KKyAqCisgKgorICovCitAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCitAWG1sVHlwZShuYW1lID0gIiIsIHByb3BPcmRlciA9IHsKKyAgICAgICAgImRvYyIsCisgICAgICAgICJhbnkiCit9KQorQFhtbFJvb3RFbGVtZW50KG5hbWUgPSAibGluayIpCitwdWJsaWMgY2xhc3MgTGluayB7CisKKyAgICBwcm90ZWN0ZWQgTGlzdDxEb2M+IGRvYzsKKyAgICBAWG1sQW55RWxlbWVudChsYXggPSB0cnVlKQorICAgIHByb3RlY3RlZCBMaXN0PE9iamVjdD4gYW55OworICAgIEBYbWxBdHRyaWJ1dGUobmFtZSA9ICJyZXNvdXJjZV90eXBlIikKKyAgICBAWG1sU2NoZW1hVHlwZShuYW1lID0gImFueVVSSSIpCisgICAgcHJvdGVjdGVkIFN0cmluZyByZXNvdXJjZVR5cGU7CisgICAgQFhtbEF0dHJpYnV0ZShuYW1lID0gInJlbCIpCisgICAgQFhtbEphdmFUeXBlQWRhcHRlcihDb2xsYXBzZWRTdHJpbmdBZGFwdGVyLmNsYXNzKQorICAgIEBYbWxTY2hlbWFUeXBlKG5hbWUgPSAidG9rZW4iKQorICAgIHByb3RlY3RlZCBTdHJpbmcgcmVsOworICAgIEBYbWxBdHRyaWJ1dGUobmFtZSA9ICJyZXYiKQorICAgIEBYbWxKYXZhVHlwZUFkYXB0ZXIoQ29sbGFwc2VkU3RyaW5nQWRhcHRlci5jbGFzcykKKyAgICBAWG1sU2NoZW1hVHlwZShuYW1lID0gInRva2VuIikKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHJldjsKKyAgICBAWG1sQW55QXR0cmlidXRlCisgICAgcHJpdmF0ZSBNYXA8UU5hbWUsIFN0cmluZz4gb3RoZXJBdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXA8UU5hbWUsIFN0cmluZz4oKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBkb2MgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsCisgICAgICogbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkgbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZQorICAgICAqIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuCisgICAgICogVGhpcyBpcyB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBkb2MgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6CisgICAgICogPHByZT4KKyAgICAgKiAgICBnZXREb2MoKS5hZGQobmV3SXRlbSk7CisgICAgICogPC9wcmU+CisgICAgICoKKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0CisgICAgICoge0BsaW5rIERvYyB9CisgICAgICoKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PERvYz4gZ2V0RG9jKCkgeworICAgICAgICBpZiAoZG9jID09IG51bGwpIHsKKyAgICAgICAgICAgIGRvYyA9IG5ldyBBcnJheUxpc3Q8RG9jPigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLmRvYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgYW55IHByb3BlcnR5LgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LAorICAgICAqIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55IG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUKKyAgICAgKiByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LgorICAgICAqIFRoaXMgaXMgd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgYW55IHByb3BlcnR5LgorICAgICAqCisgICAgICogPHA+CisgICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgorICAgICAqIDxwcmU+CisgICAgICogICAgZ2V0QW55KCkuYWRkKG5ld0l0ZW0pOworICAgICAqIDwvcHJlPgorICAgICAqCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdAorICAgICAqIHtAbGluayBPYmplY3QgfQorICAgICAqIHtAbGluayBFbGVtZW50IH0KKyAgICAgKgorICAgICAqCisgICAgICovCisgICAgcHVibGljIExpc3Q8T2JqZWN0PiBnZXRBbnkoKSB7CisgICAgICAgIGlmIChhbnkgPT0gbnVsbCkgeworICAgICAgICAgICAgYW55ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMuYW55OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSByZXNvdXJjZVR5cGUgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgIHBvc3NpYmxlIG9iamVjdCBpcworICAgICAqICAgICB7QGxpbmsgU3RyaW5nIH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VUeXBlKCkgeworICAgICAgICByZXR1cm4gcmVzb3VyY2VUeXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSByZXNvdXJjZVR5cGUgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiAgICAgYWxsb3dlZCBvYmplY3QgaXMKKyAgICAgKiAgICAge0BsaW5rIFN0cmluZyB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZVR5cGUoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHRoaXMucmVzb3VyY2VUeXBlID0gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHJlbCBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgcG9zc2libGUgb2JqZWN0IGlzCisgICAgICogICAgIHtAbGluayBTdHJpbmcgfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSZWwoKSB7CisgICAgICAgIHJldHVybiByZWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHJlbCBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZQorICAgICAqICAgICBhbGxvd2VkIG9iamVjdCBpcworICAgICAqICAgICB7QGxpbmsgU3RyaW5nIH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlbChTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgdGhpcy5yZWwgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcmV2IHByb3BlcnR5LgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICBwb3NzaWJsZSBvYmplY3QgaXMKKyAgICAgKiAgICAge0BsaW5rIFN0cmluZyB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJldigpIHsKKyAgICAgICAgcmV0dXJuIHJldjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcmV2IHByb3BlcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICogICAgIGFsbG93ZWQgb2JqZWN0IGlzCisgICAgICogICAgIHtAbGluayBTdHJpbmcgfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmV2KFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0aGlzLnJldiA9IHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgYSBtYXAgdGhhdCBjb250YWlucyBhdHRyaWJ1dGVzIHRoYXQgYXJlbid0IGJvdW5kIHRvIGFueSB0eXBlZCBwcm9wZXJ0eSBvbiB0aGlzIGNsYXNzLgorICAgICAqCisgICAgICogPHA+CisgICAgICogdGhlIG1hcCBpcyBrZXllZCBieSB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIGFuZAorICAgICAqIHRoZSB2YWx1ZSBpcyB0aGUgc3RyaW5nIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuCisgICAgICoKKyAgICAgKiB0aGUgbWFwIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kIGlzIGxpdmUsIGFuZCB5b3UgY2FuIGFkZCBuZXcgYXR0cmlidXRlCisgICAgICogYnkgdXBkYXRpbmcgdGhlIG1hcCBkaXJlY3RseS4gQmVjYXVzZSBvZiB0aGlzIGRlc2lnbiwgdGhlcmUncyBubyBzZXR0ZXIuCisgICAgICoKKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgYWx3YXlzIG5vbi1udWxsCisgICAgICovCisgICAgcHVibGljIE1hcDxRTmFtZSwgU3RyaW5nPiBnZXRPdGhlckF0dHJpYnV0ZXMoKSB7CisgICAgICAgIHJldHVybiBvdGhlckF0dHJpYnV0ZXM7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vcmVzZWFyY2gvd3Mvd2FkbC9NZXRob2QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL3N1bi9yZXNlYXJjaC93cy93YWRsL01ldGhvZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YTA2ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vcmVzZWFyY2gvd3Mvd2FkbC9NZXRob2QuamF2YQpAQCAtMCwwICsxLDI4NiBAQAorLy8KKy8vIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKYXZhVE0gQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyhKQVhCKSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24sIHYyLjIuNworLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+CisvLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4KKy8vIEdlbmVyYXRlZCBvbjogMjAxNC4wOC4wNiBhdCAxMTo1NzozMSBBTSBDRVNUCisvLworCitwYWNrYWdlIGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFueUF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFueUVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxJRDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2NoZW1hVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5Db2xsYXBzZWRTdHJpbmdBZGFwdGVyOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sSmF2YVR5cGVBZGFwdGVyOworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CisKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworCisvKioKKyAqIDxwPkphdmEgY2xhc3MgZm9yIGFub255bW91cyBjb21wbGV4IHR5cGUuCisgKgorICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KKyAqCisgKiA8cHJlPgorICogJmx0O2NvbXBsZXhUeXBlPgorICogICAmbHQ7Y29tcGxleENvbnRlbnQ+CisgKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4KKyAqICAgICAgICZsdDtzZXF1ZW5jZT4KKyAqICAgICAgICAgJmx0O2VsZW1lbnQgcmVmPSJ7aHR0cDovL3dhZGwuZGV2LmphdmEubmV0LzIwMDkvMDJ9ZG9jIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIi8+CisgKiAgICAgICAgICZsdDtlbGVtZW50IHJlZj0ie2h0dHA6Ly93YWRsLmRldi5qYXZhLm5ldC8yMDA5LzAyfXJlcXVlc3QiIG1pbk9jY3Vycz0iMCIvPgorICogICAgICAgICAmbHQ7ZWxlbWVudCByZWY9IntodHRwOi8vd2FkbC5kZXYuamF2YS5uZXQvMjAwOS8wMn1yZXNwb25zZSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIvPgorICogICAgICAgICAmbHQ7YW55IHByb2Nlc3NDb250ZW50cz0nbGF4JyBuYW1lc3BhY2U9JyMjb3RoZXInIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiLz4KKyAqICAgICAgICZsdDsvc2VxdWVuY2U+CisgKiAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9SUQiIC8+CisgKiAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9IntodHRwOi8vd2FkbC5kZXYuamF2YS5uZXQvMjAwOS8wMn1NZXRob2QiIC8+CisgKiAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9ImhyZWYiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlVUkkiIC8+CisgKiAgICAgICAmbHQ7YW55QXR0cmlidXRlIHByb2Nlc3NDb250ZW50cz0nbGF4JyBuYW1lc3BhY2U9JyMjb3RoZXInLz4KKyAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPgorICogICAmbHQ7L2NvbXBsZXhDb250ZW50PgorICogJmx0Oy9jb21wbGV4VHlwZT4KKyAqIDwvcHJlPgorICoKKyAqCisgKi8KK0BYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKK0BYbWxUeXBlKG5hbWUgPSAiIiwgcHJvcE9yZGVyID0geworICAgICAgICAiZG9jIiwKKyAgICAgICAgInJlcXVlc3QiLAorICAgICAgICAicmVzcG9uc2UiLAorICAgICAgICAiYW55IgorfSkKK0BYbWxSb290RWxlbWVudChuYW1lID0gIm1ldGhvZCIpCitwdWJsaWMgY2xhc3MgTWV0aG9kIHsKKworICAgIHByb3RlY3RlZCBMaXN0PERvYz4gZG9jOworICAgIHByb3RlY3RlZCBSZXF1ZXN0IHJlcXVlc3Q7CisgICAgcHJvdGVjdGVkIExpc3Q8UmVzcG9uc2U+IHJlc3BvbnNlOworICAgIEBYbWxBbnlFbGVtZW50KGxheCA9IHRydWUpCisgICAgcHJvdGVjdGVkIExpc3Q8T2JqZWN0PiBhbnk7CisgICAgQFhtbEF0dHJpYnV0ZShuYW1lID0gImlkIikKKyAgICBAWG1sSmF2YVR5cGVBZGFwdGVyKENvbGxhcHNlZFN0cmluZ0FkYXB0ZXIuY2xhc3MpCisgICAgQFhtbElECisgICAgQFhtbFNjaGVtYVR5cGUobmFtZSA9ICJJRCIpCisgICAgcHJvdGVjdGVkIFN0cmluZyBpZDsKKyAgICBAWG1sQXR0cmlidXRlKG5hbWUgPSAibmFtZSIpCisgICAgcHJvdGVjdGVkIFN0cmluZyBuYW1lOworICAgIEBYbWxBdHRyaWJ1dGUobmFtZSA9ICJocmVmIikKKyAgICBAWG1sU2NoZW1hVHlwZShuYW1lID0gImFueVVSSSIpCisgICAgcHJvdGVjdGVkIFN0cmluZyBocmVmOworICAgIEBYbWxBbnlBdHRyaWJ1dGUKKyAgICBwcml2YXRlIE1hcDxRTmFtZSwgU3RyaW5nPiBvdGhlckF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcDxRTmFtZSwgU3RyaW5nPigpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGRvYyBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwKKyAgICAgKiBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueSBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlCisgICAgICogcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4KKyAgICAgKiBUaGlzIGlzIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIGRvYyBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKKyAgICAgKiA8cHJlPgorICAgICAqICAgIGdldERvYygpLmFkZChuZXdJdGVtKTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKgorICAgICAqCisgICAgICogPHA+CisgICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3QKKyAgICAgKiB7QGxpbmsgRG9jIH0KKyAgICAgKgorICAgICAqCisgICAgICovCisgICAgcHVibGljIExpc3Q8RG9jPiBnZXREb2MoKSB7CisgICAgICAgIGlmIChkb2MgPT0gbnVsbCkgeworICAgICAgICAgICAgZG9jID0gbmV3IEFycmF5TGlzdDxEb2M+KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMuZG9jOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSByZXF1ZXN0IHByb3BlcnR5LgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICBwb3NzaWJsZSBvYmplY3QgaXMKKyAgICAgKiAgICAge0BsaW5rIFJlcXVlc3QgfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIFJlcXVlc3QgZ2V0UmVxdWVzdCgpIHsKKyAgICAgICAgcmV0dXJuIHJlcXVlc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHJlcXVlc3QgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiAgICAgYWxsb3dlZCBvYmplY3QgaXMKKyAgICAgKiAgICAge0BsaW5rIFJlcXVlc3QgfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVxdWVzdChSZXF1ZXN0IHZhbHVlKSB7CisgICAgICAgIHRoaXMucmVxdWVzdCA9IHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSByZXNwb25zZSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwKKyAgICAgKiBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueSBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlCisgICAgICogcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4KKyAgICAgKiBUaGlzIGlzIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIHJlc3BvbnNlIHByb3BlcnR5LgorICAgICAqCisgICAgICogPHA+CisgICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgorICAgICAqIDxwcmU+CisgICAgICogICAgZ2V0UmVzcG9uc2UoKS5hZGQobmV3SXRlbSk7CisgICAgICogPC9wcmU+CisgICAgICoKKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0CisgICAgICoge0BsaW5rIFJlc3BvbnNlIH0KKyAgICAgKgorICAgICAqCisgICAgICovCisgICAgcHVibGljIExpc3Q8UmVzcG9uc2U+IGdldFJlc3BvbnNlKCkgeworICAgICAgICBpZiAocmVzcG9uc2UgPT0gbnVsbCkgeworICAgICAgICAgICAgcmVzcG9uc2UgPSBuZXcgQXJyYXlMaXN0PFJlc3BvbnNlPigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLnJlc3BvbnNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBhbnkgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsCisgICAgICogbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkgbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZQorICAgICAqIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuCisgICAgICogVGhpcyBpcyB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBhbnkgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6CisgICAgICogPHByZT4KKyAgICAgKiAgICBnZXRBbnkoKS5hZGQobmV3SXRlbSk7CisgICAgICogPC9wcmU+CisgICAgICoKKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0CisgICAgICoge0BsaW5rIE9iamVjdCB9CisgICAgICoge0BsaW5rIEVsZW1lbnQgfQorICAgICAqCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxPYmplY3Q+IGdldEFueSgpIHsKKyAgICAgICAgaWYgKGFueSA9PSBudWxsKSB7CisgICAgICAgICAgICBhbnkgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpcy5hbnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICBwb3NzaWJsZSBvYmplY3QgaXMKKyAgICAgKiAgICAge0BsaW5rIFN0cmluZyB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgeworICAgICAgICByZXR1cm4gaWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICogICAgIGFsbG93ZWQgb2JqZWN0IGlzCisgICAgICogICAgIHtAbGluayBTdHJpbmcgfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHRoaXMuaWQgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbmFtZSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgcG9zc2libGUgb2JqZWN0IGlzCisgICAgICogICAgIHtAbGluayBTdHJpbmcgfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbmFtZSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZQorICAgICAqICAgICBhbGxvd2VkIG9iamVjdCBpcworICAgICAqICAgICB7QGxpbmsgU3RyaW5nIH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHRoaXMubmFtZSA9IHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBocmVmIHByb3BlcnR5LgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICBwb3NzaWJsZSBvYmplY3QgaXMKKyAgICAgKiAgICAge0BsaW5rIFN0cmluZyB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEhyZWYoKSB7CisgICAgICAgIHJldHVybiBocmVmOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBocmVmIHByb3BlcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICogICAgIGFsbG93ZWQgb2JqZWN0IGlzCisgICAgICogICAgIHtAbGluayBTdHJpbmcgfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SHJlZihTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgdGhpcy5ocmVmID0gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBhIG1hcCB0aGF0IGNvbnRhaW5zIGF0dHJpYnV0ZXMgdGhhdCBhcmVuJ3QgYm91bmQgdG8gYW55IHR5cGVkIHByb3BlcnR5IG9uIHRoaXMgY2xhc3MuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiB0aGUgbWFwIGlzIGtleWVkIGJ5IHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgYW5kCisgICAgICogdGhlIHZhbHVlIGlzIHRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZS4KKyAgICAgKgorICAgICAqIHRoZSBtYXAgcmV0dXJuZWQgYnkgdGhpcyBtZXRob2QgaXMgbGl2ZSwgYW5kIHlvdSBjYW4gYWRkIG5ldyBhdHRyaWJ1dGUKKyAgICAgKiBieSB1cGRhdGluZyB0aGUgbWFwIGRpcmVjdGx5LiBCZWNhdXNlIG9mIHRoaXMgZGVzaWduLCB0aGVyZSdzIG5vIHNldHRlci4KKyAgICAgKgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICBhbHdheXMgbm9uLW51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwPFFOYW1lLCBTdHJpbmc+IGdldE90aGVyQXR0cmlidXRlcygpIHsKKyAgICAgICAgcmV0dXJuIG90aGVyQXR0cmlidXRlczsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL3N1bi9yZXNlYXJjaC93cy93YWRsL09iamVjdEZhY3RvcnkuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL3N1bi9yZXNlYXJjaC93cy93YWRsL09iamVjdEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmFjZmJiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vc3VuL3Jlc2VhcmNoL3dzL3dhZGwvT2JqZWN0RmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTQ5IEBACisvLworLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMi43CisvLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4KKy8vIEFueSBtb2RpZmljYXRpb25zIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3QgdXBvbiByZWNvbXBpbGF0aW9uIG9mIHRoZSBzb3VyY2Ugc2NoZW1hLgorLy8gR2VuZXJhdGVkIG9uOiAyMDE0LjA4LjA2IGF0IDExOjU3OjMxIEFNIENFU1QKKy8vCisKK3BhY2thZ2UgY29tLnN1bi5yZXNlYXJjaC53cy53YWRsOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSZWdpc3RyeTsKKworLyoqCisgKiBUaGlzIG9iamVjdCBjb250YWlucyBmYWN0b3J5IG1ldGhvZHMgZm9yIGVhY2gKKyAqIEphdmEgY29udGVudCBpbnRlcmZhY2UgYW5kIEphdmEgZWxlbWVudCBpbnRlcmZhY2UKKyAqIGdlbmVyYXRlZCBpbiB0aGUgY29tLnN1bi5yZXNlYXJjaC53cy53YWRsIHBhY2thZ2UuCisgKiA8cD5BbiBPYmplY3RGYWN0b3J5IGFsbG93cyB5b3UgdG8gcHJvZ3JhbWF0aWNhbGx5CisgKiBjb25zdHJ1Y3QgbmV3IGluc3RhbmNlcyBvZiB0aGUgSmF2YSByZXByZXNlbnRhdGlvbgorICogZm9yIFhNTCBjb250ZW50LiBUaGUgSmF2YSByZXByZXNlbnRhdGlvbiBvZiBYTUwKKyAqIGNvbnRlbnQgY2FuIGNvbnNpc3Qgb2Ygc2NoZW1hIGRlcml2ZWQgaW50ZXJmYWNlcworICogYW5kIGNsYXNzZXMgcmVwcmVzZW50aW5nIHRoZSBiaW5kaW5nIG9mIHNjaGVtYQorICogdHlwZSBkZWZpbml0aW9ucywgZWxlbWVudCBkZWNsYXJhdGlvbnMgYW5kIG1vZGVsCisgKiBncm91cHMuICBGYWN0b3J5IG1ldGhvZHMgZm9yIGVhY2ggb2YgdGhlc2UgYXJlCisgKiBwcm92aWRlZCBpbiB0aGlzIGNsYXNzLgorICoKKyAqLworQFhtbFJlZ2lzdHJ5CitwdWJsaWMgY2xhc3MgT2JqZWN0RmFjdG9yeSB7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgT2JqZWN0RmFjdG9yeSB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBuZXcgaW5zdGFuY2VzIG9mIHNjaGVtYSBkZXJpdmVkIGNsYXNzZXMgZm9yIHBhY2thZ2U6IGNvbS5zdW4KKyAgICAgKiAucmVzZWFyY2gud3Mud2FkbAorICAgICAqCisgICAgICovCisgICAgcHVibGljIE9iamVjdEZhY3RvcnkoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBSZXNvdXJjZXMgfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIFJlc291cmNlcyBjcmVhdGVSZXNvdXJjZXMoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBEb2MgfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIERvYyBjcmVhdGVEb2MoKSB7CisgICAgICAgIHJldHVybiBuZXcgRG9jKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBSZXNvdXJjZSB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2UoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFBhcmFtIH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBQYXJhbSBjcmVhdGVQYXJhbSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQYXJhbSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgT3B0aW9uIH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBPcHRpb24gY3JlYXRlT3B0aW9uKCkgeworICAgICAgICByZXR1cm4gbmV3IE9wdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgTGluayB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgTGluayBjcmVhdGVMaW5rKCkgeworICAgICAgICByZXR1cm4gbmV3IExpbmsoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIE1ldGhvZCB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0aG9kIGNyZWF0ZU1ldGhvZCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNZXRob2QoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFJlcXVlc3QgfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIFJlcXVlc3QgY3JlYXRlUmVxdWVzdCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXF1ZXN0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBSZXByZXNlbnRhdGlvbiB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVwcmVzZW50YXRpb24gY3JlYXRlUmVwcmVzZW50YXRpb24oKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVwcmVzZW50YXRpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFJlc3BvbnNlIH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBSZXNwb25zZSBjcmVhdGVSZXNwb25zZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgQXBwbGljYXRpb24gfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIEFwcGxpY2F0aW9uIGNyZWF0ZUFwcGxpY2F0aW9uKCkgeworICAgICAgICByZXR1cm4gbmV3IEFwcGxpY2F0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBHcmFtbWFycyB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgR3JhbW1hcnMgY3JlYXRlR3JhbW1hcnMoKSB7CisgICAgICAgIHJldHVybiBuZXcgR3JhbW1hcnMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEluY2x1ZGUgfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIEluY2x1ZGUgY3JlYXRlSW5jbHVkZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJbmNsdWRlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHtAbGluayBSZXNvdXJjZVR5cGUgfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIFJlc291cmNlVHlwZSBjcmVhdGVSZXNvdXJjZVR5cGUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VUeXBlKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vcmVzZWFyY2gvd3Mvd2FkbC9PcHRpb24uamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL3N1bi9yZXNlYXJjaC93cy93YWRsL09wdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3Yjk4ODIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vcmVzZWFyY2gvd3Mvd2FkbC9PcHRpb24uamF2YQpAQCAtMCwwICsxLDE5MiBAQAorLy8KKy8vIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKYXZhVE0gQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyhKQVhCKSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24sIHYyLjIuNworLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+CisvLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4KKy8vIEdlbmVyYXRlZCBvbjogMjAxNC4wOC4wNiBhdCAxMTo1NzozMSBBTSBDRVNUCisvLworCitwYWNrYWdlIGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFueUF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFueUVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKKworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CisKKy8qKgorICogPHA+SmF2YSBjbGFzcyBmb3IgYW5vbnltb3VzIGNvbXBsZXggdHlwZS4KKyAqCisgKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgorICoKKyAqIDxwcmU+CisgKiAmbHQ7Y29tcGxleFR5cGU+CisgKiAgICZsdDtjb21wbGV4Q29udGVudD4KKyAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPgorICogICAgICAgJmx0O3NlcXVlbmNlPgorICogICAgICAgICAmbHQ7ZWxlbWVudCByZWY9IntodHRwOi8vd2FkbC5kZXYuamF2YS5uZXQvMjAwOS8wMn1kb2MiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiLz4KKyAqICAgICAgICAgJmx0O2FueSBwcm9jZXNzQ29udGVudHM9J2xheCcgbmFtZXNwYWNlPScjI290aGVyJyBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIi8+CisgKiAgICAgICAmbHQ7L3NlcXVlbmNlPgorICogICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdXNlPSJyZXF1aXJlZCIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfXN0cmluZyIgLz4KKyAqICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0ibWVkaWFUeXBlIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9c3RyaW5nIiAvPgorICogICAgICAgJmx0O2FueUF0dHJpYnV0ZSBwcm9jZXNzQ29udGVudHM9J2xheCcgbmFtZXNwYWNlPScjI290aGVyJy8+CisgKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KKyAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4KKyAqICZsdDsvY29tcGxleFR5cGU+CisgKiA8L3ByZT4KKyAqCisgKgorICovCitAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCitAWG1sVHlwZShuYW1lID0gIiIsIHByb3BPcmRlciA9IHsKKyAgICAgICAgImRvYyIsCisgICAgICAgICJhbnkiCit9KQorQFhtbFJvb3RFbGVtZW50KG5hbWUgPSAib3B0aW9uIikKK3B1YmxpYyBjbGFzcyBPcHRpb24geworCisgICAgcHJvdGVjdGVkIExpc3Q8RG9jPiBkb2M7CisgICAgQFhtbEFueUVsZW1lbnQobGF4ID0gdHJ1ZSkKKyAgICBwcm90ZWN0ZWQgTGlzdDxPYmplY3Q+IGFueTsKKyAgICBAWG1sQXR0cmlidXRlKG5hbWUgPSAidmFsdWUiLCByZXF1aXJlZCA9IHRydWUpCisgICAgcHJvdGVjdGVkIFN0cmluZyB2YWx1ZTsKKyAgICBAWG1sQXR0cmlidXRlKG5hbWUgPSAibWVkaWFUeXBlIikKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIG1lZGlhVHlwZTsKKyAgICBAWG1sQW55QXR0cmlidXRlCisgICAgcHJpdmF0ZSBNYXA8UU5hbWUsIFN0cmluZz4gb3RoZXJBdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXA8UU5hbWUsIFN0cmluZz4oKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBkb2MgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsCisgICAgICogbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkgbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZQorICAgICAqIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuCisgICAgICogVGhpcyBpcyB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBkb2MgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6CisgICAgICogPHByZT4KKyAgICAgKiAgICBnZXREb2MoKS5hZGQobmV3SXRlbSk7CisgICAgICogPC9wcmU+CisgICAgICoKKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0CisgICAgICoge0BsaW5rIERvYyB9CisgICAgICoKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PERvYz4gZ2V0RG9jKCkgeworICAgICAgICBpZiAoZG9jID09IG51bGwpIHsKKyAgICAgICAgICAgIGRvYyA9IG5ldyBBcnJheUxpc3Q8RG9jPigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLmRvYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgYW55IHByb3BlcnR5LgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LAorICAgICAqIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55IG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUKKyAgICAgKiByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LgorICAgICAqIFRoaXMgaXMgd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgYW55IHByb3BlcnR5LgorICAgICAqCisgICAgICogPHA+CisgICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgorICAgICAqIDxwcmU+CisgICAgICogICAgZ2V0QW55KCkuYWRkKG5ld0l0ZW0pOworICAgICAqIDwvcHJlPgorICAgICAqCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdAorICAgICAqIHtAbGluayBPYmplY3QgfQorICAgICAqIHtAbGluayBFbGVtZW50IH0KKyAgICAgKgorICAgICAqCisgICAgICovCisgICAgcHVibGljIExpc3Q8T2JqZWN0PiBnZXRBbnkoKSB7CisgICAgICAgIGlmIChhbnkgPT0gbnVsbCkgeworICAgICAgICAgICAgYW55ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMuYW55OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSB2YWx1ZSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgcG9zc2libGUgb2JqZWN0IGlzCisgICAgICogICAgIHtAbGluayBTdHJpbmcgfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSB2YWx1ZSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZQorICAgICAqICAgICBhbGxvd2VkIG9iamVjdCBpcworICAgICAqICAgICB7QGxpbmsgU3RyaW5nIH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIG1lZGlhVHlwZSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgcG9zc2libGUgb2JqZWN0IGlzCisgICAgICogICAgIHtAbGluayBTdHJpbmcgfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRNZWRpYVR5cGUoKSB7CisgICAgICAgIHJldHVybiBtZWRpYVR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIG1lZGlhVHlwZSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZQorICAgICAqICAgICBhbGxvd2VkIG9iamVjdCBpcworICAgICAqICAgICB7QGxpbmsgU3RyaW5nIH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhVHlwZShTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgdGhpcy5tZWRpYVR5cGUgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGEgbWFwIHRoYXQgY29udGFpbnMgYXR0cmlidXRlcyB0aGF0IGFyZW4ndCBib3VuZCB0byBhbnkgdHlwZWQgcHJvcGVydHkgb24gdGhpcyBjbGFzcy4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIHRoZSBtYXAgaXMga2V5ZWQgYnkgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBhbmQKKyAgICAgKiB0aGUgdmFsdWUgaXMgdGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlLgorICAgICAqCisgICAgICogdGhlIG1hcCByZXR1cm5lZCBieSB0aGlzIG1ldGhvZCBpcyBsaXZlLCBhbmQgeW91IGNhbiBhZGQgbmV3IGF0dHJpYnV0ZQorICAgICAqIGJ5IHVwZGF0aW5nIHRoZSBtYXAgZGlyZWN0bHkuIEJlY2F1c2Ugb2YgdGhpcyBkZXNpZ24sIHRoZXJlJ3Mgbm8gc2V0dGVyLgorICAgICAqCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgIGFsd2F5cyBub24tbnVsbAorICAgICAqLworICAgIHB1YmxpYyBNYXA8UU5hbWUsIFN0cmluZz4gZ2V0T3RoZXJBdHRyaWJ1dGVzKCkgeworICAgICAgICByZXR1cm4gb3RoZXJBdHRyaWJ1dGVzOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vc3VuL3Jlc2VhcmNoL3dzL3dhZGwvUGFyYW0uamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL3N1bi9yZXNlYXJjaC93cy93YWRsL1BhcmFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA3MTMxNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL3N1bi9yZXNlYXJjaC93cy93YWRsL1BhcmFtLmphdmEKQEAgLTAsMCArMSw0ODkgQEAKKy8vCisvLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4yLjcKKy8vIFNlZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiIj5odHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiPC9hPgorLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuCisvLyBHZW5lcmF0ZWQgb246IDIwMTQuMDguMDYgYXQgMTE6NTc6MzEgQU0gQ0VTVAorLy8KKworcGFja2FnZSBjb20uc3VuLnJlc2VhcmNoLndzLndhZGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBbnlBdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBbnlFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sSUQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNjaGVtYVR5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuQ29sbGFwc2VkU3RyaW5nQWRhcHRlcjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLlhtbEphdmFUeXBlQWRhcHRlcjsKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworCitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKKworLyoqCisgKiA8cD5KYXZhIGNsYXNzIGZvciBhbm9ueW1vdXMgY29tcGxleCB0eXBlLgorICoKKyAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCisgKgorICogPHByZT4KKyAqICZsdDtjb21wbGV4VHlwZT4KKyAqICAgJmx0O2NvbXBsZXhDb250ZW50PgorICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+CisgKiAgICAgICAmbHQ7c2VxdWVuY2U+CisgKiAgICAgICAgICZsdDtlbGVtZW50IHJlZj0ie2h0dHA6Ly93YWRsLmRldi5qYXZhLm5ldC8yMDA5LzAyfWRvYyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIvPgorICogICAgICAgICAmbHQ7ZWxlbWVudCByZWY9IntodHRwOi8vd2FkbC5kZXYuamF2YS5uZXQvMjAwOS8wMn1vcHRpb24iIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiLz4KKyAqICAgICAgICAgJmx0O2VsZW1lbnQgcmVmPSJ7aHR0cDovL3dhZGwuZGV2LmphdmEubmV0LzIwMDkvMDJ9bGluayIgbWluT2NjdXJzPSIwIi8+CisgKiAgICAgICAgICZsdDthbnkgcHJvY2Vzc0NvbnRlbnRzPSdsYXgnIG5hbWVzcGFjZT0nIyNvdGhlcicgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIvPgorICogICAgICAgJmx0Oy9zZXF1ZW5jZT4KKyAqICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0iaHJlZiIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVVSSSIgLz4KKyAqICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfU5NVE9LRU4iIC8+CisgKiAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9InN0eWxlIiB0eXBlPSJ7aHR0cDovL3dhZGwuZGV2LmphdmEubmV0LzIwMDkvMDJ9UGFyYW1TdHlsZSIgLz4KKyAqICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1JRCIgLz4KKyAqICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0idHlwZSIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfVFOYW1lIiBkZWZhdWx0PSJ4czpzdHJpbmciIC8+CisgKiAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9ImRlZmF1bHQiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1zdHJpbmciIC8+CisgKiAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9InJlcXVpcmVkIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9Ym9vbGVhbiIgZGVmYXVsdD0iZmFsc2UiIC8+CisgKiAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9InJlcGVhdGluZyIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWJvb2xlYW4iIGRlZmF1bHQ9ImZhbHNlIiAvPgorICogICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJmaXhlZCIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfXN0cmluZyIgLz4KKyAqICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0icGF0aCIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfXN0cmluZyIgLz4KKyAqICAgICAgICZsdDthbnlBdHRyaWJ1dGUgcHJvY2Vzc0NvbnRlbnRzPSdsYXgnIG5hbWVzcGFjZT0nIyNvdGhlcicvPgorICogICAgICZsdDsvcmVzdHJpY3Rpb24+CisgKiAgICZsdDsvY29tcGxleENvbnRlbnQ+CisgKiAmbHQ7L2NvbXBsZXhUeXBlPgorICogPC9wcmU+CisgKgorICoKKyAqLworQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQorQFhtbFR5cGUobmFtZSA9ICIiLCBwcm9wT3JkZXIgPSB7CisgICAgICAgICJkb2MiLAorICAgICAgICAib3B0aW9uIiwKKyAgICAgICAgImxpbmsiLAorICAgICAgICAiYW55IgorfSkKK0BYbWxSb290RWxlbWVudChuYW1lID0gInBhcmFtIikKK3B1YmxpYyBjbGFzcyBQYXJhbSB7CisKKyAgICBwcm90ZWN0ZWQgTGlzdDxEb2M+IGRvYzsKKyAgICBwcm90ZWN0ZWQgTGlzdDxPcHRpb24+IG9wdGlvbjsKKyAgICBwcm90ZWN0ZWQgTGluayBsaW5rOworICAgIEBYbWxBbnlFbGVtZW50KGxheCA9IHRydWUpCisgICAgcHJvdGVjdGVkIExpc3Q8T2JqZWN0PiBhbnk7CisgICAgQFhtbEF0dHJpYnV0ZShuYW1lID0gImhyZWYiKQorICAgIEBYbWxTY2hlbWFUeXBlKG5hbWUgPSAiYW55VVJJIikKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGhyZWY7CisgICAgQFhtbEF0dHJpYnV0ZShuYW1lID0gIm5hbWUiKQorICAgIEBYbWxKYXZhVHlwZUFkYXB0ZXIoQ29sbGFwc2VkU3RyaW5nQWRhcHRlci5jbGFzcykKKyAgICBAWG1sU2NoZW1hVHlwZShuYW1lID0gIk5NVE9LRU4iKQorICAgIHByb3RlY3RlZCBTdHJpbmcgbmFtZTsKKyAgICBAWG1sQXR0cmlidXRlKG5hbWUgPSAic3R5bGUiKQorICAgIHByb3RlY3RlZCBQYXJhbVN0eWxlIHN0eWxlOworICAgIEBYbWxBdHRyaWJ1dGUobmFtZSA9ICJpZCIpCisgICAgQFhtbEphdmFUeXBlQWRhcHRlcihDb2xsYXBzZWRTdHJpbmdBZGFwdGVyLmNsYXNzKQorICAgIEBYbWxJRAorICAgIEBYbWxTY2hlbWFUeXBlKG5hbWUgPSAiSUQiKQorICAgIHByb3RlY3RlZCBTdHJpbmcgaWQ7CisgICAgQFhtbEF0dHJpYnV0ZShuYW1lID0gInR5cGUiKQorICAgIHByb3RlY3RlZCBRTmFtZSB0eXBlOworICAgIEBYbWxBdHRyaWJ1dGUobmFtZSA9ICJkZWZhdWx0IikKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIF9kZWZhdWx0OworICAgIEBYbWxBdHRyaWJ1dGUobmFtZSA9ICJyZXF1aXJlZCIpCisgICAgcHJvdGVjdGVkIEJvb2xlYW4gcmVxdWlyZWQ7CisgICAgQFhtbEF0dHJpYnV0ZShuYW1lID0gInJlcGVhdGluZyIpCisgICAgcHJvdGVjdGVkIEJvb2xlYW4gcmVwZWF0aW5nOworICAgIEBYbWxBdHRyaWJ1dGUobmFtZSA9ICJmaXhlZCIpCisgICAgcHJvdGVjdGVkIFN0cmluZyBmaXhlZDsKKyAgICBAWG1sQXR0cmlidXRlKG5hbWUgPSAicGF0aCIpCisgICAgcHJvdGVjdGVkIFN0cmluZyBwYXRoOworICAgIEBYbWxBbnlBdHRyaWJ1dGUKKyAgICBwcml2YXRlIE1hcDxRTmFtZSwgU3RyaW5nPiBvdGhlckF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcDxRTmFtZSwgU3RyaW5nPigpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGRvYyBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwKKyAgICAgKiBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueSBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlCisgICAgICogcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4KKyAgICAgKiBUaGlzIGlzIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIGRvYyBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKKyAgICAgKiA8cHJlPgorICAgICAqICAgIGdldERvYygpLmFkZChuZXdJdGVtKTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKgorICAgICAqCisgICAgICogPHA+CisgICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3QKKyAgICAgKiB7QGxpbmsgRG9jIH0KKyAgICAgKgorICAgICAqCisgICAgICovCisgICAgcHVibGljIExpc3Q8RG9jPiBnZXREb2MoKSB7CisgICAgICAgIGlmIChkb2MgPT0gbnVsbCkgeworICAgICAgICAgICAgZG9jID0gbmV3IEFycmF5TGlzdDxEb2M+KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMuZG9jOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBvcHRpb24gcHJvcGVydHkuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsCisgICAgICogbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkgbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZQorICAgICAqIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuCisgICAgICogVGhpcyBpcyB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBvcHRpb24gcHJvcGVydHkuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6CisgICAgICogPHByZT4KKyAgICAgKiAgICBnZXRPcHRpb24oKS5hZGQobmV3SXRlbSk7CisgICAgICogPC9wcmU+CisgICAgICoKKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0CisgICAgICoge0BsaW5rIE9wdGlvbiB9CisgICAgICoKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PE9wdGlvbj4gZ2V0T3B0aW9uKCkgeworICAgICAgICBpZiAob3B0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIG9wdGlvbiA9IG5ldyBBcnJheUxpc3Q8T3B0aW9uPigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLm9wdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbGluayBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgcG9zc2libGUgb2JqZWN0IGlzCisgICAgICogICAgIHtAbGluayBMaW5rIH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBMaW5rIGdldExpbmsoKSB7CisgICAgICAgIHJldHVybiBsaW5rOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBsaW5rIHByb3BlcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICogICAgIGFsbG93ZWQgb2JqZWN0IGlzCisgICAgICogICAgIHtAbGluayBMaW5rIH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExpbmsoTGluayB2YWx1ZSkgeworICAgICAgICB0aGlzLmxpbmsgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgYW55IHByb3BlcnR5LgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LAorICAgICAqIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55IG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUKKyAgICAgKiByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LgorICAgICAqIFRoaXMgaXMgd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgYW55IHByb3BlcnR5LgorICAgICAqCisgICAgICogPHA+CisgICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgorICAgICAqIDxwcmU+CisgICAgICogICAgZ2V0QW55KCkuYWRkKG5ld0l0ZW0pOworICAgICAqIDwvcHJlPgorICAgICAqCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdAorICAgICAqIHtAbGluayBPYmplY3QgfQorICAgICAqIHtAbGluayBFbGVtZW50IH0KKyAgICAgKgorICAgICAqCisgICAgICovCisgICAgcHVibGljIExpc3Q8T2JqZWN0PiBnZXRBbnkoKSB7CisgICAgICAgIGlmIChhbnkgPT0gbnVsbCkgeworICAgICAgICAgICAgYW55ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMuYW55OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBocmVmIHByb3BlcnR5LgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICBwb3NzaWJsZSBvYmplY3QgaXMKKyAgICAgKiAgICAge0BsaW5rIFN0cmluZyB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEhyZWYoKSB7CisgICAgICAgIHJldHVybiBocmVmOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBocmVmIHByb3BlcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICogICAgIGFsbG93ZWQgb2JqZWN0IGlzCisgICAgICogICAgIHtAbGluayBTdHJpbmcgfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SHJlZihTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgdGhpcy5ocmVmID0gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIG5hbWUgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgIHBvc3NpYmxlIG9iamVjdCBpcworICAgICAqICAgICB7QGxpbmsgU3RyaW5nIH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIG5hbWUgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiAgICAgYWxsb3dlZCBvYmplY3QgaXMKKyAgICAgKiAgICAge0BsaW5rIFN0cmluZyB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0aGlzLm5hbWUgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc3R5bGUgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgIHBvc3NpYmxlIG9iamVjdCBpcworICAgICAqICAgICB7QGxpbmsgUGFyYW1TdHlsZSB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgUGFyYW1TdHlsZSBnZXRTdHlsZSgpIHsKKyAgICAgICAgcmV0dXJuIHN0eWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBzdHlsZSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZQorICAgICAqICAgICBhbGxvd2VkIG9iamVjdCBpcworICAgICAqICAgICB7QGxpbmsgUGFyYW1TdHlsZSB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTdHlsZShQYXJhbVN0eWxlIHZhbHVlKSB7CisgICAgICAgIHRoaXMuc3R5bGUgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgIHBvc3NpYmxlIG9iamVjdCBpcworICAgICAqICAgICB7QGxpbmsgU3RyaW5nIH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiBpZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiAgICAgYWxsb3dlZCBvYmplY3QgaXMKKyAgICAgKiAgICAge0BsaW5rIFN0cmluZyB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgdGhpcy5pZCA9IHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSB0eXBlIHByb3BlcnR5LgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICBwb3NzaWJsZSBvYmplY3QgaXMKKyAgICAgKiAgICAge0BsaW5rIFFOYW1lIH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBRTmFtZSBnZXRUeXBlKCkgeworICAgICAgICBpZiAodHlwZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFFOYW1lKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIsICJzdHJpbmciLCAieHMiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHR5cGUgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiAgICAgYWxsb3dlZCBvYmplY3QgaXMKKyAgICAgKiAgICAge0BsaW5rIFFOYW1lIH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoUU5hbWUgdmFsdWUpIHsKKyAgICAgICAgdGhpcy50eXBlID0gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGRlZmF1bHQgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgIHBvc3NpYmxlIG9iamVjdCBpcworICAgICAqICAgICB7QGxpbmsgU3RyaW5nIH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdCgpIHsKKyAgICAgICAgcmV0dXJuIF9kZWZhdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBkZWZhdWx0IHByb3BlcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICogICAgIGFsbG93ZWQgb2JqZWN0IGlzCisgICAgICogICAgIHtAbGluayBTdHJpbmcgfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdChTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgdGhpcy5fZGVmYXVsdCA9IHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSByZXF1aXJlZCBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgcG9zc2libGUgb2JqZWN0IGlzCisgICAgICogICAgIHtAbGluayBCb29sZWFuIH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUmVxdWlyZWQoKSB7CisgICAgICAgIGlmIChyZXF1aXJlZCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gcmVxdWlyZWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcmVxdWlyZWQgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiAgICAgYWxsb3dlZCBvYmplY3QgaXMKKyAgICAgKiAgICAge0BsaW5rIEJvb2xlYW4gfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVxdWlyZWQoQm9vbGVhbiB2YWx1ZSkgeworICAgICAgICB0aGlzLnJlcXVpcmVkID0gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHJlcGVhdGluZyBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgcG9zc2libGUgb2JqZWN0IGlzCisgICAgICogICAgIHtAbGluayBCb29sZWFuIH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUmVwZWF0aW5nKCkgeworICAgICAgICBpZiAocmVwZWF0aW5nID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiByZXBlYXRpbmc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcmVwZWF0aW5nIHByb3BlcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICogICAgIGFsbG93ZWQgb2JqZWN0IGlzCisgICAgICogICAgIHtAbGluayBCb29sZWFuIH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlcGVhdGluZyhCb29sZWFuIHZhbHVlKSB7CisgICAgICAgIHRoaXMucmVwZWF0aW5nID0gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZpeGVkIHByb3BlcnR5LgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICBwb3NzaWJsZSBvYmplY3QgaXMKKyAgICAgKiAgICAge0BsaW5rIFN0cmluZyB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpeGVkKCkgeworICAgICAgICByZXR1cm4gZml4ZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZpeGVkIHByb3BlcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICogICAgIGFsbG93ZWQgb2JqZWN0IGlzCisgICAgICogICAgIHtAbGluayBTdHJpbmcgfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Rml4ZWQoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHRoaXMuZml4ZWQgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcGF0aCBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgcG9zc2libGUgb2JqZWN0IGlzCisgICAgICogICAgIHtAbGluayBTdHJpbmcgfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgeworICAgICAgICByZXR1cm4gcGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcGF0aCBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZQorICAgICAqICAgICBhbGxvd2VkIG9iamVjdCBpcworICAgICAqICAgICB7QGxpbmsgU3RyaW5nIH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhdGgoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHRoaXMucGF0aCA9IHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgYSBtYXAgdGhhdCBjb250YWlucyBhdHRyaWJ1dGVzIHRoYXQgYXJlbid0IGJvdW5kIHRvIGFueSB0eXBlZCBwcm9wZXJ0eSBvbiB0aGlzIGNsYXNzLgorICAgICAqCisgICAgICogPHA+CisgICAgICogdGhlIG1hcCBpcyBrZXllZCBieSB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIGFuZAorICAgICAqIHRoZSB2YWx1ZSBpcyB0aGUgc3RyaW5nIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuCisgICAgICoKKyAgICAgKiB0aGUgbWFwIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kIGlzIGxpdmUsIGFuZCB5b3UgY2FuIGFkZCBuZXcgYXR0cmlidXRlCisgICAgICogYnkgdXBkYXRpbmcgdGhlIG1hcCBkaXJlY3RseS4gQmVjYXVzZSBvZiB0aGlzIGRlc2lnbiwgdGhlcmUncyBubyBzZXR0ZXIuCisgICAgICoKKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgYWx3YXlzIG5vbi1udWxsCisgICAgICovCisgICAgcHVibGljIE1hcDxRTmFtZSwgU3RyaW5nPiBnZXRPdGhlckF0dHJpYnV0ZXMoKSB7CisgICAgICAgIHJldHVybiBvdGhlckF0dHJpYnV0ZXM7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vcmVzZWFyY2gvd3Mvd2FkbC9QYXJhbVN0eWxlLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vcmVzZWFyY2gvd3Mvd2FkbC9QYXJhbVN0eWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ4ZTA3YQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL3N1bi9yZXNlYXJjaC93cy93YWRsL1BhcmFtU3R5bGUuamF2YQpAQCAtMCwwICsxLDY3IEBACisvLworLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMi43CisvLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4KKy8vIEFueSBtb2RpZmljYXRpb25zIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3QgdXBvbiByZWNvbXBpbGF0aW9uIG9mIHRoZSBzb3VyY2Ugc2NoZW1hLgorLy8gR2VuZXJhdGVkIG9uOiAyMDE0LjA4LjA2IGF0IDExOjU3OjMxIEFNIENFU1QKKy8vCisKKworcGFja2FnZSBjb20uc3VuLnJlc2VhcmNoLndzLndhZGw7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVudW07CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbnVtVmFsdWU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOworCisKKy8qKgorICogPHA+SmF2YSBjbGFzcyBmb3IgUGFyYW1TdHlsZS4KKyAqCisgKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgorICogPHA+CisgKiA8cHJlPgorICogJmx0O3NpbXBsZVR5cGUgbmFtZT0iUGFyYW1TdHlsZSI+CisgKiAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9c3RyaW5nIj4KKyAqICAgICAmbHQ7ZW51bWVyYXRpb24gdmFsdWU9InBsYWluIi8+CisgKiAgICAgJmx0O2VudW1lcmF0aW9uIHZhbHVlPSJxdWVyeSIvPgorICogICAgICZsdDtlbnVtZXJhdGlvbiB2YWx1ZT0ibWF0cml4Ii8+CisgKiAgICAgJmx0O2VudW1lcmF0aW9uIHZhbHVlPSJoZWFkZXIiLz4KKyAqICAgICAmbHQ7ZW51bWVyYXRpb24gdmFsdWU9InRlbXBsYXRlIi8+CisgKiAgICZsdDsvcmVzdHJpY3Rpb24+CisgKiAmbHQ7L3NpbXBsZVR5cGU+CisgKiA8L3ByZT4KKyAqCisgKi8KK0BYbWxUeXBlKG5hbWUgPSAiUGFyYW1TdHlsZSIpCitAWG1sRW51bQorcHVibGljIGVudW0gUGFyYW1TdHlsZSB7CisKKyAgICBAWG1sRW51bVZhbHVlKCJwbGFpbiIpCisgICAgUExBSU4oInBsYWluIiksCisgICAgQFhtbEVudW1WYWx1ZSgicXVlcnkiKQorICAgIFFVRVJZKCJxdWVyeSIpLAorICAgIEBYbWxFbnVtVmFsdWUoIm1hdHJpeCIpCisgICAgTUFUUklYKCJtYXRyaXgiKSwKKyAgICBAWG1sRW51bVZhbHVlKCJoZWFkZXIiKQorICAgIEhFQURFUigiaGVhZGVyIiksCisgICAgQFhtbEVudW1WYWx1ZSgidGVtcGxhdGUiKQorICAgIFRFTVBMQVRFKCJ0ZW1wbGF0ZSIpOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHZhbHVlOworCisgICAgUGFyYW1TdHlsZShTdHJpbmcgdikgeworICAgICAgICB2YWx1ZSA9IHY7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB2YWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUGFyYW1TdHlsZSBmcm9tVmFsdWUoU3RyaW5nIHYpIHsKKyAgICAgICAgZm9yIChQYXJhbVN0eWxlIGM6IFBhcmFtU3R5bGUudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIGlmIChjLnZhbHVlLmVxdWFscyh2KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBjOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24odik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vcmVzZWFyY2gvd3Mvd2FkbC9SZXByZXNlbnRhdGlvbi5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vc3VuL3Jlc2VhcmNoL3dzL3dhZGwvUmVwcmVzZW50YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzBkNDRkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vc3VuL3Jlc2VhcmNoL3dzL3dhZGwvUmVwcmVzZW50YXRpb24uamF2YQpAQCAtMCwwICsxLDMxOCBAQAorLy8KKy8vIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKYXZhVE0gQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyhKQVhCKSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24sIHYyLjIuNworLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+CisvLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4KKy8vIEdlbmVyYXRlZCBvbjogMjAxNC4wOC4wNiBhdCAxMTo1NzozMSBBTSBDRVNUCisvLworCisKK3BhY2thZ2UgY29tLnN1bi5yZXNlYXJjaC53cy53YWRsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFueUF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFueUVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxJRDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sU2NoZW1hVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5Db2xsYXBzZWRTdHJpbmdBZGFwdGVyOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sSmF2YVR5cGVBZGFwdGVyOworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKKworCisvKioKKyAqIDxwPkphdmEgY2xhc3MgZm9yIGFub255bW91cyBjb21wbGV4IHR5cGUuCisgKgorICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KKyAqCisgKiA8cHJlPgorICogJmx0O2NvbXBsZXhUeXBlPgorICogICAmbHQ7Y29tcGxleENvbnRlbnQ+CisgKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4KKyAqICAgICAgICZsdDtzZXF1ZW5jZT4KKyAqICAgICAgICAgJmx0O2VsZW1lbnQgcmVmPSJ7aHR0cDovL3dhZGwuZGV2LmphdmEubmV0LzIwMDkvMDJ9ZG9jIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIi8+CisgKiAgICAgICAgICZsdDtlbGVtZW50IHJlZj0ie2h0dHA6Ly93YWRsLmRldi5qYXZhLm5ldC8yMDA5LzAyfXBhcmFtIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIi8+CisgKiAgICAgICAgICZsdDthbnkgcHJvY2Vzc0NvbnRlbnRzPSdsYXgnIG5hbWVzcGFjZT0nIyNvdGhlcicgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIvPgorICogICAgICAgJmx0Oy9zZXF1ZW5jZT4KKyAqICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0iaWQiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1JRCIgLz4KKyAqICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0iZWxlbWVudCIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfVFOYW1lIiAvPgorICogICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJtZWRpYVR5cGUiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1zdHJpbmciIC8+CisgKiAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9ImhyZWYiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlVUkkiIC8+CisgKiAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9InByb2ZpbGUiIHR5cGU9IntodHRwOi8vd2FkbC5kZXYuamF2YS5uZXQvMjAwOS8wMn11cmlMaXN0IiAvPgorICogICAgICAgJmx0O2FueUF0dHJpYnV0ZSBwcm9jZXNzQ29udGVudHM9J2xheCcgbmFtZXNwYWNlPScjI290aGVyJy8+CisgKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KKyAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4KKyAqICZsdDsvY29tcGxleFR5cGU+CisgKiA8L3ByZT4KKyAqCisgKgorICovCitAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCitAWG1sVHlwZShuYW1lID0gIiIsIHByb3BPcmRlciA9IHsKKyAgICAgICAgImRvYyIsCisgICAgICAgICJwYXJhbSIsCisgICAgICAgICJhbnkiCit9KQorQFhtbFJvb3RFbGVtZW50KG5hbWUgPSAicmVwcmVzZW50YXRpb24iKQorcHVibGljIGNsYXNzIFJlcHJlc2VudGF0aW9uIHsKKworICAgIHByb3RlY3RlZCBMaXN0PERvYz4gZG9jOworICAgIHByb3RlY3RlZCBMaXN0PFBhcmFtPiBwYXJhbTsKKyAgICBAWG1sQW55RWxlbWVudChsYXggPSB0cnVlKQorICAgIHByb3RlY3RlZCBMaXN0PE9iamVjdD4gYW55OworICAgIEBYbWxBdHRyaWJ1dGUobmFtZSA9ICJpZCIpCisgICAgQFhtbEphdmFUeXBlQWRhcHRlcihDb2xsYXBzZWRTdHJpbmdBZGFwdGVyLmNsYXNzKQorICAgIEBYbWxJRAorICAgIEBYbWxTY2hlbWFUeXBlKG5hbWUgPSAiSUQiKQorICAgIHByb3RlY3RlZCBTdHJpbmcgaWQ7CisgICAgQFhtbEF0dHJpYnV0ZShuYW1lID0gImVsZW1lbnQiKQorICAgIHByb3RlY3RlZCBRTmFtZSBlbGVtZW50OworICAgIEBYbWxBdHRyaWJ1dGUobmFtZSA9ICJtZWRpYVR5cGUiKQorICAgIHByb3RlY3RlZCBTdHJpbmcgbWVkaWFUeXBlOworICAgIEBYbWxBdHRyaWJ1dGUobmFtZSA9ICJocmVmIikKKyAgICBAWG1sU2NoZW1hVHlwZShuYW1lID0gImFueVVSSSIpCisgICAgcHJvdGVjdGVkIFN0cmluZyBocmVmOworICAgIEBYbWxBdHRyaWJ1dGUobmFtZSA9ICJwcm9maWxlIikKKyAgICBwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IHByb2ZpbGU7CisgICAgQFhtbEFueUF0dHJpYnV0ZQorICAgIHByaXZhdGUgTWFwPFFOYW1lLCBTdHJpbmc+IG90aGVyQXR0cmlidXRlcyA9IG5ldyBIYXNoTWFwPFFOYW1lLCBTdHJpbmc+KCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZG9jIHByb3BlcnR5LgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LAorICAgICAqIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55IG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUKKyAgICAgKiByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LgorICAgICAqIFRoaXMgaXMgd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgZG9jIHByb3BlcnR5LgorICAgICAqCisgICAgICogPHA+CisgICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgorICAgICAqIDxwcmU+CisgICAgICogICAgZ2V0RG9jKCkuYWRkKG5ld0l0ZW0pOworICAgICAqIDwvcHJlPgorICAgICAqCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdAorICAgICAqIHtAbGluayBEb2MgfQorICAgICAqCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxEb2M+IGdldERvYygpIHsKKyAgICAgICAgaWYgKGRvYyA9PSBudWxsKSB7CisgICAgICAgICAgICBkb2MgPSBuZXcgQXJyYXlMaXN0PERvYz4oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpcy5kb2M7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHBhcmFtIHByb3BlcnR5LgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LAorICAgICAqIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55IG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUKKyAgICAgKiByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LgorICAgICAqIFRoaXMgaXMgd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgcGFyYW0gcHJvcGVydHkuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6CisgICAgICogPHByZT4KKyAgICAgKiAgICBnZXRQYXJhbSgpLmFkZChuZXdJdGVtKTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKgorICAgICAqCisgICAgICogPHA+CisgICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3QKKyAgICAgKiB7QGxpbmsgUGFyYW0gfQorICAgICAqCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxQYXJhbT4gZ2V0UGFyYW0oKSB7CisgICAgICAgIGlmIChwYXJhbSA9PSBudWxsKSB7CisgICAgICAgICAgICBwYXJhbSA9IG5ldyBBcnJheUxpc3Q8UGFyYW0+KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMucGFyYW07CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGFueSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwKKyAgICAgKiBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueSBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlCisgICAgICogcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4KKyAgICAgKiBUaGlzIGlzIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIGFueSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKKyAgICAgKiA8cHJlPgorICAgICAqICAgIGdldEFueSgpLmFkZChuZXdJdGVtKTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKgorICAgICAqCisgICAgICogPHA+CisgICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3QKKyAgICAgKiB7QGxpbmsgT2JqZWN0IH0KKyAgICAgKiB7QGxpbmsgRWxlbWVudCB9CisgICAgICoKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PE9iamVjdD4gZ2V0QW55KCkgeworICAgICAgICBpZiAoYW55ID09IG51bGwpIHsKKyAgICAgICAgICAgIGFueSA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLmFueTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgIHBvc3NpYmxlIG9iamVjdCBpcworICAgICAqICAgICB7QGxpbmsgU3RyaW5nIH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiBpZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiAgICAgYWxsb3dlZCBvYmplY3QgaXMKKyAgICAgKiAgICAge0BsaW5rIFN0cmluZyB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgdGhpcy5pZCA9IHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBlbGVtZW50IHByb3BlcnR5LgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICBwb3NzaWJsZSBvYmplY3QgaXMKKyAgICAgKiAgICAge0BsaW5rIFFOYW1lIH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBRTmFtZSBnZXRFbGVtZW50KCkgeworICAgICAgICByZXR1cm4gZWxlbWVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZWxlbWVudCBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZQorICAgICAqICAgICBhbGxvd2VkIG9iamVjdCBpcworICAgICAqICAgICB7QGxpbmsgUU5hbWUgfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RWxlbWVudChRTmFtZSB2YWx1ZSkgeworICAgICAgICB0aGlzLmVsZW1lbnQgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbWVkaWFUeXBlIHByb3BlcnR5LgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICBwb3NzaWJsZSBvYmplY3QgaXMKKyAgICAgKiAgICAge0BsaW5rIFN0cmluZyB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE1lZGlhVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIG1lZGlhVHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbWVkaWFUeXBlIHByb3BlcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICogICAgIGFsbG93ZWQgb2JqZWN0IGlzCisgICAgICogICAgIHtAbGluayBTdHJpbmcgfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWVkaWFUeXBlKFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0aGlzLm1lZGlhVHlwZSA9IHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBocmVmIHByb3BlcnR5LgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICBwb3NzaWJsZSBvYmplY3QgaXMKKyAgICAgKiAgICAge0BsaW5rIFN0cmluZyB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEhyZWYoKSB7CisgICAgICAgIHJldHVybiBocmVmOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBocmVmIHByb3BlcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICogICAgIGFsbG93ZWQgb2JqZWN0IGlzCisgICAgICogICAgIHtAbGluayBTdHJpbmcgfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SHJlZihTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgdGhpcy5ocmVmID0gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHByb2ZpbGUgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsCisgICAgICogbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkgbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZQorICAgICAqIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuCisgICAgICogVGhpcyBpcyB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBwcm9maWxlIHByb3BlcnR5LgorICAgICAqCisgICAgICogPHA+CisgICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgorICAgICAqIDxwcmU+CisgICAgICogICAgZ2V0UHJvZmlsZSgpLmFkZChuZXdJdGVtKTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKgorICAgICAqCisgICAgICogPHA+CisgICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3QKKyAgICAgKiB7QGxpbmsgU3RyaW5nIH0KKyAgICAgKgorICAgICAqCisgICAgICovCisgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRQcm9maWxlKCkgeworICAgICAgICBpZiAocHJvZmlsZSA9PSBudWxsKSB7CisgICAgICAgICAgICBwcm9maWxlID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMucHJvZmlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGEgbWFwIHRoYXQgY29udGFpbnMgYXR0cmlidXRlcyB0aGF0IGFyZW4ndCBib3VuZCB0byBhbnkgdHlwZWQgcHJvcGVydHkgb24gdGhpcyBjbGFzcy4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIHRoZSBtYXAgaXMga2V5ZWQgYnkgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBhbmQKKyAgICAgKiB0aGUgdmFsdWUgaXMgdGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlLgorICAgICAqCisgICAgICogdGhlIG1hcCByZXR1cm5lZCBieSB0aGlzIG1ldGhvZCBpcyBsaXZlLCBhbmQgeW91IGNhbiBhZGQgbmV3IGF0dHJpYnV0ZQorICAgICAqIGJ5IHVwZGF0aW5nIHRoZSBtYXAgZGlyZWN0bHkuIEJlY2F1c2Ugb2YgdGhpcyBkZXNpZ24sIHRoZXJlJ3Mgbm8gc2V0dGVyLgorICAgICAqCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgIGFsd2F5cyBub24tbnVsbAorICAgICAqLworICAgIHB1YmxpYyBNYXA8UU5hbWUsIFN0cmluZz4gZ2V0T3RoZXJBdHRyaWJ1dGVzKCkgeworICAgICAgICByZXR1cm4gb3RoZXJBdHRyaWJ1dGVzOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vc3VuL3Jlc2VhcmNoL3dzL3dhZGwvUmVxdWVzdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vc3VuL3Jlc2VhcmNoL3dzL3dhZGwvUmVxdWVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMjc5YTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vcmVzZWFyY2gvd3Mvd2FkbC9SZXF1ZXN0LmphdmEKQEAgLTAsMCArMSwyMDEgQEAKKy8vCisvLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4yLjcKKy8vIFNlZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiIj5odHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiPC9hPgorLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuCisvLyBHZW5lcmF0ZWQgb246IDIwMTQuMDguMDYgYXQgMTE6NTc6MzEgQU0gQ0VTVAorLy8KKworcGFja2FnZSBjb20uc3VuLnJlc2VhcmNoLndzLndhZGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBbnlBdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBbnlFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CisKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworCisvKioKKyAqIDxwPkphdmEgY2xhc3MgZm9yIGFub255bW91cyBjb21wbGV4IHR5cGUuCisgKgorICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KKyAqCisgKiA8cHJlPgorICogJmx0O2NvbXBsZXhUeXBlPgorICogICAmbHQ7Y29tcGxleENvbnRlbnQ+CisgKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4KKyAqICAgICAgICZsdDtzZXF1ZW5jZT4KKyAqICAgICAgICAgJmx0O2VsZW1lbnQgcmVmPSJ7aHR0cDovL3dhZGwuZGV2LmphdmEubmV0LzIwMDkvMDJ9ZG9jIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIi8+CisgKiAgICAgICAgICZsdDtlbGVtZW50IHJlZj0ie2h0dHA6Ly93YWRsLmRldi5qYXZhLm5ldC8yMDA5LzAyfXBhcmFtIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIi8+CisgKiAgICAgICAgICZsdDtlbGVtZW50IHJlZj0ie2h0dHA6Ly93YWRsLmRldi5qYXZhLm5ldC8yMDA5LzAyfXJlcHJlc2VudGF0aW9uIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIi8+CisgKiAgICAgICAgICZsdDthbnkgcHJvY2Vzc0NvbnRlbnRzPSdsYXgnIG5hbWVzcGFjZT0nIyNvdGhlcicgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIvPgorICogICAgICAgJmx0Oy9zZXF1ZW5jZT4KKyAqICAgICAgICZsdDthbnlBdHRyaWJ1dGUgcHJvY2Vzc0NvbnRlbnRzPSdsYXgnIG5hbWVzcGFjZT0nIyNvdGhlcicvPgorICogICAgICZsdDsvcmVzdHJpY3Rpb24+CisgKiAgICZsdDsvY29tcGxleENvbnRlbnQ+CisgKiAmbHQ7L2NvbXBsZXhUeXBlPgorICogPC9wcmU+CisgKgorICoKKyAqLworQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQorQFhtbFR5cGUobmFtZSA9ICIiLCBwcm9wT3JkZXIgPSB7CisgICAgICAgICJkb2MiLAorICAgICAgICAicGFyYW0iLAorICAgICAgICAicmVwcmVzZW50YXRpb24iLAorICAgICAgICAiYW55IgorfSkKK0BYbWxSb290RWxlbWVudChuYW1lID0gInJlcXVlc3QiKQorcHVibGljIGNsYXNzIFJlcXVlc3QgeworCisgICAgcHJvdGVjdGVkIExpc3Q8RG9jPiBkb2M7CisgICAgcHJvdGVjdGVkIExpc3Q8UGFyYW0+IHBhcmFtOworICAgIHByb3RlY3RlZCBMaXN0PFJlcHJlc2VudGF0aW9uPiByZXByZXNlbnRhdGlvbjsKKyAgICBAWG1sQW55RWxlbWVudChsYXggPSB0cnVlKQorICAgIHByb3RlY3RlZCBMaXN0PE9iamVjdD4gYW55OworICAgIEBYbWxBbnlBdHRyaWJ1dGUKKyAgICBwcml2YXRlIE1hcDxRTmFtZSwgU3RyaW5nPiBvdGhlckF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcDxRTmFtZSwgU3RyaW5nPigpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGRvYyBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwKKyAgICAgKiBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueSBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlCisgICAgICogcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4KKyAgICAgKiBUaGlzIGlzIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIGRvYyBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKKyAgICAgKiA8cHJlPgorICAgICAqICAgIGdldERvYygpLmFkZChuZXdJdGVtKTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKgorICAgICAqCisgICAgICogPHA+CisgICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3QKKyAgICAgKiB7QGxpbmsgRG9jIH0KKyAgICAgKgorICAgICAqCisgICAgICovCisgICAgcHVibGljIExpc3Q8RG9jPiBnZXREb2MoKSB7CisgICAgICAgIGlmIChkb2MgPT0gbnVsbCkgeworICAgICAgICAgICAgZG9jID0gbmV3IEFycmF5TGlzdDxEb2M+KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMuZG9jOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBwYXJhbSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwKKyAgICAgKiBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueSBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlCisgICAgICogcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4KKyAgICAgKiBUaGlzIGlzIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIHBhcmFtIHByb3BlcnR5LgorICAgICAqCisgICAgICogPHA+CisgICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgorICAgICAqIDxwcmU+CisgICAgICogICAgZ2V0UGFyYW0oKS5hZGQobmV3SXRlbSk7CisgICAgICogPC9wcmU+CisgICAgICoKKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0CisgICAgICoge0BsaW5rIFBhcmFtIH0KKyAgICAgKgorICAgICAqCisgICAgICovCisgICAgcHVibGljIExpc3Q8UGFyYW0+IGdldFBhcmFtKCkgeworICAgICAgICBpZiAocGFyYW0gPT0gbnVsbCkgeworICAgICAgICAgICAgcGFyYW0gPSBuZXcgQXJyYXlMaXN0PFBhcmFtPigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLnBhcmFtOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSByZXByZXNlbnRhdGlvbiBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwKKyAgICAgKiBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueSBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlCisgICAgICogcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4KKyAgICAgKiBUaGlzIGlzIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIHJlcHJlc2VudGF0aW9uIHByb3BlcnR5LgorICAgICAqCisgICAgICogPHA+CisgICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgorICAgICAqIDxwcmU+CisgICAgICogICAgZ2V0UmVwcmVzZW50YXRpb24oKS5hZGQobmV3SXRlbSk7CisgICAgICogPC9wcmU+CisgICAgICoKKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0CisgICAgICoge0BsaW5rIFJlcHJlc2VudGF0aW9uIH0KKyAgICAgKgorICAgICAqCisgICAgICovCisgICAgcHVibGljIExpc3Q8UmVwcmVzZW50YXRpb24+IGdldFJlcHJlc2VudGF0aW9uKCkgeworICAgICAgICBpZiAocmVwcmVzZW50YXRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgcmVwcmVzZW50YXRpb24gPSBuZXcgQXJyYXlMaXN0PFJlcHJlc2VudGF0aW9uPigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLnJlcHJlc2VudGF0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBhbnkgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsCisgICAgICogbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkgbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZQorICAgICAqIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuCisgICAgICogVGhpcyBpcyB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBhbnkgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6CisgICAgICogPHByZT4KKyAgICAgKiAgICBnZXRBbnkoKS5hZGQobmV3SXRlbSk7CisgICAgICogPC9wcmU+CisgICAgICoKKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0CisgICAgICoge0BsaW5rIE9iamVjdCB9CisgICAgICoge0BsaW5rIEVsZW1lbnQgfQorICAgICAqCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxPYmplY3Q+IGdldEFueSgpIHsKKyAgICAgICAgaWYgKGFueSA9PSBudWxsKSB7CisgICAgICAgICAgICBhbnkgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpcy5hbnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBhIG1hcCB0aGF0IGNvbnRhaW5zIGF0dHJpYnV0ZXMgdGhhdCBhcmVuJ3QgYm91bmQgdG8gYW55IHR5cGVkIHByb3BlcnR5IG9uIHRoaXMgY2xhc3MuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiB0aGUgbWFwIGlzIGtleWVkIGJ5IHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgYW5kCisgICAgICogdGhlIHZhbHVlIGlzIHRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZS4KKyAgICAgKgorICAgICAqIHRoZSBtYXAgcmV0dXJuZWQgYnkgdGhpcyBtZXRob2QgaXMgbGl2ZSwgYW5kIHlvdSBjYW4gYWRkIG5ldyBhdHRyaWJ1dGUKKyAgICAgKiBieSB1cGRhdGluZyB0aGUgbWFwIGRpcmVjdGx5LiBCZWNhdXNlIG9mIHRoaXMgZGVzaWduLCB0aGVyZSdzIG5vIHNldHRlci4KKyAgICAgKgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICBhbHdheXMgbm9uLW51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwPFFOYW1lLCBTdHJpbmc+IGdldE90aGVyQXR0cmlidXRlcygpIHsKKyAgICAgICAgcmV0dXJuIG90aGVyQXR0cmlidXRlczsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL3N1bi9yZXNlYXJjaC93cy93YWRsL1Jlc291cmNlLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vcmVzZWFyY2gvd3Mvd2FkbC9SZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4OWUwYWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vcmVzZWFyY2gvd3Mvd2FkbC9SZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzM2IEBACisvLworLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMi43CisvLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4KKy8vIEFueSBtb2RpZmljYXRpb25zIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3QgdXBvbiByZWNvbXBpbGF0aW9uIG9mIHRoZSBzb3VyY2Ugc2NoZW1hLgorLy8gR2VuZXJhdGVkIG9uOiAyMDE0LjA4LjA2IGF0IDExOjU3OjMxIEFNIENFU1QKKy8vCisKKworcGFja2FnZSBjb20uc3VuLnJlc2VhcmNoLndzLndhZGw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQW55QXR0cmlidXRlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQW55RWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50czsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbElEOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxTY2hlbWFUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLkNvbGxhcHNlZFN0cmluZ0FkYXB0ZXI7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXI7CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworCisKKy8qKgorICogPHA+SmF2YSBjbGFzcyBmb3IgYW5vbnltb3VzIGNvbXBsZXggdHlwZS4KKyAqCisgKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgorICoKKyAqIDxwcmU+CisgKiAmbHQ7Y29tcGxleFR5cGU+CisgKiAgICZsdDtjb21wbGV4Q29udGVudD4KKyAqICAgICAmbHQ7cmVzdHJpY3Rpb24gYmFzZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfWFueVR5cGUiPgorICogICAgICAgJmx0O3NlcXVlbmNlPgorICogICAgICAgICAmbHQ7ZWxlbWVudCByZWY9IntodHRwOi8vd2FkbC5kZXYuamF2YS5uZXQvMjAwOS8wMn1kb2MiIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiLz4KKyAqICAgICAgICAgJmx0O2VsZW1lbnQgcmVmPSJ7aHR0cDovL3dhZGwuZGV2LmphdmEubmV0LzIwMDkvMDJ9cGFyYW0iIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiLz4KKyAqICAgICAgICAgJmx0O2Nob2ljZSBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIj4KKyAqICAgICAgICAgICAmbHQ7ZWxlbWVudCByZWY9IntodHRwOi8vd2FkbC5kZXYuamF2YS5uZXQvMjAwOS8wMn1tZXRob2QiLz4KKyAqICAgICAgICAgICAmbHQ7ZWxlbWVudCByZWY9IntodHRwOi8vd2FkbC5kZXYuamF2YS5uZXQvMjAwOS8wMn1yZXNvdXJjZSIvPgorICogICAgICAgICAmbHQ7L2Nob2ljZT4KKyAqICAgICAgICAgJmx0O2FueSBwcm9jZXNzQ29udGVudHM9J2xheCcgbmFtZXNwYWNlPScjI290aGVyJyBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIi8+CisgKiAgICAgICAmbHQ7L3NlcXVlbmNlPgorICogICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJpZCIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfUlEIiAvPgorICogICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ7aHR0cDovL3dhZGwuZGV2LmphdmEubmV0LzIwMDkvMDJ9cmVzb3VyY2VfdHlwZV9saXN0IiAvPgorICogICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJxdWVyeVR5cGUiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1zdHJpbmciIGRlZmF1bHQ9ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIgLz4KKyAqICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0icGF0aCIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfXN0cmluZyIgLz4KKyAqICAgICAgICZsdDthbnlBdHRyaWJ1dGUgcHJvY2Vzc0NvbnRlbnRzPSdsYXgnIG5hbWVzcGFjZT0nIyNvdGhlcicvPgorICogICAgICZsdDsvcmVzdHJpY3Rpb24+CisgKiAgICZsdDsvY29tcGxleENvbnRlbnQ+CisgKiAmbHQ7L2NvbXBsZXhUeXBlPgorICogPC9wcmU+CisgKgorICoKKyAqLworQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQorQFhtbFR5cGUobmFtZSA9ICIiLCBwcm9wT3JkZXIgPSB7CisgICAgICAgICJkb2MiLAorICAgICAgICAicGFyYW0iLAorICAgICAgICAibWV0aG9kT3JSZXNvdXJjZSIsCisgICAgICAgICJhbnkiCit9KQorQFhtbFJvb3RFbGVtZW50KG5hbWUgPSAicmVzb3VyY2UiKQorcHVibGljIGNsYXNzIFJlc291cmNlIHsKKworICAgIHByb3RlY3RlZCBMaXN0PERvYz4gZG9jOworICAgIHByb3RlY3RlZCBMaXN0PFBhcmFtPiBwYXJhbTsKKyAgICBAWG1sRWxlbWVudHMoeworICAgICAgICAgICAgQFhtbEVsZW1lbnQobmFtZSA9ICJtZXRob2QiLCB0eXBlID0gTWV0aG9kLmNsYXNzKSwKKyAgICAgICAgICAgIEBYbWxFbGVtZW50KG5hbWUgPSAicmVzb3VyY2UiLCB0eXBlID0gUmVzb3VyY2UuY2xhc3MpCisgICAgfSkKKyAgICBwcm90ZWN0ZWQgTGlzdDxPYmplY3Q+IG1ldGhvZE9yUmVzb3VyY2U7CisgICAgQFhtbEFueUVsZW1lbnQobGF4ID0gdHJ1ZSkKKyAgICBwcm90ZWN0ZWQgTGlzdDxPYmplY3Q+IGFueTsKKyAgICBAWG1sQXR0cmlidXRlKG5hbWUgPSAiaWQiKQorICAgIEBYbWxKYXZhVHlwZUFkYXB0ZXIoQ29sbGFwc2VkU3RyaW5nQWRhcHRlci5jbGFzcykKKyAgICBAWG1sSUQKKyAgICBAWG1sU2NoZW1hVHlwZShuYW1lID0gIklEIikKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGlkOworICAgIEBYbWxBdHRyaWJ1dGUobmFtZSA9ICJ0eXBlIikKKyAgICBwcm90ZWN0ZWQgTGlzdDxTdHJpbmc+IHR5cGU7CisgICAgQFhtbEF0dHJpYnV0ZShuYW1lID0gInF1ZXJ5VHlwZSIpCisgICAgcHJvdGVjdGVkIFN0cmluZyBxdWVyeVR5cGU7CisgICAgQFhtbEF0dHJpYnV0ZShuYW1lID0gInBhdGgiKQorICAgIHByb3RlY3RlZCBTdHJpbmcgcGF0aDsKKyAgICBAWG1sQW55QXR0cmlidXRlCisgICAgcHJpdmF0ZSBNYXA8UU5hbWUsIFN0cmluZz4gb3RoZXJBdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXA8UU5hbWUsIFN0cmluZz4oKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBkb2MgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsCisgICAgICogbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkgbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZQorICAgICAqIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuCisgICAgICogVGhpcyBpcyB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBkb2MgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6CisgICAgICogPHByZT4KKyAgICAgKiAgICBnZXREb2MoKS5hZGQobmV3SXRlbSk7CisgICAgICogPC9wcmU+CisgICAgICoKKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0CisgICAgICoge0BsaW5rIERvYyB9CisgICAgICoKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PERvYz4gZ2V0RG9jKCkgeworICAgICAgICBpZiAoZG9jID09IG51bGwpIHsKKyAgICAgICAgICAgIGRvYyA9IG5ldyBBcnJheUxpc3Q8RG9jPigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLmRvYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcGFyYW0gcHJvcGVydHkuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsCisgICAgICogbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkgbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZQorICAgICAqIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuCisgICAgICogVGhpcyBpcyB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBwYXJhbSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKKyAgICAgKiA8cHJlPgorICAgICAqICAgIGdldFBhcmFtKCkuYWRkKG5ld0l0ZW0pOworICAgICAqIDwvcHJlPgorICAgICAqCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdAorICAgICAqIHtAbGluayBQYXJhbSB9CisgICAgICoKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFBhcmFtPiBnZXRQYXJhbSgpIHsKKyAgICAgICAgaWYgKHBhcmFtID09IG51bGwpIHsKKyAgICAgICAgICAgIHBhcmFtID0gbmV3IEFycmF5TGlzdDxQYXJhbT4oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpcy5wYXJhbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbWV0aG9kT3JSZXNvdXJjZSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwKKyAgICAgKiBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueSBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlCisgICAgICogcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4KKyAgICAgKiBUaGlzIGlzIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIG1ldGhvZE9yUmVzb3VyY2UgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6CisgICAgICogPHByZT4KKyAgICAgKiAgICBnZXRNZXRob2RPclJlc291cmNlKCkuYWRkKG5ld0l0ZW0pOworICAgICAqIDwvcHJlPgorICAgICAqCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdAorICAgICAqIHtAbGluayBNZXRob2QgfQorICAgICAqIHtAbGluayBSZXNvdXJjZSB9CisgICAgICoKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PE9iamVjdD4gZ2V0TWV0aG9kT3JSZXNvdXJjZSgpIHsKKyAgICAgICAgaWYgKG1ldGhvZE9yUmVzb3VyY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgbWV0aG9kT3JSZXNvdXJjZSA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLm1ldGhvZE9yUmVzb3VyY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGFueSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwKKyAgICAgKiBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueSBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlCisgICAgICogcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4KKyAgICAgKiBUaGlzIGlzIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIGFueSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKKyAgICAgKiA8cHJlPgorICAgICAqICAgIGdldEFueSgpLmFkZChuZXdJdGVtKTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKgorICAgICAqCisgICAgICogPHA+CisgICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3QKKyAgICAgKiB7QGxpbmsgT2JqZWN0IH0KKyAgICAgKiB7QGxpbmsgRWxlbWVudCB9CisgICAgICoKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PE9iamVjdD4gZ2V0QW55KCkgeworICAgICAgICBpZiAoYW55ID09IG51bGwpIHsKKyAgICAgICAgICAgIGFueSA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLmFueTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgIHBvc3NpYmxlIG9iamVjdCBpcworICAgICAqICAgICB7QGxpbmsgU3RyaW5nIH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiBpZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiAgICAgYWxsb3dlZCBvYmplY3QgaXMKKyAgICAgKiAgICAge0BsaW5rIFN0cmluZyB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgdGhpcy5pZCA9IHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSB0eXBlIHByb3BlcnR5LgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LAorICAgICAqIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55IG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUKKyAgICAgKiByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LgorICAgICAqIFRoaXMgaXMgd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgdHlwZSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKKyAgICAgKiA8cHJlPgorICAgICAqICAgIGdldFR5cGUoKS5hZGQobmV3SXRlbSk7CisgICAgICogPC9wcmU+CisgICAgICoKKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0CisgICAgICoge0BsaW5rIFN0cmluZyB9CisgICAgICoKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0VHlwZSgpIHsKKyAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdHlwZSA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLnR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHF1ZXJ5VHlwZSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgcG9zc2libGUgb2JqZWN0IGlzCisgICAgICogICAgIHtAbGluayBTdHJpbmcgfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRRdWVyeVR5cGUoKSB7CisgICAgICAgIGlmIChxdWVyeVR5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5VHlwZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBxdWVyeVR5cGUgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiAgICAgYWxsb3dlZCBvYmplY3QgaXMKKyAgICAgKiAgICAge0BsaW5rIFN0cmluZyB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRRdWVyeVR5cGUoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHRoaXMucXVlcnlUeXBlID0gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIHBhdGggcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgIHBvc3NpYmxlIG9iamVjdCBpcworICAgICAqICAgICB7QGxpbmsgU3RyaW5nIH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIHBhdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIHBhdGggcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiAgICAgYWxsb3dlZCBvYmplY3QgaXMKKyAgICAgKiAgICAge0BsaW5rIFN0cmluZyB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXRoKFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0aGlzLnBhdGggPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGEgbWFwIHRoYXQgY29udGFpbnMgYXR0cmlidXRlcyB0aGF0IGFyZW4ndCBib3VuZCB0byBhbnkgdHlwZWQgcHJvcGVydHkgb24gdGhpcyBjbGFzcy4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIHRoZSBtYXAgaXMga2V5ZWQgYnkgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBhbmQKKyAgICAgKiB0aGUgdmFsdWUgaXMgdGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlLgorICAgICAqCisgICAgICogdGhlIG1hcCByZXR1cm5lZCBieSB0aGlzIG1ldGhvZCBpcyBsaXZlLCBhbmQgeW91IGNhbiBhZGQgbmV3IGF0dHJpYnV0ZQorICAgICAqIGJ5IHVwZGF0aW5nIHRoZSBtYXAgZGlyZWN0bHkuIEJlY2F1c2Ugb2YgdGhpcyBkZXNpZ24sIHRoZXJlJ3Mgbm8gc2V0dGVyLgorICAgICAqCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgIGFsd2F5cyBub24tbnVsbAorICAgICAqLworICAgIHB1YmxpYyBNYXA8UU5hbWUsIFN0cmluZz4gZ2V0T3RoZXJBdHRyaWJ1dGVzKCkgeworICAgICAgICByZXR1cm4gb3RoZXJBdHRyaWJ1dGVzOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vc3VuL3Jlc2VhcmNoL3dzL3dhZGwvUmVzb3VyY2VUeXBlLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vcmVzZWFyY2gvd3Mvd2FkbC9SZXNvdXJjZVR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGQwZTk5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vc3VuL3Jlc2VhcmNoL3dzL3dhZGwvUmVzb3VyY2VUeXBlLmphdmEKQEAgLTAsMCArMSwyNDYgQEAKKy8vCisvLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4yLjcKKy8vIFNlZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiIj5odHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiPC9hPgorLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuCisvLyBHZW5lcmF0ZWQgb246IDIwMTQuMDguMDYgYXQgMTE6NTc6MzEgQU0gQ0VTVAorLy8KKworCitwYWNrYWdlIGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBbnlBdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBbnlFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnRzOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sSUQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNjaGVtYVR5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuQ29sbGFwc2VkU3RyaW5nQWRhcHRlcjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLmFkYXB0ZXJzLlhtbEphdmFUeXBlQWRhcHRlcjsKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IG9yZy53M2MuZG9tLkVsZW1lbnQ7CisKKworLyoqCisgKiA8cD5KYXZhIGNsYXNzIGZvciBhbm9ueW1vdXMgY29tcGxleCB0eXBlLgorICoKKyAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCisgKgorICogPHByZT4KKyAqICZsdDtjb21wbGV4VHlwZT4KKyAqICAgJmx0O2NvbXBsZXhDb250ZW50PgorICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+CisgKiAgICAgICAmbHQ7c2VxdWVuY2U+CisgKiAgICAgICAgICZsdDtlbGVtZW50IHJlZj0ie2h0dHA6Ly93YWRsLmRldi5qYXZhLm5ldC8yMDA5LzAyfWRvYyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIvPgorICogICAgICAgICAmbHQ7ZWxlbWVudCByZWY9IntodHRwOi8vd2FkbC5kZXYuamF2YS5uZXQvMjAwOS8wMn1wYXJhbSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIvPgorICogICAgICAgICAmbHQ7Y2hvaWNlIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiPgorICogICAgICAgICAgICZsdDtlbGVtZW50IHJlZj0ie2h0dHA6Ly93YWRsLmRldi5qYXZhLm5ldC8yMDA5LzAyfW1ldGhvZCIvPgorICogICAgICAgICAgICZsdDtlbGVtZW50IHJlZj0ie2h0dHA6Ly93YWRsLmRldi5qYXZhLm5ldC8yMDA5LzAyfXJlc291cmNlIi8+CisgKiAgICAgICAgICZsdDsvY2hvaWNlPgorICogICAgICAgICAmbHQ7YW55IHByb2Nlc3NDb250ZW50cz0nbGF4JyBuYW1lc3BhY2U9JyMjb3RoZXInIG1heE9jY3Vycz0idW5ib3VuZGVkIiBtaW5PY2N1cnM9IjAiLz4KKyAqICAgICAgICZsdDsvc2VxdWVuY2U+CisgKiAgICAgICAmbHQ7YXR0cmlidXRlIG5hbWU9ImlkIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9SUQiIC8+CisgKiAgICAgICAmbHQ7YW55QXR0cmlidXRlIHByb2Nlc3NDb250ZW50cz0nbGF4JyBuYW1lc3BhY2U9JyMjb3RoZXInLz4KKyAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPgorICogICAmbHQ7L2NvbXBsZXhDb250ZW50PgorICogJmx0Oy9jb21wbGV4VHlwZT4KKyAqIDwvcHJlPgorICoKKyAqCisgKi8KK0BYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKK0BYbWxUeXBlKG5hbWUgPSAiIiwgcHJvcE9yZGVyID0geworICAgICAgICAiZG9jIiwKKyAgICAgICAgInBhcmFtIiwKKyAgICAgICAgIm1ldGhvZE9yUmVzb3VyY2UiLAorICAgICAgICAiYW55IgorfSkKK0BYbWxSb290RWxlbWVudChuYW1lID0gInJlc291cmNlX3R5cGUiKQorcHVibGljIGNsYXNzIFJlc291cmNlVHlwZSB7CisKKyAgICBwcm90ZWN0ZWQgTGlzdDxEb2M+IGRvYzsKKyAgICBwcm90ZWN0ZWQgTGlzdDxQYXJhbT4gcGFyYW07CisgICAgQFhtbEVsZW1lbnRzKHsKKyAgICAgICAgICAgIEBYbWxFbGVtZW50KG5hbWUgPSAibWV0aG9kIiwgdHlwZSA9IE1ldGhvZC5jbGFzcyksCisgICAgICAgICAgICBAWG1sRWxlbWVudChuYW1lID0gInJlc291cmNlIiwgdHlwZSA9IFJlc291cmNlLmNsYXNzKQorICAgIH0pCisgICAgcHJvdGVjdGVkIExpc3Q8T2JqZWN0PiBtZXRob2RPclJlc291cmNlOworICAgIEBYbWxBbnlFbGVtZW50KGxheCA9IHRydWUpCisgICAgcHJvdGVjdGVkIExpc3Q8T2JqZWN0PiBhbnk7CisgICAgQFhtbEF0dHJpYnV0ZShuYW1lID0gImlkIikKKyAgICBAWG1sSmF2YVR5cGVBZGFwdGVyKENvbGxhcHNlZFN0cmluZ0FkYXB0ZXIuY2xhc3MpCisgICAgQFhtbElECisgICAgQFhtbFNjaGVtYVR5cGUobmFtZSA9ICJJRCIpCisgICAgcHJvdGVjdGVkIFN0cmluZyBpZDsKKyAgICBAWG1sQW55QXR0cmlidXRlCisgICAgcHJpdmF0ZSBNYXA8UU5hbWUsIFN0cmluZz4gb3RoZXJBdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXA8UU5hbWUsIFN0cmluZz4oKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBkb2MgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsCisgICAgICogbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkgbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZQorICAgICAqIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuCisgICAgICogVGhpcyBpcyB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBkb2MgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6CisgICAgICogPHByZT4KKyAgICAgKiAgICBnZXREb2MoKS5hZGQobmV3SXRlbSk7CisgICAgICogPC9wcmU+CisgICAgICoKKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0CisgICAgICoge0BsaW5rIERvYyB9CisgICAgICoKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PERvYz4gZ2V0RG9jKCkgeworICAgICAgICBpZiAoZG9jID09IG51bGwpIHsKKyAgICAgICAgICAgIGRvYyA9IG5ldyBBcnJheUxpc3Q8RG9jPigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLmRvYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcGFyYW0gcHJvcGVydHkuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsCisgICAgICogbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkgbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZQorICAgICAqIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuCisgICAgICogVGhpcyBpcyB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBwYXJhbSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKKyAgICAgKiA8cHJlPgorICAgICAqICAgIGdldFBhcmFtKCkuYWRkKG5ld0l0ZW0pOworICAgICAqIDwvcHJlPgorICAgICAqCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdAorICAgICAqIHtAbGluayBQYXJhbSB9CisgICAgICoKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFBhcmFtPiBnZXRQYXJhbSgpIHsKKyAgICAgICAgaWYgKHBhcmFtID09IG51bGwpIHsKKyAgICAgICAgICAgIHBhcmFtID0gbmV3IEFycmF5TGlzdDxQYXJhbT4oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpcy5wYXJhbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbWV0aG9kT3JSZXNvdXJjZSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwKKyAgICAgKiBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueSBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlCisgICAgICogcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4KKyAgICAgKiBUaGlzIGlzIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIG1ldGhvZE9yUmVzb3VyY2UgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6CisgICAgICogPHByZT4KKyAgICAgKiAgICBnZXRNZXRob2RPclJlc291cmNlKCkuYWRkKG5ld0l0ZW0pOworICAgICAqIDwvcHJlPgorICAgICAqCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdAorICAgICAqIHtAbGluayBNZXRob2QgfQorICAgICAqIHtAbGluayBSZXNvdXJjZSB9CisgICAgICoKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PE9iamVjdD4gZ2V0TWV0aG9kT3JSZXNvdXJjZSgpIHsKKyAgICAgICAgaWYgKG1ldGhvZE9yUmVzb3VyY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgbWV0aG9kT3JSZXNvdXJjZSA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLm1ldGhvZE9yUmVzb3VyY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGFueSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwKKyAgICAgKiBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueSBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlCisgICAgICogcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4KKyAgICAgKiBUaGlzIGlzIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIGFueSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKKyAgICAgKiA8cHJlPgorICAgICAqICAgIGdldEFueSgpLmFkZChuZXdJdGVtKTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKgorICAgICAqCisgICAgICogPHA+CisgICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3QKKyAgICAgKiB7QGxpbmsgT2JqZWN0IH0KKyAgICAgKiB7QGxpbmsgRWxlbWVudCB9CisgICAgICoKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PE9iamVjdD4gZ2V0QW55KCkgeworICAgICAgICBpZiAoYW55ID09IG51bGwpIHsKKyAgICAgICAgICAgIGFueSA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLmFueTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgIHBvc3NpYmxlIG9iamVjdCBpcworICAgICAqICAgICB7QGxpbmsgU3RyaW5nIH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiBpZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgaWQgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiAgICAgYWxsb3dlZCBvYmplY3QgaXMKKyAgICAgKiAgICAge0BsaW5rIFN0cmluZyB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgdGhpcy5pZCA9IHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgYSBtYXAgdGhhdCBjb250YWlucyBhdHRyaWJ1dGVzIHRoYXQgYXJlbid0IGJvdW5kIHRvIGFueSB0eXBlZCBwcm9wZXJ0eSBvbiB0aGlzIGNsYXNzLgorICAgICAqCisgICAgICogPHA+CisgICAgICogdGhlIG1hcCBpcyBrZXllZCBieSB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIGFuZAorICAgICAqIHRoZSB2YWx1ZSBpcyB0aGUgc3RyaW5nIHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuCisgICAgICoKKyAgICAgKiB0aGUgbWFwIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kIGlzIGxpdmUsIGFuZCB5b3UgY2FuIGFkZCBuZXcgYXR0cmlidXRlCisgICAgICogYnkgdXBkYXRpbmcgdGhlIG1hcCBkaXJlY3RseS4gQmVjYXVzZSBvZiB0aGlzIGRlc2lnbiwgdGhlcmUncyBubyBzZXR0ZXIuCisgICAgICoKKyAgICAgKgorICAgICAqIEByZXR1cm4KKyAgICAgKiAgICAgYWx3YXlzIG5vbi1udWxsCisgICAgICovCisgICAgcHVibGljIE1hcDxRTmFtZSwgU3RyaW5nPiBnZXRPdGhlckF0dHJpYnV0ZXMoKSB7CisgICAgICAgIHJldHVybiBvdGhlckF0dHJpYnV0ZXM7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vcmVzZWFyY2gvd3Mvd2FkbC9SZXNvdXJjZXMuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL3N1bi9yZXNlYXJjaC93cy93YWRsL1Jlc291cmNlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMjU3OWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vcmVzZWFyY2gvd3Mvd2FkbC9SZXNvdXJjZXMuamF2YQpAQCAtMCwwICsxLDIwMSBAQAorLy8KKy8vIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHRoZSBKYXZhVE0gQXJjaGl0ZWN0dXJlIGZvciBYTUwgQmluZGluZyhKQVhCKSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24sIHYyLjIuNworLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+CisvLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4KKy8vIEdlbmVyYXRlZCBvbjogMjAxNC4wOC4wNiBhdCAxMTo1NzozMSBBTSBDRVNUCisvLworCitwYWNrYWdlIGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFueUF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFueUVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxTY2hlbWFUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworCitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKKworLyoqCisgKiA8cD5KYXZhIGNsYXNzIGZvciBhbm9ueW1vdXMgY29tcGxleCB0eXBlLgorICoKKyAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCisgKgorICogPHByZT4KKyAqICZsdDtjb21wbGV4VHlwZT4KKyAqICAgJmx0O2NvbXBsZXhDb250ZW50PgorICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+CisgKiAgICAgICAmbHQ7c2VxdWVuY2U+CisgKiAgICAgICAgICZsdDtlbGVtZW50IHJlZj0ie2h0dHA6Ly93YWRsLmRldi5qYXZhLm5ldC8yMDA5LzAyfWRvYyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIvPgorICogICAgICAgICAmbHQ7ZWxlbWVudCByZWY9IntodHRwOi8vd2FkbC5kZXYuamF2YS5uZXQvMjAwOS8wMn1yZXNvdXJjZSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAqICAgICAgICAgJmx0O2FueSBwcm9jZXNzQ29udGVudHM9J2xheCcgbmFtZXNwYWNlPScjI290aGVyJyBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIi8+CisgKiAgICAgICAmbHQ7L3NlcXVlbmNlPgorICogICAgICAgJmx0O2F0dHJpYnV0ZSBuYW1lPSJiYXNlIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VVJJIiAvPgorICogICAgICAgJmx0O2FueUF0dHJpYnV0ZSBwcm9jZXNzQ29udGVudHM9J2xheCcgbmFtZXNwYWNlPScjI290aGVyJy8+CisgKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KKyAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4KKyAqICZsdDsvY29tcGxleFR5cGU+CisgKiA8L3ByZT4KKyAqCisgKgorICovCitAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCitAWG1sVHlwZShuYW1lID0gIiIsIHByb3BPcmRlciA9IHsKKyAgICAgICAgImRvYyIsCisgICAgICAgICJyZXNvdXJjZSIsCisgICAgICAgICJhbnkiCit9KQorQFhtbFJvb3RFbGVtZW50KG5hbWUgPSAicmVzb3VyY2VzIikKK3B1YmxpYyBjbGFzcyBSZXNvdXJjZXMgeworCisgICAgcHJvdGVjdGVkIExpc3Q8RG9jPiBkb2M7CisgICAgQFhtbEVsZW1lbnQocmVxdWlyZWQgPSB0cnVlKQorICAgIHByb3RlY3RlZCBMaXN0PFJlc291cmNlPiByZXNvdXJjZTsKKyAgICBAWG1sQW55RWxlbWVudChsYXggPSB0cnVlKQorICAgIHByb3RlY3RlZCBMaXN0PE9iamVjdD4gYW55OworICAgIEBYbWxBdHRyaWJ1dGUobmFtZSA9ICJiYXNlIikKKyAgICBAWG1sU2NoZW1hVHlwZShuYW1lID0gImFueVVSSSIpCisgICAgcHJvdGVjdGVkIFN0cmluZyBiYXNlOworICAgIEBYbWxBbnlBdHRyaWJ1dGUKKyAgICBwcml2YXRlIE1hcDxRTmFtZSwgU3RyaW5nPiBvdGhlckF0dHJpYnV0ZXMgPSBuZXcgSGFzaE1hcDxRTmFtZSwgU3RyaW5nPigpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGRvYyBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwKKyAgICAgKiBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueSBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlCisgICAgICogcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4KKyAgICAgKiBUaGlzIGlzIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIGRvYyBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKKyAgICAgKiA8cHJlPgorICAgICAqICAgIGdldERvYygpLmFkZChuZXdJdGVtKTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKgorICAgICAqCisgICAgICogPHA+CisgICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3QKKyAgICAgKiB7QGxpbmsgRG9jIH0KKyAgICAgKgorICAgICAqCisgICAgICovCisgICAgcHVibGljIExpc3Q8RG9jPiBnZXREb2MoKSB7CisgICAgICAgIGlmIChkb2MgPT0gbnVsbCkgeworICAgICAgICAgICAgZG9jID0gbmV3IEFycmF5TGlzdDxEb2M+KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMuZG9jOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSByZXNvdXJjZSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwKKyAgICAgKiBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueSBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlCisgICAgICogcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4KKyAgICAgKiBUaGlzIGlzIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIHJlc291cmNlIHByb3BlcnR5LgorICAgICAqCisgICAgICogPHA+CisgICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgorICAgICAqIDxwcmU+CisgICAgICogICAgZ2V0UmVzb3VyY2UoKS5hZGQobmV3SXRlbSk7CisgICAgICogPC9wcmU+CisgICAgICoKKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0CisgICAgICoge0BsaW5rIFJlc291cmNlIH0KKyAgICAgKgorICAgICAqCisgICAgICovCisgICAgcHVibGljIExpc3Q8UmVzb3VyY2U+IGdldFJlc291cmNlKCkgeworICAgICAgICBpZiAocmVzb3VyY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgcmVzb3VyY2UgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLnJlc291cmNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBhbnkgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsCisgICAgICogbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkgbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZQorICAgICAqIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuCisgICAgICogVGhpcyBpcyB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBhbnkgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6CisgICAgICogPHByZT4KKyAgICAgKiAgICBnZXRBbnkoKS5hZGQobmV3SXRlbSk7CisgICAgICogPC9wcmU+CisgICAgICoKKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0CisgICAgICoge0BsaW5rIE9iamVjdCB9CisgICAgICoge0BsaW5rIEVsZW1lbnQgfQorICAgICAqCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxPYmplY3Q+IGdldEFueSgpIHsKKyAgICAgICAgaWYgKGFueSA9PSBudWxsKSB7CisgICAgICAgICAgICBhbnkgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpcy5hbnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGJhc2UgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgIHBvc3NpYmxlIG9iamVjdCBpcworICAgICAqICAgICB7QGxpbmsgU3RyaW5nIH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmFzZSgpIHsKKyAgICAgICAgcmV0dXJuIGJhc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGJhc2UgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiAgICAgYWxsb3dlZCBvYmplY3QgaXMKKyAgICAgKiAgICAge0BsaW5rIFN0cmluZyB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCYXNlKFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0aGlzLmJhc2UgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGEgbWFwIHRoYXQgY29udGFpbnMgYXR0cmlidXRlcyB0aGF0IGFyZW4ndCBib3VuZCB0byBhbnkgdHlwZWQgcHJvcGVydHkgb24gdGhpcyBjbGFzcy4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIHRoZSBtYXAgaXMga2V5ZWQgYnkgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBhbmQKKyAgICAgKiB0aGUgdmFsdWUgaXMgdGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlLgorICAgICAqCisgICAgICogdGhlIG1hcCByZXR1cm5lZCBieSB0aGlzIG1ldGhvZCBpcyBsaXZlLCBhbmQgeW91IGNhbiBhZGQgbmV3IGF0dHJpYnV0ZQorICAgICAqIGJ5IHVwZGF0aW5nIHRoZSBtYXAgZGlyZWN0bHkuIEJlY2F1c2Ugb2YgdGhpcyBkZXNpZ24sIHRoZXJlJ3Mgbm8gc2V0dGVyLgorICAgICAqCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgIGFsd2F5cyBub24tbnVsbAorICAgICAqLworICAgIHB1YmxpYyBNYXA8UU5hbWUsIFN0cmluZz4gZ2V0T3RoZXJBdHRyaWJ1dGVzKCkgeworICAgICAgICByZXR1cm4gb3RoZXJBdHRyaWJ1dGVzOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vc3VuL3Jlc2VhcmNoL3dzL3dhZGwvUmVzcG9uc2UuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL3N1bi9yZXNlYXJjaC93cy93YWRsL1Jlc3BvbnNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE1MGQ3NQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL3N1bi9yZXNlYXJjaC93cy93YWRsL1Jlc3BvbnNlLmphdmEKQEAgLTAsMCArMSwyMzQgQEAKKy8vCisvLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2Mi4yLjcKKy8vIFNlZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiIj5odHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiPC9hPgorLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuCisvLyBHZW5lcmF0ZWQgb246IDIwMTQuMDguMDYgYXQgMTE6NTc6MzEgQU0gQ0VTVAorLy8KKworCitwYWNrYWdlIGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBbnlBdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBbnlFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKKworCisvKioKKyAqIDxwPkphdmEgY2xhc3MgZm9yIGFub255bW91cyBjb21wbGV4IHR5cGUuCisgKgorICogPHA+VGhlIGZvbGxvd2luZyBzY2hlbWEgZnJhZ21lbnQgc3BlY2lmaWVzIHRoZSBleHBlY3RlZCBjb250ZW50IGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBjbGFzcy4KKyAqCisgKiA8cHJlPgorICogJmx0O2NvbXBsZXhUeXBlPgorICogICAmbHQ7Y29tcGxleENvbnRlbnQ+CisgKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4KKyAqICAgICAgICZsdDtzZXF1ZW5jZT4KKyAqICAgICAgICAgJmx0O2VsZW1lbnQgcmVmPSJ7aHR0cDovL3dhZGwuZGV2LmphdmEubmV0LzIwMDkvMDJ9ZG9jIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIi8+CisgKiAgICAgICAgICZsdDtlbGVtZW50IHJlZj0ie2h0dHA6Ly93YWRsLmRldi5qYXZhLm5ldC8yMDA5LzAyfXBhcmFtIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIi8+CisgKiAgICAgICAgICZsdDtlbGVtZW50IHJlZj0ie2h0dHA6Ly93YWRsLmRldi5qYXZhLm5ldC8yMDA5LzAyfXJlcHJlc2VudGF0aW9uIiBtYXhPY2N1cnM9InVuYm91bmRlZCIgbWluT2NjdXJzPSIwIi8+CisgKiAgICAgICAgICZsdDthbnkgcHJvY2Vzc0NvbnRlbnRzPSdsYXgnIG5hbWVzcGFjZT0nIyNvdGhlcicgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIvPgorICogICAgICAgJmx0Oy9zZXF1ZW5jZT4KKyAqICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0ic3RhdHVzIiB0eXBlPSJ7aHR0cDovL3dhZGwuZGV2LmphdmEubmV0LzIwMDkvMDJ9c3RhdHVzQ29kZUxpc3QiIC8+CisgKiAgICAgICAmbHQ7YW55QXR0cmlidXRlIHByb2Nlc3NDb250ZW50cz0nbGF4JyBuYW1lc3BhY2U9JyMjb3RoZXInLz4KKyAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPgorICogICAmbHQ7L2NvbXBsZXhDb250ZW50PgorICogJmx0Oy9jb21wbGV4VHlwZT4KKyAqIDwvcHJlPgorICoKKyAqCisgKi8KK0BYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKK0BYbWxUeXBlKG5hbWUgPSAiIiwgcHJvcE9yZGVyID0geworICAgICAgICAiZG9jIiwKKyAgICAgICAgInBhcmFtIiwKKyAgICAgICAgInJlcHJlc2VudGF0aW9uIiwKKyAgICAgICAgImFueSIKK30pCitAWG1sUm9vdEVsZW1lbnQobmFtZSA9ICJyZXNwb25zZSIpCitwdWJsaWMgY2xhc3MgUmVzcG9uc2UgeworCisgICAgcHJvdGVjdGVkIExpc3Q8RG9jPiBkb2M7CisgICAgcHJvdGVjdGVkIExpc3Q8UGFyYW0+IHBhcmFtOworICAgIHByb3RlY3RlZCBMaXN0PFJlcHJlc2VudGF0aW9uPiByZXByZXNlbnRhdGlvbjsKKyAgICBAWG1sQW55RWxlbWVudChsYXggPSB0cnVlKQorICAgIHByb3RlY3RlZCBMaXN0PE9iamVjdD4gYW55OworICAgIEBYbWxBdHRyaWJ1dGUobmFtZSA9ICJzdGF0dXMiKQorICAgIHByb3RlY3RlZCBMaXN0PExvbmc+IHN0YXR1czsKKyAgICBAWG1sQW55QXR0cmlidXRlCisgICAgcHJpdmF0ZSBNYXA8UU5hbWUsIFN0cmluZz4gb3RoZXJBdHRyaWJ1dGVzID0gbmV3IEhhc2hNYXA8UU5hbWUsIFN0cmluZz4oKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBkb2MgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsCisgICAgICogbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkgbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZQorICAgICAqIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuCisgICAgICogVGhpcyBpcyB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBkb2MgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6CisgICAgICogPHByZT4KKyAgICAgKiAgICBnZXREb2MoKS5hZGQobmV3SXRlbSk7CisgICAgICogPC9wcmU+CisgICAgICoKKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0CisgICAgICoge0BsaW5rIERvYyB9CisgICAgICoKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PERvYz4gZ2V0RG9jKCkgeworICAgICAgICBpZiAoZG9jID09IG51bGwpIHsKKyAgICAgICAgICAgIGRvYyA9IG5ldyBBcnJheUxpc3Q8RG9jPigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLmRvYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcGFyYW0gcHJvcGVydHkuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsCisgICAgICogbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkgbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZQorICAgICAqIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuCisgICAgICogVGhpcyBpcyB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBwYXJhbSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKKyAgICAgKiA8cHJlPgorICAgICAqICAgIGdldFBhcmFtKCkuYWRkKG5ld0l0ZW0pOworICAgICAqIDwvcHJlPgorICAgICAqCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdAorICAgICAqIHtAbGluayBQYXJhbSB9CisgICAgICoKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFBhcmFtPiBnZXRQYXJhbSgpIHsKKyAgICAgICAgaWYgKHBhcmFtID09IG51bGwpIHsKKyAgICAgICAgICAgIHBhcmFtID0gbmV3IEFycmF5TGlzdDxQYXJhbT4oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpcy5wYXJhbTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgcmVwcmVzZW50YXRpb24gcHJvcGVydHkuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsCisgICAgICogbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkgbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZQorICAgICAqIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuCisgICAgICogVGhpcyBpcyB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSByZXByZXNlbnRhdGlvbiBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKKyAgICAgKiA8cHJlPgorICAgICAqICAgIGdldFJlcHJlc2VudGF0aW9uKCkuYWRkKG5ld0l0ZW0pOworICAgICAqIDwvcHJlPgorICAgICAqCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdAorICAgICAqIHtAbGluayBSZXByZXNlbnRhdGlvbiB9CisgICAgICoKKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFJlcHJlc2VudGF0aW9uPiBnZXRSZXByZXNlbnRhdGlvbigpIHsKKyAgICAgICAgaWYgKHJlcHJlc2VudGF0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlcHJlc2VudGF0aW9uID0gbmV3IEFycmF5TGlzdDxSZXByZXNlbnRhdGlvbj4oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpcy5yZXByZXNlbnRhdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgYW55IHByb3BlcnR5LgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhpcyBhY2Nlc3NvciBtZXRob2QgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgbGl2ZSBsaXN0LAorICAgICAqIG5vdCBhIHNuYXBzaG90LiBUaGVyZWZvcmUgYW55IG1vZGlmaWNhdGlvbiB5b3UgbWFrZSB0byB0aGUKKyAgICAgKiByZXR1cm5lZCBsaXN0IHdpbGwgYmUgcHJlc2VudCBpbnNpZGUgdGhlIEpBWEIgb2JqZWN0LgorICAgICAqIFRoaXMgaXMgd2h5IHRoZXJlIGlzIG5vdCBhIDxDT0RFPnNldDwvQ09ERT4gbWV0aG9kIGZvciB0aGUgYW55IHByb3BlcnR5LgorICAgICAqCisgICAgICogPHA+CisgICAgICogRm9yIGV4YW1wbGUsIHRvIGFkZCBhIG5ldyBpdGVtLCBkbyBhcyBmb2xsb3dzOgorICAgICAqIDxwcmU+CisgICAgICogICAgZ2V0QW55KCkuYWRkKG5ld0l0ZW0pOworICAgICAqIDwvcHJlPgorICAgICAqCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBPYmplY3RzIG9mIHRoZSBmb2xsb3dpbmcgdHlwZShzKSBhcmUgYWxsb3dlZCBpbiB0aGUgbGlzdAorICAgICAqIHtAbGluayBPYmplY3QgfQorICAgICAqIHtAbGluayBFbGVtZW50IH0KKyAgICAgKgorICAgICAqCisgICAgICovCisgICAgcHVibGljIExpc3Q8T2JqZWN0PiBnZXRBbnkoKSB7CisgICAgICAgIGlmIChhbnkgPT0gbnVsbCkgeworICAgICAgICAgICAgYW55ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMuYW55OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBzdGF0dXMgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsCisgICAgICogbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkgbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZQorICAgICAqIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuCisgICAgICogVGhpcyBpcyB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBzdGF0dXMgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6CisgICAgICogPHByZT4KKyAgICAgKiAgICBnZXRTdGF0dXMoKS5hZGQobmV3SXRlbSk7CisgICAgICogPC9wcmU+CisgICAgICoKKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIE9iamVjdHMgb2YgdGhlIGZvbGxvd2luZyB0eXBlKHMpIGFyZSBhbGxvd2VkIGluIHRoZSBsaXN0CisgICAgICoge0BsaW5rIExvbmcgfQorICAgICAqCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxMb25nPiBnZXRTdGF0dXMoKSB7CisgICAgICAgIGlmIChzdGF0dXMgPT0gbnVsbCkgeworICAgICAgICAgICAgc3RhdHVzID0gbmV3IEFycmF5TGlzdDxMb25nPigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLnN0YXR1czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGEgbWFwIHRoYXQgY29udGFpbnMgYXR0cmlidXRlcyB0aGF0IGFyZW4ndCBib3VuZCB0byBhbnkgdHlwZWQgcHJvcGVydHkgb24gdGhpcyBjbGFzcy4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIHRoZSBtYXAgaXMga2V5ZWQgYnkgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSBhbmQKKyAgICAgKiB0aGUgdmFsdWUgaXMgdGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgYXR0cmlidXRlLgorICAgICAqCisgICAgICogdGhlIG1hcCByZXR1cm5lZCBieSB0aGlzIG1ldGhvZCBpcyBsaXZlLCBhbmQgeW91IGNhbiBhZGQgbmV3IGF0dHJpYnV0ZQorICAgICAqIGJ5IHVwZGF0aW5nIHRoZSBtYXAgZGlyZWN0bHkuIEJlY2F1c2Ugb2YgdGhpcyBkZXNpZ24sIHRoZXJlJ3Mgbm8gc2V0dGVyLgorICAgICAqCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgIGFsd2F5cyBub24tbnVsbAorICAgICAqLworICAgIHB1YmxpYyBNYXA8UU5hbWUsIFN0cmluZz4gZ2V0T3RoZXJBdHRyaWJ1dGVzKCkgeworICAgICAgICByZXR1cm4gb3RoZXJBdHRyaWJ1dGVzOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vc3VuL3Jlc2VhcmNoL3dzL3dhZGwvcGFja2FnZS1pbmZvLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL2NvbS9zdW4vcmVzZWFyY2gvd3Mvd2FkbC9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjMyZjFmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vc3VuL3Jlc2VhcmNoL3dzL3dhZGwvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSw5IEBACisvLworLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdjIuMi43CisvLyBTZWUgPGEgaHJlZj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YiI+aHR0cDovL2phdmEuc3VuLmNvbS94bWwvamF4YjwvYT4KKy8vIEFueSBtb2RpZmljYXRpb25zIHRvIHRoaXMgZmlsZSB3aWxsIGJlIGxvc3QgdXBvbiByZWNvbXBpbGF0aW9uIG9mIHRoZSBzb3VyY2Ugc2NoZW1hLgorLy8gR2VuZXJhdGVkIG9uOiAyMDE0LjA4LjA2IGF0IDExOjU3OjMxIEFNIENFU1QKKy8vCisKK0BqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNjaGVtYShuYW1lc3BhY2UgPSAiaHR0cDovL3dhZGwuZGV2LmphdmEubmV0LzIwMDkvMDIiLCBlbGVtZW50Rm9ybURlZmF1bHQgPSBqYXZheC54bWwuYmluZAorICAgICAgICAuYW5ub3RhdGlvbi5YbWxOc0Zvcm0uUVVBTElGSUVEKSBwYWNrYWdlIGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbDsKZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvamVyc2V5L3JlcGFja2FnZWQvb3JnL29iamVjdHdlYi9hc20vQW5ub3RhdGlvblZpc2l0b3IuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvamVyc2V5L3JlcGFja2FnZWQvb3JnL29iamVjdHdlYi9hc20vQW5ub3RhdGlvblZpc2l0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2ExYzk3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9qZXJzZXkvcmVwYWNrYWdlZC9vcmcvb2JqZWN0d2ViL2FzbS9Bbm5vdGF0aW9uVmlzaXRvci5qYXZhCkBAIC0wLDAgKzEsMTY5IEBACisvKioqCisgKiBBU006IGEgdmVyeSBzbWFsbCBhbmQgZmFzdCBKYXZhIGJ5dGVjb2RlIG1hbmlwdWxhdGlvbiBmcmFtZXdvcmsKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDExIElOUklBLCBGcmFuY2UgVGVsZWNvbQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIGplcnNleS5yZXBhY2thZ2VkLm9yZy5vYmplY3R3ZWIuYXNtOworCisvKioKKyAqIEEgdmlzaXRvciB0byB2aXNpdCBhIEphdmEgYW5ub3RhdGlvbi4gVGhlIG1ldGhvZHMgb2YgdGhpcyBjbGFzcyBtdXN0IGJlCisgKiBjYWxsZWQgaW4gdGhlIGZvbGxvd2luZyBvcmRlcjogKCA8dHQ+dmlzaXQ8L3R0PiB8IDx0dD52aXNpdEVudW08L3R0PiB8CisgKiA8dHQ+dmlzaXRBbm5vdGF0aW9uPC90dD4gfCA8dHQ+dmlzaXRBcnJheTwvdHQ+ICkqIDx0dD52aXNpdEVuZDwvdHQ+LgorICoKKyAqIEBhdXRob3IgRXJpYyBCcnVuZXRvbgorICogQGF1dGhvciBFdWdlbmUgS3VsZXNob3YKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFubm90YXRpb25WaXNpdG9yIHsKKworICAgIC8qKgorICAgICAqIFRoZSBBU00gQVBJIHZlcnNpb24gaW1wbGVtZW50ZWQgYnkgdGhpcyB2aXNpdG9yLiBUaGUgdmFsdWUgb2YgdGhpcyBmaWVsZAorICAgICAqIG11c3QgYmUgb25lIG9mIHtAbGluayBPcGNvZGVzI0FTTTR9IG9yIHtAbGluayBPcGNvZGVzI0FTTTV9LgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCBpbnQgYXBpOworCisgICAgLyoqCisgICAgICogVGhlIGFubm90YXRpb24gdmlzaXRvciB0byB3aGljaCB0aGlzIHZpc2l0b3IgbXVzdCBkZWxlZ2F0ZSBtZXRob2QgY2FsbHMuCisgICAgICogTWF5IGJlIG51bGwuCisgICAgICovCisgICAgcHJvdGVjdGVkIEFubm90YXRpb25WaXNpdG9yIGF2OworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgQW5ub3RhdGlvblZpc2l0b3J9LgorICAgICAqCisgICAgICogQHBhcmFtIGFwaQorICAgICAqICAgICAgICAgICAgdGhlIEFTTSBBUEkgdmVyc2lvbiBpbXBsZW1lbnRlZCBieSB0aGlzIHZpc2l0b3IuIE11c3QgYmUgb25lCisgICAgICogICAgICAgICAgICBvZiB7QGxpbmsgT3Bjb2RlcyNBU000fSBvciB7QGxpbmsgT3Bjb2RlcyNBU001fS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQW5ub3RhdGlvblZpc2l0b3IoZmluYWwgaW50IGFwaSkgeworICAgICAgICB0aGlzKGFwaSwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgQW5ub3RhdGlvblZpc2l0b3J9LgorICAgICAqCisgICAgICogQHBhcmFtIGFwaQorICAgICAqICAgICAgICAgICAgdGhlIEFTTSBBUEkgdmVyc2lvbiBpbXBsZW1lbnRlZCBieSB0aGlzIHZpc2l0b3IuIE11c3QgYmUgb25lCisgICAgICogICAgICAgICAgICBvZiB7QGxpbmsgT3Bjb2RlcyNBU000fSBvciB7QGxpbmsgT3Bjb2RlcyNBU001fS4KKyAgICAgKiBAcGFyYW0gYXYKKyAgICAgKiAgICAgICAgICAgIHRoZSBhbm5vdGF0aW9uIHZpc2l0b3IgdG8gd2hpY2ggdGhpcyB2aXNpdG9yIG11c3QgZGVsZWdhdGUKKyAgICAgKiAgICAgICAgICAgIG1ldGhvZCBjYWxscy4gTWF5IGJlIG51bGwuCisgICAgICovCisgICAgcHVibGljIEFubm90YXRpb25WaXNpdG9yKGZpbmFsIGludCBhcGksIGZpbmFsIEFubm90YXRpb25WaXNpdG9yIGF2KSB7CisgICAgICAgIGlmIChhcGkgIT0gT3Bjb2Rlcy5BU000ICYmIGFwaSAhPSBPcGNvZGVzLkFTTTUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmFwaSA9IGFwaTsKKyAgICAgICAgdGhpcy5hdiA9IGF2OworICAgIH0KKworICAgIC8qKgorICAgICAqIFZpc2l0cyBhIHByaW1pdGl2ZSB2YWx1ZSBvZiB0aGUgYW5ub3RhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgbmFtZS4KKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBhY3R1YWwgdmFsdWUsIHdob3NlIHR5cGUgbXVzdCBiZSB7QGxpbmsgQnl0ZX0sCisgICAgICogICAgICAgICAgICB7QGxpbmsgQm9vbGVhbn0sIHtAbGluayBDaGFyYWN0ZXJ9LCB7QGxpbmsgU2hvcnR9LAorICAgICAqICAgICAgICAgICAge0BsaW5rIEludGVnZXJ9ICwge0BsaW5rIExvbmd9LCB7QGxpbmsgRmxvYXR9LCB7QGxpbmsgRG91YmxlfSwKKyAgICAgKiAgICAgICAgICAgIHtAbGluayBTdHJpbmd9IG9yIHtAbGluayBUeXBlfSBvciBPQkpFQ1Qgb3IgQVJSQVkgc29ydC4gVGhpcworICAgICAqICAgICAgICAgICAgdmFsdWUgY2FuIGFsc28gYmUgYW4gYXJyYXkgb2YgYnl0ZSwgYm9vbGVhbiwgc2hvcnQsIGNoYXIsIGludCwKKyAgICAgKiAgICAgICAgICAgIGxvbmcsIGZsb2F0IG9yIGRvdWJsZSB2YWx1ZXMgKHRoaXMgaXMgZXF1aXZhbGVudCB0byB1c2luZworICAgICAqICAgICAgICAgICAge0BsaW5rICN2aXNpdEFycmF5IHZpc2l0QXJyYXl9IGFuZCB2aXNpdGluZyBlYWNoIGFycmF5IGVsZW1lbnQKKyAgICAgKiAgICAgICAgICAgIGluIHR1cm4sIGJ1dCBpcyBtb3JlIGNvbnZlbmllbnQpLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZpc2l0KFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgaWYgKGF2ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGF2LnZpc2l0KG5hbWUsIHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFZpc2l0cyBhbiBlbnVtZXJhdGlvbiB2YWx1ZSBvZiB0aGUgYW5ub3RhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgbmFtZS4KKyAgICAgKiBAcGFyYW0gZGVzYworICAgICAqICAgICAgICAgICAgdGhlIGNsYXNzIGRlc2NyaXB0b3Igb2YgdGhlIGVudW1lcmF0aW9uIGNsYXNzLgorICAgICAqIEBwYXJhbSB2YWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIGFjdHVhbCBlbnVtZXJhdGlvbiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB2aXNpdEVudW0oU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgaWYgKGF2ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGF2LnZpc2l0RW51bShuYW1lLCBkZXNjLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWaXNpdHMgYSBuZXN0ZWQgYW5ub3RhdGlvbiB2YWx1ZSBvZiB0aGUgYW5ub3RhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgbmFtZS4KKyAgICAgKiBAcGFyYW0gZGVzYworICAgICAqICAgICAgICAgICAgdGhlIGNsYXNzIGRlc2NyaXB0b3Igb2YgdGhlIG5lc3RlZCBhbm5vdGF0aW9uIGNsYXNzLgorICAgICAqIEByZXR1cm4gYSB2aXNpdG9yIHRvIHZpc2l0IHRoZSBhY3R1YWwgbmVzdGVkIGFubm90YXRpb24gdmFsdWUsIG9yCisgICAgICogICAgICAgICA8dHQ+bnVsbDwvdHQ+IGlmIHRoaXMgdmlzaXRvciBpcyBub3QgaW50ZXJlc3RlZCBpbiB2aXNpdGluZyB0aGlzCisgICAgICogICAgICAgICBuZXN0ZWQgYW5ub3RhdGlvbi4gPGk+VGhlIG5lc3RlZCBhbm5vdGF0aW9uIHZhbHVlIG11c3QgYmUgZnVsbHkKKyAgICAgKiAgICAgICAgIHZpc2l0ZWQgYmVmb3JlIGNhbGxpbmcgb3RoZXIgbWV0aG9kcyBvbiB0aGlzIGFubm90YXRpb24KKyAgICAgKiAgICAgICAgIHZpc2l0b3I8L2k+LgorICAgICAqLworICAgIHB1YmxpYyBBbm5vdGF0aW9uVmlzaXRvciB2aXNpdEFubm90YXRpb24oU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjKSB7CisgICAgICAgIGlmIChhdiAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gYXYudmlzaXRBbm5vdGF0aW9uKG5hbWUsIGRlc2MpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZpc2l0cyBhbiBhcnJheSB2YWx1ZSBvZiB0aGUgYW5ub3RhdGlvbi4gTm90ZSB0aGF0IGFycmF5cyBvZiBwcmltaXRpdmUKKyAgICAgKiB0eXBlcyAoc3VjaCBhcyBieXRlLCBib29sZWFuLCBzaG9ydCwgY2hhciwgaW50LCBsb25nLCBmbG9hdCBvciBkb3VibGUpCisgICAgICogY2FuIGJlIHBhc3NlZCBhcyB2YWx1ZSB0byB7QGxpbmsgI3Zpc2l0IHZpc2l0fS4gVGhpcyBpcyB3aGF0CisgICAgICoge0BsaW5rIENsYXNzUmVhZGVyfSBkb2VzLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSBuYW1lLgorICAgICAqIEByZXR1cm4gYSB2aXNpdG9yIHRvIHZpc2l0IHRoZSBhY3R1YWwgYXJyYXkgdmFsdWUgZWxlbWVudHMsIG9yCisgICAgICogICAgICAgICA8dHQ+bnVsbDwvdHQ+IGlmIHRoaXMgdmlzaXRvciBpcyBub3QgaW50ZXJlc3RlZCBpbiB2aXNpdGluZyB0aGVzZQorICAgICAqICAgICAgICAgdmFsdWVzLiBUaGUgJ25hbWUnIHBhcmFtZXRlcnMgcGFzc2VkIHRvIHRoZSBtZXRob2RzIG9mIHRoaXMKKyAgICAgKiAgICAgICAgIHZpc2l0b3IgYXJlIGlnbm9yZWQuIDxpPkFsbCB0aGUgYXJyYXkgdmFsdWVzIG11c3QgYmUgdmlzaXRlZAorICAgICAqICAgICAgICAgYmVmb3JlIGNhbGxpbmcgb3RoZXIgbWV0aG9kcyBvbiB0aGlzIGFubm90YXRpb24gdmlzaXRvcjwvaT4uCisgICAgICovCisgICAgcHVibGljIEFubm90YXRpb25WaXNpdG9yIHZpc2l0QXJyYXkoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgaWYgKGF2ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBhdi52aXNpdEFycmF5KG5hbWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZpc2l0cyB0aGUgZW5kIG9mIHRoZSBhbm5vdGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZpc2l0RW5kKCkgeworICAgICAgICBpZiAoYXYgIT0gbnVsbCkgeworICAgICAgICAgICAgYXYudmlzaXRFbmQoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvamVyc2V5L3JlcGFja2FnZWQvb3JnL29iamVjdHdlYi9hc20vQW5ub3RhdGlvbldyaXRlci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9qZXJzZXkvcmVwYWNrYWdlZC9vcmcvb2JqZWN0d2ViL2FzbS9Bbm5vdGF0aW9uV3JpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdmMzhjNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvamVyc2V5L3JlcGFja2FnZWQvb3JnL29iamVjdHdlYi9hc20vQW5ub3RhdGlvbldyaXRlci5qYXZhCkBAIC0wLDAgKzEsMzcxIEBACisvKioqCisgKiBBU006IGEgdmVyeSBzbWFsbCBhbmQgZmFzdCBKYXZhIGJ5dGVjb2RlIG1hbmlwdWxhdGlvbiBmcmFtZXdvcmsKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDExIElOUklBLCBGcmFuY2UgVGVsZWNvbQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIGplcnNleS5yZXBhY2thZ2VkLm9yZy5vYmplY3R3ZWIuYXNtOworCisvKioKKyAqIEFuIHtAbGluayBBbm5vdGF0aW9uVmlzaXRvcn0gdGhhdCBnZW5lcmF0ZXMgYW5ub3RhdGlvbnMgaW4gYnl0ZWNvZGUgZm9ybS4KKyAqCisgKiBAYXV0aG9yIEVyaWMgQnJ1bmV0b24KKyAqIEBhdXRob3IgRXVnZW5lIEt1bGVzaG92CisgKi8KK2ZpbmFsIGNsYXNzIEFubm90YXRpb25Xcml0ZXIgZXh0ZW5kcyBBbm5vdGF0aW9uVmlzaXRvciB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY2xhc3Mgd3JpdGVyIHRvIHdoaWNoIHRoaXMgYW5ub3RhdGlvbiBtdXN0IGJlIGFkZGVkLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgQ2xhc3NXcml0ZXIgY3c7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIHZhbHVlcyBpbiB0aGlzIGFubm90YXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgc2l6ZTsKKworICAgIC8qKgorICAgICAqIDx0dD50cnVlPHR0PiBpZiB2YWx1ZXMgYXJlIG5hbWVkLCA8dHQ+ZmFsc2U8L3R0PiBvdGhlcndpc2UuIEFubm90YXRpb24KKyAgICAgKiB3cml0ZXJzIHVzZWQgZm9yIGFubm90YXRpb24gZGVmYXVsdCBhbmQgYW5ub3RhdGlvbiBhcnJheXMgdXNlIHVubmFtZWQKKyAgICAgKiB2YWx1ZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG5hbWVkOworCisgICAgLyoqCisgICAgICogVGhlIGFubm90YXRpb24gdmFsdWVzIGluIGJ5dGVjb2RlIGZvcm0uIFRoaXMgYnl0ZSB2ZWN0b3Igb25seSBjb250YWlucworICAgICAqIHRoZSB2YWx1ZXMgdGhlbXNlbHZlcywgaS5lLiB0aGUgbnVtYmVyIG9mIHZhbHVlcyBtdXN0IGJlIHN0b3JlZCBhcyBhCisgICAgICogdW5zaWduZWQgc2hvcnQganVzdCBiZWZvcmUgdGhlc2UgYnl0ZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBCeXRlVmVjdG9yIGJ2OworCisgICAgLyoqCisgICAgICogVGhlIGJ5dGUgdmVjdG9yIHRvIGJlIHVzZWQgdG8gc3RvcmUgdGhlIG51bWJlciBvZiB2YWx1ZXMgb2YgdGhpcworICAgICAqIGFubm90YXRpb24uIFNlZSB7QGxpbmsgI2J2fS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIEJ5dGVWZWN0b3IgcGFyZW50OworCisgICAgLyoqCisgICAgICogV2hlcmUgdGhlIG51bWJlciBvZiB2YWx1ZXMgb2YgdGhpcyBhbm5vdGF0aW9uIG11c3QgYmUgc3RvcmVkIGluCisgICAgICoge0BsaW5rICNwYXJlbnR9LgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgaW50IG9mZnNldDsKKworICAgIC8qKgorICAgICAqIE5leHQgYW5ub3RhdGlvbiB3cml0ZXIuIFRoaXMgZmllbGQgaXMgdXNlZCB0byBzdG9yZSBhbm5vdGF0aW9uIGxpc3RzLgorICAgICAqLworICAgIEFubm90YXRpb25Xcml0ZXIgbmV4dDsKKworICAgIC8qKgorICAgICAqIFByZXZpb3VzIGFubm90YXRpb24gd3JpdGVyLiBUaGlzIGZpZWxkIGlzIHVzZWQgdG8gc3RvcmUgYW5ub3RhdGlvbiBsaXN0cy4KKyAgICAgKi8KKyAgICBBbm5vdGF0aW9uV3JpdGVyIHByZXY7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBDb25zdHJ1Y3RvcgorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgQW5ub3RhdGlvbldyaXRlcn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3cKKyAgICAgKiAgICAgICAgICAgIHRoZSBjbGFzcyB3cml0ZXIgdG8gd2hpY2ggdGhpcyBhbm5vdGF0aW9uIG11c3QgYmUgYWRkZWQuCisgICAgICogQHBhcmFtIG5hbWVkCisgICAgICogICAgICAgICAgICA8dHQ+dHJ1ZTx0dD4gaWYgdmFsdWVzIGFyZSBuYW1lZCwgPHR0PmZhbHNlPC90dD4gb3RoZXJ3aXNlLgorICAgICAqIEBwYXJhbSBidgorICAgICAqICAgICAgICAgICAgd2hlcmUgdGhlIGFubm90YXRpb24gdmFsdWVzIG11c3QgYmUgc3RvcmVkLgorICAgICAqIEBwYXJhbSBwYXJlbnQKKyAgICAgKiAgICAgICAgICAgIHdoZXJlIHRoZSBudW1iZXIgb2YgYW5ub3RhdGlvbiB2YWx1ZXMgbXVzdCBiZSBzdG9yZWQuCisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgd2hlcmUgaW4gPHR0PnBhcmVudDwvdHQ+IHRoZSBudW1iZXIgb2YgYW5ub3RhdGlvbiB2YWx1ZXMgbXVzdAorICAgICAqICAgICAgICAgICAgYmUgc3RvcmVkLgorICAgICAqLworICAgIEFubm90YXRpb25Xcml0ZXIoZmluYWwgQ2xhc3NXcml0ZXIgY3csIGZpbmFsIGJvb2xlYW4gbmFtZWQsCisgICAgICAgICAgICAgICAgICAgICBmaW5hbCBCeXRlVmVjdG9yIGJ2LCBmaW5hbCBCeXRlVmVjdG9yIHBhcmVudCwgZmluYWwgaW50IG9mZnNldCkgeworICAgICAgICBzdXBlcihPcGNvZGVzLkFTTTUpOworICAgICAgICB0aGlzLmN3ID0gY3c7CisgICAgICAgIHRoaXMubmFtZWQgPSBuYW1lZDsKKyAgICAgICAgdGhpcy5idiA9IGJ2OworICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKKyAgICAgICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQ7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gSW1wbGVtZW50YXRpb24gb2YgdGhlIEFubm90YXRpb25WaXNpdG9yIGFic3RyYWN0IGNsYXNzCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgICsrc2l6ZTsKKyAgICAgICAgaWYgKG5hbWVkKSB7CisgICAgICAgICAgICBidi5wdXRTaG9ydChjdy5uZXdVVEY4KG5hbWUpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgICAgICAgIGJ2LnB1dDEyKCdzJywgY3cubmV3VVRGOCgoU3RyaW5nKSB2YWx1ZSkpOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQnl0ZSkgeworICAgICAgICAgICAgYnYucHV0MTIoJ0InLCBjdy5uZXdJbnRlZ2VyKCgoQnl0ZSkgdmFsdWUpLmJ5dGVWYWx1ZSgpKS5pbmRleCk7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuKSB7CisgICAgICAgICAgICBpbnQgdiA9ICgoQm9vbGVhbikgdmFsdWUpLmJvb2xlYW5WYWx1ZSgpID8gMSA6IDA7CisgICAgICAgICAgICBidi5wdXQxMignWicsIGN3Lm5ld0ludGVnZXIodikuaW5kZXgpOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgQ2hhcmFjdGVyKSB7CisgICAgICAgICAgICBidi5wdXQxMignQycsIGN3Lm5ld0ludGVnZXIoKChDaGFyYWN0ZXIpIHZhbHVlKS5jaGFyVmFsdWUoKSkuaW5kZXgpOworICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgU2hvcnQpIHsKKyAgICAgICAgICAgIGJ2LnB1dDEyKCdTJywgY3cubmV3SW50ZWdlcigoKFNob3J0KSB2YWx1ZSkuc2hvcnRWYWx1ZSgpKS5pbmRleCk7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBUeXBlKSB7CisgICAgICAgICAgICBidi5wdXQxMignYycsIGN3Lm5ld1VURjgoKChUeXBlKSB2YWx1ZSkuZ2V0RGVzY3JpcHRvcigpKSk7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBieXRlW10pIHsKKyAgICAgICAgICAgIGJ5dGVbXSB2ID0gKGJ5dGVbXSkgdmFsdWU7CisgICAgICAgICAgICBidi5wdXQxMignWycsIHYubGVuZ3RoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdi5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGJ2LnB1dDEyKCdCJywgY3cubmV3SW50ZWdlcih2W2ldKS5pbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBib29sZWFuW10pIHsKKyAgICAgICAgICAgIGJvb2xlYW5bXSB2ID0gKGJvb2xlYW5bXSkgdmFsdWU7CisgICAgICAgICAgICBidi5wdXQxMignWycsIHYubGVuZ3RoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdi5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGJ2LnB1dDEyKCdaJywgY3cubmV3SW50ZWdlcih2W2ldID8gMSA6IDApLmluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIHNob3J0W10pIHsKKyAgICAgICAgICAgIHNob3J0W10gdiA9IChzaG9ydFtdKSB2YWx1ZTsKKyAgICAgICAgICAgIGJ2LnB1dDEyKCdbJywgdi5sZW5ndGgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYnYucHV0MTIoJ1MnLCBjdy5uZXdJbnRlZ2VyKHZbaV0pLmluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIGNoYXJbXSkgeworICAgICAgICAgICAgY2hhcltdIHYgPSAoY2hhcltdKSB2YWx1ZTsKKyAgICAgICAgICAgIGJ2LnB1dDEyKCdbJywgdi5sZW5ndGgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYnYucHV0MTIoJ0MnLCBjdy5uZXdJbnRlZ2VyKHZbaV0pLmluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIGludFtdKSB7CisgICAgICAgICAgICBpbnRbXSB2ID0gKGludFtdKSB2YWx1ZTsKKyAgICAgICAgICAgIGJ2LnB1dDEyKCdbJywgdi5sZW5ndGgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYnYucHV0MTIoJ0knLCBjdy5uZXdJbnRlZ2VyKHZbaV0pLmluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIGxvbmdbXSkgeworICAgICAgICAgICAgbG9uZ1tdIHYgPSAobG9uZ1tdKSB2YWx1ZTsKKyAgICAgICAgICAgIGJ2LnB1dDEyKCdbJywgdi5sZW5ndGgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYnYucHV0MTIoJ0onLCBjdy5uZXdMb25nKHZbaV0pLmluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIGZsb2F0W10pIHsKKyAgICAgICAgICAgIGZsb2F0W10gdiA9IChmbG9hdFtdKSB2YWx1ZTsKKyAgICAgICAgICAgIGJ2LnB1dDEyKCdbJywgdi5sZW5ndGgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgYnYucHV0MTIoJ0YnLCBjdy5uZXdGbG9hdCh2W2ldKS5pbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBkb3VibGVbXSkgeworICAgICAgICAgICAgZG91YmxlW10gdiA9IChkb3VibGVbXSkgdmFsdWU7CisgICAgICAgICAgICBidi5wdXQxMignWycsIHYubGVuZ3RoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdi5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgIGJ2LnB1dDEyKCdEJywgY3cubmV3RG91YmxlKHZbaV0pLmluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEl0ZW0gaSA9IGN3Lm5ld0NvbnN0SXRlbSh2YWx1ZSk7CisgICAgICAgICAgICBidi5wdXQxMigiLnMuSUZKRENTIi5jaGFyQXQoaS50eXBlKSwgaS5pbmRleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEVudW0oZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyBkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgKytzaXplOworICAgICAgICBpZiAobmFtZWQpIHsKKyAgICAgICAgICAgIGJ2LnB1dFNob3J0KGN3Lm5ld1VURjgobmFtZSkpOworICAgICAgICB9CisgICAgICAgIGJ2LnB1dDEyKCdlJywgY3cubmV3VVRGOChkZXNjKSkucHV0U2hvcnQoY3cubmV3VVRGOCh2YWx1ZSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBbm5vdGF0aW9uVmlzaXRvciB2aXNpdEFubm90YXRpb24oZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYykgeworICAgICAgICArK3NpemU7CisgICAgICAgIGlmIChuYW1lZCkgeworICAgICAgICAgICAgYnYucHV0U2hvcnQoY3cubmV3VVRGOChuYW1lKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gd3JpdGUgdGFnIGFuZCB0eXBlLCBhbmQgcmVzZXJ2ZSBzcGFjZSBmb3IgdmFsdWVzIGNvdW50CisgICAgICAgIGJ2LnB1dDEyKCdAJywgY3cubmV3VVRGOChkZXNjKSkucHV0U2hvcnQoMCk7CisgICAgICAgIHJldHVybiBuZXcgQW5ub3RhdGlvbldyaXRlcihjdywgdHJ1ZSwgYnYsIGJ2LCBidi5sZW5ndGggLSAyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQW5ub3RhdGlvblZpc2l0b3IgdmlzaXRBcnJheShmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICArK3NpemU7CisgICAgICAgIGlmIChuYW1lZCkgeworICAgICAgICAgICAgYnYucHV0U2hvcnQoY3cubmV3VVRGOChuYW1lKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gd3JpdGUgdGFnLCBhbmQgcmVzZXJ2ZSBzcGFjZSBmb3IgYXJyYXkgc2l6ZQorICAgICAgICBidi5wdXQxMignWycsIDApOworICAgICAgICByZXR1cm4gbmV3IEFubm90YXRpb25Xcml0ZXIoY3csIGZhbHNlLCBidiwgYnYsIGJ2Lmxlbmd0aCAtIDIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0RW5kKCkgeworICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJ5dGVbXSBkYXRhID0gcGFyZW50LmRhdGE7CisgICAgICAgICAgICBkYXRhW29mZnNldF0gPSAoYnl0ZSkgKHNpemUgPj4+IDgpOworICAgICAgICAgICAgZGF0YVtvZmZzZXQgKyAxXSA9IChieXRlKSBzaXplOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gVXRpbGl0eSBtZXRob2RzCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoaXMgYW5ub3RhdGlvbiB3cml0ZXIgbGlzdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHNpemUgb2YgdGhpcyBhbm5vdGF0aW9uIHdyaXRlciBsaXN0LgorICAgICAqLworICAgIGludCBnZXRTaXplKCkgeworICAgICAgICBpbnQgc2l6ZSA9IDA7CisgICAgICAgIEFubm90YXRpb25Xcml0ZXIgYXcgPSB0aGlzOworICAgICAgICB3aGlsZSAoYXcgIT0gbnVsbCkgeworICAgICAgICAgICAgc2l6ZSArPSBhdy5idi5sZW5ndGg7CisgICAgICAgICAgICBhdyA9IGF3Lm5leHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHV0cyB0aGUgYW5ub3RhdGlvbnMgb2YgdGhpcyBhbm5vdGF0aW9uIHdyaXRlciBsaXN0IGludG8gdGhlIGdpdmVuIGJ5dGUKKyAgICAgKiB2ZWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3V0CisgICAgICogICAgICAgICAgICB3aGVyZSB0aGUgYW5ub3RhdGlvbnMgbXVzdCBiZSBwdXQuCisgICAgICovCisgICAgdm9pZCBwdXQoZmluYWwgQnl0ZVZlY3RvciBvdXQpIHsKKyAgICAgICAgaW50IG4gPSAwOworICAgICAgICBpbnQgc2l6ZSA9IDI7CisgICAgICAgIEFubm90YXRpb25Xcml0ZXIgYXcgPSB0aGlzOworICAgICAgICBBbm5vdGF0aW9uV3JpdGVyIGxhc3QgPSBudWxsOworICAgICAgICB3aGlsZSAoYXcgIT0gbnVsbCkgeworICAgICAgICAgICAgKytuOworICAgICAgICAgICAgc2l6ZSArPSBhdy5idi5sZW5ndGg7CisgICAgICAgICAgICBhdy52aXNpdEVuZCgpOyAvLyBpbiBjYXNlIHVzZXIgZm9yZ290IHRvIGNhbGwgdmlzaXRFbmQKKyAgICAgICAgICAgIGF3LnByZXYgPSBsYXN0OworICAgICAgICAgICAgbGFzdCA9IGF3OworICAgICAgICAgICAgYXcgPSBhdy5uZXh0OworICAgICAgICB9CisgICAgICAgIG91dC5wdXRJbnQoc2l6ZSk7CisgICAgICAgIG91dC5wdXRTaG9ydChuKTsKKyAgICAgICAgYXcgPSBsYXN0OworICAgICAgICB3aGlsZSAoYXcgIT0gbnVsbCkgeworICAgICAgICAgICAgb3V0LnB1dEJ5dGVBcnJheShhdy5idi5kYXRhLCAwLCBhdy5idi5sZW5ndGgpOworICAgICAgICAgICAgYXcgPSBhdy5wcmV2OworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUHV0cyB0aGUgZ2l2ZW4gYW5ub3RhdGlvbiBsaXN0cyBpbnRvIHRoZSBnaXZlbiBieXRlIHZlY3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYW5ucworICAgICAqICAgICAgICAgICAgYW4gYXJyYXkgb2YgYW5ub3RhdGlvbiB3cml0ZXIgbGlzdHMuCisgICAgICogQHBhcmFtIG9mZgorICAgICAqICAgICAgICAgICAgaW5kZXggb2YgdGhlIGZpcnN0IGFubm90YXRpb24gdG8gYmUgd3JpdHRlbi4KKyAgICAgKiBAcGFyYW0gb3V0CisgICAgICogICAgICAgICAgICB3aGVyZSB0aGUgYW5ub3RhdGlvbnMgbXVzdCBiZSBwdXQuCisgICAgICovCisgICAgc3RhdGljIHZvaWQgcHV0KGZpbmFsIEFubm90YXRpb25Xcml0ZXJbXSBwYW5ucywgZmluYWwgaW50IG9mZiwKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQnl0ZVZlY3RvciBvdXQpIHsKKyAgICAgICAgaW50IHNpemUgPSAxICsgMiAqIChwYW5ucy5sZW5ndGggLSBvZmYpOworICAgICAgICBmb3IgKGludCBpID0gb2ZmOyBpIDwgcGFubnMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIHNpemUgKz0gcGFubnNbaV0gPT0gbnVsbCA/IDAgOiBwYW5uc1tpXS5nZXRTaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgb3V0LnB1dEludChzaXplKS5wdXRCeXRlKHBhbm5zLmxlbmd0aCAtIG9mZik7CisgICAgICAgIGZvciAoaW50IGkgPSBvZmY7IGkgPCBwYW5ucy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgQW5ub3RhdGlvbldyaXRlciBhdyA9IHBhbm5zW2ldOworICAgICAgICAgICAgQW5ub3RhdGlvbldyaXRlciBsYXN0ID0gbnVsbDsKKyAgICAgICAgICAgIGludCBuID0gMDsKKyAgICAgICAgICAgIHdoaWxlIChhdyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgKytuOworICAgICAgICAgICAgICAgIGF3LnZpc2l0RW5kKCk7IC8vIGluIGNhc2UgdXNlciBmb3Jnb3QgdG8gY2FsbCB2aXNpdEVuZAorICAgICAgICAgICAgICAgIGF3LnByZXYgPSBsYXN0OworICAgICAgICAgICAgICAgIGxhc3QgPSBhdzsKKyAgICAgICAgICAgICAgICBhdyA9IGF3Lm5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQucHV0U2hvcnQobik7CisgICAgICAgICAgICBhdyA9IGxhc3Q7CisgICAgICAgICAgICB3aGlsZSAoYXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG91dC5wdXRCeXRlQXJyYXkoYXcuYnYuZGF0YSwgMCwgYXcuYnYubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBhdyA9IGF3LnByZXY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQdXRzIHRoZSBnaXZlbiB0eXBlIHJlZmVyZW5jZSBhbmQgdHlwZSBwYXRoIGludG8gdGhlIGdpdmVuIGJ5dGV2ZWN0b3IuCisgICAgICogTE9DQUxfVkFSSUFCTEUgYW5kIFJFU09VUkNFX1ZBUklBQkxFIHRhcmdldCB0eXBlcyBhcmUgbm90IHN1cHBvcnRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlUmVmCisgICAgICogICAgICAgICAgICBhIHJlZmVyZW5jZSB0byB0aGUgYW5ub3RhdGVkIHR5cGUuIFNlZSB7QGxpbmsgVHlwZVJlZmVyZW5jZX0uCisgICAgICogQHBhcmFtIHR5cGVQYXRoCisgICAgICogICAgICAgICAgICB0aGUgcGF0aCB0byB0aGUgYW5ub3RhdGVkIHR5cGUgYXJndW1lbnQsIHdpbGRjYXJkIGJvdW5kLCBhcnJheQorICAgICAqICAgICAgICAgICAgZWxlbWVudCB0eXBlLCBvciBzdGF0aWMgaW5uZXIgdHlwZSB3aXRoaW4gJ3R5cGVSZWYnLiBNYXkgYmUKKyAgICAgKiAgICAgICAgICAgIDx0dD5udWxsPC90dD4gaWYgdGhlIGFubm90YXRpb24gdGFyZ2V0cyAndHlwZVJlZicgYXMgYSB3aG9sZS4KKyAgICAgKiBAcGFyYW0gb3V0CisgICAgICogICAgICAgICAgICB3aGVyZSB0aGUgdHlwZSByZWZlcmVuY2UgYW5kIHR5cGUgcGF0aCBtdXN0IGJlIHB1dC4KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBwdXRUYXJnZXQoaW50IHR5cGVSZWYsIFR5cGVQYXRoIHR5cGVQYXRoLCBCeXRlVmVjdG9yIG91dCkgeworICAgICAgICBzd2l0Y2ggKHR5cGVSZWYgPj4+IDI0KSB7CisgICAgICAgICAgICBjYXNlIDB4MDA6IC8vIENMQVNTX1RZUEVfUEFSQU1FVEVSCisgICAgICAgICAgICBjYXNlIDB4MDE6IC8vIE1FVEhPRF9UWVBFX1BBUkFNRVRFUgorICAgICAgICAgICAgY2FzZSAweDE2OiAvLyBNRVRIT0RfRk9STUFMX1BBUkFNRVRFUgorICAgICAgICAgICAgICAgIG91dC5wdXRTaG9ydCh0eXBlUmVmID4+PiAxNik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4MTM6IC8vIEZJRUxECisgICAgICAgICAgICBjYXNlIDB4MTQ6IC8vIE1FVEhPRF9SRVRVUk4KKyAgICAgICAgICAgIGNhc2UgMHgxNTogLy8gTUVUSE9EX1JFQ0VJVkVSCisgICAgICAgICAgICAgICAgb3V0LnB1dEJ5dGUodHlwZVJlZiA+Pj4gMjQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDQ3OiAvLyBDQVNUCisgICAgICAgICAgICBjYXNlIDB4NDg6IC8vIENPTlNUUlVDVE9SX0lOVk9DQVRJT05fVFlQRV9BUkdVTUVOVAorICAgICAgICAgICAgY2FzZSAweDQ5OiAvLyBNRVRIT0RfSU5WT0NBVElPTl9UWVBFX0FSR1VNRU5UCisgICAgICAgICAgICBjYXNlIDB4NEE6IC8vIENPTlNUUlVDVE9SX1JFRkVSRU5DRV9UWVBFX0FSR1VNRU5UCisgICAgICAgICAgICBjYXNlIDB4NEI6IC8vIE1FVEhPRF9SRUZFUkVOQ0VfVFlQRV9BUkdVTUVOVAorICAgICAgICAgICAgICAgIG91dC5wdXRJbnQodHlwZVJlZik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAvLyBjYXNlIDB4MTA6IC8vIENMQVNTX0VYVEVORFMKKyAgICAgICAgICAgIC8vIGNhc2UgMHgxMTogLy8gQ0xBU1NfVFlQRV9QQVJBTUVURVJfQk9VTkQKKyAgICAgICAgICAgIC8vIGNhc2UgMHgxMjogLy8gTUVUSE9EX1RZUEVfUEFSQU1FVEVSX0JPVU5ECisgICAgICAgICAgICAvLyBjYXNlIDB4MTc6IC8vIFRIUk9XUworICAgICAgICAgICAgLy8gY2FzZSAweDQyOiAvLyBFWENFUFRJT05fUEFSQU1FVEVSCisgICAgICAgICAgICAvLyBjYXNlIDB4NDM6IC8vIElOU1RBTkNFT0YKKyAgICAgICAgICAgIC8vIGNhc2UgMHg0NDogLy8gTkVXCisgICAgICAgICAgICAvLyBjYXNlIDB4NDU6IC8vIENPTlNUUlVDVE9SX1JFRkVSRU5DRQorICAgICAgICAgICAgLy8gY2FzZSAweDQ2OiAvLyBNRVRIT0RfUkVGRVJFTkNFCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIG91dC5wdXQxMih0eXBlUmVmID4+PiAyNCwgKHR5cGVSZWYgJiAweEZGRkYwMCkgPj4gOCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR5cGVQYXRoID09IG51bGwpIHsKKyAgICAgICAgICAgIG91dC5wdXRCeXRlKDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IGxlbmd0aCA9IHR5cGVQYXRoLmJbdHlwZVBhdGgub2Zmc2V0XSAqIDIgKyAxOworICAgICAgICAgICAgb3V0LnB1dEJ5dGVBcnJheSh0eXBlUGF0aC5iLCB0eXBlUGF0aC5vZmZzZXQsIGxlbmd0aCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL2plcnNleS9yZXBhY2thZ2VkL29yZy9vYmplY3R3ZWIvYXNtL0F0dHJpYnV0ZS5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9qZXJzZXkvcmVwYWNrYWdlZC9vcmcvb2JqZWN0d2ViL2FzbS9BdHRyaWJ1dGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGYxYzBlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9qZXJzZXkvcmVwYWNrYWdlZC9vcmcvb2JqZWN0d2ViL2FzbS9BdHRyaWJ1dGUuamF2YQpAQCAtMCwwICsxLDI1NSBAQAorLyoqKgorICogQVNNOiBhIHZlcnkgc21hbGwgYW5kIGZhc3QgSmF2YSBieXRlY29kZSBtYW5pcHVsYXRpb24gZnJhbWV3b3JrCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAxMSBJTlJJQSwgRnJhbmNlIFRlbGVjb20KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBqZXJzZXkucmVwYWNrYWdlZC5vcmcub2JqZWN0d2ViLmFzbTsKKworLyoqCisgKiBBIG5vbiBzdGFuZGFyZCBjbGFzcywgZmllbGQsIG1ldGhvZCBvciBjb2RlIGF0dHJpYnV0ZS4KKyAqCisgKiBAYXV0aG9yIEVyaWMgQnJ1bmV0b24KKyAqIEBhdXRob3IgRXVnZW5lIEt1bGVzaG92CisgKi8KK3B1YmxpYyBjbGFzcyBBdHRyaWJ1dGUgeworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2YgdGhpcyBhdHRyaWJ1dGUuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIFN0cmluZyB0eXBlOworCisgICAgLyoqCisgICAgICogVGhlIHJhdyB2YWx1ZSBvZiB0aGlzIGF0dHJpYnV0ZSwgdXNlZCBvbmx5IGZvciB1bmtub3duIGF0dHJpYnV0ZXMuCisgICAgICovCisgICAgYnl0ZVtdIHZhbHVlOworCisgICAgLyoqCisgICAgICogVGhlIG5leHQgYXR0cmlidXRlIGluIHRoaXMgYXR0cmlidXRlIGxpc3QuIE1heSBiZSA8dHQ+bnVsbDwvdHQ+LgorICAgICAqLworICAgIEF0dHJpYnV0ZSBuZXh0OworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBlbXB0eSBhdHRyaWJ1dGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZQorICAgICAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQXR0cmlidXRlKGZpbmFsIFN0cmluZyB0eXBlKSB7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoaXMgdHlwZSBvZiBhdHRyaWJ1dGUgaXMgdW5rbm93bi4gVGhlIGRlZmF1bHQKKyAgICAgKiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBhbHdheXMgcmV0dXJucyA8dHQ+dHJ1ZTwvdHQ+LgorICAgICAqCisgICAgICogQHJldHVybiA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoaXMgdHlwZSBvZiBhdHRyaWJ1dGUgaXMgdW5rbm93bi4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Vua25vd24oKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgPHR0PnRydWU8L3R0PiBpZiB0aGlzIHR5cGUgb2YgYXR0cmlidXRlIGlzIGEgY29kZSBhdHRyaWJ1dGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIDx0dD50cnVlPC90dD4gaWYgdGhpcyB0eXBlIG9mIGF0dHJpYnV0ZSBpcyBhIGNvZGUgYXR0cmlidXRlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQ29kZUF0dHJpYnV0ZSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxhYmVscyBjb3JyZXNwb25kaW5nIHRvIHRoaXMgYXR0cmlidXRlLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbGFiZWxzIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBhdHRyaWJ1dGUsIG9yIDx0dD5udWxsPC90dD4gaWYKKyAgICAgKiAgICAgICAgIHRoaXMgYXR0cmlidXRlIGlzIG5vdCBhIGNvZGUgYXR0cmlidXRlIHRoYXQgY29udGFpbnMgbGFiZWxzLgorICAgICAqLworICAgIHByb3RlY3RlZCBMYWJlbFtdIGdldExhYmVscygpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgYSB7QGxpbmsgI3R5cGUgdHlwZX0gYXR0cmlidXRlLiBUaGlzIG1ldGhvZCBtdXN0IHJldHVybiBhCisgICAgICogPGk+bmV3PC9pPiB7QGxpbmsgQXR0cmlidXRlfSBvYmplY3QsIG9mIHR5cGUge0BsaW5rICN0eXBlIHR5cGV9LAorICAgICAqIGNvcnJlc3BvbmRpbmcgdG8gdGhlIDx0dD5sZW48L3R0PiBieXRlcyBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gb2Zmc2V0LCBpbgorICAgICAqIHRoZSBnaXZlbiBjbGFzcyByZWFkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3IKKyAgICAgKiAgICAgICAgICAgIHRoZSBjbGFzcyB0aGF0IGNvbnRhaW5zIHRoZSBhdHRyaWJ1dGUgdG8gYmUgcmVhZC4KKyAgICAgKiBAcGFyYW0gb2ZmCisgICAgICogICAgICAgICAgICBpbmRleCBvZiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgYXR0cmlidXRlJ3MgY29udGVudCBpbgorICAgICAqICAgICAgICAgICAge0BsaW5rIENsYXNzUmVhZGVyI2IgY3IuYn0uIFRoZSA2IGF0dHJpYnV0ZSBoZWFkZXIgYnl0ZXMsCisgICAgICogICAgICAgICAgICBjb250YWluaW5nIHRoZSB0eXBlIGFuZCB0aGUgbGVuZ3RoIG9mIHRoZSBhdHRyaWJ1dGUsIGFyZSBub3QKKyAgICAgKiAgICAgICAgICAgIHRha2VuIGludG8gYWNjb3VudCBoZXJlLgorICAgICAqIEBwYXJhbSBsZW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhlIGF0dHJpYnV0ZSdzIGNvbnRlbnQuCisgICAgICogQHBhcmFtIGJ1ZgorICAgICAqICAgICAgICAgICAgYnVmZmVyIHRvIGJlIHVzZWQgdG8gY2FsbCB7QGxpbmsgQ2xhc3NSZWFkZXIjcmVhZFVURjgKKyAgICAgKiAgICAgICAgICAgIHJlYWRVVEY4fSwge0BsaW5rIENsYXNzUmVhZGVyI3JlYWRDbGFzcyhpbnQsY2hhcltdKSByZWFkQ2xhc3N9CisgICAgICogICAgICAgICAgICBvciB7QGxpbmsgQ2xhc3NSZWFkZXIjcmVhZENvbnN0IHJlYWRDb25zdH0uCisgICAgICogQHBhcmFtIGNvZGVPZmYKKyAgICAgKiAgICAgICAgICAgIGluZGV4IG9mIHRoZSBmaXJzdCBieXRlIG9mIGNvZGUncyBhdHRyaWJ1dGUgY29udGVudCBpbgorICAgICAqICAgICAgICAgICAge0BsaW5rIENsYXNzUmVhZGVyI2IgY3IuYn0sIG9yIC0xIGlmIHRoZSBhdHRyaWJ1dGUgdG8gYmUgcmVhZAorICAgICAqICAgICAgICAgICAgaXMgbm90IGEgY29kZSBhdHRyaWJ1dGUuIFRoZSA2IGF0dHJpYnV0ZSBoZWFkZXIgYnl0ZXMsCisgICAgICogICAgICAgICAgICBjb250YWluaW5nIHRoZSB0eXBlIGFuZCB0aGUgbGVuZ3RoIG9mIHRoZSBhdHRyaWJ1dGUsIGFyZSBub3QKKyAgICAgKiAgICAgICAgICAgIHRha2VuIGludG8gYWNjb3VudCBoZXJlLgorICAgICAqIEBwYXJhbSBsYWJlbHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBsYWJlbHMgb2YgdGhlIG1ldGhvZCdzIGNvZGUsIG9yIDx0dD5udWxsPC90dD4gaWYgdGhlCisgICAgICogICAgICAgICAgICBhdHRyaWJ1dGUgdG8gYmUgcmVhZCBpcyBub3QgYSBjb2RlIGF0dHJpYnV0ZS4KKyAgICAgKiBAcmV0dXJuIGEgPGk+bmV3PC9pPiB7QGxpbmsgQXR0cmlidXRlfSBvYmplY3QgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4KKyAgICAgKiAgICAgICAgIGJ5dGVzLgorICAgICAqLworICAgIHByb3RlY3RlZCBBdHRyaWJ1dGUgcmVhZChmaW5hbCBDbGFzc1JlYWRlciBjciwgZmluYWwgaW50IG9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGxlbiwgZmluYWwgY2hhcltdIGJ1ZiwgZmluYWwgaW50IGNvZGVPZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExhYmVsW10gbGFiZWxzKSB7CisgICAgICAgIEF0dHJpYnV0ZSBhdHRyID0gbmV3IEF0dHJpYnV0ZSh0eXBlKTsKKyAgICAgICAgYXR0ci52YWx1ZSA9IG5ldyBieXRlW2xlbl07CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoY3IuYiwgb2ZmLCBhdHRyLnZhbHVlLCAwLCBsZW4pOworICAgICAgICByZXR1cm4gYXR0cjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBieXRlIGFycmF5IGZvcm0gb2YgdGhpcyBhdHRyaWJ1dGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3cKKyAgICAgKiAgICAgICAgICAgIHRoZSBjbGFzcyB0byB3aGljaCB0aGlzIGF0dHJpYnV0ZSBtdXN0IGJlIGFkZGVkLiBUaGlzCisgICAgICogICAgICAgICAgICBwYXJhbWV0ZXIgY2FuIGJlIHVzZWQgdG8gYWRkIHRvIHRoZSBjb25zdGFudCBwb29sIG9mIHRoaXMKKyAgICAgKiAgICAgICAgICAgIGNsYXNzIHRoZSBpdGVtcyB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoaXMgYXR0cmlidXRlLgorICAgICAqIEBwYXJhbSBjb2RlCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZWNvZGUgb2YgdGhlIG1ldGhvZCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgY29kZQorICAgICAqICAgICAgICAgICAgYXR0cmlidXRlLCBvciA8dHQ+bnVsbDwvdHQ+IGlmIHRoaXMgYXR0cmlidXRlIGlzIG5vdCBhIGNvZGUKKyAgICAgKiAgICAgICAgICAgIGF0dHJpYnV0ZXMuCisgICAgICogQHBhcmFtIGxlbgorICAgICAqICAgICAgICAgICAgdGhlIGxlbmd0aCBvZiB0aGUgYnl0ZWNvZGUgb2YgdGhlIG1ldGhvZCBjb3JyZXNwb25kaW5nIHRvIHRoaXMKKyAgICAgKiAgICAgICAgICAgIGNvZGUgYXR0cmlidXRlLCBvciA8dHQ+bnVsbDwvdHQ+IGlmIHRoaXMgYXR0cmlidXRlIGlzIG5vdCBhCisgICAgICogICAgICAgICAgICBjb2RlIGF0dHJpYnV0ZS4KKyAgICAgKiBAcGFyYW0gbWF4U3RhY2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIHN0YWNrIHNpemUgb2YgdGhlIG1ldGhvZCBjb3JyZXNwb25kaW5nIHRvIHRoaXMKKyAgICAgKiAgICAgICAgICAgIGNvZGUgYXR0cmlidXRlLCBvciAtMSBpZiB0aGlzIGF0dHJpYnV0ZSBpcyBub3QgYSBjb2RlCisgICAgICogICAgICAgICAgICBhdHRyaWJ1dGUuCisgICAgICogQHBhcmFtIG1heExvY2FscworICAgICAqICAgICAgICAgICAgdGhlIG1heGltdW0gbnVtYmVyIG9mIGxvY2FsIHZhcmlhYmxlcyBvZiB0aGUgbWV0aG9kCisgICAgICogICAgICAgICAgICBjb3JyZXNwb25kaW5nIHRvIHRoaXMgY29kZSBhdHRyaWJ1dGUsIG9yIC0xIGlmIHRoaXMgYXR0cmlidXRlCisgICAgICogICAgICAgICAgICBpcyBub3QgYSBjb2RlIGF0dHJpYnV0ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBieXRlIGFycmF5IGZvcm0gb2YgdGhpcyBhdHRyaWJ1dGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIEJ5dGVWZWN0b3Igd3JpdGUoZmluYWwgQ2xhc3NXcml0ZXIgY3csIGZpbmFsIGJ5dGVbXSBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBsZW4sIGZpbmFsIGludCBtYXhTdGFjaywgZmluYWwgaW50IG1heExvY2FscykgeworICAgICAgICBCeXRlVmVjdG9yIHYgPSBuZXcgQnl0ZVZlY3RvcigpOworICAgICAgICB2LmRhdGEgPSB2YWx1ZTsKKyAgICAgICAgdi5sZW5ndGggPSB2YWx1ZS5sZW5ndGg7CisgICAgICAgIHJldHVybiB2OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgYXR0cmlidXRlIGxpc3QgdGhhdCBiZWdpbnMgd2l0aCB0aGlzIGF0dHJpYnV0ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgYXR0cmlidXRlIGxpc3QgdGhhdCBiZWdpbnMgd2l0aCB0aGlzIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBmaW5hbCBpbnQgZ2V0Q291bnQoKSB7CisgICAgICAgIGludCBjb3VudCA9IDA7CisgICAgICAgIEF0dHJpYnV0ZSBhdHRyID0gdGhpczsKKyAgICAgICAgd2hpbGUgKGF0dHIgIT0gbnVsbCkgeworICAgICAgICAgICAgY291bnQgKz0gMTsKKyAgICAgICAgICAgIGF0dHIgPSBhdHRyLm5leHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvdW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNpemUgb2YgYWxsIHRoZSBhdHRyaWJ1dGVzIGluIHRoaXMgYXR0cmlidXRlIGxpc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3cKKyAgICAgKiAgICAgICAgICAgIHRoZSBjbGFzcyB3cml0ZXIgdG8gYmUgdXNlZCB0byBjb252ZXJ0IHRoZSBhdHRyaWJ1dGVzIGludG8KKyAgICAgKiAgICAgICAgICAgIGJ5dGUgYXJyYXlzLCB3aXRoIHRoZSB7QGxpbmsgI3dyaXRlIHdyaXRlfSBtZXRob2QuCisgICAgICogQHBhcmFtIGNvZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBieXRlY29kZSBvZiB0aGUgbWV0aG9kIGNvcnJlc3BvbmRpbmcgdG8gdGhlc2UgY29kZQorICAgICAqICAgICAgICAgICAgYXR0cmlidXRlcywgb3IgPHR0Pm51bGw8L3R0PiBpZiB0aGVzZSBhdHRyaWJ1dGVzIGFyZSBub3QgY29kZQorICAgICAqICAgICAgICAgICAgYXR0cmlidXRlcy4KKyAgICAgKiBAcGFyYW0gbGVuCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBieXRlY29kZSBvZiB0aGUgbWV0aG9kIGNvcnJlc3BvbmRpbmcgdG8KKyAgICAgKiAgICAgICAgICAgIHRoZXNlIGNvZGUgYXR0cmlidXRlcywgb3IgPHR0Pm51bGw8L3R0PiBpZiB0aGVzZSBhdHRyaWJ1dGVzCisgICAgICogICAgICAgICAgICBhcmUgbm90IGNvZGUgYXR0cmlidXRlcy4KKyAgICAgKiBAcGFyYW0gbWF4U3RhY2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIHN0YWNrIHNpemUgb2YgdGhlIG1ldGhvZCBjb3JyZXNwb25kaW5nIHRvIHRoZXNlCisgICAgICogICAgICAgICAgICBjb2RlIGF0dHJpYnV0ZXMsIG9yIC0xIGlmIHRoZXNlIGF0dHJpYnV0ZXMgYXJlIG5vdCBjb2RlCisgICAgICogICAgICAgICAgICBhdHRyaWJ1dGVzLgorICAgICAqIEBwYXJhbSBtYXhMb2NhbHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBsb2NhbCB2YXJpYWJsZXMgb2YgdGhlIG1ldGhvZAorICAgICAqICAgICAgICAgICAgY29ycmVzcG9uZGluZyB0byB0aGVzZSBjb2RlIGF0dHJpYnV0ZXMsIG9yIC0xIGlmIHRoZXNlCisgICAgICogICAgICAgICAgICBhdHRyaWJ1dGVzIGFyZSBub3QgY29kZSBhdHRyaWJ1dGVzLgorICAgICAqIEByZXR1cm4gdGhlIHNpemUgb2YgYWxsIHRoZSBhdHRyaWJ1dGVzIGluIHRoaXMgYXR0cmlidXRlIGxpc3QuIFRoaXMgc2l6ZQorICAgICAqICAgICAgICAgaW5jbHVkZXMgdGhlIHNpemUgb2YgdGhlIGF0dHJpYnV0ZSBoZWFkZXJzLgorICAgICAqLworICAgIGZpbmFsIGludCBnZXRTaXplKGZpbmFsIENsYXNzV3JpdGVyIGN3LCBmaW5hbCBieXRlW10gY29kZSwgZmluYWwgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbWF4U3RhY2ssIGZpbmFsIGludCBtYXhMb2NhbHMpIHsKKyAgICAgICAgQXR0cmlidXRlIGF0dHIgPSB0aGlzOworICAgICAgICBpbnQgc2l6ZSA9IDA7CisgICAgICAgIHdoaWxlIChhdHRyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGN3Lm5ld1VURjgoYXR0ci50eXBlKTsKKyAgICAgICAgICAgIHNpemUgKz0gYXR0ci53cml0ZShjdywgY29kZSwgbGVuLCBtYXhTdGFjaywgbWF4TG9jYWxzKS5sZW5ndGggKyA2OworICAgICAgICAgICAgYXR0ciA9IGF0dHIubmV4dDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgYWxsIHRoZSBhdHRyaWJ1dGVzIG9mIHRoaXMgYXR0cmlidXRlIGxpc3QgaW4gdGhlIGdpdmVuIGJ5dGUKKyAgICAgKiB2ZWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3cKKyAgICAgKiAgICAgICAgICAgIHRoZSBjbGFzcyB3cml0ZXIgdG8gYmUgdXNlZCB0byBjb252ZXJ0IHRoZSBhdHRyaWJ1dGVzIGludG8KKyAgICAgKiAgICAgICAgICAgIGJ5dGUgYXJyYXlzLCB3aXRoIHRoZSB7QGxpbmsgI3dyaXRlIHdyaXRlfSBtZXRob2QuCisgICAgICogQHBhcmFtIGNvZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBieXRlY29kZSBvZiB0aGUgbWV0aG9kIGNvcnJlc3BvbmRpbmcgdG8gdGhlc2UgY29kZQorICAgICAqICAgICAgICAgICAgYXR0cmlidXRlcywgb3IgPHR0Pm51bGw8L3R0PiBpZiB0aGVzZSBhdHRyaWJ1dGVzIGFyZSBub3QgY29kZQorICAgICAqICAgICAgICAgICAgYXR0cmlidXRlcy4KKyAgICAgKiBAcGFyYW0gbGVuCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBieXRlY29kZSBvZiB0aGUgbWV0aG9kIGNvcnJlc3BvbmRpbmcgdG8KKyAgICAgKiAgICAgICAgICAgIHRoZXNlIGNvZGUgYXR0cmlidXRlcywgb3IgPHR0Pm51bGw8L3R0PiBpZiB0aGVzZSBhdHRyaWJ1dGVzCisgICAgICogICAgICAgICAgICBhcmUgbm90IGNvZGUgYXR0cmlidXRlcy4KKyAgICAgKiBAcGFyYW0gbWF4U3RhY2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIHN0YWNrIHNpemUgb2YgdGhlIG1ldGhvZCBjb3JyZXNwb25kaW5nIHRvIHRoZXNlCisgICAgICogICAgICAgICAgICBjb2RlIGF0dHJpYnV0ZXMsIG9yIC0xIGlmIHRoZXNlIGF0dHJpYnV0ZXMgYXJlIG5vdCBjb2RlCisgICAgICogICAgICAgICAgICBhdHRyaWJ1dGVzLgorICAgICAqIEBwYXJhbSBtYXhMb2NhbHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIG51bWJlciBvZiBsb2NhbCB2YXJpYWJsZXMgb2YgdGhlIG1ldGhvZAorICAgICAqICAgICAgICAgICAgY29ycmVzcG9uZGluZyB0byB0aGVzZSBjb2RlIGF0dHJpYnV0ZXMsIG9yIC0xIGlmIHRoZXNlCisgICAgICogICAgICAgICAgICBhdHRyaWJ1dGVzIGFyZSBub3QgY29kZSBhdHRyaWJ1dGVzLgorICAgICAqIEBwYXJhbSBvdXQKKyAgICAgKiAgICAgICAgICAgIHdoZXJlIHRoZSBhdHRyaWJ1dGVzIG11c3QgYmUgd3JpdHRlbi4KKyAgICAgKi8KKyAgICBmaW5hbCB2b2lkIHB1dChmaW5hbCBDbGFzc1dyaXRlciBjdywgZmluYWwgYnl0ZVtdIGNvZGUsIGZpbmFsIGludCBsZW4sCisgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG1heFN0YWNrLCBmaW5hbCBpbnQgbWF4TG9jYWxzLCBmaW5hbCBCeXRlVmVjdG9yIG91dCkgeworICAgICAgICBBdHRyaWJ1dGUgYXR0ciA9IHRoaXM7CisgICAgICAgIHdoaWxlIChhdHRyICE9IG51bGwpIHsKKyAgICAgICAgICAgIEJ5dGVWZWN0b3IgYiA9IGF0dHIud3JpdGUoY3csIGNvZGUsIGxlbiwgbWF4U3RhY2ssIG1heExvY2Fscyk7CisgICAgICAgICAgICBvdXQucHV0U2hvcnQoY3cubmV3VVRGOChhdHRyLnR5cGUpKS5wdXRJbnQoYi5sZW5ndGgpOworICAgICAgICAgICAgb3V0LnB1dEJ5dGVBcnJheShiLmRhdGEsIDAsIGIubGVuZ3RoKTsKKyAgICAgICAgICAgIGF0dHIgPSBhdHRyLm5leHQ7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL2plcnNleS9yZXBhY2thZ2VkL29yZy9vYmplY3R3ZWIvYXNtL0J5dGVWZWN0b3IuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvamVyc2V5L3JlcGFja2FnZWQvb3JnL29iamVjdHdlYi9hc20vQnl0ZVZlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMDExYTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL2plcnNleS9yZXBhY2thZ2VkL29yZy9vYmplY3R3ZWIvYXNtL0J5dGVWZWN0b3IuamF2YQpAQCAtMCwwICsxLDMzOSBAQAorLyoqKgorICogQVNNOiBhIHZlcnkgc21hbGwgYW5kIGZhc3QgSmF2YSBieXRlY29kZSBtYW5pcHVsYXRpb24gZnJhbWV3b3JrCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAxMSBJTlJJQSwgRnJhbmNlIFRlbGVjb20KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBqZXJzZXkucmVwYWNrYWdlZC5vcmcub2JqZWN0d2ViLmFzbTsKKworLyoqCisgKiBBIGR5bmFtaWNhbGx5IGV4dGVuc2libGUgdmVjdG9yIG9mIGJ5dGVzLiBUaGlzIGNsYXNzIGlzIHJvdWdobHkgZXF1aXZhbGVudCB0bworICogYSBEYXRhT3V0cHV0U3RyZWFtIG9uIHRvcCBvZiBhIEJ5dGVBcnJheU91dHB1dFN0cmVhbSwgYnV0IGlzIG1vcmUgZWZmaWNpZW50LgorICoKKyAqIEBhdXRob3IgRXJpYyBCcnVuZXRvbgorICovCitwdWJsaWMgY2xhc3MgQnl0ZVZlY3RvciB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY29udGVudCBvZiB0aGlzIHZlY3Rvci4KKyAgICAgKi8KKyAgICBieXRlW10gZGF0YTsKKworICAgIC8qKgorICAgICAqIEFjdHVhbCBudW1iZXIgb2YgYnl0ZXMgaW4gdGhpcyB2ZWN0b3IuCisgICAgICovCisgICAgaW50IGxlbmd0aDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0BsaW5rIEJ5dGVWZWN0b3IgQnl0ZVZlY3Rvcn0gd2l0aCBhIGRlZmF1bHQgaW5pdGlhbAorICAgICAqIHNpemUuCisgICAgICovCisgICAgcHVibGljIEJ5dGVWZWN0b3IoKSB7CisgICAgICAgIGRhdGEgPSBuZXcgYnl0ZVs2NF07CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgQnl0ZVZlY3RvciBCeXRlVmVjdG9yfSB3aXRoIHRoZSBnaXZlbiBpbml0aWFsCisgICAgICogc2l6ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbml0aWFsU2l6ZQorICAgICAqICAgICAgICAgICAgdGhlIGluaXRpYWwgc2l6ZSBvZiB0aGUgYnl0ZSB2ZWN0b3IgdG8gYmUgY29uc3RydWN0ZWQuCisgICAgICovCisgICAgcHVibGljIEJ5dGVWZWN0b3IoZmluYWwgaW50IGluaXRpYWxTaXplKSB7CisgICAgICAgIGRhdGEgPSBuZXcgYnl0ZVtpbml0aWFsU2l6ZV07CisgICAgfQorCisgICAgLyoqCisgICAgICogUHV0cyBhIGJ5dGUgaW50byB0aGlzIGJ5dGUgdmVjdG9yLiBUaGUgYnl0ZSB2ZWN0b3IgaXMgYXV0b21hdGljYWxseQorICAgICAqIGVubGFyZ2VkIGlmIG5lY2Vzc2FyeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiCisgICAgICogICAgICAgICAgICBhIGJ5dGUuCisgICAgICogQHJldHVybiB0aGlzIGJ5dGUgdmVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBCeXRlVmVjdG9yIHB1dEJ5dGUoZmluYWwgaW50IGIpIHsKKyAgICAgICAgaW50IGxlbmd0aCA9IHRoaXMubGVuZ3RoOworICAgICAgICBpZiAobGVuZ3RoICsgMSA+IGRhdGEubGVuZ3RoKSB7CisgICAgICAgICAgICBlbmxhcmdlKDEpOworICAgICAgICB9CisgICAgICAgIGRhdGFbbGVuZ3RoKytdID0gKGJ5dGUpIGI7CisgICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQdXRzIHR3byBieXRlcyBpbnRvIHRoaXMgYnl0ZSB2ZWN0b3IuIFRoZSBieXRlIHZlY3RvciBpcyBhdXRvbWF0aWNhbGx5CisgICAgICogZW5sYXJnZWQgaWYgbmVjZXNzYXJ5LgorICAgICAqCisgICAgICogQHBhcmFtIGIxCisgICAgICogICAgICAgICAgICBhIGJ5dGUuCisgICAgICogQHBhcmFtIGIyCisgICAgICogICAgICAgICAgICBhbm90aGVyIGJ5dGUuCisgICAgICogQHJldHVybiB0aGlzIGJ5dGUgdmVjdG9yLgorICAgICAqLworICAgIEJ5dGVWZWN0b3IgcHV0MTEoZmluYWwgaW50IGIxLCBmaW5hbCBpbnQgYjIpIHsKKyAgICAgICAgaW50IGxlbmd0aCA9IHRoaXMubGVuZ3RoOworICAgICAgICBpZiAobGVuZ3RoICsgMiA+IGRhdGEubGVuZ3RoKSB7CisgICAgICAgICAgICBlbmxhcmdlKDIpOworICAgICAgICB9CisgICAgICAgIGJ5dGVbXSBkYXRhID0gdGhpcy5kYXRhOworICAgICAgICBkYXRhW2xlbmd0aCsrXSA9IChieXRlKSBiMTsKKyAgICAgICAgZGF0YVtsZW5ndGgrK10gPSAoYnl0ZSkgYjI7CisgICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQdXRzIGEgc2hvcnQgaW50byB0aGlzIGJ5dGUgdmVjdG9yLiBUaGUgYnl0ZSB2ZWN0b3IgaXMgYXV0b21hdGljYWxseQorICAgICAqIGVubGFyZ2VkIGlmIG5lY2Vzc2FyeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzCisgICAgICogICAgICAgICAgICBhIHNob3J0LgorICAgICAqIEByZXR1cm4gdGhpcyBieXRlIHZlY3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnl0ZVZlY3RvciBwdXRTaG9ydChmaW5hbCBpbnQgcykgeworICAgICAgICBpbnQgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CisgICAgICAgIGlmIChsZW5ndGggKyAyID4gZGF0YS5sZW5ndGgpIHsKKyAgICAgICAgICAgIGVubGFyZ2UoMik7CisgICAgICAgIH0KKyAgICAgICAgYnl0ZVtdIGRhdGEgPSB0aGlzLmRhdGE7CisgICAgICAgIGRhdGFbbGVuZ3RoKytdID0gKGJ5dGUpIChzID4+PiA4KTsKKyAgICAgICAgZGF0YVtsZW5ndGgrK10gPSAoYnl0ZSkgczsKKyAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFB1dHMgYSBieXRlIGFuZCBhIHNob3J0IGludG8gdGhpcyBieXRlIHZlY3Rvci4gVGhlIGJ5dGUgdmVjdG9yIGlzCisgICAgICogYXV0b21hdGljYWxseSBlbmxhcmdlZCBpZiBuZWNlc3NhcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgYSBieXRlLgorICAgICAqIEBwYXJhbSBzCisgICAgICogICAgICAgICAgICBhIHNob3J0LgorICAgICAqIEByZXR1cm4gdGhpcyBieXRlIHZlY3Rvci4KKyAgICAgKi8KKyAgICBCeXRlVmVjdG9yIHB1dDEyKGZpbmFsIGludCBiLCBmaW5hbCBpbnQgcykgeworICAgICAgICBpbnQgbGVuZ3RoID0gdGhpcy5sZW5ndGg7CisgICAgICAgIGlmIChsZW5ndGggKyAzID4gZGF0YS5sZW5ndGgpIHsKKyAgICAgICAgICAgIGVubGFyZ2UoMyk7CisgICAgICAgIH0KKyAgICAgICAgYnl0ZVtdIGRhdGEgPSB0aGlzLmRhdGE7CisgICAgICAgIGRhdGFbbGVuZ3RoKytdID0gKGJ5dGUpIGI7CisgICAgICAgIGRhdGFbbGVuZ3RoKytdID0gKGJ5dGUpIChzID4+PiA4KTsKKyAgICAgICAgZGF0YVtsZW5ndGgrK10gPSAoYnl0ZSkgczsKKyAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFB1dHMgYW4gaW50IGludG8gdGhpcyBieXRlIHZlY3Rvci4gVGhlIGJ5dGUgdmVjdG9yIGlzIGF1dG9tYXRpY2FsbHkKKyAgICAgKiBlbmxhcmdlZCBpZiBuZWNlc3NhcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaQorICAgICAqICAgICAgICAgICAgYW4gaW50LgorICAgICAqIEByZXR1cm4gdGhpcyBieXRlIHZlY3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnl0ZVZlY3RvciBwdXRJbnQoZmluYWwgaW50IGkpIHsKKyAgICAgICAgaW50IGxlbmd0aCA9IHRoaXMubGVuZ3RoOworICAgICAgICBpZiAobGVuZ3RoICsgNCA+IGRhdGEubGVuZ3RoKSB7CisgICAgICAgICAgICBlbmxhcmdlKDQpOworICAgICAgICB9CisgICAgICAgIGJ5dGVbXSBkYXRhID0gdGhpcy5kYXRhOworICAgICAgICBkYXRhW2xlbmd0aCsrXSA9IChieXRlKSAoaSA+Pj4gMjQpOworICAgICAgICBkYXRhW2xlbmd0aCsrXSA9IChieXRlKSAoaSA+Pj4gMTYpOworICAgICAgICBkYXRhW2xlbmd0aCsrXSA9IChieXRlKSAoaSA+Pj4gOCk7CisgICAgICAgIGRhdGFbbGVuZ3RoKytdID0gKGJ5dGUpIGk7CisgICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQdXRzIGEgbG9uZyBpbnRvIHRoaXMgYnl0ZSB2ZWN0b3IuIFRoZSBieXRlIHZlY3RvciBpcyBhdXRvbWF0aWNhbGx5CisgICAgICogZW5sYXJnZWQgaWYgbmVjZXNzYXJ5LgorICAgICAqCisgICAgICogQHBhcmFtIGwKKyAgICAgKiAgICAgICAgICAgIGEgbG9uZy4KKyAgICAgKiBAcmV0dXJuIHRoaXMgYnl0ZSB2ZWN0b3IuCisgICAgICovCisgICAgcHVibGljIEJ5dGVWZWN0b3IgcHV0TG9uZyhmaW5hbCBsb25nIGwpIHsKKyAgICAgICAgaW50IGxlbmd0aCA9IHRoaXMubGVuZ3RoOworICAgICAgICBpZiAobGVuZ3RoICsgOCA+IGRhdGEubGVuZ3RoKSB7CisgICAgICAgICAgICBlbmxhcmdlKDgpOworICAgICAgICB9CisgICAgICAgIGJ5dGVbXSBkYXRhID0gdGhpcy5kYXRhOworICAgICAgICBpbnQgaSA9IChpbnQpIChsID4+PiAzMik7CisgICAgICAgIGRhdGFbbGVuZ3RoKytdID0gKGJ5dGUpIChpID4+PiAyNCk7CisgICAgICAgIGRhdGFbbGVuZ3RoKytdID0gKGJ5dGUpIChpID4+PiAxNik7CisgICAgICAgIGRhdGFbbGVuZ3RoKytdID0gKGJ5dGUpIChpID4+PiA4KTsKKyAgICAgICAgZGF0YVtsZW5ndGgrK10gPSAoYnl0ZSkgaTsKKyAgICAgICAgaSA9IChpbnQpIGw7CisgICAgICAgIGRhdGFbbGVuZ3RoKytdID0gKGJ5dGUpIChpID4+PiAyNCk7CisgICAgICAgIGRhdGFbbGVuZ3RoKytdID0gKGJ5dGUpIChpID4+PiAxNik7CisgICAgICAgIGRhdGFbbGVuZ3RoKytdID0gKGJ5dGUpIChpID4+PiA4KTsKKyAgICAgICAgZGF0YVtsZW5ndGgrK10gPSAoYnl0ZSkgaTsKKyAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFB1dHMgYW4gVVRGOCBzdHJpbmcgaW50byB0aGlzIGJ5dGUgdmVjdG9yLiBUaGUgYnl0ZSB2ZWN0b3IgaXMKKyAgICAgKiBhdXRvbWF0aWNhbGx5IGVubGFyZ2VkIGlmIG5lY2Vzc2FyeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzCisgICAgICogICAgICAgICAgICBhIFN0cmluZyB3aG9zZSBVVEY4IGVuY29kZWQgbGVuZ3RoIG11c3QgYmUgbGVzcyB0aGFuIDY1NTM2LgorICAgICAqIEByZXR1cm4gdGhpcyBieXRlIHZlY3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnl0ZVZlY3RvciBwdXRVVEY4KGZpbmFsIFN0cmluZyBzKSB7CisgICAgICAgIGludCBjaGFyTGVuZ3RoID0gcy5sZW5ndGgoKTsKKyAgICAgICAgaWYgKGNoYXJMZW5ndGggPiA2NTUzNSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGludCBsZW4gPSBsZW5ndGg7CisgICAgICAgIGlmIChsZW4gKyAyICsgY2hhckxlbmd0aCA+IGRhdGEubGVuZ3RoKSB7CisgICAgICAgICAgICBlbmxhcmdlKDIgKyBjaGFyTGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgICBieXRlW10gZGF0YSA9IHRoaXMuZGF0YTsKKyAgICAgICAgLy8gb3B0aW1pc3RpYyBhbGdvcml0aG06IGluc3RlYWQgb2YgY29tcHV0aW5nIHRoZSBieXRlIGxlbmd0aCBhbmQgdGhlbgorICAgICAgICAvLyBzZXJpYWxpemluZyB0aGUgc3RyaW5nICh3aGljaCByZXF1aXJlcyB0d28gbG9vcHMpLCB3ZSBhc3N1bWUgdGhlIGJ5dGUKKyAgICAgICAgLy8gbGVuZ3RoIGlzIGVxdWFsIHRvIGNoYXIgbGVuZ3RoICh3aGljaCBpcyB0aGUgbW9zdCBmcmVxdWVudCBjYXNlKSwgYW5kCisgICAgICAgIC8vIHdlIHN0YXJ0IHNlcmlhbGl6aW5nIHRoZSBzdHJpbmcgcmlnaHQgYXdheS4gRHVyaW5nIHRoZSBzZXJpYWxpemF0aW9uLAorICAgICAgICAvLyBpZiB3ZSBmaW5kIHRoYXQgdGhpcyBhc3N1bXB0aW9uIGlzIHdyb25nLCB3ZSBjb250aW51ZSB3aXRoIHRoZQorICAgICAgICAvLyBnZW5lcmFsIG1ldGhvZC4KKyAgICAgICAgZGF0YVtsZW4rK10gPSAoYnl0ZSkgKGNoYXJMZW5ndGggPj4+IDgpOworICAgICAgICBkYXRhW2xlbisrXSA9IChieXRlKSBjaGFyTGVuZ3RoOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoYXJMZW5ndGg7ICsraSkgeworICAgICAgICAgICAgY2hhciBjID0gcy5jaGFyQXQoaSk7CisgICAgICAgICAgICBpZiAoYyA+PSAnXDAwMScgJiYgYyA8PSAnXDE3NycpIHsKKyAgICAgICAgICAgICAgICBkYXRhW2xlbisrXSA9IChieXRlKSBjOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsZW5ndGggPSBsZW47CisgICAgICAgICAgICAgICAgcmV0dXJuIGVuY29kZVVURjgocywgaSwgNjU1MzUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGxlbmd0aCA9IGxlbjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHV0cyBhbiBVVEY4IHN0cmluZyBpbnRvIHRoaXMgYnl0ZSB2ZWN0b3IuIFRoZSBieXRlIHZlY3RvciBpcworICAgICAqIGF1dG9tYXRpY2FsbHkgZW5sYXJnZWQgaWYgbmVjZXNzYXJ5LiBUaGUgc3RyaW5nIGxlbmd0aCBpcyBlbmNvZGVkIGluIHR3bworICAgICAqIGJ5dGVzIGJlZm9yZSB0aGUgZW5jb2RlZCBjaGFyYWN0ZXJzLCBpZiB0aGVyZSBpcyBzcGFjZSBmb3IgdGhhdCAoaS5lLiBpZgorICAgICAqIHRoaXMubGVuZ3RoIC0gaSAtIDIgPj0gMCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcworICAgICAqICAgICAgICAgICAgdGhlIFN0cmluZyB0byBlbmNvZGUuCisgICAgICogQHBhcmFtIGkKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIHRvIGVuY29kZS4gVGhlIHByZXZpb3VzCisgICAgICogICAgICAgICAgICBjaGFyYWN0ZXJzIGFyZSBzdXBwb3NlZCB0byBoYXZlIGFscmVhZHkgYmVlbiBlbmNvZGVkLCB1c2luZworICAgICAqICAgICAgICAgICAgb25seSBvbmUgYnl0ZSBwZXIgY2hhcmFjdGVyLgorICAgICAqIEBwYXJhbSBtYXhCeXRlTGVuZ3RoCisgICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBieXRlIGxlbmd0aCBvZiB0aGUgZW5jb2RlZCBzdHJpbmcsIGluY2x1ZGluZyB0aGUKKyAgICAgKiAgICAgICAgICAgIGFscmVhZHkgZW5jb2RlZCBjaGFyYWN0ZXJzLgorICAgICAqIEByZXR1cm4gdGhpcyBieXRlIHZlY3Rvci4KKyAgICAgKi8KKyAgICBCeXRlVmVjdG9yIGVuY29kZVVURjgoZmluYWwgU3RyaW5nIHMsIGludCBpLCBpbnQgbWF4Qnl0ZUxlbmd0aCkgeworICAgICAgICBpbnQgY2hhckxlbmd0aCA9IHMubGVuZ3RoKCk7CisgICAgICAgIGludCBieXRlTGVuZ3RoID0gaTsKKyAgICAgICAgY2hhciBjOworICAgICAgICBmb3IgKGludCBqID0gaTsgaiA8IGNoYXJMZW5ndGg7ICsraikgeworICAgICAgICAgICAgYyA9IHMuY2hhckF0KGopOworICAgICAgICAgICAgaWYgKGMgPj0gJ1wwMDEnICYmIGMgPD0gJ1wxNzcnKSB7CisgICAgICAgICAgICAgICAgYnl0ZUxlbmd0aCsrOworICAgICAgICAgICAgfSBlbHNlIGlmIChjID4gJ1x1MDdGRicpIHsKKyAgICAgICAgICAgICAgICBieXRlTGVuZ3RoICs9IDM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJ5dGVMZW5ndGggKz0gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoYnl0ZUxlbmd0aCA+IG1heEJ5dGVMZW5ndGgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgc3RhcnQgPSBsZW5ndGggLSBpIC0gMjsKKyAgICAgICAgaWYgKHN0YXJ0ID49IDApIHsKKyAgICAgICAgICAgIGRhdGFbc3RhcnRdID0gKGJ5dGUpIChieXRlTGVuZ3RoID4+PiA4KTsKKyAgICAgICAgICAgIGRhdGFbc3RhcnQgKyAxXSA9IChieXRlKSBieXRlTGVuZ3RoOworICAgICAgICB9CisgICAgICAgIGlmIChsZW5ndGggKyBieXRlTGVuZ3RoIC0gaSA+IGRhdGEubGVuZ3RoKSB7CisgICAgICAgICAgICBlbmxhcmdlKGJ5dGVMZW5ndGggLSBpKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgbGVuID0gbGVuZ3RoOworICAgICAgICBmb3IgKGludCBqID0gaTsgaiA8IGNoYXJMZW5ndGg7ICsraikgeworICAgICAgICAgICAgYyA9IHMuY2hhckF0KGopOworICAgICAgICAgICAgaWYgKGMgPj0gJ1wwMDEnICYmIGMgPD0gJ1wxNzcnKSB7CisgICAgICAgICAgICAgICAgZGF0YVtsZW4rK10gPSAoYnl0ZSkgYzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA+ICdcdTA3RkYnKSB7CisgICAgICAgICAgICAgICAgZGF0YVtsZW4rK10gPSAoYnl0ZSkgKDB4RTAgfCBjID4+IDEyICYgMHhGKTsKKyAgICAgICAgICAgICAgICBkYXRhW2xlbisrXSA9IChieXRlKSAoMHg4MCB8IGMgPj4gNiAmIDB4M0YpOworICAgICAgICAgICAgICAgIGRhdGFbbGVuKytdID0gKGJ5dGUpICgweDgwIHwgYyAmIDB4M0YpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkYXRhW2xlbisrXSA9IChieXRlKSAoMHhDMCB8IGMgPj4gNiAmIDB4MUYpOworICAgICAgICAgICAgICAgIGRhdGFbbGVuKytdID0gKGJ5dGUpICgweDgwIHwgYyAmIDB4M0YpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGxlbmd0aCA9IGxlbjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHV0cyBhbiBhcnJheSBvZiBieXRlcyBpbnRvIHRoaXMgYnl0ZSB2ZWN0b3IuIFRoZSBieXRlIHZlY3RvciBpcworICAgICAqIGF1dG9tYXRpY2FsbHkgZW5sYXJnZWQgaWYgbmVjZXNzYXJ5LgorICAgICAqCisgICAgICogQHBhcmFtIGIKKyAgICAgKiAgICAgICAgICAgIGFuIGFycmF5IG9mIGJ5dGVzLiBNYXkgYmUgPHR0Pm51bGw8L3R0PiB0byBwdXQgPHR0PmxlbjwvdHQ+CisgICAgICogICAgICAgICAgICBudWxsIGJ5dGVzIGludG8gdGhpcyBieXRlIHZlY3Rvci4KKyAgICAgKiBAcGFyYW0gb2ZmCisgICAgICogICAgICAgICAgICBpbmRleCBvZiB0aGUgZmlzdCBieXRlIG9mIGIgdGhhdCBtdXN0IGJlIGNvcGllZC4KKyAgICAgKiBAcGFyYW0gbGVuCisgICAgICogICAgICAgICAgICBudW1iZXIgb2YgYnl0ZXMgb2YgYiB0aGF0IG11c3QgYmUgY29waWVkLgorICAgICAqIEByZXR1cm4gdGhpcyBieXRlIHZlY3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQnl0ZVZlY3RvciBwdXRCeXRlQXJyYXkoZmluYWwgYnl0ZVtdIGIsIGZpbmFsIGludCBvZmYsIGZpbmFsIGludCBsZW4pIHsKKyAgICAgICAgaWYgKGxlbmd0aCArIGxlbiA+IGRhdGEubGVuZ3RoKSB7CisgICAgICAgICAgICBlbmxhcmdlKGxlbik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGIgIT0gbnVsbCkgeworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShiLCBvZmYsIGRhdGEsIGxlbmd0aCwgbGVuKTsKKyAgICAgICAgfQorICAgICAgICBsZW5ndGggKz0gbGVuOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmxhcmdlIHRoaXMgYnl0ZSB2ZWN0b3Igc28gdGhhdCBpdCBjYW4gcmVjZWl2ZSBuIG1vcmUgYnl0ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2l6ZQorICAgICAqICAgICAgICAgICAgbnVtYmVyIG9mIGFkZGl0aW9uYWwgYnl0ZXMgdGhhdCB0aGlzIGJ5dGUgdmVjdG9yIHNob3VsZCBiZQorICAgICAqICAgICAgICAgICAgYWJsZSB0byByZWNlaXZlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBlbmxhcmdlKGZpbmFsIGludCBzaXplKSB7CisgICAgICAgIGludCBsZW5ndGgxID0gMiAqIGRhdGEubGVuZ3RoOworICAgICAgICBpbnQgbGVuZ3RoMiA9IGxlbmd0aCArIHNpemU7CisgICAgICAgIGJ5dGVbXSBuZXdEYXRhID0gbmV3IGJ5dGVbbGVuZ3RoMSA+IGxlbmd0aDIgPyBsZW5ndGgxIDogbGVuZ3RoMl07CisgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZGF0YSwgMCwgbmV3RGF0YSwgMCwgbGVuZ3RoKTsKKyAgICAgICAgZGF0YSA9IG5ld0RhdGE7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9qZXJzZXkvcmVwYWNrYWdlZC9vcmcvb2JqZWN0d2ViL2FzbS9DbGFzc1JlYWRlci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9qZXJzZXkvcmVwYWNrYWdlZC9vcmcvb2JqZWN0d2ViL2FzbS9DbGFzc1JlYWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNjYyNzQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL2plcnNleS9yZXBhY2thZ2VkL29yZy9vYmplY3R3ZWIvYXNtL0NsYXNzUmVhZGVyLmphdmEKQEAgLTAsMCArMSwyNTA3IEBACisvKioqCisgKiBBU006IGEgdmVyeSBzbWFsbCBhbmQgZmFzdCBKYXZhIGJ5dGVjb2RlIG1hbmlwdWxhdGlvbiBmcmFtZXdvcmsKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDExIElOUklBLCBGcmFuY2UgVGVsZWNvbQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIGplcnNleS5yZXBhY2thZ2VkLm9yZy5vYmplY3R3ZWIuYXNtOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworCisvKioKKyAqIEEgSmF2YSBjbGFzcyBwYXJzZXIgdG8gbWFrZSBhIHtAbGluayBDbGFzc1Zpc2l0b3J9IHZpc2l0IGFuIGV4aXN0aW5nIGNsYXNzLgorICogVGhpcyBjbGFzcyBwYXJzZXMgYSBieXRlIGFycmF5IGNvbmZvcm1pbmcgdG8gdGhlIEphdmEgY2xhc3MgZmlsZSBmb3JtYXQgYW5kCisgKiBjYWxscyB0aGUgYXBwcm9wcmlhdGUgdmlzaXQgbWV0aG9kcyBvZiBhIGdpdmVuIGNsYXNzIHZpc2l0b3IgZm9yIGVhY2ggZmllbGQsCisgKiBtZXRob2QgYW5kIGJ5dGVjb2RlIGluc3RydWN0aW9uIGVuY291bnRlcmVkLgorICoKKyAqIEBhdXRob3IgRXJpYyBCcnVuZXRvbgorICogQGF1dGhvciBFdWdlbmUgS3VsZXNob3YKKyAqLworcHVibGljIGNsYXNzIENsYXNzUmVhZGVyIHsKKworICAgIC8qKgorICAgICAqIFRydWUgdG8gZW5hYmxlIHNpZ25hdHVyZXMgc3VwcG9ydC4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBTSUdOQVRVUkVTID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIFRydWUgdG8gZW5hYmxlIGFubm90YXRpb25zIHN1cHBvcnQuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gQU5OT1RBVElPTlMgPSB0cnVlOworCisgICAgLyoqCisgICAgICogVHJ1ZSB0byBlbmFibGUgc3RhY2sgbWFwIGZyYW1lcyBzdXBwb3J0LgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIEZSQU1FUyA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBUcnVlIHRvIGVuYWJsZSBieXRlY29kZSB3cml0aW5nIHN1cHBvcnQuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gV1JJVEVSID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIFRydWUgdG8gZW5hYmxlIEpTUl9XIGFuZCBHT1RPX1cgc3VwcG9ydC4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBSRVNJWkUgPSB0cnVlOworCisgICAgLyoqCisgICAgICogRmxhZyB0byBza2lwIG1ldGhvZCBjb2RlLiBJZiB0aGlzIGNsYXNzIGlzIHNldCA8Y29kZT5DT0RFPC9jb2RlPgorICAgICAqIGF0dHJpYnV0ZSB3b24ndCBiZSB2aXNpdGVkLiBUaGlzIGNhbiBiZSB1c2VkLCBmb3IgZXhhbXBsZSwgdG8gcmV0cmlldmUKKyAgICAgKiBhbm5vdGF0aW9ucyBmb3IgbWV0aG9kcyBhbmQgbWV0aG9kIHBhcmFtZXRlcnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0tJUF9DT0RFID0gMTsKKworICAgIC8qKgorICAgICAqIEZsYWcgdG8gc2tpcCB0aGUgZGVidWcgaW5mb3JtYXRpb24gaW4gdGhlIGNsYXNzLiBJZiB0aGlzIGZsYWcgaXMgc2V0IHRoZQorICAgICAqIGRlYnVnIGluZm9ybWF0aW9uIG9mIHRoZSBjbGFzcyBpcyBub3QgdmlzaXRlZCwgaS5lLiB0aGUKKyAgICAgKiB7QGxpbmsgTWV0aG9kVmlzaXRvciN2aXNpdExvY2FsVmFyaWFibGUgdmlzaXRMb2NhbFZhcmlhYmxlfSBhbmQKKyAgICAgKiB7QGxpbmsgTWV0aG9kVmlzaXRvciN2aXNpdExpbmVOdW1iZXIgdmlzaXRMaW5lTnVtYmVyfSBtZXRob2RzIHdpbGwgbm90IGJlCisgICAgICogY2FsbGVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNLSVBfREVCVUcgPSAyOworCisgICAgLyoqCisgICAgICogRmxhZyB0byBza2lwIHRoZSBzdGFjayBtYXAgZnJhbWVzIGluIHRoZSBjbGFzcy4gSWYgdGhpcyBmbGFnIGlzIHNldCB0aGUKKyAgICAgKiBzdGFjayBtYXAgZnJhbWVzIG9mIHRoZSBjbGFzcyBpcyBub3QgdmlzaXRlZCwgaS5lLiB0aGUKKyAgICAgKiB7QGxpbmsgTWV0aG9kVmlzaXRvciN2aXNpdEZyYW1lIHZpc2l0RnJhbWV9IG1ldGhvZCB3aWxsIG5vdCBiZSBjYWxsZWQuCisgICAgICogVGhpcyBmbGFnIGlzIHVzZWZ1bCB3aGVuIHRoZSB7QGxpbmsgQ2xhc3NXcml0ZXIjQ09NUFVURV9GUkFNRVN9IG9wdGlvbiBpcworICAgICAqIHVzZWQ6IGl0IGF2b2lkcyB2aXNpdGluZyBmcmFtZXMgdGhhdCB3aWxsIGJlIGlnbm9yZWQgYW5kIHJlY29tcHV0ZWQgZnJvbQorICAgICAqIHNjcmF0Y2ggaW4gdGhlIGNsYXNzIHdyaXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTS0lQX0ZSQU1FUyA9IDQ7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIHRvIGV4cGFuZCB0aGUgc3RhY2sgbWFwIGZyYW1lcy4gQnkgZGVmYXVsdCBzdGFjayBtYXAgZnJhbWVzIGFyZQorICAgICAqIHZpc2l0ZWQgaW4gdGhlaXIgb3JpZ2luYWwgZm9ybWF0IChpLmUuICJleHBhbmRlZCIgZm9yIGNsYXNzZXMgd2hvc2UKKyAgICAgKiB2ZXJzaW9uIGlzIGxlc3MgdGhhbiBWMV82LCBhbmQgImNvbXByZXNzZWQiIGZvciB0aGUgb3RoZXIgY2xhc3NlcykuIElmCisgICAgICogdGhpcyBmbGFnIGlzIHNldCwgc3RhY2sgbWFwIGZyYW1lcyBhcmUgYWx3YXlzIHZpc2l0ZWQgaW4gZXhwYW5kZWQgZm9ybWF0CisgICAgICogKHRoaXMgb3B0aW9uIGFkZHMgYSBkZWNvbXByZXNzaW9uL3JlY29tcHJlc3Npb24gc3RlcCBpbiBDbGFzc1JlYWRlciBhbmQKKyAgICAgKiBDbGFzc1dyaXRlciB3aGljaCBkZWdyYWRlcyBwZXJmb3JtYW5jZXMgcXVpdGUgYSBsb3QpLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVYUEFORF9GUkFNRVMgPSA4OworCisgICAgLyoqCisgICAgICogVGhlIGNsYXNzIHRvIGJlIHBhcnNlZC4gPGk+VGhlIGNvbnRlbnQgb2YgdGhpcyBhcnJheSBtdXN0IG5vdCBiZQorICAgICAqIG1vZGlmaWVkLiBUaGlzIGZpZWxkIGlzIGludGVuZGVkIGZvciB7QGxpbmsgQXR0cmlidXRlfSBzdWIgY2xhc3NlcywgYW5kCisgICAgICogaXMgbm9ybWFsbHkgbm90IG5lZWRlZCBieSBjbGFzcyBnZW5lcmF0b3JzIG9yIGFkYXB0ZXJzLjwvaT4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgYnl0ZVtdIGI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3RhcnQgaW5kZXggb2YgZWFjaCBjb25zdGFudCBwb29sIGl0ZW0gaW4ge0BsaW5rICNiIGJ9LCBwbHVzIG9uZS4gVGhlCisgICAgICogb25lIGJ5dGUgb2Zmc2V0IHNraXBzIHRoZSBjb25zdGFudCBwb29sIGl0ZW0gdGFnIHRoYXQgaW5kaWNhdGVzIGl0cyB0eXBlLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgaW50W10gaXRlbXM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgU3RyaW5nIG9iamVjdHMgY29ycmVzcG9uZGluZyB0byB0aGUgQ09OU1RBTlRfVXRmOCBpdGVtcy4gVGhpcyBjYWNoZQorICAgICAqIGF2b2lkcyBtdWx0aXBsZSBwYXJzaW5nIG9mIGEgZ2l2ZW4gQ09OU1RBTlRfVXRmOCBjb25zdGFudCBwb29sIGl0ZW0sCisgICAgICogd2hpY2ggR1JFQVRMWSBpbXByb3ZlcyBwZXJmb3JtYW5jZXMgKGJ5IGEgZmFjdG9yIDIgdG8gMykuIFRoaXMgY2FjaGluZworICAgICAqIHN0cmF0ZWd5IGNvdWxkIGJlIGV4dGVuZGVkIHRvIGFsbCBjb25zdGFudCBwb29sIGl0ZW1zLCBidXQgaXRzIGJlbmVmaXQKKyAgICAgKiB3b3VsZCBub3QgYmUgc28gZ3JlYXQgZm9yIHRoZXNlIGl0ZW1zIChiZWNhdXNlIHRoZXkgYXJlIG11Y2ggbGVzcworICAgICAqIGV4cGVuc2l2ZSB0byBwYXJzZSB0aGFuIENPTlNUQU5UX1V0ZjggaXRlbXMpLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nW10gc3RyaW5nczsKKworICAgIC8qKgorICAgICAqIE1heGltdW0gbGVuZ3RoIG9mIHRoZSBzdHJpbmdzIGNvbnRhaW5lZCBpbiB0aGUgY29uc3RhbnQgcG9vbCBvZiB0aGUKKyAgICAgKiBjbGFzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGludCBtYXhTdHJpbmdMZW5ndGg7CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBpbmRleCBvZiB0aGUgY2xhc3MgaGVhZGVyIGluZm9ybWF0aW9uIChhY2Nlc3MsIG5hbWUuLi4pIGluCisgICAgICoge0BsaW5rICNiIGJ9LgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBpbnQgaGVhZGVyOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gQ29uc3RydWN0b3JzCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBDbGFzc1JlYWRlcn0gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGIKKyAgICAgKiAgICAgICAgICAgIHRoZSBieXRlY29kZSBvZiB0aGUgY2xhc3MgdG8gYmUgcmVhZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NSZWFkZXIoZmluYWwgYnl0ZVtdIGIpIHsKKyAgICAgICAgdGhpcyhiLCAwLCBiLmxlbmd0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgQ2xhc3NSZWFkZXJ9IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZWNvZGUgb2YgdGhlIGNsYXNzIHRvIGJlIHJlYWQuCisgICAgICogQHBhcmFtIG9mZgorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IG9mZnNldCBvZiB0aGUgY2xhc3MgZGF0YS4KKyAgICAgKiBAcGFyYW0gbGVuCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBjbGFzcyBkYXRhLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzc1JlYWRlcihmaW5hbCBieXRlW10gYiwgZmluYWwgaW50IG9mZiwgZmluYWwgaW50IGxlbikgeworICAgICAgICB0aGlzLmIgPSBiOworICAgICAgICAvLyBjaGVja3MgdGhlIGNsYXNzIHZlcnNpb24KKyAgICAgICAgLy8gYWRkZWQgInN1cHBvcnQiIGZvciBqYXZhIDExIGNvbXBpbGVkIGNsYXNzZXMKKyAgICAgICAgaWYgKHJlYWRTaG9ydChvZmYgKyA2KSA+IE9wY29kZXMuVjExKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gcGFyc2VzIHRoZSBjb25zdGFudCBwb29sCisgICAgICAgIGl0ZW1zID0gbmV3IGludFtyZWFkVW5zaWduZWRTaG9ydChvZmYgKyA4KV07CisgICAgICAgIGludCBuID0gaXRlbXMubGVuZ3RoOworICAgICAgICBzdHJpbmdzID0gbmV3IFN0cmluZ1tuXTsKKyAgICAgICAgaW50IG1heCA9IDA7CisgICAgICAgIGludCBpbmRleCA9IG9mZiArIDEwOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IG47ICsraSkgeworICAgICAgICAgICAgaXRlbXNbaV0gPSBpbmRleCArIDE7CisgICAgICAgICAgICBpbnQgc2l6ZTsKKyAgICAgICAgICAgIHN3aXRjaCAoYltpbmRleF0pIHsKKyAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLkZJRUxEOgorICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuTUVUSDoKKyAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLklNRVRIOgorICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuSU5UOgorICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuRkxPQVQ6CisgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5OQU1FX1RZUEU6CisgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5JTkRZOgorICAgICAgICAgICAgICAgICAgICBzaXplID0gNTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5MT05HOgorICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuRE9VQkxFOgorICAgICAgICAgICAgICAgICAgICBzaXplID0gOTsKKyAgICAgICAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLlVURjg6CisgICAgICAgICAgICAgICAgICAgIHNpemUgPSAzICsgcmVhZFVuc2lnbmVkU2hvcnQoaW5kZXggKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPiBtYXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heCA9IHNpemU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5IQU5ETEU6CisgICAgICAgICAgICAgICAgICAgIHNpemUgPSA0OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAvLyBjYXNlIENsYXNzV3JpdGVyLkNMQVNTOgorICAgICAgICAgICAgICAgIC8vIGNhc2UgQ2xhc3NXcml0ZXIuU1RSOgorICAgICAgICAgICAgICAgIC8vIGNhc2UgQ2xhc3NXcml0ZXIuTVRZUEUKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBzaXplID0gMzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbmRleCArPSBzaXplOworICAgICAgICB9CisgICAgICAgIG1heFN0cmluZ0xlbmd0aCA9IG1heDsKKyAgICAgICAgLy8gdGhlIGNsYXNzIGhlYWRlciBpbmZvcm1hdGlvbiBzdGFydHMganVzdCBhZnRlciB0aGUgY29uc3RhbnQgcG9vbAorICAgICAgICBoZWFkZXIgPSBpbmRleDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjbGFzcydzIGFjY2VzcyBmbGFncyAoc2VlIHtAbGluayBPcGNvZGVzfSkuIFRoaXMgdmFsdWUgbWF5CisgICAgICogbm90IHJlZmxlY3QgRGVwcmVjYXRlZCBhbmQgU3ludGhldGljIGZsYWdzIHdoZW4gYnl0ZWNvZGUgaXMgYmVmb3JlIDEuNQorICAgICAqIGFuZCB0aG9zZSBmbGFncyBhcmUgcmVwcmVzZW50ZWQgYnkgYXR0cmlidXRlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGNsYXNzIGFjY2VzcyBmbGFncworICAgICAqCisgICAgICogQHNlZSBDbGFzc1Zpc2l0b3IjdmlzaXQoaW50LCBpbnQsIFN0cmluZywgU3RyaW5nLCBTdHJpbmcsIFN0cmluZ1tdKQorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0QWNjZXNzKCkgeworICAgICAgICByZXR1cm4gcmVhZFVuc2lnbmVkU2hvcnQoaGVhZGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBpbnRlcm5hbCBuYW1lIG9mIHRoZSBjbGFzcyAoc2VlCisgICAgICoge0BsaW5rIFR5cGUjZ2V0SW50ZXJuYWxOYW1lKCkgZ2V0SW50ZXJuYWxOYW1lfSkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBpbnRlcm5hbCBjbGFzcyBuYW1lCisgICAgICoKKyAgICAgKiBAc2VlIENsYXNzVmlzaXRvciN2aXNpdChpbnQsIGludCwgU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgU3RyaW5nW10pCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7CisgICAgICAgIHJldHVybiByZWFkQ2xhc3MoaGVhZGVyICsgMiwgbmV3IGNoYXJbbWF4U3RyaW5nTGVuZ3RoXSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgaW50ZXJuYWwgb2YgbmFtZSBvZiB0aGUgc3VwZXIgY2xhc3MgKHNlZQorICAgICAqIHtAbGluayBUeXBlI2dldEludGVybmFsTmFtZSgpIGdldEludGVybmFsTmFtZX0pLiBGb3IgaW50ZXJmYWNlcywgdGhlCisgICAgICogc3VwZXIgY2xhc3MgaXMge0BsaW5rIE9iamVjdH0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBpbnRlcm5hbCBuYW1lIG9mIHN1cGVyIGNsYXNzLCBvciA8dHQ+bnVsbDwvdHQ+IGZvcgorICAgICAqICAgICAgICAge0BsaW5rIE9iamVjdH0gY2xhc3MuCisgICAgICoKKyAgICAgKiBAc2VlIENsYXNzVmlzaXRvciN2aXNpdChpbnQsIGludCwgU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgU3RyaW5nW10pCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTdXBlck5hbWUoKSB7CisgICAgICAgIHJldHVybiByZWFkQ2xhc3MoaGVhZGVyICsgNCwgbmV3IGNoYXJbbWF4U3RyaW5nTGVuZ3RoXSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgaW50ZXJuYWwgbmFtZXMgb2YgdGhlIGNsYXNzJ3MgaW50ZXJmYWNlcyAoc2VlCisgICAgICoge0BsaW5rIFR5cGUjZ2V0SW50ZXJuYWxOYW1lKCkgZ2V0SW50ZXJuYWxOYW1lfSkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBpbnRlcm5hbCBuYW1lcyBmb3IgYWxsIGltcGxlbWVudGVkIGludGVyZmFjZXMgb3IKKyAgICAgKiAgICAgICAgIDx0dD5udWxsPC90dD4uCisgICAgICoKKyAgICAgKiBAc2VlIENsYXNzVmlzaXRvciN2aXNpdChpbnQsIGludCwgU3RyaW5nLCBTdHJpbmcsIFN0cmluZywgU3RyaW5nW10pCisgICAgICovCisgICAgcHVibGljIFN0cmluZ1tdIGdldEludGVyZmFjZXMoKSB7CisgICAgICAgIGludCBpbmRleCA9IGhlYWRlciArIDY7CisgICAgICAgIGludCBuID0gcmVhZFVuc2lnbmVkU2hvcnQoaW5kZXgpOworICAgICAgICBTdHJpbmdbXSBpbnRlcmZhY2VzID0gbmV3IFN0cmluZ1tuXTsKKyAgICAgICAgaWYgKG4gPiAwKSB7CisgICAgICAgICAgICBjaGFyW10gYnVmID0gbmV3IGNoYXJbbWF4U3RyaW5nTGVuZ3RoXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKSB7CisgICAgICAgICAgICAgICAgaW5kZXggKz0gMjsKKyAgICAgICAgICAgICAgICBpbnRlcmZhY2VzW2ldID0gcmVhZENsYXNzKGluZGV4LCBidWYpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBpbnRlcmZhY2VzOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvcGllcyB0aGUgY29uc3RhbnQgcG9vbCBkYXRhIGludG8gdGhlIGdpdmVuIHtAbGluayBDbGFzc1dyaXRlcn0uIFNob3VsZAorICAgICAqIGJlIGNhbGxlZCBiZWZvcmUgdGhlIHtAbGluayAjYWNjZXB0KENsYXNzVmlzaXRvcixpbnQpfSBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhc3NXcml0ZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSB7QGxpbmsgQ2xhc3NXcml0ZXJ9IHRvIGNvcHkgY29uc3RhbnQgcG9vbCBpbnRvLgorICAgICAqLworICAgIHZvaWQgY29weVBvb2woZmluYWwgQ2xhc3NXcml0ZXIgY2xhc3NXcml0ZXIpIHsKKyAgICAgICAgY2hhcltdIGJ1ZiA9IG5ldyBjaGFyW21heFN0cmluZ0xlbmd0aF07CisgICAgICAgIGludCBsbCA9IGl0ZW1zLmxlbmd0aDsKKyAgICAgICAgSXRlbVtdIGl0ZW1zMiA9IG5ldyBJdGVtW2xsXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBsbDsgaSsrKSB7CisgICAgICAgICAgICBpbnQgaW5kZXggPSBpdGVtc1tpXTsKKyAgICAgICAgICAgIGludCB0YWcgPSBiW2luZGV4IC0gMV07CisgICAgICAgICAgICBJdGVtIGl0ZW0gPSBuZXcgSXRlbShpKTsKKyAgICAgICAgICAgIGludCBuYW1lVHlwZTsKKyAgICAgICAgICAgIHN3aXRjaCAodGFnKSB7CisgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5GSUVMRDoKKyAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLk1FVEg6CisgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5JTUVUSDoKKyAgICAgICAgICAgICAgICAgICAgbmFtZVR5cGUgPSBpdGVtc1tyZWFkVW5zaWduZWRTaG9ydChpbmRleCArIDIpXTsKKyAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXQodGFnLCByZWFkQ2xhc3MoaW5kZXgsIGJ1ZiksIHJlYWRVVEY4KG5hbWVUeXBlLCBidWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRVVEY4KG5hbWVUeXBlICsgMiwgYnVmKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuSU5UOgorICAgICAgICAgICAgICAgICAgICBpdGVtLnNldChyZWFkSW50KGluZGV4KSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuRkxPQVQ6CisgICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0KEZsb2F0LmludEJpdHNUb0Zsb2F0KHJlYWRJbnQoaW5kZXgpKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuTkFNRV9UWVBFOgorICAgICAgICAgICAgICAgICAgICBpdGVtLnNldCh0YWcsIHJlYWRVVEY4KGluZGV4LCBidWYpLCByZWFkVVRGOChpbmRleCArIDIsIGJ1ZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuTE9ORzoKKyAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXQocmVhZExvbmcoaW5kZXgpKTsKKyAgICAgICAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLkRPVUJMRToKKyAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXQoRG91YmxlLmxvbmdCaXRzVG9Eb3VibGUocmVhZExvbmcoaW5kZXgpKSk7CisgICAgICAgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5VVEY4OiB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzID0gc3RyaW5nc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpdGVtc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHMgPSBzdHJpbmdzW2ldID0gcmVhZFVURihpbmRleCArIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRVbnNpZ25lZFNob3J0KGluZGV4KSwgYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpdGVtLnNldCh0YWcsIHMsIG51bGwsIG51bGwpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5IQU5ETEU6IHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGZpZWxkT3JNZXRob2RSZWYgPSBpdGVtc1tyZWFkVW5zaWduZWRTaG9ydChpbmRleCArIDEpXTsKKyAgICAgICAgICAgICAgICAgICAgbmFtZVR5cGUgPSBpdGVtc1tyZWFkVW5zaWduZWRTaG9ydChmaWVsZE9yTWV0aG9kUmVmICsgMildOworICAgICAgICAgICAgICAgICAgICBpdGVtLnNldChDbGFzc1dyaXRlci5IQU5ETEVfQkFTRSArIHJlYWRCeXRlKGluZGV4KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkQ2xhc3MoZmllbGRPck1ldGhvZFJlZiwgYnVmKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkVVRGOChuYW1lVHlwZSwgYnVmKSwgcmVhZFVURjgobmFtZVR5cGUgKyAyLCBidWYpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuSU5EWToKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsYXNzV3JpdGVyLmJvb3RzdHJhcE1ldGhvZHMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29weUJvb3RzdHJhcE1ldGhvZHMoY2xhc3NXcml0ZXIsIGl0ZW1zMiwgYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBuYW1lVHlwZSA9IGl0ZW1zW3JlYWRVbnNpZ25lZFNob3J0KGluZGV4ICsgMildOworICAgICAgICAgICAgICAgICAgICBpdGVtLnNldChyZWFkVVRGOChuYW1lVHlwZSwgYnVmKSwgcmVhZFVURjgobmFtZVR5cGUgKyAyLCBidWYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRVbnNpZ25lZFNob3J0KGluZGV4KSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIC8vIGNhc2UgQ2xhc3NXcml0ZXIuU1RSOgorICAgICAgICAgICAgICAgIC8vIGNhc2UgQ2xhc3NXcml0ZXIuQ0xBU1M6CisgICAgICAgICAgICAgICAgLy8gY2FzZSBDbGFzc1dyaXRlci5NVFlQRQorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0KHRhZywgcmVhZFVURjgoaW5kZXgsIGJ1ZiksIG51bGwsIG51bGwpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IGluZGV4MiA9IGl0ZW0uaGFzaENvZGUgJSBpdGVtczIubGVuZ3RoOworICAgICAgICAgICAgaXRlbS5uZXh0ID0gaXRlbXMyW2luZGV4Ml07CisgICAgICAgICAgICBpdGVtczJbaW5kZXgyXSA9IGl0ZW07CisgICAgICAgIH0KKworICAgICAgICBpbnQgb2ZmID0gaXRlbXNbMV0gLSAxOworICAgICAgICBjbGFzc1dyaXRlci5wb29sLnB1dEJ5dGVBcnJheShiLCBvZmYsIGhlYWRlciAtIG9mZik7CisgICAgICAgIGNsYXNzV3JpdGVyLml0ZW1zID0gaXRlbXMyOworICAgICAgICBjbGFzc1dyaXRlci50aHJlc2hvbGQgPSAoaW50KSAoMC43NWQgKiBsbCk7CisgICAgICAgIGNsYXNzV3JpdGVyLmluZGV4ID0gbGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29waWVzIHRoZSBib290c3RyYXAgbWV0aG9kIGRhdGEgaW50byB0aGUgZ2l2ZW4ge0BsaW5rIENsYXNzV3JpdGVyfS4KKyAgICAgKiBTaG91bGQgYmUgY2FsbGVkIGJlZm9yZSB0aGUge0BsaW5rICNhY2NlcHQoQ2xhc3NWaXNpdG9yLGludCl9IG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGFzc1dyaXRlcgorICAgICAqICAgICAgICAgICAgdGhlIHtAbGluayBDbGFzc1dyaXRlcn0gdG8gY29weSBib290c3RyYXAgbWV0aG9kcyBpbnRvLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjb3B5Qm9vdHN0cmFwTWV0aG9kcyhmaW5hbCBDbGFzc1dyaXRlciBjbGFzc1dyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSXRlbVtdIGl0ZW1zLCBmaW5hbCBjaGFyW10gYykgeworICAgICAgICAvLyBmaW5kcyB0aGUgIkJvb3RzdHJhcE1ldGhvZHMiIGF0dHJpYnV0ZQorICAgICAgICBpbnQgdSA9IGdldEF0dHJpYnV0ZXMoKTsKKyAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gcmVhZFVuc2lnbmVkU2hvcnQodSk7IGkgPiAwOyAtLWkpIHsKKyAgICAgICAgICAgIFN0cmluZyBhdHRyTmFtZSA9IHJlYWRVVEY4KHUgKyAyLCBjKTsKKyAgICAgICAgICAgIGlmICgiQm9vdHN0cmFwTWV0aG9kcyIuZXF1YWxzKGF0dHJOYW1lKSkgeworICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHUgKz0gNiArIHJlYWRJbnQodSArIDQpOworICAgICAgICB9CisgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBjb3BpZXMgdGhlIGJvb3RzdHJhcCBtZXRob2RzIGluIHRoZSBjbGFzcyB3cml0ZXIKKyAgICAgICAgaW50IGJvb3N0cmFwTWV0aG9kQ291bnQgPSByZWFkVW5zaWduZWRTaG9ydCh1ICsgOCk7CisgICAgICAgIGZvciAoaW50IGogPSAwLCB2ID0gdSArIDEwOyBqIDwgYm9vc3RyYXBNZXRob2RDb3VudDsgaisrKSB7CisgICAgICAgICAgICBpbnQgcG9zaXRpb24gPSB2IC0gdSAtIDEwOworICAgICAgICAgICAgaW50IGhhc2hDb2RlID0gcmVhZENvbnN0KHJlYWRVbnNpZ25lZFNob3J0KHYpLCBjKS5oYXNoQ29kZSgpOworICAgICAgICAgICAgZm9yIChpbnQgayA9IHJlYWRVbnNpZ25lZFNob3J0KHYgKyAyKTsgayA+IDA7IC0taykgeworICAgICAgICAgICAgICAgIGhhc2hDb2RlIF49IHJlYWRDb25zdChyZWFkVW5zaWduZWRTaG9ydCh2ICsgNCksIGMpLmhhc2hDb2RlKCk7CisgICAgICAgICAgICAgICAgdiArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdiArPSA0OworICAgICAgICAgICAgSXRlbSBpdGVtID0gbmV3IEl0ZW0oaik7CisgICAgICAgICAgICBpdGVtLnNldChwb3NpdGlvbiwgaGFzaENvZGUgJiAweDdGRkZGRkZGKTsKKyAgICAgICAgICAgIGludCBpbmRleCA9IGl0ZW0uaGFzaENvZGUgJSBpdGVtcy5sZW5ndGg7CisgICAgICAgICAgICBpdGVtLm5leHQgPSBpdGVtc1tpbmRleF07CisgICAgICAgICAgICBpdGVtc1tpbmRleF0gPSBpdGVtOworICAgICAgICB9CisgICAgICAgIGludCBhdHRyU2l6ZSA9IHJlYWRJbnQodSArIDQpOworICAgICAgICBCeXRlVmVjdG9yIGJvb3RzdHJhcE1ldGhvZHMgPSBuZXcgQnl0ZVZlY3RvcihhdHRyU2l6ZSArIDYyKTsKKyAgICAgICAgYm9vdHN0cmFwTWV0aG9kcy5wdXRCeXRlQXJyYXkoYiwgdSArIDEwLCBhdHRyU2l6ZSAtIDIpOworICAgICAgICBjbGFzc1dyaXRlci5ib290c3RyYXBNZXRob2RzQ291bnQgPSBib29zdHJhcE1ldGhvZENvdW50OworICAgICAgICBjbGFzc1dyaXRlci5ib290c3RyYXBNZXRob2RzID0gYm9vdHN0cmFwTWV0aG9kczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBDbGFzc1JlYWRlcn0gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIGlzCisgICAgICogICAgICAgICAgICBhbiBpbnB1dCBzdHJlYW0gZnJvbSB3aGljaCB0byByZWFkIHRoZSBjbGFzcy4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycyBkdXJpbmcgcmVhZGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NSZWFkZXIoZmluYWwgSW5wdXRTdHJlYW0gaXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMocmVhZENsYXNzKGlzLCBmYWxzZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0BsaW5rIENsYXNzUmVhZGVyfSBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGJpbmFyeSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3MgdG8gYmUgcmVhZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYW4gZXhjZXB0aW9uIG9jY3VycyBkdXJpbmcgcmVhZGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NSZWFkZXIoZmluYWwgU3RyaW5nIG5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMocmVhZENsYXNzKAorICAgICAgICAgICAgICAgIENsYXNzTG9hZGVyLmdldFN5c3RlbVJlc291cmNlQXNTdHJlYW0obmFtZS5yZXBsYWNlKCcuJywgJy8nKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLmNsYXNzIiksIHRydWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyB0aGUgYnl0ZWNvZGUgb2YgYSBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpcworICAgICAqICAgICAgICAgICAgYW4gaW5wdXQgc3RyZWFtIGZyb20gd2hpY2ggdG8gcmVhZCB0aGUgY2xhc3MuCisgICAgICogQHBhcmFtIGNsb3NlCisgICAgICogICAgICAgICAgICB0cnVlIHRvIGNsb3NlIHRoZSBpbnB1dCBzdHJlYW0gYWZ0ZXIgcmVhZGluZy4KKyAgICAgKiBAcmV0dXJuIHRoZSBieXRlY29kZSByZWFkIGZyb20gdGhlIGdpdmVuIGlucHV0IHN0cmVhbS4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgYSBwcm9ibGVtIG9jY3VycyBkdXJpbmcgcmVhZGluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBieXRlW10gcmVhZENsYXNzKGZpbmFsIElucHV0U3RyZWFtIGlzLCBib29sZWFuIGNsb3NlKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGlzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiQ2xhc3Mgbm90IGZvdW5kIik7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJ5dGVbXSBiID0gbmV3IGJ5dGVbaXMuYXZhaWxhYmxlKCldOworICAgICAgICAgICAgaW50IGxlbiA9IDA7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIGludCBuID0gaXMucmVhZChiLCBsZW4sIGIubGVuZ3RoIC0gbGVuKTsKKyAgICAgICAgICAgICAgICBpZiAobiA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobGVuIDwgYi5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBjID0gbmV3IGJ5dGVbbGVuXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYiwgMCwgYywgMCwgbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBjOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsZW4gKz0gbjsKKyAgICAgICAgICAgICAgICBpZiAobGVuID09IGIubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBsYXN0ID0gaXMucmVhZCgpOworICAgICAgICAgICAgICAgICAgICBpZiAobGFzdCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBjID0gbmV3IGJ5dGVbYi5sZW5ndGggKyAxMDAwXTsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShiLCAwLCBjLCAwLCBsZW4pOworICAgICAgICAgICAgICAgICAgICBjW2xlbisrXSA9IChieXRlKSBsYXN0OworICAgICAgICAgICAgICAgICAgICBiID0gYzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoY2xvc2UpIHsKKyAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gUHVibGljIG1ldGhvZHMKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIE1ha2VzIHRoZSBnaXZlbiB2aXNpdG9yIHZpc2l0IHRoZSBKYXZhIGNsYXNzIG9mIHRoaXMge0BsaW5rIENsYXNzUmVhZGVyfQorICAgICAqIC4gVGhpcyBjbGFzcyBpcyB0aGUgb25lIHNwZWNpZmllZCBpbiB0aGUgY29uc3RydWN0b3IgKHNlZQorICAgICAqIHtAbGluayAjQ2xhc3NSZWFkZXIoYnl0ZVtdKSBDbGFzc1JlYWRlcn0pLgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzVmlzaXRvcgorICAgICAqICAgICAgICAgICAgdGhlIHZpc2l0b3IgdGhhdCBtdXN0IHZpc2l0IHRoaXMgY2xhc3MuCisgICAgICogQHBhcmFtIGZsYWdzCisgICAgICogICAgICAgICAgICBvcHRpb24gZmxhZ3MgdGhhdCBjYW4gYmUgdXNlZCB0byBtb2RpZnkgdGhlIGRlZmF1bHQgYmVoYXZpb3IKKyAgICAgKiAgICAgICAgICAgIG9mIHRoaXMgY2xhc3MuIFNlZSB7QGxpbmsgI1NLSVBfREVCVUd9LCB7QGxpbmsgI0VYUEFORF9GUkFNRVN9CisgICAgICogICAgICAgICAgICAsIHtAbGluayAjU0tJUF9GUkFNRVN9LCB7QGxpbmsgI1NLSVBfQ09ERX0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWNjZXB0KGZpbmFsIENsYXNzVmlzaXRvciBjbGFzc1Zpc2l0b3IsIGZpbmFsIGludCBmbGFncykgeworICAgICAgICBhY2NlcHQoY2xhc3NWaXNpdG9yLCBuZXcgQXR0cmlidXRlWzBdLCBmbGFncyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFrZXMgdGhlIGdpdmVuIHZpc2l0b3IgdmlzaXQgdGhlIEphdmEgY2xhc3Mgb2YgdGhpcyB7QGxpbmsgQ2xhc3NSZWFkZXJ9LgorICAgICAqIFRoaXMgY2xhc3MgaXMgdGhlIG9uZSBzcGVjaWZpZWQgaW4gdGhlIGNvbnN0cnVjdG9yIChzZWUKKyAgICAgKiB7QGxpbmsgI0NsYXNzUmVhZGVyKGJ5dGVbXSkgQ2xhc3NSZWFkZXJ9KS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGFzc1Zpc2l0b3IKKyAgICAgKiAgICAgICAgICAgIHRoZSB2aXNpdG9yIHRoYXQgbXVzdCB2aXNpdCB0aGlzIGNsYXNzLgorICAgICAqIEBwYXJhbSBhdHRycworICAgICAqICAgICAgICAgICAgcHJvdG90eXBlcyBvZiB0aGUgYXR0cmlidXRlcyB0aGF0IG11c3QgYmUgcGFyc2VkIGR1cmluZyB0aGUKKyAgICAgKiAgICAgICAgICAgIHZpc2l0IG9mIHRoZSBjbGFzcy4gQW55IGF0dHJpYnV0ZSB3aG9zZSB0eXBlIGlzIG5vdCBlcXVhbCB0bworICAgICAqICAgICAgICAgICAgdGhlIHR5cGUgb2Ygb25lIHRoZSBwcm90b3R5cGVzIHdpbGwgbm90IGJlIHBhcnNlZDogaXRzIGJ5dGUKKyAgICAgKiAgICAgICAgICAgIGFycmF5IHZhbHVlIHdpbGwgYmUgcGFzc2VkIHVuY2hhbmdlZCB0byB0aGUgQ2xhc3NXcml0ZXIuCisgICAgICogICAgICAgICAgICA8aT5UaGlzIG1heSBjb3JydXB0IGl0IGlmIHRoaXMgdmFsdWUgY29udGFpbnMgcmVmZXJlbmNlcyB0bworICAgICAqICAgICAgICAgICAgdGhlIGNvbnN0YW50IHBvb2wsIG9yIGhhcyBzeW50YWN0aWMgb3Igc2VtYW50aWMgbGlua3Mgd2l0aCBhCisgICAgICogICAgICAgICAgICBjbGFzcyBlbGVtZW50IHRoYXQgaGFzIGJlZW4gdHJhbnNmb3JtZWQgYnkgYSBjbGFzcyBhZGFwdGVyCisgICAgICogICAgICAgICAgICBiZXR3ZWVuIHRoZSByZWFkZXIgYW5kIHRoZSB3cml0ZXI8L2k+LgorICAgICAqIEBwYXJhbSBmbGFncworICAgICAqICAgICAgICAgICAgb3B0aW9uIGZsYWdzIHRoYXQgY2FuIGJlIHVzZWQgdG8gbW9kaWZ5IHRoZSBkZWZhdWx0IGJlaGF2aW9yCisgICAgICogICAgICAgICAgICBvZiB0aGlzIGNsYXNzLiBTZWUge0BsaW5rICNTS0lQX0RFQlVHfSwge0BsaW5rICNFWFBBTkRfRlJBTUVTfQorICAgICAqICAgICAgICAgICAgLCB7QGxpbmsgI1NLSVBfRlJBTUVTfSwge0BsaW5rICNTS0lQX0NPREV9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFjY2VwdChmaW5hbCBDbGFzc1Zpc2l0b3IgY2xhc3NWaXNpdG9yLAorICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBdHRyaWJ1dGVbXSBhdHRycywgZmluYWwgaW50IGZsYWdzKSB7CisgICAgICAgIGludCB1ID0gaGVhZGVyOyAvLyBjdXJyZW50IG9mZnNldCBpbiB0aGUgY2xhc3MgZmlsZQorICAgICAgICBjaGFyW10gYyA9IG5ldyBjaGFyW21heFN0cmluZ0xlbmd0aF07IC8vIGJ1ZmZlciB1c2VkIHRvIHJlYWQgc3RyaW5ncworCisgICAgICAgIENvbnRleHQgY29udGV4dCA9IG5ldyBDb250ZXh0KCk7CisgICAgICAgIGNvbnRleHQuYXR0cnMgPSBhdHRyczsKKyAgICAgICAgY29udGV4dC5mbGFncyA9IGZsYWdzOworICAgICAgICBjb250ZXh0LmJ1ZmZlciA9IGM7CisKKyAgICAgICAgLy8gcmVhZHMgdGhlIGNsYXNzIGRlY2xhcmF0aW9uCisgICAgICAgIGludCBhY2Nlc3MgPSByZWFkVW5zaWduZWRTaG9ydCh1KTsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSByZWFkQ2xhc3ModSArIDIsIGMpOworICAgICAgICBTdHJpbmcgc3VwZXJDbGFzcyA9IHJlYWRDbGFzcyh1ICsgNCwgYyk7CisgICAgICAgIFN0cmluZ1tdIGludGVyZmFjZXMgPSBuZXcgU3RyaW5nW3JlYWRVbnNpZ25lZFNob3J0KHUgKyA2KV07CisgICAgICAgIHUgKz0gODsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2VzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBpbnRlcmZhY2VzW2ldID0gcmVhZENsYXNzKHUsIGMpOworICAgICAgICAgICAgdSArPSAyOworICAgICAgICB9CisKKyAgICAgICAgLy8gcmVhZHMgdGhlIGNsYXNzIGF0dHJpYnV0ZXMKKyAgICAgICAgU3RyaW5nIHNpZ25hdHVyZSA9IG51bGw7CisgICAgICAgIFN0cmluZyBzb3VyY2VGaWxlID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIHNvdXJjZURlYnVnID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIGVuY2xvc2luZ093bmVyID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIGVuY2xvc2luZ05hbWUgPSBudWxsOworICAgICAgICBTdHJpbmcgZW5jbG9zaW5nRGVzYyA9IG51bGw7CisgICAgICAgIGludCBhbm5zID0gMDsKKyAgICAgICAgaW50IGlhbm5zID0gMDsKKyAgICAgICAgaW50IHRhbm5zID0gMDsKKyAgICAgICAgaW50IGl0YW5ucyA9IDA7CisgICAgICAgIGludCBpbm5lckNsYXNzZXMgPSAwOworICAgICAgICBBdHRyaWJ1dGUgYXR0cmlidXRlcyA9IG51bGw7CisKKyAgICAgICAgdSA9IGdldEF0dHJpYnV0ZXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IHJlYWRVbnNpZ25lZFNob3J0KHUpOyBpID4gMDsgLS1pKSB7CisgICAgICAgICAgICBTdHJpbmcgYXR0ck5hbWUgPSByZWFkVVRGOCh1ICsgMiwgYyk7CisgICAgICAgICAgICAvLyB0ZXN0cyBhcmUgc29ydGVkIGluIGRlY3JlYXNpbmcgZnJlcXVlbmN5IG9yZGVyCisgICAgICAgICAgICAvLyAoYmFzZWQgb24gZnJlcXVlbmNpZXMgb2JzZXJ2ZWQgb24gdHlwaWNhbCBjbGFzc2VzKQorICAgICAgICAgICAgaWYgKCJTb3VyY2VGaWxlIi5lcXVhbHMoYXR0ck5hbWUpKSB7CisgICAgICAgICAgICAgICAgc291cmNlRmlsZSA9IHJlYWRVVEY4KHUgKyA4LCBjKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIklubmVyQ2xhc3NlcyIuZXF1YWxzKGF0dHJOYW1lKSkgeworICAgICAgICAgICAgICAgIGlubmVyQ2xhc3NlcyA9IHUgKyA4OworICAgICAgICAgICAgfSBlbHNlIGlmICgiRW5jbG9zaW5nTWV0aG9kIi5lcXVhbHMoYXR0ck5hbWUpKSB7CisgICAgICAgICAgICAgICAgZW5jbG9zaW5nT3duZXIgPSByZWFkQ2xhc3ModSArIDgsIGMpOworICAgICAgICAgICAgICAgIGludCBpdGVtID0gcmVhZFVuc2lnbmVkU2hvcnQodSArIDEwKTsKKyAgICAgICAgICAgICAgICBpZiAoaXRlbSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGVuY2xvc2luZ05hbWUgPSByZWFkVVRGOChpdGVtc1tpdGVtXSwgYyk7CisgICAgICAgICAgICAgICAgICAgIGVuY2xvc2luZ0Rlc2MgPSByZWFkVVRGOChpdGVtc1tpdGVtXSArIDIsIGMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoU0lHTkFUVVJFUyAmJiAiU2lnbmF0dXJlIi5lcXVhbHMoYXR0ck5hbWUpKSB7CisgICAgICAgICAgICAgICAgc2lnbmF0dXJlID0gcmVhZFVURjgodSArIDgsIGMpOworICAgICAgICAgICAgfSBlbHNlIGlmIChBTk5PVEFUSU9OUworICAgICAgICAgICAgICAgICAgICAgICAmJiAiUnVudGltZVZpc2libGVBbm5vdGF0aW9ucyIuZXF1YWxzKGF0dHJOYW1lKSkgeworICAgICAgICAgICAgICAgIGFubnMgPSB1ICsgODsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoQU5OT1RBVElPTlMKKyAgICAgICAgICAgICAgICAgICAgICAgJiYgIlJ1bnRpbWVWaXNpYmxlVHlwZUFubm90YXRpb25zIi5lcXVhbHMoYXR0ck5hbWUpKSB7CisgICAgICAgICAgICAgICAgdGFubnMgPSB1ICsgODsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIkRlcHJlY2F0ZWQiLmVxdWFscyhhdHRyTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBhY2Nlc3MgfD0gT3Bjb2Rlcy5BQ0NfREVQUkVDQVRFRDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIlN5bnRoZXRpYyIuZXF1YWxzKGF0dHJOYW1lKSkgeworICAgICAgICAgICAgICAgIGFjY2VzcyB8PSBPcGNvZGVzLkFDQ19TWU5USEVUSUMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDbGFzc1dyaXRlci5BQ0NfU1lOVEhFVElDX0FUVFJJQlVURTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIlNvdXJjZURlYnVnRXh0ZW5zaW9uIi5lcXVhbHMoYXR0ck5hbWUpKSB7CisgICAgICAgICAgICAgICAgaW50IGxlbiA9IHJlYWRJbnQodSArIDQpOworICAgICAgICAgICAgICAgIHNvdXJjZURlYnVnID0gcmVhZFVURih1ICsgOCwgbGVuLCBuZXcgY2hhcltsZW5dKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoQU5OT1RBVElPTlMKKyAgICAgICAgICAgICAgICAgICAgICAgJiYgIlJ1bnRpbWVJbnZpc2libGVBbm5vdGF0aW9ucyIuZXF1YWxzKGF0dHJOYW1lKSkgeworICAgICAgICAgICAgICAgIGlhbm5zID0gdSArIDg7CisgICAgICAgICAgICB9IGVsc2UgaWYgKEFOTk9UQVRJT05TCisgICAgICAgICAgICAgICAgICAgICAgICYmICJSdW50aW1lSW52aXNpYmxlVHlwZUFubm90YXRpb25zIi5lcXVhbHMoYXR0ck5hbWUpKSB7CisgICAgICAgICAgICAgICAgaXRhbm5zID0gdSArIDg7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJCb290c3RyYXBNZXRob2RzIi5lcXVhbHMoYXR0ck5hbWUpKSB7CisgICAgICAgICAgICAgICAgaW50W10gYm9vdHN0cmFwTWV0aG9kcyA9IG5ldyBpbnRbcmVhZFVuc2lnbmVkU2hvcnQodSArIDgpXTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMCwgdiA9IHUgKyAxMDsgaiA8IGJvb3RzdHJhcE1ldGhvZHMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgYm9vdHN0cmFwTWV0aG9kc1tqXSA9IHY7CisgICAgICAgICAgICAgICAgICAgIHYgKz0gMiArIHJlYWRVbnNpZ25lZFNob3J0KHYgKyAyKSA8PCAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb250ZXh0LmJvb3RzdHJhcE1ldGhvZHMgPSBib290c3RyYXBNZXRob2RzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBdHRyaWJ1dGUgYXR0ciA9IHJlYWRBdHRyaWJ1dGUoYXR0cnMsIGF0dHJOYW1lLCB1ICsgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRJbnQodSArIDQpLCBjLCAtMSwgbnVsbCk7CisgICAgICAgICAgICAgICAgaWYgKGF0dHIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBhdHRyLm5leHQgPSBhdHRyaWJ1dGVzOworICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gYXR0cjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1ICs9IDYgKyByZWFkSW50KHUgKyA0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZpc2l0cyB0aGUgY2xhc3MgZGVjbGFyYXRpb24KKyAgICAgICAgY2xhc3NWaXNpdG9yLnZpc2l0KHJlYWRJbnQoaXRlbXNbMV0gLSA3KSwgYWNjZXNzLCBuYW1lLCBzaWduYXR1cmUsCisgICAgICAgICAgICAgICAgc3VwZXJDbGFzcywgaW50ZXJmYWNlcyk7CisKKyAgICAgICAgLy8gdmlzaXRzIHRoZSBzb3VyY2UgYW5kIGRlYnVnIGluZm8KKyAgICAgICAgaWYgKChmbGFncyAmIFNLSVBfREVCVUcpID09IDAKKyAgICAgICAgICAgICYmIChzb3VyY2VGaWxlICE9IG51bGwgfHwgc291cmNlRGVidWcgIT0gbnVsbCkpIHsKKyAgICAgICAgICAgIGNsYXNzVmlzaXRvci52aXNpdFNvdXJjZShzb3VyY2VGaWxlLCBzb3VyY2VEZWJ1Zyk7CisgICAgICAgIH0KKworICAgICAgICAvLyB2aXNpdHMgdGhlIG91dGVyIGNsYXNzCisgICAgICAgIGlmIChlbmNsb3NpbmdPd25lciAhPSBudWxsKSB7CisgICAgICAgICAgICBjbGFzc1Zpc2l0b3IudmlzaXRPdXRlckNsYXNzKGVuY2xvc2luZ093bmVyLCBlbmNsb3NpbmdOYW1lLAorICAgICAgICAgICAgICAgICAgICBlbmNsb3NpbmdEZXNjKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZpc2l0cyB0aGUgY2xhc3MgYW5ub3RhdGlvbnMgYW5kIHR5cGUgYW5ub3RhdGlvbnMKKyAgICAgICAgaWYgKEFOTk9UQVRJT05TICYmIGFubnMgIT0gMCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHJlYWRVbnNpZ25lZFNob3J0KGFubnMpLCB2ID0gYW5ucyArIDI7IGkgPiAwOyAtLWkpIHsKKyAgICAgICAgICAgICAgICB2ID0gcmVhZEFubm90YXRpb25WYWx1ZXModiArIDIsIGMsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc1Zpc2l0b3IudmlzaXRBbm5vdGF0aW9uKHJlYWRVVEY4KHYsIGMpLCB0cnVlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKEFOTk9UQVRJT05TICYmIGlhbm5zICE9IDApIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSByZWFkVW5zaWduZWRTaG9ydChpYW5ucyksIHYgPSBpYW5ucyArIDI7IGkgPiAwOyAtLWkpIHsKKyAgICAgICAgICAgICAgICB2ID0gcmVhZEFubm90YXRpb25WYWx1ZXModiArIDIsIGMsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc1Zpc2l0b3IudmlzaXRBbm5vdGF0aW9uKHJlYWRVVEY4KHYsIGMpLCBmYWxzZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChBTk5PVEFUSU9OUyAmJiB0YW5ucyAhPSAwKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gcmVhZFVuc2lnbmVkU2hvcnQodGFubnMpLCB2ID0gdGFubnMgKyAyOyBpID4gMDsgLS1pKSB7CisgICAgICAgICAgICAgICAgdiA9IHJlYWRBbm5vdGF0aW9uVGFyZ2V0KGNvbnRleHQsIHYpOworICAgICAgICAgICAgICAgIHYgPSByZWFkQW5ub3RhdGlvblZhbHVlcyh2ICsgMiwgYywgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzVmlzaXRvci52aXNpdFR5cGVBbm5vdGF0aW9uKGNvbnRleHQudHlwZVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC50eXBlUGF0aCwgcmVhZFVURjgodiwgYyksIHRydWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoQU5OT1RBVElPTlMgJiYgaXRhbm5zICE9IDApIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSByZWFkVW5zaWduZWRTaG9ydChpdGFubnMpLCB2ID0gaXRhbm5zICsgMjsgaSA+IDA7IC0taSkgeworICAgICAgICAgICAgICAgIHYgPSByZWFkQW5ub3RhdGlvblRhcmdldChjb250ZXh0LCB2KTsKKyAgICAgICAgICAgICAgICB2ID0gcmVhZEFubm90YXRpb25WYWx1ZXModiArIDIsIGMsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc1Zpc2l0b3IudmlzaXRUeXBlQW5ub3RhdGlvbihjb250ZXh0LnR5cGVSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQudHlwZVBhdGgsIHJlYWRVVEY4KHYsIGMpLCBmYWxzZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gdmlzaXRzIHRoZSBhdHRyaWJ1dGVzCisgICAgICAgIHdoaWxlIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIEF0dHJpYnV0ZSBhdHRyID0gYXR0cmlidXRlcy5uZXh0OworICAgICAgICAgICAgYXR0cmlidXRlcy5uZXh0ID0gbnVsbDsKKyAgICAgICAgICAgIGNsYXNzVmlzaXRvci52aXNpdEF0dHJpYnV0ZShhdHRyaWJ1dGVzKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBhdHRyOworICAgICAgICB9CisKKyAgICAgICAgLy8gdmlzaXRzIHRoZSBpbm5lciBjbGFzc2VzCisgICAgICAgIGlmIChpbm5lckNsYXNzZXMgIT0gMCkgeworICAgICAgICAgICAgaW50IHYgPSBpbm5lckNsYXNzZXMgKyAyOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHJlYWRVbnNpZ25lZFNob3J0KGlubmVyQ2xhc3Nlcyk7IGkgPiAwOyAtLWkpIHsKKyAgICAgICAgICAgICAgICBjbGFzc1Zpc2l0b3IudmlzaXRJbm5lckNsYXNzKHJlYWRDbGFzcyh2LCBjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRDbGFzcyh2ICsgMiwgYyksIHJlYWRVVEY4KHYgKyA0LCBjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRVbnNpZ25lZFNob3J0KHYgKyA2KSk7CisgICAgICAgICAgICAgICAgdiArPSA4OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gdmlzaXRzIHRoZSBmaWVsZHMgYW5kIG1ldGhvZHMKKyAgICAgICAgdSA9IGhlYWRlciArIDEwICsgMiAqIGludGVyZmFjZXMubGVuZ3RoOworICAgICAgICBmb3IgKGludCBpID0gcmVhZFVuc2lnbmVkU2hvcnQodSAtIDIpOyBpID4gMDsgLS1pKSB7CisgICAgICAgICAgICB1ID0gcmVhZEZpZWxkKGNsYXNzVmlzaXRvciwgY29udGV4dCwgdSk7CisgICAgICAgIH0KKyAgICAgICAgdSArPSAyOworICAgICAgICBmb3IgKGludCBpID0gcmVhZFVuc2lnbmVkU2hvcnQodSAtIDIpOyBpID4gMDsgLS1pKSB7CisgICAgICAgICAgICB1ID0gcmVhZE1ldGhvZChjbGFzc1Zpc2l0b3IsIGNvbnRleHQsIHUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdmlzaXRzIHRoZSBlbmQgb2YgdGhlIGNsYXNzCisgICAgICAgIGNsYXNzVmlzaXRvci52aXNpdEVuZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIGEgZmllbGQgYW5kIG1ha2VzIHRoZSBnaXZlbiB2aXNpdG9yIHZpc2l0IGl0LgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzVmlzaXRvcgorICAgICAqICAgICAgICAgICAgdGhlIHZpc2l0b3IgdGhhdCBtdXN0IHZpc2l0IHRoZSBmaWVsZC4KKyAgICAgKiBAcGFyYW0gY29udGV4dAorICAgICAqICAgICAgICAgICAgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNsYXNzIGJlaW5nIHBhcnNlZC4KKyAgICAgKiBAcGFyYW0gdQorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IG9mZnNldCBvZiB0aGUgZmllbGQgaW4gdGhlIGNsYXNzIGZpbGUuCisgICAgICogQHJldHVybiB0aGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBieXRlIGZvbGxvd2luZyB0aGUgZmllbGQgaW4gdGhlIGNsYXNzLgorICAgICAqLworICAgIHByaXZhdGUgaW50IHJlYWRGaWVsZChmaW5hbCBDbGFzc1Zpc2l0b3IgY2xhc3NWaXNpdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQsIGludCB1KSB7CisgICAgICAgIC8vIHJlYWRzIHRoZSBmaWVsZCBkZWNsYXJhdGlvbgorICAgICAgICBjaGFyW10gYyA9IGNvbnRleHQuYnVmZmVyOworICAgICAgICBpbnQgYWNjZXNzID0gcmVhZFVuc2lnbmVkU2hvcnQodSk7CisgICAgICAgIFN0cmluZyBuYW1lID0gcmVhZFVURjgodSArIDIsIGMpOworICAgICAgICBTdHJpbmcgZGVzYyA9IHJlYWRVVEY4KHUgKyA0LCBjKTsKKyAgICAgICAgdSArPSA2OworCisgICAgICAgIC8vIHJlYWRzIHRoZSBmaWVsZCBhdHRyaWJ1dGVzCisgICAgICAgIFN0cmluZyBzaWduYXR1cmUgPSBudWxsOworICAgICAgICBpbnQgYW5ucyA9IDA7CisgICAgICAgIGludCBpYW5ucyA9IDA7CisgICAgICAgIGludCB0YW5ucyA9IDA7CisgICAgICAgIGludCBpdGFubnMgPSAwOworICAgICAgICBPYmplY3QgdmFsdWUgPSBudWxsOworICAgICAgICBBdHRyaWJ1dGUgYXR0cmlidXRlcyA9IG51bGw7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IHJlYWRVbnNpZ25lZFNob3J0KHUpOyBpID4gMDsgLS1pKSB7CisgICAgICAgICAgICBTdHJpbmcgYXR0ck5hbWUgPSByZWFkVVRGOCh1ICsgMiwgYyk7CisgICAgICAgICAgICAvLyB0ZXN0cyBhcmUgc29ydGVkIGluIGRlY3JlYXNpbmcgZnJlcXVlbmN5IG9yZGVyCisgICAgICAgICAgICAvLyAoYmFzZWQgb24gZnJlcXVlbmNpZXMgb2JzZXJ2ZWQgb24gdHlwaWNhbCBjbGFzc2VzKQorICAgICAgICAgICAgaWYgKCJDb25zdGFudFZhbHVlIi5lcXVhbHMoYXR0ck5hbWUpKSB7CisgICAgICAgICAgICAgICAgaW50IGl0ZW0gPSByZWFkVW5zaWduZWRTaG9ydCh1ICsgOCk7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBpdGVtID09IDAgPyBudWxsIDogcmVhZENvbnN0KGl0ZW0sIGMpOworICAgICAgICAgICAgfSBlbHNlIGlmIChTSUdOQVRVUkVTICYmICJTaWduYXR1cmUiLmVxdWFscyhhdHRyTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBzaWduYXR1cmUgPSByZWFkVVRGOCh1ICsgOCwgYyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJEZXByZWNhdGVkIi5lcXVhbHMoYXR0ck5hbWUpKSB7CisgICAgICAgICAgICAgICAgYWNjZXNzIHw9IE9wY29kZXMuQUNDX0RFUFJFQ0FURUQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJTeW50aGV0aWMiLmVxdWFscyhhdHRyTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBhY2Nlc3MgfD0gT3Bjb2Rlcy5BQ0NfU1lOVEhFVElDCisgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ2xhc3NXcml0ZXIuQUNDX1NZTlRIRVRJQ19BVFRSSUJVVEU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKEFOTk9UQVRJT05TCisgICAgICAgICAgICAgICAgICAgICAgICYmICJSdW50aW1lVmlzaWJsZUFubm90YXRpb25zIi5lcXVhbHMoYXR0ck5hbWUpKSB7CisgICAgICAgICAgICAgICAgYW5ucyA9IHUgKyA4OworICAgICAgICAgICAgfSBlbHNlIGlmIChBTk5PVEFUSU9OUworICAgICAgICAgICAgICAgICAgICAgICAmJiAiUnVudGltZVZpc2libGVUeXBlQW5ub3RhdGlvbnMiLmVxdWFscyhhdHRyTmFtZSkpIHsKKyAgICAgICAgICAgICAgICB0YW5ucyA9IHUgKyA4OworICAgICAgICAgICAgfSBlbHNlIGlmIChBTk5PVEFUSU9OUworICAgICAgICAgICAgICAgICAgICAgICAmJiAiUnVudGltZUludmlzaWJsZUFubm90YXRpb25zIi5lcXVhbHMoYXR0ck5hbWUpKSB7CisgICAgICAgICAgICAgICAgaWFubnMgPSB1ICsgODsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoQU5OT1RBVElPTlMKKyAgICAgICAgICAgICAgICAgICAgICAgJiYgIlJ1bnRpbWVJbnZpc2libGVUeXBlQW5ub3RhdGlvbnMiLmVxdWFscyhhdHRyTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBpdGFubnMgPSB1ICsgODsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQXR0cmlidXRlIGF0dHIgPSByZWFkQXR0cmlidXRlKGNvbnRleHQuYXR0cnMsIGF0dHJOYW1lLCB1ICsgOCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRJbnQodSArIDQpLCBjLCAtMSwgbnVsbCk7CisgICAgICAgICAgICAgICAgaWYgKGF0dHIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBhdHRyLm5leHQgPSBhdHRyaWJ1dGVzOworICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gYXR0cjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1ICs9IDYgKyByZWFkSW50KHUgKyA0KTsKKyAgICAgICAgfQorICAgICAgICB1ICs9IDI7CisKKyAgICAgICAgLy8gdmlzaXRzIHRoZSBmaWVsZCBkZWNsYXJhdGlvbgorICAgICAgICBGaWVsZFZpc2l0b3IgZnYgPSBjbGFzc1Zpc2l0b3IudmlzaXRGaWVsZChhY2Nlc3MsIG5hbWUsIGRlc2MsCisgICAgICAgICAgICAgICAgc2lnbmF0dXJlLCB2YWx1ZSk7CisgICAgICAgIGlmIChmdiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gdTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZpc2l0cyB0aGUgZmllbGQgYW5ub3RhdGlvbnMgYW5kIHR5cGUgYW5ub3RhdGlvbnMKKyAgICAgICAgaWYgKEFOTk9UQVRJT05TICYmIGFubnMgIT0gMCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHJlYWRVbnNpZ25lZFNob3J0KGFubnMpLCB2ID0gYW5ucyArIDI7IGkgPiAwOyAtLWkpIHsKKyAgICAgICAgICAgICAgICB2ID0gcmVhZEFubm90YXRpb25WYWx1ZXModiArIDIsIGMsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICBmdi52aXNpdEFubm90YXRpb24ocmVhZFVURjgodiwgYyksIHRydWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoQU5OT1RBVElPTlMgJiYgaWFubnMgIT0gMCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHJlYWRVbnNpZ25lZFNob3J0KGlhbm5zKSwgdiA9IGlhbm5zICsgMjsgaSA+IDA7IC0taSkgeworICAgICAgICAgICAgICAgIHYgPSByZWFkQW5ub3RhdGlvblZhbHVlcyh2ICsgMiwgYywgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ2LnZpc2l0QW5ub3RhdGlvbihyZWFkVVRGOCh2LCBjKSwgZmFsc2UpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoQU5OT1RBVElPTlMgJiYgdGFubnMgIT0gMCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHJlYWRVbnNpZ25lZFNob3J0KHRhbm5zKSwgdiA9IHRhbm5zICsgMjsgaSA+IDA7IC0taSkgeworICAgICAgICAgICAgICAgIHYgPSByZWFkQW5ub3RhdGlvblRhcmdldChjb250ZXh0LCB2KTsKKyAgICAgICAgICAgICAgICB2ID0gcmVhZEFubm90YXRpb25WYWx1ZXModiArIDIsIGMsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICBmdi52aXNpdFR5cGVBbm5vdGF0aW9uKGNvbnRleHQudHlwZVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC50eXBlUGF0aCwgcmVhZFVURjgodiwgYyksIHRydWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoQU5OT1RBVElPTlMgJiYgaXRhbm5zICE9IDApIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSByZWFkVW5zaWduZWRTaG9ydChpdGFubnMpLCB2ID0gaXRhbm5zICsgMjsgaSA+IDA7IC0taSkgeworICAgICAgICAgICAgICAgIHYgPSByZWFkQW5ub3RhdGlvblRhcmdldChjb250ZXh0LCB2KTsKKyAgICAgICAgICAgICAgICB2ID0gcmVhZEFubm90YXRpb25WYWx1ZXModiArIDIsIGMsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICBmdi52aXNpdFR5cGVBbm5vdGF0aW9uKGNvbnRleHQudHlwZVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC50eXBlUGF0aCwgcmVhZFVURjgodiwgYyksIGZhbHNlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyB2aXNpdHMgdGhlIGZpZWxkIGF0dHJpYnV0ZXMKKyAgICAgICAgd2hpbGUgKGF0dHJpYnV0ZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgQXR0cmlidXRlIGF0dHIgPSBhdHRyaWJ1dGVzLm5leHQ7CisgICAgICAgICAgICBhdHRyaWJ1dGVzLm5leHQgPSBudWxsOworICAgICAgICAgICAgZnYudmlzaXRBdHRyaWJ1dGUoYXR0cmlidXRlcyk7CisgICAgICAgICAgICBhdHRyaWJ1dGVzID0gYXR0cjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZpc2l0cyB0aGUgZW5kIG9mIHRoZSBmaWVsZAorICAgICAgICBmdi52aXNpdEVuZCgpOworCisgICAgICAgIHJldHVybiB1OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIGEgbWV0aG9kIGFuZCBtYWtlcyB0aGUgZ2l2ZW4gdmlzaXRvciB2aXNpdCBpdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGFzc1Zpc2l0b3IKKyAgICAgKiAgICAgICAgICAgIHRoZSB2aXNpdG9yIHRoYXQgbXVzdCB2aXNpdCB0aGUgbWV0aG9kLgorICAgICAqIEBwYXJhbSBjb250ZXh0CisgICAgICogICAgICAgICAgICBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2xhc3MgYmVpbmcgcGFyc2VkLgorICAgICAqIEBwYXJhbSB1CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSBtZXRob2QgaW4gdGhlIGNsYXNzIGZpbGUuCisgICAgICogQHJldHVybiB0aGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBieXRlIGZvbGxvd2luZyB0aGUgbWV0aG9kIGluIHRoZSBjbGFzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCByZWFkTWV0aG9kKGZpbmFsIENsYXNzVmlzaXRvciBjbGFzc1Zpc2l0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQsIGludCB1KSB7CisgICAgICAgIC8vIHJlYWRzIHRoZSBtZXRob2QgZGVjbGFyYXRpb24KKyAgICAgICAgY2hhcltdIGMgPSBjb250ZXh0LmJ1ZmZlcjsKKyAgICAgICAgY29udGV4dC5hY2Nlc3MgPSByZWFkVW5zaWduZWRTaG9ydCh1KTsKKyAgICAgICAgY29udGV4dC5uYW1lID0gcmVhZFVURjgodSArIDIsIGMpOworICAgICAgICBjb250ZXh0LmRlc2MgPSByZWFkVVRGOCh1ICsgNCwgYyk7CisgICAgICAgIHUgKz0gNjsKKworICAgICAgICAvLyByZWFkcyB0aGUgbWV0aG9kIGF0dHJpYnV0ZXMKKyAgICAgICAgaW50IGNvZGUgPSAwOworICAgICAgICBpbnQgZXhjZXB0aW9uID0gMDsKKyAgICAgICAgU3RyaW5nW10gZXhjZXB0aW9ucyA9IG51bGw7CisgICAgICAgIFN0cmluZyBzaWduYXR1cmUgPSBudWxsOworICAgICAgICBpbnQgbWV0aG9kUGFyYW1ldGVycyA9IDA7CisgICAgICAgIGludCBhbm5zID0gMDsKKyAgICAgICAgaW50IGlhbm5zID0gMDsKKyAgICAgICAgaW50IHRhbm5zID0gMDsKKyAgICAgICAgaW50IGl0YW5ucyA9IDA7CisgICAgICAgIGludCBkYW5uID0gMDsKKyAgICAgICAgaW50IG1wYW5ucyA9IDA7CisgICAgICAgIGludCBpbXBhbm5zID0gMDsKKyAgICAgICAgaW50IGZpcnN0QXR0cmlidXRlID0gdTsKKyAgICAgICAgQXR0cmlidXRlIGF0dHJpYnV0ZXMgPSBudWxsOworCisgICAgICAgIGZvciAoaW50IGkgPSByZWFkVW5zaWduZWRTaG9ydCh1KTsgaSA+IDA7IC0taSkgeworICAgICAgICAgICAgU3RyaW5nIGF0dHJOYW1lID0gcmVhZFVURjgodSArIDIsIGMpOworICAgICAgICAgICAgLy8gdGVzdHMgYXJlIHNvcnRlZCBpbiBkZWNyZWFzaW5nIGZyZXF1ZW5jeSBvcmRlcgorICAgICAgICAgICAgLy8gKGJhc2VkIG9uIGZyZXF1ZW5jaWVzIG9ic2VydmVkIG9uIHR5cGljYWwgY2xhc3NlcykKKyAgICAgICAgICAgIGlmICgiQ29kZSIuZXF1YWxzKGF0dHJOYW1lKSkgeworICAgICAgICAgICAgICAgIGlmICgoY29udGV4dC5mbGFncyAmIFNLSVBfQ09ERSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBjb2RlID0gdSArIDg7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICgiRXhjZXB0aW9ucyIuZXF1YWxzKGF0dHJOYW1lKSkgeworICAgICAgICAgICAgICAgIGV4Y2VwdGlvbnMgPSBuZXcgU3RyaW5nW3JlYWRVbnNpZ25lZFNob3J0KHUgKyA4KV07CisgICAgICAgICAgICAgICAgZXhjZXB0aW9uID0gdSArIDEwOworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZXhjZXB0aW9ucy5sZW5ndGg7ICsraikgeworICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25zW2pdID0gcmVhZENsYXNzKGV4Y2VwdGlvbiwgYyk7CisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbiArPSAyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoU0lHTkFUVVJFUyAmJiAiU2lnbmF0dXJlIi5lcXVhbHMoYXR0ck5hbWUpKSB7CisgICAgICAgICAgICAgICAgc2lnbmF0dXJlID0gcmVhZFVURjgodSArIDgsIGMpOworICAgICAgICAgICAgfSBlbHNlIGlmICgiRGVwcmVjYXRlZCIuZXF1YWxzKGF0dHJOYW1lKSkgeworICAgICAgICAgICAgICAgIGNvbnRleHQuYWNjZXNzIHw9IE9wY29kZXMuQUNDX0RFUFJFQ0FURUQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKEFOTk9UQVRJT05TCisgICAgICAgICAgICAgICAgICAgICAgICYmICJSdW50aW1lVmlzaWJsZUFubm90YXRpb25zIi5lcXVhbHMoYXR0ck5hbWUpKSB7CisgICAgICAgICAgICAgICAgYW5ucyA9IHUgKyA4OworICAgICAgICAgICAgfSBlbHNlIGlmIChBTk5PVEFUSU9OUworICAgICAgICAgICAgICAgICAgICAgICAmJiAiUnVudGltZVZpc2libGVUeXBlQW5ub3RhdGlvbnMiLmVxdWFscyhhdHRyTmFtZSkpIHsKKyAgICAgICAgICAgICAgICB0YW5ucyA9IHUgKyA4OworICAgICAgICAgICAgfSBlbHNlIGlmIChBTk5PVEFUSU9OUyAmJiAiQW5ub3RhdGlvbkRlZmF1bHQiLmVxdWFscyhhdHRyTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBkYW5uID0gdSArIDg7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCJTeW50aGV0aWMiLmVxdWFscyhhdHRyTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LmFjY2VzcyB8PSBPcGNvZGVzLkFDQ19TWU5USEVUSUMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENsYXNzV3JpdGVyLkFDQ19TWU5USEVUSUNfQVRUUklCVVRFOworICAgICAgICAgICAgfSBlbHNlIGlmIChBTk5PVEFUSU9OUworICAgICAgICAgICAgICAgICAgICAgICAmJiAiUnVudGltZUludmlzaWJsZUFubm90YXRpb25zIi5lcXVhbHMoYXR0ck5hbWUpKSB7CisgICAgICAgICAgICAgICAgaWFubnMgPSB1ICsgODsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoQU5OT1RBVElPTlMKKyAgICAgICAgICAgICAgICAgICAgICAgJiYgIlJ1bnRpbWVJbnZpc2libGVUeXBlQW5ub3RhdGlvbnMiLmVxdWFscyhhdHRyTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBpdGFubnMgPSB1ICsgODsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoQU5OT1RBVElPTlMKKyAgICAgICAgICAgICAgICAgICAgICAgJiYgIlJ1bnRpbWVWaXNpYmxlUGFyYW1ldGVyQW5ub3RhdGlvbnMiLmVxdWFscyhhdHRyTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBtcGFubnMgPSB1ICsgODsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoQU5OT1RBVElPTlMKKyAgICAgICAgICAgICAgICAgICAgICAgJiYgIlJ1bnRpbWVJbnZpc2libGVQYXJhbWV0ZXJBbm5vdGF0aW9ucyIuZXF1YWxzKGF0dHJOYW1lKSkgeworICAgICAgICAgICAgICAgIGltcGFubnMgPSB1ICsgODsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIk1ldGhvZFBhcmFtZXRlcnMiLmVxdWFscyhhdHRyTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBtZXRob2RQYXJhbWV0ZXJzID0gdSArIDg7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEF0dHJpYnV0ZSBhdHRyID0gcmVhZEF0dHJpYnV0ZShjb250ZXh0LmF0dHJzLCBhdHRyTmFtZSwgdSArIDgsCisgICAgICAgICAgICAgICAgICAgICAgICByZWFkSW50KHUgKyA0KSwgYywgLTEsIG51bGwpOworICAgICAgICAgICAgICAgIGlmIChhdHRyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgYXR0ci5uZXh0ID0gYXR0cmlidXRlczsKKyAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyA9IGF0dHI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdSArPSA2ICsgcmVhZEludCh1ICsgNCk7CisgICAgICAgIH0KKyAgICAgICAgdSArPSAyOworCisgICAgICAgIC8vIHZpc2l0cyB0aGUgbWV0aG9kIGRlY2xhcmF0aW9uCisgICAgICAgIE1ldGhvZFZpc2l0b3IgbXYgPSBjbGFzc1Zpc2l0b3IudmlzaXRNZXRob2QoY29udGV4dC5hY2Nlc3MsCisgICAgICAgICAgICAgICAgY29udGV4dC5uYW1lLCBjb250ZXh0LmRlc2MsIHNpZ25hdHVyZSwgZXhjZXB0aW9ucyk7CisgICAgICAgIGlmIChtdiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gdTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIGlmIHRoZSByZXR1cm5lZCBNZXRob2RWaXNpdG9yIGlzIGluIGZhY3QgYSBNZXRob2RXcml0ZXIsIGl0IG1lYW5zCisgICAgICAgICAqIHRoZXJlIGlzIG5vIG1ldGhvZCBhZGFwdGVyIGJldHdlZW4gdGhlIHJlYWRlciBhbmQgdGhlIHdyaXRlci4gSWYsIGluCisgICAgICAgICAqIGFkZGl0aW9uLCB0aGUgd3JpdGVyJ3MgY29uc3RhbnQgcG9vbCB3YXMgY29waWVkIGZyb20gdGhpcyByZWFkZXIKKyAgICAgICAgICogKG13LmN3LmNyID09IHRoaXMpLCBhbmQgdGhlIHNpZ25hdHVyZSBhbmQgZXhjZXB0aW9ucyBvZiB0aGUgbWV0aG9kCisgICAgICAgICAqIGhhdmUgbm90IGJlZW4gY2hhbmdlZCwgdGhlbiBpdCBpcyBwb3NzaWJsZSB0byBza2lwIGFsbCB2aXNpdCBldmVudHMKKyAgICAgICAgICogYW5kIGp1c3QgY29weSB0aGUgb3JpZ2luYWwgY29kZSBvZiB0aGUgbWV0aG9kIHRvIHRoZSB3cml0ZXIgKHRoZQorICAgICAgICAgKiBhY2Nlc3MsIG5hbWUgYW5kIGRlc2NyaXB0b3IgY2FuIGhhdmUgYmVlbiBjaGFuZ2VkLCB0aGlzIGlzIG5vdAorICAgICAgICAgKiBpbXBvcnRhbnQgc2luY2UgdGhleSBhcmUgbm90IGNvcGllZCBhcyBpcyBmcm9tIHRoZSByZWFkZXIpLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKFdSSVRFUiAmJiBtdiBpbnN0YW5jZW9mIE1ldGhvZFdyaXRlcikgeworICAgICAgICAgICAgTWV0aG9kV3JpdGVyIG13ID0gKE1ldGhvZFdyaXRlcikgbXY7CisgICAgICAgICAgICBpZiAobXcuY3cuY3IgPT0gdGhpcyAmJiBzaWduYXR1cmUgPT0gbXcuc2lnbmF0dXJlKSB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiBzYW1lRXhjZXB0aW9ucyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGlmIChleGNlcHRpb25zID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc2FtZUV4Y2VwdGlvbnMgPSBtdy5leGNlcHRpb25Db3VudCA9PSAwOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXhjZXB0aW9ucy5sZW5ndGggPT0gbXcuZXhjZXB0aW9uQ291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgc2FtZUV4Y2VwdGlvbnMgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gZXhjZXB0aW9ucy5sZW5ndGggLSAxOyBqID49IDA7IC0taikgeworICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uIC09IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobXcuZXhjZXB0aW9uc1tqXSAhPSByZWFkVW5zaWduZWRTaG9ydChleGNlcHRpb24pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtZUV4Y2VwdGlvbnMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc2FtZUV4Y2VwdGlvbnMpIHsKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogd2UgZG8gbm90IGNvcHkgZGlyZWN0bHkgdGhlIGNvZGUgaW50byBNZXRob2RXcml0ZXIgdG8KKyAgICAgICAgICAgICAgICAgICAgICogc2F2ZSBhIGJ5dGUgYXJyYXkgY29weSBvcGVyYXRpb24uIFRoZSByZWFsIGNvcHkgd2lsbCBiZQorICAgICAgICAgICAgICAgICAgICAgKiBkb25lIGluIENsYXNzV3JpdGVyLnRvQnl0ZUFycmF5KCkuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBtdy5jbGFzc1JlYWRlck9mZnNldCA9IGZpcnN0QXR0cmlidXRlOworICAgICAgICAgICAgICAgICAgICBtdy5jbGFzc1JlYWRlckxlbmd0aCA9IHUgLSBmaXJzdEF0dHJpYnV0ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gdmlzaXQgdGhlIG1ldGhvZCBwYXJhbWV0ZXJzCisgICAgICAgIGlmIChtZXRob2RQYXJhbWV0ZXJzICE9IDApIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSBiW21ldGhvZFBhcmFtZXRlcnNdICYgMHhGRiwgdiA9IG1ldGhvZFBhcmFtZXRlcnMgKyAxOyBpID4gMDsgLS1pLCB2ID0gdiArIDQpIHsKKyAgICAgICAgICAgICAgICBtdi52aXNpdFBhcmFtZXRlcihyZWFkVVRGOCh2LCBjKSwgcmVhZFVuc2lnbmVkU2hvcnQodiArIDIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHZpc2l0cyB0aGUgbWV0aG9kIGFubm90YXRpb25zCisgICAgICAgIGlmIChBTk5PVEFUSU9OUyAmJiBkYW5uICE9IDApIHsKKyAgICAgICAgICAgIEFubm90YXRpb25WaXNpdG9yIGR2ID0gbXYudmlzaXRBbm5vdGF0aW9uRGVmYXVsdCgpOworICAgICAgICAgICAgcmVhZEFubm90YXRpb25WYWx1ZShkYW5uLCBjLCBudWxsLCBkdik7CisgICAgICAgICAgICBpZiAoZHYgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGR2LnZpc2l0RW5kKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKEFOTk9UQVRJT05TICYmIGFubnMgIT0gMCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHJlYWRVbnNpZ25lZFNob3J0KGFubnMpLCB2ID0gYW5ucyArIDI7IGkgPiAwOyAtLWkpIHsKKyAgICAgICAgICAgICAgICB2ID0gcmVhZEFubm90YXRpb25WYWx1ZXModiArIDIsIGMsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICBtdi52aXNpdEFubm90YXRpb24ocmVhZFVURjgodiwgYyksIHRydWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoQU5OT1RBVElPTlMgJiYgaWFubnMgIT0gMCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHJlYWRVbnNpZ25lZFNob3J0KGlhbm5zKSwgdiA9IGlhbm5zICsgMjsgaSA+IDA7IC0taSkgeworICAgICAgICAgICAgICAgIHYgPSByZWFkQW5ub3RhdGlvblZhbHVlcyh2ICsgMiwgYywgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG12LnZpc2l0QW5ub3RhdGlvbihyZWFkVVRGOCh2LCBjKSwgZmFsc2UpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoQU5OT1RBVElPTlMgJiYgdGFubnMgIT0gMCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHJlYWRVbnNpZ25lZFNob3J0KHRhbm5zKSwgdiA9IHRhbm5zICsgMjsgaSA+IDA7IC0taSkgeworICAgICAgICAgICAgICAgIHYgPSByZWFkQW5ub3RhdGlvblRhcmdldChjb250ZXh0LCB2KTsKKyAgICAgICAgICAgICAgICB2ID0gcmVhZEFubm90YXRpb25WYWx1ZXModiArIDIsIGMsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICBtdi52aXNpdFR5cGVBbm5vdGF0aW9uKGNvbnRleHQudHlwZVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC50eXBlUGF0aCwgcmVhZFVURjgodiwgYyksIHRydWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoQU5OT1RBVElPTlMgJiYgaXRhbm5zICE9IDApIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSByZWFkVW5zaWduZWRTaG9ydChpdGFubnMpLCB2ID0gaXRhbm5zICsgMjsgaSA+IDA7IC0taSkgeworICAgICAgICAgICAgICAgIHYgPSByZWFkQW5ub3RhdGlvblRhcmdldChjb250ZXh0LCB2KTsKKyAgICAgICAgICAgICAgICB2ID0gcmVhZEFubm90YXRpb25WYWx1ZXModiArIDIsIGMsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICBtdi52aXNpdFR5cGVBbm5vdGF0aW9uKGNvbnRleHQudHlwZVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC50eXBlUGF0aCwgcmVhZFVURjgodiwgYyksIGZhbHNlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKEFOTk9UQVRJT05TICYmIG1wYW5ucyAhPSAwKSB7CisgICAgICAgICAgICByZWFkUGFyYW1ldGVyQW5ub3RhdGlvbnMobXYsIGNvbnRleHQsIG1wYW5ucywgdHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEFOTk9UQVRJT05TICYmIGltcGFubnMgIT0gMCkgeworICAgICAgICAgICAgcmVhZFBhcmFtZXRlckFubm90YXRpb25zKG12LCBjb250ZXh0LCBpbXBhbm5zLCBmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB2aXNpdHMgdGhlIG1ldGhvZCBhdHRyaWJ1dGVzCisgICAgICAgIHdoaWxlIChhdHRyaWJ1dGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIEF0dHJpYnV0ZSBhdHRyID0gYXR0cmlidXRlcy5uZXh0OworICAgICAgICAgICAgYXR0cmlidXRlcy5uZXh0ID0gbnVsbDsKKyAgICAgICAgICAgIG12LnZpc2l0QXR0cmlidXRlKGF0dHJpYnV0ZXMpOworICAgICAgICAgICAgYXR0cmlidXRlcyA9IGF0dHI7CisgICAgICAgIH0KKworICAgICAgICAvLyB2aXNpdHMgdGhlIG1ldGhvZCBjb2RlCisgICAgICAgIGlmIChjb2RlICE9IDApIHsKKyAgICAgICAgICAgIG12LnZpc2l0Q29kZSgpOworICAgICAgICAgICAgcmVhZENvZGUobXYsIGNvbnRleHQsIGNvZGUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdmlzaXRzIHRoZSBlbmQgb2YgdGhlIG1ldGhvZAorICAgICAgICBtdi52aXNpdEVuZCgpOworCisgICAgICAgIHJldHVybiB1OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIHRoZSBieXRlY29kZSBvZiBhIG1ldGhvZCBhbmQgbWFrZXMgdGhlIGdpdmVuIHZpc2l0b3IgdmlzaXQgaXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbXYKKyAgICAgKiAgICAgICAgICAgIHRoZSB2aXNpdG9yIHRoYXQgbXVzdCB2aXNpdCB0aGUgbWV0aG9kJ3MgY29kZS4KKyAgICAgKiBAcGFyYW0gY29udGV4dAorICAgICAqICAgICAgICAgICAgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNsYXNzIGJlaW5nIHBhcnNlZC4KKyAgICAgKiBAcGFyYW0gdQorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IG9mZnNldCBvZiB0aGUgY29kZSBhdHRyaWJ1dGUgaW4gdGhlIGNsYXNzIGZpbGUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHJlYWRDb2RlKGZpbmFsIE1ldGhvZFZpc2l0b3IgbXYsIGZpbmFsIENvbnRleHQgY29udGV4dCwgaW50IHUpIHsKKyAgICAgICAgLy8gcmVhZHMgdGhlIGhlYWRlcgorICAgICAgICBieXRlW10gYiA9IHRoaXMuYjsKKyAgICAgICAgY2hhcltdIGMgPSBjb250ZXh0LmJ1ZmZlcjsKKyAgICAgICAgaW50IG1heFN0YWNrID0gcmVhZFVuc2lnbmVkU2hvcnQodSk7CisgICAgICAgIGludCBtYXhMb2NhbHMgPSByZWFkVW5zaWduZWRTaG9ydCh1ICsgMik7CisgICAgICAgIGludCBjb2RlTGVuZ3RoID0gcmVhZEludCh1ICsgNCk7CisgICAgICAgIHUgKz0gODsKKworICAgICAgICAvLyByZWFkcyB0aGUgYnl0ZWNvZGUgdG8gZmluZCB0aGUgbGFiZWxzCisgICAgICAgIGludCBjb2RlU3RhcnQgPSB1OworICAgICAgICBpbnQgY29kZUVuZCA9IHUgKyBjb2RlTGVuZ3RoOworICAgICAgICBMYWJlbFtdIGxhYmVscyA9IGNvbnRleHQubGFiZWxzID0gbmV3IExhYmVsW2NvZGVMZW5ndGggKyAyXTsKKyAgICAgICAgcmVhZExhYmVsKGNvZGVMZW5ndGggKyAxLCBsYWJlbHMpOworICAgICAgICB3aGlsZSAodSA8IGNvZGVFbmQpIHsKKyAgICAgICAgICAgIGludCBvZmZzZXQgPSB1IC0gY29kZVN0YXJ0OworICAgICAgICAgICAgaW50IG9wY29kZSA9IGJbdV0gJiAweEZGOworICAgICAgICAgICAgc3dpdGNoIChDbGFzc1dyaXRlci5UWVBFW29wY29kZV0pIHsKKyAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLk5PQVJHX0lOU046CisgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5JTVBMVkFSX0lOU046CisgICAgICAgICAgICAgICAgICAgIHUgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5MQUJFTF9JTlNOOgorICAgICAgICAgICAgICAgICAgICByZWFkTGFiZWwob2Zmc2V0ICsgcmVhZFNob3J0KHUgKyAxKSwgbGFiZWxzKTsKKyAgICAgICAgICAgICAgICAgICAgdSArPSAzOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLkxBQkVMV19JTlNOOgorICAgICAgICAgICAgICAgICAgICByZWFkTGFiZWwob2Zmc2V0ICsgcmVhZEludCh1ICsgMSksIGxhYmVscyk7CisgICAgICAgICAgICAgICAgICAgIHUgKz0gNTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5XSURFX0lOU046CisgICAgICAgICAgICAgICAgICAgIG9wY29kZSA9IGJbdSArIDFdICYgMHhGRjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9wY29kZSA9PSBPcGNvZGVzLklJTkMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHUgKz0gNjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHUgKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLlRBQkxfSU5TTjoKKyAgICAgICAgICAgICAgICAgICAgLy8gc2tpcHMgMCB0byAzIHBhZGRpbmcgYnl0ZXMKKyAgICAgICAgICAgICAgICAgICAgdSA9IHUgKyA0IC0gKG9mZnNldCAmIDMpOworICAgICAgICAgICAgICAgICAgICAvLyByZWFkcyBpbnN0cnVjdGlvbgorICAgICAgICAgICAgICAgICAgICByZWFkTGFiZWwob2Zmc2V0ICsgcmVhZEludCh1KSwgbGFiZWxzKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHJlYWRJbnQodSArIDgpIC0gcmVhZEludCh1ICsgNCkgKyAxOyBpID4gMDsgLS1pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWFkTGFiZWwob2Zmc2V0ICsgcmVhZEludCh1ICsgMTIpLCBsYWJlbHMpOworICAgICAgICAgICAgICAgICAgICAgICAgdSArPSA0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHUgKz0gMTI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuTE9PS19JTlNOOgorICAgICAgICAgICAgICAgICAgICAvLyBza2lwcyAwIHRvIDMgcGFkZGluZyBieXRlcworICAgICAgICAgICAgICAgICAgICB1ID0gdSArIDQgLSAob2Zmc2V0ICYgMyk7CisgICAgICAgICAgICAgICAgICAgIC8vIHJlYWRzIGluc3RydWN0aW9uCisgICAgICAgICAgICAgICAgICAgIHJlYWRMYWJlbChvZmZzZXQgKyByZWFkSW50KHUpLCBsYWJlbHMpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gcmVhZEludCh1ICsgNCk7IGkgPiAwOyAtLWkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRMYWJlbChvZmZzZXQgKyByZWFkSW50KHUgKyAxMiksIGxhYmVscyk7CisgICAgICAgICAgICAgICAgICAgICAgICB1ICs9IDg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdSArPSA4OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLlZBUl9JTlNOOgorICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuU0JZVEVfSU5TTjoKKyAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLkxEQ19JTlNOOgorICAgICAgICAgICAgICAgICAgICB1ICs9IDI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuU0hPUlRfSU5TTjoKKyAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLkxEQ1dfSU5TTjoKKyAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLkZJRUxET1JNRVRIX0lOU046CisgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5UWVBFX0lOU046CisgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5JSU5DX0lOU046CisgICAgICAgICAgICAgICAgICAgIHUgKz0gMzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5JVEZNRVRIX0lOU046CisgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5JTkRZTUVUSF9JTlNOOgorICAgICAgICAgICAgICAgICAgICB1ICs9IDU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIC8vIGNhc2UgTUFOQV9JTlNOOgorICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIHUgKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyByZWFkcyB0aGUgdHJ5IGNhdGNoIGVudHJpZXMgdG8gZmluZCB0aGUgbGFiZWxzLCBhbmQgYWxzbyB2aXNpdHMgdGhlbQorICAgICAgICBmb3IgKGludCBpID0gcmVhZFVuc2lnbmVkU2hvcnQodSk7IGkgPiAwOyAtLWkpIHsKKyAgICAgICAgICAgIExhYmVsIHN0YXJ0ID0gcmVhZExhYmVsKHJlYWRVbnNpZ25lZFNob3J0KHUgKyAyKSwgbGFiZWxzKTsKKyAgICAgICAgICAgIExhYmVsIGVuZCA9IHJlYWRMYWJlbChyZWFkVW5zaWduZWRTaG9ydCh1ICsgNCksIGxhYmVscyk7CisgICAgICAgICAgICBMYWJlbCBoYW5kbGVyID0gcmVhZExhYmVsKHJlYWRVbnNpZ25lZFNob3J0KHUgKyA2KSwgbGFiZWxzKTsKKyAgICAgICAgICAgIFN0cmluZyB0eXBlID0gcmVhZFVURjgoaXRlbXNbcmVhZFVuc2lnbmVkU2hvcnQodSArIDgpXSwgYyk7CisgICAgICAgICAgICBtdi52aXNpdFRyeUNhdGNoQmxvY2soc3RhcnQsIGVuZCwgaGFuZGxlciwgdHlwZSk7CisgICAgICAgICAgICB1ICs9IDg7CisgICAgICAgIH0KKyAgICAgICAgdSArPSAyOworCisgICAgICAgIC8vIHJlYWRzIHRoZSBjb2RlIGF0dHJpYnV0ZXMKKyAgICAgICAgaW50W10gdGFubnMgPSBudWxsOyAvLyBzdGFydCBpbmRleCBvZiBlYWNoIHZpc2libGUgdHlwZSBhbm5vdGF0aW9uCisgICAgICAgIGludFtdIGl0YW5ucyA9IG51bGw7IC8vIHN0YXJ0IGluZGV4IG9mIGVhY2ggaW52aXNpYmxlIHR5cGUgYW5ub3RhdGlvbgorICAgICAgICBpbnQgdGFubiA9IDA7IC8vIGN1cnJlbnQgaW5kZXggaW4gdGFubnMgYXJyYXkKKyAgICAgICAgaW50IGl0YW5uID0gMDsgLy8gY3VycmVudCBpbmRleCBpbiBpdGFubnMgYXJyYXkKKyAgICAgICAgaW50IG50b2ZmID0gLTE7IC8vIG5leHQgdmlzaWJsZSB0eXBlIGFubm90YXRpb24gY29kZSBvZmZzZXQKKyAgICAgICAgaW50IG5pdG9mZiA9IC0xOyAvLyBuZXh0IGludmlzaWJsZSB0eXBlIGFubm90YXRpb24gY29kZSBvZmZzZXQKKyAgICAgICAgaW50IHZhclRhYmxlID0gMDsKKyAgICAgICAgaW50IHZhclR5cGVUYWJsZSA9IDA7CisgICAgICAgIGJvb2xlYW4gemlwID0gdHJ1ZTsKKyAgICAgICAgYm9vbGVhbiB1bnppcCA9IChjb250ZXh0LmZsYWdzICYgRVhQQU5EX0ZSQU1FUykgIT0gMDsKKyAgICAgICAgaW50IHN0YWNrTWFwID0gMDsKKyAgICAgICAgaW50IHN0YWNrTWFwU2l6ZSA9IDA7CisgICAgICAgIGludCBmcmFtZUNvdW50ID0gMDsKKyAgICAgICAgQ29udGV4dCBmcmFtZSA9IG51bGw7CisgICAgICAgIEF0dHJpYnV0ZSBhdHRyaWJ1dGVzID0gbnVsbDsKKworICAgICAgICBmb3IgKGludCBpID0gcmVhZFVuc2lnbmVkU2hvcnQodSk7IGkgPiAwOyAtLWkpIHsKKyAgICAgICAgICAgIFN0cmluZyBhdHRyTmFtZSA9IHJlYWRVVEY4KHUgKyAyLCBjKTsKKyAgICAgICAgICAgIGlmICgiTG9jYWxWYXJpYWJsZVRhYmxlIi5lcXVhbHMoYXR0ck5hbWUpKSB7CisgICAgICAgICAgICAgICAgaWYgKChjb250ZXh0LmZsYWdzICYgU0tJUF9ERUJVRykgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICB2YXJUYWJsZSA9IHUgKyA4OworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gcmVhZFVuc2lnbmVkU2hvcnQodSArIDgpLCB2ID0gdTsgaiA+IDA7IC0taikgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxhYmVsID0gcmVhZFVuc2lnbmVkU2hvcnQodiArIDEwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYWJlbHNbbGFiZWxdID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkTGFiZWwobGFiZWwsIGxhYmVscykuc3RhdHVzIHw9IExhYmVsLkRFQlVHOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgKz0gcmVhZFVuc2lnbmVkU2hvcnQodiArIDEyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYWJlbHNbbGFiZWxdID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkTGFiZWwobGFiZWwsIGxhYmVscykuc3RhdHVzIHw9IExhYmVsLkRFQlVHOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdiArPSAxMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIkxvY2FsVmFyaWFibGVUeXBlVGFibGUiLmVxdWFscyhhdHRyTmFtZSkpIHsKKyAgICAgICAgICAgICAgICB2YXJUeXBlVGFibGUgPSB1ICsgODsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIkxpbmVOdW1iZXJUYWJsZSIuZXF1YWxzKGF0dHJOYW1lKSkgeworICAgICAgICAgICAgICAgIGlmICgoY29udGV4dC5mbGFncyAmIFNLSVBfREVCVUcpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IHJlYWRVbnNpZ25lZFNob3J0KHUgKyA4KSwgdiA9IHU7IGogPiAwOyAtLWopIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsYWJlbCA9IHJlYWRVbnNpZ25lZFNob3J0KHYgKyAxMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGFiZWxzW2xhYmVsXSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZExhYmVsKGxhYmVsLCBsYWJlbHMpLnN0YXR1cyB8PSBMYWJlbC5ERUJVRzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIExhYmVsIGwgPSBsYWJlbHNbbGFiZWxdOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGwubGluZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobC5uZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbC5uZXh0ID0gbmV3IExhYmVsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGwgPSBsLm5leHQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBsLmxpbmUgPSByZWFkVW5zaWduZWRTaG9ydCh2ICsgMTIpOworICAgICAgICAgICAgICAgICAgICAgICAgdiArPSA0OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChBTk5PVEFUSU9OUworICAgICAgICAgICAgICAgICAgICAgICAmJiAiUnVudGltZVZpc2libGVUeXBlQW5ub3RhdGlvbnMiLmVxdWFscyhhdHRyTmFtZSkpIHsKKyAgICAgICAgICAgICAgICB0YW5ucyA9IHJlYWRUeXBlQW5ub3RhdGlvbnMobXYsIGNvbnRleHQsIHUgKyA4LCB0cnVlKTsKKyAgICAgICAgICAgICAgICBudG9mZiA9IHRhbm5zLmxlbmd0aCA9PSAwIHx8IHJlYWRCeXRlKHRhbm5zWzBdKSA8IDB4NDMgPyAtMQorICAgICAgICAgICAgICAgICAgICAgICAgOiByZWFkVW5zaWduZWRTaG9ydCh0YW5uc1swXSArIDEpOworICAgICAgICAgICAgfSBlbHNlIGlmIChBTk5PVEFUSU9OUworICAgICAgICAgICAgICAgICAgICAgICAmJiAiUnVudGltZUludmlzaWJsZVR5cGVBbm5vdGF0aW9ucyIuZXF1YWxzKGF0dHJOYW1lKSkgeworICAgICAgICAgICAgICAgIGl0YW5ucyA9IHJlYWRUeXBlQW5ub3RhdGlvbnMobXYsIGNvbnRleHQsIHUgKyA4LCBmYWxzZSk7CisgICAgICAgICAgICAgICAgbml0b2ZmID0gaXRhbm5zLmxlbmd0aCA9PSAwIHx8IHJlYWRCeXRlKGl0YW5uc1swXSkgPCAweDQzID8gLTEKKyAgICAgICAgICAgICAgICAgICAgICAgIDogcmVhZFVuc2lnbmVkU2hvcnQoaXRhbm5zWzBdICsgMSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKEZSQU1FUyAmJiAiU3RhY2tNYXBUYWJsZSIuZXF1YWxzKGF0dHJOYW1lKSkgeworICAgICAgICAgICAgICAgIGlmICgoY29udGV4dC5mbGFncyAmIFNLSVBfRlJBTUVTKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YWNrTWFwID0gdSArIDEwOworICAgICAgICAgICAgICAgICAgICBzdGFja01hcFNpemUgPSByZWFkSW50KHUgKyA0KTsKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCA9IHJlYWRVbnNpZ25lZFNob3J0KHUgKyA4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBoZXJlIHdlIGRvIG5vdCBleHRyYWN0IHRoZSBsYWJlbHMgY29ycmVzcG9uZGluZyB0byB0aGUKKyAgICAgICAgICAgICAgICAgKiBhdHRyaWJ1dGUgY29udGVudC4gVGhpcyB3b3VsZCByZXF1aXJlIGEgZnVsbCBwYXJzaW5nIG9mIHRoZQorICAgICAgICAgICAgICAgICAqIGF0dHJpYnV0ZSwgd2hpY2ggd291bGQgbmVlZCB0byBiZSByZXBlYXRlZCBpbiB0aGUgc2Vjb25kCisgICAgICAgICAgICAgICAgICogcGhhc2UgKHNlZSBiZWxvdykuIEluc3RlYWQgdGhlIGNvbnRlbnQgb2YgdGhlIGF0dHJpYnV0ZSBpcworICAgICAgICAgICAgICAgICAqIHJlYWQgb25lIGZyYW1lIGF0IGEgdGltZSAoaS5lLiBhZnRlciBhIGZyYW1lIGhhcyBiZWVuCisgICAgICAgICAgICAgICAgICogdmlzaXRlZCwgdGhlIG5leHQgZnJhbWUgaXMgcmVhZCksIGFuZCB0aGUgbGFiZWxzIGl0IGNvbnRhaW5zCisgICAgICAgICAgICAgICAgICogYXJlIGFsc28gZXh0cmFjdGVkIG9uZSBmcmFtZSBhdCBhIHRpbWUuIFRoYW5rcyB0byB0aGUKKyAgICAgICAgICAgICAgICAgKiBvcmRlcmluZyBvZiBmcmFtZXMsIGhhdmluZyBvbmx5IGEgIm9uZSBmcmFtZSBsb29rYWhlYWQiIGlzCisgICAgICAgICAgICAgICAgICogbm90IGEgcHJvYmxlbSwgaS5lLiBpdCBpcyBub3QgcG9zc2libGUgdG8gc2VlIGFuIG9mZnNldAorICAgICAgICAgICAgICAgICAqIHNtYWxsZXIgdGhhbiB0aGUgb2Zmc2V0IG9mIHRoZSBjdXJyZW50IGluc24gYW5kIGZvciB3aGljaCBubworICAgICAgICAgICAgICAgICAqIExhYmVsIGV4aXN0LgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogVGhpcyBpcyBub3QgdHJ1ZSBmb3IgVU5JTklUSUFMSVpFRCB0eXBlIG9mZnNldHMuIFdlIHNvbHZlCisgICAgICAgICAgICAgICAgICogdGhpcyBieSBwYXJzaW5nIHRoZSBzdGFjayBtYXAgdGFibGUgd2l0aG91dCBhIGZ1bGwgZGVjb2RpbmcKKyAgICAgICAgICAgICAgICAgKiAoc2VlIGJlbG93KS4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoRlJBTUVTICYmICJTdGFja01hcCIuZXF1YWxzKGF0dHJOYW1lKSkgeworICAgICAgICAgICAgICAgIGlmICgoY29udGV4dC5mbGFncyAmIFNLSVBfRlJBTUVTKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHppcCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBzdGFja01hcCA9IHUgKyAxMDsKKyAgICAgICAgICAgICAgICAgICAgc3RhY2tNYXBTaXplID0gcmVhZEludCh1ICsgNCk7CisgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQgPSByZWFkVW5zaWduZWRTaG9ydCh1ICsgOCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogSU1QT1JUQU5UISBoZXJlIHdlIGFzc3VtZSB0aGF0IHRoZSBmcmFtZXMgYXJlIG9yZGVyZWQsIGFzIGluCisgICAgICAgICAgICAgICAgICogdGhlIFN0YWNrTWFwVGFibGUgYXR0cmlidXRlLCBhbHRob3VnaCB0aGlzIGlzIG5vdCBndWFyYW50ZWVkCisgICAgICAgICAgICAgICAgICogYnkgdGhlIGF0dHJpYnV0ZSBmb3JtYXQuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY29udGV4dC5hdHRycy5sZW5ndGg7ICsraikgeworICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dC5hdHRyc1tqXS50eXBlLmVxdWFscyhhdHRyTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZSBhdHRyID0gY29udGV4dC5hdHRyc1tqXS5yZWFkKHRoaXMsIHUgKyA4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkSW50KHUgKyA0KSwgYywgY29kZVN0YXJ0IC0gOCwgbGFiZWxzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyLm5leHQgPSBhdHRyaWJ1dGVzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBhdHRyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdSArPSA2ICsgcmVhZEludCh1ICsgNCk7CisgICAgICAgIH0KKyAgICAgICAgdSArPSAyOworCisgICAgICAgIC8vIGdlbmVyYXRlcyB0aGUgZmlyc3QgKGltcGxpY2l0KSBzdGFjayBtYXAgZnJhbWUKKyAgICAgICAgaWYgKEZSQU1FUyAmJiBzdGFja01hcCAhPSAwKSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogZm9yIHRoZSBmaXJzdCBleHBsaWNpdCBmcmFtZSB0aGUgb2Zmc2V0IGlzIG5vdCBvZmZzZXRfZGVsdGEgKyAxCisgICAgICAgICAgICAgKiBidXQgb25seSBvZmZzZXRfZGVsdGE7IHNldHRpbmcgdGhlIGltcGxpY2l0IGZyYW1lIG9mZnNldCB0byAtMQorICAgICAgICAgICAgICogYWxsb3cgdGhlIHVzZSBvZiB0aGUgIm9mZnNldF9kZWx0YSArIDEiIHJ1bGUgaW4gYWxsIGNhc2VzCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGZyYW1lID0gY29udGV4dDsKKyAgICAgICAgICAgIGZyYW1lLm9mZnNldCA9IC0xOworICAgICAgICAgICAgZnJhbWUubW9kZSA9IDA7CisgICAgICAgICAgICBmcmFtZS5sb2NhbENvdW50ID0gMDsKKyAgICAgICAgICAgIGZyYW1lLmxvY2FsRGlmZiA9IDA7CisgICAgICAgICAgICBmcmFtZS5zdGFja0NvdW50ID0gMDsKKyAgICAgICAgICAgIGZyYW1lLmxvY2FsID0gbmV3IE9iamVjdFttYXhMb2NhbHNdOworICAgICAgICAgICAgZnJhbWUuc3RhY2sgPSBuZXcgT2JqZWN0W21heFN0YWNrXTsKKyAgICAgICAgICAgIGlmICh1bnppcCkgeworICAgICAgICAgICAgICAgIGdldEltcGxpY2l0RnJhbWUoY29udGV4dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogRmluZHMgbGFiZWxzIGZvciBVTklOSVRJQUxJWkVEIGZyYW1lIHR5cGVzLiBJbnN0ZWFkIG9mIGRlY29kaW5nCisgICAgICAgICAgICAgKiBlYWNoIGVsZW1lbnQgb2YgdGhlIHN0YWNrIG1hcCB0YWJsZSwgd2UgbG9vayBmb3IgMyBjb25zZWN1dGl2ZQorICAgICAgICAgICAgICogYnl0ZXMgdGhhdCAibG9vayBsaWtlIiBhbiBVTklOSVRJQUxJWkVEIHR5cGUgKHRhZyA4LCBvZmZzZXQKKyAgICAgICAgICAgICAqIHdpdGhpbiBjb2RlIGJvdW5kcywgTkVXIGluc3RydWN0aW9uIGF0IHRoaXMgb2Zmc2V0KS4gV2UgbWF5IGZpbmQKKyAgICAgICAgICAgICAqIGZhbHNlIHBvc2l0aXZlcyAoaS5lLiBub3QgcmVhbCBVTklOSVRJQUxJWkVEIHR5cGVzKSwgYnV0IHRoaXMKKyAgICAgICAgICAgICAqIHNob3VsZCBiZSByYXJlLCBhbmQgdGhlIG9ubHkgY29uc2VxdWVuY2Ugd2lsbCBiZSB0aGUgY3JlYXRpb24gb2YKKyAgICAgICAgICAgICAqIGFuIHVubmVlZGVkIGxhYmVsLiBUaGlzIGlzIGJldHRlciB0aGFuIGNyZWF0aW5nIGEgbGFiZWwgZm9yIGVhY2gKKyAgICAgICAgICAgICAqIE5FVyBpbnN0cnVjdGlvbiwgYW5kIGZhc3RlciB0aGFuIGZ1bGx5IGRlY29kaW5nIHRoZSB3aG9sZSBzdGFjaworICAgICAgICAgICAgICogbWFwIHRhYmxlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBmb3IgKGludCBpID0gc3RhY2tNYXA7IGkgPCBzdGFja01hcCArIHN0YWNrTWFwU2l6ZSAtIDI7ICsraSkgeworICAgICAgICAgICAgICAgIGlmIChiW2ldID09IDgpIHsgLy8gVU5JTklUSUFMSVpFRCBGUkFNRSBUWVBFCisgICAgICAgICAgICAgICAgICAgIGludCB2ID0gcmVhZFVuc2lnbmVkU2hvcnQoaSArIDEpOworICAgICAgICAgICAgICAgICAgICBpZiAodiA+PSAwICYmIHYgPCBjb2RlTGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGJbY29kZVN0YXJ0ICsgdl0gJiAweEZGKSA9PSBPcGNvZGVzLk5FVykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRMYWJlbCh2LCBsYWJlbHMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gdmlzaXRzIHRoZSBpbnN0cnVjdGlvbnMKKyAgICAgICAgdSA9IGNvZGVTdGFydDsKKyAgICAgICAgd2hpbGUgKHUgPCBjb2RlRW5kKSB7CisgICAgICAgICAgICBpbnQgb2Zmc2V0ID0gdSAtIGNvZGVTdGFydDsKKworICAgICAgICAgICAgLy8gdmlzaXRzIHRoZSBsYWJlbCBhbmQgbGluZSBudW1iZXIgZm9yIHRoaXMgb2Zmc2V0LCBpZiBhbnkKKyAgICAgICAgICAgIExhYmVsIGwgPSBsYWJlbHNbb2Zmc2V0XTsKKyAgICAgICAgICAgIGlmIChsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBMYWJlbCBuZXh0ID0gbC5uZXh0OworICAgICAgICAgICAgICAgIGwubmV4dCA9IG51bGw7CisgICAgICAgICAgICAgICAgbXYudmlzaXRMYWJlbChsKTsKKyAgICAgICAgICAgICAgICBpZiAoKGNvbnRleHQuZmxhZ3MgJiBTS0lQX0RFQlVHKSA9PSAwICYmIGwubGluZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbXYudmlzaXRMaW5lTnVtYmVyKGwubGluZSwgbCk7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChuZXh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG12LnZpc2l0TGluZU51bWJlcihuZXh0LmxpbmUsIGwpOworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCA9IG5leHQubmV4dDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gdmlzaXRzIHRoZSBmcmFtZSBmb3IgdGhpcyBvZmZzZXQsIGlmIGFueQorICAgICAgICAgICAgd2hpbGUgKEZSQU1FUyAmJiBmcmFtZSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgJiYgKGZyYW1lLm9mZnNldCA9PSBvZmZzZXQgfHwgZnJhbWUub2Zmc2V0ID09IC0xKSkgeworICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGEgZnJhbWUgZm9yIHRoaXMgb2Zmc2V0LCBtYWtlcyB0aGUgdmlzaXRvciB2aXNpdAorICAgICAgICAgICAgICAgIC8vIGl0LCBhbmQgcmVhZHMgdGhlIG5leHQgZnJhbWUgaWYgdGhlcmUgaXMgb25lLgorICAgICAgICAgICAgICAgIGlmIChmcmFtZS5vZmZzZXQgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCF6aXAgfHwgdW56aXApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG12LnZpc2l0RnJhbWUoT3Bjb2Rlcy5GX05FVywgZnJhbWUubG9jYWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUubG9jYWwsIGZyYW1lLnN0YWNrQ291bnQsIGZyYW1lLnN0YWNrKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG12LnZpc2l0RnJhbWUoZnJhbWUubW9kZSwgZnJhbWUubG9jYWxEaWZmLCBmcmFtZS5sb2NhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWUuc3RhY2tDb3VudCwgZnJhbWUuc3RhY2spOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChmcmFtZUNvdW50ID4gMCkgeworICAgICAgICAgICAgICAgICAgICBzdGFja01hcCA9IHJlYWRGcmFtZShzdGFja01hcCwgemlwLCB1bnppcCwgZnJhbWUpOworICAgICAgICAgICAgICAgICAgICAtLWZyYW1lQ291bnQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZnJhbWUgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gdmlzaXRzIHRoZSBpbnN0cnVjdGlvbiBhdCB0aGlzIG9mZnNldAorICAgICAgICAgICAgaW50IG9wY29kZSA9IGJbdV0gJiAweEZGOworICAgICAgICAgICAgc3dpdGNoIChDbGFzc1dyaXRlci5UWVBFW29wY29kZV0pIHsKKyAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLk5PQVJHX0lOU046CisgICAgICAgICAgICAgICAgICAgIG12LnZpc2l0SW5zbihvcGNvZGUpOworICAgICAgICAgICAgICAgICAgICB1ICs9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuSU1QTFZBUl9JTlNOOgorICAgICAgICAgICAgICAgICAgICBpZiAob3Bjb2RlID4gT3Bjb2Rlcy5JU1RPUkUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSAtPSA1OTsgLy8gSVNUT1JFXzAKKyAgICAgICAgICAgICAgICAgICAgICAgIG12LnZpc2l0VmFySW5zbihPcGNvZGVzLklTVE9SRSArIChvcGNvZGUgPj4gMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSAmIDB4Myk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvcGNvZGUgLT0gMjY7IC8vIElMT0FEXzAKKyAgICAgICAgICAgICAgICAgICAgICAgIG12LnZpc2l0VmFySW5zbihPcGNvZGVzLklMT0FEICsgKG9wY29kZSA+PiAyKSwgb3Bjb2RlICYgMHgzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB1ICs9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuTEFCRUxfSU5TTjoKKyAgICAgICAgICAgICAgICAgICAgbXYudmlzaXRKdW1wSW5zbihvcGNvZGUsIGxhYmVsc1tvZmZzZXQgKyByZWFkU2hvcnQodSArIDEpXSk7CisgICAgICAgICAgICAgICAgICAgIHUgKz0gMzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5MQUJFTFdfSU5TTjoKKyAgICAgICAgICAgICAgICAgICAgbXYudmlzaXRKdW1wSW5zbihvcGNvZGUgLSAzMywgbGFiZWxzW29mZnNldCArIHJlYWRJbnQodSArIDEpXSk7CisgICAgICAgICAgICAgICAgICAgIHUgKz0gNTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5XSURFX0lOU046CisgICAgICAgICAgICAgICAgICAgIG9wY29kZSA9IGJbdSArIDFdICYgMHhGRjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9wY29kZSA9PSBPcGNvZGVzLklJTkMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG12LnZpc2l0SWluY0luc24ocmVhZFVuc2lnbmVkU2hvcnQodSArIDIpLCByZWFkU2hvcnQodSArIDQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHUgKz0gNjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG12LnZpc2l0VmFySW5zbihvcGNvZGUsIHJlYWRVbnNpZ25lZFNob3J0KHUgKyAyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1ICs9IDQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5UQUJMX0lOU046IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc2tpcHMgMCB0byAzIHBhZGRpbmcgYnl0ZXMKKyAgICAgICAgICAgICAgICAgICAgdSA9IHUgKyA0IC0gKG9mZnNldCAmIDMpOworICAgICAgICAgICAgICAgICAgICAvLyByZWFkcyBpbnN0cnVjdGlvbgorICAgICAgICAgICAgICAgICAgICBpbnQgbGFiZWwgPSBvZmZzZXQgKyByZWFkSW50KHUpOworICAgICAgICAgICAgICAgICAgICBpbnQgbWluID0gcmVhZEludCh1ICsgNCk7CisgICAgICAgICAgICAgICAgICAgIGludCBtYXggPSByZWFkSW50KHUgKyA4KTsKKyAgICAgICAgICAgICAgICAgICAgTGFiZWxbXSB0YWJsZSA9IG5ldyBMYWJlbFttYXggLSBtaW4gKyAxXTsKKyAgICAgICAgICAgICAgICAgICAgdSArPSAxMjsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0YWJsZS5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGFibGVbaV0gPSBsYWJlbHNbb2Zmc2V0ICsgcmVhZEludCh1KV07CisgICAgICAgICAgICAgICAgICAgICAgICB1ICs9IDQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbXYudmlzaXRUYWJsZVN3aXRjaEluc24obWluLCBtYXgsIGxhYmVsc1tsYWJlbF0sIHRhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuTE9PS19JTlNOOiB7CisgICAgICAgICAgICAgICAgICAgIC8vIHNraXBzIDAgdG8gMyBwYWRkaW5nIGJ5dGVzCisgICAgICAgICAgICAgICAgICAgIHUgPSB1ICsgNCAtIChvZmZzZXQgJiAzKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVhZHMgaW5zdHJ1Y3Rpb24KKyAgICAgICAgICAgICAgICAgICAgaW50IGxhYmVsID0gb2Zmc2V0ICsgcmVhZEludCh1KTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGxlbiA9IHJlYWRJbnQodSArIDQpOworICAgICAgICAgICAgICAgICAgICBpbnRbXSBrZXlzID0gbmV3IGludFtsZW5dOworICAgICAgICAgICAgICAgICAgICBMYWJlbFtdIHZhbHVlcyA9IG5ldyBMYWJlbFtsZW5dOworICAgICAgICAgICAgICAgICAgICB1ICs9IDg7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleXNbaV0gPSByZWFkSW50KHUpOworICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzW2ldID0gbGFiZWxzW29mZnNldCArIHJlYWRJbnQodSArIDQpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHUgKz0gODsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtdi52aXNpdExvb2t1cFN3aXRjaEluc24obGFiZWxzW2xhYmVsXSwga2V5cywgdmFsdWVzKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuVkFSX0lOU046CisgICAgICAgICAgICAgICAgICAgIG12LnZpc2l0VmFySW5zbihvcGNvZGUsIGJbdSArIDFdICYgMHhGRik7CisgICAgICAgICAgICAgICAgICAgIHUgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5TQllURV9JTlNOOgorICAgICAgICAgICAgICAgICAgICBtdi52aXNpdEludEluc24ob3Bjb2RlLCBiW3UgKyAxXSk7CisgICAgICAgICAgICAgICAgICAgIHUgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5TSE9SVF9JTlNOOgorICAgICAgICAgICAgICAgICAgICBtdi52aXNpdEludEluc24ob3Bjb2RlLCByZWFkU2hvcnQodSArIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgdSArPSAzOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLkxEQ19JTlNOOgorICAgICAgICAgICAgICAgICAgICBtdi52aXNpdExkY0luc24ocmVhZENvbnN0KGJbdSArIDFdICYgMHhGRiwgYykpOworICAgICAgICAgICAgICAgICAgICB1ICs9IDI7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuTERDV19JTlNOOgorICAgICAgICAgICAgICAgICAgICBtdi52aXNpdExkY0luc24ocmVhZENvbnN0KHJlYWRVbnNpZ25lZFNob3J0KHUgKyAxKSwgYykpOworICAgICAgICAgICAgICAgICAgICB1ICs9IDM7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuRklFTERPUk1FVEhfSU5TTjoKKyAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLklURk1FVEhfSU5TTjogeworICAgICAgICAgICAgICAgICAgICBpbnQgY3BJbmRleCA9IGl0ZW1zW3JlYWRVbnNpZ25lZFNob3J0KHUgKyAxKV07CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXRmID0gYltjcEluZGV4IC0gMV0gPT0gQ2xhc3NXcml0ZXIuSU1FVEg7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpb3duZXIgPSByZWFkQ2xhc3MoY3BJbmRleCwgYyk7CisgICAgICAgICAgICAgICAgICAgIGNwSW5kZXggPSBpdGVtc1tyZWFkVW5zaWduZWRTaG9ydChjcEluZGV4ICsgMildOworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaW5hbWUgPSByZWFkVVRGOChjcEluZGV4LCBjKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGlkZXNjID0gcmVhZFVURjgoY3BJbmRleCArIDIsIGMpOworICAgICAgICAgICAgICAgICAgICBpZiAob3Bjb2RlIDwgT3Bjb2Rlcy5JTlZPS0VWSVJUVUFMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtdi52aXNpdEZpZWxkSW5zbihvcGNvZGUsIGlvd25lciwgaW5hbWUsIGlkZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG12LnZpc2l0TWV0aG9kSW5zbihvcGNvZGUsIGlvd25lciwgaW5hbWUsIGlkZXNjLCBpdGYpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvcGNvZGUgPT0gT3Bjb2Rlcy5JTlZPS0VJTlRFUkZBQ0UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHUgKz0gNTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHUgKz0gMzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5JTkRZTUVUSF9JTlNOOiB7CisgICAgICAgICAgICAgICAgICAgIGludCBjcEluZGV4ID0gaXRlbXNbcmVhZFVuc2lnbmVkU2hvcnQodSArIDEpXTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGJzbUluZGV4ID0gY29udGV4dC5ib290c3RyYXBNZXRob2RzW3JlYWRVbnNpZ25lZFNob3J0KGNwSW5kZXgpXTsKKyAgICAgICAgICAgICAgICAgICAgSGFuZGxlIGJzbSA9IChIYW5kbGUpIHJlYWRDb25zdChyZWFkVW5zaWduZWRTaG9ydChic21JbmRleCksIGMpOworICAgICAgICAgICAgICAgICAgICBpbnQgYnNtQXJnQ291bnQgPSByZWFkVW5zaWduZWRTaG9ydChic21JbmRleCArIDIpOworICAgICAgICAgICAgICAgICAgICBPYmplY3RbXSBic21BcmdzID0gbmV3IE9iamVjdFtic21BcmdDb3VudF07CisgICAgICAgICAgICAgICAgICAgIGJzbUluZGV4ICs9IDQ7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnNtQXJnQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgYnNtQXJnc1tpXSA9IHJlYWRDb25zdChyZWFkVW5zaWduZWRTaG9ydChic21JbmRleCksIGMpOworICAgICAgICAgICAgICAgICAgICAgICAgYnNtSW5kZXggKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjcEluZGV4ID0gaXRlbXNbcmVhZFVuc2lnbmVkU2hvcnQoY3BJbmRleCArIDIpXTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGluYW1lID0gcmVhZFVURjgoY3BJbmRleCwgYyk7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBpZGVzYyA9IHJlYWRVVEY4KGNwSW5kZXggKyAyLCBjKTsKKyAgICAgICAgICAgICAgICAgICAgbXYudmlzaXRJbnZva2VEeW5hbWljSW5zbihpbmFtZSwgaWRlc2MsIGJzbSwgYnNtQXJncyk7CisgICAgICAgICAgICAgICAgICAgIHUgKz0gNTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuVFlQRV9JTlNOOgorICAgICAgICAgICAgICAgICAgICBtdi52aXNpdFR5cGVJbnNuKG9wY29kZSwgcmVhZENsYXNzKHUgKyAxLCBjKSk7CisgICAgICAgICAgICAgICAgICAgIHUgKz0gMzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5JSU5DX0lOU046CisgICAgICAgICAgICAgICAgICAgIG12LnZpc2l0SWluY0luc24oYlt1ICsgMV0gJiAweEZGLCBiW3UgKyAyXSk7CisgICAgICAgICAgICAgICAgICAgIHUgKz0gMzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLy8gY2FzZSBNQU5BX0lOU046CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgbXYudmlzaXRNdWx0aUFOZXdBcnJheUluc24ocmVhZENsYXNzKHUgKyAxLCBjKSwgYlt1ICsgM10gJiAweEZGKTsKKyAgICAgICAgICAgICAgICAgICAgdSArPSA0OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gdmlzaXQgdGhlIGluc3RydWN0aW9uIGFubm90YXRpb25zLCBpZiBhbnkKKyAgICAgICAgICAgIHdoaWxlICh0YW5ucyAhPSBudWxsICYmIHRhbm4gPCB0YW5ucy5sZW5ndGggJiYgbnRvZmYgPD0gb2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgaWYgKG50b2ZmID09IG9mZnNldCkgeworICAgICAgICAgICAgICAgICAgICBpbnQgdiA9IHJlYWRBbm5vdGF0aW9uVGFyZ2V0KGNvbnRleHQsIHRhbm5zW3Rhbm5dKTsKKyAgICAgICAgICAgICAgICAgICAgcmVhZEFubm90YXRpb25WYWx1ZXModiArIDIsIGMsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXYudmlzaXRJbnNuQW5ub3RhdGlvbihjb250ZXh0LnR5cGVSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnR5cGVQYXRoLCByZWFkVVRGOCh2LCBjKSwgdHJ1ZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBudG9mZiA9ICsrdGFubiA+PSB0YW5ucy5sZW5ndGggfHwgcmVhZEJ5dGUodGFubnNbdGFubl0pIDwgMHg0MyA/IC0xCisgICAgICAgICAgICAgICAgICAgICAgICA6IHJlYWRVbnNpZ25lZFNob3J0KHRhbm5zW3Rhbm5dICsgMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAoaXRhbm5zICE9IG51bGwgJiYgaXRhbm4gPCBpdGFubnMubGVuZ3RoICYmIG5pdG9mZiA8PSBvZmZzZXQpIHsKKyAgICAgICAgICAgICAgICBpZiAobml0b2ZmID09IG9mZnNldCkgeworICAgICAgICAgICAgICAgICAgICBpbnQgdiA9IHJlYWRBbm5vdGF0aW9uVGFyZ2V0KGNvbnRleHQsIGl0YW5uc1tpdGFubl0pOworICAgICAgICAgICAgICAgICAgICByZWFkQW5ub3RhdGlvblZhbHVlcyh2ICsgMiwgYywgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdi52aXNpdEluc25Bbm5vdGF0aW9uKGNvbnRleHQudHlwZVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQudHlwZVBhdGgsIHJlYWRVVEY4KHYsIGMpLCBmYWxzZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBuaXRvZmYgPSArK2l0YW5uID49IGl0YW5ucy5sZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgICAgICB8fCByZWFkQnl0ZShpdGFubnNbaXRhbm5dKSA8IDB4NDMgPyAtMQorICAgICAgICAgICAgICAgICAgICAgICAgOiByZWFkVW5zaWduZWRTaG9ydChpdGFubnNbaXRhbm5dICsgMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxhYmVsc1tjb2RlTGVuZ3RoXSAhPSBudWxsKSB7CisgICAgICAgICAgICBtdi52aXNpdExhYmVsKGxhYmVsc1tjb2RlTGVuZ3RoXSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB2aXNpdHMgdGhlIGxvY2FsIHZhcmlhYmxlIHRhYmxlcworICAgICAgICBpZiAoKGNvbnRleHQuZmxhZ3MgJiBTS0lQX0RFQlVHKSA9PSAwICYmIHZhclRhYmxlICE9IDApIHsKKyAgICAgICAgICAgIGludFtdIHR5cGVUYWJsZSA9IG51bGw7CisgICAgICAgICAgICBpZiAodmFyVHlwZVRhYmxlICE9IDApIHsKKyAgICAgICAgICAgICAgICB1ID0gdmFyVHlwZVRhYmxlICsgMjsKKyAgICAgICAgICAgICAgICB0eXBlVGFibGUgPSBuZXcgaW50W3JlYWRVbnNpZ25lZFNob3J0KHZhclR5cGVUYWJsZSkgKiAzXTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gdHlwZVRhYmxlLmxlbmd0aDsgaSA+IDA7KSB7CisgICAgICAgICAgICAgICAgICAgIHR5cGVUYWJsZVstLWldID0gdSArIDY7IC8vIHNpZ25hdHVyZQorICAgICAgICAgICAgICAgICAgICB0eXBlVGFibGVbLS1pXSA9IHJlYWRVbnNpZ25lZFNob3J0KHUgKyA4KTsgLy8gaW5kZXgKKyAgICAgICAgICAgICAgICAgICAgdHlwZVRhYmxlWy0taV0gPSByZWFkVW5zaWduZWRTaG9ydCh1KTsgLy8gc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgdSArPSAxMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1ID0gdmFyVGFibGUgKyAyOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHJlYWRVbnNpZ25lZFNob3J0KHZhclRhYmxlKTsgaSA+IDA7IC0taSkgeworICAgICAgICAgICAgICAgIGludCBzdGFydCA9IHJlYWRVbnNpZ25lZFNob3J0KHUpOworICAgICAgICAgICAgICAgIGludCBsZW5ndGggPSByZWFkVW5zaWduZWRTaG9ydCh1ICsgMik7CisgICAgICAgICAgICAgICAgaW50IGluZGV4ID0gcmVhZFVuc2lnbmVkU2hvcnQodSArIDgpOworICAgICAgICAgICAgICAgIFN0cmluZyB2c2lnbmF0dXJlID0gbnVsbDsKKyAgICAgICAgICAgICAgICBpZiAodHlwZVRhYmxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCB0eXBlVGFibGUubGVuZ3RoOyBqICs9IDMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlVGFibGVbal0gPT0gc3RhcnQgJiYgdHlwZVRhYmxlW2ogKyAxXSA9PSBpbmRleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZzaWduYXR1cmUgPSByZWFkVVRGOCh0eXBlVGFibGVbaiArIDJdLCBjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtdi52aXNpdExvY2FsVmFyaWFibGUocmVhZFVURjgodSArIDQsIGMpLCByZWFkVVRGOCh1ICsgNiwgYyksCisgICAgICAgICAgICAgICAgICAgICAgICB2c2lnbmF0dXJlLCBsYWJlbHNbc3RhcnRdLCBsYWJlbHNbc3RhcnQgKyBsZW5ndGhdLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgpOworICAgICAgICAgICAgICAgIHUgKz0gMTA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyB2aXNpdHMgdGhlIGxvY2FsIHZhcmlhYmxlcyB0eXBlIGFubm90YXRpb25zCisgICAgICAgIGlmICh0YW5ucyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhbm5zLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKChyZWFkQnl0ZSh0YW5uc1tpXSkgPj4gMSkgPT0gKDB4NDAgPj4gMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHYgPSByZWFkQW5ub3RhdGlvblRhcmdldChjb250ZXh0LCB0YW5uc1tpXSk7CisgICAgICAgICAgICAgICAgICAgIHYgPSByZWFkQW5ub3RhdGlvblZhbHVlcyh2ICsgMiwgYywgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdi52aXNpdExvY2FsVmFyaWFibGVBbm5vdGF0aW9uKGNvbnRleHQudHlwZVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQudHlwZVBhdGgsIGNvbnRleHQuc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmVuZCwgY29udGV4dC5pbmRleCwgcmVhZFVURjgodiwgYyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChpdGFubnMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGFubnMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAoKHJlYWRCeXRlKGl0YW5uc1tpXSkgPj4gMSkgPT0gKDB4NDAgPj4gMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHYgPSByZWFkQW5ub3RhdGlvblRhcmdldChjb250ZXh0LCBpdGFubnNbaV0pOworICAgICAgICAgICAgICAgICAgICB2ID0gcmVhZEFubm90YXRpb25WYWx1ZXModiArIDIsIGMsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXYudmlzaXRMb2NhbFZhcmlhYmxlQW5ub3RhdGlvbihjb250ZXh0LnR5cGVSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnR5cGVQYXRoLCBjb250ZXh0LnN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5lbmQsIGNvbnRleHQuaW5kZXgsIHJlYWRVVEY4KHYsIGMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyB2aXNpdHMgdGhlIGNvZGUgYXR0cmlidXRlcworICAgICAgICB3aGlsZSAoYXR0cmlidXRlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBBdHRyaWJ1dGUgYXR0ciA9IGF0dHJpYnV0ZXMubmV4dDsKKyAgICAgICAgICAgIGF0dHJpYnV0ZXMubmV4dCA9IG51bGw7CisgICAgICAgICAgICBtdi52aXNpdEF0dHJpYnV0ZShhdHRyaWJ1dGVzKTsKKyAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBhdHRyOworICAgICAgICB9CisKKyAgICAgICAgLy8gdmlzaXRzIHRoZSBtYXggc3RhY2sgYW5kIG1heCBsb2NhbHMgdmFsdWVzCisgICAgICAgIG12LnZpc2l0TWF4cyhtYXhTdGFjaywgbWF4TG9jYWxzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgYSB0eXBlIGFubm90YXRpb24gdGFibGUgdG8gZmluZCB0aGUgbGFiZWxzLCBhbmQgdG8gdmlzaXQgdGhlIHRyeQorICAgICAqIGNhdGNoIGJsb2NrIGFubm90YXRpb25zLgorICAgICAqCisgICAgICogQHBhcmFtIHUKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydCBvZmZzZXQgb2YgYSB0eXBlIGFubm90YXRpb24gdGFibGUuCisgICAgICogQHBhcmFtIG12CisgICAgICogICAgICAgICAgICB0aGUgbWV0aG9kIHZpc2l0b3IgdG8gYmUgdXNlZCB0byB2aXNpdCB0aGUgdHJ5IGNhdGNoIGJsb2NrCisgICAgICogICAgICAgICAgICBhbm5vdGF0aW9ucy4KKyAgICAgKiBAcGFyYW0gY29udGV4dAorICAgICAqICAgICAgICAgICAgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNsYXNzIGJlaW5nIHBhcnNlZC4KKyAgICAgKiBAcGFyYW0gdmlzaWJsZQorICAgICAqICAgICAgICAgICAgaWYgdGhlIHR5cGUgYW5ub3RhdGlvbiB0YWJsZSB0byBwYXJzZSBjb250YWlucyBydW50aW1lIHZpc2libGUKKyAgICAgKiAgICAgICAgICAgIGFubm90YXRpb25zLgorICAgICAqIEByZXR1cm4gdGhlIHN0YXJ0IG9mZnNldCBvZiBlYWNoIHR5cGUgYW5ub3RhdGlvbiBpbiB0aGUgcGFyc2VkIHRhYmxlLgorICAgICAqLworICAgIHByaXZhdGUgaW50W10gcmVhZFR5cGVBbm5vdGF0aW9ucyhmaW5hbCBNZXRob2RWaXNpdG9yIG12LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQsIGludCB1LCBib29sZWFuIHZpc2libGUpIHsKKyAgICAgICAgY2hhcltdIGMgPSBjb250ZXh0LmJ1ZmZlcjsKKyAgICAgICAgaW50W10gb2Zmc2V0cyA9IG5ldyBpbnRbcmVhZFVuc2lnbmVkU2hvcnQodSldOworICAgICAgICB1ICs9IDI7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb2Zmc2V0cy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgb2Zmc2V0c1tpXSA9IHU7CisgICAgICAgICAgICBpbnQgdGFyZ2V0ID0gcmVhZEludCh1KTsKKyAgICAgICAgICAgIHN3aXRjaCAodGFyZ2V0ID4+PiAyNCkgeworICAgICAgICAgICAgICAgIGNhc2UgMHgwMDogLy8gQ0xBU1NfVFlQRV9QQVJBTUVURVIKKyAgICAgICAgICAgICAgICBjYXNlIDB4MDE6IC8vIE1FVEhPRF9UWVBFX1BBUkFNRVRFUgorICAgICAgICAgICAgICAgIGNhc2UgMHgxNjogLy8gTUVUSE9EX0ZPUk1BTF9QQVJBTUVURVIKKyAgICAgICAgICAgICAgICAgICAgdSArPSAyOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDB4MTM6IC8vIEZJRUxECisgICAgICAgICAgICAgICAgY2FzZSAweDE0OiAvLyBNRVRIT0RfUkVUVVJOCisgICAgICAgICAgICAgICAgY2FzZSAweDE1OiAvLyBNRVRIT0RfUkVDRUlWRVIKKyAgICAgICAgICAgICAgICAgICAgdSArPSAxOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDB4NDA6IC8vIExPQ0FMX1ZBUklBQkxFCisgICAgICAgICAgICAgICAgY2FzZSAweDQxOiAvLyBSRVNPVVJDRV9WQVJJQUJMRQorICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gcmVhZFVuc2lnbmVkU2hvcnQodSArIDEpOyBqID4gMDsgLS1qKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQgPSByZWFkVW5zaWduZWRTaG9ydCh1ICsgMyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gcmVhZFVuc2lnbmVkU2hvcnQodSArIDUpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVhZExhYmVsKHN0YXJ0LCBjb250ZXh0LmxhYmVscyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZWFkTGFiZWwoc3RhcnQgKyBsZW5ndGgsIGNvbnRleHQubGFiZWxzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHUgKz0gNjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB1ICs9IDM7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMHg0NzogLy8gQ0FTVAorICAgICAgICAgICAgICAgIGNhc2UgMHg0ODogLy8gQ09OU1RSVUNUT1JfSU5WT0NBVElPTl9UWVBFX0FSR1VNRU5UCisgICAgICAgICAgICAgICAgY2FzZSAweDQ5OiAvLyBNRVRIT0RfSU5WT0NBVElPTl9UWVBFX0FSR1VNRU5UCisgICAgICAgICAgICAgICAgY2FzZSAweDRBOiAvLyBDT05TVFJVQ1RPUl9SRUZFUkVOQ0VfVFlQRV9BUkdVTUVOVAorICAgICAgICAgICAgICAgIGNhc2UgMHg0QjogLy8gTUVUSE9EX1JFRkVSRU5DRV9UWVBFX0FSR1VNRU5UCisgICAgICAgICAgICAgICAgICAgIHUgKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgLy8gY2FzZSAweDEwOiAvLyBDTEFTU19FWFRFTkRTCisgICAgICAgICAgICAgICAgLy8gY2FzZSAweDExOiAvLyBDTEFTU19UWVBFX1BBUkFNRVRFUl9CT1VORAorICAgICAgICAgICAgICAgIC8vIGNhc2UgMHgxMjogLy8gTUVUSE9EX1RZUEVfUEFSQU1FVEVSX0JPVU5ECisgICAgICAgICAgICAgICAgLy8gY2FzZSAweDE3OiAvLyBUSFJPV1MKKyAgICAgICAgICAgICAgICAvLyBjYXNlIDB4NDI6IC8vIEVYQ0VQVElPTl9QQVJBTUVURVIKKyAgICAgICAgICAgICAgICAvLyBjYXNlIDB4NDM6IC8vIElOU1RBTkNFT0YKKyAgICAgICAgICAgICAgICAvLyBjYXNlIDB4NDQ6IC8vIE5FVworICAgICAgICAgICAgICAgIC8vIGNhc2UgMHg0NTogLy8gQ09OU1RSVUNUT1JfUkVGRVJFTkNFCisgICAgICAgICAgICAgICAgLy8gY2FzZSAweDQ2OiAvLyBNRVRIT0RfUkVGRVJFTkNFCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgdSArPSAzOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBwYXRoTGVuZ3RoID0gcmVhZEJ5dGUodSk7CisgICAgICAgICAgICBpZiAoKHRhcmdldCA+Pj4gMjQpID09IDB4NDIpIHsKKyAgICAgICAgICAgICAgICBUeXBlUGF0aCBwYXRoID0gcGF0aExlbmd0aCA9PSAwID8gbnVsbCA6IG5ldyBUeXBlUGF0aChiLCB1KTsKKyAgICAgICAgICAgICAgICB1ICs9IDEgKyAyICogcGF0aExlbmd0aDsKKyAgICAgICAgICAgICAgICB1ID0gcmVhZEFubm90YXRpb25WYWx1ZXModSArIDIsIGMsIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICBtdi52aXNpdFRyeUNhdGNoQW5ub3RhdGlvbih0YXJnZXQsIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRVVEY4KHUsIGMpLCB2aXNpYmxlKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHUgPSByZWFkQW5ub3RhdGlvblZhbHVlcyh1ICsgMyArIDIgKiBwYXRoTGVuZ3RoLCBjLCB0cnVlLCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb2Zmc2V0czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJzZXMgdGhlIGhlYWRlciBvZiBhIHR5cGUgYW5ub3RhdGlvbiB0byBleHRyYWN0IGl0cyB0YXJnZXRfdHlwZSBhbmQKKyAgICAgKiB0YXJnZXRfcGF0aCAodGhlIHJlc3VsdCBpcyBzdG9yZWQgaW4gdGhlIGdpdmVuIGNvbnRleHQpLCBhbmQgcmV0dXJucyB0aGUKKyAgICAgKiBzdGFydCBvZmZzZXQgb2YgdGhlIHJlc3Qgb2YgdGhlIHR5cGVfYW5ub3RhdGlvbiBzdHJ1Y3R1cmUgKGkuZS4gdGhlCisgICAgICogb2Zmc2V0IHRvIHRoZSB0eXBlX2luZGV4IGZpZWxkLCB3aGljaCBpcyBmb2xsb3dlZCBieQorICAgICAqIG51bV9lbGVtZW50X3ZhbHVlX3BhaXJzIGFuZCB0aGVuIHRoZSBuYW1lLHZhbHVlIHBhaXJzKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0CisgICAgICogICAgICAgICAgICBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2xhc3MgYmVpbmcgcGFyc2VkLiBUaGlzIGlzIHdoZXJlIHRoZQorICAgICAqICAgICAgICAgICAgZXh0cmFjdGVkIHRhcmdldF90eXBlIGFuZCB0YXJnZXRfcGF0aCBtdXN0IGJlIHN0b3JlZC4KKyAgICAgKiBAcGFyYW0gdQorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IG9mZnNldCBvZiBhIHR5cGVfYW5ub3RhdGlvbiBzdHJ1Y3R1cmUuCisgICAgICogQHJldHVybiB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSByZXN0IG9mIHRoZSB0eXBlX2Fubm90YXRpb24gc3RydWN0dXJlLgorICAgICAqLworICAgIHByaXZhdGUgaW50IHJlYWRBbm5vdGF0aW9uVGFyZ2V0KGZpbmFsIENvbnRleHQgY29udGV4dCwgaW50IHUpIHsKKyAgICAgICAgaW50IHRhcmdldCA9IHJlYWRJbnQodSk7CisgICAgICAgIHN3aXRjaCAodGFyZ2V0ID4+PiAyNCkgeworICAgICAgICAgICAgY2FzZSAweDAwOiAvLyBDTEFTU19UWVBFX1BBUkFNRVRFUgorICAgICAgICAgICAgY2FzZSAweDAxOiAvLyBNRVRIT0RfVFlQRV9QQVJBTUVURVIKKyAgICAgICAgICAgIGNhc2UgMHgxNjogLy8gTUVUSE9EX0ZPUk1BTF9QQVJBTUVURVIKKyAgICAgICAgICAgICAgICB0YXJnZXQgJj0gMHhGRkZGMDAwMDsKKyAgICAgICAgICAgICAgICB1ICs9IDI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDB4MTM6IC8vIEZJRUxECisgICAgICAgICAgICBjYXNlIDB4MTQ6IC8vIE1FVEhPRF9SRVRVUk4KKyAgICAgICAgICAgIGNhc2UgMHgxNTogLy8gTUVUSE9EX1JFQ0VJVkVSCisgICAgICAgICAgICAgICAgdGFyZ2V0ICY9IDB4RkYwMDAwMDA7CisgICAgICAgICAgICAgICAgdSArPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAweDQwOiAvLyBMT0NBTF9WQVJJQUJMRQorICAgICAgICAgICAgY2FzZSAweDQxOiB7IC8vIFJFU09VUkNFX1ZBUklBQkxFCisgICAgICAgICAgICAgICAgdGFyZ2V0ICY9IDB4RkYwMDAwMDA7CisgICAgICAgICAgICAgICAgaW50IG4gPSByZWFkVW5zaWduZWRTaG9ydCh1ICsgMSk7CisgICAgICAgICAgICAgICAgY29udGV4dC5zdGFydCA9IG5ldyBMYWJlbFtuXTsKKyAgICAgICAgICAgICAgICBjb250ZXh0LmVuZCA9IG5ldyBMYWJlbFtuXTsKKyAgICAgICAgICAgICAgICBjb250ZXh0LmluZGV4ID0gbmV3IGludFtuXTsKKyAgICAgICAgICAgICAgICB1ICs9IDM7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0ID0gcmVhZFVuc2lnbmVkU2hvcnQodSk7CisgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGggPSByZWFkVW5zaWduZWRTaG9ydCh1ICsgMik7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc3RhcnRbaV0gPSByZWFkTGFiZWwoc3RhcnQsIGNvbnRleHQubGFiZWxzKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5lbmRbaV0gPSByZWFkTGFiZWwoc3RhcnQgKyBsZW5ndGgsIGNvbnRleHQubGFiZWxzKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5pbmRleFtpXSA9IHJlYWRVbnNpZ25lZFNob3J0KHUgKyA0KTsKKyAgICAgICAgICAgICAgICAgICAgdSArPSA2OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgMHg0NzogLy8gQ0FTVAorICAgICAgICAgICAgY2FzZSAweDQ4OiAvLyBDT05TVFJVQ1RPUl9JTlZPQ0FUSU9OX1RZUEVfQVJHVU1FTlQKKyAgICAgICAgICAgIGNhc2UgMHg0OTogLy8gTUVUSE9EX0lOVk9DQVRJT05fVFlQRV9BUkdVTUVOVAorICAgICAgICAgICAgY2FzZSAweDRBOiAvLyBDT05TVFJVQ1RPUl9SRUZFUkVOQ0VfVFlQRV9BUkdVTUVOVAorICAgICAgICAgICAgY2FzZSAweDRCOiAvLyBNRVRIT0RfUkVGRVJFTkNFX1RZUEVfQVJHVU1FTlQKKyAgICAgICAgICAgICAgICB0YXJnZXQgJj0gMHhGRjAwMDBGRjsKKyAgICAgICAgICAgICAgICB1ICs9IDQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAvLyBjYXNlIDB4MTA6IC8vIENMQVNTX0VYVEVORFMKKyAgICAgICAgICAgIC8vIGNhc2UgMHgxMTogLy8gQ0xBU1NfVFlQRV9QQVJBTUVURVJfQk9VTkQKKyAgICAgICAgICAgIC8vIGNhc2UgMHgxMjogLy8gTUVUSE9EX1RZUEVfUEFSQU1FVEVSX0JPVU5ECisgICAgICAgICAgICAvLyBjYXNlIDB4MTc6IC8vIFRIUk9XUworICAgICAgICAgICAgLy8gY2FzZSAweDQyOiAvLyBFWENFUFRJT05fUEFSQU1FVEVSCisgICAgICAgICAgICAvLyBjYXNlIDB4NDM6IC8vIElOU1RBTkNFT0YKKyAgICAgICAgICAgIC8vIGNhc2UgMHg0NDogLy8gTkVXCisgICAgICAgICAgICAvLyBjYXNlIDB4NDU6IC8vIENPTlNUUlVDVE9SX1JFRkVSRU5DRQorICAgICAgICAgICAgLy8gY2FzZSAweDQ2OiAvLyBNRVRIT0RfUkVGRVJFTkNFCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHRhcmdldCAmPSAodGFyZ2V0ID4+PiAyNCkgPCAweDQzID8gMHhGRkZGRkYwMCA6IDB4RkYwMDAwMDA7CisgICAgICAgICAgICAgICAgdSArPSAzOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGludCBwYXRoTGVuZ3RoID0gcmVhZEJ5dGUodSk7CisgICAgICAgIGNvbnRleHQudHlwZVJlZiA9IHRhcmdldDsKKyAgICAgICAgY29udGV4dC50eXBlUGF0aCA9IHBhdGhMZW5ndGggPT0gMCA/IG51bGwgOiBuZXcgVHlwZVBhdGgoYiwgdSk7CisgICAgICAgIHJldHVybiB1ICsgMSArIDIgKiBwYXRoTGVuZ3RoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIHBhcmFtZXRlciBhbm5vdGF0aW9ucyBhbmQgbWFrZXMgdGhlIGdpdmVuIHZpc2l0b3IgdmlzaXQgdGhlbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtdgorICAgICAqICAgICAgICAgICAgdGhlIHZpc2l0b3IgdGhhdCBtdXN0IHZpc2l0IHRoZSBhbm5vdGF0aW9ucy4KKyAgICAgKiBAcGFyYW0gY29udGV4dAorICAgICAqICAgICAgICAgICAgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNsYXNzIGJlaW5nIHBhcnNlZC4KKyAgICAgKiBAcGFyYW0gdgorICAgICAqICAgICAgICAgICAgc3RhcnQgb2Zmc2V0IGluIHtAbGluayAjYiBifSBvZiB0aGUgYW5ub3RhdGlvbnMgdG8gYmUgcmVhZC4KKyAgICAgKiBAcGFyYW0gdmlzaWJsZQorICAgICAqICAgICAgICAgICAgPHR0PnRydWU8L3R0PiBpZiB0aGUgYW5ub3RhdGlvbnMgdG8gYmUgcmVhZCBhcmUgdmlzaWJsZSBhdAorICAgICAqICAgICAgICAgICAgcnVudGltZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcmVhZFBhcmFtZXRlckFubm90YXRpb25zKGZpbmFsIE1ldGhvZFZpc2l0b3IgbXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQsIGludCB2LCBmaW5hbCBib29sZWFuIHZpc2libGUpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGludCBuID0gYlt2KytdICYgMHhGRjsKKyAgICAgICAgLy8gd29ya2Fyb3VuZCBmb3IgYSBidWcgaW4gamF2YWMgKGphdmFjIGNvbXBpbGVyIGdlbmVyYXRlcyBhIHBhcmFtZXRlcgorICAgICAgICAvLyBhbm5vdGF0aW9uIGFycmF5IHdob3NlIHNpemUgaXMgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzIGluCisgICAgICAgIC8vIHRoZSBKYXZhIHNvdXJjZSBmaWxlLCB3aGlsZSBpdCBzaG91bGQgZ2VuZXJhdGUgYW4gYXJyYXkgd2hvc2Ugc2l6ZSBpcworICAgICAgICAvLyBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlcnMgaW4gdGhlIG1ldGhvZCBkZXNjcmlwdG9yIC0gd2hpY2gKKyAgICAgICAgLy8gaW5jbHVkZXMgdGhlIHN5bnRoZXRpYyBwYXJhbWV0ZXJzIGFkZGVkIGJ5IHRoZSBjb21waWxlcikuIFRoaXMgd29yay0KKyAgICAgICAgLy8gYXJvdW5kIHN1cHBvc2VzIHRoYXQgdGhlIHN5bnRoZXRpYyBwYXJhbWV0ZXJzIGFyZSB0aGUgZmlyc3Qgb25lcy4KKyAgICAgICAgaW50IHN5bnRoZXRpY3MgPSBUeXBlLmdldEFyZ3VtZW50VHlwZXMoY29udGV4dC5kZXNjKS5sZW5ndGggLSBuOworICAgICAgICBBbm5vdGF0aW9uVmlzaXRvciBhdjsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHN5bnRoZXRpY3M7ICsraSkgeworICAgICAgICAgICAgLy8gdmlydHVhbCBhbm5vdGF0aW9uIHRvIGRldGVjdCBzeW50aGV0aWMgcGFyYW1ldGVycyBpbiBNZXRob2RXcml0ZXIKKyAgICAgICAgICAgIGF2ID0gbXYudmlzaXRQYXJhbWV0ZXJBbm5vdGF0aW9uKGksICJMamF2YS9sYW5nL1N5bnRoZXRpYzsiLCBmYWxzZSk7CisgICAgICAgICAgICBpZiAoYXYgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGF2LnZpc2l0RW5kKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY2hhcltdIGMgPSBjb250ZXh0LmJ1ZmZlcjsKKyAgICAgICAgZm9yICg7IGkgPCBuICsgc3ludGhldGljczsgKytpKSB7CisgICAgICAgICAgICBpbnQgaiA9IHJlYWRVbnNpZ25lZFNob3J0KHYpOworICAgICAgICAgICAgdiArPSAyOworICAgICAgICAgICAgZm9yICg7IGogPiAwOyAtLWopIHsKKyAgICAgICAgICAgICAgICBhdiA9IG12LnZpc2l0UGFyYW1ldGVyQW5ub3RhdGlvbihpLCByZWFkVVRGOCh2LCBjKSwgdmlzaWJsZSk7CisgICAgICAgICAgICAgICAgdiA9IHJlYWRBbm5vdGF0aW9uVmFsdWVzKHYgKyAyLCBjLCB0cnVlLCBhdik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyB0aGUgdmFsdWVzIG9mIGFuIGFubm90YXRpb24gYW5kIG1ha2VzIHRoZSBnaXZlbiB2aXNpdG9yIHZpc2l0IHRoZW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdgorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IG9mZnNldCBpbiB7QGxpbmsgI2IgYn0gb2YgdGhlIHZhbHVlcyB0byBiZSByZWFkCisgICAgICogICAgICAgICAgICAoaW5jbHVkaW5nIHRoZSB1bnNpZ25lZCBzaG9ydCB0aGF0IGdpdmVzIHRoZSBudW1iZXIgb2YKKyAgICAgKiAgICAgICAgICAgIHZhbHVlcykuCisgICAgICogQHBhcmFtIGJ1ZgorICAgICAqICAgICAgICAgICAgYnVmZmVyIHRvIGJlIHVzZWQgdG8gY2FsbCB7QGxpbmsgI3JlYWRVVEY4IHJlYWRVVEY4fSwKKyAgICAgKiAgICAgICAgICAgIHtAbGluayAjcmVhZENsYXNzKGludCxjaGFyW10pIHJlYWRDbGFzc30gb3Ige0BsaW5rICNyZWFkQ29uc3QKKyAgICAgKiAgICAgICAgICAgIHJlYWRDb25zdH0uCisgICAgICogQHBhcmFtIG5hbWVkCisgICAgICogICAgICAgICAgICBpZiB0aGUgYW5ub3RhdGlvbiB2YWx1ZXMgYXJlIG5hbWVkIG9yIG5vdC4KKyAgICAgKiBAcGFyYW0gYXYKKyAgICAgKiAgICAgICAgICAgIHRoZSB2aXNpdG9yIHRoYXQgbXVzdCB2aXNpdCB0aGUgdmFsdWVzLgorICAgICAqIEByZXR1cm4gdGhlIGVuZCBvZmZzZXQgb2YgdGhlIGFubm90YXRpb24gdmFsdWVzLgorICAgICAqLworICAgIHByaXZhdGUgaW50IHJlYWRBbm5vdGF0aW9uVmFsdWVzKGludCB2LCBmaW5hbCBjaGFyW10gYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gbmFtZWQsIGZpbmFsIEFubm90YXRpb25WaXNpdG9yIGF2KSB7CisgICAgICAgIGludCBpID0gcmVhZFVuc2lnbmVkU2hvcnQodik7CisgICAgICAgIHYgKz0gMjsKKyAgICAgICAgaWYgKG5hbWVkKSB7CisgICAgICAgICAgICBmb3IgKDsgaSA+IDA7IC0taSkgeworICAgICAgICAgICAgICAgIHYgPSByZWFkQW5ub3RhdGlvblZhbHVlKHYgKyAyLCBidWYsIHJlYWRVVEY4KHYsIGJ1ZiksIGF2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoOyBpID4gMDsgLS1pKSB7CisgICAgICAgICAgICAgICAgdiA9IHJlYWRBbm5vdGF0aW9uVmFsdWUodiwgYnVmLCBudWxsLCBhdik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF2ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGF2LnZpc2l0RW5kKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHY7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgYSB2YWx1ZSBvZiBhbiBhbm5vdGF0aW9uIGFuZCBtYWtlcyB0aGUgZ2l2ZW4gdmlzaXRvciB2aXNpdCBpdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgb2Zmc2V0IGluIHtAbGluayAjYiBifSBvZiB0aGUgdmFsdWUgdG8gYmUgcmVhZAorICAgICAqICAgICAgICAgICAgKDxpPm5vdCBpbmNsdWRpbmcgdGhlIHZhbHVlIG5hbWUgY29uc3RhbnQgcG9vbCBpbmRleDwvaT4pLgorICAgICAqIEBwYXJhbSBidWYKKyAgICAgKiAgICAgICAgICAgIGJ1ZmZlciB0byBiZSB1c2VkIHRvIGNhbGwge0BsaW5rICNyZWFkVVRGOCByZWFkVVRGOH0sCisgICAgICogICAgICAgICAgICB7QGxpbmsgI3JlYWRDbGFzcyhpbnQsY2hhcltdKSByZWFkQ2xhc3N9IG9yIHtAbGluayAjcmVhZENvbnN0CisgICAgICogICAgICAgICAgICByZWFkQ29uc3R9LgorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgbmFtZSBvZiB0aGUgdmFsdWUgdG8gYmUgcmVhZC4KKyAgICAgKiBAcGFyYW0gYXYKKyAgICAgKiAgICAgICAgICAgIHRoZSB2aXNpdG9yIHRoYXQgbXVzdCB2aXNpdCB0aGUgdmFsdWUuCisgICAgICogQHJldHVybiB0aGUgZW5kIG9mZnNldCBvZiB0aGUgYW5ub3RhdGlvbiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCByZWFkQW5ub3RhdGlvblZhbHVlKGludCB2LCBmaW5hbCBjaGFyW10gYnVmLCBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25WaXNpdG9yIGF2KSB7CisgICAgICAgIGludCBpOworICAgICAgICBpZiAoYXYgPT0gbnVsbCkgeworICAgICAgICAgICAgc3dpdGNoIChiW3ZdICYgMHhGRikgeworICAgICAgICAgICAgICAgIGNhc2UgJ2UnOiAvLyBlbnVtX2NvbnN0X3ZhbHVlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB2ICsgNTsKKyAgICAgICAgICAgICAgICBjYXNlICdAJzogLy8gYW5ub3RhdGlvbl92YWx1ZQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVhZEFubm90YXRpb25WYWx1ZXModiArIDMsIGJ1ZiwgdHJ1ZSwgbnVsbCk7CisgICAgICAgICAgICAgICAgY2FzZSAnWyc6IC8vIGFycmF5X3ZhbHVlCisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFkQW5ub3RhdGlvblZhbHVlcyh2ICsgMSwgYnVmLCBmYWxzZSwgbnVsbCk7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHYgKyAzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN3aXRjaCAoYlt2KytdICYgMHhGRikgeworICAgICAgICAgICAgY2FzZSAnSSc6IC8vIHBvaW50ZXIgdG8gQ09OU1RBTlRfSW50ZWdlcgorICAgICAgICAgICAgY2FzZSAnSic6IC8vIHBvaW50ZXIgdG8gQ09OU1RBTlRfTG9uZworICAgICAgICAgICAgY2FzZSAnRic6IC8vIHBvaW50ZXIgdG8gQ09OU1RBTlRfRmxvYXQKKyAgICAgICAgICAgIGNhc2UgJ0QnOiAvLyBwb2ludGVyIHRvIENPTlNUQU5UX0RvdWJsZQorICAgICAgICAgICAgICAgIGF2LnZpc2l0KG5hbWUsIHJlYWRDb25zdChyZWFkVW5zaWduZWRTaG9ydCh2KSwgYnVmKSk7CisgICAgICAgICAgICAgICAgdiArPSAyOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnQic6IC8vIHBvaW50ZXIgdG8gQ09OU1RBTlRfQnl0ZQorICAgICAgICAgICAgICAgIGF2LnZpc2l0KG5hbWUsIChieXRlKSByZWFkSW50KGl0ZW1zW3JlYWRVbnNpZ25lZFNob3J0KHYpXSkpOworICAgICAgICAgICAgICAgIHYgKz0gMjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ1onOiAvLyBwb2ludGVyIHRvIENPTlNUQU5UX0Jvb2xlYW4KKyAgICAgICAgICAgICAgICBhdi52aXNpdChuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVhZEludChpdGVtc1tyZWFkVW5zaWduZWRTaG9ydCh2KV0pID09IDAgPyBCb29sZWFuLkZBTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQm9vbGVhbi5UUlVFKTsKKyAgICAgICAgICAgICAgICB2ICs9IDI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdTJzogLy8gcG9pbnRlciB0byBDT05TVEFOVF9TaG9ydAorICAgICAgICAgICAgICAgIGF2LnZpc2l0KG5hbWUsIChzaG9ydCkgcmVhZEludChpdGVtc1tyZWFkVW5zaWduZWRTaG9ydCh2KV0pKTsKKyAgICAgICAgICAgICAgICB2ICs9IDI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdDJzogLy8gcG9pbnRlciB0byBDT05TVEFOVF9DaGFyCisgICAgICAgICAgICAgICAgYXYudmlzaXQobmFtZSwgKGNoYXIpIHJlYWRJbnQoaXRlbXNbcmVhZFVuc2lnbmVkU2hvcnQodildKSk7CisgICAgICAgICAgICAgICAgdiArPSAyOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAncyc6IC8vIHBvaW50ZXIgdG8gQ09OU1RBTlRfVXRmOAorICAgICAgICAgICAgICAgIGF2LnZpc2l0KG5hbWUsIHJlYWRVVEY4KHYsIGJ1ZikpOworICAgICAgICAgICAgICAgIHYgKz0gMjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgJ2UnOiAvLyBlbnVtX2NvbnN0X3ZhbHVlCisgICAgICAgICAgICAgICAgYXYudmlzaXRFbnVtKG5hbWUsIHJlYWRVVEY4KHYsIGJ1ZiksIHJlYWRVVEY4KHYgKyAyLCBidWYpKTsKKyAgICAgICAgICAgICAgICB2ICs9IDQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdjJzogLy8gY2xhc3NfaW5mbworICAgICAgICAgICAgICAgIGF2LnZpc2l0KG5hbWUsIFR5cGUuZ2V0VHlwZShyZWFkVVRGOCh2LCBidWYpKSk7CisgICAgICAgICAgICAgICAgdiArPSAyOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnQCc6IC8vIGFubm90YXRpb25fdmFsdWUKKyAgICAgICAgICAgICAgICB2ID0gcmVhZEFubm90YXRpb25WYWx1ZXModiArIDIsIGJ1ZiwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF2LnZpc2l0QW5ub3RhdGlvbihuYW1lLCByZWFkVVRGOCh2LCBidWYpKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlICdbJzogLy8gYXJyYXlfdmFsdWUKKyAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IHJlYWRVbnNpZ25lZFNob3J0KHYpOworICAgICAgICAgICAgICAgIHYgKz0gMjsKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFkQW5ub3RhdGlvblZhbHVlcyh2IC0gMiwgYnVmLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdi52aXNpdEFycmF5KG5hbWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLmJbdisrXSAmIDB4RkYpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnQic6CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlW10gYnYgPSBuZXcgYnl0ZVtzaXplXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidltpXSA9IChieXRlKSByZWFkSW50KGl0ZW1zW3JlYWRVbnNpZ25lZFNob3J0KHYpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiArPSAzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYXYudmlzaXQobmFtZSwgYnYpOworICAgICAgICAgICAgICAgICAgICAgICAgLS12OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1onOgorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbltdIHp2ID0gbmV3IGJvb2xlYW5bc2l6ZV07CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgenZbaV0gPSByZWFkSW50KGl0ZW1zW3JlYWRVbnNpZ25lZFNob3J0KHYpXSkgIT0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ICs9IDM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBhdi52aXNpdChuYW1lLCB6dik7CisgICAgICAgICAgICAgICAgICAgICAgICAtLXY7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnUyc6CisgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydFtdIHN2ID0gbmV3IHNob3J0W3NpemVdOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN2W2ldID0gKHNob3J0KSByZWFkSW50KGl0ZW1zW3JlYWRVbnNpZ25lZFNob3J0KHYpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiArPSAzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYXYudmlzaXQobmFtZSwgc3YpOworICAgICAgICAgICAgICAgICAgICAgICAgLS12OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0MnOgorICAgICAgICAgICAgICAgICAgICAgICAgY2hhcltdIGN2ID0gbmV3IGNoYXJbc2l6ZV07CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ZbaV0gPSAoY2hhcikgcmVhZEludChpdGVtc1tyZWFkVW5zaWduZWRTaG9ydCh2KV0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgKz0gMzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGF2LnZpc2l0KG5hbWUsIGN2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC0tdjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICdJJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGludFtdIGl2ID0gbmV3IGludFtzaXplXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdltpXSA9IHJlYWRJbnQoaXRlbXNbcmVhZFVuc2lnbmVkU2hvcnQodildKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ICs9IDM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBhdi52aXNpdChuYW1lLCBpdik7CisgICAgICAgICAgICAgICAgICAgICAgICAtLXY7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnSic6CisgICAgICAgICAgICAgICAgICAgICAgICBsb25nW10gbHYgPSBuZXcgbG9uZ1tzaXplXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsdltpXSA9IHJlYWRMb25nKGl0ZW1zW3JlYWRVbnNpZ25lZFNob3J0KHYpXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiArPSAzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYXYudmlzaXQobmFtZSwgbHYpOworICAgICAgICAgICAgICAgICAgICAgICAgLS12OworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0YnOgorICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXRbXSBmdiA9IG5ldyBmbG9hdFtzaXplXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdltpXSA9IEZsb2F0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW50Qml0c1RvRmxvYXQocmVhZEludChpdGVtc1tyZWFkVW5zaWduZWRTaG9ydCh2KV0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ICs9IDM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBhdi52aXNpdChuYW1lLCBmdik7CisgICAgICAgICAgICAgICAgICAgICAgICAtLXY7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnRCc6CisgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGVbXSBkdiA9IG5ldyBkb3VibGVbc2l6ZV07CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHZbaV0gPSBEb3VibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5sb25nQml0c1RvRG91YmxlKHJlYWRMb25nKGl0ZW1zW3JlYWRVbnNpZ25lZFNob3J0KHYpXSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHYgKz0gMzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGF2LnZpc2l0KG5hbWUsIGR2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC0tdjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHJlYWRBbm5vdGF0aW9uVmFsdWVzKHYgLSAzLCBidWYsIGZhbHNlLCBhdi52aXNpdEFycmF5KG5hbWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHY7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcHV0ZXMgdGhlIGltcGxpY2l0IGZyYW1lIG9mIHRoZSBtZXRob2QgY3VycmVudGx5IGJlaW5nIHBhcnNlZCAoYXMKKyAgICAgKiBkZWZpbmVkIGluIHRoZSBnaXZlbiB7QGxpbmsgQ29udGV4dH0pIGFuZCBzdG9yZXMgaXQgaW4gdGhlIGdpdmVuIGNvbnRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhbWUKKyAgICAgKiAgICAgICAgICAgIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjbGFzcyBiZWluZyBwYXJzZWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGdldEltcGxpY2l0RnJhbWUoZmluYWwgQ29udGV4dCBmcmFtZSkgeworICAgICAgICBTdHJpbmcgZGVzYyA9IGZyYW1lLmRlc2M7CisgICAgICAgIE9iamVjdFtdIGxvY2FscyA9IGZyYW1lLmxvY2FsOworICAgICAgICBpbnQgbG9jYWwgPSAwOworICAgICAgICBpZiAoKGZyYW1lLmFjY2VzcyAmIE9wY29kZXMuQUNDX1NUQVRJQykgPT0gMCkgeworICAgICAgICAgICAgaWYgKCI8aW5pdD4iLmVxdWFscyhmcmFtZS5uYW1lKSkgeworICAgICAgICAgICAgICAgIGxvY2Fsc1tsb2NhbCsrXSA9IE9wY29kZXMuVU5JTklUSUFMSVpFRF9USElTOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBsb2NhbHNbbG9jYWwrK10gPSByZWFkQ2xhc3MoaGVhZGVyICsgMiwgZnJhbWUuYnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnQgaSA9IDE7CisgICAgICAgIGxvb3A6IHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpbnQgaiA9IGk7CisgICAgICAgICAgICBzd2l0Y2ggKGRlc2MuY2hhckF0KGkrKykpIHsKKyAgICAgICAgICAgICAgICBjYXNlICdaJzoKKyAgICAgICAgICAgICAgICBjYXNlICdDJzoKKyAgICAgICAgICAgICAgICBjYXNlICdCJzoKKyAgICAgICAgICAgICAgICBjYXNlICdTJzoKKyAgICAgICAgICAgICAgICBjYXNlICdJJzoKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxzW2xvY2FsKytdID0gT3Bjb2Rlcy5JTlRFR0VSOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdGJzoKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxzW2xvY2FsKytdID0gT3Bjb2Rlcy5GTE9BVDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnSic6CisgICAgICAgICAgICAgICAgICAgIGxvY2Fsc1tsb2NhbCsrXSA9IE9wY29kZXMuTE9ORzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnRCc6CisgICAgICAgICAgICAgICAgICAgIGxvY2Fsc1tsb2NhbCsrXSA9IE9wY29kZXMuRE9VQkxFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdbJzoKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGRlc2MuY2hhckF0KGkpID09ICdbJykgeworICAgICAgICAgICAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjLmNoYXJBdChpKSA9PSAnTCcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChkZXNjLmNoYXJBdChpKSAhPSAnOycpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2k7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbG9jYWxzW2xvY2FsKytdID0gZGVzYy5zdWJzdHJpbmcoaiwgKytpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnTCc6CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChkZXNjLmNoYXJBdChpKSAhPSAnOycpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBsb2NhbHNbbG9jYWwrK10gPSBkZXNjLnN1YnN0cmluZyhqICsgMSwgaSsrKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsgbG9vcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmcmFtZS5sb2NhbENvdW50ID0gbG9jYWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgYSBzdGFjayBtYXAgZnJhbWUgYW5kIHN0b3JlcyB0aGUgcmVzdWx0IGluIHRoZSBnaXZlbgorICAgICAqIHtAbGluayBDb250ZXh0fSBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RhY2tNYXAKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydCBvZmZzZXQgb2YgYSBzdGFjayBtYXAgZnJhbWUgaW4gdGhlIGNsYXNzIGZpbGUuCisgICAgICogQHBhcmFtIHppcAorICAgICAqICAgICAgICAgICAgaWYgdGhlIHN0YWNrIG1hcCBmcmFtZSBhdCBzdGFja01hcCBpcyBjb21wcmVzc2VkIG9yIG5vdC4KKyAgICAgKiBAcGFyYW0gdW56aXAKKyAgICAgKiAgICAgICAgICAgIGlmIHRoZSBzdGFjayBtYXAgZnJhbWUgbXVzdCBiZSB1bmNvbXByZXNzZWQuCisgICAgICogQHBhcmFtIGZyYW1lCisgICAgICogICAgICAgICAgICB3aGVyZSB0aGUgcGFyc2VkIHN0YWNrIG1hcCBmcmFtZSBtdXN0IGJlIHN0b3JlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBvZmZzZXQgb2YgdGhlIGZpcnN0IGJ5dGUgZm9sbG93aW5nIHRoZSBwYXJzZWQgZnJhbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgcmVhZEZyYW1lKGludCBzdGFja01hcCwgYm9vbGVhbiB6aXAsIGJvb2xlYW4gdW56aXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQgZnJhbWUpIHsKKyAgICAgICAgY2hhcltdIGMgPSBmcmFtZS5idWZmZXI7CisgICAgICAgIExhYmVsW10gbGFiZWxzID0gZnJhbWUubGFiZWxzOworICAgICAgICBpbnQgdGFnOworICAgICAgICBpbnQgZGVsdGE7CisgICAgICAgIGlmICh6aXApIHsKKyAgICAgICAgICAgIHRhZyA9IGJbc3RhY2tNYXArK10gJiAweEZGOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGFnID0gTWV0aG9kV3JpdGVyLkZVTExfRlJBTUU7CisgICAgICAgICAgICBmcmFtZS5vZmZzZXQgPSAtMTsKKyAgICAgICAgfQorICAgICAgICBmcmFtZS5sb2NhbERpZmYgPSAwOworICAgICAgICBpZiAodGFnIDwgTWV0aG9kV3JpdGVyLlNBTUVfTE9DQUxTXzFfU1RBQ0tfSVRFTV9GUkFNRSkgeworICAgICAgICAgICAgZGVsdGEgPSB0YWc7CisgICAgICAgICAgICBmcmFtZS5tb2RlID0gT3Bjb2Rlcy5GX1NBTUU7CisgICAgICAgICAgICBmcmFtZS5zdGFja0NvdW50ID0gMDsKKyAgICAgICAgfSBlbHNlIGlmICh0YWcgPCBNZXRob2RXcml0ZXIuUkVTRVJWRUQpIHsKKyAgICAgICAgICAgIGRlbHRhID0gdGFnIC0gTWV0aG9kV3JpdGVyLlNBTUVfTE9DQUxTXzFfU1RBQ0tfSVRFTV9GUkFNRTsKKyAgICAgICAgICAgIHN0YWNrTWFwID0gcmVhZEZyYW1lVHlwZShmcmFtZS5zdGFjaywgMCwgc3RhY2tNYXAsIGMsIGxhYmVscyk7CisgICAgICAgICAgICBmcmFtZS5tb2RlID0gT3Bjb2Rlcy5GX1NBTUUxOworICAgICAgICAgICAgZnJhbWUuc3RhY2tDb3VudCA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZWx0YSA9IHJlYWRVbnNpZ25lZFNob3J0KHN0YWNrTWFwKTsKKyAgICAgICAgICAgIHN0YWNrTWFwICs9IDI7CisgICAgICAgICAgICBpZiAodGFnID09IE1ldGhvZFdyaXRlci5TQU1FX0xPQ0FMU18xX1NUQUNLX0lURU1fRlJBTUVfRVhURU5ERUQpIHsKKyAgICAgICAgICAgICAgICBzdGFja01hcCA9IHJlYWRGcmFtZVR5cGUoZnJhbWUuc3RhY2ssIDAsIHN0YWNrTWFwLCBjLCBsYWJlbHMpOworICAgICAgICAgICAgICAgIGZyYW1lLm1vZGUgPSBPcGNvZGVzLkZfU0FNRTE7CisgICAgICAgICAgICAgICAgZnJhbWUuc3RhY2tDb3VudCA9IDE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRhZyA+PSBNZXRob2RXcml0ZXIuQ0hPUF9GUkFNRQorICAgICAgICAgICAgICAgICAgICAgICAmJiB0YWcgPCBNZXRob2RXcml0ZXIuU0FNRV9GUkFNRV9FWFRFTkRFRCkgeworICAgICAgICAgICAgICAgIGZyYW1lLm1vZGUgPSBPcGNvZGVzLkZfQ0hPUDsKKyAgICAgICAgICAgICAgICBmcmFtZS5sb2NhbERpZmYgPSBNZXRob2RXcml0ZXIuU0FNRV9GUkFNRV9FWFRFTkRFRCAtIHRhZzsKKyAgICAgICAgICAgICAgICBmcmFtZS5sb2NhbENvdW50IC09IGZyYW1lLmxvY2FsRGlmZjsKKyAgICAgICAgICAgICAgICBmcmFtZS5zdGFja0NvdW50ID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodGFnID09IE1ldGhvZFdyaXRlci5TQU1FX0ZSQU1FX0VYVEVOREVEKSB7CisgICAgICAgICAgICAgICAgZnJhbWUubW9kZSA9IE9wY29kZXMuRl9TQU1FOworICAgICAgICAgICAgICAgIGZyYW1lLnN0YWNrQ291bnQgPSAwOworICAgICAgICAgICAgfSBlbHNlIGlmICh0YWcgPCBNZXRob2RXcml0ZXIuRlVMTF9GUkFNRSkgeworICAgICAgICAgICAgICAgIGludCBsb2NhbCA9IHVuemlwID8gZnJhbWUubG9jYWxDb3VudCA6IDA7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHRhZyAtIE1ldGhvZFdyaXRlci5TQU1FX0ZSQU1FX0VYVEVOREVEOyBpID4gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YWNrTWFwID0gcmVhZEZyYW1lVHlwZShmcmFtZS5sb2NhbCwgbG9jYWwrKywgc3RhY2tNYXAsIGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZnJhbWUubW9kZSA9IE9wY29kZXMuRl9BUFBFTkQ7CisgICAgICAgICAgICAgICAgZnJhbWUubG9jYWxEaWZmID0gdGFnIC0gTWV0aG9kV3JpdGVyLlNBTUVfRlJBTUVfRVhURU5ERUQ7CisgICAgICAgICAgICAgICAgZnJhbWUubG9jYWxDb3VudCArPSBmcmFtZS5sb2NhbERpZmY7CisgICAgICAgICAgICAgICAgZnJhbWUuc3RhY2tDb3VudCA9IDA7CisgICAgICAgICAgICB9IGVsc2UgeyAvLyBpZiAodGFnID09IEZVTExfRlJBTUUpIHsKKyAgICAgICAgICAgICAgICBmcmFtZS5tb2RlID0gT3Bjb2Rlcy5GX0ZVTEw7CisgICAgICAgICAgICAgICAgaW50IG4gPSByZWFkVW5zaWduZWRTaG9ydChzdGFja01hcCk7CisgICAgICAgICAgICAgICAgc3RhY2tNYXAgKz0gMjsKKyAgICAgICAgICAgICAgICBmcmFtZS5sb2NhbERpZmYgPSBuOworICAgICAgICAgICAgICAgIGZyYW1lLmxvY2FsQ291bnQgPSBuOworICAgICAgICAgICAgICAgIGZvciAoaW50IGxvY2FsID0gMDsgbiA+IDA7IG4tLSkgeworICAgICAgICAgICAgICAgICAgICBzdGFja01hcCA9IHJlYWRGcmFtZVR5cGUoZnJhbWUubG9jYWwsIGxvY2FsKyssIHN0YWNrTWFwLCBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG4gPSByZWFkVW5zaWduZWRTaG9ydChzdGFja01hcCk7CisgICAgICAgICAgICAgICAgc3RhY2tNYXAgKz0gMjsKKyAgICAgICAgICAgICAgICBmcmFtZS5zdGFja0NvdW50ID0gbjsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBzdGFjayA9IDA7IG4gPiAwOyBuLS0pIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhY2tNYXAgPSByZWFkRnJhbWVUeXBlKGZyYW1lLnN0YWNrLCBzdGFjaysrLCBzdGFja01hcCwgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmcmFtZS5vZmZzZXQgKz0gZGVsdGEgKyAxOworICAgICAgICByZWFkTGFiZWwoZnJhbWUub2Zmc2V0LCBsYWJlbHMpOworICAgICAgICByZXR1cm4gc3RhY2tNYXA7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgYSBzdGFjayBtYXAgZnJhbWUgdHlwZSBhbmQgc3RvcmVzIGl0IGF0IHRoZSBnaXZlbiBpbmRleCBpbiB0aGUKKyAgICAgKiBnaXZlbiBhcnJheS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGFycmF5IHdoZXJlIHRoZSBwYXJzZWQgdHlwZSBtdXN0IGJlIHN0b3JlZC4KKyAgICAgKiBAcGFyYW0gaW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBpbiAnZnJhbWUnIHdoZXJlIHRoZSBwYXJzZWQgdHlwZSBtdXN0IGJlIHN0b3JlZC4KKyAgICAgKiBAcGFyYW0gdgorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IG9mZnNldCBvZiB0aGUgc3RhY2sgbWFwIGZyYW1lIHR5cGUgdG8gcmVhZC4KKyAgICAgKiBAcGFyYW0gYnVmCisgICAgICogICAgICAgICAgICBhIGJ1ZmZlciB0byByZWFkIHN0cmluZ3MuCisgICAgICogQHBhcmFtIGxhYmVscworICAgICAqICAgICAgICAgICAgdGhlIGxhYmVscyBvZiB0aGUgbWV0aG9kIGN1cnJlbnRseSBiZWluZyBwYXJzZWQsIGluZGV4ZWQgYnkKKyAgICAgKiAgICAgICAgICAgIHRoZWlyIG9mZnNldC4gSWYgdGhlIHBhcnNlZCB0eXBlIGlzIGFuIFVuaW5pdGlhbGl6ZWQgdHlwZSwgYQorICAgICAqICAgICAgICAgICAgbmV3IGxhYmVsIGZvciB0aGUgY29ycmVzcG9uZGluZyBORVcgaW5zdHJ1Y3Rpb24gaXMgc3RvcmVkIGluCisgICAgICogICAgICAgICAgICB0aGlzIGFycmF5IGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3QuCisgICAgICogQHJldHVybiB0aGUgb2Zmc2V0IG9mIHRoZSBmaXJzdCBieXRlIGFmdGVyIHRoZSBwYXJzZWQgdHlwZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCByZWFkRnJhbWVUeXBlKGZpbmFsIE9iamVjdFtdIGZyYW1lLCBmaW5hbCBpbnQgaW5kZXgsIGludCB2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgY2hhcltdIGJ1ZiwgZmluYWwgTGFiZWxbXSBsYWJlbHMpIHsKKyAgICAgICAgaW50IHR5cGUgPSBiW3YrK10gJiAweEZGOworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBmcmFtZVtpbmRleF0gPSBPcGNvZGVzLlRPUDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBmcmFtZVtpbmRleF0gPSBPcGNvZGVzLklOVEVHRVI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgZnJhbWVbaW5kZXhdID0gT3Bjb2Rlcy5GTE9BVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICBmcmFtZVtpbmRleF0gPSBPcGNvZGVzLkRPVUJMRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgICAgICBmcmFtZVtpbmRleF0gPSBPcGNvZGVzLkxPTkc7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDU6CisgICAgICAgICAgICAgICAgZnJhbWVbaW5kZXhdID0gT3Bjb2Rlcy5OVUxMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA2OgorICAgICAgICAgICAgICAgIGZyYW1lW2luZGV4XSA9IE9wY29kZXMuVU5JTklUSUFMSVpFRF9USElTOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSA3OiAvLyBPYmplY3QKKyAgICAgICAgICAgICAgICBmcmFtZVtpbmRleF0gPSByZWFkQ2xhc3ModiwgYnVmKTsKKyAgICAgICAgICAgICAgICB2ICs9IDI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OiAvLyBVbmluaXRpYWxpemVkCisgICAgICAgICAgICAgICAgZnJhbWVbaW5kZXhdID0gcmVhZExhYmVsKHJlYWRVbnNpZ25lZFNob3J0KHYpLCBsYWJlbHMpOworICAgICAgICAgICAgICAgIHYgKz0gMjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBsYWJlbCBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBvZmZzZXQuIFRoZSBkZWZhdWx0CisgICAgICogaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgY3JlYXRlcyBhIGxhYmVsIGZvciB0aGUgZ2l2ZW4gb2Zmc2V0IGlmIGl0CisgICAgICogaGFzIG5vdCBiZWVuIGFscmVhZHkgY3JlYXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvZmZzZXQKKyAgICAgKiAgICAgICAgICAgIGEgYnl0ZWNvZGUgb2Zmc2V0IGluIGEgbWV0aG9kLgorICAgICAqIEBwYXJhbSBsYWJlbHMKKyAgICAgKiAgICAgICAgICAgIHRoZSBhbHJlYWR5IGNyZWF0ZWQgbGFiZWxzLCBpbmRleGVkIGJ5IHRoZWlyIG9mZnNldC4gSWYgYQorICAgICAqICAgICAgICAgICAgbGFiZWwgYWxyZWFkeSBleGlzdHMgZm9yIG9mZnNldCB0aGlzIG1ldGhvZCBtdXN0IG5vdCBjcmVhdGUgYQorICAgICAqICAgICAgICAgICAgbmV3IG9uZS4gT3RoZXJ3aXNlIGl0IG11c3Qgc3RvcmUgdGhlIG5ldyBsYWJlbCBpbiB0aGlzIGFycmF5LgorICAgICAqIEByZXR1cm4gYSBub24gbnVsbCBMYWJlbCwgd2hpY2ggbXVzdCBiZSBlcXVhbCB0byBsYWJlbHNbb2Zmc2V0XS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTGFiZWwgcmVhZExhYmVsKGludCBvZmZzZXQsIExhYmVsW10gbGFiZWxzKSB7CisgICAgICAgIGlmIChsYWJlbHNbb2Zmc2V0XSA9PSBudWxsKSB7CisgICAgICAgICAgICBsYWJlbHNbb2Zmc2V0XSA9IG5ldyBMYWJlbCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBsYWJlbHNbb2Zmc2V0XTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzdGFydCBpbmRleCBvZiB0aGUgYXR0cmlidXRlX2luZm8gc3RydWN0dXJlIG9mIHRoaXMgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBzdGFydCBpbmRleCBvZiB0aGUgYXR0cmlidXRlX2luZm8gc3RydWN0dXJlIG9mIHRoaXMgY2xhc3MuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgZ2V0QXR0cmlidXRlcygpIHsKKyAgICAgICAgLy8gc2tpcHMgdGhlIGhlYWRlcgorICAgICAgICBpbnQgdSA9IGhlYWRlciArIDggKyByZWFkVW5zaWduZWRTaG9ydChoZWFkZXIgKyA2KSAqIDI7CisgICAgICAgIC8vIHNraXBzIGZpZWxkcyBhbmQgbWV0aG9kcworICAgICAgICBmb3IgKGludCBpID0gcmVhZFVuc2lnbmVkU2hvcnQodSk7IGkgPiAwOyAtLWkpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSByZWFkVW5zaWduZWRTaG9ydCh1ICsgOCk7IGogPiAwOyAtLWopIHsKKyAgICAgICAgICAgICAgICB1ICs9IDYgKyByZWFkSW50KHUgKyAxMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1ICs9IDg7CisgICAgICAgIH0KKyAgICAgICAgdSArPSAyOworICAgICAgICBmb3IgKGludCBpID0gcmVhZFVuc2lnbmVkU2hvcnQodSk7IGkgPiAwOyAtLWkpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSByZWFkVW5zaWduZWRTaG9ydCh1ICsgOCk7IGogPiAwOyAtLWopIHsKKyAgICAgICAgICAgICAgICB1ICs9IDYgKyByZWFkSW50KHUgKyAxMik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB1ICs9IDg7CisgICAgICAgIH0KKyAgICAgICAgLy8gdGhlIGF0dHJpYnV0ZV9pbmZvIHN0cnVjdHVyZSBzdGFydHMganVzdCBhZnRlciB0aGUgbWV0aG9kcworICAgICAgICByZXR1cm4gdSArIDI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgYW4gYXR0cmlidXRlIGluIHtAbGluayAjYiBifS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhdHRycworICAgICAqICAgICAgICAgICAgcHJvdG90eXBlcyBvZiB0aGUgYXR0cmlidXRlcyB0aGF0IG11c3QgYmUgcGFyc2VkIGR1cmluZyB0aGUKKyAgICAgKiAgICAgICAgICAgIHZpc2l0IG9mIHRoZSBjbGFzcy4gQW55IGF0dHJpYnV0ZSB3aG9zZSB0eXBlIGlzIG5vdCBlcXVhbCB0bworICAgICAqICAgICAgICAgICAgdGhlIHR5cGUgb2Ygb25lIHRoZSBwcm90b3R5cGVzIGlzIGlnbm9yZWQgKGkuZS4gYW4gZW1wdHkKKyAgICAgKiAgICAgICAgICAgIHtAbGluayBBdHRyaWJ1dGV9IGluc3RhbmNlIGlzIHJldHVybmVkKS4KKyAgICAgKiBAcGFyYW0gdHlwZQorICAgICAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhlIGF0dHJpYnV0ZS4KKyAgICAgKiBAcGFyYW0gb2ZmCisgICAgICogICAgICAgICAgICBpbmRleCBvZiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgYXR0cmlidXRlJ3MgY29udGVudCBpbgorICAgICAqICAgICAgICAgICAge0BsaW5rICNiIGJ9LiBUaGUgNiBhdHRyaWJ1dGUgaGVhZGVyIGJ5dGVzLCBjb250YWluaW5nIHRoZQorICAgICAqICAgICAgICAgICAgdHlwZSBhbmQgdGhlIGxlbmd0aCBvZiB0aGUgYXR0cmlidXRlLCBhcmUgbm90IHRha2VuIGludG8KKyAgICAgKiAgICAgICAgICAgIGFjY291bnQgaGVyZSAodGhleSBoYXZlIGFscmVhZHkgYmVlbiByZWFkKS4KKyAgICAgKiBAcGFyYW0gbGVuCisgICAgICogICAgICAgICAgICB0aGUgbGVuZ3RoIG9mIHRoZSBhdHRyaWJ1dGUncyBjb250ZW50LgorICAgICAqIEBwYXJhbSBidWYKKyAgICAgKiAgICAgICAgICAgIGJ1ZmZlciB0byBiZSB1c2VkIHRvIGNhbGwge0BsaW5rICNyZWFkVVRGOCByZWFkVVRGOH0sCisgICAgICogICAgICAgICAgICB7QGxpbmsgI3JlYWRDbGFzcyhpbnQsY2hhcltdKSByZWFkQ2xhc3N9IG9yIHtAbGluayAjcmVhZENvbnN0CisgICAgICogICAgICAgICAgICByZWFkQ29uc3R9LgorICAgICAqIEBwYXJhbSBjb2RlT2ZmCisgICAgICogICAgICAgICAgICBpbmRleCBvZiB0aGUgZmlyc3QgYnl0ZSBvZiBjb2RlJ3MgYXR0cmlidXRlIGNvbnRlbnQgaW4KKyAgICAgKiAgICAgICAgICAgIHtAbGluayAjYiBifSwgb3IgLTEgaWYgdGhlIGF0dHJpYnV0ZSB0byBiZSByZWFkIGlzIG5vdCBhIGNvZGUKKyAgICAgKiAgICAgICAgICAgIGF0dHJpYnV0ZS4gVGhlIDYgYXR0cmlidXRlIGhlYWRlciBieXRlcywgY29udGFpbmluZyB0aGUgdHlwZQorICAgICAqICAgICAgICAgICAgYW5kIHRoZSBsZW5ndGggb2YgdGhlIGF0dHJpYnV0ZSwgYXJlIG5vdCB0YWtlbiBpbnRvIGFjY291bnQKKyAgICAgKiAgICAgICAgICAgIGhlcmUuCisgICAgICogQHBhcmFtIGxhYmVscworICAgICAqICAgICAgICAgICAgdGhlIGxhYmVscyBvZiB0aGUgbWV0aG9kJ3MgY29kZSwgb3IgPHR0Pm51bGw8L3R0PiBpZiB0aGUKKyAgICAgKiAgICAgICAgICAgIGF0dHJpYnV0ZSB0byBiZSByZWFkIGlzIG5vdCBhIGNvZGUgYXR0cmlidXRlLgorICAgICAqIEByZXR1cm4gdGhlIGF0dHJpYnV0ZSB0aGF0IGhhcyBiZWVuIHJlYWQsIG9yIDx0dD5udWxsPC90dD4gdG8gc2tpcCB0aGlzCisgICAgICogICAgICAgICBhdHRyaWJ1dGUuCisgICAgICovCisgICAgcHJpdmF0ZSBBdHRyaWJ1dGUgcmVhZEF0dHJpYnV0ZShmaW5hbCBBdHRyaWJ1dGVbXSBhdHRycywgZmluYWwgU3RyaW5nIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgb2ZmLCBmaW5hbCBpbnQgbGVuLCBmaW5hbCBjaGFyW10gYnVmLCBmaW5hbCBpbnQgY29kZU9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExhYmVsW10gbGFiZWxzKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cnMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChhdHRyc1tpXS50eXBlLmVxdWFscyh0eXBlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBhdHRyc1tpXS5yZWFkKHRoaXMsIG9mZiwgbGVuLCBidWYsIGNvZGVPZmYsIGxhYmVscyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBBdHRyaWJ1dGUodHlwZSkucmVhZCh0aGlzLCBvZmYsIGxlbiwgbnVsbCwgLTEsIG51bGwpOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIFV0aWxpdHkgbWV0aG9kczogbG93IGxldmVsIHBhcnNpbmcKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBjb25zdGFudCBwb29sIGl0ZW1zIGluIHtAbGluayAjYiBifS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBjb25zdGFudCBwb29sIGl0ZW1zIGluIHtAbGluayAjYiBifS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldEl0ZW1Db3VudCgpIHsKKyAgICAgICAgcmV0dXJuIGl0ZW1zLmxlbmd0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzdGFydCBpbmRleCBvZiB0aGUgY29uc3RhbnQgcG9vbCBpdGVtIGluIHtAbGluayAjYiBifSwgcGx1cworICAgICAqIG9uZS4gPGk+VGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIHtAbGluayBBdHRyaWJ1dGV9IHN1YiBjbGFzc2VzLCBhbmQgaXMKKyAgICAgKiBub3JtYWxseSBub3QgbmVlZGVkIGJ5IGNsYXNzIGdlbmVyYXRvcnMgb3IgYWRhcHRlcnMuPC9pPgorICAgICAqCisgICAgICogQHBhcmFtIGl0ZW0KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBhIGNvbnN0YW50IHBvb2wgaXRlbS4KKyAgICAgKiBAcmV0dXJuIHRoZSBzdGFydCBpbmRleCBvZiB0aGUgY29uc3RhbnQgcG9vbCBpdGVtIGluIHtAbGluayAjYiBifSwgcGx1cworICAgICAqICAgICAgICAgb25lLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0SXRlbShmaW5hbCBpbnQgaXRlbSkgeworICAgICAgICByZXR1cm4gaXRlbXNbaXRlbV07CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIHN0cmluZ3MgY29udGFpbmVkIGluIHRoZSBjb25zdGFudCBwb29sCisgICAgICogb2YgdGhlIGNsYXNzLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbWF4aW11bSBsZW5ndGggb2YgdGhlIHN0cmluZ3MgY29udGFpbmVkIGluIHRoZSBjb25zdGFudCBwb29sCisgICAgICogICAgICAgICBvZiB0aGUgY2xhc3MuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRNYXhTdHJpbmdMZW5ndGgoKSB7CisgICAgICAgIHJldHVybiBtYXhTdHJpbmdMZW5ndGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgYSBieXRlIHZhbHVlIGluIHtAbGluayAjYiBifS4gPGk+VGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yCisgICAgICoge0BsaW5rIEF0dHJpYnV0ZX0gc3ViIGNsYXNzZXMsIGFuZCBpcyBub3JtYWxseSBub3QgbmVlZGVkIGJ5IGNsYXNzCisgICAgICogZ2VuZXJhdG9ycyBvciBhZGFwdGVycy48L2k+CisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydCBpbmRleCBvZiB0aGUgdmFsdWUgdG8gYmUgcmVhZCBpbiB7QGxpbmsgI2IgYn0uCisgICAgICogQHJldHVybiB0aGUgcmVhZCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHJlYWRCeXRlKGZpbmFsIGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gYltpbmRleF0gJiAweEZGOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIGFuIHVuc2lnbmVkIHNob3J0IHZhbHVlIGluIHtAbGluayAjYiBifS4gPGk+VGhpcyBtZXRob2QgaXMgaW50ZW5kZWQKKyAgICAgKiBmb3Ige0BsaW5rIEF0dHJpYnV0ZX0gc3ViIGNsYXNzZXMsIGFuZCBpcyBub3JtYWxseSBub3QgbmVlZGVkIGJ5IGNsYXNzCisgICAgICogZ2VuZXJhdG9ycyBvciBhZGFwdGVycy48L2k+CisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdGFydCBpbmRleCBvZiB0aGUgdmFsdWUgdG8gYmUgcmVhZCBpbiB7QGxpbmsgI2IgYn0uCisgICAgICogQHJldHVybiB0aGUgcmVhZCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHJlYWRVbnNpZ25lZFNob3J0KGZpbmFsIGludCBpbmRleCkgeworICAgICAgICBieXRlW10gYiA9IHRoaXMuYjsKKyAgICAgICAgcmV0dXJuICgoYltpbmRleF0gJiAweEZGKSA8PCA4KSB8IChiW2luZGV4ICsgMV0gJiAweEZGKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyBhIHNpZ25lZCBzaG9ydCB2YWx1ZSBpbiB7QGxpbmsgI2IgYn0uIDxpPlRoaXMgbWV0aG9kIGlzIGludGVuZGVkCisgICAgICogZm9yIHtAbGluayBBdHRyaWJ1dGV9IHN1YiBjbGFzc2VzLCBhbmQgaXMgbm9ybWFsbHkgbm90IG5lZWRlZCBieSBjbGFzcworICAgICAqIGdlbmVyYXRvcnMgb3IgYWRhcHRlcnMuPC9pPgorICAgICAqCisgICAgICogQHBhcmFtIGluZGV4CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgaW5kZXggb2YgdGhlIHZhbHVlIHRvIGJlIHJlYWQgaW4ge0BsaW5rICNiIGJ9LgorICAgICAqIEByZXR1cm4gdGhlIHJlYWQgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIHNob3J0IHJlYWRTaG9ydChmaW5hbCBpbnQgaW5kZXgpIHsKKyAgICAgICAgYnl0ZVtdIGIgPSB0aGlzLmI7CisgICAgICAgIHJldHVybiAoc2hvcnQpICgoKGJbaW5kZXhdICYgMHhGRikgPDwgOCkgfCAoYltpbmRleCArIDFdICYgMHhGRikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIGEgc2lnbmVkIGludCB2YWx1ZSBpbiB7QGxpbmsgI2IgYn0uIDxpPlRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvcgorICAgICAqIHtAbGluayBBdHRyaWJ1dGV9IHN1YiBjbGFzc2VzLCBhbmQgaXMgbm9ybWFsbHkgbm90IG5lZWRlZCBieSBjbGFzcworICAgICAqIGdlbmVyYXRvcnMgb3IgYWRhcHRlcnMuPC9pPgorICAgICAqCisgICAgICogQHBhcmFtIGluZGV4CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgaW5kZXggb2YgdGhlIHZhbHVlIHRvIGJlIHJlYWQgaW4ge0BsaW5rICNiIGJ9LgorICAgICAqIEByZXR1cm4gdGhlIHJlYWQgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIGludCByZWFkSW50KGZpbmFsIGludCBpbmRleCkgeworICAgICAgICBieXRlW10gYiA9IHRoaXMuYjsKKyAgICAgICAgcmV0dXJuICgoYltpbmRleF0gJiAweEZGKSA8PCAyNCkgfCAoKGJbaW5kZXggKyAxXSAmIDB4RkYpIDw8IDE2KQorICAgICAgICAgICAgICAgfCAoKGJbaW5kZXggKyAyXSAmIDB4RkYpIDw8IDgpIHwgKGJbaW5kZXggKyAzXSAmIDB4RkYpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIGEgc2lnbmVkIGxvbmcgdmFsdWUgaW4ge0BsaW5rICNiIGJ9LiA8aT5UaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IKKyAgICAgKiB7QGxpbmsgQXR0cmlidXRlfSBzdWIgY2xhc3NlcywgYW5kIGlzIG5vcm1hbGx5IG5vdCBuZWVkZWQgYnkgY2xhc3MKKyAgICAgKiBnZW5lcmF0b3JzIG9yIGFkYXB0ZXJzLjwvaT4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmRleAorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IGluZGV4IG9mIHRoZSB2YWx1ZSB0byBiZSByZWFkIGluIHtAbGluayAjYiBifS4KKyAgICAgKiBAcmV0dXJuIHRoZSByZWFkIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIHJlYWRMb25nKGZpbmFsIGludCBpbmRleCkgeworICAgICAgICBsb25nIGwxID0gcmVhZEludChpbmRleCk7CisgICAgICAgIGxvbmcgbDAgPSByZWFkSW50KGluZGV4ICsgNCkgJiAweEZGRkZGRkZGTDsKKyAgICAgICAgcmV0dXJuIChsMSA8PCAzMikgfCBsMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyBhbiBVVEY4IHN0cmluZyBjb25zdGFudCBwb29sIGl0ZW0gaW4ge0BsaW5rICNiIGJ9LiA8aT5UaGlzIG1ldGhvZAorICAgICAqIGlzIGludGVuZGVkIGZvciB7QGxpbmsgQXR0cmlidXRlfSBzdWIgY2xhc3NlcywgYW5kIGlzIG5vcm1hbGx5IG5vdCBuZWVkZWQKKyAgICAgKiBieSBjbGFzcyBnZW5lcmF0b3JzIG9yIGFkYXB0ZXJzLjwvaT4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmRleAorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IGluZGV4IG9mIGFuIHVuc2lnbmVkIHNob3J0IHZhbHVlIGluIHtAbGluayAjYiBifSwKKyAgICAgKiAgICAgICAgICAgIHdob3NlIHZhbHVlIGlzIHRoZSBpbmRleCBvZiBhbiBVVEY4IGNvbnN0YW50IHBvb2wgaXRlbS4KKyAgICAgKiBAcGFyYW0gYnVmCisgICAgICogICAgICAgICAgICBidWZmZXIgdG8gYmUgdXNlZCB0byByZWFkIHRoZSBpdGVtLiBUaGlzIGJ1ZmZlciBtdXN0IGJlCisgICAgICogICAgICAgICAgICBzdWZmaWNpZW50bHkgbGFyZ2UuIEl0IGlzIG5vdCBhdXRvbWF0aWNhbGx5IHJlc2l6ZWQuCisgICAgICogQHJldHVybiB0aGUgU3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCBVVEY4IGl0ZW0uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyByZWFkVVRGOChpbnQgaW5kZXgsIGZpbmFsIGNoYXJbXSBidWYpIHsKKyAgICAgICAgaW50IGl0ZW0gPSByZWFkVW5zaWduZWRTaG9ydChpbmRleCk7CisgICAgICAgIGlmIChpbmRleCA9PSAwIHx8IGl0ZW0gPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHMgPSBzdHJpbmdzW2l0ZW1dOworICAgICAgICBpZiAocyAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgfQorICAgICAgICBpbmRleCA9IGl0ZW1zW2l0ZW1dOworICAgICAgICByZXR1cm4gc3RyaW5nc1tpdGVtXSA9IHJlYWRVVEYoaW5kZXggKyAyLCByZWFkVW5zaWduZWRTaG9ydChpbmRleCksIGJ1Zik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgVVRGOCBzdHJpbmcgaW4ge0BsaW5rICNiIGJ9LgorICAgICAqCisgICAgICogQHBhcmFtIGluZGV4CisgICAgICogICAgICAgICAgICBzdGFydCBvZmZzZXQgb2YgdGhlIFVURjggc3RyaW5nIHRvIGJlIHJlYWQuCisgICAgICogQHBhcmFtIHV0ZkxlbgorICAgICAqICAgICAgICAgICAgbGVuZ3RoIG9mIHRoZSBVVEY4IHN0cmluZyB0byBiZSByZWFkLgorICAgICAqIEBwYXJhbSBidWYKKyAgICAgKiAgICAgICAgICAgIGJ1ZmZlciB0byBiZSB1c2VkIHRvIHJlYWQgdGhlIHN0cmluZy4gVGhpcyBidWZmZXIgbXVzdCBiZQorICAgICAqICAgICAgICAgICAgc3VmZmljaWVudGx5IGxhcmdlLiBJdCBpcyBub3QgYXV0b21hdGljYWxseSByZXNpemVkLgorICAgICAqIEByZXR1cm4gdGhlIFN0cmluZyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgVVRGOCBzdHJpbmcuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVhZFVURihpbnQgaW5kZXgsIGZpbmFsIGludCB1dGZMZW4sIGZpbmFsIGNoYXJbXSBidWYpIHsKKyAgICAgICAgaW50IGVuZEluZGV4ID0gaW5kZXggKyB1dGZMZW47CisgICAgICAgIGJ5dGVbXSBiID0gdGhpcy5iOworICAgICAgICBpbnQgc3RyTGVuID0gMDsKKyAgICAgICAgaW50IGM7CisgICAgICAgIGludCBzdCA9IDA7CisgICAgICAgIGNoYXIgY2MgPSAwOworICAgICAgICB3aGlsZSAoaW5kZXggPCBlbmRJbmRleCkgeworICAgICAgICAgICAgYyA9IGJbaW5kZXgrK107CisgICAgICAgICAgICBzd2l0Y2ggKHN0KSB7CisgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgICAgICBjID0gYyAmIDB4RkY7CisgICAgICAgICAgICAgICAgICAgIGlmIChjIDwgMHg4MCkgeyAvLyAweHh4eHh4eAorICAgICAgICAgICAgICAgICAgICAgICAgYnVmW3N0ckxlbisrXSA9IChjaGFyKSBjOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPCAweEUwICYmIGMgPiAweEJGKSB7IC8vIDExMHggeHh4eCAxMHh4IHh4eHgKKyAgICAgICAgICAgICAgICAgICAgICAgIGNjID0gKGNoYXIpIChjICYgMHgxRik7CisgICAgICAgICAgICAgICAgICAgICAgICBzdCA9IDE7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIDExMTAgeHh4eCAxMHh4IHh4eHggMTB4eCB4eHh4CisgICAgICAgICAgICAgICAgICAgICAgICBjYyA9IChjaGFyKSAoYyAmIDB4MEYpOworICAgICAgICAgICAgICAgICAgICAgICAgc3QgPSAyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAxOiAvLyBieXRlIDIgb2YgMi1ieXRlIGNoYXIgb3IgYnl0ZSAzIG9mIDMtYnl0ZSBjaGFyCisgICAgICAgICAgICAgICAgICAgIGJ1ZltzdHJMZW4rK10gPSAoY2hhcikgKChjYyA8PCA2KSB8IChjICYgMHgzRikpOworICAgICAgICAgICAgICAgICAgICBzdCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSAyOiAvLyBieXRlIDIgb2YgMy1ieXRlIGNoYXIKKyAgICAgICAgICAgICAgICAgICAgY2MgPSAoY2hhcikgKChjYyA8PCA2KSB8IChjICYgMHgzRikpOworICAgICAgICAgICAgICAgICAgICBzdCA9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJ1ZiwgMCwgc3RyTGVuKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkcyBhIGNsYXNzIGNvbnN0YW50IHBvb2wgaXRlbSBpbiB7QGxpbmsgI2IgYn0uIDxpPlRoaXMgbWV0aG9kIGlzCisgICAgICogaW50ZW5kZWQgZm9yIHtAbGluayBBdHRyaWJ1dGV9IHN1YiBjbGFzc2VzLCBhbmQgaXMgbm9ybWFsbHkgbm90IG5lZWRlZCBieQorICAgICAqIGNsYXNzIGdlbmVyYXRvcnMgb3IgYWRhcHRlcnMuPC9pPgorICAgICAqCisgICAgICogQHBhcmFtIGluZGV4CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgaW5kZXggb2YgYW4gdW5zaWduZWQgc2hvcnQgdmFsdWUgaW4ge0BsaW5rICNiIGJ9LAorICAgICAqICAgICAgICAgICAgd2hvc2UgdmFsdWUgaXMgdGhlIGluZGV4IG9mIGEgY2xhc3MgY29uc3RhbnQgcG9vbCBpdGVtLgorICAgICAqIEBwYXJhbSBidWYKKyAgICAgKiAgICAgICAgICAgIGJ1ZmZlciB0byBiZSB1c2VkIHRvIHJlYWQgdGhlIGl0ZW0uIFRoaXMgYnVmZmVyIG11c3QgYmUKKyAgICAgKiAgICAgICAgICAgIHN1ZmZpY2llbnRseSBsYXJnZS4gSXQgaXMgbm90IGF1dG9tYXRpY2FsbHkgcmVzaXplZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBTdHJpbmcgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGNsYXNzIGl0ZW0uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyByZWFkQ2xhc3MoZmluYWwgaW50IGluZGV4LCBmaW5hbCBjaGFyW10gYnVmKSB7CisgICAgICAgIC8vIGNvbXB1dGVzIHRoZSBzdGFydCBpbmRleCBvZiB0aGUgQ09OU1RBTlRfQ2xhc3MgaXRlbSBpbiBiCisgICAgICAgIC8vIGFuZCByZWFkcyB0aGUgQ09OU1RBTlRfVXRmOCBpdGVtIGRlc2lnbmF0ZWQgYnkKKyAgICAgICAgLy8gdGhlIGZpcnN0IHR3byBieXRlcyBvZiB0aGlzIENPTlNUQU5UX0NsYXNzIGl0ZW0KKyAgICAgICAgcmV0dXJuIHJlYWRVVEY4KGl0ZW1zW3JlYWRVbnNpZ25lZFNob3J0KGluZGV4KV0sIGJ1Zik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgYSBudW1lcmljIG9yIHN0cmluZyBjb25zdGFudCBwb29sIGl0ZW0gaW4ge0BsaW5rICNiIGJ9LiA8aT5UaGlzCisgICAgICogbWV0aG9kIGlzIGludGVuZGVkIGZvciB7QGxpbmsgQXR0cmlidXRlfSBzdWIgY2xhc3NlcywgYW5kIGlzIG5vcm1hbGx5IG5vdAorICAgICAqIG5lZWRlZCBieSBjbGFzcyBnZW5lcmF0b3JzIG9yIGFkYXB0ZXJzLjwvaT4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpdGVtCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgYSBjb25zdGFudCBwb29sIGl0ZW0uCisgICAgICogQHBhcmFtIGJ1ZgorICAgICAqICAgICAgICAgICAgYnVmZmVyIHRvIGJlIHVzZWQgdG8gcmVhZCB0aGUgaXRlbS4gVGhpcyBidWZmZXIgbXVzdCBiZQorICAgICAqICAgICAgICAgICAgc3VmZmljaWVudGx5IGxhcmdlLiBJdCBpcyBub3QgYXV0b21hdGljYWxseSByZXNpemVkLgorICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBJbnRlZ2VyfSwge0BsaW5rIEZsb2F0fSwge0BsaW5rIExvbmd9LCB7QGxpbmsgRG91YmxlfSwKKyAgICAgKiAgICAgICAgIHtAbGluayBTdHJpbmd9LCB7QGxpbmsgVHlwZX0gb3Ige0BsaW5rIEhhbmRsZX0gY29ycmVzcG9uZGluZyB0bworICAgICAqICAgICAgICAgdGhlIGdpdmVuIGNvbnN0YW50IHBvb2wgaXRlbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IHJlYWRDb25zdChmaW5hbCBpbnQgaXRlbSwgZmluYWwgY2hhcltdIGJ1ZikgeworICAgICAgICBpbnQgaW5kZXggPSBpdGVtc1tpdGVtXTsKKyAgICAgICAgc3dpdGNoIChiW2luZGV4IC0gMV0pIHsKKyAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuSU5UOgorICAgICAgICAgICAgICAgIHJldHVybiByZWFkSW50KGluZGV4KTsKKyAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuRkxPQVQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZsb2F0LmludEJpdHNUb0Zsb2F0KHJlYWRJbnQoaW5kZXgpKTsKKyAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuTE9ORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVhZExvbmcoaW5kZXgpOworICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5ET1VCTEU6CisgICAgICAgICAgICAgICAgcmV0dXJuIERvdWJsZS5sb25nQml0c1RvRG91YmxlKHJlYWRMb25nKGluZGV4KSk7CisgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLkNMQVNTOgorICAgICAgICAgICAgICAgIHJldHVybiBUeXBlLmdldE9iamVjdFR5cGUocmVhZFVURjgoaW5kZXgsIGJ1ZikpOworICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5TVFI6CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlYWRVVEY4KGluZGV4LCBidWYpOworICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5NVFlQRToKKyAgICAgICAgICAgICAgICByZXR1cm4gVHlwZS5nZXRNZXRob2RUeXBlKHJlYWRVVEY4KGluZGV4LCBidWYpKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6IC8vIGNhc2UgQ2xhc3NXcml0ZXIuSEFORExFX0JBU0UgKyBbMS4uOV06CisgICAgICAgICAgICAgICAgaW50IHRhZyA9IHJlYWRCeXRlKGluZGV4KTsKKyAgICAgICAgICAgICAgICBpbnRbXSBpdGVtcyA9IHRoaXMuaXRlbXM7CisgICAgICAgICAgICAgICAgaW50IGNwSW5kZXggPSBpdGVtc1tyZWFkVW5zaWduZWRTaG9ydChpbmRleCArIDEpXTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgb3duZXIgPSByZWFkQ2xhc3MoY3BJbmRleCwgYnVmKTsKKyAgICAgICAgICAgICAgICBjcEluZGV4ID0gaXRlbXNbcmVhZFVuc2lnbmVkU2hvcnQoY3BJbmRleCArIDIpXTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IHJlYWRVVEY4KGNwSW5kZXgsIGJ1Zik7CisgICAgICAgICAgICAgICAgU3RyaW5nIGRlc2MgPSByZWFkVVRGOChjcEluZGV4ICsgMiwgYnVmKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEhhbmRsZSh0YWcsIG93bmVyLCBuYW1lLCBkZXNjKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvamVyc2V5L3JlcGFja2FnZWQvb3JnL29iamVjdHdlYi9hc20vQ2xhc3NWaXNpdG9yLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL2plcnNleS9yZXBhY2thZ2VkL29yZy9vYmplY3R3ZWIvYXNtL0NsYXNzVmlzaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlM2QwYjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL2plcnNleS9yZXBhY2thZ2VkL29yZy9vYmplY3R3ZWIvYXNtL0NsYXNzVmlzaXRvci5qYXZhCkBAIC0wLDAgKzEsMzIwIEBACisvKioqCisgKiBBU006IGEgdmVyeSBzbWFsbCBhbmQgZmFzdCBKYXZhIGJ5dGVjb2RlIG1hbmlwdWxhdGlvbiBmcmFtZXdvcmsKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDExIElOUklBLCBGcmFuY2UgVGVsZWNvbQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIGplcnNleS5yZXBhY2thZ2VkLm9yZy5vYmplY3R3ZWIuYXNtOworCisvKioKKyAqIEEgdmlzaXRvciB0byB2aXNpdCBhIEphdmEgY2xhc3MuIFRoZSBtZXRob2RzIG9mIHRoaXMgY2xhc3MgbXVzdCBiZSBjYWxsZWQgaW4KKyAqIHRoZSBmb2xsb3dpbmcgb3JkZXI6IDx0dD52aXNpdDwvdHQ+IFsgPHR0PnZpc2l0U291cmNlPC90dD4gXSBbCisgKiA8dHQ+dmlzaXRPdXRlckNsYXNzPC90dD4gXSAoIDx0dD52aXNpdEFubm90YXRpb248L3R0PiB8CisgKiA8dHQ+dmlzaXRUeXBlQW5ub3RhdGlvbjwvdHQ+IHwgPHR0PnZpc2l0QXR0cmlidXRlPC90dD4gKSogKAorICogPHR0PnZpc2l0SW5uZXJDbGFzczwvdHQ+IHwgPHR0PnZpc2l0RmllbGQ8L3R0PiB8IDx0dD52aXNpdE1ldGhvZDwvdHQ+ICkqCisgKiA8dHQ+dmlzaXRFbmQ8L3R0Pi4KKyAqCisgKiBAYXV0aG9yIEVyaWMgQnJ1bmV0b24KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIENsYXNzVmlzaXRvciB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgQVNNIEFQSSB2ZXJzaW9uIGltcGxlbWVudGVkIGJ5IHRoaXMgdmlzaXRvci4gVGhlIHZhbHVlIG9mIHRoaXMgZmllbGQKKyAgICAgKiBtdXN0IGJlIG9uZSBvZiB7QGxpbmsgT3Bjb2RlcyNBU000fSBvciB7QGxpbmsgT3Bjb2RlcyNBU001fS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgaW50IGFwaTsKKworICAgIC8qKgorICAgICAqIFRoZSBjbGFzcyB2aXNpdG9yIHRvIHdoaWNoIHRoaXMgdmlzaXRvciBtdXN0IGRlbGVnYXRlIG1ldGhvZCBjYWxscy4gTWF5CisgICAgICogYmUgbnVsbC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ2xhc3NWaXNpdG9yIGN2OworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgQ2xhc3NWaXNpdG9yfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcGkKKyAgICAgKiAgICAgICAgICAgIHRoZSBBU00gQVBJIHZlcnNpb24gaW1wbGVtZW50ZWQgYnkgdGhpcyB2aXNpdG9yLiBNdXN0IGJlIG9uZQorICAgICAqICAgICAgICAgICAgb2Yge0BsaW5rIE9wY29kZXMjQVNNNH0gb3Ige0BsaW5rIE9wY29kZXMjQVNNNX0uCisgICAgICovCisgICAgcHVibGljIENsYXNzVmlzaXRvcihmaW5hbCBpbnQgYXBpKSB7CisgICAgICAgIHRoaXMoYXBpLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBDbGFzc1Zpc2l0b3J9LgorICAgICAqCisgICAgICogQHBhcmFtIGFwaQorICAgICAqICAgICAgICAgICAgdGhlIEFTTSBBUEkgdmVyc2lvbiBpbXBsZW1lbnRlZCBieSB0aGlzIHZpc2l0b3IuIE11c3QgYmUgb25lCisgICAgICogICAgICAgICAgICBvZiB7QGxpbmsgT3Bjb2RlcyNBU000fSBvciB7QGxpbmsgT3Bjb2RlcyNBU001fS4KKyAgICAgKiBAcGFyYW0gY3YKKyAgICAgKiAgICAgICAgICAgIHRoZSBjbGFzcyB2aXNpdG9yIHRvIHdoaWNoIHRoaXMgdmlzaXRvciBtdXN0IGRlbGVnYXRlIG1ldGhvZAorICAgICAqICAgICAgICAgICAgY2FsbHMuIE1heSBiZSBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzc1Zpc2l0b3IoZmluYWwgaW50IGFwaSwgZmluYWwgQ2xhc3NWaXNpdG9yIGN2KSB7CisgICAgICAgIGlmIChhcGkgIT0gT3Bjb2Rlcy5BU000ICYmIGFwaSAhPSBPcGNvZGVzLkFTTTUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmFwaSA9IGFwaTsKKyAgICAgICAgdGhpcy5jdiA9IGN2OworICAgIH0KKworICAgIC8qKgorICAgICAqIFZpc2l0cyB0aGUgaGVhZGVyIG9mIHRoZSBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2ZXJzaW9uCisgICAgICogICAgICAgICAgICB0aGUgY2xhc3MgdmVyc2lvbi4KKyAgICAgKiBAcGFyYW0gYWNjZXNzCisgICAgICogICAgICAgICAgICB0aGUgY2xhc3MncyBhY2Nlc3MgZmxhZ3MgKHNlZSB7QGxpbmsgT3Bjb2Rlc30pLiBUaGlzIHBhcmFtZXRlcgorICAgICAqICAgICAgICAgICAgYWxzbyBpbmRpY2F0ZXMgaWYgdGhlIGNsYXNzIGlzIGRlcHJlY2F0ZWQuCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnRlcm5hbCBuYW1lIG9mIHRoZSBjbGFzcyAoc2VlCisgICAgICogICAgICAgICAgICB7QGxpbmsgVHlwZSNnZXRJbnRlcm5hbE5hbWUoKSBnZXRJbnRlcm5hbE5hbWV9KS4KKyAgICAgKiBAcGFyYW0gc2lnbmF0dXJlCisgICAgICogICAgICAgICAgICB0aGUgc2lnbmF0dXJlIG9mIHRoaXMgY2xhc3MuIE1heSBiZSA8dHQ+bnVsbDwvdHQ+IGlmIHRoZSBjbGFzcworICAgICAqICAgICAgICAgICAgaXMgbm90IGEgZ2VuZXJpYyBvbmUsIGFuZCBkb2VzIG5vdCBleHRlbmQgb3IgaW1wbGVtZW50IGdlbmVyaWMKKyAgICAgKiAgICAgICAgICAgIGNsYXNzZXMgb3IgaW50ZXJmYWNlcy4KKyAgICAgKiBAcGFyYW0gc3VwZXJOYW1lCisgICAgICogICAgICAgICAgICB0aGUgaW50ZXJuYWwgb2YgbmFtZSBvZiB0aGUgc3VwZXIgY2xhc3MgKHNlZQorICAgICAqICAgICAgICAgICAge0BsaW5rIFR5cGUjZ2V0SW50ZXJuYWxOYW1lKCkgZ2V0SW50ZXJuYWxOYW1lfSkuIEZvcgorICAgICAqICAgICAgICAgICAgaW50ZXJmYWNlcywgdGhlIHN1cGVyIGNsYXNzIGlzIHtAbGluayBPYmplY3R9LiBNYXkgYmUKKyAgICAgKiAgICAgICAgICAgIDx0dD5udWxsPC90dD4sIGJ1dCBvbmx5IGZvciB0aGUge0BsaW5rIE9iamVjdH0gY2xhc3MuCisgICAgICogQHBhcmFtIGludGVyZmFjZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnRlcm5hbCBuYW1lcyBvZiB0aGUgY2xhc3MncyBpbnRlcmZhY2VzIChzZWUKKyAgICAgKiAgICAgICAgICAgIHtAbGluayBUeXBlI2dldEludGVybmFsTmFtZSgpIGdldEludGVybmFsTmFtZX0pLiBNYXkgYmUKKyAgICAgKiAgICAgICAgICAgIDx0dD5udWxsPC90dD4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmlzaXQoaW50IHZlcnNpb24sIGludCBhY2Nlc3MsIFN0cmluZyBuYW1lLCBTdHJpbmcgc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdXBlck5hbWUsIFN0cmluZ1tdIGludGVyZmFjZXMpIHsKKyAgICAgICAgaWYgKGN2ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGN2LnZpc2l0KHZlcnNpb24sIGFjY2VzcywgbmFtZSwgc2lnbmF0dXJlLCBzdXBlck5hbWUsIGludGVyZmFjZXMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVmlzaXRzIHRoZSBzb3VyY2Ugb2YgdGhlIGNsYXNzLgorICAgICAqCisgICAgICogQHBhcmFtIHNvdXJjZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIHNvdXJjZSBmaWxlIGZyb20gd2hpY2ggdGhlIGNsYXNzIHdhcyBjb21waWxlZC4KKyAgICAgKiAgICAgICAgICAgIE1heSBiZSA8dHQ+bnVsbDwvdHQ+LgorICAgICAqIEBwYXJhbSBkZWJ1ZworICAgICAqICAgICAgICAgICAgYWRkaXRpb25hbCBkZWJ1ZyBpbmZvcm1hdGlvbiB0byBjb21wdXRlIHRoZSBjb3JyZXNwb25kYW5jZQorICAgICAqICAgICAgICAgICAgYmV0d2VlbiBzb3VyY2UgYW5kIGNvbXBpbGVkIGVsZW1lbnRzIG9mIHRoZSBjbGFzcy4gTWF5IGJlCisgICAgICogICAgICAgICAgICA8dHQ+bnVsbDwvdHQ+LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZpc2l0U291cmNlKFN0cmluZyBzb3VyY2UsIFN0cmluZyBkZWJ1ZykgeworICAgICAgICBpZiAoY3YgIT0gbnVsbCkgeworICAgICAgICAgICAgY3YudmlzaXRTb3VyY2Uoc291cmNlLCBkZWJ1Zyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWaXNpdHMgdGhlIGVuY2xvc2luZyBjbGFzcyBvZiB0aGUgY2xhc3MuIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIG9ubHkKKyAgICAgKiBpZiB0aGUgY2xhc3MgaGFzIGFuIGVuY2xvc2luZyBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvd25lcgorICAgICAqICAgICAgICAgICAgaW50ZXJuYWwgbmFtZSBvZiB0aGUgZW5jbG9zaW5nIGNsYXNzIG9mIHRoZSBjbGFzcy4KKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCB0aGF0IGNvbnRhaW5zIHRoZSBjbGFzcywgb3IKKyAgICAgKiAgICAgICAgICAgIDx0dD5udWxsPC90dD4gaWYgdGhlIGNsYXNzIGlzIG5vdCBlbmNsb3NlZCBpbiBhIG1ldGhvZCBvZiBpdHMKKyAgICAgKiAgICAgICAgICAgIGVuY2xvc2luZyBjbGFzcy4KKyAgICAgKiBAcGFyYW0gZGVzYworICAgICAqICAgICAgICAgICAgdGhlIGRlc2NyaXB0b3Igb2YgdGhlIG1ldGhvZCB0aGF0IGNvbnRhaW5zIHRoZSBjbGFzcywgb3IKKyAgICAgKiAgICAgICAgICAgIDx0dD5udWxsPC90dD4gaWYgdGhlIGNsYXNzIGlzIG5vdCBlbmNsb3NlZCBpbiBhIG1ldGhvZCBvZiBpdHMKKyAgICAgKiAgICAgICAgICAgIGVuY2xvc2luZyBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB2aXNpdE91dGVyQ2xhc3MoU3RyaW5nIG93bmVyLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2MpIHsKKyAgICAgICAgaWYgKGN2ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGN2LnZpc2l0T3V0ZXJDbGFzcyhvd25lciwgbmFtZSwgZGVzYyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWaXNpdHMgYW4gYW5ub3RhdGlvbiBvZiB0aGUgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVzYworICAgICAqICAgICAgICAgICAgdGhlIGNsYXNzIGRlc2NyaXB0b3Igb2YgdGhlIGFubm90YXRpb24gY2xhc3MuCisgICAgICogQHBhcmFtIHZpc2libGUKKyAgICAgKiAgICAgICAgICAgIDx0dD50cnVlPC90dD4gaWYgdGhlIGFubm90YXRpb24gaXMgdmlzaWJsZSBhdCBydW50aW1lLgorICAgICAqIEByZXR1cm4gYSB2aXNpdG9yIHRvIHZpc2l0IHRoZSBhbm5vdGF0aW9uIHZhbHVlcywgb3IgPHR0Pm51bGw8L3R0PiBpZgorICAgICAqICAgICAgICAgdGhpcyB2aXNpdG9yIGlzIG5vdCBpbnRlcmVzdGVkIGluIHZpc2l0aW5nIHRoaXMgYW5ub3RhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQW5ub3RhdGlvblZpc2l0b3IgdmlzaXRBbm5vdGF0aW9uKFN0cmluZyBkZXNjLCBib29sZWFuIHZpc2libGUpIHsKKyAgICAgICAgaWYgKGN2ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBjdi52aXNpdEFubm90YXRpb24oZGVzYywgdmlzaWJsZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmlzaXRzIGFuIGFubm90YXRpb24gb24gYSB0eXBlIGluIHRoZSBjbGFzcyBzaWduYXR1cmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZVJlZgorICAgICAqICAgICAgICAgICAgYSByZWZlcmVuY2UgdG8gdGhlIGFubm90YXRlZCB0eXBlLiBUaGUgc29ydCBvZiB0aGlzIHR5cGUKKyAgICAgKiAgICAgICAgICAgIHJlZmVyZW5jZSBtdXN0IGJlIHtAbGluayBUeXBlUmVmZXJlbmNlI0NMQVNTX1RZUEVfUEFSQU1FVEVSCisgICAgICogICAgICAgICAgICBDTEFTU19UWVBFX1BBUkFNRVRFUn0sCisgICAgICogICAgICAgICAgICB7QGxpbmsgVHlwZVJlZmVyZW5jZSNDTEFTU19UWVBFX1BBUkFNRVRFUl9CT1VORAorICAgICAqICAgICAgICAgICAgQ0xBU1NfVFlQRV9QQVJBTUVURVJfQk9VTkR9IG9yCisgICAgICogICAgICAgICAgICB7QGxpbmsgVHlwZVJlZmVyZW5jZSNDTEFTU19FWFRFTkRTIENMQVNTX0VYVEVORFN9LiBTZWUKKyAgICAgKiAgICAgICAgICAgIHtAbGluayBUeXBlUmVmZXJlbmNlfS4KKyAgICAgKiBAcGFyYW0gdHlwZVBhdGgKKyAgICAgKiAgICAgICAgICAgIHRoZSBwYXRoIHRvIHRoZSBhbm5vdGF0ZWQgdHlwZSBhcmd1bWVudCwgd2lsZGNhcmQgYm91bmQsIGFycmF5CisgICAgICogICAgICAgICAgICBlbGVtZW50IHR5cGUsIG9yIHN0YXRpYyBpbm5lciB0eXBlIHdpdGhpbiAndHlwZVJlZicuIE1heSBiZQorICAgICAqICAgICAgICAgICAgPHR0Pm51bGw8L3R0PiBpZiB0aGUgYW5ub3RhdGlvbiB0YXJnZXRzICd0eXBlUmVmJyBhcyBhIHdob2xlLgorICAgICAqIEBwYXJhbSBkZXNjCisgICAgICogICAgICAgICAgICB0aGUgY2xhc3MgZGVzY3JpcHRvciBvZiB0aGUgYW5ub3RhdGlvbiBjbGFzcy4KKyAgICAgKiBAcGFyYW0gdmlzaWJsZQorICAgICAqICAgICAgICAgICAgPHR0PnRydWU8L3R0PiBpZiB0aGUgYW5ub3RhdGlvbiBpcyB2aXNpYmxlIGF0IHJ1bnRpbWUuCisgICAgICogQHJldHVybiBhIHZpc2l0b3IgdG8gdmlzaXQgdGhlIGFubm90YXRpb24gdmFsdWVzLCBvciA8dHQ+bnVsbDwvdHQ+IGlmCisgICAgICogICAgICAgICB0aGlzIHZpc2l0b3IgaXMgbm90IGludGVyZXN0ZWQgaW4gdmlzaXRpbmcgdGhpcyBhbm5vdGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBBbm5vdGF0aW9uVmlzaXRvciB2aXNpdFR5cGVBbm5vdGF0aW9uKGludCB0eXBlUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVQYXRoIHR5cGVQYXRoLCBTdHJpbmcgZGVzYywgYm9vbGVhbiB2aXNpYmxlKSB7CisgICAgICAgIGlmIChhcGkgPCBPcGNvZGVzLkFTTTUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGN2ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBjdi52aXNpdFR5cGVBbm5vdGF0aW9uKHR5cGVSZWYsIHR5cGVQYXRoLCBkZXNjLCB2aXNpYmxlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWaXNpdHMgYSBub24gc3RhbmRhcmQgYXR0cmlidXRlIG9mIHRoZSBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhdHRyCisgICAgICogICAgICAgICAgICBhbiBhdHRyaWJ1dGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmlzaXRBdHRyaWJ1dGUoQXR0cmlidXRlIGF0dHIpIHsKKyAgICAgICAgaWYgKGN2ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGN2LnZpc2l0QXR0cmlidXRlKGF0dHIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVmlzaXRzIGluZm9ybWF0aW9uIGFib3V0IGFuIGlubmVyIGNsYXNzLiBUaGlzIGlubmVyIGNsYXNzIGlzIG5vdAorICAgICAqIG5lY2Vzc2FyaWx5IGEgbWVtYmVyIG9mIHRoZSBjbGFzcyBiZWluZyB2aXNpdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnRlcm5hbCBuYW1lIG9mIGFuIGlubmVyIGNsYXNzIChzZWUKKyAgICAgKiAgICAgICAgICAgIHtAbGluayBUeXBlI2dldEludGVybmFsTmFtZSgpIGdldEludGVybmFsTmFtZX0pLgorICAgICAqIEBwYXJhbSBvdXRlck5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnRlcm5hbCBuYW1lIG9mIHRoZSBjbGFzcyB0byB3aGljaCB0aGUgaW5uZXIgY2xhc3MKKyAgICAgKiAgICAgICAgICAgIGJlbG9uZ3MgKHNlZSB7QGxpbmsgVHlwZSNnZXRJbnRlcm5hbE5hbWUoKSBnZXRJbnRlcm5hbE5hbWV9KS4KKyAgICAgKiAgICAgICAgICAgIE1heSBiZSA8dHQ+bnVsbDwvdHQ+IGZvciBub3QgbWVtYmVyIGNsYXNzZXMuCisgICAgICogQHBhcmFtIGlubmVyTmFtZQorICAgICAqICAgICAgICAgICAgdGhlIChzaW1wbGUpIG5hbWUgb2YgdGhlIGlubmVyIGNsYXNzIGluc2lkZSBpdHMgZW5jbG9zaW5nCisgICAgICogICAgICAgICAgICBjbGFzcy4gTWF5IGJlIDx0dD5udWxsPC90dD4gZm9yIGFub255bW91cyBpbm5lciBjbGFzc2VzLgorICAgICAqIEBwYXJhbSBhY2Nlc3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBhY2Nlc3MgZmxhZ3Mgb2YgdGhlIGlubmVyIGNsYXNzIGFzIG9yaWdpbmFsbHkgZGVjbGFyZWQgaW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBlbmNsb3NpbmcgY2xhc3MuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmlzaXRJbm5lckNsYXNzKFN0cmluZyBuYW1lLCBTdHJpbmcgb3V0ZXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaW5uZXJOYW1lLCBpbnQgYWNjZXNzKSB7CisgICAgICAgIGlmIChjdiAhPSBudWxsKSB7CisgICAgICAgICAgICBjdi52aXNpdElubmVyQ2xhc3MobmFtZSwgb3V0ZXJOYW1lLCBpbm5lck5hbWUsIGFjY2Vzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWaXNpdHMgYSBmaWVsZCBvZiB0aGUgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWNjZXNzCisgICAgICogICAgICAgICAgICB0aGUgZmllbGQncyBhY2Nlc3MgZmxhZ3MgKHNlZSB7QGxpbmsgT3Bjb2Rlc30pLiBUaGlzIHBhcmFtZXRlcgorICAgICAqICAgICAgICAgICAgYWxzbyBpbmRpY2F0ZXMgaWYgdGhlIGZpZWxkIGlzIHN5bnRoZXRpYyBhbmQvb3IgZGVwcmVjYXRlZC4KKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGZpZWxkJ3MgbmFtZS4KKyAgICAgKiBAcGFyYW0gZGVzYworICAgICAqICAgICAgICAgICAgdGhlIGZpZWxkJ3MgZGVzY3JpcHRvciAoc2VlIHtAbGluayBUeXBlIFR5cGV9KS4KKyAgICAgKiBAcGFyYW0gc2lnbmF0dXJlCisgICAgICogICAgICAgICAgICB0aGUgZmllbGQncyBzaWduYXR1cmUuIE1heSBiZSA8dHQ+bnVsbDwvdHQ+IGlmIHRoZSBmaWVsZCdzCisgICAgICogICAgICAgICAgICB0eXBlIGRvZXMgbm90IHVzZSBnZW5lcmljIHR5cGVzLgorICAgICAqIEBwYXJhbSB2YWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIGZpZWxkJ3MgaW5pdGlhbCB2YWx1ZS4gVGhpcyBwYXJhbWV0ZXIsIHdoaWNoIG1heSBiZQorICAgICAqICAgICAgICAgICAgPHR0Pm51bGw8L3R0PiBpZiB0aGUgZmllbGQgZG9lcyBub3QgaGF2ZSBhbiBpbml0aWFsIHZhbHVlLAorICAgICAqICAgICAgICAgICAgbXVzdCBiZSBhbiB7QGxpbmsgSW50ZWdlcn0sIGEge0BsaW5rIEZsb2F0fSwgYSB7QGxpbmsgTG9uZ30sIGEKKyAgICAgKiAgICAgICAgICAgIHtAbGluayBEb3VibGV9IG9yIGEge0BsaW5rIFN0cmluZ30gKGZvciA8dHQ+aW50PC90dD4sCisgICAgICogICAgICAgICAgICA8dHQ+ZmxvYXQ8L3R0PiwgPHR0Pmxvbmc8L3R0PiBvciA8dHQ+U3RyaW5nPC90dD4gZmllbGRzCisgICAgICogICAgICAgICAgICByZXNwZWN0aXZlbHkpLiA8aT5UaGlzIHBhcmFtZXRlciBpcyBvbmx5IHVzZWQgZm9yIHN0YXRpYworICAgICAqICAgICAgICAgICAgZmllbGRzPC9pPi4gSXRzIHZhbHVlIGlzIGlnbm9yZWQgZm9yIG5vbiBzdGF0aWMgZmllbGRzLCB3aGljaAorICAgICAqICAgICAgICAgICAgbXVzdCBiZSBpbml0aWFsaXplZCB0aHJvdWdoIGJ5dGVjb2RlIGluc3RydWN0aW9ucyBpbgorICAgICAqICAgICAgICAgICAgY29uc3RydWN0b3JzIG9yIG1ldGhvZHMuCisgICAgICogQHJldHVybiBhIHZpc2l0b3IgdG8gdmlzaXQgZmllbGQgYW5ub3RhdGlvbnMgYW5kIGF0dHJpYnV0ZXMsIG9yCisgICAgICogICAgICAgICA8dHQ+bnVsbDwvdHQ+IGlmIHRoaXMgY2xhc3MgdmlzaXRvciBpcyBub3QgaW50ZXJlc3RlZCBpbiB2aXNpdGluZworICAgICAqICAgICAgICAgdGhlc2UgYW5ub3RhdGlvbnMgYW5kIGF0dHJpYnV0ZXMuCisgICAgICovCisgICAgcHVibGljIEZpZWxkVmlzaXRvciB2aXNpdEZpZWxkKGludCBhY2Nlc3MsIFN0cmluZyBuYW1lLCBTdHJpbmcgZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNpZ25hdHVyZSwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIGlmIChjdiAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gY3YudmlzaXRGaWVsZChhY2Nlc3MsIG5hbWUsIGRlc2MsIHNpZ25hdHVyZSwgdmFsdWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZpc2l0cyBhIG1ldGhvZCBvZiB0aGUgY2xhc3MuIFRoaXMgbWV0aG9kIDxpPm11c3Q8L2k+IHJldHVybiBhIG5ldworICAgICAqIHtAbGluayBNZXRob2RWaXNpdG9yfSBpbnN0YW5jZSAob3IgPHR0Pm51bGw8L3R0PikgZWFjaCB0aW1lIGl0IGlzIGNhbGxlZCwKKyAgICAgKiBpLmUuLCBpdCBzaG91bGQgbm90IHJldHVybiBhIHByZXZpb3VzbHkgcmV0dXJuZWQgdmlzaXRvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhY2Nlc3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBtZXRob2QncyBhY2Nlc3MgZmxhZ3MgKHNlZSB7QGxpbmsgT3Bjb2Rlc30pLiBUaGlzCisgICAgICogICAgICAgICAgICBwYXJhbWV0ZXIgYWxzbyBpbmRpY2F0ZXMgaWYgdGhlIG1ldGhvZCBpcyBzeW50aGV0aWMgYW5kL29yCisgICAgICogICAgICAgICAgICBkZXByZWNhdGVkLgorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgbWV0aG9kJ3MgbmFtZS4KKyAgICAgKiBAcGFyYW0gZGVzYworICAgICAqICAgICAgICAgICAgdGhlIG1ldGhvZCdzIGRlc2NyaXB0b3IgKHNlZSB7QGxpbmsgVHlwZSBUeXBlfSkuCisgICAgICogQHBhcmFtIHNpZ25hdHVyZQorICAgICAqICAgICAgICAgICAgdGhlIG1ldGhvZCdzIHNpZ25hdHVyZS4gTWF5IGJlIDx0dD5udWxsPC90dD4gaWYgdGhlIG1ldGhvZAorICAgICAqICAgICAgICAgICAgcGFyYW1ldGVycywgcmV0dXJuIHR5cGUgYW5kIGV4Y2VwdGlvbnMgZG8gbm90IHVzZSBnZW5lcmljCisgICAgICogICAgICAgICAgICB0eXBlcy4KKyAgICAgKiBAcGFyYW0gZXhjZXB0aW9ucworICAgICAqICAgICAgICAgICAgdGhlIGludGVybmFsIG5hbWVzIG9mIHRoZSBtZXRob2QncyBleGNlcHRpb24gY2xhc3NlcyAoc2VlCisgICAgICogICAgICAgICAgICB7QGxpbmsgVHlwZSNnZXRJbnRlcm5hbE5hbWUoKSBnZXRJbnRlcm5hbE5hbWV9KS4gTWF5IGJlCisgICAgICogICAgICAgICAgICA8dHQ+bnVsbDwvdHQ+LgorICAgICAqIEByZXR1cm4gYW4gb2JqZWN0IHRvIHZpc2l0IHRoZSBieXRlIGNvZGUgb2YgdGhlIG1ldGhvZCwgb3IgPHR0Pm51bGw8L3R0PgorICAgICAqICAgICAgICAgaWYgdGhpcyBjbGFzcyB2aXNpdG9yIGlzIG5vdCBpbnRlcmVzdGVkIGluIHZpc2l0aW5nIHRoZSBjb2RlIG9mCisgICAgICogICAgICAgICB0aGlzIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0aG9kVmlzaXRvciB2aXNpdE1ldGhvZChpbnQgYWNjZXNzLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNpZ25hdHVyZSwgU3RyaW5nW10gZXhjZXB0aW9ucykgeworICAgICAgICBpZiAoY3YgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGN2LnZpc2l0TWV0aG9kKGFjY2VzcywgbmFtZSwgZGVzYywgc2lnbmF0dXJlLCBleGNlcHRpb25zKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWaXNpdHMgdGhlIGVuZCBvZiB0aGUgY2xhc3MuIFRoaXMgbWV0aG9kLCB3aGljaCBpcyB0aGUgbGFzdCBvbmUgdG8gYmUKKyAgICAgKiBjYWxsZWQsIGlzIHVzZWQgdG8gaW5mb3JtIHRoZSB2aXNpdG9yIHRoYXQgYWxsIHRoZSBmaWVsZHMgYW5kIG1ldGhvZHMgb2YKKyAgICAgKiB0aGUgY2xhc3MgaGF2ZSBiZWVuIHZpc2l0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmlzaXRFbmQoKSB7CisgICAgICAgIGlmIChjdiAhPSBudWxsKSB7CisgICAgICAgICAgICBjdi52aXNpdEVuZCgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9qZXJzZXkvcmVwYWNrYWdlZC9vcmcvb2JqZWN0d2ViL2FzbS9DbGFzc1dyaXRlci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9qZXJzZXkvcmVwYWNrYWdlZC9vcmcvb2JqZWN0d2ViL2FzbS9DbGFzc1dyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMmZkNGUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL2plcnNleS9yZXBhY2thZ2VkL29yZy9vYmplY3R3ZWIvYXNtL0NsYXNzV3JpdGVyLmphdmEKQEAgLTAsMCArMSwxNzc2IEBACisvKioqCisgKiBBU006IGEgdmVyeSBzbWFsbCBhbmQgZmFzdCBKYXZhIGJ5dGVjb2RlIG1hbmlwdWxhdGlvbiBmcmFtZXdvcmsKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDExIElOUklBLCBGcmFuY2UgVGVsZWNvbQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIGplcnNleS5yZXBhY2thZ2VkLm9yZy5vYmplY3R3ZWIuYXNtOworCisvKioKKyAqIEEge0BsaW5rIENsYXNzVmlzaXRvcn0gdGhhdCBnZW5lcmF0ZXMgY2xhc3NlcyBpbiBieXRlY29kZSBmb3JtLiBNb3JlCisgKiBwcmVjaXNlbHkgdGhpcyB2aXNpdG9yIGdlbmVyYXRlcyBhIGJ5dGUgYXJyYXkgY29uZm9ybWluZyB0byB0aGUgSmF2YSBjbGFzcworICogZmlsZSBmb3JtYXQuIEl0IGNhbiBiZSB1c2VkIGFsb25lLCB0byBnZW5lcmF0ZSBhIEphdmEgY2xhc3MgImZyb20gc2NyYXRjaCIsCisgKiBvciB3aXRoIG9uZSBvciBtb3JlIHtAbGluayBDbGFzc1JlYWRlciBDbGFzc1JlYWRlcn0gYW5kIGFkYXB0ZXIgY2xhc3MgdmlzaXRvcgorICogdG8gZ2VuZXJhdGUgYSBtb2RpZmllZCBjbGFzcyBmcm9tIG9uZSBvciBtb3JlIGV4aXN0aW5nIEphdmEgY2xhc3Nlcy4KKyAqCisgKiBAYXV0aG9yIEVyaWMgQnJ1bmV0b24KKyAqLworcHVibGljIGNsYXNzIENsYXNzV3JpdGVyIGV4dGVuZHMgQ2xhc3NWaXNpdG9yIHsKKworICAgIC8qKgorICAgICAqIEZsYWcgdG8gYXV0b21hdGljYWxseSBjb21wdXRlIHRoZSBtYXhpbXVtIHN0YWNrIHNpemUgYW5kIHRoZSBtYXhpbXVtCisgICAgICogbnVtYmVyIG9mIGxvY2FsIHZhcmlhYmxlcyBvZiBtZXRob2RzLiBJZiB0aGlzIGZsYWcgaXMgc2V0LCB0aGVuIHRoZQorICAgICAqIGFyZ3VtZW50cyBvZiB0aGUge0BsaW5rIE1ldGhvZFZpc2l0b3IjdmlzaXRNYXhzIHZpc2l0TWF4c30gbWV0aG9kIG9mIHRoZQorICAgICAqIHtAbGluayBNZXRob2RWaXNpdG9yfSByZXR1cm5lZCBieSB0aGUge0BsaW5rICN2aXNpdE1ldGhvZCB2aXNpdE1ldGhvZH0KKyAgICAgKiBtZXRob2Qgd2lsbCBiZSBpZ25vcmVkLCBhbmQgY29tcHV0ZWQgYXV0b21hdGljYWxseSBmcm9tIHRoZSBzaWduYXR1cmUgYW5kCisgICAgICogdGhlIGJ5dGVjb2RlIG9mIGVhY2ggbWV0aG9kLgorICAgICAqCisgICAgICogQHNlZSAjQ2xhc3NXcml0ZXIoaW50KQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTVBVVEVfTUFYUyA9IDE7CisKKyAgICAvKioKKyAgICAgKiBGbGFnIHRvIGF1dG9tYXRpY2FsbHkgY29tcHV0ZSB0aGUgc3RhY2sgbWFwIGZyYW1lcyBvZiBtZXRob2RzIGZyb20KKyAgICAgKiBzY3JhdGNoLiBJZiB0aGlzIGZsYWcgaXMgc2V0LCB0aGVuIHRoZSBjYWxscyB0byB0aGUKKyAgICAgKiB7QGxpbmsgTWV0aG9kVmlzaXRvciN2aXNpdEZyYW1lfSBtZXRob2QgYXJlIGlnbm9yZWQsIGFuZCB0aGUgc3RhY2sgbWFwCisgICAgICogZnJhbWVzIGFyZSByZWNvbXB1dGVkIGZyb20gdGhlIG1ldGhvZHMgYnl0ZWNvZGUuIFRoZSBhcmd1bWVudHMgb2YgdGhlCisgICAgICoge0BsaW5rIE1ldGhvZFZpc2l0b3IjdmlzaXRNYXhzIHZpc2l0TWF4c30gbWV0aG9kIGFyZSBhbHNvIGlnbm9yZWQgYW5kCisgICAgICogcmVjb21wdXRlZCBmcm9tIHRoZSBieXRlY29kZS4gSW4gb3RoZXIgd29yZHMsIGNvbXB1dGVGcmFtZXMgaW1wbGllcworICAgICAqIGNvbXB1dGVNYXhzLgorICAgICAqCisgICAgICogQHNlZSAjQ2xhc3NXcml0ZXIoaW50KQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTVBVVEVfRlJBTUVTID0gMjsKKworICAgIC8qKgorICAgICAqIFBzZXVkbyBhY2Nlc3MgZmxhZyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZSBzeW50aGV0aWMgYXR0cmlidXRlIGFuZCB0aGUKKyAgICAgKiBzeW50aGV0aWMgYWNjZXNzIGZsYWcuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBBQ0NfU1lOVEhFVElDX0FUVFJJQlVURSA9IDB4NDAwMDA7CisKKyAgICAvKioKKyAgICAgKiBGYWN0b3IgdG8gY29udmVydCBmcm9tIEFDQ19TWU5USEVUSUNfQVRUUklCVVRFIHRvIE9wY29kZS5BQ0NfU1lOVEhFVElDLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgVE9fQUNDX1NZTlRIRVRJQyA9IEFDQ19TWU5USEVUSUNfQVRUUklCVVRFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBPcGNvZGVzLkFDQ19TWU5USEVUSUM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiBpbnN0cnVjdGlvbnMgd2l0aG91dCBhbnkgYXJndW1lbnQuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBOT0FSR19JTlNOID0gMDsKKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIGluc3RydWN0aW9ucyB3aXRoIGFuIHNpZ25lZCBieXRlIGFyZ3VtZW50LgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgU0JZVEVfSU5TTiA9IDE7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiBpbnN0cnVjdGlvbnMgd2l0aCBhbiBzaWduZWQgc2hvcnQgYXJndW1lbnQuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBTSE9SVF9JTlNOID0gMjsKKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIGluc3RydWN0aW9ucyB3aXRoIGEgbG9jYWwgdmFyaWFibGUgaW5kZXggYXJndW1lbnQuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBWQVJfSU5TTiA9IDM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiBpbnN0cnVjdGlvbnMgd2l0aCBhbiBpbXBsaWNpdCBsb2NhbCB2YXJpYWJsZSBpbmRleCBhcmd1bWVudC4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IElNUExWQVJfSU5TTiA9IDQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiBpbnN0cnVjdGlvbnMgd2l0aCBhIHR5cGUgZGVzY3JpcHRvciBhcmd1bWVudC4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IFRZUEVfSU5TTiA9IDU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiBmaWVsZCBhbmQgbWV0aG9kIGludm9jYXRpb25zIGluc3RydWN0aW9ucy4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IEZJRUxET1JNRVRIX0lOU04gPSA2OworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2YgdGhlIElOVk9LRUlOVEVSRkFDRS9JTlZPS0VEWU5BTUlDIGluc3RydWN0aW9uLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgSVRGTUVUSF9JTlNOID0gNzsKKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIHRoZSBJTlZPS0VEWU5BTUlDIGluc3RydWN0aW9uLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgSU5EWU1FVEhfSU5TTiA9IDg7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiBpbnN0cnVjdGlvbnMgd2l0aCBhIDIgYnl0ZXMgYnl0ZWNvZGUgb2Zmc2V0IGxhYmVsLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgTEFCRUxfSU5TTiA9IDk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiBpbnN0cnVjdGlvbnMgd2l0aCBhIDQgYnl0ZXMgYnl0ZWNvZGUgb2Zmc2V0IGxhYmVsLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgTEFCRUxXX0lOU04gPSAxMDsKKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIHRoZSBMREMgaW5zdHJ1Y3Rpb24uCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBMRENfSU5TTiA9IDExOworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2YgdGhlIExEQ19XIGFuZCBMREMyX1cgaW5zdHJ1Y3Rpb25zLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgTERDV19JTlNOID0gMTI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiB0aGUgSUlOQyBpbnN0cnVjdGlvbi4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IElJTkNfSU5TTiA9IDEzOworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2YgdGhlIFRBQkxFU1dJVENIIGluc3RydWN0aW9uLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgVEFCTF9JTlNOID0gMTQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiB0aGUgTE9PS1VQU1dJVENIIGluc3RydWN0aW9uLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgTE9PS19JTlNOID0gMTU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiB0aGUgTVVMVElBTkVXQVJSQVkgaW5zdHJ1Y3Rpb24uCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBNQU5BX0lOU04gPSAxNjsKKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIHRoZSBXSURFIGluc3RydWN0aW9uLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgV0lERV9JTlNOID0gMTc7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaW5zdHJ1Y3Rpb24gdHlwZXMgb2YgYWxsIEpWTSBvcGNvZGVzLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBieXRlW10gVFlQRTsKKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIENPTlNUQU5UX0NsYXNzIGNvbnN0YW50IHBvb2wgaXRlbXMuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBDTEFTUyA9IDc7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiBDT05TVEFOVF9GaWVsZHJlZiBjb25zdGFudCBwb29sIGl0ZW1zLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgRklFTEQgPSA5OworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2YgQ09OU1RBTlRfTWV0aG9kcmVmIGNvbnN0YW50IHBvb2wgaXRlbXMuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBNRVRIID0gMTA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiBDT05TVEFOVF9JbnRlcmZhY2VNZXRob2RyZWYgY29uc3RhbnQgcG9vbCBpdGVtcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IElNRVRIID0gMTE7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiBDT05TVEFOVF9TdHJpbmcgY29uc3RhbnQgcG9vbCBpdGVtcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IFNUUiA9IDg7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiBDT05TVEFOVF9JbnRlZ2VyIGNvbnN0YW50IHBvb2wgaXRlbXMuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBJTlQgPSAzOworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2YgQ09OU1RBTlRfRmxvYXQgY29uc3RhbnQgcG9vbCBpdGVtcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IEZMT0FUID0gNDsKKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIENPTlNUQU5UX0xvbmcgY29uc3RhbnQgcG9vbCBpdGVtcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IExPTkcgPSA1OworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2YgQ09OU1RBTlRfRG91YmxlIGNvbnN0YW50IHBvb2wgaXRlbXMuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBET1VCTEUgPSA2OworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2YgQ09OU1RBTlRfTmFtZUFuZFR5cGUgY29uc3RhbnQgcG9vbCBpdGVtcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IE5BTUVfVFlQRSA9IDEyOworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2YgQ09OU1RBTlRfVXRmOCBjb25zdGFudCBwb29sIGl0ZW1zLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgVVRGOCA9IDE7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiBDT05TVEFOVF9NZXRob2RUeXBlIGNvbnN0YW50IHBvb2wgaXRlbXMuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBNVFlQRSA9IDE2OworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2YgQ09OU1RBTlRfTWV0aG9kSGFuZGxlIGNvbnN0YW50IHBvb2wgaXRlbXMuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBIQU5ETEUgPSAxNTsKKworICAgIC8qKgorICAgICAqIFRoZSB0eXBlIG9mIENPTlNUQU5UX0ludm9rZUR5bmFtaWMgY29uc3RhbnQgcG9vbCBpdGVtcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IElORFkgPSAxODsKKworICAgIC8qKgorICAgICAqIFRoZSBiYXNlIHZhbHVlIGZvciBhbGwgQ09OU1RBTlRfTWV0aG9kSGFuZGxlIGNvbnN0YW50IHBvb2wgaXRlbXMuCisgICAgICogSW50ZXJuYWxseSwgQVNNIHN0b3JlIHRoZSA5IHZhcmlhdGlvbnMgb2YgQ09OU1RBTlRfTWV0aG9kSGFuZGxlIGludG8gOQorICAgICAqIGRpZmZlcmVudCBpdGVtcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IEhBTkRMRV9CQVNFID0gMjA7CisKKyAgICAvKioKKyAgICAgKiBOb3JtYWwgdHlwZSBJdGVtIHN0b3JlZCBpbiB0aGUgQ2xhc3NXcml0ZXIge0BsaW5rIENsYXNzV3JpdGVyI3R5cGVUYWJsZX0sCisgICAgICogaW5zdGVhZCBvZiB0aGUgY29uc3RhbnQgcG9vbCwgaW4gb3JkZXIgdG8gYXZvaWQgY2xhc2hlcyB3aXRoIG5vcm1hbAorICAgICAqIGNvbnN0YW50IHBvb2wgaXRlbXMgaW4gdGhlIENsYXNzV3JpdGVyIGNvbnN0YW50IHBvb2wncyBoYXNoIHRhYmxlLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9OT1JNQUwgPSAzMDsKKworICAgIC8qKgorICAgICAqIFVuaW5pdGlhbGl6ZWQgdHlwZSBJdGVtIHN0b3JlZCBpbiB0aGUgQ2xhc3NXcml0ZXIKKyAgICAgKiB7QGxpbmsgQ2xhc3NXcml0ZXIjdHlwZVRhYmxlfSwgaW5zdGVhZCBvZiB0aGUgY29uc3RhbnQgcG9vbCwgaW4gb3JkZXIgdG8KKyAgICAgKiBhdm9pZCBjbGFzaGVzIHdpdGggbm9ybWFsIGNvbnN0YW50IHBvb2wgaXRlbXMgaW4gdGhlIENsYXNzV3JpdGVyIGNvbnN0YW50CisgICAgICogcG9vbCdzIGhhc2ggdGFibGUuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBUWVBFX1VOSU5JVCA9IDMxOworCisgICAgLyoqCisgICAgICogTWVyZ2VkIHR5cGUgSXRlbSBzdG9yZWQgaW4gdGhlIENsYXNzV3JpdGVyIHtAbGluayBDbGFzc1dyaXRlciN0eXBlVGFibGV9LAorICAgICAqIGluc3RlYWQgb2YgdGhlIGNvbnN0YW50IHBvb2wsIGluIG9yZGVyIHRvIGF2b2lkIGNsYXNoZXMgd2l0aCBub3JtYWwKKyAgICAgKiBjb25zdGFudCBwb29sIGl0ZW1zIGluIHRoZSBDbGFzc1dyaXRlciBjb25zdGFudCBwb29sJ3MgaGFzaCB0YWJsZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IFRZUEVfTUVSR0VEID0gMzI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiBCb290c3RyYXBNZXRob2RzIGl0ZW1zLiBUaGVzZSBpdGVtcyBhcmUgc3RvcmVkIGluIGEgc3BlY2lhbAorICAgICAqIGNsYXNzIGF0dHJpYnV0ZSBuYW1lZCBCb290c3RyYXBNZXRob2RzIGFuZCBub3QgaW4gdGhlIGNvbnN0YW50IHBvb2wuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBCU00gPSAzMzsKKworICAgIC8qKgorICAgICAqIFRoZSBjbGFzcyByZWFkZXIgZnJvbSB3aGljaCB0aGlzIGNsYXNzIHdyaXRlciB3YXMgY29uc3RydWN0ZWQsIGlmIGFueS4KKyAgICAgKi8KKyAgICBDbGFzc1JlYWRlciBjcjsKKworICAgIC8qKgorICAgICAqIE1pbm9yIGFuZCBtYWpvciB2ZXJzaW9uIG51bWJlcnMgb2YgdGhlIGNsYXNzIHRvIGJlIGdlbmVyYXRlZC4KKyAgICAgKi8KKyAgICBpbnQgdmVyc2lvbjsKKworICAgIC8qKgorICAgICAqIEluZGV4IG9mIHRoZSBuZXh0IGl0ZW0gdG8gYmUgYWRkZWQgaW4gdGhlIGNvbnN0YW50IHBvb2wuCisgICAgICovCisgICAgaW50IGluZGV4OworCisgICAgLyoqCisgICAgICogVGhlIGNvbnN0YW50IHBvb2wgb2YgdGhpcyBjbGFzcy4KKyAgICAgKi8KKyAgICBmaW5hbCBCeXRlVmVjdG9yIHBvb2w7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY29uc3RhbnQgcG9vbCdzIGhhc2ggdGFibGUgZGF0YS4KKyAgICAgKi8KKyAgICBJdGVtW10gaXRlbXM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGhyZXNob2xkIG9mIHRoZSBjb25zdGFudCBwb29sJ3MgaGFzaCB0YWJsZS4KKyAgICAgKi8KKyAgICBpbnQgdGhyZXNob2xkOworCisgICAgLyoqCisgICAgICogQSByZXVzYWJsZSBrZXkgdXNlZCB0byBsb29rIGZvciBpdGVtcyBpbiB0aGUge0BsaW5rICNpdGVtc30gaGFzaCB0YWJsZS4KKyAgICAgKi8KKyAgICBmaW5hbCBJdGVtIGtleTsKKworICAgIC8qKgorICAgICAqIEEgcmV1c2FibGUga2V5IHVzZWQgdG8gbG9vayBmb3IgaXRlbXMgaW4gdGhlIHtAbGluayAjaXRlbXN9IGhhc2ggdGFibGUuCisgICAgICovCisgICAgZmluYWwgSXRlbSBrZXkyOworCisgICAgLyoqCisgICAgICogQSByZXVzYWJsZSBrZXkgdXNlZCB0byBsb29rIGZvciBpdGVtcyBpbiB0aGUge0BsaW5rICNpdGVtc30gaGFzaCB0YWJsZS4KKyAgICAgKi8KKyAgICBmaW5hbCBJdGVtIGtleTM7CisKKyAgICAvKioKKyAgICAgKiBBIHJldXNhYmxlIGtleSB1c2VkIHRvIGxvb2sgZm9yIGl0ZW1zIGluIHRoZSB7QGxpbmsgI2l0ZW1zfSBoYXNoIHRhYmxlLgorICAgICAqLworICAgIGZpbmFsIEl0ZW0ga2V5NDsKKworICAgIC8qKgorICAgICAqIEEgdHlwZSB0YWJsZSB1c2VkIHRvIHRlbXBvcmFyaWx5IHN0b3JlIGludGVybmFsIG5hbWVzIHRoYXQgd2lsbCBub3QKKyAgICAgKiBuZWNlc3NhcmlseSBiZSBzdG9yZWQgaW4gdGhlIGNvbnN0YW50IHBvb2wuIFRoaXMgdHlwZSB0YWJsZSBpcyB1c2VkIGJ5CisgICAgICogdGhlIGNvbnRyb2wgZmxvdyBhbmQgZGF0YSBmbG93IGFuYWx5c2lzIGFsZ29yaXRobSB1c2VkIHRvIGNvbXB1dGUgc3RhY2sKKyAgICAgKiBtYXAgZnJhbWVzIGZyb20gc2NyYXRjaC4gVGhpcyBhcnJheSBhc3NvY2lhdGVzIHRvIGVhY2ggaW5kZXggPHR0Pmk8L3R0PgorICAgICAqIHRoZSBJdGVtIHdob3NlIGluZGV4IGlzIDx0dD5pPC90dD4uIEFsbCBJdGVtIG9iamVjdHMgc3RvcmVkIGluIHRoaXMgYXJyYXkKKyAgICAgKiBhcmUgYWxzbyBzdG9yZWQgaW4gdGhlIHtAbGluayAjaXRlbXN9IGhhc2ggdGFibGUuIFRoZXNlIHR3byBhcnJheXMgYWxsb3cKKyAgICAgKiB0byByZXRyaWV2ZSBhbiBJdGVtIGZyb20gaXRzIGluZGV4IG9yLCBjb252ZXJzZWx5LCB0byBnZXQgdGhlIGluZGV4IG9mIGFuCisgICAgICogSXRlbSBmcm9tIGl0cyB2YWx1ZS4gRWFjaCBJdGVtIHN0b3JlcyBhbiBpbnRlcm5hbCBuYW1lIGluIGl0cworICAgICAqIHtAbGluayBJdGVtI3N0clZhbDF9IGZpZWxkLgorICAgICAqLworICAgIEl0ZW1bXSB0eXBlVGFibGU7CisKKyAgICAvKioKKyAgICAgKiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHtAbGluayAjdHlwZVRhYmxlfSBhcnJheS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHNob3J0IHR5cGVDb3VudDsKKworICAgIC8qKgorICAgICAqIFRoZSBhY2Nlc3MgZmxhZ3Mgb2YgdGhpcyBjbGFzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBhY2Nlc3M7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY29uc3RhbnQgcG9vbCBpdGVtIHRoYXQgY29udGFpbnMgdGhlIGludGVybmFsIG5hbWUgb2YgdGhpcyBjbGFzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBuYW1lOworCisgICAgLyoqCisgICAgICogVGhlIGludGVybmFsIG5hbWUgb2YgdGhpcyBjbGFzcy4KKyAgICAgKi8KKyAgICBTdHJpbmcgdGhpc05hbWU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY29uc3RhbnQgcG9vbCBpdGVtIHRoYXQgY29udGFpbnMgdGhlIHNpZ25hdHVyZSBvZiB0aGlzIGNsYXNzLgorICAgICAqLworICAgIHByaXZhdGUgaW50IHNpZ25hdHVyZTsKKworICAgIC8qKgorICAgICAqIFRoZSBjb25zdGFudCBwb29sIGl0ZW0gdGhhdCBjb250YWlucyB0aGUgaW50ZXJuYWwgbmFtZSBvZiB0aGUgc3VwZXIgY2xhc3MKKyAgICAgKiBvZiB0aGlzIGNsYXNzLgorICAgICAqLworICAgIHByaXZhdGUgaW50IHN1cGVyTmFtZTsKKworICAgIC8qKgorICAgICAqIE51bWJlciBvZiBpbnRlcmZhY2VzIGltcGxlbWVudGVkIG9yIGV4dGVuZGVkIGJ5IHRoaXMgY2xhc3Mgb3IgaW50ZXJmYWNlLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGludGVyZmFjZUNvdW50OworCisgICAgLyoqCisgICAgICogVGhlIGludGVyZmFjZXMgaW1wbGVtZW50ZWQgb3IgZXh0ZW5kZWQgYnkgdGhpcyBjbGFzcyBvciBpbnRlcmZhY2UuIE1vcmUKKyAgICAgKiBwcmVjaXNlbHksIHRoaXMgYXJyYXkgY29udGFpbnMgdGhlIGluZGV4ZXMgb2YgdGhlIGNvbnN0YW50IHBvb2wgaXRlbXMKKyAgICAgKiB0aGF0IGNvbnRhaW4gdGhlIGludGVybmFsIG5hbWVzIG9mIHRoZXNlIGludGVyZmFjZXMuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnRbXSBpbnRlcmZhY2VzOworCisgICAgLyoqCisgICAgICogVGhlIGluZGV4IG9mIHRoZSBjb25zdGFudCBwb29sIGl0ZW0gdGhhdCBjb250YWlucyB0aGUgbmFtZSBvZiB0aGUgc291cmNlCisgICAgICogZmlsZSBmcm9tIHdoaWNoIHRoaXMgY2xhc3Mgd2FzIGNvbXBpbGVkLgorICAgICAqLworICAgIHByaXZhdGUgaW50IHNvdXJjZUZpbGU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgU291cmNlRGVidWcgYXR0cmlidXRlIG9mIHRoaXMgY2xhc3MuCisgICAgICovCisgICAgcHJpdmF0ZSBCeXRlVmVjdG9yIHNvdXJjZURlYnVnOworCisgICAgLyoqCisgICAgICogVGhlIGNvbnN0YW50IHBvb2wgaXRlbSB0aGF0IGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoZSBlbmNsb3NpbmcgY2xhc3Mgb2YKKyAgICAgKiB0aGlzIGNsYXNzLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGVuY2xvc2luZ01ldGhvZE93bmVyOworCisgICAgLyoqCisgICAgICogVGhlIGNvbnN0YW50IHBvb2wgaXRlbSB0aGF0IGNvbnRhaW5zIHRoZSBuYW1lIGFuZCBkZXNjcmlwdG9yIG9mIHRoZQorICAgICAqIGVuY2xvc2luZyBtZXRob2Qgb2YgdGhpcyBjbGFzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBlbmNsb3NpbmdNZXRob2Q7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcnVudGltZSB2aXNpYmxlIGFubm90YXRpb25zIG9mIHRoaXMgY2xhc3MuCisgICAgICovCisgICAgcHJpdmF0ZSBBbm5vdGF0aW9uV3JpdGVyIGFubnM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcnVudGltZSBpbnZpc2libGUgYW5ub3RhdGlvbnMgb2YgdGhpcyBjbGFzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIEFubm90YXRpb25Xcml0ZXIgaWFubnM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcnVudGltZSB2aXNpYmxlIHR5cGUgYW5ub3RhdGlvbnMgb2YgdGhpcyBjbGFzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIEFubm90YXRpb25Xcml0ZXIgdGFubnM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcnVudGltZSBpbnZpc2libGUgdHlwZSBhbm5vdGF0aW9ucyBvZiB0aGlzIGNsYXNzLgorICAgICAqLworICAgIHByaXZhdGUgQW5ub3RhdGlvbldyaXRlciBpdGFubnM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbm9uIHN0YW5kYXJkIGF0dHJpYnV0ZXMgb2YgdGhpcyBjbGFzcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIEF0dHJpYnV0ZSBhdHRyczsKKworICAgIC8qKgorICAgICAqIFRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgSW5uZXJDbGFzc2VzIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBpbm5lckNsYXNzZXNDb3VudDsKKworICAgIC8qKgorICAgICAqIFRoZSBJbm5lckNsYXNzZXMgYXR0cmlidXRlLgorICAgICAqLworICAgIHByaXZhdGUgQnl0ZVZlY3RvciBpbm5lckNsYXNzZXM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIEJvb3RzdHJhcE1ldGhvZHMgYXR0cmlidXRlLgorICAgICAqLworICAgIGludCBib290c3RyYXBNZXRob2RzQ291bnQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgQm9vdHN0cmFwTWV0aG9kcyBhdHRyaWJ1dGUuCisgICAgICovCisgICAgQnl0ZVZlY3RvciBib290c3RyYXBNZXRob2RzOworCisgICAgLyoqCisgICAgICogVGhlIGZpZWxkcyBvZiB0aGlzIGNsYXNzLiBUaGVzZSBmaWVsZHMgYXJlIHN0b3JlZCBpbiBhIGxpbmtlZCBsaXN0IG9mCisgICAgICoge0BsaW5rIEZpZWxkV3JpdGVyfSBvYmplY3RzLCBsaW5rZWQgdG8gZWFjaCBvdGhlciBieSB0aGVpcgorICAgICAqIHtAbGluayBGaWVsZFdyaXRlciNmdn0gZmllbGQuIFRoaXMgZmllbGQgc3RvcmVzIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoaXMKKyAgICAgKiBsaXN0LgorICAgICAqLworICAgIEZpZWxkV3JpdGVyIGZpcnN0RmllbGQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZmllbGRzIG9mIHRoaXMgY2xhc3MuIFRoZXNlIGZpZWxkcyBhcmUgc3RvcmVkIGluIGEgbGlua2VkIGxpc3Qgb2YKKyAgICAgKiB7QGxpbmsgRmllbGRXcml0ZXJ9IG9iamVjdHMsIGxpbmtlZCB0byBlYWNoIG90aGVyIGJ5IHRoZWlyCisgICAgICoge0BsaW5rIEZpZWxkV3JpdGVyI2Z2fSBmaWVsZC4gVGhpcyBmaWVsZCBzdG9yZXMgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGlzCisgICAgICogbGlzdC4KKyAgICAgKi8KKyAgICBGaWVsZFdyaXRlciBsYXN0RmllbGQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWV0aG9kcyBvZiB0aGlzIGNsYXNzLiBUaGVzZSBtZXRob2RzIGFyZSBzdG9yZWQgaW4gYSBsaW5rZWQgbGlzdCBvZgorICAgICAqIHtAbGluayBNZXRob2RXcml0ZXJ9IG9iamVjdHMsIGxpbmtlZCB0byBlYWNoIG90aGVyIGJ5IHRoZWlyCisgICAgICoge0BsaW5rIE1ldGhvZFdyaXRlciNtdn0gZmllbGQuIFRoaXMgZmllbGQgc3RvcmVzIHRoZSBmaXJzdCBlbGVtZW50IG9mCisgICAgICogdGhpcyBsaXN0LgorICAgICAqLworICAgIE1ldGhvZFdyaXRlciBmaXJzdE1ldGhvZDsKKworICAgIC8qKgorICAgICAqIFRoZSBtZXRob2RzIG9mIHRoaXMgY2xhc3MuIFRoZXNlIG1ldGhvZHMgYXJlIHN0b3JlZCBpbiBhIGxpbmtlZCBsaXN0IG9mCisgICAgICoge0BsaW5rIE1ldGhvZFdyaXRlcn0gb2JqZWN0cywgbGlua2VkIHRvIGVhY2ggb3RoZXIgYnkgdGhlaXIKKyAgICAgKiB7QGxpbmsgTWV0aG9kV3JpdGVyI212fSBmaWVsZC4gVGhpcyBmaWVsZCBzdG9yZXMgdGhlIGxhc3QgZWxlbWVudCBvZiB0aGlzCisgICAgICogbGlzdC4KKyAgICAgKi8KKyAgICBNZXRob2RXcml0ZXIgbGFzdE1ldGhvZDsKKworICAgIC8qKgorICAgICAqIDx0dD50cnVlPC90dD4gaWYgdGhlIG1heGltdW0gc3RhY2sgc2l6ZSBhbmQgbnVtYmVyIG9mIGxvY2FsIHZhcmlhYmxlcworICAgICAqIG11c3QgYmUgYXV0b21hdGljYWxseSBjb21wdXRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gY29tcHV0ZU1heHM7CisKKyAgICAvKioKKyAgICAgKiA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoZSBzdGFjayBtYXAgZnJhbWVzIG11c3QgYmUgcmVjb21wdXRlZCBmcm9tIHNjcmF0Y2guCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGNvbXB1dGVGcmFtZXM7CisKKyAgICAvKioKKyAgICAgKiA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoZSBzdGFjayBtYXAgdGFibGVzIG9mIHRoaXMgY2xhc3MgYXJlIGludmFsaWQuIFRoZQorICAgICAqIHtAbGluayBNZXRob2RXcml0ZXIjcmVzaXplSW5zdHJ1Y3Rpb25zfSBtZXRob2QgY2Fubm90IHRyYW5zZm9ybSBleGlzdGluZworICAgICAqIHN0YWNrIG1hcCB0YWJsZXMsIGFuZCBzbyBwcm9kdWNlcyBwb3RlbnRpYWxseSBpbnZhbGlkIGNsYXNzZXMgd2hlbiBpdCBpcworICAgICAqIGV4ZWN1dGVkLiBJbiB0aGlzIGNhc2UgdGhlIGNsYXNzIGlzIHJlcmVhZCBhbmQgcmV3cml0dGVuIHdpdGggdGhlCisgICAgICoge0BsaW5rICNDT01QVVRFX0ZSQU1FU30gb3B0aW9uICh0aGUgcmVzaXplSW5zdHJ1Y3Rpb25zIG1ldGhvZCBjYW4gcmVzaXplCisgICAgICogc3RhY2sgbWFwIHRhYmxlcyB3aGVuIHRoaXMgb3B0aW9uIGlzIHVzZWQpLgorICAgICAqLworICAgIGJvb2xlYW4gaW52YWxpZEZyYW1lczsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIFN0YXRpYyBpbml0aWFsaXplcgorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqCisgICAgICogQ29tcHV0ZXMgdGhlIGluc3RydWN0aW9uIHR5cGVzIG9mIEpWTSBvcGNvZGVzLgorICAgICAqLworICAgIHN0YXRpYyB7CisgICAgICAgIGludCBpOworICAgICAgICBieXRlW10gYiA9IG5ldyBieXRlWzIyMF07CisgICAgICAgIFN0cmluZyBzID0gIkFBQUFBQUFBQUFBQUFBQUFCQ0xNTURERERERUVFRUVFRUVFRUVFRUVFRUVFRUVBQUFBQUFBQUREIgorICAgICAgICAgICAgICAgICAgICsgIkREREVFRUVFRUVFRUVFRUVFRUVFRUVFQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBIgorICAgICAgICAgICAgICAgICAgICsgIkFBQUFBQUFBQUFBQUFBQUFBTkFBQUFBQUFBQUFBQUFBQUFBQUFBSkpKSkpKSkpKSkpKSkpKSkRPUEFBIgorICAgICAgICAgICAgICAgICAgICsgIkFBQUFHR0dHR0dHSElGQkZBQUZGQUFSUUpKS0tKSkpKSkpKSkpKSkpKSkpKSkoiOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYi5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgYltpXSA9IChieXRlKSAocy5jaGFyQXQoaSkgLSAnQScpOworICAgICAgICB9CisgICAgICAgIFRZUEUgPSBiOworCisgICAgICAgIC8vIGNvZGUgdG8gZ2VuZXJhdGUgdGhlIGFib3ZlIHN0cmluZworICAgICAgICAvLworICAgICAgICAvLyAvLyBTQllURV9JTlNOIGluc3RydWN0aW9ucworICAgICAgICAvLyBiW0NvbnN0YW50cy5ORVdBUlJBWV0gPSBTQllURV9JTlNOOworICAgICAgICAvLyBiW0NvbnN0YW50cy5CSVBVU0hdID0gU0JZVEVfSU5TTjsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gLy8gU0hPUlRfSU5TTiBpbnN0cnVjdGlvbnMKKyAgICAgICAgLy8gYltDb25zdGFudHMuU0lQVVNIXSA9IFNIT1JUX0lOU047CisgICAgICAgIC8vCisgICAgICAgIC8vIC8vIChJTVBMKVZBUl9JTlNOIGluc3RydWN0aW9ucworICAgICAgICAvLyBiW0NvbnN0YW50cy5SRVRdID0gVkFSX0lOU047CisgICAgICAgIC8vIGZvciAoaSA9IENvbnN0YW50cy5JTE9BRDsgaSA8PSBDb25zdGFudHMuQUxPQUQ7ICsraSkgeworICAgICAgICAvLyBiW2ldID0gVkFSX0lOU047CisgICAgICAgIC8vIH0KKyAgICAgICAgLy8gZm9yIChpID0gQ29uc3RhbnRzLklTVE9SRTsgaSA8PSBDb25zdGFudHMuQVNUT1JFOyArK2kpIHsKKyAgICAgICAgLy8gYltpXSA9IFZBUl9JTlNOOworICAgICAgICAvLyB9CisgICAgICAgIC8vIGZvciAoaSA9IDI2OyBpIDw9IDQ1OyArK2kpIHsgLy8gSUxPQURfMCB0byBBTE9BRF8zCisgICAgICAgIC8vIGJbaV0gPSBJTVBMVkFSX0lOU047CisgICAgICAgIC8vIH0KKyAgICAgICAgLy8gZm9yIChpID0gNTk7IGkgPD0gNzg7ICsraSkgeyAvLyBJU1RPUkVfMCB0byBBU1RPUkVfMworICAgICAgICAvLyBiW2ldID0gSU1QTFZBUl9JTlNOOworICAgICAgICAvLyB9CisgICAgICAgIC8vCisgICAgICAgIC8vIC8vIFRZUEVfSU5TTiBpbnN0cnVjdGlvbnMKKyAgICAgICAgLy8gYltDb25zdGFudHMuTkVXXSA9IFRZUEVfSU5TTjsKKyAgICAgICAgLy8gYltDb25zdGFudHMuQU5FV0FSUkFZXSA9IFRZUEVfSU5TTjsKKyAgICAgICAgLy8gYltDb25zdGFudHMuQ0hFQ0tDQVNUXSA9IFRZUEVfSU5TTjsKKyAgICAgICAgLy8gYltDb25zdGFudHMuSU5TVEFOQ0VPRl0gPSBUWVBFX0lOU047CisgICAgICAgIC8vCisgICAgICAgIC8vIC8vIChTZXQpRklFTERPUk1FVEhfSU5TTiBpbnN0cnVjdGlvbnMKKyAgICAgICAgLy8gZm9yIChpID0gQ29uc3RhbnRzLkdFVFNUQVRJQzsgaSA8PSBDb25zdGFudHMuSU5WT0tFU1RBVElDOyArK2kpIHsKKyAgICAgICAgLy8gYltpXSA9IEZJRUxET1JNRVRIX0lOU047CisgICAgICAgIC8vIH0KKyAgICAgICAgLy8gYltDb25zdGFudHMuSU5WT0tFSU5URVJGQUNFXSA9IElURk1FVEhfSU5TTjsKKyAgICAgICAgLy8gYltDb25zdGFudHMuSU5WT0tFRFlOQU1JQ10gPSBJTkRZTUVUSF9JTlNOOworICAgICAgICAvLworICAgICAgICAvLyAvLyBMQUJFTChXKV9JTlNOIGluc3RydWN0aW9ucworICAgICAgICAvLyBmb3IgKGkgPSBDb25zdGFudHMuSUZFUTsgaSA8PSBDb25zdGFudHMuSlNSOyArK2kpIHsKKyAgICAgICAgLy8gYltpXSA9IExBQkVMX0lOU047CisgICAgICAgIC8vIH0KKyAgICAgICAgLy8gYltDb25zdGFudHMuSUZOVUxMXSA9IExBQkVMX0lOU047CisgICAgICAgIC8vIGJbQ29uc3RhbnRzLklGTk9OTlVMTF0gPSBMQUJFTF9JTlNOOworICAgICAgICAvLyBiWzIwMF0gPSBMQUJFTFdfSU5TTjsgLy8gR09UT19XCisgICAgICAgIC8vIGJbMjAxXSA9IExBQkVMV19JTlNOOyAvLyBKU1JfVworICAgICAgICAvLyAvLyB0ZW1wb3Jhcnkgb3Bjb2RlcyB1c2VkIGludGVybmFsbHkgYnkgQVNNIC0gc2VlIExhYmVsIGFuZAorICAgICAgICAvLyBNZXRob2RXcml0ZXIKKyAgICAgICAgLy8gZm9yIChpID0gMjAyOyBpIDwgMjIwOyArK2kpIHsKKyAgICAgICAgLy8gYltpXSA9IExBQkVMX0lOU047CisgICAgICAgIC8vIH0KKyAgICAgICAgLy8KKyAgICAgICAgLy8gLy8gTERDKF9XKSBpbnN0cnVjdGlvbnMKKyAgICAgICAgLy8gYltDb25zdGFudHMuTERDXSA9IExEQ19JTlNOOworICAgICAgICAvLyBiWzE5XSA9IExEQ1dfSU5TTjsgLy8gTERDX1cKKyAgICAgICAgLy8gYlsyMF0gPSBMRENXX0lOU047IC8vIExEQzJfVworICAgICAgICAvLworICAgICAgICAvLyAvLyBzcGVjaWFsIGluc3RydWN0aW9ucworICAgICAgICAvLyBiW0NvbnN0YW50cy5JSU5DXSA9IElJTkNfSU5TTjsKKyAgICAgICAgLy8gYltDb25zdGFudHMuVEFCTEVTV0lUQ0hdID0gVEFCTF9JTlNOOworICAgICAgICAvLyBiW0NvbnN0YW50cy5MT09LVVBTV0lUQ0hdID0gTE9PS19JTlNOOworICAgICAgICAvLyBiW0NvbnN0YW50cy5NVUxUSUFORVdBUlJBWV0gPSBNQU5BX0lOU047CisgICAgICAgIC8vIGJbMTk2XSA9IFdJREVfSU5TTjsgLy8gV0lERQorICAgICAgICAvLworICAgICAgICAvLyBmb3IgKGkgPSAwOyBpIDwgYi5sZW5ndGg7ICsraSkgeworICAgICAgICAvLyBTeXN0ZW0uZXJyLnByaW50KChjaGFyKSgnQScgKyBiW2ldKSk7CisgICAgICAgIC8vIH0KKyAgICAgICAgLy8gU3lzdGVtLmVyci5wcmludGxuKCk7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gQ29uc3RydWN0b3IKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0BsaW5rIENsYXNzV3JpdGVyfSBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmxhZ3MKKyAgICAgKiAgICAgICAgICAgIG9wdGlvbiBmbGFncyB0aGF0IGNhbiBiZSB1c2VkIHRvIG1vZGlmeSB0aGUgZGVmYXVsdCBiZWhhdmlvcgorICAgICAqICAgICAgICAgICAgb2YgdGhpcyBjbGFzcy4gU2VlIHtAbGluayAjQ09NUFVURV9NQVhTfSwKKyAgICAgKiAgICAgICAgICAgIHtAbGluayAjQ09NUFVURV9GUkFNRVN9LgorICAgICAqLworICAgIHB1YmxpYyBDbGFzc1dyaXRlcihmaW5hbCBpbnQgZmxhZ3MpIHsKKyAgICAgICAgc3VwZXIoT3Bjb2Rlcy5BU001KTsKKyAgICAgICAgaW5kZXggPSAxOworICAgICAgICBwb29sID0gbmV3IEJ5dGVWZWN0b3IoKTsKKyAgICAgICAgaXRlbXMgPSBuZXcgSXRlbVsyNTZdOworICAgICAgICB0aHJlc2hvbGQgPSAoaW50KSAoMC43NWQgKiBpdGVtcy5sZW5ndGgpOworICAgICAgICBrZXkgPSBuZXcgSXRlbSgpOworICAgICAgICBrZXkyID0gbmV3IEl0ZW0oKTsKKyAgICAgICAga2V5MyA9IG5ldyBJdGVtKCk7CisgICAgICAgIGtleTQgPSBuZXcgSXRlbSgpOworICAgICAgICB0aGlzLmNvbXB1dGVNYXhzID0gKGZsYWdzICYgQ09NUFVURV9NQVhTKSAhPSAwOworICAgICAgICB0aGlzLmNvbXB1dGVGcmFtZXMgPSAoZmxhZ3MgJiBDT01QVVRFX0ZSQU1FUykgIT0gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBDbGFzc1dyaXRlcn0gb2JqZWN0IGFuZCBlbmFibGVzIG9wdGltaXphdGlvbnMgZm9yCisgICAgICogIm1vc3RseSBhZGQiIGJ5dGVjb2RlIHRyYW5zZm9ybWF0aW9ucy4gVGhlc2Ugb3B0aW1pemF0aW9ucyBhcmUgdGhlCisgICAgICogZm9sbG93aW5nOgorICAgICAqCisgICAgICogPHVsPgorICAgICAqIDxsaT5UaGUgY29uc3RhbnQgcG9vbCBmcm9tIHRoZSBvcmlnaW5hbCBjbGFzcyBpcyBjb3BpZWQgYXMgaXMgaW4gdGhlIG5ldworICAgICAqIGNsYXNzLCB3aGljaCBzYXZlcyB0aW1lLiBOZXcgY29uc3RhbnQgcG9vbCBlbnRyaWVzIHdpbGwgYmUgYWRkZWQgYXQgdGhlCisgICAgICogZW5kIGlmIG5lY2Vzc2FyeSwgYnV0IHVudXNlZCBjb25zdGFudCBwb29sIGVudHJpZXMgPGk+d29uJ3QgYmUKKyAgICAgKiByZW1vdmVkPC9pPi48L2xpPgorICAgICAqIDxsaT5NZXRob2RzIHRoYXQgYXJlIG5vdCB0cmFuc2Zvcm1lZCBhcmUgY29waWVkIGFzIGlzIGluIHRoZSBuZXcgY2xhc3MsCisgICAgICogZGlyZWN0bHkgZnJvbSB0aGUgb3JpZ2luYWwgY2xhc3MgYnl0ZWNvZGUgKGkuZS4gd2l0aG91dCBlbWl0dGluZyB2aXNpdAorICAgICAqIGV2ZW50cyBmb3IgYWxsIHRoZSBtZXRob2QgaW5zdHJ1Y3Rpb25zKSwgd2hpY2ggc2F2ZXMgYSA8aT5sb3Q8L2k+IG9mCisgICAgICogdGltZS4gVW50cmFuc2Zvcm1lZCBtZXRob2RzIGFyZSBkZXRlY3RlZCBieSB0aGUgZmFjdCB0aGF0IHRoZQorICAgICAqIHtAbGluayBDbGFzc1JlYWRlcn0gcmVjZWl2ZXMge0BsaW5rIE1ldGhvZFZpc2l0b3J9IG9iamVjdHMgdGhhdCBjb21lIGZyb20KKyAgICAgKiBhIHtAbGluayBDbGFzc1dyaXRlcn0gKGFuZCBub3QgZnJvbSBhbnkgb3RoZXIge0BsaW5rIENsYXNzVmlzaXRvcn0KKyAgICAgKiBpbnN0YW5jZSkuPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzUmVhZGVyCisgICAgICogICAgICAgICAgICB0aGUge0BsaW5rIENsYXNzUmVhZGVyfSB1c2VkIHRvIHJlYWQgdGhlIG9yaWdpbmFsIGNsYXNzLiBJdAorICAgICAqICAgICAgICAgICAgd2lsbCBiZSB1c2VkIHRvIGNvcHkgdGhlIGVudGlyZSBjb25zdGFudCBwb29sIGZyb20gdGhlCisgICAgICogICAgICAgICAgICBvcmlnaW5hbCBjbGFzcyBhbmQgYWxzbyB0byBjb3B5IG90aGVyIGZyYWdtZW50cyBvZiBvcmlnaW5hbAorICAgICAqICAgICAgICAgICAgYnl0ZWNvZGUgd2hlcmUgYXBwbGljYWJsZS4KKyAgICAgKiBAcGFyYW0gZmxhZ3MKKyAgICAgKiAgICAgICAgICAgIG9wdGlvbiBmbGFncyB0aGF0IGNhbiBiZSB1c2VkIHRvIG1vZGlmeSB0aGUgZGVmYXVsdCBiZWhhdmlvcgorICAgICAqICAgICAgICAgICAgb2YgdGhpcyBjbGFzcy4gPGk+VGhlc2Ugb3B0aW9uIGZsYWdzIGRvIG5vdCBhZmZlY3QgbWV0aG9kcworICAgICAqICAgICAgICAgICAgdGhhdCBhcmUgY29waWVkIGFzIGlzIGluIHRoZSBuZXcgY2xhc3MuIFRoaXMgbWVhbnMgdGhhdCB0aGUKKyAgICAgKiAgICAgICAgICAgIG1heGltdW0gc3RhY2sgc2l6ZSBub3IgdGhlIHN0YWNrIGZyYW1lcyB3aWxsIGJlIGNvbXB1dGVkIGZvcgorICAgICAqICAgICAgICAgICAgdGhlc2UgbWV0aG9kczwvaT4uIFNlZSB7QGxpbmsgI0NPTVBVVEVfTUFYU30sCisgICAgICogICAgICAgICAgICB7QGxpbmsgI0NPTVBVVEVfRlJBTUVTfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NXcml0ZXIoZmluYWwgQ2xhc3NSZWFkZXIgY2xhc3NSZWFkZXIsIGZpbmFsIGludCBmbGFncykgeworICAgICAgICB0aGlzKGZsYWdzKTsKKyAgICAgICAgY2xhc3NSZWFkZXIuY29weVBvb2wodGhpcyk7CisgICAgICAgIHRoaXMuY3IgPSBjbGFzc1JlYWRlcjsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgQ2xhc3NWaXNpdG9yIGFic3RyYWN0IGNsYXNzCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB2aXNpdChmaW5hbCBpbnQgdmVyc2lvbiwgZmluYWwgaW50IGFjY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIHNpZ25hdHVyZSwgZmluYWwgU3RyaW5nIHN1cGVyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBpbnRlcmZhY2VzKSB7CisgICAgICAgIHRoaXMudmVyc2lvbiA9IHZlcnNpb247CisgICAgICAgIHRoaXMuYWNjZXNzID0gYWNjZXNzOworICAgICAgICB0aGlzLm5hbWUgPSBuZXdDbGFzcyhuYW1lKTsKKyAgICAgICAgdGhpc05hbWUgPSBuYW1lOworICAgICAgICBpZiAoQ2xhc3NSZWFkZXIuU0lHTkFUVVJFUyAmJiBzaWduYXR1cmUgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5zaWduYXR1cmUgPSBuZXdVVEY4KHNpZ25hdHVyZSk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5zdXBlck5hbWUgPSBzdXBlck5hbWUgPT0gbnVsbCA/IDAgOiBuZXdDbGFzcyhzdXBlck5hbWUpOworICAgICAgICBpZiAoaW50ZXJmYWNlcyAhPSBudWxsICYmIGludGVyZmFjZXMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgaW50ZXJmYWNlQ291bnQgPSBpbnRlcmZhY2VzLmxlbmd0aDsKKyAgICAgICAgICAgIHRoaXMuaW50ZXJmYWNlcyA9IG5ldyBpbnRbaW50ZXJmYWNlQ291bnRdOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2VDb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgdGhpcy5pbnRlcmZhY2VzW2ldID0gbmV3Q2xhc3MoaW50ZXJmYWNlc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB2aXNpdFNvdXJjZShmaW5hbCBTdHJpbmcgZmlsZSwgZmluYWwgU3RyaW5nIGRlYnVnKSB7CisgICAgICAgIGlmIChmaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNvdXJjZUZpbGUgPSBuZXdVVEY4KGZpbGUpOworICAgICAgICB9CisgICAgICAgIGlmIChkZWJ1ZyAhPSBudWxsKSB7CisgICAgICAgICAgICBzb3VyY2VEZWJ1ZyA9IG5ldyBCeXRlVmVjdG9yKCkuZW5jb2RlVVRGOChkZWJ1ZywgMCwKKyAgICAgICAgICAgICAgICAgICAgSW50ZWdlci5NQVhfVkFMVUUpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZpbmFsIHZvaWQgdmlzaXRPdXRlckNsYXNzKGZpbmFsIFN0cmluZyBvd25lciwgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjKSB7CisgICAgICAgIGVuY2xvc2luZ01ldGhvZE93bmVyID0gbmV3Q2xhc3Mob3duZXIpOworICAgICAgICBpZiAobmFtZSAhPSBudWxsICYmIGRlc2MgIT0gbnVsbCkgeworICAgICAgICAgICAgZW5jbG9zaW5nTWV0aG9kID0gbmV3TmFtZVR5cGUobmFtZSwgZGVzYyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgQW5ub3RhdGlvblZpc2l0b3IgdmlzaXRBbm5vdGF0aW9uKGZpbmFsIFN0cmluZyBkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiB2aXNpYmxlKSB7CisgICAgICAgIGlmICghQ2xhc3NSZWFkZXIuQU5OT1RBVElPTlMpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIEJ5dGVWZWN0b3IgYnYgPSBuZXcgQnl0ZVZlY3RvcigpOworICAgICAgICAvLyB3cml0ZSB0eXBlLCBhbmQgcmVzZXJ2ZSBzcGFjZSBmb3IgdmFsdWVzIGNvdW50CisgICAgICAgIGJ2LnB1dFNob3J0KG5ld1VURjgoZGVzYykpLnB1dFNob3J0KDApOworICAgICAgICBBbm5vdGF0aW9uV3JpdGVyIGF3ID0gbmV3IEFubm90YXRpb25Xcml0ZXIodGhpcywgdHJ1ZSwgYnYsIGJ2LCAyKTsKKyAgICAgICAgaWYgKHZpc2libGUpIHsKKyAgICAgICAgICAgIGF3Lm5leHQgPSBhbm5zOworICAgICAgICAgICAgYW5ucyA9IGF3OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXcubmV4dCA9IGlhbm5zOworICAgICAgICAgICAgaWFubnMgPSBhdzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYXc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZpbmFsIEFubm90YXRpb25WaXNpdG9yIHZpc2l0VHlwZUFubm90YXRpb24oaW50IHR5cGVSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZVBhdGggdHlwZVBhdGgsIGZpbmFsIFN0cmluZyBkZXNjLCBmaW5hbCBib29sZWFuIHZpc2libGUpIHsKKyAgICAgICAgaWYgKCFDbGFzc1JlYWRlci5BTk5PVEFUSU9OUykgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgQnl0ZVZlY3RvciBidiA9IG5ldyBCeXRlVmVjdG9yKCk7CisgICAgICAgIC8vIHdyaXRlIHRhcmdldF90eXBlIGFuZCB0YXJnZXRfaW5mbworICAgICAgICBBbm5vdGF0aW9uV3JpdGVyLnB1dFRhcmdldCh0eXBlUmVmLCB0eXBlUGF0aCwgYnYpOworICAgICAgICAvLyB3cml0ZSB0eXBlLCBhbmQgcmVzZXJ2ZSBzcGFjZSBmb3IgdmFsdWVzIGNvdW50CisgICAgICAgIGJ2LnB1dFNob3J0KG5ld1VURjgoZGVzYykpLnB1dFNob3J0KDApOworICAgICAgICBBbm5vdGF0aW9uV3JpdGVyIGF3ID0gbmV3IEFubm90YXRpb25Xcml0ZXIodGhpcywgdHJ1ZSwgYnYsIGJ2LAorICAgICAgICAgICAgICAgIGJ2Lmxlbmd0aCAtIDIpOworICAgICAgICBpZiAodmlzaWJsZSkgeworICAgICAgICAgICAgYXcubmV4dCA9IHRhbm5zOworICAgICAgICAgICAgdGFubnMgPSBhdzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF3Lm5leHQgPSBpdGFubnM7CisgICAgICAgICAgICBpdGFubnMgPSBhdzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYXc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZpbmFsIHZvaWQgdmlzaXRBdHRyaWJ1dGUoZmluYWwgQXR0cmlidXRlIGF0dHIpIHsKKyAgICAgICAgYXR0ci5uZXh0ID0gYXR0cnM7CisgICAgICAgIGF0dHJzID0gYXR0cjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgdm9pZCB2aXNpdElubmVyQ2xhc3MoZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBvdXRlck5hbWUsIGZpbmFsIFN0cmluZyBpbm5lck5hbWUsIGZpbmFsIGludCBhY2Nlc3MpIHsKKyAgICAgICAgaWYgKGlubmVyQ2xhc3NlcyA9PSBudWxsKSB7CisgICAgICAgICAgICBpbm5lckNsYXNzZXMgPSBuZXcgQnl0ZVZlY3RvcigpOworICAgICAgICB9CisgICAgICAgIC8vIFNlYy4gNC43LjYgb2YgdGhlIEpWTVMgc3RhdGVzICJFdmVyeSBDT05TVEFOVF9DbGFzc19pbmZvIGVudHJ5IGluIHRoZQorICAgICAgICAvLyBjb25zdGFudF9wb29sIHRhYmxlIHdoaWNoIHJlcHJlc2VudHMgYSBjbGFzcyBvciBpbnRlcmZhY2UgQyB0aGF0IGlzCisgICAgICAgIC8vIG5vdCBhIHBhY2thZ2UgbWVtYmVyIG11c3QgaGF2ZSBleGFjdGx5IG9uZSBjb3JyZXNwb25kaW5nIGVudHJ5IGluIHRoZQorICAgICAgICAvLyBjbGFzc2VzIGFycmF5Ii4gVG8gYXZvaWQgZHVwbGljYXRlcyB3ZSBrZWVwIHRyYWNrIGluIHRoZSBpbnRWYWwgZmllbGQKKyAgICAgICAgLy8gb2YgdGhlIEl0ZW0gb2YgZWFjaCBDT05TVEFOVF9DbGFzc19pbmZvIGVudHJ5IEMgd2hldGhlciBhbiBpbm5lcgorICAgICAgICAvLyBjbGFzcyBlbnRyeSBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIGZvciBDICh0aGlzIGZpZWxkIGlzIHVudXNlZCBmb3IKKyAgICAgICAgLy8gY2xhc3MgZW50cmllcywgYW5kIGNoYW5naW5nIGl0cyB2YWx1ZSBkb2VzIG5vdCBjaGFuZ2UgdGhlIGhhc2hjb2RlCisgICAgICAgIC8vIGFuZCBlcXVhbGl0eSB0ZXN0cykuIElmIHNvIHdlIHN0b3JlIHRoZSBpbmRleCBvZiB0aGlzIGlubmVyIGNsYXNzCisgICAgICAgIC8vIGVudHJ5IChwbHVzIG9uZSkgaW4gaW50VmFsLiBUaGlzIGhhY2sgYWxsb3dzIGR1cGxpY2F0ZSBkZXRlY3Rpb24gaW4KKyAgICAgICAgLy8gTygxKSB0aW1lLgorICAgICAgICBJdGVtIG5hbWVJdGVtID0gbmV3Q2xhc3NJdGVtKG5hbWUpOworICAgICAgICBpZiAobmFtZUl0ZW0uaW50VmFsID09IDApIHsKKyAgICAgICAgICAgICsraW5uZXJDbGFzc2VzQ291bnQ7CisgICAgICAgICAgICBpbm5lckNsYXNzZXMucHV0U2hvcnQobmFtZUl0ZW0uaW5kZXgpOworICAgICAgICAgICAgaW5uZXJDbGFzc2VzLnB1dFNob3J0KG91dGVyTmFtZSA9PSBudWxsID8gMCA6IG5ld0NsYXNzKG91dGVyTmFtZSkpOworICAgICAgICAgICAgaW5uZXJDbGFzc2VzLnB1dFNob3J0KGlubmVyTmFtZSA9PSBudWxsID8gMCA6IG5ld1VURjgoaW5uZXJOYW1lKSk7CisgICAgICAgICAgICBpbm5lckNsYXNzZXMucHV0U2hvcnQoYWNjZXNzKTsKKyAgICAgICAgICAgIG5hbWVJdGVtLmludFZhbCA9IGlubmVyQ2xhc3Nlc0NvdW50OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gQ29tcGFyZSB0aGUgaW5uZXIgY2xhc3NlcyBlbnRyeSBuYW1lSXRlbS5pbnRWYWwgLSAxIHdpdGggdGhlCisgICAgICAgICAgICAvLyBhcmd1bWVudHMgb2YgdGhpcyBtZXRob2QgYW5kIHRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhCisgICAgICAgICAgICAvLyBkaWZmZXJlbmNlPworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZpbmFsIEZpZWxkVmlzaXRvciB2aXNpdEZpZWxkKGZpbmFsIGludCBhY2Nlc3MsIGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYywgZmluYWwgU3RyaW5nIHNpZ25hdHVyZSwgZmluYWwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIHJldHVybiBuZXcgRmllbGRXcml0ZXIodGhpcywgYWNjZXNzLCBuYW1lLCBkZXNjLCBzaWduYXR1cmUsIHZhbHVlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgTWV0aG9kVmlzaXRvciB2aXNpdE1ldGhvZChmaW5hbCBpbnQgYWNjZXNzLCBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYywgZmluYWwgU3RyaW5nIHNpZ25hdHVyZSwgZmluYWwgU3RyaW5nW10gZXhjZXB0aW9ucykgeworICAgICAgICByZXR1cm4gbmV3IE1ldGhvZFdyaXRlcih0aGlzLCBhY2Nlc3MsIG5hbWUsIGRlc2MsIHNpZ25hdHVyZSwKKyAgICAgICAgICAgICAgICBleGNlcHRpb25zLCBjb21wdXRlTWF4cywgY29tcHV0ZUZyYW1lcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZpbmFsIHZvaWQgdmlzaXRFbmQoKSB7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gT3RoZXIgcHVibGljIG1ldGhvZHMKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGJ5dGVjb2RlIG9mIHRoZSBjbGFzcyB0aGF0IHdhcyBidWlsZCB3aXRoIHRoaXMgY2xhc3Mgd3JpdGVyLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgYnl0ZWNvZGUgb2YgdGhlIGNsYXNzIHRoYXQgd2FzIGJ1aWxkIHdpdGggdGhpcyBjbGFzcyB3cml0ZXIuCisgICAgICovCisgICAgcHVibGljIGJ5dGVbXSB0b0J5dGVBcnJheSgpIHsKKyAgICAgICAgaWYgKGluZGV4ID4gMHhGRkZGKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2xhc3MgZmlsZSB0b28gbGFyZ2UhIik7CisgICAgICAgIH0KKyAgICAgICAgLy8gY29tcHV0ZXMgdGhlIHJlYWwgc2l6ZSBvZiB0aGUgYnl0ZWNvZGUgb2YgdGhpcyBjbGFzcworICAgICAgICBpbnQgc2l6ZSA9IDI0ICsgMiAqIGludGVyZmFjZUNvdW50OworICAgICAgICBpbnQgbmJGaWVsZHMgPSAwOworICAgICAgICBGaWVsZFdyaXRlciBmYiA9IGZpcnN0RmllbGQ7CisgICAgICAgIHdoaWxlIChmYiAhPSBudWxsKSB7CisgICAgICAgICAgICArK25iRmllbGRzOworICAgICAgICAgICAgc2l6ZSArPSBmYi5nZXRTaXplKCk7CisgICAgICAgICAgICBmYiA9IChGaWVsZFdyaXRlcikgZmIuZnY7CisgICAgICAgIH0KKyAgICAgICAgaW50IG5iTWV0aG9kcyA9IDA7CisgICAgICAgIE1ldGhvZFdyaXRlciBtYiA9IGZpcnN0TWV0aG9kOworICAgICAgICB3aGlsZSAobWIgIT0gbnVsbCkgeworICAgICAgICAgICAgKytuYk1ldGhvZHM7CisgICAgICAgICAgICBzaXplICs9IG1iLmdldFNpemUoKTsKKyAgICAgICAgICAgIG1iID0gKE1ldGhvZFdyaXRlcikgbWIubXY7CisgICAgICAgIH0KKyAgICAgICAgaW50IGF0dHJpYnV0ZUNvdW50ID0gMDsKKyAgICAgICAgaWYgKGJvb3RzdHJhcE1ldGhvZHMgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gd2UgcHV0IGl0IGFzIGZpcnN0IGF0dHJpYnV0ZSBpbiBvcmRlciB0byBpbXByb3ZlIGEgYml0CisgICAgICAgICAgICAvLyBDbGFzc1JlYWRlci5jb3B5Qm9vdHN0cmFwTWV0aG9kcworICAgICAgICAgICAgKythdHRyaWJ1dGVDb3VudDsKKyAgICAgICAgICAgIHNpemUgKz0gOCArIGJvb3RzdHJhcE1ldGhvZHMubGVuZ3RoOworICAgICAgICAgICAgbmV3VVRGOCgiQm9vdHN0cmFwTWV0aG9kcyIpOworICAgICAgICB9CisgICAgICAgIGlmIChDbGFzc1JlYWRlci5TSUdOQVRVUkVTICYmIHNpZ25hdHVyZSAhPSAwKSB7CisgICAgICAgICAgICArK2F0dHJpYnV0ZUNvdW50OworICAgICAgICAgICAgc2l6ZSArPSA4OworICAgICAgICAgICAgbmV3VVRGOCgiU2lnbmF0dXJlIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNvdXJjZUZpbGUgIT0gMCkgeworICAgICAgICAgICAgKythdHRyaWJ1dGVDb3VudDsKKyAgICAgICAgICAgIHNpemUgKz0gODsKKyAgICAgICAgICAgIG5ld1VURjgoIlNvdXJjZUZpbGUiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc291cmNlRGVidWcgIT0gbnVsbCkgeworICAgICAgICAgICAgKythdHRyaWJ1dGVDb3VudDsKKyAgICAgICAgICAgIHNpemUgKz0gc291cmNlRGVidWcubGVuZ3RoICsgNjsKKyAgICAgICAgICAgIG5ld1VURjgoIlNvdXJjZURlYnVnRXh0ZW5zaW9uIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVuY2xvc2luZ01ldGhvZE93bmVyICE9IDApIHsKKyAgICAgICAgICAgICsrYXR0cmlidXRlQ291bnQ7CisgICAgICAgICAgICBzaXplICs9IDEwOworICAgICAgICAgICAgbmV3VVRGOCgiRW5jbG9zaW5nTWV0aG9kIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChhY2Nlc3MgJiBPcGNvZGVzLkFDQ19ERVBSRUNBVEVEKSAhPSAwKSB7CisgICAgICAgICAgICArK2F0dHJpYnV0ZUNvdW50OworICAgICAgICAgICAgc2l6ZSArPSA2OworICAgICAgICAgICAgbmV3VVRGOCgiRGVwcmVjYXRlZCIpOworICAgICAgICB9CisgICAgICAgIGlmICgoYWNjZXNzICYgT3Bjb2Rlcy5BQ0NfU1lOVEhFVElDKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoKHZlcnNpb24gJiAweEZGRkYpIDwgT3Bjb2Rlcy5WMV81CisgICAgICAgICAgICAgICAgfHwgKGFjY2VzcyAmIEFDQ19TWU5USEVUSUNfQVRUUklCVVRFKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgKythdHRyaWJ1dGVDb3VudDsKKyAgICAgICAgICAgICAgICBzaXplICs9IDY7CisgICAgICAgICAgICAgICAgbmV3VVRGOCgiU3ludGhldGljIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlubmVyQ2xhc3NlcyAhPSBudWxsKSB7CisgICAgICAgICAgICArK2F0dHJpYnV0ZUNvdW50OworICAgICAgICAgICAgc2l6ZSArPSA4ICsgaW5uZXJDbGFzc2VzLmxlbmd0aDsKKyAgICAgICAgICAgIG5ld1VURjgoIklubmVyQ2xhc3NlcyIpOworICAgICAgICB9CisgICAgICAgIGlmIChDbGFzc1JlYWRlci5BTk5PVEFUSU9OUyAmJiBhbm5zICE9IG51bGwpIHsKKyAgICAgICAgICAgICsrYXR0cmlidXRlQ291bnQ7CisgICAgICAgICAgICBzaXplICs9IDggKyBhbm5zLmdldFNpemUoKTsKKyAgICAgICAgICAgIG5ld1VURjgoIlJ1bnRpbWVWaXNpYmxlQW5ub3RhdGlvbnMiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQ2xhc3NSZWFkZXIuQU5OT1RBVElPTlMgJiYgaWFubnMgIT0gbnVsbCkgeworICAgICAgICAgICAgKythdHRyaWJ1dGVDb3VudDsKKyAgICAgICAgICAgIHNpemUgKz0gOCArIGlhbm5zLmdldFNpemUoKTsKKyAgICAgICAgICAgIG5ld1VURjgoIlJ1bnRpbWVJbnZpc2libGVBbm5vdGF0aW9ucyIpOworICAgICAgICB9CisgICAgICAgIGlmIChDbGFzc1JlYWRlci5BTk5PVEFUSU9OUyAmJiB0YW5ucyAhPSBudWxsKSB7CisgICAgICAgICAgICArK2F0dHJpYnV0ZUNvdW50OworICAgICAgICAgICAgc2l6ZSArPSA4ICsgdGFubnMuZ2V0U2l6ZSgpOworICAgICAgICAgICAgbmV3VVRGOCgiUnVudGltZVZpc2libGVUeXBlQW5ub3RhdGlvbnMiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQ2xhc3NSZWFkZXIuQU5OT1RBVElPTlMgJiYgaXRhbm5zICE9IG51bGwpIHsKKyAgICAgICAgICAgICsrYXR0cmlidXRlQ291bnQ7CisgICAgICAgICAgICBzaXplICs9IDggKyBpdGFubnMuZ2V0U2l6ZSgpOworICAgICAgICAgICAgbmV3VVRGOCgiUnVudGltZUludmlzaWJsZVR5cGVBbm5vdGF0aW9ucyIpOworICAgICAgICB9CisgICAgICAgIGlmIChhdHRycyAhPSBudWxsKSB7CisgICAgICAgICAgICBhdHRyaWJ1dGVDb3VudCArPSBhdHRycy5nZXRDb3VudCgpOworICAgICAgICAgICAgc2l6ZSArPSBhdHRycy5nZXRTaXplKHRoaXMsIG51bGwsIDAsIC0xLCAtMSk7CisgICAgICAgIH0KKyAgICAgICAgc2l6ZSArPSBwb29sLmxlbmd0aDsKKyAgICAgICAgLy8gYWxsb2NhdGVzIGEgYnl0ZSB2ZWN0b3Igb2YgdGhpcyBzaXplLCBpbiBvcmRlciB0byBhdm9pZCB1bm5lY2Vzc2FyeQorICAgICAgICAvLyBhcnJheWNvcHkgb3BlcmF0aW9ucyBpbiB0aGUgQnl0ZVZlY3Rvci5lbmxhcmdlKCkgbWV0aG9kCisgICAgICAgIEJ5dGVWZWN0b3Igb3V0ID0gbmV3IEJ5dGVWZWN0b3Ioc2l6ZSk7CisgICAgICAgIG91dC5wdXRJbnQoMHhDQUZFQkFCRSkucHV0SW50KHZlcnNpb24pOworICAgICAgICBvdXQucHV0U2hvcnQoaW5kZXgpLnB1dEJ5dGVBcnJheShwb29sLmRhdGEsIDAsIHBvb2wubGVuZ3RoKTsKKyAgICAgICAgaW50IG1hc2sgPSBPcGNvZGVzLkFDQ19ERVBSRUNBVEVEIHwgQUNDX1NZTlRIRVRJQ19BVFRSSUJVVEUKKyAgICAgICAgICAgICAgICAgICB8ICgoYWNjZXNzICYgQUNDX1NZTlRIRVRJQ19BVFRSSUJVVEUpIC8gVE9fQUNDX1NZTlRIRVRJQyk7CisgICAgICAgIG91dC5wdXRTaG9ydChhY2Nlc3MgJiB+bWFzaykucHV0U2hvcnQobmFtZSkucHV0U2hvcnQoc3VwZXJOYW1lKTsKKyAgICAgICAgb3V0LnB1dFNob3J0KGludGVyZmFjZUNvdW50KTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnRlcmZhY2VDb3VudDsgKytpKSB7CisgICAgICAgICAgICBvdXQucHV0U2hvcnQoaW50ZXJmYWNlc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgb3V0LnB1dFNob3J0KG5iRmllbGRzKTsKKyAgICAgICAgZmIgPSBmaXJzdEZpZWxkOworICAgICAgICB3aGlsZSAoZmIgIT0gbnVsbCkgeworICAgICAgICAgICAgZmIucHV0KG91dCk7CisgICAgICAgICAgICBmYiA9IChGaWVsZFdyaXRlcikgZmIuZnY7CisgICAgICAgIH0KKyAgICAgICAgb3V0LnB1dFNob3J0KG5iTWV0aG9kcyk7CisgICAgICAgIG1iID0gZmlyc3RNZXRob2Q7CisgICAgICAgIHdoaWxlIChtYiAhPSBudWxsKSB7CisgICAgICAgICAgICBtYi5wdXQob3V0KTsKKyAgICAgICAgICAgIG1iID0gKE1ldGhvZFdyaXRlcikgbWIubXY7CisgICAgICAgIH0KKyAgICAgICAgb3V0LnB1dFNob3J0KGF0dHJpYnV0ZUNvdW50KTsKKyAgICAgICAgaWYgKGJvb3RzdHJhcE1ldGhvZHMgIT0gbnVsbCkgeworICAgICAgICAgICAgb3V0LnB1dFNob3J0KG5ld1VURjgoIkJvb3RzdHJhcE1ldGhvZHMiKSk7CisgICAgICAgICAgICBvdXQucHV0SW50KGJvb3RzdHJhcE1ldGhvZHMubGVuZ3RoICsgMikucHV0U2hvcnQoCisgICAgICAgICAgICAgICAgICAgIGJvb3RzdHJhcE1ldGhvZHNDb3VudCk7CisgICAgICAgICAgICBvdXQucHV0Qnl0ZUFycmF5KGJvb3RzdHJhcE1ldGhvZHMuZGF0YSwgMCwgYm9vdHN0cmFwTWV0aG9kcy5sZW5ndGgpOworICAgICAgICB9CisgICAgICAgIGlmIChDbGFzc1JlYWRlci5TSUdOQVRVUkVTICYmIHNpZ25hdHVyZSAhPSAwKSB7CisgICAgICAgICAgICBvdXQucHV0U2hvcnQobmV3VVRGOCgiU2lnbmF0dXJlIikpLnB1dEludCgyKS5wdXRTaG9ydChzaWduYXR1cmUpOworICAgICAgICB9CisgICAgICAgIGlmIChzb3VyY2VGaWxlICE9IDApIHsKKyAgICAgICAgICAgIG91dC5wdXRTaG9ydChuZXdVVEY4KCJTb3VyY2VGaWxlIikpLnB1dEludCgyKS5wdXRTaG9ydChzb3VyY2VGaWxlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc291cmNlRGVidWcgIT0gbnVsbCkgeworICAgICAgICAgICAgaW50IGxlbiA9IHNvdXJjZURlYnVnLmxlbmd0aDsKKyAgICAgICAgICAgIG91dC5wdXRTaG9ydChuZXdVVEY4KCJTb3VyY2VEZWJ1Z0V4dGVuc2lvbiIpKS5wdXRJbnQobGVuKTsKKyAgICAgICAgICAgIG91dC5wdXRCeXRlQXJyYXkoc291cmNlRGVidWcuZGF0YSwgMCwgbGVuKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZW5jbG9zaW5nTWV0aG9kT3duZXIgIT0gMCkgeworICAgICAgICAgICAgb3V0LnB1dFNob3J0KG5ld1VURjgoIkVuY2xvc2luZ01ldGhvZCIpKS5wdXRJbnQoNCk7CisgICAgICAgICAgICBvdXQucHV0U2hvcnQoZW5jbG9zaW5nTWV0aG9kT3duZXIpLnB1dFNob3J0KGVuY2xvc2luZ01ldGhvZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChhY2Nlc3MgJiBPcGNvZGVzLkFDQ19ERVBSRUNBVEVEKSAhPSAwKSB7CisgICAgICAgICAgICBvdXQucHV0U2hvcnQobmV3VVRGOCgiRGVwcmVjYXRlZCIpKS5wdXRJbnQoMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChhY2Nlc3MgJiBPcGNvZGVzLkFDQ19TWU5USEVUSUMpICE9IDApIHsKKyAgICAgICAgICAgIGlmICgodmVyc2lvbiAmIDB4RkZGRikgPCBPcGNvZGVzLlYxXzUKKyAgICAgICAgICAgICAgICB8fCAoYWNjZXNzICYgQUNDX1NZTlRIRVRJQ19BVFRSSUJVVEUpICE9IDApIHsKKyAgICAgICAgICAgICAgICBvdXQucHV0U2hvcnQobmV3VVRGOCgiU3ludGhldGljIikpLnB1dEludCgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaW5uZXJDbGFzc2VzICE9IG51bGwpIHsKKyAgICAgICAgICAgIG91dC5wdXRTaG9ydChuZXdVVEY4KCJJbm5lckNsYXNzZXMiKSk7CisgICAgICAgICAgICBvdXQucHV0SW50KGlubmVyQ2xhc3Nlcy5sZW5ndGggKyAyKS5wdXRTaG9ydChpbm5lckNsYXNzZXNDb3VudCk7CisgICAgICAgICAgICBvdXQucHV0Qnl0ZUFycmF5KGlubmVyQ2xhc3Nlcy5kYXRhLCAwLCBpbm5lckNsYXNzZXMubGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQ2xhc3NSZWFkZXIuQU5OT1RBVElPTlMgJiYgYW5ucyAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXQucHV0U2hvcnQobmV3VVRGOCgiUnVudGltZVZpc2libGVBbm5vdGF0aW9ucyIpKTsKKyAgICAgICAgICAgIGFubnMucHV0KG91dCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKENsYXNzUmVhZGVyLkFOTk9UQVRJT05TICYmIGlhbm5zICE9IG51bGwpIHsKKyAgICAgICAgICAgIG91dC5wdXRTaG9ydChuZXdVVEY4KCJSdW50aW1lSW52aXNpYmxlQW5ub3RhdGlvbnMiKSk7CisgICAgICAgICAgICBpYW5ucy5wdXQob3V0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQ2xhc3NSZWFkZXIuQU5OT1RBVElPTlMgJiYgdGFubnMgIT0gbnVsbCkgeworICAgICAgICAgICAgb3V0LnB1dFNob3J0KG5ld1VURjgoIlJ1bnRpbWVWaXNpYmxlVHlwZUFubm90YXRpb25zIikpOworICAgICAgICAgICAgdGFubnMucHV0KG91dCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKENsYXNzUmVhZGVyLkFOTk9UQVRJT05TICYmIGl0YW5ucyAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXQucHV0U2hvcnQobmV3VVRGOCgiUnVudGltZUludmlzaWJsZVR5cGVBbm5vdGF0aW9ucyIpKTsKKyAgICAgICAgICAgIGl0YW5ucy5wdXQob3V0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXR0cnMgIT0gbnVsbCkgeworICAgICAgICAgICAgYXR0cnMucHV0KHRoaXMsIG51bGwsIDAsIC0xLCAtMSwgb3V0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW52YWxpZEZyYW1lcykgeworICAgICAgICAgICAgYW5ucyA9IG51bGw7CisgICAgICAgICAgICBpYW5ucyA9IG51bGw7CisgICAgICAgICAgICBhdHRycyA9IG51bGw7CisgICAgICAgICAgICBpbm5lckNsYXNzZXNDb3VudCA9IDA7CisgICAgICAgICAgICBpbm5lckNsYXNzZXMgPSBudWxsOworICAgICAgICAgICAgYm9vdHN0cmFwTWV0aG9kc0NvdW50ID0gMDsKKyAgICAgICAgICAgIGJvb3RzdHJhcE1ldGhvZHMgPSBudWxsOworICAgICAgICAgICAgZmlyc3RGaWVsZCA9IG51bGw7CisgICAgICAgICAgICBsYXN0RmllbGQgPSBudWxsOworICAgICAgICAgICAgZmlyc3RNZXRob2QgPSBudWxsOworICAgICAgICAgICAgbGFzdE1ldGhvZCA9IG51bGw7CisgICAgICAgICAgICBjb21wdXRlTWF4cyA9IGZhbHNlOworICAgICAgICAgICAgY29tcHV0ZUZyYW1lcyA9IHRydWU7CisgICAgICAgICAgICBpbnZhbGlkRnJhbWVzID0gZmFsc2U7CisgICAgICAgICAgICBuZXcgQ2xhc3NSZWFkZXIob3V0LmRhdGEpLmFjY2VwdCh0aGlzLCBDbGFzc1JlYWRlci5TS0lQX0ZSQU1FUyk7CisgICAgICAgICAgICByZXR1cm4gdG9CeXRlQXJyYXkoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb3V0LmRhdGE7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gVXRpbGl0eSBtZXRob2RzOiBjb25zdGFudCBwb29sIG1hbmFnZW1lbnQKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBudW1iZXIgb3Igc3RyaW5nIGNvbnN0YW50IHRvIHRoZSBjb25zdGFudCBwb29sIG9mIHRoZSBjbGFzcyBiZWluZworICAgICAqIGJ1aWxkLiBEb2VzIG5vdGhpbmcgaWYgdGhlIGNvbnN0YW50IHBvb2wgYWxyZWFkeSBjb250YWlucyBhIHNpbWlsYXIgaXRlbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjc3QKKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSBvZiB0aGUgY29uc3RhbnQgdG8gYmUgYWRkZWQgdG8gdGhlIGNvbnN0YW50IHBvb2wuCisgICAgICogICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBtdXN0IGJlIGFuIHtAbGluayBJbnRlZ2VyfSwgYSB7QGxpbmsgRmxvYXR9LCBhCisgICAgICogICAgICAgICAgICB7QGxpbmsgTG9uZ30sIGEge0BsaW5rIERvdWJsZX0sIGEge0BsaW5rIFN0cmluZ30gb3IgYQorICAgICAqICAgICAgICAgICAge0BsaW5rIFR5cGV9LgorICAgICAqIEByZXR1cm4gYSBuZXcgb3IgYWxyZWFkeSBleGlzdGluZyBjb25zdGFudCBpdGVtIHdpdGggdGhlIGdpdmVuIHZhbHVlLgorICAgICAqLworICAgIEl0ZW0gbmV3Q29uc3RJdGVtKGZpbmFsIE9iamVjdCBjc3QpIHsKKyAgICAgICAgaWYgKGNzdCBpbnN0YW5jZW9mIEludGVnZXIpIHsKKyAgICAgICAgICAgIGludCB2YWwgPSAoKEludGVnZXIpIGNzdCkuaW50VmFsdWUoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXdJbnRlZ2VyKHZhbCk7CisgICAgICAgIH0gZWxzZSBpZiAoY3N0IGluc3RhbmNlb2YgQnl0ZSkgeworICAgICAgICAgICAgaW50IHZhbCA9ICgoQnl0ZSkgY3N0KS5pbnRWYWx1ZSgpOworICAgICAgICAgICAgcmV0dXJuIG5ld0ludGVnZXIodmFsKTsKKyAgICAgICAgfSBlbHNlIGlmIChjc3QgaW5zdGFuY2VvZiBDaGFyYWN0ZXIpIHsKKyAgICAgICAgICAgIGludCB2YWwgPSAoKENoYXJhY3RlcikgY3N0KS5jaGFyVmFsdWUoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXdJbnRlZ2VyKHZhbCk7CisgICAgICAgIH0gZWxzZSBpZiAoY3N0IGluc3RhbmNlb2YgU2hvcnQpIHsKKyAgICAgICAgICAgIGludCB2YWwgPSAoKFNob3J0KSBjc3QpLmludFZhbHVlKCk7CisgICAgICAgICAgICByZXR1cm4gbmV3SW50ZWdlcih2YWwpOworICAgICAgICB9IGVsc2UgaWYgKGNzdCBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKKyAgICAgICAgICAgIGludCB2YWwgPSAoKEJvb2xlYW4pIGNzdCkuYm9vbGVhblZhbHVlKCkgPyAxIDogMDsKKyAgICAgICAgICAgIHJldHVybiBuZXdJbnRlZ2VyKHZhbCk7CisgICAgICAgIH0gZWxzZSBpZiAoY3N0IGluc3RhbmNlb2YgRmxvYXQpIHsKKyAgICAgICAgICAgIGZsb2F0IHZhbCA9ICgoRmxvYXQpIGNzdCkuZmxvYXRWYWx1ZSgpOworICAgICAgICAgICAgcmV0dXJuIG5ld0Zsb2F0KHZhbCk7CisgICAgICAgIH0gZWxzZSBpZiAoY3N0IGluc3RhbmNlb2YgTG9uZykgeworICAgICAgICAgICAgbG9uZyB2YWwgPSAoKExvbmcpIGNzdCkubG9uZ1ZhbHVlKCk7CisgICAgICAgICAgICByZXR1cm4gbmV3TG9uZyh2YWwpOworICAgICAgICB9IGVsc2UgaWYgKGNzdCBpbnN0YW5jZW9mIERvdWJsZSkgeworICAgICAgICAgICAgZG91YmxlIHZhbCA9ICgoRG91YmxlKSBjc3QpLmRvdWJsZVZhbHVlKCk7CisgICAgICAgICAgICByZXR1cm4gbmV3RG91YmxlKHZhbCk7CisgICAgICAgIH0gZWxzZSBpZiAoY3N0IGluc3RhbmNlb2YgU3RyaW5nKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3U3RyaW5nKChTdHJpbmcpIGNzdCk7CisgICAgICAgIH0gZWxzZSBpZiAoY3N0IGluc3RhbmNlb2YgVHlwZSkgeworICAgICAgICAgICAgVHlwZSB0ID0gKFR5cGUpIGNzdDsKKyAgICAgICAgICAgIGludCBzID0gdC5nZXRTb3J0KCk7CisgICAgICAgICAgICBpZiAocyA9PSBUeXBlLk9CSkVDVCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXdDbGFzc0l0ZW0odC5nZXRJbnRlcm5hbE5hbWUoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHMgPT0gVHlwZS5NRVRIT0QpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3TWV0aG9kVHlwZUl0ZW0odC5nZXREZXNjcmlwdG9yKCkpOworICAgICAgICAgICAgfSBlbHNlIHsgLy8gcyA9PSBwcmltaXRpdmUgdHlwZSBvciBhcnJheQorICAgICAgICAgICAgICAgIHJldHVybiBuZXdDbGFzc0l0ZW0odC5nZXREZXNjcmlwdG9yKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGNzdCBpbnN0YW5jZW9mIEhhbmRsZSkgeworICAgICAgICAgICAgSGFuZGxlIGggPSAoSGFuZGxlKSBjc3Q7CisgICAgICAgICAgICByZXR1cm4gbmV3SGFuZGxlSXRlbShoLnRhZywgaC5vd25lciwgaC5uYW1lLCBoLmRlc2MpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidmFsdWUgIiArIGNzdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgbnVtYmVyIG9yIHN0cmluZyBjb25zdGFudCB0byB0aGUgY29uc3RhbnQgcG9vbCBvZiB0aGUgY2xhc3MgYmVpbmcKKyAgICAgKiBidWlsZC4gRG9lcyBub3RoaW5nIGlmIHRoZSBjb25zdGFudCBwb29sIGFscmVhZHkgY29udGFpbnMgYSBzaW1pbGFyIGl0ZW0uCisgICAgICogPGk+VGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIHtAbGluayBBdHRyaWJ1dGV9IHN1YiBjbGFzc2VzLCBhbmQgaXMKKyAgICAgKiBub3JtYWxseSBub3QgbmVlZGVkIGJ5IGNsYXNzIGdlbmVyYXRvcnMgb3IgYWRhcHRlcnMuPC9pPgorICAgICAqCisgICAgICogQHBhcmFtIGNzdAorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIG9mIHRoZSBjb25zdGFudCB0byBiZSBhZGRlZCB0byB0aGUgY29uc3RhbnQgcG9vbC4KKyAgICAgKiAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIG11c3QgYmUgYW4ge0BsaW5rIEludGVnZXJ9LCBhIHtAbGluayBGbG9hdH0sIGEKKyAgICAgKiAgICAgICAgICAgIHtAbGluayBMb25nfSwgYSB7QGxpbmsgRG91YmxlfSBvciBhIHtAbGluayBTdHJpbmd9LgorICAgICAqIEByZXR1cm4gdGhlIGluZGV4IG9mIGEgbmV3IG9yIGFscmVhZHkgZXhpc3RpbmcgY29uc3RhbnQgaXRlbSB3aXRoIHRoZQorICAgICAqICAgICAgICAgZ2l2ZW4gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIGludCBuZXdDb25zdChmaW5hbCBPYmplY3QgY3N0KSB7CisgICAgICAgIHJldHVybiBuZXdDb25zdEl0ZW0oY3N0KS5pbmRleDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGFuIFVURjggc3RyaW5nIHRvIHRoZSBjb25zdGFudCBwb29sIG9mIHRoZSBjbGFzcyBiZWluZyBidWlsZC4gRG9lcworICAgICAqIG5vdGhpbmcgaWYgdGhlIGNvbnN0YW50IHBvb2wgYWxyZWFkeSBjb250YWlucyBhIHNpbWlsYXIgaXRlbS4gPGk+VGhpcworICAgICAqIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3Ige0BsaW5rIEF0dHJpYnV0ZX0gc3ViIGNsYXNzZXMsIGFuZCBpcyBub3JtYWxseSBub3QKKyAgICAgKiBuZWVkZWQgYnkgY2xhc3MgZ2VuZXJhdG9ycyBvciBhZGFwdGVycy48L2k+CisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBTdHJpbmcgdmFsdWUuCisgICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgYSBuZXcgb3IgYWxyZWFkeSBleGlzdGluZyBVVEY4IGl0ZW0uCisgICAgICovCisgICAgcHVibGljIGludCBuZXdVVEY4KGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBrZXkuc2V0KFVURjgsIHZhbHVlLCBudWxsLCBudWxsKTsKKyAgICAgICAgSXRlbSByZXN1bHQgPSBnZXQoa2V5KTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICBwb29sLnB1dEJ5dGUoVVRGOCkucHV0VVRGOCh2YWx1ZSk7CisgICAgICAgICAgICByZXN1bHQgPSBuZXcgSXRlbShpbmRleCsrLCBrZXkpOworICAgICAgICAgICAgcHV0KHJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5pbmRleDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgY2xhc3MgcmVmZXJlbmNlIHRvIHRoZSBjb25zdGFudCBwb29sIG9mIHRoZSBjbGFzcyBiZWluZyBidWlsZC4KKyAgICAgKiBEb2VzIG5vdGhpbmcgaWYgdGhlIGNvbnN0YW50IHBvb2wgYWxyZWFkeSBjb250YWlucyBhIHNpbWlsYXIgaXRlbS4KKyAgICAgKiA8aT5UaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3Ige0BsaW5rIEF0dHJpYnV0ZX0gc3ViIGNsYXNzZXMsIGFuZCBpcworICAgICAqIG5vcm1hbGx5IG5vdCBuZWVkZWQgYnkgY2xhc3MgZ2VuZXJhdG9ycyBvciBhZGFwdGVycy48L2k+CisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnRlcm5hbCBuYW1lIG9mIHRoZSBjbGFzcy4KKyAgICAgKiBAcmV0dXJuIGEgbmV3IG9yIGFscmVhZHkgZXhpc3RpbmcgY2xhc3MgcmVmZXJlbmNlIGl0ZW0uCisgICAgICovCisgICAgSXRlbSBuZXdDbGFzc0l0ZW0oZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIGtleTIuc2V0KENMQVNTLCB2YWx1ZSwgbnVsbCwgbnVsbCk7CisgICAgICAgIEl0ZW0gcmVzdWx0ID0gZ2V0KGtleTIpOworICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHBvb2wucHV0MTIoQ0xBU1MsIG5ld1VURjgodmFsdWUpKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBJdGVtKGluZGV4KyssIGtleTIpOworICAgICAgICAgICAgcHV0KHJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgY2xhc3MgcmVmZXJlbmNlIHRvIHRoZSBjb25zdGFudCBwb29sIG9mIHRoZSBjbGFzcyBiZWluZyBidWlsZC4KKyAgICAgKiBEb2VzIG5vdGhpbmcgaWYgdGhlIGNvbnN0YW50IHBvb2wgYWxyZWFkeSBjb250YWlucyBhIHNpbWlsYXIgaXRlbS4KKyAgICAgKiA8aT5UaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3Ige0BsaW5rIEF0dHJpYnV0ZX0gc3ViIGNsYXNzZXMsIGFuZCBpcworICAgICAqIG5vcm1hbGx5IG5vdCBuZWVkZWQgYnkgY2xhc3MgZ2VuZXJhdG9ycyBvciBhZGFwdGVycy48L2k+CisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnRlcm5hbCBuYW1lIG9mIHRoZSBjbGFzcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiBhIG5ldyBvciBhbHJlYWR5IGV4aXN0aW5nIGNsYXNzIHJlZmVyZW5jZSBpdGVtLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgbmV3Q2xhc3MoZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBuZXdDbGFzc0l0ZW0odmFsdWUpLmluZGV4OworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBtZXRob2QgdHlwZSByZWZlcmVuY2UgdG8gdGhlIGNvbnN0YW50IHBvb2wgb2YgdGhlIGNsYXNzIGJlaW5nCisgICAgICogYnVpbGQuIERvZXMgbm90aGluZyBpZiB0aGUgY29uc3RhbnQgcG9vbCBhbHJlYWR5IGNvbnRhaW5zIGEgc2ltaWxhciBpdGVtLgorICAgICAqIDxpPlRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciB7QGxpbmsgQXR0cmlidXRlfSBzdWIgY2xhc3NlcywgYW5kIGlzCisgICAgICogbm9ybWFsbHkgbm90IG5lZWRlZCBieSBjbGFzcyBnZW5lcmF0b3JzIG9yIGFkYXB0ZXJzLjwvaT4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXRob2REZXNjCisgICAgICogICAgICAgICAgICBtZXRob2QgZGVzY3JpcHRvciBvZiB0aGUgbWV0aG9kIHR5cGUuCisgICAgICogQHJldHVybiBhIG5ldyBvciBhbHJlYWR5IGV4aXN0aW5nIG1ldGhvZCB0eXBlIHJlZmVyZW5jZSBpdGVtLgorICAgICAqLworICAgIEl0ZW0gbmV3TWV0aG9kVHlwZUl0ZW0oZmluYWwgU3RyaW5nIG1ldGhvZERlc2MpIHsKKyAgICAgICAga2V5Mi5zZXQoTVRZUEUsIG1ldGhvZERlc2MsIG51bGwsIG51bGwpOworICAgICAgICBJdGVtIHJlc3VsdCA9IGdldChrZXkyKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICBwb29sLnB1dDEyKE1UWVBFLCBuZXdVVEY4KG1ldGhvZERlc2MpKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBJdGVtKGluZGV4KyssIGtleTIpOworICAgICAgICAgICAgcHV0KHJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgbWV0aG9kIHR5cGUgcmVmZXJlbmNlIHRvIHRoZSBjb25zdGFudCBwb29sIG9mIHRoZSBjbGFzcyBiZWluZworICAgICAqIGJ1aWxkLiBEb2VzIG5vdGhpbmcgaWYgdGhlIGNvbnN0YW50IHBvb2wgYWxyZWFkeSBjb250YWlucyBhIHNpbWlsYXIgaXRlbS4KKyAgICAgKiA8aT5UaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3Ige0BsaW5rIEF0dHJpYnV0ZX0gc3ViIGNsYXNzZXMsIGFuZCBpcworICAgICAqIG5vcm1hbGx5IG5vdCBuZWVkZWQgYnkgY2xhc3MgZ2VuZXJhdG9ycyBvciBhZGFwdGVycy48L2k+CisgICAgICoKKyAgICAgKiBAcGFyYW0gbWV0aG9kRGVzYworICAgICAqICAgICAgICAgICAgbWV0aG9kIGRlc2NyaXB0b3Igb2YgdGhlIG1ldGhvZCB0eXBlLgorICAgICAqIEByZXR1cm4gdGhlIGluZGV4IG9mIGEgbmV3IG9yIGFscmVhZHkgZXhpc3RpbmcgbWV0aG9kIHR5cGUgcmVmZXJlbmNlCisgICAgICogICAgICAgICBpdGVtLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgbmV3TWV0aG9kVHlwZShmaW5hbCBTdHJpbmcgbWV0aG9kRGVzYykgeworICAgICAgICByZXR1cm4gbmV3TWV0aG9kVHlwZUl0ZW0obWV0aG9kRGVzYykuaW5kZXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIGhhbmRsZSB0byB0aGUgY29uc3RhbnQgcG9vbCBvZiB0aGUgY2xhc3MgYmVpbmcgYnVpbGQuIERvZXMgbm90aGluZworICAgICAqIGlmIHRoZSBjb25zdGFudCBwb29sIGFscmVhZHkgY29udGFpbnMgYSBzaW1pbGFyIGl0ZW0uIDxpPlRoaXMgbWV0aG9kIGlzCisgICAgICogaW50ZW5kZWQgZm9yIHtAbGluayBBdHRyaWJ1dGV9IHN1YiBjbGFzc2VzLCBhbmQgaXMgbm9ybWFsbHkgbm90IG5lZWRlZCBieQorICAgICAqIGNsYXNzIGdlbmVyYXRvcnMgb3IgYWRhcHRlcnMuPC9pPgorICAgICAqCisgICAgICogQHBhcmFtIHRhZworICAgICAqICAgICAgICAgICAgdGhlIGtpbmQgb2YgdGhpcyBoYW5kbGUuIE11c3QgYmUge0BsaW5rIE9wY29kZXMjSF9HRVRGSUVMRH0sCisgICAgICogICAgICAgICAgICB7QGxpbmsgT3Bjb2RlcyNIX0dFVFNUQVRJQ30sIHtAbGluayBPcGNvZGVzI0hfUFVURklFTER9LAorICAgICAqICAgICAgICAgICAge0BsaW5rIE9wY29kZXMjSF9QVVRTVEFUSUN9LCB7QGxpbmsgT3Bjb2RlcyNIX0lOVk9LRVZJUlRVQUx9LAorICAgICAqICAgICAgICAgICAge0BsaW5rIE9wY29kZXMjSF9JTlZPS0VTVEFUSUN9LAorICAgICAqICAgICAgICAgICAge0BsaW5rIE9wY29kZXMjSF9JTlZPS0VTUEVDSUFMfSwKKyAgICAgKiAgICAgICAgICAgIHtAbGluayBPcGNvZGVzI0hfTkVXSU5WT0tFU1BFQ0lBTH0gb3IKKyAgICAgKiAgICAgICAgICAgIHtAbGluayBPcGNvZGVzI0hfSU5WT0tFSU5URVJGQUNFfS4KKyAgICAgKiBAcGFyYW0gb3duZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnRlcm5hbCBuYW1lIG9mIHRoZSBmaWVsZCBvciBtZXRob2Qgb3duZXIgY2xhc3MuCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBvciBtZXRob2QuCisgICAgICogQHBhcmFtIGRlc2MKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXNjcmlwdG9yIG9mIHRoZSBmaWVsZCBvciBtZXRob2QuCisgICAgICogQHJldHVybiBhIG5ldyBvciBhbiBhbHJlYWR5IGV4aXN0aW5nIG1ldGhvZCB0eXBlIHJlZmVyZW5jZSBpdGVtLgorICAgICAqLworICAgIEl0ZW0gbmV3SGFuZGxlSXRlbShmaW5hbCBpbnQgdGFnLCBmaW5hbCBTdHJpbmcgb3duZXIsIGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYykgeworICAgICAgICBrZXk0LnNldChIQU5ETEVfQkFTRSArIHRhZywgb3duZXIsIG5hbWUsIGRlc2MpOworICAgICAgICBJdGVtIHJlc3VsdCA9IGdldChrZXk0KTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAodGFnIDw9IE9wY29kZXMuSF9QVVRTVEFUSUMpIHsKKyAgICAgICAgICAgICAgICBwdXQxMTIoSEFORExFLCB0YWcsIG5ld0ZpZWxkKG93bmVyLCBuYW1lLCBkZXNjKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHB1dDExMihIQU5ETEUsCisgICAgICAgICAgICAgICAgICAgICAgICB0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdNZXRob2Qob3duZXIsIG5hbWUsIGRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZyA9PSBPcGNvZGVzLkhfSU5WT0tFSU5URVJGQUNFKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQgPSBuZXcgSXRlbShpbmRleCsrLCBrZXk0KTsKKyAgICAgICAgICAgIHB1dChyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIGhhbmRsZSB0byB0aGUgY29uc3RhbnQgcG9vbCBvZiB0aGUgY2xhc3MgYmVpbmcgYnVpbGQuIERvZXMgbm90aGluZworICAgICAqIGlmIHRoZSBjb25zdGFudCBwb29sIGFscmVhZHkgY29udGFpbnMgYSBzaW1pbGFyIGl0ZW0uIDxpPlRoaXMgbWV0aG9kIGlzCisgICAgICogaW50ZW5kZWQgZm9yIHtAbGluayBBdHRyaWJ1dGV9IHN1YiBjbGFzc2VzLCBhbmQgaXMgbm9ybWFsbHkgbm90IG5lZWRlZCBieQorICAgICAqIGNsYXNzIGdlbmVyYXRvcnMgb3IgYWRhcHRlcnMuPC9pPgorICAgICAqCisgICAgICogQHBhcmFtIHRhZworICAgICAqICAgICAgICAgICAgdGhlIGtpbmQgb2YgdGhpcyBoYW5kbGUuIE11c3QgYmUge0BsaW5rIE9wY29kZXMjSF9HRVRGSUVMRH0sCisgICAgICogICAgICAgICAgICB7QGxpbmsgT3Bjb2RlcyNIX0dFVFNUQVRJQ30sIHtAbGluayBPcGNvZGVzI0hfUFVURklFTER9LAorICAgICAqICAgICAgICAgICAge0BsaW5rIE9wY29kZXMjSF9QVVRTVEFUSUN9LCB7QGxpbmsgT3Bjb2RlcyNIX0lOVk9LRVZJUlRVQUx9LAorICAgICAqICAgICAgICAgICAge0BsaW5rIE9wY29kZXMjSF9JTlZPS0VTVEFUSUN9LAorICAgICAqICAgICAgICAgICAge0BsaW5rIE9wY29kZXMjSF9JTlZPS0VTUEVDSUFMfSwKKyAgICAgKiAgICAgICAgICAgIHtAbGluayBPcGNvZGVzI0hfTkVXSU5WT0tFU1BFQ0lBTH0gb3IKKyAgICAgKiAgICAgICAgICAgIHtAbGluayBPcGNvZGVzI0hfSU5WT0tFSU5URVJGQUNFfS4KKyAgICAgKiBAcGFyYW0gb3duZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnRlcm5hbCBuYW1lIG9mIHRoZSBmaWVsZCBvciBtZXRob2Qgb3duZXIgY2xhc3MuCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIHRoZSBmaWVsZCBvciBtZXRob2QuCisgICAgICogQHBhcmFtIGRlc2MKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXNjcmlwdG9yIG9mIHRoZSBmaWVsZCBvciBtZXRob2QuCisgICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgYSBuZXcgb3IgYWxyZWFkeSBleGlzdGluZyBtZXRob2QgdHlwZSByZWZlcmVuY2UKKyAgICAgKiAgICAgICAgIGl0ZW0uCisgICAgICovCisgICAgcHVibGljIGludCBuZXdIYW5kbGUoZmluYWwgaW50IHRhZywgZmluYWwgU3RyaW5nIG93bmVyLCBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYykgeworICAgICAgICByZXR1cm4gbmV3SGFuZGxlSXRlbSh0YWcsIG93bmVyLCBuYW1lLCBkZXNjKS5pbmRleDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGFuIGludm9rZWR5bmFtaWMgcmVmZXJlbmNlIHRvIHRoZSBjb25zdGFudCBwb29sIG9mIHRoZSBjbGFzcyBiZWluZworICAgICAqIGJ1aWxkLiBEb2VzIG5vdGhpbmcgaWYgdGhlIGNvbnN0YW50IHBvb2wgYWxyZWFkeSBjb250YWlucyBhIHNpbWlsYXIgaXRlbS4KKyAgICAgKiA8aT5UaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3Ige0BsaW5rIEF0dHJpYnV0ZX0gc3ViIGNsYXNzZXMsIGFuZCBpcworICAgICAqIG5vcm1hbGx5IG5vdCBuZWVkZWQgYnkgY2xhc3MgZ2VuZXJhdG9ycyBvciBhZGFwdGVycy48L2k+CisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgICAgICAgbmFtZSBvZiB0aGUgaW52b2tlZCBtZXRob2QuCisgICAgICogQHBhcmFtIGRlc2MKKyAgICAgKiAgICAgICAgICAgIGRlc2NyaXB0b3Igb2YgdGhlIGludm9rZSBtZXRob2QuCisgICAgICogQHBhcmFtIGJzbQorICAgICAqICAgICAgICAgICAgdGhlIGJvb3RzdHJhcCBtZXRob2QuCisgICAgICogQHBhcmFtIGJzbUFyZ3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBib290c3RyYXAgbWV0aG9kIGNvbnN0YW50IGFyZ3VtZW50cy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBuZXcgb3IgYW4gYWxyZWFkeSBleGlzdGluZyBpbnZva2VkeW5hbWljIHR5cGUgcmVmZXJlbmNlIGl0ZW0uCisgICAgICovCisgICAgSXRlbSBuZXdJbnZva2VEeW5hbWljSXRlbShmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIGRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBIYW5kbGUgYnNtLCBmaW5hbCBPYmplY3QuLi4gYnNtQXJncykgeworICAgICAgICAvLyBjYWNoZSBmb3IgcGVyZm9ybWFuY2UKKyAgICAgICAgQnl0ZVZlY3RvciBib290c3RyYXBNZXRob2RzID0gdGhpcy5ib290c3RyYXBNZXRob2RzOworICAgICAgICBpZiAoYm9vdHN0cmFwTWV0aG9kcyA9PSBudWxsKSB7CisgICAgICAgICAgICBib290c3RyYXBNZXRob2RzID0gdGhpcy5ib290c3RyYXBNZXRob2RzID0gbmV3IEJ5dGVWZWN0b3IoKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBwb3NpdGlvbiA9IGJvb3RzdHJhcE1ldGhvZHMubGVuZ3RoOyAvLyByZWNvcmQgY3VycmVudCBwb3NpdGlvbgorCisgICAgICAgIGludCBoYXNoQ29kZSA9IGJzbS5oYXNoQ29kZSgpOworICAgICAgICBib290c3RyYXBNZXRob2RzLnB1dFNob3J0KG5ld0hhbmRsZShic20udGFnLCBic20ub3duZXIsIGJzbS5uYW1lLAorICAgICAgICAgICAgICAgIGJzbS5kZXNjKSk7CisKKyAgICAgICAgaW50IGFyZ3NMZW5ndGggPSBic21BcmdzLmxlbmd0aDsKKyAgICAgICAgYm9vdHN0cmFwTWV0aG9kcy5wdXRTaG9ydChhcmdzTGVuZ3RoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3NMZW5ndGg7IGkrKykgeworICAgICAgICAgICAgT2JqZWN0IGJzbUFyZyA9IGJzbUFyZ3NbaV07CisgICAgICAgICAgICBoYXNoQ29kZSBePSBic21BcmcuaGFzaENvZGUoKTsKKyAgICAgICAgICAgIGJvb3RzdHJhcE1ldGhvZHMucHV0U2hvcnQobmV3Q29uc3QoYnNtQXJnKSk7CisgICAgICAgIH0KKworICAgICAgICBieXRlW10gZGF0YSA9IGJvb3RzdHJhcE1ldGhvZHMuZGF0YTsKKyAgICAgICAgaW50IGxlbmd0aCA9ICgxICsgMSArIGFyZ3NMZW5ndGgpIDw8IDE7IC8vIChic20gKyBhcmdDb3VudCArIGFyZ3VtZW50cykKKyAgICAgICAgaGFzaENvZGUgJj0gMHg3RkZGRkZGRjsKKyAgICAgICAgSXRlbSByZXN1bHQgPSBpdGVtc1toYXNoQ29kZSAlIGl0ZW1zLmxlbmd0aF07CisgICAgICAgIGxvb3A6IHdoaWxlIChyZXN1bHQgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHJlc3VsdC50eXBlICE9IEJTTSB8fCByZXN1bHQuaGFzaENvZGUgIT0gaGFzaENvZGUpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQubmV4dDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGUgZGF0YSBlbmNvZGUgdGhlIHNpemUgb2YgdGhlIGFyZ3VtZW50CisgICAgICAgICAgICAvLyB3ZSBkb24ndCBuZWVkIHRvIHRlc3QgaWYgdGhlc2Ugc2l6ZSBhcmUgZXF1YWxzCisgICAgICAgICAgICBpbnQgcmVzdWx0UG9zaXRpb24gPSByZXN1bHQuaW50VmFsOworICAgICAgICAgICAgZm9yIChpbnQgcCA9IDA7IHAgPCBsZW5ndGg7IHArKykgeworICAgICAgICAgICAgICAgIGlmIChkYXRhW3Bvc2l0aW9uICsgcF0gIT0gZGF0YVtyZXN1bHRQb3NpdGlvbiArIHBdKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5uZXh0OworICAgICAgICAgICAgICAgICAgICBjb250aW51ZSBsb29wOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaW50IGJvb3RzdHJhcE1ldGhvZEluZGV4OworICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJvb3RzdHJhcE1ldGhvZEluZGV4ID0gcmVzdWx0LmluZGV4OworICAgICAgICAgICAgYm9vdHN0cmFwTWV0aG9kcy5sZW5ndGggPSBwb3NpdGlvbjsgLy8gcmV2ZXJ0IHRvIG9sZCBwb3NpdGlvbgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYm9vdHN0cmFwTWV0aG9kSW5kZXggPSBib290c3RyYXBNZXRob2RzQ291bnQrKzsKKyAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBJdGVtKGJvb3RzdHJhcE1ldGhvZEluZGV4KTsKKyAgICAgICAgICAgIHJlc3VsdC5zZXQocG9zaXRpb24sIGhhc2hDb2RlKTsKKyAgICAgICAgICAgIHB1dChyZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gbm93LCBjcmVhdGUgdGhlIEludm9rZUR5bmFtaWMgY29uc3RhbnQKKyAgICAgICAga2V5My5zZXQobmFtZSwgZGVzYywgYm9vdHN0cmFwTWV0aG9kSW5kZXgpOworICAgICAgICByZXN1bHQgPSBnZXQoa2V5Myk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgcHV0MTIyKElORFksIGJvb3RzdHJhcE1ldGhvZEluZGV4LCBuZXdOYW1lVHlwZShuYW1lLCBkZXNjKSk7CisgICAgICAgICAgICByZXN1bHQgPSBuZXcgSXRlbShpbmRleCsrLCBrZXkzKTsKKyAgICAgICAgICAgIHB1dChyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhbiBpbnZva2VkeW5hbWljIHJlZmVyZW5jZSB0byB0aGUgY29uc3RhbnQgcG9vbCBvZiB0aGUgY2xhc3MgYmVpbmcKKyAgICAgKiBidWlsZC4gRG9lcyBub3RoaW5nIGlmIHRoZSBjb25zdGFudCBwb29sIGFscmVhZHkgY29udGFpbnMgYSBzaW1pbGFyIGl0ZW0uCisgICAgICogPGk+VGhpcyBtZXRob2QgaXMgaW50ZW5kZWQgZm9yIHtAbGluayBBdHRyaWJ1dGV9IHN1YiBjbGFzc2VzLCBhbmQgaXMKKyAgICAgKiBub3JtYWxseSBub3QgbmVlZGVkIGJ5IGNsYXNzIGdlbmVyYXRvcnMgb3IgYWRhcHRlcnMuPC9pPgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIG5hbWUgb2YgdGhlIGludm9rZWQgbWV0aG9kLgorICAgICAqIEBwYXJhbSBkZXNjCisgICAgICogICAgICAgICAgICBkZXNjcmlwdG9yIG9mIHRoZSBpbnZva2UgbWV0aG9kLgorICAgICAqIEBwYXJhbSBic20KKyAgICAgKiAgICAgICAgICAgIHRoZSBib290c3RyYXAgbWV0aG9kLgorICAgICAqIEBwYXJhbSBic21BcmdzCisgICAgICogICAgICAgICAgICB0aGUgYm9vdHN0cmFwIG1ldGhvZCBjb25zdGFudCBhcmd1bWVudHMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiBhIG5ldyBvciBhbHJlYWR5IGV4aXN0aW5nIGludm9rZWR5bmFtaWMgcmVmZXJlbmNlCisgICAgICogICAgICAgICBpdGVtLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgbmV3SW52b2tlRHluYW1pYyhmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIGRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEhhbmRsZSBic20sIGZpbmFsIE9iamVjdC4uLiBic21BcmdzKSB7CisgICAgICAgIHJldHVybiBuZXdJbnZva2VEeW5hbWljSXRlbShuYW1lLCBkZXNjLCBic20sIGJzbUFyZ3MpLmluZGV4OworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBmaWVsZCByZWZlcmVuY2UgdG8gdGhlIGNvbnN0YW50IHBvb2wgb2YgdGhlIGNsYXNzIGJlaW5nIGJ1aWxkLgorICAgICAqIERvZXMgbm90aGluZyBpZiB0aGUgY29uc3RhbnQgcG9vbCBhbHJlYWR5IGNvbnRhaW5zIGEgc2ltaWxhciBpdGVtLgorICAgICAqCisgICAgICogQHBhcmFtIG93bmVyCisgICAgICogICAgICAgICAgICB0aGUgaW50ZXJuYWwgbmFtZSBvZiB0aGUgZmllbGQncyBvd25lciBjbGFzcy4KKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIGZpZWxkJ3MgbmFtZS4KKyAgICAgKiBAcGFyYW0gZGVzYworICAgICAqICAgICAgICAgICAgdGhlIGZpZWxkJ3MgZGVzY3JpcHRvci4KKyAgICAgKiBAcmV0dXJuIGEgbmV3IG9yIGFscmVhZHkgZXhpc3RpbmcgZmllbGQgcmVmZXJlbmNlIGl0ZW0uCisgICAgICovCisgICAgSXRlbSBuZXdGaWVsZEl0ZW0oZmluYWwgU3RyaW5nIG93bmVyLCBmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIGRlc2MpIHsKKyAgICAgICAga2V5My5zZXQoRklFTEQsIG93bmVyLCBuYW1lLCBkZXNjKTsKKyAgICAgICAgSXRlbSByZXN1bHQgPSBnZXQoa2V5Myk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgcHV0MTIyKEZJRUxELCBuZXdDbGFzcyhvd25lciksIG5ld05hbWVUeXBlKG5hbWUsIGRlc2MpKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBJdGVtKGluZGV4KyssIGtleTMpOworICAgICAgICAgICAgcHV0KHJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgZmllbGQgcmVmZXJlbmNlIHRvIHRoZSBjb25zdGFudCBwb29sIG9mIHRoZSBjbGFzcyBiZWluZyBidWlsZC4KKyAgICAgKiBEb2VzIG5vdGhpbmcgaWYgdGhlIGNvbnN0YW50IHBvb2wgYWxyZWFkeSBjb250YWlucyBhIHNpbWlsYXIgaXRlbS4KKyAgICAgKiA8aT5UaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3Ige0BsaW5rIEF0dHJpYnV0ZX0gc3ViIGNsYXNzZXMsIGFuZCBpcworICAgICAqIG5vcm1hbGx5IG5vdCBuZWVkZWQgYnkgY2xhc3MgZ2VuZXJhdG9ycyBvciBhZGFwdGVycy48L2k+CisgICAgICoKKyAgICAgKiBAcGFyYW0gb3duZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnRlcm5hbCBuYW1lIG9mIHRoZSBmaWVsZCdzIG93bmVyIGNsYXNzLgorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgZmllbGQncyBuYW1lLgorICAgICAqIEBwYXJhbSBkZXNjCisgICAgICogICAgICAgICAgICB0aGUgZmllbGQncyBkZXNjcmlwdG9yLgorICAgICAqIEByZXR1cm4gdGhlIGluZGV4IG9mIGEgbmV3IG9yIGFscmVhZHkgZXhpc3RpbmcgZmllbGQgcmVmZXJlbmNlIGl0ZW0uCisgICAgICovCisgICAgcHVibGljIGludCBuZXdGaWVsZChmaW5hbCBTdHJpbmcgb3duZXIsIGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgZGVzYykgeworICAgICAgICByZXR1cm4gbmV3RmllbGRJdGVtKG93bmVyLCBuYW1lLCBkZXNjKS5pbmRleDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgbWV0aG9kIHJlZmVyZW5jZSB0byB0aGUgY29uc3RhbnQgcG9vbCBvZiB0aGUgY2xhc3MgYmVpbmcgYnVpbGQuCisgICAgICogRG9lcyBub3RoaW5nIGlmIHRoZSBjb25zdGFudCBwb29sIGFscmVhZHkgY29udGFpbnMgYSBzaW1pbGFyIGl0ZW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3duZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnRlcm5hbCBuYW1lIG9mIHRoZSBtZXRob2QncyBvd25lciBjbGFzcy4KKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG1ldGhvZCdzIG5hbWUuCisgICAgICogQHBhcmFtIGRlc2MKKyAgICAgKiAgICAgICAgICAgIHRoZSBtZXRob2QncyBkZXNjcmlwdG9yLgorICAgICAqIEBwYXJhbSBpdGYKKyAgICAgKiAgICAgICAgICAgIDx0dD50cnVlPC90dD4gaWYgPHR0Pm93bmVyPC90dD4gaXMgYW4gaW50ZXJmYWNlLgorICAgICAqIEByZXR1cm4gYSBuZXcgb3IgYWxyZWFkeSBleGlzdGluZyBtZXRob2QgcmVmZXJlbmNlIGl0ZW0uCisgICAgICovCisgICAgSXRlbSBuZXdNZXRob2RJdGVtKGZpbmFsIFN0cmluZyBvd25lciwgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjLCBmaW5hbCBib29sZWFuIGl0ZikgeworICAgICAgICBpbnQgdHlwZSA9IGl0ZiA/IElNRVRIIDogTUVUSDsKKyAgICAgICAga2V5My5zZXQodHlwZSwgb3duZXIsIG5hbWUsIGRlc2MpOworICAgICAgICBJdGVtIHJlc3VsdCA9IGdldChrZXkzKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICBwdXQxMjIodHlwZSwgbmV3Q2xhc3Mob3duZXIpLCBuZXdOYW1lVHlwZShuYW1lLCBkZXNjKSk7CisgICAgICAgICAgICByZXN1bHQgPSBuZXcgSXRlbShpbmRleCsrLCBrZXkzKTsKKyAgICAgICAgICAgIHB1dChyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIG1ldGhvZCByZWZlcmVuY2UgdG8gdGhlIGNvbnN0YW50IHBvb2wgb2YgdGhlIGNsYXNzIGJlaW5nIGJ1aWxkLgorICAgICAqIERvZXMgbm90aGluZyBpZiB0aGUgY29uc3RhbnQgcG9vbCBhbHJlYWR5IGNvbnRhaW5zIGEgc2ltaWxhciBpdGVtLgorICAgICAqIDxpPlRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciB7QGxpbmsgQXR0cmlidXRlfSBzdWIgY2xhc3NlcywgYW5kIGlzCisgICAgICogbm9ybWFsbHkgbm90IG5lZWRlZCBieSBjbGFzcyBnZW5lcmF0b3JzIG9yIGFkYXB0ZXJzLjwvaT4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvd25lcgorICAgICAqICAgICAgICAgICAgdGhlIGludGVybmFsIG5hbWUgb2YgdGhlIG1ldGhvZCdzIG93bmVyIGNsYXNzLgorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgbWV0aG9kJ3MgbmFtZS4KKyAgICAgKiBAcGFyYW0gZGVzYworICAgICAqICAgICAgICAgICAgdGhlIG1ldGhvZCdzIGRlc2NyaXB0b3IuCisgICAgICogQHBhcmFtIGl0ZgorICAgICAqICAgICAgICAgICAgPHR0PnRydWU8L3R0PiBpZiA8dHQ+b3duZXI8L3R0PiBpcyBhbiBpbnRlcmZhY2UuCisgICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgYSBuZXcgb3IgYWxyZWFkeSBleGlzdGluZyBtZXRob2QgcmVmZXJlbmNlIGl0ZW0uCisgICAgICovCisgICAgcHVibGljIGludCBuZXdNZXRob2QoZmluYWwgU3RyaW5nIG93bmVyLCBmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGVzYywgZmluYWwgYm9vbGVhbiBpdGYpIHsKKyAgICAgICAgcmV0dXJuIG5ld01ldGhvZEl0ZW0ob3duZXIsIG5hbWUsIGRlc2MsIGl0ZikuaW5kZXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhbiBpbnRlZ2VyIHRvIHRoZSBjb25zdGFudCBwb29sIG9mIHRoZSBjbGFzcyBiZWluZyBidWlsZC4gRG9lcworICAgICAqIG5vdGhpbmcgaWYgdGhlIGNvbnN0YW50IHBvb2wgYWxyZWFkeSBjb250YWlucyBhIHNpbWlsYXIgaXRlbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIGludCB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIGEgbmV3IG9yIGFscmVhZHkgZXhpc3RpbmcgaW50IGl0ZW0uCisgICAgICovCisgICAgSXRlbSBuZXdJbnRlZ2VyKGZpbmFsIGludCB2YWx1ZSkgeworICAgICAgICBrZXkuc2V0KHZhbHVlKTsKKyAgICAgICAgSXRlbSByZXN1bHQgPSBnZXQoa2V5KTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICBwb29sLnB1dEJ5dGUoSU5UKS5wdXRJbnQodmFsdWUpOworICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEl0ZW0oaW5kZXgrKywga2V5KTsKKyAgICAgICAgICAgIHB1dChyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIGZsb2F0IHRvIHRoZSBjb25zdGFudCBwb29sIG9mIHRoZSBjbGFzcyBiZWluZyBidWlsZC4gRG9lcyBub3RoaW5nCisgICAgICogaWYgdGhlIGNvbnN0YW50IHBvb2wgYWxyZWFkeSBjb250YWlucyBhIHNpbWlsYXIgaXRlbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIGZsb2F0IHZhbHVlLgorICAgICAqIEByZXR1cm4gYSBuZXcgb3IgYWxyZWFkeSBleGlzdGluZyBmbG9hdCBpdGVtLgorICAgICAqLworICAgIEl0ZW0gbmV3RmxvYXQoZmluYWwgZmxvYXQgdmFsdWUpIHsKKyAgICAgICAga2V5LnNldCh2YWx1ZSk7CisgICAgICAgIEl0ZW0gcmVzdWx0ID0gZ2V0KGtleSk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgcG9vbC5wdXRCeXRlKEZMT0FUKS5wdXRJbnQoa2V5LmludFZhbCk7CisgICAgICAgICAgICByZXN1bHQgPSBuZXcgSXRlbShpbmRleCsrLCBrZXkpOworICAgICAgICAgICAgcHV0KHJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgbG9uZyB0byB0aGUgY29uc3RhbnQgcG9vbCBvZiB0aGUgY2xhc3MgYmVpbmcgYnVpbGQuIERvZXMgbm90aGluZworICAgICAqIGlmIHRoZSBjb25zdGFudCBwb29sIGFscmVhZHkgY29udGFpbnMgYSBzaW1pbGFyIGl0ZW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBsb25nIHZhbHVlLgorICAgICAqIEByZXR1cm4gYSBuZXcgb3IgYWxyZWFkeSBleGlzdGluZyBsb25nIGl0ZW0uCisgICAgICovCisgICAgSXRlbSBuZXdMb25nKGZpbmFsIGxvbmcgdmFsdWUpIHsKKyAgICAgICAga2V5LnNldCh2YWx1ZSk7CisgICAgICAgIEl0ZW0gcmVzdWx0ID0gZ2V0KGtleSk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgcG9vbC5wdXRCeXRlKExPTkcpLnB1dExvbmcodmFsdWUpOworICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEl0ZW0oaW5kZXgsIGtleSk7CisgICAgICAgICAgICBpbmRleCArPSAyOworICAgICAgICAgICAgcHV0KHJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgZG91YmxlIHRvIHRoZSBjb25zdGFudCBwb29sIG9mIHRoZSBjbGFzcyBiZWluZyBidWlsZC4gRG9lcyBub3RoaW5nCisgICAgICogaWYgdGhlIGNvbnN0YW50IHBvb2wgYWxyZWFkeSBjb250YWlucyBhIHNpbWlsYXIgaXRlbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIGRvdWJsZSB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIGEgbmV3IG9yIGFscmVhZHkgZXhpc3RpbmcgZG91YmxlIGl0ZW0uCisgICAgICovCisgICAgSXRlbSBuZXdEb3VibGUoZmluYWwgZG91YmxlIHZhbHVlKSB7CisgICAgICAgIGtleS5zZXQodmFsdWUpOworICAgICAgICBJdGVtIHJlc3VsdCA9IGdldChrZXkpOworICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHBvb2wucHV0Qnl0ZShET1VCTEUpLnB1dExvbmcoa2V5LmxvbmdWYWwpOworICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEl0ZW0oaW5kZXgsIGtleSk7CisgICAgICAgICAgICBpbmRleCArPSAyOworICAgICAgICAgICAgcHV0KHJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgc3RyaW5nIHRvIHRoZSBjb25zdGFudCBwb29sIG9mIHRoZSBjbGFzcyBiZWluZyBidWlsZC4gRG9lcyBub3RoaW5nCisgICAgICogaWYgdGhlIGNvbnN0YW50IHBvb2wgYWxyZWFkeSBjb250YWlucyBhIHNpbWlsYXIgaXRlbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZQorICAgICAqICAgICAgICAgICAgdGhlIFN0cmluZyB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIGEgbmV3IG9yIGFscmVhZHkgZXhpc3Rpbmcgc3RyaW5nIGl0ZW0uCisgICAgICovCisgICAgcHJpdmF0ZSBJdGVtIG5ld1N0cmluZyhmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAga2V5Mi5zZXQoU1RSLCB2YWx1ZSwgbnVsbCwgbnVsbCk7CisgICAgICAgIEl0ZW0gcmVzdWx0ID0gZ2V0KGtleTIpOworICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHBvb2wucHV0MTIoU1RSLCBuZXdVVEY4KHZhbHVlKSk7CisgICAgICAgICAgICByZXN1bHQgPSBuZXcgSXRlbShpbmRleCsrLCBrZXkyKTsKKyAgICAgICAgICAgIHB1dChyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIG5hbWUgYW5kIHR5cGUgdG8gdGhlIGNvbnN0YW50IHBvb2wgb2YgdGhlIGNsYXNzIGJlaW5nIGJ1aWxkLiBEb2VzCisgICAgICogbm90aGluZyBpZiB0aGUgY29uc3RhbnQgcG9vbCBhbHJlYWR5IGNvbnRhaW5zIGEgc2ltaWxhciBpdGVtLiA8aT5UaGlzCisgICAgICogbWV0aG9kIGlzIGludGVuZGVkIGZvciB7QGxpbmsgQXR0cmlidXRlfSBzdWIgY2xhc3NlcywgYW5kIGlzIG5vcm1hbGx5IG5vdAorICAgICAqIG5lZWRlZCBieSBjbGFzcyBnZW5lcmF0b3JzIG9yIGFkYXB0ZXJzLjwvaT4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICBhIG5hbWUuCisgICAgICogQHBhcmFtIGRlc2MKKyAgICAgKiAgICAgICAgICAgIGEgdHlwZSBkZXNjcmlwdG9yLgorICAgICAqIEByZXR1cm4gdGhlIGluZGV4IG9mIGEgbmV3IG9yIGFscmVhZHkgZXhpc3RpbmcgbmFtZSBhbmQgdHlwZSBpdGVtLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgbmV3TmFtZVR5cGUoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyBkZXNjKSB7CisgICAgICAgIHJldHVybiBuZXdOYW1lVHlwZUl0ZW0obmFtZSwgZGVzYykuaW5kZXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIG5hbWUgYW5kIHR5cGUgdG8gdGhlIGNvbnN0YW50IHBvb2wgb2YgdGhlIGNsYXNzIGJlaW5nIGJ1aWxkLiBEb2VzCisgICAgICogbm90aGluZyBpZiB0aGUgY29uc3RhbnQgcG9vbCBhbHJlYWR5IGNvbnRhaW5zIGEgc2ltaWxhciBpdGVtLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIGEgbmFtZS4KKyAgICAgKiBAcGFyYW0gZGVzYworICAgICAqICAgICAgICAgICAgYSB0eXBlIGRlc2NyaXB0b3IuCisgICAgICogQHJldHVybiBhIG5ldyBvciBhbHJlYWR5IGV4aXN0aW5nIG5hbWUgYW5kIHR5cGUgaXRlbS4KKyAgICAgKi8KKyAgICBJdGVtIG5ld05hbWVUeXBlSXRlbShmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIGRlc2MpIHsKKyAgICAgICAga2V5Mi5zZXQoTkFNRV9UWVBFLCBuYW1lLCBkZXNjLCBudWxsKTsKKyAgICAgICAgSXRlbSByZXN1bHQgPSBnZXQoa2V5Mik7CisgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgcHV0MTIyKE5BTUVfVFlQRSwgbmV3VVRGOChuYW1lKSwgbmV3VVRGOChkZXNjKSk7CisgICAgICAgICAgICByZXN1bHQgPSBuZXcgSXRlbShpbmRleCsrLCBrZXkyKTsKKyAgICAgICAgICAgIHB1dChyZXN1bHQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyB0aGUgZ2l2ZW4gaW50ZXJuYWwgbmFtZSB0byB7QGxpbmsgI3R5cGVUYWJsZX0gYW5kIHJldHVybnMgaXRzIGluZGV4LgorICAgICAqIERvZXMgbm90aGluZyBpZiB0aGUgdHlwZSB0YWJsZSBhbHJlYWR5IGNvbnRhaW5zIHRoaXMgaW50ZXJuYWwgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlCisgICAgICogICAgICAgICAgICB0aGUgaW50ZXJuYWwgbmFtZSB0byBiZSBhZGRlZCB0byB0aGUgdHlwZSB0YWJsZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGlzIGludGVybmFsIG5hbWUgaW4gdGhlIHR5cGUgdGFibGUuCisgICAgICovCisgICAgaW50IGFkZFR5cGUoZmluYWwgU3RyaW5nIHR5cGUpIHsKKyAgICAgICAga2V5LnNldChUWVBFX05PUk1BTCwgdHlwZSwgbnVsbCwgbnVsbCk7CisgICAgICAgIEl0ZW0gcmVzdWx0ID0gZ2V0KGtleSk7CisgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmVzdWx0ID0gYWRkVHlwZShrZXkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQuaW5kZXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyB0aGUgZ2l2ZW4gInVuaW5pdGlhbGl6ZWQiIHR5cGUgdG8ge0BsaW5rICN0eXBlVGFibGV9IGFuZCByZXR1cm5zIGl0cworICAgICAqIGluZGV4LiBUaGlzIG1ldGhvZCBpcyB1c2VkIGZvciBVTklOSVRJQUxJWkVEIHR5cGVzLCBtYWRlIG9mIGFuIGludGVybmFsCisgICAgICogbmFtZSBhbmQgYSBieXRlY29kZSBvZmZzZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZQorICAgICAqICAgICAgICAgICAgdGhlIGludGVybmFsIG5hbWUgdG8gYmUgYWRkZWQgdG8gdGhlIHR5cGUgdGFibGUuCisgICAgICogQHBhcmFtIG9mZnNldAorICAgICAqICAgICAgICAgICAgdGhlIGJ5dGVjb2RlIG9mZnNldCBvZiB0aGUgTkVXIGluc3RydWN0aW9uIHRoYXQgY3JlYXRlZCB0aGlzCisgICAgICogICAgICAgICAgICBVTklOSVRJQUxJWkVEIHR5cGUgdmFsdWUuCisgICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhpcyBpbnRlcm5hbCBuYW1lIGluIHRoZSB0eXBlIHRhYmxlLgorICAgICAqLworICAgIGludCBhZGRVbmluaXRpYWxpemVkVHlwZShmaW5hbCBTdHJpbmcgdHlwZSwgZmluYWwgaW50IG9mZnNldCkgeworICAgICAgICBrZXkudHlwZSA9IFRZUEVfVU5JTklUOworICAgICAgICBrZXkuaW50VmFsID0gb2Zmc2V0OworICAgICAgICBrZXkuc3RyVmFsMSA9IHR5cGU7CisgICAgICAgIGtleS5oYXNoQ29kZSA9IDB4N0ZGRkZGRkYgJiAoVFlQRV9VTklOSVQgKyB0eXBlLmhhc2hDb2RlKCkgKyBvZmZzZXQpOworICAgICAgICBJdGVtIHJlc3VsdCA9IGdldChrZXkpOworICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGFkZFR5cGUoa2V5KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0LmluZGV4OworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgdGhlIGdpdmVuIEl0ZW0gdG8ge0BsaW5rICN0eXBlVGFibGV9LgorICAgICAqCisgICAgICogQHBhcmFtIGl0ZW0KKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSB0byBiZSBhZGRlZCB0byB0aGUgdHlwZSB0YWJsZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBhZGRlZCBJdGVtLCB3aGljaCBhIG5ldyBJdGVtIGluc3RhbmNlIHdpdGggdGhlIHNhbWUgdmFsdWUgYXMKKyAgICAgKiAgICAgICAgIHRoZSBnaXZlbiBJdGVtLgorICAgICAqLworICAgIHByaXZhdGUgSXRlbSBhZGRUeXBlKGZpbmFsIEl0ZW0gaXRlbSkgeworICAgICAgICArK3R5cGVDb3VudDsKKyAgICAgICAgSXRlbSByZXN1bHQgPSBuZXcgSXRlbSh0eXBlQ291bnQsIGtleSk7CisgICAgICAgIHB1dChyZXN1bHQpOworICAgICAgICBpZiAodHlwZVRhYmxlID09IG51bGwpIHsKKyAgICAgICAgICAgIHR5cGVUYWJsZSA9IG5ldyBJdGVtWzE2XTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZUNvdW50ID09IHR5cGVUYWJsZS5sZW5ndGgpIHsKKyAgICAgICAgICAgIEl0ZW1bXSBuZXdUYWJsZSA9IG5ldyBJdGVtWzIgKiB0eXBlVGFibGUubGVuZ3RoXTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkodHlwZVRhYmxlLCAwLCBuZXdUYWJsZSwgMCwgdHlwZVRhYmxlLmxlbmd0aCk7CisgICAgICAgICAgICB0eXBlVGFibGUgPSBuZXdUYWJsZTsKKyAgICAgICAgfQorICAgICAgICB0eXBlVGFibGVbdHlwZUNvdW50XSA9IHJlc3VsdDsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgY29tbW9uIHN1cGVyIHR5cGUgb2YgdGhlIHR3byBnaXZlbiB0eXBlcy4gVGhpcworICAgICAqIG1ldGhvZCBjYWxscyB7QGxpbmsgI2dldENvbW1vblN1cGVyQ2xhc3N9IGFuZCBjYWNoZXMgdGhlIHJlc3VsdCBpbiB0aGUKKyAgICAgKiB7QGxpbmsgI2l0ZW1zfSBoYXNoIHRhYmxlIHRvIHNwZWVkdXAgZnV0dXJlIGNhbGxzIHdpdGggdGhlIHNhbWUKKyAgICAgKiBwYXJhbWV0ZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUxCisgICAgICogICAgICAgICAgICBpbmRleCBvZiBhbiBpbnRlcm5hbCBuYW1lIGluIHtAbGluayAjdHlwZVRhYmxlfS4KKyAgICAgKiBAcGFyYW0gdHlwZTIKKyAgICAgKiAgICAgICAgICAgIGluZGV4IG9mIGFuIGludGVybmFsIG5hbWUgaW4ge0BsaW5rICN0eXBlVGFibGV9LgorICAgICAqIEByZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBjb21tb24gc3VwZXIgdHlwZSBvZiB0aGUgdHdvIGdpdmVuIHR5cGVzLgorICAgICAqLworICAgIGludCBnZXRNZXJnZWRUeXBlKGZpbmFsIGludCB0eXBlMSwgZmluYWwgaW50IHR5cGUyKSB7CisgICAgICAgIGtleTIudHlwZSA9IFRZUEVfTUVSR0VEOworICAgICAgICBrZXkyLmxvbmdWYWwgPSB0eXBlMSB8ICgoKGxvbmcpIHR5cGUyKSA8PCAzMik7CisgICAgICAgIGtleTIuaGFzaENvZGUgPSAweDdGRkZGRkZGICYgKFRZUEVfTUVSR0VEICsgdHlwZTEgKyB0eXBlMik7CisgICAgICAgIEl0ZW0gcmVzdWx0ID0gZ2V0KGtleTIpOworICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyB0ID0gdHlwZVRhYmxlW3R5cGUxXS5zdHJWYWwxOworICAgICAgICAgICAgU3RyaW5nIHUgPSB0eXBlVGFibGVbdHlwZTJdLnN0clZhbDE7CisgICAgICAgICAgICBrZXkyLmludFZhbCA9IGFkZFR5cGUoZ2V0Q29tbW9uU3VwZXJDbGFzcyh0LCB1KSk7CisgICAgICAgICAgICByZXN1bHQgPSBuZXcgSXRlbSgoc2hvcnQpIDAsIGtleTIpOworICAgICAgICAgICAgcHV0KHJlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5pbnRWYWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY29tbW9uIHN1cGVyIHR5cGUgb2YgdGhlIHR3byBnaXZlbiB0eXBlcy4gVGhlIGRlZmF1bHQKKyAgICAgKiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCA8aT5sb2FkczwvaT4gdGhlIHR3byBnaXZlbiBjbGFzc2VzIGFuZCB1c2VzCisgICAgICogdGhlIGphdmEubGFuZy5DbGFzcyBtZXRob2RzIHRvIGZpbmQgdGhlIGNvbW1vbiBzdXBlciBjbGFzcy4gSXQgY2FuIGJlCisgICAgICogb3ZlcnJpZGRlbiB0byBjb21wdXRlIHRoaXMgY29tbW9uIHN1cGVyIHR5cGUgaW4gb3RoZXIgd2F5cywgaW4gcGFydGljdWxhcgorICAgICAqIHdpdGhvdXQgYWN0dWFsbHkgbG9hZGluZyBhbnkgY2xhc3MsIG9yIHRvIHRha2UgaW50byBhY2NvdW50IHRoZSBjbGFzcworICAgICAqIHRoYXQgaXMgY3VycmVudGx5IGJlaW5nIGdlbmVyYXRlZCBieSB0aGlzIENsYXNzV3JpdGVyLCB3aGljaCBjYW4gb2YKKyAgICAgKiBjb3Vyc2Ugbm90IGJlIGxvYWRlZCBzaW5jZSBpdCBpcyB1bmRlciBjb25zdHJ1Y3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZTEKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnRlcm5hbCBuYW1lIG9mIGEgY2xhc3MuCisgICAgICogQHBhcmFtIHR5cGUyCisgICAgICogICAgICAgICAgICB0aGUgaW50ZXJuYWwgbmFtZSBvZiBhbm90aGVyIGNsYXNzLgorICAgICAqIEByZXR1cm4gdGhlIGludGVybmFsIG5hbWUgb2YgdGhlIGNvbW1vbiBzdXBlciBjbGFzcyBvZiB0aGUgdHdvIGdpdmVuCisgICAgICogICAgICAgICBjbGFzc2VzLgorICAgICAqLworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Q29tbW9uU3VwZXJDbGFzcyhmaW5hbCBTdHJpbmcgdHlwZTEsIGZpbmFsIFN0cmluZyB0eXBlMikgeworICAgICAgICBDbGFzczw/PiBjLCBkOworICAgICAgICBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGMgPSBDbGFzcy5mb3JOYW1lKHR5cGUxLnJlcGxhY2UoJy8nLCAnLicpLCBmYWxzZSwgY2xhc3NMb2FkZXIpOworICAgICAgICAgICAgZCA9IENsYXNzLmZvck5hbWUodHlwZTIucmVwbGFjZSgnLycsICcuJyksIGZhbHNlLCBjbGFzc0xvYWRlcik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChjLmlzQXNzaWduYWJsZUZyb20oZCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZC5pc0Fzc2lnbmFibGVGcm9tKGMpKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZTI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGMuaXNJbnRlcmZhY2UoKSB8fCBkLmlzSW50ZXJmYWNlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAiamF2YS9sYW5nL09iamVjdCI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgYyA9IGMuZ2V0U3VwZXJjbGFzcygpOworICAgICAgICAgICAgfSB3aGlsZSAoIWMuaXNBc3NpZ25hYmxlRnJvbShkKSk7CisgICAgICAgICAgICByZXR1cm4gYy5nZXROYW1lKCkucmVwbGFjZSgnLicsICcvJyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjb25zdGFudCBwb29sJ3MgaGFzaCB0YWJsZSBpdGVtIHdoaWNoIGlzIGVxdWFsIHRvIHRoZSBnaXZlbgorICAgICAqIGl0ZW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5CisgICAgICogICAgICAgICAgICBhIGNvbnN0YW50IHBvb2wgaXRlbS4KKyAgICAgKiBAcmV0dXJuIHRoZSBjb25zdGFudCBwb29sJ3MgaGFzaCB0YWJsZSBpdGVtIHdoaWNoIGlzIGVxdWFsIHRvIHRoZSBnaXZlbgorICAgICAqICAgICAgICAgaXRlbSwgb3IgPHR0Pm51bGw8L3R0PiBpZiB0aGVyZSBpcyBubyBzdWNoIGl0ZW0uCisgICAgICovCisgICAgcHJpdmF0ZSBJdGVtIGdldChmaW5hbCBJdGVtIGtleSkgeworICAgICAgICBJdGVtIGkgPSBpdGVtc1trZXkuaGFzaENvZGUgJSBpdGVtcy5sZW5ndGhdOworICAgICAgICB3aGlsZSAoaSAhPSBudWxsICYmIChpLnR5cGUgIT0ga2V5LnR5cGUgfHwgIWtleS5pc0VxdWFsVG8oaSkpKSB7CisgICAgICAgICAgICBpID0gaS5uZXh0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFB1dHMgdGhlIGdpdmVuIGl0ZW0gaW4gdGhlIGNvbnN0YW50IHBvb2wncyBoYXNoIHRhYmxlLiBUaGUgaGFzaCB0YWJsZQorICAgICAqIDxpPm11c3Q8L2k+IG5vdCBhbHJlYWR5IGNvbnRhaW5zIHRoaXMgaXRlbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpCisgICAgICogICAgICAgICAgICB0aGUgaXRlbSB0byBiZSBhZGRlZCB0byB0aGUgY29uc3RhbnQgcG9vbCdzIGhhc2ggdGFibGUuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHB1dChmaW5hbCBJdGVtIGkpIHsKKyAgICAgICAgaWYgKGluZGV4ICsgdHlwZUNvdW50ID4gdGhyZXNob2xkKSB7CisgICAgICAgICAgICBpbnQgbGwgPSBpdGVtcy5sZW5ndGg7CisgICAgICAgICAgICBpbnQgbmwgPSBsbCAqIDIgKyAxOworICAgICAgICAgICAgSXRlbVtdIG5ld0l0ZW1zID0gbmV3IEl0ZW1bbmxdOworICAgICAgICAgICAgZm9yIChpbnQgbCA9IGxsIC0gMTsgbCA+PSAwOyAtLWwpIHsKKyAgICAgICAgICAgICAgICBJdGVtIGogPSBpdGVtc1tsXTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGouaGFzaENvZGUgJSBuZXdJdGVtcy5sZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIEl0ZW0gayA9IGoubmV4dDsKKyAgICAgICAgICAgICAgICAgICAgai5uZXh0ID0gbmV3SXRlbXNbaW5kZXhdOworICAgICAgICAgICAgICAgICAgICBuZXdJdGVtc1tpbmRleF0gPSBqOworICAgICAgICAgICAgICAgICAgICBqID0gazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpdGVtcyA9IG5ld0l0ZW1zOworICAgICAgICAgICAgdGhyZXNob2xkID0gKGludCkgKG5sICogMC43NSk7CisgICAgICAgIH0KKyAgICAgICAgaW50IGluZGV4ID0gaS5oYXNoQ29kZSAlIGl0ZW1zLmxlbmd0aDsKKyAgICAgICAgaS5uZXh0ID0gaXRlbXNbaW5kZXhdOworICAgICAgICBpdGVtc1tpbmRleF0gPSBpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFB1dHMgb25lIGJ5dGUgYW5kIHR3byBzaG9ydHMgaW50byB0aGUgY29uc3RhbnQgcG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiCisgICAgICogICAgICAgICAgICBhIGJ5dGUuCisgICAgICogQHBhcmFtIHMxCisgICAgICogICAgICAgICAgICBhIHNob3J0LgorICAgICAqIEBwYXJhbSBzMgorICAgICAqICAgICAgICAgICAgYW5vdGhlciBzaG9ydC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgcHV0MTIyKGZpbmFsIGludCBiLCBmaW5hbCBpbnQgczEsIGZpbmFsIGludCBzMikgeworICAgICAgICBwb29sLnB1dDEyKGIsIHMxKS5wdXRTaG9ydChzMik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHV0cyB0d28gYnl0ZXMgYW5kIG9uZSBzaG9ydCBpbnRvIHRoZSBjb25zdGFudCBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIGIxCisgICAgICogICAgICAgICAgICBhIGJ5dGUuCisgICAgICogQHBhcmFtIGIyCisgICAgICogICAgICAgICAgICBhbm90aGVyIGJ5dGUuCisgICAgICogQHBhcmFtIHMKKyAgICAgKiAgICAgICAgICAgIGEgc2hvcnQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHB1dDExMihmaW5hbCBpbnQgYjEsIGZpbmFsIGludCBiMiwgZmluYWwgaW50IHMpIHsKKyAgICAgICAgcG9vbC5wdXQxMShiMSwgYjIpLnB1dFNob3J0KHMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvamVyc2V5L3JlcGFja2FnZWQvb3JnL29iamVjdHdlYi9hc20vQ29udGV4dC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9qZXJzZXkvcmVwYWNrYWdlZC9vcmcvb2JqZWN0d2ViL2FzbS9Db250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE2YzA4NQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvamVyc2V5L3JlcGFja2FnZWQvb3JnL29iamVjdHdlYi9hc20vQ29udGV4dC5qYXZhCkBAIC0wLDAgKzEsMTQ1IEBACisvKioqDQorICogQVNNOiBhIHZlcnkgc21hbGwgYW5kIGZhc3QgSmF2YSBieXRlY29kZSBtYW5pcHVsYXRpb24gZnJhbWV3b3JrDQorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMTEgSU5SSUEsIEZyYW5jZSBUZWxlY29tDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisgKg0KKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucw0KKyAqIGFyZSBtZXQ6DQorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlDQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4NCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisgKg0KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIg0KKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUNCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQ0KKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQ0KKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1INCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRg0KKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUw0KKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElODQorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkNCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GDQorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKyAqLw0KKw0KK3BhY2thZ2UgamVyc2V5LnJlcGFja2FnZWQub3JnLm9iamVjdHdlYi5hc207DQorDQorLyoqDQorICogSW5mb3JtYXRpb24gYWJvdXQgYSBjbGFzcyBiZWluZyBwYXJzZWQgaW4gYSB7QGxpbmsgQ2xhc3NSZWFkZXJ9Lg0KKyAqDQorICogQGF1dGhvciBFcmljIEJydW5ldG9uDQorICovDQorY2xhc3MgQ29udGV4dCB7DQorDQorICAgIC8qKg0KKyAgICAgKiBQcm90b3R5cGVzIG9mIHRoZSBhdHRyaWJ1dGVzIHRoYXQgbXVzdCBiZSBwYXJzZWQgZm9yIHRoaXMgY2xhc3MuDQorICAgICAqLw0KKyAgICBBdHRyaWJ1dGVbXSBhdHRyczsNCisNCisgICAgLyoqDQorICAgICAqIFRoZSB7QGxpbmsgQ2xhc3NSZWFkZXJ9IG9wdGlvbiBmbGFncyBmb3IgdGhlIHBhcnNpbmcgb2YgdGhpcyBjbGFzcy4NCisgICAgICovDQorICAgIGludCBmbGFnczsNCisNCisgICAgLyoqDQorICAgICAqIFRoZSBidWZmZXIgdXNlZCB0byByZWFkIHN0cmluZ3MuDQorICAgICAqLw0KKyAgICBjaGFyW10gYnVmZmVyOw0KKw0KKyAgICAvKioNCisgICAgICogVGhlIHN0YXJ0IGluZGV4IG9mIGVhY2ggYm9vdHN0cmFwIG1ldGhvZC4NCisgICAgICovDQorICAgIGludFtdIGJvb3RzdHJhcE1ldGhvZHM7DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGUgYWNjZXNzIGZsYWdzIG9mIHRoZSBtZXRob2QgY3VycmVudGx5IGJlaW5nIHBhcnNlZC4NCisgICAgICovDQorICAgIGludCBhY2Nlc3M7DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIGN1cnJlbnRseSBiZWluZyBwYXJzZWQuDQorICAgICAqLw0KKyAgICBTdHJpbmcgbmFtZTsNCisNCisgICAgLyoqDQorICAgICAqIFRoZSBkZXNjcmlwdG9yIG9mIHRoZSBtZXRob2QgY3VycmVudGx5IGJlaW5nIHBhcnNlZC4NCisgICAgICovDQorICAgIFN0cmluZyBkZXNjOw0KKw0KKyAgICAvKioNCisgICAgICogVGhlIGxhYmVsIG9iamVjdHMsIGluZGV4ZWQgYnkgYnl0ZWNvZGUgb2Zmc2V0LCBvZiB0aGUgbWV0aG9kIGN1cnJlbnRseQ0KKyAgICAgKiBiZWluZyBwYXJzZWQgKG9ubHkgYnl0ZWNvZGUgb2Zmc2V0cyBmb3Igd2hpY2ggYSBsYWJlbCBpcyBuZWVkZWQgaGF2ZSBhDQorICAgICAqIG5vbiBudWxsIGFzc29jaWF0ZWQgTGFiZWwgb2JqZWN0KS4NCisgICAgICovDQorICAgIExhYmVsW10gbGFiZWxzOw0KKw0KKyAgICAvKioNCisgICAgICogVGhlIHRhcmdldCBvZiB0aGUgdHlwZSBhbm5vdGF0aW9uIGN1cnJlbnRseSBiZWluZyBwYXJzZWQuDQorICAgICAqLw0KKyAgICBpbnQgdHlwZVJlZjsNCisNCisgICAgLyoqDQorICAgICAqIFRoZSBwYXRoIG9mIHRoZSB0eXBlIGFubm90YXRpb24gY3VycmVudGx5IGJlaW5nIHBhcnNlZC4NCisgICAgICovDQorICAgIFR5cGVQYXRoIHR5cGVQYXRoOw0KKw0KKyAgICAvKioNCisgICAgICogVGhlIG9mZnNldCBvZiB0aGUgbGF0ZXN0IHN0YWNrIG1hcCBmcmFtZSB0aGF0IGhhcyBiZWVuIHBhcnNlZC4NCisgICAgICovDQorICAgIGludCBvZmZzZXQ7DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGUgbGFiZWxzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsb2NhbCB2YXJpYWJsZSByYW5nZXMgaW4gdGhlDQorICAgICAqIGxvY2FsIHZhcmlhYmxlIHR5cGUgYW5ub3RhdGlvbiBjdXJyZW50bHkgYmVpbmcgcGFyc2VkLg0KKyAgICAgKi8NCisgICAgTGFiZWxbXSBzdGFydDsNCisNCisgICAgLyoqDQorICAgICAqIFRoZSBsYWJlbHMgY29ycmVzcG9uZGluZyB0byB0aGUgZW5kIG9mIHRoZSBsb2NhbCB2YXJpYWJsZSByYW5nZXMgaW4gdGhlDQorICAgICAqIGxvY2FsIHZhcmlhYmxlIHR5cGUgYW5ub3RhdGlvbiBjdXJyZW50bHkgYmVpbmcgcGFyc2VkLg0KKyAgICAgKi8NCisgICAgTGFiZWxbXSBlbmQ7DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGUgbG9jYWwgdmFyaWFibGUgaW5kaWNlcyBmb3IgZWFjaCBsb2NhbCB2YXJpYWJsZSByYW5nZSBpbiB0aGUgbG9jYWwNCisgICAgICogdmFyaWFibGUgdHlwZSBhbm5vdGF0aW9uIGN1cnJlbnRseSBiZWluZyBwYXJzZWQuDQorICAgICAqLw0KKyAgICBpbnRbXSBpbmRleDsNCisNCisgICAgLyoqDQorICAgICAqIFRoZSBlbmNvZGluZyBvZiB0aGUgbGF0ZXN0IHN0YWNrIG1hcCBmcmFtZSB0aGF0IGhhcyBiZWVuIHBhcnNlZC4NCisgICAgICovDQorICAgIGludCBtb2RlOw0KKw0KKyAgICAvKioNCisgICAgICogVGhlIG51bWJlciBvZiBsb2NhbHMgaW4gdGhlIGxhdGVzdCBzdGFjayBtYXAgZnJhbWUgdGhhdCBoYXMgYmVlbiBwYXJzZWQuDQorICAgICAqLw0KKyAgICBpbnQgbG9jYWxDb3VudDsNCisNCisgICAgLyoqDQorICAgICAqIFRoZSBudW1iZXIgbG9jYWxzIGluIHRoZSBsYXRlc3Qgc3RhY2sgbWFwIGZyYW1lIHRoYXQgaGFzIGJlZW4gcGFyc2VkLA0KKyAgICAgKiBtaW51cyB0aGUgbnVtYmVyIG9mIGxvY2FscyBpbiB0aGUgcHJldmlvdXMgZnJhbWUuDQorICAgICAqLw0KKyAgICBpbnQgbG9jYWxEaWZmOw0KKw0KKyAgICAvKioNCisgICAgICogVGhlIGxvY2FsIHZhbHVlcyBvZiB0aGUgbGF0ZXN0IHN0YWNrIG1hcCBmcmFtZSB0aGF0IGhhcyBiZWVuIHBhcnNlZC4NCisgICAgICovDQorICAgIE9iamVjdFtdIGxvY2FsOw0KKw0KKyAgICAvKioNCisgICAgICogVGhlIHN0YWNrIHNpemUgb2YgdGhlIGxhdGVzdCBzdGFjayBtYXAgZnJhbWUgdGhhdCBoYXMgYmVlbiBwYXJzZWQuDQorICAgICAqLw0KKyAgICBpbnQgc3RhY2tDb3VudDsNCisNCisgICAgLyoqDQorICAgICAqIFRoZSBzdGFjayB2YWx1ZXMgb2YgdGhlIGxhdGVzdCBzdGFjayBtYXAgZnJhbWUgdGhhdCBoYXMgYmVlbiBwYXJzZWQuDQorICAgICAqLw0KKyAgICBPYmplY3RbXSBzdGFjazsNCit9DQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9qZXJzZXkvcmVwYWNrYWdlZC9vcmcvb2JqZWN0d2ViL2FzbS9FZGdlLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL2plcnNleS9yZXBhY2thZ2VkL29yZy9vYmplY3R3ZWIvYXNtL0VkZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGRmYTJkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9qZXJzZXkvcmVwYWNrYWdlZC9vcmcvb2JqZWN0d2ViL2FzbS9FZGdlLmphdmEKQEAgLTAsMCArMSw3NSBAQAorLyoqKgorICogQVNNOiBhIHZlcnkgc21hbGwgYW5kIGZhc3QgSmF2YSBieXRlY29kZSBtYW5pcHVsYXRpb24gZnJhbWV3b3JrCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAxMSBJTlJJQSwgRnJhbmNlIFRlbGVjb20KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBqZXJzZXkucmVwYWNrYWdlZC5vcmcub2JqZWN0d2ViLmFzbTsKKworLyoqCisgKiBBbiBlZGdlIGluIHRoZSBjb250cm9sIGZsb3cgZ3JhcGggb2YgYSBtZXRob2QgYm9keS4gU2VlIHtAbGluayBMYWJlbCBMYWJlbH0uCisgKgorICogQGF1dGhvciBFcmljIEJydW5ldG9uCisgKi8KK2NsYXNzIEVkZ2UgeworCisgICAgLyoqCisgICAgICogRGVub3RlcyBhIG5vcm1hbCBjb250cm9sIGZsb3cgZ3JhcGggZWRnZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IE5PUk1BTCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBEZW5vdGVzIGEgY29udHJvbCBmbG93IGdyYXBoIGVkZ2UgY29ycmVzcG9uZGluZyB0byBhbiBleGNlcHRpb24gaGFuZGxlci4KKyAgICAgKiBNb3JlIHByZWNpc2VseSBhbnkge0BsaW5rIEVkZ2V9IHdob3NlIHtAbGluayAjaW5mb30gaXMgc3RyaWN0bHkgcG9zaXRpdmUKKyAgICAgKiBjb3JyZXNwb25kcyB0byBhbiBleGNlcHRpb24gaGFuZGxlci4gVGhlIGFjdHVhbCB2YWx1ZSBvZiB7QGxpbmsgI2luZm99IGlzCisgICAgICogdGhlIGluZGV4LCBpbiB0aGUge0BsaW5rIENsYXNzV3JpdGVyfSB0eXBlIHRhYmxlLCBvZiB0aGUgZXhjZXB0aW9uIHRoYXQKKyAgICAgKiBpcyBjYXRjaGVkLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgRVhDRVBUSU9OID0gMHg3RkZGRkZGRjsKKworICAgIC8qKgorICAgICAqIEluZm9ybWF0aW9uIGFib3V0IHRoaXMgY29udHJvbCBmbG93IGdyYXBoIGVkZ2UuIElmCisgICAgICoge0BsaW5rIENsYXNzV3JpdGVyI0NPTVBVVEVfTUFYU30gaXMgdXNlZCB0aGlzIGZpZWxkIGlzIHRoZSAocmVsYXRpdmUpCisgICAgICogc3RhY2sgc2l6ZSBpbiB0aGUgYmFzaWMgYmxvY2sgZnJvbSB3aGljaCB0aGlzIGVkZ2Ugb3JpZ2luYXRlcy4gVGhpcyBzaXplCisgICAgICogaXMgZXF1YWwgdG8gdGhlIHN0YWNrIHNpemUgYXQgdGhlICJqdW1wIiBpbnN0cnVjdGlvbiB0byB3aGljaCB0aGlzIGVkZ2UKKyAgICAgKiBjb3JyZXNwb25kcywgcmVsYXRpdmVseSB0byB0aGUgc3RhY2sgc2l6ZSBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQorICAgICAqIG9yaWdpbmF0aW5nIGJhc2ljIGJsb2NrLiBJZiB7QGxpbmsgQ2xhc3NXcml0ZXIjQ09NUFVURV9GUkFNRVN9IGlzIHVzZWQsCisgICAgICogdGhpcyBmaWVsZCBpcyB0aGUga2luZCBvZiB0aGlzIGNvbnRyb2wgZmxvdyBncmFwaCBlZGdlIChpLmUuIE5PUk1BTCBvcgorICAgICAqIEVYQ0VQVElPTikuCisgICAgICovCisgICAgaW50IGluZm87CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3VjY2Vzc29yIGJsb2NrIG9mIHRoZSBiYXNpYyBibG9jayBmcm9tIHdoaWNoIHRoaXMgZWRnZSBvcmlnaW5hdGVzLgorICAgICAqLworICAgIExhYmVsIHN1Y2Nlc3NvcjsKKworICAgIC8qKgorICAgICAqIFRoZSBuZXh0IGVkZ2UgaW4gdGhlIGxpc3Qgb2Ygc3VjY2Vzc29ycyBvZiB0aGUgb3JpZ2luYXRpbmcgYmFzaWMgYmxvY2suCisgICAgICogU2VlIHtAbGluayBMYWJlbCNzdWNjZXNzb3JzIHN1Y2Nlc3NvcnN9LgorICAgICAqLworICAgIEVkZ2UgbmV4dDsKK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvamVyc2V5L3JlcGFja2FnZWQvb3JnL29iamVjdHdlYi9hc20vRmllbGRWaXNpdG9yLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL2plcnNleS9yZXBhY2thZ2VkL29yZy9vYmplY3R3ZWIvYXNtL0ZpZWxkVmlzaXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MjdlYWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL2plcnNleS9yZXBhY2thZ2VkL29yZy9vYmplY3R3ZWIvYXNtL0ZpZWxkVmlzaXRvci5qYXZhCkBAIC0wLDAgKzEsMTUwIEBACisvKioqCisgKiBBU006IGEgdmVyeSBzbWFsbCBhbmQgZmFzdCBKYXZhIGJ5dGVjb2RlIG1hbmlwdWxhdGlvbiBmcmFtZXdvcmsKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDExIElOUklBLCBGcmFuY2UgVGVsZWNvbQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIGplcnNleS5yZXBhY2thZ2VkLm9yZy5vYmplY3R3ZWIuYXNtOworCisvKioKKyAqIEEgdmlzaXRvciB0byB2aXNpdCBhIEphdmEgZmllbGQuIFRoZSBtZXRob2RzIG9mIHRoaXMgY2xhc3MgbXVzdCBiZSBjYWxsZWQgaW4KKyAqIHRoZSBmb2xsb3dpbmcgb3JkZXI6ICggPHR0PnZpc2l0QW5ub3RhdGlvbjwvdHQ+IHwKKyAqIDx0dD52aXNpdFR5cGVBbm5vdGF0aW9uPC90dD4gfCA8dHQ+dmlzaXRBdHRyaWJ1dGU8L3R0PiApKiA8dHQ+dmlzaXRFbmQ8L3R0Pi4KKyAqCisgKiBAYXV0aG9yIEVyaWMgQnJ1bmV0b24KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEZpZWxkVmlzaXRvciB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgQVNNIEFQSSB2ZXJzaW9uIGltcGxlbWVudGVkIGJ5IHRoaXMgdmlzaXRvci4gVGhlIHZhbHVlIG9mIHRoaXMgZmllbGQKKyAgICAgKiBtdXN0IGJlIG9uZSBvZiB7QGxpbmsgT3Bjb2RlcyNBU000fSBvciB7QGxpbmsgT3Bjb2RlcyNBU001fS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgaW50IGFwaTsKKworICAgIC8qKgorICAgICAqIFRoZSBmaWVsZCB2aXNpdG9yIHRvIHdoaWNoIHRoaXMgdmlzaXRvciBtdXN0IGRlbGVnYXRlIG1ldGhvZCBjYWxscy4gTWF5CisgICAgICogYmUgbnVsbC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRmllbGRWaXNpdG9yIGZ2OworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgRmllbGRWaXNpdG9yfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcGkKKyAgICAgKiAgICAgICAgICAgIHRoZSBBU00gQVBJIHZlcnNpb24gaW1wbGVtZW50ZWQgYnkgdGhpcyB2aXNpdG9yLiBNdXN0IGJlIG9uZQorICAgICAqICAgICAgICAgICAgb2Yge0BsaW5rIE9wY29kZXMjQVNNNH0gb3Ige0BsaW5rIE9wY29kZXMjQVNNNX0uCisgICAgICovCisgICAgcHVibGljIEZpZWxkVmlzaXRvcihmaW5hbCBpbnQgYXBpKSB7CisgICAgICAgIHRoaXMoYXBpLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBGaWVsZFZpc2l0b3J9LgorICAgICAqCisgICAgICogQHBhcmFtIGFwaQorICAgICAqICAgICAgICAgICAgdGhlIEFTTSBBUEkgdmVyc2lvbiBpbXBsZW1lbnRlZCBieSB0aGlzIHZpc2l0b3IuIE11c3QgYmUgb25lCisgICAgICogICAgICAgICAgICBvZiB7QGxpbmsgT3Bjb2RlcyNBU000fSBvciB7QGxpbmsgT3Bjb2RlcyNBU001fS4KKyAgICAgKiBAcGFyYW0gZnYKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaWVsZCB2aXNpdG9yIHRvIHdoaWNoIHRoaXMgdmlzaXRvciBtdXN0IGRlbGVnYXRlIG1ldGhvZAorICAgICAqICAgICAgICAgICAgY2FsbHMuIE1heSBiZSBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBGaWVsZFZpc2l0b3IoZmluYWwgaW50IGFwaSwgZmluYWwgRmllbGRWaXNpdG9yIGZ2KSB7CisgICAgICAgIGlmIChhcGkgIT0gT3Bjb2Rlcy5BU000ICYmIGFwaSAhPSBPcGNvZGVzLkFTTTUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmFwaSA9IGFwaTsKKyAgICAgICAgdGhpcy5mdiA9IGZ2OworICAgIH0KKworICAgIC8qKgorICAgICAqIFZpc2l0cyBhbiBhbm5vdGF0aW9uIG9mIHRoZSBmaWVsZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZXNjCisgICAgICogICAgICAgICAgICB0aGUgY2xhc3MgZGVzY3JpcHRvciBvZiB0aGUgYW5ub3RhdGlvbiBjbGFzcy4KKyAgICAgKiBAcGFyYW0gdmlzaWJsZQorICAgICAqICAgICAgICAgICAgPHR0PnRydWU8L3R0PiBpZiB0aGUgYW5ub3RhdGlvbiBpcyB2aXNpYmxlIGF0IHJ1bnRpbWUuCisgICAgICogQHJldHVybiBhIHZpc2l0b3IgdG8gdmlzaXQgdGhlIGFubm90YXRpb24gdmFsdWVzLCBvciA8dHQ+bnVsbDwvdHQ+IGlmCisgICAgICogICAgICAgICB0aGlzIHZpc2l0b3IgaXMgbm90IGludGVyZXN0ZWQgaW4gdmlzaXRpbmcgdGhpcyBhbm5vdGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBBbm5vdGF0aW9uVmlzaXRvciB2aXNpdEFubm90YXRpb24oU3RyaW5nIGRlc2MsIGJvb2xlYW4gdmlzaWJsZSkgeworICAgICAgICBpZiAoZnYgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZ2LnZpc2l0QW5ub3RhdGlvbihkZXNjLCB2aXNpYmxlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWaXNpdHMgYW4gYW5ub3RhdGlvbiBvbiB0aGUgdHlwZSBvZiB0aGUgZmllbGQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZVJlZgorICAgICAqICAgICAgICAgICAgYSByZWZlcmVuY2UgdG8gdGhlIGFubm90YXRlZCB0eXBlLiBUaGUgc29ydCBvZiB0aGlzIHR5cGUKKyAgICAgKiAgICAgICAgICAgIHJlZmVyZW5jZSBtdXN0IGJlIHtAbGluayBUeXBlUmVmZXJlbmNlI0ZJRUxEIEZJRUxEfS4gU2VlCisgICAgICogICAgICAgICAgICB7QGxpbmsgVHlwZVJlZmVyZW5jZX0uCisgICAgICogQHBhcmFtIHR5cGVQYXRoCisgICAgICogICAgICAgICAgICB0aGUgcGF0aCB0byB0aGUgYW5ub3RhdGVkIHR5cGUgYXJndW1lbnQsIHdpbGRjYXJkIGJvdW5kLCBhcnJheQorICAgICAqICAgICAgICAgICAgZWxlbWVudCB0eXBlLCBvciBzdGF0aWMgaW5uZXIgdHlwZSB3aXRoaW4gJ3R5cGVSZWYnLiBNYXkgYmUKKyAgICAgKiAgICAgICAgICAgIDx0dD5udWxsPC90dD4gaWYgdGhlIGFubm90YXRpb24gdGFyZ2V0cyAndHlwZVJlZicgYXMgYSB3aG9sZS4KKyAgICAgKiBAcGFyYW0gZGVzYworICAgICAqICAgICAgICAgICAgdGhlIGNsYXNzIGRlc2NyaXB0b3Igb2YgdGhlIGFubm90YXRpb24gY2xhc3MuCisgICAgICogQHBhcmFtIHZpc2libGUKKyAgICAgKiAgICAgICAgICAgIDx0dD50cnVlPC90dD4gaWYgdGhlIGFubm90YXRpb24gaXMgdmlzaWJsZSBhdCBydW50aW1lLgorICAgICAqIEByZXR1cm4gYSB2aXNpdG9yIHRvIHZpc2l0IHRoZSBhbm5vdGF0aW9uIHZhbHVlcywgb3IgPHR0Pm51bGw8L3R0PiBpZgorICAgICAqICAgICAgICAgdGhpcyB2aXNpdG9yIGlzIG5vdCBpbnRlcmVzdGVkIGluIHZpc2l0aW5nIHRoaXMgYW5ub3RhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQW5ub3RhdGlvblZpc2l0b3IgdmlzaXRUeXBlQW5ub3RhdGlvbihpbnQgdHlwZVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlUGF0aCB0eXBlUGF0aCwgU3RyaW5nIGRlc2MsIGJvb2xlYW4gdmlzaWJsZSkgeworICAgICAgICBpZiAoYXBpIDwgT3Bjb2Rlcy5BU001KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGlmIChmdiAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZnYudmlzaXRUeXBlQW5ub3RhdGlvbih0eXBlUmVmLCB0eXBlUGF0aCwgZGVzYywgdmlzaWJsZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmlzaXRzIGEgbm9uIHN0YW5kYXJkIGF0dHJpYnV0ZSBvZiB0aGUgZmllbGQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXR0cgorICAgICAqICAgICAgICAgICAgYW4gYXR0cmlidXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlKEF0dHJpYnV0ZSBhdHRyKSB7CisgICAgICAgIGlmIChmdiAhPSBudWxsKSB7CisgICAgICAgICAgICBmdi52aXNpdEF0dHJpYnV0ZShhdHRyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFZpc2l0cyB0aGUgZW5kIG9mIHRoZSBmaWVsZC4gVGhpcyBtZXRob2QsIHdoaWNoIGlzIHRoZSBsYXN0IG9uZSB0byBiZQorICAgICAqIGNhbGxlZCwgaXMgdXNlZCB0byBpbmZvcm0gdGhlIHZpc2l0b3IgdGhhdCBhbGwgdGhlIGFubm90YXRpb25zIGFuZAorICAgICAqIGF0dHJpYnV0ZXMgb2YgdGhlIGZpZWxkIGhhdmUgYmVlbiB2aXNpdGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZpc2l0RW5kKCkgeworICAgICAgICBpZiAoZnYgIT0gbnVsbCkgeworICAgICAgICAgICAgZnYudmlzaXRFbmQoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvamVyc2V5L3JlcGFja2FnZWQvb3JnL29iamVjdHdlYi9hc20vRmllbGRXcml0ZXIuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvamVyc2V5L3JlcGFja2FnZWQvb3JnL29iamVjdHdlYi9hc20vRmllbGRXcml0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzg4YmVmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9qZXJzZXkvcmVwYWNrYWdlZC9vcmcvb2JqZWN0d2ViL2FzbS9GaWVsZFdyaXRlci5qYXZhCkBAIC0wLDAgKzEsMzI5IEBACisvKioqCisgKiBBU006IGEgdmVyeSBzbWFsbCBhbmQgZmFzdCBKYXZhIGJ5dGVjb2RlIG1hbmlwdWxhdGlvbiBmcmFtZXdvcmsKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDExIElOUklBLCBGcmFuY2UgVGVsZWNvbQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIGplcnNleS5yZXBhY2thZ2VkLm9yZy5vYmplY3R3ZWIuYXNtOworCisvKioKKyAqIEFuIHtAbGluayBGaWVsZFZpc2l0b3J9IHRoYXQgZ2VuZXJhdGVzIEphdmEgZmllbGRzIGluIGJ5dGVjb2RlIGZvcm0uCisgKgorICogQGF1dGhvciBFcmljIEJydW5ldG9uCisgKi8KK2ZpbmFsIGNsYXNzIEZpZWxkV3JpdGVyIGV4dGVuZHMgRmllbGRWaXNpdG9yIHsKKworICAgIC8qKgorICAgICAqIFRoZSBjbGFzcyB3cml0ZXIgdG8gd2hpY2ggdGhpcyBmaWVsZCBtdXN0IGJlIGFkZGVkLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgQ2xhc3NXcml0ZXIgY3c7CisKKyAgICAvKioKKyAgICAgKiBBY2Nlc3MgZmxhZ3Mgb2YgdGhpcyBmaWVsZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGludCBhY2Nlc3M7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaW5kZXggb2YgdGhlIGNvbnN0YW50IHBvb2wgaXRlbSB0aGF0IGNvbnRhaW5zIHRoZSBuYW1lIG9mIHRoaXMKKyAgICAgKiBtZXRob2QuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbmFtZTsKKworICAgIC8qKgorICAgICAqIFRoZSBpbmRleCBvZiB0aGUgY29uc3RhbnQgcG9vbCBpdGVtIHRoYXQgY29udGFpbnMgdGhlIGRlc2NyaXB0b3Igb2YgdGhpcworICAgICAqIGZpZWxkLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgaW50IGRlc2M7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaW5kZXggb2YgdGhlIGNvbnN0YW50IHBvb2wgaXRlbSB0aGF0IGNvbnRhaW5zIHRoZSBzaWduYXR1cmUgb2YgdGhpcworICAgICAqIGZpZWxkLgorICAgICAqLworICAgIHByaXZhdGUgaW50IHNpZ25hdHVyZTsKKworICAgIC8qKgorICAgICAqIFRoZSBpbmRleCBvZiB0aGUgY29uc3RhbnQgcG9vbCBpdGVtIHRoYXQgY29udGFpbnMgdGhlIGNvbnN0YW50IHZhbHVlIG9mCisgICAgICogdGhpcyBmaWVsZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCB2YWx1ZTsKKworICAgIC8qKgorICAgICAqIFRoZSBydW50aW1lIHZpc2libGUgYW5ub3RhdGlvbnMgb2YgdGhpcyBmaWVsZC4gTWF5IGJlIDx0dD5udWxsPC90dD4uCisgICAgICovCisgICAgcHJpdmF0ZSBBbm5vdGF0aW9uV3JpdGVyIGFubnM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcnVudGltZSBpbnZpc2libGUgYW5ub3RhdGlvbnMgb2YgdGhpcyBmaWVsZC4gTWF5IGJlIDx0dD5udWxsPC90dD4uCisgICAgICovCisgICAgcHJpdmF0ZSBBbm5vdGF0aW9uV3JpdGVyIGlhbm5zOworCisgICAgLyoqCisgICAgICogVGhlIHJ1bnRpbWUgdmlzaWJsZSB0eXBlIGFubm90YXRpb25zIG9mIHRoaXMgZmllbGQuIE1heSBiZSA8dHQ+bnVsbDwvdHQ+LgorICAgICAqLworICAgIHByaXZhdGUgQW5ub3RhdGlvbldyaXRlciB0YW5uczsKKworICAgIC8qKgorICAgICAqIFRoZSBydW50aW1lIGludmlzaWJsZSB0eXBlIGFubm90YXRpb25zIG9mIHRoaXMgZmllbGQuIE1heSBiZQorICAgICAqIDx0dD5udWxsPC90dD4uCisgICAgICovCisgICAgcHJpdmF0ZSBBbm5vdGF0aW9uV3JpdGVyIGl0YW5uczsKKworICAgIC8qKgorICAgICAqIFRoZSBub24gc3RhbmRhcmQgYXR0cmlidXRlcyBvZiB0aGlzIGZpZWxkLiBNYXkgYmUgPHR0Pm51bGw8L3R0Pi4KKyAgICAgKi8KKyAgICBwcml2YXRlIEF0dHJpYnV0ZSBhdHRyczsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIENvbnN0cnVjdG9yCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBGaWVsZFdyaXRlcn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3cKKyAgICAgKiAgICAgICAgICAgIHRoZSBjbGFzcyB3cml0ZXIgdG8gd2hpY2ggdGhpcyBmaWVsZCBtdXN0IGJlIGFkZGVkLgorICAgICAqIEBwYXJhbSBhY2Nlc3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaWVsZCdzIGFjY2VzcyBmbGFncyAoc2VlIHtAbGluayBPcGNvZGVzfSkuCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaWVsZCdzIG5hbWUuCisgICAgICogQHBhcmFtIGRlc2MKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaWVsZCdzIGRlc2NyaXB0b3IgKHNlZSB7QGxpbmsgVHlwZX0pLgorICAgICAqIEBwYXJhbSBzaWduYXR1cmUKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaWVsZCdzIHNpZ25hdHVyZS4gTWF5IGJlIDx0dD5udWxsPC90dD4uCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICogICAgICAgICAgICB0aGUgZmllbGQncyBjb25zdGFudCB2YWx1ZS4gTWF5IGJlIDx0dD5udWxsPC90dD4uCisgICAgICovCisgICAgRmllbGRXcml0ZXIoZmluYWwgQ2xhc3NXcml0ZXIgY3csIGZpbmFsIGludCBhY2Nlc3MsIGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjLCBmaW5hbCBTdHJpbmcgc2lnbmF0dXJlLCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgc3VwZXIoT3Bjb2Rlcy5BU001KTsKKyAgICAgICAgaWYgKGN3LmZpcnN0RmllbGQgPT0gbnVsbCkgeworICAgICAgICAgICAgY3cuZmlyc3RGaWVsZCA9IHRoaXM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjdy5sYXN0RmllbGQuZnYgPSB0aGlzOworICAgICAgICB9CisgICAgICAgIGN3Lmxhc3RGaWVsZCA9IHRoaXM7CisgICAgICAgIHRoaXMuY3cgPSBjdzsKKyAgICAgICAgdGhpcy5hY2Nlc3MgPSBhY2Nlc3M7CisgICAgICAgIHRoaXMubmFtZSA9IGN3Lm5ld1VURjgobmFtZSk7CisgICAgICAgIHRoaXMuZGVzYyA9IGN3Lm5ld1VURjgoZGVzYyk7CisgICAgICAgIGlmIChDbGFzc1JlYWRlci5TSUdOQVRVUkVTICYmIHNpZ25hdHVyZSAhPSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLnNpZ25hdHVyZSA9IGN3Lm5ld1VURjgoc2lnbmF0dXJlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IGN3Lm5ld0NvbnN0SXRlbSh2YWx1ZSkuaW5kZXg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgRmllbGRWaXNpdG9yIGFic3RyYWN0IGNsYXNzCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQW5ub3RhdGlvblZpc2l0b3IgdmlzaXRBbm5vdGF0aW9uKGZpbmFsIFN0cmluZyBkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiB2aXNpYmxlKSB7CisgICAgICAgIGlmICghQ2xhc3NSZWFkZXIuQU5OT1RBVElPTlMpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIEJ5dGVWZWN0b3IgYnYgPSBuZXcgQnl0ZVZlY3RvcigpOworICAgICAgICAvLyB3cml0ZSB0eXBlLCBhbmQgcmVzZXJ2ZSBzcGFjZSBmb3IgdmFsdWVzIGNvdW50CisgICAgICAgIGJ2LnB1dFNob3J0KGN3Lm5ld1VURjgoZGVzYykpLnB1dFNob3J0KDApOworICAgICAgICBBbm5vdGF0aW9uV3JpdGVyIGF3ID0gbmV3IEFubm90YXRpb25Xcml0ZXIoY3csIHRydWUsIGJ2LCBidiwgMik7CisgICAgICAgIGlmICh2aXNpYmxlKSB7CisgICAgICAgICAgICBhdy5uZXh0ID0gYW5uczsKKyAgICAgICAgICAgIGFubnMgPSBhdzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF3Lm5leHQgPSBpYW5uczsKKyAgICAgICAgICAgIGlhbm5zID0gYXc7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGF3OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBbm5vdGF0aW9uVmlzaXRvciB2aXNpdFR5cGVBbm5vdGF0aW9uKGZpbmFsIGludCB0eXBlUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFR5cGVQYXRoIHR5cGVQYXRoLCBmaW5hbCBTdHJpbmcgZGVzYywgZmluYWwgYm9vbGVhbiB2aXNpYmxlKSB7CisgICAgICAgIGlmICghQ2xhc3NSZWFkZXIuQU5OT1RBVElPTlMpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIEJ5dGVWZWN0b3IgYnYgPSBuZXcgQnl0ZVZlY3RvcigpOworICAgICAgICAvLyB3cml0ZSB0YXJnZXRfdHlwZSBhbmQgdGFyZ2V0X2luZm8KKyAgICAgICAgQW5ub3RhdGlvbldyaXRlci5wdXRUYXJnZXQodHlwZVJlZiwgdHlwZVBhdGgsIGJ2KTsKKyAgICAgICAgLy8gd3JpdGUgdHlwZSwgYW5kIHJlc2VydmUgc3BhY2UgZm9yIHZhbHVlcyBjb3VudAorICAgICAgICBidi5wdXRTaG9ydChjdy5uZXdVVEY4KGRlc2MpKS5wdXRTaG9ydCgwKTsKKyAgICAgICAgQW5ub3RhdGlvbldyaXRlciBhdyA9IG5ldyBBbm5vdGF0aW9uV3JpdGVyKGN3LCB0cnVlLCBidiwgYnYsCisgICAgICAgICAgICAgICAgYnYubGVuZ3RoIC0gMik7CisgICAgICAgIGlmICh2aXNpYmxlKSB7CisgICAgICAgICAgICBhdy5uZXh0ID0gdGFubnM7CisgICAgICAgICAgICB0YW5ucyA9IGF3OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXcubmV4dCA9IGl0YW5uczsKKyAgICAgICAgICAgIGl0YW5ucyA9IGF3OworICAgICAgICB9CisgICAgICAgIHJldHVybiBhdzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZShmaW5hbCBBdHRyaWJ1dGUgYXR0cikgeworICAgICAgICBhdHRyLm5leHQgPSBhdHRyczsKKyAgICAgICAgYXR0cnMgPSBhdHRyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0RW5kKCkgeworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIFV0aWxpdHkgbWV0aG9kcworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGlzIGZpZWxkLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgc2l6ZSBvZiB0aGlzIGZpZWxkLgorICAgICAqLworICAgIGludCBnZXRTaXplKCkgeworICAgICAgICBpbnQgc2l6ZSA9IDg7CisgICAgICAgIGlmICh2YWx1ZSAhPSAwKSB7CisgICAgICAgICAgICBjdy5uZXdVVEY4KCJDb25zdGFudFZhbHVlIik7CisgICAgICAgICAgICBzaXplICs9IDg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChhY2Nlc3MgJiBPcGNvZGVzLkFDQ19TWU5USEVUSUMpICE9IDApIHsKKyAgICAgICAgICAgIGlmICgoY3cudmVyc2lvbiAmIDB4RkZGRikgPCBPcGNvZGVzLlYxXzUKKyAgICAgICAgICAgICAgICB8fCAoYWNjZXNzICYgQ2xhc3NXcml0ZXIuQUNDX1NZTlRIRVRJQ19BVFRSSUJVVEUpICE9IDApIHsKKyAgICAgICAgICAgICAgICBjdy5uZXdVVEY4KCJTeW50aGV0aWMiKTsKKyAgICAgICAgICAgICAgICBzaXplICs9IDY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKChhY2Nlc3MgJiBPcGNvZGVzLkFDQ19ERVBSRUNBVEVEKSAhPSAwKSB7CisgICAgICAgICAgICBjdy5uZXdVVEY4KCJEZXByZWNhdGVkIik7CisgICAgICAgICAgICBzaXplICs9IDY7CisgICAgICAgIH0KKyAgICAgICAgaWYgKENsYXNzUmVhZGVyLlNJR05BVFVSRVMgJiYgc2lnbmF0dXJlICE9IDApIHsKKyAgICAgICAgICAgIGN3Lm5ld1VURjgoIlNpZ25hdHVyZSIpOworICAgICAgICAgICAgc2l6ZSArPSA4OworICAgICAgICB9CisgICAgICAgIGlmIChDbGFzc1JlYWRlci5BTk5PVEFUSU9OUyAmJiBhbm5zICE9IG51bGwpIHsKKyAgICAgICAgICAgIGN3Lm5ld1VURjgoIlJ1bnRpbWVWaXNpYmxlQW5ub3RhdGlvbnMiKTsKKyAgICAgICAgICAgIHNpemUgKz0gOCArIGFubnMuZ2V0U2l6ZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChDbGFzc1JlYWRlci5BTk5PVEFUSU9OUyAmJiBpYW5ucyAhPSBudWxsKSB7CisgICAgICAgICAgICBjdy5uZXdVVEY4KCJSdW50aW1lSW52aXNpYmxlQW5ub3RhdGlvbnMiKTsKKyAgICAgICAgICAgIHNpemUgKz0gOCArIGlhbm5zLmdldFNpemUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQ2xhc3NSZWFkZXIuQU5OT1RBVElPTlMgJiYgdGFubnMgIT0gbnVsbCkgeworICAgICAgICAgICAgY3cubmV3VVRGOCgiUnVudGltZVZpc2libGVUeXBlQW5ub3RhdGlvbnMiKTsKKyAgICAgICAgICAgIHNpemUgKz0gOCArIHRhbm5zLmdldFNpemUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQ2xhc3NSZWFkZXIuQU5OT1RBVElPTlMgJiYgaXRhbm5zICE9IG51bGwpIHsKKyAgICAgICAgICAgIGN3Lm5ld1VURjgoIlJ1bnRpbWVJbnZpc2libGVUeXBlQW5ub3RhdGlvbnMiKTsKKyAgICAgICAgICAgIHNpemUgKz0gOCArIGl0YW5ucy5nZXRTaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF0dHJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNpemUgKz0gYXR0cnMuZ2V0U2l6ZShjdywgbnVsbCwgMCwgLTEsIC0xKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQdXRzIHRoZSBjb250ZW50IG9mIHRoaXMgZmllbGQgaW50byB0aGUgZ2l2ZW4gYnl0ZSB2ZWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3V0CisgICAgICogICAgICAgICAgICB3aGVyZSB0aGUgY29udGVudCBvZiB0aGlzIGZpZWxkIG11c3QgYmUgcHV0LgorICAgICAqLworICAgIHZvaWQgcHV0KGZpbmFsIEJ5dGVWZWN0b3Igb3V0KSB7CisgICAgICAgIGZpbmFsIGludCBGQUNUT1IgPSBDbGFzc1dyaXRlci5UT19BQ0NfU1lOVEhFVElDOworICAgICAgICBpbnQgbWFzayA9IE9wY29kZXMuQUNDX0RFUFJFQ0FURUQgfCBDbGFzc1dyaXRlci5BQ0NfU1lOVEhFVElDX0FUVFJJQlVURQorICAgICAgICAgICAgICAgICAgIHwgKChhY2Nlc3MgJiBDbGFzc1dyaXRlci5BQ0NfU1lOVEhFVElDX0FUVFJJQlVURSkgLyBGQUNUT1IpOworICAgICAgICBvdXQucHV0U2hvcnQoYWNjZXNzICYgfm1hc2spLnB1dFNob3J0KG5hbWUpLnB1dFNob3J0KGRlc2MpOworICAgICAgICBpbnQgYXR0cmlidXRlQ291bnQgPSAwOworICAgICAgICBpZiAodmFsdWUgIT0gMCkgeworICAgICAgICAgICAgKythdHRyaWJ1dGVDb3VudDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGFjY2VzcyAmIE9wY29kZXMuQUNDX1NZTlRIRVRJQykgIT0gMCkgeworICAgICAgICAgICAgaWYgKChjdy52ZXJzaW9uICYgMHhGRkZGKSA8IE9wY29kZXMuVjFfNQorICAgICAgICAgICAgICAgIHx8IChhY2Nlc3MgJiBDbGFzc1dyaXRlci5BQ0NfU1lOVEhFVElDX0FUVFJJQlVURSkgIT0gMCkgeworICAgICAgICAgICAgICAgICsrYXR0cmlidXRlQ291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKChhY2Nlc3MgJiBPcGNvZGVzLkFDQ19ERVBSRUNBVEVEKSAhPSAwKSB7CisgICAgICAgICAgICArK2F0dHJpYnV0ZUNvdW50OworICAgICAgICB9CisgICAgICAgIGlmIChDbGFzc1JlYWRlci5TSUdOQVRVUkVTICYmIHNpZ25hdHVyZSAhPSAwKSB7CisgICAgICAgICAgICArK2F0dHJpYnV0ZUNvdW50OworICAgICAgICB9CisgICAgICAgIGlmIChDbGFzc1JlYWRlci5BTk5PVEFUSU9OUyAmJiBhbm5zICE9IG51bGwpIHsKKyAgICAgICAgICAgICsrYXR0cmlidXRlQ291bnQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKENsYXNzUmVhZGVyLkFOTk9UQVRJT05TICYmIGlhbm5zICE9IG51bGwpIHsKKyAgICAgICAgICAgICsrYXR0cmlidXRlQ291bnQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKENsYXNzUmVhZGVyLkFOTk9UQVRJT05TICYmIHRhbm5zICE9IG51bGwpIHsKKyAgICAgICAgICAgICsrYXR0cmlidXRlQ291bnQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKENsYXNzUmVhZGVyLkFOTk9UQVRJT05TICYmIGl0YW5ucyAhPSBudWxsKSB7CisgICAgICAgICAgICArK2F0dHJpYnV0ZUNvdW50OworICAgICAgICB9CisgICAgICAgIGlmIChhdHRycyAhPSBudWxsKSB7CisgICAgICAgICAgICBhdHRyaWJ1dGVDb3VudCArPSBhdHRycy5nZXRDb3VudCgpOworICAgICAgICB9CisgICAgICAgIG91dC5wdXRTaG9ydChhdHRyaWJ1dGVDb3VudCk7CisgICAgICAgIGlmICh2YWx1ZSAhPSAwKSB7CisgICAgICAgICAgICBvdXQucHV0U2hvcnQoY3cubmV3VVRGOCgiQ29uc3RhbnRWYWx1ZSIpKTsKKyAgICAgICAgICAgIG91dC5wdXRJbnQoMikucHV0U2hvcnQodmFsdWUpOworICAgICAgICB9CisgICAgICAgIGlmICgoYWNjZXNzICYgT3Bjb2Rlcy5BQ0NfU1lOVEhFVElDKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoKGN3LnZlcnNpb24gJiAweEZGRkYpIDwgT3Bjb2Rlcy5WMV81CisgICAgICAgICAgICAgICAgfHwgKGFjY2VzcyAmIENsYXNzV3JpdGVyLkFDQ19TWU5USEVUSUNfQVRUUklCVVRFKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgb3V0LnB1dFNob3J0KGN3Lm5ld1VURjgoIlN5bnRoZXRpYyIpKS5wdXRJbnQoMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKChhY2Nlc3MgJiBPcGNvZGVzLkFDQ19ERVBSRUNBVEVEKSAhPSAwKSB7CisgICAgICAgICAgICBvdXQucHV0U2hvcnQoY3cubmV3VVRGOCgiRGVwcmVjYXRlZCIpKS5wdXRJbnQoMCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKENsYXNzUmVhZGVyLlNJR05BVFVSRVMgJiYgc2lnbmF0dXJlICE9IDApIHsKKyAgICAgICAgICAgIG91dC5wdXRTaG9ydChjdy5uZXdVVEY4KCJTaWduYXR1cmUiKSk7CisgICAgICAgICAgICBvdXQucHV0SW50KDIpLnB1dFNob3J0KHNpZ25hdHVyZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKENsYXNzUmVhZGVyLkFOTk9UQVRJT05TICYmIGFubnMgIT0gbnVsbCkgeworICAgICAgICAgICAgb3V0LnB1dFNob3J0KGN3Lm5ld1VURjgoIlJ1bnRpbWVWaXNpYmxlQW5ub3RhdGlvbnMiKSk7CisgICAgICAgICAgICBhbm5zLnB1dChvdXQpOworICAgICAgICB9CisgICAgICAgIGlmIChDbGFzc1JlYWRlci5BTk5PVEFUSU9OUyAmJiBpYW5ucyAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXQucHV0U2hvcnQoY3cubmV3VVRGOCgiUnVudGltZUludmlzaWJsZUFubm90YXRpb25zIikpOworICAgICAgICAgICAgaWFubnMucHV0KG91dCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKENsYXNzUmVhZGVyLkFOTk9UQVRJT05TICYmIHRhbm5zICE9IG51bGwpIHsKKyAgICAgICAgICAgIG91dC5wdXRTaG9ydChjdy5uZXdVVEY4KCJSdW50aW1lVmlzaWJsZVR5cGVBbm5vdGF0aW9ucyIpKTsKKyAgICAgICAgICAgIHRhbm5zLnB1dChvdXQpOworICAgICAgICB9CisgICAgICAgIGlmIChDbGFzc1JlYWRlci5BTk5PVEFUSU9OUyAmJiBpdGFubnMgIT0gbnVsbCkgeworICAgICAgICAgICAgb3V0LnB1dFNob3J0KGN3Lm5ld1VURjgoIlJ1bnRpbWVJbnZpc2libGVUeXBlQW5ub3RhdGlvbnMiKSk7CisgICAgICAgICAgICBpdGFubnMucHV0KG91dCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF0dHJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGF0dHJzLnB1dChjdywgbnVsbCwgMCwgLTEsIC0xLCBvdXQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9qZXJzZXkvcmVwYWNrYWdlZC9vcmcvb2JqZWN0d2ViL2FzbS9GcmFtZS5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9qZXJzZXkvcmVwYWNrYWdlZC9vcmcvb2JqZWN0d2ViL2FzbS9GcmFtZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMTg4MTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL2plcnNleS9yZXBhY2thZ2VkL29yZy9vYmplY3R3ZWIvYXNtL0ZyYW1lLmphdmEKQEAgLTAsMCArMSwxNDYyIEBACisvKioqCisgKiBBU006IGEgdmVyeSBzbWFsbCBhbmQgZmFzdCBKYXZhIGJ5dGVjb2RlIG1hbmlwdWxhdGlvbiBmcmFtZXdvcmsKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDExIElOUklBLCBGcmFuY2UgVGVsZWNvbQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIGplcnNleS5yZXBhY2thZ2VkLm9yZy5vYmplY3R3ZWIuYXNtOworCisvKioKKyAqIEluZm9ybWF0aW9uIGFib3V0IHRoZSBpbnB1dCBhbmQgb3V0cHV0IHN0YWNrIG1hcCBmcmFtZXMgb2YgYSBiYXNpYyBibG9jay4KKyAqCisgKiBAYXV0aG9yIEVyaWMgQnJ1bmV0b24KKyAqLworZmluYWwgY2xhc3MgRnJhbWUgeworCisgICAgLyoKKyAgICAgKiBGcmFtZXMgYXJlIGNvbXB1dGVkIGluIGEgdHdvIHN0ZXBzIHByb2Nlc3M6IGR1cmluZyB0aGUgdmlzaXQgb2YgZWFjaAorICAgICAqIGluc3RydWN0aW9uLCB0aGUgc3RhdGUgb2YgdGhlIGZyYW1lIGF0IHRoZSBlbmQgb2YgY3VycmVudCBiYXNpYyBibG9jayBpcworICAgICAqIHVwZGF0ZWQgYnkgc2ltdWxhdGluZyB0aGUgYWN0aW9uIG9mIHRoZSBpbnN0cnVjdGlvbiBvbiB0aGUgcHJldmlvdXMgc3RhdGUKKyAgICAgKiBvZiB0aGlzIHNvIGNhbGxlZCAib3V0cHV0IGZyYW1lIi4gSW4gdmlzaXRNYXhzLCBhIGZpeCBwb2ludCBhbGdvcml0aG0gaXMKKyAgICAgKiB1c2VkIHRvIGNvbXB1dGUgdGhlICJpbnB1dCBmcmFtZSIgb2YgZWFjaCBiYXNpYyBibG9jaywgaS5lLiB0aGUgc3RhY2sgbWFwCisgICAgICogZnJhbWUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYmFzaWMgYmxvY2ssIHN0YXJ0aW5nIGZyb20gdGhlIGlucHV0IGZyYW1lCisgICAgICogb2YgdGhlIGZpcnN0IGJhc2ljIGJsb2NrICh3aGljaCBpcyBjb21wdXRlZCBmcm9tIHRoZSBtZXRob2QgZGVzY3JpcHRvciksCisgICAgICogYW5kIGJ5IHVzaW5nIHRoZSBwcmV2aW91c2x5IGNvbXB1dGVkIG91dHB1dCBmcmFtZXMgdG8gY29tcHV0ZSB0aGUgaW5wdXQKKyAgICAgKiBzdGF0ZSBvZiB0aGUgb3RoZXIgYmxvY2tzLgorICAgICAqCisgICAgICogQWxsIG91dHB1dCBhbmQgaW5wdXQgZnJhbWVzIGFyZSBzdG9yZWQgYXMgYXJyYXlzIG9mIGludGVnZXJzLiBSZWZlcmVuY2UKKyAgICAgKiBhbmQgYXJyYXkgdHlwZXMgYXJlIHJlcHJlc2VudGVkIGJ5IGFuIGluZGV4IGludG8gYSB0eXBlIHRhYmxlICh3aGljaCBpcworICAgICAqIG5vdCB0aGUgc2FtZSBhcyB0aGUgY29uc3RhbnQgcG9vbCBvZiB0aGUgY2xhc3MsIGluIG9yZGVyIHRvIGF2b2lkIGFkZGluZworICAgICAqIHVubmVjZXNzYXJ5IGNvbnN0YW50cyBpbiB0aGUgcG9vbCAtIG5vdCBhbGwgY29tcHV0ZWQgZnJhbWVzIHdpbGwgZW5kIHVwCisgICAgICogYmVpbmcgc3RvcmVkIGluIHRoZSBzdGFjayBtYXAgdGFibGUpLiBUaGlzIGFsbG93cyB2ZXJ5IGZhc3QgdHlwZQorICAgICAqIGNvbXBhcmlzb25zLgorICAgICAqCisgICAgICogT3V0cHV0IHN0YWNrIG1hcCBmcmFtZXMgYXJlIGNvbXB1dGVkIHJlbGF0aXZlbHkgdG8gdGhlIGlucHV0IGZyYW1lIG9mIHRoZQorICAgICAqIGJhc2ljIGJsb2NrLCB3aGljaCBpcyBub3QgeWV0IGtub3duIHdoZW4gb3V0cHV0IGZyYW1lcyBhcmUgY29tcHV0ZWQuIEl0CisgICAgICogaXMgdGhlcmVmb3JlIG5lY2Vzc2FyeSB0byBiZSBhYmxlIHRvIHJlcHJlc2VudCBhYnN0cmFjdCB0eXBlcyBzdWNoIGFzCisgICAgICogInRoZSB0eXBlIGF0IHBvc2l0aW9uIHggaW4gdGhlIGlucHV0IGZyYW1lIGxvY2FscyIgb3IgInRoZSB0eXBlIGF0CisgICAgICogcG9zaXRpb24geCBmcm9tIHRoZSB0b3Agb2YgdGhlIGlucHV0IGZyYW1lIHN0YWNrIiBvciBldmVuICJ0aGUgdHlwZSBhdAorICAgICAqIHBvc2l0aW9uIHggaW4gdGhlIGlucHV0IGZyYW1lLCB3aXRoIHkgbW9yZSAob3IgbGVzcykgYXJyYXkgZGltZW5zaW9ucyIuCisgICAgICogVGhpcyBleHBsYWlucyB0aGUgcmF0aGVyIGNvbXBsaWNhdGVkIHR5cGUgZm9ybWF0IHVzZWQgaW4gb3V0cHV0IGZyYW1lcy4KKyAgICAgKgorICAgICAqIFRoaXMgZm9ybWF0IGlzIHRoZSBmb2xsb3dpbmc6IERJTSBLSU5EIFZBTFVFICg0LCA0IGFuZCAyNCBiaXRzKS4gRElNIGlzIGEKKyAgICAgKiBzaWduZWQgbnVtYmVyIG9mIGFycmF5IGRpbWVuc2lvbnMgKGZyb20gLTggdG8gNykuIEtJTkQgaXMgZWl0aGVyIEJBU0UsCisgICAgICogTE9DQUwgb3IgU1RBQ0suIEJBU0UgaXMgdXNlZCBmb3IgdHlwZXMgdGhhdCBhcmUgbm90IHJlbGF0aXZlIHRvIHRoZSBpbnB1dAorICAgICAqIGZyYW1lLiBMT0NBTCBpcyB1c2VkIGZvciB0eXBlcyB0aGF0IGFyZSByZWxhdGl2ZSB0byB0aGUgaW5wdXQgbG9jYWwKKyAgICAgKiB2YXJpYWJsZSB0eXBlcy4gU1RBQ0sgaXMgdXNlZCBmb3IgdHlwZXMgdGhhdCBhcmUgcmVsYXRpdmUgdG8gdGhlIGlucHV0CisgICAgICogc3RhY2sgdHlwZXMuIFZBTFVFIGRlcGVuZHMgb24gS0lORC4gRm9yIExPQ0FMIHR5cGVzLCBpdCBpcyBhbiBpbmRleCBpbgorICAgICAqIHRoZSBpbnB1dCBsb2NhbCB2YXJpYWJsZSB0eXBlcy4gRm9yIFNUQUNLIHR5cGVzLCBpdCBpcyBhIHBvc2l0aW9uCisgICAgICogcmVsYXRpdmVseSB0byB0aGUgdG9wIG9mIGlucHV0IGZyYW1lIHN0YWNrLiBGb3IgQkFTRSB0eXBlcywgaXQgaXMgZWl0aGVyCisgICAgICogb25lIG9mIHRoZSBjb25zdGFudHMgZGVmaW5lZCBiZWxvdywgb3IgZm9yIE9CSkVDVCBhbmQgVU5JTklUSUFMSVpFRAorICAgICAqIHR5cGVzLCBhIHRhZyBhbmQgYW4gaW5kZXggaW4gdGhlIHR5cGUgdGFibGUuCisgICAgICoKKyAgICAgKiBPdXRwdXQgZnJhbWVzIGNhbiBjb250YWluIHR5cGVzIG9mIGFueSBraW5kIGFuZCB3aXRoIGEgcG9zaXRpdmUgb3IKKyAgICAgKiBuZWdhdGl2ZSBkaW1lbnNpb24gKGFuZCBldmVuIHVuYXNzaWduZWQgdHlwZXMsIHJlcHJlc2VudGVkIGJ5IDAgLSB3aGljaAorICAgICAqIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYW55IHZhbGlkIHR5cGUgdmFsdWUpLiBJbnB1dCBmcmFtZXMgY2FuIG9ubHkKKyAgICAgKiBjb250YWluIEJBU0UgdHlwZXMgb2YgcG9zaXRpdmUgb3IgbnVsbCBkaW1lbnNpb24uIEluIGFsbCBjYXNlcyB0aGUgdHlwZQorICAgICAqIHRhYmxlIGNvbnRhaW5zIG9ubHkgaW50ZXJuYWwgdHlwZSBuYW1lcyAoYXJyYXkgdHlwZSBkZXNjcmlwdG9ycyBhcmUKKyAgICAgKiBmb3JiaWRkZW4gLSBkaW1lbnNpb25zIG11c3QgYmUgcmVwcmVzZW50ZWQgdGhyb3VnaCB0aGUgRElNIGZpZWxkKS4KKyAgICAgKgorICAgICAqIFRoZSBMT05HIGFuZCBET1VCTEUgdHlwZXMgYXJlIGFsd2F5cyByZXByZXNlbnRlZCBieSB1c2luZyB0d28gc2xvdHMgKExPTkcKKyAgICAgKiArIFRPUCBvciBET1VCTEUgKyBUT1ApLCBmb3IgbG9jYWwgdmFyaWFibGUgdHlwZXMgYXMgd2VsbCBhcyBpbiB0aGUKKyAgICAgKiBvcGVyYW5kIHN0YWNrLiBUaGlzIGlzIG5lY2Vzc2FyeSB0byBiZSBhYmxlIHRvIHNpbXVsYXRlIERVUHhfeQorICAgICAqIGluc3RydWN0aW9ucywgd2hvc2UgZWZmZWN0IHdvdWxkIGJlIGRlcGVuZGVudCBvbiB0aGUgYWN0dWFsIHR5cGUgdmFsdWVzCisgICAgICogaWYgdHlwZXMgd2VyZSBhbHdheXMgcmVwcmVzZW50ZWQgYnkgYSBzaW5nbGUgc2xvdCBpbiB0aGUgc3RhY2sgKGFuZCB0aGlzCisgICAgICogaXMgbm90IHBvc3NpYmxlLCBzaW5jZSBhY3R1YWwgdHlwZSB2YWx1ZXMgYXJlIG5vdCBhbHdheXMga25vd24gLSBjZiBMT0NBTAorICAgICAqIGFuZCBTVEFDSyB0eXBlIGtpbmRzKS4KKyAgICAgKi8KKworICAgIC8qKgorICAgICAqIE1hc2sgdG8gZ2V0IHRoZSBkaW1lbnNpb24gb2YgYSBmcmFtZSB0eXBlLiBUaGlzIGRpbWVuc2lvbiBpcyBhIHNpZ25lZAorICAgICAqIGludGVnZXIgYmV0d2VlbiAtOCBhbmQgNy4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IERJTSA9IDB4RjAwMDAwMDA7CisKKyAgICAvKioKKyAgICAgKiBDb25zdGFudCB0byBiZSBhZGRlZCB0byBhIHR5cGUgdG8gZ2V0IGEgdHlwZSB3aXRoIG9uZSBtb3JlIGRpbWVuc2lvbi4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IEFSUkFZX09GID0gMHgxMDAwMDAwMDsKKworICAgIC8qKgorICAgICAqIENvbnN0YW50IHRvIGJlIGFkZGVkIHRvIGEgdHlwZSB0byBnZXQgYSB0eXBlIHdpdGggb25lIGxlc3MgZGltZW5zaW9uLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgRUxFTUVOVF9PRiA9IDB4RjAwMDAwMDA7CisKKyAgICAvKioKKyAgICAgKiBNYXNrIHRvIGdldCB0aGUga2luZCBvZiBhIGZyYW1lIHR5cGUuCisgICAgICoKKyAgICAgKiBAc2VlICNCQVNFCisgICAgICogQHNlZSAjTE9DQUwKKyAgICAgKiBAc2VlICNTVEFDSworICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgS0lORCA9IDB4RjAwMDAwMDsKKworICAgIC8qKgorICAgICAqIEZsYWcgdXNlZCBmb3IgTE9DQUwgYW5kIFNUQUNLIHR5cGVzLiBJbmRpY2F0ZXMgdGhhdCBpZiB0aGlzIHR5cGUgaGFwcGVucworICAgICAqIHRvIGJlIGEgbG9uZyBvciBkb3VibGUgdHlwZSAoZHVyaW5nIHRoZSBjb21wdXRhdGlvbnMgb2YgaW5wdXQgZnJhbWVzKSwKKyAgICAgKiB0aGVuIGl0IG11c3QgYmUgc2V0IHRvIFRPUCBiZWNhdXNlIHRoZSBzZWNvbmQgd29yZCBvZiB0aGlzIHZhbHVlIGhhcyBiZWVuCisgICAgICogcmV1c2VkIHRvIHN0b3JlIG90aGVyIGRhdGEgaW4gdGhlIGJhc2ljIGJsb2NrLiBIZW5jZSB0aGUgZmlyc3Qgd29yZCBubworICAgICAqIGxvbmdlciBzdG9yZXMgYSB2YWxpZCBsb25nIG9yIGRvdWJsZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IFRPUF9JRl9MT05HX09SX0RPVUJMRSA9IDB4ODAwMDAwOworCisgICAgLyoqCisgICAgICogTWFzayB0byBnZXQgdGhlIHZhbHVlIG9mIGEgZnJhbWUgdHlwZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IFZBTFVFID0gMHg3RkZGRkY7CisKKyAgICAvKioKKyAgICAgKiBNYXNrIHRvIGdldCB0aGUga2luZCBvZiBiYXNlIHR5cGVzLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgQkFTRV9LSU5EID0gMHhGRjAwMDAwOworCisgICAgLyoqCisgICAgICogTWFzayB0byBnZXQgdGhlIHZhbHVlIG9mIGJhc2UgdHlwZXMuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBCQVNFX1ZBTFVFID0gMHhGRkZGRjsKKworICAgIC8qKgorICAgICAqIEtpbmQgb2YgdGhlIHR5cGVzIHRoYXQgYXJlIG5vdCByZWxhdGl2ZSB0byBhbiBpbnB1dCBzdGFjayBtYXAgZnJhbWUuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBCQVNFID0gMHgxMDAwMDAwOworCisgICAgLyoqCisgICAgICogQmFzZSBraW5kIG9mIHRoZSBiYXNlIHJlZmVyZW5jZSB0eXBlcy4gVGhlIEJBU0VfVkFMVUUgb2Ygc3VjaCB0eXBlcyBpcyBhbgorICAgICAqIGluZGV4IGludG8gdGhlIHR5cGUgdGFibGUuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBPQkpFQ1QgPSBCQVNFIHwgMHg3MDAwMDA7CisKKyAgICAvKioKKyAgICAgKiBCYXNlIGtpbmQgb2YgdGhlIHVuaW5pdGlhbGl6ZWQgYmFzZSB0eXBlcy4gVGhlIEJBU0VfVkFMVUUgb2Ygc3VjaCB0eXBlcworICAgICAqIGluIGFuIGluZGV4IGludG8gdGhlIHR5cGUgdGFibGUgKHRoZSBJdGVtIGF0IHRoYXQgaW5kZXggY29udGFpbnMgYm90aCBhbgorICAgICAqIGluc3RydWN0aW9uIG9mZnNldCBhbmQgYW4gaW50ZXJuYWwgY2xhc3MgbmFtZSkuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBVTklOSVRJQUxJWkVEID0gQkFTRSB8IDB4ODAwMDAwOworCisgICAgLyoqCisgICAgICogS2luZCBvZiB0aGUgdHlwZXMgdGhhdCBhcmUgcmVsYXRpdmUgdG8gdGhlIGxvY2FsIHZhcmlhYmxlIHR5cGVzIG9mIGFuCisgICAgICogaW5wdXQgc3RhY2sgbWFwIGZyYW1lLiBUaGUgdmFsdWUgb2Ygc3VjaCB0eXBlcyBpcyBhIGxvY2FsIHZhcmlhYmxlIGluZGV4LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBMT0NBTCA9IDB4MjAwMDAwMDsKKworICAgIC8qKgorICAgICAqIEtpbmQgb2YgdGhlIHRoZSB0eXBlcyB0aGF0IGFyZSByZWxhdGl2ZSB0byB0aGUgc3RhY2sgb2YgYW4gaW5wdXQgc3RhY2sKKyAgICAgKiBtYXAgZnJhbWUuIFRoZSB2YWx1ZSBvZiBzdWNoIHR5cGVzIGlzIGEgcG9zaXRpb24gcmVsYXRpdmVseSB0byB0aGUgdG9wIG9mCisgICAgICogdGhpcyBzdGFjay4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBQ0sgPSAweDMwMDAwMDA7CisKKyAgICAvKioKKyAgICAgKiBUaGUgVE9QIHR5cGUuIFRoaXMgaXMgYSBCQVNFIHR5cGUuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBUT1AgPSBCQVNFIHwgMDsKKworICAgIC8qKgorICAgICAqIFRoZSBCT09MRUFOIHR5cGUuIFRoaXMgaXMgYSBCQVNFIHR5cGUgbWFpbmx5IHVzZWQgZm9yIGFycmF5IHR5cGVzLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgQk9PTEVBTiA9IEJBU0UgfCA5OworCisgICAgLyoqCisgICAgICogVGhlIEJZVEUgdHlwZS4gVGhpcyBpcyBhIEJBU0UgdHlwZSBtYWlubHkgdXNlZCBmb3IgYXJyYXkgdHlwZXMuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBCWVRFID0gQkFTRSB8IDEwOworCisgICAgLyoqCisgICAgICogVGhlIENIQVIgdHlwZS4gVGhpcyBpcyBhIEJBU0UgdHlwZSBtYWlubHkgdXNlZCBmb3IgYXJyYXkgdHlwZXMuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBDSEFSID0gQkFTRSB8IDExOworCisgICAgLyoqCisgICAgICogVGhlIFNIT1JUIHR5cGUuIFRoaXMgaXMgYSBCQVNFIHR5cGUgbWFpbmx5IHVzZWQgZm9yIGFycmF5IHR5cGVzLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgU0hPUlQgPSBCQVNFIHwgMTI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgSU5URUdFUiB0eXBlLiBUaGlzIGlzIGEgQkFTRSB0eXBlLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgSU5URUdFUiA9IEJBU0UgfCAxOworCisgICAgLyoqCisgICAgICogVGhlIEZMT0FUIHR5cGUuIFRoaXMgaXMgYSBCQVNFIHR5cGUuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBGTE9BVCA9IEJBU0UgfCAyOworCisgICAgLyoqCisgICAgICogVGhlIERPVUJMRSB0eXBlLiBUaGlzIGlzIGEgQkFTRSB0eXBlLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgRE9VQkxFID0gQkFTRSB8IDM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgTE9ORyB0eXBlLiBUaGlzIGlzIGEgQkFTRSB0eXBlLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgTE9ORyA9IEJBU0UgfCA0OworCisgICAgLyoqCisgICAgICogVGhlIE5VTEwgdHlwZS4gVGhpcyBpcyBhIEJBU0UgdHlwZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IE5VTEwgPSBCQVNFIHwgNTsKKworICAgIC8qKgorICAgICAqIFRoZSBVTklOSVRJQUxJWkVEX1RISVMgdHlwZS4gVGhpcyBpcyBhIEJBU0UgdHlwZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IFVOSU5JVElBTElaRURfVEhJUyA9IEJBU0UgfCA2OworCisgICAgLyoqCisgICAgICogVGhlIHN0YWNrIHNpemUgdmFyaWF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBKVk0gaW5zdHJ1Y3Rpb24uIFRoaXMKKyAgICAgKiBzdGFjayB2YXJpYXRpb24gaXMgZXF1YWwgdG8gdGhlIHNpemUgb2YgdGhlIHZhbHVlcyBwcm9kdWNlZCBieSBhbgorICAgICAqIGluc3RydWN0aW9uLCBtaW51cyB0aGUgc2l6ZSBvZiB0aGUgdmFsdWVzIGNvbnN1bWVkIGJ5IHRoaXMgaW5zdHJ1Y3Rpb24uCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludFtdIFNJWkU7CisKKyAgICAvKioKKyAgICAgKiBDb21wdXRlcyB0aGUgc3RhY2sgc2l6ZSB2YXJpYXRpb24gY29ycmVzcG9uZGluZyB0byBlYWNoIEpWTSBpbnN0cnVjdGlvbi4KKyAgICAgKi8KKyAgICBzdGF0aWMgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgaW50W10gYiA9IG5ldyBpbnRbMjAyXTsKKyAgICAgICAgU3RyaW5nIHMgPSAiRUZGRkZGRkZGR0dGRkZHR0ZGRkVFRkdGR0ZFRUVFRUVFRUVFRUVFRUVFRUVFRURFREVERERERCIKKyAgICAgICAgICAgICAgICAgICArICJDRENERUVFRUVFRUVFRUVFRUVFRUVFRUVCQUJBQkJCQkRDRkZGR0dHRURDRENEQ0RDRENEQ0RDRENEIgorICAgICAgICAgICAgICAgICAgICsgIkNEQ0VFRUVEREREREREQ0RDRENFRkVGRERFRUZGREVERUVFQkREQkJERERERERDQ0NDQ0NDQ0VGRUQiCisgICAgICAgICAgICAgICAgICAgKyAiRERDRENERUVFRUVFRUVFRUZFRUVFRUVEREVFRERFRSI7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBiLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBiW2ldID0gcy5jaGFyQXQoaSkgLSAnRSc7CisgICAgICAgIH0KKyAgICAgICAgU0laRSA9IGI7CisKKyAgICAgICAgLy8gY29kZSB0byBnZW5lcmF0ZSB0aGUgYWJvdmUgc3RyaW5nCisgICAgICAgIC8vCisgICAgICAgIC8vIGludCBOQSA9IDA7IC8vIG5vdCBhcHBsaWNhYmxlICh1bnVzZWQgb3Bjb2RlIG9yIHZhcmlhYmxlIHNpemUgb3Bjb2RlKQorICAgICAgICAvLworICAgICAgICAvLyBiID0gbmV3IGludFtdIHsKKyAgICAgICAgLy8gMCwgLy9OT1AsIC8vIHZpc2l0SW5zbgorICAgICAgICAvLyAxLCAvL0FDT05TVF9OVUxMLCAvLyAtCisgICAgICAgIC8vIDEsIC8vSUNPTlNUX00xLCAvLyAtCisgICAgICAgIC8vIDEsIC8vSUNPTlNUXzAsIC8vIC0KKyAgICAgICAgLy8gMSwgLy9JQ09OU1RfMSwgLy8gLQorICAgICAgICAvLyAxLCAvL0lDT05TVF8yLCAvLyAtCisgICAgICAgIC8vIDEsIC8vSUNPTlNUXzMsIC8vIC0KKyAgICAgICAgLy8gMSwgLy9JQ09OU1RfNCwgLy8gLQorICAgICAgICAvLyAxLCAvL0lDT05TVF81LCAvLyAtCisgICAgICAgIC8vIDIsIC8vTENPTlNUXzAsIC8vIC0KKyAgICAgICAgLy8gMiwgLy9MQ09OU1RfMSwgLy8gLQorICAgICAgICAvLyAxLCAvL0ZDT05TVF8wLCAvLyAtCisgICAgICAgIC8vIDEsIC8vRkNPTlNUXzEsIC8vIC0KKyAgICAgICAgLy8gMSwgLy9GQ09OU1RfMiwgLy8gLQorICAgICAgICAvLyAyLCAvL0RDT05TVF8wLCAvLyAtCisgICAgICAgIC8vIDIsIC8vRENPTlNUXzEsIC8vIC0KKyAgICAgICAgLy8gMSwgLy9CSVBVU0gsIC8vIHZpc2l0SW50SW5zbgorICAgICAgICAvLyAxLCAvL1NJUFVTSCwgLy8gLQorICAgICAgICAvLyAxLCAvL0xEQywgLy8gdmlzaXRMZGNJbnNuCisgICAgICAgIC8vIE5BLCAvL0xEQ19XLCAvLyAtCisgICAgICAgIC8vIE5BLCAvL0xEQzJfVywgLy8gLQorICAgICAgICAvLyAxLCAvL0lMT0FELCAvLyB2aXNpdFZhckluc24KKyAgICAgICAgLy8gMiwgLy9MTE9BRCwgLy8gLQorICAgICAgICAvLyAxLCAvL0ZMT0FELCAvLyAtCisgICAgICAgIC8vIDIsIC8vRExPQUQsIC8vIC0KKyAgICAgICAgLy8gMSwgLy9BTE9BRCwgLy8gLQorICAgICAgICAvLyBOQSwgLy9JTE9BRF8wLCAvLyAtCisgICAgICAgIC8vIE5BLCAvL0lMT0FEXzEsIC8vIC0KKyAgICAgICAgLy8gTkEsIC8vSUxPQURfMiwgLy8gLQorICAgICAgICAvLyBOQSwgLy9JTE9BRF8zLCAvLyAtCisgICAgICAgIC8vIE5BLCAvL0xMT0FEXzAsIC8vIC0KKyAgICAgICAgLy8gTkEsIC8vTExPQURfMSwgLy8gLQorICAgICAgICAvLyBOQSwgLy9MTE9BRF8yLCAvLyAtCisgICAgICAgIC8vIE5BLCAvL0xMT0FEXzMsIC8vIC0KKyAgICAgICAgLy8gTkEsIC8vRkxPQURfMCwgLy8gLQorICAgICAgICAvLyBOQSwgLy9GTE9BRF8xLCAvLyAtCisgICAgICAgIC8vIE5BLCAvL0ZMT0FEXzIsIC8vIC0KKyAgICAgICAgLy8gTkEsIC8vRkxPQURfMywgLy8gLQorICAgICAgICAvLyBOQSwgLy9ETE9BRF8wLCAvLyAtCisgICAgICAgIC8vIE5BLCAvL0RMT0FEXzEsIC8vIC0KKyAgICAgICAgLy8gTkEsIC8vRExPQURfMiwgLy8gLQorICAgICAgICAvLyBOQSwgLy9ETE9BRF8zLCAvLyAtCisgICAgICAgIC8vIE5BLCAvL0FMT0FEXzAsIC8vIC0KKyAgICAgICAgLy8gTkEsIC8vQUxPQURfMSwgLy8gLQorICAgICAgICAvLyBOQSwgLy9BTE9BRF8yLCAvLyAtCisgICAgICAgIC8vIE5BLCAvL0FMT0FEXzMsIC8vIC0KKyAgICAgICAgLy8gLTEsIC8vSUFMT0FELCAvLyB2aXNpdEluc24KKyAgICAgICAgLy8gMCwgLy9MQUxPQUQsIC8vIC0KKyAgICAgICAgLy8gLTEsIC8vRkFMT0FELCAvLyAtCisgICAgICAgIC8vIDAsIC8vREFMT0FELCAvLyAtCisgICAgICAgIC8vIC0xLCAvL0FBTE9BRCwgLy8gLQorICAgICAgICAvLyAtMSwgLy9CQUxPQUQsIC8vIC0KKyAgICAgICAgLy8gLTEsIC8vQ0FMT0FELCAvLyAtCisgICAgICAgIC8vIC0xLCAvL1NBTE9BRCwgLy8gLQorICAgICAgICAvLyAtMSwgLy9JU1RPUkUsIC8vIHZpc2l0VmFySW5zbgorICAgICAgICAvLyAtMiwgLy9MU1RPUkUsIC8vIC0KKyAgICAgICAgLy8gLTEsIC8vRlNUT1JFLCAvLyAtCisgICAgICAgIC8vIC0yLCAvL0RTVE9SRSwgLy8gLQorICAgICAgICAvLyAtMSwgLy9BU1RPUkUsIC8vIC0KKyAgICAgICAgLy8gTkEsIC8vSVNUT1JFXzAsIC8vIC0KKyAgICAgICAgLy8gTkEsIC8vSVNUT1JFXzEsIC8vIC0KKyAgICAgICAgLy8gTkEsIC8vSVNUT1JFXzIsIC8vIC0KKyAgICAgICAgLy8gTkEsIC8vSVNUT1JFXzMsIC8vIC0KKyAgICAgICAgLy8gTkEsIC8vTFNUT1JFXzAsIC8vIC0KKyAgICAgICAgLy8gTkEsIC8vTFNUT1JFXzEsIC8vIC0KKyAgICAgICAgLy8gTkEsIC8vTFNUT1JFXzIsIC8vIC0KKyAgICAgICAgLy8gTkEsIC8vTFNUT1JFXzMsIC8vIC0KKyAgICAgICAgLy8gTkEsIC8vRlNUT1JFXzAsIC8vIC0KKyAgICAgICAgLy8gTkEsIC8vRlNUT1JFXzEsIC8vIC0KKyAgICAgICAgLy8gTkEsIC8vRlNUT1JFXzIsIC8vIC0KKyAgICAgICAgLy8gTkEsIC8vRlNUT1JFXzMsIC8vIC0KKyAgICAgICAgLy8gTkEsIC8vRFNUT1JFXzAsIC8vIC0KKyAgICAgICAgLy8gTkEsIC8vRFNUT1JFXzEsIC8vIC0KKyAgICAgICAgLy8gTkEsIC8vRFNUT1JFXzIsIC8vIC0KKyAgICAgICAgLy8gTkEsIC8vRFNUT1JFXzMsIC8vIC0KKyAgICAgICAgLy8gTkEsIC8vQVNUT1JFXzAsIC8vIC0KKyAgICAgICAgLy8gTkEsIC8vQVNUT1JFXzEsIC8vIC0KKyAgICAgICAgLy8gTkEsIC8vQVNUT1JFXzIsIC8vIC0KKyAgICAgICAgLy8gTkEsIC8vQVNUT1JFXzMsIC8vIC0KKyAgICAgICAgLy8gLTMsIC8vSUFTVE9SRSwgLy8gdmlzaXRJbnNuCisgICAgICAgIC8vIC00LCAvL0xBU1RPUkUsIC8vIC0KKyAgICAgICAgLy8gLTMsIC8vRkFTVE9SRSwgLy8gLQorICAgICAgICAvLyAtNCwgLy9EQVNUT1JFLCAvLyAtCisgICAgICAgIC8vIC0zLCAvL0FBU1RPUkUsIC8vIC0KKyAgICAgICAgLy8gLTMsIC8vQkFTVE9SRSwgLy8gLQorICAgICAgICAvLyAtMywgLy9DQVNUT1JFLCAvLyAtCisgICAgICAgIC8vIC0zLCAvL1NBU1RPUkUsIC8vIC0KKyAgICAgICAgLy8gLTEsIC8vUE9QLCAvLyAtCisgICAgICAgIC8vIC0yLCAvL1BPUDIsIC8vIC0KKyAgICAgICAgLy8gMSwgLy9EVVAsIC8vIC0KKyAgICAgICAgLy8gMSwgLy9EVVBfWDEsIC8vIC0KKyAgICAgICAgLy8gMSwgLy9EVVBfWDIsIC8vIC0KKyAgICAgICAgLy8gMiwgLy9EVVAyLCAvLyAtCisgICAgICAgIC8vIDIsIC8vRFVQMl9YMSwgLy8gLQorICAgICAgICAvLyAyLCAvL0RVUDJfWDIsIC8vIC0KKyAgICAgICAgLy8gMCwgLy9TV0FQLCAvLyAtCisgICAgICAgIC8vIC0xLCAvL0lBREQsIC8vIC0KKyAgICAgICAgLy8gLTIsIC8vTEFERCwgLy8gLQorICAgICAgICAvLyAtMSwgLy9GQURELCAvLyAtCisgICAgICAgIC8vIC0yLCAvL0RBREQsIC8vIC0KKyAgICAgICAgLy8gLTEsIC8vSVNVQiwgLy8gLQorICAgICAgICAvLyAtMiwgLy9MU1VCLCAvLyAtCisgICAgICAgIC8vIC0xLCAvL0ZTVUIsIC8vIC0KKyAgICAgICAgLy8gLTIsIC8vRFNVQiwgLy8gLQorICAgICAgICAvLyAtMSwgLy9JTVVMLCAvLyAtCisgICAgICAgIC8vIC0yLCAvL0xNVUwsIC8vIC0KKyAgICAgICAgLy8gLTEsIC8vRk1VTCwgLy8gLQorICAgICAgICAvLyAtMiwgLy9ETVVMLCAvLyAtCisgICAgICAgIC8vIC0xLCAvL0lESVYsIC8vIC0KKyAgICAgICAgLy8gLTIsIC8vTERJViwgLy8gLQorICAgICAgICAvLyAtMSwgLy9GRElWLCAvLyAtCisgICAgICAgIC8vIC0yLCAvL0RESVYsIC8vIC0KKyAgICAgICAgLy8gLTEsIC8vSVJFTSwgLy8gLQorICAgICAgICAvLyAtMiwgLy9MUkVNLCAvLyAtCisgICAgICAgIC8vIC0xLCAvL0ZSRU0sIC8vIC0KKyAgICAgICAgLy8gLTIsIC8vRFJFTSwgLy8gLQorICAgICAgICAvLyAwLCAvL0lORUcsIC8vIC0KKyAgICAgICAgLy8gMCwgLy9MTkVHLCAvLyAtCisgICAgICAgIC8vIDAsIC8vRk5FRywgLy8gLQorICAgICAgICAvLyAwLCAvL0RORUcsIC8vIC0KKyAgICAgICAgLy8gLTEsIC8vSVNITCwgLy8gLQorICAgICAgICAvLyAtMSwgLy9MU0hMLCAvLyAtCisgICAgICAgIC8vIC0xLCAvL0lTSFIsIC8vIC0KKyAgICAgICAgLy8gLTEsIC8vTFNIUiwgLy8gLQorICAgICAgICAvLyAtMSwgLy9JVVNIUiwgLy8gLQorICAgICAgICAvLyAtMSwgLy9MVVNIUiwgLy8gLQorICAgICAgICAvLyAtMSwgLy9JQU5ELCAvLyAtCisgICAgICAgIC8vIC0yLCAvL0xBTkQsIC8vIC0KKyAgICAgICAgLy8gLTEsIC8vSU9SLCAvLyAtCisgICAgICAgIC8vIC0yLCAvL0xPUiwgLy8gLQorICAgICAgICAvLyAtMSwgLy9JWE9SLCAvLyAtCisgICAgICAgIC8vIC0yLCAvL0xYT1IsIC8vIC0KKyAgICAgICAgLy8gMCwgLy9JSU5DLCAvLyB2aXNpdElpbmNJbnNuCisgICAgICAgIC8vIDEsIC8vSTJMLCAvLyB2aXNpdEluc24KKyAgICAgICAgLy8gMCwgLy9JMkYsIC8vIC0KKyAgICAgICAgLy8gMSwgLy9JMkQsIC8vIC0KKyAgICAgICAgLy8gLTEsIC8vTDJJLCAvLyAtCisgICAgICAgIC8vIC0xLCAvL0wyRiwgLy8gLQorICAgICAgICAvLyAwLCAvL0wyRCwgLy8gLQorICAgICAgICAvLyAwLCAvL0YySSwgLy8gLQorICAgICAgICAvLyAxLCAvL0YyTCwgLy8gLQorICAgICAgICAvLyAxLCAvL0YyRCwgLy8gLQorICAgICAgICAvLyAtMSwgLy9EMkksIC8vIC0KKyAgICAgICAgLy8gMCwgLy9EMkwsIC8vIC0KKyAgICAgICAgLy8gLTEsIC8vRDJGLCAvLyAtCisgICAgICAgIC8vIDAsIC8vSTJCLCAvLyAtCisgICAgICAgIC8vIDAsIC8vSTJDLCAvLyAtCisgICAgICAgIC8vIDAsIC8vSTJTLCAvLyAtCisgICAgICAgIC8vIC0zLCAvL0xDTVAsIC8vIC0KKyAgICAgICAgLy8gLTEsIC8vRkNNUEwsIC8vIC0KKyAgICAgICAgLy8gLTEsIC8vRkNNUEcsIC8vIC0KKyAgICAgICAgLy8gLTMsIC8vRENNUEwsIC8vIC0KKyAgICAgICAgLy8gLTMsIC8vRENNUEcsIC8vIC0KKyAgICAgICAgLy8gLTEsIC8vSUZFUSwgLy8gdmlzaXRKdW1wSW5zbgorICAgICAgICAvLyAtMSwgLy9JRk5FLCAvLyAtCisgICAgICAgIC8vIC0xLCAvL0lGTFQsIC8vIC0KKyAgICAgICAgLy8gLTEsIC8vSUZHRSwgLy8gLQorICAgICAgICAvLyAtMSwgLy9JRkdULCAvLyAtCisgICAgICAgIC8vIC0xLCAvL0lGTEUsIC8vIC0KKyAgICAgICAgLy8gLTIsIC8vSUZfSUNNUEVRLCAvLyAtCisgICAgICAgIC8vIC0yLCAvL0lGX0lDTVBORSwgLy8gLQorICAgICAgICAvLyAtMiwgLy9JRl9JQ01QTFQsIC8vIC0KKyAgICAgICAgLy8gLTIsIC8vSUZfSUNNUEdFLCAvLyAtCisgICAgICAgIC8vIC0yLCAvL0lGX0lDTVBHVCwgLy8gLQorICAgICAgICAvLyAtMiwgLy9JRl9JQ01QTEUsIC8vIC0KKyAgICAgICAgLy8gLTIsIC8vSUZfQUNNUEVRLCAvLyAtCisgICAgICAgIC8vIC0yLCAvL0lGX0FDTVBORSwgLy8gLQorICAgICAgICAvLyAwLCAvL0dPVE8sIC8vIC0KKyAgICAgICAgLy8gMSwgLy9KU1IsIC8vIC0KKyAgICAgICAgLy8gMCwgLy9SRVQsIC8vIHZpc2l0VmFySW5zbgorICAgICAgICAvLyAtMSwgLy9UQUJMRVNXSVRDSCwgLy8gdmlzaVRhYmxlU3dpdGNoSW5zbgorICAgICAgICAvLyAtMSwgLy9MT09LVVBTV0lUQ0gsIC8vIHZpc2l0TG9va3VwU3dpdGNoCisgICAgICAgIC8vIC0xLCAvL0lSRVRVUk4sIC8vIHZpc2l0SW5zbgorICAgICAgICAvLyAtMiwgLy9MUkVUVVJOLCAvLyAtCisgICAgICAgIC8vIC0xLCAvL0ZSRVRVUk4sIC8vIC0KKyAgICAgICAgLy8gLTIsIC8vRFJFVFVSTiwgLy8gLQorICAgICAgICAvLyAtMSwgLy9BUkVUVVJOLCAvLyAtCisgICAgICAgIC8vIDAsIC8vUkVUVVJOLCAvLyAtCisgICAgICAgIC8vIE5BLCAvL0dFVFNUQVRJQywgLy8gdmlzaXRGaWVsZEluc24KKyAgICAgICAgLy8gTkEsIC8vUFVUU1RBVElDLCAvLyAtCisgICAgICAgIC8vIE5BLCAvL0dFVEZJRUxELCAvLyAtCisgICAgICAgIC8vIE5BLCAvL1BVVEZJRUxELCAvLyAtCisgICAgICAgIC8vIE5BLCAvL0lOVk9LRVZJUlRVQUwsIC8vIHZpc2l0TWV0aG9kSW5zbgorICAgICAgICAvLyBOQSwgLy9JTlZPS0VTUEVDSUFMLCAvLyAtCisgICAgICAgIC8vIE5BLCAvL0lOVk9LRVNUQVRJQywgLy8gLQorICAgICAgICAvLyBOQSwgLy9JTlZPS0VJTlRFUkZBQ0UsIC8vIC0KKyAgICAgICAgLy8gTkEsIC8vSU5WT0tFRFlOQU1JQywgLy8gdmlzaXRJbnZva2VEeW5hbWljSW5zbgorICAgICAgICAvLyAxLCAvL05FVywgLy8gdmlzaXRUeXBlSW5zbgorICAgICAgICAvLyAwLCAvL05FV0FSUkFZLCAvLyB2aXNpdEludEluc24KKyAgICAgICAgLy8gMCwgLy9BTkVXQVJSQVksIC8vIHZpc2l0VHlwZUluc24KKyAgICAgICAgLy8gMCwgLy9BUlJBWUxFTkdUSCwgLy8gdmlzaXRJbnNuCisgICAgICAgIC8vIE5BLCAvL0FUSFJPVywgLy8gLQorICAgICAgICAvLyAwLCAvL0NIRUNLQ0FTVCwgLy8gdmlzaXRUeXBlSW5zbgorICAgICAgICAvLyAwLCAvL0lOU1RBTkNFT0YsIC8vIC0KKyAgICAgICAgLy8gLTEsIC8vTU9OSVRPUkVOVEVSLCAvLyB2aXNpdEluc24KKyAgICAgICAgLy8gLTEsIC8vTU9OSVRPUkVYSVQsIC8vIC0KKyAgICAgICAgLy8gTkEsIC8vV0lERSwgLy8gTk9UIFZJU0lURUQKKyAgICAgICAgLy8gTkEsIC8vTVVMVElBTkVXQVJSQVksIC8vIHZpc2l0TXVsdGlBTmV3QXJyYXlJbnNuCisgICAgICAgIC8vIC0xLCAvL0lGTlVMTCwgLy8gdmlzaXRKdW1wSW5zbgorICAgICAgICAvLyAtMSwgLy9JRk5PTk5VTEwsIC8vIC0KKyAgICAgICAgLy8gTkEsIC8vR09UT19XLCAvLyAtCisgICAgICAgIC8vIE5BLCAvL0pTUl9XLCAvLyAtCisgICAgICAgIC8vIH07CisgICAgICAgIC8vIGZvciAoaSA9IDA7IGkgPCBiLmxlbmd0aDsgKytpKSB7CisgICAgICAgIC8vIFN5c3RlbS5lcnIucHJpbnQoKGNoYXIpKCdFJyArIGJbaV0pKTsKKyAgICAgICAgLy8gfQorICAgICAgICAvLyBTeXN0ZW0uZXJyLnByaW50bG4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbGFiZWwgKGkuZS4gYmFzaWMgYmxvY2spIHRvIHdoaWNoIHRoZXNlIGlucHV0IGFuZCBvdXRwdXQgc3RhY2sgbWFwCisgICAgICogZnJhbWVzIGNvcnJlc3BvbmQuCisgICAgICovCisgICAgTGFiZWwgb3duZXI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaW5wdXQgc3RhY2sgbWFwIGZyYW1lIGxvY2Fscy4KKyAgICAgKi8KKyAgICBpbnRbXSBpbnB1dExvY2FsczsKKworICAgIC8qKgorICAgICAqIFRoZSBpbnB1dCBzdGFjayBtYXAgZnJhbWUgc3RhY2suCisgICAgICovCisgICAgaW50W10gaW5wdXRTdGFjazsKKworICAgIC8qKgorICAgICAqIFRoZSBvdXRwdXQgc3RhY2sgbWFwIGZyYW1lIGxvY2Fscy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludFtdIG91dHB1dExvY2FsczsKKworICAgIC8qKgorICAgICAqIFRoZSBvdXRwdXQgc3RhY2sgbWFwIGZyYW1lIHN0YWNrLgorICAgICAqLworICAgIHByaXZhdGUgaW50W10gb3V0cHV0U3RhY2s7CisKKyAgICAvKioKKyAgICAgKiBSZWxhdGl2ZSBzaXplIG9mIHRoZSBvdXRwdXQgc3RhY2suIFRoZSBleGFjdCBzZW1hbnRpY3Mgb2YgdGhpcyBmaWVsZAorICAgICAqIGRlcGVuZHMgb24gdGhlIGFsZ29yaXRobSB0aGF0IGlzIHVzZWQuCisgICAgICoKKyAgICAgKiBXaGVuIG9ubHkgdGhlIG1heGltdW0gc3RhY2sgc2l6ZSBpcyBjb21wdXRlZCwgdGhpcyBmaWVsZCBpcyB0aGUgc2l6ZSBvZgorICAgICAqIHRoZSBvdXRwdXQgc3RhY2sgcmVsYXRpdmVseSB0byB0aGUgdG9wIG9mIHRoZSBpbnB1dCBzdGFjay4KKyAgICAgKgorICAgICAqIFdoZW4gdGhlIHN0YWNrIG1hcCBmcmFtZXMgYXJlIGNvbXBsZXRlbHkgY29tcHV0ZWQsIHRoaXMgZmllbGQgaXMgdGhlCisgICAgICogYWN0dWFsIG51bWJlciBvZiB0eXBlcyBpbiB7QGxpbmsgI291dHB1dFN0YWNrfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBvdXRwdXRTdGFja1RvcDsKKworICAgIC8qKgorICAgICAqIE51bWJlciBvZiB0eXBlcyB0aGF0IGFyZSBpbml0aWFsaXplZCBpbiB0aGUgYmFzaWMgYmxvY2suCisgICAgICoKKyAgICAgKiBAc2VlICNpbml0aWFsaXphdGlvbnMKKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBpbml0aWFsaXphdGlvbkNvdW50OworCisgICAgLyoqCisgICAgICogVGhlIHR5cGVzIHRoYXQgYXJlIGluaXRpYWxpemVkIGluIHRoZSBiYXNpYyBibG9jay4gQSBjb25zdHJ1Y3RvcgorICAgICAqIGludm9jYXRpb24gb24gYW4gVU5JTklUSUFMSVpFRCBvciBVTklOSVRJQUxJWkVEX1RISVMgdHlwZSBtdXN0IHJlcGxhY2UKKyAgICAgKiA8aT5ldmVyeSBvY2N1cmVuY2U8L2k+IG9mIHRoaXMgdHlwZSBpbiB0aGUgbG9jYWwgdmFyaWFibGVzIGFuZCBpbiB0aGUKKyAgICAgKiBvcGVyYW5kIHN0YWNrLiBUaGlzIGNhbm5vdCBiZSBkb25lIGR1cmluZyB0aGUgZmlyc3QgcGhhc2Ugb2YgdGhlCisgICAgICogYWxnb3JpdGhtIHNpbmNlLCBkdXJpbmcgdGhpcyBwaGFzZSwgdGhlIGxvY2FsIHZhcmlhYmxlcyBhbmQgdGhlIG9wZXJhbmQKKyAgICAgKiBzdGFjayBhcmUgbm90IGNvbXBsZXRlbHkgY29tcHV0ZWQuIEl0IGlzIHRoZXJlZm9yZSBuZWNlc3NhcnkgdG8gc3RvcmUgdGhlCisgICAgICogdHlwZXMgb24gd2hpY2ggY29uc3RydWN0b3JzIGFyZSBpbnZva2VkIGluIHRoZSBiYXNpYyBibG9jaywgaW4gb3JkZXIgdG8KKyAgICAgKiBkbyB0aGlzIHJlcGxhY2VtZW50IGR1cmluZyB0aGUgc2Vjb25kIHBoYXNlIG9mIHRoZSBhbGdvcml0aG0sIHdoZXJlIHRoZQorICAgICAqIGZyYW1lcyBhcmUgZnVsbHkgY29tcHV0ZWQuIE5vdGUgdGhhdCB0aGlzIGFycmF5IGNhbiBjb250YWluIHR5cGVzIHRoYXQKKyAgICAgKiBhcmUgcmVsYXRpdmUgdG8gaW5wdXQgbG9jYWxzIG9yIHRvIHRoZSBpbnB1dCBzdGFjayAoc2VlIGJlbG93IGZvciB0aGUKKyAgICAgKiBkZXNjcmlwdGlvbiBvZiB0aGUgYWxnb3JpdGhtKS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludFtdIGluaXRpYWxpemF0aW9uczsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG91dHB1dCBmcmFtZSBsb2NhbCB2YXJpYWJsZSB0eXBlIGF0IHRoZSBnaXZlbiBpbmRleC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2NhbAorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIHRoZSBsb2NhbCB0aGF0IG11c3QgYmUgcmV0dXJuZWQuCisgICAgICogQHJldHVybiB0aGUgb3V0cHV0IGZyYW1lIGxvY2FsIHZhcmlhYmxlIHR5cGUgYXQgdGhlIGdpdmVuIGluZGV4LgorICAgICAqLworICAgIHByaXZhdGUgaW50IGdldChmaW5hbCBpbnQgbG9jYWwpIHsKKyAgICAgICAgaWYgKG91dHB1dExvY2FscyA9PSBudWxsIHx8IGxvY2FsID49IG91dHB1dExvY2Fscy5sZW5ndGgpIHsKKyAgICAgICAgICAgIC8vIHRoaXMgbG9jYWwgaGFzIG5ldmVyIGJlZW4gYXNzaWduZWQgaW4gdGhpcyBiYXNpYyBibG9jaywKKyAgICAgICAgICAgIC8vIHNvIGl0IGlzIHN0aWxsIGVxdWFsIHRvIGl0cyB2YWx1ZSBpbiB0aGUgaW5wdXQgZnJhbWUKKyAgICAgICAgICAgIHJldHVybiBMT0NBTCB8IGxvY2FsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IHR5cGUgPSBvdXRwdXRMb2NhbHNbbG9jYWxdOworICAgICAgICAgICAgaWYgKHR5cGUgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIHRoaXMgbG9jYWwgaGFzIG5ldmVyIGJlZW4gYXNzaWduZWQgaW4gdGhpcyBiYXNpYyBibG9jaywKKyAgICAgICAgICAgICAgICAvLyBzbyBpdCBpcyBzdGlsbCBlcXVhbCB0byBpdHMgdmFsdWUgaW4gdGhlIGlucHV0IGZyYW1lCisgICAgICAgICAgICAgICAgdHlwZSA9IG91dHB1dExvY2Fsc1tsb2NhbF0gPSBMT0NBTCB8IGxvY2FsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBvdXRwdXQgZnJhbWUgbG9jYWwgdmFyaWFibGUgdHlwZSBhdCB0aGUgZ2l2ZW4gaW5kZXguCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9jYWwKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiB0aGUgbG9jYWwgdGhhdCBtdXN0IGJlIHNldC4KKyAgICAgKiBAcGFyYW0gdHlwZQorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIG9mIHRoZSBsb2NhbCB0aGF0IG11c3QgYmUgc2V0LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBzZXQoZmluYWwgaW50IGxvY2FsLCBmaW5hbCBpbnQgdHlwZSkgeworICAgICAgICAvLyBjcmVhdGVzIGFuZC9vciByZXNpemVzIHRoZSBvdXRwdXQgbG9jYWwgdmFyaWFibGVzIGFycmF5IGlmIG5lY2Vzc2FyeQorICAgICAgICBpZiAob3V0cHV0TG9jYWxzID09IG51bGwpIHsKKyAgICAgICAgICAgIG91dHB1dExvY2FscyA9IG5ldyBpbnRbMTBdOworICAgICAgICB9CisgICAgICAgIGludCBuID0gb3V0cHV0TG9jYWxzLmxlbmd0aDsKKyAgICAgICAgaWYgKGxvY2FsID49IG4pIHsKKyAgICAgICAgICAgIGludFtdIHQgPSBuZXcgaW50W01hdGgubWF4KGxvY2FsICsgMSwgMiAqIG4pXTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkob3V0cHV0TG9jYWxzLCAwLCB0LCAwLCBuKTsKKyAgICAgICAgICAgIG91dHB1dExvY2FscyA9IHQ7CisgICAgICAgIH0KKyAgICAgICAgLy8gc2V0cyB0aGUgbG9jYWwgdmFyaWFibGUKKyAgICAgICAgb3V0cHV0TG9jYWxzW2xvY2FsXSA9IHR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHVzaGVzIGEgbmV3IHR5cGUgb250byB0aGUgb3V0cHV0IGZyYW1lIHN0YWNrLgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSB0eXBlIHRoYXQgbXVzdCBiZSBwdXNoZWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHB1c2goZmluYWwgaW50IHR5cGUpIHsKKyAgICAgICAgLy8gY3JlYXRlcyBhbmQvb3IgcmVzaXplcyB0aGUgb3V0cHV0IHN0YWNrIGFycmF5IGlmIG5lY2Vzc2FyeQorICAgICAgICBpZiAob3V0cHV0U3RhY2sgPT0gbnVsbCkgeworICAgICAgICAgICAgb3V0cHV0U3RhY2sgPSBuZXcgaW50WzEwXTsKKyAgICAgICAgfQorICAgICAgICBpbnQgbiA9IG91dHB1dFN0YWNrLmxlbmd0aDsKKyAgICAgICAgaWYgKG91dHB1dFN0YWNrVG9wID49IG4pIHsKKyAgICAgICAgICAgIGludFtdIHQgPSBuZXcgaW50W01hdGgubWF4KG91dHB1dFN0YWNrVG9wICsgMSwgMiAqIG4pXTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkob3V0cHV0U3RhY2ssIDAsIHQsIDAsIG4pOworICAgICAgICAgICAgb3V0cHV0U3RhY2sgPSB0OworICAgICAgICB9CisgICAgICAgIC8vIHB1c2hlcyB0aGUgdHlwZSBvbiB0aGUgb3V0cHV0IHN0YWNrCisgICAgICAgIG91dHB1dFN0YWNrW291dHB1dFN0YWNrVG9wKytdID0gdHlwZTsKKyAgICAgICAgLy8gdXBkYXRlcyB0aGUgbWF4aW11biBoZWlnaHQgcmVhY2hlZCBieSB0aGUgb3V0cHV0IHN0YWNrLCBpZiBuZWVkZWQKKyAgICAgICAgaW50IHRvcCA9IG93bmVyLmlucHV0U3RhY2tUb3AgKyBvdXRwdXRTdGFja1RvcDsKKyAgICAgICAgaWYgKHRvcCA+IG93bmVyLm91dHB1dFN0YWNrTWF4KSB7CisgICAgICAgICAgICBvd25lci5vdXRwdXRTdGFja01heCA9IHRvcDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFB1c2hlcyBhIG5ldyB0eXBlIG9udG8gdGhlIG91dHB1dCBmcmFtZSBzdGFjay4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjdworICAgICAqICAgICAgICAgICAgdGhlIENsYXNzV3JpdGVyIHRvIHdoaWNoIHRoaXMgbGFiZWwgYmVsb25ncy4KKyAgICAgKiBAcGFyYW0gZGVzYworICAgICAqICAgICAgICAgICAgdGhlIGRlc2NyaXB0b3Igb2YgdGhlIHR5cGUgdG8gYmUgcHVzaGVkLiBDYW4gYWxzbyBiZSBhIG1ldGhvZAorICAgICAqICAgICAgICAgICAgZGVzY3JpcHRvciAoaW4gdGhpcyBjYXNlIHRoaXMgbWV0aG9kIHB1c2hlcyBpdHMgcmV0dXJuIHR5cGUKKyAgICAgKiAgICAgICAgICAgIG9udG8gdGhlIG91dHB1dCBmcmFtZSBzdGFjaykuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHB1c2goZmluYWwgQ2xhc3NXcml0ZXIgY3csIGZpbmFsIFN0cmluZyBkZXNjKSB7CisgICAgICAgIGludCB0eXBlID0gdHlwZShjdywgZGVzYyk7CisgICAgICAgIGlmICh0eXBlICE9IDApIHsKKyAgICAgICAgICAgIHB1c2godHlwZSk7CisgICAgICAgICAgICBpZiAodHlwZSA9PSBMT05HIHx8IHR5cGUgPT0gRE9VQkxFKSB7CisgICAgICAgICAgICAgICAgcHVzaChUT1ApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgaW50IGVuY29kaW5nIG9mIHRoZSBnaXZlbiB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIGN3CisgICAgICogICAgICAgICAgICB0aGUgQ2xhc3NXcml0ZXIgdG8gd2hpY2ggdGhpcyBsYWJlbCBiZWxvbmdzLgorICAgICAqIEBwYXJhbSBkZXNjCisgICAgICogICAgICAgICAgICBhIHR5cGUgZGVzY3JpcHRvci4KKyAgICAgKiBAcmV0dXJuIHRoZSBpbnQgZW5jb2Rpbmcgb2YgdGhlIGdpdmVuIHR5cGUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHR5cGUoZmluYWwgQ2xhc3NXcml0ZXIgY3csIGZpbmFsIFN0cmluZyBkZXNjKSB7CisgICAgICAgIFN0cmluZyB0OworICAgICAgICBpbnQgaW5kZXggPSBkZXNjLmNoYXJBdCgwKSA9PSAnKCcgPyBkZXNjLmluZGV4T2YoJyknKSArIDEgOiAwOworICAgICAgICBzd2l0Y2ggKGRlc2MuY2hhckF0KGluZGV4KSkgeworICAgICAgICAgICAgY2FzZSAnVic6CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBjYXNlICdaJzoKKyAgICAgICAgICAgIGNhc2UgJ0MnOgorICAgICAgICAgICAgY2FzZSAnQic6CisgICAgICAgICAgICBjYXNlICdTJzoKKyAgICAgICAgICAgIGNhc2UgJ0knOgorICAgICAgICAgICAgICAgIHJldHVybiBJTlRFR0VSOworICAgICAgICAgICAgY2FzZSAnRic6CisgICAgICAgICAgICAgICAgcmV0dXJuIEZMT0FUOworICAgICAgICAgICAgY2FzZSAnSic6CisgICAgICAgICAgICAgICAgcmV0dXJuIExPTkc7CisgICAgICAgICAgICBjYXNlICdEJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gRE9VQkxFOworICAgICAgICAgICAgY2FzZSAnTCc6CisgICAgICAgICAgICAgICAgLy8gc3RvcmVzIHRoZSBpbnRlcm5hbCBuYW1lLCBub3QgdGhlIGRlc2NyaXB0b3IhCisgICAgICAgICAgICAgICAgdCA9IGRlc2Muc3Vic3RyaW5nKGluZGV4ICsgMSwgZGVzYy5sZW5ndGgoKSAtIDEpOworICAgICAgICAgICAgICAgIHJldHVybiBPQkpFQ1QgfCBjdy5hZGRUeXBlKHQpOworICAgICAgICAgICAgLy8gY2FzZSAnWyc6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIC8vIGV4dHJhY3RzIHRoZSBkaW1lbnNpb25zIGFuZCB0aGUgZWxlbWVudCB0eXBlCisgICAgICAgICAgICAgICAgaW50IGRhdGE7CisgICAgICAgICAgICAgICAgaW50IGRpbXMgPSBpbmRleCArIDE7CisgICAgICAgICAgICAgICAgd2hpbGUgKGRlc2MuY2hhckF0KGRpbXMpID09ICdbJykgeworICAgICAgICAgICAgICAgICAgICArK2RpbXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN3aXRjaCAoZGVzYy5jaGFyQXQoZGltcykpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnWic6CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gQk9PTEVBTjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICdDJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBDSEFSOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0InOgorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IEJZVEU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnUyc6CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gU0hPUlQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnSSc6CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gSU5URUdFUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICdGJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBGTE9BVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICdKJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBMT05HOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0QnOgorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IERPVUJMRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAvLyBjYXNlICdMJzoKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0b3JlcyB0aGUgaW50ZXJuYWwgbmFtZSwgbm90IHRoZSBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICB0ID0gZGVzYy5zdWJzdHJpbmcoZGltcyArIDEsIGRlc2MubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBPQkpFQ1QgfCBjdy5hZGRUeXBlKHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gKGRpbXMgLSBpbmRleCkgPDwgMjggfCBkYXRhOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUG9wcyBhIHR5cGUgZnJvbSB0aGUgb3V0cHV0IGZyYW1lIHN0YWNrIGFuZCByZXR1cm5zIGl0cyB2YWx1ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHR5cGUgdGhhdCBoYXMgYmVlbiBwb3BwZWQgZnJvbSB0aGUgb3V0cHV0IGZyYW1lIHN0YWNrLgorICAgICAqLworICAgIHByaXZhdGUgaW50IHBvcCgpIHsKKyAgICAgICAgaWYgKG91dHB1dFN0YWNrVG9wID4gMCkgeworICAgICAgICAgICAgcmV0dXJuIG91dHB1dFN0YWNrWy0tb3V0cHV0U3RhY2tUb3BdOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gaWYgdGhlIG91dHB1dCBmcmFtZSBzdGFjayBpcyBlbXB0eSwgcG9wcyBmcm9tIHRoZSBpbnB1dCBzdGFjaworICAgICAgICAgICAgcmV0dXJuIFNUQUNLIHwgLSgtLW93bmVyLmlucHV0U3RhY2tUb3ApOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUG9wcyB0aGUgZ2l2ZW4gbnVtYmVyIG9mIHR5cGVzIGZyb20gdGhlIG91dHB1dCBmcmFtZSBzdGFjay4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbGVtZW50cworICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiB0eXBlcyB0aGF0IG11c3QgYmUgcG9wcGVkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwb3AoZmluYWwgaW50IGVsZW1lbnRzKSB7CisgICAgICAgIGlmIChvdXRwdXRTdGFja1RvcCA+PSBlbGVtZW50cykgeworICAgICAgICAgICAgb3V0cHV0U3RhY2tUb3AgLT0gZWxlbWVudHM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBpZiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGJlIHBvcHBlZCBpcyBncmVhdGVyIHRoYW4gdGhlIG51bWJlcgorICAgICAgICAgICAgLy8gb2YgZWxlbWVudHMgaW4gdGhlIG91dHB1dCBzdGFjaywgY2xlYXIgaXQsIGFuZCBwb3BzIHRoZSByZW1haW5pbmcKKyAgICAgICAgICAgIC8vIGVsZW1lbnRzIGZyb20gdGhlIGlucHV0IHN0YWNrLgorICAgICAgICAgICAgb3duZXIuaW5wdXRTdGFja1RvcCAtPSBlbGVtZW50cyAtIG91dHB1dFN0YWNrVG9wOworICAgICAgICAgICAgb3V0cHV0U3RhY2tUb3AgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUG9wcyBhIHR5cGUgZnJvbSB0aGUgb3V0cHV0IGZyYW1lIHN0YWNrLgorICAgICAqCisgICAgICogQHBhcmFtIGRlc2MKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXNjcmlwdG9yIG9mIHRoZSB0eXBlIHRvIGJlIHBvcHBlZC4gQ2FuIGFsc28gYmUgYSBtZXRob2QKKyAgICAgKiAgICAgICAgICAgIGRlc2NyaXB0b3IgKGluIHRoaXMgY2FzZSB0aGlzIG1ldGhvZCBwb3BzIHRoZSB0eXBlcworICAgICAqICAgICAgICAgICAgY29ycmVzcG9uZGluZyB0byB0aGUgbWV0aG9kIGFyZ3VtZW50cykuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHBvcChmaW5hbCBTdHJpbmcgZGVzYykgeworICAgICAgICBjaGFyIGMgPSBkZXNjLmNoYXJBdCgwKTsKKyAgICAgICAgaWYgKGMgPT0gJygnKSB7CisgICAgICAgICAgICBwb3AoKFR5cGUuZ2V0QXJndW1lbnRzQW5kUmV0dXJuU2l6ZXMoZGVzYykgPj4gMikgLSAxKTsKKyAgICAgICAgfSBlbHNlIGlmIChjID09ICdKJyB8fCBjID09ICdEJykgeworICAgICAgICAgICAgcG9wKDIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcG9wKDEpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIG5ldyB0eXBlIHRvIHRoZSBsaXN0IG9mIHR5cGVzIG9uIHdoaWNoIGEgY29uc3RydWN0b3IgaXMgaW52b2tlZCBpbgorICAgICAqIHRoZSBiYXNpYyBibG9jay4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YXIKKyAgICAgKiAgICAgICAgICAgIGEgdHlwZSBvbiBhIHdoaWNoIGEgY29uc3RydWN0b3IgaXMgaW52b2tlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgaW5pdChmaW5hbCBpbnQgdmFyKSB7CisgICAgICAgIC8vIGNyZWF0ZXMgYW5kL29yIHJlc2l6ZXMgdGhlIGluaXRpYWxpemF0aW9ucyBhcnJheSBpZiBuZWNlc3NhcnkKKyAgICAgICAgaWYgKGluaXRpYWxpemF0aW9ucyA9PSBudWxsKSB7CisgICAgICAgICAgICBpbml0aWFsaXphdGlvbnMgPSBuZXcgaW50WzJdOworICAgICAgICB9CisgICAgICAgIGludCBuID0gaW5pdGlhbGl6YXRpb25zLmxlbmd0aDsKKyAgICAgICAgaWYgKGluaXRpYWxpemF0aW9uQ291bnQgPj0gbikgeworICAgICAgICAgICAgaW50W10gdCA9IG5ldyBpbnRbTWF0aC5tYXgoaW5pdGlhbGl6YXRpb25Db3VudCArIDEsIDIgKiBuKV07CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGluaXRpYWxpemF0aW9ucywgMCwgdCwgMCwgbik7CisgICAgICAgICAgICBpbml0aWFsaXphdGlvbnMgPSB0OworICAgICAgICB9CisgICAgICAgIC8vIHN0b3JlcyB0aGUgdHlwZSB0byBiZSBpbml0aWFsaXplZAorICAgICAgICBpbml0aWFsaXphdGlvbnNbaW5pdGlhbGl6YXRpb25Db3VudCsrXSA9IHZhcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXBsYWNlcyB0aGUgZ2l2ZW4gdHlwZSB3aXRoIHRoZSBhcHByb3ByaWF0ZSB0eXBlIGlmIGl0IGlzIG9uZSBvZiB0aGUKKyAgICAgKiB0eXBlcyBvbiB3aGljaCBhIGNvbnN0cnVjdG9yIGlzIGludm9rZWQgaW4gdGhlIGJhc2ljIGJsb2NrLgorICAgICAqCisgICAgICogQHBhcmFtIGN3CisgICAgICogICAgICAgICAgICB0aGUgQ2xhc3NXcml0ZXIgdG8gd2hpY2ggdGhpcyBsYWJlbCBiZWxvbmdzLgorICAgICAqIEBwYXJhbSB0CisgICAgICogICAgICAgICAgICBhIHR5cGUKKyAgICAgKiBAcmV0dXJuIHQgb3IsIGlmIHQgaXMgb25lIG9mIHRoZSB0eXBlcyBvbiB3aGljaCBhIGNvbnN0cnVjdG9yIGlzIGludm9rZWQKKyAgICAgKiAgICAgICAgIGluIHRoZSBiYXNpYyBibG9jaywgdGhlIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGlzIGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGluaXQoZmluYWwgQ2xhc3NXcml0ZXIgY3csIGZpbmFsIGludCB0KSB7CisgICAgICAgIGludCBzOworICAgICAgICBpZiAodCA9PSBVTklOSVRJQUxJWkVEX1RISVMpIHsKKyAgICAgICAgICAgIHMgPSBPQkpFQ1QgfCBjdy5hZGRUeXBlKGN3LnRoaXNOYW1lKTsKKyAgICAgICAgfSBlbHNlIGlmICgodCAmIChESU0gfCBCQVNFX0tJTkQpKSA9PSBVTklOSVRJQUxJWkVEKSB7CisgICAgICAgICAgICBTdHJpbmcgdHlwZSA9IGN3LnR5cGVUYWJsZVt0ICYgQkFTRV9WQUxVRV0uc3RyVmFsMTsKKyAgICAgICAgICAgIHMgPSBPQkpFQ1QgfCBjdy5hZGRUeXBlKHR5cGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpbml0aWFsaXphdGlvbkNvdW50OyArK2opIHsKKyAgICAgICAgICAgIGludCB1ID0gaW5pdGlhbGl6YXRpb25zW2pdOworICAgICAgICAgICAgaW50IGRpbSA9IHUgJiBESU07CisgICAgICAgICAgICBpbnQga2luZCA9IHUgJiBLSU5EOworICAgICAgICAgICAgaWYgKGtpbmQgPT0gTE9DQUwpIHsKKyAgICAgICAgICAgICAgICB1ID0gZGltICsgaW5wdXRMb2NhbHNbdSAmIFZBTFVFXTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoa2luZCA9PSBTVEFDSykgeworICAgICAgICAgICAgICAgIHUgPSBkaW0gKyBpbnB1dFN0YWNrW2lucHV0U3RhY2subGVuZ3RoIC0gKHUgJiBWQUxVRSldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHQgPT0gdSkgeworICAgICAgICAgICAgICAgIHJldHVybiBzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemVzIHRoZSBpbnB1dCBmcmFtZSBvZiB0aGUgZmlyc3QgYmFzaWMgYmxvY2sgZnJvbSB0aGUgbWV0aG9kCisgICAgICogZGVzY3JpcHRvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjdworICAgICAqICAgICAgICAgICAgdGhlIENsYXNzV3JpdGVyIHRvIHdoaWNoIHRoaXMgbGFiZWwgYmVsb25ncy4KKyAgICAgKiBAcGFyYW0gYWNjZXNzCisgICAgICogICAgICAgICAgICB0aGUgYWNjZXNzIGZsYWdzIG9mIHRoZSBtZXRob2QgdG8gd2hpY2ggdGhpcyBsYWJlbCBiZWxvbmdzLgorICAgICAqIEBwYXJhbSBhcmdzCisgICAgICogICAgICAgICAgICB0aGUgZm9ybWFsIHBhcmFtZXRlciB0eXBlcyBvZiB0aGlzIG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gbWF4TG9jYWxzCisgICAgICogICAgICAgICAgICB0aGUgbWF4aW11bSBudW1iZXIgb2YgbG9jYWwgdmFyaWFibGVzIG9mIHRoaXMgbWV0aG9kLgorICAgICAqLworICAgIHZvaWQgaW5pdElucHV0RnJhbWUoZmluYWwgQ2xhc3NXcml0ZXIgY3csIGZpbmFsIGludCBhY2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlW10gYXJncywgZmluYWwgaW50IG1heExvY2FscykgeworICAgICAgICBpbnB1dExvY2FscyA9IG5ldyBpbnRbbWF4TG9jYWxzXTsKKyAgICAgICAgaW5wdXRTdGFjayA9IG5ldyBpbnRbMF07CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgaWYgKChhY2Nlc3MgJiBPcGNvZGVzLkFDQ19TVEFUSUMpID09IDApIHsKKyAgICAgICAgICAgIGlmICgoYWNjZXNzICYgTWV0aG9kV3JpdGVyLkFDQ19DT05TVFJVQ1RPUikgPT0gMCkgeworICAgICAgICAgICAgICAgIGlucHV0TG9jYWxzW2krK10gPSBPQkpFQ1QgfCBjdy5hZGRUeXBlKGN3LnRoaXNOYW1lKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW5wdXRMb2NhbHNbaSsrXSA9IFVOSU5JVElBTElaRURfVEhJUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGFyZ3MubGVuZ3RoOyArK2opIHsKKyAgICAgICAgICAgIGludCB0ID0gdHlwZShjdywgYXJnc1tqXS5nZXREZXNjcmlwdG9yKCkpOworICAgICAgICAgICAgaW5wdXRMb2NhbHNbaSsrXSA9IHQ7CisgICAgICAgICAgICBpZiAodCA9PSBMT05HIHx8IHQgPT0gRE9VQkxFKSB7CisgICAgICAgICAgICAgICAgaW5wdXRMb2NhbHNbaSsrXSA9IFRPUDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoaSA8IG1heExvY2FscykgeworICAgICAgICAgICAgaW5wdXRMb2NhbHNbaSsrXSA9IFRPUDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNpbXVsYXRlcyB0aGUgYWN0aW9uIG9mIHRoZSBnaXZlbiBpbnN0cnVjdGlvbiBvbiB0aGUgb3V0cHV0IHN0YWNrIGZyYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIG9wY29kZQorICAgICAqICAgICAgICAgICAgdGhlIG9wY29kZSBvZiB0aGUgaW5zdHJ1Y3Rpb24uCisgICAgICogQHBhcmFtIGFyZworICAgICAqICAgICAgICAgICAgdGhlIG9wZXJhbmQgb2YgdGhlIGluc3RydWN0aW9uLCBpZiBhbnkuCisgICAgICogQHBhcmFtIGN3CisgICAgICogICAgICAgICAgICB0aGUgY2xhc3Mgd3JpdGVyIHRvIHdoaWNoIHRoaXMgbGFiZWwgYmVsb25ncy4KKyAgICAgKiBAcGFyYW0gaXRlbQorICAgICAqICAgICAgICAgICAgdGhlIG9wZXJhbmQgb2YgdGhlIGluc3RydWN0aW9ucywgaWYgYW55LgorICAgICAqLworICAgIHZvaWQgZXhlY3V0ZShmaW5hbCBpbnQgb3Bjb2RlLCBmaW5hbCBpbnQgYXJnLCBmaW5hbCBDbGFzc1dyaXRlciBjdywKKyAgICAgICAgICAgICAgICAgZmluYWwgSXRlbSBpdGVtKSB7CisgICAgICAgIGludCB0MSwgdDIsIHQzLCB0NDsKKyAgICAgICAgc3dpdGNoIChvcGNvZGUpIHsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5OT1A6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSU5FRzoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5MTkVHOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkZORUc6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRE5FRzoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JMkI6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSTJDOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkkyUzoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5HT1RPOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLlJFVFVSTjoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5BQ09OU1RfTlVMTDoKKyAgICAgICAgICAgICAgICBwdXNoKE5VTEwpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklDT05TVF9NMToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JQ09OU1RfMDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JQ09OU1RfMToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JQ09OU1RfMjoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JQ09OU1RfMzoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JQ09OU1RfNDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JQ09OU1RfNToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5CSVBVU0g6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuU0lQVVNIOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklMT0FEOgorICAgICAgICAgICAgICAgIHB1c2goSU5URUdFUik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTENPTlNUXzA6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTENPTlNUXzE6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTExPQUQ6CisgICAgICAgICAgICAgICAgcHVzaChMT05HKTsKKyAgICAgICAgICAgICAgICBwdXNoKFRPUCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRkNPTlNUXzA6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRkNPTlNUXzE6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRkNPTlNUXzI6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRkxPQUQ6CisgICAgICAgICAgICAgICAgcHVzaChGTE9BVCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRENPTlNUXzA6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRENPTlNUXzE6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRExPQUQ6CisgICAgICAgICAgICAgICAgcHVzaChET1VCTEUpOworICAgICAgICAgICAgICAgIHB1c2goVE9QKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5MREM6CisgICAgICAgICAgICAgICAgc3dpdGNoIChpdGVtLnR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5JTlQ6CisgICAgICAgICAgICAgICAgICAgICAgICBwdXNoKElOVEVHRVIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuTE9ORzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goTE9ORyk7CisgICAgICAgICAgICAgICAgICAgICAgICBwdXNoKFRPUCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5GTE9BVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goRkxPQVQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuRE9VQkxFOgorICAgICAgICAgICAgICAgICAgICAgICAgcHVzaChET1VCTEUpOworICAgICAgICAgICAgICAgICAgICAgICAgcHVzaChUT1ApOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuQ0xBU1M6CisgICAgICAgICAgICAgICAgICAgICAgICBwdXNoKE9CSkVDVCB8IGN3LmFkZFR5cGUoImphdmEvbGFuZy9DbGFzcyIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLlNUUjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goT0JKRUNUIHwgY3cuYWRkVHlwZSgiamF2YS9sYW5nL1N0cmluZyIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLk1UWVBFOgorICAgICAgICAgICAgICAgICAgICAgICAgcHVzaChPQkpFQ1QgfCBjdy5hZGRUeXBlKCJqYXZhL2xhbmcvaW52b2tlL01ldGhvZFR5cGUiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2FzZSBDbGFzc1dyaXRlci5IQU5ETEVfQkFTRSArIFsxLi45XToKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goT0JKRUNUIHwgY3cuYWRkVHlwZSgiamF2YS9sYW5nL2ludm9rZS9NZXRob2RIYW5kbGUiKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkFMT0FEOgorICAgICAgICAgICAgICAgIHB1c2goZ2V0KGFyZykpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklBTE9BRDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5CQUxPQUQ6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuQ0FMT0FEOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLlNBTE9BRDoKKyAgICAgICAgICAgICAgICBwb3AoMik7CisgICAgICAgICAgICAgICAgcHVzaChJTlRFR0VSKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5MQUxPQUQ6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRDJMOgorICAgICAgICAgICAgICAgIHBvcCgyKTsKKyAgICAgICAgICAgICAgICBwdXNoKExPTkcpOworICAgICAgICAgICAgICAgIHB1c2goVE9QKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5GQUxPQUQ6CisgICAgICAgICAgICAgICAgcG9wKDIpOworICAgICAgICAgICAgICAgIHB1c2goRkxPQVQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkRBTE9BRDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5MMkQ6CisgICAgICAgICAgICAgICAgcG9wKDIpOworICAgICAgICAgICAgICAgIHB1c2goRE9VQkxFKTsKKyAgICAgICAgICAgICAgICBwdXNoKFRPUCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuQUFMT0FEOgorICAgICAgICAgICAgICAgIHBvcCgxKTsKKyAgICAgICAgICAgICAgICB0MSA9IHBvcCgpOworICAgICAgICAgICAgICAgIHB1c2goRUxFTUVOVF9PRiArIHQxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JU1RPUkU6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRlNUT1JFOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkFTVE9SRToKKyAgICAgICAgICAgICAgICB0MSA9IHBvcCgpOworICAgICAgICAgICAgICAgIHNldChhcmcsIHQxKTsKKyAgICAgICAgICAgICAgICBpZiAoYXJnID4gMCkgeworICAgICAgICAgICAgICAgICAgICB0MiA9IGdldChhcmcgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgdDIgaXMgb2Yga2luZCBTVEFDSyBvciBMT0NBTCB3ZSBjYW5ub3Qga25vdyBpdHMgc2l6ZSEKKyAgICAgICAgICAgICAgICAgICAgaWYgKHQyID09IExPTkcgfHwgdDIgPT0gRE9VQkxFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXQoYXJnIC0gMSwgVE9QKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgodDIgJiBLSU5EKSAhPSBCQVNFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXQoYXJnIC0gMSwgdDIgfCBUT1BfSUZfTE9OR19PUl9ET1VCTEUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkxTVE9SRToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5EU1RPUkU6CisgICAgICAgICAgICAgICAgcG9wKDEpOworICAgICAgICAgICAgICAgIHQxID0gcG9wKCk7CisgICAgICAgICAgICAgICAgc2V0KGFyZywgdDEpOworICAgICAgICAgICAgICAgIHNldChhcmcgKyAxLCBUT1ApOworICAgICAgICAgICAgICAgIGlmIChhcmcgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHQyID0gZ2V0KGFyZyAtIDEpOworICAgICAgICAgICAgICAgICAgICAvLyBpZiB0MiBpcyBvZiBraW5kIFNUQUNLIG9yIExPQ0FMIHdlIGNhbm5vdCBrbm93IGl0cyBzaXplIQorICAgICAgICAgICAgICAgICAgICBpZiAodDIgPT0gTE9ORyB8fCB0MiA9PSBET1VCTEUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldChhcmcgLSAxLCBUT1ApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCh0MiAmIEtJTkQpICE9IEJBU0UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldChhcmcgLSAxLCB0MiB8IFRPUF9JRl9MT05HX09SX0RPVUJMRSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSUFTVE9SRToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5CQVNUT1JFOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkNBU1RPUkU6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuU0FTVE9SRToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5GQVNUT1JFOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkFBU1RPUkU6CisgICAgICAgICAgICAgICAgcG9wKDMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkxBU1RPUkU6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuREFTVE9SRToKKyAgICAgICAgICAgICAgICBwb3AoNCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuUE9QOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklGRVE6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSUZORToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JRkxUOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklGR0U6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSUZHVDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JRkxFOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklSRVRVUk46CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRlJFVFVSTjoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5BUkVUVVJOOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLlRBQkxFU1dJVENIOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkxPT0tVUFNXSVRDSDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5BVEhST1c6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTU9OSVRPUkVOVEVSOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLk1PTklUT1JFWElUOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklGTlVMTDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JRk5PTk5VTEw6CisgICAgICAgICAgICAgICAgcG9wKDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLlBPUDI6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSUZfSUNNUEVROgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklGX0lDTVBORToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JRl9JQ01QTFQ6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSUZfSUNNUEdFOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklGX0lDTVBHVDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JRl9JQ01QTEU6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSUZfQUNNUEVROgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklGX0FDTVBORToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5MUkVUVVJOOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkRSRVRVUk46CisgICAgICAgICAgICAgICAgcG9wKDIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkRVUDoKKyAgICAgICAgICAgICAgICB0MSA9IHBvcCgpOworICAgICAgICAgICAgICAgIHB1c2godDEpOworICAgICAgICAgICAgICAgIHB1c2godDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkRVUF9YMToKKyAgICAgICAgICAgICAgICB0MSA9IHBvcCgpOworICAgICAgICAgICAgICAgIHQyID0gcG9wKCk7CisgICAgICAgICAgICAgICAgcHVzaCh0MSk7CisgICAgICAgICAgICAgICAgcHVzaCh0Mik7CisgICAgICAgICAgICAgICAgcHVzaCh0MSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRFVQX1gyOgorICAgICAgICAgICAgICAgIHQxID0gcG9wKCk7CisgICAgICAgICAgICAgICAgdDIgPSBwb3AoKTsKKyAgICAgICAgICAgICAgICB0MyA9IHBvcCgpOworICAgICAgICAgICAgICAgIHB1c2godDEpOworICAgICAgICAgICAgICAgIHB1c2godDMpOworICAgICAgICAgICAgICAgIHB1c2godDIpOworICAgICAgICAgICAgICAgIHB1c2godDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkRVUDI6CisgICAgICAgICAgICAgICAgdDEgPSBwb3AoKTsKKyAgICAgICAgICAgICAgICB0MiA9IHBvcCgpOworICAgICAgICAgICAgICAgIHB1c2godDIpOworICAgICAgICAgICAgICAgIHB1c2godDEpOworICAgICAgICAgICAgICAgIHB1c2godDIpOworICAgICAgICAgICAgICAgIHB1c2godDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkRVUDJfWDE6CisgICAgICAgICAgICAgICAgdDEgPSBwb3AoKTsKKyAgICAgICAgICAgICAgICB0MiA9IHBvcCgpOworICAgICAgICAgICAgICAgIHQzID0gcG9wKCk7CisgICAgICAgICAgICAgICAgcHVzaCh0Mik7CisgICAgICAgICAgICAgICAgcHVzaCh0MSk7CisgICAgICAgICAgICAgICAgcHVzaCh0Myk7CisgICAgICAgICAgICAgICAgcHVzaCh0Mik7CisgICAgICAgICAgICAgICAgcHVzaCh0MSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRFVQMl9YMjoKKyAgICAgICAgICAgICAgICB0MSA9IHBvcCgpOworICAgICAgICAgICAgICAgIHQyID0gcG9wKCk7CisgICAgICAgICAgICAgICAgdDMgPSBwb3AoKTsKKyAgICAgICAgICAgICAgICB0NCA9IHBvcCgpOworICAgICAgICAgICAgICAgIHB1c2godDIpOworICAgICAgICAgICAgICAgIHB1c2godDEpOworICAgICAgICAgICAgICAgIHB1c2godDQpOworICAgICAgICAgICAgICAgIHB1c2godDMpOworICAgICAgICAgICAgICAgIHB1c2godDIpOworICAgICAgICAgICAgICAgIHB1c2godDEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLlNXQVA6CisgICAgICAgICAgICAgICAgdDEgPSBwb3AoKTsKKyAgICAgICAgICAgICAgICB0MiA9IHBvcCgpOworICAgICAgICAgICAgICAgIHB1c2godDEpOworICAgICAgICAgICAgICAgIHB1c2godDIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklBREQ6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSVNVQjoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JTVVMOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklESVY6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSVJFTToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JQU5EOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklPUjoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JWE9SOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklTSEw6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSVNIUjoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JVVNIUjoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5MMkk6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRDJJOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkZDTVBMOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkZDTVBHOgorICAgICAgICAgICAgICAgIHBvcCgyKTsKKyAgICAgICAgICAgICAgICBwdXNoKElOVEVHRVIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkxBREQ6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTFNVQjoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5MTVVMOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkxESVY6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTFJFTToKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5MQU5EOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkxPUjoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5MWE9SOgorICAgICAgICAgICAgICAgIHBvcCg0KTsKKyAgICAgICAgICAgICAgICBwdXNoKExPTkcpOworICAgICAgICAgICAgICAgIHB1c2goVE9QKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5GQUREOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkZTVUI6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRk1VTDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5GRElWOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkZSRU06CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTDJGOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkQyRjoKKyAgICAgICAgICAgICAgICBwb3AoMik7CisgICAgICAgICAgICAgICAgcHVzaChGTE9BVCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuREFERDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5EU1VCOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkRNVUw6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRERJVjoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5EUkVNOgorICAgICAgICAgICAgICAgIHBvcCg0KTsKKyAgICAgICAgICAgICAgICBwdXNoKERPVUJMRSk7CisgICAgICAgICAgICAgICAgcHVzaChUT1ApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkxTSEw6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTFNIUjoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5MVVNIUjoKKyAgICAgICAgICAgICAgICBwb3AoMyk7CisgICAgICAgICAgICAgICAgcHVzaChMT05HKTsKKyAgICAgICAgICAgICAgICBwdXNoKFRPUCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSUlOQzoKKyAgICAgICAgICAgICAgICBzZXQoYXJnLCBJTlRFR0VSKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JMkw6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRjJMOgorICAgICAgICAgICAgICAgIHBvcCgxKTsKKyAgICAgICAgICAgICAgICBwdXNoKExPTkcpOworICAgICAgICAgICAgICAgIHB1c2goVE9QKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JMkY6CisgICAgICAgICAgICAgICAgcG9wKDEpOworICAgICAgICAgICAgICAgIHB1c2goRkxPQVQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkkyRDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5GMkQ6CisgICAgICAgICAgICAgICAgcG9wKDEpOworICAgICAgICAgICAgICAgIHB1c2goRE9VQkxFKTsKKyAgICAgICAgICAgICAgICBwdXNoKFRPUCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuRjJJOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkFSUkFZTEVOR1RIOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklOU1RBTkNFT0Y6CisgICAgICAgICAgICAgICAgcG9wKDEpOworICAgICAgICAgICAgICAgIHB1c2goSU5URUdFUik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTENNUDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5EQ01QTDoKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5EQ01QRzoKKyAgICAgICAgICAgICAgICBwb3AoNCk7CisgICAgICAgICAgICAgICAgcHVzaChJTlRFR0VSKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5KU1I6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuUkVUOgorICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIkpTUi9SRVQgYXJlIG5vdCBzdXBwb3J0ZWQgd2l0aCBjb21wdXRlRnJhbWVzIG9wdGlvbiIpOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkdFVFNUQVRJQzoKKyAgICAgICAgICAgICAgICBwdXNoKGN3LCBpdGVtLnN0clZhbDMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLlBVVFNUQVRJQzoKKyAgICAgICAgICAgICAgICBwb3AoaXRlbS5zdHJWYWwzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5HRVRGSUVMRDoKKyAgICAgICAgICAgICAgICBwb3AoMSk7CisgICAgICAgICAgICAgICAgcHVzaChjdywgaXRlbS5zdHJWYWwzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5QVVRGSUVMRDoKKyAgICAgICAgICAgICAgICBwb3AoaXRlbS5zdHJWYWwzKTsKKyAgICAgICAgICAgICAgICBwb3AoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JTlZPS0VWSVJUVUFMOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklOVk9LRVNQRUNJQUw6CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuSU5WT0tFU1RBVElDOgorICAgICAgICAgICAgY2FzZSBPcGNvZGVzLklOVk9LRUlOVEVSRkFDRToKKyAgICAgICAgICAgICAgICBwb3AoaXRlbS5zdHJWYWwzKTsKKyAgICAgICAgICAgICAgICBpZiAob3Bjb2RlICE9IE9wY29kZXMuSU5WT0tFU1RBVElDKSB7CisgICAgICAgICAgICAgICAgICAgIHQxID0gcG9wKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvcGNvZGUgPT0gT3Bjb2Rlcy5JTlZPS0VTUEVDSUFMCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBpdGVtLnN0clZhbDIuY2hhckF0KDApID09ICc8JykgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCh0MSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHVzaChjdywgaXRlbS5zdHJWYWwzKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5JTlZPS0VEWU5BTUlDOgorICAgICAgICAgICAgICAgIHBvcChpdGVtLnN0clZhbDIpOworICAgICAgICAgICAgICAgIHB1c2goY3csIGl0ZW0uc3RyVmFsMik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTkVXOgorICAgICAgICAgICAgICAgIHB1c2goVU5JTklUSUFMSVpFRCB8IGN3LmFkZFVuaW5pdGlhbGl6ZWRUeXBlKGl0ZW0uc3RyVmFsMSwgYXJnKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE9wY29kZXMuTkVXQVJSQVk6CisgICAgICAgICAgICAgICAgcG9wKCk7CisgICAgICAgICAgICAgICAgc3dpdGNoIChhcmcpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPcGNvZGVzLlRfQk9PTEVBTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goQVJSQVlfT0YgfCBCT09MRUFOKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIE9wY29kZXMuVF9DSEFSOgorICAgICAgICAgICAgICAgICAgICAgICAgcHVzaChBUlJBWV9PRiB8IENIQVIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5UX0JZVEU6CisgICAgICAgICAgICAgICAgICAgICAgICBwdXNoKEFSUkFZX09GIHwgQllURSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPcGNvZGVzLlRfU0hPUlQ6CisgICAgICAgICAgICAgICAgICAgICAgICBwdXNoKEFSUkFZX09GIHwgU0hPUlQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5UX0lOVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goQVJSQVlfT0YgfCBJTlRFR0VSKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIE9wY29kZXMuVF9GTE9BVDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goQVJSQVlfT0YgfCBGTE9BVCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPcGNvZGVzLlRfRE9VQkxFOgorICAgICAgICAgICAgICAgICAgICAgICAgcHVzaChBUlJBWV9PRiB8IERPVUJMRSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2FzZSBPcGNvZGVzLlRfTE9ORzoKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goQVJSQVlfT0YgfCBMT05HKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5BTkVXQVJSQVk6CisgICAgICAgICAgICAgICAgU3RyaW5nIHMgPSBpdGVtLnN0clZhbDE7CisgICAgICAgICAgICAgICAgcG9wKCk7CisgICAgICAgICAgICAgICAgaWYgKHMuY2hhckF0KDApID09ICdbJykgeworICAgICAgICAgICAgICAgICAgICBwdXNoKGN3LCAnWycgKyBzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBwdXNoKEFSUkFZX09GIHwgT0JKRUNUIHwgY3cuYWRkVHlwZShzKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkNIRUNLQ0FTVDoKKyAgICAgICAgICAgICAgICBzID0gaXRlbS5zdHJWYWwxOworICAgICAgICAgICAgICAgIHBvcCgpOworICAgICAgICAgICAgICAgIGlmIChzLmNoYXJBdCgwKSA9PSAnWycpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVzaChjdywgcyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcHVzaChPQkpFQ1QgfCBjdy5hZGRUeXBlKHMpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAvLyBjYXNlIE9wY29kZXMuTVVMVElBTkVXQVJSQVk6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHBvcChhcmcpOworICAgICAgICAgICAgICAgIHB1c2goY3csIGl0ZW0uc3RyVmFsMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZXJnZXMgdGhlIGlucHV0IGZyYW1lIG9mIHRoZSBnaXZlbiBiYXNpYyBibG9jayB3aXRoIHRoZSBpbnB1dCBhbmQgb3V0cHV0CisgICAgICogZnJhbWVzIG9mIHRoaXMgYmFzaWMgYmxvY2suIFJldHVybnMgPHR0PnRydWU8L3R0PiBpZiB0aGUgaW5wdXQgZnJhbWUgb2YKKyAgICAgKiB0aGUgZ2l2ZW4gbGFiZWwgaGFzIGJlZW4gY2hhbmdlZCBieSB0aGlzIG9wZXJhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjdworICAgICAqICAgICAgICAgICAgdGhlIENsYXNzV3JpdGVyIHRvIHdoaWNoIHRoaXMgbGFiZWwgYmVsb25ncy4KKyAgICAgKiBAcGFyYW0gZnJhbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBiYXNpYyBibG9jayB3aG9zZSBpbnB1dCBmcmFtZSBtdXN0IGJlIHVwZGF0ZWQuCisgICAgICogQHBhcmFtIGVkZ2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBraW5kIG9mIHRoZSB7QGxpbmsgRWRnZX0gYmV0d2VlbiB0aGlzIGxhYmVsIGFuZCAnbGFiZWwnLgorICAgICAqICAgICAgICAgICAgU2VlIHtAbGluayBFZGdlI2luZm99LgorICAgICAqIEByZXR1cm4gPHR0PnRydWU8L3R0PiBpZiB0aGUgaW5wdXQgZnJhbWUgb2YgdGhlIGdpdmVuIGxhYmVsIGhhcyBiZWVuCisgICAgICogICAgICAgICBjaGFuZ2VkIGJ5IHRoaXMgb3BlcmF0aW9uLgorICAgICAqLworICAgIGJvb2xlYW4gbWVyZ2UoZmluYWwgQ2xhc3NXcml0ZXIgY3csIGZpbmFsIEZyYW1lIGZyYW1lLCBmaW5hbCBpbnQgZWRnZSkgeworICAgICAgICBib29sZWFuIGNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgaW50IGksIHMsIGRpbSwga2luZCwgdDsKKworICAgICAgICBpbnQgbkxvY2FsID0gaW5wdXRMb2NhbHMubGVuZ3RoOworICAgICAgICBpbnQgblN0YWNrID0gaW5wdXRTdGFjay5sZW5ndGg7CisgICAgICAgIGlmIChmcmFtZS5pbnB1dExvY2FscyA9PSBudWxsKSB7CisgICAgICAgICAgICBmcmFtZS5pbnB1dExvY2FscyA9IG5ldyBpbnRbbkxvY2FsXTsKKyAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5Mb2NhbDsgKytpKSB7CisgICAgICAgICAgICBpZiAob3V0cHV0TG9jYWxzICE9IG51bGwgJiYgaSA8IG91dHB1dExvY2Fscy5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBzID0gb3V0cHV0TG9jYWxzW2ldOworICAgICAgICAgICAgICAgIGlmIChzID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdCA9IGlucHV0TG9jYWxzW2ldOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRpbSA9IHMgJiBESU07CisgICAgICAgICAgICAgICAgICAgIGtpbmQgPSBzICYgS0lORDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPT0gQkFTRSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHM7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2luZCA9PSBMT0NBTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBkaW0gKyBpbnB1dExvY2Fsc1tzICYgVkFMVUVdOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ID0gZGltICsgaW5wdXRTdGFja1tuU3RhY2sgLSAocyAmIFZBTFVFKV07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHMgJiBUT1BfSUZfTE9OR19PUl9ET1VCTEUpICE9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAodCA9PSBMT05HIHx8IHQgPT0gRE9VQkxFKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBUT1A7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHQgPSBpbnB1dExvY2Fsc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpbml0aWFsaXphdGlvbnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHQgPSBpbml0KGN3LCB0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoYW5nZWQgfD0gbWVyZ2UoY3csIHQsIGZyYW1lLmlucHV0TG9jYWxzLCBpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChlZGdlID4gMCkgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5Mb2NhbDsgKytpKSB7CisgICAgICAgICAgICAgICAgdCA9IGlucHV0TG9jYWxzW2ldOworICAgICAgICAgICAgICAgIGNoYW5nZWQgfD0gbWVyZ2UoY3csIHQsIGZyYW1lLmlucHV0TG9jYWxzLCBpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmcmFtZS5pbnB1dFN0YWNrID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmcmFtZS5pbnB1dFN0YWNrID0gbmV3IGludFsxXTsKKyAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoYW5nZWQgfD0gbWVyZ2UoY3csIGVkZ2UsIGZyYW1lLmlucHV0U3RhY2ssIDApOworICAgICAgICAgICAgcmV0dXJuIGNoYW5nZWQ7CisgICAgICAgIH0KKworICAgICAgICBpbnQgbklucHV0U3RhY2sgPSBpbnB1dFN0YWNrLmxlbmd0aCArIG93bmVyLmlucHV0U3RhY2tUb3A7CisgICAgICAgIGlmIChmcmFtZS5pbnB1dFN0YWNrID09IG51bGwpIHsKKyAgICAgICAgICAgIGZyYW1lLmlucHV0U3RhY2sgPSBuZXcgaW50W25JbnB1dFN0YWNrICsgb3V0cHV0U3RhY2tUb3BdOworICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbklucHV0U3RhY2s7ICsraSkgeworICAgICAgICAgICAgdCA9IGlucHV0U3RhY2tbaV07CisgICAgICAgICAgICBpZiAoaW5pdGlhbGl6YXRpb25zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0ID0gaW5pdChjdywgdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGFuZ2VkIHw9IG1lcmdlKGN3LCB0LCBmcmFtZS5pbnB1dFN0YWNrLCBpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb3V0cHV0U3RhY2tUb3A7ICsraSkgeworICAgICAgICAgICAgcyA9IG91dHB1dFN0YWNrW2ldOworICAgICAgICAgICAgZGltID0gcyAmIERJTTsKKyAgICAgICAgICAgIGtpbmQgPSBzICYgS0lORDsKKyAgICAgICAgICAgIGlmIChraW5kID09IEJBU0UpIHsKKyAgICAgICAgICAgICAgICB0ID0gczsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGtpbmQgPT0gTE9DQUwpIHsKKyAgICAgICAgICAgICAgICAgICAgdCA9IGRpbSArIGlucHV0TG9jYWxzW3MgJiBWQUxVRV07CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdCA9IGRpbSArIGlucHV0U3RhY2tbblN0YWNrIC0gKHMgJiBWQUxVRSldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKHMgJiBUT1BfSUZfTE9OR19PUl9ET1VCTEUpICE9IDAKKyAgICAgICAgICAgICAgICAgICAgJiYgKHQgPT0gTE9ORyB8fCB0ID09IERPVUJMRSkpIHsKKyAgICAgICAgICAgICAgICAgICAgdCA9IFRPUDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW5pdGlhbGl6YXRpb25zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0ID0gaW5pdChjdywgdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGFuZ2VkIHw9IG1lcmdlKGN3LCB0LCBmcmFtZS5pbnB1dFN0YWNrLCBuSW5wdXRTdGFjayArIGkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjaGFuZ2VkOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1lcmdlcyB0aGUgdHlwZSBhdCB0aGUgZ2l2ZW4gaW5kZXggaW4gdGhlIGdpdmVuIHR5cGUgYXJyYXkgd2l0aCB0aGUgZ2l2ZW4KKyAgICAgKiB0eXBlLiBSZXR1cm5zIDx0dD50cnVlPC90dD4gaWYgdGhlIHR5cGUgYXJyYXkgaGFzIGJlZW4gbW9kaWZpZWQgYnkgdGhpcworICAgICAqIG9wZXJhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjdworICAgICAqICAgICAgICAgICAgdGhlIENsYXNzV3JpdGVyIHRvIHdoaWNoIHRoaXMgbGFiZWwgYmVsb25ncy4KKyAgICAgKiBAcGFyYW0gdAorICAgICAqICAgICAgICAgICAgdGhlIHR5cGUgd2l0aCB3aGljaCB0aGUgdHlwZSBhcnJheSBlbGVtZW50IG11c3QgYmUgbWVyZ2VkLgorICAgICAqIEBwYXJhbSB0eXBlcworICAgICAqICAgICAgICAgICAgYW4gYXJyYXkgb2YgdHlwZXMuCisgICAgICogQHBhcmFtIGluZGV4CisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgdGhlIHR5cGUgdGhhdCBtdXN0IGJlIG1lcmdlZCBpbiAndHlwZXMnLgorICAgICAqIEByZXR1cm4gPHR0PnRydWU8L3R0PiBpZiB0aGUgdHlwZSBhcnJheSBoYXMgYmVlbiBtb2RpZmllZCBieSB0aGlzCisgICAgICogICAgICAgICBvcGVyYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBtZXJnZShmaW5hbCBDbGFzc1dyaXRlciBjdywgaW50IHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnRbXSB0eXBlcywgZmluYWwgaW50IGluZGV4KSB7CisgICAgICAgIGludCB1ID0gdHlwZXNbaW5kZXhdOworICAgICAgICBpZiAodSA9PSB0KSB7CisgICAgICAgICAgICAvLyBpZiB0aGUgdHlwZXMgYXJlIGVxdWFsLCBtZXJnZSh1LHQpPXUsIHNvIHRoZXJlIGlzIG5vIGNoYW5nZQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICgodCAmIH5ESU0pID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmICh1ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0ID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAodSA9PSAwKSB7CisgICAgICAgICAgICAvLyBpZiB0eXBlc1tpbmRleF0gaGFzIG5ldmVyIGJlZW4gYXNzaWduZWQsIG1lcmdlKHUsdCk9dAorICAgICAgICAgICAgdHlwZXNbaW5kZXhdID0gdDsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGludCB2OworICAgICAgICBpZiAoKHUgJiBCQVNFX0tJTkQpID09IE9CSkVDVCB8fCAodSAmIERJTSkgIT0gMCkgeworICAgICAgICAgICAgLy8gaWYgdSBpcyBhIHJlZmVyZW5jZSB0eXBlIG9mIGFueSBkaW1lbnNpb24KKyAgICAgICAgICAgIGlmICh0ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAvLyBpZiB0IGlzIHRoZSBOVUxMIHR5cGUsIG1lcmdlKHUsdCk9dSwgc28gdGhlcmUgaXMgbm8gY2hhbmdlCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIGlmICgodCAmIChESU0gfCBCQVNFX0tJTkQpKSA9PSAodSAmIChESU0gfCBCQVNFX0tJTkQpKSkgeworICAgICAgICAgICAgICAgIC8vIGlmIHQgYW5kIHUgaGF2ZSB0aGUgc2FtZSBkaW1lbnNpb24gYW5kIHNhbWUgYmFzZSBraW5kCisgICAgICAgICAgICAgICAgaWYgKCh1ICYgQkFTRV9LSU5EKSA9PSBPQkpFQ1QpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgdCBpcyBhbHNvIGEgcmVmZXJlbmNlIHR5cGUsIGFuZCBpZiB1IGFuZCB0IGhhdmUgdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIHNhbWUgZGltZW5zaW9uIG1lcmdlKHUsdCkgPSBkaW0odCkgfCBjb21tb24gcGFyZW50IG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBlbGVtZW50IHR5cGVzIG9mIHUgYW5kIHQKKyAgICAgICAgICAgICAgICAgICAgdiA9ICh0ICYgRElNKSB8IE9CSkVDVAorICAgICAgICAgICAgICAgICAgICAgICAgfCBjdy5nZXRNZXJnZWRUeXBlKHQgJiBCQVNFX1ZBTFVFLCB1ICYgQkFTRV9WQUxVRSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgdSBhbmQgdCBhcmUgYXJyYXkgdHlwZXMsIGJ1dCBub3Qgd2l0aCB0aGUgc2FtZSBlbGVtZW50CisgICAgICAgICAgICAgICAgICAgIC8vIHR5cGUsIG1lcmdlKHUsdCkgPSBkaW0odSkgLSAxIHwgamF2YS9sYW5nL09iamVjdAorICAgICAgICAgICAgICAgICAgICBpbnQgdmRpbSA9IEVMRU1FTlRfT0YgKyAodSAmIERJTSk7CisgICAgICAgICAgICAgICAgICAgIHYgPSB2ZGltIHwgT0JKRUNUIHwgY3cuYWRkVHlwZSgiamF2YS9sYW5nL09iamVjdCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKHQgJiBCQVNFX0tJTkQpID09IE9CSkVDVCB8fCAodCAmIERJTSkgIT0gMCkgeworICAgICAgICAgICAgICAgIC8vIGlmIHQgaXMgYW55IG90aGVyIHJlZmVyZW5jZSBvciBhcnJheSB0eXBlLCB0aGUgbWVyZ2VkIHR5cGUKKyAgICAgICAgICAgICAgICAvLyBpcyBtaW4odWRpbSwgdGRpbSkgfCBqYXZhL2xhbmcvT2JqZWN0LCB3aGVyZSB1ZGltIGlzIHRoZQorICAgICAgICAgICAgICAgIC8vIGFycmF5IGRpbWVuc2lvbiBvZiB1LCBtaW51cyAxIGlmIHUgaXMgYW4gYXJyYXkgdHlwZSB3aXRoIGEKKyAgICAgICAgICAgICAgICAvLyBwcmltaXRpdmUgZWxlbWVudCB0eXBlIChhbmQgc2ltaWxhcmx5IGZvciB0ZGltKS4KKyAgICAgICAgICAgICAgICBpbnQgdGRpbSA9ICgoKHQgJiBESU0pID09IDAgfHwgKHQgJiBCQVNFX0tJTkQpID09IE9CSkVDVCkgPyAwCisgICAgICAgICAgICAgICAgICAgICAgICA6IEVMRU1FTlRfT0YpICsgKHQgJiBESU0pOworICAgICAgICAgICAgICAgIGludCB1ZGltID0gKCgodSAmIERJTSkgPT0gMCB8fCAodSAmIEJBU0VfS0lORCkgPT0gT0JKRUNUKSA/IDAKKyAgICAgICAgICAgICAgICAgICAgICAgIDogRUxFTUVOVF9PRikgKyAodSAmIERJTSk7CisgICAgICAgICAgICAgICAgdiA9IE1hdGgubWluKHRkaW0sIHVkaW0pIHwgT0JKRUNUCisgICAgICAgICAgICAgICAgICAgIHwgY3cuYWRkVHlwZSgiamF2YS9sYW5nL09iamVjdCIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBpZiB0IGlzIGFueSBvdGhlciB0eXBlLCBtZXJnZSh1LHQpPVRPUAorICAgICAgICAgICAgICAgIHYgPSBUT1A7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAodSA9PSBOVUxMKSB7CisgICAgICAgICAgICAvLyBpZiB1IGlzIHRoZSBOVUxMIHR5cGUsIG1lcmdlKHUsdCk9dCwKKyAgICAgICAgICAgIC8vIG9yIFRPUCBpZiB0IGlzIG5vdCBhIHJlZmVyZW5jZSB0eXBlCisgICAgICAgICAgICB2ID0gKHQgJiBCQVNFX0tJTkQpID09IE9CSkVDVCB8fCAodCAmIERJTSkgIT0gMCA/IHQgOiBUT1A7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBpZiB1IGlzIGFueSBvdGhlciB0eXBlLCBtZXJnZSh1LHQpPVRPUCB3aGF0ZXZlciB0CisgICAgICAgICAgICB2ID0gVE9QOworICAgICAgICB9CisgICAgICAgIGlmICh1ICE9IHYpIHsKKyAgICAgICAgICAgIHR5cGVzW2luZGV4XSA9IHY7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9qZXJzZXkvcmVwYWNrYWdlZC9vcmcvb2JqZWN0d2ViL2FzbS9IYW5kbGUuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvamVyc2V5L3JlcGFja2FnZWQvb3JnL29iamVjdHdlYi9hc20vSGFuZGxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFhY2E5ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvamVyc2V5L3JlcGFja2FnZWQvb3JnL29iamVjdHdlYi9hc20vSGFuZGxlLmphdmEKQEAgLTAsMCArMSwxNzAgQEAKKy8qKioKKyAqIEFTTTogYSB2ZXJ5IHNtYWxsIGFuZCBmYXN0IEphdmEgYnl0ZWNvZGUgbWFuaXB1bGF0aW9uIGZyYW1ld29yaworICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMTEgSU5SSUEsIEZyYW5jZSBUZWxlY29tCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KKworcGFja2FnZSBqZXJzZXkucmVwYWNrYWdlZC5vcmcub2JqZWN0d2ViLmFzbTsKKworLyoqCisgKiBBIHJlZmVyZW5jZSB0byBhIGZpZWxkIG9yIGEgbWV0aG9kLgorICoKKyAqIEBhdXRob3IgUmVtaSBGb3JheAorICogQGF1dGhvciBFcmljIEJydW5ldG9uCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBIYW5kbGUgeworCisgICAgLyoqCisgICAgICogVGhlIGtpbmQgb2YgZmllbGQgb3IgbWV0aG9kIGRlc2lnbmF0ZWQgYnkgdGhpcyBIYW5kbGUuIFNob3VsZCBiZQorICAgICAqIHtAbGluayBPcGNvZGVzI0hfR0VURklFTER9LCB7QGxpbmsgT3Bjb2RlcyNIX0dFVFNUQVRJQ30sCisgICAgICoge0BsaW5rIE9wY29kZXMjSF9QVVRGSUVMRH0sIHtAbGluayBPcGNvZGVzI0hfUFVUU1RBVElDfSwKKyAgICAgKiB7QGxpbmsgT3Bjb2RlcyNIX0lOVk9LRVZJUlRVQUx9LCB7QGxpbmsgT3Bjb2RlcyNIX0lOVk9LRVNUQVRJQ30sCisgICAgICoge0BsaW5rIE9wY29kZXMjSF9JTlZPS0VTUEVDSUFMfSwge0BsaW5rIE9wY29kZXMjSF9ORVdJTlZPS0VTUEVDSUFMfSBvcgorICAgICAqIHtAbGluayBPcGNvZGVzI0hfSU5WT0tFSU5URVJGQUNFfS4KKyAgICAgKi8KKyAgICBmaW5hbCBpbnQgdGFnOworCisgICAgLyoqCisgICAgICogVGhlIGludGVybmFsIG5hbWUgb2YgdGhlIGNsYXNzIHRoYXQgb3ducyB0aGUgZmllbGQgb3IgbWV0aG9kIGRlc2lnbmF0ZWQKKyAgICAgKiBieSB0aGlzIGhhbmRsZS4KKyAgICAgKi8KKyAgICBmaW5hbCBTdHJpbmcgb3duZXI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZmllbGQgb3IgbWV0aG9kIGRlc2lnbmF0ZWQgYnkgdGhpcyBoYW5kbGUuCisgICAgICovCisgICAgZmluYWwgU3RyaW5nIG5hbWU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRvciBvZiB0aGUgZmllbGQgb3IgbWV0aG9kIGRlc2lnbmF0ZWQgYnkgdGhpcyBoYW5kbGUuCisgICAgICovCisgICAgZmluYWwgU3RyaW5nIGRlc2M7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGZpZWxkIG9yIG1ldGhvZCBoYW5kbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFnCisgICAgICogICAgICAgICAgICB0aGUga2luZCBvZiBmaWVsZCBvciBtZXRob2QgZGVzaWduYXRlZCBieSB0aGlzIEhhbmRsZS4gTXVzdCBiZQorICAgICAqICAgICAgICAgICAge0BsaW5rIE9wY29kZXMjSF9HRVRGSUVMRH0sIHtAbGluayBPcGNvZGVzI0hfR0VUU1RBVElDfSwKKyAgICAgKiAgICAgICAgICAgIHtAbGluayBPcGNvZGVzI0hfUFVURklFTER9LCB7QGxpbmsgT3Bjb2RlcyNIX1BVVFNUQVRJQ30sCisgICAgICogICAgICAgICAgICB7QGxpbmsgT3Bjb2RlcyNIX0lOVk9LRVZJUlRVQUx9LAorICAgICAqICAgICAgICAgICAge0BsaW5rIE9wY29kZXMjSF9JTlZPS0VTVEFUSUN9LAorICAgICAqICAgICAgICAgICAge0BsaW5rIE9wY29kZXMjSF9JTlZPS0VTUEVDSUFMfSwKKyAgICAgKiAgICAgICAgICAgIHtAbGluayBPcGNvZGVzI0hfTkVXSU5WT0tFU1BFQ0lBTH0gb3IKKyAgICAgKiAgICAgICAgICAgIHtAbGluayBPcGNvZGVzI0hfSU5WT0tFSU5URVJGQUNFfS4KKyAgICAgKiBAcGFyYW0gb3duZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnRlcm5hbCBuYW1lIG9mIHRoZSBjbGFzcyB0aGF0IG93bnMgdGhlIGZpZWxkIG9yIG1ldGhvZAorICAgICAqICAgICAgICAgICAgZGVzaWduYXRlZCBieSB0aGlzIGhhbmRsZS4KKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIG9yIG1ldGhvZCBkZXNpZ25hdGVkIGJ5IHRoaXMgaGFuZGxlLgorICAgICAqIEBwYXJhbSBkZXNjCisgICAgICogICAgICAgICAgICB0aGUgZGVzY3JpcHRvciBvZiB0aGUgZmllbGQgb3IgbWV0aG9kIGRlc2lnbmF0ZWQgYnkgdGhpcworICAgICAqICAgICAgICAgICAgaGFuZGxlLgorICAgICAqLworICAgIHB1YmxpYyBIYW5kbGUoaW50IHRhZywgU3RyaW5nIG93bmVyLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2MpIHsKKyAgICAgICAgdGhpcy50YWcgPSB0YWc7CisgICAgICAgIHRoaXMub3duZXIgPSBvd25lcjsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5kZXNjID0gZGVzYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBraW5kIG9mIGZpZWxkIG9yIG1ldGhvZCBkZXNpZ25hdGVkIGJ5IHRoaXMgaGFuZGxlLgorICAgICAqCisgICAgICogQHJldHVybiB7QGxpbmsgT3Bjb2RlcyNIX0dFVEZJRUxEfSwge0BsaW5rIE9wY29kZXMjSF9HRVRTVEFUSUN9LAorICAgICAqICAgICAgICAge0BsaW5rIE9wY29kZXMjSF9QVVRGSUVMRH0sIHtAbGluayBPcGNvZGVzI0hfUFVUU1RBVElDfSwKKyAgICAgKiAgICAgICAgIHtAbGluayBPcGNvZGVzI0hfSU5WT0tFVklSVFVBTH0sIHtAbGluayBPcGNvZGVzI0hfSU5WT0tFU1RBVElDfSwKKyAgICAgKiAgICAgICAgIHtAbGluayBPcGNvZGVzI0hfSU5WT0tFU1BFQ0lBTH0sCisgICAgICogICAgICAgICB7QGxpbmsgT3Bjb2RlcyNIX05FV0lOVk9LRVNQRUNJQUx9IG9yCisgICAgICogICAgICAgICB7QGxpbmsgT3Bjb2RlcyNIX0lOVk9LRUlOVEVSRkFDRX0uCisgICAgICovCisgICAgcHVibGljIGludCBnZXRUYWcoKSB7CisgICAgICAgIHJldHVybiB0YWc7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgaW50ZXJuYWwgbmFtZSBvZiB0aGUgY2xhc3MgdGhhdCBvd25zIHRoZSBmaWVsZCBvciBtZXRob2QKKyAgICAgKiBkZXNpZ25hdGVkIGJ5IHRoaXMgaGFuZGxlLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgaW50ZXJuYWwgbmFtZSBvZiB0aGUgY2xhc3MgdGhhdCBvd25zIHRoZSBmaWVsZCBvciBtZXRob2QKKyAgICAgKiAgICAgICAgIGRlc2lnbmF0ZWQgYnkgdGhpcyBoYW5kbGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRPd25lcigpIHsKKyAgICAgICAgcmV0dXJuIG93bmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIG9yIG1ldGhvZCBkZXNpZ25hdGVkIGJ5IHRoaXMgaGFuZGxlLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgZmllbGQgb3IgbWV0aG9kIGRlc2lnbmF0ZWQgYnkgdGhpcyBoYW5kbGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdG9yIG9mIHRoZSBmaWVsZCBvciBtZXRob2QgZGVzaWduYXRlZCBieSB0aGlzIGhhbmRsZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGRlc2NyaXB0b3Igb2YgdGhlIGZpZWxkIG9yIG1ldGhvZCBkZXNpZ25hdGVkIGJ5IHRoaXMgaGFuZGxlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzYygpIHsKKyAgICAgICAgcmV0dXJuIGRlc2M7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKG9iaiA9PSB0aGlzKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBIYW5kbGUpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgSGFuZGxlIGggPSAoSGFuZGxlKSBvYmo7CisgICAgICAgIHJldHVybiB0YWcgPT0gaC50YWcgJiYgb3duZXIuZXF1YWxzKGgub3duZXIpICYmIG5hbWUuZXF1YWxzKGgubmFtZSkKKyAgICAgICAgICAgICAgICYmIGRlc2MuZXF1YWxzKGguZGVzYyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIHRhZyArIG93bmVyLmhhc2hDb2RlKCkgKiBuYW1lLmhhc2hDb2RlKCkgKiBkZXNjLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGhhbmRsZS4gVGhlIHRleHR1YWwKKyAgICAgKiByZXByZXNlbnRhdGlvbiBpczoKKyAgICAgKgorICAgICAqIDxwcmU+CisgICAgICogb3duZXIgJy4nIG5hbWUgZGVzYyAnICcgJygnIHRhZyAnKScKKyAgICAgKiA8L3ByZT4KKyAgICAgKgorICAgICAqIC4gQXMgdGhpcyBmb3JtYXQgaXMgdW5hbWJpZ3VvdXMsIGl0IGNhbiBiZSBwYXJzZWQgaWYgbmVjZXNzYXJ5LgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBvd25lciArICcuJyArIG5hbWUgKyBkZXNjICsgIiAoIiArIHRhZyArICcpJzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL2plcnNleS9yZXBhY2thZ2VkL29yZy9vYmplY3R3ZWIvYXNtL0hhbmRsZXIuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvamVyc2V5L3JlcGFja2FnZWQvb3JnL29iamVjdHdlYi9hc20vSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlYWZkMTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL2plcnNleS9yZXBhY2thZ2VkL29yZy9vYmplY3R3ZWIvYXNtL0hhbmRsZXIuamF2YQpAQCAtMCwwICsxLDEyMSBAQAorLyoqKgorICogQVNNOiBhIHZlcnkgc21hbGwgYW5kIGZhc3QgSmF2YSBieXRlY29kZSBtYW5pcHVsYXRpb24gZnJhbWV3b3JrCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAxMSBJTlJJQSwgRnJhbmNlIFRlbGVjb20KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBqZXJzZXkucmVwYWNrYWdlZC5vcmcub2JqZWN0d2ViLmFzbTsKKworLyoqCisgKiBJbmZvcm1hdGlvbiBhYm91dCBhbiBleGNlcHRpb24gaGFuZGxlciBibG9jay4KKyAqCisgKiBAYXV0aG9yIEVyaWMgQnJ1bmV0b24KKyAqLworY2xhc3MgSGFuZGxlciB7CisKKyAgICAvKioKKyAgICAgKiBCZWdpbm5pbmcgb2YgdGhlIGV4Y2VwdGlvbiBoYW5kbGVyJ3Mgc2NvcGUgKGluY2x1c2l2ZSkuCisgICAgICovCisgICAgTGFiZWwgc3RhcnQ7CisKKyAgICAvKioKKyAgICAgKiBFbmQgb2YgdGhlIGV4Y2VwdGlvbiBoYW5kbGVyJ3Mgc2NvcGUgKGV4Y2x1c2l2ZSkuCisgICAgICovCisgICAgTGFiZWwgZW5kOworCisgICAgLyoqCisgICAgICogQmVnaW5uaW5nIG9mIHRoZSBleGNlcHRpb24gaGFuZGxlcidzIGNvZGUuCisgICAgICovCisgICAgTGFiZWwgaGFuZGxlcjsKKworICAgIC8qKgorICAgICAqIEludGVybmFsIG5hbWUgb2YgdGhlIHR5cGUgb2YgZXhjZXB0aW9ucyBoYW5kbGVkIGJ5IHRoaXMgaGFuZGxlciwgb3IKKyAgICAgKiA8dHQ+bnVsbDwvdHQ+IHRvIGNhdGNoIGFueSBleGNlcHRpb25zLgorICAgICAqLworICAgIFN0cmluZyBkZXNjOworCisgICAgLyoqCisgICAgICogQ29uc3RhbnQgcG9vbCBpbmRleCBvZiB0aGUgaW50ZXJuYWwgbmFtZSBvZiB0aGUgdHlwZSBvZiBleGNlcHRpb25zCisgICAgICogaGFuZGxlZCBieSB0aGlzIGhhbmRsZXIsIG9yIDAgdG8gY2F0Y2ggYW55IGV4Y2VwdGlvbnMuCisgICAgICovCisgICAgaW50IHR5cGU7CisKKyAgICAvKioKKyAgICAgKiBOZXh0IGV4Y2VwdGlvbiBoYW5kbGVyIGJsb2NrIGluZm8uCisgICAgICovCisgICAgSGFuZGxlciBuZXh0OworCisgICAgLyoqCisgICAgICogUmVtb3ZlcyB0aGUgcmFuZ2UgYmV0d2VlbiBzdGFydCBhbmQgZW5kIGZyb20gdGhlIGdpdmVuIGV4Y2VwdGlvbgorICAgICAqIGhhbmRsZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIGgKKyAgICAgKiAgICAgICAgICAgIGFuIGV4Y2VwdGlvbiBoYW5kbGVyIGxpc3QuCisgICAgICogQHBhcmFtIHN0YXJ0CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgb2YgdGhlIHJhbmdlIHRvIGJlIHJlbW92ZWQuCisgICAgICogQHBhcmFtIGVuZAorICAgICAqICAgICAgICAgICAgdGhlIGVuZCBvZiB0aGUgcmFuZ2UgdG8gYmUgcmVtb3ZlZC4gTWF5YmUgbnVsbC4KKyAgICAgKiBAcmV0dXJuIHRoZSBleGNlcHRpb24gaGFuZGxlciBsaXN0IHdpdGggdGhlIHN0YXJ0LWVuZCByYW5nZSByZW1vdmVkLgorICAgICAqLworICAgIHN0YXRpYyBIYW5kbGVyIHJlbW92ZShIYW5kbGVyIGgsIExhYmVsIHN0YXJ0LCBMYWJlbCBlbmQpIHsKKyAgICAgICAgaWYgKGggPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBoLm5leHQgPSByZW1vdmUoaC5uZXh0LCBzdGFydCwgZW5kKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgaHN0YXJ0ID0gaC5zdGFydC5wb3NpdGlvbjsKKyAgICAgICAgaW50IGhlbmQgPSBoLmVuZC5wb3NpdGlvbjsKKyAgICAgICAgaW50IHMgPSBzdGFydC5wb3NpdGlvbjsKKyAgICAgICAgaW50IGUgPSBlbmQgPT0gbnVsbCA/IEludGVnZXIuTUFYX1ZBTFVFIDogZW5kLnBvc2l0aW9uOworICAgICAgICAvLyBpZiBbaHN0YXJ0LGhlbmRbIGFuZCBbcyxlWyBpbnRlcnZhbHMgaW50ZXJzZWN0Li4uCisgICAgICAgIGlmIChzIDwgaGVuZCAmJiBlID4gaHN0YXJ0KSB7CisgICAgICAgICAgICBpZiAocyA8PSBoc3RhcnQpIHsKKyAgICAgICAgICAgICAgICBpZiAoZSA+PSBoZW5kKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFtoc3RhcnQsaGVuZFsgZnVsbHkgaW5jbHVkZWQgaW4gW3MsZVssIGggcmVtb3ZlZAorICAgICAgICAgICAgICAgICAgICBoID0gaC5uZXh0OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFtoc3RhcnQsaGVuZFsgbWludXMgW3MsZVsgPSBbZSxoZW5kWworICAgICAgICAgICAgICAgICAgICBoLnN0YXJ0ID0gZW5kOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZSA+PSBoZW5kKSB7CisgICAgICAgICAgICAgICAgLy8gW2hzdGFydCxoZW5kWyBtaW51cyBbcyxlWyA9IFtoc3RhcnQsc1sKKyAgICAgICAgICAgICAgICBoLmVuZCA9IHN0YXJ0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBbaHN0YXJ0LGhlbmRbIG1pbnVzIFtzLGVbID0gW2hzdGFydCxzWyArIFtlLGhlbmRbCisgICAgICAgICAgICAgICAgSGFuZGxlciBnID0gbmV3IEhhbmRsZXIoKTsKKyAgICAgICAgICAgICAgICBnLnN0YXJ0ID0gZW5kOworICAgICAgICAgICAgICAgIGcuZW5kID0gaC5lbmQ7CisgICAgICAgICAgICAgICAgZy5oYW5kbGVyID0gaC5oYW5kbGVyOworICAgICAgICAgICAgICAgIGcuZGVzYyA9IGguZGVzYzsKKyAgICAgICAgICAgICAgICBnLnR5cGUgPSBoLnR5cGU7CisgICAgICAgICAgICAgICAgZy5uZXh0ID0gaC5uZXh0OworICAgICAgICAgICAgICAgIGguZW5kID0gc3RhcnQ7CisgICAgICAgICAgICAgICAgaC5uZXh0ID0gZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL2plcnNleS9yZXBhY2thZ2VkL29yZy9vYmplY3R3ZWIvYXNtL0l0ZW0uamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvamVyc2V5L3JlcGFja2FnZWQvb3JnL29iamVjdHdlYi9hc20vSXRlbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjODhiM2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL2plcnNleS9yZXBhY2thZ2VkL29yZy9vYmplY3R3ZWIvYXNtL0l0ZW0uamF2YQpAQCAtMCwwICsxLDMxMyBAQAorLyoqKgorICogQVNNOiBhIHZlcnkgc21hbGwgYW5kIGZhc3QgSmF2YSBieXRlY29kZSBtYW5pcHVsYXRpb24gZnJhbWV3b3JrCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAxMSBJTlJJQSwgRnJhbmNlIFRlbGVjb20KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBqZXJzZXkucmVwYWNrYWdlZC5vcmcub2JqZWN0d2ViLmFzbTsKKworLyoqCisgKiBBIGNvbnN0YW50IHBvb2wgaXRlbS4gQ29uc3RhbnQgcG9vbCBpdGVtcyBjYW4gYmUgY3JlYXRlZCB3aXRoIHRoZSAnbmV3WFhYJworICogbWV0aG9kcyBpbiB0aGUge0BsaW5rIENsYXNzV3JpdGVyfSBjbGFzcy4KKyAqCisgKiBAYXV0aG9yIEVyaWMgQnJ1bmV0b24KKyAqLworZmluYWwgY2xhc3MgSXRlbSB7CisKKyAgICAvKioKKyAgICAgKiBJbmRleCBvZiB0aGlzIGl0ZW0gaW4gdGhlIGNvbnN0YW50IHBvb2wuCisgICAgICovCisgICAgaW50IGluZGV4OworCisgICAgLyoqCisgICAgICogVHlwZSBvZiB0aGlzIGNvbnN0YW50IHBvb2wgaXRlbS4gQSBzaW5nbGUgY2xhc3MgaXMgdXNlZCB0byByZXByZXNlbnQgYWxsCisgICAgICogY29uc3RhbnQgcG9vbCBpdGVtIHR5cGVzLCBpbiBvcmRlciB0byBtaW5pbWl6ZSB0aGUgYnl0ZWNvZGUgc2l6ZSBvZiB0aGlzCisgICAgICogcGFja2FnZS4gVGhlIHZhbHVlIG9mIHRoaXMgZmllbGQgaXMgb25lIG9mIHtAbGluayBDbGFzc1dyaXRlciNJTlR9LAorICAgICAqIHtAbGluayBDbGFzc1dyaXRlciNMT05HfSwge0BsaW5rIENsYXNzV3JpdGVyI0ZMT0FUfSwKKyAgICAgKiB7QGxpbmsgQ2xhc3NXcml0ZXIjRE9VQkxFfSwge0BsaW5rIENsYXNzV3JpdGVyI1VURjh9LAorICAgICAqIHtAbGluayBDbGFzc1dyaXRlciNTVFJ9LCB7QGxpbmsgQ2xhc3NXcml0ZXIjQ0xBU1N9LAorICAgICAqIHtAbGluayBDbGFzc1dyaXRlciNOQU1FX1RZUEV9LCB7QGxpbmsgQ2xhc3NXcml0ZXIjRklFTER9LAorICAgICAqIHtAbGluayBDbGFzc1dyaXRlciNNRVRIfSwge0BsaW5rIENsYXNzV3JpdGVyI0lNRVRIfSwKKyAgICAgKiB7QGxpbmsgQ2xhc3NXcml0ZXIjTVRZUEV9LCB7QGxpbmsgQ2xhc3NXcml0ZXIjSU5EWX0uCisgICAgICoKKyAgICAgKiBNZXRob2RIYW5kbGUgY29uc3RhbnQgOSB2YXJpYXRpb25zIGFyZSBzdG9yZWQgdXNpbmcgYSByYW5nZSBvZiA5IHZhbHVlcworICAgICAqIGZyb20ge0BsaW5rIENsYXNzV3JpdGVyI0hBTkRMRV9CQVNFfSArIDEgdG8KKyAgICAgKiB7QGxpbmsgQ2xhc3NXcml0ZXIjSEFORExFX0JBU0V9ICsgOS4KKyAgICAgKgorICAgICAqIFNwZWNpYWwgSXRlbSB0eXBlcyBhcmUgdXNlZCBmb3IgSXRlbXMgdGhhdCBhcmUgc3RvcmVkIGluIHRoZSBDbGFzc1dyaXRlcgorICAgICAqIHtAbGluayBDbGFzc1dyaXRlciN0eXBlVGFibGV9LCBpbnN0ZWFkIG9mIHRoZSBjb25zdGFudCBwb29sLCBpbiBvcmRlciB0bworICAgICAqIGF2b2lkIGNsYXNoZXMgd2l0aCBub3JtYWwgY29uc3RhbnQgcG9vbCBpdGVtcyBpbiB0aGUgQ2xhc3NXcml0ZXIgY29uc3RhbnQKKyAgICAgKiBwb29sJ3MgaGFzaCB0YWJsZS4gVGhlc2Ugc3BlY2lhbCBpdGVtIHR5cGVzIGFyZQorICAgICAqIHtAbGluayBDbGFzc1dyaXRlciNUWVBFX05PUk1BTH0sIHtAbGluayBDbGFzc1dyaXRlciNUWVBFX1VOSU5JVH0gYW5kCisgICAgICoge0BsaW5rIENsYXNzV3JpdGVyI1RZUEVfTUVSR0VEfS4KKyAgICAgKi8KKyAgICBpbnQgdHlwZTsKKworICAgIC8qKgorICAgICAqIFZhbHVlIG9mIHRoaXMgaXRlbSwgZm9yIGFuIGludGVnZXIgaXRlbS4KKyAgICAgKi8KKyAgICBpbnQgaW50VmFsOworCisgICAgLyoqCisgICAgICogVmFsdWUgb2YgdGhpcyBpdGVtLCBmb3IgYSBsb25nIGl0ZW0uCisgICAgICovCisgICAgbG9uZyBsb25nVmFsOworCisgICAgLyoqCisgICAgICogRmlyc3QgcGFydCBvZiB0aGUgdmFsdWUgb2YgdGhpcyBpdGVtLCBmb3IgaXRlbXMgdGhhdCBkbyBub3QgaG9sZCBhCisgICAgICogcHJpbWl0aXZlIHZhbHVlLgorICAgICAqLworICAgIFN0cmluZyBzdHJWYWwxOworCisgICAgLyoqCisgICAgICogU2Vjb25kIHBhcnQgb2YgdGhlIHZhbHVlIG9mIHRoaXMgaXRlbSwgZm9yIGl0ZW1zIHRoYXQgZG8gbm90IGhvbGQgYQorICAgICAqIHByaW1pdGl2ZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBTdHJpbmcgc3RyVmFsMjsKKworICAgIC8qKgorICAgICAqIFRoaXJkIHBhcnQgb2YgdGhlIHZhbHVlIG9mIHRoaXMgaXRlbSwgZm9yIGl0ZW1zIHRoYXQgZG8gbm90IGhvbGQgYQorICAgICAqIHByaW1pdGl2ZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBTdHJpbmcgc3RyVmFsMzsKKworICAgIC8qKgorICAgICAqIFRoZSBoYXNoIGNvZGUgdmFsdWUgb2YgdGhpcyBjb25zdGFudCBwb29sIGl0ZW0uCisgICAgICovCisgICAgaW50IGhhc2hDb2RlOworCisgICAgLyoqCisgICAgICogTGluayB0byBhbm90aGVyIGNvbnN0YW50IHBvb2wgaXRlbSwgdXNlZCBmb3IgY29sbGlzaW9uIGxpc3RzIGluIHRoZQorICAgICAqIGNvbnN0YW50IHBvb2wncyBoYXNoIHRhYmxlLgorICAgICAqLworICAgIEl0ZW0gbmV4dDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gdW5pbml0aWFsaXplZCB7QGxpbmsgSXRlbX0uCisgICAgICovCisgICAgSXRlbSgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIHVuaW5pdGlhbGl6ZWQge0BsaW5rIEl0ZW19IGZvciBjb25zdGFudCBwb29sIGVsZW1lbnQgYXQKKyAgICAgKiBnaXZlbiBwb3NpdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmRleAorICAgICAqICAgICAgICAgICAgaW5kZXggb2YgdGhlIGl0ZW0gdG8gYmUgY29uc3RydWN0ZWQuCisgICAgICovCisgICAgSXRlbShmaW5hbCBpbnQgaW5kZXgpIHsKKyAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4OworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBjb3B5IG9mIHRoZSBnaXZlbiBpdGVtLgorICAgICAqCisgICAgICogQHBhcmFtIGluZGV4CisgICAgICogICAgICAgICAgICBpbmRleCBvZiB0aGUgaXRlbSB0byBiZSBjb25zdHJ1Y3RlZC4KKyAgICAgKiBAcGFyYW0gaQorICAgICAqICAgICAgICAgICAgdGhlIGl0ZW0gdGhhdCBtdXN0IGJlIGNvcGllZCBpbnRvIHRoZSBpdGVtIHRvIGJlIGNvbnN0cnVjdGVkLgorICAgICAqLworICAgIEl0ZW0oZmluYWwgaW50IGluZGV4LCBmaW5hbCBJdGVtIGkpIHsKKyAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4OworICAgICAgICB0eXBlID0gaS50eXBlOworICAgICAgICBpbnRWYWwgPSBpLmludFZhbDsKKyAgICAgICAgbG9uZ1ZhbCA9IGkubG9uZ1ZhbDsKKyAgICAgICAgc3RyVmFsMSA9IGkuc3RyVmFsMTsKKyAgICAgICAgc3RyVmFsMiA9IGkuc3RyVmFsMjsKKyAgICAgICAgc3RyVmFsMyA9IGkuc3RyVmFsMzsKKyAgICAgICAgaGFzaENvZGUgPSBpLmhhc2hDb2RlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhpcyBpdGVtIHRvIGFuIGludGVnZXIgaXRlbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnRWYWwKKyAgICAgKiAgICAgICAgICAgIHRoZSB2YWx1ZSBvZiB0aGlzIGl0ZW0uCisgICAgICovCisgICAgdm9pZCBzZXQoZmluYWwgaW50IGludFZhbCkgeworICAgICAgICB0aGlzLnR5cGUgPSBDbGFzc1dyaXRlci5JTlQ7CisgICAgICAgIHRoaXMuaW50VmFsID0gaW50VmFsOworICAgICAgICB0aGlzLmhhc2hDb2RlID0gMHg3RkZGRkZGRiAmICh0eXBlICsgaW50VmFsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoaXMgaXRlbSB0byBhIGxvbmcgaXRlbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsb25nVmFsCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgb2YgdGhpcyBpdGVtLgorICAgICAqLworICAgIHZvaWQgc2V0KGZpbmFsIGxvbmcgbG9uZ1ZhbCkgeworICAgICAgICB0aGlzLnR5cGUgPSBDbGFzc1dyaXRlci5MT05HOworICAgICAgICB0aGlzLmxvbmdWYWwgPSBsb25nVmFsOworICAgICAgICB0aGlzLmhhc2hDb2RlID0gMHg3RkZGRkZGRiAmICh0eXBlICsgKGludCkgbG9uZ1ZhbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGlzIGl0ZW0gdG8gYSBmbG9hdCBpdGVtLgorICAgICAqCisgICAgICogQHBhcmFtIGZsb2F0VmFsCisgICAgICogICAgICAgICAgICB0aGUgdmFsdWUgb2YgdGhpcyBpdGVtLgorICAgICAqLworICAgIHZvaWQgc2V0KGZpbmFsIGZsb2F0IGZsb2F0VmFsKSB7CisgICAgICAgIHRoaXMudHlwZSA9IENsYXNzV3JpdGVyLkZMT0FUOworICAgICAgICB0aGlzLmludFZhbCA9IEZsb2F0LmZsb2F0VG9SYXdJbnRCaXRzKGZsb2F0VmFsKTsKKyAgICAgICAgdGhpcy5oYXNoQ29kZSA9IDB4N0ZGRkZGRkYgJiAodHlwZSArIChpbnQpIGZsb2F0VmFsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoaXMgaXRlbSB0byBhIGRvdWJsZSBpdGVtLgorICAgICAqCisgICAgICogQHBhcmFtIGRvdWJsZVZhbAorICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIG9mIHRoaXMgaXRlbS4KKyAgICAgKi8KKyAgICB2b2lkIHNldChmaW5hbCBkb3VibGUgZG91YmxlVmFsKSB7CisgICAgICAgIHRoaXMudHlwZSA9IENsYXNzV3JpdGVyLkRPVUJMRTsKKyAgICAgICAgdGhpcy5sb25nVmFsID0gRG91YmxlLmRvdWJsZVRvUmF3TG9uZ0JpdHMoZG91YmxlVmFsKTsKKyAgICAgICAgdGhpcy5oYXNoQ29kZSA9IDB4N0ZGRkZGRkYgJiAodHlwZSArIChpbnQpIGRvdWJsZVZhbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGlzIGl0ZW0gdG8gYW4gaXRlbSB0aGF0IGRvIG5vdCBob2xkIGEgcHJpbWl0aXZlIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSB0eXBlIG9mIHRoaXMgaXRlbS4KKyAgICAgKiBAcGFyYW0gc3RyVmFsMQorICAgICAqICAgICAgICAgICAgZmlyc3QgcGFydCBvZiB0aGUgdmFsdWUgb2YgdGhpcyBpdGVtLgorICAgICAqIEBwYXJhbSBzdHJWYWwyCisgICAgICogICAgICAgICAgICBzZWNvbmQgcGFydCBvZiB0aGUgdmFsdWUgb2YgdGhpcyBpdGVtLgorICAgICAqIEBwYXJhbSBzdHJWYWwzCisgICAgICogICAgICAgICAgICB0aGlyZCBwYXJ0IG9mIHRoZSB2YWx1ZSBvZiB0aGlzIGl0ZW0uCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoImZhbGx0aHJvdWdoIikKKyAgICB2b2lkIHNldChmaW5hbCBpbnQgdHlwZSwgZmluYWwgU3RyaW5nIHN0clZhbDEsIGZpbmFsIFN0cmluZyBzdHJWYWwyLAorICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzdHJWYWwzKSB7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIHRoaXMuc3RyVmFsMSA9IHN0clZhbDE7CisgICAgICAgIHRoaXMuc3RyVmFsMiA9IHN0clZhbDI7CisgICAgICAgIHRoaXMuc3RyVmFsMyA9IHN0clZhbDM7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5DTEFTUzoKKyAgICAgICAgICAgICAgICB0aGlzLmludFZhbCA9IDA7ICAgICAvLyBpbnRWYWwgb2YgYSBjbGFzcyBtdXN0IGJlIHplcm8sIHNlZSB2aXNpdElubmVyQ2xhc3MKKyAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuVVRGODoKKyAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuU1RSOgorICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5NVFlQRToKKyAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuVFlQRV9OT1JNQUw6CisgICAgICAgICAgICAgICAgaGFzaENvZGUgPSAweDdGRkZGRkZGICYgKHR5cGUgKyBzdHJWYWwxLmhhc2hDb2RlKCkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuTkFNRV9UWVBFOiB7CisgICAgICAgICAgICAgICAgaGFzaENvZGUgPSAweDdGRkZGRkZGICYgKHR5cGUgKyBzdHJWYWwxLmhhc2hDb2RlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc3RyVmFsMi5oYXNoQ29kZSgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBDbGFzc1dyaXRlci5GSUVMRDoKKyAgICAgICAgICAgIC8vIENsYXNzV3JpdGVyLk1FVEg6CisgICAgICAgICAgICAvLyBDbGFzc1dyaXRlci5JTUVUSDoKKyAgICAgICAgICAgIC8vIENsYXNzV3JpdGVyLkhBTkRMRV9CQVNFICsgMS4uOQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBoYXNoQ29kZSA9IDB4N0ZGRkZGRkYgJiAodHlwZSArIHN0clZhbDEuaGFzaENvZGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzdHJWYWwyLmhhc2hDb2RlKCkgKiBzdHJWYWwzLmhhc2hDb2RlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgaXRlbSB0byBhbiBJbnZva2VEeW5hbWljIGl0ZW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgICAgICAgaW52b2tlZHluYW1pYydzIG5hbWUuCisgICAgICogQHBhcmFtIGRlc2MKKyAgICAgKiAgICAgICAgICAgIGludm9rZWR5bmFtaWMncyBkZXNjLgorICAgICAqIEBwYXJhbSBic21JbmRleAorICAgICAqICAgICAgICAgICAgemVybyBiYXNlZCBpbmRleCBpbnRvIHRoZSBjbGFzcyBhdHRyaWJ1dGUgQm9vdHJhcE1ldGhvZHMuCisgICAgICovCisgICAgdm9pZCBzZXQoU3RyaW5nIG5hbWUsIFN0cmluZyBkZXNjLCBpbnQgYnNtSW5kZXgpIHsKKyAgICAgICAgdGhpcy50eXBlID0gQ2xhc3NXcml0ZXIuSU5EWTsKKyAgICAgICAgdGhpcy5sb25nVmFsID0gYnNtSW5kZXg7CisgICAgICAgIHRoaXMuc3RyVmFsMSA9IG5hbWU7CisgICAgICAgIHRoaXMuc3RyVmFsMiA9IGRlc2M7CisgICAgICAgIHRoaXMuaGFzaENvZGUgPSAweDdGRkZGRkZGICYgKENsYXNzV3JpdGVyLklORFkgKyBic21JbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzdHJWYWwxLmhhc2hDb2RlKCkgKiBzdHJWYWwyLmhhc2hDb2RlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGl0ZW0gdG8gYSBCb290c3RyYXBNZXRob2QgaXRlbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwb3NpdGlvbgorICAgICAqICAgICAgICAgICAgcG9zaXRpb24gaW4gYnl0ZSBpbiB0aGUgY2xhc3MgYXR0cmlidXRlIEJvb3RyYXBNZXRob2RzLgorICAgICAqIEBwYXJhbSBoYXNoQ29kZQorICAgICAqICAgICAgICAgICAgaGFzaGNvZGUgb2YgdGhlIGl0ZW0uIFRoaXMgaGFzaGNvZGUgaXMgcHJvY2Vzc2VkIGZyb20gdGhlCisgICAgICogICAgICAgICAgICBoYXNoY29kZSBvZiB0aGUgYm9vdHN0cmFwIG1ldGhvZCBhbmQgdGhlIGhhc2hjb2RlIG9mIGFsbAorICAgICAqICAgICAgICAgICAgYm9vdHN0cmFwIGFyZ3VtZW50cy4KKyAgICAgKi8KKyAgICB2b2lkIHNldChpbnQgcG9zaXRpb24sIGludCBoYXNoQ29kZSkgeworICAgICAgICB0aGlzLnR5cGUgPSBDbGFzc1dyaXRlci5CU007CisgICAgICAgIHRoaXMuaW50VmFsID0gcG9zaXRpb247CisgICAgICAgIHRoaXMuaGFzaENvZGUgPSBoYXNoQ29kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGdpdmVuIGl0ZW0gaXMgZXF1YWwgdG8gdGhpcyBvbmUuIDxpPlRoaXMgbWV0aG9kIGFzc3VtZXMKKyAgICAgKiB0aGF0IHRoZSB0d28gaXRlbXMgaGF2ZSB0aGUgc2FtZSB7QGxpbmsgI3R5cGV9PC9pPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpCisgICAgICogICAgICAgICAgICB0aGUgaXRlbSB0byBiZSBjb21wYXJlZCB0byB0aGlzIG9uZS4gQm90aCBpdGVtcyBtdXN0IGhhdmUgdGhlCisgICAgICogICAgICAgICAgICBzYW1lIHtAbGluayAjdHlwZX0uCisgICAgICogQHJldHVybiA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoZSBnaXZlbiBpdGVtIGlmIGVxdWFsIHRvIHRoaXMgb25lLAorICAgICAqICAgICAgICAgPHR0PmZhbHNlPC90dD4gb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2xlYW4gaXNFcXVhbFRvKGZpbmFsIEl0ZW0gaSkgeworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuVVRGODoKKyAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuU1RSOgorICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5DTEFTUzoKKyAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuTVRZUEU6CisgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLlRZUEVfTk9STUFMOgorICAgICAgICAgICAgICAgIHJldHVybiBpLnN0clZhbDEuZXF1YWxzKHN0clZhbDEpOworICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5UWVBFX01FUkdFRDoKKyAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuTE9ORzoKKyAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuRE9VQkxFOgorICAgICAgICAgICAgICAgIHJldHVybiBpLmxvbmdWYWwgPT0gbG9uZ1ZhbDsKKyAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuSU5UOgorICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5GTE9BVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gaS5pbnRWYWwgPT0gaW50VmFsOworICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5UWVBFX1VOSU5JVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gaS5pbnRWYWwgPT0gaW50VmFsICYmIGkuc3RyVmFsMS5lcXVhbHMoc3RyVmFsMSk7CisgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLk5BTUVfVFlQRToKKyAgICAgICAgICAgICAgICByZXR1cm4gaS5zdHJWYWwxLmVxdWFscyhzdHJWYWwxKSAmJiBpLnN0clZhbDIuZXF1YWxzKHN0clZhbDIpOworICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5JTkRZOiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGkubG9uZ1ZhbCA9PSBsb25nVmFsICYmIGkuc3RyVmFsMS5lcXVhbHMoc3RyVmFsMSkKKyAgICAgICAgICAgICAgICAgICAgICAgJiYgaS5zdHJWYWwyLmVxdWFscyhzdHJWYWwyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGNhc2UgQ2xhc3NXcml0ZXIuRklFTEQ6CisgICAgICAgICAgICAvLyBjYXNlIENsYXNzV3JpdGVyLk1FVEg6CisgICAgICAgICAgICAvLyBjYXNlIENsYXNzV3JpdGVyLklNRVRIOgorICAgICAgICAgICAgLy8gY2FzZSBDbGFzc1dyaXRlci5IQU5ETEVfQkFTRSArIDEuLjkKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIGkuc3RyVmFsMS5lcXVhbHMoc3RyVmFsMSkgJiYgaS5zdHJWYWwyLmVxdWFscyhzdHJWYWwyKQorICAgICAgICAgICAgICAgICAgICAgICAmJiBpLnN0clZhbDMuZXF1YWxzKHN0clZhbDMpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL2plcnNleS9yZXBhY2thZ2VkL29yZy9vYmplY3R3ZWIvYXNtL0xhYmVsLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL2plcnNleS9yZXBhY2thZ2VkL29yZy9vYmplY3R3ZWIvYXNtL0xhYmVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY5MjBhZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvamVyc2V5L3JlcGFja2FnZWQvb3JnL29iamVjdHdlYi9hc20vTGFiZWwuamF2YQpAQCAtMCwwICsxLDU2NSBAQAorLyoqKgorICogQVNNOiBhIHZlcnkgc21hbGwgYW5kIGZhc3QgSmF2YSBieXRlY29kZSBtYW5pcHVsYXRpb24gZnJhbWV3b3JrCisgKiBDb3B5cmlnaHQgKGMpIDIwMDAtMjAxMSBJTlJJQSwgRnJhbmNlIFRlbGVjb20KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKKyAqIGFyZSBtZXQ6CisgKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cworICogICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQorICogQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTgorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkKKyAqIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YKKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworcGFja2FnZSBqZXJzZXkucmVwYWNrYWdlZC5vcmcub2JqZWN0d2ViLmFzbTsKKworLyoqCisgKiBBIGxhYmVsIHJlcHJlc2VudHMgYSBwb3NpdGlvbiBpbiB0aGUgYnl0ZWNvZGUgb2YgYSBtZXRob2QuIExhYmVscyBhcmUgdXNlZAorICogZm9yIGp1bXAsIGdvdG8sIGFuZCBzd2l0Y2ggaW5zdHJ1Y3Rpb25zLCBhbmQgZm9yIHRyeSBjYXRjaCBibG9ja3MuIEEgbGFiZWwKKyAqIGRlc2lnbmF0ZXMgdGhlIDxpPmluc3RydWN0aW9uPC9pPiB0aGF0IGlzIGp1c3QgYWZ0ZXIuIE5vdGUgaG93ZXZlciB0aGF0IHRoZXJlCisgKiBjYW4gYmUgb3RoZXIgZWxlbWVudHMgYmV0d2VlbiBhIGxhYmVsIGFuZCB0aGUgaW5zdHJ1Y3Rpb24gaXQgZGVzaWduYXRlcyAoc3VjaAorICogYXMgb3RoZXIgbGFiZWxzLCBzdGFjayBtYXAgZnJhbWVzLCBsaW5lIG51bWJlcnMsIGV0Yy4pLgorICoKKyAqIEBhdXRob3IgRXJpYyBCcnVuZXRvbgorICovCitwdWJsaWMgY2xhc3MgTGFiZWwgeworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIGlmIHRoaXMgbGFiZWwgaXMgb25seSB1c2VkIGZvciBkZWJ1ZyBhdHRyaWJ1dGVzLiBTdWNoIGEgbGFiZWwKKyAgICAgKiBpcyBub3QgdGhlIHN0YXJ0IG9mIGEgYmFzaWMgYmxvY2ssIHRoZSB0YXJnZXQgb2YgYSBqdW1wIGluc3RydWN0aW9uLCBvcgorICAgICAqIGFuIGV4Y2VwdGlvbiBoYW5kbGVyLiBJdCBjYW4gYmUgc2FmZWx5IGlnbm9yZWQgaW4gY29udHJvbCBmbG93IGdyYXBoCisgICAgICogYW5hbHlzaXMgYWxnb3JpdGhtcyAoZm9yIG9wdGltaXphdGlvbiBwdXJwb3NlcykuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBERUJVRyA9IDE7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIHBvc2l0aW9uIG9mIHRoaXMgbGFiZWwgaXMga25vd24uCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBSRVNPTFZFRCA9IDI7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgaWYgdGhpcyBsYWJlbCBoYXMgYmVlbiB1cGRhdGVkLCBhZnRlciBpbnN0cnVjdGlvbiByZXNpemluZy4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IFJFU0laRUQgPSA0OworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIGlmIHRoaXMgYmFzaWMgYmxvY2sgaGFzIGJlZW4gcHVzaGVkIGluIHRoZSBiYXNpYyBibG9jayBzdGFjay4KKyAgICAgKiBTZWUge0BsaW5rIE1ldGhvZFdyaXRlciN2aXNpdE1heHMgdmlzaXRNYXhzfS4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IFBVU0hFRCA9IDg7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgaWYgdGhpcyBsYWJlbCBpcyB0aGUgdGFyZ2V0IG9mIGEganVtcCBpbnN0cnVjdGlvbiwgb3IgdGhlIHN0YXJ0CisgICAgICogb2YgYW4gZXhjZXB0aW9uIGhhbmRsZXIuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBUQVJHRVQgPSAxNjsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyBpZiBhIHN0YWNrIG1hcCBmcmFtZSBtdXN0IGJlIHN0b3JlZCBmb3IgdGhpcyBsYWJlbC4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IFNUT1JFID0gMzI7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgaWYgdGhpcyBsYWJlbCBjb3JyZXNwb25kcyB0byBhIHJlYWNoYWJsZSBiYXNpYyBibG9jay4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IFJFQUNIQUJMRSA9IDY0OworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIGlmIHRoaXMgYmFzaWMgYmxvY2sgZW5kcyB3aXRoIGEgSlNSIGluc3RydWN0aW9uLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgSlNSID0gMTI4OworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIGlmIHRoaXMgYmFzaWMgYmxvY2sgZW5kcyB3aXRoIGEgUkVUIGluc3RydWN0aW9uLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgUkVUID0gMjU2OworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIGlmIHRoaXMgYmFzaWMgYmxvY2sgaXMgdGhlIHN0YXJ0IG9mIGEgc3Vicm91dGluZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IFNVQlJPVVRJTkUgPSA1MTI7CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgaWYgdGhpcyBzdWJyb3V0aW5lIGJhc2ljIGJsb2NrIGhhcyBiZWVuIHZpc2l0ZWQgYnkgYQorICAgICAqIHZpc2l0U3Vicm91dGluZShudWxsLCAuLi4pIGNhbGwuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBWSVNJVEVEID0gMTAyNDsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyBpZiB0aGlzIHN1YnJvdXRpbmUgYmFzaWMgYmxvY2sgaGFzIGJlZW4gdmlzaXRlZCBieSBhCisgICAgICogdmlzaXRTdWJyb3V0aW5lKCFudWxsLCAuLi4pIGNhbGwuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBWSVNJVEVEMiA9IDIwNDg7CisKKyAgICAvKioKKyAgICAgKiBGaWVsZCB1c2VkIHRvIGFzc29jaWF0ZSB1c2VyIGluZm9ybWF0aW9uIHRvIGEgbGFiZWwuIFdhcm5pbmc6IHRoaXMgZmllbGQKKyAgICAgKiBpcyB1c2VkIGJ5IHRoZSBBU00gdHJlZSBwYWNrYWdlLiBJbiBvcmRlciB0byB1c2UgaXQgd2l0aCB0aGUgQVNNIHRyZWUKKyAgICAgKiBwYWNrYWdlIHlvdSBtdXN0IG92ZXJyaWRlIHRoZQorICAgICAqIHtAbGluayBvcmcub2JqZWN0d2ViLmFzbS50cmVlLk1ldGhvZE5vZGUjZ2V0TGFiZWxOb2RlfSBtZXRob2QuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBpbmZvOworCisgICAgLyoqCisgICAgICogRmxhZ3MgdGhhdCBpbmRpY2F0ZSB0aGUgc3RhdHVzIG9mIHRoaXMgbGFiZWwuCisgICAgICoKKyAgICAgKiBAc2VlICNERUJVRworICAgICAqIEBzZWUgI1JFU09MVkVECisgICAgICogQHNlZSAjUkVTSVpFRAorICAgICAqIEBzZWUgI1BVU0hFRAorICAgICAqIEBzZWUgI1RBUkdFVAorICAgICAqIEBzZWUgI1NUT1JFCisgICAgICogQHNlZSAjUkVBQ0hBQkxFCisgICAgICogQHNlZSAjSlNSCisgICAgICogQHNlZSAjUkVUCisgICAgICovCisgICAgaW50IHN0YXR1czsKKworICAgIC8qKgorICAgICAqIFRoZSBsaW5lIG51bWJlciBjb3JyZXNwb25kaW5nIHRvIHRoaXMgbGFiZWwsIGlmIGtub3duLiBJZiB0aGVyZSBhcmUKKyAgICAgKiBzZXZlcmFsIGxpbmVzLCBlYWNoIGxpbmUgaXMgc3RvcmVkIGluIGEgc2VwYXJhdGUgbGFiZWwsIGFsbCBsaW5rZWQgdmlhCisgICAgICogdGhlaXIgbmV4dCBmaWVsZCAodGhlc2UgbGlua3MgYXJlIGNyZWF0ZWQgaW4gQ2xhc3NSZWFkZXIgYW5kIHJlbW92ZWQganVzdAorICAgICAqIGJlZm9yZSB2aXNpdExhYmVsIGlzIGNhbGxlZCwgc28gdGhhdCB0aGlzIGRvZXMgbm90IGltcGFjdCB0aGUgcmVzdCBvZiB0aGUKKyAgICAgKiBjb2RlKS4KKyAgICAgKi8KKyAgICBpbnQgbGluZTsKKworICAgIC8qKgorICAgICAqIFRoZSBwb3NpdGlvbiBvZiB0aGlzIGxhYmVsIGluIHRoZSBjb2RlLCBpZiBrbm93bi4KKyAgICAgKi8KKyAgICBpbnQgcG9zaXRpb247CisKKyAgICAvKioKKyAgICAgKiBOdW1iZXIgb2YgZm9yd2FyZCByZWZlcmVuY2VzIHRvIHRoaXMgbGFiZWwsIHRpbWVzIHR3by4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCByZWZlcmVuY2VDb3VudDsKKworICAgIC8qKgorICAgICAqIEluZm9ybWF0aW9ucyBhYm91dCBmb3J3YXJkIHJlZmVyZW5jZXMuIEVhY2ggZm9yd2FyZCByZWZlcmVuY2UgaXMKKyAgICAgKiBkZXNjcmliZWQgYnkgdHdvIGNvbnNlY3V0aXZlIGludGVnZXJzIGluIHRoaXMgYXJyYXk6IHRoZSBmaXJzdCBvbmUgaXMgdGhlCisgICAgICogcG9zaXRpb24gb2YgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGJ5dGVjb2RlIGluc3RydWN0aW9uIHRoYXQgY29udGFpbnMgdGhlCisgICAgICogZm9yd2FyZCByZWZlcmVuY2UsIHdoaWxlIHRoZSBzZWNvbmQgaXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBieXRlIG9mCisgICAgICogdGhlIGZvcndhcmQgcmVmZXJlbmNlIGl0c2VsZi4gSW4gZmFjdCB0aGUgc2lnbiBvZiB0aGUgZmlyc3QgaW50ZWdlcgorICAgICAqIGluZGljYXRlcyBpZiB0aGlzIHJlZmVyZW5jZSB1c2VzIDIgb3IgNCBieXRlcywgYW5kIGl0cyBhYnNvbHV0ZSB2YWx1ZQorICAgICAqIGdpdmVzIHRoZSBwb3NpdGlvbiBvZiB0aGUgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb24uIFRoaXMgYXJyYXkgaXMgYWxzbyB1c2VkCisgICAgICogYXMgYSBiaXRzZXQgdG8gc3RvcmUgdGhlIHN1YnJvdXRpbmVzIHRvIHdoaWNoIGEgYmFzaWMgYmxvY2sgYmVsb25ncy4gVGhpcworICAgICAqIGluZm9ybWF0aW9uIGlzIG5lZWRlZCBpbiB7QGxpbmtlZCBNZXRob2RXcml0ZXIjdmlzaXRNYXhzfSwgYWZ0ZXIgYWxsCisgICAgICogZm9yd2FyZCByZWZlcmVuY2VzIGhhdmUgYmVlbiByZXNvbHZlZC4gSGVuY2UgdGhlIHNhbWUgYXJyYXkgY2FuIGJlIHVzZWQKKyAgICAgKiBmb3IgYm90aCBwdXJwb3NlcyB3aXRob3V0IHByb2JsZW1zLgorICAgICAqLworICAgIHByaXZhdGUgaW50W10gc3JjQW5kUmVmUG9zaXRpb25zOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKgorICAgICAqIEZpZWxkcyBmb3IgdGhlIGNvbnRyb2wgZmxvdyBhbmQgZGF0YSBmbG93IGdyYXBoIGFuYWx5c2lzIGFsZ29yaXRobXMgKHVzZWQKKyAgICAgKiB0byBjb21wdXRlIHRoZSBtYXhpbXVtIHN0YWNrIHNpemUgb3IgdGhlIHN0YWNrIG1hcCBmcmFtZXMpLiBBIGNvbnRyb2wKKyAgICAgKiBmbG93IGdyYXBoIGNvbnRhaW5zIG9uZSBub2RlIHBlciAiYmFzaWMgYmxvY2siLCBhbmQgb25lIGVkZ2UgcGVyICJqdW1wIgorICAgICAqIGZyb20gb25lIGJhc2ljIGJsb2NrIHRvIGFub3RoZXIuIEVhY2ggbm9kZSAoaS5lLiwgZWFjaCBiYXNpYyBibG9jaykgaXMKKyAgICAgKiByZXByZXNlbnRlZCBieSB0aGUgTGFiZWwgb2JqZWN0IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGZpcnN0IGluc3RydWN0aW9uCisgICAgICogb2YgdGhpcyBiYXNpYyBibG9jay4gRWFjaCBub2RlIGFsc28gc3RvcmVzIHRoZSBsaXN0IG9mIGl0cyBzdWNjZXNzb3JzIGluCisgICAgICogdGhlIGdyYXBoLCBhcyBhIGxpbmtlZCBsaXN0IG9mIEVkZ2Ugb2JqZWN0cy4KKyAgICAgKiAKKyAgICAgKiBUaGUgY29udHJvbCBmbG93IGFuYWx5c2lzIGFsZ29yaXRobXMgdXNlZCB0byBjb21wdXRlIHRoZSBtYXhpbXVtIHN0YWNrCisgICAgICogc2l6ZSBvciB0aGUgc3RhY2sgbWFwIGZyYW1lcyBhcmUgc2ltaWxhciBhbmQgdXNlIHR3byBzdGVwcy4gVGhlIGZpcnN0CisgICAgICogc3RlcCwgZHVyaW5nIHRoZSB2aXNpdCBvZiBlYWNoIGluc3RydWN0aW9uLCBidWlsZHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlCisgICAgICogc3RhdGUgb2YgdGhlIGxvY2FsIHZhcmlhYmxlcyBhbmQgdGhlIG9wZXJhbmQgc3RhY2sgYXQgdGhlIGVuZCBvZiBlYWNoCisgICAgICogYmFzaWMgYmxvY2ssIGNhbGxlZCB0aGUgIm91dHB1dCBmcmFtZSIsIDxpPnJlbGF0aXZlbHk8L2k+IHRvIHRoZSBmcmFtZQorICAgICAqIHN0YXRlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJhc2ljIGJsb2NrLCB3aGljaCBpcyBjYWxsZWQgdGhlICJpbnB1dAorICAgICAqIGZyYW1lIiwgYW5kIHdoaWNoIGlzIDxpPnVua25vd248L2k+IGR1cmluZyB0aGlzIHN0ZXAuIFRoZSBzZWNvbmQgc3RlcCwgaW4KKyAgICAgKiB7QGxpbmsgTWV0aG9kV3JpdGVyI3Zpc2l0TWF4c30sIGlzIGEgZml4IHBvaW50IGFsZ29yaXRobSB0aGF0IGNvbXB1dGVzCisgICAgICogaW5mb3JtYXRpb24gYWJvdXQgdGhlIGlucHV0IGZyYW1lIG9mIGVhY2ggYmFzaWMgYmxvY2ssIGZyb20gdGhlIGlucHV0CisgICAgICogc3RhdGUgb2YgdGhlIGZpcnN0IGJhc2ljIGJsb2NrIChrbm93biBmcm9tIHRoZSBtZXRob2Qgc2lnbmF0dXJlKSwgYW5kIGJ5CisgICAgICogdGhlIHVzaW5nIHRoZSBwcmV2aW91c2x5IGNvbXB1dGVkIHJlbGF0aXZlIG91dHB1dCBmcmFtZXMuCisgICAgICogCisgICAgICogVGhlIGFsZ29yaXRobSB1c2VkIHRvIGNvbXB1dGUgdGhlIG1heGltdW0gc3RhY2sgc2l6ZSBvbmx5IGNvbXB1dGVzIHRoZQorICAgICAqIHJlbGF0aXZlIG91dHB1dCBhbmQgYWJzb2x1dGUgaW5wdXQgc3RhY2sgaGVpZ2h0cywgd2hpbGUgdGhlIGFsZ29yaXRobQorICAgICAqIHVzZWQgdG8gY29tcHV0ZSBzdGFjayBtYXAgZnJhbWVzIGNvbXB1dGVzIHJlbGF0aXZlIG91dHB1dCBmcmFtZXMgYW5kCisgICAgICogYWJzb2x1dGUgaW5wdXQgZnJhbWVzLgorICAgICAqLworCisgICAgLyoqCisgICAgICogU3RhcnQgb2YgdGhlIG91dHB1dCBzdGFjayByZWxhdGl2ZWx5IHRvIHRoZSBpbnB1dCBzdGFjay4gVGhlIGV4YWN0CisgICAgICogc2VtYW50aWNzIG9mIHRoaXMgZmllbGQgZGVwZW5kcyBvbiB0aGUgYWxnb3JpdGhtIHRoYXQgaXMgdXNlZC4KKyAgICAgKgorICAgICAqIFdoZW4gb25seSB0aGUgbWF4aW11bSBzdGFjayBzaXplIGlzIGNvbXB1dGVkLCB0aGlzIGZpZWxkIGlzIHRoZSBudW1iZXIgb2YKKyAgICAgKiBlbGVtZW50cyBpbiB0aGUgaW5wdXQgc3RhY2suCisgICAgICoKKyAgICAgKiBXaGVuIHRoZSBzdGFjayBtYXAgZnJhbWVzIGFyZSBjb21wbGV0ZWx5IGNvbXB1dGVkLCB0aGlzIGZpZWxkIGlzIHRoZQorICAgICAqIG9mZnNldCBvZiB0aGUgZmlyc3Qgb3V0cHV0IHN0YWNrIGVsZW1lbnQgcmVsYXRpdmVseSB0byB0aGUgdG9wIG9mIHRoZQorICAgICAqIGlucHV0IHN0YWNrLiBUaGlzIG9mZnNldCBpcyBhbHdheXMgbmVnYXRpdmUgb3IgbnVsbC4gQSBudWxsIG9mZnNldCBtZWFucworICAgICAqIHRoYXQgdGhlIG91dHB1dCBzdGFjayBtdXN0IGJlIGFwcGVuZGVkIHRvIHRoZSBpbnB1dCBzdGFjay4gQSAtbiBvZmZzZXQKKyAgICAgKiBtZWFucyB0aGF0IHRoZSBmaXJzdCBuIG91dHB1dCBzdGFjayBlbGVtZW50cyBtdXN0IHJlcGxhY2UgdGhlIHRvcCBuIGlucHV0CisgICAgICogc3RhY2sgZWxlbWVudHMsIGFuZCB0aGF0IHRoZSBvdGhlciBlbGVtZW50cyBtdXN0IGJlIGFwcGVuZGVkIHRvIHRoZSBpbnB1dAorICAgICAqIHN0YWNrLgorICAgICAqLworICAgIGludCBpbnB1dFN0YWNrVG9wOworCisgICAgLyoqCisgICAgICogTWF4aW11bSBoZWlnaHQgcmVhY2hlZCBieSB0aGUgb3V0cHV0IHN0YWNrLCByZWxhdGl2ZWx5IHRvIHRoZSB0b3Agb2YgdGhlCisgICAgICogaW5wdXQgc3RhY2suIFRoaXMgbWF4aW11bSBpcyBhbHdheXMgcG9zaXRpdmUgb3IgbnVsbC4KKyAgICAgKi8KKyAgICBpbnQgb3V0cHV0U3RhY2tNYXg7CisKKyAgICAvKioKKyAgICAgKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgaW5wdXQgYW5kIG91dHB1dCBzdGFjayBtYXAgZnJhbWVzIG9mIHRoaXMgYmFzaWMKKyAgICAgKiBibG9jay4gVGhpcyBmaWVsZCBpcyBvbmx5IHVzZWQgd2hlbiB7QGxpbmsgQ2xhc3NXcml0ZXIjQ09NUFVURV9GUkFNRVN9CisgICAgICogb3B0aW9uIGlzIHVzZWQuCisgICAgICovCisgICAgRnJhbWUgZnJhbWU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3VjY2Vzc29yIG9mIHRoaXMgbGFiZWwsIGluIHRoZSBvcmRlciB0aGV5IGFyZSB2aXNpdGVkLiBUaGlzIGxpbmtlZAorICAgICAqIGxpc3QgZG9lcyBub3QgaW5jbHVkZSBsYWJlbHMgdXNlZCBmb3IgZGVidWcgaW5mbyBvbmx5LiBJZgorICAgICAqIHtAbGluayBDbGFzc1dyaXRlciNDT01QVVRFX0ZSQU1FU30gb3B0aW9uIGlzIHVzZWQgdGhlbiwgaW4gYWRkaXRpb24sIGl0CisgICAgICogZG9lcyBub3QgY29udGFpbiBzdWNjZXNzaXZlIGxhYmVscyB0aGF0IGRlbm90ZSB0aGUgc2FtZSBieXRlY29kZSBwb3NpdGlvbgorICAgICAqIChpbiB0aGlzIGNhc2Ugb25seSB0aGUgZmlyc3QgbGFiZWwgYXBwZWFycyBpbiB0aGlzIGxpc3QpLgorICAgICAqLworICAgIExhYmVsIHN1Y2Nlc3NvcjsKKworICAgIC8qKgorICAgICAqIFRoZSBzdWNjZXNzb3JzIG9mIHRoaXMgbm9kZSBpbiB0aGUgY29udHJvbCBmbG93IGdyYXBoLiBUaGVzZSBzdWNjZXNzb3JzCisgICAgICogYXJlIHN0b3JlZCBpbiBhIGxpbmtlZCBsaXN0IG9mIHtAbGluayBFZGdlIEVkZ2V9IG9iamVjdHMsIGxpbmtlZCB0byBlYWNoCisgICAgICogb3RoZXIgYnkgdGhlaXIge0BsaW5rIEVkZ2UjbmV4dH0gZmllbGQuCisgICAgICovCisgICAgRWRnZSBzdWNjZXNzb3JzOworCisgICAgLyoqCisgICAgICogVGhlIG5leHQgYmFzaWMgYmxvY2sgaW4gdGhlIGJhc2ljIGJsb2NrIHN0YWNrLiBUaGlzIHN0YWNrIGlzIHVzZWQgaW4gdGhlCisgICAgICogbWFpbiBsb29wIG9mIHRoZSBmaXggcG9pbnQgYWxnb3JpdGhtIHVzZWQgaW4gdGhlIHNlY29uZCBzdGVwIG9mIHRoZQorICAgICAqIGNvbnRyb2wgZmxvdyBhbmFseXNpcyBhbGdvcml0aG1zLiBJdCBpcyBhbHNvIHVzZWQgaW4KKyAgICAgKiB7QGxpbmsgI3Zpc2l0U3Vicm91dGluZX0gdG8gYXZvaWQgdXNpbmcgYSByZWN1cnNpdmUgbWV0aG9kLCBhbmQgaW4gCisgICAgICogQ2xhc3NSZWFkZXIgdG8gdGVtcG9yYXJpbHkgc3RvcmUgbXVsdGlwbGUgc291cmNlIGxpbmVzIGZvciBhIGxhYmVsLiAKKyAgICAgKgorICAgICAqIEBzZWUgTWV0aG9kV3JpdGVyI3Zpc2l0TWF4cworICAgICAqLworICAgIExhYmVsIG5leHQ7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBDb25zdHJ1Y3RvcgorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBsYWJlbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGFiZWwoKSB7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gTWV0aG9kcyB0byBjb21wdXRlIG9mZnNldHMgYW5kIHRvIG1hbmFnZSBmb3J3YXJkIHJlZmVyZW5jZXMKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG9mZnNldCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgbGFiZWwuIFRoaXMgb2Zmc2V0IGlzIGNvbXB1dGVkCisgICAgICogZnJvbSB0aGUgc3RhcnQgb2YgdGhlIG1ldGhvZCdzIGJ5dGVjb2RlLiA8aT5UaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IKKyAgICAgKiB7QGxpbmsgQXR0cmlidXRlfSBzdWIgY2xhc3NlcywgYW5kIGlzIG5vcm1hbGx5IG5vdCBuZWVkZWQgYnkgY2xhc3MKKyAgICAgKiBnZW5lcmF0b3JzIG9yIGFkYXB0ZXJzLjwvaT4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG9mZnNldCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgbGFiZWwuCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGxhYmVsIGlzIG5vdCByZXNvbHZlZCB5ZXQuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRPZmZzZXQoKSB7CisgICAgICAgIGlmICgoc3RhdHVzICYgUkVTT0xWRUQpID09IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJMYWJlbCBvZmZzZXQgcG9zaXRpb24gaGFzIG5vdCBiZWVuIHJlc29sdmVkIHlldCIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwb3NpdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQdXRzIGEgcmVmZXJlbmNlIHRvIHRoaXMgbGFiZWwgaW4gdGhlIGJ5dGVjb2RlIG9mIGEgbWV0aG9kLiBJZiB0aGUKKyAgICAgKiBwb3NpdGlvbiBvZiB0aGUgbGFiZWwgaXMga25vd24sIHRoZSBvZmZzZXQgaXMgY29tcHV0ZWQgYW5kIHdyaXR0ZW4KKyAgICAgKiBkaXJlY3RseS4gT3RoZXJ3aXNlLCBhIG51bGwgb2Zmc2V0IGlzIHdyaXR0ZW4gYW5kIGEgbmV3IGZvcndhcmQgcmVmZXJlbmNlCisgICAgICogaXMgZGVjbGFyZWQgZm9yIHRoaXMgbGFiZWwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3duZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb2RlIHdyaXRlciB0aGF0IGNhbGxzIHRoaXMgbWV0aG9kLgorICAgICAqIEBwYXJhbSBvdXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBieXRlY29kZSBvZiB0aGUgbWV0aG9kLgorICAgICAqIEBwYXJhbSBzb3VyY2UKKyAgICAgKiAgICAgICAgICAgIHRoZSBwb3NpdGlvbiBvZiBmaXJzdCBieXRlIG9mIHRoZSBieXRlY29kZSBpbnN0cnVjdGlvbiB0aGF0CisgICAgICogICAgICAgICAgICBjb250YWlucyB0aGlzIGxhYmVsLgorICAgICAqIEBwYXJhbSB3aWRlT2Zmc2V0CisgICAgICogICAgICAgICAgICA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoZSByZWZlcmVuY2UgbXVzdCBiZSBzdG9yZWQgaW4gNCBieXRlcywgb3IKKyAgICAgKiAgICAgICAgICAgIDx0dD5mYWxzZTwvdHQ+IGlmIGl0IG11c3QgYmUgc3RvcmVkIHdpdGggMiBieXRlcy4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIHRoaXMgbGFiZWwgaGFzIG5vdCBiZWVuIGNyZWF0ZWQgYnkgdGhlIGdpdmVuIGNvZGUgd3JpdGVyLgorICAgICAqLworICAgIHZvaWQgcHV0KGZpbmFsIE1ldGhvZFdyaXRlciBvd25lciwgZmluYWwgQnl0ZVZlY3RvciBvdXQsIGZpbmFsIGludCBzb3VyY2UsCisgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiB3aWRlT2Zmc2V0KSB7CisgICAgICAgIGlmICgoc3RhdHVzICYgUkVTT0xWRUQpID09IDApIHsKKyAgICAgICAgICAgIGlmICh3aWRlT2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgYWRkUmVmZXJlbmNlKC0xIC0gc291cmNlLCBvdXQubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBvdXQucHV0SW50KC0xKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYWRkUmVmZXJlbmNlKHNvdXJjZSwgb3V0Lmxlbmd0aCk7CisgICAgICAgICAgICAgICAgb3V0LnB1dFNob3J0KC0xKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICh3aWRlT2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgb3V0LnB1dEludChwb3NpdGlvbiAtIHNvdXJjZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG91dC5wdXRTaG9ydChwb3NpdGlvbiAtIHNvdXJjZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgZm9yd2FyZCByZWZlcmVuY2UgdG8gdGhpcyBsYWJlbC4gVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgb25seQorICAgICAqIGZvciBhIHRydWUgZm9yd2FyZCByZWZlcmVuY2UsIGkuZS4gb25seSBpZiB0aGlzIGxhYmVsIGlzIG5vdCByZXNvbHZlZAorICAgICAqIHlldC4gRm9yIGJhY2t3YXJkIHJlZmVyZW5jZXMsIHRoZSBvZmZzZXQgb2YgdGhlIHJlZmVyZW5jZSBjYW4gYmUsIGFuZAorICAgICAqIG11c3QgYmUsIGNvbXB1dGVkIGFuZCBzdG9yZWQgZGlyZWN0bHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc291cmNlUG9zaXRpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBwb3NpdGlvbiBvZiB0aGUgcmVmZXJlbmNpbmcgaW5zdHJ1Y3Rpb24uIFRoaXMgcG9zaXRpb24KKyAgICAgKiAgICAgICAgICAgIHdpbGwgYmUgdXNlZCB0byBjb21wdXRlIHRoZSBvZmZzZXQgb2YgdGhpcyBmb3J3YXJkIHJlZmVyZW5jZS4KKyAgICAgKiBAcGFyYW0gcmVmZXJlbmNlUG9zaXRpb24KKyAgICAgKiAgICAgICAgICAgIHRoZSBwb3NpdGlvbiB3aGVyZSB0aGUgb2Zmc2V0IGZvciB0aGlzIGZvcndhcmQgcmVmZXJlbmNlIG11c3QKKyAgICAgKiAgICAgICAgICAgIGJlIHN0b3JlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYWRkUmVmZXJlbmNlKGZpbmFsIGludCBzb3VyY2VQb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCByZWZlcmVuY2VQb3NpdGlvbikgeworICAgICAgICBpZiAoc3JjQW5kUmVmUG9zaXRpb25zID09IG51bGwpIHsKKyAgICAgICAgICAgIHNyY0FuZFJlZlBvc2l0aW9ucyA9IG5ldyBpbnRbNl07CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlZmVyZW5jZUNvdW50ID49IHNyY0FuZFJlZlBvc2l0aW9ucy5sZW5ndGgpIHsKKyAgICAgICAgICAgIGludFtdIGEgPSBuZXcgaW50W3NyY0FuZFJlZlBvc2l0aW9ucy5sZW5ndGggKyA2XTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoc3JjQW5kUmVmUG9zaXRpb25zLCAwLCBhLCAwLAorICAgICAgICAgICAgICAgICAgICBzcmNBbmRSZWZQb3NpdGlvbnMubGVuZ3RoKTsKKyAgICAgICAgICAgIHNyY0FuZFJlZlBvc2l0aW9ucyA9IGE7CisgICAgICAgIH0KKyAgICAgICAgc3JjQW5kUmVmUG9zaXRpb25zW3JlZmVyZW5jZUNvdW50KytdID0gc291cmNlUG9zaXRpb247CisgICAgICAgIHNyY0FuZFJlZlBvc2l0aW9uc1tyZWZlcmVuY2VDb3VudCsrXSA9IHJlZmVyZW5jZVBvc2l0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc29sdmVzIGFsbCBmb3J3YXJkIHJlZmVyZW5jZXMgdG8gdGhpcyBsYWJlbC4gVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQKKyAgICAgKiB3aGVuIHRoaXMgbGFiZWwgaXMgYWRkZWQgdG8gdGhlIGJ5dGVjb2RlIG9mIHRoZSBtZXRob2QsIGkuZS4gd2hlbiBpdHMKKyAgICAgKiBwb3NpdGlvbiBiZWNvbWVzIGtub3duLiBUaGlzIG1ldGhvZCBmaWxscyBpbiB0aGUgYmxhbmtzIHRoYXQgd2hlcmUgbGVmdAorICAgICAqIGluIHRoZSBieXRlY29kZSBieSBlYWNoIGZvcndhcmQgcmVmZXJlbmNlIHByZXZpb3VzbHkgYWRkZWQgdG8gdGhpcyBsYWJlbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvd25lcgorICAgICAqICAgICAgICAgICAgdGhlIGNvZGUgd3JpdGVyIHRoYXQgY2FsbHMgdGhpcyBtZXRob2QuCisgICAgICogQHBhcmFtIHBvc2l0aW9uCisgICAgICogICAgICAgICAgICB0aGUgcG9zaXRpb24gb2YgdGhpcyBsYWJlbCBpbiB0aGUgYnl0ZWNvZGUuCisgICAgICogQHBhcmFtIGRhdGEKKyAgICAgKiAgICAgICAgICAgIHRoZSBieXRlY29kZSBvZiB0aGUgbWV0aG9kLgorICAgICAqIEByZXR1cm4gPHR0PnRydWU8L3R0PiBpZiBhIGJsYW5rIHRoYXQgd2FzIGxlZnQgZm9yIHRoaXMgbGFiZWwgd2FzIHRvCisgICAgICogICAgICAgICBzbWFsbCB0byBzdG9yZSB0aGUgb2Zmc2V0LiBJbiBzdWNoIGEgY2FzZSB0aGUgY29ycmVzcG9uZGluZyBqdW1wCisgICAgICogICAgICAgICBpbnN0cnVjdGlvbiBpcyByZXBsYWNlZCB3aXRoIGEgcHNldWRvIGluc3RydWN0aW9uICh1c2luZyB1bnVzZWQKKyAgICAgKiAgICAgICAgIG9wY29kZXMpIHVzaW5nIGFuIHVuc2lnbmVkIHR3byBieXRlcyBvZmZzZXQuIFRoZXNlIHBzZXVkbworICAgICAqICAgICAgICAgaW5zdHJ1Y3Rpb25zIHdpbGwgbmVlZCB0byBiZSByZXBsYWNlZCB3aXRoIHRydWUgaW5zdHJ1Y3Rpb25zIHdpdGgKKyAgICAgKiAgICAgICAgIHdpZGVyIG9mZnNldHMgKDQgYnl0ZXMgaW5zdGVhZCBvZiAyKS4gVGhpcyBpcyBkb25lIGluCisgICAgICogICAgICAgICB7QGxpbmsgTWV0aG9kV3JpdGVyI3Jlc2l6ZUluc3RydWN0aW9uc30uCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiB0aGlzIGxhYmVsIGhhcyBhbHJlYWR5IGJlZW4gcmVzb2x2ZWQsIG9yIGlmIGl0IGhhcyBub3QKKyAgICAgKiAgICAgICAgICAgICBiZWVuIGNyZWF0ZWQgYnkgdGhlIGdpdmVuIGNvZGUgd3JpdGVyLgorICAgICAqLworICAgIGJvb2xlYW4gcmVzb2x2ZShmaW5hbCBNZXRob2RXcml0ZXIgb3duZXIsIGZpbmFsIGludCBwb3NpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgYnl0ZVtdIGRhdGEpIHsKKyAgICAgICAgYm9vbGVhbiBuZWVkVXBkYXRlID0gZmFsc2U7CisgICAgICAgIHRoaXMuc3RhdHVzIHw9IFJFU09MVkVEOworICAgICAgICB0aGlzLnBvc2l0aW9uID0gcG9zaXRpb247CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgd2hpbGUgKGkgPCByZWZlcmVuY2VDb3VudCkgeworICAgICAgICAgICAgaW50IHNvdXJjZSA9IHNyY0FuZFJlZlBvc2l0aW9uc1tpKytdOworICAgICAgICAgICAgaW50IHJlZmVyZW5jZSA9IHNyY0FuZFJlZlBvc2l0aW9uc1tpKytdOworICAgICAgICAgICAgaW50IG9mZnNldDsKKyAgICAgICAgICAgIGlmIChzb3VyY2UgPj0gMCkgeworICAgICAgICAgICAgICAgIG9mZnNldCA9IHBvc2l0aW9uIC0gc291cmNlOworICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPCBTaG9ydC5NSU5fVkFMVUUgfHwgb2Zmc2V0ID4gU2hvcnQuTUFYX1ZBTFVFKSB7CisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqIGNoYW5nZXMgdGhlIG9wY29kZSBvZiB0aGUganVtcCBpbnN0cnVjdGlvbiwgaW4gb3JkZXIgdG8KKyAgICAgICAgICAgICAgICAgICAgICogYmUgYWJsZSB0byBmaW5kIGl0IGxhdGVyIChzZWUgcmVzaXplSW5zdHJ1Y3Rpb25zIGluCisgICAgICAgICAgICAgICAgICAgICAqIE1ldGhvZFdyaXRlcikuIFRoZXNlIHRlbXBvcmFyeSBvcGNvZGVzIGFyZSBzaW1pbGFyIHRvCisgICAgICAgICAgICAgICAgICAgICAqIGp1bXAgaW5zdHJ1Y3Rpb24gb3Bjb2RlcywgZXhjZXB0IHRoYXQgdGhlIDIgYnl0ZXMgb2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICAqIGlzIHVuc2lnbmVkIChhbmQgY2FuIHRoZXJlZm9yZSByZXByZXNlbnQgdmFsdWVzIGZyb20gMCB0bworICAgICAgICAgICAgICAgICAgICAgKiA2NTUzNSwgd2hpY2ggaXMgc3VmZmljaWVudCBzaW5jZSB0aGUgc2l6ZSBvZiBhIG1ldGhvZCBpcworICAgICAgICAgICAgICAgICAgICAgKiBsaW1pdGVkIHRvIDY1NTM1IGJ5dGVzKS4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIGludCBvcGNvZGUgPSBkYXRhW3JlZmVyZW5jZSAtIDFdICYgMHhGRjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9wY29kZSA8PSBPcGNvZGVzLkpTUikgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlcyBJRkVRIC4uLiBKU1IgdG8gb3Bjb2RlcyAyMDIgdG8gMjE3CisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhW3JlZmVyZW5jZSAtIDFdID0gKGJ5dGUpIChvcGNvZGUgKyA0OSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFuZ2VzIElGTlVMTCBhbmQgSUZOT05OVUxMIHRvIG9wY29kZXMgMjE4IGFuZCAyMTkKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbcmVmZXJlbmNlIC0gMV0gPSAoYnl0ZSkgKG9wY29kZSArIDIwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBuZWVkVXBkYXRlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGF0YVtyZWZlcmVuY2UrK10gPSAoYnl0ZSkgKG9mZnNldCA+Pj4gOCk7CisgICAgICAgICAgICAgICAgZGF0YVtyZWZlcmVuY2VdID0gKGJ5dGUpIG9mZnNldDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb2Zmc2V0ID0gcG9zaXRpb24gKyBzb3VyY2UgKyAxOworICAgICAgICAgICAgICAgIGRhdGFbcmVmZXJlbmNlKytdID0gKGJ5dGUpIChvZmZzZXQgPj4+IDI0KTsKKyAgICAgICAgICAgICAgICBkYXRhW3JlZmVyZW5jZSsrXSA9IChieXRlKSAob2Zmc2V0ID4+PiAxNik7CisgICAgICAgICAgICAgICAgZGF0YVtyZWZlcmVuY2UrK10gPSAoYnl0ZSkgKG9mZnNldCA+Pj4gOCk7CisgICAgICAgICAgICAgICAgZGF0YVtyZWZlcmVuY2VdID0gKGJ5dGUpIG9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmVlZFVwZGF0ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBsYWJlbCBvZiB0aGUgc2VyaWVzIHRvIHdoaWNoIHRoaXMgbGFiZWwgYmVsb25ncy4gRm9yIGFuCisgICAgICogaXNvbGF0ZWQgbGFiZWwgb3IgZm9yIHRoZSBmaXJzdCBsYWJlbCBpbiBhIHNlcmllcyBvZiBzdWNjZXNzaXZlIGxhYmVscywKKyAgICAgKiB0aGlzIG1ldGhvZCByZXR1cm5zIHRoZSBsYWJlbCBpdHNlbGYuIEZvciBvdGhlciBsYWJlbHMgaXQgcmV0dXJucyB0aGUKKyAgICAgKiBmaXJzdCBsYWJlbCBvZiB0aGUgc2VyaWVzLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZmlyc3QgbGFiZWwgb2YgdGhlIHNlcmllcyB0byB3aGljaCB0aGlzIGxhYmVsIGJlbG9uZ3MuCisgICAgICovCisgICAgTGFiZWwgZ2V0Rmlyc3QoKSB7CisgICAgICAgIHJldHVybiAhQ2xhc3NSZWFkZXIuRlJBTUVTIHx8IGZyYW1lID09IG51bGwgPyB0aGlzIDogZnJhbWUub3duZXI7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gTWV0aG9kcyByZWxhdGVkIHRvIHN1YnJvdXRpbmVzCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaXMgdGhpcyBiYXNpYyBibG9jayBiZWxvbmdzIHRvIHRoZSBnaXZlbiBzdWJyb3V0aW5lLgorICAgICAqCisgICAgICogQHBhcmFtIGlkCisgICAgICogICAgICAgICAgICBhIHN1YnJvdXRpbmUgaWQuCisgICAgICogQHJldHVybiB0cnVlIGlzIHRoaXMgYmFzaWMgYmxvY2sgYmVsb25ncyB0byB0aGUgZ2l2ZW4gc3Vicm91dGluZS4KKyAgICAgKi8KKyAgICBib29sZWFuIGluU3Vicm91dGluZShmaW5hbCBsb25nIGlkKSB7CisgICAgICAgIGlmICgoc3RhdHVzICYgTGFiZWwuVklTSVRFRCkgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIChzcmNBbmRSZWZQb3NpdGlvbnNbKGludCkgKGlkID4+PiAzMildICYgKGludCkgaWQpICE9IDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGJhc2ljIGJsb2NrIGFuZCB0aGUgZ2l2ZW4gb25lIGJlbG9uZyB0byBhIGNvbW1vbgorICAgICAqIHN1YnJvdXRpbmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmxvY2sKKyAgICAgKiAgICAgICAgICAgIGFub3RoZXIgYmFzaWMgYmxvY2suCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgYmFzaWMgYmxvY2sgYW5kIHRoZSBnaXZlbiBvbmUgYmVsb25nIHRvIGEgY29tbW9uCisgICAgICogICAgICAgICBzdWJyb3V0aW5lLgorICAgICAqLworICAgIGJvb2xlYW4gaW5TYW1lU3Vicm91dGluZShmaW5hbCBMYWJlbCBibG9jaykgeworICAgICAgICBpZiAoKHN0YXR1cyAmIFZJU0lURUQpID09IDAgfHwgKGJsb2NrLnN0YXR1cyAmIFZJU0lURUQpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNyY0FuZFJlZlBvc2l0aW9ucy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgaWYgKChzcmNBbmRSZWZQb3NpdGlvbnNbaV0gJiBibG9jay5zcmNBbmRSZWZQb3NpdGlvbnNbaV0pICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFya3MgdGhpcyBiYXNpYyBibG9jayBhcyBiZWxvbmdpbmcgdG8gdGhlIGdpdmVuIHN1YnJvdXRpbmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaWQKKyAgICAgKiAgICAgICAgICAgIGEgc3Vicm91dGluZSBpZC4KKyAgICAgKiBAcGFyYW0gbmJTdWJyb3V0aW5lcworICAgICAqICAgICAgICAgICAgdGhlIHRvdGFsIG51bWJlciBvZiBzdWJyb3V0aW5lcyBpbiB0aGUgbWV0aG9kLgorICAgICAqLworICAgIHZvaWQgYWRkVG9TdWJyb3V0aW5lKGZpbmFsIGxvbmcgaWQsIGZpbmFsIGludCBuYlN1YnJvdXRpbmVzKSB7CisgICAgICAgIGlmICgoc3RhdHVzICYgVklTSVRFRCkgPT0gMCkgeworICAgICAgICAgICAgc3RhdHVzIHw9IFZJU0lURUQ7CisgICAgICAgICAgICBzcmNBbmRSZWZQb3NpdGlvbnMgPSBuZXcgaW50W25iU3Vicm91dGluZXMgLyAzMiArIDFdOworICAgICAgICB9CisgICAgICAgIHNyY0FuZFJlZlBvc2l0aW9uc1soaW50KSAoaWQgPj4+IDMyKV0gfD0gKGludCkgaWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZHMgdGhlIGJhc2ljIGJsb2NrcyB0aGF0IGJlbG9uZyB0byBhIGdpdmVuIHN1YnJvdXRpbmUsIGFuZCBtYXJrcyB0aGVzZQorICAgICAqIGJsb2NrcyBhcyBiZWxvbmdpbmcgdG8gdGhpcyBzdWJyb3V0aW5lLiBUaGlzIG1ldGhvZCBmb2xsb3dzIHRoZSBjb250cm9sCisgICAgICogZmxvdyBncmFwaCB0byBmaW5kIGFsbCB0aGUgYmxvY2tzIHRoYXQgYXJlIHJlYWNoYWJsZSBmcm9tIHRoZSBjdXJyZW50CisgICAgICogYmxvY2sgV0lUSE9VVCBmb2xsb3dpbmcgYW55IEpTUiB0YXJnZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gSlNSCisgICAgICogICAgICAgICAgICBhIEpTUiBibG9jayB0aGF0IGp1bXBzIHRvIHRoaXMgc3Vicm91dGluZS4gSWYgdGhpcyBKU1IgaXMgbm90CisgICAgICogICAgICAgICAgICBudWxsIGl0IGlzIGFkZGVkIHRvIHRoZSBzdWNjZXNzb3Igb2YgdGhlIFJFVCBibG9ja3MgZm91bmQgaW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBzdWJyb3V0aW5lLgorICAgICAqIEBwYXJhbSBpZAorICAgICAqICAgICAgICAgICAgdGhlIGlkIG9mIHRoaXMgc3Vicm91dGluZS4KKyAgICAgKiBAcGFyYW0gbmJTdWJyb3V0aW5lcworICAgICAqICAgICAgICAgICAgdGhlIHRvdGFsIG51bWJlciBvZiBzdWJyb3V0aW5lcyBpbiB0aGUgbWV0aG9kLgorICAgICAqLworICAgIHZvaWQgdmlzaXRTdWJyb3V0aW5lKGZpbmFsIExhYmVsIEpTUiwgZmluYWwgbG9uZyBpZCwgZmluYWwgaW50IG5iU3Vicm91dGluZXMpIHsKKyAgICAgICAgLy8gdXNlciBtYW5hZ2VkIHN0YWNrIG9mIGxhYmVscywgdG8gYXZvaWQgdXNpbmcgYSByZWN1cnNpdmUgbWV0aG9kCisgICAgICAgIC8vIChyZWN1cnNpdml0eSBjYW4gbGVhZCB0byBzdGFjayBvdmVyZmxvdyB3aXRoIHZlcnkgbGFyZ2UgbWV0aG9kcykKKyAgICAgICAgTGFiZWwgc3RhY2sgPSB0aGlzOworICAgICAgICB3aGlsZSAoc3RhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gcmVtb3ZlcyBhIGxhYmVsIGwgZnJvbSB0aGUgc3RhY2sKKyAgICAgICAgICAgIExhYmVsIGwgPSBzdGFjazsKKyAgICAgICAgICAgIHN0YWNrID0gbC5uZXh0OworICAgICAgICAgICAgbC5uZXh0ID0gbnVsbDsKKworICAgICAgICAgICAgaWYgKEpTUiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKChsLnN0YXR1cyAmIFZJU0lURUQyKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsLnN0YXR1cyB8PSBWSVNJVEVEMjsKKyAgICAgICAgICAgICAgICAvLyBhZGRzIEpTUiB0byB0aGUgc3VjY2Vzc29ycyBvZiBsLCBpZiBpdCBpcyBhIFJFVCBibG9jaworICAgICAgICAgICAgICAgIGlmICgobC5zdGF0dXMgJiBSRVQpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFsLmluU2FtZVN1YnJvdXRpbmUoSlNSKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgRWRnZSBlID0gbmV3IEVkZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGUuaW5mbyA9IGwuaW5wdXRTdGFja1RvcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGUuc3VjY2Vzc29yID0gSlNSLnN1Y2Nlc3NvcnMuc3VjY2Vzc29yOworICAgICAgICAgICAgICAgICAgICAgICAgZS5uZXh0ID0gbC5zdWNjZXNzb3JzOworICAgICAgICAgICAgICAgICAgICAgICAgbC5zdWNjZXNzb3JzID0gZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGwgYmxvY2sgYWxyZWFkeSBiZWxvbmdzIHRvIHN1YnJvdXRpbmUgJ2lkJywgY29udGludWUKKyAgICAgICAgICAgICAgICBpZiAobC5pblN1YnJvdXRpbmUoaWQpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBtYXJrcyB0aGUgbCBibG9jayBhcyBiZWxvbmdpbmcgdG8gc3Vicm91dGluZSAnaWQnCisgICAgICAgICAgICAgICAgbC5hZGRUb1N1YnJvdXRpbmUoaWQsIG5iU3Vicm91dGluZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gcHVzaGVzIGVhY2ggc3VjY2Vzc29yIG9mIGwgb24gdGhlIHN0YWNrLCBleGNlcHQgSlNSIHRhcmdldHMKKyAgICAgICAgICAgIEVkZ2UgZSA9IGwuc3VjY2Vzc29yczsKKyAgICAgICAgICAgIHdoaWxlIChlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBpZiB0aGUgbCBibG9jayBpcyBhIEpTUiBibG9jaywgdGhlbiAnbC5zdWNjZXNzb3JzLm5leHQnIGxlYWRzCisgICAgICAgICAgICAgICAgLy8gdG8gdGhlIEpTUiB0YXJnZXQgKHNlZSB7QGxpbmsgI3Zpc2l0SnVtcEluc259KSBhbmQgbXVzdAorICAgICAgICAgICAgICAgIC8vIHRoZXJlZm9yZSBub3QgYmUgZm9sbG93ZWQKKyAgICAgICAgICAgICAgICBpZiAoKGwuc3RhdHVzICYgTGFiZWwuSlNSKSA9PSAwIHx8IGUgIT0gbC5zdWNjZXNzb3JzLm5leHQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcHVzaGVzIGUuc3VjY2Vzc29yIG9uIHRoZSBzdGFjayBpZiBpdCBub3QgYWxyZWFkeSBhZGRlZAorICAgICAgICAgICAgICAgICAgICBpZiAoZS5zdWNjZXNzb3IubmV4dCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlLnN1Y2Nlc3Nvci5uZXh0ID0gc3RhY2s7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFjayA9IGUuc3VjY2Vzc29yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGUgPSBlLm5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBPdmVycmlkZW4gT2JqZWN0IG1ldGhvZHMKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBsYWJlbC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBsYWJlbC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIkwiICsgU3lzdGVtLmlkZW50aXR5SGFzaENvZGUodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9qZXJzZXkvcmVwYWNrYWdlZC9vcmcvb2JqZWN0d2ViL2FzbS9NZXRob2RWaXNpdG9yLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL2plcnNleS9yZXBhY2thZ2VkL29yZy9vYmplY3R3ZWIvYXNtL01ldGhvZFZpc2l0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDgxYTExCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9qZXJzZXkvcmVwYWNrYWdlZC9vcmcvb2JqZWN0d2ViL2FzbS9NZXRob2RWaXNpdG9yLmphdmEKQEAgLTAsMCArMSw4ODEgQEAKKy8qKioKKyAqIEFTTTogYSB2ZXJ5IHNtYWxsIGFuZCBmYXN0IEphdmEgYnl0ZWNvZGUgbWFuaXB1bGF0aW9uIGZyYW1ld29yaworICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMTEgSU5SSUEsIEZyYW5jZSBUZWxlY29tCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2UgamVyc2V5LnJlcGFja2FnZWQub3JnLm9iamVjdHdlYi5hc207CisKKy8qKgorICogQSB2aXNpdG9yIHRvIHZpc2l0IGEgSmF2YSBtZXRob2QuIFRoZSBtZXRob2RzIG9mIHRoaXMgY2xhc3MgbXVzdCBiZSBjYWxsZWQgaW4KKyAqIHRoZSBmb2xsb3dpbmcgb3JkZXI6ICggPHR0PnZpc2l0UGFyYW1ldGVyPC90dD4gKSogWworICogPHR0PnZpc2l0QW5ub3RhdGlvbkRlZmF1bHQ8L3R0PiBdICggPHR0PnZpc2l0QW5ub3RhdGlvbjwvdHQ+IHwKKyAqIDx0dD52aXNpdFBhcmFtZXRlckFubm90YXRpb248L3R0PiA8dHQ+dmlzaXRUeXBlQW5ub3RhdGlvbjwvdHQ+IHwKKyAqIDx0dD52aXNpdEF0dHJpYnV0ZTwvdHQ+ICkqIFsgPHR0PnZpc2l0Q29kZTwvdHQ+ICggPHR0PnZpc2l0RnJhbWU8L3R0PiB8CisgKiA8dHQ+dmlzaXQ8aT5YPC9pPkluc248L3R0PiB8IDx0dD52aXNpdExhYmVsPC90dD4gfAorICogPHR0PnZpc2l0SW5zbkFubm90YXRpb248L3R0PiB8IDx0dD52aXNpdFRyeUNhdGNoQmxvY2s8L3R0PiB8CisgKiA8dHQ+dmlzaXRUcnlDYXRjaEFubm90YXRpb248L3R0PiB8IDx0dD52aXNpdExvY2FsVmFyaWFibGU8L3R0PiB8CisgKiA8dHQ+dmlzaXRMb2NhbFZhcmlhYmxlQW5ub3RhdGlvbjwvdHQ+IHwgPHR0PnZpc2l0TGluZU51bWJlcjwvdHQ+ICkqCisgKiA8dHQ+dmlzaXRNYXhzPC90dD4gXSA8dHQ+dmlzaXRFbmQ8L3R0Pi4gSW4gYWRkaXRpb24sIHRoZQorICogPHR0PnZpc2l0PGk+WDwvaT5JbnNuPC90dD4gYW5kIDx0dD52aXNpdExhYmVsPC90dD4gbWV0aG9kcyBtdXN0IGJlIGNhbGxlZCBpbgorICogdGhlIHNlcXVlbnRpYWwgb3JkZXIgb2YgdGhlIGJ5dGVjb2RlIGluc3RydWN0aW9ucyBvZiB0aGUgdmlzaXRlZCBjb2RlLAorICogPHR0PnZpc2l0SW5zbkFubm90YXRpb248L3R0PiBtdXN0IGJlIGNhbGxlZCA8aT5hZnRlcjwvaT4gdGhlIGFubm90YXRlZAorICogaW5zdHJ1Y3Rpb24sIDx0dD52aXNpdFRyeUNhdGNoQmxvY2s8L3R0PiBtdXN0IGJlIGNhbGxlZCA8aT5iZWZvcmU8L2k+IHRoZQorICogbGFiZWxzIHBhc3NlZCBhcyBhcmd1bWVudHMgaGF2ZSBiZWVuIHZpc2l0ZWQsCisgKiA8dHQ+dmlzaXRUcnlDYXRjaEJsb2NrQW5ub3RhdGlvbjwvdHQ+IG11c3QgYmUgY2FsbGVkIDxpPmFmdGVyPC9pPiB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgdHJ5IGNhdGNoIGJsb2NrIGhhcyBiZWVuIHZpc2l0ZWQsIGFuZCB0aGUKKyAqIDx0dD52aXNpdExvY2FsVmFyaWFibGU8L3R0PiwgPHR0PnZpc2l0TG9jYWxWYXJpYWJsZUFubm90YXRpb248L3R0PiBhbmQKKyAqIDx0dD52aXNpdExpbmVOdW1iZXI8L3R0PiBtZXRob2RzIG11c3QgYmUgY2FsbGVkIDxpPmFmdGVyPC9pPiB0aGUgbGFiZWxzCisgKiBwYXNzZWQgYXMgYXJndW1lbnRzIGhhdmUgYmVlbiB2aXNpdGVkLgorICoKKyAqIEBhdXRob3IgRXJpYyBCcnVuZXRvbgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWV0aG9kVmlzaXRvciB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgQVNNIEFQSSB2ZXJzaW9uIGltcGxlbWVudGVkIGJ5IHRoaXMgdmlzaXRvci4gVGhlIHZhbHVlIG9mIHRoaXMgZmllbGQKKyAgICAgKiBtdXN0IGJlIG9uZSBvZiB7QGxpbmsgT3Bjb2RlcyNBU000fSBvciB7QGxpbmsgT3Bjb2RlcyNBU001fS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgaW50IGFwaTsKKworICAgIC8qKgorICAgICAqIFRoZSBtZXRob2QgdmlzaXRvciB0byB3aGljaCB0aGlzIHZpc2l0b3IgbXVzdCBkZWxlZ2F0ZSBtZXRob2QgY2FsbHMuIE1heQorICAgICAqIGJlIG51bGwuCisgICAgICovCisgICAgcHJvdGVjdGVkIE1ldGhvZFZpc2l0b3IgbXY7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBNZXRob2RWaXNpdG9yfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcGkKKyAgICAgKiAgICAgICAgICAgIHRoZSBBU00gQVBJIHZlcnNpb24gaW1wbGVtZW50ZWQgYnkgdGhpcyB2aXNpdG9yLiBNdXN0IGJlIG9uZQorICAgICAqICAgICAgICAgICAgb2Yge0BsaW5rIE9wY29kZXMjQVNNNH0gb3Ige0BsaW5rIE9wY29kZXMjQVNNNX0uCisgICAgICovCisgICAgcHVibGljIE1ldGhvZFZpc2l0b3IoZmluYWwgaW50IGFwaSkgeworICAgICAgICB0aGlzKGFwaSwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgTWV0aG9kVmlzaXRvcn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXBpCisgICAgICogICAgICAgICAgICB0aGUgQVNNIEFQSSB2ZXJzaW9uIGltcGxlbWVudGVkIGJ5IHRoaXMgdmlzaXRvci4gTXVzdCBiZSBvbmUKKyAgICAgKiAgICAgICAgICAgIG9mIHtAbGluayBPcGNvZGVzI0FTTTR9IG9yIHtAbGluayBPcGNvZGVzI0FTTTV9LgorICAgICAqIEBwYXJhbSBtdgorICAgICAqICAgICAgICAgICAgdGhlIG1ldGhvZCB2aXNpdG9yIHRvIHdoaWNoIHRoaXMgdmlzaXRvciBtdXN0IGRlbGVnYXRlIG1ldGhvZAorICAgICAqICAgICAgICAgICAgY2FsbHMuIE1heSBiZSBudWxsLgorICAgICAqLworICAgIHB1YmxpYyBNZXRob2RWaXNpdG9yKGZpbmFsIGludCBhcGksIGZpbmFsIE1ldGhvZFZpc2l0b3IgbXYpIHsKKyAgICAgICAgaWYgKGFwaSAhPSBPcGNvZGVzLkFTTTQgJiYgYXBpICE9IE9wY29kZXMuQVNNNSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIHRoaXMuYXBpID0gYXBpOworICAgICAgICB0aGlzLm12ID0gbXY7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIFBhcmFtZXRlcnMsIGFubm90YXRpb25zIGFuZCBub24gc3RhbmRhcmQgYXR0cmlidXRlcworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIFZpc2l0cyBhIHBhcmFtZXRlciBvZiB0aGlzIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICBwYXJhbWV0ZXIgbmFtZSBvciBudWxsIGlmIG5vbmUgaXMgcHJvdmlkZWQuCisgICAgICogQHBhcmFtIGFjY2VzcworICAgICAqICAgICAgICAgICAgdGhlIHBhcmFtZXRlcidzIGFjY2VzcyBmbGFncywgb25seSA8dHQ+QUNDX0ZJTkFMPC90dD4sCisgICAgICogICAgICAgICAgICA8dHQ+QUNDX1NZTlRIRVRJQzwvdHQ+IG9yL2FuZCA8dHQ+QUNDX01BTkRBVEVEPC90dD4gYXJlCisgICAgICogICAgICAgICAgICBhbGxvd2VkIChzZWUge0BsaW5rIE9wY29kZXN9KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB2aXNpdFBhcmFtZXRlcihTdHJpbmcgbmFtZSwgaW50IGFjY2VzcykgeworICAgICAgICBpZiAoYXBpIDwgT3Bjb2Rlcy5BU001KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGlmIChtdiAhPSBudWxsKSB7CisgICAgICAgICAgICBtdi52aXNpdFBhcmFtZXRlcihuYW1lLCBhY2Nlc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVmlzaXRzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoaXMgYW5ub3RhdGlvbiBpbnRlcmZhY2UgbWV0aG9kLgorICAgICAqCisgICAgICogQHJldHVybiBhIHZpc2l0b3IgdG8gdGhlIHZpc2l0IHRoZSBhY3R1YWwgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzCisgICAgICogICAgICAgICBhbm5vdGF0aW9uIGludGVyZmFjZSBtZXRob2QsIG9yIDx0dD5udWxsPC90dD4gaWYgdGhpcyB2aXNpdG9yIGlzCisgICAgICogICAgICAgICBub3QgaW50ZXJlc3RlZCBpbiB2aXNpdGluZyB0aGlzIGRlZmF1bHQgdmFsdWUuIFRoZSAnbmFtZScKKyAgICAgKiAgICAgICAgIHBhcmFtZXRlcnMgcGFzc2VkIHRvIHRoZSBtZXRob2RzIG9mIHRoaXMgYW5ub3RhdGlvbiB2aXNpdG9yIGFyZQorICAgICAqICAgICAgICAgaWdub3JlZC4gTW9yZW92ZXIsIGV4YWNseSBvbmUgdmlzaXQgbWV0aG9kIG11c3QgYmUgY2FsbGVkIG9uIHRoaXMKKyAgICAgKiAgICAgICAgIGFubm90YXRpb24gdmlzaXRvciwgZm9sbG93ZWQgYnkgdmlzaXRFbmQuCisgICAgICovCisgICAgcHVibGljIEFubm90YXRpb25WaXNpdG9yIHZpc2l0QW5ub3RhdGlvbkRlZmF1bHQoKSB7CisgICAgICAgIGlmIChtdiAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbXYudmlzaXRBbm5vdGF0aW9uRGVmYXVsdCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZpc2l0cyBhbiBhbm5vdGF0aW9uIG9mIHRoaXMgbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIGRlc2MKKyAgICAgKiAgICAgICAgICAgIHRoZSBjbGFzcyBkZXNjcmlwdG9yIG9mIHRoZSBhbm5vdGF0aW9uIGNsYXNzLgorICAgICAqIEBwYXJhbSB2aXNpYmxlCisgICAgICogICAgICAgICAgICA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoZSBhbm5vdGF0aW9uIGlzIHZpc2libGUgYXQgcnVudGltZS4KKyAgICAgKiBAcmV0dXJuIGEgdmlzaXRvciB0byB2aXNpdCB0aGUgYW5ub3RhdGlvbiB2YWx1ZXMsIG9yIDx0dD5udWxsPC90dD4gaWYKKyAgICAgKiAgICAgICAgIHRoaXMgdmlzaXRvciBpcyBub3QgaW50ZXJlc3RlZCBpbiB2aXNpdGluZyB0aGlzIGFubm90YXRpb24uCisgICAgICovCisgICAgcHVibGljIEFubm90YXRpb25WaXNpdG9yIHZpc2l0QW5ub3RhdGlvbihTdHJpbmcgZGVzYywgYm9vbGVhbiB2aXNpYmxlKSB7CisgICAgICAgIGlmIChtdiAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbXYudmlzaXRBbm5vdGF0aW9uKGRlc2MsIHZpc2libGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZpc2l0cyBhbiBhbm5vdGF0aW9uIG9uIGEgdHlwZSBpbiB0aGUgbWV0aG9kIHNpZ25hdHVyZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlUmVmCisgICAgICogICAgICAgICAgICBhIHJlZmVyZW5jZSB0byB0aGUgYW5ub3RhdGVkIHR5cGUuIFRoZSBzb3J0IG9mIHRoaXMgdHlwZQorICAgICAqICAgICAgICAgICAgcmVmZXJlbmNlIG11c3QgYmUge0BsaW5rIFR5cGVSZWZlcmVuY2UjTUVUSE9EX1RZUEVfUEFSQU1FVEVSCisgICAgICogICAgICAgICAgICBNRVRIT0RfVFlQRV9QQVJBTUVURVJ9LAorICAgICAqICAgICAgICAgICAge0BsaW5rIFR5cGVSZWZlcmVuY2UjTUVUSE9EX1RZUEVfUEFSQU1FVEVSX0JPVU5ECisgICAgICogICAgICAgICAgICBNRVRIT0RfVFlQRV9QQVJBTUVURVJfQk9VTkR9LAorICAgICAqICAgICAgICAgICAge0BsaW5rIFR5cGVSZWZlcmVuY2UjTUVUSE9EX1JFVFVSTiBNRVRIT0RfUkVUVVJOfSwKKyAgICAgKiAgICAgICAgICAgIHtAbGluayBUeXBlUmVmZXJlbmNlI01FVEhPRF9SRUNFSVZFUiBNRVRIT0RfUkVDRUlWRVJ9LAorICAgICAqICAgICAgICAgICAge0BsaW5rIFR5cGVSZWZlcmVuY2UjTUVUSE9EX0ZPUk1BTF9QQVJBTUVURVIKKyAgICAgKiAgICAgICAgICAgIE1FVEhPRF9GT1JNQUxfUEFSQU1FVEVSfSBvciB7QGxpbmsgVHlwZVJlZmVyZW5jZSNUSFJPV1MKKyAgICAgKiAgICAgICAgICAgIFRIUk9XU30uIFNlZSB7QGxpbmsgVHlwZVJlZmVyZW5jZX0uCisgICAgICogQHBhcmFtIHR5cGVQYXRoCisgICAgICogICAgICAgICAgICB0aGUgcGF0aCB0byB0aGUgYW5ub3RhdGVkIHR5cGUgYXJndW1lbnQsIHdpbGRjYXJkIGJvdW5kLCBhcnJheQorICAgICAqICAgICAgICAgICAgZWxlbWVudCB0eXBlLCBvciBzdGF0aWMgaW5uZXIgdHlwZSB3aXRoaW4gJ3R5cGVSZWYnLiBNYXkgYmUKKyAgICAgKiAgICAgICAgICAgIDx0dD5udWxsPC90dD4gaWYgdGhlIGFubm90YXRpb24gdGFyZ2V0cyAndHlwZVJlZicgYXMgYSB3aG9sZS4KKyAgICAgKiBAcGFyYW0gZGVzYworICAgICAqICAgICAgICAgICAgdGhlIGNsYXNzIGRlc2NyaXB0b3Igb2YgdGhlIGFubm90YXRpb24gY2xhc3MuCisgICAgICogQHBhcmFtIHZpc2libGUKKyAgICAgKiAgICAgICAgICAgIDx0dD50cnVlPC90dD4gaWYgdGhlIGFubm90YXRpb24gaXMgdmlzaWJsZSBhdCBydW50aW1lLgorICAgICAqIEByZXR1cm4gYSB2aXNpdG9yIHRvIHZpc2l0IHRoZSBhbm5vdGF0aW9uIHZhbHVlcywgb3IgPHR0Pm51bGw8L3R0PiBpZgorICAgICAqICAgICAgICAgdGhpcyB2aXNpdG9yIGlzIG5vdCBpbnRlcmVzdGVkIGluIHZpc2l0aW5nIHRoaXMgYW5ub3RhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQW5ub3RhdGlvblZpc2l0b3IgdmlzaXRUeXBlQW5ub3RhdGlvbihpbnQgdHlwZVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlUGF0aCB0eXBlUGF0aCwgU3RyaW5nIGRlc2MsIGJvb2xlYW4gdmlzaWJsZSkgeworICAgICAgICBpZiAoYXBpIDwgT3Bjb2Rlcy5BU001KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGlmIChtdiAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbXYudmlzaXRUeXBlQW5ub3RhdGlvbih0eXBlUmVmLCB0eXBlUGF0aCwgZGVzYywgdmlzaWJsZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmlzaXRzIGFuIGFubm90YXRpb24gb2YgYSBwYXJhbWV0ZXIgdGhpcyBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyYW1ldGVyCisgICAgICogICAgICAgICAgICB0aGUgcGFyYW1ldGVyIGluZGV4LgorICAgICAqIEBwYXJhbSBkZXNjCisgICAgICogICAgICAgICAgICB0aGUgY2xhc3MgZGVzY3JpcHRvciBvZiB0aGUgYW5ub3RhdGlvbiBjbGFzcy4KKyAgICAgKiBAcGFyYW0gdmlzaWJsZQorICAgICAqICAgICAgICAgICAgPHR0PnRydWU8L3R0PiBpZiB0aGUgYW5ub3RhdGlvbiBpcyB2aXNpYmxlIGF0IHJ1bnRpbWUuCisgICAgICogQHJldHVybiBhIHZpc2l0b3IgdG8gdmlzaXQgdGhlIGFubm90YXRpb24gdmFsdWVzLCBvciA8dHQ+bnVsbDwvdHQ+IGlmCisgICAgICogICAgICAgICB0aGlzIHZpc2l0b3IgaXMgbm90IGludGVyZXN0ZWQgaW4gdmlzaXRpbmcgdGhpcyBhbm5vdGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBBbm5vdGF0aW9uVmlzaXRvciB2aXNpdFBhcmFtZXRlckFubm90YXRpb24oaW50IHBhcmFtZXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkZXNjLCBib29sZWFuIHZpc2libGUpIHsKKyAgICAgICAgaWYgKG12ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBtdi52aXNpdFBhcmFtZXRlckFubm90YXRpb24ocGFyYW1ldGVyLCBkZXNjLCB2aXNpYmxlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWaXNpdHMgYSBub24gc3RhbmRhcmQgYXR0cmlidXRlIG9mIHRoaXMgbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIGF0dHIKKyAgICAgKiAgICAgICAgICAgIGFuIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZShBdHRyaWJ1dGUgYXR0cikgeworICAgICAgICBpZiAobXYgIT0gbnVsbCkgeworICAgICAgICAgICAgbXYudmlzaXRBdHRyaWJ1dGUoYXR0cik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydHMgdGhlIHZpc2l0IG9mIHRoZSBtZXRob2QncyBjb2RlLCBpZiBhbnkgKGkuZS4gbm9uIGFic3RyYWN0IG1ldGhvZCkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmlzaXRDb2RlKCkgeworICAgICAgICBpZiAobXYgIT0gbnVsbCkgeworICAgICAgICAgICAgbXYudmlzaXRDb2RlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWaXNpdHMgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGxvY2FsIHZhcmlhYmxlcyBhbmQgb3BlcmFuZCBzdGFjaworICAgICAqIGVsZW1lbnRzLiBUaGlzIG1ldGhvZCBtdXN0KCopIGJlIGNhbGxlZCA8aT5qdXN0IGJlZm9yZTwvaT4gYW55CisgICAgICogaW5zdHJ1Y3Rpb24gPGI+aTwvYj4gdGhhdCBmb2xsb3dzIGFuIHVuY29uZGl0aW9uYWwgYnJhbmNoIGluc3RydWN0aW9uCisgICAgICogc3VjaCBhcyBHT1RPIG9yIFRIUk9XLCB0aGF0IGlzIHRoZSB0YXJnZXQgb2YgYSBqdW1wIGluc3RydWN0aW9uLCBvciB0aGF0CisgICAgICogc3RhcnRzIGFuIGV4Y2VwdGlvbiBoYW5kbGVyIGJsb2NrLiBUaGUgdmlzaXRlZCB0eXBlcyBtdXN0IGRlc2NyaWJlIHRoZQorICAgICAqIHZhbHVlcyBvZiB0aGUgbG9jYWwgdmFyaWFibGVzIGFuZCBvZiB0aGUgb3BlcmFuZCBzdGFjayBlbGVtZW50cyA8aT5qdXN0CisgICAgICogYmVmb3JlPC9pPiA8Yj5pPC9iPiBpcyBleGVjdXRlZC48YnI+CisgICAgICogPGJyPgorICAgICAqICgqKSB0aGlzIGlzIG1hbmRhdG9yeSBvbmx5IGZvciBjbGFzc2VzIHdob3NlIHZlcnNpb24gaXMgZ3JlYXRlciB0aGFuIG9yCisgICAgICogZXF1YWwgdG8ge0BsaW5rIE9wY29kZXMjVjFfNiBWMV82fS4gPGJyPgorICAgICAqIDxicj4KKyAgICAgKiBUaGUgZnJhbWVzIG9mIGEgbWV0aG9kIG11c3QgYmUgZ2l2ZW4gZWl0aGVyIGluIGV4cGFuZGVkIGZvcm0sIG9yIGluCisgICAgICogY29tcHJlc3NlZCBmb3JtIChhbGwgZnJhbWVzIG11c3QgdXNlIHRoZSBzYW1lIGZvcm1hdCwgaS5lLiB5b3UgbXVzdCBub3QKKyAgICAgKiBtaXggZXhwYW5kZWQgYW5kIGNvbXByZXNzZWQgZnJhbWVzIHdpdGhpbiBhIHNpbmdsZSBtZXRob2QpOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+SW4gZXhwYW5kZWQgZm9ybSwgYWxsIGZyYW1lcyBtdXN0IGhhdmUgdGhlIEZfTkVXIHR5cGUuPC9saT4KKyAgICAgKiA8bGk+SW4gY29tcHJlc3NlZCBmb3JtLCBmcmFtZXMgYXJlIGJhc2ljYWxseSAiZGVsdGFzIiBmcm9tIHRoZSBzdGF0ZSBvZgorICAgICAqIHRoZSBwcmV2aW91cyBmcmFtZToKKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAbGluayBPcGNvZGVzI0ZfU0FNRX0gcmVwcmVzZW50aW5nIGZyYW1lIHdpdGggZXhhY3RseSB0aGUgc2FtZQorICAgICAqIGxvY2FscyBhcyB0aGUgcHJldmlvdXMgZnJhbWUgYW5kIHdpdGggdGhlIGVtcHR5IHN0YWNrLjwvbGk+CisgICAgICogPGxpPntAbGluayBPcGNvZGVzI0ZfU0FNRTF9IHJlcHJlc2VudGluZyBmcmFtZSB3aXRoIGV4YWN0bHkgdGhlIHNhbWUKKyAgICAgKiBsb2NhbHMgYXMgdGhlIHByZXZpb3VzIGZyYW1lIGFuZCB3aXRoIHNpbmdsZSB2YWx1ZSBvbiB0aGUgc3RhY2sgKAorICAgICAqIDxjb2RlPm5TdGFjazwvY29kZT4gaXMgMSBhbmQgPGNvZGU+c3RhY2tbMF08L2NvZGU+IGNvbnRhaW5zIHZhbHVlIGZvciB0aGUKKyAgICAgKiB0eXBlIG9mIHRoZSBzdGFjayBpdGVtKS48L2xpPgorICAgICAqIDxsaT57QGxpbmsgT3Bjb2RlcyNGX0FQUEVORH0gcmVwcmVzZW50aW5nIGZyYW1lIHdpdGggY3VycmVudCBsb2NhbHMgYXJlCisgICAgICogdGhlIHNhbWUgYXMgdGhlIGxvY2FscyBpbiB0aGUgcHJldmlvdXMgZnJhbWUsIGV4Y2VwdCB0aGF0IGFkZGl0aW9uYWwKKyAgICAgKiBsb2NhbHMgYXJlIGRlZmluZWQgKDxjb2RlPm5Mb2NhbDwvY29kZT4gaXMgMSwgMiBvciAzIGFuZAorICAgICAqIDxjb2RlPmxvY2FsPC9jb2RlPiBlbGVtZW50cyBjb250YWlucyB2YWx1ZXMgcmVwcmVzZW50aW5nIGFkZGVkIHR5cGVzKS48L2xpPgorICAgICAqIDxsaT57QGxpbmsgT3Bjb2RlcyNGX0NIT1B9IHJlcHJlc2VudGluZyBmcmFtZSB3aXRoIGN1cnJlbnQgbG9jYWxzIGFyZSB0aGUKKyAgICAgKiBzYW1lIGFzIHRoZSBsb2NhbHMgaW4gdGhlIHByZXZpb3VzIGZyYW1lLCBleGNlcHQgdGhhdCB0aGUgbGFzdCAxLTMgbG9jYWxzCisgICAgICogYXJlIGFic2VudCBhbmQgd2l0aCB0aGUgZW1wdHkgc3RhY2sgKDxjb2RlPm5Mb2NhbHM8L2NvZGU+IGlzIDEsIDIgb3IgMykuPC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIE9wY29kZXMjRl9GVUxMfSByZXByZXNlbnRpbmcgY29tcGxldGUgZnJhbWUgZGF0YS48L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDxicj4KKyAgICAgKiBJbiBib3RoIGNhc2VzIHRoZSBmaXJzdCBmcmFtZSwgY29ycmVzcG9uZGluZyB0byB0aGUgbWV0aG9kJ3MgcGFyYW1ldGVycworICAgICAqIGFuZCBhY2Nlc3MgZmxhZ3MsIGlzIGltcGxpY2l0IGFuZCBtdXN0IG5vdCBiZSB2aXNpdGVkLiBBbHNvLCBpdCBpcworICAgICAqIGlsbGVnYWwgdG8gdmlzaXQgdHdvIG9yIG1vcmUgZnJhbWVzIGZvciB0aGUgc2FtZSBjb2RlIGxvY2F0aW9uIChpLmUuLCBhdAorICAgICAqIGxlYXN0IG9uZSBpbnN0cnVjdGlvbiBtdXN0IGJlIHZpc2l0ZWQgYmV0d2VlbiB0d28gY2FsbHMgdG8gdmlzaXRGcmFtZSkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZQorICAgICAqICAgICAgICAgICAgdGhlIHR5cGUgb2YgdGhpcyBzdGFjayBtYXAgZnJhbWUuIE11c3QgYmUKKyAgICAgKiAgICAgICAgICAgIHtAbGluayBPcGNvZGVzI0ZfTkVXfSBmb3IgZXhwYW5kZWQgZnJhbWVzLCBvcgorICAgICAqICAgICAgICAgICAge0BsaW5rIE9wY29kZXMjRl9GVUxMfSwge0BsaW5rIE9wY29kZXMjRl9BUFBFTkR9LAorICAgICAqICAgICAgICAgICAge0BsaW5rIE9wY29kZXMjRl9DSE9QfSwge0BsaW5rIE9wY29kZXMjRl9TQU1FfSBvcgorICAgICAqICAgICAgICAgICAge0BsaW5rIE9wY29kZXMjRl9BUFBFTkR9LCB7QGxpbmsgT3Bjb2RlcyNGX1NBTUUxfSBmb3IKKyAgICAgKiAgICAgICAgICAgIGNvbXByZXNzZWQgZnJhbWVzLgorICAgICAqIEBwYXJhbSBuTG9jYWwKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgbG9jYWwgdmFyaWFibGVzIGluIHRoZSB2aXNpdGVkIGZyYW1lLgorICAgICAqIEBwYXJhbSBsb2NhbAorICAgICAqICAgICAgICAgICAgdGhlIGxvY2FsIHZhcmlhYmxlIHR5cGVzIGluIHRoaXMgZnJhbWUuIFRoaXMgYXJyYXkgbXVzdCBub3QgYmUKKyAgICAgKiAgICAgICAgICAgIG1vZGlmaWVkLiBQcmltaXRpdmUgdHlwZXMgYXJlIHJlcHJlc2VudGVkIGJ5CisgICAgICogICAgICAgICAgICB7QGxpbmsgT3Bjb2RlcyNUT1B9LCB7QGxpbmsgT3Bjb2RlcyNJTlRFR0VSfSwKKyAgICAgKiAgICAgICAgICAgIHtAbGluayBPcGNvZGVzI0ZMT0FUfSwge0BsaW5rIE9wY29kZXMjTE9OR30sCisgICAgICogICAgICAgICAgICB7QGxpbmsgT3Bjb2RlcyNET1VCTEV9LHtAbGluayBPcGNvZGVzI05VTEx9IG9yCisgICAgICogICAgICAgICAgICB7QGxpbmsgT3Bjb2RlcyNVTklOSVRJQUxJWkVEX1RISVN9IChsb25nIGFuZCBkb3VibGUgYXJlCisgICAgICogICAgICAgICAgICByZXByZXNlbnRlZCBieSBhIHNpbmdsZSBlbGVtZW50KS4gUmVmZXJlbmNlIHR5cGVzIGFyZQorICAgICAqICAgICAgICAgICAgcmVwcmVzZW50ZWQgYnkgU3RyaW5nIG9iamVjdHMgKHJlcHJlc2VudGluZyBpbnRlcm5hbCBuYW1lcyksCisgICAgICogICAgICAgICAgICBhbmQgdW5pbml0aWFsaXplZCB0eXBlcyBieSBMYWJlbCBvYmplY3RzICh0aGlzIGxhYmVsCisgICAgICogICAgICAgICAgICBkZXNpZ25hdGVzIHRoZSBORVcgaW5zdHJ1Y3Rpb24gdGhhdCBjcmVhdGVkIHRoaXMgdW5pbml0aWFsaXplZAorICAgICAqICAgICAgICAgICAgdmFsdWUpLgorICAgICAqIEBwYXJhbSBuU3RhY2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2Ygb3BlcmFuZCBzdGFjayBlbGVtZW50cyBpbiB0aGUgdmlzaXRlZCBmcmFtZS4KKyAgICAgKiBAcGFyYW0gc3RhY2sKKyAgICAgKiAgICAgICAgICAgIHRoZSBvcGVyYW5kIHN0YWNrIHR5cGVzIGluIHRoaXMgZnJhbWUuIFRoaXMgYXJyYXkgbXVzdCBub3QgYmUKKyAgICAgKiAgICAgICAgICAgIG1vZGlmaWVkLiBJdHMgY29udGVudCBoYXMgdGhlIHNhbWUgZm9ybWF0IGFzIHRoZSAibG9jYWwiCisgICAgICogICAgICAgICAgICBhcnJheS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIGEgZnJhbWUgaXMgdmlzaXRlZCBqdXN0IGFmdGVyIGFub3RoZXIgb25lLCB3aXRob3V0IGFueQorICAgICAqICAgICAgICAgICAgIGluc3RydWN0aW9uIGJldHdlZW4gdGhlIHR3byAodW5sZXNzIHRoaXMgZnJhbWUgaXMgYQorICAgICAqICAgICAgICAgICAgIE9wY29kZXMjRl9TQU1FIGZyYW1lLCBpbiB3aGljaCBjYXNlIGl0IGlzIHNpbGVudGx5IGlnbm9yZWQpLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZpc2l0RnJhbWUoaW50IHR5cGUsIGludCBuTG9jYWwsIE9iamVjdFtdIGxvY2FsLCBpbnQgblN0YWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0W10gc3RhY2spIHsKKyAgICAgICAgaWYgKG12ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG12LnZpc2l0RnJhbWUodHlwZSwgbkxvY2FsLCBsb2NhbCwgblN0YWNrLCBzdGFjayk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gTm9ybWFsIGluc3RydWN0aW9ucworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIFZpc2l0cyBhIHplcm8gb3BlcmFuZCBpbnN0cnVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvcGNvZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBvcGNvZGUgb2YgdGhlIGluc3RydWN0aW9uIHRvIGJlIHZpc2l0ZWQuIFRoaXMgb3Bjb2RlIGlzCisgICAgICogICAgICAgICAgICBlaXRoZXIgTk9QLCBBQ09OU1RfTlVMTCwgSUNPTlNUX00xLCBJQ09OU1RfMCwgSUNPTlNUXzEsCisgICAgICogICAgICAgICAgICBJQ09OU1RfMiwgSUNPTlNUXzMsIElDT05TVF80LCBJQ09OU1RfNSwgTENPTlNUXzAsIExDT05TVF8xLAorICAgICAqICAgICAgICAgICAgRkNPTlNUXzAsIEZDT05TVF8xLCBGQ09OU1RfMiwgRENPTlNUXzAsIERDT05TVF8xLCBJQUxPQUQsCisgICAgICogICAgICAgICAgICBMQUxPQUQsIEZBTE9BRCwgREFMT0FELCBBQUxPQUQsIEJBTE9BRCwgQ0FMT0FELCBTQUxPQUQsCisgICAgICogICAgICAgICAgICBJQVNUT1JFLCBMQVNUT1JFLCBGQVNUT1JFLCBEQVNUT1JFLCBBQVNUT1JFLCBCQVNUT1JFLCBDQVNUT1JFLAorICAgICAqICAgICAgICAgICAgU0FTVE9SRSwgUE9QLCBQT1AyLCBEVVAsIERVUF9YMSwgRFVQX1gyLCBEVVAyLCBEVVAyX1gxLAorICAgICAqICAgICAgICAgICAgRFVQMl9YMiwgU1dBUCwgSUFERCwgTEFERCwgRkFERCwgREFERCwgSVNVQiwgTFNVQiwgRlNVQiwgRFNVQiwKKyAgICAgKiAgICAgICAgICAgIElNVUwsIExNVUwsIEZNVUwsIERNVUwsIElESVYsIExESVYsIEZESVYsIERESVYsIElSRU0sIExSRU0sCisgICAgICogICAgICAgICAgICBGUkVNLCBEUkVNLCBJTkVHLCBMTkVHLCBGTkVHLCBETkVHLCBJU0hMLCBMU0hMLCBJU0hSLCBMU0hSLAorICAgICAqICAgICAgICAgICAgSVVTSFIsIExVU0hSLCBJQU5ELCBMQU5ELCBJT1IsIExPUiwgSVhPUiwgTFhPUiwgSTJMLCBJMkYsIEkyRCwKKyAgICAgKiAgICAgICAgICAgIEwySSwgTDJGLCBMMkQsIEYySSwgRjJMLCBGMkQsIEQySSwgRDJMLCBEMkYsIEkyQiwgSTJDLCBJMlMsCisgICAgICogICAgICAgICAgICBMQ01QLCBGQ01QTCwgRkNNUEcsIERDTVBMLCBEQ01QRywgSVJFVFVSTiwgTFJFVFVSTiwgRlJFVFVSTiwKKyAgICAgKiAgICAgICAgICAgIERSRVRVUk4sIEFSRVRVUk4sIFJFVFVSTiwgQVJSQVlMRU5HVEgsIEFUSFJPVywgTU9OSVRPUkVOVEVSLAorICAgICAqICAgICAgICAgICAgb3IgTU9OSVRPUkVYSVQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmlzaXRJbnNuKGludCBvcGNvZGUpIHsKKyAgICAgICAgaWYgKG12ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG12LnZpc2l0SW5zbihvcGNvZGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVmlzaXRzIGFuIGluc3RydWN0aW9uIHdpdGggYSBzaW5nbGUgaW50IG9wZXJhbmQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3Bjb2RlCisgICAgICogICAgICAgICAgICB0aGUgb3Bjb2RlIG9mIHRoZSBpbnN0cnVjdGlvbiB0byBiZSB2aXNpdGVkLiBUaGlzIG9wY29kZSBpcworICAgICAqICAgICAgICAgICAgZWl0aGVyIEJJUFVTSCwgU0lQVVNIIG9yIE5FV0FSUkFZLgorICAgICAqIEBwYXJhbSBvcGVyYW5kCisgICAgICogICAgICAgICAgICB0aGUgb3BlcmFuZCBvZiB0aGUgaW5zdHJ1Y3Rpb24gdG8gYmUgdmlzaXRlZC48YnI+CisgICAgICogICAgICAgICAgICBXaGVuIG9wY29kZSBpcyBCSVBVU0gsIG9wZXJhbmQgdmFsdWUgc2hvdWxkIGJlIGJldHdlZW4KKyAgICAgKiAgICAgICAgICAgIEJ5dGUuTUlOX1ZBTFVFIGFuZCBCeXRlLk1BWF9WQUxVRS48YnI+CisgICAgICogICAgICAgICAgICBXaGVuIG9wY29kZSBpcyBTSVBVU0gsIG9wZXJhbmQgdmFsdWUgc2hvdWxkIGJlIGJldHdlZW4KKyAgICAgKiAgICAgICAgICAgIFNob3J0Lk1JTl9WQUxVRSBhbmQgU2hvcnQuTUFYX1ZBTFVFLjxicj4KKyAgICAgKiAgICAgICAgICAgIFdoZW4gb3Bjb2RlIGlzIE5FV0FSUkFZLCBvcGVyYW5kIHZhbHVlIHNob3VsZCBiZSBvbmUgb2YKKyAgICAgKiAgICAgICAgICAgIHtAbGluayBPcGNvZGVzI1RfQk9PTEVBTn0sIHtAbGluayBPcGNvZGVzI1RfQ0hBUn0sCisgICAgICogICAgICAgICAgICB7QGxpbmsgT3Bjb2RlcyNUX0ZMT0FUfSwge0BsaW5rIE9wY29kZXMjVF9ET1VCTEV9LAorICAgICAqICAgICAgICAgICAge0BsaW5rIE9wY29kZXMjVF9CWVRFfSwge0BsaW5rIE9wY29kZXMjVF9TSE9SVH0sCisgICAgICogICAgICAgICAgICB7QGxpbmsgT3Bjb2RlcyNUX0lOVH0gb3Ige0BsaW5rIE9wY29kZXMjVF9MT05HfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB2aXNpdEludEluc24oaW50IG9wY29kZSwgaW50IG9wZXJhbmQpIHsKKyAgICAgICAgaWYgKG12ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG12LnZpc2l0SW50SW5zbihvcGNvZGUsIG9wZXJhbmQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVmlzaXRzIGEgbG9jYWwgdmFyaWFibGUgaW5zdHJ1Y3Rpb24uIEEgbG9jYWwgdmFyaWFibGUgaW5zdHJ1Y3Rpb24gaXMgYW4KKyAgICAgKiBpbnN0cnVjdGlvbiB0aGF0IGxvYWRzIG9yIHN0b3JlcyB0aGUgdmFsdWUgb2YgYSBsb2NhbCB2YXJpYWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvcGNvZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBvcGNvZGUgb2YgdGhlIGxvY2FsIHZhcmlhYmxlIGluc3RydWN0aW9uIHRvIGJlIHZpc2l0ZWQuCisgICAgICogICAgICAgICAgICBUaGlzIG9wY29kZSBpcyBlaXRoZXIgSUxPQUQsIExMT0FELCBGTE9BRCwgRExPQUQsIEFMT0FELAorICAgICAqICAgICAgICAgICAgSVNUT1JFLCBMU1RPUkUsIEZTVE9SRSwgRFNUT1JFLCBBU1RPUkUgb3IgUkVULgorICAgICAqIEBwYXJhbSB2YXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBvcGVyYW5kIG9mIHRoZSBpbnN0cnVjdGlvbiB0byBiZSB2aXNpdGVkLiBUaGlzIG9wZXJhbmQgaXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbmRleCBvZiBhIGxvY2FsIHZhcmlhYmxlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZpc2l0VmFySW5zbihpbnQgb3Bjb2RlLCBpbnQgdmFyKSB7CisgICAgICAgIGlmIChtdiAhPSBudWxsKSB7CisgICAgICAgICAgICBtdi52aXNpdFZhckluc24ob3Bjb2RlLCB2YXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVmlzaXRzIGEgdHlwZSBpbnN0cnVjdGlvbi4gQSB0eXBlIGluc3RydWN0aW9uIGlzIGFuIGluc3RydWN0aW9uIHRoYXQKKyAgICAgKiB0YWtlcyB0aGUgaW50ZXJuYWwgbmFtZSBvZiBhIGNsYXNzIGFzIHBhcmFtZXRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvcGNvZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBvcGNvZGUgb2YgdGhlIHR5cGUgaW5zdHJ1Y3Rpb24gdG8gYmUgdmlzaXRlZC4gVGhpcyBvcGNvZGUKKyAgICAgKiAgICAgICAgICAgIGlzIGVpdGhlciBORVcsIEFORVdBUlJBWSwgQ0hFQ0tDQVNUIG9yIElOU1RBTkNFT0YuCisgICAgICogQHBhcmFtIHR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBvcGVyYW5kIG9mIHRoZSBpbnN0cnVjdGlvbiB0byBiZSB2aXNpdGVkLiBUaGlzIG9wZXJhbmQKKyAgICAgKiAgICAgICAgICAgIG11c3QgYmUgdGhlIGludGVybmFsIG5hbWUgb2YgYW4gb2JqZWN0IG9yIGFycmF5IGNsYXNzIChzZWUKKyAgICAgKiAgICAgICAgICAgIHtAbGluayBUeXBlI2dldEludGVybmFsTmFtZSgpIGdldEludGVybmFsTmFtZX0pLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZpc2l0VHlwZUluc24oaW50IG9wY29kZSwgU3RyaW5nIHR5cGUpIHsKKyAgICAgICAgaWYgKG12ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG12LnZpc2l0VHlwZUluc24ob3Bjb2RlLCB0eXBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFZpc2l0cyBhIGZpZWxkIGluc3RydWN0aW9uLiBBIGZpZWxkIGluc3RydWN0aW9uIGlzIGFuIGluc3RydWN0aW9uIHRoYXQKKyAgICAgKiBsb2FkcyBvciBzdG9yZXMgdGhlIHZhbHVlIG9mIGEgZmllbGQgb2YgYW4gb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIG9wY29kZQorICAgICAqICAgICAgICAgICAgdGhlIG9wY29kZSBvZiB0aGUgdHlwZSBpbnN0cnVjdGlvbiB0byBiZSB2aXNpdGVkLiBUaGlzIG9wY29kZQorICAgICAqICAgICAgICAgICAgaXMgZWl0aGVyIEdFVFNUQVRJQywgUFVUU1RBVElDLCBHRVRGSUVMRCBvciBQVVRGSUVMRC4KKyAgICAgKiBAcGFyYW0gb3duZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnRlcm5hbCBuYW1lIG9mIHRoZSBmaWVsZCdzIG93bmVyIGNsYXNzIChzZWUKKyAgICAgKiAgICAgICAgICAgIHtAbGluayBUeXBlI2dldEludGVybmFsTmFtZSgpIGdldEludGVybmFsTmFtZX0pLgorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgZmllbGQncyBuYW1lLgorICAgICAqIEBwYXJhbSBkZXNjCisgICAgICogICAgICAgICAgICB0aGUgZmllbGQncyBkZXNjcmlwdG9yIChzZWUge0BsaW5rIFR5cGUgVHlwZX0pLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZpc2l0RmllbGRJbnNuKGludCBvcGNvZGUsIFN0cmluZyBvd25lciwgU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRlc2MpIHsKKyAgICAgICAgaWYgKG12ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG12LnZpc2l0RmllbGRJbnNuKG9wY29kZSwgb3duZXIsIG5hbWUsIGRlc2MpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVmlzaXRzIGEgbWV0aG9kIGluc3RydWN0aW9uLiBBIG1ldGhvZCBpbnN0cnVjdGlvbiBpcyBhbiBpbnN0cnVjdGlvbiB0aGF0CisgICAgICogaW52b2tlcyBhIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvcGNvZGUKKyAgICAgKiAgICAgICAgICAgIHRoZSBvcGNvZGUgb2YgdGhlIHR5cGUgaW5zdHJ1Y3Rpb24gdG8gYmUgdmlzaXRlZC4gVGhpcyBvcGNvZGUKKyAgICAgKiAgICAgICAgICAgIGlzIGVpdGhlciBJTlZPS0VWSVJUVUFMLCBJTlZPS0VTUEVDSUFMLCBJTlZPS0VTVEFUSUMgb3IKKyAgICAgKiAgICAgICAgICAgIElOVk9LRUlOVEVSRkFDRS4KKyAgICAgKiBAcGFyYW0gb3duZXIKKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnRlcm5hbCBuYW1lIG9mIHRoZSBtZXRob2QncyBvd25lciBjbGFzcyAoc2VlCisgICAgICogICAgICAgICAgICB7QGxpbmsgVHlwZSNnZXRJbnRlcm5hbE5hbWUoKSBnZXRJbnRlcm5hbE5hbWV9KS4KKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqICAgICAgICAgICAgdGhlIG1ldGhvZCdzIG5hbWUuCisgICAgICogQHBhcmFtIGRlc2MKKyAgICAgKiAgICAgICAgICAgIHRoZSBtZXRob2QncyBkZXNjcmlwdG9yIChzZWUge0BsaW5rIFR5cGUgVHlwZX0pLgorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIHZvaWQgdmlzaXRNZXRob2RJbnNuKGludCBvcGNvZGUsIFN0cmluZyBvd25lciwgU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkZXNjKSB7CisgICAgICAgIGlmIChhcGkgPj0gT3Bjb2Rlcy5BU001KSB7CisgICAgICAgICAgICBib29sZWFuIGl0ZiA9IG9wY29kZSA9PSBPcGNvZGVzLklOVk9LRUlOVEVSRkFDRTsKKyAgICAgICAgICAgIHZpc2l0TWV0aG9kSW5zbihvcGNvZGUsIG93bmVyLCBuYW1lLCBkZXNjLCBpdGYpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChtdiAhPSBudWxsKSB7CisgICAgICAgICAgICBtdi52aXNpdE1ldGhvZEluc24ob3Bjb2RlLCBvd25lciwgbmFtZSwgZGVzYyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWaXNpdHMgYSBtZXRob2QgaW5zdHJ1Y3Rpb24uIEEgbWV0aG9kIGluc3RydWN0aW9uIGlzIGFuIGluc3RydWN0aW9uIHRoYXQKKyAgICAgKiBpbnZva2VzIGEgbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIG9wY29kZQorICAgICAqICAgICAgICAgICAgdGhlIG9wY29kZSBvZiB0aGUgdHlwZSBpbnN0cnVjdGlvbiB0byBiZSB2aXNpdGVkLiBUaGlzIG9wY29kZQorICAgICAqICAgICAgICAgICAgaXMgZWl0aGVyIElOVk9LRVZJUlRVQUwsIElOVk9LRVNQRUNJQUwsIElOVk9LRVNUQVRJQyBvcgorICAgICAqICAgICAgICAgICAgSU5WT0tFSU5URVJGQUNFLgorICAgICAqIEBwYXJhbSBvd25lcgorICAgICAqICAgICAgICAgICAgdGhlIGludGVybmFsIG5hbWUgb2YgdGhlIG1ldGhvZCdzIG93bmVyIGNsYXNzIChzZWUKKyAgICAgKiAgICAgICAgICAgIHtAbGluayBUeXBlI2dldEludGVybmFsTmFtZSgpIGdldEludGVybmFsTmFtZX0pLgorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgbWV0aG9kJ3MgbmFtZS4KKyAgICAgKiBAcGFyYW0gZGVzYworICAgICAqICAgICAgICAgICAgdGhlIG1ldGhvZCdzIGRlc2NyaXB0b3IgKHNlZSB7QGxpbmsgVHlwZSBUeXBlfSkuCisgICAgICogQHBhcmFtIGl0ZgorICAgICAqICAgICAgICAgICAgaWYgdGhlIG1ldGhvZCdzIG93bmVyIGNsYXNzIGlzIGFuIGludGVyZmFjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB2aXNpdE1ldGhvZEluc24oaW50IG9wY29kZSwgU3RyaW5nIG93bmVyLCBTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRlc2MsIGJvb2xlYW4gaXRmKSB7CisgICAgICAgIGlmIChhcGkgPCBPcGNvZGVzLkFTTTUpIHsKKyAgICAgICAgICAgIGlmIChpdGYgIT0gKG9wY29kZSA9PSBPcGNvZGVzLklOVk9LRUlOVEVSRkFDRSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgIklOVk9LRVNQRUNJQUwvU1RBVElDIG9uIGludGVyZmFjZXMgcmVxdWlyZSBBU00gNSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdmlzaXRNZXRob2RJbnNuKG9wY29kZSwgb3duZXIsIG5hbWUsIGRlc2MpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChtdiAhPSBudWxsKSB7CisgICAgICAgICAgICBtdi52aXNpdE1ldGhvZEluc24ob3Bjb2RlLCBvd25lciwgbmFtZSwgZGVzYywgaXRmKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFZpc2l0cyBhbiBpbnZva2VkeW5hbWljIGluc3RydWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBtZXRob2QncyBuYW1lLgorICAgICAqIEBwYXJhbSBkZXNjCisgICAgICogICAgICAgICAgICB0aGUgbWV0aG9kJ3MgZGVzY3JpcHRvciAoc2VlIHtAbGluayBUeXBlIFR5cGV9KS4KKyAgICAgKiBAcGFyYW0gYnNtCisgICAgICogICAgICAgICAgICB0aGUgYm9vdHN0cmFwIG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gYnNtQXJncworICAgICAqICAgICAgICAgICAgdGhlIGJvb3RzdHJhcCBtZXRob2QgY29uc3RhbnQgYXJndW1lbnRzLiBFYWNoIGFyZ3VtZW50IG11c3QgYmUKKyAgICAgKiAgICAgICAgICAgIGFuIHtAbGluayBJbnRlZ2VyfSwge0BsaW5rIEZsb2F0fSwge0BsaW5rIExvbmd9LAorICAgICAqICAgICAgICAgICAge0BsaW5rIERvdWJsZX0sIHtAbGluayBTdHJpbmd9LCB7QGxpbmsgVHlwZX0gb3Ige0BsaW5rIEhhbmRsZX0KKyAgICAgKiAgICAgICAgICAgIHZhbHVlLiBUaGlzIG1ldGhvZCBpcyBhbGxvd2VkIHRvIG1vZGlmeSB0aGUgY29udGVudCBvZiB0aGUKKyAgICAgKiAgICAgICAgICAgIGFycmF5IHNvIGEgY2FsbGVyIHNob3VsZCBleHBlY3QgdGhhdCB0aGlzIGFycmF5IG1heSBjaGFuZ2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmlzaXRJbnZva2VEeW5hbWljSW5zbihTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2MsIEhhbmRsZSBic20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuLi4gYnNtQXJncykgeworICAgICAgICBpZiAobXYgIT0gbnVsbCkgeworICAgICAgICAgICAgbXYudmlzaXRJbnZva2VEeW5hbWljSW5zbihuYW1lLCBkZXNjLCBic20sIGJzbUFyZ3MpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVmlzaXRzIGEganVtcCBpbnN0cnVjdGlvbi4gQSBqdW1wIGluc3RydWN0aW9uIGlzIGFuIGluc3RydWN0aW9uIHRoYXQgbWF5CisgICAgICoganVtcCB0byBhbm90aGVyIGluc3RydWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIG9wY29kZQorICAgICAqICAgICAgICAgICAgdGhlIG9wY29kZSBvZiB0aGUgdHlwZSBpbnN0cnVjdGlvbiB0byBiZSB2aXNpdGVkLiBUaGlzIG9wY29kZQorICAgICAqICAgICAgICAgICAgaXMgZWl0aGVyIElGRVEsIElGTkUsIElGTFQsIElGR0UsIElGR1QsIElGTEUsIElGX0lDTVBFUSwKKyAgICAgKiAgICAgICAgICAgIElGX0lDTVBORSwgSUZfSUNNUExULCBJRl9JQ01QR0UsIElGX0lDTVBHVCwgSUZfSUNNUExFLAorICAgICAqICAgICAgICAgICAgSUZfQUNNUEVRLCBJRl9BQ01QTkUsIEdPVE8sIEpTUiwgSUZOVUxMIG9yIElGTk9OTlVMTC4KKyAgICAgKiBAcGFyYW0gbGFiZWwKKyAgICAgKiAgICAgICAgICAgIHRoZSBvcGVyYW5kIG9mIHRoZSBpbnN0cnVjdGlvbiB0byBiZSB2aXNpdGVkLiBUaGlzIG9wZXJhbmQgaXMKKyAgICAgKiAgICAgICAgICAgIGEgbGFiZWwgdGhhdCBkZXNpZ25hdGVzIHRoZSBpbnN0cnVjdGlvbiB0byB3aGljaCB0aGUganVtcAorICAgICAqICAgICAgICAgICAgaW5zdHJ1Y3Rpb24gbWF5IGp1bXAuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmlzaXRKdW1wSW5zbihpbnQgb3Bjb2RlLCBMYWJlbCBsYWJlbCkgeworICAgICAgICBpZiAobXYgIT0gbnVsbCkgeworICAgICAgICAgICAgbXYudmlzaXRKdW1wSW5zbihvcGNvZGUsIGxhYmVsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFZpc2l0cyBhIGxhYmVsLiBBIGxhYmVsIGRlc2lnbmF0ZXMgdGhlIGluc3RydWN0aW9uIHRoYXQgd2lsbCBiZSB2aXNpdGVkCisgICAgICoganVzdCBhZnRlciBpdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsYWJlbAorICAgICAqICAgICAgICAgICAgYSB7QGxpbmsgTGFiZWwgTGFiZWx9IG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB2aXNpdExhYmVsKExhYmVsIGxhYmVsKSB7CisgICAgICAgIGlmIChtdiAhPSBudWxsKSB7CisgICAgICAgICAgICBtdi52aXNpdExhYmVsKGxhYmVsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBTcGVjaWFsIGluc3RydWN0aW9ucworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIFZpc2l0cyBhIExEQyBpbnN0cnVjdGlvbi4gTm90ZSB0aGF0IG5ldyBjb25zdGFudCB0eXBlcyBtYXkgYmUgYWRkZWQgaW4KKyAgICAgKiBmdXR1cmUgdmVyc2lvbnMgb2YgdGhlIEphdmEgVmlydHVhbCBNYWNoaW5lLiBUbyBlYXNpbHkgZGV0ZWN0IG5ldworICAgICAqIGNvbnN0YW50IHR5cGVzLCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhpcyBtZXRob2Qgc2hvdWxkIGNoZWNrIGZvcgorICAgICAqIHVuZXhwZWN0ZWQgY29uc3RhbnQgdHlwZXMsIGxpa2UgdGhpczoKKyAgICAgKgorICAgICAqIDxwcmU+CisgICAgICogaWYgKGNzdCBpbnN0YW5jZW9mIEludGVnZXIpIHsKKyAgICAgKiAgICAgLy8gLi4uCisgICAgICogfSBlbHNlIGlmIChjc3QgaW5zdGFuY2VvZiBGbG9hdCkgeworICAgICAqICAgICAvLyAuLi4KKyAgICAgKiB9IGVsc2UgaWYgKGNzdCBpbnN0YW5jZW9mIExvbmcpIHsKKyAgICAgKiAgICAgLy8gLi4uCisgICAgICogfSBlbHNlIGlmIChjc3QgaW5zdGFuY2VvZiBEb3VibGUpIHsKKyAgICAgKiAgICAgLy8gLi4uCisgICAgICogfSBlbHNlIGlmIChjc3QgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgKiAgICAgLy8gLi4uCisgICAgICogfSBlbHNlIGlmIChjc3QgaW5zdGFuY2VvZiBUeXBlKSB7CisgICAgICogICAgIGludCBzb3J0ID0gKChUeXBlKSBjc3QpLmdldFNvcnQoKTsKKyAgICAgKiAgICAgaWYgKHNvcnQgPT0gVHlwZS5PQkpFQ1QpIHsKKyAgICAgKiAgICAgICAgIC8vIC4uLgorICAgICAqICAgICB9IGVsc2UgaWYgKHNvcnQgPT0gVHlwZS5BUlJBWSkgeworICAgICAqICAgICAgICAgLy8gLi4uCisgICAgICogICAgIH0gZWxzZSBpZiAoc29ydCA9PSBUeXBlLk1FVEhPRCkgeworICAgICAqICAgICAgICAgLy8gLi4uCisgICAgICogICAgIH0gZWxzZSB7CisgICAgICogICAgICAgICAvLyB0aHJvdyBhbiBleGNlcHRpb24KKyAgICAgKiAgICAgfQorICAgICAqIH0gZWxzZSBpZiAoY3N0IGluc3RhbmNlb2YgSGFuZGxlKSB7CisgICAgICogICAgIC8vIC4uLgorICAgICAqIH0gZWxzZSB7CisgICAgICogICAgIC8vIHRocm93IGFuIGV4Y2VwdGlvbgorICAgICAqIH0KKyAgICAgKiA8L3ByZT4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjc3QKKyAgICAgKiAgICAgICAgICAgIHRoZSBjb25zdGFudCB0byBiZSBsb2FkZWQgb24gdGhlIHN0YWNrLiBUaGlzIHBhcmFtZXRlciBtdXN0IGJlCisgICAgICogICAgICAgICAgICBhIG5vbiBudWxsIHtAbGluayBJbnRlZ2VyfSwgYSB7QGxpbmsgRmxvYXR9LCBhIHtAbGluayBMb25nfSwgYQorICAgICAqICAgICAgICAgICAge0BsaW5rIERvdWJsZX0sIGEge0BsaW5rIFN0cmluZ30sIGEge0BsaW5rIFR5cGV9IG9mIE9CSkVDVCBvcgorICAgICAqICAgICAgICAgICAgQVJSQVkgc29ydCBmb3IgPHR0Pi5jbGFzczwvdHQ+IGNvbnN0YW50cywgZm9yIGNsYXNzZXMgd2hvc2UKKyAgICAgKiAgICAgICAgICAgIHZlcnNpb24gaXMgNDkuMCwgYSB7QGxpbmsgVHlwZX0gb2YgTUVUSE9EIHNvcnQgb3IgYQorICAgICAqICAgICAgICAgICAge0BsaW5rIEhhbmRsZX0gZm9yIE1ldGhvZFR5cGUgYW5kIE1ldGhvZEhhbmRsZSBjb25zdGFudHMsIGZvcgorICAgICAqICAgICAgICAgICAgY2xhc3NlcyB3aG9zZSB2ZXJzaW9uIGlzIDUxLjAuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmlzaXRMZGNJbnNuKE9iamVjdCBjc3QpIHsKKyAgICAgICAgaWYgKG12ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG12LnZpc2l0TGRjSW5zbihjc3QpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVmlzaXRzIGFuIElJTkMgaW5zdHJ1Y3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFyCisgICAgICogICAgICAgICAgICBpbmRleCBvZiB0aGUgbG9jYWwgdmFyaWFibGUgdG8gYmUgaW5jcmVtZW50ZWQuCisgICAgICogQHBhcmFtIGluY3JlbWVudAorICAgICAqICAgICAgICAgICAgYW1vdW50IHRvIGluY3JlbWVudCB0aGUgbG9jYWwgdmFyaWFibGUgYnkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmlzaXRJaW5jSW5zbihpbnQgdmFyLCBpbnQgaW5jcmVtZW50KSB7CisgICAgICAgIGlmIChtdiAhPSBudWxsKSB7CisgICAgICAgICAgICBtdi52aXNpdElpbmNJbnNuKHZhciwgaW5jcmVtZW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFZpc2l0cyBhIFRBQkxFU1dJVENIIGluc3RydWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIG1pbgorICAgICAqICAgICAgICAgICAgdGhlIG1pbmltdW0ga2V5IHZhbHVlLgorICAgICAqIEBwYXJhbSBtYXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBtYXhpbXVtIGtleSB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gZGZsdAorICAgICAqICAgICAgICAgICAgYmVnaW5uaW5nIG9mIHRoZSBkZWZhdWx0IGhhbmRsZXIgYmxvY2suCisgICAgICogQHBhcmFtIGxhYmVscworICAgICAqICAgICAgICAgICAgYmVnaW5uaW5ncyBvZiB0aGUgaGFuZGxlciBibG9ja3MuIDx0dD5sYWJlbHNbaV08L3R0PiBpcyB0aGUKKyAgICAgKiAgICAgICAgICAgIGJlZ2lubmluZyBvZiB0aGUgaGFuZGxlciBibG9jayBmb3IgdGhlIDx0dD5taW4gKyBpPC90dD4ga2V5LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZpc2l0VGFibGVTd2l0Y2hJbnNuKGludCBtaW4sIGludCBtYXgsIExhYmVsIGRmbHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFiZWwuLi4gbGFiZWxzKSB7CisgICAgICAgIGlmIChtdiAhPSBudWxsKSB7CisgICAgICAgICAgICBtdi52aXNpdFRhYmxlU3dpdGNoSW5zbihtaW4sIG1heCwgZGZsdCwgbGFiZWxzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFZpc2l0cyBhIExPT0tVUFNXSVRDSCBpbnN0cnVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZmx0CisgICAgICogICAgICAgICAgICBiZWdpbm5pbmcgb2YgdGhlIGRlZmF1bHQgaGFuZGxlciBibG9jay4KKyAgICAgKiBAcGFyYW0ga2V5cworICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlcyBvZiB0aGUga2V5cy4KKyAgICAgKiBAcGFyYW0gbGFiZWxzCisgICAgICogICAgICAgICAgICBiZWdpbm5pbmdzIG9mIHRoZSBoYW5kbGVyIGJsb2Nrcy4gPHR0PmxhYmVsc1tpXTwvdHQ+IGlzIHRoZQorICAgICAqICAgICAgICAgICAgYmVnaW5uaW5nIG9mIHRoZSBoYW5kbGVyIGJsb2NrIGZvciB0aGUgPHR0PmtleXNbaV08L3R0PiBrZXkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmlzaXRMb29rdXBTd2l0Y2hJbnNuKExhYmVsIGRmbHQsIGludFtdIGtleXMsIExhYmVsW10gbGFiZWxzKSB7CisgICAgICAgIGlmIChtdiAhPSBudWxsKSB7CisgICAgICAgICAgICBtdi52aXNpdExvb2t1cFN3aXRjaEluc24oZGZsdCwga2V5cywgbGFiZWxzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFZpc2l0cyBhIE1VTFRJQU5FV0FSUkFZIGluc3RydWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGRlc2MKKyAgICAgKiAgICAgICAgICAgIGFuIGFycmF5IHR5cGUgZGVzY3JpcHRvciAoc2VlIHtAbGluayBUeXBlIFR5cGV9KS4KKyAgICAgKiBAcGFyYW0gZGltcworICAgICAqICAgICAgICAgICAgbnVtYmVyIG9mIGRpbWVuc2lvbnMgb2YgdGhlIGFycmF5IHRvIGFsbG9jYXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZpc2l0TXVsdGlBTmV3QXJyYXlJbnNuKFN0cmluZyBkZXNjLCBpbnQgZGltcykgeworICAgICAgICBpZiAobXYgIT0gbnVsbCkgeworICAgICAgICAgICAgbXYudmlzaXRNdWx0aUFOZXdBcnJheUluc24oZGVzYywgZGltcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWaXNpdHMgYW4gYW5ub3RhdGlvbiBvbiBhbiBpbnN0cnVjdGlvbi4gVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQganVzdAorICAgICAqIDxpPmFmdGVyPC9pPiB0aGUgYW5ub3RhdGVkIGluc3RydWN0aW9uLiBJdCBjYW4gYmUgY2FsbGVkIHNldmVyYWwgdGltZXMKKyAgICAgKiBmb3IgdGhlIHNhbWUgaW5zdHJ1Y3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZVJlZgorICAgICAqICAgICAgICAgICAgYSByZWZlcmVuY2UgdG8gdGhlIGFubm90YXRlZCB0eXBlLiBUaGUgc29ydCBvZiB0aGlzIHR5cGUKKyAgICAgKiAgICAgICAgICAgIHJlZmVyZW5jZSBtdXN0IGJlIHtAbGluayBUeXBlUmVmZXJlbmNlI0lOU1RBTkNFT0YgSU5TVEFOQ0VPRn0sCisgICAgICogICAgICAgICAgICB7QGxpbmsgVHlwZVJlZmVyZW5jZSNORVcgTkVXfSwKKyAgICAgKiAgICAgICAgICAgIHtAbGluayBUeXBlUmVmZXJlbmNlI0NPTlNUUlVDVE9SX1JFRkVSRU5DRQorICAgICAqICAgICAgICAgICAgQ09OU1RSVUNUT1JfUkVGRVJFTkNFfSwge0BsaW5rIFR5cGVSZWZlcmVuY2UjTUVUSE9EX1JFRkVSRU5DRQorICAgICAqICAgICAgICAgICAgTUVUSE9EX1JFRkVSRU5DRX0sIHtAbGluayBUeXBlUmVmZXJlbmNlI0NBU1QgQ0FTVH0sCisgICAgICogICAgICAgICAgICB7QGxpbmsgVHlwZVJlZmVyZW5jZSNDT05TVFJVQ1RPUl9JTlZPQ0FUSU9OX1RZUEVfQVJHVU1FTlQKKyAgICAgKiAgICAgICAgICAgIENPTlNUUlVDVE9SX0lOVk9DQVRJT05fVFlQRV9BUkdVTUVOVH0sCisgICAgICogICAgICAgICAgICB7QGxpbmsgVHlwZVJlZmVyZW5jZSNNRVRIT0RfSU5WT0NBVElPTl9UWVBFX0FSR1VNRU5UCisgICAgICogICAgICAgICAgICBNRVRIT0RfSU5WT0NBVElPTl9UWVBFX0FSR1VNRU5UfSwKKyAgICAgKiAgICAgICAgICAgIHtAbGluayBUeXBlUmVmZXJlbmNlI0NPTlNUUlVDVE9SX1JFRkVSRU5DRV9UWVBFX0FSR1VNRU5UCisgICAgICogICAgICAgICAgICBDT05TVFJVQ1RPUl9SRUZFUkVOQ0VfVFlQRV9BUkdVTUVOVH0sIG9yCisgICAgICogICAgICAgICAgICB7QGxpbmsgVHlwZVJlZmVyZW5jZSNNRVRIT0RfUkVGRVJFTkNFX1RZUEVfQVJHVU1FTlQKKyAgICAgKiAgICAgICAgICAgIE1FVEhPRF9SRUZFUkVOQ0VfVFlQRV9BUkdVTUVOVH0uIFNlZSB7QGxpbmsgVHlwZVJlZmVyZW5jZX0uCisgICAgICogQHBhcmFtIHR5cGVQYXRoCisgICAgICogICAgICAgICAgICB0aGUgcGF0aCB0byB0aGUgYW5ub3RhdGVkIHR5cGUgYXJndW1lbnQsIHdpbGRjYXJkIGJvdW5kLCBhcnJheQorICAgICAqICAgICAgICAgICAgZWxlbWVudCB0eXBlLCBvciBzdGF0aWMgaW5uZXIgdHlwZSB3aXRoaW4gJ3R5cGVSZWYnLiBNYXkgYmUKKyAgICAgKiAgICAgICAgICAgIDx0dD5udWxsPC90dD4gaWYgdGhlIGFubm90YXRpb24gdGFyZ2V0cyAndHlwZVJlZicgYXMgYSB3aG9sZS4KKyAgICAgKiBAcGFyYW0gZGVzYworICAgICAqICAgICAgICAgICAgdGhlIGNsYXNzIGRlc2NyaXB0b3Igb2YgdGhlIGFubm90YXRpb24gY2xhc3MuCisgICAgICogQHBhcmFtIHZpc2libGUKKyAgICAgKiAgICAgICAgICAgIDx0dD50cnVlPC90dD4gaWYgdGhlIGFubm90YXRpb24gaXMgdmlzaWJsZSBhdCBydW50aW1lLgorICAgICAqIEByZXR1cm4gYSB2aXNpdG9yIHRvIHZpc2l0IHRoZSBhbm5vdGF0aW9uIHZhbHVlcywgb3IgPHR0Pm51bGw8L3R0PiBpZgorICAgICAqICAgICAgICAgdGhpcyB2aXNpdG9yIGlzIG5vdCBpbnRlcmVzdGVkIGluIHZpc2l0aW5nIHRoaXMgYW5ub3RhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQW5ub3RhdGlvblZpc2l0b3IgdmlzaXRJbnNuQW5ub3RhdGlvbihpbnQgdHlwZVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlUGF0aCB0eXBlUGF0aCwgU3RyaW5nIGRlc2MsIGJvb2xlYW4gdmlzaWJsZSkgeworICAgICAgICBpZiAoYXBpIDwgT3Bjb2Rlcy5BU001KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGlmIChtdiAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbXYudmlzaXRJbnNuQW5ub3RhdGlvbih0eXBlUmVmLCB0eXBlUGF0aCwgZGVzYywgdmlzaWJsZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIEV4Y2VwdGlvbnMgdGFibGUgZW50cmllcywgZGVidWcgaW5mb3JtYXRpb24sIG1heCBzdGFjayBhbmQgbWF4IGxvY2FscworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIFZpc2l0cyBhIHRyeSBjYXRjaCBibG9jay4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGFydAorICAgICAqICAgICAgICAgICAgYmVnaW5uaW5nIG9mIHRoZSBleGNlcHRpb24gaGFuZGxlcidzIHNjb3BlIChpbmNsdXNpdmUpLgorICAgICAqIEBwYXJhbSBlbmQKKyAgICAgKiAgICAgICAgICAgIGVuZCBvZiB0aGUgZXhjZXB0aW9uIGhhbmRsZXIncyBzY29wZSAoZXhjbHVzaXZlKS4KKyAgICAgKiBAcGFyYW0gaGFuZGxlcgorICAgICAqICAgICAgICAgICAgYmVnaW5uaW5nIG9mIHRoZSBleGNlcHRpb24gaGFuZGxlcidzIGNvZGUuCisgICAgICogQHBhcmFtIHR5cGUKKyAgICAgKiAgICAgICAgICAgIGludGVybmFsIG5hbWUgb2YgdGhlIHR5cGUgb2YgZXhjZXB0aW9ucyBoYW5kbGVkIGJ5IHRoZQorICAgICAqICAgICAgICAgICAgaGFuZGxlciwgb3IgPHR0Pm51bGw8L3R0PiB0byBjYXRjaCBhbnkgZXhjZXB0aW9ucyAoZm9yCisgICAgICogICAgICAgICAgICAiZmluYWxseSIgYmxvY2tzKS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgIGlmIG9uZSBvZiB0aGUgbGFiZWxzIGhhcyBhbHJlYWR5IGJlZW4gdmlzaXRlZCBieSB0aGlzIHZpc2l0b3IKKyAgICAgKiAgICAgICAgICAgICAoYnkgdGhlIHtAbGluayAjdmlzaXRMYWJlbCB2aXNpdExhYmVsfSBtZXRob2QpLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZpc2l0VHJ5Q2F0Y2hCbG9jayhMYWJlbCBzdGFydCwgTGFiZWwgZW5kLCBMYWJlbCBoYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdHlwZSkgeworICAgICAgICBpZiAobXYgIT0gbnVsbCkgeworICAgICAgICAgICAgbXYudmlzaXRUcnlDYXRjaEJsb2NrKHN0YXJ0LCBlbmQsIGhhbmRsZXIsIHR5cGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVmlzaXRzIGFuIGFubm90YXRpb24gb24gYW4gZXhjZXB0aW9uIGhhbmRsZXIgdHlwZS4gVGhpcyBtZXRob2QgbXVzdCBiZQorICAgICAqIGNhbGxlZCA8aT5hZnRlcjwvaT4gdGhlIHtAbGluayAjdmlzaXRUcnlDYXRjaEJsb2NrfSBmb3IgdGhlIGFubm90YXRlZAorICAgICAqIGV4Y2VwdGlvbiBoYW5kbGVyLiBJdCBjYW4gYmUgY2FsbGVkIHNldmVyYWwgdGltZXMgZm9yIHRoZSBzYW1lIGV4Y2VwdGlvbgorICAgICAqIGhhbmRsZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZVJlZgorICAgICAqICAgICAgICAgICAgYSByZWZlcmVuY2UgdG8gdGhlIGFubm90YXRlZCB0eXBlLiBUaGUgc29ydCBvZiB0aGlzIHR5cGUKKyAgICAgKiAgICAgICAgICAgIHJlZmVyZW5jZSBtdXN0IGJlIHtAbGluayBUeXBlUmVmZXJlbmNlI0VYQ0VQVElPTl9QQVJBTUVURVIKKyAgICAgKiAgICAgICAgICAgIEVYQ0VQVElPTl9QQVJBTUVURVJ9LiBTZWUge0BsaW5rIFR5cGVSZWZlcmVuY2V9LgorICAgICAqIEBwYXJhbSB0eXBlUGF0aAorICAgICAqICAgICAgICAgICAgdGhlIHBhdGggdG8gdGhlIGFubm90YXRlZCB0eXBlIGFyZ3VtZW50LCB3aWxkY2FyZCBib3VuZCwgYXJyYXkKKyAgICAgKiAgICAgICAgICAgIGVsZW1lbnQgdHlwZSwgb3Igc3RhdGljIGlubmVyIHR5cGUgd2l0aGluICd0eXBlUmVmJy4gTWF5IGJlCisgICAgICogICAgICAgICAgICA8dHQ+bnVsbDwvdHQ+IGlmIHRoZSBhbm5vdGF0aW9uIHRhcmdldHMgJ3R5cGVSZWYnIGFzIGEgd2hvbGUuCisgICAgICogQHBhcmFtIGRlc2MKKyAgICAgKiAgICAgICAgICAgIHRoZSBjbGFzcyBkZXNjcmlwdG9yIG9mIHRoZSBhbm5vdGF0aW9uIGNsYXNzLgorICAgICAqIEBwYXJhbSB2aXNpYmxlCisgICAgICogICAgICAgICAgICA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoZSBhbm5vdGF0aW9uIGlzIHZpc2libGUgYXQgcnVudGltZS4KKyAgICAgKiBAcmV0dXJuIGEgdmlzaXRvciB0byB2aXNpdCB0aGUgYW5ub3RhdGlvbiB2YWx1ZXMsIG9yIDx0dD5udWxsPC90dD4gaWYKKyAgICAgKiAgICAgICAgIHRoaXMgdmlzaXRvciBpcyBub3QgaW50ZXJlc3RlZCBpbiB2aXNpdGluZyB0aGlzIGFubm90YXRpb24uCisgICAgICovCisgICAgcHVibGljIEFubm90YXRpb25WaXNpdG9yIHZpc2l0VHJ5Q2F0Y2hBbm5vdGF0aW9uKGludCB0eXBlUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlUGF0aCB0eXBlUGF0aCwgU3RyaW5nIGRlc2MsIGJvb2xlYW4gdmlzaWJsZSkgeworICAgICAgICBpZiAoYXBpIDwgT3Bjb2Rlcy5BU001KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGlmIChtdiAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbXYudmlzaXRUcnlDYXRjaEFubm90YXRpb24odHlwZVJlZiwgdHlwZVBhdGgsIGRlc2MsIHZpc2libGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZpc2l0cyBhIGxvY2FsIHZhcmlhYmxlIGRlY2xhcmF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUKKyAgICAgKiAgICAgICAgICAgIHRoZSBuYW1lIG9mIGEgbG9jYWwgdmFyaWFibGUuCisgICAgICogQHBhcmFtIGRlc2MKKyAgICAgKiAgICAgICAgICAgIHRoZSB0eXBlIGRlc2NyaXB0b3Igb2YgdGhpcyBsb2NhbCB2YXJpYWJsZS4KKyAgICAgKiBAcGFyYW0gc2lnbmF0dXJlCisgICAgICogICAgICAgICAgICB0aGUgdHlwZSBzaWduYXR1cmUgb2YgdGhpcyBsb2NhbCB2YXJpYWJsZS4gTWF5IGJlCisgICAgICogICAgICAgICAgICA8dHQ+bnVsbDwvdHQ+IGlmIHRoZSBsb2NhbCB2YXJpYWJsZSB0eXBlIGRvZXMgbm90IHVzZSBnZW5lcmljCisgICAgICogICAgICAgICAgICB0eXBlcy4KKyAgICAgKiBAcGFyYW0gc3RhcnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBzY29wZSBvZiB0aGlzIGxvY2FsCisgICAgICogICAgICAgICAgICB2YXJpYWJsZSAoaW5jbHVzaXZlKS4KKyAgICAgKiBAcGFyYW0gZW5kCisgICAgICogICAgICAgICAgICB0aGUgbGFzdCBpbnN0cnVjdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSBzY29wZSBvZiB0aGlzIGxvY2FsCisgICAgICogICAgICAgICAgICB2YXJpYWJsZSAoZXhjbHVzaXZlKS4KKyAgICAgKiBAcGFyYW0gaW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBsb2NhbCB2YXJpYWJsZSdzIGluZGV4LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgaWYgb25lIG9mIHRoZSBsYWJlbHMgaGFzIG5vdCBhbHJlYWR5IGJlZW4gdmlzaXRlZCBieSB0aGlzCisgICAgICogICAgICAgICAgICAgdmlzaXRvciAoYnkgdGhlIHtAbGluayAjdmlzaXRMYWJlbCB2aXNpdExhYmVsfSBtZXRob2QpLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZpc2l0TG9jYWxWYXJpYWJsZShTdHJpbmcgbmFtZSwgU3RyaW5nIGRlc2MsIFN0cmluZyBzaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhYmVsIHN0YXJ0LCBMYWJlbCBlbmQsIGludCBpbmRleCkgeworICAgICAgICBpZiAobXYgIT0gbnVsbCkgeworICAgICAgICAgICAgbXYudmlzaXRMb2NhbFZhcmlhYmxlKG5hbWUsIGRlc2MsIHNpZ25hdHVyZSwgc3RhcnQsIGVuZCwgaW5kZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVmlzaXRzIGFuIGFubm90YXRpb24gb24gYSBsb2NhbCB2YXJpYWJsZSB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGVSZWYKKyAgICAgKiAgICAgICAgICAgIGEgcmVmZXJlbmNlIHRvIHRoZSBhbm5vdGF0ZWQgdHlwZS4gVGhlIHNvcnQgb2YgdGhpcyB0eXBlCisgICAgICogICAgICAgICAgICByZWZlcmVuY2UgbXVzdCBiZSB7QGxpbmsgVHlwZVJlZmVyZW5jZSNMT0NBTF9WQVJJQUJMRQorICAgICAqICAgICAgICAgICAgTE9DQUxfVkFSSUFCTEV9IG9yIHtAbGluayBUeXBlUmVmZXJlbmNlI1JFU09VUkNFX1ZBUklBQkxFCisgICAgICogICAgICAgICAgICBSRVNPVVJDRV9WQVJJQUJMRX0uIFNlZSB7QGxpbmsgVHlwZVJlZmVyZW5jZX0uCisgICAgICogQHBhcmFtIHR5cGVQYXRoCisgICAgICogICAgICAgICAgICB0aGUgcGF0aCB0byB0aGUgYW5ub3RhdGVkIHR5cGUgYXJndW1lbnQsIHdpbGRjYXJkIGJvdW5kLCBhcnJheQorICAgICAqICAgICAgICAgICAgZWxlbWVudCB0eXBlLCBvciBzdGF0aWMgaW5uZXIgdHlwZSB3aXRoaW4gJ3R5cGVSZWYnLiBNYXkgYmUKKyAgICAgKiAgICAgICAgICAgIDx0dD5udWxsPC90dD4gaWYgdGhlIGFubm90YXRpb24gdGFyZ2V0cyAndHlwZVJlZicgYXMgYSB3aG9sZS4KKyAgICAgKiBAcGFyYW0gc3RhcnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaXN0IGluc3RydWN0aW9ucyBjb3JyZXNwb25kaW5nIHRvIHRoZSBjb250aW51b3VzIHJhbmdlcworICAgICAqICAgICAgICAgICAgdGhhdCBtYWtlIHRoZSBzY29wZSBvZiB0aGlzIGxvY2FsIHZhcmlhYmxlIChpbmNsdXNpdmUpLgorICAgICAqIEBwYXJhbSBlbmQKKyAgICAgKiAgICAgICAgICAgIHRoZSBsYXN0IGluc3RydWN0aW9ucyBjb3JyZXNwb25kaW5nIHRvIHRoZSBjb250aW51b3VzIHJhbmdlcworICAgICAqICAgICAgICAgICAgdGhhdCBtYWtlIHRoZSBzY29wZSBvZiB0aGlzIGxvY2FsIHZhcmlhYmxlIChleGNsdXNpdmUpLiBUaGlzCisgICAgICogICAgICAgICAgICBhcnJheSBtdXN0IGhhdmUgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgJ3N0YXJ0JyBhcnJheS4KKyAgICAgKiBAcGFyYW0gaW5kZXgKKyAgICAgKiAgICAgICAgICAgIHRoZSBsb2NhbCB2YXJpYWJsZSdzIGluZGV4IGluIGVhY2ggcmFuZ2UuIFRoaXMgYXJyYXkgbXVzdCBoYXZlCisgICAgICogICAgICAgICAgICB0aGUgc2FtZSBzaXplIGFzIHRoZSAnc3RhcnQnIGFycmF5LgorICAgICAqIEBwYXJhbSBkZXNjCisgICAgICogICAgICAgICAgICB0aGUgY2xhc3MgZGVzY3JpcHRvciBvZiB0aGUgYW5ub3RhdGlvbiBjbGFzcy4KKyAgICAgKiBAcGFyYW0gdmlzaWJsZQorICAgICAqICAgICAgICAgICAgPHR0PnRydWU8L3R0PiBpZiB0aGUgYW5ub3RhdGlvbiBpcyB2aXNpYmxlIGF0IHJ1bnRpbWUuCisgICAgICogQHJldHVybiBhIHZpc2l0b3IgdG8gdmlzaXQgdGhlIGFubm90YXRpb24gdmFsdWVzLCBvciA8dHQ+bnVsbDwvdHQ+IGlmCisgICAgICogICAgICAgICB0aGlzIHZpc2l0b3IgaXMgbm90IGludGVyZXN0ZWQgaW4gdmlzaXRpbmcgdGhpcyBhbm5vdGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBBbm5vdGF0aW9uVmlzaXRvciB2aXNpdExvY2FsVmFyaWFibGVBbm5vdGF0aW9uKGludCB0eXBlUmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVQYXRoIHR5cGVQYXRoLCBMYWJlbFtdIHN0YXJ0LCBMYWJlbFtdIGVuZCwgaW50W10gaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRlc2MsIGJvb2xlYW4gdmlzaWJsZSkgeworICAgICAgICBpZiAoYXBpIDwgT3Bjb2Rlcy5BU001KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIGlmIChtdiAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbXYudmlzaXRMb2NhbFZhcmlhYmxlQW5ub3RhdGlvbih0eXBlUmVmLCB0eXBlUGF0aCwgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgIGVuZCwgaW5kZXgsIGRlc2MsIHZpc2libGUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZpc2l0cyBhIGxpbmUgbnVtYmVyIGRlY2xhcmF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGxpbmUKKyAgICAgKiAgICAgICAgICAgIGEgbGluZSBudW1iZXIuIFRoaXMgbnVtYmVyIHJlZmVycyB0byB0aGUgc291cmNlIGZpbGUgZnJvbQorICAgICAqICAgICAgICAgICAgd2hpY2ggdGhlIGNsYXNzIHdhcyBjb21waWxlZC4KKyAgICAgKiBAcGFyYW0gc3RhcnQKKyAgICAgKiAgICAgICAgICAgIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoaXMgbGluZSBudW1iZXIuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgKiAgICAgICAgICAgICBpZiA8dHQ+c3RhcnQ8L3R0PiBoYXMgbm90IGFscmVhZHkgYmVlbiB2aXNpdGVkIGJ5IHRoaXMKKyAgICAgKiAgICAgICAgICAgICB2aXNpdG9yIChieSB0aGUge0BsaW5rICN2aXNpdExhYmVsIHZpc2l0TGFiZWx9IG1ldGhvZCkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmlzaXRMaW5lTnVtYmVyKGludCBsaW5lLCBMYWJlbCBzdGFydCkgeworICAgICAgICBpZiAobXYgIT0gbnVsbCkgeworICAgICAgICAgICAgbXYudmlzaXRMaW5lTnVtYmVyKGxpbmUsIHN0YXJ0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFZpc2l0cyB0aGUgbWF4aW11bSBzdGFjayBzaXplIGFuZCB0aGUgbWF4aW11bSBudW1iZXIgb2YgbG9jYWwgdmFyaWFibGVzCisgICAgICogb2YgdGhlIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXhTdGFjaworICAgICAqICAgICAgICAgICAgbWF4aW11bSBzdGFjayBzaXplIG9mIHRoZSBtZXRob2QuCisgICAgICogQHBhcmFtIG1heExvY2FscworICAgICAqICAgICAgICAgICAgbWF4aW11bSBudW1iZXIgb2YgbG9jYWwgdmFyaWFibGVzIGZvciB0aGUgbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZpc2l0TWF4cyhpbnQgbWF4U3RhY2ssIGludCBtYXhMb2NhbHMpIHsKKyAgICAgICAgaWYgKG12ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG12LnZpc2l0TWF4cyhtYXhTdGFjaywgbWF4TG9jYWxzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFZpc2l0cyB0aGUgZW5kIG9mIHRoZSBtZXRob2QuIFRoaXMgbWV0aG9kLCB3aGljaCBpcyB0aGUgbGFzdCBvbmUgdG8gYmUKKyAgICAgKiBjYWxsZWQsIGlzIHVzZWQgdG8gaW5mb3JtIHRoZSB2aXNpdG9yIHRoYXQgYWxsIHRoZSBhbm5vdGF0aW9ucyBhbmQKKyAgICAgKiBhdHRyaWJ1dGVzIG9mIHRoZSBtZXRob2QgaGF2ZSBiZWVuIHZpc2l0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdmlzaXRFbmQoKSB7CisgICAgICAgIGlmIChtdiAhPSBudWxsKSB7CisgICAgICAgICAgICBtdi52aXNpdEVuZCgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9qZXJzZXkvcmVwYWNrYWdlZC9vcmcvb2JqZWN0d2ViL2FzbS9NZXRob2RXcml0ZXIuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvamVyc2V5L3JlcGFja2FnZWQvb3JnL29iamVjdHdlYi9hc20vTWV0aG9kV3JpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZhOTdhMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvamVyc2V5L3JlcGFja2FnZWQvb3JnL29iamVjdHdlYi9hc20vTWV0aG9kV3JpdGVyLmphdmEKQEAgLTAsMCArMSwyOTE1IEBACisvKioqCisgKiBBU006IGEgdmVyeSBzbWFsbCBhbmQgZmFzdCBKYXZhIGJ5dGVjb2RlIG1hbmlwdWxhdGlvbiBmcmFtZXdvcmsKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDExIElOUklBLCBGcmFuY2UgVGVsZWNvbQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIGplcnNleS5yZXBhY2thZ2VkLm9yZy5vYmplY3R3ZWIuYXNtOworCisvKioKKyAqIEEge0BsaW5rIE1ldGhvZFZpc2l0b3J9IHRoYXQgZ2VuZXJhdGVzIG1ldGhvZHMgaW4gYnl0ZWNvZGUgZm9ybS4gRWFjaCB2aXNpdAorICogbWV0aG9kIG9mIHRoaXMgY2xhc3MgYXBwZW5kcyB0aGUgYnl0ZWNvZGUgY29ycmVzcG9uZGluZyB0byB0aGUgdmlzaXRlZAorICogaW5zdHJ1Y3Rpb24gdG8gYSBieXRlIHZlY3RvciwgaW4gdGhlIG9yZGVyIHRoZXNlIG1ldGhvZHMgYXJlIGNhbGxlZC4KKyAqCisgKiBAYXV0aG9yIEVyaWMgQnJ1bmV0b24KKyAqIEBhdXRob3IgRXVnZW5lIEt1bGVzaG92CisgKi8KK2NsYXNzIE1ldGhvZFdyaXRlciBleHRlbmRzIE1ldGhvZFZpc2l0b3IgeworCisgICAgLyoqCisgICAgICogUHNldWRvIGFjY2VzcyBmbGFnIHVzZWQgdG8gZGVub3RlIGNvbnN0cnVjdG9ycy4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IEFDQ19DT05TVFJVQ1RPUiA9IDB4ODAwMDA7CisKKyAgICAvKioKKyAgICAgKiBGcmFtZSBoYXMgZXhhY3RseSB0aGUgc2FtZSBsb2NhbHMgYXMgdGhlIHByZXZpb3VzIHN0YWNrIG1hcCBmcmFtZSBhbmQKKyAgICAgKiBudW1iZXIgb2Ygc3RhY2sgaXRlbXMgaXMgemVyby4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IFNBTUVfRlJBTUUgPSAwOyAvLyB0byA2MyAoMC0zZikKKworICAgIC8qKgorICAgICAqIEZyYW1lIGhhcyBleGFjdGx5IHRoZSBzYW1lIGxvY2FscyBhcyB0aGUgcHJldmlvdXMgc3RhY2sgbWFwIGZyYW1lIGFuZAorICAgICAqIG51bWJlciBvZiBzdGFjayBpdGVtcyBpcyAxCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBTQU1FX0xPQ0FMU18xX1NUQUNLX0lURU1fRlJBTUUgPSA2NDsgLy8gdG8gMTI3ICg0MC03ZikKKworICAgIC8qKgorICAgICAqIFJlc2VydmVkIGZvciBmdXR1cmUgdXNlCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBSRVNFUlZFRCA9IDEyODsKKworICAgIC8qKgorICAgICAqIEZyYW1lIGhhcyBleGFjdGx5IHRoZSBzYW1lIGxvY2FscyBhcyB0aGUgcHJldmlvdXMgc3RhY2sgbWFwIGZyYW1lIGFuZAorICAgICAqIG51bWJlciBvZiBzdGFjayBpdGVtcyBpcyAxLiBPZmZzZXQgaXMgYmlnZ2VyIHRoZW4gNjM7CisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBTQU1FX0xPQ0FMU18xX1NUQUNLX0lURU1fRlJBTUVfRVhURU5ERUQgPSAyNDc7IC8vIGY3CisKKyAgICAvKioKKyAgICAgKiBGcmFtZSB3aGVyZSBjdXJyZW50IGxvY2FscyBhcmUgdGhlIHNhbWUgYXMgdGhlIGxvY2FscyBpbiB0aGUgcHJldmlvdXMKKyAgICAgKiBmcmFtZSwgZXhjZXB0IHRoYXQgdGhlIGsgbGFzdCBsb2NhbHMgYXJlIGFic2VudC4gVGhlIHZhbHVlIG9mIGsgaXMgZ2l2ZW4KKyAgICAgKiBieSB0aGUgZm9ybXVsYSAyNTEtZnJhbWVfdHlwZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IENIT1BfRlJBTUUgPSAyNDg7IC8vIHRvIDI1MCAoZjgtZkEpCisKKyAgICAvKioKKyAgICAgKiBGcmFtZSBoYXMgZXhhY3RseSB0aGUgc2FtZSBsb2NhbHMgYXMgdGhlIHByZXZpb3VzIHN0YWNrIG1hcCBmcmFtZSBhbmQKKyAgICAgKiBudW1iZXIgb2Ygc3RhY2sgaXRlbXMgaXMgemVyby4gT2Zmc2V0IGlzIGJpZ2dlciB0aGVuIDYzOworICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgU0FNRV9GUkFNRV9FWFRFTkRFRCA9IDI1MTsgLy8gZmIKKworICAgIC8qKgorICAgICAqIEZyYW1lIHdoZXJlIGN1cnJlbnQgbG9jYWxzIGFyZSB0aGUgc2FtZSBhcyB0aGUgbG9jYWxzIGluIHRoZSBwcmV2aW91cworICAgICAqIGZyYW1lLCBleGNlcHQgdGhhdCBrIGFkZGl0aW9uYWwgbG9jYWxzIGFyZSBkZWZpbmVkLiBUaGUgdmFsdWUgb2YgayBpcworICAgICAqIGdpdmVuIGJ5IHRoZSBmb3JtdWxhIGZyYW1lX3R5cGUtMjUxLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBpbnQgQVBQRU5EX0ZSQU1FID0gMjUyOyAvLyB0byAyNTQgLy8gZmMtZmUKKworICAgIC8qKgorICAgICAqIEZ1bGwgZnJhbWUKKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgaW50IEZVTExfRlJBTUUgPSAyNTU7IC8vIGZmCisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgc3RhY2sgbWFwIGZyYW1lcyBtdXN0IGJlIHJlY29tcHV0ZWQgZnJvbSBzY3JhdGNoLiBJbgorICAgICAqIHRoaXMgY2FzZSB0aGUgbWF4aW11bSBzdGFjayBzaXplIGFuZCBudW1iZXIgb2YgbG9jYWwgdmFyaWFibGVzIGlzIGFsc28KKyAgICAgKiByZWNvbXB1dGVkIGZyb20gc2NyYXRjaC4KKyAgICAgKgorICAgICAqIEBzZWUgI2NvbXB1dGUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRlJBTUVTID0gMDsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBtYXhpbXVtIHN0YWNrIHNpemUgYW5kIG51bWJlciBvZiBsb2NhbCB2YXJpYWJsZXMgbXVzdAorICAgICAqIGJlIGF1dG9tYXRpY2FsbHkgY29tcHV0ZWQuCisgICAgICoKKyAgICAgKiBAc2VlICNjb21wdXRlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWFMgPSAxOworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHRoYXQgbm90aGluZyBtdXN0IGJlIGF1dG9tYXRpY2FsbHkgY29tcHV0ZWQuCisgICAgICoKKyAgICAgKiBAc2VlICNjb21wdXRlCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PVEhJTkcgPSAyOworCisgICAgLyoqCisgICAgICogVGhlIGNsYXNzIHdyaXRlciB0byB3aGljaCB0aGlzIG1ldGhvZCBtdXN0IGJlIGFkZGVkLgorICAgICAqLworICAgIGZpbmFsIENsYXNzV3JpdGVyIGN3OworCisgICAgLyoqCisgICAgICogQWNjZXNzIGZsYWdzIG9mIHRoaXMgbWV0aG9kLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGFjY2VzczsKKworICAgIC8qKgorICAgICAqIFRoZSBpbmRleCBvZiB0aGUgY29uc3RhbnQgcG9vbCBpdGVtIHRoYXQgY29udGFpbnMgdGhlIG5hbWUgb2YgdGhpcworICAgICAqIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGludCBuYW1lOworCisgICAgLyoqCisgICAgICogVGhlIGluZGV4IG9mIHRoZSBjb25zdGFudCBwb29sIGl0ZW0gdGhhdCBjb250YWlucyB0aGUgZGVzY3JpcHRvciBvZiB0aGlzCisgICAgICogbWV0aG9kLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgaW50IGRlc2M7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVzY3JpcHRvciBvZiB0aGlzIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBkZXNjcmlwdG9yOworCisgICAgLyoqCisgICAgICogVGhlIHNpZ25hdHVyZSBvZiB0aGlzIG1ldGhvZC4KKyAgICAgKi8KKyAgICBTdHJpbmcgc2lnbmF0dXJlOworCisgICAgLyoqCisgICAgICogSWYgbm90IHplcm8sIGluZGljYXRlcyB0aGF0IHRoZSBjb2RlIG9mIHRoaXMgbWV0aG9kIG11c3QgYmUgY29waWVkIGZyb20KKyAgICAgKiB0aGUgQ2xhc3NSZWFkZXIgYXNzb2NpYXRlZCB0byB0aGlzIHdyaXRlciBpbiA8Y29kZT5jdy5jcjwvY29kZT4uIE1vcmUKKyAgICAgKiBwcmVjaXNlbHksIHRoaXMgZmllbGQgZ2l2ZXMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBieXRlIHRvIGNvcGllZCBmcm9tCisgICAgICogPGNvZGU+Y3cuY3IuYjwvY29kZT4uCisgICAgICovCisgICAgaW50IGNsYXNzUmVhZGVyT2Zmc2V0OworCisgICAgLyoqCisgICAgICogSWYgbm90IHplcm8sIGluZGljYXRlcyB0aGF0IHRoZSBjb2RlIG9mIHRoaXMgbWV0aG9kIG11c3QgYmUgY29waWVkIGZyb20KKyAgICAgKiB0aGUgQ2xhc3NSZWFkZXIgYXNzb2NpYXRlZCB0byB0aGlzIHdyaXRlciBpbiA8Y29kZT5jdy5jcjwvY29kZT4uIE1vcmUKKyAgICAgKiBwcmVjaXNlbHksIHRoaXMgZmllbGQgZ2l2ZXMgdGhlIG51bWJlciBvZiBieXRlcyB0byBjb3BpZWQgZnJvbQorICAgICAqIDxjb2RlPmN3LmNyLmI8L2NvZGU+LgorICAgICAqLworICAgIGludCBjbGFzc1JlYWRlckxlbmd0aDsKKworICAgIC8qKgorICAgICAqIE51bWJlciBvZiBleGNlcHRpb25zIHRoYXQgY2FuIGJlIHRocm93biBieSB0aGlzIG1ldGhvZC4KKyAgICAgKi8KKyAgICBpbnQgZXhjZXB0aW9uQ291bnQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZXhjZXB0aW9ucyB0aGF0IGNhbiBiZSB0aHJvd24gYnkgdGhpcyBtZXRob2QuIE1vcmUgcHJlY2lzZWx5LCB0aGlzCisgICAgICogYXJyYXkgY29udGFpbnMgdGhlIGluZGV4ZXMgb2YgdGhlIGNvbnN0YW50IHBvb2wgaXRlbXMgdGhhdCBjb250YWluIHRoZQorICAgICAqIGludGVybmFsIG5hbWVzIG9mIHRoZXNlIGV4Y2VwdGlvbiBjbGFzc2VzLgorICAgICAqLworICAgIGludFtdIGV4Y2VwdGlvbnM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgYW5ub3RhdGlvbiBkZWZhdWx0IGF0dHJpYnV0ZSBvZiB0aGlzIG1ldGhvZC4gTWF5IGJlIDx0dD5udWxsPC90dD4uCisgICAgICovCisgICAgcHJpdmF0ZSBCeXRlVmVjdG9yIGFubmQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcnVudGltZSB2aXNpYmxlIGFubm90YXRpb25zIG9mIHRoaXMgbWV0aG9kLiBNYXkgYmUgPHR0Pm51bGw8L3R0Pi4KKyAgICAgKi8KKyAgICBwcml2YXRlIEFubm90YXRpb25Xcml0ZXIgYW5uczsKKworICAgIC8qKgorICAgICAqIFRoZSBydW50aW1lIGludmlzaWJsZSBhbm5vdGF0aW9ucyBvZiB0aGlzIG1ldGhvZC4gTWF5IGJlIDx0dD5udWxsPC90dD4uCisgICAgICovCisgICAgcHJpdmF0ZSBBbm5vdGF0aW9uV3JpdGVyIGlhbm5zOworCisgICAgLyoqCisgICAgICogVGhlIHJ1bnRpbWUgdmlzaWJsZSB0eXBlIGFubm90YXRpb25zIG9mIHRoaXMgbWV0aG9kLiBNYXkgYmUgPHR0Pm51bGw8L3R0PgorICAgICAqIC4KKyAgICAgKi8KKyAgICBwcml2YXRlIEFubm90YXRpb25Xcml0ZXIgdGFubnM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcnVudGltZSBpbnZpc2libGUgdHlwZSBhbm5vdGF0aW9ucyBvZiB0aGlzIG1ldGhvZC4gTWF5IGJlCisgICAgICogPHR0Pm51bGw8L3R0Pi4KKyAgICAgKi8KKyAgICBwcml2YXRlIEFubm90YXRpb25Xcml0ZXIgaXRhbm5zOworCisgICAgLyoqCisgICAgICogVGhlIHJ1bnRpbWUgdmlzaWJsZSBwYXJhbWV0ZXIgYW5ub3RhdGlvbnMgb2YgdGhpcyBtZXRob2QuIE1heSBiZQorICAgICAqIDx0dD5udWxsPC90dD4uCisgICAgICovCisgICAgcHJpdmF0ZSBBbm5vdGF0aW9uV3JpdGVyW10gcGFubnM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcnVudGltZSBpbnZpc2libGUgcGFyYW1ldGVyIGFubm90YXRpb25zIG9mIHRoaXMgbWV0aG9kLiBNYXkgYmUKKyAgICAgKiA8dHQ+bnVsbDwvdHQ+LgorICAgICAqLworICAgIHByaXZhdGUgQW5ub3RhdGlvbldyaXRlcltdIGlwYW5uczsKKworICAgIC8qKgorICAgICAqIFRoZSBudW1iZXIgb2Ygc3ludGhldGljIHBhcmFtZXRlcnMgb2YgdGhpcyBtZXRob2QuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgc3ludGhldGljczsKKworICAgIC8qKgorICAgICAqIFRoZSBub24gc3RhbmRhcmQgYXR0cmlidXRlcyBvZiB0aGUgbWV0aG9kLgorICAgICAqLworICAgIHByaXZhdGUgQXR0cmlidXRlIGF0dHJzOworCisgICAgLyoqCisgICAgICogVGhlIGJ5dGVjb2RlIG9mIHRoaXMgbWV0aG9kLgorICAgICAqLworICAgIHByaXZhdGUgQnl0ZVZlY3RvciBjb2RlID0gbmV3IEJ5dGVWZWN0b3IoKTsKKworICAgIC8qKgorICAgICAqIE1heGltdW0gc3RhY2sgc2l6ZSBvZiB0aGlzIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBtYXhTdGFjazsKKworICAgIC8qKgorICAgICAqIE1heGltdW0gbnVtYmVyIG9mIGxvY2FsIHZhcmlhYmxlcyBmb3IgdGhpcyBtZXRob2QuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgbWF4TG9jYWxzOworCisgICAgLyoqCisgICAgICogTnVtYmVyIG9mIGxvY2FsIHZhcmlhYmxlcyBpbiB0aGUgY3VycmVudCBzdGFjayBtYXAgZnJhbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgY3VycmVudExvY2FsczsKKworICAgIC8qKgorICAgICAqIE51bWJlciBvZiBzdGFjayBtYXAgZnJhbWVzIGluIHRoZSBTdGFja01hcFRhYmxlIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBmcmFtZUNvdW50OworCisgICAgLyoqCisgICAgICogVGhlIFN0YWNrTWFwVGFibGUgYXR0cmlidXRlLgorICAgICAqLworICAgIHByaXZhdGUgQnl0ZVZlY3RvciBzdGFja01hcDsKKworICAgIC8qKgorICAgICAqIFRoZSBvZmZzZXQgb2YgdGhlIGxhc3QgZnJhbWUgdGhhdCB3YXMgd3JpdHRlbiBpbiB0aGUgU3RhY2tNYXBUYWJsZQorICAgICAqIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBwcmV2aW91c0ZyYW1lT2Zmc2V0OworCisgICAgLyoqCisgICAgICogVGhlIGxhc3QgZnJhbWUgdGhhdCB3YXMgd3JpdHRlbiBpbiB0aGUgU3RhY2tNYXBUYWJsZSBhdHRyaWJ1dGUuCisgICAgICoKKyAgICAgKiBAc2VlICNmcmFtZQorICAgICAqLworICAgIHByaXZhdGUgaW50W10gcHJldmlvdXNGcmFtZTsKKworICAgIC8qKgorICAgICAqIFRoZSBjdXJyZW50IHN0YWNrIG1hcCBmcmFtZS4gVGhlIGZpcnN0IGVsZW1lbnQgY29udGFpbnMgdGhlIG9mZnNldCBvZiB0aGUKKyAgICAgKiBpbnN0cnVjdGlvbiB0byB3aGljaCB0aGUgZnJhbWUgY29ycmVzcG9uZHMsIHRoZSBzZWNvbmQgZWxlbWVudCBpcyB0aGUKKyAgICAgKiBudW1iZXIgb2YgbG9jYWxzIGFuZCB0aGUgdGhpcmQgb25lIGlzIHRoZSBudW1iZXIgb2Ygc3RhY2sgZWxlbWVudHMuIFRoZQorICAgICAqIGxvY2FsIHZhcmlhYmxlcyBzdGFydCBhdCBpbmRleCAzIGFuZCBhcmUgZm9sbG93ZWQgYnkgdGhlIG9wZXJhbmQgc3RhY2sKKyAgICAgKiB2YWx1ZXMuIEluIHN1bW1hcnkgZnJhbWVbMF0gPSBvZmZzZXQsIGZyYW1lWzFdID0gbkxvY2FsLCBmcmFtZVsyXSA9CisgICAgICogblN0YWNrLCBmcmFtZVszXSA9IG5Mb2NhbC4gQWxsIHR5cGVzIGFyZSBlbmNvZGVkIGFzIGludGVnZXJzLCB3aXRoIHRoZQorICAgICAqIHNhbWUgZm9ybWF0IGFzIHRoZSBvbmUgdXNlZCBpbiB7QGxpbmsgTGFiZWx9LCBidXQgbGltaXRlZCB0byBCQVNFIHR5cGVzLgorICAgICAqLworICAgIHByaXZhdGUgaW50W10gZnJhbWU7CisKKyAgICAvKioKKyAgICAgKiBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGV4Y2VwdGlvbiBoYW5kbGVyIGxpc3QuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgaGFuZGxlckNvdW50OworCisgICAgLyoqCisgICAgICogVGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGV4Y2VwdGlvbiBoYW5kbGVyIGxpc3QuCisgICAgICovCisgICAgcHJpdmF0ZSBIYW5kbGVyIGZpcnN0SGFuZGxlcjsKKworICAgIC8qKgorICAgICAqIFRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlIGV4Y2VwdGlvbiBoYW5kbGVyIGxpc3QuCisgICAgICovCisgICAgcHJpdmF0ZSBIYW5kbGVyIGxhc3RIYW5kbGVyOworCisgICAgLyoqCisgICAgICogTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIE1ldGhvZFBhcmFtZXRlcnMgYXR0cmlidXRlLgorICAgICAqLworICAgIHByaXZhdGUgaW50IG1ldGhvZFBhcmFtZXRlcnNDb3VudDsKKworICAgIC8qKgorICAgICAqIFRoZSBNZXRob2RQYXJhbWV0ZXJzIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIEJ5dGVWZWN0b3IgbWV0aG9kUGFyYW1ldGVyczsKKworICAgIC8qKgorICAgICAqIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBMb2NhbFZhcmlhYmxlVGFibGUgYXR0cmlidXRlLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGxvY2FsVmFyQ291bnQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgTG9jYWxWYXJpYWJsZVRhYmxlIGF0dHJpYnV0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIEJ5dGVWZWN0b3IgbG9jYWxWYXI7CisKKyAgICAvKioKKyAgICAgKiBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgTG9jYWxWYXJpYWJsZVR5cGVUYWJsZSBhdHRyaWJ1dGUuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgbG9jYWxWYXJUeXBlQ291bnQ7CisKKyAgICAvKioKKyAgICAgKiBUaGUgTG9jYWxWYXJpYWJsZVR5cGVUYWJsZSBhdHRyaWJ1dGUuCisgICAgICovCisgICAgcHJpdmF0ZSBCeXRlVmVjdG9yIGxvY2FsVmFyVHlwZTsKKworICAgIC8qKgorICAgICAqIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBMaW5lTnVtYmVyVGFibGUgYXR0cmlidXRlLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGxpbmVOdW1iZXJDb3VudDsKKworICAgIC8qKgorICAgICAqIFRoZSBMaW5lTnVtYmVyVGFibGUgYXR0cmlidXRlLgorICAgICAqLworICAgIHByaXZhdGUgQnl0ZVZlY3RvciBsaW5lTnVtYmVyOworCisgICAgLyoqCisgICAgICogVGhlIHN0YXJ0IG9mZnNldCBvZiB0aGUgbGFzdCB2aXNpdGVkIGluc3RydWN0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGxhc3RDb2RlT2Zmc2V0OworCisgICAgLyoqCisgICAgICogVGhlIHJ1bnRpbWUgdmlzaWJsZSB0eXBlIGFubm90YXRpb25zIG9mIHRoZSBjb2RlLiBNYXkgYmUgPHR0Pm51bGw8L3R0Pi4KKyAgICAgKi8KKyAgICBwcml2YXRlIEFubm90YXRpb25Xcml0ZXIgY3Rhbm5zOworCisgICAgLyoqCisgICAgICogVGhlIHJ1bnRpbWUgaW52aXNpYmxlIHR5cGUgYW5ub3RhdGlvbnMgb2YgdGhlIGNvZGUuIE1heSBiZSA8dHQ+bnVsbDwvdHQ+LgorICAgICAqLworICAgIHByaXZhdGUgQW5ub3RhdGlvbldyaXRlciBpY3Rhbm5zOworCisgICAgLyoqCisgICAgICogVGhlIG5vbiBzdGFuZGFyZCBhdHRyaWJ1dGVzIG9mIHRoZSBtZXRob2QncyBjb2RlLgorICAgICAqLworICAgIHByaXZhdGUgQXR0cmlidXRlIGNhdHRyczsKKworICAgIC8qKgorICAgICAqIEluZGljYXRlcyBpZiBzb21lIGp1bXAgaW5zdHJ1Y3Rpb25zIGFyZSB0b28gc21hbGwgYW5kIG5lZWQgdG8gYmUgcmVzaXplZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gcmVzaXplOworCisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiBzdWJyb3V0aW5lcyBpbiB0aGlzIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBzdWJyb3V0aW5lczsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoKKyAgICAgKiBGaWVsZHMgZm9yIHRoZSBjb250cm9sIGZsb3cgZ3JhcGggYW5hbHlzaXMgYWxnb3JpdGhtICh1c2VkIHRvIGNvbXB1dGUgdGhlCisgICAgICogbWF4aW11bSBzdGFjayBzaXplKS4gQSBjb250cm9sIGZsb3cgZ3JhcGggY29udGFpbnMgb25lIG5vZGUgcGVyICJiYXNpYworICAgICAqIGJsb2NrIiwgYW5kIG9uZSBlZGdlIHBlciAianVtcCIgZnJvbSBvbmUgYmFzaWMgYmxvY2sgdG8gYW5vdGhlci4gRWFjaAorICAgICAqIG5vZGUgKGkuZS4sIGVhY2ggYmFzaWMgYmxvY2spIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBMYWJlbCBvYmplY3QgdGhhdAorICAgICAqIGNvcnJlc3BvbmRzIHRvIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBvZiB0aGlzIGJhc2ljIGJsb2NrLiBFYWNoIG5vZGUgYWxzbworICAgICAqIHN0b3JlcyB0aGUgbGlzdCBvZiBpdHMgc3VjY2Vzc29ycyBpbiB0aGUgZ3JhcGgsIGFzIGEgbGlua2VkIGxpc3Qgb2YgRWRnZQorICAgICAqIG9iamVjdHMuCisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hhdCBtdXN0IGJlIGF1dG9tYXRpY2FsbHkgY29tcHV0ZWQuCisgICAgICoKKyAgICAgKiBAc2VlICNGUkFNRVMKKyAgICAgKiBAc2VlICNNQVhTCisgICAgICogQHNlZSAjTk9USElORworICAgICAqLworICAgIHByaXZhdGUgZmluYWwgaW50IGNvbXB1dGU7CisKKyAgICAvKioKKyAgICAgKiBBIGxpc3Qgb2YgbGFiZWxzLiBUaGlzIGxpc3QgaXMgdGhlIGxpc3Qgb2YgYmFzaWMgYmxvY2tzIGluIHRoZSBtZXRob2QsCisgICAgICogaS5lLiBhIGxpc3Qgb2YgTGFiZWwgb2JqZWN0cyBsaW5rZWQgdG8gZWFjaCBvdGhlciBieSB0aGVpcgorICAgICAqIHtAbGluayBMYWJlbCNzdWNjZXNzb3J9IGZpZWxkLCBpbiB0aGUgb3JkZXIgdGhleSBhcmUgdmlzaXRlZCBieQorICAgICAqIHtAbGluayBNZXRob2RWaXNpdG9yI3Zpc2l0TGFiZWx9LCBhbmQgc3RhcnRpbmcgd2l0aCB0aGUgZmlyc3QgYmFzaWMKKyAgICAgKiBibG9jay4KKyAgICAgKi8KKyAgICBwcml2YXRlIExhYmVsIGxhYmVsczsKKworICAgIC8qKgorICAgICAqIFRoZSBwcmV2aW91cyBiYXNpYyBibG9jay4KKyAgICAgKi8KKyAgICBwcml2YXRlIExhYmVsIHByZXZpb3VzQmxvY2s7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY3VycmVudCBiYXNpYyBibG9jay4KKyAgICAgKi8KKyAgICBwcml2YXRlIExhYmVsIGN1cnJlbnRCbG9jazsKKworICAgIC8qKgorICAgICAqIFRoZSAocmVsYXRpdmUpIHN0YWNrIHNpemUgYWZ0ZXIgdGhlIGxhc3QgdmlzaXRlZCBpbnN0cnVjdGlvbi4gVGhpcyBzaXplCisgICAgICogaXMgcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgY3VycmVudCBiYXNpYyBibG9jaywgaS5lLiwgdGhlIHRydWUKKyAgICAgKiBzdGFjayBzaXplIGFmdGVyIHRoZSBsYXN0IHZpc2l0ZWQgaW5zdHJ1Y3Rpb24gaXMgZXF1YWwgdG8gdGhlCisgICAgICoge0BsaW5rIExhYmVsI2lucHV0U3RhY2tUb3AgYmVnaW5TdGFja1NpemV9IG9mIHRoZSBjdXJyZW50IGJhc2ljIGJsb2NrCisgICAgICogcGx1cyA8dHQ+c3RhY2tTaXplPC90dD4uCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgc3RhY2tTaXplOworCisgICAgLyoqCisgICAgICogVGhlIChyZWxhdGl2ZSkgbWF4aW11bSBzdGFjayBzaXplIGFmdGVyIHRoZSBsYXN0IHZpc2l0ZWQgaW5zdHJ1Y3Rpb24uCisgICAgICogVGhpcyBzaXplIGlzIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGN1cnJlbnQgYmFzaWMgYmxvY2ssIGkuZS4sCisgICAgICogdGhlIHRydWUgbWF4aW11bSBzdGFjayBzaXplIGFmdGVyIHRoZSBsYXN0IHZpc2l0ZWQgaW5zdHJ1Y3Rpb24gaXMgZXF1YWwKKyAgICAgKiB0byB0aGUge0BsaW5rIExhYmVsI2lucHV0U3RhY2tUb3AgYmVnaW5TdGFja1NpemV9IG9mIHRoZSBjdXJyZW50IGJhc2ljCisgICAgICogYmxvY2sgcGx1cyA8dHQ+c3RhY2tTaXplPC90dD4uCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgbWF4U3RhY2tTaXplOworCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gQ29uc3RydWN0b3IKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0BsaW5rIE1ldGhvZFdyaXRlcn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3cKKyAgICAgKiAgICAgICAgICAgIHRoZSBjbGFzcyB3cml0ZXIgaW4gd2hpY2ggdGhlIG1ldGhvZCBtdXN0IGJlIGFkZGVkLgorICAgICAqIEBwYXJhbSBhY2Nlc3MKKyAgICAgKiAgICAgICAgICAgIHRoZSBtZXRob2QncyBhY2Nlc3MgZmxhZ3MgKHNlZSB7QGxpbmsgT3Bjb2Rlc30pLgorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICogICAgICAgICAgICB0aGUgbWV0aG9kJ3MgbmFtZS4KKyAgICAgKiBAcGFyYW0gZGVzYworICAgICAqICAgICAgICAgICAgdGhlIG1ldGhvZCdzIGRlc2NyaXB0b3IgKHNlZSB7QGxpbmsgVHlwZX0pLgorICAgICAqIEBwYXJhbSBzaWduYXR1cmUKKyAgICAgKiAgICAgICAgICAgIHRoZSBtZXRob2QncyBzaWduYXR1cmUuIE1heSBiZSA8dHQ+bnVsbDwvdHQ+LgorICAgICAqIEBwYXJhbSBleGNlcHRpb25zCisgICAgICogICAgICAgICAgICB0aGUgaW50ZXJuYWwgbmFtZXMgb2YgdGhlIG1ldGhvZCdzIGV4Y2VwdGlvbnMuIE1heSBiZQorICAgICAqICAgICAgICAgICAgPHR0Pm51bGw8L3R0Pi4KKyAgICAgKiBAcGFyYW0gY29tcHV0ZU1heHMKKyAgICAgKiAgICAgICAgICAgIDx0dD50cnVlPC90dD4gaWYgdGhlIG1heGltdW0gc3RhY2sgc2l6ZSBhbmQgbnVtYmVyIG9mIGxvY2FsCisgICAgICogICAgICAgICAgICB2YXJpYWJsZXMgbXVzdCBiZSBhdXRvbWF0aWNhbGx5IGNvbXB1dGVkLgorICAgICAqIEBwYXJhbSBjb21wdXRlRnJhbWVzCisgICAgICogICAgICAgICAgICA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoZSBzdGFjayBtYXAgdGFibGVzIG11c3QgYmUgcmVjb21wdXRlZCBmcm9tCisgICAgICogICAgICAgICAgICBzY3JhdGNoLgorICAgICAqLworICAgIE1ldGhvZFdyaXRlcihmaW5hbCBDbGFzc1dyaXRlciBjdywgZmluYWwgaW50IGFjY2VzcywgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBkZXNjLCBmaW5hbCBTdHJpbmcgc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBleGNlcHRpb25zLCBmaW5hbCBib29sZWFuIGNvbXB1dGVNYXhzLAorICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGNvbXB1dGVGcmFtZXMpIHsKKyAgICAgICAgc3VwZXIoT3Bjb2Rlcy5BU001KTsKKyAgICAgICAgaWYgKGN3LmZpcnN0TWV0aG9kID09IG51bGwpIHsKKyAgICAgICAgICAgIGN3LmZpcnN0TWV0aG9kID0gdGhpczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGN3Lmxhc3RNZXRob2QubXYgPSB0aGlzOworICAgICAgICB9CisgICAgICAgIGN3Lmxhc3RNZXRob2QgPSB0aGlzOworICAgICAgICB0aGlzLmN3ID0gY3c7CisgICAgICAgIHRoaXMuYWNjZXNzID0gYWNjZXNzOworICAgICAgICBpZiAoIjxpbml0PiIuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICB0aGlzLmFjY2VzcyB8PSBBQ0NfQ09OU1RSVUNUT1I7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5uYW1lID0gY3cubmV3VVRGOChuYW1lKTsKKyAgICAgICAgdGhpcy5kZXNjID0gY3cubmV3VVRGOChkZXNjKTsKKyAgICAgICAgdGhpcy5kZXNjcmlwdG9yID0gZGVzYzsKKyAgICAgICAgaWYgKENsYXNzUmVhZGVyLlNJR05BVFVSRVMpIHsKKyAgICAgICAgICAgIHRoaXMuc2lnbmF0dXJlID0gc2lnbmF0dXJlOworICAgICAgICB9CisgICAgICAgIGlmIChleGNlcHRpb25zICE9IG51bGwgJiYgZXhjZXB0aW9ucy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBleGNlcHRpb25Db3VudCA9IGV4Y2VwdGlvbnMubGVuZ3RoOworICAgICAgICAgICAgdGhpcy5leGNlcHRpb25zID0gbmV3IGludFtleGNlcHRpb25Db3VudF07CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4Y2VwdGlvbkNvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmV4Y2VwdGlvbnNbaV0gPSBjdy5uZXdDbGFzcyhleGNlcHRpb25zW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0aGlzLmNvbXB1dGUgPSBjb21wdXRlRnJhbWVzID8gRlJBTUVTIDogKGNvbXB1dGVNYXhzID8gTUFYUyA6IE5PVEhJTkcpOworICAgICAgICBpZiAoY29tcHV0ZU1heHMgfHwgY29tcHV0ZUZyYW1lcykgeworICAgICAgICAgICAgLy8gdXBkYXRlcyBtYXhMb2NhbHMKKyAgICAgICAgICAgIGludCBzaXplID0gVHlwZS5nZXRBcmd1bWVudHNBbmRSZXR1cm5TaXplcyhkZXNjcmlwdG9yKSA+PiAyOworICAgICAgICAgICAgaWYgKChhY2Nlc3MgJiBPcGNvZGVzLkFDQ19TVEFUSUMpICE9IDApIHsKKyAgICAgICAgICAgICAgICAtLXNpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtYXhMb2NhbHMgPSBzaXplOworICAgICAgICAgICAgY3VycmVudExvY2FscyA9IHNpemU7CisgICAgICAgICAgICAvLyBjcmVhdGVzIGFuZCB2aXNpdHMgdGhlIGxhYmVsIGZvciB0aGUgZmlyc3QgYmFzaWMgYmxvY2sKKyAgICAgICAgICAgIGxhYmVscyA9IG5ldyBMYWJlbCgpOworICAgICAgICAgICAgbGFiZWxzLnN0YXR1cyB8PSBMYWJlbC5QVVNIRUQ7CisgICAgICAgICAgICB2aXNpdExhYmVsKGxhYmVscyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgTWV0aG9kVmlzaXRvciBhYnN0cmFjdCBjbGFzcworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRQYXJhbWV0ZXIoU3RyaW5nIG5hbWUsIGludCBhY2Nlc3MpIHsKKyAgICAgICAgaWYgKG1ldGhvZFBhcmFtZXRlcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgbWV0aG9kUGFyYW1ldGVycyA9IG5ldyBCeXRlVmVjdG9yKCk7CisgICAgICAgIH0KKyAgICAgICAgKyttZXRob2RQYXJhbWV0ZXJzQ291bnQ7CisgICAgICAgIG1ldGhvZFBhcmFtZXRlcnMucHV0U2hvcnQoKG5hbWUgPT0gbnVsbCkgPyAwIDogY3cubmV3VVRGOChuYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5wdXRTaG9ydChhY2Nlc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBbm5vdGF0aW9uVmlzaXRvciB2aXNpdEFubm90YXRpb25EZWZhdWx0KCkgeworICAgICAgICBpZiAoIUNsYXNzUmVhZGVyLkFOTk9UQVRJT05TKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBhbm5kID0gbmV3IEJ5dGVWZWN0b3IoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBBbm5vdGF0aW9uV3JpdGVyKGN3LCBmYWxzZSwgYW5uZCwgbnVsbCwgMCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFubm90YXRpb25WaXNpdG9yIHZpc2l0QW5ub3RhdGlvbihmaW5hbCBTdHJpbmcgZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gdmlzaWJsZSkgeworICAgICAgICBpZiAoIUNsYXNzUmVhZGVyLkFOTk9UQVRJT05TKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBCeXRlVmVjdG9yIGJ2ID0gbmV3IEJ5dGVWZWN0b3IoKTsKKyAgICAgICAgLy8gd3JpdGUgdHlwZSwgYW5kIHJlc2VydmUgc3BhY2UgZm9yIHZhbHVlcyBjb3VudAorICAgICAgICBidi5wdXRTaG9ydChjdy5uZXdVVEY4KGRlc2MpKS5wdXRTaG9ydCgwKTsKKyAgICAgICAgQW5ub3RhdGlvbldyaXRlciBhdyA9IG5ldyBBbm5vdGF0aW9uV3JpdGVyKGN3LCB0cnVlLCBidiwgYnYsIDIpOworICAgICAgICBpZiAodmlzaWJsZSkgeworICAgICAgICAgICAgYXcubmV4dCA9IGFubnM7CisgICAgICAgICAgICBhbm5zID0gYXc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdy5uZXh0ID0gaWFubnM7CisgICAgICAgICAgICBpYW5ucyA9IGF3OworICAgICAgICB9CisgICAgICAgIHJldHVybiBhdzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQW5ub3RhdGlvblZpc2l0b3IgdmlzaXRUeXBlQW5ub3RhdGlvbihmaW5hbCBpbnQgdHlwZVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlUGF0aCB0eXBlUGF0aCwgZmluYWwgU3RyaW5nIGRlc2MsIGZpbmFsIGJvb2xlYW4gdmlzaWJsZSkgeworICAgICAgICBpZiAoIUNsYXNzUmVhZGVyLkFOTk9UQVRJT05TKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBCeXRlVmVjdG9yIGJ2ID0gbmV3IEJ5dGVWZWN0b3IoKTsKKyAgICAgICAgLy8gd3JpdGUgdGFyZ2V0X3R5cGUgYW5kIHRhcmdldF9pbmZvCisgICAgICAgIEFubm90YXRpb25Xcml0ZXIucHV0VGFyZ2V0KHR5cGVSZWYsIHR5cGVQYXRoLCBidik7CisgICAgICAgIC8vIHdyaXRlIHR5cGUsIGFuZCByZXNlcnZlIHNwYWNlIGZvciB2YWx1ZXMgY291bnQKKyAgICAgICAgYnYucHV0U2hvcnQoY3cubmV3VVRGOChkZXNjKSkucHV0U2hvcnQoMCk7CisgICAgICAgIEFubm90YXRpb25Xcml0ZXIgYXcgPSBuZXcgQW5ub3RhdGlvbldyaXRlcihjdywgdHJ1ZSwgYnYsIGJ2LAorICAgICAgICAgICAgICAgIGJ2Lmxlbmd0aCAtIDIpOworICAgICAgICBpZiAodmlzaWJsZSkgeworICAgICAgICAgICAgYXcubmV4dCA9IHRhbm5zOworICAgICAgICAgICAgdGFubnMgPSBhdzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF3Lm5leHQgPSBpdGFubnM7CisgICAgICAgICAgICBpdGFubnMgPSBhdzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYXc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFubm90YXRpb25WaXNpdG9yIHZpc2l0UGFyYW1ldGVyQW5ub3RhdGlvbihmaW5hbCBpbnQgcGFyYW1ldGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRlc2MsIGZpbmFsIGJvb2xlYW4gdmlzaWJsZSkgeworICAgICAgICBpZiAoIUNsYXNzUmVhZGVyLkFOTk9UQVRJT05TKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBCeXRlVmVjdG9yIGJ2ID0gbmV3IEJ5dGVWZWN0b3IoKTsKKyAgICAgICAgaWYgKCJMamF2YS9sYW5nL1N5bnRoZXRpYzsiLmVxdWFscyhkZXNjKSkgeworICAgICAgICAgICAgLy8gd29ya2Fyb3VuZCBmb3IgYSBidWcgaW4gamF2YWMgd2l0aCBzeW50aGV0aWMgcGFyYW1ldGVycworICAgICAgICAgICAgLy8gc2VlIENsYXNzUmVhZGVyLnJlYWRQYXJhbWV0ZXJBbm5vdGF0aW9ucworICAgICAgICAgICAgc3ludGhldGljcyA9IE1hdGgubWF4KHN5bnRoZXRpY3MsIHBhcmFtZXRlciArIDEpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBBbm5vdGF0aW9uV3JpdGVyKGN3LCBmYWxzZSwgYnYsIG51bGwsIDApOworICAgICAgICB9CisgICAgICAgIC8vIHdyaXRlIHR5cGUsIGFuZCByZXNlcnZlIHNwYWNlIGZvciB2YWx1ZXMgY291bnQKKyAgICAgICAgYnYucHV0U2hvcnQoY3cubmV3VVRGOChkZXNjKSkucHV0U2hvcnQoMCk7CisgICAgICAgIEFubm90YXRpb25Xcml0ZXIgYXcgPSBuZXcgQW5ub3RhdGlvbldyaXRlcihjdywgdHJ1ZSwgYnYsIGJ2LCAyKTsKKyAgICAgICAgaWYgKHZpc2libGUpIHsKKyAgICAgICAgICAgIGlmIChwYW5ucyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcGFubnMgPSBuZXcgQW5ub3RhdGlvbldyaXRlcltUeXBlLmdldEFyZ3VtZW50VHlwZXMoZGVzY3JpcHRvcikubGVuZ3RoXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF3Lm5leHQgPSBwYW5uc1twYXJhbWV0ZXJdOworICAgICAgICAgICAgcGFubnNbcGFyYW1ldGVyXSA9IGF3OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGlwYW5ucyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaXBhbm5zID0gbmV3IEFubm90YXRpb25Xcml0ZXJbVHlwZS5nZXRBcmd1bWVudFR5cGVzKGRlc2NyaXB0b3IpLmxlbmd0aF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdy5uZXh0ID0gaXBhbm5zW3BhcmFtZXRlcl07CisgICAgICAgICAgICBpcGFubnNbcGFyYW1ldGVyXSA9IGF3OworICAgICAgICB9CisgICAgICAgIHJldHVybiBhdzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEF0dHJpYnV0ZShmaW5hbCBBdHRyaWJ1dGUgYXR0cikgeworICAgICAgICBpZiAoYXR0ci5pc0NvZGVBdHRyaWJ1dGUoKSkgeworICAgICAgICAgICAgYXR0ci5uZXh0ID0gY2F0dHJzOworICAgICAgICAgICAgY2F0dHJzID0gYXR0cjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF0dHIubmV4dCA9IGF0dHJzOworICAgICAgICAgICAgYXR0cnMgPSBhdHRyOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRDb2RlKCkgeworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0RnJhbWUoZmluYWwgaW50IHR5cGUsIGZpbmFsIGludCBuTG9jYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3RbXSBsb2NhbCwgZmluYWwgaW50IG5TdGFjaywgZmluYWwgT2JqZWN0W10gc3RhY2spIHsKKyAgICAgICAgaWYgKCFDbGFzc1JlYWRlci5GUkFNRVMgfHwgY29tcHV0ZSA9PSBGUkFNRVMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0eXBlID09IE9wY29kZXMuRl9ORVcpIHsKKyAgICAgICAgICAgIGlmIChwcmV2aW91c0ZyYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB2aXNpdEltcGxpY2l0Rmlyc3RGcmFtZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3VycmVudExvY2FscyA9IG5Mb2NhbDsKKyAgICAgICAgICAgIGludCBmcmFtZUluZGV4ID0gc3RhcnRGcmFtZShjb2RlLmxlbmd0aCwgbkxvY2FsLCBuU3RhY2spOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuTG9jYWw7ICsraSkgeworICAgICAgICAgICAgICAgIGlmIChsb2NhbFtpXSBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgICAgICAgICBmcmFtZVtmcmFtZUluZGV4KytdID0gRnJhbWUuT0JKRUNUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGN3LmFkZFR5cGUoKFN0cmluZykgbG9jYWxbaV0pOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobG9jYWxbaV0gaW5zdGFuY2VvZiBJbnRlZ2VyKSB7CisgICAgICAgICAgICAgICAgICAgIGZyYW1lW2ZyYW1lSW5kZXgrK10gPSAoKEludGVnZXIpIGxvY2FsW2ldKS5pbnRWYWx1ZSgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZyYW1lW2ZyYW1lSW5kZXgrK10gPSBGcmFtZS5VTklOSVRJQUxJWkVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGN3LmFkZFVuaW5pdGlhbGl6ZWRUeXBlKCIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTGFiZWwpIGxvY2FsW2ldKS5wb3NpdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuU3RhY2s7ICsraSkgeworICAgICAgICAgICAgICAgIGlmIChzdGFja1tpXSBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgICAgICAgICBmcmFtZVtmcmFtZUluZGV4KytdID0gRnJhbWUuT0JKRUNUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGN3LmFkZFR5cGUoKFN0cmluZykgc3RhY2tbaV0pOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhY2tbaV0gaW5zdGFuY2VvZiBJbnRlZ2VyKSB7CisgICAgICAgICAgICAgICAgICAgIGZyYW1lW2ZyYW1lSW5kZXgrK10gPSAoKEludGVnZXIpIHN0YWNrW2ldKS5pbnRWYWx1ZSgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZyYW1lW2ZyYW1lSW5kZXgrK10gPSBGcmFtZS5VTklOSVRJQUxJWkVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGN3LmFkZFVuaW5pdGlhbGl6ZWRUeXBlKCIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTGFiZWwpIHN0YWNrW2ldKS5wb3NpdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZW5kRnJhbWUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludCBkZWx0YTsKKyAgICAgICAgICAgIGlmIChzdGFja01hcCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgc3RhY2tNYXAgPSBuZXcgQnl0ZVZlY3RvcigpOworICAgICAgICAgICAgICAgIGRlbHRhID0gY29kZS5sZW5ndGg7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRlbHRhID0gY29kZS5sZW5ndGggLSBwcmV2aW91c0ZyYW1lT2Zmc2V0IC0gMTsKKyAgICAgICAgICAgICAgICBpZiAoZGVsdGEgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IE9wY29kZXMuRl9TQU1FKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5GX0ZVTEw6CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRMb2NhbHMgPSBuTG9jYWw7CisgICAgICAgICAgICAgICAgICAgIHN0YWNrTWFwLnB1dEJ5dGUoRlVMTF9GUkFNRSkucHV0U2hvcnQoZGVsdGEpLnB1dFNob3J0KG5Mb2NhbCk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkxvY2FsOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlRnJhbWVUeXBlKGxvY2FsW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzdGFja01hcC5wdXRTaG9ydChuU3RhY2spOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5TdGFjazsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZUZyYW1lVHlwZShzdGFja1tpXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkZfQVBQRU5EOgorICAgICAgICAgICAgICAgICAgICBjdXJyZW50TG9jYWxzICs9IG5Mb2NhbDsKKyAgICAgICAgICAgICAgICAgICAgc3RhY2tNYXAucHV0Qnl0ZShTQU1FX0ZSQU1FX0VYVEVOREVEICsgbkxvY2FsKS5wdXRTaG9ydChkZWx0YSk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkxvY2FsOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlRnJhbWVUeXBlKGxvY2FsW2ldKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIE9wY29kZXMuRl9DSE9QOgorICAgICAgICAgICAgICAgICAgICBjdXJyZW50TG9jYWxzIC09IG5Mb2NhbDsKKyAgICAgICAgICAgICAgICAgICAgc3RhY2tNYXAucHV0Qnl0ZShTQU1FX0ZSQU1FX0VYVEVOREVEIC0gbkxvY2FsKS5wdXRTaG9ydChkZWx0YSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5GX1NBTUU6CisgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YSA8IDY0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFja01hcC5wdXRCeXRlKGRlbHRhKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrTWFwLnB1dEJ5dGUoU0FNRV9GUkFNRV9FWFRFTkRFRCkucHV0U2hvcnQoZGVsdGEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5GX1NBTUUxOgorICAgICAgICAgICAgICAgICAgICBpZiAoZGVsdGEgPCA2NCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tNYXAucHV0Qnl0ZShTQU1FX0xPQ0FMU18xX1NUQUNLX0lURU1fRlJBTUUgKyBkZWx0YSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFja01hcC5wdXRCeXRlKFNBTUVfTE9DQUxTXzFfU1RBQ0tfSVRFTV9GUkFNRV9FWFRFTkRFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnB1dFNob3J0KGRlbHRhKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB3cml0ZUZyYW1lVHlwZShzdGFja1swXSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcmV2aW91c0ZyYW1lT2Zmc2V0ID0gY29kZS5sZW5ndGg7CisgICAgICAgICAgICArK2ZyYW1lQ291bnQ7CisgICAgICAgIH0KKworICAgICAgICBtYXhTdGFjayA9IE1hdGgubWF4KG1heFN0YWNrLCBuU3RhY2spOworICAgICAgICBtYXhMb2NhbHMgPSBNYXRoLm1heChtYXhMb2NhbHMsIGN1cnJlbnRMb2NhbHMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0SW5zbihmaW5hbCBpbnQgb3Bjb2RlKSB7CisgICAgICAgIGxhc3RDb2RlT2Zmc2V0ID0gY29kZS5sZW5ndGg7CisgICAgICAgIC8vIGFkZHMgdGhlIGluc3RydWN0aW9uIHRvIHRoZSBieXRlY29kZSBvZiB0aGUgbWV0aG9kCisgICAgICAgIGNvZGUucHV0Qnl0ZShvcGNvZGUpOworICAgICAgICAvLyB1cGRhdGUgY3VycmVudEJsb2NrCisgICAgICAgIC8vIExhYmVsIGN1cnJlbnRCbG9jayA9IHRoaXMuY3VycmVudEJsb2NrOworICAgICAgICBpZiAoY3VycmVudEJsb2NrICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChjb21wdXRlID09IEZSQU1FUykgeworICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jay5mcmFtZS5leGVjdXRlKG9wY29kZSwgMCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHVwZGF0ZXMgY3VycmVudCBhbmQgbWF4IHN0YWNrIHNpemVzCisgICAgICAgICAgICAgICAgaW50IHNpemUgPSBzdGFja1NpemUgKyBGcmFtZS5TSVpFW29wY29kZV07CisgICAgICAgICAgICAgICAgaWYgKHNpemUgPiBtYXhTdGFja1NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgbWF4U3RhY2tTaXplID0gc2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RhY2tTaXplID0gc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGlmIG9wY29kZSA9PSBBVEhST1cgb3IgeFJFVFVSTiwgZW5kcyBjdXJyZW50IGJsb2NrIChubyBzdWNjZXNzb3IpCisgICAgICAgICAgICBpZiAoKG9wY29kZSA+PSBPcGNvZGVzLklSRVRVUk4gJiYgb3Bjb2RlIDw9IE9wY29kZXMuUkVUVVJOKQorICAgICAgICAgICAgICAgIHx8IG9wY29kZSA9PSBPcGNvZGVzLkFUSFJPVykgeworICAgICAgICAgICAgICAgIG5vU3VjY2Vzc29yKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEludEluc24oZmluYWwgaW50IG9wY29kZSwgZmluYWwgaW50IG9wZXJhbmQpIHsKKyAgICAgICAgbGFzdENvZGVPZmZzZXQgPSBjb2RlLmxlbmd0aDsKKyAgICAgICAgLy8gTGFiZWwgY3VycmVudEJsb2NrID0gdGhpcy5jdXJyZW50QmxvY2s7CisgICAgICAgIGlmIChjdXJyZW50QmxvY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGNvbXB1dGUgPT0gRlJBTUVTKSB7CisgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrLmZyYW1lLmV4ZWN1dGUob3Bjb2RlLCBvcGVyYW5kLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAob3Bjb2RlICE9IE9wY29kZXMuTkVXQVJSQVkpIHsKKyAgICAgICAgICAgICAgICAvLyB1cGRhdGVzIGN1cnJlbnQgYW5kIG1heCBzdGFjayBzaXplcyBvbmx5IGZvciBORVdBUlJBWQorICAgICAgICAgICAgICAgIC8vIChzdGFjayBzaXplIHZhcmlhdGlvbiA9IDAgZm9yIEJJUFVTSCBvciBTSVBVU0gpCisgICAgICAgICAgICAgICAgaW50IHNpemUgPSBzdGFja1NpemUgKyAxOworICAgICAgICAgICAgICAgIGlmIChzaXplID4gbWF4U3RhY2tTaXplKSB7CisgICAgICAgICAgICAgICAgICAgIG1heFN0YWNrU2l6ZSA9IHNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0YWNrU2l6ZSA9IHNpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gYWRkcyB0aGUgaW5zdHJ1Y3Rpb24gdG8gdGhlIGJ5dGVjb2RlIG9mIHRoZSBtZXRob2QKKyAgICAgICAgaWYgKG9wY29kZSA9PSBPcGNvZGVzLlNJUFVTSCkgeworICAgICAgICAgICAgY29kZS5wdXQxMihvcGNvZGUsIG9wZXJhbmQpOworICAgICAgICB9IGVsc2UgeyAvLyBCSVBVU0ggb3IgTkVXQVJSQVkKKyAgICAgICAgICAgIGNvZGUucHV0MTEob3Bjb2RlLCBvcGVyYW5kKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0VmFySW5zbihmaW5hbCBpbnQgb3Bjb2RlLCBmaW5hbCBpbnQgdmFyKSB7CisgICAgICAgIGxhc3RDb2RlT2Zmc2V0ID0gY29kZS5sZW5ndGg7CisgICAgICAgIC8vIExhYmVsIGN1cnJlbnRCbG9jayA9IHRoaXMuY3VycmVudEJsb2NrOworICAgICAgICBpZiAoY3VycmVudEJsb2NrICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChjb21wdXRlID09IEZSQU1FUykgeworICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jay5mcmFtZS5leGVjdXRlKG9wY29kZSwgdmFyLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBjdXJyZW50IGFuZCBtYXggc3RhY2sgc2l6ZXMKKyAgICAgICAgICAgICAgICBpZiAob3Bjb2RlID09IE9wY29kZXMuUkVUKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5vIHN0YWNrIGNoYW5nZSwgYnV0IGVuZCBvZiBjdXJyZW50IGJsb2NrIChubyBzdWNjZXNzb3IpCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jay5zdGF0dXMgfD0gTGFiZWwuUkVUOworICAgICAgICAgICAgICAgICAgICAvLyBzYXZlICdzdGFja1NpemUnIGhlcmUgZm9yIGZ1dHVyZSB1c2UKKyAgICAgICAgICAgICAgICAgICAgLy8gKHNlZSB7QGxpbmsgI2ZpbmRTdWJyb3V0aW5lU3VjY2Vzc29yc30pCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jay5pbnB1dFN0YWNrVG9wID0gc3RhY2tTaXplOworICAgICAgICAgICAgICAgICAgICBub1N1Y2Nlc3NvcigpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHhMT0FEIG9yIHhTVE9SRQorICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IHN0YWNrU2l6ZSArIEZyYW1lLlNJWkVbb3Bjb2RlXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPiBtYXhTdGFja1NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1heFN0YWNrU2l6ZSA9IHNpemU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3RhY2tTaXplID0gc2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbXB1dGUgIT0gTk9USElORykgeworICAgICAgICAgICAgLy8gdXBkYXRlcyBtYXggbG9jYWxzCisgICAgICAgICAgICBpbnQgbjsKKyAgICAgICAgICAgIGlmIChvcGNvZGUgPT0gT3Bjb2Rlcy5MTE9BRCB8fCBvcGNvZGUgPT0gT3Bjb2Rlcy5ETE9BRAorICAgICAgICAgICAgICAgIHx8IG9wY29kZSA9PSBPcGNvZGVzLkxTVE9SRSB8fCBvcGNvZGUgPT0gT3Bjb2Rlcy5EU1RPUkUpIHsKKyAgICAgICAgICAgICAgICBuID0gdmFyICsgMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbiA9IHZhciArIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobiA+IG1heExvY2FscykgeworICAgICAgICAgICAgICAgIG1heExvY2FscyA9IG47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gYWRkcyB0aGUgaW5zdHJ1Y3Rpb24gdG8gdGhlIGJ5dGVjb2RlIG9mIHRoZSBtZXRob2QKKyAgICAgICAgaWYgKHZhciA8IDQgJiYgb3Bjb2RlICE9IE9wY29kZXMuUkVUKSB7CisgICAgICAgICAgICBpbnQgb3B0OworICAgICAgICAgICAgaWYgKG9wY29kZSA8IE9wY29kZXMuSVNUT1JFKSB7CisgICAgICAgICAgICAgICAgLyogSUxPQURfMCAqLworICAgICAgICAgICAgICAgIG9wdCA9IDI2ICsgKChvcGNvZGUgLSBPcGNvZGVzLklMT0FEKSA8PCAyKSArIHZhcjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogSVNUT1JFXzAgKi8KKyAgICAgICAgICAgICAgICBvcHQgPSA1OSArICgob3Bjb2RlIC0gT3Bjb2Rlcy5JU1RPUkUpIDw8IDIpICsgdmFyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29kZS5wdXRCeXRlKG9wdCk7CisgICAgICAgIH0gZWxzZSBpZiAodmFyID49IDI1NikgeworICAgICAgICAgICAgY29kZS5wdXRCeXRlKDE5NiAvKiBXSURFICovKS5wdXQxMihvcGNvZGUsIHZhcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb2RlLnB1dDExKG9wY29kZSwgdmFyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAob3Bjb2RlID49IE9wY29kZXMuSVNUT1JFICYmIGNvbXB1dGUgPT0gRlJBTUVTICYmIGhhbmRsZXJDb3VudCA+IDApIHsKKyAgICAgICAgICAgIHZpc2l0TGFiZWwobmV3IExhYmVsKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRUeXBlSW5zbihmaW5hbCBpbnQgb3Bjb2RlLCBmaW5hbCBTdHJpbmcgdHlwZSkgeworICAgICAgICBsYXN0Q29kZU9mZnNldCA9IGNvZGUubGVuZ3RoOworICAgICAgICBJdGVtIGkgPSBjdy5uZXdDbGFzc0l0ZW0odHlwZSk7CisgICAgICAgIC8vIExhYmVsIGN1cnJlbnRCbG9jayA9IHRoaXMuY3VycmVudEJsb2NrOworICAgICAgICBpZiAoY3VycmVudEJsb2NrICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChjb21wdXRlID09IEZSQU1FUykgeworICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jay5mcmFtZS5leGVjdXRlKG9wY29kZSwgY29kZS5sZW5ndGgsIGN3LCBpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAob3Bjb2RlID09IE9wY29kZXMuTkVXKSB7CisgICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBjdXJyZW50IGFuZCBtYXggc3RhY2sgc2l6ZXMgb25seSBpZiBvcGNvZGUgPT0gTkVXCisgICAgICAgICAgICAgICAgLy8gKG5vIHN0YWNrIGNoYW5nZSBmb3IgQU5FV0FSUkFZLCBDSEVDS0NBU1QsIElOU1RBTkNFT0YpCisgICAgICAgICAgICAgICAgaW50IHNpemUgPSBzdGFja1NpemUgKyAxOworICAgICAgICAgICAgICAgIGlmIChzaXplID4gbWF4U3RhY2tTaXplKSB7CisgICAgICAgICAgICAgICAgICAgIG1heFN0YWNrU2l6ZSA9IHNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0YWNrU2l6ZSA9IHNpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gYWRkcyB0aGUgaW5zdHJ1Y3Rpb24gdG8gdGhlIGJ5dGVjb2RlIG9mIHRoZSBtZXRob2QKKyAgICAgICAgY29kZS5wdXQxMihvcGNvZGUsIGkuaW5kZXgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0RmllbGRJbnNuKGZpbmFsIGludCBvcGNvZGUsIGZpbmFsIFN0cmluZyBvd25lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIGRlc2MpIHsKKyAgICAgICAgbGFzdENvZGVPZmZzZXQgPSBjb2RlLmxlbmd0aDsKKyAgICAgICAgSXRlbSBpID0gY3cubmV3RmllbGRJdGVtKG93bmVyLCBuYW1lLCBkZXNjKTsKKyAgICAgICAgLy8gTGFiZWwgY3VycmVudEJsb2NrID0gdGhpcy5jdXJyZW50QmxvY2s7CisgICAgICAgIGlmIChjdXJyZW50QmxvY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGNvbXB1dGUgPT0gRlJBTUVTKSB7CisgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrLmZyYW1lLmV4ZWN1dGUob3Bjb2RlLCAwLCBjdywgaSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludCBzaXplOworICAgICAgICAgICAgICAgIC8vIGNvbXB1dGVzIHRoZSBzdGFjayBzaXplIHZhcmlhdGlvbgorICAgICAgICAgICAgICAgIGNoYXIgYyA9IGRlc2MuY2hhckF0KDApOworICAgICAgICAgICAgICAgIHN3aXRjaCAob3Bjb2RlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5HRVRTVEFUSUM6CisgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gc3RhY2tTaXplICsgKGMgPT0gJ0QnIHx8IGMgPT0gJ0onID8gMiA6IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgT3Bjb2Rlcy5QVVRTVEFUSUM6CisgICAgICAgICAgICAgICAgICAgICAgICBzaXplID0gc3RhY2tTaXplICsgKGMgPT0gJ0QnIHx8IGMgPT0gJ0onID8gLTIgOiAtMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBPcGNvZGVzLkdFVEZJRUxEOgorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IHN0YWNrU2l6ZSArIChjID09ICdEJyB8fCBjID09ICdKJyA/IDEgOiAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAvLyBjYXNlIENvbnN0YW50cy5QVVRGSUVMRDoKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBzdGFja1NpemUgKyAoYyA9PSAnRCcgfHwgYyA9PSAnSicgPyAtMyA6IC0yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyB1cGRhdGVzIGN1cnJlbnQgYW5kIG1heCBzdGFjayBzaXplcworICAgICAgICAgICAgICAgIGlmIChzaXplID4gbWF4U3RhY2tTaXplKSB7CisgICAgICAgICAgICAgICAgICAgIG1heFN0YWNrU2l6ZSA9IHNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0YWNrU2l6ZSA9IHNpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gYWRkcyB0aGUgaW5zdHJ1Y3Rpb24gdG8gdGhlIGJ5dGVjb2RlIG9mIHRoZSBtZXRob2QKKyAgICAgICAgY29kZS5wdXQxMihvcGNvZGUsIGkuaW5kZXgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TWV0aG9kSW5zbihmaW5hbCBpbnQgb3Bjb2RlLCBmaW5hbCBTdHJpbmcgb3duZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgZGVzYywgZmluYWwgYm9vbGVhbiBpdGYpIHsKKyAgICAgICAgbGFzdENvZGVPZmZzZXQgPSBjb2RlLmxlbmd0aDsKKyAgICAgICAgSXRlbSBpID0gY3cubmV3TWV0aG9kSXRlbShvd25lciwgbmFtZSwgZGVzYywgaXRmKTsKKyAgICAgICAgaW50IGFyZ1NpemUgPSBpLmludFZhbDsKKyAgICAgICAgLy8gTGFiZWwgY3VycmVudEJsb2NrID0gdGhpcy5jdXJyZW50QmxvY2s7CisgICAgICAgIGlmIChjdXJyZW50QmxvY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGNvbXB1dGUgPT0gRlJBTUVTKSB7CisgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrLmZyYW1lLmV4ZWN1dGUob3Bjb2RlLCAwLCBjdywgaSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogY29tcHV0ZXMgdGhlIHN0YWNrIHNpemUgdmFyaWF0aW9uLiBJbiBvcmRlciBub3QgdG8gcmVjb21wdXRlCisgICAgICAgICAgICAgICAgICogc2V2ZXJhbCB0aW1lcyB0aGlzIHZhcmlhdGlvbiBmb3IgdGhlIHNhbWUgSXRlbSwgd2UgdXNlIHRoZQorICAgICAgICAgICAgICAgICAqIGludFZhbCBmaWVsZCBvZiB0aGlzIGl0ZW0gdG8gc3RvcmUgdGhpcyB2YXJpYXRpb24sIG9uY2UgaXQKKyAgICAgICAgICAgICAgICAgKiBoYXMgYmVlbiBjb21wdXRlZC4gTW9yZSBwcmVjaXNlbHkgdGhpcyBpbnRWYWwgZmllbGQgc3RvcmVzCisgICAgICAgICAgICAgICAgICogdGhlIHNpemVzIG9mIHRoZSBhcmd1bWVudHMgYW5kIG9mIHRoZSByZXR1cm4gdmFsdWUKKyAgICAgICAgICAgICAgICAgKiBjb3JyZXNwb25kaW5nIHRvIGRlc2MuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKGFyZ1NpemUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYWJvdmUgc2l6ZXMgaGF2ZSBub3QgYmVlbiBjb21wdXRlZCB5ZXQsCisgICAgICAgICAgICAgICAgICAgIC8vIHNvIHdlIGNvbXB1dGUgdGhlbS4uLgorICAgICAgICAgICAgICAgICAgICBhcmdTaXplID0gVHlwZS5nZXRBcmd1bWVudHNBbmRSZXR1cm5TaXplcyhkZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4uIGFuZCB3ZSBzYXZlIHRoZW0gaW4gb3JkZXIKKyAgICAgICAgICAgICAgICAgICAgLy8gbm90IHRvIHJlY29tcHV0ZSB0aGVtIGluIHRoZSBmdXR1cmUKKyAgICAgICAgICAgICAgICAgICAgaS5pbnRWYWwgPSBhcmdTaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgc2l6ZTsKKyAgICAgICAgICAgICAgICBpZiAob3Bjb2RlID09IE9wY29kZXMuSU5WT0tFU1RBVElDKSB7CisgICAgICAgICAgICAgICAgICAgIHNpemUgPSBzdGFja1NpemUgLSAoYXJnU2l6ZSA+PiAyKSArIChhcmdTaXplICYgMHgwMykgKyAxOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHNpemUgPSBzdGFja1NpemUgLSAoYXJnU2l6ZSA+PiAyKSArIChhcmdTaXplICYgMHgwMyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIHVwZGF0ZXMgY3VycmVudCBhbmQgbWF4IHN0YWNrIHNpemVzCisgICAgICAgICAgICAgICAgaWYgKHNpemUgPiBtYXhTdGFja1NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgbWF4U3RhY2tTaXplID0gc2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RhY2tTaXplID0gc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBhZGRzIHRoZSBpbnN0cnVjdGlvbiB0byB0aGUgYnl0ZWNvZGUgb2YgdGhlIG1ldGhvZAorICAgICAgICBpZiAob3Bjb2RlID09IE9wY29kZXMuSU5WT0tFSU5URVJGQUNFKSB7CisgICAgICAgICAgICBpZiAoYXJnU2l6ZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgYXJnU2l6ZSA9IFR5cGUuZ2V0QXJndW1lbnRzQW5kUmV0dXJuU2l6ZXMoZGVzYyk7CisgICAgICAgICAgICAgICAgaS5pbnRWYWwgPSBhcmdTaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29kZS5wdXQxMihPcGNvZGVzLklOVk9LRUlOVEVSRkFDRSwgaS5pbmRleCkucHV0MTEoYXJnU2l6ZSA+PiAyLCAwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvZGUucHV0MTIob3Bjb2RlLCBpLmluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0SW52b2tlRHluYW1pY0luc24oZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyBkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSGFuZGxlIGJzbSwgZmluYWwgT2JqZWN0Li4uIGJzbUFyZ3MpIHsKKyAgICAgICAgbGFzdENvZGVPZmZzZXQgPSBjb2RlLmxlbmd0aDsKKyAgICAgICAgSXRlbSBpID0gY3cubmV3SW52b2tlRHluYW1pY0l0ZW0obmFtZSwgZGVzYywgYnNtLCBic21BcmdzKTsKKyAgICAgICAgaW50IGFyZ1NpemUgPSBpLmludFZhbDsKKyAgICAgICAgLy8gTGFiZWwgY3VycmVudEJsb2NrID0gdGhpcy5jdXJyZW50QmxvY2s7CisgICAgICAgIGlmIChjdXJyZW50QmxvY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGNvbXB1dGUgPT0gRlJBTUVTKSB7CisgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrLmZyYW1lLmV4ZWN1dGUoT3Bjb2Rlcy5JTlZPS0VEWU5BTUlDLCAwLCBjdywgaSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogY29tcHV0ZXMgdGhlIHN0YWNrIHNpemUgdmFyaWF0aW9uLiBJbiBvcmRlciBub3QgdG8gcmVjb21wdXRlCisgICAgICAgICAgICAgICAgICogc2V2ZXJhbCB0aW1lcyB0aGlzIHZhcmlhdGlvbiBmb3IgdGhlIHNhbWUgSXRlbSwgd2UgdXNlIHRoZQorICAgICAgICAgICAgICAgICAqIGludFZhbCBmaWVsZCBvZiB0aGlzIGl0ZW0gdG8gc3RvcmUgdGhpcyB2YXJpYXRpb24sIG9uY2UgaXQKKyAgICAgICAgICAgICAgICAgKiBoYXMgYmVlbiBjb21wdXRlZC4gTW9yZSBwcmVjaXNlbHkgdGhpcyBpbnRWYWwgZmllbGQgc3RvcmVzCisgICAgICAgICAgICAgICAgICogdGhlIHNpemVzIG9mIHRoZSBhcmd1bWVudHMgYW5kIG9mIHRoZSByZXR1cm4gdmFsdWUKKyAgICAgICAgICAgICAgICAgKiBjb3JyZXNwb25kaW5nIHRvIGRlc2MuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKGFyZ1NpemUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYWJvdmUgc2l6ZXMgaGF2ZSBub3QgYmVlbiBjb21wdXRlZCB5ZXQsCisgICAgICAgICAgICAgICAgICAgIC8vIHNvIHdlIGNvbXB1dGUgdGhlbS4uLgorICAgICAgICAgICAgICAgICAgICBhcmdTaXplID0gVHlwZS5nZXRBcmd1bWVudHNBbmRSZXR1cm5TaXplcyhkZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gLi4uIGFuZCB3ZSBzYXZlIHRoZW0gaW4gb3JkZXIKKyAgICAgICAgICAgICAgICAgICAgLy8gbm90IHRvIHJlY29tcHV0ZSB0aGVtIGluIHRoZSBmdXR1cmUKKyAgICAgICAgICAgICAgICAgICAgaS5pbnRWYWwgPSBhcmdTaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbnQgc2l6ZSA9IHN0YWNrU2l6ZSAtIChhcmdTaXplID4+IDIpICsgKGFyZ1NpemUgJiAweDAzKSArIDE7CisKKyAgICAgICAgICAgICAgICAvLyB1cGRhdGVzIGN1cnJlbnQgYW5kIG1heCBzdGFjayBzaXplcworICAgICAgICAgICAgICAgIGlmIChzaXplID4gbWF4U3RhY2tTaXplKSB7CisgICAgICAgICAgICAgICAgICAgIG1heFN0YWNrU2l6ZSA9IHNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0YWNrU2l6ZSA9IHNpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gYWRkcyB0aGUgaW5zdHJ1Y3Rpb24gdG8gdGhlIGJ5dGVjb2RlIG9mIHRoZSBtZXRob2QKKyAgICAgICAgY29kZS5wdXQxMihPcGNvZGVzLklOVk9LRURZTkFNSUMsIGkuaW5kZXgpOworICAgICAgICBjb2RlLnB1dFNob3J0KDApOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0SnVtcEluc24oZmluYWwgaW50IG9wY29kZSwgZmluYWwgTGFiZWwgbGFiZWwpIHsKKyAgICAgICAgbGFzdENvZGVPZmZzZXQgPSBjb2RlLmxlbmd0aDsKKyAgICAgICAgTGFiZWwgbmV4dEluc24gPSBudWxsOworICAgICAgICAvLyBMYWJlbCBjdXJyZW50QmxvY2sgPSB0aGlzLmN1cnJlbnRCbG9jazsKKyAgICAgICAgaWYgKGN1cnJlbnRCbG9jayAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoY29tcHV0ZSA9PSBGUkFNRVMpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2suZnJhbWUuZXhlY3V0ZShvcGNvZGUsIDAsIG51bGwsIG51bGwpOworICAgICAgICAgICAgICAgIC8vICdsYWJlbCcgaXMgdGhlIHRhcmdldCBvZiBhIGp1bXAgaW5zdHJ1Y3Rpb24KKyAgICAgICAgICAgICAgICBsYWJlbC5nZXRGaXJzdCgpLnN0YXR1cyB8PSBMYWJlbC5UQVJHRVQ7CisgICAgICAgICAgICAgICAgLy8gYWRkcyAnbGFiZWwnIGFzIGEgc3VjY2Vzc29yIG9mIHRoaXMgYmFzaWMgYmxvY2sKKyAgICAgICAgICAgICAgICBhZGRTdWNjZXNzb3IoRWRnZS5OT1JNQUwsIGxhYmVsKTsKKyAgICAgICAgICAgICAgICBpZiAob3Bjb2RlICE9IE9wY29kZXMuR09UTykgeworICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGVzIGEgTGFiZWwgZm9yIHRoZSBuZXh0IGJhc2ljIGJsb2NrCisgICAgICAgICAgICAgICAgICAgIG5leHRJbnNuID0gbmV3IExhYmVsKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAob3Bjb2RlID09IE9wY29kZXMuSlNSKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgobGFiZWwuc3RhdHVzICYgTGFiZWwuU1VCUk9VVElORSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwuc3RhdHVzIHw9IExhYmVsLlNVQlJPVVRJTkU7CisgICAgICAgICAgICAgICAgICAgICAgICArK3N1YnJvdXRpbmVzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jay5zdGF0dXMgfD0gTGFiZWwuSlNSOworICAgICAgICAgICAgICAgICAgICBhZGRTdWNjZXNzb3Ioc3RhY2tTaXplICsgMSwgbGFiZWwpOworICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGVzIGEgTGFiZWwgZm9yIHRoZSBuZXh0IGJhc2ljIGJsb2NrCisgICAgICAgICAgICAgICAgICAgIG5leHRJbnNuID0gbmV3IExhYmVsKCk7CisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICAqIG5vdGUgdGhhdCwgYnkgY29uc3RydWN0aW9uIGluIHRoaXMgbWV0aG9kLCBhIEpTUiBibG9jaworICAgICAgICAgICAgICAgICAgICAgKiBoYXMgYXQgbGVhc3QgdHdvIHN1Y2Nlc3NvcnMgaW4gdGhlIGNvbnRyb2wgZmxvdyBncmFwaDoKKyAgICAgICAgICAgICAgICAgICAgICogdGhlIGZpcnN0IG9uZSBsZWFkcyB0aGUgbmV4dCBpbnN0cnVjdGlvbiBhZnRlciB0aGUgSlNSLAorICAgICAgICAgICAgICAgICAgICAgKiB3aGlsZSB0aGUgc2Vjb25kIG9uZSBsZWFkcyB0byB0aGUgSlNSIHRhcmdldC4KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlcyBjdXJyZW50IHN0YWNrIHNpemUgKG1heCBzdGFjayBzaXplIHVuY2hhbmdlZAorICAgICAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIHN0YWNrIHNpemUgdmFyaWF0aW9uIGFsd2F5cyBuZWdhdGl2ZSBpbiB0aGlzCisgICAgICAgICAgICAgICAgICAgIC8vIGNhc2UpCisgICAgICAgICAgICAgICAgICAgIHN0YWNrU2l6ZSArPSBGcmFtZS5TSVpFW29wY29kZV07CisgICAgICAgICAgICAgICAgICAgIGFkZFN1Y2Nlc3NvcihzdGFja1NpemUsIGxhYmVsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gYWRkcyB0aGUgaW5zdHJ1Y3Rpb24gdG8gdGhlIGJ5dGVjb2RlIG9mIHRoZSBtZXRob2QKKyAgICAgICAgaWYgKChsYWJlbC5zdGF0dXMgJiBMYWJlbC5SRVNPTFZFRCkgIT0gMAorICAgICAgICAgICAgJiYgbGFiZWwucG9zaXRpb24gLSBjb2RlLmxlbmd0aCA8IFNob3J0Lk1JTl9WQUxVRSkgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIGNhc2Ugb2YgYSBiYWNrd2FyZCBqdW1wIHdpdGggYW4gb2Zmc2V0IDwgLTMyNzY4LiBJbiB0aGlzIGNhc2Ugd2UKKyAgICAgICAgICAgICAqIGF1dG9tYXRpY2FsbHkgcmVwbGFjZSBHT1RPIHdpdGggR09UT19XLCBKU1Igd2l0aCBKU1JfVyBhbmQgSUZ4eHgKKyAgICAgICAgICAgICAqIDxsPiB3aXRoIElGTk9UeHh4IDxsJz4gR09UT19XIDxsPiwgd2hlcmUgSUZOT1R4eHggaXMgdGhlCisgICAgICAgICAgICAgKiAib3Bwb3NpdGUiIG9wY29kZSBvZiBJRnh4eCAoaS5lLiwgSUZORSBmb3IgSUZFUSkgYW5kIHdoZXJlIDxsJz4KKyAgICAgICAgICAgICAqIGRlc2lnbmF0ZXMgdGhlIGluc3RydWN0aW9uIGp1c3QgYWZ0ZXIgdGhlIEdPVE9fVy4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKG9wY29kZSA9PSBPcGNvZGVzLkdPVE8pIHsKKyAgICAgICAgICAgICAgICBjb2RlLnB1dEJ5dGUoMjAwKTsgLy8gR09UT19XCisgICAgICAgICAgICB9IGVsc2UgaWYgKG9wY29kZSA9PSBPcGNvZGVzLkpTUikgeworICAgICAgICAgICAgICAgIGNvZGUucHV0Qnl0ZSgyMDEpOyAvLyBKU1JfVworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBpZiB0aGUgSUYgaW5zdHJ1Y3Rpb24gaXMgdHJhbnNmb3JtZWQgaW50byBJRk5PVCBHT1RPX1cgdGhlCisgICAgICAgICAgICAgICAgLy8gbmV4dCBpbnN0cnVjdGlvbiBiZWNvbWVzIHRoZSB0YXJnZXQgb2YgdGhlIElGTk9UIGluc3RydWN0aW9uCisgICAgICAgICAgICAgICAgaWYgKG5leHRJbnNuICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV4dEluc24uc3RhdHVzIHw9IExhYmVsLlRBUkdFVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29kZS5wdXRCeXRlKG9wY29kZSA8PSAxNjYgPyAoKG9wY29kZSArIDEpIF4gMSkgLSAxCisgICAgICAgICAgICAgICAgICAgICAgICA6IG9wY29kZSBeIDEpOworICAgICAgICAgICAgICAgIGNvZGUucHV0U2hvcnQoOCk7IC8vIGp1bXAgb2Zmc2V0CisgICAgICAgICAgICAgICAgY29kZS5wdXRCeXRlKDIwMCk7IC8vIEdPVE9fVworICAgICAgICAgICAgfQorICAgICAgICAgICAgbGFiZWwucHV0KHRoaXMsIGNvZGUsIGNvZGUubGVuZ3RoIC0gMSwgdHJ1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogY2FzZSBvZiBhIGJhY2t3YXJkIGp1bXAgd2l0aCBhbiBvZmZzZXQgPj0gLTMyNzY4LCBvciBvZiBhIGZvcndhcmQKKyAgICAgICAgICAgICAqIGp1bXAgd2l0aCwgb2YgY291cnNlLCBhbiB1bmtub3duIG9mZnNldC4gSW4gdGhlc2UgY2FzZXMgd2Ugc3RvcmUKKyAgICAgICAgICAgICAqIHRoZSBvZmZzZXQgaW4gMiBieXRlcyAod2hpY2ggd2lsbCBiZSBpbmNyZWFzZWQgaW4KKyAgICAgICAgICAgICAqIHJlc2l6ZUluc3RydWN0aW9ucywgaWYgbmVlZGVkKS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgY29kZS5wdXRCeXRlKG9wY29kZSk7CisgICAgICAgICAgICBsYWJlbC5wdXQodGhpcywgY29kZSwgY29kZS5sZW5ndGggLSAxLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGN1cnJlbnRCbG9jayAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobmV4dEluc24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBqdW1wIGluc3RydWN0aW9uIGlzIG5vdCBhIEdPVE8sIHRoZSBuZXh0IGluc3RydWN0aW9uCisgICAgICAgICAgICAgICAgLy8gaXMgYWxzbyBhIHN1Y2Nlc3NvciBvZiB0aGlzIGluc3RydWN0aW9uLiBDYWxsaW5nIHZpc2l0TGFiZWwKKyAgICAgICAgICAgICAgICAvLyBhZGRzIHRoZSBsYWJlbCBvZiB0aGlzIG5leHQgaW5zdHJ1Y3Rpb24gYXMgYSBzdWNjZXNzb3Igb2YgdGhlCisgICAgICAgICAgICAgICAgLy8gY3VycmVudCBibG9jaywgYW5kIHN0YXJ0cyBhIG5ldyBiYXNpYyBibG9jaworICAgICAgICAgICAgICAgIHZpc2l0TGFiZWwobmV4dEluc24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9wY29kZSA9PSBPcGNvZGVzLkdPVE8pIHsKKyAgICAgICAgICAgICAgICBub1N1Y2Nlc3NvcigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRMYWJlbChmaW5hbCBMYWJlbCBsYWJlbCkgeworICAgICAgICAvLyByZXNvbHZlcyBwcmV2aW91cyBmb3J3YXJkIHJlZmVyZW5jZXMgdG8gbGFiZWwsIGlmIGFueQorICAgICAgICByZXNpemUgfD0gbGFiZWwucmVzb2x2ZSh0aGlzLCBjb2RlLmxlbmd0aCwgY29kZS5kYXRhKTsKKyAgICAgICAgLy8gdXBkYXRlcyBjdXJyZW50QmxvY2sKKyAgICAgICAgaWYgKChsYWJlbC5zdGF0dXMgJiBMYWJlbC5ERUJVRykgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChjb21wdXRlID09IEZSQU1FUykgeworICAgICAgICAgICAgaWYgKGN1cnJlbnRCbG9jayAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGxhYmVsLnBvc2l0aW9uID09IGN1cnJlbnRCbG9jay5wb3NpdGlvbikgeworICAgICAgICAgICAgICAgICAgICAvLyBzdWNjZXNzaXZlIGxhYmVscywgZG8gbm90IHN0YXJ0IGEgbmV3IGJhc2ljIGJsb2NrCisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jay5zdGF0dXMgfD0gKGxhYmVsLnN0YXR1cyAmIExhYmVsLlRBUkdFVCk7CisgICAgICAgICAgICAgICAgICAgIGxhYmVsLmZyYW1lID0gY3VycmVudEJsb2NrLmZyYW1lOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGVuZHMgY3VycmVudCBibG9jayAod2l0aCBvbmUgbmV3IHN1Y2Nlc3NvcikKKyAgICAgICAgICAgICAgICBhZGRTdWNjZXNzb3IoRWRnZS5OT1JNQUwsIGxhYmVsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGJlZ2lucyBhIG5ldyBjdXJyZW50IGJsb2NrCisgICAgICAgICAgICBjdXJyZW50QmxvY2sgPSBsYWJlbDsKKyAgICAgICAgICAgIGlmIChsYWJlbC5mcmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbGFiZWwuZnJhbWUgPSBuZXcgRnJhbWUoKTsKKyAgICAgICAgICAgICAgICBsYWJlbC5mcmFtZS5vd25lciA9IGxhYmVsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gdXBkYXRlcyB0aGUgYmFzaWMgYmxvY2sgbGlzdAorICAgICAgICAgICAgaWYgKHByZXZpb3VzQmxvY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChsYWJlbC5wb3NpdGlvbiA9PSBwcmV2aW91c0Jsb2NrLnBvc2l0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzQmxvY2suc3RhdHVzIHw9IChsYWJlbC5zdGF0dXMgJiBMYWJlbC5UQVJHRVQpOworICAgICAgICAgICAgICAgICAgICBsYWJlbC5mcmFtZSA9IHByZXZpb3VzQmxvY2suZnJhbWU7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jayA9IHByZXZpb3VzQmxvY2s7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJldmlvdXNCbG9jay5zdWNjZXNzb3IgPSBsYWJlbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByZXZpb3VzQmxvY2sgPSBsYWJlbDsKKyAgICAgICAgfSBlbHNlIGlmIChjb21wdXRlID09IE1BWFMpIHsKKyAgICAgICAgICAgIGlmIChjdXJyZW50QmxvY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIGVuZHMgY3VycmVudCBibG9jayAod2l0aCBvbmUgbmV3IHN1Y2Nlc3NvcikKKyAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2sub3V0cHV0U3RhY2tNYXggPSBtYXhTdGFja1NpemU7CisgICAgICAgICAgICAgICAgYWRkU3VjY2Vzc29yKHN0YWNrU2l6ZSwgbGFiZWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gYmVnaW5zIGEgbmV3IGN1cnJlbnQgYmxvY2sKKyAgICAgICAgICAgIGN1cnJlbnRCbG9jayA9IGxhYmVsOworICAgICAgICAgICAgLy8gcmVzZXRzIHRoZSByZWxhdGl2ZSBjdXJyZW50IGFuZCBtYXggc3RhY2sgc2l6ZXMKKyAgICAgICAgICAgIHN0YWNrU2l6ZSA9IDA7CisgICAgICAgICAgICBtYXhTdGFja1NpemUgPSAwOworICAgICAgICAgICAgLy8gdXBkYXRlcyB0aGUgYmFzaWMgYmxvY2sgbGlzdAorICAgICAgICAgICAgaWYgKHByZXZpb3VzQmxvY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHByZXZpb3VzQmxvY2suc3VjY2Vzc29yID0gbGFiZWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmV2aW91c0Jsb2NrID0gbGFiZWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExkY0luc24oZmluYWwgT2JqZWN0IGNzdCkgeworICAgICAgICBsYXN0Q29kZU9mZnNldCA9IGNvZGUubGVuZ3RoOworICAgICAgICBJdGVtIGkgPSBjdy5uZXdDb25zdEl0ZW0oY3N0KTsKKyAgICAgICAgLy8gTGFiZWwgY3VycmVudEJsb2NrID0gdGhpcy5jdXJyZW50QmxvY2s7CisgICAgICAgIGlmIChjdXJyZW50QmxvY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGNvbXB1dGUgPT0gRlJBTUVTKSB7CisgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrLmZyYW1lLmV4ZWN1dGUoT3Bjb2Rlcy5MREMsIDAsIGN3LCBpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW50IHNpemU7CisgICAgICAgICAgICAgICAgLy8gY29tcHV0ZXMgdGhlIHN0YWNrIHNpemUgdmFyaWF0aW9uCisgICAgICAgICAgICAgICAgaWYgKGkudHlwZSA9PSBDbGFzc1dyaXRlci5MT05HIHx8IGkudHlwZSA9PSBDbGFzc1dyaXRlci5ET1VCTEUpIHsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IHN0YWNrU2l6ZSArIDI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IHN0YWNrU2l6ZSArIDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIHVwZGF0ZXMgY3VycmVudCBhbmQgbWF4IHN0YWNrIHNpemVzCisgICAgICAgICAgICAgICAgaWYgKHNpemUgPiBtYXhTdGFja1NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgbWF4U3RhY2tTaXplID0gc2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RhY2tTaXplID0gc2l6ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBhZGRzIHRoZSBpbnN0cnVjdGlvbiB0byB0aGUgYnl0ZWNvZGUgb2YgdGhlIG1ldGhvZAorICAgICAgICBpbnQgaW5kZXggPSBpLmluZGV4OworICAgICAgICBpZiAoaS50eXBlID09IENsYXNzV3JpdGVyLkxPTkcgfHwgaS50eXBlID09IENsYXNzV3JpdGVyLkRPVUJMRSkgeworICAgICAgICAgICAgY29kZS5wdXQxMigyMCAvKiBMREMyX1cgKi8sIGluZGV4KTsKKyAgICAgICAgfSBlbHNlIGlmIChpbmRleCA+PSAyNTYpIHsKKyAgICAgICAgICAgIGNvZGUucHV0MTIoMTkgLyogTERDX1cgKi8sIGluZGV4KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvZGUucHV0MTEoT3Bjb2Rlcy5MREMsIGluZGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0SWluY0luc24oZmluYWwgaW50IHZhciwgZmluYWwgaW50IGluY3JlbWVudCkgeworICAgICAgICBsYXN0Q29kZU9mZnNldCA9IGNvZGUubGVuZ3RoOworICAgICAgICBpZiAoY3VycmVudEJsb2NrICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChjb21wdXRlID09IEZSQU1FUykgeworICAgICAgICAgICAgICAgIGN1cnJlbnRCbG9jay5mcmFtZS5leGVjdXRlKE9wY29kZXMuSUlOQywgdmFyLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY29tcHV0ZSAhPSBOT1RISU5HKSB7CisgICAgICAgICAgICAvLyB1cGRhdGVzIG1heCBsb2NhbHMKKyAgICAgICAgICAgIGludCBuID0gdmFyICsgMTsKKyAgICAgICAgICAgIGlmIChuID4gbWF4TG9jYWxzKSB7CisgICAgICAgICAgICAgICAgbWF4TG9jYWxzID0gbjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBhZGRzIHRoZSBpbnN0cnVjdGlvbiB0byB0aGUgYnl0ZWNvZGUgb2YgdGhlIG1ldGhvZAorICAgICAgICBpZiAoKHZhciA+IDI1NSkgfHwgKGluY3JlbWVudCA+IDEyNykgfHwgKGluY3JlbWVudCA8IC0xMjgpKSB7CisgICAgICAgICAgICBjb2RlLnB1dEJ5dGUoMTk2IC8qIFdJREUgKi8pLnB1dDEyKE9wY29kZXMuSUlOQywgdmFyKQorICAgICAgICAgICAgICAgIC5wdXRTaG9ydChpbmNyZW1lbnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29kZS5wdXRCeXRlKE9wY29kZXMuSUlOQykucHV0MTEodmFyLCBpbmNyZW1lbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRUYWJsZVN3aXRjaEluc24oZmluYWwgaW50IG1pbiwgZmluYWwgaW50IG1heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMYWJlbCBkZmx0LCBmaW5hbCBMYWJlbC4uLiBsYWJlbHMpIHsKKyAgICAgICAgbGFzdENvZGVPZmZzZXQgPSBjb2RlLmxlbmd0aDsKKyAgICAgICAgLy8gYWRkcyB0aGUgaW5zdHJ1Y3Rpb24gdG8gdGhlIGJ5dGVjb2RlIG9mIHRoZSBtZXRob2QKKyAgICAgICAgaW50IHNvdXJjZSA9IGNvZGUubGVuZ3RoOworICAgICAgICBjb2RlLnB1dEJ5dGUoT3Bjb2Rlcy5UQUJMRVNXSVRDSCk7CisgICAgICAgIGNvZGUucHV0Qnl0ZUFycmF5KG51bGwsIDAsICg0IC0gY29kZS5sZW5ndGggJSA0KSAlIDQpOworICAgICAgICBkZmx0LnB1dCh0aGlzLCBjb2RlLCBzb3VyY2UsIHRydWUpOworICAgICAgICBjb2RlLnB1dEludChtaW4pLnB1dEludChtYXgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxhYmVscy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgbGFiZWxzW2ldLnB1dCh0aGlzLCBjb2RlLCBzb3VyY2UsIHRydWUpOworICAgICAgICB9CisgICAgICAgIC8vIHVwZGF0ZXMgY3VycmVudEJsb2NrCisgICAgICAgIHZpc2l0U3dpdGNoSW5zbihkZmx0LCBsYWJlbHMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TG9va3VwU3dpdGNoSW5zbihmaW5hbCBMYWJlbCBkZmx0LCBmaW5hbCBpbnRbXSBrZXlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMYWJlbFtdIGxhYmVscykgeworICAgICAgICBsYXN0Q29kZU9mZnNldCA9IGNvZGUubGVuZ3RoOworICAgICAgICAvLyBhZGRzIHRoZSBpbnN0cnVjdGlvbiB0byB0aGUgYnl0ZWNvZGUgb2YgdGhlIG1ldGhvZAorICAgICAgICBpbnQgc291cmNlID0gY29kZS5sZW5ndGg7CisgICAgICAgIGNvZGUucHV0Qnl0ZShPcGNvZGVzLkxPT0tVUFNXSVRDSCk7CisgICAgICAgIGNvZGUucHV0Qnl0ZUFycmF5KG51bGwsIDAsICg0IC0gY29kZS5sZW5ndGggJSA0KSAlIDQpOworICAgICAgICBkZmx0LnB1dCh0aGlzLCBjb2RlLCBzb3VyY2UsIHRydWUpOworICAgICAgICBjb2RlLnB1dEludChsYWJlbHMubGVuZ3RoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsYWJlbHMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGNvZGUucHV0SW50KGtleXNbaV0pOworICAgICAgICAgICAgbGFiZWxzW2ldLnB1dCh0aGlzLCBjb2RlLCBzb3VyY2UsIHRydWUpOworICAgICAgICB9CisgICAgICAgIC8vIHVwZGF0ZXMgY3VycmVudEJsb2NrCisgICAgICAgIHZpc2l0U3dpdGNoSW5zbihkZmx0LCBsYWJlbHMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2aXNpdFN3aXRjaEluc24oZmluYWwgTGFiZWwgZGZsdCwgZmluYWwgTGFiZWxbXSBsYWJlbHMpIHsKKyAgICAgICAgLy8gTGFiZWwgY3VycmVudEJsb2NrID0gdGhpcy5jdXJyZW50QmxvY2s7CisgICAgICAgIGlmIChjdXJyZW50QmxvY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGNvbXB1dGUgPT0gRlJBTUVTKSB7CisgICAgICAgICAgICAgICAgY3VycmVudEJsb2NrLmZyYW1lLmV4ZWN1dGUoT3Bjb2Rlcy5MT09LVVBTV0lUQ0gsIDAsIG51bGwsIG51bGwpOworICAgICAgICAgICAgICAgIC8vIGFkZHMgY3VycmVudCBibG9jayBzdWNjZXNzb3JzCisgICAgICAgICAgICAgICAgYWRkU3VjY2Vzc29yKEVkZ2UuTk9STUFMLCBkZmx0KTsKKyAgICAgICAgICAgICAgICBkZmx0LmdldEZpcnN0KCkuc3RhdHVzIHw9IExhYmVsLlRBUkdFVDsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxhYmVscy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBhZGRTdWNjZXNzb3IoRWRnZS5OT1JNQUwsIGxhYmVsc1tpXSk7CisgICAgICAgICAgICAgICAgICAgIGxhYmVsc1tpXS5nZXRGaXJzdCgpLnN0YXR1cyB8PSBMYWJlbC5UQVJHRVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyB1cGRhdGVzIGN1cnJlbnQgc3RhY2sgc2l6ZSAobWF4IHN0YWNrIHNpemUgdW5jaGFuZ2VkKQorICAgICAgICAgICAgICAgIC0tc3RhY2tTaXplOworICAgICAgICAgICAgICAgIC8vIGFkZHMgY3VycmVudCBibG9jayBzdWNjZXNzb3JzCisgICAgICAgICAgICAgICAgYWRkU3VjY2Vzc29yKHN0YWNrU2l6ZSwgZGZsdCk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsYWJlbHMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgYWRkU3VjY2Vzc29yKHN0YWNrU2l6ZSwgbGFiZWxzW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBlbmRzIGN1cnJlbnQgYmxvY2sKKyAgICAgICAgICAgIG5vU3VjY2Vzc29yKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdE11bHRpQU5ld0FycmF5SW5zbihmaW5hbCBTdHJpbmcgZGVzYywgZmluYWwgaW50IGRpbXMpIHsKKyAgICAgICAgbGFzdENvZGVPZmZzZXQgPSBjb2RlLmxlbmd0aDsKKyAgICAgICAgSXRlbSBpID0gY3cubmV3Q2xhc3NJdGVtKGRlc2MpOworICAgICAgICAvLyBMYWJlbCBjdXJyZW50QmxvY2sgPSB0aGlzLmN1cnJlbnRCbG9jazsKKyAgICAgICAgaWYgKGN1cnJlbnRCbG9jayAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoY29tcHV0ZSA9PSBGUkFNRVMpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50QmxvY2suZnJhbWUuZXhlY3V0ZShPcGNvZGVzLk1VTFRJQU5FV0FSUkFZLCBkaW1zLCBjdywgaSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHVwZGF0ZXMgY3VycmVudCBzdGFjayBzaXplIChtYXggc3RhY2sgc2l6ZSB1bmNoYW5nZWQgYmVjYXVzZQorICAgICAgICAgICAgICAgIC8vIHN0YWNrIHNpemUgdmFyaWF0aW9uIGFsd2F5cyBuZWdhdGl2ZSBvciBudWxsKQorICAgICAgICAgICAgICAgIHN0YWNrU2l6ZSArPSAxIC0gZGltczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBhZGRzIHRoZSBpbnN0cnVjdGlvbiB0byB0aGUgYnl0ZWNvZGUgb2YgdGhlIG1ldGhvZAorICAgICAgICBjb2RlLnB1dDEyKE9wY29kZXMuTVVMVElBTkVXQVJSQVksIGkuaW5kZXgpLnB1dEJ5dGUoZGltcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFubm90YXRpb25WaXNpdG9yIHZpc2l0SW5zbkFubm90YXRpb24oaW50IHR5cGVSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZVBhdGggdHlwZVBhdGgsIFN0cmluZyBkZXNjLCBib29sZWFuIHZpc2libGUpIHsKKyAgICAgICAgaWYgKCFDbGFzc1JlYWRlci5BTk5PVEFUSU9OUykgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgQnl0ZVZlY3RvciBidiA9IG5ldyBCeXRlVmVjdG9yKCk7CisgICAgICAgIC8vIHdyaXRlIHRhcmdldF90eXBlIGFuZCB0YXJnZXRfaW5mbworICAgICAgICB0eXBlUmVmID0gKHR5cGVSZWYgJiAweEZGMDAwMEZGKSB8IChsYXN0Q29kZU9mZnNldCA8PCA4KTsKKyAgICAgICAgQW5ub3RhdGlvbldyaXRlci5wdXRUYXJnZXQodHlwZVJlZiwgdHlwZVBhdGgsIGJ2KTsKKyAgICAgICAgLy8gd3JpdGUgdHlwZSwgYW5kIHJlc2VydmUgc3BhY2UgZm9yIHZhbHVlcyBjb3VudAorICAgICAgICBidi5wdXRTaG9ydChjdy5uZXdVVEY4KGRlc2MpKS5wdXRTaG9ydCgwKTsKKyAgICAgICAgQW5ub3RhdGlvbldyaXRlciBhdyA9IG5ldyBBbm5vdGF0aW9uV3JpdGVyKGN3LCB0cnVlLCBidiwgYnYsCisgICAgICAgICAgICAgICAgYnYubGVuZ3RoIC0gMik7CisgICAgICAgIGlmICh2aXNpYmxlKSB7CisgICAgICAgICAgICBhdy5uZXh0ID0gY3Rhbm5zOworICAgICAgICAgICAgY3Rhbm5zID0gYXc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhdy5uZXh0ID0gaWN0YW5uczsKKyAgICAgICAgICAgIGljdGFubnMgPSBhdzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYXc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRUcnlDYXRjaEJsb2NrKGZpbmFsIExhYmVsIHN0YXJ0LCBmaW5hbCBMYWJlbCBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExhYmVsIGhhbmRsZXIsIGZpbmFsIFN0cmluZyB0eXBlKSB7CisgICAgICAgICsraGFuZGxlckNvdW50OworICAgICAgICBIYW5kbGVyIGggPSBuZXcgSGFuZGxlcigpOworICAgICAgICBoLnN0YXJ0ID0gc3RhcnQ7CisgICAgICAgIGguZW5kID0gZW5kOworICAgICAgICBoLmhhbmRsZXIgPSBoYW5kbGVyOworICAgICAgICBoLmRlc2MgPSB0eXBlOworICAgICAgICBoLnR5cGUgPSB0eXBlICE9IG51bGwgPyBjdy5uZXdDbGFzcyh0eXBlKSA6IDA7CisgICAgICAgIGlmIChsYXN0SGFuZGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICBmaXJzdEhhbmRsZXIgPSBoOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGFzdEhhbmRsZXIubmV4dCA9IGg7CisgICAgICAgIH0KKyAgICAgICAgbGFzdEhhbmRsZXIgPSBoOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBbm5vdGF0aW9uVmlzaXRvciB2aXNpdFRyeUNhdGNoQW5ub3RhdGlvbihpbnQgdHlwZVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZVBhdGggdHlwZVBhdGgsIFN0cmluZyBkZXNjLCBib29sZWFuIHZpc2libGUpIHsKKyAgICAgICAgaWYgKCFDbGFzc1JlYWRlci5BTk5PVEFUSU9OUykgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgQnl0ZVZlY3RvciBidiA9IG5ldyBCeXRlVmVjdG9yKCk7CisgICAgICAgIC8vIHdyaXRlIHRhcmdldF90eXBlIGFuZCB0YXJnZXRfaW5mbworICAgICAgICBBbm5vdGF0aW9uV3JpdGVyLnB1dFRhcmdldCh0eXBlUmVmLCB0eXBlUGF0aCwgYnYpOworICAgICAgICAvLyB3cml0ZSB0eXBlLCBhbmQgcmVzZXJ2ZSBzcGFjZSBmb3IgdmFsdWVzIGNvdW50CisgICAgICAgIGJ2LnB1dFNob3J0KGN3Lm5ld1VURjgoZGVzYykpLnB1dFNob3J0KDApOworICAgICAgICBBbm5vdGF0aW9uV3JpdGVyIGF3ID0gbmV3IEFubm90YXRpb25Xcml0ZXIoY3csIHRydWUsIGJ2LCBidiwKKyAgICAgICAgICAgICAgICBidi5sZW5ndGggLSAyKTsKKyAgICAgICAgaWYgKHZpc2libGUpIHsKKyAgICAgICAgICAgIGF3Lm5leHQgPSBjdGFubnM7CisgICAgICAgICAgICBjdGFubnMgPSBhdzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF3Lm5leHQgPSBpY3Rhbm5zOworICAgICAgICAgICAgaWN0YW5ucyA9IGF3OworICAgICAgICB9CisgICAgICAgIHJldHVybiBhdzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExvY2FsVmFyaWFibGUoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyBkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc2lnbmF0dXJlLCBmaW5hbCBMYWJlbCBzdGFydCwgZmluYWwgTGFiZWwgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXgpIHsKKyAgICAgICAgaWYgKHNpZ25hdHVyZSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobG9jYWxWYXJUeXBlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBsb2NhbFZhclR5cGUgPSBuZXcgQnl0ZVZlY3RvcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKytsb2NhbFZhclR5cGVDb3VudDsKKyAgICAgICAgICAgIGxvY2FsVmFyVHlwZS5wdXRTaG9ydChzdGFydC5wb3NpdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5wdXRTaG9ydChlbmQucG9zaXRpb24gLSBzdGFydC5wb3NpdGlvbikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5wdXRTaG9ydChjdy5uZXdVVEY4KG5hbWUpKS5wdXRTaG9ydChjdy5uZXdVVEY4KHNpZ25hdHVyZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAucHV0U2hvcnQoaW5kZXgpOworICAgICAgICB9CisgICAgICAgIGlmIChsb2NhbFZhciA9PSBudWxsKSB7CisgICAgICAgICAgICBsb2NhbFZhciA9IG5ldyBCeXRlVmVjdG9yKCk7CisgICAgICAgIH0KKyAgICAgICAgKytsb2NhbFZhckNvdW50OworICAgICAgICBsb2NhbFZhci5wdXRTaG9ydChzdGFydC5wb3NpdGlvbikKKyAgICAgICAgICAgICAgICAucHV0U2hvcnQoZW5kLnBvc2l0aW9uIC0gc3RhcnQucG9zaXRpb24pCisgICAgICAgICAgICAgICAgLnB1dFNob3J0KGN3Lm5ld1VURjgobmFtZSkpLnB1dFNob3J0KGN3Lm5ld1VURjgoZGVzYykpCisgICAgICAgICAgICAgICAgLnB1dFNob3J0KGluZGV4KTsKKyAgICAgICAgaWYgKGNvbXB1dGUgIT0gTk9USElORykgeworICAgICAgICAgICAgLy8gdXBkYXRlcyBtYXggbG9jYWxzCisgICAgICAgICAgICBjaGFyIGMgPSBkZXNjLmNoYXJBdCgwKTsKKyAgICAgICAgICAgIGludCBuID0gaW5kZXggKyAoYyA9PSAnSicgfHwgYyA9PSAnRCcgPyAyIDogMSk7CisgICAgICAgICAgICBpZiAobiA+IG1heExvY2FscykgeworICAgICAgICAgICAgICAgIG1heExvY2FscyA9IG47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQW5ub3RhdGlvblZpc2l0b3IgdmlzaXRMb2NhbFZhcmlhYmxlQW5ub3RhdGlvbihpbnQgdHlwZVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlUGF0aCB0eXBlUGF0aCwgTGFiZWxbXSBzdGFydCwgTGFiZWxbXSBlbmQsIGludFtdIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkZXNjLCBib29sZWFuIHZpc2libGUpIHsKKyAgICAgICAgaWYgKCFDbGFzc1JlYWRlci5BTk5PVEFUSU9OUykgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgQnl0ZVZlY3RvciBidiA9IG5ldyBCeXRlVmVjdG9yKCk7CisgICAgICAgIC8vIHdyaXRlIHRhcmdldF90eXBlIGFuZCB0YXJnZXRfaW5mbworICAgICAgICBidi5wdXRCeXRlKHR5cGVSZWYgPj4+IDI0KS5wdXRTaG9ydChzdGFydC5sZW5ndGgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0YXJ0Lmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBidi5wdXRTaG9ydChzdGFydFtpXS5wb3NpdGlvbikKKyAgICAgICAgICAgICAgLnB1dFNob3J0KGVuZFtpXS5wb3NpdGlvbiAtIHN0YXJ0W2ldLnBvc2l0aW9uKQorICAgICAgICAgICAgICAucHV0U2hvcnQoaW5kZXhbaV0pOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlUGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICBidi5wdXRCeXRlKDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50IGxlbmd0aCA9IHR5cGVQYXRoLmJbdHlwZVBhdGgub2Zmc2V0XSAqIDIgKyAxOworICAgICAgICAgICAgYnYucHV0Qnl0ZUFycmF5KHR5cGVQYXRoLmIsIHR5cGVQYXRoLm9mZnNldCwgbGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgICAvLyB3cml0ZSB0eXBlLCBhbmQgcmVzZXJ2ZSBzcGFjZSBmb3IgdmFsdWVzIGNvdW50CisgICAgICAgIGJ2LnB1dFNob3J0KGN3Lm5ld1VURjgoZGVzYykpLnB1dFNob3J0KDApOworICAgICAgICBBbm5vdGF0aW9uV3JpdGVyIGF3ID0gbmV3IEFubm90YXRpb25Xcml0ZXIoY3csIHRydWUsIGJ2LCBidiwKKyAgICAgICAgICAgICAgICBidi5sZW5ndGggLSAyKTsKKyAgICAgICAgaWYgKHZpc2libGUpIHsKKyAgICAgICAgICAgIGF3Lm5leHQgPSBjdGFubnM7CisgICAgICAgICAgICBjdGFubnMgPSBhdzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF3Lm5leHQgPSBpY3Rhbm5zOworICAgICAgICAgICAgaWN0YW5ucyA9IGF3OworICAgICAgICB9CisgICAgICAgIHJldHVybiBhdzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdExpbmVOdW1iZXIoZmluYWwgaW50IGxpbmUsIGZpbmFsIExhYmVsIHN0YXJ0KSB7CisgICAgICAgIGlmIChsaW5lTnVtYmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIGxpbmVOdW1iZXIgPSBuZXcgQnl0ZVZlY3RvcigpOworICAgICAgICB9CisgICAgICAgICsrbGluZU51bWJlckNvdW50OworICAgICAgICBsaW5lTnVtYmVyLnB1dFNob3J0KHN0YXJ0LnBvc2l0aW9uKTsKKyAgICAgICAgbGluZU51bWJlci5wdXRTaG9ydChsaW5lKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdE1heHMoZmluYWwgaW50IG1heFN0YWNrLCBmaW5hbCBpbnQgbWF4TG9jYWxzKSB7CisgICAgICAgIGlmIChyZXNpemUpIHsKKyAgICAgICAgICAgIC8vIHJlcGxhY2VzIHRoZSB0ZW1wb3JhcnkganVtcCBvcGNvZGVzIGludHJvZHVjZWQgYnkgTGFiZWwucmVzb2x2ZS4KKyAgICAgICAgICAgIGlmIChDbGFzc1JlYWRlci5SRVNJWkUpIHsKKyAgICAgICAgICAgICAgICByZXNpemVJbnN0cnVjdGlvbnMoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIk1ldGhvZCBjb2RlIHRvbyBsYXJnZSEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoQ2xhc3NSZWFkZXIuRlJBTUVTICYmIGNvbXB1dGUgPT0gRlJBTUVTKSB7CisgICAgICAgICAgICAvLyBjb21wbGV0ZXMgdGhlIGNvbnRyb2wgZmxvdyBncmFwaCB3aXRoIGV4Y2VwdGlvbiBoYW5kbGVyIGJsb2NrcworICAgICAgICAgICAgSGFuZGxlciBoYW5kbGVyID0gZmlyc3RIYW5kbGVyOworICAgICAgICAgICAgd2hpbGUgKGhhbmRsZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExhYmVsIGwgPSBoYW5kbGVyLnN0YXJ0LmdldEZpcnN0KCk7CisgICAgICAgICAgICAgICAgTGFiZWwgaCA9IGhhbmRsZXIuaGFuZGxlci5nZXRGaXJzdCgpOworICAgICAgICAgICAgICAgIExhYmVsIGUgPSBoYW5kbGVyLmVuZC5nZXRGaXJzdCgpOworICAgICAgICAgICAgICAgIC8vIGNvbXB1dGVzIHRoZSBraW5kIG9mIHRoZSBlZGdlcyB0byAnaCcKKyAgICAgICAgICAgICAgICBTdHJpbmcgdCA9IGhhbmRsZXIuZGVzYyA9PSBudWxsID8gImphdmEvbGFuZy9UaHJvd2FibGUiCisgICAgICAgICAgICAgICAgICAgICAgICA6IGhhbmRsZXIuZGVzYzsKKyAgICAgICAgICAgICAgICBpbnQga2luZCA9IEZyYW1lLk9CSkVDVCB8IGN3LmFkZFR5cGUodCk7CisgICAgICAgICAgICAgICAgLy8gaCBpcyBhbiBleGNlcHRpb24gaGFuZGxlcgorICAgICAgICAgICAgICAgIGguc3RhdHVzIHw9IExhYmVsLlRBUkdFVDsKKyAgICAgICAgICAgICAgICAvLyBhZGRzICdoJyBhcyBhIHN1Y2Nlc3NvciBvZiBsYWJlbHMgYmV0d2VlbiAnc3RhcnQnIGFuZCAnZW5kJworICAgICAgICAgICAgICAgIHdoaWxlIChsICE9IGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlcyBhbiBlZGdlIHRvICdoJworICAgICAgICAgICAgICAgICAgICBFZGdlIGIgPSBuZXcgRWRnZSgpOworICAgICAgICAgICAgICAgICAgICBiLmluZm8gPSBraW5kOworICAgICAgICAgICAgICAgICAgICBiLnN1Y2Nlc3NvciA9IGg7CisgICAgICAgICAgICAgICAgICAgIC8vIGFkZHMgaXQgdG8gdGhlIHN1Y2Nlc3NvcnMgb2YgJ2wnCisgICAgICAgICAgICAgICAgICAgIGIubmV4dCA9IGwuc3VjY2Vzc29yczsKKyAgICAgICAgICAgICAgICAgICAgbC5zdWNjZXNzb3JzID0gYjsKKyAgICAgICAgICAgICAgICAgICAgLy8gZ29lcyB0byB0aGUgbmV4dCBsYWJlbAorICAgICAgICAgICAgICAgICAgICBsID0gbC5zdWNjZXNzb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGhhbmRsZXIgPSBoYW5kbGVyLm5leHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGNyZWF0ZXMgYW5kIHZpc2l0cyB0aGUgZmlyc3QgKGltcGxpY2l0KSBmcmFtZQorICAgICAgICAgICAgRnJhbWUgZiA9IGxhYmVscy5mcmFtZTsKKyAgICAgICAgICAgIFR5cGVbXSBhcmdzID0gVHlwZS5nZXRBcmd1bWVudFR5cGVzKGRlc2NyaXB0b3IpOworICAgICAgICAgICAgZi5pbml0SW5wdXRGcmFtZShjdywgYWNjZXNzLCBhcmdzLCB0aGlzLm1heExvY2Fscyk7CisgICAgICAgICAgICB2aXNpdEZyYW1lKGYpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogZml4IHBvaW50IGFsZ29yaXRobTogbWFyayB0aGUgZmlyc3QgYmFzaWMgYmxvY2sgYXMgJ2NoYW5nZWQnCisgICAgICAgICAgICAgKiAoaS5lLiBwdXQgaXQgaW4gdGhlICdjaGFuZ2VkJyBsaXN0KSBhbmQsIHdoaWxlIHRoZXJlIGFyZSBjaGFuZ2VkCisgICAgICAgICAgICAgKiBiYXNpYyBibG9ja3MsIGNob29zZSBvbmUsIG1hcmsgaXQgYXMgdW5jaGFuZ2VkLCBhbmQgdXBkYXRlIGl0cworICAgICAgICAgICAgICogc3VjY2Vzc29ycyAod2hpY2ggY2FuIGJlIGNoYW5nZWQgaW4gdGhlIHByb2Nlc3MpLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpbnQgbWF4ID0gMDsKKyAgICAgICAgICAgIExhYmVsIGNoYW5nZWQgPSBsYWJlbHM7CisgICAgICAgICAgICB3aGlsZSAoY2hhbmdlZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gcmVtb3ZlcyBhIGJhc2ljIGJsb2NrIGZyb20gdGhlIGxpc3Qgb2YgY2hhbmdlZCBiYXNpYyBibG9ja3MKKyAgICAgICAgICAgICAgICBMYWJlbCBsID0gY2hhbmdlZDsKKyAgICAgICAgICAgICAgICBjaGFuZ2VkID0gY2hhbmdlZC5uZXh0OworICAgICAgICAgICAgICAgIGwubmV4dCA9IG51bGw7CisgICAgICAgICAgICAgICAgZiA9IGwuZnJhbWU7CisgICAgICAgICAgICAgICAgLy8gYSByZWFjaGFibGUganVtcCB0YXJnZXQgbXVzdCBiZSBzdG9yZWQgaW4gdGhlIHN0YWNrIG1hcAorICAgICAgICAgICAgICAgIGlmICgobC5zdGF0dXMgJiBMYWJlbC5UQVJHRVQpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbC5zdGF0dXMgfD0gTGFiZWwuU1RPUkU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGFsbCB2aXNpdGVkIGxhYmVscyBhcmUgcmVhY2hhYmxlLCBieSBkZWZpbml0aW9uCisgICAgICAgICAgICAgICAgbC5zdGF0dXMgfD0gTGFiZWwuUkVBQ0hBQkxFOworICAgICAgICAgICAgICAgIC8vIHVwZGF0ZXMgdGhlIChhYnNvbHV0ZSkgbWF4aW11bSBzdGFjayBzaXplCisgICAgICAgICAgICAgICAgaW50IGJsb2NrTWF4ID0gZi5pbnB1dFN0YWNrLmxlbmd0aCArIGwub3V0cHV0U3RhY2tNYXg7CisgICAgICAgICAgICAgICAgaWYgKGJsb2NrTWF4ID4gbWF4KSB7CisgICAgICAgICAgICAgICAgICAgIG1heCA9IGJsb2NrTWF4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyB1cGRhdGVzIHRoZSBzdWNjZXNzb3JzIG9mIHRoZSBjdXJyZW50IGJhc2ljIGJsb2NrCisgICAgICAgICAgICAgICAgRWRnZSBlID0gbC5zdWNjZXNzb3JzOworICAgICAgICAgICAgICAgIHdoaWxlIChlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgTGFiZWwgbiA9IGUuc3VjY2Vzc29yLmdldEZpcnN0KCk7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gY2hhbmdlID0gZi5tZXJnZShjdywgbi5mcmFtZSwgZS5pbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5nZSAmJiBuLm5leHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgbiBoYXMgY2hhbmdlZCBhbmQgaXMgbm90IGFscmVhZHkgaW4gdGhlICdjaGFuZ2VkJworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGlzdCwgYWRkcyBpdCB0byB0aGlzIGxpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgIG4ubmV4dCA9IGNoYW5nZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gbjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlID0gZS5uZXh0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gdmlzaXRzIGFsbCB0aGUgZnJhbWVzIHRoYXQgbXVzdCBiZSBzdG9yZWQgaW4gdGhlIHN0YWNrIG1hcAorICAgICAgICAgICAgTGFiZWwgbCA9IGxhYmVsczsKKyAgICAgICAgICAgIHdoaWxlIChsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmID0gbC5mcmFtZTsKKyAgICAgICAgICAgICAgICBpZiAoKGwuc3RhdHVzICYgTGFiZWwuU1RPUkUpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdmlzaXRGcmFtZShmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKChsLnN0YXR1cyAmIExhYmVsLlJFQUNIQUJMRSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBmaW5kcyBzdGFydCBhbmQgZW5kIG9mIGRlYWQgYmFzaWMgYmxvY2sKKyAgICAgICAgICAgICAgICAgICAgTGFiZWwgayA9IGwuc3VjY2Vzc29yOworICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQgPSBsLnBvc2l0aW9uOworICAgICAgICAgICAgICAgICAgICBpbnQgZW5kID0gKGsgPT0gbnVsbCA/IGNvZGUubGVuZ3RoIDogay5wb3NpdGlvbikgLSAxOworICAgICAgICAgICAgICAgICAgICAvLyBpZiBub24gZW1wdHkgYmFzaWMgYmxvY2sKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVuZCA+PSBzdGFydCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWF4ID0gTWF0aC5tYXgobWF4LCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxhY2VzIGluc3RydWN0aW9ucyB3aXRoIE5PUCAuLi4gTk9QIEFUSFJPVworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlLmRhdGFbaV0gPSBPcGNvZGVzLk5PUDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUuZGF0YVtlbmRdID0gKGJ5dGUpIE9wY29kZXMuQVRIUk9XOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW1pdHMgYSBmcmFtZSBmb3IgdGhpcyB1bnJlYWNoYWJsZSBibG9jaworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lSW5kZXggPSBzdGFydEZyYW1lKHN0YXJ0LCAwLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lW2ZyYW1lSW5kZXhdID0gRnJhbWUuT0JKRUNUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY3cuYWRkVHlwZSgiamF2YS9sYW5nL1Rocm93YWJsZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgZW5kRnJhbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZXMgdGhlIHN0YXJ0LWVuZCByYW5nZSBmcm9tIHRoZSBleGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZXJzCisgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdEhhbmRsZXIgPSBIYW5kbGVyLnJlbW92ZShmaXJzdEhhbmRsZXIsIGwsIGspOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGwgPSBsLnN1Y2Nlc3NvcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaGFuZGxlciA9IGZpcnN0SGFuZGxlcjsKKyAgICAgICAgICAgIGhhbmRsZXJDb3VudCA9IDA7CisgICAgICAgICAgICB3aGlsZSAoaGFuZGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlckNvdW50ICs9IDE7CisgICAgICAgICAgICAgICAgaGFuZGxlciA9IGhhbmRsZXIubmV4dDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy5tYXhTdGFjayA9IG1heDsKKyAgICAgICAgfSBlbHNlIGlmIChjb21wdXRlID09IE1BWFMpIHsKKyAgICAgICAgICAgIC8vIGNvbXBsZXRlcyB0aGUgY29udHJvbCBmbG93IGdyYXBoIHdpdGggZXhjZXB0aW9uIGhhbmRsZXIgYmxvY2tzCisgICAgICAgICAgICBIYW5kbGVyIGhhbmRsZXIgPSBmaXJzdEhhbmRsZXI7CisgICAgICAgICAgICB3aGlsZSAoaGFuZGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgTGFiZWwgbCA9IGhhbmRsZXIuc3RhcnQ7CisgICAgICAgICAgICAgICAgTGFiZWwgaCA9IGhhbmRsZXIuaGFuZGxlcjsKKyAgICAgICAgICAgICAgICBMYWJlbCBlID0gaGFuZGxlci5lbmQ7CisgICAgICAgICAgICAgICAgLy8gYWRkcyAnaCcgYXMgYSBzdWNjZXNzb3Igb2YgbGFiZWxzIGJldHdlZW4gJ3N0YXJ0JyBhbmQgJ2VuZCcKKyAgICAgICAgICAgICAgICB3aGlsZSAobCAhPSBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZXMgYW4gZWRnZSB0byAnaCcKKyAgICAgICAgICAgICAgICAgICAgRWRnZSBiID0gbmV3IEVkZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgYi5pbmZvID0gRWRnZS5FWENFUFRJT047CisgICAgICAgICAgICAgICAgICAgIGIuc3VjY2Vzc29yID0gaDsKKyAgICAgICAgICAgICAgICAgICAgLy8gYWRkcyBpdCB0byB0aGUgc3VjY2Vzc29ycyBvZiAnbCcKKyAgICAgICAgICAgICAgICAgICAgaWYgKChsLnN0YXR1cyAmIExhYmVsLkpTUikgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYi5uZXh0ID0gbC5zdWNjZXNzb3JzOworICAgICAgICAgICAgICAgICAgICAgICAgbC5zdWNjZXNzb3JzID0gYjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGwgaXMgYSBKU1IgYmxvY2ssIGFkZHMgYiBhZnRlciB0aGUgZmlyc3QgdHdvIGVkZ2VzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBwcmVzZXJ2ZSB0aGUgaHlwb3RoZXNpcyBhYm91dCBKU1IgYmxvY2sgc3VjY2Vzc29ycworICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3JkZXIgKHNlZSB7QGxpbmsgI3Zpc2l0SnVtcEluc259KQorICAgICAgICAgICAgICAgICAgICAgICAgYi5uZXh0ID0gbC5zdWNjZXNzb3JzLm5leHQubmV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGwuc3VjY2Vzc29ycy5uZXh0Lm5leHQgPSBiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGdvZXMgdG8gdGhlIG5leHQgbGFiZWwKKyAgICAgICAgICAgICAgICAgICAgbCA9IGwuc3VjY2Vzc29yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBoYW5kbGVyID0gaGFuZGxlci5uZXh0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc3Vicm91dGluZXMgPiAwKSB7CisgICAgICAgICAgICAgICAgLy8gY29tcGxldGVzIHRoZSBjb250cm9sIGZsb3cgZ3JhcGggd2l0aCB0aGUgUkVUIHN1Y2Nlc3NvcnMKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIGZpcnN0IHN0ZXA6IGZpbmRzIHRoZSBzdWJyb3V0aW5lcy4gVGhpcyBzdGVwIGRldGVybWluZXMsIGZvcgorICAgICAgICAgICAgICAgICAqIGVhY2ggYmFzaWMgYmxvY2ssIHRvIHdoaWNoIHN1YnJvdXRpbmUocykgaXQgYmVsb25ncy4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAvLyBmaW5kcyB0aGUgYmFzaWMgYmxvY2tzIHRoYXQgYmVsb25nIHRvIHRoZSAibWFpbiIgc3Vicm91dGluZQorICAgICAgICAgICAgICAgIGludCBpZCA9IDA7CisgICAgICAgICAgICAgICAgbGFiZWxzLnZpc2l0U3Vicm91dGluZShudWxsLCAxLCBzdWJyb3V0aW5lcyk7CisgICAgICAgICAgICAgICAgLy8gZmluZHMgdGhlIGJhc2ljIGJsb2NrcyB0aGF0IGJlbG9uZyB0byB0aGUgcmVhbCBzdWJyb3V0aW5lcworICAgICAgICAgICAgICAgIExhYmVsIGwgPSBsYWJlbHM7CisgICAgICAgICAgICAgICAgd2hpbGUgKGwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKGwuc3RhdHVzICYgTGFiZWwuSlNSKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc3Vicm91dGluZSBpcyBkZWZpbmVkIGJ5IGwncyBUQVJHRVQsIG5vdCBieSBsCisgICAgICAgICAgICAgICAgICAgICAgICBMYWJlbCBzdWJyb3V0aW5lID0gbC5zdWNjZXNzb3JzLm5leHQuc3VjY2Vzc29yOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBzdWJyb3V0aW5lIGhhcyBub3QgYmVlbiB2aXNpdGVkIHlldC4uLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzdWJyb3V0aW5lLnN0YXR1cyAmIExhYmVsLlZJU0lURUQpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi5hc3NpZ25zIGl0IGEgbmV3IGlkIGFuZCBmaW5kcyBpdHMgYmFzaWMgYmxvY2tzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgKz0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJyb3V0aW5lLnZpc2l0U3Vicm91dGluZShudWxsLCAoaWQgLyAzMkwpIDw8IDMyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoMUwgPDwgKGlkICUgMzIpKSwgc3Vicm91dGluZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGwgPSBsLnN1Y2Nlc3NvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gc2Vjb25kIHN0ZXA6IGZpbmRzIHRoZSBzdWNjZXNzb3JzIG9mIFJFVCBibG9ja3MKKyAgICAgICAgICAgICAgICBsID0gbGFiZWxzOworICAgICAgICAgICAgICAgIHdoaWxlIChsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChsLnN0YXR1cyAmIExhYmVsLkpTUikgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTGFiZWwgTCA9IGxhYmVsczsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChMICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMLnN0YXR1cyAmPSB+TGFiZWwuVklTSVRFRDI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCA9IEwuc3VjY2Vzc29yOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHN1YnJvdXRpbmUgaXMgZGVmaW5lZCBieSBsJ3MgVEFSR0VULCBub3QgYnkgbAorICAgICAgICAgICAgICAgICAgICAgICAgTGFiZWwgc3Vicm91dGluZSA9IGwuc3VjY2Vzc29ycy5uZXh0LnN1Y2Nlc3NvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1YnJvdXRpbmUudmlzaXRTdWJyb3V0aW5lKGwsIDAsIHN1YnJvdXRpbmVzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBsID0gbC5zdWNjZXNzb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogY29udHJvbCBmbG93IGFuYWx5c2lzIGFsZ29yaXRobTogd2hpbGUgdGhlIGJsb2NrIHN0YWNrIGlzIG5vdAorICAgICAgICAgICAgICogZW1wdHksIHBvcCBhIGJsb2NrIGZyb20gdGhpcyBzdGFjaywgdXBkYXRlIHRoZSBtYXggc3RhY2sgc2l6ZSwKKyAgICAgICAgICAgICAqIGNvbXB1dGUgdGhlIHRydWUgKG5vbiByZWxhdGl2ZSkgYmVnaW4gc3RhY2sgc2l6ZSBvZiB0aGUKKyAgICAgICAgICAgICAqIHN1Y2Nlc3NvcnMgb2YgdGhpcyBibG9jaywgYW5kIHB1c2ggdGhlc2Ugc3VjY2Vzc29ycyBvbnRvIHRoZQorICAgICAgICAgICAgICogc3RhY2sgKHVubGVzcyB0aGV5IGhhdmUgYWxyZWFkeSBiZWVuIHB1c2hlZCBvbnRvIHRoZSBzdGFjaykuCisgICAgICAgICAgICAgKiBOb3RlOiBieSBoeXBvdGhlc2lzLCB0aGUge0BsaW5rIExhYmVsI2lucHV0U3RhY2tUb3B9IG9mIHRoZQorICAgICAgICAgICAgICogYmxvY2tzIGluIHRoZSBibG9jayBzdGFjayBhcmUgdGhlIHRydWUgKG5vbiByZWxhdGl2ZSkgYmVnaW5uaW5nCisgICAgICAgICAgICAgKiBzdGFjayBzaXplcyBvZiB0aGVzZSBibG9ja3MuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGludCBtYXggPSAwOworICAgICAgICAgICAgTGFiZWwgc3RhY2sgPSBsYWJlbHM7CisgICAgICAgICAgICB3aGlsZSAoc3RhY2sgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIHBvcHMgYSBibG9jayBmcm9tIHRoZSBzdGFjaworICAgICAgICAgICAgICAgIExhYmVsIGwgPSBzdGFjazsKKyAgICAgICAgICAgICAgICBzdGFjayA9IHN0YWNrLm5leHQ7CisgICAgICAgICAgICAgICAgLy8gY29tcHV0ZXMgdGhlIHRydWUgKG5vbiByZWxhdGl2ZSkgbWF4IHN0YWNrIHNpemUgb2YgdGhpcyBibG9jaworICAgICAgICAgICAgICAgIGludCBzdGFydCA9IGwuaW5wdXRTdGFja1RvcDsKKyAgICAgICAgICAgICAgICBpbnQgYmxvY2tNYXggPSBzdGFydCArIGwub3V0cHV0U3RhY2tNYXg7CisgICAgICAgICAgICAgICAgLy8gdXBkYXRlcyB0aGUgZ2xvYmFsIG1heCBzdGFjayBzaXplCisgICAgICAgICAgICAgICAgaWYgKGJsb2NrTWF4ID4gbWF4KSB7CisgICAgICAgICAgICAgICAgICAgIG1heCA9IGJsb2NrTWF4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBhbmFseXplcyB0aGUgc3VjY2Vzc29ycyBvZiB0aGUgYmxvY2sKKyAgICAgICAgICAgICAgICBFZGdlIGIgPSBsLnN1Y2Nlc3NvcnM7CisgICAgICAgICAgICAgICAgaWYgKChsLnN0YXR1cyAmIExhYmVsLkpTUikgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmVzIHRoZSBmaXJzdCBlZGdlIG9mIEpTUiBibG9ja3MgKHZpcnR1YWwgc3VjY2Vzc29yKQorICAgICAgICAgICAgICAgICAgICBiID0gYi5uZXh0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3aGlsZSAoYiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGwgPSBiLnN1Y2Nlc3NvcjsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBzdWNjZXNzb3IgaGFzIG5vdCBhbHJlYWR5IGJlZW4gcHVzaGVkLi4uCisgICAgICAgICAgICAgICAgICAgIGlmICgobC5zdGF0dXMgJiBMYWJlbC5QVVNIRUQpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXB1dGVzIGl0cyB0cnVlIGJlZ2lubmluZyBzdGFjayBzaXplLi4uCisgICAgICAgICAgICAgICAgICAgICAgICBsLmlucHV0U3RhY2tUb3AgPSBiLmluZm8gPT0gRWRnZS5FWENFUFRJT04gPyAxIDogc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGIuaW5mbzsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uLmFuZCBwdXNoZXMgaXQgb250byB0aGUgc3RhY2sKKyAgICAgICAgICAgICAgICAgICAgICAgIGwuc3RhdHVzIHw9IExhYmVsLlBVU0hFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGwubmV4dCA9IHN0YWNrOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sgPSBsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGIgPSBiLm5leHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcy5tYXhTdGFjayA9IE1hdGgubWF4KG1heFN0YWNrLCBtYXgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5tYXhTdGFjayA9IG1heFN0YWNrOworICAgICAgICAgICAgdGhpcy5tYXhMb2NhbHMgPSBtYXhMb2NhbHM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdEVuZCgpIHsKKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBVdGlsaXR5IG1ldGhvZHM6IGNvbnRyb2wgZmxvdyBhbmFseXNpcyBhbGdvcml0aG0KKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBzdWNjZXNzb3IgdG8gdGhlIHtAbGluayAjY3VycmVudEJsb2NrIGN1cnJlbnRCbG9ja30gYmxvY2suCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5mbworICAgICAqICAgICAgICAgICAgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbnRyb2wgZmxvdyBlZGdlIHRvIGJlIGFkZGVkLgorICAgICAqIEBwYXJhbSBzdWNjZXNzb3IKKyAgICAgKiAgICAgICAgICAgIHRoZSBzdWNjZXNzb3IgYmxvY2sgdG8gYmUgYWRkZWQgdG8gdGhlIGN1cnJlbnQgYmxvY2suCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFkZFN1Y2Nlc3NvcihmaW5hbCBpbnQgaW5mbywgZmluYWwgTGFiZWwgc3VjY2Vzc29yKSB7CisgICAgICAgIC8vIGNyZWF0ZXMgYW5kIGluaXRpYWxpemVzIGFuIEVkZ2Ugb2JqZWN0Li4uCisgICAgICAgIEVkZ2UgYiA9IG5ldyBFZGdlKCk7CisgICAgICAgIGIuaW5mbyA9IGluZm87CisgICAgICAgIGIuc3VjY2Vzc29yID0gc3VjY2Vzc29yOworICAgICAgICAvLyAuLi5hbmQgYWRkcyBpdCB0byB0aGUgc3VjY2Vzc29yIGxpc3Qgb2YgdGhlIGN1cnJlbnRCbG9jayBibG9jaworICAgICAgICBiLm5leHQgPSBjdXJyZW50QmxvY2suc3VjY2Vzc29yczsKKyAgICAgICAgY3VycmVudEJsb2NrLnN1Y2Nlc3NvcnMgPSBiOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuZHMgdGhlIGN1cnJlbnQgYmFzaWMgYmxvY2suIFRoaXMgbWV0aG9kIG11c3QgYmUgdXNlZCBpbiB0aGUgY2FzZSB3aGVyZQorICAgICAqIHRoZSBjdXJyZW50IGJhc2ljIGJsb2NrIGRvZXMgbm90IGhhdmUgYW55IHN1Y2Nlc3Nvci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgbm9TdWNjZXNzb3IoKSB7CisgICAgICAgIGlmIChjb21wdXRlID09IEZSQU1FUykgeworICAgICAgICAgICAgTGFiZWwgbCA9IG5ldyBMYWJlbCgpOworICAgICAgICAgICAgbC5mcmFtZSA9IG5ldyBGcmFtZSgpOworICAgICAgICAgICAgbC5mcmFtZS5vd25lciA9IGw7CisgICAgICAgICAgICBsLnJlc29sdmUodGhpcywgY29kZS5sZW5ndGgsIGNvZGUuZGF0YSk7CisgICAgICAgICAgICBwcmV2aW91c0Jsb2NrLnN1Y2Nlc3NvciA9IGw7CisgICAgICAgICAgICBwcmV2aW91c0Jsb2NrID0gbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGN1cnJlbnRCbG9jay5vdXRwdXRTdGFja01heCA9IG1heFN0YWNrU2l6ZTsKKyAgICAgICAgfQorICAgICAgICBjdXJyZW50QmxvY2sgPSBudWxsOworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIFV0aWxpdHkgbWV0aG9kczogc3RhY2sgbWFwIGZyYW1lcworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqCisgICAgICogVmlzaXRzIGEgZnJhbWUgdGhhdCBoYXMgYmVlbiBjb21wdXRlZCBmcm9tIHNjcmF0Y2guCisgICAgICoKKyAgICAgKiBAcGFyYW0gZgorICAgICAqICAgICAgICAgICAgdGhlIGZyYW1lIHRoYXQgbXVzdCBiZSB2aXNpdGVkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB2aXNpdEZyYW1lKGZpbmFsIEZyYW1lIGYpIHsKKyAgICAgICAgaW50IGksIHQ7CisgICAgICAgIGludCBuVG9wID0gMDsKKyAgICAgICAgaW50IG5Mb2NhbCA9IDA7CisgICAgICAgIGludCBuU3RhY2sgPSAwOworICAgICAgICBpbnRbXSBsb2NhbHMgPSBmLmlucHV0TG9jYWxzOworICAgICAgICBpbnRbXSBzdGFja3MgPSBmLmlucHV0U3RhY2s7CisgICAgICAgIC8vIGNvbXB1dGVzIHRoZSBudW1iZXIgb2YgbG9jYWxzIChpZ25vcmVzIFRPUCB0eXBlcyB0aGF0IGFyZSBqdXN0IGFmdGVyCisgICAgICAgIC8vIGEgTE9ORyBvciBhIERPVUJMRSwgYW5kIGFsbCB0cmFpbGluZyBUT1AgdHlwZXMpCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBsb2NhbHMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIHQgPSBsb2NhbHNbaV07CisgICAgICAgICAgICBpZiAodCA9PSBGcmFtZS5UT1ApIHsKKyAgICAgICAgICAgICAgICArK25Ub3A7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG5Mb2NhbCArPSBuVG9wICsgMTsKKyAgICAgICAgICAgICAgICBuVG9wID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0ID09IEZyYW1lLkxPTkcgfHwgdCA9PSBGcmFtZS5ET1VCTEUpIHsKKyAgICAgICAgICAgICAgICArK2k7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gY29tcHV0ZXMgdGhlIHN0YWNrIHNpemUgKGlnbm9yZXMgVE9QIHR5cGVzIHRoYXQgYXJlIGp1c3QgYWZ0ZXIKKyAgICAgICAgLy8gYSBMT05HIG9yIGEgRE9VQkxFKQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc3RhY2tzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICB0ID0gc3RhY2tzW2ldOworICAgICAgICAgICAgKytuU3RhY2s7CisgICAgICAgICAgICBpZiAodCA9PSBGcmFtZS5MT05HIHx8IHQgPT0gRnJhbWUuRE9VQkxFKSB7CisgICAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIHZpc2l0cyB0aGUgZnJhbWUgYW5kIGl0cyBjb250ZW50CisgICAgICAgIGludCBmcmFtZUluZGV4ID0gc3RhcnRGcmFtZShmLm93bmVyLnBvc2l0aW9uLCBuTG9jYWwsIG5TdGFjayk7CisgICAgICAgIGZvciAoaSA9IDA7IG5Mb2NhbCA+IDA7ICsraSwgLS1uTG9jYWwpIHsKKyAgICAgICAgICAgIHQgPSBsb2NhbHNbaV07CisgICAgICAgICAgICBmcmFtZVtmcmFtZUluZGV4KytdID0gdDsKKyAgICAgICAgICAgIGlmICh0ID09IEZyYW1lLkxPTkcgfHwgdCA9PSBGcmFtZS5ET1VCTEUpIHsKKyAgICAgICAgICAgICAgICArK2k7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IHN0YWNrcy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgdCA9IHN0YWNrc1tpXTsKKyAgICAgICAgICAgIGZyYW1lW2ZyYW1lSW5kZXgrK10gPSB0OworICAgICAgICAgICAgaWYgKHQgPT0gRnJhbWUuTE9ORyB8fCB0ID09IEZyYW1lLkRPVUJMRSkgeworICAgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbmRGcmFtZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZpc2l0IHRoZSBpbXBsaWNpdCBmaXJzdCBmcmFtZSBvZiB0aGlzIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgdmlzaXRJbXBsaWNpdEZpcnN0RnJhbWUoKSB7CisgICAgICAgIC8vIFRoZXJlIGNhbiBiZSBhdCBtb3N0IGRlc2NyaXB0b3IubGVuZ3RoKCkgKyAxIGxvY2FscworICAgICAgICBpbnQgZnJhbWVJbmRleCA9IHN0YXJ0RnJhbWUoMCwgZGVzY3JpcHRvci5sZW5ndGgoKSArIDEsIDApOworICAgICAgICBpZiAoKGFjY2VzcyAmIE9wY29kZXMuQUNDX1NUQVRJQykgPT0gMCkgeworICAgICAgICAgICAgaWYgKChhY2Nlc3MgJiBBQ0NfQ09OU1RSVUNUT1IpID09IDApIHsKKyAgICAgICAgICAgICAgICBmcmFtZVtmcmFtZUluZGV4KytdID0gRnJhbWUuT0JKRUNUIHwgY3cuYWRkVHlwZShjdy50aGlzTmFtZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZyYW1lW2ZyYW1lSW5kZXgrK10gPSA2OyAvLyBPcGNvZGVzLlVOSU5JVElBTElaRURfVEhJUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnQgaSA9IDE7CisgICAgICAgIGxvb3A6IHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpbnQgaiA9IGk7CisgICAgICAgICAgICBzd2l0Y2ggKGRlc2NyaXB0b3IuY2hhckF0KGkrKykpIHsKKyAgICAgICAgICAgICAgICBjYXNlICdaJzoKKyAgICAgICAgICAgICAgICBjYXNlICdDJzoKKyAgICAgICAgICAgICAgICBjYXNlICdCJzoKKyAgICAgICAgICAgICAgICBjYXNlICdTJzoKKyAgICAgICAgICAgICAgICBjYXNlICdJJzoKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVbZnJhbWVJbmRleCsrXSA9IDE7IC8vIE9wY29kZXMuSU5URUdFUjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnRic6CisgICAgICAgICAgICAgICAgICAgIGZyYW1lW2ZyYW1lSW5kZXgrK10gPSAyOyAvLyBPcGNvZGVzLkZMT0FUOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdKJzoKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVbZnJhbWVJbmRleCsrXSA9IDQ7IC8vIE9wY29kZXMuTE9ORzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnRCc6CisgICAgICAgICAgICAgICAgICAgIGZyYW1lW2ZyYW1lSW5kZXgrK10gPSAzOyAvLyBPcGNvZGVzLkRPVUJMRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnWyc6CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChkZXNjcmlwdG9yLmNoYXJBdChpKSA9PSAnWycpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRvci5jaGFyQXQoaSkgPT0gJ0wnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICArK2k7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZGVzY3JpcHRvci5jaGFyQXQoaSkgIT0gJzsnKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZyYW1lW2ZyYW1lSW5kZXgrK10gPSBGcmFtZS5PQkpFQ1QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgY3cuYWRkVHlwZShkZXNjcmlwdG9yLnN1YnN0cmluZyhqLCArK2kpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnTCc6CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChkZXNjcmlwdG9yLmNoYXJBdChpKSAhPSAnOycpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmcmFtZVtmcmFtZUluZGV4KytdID0gRnJhbWUuT0JKRUNUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGN3LmFkZFR5cGUoZGVzY3JpcHRvci5zdWJzdHJpbmcoaiArIDEsIGkrKykpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhayBsb29wOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZyYW1lWzFdID0gZnJhbWVJbmRleCAtIDM7CisgICAgICAgIGVuZEZyYW1lKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnRzIHRoZSB2aXNpdCBvZiBhIHN0YWNrIG1hcCBmcmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvZmZzZXQKKyAgICAgKiAgICAgICAgICAgIHRoZSBvZmZzZXQgb2YgdGhlIGluc3RydWN0aW9uIHRvIHdoaWNoIHRoZSBmcmFtZSBjb3JyZXNwb25kcy4KKyAgICAgKiBAcGFyYW0gbkxvY2FsCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGxvY2FsIHZhcmlhYmxlcyBpbiB0aGUgZnJhbWUuCisgICAgICogQHBhcmFtIG5TdGFjaworICAgICAqICAgICAgICAgICAgdGhlIG51bWJlciBvZiBzdGFjayBlbGVtZW50cyBpbiB0aGUgZnJhbWUuCisgICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgdGhlIG5leHQgZWxlbWVudCB0byBiZSB3cml0dGVuIGluIHRoaXMgZnJhbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgc3RhcnRGcmFtZShmaW5hbCBpbnQgb2Zmc2V0LCBmaW5hbCBpbnQgbkxvY2FsLCBmaW5hbCBpbnQgblN0YWNrKSB7CisgICAgICAgIGludCBuID0gMyArIG5Mb2NhbCArIG5TdGFjazsKKyAgICAgICAgaWYgKGZyYW1lID09IG51bGwgfHwgZnJhbWUubGVuZ3RoIDwgbikgeworICAgICAgICAgICAgZnJhbWUgPSBuZXcgaW50W25dOworICAgICAgICB9CisgICAgICAgIGZyYW1lWzBdID0gb2Zmc2V0OworICAgICAgICBmcmFtZVsxXSA9IG5Mb2NhbDsKKyAgICAgICAgZnJhbWVbMl0gPSBuU3RhY2s7CisgICAgICAgIHJldHVybiAzOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyBpZiB0aGUgdmlzaXQgb2YgdGhlIGN1cnJlbnQgZnJhbWUge0BsaW5rICNmcmFtZX0gaXMgZmluaXNoZWQsIGFuZAorICAgICAqIGlmIHllcywgd3JpdGUgaXQgaW4gdGhlIFN0YWNrTWFwVGFibGUgYXR0cmlidXRlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBlbmRGcmFtZSgpIHsKKyAgICAgICAgaWYgKHByZXZpb3VzRnJhbWUgIT0gbnVsbCkgeyAvLyBkbyBub3Qgd3JpdGUgdGhlIGZpcnN0IGZyYW1lCisgICAgICAgICAgICBpZiAoc3RhY2tNYXAgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHN0YWNrTWFwID0gbmV3IEJ5dGVWZWN0b3IoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHdyaXRlRnJhbWUoKTsKKyAgICAgICAgICAgICsrZnJhbWVDb3VudDsKKyAgICAgICAgfQorICAgICAgICBwcmV2aW91c0ZyYW1lID0gZnJhbWU7CisgICAgICAgIGZyYW1lID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wcmVzcyBhbmQgd3JpdGVzIHRoZSBjdXJyZW50IGZyYW1lIHtAbGluayAjZnJhbWV9IGluIHRoZSBTdGFja01hcFRhYmxlCisgICAgICogYXR0cmlidXRlLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB3cml0ZUZyYW1lKCkgeworICAgICAgICBpbnQgY2xvY2Fsc1NpemUgPSBmcmFtZVsxXTsKKyAgICAgICAgaW50IGNzdGFja1NpemUgPSBmcmFtZVsyXTsKKyAgICAgICAgaWYgKChjdy52ZXJzaW9uICYgMHhGRkZGKSA8IE9wY29kZXMuVjFfNikgeworICAgICAgICAgICAgc3RhY2tNYXAucHV0U2hvcnQoZnJhbWVbMF0pLnB1dFNob3J0KGNsb2NhbHNTaXplKTsKKyAgICAgICAgICAgIHdyaXRlRnJhbWVUeXBlcygzLCAzICsgY2xvY2Fsc1NpemUpOworICAgICAgICAgICAgc3RhY2tNYXAucHV0U2hvcnQoY3N0YWNrU2l6ZSk7CisgICAgICAgICAgICB3cml0ZUZyYW1lVHlwZXMoMyArIGNsb2NhbHNTaXplLCAzICsgY2xvY2Fsc1NpemUgKyBjc3RhY2tTaXplKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpbnQgbG9jYWxzU2l6ZSA9IHByZXZpb3VzRnJhbWVbMV07CisgICAgICAgIGludCB0eXBlID0gRlVMTF9GUkFNRTsKKyAgICAgICAgaW50IGsgPSAwOworICAgICAgICBpbnQgZGVsdGE7CisgICAgICAgIGlmIChmcmFtZUNvdW50ID09IDApIHsKKyAgICAgICAgICAgIGRlbHRhID0gZnJhbWVbMF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZWx0YSA9IGZyYW1lWzBdIC0gcHJldmlvdXNGcmFtZVswXSAtIDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNzdGFja1NpemUgPT0gMCkgeworICAgICAgICAgICAgayA9IGNsb2NhbHNTaXplIC0gbG9jYWxzU2l6ZTsKKyAgICAgICAgICAgIHN3aXRjaCAoaykgeworICAgICAgICAgICAgICAgIGNhc2UgLTM6CisgICAgICAgICAgICAgICAgY2FzZSAtMjoKKyAgICAgICAgICAgICAgICBjYXNlIC0xOgorICAgICAgICAgICAgICAgICAgICB0eXBlID0gQ0hPUF9GUkFNRTsKKyAgICAgICAgICAgICAgICAgICAgbG9jYWxzU2l6ZSA9IGNsb2NhbHNTaXplOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBkZWx0YSA8IDY0ID8gU0FNRV9GUkFNRSA6IFNBTUVfRlJBTUVfRVhURU5ERUQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICB0eXBlID0gQVBQRU5EX0ZSQU1FOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjbG9jYWxzU2l6ZSA9PSBsb2NhbHNTaXplICYmIGNzdGFja1NpemUgPT0gMSkgeworICAgICAgICAgICAgdHlwZSA9IGRlbHRhIDwgNjMgPyBTQU1FX0xPQ0FMU18xX1NUQUNLX0lURU1fRlJBTUUKKyAgICAgICAgICAgICAgICAgICAgOiBTQU1FX0xPQ0FMU18xX1NUQUNLX0lURU1fRlJBTUVfRVhURU5ERUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR5cGUgIT0gRlVMTF9GUkFNRSkgeworICAgICAgICAgICAgLy8gdmVyaWZ5IGlmIGxvY2FscyBhcmUgdGhlIHNhbWUKKyAgICAgICAgICAgIGludCBsID0gMzsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbG9jYWxzU2l6ZTsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKGZyYW1lW2xdICE9IHByZXZpb3VzRnJhbWVbbF0pIHsKKyAgICAgICAgICAgICAgICAgICAgdHlwZSA9IEZVTExfRlJBTUU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICBjYXNlIFNBTUVfRlJBTUU6CisgICAgICAgICAgICAgICAgc3RhY2tNYXAucHV0Qnl0ZShkZWx0YSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNBTUVfTE9DQUxTXzFfU1RBQ0tfSVRFTV9GUkFNRToKKyAgICAgICAgICAgICAgICBzdGFja01hcC5wdXRCeXRlKFNBTUVfTE9DQUxTXzFfU1RBQ0tfSVRFTV9GUkFNRSArIGRlbHRhKTsKKyAgICAgICAgICAgICAgICB3cml0ZUZyYW1lVHlwZXMoMyArIGNsb2NhbHNTaXplLCA0ICsgY2xvY2Fsc1NpemUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTQU1FX0xPQ0FMU18xX1NUQUNLX0lURU1fRlJBTUVfRVhURU5ERUQ6CisgICAgICAgICAgICAgICAgc3RhY2tNYXAucHV0Qnl0ZShTQU1FX0xPQ0FMU18xX1NUQUNLX0lURU1fRlJBTUVfRVhURU5ERUQpLnB1dFNob3J0KAorICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEpOworICAgICAgICAgICAgICAgIHdyaXRlRnJhbWVUeXBlcygzICsgY2xvY2Fsc1NpemUsIDQgKyBjbG9jYWxzU2l6ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNBTUVfRlJBTUVfRVhURU5ERUQ6CisgICAgICAgICAgICAgICAgc3RhY2tNYXAucHV0Qnl0ZShTQU1FX0ZSQU1FX0VYVEVOREVEKS5wdXRTaG9ydChkZWx0YSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENIT1BfRlJBTUU6CisgICAgICAgICAgICAgICAgc3RhY2tNYXAucHV0Qnl0ZShTQU1FX0ZSQU1FX0VYVEVOREVEICsgaykucHV0U2hvcnQoZGVsdGEpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBUFBFTkRfRlJBTUU6CisgICAgICAgICAgICAgICAgc3RhY2tNYXAucHV0Qnl0ZShTQU1FX0ZSQU1FX0VYVEVOREVEICsgaykucHV0U2hvcnQoZGVsdGEpOworICAgICAgICAgICAgICAgIHdyaXRlRnJhbWVUeXBlcygzICsgbG9jYWxzU2l6ZSwgMyArIGNsb2NhbHNTaXplKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIC8vIGNhc2UgRlVMTF9GUkFNRToKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgc3RhY2tNYXAucHV0Qnl0ZShGVUxMX0ZSQU1FKS5wdXRTaG9ydChkZWx0YSkucHV0U2hvcnQoY2xvY2Fsc1NpemUpOworICAgICAgICAgICAgICAgIHdyaXRlRnJhbWVUeXBlcygzLCAzICsgY2xvY2Fsc1NpemUpOworICAgICAgICAgICAgICAgIHN0YWNrTWFwLnB1dFNob3J0KGNzdGFja1NpemUpOworICAgICAgICAgICAgICAgIHdyaXRlRnJhbWVUeXBlcygzICsgY2xvY2Fsc1NpemUsIDMgKyBjbG9jYWxzU2l6ZSArIGNzdGFja1NpemUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIHNvbWUgdHlwZXMgb2YgdGhlIGN1cnJlbnQgZnJhbWUge0BsaW5rICNmcmFtZX0gaW50byB0aGUKKyAgICAgKiBTdGFja01hcFRhYmxlQXR0cmlidXRlLiBUaGlzIG1ldGhvZCBjb252ZXJ0cyB0eXBlcyBmcm9tIHRoZSBmb3JtYXQgdXNlZAorICAgICAqIGluIHtAbGluayBMYWJlbH0gdG8gdGhlIGZvcm1hdCB1c2VkIGluIFN0YWNrTWFwVGFibGUgYXR0cmlidXRlcy4gSW4KKyAgICAgKiBwYXJ0aWN1bGFyLCBpdCBjb252ZXJ0cyB0eXBlIHRhYmxlIGluZGV4ZXMgdG8gY29uc3RhbnQgcG9vbCBpbmRleGVzLgorICAgICAqCisgICAgICogQHBhcmFtIHN0YXJ0CisgICAgICogICAgICAgICAgICBpbmRleCBvZiB0aGUgZmlyc3QgdHlwZSBpbiB7QGxpbmsgI2ZyYW1lfSB0byB3cml0ZS4KKyAgICAgKiBAcGFyYW0gZW5kCisgICAgICogICAgICAgICAgICBpbmRleCBvZiBsYXN0IHR5cGUgaW4ge0BsaW5rICNmcmFtZX0gdG8gd3JpdGUgKGV4Y2x1c2l2ZSkuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHdyaXRlRnJhbWVUeXBlcyhmaW5hbCBpbnQgc3RhcnQsIGZpbmFsIGludCBlbmQpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHsKKyAgICAgICAgICAgIGludCB0ID0gZnJhbWVbaV07CisgICAgICAgICAgICBpbnQgZCA9IHQgJiBGcmFtZS5ESU07CisgICAgICAgICAgICBpZiAoZCA9PSAwKSB7CisgICAgICAgICAgICAgICAgaW50IHYgPSB0ICYgRnJhbWUuQkFTRV9WQUxVRTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHQgJiBGcmFtZS5CQVNFX0tJTkQpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBGcmFtZS5PQkpFQ1Q6CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFja01hcC5wdXRCeXRlKDcpLnB1dFNob3J0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdy5uZXdDbGFzcyhjdy50eXBlVGFibGVbdl0uc3RyVmFsMSkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgRnJhbWUuVU5JTklUSUFMSVpFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrTWFwLnB1dEJ5dGUoOCkucHV0U2hvcnQoY3cudHlwZVRhYmxlW3ZdLmludFZhbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrTWFwLnB1dEJ5dGUodik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICBkID4+PSAyODsKKyAgICAgICAgICAgICAgICB3aGlsZSAoZC0tID4gMCkgeworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJ1snKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCh0ICYgRnJhbWUuQkFTRV9LSU5EKSA9PSBGcmFtZS5PQkpFQ1QpIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCdMJyk7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChjdy50eXBlVGFibGVbdCAmIEZyYW1lLkJBU0VfVkFMVUVdLnN0clZhbDEpOworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJzsnKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHQgJiAweEYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJ0knKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJ0YnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJ0QnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgOToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJ1onKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCdCJyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDExOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnQycpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJ1MnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCdKJyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RhY2tNYXAucHV0Qnl0ZSg3KS5wdXRTaG9ydChjdy5uZXdDbGFzcyhzYi50b1N0cmluZygpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgd3JpdGVGcmFtZVR5cGUoZmluYWwgT2JqZWN0IHR5cGUpIHsKKyAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgICAgICAgIHN0YWNrTWFwLnB1dEJ5dGUoNykucHV0U2hvcnQoY3cubmV3Q2xhc3MoKFN0cmluZykgdHlwZSkpOworICAgICAgICB9IGVsc2UgaWYgKHR5cGUgaW5zdGFuY2VvZiBJbnRlZ2VyKSB7CisgICAgICAgICAgICBzdGFja01hcC5wdXRCeXRlKCgoSW50ZWdlcikgdHlwZSkuaW50VmFsdWUoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGFja01hcC5wdXRCeXRlKDgpLnB1dFNob3J0KCgoTGFiZWwpIHR5cGUpLnBvc2l0aW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIFV0aWxpdHkgbWV0aG9kczogZHVtcCBieXRlY29kZSBhcnJheQorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgYnl0ZWNvZGUgb2YgdGhpcyBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBieXRlY29kZSBvZiB0aGlzIG1ldGhvZC4KKyAgICAgKi8KKyAgICBmaW5hbCBpbnQgZ2V0U2l6ZSgpIHsKKyAgICAgICAgaWYgKGNsYXNzUmVhZGVyT2Zmc2V0ICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiA2ICsgY2xhc3NSZWFkZXJMZW5ndGg7CisgICAgICAgIH0KKyAgICAgICAgaW50IHNpemUgPSA4OworICAgICAgICBpZiAoY29kZS5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBpZiAoY29kZS5sZW5ndGggPiA2NTUzNikgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJNZXRob2QgY29kZSB0b28gbGFyZ2UhIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdy5uZXdVVEY4KCJDb2RlIik7CisgICAgICAgICAgICBzaXplICs9IDE4ICsgY29kZS5sZW5ndGggKyA4ICogaGFuZGxlckNvdW50OworICAgICAgICAgICAgaWYgKGxvY2FsVmFyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjdy5uZXdVVEY4KCJMb2NhbFZhcmlhYmxlVGFibGUiKTsKKyAgICAgICAgICAgICAgICBzaXplICs9IDggKyBsb2NhbFZhci5sZW5ndGg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobG9jYWxWYXJUeXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjdy5uZXdVVEY4KCJMb2NhbFZhcmlhYmxlVHlwZVRhYmxlIik7CisgICAgICAgICAgICAgICAgc2l6ZSArPSA4ICsgbG9jYWxWYXJUeXBlLmxlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsaW5lTnVtYmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjdy5uZXdVVEY4KCJMaW5lTnVtYmVyVGFibGUiKTsKKyAgICAgICAgICAgICAgICBzaXplICs9IDggKyBsaW5lTnVtYmVyLmxlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGFja01hcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiB6aXAgPSAoY3cudmVyc2lvbiAmIDB4RkZGRikgPj0gT3Bjb2Rlcy5WMV82OworICAgICAgICAgICAgICAgIGN3Lm5ld1VURjgoemlwID8gIlN0YWNrTWFwVGFibGUiIDogIlN0YWNrTWFwIik7CisgICAgICAgICAgICAgICAgc2l6ZSArPSA4ICsgc3RhY2tNYXAubGVuZ3RoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKENsYXNzUmVhZGVyLkFOTk9UQVRJT05TICYmIGN0YW5ucyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY3cubmV3VVRGOCgiUnVudGltZVZpc2libGVUeXBlQW5ub3RhdGlvbnMiKTsKKyAgICAgICAgICAgICAgICBzaXplICs9IDggKyBjdGFubnMuZ2V0U2l6ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKENsYXNzUmVhZGVyLkFOTk9UQVRJT05TICYmIGljdGFubnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGN3Lm5ld1VURjgoIlJ1bnRpbWVJbnZpc2libGVUeXBlQW5ub3RhdGlvbnMiKTsKKyAgICAgICAgICAgICAgICBzaXplICs9IDggKyBpY3Rhbm5zLmdldFNpemUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjYXR0cnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNpemUgKz0gY2F0dHJzLmdldFNpemUoY3csIGNvZGUuZGF0YSwgY29kZS5sZW5ndGgsIG1heFN0YWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgbWF4TG9jYWxzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZXhjZXB0aW9uQ291bnQgPiAwKSB7CisgICAgICAgICAgICBjdy5uZXdVVEY4KCJFeGNlcHRpb25zIik7CisgICAgICAgICAgICBzaXplICs9IDggKyAyICogZXhjZXB0aW9uQ291bnQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChhY2Nlc3MgJiBPcGNvZGVzLkFDQ19TWU5USEVUSUMpICE9IDApIHsKKyAgICAgICAgICAgIGlmICgoY3cudmVyc2lvbiAmIDB4RkZGRikgPCBPcGNvZGVzLlYxXzUKKyAgICAgICAgICAgICAgICB8fCAoYWNjZXNzICYgQ2xhc3NXcml0ZXIuQUNDX1NZTlRIRVRJQ19BVFRSSUJVVEUpICE9IDApIHsKKyAgICAgICAgICAgICAgICBjdy5uZXdVVEY4KCJTeW50aGV0aWMiKTsKKyAgICAgICAgICAgICAgICBzaXplICs9IDY7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKChhY2Nlc3MgJiBPcGNvZGVzLkFDQ19ERVBSRUNBVEVEKSAhPSAwKSB7CisgICAgICAgICAgICBjdy5uZXdVVEY4KCJEZXByZWNhdGVkIik7CisgICAgICAgICAgICBzaXplICs9IDY7CisgICAgICAgIH0KKyAgICAgICAgaWYgKENsYXNzUmVhZGVyLlNJR05BVFVSRVMgJiYgc2lnbmF0dXJlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGN3Lm5ld1VURjgoIlNpZ25hdHVyZSIpOworICAgICAgICAgICAgY3cubmV3VVRGOChzaWduYXR1cmUpOworICAgICAgICAgICAgc2l6ZSArPSA4OworICAgICAgICB9CisgICAgICAgIGlmIChtZXRob2RQYXJhbWV0ZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGN3Lm5ld1VURjgoIk1ldGhvZFBhcmFtZXRlcnMiKTsKKyAgICAgICAgICAgIHNpemUgKz0gNyArIG1ldGhvZFBhcmFtZXRlcnMubGVuZ3RoOworICAgICAgICB9CisgICAgICAgIGlmIChDbGFzc1JlYWRlci5BTk5PVEFUSU9OUyAmJiBhbm5kICE9IG51bGwpIHsKKyAgICAgICAgICAgIGN3Lm5ld1VURjgoIkFubm90YXRpb25EZWZhdWx0Iik7CisgICAgICAgICAgICBzaXplICs9IDYgKyBhbm5kLmxlbmd0aDsKKyAgICAgICAgfQorICAgICAgICBpZiAoQ2xhc3NSZWFkZXIuQU5OT1RBVElPTlMgJiYgYW5ucyAhPSBudWxsKSB7CisgICAgICAgICAgICBjdy5uZXdVVEY4KCJSdW50aW1lVmlzaWJsZUFubm90YXRpb25zIik7CisgICAgICAgICAgICBzaXplICs9IDggKyBhbm5zLmdldFNpemUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQ2xhc3NSZWFkZXIuQU5OT1RBVElPTlMgJiYgaWFubnMgIT0gbnVsbCkgeworICAgICAgICAgICAgY3cubmV3VVRGOCgiUnVudGltZUludmlzaWJsZUFubm90YXRpb25zIik7CisgICAgICAgICAgICBzaXplICs9IDggKyBpYW5ucy5nZXRTaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKENsYXNzUmVhZGVyLkFOTk9UQVRJT05TICYmIHRhbm5zICE9IG51bGwpIHsKKyAgICAgICAgICAgIGN3Lm5ld1VURjgoIlJ1bnRpbWVWaXNpYmxlVHlwZUFubm90YXRpb25zIik7CisgICAgICAgICAgICBzaXplICs9IDggKyB0YW5ucy5nZXRTaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKENsYXNzUmVhZGVyLkFOTk9UQVRJT05TICYmIGl0YW5ucyAhPSBudWxsKSB7CisgICAgICAgICAgICBjdy5uZXdVVEY4KCJSdW50aW1lSW52aXNpYmxlVHlwZUFubm90YXRpb25zIik7CisgICAgICAgICAgICBzaXplICs9IDggKyBpdGFubnMuZ2V0U2l6ZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChDbGFzc1JlYWRlci5BTk5PVEFUSU9OUyAmJiBwYW5ucyAhPSBudWxsKSB7CisgICAgICAgICAgICBjdy5uZXdVVEY4KCJSdW50aW1lVmlzaWJsZVBhcmFtZXRlckFubm90YXRpb25zIik7CisgICAgICAgICAgICBzaXplICs9IDcgKyAyICogKHBhbm5zLmxlbmd0aCAtIHN5bnRoZXRpY3MpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHBhbm5zLmxlbmd0aCAtIDE7IGkgPj0gc3ludGhldGljczsgLS1pKSB7CisgICAgICAgICAgICAgICAgc2l6ZSArPSBwYW5uc1tpXSA9PSBudWxsID8gMCA6IHBhbm5zW2ldLmdldFNpemUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoQ2xhc3NSZWFkZXIuQU5OT1RBVElPTlMgJiYgaXBhbm5zICE9IG51bGwpIHsKKyAgICAgICAgICAgIGN3Lm5ld1VURjgoIlJ1bnRpbWVJbnZpc2libGVQYXJhbWV0ZXJBbm5vdGF0aW9ucyIpOworICAgICAgICAgICAgc2l6ZSArPSA3ICsgMiAqIChpcGFubnMubGVuZ3RoIC0gc3ludGhldGljcyk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gaXBhbm5zLmxlbmd0aCAtIDE7IGkgPj0gc3ludGhldGljczsgLS1pKSB7CisgICAgICAgICAgICAgICAgc2l6ZSArPSBpcGFubnNbaV0gPT0gbnVsbCA/IDAgOiBpcGFubnNbaV0uZ2V0U2l6ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChhdHRycyAhPSBudWxsKSB7CisgICAgICAgICAgICBzaXplICs9IGF0dHJzLmdldFNpemUoY3csIG51bGwsIDAsIC0xLCAtMSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHV0cyB0aGUgYnl0ZWNvZGUgb2YgdGhpcyBtZXRob2QgaW4gdGhlIGdpdmVuIGJ5dGUgdmVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIG91dAorICAgICAqICAgICAgICAgICAgdGhlIGJ5dGUgdmVjdG9yIGludG8gd2hpY2ggdGhlIGJ5dGVjb2RlIG9mIHRoaXMgbWV0aG9kIG11c3QgYmUKKyAgICAgKiAgICAgICAgICAgIGNvcGllZC4KKyAgICAgKi8KKyAgICBmaW5hbCB2b2lkIHB1dChmaW5hbCBCeXRlVmVjdG9yIG91dCkgeworICAgICAgICBmaW5hbCBpbnQgRkFDVE9SID0gQ2xhc3NXcml0ZXIuVE9fQUNDX1NZTlRIRVRJQzsKKyAgICAgICAgaW50IG1hc2sgPSBBQ0NfQ09OU1RSVUNUT1IgfCBPcGNvZGVzLkFDQ19ERVBSRUNBVEVECisgICAgICAgICAgICAgICAgICAgfCBDbGFzc1dyaXRlci5BQ0NfU1lOVEhFVElDX0FUVFJJQlVURQorICAgICAgICAgICAgICAgICAgIHwgKChhY2Nlc3MgJiBDbGFzc1dyaXRlci5BQ0NfU1lOVEhFVElDX0FUVFJJQlVURSkgLyBGQUNUT1IpOworICAgICAgICBvdXQucHV0U2hvcnQoYWNjZXNzICYgfm1hc2spLnB1dFNob3J0KG5hbWUpLnB1dFNob3J0KGRlc2MpOworICAgICAgICBpZiAoY2xhc3NSZWFkZXJPZmZzZXQgIT0gMCkgeworICAgICAgICAgICAgb3V0LnB1dEJ5dGVBcnJheShjdy5jci5iLCBjbGFzc1JlYWRlck9mZnNldCwgY2xhc3NSZWFkZXJMZW5ndGgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGludCBhdHRyaWJ1dGVDb3VudCA9IDA7CisgICAgICAgIGlmIChjb2RlLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICsrYXR0cmlidXRlQ291bnQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGV4Y2VwdGlvbkNvdW50ID4gMCkgeworICAgICAgICAgICAgKythdHRyaWJ1dGVDb3VudDsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGFjY2VzcyAmIE9wY29kZXMuQUNDX1NZTlRIRVRJQykgIT0gMCkgeworICAgICAgICAgICAgaWYgKChjdy52ZXJzaW9uICYgMHhGRkZGKSA8IE9wY29kZXMuVjFfNQorICAgICAgICAgICAgICAgIHx8IChhY2Nlc3MgJiBDbGFzc1dyaXRlci5BQ0NfU1lOVEhFVElDX0FUVFJJQlVURSkgIT0gMCkgeworICAgICAgICAgICAgICAgICsrYXR0cmlidXRlQ291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKChhY2Nlc3MgJiBPcGNvZGVzLkFDQ19ERVBSRUNBVEVEKSAhPSAwKSB7CisgICAgICAgICAgICArK2F0dHJpYnV0ZUNvdW50OworICAgICAgICB9CisgICAgICAgIGlmIChDbGFzc1JlYWRlci5TSUdOQVRVUkVTICYmIHNpZ25hdHVyZSAhPSBudWxsKSB7CisgICAgICAgICAgICArK2F0dHJpYnV0ZUNvdW50OworICAgICAgICB9CisgICAgICAgIGlmIChtZXRob2RQYXJhbWV0ZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICsrYXR0cmlidXRlQ291bnQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKENsYXNzUmVhZGVyLkFOTk9UQVRJT05TICYmIGFubmQgIT0gbnVsbCkgeworICAgICAgICAgICAgKythdHRyaWJ1dGVDb3VudDsKKyAgICAgICAgfQorICAgICAgICBpZiAoQ2xhc3NSZWFkZXIuQU5OT1RBVElPTlMgJiYgYW5ucyAhPSBudWxsKSB7CisgICAgICAgICAgICArK2F0dHJpYnV0ZUNvdW50OworICAgICAgICB9CisgICAgICAgIGlmIChDbGFzc1JlYWRlci5BTk5PVEFUSU9OUyAmJiBpYW5ucyAhPSBudWxsKSB7CisgICAgICAgICAgICArK2F0dHJpYnV0ZUNvdW50OworICAgICAgICB9CisgICAgICAgIGlmIChDbGFzc1JlYWRlci5BTk5PVEFUSU9OUyAmJiB0YW5ucyAhPSBudWxsKSB7CisgICAgICAgICAgICArK2F0dHJpYnV0ZUNvdW50OworICAgICAgICB9CisgICAgICAgIGlmIChDbGFzc1JlYWRlci5BTk5PVEFUSU9OUyAmJiBpdGFubnMgIT0gbnVsbCkgeworICAgICAgICAgICAgKythdHRyaWJ1dGVDb3VudDsKKyAgICAgICAgfQorICAgICAgICBpZiAoQ2xhc3NSZWFkZXIuQU5OT1RBVElPTlMgJiYgcGFubnMgIT0gbnVsbCkgeworICAgICAgICAgICAgKythdHRyaWJ1dGVDb3VudDsKKyAgICAgICAgfQorICAgICAgICBpZiAoQ2xhc3NSZWFkZXIuQU5OT1RBVElPTlMgJiYgaXBhbm5zICE9IG51bGwpIHsKKyAgICAgICAgICAgICsrYXR0cmlidXRlQ291bnQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF0dHJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGF0dHJpYnV0ZUNvdW50ICs9IGF0dHJzLmdldENvdW50KCk7CisgICAgICAgIH0KKyAgICAgICAgb3V0LnB1dFNob3J0KGF0dHJpYnV0ZUNvdW50KTsKKyAgICAgICAgaWYgKGNvZGUubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgaW50IHNpemUgPSAxMiArIGNvZGUubGVuZ3RoICsgOCAqIGhhbmRsZXJDb3VudDsKKyAgICAgICAgICAgIGlmIChsb2NhbFZhciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2l6ZSArPSA4ICsgbG9jYWxWYXIubGVuZ3RoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxvY2FsVmFyVHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2l6ZSArPSA4ICsgbG9jYWxWYXJUeXBlLmxlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsaW5lTnVtYmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzaXplICs9IDggKyBsaW5lTnVtYmVyLmxlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGFja01hcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2l6ZSArPSA4ICsgc3RhY2tNYXAubGVuZ3RoOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKENsYXNzUmVhZGVyLkFOTk9UQVRJT05TICYmIGN0YW5ucyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2l6ZSArPSA4ICsgY3Rhbm5zLmdldFNpemUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChDbGFzc1JlYWRlci5BTk5PVEFUSU9OUyAmJiBpY3Rhbm5zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzaXplICs9IDggKyBpY3Rhbm5zLmdldFNpemUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjYXR0cnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNpemUgKz0gY2F0dHJzLmdldFNpemUoY3csIGNvZGUuZGF0YSwgY29kZS5sZW5ndGgsIG1heFN0YWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgbWF4TG9jYWxzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dC5wdXRTaG9ydChjdy5uZXdVVEY4KCJDb2RlIikpLnB1dEludChzaXplKTsKKyAgICAgICAgICAgIG91dC5wdXRTaG9ydChtYXhTdGFjaykucHV0U2hvcnQobWF4TG9jYWxzKTsKKyAgICAgICAgICAgIG91dC5wdXRJbnQoY29kZS5sZW5ndGgpLnB1dEJ5dGVBcnJheShjb2RlLmRhdGEsIDAsIGNvZGUubGVuZ3RoKTsKKyAgICAgICAgICAgIG91dC5wdXRTaG9ydChoYW5kbGVyQ291bnQpOworICAgICAgICAgICAgaWYgKGhhbmRsZXJDb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICBIYW5kbGVyIGggPSBmaXJzdEhhbmRsZXI7CisgICAgICAgICAgICAgICAgd2hpbGUgKGggIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBvdXQucHV0U2hvcnQoaC5zdGFydC5wb3NpdGlvbikucHV0U2hvcnQoaC5lbmQucG9zaXRpb24pCisgICAgICAgICAgICAgICAgICAgICAgIC5wdXRTaG9ydChoLmhhbmRsZXIucG9zaXRpb24pLnB1dFNob3J0KGgudHlwZSk7CisgICAgICAgICAgICAgICAgICAgIGggPSBoLm5leHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYXR0cmlidXRlQ291bnQgPSAwOworICAgICAgICAgICAgaWYgKGxvY2FsVmFyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICArK2F0dHJpYnV0ZUNvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxvY2FsVmFyVHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgKythdHRyaWJ1dGVDb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsaW5lTnVtYmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICArK2F0dHJpYnV0ZUNvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YWNrTWFwICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICArK2F0dHJpYnV0ZUNvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKENsYXNzUmVhZGVyLkFOTk9UQVRJT05TICYmIGN0YW5ucyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgKythdHRyaWJ1dGVDb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChDbGFzc1JlYWRlci5BTk5PVEFUSU9OUyAmJiBpY3Rhbm5zICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICArK2F0dHJpYnV0ZUNvdW50OworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNhdHRycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYXR0cmlidXRlQ291bnQgKz0gY2F0dHJzLmdldENvdW50KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQucHV0U2hvcnQoYXR0cmlidXRlQ291bnQpOworICAgICAgICAgICAgaWYgKGxvY2FsVmFyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBvdXQucHV0U2hvcnQoY3cubmV3VVRGOCgiTG9jYWxWYXJpYWJsZVRhYmxlIikpOworICAgICAgICAgICAgICAgIG91dC5wdXRJbnQobG9jYWxWYXIubGVuZ3RoICsgMikucHV0U2hvcnQobG9jYWxWYXJDb3VudCk7CisgICAgICAgICAgICAgICAgb3V0LnB1dEJ5dGVBcnJheShsb2NhbFZhci5kYXRhLCAwLCBsb2NhbFZhci5sZW5ndGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxvY2FsVmFyVHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgb3V0LnB1dFNob3J0KGN3Lm5ld1VURjgoIkxvY2FsVmFyaWFibGVUeXBlVGFibGUiKSk7CisgICAgICAgICAgICAgICAgb3V0LnB1dEludChsb2NhbFZhclR5cGUubGVuZ3RoICsgMikucHV0U2hvcnQobG9jYWxWYXJUeXBlQ291bnQpOworICAgICAgICAgICAgICAgIG91dC5wdXRCeXRlQXJyYXkobG9jYWxWYXJUeXBlLmRhdGEsIDAsIGxvY2FsVmFyVHlwZS5sZW5ndGgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxpbmVOdW1iZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG91dC5wdXRTaG9ydChjdy5uZXdVVEY4KCJMaW5lTnVtYmVyVGFibGUiKSk7CisgICAgICAgICAgICAgICAgb3V0LnB1dEludChsaW5lTnVtYmVyLmxlbmd0aCArIDIpLnB1dFNob3J0KGxpbmVOdW1iZXJDb3VudCk7CisgICAgICAgICAgICAgICAgb3V0LnB1dEJ5dGVBcnJheShsaW5lTnVtYmVyLmRhdGEsIDAsIGxpbmVOdW1iZXIubGVuZ3RoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGFja01hcCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYm9vbGVhbiB6aXAgPSAoY3cudmVyc2lvbiAmIDB4RkZGRikgPj0gT3Bjb2Rlcy5WMV82OworICAgICAgICAgICAgICAgIG91dC5wdXRTaG9ydChjdy5uZXdVVEY4KHppcCA/ICJTdGFja01hcFRhYmxlIiA6ICJTdGFja01hcCIpKTsKKyAgICAgICAgICAgICAgICBvdXQucHV0SW50KHN0YWNrTWFwLmxlbmd0aCArIDIpLnB1dFNob3J0KGZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgIG91dC5wdXRCeXRlQXJyYXkoc3RhY2tNYXAuZGF0YSwgMCwgc3RhY2tNYXAubGVuZ3RoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChDbGFzc1JlYWRlci5BTk5PVEFUSU9OUyAmJiBjdGFubnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG91dC5wdXRTaG9ydChjdy5uZXdVVEY4KCJSdW50aW1lVmlzaWJsZVR5cGVBbm5vdGF0aW9ucyIpKTsKKyAgICAgICAgICAgICAgICBjdGFubnMucHV0KG91dCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoQ2xhc3NSZWFkZXIuQU5OT1RBVElPTlMgJiYgaWN0YW5ucyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgb3V0LnB1dFNob3J0KGN3Lm5ld1VURjgoIlJ1bnRpbWVJbnZpc2libGVUeXBlQW5ub3RhdGlvbnMiKSk7CisgICAgICAgICAgICAgICAgaWN0YW5ucy5wdXQob3V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjYXR0cnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNhdHRycy5wdXQoY3csIGNvZGUuZGF0YSwgY29kZS5sZW5ndGgsIG1heExvY2FscywgbWF4U3RhY2ssIG91dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGV4Y2VwdGlvbkNvdW50ID4gMCkgeworICAgICAgICAgICAgb3V0LnB1dFNob3J0KGN3Lm5ld1VURjgoIkV4Y2VwdGlvbnMiKSkucHV0SW50KAorICAgICAgICAgICAgICAgICAgICAyICogZXhjZXB0aW9uQ291bnQgKyAyKTsKKyAgICAgICAgICAgIG91dC5wdXRTaG9ydChleGNlcHRpb25Db3VudCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4Y2VwdGlvbkNvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICBvdXQucHV0U2hvcnQoZXhjZXB0aW9uc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKChhY2Nlc3MgJiBPcGNvZGVzLkFDQ19TWU5USEVUSUMpICE9IDApIHsKKyAgICAgICAgICAgIGlmICgoY3cudmVyc2lvbiAmIDB4RkZGRikgPCBPcGNvZGVzLlYxXzUKKyAgICAgICAgICAgICAgICB8fCAoYWNjZXNzICYgQ2xhc3NXcml0ZXIuQUNDX1NZTlRIRVRJQ19BVFRSSUJVVEUpICE9IDApIHsKKyAgICAgICAgICAgICAgICBvdXQucHV0U2hvcnQoY3cubmV3VVRGOCgiU3ludGhldGljIikpLnB1dEludCgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoKGFjY2VzcyAmIE9wY29kZXMuQUNDX0RFUFJFQ0FURUQpICE9IDApIHsKKyAgICAgICAgICAgIG91dC5wdXRTaG9ydChjdy5uZXdVVEY4KCJEZXByZWNhdGVkIikpLnB1dEludCgwKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQ2xhc3NSZWFkZXIuU0lHTkFUVVJFUyAmJiBzaWduYXR1cmUgIT0gbnVsbCkgeworICAgICAgICAgICAgb3V0LnB1dFNob3J0KGN3Lm5ld1VURjgoIlNpZ25hdHVyZSIpKS5wdXRJbnQoMikKKyAgICAgICAgICAgICAgIC5wdXRTaG9ydChjdy5uZXdVVEY4KHNpZ25hdHVyZSkpOworICAgICAgICB9CisgICAgICAgIGlmIChtZXRob2RQYXJhbWV0ZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIG91dC5wdXRTaG9ydChjdy5uZXdVVEY4KCJNZXRob2RQYXJhbWV0ZXJzIikpOworICAgICAgICAgICAgb3V0LnB1dEludChtZXRob2RQYXJhbWV0ZXJzLmxlbmd0aCArIDEpLnB1dEJ5dGUoCisgICAgICAgICAgICAgICAgICAgIG1ldGhvZFBhcmFtZXRlcnNDb3VudCk7CisgICAgICAgICAgICBvdXQucHV0Qnl0ZUFycmF5KG1ldGhvZFBhcmFtZXRlcnMuZGF0YSwgMCwgbWV0aG9kUGFyYW1ldGVycy5sZW5ndGgpOworICAgICAgICB9CisgICAgICAgIGlmIChDbGFzc1JlYWRlci5BTk5PVEFUSU9OUyAmJiBhbm5kICE9IG51bGwpIHsKKyAgICAgICAgICAgIG91dC5wdXRTaG9ydChjdy5uZXdVVEY4KCJBbm5vdGF0aW9uRGVmYXVsdCIpKTsKKyAgICAgICAgICAgIG91dC5wdXRJbnQoYW5uZC5sZW5ndGgpOworICAgICAgICAgICAgb3V0LnB1dEJ5dGVBcnJheShhbm5kLmRhdGEsIDAsIGFubmQubGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQ2xhc3NSZWFkZXIuQU5OT1RBVElPTlMgJiYgYW5ucyAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXQucHV0U2hvcnQoY3cubmV3VVRGOCgiUnVudGltZVZpc2libGVBbm5vdGF0aW9ucyIpKTsKKyAgICAgICAgICAgIGFubnMucHV0KG91dCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKENsYXNzUmVhZGVyLkFOTk9UQVRJT05TICYmIGlhbm5zICE9IG51bGwpIHsKKyAgICAgICAgICAgIG91dC5wdXRTaG9ydChjdy5uZXdVVEY4KCJSdW50aW1lSW52aXNpYmxlQW5ub3RhdGlvbnMiKSk7CisgICAgICAgICAgICBpYW5ucy5wdXQob3V0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQ2xhc3NSZWFkZXIuQU5OT1RBVElPTlMgJiYgdGFubnMgIT0gbnVsbCkgeworICAgICAgICAgICAgb3V0LnB1dFNob3J0KGN3Lm5ld1VURjgoIlJ1bnRpbWVWaXNpYmxlVHlwZUFubm90YXRpb25zIikpOworICAgICAgICAgICAgdGFubnMucHV0KG91dCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKENsYXNzUmVhZGVyLkFOTk9UQVRJT05TICYmIGl0YW5ucyAhPSBudWxsKSB7CisgICAgICAgICAgICBvdXQucHV0U2hvcnQoY3cubmV3VVRGOCgiUnVudGltZUludmlzaWJsZVR5cGVBbm5vdGF0aW9ucyIpKTsKKyAgICAgICAgICAgIGl0YW5ucy5wdXQob3V0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQ2xhc3NSZWFkZXIuQU5OT1RBVElPTlMgJiYgcGFubnMgIT0gbnVsbCkgeworICAgICAgICAgICAgb3V0LnB1dFNob3J0KGN3Lm5ld1VURjgoIlJ1bnRpbWVWaXNpYmxlUGFyYW1ldGVyQW5ub3RhdGlvbnMiKSk7CisgICAgICAgICAgICBBbm5vdGF0aW9uV3JpdGVyLnB1dChwYW5ucywgc3ludGhldGljcywgb3V0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoQ2xhc3NSZWFkZXIuQU5OT1RBVElPTlMgJiYgaXBhbm5zICE9IG51bGwpIHsKKyAgICAgICAgICAgIG91dC5wdXRTaG9ydChjdy5uZXdVVEY4KCJSdW50aW1lSW52aXNpYmxlUGFyYW1ldGVyQW5ub3RhdGlvbnMiKSk7CisgICAgICAgICAgICBBbm5vdGF0aW9uV3JpdGVyLnB1dChpcGFubnMsIHN5bnRoZXRpY3MsIG91dCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGF0dHJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGF0dHJzLnB1dChjdywgbnVsbCwgMCwgLTEsIC0xLCBvdXQpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gVXRpbGl0eSBtZXRob2RzOiBpbnN0cnVjdGlvbiByZXNpemluZyAodXNlZCB0byBoYW5kbGUgR09UT19XIGFuZCBKU1JfVykKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIFJlc2l6ZXMgYW5kIHJlcGxhY2VzIHRoZSB0ZW1wb3JhcnkgaW5zdHJ1Y3Rpb25zIGluc2VydGVkIGJ5CisgICAgICoge0BsaW5rIExhYmVsI3Jlc29sdmV9IGZvciB3aWRlIGZvcndhcmQganVtcHMsIHdoaWxlIGtlZXBpbmcganVtcCBvZmZzZXRzCisgICAgICogYW5kIGluc3RydWN0aW9uIGFkZHJlc3NlcyBjb25zaXN0ZW50LiBUaGlzIG1heSByZXF1aXJlIHRvIHJlc2l6ZSBvdGhlcgorICAgICAqIGV4aXN0aW5nIGluc3RydWN0aW9ucywgb3IgZXZlbiB0byBpbnRyb2R1Y2UgbmV3IGluc3RydWN0aW9uczogZm9yCisgICAgICogZXhhbXBsZSwgaW5jcmVhc2luZyB0aGUgc2l6ZSBvZiBhbiBpbnN0cnVjdGlvbiBieSAyIGF0IHRoZSBtaWRkbGUgb2YgYQorICAgICAqIG1ldGhvZCBjYW4gaW5jcmVhc2VzIHRoZSBvZmZzZXQgb2YgYW4gSUZFUSBpbnN0cnVjdGlvbiBmcm9tIDMyNzY2IHRvCisgICAgICogMzI3NjgsIGluIHdoaWNoIGNhc2UgSUZFUSAzMjc2NiBtdXN0IGJlIHJlcGxhY2VkIHdpdGggSUZORVEgOCBHT1RPX1cKKyAgICAgKiAzMjc2NS4gVGhpcywgaW4gdHVybiwgbWF5IHJlcXVpcmUgdG8gaW5jcmVhc2UgdGhlIHNpemUgb2YgYW5vdGhlciBqdW1wCisgICAgICogaW5zdHJ1Y3Rpb24sIGFuZCBzbyBvbi4uLiBBbGwgdGhlc2Ugb3BlcmF0aW9ucyBhcmUgaGFuZGxlZCBhdXRvbWF0aWNhbGx5CisgICAgICogYnkgdGhpcyBtZXRob2QuCisgICAgICogPHA+CisgICAgICogPGk+VGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgYWZ0ZXIgYWxsIHRoZSBtZXRob2QgdGhhdCBpcyBiZWluZyBidWlsdAorICAgICAqIGhhcyBiZWVuIHZpc2l0ZWQ8L2k+LiBJbiBwYXJ0aWN1bGFyLCB0aGUge0BsaW5rIExhYmVsIExhYmVsfSBvYmplY3RzIHVzZWQKKyAgICAgKiB0byBjb25zdHJ1Y3QgdGhlIG1ldGhvZCBhcmUgbm8gbG9uZ2VyIHZhbGlkIGFmdGVyIHRoaXMgbWV0aG9kIGhhcyBiZWVuCisgICAgICogY2FsbGVkLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZXNpemVJbnN0cnVjdGlvbnMoKSB7CisgICAgICAgIGJ5dGVbXSBiID0gY29kZS5kYXRhOyAvLyBieXRlY29kZSBvZiB0aGUgbWV0aG9kCisgICAgICAgIGludCB1LCB2LCBsYWJlbDsgLy8gaW5kZXhlcyBpbiBiCisgICAgICAgIGludCBpLCBqOyAvLyBsb29wIGluZGV4ZXMKKyAgICAgICAgLyoKKyAgICAgICAgICogMXN0IHN0ZXA6IEFzIGV4cGxhaW5lZCBhYm92ZSwgcmVzaXppbmcgYW4gaW5zdHJ1Y3Rpb24gbWF5IHJlcXVpcmUgdG8KKyAgICAgICAgICogcmVzaXplIGFub3RoZXIgb25lLCB3aGljaCBtYXkgcmVxdWlyZSB0byByZXNpemUgeWV0IGFub3RoZXIgb25lLCBhbmQKKyAgICAgICAgICogc28gb24uIFRoZSBmaXJzdCBzdGVwIG9mIHRoZSBhbGdvcml0aG0gY29uc2lzdHMgaW4gZmluZGluZyBhbGwgdGhlCisgICAgICAgICAqIGluc3RydWN0aW9ucyB0aGF0IG5lZWQgdG8gYmUgcmVzaXplZCwgd2l0aG91dCBtb2RpZnlpbmcgdGhlIGNvZGUuCisgICAgICAgICAqIFRoaXMgaXMgZG9uZSBieSB0aGUgZm9sbG93aW5nICJmaXggcG9pbnQiIGFsZ29yaXRobToKKyAgICAgICAgICogCisgICAgICAgICAqIFBhcnNlIHRoZSBjb2RlIHRvIGZpbmQgdGhlIGp1bXAgaW5zdHJ1Y3Rpb25zIHdob3NlIG9mZnNldCB3aWxsIG5lZWQKKyAgICAgICAgICogbW9yZSB0aGFuIDIgYnl0ZXMgdG8gYmUgc3RvcmVkICh0aGUgZnV0dXJlIG9mZnNldCBpcyBjb21wdXRlZCBmcm9tCisgICAgICAgICAqIHRoZSBjdXJyZW50IG9mZnNldCBhbmQgZnJvbSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd2lsbCBiZSBpbnNlcnRlZAorICAgICAgICAgKiBvciByZW1vdmVkIGJldHdlZW4gdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IGluc3RydWN0aW9ucykuIEZvciBlYWNoIHN1Y2gKKyAgICAgICAgICogaW5zdHJ1Y3Rpb24sIGFkZHMgYW4gZW50cnkgaW4gKGEgY29weSBvZikgdGhlIGluZGV4ZXMgYW5kIHNpemVzCisgICAgICAgICAqIGFycmF5cyAoaWYgdGhpcyBoYXMgbm90IGFscmVhZHkgYmVlbiBkb25lIGluIGEgcHJldmlvdXMgaXRlcmF0aW9uISkuCisgICAgICAgICAqIAorICAgICAgICAgKiBJZiBhdCBsZWFzdCBvbmUgZW50cnkgaGFzIGJlZW4gYWRkZWQgZHVyaW5nIHRoZSBwcmV2aW91cyBzdGVwLCBnbworICAgICAgICAgKiBiYWNrIHRvIHRoZSBiZWdpbm5pbmcsIG90aGVyd2lzZSBzdG9wLgorICAgICAgICAgKiAKKyAgICAgICAgICogSW4gZmFjdCB0aGUgcmVhbCBhbGdvcml0aG0gaXMgY29tcGxpY2F0ZWQgYnkgdGhlIGZhY3QgdGhhdCB0aGUgc2l6ZQorICAgICAgICAgKiBvZiBUQUJMRVNXSVRDSCBhbmQgTE9PS1VQU1dJVENIIGluc3RydWN0aW9ucyBkZXBlbmRzIG9uIHRoZWlyCisgICAgICAgICAqIHBvc2l0aW9uIGluIHRoZSBieXRlY29kZSAoYmVjYXVzZSBvZiBwYWRkaW5nKS4gSW4gb3JkZXIgdG8gZW5zdXJlIHRoZQorICAgICAgICAgKiBjb252ZXJnZW5jZSBvZiB0aGUgYWxnb3JpdGhtLCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIGFkZGVkIG9yCisgICAgICAgICAqIHJlbW92ZWQgZnJvbSB0aGVzZSBpbnN0cnVjdGlvbnMgaXMgb3ZlciBlc3RpbWF0ZWQgZHVyaW5nIHRoZSBwcmV2aW91cworICAgICAgICAgKiBsb29wLCBhbmQgY29tcHV0ZWQgZXhhY3RseSBvbmx5IGFmdGVyIHRoZSBsb29wIGlzIGZpbmlzaGVkICh0aGlzCisgICAgICAgICAqIHJlcXVpcmVzIGFub3RoZXIgcGFzcyB0byBwYXJzZSB0aGUgYnl0ZWNvZGUgb2YgdGhlIG1ldGhvZCkuCisgICAgICAgICAqLworICAgICAgICBpbnRbXSBhbGxJbmRleGVzID0gbmV3IGludFswXTsgLy8gY29weSBvZiBpbmRleGVzCisgICAgICAgIGludFtdIGFsbFNpemVzID0gbmV3IGludFswXTsgLy8gY29weSBvZiBzaXplcworICAgICAgICBib29sZWFuW10gcmVzaXplOyAvLyBpbnN0cnVjdGlvbnMgdG8gYmUgcmVzaXplZAorICAgICAgICBpbnQgbmV3T2Zmc2V0OyAvLyBmdXR1cmUgb2Zmc2V0IG9mIGEganVtcCBpbnN0cnVjdGlvbgorCisgICAgICAgIHJlc2l6ZSA9IG5ldyBib29sZWFuW2NvZGUubGVuZ3RoXTsKKworICAgICAgICAvLyAzID0gbG9vcCBhZ2FpbiwgMiA9IGxvb3AgZW5kZWQsIDEgPSBsYXN0IHBhc3MsIDAgPSBkb25lCisgICAgICAgIGludCBzdGF0ZSA9IDM7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGlmIChzdGF0ZSA9PSAzKSB7CisgICAgICAgICAgICAgICAgc3RhdGUgPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdSA9IDA7CisgICAgICAgICAgICB3aGlsZSAodSA8IGIubGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgaW50IG9wY29kZSA9IGJbdV0gJiAweEZGOyAvLyBvcGNvZGUgb2YgY3VycmVudCBpbnN0cnVjdGlvbgorICAgICAgICAgICAgICAgIGludCBpbnNlcnQgPSAwOyAvLyBieXRlcyB0byBiZSBhZGRlZCBhZnRlciB0aGlzIGluc3RydWN0aW9uCisKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKENsYXNzV3JpdGVyLlRZUEVbb3Bjb2RlXSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLk5PQVJHX0lOU046CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuSU1QTFZBUl9JTlNOOgorICAgICAgICAgICAgICAgICAgICAgICAgdSArPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuTEFCRUxfSU5TTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcGNvZGUgPiAyMDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb252ZXJ0cyB0ZW1wb3Jhcnkgb3Bjb2RlcyAyMDIgdG8gMjE3LCAyMTggYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMjE5IHRvIElGRVEgLi4uIEpTUiAoaW5jbHVzaXZlKSwgSUZOVUxMIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElGTk9OTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSA9IG9wY29kZSA8IDIxOCA/IG9wY29kZSAtIDQ5IDogb3Bjb2RlIC0gMjA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSB1ICsgcmVhZFVuc2lnbmVkU2hvcnQoYiwgdSArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IHUgKyByZWFkU2hvcnQoYiwgdSArIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3T2Zmc2V0ID0gZ2V0TmV3T2Zmc2V0KGFsbEluZGV4ZXMsIGFsbFNpemVzLCB1LCBsYWJlbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3T2Zmc2V0IDwgU2hvcnQuTUlOX1ZBTFVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbmV3T2Zmc2V0ID4gU2hvcnQuTUFYX1ZBTFVFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNpemVbdV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wY29kZSA9PSBPcGNvZGVzLkdPVE8gfHwgb3Bjb2RlID09IE9wY29kZXMuSlNSKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0d28gYWRkaXRpb25hbCBieXRlcyB3aWxsIGJlIHJlcXVpcmVkIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYWNlIHRoaXMgR09UTyBvciBKU1IgaW5zdHJ1Y3Rpb24gd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBHT1RPX1cgb3IgYSBKU1JfVworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0ID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpdmUgYWRkaXRpb25hbCBieXRlcyB3aWxsIGJlIHJlcXVpcmVkIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYWNlIHRoaXMgSUZ4eHggPGw+IGluc3RydWN0aW9uIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElGTk9UeHh4IDxsJz4gR09UT19XIDxsPiwgd2hlcmUgSUZOT1R4eHgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIHRoZSAib3Bwb3NpdGUiIG9wY29kZSBvZiBJRnh4eCAoaS5lLiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElGTkUgZm9yIElGRVEpIGFuZCB3aGVyZSA8bCc+IGRlc2lnbmF0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBpbnN0cnVjdGlvbiBqdXN0IGFmdGVyIHRoZSBHT1RPX1cuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnQgPSA1OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2l6ZVt1XSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdSArPSAzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuTEFCRUxXX0lOU046CisgICAgICAgICAgICAgICAgICAgICAgICB1ICs9IDU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5UQUJMX0lOU046CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRydWUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIGFkZGVkIChvciByZW1vdmVkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyb20gdGhpcyBpbnN0cnVjdGlvbiA9IChmdXR1cmUgbnVtYmVyIG9mIHBhZGRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBieXRlcyAtIGN1cnJlbnQgbnVtYmVyIG9mIHBhZGRpbmcgYnl0ZSkgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZXZpb3VzbHkgb3ZlciBlc3RpbWF0ZWQgdmFyaWF0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA9ICgoMyAtIG5ld09mZnNldCU0KSAtICgzIC0gdSU0KSkgLSB1JTQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyA9ICgtbmV3T2Zmc2V0JTQgKyB1JTQpIC0gdSU0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPSAtKG5ld09mZnNldCAmIDMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3T2Zmc2V0ID0gZ2V0TmV3T2Zmc2V0KGFsbEluZGV4ZXMsIGFsbFNpemVzLCAwLCB1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnNlcnQgPSAtKG5ld09mZnNldCAmIDMpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghcmVzaXplW3VdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3ZlciBlc3RpbWF0aW9uIG9mIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGRlZCB0byB0aGlzIGluc3RydWN0aW9uID0gMyAtIGN1cnJlbnQgbnVtYmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2YgcGFkZGluZyBieXRlcyA9IDMgLSAoMyAtIHUlNCkgPSB1JTQgPSB1ICYgMworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydCA9IHUgJiAzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2l6ZVt1XSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwcyBpbnN0cnVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgdSA9IHUgKyA0IC0gKHUgJiAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHUgKz0gNCAqIChyZWFkSW50KGIsIHUgKyA4KSAtIHJlYWRJbnQoYiwgdSArIDQpICsgMSkgKyAxMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLkxPT0tfSU5TTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGlrZSBUQUJMX0lOU04KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdPZmZzZXQgPSBnZXROZXdPZmZzZXQoYWxsSW5kZXhlcywgYWxsU2l6ZXMsIDAsIHUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydCA9IC0obmV3T2Zmc2V0ICYgMyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFyZXNpemVbdV0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsaWtlIFRBQkxfSU5TTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydCA9IHUgJiAzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc2l6ZVt1XSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBza2lwcyBpbnN0cnVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgdSA9IHUgKyA0IC0gKHUgJiAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHUgKz0gOCAqIHJlYWRJbnQoYiwgdSArIDQpICsgODsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLldJREVfSU5TTjoKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSA9IGJbdSArIDFdICYgMHhGRjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcGNvZGUgPT0gT3Bjb2Rlcy5JSU5DKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdSArPSA2OworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ICs9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5WQVJfSU5TTjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5TQllURV9JTlNOOgorICAgICAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLkxEQ19JTlNOOgorICAgICAgICAgICAgICAgICAgICAgICAgdSArPSAyOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuU0hPUlRfSU5TTjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5MRENXX0lOU046CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuRklFTERPUk1FVEhfSU5TTjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5UWVBFX0lOU046CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuSUlOQ19JTlNOOgorICAgICAgICAgICAgICAgICAgICAgICAgdSArPSAzOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuSVRGTUVUSF9JTlNOOgorICAgICAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLklORFlNRVRIX0lOU046CisgICAgICAgICAgICAgICAgICAgICAgICB1ICs9IDU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2FzZSBDbGFzc1dyaXRlci5NQU5BX0lOU046CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICB1ICs9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGluc2VydCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGFkZHMgYSBuZXcgKHUsIGluc2VydCkgZW50cnkgaW4gdGhlIGFsbEluZGV4ZXMgYW5kCisgICAgICAgICAgICAgICAgICAgIC8vIGFsbFNpemVzIGFycmF5cworICAgICAgICAgICAgICAgICAgICBpbnRbXSBuZXdJbmRleGVzID0gbmV3IGludFthbGxJbmRleGVzLmxlbmd0aCArIDFdOworICAgICAgICAgICAgICAgICAgICBpbnRbXSBuZXdTaXplcyA9IG5ldyBpbnRbYWxsU2l6ZXMubGVuZ3RoICsgMV07CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYWxsSW5kZXhlcywgMCwgbmV3SW5kZXhlcywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxJbmRleGVzLmxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYWxsU2l6ZXMsIDAsIG5ld1NpemVzLCAwLCBhbGxTaXplcy5sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBuZXdJbmRleGVzW2FsbEluZGV4ZXMubGVuZ3RoXSA9IHU7CisgICAgICAgICAgICAgICAgICAgIG5ld1NpemVzW2FsbFNpemVzLmxlbmd0aF0gPSBpbnNlcnQ7CisgICAgICAgICAgICAgICAgICAgIGFsbEluZGV4ZXMgPSBuZXdJbmRleGVzOworICAgICAgICAgICAgICAgICAgICBhbGxTaXplcyA9IG5ld1NpemVzOworICAgICAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0ID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAzOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXRlIDwgMykgeworICAgICAgICAgICAgICAgIC0tc3RhdGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKHN0YXRlICE9IDApOworCisgICAgICAgIC8vIDJuZCBzdGVwOgorICAgICAgICAvLyBjb3BpZXMgdGhlIGJ5dGVjb2RlIG9mIHRoZSBtZXRob2QgaW50byBhIG5ldyBieXRldmVjdG9yLCB1cGRhdGVzIHRoZQorICAgICAgICAvLyBvZmZzZXRzLCBhbmQgaW5zZXJ0cyAob3IgcmVtb3ZlcykgYnl0ZXMgYXMgcmVxdWVzdGVkLgorCisgICAgICAgIEJ5dGVWZWN0b3IgbmV3Q29kZSA9IG5ldyBCeXRlVmVjdG9yKGNvZGUubGVuZ3RoKTsKKworICAgICAgICB1ID0gMDsKKyAgICAgICAgd2hpbGUgKHUgPCBjb2RlLmxlbmd0aCkgeworICAgICAgICAgICAgaW50IG9wY29kZSA9IGJbdV0gJiAweEZGOworICAgICAgICAgICAgc3dpdGNoIChDbGFzc1dyaXRlci5UWVBFW29wY29kZV0pIHsKKyAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLk5PQVJHX0lOU046CisgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5JTVBMVkFSX0lOU046CisgICAgICAgICAgICAgICAgICAgIG5ld0NvZGUucHV0Qnl0ZShvcGNvZGUpOworICAgICAgICAgICAgICAgICAgICB1ICs9IDE7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuTEFCRUxfSU5TTjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9wY29kZSA+IDIwMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlcyB0ZW1wb3Jhcnkgb3Bjb2RlcyAyMDIgdG8gMjE3IChpbmNsdXNpdmUpLCAyMTgKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCAyMTkgdG8gSUZFUSAuLi4gSlNSIChpbmNsdXNpdmUpLCBJRk5VTEwgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJRk5PTk5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wY29kZSA9IG9wY29kZSA8IDIxOCA/IG9wY29kZSAtIDQ5IDogb3Bjb2RlIC0gMjA7CisgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IHUgKyByZWFkVW5zaWduZWRTaG9ydChiLCB1ICsgMSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IHUgKyByZWFkU2hvcnQoYiwgdSArIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG5ld09mZnNldCA9IGdldE5ld09mZnNldChhbGxJbmRleGVzLCBhbGxTaXplcywgdSwgbGFiZWwpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVzaXplW3VdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBsYWNlcyBHT1RPIHdpdGggR09UT19XLCBKU1Igd2l0aCBKU1JfVyBhbmQgSUZ4eHgKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIDxsPiB3aXRoIElGTk9UeHh4IDxsJz4gR09UT19XIDxsPiwgd2hlcmUgSUZOT1R4eHggaXMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSAib3Bwb3NpdGUiIG9wY29kZSBvZiBJRnh4eCAoaS5lLiwgSUZORSBmb3IgSUZFUSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB3aGVyZSA8bCc+IGRlc2lnbmF0ZXMgdGhlIGluc3RydWN0aW9uIGp1c3QgYWZ0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBHT1RPX1cuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3Bjb2RlID09IE9wY29kZXMuR09UTykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvZGUucHV0Qnl0ZSgyMDApOyAvLyBHT1RPX1cKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob3Bjb2RlID09IE9wY29kZXMuSlNSKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29kZS5wdXRCeXRlKDIwMSk7IC8vIEpTUl9XCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvZGUucHV0Qnl0ZShvcGNvZGUgPD0gMTY2ID8gKChvcGNvZGUgKyAxKSBeIDEpIC0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBvcGNvZGUgXiAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb2RlLnB1dFNob3J0KDgpOyAvLyBqdW1wIG9mZnNldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvZGUucHV0Qnl0ZSgyMDApOyAvLyBHT1RPX1cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXdPZmZzZXQgbm93IGNvbXB1dGVkIGZyb20gc3RhcnQgb2YgR09UT19XCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3T2Zmc2V0IC09IDM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb2RlLnB1dEludChuZXdPZmZzZXQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29kZS5wdXRCeXRlKG9wY29kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb2RlLnB1dFNob3J0KG5ld09mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdSArPSAzOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLkxBQkVMV19JTlNOOgorICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IHUgKyByZWFkSW50KGIsIHUgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3T2Zmc2V0ID0gZ2V0TmV3T2Zmc2V0KGFsbEluZGV4ZXMsIGFsbFNpemVzLCB1LCBsYWJlbCk7CisgICAgICAgICAgICAgICAgICAgIG5ld0NvZGUucHV0Qnl0ZShvcGNvZGUpOworICAgICAgICAgICAgICAgICAgICBuZXdDb2RlLnB1dEludChuZXdPZmZzZXQpOworICAgICAgICAgICAgICAgICAgICB1ICs9IDU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuVEFCTF9JTlNOOgorICAgICAgICAgICAgICAgICAgICAvLyBza2lwcyAwIHRvIDMgcGFkZGluZyBieXRlcworICAgICAgICAgICAgICAgICAgICB2ID0gdTsKKyAgICAgICAgICAgICAgICAgICAgdSA9IHUgKyA0IC0gKHYgJiAzKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVhZHMgYW5kIGNvcGllcyBpbnN0cnVjdGlvbgorICAgICAgICAgICAgICAgICAgICBuZXdDb2RlLnB1dEJ5dGUoT3Bjb2Rlcy5UQUJMRVNXSVRDSCk7CisgICAgICAgICAgICAgICAgICAgIG5ld0NvZGUucHV0Qnl0ZUFycmF5KG51bGwsIDAsICg0IC0gbmV3Q29kZS5sZW5ndGggJSA0KSAlIDQpOworICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IHYgKyByZWFkSW50KGIsIHUpOworICAgICAgICAgICAgICAgICAgICB1ICs9IDQ7CisgICAgICAgICAgICAgICAgICAgIG5ld09mZnNldCA9IGdldE5ld09mZnNldChhbGxJbmRleGVzLCBhbGxTaXplcywgdiwgbGFiZWwpOworICAgICAgICAgICAgICAgICAgICBuZXdDb2RlLnB1dEludChuZXdPZmZzZXQpOworICAgICAgICAgICAgICAgICAgICBqID0gcmVhZEludChiLCB1KTsKKyAgICAgICAgICAgICAgICAgICAgdSArPSA0OworICAgICAgICAgICAgICAgICAgICBuZXdDb2RlLnB1dEludChqKTsKKyAgICAgICAgICAgICAgICAgICAgaiA9IHJlYWRJbnQoYiwgdSkgLSBqICsgMTsKKyAgICAgICAgICAgICAgICAgICAgdSArPSA0OworICAgICAgICAgICAgICAgICAgICBuZXdDb2RlLnB1dEludChyZWFkSW50KGIsIHUgLSA0KSk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoOyBqID4gMDsgLS1qKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IHYgKyByZWFkSW50KGIsIHUpOworICAgICAgICAgICAgICAgICAgICAgICAgdSArPSA0OworICAgICAgICAgICAgICAgICAgICAgICAgbmV3T2Zmc2V0ID0gZ2V0TmV3T2Zmc2V0KGFsbEluZGV4ZXMsIGFsbFNpemVzLCB2LCBsYWJlbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb2RlLnB1dEludChuZXdPZmZzZXQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuTE9PS19JTlNOOgorICAgICAgICAgICAgICAgICAgICAvLyBza2lwcyAwIHRvIDMgcGFkZGluZyBieXRlcworICAgICAgICAgICAgICAgICAgICB2ID0gdTsKKyAgICAgICAgICAgICAgICAgICAgdSA9IHUgKyA0IC0gKHYgJiAzKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVhZHMgYW5kIGNvcGllcyBpbnN0cnVjdGlvbgorICAgICAgICAgICAgICAgICAgICBuZXdDb2RlLnB1dEJ5dGUoT3Bjb2Rlcy5MT09LVVBTV0lUQ0gpOworICAgICAgICAgICAgICAgICAgICBuZXdDb2RlLnB1dEJ5dGVBcnJheShudWxsLCAwLCAoNCAtIG5ld0NvZGUubGVuZ3RoICUgNCkgJSA0KTsKKyAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSB2ICsgcmVhZEludChiLCB1KTsKKyAgICAgICAgICAgICAgICAgICAgdSArPSA0OworICAgICAgICAgICAgICAgICAgICBuZXdPZmZzZXQgPSBnZXROZXdPZmZzZXQoYWxsSW5kZXhlcywgYWxsU2l6ZXMsIHYsIGxhYmVsKTsKKyAgICAgICAgICAgICAgICAgICAgbmV3Q29kZS5wdXRJbnQobmV3T2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgaiA9IHJlYWRJbnQoYiwgdSk7CisgICAgICAgICAgICAgICAgICAgIHUgKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgbmV3Q29kZS5wdXRJbnQoaik7CisgICAgICAgICAgICAgICAgICAgIGZvciAoOyBqID4gMDsgLS1qKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdDb2RlLnB1dEludChyZWFkSW50KGIsIHUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHUgKz0gNDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsID0gdiArIHJlYWRJbnQoYiwgdSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1ICs9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdPZmZzZXQgPSBnZXROZXdPZmZzZXQoYWxsSW5kZXhlcywgYWxsU2l6ZXMsIHYsIGxhYmVsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvZGUucHV0SW50KG5ld09mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5XSURFX0lOU046CisgICAgICAgICAgICAgICAgICAgIG9wY29kZSA9IGJbdSArIDFdICYgMHhGRjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9wY29kZSA9PSBPcGNvZGVzLklJTkMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NvZGUucHV0Qnl0ZUFycmF5KGIsIHUsIDYpOworICAgICAgICAgICAgICAgICAgICAgICAgdSArPSA2OworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29kZS5wdXRCeXRlQXJyYXkoYiwgdSwgNCk7CisgICAgICAgICAgICAgICAgICAgICAgICB1ICs9IDQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5WQVJfSU5TTjoKKyAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLlNCWVRFX0lOU046CisgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5MRENfSU5TTjoKKyAgICAgICAgICAgICAgICAgICAgbmV3Q29kZS5wdXRCeXRlQXJyYXkoYiwgdSwgMik7CisgICAgICAgICAgICAgICAgICAgIHUgKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5TSE9SVF9JTlNOOgorICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuTERDV19JTlNOOgorICAgICAgICAgICAgICAgIGNhc2UgQ2xhc3NXcml0ZXIuRklFTERPUk1FVEhfSU5TTjoKKyAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLlRZUEVfSU5TTjoKKyAgICAgICAgICAgICAgICBjYXNlIENsYXNzV3JpdGVyLklJTkNfSU5TTjoKKyAgICAgICAgICAgICAgICAgICAgbmV3Q29kZS5wdXRCeXRlQXJyYXkoYiwgdSwgMyk7CisgICAgICAgICAgICAgICAgICAgIHUgKz0gMzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5JVEZNRVRIX0lOU046CisgICAgICAgICAgICAgICAgY2FzZSBDbGFzc1dyaXRlci5JTkRZTUVUSF9JTlNOOgorICAgICAgICAgICAgICAgICAgICBuZXdDb2RlLnB1dEJ5dGVBcnJheShiLCB1LCA1KTsKKyAgICAgICAgICAgICAgICAgICAgdSArPSA1OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAvLyBjYXNlIE1BTkFfSU5TTjoKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBuZXdDb2RlLnB1dEJ5dGVBcnJheShiLCB1LCA0KTsKKyAgICAgICAgICAgICAgICAgICAgdSArPSA0OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHVwZGF0ZXMgdGhlIHN0YWNrIG1hcCBmcmFtZSBsYWJlbHMKKyAgICAgICAgaWYgKGNvbXB1dGUgPT0gRlJBTUVTKSB7CisgICAgICAgICAgICBMYWJlbCBsID0gbGFiZWxzOworICAgICAgICAgICAgd2hpbGUgKGwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogRGV0ZWN0cyB0aGUgbGFiZWxzIHRoYXQgYXJlIGp1c3QgYWZ0ZXIgYW4gSUYgaW5zdHJ1Y3Rpb24gdGhhdAorICAgICAgICAgICAgICAgICAqIGhhcyBiZWVuIHJlc2l6ZWQgd2l0aCB0aGUgSUZOT1QgR09UT19XIHBhdHRlcm4uIFRoZXNlIGxhYmVscworICAgICAgICAgICAgICAgICAqIGFyZSBub3cgdGhlIHRhcmdldCBvZiBhIGp1bXAgaW5zdHJ1Y3Rpb24gKHRoZSBJRk5PVAorICAgICAgICAgICAgICAgICAqIGluc3RydWN0aW9uKS4gTm90ZSB0aGF0IHdlIG5lZWQgdGhlIG9yaWdpbmFsIGxhYmVsIHBvc2l0aW9uCisgICAgICAgICAgICAgICAgICogaGVyZS4gZ2V0TmV3T2Zmc2V0IG11c3QgdGhlcmVmb3JlIG5ldmVyIGhhdmUgYmVlbiBjYWxsZWQgZm9yCisgICAgICAgICAgICAgICAgICogdGhpcyBsYWJlbC4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICB1ID0gbC5wb3NpdGlvbiAtIDM7CisgICAgICAgICAgICAgICAgaWYgKHUgPj0gMCAmJiByZXNpemVbdV0pIHsKKyAgICAgICAgICAgICAgICAgICAgbC5zdGF0dXMgfD0gTGFiZWwuVEFSR0VUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnZXROZXdPZmZzZXQoYWxsSW5kZXhlcywgYWxsU2l6ZXMsIGwpOworICAgICAgICAgICAgICAgIGwgPSBsLnN1Y2Nlc3NvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgb2Zmc2V0cyBpbiB0aGUgdW5pbml0aWFsaXplZCB0eXBlcworICAgICAgICAgICAgaWYgKGN3LnR5cGVUYWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGN3LnR5cGVUYWJsZS5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBJdGVtIGl0ZW0gPSBjdy50eXBlVGFibGVbaV07CisgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtICE9IG51bGwgJiYgaXRlbS50eXBlID09IENsYXNzV3JpdGVyLlRZUEVfVU5JTklUKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmludFZhbCA9IGdldE5ld09mZnNldChhbGxJbmRleGVzLCBhbGxTaXplcywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5pbnRWYWwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gVGhlIHN0YWNrIG1hcCBmcmFtZXMgYXJlIG5vdCBzZXJpYWxpemVkIHlldCwgc28gd2UgZG9uJ3QgbmVlZAorICAgICAgICAgICAgLy8gdG8gdXBkYXRlIHRoZW0uIFRoZXkgd2lsbCBiZSBzZXJpYWxpemVkIGluIHZpc2l0TWF4cy4KKyAgICAgICAgfSBlbHNlIGlmIChmcmFtZUNvdW50ID4gMCkgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFJlc2l6aW5nIGFuIGV4aXN0aW5nIHN0YWNrIG1hcCBmcmFtZSB0YWJsZSBpcyByZWFsbHkgaGFyZC4gTm90CisgICAgICAgICAgICAgKiBvbmx5IHRoZSB0YWJsZSBtdXN0IGJlIHBhcnNlZCB0byB1cGRhdGUgdGhlIG9mZmV0cywgYnV0IG5ldworICAgICAgICAgICAgICogZnJhbWVzIG1heSBiZSBuZWVkZWQgZm9yIGp1bXAgaW5zdHJ1Y3Rpb25zIHRoYXQgd2VyZSBpbnNlcnRlZCBieQorICAgICAgICAgICAgICogdGhpcyBtZXRob2QuIEFuZCB1cGRhdGluZyB0aGUgb2Zmc2V0cyBvciBpbnNlcnRpbmcgZnJhbWVzIGNhbgorICAgICAgICAgICAgICogY2hhbmdlIHRoZSBmb3JtYXQgb2YgdGhlIGZvbGxvd2luZyBmcmFtZXMsIGluIGNhc2Ugb2YgcGFja2VkCisgICAgICAgICAgICAgKiBmcmFtZXMuIEluIHByYWN0aWNlIHRoZSB3aG9sZSB0YWJsZSBtdXN0IGJlIHJlY29tcHV0ZWQuIEZvciB0aGlzCisgICAgICAgICAgICAgKiB0aGUgZnJhbWVzIGFyZSBtYXJrZWQgYXMgcG90ZW50aWFsbHkgaW52YWxpZC4gVGhpcyB3aWxsIGNhdXNlIHRoZQorICAgICAgICAgICAgICogd2hvbGUgY2xhc3MgdG8gYmUgcmVyZWFkIGFuZCByZXdyaXR0ZW4gd2l0aCB0aGUgQ09NUFVURV9GUkFNRVMKKyAgICAgICAgICAgICAqIG9wdGlvbiAoc2VlIHRoZSBDbGFzc1dyaXRlci50b0J5dGVBcnJheSBtZXRob2QpLiBUaGlzIGlzIG5vdCB2ZXJ5CisgICAgICAgICAgICAgKiBlZmZpY2llbnQgYnV0IGlzIG11Y2ggZWFzaWVyIGFuZCByZXF1aXJlcyBtdWNoIGxlc3MgY29kZSB0aGFuIGFueQorICAgICAgICAgICAgICogb3RoZXIgbWV0aG9kIEkgY2FuIHRoaW5rIG9mLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBjdy5pbnZhbGlkRnJhbWVzID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICAvLyB1cGRhdGVzIHRoZSBleGNlcHRpb24gaGFuZGxlciBibG9jayBsYWJlbHMKKyAgICAgICAgSGFuZGxlciBoID0gZmlyc3RIYW5kbGVyOworICAgICAgICB3aGlsZSAoaCAhPSBudWxsKSB7CisgICAgICAgICAgICBnZXROZXdPZmZzZXQoYWxsSW5kZXhlcywgYWxsU2l6ZXMsIGguc3RhcnQpOworICAgICAgICAgICAgZ2V0TmV3T2Zmc2V0KGFsbEluZGV4ZXMsIGFsbFNpemVzLCBoLmVuZCk7CisgICAgICAgICAgICBnZXROZXdPZmZzZXQoYWxsSW5kZXhlcywgYWxsU2l6ZXMsIGguaGFuZGxlcik7CisgICAgICAgICAgICBoID0gaC5uZXh0OworICAgICAgICB9CisgICAgICAgIC8vIHVwZGF0ZXMgdGhlIGluc3RydWN0aW9ucyBhZGRyZXNzZXMgaW4gdGhlCisgICAgICAgIC8vIGxvY2FsIHZhciBhbmQgbGluZSBudW1iZXIgdGFibGVzCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICAgICAgICAgIEJ5dGVWZWN0b3IgYnYgPSBpID09IDAgPyBsb2NhbFZhciA6IGxvY2FsVmFyVHlwZTsKKyAgICAgICAgICAgIGlmIChidiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYiA9IGJ2LmRhdGE7CisgICAgICAgICAgICAgICAgdSA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKHUgPCBidi5sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSByZWFkVW5zaWduZWRTaG9ydChiLCB1KTsKKyAgICAgICAgICAgICAgICAgICAgbmV3T2Zmc2V0ID0gZ2V0TmV3T2Zmc2V0KGFsbEluZGV4ZXMsIGFsbFNpemVzLCAwLCBsYWJlbCk7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQoYiwgdSwgbmV3T2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgbGFiZWwgKz0gcmVhZFVuc2lnbmVkU2hvcnQoYiwgdSArIDIpOworICAgICAgICAgICAgICAgICAgICBuZXdPZmZzZXQgPSBnZXROZXdPZmZzZXQoYWxsSW5kZXhlcywgYWxsU2l6ZXMsIDAsIGxhYmVsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG5ld09mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVTaG9ydChiLCB1ICsgMiwgbmV3T2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgdSArPSAxMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxpbmVOdW1iZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgYiA9IGxpbmVOdW1iZXIuZGF0YTsKKyAgICAgICAgICAgIHUgPSAwOworICAgICAgICAgICAgd2hpbGUgKHUgPCBsaW5lTnVtYmVyLmxlbmd0aCkgeworICAgICAgICAgICAgICAgIHdyaXRlU2hvcnQoCisgICAgICAgICAgICAgICAgICAgICAgICBiLAorICAgICAgICAgICAgICAgICAgICAgICAgdSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldE5ld09mZnNldChhbGxJbmRleGVzLCBhbGxTaXplcywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZFVuc2lnbmVkU2hvcnQoYiwgdSkpKTsKKyAgICAgICAgICAgICAgICB1ICs9IDQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gdXBkYXRlcyB0aGUgbGFiZWxzIG9mIHRoZSBvdGhlciBhdHRyaWJ1dGVzCisgICAgICAgIEF0dHJpYnV0ZSBhdHRyID0gY2F0dHJzOworICAgICAgICB3aGlsZSAoYXR0ciAhPSBudWxsKSB7CisgICAgICAgICAgICBMYWJlbFtdIGxhYmVscyA9IGF0dHIuZ2V0TGFiZWxzKCk7CisgICAgICAgICAgICBpZiAobGFiZWxzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSBsYWJlbHMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0TmV3T2Zmc2V0KGFsbEluZGV4ZXMsIGFsbFNpemVzLCBsYWJlbHNbaV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF0dHIgPSBhdHRyLm5leHQ7CisgICAgICAgIH0KKworICAgICAgICAvLyByZXBsYWNlcyBvbGQgYnl0ZWNvZGVzIHdpdGggbmV3IG9uZXMKKyAgICAgICAgY29kZSA9IG5ld0NvZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgYW4gdW5zaWduZWQgc2hvcnQgdmFsdWUgaW4gdGhlIGdpdmVuIGJ5dGUgYXJyYXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgYSBieXRlIGFycmF5LgorICAgICAqIEBwYXJhbSBpbmRleAorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IGluZGV4IG9mIHRoZSB2YWx1ZSB0byBiZSByZWFkLgorICAgICAqIEByZXR1cm4gdGhlIHJlYWQgdmFsdWUuCisgICAgICovCisgICAgc3RhdGljIGludCByZWFkVW5zaWduZWRTaG9ydChmaW5hbCBieXRlW10gYiwgZmluYWwgaW50IGluZGV4KSB7CisgICAgICAgIHJldHVybiAoKGJbaW5kZXhdICYgMHhGRikgPDwgOCkgfCAoYltpbmRleCArIDFdICYgMHhGRik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgYSBzaWduZWQgc2hvcnQgdmFsdWUgaW4gdGhlIGdpdmVuIGJ5dGUgYXJyYXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgYSBieXRlIGFycmF5LgorICAgICAqIEBwYXJhbSBpbmRleAorICAgICAqICAgICAgICAgICAgdGhlIHN0YXJ0IGluZGV4IG9mIHRoZSB2YWx1ZSB0byBiZSByZWFkLgorICAgICAqIEByZXR1cm4gdGhlIHJlYWQgdmFsdWUuCisgICAgICovCisgICAgc3RhdGljIHNob3J0IHJlYWRTaG9ydChmaW5hbCBieXRlW10gYiwgZmluYWwgaW50IGluZGV4KSB7CisgICAgICAgIHJldHVybiAoc2hvcnQpICgoKGJbaW5kZXhdICYgMHhGRikgPDwgOCkgfCAoYltpbmRleCArIDFdICYgMHhGRikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIGEgc2lnbmVkIGludCB2YWx1ZSBpbiB0aGUgZ2l2ZW4gYnl0ZSBhcnJheS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiCisgICAgICogICAgICAgICAgICBhIGJ5dGUgYXJyYXkuCisgICAgICogQHBhcmFtIGluZGV4CisgICAgICogICAgICAgICAgICB0aGUgc3RhcnQgaW5kZXggb2YgdGhlIHZhbHVlIHRvIGJlIHJlYWQuCisgICAgICogQHJldHVybiB0aGUgcmVhZCB2YWx1ZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgaW50IHJlYWRJbnQoZmluYWwgYnl0ZVtdIGIsIGZpbmFsIGludCBpbmRleCkgeworICAgICAgICByZXR1cm4gKChiW2luZGV4XSAmIDB4RkYpIDw8IDI0KSB8ICgoYltpbmRleCArIDFdICYgMHhGRikgPDwgMTYpCisgICAgICAgICAgICAgICB8ICgoYltpbmRleCArIDJdICYgMHhGRikgPDwgOCkgfCAoYltpbmRleCArIDNdICYgMHhGRik7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVzIGEgc2hvcnQgdmFsdWUgaW4gdGhlIGdpdmVuIGJ5dGUgYXJyYXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYgorICAgICAqICAgICAgICAgICAgYSBieXRlIGFycmF5LgorICAgICAqIEBwYXJhbSBpbmRleAorICAgICAqICAgICAgICAgICAgd2hlcmUgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHNob3J0IHZhbHVlIG11c3QgYmUgd3JpdHRlbi4KKyAgICAgKiBAcGFyYW0gcworICAgICAqICAgICAgICAgICAgdGhlIHZhbHVlIHRvIGJlIHdyaXR0ZW4gaW4gdGhlIGdpdmVuIGJ5dGUgYXJyYXkuCisgICAgICovCisgICAgc3RhdGljIHZvaWQgd3JpdGVTaG9ydChmaW5hbCBieXRlW10gYiwgZmluYWwgaW50IGluZGV4LCBmaW5hbCBpbnQgcykgeworICAgICAgICBiW2luZGV4XSA9IChieXRlKSAocyA+Pj4gOCk7CisgICAgICAgIGJbaW5kZXggKyAxXSA9IChieXRlKSBzOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbXB1dGVzIHRoZSBmdXR1cmUgdmFsdWUgb2YgYSBieXRlY29kZSBvZmZzZXQuCisgICAgICogPHA+CisgICAgICogTm90ZTogaXQgaXMgcG9zc2libGUgdG8gaGF2ZSBzZXZlcmFsIGVudHJpZXMgZm9yIHRoZSBzYW1lIGluc3RydWN0aW9uIGluCisgICAgICogdGhlIDx0dD5pbmRleGVzPC90dD4gYW5kIDx0dD5zaXplczwvdHQ+OiB0d28gZW50cmllcyAoaW5kZXg9YSxzaXplPWIpIGFuZAorICAgICAqIChpbmRleD1hLHNpemU9YicpIGFyZSBlcXVpdmFsZW50IHRvIGEgc2luZ2xlIGVudHJ5IChpbmRleD1hLHNpemU9YitiJykuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5kZXhlcworICAgICAqICAgICAgICAgICAgY3VycmVudCBwb3NpdGlvbnMgb2YgdGhlIGluc3RydWN0aW9ucyB0byBiZSByZXNpemVkLiBFYWNoCisgICAgICogICAgICAgICAgICBpbnN0cnVjdGlvbiBtdXN0IGJlIGRlc2lnbmF0ZWQgYnkgdGhlIGluZGV4IG9mIGl0cyA8aT5sYXN0PC9pPgorICAgICAqICAgICAgICAgICAgYnl0ZSwgcGx1cyBvbmUgKG9yLCBpbiBvdGhlciB3b3JkcywgYnkgdGhlIGluZGV4IG9mIHRoZQorICAgICAqICAgICAgICAgICAgPGk+Zmlyc3Q8L2k+IGJ5dGUgb2YgdGhlIDxpPm5leHQ8L2k+IGluc3RydWN0aW9uKS4KKyAgICAgKiBAcGFyYW0gc2l6ZXMKKyAgICAgKiAgICAgICAgICAgIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgPGk+YWRkZWQ8L2k+IHRvIHRoZSBhYm92ZQorICAgICAqICAgICAgICAgICAgaW5zdHJ1Y3Rpb25zLiBNb3JlIHByZWNpc2VseSwgZm9yIGVhY2ggaSA8IDx0dD5sZW48L3R0PiwKKyAgICAgKiAgICAgICAgICAgIDx0dD5zaXplczwvdHQ+W2ldIGJ5dGVzIHdpbGwgYmUgYWRkZWQgYXQgdGhlIGVuZCBvZiB0aGUKKyAgICAgKiAgICAgICAgICAgIGluc3RydWN0aW9uIGRlc2lnbmF0ZWQgYnkgPHR0PmluZGV4ZXM8L3R0PltpXSBvciwgaWYKKyAgICAgKiAgICAgICAgICAgIDx0dD5zaXplczwvdHQ+W2ldIGlzIG5lZ2F0aXZlLCB0aGUgPGk+bGFzdDwvaT4gfAorICAgICAqICAgICAgICAgICAgPHR0PnNpemVzW2ldPC90dD58IGJ5dGVzIG9mIHRoZSBpbnN0cnVjdGlvbiB3aWxsIGJlIHJlbW92ZWQKKyAgICAgKiAgICAgICAgICAgICh0aGUgaW5zdHJ1Y3Rpb24gc2l6ZSA8aT5tdXN0IG5vdDwvaT4gYmVjb21lIG5lZ2F0aXZlIG9yCisgICAgICogICAgICAgICAgICBudWxsKS4KKyAgICAgKiBAcGFyYW0gYmVnaW4KKyAgICAgKiAgICAgICAgICAgIGluZGV4IG9mIHRoZSBmaXJzdCBieXRlIG9mIHRoZSBzb3VyY2UgaW5zdHJ1Y3Rpb24uCisgICAgICogQHBhcmFtIGVuZAorICAgICAqICAgICAgICAgICAgaW5kZXggb2YgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHRhcmdldCBpbnN0cnVjdGlvbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBmdXR1cmUgdmFsdWUgb2YgdGhlIGdpdmVuIGJ5dGVjb2RlIG9mZnNldC4KKyAgICAgKi8KKyAgICBzdGF0aWMgaW50IGdldE5ld09mZnNldChmaW5hbCBpbnRbXSBpbmRleGVzLCBmaW5hbCBpbnRbXSBzaXplcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgYmVnaW4sIGZpbmFsIGludCBlbmQpIHsKKyAgICAgICAgaW50IG9mZnNldCA9IGVuZCAtIGJlZ2luOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluZGV4ZXMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChiZWdpbiA8IGluZGV4ZXNbaV0gJiYgaW5kZXhlc1tpXSA8PSBlbmQpIHsKKyAgICAgICAgICAgICAgICAvLyBmb3J3YXJkIGp1bXAKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gc2l6ZXNbaV07CisgICAgICAgICAgICB9IGVsc2UgaWYgKGVuZCA8IGluZGV4ZXNbaV0gJiYgaW5kZXhlc1tpXSA8PSBiZWdpbikgeworICAgICAgICAgICAgICAgIC8vIGJhY2t3YXJkIGp1bXAKKyAgICAgICAgICAgICAgICBvZmZzZXQgLT0gc2l6ZXNbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG9mZnNldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGVzIHRoZSBvZmZzZXQgb2YgdGhlIGdpdmVuIGxhYmVsLgorICAgICAqCisgICAgICogQHBhcmFtIGluZGV4ZXMKKyAgICAgKiAgICAgICAgICAgIGN1cnJlbnQgcG9zaXRpb25zIG9mIHRoZSBpbnN0cnVjdGlvbnMgdG8gYmUgcmVzaXplZC4gRWFjaAorICAgICAqICAgICAgICAgICAgaW5zdHJ1Y3Rpb24gbXVzdCBiZSBkZXNpZ25hdGVkIGJ5IHRoZSBpbmRleCBvZiBpdHMgPGk+bGFzdDwvaT4KKyAgICAgKiAgICAgICAgICAgIGJ5dGUsIHBsdXMgb25lIChvciwgaW4gb3RoZXIgd29yZHMsIGJ5IHRoZSBpbmRleCBvZiB0aGUKKyAgICAgKiAgICAgICAgICAgIDxpPmZpcnN0PC9pPiBieXRlIG9mIHRoZSA8aT5uZXh0PC9pPiBpbnN0cnVjdGlvbikuCisgICAgICogQHBhcmFtIHNpemVzCisgICAgICogICAgICAgICAgICB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIDxpPmFkZGVkPC9pPiB0byB0aGUgYWJvdmUKKyAgICAgKiAgICAgICAgICAgIGluc3RydWN0aW9ucy4gTW9yZSBwcmVjaXNlbHksIGZvciBlYWNoIGkgPCA8dHQ+bGVuPC90dD4sCisgICAgICogICAgICAgICAgICA8dHQ+c2l6ZXM8L3R0PltpXSBieXRlcyB3aWxsIGJlIGFkZGVkIGF0IHRoZSBlbmQgb2YgdGhlCisgICAgICogICAgICAgICAgICBpbnN0cnVjdGlvbiBkZXNpZ25hdGVkIGJ5IDx0dD5pbmRleGVzPC90dD5baV0gb3IsIGlmCisgICAgICogICAgICAgICAgICA8dHQ+c2l6ZXM8L3R0PltpXSBpcyBuZWdhdGl2ZSwgdGhlIDxpPmxhc3Q8L2k+IHwKKyAgICAgKiAgICAgICAgICAgIDx0dD5zaXplc1tpXTwvdHQ+fCBieXRlcyBvZiB0aGUgaW5zdHJ1Y3Rpb24gd2lsbCBiZSByZW1vdmVkCisgICAgICogICAgICAgICAgICAodGhlIGluc3RydWN0aW9uIHNpemUgPGk+bXVzdCBub3Q8L2k+IGJlY29tZSBuZWdhdGl2ZSBvcgorICAgICAqICAgICAgICAgICAgbnVsbCkuCisgICAgICogQHBhcmFtIGxhYmVsCisgICAgICogICAgICAgICAgICB0aGUgbGFiZWwgd2hvc2Ugb2Zmc2V0IG11c3QgYmUgdXBkYXRlZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBnZXROZXdPZmZzZXQoZmluYWwgaW50W10gaW5kZXhlcywgZmluYWwgaW50W10gc2l6ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExhYmVsIGxhYmVsKSB7CisgICAgICAgIGlmICgobGFiZWwuc3RhdHVzICYgTGFiZWwuUkVTSVpFRCkgPT0gMCkgeworICAgICAgICAgICAgbGFiZWwucG9zaXRpb24gPSBnZXROZXdPZmZzZXQoaW5kZXhlcywgc2l6ZXMsIDAsIGxhYmVsLnBvc2l0aW9uKTsKKyAgICAgICAgICAgIGxhYmVsLnN0YXR1cyB8PSBMYWJlbC5SRVNJWkVEOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9qZXJzZXkvcmVwYWNrYWdlZC9vcmcvb2JqZWN0d2ViL2FzbS9PcGNvZGVzLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL2plcnNleS9yZXBhY2thZ2VkL29yZy9vYmplY3R3ZWIvYXNtL09wY29kZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmU0MDNmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9qZXJzZXkvcmVwYWNrYWdlZC9vcmcvb2JqZWN0d2ViL2FzbS9PcGNvZGVzLmphdmEKQEAgLTAsMCArMSwzNjUgQEAKKy8qKioKKyAqIEFTTTogYSB2ZXJ5IHNtYWxsIGFuZCBmYXN0IEphdmEgYnl0ZWNvZGUgbWFuaXB1bGF0aW9uIGZyYW1ld29yaworICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMTEgSU5SSUEsIEZyYW5jZSBUZWxlY29tCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMKKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisgKiAgICB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorICoKKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIgorICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQorICogTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUgorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YKKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUworICogSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GCisgKiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgKi8KK3BhY2thZ2UgamVyc2V5LnJlcGFja2FnZWQub3JnLm9iamVjdHdlYi5hc207CisKKy8qKgorICogRGVmaW5lcyB0aGUgSlZNIG9wY29kZXMsIGFjY2VzcyBmbGFncyBhbmQgYXJyYXkgdHlwZSBjb2Rlcy4gVGhpcyBpbnRlcmZhY2UKKyAqIGRvZXMgbm90IGRlZmluZSBhbGwgdGhlIEpWTSBvcGNvZGVzIGJlY2F1c2Ugc29tZSBvcGNvZGVzIGFyZSBhdXRvbWF0aWNhbGx5CisgKiBoYW5kbGVkLiBGb3IgZXhhbXBsZSwgdGhlIHhMT0FEIGFuZCB4U1RPUkUgb3Bjb2RlcyBhcmUgYXV0b21hdGljYWxseSByZXBsYWNlZAorICogYnkgeExPQURfbiBhbmQgeFNUT1JFX24gb3Bjb2RlcyB3aGVuIHBvc3NpYmxlLiBUaGUgeExPQURfbiBhbmQgeFNUT1JFX24KKyAqIG9wY29kZXMgYXJlIHRoZXJlZm9yZSBub3QgZGVmaW5lZCBpbiB0aGlzIGludGVyZmFjZS4gTGlrZXdpc2UgZm9yIExEQywKKyAqIGF1dG9tYXRpY2FsbHkgcmVwbGFjZWQgYnkgTERDX1cgb3IgTERDMl9XIHdoZW4gbmVjZXNzYXJ5LCBXSURFLCBHT1RPX1cgYW5kCisgKiBKU1JfVy4KKyAqCisgKiBAYXV0aG9yIEVyaWMgQnJ1bmV0b24KKyAqIEBhdXRob3IgRXVnZW5lIEt1bGVzaG92CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgT3Bjb2RlcyB7CisKKyAgICAvLyBBU00gQVBJIHZlcnNpb25zCisKKyAgICBpbnQgQVNNNCA9IDQgPDwgMTYgfCAwIDw8IDggfCAwOworICAgIGludCBBU001ID0gNSA8PCAxNiB8IDAgPDwgOCB8IDA7CisKKyAgICAvLyB2ZXJzaW9ucworCisgICAgaW50IFYxXzEgPSAzIDw8IDE2IHwgNDU7CisgICAgaW50IFYxXzIgPSAwIDw8IDE2IHwgNDY7CisgICAgaW50IFYxXzMgPSAwIDw8IDE2IHwgNDc7CisgICAgaW50IFYxXzQgPSAwIDw8IDE2IHwgNDg7CisgICAgaW50IFYxXzUgPSAwIDw8IDE2IHwgNDk7CisgICAgaW50IFYxXzYgPSAwIDw8IDE2IHwgNTA7CisgICAgaW50IFYxXzcgPSAwIDw8IDE2IHwgNTE7CisgICAgaW50IFYxXzggPSAwIDw8IDE2IHwgNTI7CisgICAgLy8gYWRkZWQgInN1cHBvcnQiIGZvciBqYXZhIDksIDEwLCAxMSBjb21waWxlZCBjbGFzc2VzCisgICAgaW50IFY5ID0gMCA8PCAxNiB8IDUzOworICAgIGludCBWMTAgPSAwIDw8IDE2IHwgNTQ7CisgICAgaW50IFYxMSA9IDAgPDwgMTYgfCA1NTsKKworICAgIC8vIGFjY2VzcyBmbGFncworCisgICAgaW50IEFDQ19QVUJMSUMgPSAweDAwMDE7IC8vIGNsYXNzLCBmaWVsZCwgbWV0aG9kCisgICAgaW50IEFDQ19QUklWQVRFID0gMHgwMDAyOyAvLyBjbGFzcywgZmllbGQsIG1ldGhvZAorICAgIGludCBBQ0NfUFJPVEVDVEVEID0gMHgwMDA0OyAvLyBjbGFzcywgZmllbGQsIG1ldGhvZAorICAgIGludCBBQ0NfU1RBVElDID0gMHgwMDA4OyAvLyBmaWVsZCwgbWV0aG9kCisgICAgaW50IEFDQ19GSU5BTCA9IDB4MDAxMDsgLy8gY2xhc3MsIGZpZWxkLCBtZXRob2QsIHBhcmFtZXRlcgorICAgIGludCBBQ0NfU1VQRVIgPSAweDAwMjA7IC8vIGNsYXNzCisgICAgaW50IEFDQ19TWU5DSFJPTklaRUQgPSAweDAwMjA7IC8vIG1ldGhvZAorICAgIGludCBBQ0NfVk9MQVRJTEUgPSAweDAwNDA7IC8vIGZpZWxkCisgICAgaW50IEFDQ19CUklER0UgPSAweDAwNDA7IC8vIG1ldGhvZAorICAgIGludCBBQ0NfVkFSQVJHUyA9IDB4MDA4MDsgLy8gbWV0aG9kCisgICAgaW50IEFDQ19UUkFOU0lFTlQgPSAweDAwODA7IC8vIGZpZWxkCisgICAgaW50IEFDQ19OQVRJVkUgPSAweDAxMDA7IC8vIG1ldGhvZAorICAgIGludCBBQ0NfSU5URVJGQUNFID0gMHgwMjAwOyAvLyBjbGFzcworICAgIGludCBBQ0NfQUJTVFJBQ1QgPSAweDA0MDA7IC8vIGNsYXNzLCBtZXRob2QKKyAgICBpbnQgQUNDX1NUUklDVCA9IDB4MDgwMDsgLy8gbWV0aG9kCisgICAgaW50IEFDQ19TWU5USEVUSUMgPSAweDEwMDA7IC8vIGNsYXNzLCBmaWVsZCwgbWV0aG9kLCBwYXJhbWV0ZXIKKyAgICBpbnQgQUNDX0FOTk9UQVRJT04gPSAweDIwMDA7IC8vIGNsYXNzCisgICAgaW50IEFDQ19FTlVNID0gMHg0MDAwOyAvLyBjbGFzcyg/KSBmaWVsZCBpbm5lcgorICAgIGludCBBQ0NfTUFOREFURUQgPSAweDgwMDA7IC8vIHBhcmFtZXRlcgorCisgICAgLy8gQVNNIHNwZWNpZmljIHBzZXVkbyBhY2Nlc3MgZmxhZ3MKKworICAgIGludCBBQ0NfREVQUkVDQVRFRCA9IDB4MjAwMDA7IC8vIGNsYXNzLCBmaWVsZCwgbWV0aG9kCisKKyAgICAvLyB0eXBlcyBmb3IgTkVXQVJSQVkKKworICAgIGludCBUX0JPT0xFQU4gPSA0OworICAgIGludCBUX0NIQVIgPSA1OworICAgIGludCBUX0ZMT0FUID0gNjsKKyAgICBpbnQgVF9ET1VCTEUgPSA3OworICAgIGludCBUX0JZVEUgPSA4OworICAgIGludCBUX1NIT1JUID0gOTsKKyAgICBpbnQgVF9JTlQgPSAxMDsKKyAgICBpbnQgVF9MT05HID0gMTE7CisKKyAgICAvLyB0YWdzIGZvciBIYW5kbGUKKworICAgIGludCBIX0dFVEZJRUxEID0gMTsKKyAgICBpbnQgSF9HRVRTVEFUSUMgPSAyOworICAgIGludCBIX1BVVEZJRUxEID0gMzsKKyAgICBpbnQgSF9QVVRTVEFUSUMgPSA0OworICAgIGludCBIX0lOVk9LRVZJUlRVQUwgPSA1OworICAgIGludCBIX0lOVk9LRVNUQVRJQyA9IDY7CisgICAgaW50IEhfSU5WT0tFU1BFQ0lBTCA9IDc7CisgICAgaW50IEhfTkVXSU5WT0tFU1BFQ0lBTCA9IDg7CisgICAgaW50IEhfSU5WT0tFSU5URVJGQUNFID0gOTsKKworICAgIC8vIHN0YWNrIG1hcCBmcmFtZSB0eXBlcworCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyBhbiBleHBhbmRlZCBmcmFtZS4gU2VlIHtAbGluayBDbGFzc1JlYWRlciNFWFBBTkRfRlJBTUVTfS4KKyAgICAgKi8KKyAgICBpbnQgRl9ORVcgPSAtMTsKKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgYSBjb21wcmVzc2VkIGZyYW1lIHdpdGggY29tcGxldGUgZnJhbWUgZGF0YS4KKyAgICAgKi8KKyAgICBpbnQgRl9GVUxMID0gMDsKKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgYSBjb21wcmVzc2VkIGZyYW1lIHdoZXJlIGxvY2FscyBhcmUgdGhlIHNhbWUgYXMgdGhlIGxvY2FscyBpbgorICAgICAqIHRoZSBwcmV2aW91cyBmcmFtZSwgZXhjZXB0IHRoYXQgYWRkaXRpb25hbCAxLTMgbG9jYWxzIGFyZSBkZWZpbmVkLCBhbmQKKyAgICAgKiB3aXRoIGFuIGVtcHR5IHN0YWNrLgorICAgICAqLworICAgIGludCBGX0FQUEVORCA9IDE7CisKKyAgICAvKioKKyAgICAgKiBSZXByZXNlbnRzIGEgY29tcHJlc3NlZCBmcmFtZSB3aGVyZSBsb2NhbHMgYXJlIHRoZSBzYW1lIGFzIHRoZSBsb2NhbHMgaW4KKyAgICAgKiB0aGUgcHJldmlvdXMgZnJhbWUsIGV4Y2VwdCB0aGF0IHRoZSBsYXN0IDEtMyBsb2NhbHMgYXJlIGFic2VudCBhbmQgd2l0aAorICAgICAqIGFuIGVtcHR5IHN0YWNrLgorICAgICAqLworICAgIGludCBGX0NIT1AgPSAyOworCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyBhIGNvbXByZXNzZWQgZnJhbWUgd2l0aCBleGFjdGx5IHRoZSBzYW1lIGxvY2FscyBhcyB0aGUKKyAgICAgKiBwcmV2aW91cyBmcmFtZSBhbmQgd2l0aCBhbiBlbXB0eSBzdGFjay4KKyAgICAgKi8KKyAgICBpbnQgRl9TQU1FID0gMzsKKworICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgYSBjb21wcmVzc2VkIGZyYW1lIHdpdGggZXhhY3RseSB0aGUgc2FtZSBsb2NhbHMgYXMgdGhlCisgICAgICogcHJldmlvdXMgZnJhbWUgYW5kIHdpdGggYSBzaW5nbGUgdmFsdWUgb24gdGhlIHN0YWNrLgorICAgICAqLworICAgIGludCBGX1NBTUUxID0gNDsKKworICAgIEludGVnZXIgVE9QID0gbmV3IEludGVnZXIoMCk7CisgICAgSW50ZWdlciBJTlRFR0VSID0gbmV3IEludGVnZXIoMSk7CisgICAgSW50ZWdlciBGTE9BVCA9IG5ldyBJbnRlZ2VyKDIpOworICAgIEludGVnZXIgRE9VQkxFID0gbmV3IEludGVnZXIoMyk7CisgICAgSW50ZWdlciBMT05HID0gbmV3IEludGVnZXIoNCk7CisgICAgSW50ZWdlciBOVUxMID0gbmV3IEludGVnZXIoNSk7CisgICAgSW50ZWdlciBVTklOSVRJQUxJWkVEX1RISVMgPSBuZXcgSW50ZWdlcig2KTsKKworICAgIC8vIG9wY29kZXMgLy8gdmlzaXQgbWV0aG9kICgtID0gaWRlbSkKKworICAgIGludCBOT1AgPSAwOyAvLyB2aXNpdEluc24KKyAgICBpbnQgQUNPTlNUX05VTEwgPSAxOyAvLyAtCisgICAgaW50IElDT05TVF9NMSA9IDI7IC8vIC0KKyAgICBpbnQgSUNPTlNUXzAgPSAzOyAvLyAtCisgICAgaW50IElDT05TVF8xID0gNDsgLy8gLQorICAgIGludCBJQ09OU1RfMiA9IDU7IC8vIC0KKyAgICBpbnQgSUNPTlNUXzMgPSA2OyAvLyAtCisgICAgaW50IElDT05TVF80ID0gNzsgLy8gLQorICAgIGludCBJQ09OU1RfNSA9IDg7IC8vIC0KKyAgICBpbnQgTENPTlNUXzAgPSA5OyAvLyAtCisgICAgaW50IExDT05TVF8xID0gMTA7IC8vIC0KKyAgICBpbnQgRkNPTlNUXzAgPSAxMTsgLy8gLQorICAgIGludCBGQ09OU1RfMSA9IDEyOyAvLyAtCisgICAgaW50IEZDT05TVF8yID0gMTM7IC8vIC0KKyAgICBpbnQgRENPTlNUXzAgPSAxNDsgLy8gLQorICAgIGludCBEQ09OU1RfMSA9IDE1OyAvLyAtCisgICAgaW50IEJJUFVTSCA9IDE2OyAvLyB2aXNpdEludEluc24KKyAgICBpbnQgU0lQVVNIID0gMTc7IC8vIC0KKyAgICBpbnQgTERDID0gMTg7IC8vIHZpc2l0TGRjSW5zbgorICAgIC8vIGludCBMRENfVyA9IDE5OyAvLyAtCisgICAgLy8gaW50IExEQzJfVyA9IDIwOyAvLyAtCisgICAgaW50IElMT0FEID0gMjE7IC8vIHZpc2l0VmFySW5zbgorICAgIGludCBMTE9BRCA9IDIyOyAvLyAtCisgICAgaW50IEZMT0FEID0gMjM7IC8vIC0KKyAgICBpbnQgRExPQUQgPSAyNDsgLy8gLQorICAgIGludCBBTE9BRCA9IDI1OyAvLyAtCisgICAgLy8gaW50IElMT0FEXzAgPSAyNjsgLy8gLQorICAgIC8vIGludCBJTE9BRF8xID0gMjc7IC8vIC0KKyAgICAvLyBpbnQgSUxPQURfMiA9IDI4OyAvLyAtCisgICAgLy8gaW50IElMT0FEXzMgPSAyOTsgLy8gLQorICAgIC8vIGludCBMTE9BRF8wID0gMzA7IC8vIC0KKyAgICAvLyBpbnQgTExPQURfMSA9IDMxOyAvLyAtCisgICAgLy8gaW50IExMT0FEXzIgPSAzMjsgLy8gLQorICAgIC8vIGludCBMTE9BRF8zID0gMzM7IC8vIC0KKyAgICAvLyBpbnQgRkxPQURfMCA9IDM0OyAvLyAtCisgICAgLy8gaW50IEZMT0FEXzEgPSAzNTsgLy8gLQorICAgIC8vIGludCBGTE9BRF8yID0gMzY7IC8vIC0KKyAgICAvLyBpbnQgRkxPQURfMyA9IDM3OyAvLyAtCisgICAgLy8gaW50IERMT0FEXzAgPSAzODsgLy8gLQorICAgIC8vIGludCBETE9BRF8xID0gMzk7IC8vIC0KKyAgICAvLyBpbnQgRExPQURfMiA9IDQwOyAvLyAtCisgICAgLy8gaW50IERMT0FEXzMgPSA0MTsgLy8gLQorICAgIC8vIGludCBBTE9BRF8wID0gNDI7IC8vIC0KKyAgICAvLyBpbnQgQUxPQURfMSA9IDQzOyAvLyAtCisgICAgLy8gaW50IEFMT0FEXzIgPSA0NDsgLy8gLQorICAgIC8vIGludCBBTE9BRF8zID0gNDU7IC8vIC0KKyAgICBpbnQgSUFMT0FEID0gNDY7IC8vIHZpc2l0SW5zbgorICAgIGludCBMQUxPQUQgPSA0NzsgLy8gLQorICAgIGludCBGQUxPQUQgPSA0ODsgLy8gLQorICAgIGludCBEQUxPQUQgPSA0OTsgLy8gLQorICAgIGludCBBQUxPQUQgPSA1MDsgLy8gLQorICAgIGludCBCQUxPQUQgPSA1MTsgLy8gLQorICAgIGludCBDQUxPQUQgPSA1MjsgLy8gLQorICAgIGludCBTQUxPQUQgPSA1MzsgLy8gLQorICAgIGludCBJU1RPUkUgPSA1NDsgLy8gdmlzaXRWYXJJbnNuCisgICAgaW50IExTVE9SRSA9IDU1OyAvLyAtCisgICAgaW50IEZTVE9SRSA9IDU2OyAvLyAtCisgICAgaW50IERTVE9SRSA9IDU3OyAvLyAtCisgICAgaW50IEFTVE9SRSA9IDU4OyAvLyAtCisgICAgLy8gaW50IElTVE9SRV8wID0gNTk7IC8vIC0KKyAgICAvLyBpbnQgSVNUT1JFXzEgPSA2MDsgLy8gLQorICAgIC8vIGludCBJU1RPUkVfMiA9IDYxOyAvLyAtCisgICAgLy8gaW50IElTVE9SRV8zID0gNjI7IC8vIC0KKyAgICAvLyBpbnQgTFNUT1JFXzAgPSA2MzsgLy8gLQorICAgIC8vIGludCBMU1RPUkVfMSA9IDY0OyAvLyAtCisgICAgLy8gaW50IExTVE9SRV8yID0gNjU7IC8vIC0KKyAgICAvLyBpbnQgTFNUT1JFXzMgPSA2NjsgLy8gLQorICAgIC8vIGludCBGU1RPUkVfMCA9IDY3OyAvLyAtCisgICAgLy8gaW50IEZTVE9SRV8xID0gNjg7IC8vIC0KKyAgICAvLyBpbnQgRlNUT1JFXzIgPSA2OTsgLy8gLQorICAgIC8vIGludCBGU1RPUkVfMyA9IDcwOyAvLyAtCisgICAgLy8gaW50IERTVE9SRV8wID0gNzE7IC8vIC0KKyAgICAvLyBpbnQgRFNUT1JFXzEgPSA3MjsgLy8gLQorICAgIC8vIGludCBEU1RPUkVfMiA9IDczOyAvLyAtCisgICAgLy8gaW50IERTVE9SRV8zID0gNzQ7IC8vIC0KKyAgICAvLyBpbnQgQVNUT1JFXzAgPSA3NTsgLy8gLQorICAgIC8vIGludCBBU1RPUkVfMSA9IDc2OyAvLyAtCisgICAgLy8gaW50IEFTVE9SRV8yID0gNzc7IC8vIC0KKyAgICAvLyBpbnQgQVNUT1JFXzMgPSA3ODsgLy8gLQorICAgIGludCBJQVNUT1JFID0gNzk7IC8vIHZpc2l0SW5zbgorICAgIGludCBMQVNUT1JFID0gODA7IC8vIC0KKyAgICBpbnQgRkFTVE9SRSA9IDgxOyAvLyAtCisgICAgaW50IERBU1RPUkUgPSA4MjsgLy8gLQorICAgIGludCBBQVNUT1JFID0gODM7IC8vIC0KKyAgICBpbnQgQkFTVE9SRSA9IDg0OyAvLyAtCisgICAgaW50IENBU1RPUkUgPSA4NTsgLy8gLQorICAgIGludCBTQVNUT1JFID0gODY7IC8vIC0KKyAgICBpbnQgUE9QID0gODc7IC8vIC0KKyAgICBpbnQgUE9QMiA9IDg4OyAvLyAtCisgICAgaW50IERVUCA9IDg5OyAvLyAtCisgICAgaW50IERVUF9YMSA9IDkwOyAvLyAtCisgICAgaW50IERVUF9YMiA9IDkxOyAvLyAtCisgICAgaW50IERVUDIgPSA5MjsgLy8gLQorICAgIGludCBEVVAyX1gxID0gOTM7IC8vIC0KKyAgICBpbnQgRFVQMl9YMiA9IDk0OyAvLyAtCisgICAgaW50IFNXQVAgPSA5NTsgLy8gLQorICAgIGludCBJQUREID0gOTY7IC8vIC0KKyAgICBpbnQgTEFERCA9IDk3OyAvLyAtCisgICAgaW50IEZBREQgPSA5ODsgLy8gLQorICAgIGludCBEQUREID0gOTk7IC8vIC0KKyAgICBpbnQgSVNVQiA9IDEwMDsgLy8gLQorICAgIGludCBMU1VCID0gMTAxOyAvLyAtCisgICAgaW50IEZTVUIgPSAxMDI7IC8vIC0KKyAgICBpbnQgRFNVQiA9IDEwMzsgLy8gLQorICAgIGludCBJTVVMID0gMTA0OyAvLyAtCisgICAgaW50IExNVUwgPSAxMDU7IC8vIC0KKyAgICBpbnQgRk1VTCA9IDEwNjsgLy8gLQorICAgIGludCBETVVMID0gMTA3OyAvLyAtCisgICAgaW50IElESVYgPSAxMDg7IC8vIC0KKyAgICBpbnQgTERJViA9IDEwOTsgLy8gLQorICAgIGludCBGRElWID0gMTEwOyAvLyAtCisgICAgaW50IERESVYgPSAxMTE7IC8vIC0KKyAgICBpbnQgSVJFTSA9IDExMjsgLy8gLQorICAgIGludCBMUkVNID0gMTEzOyAvLyAtCisgICAgaW50IEZSRU0gPSAxMTQ7IC8vIC0KKyAgICBpbnQgRFJFTSA9IDExNTsgLy8gLQorICAgIGludCBJTkVHID0gMTE2OyAvLyAtCisgICAgaW50IExORUcgPSAxMTc7IC8vIC0KKyAgICBpbnQgRk5FRyA9IDExODsgLy8gLQorICAgIGludCBETkVHID0gMTE5OyAvLyAtCisgICAgaW50IElTSEwgPSAxMjA7IC8vIC0KKyAgICBpbnQgTFNITCA9IDEyMTsgLy8gLQorICAgIGludCBJU0hSID0gMTIyOyAvLyAtCisgICAgaW50IExTSFIgPSAxMjM7IC8vIC0KKyAgICBpbnQgSVVTSFIgPSAxMjQ7IC8vIC0KKyAgICBpbnQgTFVTSFIgPSAxMjU7IC8vIC0KKyAgICBpbnQgSUFORCA9IDEyNjsgLy8gLQorICAgIGludCBMQU5EID0gMTI3OyAvLyAtCisgICAgaW50IElPUiA9IDEyODsgLy8gLQorICAgIGludCBMT1IgPSAxMjk7IC8vIC0KKyAgICBpbnQgSVhPUiA9IDEzMDsgLy8gLQorICAgIGludCBMWE9SID0gMTMxOyAvLyAtCisgICAgaW50IElJTkMgPSAxMzI7IC8vIHZpc2l0SWluY0luc24KKyAgICBpbnQgSTJMID0gMTMzOyAvLyB2aXNpdEluc24KKyAgICBpbnQgSTJGID0gMTM0OyAvLyAtCisgICAgaW50IEkyRCA9IDEzNTsgLy8gLQorICAgIGludCBMMkkgPSAxMzY7IC8vIC0KKyAgICBpbnQgTDJGID0gMTM3OyAvLyAtCisgICAgaW50IEwyRCA9IDEzODsgLy8gLQorICAgIGludCBGMkkgPSAxMzk7IC8vIC0KKyAgICBpbnQgRjJMID0gMTQwOyAvLyAtCisgICAgaW50IEYyRCA9IDE0MTsgLy8gLQorICAgIGludCBEMkkgPSAxNDI7IC8vIC0KKyAgICBpbnQgRDJMID0gMTQzOyAvLyAtCisgICAgaW50IEQyRiA9IDE0NDsgLy8gLQorICAgIGludCBJMkIgPSAxNDU7IC8vIC0KKyAgICBpbnQgSTJDID0gMTQ2OyAvLyAtCisgICAgaW50IEkyUyA9IDE0NzsgLy8gLQorICAgIGludCBMQ01QID0gMTQ4OyAvLyAtCisgICAgaW50IEZDTVBMID0gMTQ5OyAvLyAtCisgICAgaW50IEZDTVBHID0gMTUwOyAvLyAtCisgICAgaW50IERDTVBMID0gMTUxOyAvLyAtCisgICAgaW50IERDTVBHID0gMTUyOyAvLyAtCisgICAgaW50IElGRVEgPSAxNTM7IC8vIHZpc2l0SnVtcEluc24KKyAgICBpbnQgSUZORSA9IDE1NDsgLy8gLQorICAgIGludCBJRkxUID0gMTU1OyAvLyAtCisgICAgaW50IElGR0UgPSAxNTY7IC8vIC0KKyAgICBpbnQgSUZHVCA9IDE1NzsgLy8gLQorICAgIGludCBJRkxFID0gMTU4OyAvLyAtCisgICAgaW50IElGX0lDTVBFUSA9IDE1OTsgLy8gLQorICAgIGludCBJRl9JQ01QTkUgPSAxNjA7IC8vIC0KKyAgICBpbnQgSUZfSUNNUExUID0gMTYxOyAvLyAtCisgICAgaW50IElGX0lDTVBHRSA9IDE2MjsgLy8gLQorICAgIGludCBJRl9JQ01QR1QgPSAxNjM7IC8vIC0KKyAgICBpbnQgSUZfSUNNUExFID0gMTY0OyAvLyAtCisgICAgaW50IElGX0FDTVBFUSA9IDE2NTsgLy8gLQorICAgIGludCBJRl9BQ01QTkUgPSAxNjY7IC8vIC0KKyAgICBpbnQgR09UTyA9IDE2NzsgLy8gLQorICAgIGludCBKU1IgPSAxNjg7IC8vIC0KKyAgICBpbnQgUkVUID0gMTY5OyAvLyB2aXNpdFZhckluc24KKyAgICBpbnQgVEFCTEVTV0lUQ0ggPSAxNzA7IC8vIHZpc2lUYWJsZVN3aXRjaEluc24KKyAgICBpbnQgTE9PS1VQU1dJVENIID0gMTcxOyAvLyB2aXNpdExvb2t1cFN3aXRjaAorICAgIGludCBJUkVUVVJOID0gMTcyOyAvLyB2aXNpdEluc24KKyAgICBpbnQgTFJFVFVSTiA9IDE3MzsgLy8gLQorICAgIGludCBGUkVUVVJOID0gMTc0OyAvLyAtCisgICAgaW50IERSRVRVUk4gPSAxNzU7IC8vIC0KKyAgICBpbnQgQVJFVFVSTiA9IDE3NjsgLy8gLQorICAgIGludCBSRVRVUk4gPSAxNzc7IC8vIC0KKyAgICBpbnQgR0VUU1RBVElDID0gMTc4OyAvLyB2aXNpdEZpZWxkSW5zbgorICAgIGludCBQVVRTVEFUSUMgPSAxNzk7IC8vIC0KKyAgICBpbnQgR0VURklFTEQgPSAxODA7IC8vIC0KKyAgICBpbnQgUFVURklFTEQgPSAxODE7IC8vIC0KKyAgICBpbnQgSU5WT0tFVklSVFVBTCA9IDE4MjsgLy8gdmlzaXRNZXRob2RJbnNuCisgICAgaW50IElOVk9LRVNQRUNJQUwgPSAxODM7IC8vIC0KKyAgICBpbnQgSU5WT0tFU1RBVElDID0gMTg0OyAvLyAtCisgICAgaW50IElOVk9LRUlOVEVSRkFDRSA9IDE4NTsgLy8gLQorICAgIGludCBJTlZPS0VEWU5BTUlDID0gMTg2OyAvLyB2aXNpdEludm9rZUR5bmFtaWNJbnNuCisgICAgaW50IE5FVyA9IDE4NzsgLy8gdmlzaXRUeXBlSW5zbgorICAgIGludCBORVdBUlJBWSA9IDE4ODsgLy8gdmlzaXRJbnRJbnNuCisgICAgaW50IEFORVdBUlJBWSA9IDE4OTsgLy8gdmlzaXRUeXBlSW5zbgorICAgIGludCBBUlJBWUxFTkdUSCA9IDE5MDsgLy8gdmlzaXRJbnNuCisgICAgaW50IEFUSFJPVyA9IDE5MTsgLy8gLQorICAgIGludCBDSEVDS0NBU1QgPSAxOTI7IC8vIHZpc2l0VHlwZUluc24KKyAgICBpbnQgSU5TVEFOQ0VPRiA9IDE5MzsgLy8gLQorICAgIGludCBNT05JVE9SRU5URVIgPSAxOTQ7IC8vIHZpc2l0SW5zbgorICAgIGludCBNT05JVE9SRVhJVCA9IDE5NTsgLy8gLQorICAgIC8vIGludCBXSURFID0gMTk2OyAvLyBOT1QgVklTSVRFRAorICAgIGludCBNVUxUSUFORVdBUlJBWSA9IDE5NzsgLy8gdmlzaXRNdWx0aUFOZXdBcnJheUluc24KKyAgICBpbnQgSUZOVUxMID0gMTk4OyAvLyB2aXNpdEp1bXBJbnNuCisgICAgaW50IElGTk9OTlVMTCA9IDE5OTsgLy8gLQorICAgIC8vIGludCBHT1RPX1cgPSAyMDA7IC8vIC0KKyAgICAvLyBpbnQgSlNSX1cgPSAyMDE7IC8vIC0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvamVyc2V5L3JlcGFja2FnZWQvb3JnL29iamVjdHdlYi9hc20vVHlwZS5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9qZXJzZXkvcmVwYWNrYWdlZC9vcmcvb2JqZWN0d2ViL2FzbS9UeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EyNzdjYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvamVyc2V5L3JlcGFja2FnZWQvb3JnL29iamVjdHdlYi9hc20vVHlwZS5qYXZhCkBAIC0wLDAgKzEsODk2IEBACisvKioqCisgKiBBU006IGEgdmVyeSBzbWFsbCBhbmQgZmFzdCBKYXZhIGJ5dGVjb2RlIG1hbmlwdWxhdGlvbiBmcmFtZXdvcmsKKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDExIElOUklBLCBGcmFuY2UgVGVsZWNvbQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoKKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAqIDMuIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIKKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MKKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOCisgKiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRgorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCitwYWNrYWdlIGplcnNleS5yZXBhY2thZ2VkLm9yZy5vYmplY3R3ZWIuYXNtOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworCisvKioKKyAqIEEgSmF2YSBmaWVsZCBvciBtZXRob2QgdHlwZS4gVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byBtYWtlIGl0IGVhc2llciB0bworICogbWFuaXB1bGF0ZSB0eXBlIGFuZCBtZXRob2QgZGVzY3JpcHRvcnMuCisgKgorICogQGF1dGhvciBFcmljIEJydW5ldG9uCisgKiBAYXV0aG9yIENocmlzIE5va2xlYmVyZworICovCitwdWJsaWMgY2xhc3MgVHlwZSB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc29ydCBvZiB0aGUgPHR0PnZvaWQ8L3R0PiB0eXBlLiBTZWUge0BsaW5rICNnZXRTb3J0IGdldFNvcnR9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFZPSUQgPSAwOworCisgICAgLyoqCisgICAgICogVGhlIHNvcnQgb2YgdGhlIDx0dD5ib29sZWFuPC90dD4gdHlwZS4gU2VlIHtAbGluayAjZ2V0U29ydCBnZXRTb3J0fS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBCT09MRUFOID0gMTsKKworICAgIC8qKgorICAgICAqIFRoZSBzb3J0IG9mIHRoZSA8dHQ+Y2hhcjwvdHQ+IHR5cGUuIFNlZSB7QGxpbmsgI2dldFNvcnQgZ2V0U29ydH0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0hBUiA9IDI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc29ydCBvZiB0aGUgPHR0PmJ5dGU8L3R0PiB0eXBlLiBTZWUge0BsaW5rICNnZXRTb3J0IGdldFNvcnR9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEJZVEUgPSAzOworCisgICAgLyoqCisgICAgICogVGhlIHNvcnQgb2YgdGhlIDx0dD5zaG9ydDwvdHQ+IHR5cGUuIFNlZSB7QGxpbmsgI2dldFNvcnQgZ2V0U29ydH0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0hPUlQgPSA0OworCisgICAgLyoqCisgICAgICogVGhlIHNvcnQgb2YgdGhlIDx0dD5pbnQ8L3R0PiB0eXBlLiBTZWUge0BsaW5rICNnZXRTb3J0IGdldFNvcnR9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IElOVCA9IDU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc29ydCBvZiB0aGUgPHR0PmZsb2F0PC90dD4gdHlwZS4gU2VlIHtAbGluayAjZ2V0U29ydCBnZXRTb3J0fS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBGTE9BVCA9IDY7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc29ydCBvZiB0aGUgPHR0Pmxvbmc8L3R0PiB0eXBlLiBTZWUge0BsaW5rICNnZXRTb3J0IGdldFNvcnR9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExPTkcgPSA3OworCisgICAgLyoqCisgICAgICogVGhlIHNvcnQgb2YgdGhlIDx0dD5kb3VibGU8L3R0PiB0eXBlLiBTZWUge0BsaW5rICNnZXRTb3J0IGdldFNvcnR9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERPVUJMRSA9IDg7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc29ydCBvZiBhcnJheSByZWZlcmVuY2UgdHlwZXMuIFNlZSB7QGxpbmsgI2dldFNvcnQgZ2V0U29ydH0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVJSQVkgPSA5OworCisgICAgLyoqCisgICAgICogVGhlIHNvcnQgb2Ygb2JqZWN0IHJlZmVyZW5jZSB0eXBlcy4gU2VlIHtAbGluayAjZ2V0U29ydCBnZXRTb3J0fS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBPQkpFQ1QgPSAxMDsKKworICAgIC8qKgorICAgICAqIFRoZSBzb3J0IG9mIG1ldGhvZCB0eXBlcy4gU2VlIHtAbGluayAjZ2V0U29ydCBnZXRTb3J0fS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNRVRIT0QgPSAxMTsKKworICAgIC8qKgorICAgICAqIFRoZSA8dHQ+dm9pZDwvdHQ+IHR5cGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlIFZPSURfVFlQRSA9IG5ldyBUeXBlKFZPSUQsIG51bGwsICgnVicgPDwgMjQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKDUgPDwgMTYpIHwgKDAgPDwgOCkgfCAwLCAxKTsKKworICAgIC8qKgorICAgICAqIFRoZSA8dHQ+Ym9vbGVhbjwvdHQ+IHR5cGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlIEJPT0xFQU5fVFlQRSA9IG5ldyBUeXBlKEJPT0xFQU4sIG51bGwsICgnWicgPDwgMjQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKDAgPDwgMTYpIHwgKDUgPDwgOCkgfCAxLCAxKTsKKworICAgIC8qKgorICAgICAqIFRoZSA8dHQ+Y2hhcjwvdHQ+IHR5cGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlIENIQVJfVFlQRSA9IG5ldyBUeXBlKENIQVIsIG51bGwsICgnQycgPDwgMjQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKDAgPDwgMTYpIHwgKDYgPDwgOCkgfCAxLCAxKTsKKworICAgIC8qKgorICAgICAqIFRoZSA8dHQ+Ynl0ZTwvdHQ+IHR5cGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUeXBlIEJZVEVfVFlQRSA9IG5ldyBUeXBlKEJZVEUsIG51bGwsICgnQicgPDwgMjQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKDAgPDwgMTYpIHwgKDUgPDwgOCkgfCAxLCAxKTsKKworICAgIC8qKgorICAgICAqIFRoZSA8dHQ+c2hvcnQ8L3R0PiB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZSBTSE9SVF9UWVBFID0gbmV3IFR5cGUoU0hPUlQsIG51bGwsICgnUycgPDwgMjQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoMCA8PCAxNikgfCAoNyA8PCA4KSB8IDEsIDEpOworCisgICAgLyoqCisgICAgICogVGhlIDx0dD5pbnQ8L3R0PiB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZSBJTlRfVFlQRSA9IG5ldyBUeXBlKElOVCwgbnVsbCwgKCdJJyA8PCAyNCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKDAgPDwgMTYpIHwgKDAgPDwgOCkgfCAxLCAxKTsKKworICAgIC8qKgorICAgICAqIFRoZSA8dHQ+ZmxvYXQ8L3R0PiB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZSBGTE9BVF9UWVBFID0gbmV3IFR5cGUoRkxPQVQsIG51bGwsICgnRicgPDwgMjQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoMiA8PCAxNikgfCAoMiA8PCA4KSB8IDEsIDEpOworCisgICAgLyoqCisgICAgICogVGhlIDx0dD5sb25nPC90dD4gdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFR5cGUgTE9OR19UWVBFID0gbmV3IFR5cGUoTE9ORywgbnVsbCwgKCdKJyA8PCAyNCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoMSA8PCAxNikgfCAoMSA8PCA4KSB8IDIsIDEpOworCisgICAgLyoqCisgICAgICogVGhlIDx0dD5kb3VibGU8L3R0PiB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVHlwZSBET1VCTEVfVFlQRSA9IG5ldyBUeXBlKERPVUJMRSwgbnVsbCwgKCdEJyA8PCAyNCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKDMgPDwgMTYpIHwgKDMgPDwgOCkgfCAyLCAxKTsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIEZpZWxkcworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqCisgICAgICogVGhlIHNvcnQgb2YgdGhpcyBKYXZhIHR5cGUuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgc29ydDsKKworICAgIC8qKgorICAgICAqIEEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGludGVybmFsIG5hbWUgb2YgdGhpcyBKYXZhIHR5cGUuIFRoaXMgZmllbGQgaXMKKyAgICAgKiBvbmx5IHVzZWQgZm9yIHJlZmVyZW5jZSB0eXBlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGNoYXJbXSBidWY7CisKKyAgICAvKioKKyAgICAgKiBUaGUgb2Zmc2V0IG9mIHRoZSBpbnRlcm5hbCBuYW1lIG9mIHRoaXMgSmF2YSB0eXBlIGluIHtAbGluayAjYnVmIGJ1Zn0gb3IsCisgICAgICogZm9yIHByaW1pdGl2ZSB0eXBlcywgdGhlIHNpemUsIGRlc2NyaXB0b3IgYW5kIGdldE9wY29kZSBvZmZzZXRzIGZvciB0aGlzCisgICAgICogdHlwZSAoYnl0ZSAwIGNvbnRhaW5zIHRoZSBzaXplLCBieXRlIDEgdGhlIGRlc2NyaXB0b3IsIGJ5dGUgMiB0aGUgb2Zmc2V0CisgICAgICogZm9yIElBTE9BRCBvciBJQVNUT1JFLCBieXRlIDMgdGhlIG9mZnNldCBmb3IgYWxsIG90aGVyIGluc3RydWN0aW9ucykuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgb2ZmOworCisgICAgLyoqCisgICAgICogVGhlIGxlbmd0aCBvZiB0aGUgaW50ZXJuYWwgbmFtZSBvZiB0aGlzIEphdmEgdHlwZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGludCBsZW47CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBDb25zdHJ1Y3RvcnMKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSByZWZlcmVuY2UgdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzb3J0CisgICAgICogICAgICAgICAgICB0aGUgc29ydCBvZiB0aGUgcmVmZXJlbmNlIHR5cGUgdG8gYmUgY29uc3RydWN0ZWQuCisgICAgICogQHBhcmFtIGJ1ZgorICAgICAqICAgICAgICAgICAgYSBidWZmZXIgY29udGFpbmluZyB0aGUgZGVzY3JpcHRvciBvZiB0aGUgcHJldmlvdXMgdHlwZS4KKyAgICAgKiBAcGFyYW0gb2ZmCisgICAgICogICAgICAgICAgICB0aGUgb2Zmc2V0IG9mIHRoaXMgZGVzY3JpcHRvciBpbiB0aGUgcHJldmlvdXMgYnVmZmVyLgorICAgICAqIEBwYXJhbSBsZW4KKyAgICAgKiAgICAgICAgICAgIHRoZSBsZW5ndGggb2YgdGhpcyBkZXNjcmlwdG9yLgorICAgICAqLworICAgIHByaXZhdGUgVHlwZShmaW5hbCBpbnQgc29ydCwgZmluYWwgY2hhcltdIGJ1ZiwgZmluYWwgaW50IG9mZiwgZmluYWwgaW50IGxlbikgeworICAgICAgICB0aGlzLnNvcnQgPSBzb3J0OworICAgICAgICB0aGlzLmJ1ZiA9IGJ1ZjsKKyAgICAgICAgdGhpcy5vZmYgPSBvZmY7CisgICAgICAgIHRoaXMubGVuID0gbGVuOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIEphdmEgdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiB0eXBlIGRlc2NyaXB0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZURlc2NyaXB0b3IKKyAgICAgKiAgICAgICAgICAgIGEgZmllbGQgb3IgbWV0aG9kIHR5cGUgZGVzY3JpcHRvci4KKyAgICAgKiBAcmV0dXJuIHRoZSBKYXZhIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gdHlwZSBkZXNjcmlwdG9yLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgVHlwZSBnZXRUeXBlKGZpbmFsIFN0cmluZyB0eXBlRGVzY3JpcHRvcikgeworICAgICAgICByZXR1cm4gZ2V0VHlwZSh0eXBlRGVzY3JpcHRvci50b0NoYXJBcnJheSgpLCAwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBKYXZhIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gaW50ZXJuYWwgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnRlcm5hbE5hbWUKKyAgICAgKiAgICAgICAgICAgIGFuIGludGVybmFsIG5hbWUuCisgICAgICogQHJldHVybiB0aGUgSmF2YSB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGludGVybmFsIG5hbWUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBUeXBlIGdldE9iamVjdFR5cGUoZmluYWwgU3RyaW5nIGludGVybmFsTmFtZSkgeworICAgICAgICBjaGFyW10gYnVmID0gaW50ZXJuYWxOYW1lLnRvQ2hhckFycmF5KCk7CisgICAgICAgIHJldHVybiBuZXcgVHlwZShidWZbMF0gPT0gJ1snID8gQVJSQVkgOiBPQkpFQ1QsIGJ1ZiwgMCwgYnVmLmxlbmd0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgSmF2YSB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIG1ldGhvZCBkZXNjcmlwdG9yLgorICAgICAqIEVxdWl2YWxlbnQgdG8gPGNvZGU+VHlwZS5nZXRUeXBlKG1ldGhvZERlc2NyaXB0b3IpPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXRob2REZXNjcmlwdG9yCisgICAgICogICAgICAgICAgICBhIG1ldGhvZCBkZXNjcmlwdG9yLgorICAgICAqIEByZXR1cm4gdGhlIEphdmEgdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBtZXRob2QgZGVzY3JpcHRvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFR5cGUgZ2V0TWV0aG9kVHlwZShmaW5hbCBTdHJpbmcgbWV0aG9kRGVzY3JpcHRvcikgeworICAgICAgICByZXR1cm4gZ2V0VHlwZShtZXRob2REZXNjcmlwdG9yLnRvQ2hhckFycmF5KCksIDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIEphdmEgbWV0aG9kIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYXJndW1lbnQgYW5kCisgICAgICogcmV0dXJuIHR5cGVzLgorICAgICAqCisgICAgICogQHBhcmFtIHJldHVyblR5cGUKKyAgICAgKiAgICAgICAgICAgIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgbWV0aG9kLgorICAgICAqIEBwYXJhbSBhcmd1bWVudFR5cGVzCisgICAgICogICAgICAgICAgICB0aGUgYXJndW1lbnQgdHlwZXMgb2YgdGhlIG1ldGhvZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBKYXZhIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gYXJndW1lbnQgYW5kIHJldHVybgorICAgICAqICAgICAgICAgdHlwZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBUeXBlIGdldE1ldGhvZFR5cGUoZmluYWwgVHlwZSByZXR1cm5UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFR5cGUuLi4gYXJndW1lbnRUeXBlcykgeworICAgICAgICByZXR1cm4gZ2V0VHlwZShnZXRNZXRob2REZXNjcmlwdG9yKHJldHVyblR5cGUsIGFyZ3VtZW50VHlwZXMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBKYXZhIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYworICAgICAqICAgICAgICAgICAgYSBjbGFzcy4KKyAgICAgKiBAcmV0dXJuIHRoZSBKYXZhIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gY2xhc3MuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBUeXBlIGdldFR5cGUoZmluYWwgQ2xhc3M8Pz4gYykgeworICAgICAgICBpZiAoYy5pc1ByaW1pdGl2ZSgpKSB7CisgICAgICAgICAgICBpZiAoYyA9PSBJbnRlZ2VyLlRZUEUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5UX1RZUEU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gVm9pZC5UWVBFKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFZPSURfVFlQRTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSBCb29sZWFuLlRZUEUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQk9PTEVBTl9UWVBFOworICAgICAgICAgICAgfSBlbHNlIGlmIChjID09IEJ5dGUuVFlQRSkgeworICAgICAgICAgICAgICAgIHJldHVybiBCWVRFX1RZUEU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gQ2hhcmFjdGVyLlRZUEUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ0hBUl9UWVBFOworICAgICAgICAgICAgfSBlbHNlIGlmIChjID09IFNob3J0LlRZUEUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gU0hPUlRfVFlQRTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSBEb3VibGUuVFlQRSkgeworICAgICAgICAgICAgICAgIHJldHVybiBET1VCTEVfVFlQRTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYyA9PSBGbG9hdC5UWVBFKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZMT0FUX1RZUEU7CisgICAgICAgICAgICB9IGVsc2UgLyogaWYgKGMgPT0gTG9uZy5UWVBFKSAqL3sKKyAgICAgICAgICAgICAgICByZXR1cm4gTE9OR19UWVBFOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGdldFR5cGUoZ2V0RGVzY3JpcHRvcihjKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBKYXZhIG1ldGhvZCB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGNvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGMKKyAgICAgKiAgICAgICAgICAgIGEge0BsaW5rIENvbnN0cnVjdG9yIENvbnN0cnVjdG9yfSBvYmplY3QuCisgICAgICogQHJldHVybiB0aGUgSmF2YSBtZXRob2QgdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBjb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFR5cGUgZ2V0VHlwZShmaW5hbCBDb25zdHJ1Y3Rvcjw/PiBjKSB7CisgICAgICAgIHJldHVybiBnZXRUeXBlKGdldENvbnN0cnVjdG9yRGVzY3JpcHRvcihjKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgSmF2YSBtZXRob2QgdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbQorICAgICAqICAgICAgICAgICAgYSB7QGxpbmsgTWV0aG9kIE1ldGhvZH0gb2JqZWN0LgorICAgICAqIEByZXR1cm4gdGhlIEphdmEgbWV0aG9kIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgVHlwZSBnZXRUeXBlKGZpbmFsIE1ldGhvZCBtKSB7CisgICAgICAgIHJldHVybiBnZXRUeXBlKGdldE1ldGhvZERlc2NyaXB0b3IobSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIEphdmEgdHlwZXMgY29ycmVzcG9uZGluZyB0byB0aGUgYXJndW1lbnQgdHlwZXMgb2YgdGhlIGdpdmVuCisgICAgICogbWV0aG9kIGRlc2NyaXB0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWV0aG9kRGVzY3JpcHRvcgorICAgICAqICAgICAgICAgICAgYSBtZXRob2QgZGVzY3JpcHRvci4KKyAgICAgKiBAcmV0dXJuIHRoZSBKYXZhIHR5cGVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGFyZ3VtZW50IHR5cGVzIG9mIHRoZSBnaXZlbgorICAgICAqICAgICAgICAgbWV0aG9kIGRlc2NyaXB0b3IuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBUeXBlW10gZ2V0QXJndW1lbnRUeXBlcyhmaW5hbCBTdHJpbmcgbWV0aG9kRGVzY3JpcHRvcikgeworICAgICAgICBjaGFyW10gYnVmID0gbWV0aG9kRGVzY3JpcHRvci50b0NoYXJBcnJheSgpOworICAgICAgICBpbnQgb2ZmID0gMTsKKyAgICAgICAgaW50IHNpemUgPSAwOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgY2hhciBjYXIgPSBidWZbb2ZmKytdOworICAgICAgICAgICAgaWYgKGNhciA9PSAnKScpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FyID09ICdMJykgeworICAgICAgICAgICAgICAgIHdoaWxlIChidWZbb2ZmKytdICE9ICc7JykgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICArK3NpemU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNhciAhPSAnWycpIHsKKyAgICAgICAgICAgICAgICArK3NpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgVHlwZVtdIGFyZ3MgPSBuZXcgVHlwZVtzaXplXTsKKyAgICAgICAgb2ZmID0gMTsKKyAgICAgICAgc2l6ZSA9IDA7CisgICAgICAgIHdoaWxlIChidWZbb2ZmXSAhPSAnKScpIHsKKyAgICAgICAgICAgIGFyZ3Nbc2l6ZV0gPSBnZXRUeXBlKGJ1Ziwgb2ZmKTsKKyAgICAgICAgICAgIG9mZiArPSBhcmdzW3NpemVdLmxlbiArIChhcmdzW3NpemVdLnNvcnQgPT0gT0JKRUNUID8gMiA6IDApOworICAgICAgICAgICAgc2l6ZSArPSAxOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhcmdzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIEphdmEgdHlwZXMgY29ycmVzcG9uZGluZyB0byB0aGUgYXJndW1lbnQgdHlwZXMgb2YgdGhlIGdpdmVuCisgICAgICogbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIG1ldGhvZAorICAgICAqICAgICAgICAgICAgYSBtZXRob2QuCisgICAgICogQHJldHVybiB0aGUgSmF2YSB0eXBlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBhcmd1bWVudCB0eXBlcyBvZiB0aGUgZ2l2ZW4KKyAgICAgKiAgICAgICAgIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFR5cGVbXSBnZXRBcmd1bWVudFR5cGVzKGZpbmFsIE1ldGhvZCBtZXRob2QpIHsKKyAgICAgICAgQ2xhc3M8Pz5bXSBjbGFzc2VzID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCk7CisgICAgICAgIFR5cGVbXSB0eXBlcyA9IG5ldyBUeXBlW2NsYXNzZXMubGVuZ3RoXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IGNsYXNzZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgICAgIHR5cGVzW2ldID0gZ2V0VHlwZShjbGFzc2VzW2ldKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHlwZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgSmF2YSB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJldHVybiB0eXBlIG9mIHRoZSBnaXZlbgorICAgICAqIG1ldGhvZCBkZXNjcmlwdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIG1ldGhvZERlc2NyaXB0b3IKKyAgICAgKiAgICAgICAgICAgIGEgbWV0aG9kIGRlc2NyaXB0b3IuCisgICAgICogQHJldHVybiB0aGUgSmF2YSB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHJldHVybiB0eXBlIG9mIHRoZSBnaXZlbgorICAgICAqICAgICAgICAgbWV0aG9kIGRlc2NyaXB0b3IuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBUeXBlIGdldFJldHVyblR5cGUoZmluYWwgU3RyaW5nIG1ldGhvZERlc2NyaXB0b3IpIHsKKyAgICAgICAgY2hhcltdIGJ1ZiA9IG1ldGhvZERlc2NyaXB0b3IudG9DaGFyQXJyYXkoKTsKKyAgICAgICAgcmV0dXJuIGdldFR5cGUoYnVmLCBtZXRob2REZXNjcmlwdG9yLmluZGV4T2YoJyknKSArIDEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIEphdmEgdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgZ2l2ZW4KKyAgICAgKiBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWV0aG9kCisgICAgICogICAgICAgICAgICBhIG1ldGhvZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBKYXZhIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIGdpdmVuCisgICAgICogICAgICAgICBtZXRob2QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBUeXBlIGdldFJldHVyblR5cGUoZmluYWwgTWV0aG9kIG1ldGhvZCkgeworICAgICAgICByZXR1cm4gZ2V0VHlwZShtZXRob2QuZ2V0UmV0dXJuVHlwZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wdXRlcyB0aGUgc2l6ZSBvZiB0aGUgYXJndW1lbnRzIGFuZCBvZiB0aGUgcmV0dXJuIHZhbHVlIG9mIGEgbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIGRlc2MKKyAgICAgKiAgICAgICAgICAgIHRoZSBkZXNjcmlwdG9yIG9mIGEgbWV0aG9kLgorICAgICAqIEByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGFyZ3VtZW50cyBvZiB0aGUgbWV0aG9kIChwbHVzIG9uZSBmb3IgdGhlCisgICAgICogICAgICAgICBpbXBsaWNpdCB0aGlzIGFyZ3VtZW50KSwgYXJnU2l6ZSwgYW5kIHRoZSBzaXplIG9mIGl0cyByZXR1cm4KKyAgICAgKiAgICAgICAgIHZhbHVlLCByZXRTaXplLCBwYWNrZWQgaW50byBhIHNpbmdsZSBpbnQgaSA9CisgICAgICogICAgICAgICA8dHQ+KGFyZ1NpemUgJmx0OyZsdDsgMikgfCByZXRTaXplPC90dD4gKGFyZ1NpemUgaXMgdGhlcmVmb3JlIGVxdWFsIHRvCisgICAgICogICAgICAgICA8dHQ+aSAmZ3Q7Jmd0OyAyPC90dD4sIGFuZCByZXRTaXplIHRvIDx0dD5pICZhbXA7IDB4MDM8L3R0PikuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0QXJndW1lbnRzQW5kUmV0dXJuU2l6ZXMoZmluYWwgU3RyaW5nIGRlc2MpIHsKKyAgICAgICAgaW50IG4gPSAxOworICAgICAgICBpbnQgYyA9IDE7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBjaGFyIGNhciA9IGRlc2MuY2hhckF0KGMrKyk7CisgICAgICAgICAgICBpZiAoY2FyID09ICcpJykgeworICAgICAgICAgICAgICAgIGNhciA9IGRlc2MuY2hhckF0KGMpOworICAgICAgICAgICAgICAgIHJldHVybiBuIDw8IDIKKyAgICAgICAgICAgICAgICAgICAgICAgfCAoY2FyID09ICdWJyA/IDAgOiAoY2FyID09ICdEJyB8fCBjYXIgPT0gJ0onID8gMiA6IDEpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY2FyID09ICdMJykgeworICAgICAgICAgICAgICAgIHdoaWxlIChkZXNjLmNoYXJBdChjKyspICE9ICc7JykgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBuICs9IDE7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNhciA9PSAnWycpIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKGNhciA9IGRlc2MuY2hhckF0KGMpKSA9PSAnWycpIHsKKyAgICAgICAgICAgICAgICAgICAgKytjOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY2FyID09ICdEJyB8fCBjYXIgPT0gJ0onKSB7CisgICAgICAgICAgICAgICAgICAgIG4gLT0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNhciA9PSAnRCcgfHwgY2FyID09ICdKJykgeworICAgICAgICAgICAgICAgIG4gKz0gMjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbiArPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgSmF2YSB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIHR5cGUgZGVzY3JpcHRvci4gRm9yCisgICAgICogbWV0aG9kIGRlc2NyaXB0b3JzLCBidWYgaXMgc3VwcG9zZWQgdG8gY29udGFpbiBub3RoaW5nIG1vcmUgdGhhbiB0aGUKKyAgICAgKiBkZXNjcmlwdG9yIGl0c2VsZi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBidWYKKyAgICAgKiAgICAgICAgICAgIGEgYnVmZmVyIGNvbnRhaW5pbmcgYSB0eXBlIGRlc2NyaXB0b3IuCisgICAgICogQHBhcmFtIG9mZgorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGlzIGRlc2NyaXB0b3IgaW4gdGhlIHByZXZpb3VzIGJ1ZmZlci4KKyAgICAgKiBAcmV0dXJuIHRoZSBKYXZhIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gdHlwZSBkZXNjcmlwdG9yLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFR5cGUgZ2V0VHlwZShmaW5hbCBjaGFyW10gYnVmLCBmaW5hbCBpbnQgb2ZmKSB7CisgICAgICAgIGludCBsZW47CisgICAgICAgIHN3aXRjaCAoYnVmW29mZl0pIHsKKyAgICAgICAgICAgIGNhc2UgJ1YnOgorICAgICAgICAgICAgICAgIHJldHVybiBWT0lEX1RZUEU7CisgICAgICAgICAgICBjYXNlICdaJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gQk9PTEVBTl9UWVBFOworICAgICAgICAgICAgY2FzZSAnQyc6CisgICAgICAgICAgICAgICAgcmV0dXJuIENIQVJfVFlQRTsKKyAgICAgICAgICAgIGNhc2UgJ0InOgorICAgICAgICAgICAgICAgIHJldHVybiBCWVRFX1RZUEU7CisgICAgICAgICAgICBjYXNlICdTJzoKKyAgICAgICAgICAgICAgICByZXR1cm4gU0hPUlRfVFlQRTsKKyAgICAgICAgICAgIGNhc2UgJ0knOgorICAgICAgICAgICAgICAgIHJldHVybiBJTlRfVFlQRTsKKyAgICAgICAgICAgIGNhc2UgJ0YnOgorICAgICAgICAgICAgICAgIHJldHVybiBGTE9BVF9UWVBFOworICAgICAgICAgICAgY2FzZSAnSic6CisgICAgICAgICAgICAgICAgcmV0dXJuIExPTkdfVFlQRTsKKyAgICAgICAgICAgIGNhc2UgJ0QnOgorICAgICAgICAgICAgICAgIHJldHVybiBET1VCTEVfVFlQRTsKKyAgICAgICAgICAgIGNhc2UgJ1snOgorICAgICAgICAgICAgICAgIGxlbiA9IDE7CisgICAgICAgICAgICAgICAgd2hpbGUgKGJ1ZltvZmYgKyBsZW5dID09ICdbJykgeworICAgICAgICAgICAgICAgICAgICArK2xlbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGJ1ZltvZmYgKyBsZW5dID09ICdMJykgeworICAgICAgICAgICAgICAgICAgICArK2xlbjsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGJ1ZltvZmYgKyBsZW5dICE9ICc7JykgeworICAgICAgICAgICAgICAgICAgICAgICAgKytsZW47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUeXBlKEFSUkFZLCBidWYsIG9mZiwgbGVuICsgMSk7CisgICAgICAgICAgICBjYXNlICdMJzoKKyAgICAgICAgICAgICAgICBsZW4gPSAxOworICAgICAgICAgICAgICAgIHdoaWxlIChidWZbb2ZmICsgbGVuXSAhPSAnOycpIHsKKyAgICAgICAgICAgICAgICAgICAgKytsZW47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgVHlwZShPQkpFQ1QsIGJ1Ziwgb2ZmICsgMSwgbGVuIC0gMSk7CisgICAgICAgICAgICAvLyBjYXNlICcoJzoKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUeXBlKE1FVEhPRCwgYnVmLCBvZmYsIGJ1Zi5sZW5ndGggLSBvZmYpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gQWNjZXNzb3JzCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzb3J0IG9mIHRoaXMgSmF2YSB0eXBlLgorICAgICAqCisgICAgICogQHJldHVybiB7QGxpbmsgI1ZPSUQgVk9JRH0sIHtAbGluayAjQk9PTEVBTiBCT09MRUFOfSwge0BsaW5rICNDSEFSIENIQVJ9LAorICAgICAqICAgICAgICAge0BsaW5rICNCWVRFIEJZVEV9LCB7QGxpbmsgI1NIT1JUIFNIT1JUfSwge0BsaW5rICNJTlQgSU5UfSwKKyAgICAgKiAgICAgICAgIHtAbGluayAjRkxPQVQgRkxPQVR9LCB7QGxpbmsgI0xPTkcgTE9OR30sIHtAbGluayAjRE9VQkxFIERPVUJMRX0sCisgICAgICogICAgICAgICB7QGxpbmsgI0FSUkFZIEFSUkFZfSwge0BsaW5rICNPQkpFQ1QgT0JKRUNUfSBvciB7QGxpbmsgI01FVEhPRAorICAgICAqICAgICAgICAgTUVUSE9EfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldFNvcnQoKSB7CisgICAgICAgIHJldHVybiBzb3J0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIG9mIHRoaXMgYXJyYXkgdHlwZS4gVGhpcyBtZXRob2Qgc2hvdWxkCisgICAgICogb25seSBiZSB1c2VkIGZvciBhbiBhcnJheSB0eXBlLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIGRpbWVuc2lvbnMgb2YgdGhpcyBhcnJheSB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0RGltZW5zaW9ucygpIHsKKyAgICAgICAgaW50IGkgPSAxOworICAgICAgICB3aGlsZSAoYnVmW29mZiArIGldID09ICdbJykgeworICAgICAgICAgICAgKytpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIGVsZW1lbnRzIG9mIHRoaXMgYXJyYXkgdHlwZS4gVGhpcyBtZXRob2Qgc2hvdWxkCisgICAgICogb25seSBiZSB1c2VkIGZvciBhbiBhcnJheSB0eXBlLgorICAgICAqCisgICAgICogQHJldHVybiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBlbGVtZW50cyBvZiB0aGlzIGFycmF5IHR5cGUuCisgICAgICovCisgICAgcHVibGljIFR5cGUgZ2V0RWxlbWVudFR5cGUoKSB7CisgICAgICAgIHJldHVybiBnZXRUeXBlKGJ1Ziwgb2ZmICsgZ2V0RGltZW5zaW9ucygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBiaW5hcnkgbmFtZSBvZiB0aGUgY2xhc3MgY29ycmVzcG9uZGluZyB0byB0aGlzIHR5cGUuIFRoaXMKKyAgICAgKiBtZXRob2QgbXVzdCBub3QgYmUgdXNlZCBvbiBtZXRob2QgdHlwZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBiaW5hcnkgbmFtZSBvZiB0aGUgY2xhc3MgY29ycmVzcG9uZGluZyB0byB0aGlzIHR5cGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7CisgICAgICAgIHN3aXRjaCAoc29ydCkgeworICAgICAgICAgICAgY2FzZSBWT0lEOgorICAgICAgICAgICAgICAgIHJldHVybiAidm9pZCI7CisgICAgICAgICAgICBjYXNlIEJPT0xFQU46CisgICAgICAgICAgICAgICAgcmV0dXJuICJib29sZWFuIjsKKyAgICAgICAgICAgIGNhc2UgQ0hBUjoKKyAgICAgICAgICAgICAgICByZXR1cm4gImNoYXIiOworICAgICAgICAgICAgY2FzZSBCWVRFOgorICAgICAgICAgICAgICAgIHJldHVybiAiYnl0ZSI7CisgICAgICAgICAgICBjYXNlIFNIT1JUOgorICAgICAgICAgICAgICAgIHJldHVybiAic2hvcnQiOworICAgICAgICAgICAgY2FzZSBJTlQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJpbnQiOworICAgICAgICAgICAgY2FzZSBGTE9BVDoKKyAgICAgICAgICAgICAgICByZXR1cm4gImZsb2F0IjsKKyAgICAgICAgICAgIGNhc2UgTE9ORzoKKyAgICAgICAgICAgICAgICByZXR1cm4gImxvbmciOworICAgICAgICAgICAgY2FzZSBET1VCTEU6CisgICAgICAgICAgICAgICAgcmV0dXJuICJkb3VibGUiOworICAgICAgICAgICAgY2FzZSBBUlJBWToKKyAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoZ2V0RWxlbWVudFR5cGUoKS5nZXRDbGFzc05hbWUoKSk7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IGdldERpbWVuc2lvbnMoKTsgaSA+IDA7IC0taSkgeworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIltdIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgICAgICAgICAgY2FzZSBPQkpFQ1Q6CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnVmLCBvZmYsIGxlbikucmVwbGFjZSgnLycsICcuJyk7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgaW50ZXJuYWwgbmFtZSBvZiB0aGUgY2xhc3MgY29ycmVzcG9uZGluZyB0byB0aGlzIG9iamVjdCBvcgorICAgICAqIGFycmF5IHR5cGUuIFRoZSBpbnRlcm5hbCBuYW1lIG9mIGEgY2xhc3MgaXMgaXRzIGZ1bGx5IHF1YWxpZmllZCBuYW1lIChhcworICAgICAqIHJldHVybmVkIGJ5IENsYXNzLmdldE5hbWUoKSwgd2hlcmUgJy4nIGFyZSByZXBsYWNlZCBieSAnLycuIFRoaXMgbWV0aG9kCisgICAgICogc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgYW4gb2JqZWN0IG9yIGFycmF5IHR5cGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBpbnRlcm5hbCBuYW1lIG9mIHRoZSBjbGFzcyBjb3JyZXNwb25kaW5nIHRvIHRoaXMgb2JqZWN0IHR5cGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbnRlcm5hbE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJ1Ziwgb2ZmLCBsZW4pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGFyZ3VtZW50IHR5cGVzIG9mIG1ldGhvZHMgb2YgdGhpcyB0eXBlLiBUaGlzIG1ldGhvZCBzaG91bGQKKyAgICAgKiBvbmx5IGJlIHVzZWQgZm9yIG1ldGhvZCB0eXBlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGFyZ3VtZW50IHR5cGVzIG9mIG1ldGhvZHMgb2YgdGhpcyB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBUeXBlW10gZ2V0QXJndW1lbnRUeXBlcygpIHsKKyAgICAgICAgcmV0dXJuIGdldEFyZ3VtZW50VHlwZXMoZ2V0RGVzY3JpcHRvcigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSByZXR1cm4gdHlwZSBvZiBtZXRob2RzIG9mIHRoaXMgdHlwZS4gVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkKKyAgICAgKiBiZSB1c2VkIGZvciBtZXRob2QgdHlwZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSByZXR1cm4gdHlwZSBvZiBtZXRob2RzIG9mIHRoaXMgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVHlwZSBnZXRSZXR1cm5UeXBlKCkgeworICAgICAgICByZXR1cm4gZ2V0UmV0dXJuVHlwZShnZXREZXNjcmlwdG9yKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIGFyZ3VtZW50cyBhbmQgb2YgdGhlIHJldHVybiB2YWx1ZSBvZiBtZXRob2RzIG9mCisgICAgICogdGhpcyB0eXBlLiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSB1c2VkIGZvciBtZXRob2QgdHlwZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBhcmd1bWVudHMgKHBsdXMgb25lIGZvciB0aGUgaW1wbGljaXQgdGhpcworICAgICAqICAgICAgICAgYXJndW1lbnQpLCBhcmdTaXplLCBhbmQgdGhlIHNpemUgb2YgdGhlIHJldHVybiB2YWx1ZSwgcmV0U2l6ZSwKKyAgICAgKiAgICAgICAgIHBhY2tlZCBpbnRvIGEgc2luZ2xlCisgICAgICogICAgICAgICBpbnQgaSA9IDx0dD4oYXJnU2l6ZSAmbHQ7Jmx0OyAyKSB8IHJldFNpemU8L3R0PgorICAgICAqICAgICAgICAgKGFyZ1NpemUgaXMgdGhlcmVmb3JlIGVxdWFsIHRvIDx0dD5pICZndDsmZ3Q7IDI8L3R0PiwKKyAgICAgKiAgICAgICAgIGFuZCByZXRTaXplIHRvIDx0dD5pICZhbXA7IDB4MDM8L3R0PikuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRBcmd1bWVudHNBbmRSZXR1cm5TaXplcygpIHsKKyAgICAgICAgcmV0dXJuIGdldEFyZ3VtZW50c0FuZFJldHVyblNpemVzKGdldERlc2NyaXB0b3IoKSk7CisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gQ29udmVyc2lvbiB0byB0eXBlIGRlc2NyaXB0b3JzCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdG9yIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBKYXZhIHR5cGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBkZXNjcmlwdG9yIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBKYXZhIHR5cGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdG9yKCkgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBnZXREZXNjcmlwdG9yKGJ1Zik7CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdG9yIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGFyZ3VtZW50IGFuZCByZXR1cm4KKyAgICAgKiB0eXBlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXR1cm5UeXBlCisgICAgICogICAgICAgICAgICB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gYXJndW1lbnRUeXBlcworICAgICAqICAgICAgICAgICAgdGhlIGFyZ3VtZW50IHR5cGVzIG9mIHRoZSBtZXRob2QuCisgICAgICogQHJldHVybiB0aGUgZGVzY3JpcHRvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBhcmd1bWVudCBhbmQgcmV0dXJuCisgICAgICogICAgICAgICB0eXBlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRNZXRob2REZXNjcmlwdG9yKGZpbmFsIFR5cGUgcmV0dXJuVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFR5cGUuLi4gYXJndW1lbnRUeXBlcykgeworICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOworICAgICAgICBidWYuYXBwZW5kKCcoJyk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJndW1lbnRUeXBlcy5sZW5ndGg7ICsraSkgeworICAgICAgICAgICAgYXJndW1lbnRUeXBlc1tpXS5nZXREZXNjcmlwdG9yKGJ1Zik7CisgICAgICAgIH0KKyAgICAgICAgYnVmLmFwcGVuZCgnKScpOworICAgICAgICByZXR1cm5UeXBlLmdldERlc2NyaXB0b3IoYnVmKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFwcGVuZHMgdGhlIGRlc2NyaXB0b3IgY29ycmVzcG9uZGluZyB0byB0aGlzIEphdmEgdHlwZSB0byB0aGUgZ2l2ZW4KKyAgICAgKiBzdHJpbmcgYnVmZmVyLgorICAgICAqCisgICAgICogQHBhcmFtIGJ1ZgorICAgICAqICAgICAgICAgICAgdGhlIHN0cmluZyBidWZmZXIgdG8gd2hpY2ggdGhlIGRlc2NyaXB0b3IgbXVzdCBiZSBhcHBlbmRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgZ2V0RGVzY3JpcHRvcihmaW5hbCBTdHJpbmdCdWZmZXIgYnVmKSB7CisgICAgICAgIGlmICh0aGlzLmJ1ZiA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBkZXNjcmlwdG9yIGlzIGluIGJ5dGUgMyBvZiAnb2ZmJyBmb3IgcHJpbWl0aXZlIHR5cGVzIChidWYgPT0KKyAgICAgICAgICAgIC8vIG51bGwpCisgICAgICAgICAgICBidWYuYXBwZW5kKChjaGFyKSAoKG9mZiAmIDB4RkYwMDAwMDApID4+PiAyNCkpOworICAgICAgICB9IGVsc2UgaWYgKHNvcnQgPT0gT0JKRUNUKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKCdMJyk7CisgICAgICAgICAgICBidWYuYXBwZW5kKHRoaXMuYnVmLCBvZmYsIGxlbik7CisgICAgICAgICAgICBidWYuYXBwZW5kKCc7Jyk7CisgICAgICAgIH0gZWxzZSB7IC8vIHNvcnQgPT0gQVJSQVkgfHwgc29ydCA9PSBNRVRIT0QKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQodGhpcy5idWYsIG9mZiwgbGVuKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIERpcmVjdCBjb252ZXJzaW9uIGZyb20gY2xhc3NlcyB0byB0eXBlIGRlc2NyaXB0b3JzLAorICAgIC8vIHdpdGhvdXQgaW50ZXJtZWRpYXRlIFR5cGUgb2JqZWN0cworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgaW50ZXJuYWwgbmFtZSBvZiB0aGUgZ2l2ZW4gY2xhc3MuIFRoZSBpbnRlcm5hbCBuYW1lIG9mIGEKKyAgICAgKiBjbGFzcyBpcyBpdHMgZnVsbHkgcXVhbGlmaWVkIG5hbWUsIGFzIHJldHVybmVkIGJ5IENsYXNzLmdldE5hbWUoKSwgd2hlcmUKKyAgICAgKiAnLicgYXJlIHJlcGxhY2VkIGJ5ICcvJy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjCisgICAgICogICAgICAgICAgICBhbiBvYmplY3Qgb3IgYXJyYXkgY2xhc3MuCisgICAgICogQHJldHVybiB0aGUgaW50ZXJuYWwgbmFtZSBvZiB0aGUgZ2l2ZW4gY2xhc3MuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0SW50ZXJuYWxOYW1lKGZpbmFsIENsYXNzPD8+IGMpIHsKKyAgICAgICAgcmV0dXJuIGMuZ2V0TmFtZSgpLnJlcGxhY2UoJy4nLCAnLycpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGRlc2NyaXB0b3IgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gSmF2YSB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIGMKKyAgICAgKiAgICAgICAgICAgIGFuIG9iamVjdCBjbGFzcywgYSBwcmltaXRpdmUgY2xhc3Mgb3IgYW4gYXJyYXkgY2xhc3MuCisgICAgICogQHJldHVybiB0aGUgZGVzY3JpcHRvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXREZXNjcmlwdG9yKGZpbmFsIENsYXNzPD8+IGMpIHsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgZ2V0RGVzY3JpcHRvcihidWYsIGMpOworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZGVzY3JpcHRvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjCisgICAgICogICAgICAgICAgICBhIHtAbGluayBDb25zdHJ1Y3RvciBDb25zdHJ1Y3Rvcn0gb2JqZWN0LgorICAgICAqIEByZXR1cm4gdGhlIGRlc2NyaXB0b3Igb2YgdGhlIGdpdmVuIGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldENvbnN0cnVjdG9yRGVzY3JpcHRvcihmaW5hbCBDb25zdHJ1Y3Rvcjw/PiBjKSB7CisgICAgICAgIENsYXNzPD8+W10gcGFyYW1ldGVycyA9IGMuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKyAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKyAgICAgICAgYnVmLmFwcGVuZCgnKCcpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlcnMubGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGdldERlc2NyaXB0b3IoYnVmLCBwYXJhbWV0ZXJzW2ldKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVmLmFwcGVuZCgiKVYiKS50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGRlc2NyaXB0b3IgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIG0KKyAgICAgKiAgICAgICAgICAgIGEge0BsaW5rIE1ldGhvZCBNZXRob2R9IG9iamVjdC4KKyAgICAgKiBAcmV0dXJuIHRoZSBkZXNjcmlwdG9yIG9mIHRoZSBnaXZlbiBtZXRob2QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWV0aG9kRGVzY3JpcHRvcihmaW5hbCBNZXRob2QgbSkgeworICAgICAgICBDbGFzczw/PltdIHBhcmFtZXRlcnMgPSBtLmdldFBhcmFtZXRlclR5cGVzKCk7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGJ1Zi5hcHBlbmQoJygnKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLmxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBnZXREZXNjcmlwdG9yKGJ1ZiwgcGFyYW1ldGVyc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgYnVmLmFwcGVuZCgnKScpOworICAgICAgICBnZXREZXNjcmlwdG9yKGJ1ZiwgbS5nZXRSZXR1cm5UeXBlKCkpOworICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwZW5kcyB0aGUgZGVzY3JpcHRvciBvZiB0aGUgZ2l2ZW4gY2xhc3MgdG8gdGhlIGdpdmVuIHN0cmluZyBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYnVmCisgICAgICogICAgICAgICAgICB0aGUgc3RyaW5nIGJ1ZmZlciB0byB3aGljaCB0aGUgZGVzY3JpcHRvciBtdXN0IGJlIGFwcGVuZGVkLgorICAgICAqIEBwYXJhbSBjCisgICAgICogICAgICAgICAgICB0aGUgY2xhc3Mgd2hvc2UgZGVzY3JpcHRvciBtdXN0IGJlIGNvbXB1dGVkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZ2V0RGVzY3JpcHRvcihmaW5hbCBTdHJpbmdCdWZmZXIgYnVmLCBmaW5hbCBDbGFzczw/PiBjKSB7CisgICAgICAgIENsYXNzPD8+IGQgPSBjOworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgaWYgKGQuaXNQcmltaXRpdmUoKSkgeworICAgICAgICAgICAgICAgIGNoYXIgY2FyOworICAgICAgICAgICAgICAgIGlmIChkID09IEludGVnZXIuVFlQRSkgeworICAgICAgICAgICAgICAgICAgICBjYXIgPSAnSSc7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkID09IFZvaWQuVFlQRSkgeworICAgICAgICAgICAgICAgICAgICBjYXIgPSAnVic7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkID09IEJvb2xlYW4uVFlQRSkgeworICAgICAgICAgICAgICAgICAgICBjYXIgPSAnWic7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkID09IEJ5dGUuVFlQRSkgeworICAgICAgICAgICAgICAgICAgICBjYXIgPSAnQic7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkID09IENoYXJhY3Rlci5UWVBFKSB7CisgICAgICAgICAgICAgICAgICAgIGNhciA9ICdDJzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGQgPT0gU2hvcnQuVFlQRSkgeworICAgICAgICAgICAgICAgICAgICBjYXIgPSAnUyc7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkID09IERvdWJsZS5UWVBFKSB7CisgICAgICAgICAgICAgICAgICAgIGNhciA9ICdEJzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGQgPT0gRmxvYXQuVFlQRSkgeworICAgICAgICAgICAgICAgICAgICBjYXIgPSAnRic7CisgICAgICAgICAgICAgICAgfSBlbHNlIC8qIGlmIChkID09IExvbmcuVFlQRSkgKi97CisgICAgICAgICAgICAgICAgICAgIGNhciA9ICdKJzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChjYXIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZC5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCdbJyk7CisgICAgICAgICAgICAgICAgZCA9IGQuZ2V0Q29tcG9uZW50VHlwZSgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCdMJyk7CisgICAgICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBkLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICBpbnQgbGVuID0gbmFtZS5sZW5ndGgoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgY2FyID0gbmFtZS5jaGFyQXQoaSk7CisgICAgICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoY2FyID09ICcuJyA/ICcvJyA6IGNhcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJzsnKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBDb3JyZXNwb25kaW5nIHNpemUgYW5kIG9wY29kZXMKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNpemUgb2YgdmFsdWVzIG9mIHRoaXMgdHlwZS4gVGhpcyBtZXRob2QgbXVzdCBub3QgYmUgdXNlZCBmb3IKKyAgICAgKiBtZXRob2QgdHlwZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBzaXplIG9mIHZhbHVlcyBvZiB0aGlzIHR5cGUsIGkuZS4sIDIgZm9yIDx0dD5sb25nPC90dD4gYW5kCisgICAgICogICAgICAgICA8dHQ+ZG91YmxlPC90dD4sIDAgZm9yIDx0dD52b2lkPC90dD4gYW5kIDEgb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgZ2V0U2l6ZSgpIHsKKyAgICAgICAgLy8gdGhlIHNpemUgaXMgaW4gYnl0ZSAwIG9mICdvZmYnIGZvciBwcmltaXRpdmUgdHlwZXMgKGJ1ZiA9PSBudWxsKQorICAgICAgICByZXR1cm4gYnVmID09IG51bGwgPyAob2ZmICYgMHhGRikgOiAxOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBKVk0gaW5zdHJ1Y3Rpb24gb3Bjb2RlIGFkYXB0ZWQgdG8gdGhpcyBKYXZhIHR5cGUuIFRoaXMgbWV0aG9kCisgICAgICogbXVzdCBub3QgYmUgdXNlZCBmb3IgbWV0aG9kIHR5cGVzLgorICAgICAqCisgICAgICogQHBhcmFtIG9wY29kZQorICAgICAqICAgICAgICAgICAgYSBKVk0gaW5zdHJ1Y3Rpb24gb3Bjb2RlLiBUaGlzIG9wY29kZSBtdXN0IGJlIG9uZSBvZiBJTE9BRCwKKyAgICAgKiAgICAgICAgICAgIElTVE9SRSwgSUFMT0FELCBJQVNUT1JFLCBJQURELCBJU1VCLCBJTVVMLCBJRElWLCBJUkVNLCBJTkVHLAorICAgICAqICAgICAgICAgICAgSVNITCwgSVNIUiwgSVVTSFIsIElBTkQsIElPUiwgSVhPUiBhbmQgSVJFVFVSTi4KKyAgICAgKiBAcmV0dXJuIGFuIG9wY29kZSB0aGF0IGlzIHNpbWlsYXIgdG8gdGhlIGdpdmVuIG9wY29kZSwgYnV0IGFkYXB0ZWQgdG8KKyAgICAgKiAgICAgICAgIHRoaXMgSmF2YSB0eXBlLiBGb3IgZXhhbXBsZSwgaWYgdGhpcyB0eXBlIGlzIDx0dD5mbG9hdDwvdHQ+IGFuZAorICAgICAqICAgICAgICAgPHR0Pm9wY29kZTwvdHQ+IGlzIElSRVRVUk4sIHRoaXMgbWV0aG9kIHJldHVybnMgRlJFVFVSTi4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldE9wY29kZShmaW5hbCBpbnQgb3Bjb2RlKSB7CisgICAgICAgIGlmIChvcGNvZGUgPT0gT3Bjb2Rlcy5JQUxPQUQgfHwgb3Bjb2RlID09IE9wY29kZXMuSUFTVE9SRSkgeworICAgICAgICAgICAgLy8gdGhlIG9mZnNldCBmb3IgSUFMT0FEIG9yIElBU1RPUkUgaXMgaW4gYnl0ZSAxIG9mICdvZmYnIGZvcgorICAgICAgICAgICAgLy8gcHJpbWl0aXZlIHR5cGVzIChidWYgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBvcGNvZGUgKyAoYnVmID09IG51bGwgPyAob2ZmICYgMHhGRjAwKSA+PiA4IDogNCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyB0aGUgb2Zmc2V0IGZvciBvdGhlciBpbnN0cnVjdGlvbnMgaXMgaW4gYnl0ZSAyIG9mICdvZmYnIGZvcgorICAgICAgICAgICAgLy8gcHJpbWl0aXZlIHR5cGVzIChidWYgPT0gbnVsbCkKKyAgICAgICAgICAgIHJldHVybiBvcGNvZGUgKyAoYnVmID09IG51bGwgPyAob2ZmICYgMHhGRjAwMDApID4+IDE2IDogNCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBFcXVhbHMsIGhhc2hDb2RlIGFuZCB0b1N0cmluZworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLyoqCisgICAgICogVGVzdHMgaWYgdGhlIGdpdmVuIG9iamVjdCBpcyBlcXVhbCB0byB0aGlzIHR5cGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbworICAgICAqICAgICAgICAgICAgdGhlIG9iamVjdCB0byBiZSBjb21wYXJlZCB0byB0aGlzIHR5cGUuCisgICAgICogQHJldHVybiA8dHQ+dHJ1ZTwvdHQ+IGlmIHRoZSBnaXZlbiBvYmplY3QgaXMgZXF1YWwgdG8gdGhpcyB0eXBlLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3QgbykgeworICAgICAgICBpZiAodGhpcyA9PSBvKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgVHlwZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBUeXBlIHQgPSAoVHlwZSkgbzsKKyAgICAgICAgaWYgKHNvcnQgIT0gdC5zb3J0KSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNvcnQgPj0gQVJSQVkpIHsKKyAgICAgICAgICAgIGlmIChsZW4gIT0gdC5sZW4pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludCBpID0gb2ZmLCBqID0gdC5vZmYsIGVuZCA9IGkgKyBsZW47IGkgPCBlbmQ7IGkrKywgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKGJ1ZltpXSAhPSB0LmJ1ZltqXSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoaXMgdHlwZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoaXMgdHlwZS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGMgPSAxMyAqIHNvcnQ7CisgICAgICAgIGlmIChzb3J0ID49IEFSUkFZKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gb2ZmLCBlbmQgPSBpICsgbGVuOyBpIDwgZW5kOyBpKyspIHsKKyAgICAgICAgICAgICAgICBoYyA9IDE3ICogKGhjICsgYnVmW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaGM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHR5cGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBkZXNjcmlwdG9yIG9mIHRoaXMgdHlwZS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gZ2V0RGVzY3JpcHRvcigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvamVyc2V5L3JlcGFja2FnZWQvb3JnL29iamVjdHdlYi9hc20vVHlwZVBhdGguamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvamVyc2V5L3JlcGFja2FnZWQvb3JnL29iamVjdHdlYi9hc20vVHlwZVBhdGguamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTk0MDBhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9qZXJzZXkvcmVwYWNrYWdlZC9vcmcvb2JqZWN0d2ViL2FzbS9UeXBlUGF0aC5qYXZhCkBAIC0wLDAgKzEsMTk2IEBACisvKioqDQorICogQVNNOiBhIHZlcnkgc21hbGwgYW5kIGZhc3QgSmF2YSBieXRlY29kZSBtYW5pcHVsYXRpb24gZnJhbWV3b3JrDQorICogQ29weXJpZ2h0IChjKSAyMDAwLTIwMTMgSU5SSUEsIEZyYW5jZSBUZWxlY29tDQorICogQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisgKg0KKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucw0KKyAqIGFyZSBtZXQ6DQorICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQNCisgKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlDQorICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4NCisgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVycyBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKyAqICAgIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tDQorICogICAgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4NCisgKg0KKyAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTIElTIg0KKyAqIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUNCisgKiBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQ0KKyAqIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRQ0KKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1INCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRg0KKyAqIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUw0KKyAqIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElODQorICogQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkNCisgKiBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GDQorICogVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLg0KKyAqLw0KKw0KK3BhY2thZ2UgamVyc2V5LnJlcGFja2FnZWQub3JnLm9iamVjdHdlYi5hc207DQorDQorLyoqDQorICogVGhlIHBhdGggdG8gYSB0eXBlIGFyZ3VtZW50LCB3aWxkY2FyZCBib3VuZCwgYXJyYXkgZWxlbWVudCB0eXBlLCBvciBzdGF0aWMNCisgKiBpbm5lciB0eXBlIHdpdGhpbiBhbiBlbmNsb3NpbmcgdHlwZS4NCisgKg0KKyAqIEBhdXRob3IgRXJpYyBCcnVuZXRvbg0KKyAqLw0KK3B1YmxpYyBjbGFzcyBUeXBlUGF0aCB7DQorDQorICAgIC8qKg0KKyAgICAgKiBBIHR5cGUgcGF0aCBzdGVwIHRoYXQgc3RlcHMgaW50byB0aGUgZWxlbWVudCB0eXBlIG9mIGFuIGFycmF5IHR5cGUuIFNlZQ0KKyAgICAgKiB7QGxpbmsgI2dldFN0ZXAgZ2V0U3RlcH0uDQorICAgICAqLw0KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBBUlJBWV9FTEVNRU5UID0gMDsNCisNCisgICAgLyoqDQorICAgICAqIEEgdHlwZSBwYXRoIHN0ZXAgdGhhdCBzdGVwcyBpbnRvIHRoZSBuZXN0ZWQgdHlwZSBvZiBhIGNsYXNzIHR5cGUuIFNlZQ0KKyAgICAgKiB7QGxpbmsgI2dldFN0ZXAgZ2V0U3RlcH0uDQorICAgICAqLw0KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBJTk5FUl9UWVBFID0gMTsNCisNCisgICAgLyoqDQorICAgICAqIEEgdHlwZSBwYXRoIHN0ZXAgdGhhdCBzdGVwcyBpbnRvIHRoZSBib3VuZCBvZiBhIHdpbGRjYXJkIHR5cGUuIFNlZQ0KKyAgICAgKiB7QGxpbmsgI2dldFN0ZXAgZ2V0U3RlcH0uDQorICAgICAqLw0KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBXSUxEQ0FSRF9CT1VORCA9IDI7DQorDQorICAgIC8qKg0KKyAgICAgKiBBIHR5cGUgcGF0aCBzdGVwIHRoYXQgc3RlcHMgaW50byBhIHR5cGUgYXJndW1lbnQgb2YgYSBnZW5lcmljIHR5cGUuIFNlZQ0KKyAgICAgKiB7QGxpbmsgI2dldFN0ZXAgZ2V0U3RlcH0uDQorICAgICAqLw0KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBUWVBFX0FSR1VNRU5UID0gMzsNCisNCisgICAgLyoqDQorICAgICAqIFRoZSBieXRlIGFycmF5IHdoZXJlIHRoZSBwYXRoIGlzIHN0b3JlZCwgaW4gSmF2YSBjbGFzcyBmaWxlIGZvcm1hdC4NCisgICAgICovDQorICAgIGJ5dGVbXSBiOw0KKw0KKyAgICAvKioNCisgICAgICogVGhlIG9mZnNldCBvZiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgdHlwZSBwYXRoIGluICdiJy4NCisgICAgICovDQorICAgIGludCBvZmZzZXQ7DQorDQorICAgIC8qKg0KKyAgICAgKiBDcmVhdGVzIGEgbmV3IHR5cGUgcGF0aC4NCisgICAgICoNCisgICAgICogQHBhcmFtIGINCisgICAgICogICAgICAgICAgICB0aGUgYnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSB0eXBlIHBhdGggaW4gSmF2YSBjbGFzcyBmaWxlDQorICAgICAqICAgICAgICAgICAgZm9ybWF0Lg0KKyAgICAgKiBAcGFyYW0gb2Zmc2V0DQorICAgICAqICAgICAgICAgICAgdGhlIG9mZnNldCBvZiB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgdHlwZSBwYXRoIGluICdiJy4NCisgICAgICovDQorICAgIFR5cGVQYXRoKGJ5dGVbXSBiLCBpbnQgb2Zmc2V0KSB7DQorICAgICAgICB0aGlzLmIgPSBiOw0KKyAgICAgICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQ7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGlzIHBhdGguDQorICAgICAqDQorICAgICAqIEByZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGlzIHBhdGguDQorICAgICAqLw0KKyAgICBwdWJsaWMgaW50IGdldExlbmd0aCgpIHsNCisgICAgICAgIHJldHVybiBiW29mZnNldF07DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBzdGVwIG9mIHRoaXMgcGF0aC4NCisgICAgICoNCisgICAgICogQHBhcmFtIGluZGV4DQorICAgICAqICAgICAgICAgICAgYW4gaW5kZXggYmV0d2VlbiAwIGFuZCB7QGxpbmsgI2dldExlbmd0aCgpfSwgZXhjbHVzaXZlLg0KKyAgICAgKiBAcmV0dXJuIHtAbGluayAjQVJSQVlfRUxFTUVOVCBBUlJBWV9FTEVNRU5UfSwge0BsaW5rICNJTk5FUl9UWVBFDQorICAgICAqICAgICAgICAgSU5ORVJfVFlQRX0sIHtAbGluayAjV0lMRENBUkRfQk9VTkQgV0lMRENBUkRfQk9VTkR9LCBvcg0KKyAgICAgKiAgICAgICAgIHtAbGluayAjVFlQRV9BUkdVTUVOVCBUWVBFX0FSR1VNRU5UfS4NCisgICAgICovDQorICAgIHB1YmxpYyBpbnQgZ2V0U3RlcChpbnQgaW5kZXgpIHsNCisgICAgICAgIHJldHVybiBiW29mZnNldCArIDIgKiBpbmRleCArIDFdOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgdHlwZSBhcmd1bWVudCB0aGF0IHRoZSBnaXZlbiBzdGVwIGlzIHN0ZXBwaW5nDQorICAgICAqIGludG8uIFRoaXMgbWV0aG9kIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHN0ZXBzIHdob3NlIHZhbHVlIGlzDQorICAgICAqIHtAbGluayAjVFlQRV9BUkdVTUVOVCBUWVBFX0FSR1VNRU5UfS4NCisgICAgICoNCisgICAgICogQHBhcmFtIGluZGV4DQorICAgICAqICAgICAgICAgICAgYW4gaW5kZXggYmV0d2VlbiAwIGFuZCB7QGxpbmsgI2dldExlbmd0aCgpfSwgZXhjbHVzaXZlLg0KKyAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgdHlwZSBhcmd1bWVudCB0aGF0IHRoZSBnaXZlbiBzdGVwIGlzIHN0ZXBwaW5nDQorICAgICAqICAgICAgICAgaW50by4NCisgICAgICovDQorICAgIHB1YmxpYyBpbnQgZ2V0U3RlcEFyZ3VtZW50KGludCBpbmRleCkgew0KKyAgICAgICAgcmV0dXJuIGJbb2Zmc2V0ICsgMiAqIGluZGV4ICsgMl07DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIENvbnZlcnRzIGEgdHlwZSBwYXRoIGluIHN0cmluZyBmb3JtLCBpbiB0aGUgZm9ybWF0IHVzZWQgYnkNCisgICAgICoge0BsaW5rICN0b1N0cmluZygpfSwgaW50byBhIFR5cGVQYXRoIG9iamVjdC4NCisgICAgICoNCisgICAgICogQHBhcmFtIHR5cGVQYXRoDQorICAgICAqICAgICAgICAgICAgYSB0eXBlIHBhdGggaW4gc3RyaW5nIGZvcm0sIGluIHRoZSBmb3JtYXQgdXNlZCBieQ0KKyAgICAgKiAgICAgICAgICAgIHtAbGluayAjdG9TdHJpbmcoKX0uIE1heSBiZSBudWxsIG9yIGVtcHR5Lg0KKyAgICAgKiBAcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIFR5cGVQYXRoIG9iamVjdCwgb3IgbnVsbCBpZiB0aGUgcGF0aCBpcyBlbXB0eS4NCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgVHlwZVBhdGggZnJvbVN0cmluZyhmaW5hbCBTdHJpbmcgdHlwZVBhdGgpIHsNCisgICAgICAgIGlmICh0eXBlUGF0aCA9PSBudWxsIHx8IHR5cGVQYXRoLmxlbmd0aCgpID09IDApIHsNCisgICAgICAgICAgICByZXR1cm4gbnVsbDsNCisgICAgICAgIH0NCisgICAgICAgIGludCBuID0gdHlwZVBhdGgubGVuZ3RoKCk7DQorICAgICAgICBCeXRlVmVjdG9yIG91dCA9IG5ldyBCeXRlVmVjdG9yKG4pOw0KKyAgICAgICAgb3V0LnB1dEJ5dGUoMCk7DQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47KSB7DQorICAgICAgICAgICAgY2hhciBjID0gdHlwZVBhdGguY2hhckF0KGkrKyk7DQorICAgICAgICAgICAgaWYgKGMgPT0gJ1snKSB7DQorICAgICAgICAgICAgICAgIG91dC5wdXQxMShBUlJBWV9FTEVNRU5ULCAwKTsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJy4nKSB7DQorICAgICAgICAgICAgICAgIG91dC5wdXQxMShJTk5FUl9UWVBFLCAwKTsNCisgICAgICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJyonKSB7DQorICAgICAgICAgICAgICAgIG91dC5wdXQxMShXSUxEQ0FSRF9CT1VORCwgMCk7DQorICAgICAgICAgICAgfSBlbHNlIGlmIChjID49ICcwJyAmJiBjIDw9ICc5Jykgew0KKyAgICAgICAgICAgICAgICBpbnQgdHlwZUFyZyA9IGMgLSAnMCc7DQorICAgICAgICAgICAgICAgIHdoaWxlIChpIDwgbiAmJiAoYyA9IHR5cGVQYXRoLmNoYXJBdChpKSkgPj0gJzAnICYmIGMgPD0gJzknKSB7DQorICAgICAgICAgICAgICAgICAgICB0eXBlQXJnID0gdHlwZUFyZyAqIDEwICsgYyAtICcwJzsNCisgICAgICAgICAgICAgICAgICAgIGkgKz0gMTsNCisgICAgICAgICAgICAgICAgfQ0KKyAgICAgICAgICAgICAgICBpZiAoaSA8IG4gJiYgdHlwZVBhdGguY2hhckF0KGkpID09ICc7Jykgew0KKyAgICAgICAgICAgICAgICAgICAgaSArPSAxOw0KKyAgICAgICAgICAgICAgICB9DQorICAgICAgICAgICAgICAgIG91dC5wdXQxMShUWVBFX0FSR1VNRU5ULCB0eXBlQXJnKTsNCisgICAgICAgICAgICB9DQorICAgICAgICB9DQorICAgICAgICBvdXQuZGF0YVswXSA9IChieXRlKSAob3V0Lmxlbmd0aCAvIDIpOw0KKyAgICAgICAgcmV0dXJuIG5ldyBUeXBlUGF0aChvdXQuZGF0YSwgMCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB0eXBlIHBhdGguIHtAbGluayAjQVJSQVlfRUxFTUVOVA0KKyAgICAgKiBBUlJBWV9FTEVNRU5UfSBzdGVwcyBhcmUgcmVwcmVzZW50ZWQgd2l0aCAnWycsIHtAbGluayAjSU5ORVJfVFlQRQ0KKyAgICAgKiBJTk5FUl9UWVBFfSBzdGVwcyB3aXRoICcuJywge0BsaW5rICNXSUxEQ0FSRF9CT1VORCBXSUxEQ0FSRF9CT1VORH0gc3RlcHMNCisgICAgICogd2l0aCAnKicgYW5kIHtAbGluayAjVFlQRV9BUkdVTUVOVCBUWVBFX0FSR1VNRU5UfSBzdGVwcyB3aXRoIHRoZWlyIHR5cGUNCisgICAgICogYXJndW1lbnQgaW5kZXggaW4gZGVjaW1hbCBmb3JtIGZvbGxvd2VkIGJ5ICc7Jy4NCisgICAgICovDQorICAgIEBPdmVycmlkZQ0KKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgew0KKyAgICAgICAgaW50IGxlbmd0aCA9IGdldExlbmd0aCgpOw0KKyAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcihsZW5ndGggKiAyKTsNCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsNCisgICAgICAgICAgICBzd2l0Y2ggKGdldFN0ZXAoaSkpIHsNCisgICAgICAgICAgICAgICAgY2FzZSBBUlJBWV9FTEVNRU5UOg0KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnWycpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgSU5ORVJfVFlQRToNCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJy4nKTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBjYXNlIFdJTERDQVJEX0JPVU5EOg0KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnKicpOw0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQorICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9BUkdVTUVOVDoNCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoZ2V0U3RlcEFyZ3VtZW50KGkpKS5hcHBlbmQoJzsnKTsNCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgICAgICAgICBkZWZhdWx0Og0KKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgnXycpOw0KKyAgICAgICAgICAgIH0NCisgICAgICAgIH0NCisgICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsNCisgICAgfQ0KK30NCmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL2plcnNleS9yZXBhY2thZ2VkL29yZy9vYmplY3R3ZWIvYXNtL1R5cGVSZWZlcmVuY2UuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvamVyc2V5L3JlcGFja2FnZWQvb3JnL29iamVjdHdlYi9hc20vVHlwZVJlZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZTc0ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL2plcnNleS9yZXBhY2thZ2VkL29yZy9vYmplY3R3ZWIvYXNtL1R5cGVSZWZlcmVuY2UuamF2YQpAQCAtMCwwICsxLDQ1MiBAQAorLyoqKg0KKyAqIEFTTTogYSB2ZXJ5IHNtYWxsIGFuZCBmYXN0IEphdmEgYnl0ZWNvZGUgbWFuaXB1bGF0aW9uIGZyYW1ld29yaw0KKyAqIENvcHlyaWdodCAoYykgMjAwMC0yMDEzIElOUklBLCBGcmFuY2UgVGVsZWNvbQ0KKyAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorICoNCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQNCisgKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMNCisgKiBhcmUgbWV0Og0KKyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLg0KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0DQorICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQ0KKyAqICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uDQorICogMy4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgY29weXJpZ2h0IGhvbGRlcnMgbm9yIHRoZSBuYW1lcyBvZiBpdHMNCisgKiAgICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQ0KKyAqICAgIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorICoNCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyINCisgKiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFDQorICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UNCisgKiBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUNCisgKiBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SDQorICogQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YNCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MNCisgKiBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTg0KKyAqIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpDQorICogQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRg0KKyAqIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCisgKi8NCisNCitwYWNrYWdlIGplcnNleS5yZXBhY2thZ2VkLm9yZy5vYmplY3R3ZWIuYXNtOw0KKw0KKy8qKg0KKyAqIEEgcmVmZXJlbmNlIHRvIGEgdHlwZSBhcHBlYXJpbmcgaW4gYSBjbGFzcywgZmllbGQgb3IgbWV0aG9kIGRlY2xhcmF0aW9uLCBvcg0KKyAqIG9uIGFuIGluc3RydWN0aW9uLiBTdWNoIGEgcmVmZXJlbmNlIGRlc2lnbmF0ZXMgdGhlIHBhcnQgb2YgdGhlIGNsYXNzIHdoZXJlDQorICogdGhlIHJlZmVyZW5jZWQgdHlwZSBpcyBhcHBlYXJpbmcgKGUuZy4gYW4gJ2V4dGVuZHMnLCAnaW1wbGVtZW50cycgb3IgJ3Rocm93cycNCisgKiBjbGF1c2UsIGEgJ25ldycgaW5zdHJ1Y3Rpb24sIGEgJ2NhdGNoJyBjbGF1c2UsIGEgdHlwZSBjYXN0LCBhIGxvY2FsIHZhcmlhYmxlDQorICogZGVjbGFyYXRpb24sIGV0YykuDQorICoNCisgKiBAYXV0aG9yIEVyaWMgQnJ1bmV0b24NCisgKi8NCitwdWJsaWMgY2xhc3MgVHlwZVJlZmVyZW5jZSB7DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGUgc29ydCBvZiB0eXBlIHJlZmVyZW5jZXMgdGhhdCB0YXJnZXQgYSB0eXBlIHBhcmFtZXRlciBvZiBhIGdlbmVyaWMNCisgICAgICogY2xhc3MuIFNlZSB7QGxpbmsgI2dldFNvcnQgZ2V0U29ydH0uDQorICAgICAqLw0KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBDTEFTU19UWVBFX1BBUkFNRVRFUiA9IDB4MDA7DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGUgc29ydCBvZiB0eXBlIHJlZmVyZW5jZXMgdGhhdCB0YXJnZXQgYSB0eXBlIHBhcmFtZXRlciBvZiBhIGdlbmVyaWMNCisgICAgICogbWV0aG9kLiBTZWUge0BsaW5rICNnZXRTb3J0IGdldFNvcnR9Lg0KKyAgICAgKi8NCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTUVUSE9EX1RZUEVfUEFSQU1FVEVSID0gMHgwMTsNCisNCisgICAgLyoqDQorICAgICAqIFRoZSBzb3J0IG9mIHR5cGUgcmVmZXJlbmNlcyB0aGF0IHRhcmdldCB0aGUgc3VwZXIgY2xhc3Mgb2YgYSBjbGFzcyBvciBvbmUNCisgICAgICogb2YgdGhlIGludGVyZmFjZXMgaXQgaW1wbGVtZW50cy4gU2VlIHtAbGluayAjZ2V0U29ydCBnZXRTb3J0fS4NCisgICAgICovDQorICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IENMQVNTX0VYVEVORFMgPSAweDEwOw0KKw0KKyAgICAvKioNCisgICAgICogVGhlIHNvcnQgb2YgdHlwZSByZWZlcmVuY2VzIHRoYXQgdGFyZ2V0IGEgYm91bmQgb2YgYSB0eXBlIHBhcmFtZXRlciBvZiBhDQorICAgICAqIGdlbmVyaWMgY2xhc3MuIFNlZSB7QGxpbmsgI2dldFNvcnQgZ2V0U29ydH0uDQorICAgICAqLw0KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBDTEFTU19UWVBFX1BBUkFNRVRFUl9CT1VORCA9IDB4MTE7DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGUgc29ydCBvZiB0eXBlIHJlZmVyZW5jZXMgdGhhdCB0YXJnZXQgYSBib3VuZCBvZiBhIHR5cGUgcGFyYW1ldGVyIG9mIGENCisgICAgICogZ2VuZXJpYyBtZXRob2QuIFNlZSB7QGxpbmsgI2dldFNvcnQgZ2V0U29ydH0uDQorICAgICAqLw0KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBNRVRIT0RfVFlQRV9QQVJBTUVURVJfQk9VTkQgPSAweDEyOw0KKw0KKyAgICAvKioNCisgICAgICogVGhlIHNvcnQgb2YgdHlwZSByZWZlcmVuY2VzIHRoYXQgdGFyZ2V0IHRoZSB0eXBlIG9mIGEgZmllbGQuIFNlZQ0KKyAgICAgKiB7QGxpbmsgI2dldFNvcnQgZ2V0U29ydH0uDQorICAgICAqLw0KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBGSUVMRCA9IDB4MTM7DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGUgc29ydCBvZiB0eXBlIHJlZmVyZW5jZXMgdGhhdCB0YXJnZXQgdGhlIHJldHVybiB0eXBlIG9mIGEgbWV0aG9kLiBTZWUNCisgICAgICoge0BsaW5rICNnZXRTb3J0IGdldFNvcnR9Lg0KKyAgICAgKi8NCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTUVUSE9EX1JFVFVSTiA9IDB4MTQ7DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGUgc29ydCBvZiB0eXBlIHJlZmVyZW5jZXMgdGhhdCB0YXJnZXQgdGhlIHJlY2VpdmVyIHR5cGUgb2YgYSBtZXRob2QuDQorICAgICAqIFNlZSB7QGxpbmsgI2dldFNvcnQgZ2V0U29ydH0uDQorICAgICAqLw0KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBNRVRIT0RfUkVDRUlWRVIgPSAweDE1Ow0KKw0KKyAgICAvKioNCisgICAgICogVGhlIHNvcnQgb2YgdHlwZSByZWZlcmVuY2VzIHRoYXQgdGFyZ2V0IHRoZSB0eXBlIG9mIGEgZm9ybWFsIHBhcmFtZXRlciBvZg0KKyAgICAgKiBhIG1ldGhvZC4gU2VlIHtAbGluayAjZ2V0U29ydCBnZXRTb3J0fS4NCisgICAgICovDQorICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IE1FVEhPRF9GT1JNQUxfUEFSQU1FVEVSID0gMHgxNjsNCisNCisgICAgLyoqDQorICAgICAqIFRoZSBzb3J0IG9mIHR5cGUgcmVmZXJlbmNlcyB0aGF0IHRhcmdldCB0aGUgdHlwZSBvZiBhbiBleGNlcHRpb24gZGVjbGFyZWQNCisgICAgICogaW4gdGhlIHRocm93cyBjbGF1c2Ugb2YgYSBtZXRob2QuIFNlZSB7QGxpbmsgI2dldFNvcnQgZ2V0U29ydH0uDQorICAgICAqLw0KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBUSFJPV1MgPSAweDE3Ow0KKw0KKyAgICAvKioNCisgICAgICogVGhlIHNvcnQgb2YgdHlwZSByZWZlcmVuY2VzIHRoYXQgdGFyZ2V0IHRoZSB0eXBlIG9mIGEgbG9jYWwgdmFyaWFibGUgaW4gYQ0KKyAgICAgKiBtZXRob2QuIFNlZSB7QGxpbmsgI2dldFNvcnQgZ2V0U29ydH0uDQorICAgICAqLw0KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBMT0NBTF9WQVJJQUJMRSA9IDB4NDA7DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGUgc29ydCBvZiB0eXBlIHJlZmVyZW5jZXMgdGhhdCB0YXJnZXQgdGhlIHR5cGUgb2YgYSByZXNvdXJjZSB2YXJpYWJsZQ0KKyAgICAgKiBpbiBhIG1ldGhvZC4gU2VlIHtAbGluayAjZ2V0U29ydCBnZXRTb3J0fS4NCisgICAgICovDQorICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFJFU09VUkNFX1ZBUklBQkxFID0gMHg0MTsNCisNCisgICAgLyoqDQorICAgICAqIFRoZSBzb3J0IG9mIHR5cGUgcmVmZXJlbmNlcyB0aGF0IHRhcmdldCB0aGUgdHlwZSBvZiB0aGUgZXhjZXB0aW9uIG9mIGENCisgICAgICogJ2NhdGNoJyBjbGF1c2UgaW4gYSBtZXRob2QuIFNlZSB7QGxpbmsgI2dldFNvcnQgZ2V0U29ydH0uDQorICAgICAqLw0KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBFWENFUFRJT05fUEFSQU1FVEVSID0gMHg0MjsNCisNCisgICAgLyoqDQorICAgICAqIFRoZSBzb3J0IG9mIHR5cGUgcmVmZXJlbmNlcyB0aGF0IHRhcmdldCB0aGUgdHlwZSBkZWNsYXJlZCBpbiBhbg0KKyAgICAgKiAnaW5zdGFuY2VvZicgaW5zdHJ1Y3Rpb24uIFNlZSB7QGxpbmsgI2dldFNvcnQgZ2V0U29ydH0uDQorICAgICAqLw0KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBJTlNUQU5DRU9GID0gMHg0MzsNCisNCisgICAgLyoqDQorICAgICAqIFRoZSBzb3J0IG9mIHR5cGUgcmVmZXJlbmNlcyB0aGF0IHRhcmdldCB0aGUgdHlwZSBvZiB0aGUgb2JqZWN0IGNyZWF0ZWQgYnkNCisgICAgICogYSAnbmV3JyBpbnN0cnVjdGlvbi4gU2VlIHtAbGluayAjZ2V0U29ydCBnZXRTb3J0fS4NCisgICAgICovDQorICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IE5FVyA9IDB4NDQ7DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGUgc29ydCBvZiB0eXBlIHJlZmVyZW5jZXMgdGhhdCB0YXJnZXQgdGhlIHJlY2VpdmVyIHR5cGUgb2YgYQ0KKyAgICAgKiBjb25zdHJ1Y3RvciByZWZlcmVuY2UuIFNlZSB7QGxpbmsgI2dldFNvcnQgZ2V0U29ydH0uDQorICAgICAqLw0KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBDT05TVFJVQ1RPUl9SRUZFUkVOQ0UgPSAweDQ1Ow0KKw0KKyAgICAvKioNCisgICAgICogVGhlIHNvcnQgb2YgdHlwZSByZWZlcmVuY2VzIHRoYXQgdGFyZ2V0IHRoZSByZWNlaXZlciB0eXBlIG9mIGEgbWV0aG9kDQorICAgICAqIHJlZmVyZW5jZS4gU2VlIHtAbGluayAjZ2V0U29ydCBnZXRTb3J0fS4NCisgICAgICovDQorICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IE1FVEhPRF9SRUZFUkVOQ0UgPSAweDQ2Ow0KKw0KKyAgICAvKioNCisgICAgICogVGhlIHNvcnQgb2YgdHlwZSByZWZlcmVuY2VzIHRoYXQgdGFyZ2V0IHRoZSB0eXBlIGRlY2xhcmVkIGluIGFuIGV4cGxpY2l0DQorICAgICAqIG9yIGltcGxpY2l0IGNhc3QgaW5zdHJ1Y3Rpb24uIFNlZSB7QGxpbmsgI2dldFNvcnQgZ2V0U29ydH0uDQorICAgICAqLw0KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBDQVNUID0gMHg0NzsNCisNCisgICAgLyoqDQorICAgICAqIFRoZSBzb3J0IG9mIHR5cGUgcmVmZXJlbmNlcyB0aGF0IHRhcmdldCBhIHR5cGUgcGFyYW1ldGVyIG9mIGEgZ2VuZXJpYw0KKyAgICAgKiBjb25zdHJ1Y3RvciBpbiBhIGNvbnN0cnVjdG9yIGNhbGwuIFNlZSB7QGxpbmsgI2dldFNvcnQgZ2V0U29ydH0uDQorICAgICAqLw0KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBDT05TVFJVQ1RPUl9JTlZPQ0FUSU9OX1RZUEVfQVJHVU1FTlQgPSAweDQ4Ow0KKw0KKyAgICAvKioNCisgICAgICogVGhlIHNvcnQgb2YgdHlwZSByZWZlcmVuY2VzIHRoYXQgdGFyZ2V0IGEgdHlwZSBwYXJhbWV0ZXIgb2YgYSBnZW5lcmljDQorICAgICAqIG1ldGhvZCBpbiBhIG1ldGhvZCBjYWxsLiBTZWUge0BsaW5rICNnZXRTb3J0IGdldFNvcnR9Lg0KKyAgICAgKi8NCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBpbnQgTUVUSE9EX0lOVk9DQVRJT05fVFlQRV9BUkdVTUVOVCA9IDB4NDk7DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGUgc29ydCBvZiB0eXBlIHJlZmVyZW5jZXMgdGhhdCB0YXJnZXQgYSB0eXBlIHBhcmFtZXRlciBvZiBhIGdlbmVyaWMNCisgICAgICogY29uc3RydWN0b3IgaW4gYSBjb25zdHJ1Y3RvciByZWZlcmVuY2UuIFNlZSB7QGxpbmsgI2dldFNvcnQgZ2V0U29ydH0uDQorICAgICAqLw0KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIGludCBDT05TVFJVQ1RPUl9SRUZFUkVOQ0VfVFlQRV9BUkdVTUVOVCA9IDB4NEE7DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGUgc29ydCBvZiB0eXBlIHJlZmVyZW5jZXMgdGhhdCB0YXJnZXQgYSB0eXBlIHBhcmFtZXRlciBvZiBhIGdlbmVyaWMNCisgICAgICogbWV0aG9kIGluIGEgbWV0aG9kIHJlZmVyZW5jZS4gU2VlIHtAbGluayAjZ2V0U29ydCBnZXRTb3J0fS4NCisgICAgICovDQorICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IE1FVEhPRF9SRUZFUkVOQ0VfVFlQRV9BUkdVTUVOVCA9IDB4NEI7DQorDQorICAgIC8qKg0KKyAgICAgKiBUaGUgdHlwZSByZWZlcmVuY2UgdmFsdWUgaW4gSmF2YSBjbGFzcyBmaWxlIGZvcm1hdC4NCisgICAgICovDQorICAgIHByaXZhdGUgaW50IHZhbHVlOw0KKw0KKyAgICAvKioNCisgICAgICogQ3JlYXRlcyBhIG5ldyBUeXBlUmVmZXJlbmNlLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gdHlwZVJlZg0KKyAgICAgKiAgICAgICAgICAgIHRoZSBpbnQgZW5jb2RlZCB2YWx1ZSBvZiB0aGUgdHlwZSByZWZlcmVuY2UsIGFzIHJlY2VpdmVkIGluIGENCisgICAgICogICAgICAgICAgICB2aXNpdCBtZXRob2QgcmVsYXRlZCB0byB0eXBlIGFubm90YXRpb25zLCBsaWtlDQorICAgICAqICAgICAgICAgICAgdmlzaXRUeXBlQW5ub3RhdGlvbi4NCisgICAgICovDQorICAgIHB1YmxpYyBUeXBlUmVmZXJlbmNlKGludCB0eXBlUmVmKSB7DQorICAgICAgICB0aGlzLnZhbHVlID0gdHlwZVJlZjsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJucyBhIHR5cGUgcmVmZXJlbmNlIG9mIHRoZSBnaXZlbiBzb3J0Lg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gc29ydA0KKyAgICAgKiAgICAgICAgICAgIHtAbGluayAjRklFTEQgRklFTER9LCB7QGxpbmsgI01FVEhPRF9SRVRVUk4gTUVUSE9EX1JFVFVSTn0sDQorICAgICAqICAgICAgICAgICAge0BsaW5rICNNRVRIT0RfUkVDRUlWRVIgTUVUSE9EX1JFQ0VJVkVSfSwNCisgICAgICogICAgICAgICAgICB7QGxpbmsgI0xPQ0FMX1ZBUklBQkxFIExPQ0FMX1ZBUklBQkxFfSwNCisgICAgICogICAgICAgICAgICB7QGxpbmsgI1JFU09VUkNFX1ZBUklBQkxFIFJFU09VUkNFX1ZBUklBQkxFfSwNCisgICAgICogICAgICAgICAgICB7QGxpbmsgI0lOU1RBTkNFT0YgSU5TVEFOQ0VPRn0sIHtAbGluayAjTkVXIE5FV30sDQorICAgICAqICAgICAgICAgICAge0BsaW5rICNDT05TVFJVQ1RPUl9SRUZFUkVOQ0UgQ09OU1RSVUNUT1JfUkVGRVJFTkNFfSwgb3INCisgICAgICogICAgICAgICAgICB7QGxpbmsgI01FVEhPRF9SRUZFUkVOQ0UgTUVUSE9EX1JFRkVSRU5DRX0uDQorICAgICAqIEByZXR1cm4gYSB0eXBlIHJlZmVyZW5jZSBvZiB0aGUgZ2l2ZW4gc29ydC4NCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgVHlwZVJlZmVyZW5jZSBuZXdUeXBlUmVmZXJlbmNlKGludCBzb3J0KSB7DQorICAgICAgICByZXR1cm4gbmV3IFR5cGVSZWZlcmVuY2Uoc29ydCA8PCAyNCk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gYSB0eXBlIHBhcmFtZXRlciBvZiBhIGdlbmVyaWMgY2xhc3Mgb3IgbWV0aG9kLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gc29ydA0KKyAgICAgKiAgICAgICAgICAgIHtAbGluayAjQ0xBU1NfVFlQRV9QQVJBTUVURVIgQ0xBU1NfVFlQRV9QQVJBTUVURVJ9IG9yDQorICAgICAqICAgICAgICAgICAge0BsaW5rICNNRVRIT0RfVFlQRV9QQVJBTUVURVIgTUVUSE9EX1RZUEVfUEFSQU1FVEVSfS4NCisgICAgICogQHBhcmFtIHBhcmFtSW5kZXgNCisgICAgICogICAgICAgICAgICB0aGUgdHlwZSBwYXJhbWV0ZXIgaW5kZXguDQorICAgICAqIEByZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIGdpdmVuIGdlbmVyaWMgY2xhc3Mgb3IgbWV0aG9kIHR5cGUgcGFyYW1ldGVyLg0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBUeXBlUmVmZXJlbmNlIG5ld1R5cGVQYXJhbWV0ZXJSZWZlcmVuY2UoaW50IHNvcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwYXJhbUluZGV4KSB7DQorICAgICAgICByZXR1cm4gbmV3IFR5cGVSZWZlcmVuY2UoKHNvcnQgPDwgMjQpIHwgKHBhcmFtSW5kZXggPDwgMTYpKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byBhIHR5cGUgcGFyYW1ldGVyIGJvdW5kIG9mIGEgZ2VuZXJpYyBjbGFzcyBvcg0KKyAgICAgKiBtZXRob2QuDQorICAgICAqDQorICAgICAqIEBwYXJhbSBzb3J0DQorICAgICAqICAgICAgICAgICAge0BsaW5rICNDTEFTU19UWVBFX1BBUkFNRVRFUiBDTEFTU19UWVBFX1BBUkFNRVRFUn0gb3INCisgICAgICogICAgICAgICAgICB7QGxpbmsgI01FVEhPRF9UWVBFX1BBUkFNRVRFUiBNRVRIT0RfVFlQRV9QQVJBTUVURVJ9Lg0KKyAgICAgKiBAcGFyYW0gcGFyYW1JbmRleA0KKyAgICAgKiAgICAgICAgICAgIHRoZSB0eXBlIHBhcmFtZXRlciBpbmRleC4NCisgICAgICogQHBhcmFtIGJvdW5kSW5kZXgNCisgICAgICogICAgICAgICAgICB0aGUgdHlwZSBib3VuZCBpbmRleCB3aXRoaW4gdGhlIGFib3ZlIHR5cGUgcGFyYW1ldGVycy4NCisgICAgICogQHJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgZ2l2ZW4gZ2VuZXJpYyBjbGFzcyBvciBtZXRob2QgdHlwZSBwYXJhbWV0ZXINCisgICAgICogICAgICAgICBib3VuZC4NCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgVHlwZVJlZmVyZW5jZSBuZXdUeXBlUGFyYW1ldGVyQm91bmRSZWZlcmVuY2UoaW50IHNvcnQsDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBhcmFtSW5kZXgsIGludCBib3VuZEluZGV4KSB7DQorICAgICAgICByZXR1cm4gbmV3IFR5cGVSZWZlcmVuY2UoKHNvcnQgPDwgMjQpIHwgKHBhcmFtSW5kZXggPDwgMTYpDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAoYm91bmRJbmRleCA8PCA4KSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHN1cGVyIGNsYXNzIG9yIHRvIGFuIGludGVyZmFjZSBvZiB0aGUNCisgICAgICogJ2ltcGxlbWVudHMnIGNsYXVzZSBvZiBhIGNsYXNzLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gaXRmSW5kZXgNCisgICAgICogICAgICAgICAgICB0aGUgaW5kZXggb2YgYW4gaW50ZXJmYWNlIGluIHRoZSAnaW1wbGVtZW50cycgY2xhdXNlIG9mIGENCisgICAgICogICAgICAgICAgICBjbGFzcywgb3IgLTEgdG8gcmVmZXJlbmNlIHRoZSBzdXBlciBjbGFzcyBvZiB0aGUgY2xhc3MuDQorICAgICAqIEByZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIGdpdmVuIHN1cGVyIHR5cGUgb2YgYSBjbGFzcy4NCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgVHlwZVJlZmVyZW5jZSBuZXdTdXBlclR5cGVSZWZlcmVuY2UoaW50IGl0ZkluZGV4KSB7DQorICAgICAgICBpdGZJbmRleCAmPSAweEZGRkY7DQorICAgICAgICByZXR1cm4gbmV3IFR5cGVSZWZlcmVuY2UoKENMQVNTX0VYVEVORFMgPDwgMjQpIHwgKGl0ZkluZGV4IDw8IDgpKTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgdHlwZSBvZiBhIGZvcm1hbCBwYXJhbWV0ZXIgb2YgYSBtZXRob2QuDQorICAgICAqDQorICAgICAqIEBwYXJhbSBwYXJhbUluZGV4DQorICAgICAqICAgICAgICAgICAgdGhlIGZvcm1hbCBwYXJhbWV0ZXIgaW5kZXguDQorICAgICAqDQorICAgICAqIEByZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIHR5cGUgb2YgdGhlIGdpdmVuIG1ldGhvZCBmb3JtYWwgcGFyYW1ldGVyLg0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBUeXBlUmVmZXJlbmNlIG5ld0Zvcm1hbFBhcmFtZXRlclJlZmVyZW5jZShpbnQgcGFyYW1JbmRleCkgew0KKyAgICAgICAgcmV0dXJuIG5ldyBUeXBlUmVmZXJlbmNlKChNRVRIT0RfRk9STUFMX1BBUkFNRVRFUiA8PCAyNCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChwYXJhbUluZGV4IDw8IDE2KSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHR5cGUgb2YgYW4gZXhjZXB0aW9uLCBpbiBhICd0aHJvd3MnIGNsYXVzZSBvZg0KKyAgICAgKiBhIG1ldGhvZC4NCisgICAgICoNCisgICAgICogQHBhcmFtIGV4Y2VwdGlvbkluZGV4DQorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIGFuIGV4Y2VwdGlvbiBpbiBhICd0aHJvd3MnIGNsYXVzZSBvZiBhIG1ldGhvZC4NCisgICAgICoNCisgICAgICogQHJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgdHlwZSBvZiB0aGUgZ2l2ZW4gZXhjZXB0aW9uLg0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBUeXBlUmVmZXJlbmNlIG5ld0V4Y2VwdGlvblJlZmVyZW5jZShpbnQgZXhjZXB0aW9uSW5kZXgpIHsNCisgICAgICAgIHJldHVybiBuZXcgVHlwZVJlZmVyZW5jZSgoVEhST1dTIDw8IDI0KSB8IChleGNlcHRpb25JbmRleCA8PCA4KSk7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHR5cGUgb2YgdGhlIGV4Y2VwdGlvbiBkZWNsYXJlZCBpbiBhICdjYXRjaCcNCisgICAgICogY2xhdXNlIG9mIGEgbWV0aG9kLg0KKyAgICAgKg0KKyAgICAgKiBAcGFyYW0gdHJ5Q2F0Y2hCbG9ja0luZGV4DQorICAgICAqICAgICAgICAgICAgdGhlIGluZGV4IG9mIGEgdHJ5IGNhdGNoIGJsb2NrICh1c2luZyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleQ0KKyAgICAgKiAgICAgICAgICAgIGFyZSB2aXNpdGVkIHdpdGggdmlzaXRUcnlDYXRjaEJsb2NrKS4NCisgICAgICoNCisgICAgICogQHJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgdHlwZSBvZiB0aGUgZ2l2ZW4gZXhjZXB0aW9uLg0KKyAgICAgKi8NCisgICAgcHVibGljIHN0YXRpYyBUeXBlUmVmZXJlbmNlIG5ld1RyeUNhdGNoUmVmZXJlbmNlKGludCB0cnlDYXRjaEJsb2NrSW5kZXgpIHsNCisgICAgICAgIHJldHVybiBuZXcgVHlwZVJlZmVyZW5jZSgoRVhDRVBUSU9OX1BBUkFNRVRFUiA8PCAyNCkNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICh0cnlDYXRjaEJsb2NrSW5kZXggPDwgOCkpOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSB0eXBlIG9mIGEgdHlwZSBhcmd1bWVudCBpbiBhIGNvbnN0cnVjdG9yIG9yDQorICAgICAqIG1ldGhvZCBjYWxsIG9yIHJlZmVyZW5jZS4NCisgICAgICoNCisgICAgICogQHBhcmFtIHNvcnQNCisgICAgICogICAgICAgICAgICB7QGxpbmsgI0NBU1QgQ0FTVH0sDQorICAgICAqICAgICAgICAgICAge0BsaW5rICNDT05TVFJVQ1RPUl9JTlZPQ0FUSU9OX1RZUEVfQVJHVU1FTlQNCisgICAgICogICAgICAgICAgICBDT05TVFJVQ1RPUl9JTlZPQ0FUSU9OX1RZUEVfQVJHVU1FTlR9LA0KKyAgICAgKiAgICAgICAgICAgIHtAbGluayAjTUVUSE9EX0lOVk9DQVRJT05fVFlQRV9BUkdVTUVOVA0KKyAgICAgKiAgICAgICAgICAgIE1FVEhPRF9JTlZPQ0FUSU9OX1RZUEVfQVJHVU1FTlR9LA0KKyAgICAgKiAgICAgICAgICAgIHtAbGluayAjQ09OU1RSVUNUT1JfUkVGRVJFTkNFX1RZUEVfQVJHVU1FTlQNCisgICAgICogICAgICAgICAgICBDT05TVFJVQ1RPUl9SRUZFUkVOQ0VfVFlQRV9BUkdVTUVOVH0sIG9yDQorICAgICAqICAgICAgICAgICAge0BsaW5rICNNRVRIT0RfUkVGRVJFTkNFX1RZUEVfQVJHVU1FTlQNCisgICAgICogICAgICAgICAgICBNRVRIT0RfUkVGRVJFTkNFX1RZUEVfQVJHVU1FTlR9Lg0KKyAgICAgKiBAcGFyYW0gYXJnSW5kZXgNCisgICAgICogICAgICAgICAgICB0aGUgdHlwZSBhcmd1bWVudCBpbmRleC4NCisgICAgICoNCisgICAgICogQHJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgdHlwZSBvZiB0aGUgZ2l2ZW4gdHlwZSBhcmd1bWVudC4NCisgICAgICovDQorICAgIHB1YmxpYyBzdGF0aWMgVHlwZVJlZmVyZW5jZSBuZXdUeXBlQXJndW1lbnRSZWZlcmVuY2UoaW50IHNvcnQsIGludCBhcmdJbmRleCkgew0KKyAgICAgICAgcmV0dXJuIG5ldyBUeXBlUmVmZXJlbmNlKChzb3J0IDw8IDI0KSB8IGFyZ0luZGV4KTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJucyB0aGUgc29ydCBvZiB0aGlzIHR5cGUgcmVmZXJlbmNlLg0KKyAgICAgKg0KKyAgICAgKiBAcmV0dXJuIHtAbGluayAjQ0xBU1NfVFlQRV9QQVJBTUVURVIgQ0xBU1NfVFlQRV9QQVJBTUVURVJ9LA0KKyAgICAgKiAgICAgICAgIHtAbGluayAjTUVUSE9EX1RZUEVfUEFSQU1FVEVSIE1FVEhPRF9UWVBFX1BBUkFNRVRFUn0sDQorICAgICAqICAgICAgICAge0BsaW5rICNDTEFTU19FWFRFTkRTIENMQVNTX0VYVEVORFN9LA0KKyAgICAgKiAgICAgICAgIHtAbGluayAjQ0xBU1NfVFlQRV9QQVJBTUVURVJfQk9VTkQgQ0xBU1NfVFlQRV9QQVJBTUVURVJfQk9VTkR9LA0KKyAgICAgKiAgICAgICAgIHtAbGluayAjTUVUSE9EX1RZUEVfUEFSQU1FVEVSX0JPVU5EIE1FVEhPRF9UWVBFX1BBUkFNRVRFUl9CT1VORH0sDQorICAgICAqICAgICAgICAge0BsaW5rICNGSUVMRCBGSUVMRH0sIHtAbGluayAjTUVUSE9EX1JFVFVSTiBNRVRIT0RfUkVUVVJOfSwNCisgICAgICogICAgICAgICB7QGxpbmsgI01FVEhPRF9SRUNFSVZFUiBNRVRIT0RfUkVDRUlWRVJ9LA0KKyAgICAgKiAgICAgICAgIHtAbGluayAjTUVUSE9EX0ZPUk1BTF9QQVJBTUVURVIgTUVUSE9EX0ZPUk1BTF9QQVJBTUVURVJ9LA0KKyAgICAgKiAgICAgICAgIHtAbGluayAjVEhST1dTIFRIUk9XU30sIHtAbGluayAjTE9DQUxfVkFSSUFCTEUgTE9DQUxfVkFSSUFCTEV9LA0KKyAgICAgKiAgICAgICAgIHtAbGluayAjUkVTT1VSQ0VfVkFSSUFCTEUgUkVTT1VSQ0VfVkFSSUFCTEV9LA0KKyAgICAgKiAgICAgICAgIHtAbGluayAjRVhDRVBUSU9OX1BBUkFNRVRFUiBFWENFUFRJT05fUEFSQU1FVEVSfSwNCisgICAgICogICAgICAgICB7QGxpbmsgI0lOU1RBTkNFT0YgSU5TVEFOQ0VPRn0sIHtAbGluayAjTkVXIE5FV30sDQorICAgICAqICAgICAgICAge0BsaW5rICNDT05TVFJVQ1RPUl9SRUZFUkVOQ0UgQ09OU1RSVUNUT1JfUkVGRVJFTkNFfSwNCisgICAgICogICAgICAgICB7QGxpbmsgI01FVEhPRF9SRUZFUkVOQ0UgTUVUSE9EX1JFRkVSRU5DRX0sIHtAbGluayAjQ0FTVCBDQVNUfSwNCisgICAgICogICAgICAgICB7QGxpbmsgI0NPTlNUUlVDVE9SX0lOVk9DQVRJT05fVFlQRV9BUkdVTUVOVA0KKyAgICAgKiAgICAgICAgIENPTlNUUlVDVE9SX0lOVk9DQVRJT05fVFlQRV9BUkdVTUVOVH0sDQorICAgICAqICAgICAgICAge0BsaW5rICNNRVRIT0RfSU5WT0NBVElPTl9UWVBFX0FSR1VNRU5UDQorICAgICAqICAgICAgICAgTUVUSE9EX0lOVk9DQVRJT05fVFlQRV9BUkdVTUVOVH0sDQorICAgICAqICAgICAgICAge0BsaW5rICNDT05TVFJVQ1RPUl9SRUZFUkVOQ0VfVFlQRV9BUkdVTUVOVA0KKyAgICAgKiAgICAgICAgIENPTlNUUlVDVE9SX1JFRkVSRU5DRV9UWVBFX0FSR1VNRU5UfSwgb3INCisgICAgICogICAgICAgICB7QGxpbmsgI01FVEhPRF9SRUZFUkVOQ0VfVFlQRV9BUkdVTUVOVA0KKyAgICAgKiAgICAgICAgIE1FVEhPRF9SRUZFUkVOQ0VfVFlQRV9BUkdVTUVOVH0uDQorICAgICAqLw0KKyAgICBwdWJsaWMgaW50IGdldFNvcnQoKSB7DQorICAgICAgICByZXR1cm4gdmFsdWUgPj4+IDI0Ow0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgdHlwZSBwYXJhbWV0ZXIgcmVmZXJlbmNlZCBieSB0aGlzIHR5cGUNCisgICAgICogcmVmZXJlbmNlLiBUaGlzIG1ldGhvZCBtdXN0IG9ubHkgYmUgdXNlZCBmb3IgdHlwZSByZWZlcmVuY2VzIHdob3NlIHNvcnQNCisgICAgICogaXMge0BsaW5rICNDTEFTU19UWVBFX1BBUkFNRVRFUiBDTEFTU19UWVBFX1BBUkFNRVRFUn0sDQorICAgICAqIHtAbGluayAjTUVUSE9EX1RZUEVfUEFSQU1FVEVSIE1FVEhPRF9UWVBFX1BBUkFNRVRFUn0sDQorICAgICAqIHtAbGluayAjQ0xBU1NfVFlQRV9QQVJBTUVURVJfQk9VTkQgQ0xBU1NfVFlQRV9QQVJBTUVURVJfQk9VTkR9IG9yDQorICAgICAqIHtAbGluayAjTUVUSE9EX1RZUEVfUEFSQU1FVEVSX0JPVU5EIE1FVEhPRF9UWVBFX1BBUkFNRVRFUl9CT1VORH0uDQorICAgICAqDQorICAgICAqIEByZXR1cm4gYSB0eXBlIHBhcmFtZXRlciBpbmRleC4NCisgICAgICovDQorICAgIHB1YmxpYyBpbnQgZ2V0VHlwZVBhcmFtZXRlckluZGV4KCkgew0KKyAgICAgICAgcmV0dXJuICh2YWx1ZSAmIDB4MDBGRjAwMDApID4+IDE2Ow0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgdHlwZSBwYXJhbWV0ZXIgYm91bmQsIHdpdGhpbiB0aGUgdHlwZSBwYXJhbWV0ZXINCisgICAgICoge0BsaW5rICNnZXRUeXBlUGFyYW1ldGVySW5kZXh9LCByZWZlcmVuY2VkIGJ5IHRoaXMgdHlwZSByZWZlcmVuY2UuIFRoaXMNCisgICAgICogbWV0aG9kIG11c3Qgb25seSBiZSB1c2VkIGZvciB0eXBlIHJlZmVyZW5jZXMgd2hvc2Ugc29ydCBpcw0KKyAgICAgKiB7QGxpbmsgI0NMQVNTX1RZUEVfUEFSQU1FVEVSX0JPVU5EIENMQVNTX1RZUEVfUEFSQU1FVEVSX0JPVU5EfSBvcg0KKyAgICAgKiB7QGxpbmsgI01FVEhPRF9UWVBFX1BBUkFNRVRFUl9CT1VORCBNRVRIT0RfVFlQRV9QQVJBTUVURVJfQk9VTkR9Lg0KKyAgICAgKg0KKyAgICAgKiBAcmV0dXJuIGEgdHlwZSBwYXJhbWV0ZXIgYm91bmQgaW5kZXguDQorICAgICAqLw0KKyAgICBwdWJsaWMgaW50IGdldFR5cGVQYXJhbWV0ZXJCb3VuZEluZGV4KCkgew0KKyAgICAgICAgcmV0dXJuICh2YWx1ZSAmIDB4MDAwMEZGMDApID4+IDg7DQorICAgIH0NCisNCisgICAgLyoqDQorICAgICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSAic3VwZXIgdHlwZSIgb2YgYSBjbGFzcyB0aGF0IGlzIHJlZmVyZW5jZWQgYnkNCisgICAgICogdGhpcyB0eXBlIHJlZmVyZW5jZS4gVGhpcyBtZXRob2QgbXVzdCBvbmx5IGJlIHVzZWQgZm9yIHR5cGUgcmVmZXJlbmNlcw0KKyAgICAgKiB3aG9zZSBzb3J0IGlzIHtAbGluayAjQ0xBU1NfRVhURU5EUyBDTEFTU19FWFRFTkRTfS4NCisgICAgICoNCisgICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgYW4gaW50ZXJmYWNlIGluIHRoZSAnaW1wbGVtZW50cycgY2xhdXNlIG9mIGEgY2xhc3MsDQorICAgICAqICAgICAgICAgb3IgLTEgaWYgdGhpcyB0eXBlIHJlZmVyZW5jZSByZWZlcmVuY2VzIHRoZSB0eXBlIG9mIHRoZSBzdXBlcg0KKyAgICAgKiAgICAgICAgIGNsYXNzLg0KKyAgICAgKi8NCisgICAgcHVibGljIGludCBnZXRTdXBlclR5cGVJbmRleCgpIHsNCisgICAgICAgIHJldHVybiAoc2hvcnQpICgodmFsdWUgJiAweDAwRkZGRjAwKSA+PiA4KTsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZvcm1hbCBwYXJhbWV0ZXIgd2hvc2UgdHlwZSBpcyByZWZlcmVuY2VkIGJ5DQorICAgICAqIHRoaXMgdHlwZSByZWZlcmVuY2UuIFRoaXMgbWV0aG9kIG11c3Qgb25seSBiZSB1c2VkIGZvciB0eXBlIHJlZmVyZW5jZXMNCisgICAgICogd2hvc2Ugc29ydCBpcyB7QGxpbmsgI01FVEhPRF9GT1JNQUxfUEFSQU1FVEVSIE1FVEhPRF9GT1JNQUxfUEFSQU1FVEVSfS4NCisgICAgICoNCisgICAgICogQHJldHVybiBhIGZvcm1hbCBwYXJhbWV0ZXIgaW5kZXguDQorICAgICAqLw0KKyAgICBwdWJsaWMgaW50IGdldEZvcm1hbFBhcmFtZXRlckluZGV4KCkgew0KKyAgICAgICAgcmV0dXJuICh2YWx1ZSAmIDB4MDBGRjAwMDApID4+IDE2Ow0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZXhjZXB0aW9uLCBpbiBhICd0aHJvd3MnIGNsYXVzZSBvZiBhIG1ldGhvZCwNCisgICAgICogd2hvc2UgdHlwZSBpcyByZWZlcmVuY2VkIGJ5IHRoaXMgdHlwZSByZWZlcmVuY2UuIFRoaXMgbWV0aG9kIG11c3Qgb25seSBiZQ0KKyAgICAgKiB1c2VkIGZvciB0eXBlIHJlZmVyZW5jZXMgd2hvc2Ugc29ydCBpcyB7QGxpbmsgI1RIUk9XUyBUSFJPV1N9Lg0KKyAgICAgKg0KKyAgICAgKiBAcmV0dXJuIHRoZSBpbmRleCBvZiBhbiBleGNlcHRpb24gaW4gdGhlICd0aHJvd3MnIGNsYXVzZSBvZiBhIG1ldGhvZC4NCisgICAgICovDQorICAgIHB1YmxpYyBpbnQgZ2V0RXhjZXB0aW9uSW5kZXgoKSB7DQorICAgICAgICByZXR1cm4gKHZhbHVlICYgMHgwMEZGRkYwMCkgPj4gODsNCisgICAgfQ0KKw0KKyAgICAvKioNCisgICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIHRyeSBjYXRjaCBibG9jayAodXNpbmcgdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkNCisgICAgICogYXJlIHZpc2l0ZWQgd2l0aCB2aXNpdFRyeUNhdGNoQmxvY2spLCB3aG9zZSAnY2F0Y2gnIHR5cGUgaXMgcmVmZXJlbmNlZCBieQ0KKyAgICAgKiB0aGlzIHR5cGUgcmVmZXJlbmNlLiBUaGlzIG1ldGhvZCBtdXN0IG9ubHkgYmUgdXNlZCBmb3IgdHlwZSByZWZlcmVuY2VzDQorICAgICAqIHdob3NlIHNvcnQgaXMge0BsaW5rICNFWENFUFRJT05fUEFSQU1FVEVSIEVYQ0VQVElPTl9QQVJBTUVURVJ9IC4NCisgICAgICoNCisgICAgICogQHJldHVybiB0aGUgaW5kZXggb2YgYW4gZXhjZXB0aW9uIGluIHRoZSAndGhyb3dzJyBjbGF1c2Ugb2YgYSBtZXRob2QuDQorICAgICAqLw0KKyAgICBwdWJsaWMgaW50IGdldFRyeUNhdGNoQmxvY2tJbmRleCgpIHsNCisgICAgICAgIHJldHVybiAodmFsdWUgJiAweDAwRkZGRjAwKSA+PiA4Ow0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgdHlwZSBhcmd1bWVudCByZWZlcmVuY2VkIGJ5IHRoaXMgdHlwZSByZWZlcmVuY2UuDQorICAgICAqIFRoaXMgbWV0aG9kIG11c3Qgb25seSBiZSB1c2VkIGZvciB0eXBlIHJlZmVyZW5jZXMgd2hvc2Ugc29ydCBpcw0KKyAgICAgKiB7QGxpbmsgI0NBU1QgQ0FTVH0sIHtAbGluayAjQ09OU1RSVUNUT1JfSU5WT0NBVElPTl9UWVBFX0FSR1VNRU5UDQorICAgICAqIENPTlNUUlVDVE9SX0lOVk9DQVRJT05fVFlQRV9BUkdVTUVOVH0sDQorICAgICAqIHtAbGluayAjTUVUSE9EX0lOVk9DQVRJT05fVFlQRV9BUkdVTUVOVCBNRVRIT0RfSU5WT0NBVElPTl9UWVBFX0FSR1VNRU5UfSwNCisgICAgICoge0BsaW5rICNDT05TVFJVQ1RPUl9SRUZFUkVOQ0VfVFlQRV9BUkdVTUVOVA0KKyAgICAgKiBDT05TVFJVQ1RPUl9SRUZFUkVOQ0VfVFlQRV9BUkdVTUVOVH0sIG9yDQorICAgICAqIHtAbGluayAjTUVUSE9EX1JFRkVSRU5DRV9UWVBFX0FSR1VNRU5UIE1FVEhPRF9SRUZFUkVOQ0VfVFlQRV9BUkdVTUVOVH0uDQorICAgICAqDQorICAgICAqIEByZXR1cm4gYSB0eXBlIHBhcmFtZXRlciBpbmRleC4NCisgICAgICovDQorICAgIHB1YmxpYyBpbnQgZ2V0VHlwZUFyZ3VtZW50SW5kZXgoKSB7DQorICAgICAgICByZXR1cm4gdmFsdWUgJiAweEZGOw0KKyAgICB9DQorDQorICAgIC8qKg0KKyAgICAgKiBSZXR1cm5zIHRoZSBpbnQgZW5jb2RlZCB2YWx1ZSBvZiB0aGlzIHR5cGUgcmVmZXJlbmNlLCBzdWl0YWJsZSBmb3IgdXNlIGluDQorICAgICAqIHZpc2l0IG1ldGhvZHMgcmVsYXRlZCB0byB0eXBlIGFubm90YXRpb25zLCBsaWtlIHZpc2l0VHlwZUFubm90YXRpb24uDQorICAgICAqDQorICAgICAqIEByZXR1cm4gdGhlIGludCBlbmNvZGVkIHZhbHVlIG9mIHRoaXMgdHlwZSByZWZlcmVuY2UuDQorICAgICAqLw0KKyAgICBwdWJsaWMgaW50IGdldFZhbHVlKCkgew0KKyAgICAgICAgcmV0dXJuIHZhbHVlOw0KKyAgICB9DQorfQ0KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL0FwcGxpY2F0aW9uQ29uZmlndXJhdG9yLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9BcHBsaWNhdGlvbkNvbmZpZ3VyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYjM1YzgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9BcHBsaWNhdGlvbkNvbmZpZ3VyYXRvci5qYXZhCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlcjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuQm9vdHN0cmFwQmFnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkJvb3RzdHJhcENvbmZpZ3VyYXRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQmluZGluZ3M7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLlZhbHVlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29tcG9uZW50UHJvdmlkZXI7CisKKy8qKgorICogQ29uZmlndXJhdG9yIHdoaWNoIGluaXRpYWxpemVzIGFuZCByZWdpc3RlciB7QGxpbmsgQXBwbGljYXRpb259IGluc3RhbmNlIGludG8ge0BsaW5rIEluamVjdGlvbk1hbmFnZXJ9IGFuZAorICoge0BsaW5rIEJvb3RzdHJhcEJhZ30uCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK2NsYXNzIEFwcGxpY2F0aW9uQ29uZmlndXJhdG9yIGltcGxlbWVudHMgQm9vdHN0cmFwQ29uZmlndXJhdG9yIHsKKworICAgIHByaXZhdGUgQXBwbGljYXRpb24gYXBwbGljYXRpb247CisgICAgcHJpdmF0ZSBDbGFzczw/IGV4dGVuZHMgQXBwbGljYXRpb24+IGFwcGxpY2F0aW9uQ2xhc3M7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHtAbGluayBBcHBsaWNhdGlvbn0gZnJvbSBwcm92aWRlZCBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBBcHBsaWNhdGlvbkNvbmZpZ3VyYXRvcihBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbikgeworICAgICAgICB0aGlzLmFwcGxpY2F0aW9uID0gYXBwbGljYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSB7QGxpbmsgQXBwbGljYXRpb259IGZyb20gcHJvdmlkZWQgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXBwbGljYXRpb25DbGFzcyBhcHBsaWNhdGlvbiBjbGFzcy4KKyAgICAgKi8KKyAgICBBcHBsaWNhdGlvbkNvbmZpZ3VyYXRvcihDbGFzczw/IGV4dGVuZHMgQXBwbGljYXRpb24+IGFwcGxpY2F0aW9uQ2xhc3MpIHsKKyAgICAgICAgdGhpcy5hcHBsaWNhdGlvbkNsYXNzID0gYXBwbGljYXRpb25DbGFzczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBpbml0KEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciwgQm9vdHN0cmFwQmFnIGJvb3RzdHJhcEJhZykgeworICAgICAgICBTZXJ2ZXJCb290c3RyYXBCYWcgc2VydmVyQmFnID0gKFNlcnZlckJvb3RzdHJhcEJhZykgYm9vdHN0cmFwQmFnOworICAgICAgICBBcHBsaWNhdGlvbiByZXN1bHRBcHBsaWNhdGlvbjsKKworICAgICAgICAvLyBBcHBsaWNhdGlvbkNvbmZpZ3VyZXIgd2FzIGNyZWF0ZWQgd2l0aCBhbiBBcHBsaWNhdGlvbiBpbnN0YW5jZS4KKyAgICAgICAgaWYgKGFwcGxpY2F0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChhcHBsaWNhdGlvbiBpbnN0YW5jZW9mIFJlc291cmNlQ29uZmlnKSB7CisgICAgICAgICAgICAgICAgUmVzb3VyY2VDb25maWcgcmMgPSAoUmVzb3VyY2VDb25maWcpIGFwcGxpY2F0aW9uOworICAgICAgICAgICAgICAgIGlmIChyYy5nZXRBcHBsaWNhdGlvbkNsYXNzKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByYy5zZXRBcHBsaWNhdGlvbihjcmVhdGVBcHBsaWNhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLCByYy5nZXRBcHBsaWNhdGlvbkNsYXNzKCksIHNlcnZlckJhZy5nZXRDb21wb25lbnRQcm92aWRlcnMoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdEFwcGxpY2F0aW9uID0gYXBwbGljYXRpb247CisKKyAgICAgICAgLy8gQXBwbGljYXRpb25Db25maWd1cmVyIHdhcyBjcmVhdGVkIHdpdGggYW4gQXBwbGljYXRpb24gY2xhc3MuCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXN1bHRBcHBsaWNhdGlvbiA9IGNyZWF0ZUFwcGxpY2F0aW9uKGluamVjdGlvbk1hbmFnZXIsIGFwcGxpY2F0aW9uQ2xhc3MsIHNlcnZlckJhZy5nZXRDb21wb25lbnRQcm92aWRlcnMoKSk7CisgICAgICAgIH0KKworICAgICAgICBzZXJ2ZXJCYWcuc2V0QXBwbGljYXRpb24ocmVzdWx0QXBwbGljYXRpb24pOworICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyKEJpbmRpbmdzLnNlcnZpY2UocmVzdWx0QXBwbGljYXRpb24pLnRvKEFwcGxpY2F0aW9uLmNsYXNzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQXBwbGljYXRpb24gY3JlYXRlQXBwbGljYXRpb24oCisgICAgICAgICAgICBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIsCisgICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgQXBwbGljYXRpb24+IGFwcGxpY2F0aW9uQ2xhc3MsCisgICAgICAgICAgICBWYWx1ZTxDb2xsZWN0aW9uPENvbXBvbmVudFByb3ZpZGVyPj4gY29tcG9uZW50UHJvdmlkZXJzVmFsdWUpIHsKKyAgICAgICAgLy8gbmVlZCB0byBoYW5kbGUgUmVzb3VyY2VDb25maWcgYW5kIEFwcGxpY2F0aW9uIHNlcGFyYXRlbHkgYXMgaW52b2tpbmcgZm9yQ29udHJhY3QoKSBvbiB0aGVzZQorICAgICAgICAvLyB3aWxsIHRyaWdnZXIgdGhlIGZhY3RvcmllcyB3aGljaCB3ZSBkb24ndCB3YW50IGF0IHRoaXMgcG9pbnQKKyAgICAgICAgaWYgKGFwcGxpY2F0aW9uQ2xhc3MgPT0gUmVzb3VyY2VDb25maWcuY2xhc3MpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoKTsKKyAgICAgICAgfSBlbHNlIGlmIChhcHBsaWNhdGlvbkNsYXNzID09IEFwcGxpY2F0aW9uLmNsYXNzKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEFwcGxpY2F0aW9uKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDb2xsZWN0aW9uPENvbXBvbmVudFByb3ZpZGVyPiBjb21wb25lbnRQcm92aWRlcnMgPSBjb21wb25lbnRQcm92aWRlcnNWYWx1ZS5nZXQoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gYXBwQ2xhc3NCb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChDb21wb25lbnRQcm92aWRlciBjcCA6IGNvbXBvbmVudFByb3ZpZGVycykgeworICAgICAgICAgICAgICAgIGlmIChjcC5iaW5kKGFwcGxpY2F0aW9uQ2xhc3MsIENvbGxlY3Rpb25zLmVtcHR5U2V0KCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGFwcENsYXNzQm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWFwcENsYXNzQm91bmQpIHsKKyAgICAgICAgICAgICAgICBpZiAoYXBwbGljYXRpb25DbGFzcy5pc0Fubm90YXRpb25QcmVzZW50KFNpbmdsZXRvbi5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5yZWdpc3RlcihCaW5kaW5ncy5zZXJ2aWNlQXNDb250cmFjdChhcHBsaWNhdGlvbkNsYXNzKS5pbihTaW5nbGV0b24uY2xhc3MpKTsKKyAgICAgICAgICAgICAgICAgICAgYXBwQ2xhc3NCb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgQXBwbGljYXRpb24gYXBwID0gYXBwQ2xhc3NCb3VuZAorICAgICAgICAgICAgICAgICAgICA/IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoYXBwbGljYXRpb25DbGFzcykKKyAgICAgICAgICAgICAgICAgICAgOiBpbmplY3Rpb25NYW5hZ2VyLmNyZWF0ZUFuZEluaXRpYWxpemUoYXBwbGljYXRpb25DbGFzcyk7CisgICAgICAgICAgICBpZiAoYXBwIGluc3RhbmNlb2YgUmVzb3VyY2VDb25maWcpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyBfcmMgPSAoUmVzb3VyY2VDb25maWcpIGFwcDsKKyAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/IGV4dGVuZHMgQXBwbGljYXRpb24+IGlubmVyQXBwQ2xhc3MgPSBfcmMuZ2V0QXBwbGljYXRpb25DbGFzcygpOworICAgICAgICAgICAgICAgIGlmIChpbm5lckFwcENsYXNzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgQXBwbGljYXRpb24gaW5uZXJBcHAgPSBjcmVhdGVBcHBsaWNhdGlvbihpbmplY3Rpb25NYW5hZ2VyLCBpbm5lckFwcENsYXNzLCBjb21wb25lbnRQcm92aWRlcnNWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIF9yYy5zZXRBcHBsaWNhdGlvbihpbm5lckFwcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGFwcDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL0FwcGxpY2F0aW9uSGFuZGxlci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvQXBwbGljYXRpb25IYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU5NDQ5YQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL0FwcGxpY2F0aW9uSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsNzM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlcjsKKworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5TcGxpdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db21wbGV0YWJsZUZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtU3VwcG9ydDsKKworaW1wb3J0IGphdmF4LndzLnJzLkh0dHBNZXRob2Q7CitpbXBvcnQgamF2YXgud3MucnMuUnVudGltZVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlNlY3VyaXR5Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuQ29tbW9uUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5BdXRvRGlzY292ZXJhYmxlQ29uZmlndXJhdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkJvb3RzdHJhcEJhZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Cb290c3RyYXBDb25maWd1cmF0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuQ29udGV4dFJlc29sdmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5FcnJvcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuRXhjZXB0aW9uTWFwcGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5KYXhyc1Byb3ZpZGVyczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5WZXJzaW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5CaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkJpbmRpbmdzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5Db21wb3NpdGVCaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0Lkluc3RhbmNlQmluZGluZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuUHJvdmlkZXJzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuTWVzc2FnZUJvZHlXb3JrZXJzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuTWVzc2FnZUJvZHlGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuTWVzc2FnaW5nQmluZGVyczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLk51bGxPdXRwdXRTdHJlYW07CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW9kZWwuaW50ZXJuYWwuQ29tcG9uZW50QmFnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1vZGVsLmludGVybmFsLk1hbmFnZWRPYmplY3RzRmluYWxpemVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1vZGVsLmludGVybmFsLlJhbmtlZENvbXBhcmF0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW9kZWwuaW50ZXJuYWwuUmFua2VkUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5pbnRlcm5hbC5DaGFpbmFibGVTdGFnZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLmludGVybmFsLlJlcXVlc3RTY29wZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLmludGVybmFsLlN0YWdlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWwuU3RhZ2VzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5KZXJzZXlSZXF1ZXN0VGltZW91dEhhbmRsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5Qcm9jZXNzaW5nUHJvdmlkZXJzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5pbmplY3QuUGFyYW1Db252ZXJ0ZXJDb25maWd1cmF0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLmluamVjdC5QYXJhbUV4dHJhY3RvckNvbmZpZ3VyYXRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuaW5qZWN0LlZhbHVlUGFyYW1Qcm92aWRlckNvbmZpZ3VyYXRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwubW9uaXRvcmluZy5BcHBsaWNhdGlvbkV2ZW50SW1wbDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwubW9uaXRvcmluZy5Db21wb3NpdGVBcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLm1vbml0b3JpbmcuTW9uaXRvcmluZ0NvbnRhaW5lckxpc3RlbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5wcm9jZXNzLlJlZmVyZW5jZXNJbml0aWFsaXplcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwucHJvY2Vzcy5SZXF1ZXN0UHJvY2Vzc2luZ0NvbmZpZ3VyYXRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwucHJvY2Vzcy5SZXF1ZXN0UHJvY2Vzc2luZ0NvbnRleHQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLnByb2Nlc3MuUmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0UmVmZXJlbmNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5yb3V0aW5nLlJvdXRpbmc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLkNvbXBvbmVudE1vZGVsVmFsaWRhdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5Nb2RlbFByb2Nlc3NvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuTW9kZWxWYWxpZGF0aW9uRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuaW50ZXJuYWwuTW9kZWxFcnJvcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLmludGVybmFsLlJlc291cmNlTWV0aG9kSW52b2tlckNvbmZpZ3VyYXRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5BcHBsaWNhdGlvbkV2ZW50OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLkFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29udGFpbmVyUmVzcG9uc2VXcml0ZXI7CisKKy8qKgorICogSmVyc2V5IHNlcnZlci1zaWRlIGFwcGxpY2F0aW9uIGhhbmRsZXIuCisgKiA8cD4KKyAqIENvbnRhaW5lciBpbXBsZW1lbnRhdGlvbnMgdXNlIHRoZSB7QGNvZGUgQXBwbGljYXRpb25IYW5kbGVyfSBBUEkgdG8gcHJvY2VzcyByZXF1ZXN0cworICogYnkgaW52b2tpbmcgdGhlIHtAbGluayAjaGFuZGxlKENvbnRhaW5lclJlcXVlc3QpIGhhbmRsZShyZXF1ZXN0KX0KKyAqIG1ldGhvZCBvbiBhIGNvbmZpZ3VyZWQgYXBwbGljYXRpb24gIGhhbmRsZXIgaW5zdGFuY2UuCisgKiA8L3A+CisgKiA8cD4KKyAqIHtAY29kZSBBcHBsaWNhdGlvbkhhbmRsZXJ9IHByb3ZpZGVzIHR3byBpbXBsZW1lbnRhdGlvbnMgb2Yge0BsaW5rIGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbiBjb25maWd9IHRoYXQgY2FuIGJlIGluamVjdGVkCisgKiBpbnRvIHRoZSBhcHBsaWNhdGlvbiBjbGFzc2VzLiBUaGUgZmlyc3QgaXMge0BsaW5rIFJlc291cmNlQ29uZmlnIHJlc291cmNlIGNvbmZpZ30gd2hpY2ggaW1wbGVtZW50cyB7QGNvZGUgQ29uZmlndXJhdGlvbn0KKyAqIGl0c2VsZiBhbmQgaXMgY29uZmlndXJlZCBieSB0aGUgdXNlci4gVGhlIHJlc291cmNlIGNvbmZpZyBpcyBub3QgbW9kaWZpZWQgYnkgdGhpcyBhcHBsaWNhdGlvbiBoYW5kbGVyIHNvIHRoZSBmdXR1cmUgcmVsb2FkcyBvZgorICogdGhlIGFwcGxpY2F0aW9uIGlzIG5vdCBkaXNydXB0ZWQgYnkgcHJvdmlkZXJzIGZvdW5kIG9uIGEgY2xhc3NwYXRoLiBUaGlzIGNvbmZpZyBjYW4KKyAqIGJlIGluamVjdGVkIG9ubHkgYXMge0Bjb2RlIFJlc291cmNlQ29uZmlnfSBvciB7QGNvZGUgQXBwbGljYXRpb259LiBUaGUgc2Vjb25kIG9uZSBjYW4gYmUgaW5qZWN0ZWQgaW50byB0aGUKKyAqIHtAY29kZSBDb25maWd1cmF0aW9ufSBwYXJhbWV0ZXJzIC8gZmllbGRzIGFuZCBjb250YWlucyBpbmZvIGFib3V0IGFsbCB0aGUgcHJvcGVydGllcyAvIHByb3ZpZGVyIGNsYXNzZXMgLyBwcm92aWRlciBpbnN0YW5jZXMKKyAqIGZyb20gdGhlIHJlc291cmNlIGNvbmZpZyBhbmQgYWxzbyBhYm91dCBhbGwgdGhlIHByb3ZpZGVycyBmb3VuZCBkdXJpbmcgcHJvY2Vzc2luZyBjbGFzc2VzIHJlZ2lzdGVyZWQgdW5kZXIKKyAqIHtAbGluayBTZXJ2ZXJQcm9wZXJ0aWVzIHNlcnZlciBwcm9wZXJ0aWVzfS4gQWZ0ZXIgdGhlIGFwcGxpY2F0aW9uIGhhbmRsZXIgaXMgaW5pdGlhbGl6ZWQgYm90aCBjb25maWd1cmF0aW9ucyBhcmUgbWFya2VkIGFzCisgKiByZWFkLW9ubHkuCisgKiA8L3A+CisgKiA8cD4KKyAqIEFwcGxpY2F0aW9uIGhhbmRsZXIgaW5zdGFuY2UgYWxzbyBhY3RzIGFzIGFuIGFnZ3JlZ2F0ZSB7QGxpbmsgQ29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXJ9IGluc3RhbmNlCisgKiBmb3IgdGhlIGFzc29jaWF0ZWQgYXBwbGljYXRpb24uIEl0IGFnZ3JlZ2F0ZXMgYWxsIHRoZSByZWdpc3RlcmVkIGNvbnRhaW5lciBsaWZlY3ljbGUgbGlzdGVuZXJzCisgKiB1bmRlciBhIHNpbmdsZSwgdW1icmVsbGEgbGlzdGVuZXIsIHJlcHJlc2VudGVkIGJ5IHRoaXMgYXBwbGljYXRpb24gaGFuZGxlciBpbnN0YW5jZSwgdGhhdCBkZWxlZ2F0ZXMgYWxsIGNvbnRhaW5lciBsaWZlY3ljbGUKKyAqIGxpc3RlbmVyIG1ldGhvZCBjYWxscyB0byBhbGwgdGhlIHJlZ2lzdGVyZWQgbGlzdGVuZXJzLiBKZXJzZXkge0BsaW5rIENvbnRhaW5lciBjb250YWluZXJzfSBhcmUgZXhwZWN0ZWQgdG8gaW52b2tlCisgKiB0aGUgY29udGFpbmVyIGxpZmVjeWNsZSBtZXRob2RzIGRpcmVjdGx5IG9uIHRoZSBhY3RpdmUge0Bjb2RlIEFwcGxpY2F0aW9uSGFuZGxlcn0gaW5zdGFuY2UuIFRoZSBhcHBsaWNhdGlvbiBoYW5kbGVyIHdpbGwgdGhlbgorICogbWFrZSBzdXJlIHRvIGRlbGVnYXRlIHRoZSBsaWZlY3ljbGUgbGlzdGVuZXIgY2FsbHMgZnVydGhlciB0byBhbGwgdGhlIGNvbnRhaW5lciBsaWZlY3ljbGUgbGlzdGVuZXJzIHJlZ2lzdGVyZWQgd2l0aGluIHRoZQorICogYXBwbGljYXRpb24uIEFkZGl0aW9uYWxseSwgaW52b2tpbmcgdGhlIHtAbGluayBDb250YWluZXJMaWZlY3ljbGVMaXN0ZW5lciNvblNodXRkb3duKENvbnRhaW5lcil9IG1ldGhvZCBvbiB0aGlzIGFwcGxpY2F0aW9uCisgKiBoYW5kbGVyIGluc3RhbmNlIHdpbGwgcmVsZWFzZSBhbGwgdGhlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHVuZGVybHlpbmcgYXBwbGljYXRpb24gaW5zdGFuY2UgYXMgd2VsbCBhcyBjbG9zZSB0aGUKKyAqIGFwcGxpY2F0aW9uLXNwZWNpZmljIHtAbGluayBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbiBtYW5hZ2VyfS4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICogQHNlZSBSZXNvdXJjZUNvbmZpZworICogQHNlZSBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb24KKyAqIEBzZWUgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5Db250YWluZXJQcm92aWRlcgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQXBwbGljYXRpb25IYW5kbGVyIGltcGxlbWVudHMgQ29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoQXBwbGljYXRpb25IYW5kbGVyLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGR1bW15IHNlY3VyaXR5IGNvbnRleHQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2VjdXJpdHlDb250ZXh0IERFRkFVTFRfU0VDVVJJVFlfQ09OVEVYVCA9IG5ldyBTZWN1cml0eUNvbnRleHQoKSB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzVXNlckluUm9sZShmaW5hbCBTdHJpbmcgcm9sZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzU2VjdXJlKCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBQcmluY2lwYWwgZ2V0VXNlclByaW5jaXBhbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXV0aGVudGljYXRpb25TY2hlbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmF0b3Igd2hpY2ggaW5pdGlhbGl6ZXMgYW5kIHJlZ2lzdGVyIHtAbGluayBBcHBsaWNhdGlvbkhhbmRsZXJ9IGFuZCB7QGxpbmsgQ29uZmlndXJhdGlvbn0gaW5zdGFuY2VzIGludG8KKyAgICAgKiB7QGxpbmsgSW5qZWN0aW9uTWFuYWdlcn0gYW5kIHtAbGluayBCb290c3RyYXBCYWd9LgorICAgICAqCisgICAgICogQGF1dGhvciBQZXRyIEJvdWRhCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBSdW50aW1lQ29uZmlnQ29uZmlndXJhdG9yIGltcGxlbWVudHMgQm9vdHN0cmFwQ29uZmlndXJhdG9yIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaW5pdChJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIsIEJvb3RzdHJhcEJhZyBib290c3RyYXBCYWcpIHsKKyAgICAgICAgICAgIFNlcnZlckJvb3RzdHJhcEJhZyBzZXJ2ZXJCYWcgPSAoU2VydmVyQm9vdHN0cmFwQmFnKSBib290c3RyYXBCYWc7CisgICAgICAgICAgICBzZXJ2ZXJCYWcuc2V0QXBwbGljYXRpb25IYW5kbGVyKEFwcGxpY2F0aW9uSGFuZGxlci50aGlzKTsKKyAgICAgICAgICAgIHNlcnZlckJhZy5zZXRDb25maWd1cmF0aW9uKFJlc291cmNlQ29uZmlnLmNyZWF0ZVJ1bnRpbWVDb25maWcoc2VydmVyQmFnLmdldEFwcGxpY2F0aW9uKCkpKTsKKworICAgICAgICAgICAgLy8gVE9ETzogRG8gd2UgcmVhbGx5IG5lZWQgdGhlc2UgdGhyZWUgYmluZGluZ3MgaW4gREkgcHJvdmlkZXI/IFdoYXQgSkFYLVJTIHNwZWNpZmljYXRpb24gc2F5cz8KKyAgICAgICAgICAgIEluc3RhbmNlQmluZGluZzxBcHBsaWNhdGlvbkhhbmRsZXI+IGhhbmRsZXJCaW5kaW5nID0KKyAgICAgICAgICAgICAgICAgICAgQmluZGluZ3Muc2VydmljZShBcHBsaWNhdGlvbkhhbmRsZXIudGhpcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG8oQXBwbGljYXRpb25IYW5kbGVyLmNsYXNzKTsKKworICAgICAgICAgICAgSW5zdGFuY2VCaW5kaW5nPFJlc291cmNlQ29uZmlnPiBjb25maWdCaW5kaW5nID0KKyAgICAgICAgICAgICAgICAgICAgQmluZGluZ3Muc2VydmljZShzZXJ2ZXJCYWcuZ2V0UnVudGltZUNvbmZpZygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50byhDb25maWd1cmF0aW9uLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50byhTZXJ2ZXJDb25maWcuY2xhc3MpOworCisgICAgICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyKGhhbmRsZXJCaW5kaW5nKTsKKyAgICAgICAgICAgIGluamVjdGlvbk1hbmFnZXIucmVnaXN0ZXIoY29uZmlnQmluZGluZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIEFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uOworICAgIHByaXZhdGUgUmVzb3VyY2VDb25maWcgcnVudGltZUNvbmZpZzsKKyAgICBwcml2YXRlIFNlcnZlclJ1bnRpbWUgcnVudGltZTsKKyAgICBwcml2YXRlIEl0ZXJhYmxlPENvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyPiBjb250YWluZXJMaWZlY3ljbGVMaXN0ZW5lcnM7CisgICAgcHJpdmF0ZSBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXI7CisgICAgcHJpdmF0ZSBNZXNzYWdlQm9keVdvcmtlcnMgbXNnQm9keVdvcmtlcnM7CisgICAgcHJpdmF0ZSBNYW5hZ2VkT2JqZWN0c0ZpbmFsaXplciBtYW5hZ2VkT2JqZWN0c0ZpbmFsaXplcjsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBKZXJzZXkgYXBwbGljYXRpb24gaGFuZGxlciB1c2luZyBhIGRlZmF1bHQgY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQXBwbGljYXRpb25IYW5kbGVyKCkgeworICAgICAgICB0aGlzKG5ldyBBcHBsaWNhdGlvbigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgSmVyc2V5IHNlcnZlci1zaWRlIGFwcGxpY2F0aW9uIGhhbmRsZXIgY29uZmlndXJlZCBieSBhCisgICAgICoge0BsaW5rIEFwcGxpY2F0aW9uIEpBWC1SUyBBcHBsaWNhdGlvbiAoc3ViLSljbGFzc30uCisgICAgICoKKyAgICAgKiBAcGFyYW0gamF4cnNBcHBsaWNhdGlvbkNsYXNzIEpBWC1SUyB7QGNvZGUgQXBwbGljYXRpb259IChzdWItKWNsYXNzIHRoYXQgd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFudGlhdGVkIGFuZCB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgbmV3IEplcnNleQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gaGFuZGxlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQXBwbGljYXRpb25IYW5kbGVyKGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBBcHBsaWNhdGlvbj4gamF4cnNBcHBsaWNhdGlvbkNsYXNzKSB7CisgICAgICAgIGluaXRpYWxpemUobmV3IEFwcGxpY2F0aW9uQ29uZmlndXJhdG9yKGpheHJzQXBwbGljYXRpb25DbGFzcyksIEluamVjdGlvbnMuY3JlYXRlSW5qZWN0aW9uTWFuYWdlcigpLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgSmVyc2V5IHNlcnZlci1zaWRlIGFwcGxpY2F0aW9uIGhhbmRsZXIgY29uZmlndXJlZCBieSBhbiBpbnN0YW5jZQorICAgICAqIG9mIGEge0BsaW5rIEFwcGxpY2F0aW9uIEpBWC1SUyBBcHBsaWNhdGlvbiBzdWItY2xhc3N9LgorICAgICAqCisgICAgICogQHBhcmFtIGFwcGxpY2F0aW9uIGFuIGluc3RhbmNlIG9mIGEgSkFYLVJTIHtAY29kZSBBcHBsaWNhdGlvbn0gKHN1Yi0pY2xhc3MgdGhhdAorICAgICAqICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBuZXcgSmVyc2V5IGFwcGxpY2F0aW9uIGhhbmRsZXIuCisgICAgICovCisgICAgcHVibGljIEFwcGxpY2F0aW9uSGFuZGxlcihmaW5hbCBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbikgeworICAgICAgICB0aGlzKGFwcGxpY2F0aW9uLCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgSmVyc2V5IHNlcnZlci1zaWRlIGFwcGxpY2F0aW9uIGhhbmRsZXIgY29uZmlndXJlZCBieSBhbiBpbnN0YW5jZQorICAgICAqIG9mIGEge0BsaW5rIFJlc291cmNlQ29uZmlnfSBhbmQgYSBjdXN0b20ge0BsaW5rIEJpbmRlcn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXBwbGljYXRpb24gIGFuIGluc3RhbmNlIG9mIGEgSkFYLVJTIHtAY29kZSBBcHBsaWNhdGlvbn0gKHN1Yi0pY2xhc3MgdGhhdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgbmV3IEplcnNleSBhcHBsaWNhdGlvbiBoYW5kbGVyLgorICAgICAqIEBwYXJhbSBjdXN0b21CaW5kZXIgYWRkaXRpb25hbCBjdXN0b20gYmluZGluZ3MgdXNlZCB0byBjb25maWd1cmUgdGhlIGFwcGxpY2F0aW9uJ3MuCisgICAgICovCisgICAgcHVibGljIEFwcGxpY2F0aW9uSGFuZGxlcihmaW5hbCBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiwgZmluYWwgQmluZGVyIGN1c3RvbUJpbmRlcikgeworICAgICAgICB0aGlzKGFwcGxpY2F0aW9uLCBjdXN0b21CaW5kZXIsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBKZXJzZXkgc2VydmVyLXNpZGUgYXBwbGljYXRpb24gaGFuZGxlciBjb25maWd1cmVkIGJ5IGFuIGluc3RhbmNlCisgICAgICogb2YgYSB7QGxpbmsgUmVzb3VyY2VDb25maWd9LCBjdXN0b20ge0BsaW5rIEJpbmRlcn0gYW5kIGEgcGFyZW50IHVzZWQgYnkge0BsaW5rIEluamVjdGlvbk1hbmFnZXJ9LgorICAgICAqCisgICAgICogQHBhcmFtIGFwcGxpY2F0aW9uICAgYW4gaW5zdGFuY2Ugb2YgYSBKQVgtUlMge0Bjb2RlIEFwcGxpY2F0aW9ufSAoc3ViLSljbGFzcyB0aGF0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgbmV3IEplcnNleSBhcHBsaWNhdGlvbiBoYW5kbGVyLgorICAgICAqIEBwYXJhbSBjdXN0b21CaW5kZXIgIGFkZGl0aW9uYWwgY3VzdG9tIGJpbmRpbmdzIHVzZWQgZHVyaW5nIHtAbGluayBJbmplY3Rpb25NYW5hZ2VyfSBjcmVhdGlvbi4KKyAgICAgKiBAcGFyYW0gcGFyZW50TWFuYWdlciBwYXJlbnQgdXNlZCBpbiB7QGxpbmsgSW5qZWN0aW9uTWFuYWdlcn0gZm9yIGEgc3BlY2lmaWMgREkgcHJvdmlkZXIuCisgICAgICovCisgICAgcHVibGljIEFwcGxpY2F0aW9uSGFuZGxlcihmaW5hbCBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiwgZmluYWwgQmluZGVyIGN1c3RvbUJpbmRlciwgZmluYWwgT2JqZWN0IHBhcmVudE1hbmFnZXIpIHsKKyAgICAgICAgaW5pdGlhbGl6ZShuZXcgQXBwbGljYXRpb25Db25maWd1cmF0b3IoYXBwbGljYXRpb24pLCBJbmplY3Rpb25zLmNyZWF0ZUluamVjdGlvbk1hbmFnZXIocGFyZW50TWFuYWdlciksIGN1c3RvbUJpbmRlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoQXBwbGljYXRpb25Db25maWd1cmF0b3IgYXBwbGljYXRpb25Db25maWd1cmF0b3IsIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciwKKyAgICAgICAgICAgIEJpbmRlciBjdXN0b21CaW5kZXIpIHsKKyAgICAgICAgTE9HR0VSLmNvbmZpZyhMb2NhbGl6YXRpb25NZXNzYWdlcy5JTklUX01TRyhWZXJzaW9uLmdldEJ1aWxkSWQoKSkpOworICAgICAgICB0aGlzLmluamVjdGlvbk1hbmFnZXIgPSBpbmplY3Rpb25NYW5hZ2VyOworICAgICAgICB0aGlzLmluamVjdGlvbk1hbmFnZXIucmVnaXN0ZXIoQ29tcG9zaXRlQmluZGVyLndyYXAobmV3IFNlcnZlckJpbmRlcigpLCBjdXN0b21CaW5kZXIpKTsKKyAgICAgICAgdGhpcy5tYW5hZ2VkT2JqZWN0c0ZpbmFsaXplciA9IG5ldyBNYW5hZ2VkT2JqZWN0c0ZpbmFsaXplcihpbmplY3Rpb25NYW5hZ2VyKTsKKworICAgICAgICBTZXJ2ZXJCb290c3RyYXBCYWcgYm9vdHN0cmFwQmFnID0gbmV3IFNlcnZlckJvb3RzdHJhcEJhZygpOworICAgICAgICBib290c3RyYXBCYWcuc2V0TWFuYWdlZE9iamVjdHNGaW5hbGl6ZXIobWFuYWdlZE9iamVjdHNGaW5hbGl6ZXIpOworICAgICAgICBMaXN0PEJvb3RzdHJhcENvbmZpZ3VyYXRvcj4gYm9vdHN0cmFwQ29uZmlndXJhdG9ycyA9IEFycmF5cy5hc0xpc3QoCisgICAgICAgICAgICAgICAgbmV3IFJlcXVlc3RQcm9jZXNzaW5nQ29uZmlndXJhdG9yKCksCisgICAgICAgICAgICAgICAgbmV3IFJlcXVlc3RTY29wZS5SZXF1ZXN0U2NvcGVDb25maWd1cmF0b3IoKSwKKyAgICAgICAgICAgICAgICBuZXcgUGFyYW1Db252ZXJ0ZXJDb25maWd1cmF0b3IoKSwKKyAgICAgICAgICAgICAgICBuZXcgUGFyYW1FeHRyYWN0b3JDb25maWd1cmF0b3IoKSwKKyAgICAgICAgICAgICAgICBuZXcgVmFsdWVQYXJhbVByb3ZpZGVyQ29uZmlndXJhdG9yKCksCisgICAgICAgICAgICAgICAgbmV3IEplcnNleVJlc291cmNlQ29udGV4dENvbmZpZ3VyYXRvcigpLAorICAgICAgICAgICAgICAgIG5ldyBDb21wb25lbnRQcm92aWRlckNvbmZpZ3VyYXRvcigpLAorICAgICAgICAgICAgICAgIG5ldyBKYXhyc1Byb3ZpZGVycy5Qcm92aWRlcnNDb25maWd1cmF0b3IoKSwKKyAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbkNvbmZpZ3VyYXRvciwKKyAgICAgICAgICAgICAgICBuZXcgUnVudGltZUNvbmZpZ0NvbmZpZ3VyYXRvcigpLAorICAgICAgICAgICAgICAgIG5ldyBDb250ZXh0UmVzb2x2ZXJGYWN0b3J5LkNvbnRleHRSZXNvbHZlcnNDb25maWd1cmF0b3IoKSwKKyAgICAgICAgICAgICAgICBuZXcgTWVzc2FnZUJvZHlGYWN0b3J5Lk1lc3NhZ2VCb2R5V29ya2Vyc0NvbmZpZ3VyYXRvcigpLAorICAgICAgICAgICAgICAgIG5ldyBFeGNlcHRpb25NYXBwZXJGYWN0b3J5LkV4Y2VwdGlvbk1hcHBlcnNDb25maWd1cmF0b3IoKSwKKyAgICAgICAgICAgICAgICBuZXcgUmVzb3VyY2VNZXRob2RJbnZva2VyQ29uZmlndXJhdG9yKCksCisgICAgICAgICAgICAgICAgbmV3IFByb2Nlc3NpbmdQcm92aWRlcnNDb25maWd1cmF0b3IoKSwKKyAgICAgICAgICAgICAgICBuZXcgQ29udGFpbmVyUHJvdmlkZXJDb25maWd1cmF0b3IoUnVudGltZVR5cGUuU0VSVkVSKSwKKyAgICAgICAgICAgICAgICBuZXcgQXV0b0Rpc2NvdmVyYWJsZUNvbmZpZ3VyYXRvcihSdW50aW1lVHlwZS5TRVJWRVIpKTsKKworICAgICAgICBib290c3RyYXBDb25maWd1cmF0b3JzLmZvckVhY2goY29uZmlndXJhdG9yIC0+IGNvbmZpZ3VyYXRvci5pbml0KGluamVjdGlvbk1hbmFnZXIsIGJvb3RzdHJhcEJhZykpOworCisgICAgICAgIHRoaXMucnVudGltZSA9IEVycm9ycy5wcm9jZXNzV2l0aEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAoKSAtPiBpbml0aWFsaXplKGluamVjdGlvbk1hbmFnZXIsIGJvb3RzdHJhcENvbmZpZ3VyYXRvcnMsIGJvb3RzdHJhcEJhZykpOworICAgICAgICB0aGlzLmNvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVycyA9IFByb3ZpZGVycy5nZXRBbGxQcm92aWRlcnMoaW5qZWN0aW9uTWFuYWdlciwgQ29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXIuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc3VtZXMgdGhlIGNvbmZpZ3VyYXRpb24gZmllbGQgaXMgaW5pdGlhbGl6ZWQgd2l0aCBhIHZhbGlkIFJlc291cmNlQ29uZmlnLgorICAgICAqLworICAgIHByaXZhdGUgU2VydmVyUnVudGltZSBpbml0aWFsaXplKEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciwgTGlzdDxCb290c3RyYXBDb25maWd1cmF0b3I+IGJvb3RzdHJhcENvbmZpZ3VyYXRvcnMsCisgICAgICAgICAgICBTZXJ2ZXJCb290c3RyYXBCYWcgYm9vdHN0cmFwQmFnKSB7CisKKyAgICAgICAgdGhpcy5hcHBsaWNhdGlvbiA9IGJvb3RzdHJhcEJhZy5nZXRBcHBsaWNhdGlvbigpOworICAgICAgICB0aGlzLnJ1bnRpbWVDb25maWcgPSBib290c3RyYXBCYWcuZ2V0UnVudGltZUNvbmZpZygpOworCisgICAgICAgIC8vIFJlZ2lzdGVyIHRoZSBiaW5kZXJzIHdoaWNoIGFyZSBkZXBlbmRlbnQgb24gIkFwcGxpY2F0aW9uLnByb3BlcnRpZXMoKSIKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5yZWdpc3RlcihuZXcgTWVzc2FnaW5nQmluZGVycy5NZXNzYWdlQm9keVByb3ZpZGVycyhhcHBsaWNhdGlvbi5nZXRQcm9wZXJ0aWVzKCksIFJ1bnRpbWVUeXBlLlNFUlZFUikpOworCisgICAgICAgIC8vIExvY2sgb3JpZ2luYWwgUmVzb3VyY2VDb25maWcuCisgICAgICAgIGlmIChhcHBsaWNhdGlvbiBpbnN0YW5jZW9mIFJlc291cmNlQ29uZmlnKSB7CisgICAgICAgICAgICAoKFJlc291cmNlQ29uZmlnKSBhcHBsaWNhdGlvbikubG9jaygpOworICAgICAgICB9CisKKyAgICAgICAgQ29tcG9zaXRlQXBwbGljYXRpb25FdmVudExpc3RlbmVyIGNvbXBvc2l0ZUxpc3RlbmVyID0gbnVsbDsKKworICAgICAgICBFcnJvcnMubWFyaygpOyAvLyBtYXJrIGJlZ2luIG9mIHZhbGlkYXRpb24gcGhhc2UKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIFRPRE86IENyZWF0ZSBhcyBhIGNvbmZpZ3VyYXRvcj8gLyBUaGUgc2FtZSBjb2RlIGluIENsaWVudENvbmZpZy4KKyAgICAgICAgICAgIC8vIEF1dG9EaXNjb3ZlcmFibGUuCisgICAgICAgICAgICBpZiAoIUNvbW1vblByb3BlcnRpZXMuZ2V0VmFsdWUocnVudGltZUNvbmZpZy5nZXRQcm9wZXJ0aWVzKCksIFJ1bnRpbWVUeXBlLlNFUlZFUiwKKyAgICAgICAgICAgICAgICAgICAgQ29tbW9uUHJvcGVydGllcy5GRUFUVVJFX0FVVE9fRElTQ09WRVJZX0RJU0FCTEUsIEJvb2xlYW4uRkFMU0UsIEJvb2xlYW4uY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgcnVudGltZUNvbmZpZy5jb25maWd1cmVBdXRvRGlzY292ZXJhYmxlUHJvdmlkZXJzKGluamVjdGlvbk1hbmFnZXIsIGJvb3RzdHJhcEJhZy5nZXRBdXRvRGlzY292ZXJhYmxlcygpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcnVudGltZUNvbmZpZy5jb25maWd1cmVGb3JjZWRBdXRvRGlzY292ZXJhYmxlUHJvdmlkZXJzKGluamVjdGlvbk1hbmFnZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDb25maWd1cmUgYmluZGVycyBhbmQgZmVhdHVyZXMuCisgICAgICAgICAgICBydW50aW1lQ29uZmlnLmNvbmZpZ3VyZU1ldGFQcm92aWRlcnMoaW5qZWN0aW9uTWFuYWdlciwgYm9vdHN0cmFwQmFnLmdldE1hbmFnZWRPYmplY3RzRmluYWxpemVyKCkpOworCisgICAgICAgICAgICBSZXNvdXJjZUJhZ0NvbmZpZ3VyYXRvciByZXNvdXJjZUJhZ0NvbmZpZ3VyYXRvciA9IG5ldyBSZXNvdXJjZUJhZ0NvbmZpZ3VyYXRvcigpOworICAgICAgICAgICAgcmVzb3VyY2VCYWdDb25maWd1cmF0b3IuaW5pdChpbmplY3Rpb25NYW5hZ2VyLCBib290c3RyYXBCYWcpOworCisgICAgICAgICAgICBydW50aW1lQ29uZmlnLmxvY2soKTsKKworICAgICAgICAgICAgRXh0ZXJuYWxSZXF1ZXN0U2NvcGVDb25maWd1cmF0b3IgZXh0ZXJuYWxSZXF1ZXN0U2NvcGVDb25maWd1cmF0b3IgPSBuZXcgRXh0ZXJuYWxSZXF1ZXN0U2NvcGVDb25maWd1cmF0b3IoKTsKKyAgICAgICAgICAgIGV4dGVybmFsUmVxdWVzdFNjb3BlQ29uZmlndXJhdG9yLmluaXQoaW5qZWN0aW9uTWFuYWdlciwgYm9vdHN0cmFwQmFnKTsKKworICAgICAgICAgICAgTW9kZWxQcm9jZXNzb3JDb25maWd1cmF0b3IgbW9kZWxQcm9jZXNzb3JDb25maWd1cmF0b3IgPSBuZXcgTW9kZWxQcm9jZXNzb3JDb25maWd1cmF0b3IoKTsKKyAgICAgICAgICAgIG1vZGVsUHJvY2Vzc29yQ29uZmlndXJhdG9yLmluaXQoaW5qZWN0aW9uTWFuYWdlciwgYm9vdHN0cmFwQmFnKTsKKworICAgICAgICAgICAgUmVzb3VyY2VNb2RlbENvbmZpZ3VyYXRvciByZXNvdXJjZU1vZGVsQ29uZmlndXJhdG9yID0gbmV3IFJlc291cmNlTW9kZWxDb25maWd1cmF0b3IoKTsKKyAgICAgICAgICAgIHJlc291cmNlTW9kZWxDb25maWd1cmF0b3IuaW5pdChpbmplY3Rpb25NYW5hZ2VyLCBib290c3RyYXBCYWcpOworCisgICAgICAgICAgICBTZXJ2ZXJFeGVjdXRvclByb3ZpZGVyc0NvbmZpZ3VyYXRvciBleGVjdXRvclByb3ZpZGVyc0NvbmZpZ3VyYXRvciA9IG5ldyBTZXJ2ZXJFeGVjdXRvclByb3ZpZGVyc0NvbmZpZ3VyYXRvcigpOworICAgICAgICAgICAgZXhlY3V0b3JQcm92aWRlcnNDb25maWd1cmF0b3IuaW5pdChpbmplY3Rpb25NYW5hZ2VyLCBib290c3RyYXBCYWcpOworCisgICAgICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLmNvbXBsZXRlUmVnaXN0cmF0aW9uKCk7CisKKyAgICAgICAgICAgIGJvb3RzdHJhcENvbmZpZ3VyYXRvcnMuZm9yRWFjaChjb25maWd1cmF0b3IgLT4gY29uZmlndXJhdG9yLnBvc3RJbml0KGluamVjdGlvbk1hbmFnZXIsIGJvb3RzdHJhcEJhZykpOworICAgICAgICAgICAgcmVzb3VyY2VNb2RlbENvbmZpZ3VyYXRvci5wb3N0SW5pdChpbmplY3Rpb25NYW5hZ2VyLCBib290c3RyYXBCYWcpOworCisgICAgICAgICAgICBJdGVyYWJsZTxBcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXI+IGFwcEV2ZW50TGlzdGVuZXJzID0KKyAgICAgICAgICAgICAgICAgICAgUHJvdmlkZXJzLmdldEFsbFByb3ZpZGVycyhpbmplY3Rpb25NYW5hZ2VyLCBBcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXIuY2xhc3MsIG5ldyBSYW5rZWRDb21wYXJhdG9yPD4oKSk7CisKKyAgICAgICAgICAgIGlmIChhcHBFdmVudExpc3RlbmVycy5pdGVyYXRvcigpLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIFJlc291cmNlQmFnIHJlc291cmNlQmFnID0gYm9vdHN0cmFwQmFnLmdldFJlc291cmNlQmFnKCk7CisgICAgICAgICAgICAgICAgY29tcG9zaXRlTGlzdGVuZXIgPSBuZXcgQ29tcG9zaXRlQXBwbGljYXRpb25FdmVudExpc3RlbmVyKGFwcEV2ZW50TGlzdGVuZXJzKTsKKyAgICAgICAgICAgICAgICBjb21wb3NpdGVMaXN0ZW5lci5vbkV2ZW50KG5ldyBBcHBsaWNhdGlvbkV2ZW50SW1wbChBcHBsaWNhdGlvbkV2ZW50LlR5cGUuSU5JVElBTElaQVRJT05fU1RBUlQsCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJ1bnRpbWVDb25maWcsIHJ1bnRpbWVDb25maWcuZ2V0Q29tcG9uZW50QmFnKCkuZ2V0UmVnaXN0cmF0aW9ucygpLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VCYWcuY2xhc3NlcywgcmVzb3VyY2VCYWcuaW5zdGFuY2VzLCBudWxsKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghZGlzYWJsZVZhbGlkYXRpb24oKSkgeworICAgICAgICAgICAgICAgIENvbXBvbmVudE1vZGVsVmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBDb21wb25lbnRNb2RlbFZhbGlkYXRvcigKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb3RzdHJhcEJhZy5nZXRWYWx1ZVBhcmFtUHJvdmlkZXJzKCksIGJvb3RzdHJhcEJhZy5nZXRNZXNzYWdlQm9keVdvcmtlcnMoKSk7CisgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZShib290c3RyYXBCYWcuZ2V0UmVzb3VyY2VNb2RlbCgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKEVycm9ycy5mYXRhbElzc3Vlc0ZvdW5kKCkgJiYgIWlnbm9yZVZhbGlkYXRpb25FcnJvcigpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1vZGVsVmFsaWRhdGlvbkV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5SRVNPVVJDRV9NT0RFTF9WQUxJREFUSU9OX0ZBSUxFRF9BVF9JTklUKCksCisgICAgICAgICAgICAgICAgICAgICAgICBNb2RlbEVycm9ycy5nZXRFcnJvcnNBc1Jlc291cmNlTW9kZWxJc3N1ZXModHJ1ZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGlnbm9yZVZhbGlkYXRpb25FcnJvcigpKSB7CisgICAgICAgICAgICAgICAgRXJyb3JzLmxvZ0Vycm9ycyh0cnVlKTsKKyAgICAgICAgICAgICAgICBFcnJvcnMucmVzZXQoKTsgLy8gcmVzZXQgZXJyb3JzIHRvIHRoZSBzdGF0ZSBiZWZvcmUgdmFsaWRhdGlvbiBwaGFzZQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBFcnJvcnMudW5tYXJrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0aGlzLm1zZ0JvZHlXb3JrZXJzID0gYm9vdHN0cmFwQmFnLmdldE1lc3NhZ2VCb2R5V29ya2VycygpOworCisgICAgICAgIC8vIGFzc2VtYmx5IHJlcXVlc3QgcHJvY2Vzc2luZyBjaGFpbgorICAgICAgICBQcm9jZXNzaW5nUHJvdmlkZXJzIHByb2Nlc3NpbmdQcm92aWRlcnMgPSBib290c3RyYXBCYWcuZ2V0UHJvY2Vzc2luZ1Byb3ZpZGVycygpOworICAgICAgICBmaW5hbCBDb250YWluZXJGaWx0ZXJpbmdTdGFnZSBwcmVNYXRjaFJlcXVlc3RGaWx0ZXJpbmdTdGFnZSA9IG5ldyBDb250YWluZXJGaWx0ZXJpbmdTdGFnZSgKKyAgICAgICAgICAgICAgICBwcm9jZXNzaW5nUHJvdmlkZXJzLmdldFByZU1hdGNoRmlsdGVycygpLAorICAgICAgICAgICAgICAgIHByb2Nlc3NpbmdQcm92aWRlcnMuZ2V0R2xvYmFsUmVzcG9uc2VGaWx0ZXJzKCkpOworICAgICAgICBmaW5hbCBDaGFpbmFibGVTdGFnZTxSZXF1ZXN0UHJvY2Vzc2luZ0NvbnRleHQ+IHJvdXRpbmdTdGFnZSA9CisgICAgICAgICAgICAgICAgUm91dGluZy5mb3JNb2RlbChib290c3RyYXBCYWcuZ2V0UmVzb3VyY2VNb2RlbCgpLmdldFJ1bnRpbWVSZXNvdXJjZU1vZGVsKCkpCisgICAgICAgICAgICAgICAgICAgIC5yZXNvdXJjZUNvbnRleHQoYm9vdHN0cmFwQmFnLmdldFJlc291cmNlQ29udGV4dCgpKQorICAgICAgICAgICAgICAgICAgICAuY29uZmlndXJhdGlvbihydW50aW1lQ29uZmlnKQorICAgICAgICAgICAgICAgICAgICAuZW50aXR5UHJvdmlkZXJzKG1zZ0JvZHlXb3JrZXJzKQorICAgICAgICAgICAgICAgICAgICAudmFsdWVTdXBwbGllclByb3ZpZGVycyhib290c3RyYXBCYWcuZ2V0VmFsdWVQYXJhbVByb3ZpZGVycygpKQorICAgICAgICAgICAgICAgICAgICAubW9kZWxQcm9jZXNzb3JzKFByb3ZpZGVycy5nZXRBbGxSYW5rZWRTb3J0ZWRQcm92aWRlcnMoaW5qZWN0aW9uTWFuYWdlciwgTW9kZWxQcm9jZXNzb3IuY2xhc3MpKQorICAgICAgICAgICAgICAgICAgICAuY3JlYXRlU2VydmljZShzZXJ2aWNlVHlwZSAtPiBJbmplY3Rpb25zLmdldE9yQ3JlYXRlKGluamVjdGlvbk1hbmFnZXIsIHNlcnZpY2VUeXBlKSkKKyAgICAgICAgICAgICAgICAgICAgLnByb2Nlc3NpbmdQcm92aWRlcnMocHJvY2Vzc2luZ1Byb3ZpZGVycykKKyAgICAgICAgICAgICAgICAgICAgLnJlc291cmNlTWV0aG9kSW52b2tlckJ1aWxkZXIoYm9vdHN0cmFwQmFnLmdldFJlc291cmNlTWV0aG9kSW52b2tlckJ1aWxkZXIoKSkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkU3RhZ2UoKTsKKyAgICAgICAgLyoKKyAgICAgICAgICogIFJvb3QgbGluZWFyIHJlcXVlc3QgYWNjZXB0b3IuIFRoaXMgaXMgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIHRoZSB3aG9sZSByZXF1ZXN0IHByb2Nlc3NpbmcuCisgICAgICAgICAqLworICAgICAgICBmaW5hbCBDb250YWluZXJGaWx0ZXJpbmdTdGFnZSByZXNvdXJjZUZpbHRlcmluZ1N0YWdlID0KKyAgICAgICAgICAgICAgICBuZXcgQ29udGFpbmVyRmlsdGVyaW5nU3RhZ2UocHJvY2Vzc2luZ1Byb3ZpZGVycy5nZXRHbG9iYWxSZXF1ZXN0RmlsdGVycygpLCBudWxsKTsKKworICAgICAgICBmaW5hbCBSZWZlcmVuY2VzSW5pdGlhbGl6ZXIgcmVmZXJlbmNlc0luaXRpYWxpemVyID0gbmV3IFJlZmVyZW5jZXNJbml0aWFsaXplcihpbmplY3Rpb25NYW5hZ2VyLAorICAgICAgICAgICAgICAgICgpIC0+IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoUmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0UmVmZXJlbmNlLmNsYXNzKSk7CisKKyAgICAgICAgZmluYWwgU3RhZ2U8UmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0PiByb290U3RhZ2UgPSBTdGFnZXMKKyAgICAgICAgICAgICAgICAuY2hhaW4ocmVmZXJlbmNlc0luaXRpYWxpemVyKQorICAgICAgICAgICAgICAgIC50byhwcmVNYXRjaFJlcXVlc3RGaWx0ZXJpbmdTdGFnZSkKKyAgICAgICAgICAgICAgICAudG8ocm91dGluZ1N0YWdlKQorICAgICAgICAgICAgICAgIC50byhyZXNvdXJjZUZpbHRlcmluZ1N0YWdlKQorICAgICAgICAgICAgICAgIC5idWlsZChSb3V0aW5nLm1hdGNoZWRFbmRwb2ludEV4dHJhY3RvcigpKTsKKworICAgICAgICBTZXJ2ZXJSdW50aW1lIHNlcnZlclJ1bnRpbWUgPSBTZXJ2ZXJSdW50aW1lLmNyZWF0ZVNlcnZlclJ1bnRpbWUoCisgICAgICAgICAgICAgICAgaW5qZWN0aW9uTWFuYWdlciwgYm9vdHN0cmFwQmFnLCByb290U3RhZ2UsIGNvbXBvc2l0ZUxpc3RlbmVyLCBwcm9jZXNzaW5nUHJvdmlkZXJzKTsKKworICAgICAgICAvLyBJbmplY3QgaW5zdGFuY2VzLgorICAgICAgICBDb21wb25lbnRCYWcgY29tcG9uZW50QmFnID0gcnVudGltZUNvbmZpZy5nZXRDb21wb25lbnRCYWcoKTsKKyAgICAgICAgUmVzb3VyY2VCYWcgcmVzb3VyY2VCYWcgPSBib290c3RyYXBCYWcuZ2V0UmVzb3VyY2VCYWcoKTsKKyAgICAgICAgZm9yIChmaW5hbCBPYmplY3QgaW5zdGFuY2UgOiBjb21wb25lbnRCYWcuZ2V0SW5zdGFuY2VzKENvbXBvbmVudEJhZy5leGNsdWRlTWV0YVByb3ZpZGVycyhpbmplY3Rpb25NYW5hZ2VyKSkpIHsKKyAgICAgICAgICAgIGluamVjdGlvbk1hbmFnZXIuaW5qZWN0KGluc3RhbmNlKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGZpbmFsIE9iamVjdCBpbnN0YW5jZSA6IHJlc291cmNlQmFnLmluc3RhbmNlcykgeworICAgICAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5pbmplY3QoaW5zdGFuY2UpOworICAgICAgICB9CisKKyAgICAgICAgbG9nQXBwbGljYXRpb25Jbml0Q29uZmlndXJhdGlvbihpbmplY3Rpb25NYW5hZ2VyLCByZXNvdXJjZUJhZywgcHJvY2Vzc2luZ1Byb3ZpZGVycyk7CisKKyAgICAgICAgaWYgKGNvbXBvc2l0ZUxpc3RlbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uRXZlbnQgaW5pdEZpbmlzaGVkRXZlbnQgPSBuZXcgQXBwbGljYXRpb25FdmVudEltcGwoCisgICAgICAgICAgICAgICAgICAgIEFwcGxpY2F0aW9uRXZlbnQuVHlwZS5JTklUSUFMSVpBVElPTl9BUFBfRklOSVNIRUQsIHJ1bnRpbWVDb25maWcsCisgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEJhZy5nZXRSZWdpc3RyYXRpb25zKCksIHJlc291cmNlQmFnLmNsYXNzZXMsIHJlc291cmNlQmFnLmluc3RhbmNlcywKKyAgICAgICAgICAgICAgICAgICAgYm9vdHN0cmFwQmFnLmdldFJlc291cmNlTW9kZWwoKSk7CisgICAgICAgICAgICBjb21wb3NpdGVMaXN0ZW5lci5vbkV2ZW50KGluaXRGaW5pc2hlZEV2ZW50KTsKKworICAgICAgICAgICAgTW9uaXRvcmluZ0NvbnRhaW5lckxpc3RlbmVyIGNvbnRhaW5lckxpc3RlbmVyID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShNb25pdG9yaW5nQ29udGFpbmVyTGlzdGVuZXIuY2xhc3MpOworICAgICAgICAgICAgY29udGFpbmVyTGlzdGVuZXIuaW5pdChjb21wb3NpdGVMaXN0ZW5lciwgaW5pdEZpbmlzaGVkRXZlbnQpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNlcnZlclJ1bnRpbWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlnbm9yZVZhbGlkYXRpb25FcnJvcigpIHsKKyAgICAgICAgcmV0dXJuIFNlcnZlclByb3BlcnRpZXMuZ2V0VmFsdWUocnVudGltZUNvbmZpZy5nZXRQcm9wZXJ0aWVzKCksCisgICAgICAgICAgICAgICAgU2VydmVyUHJvcGVydGllcy5SRVNPVVJDRV9WQUxJREFUSU9OX0lHTk9SRV9FUlJPUlMsCisgICAgICAgICAgICAgICAgQm9vbGVhbi5GQUxTRSwKKyAgICAgICAgICAgICAgICBCb29sZWFuLmNsYXNzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gZGlzYWJsZVZhbGlkYXRpb24oKSB7CisgICAgICAgIHJldHVybiBTZXJ2ZXJQcm9wZXJ0aWVzLmdldFZhbHVlKHJ1bnRpbWVDb25maWcuZ2V0UHJvcGVydGllcygpLAorICAgICAgICAgICAgICAgIFNlcnZlclByb3BlcnRpZXMuUkVTT1VSQ0VfVkFMSURBVElPTl9ESVNBQkxFLAorICAgICAgICAgICAgICAgIEJvb2xlYW4uRkFMU0UsCisgICAgICAgICAgICAgICAgQm9vbGVhbi5jbGFzcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2dBcHBsaWNhdGlvbkluaXRDb25maWd1cmF0aW9uKGZpbmFsIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VCYWcgcmVzb3VyY2VCYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFByb2Nlc3NpbmdQcm92aWRlcnMgcHJvY2Vzc2luZ1Byb3ZpZGVycykgeworICAgICAgICBpZiAoIUxPR0dFUi5pc0xvZ2dhYmxlKExldmVsLkNPTkZJRykpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihMb2NhbGl6YXRpb25NZXNzYWdlcy5MT0dHSU5HX0FQUExJQ0FUSU9OX0lOSVRJQUxJWkVEKCkpLmFwcGVuZCgnXG4nKTsKKworICAgICAgICBmaW5hbCBMaXN0PFJlc291cmNlPiByb290UmVzb3VyY2VDbGFzc2VzID0gcmVzb3VyY2VCYWcuZ2V0Um9vdFJlc291cmNlcygpOworCisgICAgICAgIGlmICghcm9vdFJlc291cmNlQ2xhc3Nlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZChMb2NhbGl6YXRpb25NZXNzYWdlcy5MT0dHSU5HX1JPT1RfUkVTT1VSQ0VfQ0xBU1NFUygpKS5hcHBlbmQoIjoiKTsKKyAgICAgICAgICAgIGZvciAoZmluYWwgUmVzb3VyY2UgciA6IHJvb3RSZXNvdXJjZUNsYXNzZXMpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIENsYXNzIGNsYXp6IDogci5nZXRIYW5kbGVyQ2xhc3NlcygpKSB7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnXG4nKS5hcHBlbmQoIiAgIikuYXBwZW5kKGNsYXp6LmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc2IuYXBwZW5kKCdcbicpOworCisgICAgICAgIGZpbmFsIFNldDxNZXNzYWdlQm9keVJlYWRlcj4gbWVzc2FnZUJvZHlSZWFkZXJzOworICAgICAgICBmaW5hbCBTZXQ8TWVzc2FnZUJvZHlXcml0ZXI+IG1lc3NhZ2VCb2R5V3JpdGVyczsKKworICAgICAgICBpZiAoTE9HR0VSLmlzTG9nZ2FibGUoTGV2ZWwuRklORSkpIHsKKyAgICAgICAgICAgIFNwbGl0ZXJhdG9yPE1lc3NhZ2VCb2R5UmVhZGVyPiBtYnJTcGxpdGVyYXRvciA9CisgICAgICAgICAgICAgICAgICAgIFByb3ZpZGVycy5nZXRBbGxQcm92aWRlcnMoaW5qZWN0aW9uTWFuYWdlciwgTWVzc2FnZUJvZHlSZWFkZXIuY2xhc3MpLnNwbGl0ZXJhdG9yKCk7CisgICAgICAgICAgICBtZXNzYWdlQm9keVJlYWRlcnMgPSBTdHJlYW1TdXBwb3J0LnN0cmVhbShtYnJTcGxpdGVyYXRvciwgZmFsc2UpLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKTsKKworICAgICAgICAgICAgU3BsaXRlcmF0b3I8TWVzc2FnZUJvZHlXcml0ZXI+IG1id1NwbGl0ZXJhdG9yID0KKyAgICAgICAgICAgICAgICAgICAgUHJvdmlkZXJzLmdldEFsbFByb3ZpZGVycyhpbmplY3Rpb25NYW5hZ2VyLCBNZXNzYWdlQm9keVdyaXRlci5jbGFzcykuc3BsaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIG1lc3NhZ2VCb2R5V3JpdGVycyA9IFN0cmVhbVN1cHBvcnQuc3RyZWFtKG1id1NwbGl0ZXJhdG9yLCBmYWxzZSkuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVzc2FnZUJvZHlSZWFkZXJzID0gUHJvdmlkZXJzLmdldEN1c3RvbVByb3ZpZGVycyhpbmplY3Rpb25NYW5hZ2VyLCBNZXNzYWdlQm9keVJlYWRlci5jbGFzcyk7CisgICAgICAgICAgICBtZXNzYWdlQm9keVdyaXRlcnMgPSBQcm92aWRlcnMuZ2V0Q3VzdG9tUHJvdmlkZXJzKGluamVjdGlvbk1hbmFnZXIsIE1lc3NhZ2VCb2R5V3JpdGVyLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaW50UHJvdmlkZXJzKExvY2FsaXphdGlvbk1lc3NhZ2VzLkxPR0dJTkdfUFJFX01BVENIX0ZJTFRFUlMoKSwKKyAgICAgICAgICAgICAgICBwcm9jZXNzaW5nUHJvdmlkZXJzLmdldFByZU1hdGNoRmlsdGVycygpLCBzYik7CisgICAgICAgIHByaW50UHJvdmlkZXJzKExvY2FsaXphdGlvbk1lc3NhZ2VzLkxPR0dJTkdfR0xPQkFMX1JFUVVFU1RfRklMVEVSUygpLAorICAgICAgICAgICAgICAgIHByb2Nlc3NpbmdQcm92aWRlcnMuZ2V0R2xvYmFsUmVxdWVzdEZpbHRlcnMoKSwgc2IpOworICAgICAgICBwcmludFByb3ZpZGVycyhMb2NhbGl6YXRpb25NZXNzYWdlcy5MT0dHSU5HX0dMT0JBTF9SRVNQT05TRV9GSUxURVJTKCksCisgICAgICAgICAgICAgICAgcHJvY2Vzc2luZ1Byb3ZpZGVycy5nZXRHbG9iYWxSZXNwb25zZUZpbHRlcnMoKSwgc2IpOworICAgICAgICBwcmludFByb3ZpZGVycyhMb2NhbGl6YXRpb25NZXNzYWdlcy5MT0dHSU5HX0dMT0JBTF9SRUFERVJfSU5URVJDRVBUT1JTKCksCisgICAgICAgICAgICAgICAgcHJvY2Vzc2luZ1Byb3ZpZGVycy5nZXRHbG9iYWxSZWFkZXJJbnRlcmNlcHRvcnMoKSwgc2IpOworICAgICAgICBwcmludFByb3ZpZGVycyhMb2NhbGl6YXRpb25NZXNzYWdlcy5MT0dHSU5HX0dMT0JBTF9XUklURVJfSU5URVJDRVBUT1JTKCksCisgICAgICAgICAgICAgICAgcHJvY2Vzc2luZ1Byb3ZpZGVycy5nZXRHbG9iYWxXcml0ZXJJbnRlcmNlcHRvcnMoKSwgc2IpOworICAgICAgICBwcmludE5hbWVCb3VuZFByb3ZpZGVycyhMb2NhbGl6YXRpb25NZXNzYWdlcy5MT0dHSU5HX05BTUVfQk9VTkRfUkVRVUVTVF9GSUxURVJTKCksCisgICAgICAgICAgICAgICAgcHJvY2Vzc2luZ1Byb3ZpZGVycy5nZXROYW1lQm91bmRSZXF1ZXN0RmlsdGVycygpLCBzYik7CisgICAgICAgIHByaW50TmFtZUJvdW5kUHJvdmlkZXJzKExvY2FsaXphdGlvbk1lc3NhZ2VzLkxPR0dJTkdfTkFNRV9CT1VORF9SRVNQT05TRV9GSUxURVJTKCksCisgICAgICAgICAgICAgICAgcHJvY2Vzc2luZ1Byb3ZpZGVycy5nZXROYW1lQm91bmRSZXNwb25zZUZpbHRlcnMoKSwgc2IpOworICAgICAgICBwcmludE5hbWVCb3VuZFByb3ZpZGVycyhMb2NhbGl6YXRpb25NZXNzYWdlcy5MT0dHSU5HX05BTUVfQk9VTkRfUkVBREVSX0lOVEVSQ0VQVE9SUygpLAorICAgICAgICAgICAgICAgIHByb2Nlc3NpbmdQcm92aWRlcnMuZ2V0TmFtZUJvdW5kUmVhZGVySW50ZXJjZXB0b3JzKCksIHNiKTsKKyAgICAgICAgcHJpbnROYW1lQm91bmRQcm92aWRlcnMoTG9jYWxpemF0aW9uTWVzc2FnZXMuTE9HR0lOR19OQU1FX0JPVU5EX1dSSVRFUl9JTlRFUkNFUFRPUlMoKSwKKyAgICAgICAgICAgICAgICBwcm9jZXNzaW5nUHJvdmlkZXJzLmdldE5hbWVCb3VuZFdyaXRlckludGVyY2VwdG9ycygpLCBzYik7CisgICAgICAgIHByaW50UHJvdmlkZXJzKExvY2FsaXphdGlvbk1lc3NhZ2VzLkxPR0dJTkdfRFlOQU1JQ19GRUFUVVJFUygpLAorICAgICAgICAgICAgICAgIHByb2Nlc3NpbmdQcm92aWRlcnMuZ2V0RHluYW1pY0ZlYXR1cmVzKCksIHNiKTsKKyAgICAgICAgcHJpbnRQcm92aWRlcnMoTG9jYWxpemF0aW9uTWVzc2FnZXMuTE9HR0lOR19NRVNTQUdFX0JPRFlfUkVBREVSUygpLAorICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlQm9keVJlYWRlcnMuc3RyZWFtKCkubWFwKG5ldyBXb3JrZXJzVG9TdHJpbmdUcmFuc2Zvcm08PigpKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpLCBzYik7CisgICAgICAgIHByaW50UHJvdmlkZXJzKExvY2FsaXphdGlvbk1lc3NhZ2VzLkxPR0dJTkdfTUVTU0FHRV9CT0RZX1dSSVRFUlMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUJvZHlXcml0ZXJzLnN0cmVhbSgpLm1hcChuZXcgV29ya2Vyc1RvU3RyaW5nVHJhbnNmb3JtPD4oKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSwgc2IpOworCisgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuQ09ORklHLCBzYi50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBXb3JrZXJzVG9TdHJpbmdUcmFuc2Zvcm08VD4gaW1wbGVtZW50cyBGdW5jdGlvbjxULCBTdHJpbmc+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBhcHBseShmaW5hbCBUIHQpIHsKKyAgICAgICAgICAgIGlmICh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdC5nZXRDbGFzcygpLmdldE5hbWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgPFQ+IHZvaWQgcHJpbnROYW1lQm91bmRQcm92aWRlcnMoZmluYWwgU3RyaW5nIHRpdGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1hcDxDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4sIExpc3Q8UmFua2VkUHJvdmlkZXI8VD4+PiBwcm92aWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzYikgeworICAgICAgICBpZiAoIXByb3ZpZGVycy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCh0aXRsZSkuYXBwZW5kKCI6IikuYXBwZW5kKCdcbicpOworCisgICAgICAgICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4sIExpc3Q8UmFua2VkUHJvdmlkZXI8VD4+PiBlbnRyeSA6IHByb3ZpZGVycy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgZm9yIChmaW5hbCBSYW5rZWRQcm92aWRlciByYW5rZWRQcm92aWRlciA6IGVudHJ5LmdldFZhbHVlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgICAiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoTG9jYWxpemF0aW9uTWVzc2FnZXMuTE9HR0lOR19QUk9WSURFUl9CT1VORChyYW5rZWRQcm92aWRlciwgZW50cnkuZ2V0S2V5KCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJ1xuJyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgPFQ+IHZvaWQgcHJpbnRQcm92aWRlcnMoZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBJdGVyYWJsZTxUPiBwcm92aWRlcnMsIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IpIHsKKyAgICAgICAgZmluYWwgSXRlcmF0b3I8VD4gaXRlcmF0b3IgPSBwcm92aWRlcnMuaXRlcmF0b3IoKTsKKyAgICAgICAgYm9vbGVhbiBmaXJzdCA9IHRydWU7CisgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIGlmIChmaXJzdCkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCh0aXRsZSkuYXBwZW5kKCI6IikuYXBwZW5kKCdcbicpOworICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBUIHByb3ZpZGVyID0gaXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgc2IuYXBwZW5kKCIgICAiKS5hcHBlbmQocHJvdmlkZXIpLmFwcGVuZCgnXG4nKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEludm9rZXMgYSByZXF1ZXN0IGFuZCByZXR1cm5zIHRoZSB7QGxpbmsgRnV0dXJlIHJlc3BvbnNlIGZ1dHVyZX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdENvbnRleHQgcmVxdWVzdCBkYXRhLgorICAgICAqIEByZXR1cm4gcmVzcG9uc2UgZnV0dXJlLgorICAgICAqLworICAgIHB1YmxpYyBGdXR1cmU8Q29udGFpbmVyUmVzcG9uc2U+IGFwcGx5KGZpbmFsIENvbnRhaW5lclJlcXVlc3QgcmVxdWVzdENvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5KHJlcXVlc3RDb250ZXh0LCBuZXcgTnVsbE91dHB1dFN0cmVhbSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZva2VzIGEgcmVxdWVzdCBhbmQgcmV0dXJucyB0aGUge0BsaW5rIEZ1dHVyZSByZXNwb25zZSBmdXR1cmV9LgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgICAgICByZXF1ZXN0IGRhdGEuCisgICAgICogQHBhcmFtIG91dHB1dFN0cmVhbSByZXNwb25zZSBvdXRwdXQgc3RyZWFtLgorICAgICAqIEByZXR1cm4gcmVzcG9uc2UgZnV0dXJlLgorICAgICAqLworICAgIHB1YmxpYyBGdXR1cmU8Q29udGFpbmVyUmVzcG9uc2U+IGFwcGx5KGZpbmFsIENvbnRhaW5lclJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKSB7CisgICAgICAgIGZpbmFsIEZ1dHVyZVJlc3BvbnNlV3JpdGVyIHJlc3BvbnNlRnV0dXJlID0KKyAgICAgICAgICAgICAgICBuZXcgRnV0dXJlUmVzcG9uc2VXcml0ZXIocmVxdWVzdC5nZXRNZXRob2QoKSwgb3V0cHV0U3RyZWFtLCBydW50aW1lLmdldEJhY2tncm91bmRTY2hlZHVsZXIoKSk7CisKKyAgICAgICAgaWYgKHJlcXVlc3QuZ2V0U2VjdXJpdHlDb250ZXh0KCkgPT0gbnVsbCkgeworICAgICAgICAgICAgcmVxdWVzdC5zZXRTZWN1cml0eUNvbnRleHQoREVGQVVMVF9TRUNVUklUWV9DT05URVhUKTsKKyAgICAgICAgfQorICAgICAgICByZXF1ZXN0LnNldFdyaXRlcihyZXNwb25zZUZ1dHVyZSk7CisKKyAgICAgICAgaGFuZGxlKHJlcXVlc3QpOworCisgICAgICAgIHJldHVybiByZXNwb25zZUZ1dHVyZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBGdXR1cmVSZXNwb25zZVdyaXRlciBleHRlbmRzIENvbXBsZXRhYmxlRnV0dXJlPENvbnRhaW5lclJlc3BvbnNlPiBpbXBsZW1lbnRzIENvbnRhaW5lclJlc3BvbnNlV3JpdGVyIHsKKworICAgICAgICBwcml2YXRlIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gbnVsbDsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyByZXF1ZXN0TWV0aG9kTmFtZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtOworCisgICAgICAgIHByaXZhdGUgZmluYWwgSmVyc2V5UmVxdWVzdFRpbWVvdXRIYW5kbGVyIHJlcXVlc3RUaW1lb3V0SGFuZGxlcjsKKworICAgICAgICBwcml2YXRlIEZ1dHVyZVJlc3BvbnNlV3JpdGVyKGZpbmFsIFN0cmluZyByZXF1ZXN0TWV0aG9kTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSBiYWNrZ3JvdW5kU2NoZWR1bGVyKSB7CisgICAgICAgICAgICB0aGlzLnJlcXVlc3RNZXRob2ROYW1lID0gcmVxdWVzdE1ldGhvZE5hbWU7CisgICAgICAgICAgICB0aGlzLm91dHB1dFN0cmVhbSA9IG91dHB1dFN0cmVhbTsKKyAgICAgICAgICAgIHRoaXMucmVxdWVzdFRpbWVvdXRIYW5kbGVyID0gbmV3IEplcnNleVJlcXVlc3RUaW1lb3V0SGFuZGxlcih0aGlzLCBiYWNrZ3JvdW5kU2NoZWR1bGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIHdyaXRlUmVzcG9uc2VTdGF0dXNBbmRIZWFkZXJzKGZpbmFsIGxvbmcgY29udGVudExlbmd0aCwgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTsKKworICAgICAgICAgICAgaWYgKGNvbnRlbnRMZW5ndGggPj0gMCkgeworICAgICAgICAgICAgICAgIHJlc3BvbnNlLmdldEhlYWRlcnMoKS5wdXRTaW5nbGUoSHR0cEhlYWRlcnMuQ09OVEVOVF9MRU5HVEgsIExvbmcudG9TdHJpbmcoY29udGVudExlbmd0aCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gb3V0cHV0U3RyZWFtOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHN1c3BlbmQoZmluYWwgbG9uZyB0aW1lLCBmaW5hbCBUaW1lVW5pdCB1bml0LCBmaW5hbCBUaW1lb3V0SGFuZGxlciBoYW5kbGVyKSB7CisgICAgICAgICAgICByZXR1cm4gcmVxdWVzdFRpbWVvdXRIYW5kbGVyLnN1c3BlbmQodGltZSwgdW5pdCwgaGFuZGxlcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0U3VzcGVuZFRpbWVvdXQoZmluYWwgbG9uZyB0aW1lLCBmaW5hbCBUaW1lVW5pdCB1bml0KSB7CisgICAgICAgICAgICByZXF1ZXN0VGltZW91dEhhbmRsZXIuc2V0U3VzcGVuZFRpbWVvdXQodGltZSwgdW5pdCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY29tbWl0KCkgeworICAgICAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgY3VycmVudCA9IHJlc3BvbnNlOworICAgICAgICAgICAgaWYgKGN1cnJlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChIdHRwTWV0aG9kLkhFQUQuZXF1YWxzKHJlcXVlc3RNZXRob2ROYW1lKSAmJiBjdXJyZW50Lmhhc0VudGl0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGZvciB0ZXN0aW5nIHB1cnBvc2VzOgorICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGFsc28gc3RyaXAgdGhlIG9iamVjdCBlbnRpdHkgYXMgaXQgd2FzIHN0cmlwcGVkIHdoZW4gd3JpdGluZyB0byBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudC5zZXRFbnRpdHkobnVsbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlcXVlc3RUaW1lb3V0SGFuZGxlci5jbG9zZSgpOworICAgICAgICAgICAgICAgIHN1cGVyLmNvbXBsZXRlKGN1cnJlbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZhaWx1cmUoZmluYWwgVGhyb3dhYmxlIGVycm9yKSB7CisgICAgICAgICAgICByZXF1ZXN0VGltZW91dEhhbmRsZXIuY2xvc2UoKTsKKyAgICAgICAgICAgIHN1cGVyLmNvbXBsZXRlRXhjZXB0aW9uYWxseShlcnJvcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZW5hYmxlUmVzcG9uc2VCdWZmZXJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBtYWluIHJlcXVlc3QvcmVzcG9uc2UgcHJvY2Vzc2luZyBlbnRyeSBwb2ludCBmb3IgSmVyc2V5IGNvbnRhaW5lciBpbXBsZW1lbnRhdGlvbnMuCisgICAgICogPHA+CisgICAgICogVGhlIG1ldGhvZCBpbnZva2VzIHRoZSByZXF1ZXN0IHByb2Nlc3Npbmcgb2YgdGhlIHByb3ZpZGVkCisgICAgICoge0BsaW5rIENvbnRhaW5lclJlcXVlc3QgY29udGFpbmVyIHJlcXVlc3QgY29udGV4dH0gYW5kIHVzZXMgdGhlCisgICAgICoge0BsaW5rIENvbnRhaW5lclJlc3BvbnNlV3JpdGVyIGNvbnRhaW5lciByZXNwb25zZSB3cml0ZXJ9IHRvIHN1c3BlbmQgJiByZXN1bWUgdGhlIHByb2Nlc3NpbmcKKyAgICAgKiBhcyB3ZWxsIGFzIHdyaXRlIHRoZSByZXNwb25zZSBiYWNrIHRvIHRoZSBjb250YWluZXIuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSB0aGUge0BsaW5rIFNlY3VyaXR5Q29udGV4dCBzZWN1cml0eSBjb250ZXh0fSBzdG9yZWQgaW4gdGhlIGNvbnRhaW5lciByZXF1ZXN0IGNvbnRleHQKKyAgICAgKiBpcyBib3VuZCBhcyBhbiBpbmplY3RhYmxlIGluc3RhbmNlIGluIHRoZSBzY29wZSBvZiB0aGUgcHJvY2Vzc2VkIHJlcXVlc3QgY29udGV4dC4KKyAgICAgKiBBbHNvLCBhbnkge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuUmVxdWVzdFNjb3BlZEluaXRpYWxpemVyIGN1c3RvbSBzY29wZSBpbmplY3Rpb25zfQorICAgICAqIGFyZSBpbml0aWFsaXplZCBpbiB0aGUgY3VycmVudCByZXF1ZXN0IHNjb3BlLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IGNvbnRhaW5lciByZXF1ZXN0IGNvbnRleHQgb2YgdGhlIGN1cnJlbnQgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBoYW5kbGUoZmluYWwgQ29udGFpbmVyUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIHJlcXVlc3Quc2V0V29ya2Vycyhtc2dCb2R5V29ya2Vycyk7CisgICAgICAgIHJ1bnRpbWUucHJvY2VzcyhyZXF1ZXN0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHtAbGluayBJbmplY3Rpb25NYW5hZ2VyfSByZWxldmFudCB0byBjdXJyZW50IGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiB7QGxpbmsgSW5qZWN0aW9uTWFuYWdlcn0gaW5zdGFuY2UuCisgICAgICogQHNpbmNlIDIuMjYKKyAgICAgKi8KKyAgICBwdWJsaWMgSW5qZWN0aW9uTWFuYWdlciBnZXRJbmplY3Rpb25NYW5hZ2VyKCkgeworICAgICAgICByZXR1cm4gaW5qZWN0aW9uTWFuYWdlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24uCisgICAgICovCisgICAgcHVibGljIFJlc291cmNlQ29uZmlnIGdldENvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBydW50aW1lQ29uZmlnOworICAgIH0KKworICAgIC8vIEFnZ3JlZ2F0ZSBjb250YWluZXIgbGlmZWN5Y2xlIGxpc3RlbmVyIGltcGxlbWVudGF0aW9uCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblN0YXJ0dXAoZmluYWwgQ29udGFpbmVyIGNvbnRhaW5lcikgeworICAgICAgICBmb3IgKGZpbmFsIENvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyIGxpc3RlbmVyIDogY29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXJzKSB7CisgICAgICAgICAgICBsaXN0ZW5lci5vblN0YXJ0dXAoY29udGFpbmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uUmVsb2FkKGZpbmFsIENvbnRhaW5lciBjb250YWluZXIpIHsKKyAgICAgICAgZm9yIChmaW5hbCBDb250YWluZXJMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lciA6IGNvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVycykgeworICAgICAgICAgICAgbGlzdGVuZXIub25SZWxvYWQoY29udGFpbmVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU2h1dGRvd24oZmluYWwgQ29udGFpbmVyIGNvbnRhaW5lcikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZm9yIChmaW5hbCBDb250YWluZXJMaWZlY3ljbGVMaXN0ZW5lciBsaXN0ZW5lciA6IGNvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVycykgeworICAgICAgICAgICAgICAgIGxpc3RlbmVyLm9uU2h1dGRvd24oY29udGFpbmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gQ2FsbCBAUHJlRGVzdHJveSBtZXRob2Qgb24gQXBwbGljYXRpb24uCisgICAgICAgICAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5wcmVEZXN0cm95KFJlc291cmNlQ29uZmlnLnVud3JhcEFwcGxpY2F0aW9uKGFwcGxpY2F0aW9uKSk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIC8vIFNodXRkb3duIFNlcnZpY2VMb2NhdG9yLgorICAgICAgICAgICAgICAgIC8vIFRha2VzIGNhcmUgb2YgdGhlIGluamVjdGVkIGV4ZWN1dG9ycyAmIHNjaGVkdWxlcnMgc2h1dC1kb3duIHRvby4KKyAgICAgICAgICAgICAgICBtYW5hZ2VkT2JqZWN0c0ZpbmFsaXplci5wcmVEZXN0cm95KCk7CisgICAgICAgICAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5zaHV0ZG93bigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvQXN5bmNDb250ZXh0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9Bc3luY0NvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWRiNDUyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvQXN5bmNDb250ZXh0LmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQXN5bmNSZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5Qcm9kdWNlcjsKKworLyoqCisgKiBJbmplY3RhYmxlIGFzeW5jaHJvbm91cyBwcm9jZXNzaW5nIGNvbnRleHQgdGhhdCBjYW4gYmUgdXNlZCB0byBjb250cm9sIHZhcmlvdXMgYXNwZWN0cworICogb2YgYXN5bmNocm9ub3VzIHByb2Nlc3Npbmcgb2YgYSBzaW5nbGUgcmVxdWVzdC4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgaW50ZXJmYWNlIEFzeW5jQ29udGV4dCBleHRlbmRzIEFzeW5jUmVzcG9uc2UgeworCisgICAgLyoqCisgICAgICogQXN5bmNocm9ub3VzIHByb2Nlc3NpbmcgY29udGV4dCBzdGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGVudW0gU3RhdGUgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbmRpY2F0ZXMgdGhlIGFzeW5jaHJvbm91cyBwcm9jZXNzaW5nIGNvbnRleHQgaXMgcnVubmluZy4gVGhpcyBpcyBhIGRlZmF1bHQgc3RhdGUKKyAgICAgICAgICogdGhlIHByb2Nlc3NpbmcgY29udGV4dCBpcyBpbiBjYXNlIHRoZSBwcm9jZXNzaW5nIGV4ZWN1dGlvbiBmbG93IGhhcyBub3QgYmVlbiBleHBsaWNpdGx5CisgICAgICAgICAqIG1vZGlmaWVkICh5ZXQpLgorICAgICAgICAgKi8KKyAgICAgICAgUlVOTklORywKKyAgICAgICAgLyoqCisgICAgICAgICAqIEluZGljYXRlcyB0aGUgYXN5bmNocm9ub3VzIHByb2Nlc3NpbmcgY29udGV4dCBoYXMgYmVlbiBzdXNwZW5kZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBzZWUgQXN5bmNDb250ZXh0I3N1c3BlbmQoKQorICAgICAgICAgKi8KKyAgICAgICAgU1VTUEVOREVELAorICAgICAgICAvKioKKyAgICAgICAgICogSW5kaWNhdGVzIHRoZSBhc3luY2hyb25vdXMgcHJvY2Vzc2luZyBjb250ZXh0IGhhcyBiZWVuIHJlc3VtZWQuCisgICAgICAgICAqLworICAgICAgICBSRVNVTUVELAorICAgICAgICAvKioKKyAgICAgICAgICogSW5kaWNhdGVzIHRoZSBwcm9jZXNzaW5nIHJlcHJlc2VudGVkIGJ5IHRoaXMgYXN5bmNocm9ub3VzIHByb2Nlc3NpbmcgY29udGV4dAorICAgICAgICAgKiBoYXMgYmVlbiBjb21wbGV0ZWQuCisgICAgICAgICAqLworICAgICAgICBDT01QTEVURUQsCisgICAgfQorCisgICAgLyoqCisgICAgICogU3VzcGVuZCB0aGUgY3VycmVudCBhc3luY2hyb25vdXMgcHJvY2Vzc2luZyBjb250ZXh0LgorICAgICAqCisgICAgICogVGhlIG1ldGhvZCByZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGUgY29udGV4dCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgc3VzcGVuZGVkLAorICAgICAqIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHJlcXVlc3QgcHJvY2Vzc2luZyBoYXMgYmVlbiBzdXNwZW5kZWQgc3VjY2Vzc2Z1bGx5IHN1c3BlbmRlZCwKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHN1c3BlbmQoKTsKKworICAgIC8qKgorICAgICAqIEludm9rZSB0aGUgcHJvdmlkZWQgcmVzcG9uc2UgcHJvZHVjZXIgaW4gYSBKZXJzZXktbWFuYWdlZCBhc3luY2hyb25vdXMgdGhyZWFkLgorICAgICAqCisgICAgICogQHBhcmFtIHByb2R1Y2VyIHJlc3BvbnNlIHByb2R1Y2VyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGludm9rZU1hbmFnZWQoUHJvZHVjZXI8UmVzcG9uc2U+IHByb2R1Y2VyKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL0JhY2tncm91bmRTY2hlZHVsZXIuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL0JhY2tncm91bmRTY2hlZHVsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGRjMmI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvQmFja2dyb3VuZFNjaGVkdWxlci5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworaW1wb3J0IGphdmF4LmluamVjdC5RdWFsaWZpZXI7CisKKy8qKgorICogSW5qZWN0aW9uIHF1YWxpZmllciB0aGF0IGNhbiBiZSB1c2VkIHRvIGluamVjdCBhIHtAbGluayBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRFeGVjdXRvclNlcnZpY2V9CisgKiBpbnN0YW5jZSB1c2VkIGJ5IEplcnNleSB0byBleGVjdXRlIGJhY2tncm91bmQgdGltZWQvc2NoZWR1bGVkIHRhc2tzLgorICogPHA+CisgKiBBIHNjaGVkdWxlZCBleGVjdXRvciBzZXJ2aWNlIGluc3RhbmNlIGluamVjdGVkIHVzaW5nIHRoaXMgaW5qZWN0aW9uIHF1YWxpZmllciBjYW4gYmUgY3VzdG9taXplZCBieSByZWdpc3RlcmluZworICogYSBjdXN0b20ge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5TY2hlZHVsZWRFeGVjdXRvclNlcnZpY2VQcm92aWRlcn0gaW1wbGVtZW50YXRpb24gdGhhdCBpcyBpdHNlbGYgYW5ub3RhdGVkCisgKiB3aXRoIHRoZSB7QGNvZGUgJiM2NDtCYWNrZ3JvdW5kU2NoZWR1bGVyfSBhbm5vdGF0aW9uLgorICogPC9wPgorICogPHA+CisgKiBUeXBpY2FsbHksIHdoZW4gZmFjaW5nIGEgbmVlZCB0byBleGVjdXRlIGEgc2NoZWR1bGVkIGJhY2tncm91bmQgdGFzaywgeW91IHdvdWxkIGJlIGNyZWF0aW5nIGEgbmV3CisgKiBzdGFuZGFsb25lIGV4ZWN1dG9yIHNlcnZpY2UgdGhhdCB3b3VsZCBiZSB1c2luZyBhIG5ldyBzdGFuZGFsb25lIHRocmVhZCBwb29sLiBUaGlzIHdvdWxkIGhvd2V2ZXIgYnJlYWsKKyAqIHRoZSBhYmlsaXR5IG9mIEplcnNleSB0byBydW4gaW4gZW52aXJvbm1lbnRzIHRoYXQgaGF2ZSBzcGVjaWZpYyB0aHJlYWQgbWFuYWdlbWVudCBhbmQgcHJvdmlzaW9uaW5nCisgKiByZXF1aXJlbWVudHMuIEluIG9yZGVyIHRvIHNpbXBsaWZ5IGFuZCB1bmlmeSBwcm9ncmFtbWluZyBtb2RlbCBmb3Igc2NoZWR1bGluZyBiYWNrZ3JvdW5kIHRhc2tzIGluCisgKiBKZXJzZXkgcnVudGltZSwgSmVyc2V5IHByb3ZpZGVzIGFuIHRoaXMgcXVhbGlmaWVyIHRvIGluamVjdCBhIGNvbW1vbiwgdGFzayBzY2hlZHVsZXIgdGhhdCBpcyBwcm9wZXJseQorICogY29uZmlndXJlZCB0byBzdXBwb3J0IGN1c3RvbWl6YWJsZSBydW50aW1lIHRocmVhZCAuCisgKiA8L3A+CisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqIEBzZWUgQmFja2dyb3VuZFNjaGVkdWxlckxpdGVyYWwKKyAqIEBzaW5jZSAyLjE4CisgKi8KK0BUYXJnZXQoe0VsZW1lbnRUeXBlLlBBUkFNRVRFUiwgRWxlbWVudFR5cGUuRklFTEQsIEVsZW1lbnRUeXBlLk1FVEhPRCwgRWxlbWVudFR5cGUuVFlQRX0pCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorQERvY3VtZW50ZWQKK0BRdWFsaWZpZXIKK3B1YmxpYyBAaW50ZXJmYWNlIEJhY2tncm91bmRTY2hlZHVsZXIgeworCit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9CYWNrZ3JvdW5kU2NoZWR1bGVyTGl0ZXJhbC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvQmFja2dyb3VuZFNjaGVkdWxlckxpdGVyYWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzI1MjRlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvQmFja2dyb3VuZFNjaGVkdWxlckxpdGVyYWwuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5Bbm5vdGF0aW9uTGl0ZXJhbDsKKworLyoqCisgKiB7QGxpbmsgQmFja2dyb3VuZFNjaGVkdWxlcn0gYW5ub3RhdGlvbiBsaXRlcmFsLgorICogPHA+CisgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEge0BsaW5rICNJTlNUQU5DRSBjb25zdGFudCBpbnN0YW5jZX0gb2YgdGhlIHtAY29kZSBAQmFja2dyb3VuZFNjaGVkdWxlcn0gYW5ub3RhdGlvbiB0byBiZSB1c2VkCisgKiBpbiBtZXRob2QgY2FsbHMgdGhhdCByZXF1aXJlIHVzZSBvZiBhbm5vdGF0aW9uIGluc3RhbmNlcy4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICogQHNpbmNlIDIuMTgKKyAqLworQFN1cHByZXNzV2FybmluZ3MoIkNsYXNzRXhwbGljaXRseUFubm90YXRpb24iKQorcHVibGljIGZpbmFsIGNsYXNzIEJhY2tncm91bmRTY2hlZHVsZXJMaXRlcmFsIGV4dGVuZHMgQW5ub3RhdGlvbkxpdGVyYWw8QmFja2dyb3VuZFNjaGVkdWxlcj4gaW1wbGVtZW50cyBCYWNrZ3JvdW5kU2NoZWR1bGVyIHsKKworICAgIC8qKgorICAgICAqIHtAY29kZSBCYWNrZ3JvdW5kU2NoZWR1bGVyfSBhbm5vdGF0aW9uIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQmFja2dyb3VuZFNjaGVkdWxlciBJTlNUQU5DRSA9IG5ldyBCYWNrZ3JvdW5kU2NoZWR1bGVyTGl0ZXJhbCgpOworCisgICAgcHJpdmF0ZSBCYWNrZ3JvdW5kU2NoZWR1bGVyTGl0ZXJhbCgpIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9Ccm9hZGNhc3Rlci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvQnJvYWRjYXN0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzkyNDRhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvQnJvYWRjYXN0ZXIuamF2YQpAQCAtMCwwICsxLDIyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TGlua2VkUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29weU9uV3JpdGVBcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworCisvKioKKyAqIFVzZWQgZm9yIGJyb2FkY2FzdGluZyByZXNwb25zZSBjaHVua3MgdG8gbXVsdGlwbGUge0BsaW5rIENodW5rZWRPdXRwdXR9IGluc3RhbmNlcy4KKyAqCisgKiBAcGFyYW0gPFQ+IGJyb2FkY2FzdCB0eXBlLgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitwdWJsaWMgY2xhc3MgQnJvYWRjYXN0ZXI8VD4gaW1wbGVtZW50cyBCcm9hZGNhc3Rlckxpc3RlbmVyPFQ+IHsKKyAgICAvLyBXZSBkbyBub3QgZXhwZWN0IGxhcmdlIGFtb3VudHMgb2YgYnJvYWRjYXN0ZXIgbGlzdGVuZXJzIGFkZGl0aW9ucy9yZW1vdmFscywgYnV0IGxhcmdlIGFtb3VudHMgb2YgdHJhdmVyc2Fscy4KKyAgICBwcml2YXRlIGZpbmFsIENvcHlPbldyaXRlQXJyYXlMaXN0PEJyb2FkY2FzdGVyTGlzdGVuZXI8VD4+IGxpc3RlbmVycyA9CisgICAgICAgICAgICBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3Q8QnJvYWRjYXN0ZXJMaXN0ZW5lcjxUPj4oKTsKKworICAgIHByaXZhdGUgZmluYWwgQ29uY3VycmVudExpbmtlZFF1ZXVlPENodW5rZWRPdXRwdXQ8VD4+IGNodW5rZWRPdXRwdXRzID0KKyAgICAgICAgICAgIG5ldyBDb25jdXJyZW50TGlua2VkUXVldWU8Q2h1bmtlZE91dHB1dDxUPj4oKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UuCisgICAgICogSWYgdGhpcyBjb25zdHJ1Y3RvciBpcyBjYWxsZWQgYnkgYSBzdWJjbGFzcywgaXQgYXNzdW1lcyB0aGUgdGhlIHJlYXNvbiBmb3IgdGhlIHN1YmNsYXNzIHRvIGV4aXN0IGlzIHRvIGltcGxlbWVudAorICAgICAqIHtAbGluayAjb25DbG9zZShDaHVua2VkT3V0cHV0KX0gYW5kIHtAbGluayAjb25FeGNlcHRpb24oQ2h1bmtlZE91dHB1dCwgRXhjZXB0aW9uKX0gbWV0aG9kcywgc28gaXQgYWRkcworICAgICAqIHRoZSBuZXdseSBjcmVhdGVkIGluc3RhbmNlIGFzIHRoZSBsaXN0ZW5lci4gVG8gYXZvaWQgdGhpcywgc3ViY2xhc3NlcyBtYXkgY2FsbCB7QGxpbmsgI0Jyb2FkY2FzdGVyKENsYXNzKX0KKyAgICAgKiBwYXNzaW5nIHRoZWlyIGNsYXNzIGFzIGFuIGFyZ3VtZW50LgorICAgICAqLworICAgIHB1YmxpYyBCcm9hZGNhc3RlcigpIHsKKyAgICAgICAgdGhpcyhCcm9hZGNhc3Rlci5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FuIGJlIHVzZWQgYnkgc3ViY2xhc3NlcyB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBmdW5jdGlvbmFsaXR5IG9mIGFkZGluZyBzZWxmIHRvIHRoZSBzZXQgb2YKKyAgICAgKiB7QGxpbmsgQnJvYWRjYXN0ZXJMaXN0ZW5lciBsaXN0ZW5lcnN9LiBJZiBjcmVhdGluZyBhIGRpcmVjdCBpbnN0YW5jZSBvZiBhIHN1YmNsYXNzIHBhc3NlZCBpbiB0aGUgcGFyYW1ldGVyLAorICAgICAqIHRoZSBicm9hZGNhc3RlciB3aWxsIG5vdCByZWdpc3RlciBpdHNlbGYgYXMgYSBsaXN0ZW5lci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdWJjbGFzcyBzdWJjbGFzcyBvZiBCcm9hZGNhc3RlciB0aGF0IHNob3VsZCBub3QgYmUgcmVnaXN0ZXJlZCBhcyBhIGxpc3RlbmVyIC0gaWYgY3JlYXRpbmcgYSBkaXJlY3QgaW5zdGFuY2UKKyAgICAgKiAgICAgICAgICAgICAgICAgb2YgdGhpcyBzdWJjbGFzcywgdGhpcyBjb25zdHJ1Y3RvciB3aWxsIG5vdCByZWdpc3RlciB0aGUgbmV3IGluc3RhbmNlIGFzIGEgbGlzdGVuZXIuCisgICAgICogQHNlZSAjQnJvYWRjYXN0ZXIoKQorICAgICAqLworICAgIHByb3RlY3RlZCBCcm9hZGNhc3RlcihmaW5hbCBDbGFzczw/IGV4dGVuZHMgQnJvYWRjYXN0ZXI+IHN1YmNsYXNzKSB7CisgICAgICAgIGlmIChzdWJjbGFzcyAhPSBnZXRDbGFzcygpKSB7CisgICAgICAgICAgICBsaXN0ZW5lcnMuYWRkKHRoaXMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIge0BsaW5rIENodW5rZWRPdXRwdXR9IHRvIHRoaXMge0Bjb2RlIEJyb2FkY2FzdGVyfSBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjaHVua2VkT3V0cHV0IHtAbGluayBDaHVua2VkT3V0cHV0fSB0byByZWdpc3Rlci4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgaW5zdGFuY2Ugd2FzIHN1Y2Nlc3NmdWxseSByZWdpc3RlcmVkLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgPE9VVCBleHRlbmRzIENodW5rZWRPdXRwdXQ8VD4+IGJvb2xlYW4gYWRkKGZpbmFsIE9VVCBjaHVua2VkT3V0cHV0KSB7CisgICAgICAgIHJldHVybiBjaHVua2VkT3V0cHV0cy5vZmZlcihjaHVua2VkT3V0cHV0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVbi1yZWdpc3RlciB7QGxpbmsgQ2h1bmtlZE91dHB1dH0gZnJvbSB0aGlzIHtAY29kZSBCcm9hZGNhc3Rlcn0gaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBjbG9zZSB0aGUge0BsaW5rIENodW5rZWRPdXRwdXR9IGJlaW5nIHVucmVnaXN0ZXJlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjaHVua2VkT3V0cHV0IHtAbGluayBDaHVua2VkT3V0cHV0fSBpbnN0YW5jZSB0byB1bi1yZWdpc3RlciBmcm9tIHRoaXMgYnJvYWRjYXN0ZXIuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGluc3RhbmNlIHdhcyB1bnJlZ2lzdGVyZWQsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyA8T1VUIGV4dGVuZHMgQ2h1bmtlZE91dHB1dDxUPj4gYm9vbGVhbiByZW1vdmUoZmluYWwgT1VUIGNodW5rZWRPdXRwdXQpIHsKKyAgICAgICAgcmV0dXJuIGNodW5rZWRPdXRwdXRzLnJlbW92ZShjaHVua2VkT3V0cHV0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciB7QGxpbmsgQnJvYWRjYXN0ZXJMaXN0ZW5lcn0gZm9yIHtAY29kZSBCcm9hZGNhc3Rlcn0gZXZlbnRzIGxpc3RlbmluZy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG9wZXJhdGlvbiBpcyBwb3RlbnRpYWxseSBzbG93LCBlc3BlY2lhbGx5IGlmIGxhcmdlIG51bWJlciBvZiBsaXN0ZW5lcnMgZ2V0IHJlZ2lzdGVyZWQgaW4gdGhlIGJyb2FkY2FzdGVyLgorICAgICAqIFRoZSB7QGNvZGUgQnJvYWRjYXN0ZXJ9IGltcGxlbWVudGF0aW9uIGlzIG9wdGltaXplZCB0byBlZmZpY2llbnRseSBoYW5kbGUgc21hbGwgYW1vdW50cyBvZgorICAgICAqIGNvbmN1cnJlbnQgbGlzdGVuZXIgcmVnaXN0cmF0aW9ucyBhbmQgcmVtb3ZhbHMgYW5kIGxhcmdlIGFtb3VudHMgb2YgcmVnaXN0ZXJlZCBsaXN0ZW5lciBub3RpZmljYXRpb25zLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciBsaXN0ZW5lciB0byBiZSByZWdpc3RlcmVkLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHJlZ2lzdGVyZWQsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGFkZChmaW5hbCBCcm9hZGNhc3Rlckxpc3RlbmVyPFQ+IGxpc3RlbmVyKSB7CisgICAgICAgIHJldHVybiBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVbi1yZWdpc3RlciB7QGxpbmsgQnJvYWRjYXN0ZXJMaXN0ZW5lcn0uCisgICAgICogPHA+CisgICAgICogVGhpcyBvcGVyYXRpb24gaXMgcG90ZW50aWFsbHkgc2xvdywgZXNwZWNpYWxseSBpZiBsYXJnZSBudW1iZXIgb2YgbGlzdGVuZXJzIGdldCByZWdpc3RlcmVkIGluIHRoZSBicm9hZGNhc3Rlci4KKyAgICAgKiBUaGUge0Bjb2RlIEJyb2FkY2FzdGVyfSBpbXBsZW1lbnRhdGlvbiBpcyBvcHRpbWl6ZWQgdG8gZWZmaWNpZW50bHkgaGFuZGxlIHNtYWxsIGFtb3VudHMgb2YKKyAgICAgKiBjb25jdXJyZW50IGxpc3RlbmVyIHJlZ2lzdHJhdGlvbnMgYW5kIHJlbW92YWxzIGFuZCBsYXJnZSBhbW91bnRzIG9mIHJlZ2lzdGVyZWQgbGlzdGVuZXIgbm90aWZpY2F0aW9ucy4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgbGlzdGVuZXIgdG8gYmUgdW5yZWdpc3RlcmVkLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHVucmVnaXN0ZXJlZCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKGZpbmFsIEJyb2FkY2FzdGVyTGlzdGVuZXI8VD4gbGlzdGVuZXIpIHsKKyAgICAgICAgcmV0dXJuIGxpc3RlbmVycy5yZW1vdmUobGlzdGVuZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJyb2FkY2FzdCBhIGNodW5rIHRvIGFsbCByZWdpc3RlcmVkIHtAbGluayBDaHVua2VkT3V0cHV0fSBpbnN0YW5jZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2h1bmsgY2h1bmsgdG8gYmUgc2VudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBicm9hZGNhc3QoZmluYWwgVCBjaHVuaykgeworICAgICAgICBmb3JFYWNoT3V0cHV0KG5ldyBUYXNrPENodW5rZWRPdXRwdXQ8VD4+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oZmluYWwgQ2h1bmtlZE91dHB1dDxUPiBjcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBjci53cml0ZShjaHVuayk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlIGFsbCByZWdpc3RlcmVkIHtAbGluayBDaHVua2VkT3V0cHV0fSBpbnN0YW5jZXMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2VBbGwoKSB7CisgICAgICAgIGZvckVhY2hPdXRwdXQobmV3IFRhc2s8Q2h1bmtlZE91dHB1dDxUPj4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bihmaW5hbCBDaHVua2VkT3V0cHV0PFQ+IGNyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIGNyLmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKgorICAgICAqIENhbiBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzIHRvIGhhbmRsZSB0aGUgZXZlbnQgb2YgZXhjZXB0aW9uIHRocm93biBmcm9tIGEgcGFydGljdWxhciB7QGxpbmsgQ2h1bmtlZE91dHB1dH0KKyAgICAgKiBpbnN0YW5jZSB3aGVuIHRyeWluZyB0byB3cml0ZSB0byBpdCBvciBjbG9zZSBpdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjaHVua2VkT3V0cHV0IGluc3RhbmNlIHRoYXQgdGhyZXcgZXhjZXB0aW9uLgorICAgICAqIEBwYXJhbSBleGNlcHRpb24gICAgIGV4Y2VwdGlvbiB0aGF0IHdhcyB0aHJvd24uCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25FeGNlcHRpb24oZmluYWwgQ2h1bmtlZE91dHB1dDxUPiBjaHVua2VkT3V0cHV0LCBmaW5hbCBFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqCisgICAgICogQ2FuIGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMgdG8gaGFuZGxlIHRoZSBldmVudCBvZiB7QGxpbmsgQ2h1bmtlZE91dHB1dH0gYmVpbmcgY2xvc2VkLgorICAgICAqCisgICAgICogQHBhcmFtIGNodW5rZWRPdXRwdXQgaW5zdGFuY2UgdGhhdCB3YXMgY2xvc2VkLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ2xvc2UoZmluYWwgQ2h1bmtlZE91dHB1dDxUPiBjaHVua2VkT3V0cHV0KSB7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50ZXJmYWNlIFRhc2s8VD4geworICAgICAgICB2b2lkIHJ1bihUIHBhcmFtZXRlcikgdGhyb3dzIElPRXhjZXB0aW9uOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBmb3JFYWNoT3V0cHV0KGZpbmFsIFRhc2s8Q2h1bmtlZE91dHB1dDxUPj4gdCkgeworICAgICAgICBmb3IgKEl0ZXJhdG9yPENodW5rZWRPdXRwdXQ8VD4+IGl0ZXJhdG9yID0gY2h1bmtlZE91dHB1dHMuaXRlcmF0b3IoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOyApIHsKKyAgICAgICAgICAgIENodW5rZWRPdXRwdXQ8VD4gY2h1bmtlZE91dHB1dCA9IGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgIGlmICghY2h1bmtlZE91dHB1dC5pc0Nsb3NlZCgpKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgdC5ydW4oY2h1bmtlZE91dHB1dCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyZU9uRXhjZXB0aW9uKGNodW5rZWRPdXRwdXQsIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjaHVua2VkT3V0cHV0LmlzQ2xvc2VkKCkpIHsKKyAgICAgICAgICAgICAgICBpdGVyYXRvci5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICBmaXJlT25DbG9zZShjaHVua2VkT3V0cHV0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBmb3JFYWNoTGlzdGVuZXIoZmluYWwgVGFzazxCcm9hZGNhc3Rlckxpc3RlbmVyPFQ+PiB0KSB7CisgICAgICAgIGZvciAoQnJvYWRjYXN0ZXJMaXN0ZW5lcjxUPiBsaXN0ZW5lciA6IGxpc3RlbmVycykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB0LnJ1bihsaXN0ZW5lcik7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIGxvZywgYnV0IGRvbid0IGJyZWFrCisgICAgICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihCcm9hZGNhc3Rlci5jbGFzcy5nZXROYW1lKCkpLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxpemF0aW9uTWVzc2FnZXMuQlJPQURDQVNURVJfTElTVEVORVJfRVhDRVBUSU9OKGUuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBmaXJlT25FeGNlcHRpb24oZmluYWwgQ2h1bmtlZE91dHB1dDxUPiBjaHVua2VkT3V0cHV0LCBmaW5hbCBFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgIGZvckVhY2hMaXN0ZW5lcihuZXcgVGFzazxCcm9hZGNhc3Rlckxpc3RlbmVyPFQ+PigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKEJyb2FkY2FzdGVyTGlzdGVuZXI8VD4gcGFyYW1ldGVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIHBhcmFtZXRlci5vbkV4Y2VwdGlvbihjaHVua2VkT3V0cHV0LCBleGNlcHRpb24pOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZmlyZU9uQ2xvc2UoZmluYWwgQ2h1bmtlZE91dHB1dDxUPiBjaHVua2VkT3V0cHV0KSB7CisgICAgICAgIGZvckVhY2hMaXN0ZW5lcihuZXcgVGFzazxCcm9hZGNhc3Rlckxpc3RlbmVyPFQ+PigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKEJyb2FkY2FzdGVyTGlzdGVuZXI8VD4gcGFyYW1ldGVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIHBhcmFtZXRlci5vbkNsb3NlKGNodW5rZWRPdXRwdXQpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9Ccm9hZGNhc3Rlckxpc3RlbmVyLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9Ccm9hZGNhc3Rlckxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhkZmRmMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL0Jyb2FkY2FzdGVyTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlcjsKKworLyoqCisgKiBMaXN0ZW5lciBpbnRlcmZhY2UgdGhhdCBjYW4gYmUgaW1wbGVtZW50ZWQgdG8gbGlzdGVuIHRvIGV2ZW50cyBmaXJlZCBieSB7QGxpbmsgQnJvYWRjYXN0ZXJ9IG9iamVjdC4KKyAqCisgKiBUbyBsaXN0ZW4gdG8gZXZlbnRzLCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVyZmFjZSBuZWVkcyB0byByZWdpc3RlciB3aXRoIGEgcGFydGljdWxhciB7QGxpbmsgQnJvYWRjYXN0ZXJ9IGluc3RhbmNlCisgKiB1c2luZyB7QGxpbmsgQnJvYWRjYXN0ZXIjYWRkKEJyb2FkY2FzdGVyTGlzdGVuZXIpfS4KKyAqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGludGVyZmFjZSBCcm9hZGNhc3Rlckxpc3RlbmVyPFQ+IHsKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiBleGNlcHRpb24gd2FzIHRocm93biBieSBhIGdpdmVuIGNodW5rZWQgcmVzcG9uc2Ugd2hlbiB0cnlpbmcgdG8gd3JpdGUgdG8gaXQgb3IgY2xvc2UgaXQuCisgICAgICogQHBhcmFtIGNodW5rZWRPdXRwdXQgaW5zdGFuY2UgdGhhdCB0aHJldyBleGNlcHRpb24KKyAgICAgKiBAcGFyYW0gZXhjZXB0aW9uIHRocm93biBleGNlcHRpb24KKyAgICAgKi8KKyAgICB2b2lkIG9uRXhjZXB0aW9uKENodW5rZWRPdXRwdXQ8VD4gY2h1bmtlZE91dHB1dCwgRXhjZXB0aW9uIGV4Y2VwdGlvbik7CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgd2hlbiB0aGUgY2h1bmtlZE91dHB1dCBoYXMgYmVlbiBjbG9zZWQgKGVpdGhlciBieSBjbGllbnQgY2xvc2luZyB0aGUgY29ubmVjdGlvbiBvciBieSBjYWxsaW5nCisgICAgICoge0BsaW5rIENodW5rZWRPdXRwdXQjY2xvc2UoKX0gb24gdGhlIHNlcnZlciBzaWRlLgorICAgICAqCisgICAgICogQHBhcmFtIGNodW5rZWRPdXRwdXQgaW5zdGFuY2UgdGhhdCBoYXMgYmVlbiBjbG9zZWQuCisgICAgICovCisgICAgdm9pZCBvbkNsb3NlKENodW5rZWRPdXRwdXQ8VD4gY2h1bmtlZE91dHB1dCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9DaHVua2VkT3V0cHV0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9DaHVua2VkT3V0cHV0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E3ZTUzNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL0NodW5rZWRPdXRwdXQuamF2YQpAQCAtMCwwICsxLDM3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLmlvLkNsb3NlYWJsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkJsb2NraW5nRGVxdWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuTGlua2VkQmxvY2tpbmdEZXF1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db25uZWN0aW9uQ2FsbGJhY2s7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3I7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLmludGVybmFsLlJlcXVlc3RDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWwuUmVxdWVzdFNjb3BlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwucHJvY2Vzcy5NYXBwYWJsZUV4Y2VwdGlvbjsKKworLyoqCisgKiBVc2VkIGZvciBzZW5kaW5nIG1lc3NhZ2VzIGluICJ0eXBlZCIgY2h1bmtzLiBVc2VmdWwgZm9yIGxvbmcgcnVubmluZyBwcm9jZXNzZXMsCisgKiB3aGljaCBuZWVkcyB0byBwcm9kdWNlIHBhcnRpYWwgcmVzcG9uc2VzLgorICoKKyAqIEBwYXJhbSA8VD4gY2h1bmsgdHlwZS4KKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KKy8vIFRPRE86ICBzb21ldGhpbmcgbGlrZSBwcmVxdWVsL3NlcXVlbCAtIHVzYWJsZSBmb3IgRXZlbnRDaGFubmVsV3JpdGVyIGFuZCBYTUwgcmVsYXRlZCB3cml0ZXJzCitwdWJsaWMgY2xhc3MgQ2h1bmtlZE91dHB1dDxUPiBleHRlbmRzIEdlbmVyaWNUeXBlPFQ+IGltcGxlbWVudHMgQ2xvc2VhYmxlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gWkVST19MRU5HVEhfREVMSU1JVEVSID0gbmV3IGJ5dGVbMF07CisKKyAgICBwcml2YXRlIGZpbmFsIEJsb2NraW5nRGVxdWU8VD4gcXVldWUgPSBuZXcgTGlua2VkQmxvY2tpbmdEZXF1ZTw+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gY2h1bmtEZWxpbWl0ZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNCb29sZWFuIHJlc3VtZWQgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gZmx1c2hpbmcgPSBmYWxzZTsKKworICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBjbG9zZWQgPSBmYWxzZTsKKworICAgIHByaXZhdGUgdm9sYXRpbGUgQXN5bmNDb250ZXh0IGFzeW5jQ29udGV4dDsKKworICAgIHByaXZhdGUgdm9sYXRpbGUgUmVxdWVzdFNjb3BlIHJlcXVlc3RTY29wZTsKKyAgICBwcml2YXRlIHZvbGF0aWxlIFJlcXVlc3RDb250ZXh0IHJlcXVlc3RTY29wZUNvbnRleHQ7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBDb250YWluZXJSZXF1ZXN0IHJlcXVlc3RDb250ZXh0OworICAgIHByaXZhdGUgdm9sYXRpbGUgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2VDb250ZXh0OworICAgIHByaXZhdGUgdm9sYXRpbGUgQ29ubmVjdGlvbkNhbGxiYWNrIGNvbm5lY3Rpb25DYWxsYmFjazsKKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyB7QGNvZGUgQ2h1bmtlZE91dHB1dH0uCisgICAgICovCisgICAgcHJvdGVjdGVkIENodW5rZWRPdXRwdXQoKSB7CisgICAgICAgIHRoaXMuY2h1bmtEZWxpbWl0ZXIgPSBaRVJPX0xFTkdUSF9ERUxJTUlURVI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIHtAY29kZSBDaHVua2VkT3V0cHV0fSB3aXRoIHNwZWNpZmllZCB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIGNodW5rVHlwZSBjaHVuayB0eXBlLiBNdXN0IG5vdCBiZSB7Y29kZSBudWxsfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2h1bmtlZE91dHB1dChmaW5hbCBUeXBlIGNodW5rVHlwZSkgeworICAgICAgICBzdXBlcihjaHVua1R5cGUpOworICAgICAgICB0aGlzLmNodW5rRGVsaW1pdGVyID0gWkVST19MRU5HVEhfREVMSU1JVEVSOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcge0Bjb2RlIENodW5rZWRPdXRwdXR9IHdpdGggYSBjdXN0b20gY2h1bmsgZGVsaW1pdGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGNodW5rRGVsaW1pdGVyIGN1c3RvbSBjaHVuayBkZWxpbWl0ZXIgYnl0ZXMuIE11c3Qgbm90IGJlIHtjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSAyLjQuMQorICAgICAqLworICAgIHByb3RlY3RlZCBDaHVua2VkT3V0cHV0KGZpbmFsIGJ5dGVbXSBjaHVua0RlbGltaXRlcikgeworICAgICAgICBpZiAoY2h1bmtEZWxpbWl0ZXIubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgdGhpcy5jaHVua0RlbGltaXRlciA9IG5ldyBieXRlW2NodW5rRGVsaW1pdGVyLmxlbmd0aF07CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGNodW5rRGVsaW1pdGVyLCAwLCB0aGlzLmNodW5rRGVsaW1pdGVyLCAwLCBjaHVua0RlbGltaXRlci5sZW5ndGgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5jaHVua0RlbGltaXRlciA9IFpFUk9fTEVOR1RIX0RFTElNSVRFUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcge0Bjb2RlIENodW5rZWRPdXRwdXR9IHdpdGggYSBjdXN0b20gY2h1bmsgZGVsaW1pdGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGNodW5rRGVsaW1pdGVyIGN1c3RvbSBjaHVuayBkZWxpbWl0ZXIgYnl0ZXMuIE11c3Qgbm90IGJlIHtjb2RlIG51bGx9LgorICAgICAqIEBzaW5jZSAyLjQuMQorICAgICAqLworICAgIHByb3RlY3RlZCBDaHVua2VkT3V0cHV0KGZpbmFsIGJ5dGVbXSBjaHVua0RlbGltaXRlciwgUHJvdmlkZXI8QXN5bmNDb250ZXh0PiBhc3luY0NvbnRleHRQcm92aWRlcikgeworICAgICAgICBpZiAoY2h1bmtEZWxpbWl0ZXIubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgdGhpcy5jaHVua0RlbGltaXRlciA9IG5ldyBieXRlW2NodW5rRGVsaW1pdGVyLmxlbmd0aF07CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGNodW5rRGVsaW1pdGVyLCAwLCB0aGlzLmNodW5rRGVsaW1pdGVyLCAwLCBjaHVua0RlbGltaXRlci5sZW5ndGgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5jaHVua0RlbGltaXRlciA9IFpFUk9fTEVOR1RIX0RFTElNSVRFUjsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuYXN5bmNDb250ZXh0ID0gYXN5bmNDb250ZXh0UHJvdmlkZXIgPT0gbnVsbCA/IG51bGwgOiBhc3luY0NvbnRleHRQcm92aWRlci5nZXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IHtAY29kZSBDaHVua2VkT3V0cHV0fSB3aXRoIGEgY3VzdG9tIGNodW5rIGRlbGltaXRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjaHVua1R5cGUgICAgICBjaHVuayB0eXBlLiBNdXN0IG5vdCBiZSB7Y29kZSBudWxsfS4KKyAgICAgKiBAcGFyYW0gY2h1bmtEZWxpbWl0ZXIgY3VzdG9tIGNodW5rIGRlbGltaXRlciBieXRlcy4gTXVzdCBub3QgYmUge2NvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIDIuNC4xCisgICAgICovCisgICAgcHVibGljIENodW5rZWRPdXRwdXQoZmluYWwgVHlwZSBjaHVua1R5cGUsIGZpbmFsIGJ5dGVbXSBjaHVua0RlbGltaXRlcikgeworICAgICAgICBzdXBlcihjaHVua1R5cGUpOworICAgICAgICBpZiAoY2h1bmtEZWxpbWl0ZXIubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgdGhpcy5jaHVua0RlbGltaXRlciA9IG5ldyBieXRlW2NodW5rRGVsaW1pdGVyLmxlbmd0aF07CisgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGNodW5rRGVsaW1pdGVyLCAwLCB0aGlzLmNodW5rRGVsaW1pdGVyLCAwLCBjaHVua0RlbGltaXRlci5sZW5ndGgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5jaHVua0RlbGltaXRlciA9IFpFUk9fTEVOR1RIX0RFTElNSVRFUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcge0Bjb2RlIENodW5rZWRPdXRwdXR9IHdpdGggYSBjdXN0b20gY2h1bmsgZGVsaW1pdGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGNodW5rRGVsaW1pdGVyIGN1c3RvbSBjaHVuayBkZWxpbWl0ZXIgc3RyaW5nLiBNdXN0IG5vdCBiZSB7Y29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgMi40LjEKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ2h1bmtlZE91dHB1dChmaW5hbCBTdHJpbmcgY2h1bmtEZWxpbWl0ZXIpIHsKKyAgICAgICAgaWYgKGNodW5rRGVsaW1pdGVyLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdGhpcy5jaHVua0RlbGltaXRlciA9IFpFUk9fTEVOR1RIX0RFTElNSVRFUjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMuY2h1bmtEZWxpbWl0ZXIgPSBjaHVua0RlbGltaXRlci5nZXRCeXRlcygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyB7QGNvZGUgQ2h1bmtlZE91dHB1dH0gd2l0aCBhIGN1c3RvbSBjaHVuayBkZWxpbWl0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2h1bmtUeXBlICAgICAgY2h1bmsgdHlwZS4gTXVzdCBub3QgYmUge2NvZGUgbnVsbH0uCisgICAgICogQHBhcmFtIGNodW5rRGVsaW1pdGVyIGN1c3RvbSBjaHVuayBkZWxpbWl0ZXIgc3RyaW5nLiBNdXN0IG5vdCBiZSB7Y29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgMi40LjEKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2h1bmtlZE91dHB1dChmaW5hbCBUeXBlIGNodW5rVHlwZSwgZmluYWwgU3RyaW5nIGNodW5rRGVsaW1pdGVyKSB7CisgICAgICAgIHN1cGVyKGNodW5rVHlwZSk7CisgICAgICAgIGlmIChjaHVua0RlbGltaXRlci5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHRoaXMuY2h1bmtEZWxpbWl0ZXIgPSBaRVJPX0xFTkdUSF9ERUxJTUlURVI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLmNodW5rRGVsaW1pdGVyID0gY2h1bmtEZWxpbWl0ZXIuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGEgY2h1bmsuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2h1bmsgYSBjaHVuayBpbnN0YW5jZSB0byBiZSB3cml0dGVuLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhpcyByZXNwb25zZSBpcyBjbG9zZWQgb3Igd2hlbiBlbmNvdW50ZXJlZCBhbnkgcHJvYmxlbSBkdXJpbmcgc2VyaWFsaXppbmcgb3Igd3JpdGluZyBhIGNodW5rLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHdyaXRlKGZpbmFsIFQgY2h1bmspIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjbG9zZWQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5DSFVOS0VEX09VVFBVVF9DTE9TRUQoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2h1bmsgIT0gbnVsbCkgeworICAgICAgICAgICAgcXVldWUuYWRkKGNodW5rKTsKKyAgICAgICAgfQorCisgICAgICAgIGZsdXNoUXVldWUoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBmbHVzaFF1ZXVlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHJlc3VtZWQuY29tcGFyZUFuZFNldChmYWxzZSwgdHJ1ZSkgJiYgYXN5bmNDb250ZXh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFzeW5jQ29udGV4dC5yZXN1bWUodGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVxdWVzdFNjb3BlQ29udGV4dCA9PSBudWxsIHx8IHJlcXVlc3RDb250ZXh0ID09IG51bGwgfHwgcmVzcG9uc2VDb250ZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIEV4Y2VwdGlvbiBleCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXF1ZXN0U2NvcGUucnVuSW5TY29wZShyZXF1ZXN0U2NvcGVDb250ZXh0LCBuZXcgQ2FsbGFibGU8Vm9pZD4oKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIFZvaWQgY2FsbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc2hvdWxkQ2xvc2U7CisgICAgICAgICAgICAgICAgICAgIFQgdDsKKworICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKENodW5rZWRPdXRwdXQudGhpcykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZsdXNoaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgYW5vdGhlciB0aHJlYWQgaXMgYWxyZWFkeSBmbHVzaGluZyB0aGUgcXVldWUsIHdlIGRvbid0IGhhdmUgdG8gZG8gYW55dGhpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbWVtYmVyIHRoZSBjbG9zZWQgZmxhZyBiZWZvcmUgcG9sbGluZyB0aGUgcXVldWUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIChpZiB3ZSBkaWQgaXQgYWZ0ZXIsIHdlIGNvdWxkIG1pc3MgdGhlIGxhc3QgY2h1bmsgYXMgc29tZSBvdGhlciB0aHJlYWQgbWF5IGFkZCBhIGNodW5rCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgc2V0IGNsb3NlZCB0byB0cnVlIHJpZ2h0IGFmdGVyIHdlIGhhdmUgcG9sbGVkIHRoZSBxdWV1ZSAoaS5lLiB3ZSdkIHRoaW5rIHRoZSBxdWV1ZSBpcyBlbXB0eSksCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgYmVmb3JlIHdlIGNoZWNrIGlmIHdlIHNob3VsZCBjbG9zZSAtIHNvIHdlIHdvdWxkIGNsb3NlIHRoZSBzdHJlYW0gbGVhdmluZyB0aGUgbGFzdCBjaHVuaworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5kZWxpdmVyZWQpCisgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRDbG9zZSA9IGNsb3NlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBxdWV1ZS5wb2xsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCAhPSBudWxsIHx8IHNob3VsZENsb3NlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gb3RoZXIgdGhyZWFkIGlzIGZsdXNoaW5nIHRoaXMgcXVldWUgYXQgdGhlIG1vbWVudCBhbmQgaXQgaXMgbm90IGVtcHR5IGFuZC9vciB3ZSBzaG91bGQgY2xvc2UgLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdGhlIGZsdXNoaW5nIGZsYWcgc28gdGhhdCBvdGhlciB0aHJlYWRzIGtub3cgaXQgaXMgYWxyZWFkeSBiZWluZyB0YWtlbiBjYXJlIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZXkgZG9uJ3QgaGF2ZSB0byBib3RoZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbHVzaGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB3aGlsZSAodCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbSBvcmlnU3RyZWFtID0gcmVzcG9uc2VDb250ZXh0LmdldEVudGl0eVN0cmVhbSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbSB3cml0dGVuU3RyZWFtID0gcmVxdWVzdENvbnRleHQuZ2V0V29ya2VycygpLndyaXRlVG8oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5nZXRDbGFzcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LmdldEVudGl0eUFubm90YXRpb25zKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuZ2V0TWVkaWFUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuZ2V0SGVhZGVycygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuZ2V0UHJvcGVydGllc0RlbGVnYXRlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG91dHB1dCBzdHJlYW0gc3RvcmVkIGluIHRoZSByZXNwb25zZSBjb250ZXh0IGZvciB0aGlzIGNodW5rZWQgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBhbHJlYWR5IGludGVyY2VwdGVkIGFzIGEgd2hvbGUgKGlmIHRoZXJlIGFyZSBhbnkgaW50ZXJjZXB0b3JzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gaW50ZXJjZXB0IHRoZSBpbmRpdmlkdWFsIGNodW5rcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLjxXcml0ZXJJbnRlcmNlcHRvcj5lbXB0eUxpc3QoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL25vaW5zcGVjdGlvbiBBcnJheUVxdWFsaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNodW5rRGVsaW1pdGVyICE9IFpFUk9fTEVOR1RIX0RFTElNSVRFUikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgY2h1bmtlZCBvdXRwdXQgaXMgY29uZmlndXJlZCB3aXRoIGEgY3VzdG9tIGRlbGltaXRlciwgdXNlIGl0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXR0ZW5TdHJlYW0ud3JpdGUoY2h1bmtEZWxpbWl0ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZsdXNoIHRoZSBjaHVuayAoc29tZSB3cml0ZXJzIGRvIGl0LCBidXQgc29tZSBkb24ndCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0dGVuU3RyZWFtLmZsdXNoKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ1N0cmVhbSAhPSB3cml0dGVuU3RyZWFtKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIE1CVyByZXBsYWNlZCB0aGUgc3RyZWFtLCBsZXQncyBtYWtlIHN1cmUgdG8gc2V0IGl0IGluIHRoZSByZXNwb25zZSBjb250ZXh0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuc2V0RW50aXR5U3RyZWFtKHdyaXR0ZW5TdHJlYW0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25DYWxsYmFjay5vbkRpc2Nvbm5lY3QoYXN5bmNDb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBpb2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBNYXBwYWJsZUV4Y2VwdGlvbiBtcGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobXBlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uQ2FsbGJhY2sub25EaXNjb25uZWN0KGFzeW5jQ29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG1wZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBxdWV1ZS5wb2xsKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChDaHVua2VkT3V0cHV0LnRoaXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWUgc2VlbXMgZW1wdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgYWdhaW4gaW4gdGhlIHN5bmNocm9uaXplZCBibG9jayBiZWZvcmUgY2xlYXJpbmcgdGhlIGZsdXNoaW5nIGZsYWcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmlyc3QgcmVtZW1iZXIgdGhlIGNsb3NlZCBmbGFnICh0aGlzIGhhcyB0byBiZSBiZWZvcmUgcG9sbGluZyB0aGUgcXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSB3ZSBjb3VsZCBtaXNzIHRoZSBsYXN0IGNodW5rKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRDbG9zZSA9IGNsb3NlZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IHF1ZXVlLnBvbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2ssIGl0IGlzIHJlYWxseSBlbXB0eSAtIGlmIGFueW9uZSBhZGRzIGEgY2h1bmsgd2hpbGUgd2UgYXJlIGhlcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvdGhlciB0aHJlYWQgd2lsbCB0YWtlIGNhcmUgb2YgaXQgLT4gZmx1c2ggdGhlIHN0cmVhbSBhbmQgdW5zZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBmbHVzaGluZyBmbGFnIGF0IHRoZSB2ZXJ5IGVuZCAodG8gbWFrZSBzdXJlIGl0IGlzIHVuc2V0IG9ubHkgaWYgbm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4Y2VwdGlvbiBpcyB0aHJvd24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuY29tbWl0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBjbG9zaW5nLCB3ZSBrZWVwIHRoZSAiZmx1c2hpbmciIGZsYWcgc2V0LCBzaW5jZSBubyBvdGhlciB0aHJlYWQgbmVlZHMgdG8gZmx1c2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgcXVldWUgYW55bW9yZSAtIGZpbmFsbHkgY2xhdXNlIHdpbGwgdGFrZSBjYXJlIG9mIGNsb3NpbmcgdGhlIHN0cmVhbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmx1c2hpbmcgPSBzaG91bGRDbG9zZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgY2xvc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIC8vIHJlbWVtYmVyIHRoZSBleGNlcHRpb24gKGl0IHdpbGwgZ2V0IHJldGhyb3duIGZyb20gZmluYWxseSBjbGF1c2UsIG9uY2UgaXQgZG9lcyBpdCdzIHdvcmspCisgICAgICAgICAgICBleCA9IGU7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoY2xvc2VkKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWYgbm8gZXhjZXB0aW9uIHJlbWVtYmVyZWQgYmVmb3JlLCByZW1lbWJlciB0aGlzIG9uZQorICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UgdGhlIHByZXZpb3VzbHkgcmVtZW1iZXJlZCBleGNlcHRpb24gKGZyb20gY2F0Y2ggY2xhdXNlKSB0YWtlcyBwcmVjZWRlbmNlCisgICAgICAgICAgICAgICAgICAgIGV4ID0gZXggPT0gbnVsbCA/IGUgOiBleDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXF1ZXN0U2NvcGVDb250ZXh0LnJlbGVhc2UoKTsKKworICAgICAgICAgICAgICAgIC8vIHJldGhyb3cgcmVtZW1iZXJlZCBleGNlcHRpb24gKGlmIGFueSkKKyAgICAgICAgICAgICAgICBpZiAoZXggaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgICAgICAvL25vaW5zcGVjdGlvbiBUaHJvd0Zyb21GaW5hbGx5QmxvY2sKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKElPRXhjZXB0aW9uKSBleDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV4IGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgICAgICAvL25vaW5zcGVjdGlvbiBUaHJvd0Zyb21GaW5hbGx5QmxvY2sKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pIGV4OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlIHRoaXMgcmVzcG9uc2UgLSBpdCB3aWxsIGJlIGZpbmFsaXplZCBhbmQgdW5kZXJseWluZyBjb25uZWN0aW9ucyB3aWxsIGJlIGNsb3NlZAorICAgICAqIG9yIG1hZGUgYXZhaWxhYmxlIGZvciBhbm90aGVyIHJlc3BvbnNlLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY2xvc2VkID0gdHJ1ZTsKKyAgICAgICAgZmx1c2hRdWV1ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBzdGF0ZSBpbmZvcm1hdGlvbi4KKyAgICAgKgorICAgICAqIFBsZWFzZSBub3RlIHRoYXQge0Bjb2RlIENodW5rZWRPdXRwdXR9IGNhbiBiZSBjbG9zZWQgYnkgdGhlIGNsaWVudCBzaWRlIC0gY2xpZW50IGNhbiBjbG9zZSBjb25uZWN0aW9uCisgICAgICogZnJvbSBpdHMgc2lkZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSB3aGVuIGNsb3NlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCkgeworICAgICAgICByZXR1cm4gY2xvc2VkOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJFcXVhbHNXaGljaERvZXNudENoZWNrUGFyYW1ldGVyQ2xhc3MiKQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3Qgb2JqKSB7CisgICAgICAgIHJldHVybiB0aGlzID09IG9iajsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgcmVzdWx0ID0gc3VwZXIuaGFzaENvZGUoKTsKKyAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyBxdWV1ZS5oYXNoQ29kZSgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiQ2h1bmtlZE91dHB1dDwiICsgZ2V0VHlwZSgpICsgIj4iOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBjb250ZXh0IHVzZWQgZm9yIHdyaXRpbmcgY2h1bmtzLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3RTY29wZSAgICAgICAgICAgICByZXF1ZXN0IHNjb3BlLgorICAgICAqIEBwYXJhbSByZXF1ZXN0U2NvcGVDb250ZXh0ICAgICAgY3VycmVudCByZXF1ZXN0IGNvbnRleHQgaW5zdGFuY2UuCisgICAgICogQHBhcmFtIHJlcXVlc3RDb250ZXh0ICAgICAgICAgICByZXF1ZXN0IGNvbnRleHQuCisgICAgICogQHBhcmFtIHJlc3BvbnNlQ29udGV4dCAgICAgICAgICByZXNwb25zZSBjb250ZXh0LgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uQ2FsbGJhY2tSdW5uZXIgY29ubmVjdGlvbiBjYWxsYmFjay4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIHdoZW4gZW5jb3VudGVyZWQgYW55IHByb2JsZW0gZHVyaW5nIHNlcmlhbGl6aW5nIG9yIHdyaXRpbmcgYSBjaHVuay4KKyAgICAgKi8KKyAgICB2b2lkIHNldENvbnRleHQoZmluYWwgUmVxdWVzdFNjb3BlIHJlcXVlc3RTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVxdWVzdENvbnRleHQgcmVxdWVzdFNjb3BlQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29udGFpbmVyUmVxdWVzdCByZXF1ZXN0Q29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2VDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb25uZWN0aW9uQ2FsbGJhY2sgY29ubmVjdGlvbkNhbGxiYWNrUnVubmVyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0aGlzLnJlcXVlc3RTY29wZSA9IHJlcXVlc3RTY29wZTsKKyAgICAgICAgdGhpcy5yZXF1ZXN0U2NvcGVDb250ZXh0ID0gcmVxdWVzdFNjb3BlQ29udGV4dDsKKyAgICAgICAgdGhpcy5yZXF1ZXN0Q29udGV4dCA9IHJlcXVlc3RDb250ZXh0OworICAgICAgICB0aGlzLnJlc3BvbnNlQ29udGV4dCA9IHJlc3BvbnNlQ29udGV4dDsKKyAgICAgICAgdGhpcy5jb25uZWN0aW9uQ2FsbGJhY2sgPSBjb25uZWN0aW9uQ2FsbGJhY2tSdW5uZXI7CisgICAgICAgIGZsdXNoUXVldWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9DaHVua2VkUmVzcG9uc2VXcml0ZXIuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL0NodW5rZWRSZXNwb25zZVdyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiOTkyOWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9DaHVua2VkUmVzcG9uc2VXcml0ZXIuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworCitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CisKKy8qKgorICogVXNlZCBmb3Igd3JpdGluZyB7QGxpbmsgQ2h1bmtlZE91dHB1dH0uCisgKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBzZWUgTWVzc2FnZUJvZHlXcml0ZXIKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIENodW5rZWRSZXNwb25zZVdyaXRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5V3JpdGVyPENodW5rZWRPdXRwdXQ8Pz4+IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiBDaHVua2VkT3V0cHV0LmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShmaW5hbCBDaHVua2VkT3V0cHV0PD8+IGNodW5rZWRPdXRwdXQsIGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oZmluYWwgQ2h1bmtlZE91dHB1dDw/PiBjaHVua2VkT3V0cHV0LCBmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLCBmaW5hbCBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGRvIG5vdGhpbmcuCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvQ2xpZW50QmluZGluZy5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvQ2xpZW50QmluZGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZTMxNTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9DbGllbnRCaW5kaW5nLmphdmEKQEAgLTAsMCArMSwyMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKKworLyoqCisgKiBNZXRhLWFubm90YXRpb24gdGhhdCBwcm92aWRlcyBhIGZhY2lsaXR5IGZvciBjcmVhdGluZyBiaW5kaW5ncyBiZXR3ZWVuIGFuIHtAbGluayBVcmkgJiM2NDtVcml9LWluamVjdGFibGUKKyAqIHtAbGluayBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0IFdlYlRhcmdldH0gaW5zdGFuY2VzIGFuZCBjbGllbnRzIChhbmQgdGhlaXIgY29uZmlndXJhdGlvbnMpIHRoYXQgYXJlIHVzZWQgdG8gY3JlYXRlCisgKiB0aGUgaW5qZWN0ZWQgd2ViIHRhcmdldCBpbnN0YW5jZXMuCisgKiA8cD4KKyAqIEplcnNleSByZWZlcnMgdG8gY2xpZW50IGluc3RhbmNlIGNvbmZpZ3VyZWQgdXNpbmcgY3VzdG9tIGJvdW5kIGNvbmZpZ3VyYXRpb25zIGFzIDxlbT5tYW5hZ2VkIGNsaWVudHM8L2VtPi4gQXMgYSBmaXJzdCBzdGVwLAorICogd2hlbiB1c2luZyBhIG1hbmFnZWQgY2xpZW50IGluIGEgc2VydmVyLXNpZGUgSkFYLVJTL0plcnNleSBhcHBsaWNhdGlvbiwgYSBjdXN0b20gY2xpZW50IGJpbmRpbmcgYW5ub3RhdGlvbiBoYXMgdG8gYmUKKyAqIGRlZmluZWQ6CisgKiA8cHJlPgorICogJiM2NDtDbGllbnRCaW5kaW5nCisgKiBwdWJsaWMgJiM2NDtpbnRlcmZhY2UgPGI+TXlDbGllbnQ8L2I+IHsgfQorICogPC9wcmU+CisgKiBUaGlzIGRlZmluZXMgbmV3IHtAY29kZSBATXlDbGllbnR9IGJpbmRpbmcgYW5ub3RhdGlvbiB3aGljaCB3aWxsIGJlIGNvbmZpZ3VyZWQgdXNpbmcgYSBkZWZhdWx0IHtAbGluayAjY29uZmlnQ2xhc3MoKQorICogY29uZmlndXJhdGlvbiBjbGFzc30sIHdpbGwge0BsaW5rICNpbmhlcml0U2VydmVyUHJvdmlkZXJzKCkgaW5oZXJpdCBhbGwgc2VydmVyLXNpZGUgcHJvdmlkZXJzfSBhcyB3ZWxsIGFzIHdpbGwgdXNlIGEKKyAqIGRlZmF1bHQge0BsaW5rICNiYXNlVXJpKCkgYmFzZSBVUkl9IHRvIHJlc29sdmUgcmVsYXRpdmUge0BsaW5rIFVyaSAmIzY0O1VyaX0gd2ViIHRhcmdldCBVUkkgdmFsdWVzLgorICogPC9wPgorICogPHA+CisgKiBPbmNlIGEgY3VzdG9tIGNsaWVudCBiaW5kaW5nIGFubm90YXRpb24gaXMgZGVmaW5lZCwgaXQgY2FuIGJlIHVzZWQgd2hlbiB7QGxpbmsgVXJpIGluamVjdGluZ30gbmV3CisgKiB7QGNvZGUgV2ViVGFyZ2V0fSBpbnN0YW5jZXMgY3JlYXRlZCBieSBhIG1hbmFnZWQgY2xpZW50LiBUbyBjb21wbGV0ZSBhIGJpbmRpbmcgYmV0d2VlbiBhIG1hbmdlZCBjbGllbnQgYW5kIGFuIGluamVjdGVkCisgKiB3ZWIgdGFyZ2V0IGluc3RhbmNlLCBwdXQgdGhlIGN1c3RvbSBjbGllbnQgYmluZGluZyBhbm5vdGF0aW9uIGludG8gdGhlIGRlZmluaXRpb24gb2YgYW4gaW5qZWN0ZWQgd2ViIHRhcmdldCBmaWVsZCBvcgorICogcGFyYW1ldGVyLiBGb3IgZXhhbXBsZToKKyAqIDxwcmU+CisgKiAmIzY0O1BhdGgoImZvbyIpCisgKiBwdWJsaWMgY2xhc3MgTWFuYWdlZENsaWVudFJlc291cmNlIHsKKyAqICAgJiM2NDtVcmkoImJhciIpIDxiPiYjNjQ7TXlDbGllbnQ8L2I+CisgKiAgIHByaXZhdGUgV2ViVGFyZ2V0IHRhcmdldEJhcjsKKyAqCisgKiAgICYjNjQ7R0VUCisgKiAgICYjNjQ7UGF0aCgiYmFyIikKKyAqICAgcHVibGljIFN0cmluZyBnZXRCYXIoKSB7CisgKiAgICAgcmV0dXJuIHRhcmdldEJhci5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAqICAgfQorICoKKyAqICAgJiM2NDtHRVQKKyAqICAgJiM2NDtQYXRoKCJiYXoiKQorICogICBwdWJsaWMgUmVzcG9uc2UgZ2V0QmF6KCYjNjQ7VXJpKCJiYXoiKSA8Yj4mIzY0O015Q2xpZW50PC9iPiBXZWJUYXJnZXQgdGFyZ2V0QmF6KSB7CisgKiAgICAgcmV0dXJuIHRhcmdldEIucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9QTEFJTikuZ2V0KCk7CisgKiAgIH0KKyAqIH0KKyAqIDwvcHJlPgorICogPC9wPgorICogPHA+CisgKiBPZnRlbiBtYW5hZ2VkIGNsaWVudHMgbWF5IHJlcXVpcmUgYSBtb3JlIGNvbXBsZXggY29uZmlndXJhdGlvbiwgaW5jbHVkaW5nIHNwZWNpZnlpbmcgY3VzdG9tIHByb3ZpZGVyIGNsYXNzZXMgYW5kIGluc3RhbmNlcworICogYW5kIHNldHRpbmcgY3VzdG9tIHByb3BlcnRpZXMuIEluIHN1Y2ggY2FzZSBpdCBtYXkgYmUgbW9yZSBjb252ZW5pZW50IHRvIHByb3ZpZGUgYSBjdXN0b20ge0BsaW5rIENvbmZpZ3VyYXRpb259CisgKiBpbXBsZW1lbnRhdGlvbiBjbGFzcyBhbmQgbGluayBpdCB3aXRoIHRoZSBiaW5kaW5nIGFubm90YXRpb246CisgKiA8cHJlPgorICogcHVibGljIGNsYXNzIDxiPk15Q2xpZW50Q29uZmlnPC9iPiBpbXBsZW1lbnRzIENvbmZpZ3VyYXRpb24geworICogICAuLi4gLy8gY29uZmlndXJlIHByb3ZpZGUKKyAqIH0KKyAqCisgKiAmIzY0O0NsaWVudEJpbmRpbmcoY29uZmlnQ2xhc3MgPSA8Yj5NeUNsaWVudENvbmZpZzwvYj4uY2xhc3MpCisgKiBwdWJsaWMgJiM2NDtpbnRlcmZhY2UgPGI+TXlDbGllbnQ8L2I+IHsgfQorICogPC9wcmU+CisgKiBOb3RlIHRoYXQgdGhlIGVhc2llc3Qgd2F5IGhvdyB0byBwcm92aWRlIGEgY3VzdG9tIGNsaWVudC1zaWRlIHtAY29kZSBDb25maWd1cmF0aW9ufSBpbXBsZW1lbnRhdGlvbiBpbiBKZXJzZXkgaXMgdG8gZXh0ZW5kCisgKiB0aGUge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWd9IGNsYXNzIHRoYXQgcHJvdmlkZXMgcmV1c2FibGUgaW1wbGVtZW50YXRpb24gb2YgSkFYLVJTCisgKiB7QGxpbmsgQ29uZmlndXJhdGlvbn0gYXMgd2VsbCBhcyB7QGxpbmsgamF2YXgud3MucnMuY29yZS5Db25maWd1cmFibGUgQ29uZmlndXJhYmxlfSBBUElzLgorICogPC9wPgorICogPHA+CisgKiBJbiBjYXNlIGEgbWFuYWdlZCBjbGllbnQgbmVlZHMgc3BlY2lhbCBwcm9wZXJ0aWVzLCB0aGVzZSBwcm9wZXJ0aWVzIGNhbiBhbHNvIGJlIHByb3ZpZGVkIHZpYSBjdXN0b20ge0Bjb2RlIENvbmZpZ3VyYXRpb259CisgKiBpbXBsZW1lbnRhdGlvbiBjbGFzcy4gQW5vdGhlciB3YXkgaG93IHRvIHBhc3MgY3VzdG9tIHByb3BlcnRpZXMgdG8gYSBtYW5hZ2VkIGNsaWVudCBjb25maWd1cmF0aW9uIGlzIHRvIGRlZmluZSB0aGUgbWFuYWdlZAorICogY2xpZW50IHByb3BlcnRpZXMgaW4gdGhlIHNlcnZlciBjb25maWd1cmF0aW9uIHVzaW5nIGEgc3BlY2lhbAorICogPHR0PjxlbT4mbHQ7Y2xpZW50LmJpbmRpbmcuYW5ub3RhdGlvbi5GUU4mZ3Q7PC9lbT4ucHJvcGVydHkuPC90dD4gcHJlZml4LiBUaGlzIGNhbiBiZSBlaXRoZXIgZG9uZSBwcm9ncmFtbWF0aWNhbGx5LAorICogZm9yIGV4YW1wbGU6CisgKiA8cHJlPgorICogTXlSZXNvdXJjZUNvbmZpZy5wcm9wZXJ0eSgKKyAqICAgICAibXkucGFja2FnZS5NeUNsaWVudC5wcm9wZXJ0eS48Yj5jdXN0b20tY2xpZW50LXByb3BlcnR5PC9iPiIsICJjdXN0b20tdmFsdWUiKTsKKyAqIDwvcHJlPgorICogPC9wPgorICogPHA+CisgKiBPciBkZWNsYXJhdGl2ZWx5IHZpYSB7QGNvZGUgd2ViLnhtbH06CisgKiA8cHJlPgorICogJmx0O2luaXQtcGFyYW0mZ3Q7CisgKiAgICAgJmx0O3BhcmFtLW5hbWUmZ3Q7bXkucGFja2FnZS5NeUNsaWVudC5wcm9wZXJ0eS48Yj5jdXN0b20tY2xpZW50LXByb3BlcnR5PC9iPiZsdDsvcGFyYW0tbmFtZSZndDsKKyAqICAgICAmbHQ7cGFyYW0tdmFsdWUmZ3Q7Y3VzdG9tLXZhbHVlJmx0Oy9wYXJhbS12YWx1ZSZndDsKKyAqICZsdDsvaW5pdC1wYXJhbSZndDsKKyAqIDwvcHJlPgorICogUHJvcGVydGllcyBkZWZpbmVkIHRoaXMgd2F5IGNhbiBiZSBhY2Nlc3NlZCBmcm9tIHRoZSBwcm9wZXIgbWFuYWdlZCBjbGllbnQgaW5zdGFuY2VzIHVzaW5nIHRoZSBjdXN0b20gcHJvcGVydHkgbmFtZXM6CisgKiA8cHJlPgorICogT2JqZWN0IHZhbHVlID0gY3VzdG9tVGFyZ2V0LmdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0eSgiPGI+Y3VzdG9tLWNsaWVudC1wcm9wZXJ0eTwvYj4iKTsKKyAqIDwvcHJlPgorICogTm90ZSB0aGF0IHRoZSB0ZWNobmlxdWUgb2YgZGVmaW5pbmcgbWFuYWdlZCBjbGllbnQgcHJvcGVydGllcyB2aWEgc2VydmVyLXNpZGUgY29uZmlndXJhdGlvbiBkZXNjcmliZWQgYWJvdmUgY2FuIGJlIGFsc28gdXNlZAorICogdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgcHJvcGVydHkgdmFsdWVzIGRlZmluZWQgcHJvZ3JhbW1hdGljYWxseSBpbiBhIGN1c3RvbSBjb25maWd1cmF0aW9uIGltcGxlbWVudGF0aW9uIGNsYXNzLgorICogPC9wPgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitAVGFyZ2V0KEVsZW1lbnRUeXBlLkFOTk9UQVRJT05fVFlQRSkKK0BEb2N1bWVudGVkCitwdWJsaWMgQGludGVyZmFjZSBDbGllbnRCaW5kaW5nIHsKKyAgICAvKioKKyAgICAgKiBEZWZpbmUgYSBjb25maWd1cmF0aW9uIGltcGxlbWVudGF0aW9uIGNsYXNzIHRvIGJlIGluc3RhbnRpYXRlZCBhbmQgdXNlZCB0byBjb25maWd1cmUgYm91bmQgd2ViIHRhcmdldHMuCisgICAgICogSWYgbm90IHNldCwgYSBkZWZhdWx0IGNsaWVudC1zaWRlIGNvbmZpZ3VyYXRpb24gaW1wbGVtZW50YXRpb24gY2xhc3Mgd2lsbCBiZSB1c2VkLgorICAgICAqIDxwPgorICAgICAqIEhhcmQtY29kZWQgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSBtYXkgYmUgb3ZlcnJpZGRlbiBhdCBkZXBsb3ktdGltZSBieSBwcm92aWRpbmcgYSBuZXcgdmFsdWUgZm9yIGEKKyAgICAgKiA8dHQ+PGVtPiZsdDtjbGllbnQuYmluZGluZy5hbm5vdGF0aW9uLkZRTiZndDs8L2VtPi5jb25maWdDbGFzczwvdHQ+IHByb3BlcnR5LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBGb3IgZXhhbXBsZToKKyAgICAgKiA8cHJlPgorICAgICAqIE15UmVzb3VyY2VDb25maWcucHJvcGVydHkoCisgICAgICogICAgICJteS5wYWNrYWdlLk15Q2xpZW50LmNvbmZpZ0NsYXNzIiwKKyAgICAgKiAgICAgIm15LnBhY2thZ2UuTXlDbGllbnRDb25maWciKTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogT3IgZGVjbGFyYXRpdmVseSB2aWEge0Bjb2RlIHdlYi54bWx9OgorICAgICAqIDxwcmU+CisgICAgICogJmx0O2luaXQtcGFyYW0mZ3Q7CisgICAgICogICAgICZsdDtwYXJhbS1uYW1lJmd0O215LnBhY2thZ2UuTXlDbGllbnQuY29uZmlnQ2xhc3MmbHQ7L3BhcmFtLW5hbWUmZ3Q7CisgICAgICogICAgICZsdDtwYXJhbS12YWx1ZSZndDtteS5wYWNrYWdlLk15Q2xpZW50Q29uZmlnJmx0Oy9wYXJhbS12YWx1ZSZndDsKKyAgICAgKiAmbHQ7L2luaXQtcGFyYW0mZ3Q7CisgICAgICogPC9wcmU+CisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBDbGFzczw/IGV4dGVuZHMgQ29uZmlndXJhdGlvbj4gY29uZmlnQ2xhc3MoKSBkZWZhdWx0IENvbmZpZ3VyYXRpb24uY2xhc3M7CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmUgd2hldGhlciBwcm92aWRlcnMgcHJlc2VudCBpbiB0aGUgc2VydmVyLXNpZGUgY29uZmlndXJhdGlvbiBzaG91bGQgYmUgaW5oZXJpdGVkIGJ5IHRoZSBib3VuZCBjbGllbnQKKyAgICAgKiBjb25maWd1cmF0aW9uICh7QGNvZGUgdHJ1ZX0pIG9yIG5vdCAoe0Bjb2RlIGZhbHNlfSkuIEJ5IGRlZmF1bHQgdGhlIHNlcnZlci1zaWRlIHByb3ZpZGVycyBhcmUgaW5oZXJpdGVkLCBpLmUuCisgICAgICogdGhlIGFubm90YXRpb24gcHJvcGVydHkgZGVmYXVsdHMgdG8ge0Bjb2RlIHRydWV9LgorICAgICAqIDxwPgorICAgICAqIEhhcmQtY29kZWQgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSBtYXkgYmUgb3ZlcnJpZGRlbiBhdCBkZXBsb3ktdGltZSBieSBwcm92aWRpbmcgYSBuZXcgdmFsdWUgZm9yIGEKKyAgICAgKiA8dHQ+PGVtPiZsdDtjbGllbnQuYmluZGluZy5hbm5vdGF0aW9uLkZRTiZndDs8L2VtPi5pbmhlcml0U2VydmVyUHJvdmlkZXJzPC90dD4gcHJvcGVydHkuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIEZvciBleGFtcGxlOgorICAgICAqIDxwcmU+CisgICAgICogTXlSZXNvdXJjZUNvbmZpZy5wcm9wZXJ0eSgKKyAgICAgKiAgICAgIm15LnBhY2thZ2UuTXlDbGllbnQuaW5oZXJpdFNlcnZlclByb3ZpZGVycyIsIGZhbHNlKTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogT3IgZGVjbGFyYXRpdmVseSB2aWEge0Bjb2RlIHdlYi54bWx9OgorICAgICAqIDxwcmU+CisgICAgICogJmx0O2luaXQtcGFyYW0mZ3Q7CisgICAgICogICAgICZsdDtwYXJhbS1uYW1lJmd0O215LnBhY2thZ2UuTXlDbGllbnQuaW5oZXJpdFNlcnZlclByb3ZpZGVycyZsdDsvcGFyYW0tbmFtZSZndDsKKyAgICAgKiAgICAgJmx0O3BhcmFtLXZhbHVlJmd0O2ZhbHNlJmx0Oy9wYXJhbS12YWx1ZSZndDsKKyAgICAgKiAmbHQ7L2luaXQtcGFyYW0mZ3Q7CisgICAgICogPC9wcmU+CisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGluaGVyaXRTZXJ2ZXJQcm92aWRlcnMoKSBkZWZhdWx0IHRydWU7CisKKyAgICAvKioKKyAgICAgKiBEZWZpbmUgYSBjdXN0b20gYmFzZSBVUkkgZm9yIG1hbmFnZWQge0BsaW5rIGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQgV2ViVGFyZ2V0fSBpbnN0YW5jZXMgaW5qZWN0ZWQgdXNpbmcKKyAgICAgKiB7QGxpbmsgVXJpICYjNjQ7VXJpfSBhbm5vdGF0aW9uIHdpdGggYSByZWxhdGl2ZSB3ZWIgdGFyZ2V0IFVSSSB2YWx1ZS4gQnkgZGVmYXVsdCwgdGhlIGJhc2UKKyAgICAgKiBVUkkgaXMgZW1wdHkgaW5kaWNhdGluZyB0aGF0IHRoZSBjdXJyZW50IGFwcGxpY2F0aW9uIGJhc2UgVVJJIHNob3VsZCBiZSB1c2VkLgorICAgICAqIDxwPgorICAgICAqIFVzaW5nIGEgY3VzdG9tIGNvbnRleHQgcm9vdCBpcyB1c2VmdWwgaW4gY2FzZXMgd2hlcmUgdGhlIGFic29sdXRlIFVSSSBvZiB0aGUgdGFyZ2V0IGVuZHBvaW50KHMpIGlzIGV4cGVjdGVkCisgICAgICogdG8gY2hhbmdlIG9uIG1heSB2YXJ5IG92ZXIgdGltZS4gQW4gdHlwaWNhbCBzY2VuYXJpb3MgaW5jbHVkZSB0cmFuc2l0aW9uIG9mIHRoZSBhcHBsaWNhdGlvbiBmcm9tIGEgdGVzdCB0bworICAgICAqIHByb2R1Y3Rpb24gZW52aXJvbm1lbnQsIGV0Yy4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogSGFyZC1jb2RlZCB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5IG1heSBiZSBvdmVycmlkZGVuIGF0IGRlcGxveS10aW1lIGJ5IHByb3ZpZGluZyBhIG5ldyB2YWx1ZSBmb3IgYQorICAgICAqIDx0dD48ZW0+Jmx0O2NsaWVudC5iaW5kaW5nLmFubm90YXRpb24uRlFOJmd0OzwvZW0+LmJhc2VVcmk8L3R0PiBwcm9wZXJ0eS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogRm9yIGV4YW1wbGU6CisgICAgICogPHByZT4KKyAgICAgKiBNeVJlc291cmNlQ29uZmlnLnByb3BlcnR5KAorICAgICAqICAgICAibXkucGFja2FnZS5NeUNsaWVudC5iYXNlVXJpIiwgImh0dHA6Ly9qZXJzZXkuamF2YS5uZXQvZXhhbXBsZXMvIik7CisgICAgICogPC9wcmU+CisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIE9yIGRlY2xhcmF0aXZlbHkgdmlhIHtAY29kZSB3ZWIueG1sfToKKyAgICAgKiA8cHJlPgorICAgICAqICZsdDtpbml0LXBhcmFtJmd0OworICAgICAqICAgICAmbHQ7cGFyYW0tbmFtZSZndDtteS5wYWNrYWdlLk15Q2xpZW50LmJhc2VVcmkmbHQ7L3BhcmFtLW5hbWUmZ3Q7CisgICAgICogICAgICZsdDtwYXJhbS12YWx1ZSZndDtodHRwOi8vamVyc2V5LmphdmEubmV0L2V4YW1wbGVzLyZsdDsvcGFyYW0tdmFsdWUmZ3Q7CisgICAgICogJmx0Oy9pbml0LXBhcmFtJmd0OworICAgICAqIDwvcHJlPgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGJhc2VVcmkoKSBkZWZhdWx0ICIiOworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvQ2xvc2VhYmxlU2VydmljZS5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvQ2xvc2VhYmxlU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMTFkNjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9DbG9zZWFibGVTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLmlvLkNsb3NlYWJsZTsKKworLyoqCisgKiBBIGNsb3NlYWJsZSBzZXJ2aWNlIHRvIGFkZCBpbnN0YW5jZXMgb2Yge0BsaW5rIENsb3NlYWJsZX0gdGhhdAorICogYXJlIHJlcXVpcmVkIHRvIGJlIGNsb3NlZC4KKyAqIDxwPgorICogVGhpcyBpbnRlcmZhY2UgbWF5IGJlIGluamVjdGVkIG9udG8gc2VydmVyLXNpZGUgY29tcG9uZW50cyB1c2luZworICogdGhlIHtAbGluayBqYXZheC53cy5ycy5jb3JlLkNvbnRleHR9IGFubm90YXRpb24uCisgKiA8cD4KKyAqIFRoZSBzZXJ2aWNlIG1heSBiZSB1c2VkIHdpdGhpbiB0aGUgc2NvcGUgb2YgYSByZXF1ZXN0IHRvIGFkZCBpbnN0YW5jZXMKKyAqIG9mIHtAbGluayBDbG9zZWFibGV9IHRoYXQgYXJlIHRvIGJlIGNsb3NlZCB3aGVuIHRoZSByZXF1ZXN0IGdvZXMgb3V0CisgKiBvZiBzY29wZSwgbW9yZSBzcGVjaWZpY2FsbHkgYWZ0ZXIgdGhlIHJlcXVlc3QgaGFzIGJlZW4gcHJvY2Vzc2VkIGFuZCB0aGUKKyAqIHJlc3BvbnNlIGhhcyBiZWVuIHJldHVybmVkLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ2xvc2VhYmxlU2VydmljZSB7CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBhIG5ldyBpbnN0YW5jZSBvZiB7QGxpbmsgQ2xvc2VhYmxlfSB0aGF0IGlzIHRvIGJlIGNsb3NlZCB3aGVuIHRoZSByZXF1ZXN0IGdvZXMgb3V0IG9mIHNjb3BlLgorICAgICAqIDxwPgorICAgICAqIEFmdGVyIHtAbGluayAjY2xvc2UoKX0gaGFzIGJlZW4gY2FsbGVkLCB0aGlzIG1ldGhvZCB3aWxsIG5vdCBhY2NlcHQgYW55IG5ldyBpbnN0YW5jZSByZWdpc3RyYXRpb25zIGFuZAorICAgICAqIHdpbGwgcmV0dXJuIHtAY29kZSBmYWxzZX0gaW5zdGVhZC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gYyB0aGUgaW5zdGFuY2Ugb2Yge0BsaW5rIENsb3NlYWJsZX0uCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGNsb3NlYWJsZSBzZXJ2aWNlIGhhcyBub3QgYmVlbiBjbG9zZWQgeWV0IGFuZCB0aGUgY2xvc2VhYmxlIGluc3RhbmNlIHdhcyBzdWNjZXNzZnVsbHkKKyAgICAgKiByZWdpc3RlcmVkIHdpdGggdGhlIHNlcnZpY2UsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGFkZChDbG9zZWFibGUgYyk7CisKKyAgICAvKioKKyAgICAgKiBJbnZva2VzIHtAY29kZSBDbG9zZWFibGUjY2xvc2UoKX0gbWV0aG9kIG9uIGFsbCBpbnN0YW5jZXMgb2Yge0BsaW5rIENsb3NlYWJsZX0gYWRkZWQgYnkgdGhlIHtAY29kZSAjYWRkKENsb3NlYWJsZSl9CisgICAgICogbWV0aG9kLgorICAgICAqIFN1YnNlcXVlbnQgY2FsbHMgb2YgdGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBkbyBhbnl0aGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpOworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvQ29tcG9uZW50UHJvdmlkZXJDb25maWd1cmF0b3IuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL0NvbXBvbmVudFByb3ZpZGVyQ29uZmlndXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRlNjllNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL0NvbXBvbmVudFByb3ZpZGVyQ29uZmlndXJhdG9yLmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW1TdXBwb3J0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuQm9vdHN0cmFwQmFnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkJvb3RzdHJhcENvbmZpZ3VyYXRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5TZXJ2aWNlQ29uZmlndXJhdGlvbkVycm9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLlNlcnZpY2VGaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLkxhenlWYWx1ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uVmFsdWU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLlZhbHVlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb2RlbC5pbnRlcm5hbC5SYW5rZWRDb21wYXJhdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1vZGVsLmludGVybmFsLlJhbmtlZFByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29tcG9uZW50UHJvdmlkZXI7CisKKy8qKgorICogQ29uZmlndXJhdG9yIHdoaWNoIGluaXRpYWxpemVzIGFuZCByZWdpc3RlciB7QGxpbmsgQ29tcG9uZW50UHJvdmlkZXJ9IGluc3RhbmNlcyBpbnRvIHtAbGluayBCb290c3RyYXBCYWd9LgorICoKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitjbGFzcyBDb21wb25lbnRQcm92aWRlckNvbmZpZ3VyYXRvciBpbXBsZW1lbnRzIEJvb3RzdHJhcENvbmZpZ3VyYXRvciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb21wYXJhdG9yPFJhbmtlZFByb3ZpZGVyPENvbXBvbmVudFByb3ZpZGVyPj4gUkFOS0VEX0NPTVBBUkFUT1IgPQorICAgICAgICAgICAgbmV3IFJhbmtlZENvbXBhcmF0b3I8PihSYW5rZWRDb21wYXJhdG9yLk9yZGVyLkRFU0NFTkRJTkcpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaW5pdChJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIsIEJvb3RzdHJhcEJhZyBib290c3RyYXBCYWcpIHsKKyAgICAgICAgU2VydmVyQm9vdHN0cmFwQmFnIHNlcnZlckJhZyA9IChTZXJ2ZXJCb290c3RyYXBCYWcpIGJvb3RzdHJhcEJhZzsKKworICAgICAgICAvLyBUaGVyZSBhcmUgc2l0dWF0aW9uIGluIHdoaWNoIENvbXBvbmVudFByb3ZpZGVycyBhcmUgbm90IG5lZWRlZCB0aGVyZWZvcmUgdGhlaXIgZW50aXJlIGluaXRpYWxpemF0aW9uIGlzIHdyYXBwZWQKKyAgICAgICAgLy8gaW50byBhIGxhenkgYmxvY2suCisgICAgICAgIExhenlWYWx1ZTxDb2xsZWN0aW9uPENvbXBvbmVudFByb3ZpZGVyPj4gY29tcG9uZW50UHJvdmlkZXJzID0KKyAgICAgICAgICAgICAgICBWYWx1ZXMubGF6eSgoVmFsdWU8Q29sbGVjdGlvbjxDb21wb25lbnRQcm92aWRlcj4+KSAoKSAtPiBnZXRSYW5rZWRDb21wb25lbnRQcm92aWRlcnMoKS5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChSYW5rZWRQcm92aWRlcjo6Z2V0UHJvdmlkZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAucGVlayhwcm92aWRlciAtPiBwcm92aWRlci5pbml0aWFsaXplKGluamVjdGlvbk1hbmFnZXIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkpOworICAgICAgICBzZXJ2ZXJCYWcuc2V0Q29tcG9uZW50UHJvdmlkZXJzKGNvbXBvbmVudFByb3ZpZGVycyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcG9zdEluaXQoSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyLCBCb290c3RyYXBCYWcgYm9vdHN0cmFwQmFnKSB7CisgICAgICAgIFNlcnZlckJvb3RzdHJhcEJhZyBzZXJ2ZXJCYWcgPSAoU2VydmVyQm9vdHN0cmFwQmFnKSBib290c3RyYXBCYWc7CisgICAgICAgIHNlcnZlckJhZy5nZXRDb21wb25lbnRQcm92aWRlcnMoKS5nZXQoKS5mb3JFYWNoKENvbXBvbmVudFByb3ZpZGVyOjpkb25lKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBDb2xsZWN0aW9uPFJhbmtlZFByb3ZpZGVyPENvbXBvbmVudFByb3ZpZGVyPj4gZ2V0UmFua2VkQ29tcG9uZW50UHJvdmlkZXJzKCkgdGhyb3dzIFNlcnZpY2VDb25maWd1cmF0aW9uRXJyb3IgeworICAgICAgICByZXR1cm4gU3RyZWFtU3VwcG9ydC5zdHJlYW0oU2VydmljZUZpbmRlci5maW5kKENvbXBvbmVudFByb3ZpZGVyLmNsYXNzKS5zcGxpdGVyYXRvcigpLCBmYWxzZSkKKyAgICAgICAgICAgICAgICAubWFwKFJhbmtlZFByb3ZpZGVyOjpuZXcpCisgICAgICAgICAgICAgICAgLnNvcnRlZChSQU5LRURfQ09NUEFSQVRPUikKKyAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9Db250YWluZXJFeGNlcHRpb24uamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL0NvbnRhaW5lckV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkOTBmYWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9Db250YWluZXJFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CisKKy8qKgorICogRXhjZXB0aW9uIHRocm93biBieSB0aGUgY29udGFpbmVyIGNvbXBvbmVudHMgaW4gdG8gbm90aWZ5IEplcnNleSBydW50aW1lIGFib3V0CisgKiBhbnkgZXJyb3JzLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBDb250YWluZXJFeGNlcHRpb24gZXh0ZW5kcyBQcm9jZXNzaW5nRXhjZXB0aW9uIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xNzIxMjA5ODkxODYwNTkyNDQwTDsKKworICAgIHB1YmxpYyBDb250YWluZXJFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgICAgIHN1cGVyKGNhdXNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29udGFpbmVyRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOworICAgIH0KKworICAgIHB1YmxpYyBDb250YWluZXJFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgc3VwZXIobWVzc2FnZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvQ29udGFpbmVyRmFjdG9yeS5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvQ29udGFpbmVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MjQxMzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9Db250YWluZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuU2VydmljZUZpbmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbnRhaW5lclByb3ZpZGVyOworCisvKioKKyAqIEZhY3RvcnkgZm9yIGNyZWF0aW5nIHNwZWNpZmljIEhUVFAtYmFzZWQgY29udGFpbmVycy4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIENvbnRhaW5lckZhY3RvcnkgeworCisgICAgLyoqCisgICAgICogUHJldmVudHMgaW5zdGFudGlhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIENvbnRhaW5lckZhY3RvcnkoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgY29udGFpbmVyIGFjY29yZGluZyB0byB0aGUgY2xhc3MgcmVxdWVzdGVkLgorICAgICAqIDxwPgorICAgICAqIFRoZSBsaXN0IG9mIHNlcnZpY2UtcHJvdmlkZXIgc3VwcG9ydGluZyB0aGUge0BsaW5rIENvbnRhaW5lclByb3ZpZGVyfQorICAgICAqIHNlcnZpY2UtcHJvdmlkZXIgd2lsbCBiZSBpdGVyYXRlZCBvdmVyIHVudGlsIG9uZSByZXR1cm5zIGEgbm9uLW51bGwKKyAgICAgKiBjb250YWluZXIgaW5zdGFuY2UuCisgICAgICogPHA+CisgICAgICoKKyAgICAgKiBAcGFyYW0gPFQ+ICAgICAgICAgY29udGFpbmVyIHR5cGUKKyAgICAgKiBAcGFyYW0gdHlwZSAgICAgICAgdHlwZSBvZiB0aGUgY29udGFpbmVyCisgICAgICogQHBhcmFtIGFwcGxpY2F0aW9uIEpBWC1SUyAvIEplcnNleSBhcHBsaWNhdGlvbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBjb250YWluZXIuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIENvbnRhaW5lckV4Y2VwdGlvbiAgICAgICBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgY3JlYXRpbmcgdGhlIGNvbnRhaW5lci4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiBubyBjb250YWluZXIgcHJvdmlkZXIgc3VwcG9ydHMgdGhlIHR5cGUuCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIHN0YXRpYyA8VD4gVCBjcmVhdGVDb250YWluZXIoZmluYWwgQ2xhc3M8VD4gdHlwZSwgZmluYWwgQXBwbGljYXRpb24gYXBwbGljYXRpb24pIHsKKyAgICAgICAgZm9yIChmaW5hbCBDb250YWluZXJQcm92aWRlciBjb250YWluZXJQcm92aWRlciA6IFNlcnZpY2VGaW5kZXIuZmluZChDb250YWluZXJQcm92aWRlci5jbGFzcykpIHsKKyAgICAgICAgICAgIGZpbmFsIFQgY29udGFpbmVyID0gY29udGFpbmVyUHJvdmlkZXIuY3JlYXRlQ29udGFpbmVyKHR5cGUsIGFwcGxpY2F0aW9uKTsKKyAgICAgICAgICAgIGlmIChjb250YWluZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBjb250YWluZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJObyBjb250YWluZXIgcHJvdmlkZXIgc3VwcG9ydHMgdGhlIHR5cGUgIiArIHR5cGUpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvQ29udGFpbmVyRmlsdGVyaW5nU3RhZ2UuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL0NvbnRhaW5lckZpbHRlcmluZ1N0YWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJkZWQwMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL0NvbnRhaW5lckZpbHRlcmluZ1N0YWdlLmphdmEKQEAgLTAsMCArMSwxODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LlByb3ZpZGVyczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLlRyYWNpbmdMb2dnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW9kZWwuaW50ZXJuYWwuUmFua2VkQ29tcGFyYXRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb2RlbC5pbnRlcm5hbC5SYW5rZWRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLmludGVybmFsLkFic3RyYWN0Q2hhaW5hYmxlU3RhZ2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5pbnRlcm5hbC5TdGFnZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLlNlcnZlclRyYWNlRXZlbnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLnByb2Nlc3MuRW5kcG9pbnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLnByb2Nlc3MuTWFwcGFibGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLnByb2Nlc3MuUmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLlJlcXVlc3RFdmVudDsKKworLyoqCisgKiBDb250YWluZXIgZmlsdGVyaW5nIHN0YWdlIHJlc3BvbnNpYmxlIGZvciBleGVjdXRpb24gb2YgcmVxdWVzdCBhbmQgcmVzcG9uc2UgZmlsdGVycworICogb24gZWFjaCByZXF1ZXN0LXJlc3BvbnNlIG1lc3NhZ2UgZXhjaGFuZ2UuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitjbGFzcyBDb250YWluZXJGaWx0ZXJpbmdTdGFnZSBleHRlbmRzIEFic3RyYWN0Q2hhaW5hYmxlU3RhZ2U8UmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0PiB7CisKKyAgICBwcml2YXRlIGZpbmFsIEl0ZXJhYmxlPFJhbmtlZFByb3ZpZGVyPENvbnRhaW5lclJlcXVlc3RGaWx0ZXI+PiByZXF1ZXN0RmlsdGVyczsKKyAgICBwcml2YXRlIGZpbmFsIEl0ZXJhYmxlPFJhbmtlZFByb3ZpZGVyPENvbnRhaW5lclJlc3BvbnNlRmlsdGVyPj4gcmVzcG9uc2VGaWx0ZXJzOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGNvbnRhaW5lciBmaWx0ZXJpbmcgc3RhZ2Ugc3BlY2lmeWluZyBnbG9iYWwgcmVxdWVzdCBhbmQgcmVzcG9uc2UgZmlsdGVycy4gVGhpcyBzdGFnZSBjbGFzcworICAgICAqIGlzIHJldXNlZCBmb3IgYm90aCBwcmUgYW5kIHBvc3QgbWF0Y2ggZmlsdGVyaW5nIHBoYXNlcy4KKyAgICAgKiA8cD4KKyAgICAgKiBBbGwgZ2xvYmFsIHJlc3BvbnNlIGZpbHRlcnMgYXJlIHBhc3NlZCBpbiB0aGUgcHJlLW1hdGNoIHN0YWdlLCBzaW5jZSBpZiBhIHByZS1tYXRjaCBmaWx0ZXIgYWJvcnRzLAorICAgICAqIHJlc3BvbnNlIGZpbHRlcnMgc2hvdWxkIHN0aWxsIGJlIGV4ZWN1dGVkLiBGb3IgdGhlIHBvc3QtbWF0Y2ggZmlsdGVyIHN0YWdlIGNyZWF0aW9uLCB7QGNvZGUgbnVsbH0gaXMgcGFzc2VkCisgICAgICogdG8gdGhlIHJlc3BvbnNlRmlsdGVycyBwYXJhbWV0ZXIuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3RGaWx0ZXJzICBsaXN0IG9mIGdsb2JhbCAodW5ib3VuZCkgcmVxdWVzdCBmaWx0ZXJzIChlaXRoZXIgcHJlIG9yIHBvc3QgbWF0Y2ggLSBkZXBlbmRpbmcgb24gdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICBzdGFnZSBiZWluZyBjcmVhdGVkKS4KKyAgICAgKiBAcGFyYW0gcmVzcG9uc2VGaWx0ZXJzIGxpc3Qgb2YgZ2xvYmFsIHJlc3BvbnNlIGZpbHRlcnMgKGZvciBwcmUtbWF0Y2ggc3RhZ2UpIG9yIHtAY29kZSBudWxsfSAoZm9yIHBvc3QtbWF0Y2gKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHN0YWdlKS4KKyAgICAgKi8KKyAgICBDb250YWluZXJGaWx0ZXJpbmdTdGFnZSgKKyAgICAgICAgICAgIEl0ZXJhYmxlPFJhbmtlZFByb3ZpZGVyPENvbnRhaW5lclJlcXVlc3RGaWx0ZXI+PiByZXF1ZXN0RmlsdGVycywKKyAgICAgICAgICAgIEl0ZXJhYmxlPFJhbmtlZFByb3ZpZGVyPENvbnRhaW5lclJlc3BvbnNlRmlsdGVyPj4gcmVzcG9uc2VGaWx0ZXJzKSB7CisKKyAgICAgICAgdGhpcy5yZXF1ZXN0RmlsdGVycyA9IHJlcXVlc3RGaWx0ZXJzOworICAgICAgICB0aGlzLnJlc3BvbnNlRmlsdGVycyA9IHJlc3BvbnNlRmlsdGVyczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgQ29udGludWF0aW9uPFJlcXVlc3RQcm9jZXNzaW5nQ29udGV4dD4gYXBwbHkoUmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgSXRlcmFibGU8Q29udGFpbmVyUmVxdWVzdEZpbHRlcj4gc29ydGVkUmVxdWVzdEZpbHRlcnM7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gcG9zdE1hdGNoaW5nID0gcmVzcG9uc2VGaWx0ZXJzID09IG51bGw7CisKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVxdWVzdCByZXF1ZXN0ID0gY29udGV4dC5yZXF1ZXN0KCk7CisKKyAgICAgICAgZmluYWwgVHJhY2luZ0xvZ2dlciB0cmFjaW5nTG9nZ2VyID0gVHJhY2luZ0xvZ2dlci5nZXRJbnN0YW5jZShyZXF1ZXN0KTsKKyAgICAgICAgaWYgKHBvc3RNYXRjaGluZykgeworICAgICAgICAgICAgLy8gcG9zdC1tYXRjaGluZworICAgICAgICAgICAgZmluYWwgQXJyYXlMaXN0PEl0ZXJhYmxlPFJhbmtlZFByb3ZpZGVyPENvbnRhaW5lclJlcXVlc3RGaWx0ZXI+Pj4gcmFua2VkUHJvdmlkZXJzID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDw+KDIpOworICAgICAgICAgICAgcmFua2VkUHJvdmlkZXJzLmFkZChyZXF1ZXN0RmlsdGVycyk7CisgICAgICAgICAgICByYW5rZWRQcm92aWRlcnMuYWRkKHJlcXVlc3QuZ2V0UmVxdWVzdEZpbHRlcnMoKSk7CisgICAgICAgICAgICBzb3J0ZWRSZXF1ZXN0RmlsdGVycyA9IFByb3ZpZGVycy5tZXJnZUFuZFNvcnRSYW5rZWRQcm92aWRlcnMoCisgICAgICAgICAgICAgICAgICAgIG5ldyBSYW5rZWRDb21wYXJhdG9yPENvbnRhaW5lclJlcXVlc3RGaWx0ZXI+KCksIHJhbmtlZFByb3ZpZGVycyk7CisKKyAgICAgICAgICAgIGNvbnRleHQubW9uaXRvcmluZ0V2ZW50QnVpbGRlcigpLnNldENvbnRhaW5lclJlcXVlc3RGaWx0ZXJzKHNvcnRlZFJlcXVlc3RGaWx0ZXJzKTsKKyAgICAgICAgICAgIGNvbnRleHQudHJpZ2dlckV2ZW50KFJlcXVlc3RFdmVudC5UeXBlLlJFUVVFU1RfTUFUQ0hFRCk7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHByZS1tYXRjaGluZyAocmVzcG9uc2UgZmlsdGVyIHN0YWdlIGlzIHB1c2hlZCBpbiBwcmUtbWF0Y2hpbmcgcGhhc2UsIHNvIHRoYXQgaWYgcHJlLW1hdGNoaW5nIGZpbHRlcgorICAgICAgICAgICAgLy8gdGhyb3dzIGV4Y2VwdGlvbiwgcmVzcG9uc2UgZmlsdGVycyBnZXQgc3RpbGwgaW52b2tlZCkKKyAgICAgICAgICAgIGNvbnRleHQucHVzaChuZXcgUmVzcG9uc2VGaWx0ZXJTdGFnZShjb250ZXh0LCByZXNwb25zZUZpbHRlcnMsIHRyYWNpbmdMb2dnZXIpKTsKKyAgICAgICAgICAgIHNvcnRlZFJlcXVlc3RGaWx0ZXJzID0gUHJvdmlkZXJzLnNvcnRSYW5rZWRQcm92aWRlcnMobmV3IFJhbmtlZENvbXBhcmF0b3I8Q29udGFpbmVyUmVxdWVzdEZpbHRlcj4oKSwgcmVxdWVzdEZpbHRlcnMpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgVHJhY2luZ0xvZ2dlci5FdmVudCBzdW1tYXJ5RXZlbnQgPQorICAgICAgICAgICAgICAgIChwb3N0TWF0Y2hpbmcgPyBTZXJ2ZXJUcmFjZUV2ZW50LlJFUVVFU1RfRklMVEVSX1NVTU1BUlkgOiBTZXJ2ZXJUcmFjZUV2ZW50LlBSRV9NQVRDSF9TVU1NQVJZKTsKKyAgICAgICAgZmluYWwgbG9uZyB0aW1lc3RhbXAgPSB0cmFjaW5nTG9nZ2VyLnRpbWVzdGFtcChzdW1tYXJ5RXZlbnQpOworICAgICAgICBpbnQgcHJvY2Vzc2VkQ291bnQgPSAwOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgVHJhY2luZ0xvZ2dlci5FdmVudCBmaWx0ZXJFdmVudCA9IChwb3N0TWF0Y2hpbmcgPyBTZXJ2ZXJUcmFjZUV2ZW50LlJFUVVFU1RfRklMVEVSIDogU2VydmVyVHJhY2VFdmVudC5QUkVfTUFUQ0gpOworICAgICAgICAgICAgZm9yIChDb250YWluZXJSZXF1ZXN0RmlsdGVyIGZpbHRlciA6IHNvcnRlZFJlcXVlc3RGaWx0ZXJzKSB7CisgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBmaWx0ZXJUaW1lc3RhbXAgPSB0cmFjaW5nTG9nZ2VyLnRpbWVzdGFtcChmaWx0ZXJFdmVudCk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyLmZpbHRlcihyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYXBwYWJsZUV4Y2VwdGlvbihleGNlcHRpb24pOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZENvdW50Kys7CisgICAgICAgICAgICAgICAgICAgIHRyYWNpbmdMb2dnZXIubG9nRHVyYXRpb24oZmlsdGVyRXZlbnQsIGZpbHRlclRpbWVzdGFtcCwgZmlsdGVyKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSBhYm9ydFJlc3BvbnNlID0gcmVxdWVzdC5nZXRBYm9ydFJlc3BvbnNlKCk7CisgICAgICAgICAgICAgICAgaWYgKGFib3J0UmVzcG9uc2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBhYm9ydCBhY2NlcHRpbmcgJiByZXR1cm4gcmVzcG9uc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbnRpbnVhdGlvbi5vZihjb250ZXh0LCBTdGFnZXMuYXNTdGFnZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRW5kcG9pbnQoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgQ29udGFpbmVyUmVzcG9uc2UgYXBwbHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbnRhaW5lclJlc3BvbnNlKHJlcXVlc3RDb250ZXh0LnJlcXVlc3QoKSwgYWJvcnRSZXNwb25zZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHBvc3RNYXRjaGluZykgeworICAgICAgICAgICAgICAgIGNvbnRleHQudHJpZ2dlckV2ZW50KFJlcXVlc3RFdmVudC5UeXBlLlJFUVVFU1RfRklMVEVSRUQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJhY2luZ0xvZ2dlci5sb2dEdXJhdGlvbihzdW1tYXJ5RXZlbnQsIHRpbWVzdGFtcCwgcHJvY2Vzc2VkQ291bnQpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIENvbnRpbnVhdGlvbi5vZihjb250ZXh0LCBnZXREZWZhdWx0TmV4dCgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSZXNwb25zZUZpbHRlclN0YWdlIGV4dGVuZHMgQWJzdHJhY3RDaGFpbmFibGVTdGFnZTxDb250YWluZXJSZXNwb25zZT4geworICAgICAgICAvLyBUT0RPIHJlbW92ZSB0aGUgZmllbGQgLSBwcm9jZXNzaW5nIGNvbnRleHQgc2hvdWxkIGJlIG1hZGUgYXZhaWxhYmxlIG9uIHRoZSByZXNwb25zZSBjaGFpbiBkaXJlY3RseS4KKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZXF1ZXN0UHJvY2Vzc2luZ0NvbnRleHQgcHJvY2Vzc2luZ0NvbnRleHQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgSXRlcmFibGU8UmFua2VkUHJvdmlkZXI8Q29udGFpbmVyUmVzcG9uc2VGaWx0ZXI+PiBmaWx0ZXJzOworICAgICAgICBwcml2YXRlIGZpbmFsIFRyYWNpbmdMb2dnZXIgdHJhY2luZ0xvZ2dlcjsKKworICAgICAgICBwcml2YXRlIFJlc3BvbnNlRmlsdGVyU3RhZ2UoZmluYWwgUmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0IHByb2Nlc3NpbmdDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSXRlcmFibGU8UmFua2VkUHJvdmlkZXI8Q29udGFpbmVyUmVzcG9uc2VGaWx0ZXI+PiBmaWx0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVHJhY2luZ0xvZ2dlciB0cmFjaW5nTG9nZ2VyKSB7CisgICAgICAgICAgICB0aGlzLnByb2Nlc3NpbmdDb250ZXh0ID0gcHJvY2Vzc2luZ0NvbnRleHQ7CisgICAgICAgICAgICB0aGlzLmZpbHRlcnMgPSBmaWx0ZXJzOworICAgICAgICAgICAgdGhpcy50cmFjaW5nTG9nZ2VyID0gdHJhY2luZ0xvZ2dlcjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgcHVibGljIENvbnRpbnVhdGlvbjxDb250YWluZXJSZXNwb25zZT4gYXBwbHkoQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2VDb250ZXh0KSB7CisgICAgICAgICAgICBmaW5hbCBBcnJheUxpc3Q8SXRlcmFibGU8UmFua2VkUHJvdmlkZXI8Q29udGFpbmVyUmVzcG9uc2VGaWx0ZXI+Pj4gcmFua2VkUHJvdmlkZXJzID0gbmV3IEFycmF5TGlzdDw+KDIpOworICAgICAgICAgICAgcmFua2VkUHJvdmlkZXJzLmFkZChmaWx0ZXJzKTsKKyAgICAgICAgICAgIHJhbmtlZFByb3ZpZGVycy5hZGQocmVzcG9uc2VDb250ZXh0LmdldFJlcXVlc3RDb250ZXh0KCkuZ2V0UmVzcG9uc2VGaWx0ZXJzKCkpOworICAgICAgICAgICAgSXRlcmFibGU8Q29udGFpbmVyUmVzcG9uc2VGaWx0ZXI+IHNvcnRlZFJlc3BvbnNlRmlsdGVycyA9IFByb3ZpZGVycy5tZXJnZUFuZFNvcnRSYW5rZWRQcm92aWRlcnMoCisgICAgICAgICAgICAgICAgICAgIG5ldyBSYW5rZWRDb21wYXJhdG9yPENvbnRhaW5lclJlc3BvbnNlRmlsdGVyPihSYW5rZWRDb21wYXJhdG9yLk9yZGVyLkRFU0NFTkRJTkcpLCByYW5rZWRQcm92aWRlcnMpOworCisgICAgICAgICAgICBmaW5hbCBDb250YWluZXJSZXF1ZXN0IHJlcXVlc3QgPSByZXNwb25zZUNvbnRleHQuZ2V0UmVxdWVzdENvbnRleHQoKTsKKyAgICAgICAgICAgIHByb2Nlc3NpbmdDb250ZXh0Lm1vbml0b3JpbmdFdmVudEJ1aWxkZXIoKS5zZXRDb250YWluZXJSZXNwb25zZUZpbHRlcnMoc29ydGVkUmVzcG9uc2VGaWx0ZXJzKTsKKyAgICAgICAgICAgIHByb2Nlc3NpbmdDb250ZXh0LnRyaWdnZXJFdmVudChSZXF1ZXN0RXZlbnQuVHlwZS5SRVNQX0ZJTFRFUlNfU1RBUlQpOworCisgICAgICAgICAgICBmaW5hbCBsb25nIHRpbWVzdGFtcCA9IHRyYWNpbmdMb2dnZXIudGltZXN0YW1wKFNlcnZlclRyYWNlRXZlbnQuUkVTUE9OU0VfRklMVEVSX1NVTU1BUlkpOworICAgICAgICAgICAgaW50IHByb2Nlc3NlZENvdW50ID0gMDsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZm9yIChDb250YWluZXJSZXNwb25zZUZpbHRlciBmaWx0ZXIgOiBzb3J0ZWRSZXNwb25zZUZpbHRlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBmaWx0ZXJUaW1lc3RhbXAgPSB0cmFjaW5nTG9nZ2VyLnRpbWVzdGFtcChTZXJ2ZXJUcmFjZUV2ZW50LlJFU1BPTlNFX0ZJTFRFUik7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIuZmlsdGVyKHJlcXVlc3QsIHJlc3BvbnNlQ29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1hcHBhYmxlRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NlZENvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFjaW5nTG9nZ2VyLmxvZ0R1cmF0aW9uKFNlcnZlclRyYWNlRXZlbnQuUkVTUE9OU0VfRklMVEVSLCBmaWx0ZXJUaW1lc3RhbXAsIGZpbHRlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHByb2Nlc3NpbmdDb250ZXh0LnRyaWdnZXJFdmVudChSZXF1ZXN0RXZlbnQuVHlwZS5SRVNQX0ZJTFRFUlNfRklOSVNIRUQpOworICAgICAgICAgICAgICAgIHRyYWNpbmdMb2dnZXIubG9nRHVyYXRpb24oU2VydmVyVHJhY2VFdmVudC5SRVNQT05TRV9GSUxURVJfU1VNTUFSWSwgdGltZXN0YW1wLCBwcm9jZXNzZWRDb3VudCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBDb250aW51YXRpb24ub2YocmVzcG9uc2VDb250ZXh0LCBnZXREZWZhdWx0TmV4dCgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL0NvbnRhaW5lck1lc3NhZ2VCb2R5V29ya2Vyc0luaXRpYWxpemVyLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9Db250YWluZXJNZXNzYWdlQm9keVdvcmtlcnNJbml0aWFsaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNGVjODYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9Db250YWluZXJNZXNzYWdlQm9keVdvcmtlcnNJbml0aWFsaXplci5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyOworCitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLk1lc3NhZ2VCb2R5V29ya2VyczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwucHJvY2Vzcy5SZXF1ZXN0UHJvY2Vzc2luZ0NvbnRleHQ7CisKKy8qKgorICogRnVuY3Rpb24gdGhhdCBjYW4gYmUgcHV0IHRvIGFuIGFjY2VwdG9yIGNoYWluIHRvIHByb3Blcmx5IGluaXRpYWxpemUKKyAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLk1lc3NhZ2VCb2R5V29ya2Vyc30gaW5zdGFuY2Ugb24gYSBjdXJyZW50IHJlcXVlc3QgYW5kIHJlc3BvbnNlLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBDb250YWluZXJNZXNzYWdlQm9keVdvcmtlcnNJbml0aWFsaXplcgorICAgICAgICBpbXBsZW1lbnRzIEZ1bmN0aW9uPFJlcXVlc3RQcm9jZXNzaW5nQ29udGV4dCwgUmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0PiB7CisgICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxNZXNzYWdlQm9keVdvcmtlcnM+IHdvcmtlcnNGYWN0b3J5OworCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5NZXNzYWdlQm9keVdvcmtlcnN9IGluaXRpYWxpemF0aW9uIGZ1bmN0aW9uIGZvciByZXF1ZXN0cworICAgICAqIGFuZCByZXNwb25zZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd29ya2Vyc0ZhY3Rvcnkge0Bjb2RlIE1lc3NhZ2VCb2R5V29ya2Vyc30gZmFjdG9yeS4KKyAgICAgKi8KKyAgICBASW5qZWN0CisgICAgcHVibGljIENvbnRhaW5lck1lc3NhZ2VCb2R5V29ya2Vyc0luaXRpYWxpemVyKAorICAgICAgICAgICAgUHJvdmlkZXI8TWVzc2FnZUJvZHlXb3JrZXJzPiB3b3JrZXJzRmFjdG9yeSkgeworICAgICAgICB0aGlzLndvcmtlcnNGYWN0b3J5ID0gd29ya2Vyc0ZhY3Rvcnk7CisgICAgfQorCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0IGFwcGx5KFJlcXVlc3RQcm9jZXNzaW5nQ29udGV4dCByZXF1ZXN0Q29udGV4dCkgeworICAgICAgICByZXF1ZXN0Q29udGV4dC5yZXF1ZXN0KCkuc2V0V29ya2Vycyh3b3JrZXJzRmFjdG9yeS5nZXQoKSk7CisKKyAgICAgICAgcmV0dXJuIHJlcXVlc3RDb250ZXh0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL0NvbnRhaW5lclByb3ZpZGVyQ29uZmlndXJhdG9yLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9Db250YWluZXJQcm92aWRlckNvbmZpZ3VyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYTY5NjYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9Db250YWluZXJQcm92aWRlckNvbmZpZ3VyYXRvci5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyOworCitpbXBvcnQgamF2YXgud3MucnMuUnVudGltZVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuQWJzdHJhY3RTZXJ2aWNlRmluZGVyQ29uZmlndXJhdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkJvb3RzdHJhcEJhZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQmluZGluZ3M7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuc3BpLkF1dG9EaXNjb3ZlcmFibGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5Db250YWluZXJQcm92aWRlcjsKKworLyoqCisgKiBDb25maWd1cmF0b3Igd2hpY2ggaW5pdGlhbGl6ZXMgYW5kIHJlZ2lzdGVyIHtAbGluayBDb250YWluZXJQcm92aWRlcn0gaW5zdGFuY2VzIGludG8ge0BsaW5rIEluamVjdGlvbk1hbmFnZXJ9IGFuZAorICoge0BsaW5rIEJvb3RzdHJhcEJhZ30uCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK2NsYXNzIENvbnRhaW5lclByb3ZpZGVyQ29uZmlndXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RTZXJ2aWNlRmluZGVyQ29uZmlndXJhdG9yPENvbnRhaW5lclByb3ZpZGVyPiB7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgY29uZmlndXJhdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIHJ1bnRpbWVUeXBlIHJ1bnRpbWUgKGNsaWVudCBvciBzZXJ2ZXIpIHdoZXJlIHRoZSBzZXJ2aWNlIGZpbmRlciBiaW5kZXIgaXMgdXNlZC4KKyAgICAgKi8KKyAgICBDb250YWluZXJQcm92aWRlckNvbmZpZ3VyYXRvcihSdW50aW1lVHlwZSBydW50aW1lVHlwZSkgeworICAgICAgICBzdXBlcihDb250YWluZXJQcm92aWRlci5jbGFzcywgcnVudGltZVR5cGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGluaXQoSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyLCBCb290c3RyYXBCYWcgYm9vdHN0cmFwQmFnKSB7CisgICAgICAgIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiA9IGJvb3RzdHJhcEJhZy5nZXRDb25maWd1cmF0aW9uKCk7CisgICAgICAgIGxvYWRJbXBsZW1lbnRhdGlvbnMoY29uZmlndXJhdGlvbi5nZXRQcm9wZXJ0aWVzKCkpCisgICAgICAgICAgICAgICAgLmZvckVhY2goaW1wbENsYXNzIC0+IGluamVjdGlvbk1hbmFnZXIucmVnaXN0ZXIoQmluZGluZ3Muc2VydmljZShpbXBsQ2xhc3MpLnRvKEF1dG9EaXNjb3ZlcmFibGUuY2xhc3MpKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvQ29udGFpbmVyUmVxdWVzdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvQ29udGFpbmVyUmVxdWVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkYjg2YWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9Db250YWluZXJSZXF1ZXN0LmphdmEKQEAgLTAsMCArMSw4MDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db29raWU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5FbnRpdHlUYWc7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVxdWVzdDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuU2VjdXJpdHlDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVmFyaWFudDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUmVhZGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuUHJvcGVydGllc0RlbGVnYXRlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhLlByZWNvbmRpdGlvbnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLlJlZjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uUmVmczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkFjY2VwdGFibGVNZWRpYVR5cGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5IdHRwSGVhZGVyUmVhZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuSW5ib3VuZE1lc3NhZ2VDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuTGFuZ3VhZ2VUYWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5NYXRjaGluZ0VudGl0eVRhZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLk91dGJvdW5kSmF4cnNSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLlRyYWNpbmdBd2FyZVByb3BlcnRpZXNEZWxlZ2F0ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLlZhcmlhbnRTZWxlY3RvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb2RlbC5pbnRlcm5hbC5SYW5rZWRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLkluZmxlY3RvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLlByb2Nlc3NpbmdQcm92aWRlcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLnByb2Nlc3MuUmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5yb3V0aW5nLlVyaVJvdXRpbmdDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1ldGhvZEludm9rZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5Db250YWluZXJSZXNwb25zZVdyaXRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLlJlcXVlc3RTY29wZWRJbml0aWFsaXplcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS51cmkuVXJpQ29tcG9uZW50OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnVyaS5pbnRlcm5hbC5KZXJzZXlVcmlCdWlsZGVyOworCisvKioKKyAqIEplcnNleSBjb250YWluZXIgcmVxdWVzdCBjb250ZXh0LgorICogPHAvPgorICogQW4gaW5zdGFuY2Ugb2YgdGhlIHJlcXVlc3QgY29udGV4dCBpcyBwYXNzZWQgYnkgdGhlIGNvbnRhaW5lciB0byB0aGUKKyAqIHtAbGluayBBcHBsaWNhdGlvbkhhbmRsZXJ9IGZvciBlYWNoIGluY29taW5nIGNsaWVudCByZXF1ZXN0LgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBDb250YWluZXJSZXF1ZXN0IGV4dGVuZHMgSW5ib3VuZE1lc3NhZ2VDb250ZXh0CisgICAgICAgIGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdENvbnRleHQsIFJlcXVlc3QsIEh0dHBIZWFkZXJzLCBQcm9wZXJ0aWVzRGVsZWdhdGUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIERFRkFVTFRfQkFTRV9VUkkgPSBVUkkuY3JlYXRlKCIvIik7CisKKyAgICAvLyBSZXF1ZXN0LXNjb3BlZCBwcm9wZXJ0aWVzIGRlbGVnYXRlCisgICAgcHJpdmF0ZSBmaW5hbCBQcm9wZXJ0aWVzRGVsZWdhdGUgcHJvcGVydGllc0RlbGVnYXRlOworICAgIC8vIFJvdXRpbmcgY29udGV4dCBhbmQgVXJpSW5mbyBpbXBsZW1lbnRhdGlvbgorICAgIHByaXZhdGUgZmluYWwgVXJpUm91dGluZ0NvbnRleHQgdXJpUm91dGluZ0NvbnRleHQ7CisgICAgLy8gQWJzb2x1dGUgYXBwbGljYXRpb24gcm9vdCBVUkkgKGJhc2UgVVJJKQorICAgIHByaXZhdGUgVVJJIGJhc2VVcmk7CisgICAgLy8gQWJzb2x1dGUgcmVxdWVzdCBVUkkKKyAgICBwcml2YXRlIFVSSSByZXF1ZXN0VXJpOworICAgIC8vIExhemlseSBjb21wdXRlZCBlbmNvZGVkIHJlcXVlc3QgcGF0aCAocmVsYXRpdmUgdG8gYXBwbGljYXRpb24gcm9vdCBVUkkpCisgICAgcHJpdmF0ZSBTdHJpbmcgZW5jb2RlZFJlbGF0aXZlUGF0aCA9IG51bGw7CisgICAgLy8gTGF6aWx5IGNvbXB1dGVkIGRlY29kZWQgcmVxdWVzdCBwYXRoIChyZWxhdGl2ZSB0byBhcHBsaWNhdGlvbiByb290IFVSSSkKKyAgICBwcml2YXRlIFN0cmluZyBkZWNvZGVkUmVsYXRpdmVQYXRoID0gbnVsbDsKKyAgICAvLyBMYXppbHkgY29tcHV0ZWQgImFic29sdXRlIHBhdGgiIFVSSQorICAgIHByaXZhdGUgVVJJIGFic29sdXRlUGF0aFVyaSA9IG51bGw7CisgICAgLy8gUmVxdWVzdCBtZXRob2QKKyAgICBwcml2YXRlIFN0cmluZyBodHRwTWV0aG9kOworICAgIC8vIFJlcXVlc3Qgc2VjdXJpdHkgY29udGV4dAorICAgIHByaXZhdGUgU2VjdXJpdHlDb250ZXh0IHNlY3VyaXR5Q29udGV4dDsKKyAgICAvLyBSZXF1ZXN0IGZpbHRlciBjaGFpbiBleGVjdXRpb24gYWJvcnRpbmcgcmVzcG9uc2UKKyAgICBwcml2YXRlIFJlc3BvbnNlIGFib3J0UmVzcG9uc2U7CisgICAgLy8gVmFyeSBoZWFkZXIgdmFsdWUgdG8gYmUgc2V0IGluIHRoZSByZXNwb25zZQorICAgIHByaXZhdGUgU3RyaW5nIHZhcnlWYWx1ZTsKKyAgICAvLyBQcm9jZXNzaW5nIHByb3ZpZGVycworICAgIHByaXZhdGUgUHJvY2Vzc2luZ1Byb3ZpZGVycyBwcm9jZXNzaW5nUHJvdmlkZXJzOworICAgIC8vIEN1c3RvbSBKZXJzZXkgY29udGFpbmVyIHJlcXVlc3Qgc2NvcGVkIGluaXRpYWxpemVyCisgICAgcHJpdmF0ZSBSZXF1ZXN0U2NvcGVkSW5pdGlhbGl6ZXIgcmVxdWVzdFNjb3BlZEluaXRpYWxpemVyOworICAgIC8vIFJlcXVlc3Qtc2NvcGVkIHJlc3BvbnNlIHdyaXRlciBvZiB0aGUgaW52b2tpbmcgY29udGFpbmVyCisgICAgcHJpdmF0ZSBDb250YWluZXJSZXNwb25zZVdyaXRlciByZXNwb25zZVdyaXRlcjsKKyAgICAvLyBUcnVlIGlmIHRoZSByZXF1ZXN0IGlzIHVzZWQgaW4gdGhlIHJlc3BvbnNlIHByb2Nlc3NpbmcgcGhhc2UgKGZvciBleGFtcGxlIGluIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyKQorICAgIHByaXZhdGUgYm9vbGVhbiBpblJlc3BvbnNlUHJvY2Vzc2luZ1BoYXNlOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVSUk9SX1JFUVVFU1RfU0VUX0VOVElUWV9TVFJFQU1fSU5fUkVTUE9OU0VfUEhBU0UgPQorICAgICAgICAgICAgTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfUkVRVUVTVF9TRVRfRU5USVRZX1NUUkVBTV9JTl9SRVNQT05TRV9QSEFTRSgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFUlJPUl9SRVFVRVNUX1NFVF9TRUNVUklUWV9DT05URVhUX0lOX1JFU1BPTlNFX1BIQVNFID0KKyAgICAgICAgICAgIExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX1JFUVVFU1RfU0VUX1NFQ1VSSVRZX0NPTlRFWFRfSU5fUkVTUE9OU0VfUEhBU0UoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVJST1JfUkVRVUVTVF9BQk9SVF9JTl9SRVNQT05TRV9QSEFTRSA9CisgICAgICAgICAgICBMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9SRVFVRVNUX0FCT1JUX0lOX1JFU1BPTlNFX1BIQVNFKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1FVEhPRF9QQVJBTUVURVJfQ0FOTk9UX0JFX05VTExfT1JfRU1QVFkgPQorICAgICAgICAgICAgTG9jYWxpemF0aW9uTWVzc2FnZXMuTUVUSE9EX1BBUkFNRVRFUl9DQU5OT1RfQkVfTlVMTF9PUl9FTVBUWSgidmFyaWFudHMiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX1BBUkFNRVRFUl9DQU5OT1RfQkVfTlVMTF9FVEFHID0KKyAgICAgICAgICAgIExvY2FsaXphdGlvbk1lc3NhZ2VzLk1FVEhPRF9QQVJBTUVURVJfQ0FOTk9UX0JFX05VTEwoImVUYWciKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVUSE9EX1BBUkFNRVRFUl9DQU5OT1RfQkVfTlVMTF9MQVNUX01PRElGSUVEID0KKyAgICAgICAgICAgIExvY2FsaXphdGlvbk1lc3NhZ2VzLk1FVEhPRF9QQVJBTUVURVJfQ0FOTk9UX0JFX05VTEwoImxhc3RNb2RpZmllZCIpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyBKZXJzZXkgY29udGFpbmVyIHJlcXVlc3QgY29udGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiYXNlVXJpICAgICAgICAgICAgYmFzZSBhcHBsaWNhdGlvbiBVUkkuCisgICAgICogQHBhcmFtIHJlcXVlc3RVcmkgICAgICAgICByZXF1ZXN0IFVSSS4KKyAgICAgKiBAcGFyYW0gaHR0cE1ldGhvZCAgICAgICAgIHJlcXVlc3QgSFRUUCBtZXRob2QgbmFtZS4KKyAgICAgKiBAcGFyYW0gc2VjdXJpdHlDb250ZXh0ICAgIHNlY3VyaXR5IGNvbnRleHQgb2YgdGhlIGN1cnJlbnQgcmVxdWVzdC4gTXVzdCBub3QgYmUge0Bjb2RlIG51bGx9LgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHtAbGluayBTZWN1cml0eUNvbnRleHQjZ2V0VXNlclByaW5jaXBhbCgpfSBtdXN0IHJldHVybgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIG51bGx9IGlmIHRoZSBjdXJyZW50IHJlcXVlc3QgaGFzIG5vdCBiZWVuIGF1dGhlbnRpY2F0ZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IHRoZSBjb250YWluZXIuCisgICAgICogQHBhcmFtIHByb3BlcnRpZXNEZWxlZ2F0ZSBjdXN0b20ge0BsaW5rIFByb3BlcnRpZXNEZWxlZ2F0ZSBwcm9wZXJ0aWVzIGRlbGVnYXRlfQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYmUgdXNlZCBieSB0aGUgY29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGFpbmVyUmVxdWVzdCgKKyAgICAgICAgICAgIGZpbmFsIFVSSSBiYXNlVXJpLAorICAgICAgICAgICAgZmluYWwgVVJJIHJlcXVlc3RVcmksCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaHR0cE1ldGhvZCwKKyAgICAgICAgICAgIGZpbmFsIFNlY3VyaXR5Q29udGV4dCBzZWN1cml0eUNvbnRleHQsCisgICAgICAgICAgICBmaW5hbCBQcm9wZXJ0aWVzRGVsZWdhdGUgcHJvcGVydGllc0RlbGVnYXRlKSB7CisgICAgICAgIHN1cGVyKHRydWUpOworCisgICAgICAgIHRoaXMuYmFzZVVyaSA9IGJhc2VVcmkgPT0gbnVsbCA/IERFRkFVTFRfQkFTRV9VUkkgOiBiYXNlVXJpLm5vcm1hbGl6ZSgpOworICAgICAgICB0aGlzLnJlcXVlc3RVcmkgPSByZXF1ZXN0VXJpOworICAgICAgICB0aGlzLmh0dHBNZXRob2QgPSBodHRwTWV0aG9kOworICAgICAgICB0aGlzLnNlY3VyaXR5Q29udGV4dCA9IHNlY3VyaXR5Q29udGV4dDsKKyAgICAgICAgdGhpcy5wcm9wZXJ0aWVzRGVsZWdhdGUgPSBuZXcgVHJhY2luZ0F3YXJlUHJvcGVydGllc0RlbGVnYXRlKHByb3BlcnRpZXNEZWxlZ2F0ZSk7CisgICAgICAgIHRoaXMudXJpUm91dGluZ0NvbnRleHQgPSBuZXcgVXJpUm91dGluZ0NvbnRleHQodGhpcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgY3VzdG9tIGNvbnRhaW5lciBleHRlbnNpb25zIGluaXRpYWxpemVyIGZvciB0aGUgY3VycmVudCByZXF1ZXN0LgorICAgICAqIDxwLz4KKyAgICAgKiBUaGUgaW5pdGlhbGl6ZXIgaXMgZ3VhcmFudGVlZCB0byBiZSBydW4gZnJvbSB3aXRoaW4gdGhlIHJlcXVlc3Qgc2NvcGUgb2YKKyAgICAgKiB0aGUgY3VycmVudCByZXF1ZXN0LgorICAgICAqCisgICAgICogQHJldHVybiBjdXN0b20gY29udGFpbmVyIGV4dGVuc2lvbnMgaW5pdGlhbGl6ZXIgb3Ige0Bjb2RlIG51bGx9IGlmIG5vdAorICAgICAqIGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVxdWVzdFNjb3BlZEluaXRpYWxpemVyIGdldFJlcXVlc3RTY29wZWRJbml0aWFsaXplcigpIHsKKyAgICAgICAgcmV0dXJuIHJlcXVlc3RTY29wZWRJbml0aWFsaXplcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBjdXN0b20gY29udGFpbmVyIGV4dGVuc2lvbnMgaW5pdGlhbGl6ZXIgZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QuCisgICAgICogPHAvPgorICAgICAqIFRoZSBpbml0aWFsaXplciBpcyBndWFyYW50ZWVkIHRvIGJlIHJ1biBmcm9tIHdpdGhpbiB0aGUgcmVxdWVzdCBzY29wZSBvZgorICAgICAqIHRoZSBjdXJyZW50IHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdFNjb3BlZEluaXRpYWxpemVyIGN1c3RvbSBjb250YWluZXIgZXh0ZW5zaW9ucyBpbml0aWFsaXplci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0U2NvcGVkSW5pdGlhbGl6ZXIoZmluYWwgUmVxdWVzdFNjb3BlZEluaXRpYWxpemVyIHJlcXVlc3RTY29wZWRJbml0aWFsaXplcikgeworICAgICAgICB0aGlzLnJlcXVlc3RTY29wZWRJbml0aWFsaXplciA9IHJlcXVlc3RTY29wZWRJbml0aWFsaXplcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNvbnRhaW5lciByZXNwb25zZSB3cml0ZXIgZm9yIHRoZSBjdXJyZW50IHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGNvbnRhaW5lciByZXNwb25zZSB3cml0ZXIuCisgICAgICovCisgICAgcHVibGljIENvbnRhaW5lclJlc3BvbnNlV3JpdGVyIGdldFJlc3BvbnNlV3JpdGVyKCkgeworICAgICAgICByZXR1cm4gcmVzcG9uc2VXcml0ZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjb250YWluZXIgcmVzcG9uc2Ugd3JpdGVyIGZvciB0aGUgY3VycmVudCByZXF1ZXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHJlc3BvbnNlV3JpdGVyIGNvbnRhaW5lciByZXNwb25zZSB3cml0ZXIuIE11c3Qgbm90IGJlIHtAY29kZSBudWxsfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRXcml0ZXIoZmluYWwgQ29udGFpbmVyUmVzcG9uc2VXcml0ZXIgcmVzcG9uc2VXcml0ZXIpIHsKKyAgICAgICAgdGhpcy5yZXNwb25zZVdyaXRlciA9IHJlc3BvbnNlV3JpdGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgZW50aXR5IGZyb20gYSBjb250ZXh0IGVudGl0eSBpbnB1dCBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gPFQ+ICAgICBlbnRpdHkgSmF2YSBvYmplY3QgdHlwZS4KKyAgICAgKiBAcGFyYW0gcmF3VHlwZSByYXcgSmF2YSBlbnRpdHkgdHlwZS4KKyAgICAgKiBAcmV0dXJuIGVudGl0eSByZWFkIGZyb20gYSBjb250ZXh0IGVudGl0eSBpbnB1dCBzdHJlYW0uCisgICAgICovCisgICAgcHVibGljIDxUPiBUIHJlYWRFbnRpdHkoZmluYWwgQ2xhc3M8VD4gcmF3VHlwZSkgeworICAgICAgICByZXR1cm4gcmVhZEVudGl0eShyYXdUeXBlLCBwcm9wZXJ0aWVzRGVsZWdhdGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgZW50aXR5IGZyb20gYSBjb250ZXh0IGVudGl0eSBpbnB1dCBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gPFQ+ICAgICAgICAgZW50aXR5IEphdmEgb2JqZWN0IHR5cGUuCisgICAgICogQHBhcmFtIHJhd1R5cGUgICAgIHJhdyBKYXZhIGVudGl0eSB0eXBlLgorICAgICAqIEBwYXJhbSBhbm5vdGF0aW9ucyBlbnRpdHkgYW5ub3RhdGlvbnMuCisgICAgICogQHJldHVybiBlbnRpdHkgcmVhZCBmcm9tIGEgY29udGV4dCBlbnRpdHkgaW5wdXQgc3RyZWFtLgorICAgICAqLworICAgIHB1YmxpYyA8VD4gVCByZWFkRW50aXR5KGZpbmFsIENsYXNzPFQ+IHJhd1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucykgeworICAgICAgICByZXR1cm4gc3VwZXIucmVhZEVudGl0eShyYXdUeXBlLCBhbm5vdGF0aW9ucywgcHJvcGVydGllc0RlbGVnYXRlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGVudGl0eSBmcm9tIGEgY29udGV4dCBlbnRpdHkgaW5wdXQgc3RyZWFtLgorICAgICAqCisgICAgICogQHBhcmFtIDxUPiAgICAgZW50aXR5IEphdmEgb2JqZWN0IHR5cGUuCisgICAgICogQHBhcmFtIHJhd1R5cGUgcmF3IEphdmEgZW50aXR5IHR5cGUuCisgICAgICogQHBhcmFtIHR5cGUgICAgZ2VuZXJpYyBKYXZhIGVudGl0eSB0eXBlLgorICAgICAqIEByZXR1cm4gZW50aXR5IHJlYWQgZnJvbSBhIGNvbnRleHQgZW50aXR5IGlucHV0IHN0cmVhbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgPFQ+IFQgcmVhZEVudGl0eShmaW5hbCBDbGFzczxUPiByYXdUeXBlLCBmaW5hbCBUeXBlIHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLnJlYWRFbnRpdHkocmF3VHlwZSwgdHlwZSwgcHJvcGVydGllc0RlbGVnYXRlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWFkIGVudGl0eSBmcm9tIGEgY29udGV4dCBlbnRpdHkgaW5wdXQgc3RyZWFtLgorICAgICAqCisgICAgICogQHBhcmFtIDxUPiAgICAgICAgIGVudGl0eSBKYXZhIG9iamVjdCB0eXBlLgorICAgICAqIEBwYXJhbSByYXdUeXBlICAgICByYXcgSmF2YSBlbnRpdHkgdHlwZS4KKyAgICAgKiBAcGFyYW0gdHlwZSAgICAgICAgZ2VuZXJpYyBKYXZhIGVudGl0eSB0eXBlLgorICAgICAqIEBwYXJhbSBhbm5vdGF0aW9ucyBlbnRpdHkgYW5ub3RhdGlvbnMuCisgICAgICogQHJldHVybiBlbnRpdHkgcmVhZCBmcm9tIGEgY29udGV4dCBlbnRpdHkgaW5wdXQgc3RyZWFtLgorICAgICAqLworICAgIHB1YmxpYyA8VD4gVCByZWFkRW50aXR5KGZpbmFsIENsYXNzPFQ+IHJhd1R5cGUsIGZpbmFsIFR5cGUgdHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zKSB7CisgICAgICAgIHJldHVybiBzdXBlci5yZWFkRW50aXR5KHJhd1R5cGUsIHR5cGUsIGFubm90YXRpb25zLCBwcm9wZXJ0aWVzRGVsZWdhdGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIHByb3BlcnRpZXNEZWxlZ2F0ZS5nZXRQcm9wZXJ0eShuYW1lKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxTdHJpbmc+IGdldFByb3BlcnR5TmFtZXMoKSB7CisgICAgICAgIHJldHVybiBwcm9wZXJ0aWVzRGVsZWdhdGUuZ2V0UHJvcGVydHlOYW1lcygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBPYmplY3Qgb2JqZWN0KSB7CisgICAgICAgIHByb3BlcnRpZXNEZWxlZ2F0ZS5zZXRQcm9wZXJ0eShuYW1lLCBvYmplY3QpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3BlcnR5KGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHByb3BlcnRpZXNEZWxlZ2F0ZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHVuZGVybHlpbmcgcHJvcGVydGllcyBkZWxlZ2F0ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdW5kZXJseWluZyBwcm9wZXJ0aWVzIGRlbGVnYXRlLgorICAgICAqLworICAgIHB1YmxpYyBQcm9wZXJ0aWVzRGVsZWdhdGUgZ2V0UHJvcGVydGllc0RlbGVnYXRlKCkgeworICAgICAgICByZXR1cm4gcHJvcGVydGllc0RlbGVnYXRlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBFeHRlbmRlZFVyaUluZm8gZ2V0VXJpSW5mbygpIHsKKyAgICAgICAgcmV0dXJuIHVyaVJvdXRpbmdDb250ZXh0OworICAgIH0KKworICAgIHZvaWQgc2V0UHJvY2Vzc2luZ1Byb3ZpZGVycyhmaW5hbCBQcm9jZXNzaW5nUHJvdmlkZXJzIHByb3ZpZGVycykgeworICAgICAgICB0aGlzLnByb2Nlc3NpbmdQcm92aWRlcnMgPSBwcm92aWRlcnM7CisgICAgfQorCisgICAgVXJpUm91dGluZ0NvbnRleHQgZ2V0VXJpUm91dGluZ0NvbnRleHQoKSB7CisgICAgICAgIHJldHVybiB1cmlSb3V0aW5nQ29udGV4dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYWxsIGJvdW5kIHJlcXVlc3QgZmlsdGVycyBhcHBsaWNhYmxlIHRvIHRoaXMgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQWxsIGJvdW5kIChkeW5hbWljYWxseSBvciBieSBuYW1lKSByZXF1ZXN0IGZpbHRlcnMgYXBwbGljYWJsZSB0byB0aGUgbWF0Y2hlZCBpbmZsZWN0b3IgKG9yIGFuIGVtcHR5CisgICAgICogY29sbGVjdGlvbiBpZiBubyBpbmZsZWN0b3IgbWF0Y2hlZCB5ZXQpLgorICAgICAqLworICAgIEl0ZXJhYmxlPFJhbmtlZFByb3ZpZGVyPENvbnRhaW5lclJlcXVlc3RGaWx0ZXI+PiBnZXRSZXF1ZXN0RmlsdGVycygpIHsKKyAgICAgICAgZmluYWwgSW5mbGVjdG9yPFJlcXVlc3RQcm9jZXNzaW5nQ29udGV4dCwgQ29udGFpbmVyUmVzcG9uc2U+IGluZmxlY3RvciA9IGdldEluZmxlY3RvcigpOworICAgICAgICByZXR1cm4gZW1wdHlJZk51bGwoaW5mbGVjdG9yIGluc3RhbmNlb2YgUmVzb3VyY2VNZXRob2RJbnZva2VyCisgICAgICAgICAgICAgICAgPyAoKFJlc291cmNlTWV0aG9kSW52b2tlcikgaW5mbGVjdG9yKS5nZXRSZXF1ZXN0RmlsdGVycygpIDogbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGFsbCBib3VuZCByZXNwb25zZSBmaWx0ZXJzIGFwcGxpY2FibGUgdG8gdGhpcyByZXF1ZXN0LgorICAgICAqIFRoaXMgaXMgcG9wdWxhdGVkIG9uY2UgdGhlIHJpZ2h0IHJlc291cmNlIG1ldGhvZCBpcyBtYXRjaGVkLgorICAgICAqCisgICAgICogQHJldHVybiBBbGwgYm91bmQgKGR5bmFtaWNhbGx5IG9yIGJ5IG5hbWUpIHJlc3BvbnNlIGZpbHRlcnMgYXBwbGljYWJsZSB0byB0aGUgbWF0Y2hlZCBpbmZsZWN0b3IgKG9yIGFuIGVtcHR5CisgICAgICogY29sbGVjdGlvbiBpZiBubyBpbmZsZWN0b3IgbWF0Y2hlZCB5ZXQpLgorICAgICAqLworICAgIEl0ZXJhYmxlPFJhbmtlZFByb3ZpZGVyPENvbnRhaW5lclJlc3BvbnNlRmlsdGVyPj4gZ2V0UmVzcG9uc2VGaWx0ZXJzKCkgeworICAgICAgICBmaW5hbCBJbmZsZWN0b3I8UmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0LCBDb250YWluZXJSZXNwb25zZT4gaW5mbGVjdG9yID0gZ2V0SW5mbGVjdG9yKCk7CisgICAgICAgIHJldHVybiBlbXB0eUlmTnVsbChpbmZsZWN0b3IgaW5zdGFuY2VvZiBSZXNvdXJjZU1ldGhvZEludm9rZXIKKyAgICAgICAgICAgICAgICA/ICgoUmVzb3VyY2VNZXRob2RJbnZva2VyKSBpbmZsZWN0b3IpLmdldFJlc3BvbnNlRmlsdGVycygpIDogbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGFsbCByZWFkZXIgaW50ZXJjZXB0b3JzIGFwcGxpY2FibGUgdG8gdGhpcyByZXF1ZXN0LgorICAgICAqIFRoaXMgaXMgcG9wdWxhdGVkIG9uY2UgdGhlIHJpZ2h0IHJlc291cmNlIG1ldGhvZCBpcyBtYXRjaGVkLgorICAgICAqCisgICAgICogQHJldHVybiBBbGwgcmVhZGVyIGludGVyY2VwdG9ycyBhcHBsaWNhYmxlIHRvIHRoZSBtYXRjaGVkIGluZmxlY3RvciAob3IgYW4gZW1wdHkKKyAgICAgKiBjb2xsZWN0aW9uIGlmIG5vIGluZmxlY3RvciBtYXRjaGVkIHlldCkuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEl0ZXJhYmxlPFJlYWRlckludGVyY2VwdG9yPiBnZXRSZWFkZXJJbnRlcmNlcHRvcnMoKSB7CisgICAgICAgIGZpbmFsIEluZmxlY3RvcjxSZXF1ZXN0UHJvY2Vzc2luZ0NvbnRleHQsIENvbnRhaW5lclJlc3BvbnNlPiBpbmZsZWN0b3IgPSBnZXRJbmZsZWN0b3IoKTsKKyAgICAgICAgcmV0dXJuIGluZmxlY3RvciBpbnN0YW5jZW9mIFJlc291cmNlTWV0aG9kSW52b2tlcgorICAgICAgICAgICAgICAgID8gKChSZXNvdXJjZU1ldGhvZEludm9rZXIpIGluZmxlY3RvcikuZ2V0UmVhZGVySW50ZXJjZXB0b3JzKCkKKyAgICAgICAgICAgICAgICA6IHByb2Nlc3NpbmdQcm92aWRlcnMuZ2V0U29ydGVkR2xvYmFsUmVhZGVySW50ZXJjZXB0b3JzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGFsbCB3cml0ZXIgaW50ZXJjZXB0b3JzIGFwcGxpY2FibGUgdG8gdGhpcyByZXF1ZXN0LgorICAgICAqCisgICAgICogQHJldHVybiBBbGwgd3JpdGVyIGludGVyY2VwdG9ycyBhcHBsaWNhYmxlIHRvIHRoZSBtYXRjaGVkIGluZmxlY3RvciAob3IgYW4gZW1wdHkKKyAgICAgKiBjb2xsZWN0aW9uIGlmIG5vIGluZmxlY3RvciBtYXRjaGVkIHlldCkuCisgICAgICovCisgICAgSXRlcmFibGU8V3JpdGVySW50ZXJjZXB0b3I+IGdldFdyaXRlckludGVyY2VwdG9ycygpIHsKKyAgICAgICAgZmluYWwgSW5mbGVjdG9yPFJlcXVlc3RQcm9jZXNzaW5nQ29udGV4dCwgQ29udGFpbmVyUmVzcG9uc2U+IGluZmxlY3RvciA9IGdldEluZmxlY3RvcigpOworICAgICAgICByZXR1cm4gaW5mbGVjdG9yIGluc3RhbmNlb2YgUmVzb3VyY2VNZXRob2RJbnZva2VyCisgICAgICAgICAgICAgICAgPyAoKFJlc291cmNlTWV0aG9kSW52b2tlcikgaW5mbGVjdG9yKS5nZXRXcml0ZXJJbnRlcmNlcHRvcnMoKQorICAgICAgICAgICAgICAgIDogcHJvY2Vzc2luZ1Byb3ZpZGVycy5nZXRTb3J0ZWRHbG9iYWxXcml0ZXJJbnRlcmNlcHRvcnMoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEluZmxlY3RvcjxSZXF1ZXN0UHJvY2Vzc2luZ0NvbnRleHQsIENvbnRhaW5lclJlc3BvbnNlPiBnZXRJbmZsZWN0b3IoKSB7CisgICAgICAgIHJldHVybiB1cmlSb3V0aW5nQ29udGV4dC5nZXRFbmRwb2ludCgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIDxUPiBJdGVyYWJsZTxUPiBlbXB0eUlmTnVsbChmaW5hbCBJdGVyYWJsZTxUPiBpdGVyYWJsZSkgeworICAgICAgICByZXR1cm4gaXRlcmFibGUgPT0gbnVsbCA/IENvbGxlY3Rpb25zLjxUPmVtcHR5TGlzdCgpIDogaXRlcmFibGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGJhc2UgcmVxdWVzdCBVUkkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGJhc2UgcmVxdWVzdCBVUkkuCisgICAgICovCisgICAgcHVibGljIFVSSSBnZXRCYXNlVXJpKCkgeworICAgICAgICByZXR1cm4gYmFzZVVyaTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgcmVxdWVzdCBVUkkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHJlcXVlc3QgVVJJLgorICAgICAqLworICAgIHB1YmxpYyBVUkkgZ2V0UmVxdWVzdFVyaSgpIHsKKyAgICAgICAgcmV0dXJuIHJlcXVlc3RVcmk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSByZXF1ZXN0LiBUaGlzIGluY2x1ZGVzIGV2ZXJ5dGhpbmcgcHJlY2VkaW5nIHRoZSBwYXRoIChob3N0LCBwb3J0IGV0YyksCisgICAgICogYnV0IGV4Y2x1ZGVzIHF1ZXJ5IHBhcmFtZXRlcnMgb3IgZnJhZ21lbnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBhYnNvbHV0ZSBwYXRoIG9mIHRoZSByZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBVUkkgZ2V0QWJzb2x1dGVQYXRoKCkgeworICAgICAgICBpZiAoYWJzb2x1dGVQYXRoVXJpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBhYnNvbHV0ZVBhdGhVcmk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYWJzb2x1dGVQYXRoVXJpID0gbmV3IEplcnNleVVyaUJ1aWxkZXIoKS51cmkocmVxdWVzdFVyaSkucmVwbGFjZVF1ZXJ5KCIiKS5mcmFnbWVudCgiIikuYnVpbGQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0VXJpKGZpbmFsIFVSSSByZXF1ZXN0VXJpKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCF1cmlSb3V0aW5nQ29udGV4dC5nZXRNYXRjaGVkVVJJcygpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTWV0aG9kIGNvdWxkIGJlIGNhbGxlZCBvbmx5IGluIHByZS1tYXRjaGluZyByZXF1ZXN0IGZpbHRlci4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuZW5jb2RlZFJlbGF0aXZlUGF0aCA9IG51bGw7CisgICAgICAgIHRoaXMuZGVjb2RlZFJlbGF0aXZlUGF0aCA9IG51bGw7CisgICAgICAgIHRoaXMuYWJzb2x1dGVQYXRoVXJpID0gbnVsbDsKKyAgICAgICAgdGhpcy51cmlSb3V0aW5nQ29udGV4dC5pbnZhbGlkYXRlVXJpQ29tcG9uZW50Vmlld3MoKTsKKworICAgICAgICB0aGlzLnJlcXVlc3RVcmkgPSByZXF1ZXN0VXJpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFJlcXVlc3RVcmkoZmluYWwgVVJJIGJhc2VVcmksIGZpbmFsIFVSSSByZXF1ZXN0VXJpKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCF1cmlSb3V0aW5nQ29udGV4dC5nZXRNYXRjaGVkVVJJcygpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTWV0aG9kIGNvdWxkIGJlIGNhbGxlZCBvbmx5IGluIHByZS1tYXRjaGluZyByZXF1ZXN0IGZpbHRlci4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuZW5jb2RlZFJlbGF0aXZlUGF0aCA9IG51bGw7CisgICAgICAgIHRoaXMuZGVjb2RlZFJlbGF0aXZlUGF0aCA9IG51bGw7CisgICAgICAgIHRoaXMuYWJzb2x1dGVQYXRoVXJpID0gbnVsbDsKKyAgICAgICAgdGhpcy51cmlSb3V0aW5nQ29udGV4dC5pbnZhbGlkYXRlVXJpQ29tcG9uZW50Vmlld3MoKTsKKworICAgICAgICB0aGlzLmJhc2VVcmkgPSBiYXNlVXJpOworICAgICAgICB0aGlzLnJlcXVlc3RVcmkgPSByZXF1ZXN0VXJpOworICAgICAgICBPdXRib3VuZEpheHJzUmVzcG9uc2UuQnVpbGRlci5zZXRCYXNlVXJpKGJhc2VVcmkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcGF0aCBvZiB0aGUgY3VycmVudCByZXF1ZXN0IHJlbGF0aXZlIHRvIHRoZSBhcHBsaWNhdGlvbiByb290IChiYXNlKQorICAgICAqIFVSSSBhcyBhIHN0cmluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZWNvZGUgY29udHJvbHMgd2hldGhlciBzZXF1ZW5jZXMgb2YgZXNjYXBlZCBvY3RldHMgYXJlIGRlY29kZWQKKyAgICAgKiAgICAgICAgICAgICAgICh7QGNvZGUgdHJ1ZX0pIG9yIG5vdCAoe0Bjb2RlIGZhbHNlfSkuCisgICAgICogQHJldHVybiByZWxhdGl2ZSByZXF1ZXN0IHBhdGguCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRoKGZpbmFsIGJvb2xlYW4gZGVjb2RlKSB7CisgICAgICAgIGlmIChkZWNvZGUpIHsKKyAgICAgICAgICAgIGlmIChkZWNvZGVkUmVsYXRpdmVQYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVjb2RlZFJlbGF0aXZlUGF0aDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGRlY29kZWRSZWxhdGl2ZVBhdGggPSBVcmlDb21wb25lbnQuZGVjb2RlKGVuY29kZWRSZWxhdGl2ZVBhdGgoKSwgVXJpQ29tcG9uZW50LlR5cGUuUEFUSCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZW5jb2RlZFJlbGF0aXZlUGF0aCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZW5jb2RlZFJlbGF0aXZlUGF0aCgpIHsKKyAgICAgICAgaWYgKGVuY29kZWRSZWxhdGl2ZVBhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGVuY29kZWRSZWxhdGl2ZVBhdGg7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBTdHJpbmcgcmVxdWVzdFVyaVJhd1BhdGggPSByZXF1ZXN0VXJpLmdldFJhd1BhdGgoKTsKKworICAgICAgICBpZiAoYmFzZVVyaSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZW5jb2RlZFJlbGF0aXZlUGF0aCA9IHJlcXVlc3RVcmlSYXdQYXRoOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgaW50IGJhc2VVcmlSYXdQYXRoTGVuZ3RoID0gYmFzZVVyaS5nZXRSYXdQYXRoKCkubGVuZ3RoKCk7CisgICAgICAgIHJldHVybiBlbmNvZGVkUmVsYXRpdmVQYXRoID0gYmFzZVVyaVJhd1BhdGhMZW5ndGggPCByZXF1ZXN0VXJpUmF3UGF0aC5sZW5ndGgoKQorICAgICAgICAgICAgICAgID8gcmVxdWVzdFVyaVJhd1BhdGguc3Vic3RyaW5nKGJhc2VVcmlSYXdQYXRoTGVuZ3RoKSA6ICIiOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kKCkgeworICAgICAgICByZXR1cm4gaHR0cE1ldGhvZDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRNZXRob2QoZmluYWwgU3RyaW5nIG1ldGhvZCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghdXJpUm91dGluZ0NvbnRleHQuZ2V0TWF0Y2hlZFVSSXMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk1ldGhvZCBjb3VsZCBiZSBjYWxsZWQgb25seSBpbiBwcmUtbWF0Y2hpbmcgcmVxdWVzdCBmaWx0ZXIuIik7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5odHRwTWV0aG9kID0gbWV0aG9kOworICAgIH0KKworICAgIC8qKgorICAgICAqIExpa2Uge0BsaW5rICNzZXRNZXRob2QoU3RyaW5nKX0gYnV0IGRvZXMgbm90IHRocm93IHtAbGluayBJbGxlZ2FsU3RhdGVFeGNlcHRpb259IGlmIHRoZSBtZXRob2QgaXMgaW52b2tlZCBpbiBvdGhlciB0aGFuCisgICAgICogcHJlLW1hdGNoaW5nIHBoYXNlLgorICAgICAqCisgICAgICogQHBhcmFtIG1ldGhvZCBIVFRQIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNZXRob2RXaXRob3V0RXhjZXB0aW9uKGZpbmFsIFN0cmluZyBtZXRob2QpIHsKKyAgICAgICAgdGhpcy5odHRwTWV0aG9kID0gbWV0aG9kOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZWN1cml0eUNvbnRleHQgZ2V0U2VjdXJpdHlDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gc2VjdXJpdHlDb250ZXh0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFNlY3VyaXR5Q29udGV4dChmaW5hbCBTZWN1cml0eUNvbnRleHQgY29udGV4dCkgeworICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrU3RhdGUoIWluUmVzcG9uc2VQcm9jZXNzaW5nUGhhc2UsIEVSUk9SX1JFUVVFU1RfU0VUX1NFQ1VSSVRZX0NPTlRFWFRfSU5fUkVTUE9OU0VfUEhBU0UpOworICAgICAgICB0aGlzLnNlY3VyaXR5Q29udGV4dCA9IGNvbnRleHQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0RW50aXR5U3RyZWFtKGZpbmFsIElucHV0U3RyZWFtIGlucHV0KSB7CisgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tTdGF0ZSghaW5SZXNwb25zZVByb2Nlc3NpbmdQaGFzZSwgRVJST1JfUkVRVUVTVF9TRVRfRU5USVRZX1NUUkVBTV9JTl9SRVNQT05TRV9QSEFTRSk7CisgICAgICAgIHN1cGVyLnNldEVudGl0eVN0cmVhbShpbnB1dCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlcXVlc3QgZ2V0UmVxdWVzdCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWJvcnRXaXRoKGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tTdGF0ZSghaW5SZXNwb25zZVByb2Nlc3NpbmdQaGFzZSwgRVJST1JfUkVRVUVTVF9BQk9SVF9JTl9SRVNQT05TRV9QSEFTRSk7CisgICAgICAgIHRoaXMuYWJvcnRSZXNwb25zZSA9IHJlc3BvbnNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vdGlmeSB0aGlzIHJlcXVlc3QgdGhhdCB0aGUgcmVzcG9uc2UgY3JlYXRlZCBmcm9tIHRoaXMgcmVxdWVzdCBpcyBhbHJlYWR5IGJlaW5nCisgICAgICogcHJvY2Vzc2VkLiBUaGlzIG1lYW5zIHRoYXQgdGhlIHJlcXVlc3QgcHJvY2Vzc2luZyBwaGFzZSBoYXMgZmluaXNoZWQgYW5kIHRoaXMKKyAgICAgKiByZXF1ZXN0IGNhbiBiZSB1c2VkIG9ubHkgaW4gdGhlIHJlcXVlc3QgcHJvY2Vzc2luZyBwaGFzZSAoZm9yIGV4YW1wbGUgaW4KKyAgICAgKiBDb250YWluZXJSZXNwb25zZUZpbHRlcikuCisgICAgICogPHAvPgorICAgICAqIFRoZSByZXF1ZXN0IGNhbiBiZSB1c2VkIGZvciBwcm9jZXNzaW5nIG9mIG1vcmUgdGhhbiBvbmUgcmVzcG9uc2UgKGluIGFzeW5jIGNhc2VzKS4KKyAgICAgKiBUaGVuIHRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgZmlyc3QgcmVzcG9uc2UgaXMgY3JlYXRlZCBmcm9tIHRoaXMKKyAgICAgKiByZXF1ZXN0LiBNdWx0aXBsZSBjYWxscyB0byB0aGlzIG1ldGhvZCBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIGNhbGxpbmcgdGhlIG1ldGhvZAorICAgICAqIG9ubHkgb25jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpblJlc3BvbnNlUHJvY2Vzc2luZygpIHsKKyAgICAgICAgdGhpcy5pblJlc3BvbnNlUHJvY2Vzc2luZ1BoYXNlID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHJlcXVlc3QgZmlsdGVyIGNoYWluIGFib3J0aW5nIHJlc3BvbnNlIGlmIHNldCwgb3Ige0Bjb2RlIG51bGx9IG90aGVyd2lzZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gcmVxdWVzdCBmaWx0ZXIgY2hhaW4gYWJvcnRpbmcgcmVzcG9uc2UgaWYgc2V0LCBvciB7QGNvZGUgbnVsbH0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBSZXNwb25zZSBnZXRBYm9ydFJlc3BvbnNlKCkgeworICAgICAgICByZXR1cm4gYWJvcnRSZXNwb25zZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWFwPFN0cmluZywgQ29va2llPiBnZXRDb29raWVzKCkgeworICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UmVxdWVzdENvb2tpZXMoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxNZWRpYVR5cGU+IGdldEFjY2VwdGFibGVNZWRpYVR5cGVzKCkgeworICAgICAgICByZXR1cm4gZ2V0UXVhbGlmaWVkQWNjZXB0YWJsZU1lZGlhVHlwZXMoKS5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKEZ1bmN0aW9uPEFjY2VwdGFibGVNZWRpYVR5cGUsIE1lZGlhVHlwZT4pIGlucHV0IC0+IGlucHV0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PExvY2FsZT4gZ2V0QWNjZXB0YWJsZUxhbmd1YWdlcygpIHsKKyAgICAgICAgcmV0dXJuIGdldFF1YWxpZmllZEFjY2VwdGFibGVMYW5ndWFnZXMoKS5zdHJlYW0oKS5tYXAoTGFuZ3VhZ2VUYWc6OmdldEFzTG9jYWxlKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgIH0KKworICAgIC8vIEpBWC1SUyByZXF1ZXN0CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVmFyaWFudCBzZWxlY3RWYXJpYW50KGZpbmFsIExpc3Q8VmFyaWFudD4gdmFyaWFudHMpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgICAgICBpZiAodmFyaWFudHMgPT0gbnVsbCB8fCB2YXJpYW50cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTUVUSE9EX1BBUkFNRVRFUl9DQU5OT1RfQkVfTlVMTF9PUl9FTVBUWSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgUmVmPFN0cmluZz4gdmFyeVZhbHVlUmVmID0gUmVmcy5lbXB0eVJlZigpOworICAgICAgICBmaW5hbCBWYXJpYW50IHZhcmlhbnQgPSBWYXJpYW50U2VsZWN0b3Iuc2VsZWN0VmFyaWFudCh0aGlzLCB2YXJpYW50cywgdmFyeVZhbHVlUmVmKTsKKyAgICAgICAgdGhpcy52YXJ5VmFsdWUgPSB2YXJ5VmFsdWVSZWYuZ2V0KCk7CisgICAgICAgIHJldHVybiB2YXJpYW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmFsdWUgb2YgSFRUUCBWYXJ5IHJlc3BvbnNlIGhlYWRlciB0byBiZSBzZXQgaW4gdGhlIHJlc3BvbnNlLAorICAgICAqIG9yIHtAY29kZSBudWxsfSBpZiBubyB2YWx1ZSBpcyB0byBiZSBzZXQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHZhbHVlIG9mIEhUVFAgVmFyeSByZXNwb25zZSBoZWFkZXIgdG8gYmUgc2V0IGluIHRoZSByZXNwb25zZSBpZiBhdmFpbGFibGUsCisgICAgICoge0Bjb2RlIG51bGx9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFZhcnlWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIHZhcnlWYWx1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzcG9uc2UuUmVzcG9uc2VCdWlsZGVyIGV2YWx1YXRlUHJlY29uZGl0aW9ucyhmaW5hbCBFbnRpdHlUYWcgZVRhZykgeworICAgICAgICBpZiAoZVRhZyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1FVEhPRF9QQVJBTUVURVJfQ0FOTk9UX0JFX05VTExfRVRBRyk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBSZXNwb25zZS5SZXNwb25zZUJ1aWxkZXIgciA9IGV2YWx1YXRlSWZNYXRjaChlVGFnKTsKKyAgICAgICAgaWYgKHIgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGV2YWx1YXRlSWZOb25lTWF0Y2goZVRhZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc3BvbnNlLlJlc3BvbnNlQnVpbGRlciBldmFsdWF0ZVByZWNvbmRpdGlvbnMoZmluYWwgRGF0ZSBsYXN0TW9kaWZpZWQpIHsKKyAgICAgICAgaWYgKGxhc3RNb2RpZmllZCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1FVEhPRF9QQVJBTUVURVJfQ0FOTk9UX0JFX05VTExfTEFTVF9NT0RJRklFRCk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBsb25nIGxhc3RNb2RpZmllZFRpbWUgPSBsYXN0TW9kaWZpZWQuZ2V0VGltZSgpOworICAgICAgICBmaW5hbCBSZXNwb25zZS5SZXNwb25zZUJ1aWxkZXIgciA9IGV2YWx1YXRlSWZVbm1vZGlmaWVkU2luY2UobGFzdE1vZGlmaWVkVGltZSk7CisgICAgICAgIGlmIChyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiByOworICAgICAgICB9CisgICAgICAgIHJldHVybiBldmFsdWF0ZUlmTW9kaWZpZWRTaW5jZShsYXN0TW9kaWZpZWRUaW1lKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzcG9uc2UuUmVzcG9uc2VCdWlsZGVyIGV2YWx1YXRlUHJlY29uZGl0aW9ucyhmaW5hbCBEYXRlIGxhc3RNb2RpZmllZCwgZmluYWwgRW50aXR5VGFnIGVUYWcpIHsKKyAgICAgICAgaWYgKGxhc3RNb2RpZmllZCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKE1FVEhPRF9QQVJBTUVURVJfQ0FOTk9UX0JFX05VTExfTEFTVF9NT0RJRklFRCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVUYWcgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihNRVRIT0RfUEFSQU1FVEVSX0NBTk5PVF9CRV9OVUxMX0VUQUcpOworICAgICAgICB9CisKKyAgICAgICAgUmVzcG9uc2UuUmVzcG9uc2VCdWlsZGVyIHIgPSBldmFsdWF0ZUlmTWF0Y2goZVRhZyk7CisgICAgICAgIGlmIChyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiByOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgbG9uZyBsYXN0TW9kaWZpZWRUaW1lID0gbGFzdE1vZGlmaWVkLmdldFRpbWUoKTsKKyAgICAgICAgciA9IGV2YWx1YXRlSWZVbm1vZGlmaWVkU2luY2UobGFzdE1vZGlmaWVkVGltZSk7CisgICAgICAgIGlmIChyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiByOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpc0dldE9ySGVhZCA9ICJHRVQiLmVxdWFscyhnZXRNZXRob2QoKSkgfHwgIkhFQUQiLmVxdWFscyhnZXRNZXRob2QoKSk7CisgICAgICAgIGZpbmFsIFNldDxNYXRjaGluZ0VudGl0eVRhZz4gbWF0Y2hpbmdUYWdzID0gZ2V0SWZOb25lTWF0Y2goKTsKKyAgICAgICAgaWYgKG1hdGNoaW5nVGFncyAhPSBudWxsKSB7CisgICAgICAgICAgICByID0gZXZhbHVhdGVJZk5vbmVNYXRjaChlVGFnLCBtYXRjaGluZ1RhZ3MsIGlzR2V0T3JIZWFkKTsKKyAgICAgICAgICAgIC8vIElmIHRoZSBJZi1Ob25lLU1hdGNoIGhlYWRlciBpcyBwcmVzZW50IGFuZCB0aGVyZSBpcyBubworICAgICAgICAgICAgLy8gbWF0Y2ggdGhlbiB0aGUgSWYtTW9kaWZpZWQtU2luY2UgaGVhZGVyIG11c3QgYmUgaWdub3JlZAorICAgICAgICAgICAgaWYgKHIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBPdGhlcndpc2UgaWYgdGhlIElmLU5vbmUtTWF0Y2ggaGVhZGVyIGlzIHByZXNlbnQgYW5kIHRoZXJlCisgICAgICAgICAgICAvLyBpcyBhIG1hdGNoIHRoZW4gdGhlIElmLU1vZGlmaWVkLVNpbmNlIGhlYWRlciBtdXN0IGJlIGNoZWNrZWQKKyAgICAgICAgICAgIC8vIGZvciBjb25zaXN0ZW5jeQorICAgICAgICB9CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGlmTW9kaWZpZWRTaW5jZUhlYWRlciA9IGdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5JRl9NT0RJRklFRF9TSU5DRSk7CisgICAgICAgIGlmIChpZk1vZGlmaWVkU2luY2VIZWFkZXIgIT0gbnVsbCAmJiAhaWZNb2RpZmllZFNpbmNlSGVhZGVyLmlzRW1wdHkoKSAmJiBpc0dldE9ySGVhZCkgeworICAgICAgICAgICAgciA9IGV2YWx1YXRlSWZNb2RpZmllZFNpbmNlKGxhc3RNb2RpZmllZFRpbWUsIGlmTW9kaWZpZWRTaW5jZUhlYWRlcik7CisgICAgICAgICAgICBpZiAociAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgci50YWcoZVRhZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzcG9uc2UuUmVzcG9uc2VCdWlsZGVyIGV2YWx1YXRlUHJlY29uZGl0aW9ucygpIHsKKyAgICAgICAgZmluYWwgU2V0PE1hdGNoaW5nRW50aXR5VGFnPiBtYXRjaGluZ1RhZ3MgPSBnZXRJZk1hdGNoKCk7CisgICAgICAgIGlmIChtYXRjaGluZ1RhZ3MgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvLyBTaW5jZSB0aGUgcmVzb3VyY2UgZG9lcyBub3QgZXhpc3QgdGhlIG1ldGhvZCBtdXN0IG5vdCBiZQorICAgICAgICAvLyBwZXJmb3JtIGFuZCA0MTIgUHJlY29uZGl0aW9uIEZhaWxlZCBpcyByZXR1cm5lZAorICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKFJlc3BvbnNlLlN0YXR1cy5QUkVDT05ESVRJT05fRkFJTEVEKTsKKyAgICB9CisKKyAgICAvLyBQcml2YXRlIG1ldGhvZHMKKyAgICBwcml2YXRlIFJlc3BvbnNlLlJlc3BvbnNlQnVpbGRlciBldmFsdWF0ZUlmTWF0Y2goZmluYWwgRW50aXR5VGFnIGVUYWcpIHsKKyAgICAgICAgZmluYWwgU2V0PD8gZXh0ZW5kcyBFbnRpdHlUYWc+IG1hdGNoaW5nVGFncyA9IGdldElmTWF0Y2goKTsKKyAgICAgICAgaWYgKG1hdGNoaW5nVGFncyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoZSBzdHJvbmcgY29tcGFyaXNvbiBmdW5jdGlvbiBtdXN0IGJlIHVzZWQgdG8gY29tcGFyZSB0aGUgZW50aXR5CisgICAgICAgIC8vIHRhZ3MuIFRodXMgaWYgdGhlIGVudGl0eSB0YWcgb2YgdGhlIGVudGl0eSBpcyB3ZWFrIHRoZW4gbWF0Y2hpbmcKKyAgICAgICAgLy8gb2YgZW50aXR5IHRhZ3MgaW4gdGhlIElmLU1hdGNoIGhlYWRlciBzaG91bGQgZmFpbC4KKyAgICAgICAgaWYgKGVUYWcuaXNXZWFrKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoUmVzcG9uc2UuU3RhdHVzLlBSRUNPTkRJVElPTl9GQUlMRUQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1hdGNoaW5nVGFncyAhPSBNYXRjaGluZ0VudGl0eVRhZy5BTllfTUFUQ0ggJiYgIW1hdGNoaW5nVGFncy5jb250YWlucyhlVGFnKSkgeworICAgICAgICAgICAgLy8gNDEyIFByZWNvbmRpdGlvbiBGYWlsZWQKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoUmVzcG9uc2UuU3RhdHVzLlBSRUNPTkRJVElPTl9GQUlMRUQpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZXNwb25zZS5SZXNwb25zZUJ1aWxkZXIgZXZhbHVhdGVJZk5vbmVNYXRjaChmaW5hbCBFbnRpdHlUYWcgZVRhZykgeworICAgICAgICBmaW5hbCBTZXQ8TWF0Y2hpbmdFbnRpdHlUYWc+IG1hdGNoaW5nVGFncyA9IGdldElmTm9uZU1hdGNoKCk7CisgICAgICAgIGlmIChtYXRjaGluZ1RhZ3MgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBTdHJpbmcgaHR0cE1ldGhvZCA9IGdldE1ldGhvZCgpOworICAgICAgICByZXR1cm4gZXZhbHVhdGVJZk5vbmVNYXRjaChlVGFnLCBtYXRjaGluZ1RhZ3MsICJHRVQiLmVxdWFscyhodHRwTWV0aG9kKSB8fCAiSEVBRCIuZXF1YWxzKGh0dHBNZXRob2QpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlc3BvbnNlLlJlc3BvbnNlQnVpbGRlciBldmFsdWF0ZUlmTm9uZU1hdGNoKGZpbmFsIEVudGl0eVRhZyBlVGFnLCBmaW5hbCBTZXQ8PyBleHRlbmRzIEVudGl0eVRhZz4gbWF0Y2hpbmdUYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc0dldE9ySGVhZCkgeworICAgICAgICBpZiAoaXNHZXRPckhlYWQpIHsKKyAgICAgICAgICAgIGlmIChtYXRjaGluZ1RhZ3MgPT0gTWF0Y2hpbmdFbnRpdHlUYWcuQU5ZX01BVENIKSB7CisgICAgICAgICAgICAgICAgLy8gMzA0IE5vdCBtb2RpZmllZAorICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5ub3RNb2RpZmllZChlVGFnKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVGhlIHdlYWsgY29tcGFyaXNvbiBmdW5jdGlvbiBtYXkgYmUgdXNlZCB0byBjb21wYXJlIGVudGl0eSB0YWdzCisgICAgICAgICAgICBpZiAobWF0Y2hpbmdUYWdzLmNvbnRhaW5zKGVUYWcpIHx8IG1hdGNoaW5nVGFncy5jb250YWlucyhuZXcgRW50aXR5VGFnKGVUYWcuZ2V0VmFsdWUoKSwgIWVUYWcuaXNXZWFrKCkpKSkgeworICAgICAgICAgICAgICAgIC8vIDMwNCBOb3QgbW9kaWZpZWQKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uubm90TW9kaWZpZWQoZVRhZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUaGUgc3Ryb25nIGNvbXBhcmlzb24gZnVuY3Rpb24gbXVzdCBiZSB1c2VkIHRvIGNvbXBhcmUgdGhlIGVudGl0eQorICAgICAgICAgICAgLy8gdGFncy4gVGh1cyBpZiB0aGUgZW50aXR5IHRhZyBvZiB0aGUgZW50aXR5IGlzIHdlYWsgdGhlbiBtYXRjaGluZworICAgICAgICAgICAgLy8gb2YgZW50aXR5IHRhZ3MgaW4gdGhlIElmLU5vbmUtTWF0Y2ggaGVhZGVyIHNob3VsZCBmYWlsIGlmIHRoZQorICAgICAgICAgICAgLy8gSFRUUCBtZXRob2QgaXMgbm90IEdFVCBvciBub3QgSEVBRC4KKyAgICAgICAgICAgIGlmIChlVGFnLmlzV2VhaygpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtYXRjaGluZ1RhZ3MgPT0gTWF0Y2hpbmdFbnRpdHlUYWcuQU5ZX01BVENIIHx8IG1hdGNoaW5nVGFncy5jb250YWlucyhlVGFnKSkgeworICAgICAgICAgICAgICAgIC8vIDQxMiBQcmVjb25kaXRpb24gRmFpbGVkCisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyhSZXNwb25zZS5TdGF0dXMuUFJFQ09ORElUSU9OX0ZBSUxFRCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlc3BvbnNlLlJlc3BvbnNlQnVpbGRlciBldmFsdWF0ZUlmVW5tb2RpZmllZFNpbmNlKGZpbmFsIGxvbmcgbGFzdE1vZGlmaWVkKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBpZlVubW9kaWZpZWRTaW5jZUhlYWRlciA9IGdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5JRl9VTk1PRElGSUVEX1NJTkNFKTsKKyAgICAgICAgaWYgKGlmVW5tb2RpZmllZFNpbmNlSGVhZGVyICE9IG51bGwgJiYgIWlmVW5tb2RpZmllZFNpbmNlSGVhZGVyLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGlmVW5tb2RpZmllZFNpbmNlID0gSHR0cEhlYWRlclJlYWRlci5yZWFkRGF0ZShpZlVubW9kaWZpZWRTaW5jZUhlYWRlcikuZ2V0VGltZSgpOworICAgICAgICAgICAgICAgIGlmIChyb3VuZERvd24obGFzdE1vZGlmaWVkKSA+IGlmVW5tb2RpZmllZFNpbmNlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIDQxMiBQcmVjb25kaXRpb24gRmFpbGVkCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoUmVzcG9uc2UuU3RhdHVzLlBSRUNPTkRJVElPTl9GQUlMRUQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFBhcnNlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgLy8gSWdub3JlIHRoZSBoZWFkZXIgaWYgcGFyc2luZyBlcnJvcgorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZXNwb25zZS5SZXNwb25zZUJ1aWxkZXIgZXZhbHVhdGVJZk1vZGlmaWVkU2luY2UoZmluYWwgbG9uZyBsYXN0TW9kaWZpZWQpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGlmTW9kaWZpZWRTaW5jZUhlYWRlciA9IGdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5JRl9NT0RJRklFRF9TSU5DRSk7CisgICAgICAgIGlmIChpZk1vZGlmaWVkU2luY2VIZWFkZXIgPT0gbnVsbCB8fCBpZk1vZGlmaWVkU2luY2VIZWFkZXIuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFN0cmluZyBodHRwTWV0aG9kID0gZ2V0TWV0aG9kKCk7CisgICAgICAgIGlmICgiR0VUIi5lcXVhbHMoaHR0cE1ldGhvZCkgfHwgIkhFQUQiLmVxdWFscyhodHRwTWV0aG9kKSkgeworICAgICAgICAgICAgcmV0dXJuIGV2YWx1YXRlSWZNb2RpZmllZFNpbmNlKGxhc3RNb2RpZmllZCwgaWZNb2RpZmllZFNpbmNlSGVhZGVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBSZXNwb25zZS5SZXNwb25zZUJ1aWxkZXIgZXZhbHVhdGVJZk1vZGlmaWVkU2luY2UoZmluYWwgbG9uZyBsYXN0TW9kaWZpZWQsIGZpbmFsIFN0cmluZyBpZk1vZGlmaWVkU2luY2VIZWFkZXIpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgaWZNb2RpZmllZFNpbmNlID0gSHR0cEhlYWRlclJlYWRlci5yZWFkRGF0ZShpZk1vZGlmaWVkU2luY2VIZWFkZXIpLmdldFRpbWUoKTsKKyAgICAgICAgICAgIGlmIChyb3VuZERvd24obGFzdE1vZGlmaWVkKSA8PSBpZk1vZGlmaWVkU2luY2UpIHsKKyAgICAgICAgICAgICAgICAvLyAzMDQgTm90IG1vZGlmaWVkCisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm5vdE1vZGlmaWVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFBhcnNlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBJZ25vcmUgdGhlIGhlYWRlciBpZiBwYXJzaW5nIGVycm9yCisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSb3VuZCBkb3duIHRoZSB0aW1lIHRvIHRoZSBuZWFyZXN0IHNlY29uZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aW1lIHRoZSB0aW1lIHRvIHJvdW5kIGRvd24uCisgICAgICogQHJldHVybiB0aGUgcm91bmRlZCBkb3duIHRpbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgbG9uZyByb3VuZERvd24oZmluYWwgbG9uZyB0aW1lKSB7CisgICAgICAgIHJldHVybiB0aW1lIC0gdGltZSAlIDEwMDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB2YWx1ZXMgb2YgYSBIVFRQIHJlcXVlc3QgaGVhZGVyLiBUaGUgcmV0dXJuZWQgTGlzdCBpcyByZWFkLW9ubHkuCisgICAgICogVGhpcyBpcyBhIHNob3J0Y3V0IGZvciB7QGNvZGUgZ2V0UmVxdWVzdEhlYWRlcnMoKS5nZXQobmFtZSl9LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIGhlYWRlciBuYW1lLCBjYXNlIGluc2Vuc2l0aXZlLgorICAgICAqIEByZXR1cm4gYSByZWFkLW9ubHkgbGlzdCBvZiBoZWFkZXIgdmFsdWVzLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgY2FsbGVkIG91dHNpZGUgdGhlIHNjb3BlIG9mIGEgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFJlcXVlc3RIZWFkZXIoZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGdldEhlYWRlcnMoKS5nZXQobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB2YWx1ZXMgb2YgSFRUUCByZXF1ZXN0IGhlYWRlcnMuIFRoZSByZXR1cm5lZCBNYXAgaXMgY2FzZS1pbnNlbnNpdGl2ZQorICAgICAqIHdydC4ga2V5cyBhbmQgaXMgcmVhZC1vbmx5LiBUaGUgbWV0aG9kIG5ldmVyIHJldHVybnMge0Bjb2RlIG51bGx9LgorICAgICAqCisgICAgICogQHJldHVybiBhIHJlYWQtb25seSBtYXAgb2YgaGVhZGVyIG5hbWVzIGFuZCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBjYWxsZWQgb3V0c2lkZSB0aGUgc2NvcGUgb2YgYSByZXF1ZXN0LgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0UmVxdWVzdEhlYWRlcnMoKSB7CisgICAgICAgIHJldHVybiBnZXRIZWFkZXJzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgdGhlIGNvbnRhaW5lciByZXF1ZXN0IGhhcyBiZWVuIHByb3Blcmx5IGluaXRpYWxpemVkIGZvciBwcm9jZXNzaW5nLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaW4gY2FzZSB0aGUgaW50ZXJuYWwgc3RhdGUgaXMgbm90IHJlYWR5IGZvciBwcm9jZXNzaW5nLgorICAgICAqLworICAgIHZvaWQgY2hlY2tTdGF0ZSgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgICAgICBpZiAoc2VjdXJpdHlDb250ZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlNlY3VyaXR5Q29udGV4dCBzZXQgaW4gdGhlIENvbnRhaW5lclJlcXVlc3RDb250ZXh0IG11c3Qgbm90IGJlIG51bGwuIik7CisgICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2VXcml0ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiUmVzcG9uc2VXcml0ZXIgc2V0IGluIHRoZSBDb250YWluZXJSZXF1ZXN0Q29udGV4dCBtdXN0IG5vdCBiZSBudWxsLiIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvQ29udGFpbmVyUmVzcG9uc2UuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL0NvbnRhaW5lclJlc3BvbnNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkzNzcyYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL0NvbnRhaW5lclJlc3BvbnNlLmphdmEKQEAgLTAsMCArMSw0MDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlBhcmFtZXRlcml6ZWRUeXBlOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlc3BvbnNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5FbnRpdHlUYWc7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5MaW5rOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5OZXdDb29raWU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuT3V0Ym91bmRKYXhyc1Jlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuT3V0Ym91bmRNZXNzYWdlQ29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLlN0YXR1c2VzOworCisvKioKKyAqIEplcnNleSBjb250YWluZXIgcmVzcG9uc2UgY29udGV4dC4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQ29udGFpbmVyUmVzcG9uc2UgaW1wbGVtZW50cyBDb250YWluZXJSZXNwb25zZUNvbnRleHQgeworCisgICAgcHJpdmF0ZSBSZXNwb25zZS5TdGF0dXNUeXBlIHN0YXR1czsKKyAgICBwcml2YXRlIGZpbmFsIENvbnRhaW5lclJlcXVlc3QgcmVxdWVzdENvbnRleHQ7CisgICAgcHJpdmF0ZSBmaW5hbCBPdXRib3VuZE1lc3NhZ2VDb250ZXh0IG1lc3NhZ2VDb250ZXh0OworICAgIHByaXZhdGUgYm9vbGVhbiBtYXBwZWRGcm9tRXhjZXB0aW9uOworICAgIHByaXZhdGUgYm9vbGVhbiBjbG9zZWQ7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgSmVyc2V5IGNvbnRhaW5lciByZXNwb25zZSBjb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3RDb250ZXh0IGFzc29jaWF0ZWQgY29udGFpbmVyIHJlcXVlc3QgY29udGV4dC4KKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgcmVzcG9uc2UgaW5zdGFuY2UgaW5pdGlhbGl6aW5nIHRoZSByZXNwb25zZSBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBDb250YWluZXJSZXNwb25zZShmaW5hbCBDb250YWluZXJSZXF1ZXN0IHJlcXVlc3RDb250ZXh0LCBmaW5hbCBSZXNwb25zZSByZXNwb25zZSkgeworICAgICAgICB0aGlzKHJlcXVlc3RDb250ZXh0LCBPdXRib3VuZEpheHJzUmVzcG9uc2UuZnJvbShyZXNwb25zZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBKZXJzZXkgY29udGFpbmVyIHJlc3BvbnNlIGNvbnRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdENvbnRleHQgYXNzb2NpYXRlZCBjb250YWluZXIgcmVxdWVzdCBjb250ZXh0LgorICAgICAqIEBwYXJhbSByZXNwb25zZSByZXNwb25zZSBpbnN0YW5jZSBpbml0aWFsaXppbmcgdGhlIHJlc3BvbnNlIGNvbnRleHQuCisgICAgICovCisgICAgQ29udGFpbmVyUmVzcG9uc2UoZmluYWwgQ29udGFpbmVyUmVxdWVzdCByZXF1ZXN0Q29udGV4dCwgZmluYWwgT3V0Ym91bmRKYXhyc1Jlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgICAgIHRoaXMucmVxdWVzdENvbnRleHQgPSByZXF1ZXN0Q29udGV4dDsKKyAgICAgICAgdGhpcy5yZXF1ZXN0Q29udGV4dC5pblJlc3BvbnNlUHJvY2Vzc2luZygpOworICAgICAgICB0aGlzLnN0YXR1cyA9IHJlc3BvbnNlLmdldFN0YXR1c0luZm8oKTsKKyAgICAgICAgdGhpcy5tZXNzYWdlQ29udGV4dCA9IHJlc3BvbnNlLmdldENvbnRleHQoKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgdmFyeVZhbHVlID0gcmVxdWVzdENvbnRleHQuZ2V0VmFyeVZhbHVlKCk7CisgICAgICAgIGlmICh2YXJ5VmFsdWUgIT0gbnVsbCAmJiAhdGhpcy5tZXNzYWdlQ29udGV4dC5nZXRIZWFkZXJzKCkuY29udGFpbnNLZXkoSHR0cEhlYWRlcnMuVkFSWSkpIHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogQWRkIGEgVmFyeSBoZWFkZXIgdXNpbmcgdGhlIHZhbHVlIGNvbXB1dGVkIGluIHRoZSByZXF1ZXN0IGlmIHByZXNlbnQKKyAgICAgICAgICAgICAqIGFuZCBpZiB0aGUgVmFyeSBoZWFkZXIgd2FzIG5vdCBleHBsaWNpdGx5IHNldCBpbiB0aGUgcmVzcG9uc2UgYWxyZWFkeS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgdGhpcy5tZXNzYWdlQ29udGV4dC5nZXRIZWFkZXJzKCkuYWRkKEh0dHBIZWFkZXJzLlZBUlksIHZhcnlWYWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJlc3BvbnNlIGlzIHJlc3VsdCBvZiB0aGUgZXhjZXB0aW9uIChmb3IgZXhhbXBsZSBjcmVhdGVkIGR1cmluZworICAgICAqIHtAbGluayBqYXZheC53cy5ycy5leHQuRXhjZXB0aW9uTWFwcGVyIGV4Y2VwdGlvbiBtYXBwaW5nfSkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyByZXNwb25zZSB3YXMgY3JlYXRlZCBiYXNlZCBvbiB0aGUgZXhjZXB0aW9uLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNNYXBwZWRGcm9tRXhjZXB0aW9uKCkgeworICAgICAgICByZXR1cm4gbWFwcGVkRnJvbUV4Y2VwdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgcmVzcG9uc2Ugd2FzIGNyZWF0ZWQgYmFzZWQgb24gdGhlIGV4Y2VwdGlvbi4KKyAgICAgKiBAcGFyYW0gbWFwcGVkRnJvbUV4Y2VwdGlvbiBUcnVlIGlmIHRoaXMgZXhjZXB0aW9uIGlmIHJlc3VsdCBvZiB0aGUgZXhjZXB0aW9uIChmb3IgZXhhbXBsZSByZXN1bHQgb2YKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB7QGxpbmsgamF2YXgud3MucnMuZXh0LkV4Y2VwdGlvbk1hcHBlciBleGNlcHRpb24gbWFwcGluZ30pLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1hcHBlZEZyb21FeGNlcHRpb24oZmluYWwgYm9vbGVhbiBtYXBwZWRGcm9tRXhjZXB0aW9uKSB7CisgICAgICAgIHRoaXMubWFwcGVkRnJvbUV4Y2VwdGlvbiA9IG1hcHBlZEZyb21FeGNlcHRpb247CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRTdGF0dXMoKSB7CisgICAgICAgIHJldHVybiBzdGF0dXMuZ2V0U3RhdHVzQ29kZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhmaW5hbCBpbnQgY29kZSkgeworICAgICAgICB0aGlzLnN0YXR1cyA9IFN0YXR1c2VzLmZyb20oY29kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0U3RhdHVzSW5mbyhmaW5hbCBSZXNwb25zZS5TdGF0dXNUeXBlIHN0YXR1cykgeworICAgICAgICBpZiAoc3RhdHVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiUmVzcG9uc2Ugc3RhdHVzIG11c3Qgbm90IGJlICdudWxsJyIpOworICAgICAgICB9CisgICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNwb25zZS5TdGF0dXNUeXBlIGdldFN0YXR1c0luZm8oKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBhc3NvY2lhdGVkIGNvbnRhaW5lciByZXF1ZXN0IGNvbnRleHQgcGFpcmVkIHdpdGggdGhpcyByZXNwb25zZSBjb250ZXh0LgorICAgICAqCisgICAgICogQHJldHVybiBhc3NvY2lhdGVkIGNvbnRhaW5lciByZXF1ZXN0IGNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIENvbnRhaW5lclJlcXVlc3QgZ2V0UmVxdWVzdENvbnRleHQoKSB7CisgICAgICAgIHJldHVybiByZXF1ZXN0Q29udGV4dDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWFwPFN0cmluZywgTmV3Q29va2llPiBnZXRDb29raWVzKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUNvbnRleHQuZ2V0UmVzcG9uc2VDb29raWVzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB3cmFwcGVkIHJlc3BvbnNlIG1lc3NhZ2UgY29udGV4dC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gd3JhcHBlZCByZXNwb25zZSBtZXNzYWdlIGNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIE91dGJvdW5kTWVzc2FnZUNvbnRleHQgZ2V0V3JhcHBlZE1lc3NhZ2VDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUNvbnRleHQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRIZWFkZXJTdHJpbmcoZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VDb250ZXh0LmdldEhlYWRlclN0cmluZyhuYW1lKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGdldEhlYWRlcnMoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlQ29udGV4dC5nZXRIZWFkZXJzKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBnZXRTdHJpbmdIZWFkZXJzKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUNvbnRleHQuZ2V0U3RyaW5nSGVhZGVycygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBEYXRlIGdldERhdGUoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlQ29udGV4dC5nZXREYXRlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExvY2FsZSBnZXRMYW5ndWFnZSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VDb250ZXh0LmdldExhbmd1YWdlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1lZGlhVHlwZSBnZXRNZWRpYVR5cGUoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlQ29udGV4dC5nZXRNZWRpYVR5cGUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0QWxsb3dlZE1ldGhvZHMoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlQ29udGV4dC5nZXRBbGxvd2VkTWV0aG9kcygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0TGVuZ3RoKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUNvbnRleHQuZ2V0TGVuZ3RoKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEVudGl0eVRhZyBnZXRFbnRpdHlUYWcoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlQ29udGV4dC5nZXRFbnRpdHlUYWcoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRGF0ZSBnZXRMYXN0TW9kaWZpZWQoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlQ29udGV4dC5nZXRMYXN0TW9kaWZpZWQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVVJJIGdldExvY2F0aW9uKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUNvbnRleHQuZ2V0TG9jYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PExpbms+IGdldExpbmtzKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUNvbnRleHQuZ2V0TGlua3MoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNMaW5rKGZpbmFsIFN0cmluZyByZWxhdGlvbikgeworICAgICAgICByZXR1cm4gbWVzc2FnZUNvbnRleHQuaGFzTGluayhyZWxhdGlvbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpbmsgZ2V0TGluayhmaW5hbCBTdHJpbmcgcmVsYXRpb24pIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VDb250ZXh0LmdldExpbmsocmVsYXRpb24pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaW5rLkJ1aWxkZXIgZ2V0TGlua0J1aWxkZXIoZmluYWwgU3RyaW5nIHJlbGF0aW9uKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlQ29udGV4dC5nZXRMaW5rQnVpbGRlcihyZWxhdGlvbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaGFzRW50aXR5KCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUNvbnRleHQuaGFzRW50aXR5KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdCBnZXRFbnRpdHkoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlQ29udGV4dC5nZXRFbnRpdHkoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBuZXcgbWVzc2FnZSBtZXNzYWdlIGVudGl0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbnRpdHkgZW50aXR5IG9iamVjdC4KKyAgICAgKiBAc2VlIGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVudGl0eShmaW5hbCBPYmplY3QgZW50aXR5KSB7CisgICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldEVudGl0eShlbnRpdHkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBhIG5ldyBtZXNzYWdlIG1lc3NhZ2UgZW50aXR5LgorICAgICAqCisgICAgICogQHBhcmFtIGVudGl0eSAgICAgIGVudGl0eSBvYmplY3QuCisgICAgICogQHBhcmFtIGFubm90YXRpb25zIGFubm90YXRpb25zIGF0dGFjaGVkIHRvIHRoZSBlbnRpdHkuCisgICAgICogQHNlZSBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbnRpdHkoZmluYWwgT2JqZWN0IGVudGl0eSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zKSB7CisgICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldEVudGl0eShlbnRpdHksIGFubm90YXRpb25zKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBuZXcgbWVzc2FnZSBtZXNzYWdlIGVudGl0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbnRpdHkgICAgICBlbnRpdHkgb2JqZWN0LgorICAgICAqIEBwYXJhbSB0eXBlICAgICAgICBkZWNsYXJlZCBlbnRpdHkgY2xhc3MuCisgICAgICogQHBhcmFtIGFubm90YXRpb25zIGFubm90YXRpb25zIGF0dGFjaGVkIHRvIHRoZSBlbnRpdHkuCisgICAgICogQHNlZSBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbnRpdHkoZmluYWwgT2JqZWN0IGVudGl0eSwgZmluYWwgVHlwZSB0eXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0RW50aXR5KGVudGl0eSwgdHlwZSwgYW5ub3RhdGlvbnMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEVudGl0eShmaW5hbCBPYmplY3QgZW50aXR5LCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0RW50aXR5KGVudGl0eSwgYW5ub3RhdGlvbnMsIG1lZGlhVHlwZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBtZXNzYWdlIGNvbnRlbnQgbWVkaWEgdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZWRpYVR5cGUgbWVzc2FnZSBjb250ZW50IG1lZGlhIHR5cGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWVkaWFUeXBlKGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0TWVkaWFUeXBlKG1lZGlhVHlwZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENsYXNzPD8+IGdldEVudGl0eUNsYXNzKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUNvbnRleHQuZ2V0RW50aXR5Q2xhc3MoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVHlwZSBnZXRFbnRpdHlUeXBlKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUNvbnRleHQuZ2V0RW50aXR5VHlwZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbWVzc2FnZSBlbnRpdHkgdHlwZSBpbmZvcm1hdGlvbi4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIG92ZXJyaWRlcyBhbnkgY29tcHV0ZWQgb3IgcHJldmlvdXNseSBzZXQgZW50aXR5IHR5cGUgaW5mb3JtYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSBvdmVycmlkaW5nIG1lc3NhZ2UgZW50aXR5IHR5cGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW50aXR5VHlwZShmaW5hbCBUeXBlIHR5cGUpIHsKKyAgICAgICAgVHlwZSB0ID0gdHlwZTsKKyAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkVHlwZSkgeworICAgICAgICAgICAgZmluYWwgUGFyYW1ldGVyaXplZFR5cGUgcGFyYW1ldGVyaXplZFR5cGUgPSAoUGFyYW1ldGVyaXplZFR5cGUpIHR5cGU7CisgICAgICAgICAgICBpZiAocGFyYW1ldGVyaXplZFR5cGUuZ2V0UmF3VHlwZSgpLmVxdWFscyhHZW5lcmljRW50aXR5LmNsYXNzKSkgeworICAgICAgICAgICAgICAgIHQgPSBwYXJhbWV0ZXJpemVkVHlwZS5nZXRBY3R1YWxUeXBlQXJndW1lbnRzKClbMF07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtZXNzYWdlQ29udGV4dC5zZXRFbnRpdHlUeXBlKHQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBbm5vdGF0aW9uW10gZ2V0RW50aXR5QW5ub3RhdGlvbnMoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlQ29udGV4dC5nZXRFbnRpdHlBbm5vdGF0aW9ucygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgYW5ub3RhdGlvbnMgYXR0YWNoZWQgdG8gdGhlIGVudGl0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbm5vdGF0aW9ucyBlbnRpdHkgYW5ub3RhdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW50aXR5QW5ub3RhdGlvbnMoZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zKSB7CisgICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldEVudGl0eUFubm90YXRpb25zKGFubm90YXRpb25zKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldEVudGl0eVN0cmVhbSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VDb250ZXh0LmdldEVudGl0eVN0cmVhbSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEVudGl0eVN0cmVhbShmaW5hbCBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtKSB7CisgICAgICAgIG1lc3NhZ2VDb250ZXh0LnNldEVudGl0eVN0cmVhbShvdXRwdXRTdHJlYW0pOworICAgIH0KKworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBvdXRwdXQgc3RyZWFtIHByb3ZpZGVyIGNhbGxiYWNrLgorICAgICAqIDxwLz4KKyAgICAgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgZmlyc3QgYnl0ZXMgYXJlIHdyaXR0ZW4gdG8gdGhlIHtAbGluayAjZ2V0RW50aXR5U3RyZWFtKCkgZW50aXR5IHN0cmVhbX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyZWFtUHJvdmlkZXIgbm9uLXtAY29kZSBudWxsfSBvdXRwdXQgc3RyZWFtIHByb3ZpZGVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0cmVhbVByb3ZpZGVyKGZpbmFsIE91dGJvdW5kTWVzc2FnZUNvbnRleHQuU3RyZWFtUHJvdmlkZXIgc3RyZWFtUHJvdmlkZXIpIHsKKyAgICAgICAgbWVzc2FnZUNvbnRleHQuc2V0U3RyZWFtUHJvdmlkZXIoc3RyZWFtUHJvdmlkZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVuYWJsZSBhIGJ1ZmZlcmluZyBvZiBzZXJpYWxpemVkIGVudGl0eS4gVGhlIGJ1ZmZlcmluZyB3aWxsIGJlIGNvbmZpZ3VyZWQgZnJvbSBjb25maWd1cmF0aW9uLiBUaGUgcHJvcGVydHkKKyAgICAgKiBkZXRlcm1pbmluZyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIGlzIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5Db21tb25Qcm9wZXJ0aWVzI09VVEJPVU5EX0NPTlRFTlRfTEVOR1RIX0JVRkZFUn0uCisgICAgICogPHAvPgorICAgICAqIFRoZSBidWZmZXJpbmcgZnVuY3Rpb25hbGl0eSBpcyBieSBkZWZhdWx0IGRpc2FibGVkIGFuZCBjb3VsZCBiZSBlbmFibGVkIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2QuIEluIHRoaXMgY2FzZQorICAgICAqIHRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBmaXJzdCBieXRlcyBhcmUgd3JpdHRlbiB0byB0aGUge0BsaW5rICNnZXRFbnRpdHlTdHJlYW0oKSBlbnRpdHkgc3RyZWFtfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uIHJ1bnRpbWUgY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBlbmFibGVCdWZmZXJpbmcoZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7CisgICAgICAgIG1lc3NhZ2VDb250ZXh0LmVuYWJsZUJ1ZmZlcmluZyhjb25maWd1cmF0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21taXQgdGhlIHtAbGluayAjZ2V0RW50aXR5U3RyZWFtKCkgZW50aXR5IHN0cmVhbX0gdW5sZXNzIGFscmVhZHkgY29tbWl0dGVkLgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpbiBjYXNlIG9mIHRoZSBJTyBlcnJvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjb21taXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBtZXNzYWdlQ29udGV4dC5jb21taXRTdHJlYW0oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGUgZW50aXR5IHN0cmVhbSBoYXMgYmVlbiBjb21taXR0ZWQuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGVudGl0eSBzdHJlYW0gaGFzIGJlZW4gY29tbWl0dGVkLiBPdGhlcndpc2UgcmV0dXJucyB7QGNvZGUgZmFsc2V9LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzQ29tbWl0dGVkKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUNvbnRleHQuaXNDb21taXR0ZWQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIHJlc3BvbnNlLiBGbHVzaGVzIGFuZCBjbG9zZXMgdGhlIGVudGl0eSBzdHJlYW0sIGZyZWVzIHVwIGNvbnRhaW5lciByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoCisgICAgICogdGhlIGNvcnJlc3BvbmRpbmcgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgaWYgKCFjbG9zZWQpIHsKKyAgICAgICAgICAgIGNsb3NlZCA9IHRydWU7CisgICAgICAgICAgICBtZXNzYWdlQ29udGV4dC5jbG9zZSgpOworICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuZ2V0UmVzcG9uc2VXcml0ZXIoKS5jb21taXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoZSByZXNwb25zZSBlbnRpdHkgaXMgYSB7QGxpbmsgQ2h1bmtlZE91dHB1dH0gaW5zdGFuY2UuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGVudGl0eSBpcyBhIHtAbGluayBDaHVua2VkT3V0cHV0fSBpbnN0YW5jZSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNDaHVua2VkKCkgeworICAgICAgICByZXR1cm4gaGFzRW50aXR5KCkgJiYgQ2h1bmtlZE91dHB1dC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGdldEVudGl0eSgpLmdldENsYXNzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL0V4dGVuZGVkUmVzb3VyY2VDb250ZXh0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9FeHRlbmRlZFJlc291cmNlQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZjMzM2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9FeHRlbmRlZFJlc291cmNlQ29udGV4dC5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyOworCitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlJlc291cmNlQ29udGV4dDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1vZGVsOworCisvKioKKyAqIEplcnNleSBleHRlbnNpb24gb2Yge0BsaW5rIFJlc291cmNlQ29udGV4dH0uCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICoKKyAqLworcHVibGljIGludGVyZmFjZSBFeHRlbmRlZFJlc291cmNlQ29udGV4dCBleHRlbmRzIFJlc291cmNlQ29udGV4dCB7CisgICAgLyoqCisgICAgICogUmV0dXJuIHtAbGluayBSZXNvdXJjZU1vZGVsIHJlc291cmNlIG1vZGVsfSBmcm9tIHdoaWNoIHRoZSBjdXJyZW50IGplcnNleSBhcHBsaWNhdGlvbiBpcyBidWlsdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gUmVzb3VyY2UgbW9kZWwgd2l0aCBhbGwgcmVzb3VyY2VzIGluY2x1ZGluZyByZXNvdXJjZXMgY3JlYXRlZAorICAgICAqIGJ5IHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuc2Nhbm5pbmcuUmVzb3VyY2VQcm9jZXNzb3IgcmVzb3VyY2UgcHJvY2Vzc29yfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzb3VyY2VNb2RlbCBnZXRSZXNvdXJjZU1vZGVsKCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9FeHRlbmRlZFVyaUluZm8uamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL0V4dGVuZGVkVXJpSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMmM4NzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9FeHRlbmRlZFVyaUluZm8uamF2YQpAQCAtMCwwICsxLDE5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hSZXN1bHQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlBhdGhTZWdtZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNZXRob2Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJ1bnRpbWVSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS51cmkuVXJpVGVtcGxhdGU7CisKKy8qKgorICogRXh0ZW5zaW9ucyB0byB7QGxpbmsgVXJpSW5mb30uCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitwdWJsaWMgaW50ZXJmYWNlIEV4dGVuZGVkVXJpSW5mbyBleHRlbmRzIFVyaUluZm8geworCisgICAgLyoqCisgICAgICogR2V0IHRoZSB0aHJvd2FibGUgdGhhdCB3YXMgbWFwcGVkIHRvIGEgcmVzcG9uc2UuCisgICAgICogPHA+CisgICAgICogQSByZXNwb25zZSBmaWx0ZXIgb3IgYSBtZXNzYWdlIGJvZHkgd3JpdGVyIG1heSB1dGlsaXplIHRoaXMgbWV0aG9kIHRvCisgICAgICogZGV0ZXJtaW5lIGlmIGEgcmVzb3VyY2UgbWV0aG9kIHdhcyBpbnZva2VkIGJ1dCBkaWQgbm90IHJldHVybiBhCisgICAgICogcmVzcG9uc2UgYmVjYXVzZSBhbiBleGNlcHRpb24gd2FzIHRocm93biBmcm9tIHRoZSByZXNvdXJjZSBtZXRob2QsIG9yCisgICAgICogdGhlIHJlc291cmNlIG1ldGhvZCByZXR1cm5lZCBidXQgYSByZXNwb25zZSBmaWx0ZXIgdGhyZXcgYW4gZXhjZXB0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgdGhyb3dhYmxlIHRoYXQgd2FzIG1hcHBlZCB0byBhIHJlc3BvbnNlLCBvdGhlcndpc2UgbnVsbAorICAgICAqICAgICAgICAgaWYgbm8gdGhyb3dhYmxlIHdhcyBtYXBwZWQgdG8gYSByZXNwb25zZS4KKyAgICAgKi8KKyAgICBUaHJvd2FibGUgZ2V0TWFwcGVkVGhyb3dhYmxlKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSByZWFkLW9ubHkgbGlzdCBvZiB7QGxpbmsgTWF0Y2hSZXN1bHR9IGZvciBtYXRjaGVkIHJlc291cmNlcy4KKyAgICAgKiBFbnRyaWVzIGFyZSBvcmRlcmVkIGluIHJldmVyc2UgcmVxdWVzdCBVUkkgbWF0Y2hpbmcgb3JkZXIsIHdpdGggdGhlCisgICAgICogcm9vdCByZXNvdXJjZSBtYXRjaCByZXN1bHQgbGFzdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSByZWFkLW9ubHkgbGlzdCBvZiBtYXRjaCByZXN1bHRzIGZvciBtYXRjaGVkIHJlc291cmNlcy4KKyAgICAgKi8KKyAgICBMaXN0PE1hdGNoUmVzdWx0PiBnZXRNYXRjaGVkUmVzdWx0cygpOworCisgICAgLyoqCisgICAgICogR2V0IGEgcmVhZC1vbmx5IGxpc3Qgb2Yge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnVyaS5VcmlUZW1wbGF0ZX0gZm9yIG1hdGNoZWQgcmVzb3VyY2VzLgorICAgICAqIEVhY2ggZW50cnkgaXMgYSBVUkkgdGVtcGxhdGUgdGhhdCBpcyB0aGUgdmFsdWUgb2YgdGhlCisgICAgICoge0BsaW5rIGphdmF4LndzLnJzLlBhdGh9IHRoYXQgaXMgYSBwYXJ0aWFsIHBhdGggdGhhdCBtYXRjaGVkIGEgcmVzb3VyY2UKKyAgICAgKiBjbGFzcywgYSBzdWItcmVzb3VyY2UgbWV0aG9kIG9yIGEgc3ViLXJlc291cmNlIGxvY2F0b3IuCisgICAgICogRW50cmllcyBhcmUgb3JkZXJlZCBpbiByZXZlcnNlIHJlcXVlc3QgVVJJIG1hdGNoaW5nIG9yZGVyLCB3aXRoIHRoZQorICAgICAqIHJvb3QgcmVzb3VyY2UgVVJJIHRlbXBsYXRlIGxhc3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgcmVhZC1vbmx5IGxpc3Qgb2YgVVJJIHRlbXBsYXRlcyBmb3IgbWF0Y2hlZCByZXNvdXJjZXMuCisgICAgICovCisgICAgTGlzdDxVcmlUZW1wbGF0ZT4gZ2V0TWF0Y2hlZFRlbXBsYXRlcygpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBwYXRoIHNlZ21lbnRzIHRoYXQgY29udGFpbiBhIHRlbXBsYXRlIHZhcmlhYmxlLgorICAgICAqIEFsbCBzZXF1ZW5jZXMgb2YgZXNjYXBlZCBvY3RldHMgYXJlIGRlY29kZWQsCisgICAgICogZXF1aXZhbGVudCB0byA8Y29kZT5nZXRQYXRoU2VnbWVudHModHJ1ZSk8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIHRlbXBsYXRlIHZhcmlhYmxlIG5hbWUKKyAgICAgKiBAcmV0dXJuIHRoZSBwYXRoIHNlZ21lbnRzLCB0aGUgbGlzdCB3aWxsIGJlIGVtcHR5IHRoZSBtYXRjaGluZyBwYXRoIGRvZXMKKyAgICAgKiAgICAgICAgIG5vdCBjb250YWluIHRoZSB0ZW1wbGF0ZQorICAgICAqLworICAgIExpc3Q8UGF0aFNlZ21lbnQ+IGdldFBhdGhTZWdtZW50cyhTdHJpbmcgbmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHBhdGggc2VnbWVudHMgdGhhdCBjb250YWluIGEgdGVtcGxhdGUgdmFyaWFibGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgdGVtcGxhdGUgdmFyaWFibGUgbmFtZQorICAgICAqIEBwYXJhbSBkZWNvZGUgY29udHJvbHMgd2hldGhlciBzZXF1ZW5jZXMgb2YgZXNjYXBlZCBvY3RldHMgYXJlIGRlY29kZWQKKyAgICAgKiAodHJ1ZSkgb3Igbm90IChmYWxzZSkuCisgICAgICogQHJldHVybiB0aGUgcGF0aCBzZWdtZW50cywgdGhlIGxpc3Qgd2lsbCBiZSBlbXB0eSB0aGUgbWF0Y2hpbmcgcGF0aCBkb2VzCisgICAgICogICAgICAgICBub3QgY29udGFpbiB0aGUgdGVtcGxhdGUKKyAgICAgKi8KKyAgICBMaXN0PFBhdGhTZWdtZW50PiBnZXRQYXRoU2VnbWVudHMoU3RyaW5nIG5hbWUsIGJvb2xlYW4gZGVjb2RlKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbGwgbWF0Y2hlZCB7QGxpbmsgUnVudGltZVJlc291cmNlIHJ1bnRpbWUgcmVzb3VyY2VzfSBpbmNsdWRpbmcgcnVudGltZSByZXNvdXJjZXMKKyAgICAgKiBiYXNlZCBvbiBjaGlsZCByZXNvdXJjZXMuIFRoZSBsaXN0IGlzIG9yZGVyZWQgc28gdGhhdCB0aGUge0BsaW5rIFJ1bnRpbWVSZXNvdXJjZSBydW50aW1lIHJlc291cmNlfQorICAgICAqIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQgaXMgdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGxpc3QuCisgICAgICoKKyAgICAgKiA8cC8+CisgICAgICogVGhlIGZvbGxvd2luZyBleGFtcGxlCisgICAgICogPHByZT4mIzA2NDtQYXRoKCJmb28iKQorICAgICAqIHB1YmxpYyBjbGFzcyBGb29SZXNvdXJjZSB7CisgICAgICogICYjMDY0O0dFVAorICAgICAqICBwdWJsaWMgU3RyaW5nIGdldEZvbygpIHsuLi59CisgICAgICoKKyAgICAgKiAgJiMwNjQ7UGF0aCgiYmFyIikKKyAgICAgKiAgcHVibGljIEJhclJlc291cmNlIGdldEJhclJlc291cmNlKCkgey4uLn0KKyAgICAgKiB9CisgICAgICoKKyAgICAgKiBwdWJsaWMgY2xhc3MgQmFyUmVzb3VyY2UgeworICAgICAqICAmIzA2NDtHRVQKKyAgICAgKiAgcHVibGljIFN0cmluZyBnZXRCYXIoKSB7Li4ufQorICAgICAqIH0KKyAgICAgKiA8L3ByZT4KKyAgICAgKgorICAgICAqIDxwPlRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkgdGhpcyBtZXRob2QgYmFzZWQgb24gcmVxdWVzdCB1cmkgYW5kIHdoZXJlCisgICAgICogdGhlIG1ldGhvZCBpcyBjYWxsZWQgZnJvbSBhcmU6PC9wPgorICAgICAqCisgICAgICogPHRhYmxlIGJvcmRlcj0iMSI+CisgICAgICogPHRyPgorICAgICAqIDx0aD5SZXF1ZXN0PC90aD4KKyAgICAgKiA8dGg+Q2FsbGVkIGZyb208L3RoPgorICAgICAqIDx0aD5WYWx1ZShzKTwvdGg+CisgICAgICogPC90cj4KKyAgICAgKiA8dHI+CisgICAgICogPHRkPkdFVCAvZm9vPC90ZD4KKyAgICAgKiA8dGQ+Rm9vUmVzb3VyY2UuZ2V0Rm9vPC90ZD4KKyAgICAgKiA8dGQ+UnVudGltZVJlc291cmNlWyIvZm9vIl08L3RkPgorICAgICAqIDwvdHI+CisgICAgICogPHRyPgorICAgICAqIDx0ZD5HRVQgL2Zvby9iYXI8L3RkPgorICAgICAqIDx0ZD5Gb29SZXNvdXJjZS5nZXRCYXJSZXNvdXJjZTwvdGQ+CisgICAgICogPHRkPlJ1bnRpbWVSZXNvdXJjZVsiZm9vL2JhciJdLCBSZXNvdXJjZVsiZm9vIl08L3RkPgorICAgICAqIDwvdHI+CisgICAgICogPHRyPgorICAgICAqIDx0ZD5HRVQgL2Zvby9iYXI8L3RkPgorICAgICAqIDx0ZD5CYXJSZXNvdXJjZS5nZXRCYXI8L3RkPgorICAgICAqIDx0ZD5SdW50aW1lUmVzb3VyY2Vbbm8gcGF0aDsgYmFzZWQgb24gQmFyUmVzb3VyY2UuY2xhc3NdLCBSdW50aW1lUmVzb3VyY2VbImZvby9iYXIiXSwgUnVudGltZVJlc291cmNlWyJmb28iXTwvdGQ+CisgICAgICogPC90cj4KKyAgICAgKiA8L3RhYmxlPgorCisgICAgICogQHJldHVybiBMaXN0IG9mIHJlc291cmNlcyBhbmQgY2hpbGQgcmVzb3VyY2VzIHRoYXQgd2VyZSBwcm9jZXNzZWQgZHVyaW5nIHJlcXVlc3QgbWF0Y2hpbmcuCisgICAgICovCisgICAgcHVibGljIExpc3Q8UnVudGltZVJlc291cmNlPiBnZXRNYXRjaGVkUnVudGltZVJlc291cmNlcygpOworCisgICAgLyoqCisgICAgICogR2V0IG1hdGNoZWQge0BsaW5rIFJlc291cmNlTWV0aG9kIHJlc291cmNlIG1ldGhvZH0gdGhhdCBpcyBpbnZva2VkLgorICAgICAqIDxwLz4KKyAgICAgKiBOb3RlIHRoYXQgc3ViIHJlc291cmNlIGxvY2F0b3IgaXMgbm90IG5vdCBjb25zaWRlcmVkIGFzIGEgbWF0Y2hlZCByZXNvdXJjZSBtZXRob2QgYW5kIGNhbGxpbmcgdGhlIG1ldGhvZCBmcm9tCisgICAgICogc3ViIHJlc291cmNlIGxvY2F0b3Igd2lsbCB0aGVyZWZvcmUgcmV0dXJuIG51bGwuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBtYXRjaGVkIHJlc291cmNlIG1ldGhvZCB0aGF0IHdhcyBpbnZva2VkIG9yIG51bGwgaWYgbm8gcmVzb3VyY2UgbWV0aG9kIHdhcyBpbnZva2VkLgorICAgICAqLworICAgIHB1YmxpYyBSZXNvdXJjZU1ldGhvZCBnZXRNYXRjaGVkUmVzb3VyY2VNZXRob2QoKTsKKworICAgIC8qKgorICAgICAqIEdldCBtYXRjaGVkIHtAbGluayBSZXNvdXJjZSBtb2RlbCByZXNvdXJjZX0gZnJvbSB3aGljaCB7QGxpbmsgI2dldE1hdGNoZWRSZXNvdXJjZU1ldGhvZCgpIHRoZSBtYXRjaGVkfSByZXNvdXJjZSBtZXRob2QKKyAgICAgKiB3YXMgaW52b2tlZC4gVGhlIHJlc291cmNlIGNhbiBhbHNvIGJlIGEgY2hpbGQgaWYgdGhlIG1hdGNoZWQgbWV0aG9kIGlzIGEgc3ViIHJlc291cmNlIG1ldGhvZC4KKyAgICAgKiA8cC8+CisgICAgICogTm90ZSB0aGF0IG1ldGhvZCByZXR1cm4gb25seSByZXNvdXJjZSBjb250YWluaW5nIGZpbmFsbHkgbWF0Y2hlZCB7QGxpbmsgUmVzb3VyY2VNZXRob2QgcmVzb3VyY2UgbWV0aG9kfQorICAgICAqIGFuZCBub3QgaW50ZXJtZWRpYXJ5IHByb2Nlc3NlZCByZXNvdXJjZXMgKHBhcmVudCByZXNvdXJjZXMgb3IgcmVzb3VyY2VzIGNvbnRhaW5pbmcgc3ViIHJlc291cmNlIGxvY2F0b3JzKS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIG1hdGNoZWQgbW9kZWwgcmVzb3VyY2Ugb3IgbnVsbCBpZiBubyByZXNvdXJjZSB3YXMgbWF0Y2hlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzb3VyY2UgZ2V0TWF0Y2hlZE1vZGVsUmVzb3VyY2UoKTsKKworICAgIC8qKgorICAgICAqIEdldCByZXNvdXJjZSBsb2NhdG9ycyBtYXRjaGVkIHNpbmNlIGJlZ2lubmluZyBvZiBhIG1hdGNoaW5nLiBUaGUgbGlzdCBjb250YWlucyByZXNvdXJjZQorICAgICAqIGxvY2F0b3JzIHNvcnRlZCBpbiB0aGUgb3JkZXIgdGhhdCB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgbGlzdCBpcyB0aGUgbGFzdCBsb2NhdG9yIGV4ZWN1dGVkIChMSUZPIG9yZGVyaW5nKS4KKyAgICAgKiBUaGUgbWV0aG9kIGNhbiBiZSBpbnZva2VkIGZyb20gcmVxdWVzdCBzY29wZWQgY29kZS4gV2hlbiBtZXRob2QgaXMgaW52b2tlZCBmcm9tIHRoZSByZXNvdXJjZSBsb2NhdG9yCisgICAgICogaXRzZWxmIHN1Y2ggYSBsb2NhdG9yIHdpbGwgYmUgYWxyZWFkeSBpbiB0aGUgcmV0dXJuZWQgbGlzdCBhcyBhIGZpcnN0IGVsZW1lbnQuCisgICAgICogPHA+CisgICAgICogVGhlIHJlc291cmNlIGxvY2F0b3IgaXMKKyAgICAgKiBhIHtAbGluayBSZXNvdXJjZU1ldGhvZCByZXNvdXJjZSBtZXRob2R9IHdoaWNoIGlzIGFubm90YXRlZCBieSB0aGUge0BsaW5rIGphdmF4LndzLnJzLlBhdGggQFBhdGh9CisgICAgICogYW5kIHJldHVybnMgYSBzdWIgcmVzb3VyY2UuCisgICAgICogPHAvPgorICAgICAqIEByZXR1cm4gTGlzdCBvZiBtYXRjaGVkIHJlc291cmNlIGxvY2F0b3JzLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFJlc291cmNlTWV0aG9kPiBnZXRNYXRjaGVkUmVzb3VyY2VMb2NhdG9ycygpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsaXN0IG9mIHN1YiByZXNvdXJjZXMgcmV0dXJuZWQgZnJvbSByZXNvdXJjZSBsb2NhdG9ycyBkdXJpbmcgbWF0Y2hpbmcuCisgICAgICogVGhlIHN1YiByZXNvdXJjZXMgYXJlIHNvcnRlZCBpbiB0aGUKKyAgICAgKiBvcmRlciwgc28gdGhhdCB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgbGlzdCBpcyBhIHN1YiByZXNvdXJjZSB0aGF0IHdhcyBsYXN0bHkgcmV0dXJuZWQgZnJvbSB0aGUKKyAgICAgKiByZXNvdXJjZSBsb2NhdG9yIChMSUZPIG9yZGVyaW5nKS4KKyAgICAgKiA8cC8+CisgICAgICogU3ViIHJlc291cmNlIGlzIGEgcmVzb3VyY2UgdGhhdCBpcyByZXR1cm5lZCBmcm9tIGludm9rZWQgcmVzb3VyY2UgbG9jYXRvciBtZXRob2QgYW5kIHRoYXQgd2lsbCBiZQorICAgICAqIHVzZWQgZm9yIGZ1cnRoZXIgcmVzb3VyY2UgbWF0Y2hpbmcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIExvY2F0b3Igc3ViIHJlc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFJlc291cmNlPiBnZXRMb2NhdG9yU3ViUmVzb3VyY2VzKCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9FeHRlcm5hbFJlcXVlc3RTY29wZUNvbmZpZ3VyYXRvci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvRXh0ZXJuYWxSZXF1ZXN0U2NvcGVDb25maWd1cmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2Q2N2QyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvRXh0ZXJuYWxSZXF1ZXN0U2NvcGVDb25maWd1cmF0b3IuamF2YQpAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlcjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Cb290c3RyYXBCYWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuQm9vdHN0cmFwQ29uZmlndXJhdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLlNlcnZpY2VGaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkFic3RyYWN0QmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbXBvbmVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuRXh0ZXJuYWxSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkV4dGVybmFsUmVxdWVzdFNjb3BlOworCisvKioKKyAqIENvbmZpZ3VyYXRvciB3aGljaCBpbml0aWFsaXplcyBhbmQgcmVnaXN0ZXIge0BsaW5rIEV4dGVybmFsUmVxdWVzdFNjb3BlfSBpbnN0YW5jZSBpbnRvIHtAbGluayBJbmplY3Rpb25NYW5hZ2VyfS4KKyAqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworY2xhc3MgRXh0ZXJuYWxSZXF1ZXN0U2NvcGVDb25maWd1cmF0b3IgaW1wbGVtZW50cyBCb290c3RyYXBDb25maWd1cmF0b3IgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoRXh0ZXJuYWxSZXF1ZXN0U2NvcGVDb25maWd1cmF0b3IuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGluaXQoSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyLCBCb290c3RyYXBCYWcgYm9vdHN0cmFwQmFnKSB7CisgICAgICAgIFNlcnZlckJvb3RzdHJhcEJhZyBzZXJ2ZXJCYWcgPSAoU2VydmVyQm9vdHN0cmFwQmFnKSBib290c3RyYXBCYWc7CisKKyAgICAgICAgQ2xhc3M8RXh0ZXJuYWxSZXF1ZXN0U2NvcGU+W10gZXh0U2NvcGVzID0gU2VydmljZUZpbmRlci5maW5kKEV4dGVybmFsUmVxdWVzdFNjb3BlLmNsYXNzLCB0cnVlKS50b0NsYXNzQXJyYXkoKTsKKyAgICAgICAgYm9vbGVhbiBleHRTY29wZUJvdW5kID0gZmFsc2U7CisKKyAgICAgICAgaWYgKGV4dFNjb3Blcy5sZW5ndGggPT0gMSkgeworICAgICAgICAgICAgZm9yIChDb21wb25lbnRQcm92aWRlciBwIDogc2VydmVyQmFnLmdldENvbXBvbmVudFByb3ZpZGVycygpLmdldCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKHAuYmluZChleHRTY29wZXNbMF0sIENvbGxlY3Rpb25zLnNpbmdsZXRvbihFeHRlcm5hbFJlcXVlc3RTY29wZS5jbGFzcykpKSB7CisgICAgICAgICAgICAgICAgICAgIGV4dFNjb3BlQm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZXh0U2NvcGVzLmxlbmd0aCA+IDEpIHsKKyAgICAgICAgICAgIGlmIChMT0dHRVIuaXNMb2dnYWJsZShMZXZlbC5XQVJOSU5HKSkgeworICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2NvcGVMaXN0ID0gbmV3IFN0cmluZ0J1aWxkZXIoIlxuIik7CisgICAgICAgICAgICAgICAgZm9yIChDbGFzczxFeHRlcm5hbFJlcXVlc3RTY29wZT4gZXJzIDogZXh0U2NvcGVzKSB7CisgICAgICAgICAgICAgICAgICAgIHNjb3BlTGlzdC5hcHBlbmQoIiAgICIpLmFwcGVuZChlcnMuZ2V0VHlwZVBhcmFtZXRlcnMoKVswXSkuYXBwZW5kKCdcbicpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBMT0dHRVIud2FybmluZyhMb2NhbGl6YXRpb25NZXNzYWdlcy5XQVJOSU5HX1RPT19NQU5ZX0VYVEVSTkFMX1JFUV9TQ09QRVMoc2NvcGVMaXN0LnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghZXh0U2NvcGVCb3VuZCkgeworICAgICAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5yZWdpc3RlcihuZXcgTm9vcEV4dGVybmFsUmVxdWVzdFNjb3BlQmluZGVyKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm9vcEV4dGVybmFsUmVxdWVzdFNjb3BlQmluZGVyIGV4dGVuZHMgQWJzdHJhY3RCaW5kZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgICAgICBiaW5kKE5PT1BfRVhURVJOQUxfUkVRX1NDT1BFKS50byhFeHRlcm5hbFJlcXVlc3RTY29wZS5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBFeHRlcm5hbFJlcXVlc3RTY29wZTxPYmplY3Q+IE5PT1BfRVhURVJOQUxfUkVRX1NDT1BFID0gbmV3IEV4dGVybmFsUmVxdWVzdFNjb3BlPE9iamVjdD4oKSB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBFeHRlcm5hbFJlcXVlc3RDb250ZXh0PE9iamVjdD4gb3BlbihJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHN1c3BlbmQoRXh0ZXJuYWxSZXF1ZXN0Q29udGV4dDxPYmplY3Q+IG8sIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlcikgeworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJlc3VtZShFeHRlcm5hbFJlcXVlc3RDb250ZXh0PE9iamVjdD4gbywgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyKSB7CisgICAgICAgIH0KKyAgICB9OworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvSlNPTlAuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL0pTT05QLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUzYWM5ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL0pTT05QLmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCisvKioKKyAqIEFubm90YXRpb24gY2FuIGJlIHVzZWQgdG8gZGVmaW5lIHRoZSBKYXZhU2NyaXB0IGNhbGxiYWNrIGZ1bmN0aW9uIG5hbWUgaWYgdGhlIHZhbGlkIEpTT05QIGZvcm1hdCBpcyByZXF1ZXN0ZWQgYXMgYW4KKyAqIGFjY2VwdGFibGUge0BsaW5rIGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlIG1lZGlhIHR5cGV9IG9mIHRoaXMgcmVxdWVzdC4gQXQgdGhlIG1vbWVudCBvbmx5IHJlc291cmNlIG1ldGhvZHMgYXJlIHN1cHBvcnRlZCB0bworICogYmUgYW5ub3RhdGVkIHdpdGggdGhpcyBhbm5vdGF0aW9uLgorICogPHAvPgorICogVGhlIGFjY2VwdGFibGUgSmF2YVNjcmlwdCBtZWRpYSB0eXBlcyBmb3IgSlNPTlAgY29tcGF0aWJsZSB3aXRoIHRoaXMgYW5ub3RhdGlvbiBhcmU6CisgKiA8dWw+CisgKiA8bGk+YXBwbGljYXRpb24veC1qYXZhc2NyaXB0PC9saT4KKyAqIDxsaT5hcHBsaWNhdGlvbi9qYXZhc2NyaXB0PC9saT4KKyAqIDxsaT5hcHBsaWNhdGlvbi9lY21hc2NyaXB0PC9saT4KKyAqIDxsaT50ZXh0L2phdmFzY3JpcHQ8L2xpPgorICogPGxpPnRleHQveC1qYXZhc2NyaXB0PC9saT4KKyAqIDxsaT50ZXh0L2VjbWFzY3JpcHQ8L2xpPgorICogPGxpPnRleHQvanNjcmlwdDwvbGk+CisgKiA8L3VsPgorICogPHAvPgorICogTm90ZTogRGV0ZXJtaW5pbmcgdGhlIEphdmFTY3JpcHQgY2FsbGJhY2sgZnVuY3Rpb24gbmFtZSBmcm9tIGEgcXVlcnkgcGFyYW1ldGVyICh7QGxpbmsgI3F1ZXJ5UGFyYW19KSB0YWtlcyBwcmVjZWRlbmNlIG92ZXIKKyAqIHRoZSB7QGxpbmsgI2NhbGxiYWNrKCl9IHZhbHVlLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAVGFyZ2V0KHtFbGVtZW50VHlwZS5NRVRIT0R9KQorQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BEb2N1bWVudGVkCitwdWJsaWMgQGludGVyZmFjZSBKU09OUCB7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IEphdmFTY3JpcHQgY2FsbGJhY2sgZnVuY3Rpb24gbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NBTExCQUNLID0gImNhbGxiYWNrIjsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgcXVlcnkgcGFyYW1ldGVyIG5hbWUgdG8gb2J0YWluIHRoZSBKYXZhU2NyaXB0IGNhbGxiYWNrIGZ1bmN0aW9uIG5hbWUgZnJvbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1FVRVJZID0gIl9fY2FsbGJhY2siOworCisgICAgLyoqCisgICAgICogTmFtZSBvZiB0aGUgSmF2YVNjcmlwdCBjYWxsYmFjayBmdW5jdGlvbiB0byB3aGljaCB0aGUgSlNPTiByZXN1bHQgc2hvdWxkIGJlIHdyYXBwZWQgaW50by4KKyAgICAgKi8KKyAgICBTdHJpbmcgY2FsbGJhY2soKSBkZWZhdWx0IERFRkFVTFRfQ0FMTEJBQ0s7CisKKyAgICAvKioKKyAgICAgKiBJZiBzZXQgdGhlbiB0aGUgSmF2YVNjcmlwdCBjYWxsYmFjayBmdW5jdGlvbiBuYW1lIGlzIG9idGFpbmVkIGZyb20gYSBxdWVyeSBwYXJhbWV0ZXIgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4gSWYgdGhpcyBxdWVyeQorICAgICAqIHBhcmFtZXRlciBpcyBub3QgcHJlc2VudCBpbiB0aGUgcmVxdWVzdCB0aGVuIHRoZSB2YWx1ZSBvZiB7QGxpbmsgI2NhbGxiYWNrKCl9IHByb3BlcnR5IGlzIHVzZWQgYXMgdGhlIEphdmFTY3JpcHQgY2FsbGJhY2sKKyAgICAgKiBmdW5jdGlvbiBuYW1lLgorICAgICAqLworICAgIFN0cmluZyBxdWVyeVBhcmFtKCkgZGVmYXVsdCAiIjsKK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL0plcnNleVJlc291cmNlQ29udGV4dENvbmZpZ3VyYXRvci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvSmVyc2V5UmVzb3VyY2VDb250ZXh0Q29uZmlndXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjcyYTBiNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL0plcnNleVJlc291cmNlQ29udGV4dENvbmZpZ3VyYXRvci5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyOworCitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5SZXNvdXJjZUNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Cb290c3RyYXBCYWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuQm9vdHN0cmFwQ29uZmlndXJhdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5CaW5kaW5nOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5CaW5kaW5nczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5zdGFuY2VCaW5kaW5nOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5KZXJzZXlSZXNvdXJjZUNvbnRleHQ7CisKKy8qKgorICogQ29uZmlndXJhdG9yIHdoaWNoIGluaXRpYWxpemVzIGFuZCByZWdpc3RlciB7QGxpbmsgSmVyc2V5UmVzb3VyY2VDb250ZXh0fSBpbnN0YW5jZSBpbnRvIHtAbGluayBJbmplY3Rpb25NYW5hZ2VyfSBhbmQKKyAqIHtAbGluayBCb290c3RyYXBCYWd9LgorICoKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitjbGFzcyBKZXJzZXlSZXNvdXJjZUNvbnRleHRDb25maWd1cmF0b3IgaW1wbGVtZW50cyBCb290c3RyYXBDb25maWd1cmF0b3IgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaW5pdChJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIsIEJvb3RzdHJhcEJhZyBib290c3RyYXBCYWcpIHsKKyAgICAgICAgU2VydmVyQm9vdHN0cmFwQmFnIHNlcnZlckJhZyA9IChTZXJ2ZXJCb290c3RyYXBCYWcpIGJvb3RzdHJhcEJhZzsKKyAgICAgICAgQ29uc3VtZXI8QmluZGluZz4gcmVnaXN0ZXJCaW5kaW5nID0gaW5qZWN0aW9uTWFuYWdlcjo6cmVnaXN0ZXI7CisgICAgICAgIEZ1bmN0aW9uPENsYXNzPD8+LCA/PiBnZXRPckNyZWF0ZUluc3RhbmNlID0gY2xhenogLT4gSW5qZWN0aW9ucy5nZXRPckNyZWF0ZShpbmplY3Rpb25NYW5hZ2VyLCBjbGF6eik7CisgICAgICAgIENvbnN1bWVyPE9iamVjdD4gaW5qZWN0SW5zdGFuY2UgPSBpbmplY3Rpb25NYW5hZ2VyOjppbmplY3Q7CisKKyAgICAgICAgLy8gSW5pdGlhbGl6ZSBhbmQgcmVnaXN0ZXIgUmVzb3VyY2UgQ29udGV4dAorICAgICAgICBKZXJzZXlSZXNvdXJjZUNvbnRleHQgcmVzb3VyY2VDb250ZXh0ID0gbmV3IEplcnNleVJlc291cmNlQ29udGV4dChnZXRPckNyZWF0ZUluc3RhbmNlLCBpbmplY3RJbnN0YW5jZSwgcmVnaXN0ZXJCaW5kaW5nKTsKKyAgICAgICAgSW5zdGFuY2VCaW5kaW5nPEplcnNleVJlc291cmNlQ29udGV4dD4gcmVzb3VyY2VDb250ZXh0QmluZGluZyA9CisgICAgICAgICAgICAgICAgQmluZGluZ3Muc2VydmljZShyZXNvdXJjZUNvbnRleHQpCisgICAgICAgICAgICAgICAgICAgICAgICAudG8oUmVzb3VyY2VDb250ZXh0LmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgLnRvKEV4dGVuZGVkUmVzb3VyY2VDb250ZXh0LmNsYXNzKTsKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5yZWdpc3RlcihyZXNvdXJjZUNvbnRleHRCaW5kaW5nKTsKKyAgICAgICAgc2VydmVyQmFnLnNldFJlc291cmNlQ29udGV4dChyZXNvdXJjZUNvbnRleHQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHBvc3RJbml0KEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciwgQm9vdHN0cmFwQmFnIGJvb3RzdHJhcEJhZykgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL01hbmFnZWRBc3luYy5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvTWFuYWdlZEFzeW5jLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQxNzg5YQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL01hbmFnZWRBc3luYy5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworLyoqCisgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgcmVzb3VyY2UgbWV0aG9kIHRvIHdoaWNoIHRoZSBhbm5vdGF0aW9uIGhhcyBiZWVuIGFwcGxpZWQKKyAqIHNob3VsZCBiZSBleGVjdXRlZCBvbiBhIHNlcGFyYXRlIHRocmVhZCBtYW5hZ2VkIGJ5IGFuIGludGVybmFsIEplcnNleQorICoge0BsaW5rIGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZSBleGVjdXRvciBzZXJ2aWNlfS4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitAVGFyZ2V0KHtFbGVtZW50VHlwZS5NRVRIT0R9KQorQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BEb2N1bWVudGVkCitwdWJsaWMgQGludGVyZmFjZSBNYW5hZ2VkQXN5bmMgeworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvTWFuYWdlZEFzeW5jRXhlY3V0b3IuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL01hbmFnZWRBc3luY0V4ZWN1dG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGExY2YxMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL01hbmFnZWRBc3luY0V4ZWN1dG9yLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkluaGVyaXRlZDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworaW1wb3J0IGphdmF4LmluamVjdC5RdWFsaWZpZXI7CisKKy8qKgorICogSW5qZWN0aW9uIHF1YWxpZmllciB0aGF0IGNhbiBiZSB1c2VkIHRvIGluamVjdCBhbiB7QGxpbmsgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlfQorICogaW5zdGFuY2UgdXNlZCBieSBKZXJzZXkgdG8gZXhlY3V0ZSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLk1hbmFnZWRBc3luYyBtYW5hZ2VkIGFzeW5jaHJvbm91cyByZXF1ZXN0c30uCisgKiA8cD4KKyAqIFRoZSBtYW5hZ2VkIGFzeW5jaHJvbm91cyByZXF1ZXN0IGV4ZWN1dG9yIHNlcnZpY2UgaW5zdGFuY2UgaW5qZWN0ZWQgdXNpbmcgdGhpcyBpbmplY3Rpb24gcXVhbGlmaWVyIGNhbiBiZSBjdXN0b21pemVkCisgKiBieSByZWdpc3RlcmluZyBhIGN1c3RvbSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLkV4ZWN1dG9yU2VydmljZVByb3ZpZGVyfSBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzIGl0c2VsZiBhbm5vdGF0ZWQKKyAqIHdpdGggdGhlIHtAY29kZSAmIzY0O01hbmFnZWRBc3luY0V4ZWN1dG9yfSBhbm5vdGF0aW9uLgorICogPC9wPgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKiBAc2VlIE1hbmFnZWRBc3luY0V4ZWN1dG9yTGl0ZXJhbAorICogQHNpbmNlIDIuMTgKKyAqLworQFRhcmdldCh7RWxlbWVudFR5cGUuUEFSQU1FVEVSLCBFbGVtZW50VHlwZS5GSUVMRCwgRWxlbWVudFR5cGUuTUVUSE9ELCBFbGVtZW50VHlwZS5UWVBFfSkKK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitARG9jdW1lbnRlZAorQEluaGVyaXRlZAorQFF1YWxpZmllcgorcHVibGljIEBpbnRlcmZhY2UgTWFuYWdlZEFzeW5jRXhlY3V0b3IgeworCit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9NYW5hZ2VkQXN5bmNFeGVjdXRvckxpdGVyYWwuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL01hbmFnZWRBc3luY0V4ZWN1dG9yTGl0ZXJhbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNzNiNzUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9NYW5hZ2VkQXN5bmNFeGVjdXRvckxpdGVyYWwuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5Bbm5vdGF0aW9uTGl0ZXJhbDsKKworLyoqCisgKiB7QGxpbmsgTWFuYWdlZEFzeW5jRXhlY3V0b3J9IGFubm90YXRpb24gbGl0ZXJhbC4KKyAqIDxwPgorICogVGhpcyBjbGFzcyBwcm92aWRlcyBhIHtAbGluayAjSU5TVEFOQ0UgY29uc3RhbnQgaW5zdGFuY2V9IG9mIHRoZSB7QGNvZGUgQE1hbmFnZWRBc3luY0V4ZWN1dG9yfSBhbm5vdGF0aW9uIHRvIGJlIHVzZWQKKyAqIGluIG1ldGhvZCBjYWxscyB0aGF0IHJlcXVpcmUgdXNlIG9mIGFubm90YXRpb24gaW5zdGFuY2VzLgorICogPC9wPgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKiBAc2luY2UgMi4xOAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiQ2xhc3NFeHBsaWNpdGx5QW5ub3RhdGlvbiIpCitwdWJsaWMgZmluYWwgY2xhc3MgTWFuYWdlZEFzeW5jRXhlY3V0b3JMaXRlcmFsIGV4dGVuZHMgQW5ub3RhdGlvbkxpdGVyYWw8TWFuYWdlZEFzeW5jRXhlY3V0b3I+IGltcGxlbWVudHMgTWFuYWdlZEFzeW5jRXhlY3V0b3IgeworCisgICAgLyoqCisgICAgICoge0Bjb2RlIE1hbmFnZWRBc3luY0V4ZWN1dG9yfSBhbm5vdGF0aW9uIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWFuYWdlZEFzeW5jRXhlY3V0b3IgSU5TVEFOQ0UgPSBuZXcgTWFuYWdlZEFzeW5jRXhlY3V0b3JMaXRlcmFsKCk7CisKKyAgICBwcml2YXRlIE1hbmFnZWRBc3luY0V4ZWN1dG9yTGl0ZXJhbCgpIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9Nb2RlbFByb2Nlc3NvckNvbmZpZ3VyYXRvci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvTW9kZWxQcm9jZXNzb3JDb25maWd1cmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGJhNWRhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvTW9kZWxQcm9jZXNzb3JDb25maWd1cmF0b3IuamF2YQpAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkJvb3RzdHJhcEJhZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Cb290c3RyYXBDb25maWd1cmF0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkJpbmRpbmc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkJpbmRpbmdzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1vZGVsLkNvbnRyYWN0UHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW9kZWwuaW50ZXJuYWwuQ29tcG9uZW50QmFnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5Nb2RlbFByb2Nlc3NvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5wcm9jZXNzb3IuT3B0aW9uc01ldGhvZFByb2Nlc3NvcjsKKworLyoqCisgKiBDb25maWd1cmF0b3Igd2hpY2ggaW5pdGlhbGl6ZXMgYW5kIHJlZ2lzdGVyIHtAbGluayBNb2RlbFByb2Nlc3Nvcn0gaW5zdGFuY2VzIGludG8ge0BsaW5rIEJvb3RzdHJhcEJhZ30uCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK2NsYXNzIE1vZGVsUHJvY2Vzc29yQ29uZmlndXJhdG9yIGltcGxlbWVudHMgQm9vdHN0cmFwQ29uZmlndXJhdG9yIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZ1bmN0aW9uPE9iamVjdCwgTW9kZWxQcm9jZXNzb3I+IENBU1RfVE9fTU9ERUxfUFJPQ0VTU09SID0gTW9kZWxQcm9jZXNzb3IuY2xhc3M6OmNhc3Q7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQcmVkaWNhdGU8QmluZGluZz4gQklORElOR19NT0RFTF9QUk9DRVNTT1JfT05MWSA9CisgICAgICAgICAgICBiaW5kaW5nIC0+IGJpbmRpbmcuZ2V0Q29udHJhY3RzKCkuY29udGFpbnMoTW9kZWxQcm9jZXNzb3IuY2xhc3MpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUHJlZGljYXRlPENvbnRyYWN0UHJvdmlkZXI+IENPTlRSQUNUX1BST1ZJREVSX01PREVMX1BST0NFU1NPUl9PTkxZID0KKyAgICAgICAgICAgIHByb3ZpZGVyIC0+IHByb3ZpZGVyLmdldENvbnRyYWN0cygpLmNvbnRhaW5zKE1vZGVsUHJvY2Vzc29yLmNsYXNzKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGluaXQoSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyLCBCb290c3RyYXBCYWcgYm9vdHN0cmFwQmFnKSB7CisgICAgICAgIFNlcnZlckJvb3RzdHJhcEJhZyBzZXJ2ZXJCYWcgPSAoU2VydmVyQm9vdHN0cmFwQmFnKSBib290c3RyYXBCYWc7CisgICAgICAgIFJlc291cmNlQ29uZmlnIHJ1bnRpbWVDb25maWcgPSBzZXJ2ZXJCYWcuZ2V0UnVudGltZUNvbmZpZygpOworICAgICAgICBDb21wb25lbnRCYWcgY29tcG9uZW50QmFnID0gcnVudGltZUNvbmZpZy5nZXRDb21wb25lbnRCYWcoKTsKKworICAgICAgICBPcHRpb25zTWV0aG9kUHJvY2Vzc29yIG9wdGlvbnNNZXRob2RQcm9jZXNzb3IgPSBuZXcgT3B0aW9uc01ldGhvZFByb2Nlc3NvcigpOworICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyKEJpbmRpbmdzLnNlcnZpY2Uob3B0aW9uc01ldGhvZFByb2Nlc3NvcikudG8oTW9kZWxQcm9jZXNzb3IuY2xhc3MpKTsKKworICAgICAgICAvLyBHZXQgYWxsIG1vZGVsIHByb2Nlc3NvcnMsIHJlZ2lzdGVyZWQgYXMgYW4gaW5zdGFuY2Ugb3IgY2xhc3MKKyAgICAgICAgTGlzdDxNb2RlbFByb2Nlc3Nvcj4gbW9kZWxQcm9jZXNzb3JzID0KKyAgICAgICAgICAgICAgICBTdHJlYW0uY29uY2F0KAorICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50QmFnLmdldENsYXNzZXMoQ09OVFJBQ1RfUFJPVklERVJfTU9ERUxfUFJPQ0VTU09SX09OTFkpLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoaW5qZWN0aW9uTWFuYWdlcjo6Y3JlYXRlQW5kSW5pdGlhbGl6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRCYWcuZ2V0SW5zdGFuY2VzKENPTlRSQUNUX1BST1ZJREVSX01PREVMX1BST0NFU1NPUl9PTkxZKS5zdHJlYW0oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoQ0FTVF9UT19NT0RFTF9QUk9DRVNTT1IpCisgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICAgICAgbW9kZWxQcm9jZXNzb3JzLmFkZChvcHRpb25zTWV0aG9kUHJvY2Vzc29yKTsKKworICAgICAgICAvLyBtb2RlbCBwcm9jZXNzb3JzIHJlZ2lzdGVyZWQgdXNpbmcgYmluZGVycworICAgICAgICBMaXN0PE1vZGVsUHJvY2Vzc29yPiBtb2RlbFByb2Nlc3NvcnNGcm9tQmluZGVycyA9IENvbXBvbmVudEJhZworICAgICAgICAgICAgICAgIC5nZXRGcm9tQmluZGVycyhpbmplY3Rpb25NYW5hZ2VyLCBjb21wb25lbnRCYWcsIENBU1RfVE9fTU9ERUxfUFJPQ0VTU09SLCBCSU5ESU5HX01PREVMX1BST0NFU1NPUl9PTkxZKTsKKyAgICAgICAgbW9kZWxQcm9jZXNzb3JzLmFkZEFsbChtb2RlbFByb2Nlc3NvcnNGcm9tQmluZGVycyk7CisKKyAgICAgICAgc2VydmVyQmFnLnNldE1vZGVsUHJvY2Vzc29ycyhtb2RlbFByb2Nlc3NvcnMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL1BhcmFtRXhjZXB0aW9uLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9QYXJhbUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3Y2ZmNTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9QYXJhbUV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTgyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlcjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db29raWVQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Gb3JtUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuSGVhZGVyUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuTWF0cml4UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuRXhjZXB0aW9uTWFwcGVyOworCisvKioKKyAqIEFuIGFic3RyYWN0IGV4dGVuc2lvbiBvZiB7QGxpbmsgV2ViQXBwbGljYXRpb25FeGNlcHRpb259IGZvciB0aGUgY2xhc3Mgb2YKKyAqIHBhcmFtZXRlci1iYXNlZCBleGNlcHRpb25zLgorICogPHA+CisgKiBFeGNlcHRpb25zIHRoYXQgYXJlIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHdpbGwgYmUgdGhyb3duIGlmIHRoZSBydW50aW1lCisgKiBlbmNvdW50ZXJzIGFuIGVycm9yIG9idGFpbmluZyBhIHBhcmFtZXRlciB2YWx1ZSwgZnJvbSBhIHJlcXVlc3QsIGZvciBhCisgKiBKYXZhIHR5cGUgdGhhdCBpcyBhbm5vdGF0ZWQgd2l0aCBhIHBhcmFtZXRlci1iYXNlZCBhbm5vdGF0aW9uLCBzdWNoIGFzCisgKiB7QGxpbmsgUXVlcnlQYXJhbX0uIEZvciBtb3JlIGRldGFpbHMgc2VlCisgKiA8YSBocmVmPSJodHRwOi8vanNyMzExLmphdmEubmV0L25vbmF2L3JlbGVhc2VzLzEuMC9zcGVjL2luZGV4Lmh0bWwiPnNlY3Rpb24gMy4yPC9hPgorICogb2YgdGhlIEpBWC1SUyBzcGVjaWZpY2F0aW9uLgorICogPHA+CisgKiBBbiB7QGxpbmsgRXhjZXB0aW9uTWFwcGVyfSBtYXkgYmUgY29uZmlndXJlZCB0byBtYXAgdGhpcyBjbGFzcyBvciBhIHN1Yi1jbGFzcworICogb2YgdG8gY3VzdG9taXplIHJlc3BvbnNlcyBmb3IgcGFyYW1ldGVyLWJhc2VkIGVycm9ycy4KKyAqIDxwPgorICogVW5sZXNzIG90aGVyd2lzZSBzdGF0ZWQgYWxsIHN1Y2ggZXhjZXB0aW9ucyBvZiB0aGlzIHR5cGUgd2lsbCBjb250YWluIGEKKyAqIHJlc3BvbnNlIHdpdGggYSA0MDAgKENsaWVudCBlcnJvcikgc3RhdHVzIGNvZGUuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFBhcmFtRXhjZXB0aW9uIGV4dGVuZHMgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTIzNTk1Njc1NzQ0MTI2MDc4NDZMOworCisgICAgLyoqCisgICAgICogQW4gYWJzdHJhY3QgcGFyYW1ldGVyIGV4Y2VwdGlvbiBmb3IgdGhlIGNsYXNzIG9mIFVSSS1wYXJhbWV0ZXItYmFzZWQKKyAgICAgKiBleGNlcHRpb25zLgorICAgICAqIDxwPgorICAgICAqIEFsbCBzdWNoIGV4Y2VwdGlvbnMgb2YgdGhpcyB0eXBlIHdpbGwgY29udGFpbiBhIHJlc3BvbnNlIHdpdGggYSA0MDQKKyAgICAgKiAoTm90IEZvdW5kKSBzdGF0dXMgY29kZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIFVyaVBhcmFtRXhjZXB0aW9uIGV4dGVuZHMgUGFyYW1FeGNlcHRpb24geworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQ0MjMzNTI4NDU5ODg1NTQxTDsKKworICAgICAgICBwcm90ZWN0ZWQgVXJpUGFyYW1FeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IHBhcmFtZXRlclR5cGUsIFN0cmluZyBuYW1lLCBTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlKSB7CisgICAgICAgICAgICBzdXBlcihjYXVzZSwgUmVzcG9uc2UuU3RhdHVzLk5PVF9GT1VORCwgcGFyYW1ldGVyVHlwZSwgbmFtZSwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgVVJJLXBhcmFtZXRlci1iYXNlZCBleGNlcHRpb24gZm9yIGVycm9ycyB3aXRoIHtAbGluayBQYXRoUGFyYW19LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGF0aFBhcmFtRXhjZXB0aW9uIGV4dGVuZHMgVXJpUGFyYW1FeGNlcHRpb24geworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0yNzA4NTM4MjE0NjkyODM1NjMzTDsKKworICAgICAgICBwdWJsaWMgUGF0aFBhcmFtRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUpIHsKKyAgICAgICAgICAgIHN1cGVyKGNhdXNlLCBQYXRoUGFyYW0uY2xhc3MsIG5hbWUsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIFVSSS1wYXJhbWV0ZXItYmFzZWQgZXhjZXB0aW9uIGZvciBlcnJvcnMgd2l0aCB7QGxpbmsgTWF0cml4UGFyYW19LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWF0cml4UGFyYW1FeGNlcHRpb24gZXh0ZW5kcyBVcmlQYXJhbUV4Y2VwdGlvbiB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTU4NDkzOTI4ODM2MjM3MzYzNjJMOworCisgICAgICAgIHB1YmxpYyBNYXRyaXhQYXJhbUV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UsIFN0cmluZyBuYW1lLCBTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlKSB7CisgICAgICAgICAgICBzdXBlcihjYXVzZSwgTWF0cml4UGFyYW0uY2xhc3MsIG5hbWUsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIFVSSS1wYXJhbWV0ZXItYmFzZWQgZXhjZXB0aW9uIGZvciBlcnJvcnMgd2l0aCB7QGxpbmsgUXVlcnlQYXJhbX0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBRdWVyeVBhcmFtRXhjZXB0aW9uIGV4dGVuZHMgVXJpUGFyYW1FeGNlcHRpb24geworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC00ODIyNDA3NDY3NzkyMzIyOTEwTDsKKworICAgICAgICBwdWJsaWMgUXVlcnlQYXJhbUV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UsIFN0cmluZyBuYW1lLCBTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlKSB7CisgICAgICAgICAgICBzdXBlcihjYXVzZSwgUXVlcnlQYXJhbS5jbGFzcywgbmFtZSwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgcGFyYW1ldGVyIGV4Y2VwdGlvbiBmb3IgZXJyb3JzIHdpdGgge0BsaW5rIEhlYWRlclBhcmFtfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEhlYWRlclBhcmFtRXhjZXB0aW9uIGV4dGVuZHMgUGFyYW1FeGNlcHRpb24geworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDY1MDgxNzQ2MDM1MDYzMTMyNzRMOworCisgICAgICAgIHB1YmxpYyBIZWFkZXJQYXJhbUV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UsIFN0cmluZyBuYW1lLCBTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlKSB7CisgICAgICAgICAgICBzdXBlcihjYXVzZSwgUmVzcG9uc2UuU3RhdHVzLkJBRF9SRVFVRVNULCBIZWFkZXJQYXJhbS5jbGFzcywgbmFtZSwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEEgcGFyYW1ldGVyIGV4Y2VwdGlvbiBmb3IgZXJyb3JzIHdpdGgge0BsaW5rIENvb2tpZVBhcmFtfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvb2tpZVBhcmFtRXhjZXB0aW9uIGV4dGVuZHMgUGFyYW1FeGNlcHRpb24geworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC01Mjg4NTA0MjAxMjM0NTY3MjY2TDsKKworICAgICAgICBwdWJsaWMgQ29va2llUGFyYW1FeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlLCBTdHJpbmcgbmFtZSwgU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSkgeworICAgICAgICAgICAgc3VwZXIoY2F1c2UsIFJlc3BvbnNlLlN0YXR1cy5CQURfUkVRVUVTVCwgQ29va2llUGFyYW0uY2xhc3MsIG5hbWUsIGRlZmF1bHRTdHJpbmdWYWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHBhcmFtZXRlciBleGNlcHRpb24gZm9yIGVycm9ycyB3aXRoIHtAbGluayBGb3JtUGFyYW19LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRm9ybVBhcmFtRXhjZXB0aW9uIGV4dGVuZHMgUGFyYW1FeGNlcHRpb24geworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xNzA0Mzc5NzkyMTk5OTgwNjg5TDsKKworICAgICAgICBwdWJsaWMgRm9ybVBhcmFtRXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUpIHsKKyAgICAgICAgICAgIHN1cGVyKGNhdXNlLCBSZXNwb25zZS5TdGF0dXMuQkFEX1JFUVVFU1QsIEZvcm1QYXJhbS5jbGFzcywgbmFtZSwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IHBhcmFtZXRlclR5cGU7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWU7CisKKyAgICBwcm90ZWN0ZWQgUGFyYW1FeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlLCBSZXNwb25zZS5TdGF0dXNUeXBlIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IHBhcmFtZXRlclR5cGUsIFN0cmluZyBuYW1lLCBTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlKSB7CisgICAgICAgIHN1cGVyKGNhdXNlLCBzdGF0dXMuZ2V0U3RhdHVzQ29kZSgpKTsKKyAgICAgICAgdGhpcy5wYXJhbWV0ZXJUeXBlID0gcGFyYW1ldGVyVHlwZTsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5kZWZhdWx0U3RyaW5nVmFsdWUgPSBkZWZhdWx0U3RyaW5nVmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIgYW5ub3RhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHR5cGUgb2YgdGhlIHBhcmFtZXRlciBhbm5vdGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gZ2V0UGFyYW1ldGVyVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHBhcmFtZXRlclR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBwYXJhbWV0ZXIgbmFtZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHBhcmFtZXRlciBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW1ldGVyTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBkZWZhdWx0IFN0cmluZyB2YWx1ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgU3RyaW5nIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFN0cmluZ1ZhbHVlKCkgeworICAgICAgICByZXR1cm4gZGVmYXVsdFN0cmluZ1ZhbHVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL1Byb2Nlc3NpbmdQcm92aWRlcnNDb25maWd1cmF0b3IuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL1Byb2Nlc3NpbmdQcm92aWRlcnNDb25maWd1cmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmM4MTI0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvUHJvY2Vzc2luZ1Byb3ZpZGVyc0NvbmZpZ3VyYXRvci5qYXZhCkBAIC0wLDAgKzEsMjAxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlcjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLk5hbWVCaW5kaW5nOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuRHluYW1pY0ZlYXR1cmU7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlByZU1hdGNoaW5nOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRIYXNoTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJlYWRlckludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkJvb3RzdHJhcEJhZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Cb290c3RyYXBDb25maWd1cmF0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LlByb3ZpZGVyczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlJlZmxlY3Rpb25IZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW9kZWwuQ29udHJhY3RQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb2RlbC5pbnRlcm5hbC5Db21wb25lbnRCYWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW9kZWwuaW50ZXJuYWwuUmFua2VkUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5Qcm9jZXNzaW5nUHJvdmlkZXJzOworCisvKioKKyAqIENvbmZpZ3VyYXRvciB3aGljaCBpbml0aWFsaXplcyBhbmQgcmVnaXN0ZXIge0BsaW5rIFByb2Nlc3NpbmdQcm92aWRlcnN9IGluc3RhbmNlIGludG8ge0BsaW5rIEJvb3RzdHJhcEJhZ30uCisgKiBJbnN0YW5jZXMgb2YgdGhlc2UgaW50ZXJmYWNlcyBhcmUgcHJvY2Vzc2VkLCBjb25maWd1cmVkIGFuZCBwcm92aWRlZCB1c2luZyB0aGlzIGNvbmZpZ3VyYXRvcjoKKyAqIDx1bD4KKyAqIDxsaT57QGxpbmsgQ29udGFpbmVyUmVxdWVzdEZpbHRlcn08L2xpPgorICogPGxpPntAbGluayBDb250YWluZXJSZXNwb25zZUZpbHRlcn08L2xpPgorICogPGxpPntAbGluayBSZWFkZXJJbnRlcmNlcHRvcn08L2xpPgorICogPGxpPntAbGluayBXcml0ZXJJbnRlcmNlcHRvcn08L2xpPgorICogPGxpPntAbGluayBEeW5hbWljRmVhdHVyZX08L2xpPgorICogPC91bD4KKyAqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworY2xhc3MgUHJvY2Vzc2luZ1Byb3ZpZGVyc0NvbmZpZ3VyYXRvciBpbXBsZW1lbnRzIEJvb3RzdHJhcENvbmZpZ3VyYXRvciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihQcm9jZXNzaW5nUHJvdmlkZXJzQ29uZmlndXJhdG9yLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBpbml0KEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciwgQm9vdHN0cmFwQmFnIGJvb3RzdHJhcEJhZykgeworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHBvc3RJbml0KEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciwgQm9vdHN0cmFwQmFnIGJvb3RzdHJhcEJhZykgeworICAgICAgICBTZXJ2ZXJCb290c3RyYXBCYWcgc2VydmVyQmFnID0gKFNlcnZlckJvb3RzdHJhcEJhZykgYm9vdHN0cmFwQmFnOworCisgICAgICAgIENvbXBvbmVudEJhZyBjb21wb25lbnRCYWcgPSBzZXJ2ZXJCYWcuZ2V0UnVudGltZUNvbmZpZygpLmdldENvbXBvbmVudEJhZygpOworICAgICAgICAvLyBzY2FuIGZvciBOYW1lQmluZGluZyBhbm5vdGF0aW9ucyBhdHRhY2hlZCB0byB0aGUgYXBwbGljYXRpb24gY2xhc3MKKyAgICAgICAgQ29sbGVjdGlvbjxDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4+IGFwcGxpY2F0aW9uTmFtZUJpbmRpbmdzID0gUmVmbGVjdGlvbkhlbHBlci5nZXRBbm5vdGF0aW9uVHlwZXMoCisgICAgICAgICAgICAgICAgUmVzb3VyY2VDb25maWcudW53cmFwQXBwbGljYXRpb24oc2VydmVyQmFnLmdldFJ1bnRpbWVDb25maWcoKSkuZ2V0Q2xhc3MoKSwgTmFtZUJpbmRpbmcuY2xhc3MpOworCisgICAgICAgIE11bHRpdmFsdWVkTWFwPFJhbmtlZFByb3ZpZGVyPENvbnRhaW5lclJlc3BvbnNlRmlsdGVyPiwgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+PiBuYW1lQm91bmRSZXNwRmlsdGVyc0ludmVyc2UgPQorICAgICAgICAgICAgICAgIG5ldyBNdWx0aXZhbHVlZEhhc2hNYXA8PigpOworICAgICAgICBNdWx0aXZhbHVlZE1hcDxSYW5rZWRQcm92aWRlcjxDb250YWluZXJSZXF1ZXN0RmlsdGVyPiwgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+PiBuYW1lQm91bmRSZXFGaWx0ZXJzSW52ZXJzZSA9CisgICAgICAgICAgICAgICAgbmV3IE11bHRpdmFsdWVkSGFzaE1hcDw+KCk7CisgICAgICAgIE11bHRpdmFsdWVkTWFwPFJhbmtlZFByb3ZpZGVyPFJlYWRlckludGVyY2VwdG9yPiwgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+PiBuYW1lQm91bmRSZWFkZXJJbnRlcmNlcHRvcnNJbnZlcnNlID0KKyAgICAgICAgICAgICAgICBuZXcgTXVsdGl2YWx1ZWRIYXNoTWFwPD4oKTsKKyAgICAgICAgTXVsdGl2YWx1ZWRNYXA8UmFua2VkUHJvdmlkZXI8V3JpdGVySW50ZXJjZXB0b3I+LCBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4+IG5hbWVCb3VuZFdyaXRlckludGVyY2VwdG9yc0ludmVyc2UgPQorICAgICAgICAgICAgICAgIG5ldyBNdWx0aXZhbHVlZEhhc2hNYXA8PigpOworCisgICAgICAgIEl0ZXJhYmxlPFJhbmtlZFByb3ZpZGVyPENvbnRhaW5lclJlc3BvbnNlRmlsdGVyPj4gcmVzcG9uc2VGaWx0ZXJzID0KKyAgICAgICAgICAgICAgICBQcm92aWRlcnMuZ2V0QWxsUmFua2VkUHJvdmlkZXJzKGluamVjdGlvbk1hbmFnZXIsIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyLmNsYXNzKTsKKworICAgICAgICBNdWx0aXZhbHVlZE1hcDxDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4sIFJhbmtlZFByb3ZpZGVyPENvbnRhaW5lclJlc3BvbnNlRmlsdGVyPj4gbmFtZUJvdW5kUmVzcG9uc2VGaWx0ZXJzID0KKyAgICAgICAgICAgICAgICBmaWx0ZXJOYW1lQm91bmQocmVzcG9uc2VGaWx0ZXJzLCBudWxsLCBjb21wb25lbnRCYWcsIGFwcGxpY2F0aW9uTmFtZUJpbmRpbmdzLCBuYW1lQm91bmRSZXNwRmlsdGVyc0ludmVyc2UpOworCisgICAgICAgIEl0ZXJhYmxlPFJhbmtlZFByb3ZpZGVyPENvbnRhaW5lclJlcXVlc3RGaWx0ZXI+PiByZXF1ZXN0RmlsdGVycyA9CisgICAgICAgICAgICAgICAgUHJvdmlkZXJzLmdldEFsbFJhbmtlZFByb3ZpZGVycyhpbmplY3Rpb25NYW5hZ2VyLCBDb250YWluZXJSZXF1ZXN0RmlsdGVyLmNsYXNzKTsKKworICAgICAgICBMaXN0PFJhbmtlZFByb3ZpZGVyPENvbnRhaW5lclJlcXVlc3RGaWx0ZXI+PiBwcmVNYXRjaEZpbHRlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgICAgICBNdWx0aXZhbHVlZE1hcDxDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4sIFJhbmtlZFByb3ZpZGVyPENvbnRhaW5lclJlcXVlc3RGaWx0ZXI+PiBuYW1lQm91bmRSZXFGaWx0ZXJzID0KKyAgICAgICAgICAgICAgICBmaWx0ZXJOYW1lQm91bmQocmVxdWVzdEZpbHRlcnMsIHByZU1hdGNoRmlsdGVycywgY29tcG9uZW50QmFnLCBhcHBsaWNhdGlvbk5hbWVCaW5kaW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVCb3VuZFJlcUZpbHRlcnNJbnZlcnNlKTsKKworICAgICAgICBJdGVyYWJsZTxSYW5rZWRQcm92aWRlcjxSZWFkZXJJbnRlcmNlcHRvcj4+IHJlYWRlckludGVyY2VwdG9ycyA9CisgICAgICAgICAgICAgICAgUHJvdmlkZXJzLmdldEFsbFJhbmtlZFByb3ZpZGVycyhpbmplY3Rpb25NYW5hZ2VyLCBSZWFkZXJJbnRlcmNlcHRvci5jbGFzcyk7CisKKyAgICAgICAgTXVsdGl2YWx1ZWRNYXA8Q2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+LCBSYW5rZWRQcm92aWRlcjxSZWFkZXJJbnRlcmNlcHRvcj4+IG5hbWVCb3VuZFJlYWRlckludGVyY2VwdG9ycyA9CisgICAgICAgICAgICAgICAgZmlsdGVyTmFtZUJvdW5kKHJlYWRlckludGVyY2VwdG9ycywgbnVsbCwgY29tcG9uZW50QmFnLCBhcHBsaWNhdGlvbk5hbWVCaW5kaW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVCb3VuZFJlYWRlckludGVyY2VwdG9yc0ludmVyc2UpOworCisgICAgICAgIEl0ZXJhYmxlPFJhbmtlZFByb3ZpZGVyPFdyaXRlckludGVyY2VwdG9yPj4gd3JpdGVySW50ZXJjZXB0b3JzID0KKyAgICAgICAgICAgICAgICBQcm92aWRlcnMuZ2V0QWxsUmFua2VkUHJvdmlkZXJzKGluamVjdGlvbk1hbmFnZXIsIFdyaXRlckludGVyY2VwdG9yLmNsYXNzKTsKKworICAgICAgICBNdWx0aXZhbHVlZE1hcDxDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4sIFJhbmtlZFByb3ZpZGVyPFdyaXRlckludGVyY2VwdG9yPj4gbmFtZUJvdW5kV3JpdGVySW50ZXJjZXB0b3JzID0KKyAgICAgICAgICAgICAgICBmaWx0ZXJOYW1lQm91bmQod3JpdGVySW50ZXJjZXB0b3JzLCBudWxsLCBjb21wb25lbnRCYWcsIGFwcGxpY2F0aW9uTmFtZUJpbmRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgbmFtZUJvdW5kV3JpdGVySW50ZXJjZXB0b3JzSW52ZXJzZSk7CisKKyAgICAgICAgSXRlcmFibGU8RHluYW1pY0ZlYXR1cmU+IGR5bmFtaWNGZWF0dXJlcyA9IFByb3ZpZGVycy5nZXRBbGxQcm92aWRlcnMoaW5qZWN0aW9uTWFuYWdlciwgRHluYW1pY0ZlYXR1cmUuY2xhc3MpOworCisgICAgICAgIFByb2Nlc3NpbmdQcm92aWRlcnMgcHJvY2Vzc2luZ1Byb3ZpZGVycyA9IG5ldyBQcm9jZXNzaW5nUHJvdmlkZXJzKG5hbWVCb3VuZFJlcUZpbHRlcnMsIG5hbWVCb3VuZFJlcUZpbHRlcnNJbnZlcnNlLAorICAgICAgICAgICAgICAgIG5hbWVCb3VuZFJlc3BvbnNlRmlsdGVycywgbmFtZUJvdW5kUmVzcEZpbHRlcnNJbnZlcnNlLCBuYW1lQm91bmRSZWFkZXJJbnRlcmNlcHRvcnMsCisgICAgICAgICAgICAgICAgbmFtZUJvdW5kUmVhZGVySW50ZXJjZXB0b3JzSW52ZXJzZSwgbmFtZUJvdW5kV3JpdGVySW50ZXJjZXB0b3JzLCBuYW1lQm91bmRXcml0ZXJJbnRlcmNlcHRvcnNJbnZlcnNlLAorICAgICAgICAgICAgICAgIHJlcXVlc3RGaWx0ZXJzLCBwcmVNYXRjaEZpbHRlcnMsIHJlc3BvbnNlRmlsdGVycywgcmVhZGVySW50ZXJjZXB0b3JzLCB3cml0ZXJJbnRlcmNlcHRvcnMsIGR5bmFtaWNGZWF0dXJlcyk7CisKKyAgICAgICAgc2VydmVyQmFnLnNldFByb2Nlc3NpbmdQcm92aWRlcnMocHJvY2Vzc2luZ1Byb3ZpZGVycyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGFrZXMgY29sbGVjdGlvbiBvZiBhbGwgZmlsdGVycy9pbnRlcmNlcHRvcnMgKGVpdGhlciByZXF1ZXN0L3JlYWRlciBvciByZXNwb25zZS93cml0ZXIpCisgICAgICogYW5kIHNlcGFyYXRlcyBvdXQgYWxsIG5hbWUtYm91bmQgZmlsdGVycy9pbnRlcmNlcHRvcnMsIHJldHVybnMgdGhlbSBhcyBhIHNlcGFyYXRlIE11bHRpdmFsdWVkTWFwLAorICAgICAqIG1hcHBpbmcgdGhlIG5hbWUtYm91bmQgYW5ub3RhdGlvbiB0byB0aGUgbGlzdCBvZiBuYW1lLWJvdW5kIGZpbHRlcnMvaW50ZXJjZXB0b3JzLiBUaGUgc2FtZSBrZXkgdmFsdWVzCisgICAgICogYXJlIGFsc28gYWRkZWQgaW50byB0aGUgaW52ZXJzZSBtYXAgcGFzc2VkIGluIHtAY29kZSBpbnZlcnNlTmFtZUJvdW5kTWFwfS4KKyAgICAgKiA8cC8+CisgICAgICogTm90ZSwgdGhlIG5hbWUtYm91bmQgZmlsdGVycy9pbnRlcmNlcHRvcnMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgb3JpZ2luYWwgZmlsdGVycy9pbnRlcmNlcHRvcnMgY29sbGVjdGlvbi4KKyAgICAgKiBJZiBub24tbnVsbCBjb2xsZWN0aW9uIGlzIHBhc3NlZCBpbiB0aGUgcG9zdE1hdGNoaW5nIHBhcmFtZXRlciAoYXBwbGljYWJsZSBmb3IgZmlsdGVycyBvbmx5KSwKKyAgICAgKiB0aGlzIG1ldGhvZCBhbHNvIHJlbW92ZXMgYWxsIHRoZSBnbG9iYWwKKyAgICAgKiBwb3N0TWF0Y2hpbmcgZmlsdGVycyBmcm9tIHRoZSBvcmlnaW5hbCBjb2xsZWN0aW9uIGFuZCBhZGRzIHRoZW0gdG8gdGhlIGNvbGxlY3Rpb24gcGFzc2VkIGluIHRoZSBwb3N0TWF0Y2hpbmcKKyAgICAgKiBwYXJhbWV0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWxsICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiBvZiBhbGwgZmlsdGVycyB0byBiZSBwcm9jZXNzZWQuCisgICAgICogQHBhcmFtIHByZU1hdGNoaW5nRmlsdGVycyAgICAgIENvbGxlY3Rpb24gaW50byB3aGljaCBwcmUtbWF0Y2hpbmcgZmlsdGVycyBzaG91bGQgYmUgYWRkZWQuCisgICAgICogQHBhcmFtIGNvbXBvbmVudEJhZyAgICAgICAgICAgIENvbXBvbmVudCBiYWcKKyAgICAgKiBAcGFyYW0gYXBwbGljYXRpb25OYW1lQmluZGluZ3MgQ29sbGVjdGlvbiBvZiBuYW1lIGJpbmRpbmcgYW5ub3RhdGlvbnMgYXR0YWNoZWQgdG8gdGhlIEpBWC1SUyBhcHBsaWNhdGlvbi4KKyAgICAgKiBAcGFyYW0gaW52ZXJzZU5hbWVCb3VuZE1hcCAgICAgSW52ZXJzZSBuYW1lIGJvdW5kIG1hcCBpbnRvIHdoaWNoIHRoZSBuYW1lIGJvdW5kIHByb3ZpZGVycyBzaG91bGQgYmUgaW5zZXJ0ZWQuIFRoZSBrZXlzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZSBwcm92aWRlcnMgKGZpbHRlcnMsIGludGVyY2VwdG9yKQorICAgICAqIEByZXR1cm4ge0BsaW5rIE11bHRpdmFsdWVkTWFwfSBvZiBhbGwgbmFtZS1ib3VuZCBmaWx0ZXJzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIDxUPiBNdWx0aXZhbHVlZE1hcDxDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4sIFJhbmtlZFByb3ZpZGVyPFQ+PiBmaWx0ZXJOYW1lQm91bmQoCisgICAgICAgICAgICBmaW5hbCBJdGVyYWJsZTxSYW5rZWRQcm92aWRlcjxUPj4gYWxsLAorICAgICAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxSYW5rZWRQcm92aWRlcjxDb250YWluZXJSZXF1ZXN0RmlsdGVyPj4gcHJlTWF0Y2hpbmdGaWx0ZXJzLAorICAgICAgICAgICAgZmluYWwgQ29tcG9uZW50QmFnIGNvbXBvbmVudEJhZywKKyAgICAgICAgICAgIGZpbmFsIENvbGxlY3Rpb248Q2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+PiBhcHBsaWNhdGlvbk5hbWVCaW5kaW5ncywKKyAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFJhbmtlZFByb3ZpZGVyPFQ+LCBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4+IGludmVyc2VOYW1lQm91bmRNYXApIHsKKworICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4sIFJhbmtlZFByb3ZpZGVyPFQ+PiByZXN1bHQKKyAgICAgICAgICAgICAgICA9IG5ldyBNdWx0aXZhbHVlZEhhc2hNYXA8PigpOworCisgICAgICAgIGZvciAoZmluYWwgSXRlcmF0b3I8UmFua2VkUHJvdmlkZXI8VD4+IGl0ID0gYWxsLml0ZXJhdG9yKCk7IGl0Lmhhc05leHQoKTsgKSB7CisgICAgICAgICAgICBmaW5hbCBSYW5rZWRQcm92aWRlcjxUPiBwcm92aWRlciA9IGl0Lm5leHQoKTsKKyAgICAgICAgICAgIENsYXNzPD8+IHByb3ZpZGVyQ2xhc3MgPSBwcm92aWRlci5nZXRQcm92aWRlcigpLmdldENsYXNzKCk7CisgICAgICAgICAgICBmaW5hbCBTZXQ8VHlwZT4gY29udHJhY3RUeXBlcyA9IHByb3ZpZGVyLmdldENvbnRyYWN0VHlwZXMoKTsKKyAgICAgICAgICAgIGlmIChjb250cmFjdFR5cGVzICE9IG51bGwgJiYgIWNvbnRyYWN0VHlwZXMuY29udGFpbnMocHJvdmlkZXJDbGFzcykpIHsKKyAgICAgICAgICAgICAgICBwcm92aWRlckNsYXNzID0gUmVmbGVjdGlvbkhlbHBlci50aGVNb3N0U3BlY2lmaWNUeXBlT2YoY29udHJhY3RUeXBlcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENvbnRyYWN0UHJvdmlkZXIgbW9kZWwgPSBjb21wb25lbnRCYWcuZ2V0TW9kZWwocHJvdmlkZXJDbGFzcyk7CisgICAgICAgICAgICBpZiAobW9kZWwgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIHRoZSBwcm92aWRlciB3YXMgKG1vc3QgbGlrZWx5KSBib3VuZCBpbiBISzIgZXh0ZXJuYWxseQorICAgICAgICAgICAgICAgIG1vZGVsID0gQ29tcG9uZW50QmFnLm1vZGVsRm9yKHByb3ZpZGVyQ2xhc3MpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBib29sZWFuIHByZU1hdGNoaW5nID0gcHJvdmlkZXJDbGFzcy5nZXRBbm5vdGF0aW9uKFByZU1hdGNoaW5nLmNsYXNzKSAhPSBudWxsOworICAgICAgICAgICAgaWYgKHByZU1hdGNoaW5nICYmIHByZU1hdGNoaW5nRmlsdGVycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgcHJlTWF0Y2hpbmdGaWx0ZXJzLmFkZChuZXcgUmFua2VkUHJvdmlkZXI8PigoQ29udGFpbmVyUmVxdWVzdEZpbHRlcikgcHJvdmlkZXIuZ2V0UHJvdmlkZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmdldFByaW9yaXR5KENvbnRhaW5lclJlcXVlc3RGaWx0ZXIuY2xhc3MpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2xlYW4gbmFtZUJvdW5kID0gbW9kZWwuaXNOYW1lQm91bmQoKTsKKyAgICAgICAgICAgIGlmIChuYW1lQm91bmQKKyAgICAgICAgICAgICAgICAgICAgJiYgIWFwcGxpY2F0aW9uTmFtZUJpbmRpbmdzLmlzRW1wdHkoKQorICAgICAgICAgICAgICAgICAgICAmJiBhcHBsaWNhdGlvbk5hbWVCaW5kaW5ncy5jb250YWluc0FsbChtb2RlbC5nZXROYW1lQmluZGluZ3MoKSkpIHsKKyAgICAgICAgICAgICAgICAvLyBvdmVycmlkZSB0aGUgbmFtZS1ib3VuZCBmbGFnCisgICAgICAgICAgICAgICAgbmFtZUJvdW5kID0gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChuYW1lQm91bmQpIHsgLy8gbm90IGFwcGxpY2F0aW9uLWJvdW5kCisgICAgICAgICAgICAgICAgaWYgKCFwcmVNYXRjaGluZykgeworICAgICAgICAgICAgICAgICAgICBpdC5yZW1vdmUoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChmaW5hbCBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gYmluZGluZyA6IG1vZGVsLmdldE5hbWVCaW5kaW5ncygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGJpbmRpbmcsIHByb3ZpZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludmVyc2VOYW1lQm91bmRNYXAuYWRkKHByb3ZpZGVyLCBiaW5kaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIExPR0dFUi53YXJuaW5nKExvY2FsaXphdGlvbk1lc3NhZ2VzLlBSRU1BVENISU5HX0FMU09fTkFNRV9CT1VORChwcm92aWRlckNsYXNzKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9SZXNvdXJjZUJhZy5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvUmVzb3VyY2VCYWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTM1YjAyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvUmVzb3VyY2VCYWcuamF2YQpAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZTsKKworLyoqCisgKiBBIGNvbnRhaW5lciBmb3IgYXBwbGljYXRpb24gcmVzb3VyY2UgbW9kZWxzIHVzZWQgZHVyaW5nIHRoZSB7QGxpbmsgQXBwbGljYXRpb25IYW5kbGVyfQorICogaW5pdGlhbGl6YXRpb24uCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworZmluYWwgY2xhc3MgUmVzb3VyY2VCYWcgeworICAgIC8qKgorICAgICAqIFJlc291cmNlIGJhZyBidWlsZGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXNvdXJjZSBoYW5kbGVyIGNsYXNzZXMgZm9yIHRoZSBtb2RlbHMgaW4gdGhpcyByZXNvdXJjZSBiYWcuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGZpbmFsIFNldDxDbGFzczw/Pj4gY2xhc3NlcyA9IENvbGxlY3Rpb25zLm5ld1NldEZyb21NYXAobmV3IElkZW50aXR5SGFzaE1hcDw+KCkpOworICAgICAgICAvKioKKyAgICAgICAgICogUmVzb3VyY2UgaGFuZGxlciBpbnN0YW5jZSBmb3IgdGhlIG1vZGVscyBpbiB0aGlzIHJlc291cmNlIGJhZy4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgZmluYWwgU2V0PE9iamVjdD4gaW5zdGFuY2VzID0gQ29sbGVjdGlvbnMubmV3U2V0RnJvbU1hcChuZXcgSWRlbnRpdHlIYXNoTWFwPD4oKSk7CisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXNvdXJjZSBtb2RlbHMuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8UmVzb3VyY2U+IG1vZGVscyA9IG5ldyBMaW5rZWRMaXN0PFJlc291cmNlPigpOworICAgICAgICAvKioKKyAgICAgICAgICogTWFwIG9mIHJvb3QgcGF0aCB0byByZXNvdXJjZSBtb2RlbC4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgUmVzb3VyY2U+IHJvb3RSZXNvdXJjZU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgUmVzb3VyY2U+KCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlZ2lzdGVyIGEgbmV3IHJlc291cmNlIG1vZGVsIGNyZWF0ZWQgZnJvbSBhIHNwZWNpZmljIHJlc291cmNlIGNsYXNzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcmVzb3VyY2VDbGFzcyBpbnRyb3NwZWN0ZWQgcmVzb3VyY2UgY2xhc3MuCisgICAgICAgICAqIEBwYXJhbSByZXNvdXJjZU1vZGVsIHJlc291cmNlIG1vZGVsIGZvciB0aGUgY2xhc3MuCisgICAgICAgICAqLworICAgICAgICB2b2lkIHJlZ2lzdGVyUmVzb3VyY2UoQ2xhc3M8Pz4gcmVzb3VyY2VDbGFzcywgUmVzb3VyY2UgcmVzb3VyY2VNb2RlbCkgeworICAgICAgICAgICAgcmVnaXN0ZXJNb2RlbChyZXNvdXJjZU1vZGVsKTsKKyAgICAgICAgICAgIGNsYXNzZXMuYWRkKHJlc291cmNlQ2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlZ2lzdGVyIGEgbmV3IHJlc291cmNlIG1vZGVsIGNyZWF0ZWQgZnJvbSBhIHNwZWNpZmljIHJlc291cmNlIGluc3RhbmNlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcmVzb3VyY2VJbnN0YW5jZSBpbnRyb3NwZWN0ZWQgcmVzb3VyY2UgaW5zdGFuY2UuCisgICAgICAgICAqIEBwYXJhbSByZXNvdXJjZU1vZGVsICAgIHJlc291cmNlIG1vZGVsIGZvciB0aGUgaW5zdGFuY2UuCisgICAgICAgICAqLworICAgICAgICB2b2lkIHJlZ2lzdGVyUmVzb3VyY2UoT2JqZWN0IHJlc291cmNlSW5zdGFuY2UsIFJlc291cmNlIHJlc291cmNlTW9kZWwpIHsKKyAgICAgICAgICAgIHJlZ2lzdGVyTW9kZWwocmVzb3VyY2VNb2RlbCk7CisgICAgICAgICAgICBpbnN0YW5jZXMuYWRkKHJlc291cmNlSW5zdGFuY2UpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlZ2lzdGVyIGEgbmV3IHByb2dyYW1tYXRpY2FsbHkgY3JlYXRlZCByZXNvdXJjZSBtb2RlbC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHJlc291cmNlTW9kZWwgcHJvZ3JhbW1hdGljYWxseSBjcmVhdGVkIHJlc291cmNlIG1vZGVsLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCByZWdpc3RlclByb2dyYW1tYXRpY1Jlc291cmNlKFJlc291cmNlIHJlc291cmNlTW9kZWwpIHsKKyAgICAgICAgICAgIHJlZ2lzdGVyTW9kZWwocmVzb3VyY2VNb2RlbCk7CisgICAgICAgICAgICBjbGFzc2VzLmFkZEFsbChyZXNvdXJjZU1vZGVsLmdldEhhbmRsZXJDbGFzc2VzKCkpOworICAgICAgICAgICAgaW5zdGFuY2VzLmFkZEFsbChyZXNvdXJjZU1vZGVsLmdldEhhbmRsZXJJbnN0YW5jZXMoKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgcmVnaXN0ZXJNb2RlbChSZXNvdXJjZSByZXNvdXJjZU1vZGVsKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGF0aCA9IHJlc291cmNlTW9kZWwuZ2V0UGF0aCgpOworICAgICAgICAgICAgaWYgKHBhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFJlc291cmNlIGV4aXN0aW5nID0gcm9vdFJlc291cmNlTWFwLmdldChwYXRoKTsKKyAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBtZXJnZSByZXNvdXJjZXMKKyAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmcgPSBSZXNvdXJjZS5idWlsZGVyKGV4aXN0aW5nKS5tZXJnZVdpdGgocmVzb3VyY2VNb2RlbCkuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICAgICAgcm9vdFJlc291cmNlTWFwLnB1dChwYXRoLCBleGlzdGluZyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcm9vdFJlc291cmNlTWFwLnB1dChwYXRoLCByZXNvdXJjZU1vZGVsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1vZGVscy5hZGQocmVzb3VyY2VNb2RlbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQnVpbGQgYSByZXNvdXJjZSBiYWcuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gbmV3IHJlc291cmNlIGJhZyBpbml0aWFsaXplZCB3aXRoIHRoZSBjb250ZW50IG9mIHRoZSByZXNvdXJjZSBiYWcgYnVpbGRlci4KKyAgICAgICAgICovCisgICAgICAgIFJlc291cmNlQmFnIGJ1aWxkKCkgeworICAgICAgICAgICAgbW9kZWxzLmFkZEFsbChyb290UmVzb3VyY2VNYXAudmFsdWVzKCkpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUJhZyhjbGFzc2VzLCBpbnN0YW5jZXMsIG1vZGVscyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNvdXJjZSBoYW5kbGVyIGNsYXNzZXMgZm9yIHRoZSBtb2RlbHMgaW4gdGhpcyByZXNvdXJjZSBiYWcuCisgICAgICovCisgICAgZmluYWwgU2V0PENsYXNzPD8+PiBjbGFzc2VzOworICAgIC8qKgorICAgICAqIFJlc291cmNlIGhhbmRsZXIgaW5zdGFuY2UgZm9yIHRoZSBtb2RlbHMgaW4gdGhpcyByZXNvdXJjZSBiYWcuCisgICAgICovCisgICAgZmluYWwgU2V0PE9iamVjdD4gaW5zdGFuY2VzOworICAgIC8qKgorICAgICAqIFJlc291cmNlIG1vZGVscy4KKyAgICAgKi8KKyAgICBmaW5hbCBMaXN0PFJlc291cmNlPiBtb2RlbHM7CisKKyAgICBwcml2YXRlIFJlc291cmNlQmFnKFNldDxDbGFzczw/Pj4gY2xhc3NlcywgU2V0PE9iamVjdD4gaW5zdGFuY2VzLCBMaXN0PFJlc291cmNlPiBtb2RlbHMpIHsKKyAgICAgICAgdGhpcy5jbGFzc2VzID0gY2xhc3NlczsKKyAgICAgICAgdGhpcy5pbnN0YW5jZXMgPSBpbnN0YW5jZXM7CisgICAgICAgIHRoaXMubW9kZWxzID0gbW9kZWxzOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJucyBsaXN0IG9mIHJvb3QgcmVzb3VyY2VzLgorICAgICAqCisgICAgICogQHJldHVybiBsaXN0IG9mIHJvb3QgcmVzb3VyY2VzLgorICAgICAqLworICAgIExpc3Q8UmVzb3VyY2U+IGdldFJvb3RSZXNvdXJjZXMoKSB7CisgICAgICAgIExpc3Q8UmVzb3VyY2U+IHJvb3RSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PFJlc291cmNlPigpOworICAgICAgICBmb3IgKFJlc291cmNlIHJlc291cmNlIDogbW9kZWxzKSB7CisgICAgICAgICAgICBpZiAocmVzb3VyY2UuZ2V0UGF0aCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByb290UmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJvb3RSZXNvdXJjZXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvUmVzb3VyY2VCYWdDb25maWd1cmF0b3IuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL1Jlc291cmNlQmFnQ29uZmlndXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZjMzliYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL1Jlc291cmNlQmFnQ29uZmlndXJhdG9yLmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Cb290c3RyYXBCYWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuQm9vdHN0cmFwQ29uZmlndXJhdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZTsKKworLyoqCisgKiBDb25maWd1cmF0b3Igd2hpY2ggaW5pdGlhbGl6ZXMgYW5kIHJlZ2lzdGVyIHtAbGluayBSZXNvdXJjZUJhZ30gaW5zdGFuY2UgaW50byB7QGxpbmsgQm9vdHN0cmFwQmFnfS4KKyAqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworY2xhc3MgUmVzb3VyY2VCYWdDb25maWd1cmF0b3IgaW1wbGVtZW50cyBCb290c3RyYXBDb25maWd1cmF0b3IgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoUmVzb3VyY2VCYWdDb25maWd1cmF0b3IuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGluaXQoSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyLCBCb290c3RyYXBCYWcgYm9vdHN0cmFwQmFnKSB7CisgICAgICAgIFNlcnZlckJvb3RzdHJhcEJhZyBzZXJ2ZXJCYWcgPSAoU2VydmVyQm9vdHN0cmFwQmFnKSBib290c3RyYXBCYWc7CisgICAgICAgIFJlc291cmNlQ29uZmlnIHJ1bnRpbWVDb25maWcgPSBzZXJ2ZXJCYWcuZ2V0UnVudGltZUNvbmZpZygpOworCisgICAgICAgIGZpbmFsIGJvb2xlYW4gZGlzYWJsZVZhbGlkYXRpb24gPSBTZXJ2ZXJQcm9wZXJ0aWVzLmdldFZhbHVlKHJ1bnRpbWVDb25maWcuZ2V0UHJvcGVydGllcygpLAorICAgICAgICAgICAgICAgIFNlcnZlclByb3BlcnRpZXMuUkVTT1VSQ0VfVkFMSURBVElPTl9ESVNBQkxFLAorICAgICAgICAgICAgICAgIEJvb2xlYW4uRkFMU0UsCisgICAgICAgICAgICAgICAgQm9vbGVhbi5jbGFzcyk7CisKKyAgICAgICAgZmluYWwgUmVzb3VyY2VCYWcuQnVpbGRlciByZXNvdXJjZUJhZ0J1aWxkZXIgPSBuZXcgUmVzb3VyY2VCYWcuQnVpbGRlcigpOworCisgICAgICAgIC8vIEFkZGluZyBwcm9ncmFtbWF0aWMgcmVzb3VyY2UgbW9kZWxzCisgICAgICAgIGZvciAoZmluYWwgUmVzb3VyY2UgcHJvZ3JhbW1hdGljUmVzb3VyY2UgOiBydW50aW1lQ29uZmlnLmdldFJlc291cmNlcygpKSB7CisgICAgICAgICAgICByZXNvdXJjZUJhZ0J1aWxkZXIucmVnaXN0ZXJQcm9ncmFtbWF0aWNSZXNvdXJjZShwcm9ncmFtbWF0aWNSZXNvdXJjZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBJbnRyb3NwZWN0aW5nIGNsYXNzZXMgJiBpbnN0YW5jZXMKKyAgICAgICAgZm9yIChmaW5hbCBDbGFzczw/PiBjIDogcnVudGltZUNvbmZpZy5nZXRDbGFzc2VzKCkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZmluYWwgUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNvdXJjZS5mcm9tKGMsIGRpc2FibGVWYWxpZGF0aW9uKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXNvdXJjZUJhZ0J1aWxkZXIucmVnaXN0ZXJSZXNvdXJjZShjLCByZXNvdXJjZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLndhcm5pbmcoZXguZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoZmluYWwgT2JqZWN0IG8gOiBydW50aW1lQ29uZmlnLmdldFNpbmdsZXRvbnMoKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZSByZXNvdXJjZSA9IFJlc291cmNlLmZyb20oby5nZXRDbGFzcygpLCBkaXNhYmxlVmFsaWRhdGlvbik7CisgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VCYWdCdWlsZGVyLnJlZ2lzdGVyUmVzb3VyY2UobywgcmVzb3VyY2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIExPR0dFUi53YXJuaW5nKGV4LmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzZXJ2ZXJCYWcuc2V0UmVzb3VyY2VCYWcocmVzb3VyY2VCYWdCdWlsZGVyLmJ1aWxkKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL1Jlc291cmNlQ29uZmlnLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9SZXNvdXJjZUNvbmZpZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NjBmZDIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9SZXNvdXJjZUNvbmZpZy5qYXZhCkBAIC0wLDAgKzEsMTMwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlJ1bnRpbWVUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmFibGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkVycm9yczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnNwaS5BdXRvRGlzY292ZXJhYmxlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUHJvcGVydGllc0hlbHBlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlJlZmxlY3Rpb25IZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5Ub2tlbml6ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW9kZWwuQ29udHJhY3RQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb2RlbC5pbnRlcm5hbC5Db21tb25Db25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW9kZWwuaW50ZXJuYWwuQ29tcG9uZW50QmFnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1vZGVsLmludGVybmFsLk1hbmFnZWRPYmplY3RzRmluYWxpemVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuSW5mbGVjdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWwuUmVxdWVzdFNjb3BlZDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLnNjYW5uaW5nLkFubm90YXRpb25BY2NlcHRpbmdMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuc2Nhbm5pbmcuRmlsZXNTY2FubmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5zY2FubmluZy5QYWNrYWdlTmFtZXNTY2FubmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZTsKKworLyoqCisgKiBUaGUgcmVzb3VyY2UgY29uZmlndXJhdGlvbiBmb3IgY29uZmlndXJpbmcgYSB3ZWIgYXBwbGljYXRpb24uCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNvdXJjZUNvbmZpZyBleHRlbmRzIEFwcGxpY2F0aW9uIGltcGxlbWVudHMgQ29uZmlndXJhYmxlPFJlc291cmNlQ29uZmlnPiwgU2VydmVyQ29uZmlnIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFJlc291cmNlQ29uZmlnLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBwcml2YXRlIHRyYW5zaWVudCBTZXQ8Q2xhc3M8Pz4+IGNhY2hlZENsYXNzZXMgPSBudWxsOworICAgIHByaXZhdGUgdHJhbnNpZW50IFNldDxDbGFzczw/Pj4gY2FjaGVkQ2xhc3Nlc1ZpZXcgPSBudWxsOworICAgIHByaXZhdGUgdHJhbnNpZW50IFNldDxPYmplY3Q+IGNhY2hlZFNpbmdsZXRvbnMgPSBudWxsOworICAgIHByaXZhdGUgdHJhbnNpZW50IFNldDxPYmplY3Q+IGNhY2hlZFNpbmdsZXRvbnNWaWV3ID0gbnVsbDsKKworICAgIHByaXZhdGUgdHJhbnNpZW50IGJvb2xlYW4gcmVzZXRGaW5kZXJzID0gZmFsc2U7CisKKyAgICBwcml2YXRlIHZvbGF0aWxlIFN0YXRlIHN0YXRlOworCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU3RhdGUgZXh0ZW5kcyBDb21tb25Db25maWcgaW1wbGVtZW50cyBTZXJ2ZXJDb25maWcgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgU2V0PFJlc291cmNlRmluZGVyPiByZXNvdXJjZUZpbmRlcnM7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8UmVzb3VyY2U+IHJlc291cmNlczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8UmVzb3VyY2U+IHJlc291cmNlc1ZpZXc7CisgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgU3RyaW5nIGFwcGxpY2F0aW9uTmFtZTsKKworICAgICAgICBwcml2YXRlIHZvbGF0aWxlIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyID0gbnVsbDsKKworICAgICAgICBwdWJsaWMgU3RhdGUoKSB7CisgICAgICAgICAgICBzdXBlcihSdW50aW1lVHlwZS5TRVJWRVIsIENvbXBvbmVudEJhZy5JTkNMVURFX0FMTCk7CisgICAgICAgICAgICB0aGlzLmNsYXNzTG9hZGVyID0gQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoUmVmbGVjdGlvbkhlbHBlci5nZXRDb250ZXh0Q2xhc3NMb2FkZXJQQSgpKTsKKworICAgICAgICAgICAgdGhpcy5yZXNvdXJjZUZpbmRlcnMgPSBuZXcgSGFzaFNldDw+KCk7CisKKyAgICAgICAgICAgIHRoaXMucmVzb3VyY2VzID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICAgICAgdGhpcy5yZXNvdXJjZXNWaWV3ID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KHRoaXMucmVzb3VyY2VzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdGF0ZShmaW5hbCBTdGF0ZSBvcmlnaW5hbCkgeworICAgICAgICAgICAgc3VwZXIob3JpZ2luYWwpOworICAgICAgICAgICAgdGhpcy5jbGFzc0xvYWRlciA9IG9yaWdpbmFsLmNsYXNzTG9hZGVyOworICAgICAgICAgICAgdGhpcy5hcHBsaWNhdGlvbk5hbWUgPSBvcmlnaW5hbC5hcHBsaWNhdGlvbk5hbWU7CisKKyAgICAgICAgICAgIHRoaXMucmVzb3VyY2VzID0gbmV3IEhhc2hTZXQ8PihvcmlnaW5hbC5yZXNvdXJjZXMpOworICAgICAgICAgICAgdGhpcy5yZXNvdXJjZXNWaWV3ID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KHRoaXMucmVzb3VyY2VzKTsKKworICAgICAgICAgICAgdGhpcy5yZXNvdXJjZUZpbmRlcnMgPSBuZXcgSGFzaFNldDw+KG9yaWdpbmFsLnJlc291cmNlRmluZGVycyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc0xvYWRlcihmaW5hbCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgeworICAgICAgICAgICAgdGhpcy5jbGFzc0xvYWRlciA9IGNsYXNzTG9hZGVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0QXBwbGljYXRpb25OYW1lKGZpbmFsIFN0cmluZyBhcHBsaWNhdGlvbk5hbWUpIHsKKyAgICAgICAgICAgIHRoaXMuYXBwbGljYXRpb25OYW1lID0gYXBwbGljYXRpb25OYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJSZXNvdXJjZXMoZmluYWwgU2V0PFJlc291cmNlPiByZXNvdXJjZXMpIHsKKyAgICAgICAgICAgIHRoaXMucmVzb3VyY2VzLmFkZEFsbChyZXNvdXJjZXMpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJGaW5kZXIoZmluYWwgUmVzb3VyY2VGaW5kZXIgcmVzb3VyY2VGaW5kZXIpIHsKKyAgICAgICAgICAgIHRoaXMucmVzb3VyY2VGaW5kZXJzLmFkZChyZXNvdXJjZUZpbmRlcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEluZmxlY3RvcjxDb250cmFjdFByb3ZpZGVyLkJ1aWxkZXIsIENvbnRyYWN0UHJvdmlkZXI+IGdldE1vZGVsRW5oYW5jZXIoZmluYWwgQ2xhc3M8Pz4gY29tcG9uZW50Q2xhc3MpIHsKKyAgICAgICAgICAgIHJldHVybiBidWlsZGVyIC0+IHsKKyAgICAgICAgICAgICAgICBpZiAoYnVpbGRlci5nZXRTY29wZSgpID09IG51bGwgJiYgYnVpbGRlci5nZXRDb250cmFjdHMoKS5pc0VtcHR5KCkgJiYgUmVzb3VyY2UuZ2V0UGF0aChjb21wb25lbnRDbGFzcykgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBidWlsZGVyLnNjb3BlKFJlcXVlc3RTY29wZWQuY2xhc3MpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7CisgICAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdGF0ZSBsb2FkRnJvbShmaW5hbCBDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICAgICAgc3VwZXIubG9hZEZyb20oY29uZmlnKTsKKyAgICAgICAgICAgIHRoaXMucmVzb3VyY2VGaW5kZXJzLmNsZWFyKCk7CisgICAgICAgICAgICB0aGlzLnJlc291cmNlcy5jbGVhcigpOworCisgICAgICAgICAgICBTdGF0ZSBvdGhlciA9IG51bGw7CisgICAgICAgICAgICBpZiAoY29uZmlnIGluc3RhbmNlb2YgUmVzb3VyY2VDb25maWcpIHsKKyAgICAgICAgICAgICAgICBvdGhlciA9ICgoUmVzb3VyY2VDb25maWcpIGNvbmZpZykuc3RhdGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29uZmlnIGluc3RhbmNlb2YgU3RhdGUpIHsKKyAgICAgICAgICAgICAgICBvdGhlciA9IChTdGF0ZSkgY29uZmlnOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAob3RoZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRoaXMucmVzb3VyY2VGaW5kZXJzLmFkZEFsbChvdGhlci5yZXNvdXJjZUZpbmRlcnMpOworICAgICAgICAgICAgICAgIHRoaXMucmVzb3VyY2VzLmFkZEFsbChvdGhlci5yZXNvdXJjZXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgZmluYWwgU2V0PFJlc291cmNlPiBnZXRSZXNvdXJjZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzb3VyY2VzVmlldzsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU2VydmVyQ29uZmlnIGdldENvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIHJlZ2lzdGVyZWQgcmVzb3VyY2UgZmluZGVycy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiByZWdpc3RlcmVkIHJlc291cmNlIGZpbmRlcnMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU2V0PFJlc291cmNlRmluZGVyPiBnZXRSZXNvdXJjZUZpbmRlcnMoKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzb3VyY2VGaW5kZXJzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCByZXNvdXJjZSBhbmQgcHJvdmlkZXIgY2xhc3MgbG9hZGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIGNsYXNzIGxvYWRlciB0byBiZSB1c2VkIHdoZW4gbG9va2luZyB1cCB0aGUgcmVzb3VyY2UgY2xhc3NlcyBhbmQgcHJvdmlkZXJzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIENsYXNzTG9hZGVyIGdldENsYXNzTG9hZGVyKCkgeworICAgICAgICAgICAgcmV0dXJuIGNsYXNzTG9hZGVyOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QXBwbGljYXRpb25OYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIGFwcGxpY2F0aW9uTmFtZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEltbXV0YWJsZVN0YXRlIGV4dGVuZHMgU3RhdGUgeworCisgICAgICAgIHByaXZhdGUgSW1tdXRhYmxlU3RhdGUoZmluYWwgU3RhdGUgb3JpZ2luYWwpIHsKKyAgICAgICAgICAgIHN1cGVyKG9yaWdpbmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRDbGFzc0xvYWRlcihmaW5hbCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5SQ19OT1RfTU9ESUZJQUJMRSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCByZWdpc3RlclJlc291cmNlcyhmaW5hbCBTZXQ8UmVzb3VyY2U+IHJlc291cmNlcykgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5SQ19OT1RfTU9ESUZJQUJMRSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCByZWdpc3RlckZpbmRlcihmaW5hbCBSZXNvdXJjZUZpbmRlciByZXNvdXJjZUZpbmRlcikgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5SQ19OT1RfTU9ESUZJQUJMRSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RhdGUgYWRkUHJvcGVydGllcyhmaW5hbCBNYXA8U3RyaW5nLCA/PiBwcm9wZXJ0aWVzKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlJDX05PVF9NT0RJRklBQkxFKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdGF0ZSBwcm9wZXJ0eShmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlJDX05PVF9NT0RJRklBQkxFKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdGF0ZSByZWdpc3RlcihmaW5hbCBDbGFzczw/PiBjb21wb25lbnRDbGFzcykgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5SQ19OT1RfTU9ESUZJQUJMRSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RhdGUgcmVnaXN0ZXIoZmluYWwgQ2xhc3M8Pz4gY29tcG9uZW50Q2xhc3MsIGZpbmFsIGludCBiaW5kaW5nUHJpb3JpdHkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuUkNfTk9UX01PRElGSUFCTEUoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0YXRlIHJlZ2lzdGVyKGZpbmFsIENsYXNzPD8+IGNvbXBvbmVudENsYXNzLCBmaW5hbCBDbGFzczw/Pi4uLiBjb250cmFjdHMpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuUkNfTk9UX01PRElGSUFCTEUoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0YXRlIHJlZ2lzdGVyKGZpbmFsIENsYXNzPD8+IGNvbXBvbmVudENsYXNzLCBmaW5hbCBNYXA8Q2xhc3M8Pz4sIEludGVnZXI+IGNvbnRyYWN0cykgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5SQ19OT1RfTU9ESUZJQUJMRSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RhdGUgcmVnaXN0ZXIoZmluYWwgT2JqZWN0IGNvbXBvbmVudCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5SQ19OT1RfTU9ESUZJQUJMRSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RhdGUgcmVnaXN0ZXIoZmluYWwgT2JqZWN0IGNvbXBvbmVudCwgZmluYWwgaW50IGJpbmRpbmdQcmlvcml0eSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5SQ19OT1RfTU9ESUZJQUJMRSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RhdGUgcmVnaXN0ZXIoZmluYWwgT2JqZWN0IGNvbXBvbmVudCwgZmluYWwgQ2xhc3M8Pz4uLi4gY29udHJhY3RzKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlJDX05PVF9NT0RJRklBQkxFKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdGF0ZSByZWdpc3RlcihmaW5hbCBPYmplY3QgY29tcG9uZW50LCBmaW5hbCBNYXA8Q2xhc3M8Pz4sIEludGVnZXI+IGNvbnRyYWN0cykgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5SQ19OT1RfTU9ESUZJQUJMRSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RhdGUgc2V0UHJvcGVydGllcyhmaW5hbCBNYXA8U3RyaW5nLCA/PiBwcm9wZXJ0aWVzKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlJDX05PVF9NT0RJRklBQkxFKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZUF1dG9EaXNjb3ZlcmFibGVQcm92aWRlcnMoZmluYWwgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyLAorICAgICAgICAgICAgICAgIGZpbmFsIENvbGxlY3Rpb248QXV0b0Rpc2NvdmVyYWJsZT4gYXV0b0Rpc2NvdmVyYWJsZXMsIGZpbmFsIGJvb2xlYW4gZm9yY2VkT25seSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5SQ19OT1RfTU9ESUZJQUJMRSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjb25maWd1cmVNZXRhUHJvdmlkZXJzKGZpbmFsIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciwgZmluYWwgTWFuYWdlZE9iamVjdHNGaW5hbGl6ZXIgZmluYWxpemVyKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlJDX05PVF9NT0RJRklBQkxFKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHtAY29kZSBSZXNvdXJjZUNvbmZpZ30gaW5zdGFuY2UgZm9yIHRoZSBzdXBwbGllZCBhcHBsaWNhdGlvbi4KKyAgICAgKiA8cC8+CisgICAgICogSWYgdGhlIGFwcGxpY2F0aW9uIGlzIGFuIGluc3RhbmNlIG9mIHtAY29kZSBSZXNvdXJjZUNvbmZpZ30gdGhlIG1ldGhvZCByZXR1cm5zIGRlZmVuc2l2ZSBjb3B5IG9mIHRoZSByZXNvdXJjZSBjb25maWcuCisgICAgICogT3RoZXJ3aXNlIGl0IGNyZWF0ZXMgYSBuZXcge0Bjb2RlIFJlc291cmNlQ29uZmlnfSBmcm9tIHRoZSBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcHBsaWNhdGlvbiBBcHBsaWNhdGlvbiB0byBwcm92aWRlIHRoZSB7QGNvZGUgUmVzb3VyY2VDb25maWd9IGluc3RhbmNlIGZvci4KKyAgICAgKiBAcmV0dXJuIFJlc291cmNlQ29uZmlnIGluc3RhbmNlIGZvciB0aGUgc3VwcGxpZWQgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZUNvbmZpZyBmb3JBcHBsaWNhdGlvbihmaW5hbCBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbikgeworICAgICAgICByZXR1cm4gYXBwbGljYXRpb24gaW5zdGFuY2VvZiBSZXNvdXJjZUNvbmZpZworICAgICAgICAgICAgICAgID8gKChSZXNvdXJjZUNvbmZpZykgYXBwbGljYXRpb24pCisgICAgICAgICAgICAgICAgOiBuZXcgV3JhcHBpbmdSZXNvdXJjZUNvbmZpZyhhcHBsaWNhdGlvbiwgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHtAY29kZSBSZXNvdXJjZUNvbmZpZ30gaW5zdGFuY2Ugd3JhcHBpbmcgdGhlIGFwcGxpY2F0aW9uIG9mIHRoZSBzdXBwbGllZCBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcHBsaWNhdGlvbkNsYXNzIENsYXNzIHJlcHJlc2VudGluZyBhIEpBWC1SUyBhcHBsaWNhdGlvbi4KKyAgICAgKiBAcmV0dXJuIFJlc291cmNlQ29uZmlnIHdyYXBwaW5nIHRoZSBKQVgtUlMgYXBwbGljYXRpb24gZGVmaW5lZCBieSB0aGUgc3VwcGxpZWQgY2xhc3MuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZUNvbmZpZyBmb3JBcHBsaWNhdGlvbkNsYXNzKGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBBcHBsaWNhdGlvbj4gYXBwbGljYXRpb25DbGFzcykgeworICAgICAgICByZXR1cm4gbmV3IFdyYXBwaW5nUmVzb3VyY2VDb25maWcobnVsbCwgYXBwbGljYXRpb25DbGFzcywgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHtAY29kZSBSZXNvdXJjZUNvbmZpZ30gaW5zdGFuY2Ugd3JhcHBpbmcgdGhlIGFwcGxpY2F0aW9uIG9mIHRoZSBzdXBwbGllZCBjbGFzcy4KKyAgICAgKiA8cC8+CisgICAgICogVGhpcyBtZXRob2QgcHJvdmlkZXMgYW4gb3B0aW9uIG9mIHN1cHBseWluZyB0aGUgc2V0IG9mIGNsYXNzZXMgdGhhdCBzaG91bGQgYmUgcmV0dXJuZWQgZnJvbSB7QGxpbmsgI2dldENsYXNzZXMoKX0KKyAgICAgKiBtZXRob2QgaWYgdGhlIGFwcGxpY2F0aW9uIGRlZmluZWQgYnkgdGhlIHN1cHBsaWVkIGFwcGxpY2F0aW9uIGNsYXNzIHJldHVybnMgZW1wdHkgc2V0cyBmcm9tCisgICAgICoge0BsaW5rIGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb24jZ2V0Q2xhc3NlcygpfQorICAgICAqIGFuZCB7QGxpbmsgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbiNnZXRTaW5nbGV0b25zKCl9IG1ldGhvZHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXBwbGljYXRpb25DbGFzcyBDbGFzcyByZXByZXNlbnRpbmcgYSBKQVgtUlMgYXBwbGljYXRpb24uCisgICAgICogQHBhcmFtIGRlZmF1bHRDbGFzc2VzICAgRGVmYXVsdCBzZXQgb2YgY2xhc3NlcyB0aGF0IHNob3VsZCBiZSByZXR1cm5lZCBmcm9tIHtAbGluayAjZ2V0Q2xhc3NlcygpfSBpZiB0aGUgdW5kZXJseWluZworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIGRvZXMgbm90IHByb3ZpZGUgYW55IGNsYXNzZXMgYW5kIHNpbmdsZXRvbnMuCisgICAgICogQHJldHVybiBSZXNvdXJjZUNvbmZpZyB3cmFwcGluZyB0aGUgSkFYLVJTIGFwcGxpY2F0aW9uIGRlZmluZWQgYnkgdGhlIHN1cHBsaWVkIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VDb25maWcgZm9yQXBwbGljYXRpb25DbGFzcyhmaW5hbCBDbGFzczw/IGV4dGVuZHMgQXBwbGljYXRpb24+IGFwcGxpY2F0aW9uQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNldDxDbGFzczw/Pj4gZGVmYXVsdENsYXNzZXMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBXcmFwcGluZ1Jlc291cmNlQ29uZmlnKG51bGwsIGFwcGxpY2F0aW9uQ2xhc3MsIGRlZmF1bHRDbGFzc2VzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgcmVzb3VyY2UgY29uZmlndXJhdGlvbiB3aXRob3V0IGFueSBjdXN0b20gcHJvcGVydGllcyBvcgorICAgICAqIHJlc291cmNlIGFuZCBwcm92aWRlciBjbGFzc2VzLgorICAgICAqLworICAgIHB1YmxpYyBSZXNvdXJjZUNvbmZpZygpIHsKKyAgICAgICAgdGhpcy5zdGF0ZSA9IG5ldyBTdGF0ZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyByZXNvdXJjZSBjb25maWd1cmF0aW9uIGluaXRpYWxpemVkIHdpdGggYSBnaXZlbiBzZXQgb2YKKyAgICAgKiByZXNvdXJjZS9wcm92aWRlciBjbGFzc2VzLgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzZXMgYXBwbGljYXRpb24tc3BlY2lmaWMgcmVzb3VyY2UgYW5kL29yIHByb3ZpZGVyIGNsYXNzZXMuCisgICAgICovCisgICAgcHVibGljIFJlc291cmNlQ29uZmlnKGZpbmFsIFNldDxDbGFzczw/Pj4gY2xhc3NlcykgeworICAgICAgICB0aGlzKCk7CisgICAgICAgIHRoaXMucmVnaXN0ZXJDbGFzc2VzKGNsYXNzZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyByZXNvdXJjZSBjb25maWd1cmF0aW9uIGluaXRpYWxpemVkIHdpdGggYSBnaXZlbiBzZXQgb2YKKyAgICAgKiByZXNvdXJjZS9wcm92aWRlciBjbGFzc2VzLgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzZXMgYXBwbGljYXRpb24tc3BlY2lmaWMgcmVzb3VyY2UgYW5kL29yIHByb3ZpZGVyIGNsYXNzZXMuCisgICAgICovCisgICAgcHVibGljIFJlc291cmNlQ29uZmlnKGZpbmFsIENsYXNzPD8+Li4uIGNsYXNzZXMpIHsKKyAgICAgICAgdGhpcyhBcnJheXMuc3RyZWFtKGNsYXNzZXMpLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgZGVmZW5zaXZlIHJlc291cmNlIGNvbmZpZ3VyYXRpb24gY29weSBpbml0aWFsaXplZCB3aXRoIGEgZ2l2ZW4ge0Bjb2RlIFJlc291cmNlQ29uZmlnfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvcmlnaW5hbCByZXNvdXJjZSBjb25maWd1cmF0aW9uIHRvIGNyZWF0ZUFuZEluaXRpYWxpemUgYSBkZWZlbnNpdmUgY29weSBmcm9tLgorICAgICAqLworICAgIHB1YmxpYyBSZXNvdXJjZUNvbmZpZyhmaW5hbCBSZXNvdXJjZUNvbmZpZyBvcmlnaW5hbCkgeworICAgICAgICB0aGlzLnN0YXRlID0gbmV3IFN0YXRlKG9yaWdpbmFsLnN0YXRlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgcHJvcGVydGllcyB0byB7QGNvZGUgUmVzb3VyY2VDb25maWd9LgorICAgICAqIDxwLz4KKyAgICAgKiBJZiBhbnkgb2YgdGhlIGFkZGVkIHByb3BlcnRpZXMgZXhpc3RzIGFscmVhZHksIG9sZCB2YWx1ZXMgb2YgZXhpc3RpbmcKKyAgICAgKiBwcm9wZXJ0aWVzIHdpbGwgYmUgcmVwbGFjZWQgYnkgbmV3IHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzIHByb3BlcnRpZXMgdG8gYWRkLgorICAgICAqIEByZXR1cm4gdXBkYXRlZCByZXNvdXJjZSBjb25maWd1cmF0aW9uIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBSZXNvdXJjZUNvbmZpZyBhZGRQcm9wZXJ0aWVzKGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykgeworICAgICAgICBzdGF0ZS5hZGRQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgbmV3IGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyByZXBsYWNpbmcgYWxsIHByZXZpb3VzbHkgc2V0IHByb3BlcnRpZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvcGVydGllcyBuZXcgc2V0IG9mIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcy4gVGhlIGNvbnRlbnQgb2YKKyAgICAgKiAgICAgICAgICAgICAgICAgICB0aGUgbWFwIHdpbGwgcmVwbGFjZSBhbnkgZXhpc3RpbmcgcHJvcGVydGllcyBzZXQgb24gdGhlIGNvbmZpZ3VyYXRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS4KKyAgICAgKiBAcmV0dXJuIHRoZSB1cGRhdGVkIGNvbmZpZ3VyYXRpb24gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIFJlc291cmNlQ29uZmlnIHNldFByb3BlcnRpZXMoZmluYWwgTWFwPFN0cmluZywgPz4gcHJvcGVydGllcykgeworICAgICAgICBzdGF0ZS5zZXRQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb3VyY2VDb25maWcgcHJvcGVydHkoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBzdGF0ZS5wcm9wZXJ0eShuYW1lLCB2YWx1ZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvdXJjZUNvbmZpZyByZWdpc3RlcihmaW5hbCBDbGFzczw/PiBjb21wb25lbnRDbGFzcykgeworICAgICAgICBpbnZhbGlkYXRlQ2FjaGUoKTsKKyAgICAgICAgc3RhdGUucmVnaXN0ZXIoY29tcG9uZW50Q2xhc3MpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb3VyY2VDb25maWcgcmVnaXN0ZXIoZmluYWwgQ2xhc3M8Pz4gY29tcG9uZW50Q2xhc3MsIGZpbmFsIGludCBiaW5kaW5nUHJpb3JpdHkpIHsKKyAgICAgICAgaW52YWxpZGF0ZUNhY2hlKCk7CisgICAgICAgIHN0YXRlLnJlZ2lzdGVyKGNvbXBvbmVudENsYXNzLCBiaW5kaW5nUHJpb3JpdHkpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb3VyY2VDb25maWcgcmVnaXN0ZXIoZmluYWwgQ2xhc3M8Pz4gY29tcG9uZW50Q2xhc3MsIGZpbmFsIENsYXNzPD8+Li4uIGNvbnRyYWN0cykgeworICAgICAgICBpbnZhbGlkYXRlQ2FjaGUoKTsKKyAgICAgICAgc3RhdGUucmVnaXN0ZXIoY29tcG9uZW50Q2xhc3MsIGNvbnRyYWN0cyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvdXJjZUNvbmZpZyByZWdpc3RlcihmaW5hbCBDbGFzczw/PiBjb21wb25lbnRDbGFzcywgZmluYWwgTWFwPENsYXNzPD8+LCBJbnRlZ2VyPiBjb250cmFjdHMpIHsKKyAgICAgICAgaW52YWxpZGF0ZUNhY2hlKCk7CisgICAgICAgIHN0YXRlLnJlZ2lzdGVyKGNvbXBvbmVudENsYXNzLCBjb250cmFjdHMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb3VyY2VDb25maWcgcmVnaXN0ZXIoZmluYWwgT2JqZWN0IGNvbXBvbmVudCkgeworICAgICAgICBpbnZhbGlkYXRlQ2FjaGUoKTsKKyAgICAgICAgc3RhdGUucmVnaXN0ZXIoY29tcG9uZW50KTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc291cmNlQ29uZmlnIHJlZ2lzdGVyKGZpbmFsIE9iamVjdCBjb21wb25lbnQsIGZpbmFsIGludCBiaW5kaW5nUHJpb3JpdHkpIHsKKyAgICAgICAgaW52YWxpZGF0ZUNhY2hlKCk7CisgICAgICAgIHN0YXRlLnJlZ2lzdGVyKGNvbXBvbmVudCwgYmluZGluZ1ByaW9yaXR5KTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc291cmNlQ29uZmlnIHJlZ2lzdGVyKGZpbmFsIE9iamVjdCBjb21wb25lbnQsIGZpbmFsIENsYXNzPD8+Li4uIGNvbnRyYWN0cykgeworICAgICAgICBpbnZhbGlkYXRlQ2FjaGUoKTsKKyAgICAgICAgc3RhdGUucmVnaXN0ZXIoY29tcG9uZW50LCBjb250cmFjdHMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb3VyY2VDb25maWcgcmVnaXN0ZXIoZmluYWwgT2JqZWN0IGNvbXBvbmVudCwgZmluYWwgTWFwPENsYXNzPD8+LCBJbnRlZ2VyPiBjb250cmFjdHMpIHsKKyAgICAgICAgaW52YWxpZGF0ZUNhY2hlKCk7CisgICAgICAgIHN0YXRlLnJlZ2lzdGVyKGNvbXBvbmVudCwgY29udHJhY3RzKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgYW5ub3RhdGVkIEpBWC1SUyByZXNvdXJjZSwgSkFYLVJTIG9yIEplcnNleSBjb250cmFjdCBwcm92aWRlciBvciBKQVgtUlMgZmVhdHVyZQorICAgICAqIGluIHRoZSB7QGNvZGUgUmVzb3VyY2VDb25maWd9LgorICAgICAqIDxwPgorICAgICAqIE5vdGUgdGhhdCByZWdpc3RlcmVkIEpBWC1SUyBmZWF0dXJlcyBhcmUgdXNlZCB0byBpbml0aWFsaXplIGFuZCBjb25maWd1cmUKKyAgICAgKiB0aGUgSmVyc2V5IHJ1bnRpbWUge0BsaW5rIEluamVjdGlvbk1hbmFnZXJ9IGluc3RhbmNlIGR1cmluZyBhcHBsaWNhdGlvbiBkZXBsb3ltZW50LCBidXQgYXJlCisgICAgICogb3RoZXJ3aXNlIGlnbm9yZWQgYnkgc2VydmVyLXNpZGUgcnVudGltZSwgdW5sZXNzIHRoZXkgaW1wbGVtZW50IGFsc28gYW5vdGhlciBjb250cmFjdAorICAgICAqIHJlY29nbml6ZWQgYnkgSmVyc2V5IHJ1bnRpbWUuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIEFsc28gbm90ZSB0aGF0IHJlZ2lzdHJhdGlvbiBvZiB7QGxpbmsgQmluZGVyIGJpbmRlcn0gY2xhc3NlcyBpcyBub3RlIHN1cHBvcnRlZC4gQmluZGVycworICAgICAqIG11c3QgYmUge0BsaW5rICNyZWdpc3Rlckluc3RhbmNlcyhPYmplY3QuLi4pIHJlZ2lzdGVyZWQgYXMgaW5zdGFuY2VzfS4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhc3NlcyBjbGFzc2VzIHRvIHJlZ2lzdGVyLgorICAgICAqIEByZXR1cm4gdXBkYXRlZCByZXNvdXJjZSBjb25maWd1cmF0aW9uIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZWdpc3RlckNsYXNzZXMoZmluYWwgU2V0PENsYXNzPD8+PiBjbGFzc2VzKSB7CisgICAgICAgIGlmIChjbGFzc2VzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChmaW5hbCBDbGFzczw/PiBjbHMgOiBjbGFzc2VzKSB7CisgICAgICAgICAgICByZWdpc3RlcihjbHMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGFubm90YXRlZCBKQVgtUlMgcmVzb3VyY2UsIEpBWC1SUyBvciBKZXJzZXkgY29udHJhY3QgcHJvdmlkZXIgb3IgSkFYLVJTIGZlYXR1cmUKKyAgICAgKiBpbiB0aGUge0Bjb2RlIFJlc291cmNlQ29uZmlnfS4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlIHRoYXQgcmVnaXN0ZXJlZCBKQVgtUlMgZmVhdHVyZXMgYXJlIHVzZWQgdG8gaW5pdGlhbGl6ZSBhbmQgY29uZmlndXJlCisgICAgICogdGhlIEplcnNleSBydW50aW1lIHtAbGluayBJbmplY3Rpb25NYW5hZ2VyfSBpbnN0YW5jZSBkdXJpbmcgYXBwbGljYXRpb24gZGVwbG95bWVudCwgYnV0IGFyZQorICAgICAqIG90aGVyd2lzZSBpZ25vcmVkIGJ5IHNlcnZlci1zaWRlIHJ1bnRpbWUsIHVubGVzcyB0aGV5IGltcGxlbWVudCBhbHNvIGFub3RoZXIgY29udHJhY3QKKyAgICAgKiByZWNvZ25pemVkIGJ5IEplcnNleSBydW50aW1lLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBBbHNvIG5vdGUgdGhhdCByZWdpc3RyYXRpb24gb2Yge0BsaW5rIEJpbmRlciBiaW5kZXJ9IGNsYXNzZXMgaXMgbm90ZSBzdXBwb3J0ZWQuIEJpbmRlcnMKKyAgICAgKiBtdXN0IGJlIHtAbGluayAjcmVnaXN0ZXJJbnN0YW5jZXMoT2JqZWN0Li4uKSByZWdpc3RlcmVkIGFzIGluc3RhbmNlc30uCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzZXMgY2xhc3NlcyB0byByZWdpc3Rlci4KKyAgICAgKiBAcmV0dXJuIHVwZGF0ZWQgcmVzb3VyY2UgY29uZmlndXJhdGlvbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgUmVzb3VyY2VDb25maWcgcmVnaXN0ZXJDbGFzc2VzKGZpbmFsIENsYXNzPD8+Li4uIGNsYXNzZXMpIHsKKyAgICAgICAgaWYgKGNsYXNzZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVnaXN0ZXJDbGFzc2VzKEFycmF5cy5zdHJlYW0oY2xhc3NlcykuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBhbm5vdGF0ZWQgSkFYLVJTIHJlc291cmNlLCBKQVgtUlMgb3IgSmVyc2V5IGNvbnRyYWN0IHByb3ZpZGVyLCBKQVgtUlMgZmVhdHVyZQorICAgICAqIHtAbGluayBCaW5kZXIgSmVyc2V5IEJpbmRlcn0gaW5zdGFuY2VzIChzaW5nbGV0b25zKSBpbiB0aGUge0Bjb2RlIFJlc291cmNlQ29uZmlnfS4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlIHRoYXQgcmVnaXN0ZXJlZCBiaW5kZXJzIGFuZCBKQVgtUlMgZmVhdHVyZXMgYXJlIHVzZWQgdG8gaW5pdGlhbGl6ZSBhbmQgY29uZmlndXJlCisgICAgICogdGhlIEplcnNleSBydW50aW1lIHtAbGluayBJbmplY3Rpb25NYW5hZ2VyfSBpbnN0YW5jZSBkdXJpbmcgYXBwbGljYXRpb24gZGVwbG95bWVudCwgYnV0IGFyZQorICAgICAqIG90aGVyd2lzZSBpZ25vcmVkIGJ5IHNlcnZlci1zaWRlIHJ1bnRpbWUsIHVubGVzcyB0aGV5IGltcGxlbWVudCBhbHNvIGFub3RoZXIgY29udHJhY3QKKyAgICAgKiByZWNvZ25pemVkIGJ5IEplcnNleSBydW50aW1lLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnN0YW5jZXMgaW5zdGFuY2VzIHRvIHJlZ2lzdGVyLgorICAgICAqIEByZXR1cm4gdXBkYXRlZCByZXNvdXJjZSBjb25maWd1cmF0aW9uIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZWdpc3Rlckluc3RhbmNlcyhmaW5hbCBTZXQ8T2JqZWN0PiBpbnN0YW5jZXMpIHsKKyAgICAgICAgaWYgKGluc3RhbmNlcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoZmluYWwgT2JqZWN0IGluc3RhbmNlIDogaW5zdGFuY2VzKSB7CisgICAgICAgICAgICByZWdpc3RlcihpbnN0YW5jZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgYW5ub3RhdGVkIEpBWC1SUyByZXNvdXJjZSwgSkFYLVJTIG9yIEplcnNleSBjb250cmFjdCBwcm92aWRlciwgSkFYLVJTIGZlYXR1cmUsCisgICAgICoge0BsaW5rIEJpbmRlciBKZXJzZXkgQmluZGVyfSBpbnN0YW5jZXMgKHNpbmdsZXRvbnMpIGluIHRoZSB7QGNvZGUgUmVzb3VyY2VDb25maWd9LgorICAgICAqIDxwPgorICAgICAqIE5vdGUgdGhhdCByZWdpc3RlcmVkIGJpbmRlcnMgYW5kIEpBWC1SUyBmZWF0dXJlcyBhcmUgdXNlZCB0byBpbml0aWFsaXplIGFuZCBjb25maWd1cmUKKyAgICAgKiB0aGUgSmVyc2V5IHJ1bnRpbWUge0BsaW5rIEluamVjdGlvbk1hbmFnZXJ9IGluc3RhbmNlIGR1cmluZyBhcHBsaWNhdGlvbiBkZXBsb3ltZW50LCBidXQgYXJlCisgICAgICogb3RoZXJ3aXNlIGlnbm9yZWQgYnkgc2VydmVyLXNpZGUgcnVudGltZSwgdW5sZXNzIHRoZXkgaW1wbGVtZW50IGFsc28gYW5vdGhlciBjb250cmFjdAorICAgICAqIHJlY29nbml6ZWQgYnkgSmVyc2V5IHJ1bnRpbWUuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGluc3RhbmNlcyBpbnN0YW5jZXMgdG8gcmVnaXN0ZXIuCisgICAgICogQHJldHVybiB1cGRhdGVkIHJlc291cmNlIGNvbmZpZ3VyYXRpb24gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlZ2lzdGVySW5zdGFuY2VzKGZpbmFsIE9iamVjdC4uLiBpbnN0YW5jZXMpIHsKKyAgICAgICAgaWYgKGluc3RhbmNlcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZWdpc3Rlckluc3RhbmNlcyhBcnJheXMuc3RyZWFtKGluc3RhbmNlcykuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBuZXcgcHJvZ3JhbW1hdGljIHJlc291cmNlIG1vZGVscyBpbiB0aGUge0Bjb2RlIFJlc291cmNlQ29uZmlnfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZXMgcmVzb3VyY2UgbW9kZWxzIHRvIHJlZ2lzdGVyLgorICAgICAqIEByZXR1cm4gdXBkYXRlZCByZXNvdXJjZSBjb25maWd1cmF0aW9uIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZWdpc3RlclJlc291cmNlcyhmaW5hbCBSZXNvdXJjZS4uLiByZXNvdXJjZXMpIHsKKyAgICAgICAgaWYgKHJlc291cmNlcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZWdpc3RlclJlc291cmNlcyhBcnJheXMuc3RyZWFtKHJlc291cmNlcykuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBuZXcgcmVzb3VyY2UgbW9kZWxzIGluIHRoZSB7QGNvZGUgUmVzb3VyY2VDb25maWd9LgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlcyByZXNvdXJjZSBtb2RlbHMgdG8gcmVnaXN0ZXIuCisgICAgICogQHJldHVybiB1cGRhdGVkIHJlc291cmNlIGNvbmZpZ3VyYXRpb24gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlZ2lzdGVyUmVzb3VyY2VzKGZpbmFsIFNldDxSZXNvdXJjZT4gcmVzb3VyY2VzKSB7CisgICAgICAgIGlmIChyZXNvdXJjZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLnN0YXRlLnJlZ2lzdGVyUmVzb3VyY2VzKHJlc291cmNlcyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIHtAbGluayBSZXNvdXJjZUZpbmRlcn0gdG8ge0Bjb2RlIFJlc291cmNlQ29uZmlnfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZUZpbmRlciB7QGxpbmsgUmVzb3VyY2VGaW5kZXJ9CisgICAgICogQHJldHVybiB1cGRhdGVkIHJlc291cmNlIGNvbmZpZ3VyYXRpb24gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlZ2lzdGVyRmluZGVyKGZpbmFsIFJlc291cmNlRmluZGVyIHJlc291cmNlRmluZGVyKSB7CisgICAgICAgIGlmIChyZXNvdXJjZUZpbmRlciA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorICAgICAgICBpbnZhbGlkYXRlQ2FjaGUoKTsKKworICAgICAgICB0aGlzLnN0YXRlLnJlZ2lzdGVyRmluZGVyKHJlc291cmNlRmluZGVyKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbi4gVGhlIG5hbWUgaXMgYW4gYXJiaXRyYXJ5IHVzZXIgZGVmaW5lZCBuYW1lCisgICAgICogd2hpY2ggaXMgdXNlZCB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIEplcnNleSBhcHBsaWNhdGlvbnMgaW4gdGhlIGNhc2UgdGhhdCBtb3JlIGFwcGxpY2F0aW9ucworICAgICAqIGFyZSBkZXBsb3llZCBvbiB0aGUgc2FtZSBydW50aW1lIChjb250YWluZXIpLiBUaGUgbmFtZSBjYW4gYmUgdXNlZCBmb3IgZXhhbXBsZSBmb3IgcHVycG9zZXMKKyAgICAgKiBvZiBtb25pdG9yaW5nIGJ5IEpNWCB3aGVuIG5hbWUgaWRlbnRpZmllcyB0byB3aGljaCBhcHBsaWNhdGlvbiBkZXBsb3llZCBNQmVhbnMgYmVsb25nIHRvLgorICAgICAqIFRoZSBuYW1lIHNob3VsZCBiZSB1bmlxdWUgaW4gdGhlIHJ1bnRpbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXBwbGljYXRpb25OYW1lIFVuaXF1ZSBhcHBsaWNhdGlvbiBuYW1lLgorICAgICAqIEByZXR1cm4gdXBkYXRlZCByZXNvdXJjZSBjb25maWd1cmF0aW9uIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBSZXNvdXJjZUNvbmZpZyBzZXRBcHBsaWNhdGlvbk5hbWUoZmluYWwgU3RyaW5nIGFwcGxpY2F0aW9uTmFtZSkgeworICAgICAgICBzdGF0ZS5zZXRBcHBsaWNhdGlvbk5hbWUoYXBwbGljYXRpb25OYW1lKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHtAbGluayBDbGFzc0xvYWRlcn0gd2hpY2ggd2lsbCBiZSB1c2VkIGZvciByZXNvdXJjZSBkaXNjb3ZlcnkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhc3NMb2FkZXIgcHJvdmlkZWQge0BsaW5rIENsYXNzTG9hZGVyfS4KKyAgICAgKiBAcmV0dXJuIHVwZGF0ZWQgcmVzb3VyY2UgY29uZmlndXJhdGlvbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgUmVzb3VyY2VDb25maWcgc2V0Q2xhc3NMb2FkZXIoZmluYWwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKKyAgICAgICAgdGhpcy5zdGF0ZS5zZXRDbGFzc0xvYWRlcihjbGFzc0xvYWRlcik7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYXJyYXkgb2YgcGFja2FnZSBuYW1lcyB3aGljaCB3aWxsIGJlIHVzZWQgdG8gc2NhbiBmb3IgY29tcG9uZW50cy4KKyAgICAgKiA8cC8+CisgICAgICogUGFja2FnZSBzY2FubmluZyBpZ25vcmVzIGluaGVyaXRhbmNlIGFuZCB0aGVyZWZvcmUge0BsaW5rIFBhdGh9IGFubm90YXRpb24KKyAgICAgKiBvbiBwYXJlbnQgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcyB3aWxsIGJlIGlnbm9yZWQuCisgICAgICogPHAvPgorICAgICAqIFBhY2thZ2VzIHdpbGwgYmUgc2Nhbm5lZCByZWN1cnNpdmVseSwgaW5jbHVkaW5nIGFsbCBuZXN0ZWQgcGFja2FnZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFja2FnZXMgYXJyYXkgb2YgcGFja2FnZSBuYW1lcy4KKyAgICAgKiBAcmV0dXJuIHVwZGF0ZWQgcmVzb3VyY2UgY29uZmlndXJhdGlvbiBpbnN0YW5jZS4KKyAgICAgKiBAc2VlICNwYWNrYWdlcyhib29sZWFuLCBTdHJpbmcuLi4pCisgICAgICovCisgICAgcHVibGljIGZpbmFsIFJlc291cmNlQ29uZmlnIHBhY2thZ2VzKGZpbmFsIFN0cmluZy4uLiBwYWNrYWdlcykgeworICAgICAgICByZXR1cm4gcGFja2FnZXModHJ1ZSwgcGFja2FnZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYXJyYXkgb2YgcGFja2FnZSBuYW1lcyB3aGljaCB3aWxsIGJlIHVzZWQgdG8gc2NhbiBmb3IgY29tcG9uZW50cy4KKyAgICAgKiA8cC8+CisgICAgICogUGFja2FnZSBzY2FubmluZyBpZ25vcmVzIGFuIGluaGVyaXRhbmNlIGFuZCB0aGVyZWZvcmUge0BsaW5rIFBhdGh9IGFubm90YXRpb24KKyAgICAgKiBvbiBwYXJlbnQgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcyB3aWxsIGJlIGlnbm9yZWQuCisgICAgICogPHAvPgorICAgICAqIEBwYXJhbSByZWN1cnNpdmUgZGVmaW5lcyB3aGV0aGVyIGFueSBuZXN0ZWQgcGFja2FnZXMgaW4gdGhlIGNvbGxlY3Rpb24gb2Ygc3BlY2lmaWVkCisgICAgICogICAgICAgICAgICAgICAgICBwYWNrYWdlIG5hbWVzIHNob3VsZCBiZSByZWN1cnNpdmVseSBzY2FubmVkICh2YWx1ZSBvZiB7QGNvZGUgdHJ1ZX0pCisgICAgICogICAgICAgICAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBwYWNrYWdlIHNjYW5uaW5nIG9yIG5vdCAodmFsdWUgb2Yge0Bjb2RlIGZhbHNlfSkuCisgICAgICogQHBhcmFtIHBhY2thZ2VzICBhcnJheSBvZiBwYWNrYWdlIG5hbWVzLgorICAgICAqIEByZXR1cm4gdXBkYXRlZCByZXNvdXJjZSBjb25maWd1cmF0aW9uIGluc3RhbmNlLgorICAgICAqIEBzZWUgI3BhY2thZ2VzKFN0cmluZy4uLikKKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgUmVzb3VyY2VDb25maWcgcGFja2FnZXMoZmluYWwgYm9vbGVhbiByZWN1cnNpdmUsIGZpbmFsIFN0cmluZy4uLiBwYWNrYWdlcykgeworICAgICAgICBpZiAocGFja2FnZXMgPT0gbnVsbCB8fCBwYWNrYWdlcy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlZ2lzdGVyRmluZGVyKG5ldyBQYWNrYWdlTmFtZXNTY2FubmVyKHBhY2thZ2VzLCByZWN1cnNpdmUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGFycmF5IG9mIGZpbGUgYW5kIGRpcmVjdG9yeSBuYW1lcyB0byBzY2FuIGZvciBjb21wb25lbnRzLgorICAgICAqIDxwLz4KKyAgICAgKiBBbnkgZGlyZWN0b3JpZXMgaW4gdGhlIGxpc3Qgd2lsbCBiZSBzY2FubmVkIHJlY3Vyc2l2ZWx5LCBpbmNsdWRpbmcgdGhlaXIgc3ViLWRpcmVjdG9yaWVzLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGVzIGFycmF5IG9mIGZpbGUgYW5kIGRpcmVjdG9yeSBuYW1lcy4KKyAgICAgKiBAcmV0dXJuIHVwZGF0ZWQgcmVzb3VyY2UgY29uZmlndXJhdGlvbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgUmVzb3VyY2VDb25maWcgZmlsZXMoZmluYWwgU3RyaW5nLi4uIGZpbGVzKSB7CisgICAgICAgIHJldHVybiBmaWxlcyh0cnVlLCBmaWxlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhcnJheSBvZiBmaWxlIGFuZCBkaXJlY3RvcnkgbmFtZXMgdG8gc2NhbiBmb3IgY29tcG9uZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWN1cnNpdmUgZGVmaW5lcyB3aGV0aGVyIGFueSBzdWItZGlyZWN0b3JpZXMgb2YgdGhlIGRpcmVjdG9yaWVzIHNwZWNpZmllZAorICAgICAqICAgICAgICAgICAgICAgICAgaW4gdGhlIGNvbGxlY3Rpb24gb2YgZmlsZSBuYW1lcyBzaG91bGQgYmUgcmVjdXJzaXZlbHkgc2Nhbm5lZCAodmFsdWUgb2Yge0Bjb2RlIHRydWV9KQorICAgICAqICAgICAgICAgICAgICAgICAgYXMgcGFydCBvZiB0aGUgZmlsZSBzY2FubmluZyBvciBub3QgKHZhbHVlIG9mIHtAY29kZSBmYWxzZX0pLgorICAgICAqIEBwYXJhbSBmaWxlcyAgICAgYXJyYXkgb2YgZmlsZSBhbmQgZGlyZWN0b3J5IG5hbWVzLgorICAgICAqIEByZXR1cm4gdXBkYXRlZCByZXNvdXJjZSBjb25maWd1cmF0aW9uIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBSZXNvdXJjZUNvbmZpZyBmaWxlcyhmaW5hbCBib29sZWFuIHJlY3Vyc2l2ZSwgZmluYWwgU3RyaW5nLi4uIGZpbGVzKSB7CisgICAgICAgIGlmIChmaWxlcyA9PSBudWxsIHx8IGZpbGVzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVnaXN0ZXJGaW5kZXIobmV3IEZpbGVzU2Nhbm5lcihmaWxlcywgcmVjdXJzaXZlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW52YWxpZGF0ZSBjYWNoZWQgY29tcG9uZW50IGluc3RhbmNlcyBhbmQgY2xhc3Nlcy4KKyAgICAgKi8KKyAgICBmaW5hbCB2b2lkIGludmFsaWRhdGVDYWNoZSgpIHsKKyAgICAgICAgdGhpcy5jYWNoZWRDbGFzc2VzID0gbnVsbDsKKyAgICAgICAgdGhpcy5jYWNoZWRDbGFzc2VzVmlldyA9IG51bGw7CisgICAgICAgIHRoaXMuY2FjaGVkU2luZ2xldG9ucyA9IG51bGw7CisgICAgICAgIHRoaXMuY2FjaGVkU2luZ2xldG9uc1ZpZXcgPSBudWxsOworCisgICAgICAgIC8vIFJlc2V0IFJlc291cmNlRmluZGVycyB0byBtYWtlIHN1cmUgdGhlIG5leHQgcGFja2FnZSBzY2FubmluZyBpcyBzdWNjZXNzZnVsLgorICAgICAgICBpZiAocmVzZXRGaW5kZXJzKSB7CisgICAgICAgICAgICBmb3IgKGZpbmFsIFJlc291cmNlRmluZGVyIGZpbmRlciA6IHRoaXMuc3RhdGUucmVzb3VyY2VGaW5kZXJzKSB7CisgICAgICAgICAgICAgICAgZmluZGVyLnJlc2V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXNldEZpbmRlcnMgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN3aXRjaGVzIHRoZSBSZXNvdXJjZUNvbmZpZyB0byByZWFkLW9ubHkgc3RhdGUuCisgICAgICogPHAvPgorICAgICAqIENhbGxlZCBieSB0aGUgV3JhcHBpbmdSZXNvdXJjZUNvbmZpZyBpZiB0aGlzIFJlc291cmNlQ29uZmlnIGlzIHNldCBhcyB0aGUgYXBwbGljYXRpb24uCisgICAgICogQWxzbyBjYWxsZWQgYnkgQXBwbGljYXRpb25IYW5kbGVyIG9uIFdyYXBwaW5nUmVzb3VyY2VDb25maWcgYXQgdGhlIHBvaW50IHdoZW4gaXQgaXMgZ29pbmcKKyAgICAgKiB0byBidWlsZCB0aGUgcmVzb3VyY2UgbW9kZWwuCisgICAgICogPHAvPgorICAgICAqIFRoZSBtZXRob2QgYWxzbyBzZXRzIHRoZSBhcHBsaWNhdGlvbiBuYW1lIGZyb20gcHJvcGVydGllcyBpZiB0aGUgbmFtZSBpcyBub3QgZGVmaW5lZCB5ZXIKKyAgICAgKiBhbmQgdGhlIHByb3BlcnR5IHtAbGluayBTZXJ2ZXJQcm9wZXJ0aWVzI0FQUExJQ0FUSU9OX05BTUV9IGlzIGRlZmluZWQuCisgICAgICovCisgICAgZmluYWwgdm9pZCBsb2NrKCkgeworICAgICAgICBmaW5hbCBTdGF0ZSBjdXJyZW50ID0gc3RhdGU7CisgICAgICAgIGlmICghKGN1cnJlbnQgaW5zdGFuY2VvZiBJbW11dGFibGVTdGF0ZSkpIHsKKyAgICAgICAgICAgIHNldHVwQXBwbGljYXRpb25OYW1lKCk7CisgICAgICAgICAgICBzdGF0ZSA9IG5ldyBJbW11dGFibGVTdGF0ZShjdXJyZW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmaW5hbCBTZXJ2ZXJDb25maWcgZ2V0Q29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0UHJvcGVydGllcygpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRlLmdldFByb3BlcnRpZXMoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgT2JqZWN0IGdldFByb3BlcnR5KGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBzdGF0ZS5nZXRQcm9wZXJ0eShuYW1lKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxTdHJpbmc+IGdldFByb3BlcnR5TmFtZXMoKSB7CisgICAgICAgIHJldHVybiBzdGF0ZS5nZXRQcm9wZXJ0eU5hbWVzKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNQcm9wZXJ0eShmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gc3RhdGUuaXNQcm9wZXJ0eShuYW1lKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICBpZiAoY2FjaGVkQ2xhc3Nlc1ZpZXcgPT0gbnVsbCkgeworICAgICAgICAgICAgY2FjaGVkQ2xhc3NlcyA9IF9nZXRDbGFzc2VzKCk7CisgICAgICAgICAgICBjYWNoZWRDbGFzc2VzVmlldyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChjYWNoZWRDbGFzc2VzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY2FjaGVkQ2xhc3Nlc1ZpZXc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZpbmFsIFNldDxPYmplY3Q+IGdldEluc3RhbmNlcygpIHsKKyAgICAgICAgcmV0dXJuIGdldFNpbmdsZXRvbnMoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgU2V0PE9iamVjdD4gZ2V0U2luZ2xldG9ucygpIHsKKyAgICAgICAgaWYgKGNhY2hlZFNpbmdsZXRvbnNWaWV3ID09IG51bGwpIHsKKyAgICAgICAgICAgIGNhY2hlZFNpbmdsZXRvbnMgPSBfZ2V0U2luZ2xldG9ucygpOworICAgICAgICAgICAgY2FjaGVkU2luZ2xldG9uc1ZpZXcgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoY2FjaGVkU2luZ2xldG9ucyA9PSBudWxsID8gbmV3IEhhc2hTZXQ8PigpIDogY2FjaGVkU2luZ2xldG9ucyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY2FjaGVkU2luZ2xldG9uc1ZpZXc7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBpbnRlcm5hbCBjb21wb25lbnQgYmFnLgorICAgICAqCisgICAgICogQHJldHVybiBpbnRlcm5hbCBjb21wb25lbnQgYmFnLgorICAgICAqLworICAgIGZpbmFsIENvbXBvbmVudEJhZyBnZXRDb21wb25lbnRCYWcoKSB7CisgICAgICAgIHJldHVybiBzdGF0ZS5nZXRDb21wb25lbnRCYWcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmUgYXV0by1kaXNjb3ZlcmFibGVzLgorICAgICAqCisgICAgICogQHBhcmFtIGluamVjdGlvbk1hbmFnZXIgIGluamVjdGlvbiBtYW5hZ2VyIHRvIG9idGFpbiBhdXRvLWRpc2NvdmVyYWJsZXMgZnJvbS4KKyAgICAgKiBAcGFyYW0gYXV0b0Rpc2NvdmVyYWJsZXMgbGlzdCBvZiByZWdpc3RlcmVkIGF1dG8gZGlzY292ZXJhYmxlIGNvbXBvbmVudHMuCisgICAgICovCisgICAgZmluYWwgdm9pZCBjb25maWd1cmVBdXRvRGlzY292ZXJhYmxlUHJvdmlkZXJzKEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciwKKyAgICAgICAgICAgIENvbGxlY3Rpb248QXV0b0Rpc2NvdmVyYWJsZT4gYXV0b0Rpc2NvdmVyYWJsZXMpIHsKKyAgICAgICAgc3RhdGUuY29uZmlndXJlQXV0b0Rpc2NvdmVyYWJsZVByb3ZpZGVycyhpbmplY3Rpb25NYW5hZ2VyLCBhdXRvRGlzY292ZXJhYmxlcywgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbmZpZ3VyZSBmb3JjZWQgYXV0by1kaXNjb3ZlcmFibGVzLgorICAgICAqCisgICAgICogQHBhcmFtIGluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uIG1hbmFnZXIgdG8gb2J0YWluIGF1dG8tZGlzY292ZXJhYmxlcyBmcm9tLgorICAgICAqLworICAgIGZpbmFsIHZvaWQgY29uZmlndXJlRm9yY2VkQXV0b0Rpc2NvdmVyYWJsZVByb3ZpZGVycyhJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIpIHsKKyAgICAgICAgc3RhdGUuY29uZmlndXJlQXV0b0Rpc2NvdmVyYWJsZVByb3ZpZGVycyhpbmplY3Rpb25NYW5hZ2VyLCBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwgdHJ1ZSk7CisgICAgfQorCisgICAgZmluYWwgdm9pZCBjb25maWd1cmVNZXRhUHJvdmlkZXJzKEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciwgTWFuYWdlZE9iamVjdHNGaW5hbGl6ZXIgZmluYWxpemVyKSB7CisgICAgICAgIHN0YXRlLmNvbmZpZ3VyZU1ldGFQcm92aWRlcnMoaW5qZWN0aW9uTWFuYWdlciwgZmluYWxpemVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUnVudGltZVR5cGUgZ2V0UnVudGltZVR5cGUoKSB7CisgICAgICAgIHJldHVybiBzdGF0ZS5nZXRSdW50aW1lVHlwZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChmaW5hbCBGZWF0dXJlIGZlYXR1cmUpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRlLmlzRW5hYmxlZChmZWF0dXJlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoZmluYWwgQ2xhc3M8PyBleHRlbmRzIEZlYXR1cmU+IGZlYXR1cmVDbGFzcykgeworICAgICAgICByZXR1cm4gc3RhdGUuaXNFbmFibGVkKGZlYXR1cmVDbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNSZWdpc3RlcmVkKGZpbmFsIE9iamVjdCBjb21wb25lbnQpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRlLmlzUmVnaXN0ZXJlZChjb21wb25lbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzUmVnaXN0ZXJlZChmaW5hbCBDbGFzczw/PiBjb21wb25lbnRDbGFzcykgeworICAgICAgICByZXR1cm4gc3RhdGUuaXNSZWdpc3RlcmVkKGNvbXBvbmVudENsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWFwPENsYXNzPD8+LCBJbnRlZ2VyPiBnZXRDb250cmFjdHMoZmluYWwgQ2xhc3M8Pz4gY29tcG9uZW50Q2xhc3MpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRlLmdldENvbnRyYWN0cyhjb21wb25lbnRDbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGNvbmZpZ3VyZWQgcmVzb3VyY2UgYW5kL29yIHByb3ZpZGVyIGNsYXNzZXMuIFRoZSBtZXRob2QgaXMgb3ZlcnJpZGRlbgorICAgICAqIGluIGEge0BsaW5rIFdyYXBwaW5nUmVzb3VyY2VDb25maWcgcHJpdmF0ZSBzdWItdHlwZX0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHNldCBvZiBjb25maWd1cmVkIHJlc291cmNlIGFuZC9vciBwcm92aWRlciBjbGFzc2VzLgorICAgICAqLworICAgIFNldDxDbGFzczw/Pj4gX2dldENsYXNzZXMoKSB7CisgICAgICAgIGZpbmFsIFNldDxDbGFzczw/Pj4gcmVzdWx0ID0gc2NhbkNsYXNzZXMoKTsKKyAgICAgICAgcmVzdWx0LmFkZEFsbChzdGF0ZS5nZXRDbGFzc2VzKCkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHByaXZhdGUgU2V0PENsYXNzPD8+PiBzY2FuQ2xhc3NlcygpIHsKKyAgICAgICAgZmluYWwgU2V0PENsYXNzPD8+PiByZXN1bHQgPSBuZXcgSGFzaFNldDw+KCk7CisKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcuU3RhdGUgX3N0YXRlID0gc3RhdGU7CisgICAgICAgIGZpbmFsIFNldDxSZXNvdXJjZUZpbmRlcj4gcmZzID0gbmV3IEhhc2hTZXQ8Pihfc3RhdGUuZ2V0UmVzb3VyY2VGaW5kZXJzKCkpOworCisgICAgICAgIC8vIEluIGNhc2UgbmV3IGVudGl0eSBpcyByZWdpc3RlcmVkIHRoZSBhdmFpbGFibGUgZmluZGVycyBzaG91bGQgYmUgcmVzZXQuCisgICAgICAgIHJlc2V0RmluZGVycyA9IHRydWU7CisKKyAgICAgICAgLy8gY2xhc3NlcyByZWdpc3RlcmVkIHZpYSBjb25maWd1cmF0aW9uIHByb3BlcnR5CisgICAgICAgIGZpbmFsIFN0cmluZ1tdIGNsYXNzTmFtZXMgPSBwYXJzZVByb3BlcnR5VmFsdWUoU2VydmVyUHJvcGVydGllcy5QUk9WSURFUl9DTEFTU05BTUVTKTsKKyAgICAgICAgaWYgKGNsYXNzTmFtZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgY2xhc3NOYW1lIDogY2xhc3NOYW1lcykgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoX3N0YXRlLmdldENsYXNzTG9hZGVyKCkubG9hZENsYXNzKGNsYXNzTmFtZSkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLkNPTkZJRywgTG9jYWxpemF0aW9uTWVzc2FnZXMuVU5BQkxFX1RPX0xPQURfQ0xBU1MoY2xhc3NOYW1lKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZmluYWwgU3RyaW5nW10gcGFja2FnZU5hbWVzID0gcGFyc2VQcm9wZXJ0eVZhbHVlKFNlcnZlclByb3BlcnRpZXMuUFJPVklERVJfUEFDS0FHRVMpOworICAgICAgICBpZiAocGFja2FnZU5hbWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIE9iamVjdCBwID0gZ2V0UHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5QUk9WSURFUl9TQ0FOTklOR19SRUNVUlNJVkUpOworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByZWN1cnNpdmUgPSBwID09IG51bGwgfHwgUHJvcGVydGllc0hlbHBlci5pc1Byb3BlcnR5KHApOworICAgICAgICAgICAgcmZzLmFkZChuZXcgUGFja2FnZU5hbWVzU2Nhbm5lcihwYWNrYWdlTmFtZXMsIHJlY3Vyc2l2ZSkpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgU3RyaW5nW10gY2xhc3NQYXRoRWxlbWVudHMgPSBwYXJzZVByb3BlcnR5VmFsdWUoU2VydmVyUHJvcGVydGllcy5QUk9WSURFUl9DTEFTU1BBVEgpOworICAgICAgICBpZiAoY2xhc3NQYXRoRWxlbWVudHMgIT0gbnVsbCkgeworICAgICAgICAgICAgcmZzLmFkZChuZXcgRmlsZXNTY2FubmVyKGNsYXNzUGF0aEVsZW1lbnRzLCB0cnVlKSk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBBbm5vdGF0aW9uQWNjZXB0aW5nTGlzdGVuZXIgYWZsID0KKyAgICAgICAgICAgICAgICBBbm5vdGF0aW9uQWNjZXB0aW5nTGlzdGVuZXIubmV3SmF4cnNSZXNvdXJjZUFuZFByb3ZpZGVyTGlzdGVuZXIoX3N0YXRlLmdldENsYXNzTG9hZGVyKCkpOworICAgICAgICBmb3IgKGZpbmFsIFJlc291cmNlRmluZGVyIHJlc291cmNlRmluZGVyIDogcmZzKSB7CisgICAgICAgICAgICB3aGlsZSAocmVzb3VyY2VGaW5kZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5leHQgPSByZXNvdXJjZUZpbmRlci5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKGFmbC5hY2NlcHQobmV4dCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gaW4gPSByZXNvdXJjZUZpbmRlci5vcGVuKCk7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhZmwucHJvY2VzcyhuZXh0LCBpbik7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuV0FSTklORywgTG9jYWxpemF0aW9uTWVzc2FnZXMuUkVTT1VSQ0VfQ09ORklHX1VOQUJMRV9UT19QUk9DRVNTKG5leHQpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5GSU5FUiwgIkVycm9yIGNsb3NpbmcgcmVzb3VyY2Ugc3RyZWFtLiIsIGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdC5hZGRBbGwoYWZsLmdldEFubm90YXRlZENsYXNzZXMoKSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmdbXSBwYXJzZVByb3BlcnR5VmFsdWUoZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSkgeworICAgICAgICBTdHJpbmdbXSBjbGFzc05hbWVzID0gbnVsbDsKKyAgICAgICAgZmluYWwgT2JqZWN0IG8gPSBzdGF0ZS5nZXRQcm9wZXJ0aWVzKCkuZ2V0KHByb3BlcnR5TmFtZSk7CisgICAgICAgIGlmIChvICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChvIGluc3RhbmNlb2YgU3RyaW5nKSB7CisgICAgICAgICAgICAgICAgY2xhc3NOYW1lcyA9IFRva2VuaXplci50b2tlbml6ZSgoU3RyaW5nKSBvKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIFN0cmluZ1tdKSB7CisgICAgICAgICAgICAgICAgY2xhc3NOYW1lcyA9IFRva2VuaXplci50b2tlbml6ZSgoU3RyaW5nW10pIG8pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBjbGFzc05hbWVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBjbGFzc2VzIHdoaWNoIHdlcmUgcmVnaXN0ZXJlZCBieSB0aGUgdXNlciBhbmQgbm90IGZvdW5kIGJ5IGNsYXNzIHBhdGggc2Nhbm5pbmcgKG9yIGFueSBvdGhlciBzY2FubmluZykuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFNldCBvZiBjbGFzc2VzIHJlZ2lzdGVyZWQgYnkgdGhlIHVzZXIuCisgICAgICovCisgICAgU2V0PENsYXNzPD8+PiBnZXRSZWdpc3RlcmVkQ2xhc3NlcygpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRlLmdldENvbXBvbmVudEJhZygpLmdldFJlZ2lzdHJhdGlvbnMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgY29uZmlndXJlZCByZXNvdXJjZSBhbmQvb3IgcHJvdmlkZXIgaW5zdGFuY2VzLiBUaGUgbWV0aG9kIGlzIG92ZXJyaWRkZW4KKyAgICAgKiBpbiBhIHtAbGluayBXcmFwcGluZ1Jlc291cmNlQ29uZmlnIHByaXZhdGUgc3ViLXR5cGV9LgorICAgICAqCisgICAgICogQHJldHVybiBzZXQgb2YgY29uZmlndXJlZCByZXNvdXJjZSBhbmQvb3IgcHJvdmlkZXIgaW5zdGFuY2VzLgorICAgICAqLworICAgIFNldDxPYmplY3Q+IF9nZXRTaW5nbGV0b25zKCkgeworICAgICAgICBmaW5hbCBTZXQ8T2JqZWN0PiByZXN1bHQgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgIHJlc3VsdC5hZGRBbGwoc3RhdGUuZ2V0SW5zdGFuY2VzKCkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmaW5hbCBTZXQ8UmVzb3VyY2U+IGdldFJlc291cmNlcygpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRlLmdldFJlc291cmNlcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCByZXNvdXJjZSBhbmQgcHJvdmlkZXIgY2xhc3MgbG9hZGVyLgorICAgICAqCisgICAgICogQHJldHVybiBjbGFzcyBsb2FkZXIgdG8gYmUgdXNlZCB3aGVuIGxvb2tpbmcgdXAgdGhlIHJlc291cmNlIGNsYXNzZXMgYW5kCisgICAgICogcHJvdmlkZXJzLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcigpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRlLmdldENsYXNzTG9hZGVyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBKQVgtUlMgYXBwbGljYXRpb24gY29ycmVzcG9uZGluZyB3aXRoIHRoaXMgUmVzb3VyY2VDb25maWcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEpBWC1SUyBhcHBsaWNhdGlvbiBjb3JyZXNwb25kaW5nIHdpdGggdGhpcyBSZXNvdXJjZUNvbmZpZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgQXBwbGljYXRpb24gZ2V0QXBwbGljYXRpb24oKSB7CisgICAgICAgIHJldHVybiBfZ2V0QXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbGxvd3Mgb3ZlcnJpZGluZyB0aGUge0BsaW5rICNnZXRBcHBsaWNhdGlvbigpfSBtZXRob2QgZnVuY3Rpb25hbGl0eSBpbiB7QGxpbmsgV3JhcHBpbmdSZXNvdXJjZUNvbmZpZ30uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEpBWC1SUyBhcHBsaWNhdGlvbiBjb3JyZXNwb25kaW5nIHdpdGggdGhpcyBSZXNvdXJjZUNvbmZpZy4KKyAgICAgKi8KKyAgICBBcHBsaWNhdGlvbiBfZ2V0QXBwbGljYXRpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgSmVyc2V5IGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBOYW1lIG9mIHRoZSBhcHBsaWNhdGlvbi4KKyAgICAgKiBAc2VlICNzZXRBcHBsaWNhdGlvbk5hbWUoU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXBwbGljYXRpb25OYW1lKCkgeworICAgICAgICByZXR1cm4gc3RhdGUuZ2V0QXBwbGljYXRpb25OYW1lKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWV0aG9kIHVzZWQgYnkgQXBwbGljYXRpb25IYW5kbGVyIHRvIHJldHJpZXZlIGFwcGxpY2F0aW9uIGNsYXNzCisgICAgICogKHRoaXMgbWV0aG9kIGlzIG92ZXJyaWRkZW4gYnkge0BsaW5rIFdyYXBwaW5nUmVzb3VyY2VDb25maWd9KS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYXBwbGljYXRpb24gY2xhc3MKKyAgICAgKi8KKyAgICBDbGFzczw/IGV4dGVuZHMgQXBwbGljYXRpb24+IGdldEFwcGxpY2F0aW9uQ2xhc3MoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgQXBwbGljYXRpb25IYW5kbGVyIHRvIHNldCBhcHBsaWNhdGlvbiBpbnN0YW5jZSB0byB0aGUgcmVzb3VyY2UgY29uZmlnIChzaG91bGQKKyAgICAgKiBhbHdheXMgYmUgY2FsbGVkIG9uIFdyYXBwaW5nUmVzb3VyY2VDb25maWcgaW5zdGFuY2UsIG5ldmVyIG9uIHBsYWluIGluc3RhbmNlcyBvZiBSZXNvdXJjZUNvbmZpZworICAgICAqIHVubGVzcyB3ZSBoYXZlIGEgYnVnIGluIHRoZSBjb2RlKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcHAgSkFYLVJTIGFwcGxpY2F0aW9uCisgICAgICogQHJldHVybiB0aGlzIFJlc291cmNlQ29uZmlnIGluc3RhbmNlIChmb3IgY29udmVuaWVuY2UpCisgICAgICovCisgICAgZmluYWwgUmVzb3VyY2VDb25maWcgc2V0QXBwbGljYXRpb24oZmluYWwgQXBwbGljYXRpb24gYXBwKSB7CisgICAgICAgIHJldHVybiBfc2V0QXBwbGljYXRpb24oYXBwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbGxvd3Mgb3ZlcnJpZGluZyB0aGUgc2V0QXBwbGljYXRpb24oKSBtZXRob2QgZnVuY3Rpb25hbGl0eSBpbiBXcmFwcGluZ1Jlc291cmNlQ29uZmlnLgorICAgICAqCisgICAgICogQHBhcmFtIGFwcCBhcHBsaWNhdGlvbiB0byBiZSBzZXQgZm9yIHRoaXMgUmVzb3VyY2VDb25maWcKKyAgICAgKiBAcmV0dXJuIHRoaXMgcmVzb3VyY2UgY29uZmlnIGluc3RhbmNlCisgICAgICovCisgICAgUmVzb3VyY2VDb25maWcgX3NldEFwcGxpY2F0aW9uKGZpbmFsIEFwcGxpY2F0aW9uIGFwcCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBXcmFwcGluZ1Jlc291cmNlQ29uZmlnIGV4dGVuZHMgUmVzb3VyY2VDb25maWcgeworCisgICAgICAgIHByaXZhdGUgQXBwbGljYXRpb24gYXBwbGljYXRpb247CisgICAgICAgIHByaXZhdGUgQ2xhc3M8PyBleHRlbmRzIEFwcGxpY2F0aW9uPiBhcHBsaWNhdGlvbkNsYXNzOworICAgICAgICBwcml2YXRlIGZpbmFsIFNldDxDbGFzczw/Pj4gZGVmYXVsdENsYXNzZXMgPSBuZXcgSGFzaFNldDw+KCk7CisKKyAgICAgICAgcHVibGljIFdyYXBwaW5nUmVzb3VyY2VDb25maWcoCisgICAgICAgICAgICAgICAgZmluYWwgQXBwbGljYXRpb24gYXBwbGljYXRpb24sIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBBcHBsaWNhdGlvbj4gYXBwbGljYXRpb25DbGFzcywKKyAgICAgICAgICAgICAgICBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IGRlZmF1bHRDbGFzc2VzKSB7CisKKyAgICAgICAgICAgIGlmIChhcHBsaWNhdGlvbiA9PSBudWxsICYmIGFwcGxpY2F0aW9uQ2xhc3MgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuUkVTT1VSQ0VfQ09ORklHX0VSUk9SX05VTExfQVBQTElDQVRJT05DTEFTUygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMuYXBwbGljYXRpb24gPSBhcHBsaWNhdGlvbjsKKyAgICAgICAgICAgIHRoaXMuYXBwbGljYXRpb25DbGFzcyA9IGFwcGxpY2F0aW9uQ2xhc3M7CisgICAgICAgICAgICBpZiAoZGVmYXVsdENsYXNzZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdENsYXNzZXMuYWRkQWxsKGRlZmF1bHRDbGFzc2VzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lcmdlQXBwbGljYXRpb25zKGFwcGxpY2F0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIHtAbGluayBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uIEpBWC1SUyBBcHBsaWNhdGlvbiBpbnN0YW5jZX0KKyAgICAgICAgICogaW4gdGhlIHtAY29kZSBSZXNvdXJjZUNvbmZpZ30uCisgICAgICAgICAqIDxwLz4KKyAgICAgICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCBieSB0aGUge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXJ9IGluIGNhc2UgdGhpcyByZXNvdXJjZQorICAgICAgICAgKiBjb25maWd1cmF0aW9uIGluc3RhbmNlIHdhcyBjcmVhdGVkIHdpdGggYXBwbGljYXRpb24gY2xhc3MgcmF0aGVyIHRoYW4gYXBwbGljYXRpb24gaW5zdGFuY2UuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhcHBsaWNhdGlvbiBKQVgtUlMgQXBwbGljYXRpb24gaW5zdGFuY2UuCisgICAgICAgICAqIEByZXR1cm4gdXBkYXRlZCByZXNvdXJjZSBjb25maWd1cmF0aW9uIGluc3RhbmNlLgorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIFJlc291cmNlQ29uZmlnIF9zZXRBcHBsaWNhdGlvbihmaW5hbCBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbikgeworICAgICAgICAgICAgdGhpcy5hcHBsaWNhdGlvbiA9IGFwcGxpY2F0aW9uOworICAgICAgICAgICAgdGhpcy5hcHBsaWNhdGlvbkNsYXNzID0gbnVsbDsKKyAgICAgICAgICAgIG1lcmdlQXBwbGljYXRpb25zKGFwcGxpY2F0aW9uKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgb3JpZ2luYWwgdW5kZXJseWluZyBKQVgtUlMge0BsaW5rIEFwcGxpY2F0aW9ufSBpbnN0YW5jZSB1c2VkIHRvCisgICAgICAgICAqIGluaXRpYWxpemUgdGhlIHJlc291cmNlIGNvbmZpZ3VyYXRpb24gaW5zdGFuY2UuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gSkFYLVJTIGFwcGxpY2F0aW9uIGluc3RhbmNlLgorICAgICAgICAgKi8KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIEFwcGxpY2F0aW9uIF9nZXRBcHBsaWNhdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBhcHBsaWNhdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIG9yaWdpbmFsIEpBWC1SUyB7QGxpbmsgQXBwbGljYXRpb259IGNsYXNzIHByb3ZpZGVkIGl0IHdhcyBub3QKKyAgICAgICAgICogaW5zdGFudGlhdGVkIHlldC4gQSB7QGNvZGUgbnVsbH0gaXMgcmV0dXJuZWQgaW4gY2FzZSB0aGUgY2xhc3MgaGFzIGJlZW4KKyAgICAgICAgICogaW5zdGFudGlhdGVkIGFscmVhZHkgb3Igd2FzIG5vdCBjb25maWd1cmVkIGF0IGFsbC4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoaXMgY2xhc3Mgd2lsbCBiZSB1c2VkIHRvIGluaXRpYWxpemUgdGhlIHJlc291cmNlIGNvbmZpZ3VyYXRpb24gaW5zdGFuY2UuCisgICAgICAgICAqIElmIHRoZXJlIGlzIG5vIEpBWC1SUyBhcHBsaWNhdGlvbiBjbGFzcyBzZXQsIG9yIGlmIHRoZSBjbGFzcyBoYXMgYmVlbgorICAgICAgICAgKiBpbnN0YW50aWF0ZWQgYWxyZWFkeSwgdGhlIG1ldGhvZCB3aWxsIHJldHVybiB7QGNvZGUgbnVsbH0uCisgICAgICAgICAqIDwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBvcmlnaW5hbCBKQVgtUlMgYXBwbGljYXRpb24gY2xhc3Mgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZXJlIGlzIG5vCisgICAgICAgICAqIHN1Y2ggY2xhc3MgY29uZmlndXJlZCBvciBpZiB0aGUgY2xhc3MgaGFzIGJlZW4gYWxyZWFkeSBpbnN0YW50aWF0ZWQuCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgQ2xhc3M8PyBleHRlbmRzIEFwcGxpY2F0aW9uPiBnZXRBcHBsaWNhdGlvbkNsYXNzKCkgeworICAgICAgICAgICAgcmV0dXJuIGFwcGxpY2F0aW9uQ2xhc3M7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogTWVyZ2VzIGZpZWxkcyAoZS5nLiBjdXN0b20gYmluZGVycywgcHJvcGVydGllcykgb2YgdGhlIGdpdmVuIGFwcGxpY2F0aW9uIHdpdGggdGhpcyBhcHBsaWNhdGlvbi4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoZSBtZXJnaW5nIHNob3VsZCBiZSBkb25lIGJlY2F1c2Ugb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHJlbG9hZGluZyB0aGlzIHtAY29kZSBSZXNvdXJjZUNvbmZpZ30gaW4gYSBjb250YWluZXIKKyAgICAgICAgICogc28gdGhpcyByZXNvdXJjZSBjb25maWcgc2hvdWxkIGtub3cgYWJvdXQgY3VzdG9tIGJpbmRlcnMgYW5kIHByb3BlcnRpZXMgb2YgdGhlIHVuZGVybHlpbmcgYXBwbGljYXRpb24gdG8gZW5zdXJlCisgICAgICAgICAqIHRoZSByZWxvYWQgcHJvY2VzcyB3aWxsIGNvbXBsZXRlIHN1Y2Nlc3NmdWxseS4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYXBwbGljYXRpb24gdGhlIGFwcGxpY2F0aW9uIHdoaWNoIGZpZWxkcyBzaG91bGQgYmUgbWVyZ2VkIHdpdGggdGhpcyBhcHBsaWNhdGlvbi4KKyAgICAgICAgICogQHNlZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbnRhaW5lciNyZWxvYWQoKQorICAgICAgICAgKiBAc2VlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29udGFpbmVyI3JlbG9hZChSZXNvdXJjZUNvbmZpZykKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCBtZXJnZUFwcGxpY2F0aW9ucyhmaW5hbCBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbikgeworICAgICAgICAgICAgaWYgKGFwcGxpY2F0aW9uIGluc3RhbmNlb2YgUmVzb3VyY2VDb25maWcpIHsKKyAgICAgICAgICAgICAgICAvLyBNZXJnZSBjdXN0b20gYmluZGVycy4KKyAgICAgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByYyA9IChSZXNvdXJjZUNvbmZpZykgYXBwbGljYXRpb247CisKKyAgICAgICAgICAgICAgICAvLyBNZXJnZSByZXNvdXJjZXMKKyAgICAgICAgICAgICAgICBzdXBlci5yZWdpc3RlclJlc291cmNlcyhyYy5nZXRSZXNvdXJjZXMoKSk7CisKKyAgICAgICAgICAgICAgICAvLyBwcm9wZXJ0aWVzIHNldCBvbiB0aGUgd3JhcHBpbmcgcmVzb3VyY2UgY29uZmlnIHRha2UgcHJlY2VkZW5jZQorICAgICAgICAgICAgICAgIC8vIChhcyB0aG9zZSBhcmUgcmV0cmlldmVkIGZyb20gdGhlIHdlYi54bWwsIGZvciBleGFtcGxlKQorICAgICAgICAgICAgICAgIHJjLmludmFsaWRhdGVDYWNoZSgpOworICAgICAgICAgICAgICAgIHJjLmFkZFByb3BlcnRpZXMoc3VwZXIuZ2V0UHJvcGVydGllcygpKTsKKyAgICAgICAgICAgICAgICBzdXBlci5hZGRQcm9wZXJ0aWVzKHJjLmdldFByb3BlcnRpZXMoKSk7CisgICAgICAgICAgICAgICAgc3VwZXIuc2V0QXBwbGljYXRpb25OYW1lKHJjLmdldEFwcGxpY2F0aW9uTmFtZSgpKTsKKyAgICAgICAgICAgICAgICBzdXBlci5zZXRDbGFzc0xvYWRlcihyYy5nZXRDbGFzc0xvYWRlcigpKTsKKworICAgICAgICAgICAgICAgIHJjLmxvY2soKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYXBwbGljYXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHN1cGVyLmFkZFByb3BlcnRpZXMoYXBwbGljYXRpb24uZ2V0UHJvcGVydGllcygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBTZXQ8Q2xhc3M8Pz4+IF9nZXRDbGFzc2VzKCkgeworICAgICAgICAgICAgZmluYWwgU2V0PENsYXNzPD8+PiByZXN1bHQgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgICAgICBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IGFwcGxpY2F0aW9uQ2xhc3NlcyA9IGFwcGxpY2F0aW9uLmdldENsYXNzZXMoKTsKKyAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwoYXBwbGljYXRpb25DbGFzc2VzID09IG51bGwgPyBuZXcgSGFzaFNldDxDbGFzczw/Pj4oKSA6IGFwcGxpY2F0aW9uQ2xhc3Nlcyk7CisgICAgICAgICAgICBpZiAocmVzdWx0LmlzRW1wdHkoKSAmJiBnZXRTaW5nbGV0b25zKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbChkZWZhdWx0Q2xhc3Nlcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGlmIHRoZSBhcHBsaWNhdGlvbiBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgUmVzb3VyY2VDb25maWcsIGhhbmRsZSBzY2FubmluZyB0cmlnZ2VyZWQgdmlhIHByb3BlcnRpZXMKKyAgICAgICAgICAgIGlmICghKGFwcGxpY2F0aW9uIGluc3RhbmNlb2YgUmVzb3VyY2VDb25maWcpKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbChzdXBlci5fZ2V0Q2xhc3NlcygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgU2V0PE9iamVjdD4gX2dldFNpbmdsZXRvbnMoKSB7CisgICAgICAgICAgICByZXR1cm4gYXBwbGljYXRpb24uZ2V0U2luZ2xldG9ucygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIHJ1bnRpbWUgY29uZmlndXJhdGlvbiBpbml0aWFsaXplZCBmcm9tIGEgZ2l2ZW4gZGVwbG95LXRpbWUgSkFYLVJTL0plcnNleQorICAgICAqIGFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXBwbGljYXRpb24gZGVwbG95LXRpbWUgSkFYLVJTL0plcnNleSBhcHBsaWNhdGlvbiBjb25maWd1cmF0aW9uLgorICAgICAqIEByZXR1cm4gaW5pdGlhbGl6ZWQgcnVuLXRpbWUgcmVzb3VyY2UgY29uZmlnLgorICAgICAqLworICAgIHN0YXRpYyBSZXNvdXJjZUNvbmZpZyBjcmVhdGVSdW50aW1lQ29uZmlnKGZpbmFsIEFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uKSB7CisgICAgICAgIHJldHVybiAoYXBwbGljYXRpb24gaW5zdGFuY2VvZiBSZXNvdXJjZUNvbmZpZykKKyAgICAgICAgICAgICAgICA/IG5ldyBSdW50aW1lQ29uZmlnKChSZXNvdXJjZUNvbmZpZykgYXBwbGljYXRpb24pIDogbmV3IFJ1bnRpbWVDb25maWcoYXBwbGljYXRpb24pOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJ1bnRpbWVDb25maWcgZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IG9yaWdpbmFsUmVnaXN0cmF0aW9uczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbjsKKworICAgICAgICBwcml2YXRlIFJ1bnRpbWVDb25maWcoZmluYWwgUmVzb3VyY2VDb25maWcgb3JpZ2luYWwpIHsKKyAgICAgICAgICAgIHN1cGVyKG9yaWdpbmFsKTsKKworICAgICAgICAgICAgdGhpcy5hcHBsaWNhdGlvbiA9IG9yaWdpbmFsOworCisgICAgICAgICAgICBmaW5hbCBBcHBsaWNhdGlvbiBjdXN0b21Sb290QXBwID0gUmVzb3VyY2VDb25maWcudW53cmFwQ3VzdG9tUm9vdEFwcGxpY2F0aW9uKG9yaWdpbmFsKTsKKyAgICAgICAgICAgIGlmIChjdXN0b21Sb290QXBwICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZWdpc3RlckNvbXBvbmVudHNPZihjdXN0b21Sb290QXBwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb3JpZ2luYWxSZWdpc3RyYXRpb25zID0gQ29sbGVjdGlvbnMubmV3U2V0RnJvbU1hcChuZXcgSWRlbnRpdHlIYXNoTWFwPD4oKSk7CisgICAgICAgICAgICBvcmlnaW5hbFJlZ2lzdHJhdGlvbnMuYWRkQWxsKHN1cGVyLmdldFJlZ2lzdGVyZWRDbGFzc2VzKCkpOworCisgICAgICAgICAgICAvLyBSZWdpc3RlciBleHRlcm5hbGx5IHByb3ZpZGVkIGluc3RhbmNlcy4KKyAgICAgICAgICAgIGZpbmFsIFNldDxPYmplY3Q+IGV4dGVybmFsSW5zdGFuY2VzID0KKyAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWwuZ2V0U2luZ2xldG9ucygpLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihleHRlcm5hbCAtPiAhb3JpZ2luYWxSZWdpc3RyYXRpb25zLmNvbnRhaW5zKGV4dGVybmFsLmdldENsYXNzKCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSk7CisKKyAgICAgICAgICAgIHJlZ2lzdGVySW5zdGFuY2VzKGV4dGVybmFsSW5zdGFuY2VzKTsKKworICAgICAgICAgICAgLy8gUmVnaXN0ZXIgZXh0ZXJuYWxseSBwcm92aWRlZCBjbGFzc2VzLgorICAgICAgICAgICAgZmluYWwgU2V0PENsYXNzPD8+PiBleHRlcm5hbENsYXNzZXMgPSBvcmlnaW5hbC5nZXRDbGFzc2VzKCkuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGV4dGVybmFsIC0+ICFvcmlnaW5hbFJlZ2lzdHJhdGlvbnMuY29udGFpbnMoZXh0ZXJuYWwpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSk7CisgICAgICAgICAgICByZWdpc3RlckNsYXNzZXMoZXh0ZXJuYWxDbGFzc2VzKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCByZWdpc3RlckNvbXBvbmVudHNPZihmaW5hbCBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbikgeworICAgICAgICAgICAgRXJyb3JzLnByb2Nlc3NXaXRoRXhjZXB0aW9uKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZpcnN0IHJlZ2lzdGVyIGluc3RhbmNlcyB0aGF0IHNob3VsZCB0YWtlIHByZWNlZGVuY2Ugb3ZlciBjbGFzc2VzCisgICAgICAgICAgICAgICAgICAgIC8vIGluIGNhc2Ugb2YgZHVwbGljYXRlIHJlZ2lzdHJhdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU2V0PE9iamVjdD4gc2luZ2xldG9ucyA9IGFwcGxpY2F0aW9uLmdldFNpbmdsZXRvbnMoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNpbmdsZXRvbnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJJbnN0YW5jZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbmdsZXRvbnMuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoaW5wdXQgLT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9ycy53YXJuaW5nKGFwcGxpY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGl6YXRpb25NZXNzYWdlcy5OT05fSU5TVEFOVElBQkxFX0NPTVBPTkVOVChudWxsKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dCAhPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU2V0PENsYXNzPD8+PiBjbGFzc2VzID0gYXBwbGljYXRpb24uZ2V0Q2xhc3NlcygpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2xhc3NlcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlckNsYXNzZXMoY2xhc3Nlcy5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGlucHV0IC0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JzLndhcm5pbmcoYXBwbGljYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxpemF0aW9uTWVzc2FnZXMuTk9OX0lOU1RBTlRJQUJMRV9DT01QT05FTlQobnVsbCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0ICE9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFJ1bnRpbWVDb25maWcoZmluYWwgQXBwbGljYXRpb24gYXBwbGljYXRpb24pIHsKKyAgICAgICAgICAgIHN1cGVyKCk7CisKKyAgICAgICAgICAgIHRoaXMuYXBwbGljYXRpb24gPSBhcHBsaWNhdGlvbjsKKworICAgICAgICAgICAgaWYgKGFwcGxpY2F0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZWdpc3RlckNvbXBvbmVudHNPZihhcHBsaWNhdGlvbik7CisKKyAgICAgICAgICAgICAgICAvLyBDb3B5IGFsbCBhdmFpbGFibGUgcHJvcGVydGllcy4KKyAgICAgICAgICAgICAgICBhZGRQcm9wZXJ0aWVzKGFwcGxpY2F0aW9uLmdldFByb3BlcnRpZXMoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG9yaWdpbmFsUmVnaXN0cmF0aW9ucyA9IHN1cGVyLmdldFJlZ2lzdGVyZWRDbGFzc2VzKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgU2V0PENsYXNzPD8+PiBfZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgICAgIC8vIEdldCBvbmx5IGEgcmVhZC1vbmx5IGNsYXNzZXMgY2FjaGVkIGluIGludGVybmFsIHN0YXRlLgorICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnN0YXRlLmdldENsYXNzZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBTZXQ8T2JqZWN0PiBfZ2V0U2luZ2xldG9ucygpIHsKKyAgICAgICAgICAgIC8vIEdldCBvbmx5IGEgcmVhZC1vbmx5IGNsYXNzZXMgY2FjaGVkIGluIGludGVybmFsIHN0YXRlLgorICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnN0YXRlLmdldEluc3RhbmNlcygpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIFNldDxDbGFzczw/Pj4gZ2V0UmVnaXN0ZXJlZENsYXNzZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxSZWdpc3RyYXRpb25zOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIEFwcGxpY2F0aW9uIF9nZXRBcHBsaWNhdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBhcHBsaWNhdGlvbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEFwcGxpY2F0aW9uIHVud3JhcEN1c3RvbVJvb3RBcHBsaWNhdGlvbihSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZykgeworICAgICAgICBBcHBsaWNhdGlvbiBhcHAgPSBudWxsOworICAgICAgICB3aGlsZSAocmVzb3VyY2VDb25maWcgIT0gbnVsbCkgeworICAgICAgICAgICAgYXBwID0gcmVzb3VyY2VDb25maWcuZ2V0QXBwbGljYXRpb24oKTsKKyAgICAgICAgICAgIGlmIChhcHAgPT0gcmVzb3VyY2VDb25maWcpIHsKKyAgICAgICAgICAgICAgICAvLyByZXNvdXJjZSBjb25maWcgaXMgdGhlIHJvb3QgYXBwbGljYXRpb24gLSByZXR1cm4gbnVsbAorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfSBlbHNlIGlmIChhcHAgaW5zdGFuY2VvZiBSZXNvdXJjZUNvbmZpZykgeworICAgICAgICAgICAgICAgIHJlc291cmNlQ29uZmlnID0gKFJlc291cmNlQ29uZmlnKSBhcHA7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBhcHA7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBtb3N0IGludGVybmFsIHdyYXBwZWQge0BsaW5rIEFwcGxpY2F0aW9uIGFwcGxpY2F0aW9ufSBjbGFzcy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBzaW1pbGFyIHRvIHtAbGluayBSZXNvdXJjZUNvbmZpZyNnZXRBcHBsaWNhdGlvbigpfSBleGNlcHQgaWYgcHJvdmlkZWQgYXBwbGljYXRpb24gd2FzCisgICAgICogY3JlYXRlZCBieSB3cmFwcGluZyBtdWx0aXBsZSB7QGNvZGUgUmVzb3VyY2VDb25maWd9IGluc3RhbmNlcywgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIG9yaWdpbmFsIChpbm5lci1tb3N0KQorICAgICAqIEpBWC1SUyB7QGNvZGUgQXBwbGljYXRpb259IHN1Yi1jbGFzcyByYXRoZXIgdGhhbiBhIHBvdGVudGlhbGx5IGludGVybWVkaWF0ZSB7QGNvZGUgUmVzb3VyY2VDb25maWd9IHdyYXBwZXIuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uIHRoYXQgaXMgcG90ZW50aWFsbHkgd3JhcHBlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBvcmlnaW5hbCwgaW5uZXItbW9zdCB7QGxpbmsgQXBwbGljYXRpb259IHN1YmNsYXNzLiBNYXkgcmV0dXJuIHRoZSBzYW1lIGluc3RhbmNlIGRpcmVjdGx5LAorICAgICAqIGluIGNhc2UgdGhlIHN1cHBsaWVkIHtAY29kZSBhcHBsaWNhdGlvbn0gaW5zdGFuY2UgaXMgbm90IGEgd3JhcHBlciB7QGNvZGUgUmVzb3VyY2VDb25maWd9IGluc3RhbmNlLgorICAgICAqLworICAgIHN0YXRpYyBBcHBsaWNhdGlvbiB1bndyYXBBcHBsaWNhdGlvbihBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbikgeworICAgICAgICB3aGlsZSAoYXBwbGljYXRpb24gaW5zdGFuY2VvZiBSZXNvdXJjZUNvbmZpZykgeworICAgICAgICAgICAgZmluYWwgQXBwbGljYXRpb24gd3JhcHBlZEFwcGxpY2F0aW9uID0gKChSZXNvdXJjZUNvbmZpZykgYXBwbGljYXRpb24pLmdldEFwcGxpY2F0aW9uKCk7CisgICAgICAgICAgICBpZiAod3JhcHBlZEFwcGxpY2F0aW9uID09IGFwcGxpY2F0aW9uKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhcHBsaWNhdGlvbiA9IHdyYXBwZWRBcHBsaWNhdGlvbjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYXBwbGljYXRpb247CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNldHVwQXBwbGljYXRpb25OYW1lKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgYXBwTmFtZSA9IFNlcnZlclByb3BlcnRpZXMuZ2V0VmFsdWUoZ2V0UHJvcGVydGllcygpLCBTZXJ2ZXJQcm9wZXJ0aWVzLkFQUExJQ0FUSU9OX05BTUUsIG51bGwsIFN0cmluZy5jbGFzcyk7CisgICAgICAgIGlmIChhcHBOYW1lICE9IG51bGwgJiYgZ2V0QXBwbGljYXRpb25OYW1lKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgc2V0QXBwbGljYXRpb25OYW1lKGFwcE5hbWUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvUmVzb3VyY2VGaW5kZXIuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL1Jlc291cmNlRmluZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJiZjcwMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL1Jlc291cmNlRmluZGVyLmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworLyoqCisgKiBBbiBpbnRlcmZhY2UgdXNlZCBmb3IgZmluZGluZyBhbmQgb3BlbmluZyAobG9hZGluZykgbmV3IHJlc291cmNlcy4KKyAqIDxwLz4KKyAqIHtAbGluayBSZXNvdXJjZUNvbmZpZ30gd2lsbCB1c2UgYWxsIHJlZ2lzdGVyZWQgZmluZGVycyB0byBvYnRhaW4gY2xhc3NlcworICogdG8gYmUgdXNlZCBhcyByZXNvdXJjZSBjbGFzc2VzIGFuZC9vciBwcm92aWRlcnMuIE1ldGhvZCB7QGxpbmsgI29wZW4oKX0gZG9lc24ndAorICogbmVlZCB0byBiZSBjYWxsZWQgb24gYWxsIHJldHVybmVkIHJlc291cmNlIG5hbWVzLCB7QGxpbmsgUmVzb3VyY2VDb25maWd9IGNhbiBpZ25vcmUKKyAqIHNvbWUgb2YgdGhlbS4KKyAqIDxwLz4KKyAqIEN1cnJlbnRseSwgYWxsIHJlc291cmNlIG5hbWVzIGVuZGluZyB3aXRoICIuY2xhc3MiIHdpbGwgYmUgYWNjZXB0ZWQgYW5kIHByb2Nlc3NlZCAob3BlbmVkKS4KKyAqIDxwLz4KKyAqIEV4dGVuZHMge0BsaW5rIEF1dG9DbG9zZWFibGV9IHNpbmNlIHZlcnNpb24gMi4xOS4gVGhlIHtAbGluayAjY2xvc2UoKX0gbWV0aG9kIGlzIHVzZWQgdG8gcmVsZWFzZQorICogYWxsb2NhdGVkL29wZW5lZCByZXNvdXJjZXMgKHN1Y2ggYXMgc3RyZWFtcykuIFdoZW4gYSByZXNvdXJjZSBmaW5kZXIgaXMgY2xvc2VkIG5vIG90aGVyIG1ldGhvZCBzaG91bGQgYmUKKyAqIGludm9rZWQgb24gaXQuCisgKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGludGVyZmFjZSBSZXNvdXJjZUZpbmRlciBleHRlbmRzIEl0ZXJhdG9yPFN0cmluZz4sIEF1dG9DbG9zZWFibGUgeworCisgICAgLyoqCisgICAgICogT3BlbiBjdXJyZW50IHJlc291cmNlLgorICAgICAqCisgICAgICogQHJldHVybiBpbnB1dCBzdHJlYW0gZnJvbSB3aGljaCBjdXJyZW50IHJlc291cmNlIGNhbiBiZSBsb2FkZWQuCisgICAgICovCisgICAgcHVibGljIElucHV0U3RyZWFtIG9wZW4oKTsKKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKiA8cC8+CisgICAgICogUmVsZWFzZSBhbGxvY2F0ZWQvb3BlbmVkIHJlc291cmNlcyAoc3VjaCBhcyBzdHJlYW1zKS4gV2hlbiB0aGUgcmVzb3VyY2UgZmluZGVyIGlzIGNsb3NlZAorICAgICAqIG5vIG90aGVyIG1ldGhvZCBzaG91bGQgYmUgaW52b2tlZCBvbiBpdC4KKyAgICAgKgorICAgICAqIEBzaW5jZSAyLjE5CisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2UoKTsKKworICAgIC8qKgorICAgICAqIFJlc2V0IHRoZSB7QGxpbmsgUmVzb3VyY2VGaW5kZXJ9IGluc3RhbmNlLgorICAgICAqIDxwLz4KKyAgICAgKiBVcG9uIGNhbGxpbmcgdGhpcyBtZXRob2QgdGhlIGltcGxlbWVudGluZyBjbGFzcyBNVVNUIHJlc2V0IGl0cyBpbnRlcm5hbCBzdGF0ZSB0byB0aGUgaW5pdGlhbCBzdGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldCgpOworCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqIDxwLz4KKyAgICAgKiBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHtAbGluayBSZXNvdXJjZUZpbmRlcn0gJiB0aHJvd3Mge0BsaW5rIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufQorICAgICAqIHdoZW4gaW52b2tlZC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZW1vdmUoKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL1Jlc291cmNlTW9kZWxDb25maWd1cmF0b3IuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL1Jlc291cmNlTW9kZWxDb25maWd1cmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmQyY2M4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvUmVzb3VyY2VNb2RlbENvbmZpZ3VyYXRvci5qYXZhCkBAIC0wLDAgKzEsMjAwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlcjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkJpUHJlZGljYXRlOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5SdW50aW1lVHlwZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkJvb3RzdHJhcEJhZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Cb290c3RyYXBDb25maWd1cmF0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LlByb3ZpZGVyQmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5Qcm92aWRlcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW9kZWwuQ29udHJhY3RQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb2RlbC5pbnRlcm5hbC5Db21wb25lbnRCYWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLkplcnNleVJlc291cmNlQ29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLk1vZGVsUHJvY2Vzc29yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNb2RlbDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbXBvbmVudFByb3ZpZGVyOworCisvKioKKyAqIENvbmZpZ3VyYXRvciB3aGljaCBiaW5kcyBwcm92aWRlcnMgYW5kIHJlc291cmNlcyBpbnRvIHtAbGluayBJbmplY3Rpb25NYW5hZ2VyfS4KKyAqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworcHVibGljIGNsYXNzIFJlc291cmNlTW9kZWxDb25maWd1cmF0b3IgaW1wbGVtZW50cyBCb290c3RyYXBDb25maWd1cmF0b3IgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoUmVzb3VyY2VNb2RlbENvbmZpZ3VyYXRvci5jbGFzcy5nZXROYW1lKCkpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaW5pdChJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIsIEJvb3RzdHJhcEJhZyBib290c3RyYXBCYWcpIHsKKyAgICAgICAgU2VydmVyQm9vdHN0cmFwQmFnIHNlcnZlckJhZyA9IChTZXJ2ZXJCb290c3RyYXBCYWcpIGJvb3RzdHJhcEJhZzsKKyAgICAgICAgQ29sbGVjdGlvbjxNb2RlbFByb2Nlc3Nvcj4gbW9kZWxQcm9jZXNzb3JzID0gc2VydmVyQmFnLmdldE1vZGVsUHJvY2Vzc29ycygpOworICAgICAgICBSZXNvdXJjZUNvbmZpZyBydW50aW1lQ29uZmlnID0gc2VydmVyQmFnLmdldFJ1bnRpbWVDb25maWcoKTsKKyAgICAgICAgUmVzb3VyY2VCYWcgcmVzb3VyY2VCYWcgPSBzZXJ2ZXJCYWcuZ2V0UmVzb3VyY2VCYWcoKTsKKyAgICAgICAgQ29tcG9uZW50QmFnIGNvbXBvbmVudEJhZyA9IHJ1bnRpbWVDb25maWcuZ2V0Q29tcG9uZW50QmFnKCk7CisKKyAgICAgICAgLy8gQWRkcyBhbGwgcHJvdmlkZXJzIGZyb20gcmVzb3VyY2UgY29uZmlnIHRvIEluamVjdGlvbk1hbmFnZXIgLT4gQm9vdHN0cmFwQ29uZmlndXJhdG9ycyBhcmUgYWJsZSB0byB3b3JrIHdpdGggdGhlc2UKKyAgICAgICAgLy8gc2VydmljZXMgYW5kIGdldCB0aGVtLgorICAgICAgICBiaW5kUHJvdmlkZXJzQW5kUmVzb3VyY2VzKAorICAgICAgICAgICAgICAgIGluamVjdGlvbk1hbmFnZXIsIHNlcnZlckJhZywgY29tcG9uZW50QmFnLCByZXNvdXJjZUJhZy5jbGFzc2VzLCByZXNvdXJjZUJhZy5pbnN0YW5jZXMsIHJ1bnRpbWVDb25maWcpOworCisgICAgICAgIFJlc291cmNlTW9kZWwgcmVzb3VyY2VNb2RlbCA9IG5ldyBSZXNvdXJjZU1vZGVsLkJ1aWxkZXIocmVzb3VyY2VCYWcuZ2V0Um9vdFJlc291cmNlcygpLCBmYWxzZSkuYnVpbGQoKTsKKyAgICAgICAgcmVzb3VyY2VNb2RlbCA9IHByb2Nlc3NSZXNvdXJjZU1vZGVsKG1vZGVsUHJvY2Vzc29ycywgcmVzb3VyY2VNb2RlbCwgcnVudGltZUNvbmZpZyk7CisKKyAgICAgICAgYmluZEVuaGFuY2luZ1Jlc291cmNlQ2xhc3NlcyhpbmplY3Rpb25NYW5hZ2VyLCBzZXJ2ZXJCYWcsIHJlc291cmNlTW9kZWwsIHJlc291cmNlQmFnLCBydW50aW1lQ29uZmlnKTsKKyAgICAgICAgc2VydmVyQmFnLnNldFJlc291cmNlTW9kZWwocmVzb3VyY2VNb2RlbCk7CisKKyAgICAgICAgLy8gQWRkIG5ld2x5IGNyZWF0ZWQgcmVzb3VyY2UgbW9kZWwgaW4gUmVzb3VyY2VDb250ZXh0LgorICAgICAgICBzZXJ2ZXJCYWcuZ2V0UmVzb3VyY2VDb250ZXh0KCkuc2V0UmVzb3VyY2VNb2RlbChyZXNvdXJjZU1vZGVsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlc291cmNlTW9kZWwgcHJvY2Vzc1Jlc291cmNlTW9kZWwoQ29sbGVjdGlvbjxNb2RlbFByb2Nlc3Nvcj4gbW9kZWxQcm9jZXNzb3JzLCBSZXNvdXJjZU1vZGVsIHJlc291cmNlTW9kZWwsCisgICAgICAgICAgICBSZXNvdXJjZUNvbmZpZyBydW50aW1lQ29uZmlnKSB7CisgICAgICAgIGZvciAoZmluYWwgTW9kZWxQcm9jZXNzb3IgbW9kZWxQcm9jZXNzb3IgOiBtb2RlbFByb2Nlc3NvcnMpIHsKKyAgICAgICAgICAgIHJlc291cmNlTW9kZWwgPSBtb2RlbFByb2Nlc3Nvci5wcm9jZXNzUmVzb3VyY2VNb2RlbChyZXNvdXJjZU1vZGVsLCBydW50aW1lQ29uZmlnKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzb3VyY2VNb2RlbDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYmluZEVuaGFuY2luZ1Jlc291cmNlQ2xhc3NlcygKKyAgICAgICAgICAgIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciwKKyAgICAgICAgICAgIFNlcnZlckJvb3RzdHJhcEJhZyBib290c3RyYXBCYWcsCisgICAgICAgICAgICBSZXNvdXJjZU1vZGVsIHJlc291cmNlTW9kZWwsCisgICAgICAgICAgICBSZXNvdXJjZUJhZyByZXNvdXJjZUJhZywKKyAgICAgICAgICAgIFJlc291cmNlQ29uZmlnIHJ1bnRpbWVDb25maWcpIHsKKyAgICAgICAgU2V0PENsYXNzPD8+PiBuZXdDbGFzc2VzID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICBTZXQ8T2JqZWN0PiBuZXdJbnN0YW5jZXMgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgIGZvciAoZmluYWwgUmVzb3VyY2UgcmVzIDogcmVzb3VyY2VNb2RlbC5nZXRSb290UmVzb3VyY2VzKCkpIHsKKyAgICAgICAgICAgIG5ld0NsYXNzZXMuYWRkQWxsKHJlcy5nZXRIYW5kbGVyQ2xhc3NlcygpKTsKKyAgICAgICAgICAgIG5ld0luc3RhbmNlcy5hZGRBbGwocmVzLmdldEhhbmRsZXJJbnN0YW5jZXMoKSk7CisgICAgICAgIH0KKyAgICAgICAgbmV3Q2xhc3Nlcy5yZW1vdmVBbGwocmVzb3VyY2VCYWcuY2xhc3Nlcyk7CisgICAgICAgIG5ld0luc3RhbmNlcy5yZW1vdmVBbGwocmVzb3VyY2VCYWcuaW5zdGFuY2VzKTsKKworICAgICAgICBDb21wb25lbnRCYWcgZW1wdHlDb21wb25lbnRCYWcgPSBDb21wb25lbnRCYWcubmV3SW5zdGFuY2UoaW5wdXQgLT4gZmFsc2UpOworICAgICAgICBiaW5kUHJvdmlkZXJzQW5kUmVzb3VyY2VzKGluamVjdGlvbk1hbmFnZXIsIGJvb3RzdHJhcEJhZywgZW1wdHlDb21wb25lbnRCYWcsIG5ld0NsYXNzZXMsIG5ld0luc3RhbmNlcywgcnVudGltZUNvbmZpZyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGJpbmRQcm92aWRlcnNBbmRSZXNvdXJjZXMoCisgICAgICAgICAgICBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIsCisgICAgICAgICAgICBTZXJ2ZXJCb290c3RyYXBCYWcgYm9vdHN0cmFwQmFnLAorICAgICAgICAgICAgQ29tcG9uZW50QmFnIGNvbXBvbmVudEJhZywKKyAgICAgICAgICAgIENvbGxlY3Rpb248Q2xhc3M8Pz4+IHJlc291cmNlQ2xhc3NlcywKKyAgICAgICAgICAgIENvbGxlY3Rpb248T2JqZWN0PiByZXNvdXJjZUluc3RhbmNlcywKKyAgICAgICAgICAgIFJlc291cmNlQ29uZmlnIHJ1bnRpbWVDb25maWcpIHsKKworICAgICAgICBDb2xsZWN0aW9uPENvbXBvbmVudFByb3ZpZGVyPiBjb21wb25lbnRQcm92aWRlcnMgPSBib290c3RyYXBCYWcuZ2V0Q29tcG9uZW50UHJvdmlkZXJzKCkuZ2V0KCk7CisgICAgICAgIEplcnNleVJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHQgPSBib290c3RyYXBCYWcuZ2V0UmVzb3VyY2VDb250ZXh0KCk7CisKKyAgICAgICAgU2V0PENsYXNzPD8+PiByZWdpc3RlcmVkQ2xhc3NlcyA9IHJ1bnRpbWVDb25maWcuZ2V0UmVnaXN0ZXJlZENsYXNzZXMoKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBDaGVjayB0aGUge0Bjb2RlIGNvbXBvbmVudH0gd2hldGhlciBpdCBpcyBjb3JyZWN0bHkgY29uZmlndXJlZCBmb3IgY2xpZW50IG9yIHNlcnZlciB7QGxpbmsgUnVudGltZVR5cGUgcnVudGltZX0uCisgICAgICAgICAqLworICAgICAgICBqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlPENsYXNzPD8+PiBjb3JyZWN0bHlDb25maWd1cmVkID0KKyAgICAgICAgICAgICAgICBjb21wb25lbnRDbGFzcyAtPiBQcm92aWRlcnMuY2hlY2tQcm92aWRlclJ1bnRpbWUoY29tcG9uZW50Q2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRCYWcuZ2V0TW9kZWwoY29tcG9uZW50Q2xhc3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgUnVudGltZVR5cGUuU0VSVkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgIXJlZ2lzdGVyZWRDbGFzc2VzLmNvbnRhaW5zKGNvbXBvbmVudENsYXNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlQ2xhc3Nlcy5jb250YWlucyhjb21wb25lbnRDbGFzcykpOworCisgICAgICAgIC8qCisgICAgICAgICAqIENoZWNrIHRoZSB7QGNvZGUgcmVzb3VyY2UgY2xhc3N9IHdoZXRoZXIgaXQgaXMgY29ycmVjdGx5IGNvbmZpZ3VyZWQgZm9yIGNsaWVudCBvciBzZXJ2ZXIge0BsaW5rIFJ1bnRpbWVUeXBlIHJ1bnRpbWV9LgorICAgICAgICAgKi8KKyAgICAgICAgQmlQcmVkaWNhdGU8Q2xhc3M8Pz4sIENvbnRyYWN0UHJvdmlkZXI+IGNvcnJlY3RseUNvbmZpZ3VyZWRSZXNvdXJjZSA9CisgICAgICAgICAgICAgICAgKHJlc291cmNlQ2xhc3MsIG1vZGVsKSAtPiBQcm92aWRlcnMuY2hlY2tQcm92aWRlclJ1bnRpbWUoCisgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZUNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWwsCisgICAgICAgICAgICAgICAgICAgICAgICBSdW50aW1lVHlwZS5TRVJWRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAhcmVnaXN0ZXJlZENsYXNzZXMuY29udGFpbnMocmVzb3VyY2VDbGFzcyksCisgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKworICAgICAgICBTZXQ8Q2xhc3M8Pz4+IGNvbXBvbmVudENsYXNzZXMgPQorICAgICAgICAgICAgICAgIGNvbXBvbmVudEJhZy5nZXRDbGFzc2VzKENvbXBvbmVudEJhZy5leGNsdWRlTWV0YVByb3ZpZGVycyhpbmplY3Rpb25NYW5hZ2VyKSkuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoY29ycmVjdGx5Q29uZmlndXJlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSk7CisKKyAgICAgICAgLy8gTWVyZ2UgcHJvZ3JhbW1hdGljIHJlc291cmNlIGNsYXNzZXMgd2l0aCBjb21wb25lbnQgY2xhc3Nlcy4KKyAgICAgICAgU2V0PENsYXNzPD8+PiBjbGFzc2VzID0gQ29sbGVjdGlvbnMubmV3U2V0RnJvbU1hcChuZXcgSWRlbnRpdHlIYXNoTWFwPD4oKSk7CisgICAgICAgIGNsYXNzZXMuYWRkQWxsKGNvbXBvbmVudENsYXNzZXMpOworICAgICAgICBjbGFzc2VzLmFkZEFsbChyZXNvdXJjZUNsYXNzZXMpOworCisgICAgICAgIC8vIEJpbmQgY2xhc3Nlcy4KKyAgICAgICAgZm9yIChmaW5hbCBDbGFzczw/PiBjb21wb25lbnRDbGFzczogY2xhc3NlcykgeworICAgICAgICAgICAgQ29udHJhY3RQcm92aWRlciBtb2RlbCA9IGNvbXBvbmVudEJhZy5nZXRNb2RlbChjb21wb25lbnRDbGFzcyk7CisgICAgICAgICAgICBpZiAoYmluZFdpdGhDb21wb25lbnRQcm92aWRlcihjb21wb25lbnRDbGFzcywgbW9kZWwsIGNvbXBvbmVudFByb3ZpZGVycykpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHJlc291cmNlQ2xhc3Nlcy5jb250YWlucyhjb21wb25lbnRDbGFzcykpIHsKKyAgICAgICAgICAgICAgICBpZiAoIVJlc291cmNlLmlzQWNjZXB0YWJsZShjb21wb25lbnRDbGFzcykpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HR0VSLndhcm5pbmcoTG9jYWxpemF0aW9uTWVzc2FnZXMuTk9OX0lOU1RBTlRJQUJMRV9DT01QT05FTlQoY29tcG9uZW50Q2xhc3MpKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG1vZGVsICE9IG51bGwgJiYgIWNvcnJlY3RseUNvbmZpZ3VyZWRSZXNvdXJjZS50ZXN0KGNvbXBvbmVudENsYXNzLCBtb2RlbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbW9kZWwgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXNvdXJjZUNvbnRleHQudW5zYWZlQmluZFJlc291cmNlKGNvbXBvbmVudENsYXNzLCBtb2RlbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFByb3ZpZGVyQmluZGVyLmJpbmRQcm92aWRlcihjb21wb25lbnRDbGFzcywgbW9kZWwsIGluamVjdGlvbk1hbmFnZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gTWVyZ2UgcHJvZ3JhbW1hdGljIHJlc291cmNlIGluc3RhbmNlcyB3aXRoIG90aGVyIGNvbXBvbmVudCBpbnN0YW5jZXMuCisgICAgICAgIFNldDxPYmplY3Q+IGluc3RhbmNlcyA9CisgICAgICAgICAgICAgICAgY29tcG9uZW50QmFnLmdldEluc3RhbmNlcyhDb21wb25lbnRCYWcuZXhjbHVkZU1ldGFQcm92aWRlcnMoaW5qZWN0aW9uTWFuYWdlcikpLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKGluc3RhbmNlIC0+IGNvcnJlY3RseUNvbmZpZ3VyZWQudGVzdChpbnN0YW5jZS5nZXRDbGFzcygpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSk7CisgICAgICAgIGluc3RhbmNlcy5hZGRBbGwocmVzb3VyY2VJbnN0YW5jZXMpOworCisgICAgICAgIC8vIEJpbmQgaW5zdGFuY2VzLgorICAgICAgICBmb3IgKE9iamVjdCBjb21wb25lbnQ6IGluc3RhbmNlcykgeworICAgICAgICAgICAgQ29udHJhY3RQcm92aWRlciBtb2RlbCA9IGNvbXBvbmVudEJhZy5nZXRNb2RlbChjb21wb25lbnQuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICBpZiAocmVzb3VyY2VJbnN0YW5jZXMuY29udGFpbnMoY29tcG9uZW50KSkgeworICAgICAgICAgICAgICAgIGlmIChtb2RlbCAhPSBudWxsICYmICFjb3JyZWN0bHlDb25maWd1cmVkUmVzb3VyY2UudGVzdChjb21wb25lbnQuZ2V0Q2xhc3MoKSwgbW9kZWwpKSB7CisgICAgICAgICAgICAgICAgICAgIG1vZGVsID0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVzb3VyY2VDb250ZXh0LnVuc2FmZUJpbmRSZXNvdXJjZShjb21wb25lbnQsIG1vZGVsKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgUHJvdmlkZXJCaW5kZXIuYmluZFByb3ZpZGVyKGNvbXBvbmVudCwgbW9kZWwsIGluamVjdGlvbk1hbmFnZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGJpbmRXaXRoQ29tcG9uZW50UHJvdmlkZXIoCisgICAgICAgICAgICBDbGFzczw/PiBjb21wb25lbnQsIENvbnRyYWN0UHJvdmlkZXIgcHJvdmlkZXJNb2RlbCwgSXRlcmFibGU8Q29tcG9uZW50UHJvdmlkZXI+IGNvbXBvbmVudFByb3ZpZGVycykgeworICAgICAgICBTZXQ8Q2xhc3M8Pz4+IGNvbnRyYWN0cyA9IHByb3ZpZGVyTW9kZWwgPT0gbnVsbCA/IENvbGxlY3Rpb25zLmVtcHR5U2V0KCkgOiBwcm92aWRlck1vZGVsLmdldENvbnRyYWN0cygpOworICAgICAgICBmb3IgKENvbXBvbmVudFByb3ZpZGVyIHByb3ZpZGVyIDogY29tcG9uZW50UHJvdmlkZXJzKSB7CisgICAgICAgICAgICBpZiAocHJvdmlkZXIuYmluZChjb21wb25lbnQsIGNvbnRyYWN0cykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvU2VydmVyQmluZGVyLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9TZXJ2ZXJCaW5kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTQyOWI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvU2VydmVyQmluZGVyLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yOworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5BYnN0cmFjdEJpbmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuSnNvbldpdGhQYWRkaW5nSW50ZXJjZXB0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLk1hcHBhYmxlRXhjZXB0aW9uV3JhcHBlckludGVyY2VwdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5tb25pdG9yaW5nLk1vbml0b3JpbmdDb250YWluZXJMaXN0ZW5lcjsKKworLyoqCisgKiBTZXJ2ZXIgaW5qZWN0aW9uIGJpbmRlci4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworY2xhc3MgU2VydmVyQmluZGVyIGV4dGVuZHMgQWJzdHJhY3RCaW5kZXIgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICBpbnN0YWxsKG5ldyBNYXBwYWJsZUV4Y2VwdGlvbldyYXBwZXJJbnRlcmNlcHRvci5CaW5kZXIoKSwKKyAgICAgICAgICAgICAgICBuZXcgTW9uaXRvcmluZ0NvbnRhaW5lckxpc3RlbmVyLkJpbmRlcigpKTsKKworICAgICAgICAvL0NodW5rZWRSZXNwb25zZVdyaXRlcgorICAgICAgICBiaW5kKENodW5rZWRSZXNwb25zZVdyaXRlci5jbGFzcykudG8oTWVzc2FnZUJvZHlXcml0ZXIuY2xhc3MpLmluKFNpbmdsZXRvbi5jbGFzcyk7CisKKyAgICAgICAgLy8gSlNPTlAKKyAgICAgICAgYmluZChKc29uV2l0aFBhZGRpbmdJbnRlcmNlcHRvci5jbGFzcykudG8oV3JpdGVySW50ZXJjZXB0b3IuY2xhc3MpLmluKFNpbmdsZXRvbi5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvU2VydmVyQm9vdHN0cmFwQmFnLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9TZXJ2ZXJCb290c3RyYXBCYWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzFmMDExCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvU2VydmVyQm9vdHN0cmFwQmFnLmphdmEKQEAgLTAsMCArMSwxNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY1R5cGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Cb290c3RyYXBCYWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLkxhenlWYWx1ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uUmVmOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5KZXJzZXlSZXNvdXJjZUNvbnRleHQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLlByb2Nlc3NpbmdQcm92aWRlcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLmluamVjdC5NdWx0aXZhbHVlZFBhcmFtZXRlckV4dHJhY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5wcm9jZXNzLlJlcXVlc3RQcm9jZXNzaW5nQ29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuTW9kZWxQcm9jZXNzb3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTWV0aG9kSW52b2tlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNb2RlbDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbXBvbmVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuaW50ZXJuYWwuVmFsdWVQYXJhbVByb3ZpZGVyOworCisvKioKKyAqIHtAaW5oZXJpdERvY30KKyAqIDxwPgorICogVGhpcyBib290c3RyYXAgYmFnIGlzIHNwZWNpYWxpemVkIGZvciBzZXJ2ZXIgcGFydCBvZiBKZXJzZXkuCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK3B1YmxpYyBjbGFzcyBTZXJ2ZXJCb290c3RyYXBCYWcgZXh0ZW5kcyBCb290c3RyYXBCYWcgeworCisgICAgcHJpdmF0ZSBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbjsKKyAgICBwcml2YXRlIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbkhhbmRsZXI7CisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPFZhbHVlUGFyYW1Qcm92aWRlcj4gdmFsdWVQYXJhbVByb3ZpZGVyczsKKyAgICBwcml2YXRlIE11bHRpdmFsdWVkUGFyYW1ldGVyRXh0cmFjdG9yUHJvdmlkZXIgbXVsdGl2YWx1ZWRQYXJhbWV0ZXJFeHRyYWN0b3JQcm92aWRlcjsKKyAgICBwcml2YXRlIFByb2Nlc3NpbmdQcm92aWRlcnMgcHJvY2Vzc2luZ1Byb3ZpZGVyczsKKyAgICBwcml2YXRlIEplcnNleVJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHQ7CisgICAgcHJpdmF0ZSBMYXp5VmFsdWU8Q29sbGVjdGlvbjxDb21wb25lbnRQcm92aWRlcj4+IGNvbXBvbmVudFByb3ZpZGVyczsKKyAgICBwcml2YXRlIFJlc291cmNlTWV0aG9kSW52b2tlci5CdWlsZGVyIHJlc291cmNlTWV0aG9kSW52b2tlckJ1aWxkZXI7CisgICAgcHJpdmF0ZSBSZXNvdXJjZUJhZyByZXNvdXJjZUJhZzsKKyAgICBwcml2YXRlIFJlc291cmNlTW9kZWwgcmVzb3VyY2VNb2RlbDsKKyAgICBwcml2YXRlIENvbGxlY3Rpb248TW9kZWxQcm9jZXNzb3I+IG1vZGVsUHJvY2Vzc29yczsKKworICAgIHB1YmxpYyBDb2xsZWN0aW9uPE1vZGVsUHJvY2Vzc29yPiBnZXRNb2RlbFByb2Nlc3NvcnMoKSB7CisgICAgICAgIHJldHVybiBtb2RlbFByb2Nlc3NvcnM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TW9kZWxQcm9jZXNzb3JzKENvbGxlY3Rpb248TW9kZWxQcm9jZXNzb3I+IG1vZGVsUHJvY2Vzc29ycykgeworICAgICAgICB0aGlzLm1vZGVsUHJvY2Vzc29ycyA9IG1vZGVsUHJvY2Vzc29yczsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVzb3VyY2VCYWcgZ2V0UmVzb3VyY2VCYWcoKSB7CisgICAgICAgIHJlcXVpcmVOb25OdWxsKHJlc291cmNlQmFnLCBSZXNvdXJjZUJhZy5jbGFzcyk7CisgICAgICAgIHJldHVybiByZXNvdXJjZUJhZzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUJhZyhSZXNvdXJjZUJhZyByZXNvdXJjZUJhZykgeworICAgICAgICB0aGlzLnJlc291cmNlQmFnID0gcmVzb3VyY2VCYWc7CisgICAgfQorCisgICAgcHVibGljIFJlc291cmNlQ29uZmlnIGdldFJ1bnRpbWVDb25maWcoKSB7CisgICAgICAgIHJldHVybiAoUmVzb3VyY2VDb25maWcpIGdldENvbmZpZ3VyYXRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQXBwbGljYXRpb24gZ2V0QXBwbGljYXRpb24oKSB7CisgICAgICAgIHJlcXVpcmVOb25OdWxsKGFwcGxpY2F0aW9uLCBBcHBsaWNhdGlvbi5jbGFzcyk7CisgICAgICAgIHJldHVybiBhcHBsaWNhdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBcHBsaWNhdGlvbihBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbikgeworICAgICAgICB0aGlzLmFwcGxpY2F0aW9uID0gYXBwbGljYXRpb247CisgICAgfQorCisgICAgcHVibGljIEFwcGxpY2F0aW9uSGFuZGxlciBnZXRBcHBsaWNhdGlvbkhhbmRsZXIoKSB7CisgICAgICAgIHJlcXVpcmVOb25OdWxsKGFwcGxpY2F0aW9uSGFuZGxlciwgQXBwbGljYXRpb25IYW5kbGVyLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIGFwcGxpY2F0aW9uSGFuZGxlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBcHBsaWNhdGlvbkhhbmRsZXIoQXBwbGljYXRpb25IYW5kbGVyIGFwcGxpY2F0aW9uSGFuZGxlcikgeworICAgICAgICB0aGlzLmFwcGxpY2F0aW9uSGFuZGxlciA9IGFwcGxpY2F0aW9uSGFuZGxlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvY2Vzc2luZ1Byb3ZpZGVycyBnZXRQcm9jZXNzaW5nUHJvdmlkZXJzKCkgeworICAgICAgICByZXF1aXJlTm9uTnVsbChwcm9jZXNzaW5nUHJvdmlkZXJzLCBQcm9jZXNzaW5nUHJvdmlkZXJzLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIHByb2Nlc3NpbmdQcm92aWRlcnM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UHJvY2Vzc2luZ1Byb3ZpZGVycyhQcm9jZXNzaW5nUHJvdmlkZXJzIHByb2Nlc3NpbmdQcm92aWRlcnMpIHsKKyAgICAgICAgdGhpcy5wcm9jZXNzaW5nUHJvdmlkZXJzID0gcHJvY2Vzc2luZ1Byb3ZpZGVyczsKKyAgICB9CisKKyAgICBwdWJsaWMgTXVsdGl2YWx1ZWRQYXJhbWV0ZXJFeHRyYWN0b3JQcm92aWRlciBnZXRNdWx0aXZhbHVlZFBhcmFtZXRlckV4dHJhY3RvclByb3ZpZGVyKCkgeworICAgICAgICByZXF1aXJlTm9uTnVsbChtdWx0aXZhbHVlZFBhcmFtZXRlckV4dHJhY3RvclByb3ZpZGVyLCBNdWx0aXZhbHVlZFBhcmFtZXRlckV4dHJhY3RvclByb3ZpZGVyLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIG11bHRpdmFsdWVkUGFyYW1ldGVyRXh0cmFjdG9yUHJvdmlkZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TXVsdGl2YWx1ZWRQYXJhbWV0ZXJFeHRyYWN0b3JQcm92aWRlcihNdWx0aXZhbHVlZFBhcmFtZXRlckV4dHJhY3RvclByb3ZpZGVyIHByb3ZpZGVyKSB7CisgICAgICAgIHRoaXMubXVsdGl2YWx1ZWRQYXJhbWV0ZXJFeHRyYWN0b3JQcm92aWRlciA9IHByb3ZpZGVyOworICAgIH0KKworICAgIHB1YmxpYyBDb2xsZWN0aW9uPFZhbHVlUGFyYW1Qcm92aWRlcj4gZ2V0VmFsdWVQYXJhbVByb3ZpZGVycygpIHsKKyAgICAgICAgcmVxdWlyZU5vbk51bGwodmFsdWVQYXJhbVByb3ZpZGVycywgbmV3IEdlbmVyaWNUeXBlPENvbGxlY3Rpb248VmFsdWVQYXJhbVByb3ZpZGVyPj4oKSB7fS5nZXRUeXBlKCkpOworICAgICAgICByZXR1cm4gdmFsdWVQYXJhbVByb3ZpZGVyczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZVBhcmFtUHJvdmlkZXJzKENvbGxlY3Rpb248VmFsdWVQYXJhbVByb3ZpZGVyPiB2YWx1ZVBhcmFtUHJvdmlkZXJzKSB7CisgICAgICAgIHRoaXMudmFsdWVQYXJhbVByb3ZpZGVycyA9IHZhbHVlUGFyYW1Qcm92aWRlcnM7CisgICAgfQorCisgICAgcHVibGljIEplcnNleVJlc291cmNlQ29udGV4dCBnZXRSZXNvdXJjZUNvbnRleHQoKSB7CisgICAgICAgIHJlcXVpcmVOb25OdWxsKHJlc291cmNlQ29udGV4dCwgSmVyc2V5UmVzb3VyY2VDb250ZXh0LmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIHJlc291cmNlQ29udGV4dDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZXNvdXJjZUNvbnRleHQoSmVyc2V5UmVzb3VyY2VDb250ZXh0IHJlc291cmNlQ29udGV4dCkgeworICAgICAgICB0aGlzLnJlc291cmNlQ29udGV4dCA9IHJlc291cmNlQ29udGV4dDsKKyAgICB9CisKKyAgICBwdWJsaWMgTGF6eVZhbHVlPENvbGxlY3Rpb248Q29tcG9uZW50UHJvdmlkZXI+PiBnZXRDb21wb25lbnRQcm92aWRlcnMoKSB7CisgICAgICAgIHJlcXVpcmVOb25OdWxsKGNvbXBvbmVudFByb3ZpZGVycywgbmV3IEdlbmVyaWNUeXBlPExhenlWYWx1ZTxDb2xsZWN0aW9uPENvbXBvbmVudFByb3ZpZGVyPj4+KCkge30uZ2V0VHlwZSgpKTsKKyAgICAgICAgcmV0dXJuIGNvbXBvbmVudFByb3ZpZGVyczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb21wb25lbnRQcm92aWRlcnMoTGF6eVZhbHVlPENvbGxlY3Rpb248Q29tcG9uZW50UHJvdmlkZXI+PiBjb21wb25lbnRQcm92aWRlcnMpIHsKKyAgICAgICAgdGhpcy5jb21wb25lbnRQcm92aWRlcnMgPSBjb21wb25lbnRQcm92aWRlcnM7CisgICAgfQorCisgICAgcHVibGljIFJlc291cmNlTWV0aG9kSW52b2tlci5CdWlsZGVyIGdldFJlc291cmNlTWV0aG9kSW52b2tlckJ1aWxkZXIoKSB7CisgICAgICAgIHJlcXVpcmVOb25OdWxsKHJlc291cmNlTWV0aG9kSW52b2tlckJ1aWxkZXIsIFJlc291cmNlTWV0aG9kSW52b2tlci5CdWlsZGVyLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIHJlc291cmNlTWV0aG9kSW52b2tlckJ1aWxkZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VNZXRob2RJbnZva2VyQnVpbGRlcihSZXNvdXJjZU1ldGhvZEludm9rZXIuQnVpbGRlciByZXNvdXJjZU1ldGhvZEludm9rZXJCdWlsZGVyKSB7CisgICAgICAgIHRoaXMucmVzb3VyY2VNZXRob2RJbnZva2VyQnVpbGRlciA9IHJlc291cmNlTWV0aG9kSW52b2tlckJ1aWxkZXI7CisgICAgfQorCisgICAgcHVibGljIFJlc291cmNlTW9kZWwgZ2V0UmVzb3VyY2VNb2RlbCgpIHsKKyAgICAgICAgcmVxdWlyZU5vbk51bGwocmVzb3VyY2VNb2RlbCwgUmVzb3VyY2VNb2RlbC5jbGFzcyk7CisgICAgICAgIHJldHVybiByZXNvdXJjZU1vZGVsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJlc291cmNlTW9kZWwoUmVzb3VyY2VNb2RlbCByZXNvdXJjZU1vZGVsKSB7CisgICAgICAgIHRoaXMucmVzb3VyY2VNb2RlbCA9IHJlc291cmNlTW9kZWw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvU2VydmVyQ29uZmlnLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9TZXJ2ZXJDb25maWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWZhMGI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvU2VydmVyQ29uZmlnLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuRXh0ZW5kZWRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlOworCisvKioKKyAqIFNlcnZlci1zaWRlIGFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24uCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGludGVyZmFjZSBTZXJ2ZXJDb25maWcgZXh0ZW5kcyBFeHRlbmRlZENvbmZpZyB7CisKKyAgICAvKioKKyAgICAgKiBHZXQgcHJvZ3JhbW1hdGljYWxseSBtb2RlbGVkIHJlc291cmNlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gcHJvZ3JhbW1hdGljYWxseSBtb2RlbGVkIHJlc291cmNlcy4KKyAgICAgKi8KKyAgICBTZXQ8UmVzb3VyY2U+IGdldFJlc291cmNlcygpOworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvU2VydmVyRXhlY3V0b3JQcm92aWRlcnNDb25maWd1cmF0b3IuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL1NlcnZlckV4ZWN1dG9yUHJvdmlkZXJzQ29uZmlndXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWExOGEzZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL1NlcnZlckV4ZWN1dG9yUHJvdmlkZXJzQ29uZmlndXJhdG9yLmphdmEKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Cb290c3RyYXBCYWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkJpbmRpbmdzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbnN0YW5jZUJpbmRpbmc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW9kZWwuaW50ZXJuYWwuQ29tcG9uZW50QmFnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1vZGVsLmludGVybmFsLk1hbmFnZWRPYmplY3RzRmluYWxpemVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWwuQWJzdHJhY3RFeGVjdXRvclByb3ZpZGVyc0NvbmZpZ3VyYXRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLlNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5TY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuVGhyZWFkUG9vbEV4ZWN1dG9yUHJvdmlkZXI7CisKKy8qKgorICogQ29uZmlndXJhdG9yIHdoaWNoIGluaXRpYWxpemVzIGFuZCByZWdpc3RlciB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLkV4ZWN1dG9yU2VydmljZVByb3ZpZGVyfSBhbmQKKyAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXJ9LgorICoKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitjbGFzcyBTZXJ2ZXJFeGVjdXRvclByb3ZpZGVyc0NvbmZpZ3VyYXRvciBleHRlbmRzIEFic3RyYWN0RXhlY3V0b3JQcm92aWRlcnNDb25maWd1cmF0b3IgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaW5pdChJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIsIEJvb3RzdHJhcEJhZyBib290c3RyYXBCYWcpIHsKKyAgICAgICAgU2VydmVyQm9vdHN0cmFwQmFnIHNlcnZlckJhZyA9IChTZXJ2ZXJCb290c3RyYXBCYWcpIGJvb3RzdHJhcEJhZzsKKyAgICAgICAgUmVzb3VyY2VDb25maWcgcnVudGltZUNvbmZpZyA9IHNlcnZlckJhZy5nZXRSdW50aW1lQ29uZmlnKCk7CisgICAgICAgIENvbXBvbmVudEJhZyBjb21wb25lbnRCYWcgPSBydW50aW1lQ29uZmlnLmdldENvbXBvbmVudEJhZygpOworICAgICAgICBNYW5hZ2VkT2JqZWN0c0ZpbmFsaXplciBmaW5hbGl6ZXIgPSBzZXJ2ZXJCYWcuZ2V0TWFuYWdlZE9iamVjdHNGaW5hbGl6ZXIoKTsKKworICAgICAgICAvLyBUT0RPOiBEbyB3ZSBuZWVkIHRvIHJlZ2lzdGVyIERFRkFVTFQgRXhlY3V0b3IgYW5kIFNjaGVkdWxlZEV4ZWN1dG9yIHRvIEluamVjdGlvbk1hbmFnZXI/CisgICAgICAgIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyIGRlZmF1bHRTY2hlZHVsZWRFeGVjdXRvclByb3ZpZGVyID0gbmV3IERlZmF1bHRCYWNrZ3JvdW5kU2NoZWR1bGVyUHJvdmlkZXIoKTsKKyAgICAgICAgSW5zdGFuY2VCaW5kaW5nPFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyPiBzY2hlZHVsZXJCaW5kaW5nID0gQmluZGluZ3MKKyAgICAgICAgICAgICAgICAuc2VydmljZShkZWZhdWx0U2NoZWR1bGVkRXhlY3V0b3JQcm92aWRlcikKKyAgICAgICAgICAgICAgICAudG8oU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgLnF1YWxpZmllZEJ5KEJhY2tncm91bmRTY2hlZHVsZXJMaXRlcmFsLklOU1RBTkNFKTsKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5yZWdpc3RlcihzY2hlZHVsZXJCaW5kaW5nKTsKKyAgICAgICAgZmluYWxpemVyLnJlZ2lzdGVyRm9yUHJlRGVzdHJveUNhbGwoZGVmYXVsdFNjaGVkdWxlZEV4ZWN1dG9yUHJvdmlkZXIpOworCisgICAgICAgIEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyIGRlZmF1bHRBc3luY0V4ZWN1dG9yUHJvdmlkZXIgPSBuZXcgRGVmYXVsdE1hbmFnZWRBc3luY0V4ZWN1dG9yUHJvdmlkZXIoKTsKKyAgICAgICAgSW5zdGFuY2VCaW5kaW5nPEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyPiBleGVjdXRvckJpbmRpbmcgPSBCaW5kaW5ncworICAgICAgICAgICAgICAgIC5zZXJ2aWNlKGRlZmF1bHRBc3luY0V4ZWN1dG9yUHJvdmlkZXIpCisgICAgICAgICAgICAgICAgLnRvKEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyLmNsYXNzKTsKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5yZWdpc3RlcihleGVjdXRvckJpbmRpbmcpOworICAgICAgICBmaW5hbGl6ZXIucmVnaXN0ZXJGb3JQcmVEZXN0cm95Q2FsbChkZWZhdWx0QXN5bmNFeGVjdXRvclByb3ZpZGVyKTsKKworICAgICAgICByZWdpc3RlckV4ZWN1dG9ycyhpbmplY3Rpb25NYW5hZ2VyLCBjb21wb25lbnRCYWcsIGRlZmF1bHRBc3luY0V4ZWN1dG9yUHJvdmlkZXIsIGRlZmF1bHRTY2hlZHVsZWRFeGVjdXRvclByb3ZpZGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IHtAbGluayBTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2VQcm92aWRlcn0gdXNlZCBvbiB0aGUgc2VydmVyIHNpZGUgZm9yIHByb3ZpZGluZyB0aGUgc2NoZWR1bGVkIGV4ZWN1dG9yIHNlcnZpY2UgdGhhdAorICAgICAqIHJ1bnMgYmFja2dyb3VuZCB0YXNrcy4KKyAgICAgKi8KKyAgICBAQmFja2dyb3VuZFNjaGVkdWxlcgorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIERlZmF1bHRCYWNrZ3JvdW5kU2NoZWR1bGVyUHJvdmlkZXIgZXh0ZW5kcyBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3JQcm92aWRlciB7CisKKyAgICAgICAgcHVibGljIERlZmF1bHRCYWNrZ3JvdW5kU2NoZWR1bGVyUHJvdmlkZXIoKSB7CisgICAgICAgICAgICBzdXBlcigiamVyc2V5LWJhY2tncm91bmQtdGFzay1zY2hlZHVsZXIiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgaW50IGdldENvcmVQb29sU2l6ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVmYXVsdCB7QGxpbmsgRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXJ9IHVzZWQgb24gdGhlIHNlcnZlciBzaWRlIGZvciBtYW5hZ2VkIGFzeW5jaHJvbm91cyByZXF1ZXN0IHByb2Nlc3NpbmcuCisgICAgICovCisgICAgQE1hbmFnZWRBc3luY0V4ZWN1dG9yCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGVmYXVsdE1hbmFnZWRBc3luY0V4ZWN1dG9yUHJvdmlkZXIgZXh0ZW5kcyBUaHJlYWRQb29sRXhlY3V0b3JQcm92aWRlciB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBuZXcgaW5zdGFuY2UgZm9yIHRoZSBkZWZhdWx0IG1hbmFnZWQgYXN5bmMgZXhlY3V0b3IgcHJvdmlkZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgRGVmYXVsdE1hbmFnZWRBc3luY0V4ZWN1dG9yUHJvdmlkZXIoKSB7CisgICAgICAgICAgICBzdXBlcigiamVyc2V5LXNlcnZlci1tYW5hZ2VkLWFzeW5jLWV4ZWN1dG9yIik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9TZXJ2ZXJQcm9wZXJ0aWVzLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9TZXJ2ZXJQcm9wZXJ0aWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFmYjczYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL1NlcnZlclByb3BlcnRpZXMuamF2YQpAQCAtMCwwICsxLDgxMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXgud3MucnMuUnVudGltZVR5cGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5Db21tb25Qcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUHJvcGVydGllc0NsYXNzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUHJvcGVydGllc0hlbHBlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlByb3BlcnR5QWxpYXM7CisKKworLyoqCisgKiBKZXJzZXkgc2VydmVyLXNpZGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworQFByb3BlcnRpZXNDbGFzcworcHVibGljIGZpbmFsIGNsYXNzIFNlcnZlclByb3BlcnRpZXMgeworCisgICAgLyoqCisgICAgICogRGVmaW5lcyBvbmUgb3IgbW9yZSBwYWNrYWdlcyB0aGF0IGNvbnRhaW4gYXBwbGljYXRpb24tc3BlY2lmaWMgcmVzb3VyY2VzIGFuZAorICAgICAqIHByb3ZpZGVycy4KKyAgICAgKgorICAgICAqIElmIHRoZSBwcm9wZXJ0eSBpcyBzZXQsIHRoZSBzcGVjaWZpZWQgcGFja2FnZXMgd2lsbCBiZSBzY2FubmVkIGZvcgorICAgICAqIEpBWC1SUyByb290IHJlc291cmNlcyAoYW5ub3RhdGVkIHdpdGgge0BsaW5rIGphdmF4LndzLnJzLlBhdGggQFBhdGh9KSBhbmQKKyAgICAgKiBwcm92aWRlcnMgKGFubm90YXRlZCB3aXRoIHtAbGluayBqYXZheC53cy5ycy5leHQuUHJvdmlkZXIgQFByb3ZpZGVyfSkuCisgICAgICogPHA+CisgICAgICogVGhlIHByb3BlcnR5IHZhbHVlIE1VU1QgYmUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFN0cmluZ30gb3Ige0Bjb2RlIFN0cmluZ1tdfQorICAgICAqIGFycmF5LiBFYWNoIHtAY29kZSBTdHJpbmd9IGluc3RhbmNlIHJlcHJlc2VudHMgb25lIG9yIG1vcmUgcGFja2FnZSBuYW1lcworICAgICAqIHRoYXQgTVVTVCBiZSBzZXBhcmF0ZWQgb25seSBieSBjaGFyYWN0ZXJzIGRlY2xhcmVkIGluIGNvbW1vbiBkZWxpbWl0ZXJzOgorICAgICAqIHtAY29kZSAiICw7XG4ifS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogQSBkZWZhdWx0IHZhbHVlIGlzIG5vdCBzZXQuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDx0dD57QHZhbHVlfTwvdHQ+LgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICAvLyBUT0RPIGFkZCBzdXBwb3J0IGZvciAnOicgYW5kIGFueSAobnVtYmVyIG9mIGNvbnNlY3V0aXZlKSB3aGl0ZXNwYWNlKHMpLgorICAgIC8vIFRPRE8gaW1wbGVtZW50IGdlbmVyaWMgc3VwcG9ydAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1ZJREVSX1BBQ0tBR0VTID0gImplcnNleS5jb25maWcuc2VydmVyLnByb3ZpZGVyLnBhY2thZ2VzIjsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHJlY3Vyc2lvbiBzdHJhdGVneSBmb3IgcGFja2FnZSBzY2FubmluZy4KKyAgICAgKgorICAgICAqIFRoZSB2YWx1ZSBvZiB7QGNvZGUgdHJ1ZX0gaW5kaWNhdGVzCisgICAgICogdGhhdCB0aGUge0BsaW5rICNQUk9WSURFUl9QQUNLQUdFUyBsaXN0IG9mIHByb3ZpZGVkIHBhY2thZ2UgbmFtZXN9IHNob3VsZCBiZSBzY2FubmVkCisgICAgICogcmVjdXJzaXZlbHkgaW5jbHVkaW5nIGFueSBuZXN0ZWQgcGFja2FnZXMuIFZhbHVlIG9mIHtAY29kZSBmYWxzZX0gaW5kaWNhdGVzIHRoYXQgb25seQorICAgICAqIHBhY2thZ2VzIGluIHRoZSBsaXN0IHNob3VsZCBiZSBzY2FubmVkLiBJbiBzdWNoIGNhc2UgYW55IG5lc3RlZCBwYWNrYWdlcyB3aWxsIGJlIGlnbm9yZWQuCisgICAgICogPHA+CisgICAgICogVGhlIHByb3BlcnR5IHZhbHVlIE1VU1QgYmUgYW4gaW5zdGFuY2Ugb2Yge0Bjb2RlIEJvb2xlYW59IHR5cGUgb3IgYSB7QGNvZGUgU3RyaW5nfSBjb252ZXJ0aWJsZQorICAgICAqIHRvIHtAY29kZSBCb29sZWFufSB0eXBlLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBBIGRlZmF1bHQgdmFsdWUgaXMge0Bjb2RlIHRydWV9LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAc2VlICNQUk9WSURFUl9QQUNLQUdFUworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST1ZJREVSX1NDQU5OSU5HX1JFQ1VSU0lWRSA9ICJqZXJzZXkuY29uZmlnLnNlcnZlci5wcm92aWRlci5zY2FubmluZy5yZWN1cnNpdmUiOworCisgICAgLyoqCisgICAgICogRGVmaW5lcyBjbGFzcy1wYXRoIHRoYXQgY29udGFpbnMgYXBwbGljYXRpb24tc3BlY2lmaWMgcmVzb3VyY2VzIGFuZAorICAgICAqIHByb3ZpZGVycy4KKyAgICAgKgorICAgICAqIElmIHRoZSBwcm9wZXJ0eSBpcyBzZXQsIHRoZSBzcGVjaWZpZWQgY2xhc3MtcGF0aCB3aWxsIGJlIHNjYW5uZWQKKyAgICAgKiBmb3IgSkFYLVJTIHJvb3QgcmVzb3VyY2VzIChhbm5vdGF0ZWQgd2l0aCB7QGxpbmsgamF2YXgud3MucnMuUGF0aCBAUGF0aH0pCisgICAgICogYW5kIHByb3ZpZGVycyAoYW5ub3RhdGVkIHdpdGgge0BsaW5rIGphdmF4LndzLnJzLmV4dC5Qcm92aWRlciBAUHJvdmlkZXJ9KS4KKyAgICAgKiBFYWNoIHBhdGggZWxlbWVudCBNVVNUIGJlIGFuIGFic29sdXRlIG9yIHJlbGF0aXZlIGRpcmVjdG9yeSwgb3IgYSBKYXIgZmlsZS4KKyAgICAgKiBUaGUgY29udGVudHMgb2YgYSBkaXJlY3RvcnksIGluY2x1ZGluZyBKYXZhIGNsYXNzIGZpbGVzLCBqYXJzIGZpbGVzCisgICAgICogYW5kIHN1Yi1kaXJlY3RvcmllcyBhcmUgc2Nhbm5lZCAocmVjdXJzaXZlbHkpLgorICAgICAqIDxwPgorICAgICAqIFRoZSBwcm9wZXJ0eSB2YWx1ZSBNVVNUIGJlIGFuIGluc3RhbmNlIG9mIHtAbGluayBTdHJpbmd9IG9yIHtAY29kZSBTdHJpbmdbXX0KKyAgICAgKiBhcnJheS4gRWFjaCB7QGNvZGUgU3RyaW5nfSBpbnN0YW5jZSByZXByZXNlbnRzIG9uZSBvciBtb3JlIHBhdGhzCisgICAgICogdGhhdCBNVVNUIGJlIHNlcGFyYXRlZCBvbmx5IGJ5IGNoYXJhY3RlcnMgZGVjbGFyZWQgaW4gY29tbW9uIGRlbGltaXRlcnM6CisgICAgICoge0Bjb2RlICIgLDtcbiJ9LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBBIGRlZmF1bHQgdmFsdWUgaXMgbm90IHNldC4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaXMgPHR0PntAdmFsdWV9PC90dD4uCisgICAgICogPC9wPgorICAgICAqLworICAgIC8vIFRPRE8gYWRkIHN1cHBvcnQgZm9yICc6JyBhbmQgYW55IChudW1iZXIgb2YgY29uc2VjdXRpdmUpIHdoaXRlc3BhY2UocykuCisgICAgLy8gVE9ETyBpbXBsZW1lbnQgZ2VuZXJpYyBzdXBwb3J0CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVklERVJfQ0xBU1NQQVRIID0gImplcnNleS5jb25maWcuc2VydmVyLnByb3ZpZGVyLmNsYXNzcGF0aCI7CisKKyAgICAvKioKKyAgICAgKiBEZWZpbmVzIG9uZSBvciBtb3JlIGNsYXNzIG5hbWVzIHRoYXQgaW1wbGVtZW50IGFwcGxpY2F0aW9uLXNwZWNpZmljIHJlc291cmNlcworICAgICAqIGFuZCBwcm92aWRlcnMuCisgICAgICoKKyAgICAgKiBJZiB0aGUgcHJvcGVydHkgaXMgc2V0LCB0aGUgc3BlY2lmaWVkIGNsYXNzZXMgd2lsbCBiZSBpbnN0YW50aWF0ZWQKKyAgICAgKiBhbmQgcmVnaXN0ZXJlZCBhcyBlaXRoZXIgYXBwbGljYXRpb24gSkFYLVJTIHJvb3QgcmVzb3VyY2VzIChhbm5vdGF0ZWQgd2l0aAorICAgICAqIHtAbGluayBqYXZheC53cy5ycy5QYXRoIEBQYXRofSkgb3IgcHJvdmlkZXJzIChhbm5vdGF0ZWQgd2l0aAorICAgICAqIHtAbGluayBqYXZheC53cy5ycy5leHQuUHJvdmlkZXIgQFByb3ZpZGVyfSkuCisgICAgICogPHA+CisgICAgICogVGhlIHByb3BlcnR5IHZhbHVlIE1VU1QgYmUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFN0cmluZ30gb3Ige0Bjb2RlIFN0cmluZ1tdfQorICAgICAqIGFycmF5LiBFYWNoIHtAY29kZSBTdHJpbmd9IGluc3RhbmNlIHJlcHJlc2VudHMgb25lIG9yIG1vcmUgY2xhc3MgbmFtZXMKKyAgICAgKiB0aGF0IE1VU1QgYmUgc2VwYXJhdGVkIG9ubHkgYnkgY2hhcmFjdGVycyBkZWNsYXJlZCBpbiBjb21tb24gZGVsaW1pdGVyczoKKyAgICAgKiB7QGNvZGUgIiAsO1xuIn0uCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIEEgZGVmYXVsdCB2YWx1ZSBpcyBub3Qgc2V0LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgLy8gVE9ETyBpbXBsZW1lbnQgZ2VuZXJpYyBzdXBwb3J0CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPVklERVJfQ0xBU1NOQU1FUyA9ICJqZXJzZXkuY29uZmlnLnNlcnZlci5wcm92aWRlci5jbGFzc25hbWVzIjsKKworICAgIC8qKgorICAgICAqIERlZmluZXMgbWFwcGluZyBvZiBVUkkgZXh0ZW5zaW9ucyB0byBtZWRpYSB0eXBlcy4KKyAgICAgKgorICAgICAqIFRoZSBwcm9wZXJ0eSBpcyB1c2VkIGJ5IHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuZmlsdGVyLlVyaUNvbm5lZ0ZpbHRlcn0uIFNlZSBpdCdzIGphdmFkb2MgZm9yIG1vcmUKKyAgICAgKiBpbmZvcm1hdGlvbiBvbiBtZWRpYSB0eXBlIG1hcHBpbmdzLgorICAgICAqIDxwPgorICAgICAqIFRoZSBwcm9wZXJ0eSB2YWx1ZSBNVVNUIGJlIGFuIGluc3RhbmNlIG9mIHtAbGluayBTdHJpbmd9LCB7QGNvZGUgU3RyaW5nW119IG9yIHtAY29kZSBNYXAmbHQ7U3RyaW5nLCBNZWRpYVR5cGUmZ3Q7fS4KKyAgICAgKiBFYWNoIHtAY29kZSBTdHJpbmd9IGluc3RhbmNlIHJlcHJlc2VudHMgb25lIG9yIG1vcmUgdXJpLWV4dGVuc2lvbi10by1tZWRpYS10eXBlIG1hcCBlbnRyaWVzIHNlcGFyYXRlZCBieQorICAgICAqIGEgY29tbWEgKCIsIikuIEVhY2ggbWFwIGVudHJ5IGlzIGEga2V5LXZhbHVlIHBhaXIgc2VwYXJhdGVkIGJ5IGEgY29sb24gKCI6IikuCisgICAgICogSGVyZSBpcyBhbiBleGFtcGxlIG9mIGFuIGFjY2VwdGFibGUgU3RyaW5nIHZhbHVlIG1hcHBpbmcgdHh0IGV4dGVuc2lvbiB0byB0ZXh0L3BsYWluIGFuZCB4bWwgZXh0ZW5zaW9uIHRvIGFwcGxpY2F0aW9uL3htbDoKKyAgICAgKiA8cHJlPnR4dCA6IHRleHQvcGxhaW4sIHhtbCA6IGFwcGxpY2F0aW9uL3htbDwvcHJlPgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBBIGRlZmF1bHQgdmFsdWUgaXMgbm90IHNldC4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaXMgPHR0PntAdmFsdWV9PC90dD4uCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FRElBX1RZUEVfTUFQUElOR1MgPSAiamVyc2V5LmNvbmZpZy5zZXJ2ZXIubWVkaWFUeXBlTWFwcGluZ3MiOworCisgICAgLyoqCisgICAgICogRGVmaW5lcyBtYXBwaW5nIG9mIFVSSSBleHRlbnNpb25zIHRvIGxhbmd1YWdlcy4KKyAgICAgKgorICAgICAqIFRoZSBwcm9wZXJ0eSBpcyB1c2VkIGJ5IHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuZmlsdGVyLlVyaUNvbm5lZ0ZpbHRlcn0uIFNlZSBpdCdzIGphdmFkb2MgZm9yIG1vcmUKKyAgICAgKiBpbmZvcm1hdGlvbiBvbiBsYW5ndWFnZSBtYXBwaW5ncy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgcHJvcGVydHkgdmFsdWUgTVVTVCBiZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgU3RyaW5nfSwge0Bjb2RlIFN0cmluZ1tdfSBvciB7QGNvZGUgTWFwJmx0O1N0cmluZywgU3RyaW5nJmd0O30uCisgICAgICogRWFjaCB7QGNvZGUgU3RyaW5nfSBpbnN0YW5jZSByZXByZXNlbnRzIG9uZSBvciBtb3JlIHVyaS1leHRlbnNpb24tdG8tbGFuZ3VhZ2UgbWFwIGVudHJpZXMgc2VwYXJhdGVkIGJ5CisgICAgICogYSBjb21tYSAoIiwiKS4gRWFjaCBtYXAgZW50cnkgaXMgYSBrZXktdmFsdWUgcGFpciBzZXBhcmF0ZWQgYnkgYSBjb2xvbiAoIjoiKS4KKyAgICAgKiBIZXJlIGlzIGFuIGV4YW1wbGUgb2YgYW4gYWNjZXB0YWJsZSBTdHJpbmcgdmFsdWUgbWFwcGluZyBlbmdsaXNoIGV4dGVuc2lvbiB0byAiZW4iIHZhbHVlIG9mIENvbnRlbnQtTGFuZ3VhZ2UgaGVhZGVyCisgICAgICogYW5kIGZyZW5jaCBleHRlbnNpb24gdG8gImZyIiBDb250ZW50LUxhbmd1YWdlIGhlYWRlciB2YWx1ZToKKyAgICAgKiA8cHJlPmVuZ2xpc2ggOiBlbiwgZnJlbmNoIDogZnI8L3ByZT4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogQSBkZWZhdWx0IHZhbHVlIGlzIG5vdCBzZXQuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDx0dD57QHZhbHVlfTwvdHQ+LgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQU5HVUFHRV9NQVBQSU5HUyA9ICJqZXJzZXkuY29uZmlnLnNlcnZlci5sYW5ndWFnZU1hcHBpbmdzIjsKKworICAgIC8qKgorICAgICAqIERlZmluZXMgY29uZmlndXJhdGlvbiBvZiBIVFRQIG1ldGhvZCBvdmVycmlkaW5nLgorICAgICAqCisgICAgICogVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIGJ5IHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuZmlsdGVyLkh0dHBNZXRob2RPdmVycmlkZUZpbHRlcn0gdG8gZGV0ZXJtaW5lCisgICAgICogd2hlcmUgaXQgc2hvdWxkIGxvb2sgZm9yIG1ldGhvZCBvdmVycmlkZSBpbmZvcm1hdGlvbiAoZS5nLiByZXF1ZXN0IGhlYWRlciBvciBxdWVyeSBwYXJhbWV0ZXJzKS4KKyAgICAgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmZpbHRlci5IdHRwTWV0aG9kT3ZlcnJpZGVGaWx0ZXIuU291cmNlfSBlbnVtIGxpc3RzIHRoZSBhbGxvd2VkIHByb3BlcnR5CisgICAgICogdmFsdWVzLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgcHJvcGVydHkgdmFsdWUgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgU3RyaW5nfSwge0Bjb2RlIFN0cmluZ1tdfSwKKyAgICAgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmZpbHRlci5IdHRwTWV0aG9kT3ZlcnJpZGVGaWx0ZXIuU291cmNlIFNvdXJjZX0gb3IKKyAgICAgKiB7QGNvZGUgU291cmNlW119LgorICAgICAqIEVhY2gge0Bjb2RlIFN0cmluZ30gaW5zdGFuY2UgcmVwcmVzZW50cyBvbmUgb3IgbW9yZSBjbGFzcyBuYW1lcyBzZXBhcmF0ZWQgYnkgY2hhcmFjdGVycyBkZWNsYXJlZCBpbgorICAgICAqIGNvbW1vbiBkZWxpbWl0ZXJzOiB7QGNvZGUgIiAsO1xuIn0uCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHtAY29kZSAiSEVBREVSLCBRVUVSWSJ9LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSFRUUF9NRVRIT0RfT1ZFUlJJREUgPSAiamVyc2V5LmNvbmZpZy5zZXJ2ZXIuaHR0cE1ldGhvZE92ZXJyaWRlIjsKKworICAgIC8qKgorICAgICAqIElmIHNldCB0aGUgd2FkbCBnZW5lcmF0b3IgY29uZmlndXJhdGlvbiB0aGF0IHByb3ZpZGVzIGEge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLldhZGxHZW5lcmF0b3J9LgorICAgICAqCisgICAgICogSWYgdGhpcyBwcm9wZXJ0eSBpcyBub3Qgc2V0IHRoZSBkZWZhdWx0IHdhZGwgZ2VuZXJhdG9yIHdpbGwgYmUgdXNlZCBmb3IgZ2VuZXJhdGluZyB3YWRsLgorICAgICAqIDxwPgorICAgICAqIFRoZSB0eXBlIG9mIHRoaXMgcHJvcGVydHkgbXVzdCBiZSBhIHN1YmNsYXNzIG9yIGFuIGluc3RhbmNlIG9mIGEgc3ViY2xhc3Mgb2YKKyAgICAgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuY29uZmlnLldhZGxHZW5lcmF0b3JDb25maWd9LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FETF9HRU5FUkFUT1JfQ09ORklHID0gImplcnNleS5jb25maWcuc2VydmVyLndhZGwuZ2VuZXJhdG9yQ29uZmlnIjsKKworICAgIC8qKgorICAgICAqIElmIHtAY29kZSB0cnVlfSB0aGVuIGRpc2FibGUgV0FETCBnZW5lcmF0aW9uLgorICAgICAqCisgICAgICogQnkgZGVmYXVsdCBXQURMIGdlbmVyYXRpb24gaXMgYXV0b21hdGljYWxseSBlbmFibGVkLCBpZiBKQVhCIGlzIHByZXNlbnQgaW4gdGhlIGNsYXNzcGF0aC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB7QGNvZGUgZmFsc2V9LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0FETF9GRUFUVVJFX0RJU0FCTEUgPSAiamVyc2V5LmNvbmZpZy5zZXJ2ZXIud2FkbC5kaXNhYmxlV2FkbCI7CisKKyAgICAvKioKKyAgICAgKiBJZiB7QGNvZGUgdHJ1ZX0gdGhlbiBkaXNhYmxlIEJlYW4gVmFsaWRhdGlvbiBzdXBwb3J0LgorICAgICAqCisgICAgICogQnkgZGVmYXVsdCBCZWFuIFZhbGlkYXRpb24gKEpTUi0zNDkpIGlzIGF1dG9tYXRpY2FsbHkgZW5hYmxlZCwgaWYge0Bjb2RlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDo6amVyc2V5LWJlYW4tdmFsaWRhdGlvbn0KKyAgICAgKiBKZXJzZXkgbW9kdWxlIGlzIHByZXNlbnQgaW4gdGhlIGNsYXNzcGF0aC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB7QGNvZGUgZmFsc2V9LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlZfRkVBVFVSRV9ESVNBQkxFID0gImplcnNleS5jb25maWcuYmVhblZhbGlkYXRpb24uZGlzYWJsZS5zZXJ2ZXIiOworCisgICAgLyoqCisgICAgICogQSBCZWFuIFZhbGlkYXRpb24gKEpTUi0zNDkpIHN1cHBvcnQgY3VzdG9taXphdGlvbiBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIElmIHtAY29kZSB0cnVlfSB0aGUgY2hlY2sgd2hldGhlciB0aGUgb3ZlcnJpZGluZyAvIGltcGxlbWVudGluZyBtZXRob2RzIGFyZSBhbm5vdGF0ZWQgd2l0aAorICAgICAqIHtAbGluayBqYXZheC52YWxpZGF0aW9uLmV4ZWN1dGFibGUuVmFsaWRhdGVPbkV4ZWN1dGlvbn0gYXMgd2VsbCBhcyBvbmUgb2YgdGhlaXIgcHJlZGVjZXNzb3IgKGluIGhpZXJhcmNoeSkKKyAgICAgKiBpcyBkaXNhYmxlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBCeSBkZWZhdWx0IHRoaXMgY2hlY2tzIGlzIGF1dG9tYXRpY2FsbHkgZW5hYmxlZCwgdW5sZXNzIHRoZSBCZWFuIFZhbGlkYXRpb24gc3VwcG9ydCBpcyBkaXNhYmxlZCBleHBsaWNpdGx5IChzZWUKKyAgICAgKiB7QGxpbmsgI0JWX0ZFQVRVUkVfRElTQUJMRX0pLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB7QGNvZGUgZmFsc2V9LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAc2VlIGphdmF4LnZhbGlkYXRpb24uZXhlY3V0YWJsZS5WYWxpZGF0ZU9uRXhlY3V0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlZfRElTQUJMRV9WQUxJREFURV9PTl9FWEVDVVRBQkxFX09WRVJSSURFX0NIRUNLID0KKyAgICAgICAgICAgICJqZXJzZXkuY29uZmlnLmJlYW5WYWxpZGF0aW9uLmRpc2FibGUudmFsaWRhdGVPbkV4ZWN1dGFibGVDaGVjay5zZXJ2ZXIiOworCisgICAgLyoqCisgICAgICogQSBCZWFuIFZhbGlkYXRpb24gKEpTUi0zNDkpIHN1cHBvcnQgY3VzdG9taXphdGlvbiBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIElmIHNldCB0byB7QGNvZGUgdHJ1ZX0gYW5kIEJlYW4gVmFsaWRhdGlvbiBzdXBwb3J0IGhhcyBub3QgYmVlbiBleHBsaWNpdGx5IGRpc2FibGVkIChzZWUKKyAgICAgKiB7QGxpbmsgI0JWX0ZFQVRVUkVfRElTQUJMRX0pLCB0aGUgdmFsaWRhdGlvbiBlcnJvciBpbmZvcm1hdGlvbiB3aWxsIGJlIHNlbnQgaW4gdGhlIGVudGl0eSBvZiB0aGUKKyAgICAgKiByZXR1cm5lZCB7QGxpbmsgamF2YXgud3MucnMuY29yZS5SZXNwb25zZX0uCisgICAgICogPHA+CisgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMge0Bjb2RlIGZhbHNlfS4gVGhpcyBtZWFucyB0aGF0IGluIGNhc2Ugb2YgYW4gZXJyb3IgcmVzcG9uc2UgY2F1c2VkIGJ5IGEgQmVhbiBWYWxpZGF0aW9uCisgICAgICogZXJyb3IsIG9ubHkgYSBzdGF0dXMgY29kZSBpcyBzZW50IGluIHRoZSBzZXJ2ZXIge0Bjb2RlIFJlc3BvbnNlfSBieSBkZWZhdWx0LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlZfU0VORF9FUlJPUl9JTl9SRVNQT05TRQorICAgICAgICAgICAgPSAiamVyc2V5LmNvbmZpZy5iZWFuVmFsaWRhdGlvbi5lbmFibGVPdXRwdXRWYWxpZGF0aW9uRXJyb3JFbnRpdHkuc2VydmVyIjsKKworICAgIC8qKgorICAgICAqIElmIHNldCB0byB7QGNvZGUgdHJ1ZX0gdGhlbiBhIGNvbnRhaW5lciB3aWxsIGlnbm9yZSBtdWx0aXBsZSBzbGFzaGVzIGJldHdlZW4gYSBwb3J0IGFuZCBhIGNvbnRleHQgcGF0aCBhbmQgd2lsbCByZXNvbHZlIGl0CisgICAgICogYXMgVVJJIHdpdGggb25seSBvbmUgc2xhc2guCisgICAgICogPHA+CisgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMge0Bjb2RlIGZhbHNlfS4gVGhpcyBtZWFucyB0aGF0IGluIGNhc2Ugb2YgbXVsdGlwbGUgc2xhc2hlcyBhIGNvbnRhaW5lciB3aWxsIG1hdGNoIHdpdGggdGhlIGFkZHJlc3MKKyAgICAgKiB3aXRoIHRoZSBzYW1lIG51bWJlciBvZiBzbGFzaGVzIGJlZm9yZSBhIGNvbnRleHQgcGF0aC4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIHByb3BlcnR5IGluZmx1ZW5jZXMgb25seSBHcml6emx5IENvbnRhaW5lciBmcm9tIGNvbnRhaW5lcnMgd2hpY2ggYXJlIHN1cHBvcnRlZCBieSBKZXJzZXkuIE90aGVyIGNvbnRhaW5lcnMgaGF2ZQorICAgICAqIGxpbWl0ZWQgb3IgZGlzYWJsZWQgdXNhZ2Ugb2YgYSBjb250ZXh0IHBhdGguCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDx0dD57QHZhbHVlfTwvdHQ+LgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRURVQ0VfQ09OVEVYVF9QQVRIX1NMQVNIRVNfRU5BQkxFRAorICAgICAgICAgICAgPSAiamVyc2V5LmNvbmZpZy5zZXJ2ZXIucmVkdWNlQ29udGV4dFBhdGhTbGFzaGVzLmVuYWJsZWQiOworCisgICAgLyoqCisgICAgICogSWYge0Bjb2RlIHRydWV9IHRoZW4gZGlzYWJsZSBhdXRvIGRpc2NvdmVyeSBvbiBzZXJ2ZXIuCisgICAgICoKKyAgICAgKiBCeSBkZWZhdWx0IGF1dG8gZGlzY292ZXJ5IGlzIGF1dG9tYXRpY2FsbHkgZW5hYmxlZCBpZiBnbG9iYWwgcHJvcGVydHkKKyAgICAgKiB7QHZhbHVlIG9yZy5nbGFzc2Zpc2guamVyc2V5LkNvbW1vblByb3BlcnRpZXMjRkVBVFVSRV9BVVRPX0RJU0NPVkVSWV9ESVNBQkxFfSBpcyBub3QgZGlzYWJsZWQuIElmIHNldCB0aGVuIHRoZSBzZXJ2ZXIKKyAgICAgKiBwcm9wZXJ0eSB2YWx1ZSBvdmVycmlkZXMgdGhlIGdsb2JhbCBwcm9wZXJ0eSB2YWx1ZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB7QGNvZGUgZmFsc2V9LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhpcyBjb25zdGFudCBpcyBhbiBhbGlhcyBmb3Ige0BsaW5rIENvbW1vblByb3BlcnRpZXMjRkVBVFVSRV9BVVRPX0RJU0NPVkVSWV9ESVNBQkxFX1NFUlZFUn0KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAc2VlIG9yZy5nbGFzc2Zpc2guamVyc2V5LkNvbW1vblByb3BlcnRpZXMjRkVBVFVSRV9BVVRPX0RJU0NPVkVSWV9ESVNBQkxFCisgICAgICovCisgICAgQFByb3BlcnR5QWxpYXMKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGRUFUVVJFX0FVVE9fRElTQ09WRVJZX0RJU0FCTEUgPSBDb21tb25Qcm9wZXJ0aWVzLkZFQVRVUkVfQVVUT19ESVNDT1ZFUllfRElTQUJMRV9TRVJWRVI7CisKKyAgICAvKioKKyAgICAgKiBBbiBpbnRlZ2VyIHZhbHVlIHRoYXQgZGVmaW5lcyB0aGUgYnVmZmVyIHNpemUgdXNlZCB0byBidWZmZXIgc2VydmVyLXNpZGUgcmVzcG9uc2UgZW50aXR5IGluIG9yZGVyIHRvCisgICAgICogZGV0ZXJtaW5lIGl0cyBzaXplIGFuZCBzZXQgdGhlIHZhbHVlIG9mIEhUVFAgPHR0PntAdmFsdWUgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVycyNDT05URU5UX0xFTkdUSH08L3R0PiBoZWFkZXIuCisgICAgICogPHA+CisgICAgICogSWYgdGhlIGVudGl0eSBzaXplIGV4Y2VlZHMgdGhlIGNvbmZpZ3VyZWQgYnVmZmVyIHNpemUsIHRoZSBidWZmZXJpbmcgd291bGQgYmUgY2FuY2VsbGVkIGFuZCB0aGUgZW50aXR5IHNpemUKKyAgICAgKiB3b3VsZCBub3QgYmUgZGV0ZXJtaW5lZC4gVmFsdWUgbGVzcyBvciBlcXVhbCB0byB6ZXJvIGRpc2FibGUgdGhlIGJ1ZmZlcmluZyBvZiB0aGUgZW50aXR5IGF0IGFsbC4KKyAgICAgKiA8L3A+CisgICAgICogVGhpcyBwcm9wZXJ0eSBjYW4gYmUgdXNlZCBvbiB0aGUgc2VydmVyIHNpZGUgdG8gb3ZlcnJpZGUgdGhlIG91dGJvdW5kIG1lc3NhZ2UgYnVmZmVyIHNpemUgdmFsdWUgLSBkZWZhdWx0IG9yIHRoZSBnbG9iYWwKKyAgICAgKiBjdXN0b20gdmFsdWUgc2V0IHVzaW5nIHRoZSB7QHZhbHVlIG9yZy5nbGFzc2Zpc2guamVyc2V5LkNvbW1vblByb3BlcnRpZXMjT1VUQk9VTkRfQ09OVEVOVF9MRU5HVEhfQlVGRkVSfSBnbG9iYWwgcHJvcGVydHkuCisgICAgICogPHA+CisgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPHR0PjgxOTI8L3R0Pi4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaXMgPHR0PntAdmFsdWV9PC90dD4uCisgICAgICogPC9wPgorICAgICAqIDxwPlRoaXMgY29uc3RhbnQgaXMgYW4gYWxpYXMgZm9yIHtAbGluayBDb21tb25Qcm9wZXJ0aWVzI09VVEJPVU5EX0NPTlRFTlRfTEVOR1RIX0JVRkZFUl9TRVJWRVJ9PC9wPgorICAgICAqCisgICAgICogQHNpbmNlIDIuMgorICAgICAqLworICAgIEBQcm9wZXJ0eUFsaWFzCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1VUQk9VTkRfQ09OVEVOVF9MRU5HVEhfQlVGRkVSID0gQ29tbW9uUHJvcGVydGllcy5PVVRCT1VORF9DT05URU5UX0xFTkdUSF9CVUZGRVJfU0VSVkVSOworCisgICAgLyoqCisgICAgICogSWYge0Bjb2RlIHRydWV9IHRoZW4gZGlzYWJsZSBjb25maWd1cmF0aW9uIG9mIEpzb24gUHJvY2Vzc2luZyAoSlNSLTM1MykgZmVhdHVyZSBvbiBzZXJ2ZXIuCisgICAgICoKKyAgICAgKiBCeSBkZWZhdWx0IEpzb24gUHJvY2Vzc2luZyBpcyBhdXRvbWF0aWNhbGx5IGVuYWJsZWQgaWYgZ2xvYmFsIHByb3BlcnR5CisgICAgICoge0B2YWx1ZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5Db21tb25Qcm9wZXJ0aWVzI0pTT05fUFJPQ0VTU0lOR19GRUFUVVJFX0RJU0FCTEV9IGlzIG5vdCBkaXNhYmxlZC4gSWYgc2V0IHRoZW4gdGhlIHNlcnZlcgorICAgICAqIHByb3BlcnR5IHZhbHVlIG92ZXJyaWRlcyB0aGUgZ2xvYmFsIHByb3BlcnR5IHZhbHVlLgorICAgICAqIDxwPgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHtAY29kZSBmYWxzZX0uCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDx0dD57QHZhbHVlfTwvdHQ+LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD5UaGlzIGNvbnN0YW50IGlzIGFuIGFsaWFzIGZvciB7QGxpbmsgQ29tbW9uUHJvcGVydGllcyNKU09OX1BST0NFU1NJTkdfRkVBVFVSRV9ESVNBQkxFX1NFUlZFUn08L3A+CisgICAgICoKKyAgICAgKiBAc2VlIG9yZy5nbGFzc2Zpc2guamVyc2V5LkNvbW1vblByb3BlcnRpZXMjSlNPTl9QUk9DRVNTSU5HX0ZFQVRVUkVfRElTQUJMRQorICAgICAqLworICAgIEBQcm9wZXJ0eUFsaWFzCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9QUk9DRVNTSU5HX0ZFQVRVUkVfRElTQUJMRSA9IENvbW1vblByb3BlcnRpZXMuSlNPTl9QUk9DRVNTSU5HX0ZFQVRVUkVfRElTQUJMRV9TRVJWRVI7CisKKyAgICAvKioKKyAgICAgKiBJZiB7QGNvZGUgdHJ1ZX0gdGhlbiBkaXNhYmxlIE1FVEEtSU5GL3NlcnZpY2VzIGxvb2t1cCBvbiBzZXJ2ZXIuCisgICAgICoKKyAgICAgKiBCeSBkZWZhdWx0IEplcnNleSBsb29rcyB1cCBTUEkgaW1wbGVtZW50YXRpb25zIGRlc2NyaWJlZCBieSBNRVRBLUlORi9zZXJ2aWNlcy8qIGZpbGVzLgorICAgICAqIFRoZW4geW91IGNhbiByZWdpc3RlciBhcHByb3ByaWF0ZSBwcm92aWRlciBjbGFzc2VzIGJ5IHtAbGluayBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9ufS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB7QGNvZGUgZmFsc2V9LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKiA8L3A+CisgICAgICogPHA+VGhpcyBjb25zdGFudCBpcyBhbiBhbGlhcyBmb3Ige0BsaW5rIENvbW1vblByb3BlcnRpZXMjTUVUQUlORl9TRVJWSUNFU19MT09LVVBfRElTQUJMRV9TRVJWRVJ9PC9wPgorICAgICAqCisgICAgICogQHNlZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5Db21tb25Qcm9wZXJ0aWVzI01FVEFJTkZfU0VSVklDRVNfTE9PS1VQX0RJU0FCTEUKKyAgICAgKiBAc2luY2UgMi4xCisgICAgICovCisgICAgQFByb3BlcnR5QWxpYXMKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVRBSU5GX1NFUlZJQ0VTX0xPT0tVUF9ESVNBQkxFID0gQ29tbW9uUHJvcGVydGllcy5NRVRBSU5GX1NFUlZJQ0VTX0xPT0tVUF9ESVNBQkxFX1NFUlZFUjsKKworICAgIC8qKgorICAgICAqIElmIHtAY29kZSB0cnVlfSB0aGVuIGRpc2FibGUgY29uZmlndXJhdGlvbiBvZiBNT1h5IEpzb24gZmVhdHVyZSBvbiBzZXJ2ZXIuCisgICAgICoKKyAgICAgKiBCeSBkZWZhdWx0IE1PWHkgSnNvbiBpcyBhdXRvbWF0aWNhbGx5IGVuYWJsZWQgaWYgZ2xvYmFsIHByb3BlcnR5CisgICAgICoge0B2YWx1ZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5Db21tb25Qcm9wZXJ0aWVzI01PWFlfSlNPTl9GRUFUVVJFX0RJU0FCTEV9IGlzIG5vdCBkaXNhYmxlZC4gSWYgc2V0IHRoZW4gdGhlIHNlcnZlcgorICAgICAqIHByb3BlcnR5IHZhbHVlIG92ZXJyaWRlcyB0aGUgZ2xvYmFsIHByb3BlcnR5IHZhbHVlLgorICAgICAqIDxwPgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHtAY29kZSBmYWxzZX0uCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDx0dD57QHZhbHVlfTwvdHQ+LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD5UaGlzIGNvbnN0YW50IGlzIGFuIGFsaWFzIGZvciB7QGxpbmsgQ29tbW9uUHJvcGVydGllcyNNT1hZX0pTT05fRkVBVFVSRV9ESVNBQkxFX1NFUlZFUn08L3A+CisgICAgICoKKyAgICAgKiBAc2VlIG9yZy5nbGFzc2Zpc2guamVyc2V5LkNvbW1vblByb3BlcnRpZXMjTU9YWV9KU09OX0ZFQVRVUkVfRElTQUJMRQorICAgICAqLworICAgIEBQcm9wZXJ0eUFsaWFzCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9YWV9KU09OX0ZFQVRVUkVfRElTQUJMRSA9IENvbW1vblByb3BlcnRpZXMuTU9YWV9KU09OX0ZFQVRVUkVfRElTQUJMRV9TRVJWRVI7CisKKyAgICAvKioKKyAgICAgKiBJZiB7QGNvZGUgdHJ1ZX0gdGhlbiB0aGUgZXh0ZW5zaXZlIHZhbGlkYXRpb24gb2YgYXBwbGljYXRpb24gcmVzb3VyY2UgbW9kZWwgaXMgZGlzYWJsZWQuCisgICAgICoKKyAgICAgKiBUaGlzIGltcGFjdHMgYm90aCB0aGUgdmFsaWRhdGlvbiBvZiByb290IHJlc291cmNlcyBkdXJpbmcgZGVwbG95bWVudCBhcyB3ZWxsIGFzIHZhbGlkYXRpb24gb2YgYW55IHN1YiByZXNvdXJjZXMKKyAgICAgKiByZXR1cm5lZCBmcm9tIHN1Yi1yZXNvdXJjZSBsb2NhdG9ycy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG9wdGlvbiBpcyB0eXBpY2FsbHkgdXNlZCBmb3IgcGVyZm9ybWFuY2UgcHVycG9zZS4gTm90ZSBob3dldmVyIHRoYXQgaW4gY2FzZSB0aGUgYXBwbGljYXRpb24gcmVzb3VyY2UgbW9kZWxzIGFyZQorICAgICAqIG5vdCB2YWxpZCwgc2V0dGluZyB0aGUgcHJvcGVydHkgdG8ge0Bjb2RlIHRydWV9IGNhbiBjYXVzZSBpbnZhbGlkIGJlaGF2aW91ciBhbmQgaGFyZCB0byBkaWFnbm9zZSBpc3N1ZXMgYXQgcnVudGltZS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogQnkgZGVmYXVsdCB0aGUgcmVzb3VyY2UgdmFsaWRhdGlvbiBpcyBydW4gb24gbW9kZWxzIHdoaWNoIGFyZSBjcmVhdGVkIGVpdGhlciBmcm9tIHRoZSBzdXBwbGllZCByZXNvdXJjZSBjbGFzcyBvciBpbnN0YW5jZQorICAgICAqIGFzIHdlbGwgYXMgb24gYW55ICBkaXJlY3RseSBwcm92aWRlZCB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlIHJlc291cmNlfSBtb2RlbHMuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHtAY29kZSBmYWxzZX0uCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDx0dD57QHZhbHVlfTwvdHQ+LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgI1JFU09VUkNFX1ZBTElEQVRJT05fSUdOT1JFX0VSUk9SUworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09VUkNFX1ZBTElEQVRJT05fRElTQUJMRSA9ICJqZXJzZXkuY29uZmlnLnNlcnZlci5yZXNvdXJjZS52YWxpZGF0aW9uLmRpc2FibGUiOworCisgICAgLyoqCisgICAgICogSWYge0Bjb2RlIHRydWV9IHRoZW4gdmFsaWRhdGlvbiBvZiBhcHBsaWNhdGlvbiByZXNvdXJjZSBtb2RlbHMgZG9lcyBub3QgZmFpbCBldmVuIGluIGNhc2Ugb2YgYSBmYXRhbAorICAgICAqIHZhbGlkYXRpb24gZXJyb3JzLiBBbGwgcmVzb3VyY2UgbW9kZWwgdmFsaWRhdGlvbiBpc3N1ZXMgYXJlIHN0aWxsIG91dHB1dCB0byB0aGUgbG9nLCB1bmxlc3MgdGhlIHJlc291cmNlCisgICAgICogbW9kZWwgdmFsaWRhdGlvbiBpcyBjb21wbGV0ZWx5IGRpc2FibGVkIChzZWUge0BsaW5rICNSRVNPVVJDRV9WQUxJREFUSU9OX0RJU0FCTEV9KS4KKyAgICAgKgorICAgICAqIFRoaXMgaW1wYWN0cyBib3RoIHRoZSB2YWxpZGF0aW9uIG9mIHJvb3QgcmVzb3VyY2VzIGR1cmluZyBkZXBsb3ltZW50IGFzIHdlbGwgYXMgdmFsaWRhdGlvbiBvZiBhbnkgc3ViIHJlc291cmNlcworICAgICAqIHJldHVybmVkIGZyb20gc3ViLXJlc291cmNlIGxvY2F0b3JzLiBUaGUgb3B0aW9uIGlzIHR5cGljYWxseSB1c2VkIGR1cmluZyBkZXZlbG9wbWVudCBhbmQgdGVzdGluZy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB7QGNvZGUgZmFsc2V9LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAc2VlICNSRVNPVVJDRV9WQUxJREFUSU9OX0RJU0FCTEUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9WQUxJREFUSU9OX0lHTk9SRV9FUlJPUlMgPQorICAgICAgICAgICAgImplcnNleS5jb25maWcuc2VydmVyLnJlc291cmNlLnZhbGlkYXRpb24uaWdub3JlRXJyb3JzIjsKKworICAgIC8qKgorICAgICAqIElmIHtAY29kZSB0cnVlfSB0aGVuIGFwcGxpY2F0aW9uIG1vbml0b3Jpbmcgd2lsbCBiZSBlbmFibGVkLgorICAgICAqCisgICAgICogVGhpcyB3aWxsIGVuYWJsZSB0aGUgcG9zc2liaWxpdHkKKyAgICAgKiBvZiBpbmplY3Rpbmcge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLkFwcGxpY2F0aW9uSW5mb30gaW50byByZXNvdXJjZSBhbmQgcHJvdmlkZXJzLgorICAgICAqIDxwPgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHtAY29kZSBmYWxzZX0uCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDx0dD57QHZhbHVlfTwvdHQ+LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBzaW5jZSAyLjEyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9OSVRPUklOR19FTkFCTEVEID0gImplcnNleS5jb25maWcuc2VydmVyLm1vbml0b3JpbmcuZW5hYmxlZCI7CisKKyAgICAvKioKKyAgICAgKiBJZiB7QGNvZGUgdHJ1ZX0gdGhlbiBjYWxjdWxhdGlvbiBvZiBtb25pdG9yaW5nIHN0YXRpc3RpY3Mgd2lsbCBiZSBlbmFibGVkLgorICAgICAqCisgICAgICogVGhpcyB3aWxsIGVuYWJsZSB0aGUgcG9zc2liaWxpdHkKKyAgICAgKiBvZiBpbmplY3Rpbmcge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLk1vbml0b3JpbmdTdGF0aXN0aWNzfSBpbnRvIHJlc291cmNlIGFuZCBwcm92aWRlcnMKKyAgICAgKiBhbmQgYWxzbyB0aGUgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMKKyAgICAgKiBpbXBsZW1lbnRpbmcge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLk1vbml0b3JpbmdTdGF0aXN0aWNzTGlzdGVuZXJ9IHdpbGwgYmUgY2FsbGVkCisgICAgICogd2hlbiBzdGF0aXN0aWNzIGFyZSBhdmFpbGFibGUuCisgICAgICogTW9uaXRvcmluZyBzdGF0aXN0aWNzIGV4dGVuZHMgYmFzaWMgbW9uaXRvcmluZyBmZWF0dXJlLiBUaGVyZWZvcmUgd2hlbiBlbmFibGVkLAorICAgICAqIHRoZSBtb25pdG9yaW5nIGdldHMgYXV0b21hdGljYWxseSBlbmFibGVkIHRvbyAodGhlIHNhbWUgcmVzdWx0IGFzIHNldHRpbmcgdGhlIHByb3BlcnR5CisgICAgICoge0BsaW5rICNNT05JVE9SSU5HX0VOQUJMRUR9IHtAY29kZSB0cnVlfSkuCisgICAgICogRW5hYmxpbmcgc3RhdGlzdGljcyBoYXMgbmVnYXRpdmUgcGVyZm9ybWFuY2UgaW1wYWN0IGFuZCB0aGVyZWZvcmUgc2hvdWxkCisgICAgICogYmUgZW5hYmxlZCBvbmx5IHdoZW4gbmVlZGVkLgorICAgICAqIDxwPgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHtAY29kZSBmYWxzZX0uCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDx0dD57QHZhbHVlfTwvdHQ+LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuTW9uaXRvcmluZ1N0YXRpc3RpY3MKKyAgICAgKiBAc2VlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLk1vbml0b3JpbmdTdGF0aXN0aWNzTGlzdGVuZXIKKyAgICAgKiBAc2VlICNNT05JVE9SSU5HX0VOQUJMRUQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNT05JVE9SSU5HX1NUQVRJU1RJQ1NfRU5BQkxFRCA9ICJqZXJzZXkuY29uZmlnLnNlcnZlci5tb25pdG9yaW5nLnN0YXRpc3RpY3MuZW5hYmxlZCI7CisKKyAgICAvKioKKyAgICAgKiBJZiB7QGNvZGUgdHJ1ZX0gdGhlbiBKZXJzZXkgd2lsbCBleHBvc2UgTUJlYW5zIHdpdGggbW9uaXRvcmluZyBzdGF0aXN0aWNzLgorICAgICAqCisgICAgICogRXhwb3NlZCBKTVggTUJlYW5zIGFyZSBiYXNlZAorICAgICAqIG9uIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5Nb25pdG9yaW5nU3RhdGlzdGljc30gYW5kIHRoZXJlZm9yZSB3aGVuIHRoZXkgYXJlIGVuYWJsZWQsCisgICAgICogYWxzbyB0aGUgY2FsY3VsYXRpb24gb2YgbW9uaXRvcmluZyBzdGF0aXN0aWNzIG5lZWRzIHRvIGJlIGVuYWJsZWQuIFRoZXJlZm9yZSBpZiB0aGlzIHByb3BlcnR5IGlzIHtAY29kZSB0cnVlfQorICAgICAqIHRoZSBjYWxjdWxhdGlvbiBvZiBtb25pdG9yaW5nIHN0YXRpc3RpY3MgaXMgYXV0b21hdGljYWxseSBlbmFibGVkICh0aGUgc2FtZSByZXN1bHQgYXMgc2V0dGluZyB0aGUgcHJvcGVydHkKKyAgICAgKiB7QGxpbmsgI01PTklUT1JJTkdfU1RBVElTVElDU19FTkFCTEVEfSB0byB7QGNvZGUgdHJ1ZX0pLgorICAgICAqIDxwLz4KKyAgICAgKiBFbmFibGluZyBzdGF0aXN0aWNzIE1CZWFucyBoYXMgbmVnYXRpdmUKKyAgICAgKiBwZXJmb3JtYW5jZSBpbXBhY3QgYW5kIHRoZXJlZm9yZSBzaG91bGQgYmUgZW5hYmxlZCBvbmx5IHdoZW4gbmVlZGVkLgorICAgICAqIDxwPgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHtAY29kZSBmYWxzZX0uCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDx0dD57QHZhbHVlfTwvdHQ+LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgI01PTklUT1JJTkdfU1RBVElTVElDU19FTkFCTEVECisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTU9OSVRPUklOR19TVEFUSVNUSUNTX01CRUFOU19FTkFCTEVEID0gImplcnNleS5jb25maWcuc2VydmVyLm1vbml0b3Jpbmcuc3RhdGlzdGljcy5tYmVhbnMuZW5hYmxlZCI7CisKKyAgICAvKioKKyAgICAgKiBJbnRlcnZhbCAoaW4ge0Bjb2RlIG1zfSkgaW5kaWNhdGluZyBob3cgb2Z0ZW4gd2lsbCBiZSBtb25pdG9yaW5nIHN0YXRpc3RpY3MgcmVmcmVzaGVkIGFuZAorICAgICAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5Nb25pdG9yaW5nU3RhdGlzdGljc0xpc3RlbmVyI29uU3RhdGlzdGljcyhvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5Nb25pdG9yaW5nU3RhdGlzdGljcykgb25TdGF0aXN0aWNzfQorICAgICAqIG1ldGhvZCBjYWxsZWQuCisgICAgICogPHAvPgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHtAY29kZSA1MDB9LgorICAgICAqIDxwLz4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKiA8cC8+CisgICAgICoKKyAgICAgKiBAc2luY2UgMi4xMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1PTklUT1JJTkdfU1RBVElTVElDU19SRUZSRVNIX0lOVEVSVkFMID0KKyAgICAgICAgICAgICJqZXJzZXkuY29uZmlnLnNlcnZlci5tb25pdG9yaW5nLnN0YXRpc3RpY3MucmVmcmVzaC5pbnRlcnZhbCI7CisKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgU3RyaW5nfSBwcm9wZXJ0eSB0aGF0IGRlZmluZXMgdGhlIGFwcGxpY2F0aW9uIG5hbWUuCisgICAgICoKKyAgICAgKiBUaGUgbmFtZSBpcyBhbiBhcmJpdHJhcnkgdXNlciBkZWZpbmVkIG5hbWUKKyAgICAgKiB3aGljaCBpcyB1c2VkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gSmVyc2V5IGFwcGxpY2F0aW9ucyBpbiB0aGUgY2FzZSB0aGF0IG1vcmUgYXBwbGljYXRpb25zCisgICAgICogYXJlIGRlcGxveWVkIG9uIHRoZSBzYW1lIHJ1bnRpbWUgKGNvbnRhaW5lcikuIFRoZSBuYW1lIGNhbiBiZSB1c2VkIGZvciBleGFtcGxlIGZvciBwdXJwb3NlcworICAgICAqIG9mIG1vbml0b3JpbmcgYnkgSk1YIHdoZW4gbmFtZSBpZGVudGlmaWVzIHRvIHdoaWNoIGFwcGxpY2F0aW9uIGRlcGxveWVkIE1CZWFucyBiZWxvbmcgdG8uCisgICAgICogVGhlIG5hbWUgc2hvdWxkIGJlIHVuaXF1ZSBpbiB0aGUgcnVudGltZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgcHJvcGVydHkgaXMgaWdub3JlZAorICAgICAqIGlmIHRoZSBhcHBsaWNhdGlvbiBuYW1lIGlzIHNldCBwcm9ncmFtbWF0aWNhbGx5IGJ5CisgICAgICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZyNnZXRBcHBsaWNhdGlvbk5hbWUoKX0uCisgICAgICogPC9wLz4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGVyZSBpcyBubyBkZWZhdWx0IHZhbHVlLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTElDQVRJT05fTkFNRSA9ICJqZXJzZXkuY29uZmlnLnNlcnZlci5hcHBsaWNhdGlvbi5uYW1lIjsKKworICAgIC8qKgorICAgICAqIEVuYWJsZSB0cmFjaW5nIHN1cHBvcnQuCisgICAgICoKKyAgICAgKiBJdCBhbGxvd3Mgc2VydmljZSBkZXZlbG9wZXIgdG8gZ2V0IGRpYWdub3N0aWMgaW5mb3JtYXRpb24gYWJvdXQgcmVxdWVzdCBwcm9jZXNzaW5nIGJ5IEplcnNleS4KKyAgICAgKiBUaG9zZSBkaWFnbm9zdGljL3RyYWNpbmcgaW5mb3JtYXRpb24gYXJlIHJldHVybmVkIGluIHJlc3BvbnNlIGhlYWRlcnMgKHtAY29kZSBYLUplcnNleS1UcmFjaW5nLW5ubn0pLgorICAgICAqIFRoZSBmZWF0dXJlIHNob3VsZCBub3QgYmUgc3dpdGNoZWQgb24gb24gcHJvZHVjdGlvbiBlbnZpcm9ubWVudC4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEFsbG93ZWQgdmFsdWVzOgorICAgICAqIDx1bD4KKyAgICAgKiAgICAgPGxpPntAY29kZSBPRkZ9IC0gdHJhY2luZyBzdXBwb3J0IGlzIGRpc2FibGVkLjwvbGk+CisgICAgICogICAgIDxsaT57QGNvZGUgT05fREVNQU5EfSAtIHRyYWNpbmcgc3VwcG9ydCBpcyBpbiAnc3RhbmQgYnknIG1vZGUsIGl0IGlzIGVuYWJsZWQgb24gZGVtYW5kIGJ5IGV4aXN0ZW5jZSBvZiByZXF1ZXN0IEhUVFAgaGVhZGVyPC9saT4KKyAgICAgKiAgICAgPGxpPntAY29kZSBBTEx9IC0gdHJhY2luZyBzdXBwb3J0IGlzIGVuYWJsZWQgZm9yIGV2ZXJ5IHJlcXVlc3QuPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIFR5cGUgb2YgdGhlIHByb3BlcnR5IHZhbHVlIGlzIHtAY29kZSBTdHJpbmd9LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB7QGNvZGUgIk9GRiJ9LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAc2luY2UgMi4zCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJBQ0lORyA9ICJqZXJzZXkuY29uZmlnLnNlcnZlci50cmFjaW5nLnR5cGUiOworCisgICAgLyoqCisgICAgICogU2V0IGxldmVsIG8gdHJhY2luZyBpbmZvcm1hdGlvbi4KKyAgICAgKgorICAgICAqIFRoZSBwcm9wZXJ0eSBhbGxvd3MgdG8gc2V0IGFwcGxpY2F0aW9uIGRlZmF1bHQgbGV2ZWwgbyBkaWFnbm9zdGljIGluZm9ybWF0aW9uLgorICAgICAqIFRyYWNpbmcgbGV2ZWwgY2FuIGJlIGNoYW5nZWQgZm9yIGVhY2ggcmVxdWVzdCBieSBzcGVjaWZ5aW5nIHJlcXVlc3QgSFRUUCBoZWFkZXIge0Bjb2RlIFgtSmVyc2V5LVRyYWNpbmctVGhyZXNob2xkfS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEFsbG93ZWQgdmFsdWVzOgorICAgICAqIDx1bD4KKyAgICAgKiAgICAgPGxpPntAY29kZSBTVU1NQVJZfTwvbGk+CisgICAgICogICAgIDxsaT57QGNvZGUgVFJBQ0V9PC9saT4KKyAgICAgKiAgICAgPGxpPntAY29kZSBWRVJCT1NFfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiBUeXBlIG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyB7QGNvZGUgU3RyaW5nfS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMge0Bjb2RlICJUUkFDRSJ9LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAc2VlICNUUkFDSU5HCisgICAgICogQHNpbmNlIDIuMworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRSQUNJTkdfVEhSRVNIT0xEID0gImplcnNleS5jb25maWcuc2VydmVyLnRyYWNpbmcudGhyZXNob2xkIjsKKworICAgIC8qKgorICAgICAqIFdoZW5ldmVyIHJlc3BvbnNlIHN0YXR1cyBpcyB7QGNvZGUgNHh4fSBvciB7QGNvZGUgNXh4fSBpdCBpcyBwb3NzaWJsZSB0byBjaG9vc2UgYmV0d2VlbiB7QGNvZGUgc2VuZEVycm9yfSBvcgorICAgICAqIHtAY29kZSBzZXRTdGF0dXN9IG9uIGNvbnRhaW5lciBzcGVjaWZpYyB7QGNvZGUgUmVzcG9uc2V9IGltcGxlbWVudGF0aW9uLiBFLmcuIG9uIHNlcnZsZXQgY29udGFpbmVyIEplcnNleQorICAgICAqIGNhbiBjYWxsIHtAY29kZSBIdHRwU2VydmxldFJlc3BvbnNlLnNldFN0YXR1cyguLi4pfSBvciB7QGNvZGUgSHR0cFNlcnZsZXRSZXNwb25zZS5zZW5kRXJyb3IoLi4uKX0uCisgICAgICogPHA+CisgICAgICogQ2FsbGluZyB7QGNvZGUgc2VuZEVycm9yKC4uLil9IG1ldGhvZCB1c3VhbGx5IHJlc2V0cyBlbnRpdHksIHJlc3BvbnNlIGhlYWRlcnMgYW5kIHByb3ZpZGUgZXJyb3IgcGFnZSBmb3IKKyAgICAgKiBzcGVjaWZpZWQgc3RhdHVzIGNvZGUgKGUuZy4gc2VydmxldCB7QGNvZGUgZXJyb3ItcGFnZX0gY29uZmlndXJhdGlvbikuCisgICAgICogSG93ZXZlciBpZiB5b3Ugd2FudCB0byBwb3N0LXByb2Nlc3MgcmVzcG9uc2UgKGUuZy4gYnkgc2VydmxldCBmaWx0ZXIpIHRoZSBvbmx5CisgICAgICogd2F5IHRvIGRvIGl0IGlzIGNhbGxpbmcge0Bjb2RlIHNldFN0YXR1cyguLi4pfSBvbiBjb250YWluZXIgUmVzcG9uc2Ugb2JqZWN0LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiBwcm9wZXJ0eSB2YWx1ZSBpcyB7QGNvZGUgdHJ1ZX0gdGhlIG1ldGhvZCB7QGNvZGUgUmVzcG9uc2Uuc2V0U3RhdHVzKC4uLil9IGlzIHVzZWQgb3ZlciBkZWZhdWx0CisgICAgICoge0Bjb2RlIFJlc3BvbnNlLnNlbmRFcnJvciguLi4pfS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVHlwZSBvZiB0aGUgcHJvcGVydHkgdmFsdWUgaXMge0Bjb2RlIGJvb2xlYW59LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB7QGNvZGUgZmFsc2V9LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAc2luY2UgMi41CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTUE9OU0VfU0VUX1NUQVRVU19PVkVSX1NFTkRfRVJST1IgPSAiamVyc2V5LmNvbmZpZy5zZXJ2ZXIucmVzcG9uc2Uuc2V0U3RhdHVzT3ZlclNlbmRFcnJvciI7CisKKyAgICAvKioKKyAgICAgKiBJZiBwcm9wZXJ0eSB2YWx1ZSBpcyB7QGNvZGUgdHJ1ZX0gdGhlbiB0aGUgZXJyb3JzIHJhaXNlZCBkdXJpbmcgcmVzcG9uc2UgcHJvY2Vzc2luZyBhcmUgdHJpZWQgdG8gaGFuZGxlZCB1c2luZyBhdmFpbGFibGUKKyAgICAgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5SZXNwb25zZUVycm9yTWFwcGVyIHJlc3BvbnNlIGVycm9yIG1hcHBlcnN9LgorICAgICAqIDxwPgorICAgICAqIFR5cGUgb2YgdGhlIHByb3BlcnR5IHZhbHVlIGlzIHtAY29kZSBib29sZWFufS4gVGhlIGRlZmF1bHQgdmFsdWUgaXMge0Bjb2RlIGZhbHNlfS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaXMgPHR0PntAdmFsdWV9PC90dD4uCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHNpbmNlIDIuOAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBST0NFU1NJTkdfUkVTUE9OU0VfRVJST1JTX0VOQUJMRUQgPSAiamVyc2V5LmNvbmZpZy5zZXJ2ZXIuZXhjZXB0aW9uLnByb2Nlc3NSZXNwb25zZUVycm9ycyI7CisKKyAgICAvKioKKyAgICAgKiBBbiBpbnRlZ2VyIHZhbHVlIHRoYXQgZGVmaW5lcyB0aGUgc2l6ZSBvZiBjYWNoZSBmb3Igc3ViLXJlc291cmNlIGxvY2F0b3IgbW9kZWxzLiBUaGUgY2FjaGUgaXMgdXNlZCB0byBwcm92aWRlIGJldHRlcgorICAgICAqIHBlcmZvcm1hbmNlIGZvciBhcHBsaWNhdGlvbiB0aGF0IHVzZXMgSkFYLVJTIHN1Yi1yZXNvdXJjZSBsb2NhdG9ycy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB7QHZhbHVlICNTVUJSRVNPVVJDRV9MT0NBVE9SX0RFRkFVTFRfQ0FDSEVfU0laRX0uCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDx0dD57QHZhbHVlfTwvdHQ+LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgI1NVQlJFU09VUkNFX0xPQ0FUT1JfREVGQVVMVF9DQUNIRV9TSVpFCisgICAgICogQHNlZSAjU1VCUkVTT1VSQ0VfTE9DQVRPUl9DQUNIRV9BR0UKKyAgICAgKiBAc2luY2UgMi4xNgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQlJFU09VUkNFX0xPQ0FUT1JfQ0FDSEVfU0laRSA9ICJqZXJzZXkuY29uZmlnLnNlcnZlci5zdWJyZXNvdXJjZS5jYWNoZS5zaXplIjsKKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IHN1Yi1yZXNvdXJjZSBsb2NhdG9yIGNhY2hlIHNpemUgKHtAdmFsdWV9KS4KKyAgICAgKgorICAgICAqIEBzZWUgI1NVQlJFU09VUkNFX0xPQ0FUT1JfQ0FDSEVfU0laRQorICAgICAqIEBzaW5jZSAyLjE2CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU1VCUkVTT1VSQ0VfTE9DQVRPUl9ERUZBVUxUX0NBQ0hFX1NJWkUgPSA2NDsKKworICAgIC8qKgorICAgICAqIEFuIGludGVnZXIgdmFsdWUgdGhhdCBkZWZpbmVzIHRoZSBtYXhpbXVtIGFnZSAoaW4gc2Vjb25kcykgZm9yIGNhY2hlZCBmb3Igc3ViLXJlc291cmNlIGxvY2F0b3IgbW9kZWxzLiBUaGUgYWdlIG9mIGFuIGNhY2hlCisgICAgICogZW50cnkgaXMgZGVmaW5lZCBhcyB0aGUgdGltZSBzaW5jZSB0aGUgbGFzdCBhY2Nlc3MgKHJlYWQpIHRvIHRoZSBlbnRyeSBpbiB0aGUgY2FjaGUuCisgICAgICogPHA+CisgICAgICogRW50cnkgYWdpbmcgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdC4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaXMgPHR0PntAdmFsdWV9PC90dD4uCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHNlZSAjU1VCUkVTT1VSQ0VfTE9DQVRPUl9DQUNIRV9TSVpFCisgICAgICogQHNpbmNlIDIuMTYKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVUJSRVNPVVJDRV9MT0NBVE9SX0NBQ0hFX0FHRSA9ICJqZXJzZXkuY29uZmlnLnNlcnZlci5zdWJyZXNvdXJjZS5jYWNoZS5hZ2UiOworCisgICAgLyoqCisgICAgICogSWYge0Bjb2RlIHRydWV9IHRoZW4gSmVyc2V5IHdpbGwgY2FjaGUge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZSBKZXJzZXkgcmVzb3VyY2VzfSBpbiBhZGRpdGlvbiB0bworICAgICAqIGNhY2hpbmcgc3ViLXJlc291cmNlIGxvY2F0b3IgY2xhc3NlcyBhbmQgaW5zdGFuY2VzICh3aGljaCBhcmUgY2FjaGVkIGJ5IGRlZmF1bHQpLgorICAgICAqIDxwLz4KKyAgICAgKiBUbyBtYWtlIHN1cmUgdGhlIGNhY2hpbmcgaXMgZWZmZWN0aXZlIGluIHRoaXMgY2FzZSB5b3UgbmVlZCB0byByZXR1cm4gc2FtZSBKZXJzZXkgUmVzb3VyY2UgaW5zdGFuY2VzIGZvciBzYW1lIGlucHV0CisgICAgICogcGFyYW1ldGVycyBmcm9tIHJlc291cmNlIG1ldGhvZC4gVGhpcyBtZWFucyB0aGF0IGdlbmVyYXRpbmcgbmV3IEplcnNleSBSZXNvdXJjZSBpbnN0YW5jZXMgZm9yIHNhbWUgaW5wdXQgcGFyYW1ldGVycyB3b3VsZAorICAgICAqIG5vdCBoYXZlIGFueSBwZXJmb3JtYW5jZSBlZmZlY3QgYW5kIGl0IHdvdWxkIG9ubHkgZmlsbC11cCB0aGUgY2FjaGUuCisgICAgICogPHA+CisgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMge0Bjb2RlIGZhbHNlfS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaXMgPHR0PntAdmFsdWV9PC90dD4uCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNVQlJFU09VUkNFX0xPQ0FUT1JfQ0FDSEVfSkVSU0VZX1JFU09VUkNFX0VOQUJMRUQgPQorICAgICAgICAgICAgImplcnNleS5jb25maWcuc2VydmVyLnN1YnJlc291cmNlLmNhY2hlLmplcnNleS5yZXNvdXJjZS5lbmFibGVkIjsKKworICAgIC8qKgorICAgICAqIElmIHtAY29kZSB0cnVlfSB0aGVuIEplcnNleSB3aWxsIHJlc29sdmUgcmVsYXRpdmUgVVJJcyBpbiB0aGUge0Bjb2RlIExvY2F0aW9ufSBodHRwIGhlYWRlciBhZ2FpbnN0IHRoZQorICAgICAqIHJlcXVlc3QgVVJJIGFjY29yZGluZyB0byBSRkM3MjMxIChuZXcgSFRUUCBTcGVjaWZpY2F0aW9uKS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgYmVoYXZpb3VyIHZpb2xhdGVzIHRoZSBKQVgtUlMgMi4wIHNwZWNpZmljYXRpb24gKHdoaWNoIGRhdGVzIG9sZGVyIHRoYW4gUkZDNzIzMSkuCisgICAgICogSWYge0BsaW5rICNMT0NBVElPTl9IRUFERVJfUkVMQVRJVkVfVVJJX1JFU09MVVRJT05fRElTQUJMRUR9IGlzIHNldCB0byB7QGNvZGUgdHJ1ZX0sIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgaXMgbm90IHRha2VuCisgICAgICogaW50byBhY2NvdW50LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHtAY29kZSBmYWxzZX0gKEpBWC1SUyAyLjAgY29tcGxpYW50KS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaXMgPHR0PntAdmFsdWV9PC90dD4uCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHNpbmNlIDIuMjIuMQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIExPQ0FUSU9OX0hFQURFUl9SRUxBVElWRV9VUklfUkVTT0xVVElPTl9SRkM3MjMxID0KKyAgICAgICAgICAgICJqZXJzZXkuY29uZmlnLnNlcnZlci5oZWFkZXJzLmxvY2F0aW9uLnJlbGF0aXZlLnJlc29sdXRpb24ucmZjNzIzMSI7CisKKyAgICAvKioKKyAgICAgKiBJZiB7QGNvZGUgdHJ1ZX0gdGhlbiBKZXJzZXkgd2lsbCBub3QgYXR0ZW1wdCB0byByZXNvbHZlIHJlbGF0aXZlIFVSSXMgaW4gdGhlIHtAY29kZSBMb2NhdGlvbn0gaHR0cCBoZWFkZXIgYWdhaW5zdCB0aGUKKyAgICAgKiByZXF1ZXN0IFVSSS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHtAY29kZSBmYWxzZX0uCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDx0dD57QHZhbHVlfTwvdHQ+LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBzaW5jZSAyLjIyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9DQVRJT05fSEVBREVSX1JFTEFUSVZFX1VSSV9SRVNPTFVUSU9OX0RJU0FCTEVEID0KKyAgICAgICAgICAgICJqZXJzZXkuY29uZmlnLnNlcnZlci5oZWFkZXJzLmxvY2F0aW9uLnJlbGF0aXZlLnJlc29sdXRpb24uZGlzYWJsZWQiOworCisgICAgcHJpdmF0ZSBTZXJ2ZXJQcm9wZXJ0aWVzKCkgeworICAgICAgICAvLyBwcmV2ZW50cyBpbnN0YW50aWF0aW9uCisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5LgorICAgICAqCisgICAgICogSWYgdGhlIHByb3BlcnR5IGlzIG5vdCBzZXQgb3IgdGhlIHJlYWwgdmFsdWUgdHlwZSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUgdHlwZSwKKyAgICAgKiByZXR1cm5zIHtAY29kZSBudWxsfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzICAgIE1hcCBvZiBwcm9wZXJ0aWVzIHRvIGdldCB0aGUgcHJvcGVydHkgdmFsdWUgZnJvbS4KKyAgICAgKiBAcGFyYW0ga2V5ICAgICAgICAgICBOYW1lIG9mIHRoZSBwcm9wZXJ0eS4KKyAgICAgKiBAcGFyYW0gdHlwZSAgICAgICAgICBUeXBlIHRvIHJldHJpZXZlIHRoZSB2YWx1ZSBhcy4KKyAgICAgKiBAcGFyYW0gPFQ+ICAgICAgICAgICBUeXBlIG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuICAgICAgICAgICAgICBWYWx1ZSBvZiB0aGUgcHJvcGVydHkgb3Ige0Bjb2RlIG51bGx9LgorICAgICAqCisgICAgICogQHNpbmNlIDIuOAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFQgZ2V0VmFsdWUoZmluYWwgTWFwPFN0cmluZywgPz4gcHJvcGVydGllcywgZmluYWwgU3RyaW5nIGtleSwgZmluYWwgQ2xhc3M8VD4gdHlwZSkgeworICAgICAgICByZXR1cm4gUHJvcGVydGllc0hlbHBlci5nZXRWYWx1ZShwcm9wZXJ0aWVzLCBrZXksIHR5cGUsIG51bGwpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5LgorICAgICAqCisgICAgICogSWYgdGhlIHByb3BlcnR5IGlzIG5vdCBzZXQgb3IgdGhlIHJlYWwgdmFsdWUgdHlwZSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHtAY29kZSBkZWZhdWx0VmFsdWV9IHR5cGUsCisgICAgICogdGhlIHNwZWNpZmllZCB7QGNvZGUgZGVmYXVsdFZhbHVlfSBpcyByZXR1cm5lZC4gQ2FsbGluZyB0aGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvIGNhbGxpbmcKKyAgICAgKiB7QGNvZGUgU2VydmVyUHJvcGVydGllcy5nZXRWYWx1ZShwcm9wZXJ0aWVzLCBrZXksIGRlZmF1bHRWYWx1ZSwgKENsYXNzJmx0O1QmZ3Q7KSBkZWZhdWx0VmFsdWUuZ2V0Q2xhc3MoKSl9LgorICAgICAqCisgICAgICogQHBhcmFtIHByb3BlcnRpZXMgICAgTWFwIG9mIHByb3BlcnRpZXMgdG8gZ2V0IHRoZSBwcm9wZXJ0eSB2YWx1ZSBmcm9tLgorICAgICAqIEBwYXJhbSBrZXkgIE5hbWUgb2YgdGhlIHByb3BlcnR5LgorICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgIERlZmF1bHQgdmFsdWUgaWYgcHJvcGVydHkgaXMgbm90IHJlZ2lzdGVyZWQKKyAgICAgKiBAcGFyYW0gPFQ+ICAgICAgICAgICBUeXBlIG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuICAgICAgICAgICAgICBWYWx1ZSBvZiB0aGUgcHJvcGVydHkgb3Ige0Bjb2RlIG51bGx9LgorICAgICAqCisgICAgICogQHNpbmNlIDIuOAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IFQgZ2V0VmFsdWUoZmluYWwgTWFwPFN0cmluZywgPz4gcHJvcGVydGllcywgZmluYWwgU3RyaW5nIGtleSwgZmluYWwgVCBkZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIFByb3BlcnRpZXNIZWxwZXIuZ2V0VmFsdWUocHJvcGVydGllcywga2V5LCBkZWZhdWx0VmFsdWUsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIElmIHRoZSBwcm9wZXJ0eSBpcyBub3Qgc2V0IG9yIHRoZSByZWFsIHZhbHVlIHR5cGUgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlIHR5cGUsCisgICAgICogcmV0dXJucyB7QGNvZGUgZGVmYXVsdFZhbHVlfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzICAgIE1hcCBvZiBwcm9wZXJ0aWVzIHRvIGdldCB0aGUgcHJvcGVydHkgdmFsdWUgZnJvbS4KKyAgICAgKiBAcGFyYW0ga2V5ICBOYW1lIG9mIHRoZSBwcm9wZXJ0eS4KKyAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlICBEZWZhdWx0IHZhbHVlIGlmIHByb3BlcnR5IGlzIG5vdCByZWdpc3RlcmVkCisgICAgICogQHBhcmFtIHR5cGUgICAgICAgICAgVHlwZSB0byByZXRyaWV2ZSB0aGUgdmFsdWUgYXMuCisgICAgICogQHBhcmFtIDxUPiAgICAgICAgICAgVHlwZSBvZiB0aGUgcHJvcGVydHkgdmFsdWUuCisgICAgICogQHJldHVybiAgICAgICAgICAgICAgVmFsdWUgb2YgdGhlIHByb3BlcnR5IG9yIHtAY29kZSBudWxsfS4KKyAgICAgKgorICAgICAqIEBzaW5jZSAyLjgKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUPiBUIGdldFZhbHVlKGZpbmFsIE1hcDxTdHJpbmcsID8+IHByb3BlcnRpZXMsIGZpbmFsIFN0cmluZyBrZXksIGZpbmFsIFQgZGVmYXVsdFZhbHVlLCBmaW5hbCBDbGFzczxUPiB0eXBlKSB7CisgICAgICAgIHJldHVybiBQcm9wZXJ0aWVzSGVscGVyLmdldFZhbHVlKHByb3BlcnRpZXMsIGtleSwgZGVmYXVsdFZhbHVlLCB0eXBlLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBJZiB0aGUgcHJvcGVydHkgaXMgbm90IHNldCBvciB0aGUgcmVhbCB2YWx1ZSB0eXBlIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZSB0eXBlLAorICAgICAqIHJldHVybnMge0Bjb2RlIGRlZmF1bHRWYWx1ZX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvcGVydGllcyAgICBNYXAgb2YgcHJvcGVydGllcyB0byBnZXQgdGhlIHByb3BlcnR5IHZhbHVlIGZyb20uCisgICAgICogQHBhcmFtIHJ1bnRpbWVUeXBlICAgUnVudGltZSB0eXBlIHdoaWNoIGlzIHVzZWQgdG8gY2hlY2sgd2hldGhlciB0aGVyZSBpcyBhIHByb3BlcnR5IHdpdGggdGhlIHNhbWUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB7QGNvZGUga2V5fSBidXQgcG9zdC1maXhlZCBieSBydW50aW1lIHR5cGUgKDx0dD4uc2VydmVyPC90dD4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvciB7QGNvZGUgLmNsaWVudH0pIHdoaWNoIHdvdWxkIG92ZXJyaWRlIHRoZSB7QGNvZGUga2V5fSBwcm9wZXJ0eS4KKyAgICAgKiBAcGFyYW0ga2V5ICBOYW1lIG9mIHRoZSBwcm9wZXJ0eS4KKyAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlICBEZWZhdWx0IHZhbHVlIGlmIHByb3BlcnR5IGlzIG5vdCByZWdpc3RlcmVkCisgICAgICogQHBhcmFtIHR5cGUgICAgICAgICAgVHlwZSB0byByZXRyaWV2ZSB0aGUgdmFsdWUgYXMuCisgICAgICogQHBhcmFtIDxUPiAgICAgICAgICAgVHlwZSBvZiB0aGUgcHJvcGVydHkgdmFsdWUuCisgICAgICogQHJldHVybiAgICAgICAgICAgICAgVmFsdWUgb2YgdGhlIHByb3BlcnR5IG9yIHtAY29kZSBudWxsfS4KKyAgICAgKgorICAgICAqIEBzaW5jZSAyLjgKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUPiBUIGdldFZhbHVlKGZpbmFsIE1hcDxTdHJpbmcsID8+IHByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSdW50aW1lVHlwZSBydW50aW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUIGRlZmF1bHRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPFQ+IHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIFByb3BlcnRpZXNIZWxwZXIuZ2V0VmFsdWUocHJvcGVydGllcywgcnVudGltZVR5cGUsIGtleSwgZGVmYXVsdFZhbHVlLCB0eXBlLCBudWxsKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9TZXJ2ZXJSdW50aW1lLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9TZXJ2ZXJSdW50aW1lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM0OGIzOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL1NlcnZlclJ1bnRpbWUuamF2YQpAQCAtMCwwICsxLDExODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudExpbmtlZFF1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRFeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuSHR0cE1ldGhvZDsKK2ltcG9ydCBqYXZheC53cy5ycy5JbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLk5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLlNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQXN5bmNSZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29tcGxldGlvbkNhbGxiYWNrOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db25uZWN0aW9uQ2FsbGJhY2s7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlRpbWVvdXRIYW5kbGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuRXhjZXB0aW9uTWFwcGVyOworCitpbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmEuUHJlY29uZGl0aW9uczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuUHJvdmlkZXJzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuQ2xvc3VyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlByb2R1Y2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUHJvcGVydGllc0hlbHBlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uUmVmOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5SZWZzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5WYWx1ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkhlYWRlclZhbHVlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuTWVzc2FnZUJvZHlQcm92aWRlck5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuT3V0Ym91bmRKYXhyc1Jlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuT3V0Ym91bmRNZXNzYWdlQ29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLlRyYWNpbmdMb2dnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5pbnRlcm5hbC5SZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLmludGVybmFsLlJlcXVlc3RTY29wZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLmludGVybmFsLlN0YWdlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWwuU3RhZ2VzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuUHJvY2Vzc2luZ1Byb3ZpZGVyczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuU2VydmVyVHJhY2VFdmVudDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwubW9uaXRvcmluZy5FbXB0eVJlcXVlc3RFdmVudEJ1aWxkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLm1vbml0b3JpbmcuUmVxdWVzdEV2ZW50QnVpbGRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwubW9uaXRvcmluZy5SZXF1ZXN0RXZlbnRJbXBsOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5wcm9jZXNzLkVuZHBvaW50OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5wcm9jZXNzLk1hcHBhYmxlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5wcm9jZXNzLlJlcXVlc3RQcm9jZXNzaW5nQ29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwucm91dGluZy5VcmlSb3V0aW5nQ29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5BcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuUmVxdWVzdEV2ZW50OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLlJlcXVlc3RFdmVudExpc3RlbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29udGFpbmVyUmVzcG9uc2VXcml0ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5FeHRlcm5hbFJlcXVlc3RDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuRXh0ZXJuYWxSZXF1ZXN0U2NvcGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5SZXNwb25zZUVycm9yTWFwcGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5FeGNlcHRpb25NYXBwZXJzOworCitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Bc3luY0NvbnRleHQuU3RhdGUuQ09NUExFVEVEOworaW1wb3J0IHN0YXRpYyBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXN5bmNDb250ZXh0LlN0YXRlLlJFU1VNRUQ7CitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Bc3luY0NvbnRleHQuU3RhdGUuUlVOTklORzsKK2ltcG9ydCBzdGF0aWMgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFzeW5jQ29udGV4dC5TdGF0ZS5TVVNQRU5ERUQ7CisKKy8qKgorICogU2VydmVyLXNpZGUgcmVxdWVzdCBwcm9jZXNzaW5nIHJ1bnRpbWUuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFNlcnZlclJ1bnRpbWUgeworCisgICAgcHJpdmF0ZSBmaW5hbCBTdGFnZTxSZXF1ZXN0UHJvY2Vzc2luZ0NvbnRleHQ+IHJlcXVlc3RQcm9jZXNzaW5nUm9vdDsKKyAgICBwcml2YXRlIGZpbmFsIFByb2Nlc3NpbmdQcm92aWRlcnMgcHJvY2Vzc2luZ1Byb3ZpZGVyczsKKworICAgIHByaXZhdGUgZmluYWwgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyOworICAgIHByaXZhdGUgZmluYWwgU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlIGJhY2tncm91bmRTY2hlZHVsZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxFeGVjdXRvclNlcnZpY2U+IG1hbmFnZWRBc3luY0V4ZWN1dG9yOworCisgICAgcHJpdmF0ZSBmaW5hbCBSZXF1ZXN0U2NvcGUgcmVxdWVzdFNjb3BlOworICAgIHByaXZhdGUgZmluYWwgRXhjZXB0aW9uTWFwcGVycyBleGNlcHRpb25NYXBwZXJzOworICAgIHByaXZhdGUgZmluYWwgQXBwbGljYXRpb25FdmVudExpc3RlbmVyIGFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lcjsKKyAgICBwcml2YXRlIGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbjsKKworICAgIHByaXZhdGUgZmluYWwgRXh0ZXJuYWxSZXF1ZXN0U2NvcGUgZXh0ZXJuYWxSZXF1ZXN0U2NvcGU7CisKKyAgICBwcml2YXRlIGZpbmFsIFRyYWNpbmdDb25maWcgdHJhY2luZ0NvbmZpZzsKKyAgICBwcml2YXRlIGZpbmFsIFRyYWNpbmdMb2dnZXIuTGV2ZWwgdHJhY2luZ1RocmVzaG9sZDsKKworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBwcm9jZXNzUmVzcG9uc2VFcnJvcnM7CisKKyAgICAvKiogRG8gbm90IHJlc29sdmUgcmVsYXRpdmUgVVJJcyBpbiB0aGUge0Bjb2RlIExvY2F0aW9ufSBoZWFkZXIgKi8KKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gZGlzYWJsZUxvY2F0aW9uSGVhZGVyUmVsYXRpdmVVcmlSZXNvbHV0aW9uOworICAgIC8qKiBSZXNvbHZlIHJlbGF0aXZlIFVSSXMgYWNjb3JkaW5nIHRvIFJGQzcyMzEgKG5vdCBKQVgtUlMgMi4wIGNvbXBsaWFudCAqLworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiByZmM3MjMxTG9jYXRpb25IZWFkZXJSZWxhdGl2ZVVyaVJlc29sdXRpb247CisKKyAgICBzdGF0aWMgU2VydmVyUnVudGltZSBjcmVhdGVTZXJ2ZXJSdW50aW1lKAorICAgICAgICAgICAgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyLAorICAgICAgICAgICAgU2VydmVyQm9vdHN0cmFwQmFnIGJvb3RzdHJhcEJhZywKKyAgICAgICAgICAgIFN0YWdlPFJlcXVlc3RQcm9jZXNzaW5nQ29udGV4dD4gcHJvY2Vzc2luZ1Jvb3QsCisgICAgICAgICAgICBBcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXIgZXZlbnRMaXN0ZW5lciwKKyAgICAgICAgICAgIFByb2Nlc3NpbmdQcm92aWRlcnMgcHJvY2Vzc2luZ1Byb3ZpZGVycykgeworCisgICAgICAgIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSBzY2hlZHVsZWRFeGVjdXRvclNlcnZpY2VTdXBwbGllciA9CisgICAgICAgICAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UuY2xhc3MsIEJhY2tncm91bmRTY2hlZHVsZXJMaXRlcmFsLklOU1RBTkNFKTsKKworICAgICAgICBQcm92aWRlcjxFeGVjdXRvclNlcnZpY2U+IGFzeW5jRXhlY3V0b3JTZXJ2aWNlU3VwcGxpZXIgPQorICAgICAgICAgICAgICAgICgpIC0+IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoRXhlY3V0b3JTZXJ2aWNlLmNsYXNzLCBNYW5hZ2VkQXN5bmNFeGVjdXRvckxpdGVyYWwuSU5TVEFOQ0UpOworCisgICAgICAgIHJldHVybiBuZXcgU2VydmVyUnVudGltZSgKKyAgICAgICAgICAgICAgICBwcm9jZXNzaW5nUm9vdCwKKyAgICAgICAgICAgICAgICBwcm9jZXNzaW5nUHJvdmlkZXJzLAorICAgICAgICAgICAgICAgIGluamVjdGlvbk1hbmFnZXIsCisgICAgICAgICAgICAgICAgc2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlU3VwcGxpZXIsCisgICAgICAgICAgICAgICAgYXN5bmNFeGVjdXRvclNlcnZpY2VTdXBwbGllciwKKyAgICAgICAgICAgICAgICBib290c3RyYXBCYWcuZ2V0UmVxdWVzdFNjb3BlKCksCisgICAgICAgICAgICAgICAgYm9vdHN0cmFwQmFnLmdldEV4Y2VwdGlvbk1hcHBlcnMoKSwKKyAgICAgICAgICAgICAgICBldmVudExpc3RlbmVyLAorICAgICAgICAgICAgICAgIGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoRXh0ZXJuYWxSZXF1ZXN0U2NvcGUuY2xhc3MpLAorICAgICAgICAgICAgICAgIGJvb3RzdHJhcEJhZy5nZXRDb25maWd1cmF0aW9uKCkpOworICAgIH0KKworICAgIHByaXZhdGUgU2VydmVyUnVudGltZShmaW5hbCBTdGFnZTxSZXF1ZXN0UHJvY2Vzc2luZ0NvbnRleHQ+IHJlcXVlc3RQcm9jZXNzaW5nUm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUHJvY2Vzc2luZ1Byb3ZpZGVycyBwcm9jZXNzaW5nUHJvdmlkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSBiYWNrZ3JvdW5kU2NoZWR1bGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBQcm92aWRlcjxFeGVjdXRvclNlcnZpY2U+IG1hbmFnZWRBc3luY0V4ZWN1dG9yUHJvdmlkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlcXVlc3RTY29wZSByZXF1ZXN0U2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEV4Y2VwdGlvbk1hcHBlcnMgZXhjZXB0aW9uTWFwcGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQXBwbGljYXRpb25FdmVudExpc3RlbmVyIGFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRXh0ZXJuYWxSZXF1ZXN0U2NvcGUgZXh0ZXJuYWxTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7CisgICAgICAgIHRoaXMucmVxdWVzdFByb2Nlc3NpbmdSb290ID0gcmVxdWVzdFByb2Nlc3NpbmdSb290OworICAgICAgICB0aGlzLnByb2Nlc3NpbmdQcm92aWRlcnMgPSBwcm9jZXNzaW5nUHJvdmlkZXJzOworICAgICAgICB0aGlzLmluamVjdGlvbk1hbmFnZXIgPSBpbmplY3Rpb25NYW5hZ2VyOworCisgICAgICAgIHRoaXMuYmFja2dyb3VuZFNjaGVkdWxlciA9IGJhY2tncm91bmRTY2hlZHVsZXI7CisgICAgICAgIHRoaXMubWFuYWdlZEFzeW5jRXhlY3V0b3IgPSBtYW5hZ2VkQXN5bmNFeGVjdXRvclByb3ZpZGVyOworCisgICAgICAgIHRoaXMucmVxdWVzdFNjb3BlID0gcmVxdWVzdFNjb3BlOworICAgICAgICB0aGlzLmV4Y2VwdGlvbk1hcHBlcnMgPSBleGNlcHRpb25NYXBwZXJzOworICAgICAgICB0aGlzLmFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lciA9IGFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lcjsKKyAgICAgICAgdGhpcy5leHRlcm5hbFJlcXVlc3RTY29wZSA9IGV4dGVybmFsU2NvcGU7CisgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247CisKKyAgICAgICAgdGhpcy50cmFjaW5nQ29uZmlnID0gVHJhY2luZ1V0aWxzLmdldFRyYWNpbmdDb25maWcoY29uZmlndXJhdGlvbik7CisgICAgICAgIHRoaXMudHJhY2luZ1RocmVzaG9sZCA9IFRyYWNpbmdVdGlscy5nZXRUcmFjaW5nVGhyZXNob2xkKGNvbmZpZ3VyYXRpb24pOworCisgICAgICAgIHRoaXMucHJvY2Vzc1Jlc3BvbnNlRXJyb3JzID0gUHJvcGVydGllc0hlbHBlci5pc1Byb3BlcnR5KAorICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24uZ2V0UHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5QUk9DRVNTSU5HX1JFU1BPTlNFX0VSUk9SU19FTkFCTEVEKSk7CisKKyAgICAgICAgdGhpcy5kaXNhYmxlTG9jYXRpb25IZWFkZXJSZWxhdGl2ZVVyaVJlc29sdXRpb24gPSBTZXJ2ZXJQcm9wZXJ0aWVzLmdldFZhbHVlKGNvbmZpZ3VyYXRpb24uZ2V0UHJvcGVydGllcygpLAorICAgICAgICAgICAgICAgIFNlcnZlclByb3BlcnRpZXMuTE9DQVRJT05fSEVBREVSX1JFTEFUSVZFX1VSSV9SRVNPTFVUSU9OX0RJU0FCTEVELAorICAgICAgICAgICAgICAgIEJvb2xlYW4uRkFMU0UsIEJvb2xlYW4uY2xhc3MpOworCisgICAgICAgIHRoaXMucmZjNzIzMUxvY2F0aW9uSGVhZGVyUmVsYXRpdmVVcmlSZXNvbHV0aW9uID0gU2VydmVyUHJvcGVydGllcy5nZXRWYWx1ZShjb25maWd1cmF0aW9uLmdldFByb3BlcnRpZXMoKSwKKyAgICAgICAgICAgICAgICBTZXJ2ZXJQcm9wZXJ0aWVzLkxPQ0FUSU9OX0hFQURFUl9SRUxBVElWRV9VUklfUkVTT0xVVElPTl9SRkM3MjMxLAorICAgICAgICAgICAgICAgIEJvb2xlYW4uRkFMU0UsIEJvb2xlYW4uY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYSBjb250YWluZXIgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IGNvbnRhaW5lciByZXF1ZXN0IHRvIGJlIHByb2Nlc3NlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKGZpbmFsIENvbnRhaW5lclJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICBUcmFjaW5nVXRpbHMuaW5pdFRyYWNpbmdTdXBwb3J0KHRyYWNpbmdDb25maWcsIHRyYWNpbmdUaHJlc2hvbGQsIHJlcXVlc3QpOworICAgICAgICBUcmFjaW5nVXRpbHMubG9nU3RhcnQocmVxdWVzdCk7CisKKyAgICAgICAgZmluYWwgVXJpUm91dGluZ0NvbnRleHQgcm91dGluZ0NvbnRleHQgPSByZXF1ZXN0LmdldFVyaVJvdXRpbmdDb250ZXh0KCk7CisKKyAgICAgICAgUmVxdWVzdEV2ZW50QnVpbGRlciBtb25pdG9yaW5nRXZlbnRCdWlsZGVyID0gRW1wdHlSZXF1ZXN0RXZlbnRCdWlsZGVyLklOU1RBTkNFOworICAgICAgICBSZXF1ZXN0RXZlbnRMaXN0ZW5lciBtb25pdG9yaW5nRXZlbnRMaXN0ZW5lciA9IG51bGw7CisKKyAgICAgICAgaWYgKGFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICBtb25pdG9yaW5nRXZlbnRCdWlsZGVyID0gbmV3IFJlcXVlc3RFdmVudEltcGwuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgIC5zZXRDb250YWluZXJSZXF1ZXN0KHJlcXVlc3QpCisgICAgICAgICAgICAgICAgICAgIC5zZXRFeHRlbmRlZFVyaUluZm8ocm91dGluZ0NvbnRleHQpOworICAgICAgICAgICAgbW9uaXRvcmluZ0V2ZW50TGlzdGVuZXIgPSBhcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXIub25SZXF1ZXN0KAorICAgICAgICAgICAgICAgICAgICBtb25pdG9yaW5nRXZlbnRCdWlsZGVyLmJ1aWxkKFJlcXVlc3RFdmVudC5UeXBlLlNUQVJUKSk7CisgICAgICAgIH0KKworICAgICAgICByZXF1ZXN0LnNldFByb2Nlc3NpbmdQcm92aWRlcnMocHJvY2Vzc2luZ1Byb3ZpZGVycyk7CisKKyAgICAgICAgZmluYWwgUmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0IGNvbnRleHQgPSBuZXcgUmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0KGluamVjdGlvbk1hbmFnZXIsCisgICAgICAgICAgICAgICAgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICByb3V0aW5nQ29udGV4dCwKKyAgICAgICAgICAgICAgICBtb25pdG9yaW5nRXZlbnRCdWlsZGVyLAorICAgICAgICAgICAgICAgIG1vbml0b3JpbmdFdmVudExpc3RlbmVyKTsKKworICAgICAgICByZXF1ZXN0LmNoZWNrU3RhdGUoKTsKKyAgICAgICAgZmluYWwgUmVzcG9uZGVyIHJlc3BvbmRlciA9IG5ldyBSZXNwb25kZXIoY29udGV4dCwgU2VydmVyUnVudGltZS50aGlzKTsKKyAgICAgICAgZmluYWwgUmVxdWVzdENvbnRleHQgcmVxdWVzdFNjb3BlSW5zdGFuY2UgPSByZXF1ZXN0U2NvcGUuY3JlYXRlQ29udGV4dCgpOworCisgICAgICAgIGZpbmFsIEFzeW5jUmVzcG9uZGVySG9sZGVyIGFzeW5jUmVzcG9uZGVySG9sZGVyID0KKyAgICAgICAgICAgICAgICBuZXcgQXN5bmNSZXNwb25kZXJIb2xkZXIocmVzcG9uZGVyLCBleHRlcm5hbFJlcXVlc3RTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RTY29wZUluc3RhbmNlLCBleHRlcm5hbFJlcXVlc3RTY29wZS5vcGVuKGluamVjdGlvbk1hbmFnZXIpKTsKKyAgICAgICAgY29udGV4dC5pbml0QXN5bmNDb250ZXh0KGFzeW5jUmVzcG9uZGVySG9sZGVyKTsKKworICAgICAgICByZXF1ZXN0U2NvcGUucnVuSW5TY29wZShyZXF1ZXN0U2NvcGVJbnN0YW5jZSwgbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGJhc2UgVVJJIGludG8gcmVzcG9uc2UgYnVpbGRlciB0aHJlYWQtbG9jYWwgdmFyaWFibGUKKyAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGxhdGVyIHJlc29sdmluZyBvZiByZWxhdGl2ZSBsb2NhdGlvbiBVUklzCisgICAgICAgICAgICAgICAgICAgIGlmICghZGlzYWJsZUxvY2F0aW9uSGVhZGVyUmVsYXRpdmVVcmlSZXNvbHV0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBVUkkgdXJpVG9Vc2UgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZmM3MjMxTG9jYXRpb25IZWFkZXJSZWxhdGl2ZVVyaVJlc29sdXRpb24gPyByZXF1ZXN0LmdldFJlcXVlc3RVcmkoKSA6IHJlcXVlc3QuZ2V0QmFzZVVyaSgpOworICAgICAgICAgICAgICAgICAgICAgICAgT3V0Ym91bmRKYXhyc1Jlc3BvbnNlLkJ1aWxkZXIuc2V0QmFzZVVyaSh1cmlUb1VzZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZWY8RW5kcG9pbnQ+IGVuZHBvaW50UmVmID0gUmVmcy5lbXB0eVJlZigpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZXF1ZXN0UHJvY2Vzc2luZ0NvbnRleHQgZGF0YSA9IFN0YWdlcy5wcm9jZXNzKGNvbnRleHQsIHJlcXVlc3RQcm9jZXNzaW5nUm9vdCwgZW5kcG9pbnRSZWYpOworCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIEVuZHBvaW50IGVuZHBvaW50ID0gZW5kcG9pbnRSZWYuZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlbmRwb2ludCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3QgZm91bmQKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBlbmRwb2ludC5hcHBseShkYXRhKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIWFzeW5jUmVzcG9uZGVySG9sZGVyLmlzQXN5bmMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uZGVyLnByb2Nlc3MocmVzcG9uc2UpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZXJuYWxSZXF1ZXN0U2NvcGUuc3VzcGVuZChhc3luY1Jlc3BvbmRlckhvbGRlci5leHRlcm5hbENvbnRleHQsIGluamVjdGlvbk1hbmFnZXIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgVGhyb3dhYmxlIHRocm93YWJsZSkgeworICAgICAgICAgICAgICAgICAgICByZXNwb25kZXIucHJvY2Vzcyh0aHJvd2FibGUpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGFzeW5jUmVzcG9uZGVySG9sZGVyLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgYmFzZSBVUkkgZnJvbSB0aGUgdGhyZWFkCisgICAgICAgICAgICAgICAgICAgIE91dGJvdW5kSmF4cnNSZXNwb25zZS5CdWlsZGVyLmNsZWFyQmFzZVVyaSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBKZXJzZXkgc2VydmVyIHJ1bnRpbWUgYmFja2dyb3VuZCBzY2hlZHVsZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHNlcnZlciBydW50aW1lIGJhY2tncm91bmQgc2NoZWR1bGVyLgorICAgICAqIEBzZWUgQmFja2dyb3VuZFNjaGVkdWxlcgorICAgICAqLworICAgIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSBnZXRCYWNrZ3JvdW5kU2NoZWR1bGVyKCkgeworICAgICAgICByZXR1cm4gYmFja2dyb3VuZFNjaGVkdWxlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmUgdGhhdCB0aGUgdmFsdWUgYSB7QHZhbHVlIEh0dHBIZWFkZXJzI0xPQ0FUSU9OfSBoZWFkZXIgaXMgYW4gYWJzb2x1dGUgVVJJLCBpZiBwcmVzZW50IGFtb25nIGhlYWRlcnMuCisgICAgICogPHAvPgorICAgICAqIFJlbGF0aXZlIFVSSSB2YWx1ZSB3aWxsIGJlIG1hZGUgYWJzb2x1dGUgdXNpbmcgYSBiYXNlIHJlcXVlc3QgVVJJLgorICAgICAqCisgICAgICogQHBhcmFtIGxvY2F0aW9uIGxvY2F0aW9uIFVSSTsgdmFsdWUgb2YgdGhlIEhUVFAge0B2YWx1ZSBIdHRwSGVhZGVycyNMT0NBVElPTn0gcmVzcG9uc2UgaGVhZGVyLgorICAgICAqIEBwYXJhbSBoZWFkZXJzICBtdXRhYmxlIG1hcCBvZiByZXNwb25zZSBoZWFkZXJzLgorICAgICAqIEBwYXJhbSByZXF1ZXN0ICBjb250YWluZXIgcmVxdWVzdC4KKyAgICAgKiBAcGFyYW0gaW5jb21wYXRpYmxlIGlmIHNldCB0byB7QGNvZGUgdHJ1ZX0sIHVyaSB3aWxsIGJlIHJlc29sdmVkIGFnYWluc3QgdGhlIHJlcXVlc3QgdXJpLCBub3QgdGhlIGJhc2UgdXJpOworICAgICAqICAgICAgICAgICAgICAgICAgICAgdGhpcyBpcyBjb3JyZWN0IGFnYWluc3QgUkZDNzIzMSwgYnV0IGRvZXMgdmlvbGF0ZSB0aGUgSkFYLVJTIDIuMCBzcGVjcworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZW5zdXJlQWJzb2x1dGUoZmluYWwgVVJJIGxvY2F0aW9uLCBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbnRhaW5lclJlcXVlc3QgcmVxdWVzdCwgZmluYWwgYm9vbGVhbiBpbmNvbXBhdGlibGUpIHsKKyAgICAgICAgaWYgKGxvY2F0aW9uID09IG51bGwgfHwgbG9jYXRpb24uaXNBYnNvbHV0ZSgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gYWNjb3JkaW5nIHRvIFJGQzcyMzEgKEhUVFAvMS4xKSwgdGhpcyBmaWVsZCBjYW4gY29udGFpbiBvbmUgc2luZ2xlIFVSSSByZWZlcmVuY2UKKyAgICAgICAgZmluYWwgVVJJIHVyaSA9IGluY29tcGF0aWJsZSA/IHJlcXVlc3QuZ2V0UmVxdWVzdFVyaSgpIDogcmVxdWVzdC5nZXRCYXNlVXJpKCk7CisgICAgICAgIGhlYWRlcnMucHV0U2luZ2xlKEh0dHBIZWFkZXJzLkxPQ0FUSU9OLCB1cmkucmVzb2x2ZShsb2NhdGlvbikpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFzeW5jUmVzcG9uZGVySG9sZGVyIGltcGxlbWVudHMgVmFsdWU8QXN5bmNDb250ZXh0PiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZXNwb25kZXIgcmVzcG9uZGVyOworICAgICAgICBwcml2YXRlIGZpbmFsIEV4dGVybmFsUmVxdWVzdFNjb3BlIGV4dGVybmFsU2NvcGU7CisgICAgICAgIHByaXZhdGUgZmluYWwgUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgRXh0ZXJuYWxSZXF1ZXN0Q29udGV4dDw/PiBleHRlcm5hbENvbnRleHQ7CisKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBBc3luY1Jlc3BvbmRlciBhc3luY1Jlc3BvbmRlcjsKKworICAgICAgICBwcml2YXRlIEFzeW5jUmVzcG9uZGVySG9sZGVyKGZpbmFsIFJlc3BvbmRlciByZXNwb25kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRXh0ZXJuYWxSZXF1ZXN0U2NvcGUgZXh0ZXJuYWxSZXF1ZXN0U2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRXh0ZXJuYWxSZXF1ZXN0Q29udGV4dDw/PiBleHRlcm5hbENvbnRleHQpIHsKKyAgICAgICAgICAgIHRoaXMucmVzcG9uZGVyID0gcmVzcG9uZGVyOworICAgICAgICAgICAgdGhpcy5leHRlcm5hbFNjb3BlID0gZXh0ZXJuYWxSZXF1ZXN0U2NvcGU7CisgICAgICAgICAgICB0aGlzLnJlcXVlc3RDb250ZXh0ID0gcmVxdWVzdENvbnRleHQ7CisgICAgICAgICAgICB0aGlzLmV4dGVybmFsQ29udGV4dCA9IGV4dGVybmFsQ29udGV4dDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQXN5bmNDb250ZXh0IGdldCgpIHsKKyAgICAgICAgICAgIGZpbmFsIEFzeW5jUmVzcG9uZGVyIGFyID0gbmV3IEFzeW5jUmVzcG9uZGVyKHJlc3BvbmRlciwgcmVxdWVzdENvbnRleHQsIGV4dGVybmFsU2NvcGUsIGV4dGVybmFsQ29udGV4dCk7CisgICAgICAgICAgICBhc3luY1Jlc3BvbmRlciA9IGFyOworICAgICAgICAgICAgcmV0dXJuIGFyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNBc3luYygpIHsKKyAgICAgICAgICAgIGZpbmFsIEFzeW5jUmVzcG9uZGVyIGFyID0gYXN5bmNSZXNwb25kZXI7CisgICAgICAgICAgICByZXR1cm4gYXIgIT0gbnVsbCAmJiAhYXIuaXNSdW5uaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCByZWxlYXNlKCkgeworICAgICAgICAgICAgaWYgKGFzeW5jUmVzcG9uZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5yZWxlYXNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSZXNwb25kZXIgeworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFJlc3BvbmRlci5jbGFzcy5nZXROYW1lKCkpOworCisgICAgICAgIHByaXZhdGUgZmluYWwgUmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0IHByb2Nlc3NpbmdDb250ZXh0OworICAgICAgICBwcml2YXRlIGZpbmFsIFNlcnZlclJ1bnRpbWUgcnVudGltZTsKKworICAgICAgICBwcml2YXRlIGZpbmFsIENvbXBsZXRpb25DYWxsYmFja1J1bm5lciBjb21wbGV0aW9uQ2FsbGJhY2tSdW5uZXIgPSBuZXcgQ29tcGxldGlvbkNhbGxiYWNrUnVubmVyKCk7CisgICAgICAgIHByaXZhdGUgZmluYWwgQ29ubmVjdGlvbkNhbGxiYWNrUnVubmVyIGNvbm5lY3Rpb25DYWxsYmFja1J1bm5lciA9IG5ldyBDb25uZWN0aW9uQ2FsbGJhY2tSdW5uZXIoKTsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFRyYWNpbmdMb2dnZXIgdHJhY2luZ0xvZ2dlcjsKKworICAgICAgICBwdWJsaWMgUmVzcG9uZGVyKGZpbmFsIFJlcXVlc3RQcm9jZXNzaW5nQ29udGV4dCBwcm9jZXNzaW5nQ29udGV4dCwgZmluYWwgU2VydmVyUnVudGltZSBydW50aW1lKSB7CisgICAgICAgICAgICB0aGlzLnByb2Nlc3NpbmdDb250ZXh0ID0gcHJvY2Vzc2luZ0NvbnRleHQ7CisgICAgICAgICAgICB0aGlzLnJ1bnRpbWUgPSBydW50aW1lOworCisgICAgICAgICAgICB0aGlzLnRyYWNpbmdMb2dnZXIgPSBUcmFjaW5nTG9nZ2VyLmdldEluc3RhbmNlKHByb2Nlc3NpbmdDb250ZXh0LnJlcXVlc3QoKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBwcm9jZXNzKENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgICAgICAgICBwcm9jZXNzaW5nQ29udGV4dC5tb25pdG9yaW5nRXZlbnRCdWlsZGVyKCkuc2V0Q29udGFpbmVyUmVzcG9uc2UocmVzcG9uc2UpOworICAgICAgICAgICAgcmVzcG9uc2UgPSBwcm9jZXNzUmVzcG9uc2UocmVzcG9uc2UpOworICAgICAgICAgICAgcmVsZWFzZShyZXNwb25zZSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIENvbnRhaW5lclJlc3BvbnNlIHByb2Nlc3NSZXNwb25zZShDb250YWluZXJSZXNwb25zZSByZXNwb25zZSkgeworICAgICAgICAgICAgZmluYWwgU3RhZ2U8Q29udGFpbmVyUmVzcG9uc2U+IHJlc3BvbmRpbmdSb290ID0gcHJvY2Vzc2luZ0NvbnRleHQuY3JlYXRlUmVzcG9uZGluZ1Jvb3QoKTsKKworICAgICAgICAgICAgaWYgKHJlc3BvbmRpbmdSb290ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXNwb25zZSA9IFN0YWdlcy5wcm9jZXNzKHJlc3BvbnNlLCByZXNwb25kaW5nUm9vdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cml0ZVJlc3BvbnNlKHJlc3BvbnNlKTsKKworICAgICAgICAgICAgLy8gbm8tZXhjZXB0aW9uIHpvbmUKKyAgICAgICAgICAgIC8vIHRoZSBtZXRob2RzIGJlbG93IGFyZSBndWFyYW50ZWVkIHRvIG5vdCB0aHJvdyBhbnkgZXhjZXB0aW9ucworICAgICAgICAgICAgY29tcGxldGlvbkNhbGxiYWNrUnVubmVyLm9uQ29tcGxldGUobnVsbCk7CisgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUHJvY2VzcyB7QGNvZGUgdGhyb3dhYmxlfSBieSB1c2luZyBleGNlcHRpb24gbWFwcGVycyBhbmQgZ2VuZXJhdGluZyB0aGUgbWFwcGVkCisgICAgICAgICAqIHJlc3BvbnNlIGlmIHBvc3NpYmxlLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogTm90ZSBhYm91dCBsb2dnaW5nOgorICAgICAgICAgKiA8dWw+CisgICAgICAgICAqIDxsaT4KKyAgICAgICAgICogd2UgZG8gbm90IGxvZyBleGNlcHRpb25zIHRoYXQgYXJlIG1hcHBlZCBieSBFeGNlcHRpb25NYXBwZXJzLgorICAgICAgICAgKiA8L2xpPjxsaT4KKyAgICAgICAgICogQWxsIG90aGVyIGV4Y2VwdGlvbnMgYXJlIGxvZ2dlZDogV2ViQXBwbGljYXRpb25FeGNlcHRpb25zIHdpdGggZW50aXRpZXMsCisgICAgICAgICAqIGV4Y2VwdGlvbnMgdGhhdCB3ZXJlIHVuc3VjY2Vzc2Z1bGx5IG1hcHBlZAorICAgICAgICAgKiA8L2xpPgorICAgICAgICAgKiA8L3VsPgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB0aHJvd2FibGUgRXhjZXB0aW9uIHRvIGJlIHByb2Nlc3NlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoZmluYWwgVGhyb3dhYmxlIHRocm93YWJsZSkgeworICAgICAgICAgICAgZmluYWwgQ29udGFpbmVyUmVxdWVzdCByZXF1ZXN0ID0gcHJvY2Vzc2luZ0NvbnRleHQucmVxdWVzdCgpOworICAgICAgICAgICAgcHJvY2Vzc2luZ0NvbnRleHQubW9uaXRvcmluZ0V2ZW50QnVpbGRlcigpLnNldEV4Y2VwdGlvbih0aHJvd2FibGUsIFJlcXVlc3RFdmVudC5FeGNlcHRpb25DYXVzZS5PUklHSU5BTCk7CisgICAgICAgICAgICBwcm9jZXNzaW5nQ29udGV4dC50cmlnZ2VyRXZlbnQoUmVxdWVzdEV2ZW50LlR5cGUuT05fRVhDRVBUSU9OKTsKKworICAgICAgICAgICAgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBudWxsOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSBleGNlcHRpb25SZXNwb25zZSA9IG1hcEV4Y2VwdGlvbih0aHJvd2FibGUpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IGNvbnZlcnRSZXNwb25zZShleGNlcHRpb25SZXNwb25zZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJ1bnRpbWUuZGlzYWJsZUxvY2F0aW9uSGVhZGVyUmVsYXRpdmVVcmlSZXNvbHV0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5zdXJlQWJzb2x1dGUocmVzcG9uc2UuZ2V0TG9jYXRpb24oKSwgcmVzcG9uc2UuZ2V0SGVhZGVycygpLCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZS5yZmM3MjMxTG9jYXRpb25IZWFkZXJSZWxhdGl2ZVVyaVJlc29sdXRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZ0NvbnRleHQubW9uaXRvcmluZ0V2ZW50QnVpbGRlcigpLnNldENvbnRhaW5lclJlc3BvbnNlKHJlc3BvbnNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UmVzcG9uc2VTdWNjZXNzZnVsbHlNYXBwZWQodHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nQ29udGV4dC50cmlnZ2VyRXZlbnQoUmVxdWVzdEV2ZW50LlR5cGUuRVhDRVBUSU9OX01BUFBJTkdfRklOSVNIRUQpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1Jlc3BvbnNlKHJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBUaHJvd2FibGUgcmVzcEVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuU0VWRVJFLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9QUk9DRVNTSU5HX1JFU1BPTlNFX0ZST01fQUxSRUFEWV9NQVBQRURfRVhDRVBUSU9OKCkpOworICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nQ29udGV4dC5tb25pdG9yaW5nRXZlbnRCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RXhjZXB0aW9uKHJlc3BFcnJvciwgUmVxdWVzdEV2ZW50LkV4Y2VwdGlvbkNhdXNlLk1BUFBFRF9SRVNQT05TRSk7CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NpbmdDb250ZXh0LnRyaWdnZXJFdmVudChSZXF1ZXN0RXZlbnQuVHlwZS5PTl9FWENFUFRJT04pOworICAgICAgICAgICAgICAgICAgICB0aHJvdyByZXNwRXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgVGhyb3dhYmxlIHJlc3BvbnNlRXJyb3IpIHsKKyAgICAgICAgICAgICAgICBpZiAodGhyb3dhYmxlICE9IHJlc3BvbnNlRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICEodGhyb3dhYmxlIGluc3RhbmNlb2YgTWFwcGFibGVFeGNlcHRpb24gJiYgdGhyb3dhYmxlLmdldENhdXNlKCkgPT0gcmVzcG9uc2VFcnJvcikpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5GSU5FLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9FWENFUFRJT05fTUFQUElOR19PUklHSU5BTF9FWENFUFRJT04oKSwgdGhyb3dhYmxlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIXByb2Nlc3NSZXNwb25zZUVycm9yKHJlc3BvbnNlRXJyb3IpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFBhc3MgdGhlIGV4Y2VwdGlvbiB0byB0aGUgY29udGFpbmVyLgorICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLkZJTkUsIExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX0VYQ0VQVElPTl9NQVBQSU5HX1RIUk9XTl9UT19DT05UQUlORVIoKSwgcmVzcG9uc2VFcnJvcik7CisKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0UmVzcG9uc2VXcml0ZXIoKS5mYWlsdXJlKHJlc3BvbnNlRXJyb3IpOworICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29tcGxldGlvbkNhbGxiYWNrUnVubmVyLm9uQ29tcGxldGUocmVzcG9uc2VFcnJvcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHJlbGVhc2UocmVzcG9uc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIElmIHtAdmFsdWUgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMjUFJPQ0VTU0lOR19SRVNQT05TRV9FUlJPUlNfRU5BQkxFRH0gaXMgc2V0IHRvIHRydWUgdGhlbiB0cnkgdG8KKyAgICAgICAgICogaGFuZGxlIGVycm9ycyByYWlzZWQgZHVyaW5nIHJlc3BvbnNlIHByb2Nlc3NpbmcuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSByZXNwb25zZUVycm9yIGEgdGhyb3dhYmxlIHRoYXQgb2NjdXJyZWQgZHVyaW5nIHJlc3BvbnNlIHByb2Nlc3NpbmcuCisgICAgICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBnaXZlbiByZXNwb25zZSBlcnJvciBoYXMgYmVlbiBwcm9jZXNzZWQsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NSZXNwb25zZUVycm9yKGZpbmFsIFRocm93YWJsZSByZXNwb25zZUVycm9yKSB7CisgICAgICAgICAgICBib29sZWFuIHByb2Nlc3NlZCA9IGZhbHNlOworCisgICAgICAgICAgICBpZiAocnVudGltZS5wcm9jZXNzUmVzcG9uc2VFcnJvcnMpIHsKKyAgICAgICAgICAgICAgICAvLyBUcnkgdG8gb2J0YWluIHJlc3BvbnNlIGZyb20gcmVzcG9uc2UgZXJyb3IgbWFwcGVyLgorICAgICAgICAgICAgICAgIGZpbmFsIEl0ZXJhYmxlPFJlc3BvbnNlRXJyb3JNYXBwZXI+IG1hcHBlcnMgPSBQcm92aWRlcnMuZ2V0QWxsUHJvdmlkZXJzKHJ1bnRpbWUuaW5qZWN0aW9uTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlRXJyb3JNYXBwZXIuY2xhc3MpOworCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2UgcHJvY2Vzc2VkRXJyb3IgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIFJlc3BvbnNlRXJyb3JNYXBwZXIgbWFwcGVyIDogbWFwcGVycykgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkRXJyb3IgPSBtYXBwZXIudG9SZXNwb25zZShyZXNwb25zZUVycm9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzZWRFcnJvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAocHJvY2Vzc2VkRXJyb3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1Jlc3BvbnNlKG5ldyBDb250YWluZXJSZXNwb25zZShwcm9jZXNzaW5nQ29udGV4dC5yZXF1ZXN0KCksIHByb2Nlc3NlZEVycm9yKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgVGhyb3dhYmxlIHRocm93YWJsZSkgeworICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLkZJTkUsIExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX0VYQ0VQVElPTl9NQVBQSU5HX1BST0NFU1NFRF9SRVNQT05TRV9FUlJPUigpLCB0aHJvd2FibGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3NlZDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgQ29udGFpbmVyUmVzcG9uc2UgY29udmVydFJlc3BvbnNlKGZpbmFsIFJlc3BvbnNlIGV4Y2VwdGlvblJlc3BvbnNlKSB7CisgICAgICAgICAgICBmaW5hbCBDb250YWluZXJSZXNwb25zZSBjb250YWluZXJSZXNwb25zZSA9IG5ldyBDb250YWluZXJSZXNwb25zZShwcm9jZXNzaW5nQ29udGV4dC5yZXF1ZXN0KCksIGV4Y2VwdGlvblJlc3BvbnNlKTsKKyAgICAgICAgICAgIGNvbnRhaW5lclJlc3BvbnNlLnNldE1hcHBlZEZyb21FeGNlcHRpb24odHJ1ZSk7CisgICAgICAgICAgICByZXR1cm4gY29udGFpbmVyUmVzcG9uc2U7CisgICAgICAgIH0KKworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgcHJpdmF0ZSBSZXNwb25zZSBtYXBFeGNlcHRpb24oZmluYWwgVGhyb3dhYmxlIG9yaWdpbmFsVGhyb3dhYmxlKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuRklORVIsIExvY2FsaXphdGlvbk1lc3NhZ2VzLkVYQ0VQVElPTl9NQVBQSU5HX1NUQVJUKCksIG9yaWdpbmFsVGhyb3dhYmxlKTsKKworICAgICAgICAgICAgVGhyb3dhYmxlIHRocm93YWJsZSA9IG9yaWdpbmFsVGhyb3dhYmxlOworICAgICAgICAgICAgYm9vbGVhbiBpbk1hcHBhYmxlID0gZmFsc2U7CisgICAgICAgICAgICBib29sZWFuIG1hcHBpbmdOb3RGb3VuZCA9IGZhbHNlOworCisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaWYgKHRocm93YWJsZSBpbnN0YW5jZW9mIE1hcHBhYmxlRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIGluTWFwcGFibGUgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5NYXBwYWJsZSB8fCB0aHJvd2FibGUgaW5zdGFuY2VvZiBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgICAgICAvLyBpbiBjYXNlIFNlcnZlclByb3BlcnRpZXMuUFJPQ0VTU0lOR19SRVNQT05TRV9FUlJPUlNfRU5BQkxFRCBpcyB0cnVlLCBhbGxvdworICAgICAgICAgICAgICAgICAgICAvLyB3cmFwcGVkIE1lc3NhZ2VCb2R5UHJvdmlkZXJOb3RGb3VuZEV4Y2VwdGlvbiB0byBwcm9wYWdhdGUKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bnRpbWUucHJvY2Vzc1Jlc3BvbnNlRXJyb3JzICYmIHRocm93YWJsZSBpbnN0YW5jZW9mIEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0aHJvd2FibGUuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIE1lc3NhZ2VCb2R5UHJvdmlkZXJOb3RGb3VuZEV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgdGhyb3dhYmxlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlIHdhZVJlc3BvbnNlID0gbnVsbDsKKworICAgICAgICAgICAgICAgICAgICBpZiAodGhyb3dhYmxlIGluc3RhbmNlb2YgV2ViQXBwbGljYXRpb25FeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uID0gKFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKSB0aHJvd2FibGU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBtYXBwZWQgdGhyb3dhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nQ29udGV4dC5yb3V0aW5nQ29udGV4dCgpLnNldE1hcHBlZFRocm93YWJsZSh0aHJvd2FibGUpOworCisgICAgICAgICAgICAgICAgICAgICAgICB3YWVSZXNwb25zZSA9IHdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uLmdldFJlc3BvbnNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2FlUmVzcG9uc2UuaGFzRW50aXR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLkZJTkUsIExvY2FsaXphdGlvbk1lc3NhZ2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuRVhDRVBUSU9OX01BUFBJTkdfV0FFX0VOVElUWSh3YWVSZXNwb25zZS5nZXRTdGF0dXMoKSksIHRocm93YWJsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdhZVJlc3BvbnNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyB0aW1lc3RhbXAgPSB0cmFjaW5nTG9nZ2VyLnRpbWVzdGFtcChTZXJ2ZXJUcmFjZUV2ZW50LkVYQ0VQVElPTl9NQVBQSU5HKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgRXhjZXB0aW9uTWFwcGVyIG1hcHBlciA9IHJ1bnRpbWUuZXhjZXB0aW9uTWFwcGVycy5maW5kTWFwcGluZyh0aHJvd2FibGUpOworICAgICAgICAgICAgICAgICAgICBpZiAobWFwcGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NpbmdDb250ZXh0Lm1vbml0b3JpbmdFdmVudEJ1aWxkZXIoKS5zZXRFeGNlcHRpb25NYXBwZXIobWFwcGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NpbmdDb250ZXh0LnRyaWdnZXJFdmVudChSZXF1ZXN0RXZlbnQuVHlwZS5FWENFUFRJT05fTUFQUEVSX0ZPVU5EKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVzcG9uc2UgbWFwcGVkUmVzcG9uc2UgPSBtYXBwZXIudG9SZXNwb25zZSh0aHJvd2FibGUpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNpbmdMb2dnZXIuaXNMb2dFbmFibGVkKFNlcnZlclRyYWNlRXZlbnQuRVhDRVBUSU9OX01BUFBJTkcpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNpbmdMb2dnZXIubG9nRHVyYXRpb24oU2VydmVyVHJhY2VFdmVudC5FWENFUFRJT05fTUFQUElORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAsIG1hcHBlciwgdGhyb3dhYmxlLCB0aHJvd2FibGUuZ2V0TG9jYWxpemVkTWVzc2FnZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlZFJlc3BvbnNlICE9IG51bGwgPyBtYXBwZWRSZXNwb25zZS5nZXRTdGF0dXNJbmZvKCkgOiAiLW5vLXJlc3BvbnNlLSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBtYXBwZWQgdGhyb3dhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZ0NvbnRleHQucm91dGluZ0NvbnRleHQoKS5zZXRNYXBwZWRUaHJvd2FibGUodGhyb3dhYmxlKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXBwZWRSZXNwb25zZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3BvbnNlIHN1Y2Nlc3NmdWxseSBtYXBwZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExPR0dFUi5pc0xvZ2dhYmxlKExldmVsLkZJTkVSKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSBTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uICclcycgaGFzIGJlZW4gbWFwcGVkIGJ5ICclcycgdG8gcmVzcG9uc2UgJyVzJyAoJXM6JXMpLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93YWJsZS5nZXRMb2NhbGl6ZWRNZXNzYWdlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlci5nZXRDbGFzcygpLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGVkUmVzcG9uc2UuZ2V0U3RhdHVzSW5mbygpLmdldFJlYXNvblBocmFzZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZWRSZXNwb25zZS5nZXRTdGF0dXNJbmZvKCkuZ2V0U3RhdHVzQ29kZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZWRSZXNwb25zZS5nZXRTdGF0dXNJbmZvKCkuZ2V0RmFtaWx5KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5GSU5FUiwgbWVzc2FnZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hcHBlZFJlc3BvbnNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5ub0NvbnRlbnQoKS5idWlsZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFRocm93YWJsZSBtYXBwZXJUaHJvd2FibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcGVjOiBJZiB0aGUgZXhjZXB0aW9uIG1hcHBpbmcgcHJvdmlkZXIgdGhyb3dzIGFuIGV4Y2VwdGlvbiB3aGlsZSBjcmVhdGluZyBhIFJlc3BvbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiByZXR1cm4gYSBzZXJ2ZXIgZXJyb3IgKHN0YXR1cyBjb2RlIDUwMCkgcmVzcG9uc2UgdG8gdGhlIGNsaWVudC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLlNFVkVSRSwgTG9jYWxpemF0aW9uTWVzc2FnZXMuRVhDRVBUSU9OX01BUFBFUl9USFJPV1NfRVhDRVBUSU9OKG1hcHBlci5nZXRDbGFzcygpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBlclRocm93YWJsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5TRVZFUkUsIExvY2FsaXphdGlvbk1lc3NhZ2VzLkVYQ0VQVElPTl9NQVBQRVJfRkFJTEVEX0ZPUl9FWENFUFRJT04oKSwgdGhyb3dhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc2VydmVyRXJyb3IoKS5idWlsZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdhZVJlc3BvbnNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuRklORSwgTG9jYWxpemF0aW9uTWVzc2FnZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkVYQ0VQVElPTl9NQVBQSU5HX1dBRV9OT19FTlRJVFkod2FlUmVzcG9uc2UuZ2V0U3RhdHVzKCkpLCB0aHJvd2FibGUpOworCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2FlUmVzcG9uc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBtYXBwaW5nTm90Rm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBpbnRlcm5hbCBtYXBwaW5nCisgICAgICAgICAgICAgICAgaWYgKHRocm93YWJsZSBpbnN0YW5jZW9mIEhlYWRlclZhbHVlRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoKEhlYWRlclZhbHVlRXhjZXB0aW9uKSB0aHJvd2FibGUpLmdldENvbnRleHQoKSA9PSBIZWFkZXJWYWx1ZUV4Y2VwdGlvbi5Db250ZXh0LklOQk9VTkQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoUmVzcG9uc2UuU3RhdHVzLkJBRF9SRVFVRVNUKS5idWlsZCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFpbk1hcHBhYmxlIHx8IG1hcHBpbmdOb3RGb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAvLyB1c2VyIGZhaWx1cmVzICh0aHJvd24gZnJvbSBSZXNvdXJjZSBtZXRob2RzIG9yIHByb3ZpZGVyIG1ldGhvZHMpCisKKyAgICAgICAgICAgICAgICAgICAgLy8gc3BlYzogVW5jaGVja2VkIGV4Y2VwdGlvbnMgYW5kIGVycm9ycyB0aGF0IGhhdmUgbm90IGJlZW4gbWFwcGVkIE1VU1QgYmUgcmUtdGhyb3duIGFuZCBhbGxvd2VkIHRvCisgICAgICAgICAgICAgICAgICAgIC8vIHByb3BhZ2F0ZSB0byB0aGUgdW5kZXJseWluZyBjb250YWluZXIuCisKKyAgICAgICAgICAgICAgICAgICAgLy8gbm90IGxvZ2dlZCBvbiB0aGlzIGxldmVsLgorICAgICAgICAgICAgICAgICAgICB0aHJvdyB0aHJvd2FibGU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdGhyb3dhYmxlID0gdGhyb3dhYmxlLmdldENhdXNlKCk7CisgICAgICAgICAgICB9IHdoaWxlICh0aHJvd2FibGUgIT0gbnVsbCk7CisgICAgICAgICAgICAvLyBqZXJzZXkgZmFpbHVyZXMgKG5vdCB0aHJvd24gZnJvbSBSZXNvdXJjZSBtZXRob2RzIG9yIHByb3ZpZGVyIG1ldGhvZHMpIC0+IHJldGhyb3cKKyAgICAgICAgICAgIHRocm93IG9yaWdpbmFsVGhyb3dhYmxlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBDb250YWluZXJSZXNwb25zZSB3cml0ZVJlc3BvbnNlKGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgICAgICAgICBmaW5hbCBDb250YWluZXJSZXF1ZXN0IHJlcXVlc3QgPSBwcm9jZXNzaW5nQ29udGV4dC5yZXF1ZXN0KCk7CisgICAgICAgICAgICBmaW5hbCBDb250YWluZXJSZXNwb25zZVdyaXRlciB3cml0ZXIgPSByZXF1ZXN0LmdldFJlc3BvbnNlV3JpdGVyKCk7CisKKyAgICAgICAgICAgIGlmICghcnVudGltZS5kaXNhYmxlTG9jYXRpb25IZWFkZXJSZWxhdGl2ZVVyaVJlc29sdXRpb24pIHsKKyAgICAgICAgICAgICAgICBTZXJ2ZXJSdW50aW1lLmVuc3VyZUFic29sdXRlKHJlc3BvbnNlLmdldExvY2F0aW9uKCksIHJlc3BvbnNlLmdldEhlYWRlcnMoKSwgcmVzcG9uc2UuZ2V0UmVxdWVzdENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWUucmZjNzIzMUxvY2F0aW9uSGVhZGVyUmVsYXRpdmVVcmlSZXNvbHV0aW9uKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFyZXNwb25zZS5oYXNFbnRpdHkoKSkgeworICAgICAgICAgICAgICAgIHRyYWNpbmdMb2dnZXIubG9nKFNlcnZlclRyYWNlRXZlbnQuRklOSVNIRUQsIHJlc3BvbnNlLmdldFN0YXR1c0luZm8oKSk7CisgICAgICAgICAgICAgICAgdHJhY2luZ0xvZ2dlci5mbHVzaChyZXNwb25zZS5nZXRIZWFkZXJzKCkpOworCisgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlUmVzcG9uc2VTdGF0dXNBbmRIZWFkZXJzKDAsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICBzZXRXcml0dGVuUmVzcG9uc2UocmVzcG9uc2UpOworICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgT2JqZWN0IGVudGl0eSA9IHJlc3BvbnNlLmdldEVudGl0eSgpOworICAgICAgICAgICAgYm9vbGVhbiBza2lwRmluYWxseSA9IGZhbHNlOworCisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzSGVhZCA9IHJlcXVlc3QuZ2V0TWV0aG9kKCkuZXF1YWxzKEh0dHBNZXRob2QuSEVBRCk7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0U3RyZWFtUHJvdmlkZXIobmV3IE91dGJvdW5kTWVzc2FnZUNvbnRleHQuU3RyZWFtUHJvdmlkZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbShmaW5hbCBpbnQgY29udGVudExlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcnVudGltZS5kaXNhYmxlTG9jYXRpb25IZWFkZXJSZWxhdGl2ZVVyaVJlc29sdXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2ZXJSdW50aW1lLmVuc3VyZUFic29sdXRlKHJlc3BvbnNlLmdldExvY2F0aW9uKCksIHJlc3BvbnNlLmdldEhlYWRlcnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmdldFJlcXVlc3RDb250ZXh0KCksIHJ1bnRpbWUucmZjNzIzMUxvY2F0aW9uSGVhZGVyUmVsYXRpdmVVcmlSZXNvbHV0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSB3cml0ZXIud3JpdGVSZXNwb25zZVN0YXR1c0FuZEhlYWRlcnMoY29udGVudExlbmd0aCwgcmVzcG9uc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzSGVhZCA/IG51bGwgOiBvdXRwdXRTdHJlYW07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgICAgIGlmICgod3JpdGVyLmVuYWJsZVJlc3BvbnNlQnVmZmVyaW5nKCkgfHwgaXNIZWFkKSAmJiAhcmVzcG9uc2UuaXNDaHVua2VkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZW5hYmxlQnVmZmVyaW5nKHJ1bnRpbWUuY29uZmlndXJhdGlvbik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0RW50aXR5U3RyZWFtKHJlcXVlc3QuZ2V0V29ya2VycygpLndyaXRlVG8oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eS5nZXRDbGFzcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmdldEVudGl0eVR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5nZXRFbnRpdHlBbm5vdGF0aW9ucygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmdldEhlYWRlcnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmdldFByb3BlcnRpZXNEZWxlZ2F0ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmdldEVudGl0eVN0cmVhbSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0V3JpdGVySW50ZXJjZXB0b3JzKCkpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBNYXBwYWJsZUV4Y2VwdGlvbiBtcGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1wZS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgSU9FeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25DYWxsYmFja1J1bm5lci5vbkRpc2Nvbm5lY3QocHJvY2Vzc2luZ0NvbnRleHQuYXN5bmNDb250ZXh0KCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRocm93IG1wZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdHJhY2luZ0xvZ2dlci5sb2coU2VydmVyVHJhY2VFdmVudC5GSU5JU0hFRCwgcmVzcG9uc2UuZ2V0U3RhdHVzSW5mbygpKTsKKyAgICAgICAgICAgICAgICB0cmFjaW5nTG9nZ2VyLmZsdXNoKHJlc3BvbnNlLmdldEhlYWRlcnMoKSk7CisKKyAgICAgICAgICAgICAgICBzZXRXcml0dGVuUmVzcG9uc2UocmVzcG9uc2UpOworCisgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBUaHJvd2FibGUgZXgpIHsKKyAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuaXNDb21taXR0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgICAgICogV2UncmUgZG9uZSB3aXRoIHByb2Nlc3NpbmcgaGVyZS4gVGhlcmUncyBub3RoaW5nIHdlIGNhbiBkbyBhYm91dCB0aGUgZXhjZXB0aW9uIHNvCisgICAgICAgICAgICAgICAgICAgICAqIGxldCdzIGp1c3QgbG9nIGl0LgorICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5TRVZFUkUsIExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX1dSSVRJTkdfUkVTUE9OU0VfRU5USVRZKCksIGV4KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBza2lwRmluYWxseSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGlmIChleCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKSBleDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYXBwYWJsZUV4Y2VwdGlvbihleCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmICghc2tpcEZpbmFsbHkpIHsKKyAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBjbG9zZSA9ICFyZXNwb25zZS5pc0NodW5rZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmlzQ2h1bmtlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmNvbW1pdFN0cmVhbSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLlNFVkVSRSwgTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfQ09NTUlUVElOR19PVVRQVVRfU1RSRUFNKCksIGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2h1bmtlZE91dHB1dCBjaHVua2VkID0gKENodW5rZWRPdXRwdXQpIGVudGl0eTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2h1bmtlZC5zZXRDb250ZXh0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZS5yZXF1ZXN0U2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lLnJlcXVlc3RTY29wZS5yZWZlcmVuY2VDdXJyZW50KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uQ2FsbGJhY2tSdW5uZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLlNFVkVSRSwgTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfV1JJVElOR19SRVNQT05TRV9FTlRJVFlfQ0hVTksoKSwgZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN1c3BlbmQgdGhlIHdyaXRlciBpbmRlZmluaXRlbHkgKHBhc3NpbmcgbnVsbCB0aW1lb3V0IGhhbmRsZXIgaXMgb2sgaW4gc3VjaCBjYXNlKSBpZiB0aGUgb3V0cHV0IGlzIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBjbG9zZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIHdoYXQgdG8gZG8gaWYgd2UgZGV0ZWN0IHRoYXQgdGhlIHdyaXRlciBoYXMgYWxyZWFkeSBiZWVuIHN1c3BlbmRlZD8gb3ZlcnJpZGUgdGhlIHRpbWVvdXQgdmFsdWU/CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNodW5rZWQuaXNDbG9zZWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhd3JpdGVyLnN1c3BlbmQoQXN5bmNSZXNwb25kZXIuTk9fVElNRU9VVCwgVGltZVVuaXQuU0VDT05EUywgbnVsbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dHRVIuZmluZShMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9TVVNQRU5ESU5HX0NIVU5LRURfT1VUUFVUX1JFU1BPTlNFKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNsb3NlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSByZXNwb25zZSBtdXN0IGJlIGNsb3NlZCBoZXJlIGluc3RlYWQgb2YganVzdCBmbHVzaGVkIG9yIGNvbW1pdHRlZC4gU29tZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG91dHB1dCBzdHJlYW1zIHdyaXRlcyBvdXQgYnl0ZXMgb25seSBvbiBjbG9zZSAoZm9yIGV4YW1wbGUgR1ppcE91dHB1dFN0cmVhbSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5TRVZFUkUsIExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX0NMT1NJTkdfQ09NTUlUX09VVFBVVF9TVFJFQU0oKSwgZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiByZXNwb25zZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBzZXRXcml0dGVuUmVzcG9uc2UoZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgICAgIHByb2Nlc3NpbmdDb250ZXh0Lm1vbml0b3JpbmdFdmVudEJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAuc2V0Q29udGFpbmVyUmVzcG9uc2UocmVzcG9uc2UpCisgICAgICAgICAgICAgICAgICAgIC5zZXRTdWNjZXNzKHJlc3BvbnNlLmdldFN0YXR1cygpIDwgUmVzcG9uc2UuU3RhdHVzLkJBRF9SRVFVRVNULmdldFN0YXR1c0NvZGUoKSkKKyAgICAgICAgICAgICAgICAgICAgLnNldFJlc3BvbnNlV3JpdHRlbih0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCByZWxlYXNlKGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlQ29udGV4dCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBwcm9jZXNzaW5nQ29udGV4dC5jbG9zZWFibGVTZXJ2aWNlKCkuY2xvc2UoKTsKKworICAgICAgICAgICAgICAgIC8vIENvbW1pdCB0aGUgY29udGFpbmVyIHJlc3BvbnNlIHdyaXRlciBpZiBub3QgaW4gY2h1bmtlZCBtb2RlCisgICAgICAgICAgICAgICAgLy8gcmVzcG9uc2VDb250ZXh0IG1heSBiZSBudWxsIGluIGNhc2UgdGhlIHJlcXVlc3QgcHJvY2Vzc2luZyB3YXMgY2FuY2VsbGVkLgorICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZUNvbnRleHQgIT0gbnVsbCAmJiAhcmVzcG9uc2VDb250ZXh0LmlzQ2h1bmtlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHJlc3BvbnNlQ29udGV4dC5jb21taXRTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5XQVJOSU5HLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5SRUxFQVNJTkdfUkVRVUVTVF9QUk9DRVNTSU5HX1JFU09VUkNFU19GQUlMRUQoKSwgdGhyb3dhYmxlKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgcnVudGltZS5leHRlcm5hbFJlcXVlc3RTY29wZS5jbG9zZSgpOworICAgICAgICAgICAgICAgIHByb2Nlc3NpbmdDb250ZXh0LnRyaWdnZXJFdmVudChSZXF1ZXN0RXZlbnQuVHlwZS5GSU5JU0hFRCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBc3luY1Jlc3BvbmRlciBpbXBsZW1lbnRzIEFzeW5jQ29udGV4dCwgQ29udGFpbmVyUmVzcG9uc2VXcml0ZXIuVGltZW91dEhhbmRsZXIsIENvbXBsZXRpb25DYWxsYmFjayB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoQXN5bmNSZXNwb25kZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUaW1lb3V0SGFuZGxlciBERUZBVUxUX1RJTUVPVVRfSEFORExFUiA9IG5ldyBUaW1lb3V0SGFuZGxlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlVGltZW91dChmaW5hbCBBc3luY1Jlc3BvbnNlIGFzeW5jUmVzcG9uc2UpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3Qgc3RhdGVMb2NrID0gbmV3IE9iamVjdCgpOworICAgICAgICBwcml2YXRlIFN0YXRlIHN0YXRlID0gUlVOTklORzsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGNhbmNlbGxlZCA9IGZhbHNlOworCisgICAgICAgIHByaXZhdGUgZmluYWwgUmVzcG9uZGVyIHJlc3BvbmRlcjsKKyAgICAgICAgLy8gVE9ETyB0aGlzIGluc3RhbmNlIHNob3VsZCBiZSByZWxlYXNlZCBvbmNlIGFzeW5jIGludm9jYXRpb24gaXMgZmluaXNoZWQuCisgICAgICAgIHByaXZhdGUgZmluYWwgUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgRXh0ZXJuYWxSZXF1ZXN0Q29udGV4dDw/PiBmb3JlaWduU2NvcGVJbnN0YW5jZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBFeHRlcm5hbFJlcXVlc3RTY29wZSByZXF1ZXN0U2NvcGVMaXN0ZW5lcjsKKworICAgICAgICBwcml2YXRlIHZvbGF0aWxlIFRpbWVvdXRIYW5kbGVyIHRpbWVvdXRIYW5kbGVyID0gREVGQVVMVF9USU1FT1VUX0hBTkRMRVI7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEFic3RyYWN0Q2FsbGJhY2tSdW5uZXI8Pz4+IGNhbGxiYWNrUnVubmVyczsKKworICAgICAgICBwdWJsaWMgQXN5bmNSZXNwb25kZXIoZmluYWwgUmVzcG9uZGVyIHJlc3BvbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRXh0ZXJuYWxSZXF1ZXN0U2NvcGUgcmVxdWVzdFNjb3BlTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBFeHRlcm5hbFJlcXVlc3RDb250ZXh0PD8+IGZvcmVpZ25TY29wZUluc3RhbmNlKSB7CisgICAgICAgICAgICB0aGlzLnJlc3BvbmRlciA9IHJlc3BvbmRlcjsKKyAgICAgICAgICAgIHRoaXMucmVxdWVzdENvbnRleHQgPSByZXF1ZXN0Q29udGV4dDsKKyAgICAgICAgICAgIHRoaXMuZm9yZWlnblNjb3BlSW5zdGFuY2UgPSBmb3JlaWduU2NvcGVJbnN0YW5jZTsKKyAgICAgICAgICAgIHRoaXMucmVxdWVzdFNjb3BlTGlzdGVuZXIgPSByZXF1ZXN0U2NvcGVMaXN0ZW5lcjsKKworICAgICAgICAgICAgdGhpcy5jYWxsYmFja1J1bm5lcnMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoCisgICAgICAgICAgICAgICAgICAgIHJlc3BvbmRlci5jb21wbGV0aW9uQ2FsbGJhY2tSdW5uZXIsIHJlc3BvbmRlci5jb25uZWN0aW9uQ2FsbGJhY2tSdW5uZXIpKTsKKworICAgICAgICAgICAgcmVzcG9uZGVyLmNvbXBsZXRpb25DYWxsYmFja1J1bm5lci5yZWdpc3Rlcih0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblRpbWVvdXQoZmluYWwgQ29udGFpbmVyUmVzcG9uc2VXcml0ZXIgcmVzcG9uc2VXcml0ZXIpIHsKKyAgICAgICAgICAgIGZpbmFsIFRpbWVvdXRIYW5kbGVyIGhhbmRsZXIgPSB0aW1lb3V0SGFuZGxlcjsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChzdGF0ZUxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IFNVU1BFTkRFRCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5oYW5kbGVUaW1lb3V0KHRoaXMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgVGhyb3dhYmxlIHRocm93YWJsZSkgeworICAgICAgICAgICAgICAgIHJlc3VtZSh0aHJvd2FibGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUoZmluYWwgVGhyb3dhYmxlIHRocm93YWJsZSkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChzdGF0ZUxvY2spIHsKKyAgICAgICAgICAgICAgICBzdGF0ZSA9IENPTVBMRVRFRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBpbnZva2VNYW5hZ2VkKGZpbmFsIFByb2R1Y2VyPFJlc3BvbnNlPiBwcm9kdWNlcikgeworICAgICAgICAgICAgcmVzcG9uZGVyLnJ1bnRpbWUubWFuYWdlZEFzeW5jRXhlY3V0b3IuZ2V0KCkuc3VibWl0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3BvbmRlci5ydW50aW1lLnJlcXVlc3RTY29wZS5ydW5JblNjb3BlKHJlcXVlc3RDb250ZXh0LCBuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0U2NvcGVMaXN0ZW5lci5yZXN1bWUoZm9yZWlnblNjb3BlSW5zdGFuY2UsIHJlc3BvbmRlci5ydW50aW1lLmluamVjdGlvbk1hbmFnZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHByb2R1Y2VyLmNhbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VtZShyZXNwb25zZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bWUodCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBzdXNwZW5kKCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChzdGF0ZUxvY2spIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gUlVOTklORykgeworICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uZGVyLnByb2Nlc3NpbmdDb250ZXh0LnJlcXVlc3QoKS5nZXRSZXNwb25zZVdyaXRlcigpLnN1c3BlbmQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXN5bmNSZXNwb25zZS5OT19USU1FT1VULCBUaW1lVW5pdC5TRUNPTkRTLCB0aGlzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTVVNQRU5ERUQ7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiByZXN1bWUoZmluYWwgT2JqZWN0IHJlc3BvbnNlKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzdW1lKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0U2NvcGVMaXN0ZW5lci5yZXN1bWUoZm9yZWlnblNjb3BlSW5zdGFuY2UsIHJlc3BvbmRlci5ydW50aW1lLmluamVjdGlvbk1hbmFnZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVzcG9uc2UgamF4cnNSZXNwb25zZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXNwb25zZSBpbnN0YW5jZW9mIFJlc3BvbnNlKSA/IChSZXNwb25zZSkgcmVzcG9uc2UgOiBSZXNwb25zZS5vayhyZXNwb25zZSkuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uZGVyLnJ1bnRpbWUuZGlzYWJsZUxvY2F0aW9uSGVhZGVyUmVsYXRpdmVVcmlSZXNvbHV0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmVyUnVudGltZS5lbnN1cmVBYnNvbHV0ZShqYXhyc1Jlc3BvbnNlLmdldExvY2F0aW9uKCksIGpheHJzUmVzcG9uc2UuZ2V0SGVhZGVycygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uZGVyLnByb2Nlc3NpbmdDb250ZXh0LnJlcXVlc3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbmRlci5ydW50aW1lLnJmYzcyMzFMb2NhdGlvbkhlYWRlclJlbGF0aXZlVXJpUmVzb2x1dGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25kZXIucHJvY2VzcyhuZXcgQ29udGFpbmVyUmVzcG9uc2UocmVzcG9uZGVyLnByb2Nlc3NpbmdDb250ZXh0LnJlcXVlc3QoKSwgamF4cnNSZXNwb25zZSkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uZGVyLnByb2Nlc3ModCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiByZXN1bWUoZmluYWwgVGhyb3dhYmxlIGVycm9yKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzdW1lKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0U2NvcGVMaXN0ZW5lci5yZXN1bWUoZm9yZWlnblNjb3BlSW5zdGFuY2UsIHJlc3BvbmRlci5ydW50aW1lLmluamVjdGlvbk1hbmFnZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uZGVyLnByb2Nlc3MobmV3IE1hcHBhYmxlRXhjZXB0aW9uKGVycm9yKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFRocm93YWJsZSBlcnJvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIHRoZSBleGNlcHRpb24gLSBhbHJlYWR5IHJlc3VtZWQgYnV0IG1heSBiZSByZXRocm93biBieSBDb250YWluZXJSZXNwb25zZVdyaXRlciNmYWlsdXJlLgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gcmVzdW1lKGZpbmFsIFJ1bm5hYmxlIGhhbmRsZXIpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoc3RhdGVMb2NrKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlICE9IFNVU1BFTkRFRCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0YXRlID0gUkVTVU1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXNwb25kZXIucnVudGltZS5yZXF1ZXN0U2NvcGUucnVuSW5TY29wZShyZXF1ZXN0Q29udGV4dCwgaGFuZGxlcik7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LnJlbGVhc2UoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY2FuY2VsKCkgeworICAgICAgICAgICAgcmV0dXJuIGNhbmNlbChuZXcgVmFsdWU8UmVzcG9uc2U+KCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXQoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoUmVzcG9uc2UuU3RhdHVzLlNFUlZJQ0VfVU5BVkFJTEFCTEUpLmJ1aWxkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY2FuY2VsKGZpbmFsIGludCByZXRyeUFmdGVyKSB7CisgICAgICAgICAgICByZXR1cm4gY2FuY2VsKG5ldyBWYWx1ZTxSZXNwb25zZT4oKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldCgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0YXR1cyhSZXNwb25zZS5TdGF0dXMuU0VSVklDRV9VTkFWQUlMQUJMRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaGVhZGVyKEh0dHBIZWFkZXJzLlJFVFJZX0FGVEVSLCByZXRyeUFmdGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGNhbmNlbChmaW5hbCBEYXRlIHJldHJ5QWZ0ZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBjYW5jZWwobmV3IFZhbHVlPFJlc3BvbnNlPigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0KCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RhdHVzKFJlc3BvbnNlLlN0YXR1cy5TRVJWSUNFX1VOQVZBSUxBQkxFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5oZWFkZXIoSHR0cEhlYWRlcnMuUkVUUllfQUZURVIsIHJldHJ5QWZ0ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gY2FuY2VsKGZpbmFsIFZhbHVlPFJlc3BvbnNlPiByZXNwb25zZVZhbHVlKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHN0YXRlTG9jaykgeworICAgICAgICAgICAgICAgIGlmIChjYW5jZWxsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHN0YXRlICE9IFNVU1BFTkRFRCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0YXRlID0gUkVTVU1FRDsKKyAgICAgICAgICAgICAgICBjYW5jZWxsZWQgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXNwb25kZXIucnVudGltZS5yZXF1ZXN0U2NvcGUucnVuSW5TY29wZShyZXF1ZXN0Q29udGV4dCwgbmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RTY29wZUxpc3RlbmVyLnJlc3VtZShmb3JlaWduU2NvcGVJbnN0YW5jZSwgcmVzcG9uZGVyLnJ1bnRpbWUuaW5qZWN0aW9uTWFuYWdlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHJlc3BvbnNlVmFsdWUuZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25kZXIucHJvY2VzcyhuZXcgQ29udGFpbmVyUmVzcG9uc2UocmVzcG9uZGVyLnByb2Nlc3NpbmdDb250ZXh0LnJlcXVlc3QoKSwgcmVzcG9uc2UpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbmRlci5wcm9jZXNzKHQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUnVubmluZygpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoc3RhdGVMb2NrKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlID09IFJVTk5JTkc7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTdXNwZW5kZWQoKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHN0YXRlTG9jaykgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZSA9PSBTVVNQRU5ERUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDYW5jZWxsZWQoKSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHN0YXRlTG9jaykgeworICAgICAgICAgICAgICAgIHJldHVybiBjYW5jZWxsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEb25lKCkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChzdGF0ZUxvY2spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGUgPT0gQ09NUExFVEVEOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHNldFRpbWVvdXQoZmluYWwgbG9uZyB0aW1lLCBmaW5hbCBUaW1lVW5pdCB1bml0KSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlc3BvbmRlci5wcm9jZXNzaW5nQ29udGV4dC5yZXF1ZXN0KCkuZ2V0UmVzcG9uc2VXcml0ZXIoKS5zZXRTdXNwZW5kVGltZW91dCh0aW1lLCB1bml0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuRklORVIsICJVbmFibGUgdG8gc2V0IHRpbWVvdXQgb24gdGhlIEFzeW5jUmVzcG9uc2UuIiwgZXgpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRUaW1lb3V0SGFuZGxlcihmaW5hbCBUaW1lb3V0SGFuZGxlciBoYW5kbGVyKSB7CisgICAgICAgICAgICB0aW1lb3V0SGFuZGxlciA9IGhhbmRsZXI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENvbGxlY3Rpb248Q2xhc3M8Pz4+IHJlZ2lzdGVyKGZpbmFsIENsYXNzPD8+IGNhbGxiYWNrKSB7CisgICAgICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrTm90TnVsbChjYWxsYmFjaywgTG9jYWxpemF0aW9uTWVzc2FnZXMuUEFSQU1fTlVMTCgiY2FsbGJhY2siKSk7CisKKyAgICAgICAgICAgIHJldHVybiByZWdpc3RlcihJbmplY3Rpb25zLmdldE9yQ3JlYXRlKHJlc3BvbmRlci5ydW50aW1lLmluamVjdGlvbk1hbmFnZXIsIGNhbGxiYWNrKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE1hcDxDbGFzczw/PiwgQ29sbGVjdGlvbjxDbGFzczw/Pj4+IHJlZ2lzdGVyKGZpbmFsIENsYXNzPD8+IGNhbGxiYWNrLCBmaW5hbCBDbGFzczw/Pi4uLiBjYWxsYmFja3MpIHsKKyAgICAgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsKGNhbGxiYWNrLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5QQVJBTV9OVUxMKCJjYWxsYmFjayIpKTsKKyAgICAgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsKGNhbGxiYWNrcywgTG9jYWxpemF0aW9uTWVzc2FnZXMuQ0FMTEJBQ0tfQVJSQVlfTlVMTCgpKTsKKyAgICAgICAgICAgIGZvciAoZmluYWwgQ2xhc3M8Pz4gYWRkaXRpb25hbENhbGxiYWNrIDogY2FsbGJhY2tzKSB7CisgICAgICAgICAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGwoYWRkaXRpb25hbENhbGxiYWNrLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5DQUxMQkFDS19BUlJBWV9FTEVNRU5UX05VTEwoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIE1hcDxDbGFzczw/PiwgQ29sbGVjdGlvbjxDbGFzczw/Pj4+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDw+KCk7CisKKyAgICAgICAgICAgIHJlc3VsdHMucHV0KGNhbGxiYWNrLCByZWdpc3RlcihjYWxsYmFjaykpOworCisgICAgICAgICAgICBmb3IgKGZpbmFsIENsYXNzPD8+IGMgOiBjYWxsYmFja3MpIHsKKyAgICAgICAgICAgICAgICByZXN1bHRzLnB1dChjLCByZWdpc3RlcihjKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiByZXN1bHRzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDb2xsZWN0aW9uPENsYXNzPD8+PiByZWdpc3RlcihmaW5hbCBPYmplY3QgY2FsbGJhY2spIHsKKyAgICAgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tOb3ROdWxsKGNhbGxiYWNrLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5QQVJBTV9OVUxMKCJjYWxsYmFjayIpKTsKKworICAgICAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxDbGFzczw/Pj4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgICAgICAgICAgZm9yIChmaW5hbCBBYnN0cmFjdENhbGxiYWNrUnVubmVyPD8+IHJ1bm5lciA6IGNhbGxiYWNrUnVubmVycykgeworICAgICAgICAgICAgICAgIGlmIChydW5uZXIuc3VwcG9ydHMoY2FsbGJhY2suZ2V0Q2xhc3MoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bm5lci5yZWdpc3RlcihjYWxsYmFjaykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQocnVubmVyLmdldENhbGxiYWNrQ29udHJhY3QoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE1hcDxDbGFzczw/PiwgQ29sbGVjdGlvbjxDbGFzczw/Pj4+IHJlZ2lzdGVyKGZpbmFsIE9iamVjdCBjYWxsYmFjaywgZmluYWwgT2JqZWN0Li4uIGNhbGxiYWNrcykgeworICAgICAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGwoY2FsbGJhY2ssIExvY2FsaXphdGlvbk1lc3NhZ2VzLlBBUkFNX05VTEwoImNhbGxiYWNrIikpOworICAgICAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGwoY2FsbGJhY2tzLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5DQUxMQkFDS19BUlJBWV9OVUxMKCkpOworICAgICAgICAgICAgZm9yIChmaW5hbCBPYmplY3QgYWRkaXRpb25hbENhbGxiYWNrIDogY2FsbGJhY2tzKSB7CisgICAgICAgICAgICAgICAgUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGwoYWRkaXRpb25hbENhbGxiYWNrLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5DQUxMQkFDS19BUlJBWV9FTEVNRU5UX05VTEwoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIE1hcDxDbGFzczw/PiwgQ29sbGVjdGlvbjxDbGFzczw/Pj4+IHJlc3VsdHMgPSBuZXcgSGFzaE1hcDw+KCk7CisKKyAgICAgICAgICAgIHJlc3VsdHMucHV0KGNhbGxiYWNrLmdldENsYXNzKCksIHJlZ2lzdGVyKGNhbGxiYWNrKSk7CisKKyAgICAgICAgICAgIGZvciAoZmluYWwgT2JqZWN0IGMgOiBjYWxsYmFja3MpIHsKKyAgICAgICAgICAgICAgICByZXN1bHRzLnB1dChjLmdldENsYXNzKCksIHJlZ2lzdGVyKGMpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBYnN0cmFjdCBjb21wb3NpdGUgY2FsbGJhY2sgcnVubmVyLgorICAgICAqIDxwLz4KKyAgICAgKiBUaGUgcnVubmVyIHN1cHBvcnRzIHJlZ2lzdGVyaW5nIG11bHRpcGxlIGNhbGxiYWNrcyBvZiBhIHNwZWNpZmljIHR5cGUgYW5kIHRoZSBleGVjdXRlIHRoZSBjYWxsYmFjayBtZXRob2QKKyAgICAgKiBvbiBhbGwgdGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2tzLgorICAgICAqCisgICAgICogQHBhcmFtIDxUPiBjYWxsYmFjayB0eXBlCisgICAgICovCisgICAgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIEFic3RyYWN0Q2FsbGJhY2tSdW5uZXI8VD4geworCisgICAgICAgIHByaXZhdGUgZmluYWwgUXVldWU8VD4gY2FsbGJhY2tzID0gbmV3IENvbmN1cnJlbnRMaW5rZWRRdWV1ZTw+KCk7CisgICAgICAgIHByaXZhdGUgZmluYWwgTG9nZ2VyIGxvZ2dlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIG5ldyBjYWxsYmFjayBydW5uZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBsb2dnZXIgbG9nZ2VyIGluc3RhbmNlIHRvIGJlIHVzZWQgYnkgdGhlIHJ1bm5lciB0byBmaXJlIGxvZ2dpbmcgZXZlbnRzLgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIEFic3RyYWN0Q2FsbGJhY2tSdW5uZXIoZmluYWwgTG9nZ2VyIGxvZ2dlcikgeworICAgICAgICAgICAgdGhpcy5sb2dnZXIgPSBsb2dnZXI7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIHRydWUgaWYgdGhpcyBjYWxsYmFjayBydW5uZXIgc3VwcG9ydHMgdGhlIHtAY29kZSBjYWxsYmFja0NsYXNzfS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrQ2xhc3MgQ2FsbGJhY2sgdG8gYmUgY2hlY2tlZC4KKyAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoaXMgY2FsbGJhY2sgcnVubmVyIHN1cHBvcnRzIHRoZSB7QGNvZGUgY2FsbGJhY2tDbGFzc307IGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIHN1cHBvcnRzKGZpbmFsIENsYXNzPD8+IGNhbGxiYWNrQ2xhc3MpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRDYWxsYmFja0NvbnRyYWN0KCkuaXNBc3NpZ25hYmxlRnJvbShjYWxsYmFja0NsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIGNhbGxiYWNrIGNvbnRyYWN0IHN1cHBvcnRlZCBieSB0aGlzIGNhbGxiYWNrIHJ1bm5lci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBjYWxsYmFjayBjb250cmFjdCBzdXBwb3J0ZWQgYnkgdGhpcyBjYWxsYmFjayBydW5uZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgQ2xhc3M8Pz4gZ2V0Q2FsbGJhY2tDb250cmFjdCgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZWdpc3RlciBuZXcgY2FsbGJhY2sgaW5zdGFuY2UuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjYWxsYmFjayBuZXcgY2FsbGJhY2sgaW5zdGFuY2UgdG8gYmUgcmVnaXN0ZXJlZC4KKyAgICAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gdXBvbiBzdWNjZXNzZnVsIHJlZ2lzdHJhdGlvbiwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgcHVibGljIGJvb2xlYW4gcmVnaXN0ZXIoZmluYWwgT2JqZWN0IGNhbGxiYWNrKSB7CisgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2tzLm9mZmVyKChUKSBjYWxsYmFjayk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRXhlY3V0ZSBhbGwgcmVnaXN0ZXJlZCBjYWxsYmFja3MgdXNpbmcgdGhlIHN1cHBsaWVkIGludm9rZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBpbnZva2VyIGludm9rZXIgcmVzcG9uc2libGUgZm9yIHRvIGV4ZWN1dGluZyBhbGwgcmVnaXN0ZXJlZCBjYWxsYmFja3MuCisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBleGVjdXRlQ2FsbGJhY2tzKGZpbmFsIENsb3N1cmU8VD4gaW52b2tlcikgeworICAgICAgICAgICAgZm9yIChmaW5hbCBUIGNhbGxiYWNrIDogY2FsbGJhY2tzKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaW52b2tlci5pbnZva2UoY2FsbGJhY2spOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5sb2coTGV2ZWwuV0FSTklORywgTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfQVNZTkNfQ0FMTEJBQ0tfRkFJTEVEKGNhbGxiYWNrLmdldENsYXNzKCkuZ2V0TmFtZSgpKSwgdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29tcGxldGlvbkNhbGxiYWNrUnVubmVyCisgICAgICAgICAgICBleHRlbmRzIEFic3RyYWN0Q2FsbGJhY2tSdW5uZXI8Q29tcGxldGlvbkNhbGxiYWNrPiBpbXBsZW1lbnRzIENvbXBsZXRpb25DYWxsYmFjayB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoQ29tcGxldGlvbkNhbGxiYWNrUnVubmVyLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICAgICAgcHJpdmF0ZSBDb21wbGV0aW9uQ2FsbGJhY2tSdW5uZXIoKSB7CisgICAgICAgICAgICBzdXBlcihMT0dHRVIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDbGFzczw/PiBnZXRDYWxsYmFja0NvbnRyYWN0KCkgeworICAgICAgICAgICAgcmV0dXJuIENvbXBsZXRpb25DYWxsYmFjay5jbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKGZpbmFsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKKyAgICAgICAgICAgIGV4ZWN1dGVDYWxsYmFja3MobmV3IENsb3N1cmU8Q29tcGxldGlvbkNhbGxiYWNrPigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBpbnZva2UoZmluYWwgQ29tcGxldGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uQ29tcGxldGUodGhyb3dhYmxlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENvbm5lY3Rpb25DYWxsYmFja1J1bm5lcgorICAgICAgICAgICAgZXh0ZW5kcyBBYnN0cmFjdENhbGxiYWNrUnVubmVyPENvbm5lY3Rpb25DYWxsYmFjaz4gaW1wbGVtZW50cyBDb25uZWN0aW9uQ2FsbGJhY2sgeworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKENvbm5lY3Rpb25DYWxsYmFja1J1bm5lci5jbGFzcy5nZXROYW1lKCkpOworCisgICAgICAgIHByaXZhdGUgQ29ubmVjdGlvbkNhbGxiYWNrUnVubmVyKCkgeworICAgICAgICAgICAgc3VwZXIoTE9HR0VSKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0Q2FsbGJhY2tDb250cmFjdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBDb25uZWN0aW9uQ2FsbGJhY2suY2xhc3M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25EaXNjb25uZWN0KGZpbmFsIEFzeW5jUmVzcG9uc2UgZGlzY29ubmVjdGVkKSB7CisgICAgICAgICAgICBleGVjdXRlQ2FsbGJhY2tzKG5ldyBDbG9zdXJlPENvbm5lY3Rpb25DYWxsYmFjaz4oKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgaW52b2tlKGZpbmFsIENvbm5lY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgeworICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vbkRpc2Nvbm5lY3QoZGlzY29ubmVjdGVkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL1N1YmplY3RTZWN1cml0eUNvbnRleHQuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL1N1YmplY3RTZWN1cml0eUNvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzlhZTEzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvU3ViamVjdFNlY3VyaXR5Q29udGV4dC5qYXZhCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyOworCitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5TZWN1cml0eUNvbnRleHQ7CisKKy8qKgorICogU2VjdXJpdHkgY29udGV4dCB0aGF0IGFsbG93cyBlc3RhYmxpc2hpbmcgYSBzdWJqZWN0IGJlZm9yZSBhIHJlc291cmNlIG1ldGhvZAorICogb3IgYSBzdWItcmVzb3VyY2UgbG9jYXRvciBpcyBjYWxsZWQuIENvbnRhaW5lciBvciBmaWx0ZXJzIHNob3VsZCBzZXQgYW4KKyAqIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgaW50ZXJmYWNlIHRvIHRoZSByZXF1ZXN0IGNvbnRleHQgdXNpbmcKKyAqIHtAbGluayBDb250YWluZXJSZXF1ZXN0I3NldFNlY3VyaXR5Q29udGV4dChqYXZheC53cy5ycy5jb3JlLlNlY3VyaXR5Q29udGV4dCl9LgorICoKKyAqIFdoZW4gSmVyc2V5IGRldGVjdHMgdGhpcyBraW5kIG9mIGNvbnRleHQgaXMgaW4gdGhlIHJlcXVlc3Qgc2NvcGUsCisgKiBpdCB3aWxsIHVzZSB7QGxpbmsgI2RvQXNTdWJqZWN0KGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbil9IG1ldGhvZCB0bworICogZGlzcGF0Y2ggdGhlIHJlcXVlc3QgdG8gYSByZXNvdXJjZSBtZXRob2QgKG9yIHRvIGNhbGwgYSBzdWItcmVzb3VyY2UgbG9jYXRvcikuCisgKgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGludGVyZmFjZSBTdWJqZWN0U2VjdXJpdHlDb250ZXh0IGV4dGVuZHMgU2VjdXJpdHlDb250ZXh0IHsKKworICAgIC8qKgorICAgICAqIEplcnNleSB3cmFwcyBjYWxscyB0byByZXNvdXJjZSBtZXRob2RzIGFuZCBzdWItcmVzb3VyY2UgbG9jYXRvcnMgaW4KKyAgICAgKiB7QGxpbmsgUHJpdmlsZWdlZEFjdGlvbn0gaW5zdGFuY2UgYW5kIHBhc3NlcyBpdCB0byB0aGlzIG1ldGhvZCB3aGVuCisgICAgICogZGlzcGF0Y2hpbmcgYSByZXF1ZXN0LiBJbXBsZW1lbnRhdGlvbnMgc2hvdWxkIGRvIHRoZSBuZWVkZnVsIHRvIGVzdGFibGlzaAorICAgICAqIGEge0BsaW5rIGphdmF4LnNlY3VyaXR5LmF1dGguU3ViamVjdH0gYW5kIGludm9rZSB0aGUge0BsaW5rIFByaXZpbGVnZWRBY3Rpb259CisgICAgICogcGFzc2VkIGFzIHRoZSBwYXJhbWV0ZXIgdXNpbmcKKyAgICAgKiB7QGxpbmsgamF2YXguc2VjdXJpdHkuYXV0aC5TdWJqZWN0I2RvQXMoamF2YXguc2VjdXJpdHkuYXV0aC5TdWJqZWN0LCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb24pfS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgcHJpdmlsZWdlZCBhY3Rpb24gcGFzc2VkIGludG8gdGhlIG1ldGhvZCBtYXksIHdoZW4gaW52b2tlZCwgZmFpbCB3aXRoIGVpdGhlcgorICAgICAqIHtAbGluayBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbn0gb3Ige0BsaW5rIGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb259LgorICAgICAqIEJvdGggdGhlc2UgZXhjZXB0aW9ucyBtdXN0IGJlIHByb3BhZ2F0ZWQgdG8gdGhlIGNhbGxlciB3aXRob3V0IGEgbW9kaWZpY2F0aW9uLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhY3Rpb24ge0BsaW5rIFByaXZpbGVnZWRBY3Rpb259IHRoYXQgcmVwcmVzZW50cyBhIHJlc291cmNlIG9yIHN1Yi1yZXNvdXJjZSBsb2NhdG9yCisgICAgICogICAgICAgICAgICAgICBtZXRob2QgaW52b2NhdGlvbiB0byBiZSBleGVjdXRlZCBieSB0aGlzIG1ldGhvZCBhZnRlciBlc3RhYmxpc2hpbmcgYSBzdWJqZWN0LgorICAgICAqIEByZXR1cm4gcmVzdWx0IG9mIHRoZSBhY3Rpb24uCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGUge0Bjb2RlIFByaXZpbGVnZWRBY3Rpb259IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uICAgIGlmIHRoZSBjYWxsZXIgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGludm9rZSB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAY29kZSBTdWJqZWN0I2RvQXMoU3ViamVjdCwgUHJpdmlsZWdlZEFjdGlvbil9IG1ldGhvZC4KKyAgICAgKiBAdGhyb3dzIGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wYWdhdGVkIGV4Y2VwdGlvbiBmcm9tIHRoZSBwcml2aWxlZ2VkIGFjdGlvbi4gTWF5IGJlIHRocm93biBpbiBjYXNlIHRoZSBpbnZvY2F0aW9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiByZXNvdXJjZSBvciBzdWItcmVzb3VyY2UgbG9jYXRvciBtZXRob2QgaW4gdGhlIHByaXZpbGVnZWQgYWN0aW9uIHJlc3VsdHMgaW4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEB0aHJvd3MgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGFnYXRlZCBleGNlcHRpb24gZnJvbSB0aGUgcHJpdmlsZWdlZCBhY3Rpb24uIE1heSBiZSB0aHJvd24gaW4gY2FzZSB0aGUgaW52b2NhdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgcmVzb3VyY2Ugb3Igc3ViLXJlc291cmNlIGxvY2F0b3IgbWV0aG9kIGluIHRoZSBwcml2aWxlZ2VkIGFjdGlvbiBoYXMgZmFpbGVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciByZXN1bHRlZCBpbiBhIG5vbi1jaGVja2VkIGV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGRvQXNTdWJqZWN0KFByaXZpbGVnZWRBY3Rpb24gYWN0aW9uKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL1RyYWNpbmdDb25maWcuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL1RyYWNpbmdDb25maWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDUzZWFhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvVHJhY2luZ0NvbmZpZy5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyOworCisvKioKKyAqIEVudW1lcmF0aW9uIG9mIHBvc3NpYmxlIHZhbHVlcyBvZiBwcm9wZXJ0eSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMjVFJBQ0lOR30uCisgKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqIEBzaW5jZSAyLjMKKyAqLworcHVibGljIGVudW0gVHJhY2luZ0NvbmZpZyB7CisgICAgLyoqCisgICAgICogVHJhY2luZyBzdXBwb3J0IGlzIGNvbXBsZXRlbHkgZGlzYWJsZWQuCisgICAgICovCisgICAgT0ZGLAorICAgIC8qKgorICAgICAqIFRyYWNpbmcgc3VwcG9ydCBpcyBpbiBzdGFuZC1ieSBtb2RlLiBXYWl0aW5nIGZvciBhIHJlcXVlc3QgaGVhZGVyCisgICAgICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuVHJhY2luZ0xvZ2dlciNIRUFERVJfQUNDRVBUfSBleGlzdGVuY2UuCisgICAgICovCisgICAgT05fREVNQU5ELAorICAgIC8qKgorICAgICAqIFRyYWNpbmcgc3VwcG9ydCBpcyBlbmFibGVkIGZvciBldmVyeSByZXF1ZXN0LgorICAgICAqLworICAgIEFMTAorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvVHJhY2luZ1V0aWxzLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9UcmFjaW5nVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODlmYWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvVHJhY2luZ1V0aWxzLmphdmEKQEAgLTAsMCArMSwxODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5UcmFjaW5nTG9nZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5TZXJ2ZXJUcmFjZUV2ZW50OworCisvKioKKyAqIFV0aWxpdGllcyBmb3IgdHJhY2luZyBzdXBwb3J0LgorICoKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKiBAc2luY2UgMi4zCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBUcmFjaW5nVXRpbHMgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdDxTdHJpbmc+IFNVTU1BUllfSEVBREVSUyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgc3RhdGljIHsKKyAgICAgICAgU1VNTUFSWV9IRUFERVJTLmFkZChIdHRwSGVhZGVycy5BQ0NFUFQudG9Mb3dlckNhc2UoKSk7CisgICAgICAgIFNVTU1BUllfSEVBREVSUy5hZGQoSHR0cEhlYWRlcnMuQUNDRVBUX0VOQ09ESU5HLnRvTG93ZXJDYXNlKCkpOworICAgICAgICBTVU1NQVJZX0hFQURFUlMuYWRkKEh0dHBIZWFkZXJzLkFDQ0VQVF9DSEFSU0VULnRvTG93ZXJDYXNlKCkpOworICAgICAgICBTVU1NQVJZX0hFQURFUlMuYWRkKEh0dHBIZWFkZXJzLkFDQ0VQVF9MQU5HVUFHRS50b0xvd2VyQ2FzZSgpKTsKKyAgICAgICAgU1VNTUFSWV9IRUFERVJTLmFkZChIdHRwSGVhZGVycy5DT05URU5UX1RZUEUudG9Mb3dlckNhc2UoKSk7CisgICAgICAgIFNVTU1BUllfSEVBREVSUy5hZGQoSHR0cEhlYWRlcnMuQ09OVEVOVF9MRU5HVEgudG9Mb3dlckNhc2UoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHJhY2luZ0NvbmZpZyBERUZBVUxUX0NPTkZJR1VSQVRJT05fVFlQRSA9IFRyYWNpbmdDb25maWcuT0ZGOworCisgICAgcHJpdmF0ZSBUcmFjaW5nVXRpbHMoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWNjb3JkaW5nIHRvIGNvbmZpZ3VyYXRpb24vcmVxdWVzdCBoZWFkZXIgaXQgaW5pdGlhbGl6ZSB7QGxpbmsgVHJhY2luZ0xvZ2dlcn0gYW5kIHB1dCBpdCB0byB0aGUgcmVxdWVzdCBwcm9wZXJ0aWVzLgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgICAgICAgICAgICAgYXBwbGljYXRpb24td2lkZSB0cmFjaW5nIGNvbmZpZ3VyYXRpb24gdHlwZS4KKyAgICAgKiBAcGFyYW0gYXBwVGhyZXNob2xkICAgICBhcHBsaWNhdGlvbi13aWRlIHRyYWNpbmcgbGV2ZWwgdGhyZXNob2xkLgorICAgICAqIEBwYXJhbSBjb250YWluZXJSZXF1ZXN0IHJlcXVlc3QgaW5zdGFuY2UgdG8gZ2V0IHJ1bnRpbWUgcHJvcGVydGllcyB0byBzdG9yZSB7QGxpbmsgVHJhY2luZ0xvZ2dlcn0gaW5zdGFuY2UgdG8KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0cmFjaW5nIHN1cHBvcnQgaXMgZW5hYmxlZCBmb3IgdGhlIHJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGluaXRUcmFjaW5nU3VwcG9ydChUcmFjaW5nQ29uZmlnIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFjaW5nTG9nZ2VyLkxldmVsIGFwcFRocmVzaG9sZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRhaW5lclJlcXVlc3QgY29udGFpbmVyUmVxdWVzdCkgeworICAgICAgICBmaW5hbCBUcmFjaW5nTG9nZ2VyIHRyYWNpbmdMb2dnZXI7CisgICAgICAgIGlmIChpc1RyYWNpbmdTdXBwb3J0RW5hYmxlZCh0eXBlLCBjb250YWluZXJSZXF1ZXN0KSkgeworICAgICAgICAgICAgdHJhY2luZ0xvZ2dlciA9IFRyYWNpbmdMb2dnZXIuY3JlYXRlKAorICAgICAgICAgICAgICAgICAgICBnZXRUcmFjaW5nVGhyZXNob2xkKGFwcFRocmVzaG9sZCwgY29udGFpbmVyUmVxdWVzdCksCisgICAgICAgICAgICAgICAgICAgIGdldFRyYWNpbmdMb2dnZXJOYW1lU3VmZml4KGNvbnRhaW5lclJlcXVlc3QpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyYWNpbmdMb2dnZXIgPSBUcmFjaW5nTG9nZ2VyLmVtcHR5KCk7CisgICAgICAgIH0KKworICAgICAgICBjb250YWluZXJSZXF1ZXN0LnNldFByb3BlcnR5KFRyYWNpbmdMb2dnZXIuUFJPUEVSVFlfTkFNRSwgdHJhY2luZ0xvZ2dlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9nIHRyYWNpbmcgbWVzc2FnZXMgU1RBUlQgZXZlbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgY29udGFpbmVyIHJlcXVlc3QgaW5zdGFuY2UgdG8gZ2V0IHJ1bnRpbWUgcHJvcGVydGllcworICAgICAqICAgICAgICAgICAgICAgIHRvIGNoZWNrIGlmIHRyYWNpbmcgc3VwcG9ydCBpcyBlbmFibGVkIGZvciB0aGUgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbG9nU3RhcnQoQ29udGFpbmVyUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIFRyYWNpbmdMb2dnZXIgdHJhY2luZ0xvZ2dlciA9IFRyYWNpbmdMb2dnZXIuZ2V0SW5zdGFuY2UocmVxdWVzdCk7CisgICAgICAgIGlmICh0cmFjaW5nTG9nZ2VyLmlzTG9nRW5hYmxlZChTZXJ2ZXJUcmFjZUV2ZW50LlNUQVJUKSkgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciB0ZXh0U0IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgdGV4dFNCLmFwcGVuZChTdHJpbmcuZm9ybWF0KCJiYXNlVXJpPVslc10gcmVxdWVzdFVyaT1bJXNdIG1ldGhvZD1bJXNdIGF1dGhTY2hlbWU9WyVzXSIsCisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0QmFzZVVyaSgpLCByZXF1ZXN0LmdldFJlcXVlc3RVcmkoKSwgcmVxdWVzdC5nZXRNZXRob2QoKSwKKyAgICAgICAgICAgICAgICAgICAgdG9TdHJpbmdPck5BKHJlcXVlc3QuZ2V0U2VjdXJpdHlDb250ZXh0KCkuZ2V0QXV0aGVudGljYXRpb25TY2hlbWUoKSkpKTsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIGhlYWRlciA6IFNVTU1BUllfSEVBREVSUykgeworICAgICAgICAgICAgICAgIHRleHRTQi5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiICVzPSVzIiwgaGVhZGVyLCB0b1N0cmluZ09yTkEocmVxdWVzdC5nZXRSZXF1ZXN0SGVhZGVycygpLmdldChoZWFkZXIpKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJhY2luZ0xvZ2dlci5sb2coU2VydmVyVHJhY2VFdmVudC5TVEFSVCwgdGV4dFNCLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIGlmICh0cmFjaW5nTG9nZ2VyLmlzTG9nRW5hYmxlZChTZXJ2ZXJUcmFjZUV2ZW50LlNUQVJUX0hFQURFUlMpKSB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHRleHRTQiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBoZWFkZXIgOiByZXF1ZXN0LmdldFJlcXVlc3RIZWFkZXJzKCkua2V5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIVNVTU1BUllfSEVBREVSUy5jb250YWlucyhoZWFkZXIpKSB7CisgICAgICAgICAgICAgICAgICAgIHRleHRTQi5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiICVzPSVzIiwgaGVhZGVyLCB0b1N0cmluZ09yTkEocmVxdWVzdC5nZXRSZXF1ZXN0SGVhZGVycygpLmdldChoZWFkZXIpKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0ZXh0U0IubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgdGV4dFNCLmluc2VydCgwLCAiT3RoZXIgcmVxdWVzdCBoZWFkZXJzOiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJhY2luZ0xvZ2dlci5sb2coU2VydmVyVHJhY2VFdmVudC5TVEFSVF9IRUFERVJTLCB0ZXh0U0IudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGlmIGFwcGxpY2F0aW9uIGFuZCByZXF1ZXN0IHNldHRpbmdzIGVuYWJsZWQgdHJhY2luZyBzdXBwb3J0LgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgICAgICAgICAgICAgYXBwbGljYXRpb24gdHJhY2luZyBjb25maWd1cmF0aW9uIHR5cGUuCisgICAgICogQHBhcmFtIGNvbnRhaW5lclJlcXVlc3QgcmVxdWVzdCBpbnN0YW5jZSB0byBjaGVjayByZXF1ZXN0IGhlYWRlcnMuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdHJhY2luZyBzdXBwb3J0IGlzIHN3aXRjaGVkIG9uIGZvciB0aGUgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzVHJhY2luZ1N1cHBvcnRFbmFibGVkKFRyYWNpbmdDb25maWcgdHlwZSwgQ29udGFpbmVyUmVxdWVzdCBjb250YWluZXJSZXF1ZXN0KSB7CisgICAgICAgIHJldHVybiAodHlwZSA9PSBUcmFjaW5nQ29uZmlnLkFMTCkKKyAgICAgICAgICAgICAgICB8fCAoKHR5cGUgPT0gVHJhY2luZ0NvbmZpZy5PTl9ERU1BTkQpICYmIChjb250YWluZXJSZXF1ZXN0LmdldEhlYWRlclN0cmluZyhUcmFjaW5nTG9nZ2VyLkhFQURFUl9BQ0NFUFQpICE9IG51bGwpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gY29uZmlndXJhdGlvbiB0eXBlIG9mIHRyYWNpbmcgc3VwcG9ydCBhY2NvcmRpbmcgdG8gYXBwbGljYXRpb24gY29uZmlndXJhdGlvbi4KKyAgICAgKgorICAgICAqIEJ5IGRlZmF1bHQgdHJhY2luZyBzdXBwb3J0IGlzIHN3aXRjaGVkIE9GRi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uIGFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24uCisgICAgICogQHJldHVybiBjb25maWd1cmF0aW9uIHR5cGUsIHRyYW5zZm9ybWVkIHRleHQgdmFsdWUgdG8gZW51bSByZWFkIGZyb20gY29uZmlndXJhdGlvbiBvciBkZWZhdWx0LgorICAgICAqLworICAgIC8qcGFja2FnZSovCisgICAgc3RhdGljIFRyYWNpbmdDb25maWcgZ2V0VHJhY2luZ0NvbmZpZyhDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHRyYWNpbmdUZXh0ID0gU2VydmVyUHJvcGVydGllcy5nZXRWYWx1ZShjb25maWd1cmF0aW9uLmdldFByb3BlcnRpZXMoKSwKKyAgICAgICAgICAgICAgICBTZXJ2ZXJQcm9wZXJ0aWVzLlRSQUNJTkcsIFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgZmluYWwgVHJhY2luZ0NvbmZpZyByZXN1bHQ7CisgICAgICAgIGlmICh0cmFjaW5nVGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXN1bHQgPSBUcmFjaW5nQ29uZmlnLnZhbHVlT2YodHJhY2luZ1RleHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzdWx0ID0gREVGQVVMVF9DT05GSUdVUkFUSU9OX1RZUEU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgcmVxdWVzdCBoZWFkZXIgc3BlY2lmaWVkIEpESyBsb2dnZXIgbmFtZSBzdWZmaXguCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCBjb250YWluZXIgcmVxdWVzdCBpbnN0YW5jZSB0byBnZXQgcmVxdWVzdCBoZWFkZXIge0BsaW5rIFRyYWNpbmdMb2dnZXIjSEVBREVSX0xPR0dFUn0gdmFsdWUuCisgICAgICogQHJldHVybiBMb2dnZXIgbmFtZSBzdWZmaXggb3Ige0Bjb2RlIG51bGx9IGlmIG5vdCBzZXQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFRyYWNpbmdMb2dnZXJOYW1lU3VmZml4KENvbnRhaW5lclJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRIZWFkZXJTdHJpbmcoVHJhY2luZ0xvZ2dlci5IRUFERVJfTE9HR0VSKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYXBwbGljYXRpb24td2lkZSB0cmFjaW5nIGxldmVsIHRocmVzaG9sZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uIGFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24uCisgICAgICogQHJldHVybiB0cmFjaW5nIGxldmVsIHRocmVzaG9sZC4KKyAgICAgKi8KKyAgICAvKnBhY2thZ2UqLworICAgIHN0YXRpYyBUcmFjaW5nTG9nZ2VyLkxldmVsIGdldFRyYWNpbmdUaHJlc2hvbGQoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyB0aHJlc2hvbGRUZXh0ID0gU2VydmVyUHJvcGVydGllcy5nZXRWYWx1ZSgKKyAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLmdldFByb3BlcnRpZXMoKSwKKyAgICAgICAgICAgICAgICBTZXJ2ZXJQcm9wZXJ0aWVzLlRSQUNJTkdfVEhSRVNIT0xELCBTdHJpbmcuY2xhc3MpOworCisgICAgICAgIHJldHVybiAodGhyZXNob2xkVGV4dCA9PSBudWxsKSA/IFRyYWNpbmdMb2dnZXIuREVGQVVMVF9MRVZFTCA6IFRyYWNpbmdMb2dnZXIuTGV2ZWwudmFsdWVPZih0aHJlc2hvbGRUZXh0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBUcmFjaW5nTG9nZ2VyLkxldmVsIGdldFRyYWNpbmdUaHJlc2hvbGQoVHJhY2luZ0xvZ2dlci5MZXZlbCBhcHBUaHJlc2hvbGQsIENvbnRhaW5lclJlcXVlc3QgY29udGFpbmVyUmVxdWVzdCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgdGhyZXNob2xkVGV4dCA9IGNvbnRhaW5lclJlcXVlc3QuZ2V0SGVhZGVyU3RyaW5nKFRyYWNpbmdMb2dnZXIuSEVBREVSX1RIUkVTSE9MRCk7CisKKyAgICAgICAgcmV0dXJuICh0aHJlc2hvbGRUZXh0ID09IG51bGwpID8gYXBwVGhyZXNob2xkIDogVHJhY2luZ0xvZ2dlci5MZXZlbC52YWx1ZU9mKHRocmVzaG9sZFRleHQpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0b1N0cmluZ09yTkEoT2JqZWN0IG9iamVjdCkgeworICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAibi9hIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZihvYmplY3QpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9VcmkuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL1VyaS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiN2RiMDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9VcmkuamF2YQpAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKKworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5GSUVMRDsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5QQVJBTUVURVI7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FOworCisvKioKKyAqIEluamVjdHMgYSB7QGxpbmsgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldCByZXNvdXJjZSB0YXJnZXR9IHBvaW50aW5nIGF0CisgKiBhIHJlc291cmNlIGlkZW50aWZpZWQgYnkgdGhlIHJlc29sdmVkIFVSSSBpbnRvIGEgbWV0aG9kIHBhcmFtZXRlciwKKyAqIGNsYXNzIGZpZWxkIG9yIGEgYmVhbiBwcm9wZXJ0eS4KKyAqIDxwLz4KKyAqIEluamVjdGVkIHZhcmlhYmxlIG11c3QgYmUgb2YgdHlwZSB7QGxpbmsgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldH0uCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhcgorICogQHNlZSBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0CisgKiBAc2luY2UgMi4wCisgKi8KK0BqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQoe1BBUkFNRVRFUiwgRklFTEQsIE1FVEhPRH0pCitAUmV0ZW50aW9uKFJVTlRJTUUpCitARG9jdW1lbnRlZAorcHVibGljIEBpbnRlcmZhY2UgVXJpIHsKKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB0aGUgVVJJIG9mIHRoZSBpbmplY3RlZCB7QGxpbmsgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldAorICAgICAqIHJlc291cmNlIHRhcmdldH0uCisgICAgICoKKyAgICAgKiBUaGUgdmFsdWUgbXVzdCBiZSBpbiB0aGUgZm9ybSBvZiBhYnNvbHV0ZSBVUkkgaWYgbm90IHVzZWQgZnJvbSBpbnNpZGUgb2YKKyAgICAgKiBhIEpBWC1SUyBjb21wb25lbnQgY2xhc3MuIEZvciBleGFtcGxlOgorICAgICAqIDxwcmU+CisgICAgICogcHVibGljIGNsYXNzIEF1ZGl0aW5nRmlsdGVyIGltcGxlbWVudHMgUmVxdWVzdEZpbHRlciB7CisgICAgICogICAgJiM2NDtVcmkoInVzZXJzL3tuYW1lfS9vcmRlcnMiKQorICAgICAqICAgIFdlYlRhcmdldCB1c2VyT3JkZXJzOworICAgICAqCisgICAgICogICAgLy8gQW4gZXh0ZXJuYWwgcmVzb3VyY2UgdGFyZ2V0CisgICAgICogICAgJiM2NDtVcmkoImh0dHA6Ly9tYWlsLmFjbWUuY29tL2FjY291bnRzL3tuYW1lfSIpCisgICAgICogICAgV2ViVGFyZ2V0IHVzZXJFbWFpbEFjY291bnQ7CisgICAgICoKKyAgICAgKiAgICAvLyBBbiBleHRlcm5hbCwgdGVtcGxhdGUtYmFzZWQgcmVzb3VyY2UgdGFyZ2V0CisgICAgICogICAgJiM2NDtVcmkoImh0dHA6Ly97YXVkaXQtaG9zdH06e2F1ZGl0LXBvcnR9L2F1ZGl0bG9ncy8iKQorICAgICAqICAgIFdlYlRhcmdldCBhdWRpdExvZ3M7CisgICAgICogICAgLi4uCisgICAgICogfQorICAgICAqIDwvcHJlPgorICAgICAqCisgICAgICogSWYgdXNlZCBmcm9tIHdpdGhpbiBhIEpBWC1SUyBjb21wb25lbnQgY2xhc3MgKGUuZy4gcmVzb3VyY2UsIGZpbHRlciwgcHJvdmlkZXImbmJzcDsmaGVsbGlwOyZuYnNwOyksCisgICAgICogdGhlIHZhbHVlIGNhbiB0YWtlIGEgZm9ybSBvZiBhYnNvbHV0ZSBvciByZWxhdGl2ZSBVUkkuCisgICAgICogQSByZWxhdGl2ZSBVUkkgaXMgcmVzb2x2ZWQgdXNpbmcgdGhlIGNvbnRleHQgcGF0aCBvZiB0aGUgYXBwbGljYXRpb24gYXMgdGhlIGJhc2UgVVJJLgorICAgICAqIEZvciBleGFtcGxlOgorICAgICAqIDxwcmU+CisgICAgICogcHVibGljIGNsYXNzIEF1ZGl0aW5nRmlsdGVyIGltcGxlbWVudHMgUmVxdWVzdEZpbHRlciB7CisgICAgICogICAgJiM2NDtVcmkoImF1ZGl0L2xvZ3MiKQorICAgICAqICAgIFdlYlRhcmdldCBhcHBsaWNhdGlvbkxvZ3M7CisgICAgICoKKyAgICAgKiAgICAmIzY0O1VyaSgiaHR0cDovL3NhbGVzLmFjbWUuY29tL2F1ZGl0L2xvZ3MiKQorICAgICAqICAgIFdlYlRhcmdldCBkb21haW5Mb2dzOworICAgICAqCisgICAgICogICAgLi4uCisgICAgICogfQorICAgICAqIDwvcHJlPgorICAgICAqCisgICAgICogSW4gY2FzZSB0aGUgYW5ub3RhdGlvbiBpcyB1c2VkIGZyb20gYSBKQVgtUlMgcmVzb3VyY2UgY2xhc3MsIGFuIGFic29sdXRlCisgICAgICogb3IgcmVsYXRpdmUgVVJJIHRlbXBsYXRlIHZhbHVlIG1heSBiZSBwcm92aWRlZC4gVGhlIHRlbXBsYXRlIHBhcmFtZXRlciAoZS5nLiB7QGNvZGUge2lkfX0pCisgICAgICogdmFsdWVzIGFyZSBhdXRvbWF0aWNhbGx5IHJlc29sdmVkIGluIHRoZSBjb250ZXh0IG9mIHRoZSBlbmNsb3NpbmcgcmVzb3VyY2UgY2xhc3MKKyAgICAgKiB7QGxpbmsgamF2YXgud3MucnMuUGF0aCBwYXRoIHRlbXBsYXRlfSBhcyB3ZWxsIGFzIHRoZSBjb250ZXh0IG9mIHRoZSBwcm9jZXNzZWQgcmVxdWVzdC4KKyAgICAgKiBPdGhlciBkZWZpbmVkIHRlbXBsYXRlIHBhcmFtZXRlcnMgaGF2ZSB0byBiZSByZXNvbHZlZCBiZWZvcmUgaW52b2NhdGlvbiBvZiBtYW5hZ2VkIHdlYiB0YXJnZXQuCisgICAgICogRm9yIGV4YW1wbGU6CisgICAgICogPHByZT4KKyAgICAgKiAmIzY0O1BhdGgoInVzZXJzL3tuYW1lfSIpCisgICAgICogcHVibGljIGNsYXNzIE15UmVzb3VyY2UgeworICAgICAqICAgICYjNjQ7VXJpKCJ1c2Vycy97bmFtZX0vb3JkZXJzIikKKyAgICAgKiAgICBXZWJUYXJnZXQgdXNlck9yZGVyczsKKyAgICAgKgorICAgICAqICAgICYjNjQ7VXJpKCJodHRwOi8vbWFpbC5hY21lLmNvbS9hY2NvdW50cy97bmFtZX0iKQorICAgICAqICAgIFdlYlRhcmdldCB1c2VyRW1haWxBY2NvdW50OworICAgICAqCisgICAgICogICAgLi4uCisgICAgICogfQorICAgICAqIDwvcHJlPgorICAgICAqCisgICAgICogQHNlZSBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0CisgICAgICogQHNlZSBqYXZheC53cy5ycy5QYXRoCisgICAgICovCisgICAgU3RyaW5nIHZhbHVlKCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9maWx0ZXIvQ3NyZlByb3RlY3Rpb25GaWx0ZXIuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ZpbHRlci9Dc3JmUHJvdGVjdGlvbkZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZmI1YmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9maWx0ZXIvQ3NyZlByb3RlY3Rpb25GaWx0ZXIuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5maWx0ZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuQmFkUmVxdWVzdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcmlvcml0aWVzOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlLlN0YXR1czsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJpb3JpdHk7CisKKy8qKgorICogU2ltcGxlIHNlcnZlci1zaWRlIHJlcXVlc3QgZmlsdGVyIHRoYXQgaW1wbGVtZW50cyBDU1JGIHByb3RlY3Rpb24gYXMgcGVyIHRoZQorICogPGEgaHJlZj0iaHR0cDovL3d3dy5uc2EuZ292L2lhL19maWxlcy9zdXBwb3J0L2d1aWRlbGluZXNfaW1wbGVtZW50YXRpb25fcmVzdC5wZGYiPkd1aWRlbGluZXMgZm9yIEltcGxlbWVudGF0aW9uIG9mIFJFU1Q8L2E+CisgKiBieSBOU0EgKHNlY3Rpb24gSVYuRikgYW5kCisgKiBzZWN0aW9uIDQuMyBvZiA8YSBocmVmPSJodHRwOi8vc2VjbGFiLnN0YW5mb3JkLmVkdS93ZWJzZWMvY3NyZi9jc3JmLnBkZiI+dGhpcyBwYXBlcjwvYT4uCisgKiBJZiB5b3UgYWRkIGl0IHRvIHRoZSByZXF1ZXN0IGZpbHRlcnMgb2YgeW91ciBhcHBsaWNhdGlvbiwgaXQgd2lsbCBjaGVjayBmb3IgWC1SZXF1ZXN0ZWQtQnkgaGVhZGVyIGluIGVhY2gKKyAqIHJlcXVlc3QgZXhjZXB0IGZvciB0aG9zZSB0aGF0IGRvbid0IGNoYW5nZSBzdGF0ZSAoR0VULCBPUFRJT05TLCBIRUFEKS4gSWYgdGhlIGhlYWRlciBpcyBub3QgZm91bmQsCisgKiBpdCByZXR1cm5zIHtAbGluayBTdGF0dXMjQkFEX1JFUVVFU1R9IHJlc3BvbnNlIGJhY2sgdG8gdGhlIGNsaWVudC4KKyAqCisgKiBAc2VlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5maWx0ZXIuQ3NyZlByb3RlY3Rpb25GaWx0ZXIKKyAqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworQFByaW9yaXR5KFByaW9yaXRpZXMuQVVUSEVOVElDQVRJT04pIC8vIHNob3VsZCBiZSBvbmUgb2YgdGhlIGZpcnN0IHBvc3QtbWF0Y2hpbmcgZmlsdGVycyB0byBnZXQgZXhlY3V0ZWQKK3B1YmxpYyBjbGFzcyBDc3JmUHJvdGVjdGlvbkZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIgeworCisgICAgLyoqCisgICAgICogTmFtZSBvZiB0aGUgaGVhZGVyIHRoaXMgZmlsdGVyIHdpbGwgYXR0YWNoIHRvIHRoZSByZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9OQU1FID0gIlgtUmVxdWVzdGVkLUJ5IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IE1FVEhPRFNfVE9fSUdOT1JFOworICAgIHN0YXRpYyB7CisgICAgICAgIEhhc2hTZXQ8U3RyaW5nPiBtdGkgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgIG10aS5hZGQoIkdFVCIpOworICAgICAgICBtdGkuYWRkKCJPUFRJT05TIik7CisgICAgICAgIG10aS5hZGQoIkhFQUQiKTsKKyAgICAgICAgTUVUSE9EU19UT19JR05PUkUgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQobXRpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICghTUVUSE9EU19UT19JR05PUkUuY29udGFpbnMocmMuZ2V0TWV0aG9kKCkpICYmICFyYy5nZXRIZWFkZXJzKCkuY29udGFpbnNLZXkoSEVBREVSX05BTUUpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvZmlsdGVyL0VuY29kaW5nRmlsdGVyLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9maWx0ZXIvRW5jb2RpbmdGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTM5MmRhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvZmlsdGVyL0VuY29kaW5nRmlsdGVyLmphdmEKQEAgLTAsMCArMSwyMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmZpbHRlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7CitpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuTm90QWNjZXB0YWJsZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcmlvcml0aWVzOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qcmlvcml0eTsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5IdHRwSGVhZGVyUmVhZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuQ29udGVudEVuY29kZXI7CisKKy8qKgorICogQ29udGFpbmVyIGZpbHRlciB0aGF0IHN1cHBvcnRzIGVuY29kaW5nLWJhc2VkIGNvbnRlbnQgbmVnb3RpYXRpb24uIFRoZSBmaWx0ZXIgZXhhbWluZXMgd2hhdAorICogY29udGVudCBlbmNvZGluZ3MgYXJlIHN1cHBvcnRlZCBieSB0aGUgY29udGFpbmVyIChieSBsb29raW5nIHVwIGFsbCB0aGUKKyAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuQ29udGVudEVuY29kZXIgZW5jb2RlcnN9KSBhbmQgZGVjaWRlcyB3aGF0IGVuY29kaW5nIHNob3VsZCBiZSBjaG9zZW4KKyAqIGJhc2VkIG9uIHRoZSBlbmNvZGluZ3MgbGlzdGVkIGluIHRoZSBBY2NlcHQtRW5jb2RpbmcgcmVxdWVzdCBoZWFkZXIgYW5kIHRoZWlyIGFzc29jaWF0ZWQgcXVhbGl0eSB2YWx1ZXMuCisgKiBJZiBub25lIG9mIHRoZSBhY2NlcHRhYmxlIGVuY29kaW5ncyBpcyBzdXBwb3J0ZWQgYW5kIGlkZW50aXR5IGVuY29kaW5nIGlzIGV4cGxpY2l0bHkgZm9yYmlkZGVuIGJ5IHRoZSBjbGllbnQsCisgKiB0aGUgZmlsdGVyIGdlbmVyYXRlcyB7QGxpbmsgamF2YXgud3MucnMuY29yZS5SZXNwb25zZS5TdGF0dXMjTk9UX0FDQ0VQVEFCTEV9IHJlc3BvbnNlLgorICogPHA+CisgKiAgICAgVGhlIGZpbHRlciBhbHNvIGVuc3VyZXMgQWNjZXB0LUVuY29kaW5nIGlzIGFkZGVkIHRvIHRoZSBWYXJ5IGhlYWRlciwgZm9yIHByb3BlciBpbnRlcmFjdGlvbiB3aXRoIHdlYiBjYWNoZXMuCisgKiA8L3A+CisgKgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK0BQcmlvcml0eShQcmlvcml0aWVzLkhFQURFUl9ERUNPUkFUT1IpCitwdWJsaWMgZmluYWwgY2xhc3MgRW5jb2RpbmdGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXNwb25zZUZpbHRlciB7CisgICAgLy8gbmFtZSBmb3IgdGhlIGlkZW50aXR5IGVuY29kaW5nCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIElERU5USVRZX0VOQ09ESU5HID0gImlkZW50aXR5IjsKKworICAgIEBJbmplY3QKKyAgICBwcml2YXRlIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlcjsKKyAgICAvLyBzb3J0ZWQgc2V0IHRvIGtlZXAgdGhlIG9yZGVyIHNhbWUgZm9yIGRpZmZlcmVudCBpbnZvY2F0aW9ucyBvZiB0aGUgYXBwCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBTb3J0ZWRTZXQ8U3RyaW5nPiBzdXBwb3J0ZWRFbmNvZGluZ3MgPSBudWxsOworCisgICAgLyoqCisgICAgICogRW5hYmxlcyB0aGlzIGZpbHRlciBhbG9uZyB3aXRoIHRoZSBwcm92aWRlZCB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLkNvbnRlbnRFbmNvZGVyIGVuY29kZXJzfQorICAgICAqIGZvciB0aGUgc3VwcGxpZWQge0BsaW5rIFJlc291cmNlQ29uZmlnfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByYyBSZXNvdXJjZSBjb25maWcgdGhpcyBmaWx0ZXIgc2hvdWxkIGJlIGVuYWJsZWQgZm9yLgorICAgICAqIEBwYXJhbSBlbmNvZGVycyBjb250ZW50IGVuY29kZXJzLgorICAgICAqLworICAgIEBTYWZlVmFyYXJncworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBlbmFibGVGb3IoUmVzb3VyY2VDb25maWcgcmMsIENsYXNzPD8gZXh0ZW5kcyBDb250ZW50RW5jb2Rlcj4uLi4gZW5jb2RlcnMpIHsKKyAgICAgICAgcmMucmVnaXN0ZXJDbGFzc2VzKGVuY29kZXJzKS5yZWdpc3RlckNsYXNzZXMoRW5jb2RpbmdGaWx0ZXIuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0LCBDb250YWluZXJSZXNwb25zZUNvbnRleHQgcmVzcG9uc2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICghcmVzcG9uc2UuaGFzRW50aXR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGFkZCBBY2NlcHQtRW5jb2RpbmcgdG8gVmFyeSBoZWFkZXIKKyAgICAgICAgTGlzdDxTdHJpbmc+IHZhcnlIZWFkZXIgPSByZXNwb25zZS5nZXRTdHJpbmdIZWFkZXJzKCkuZ2V0KEh0dHBIZWFkZXJzLlZBUlkpOworICAgICAgICBpZiAodmFyeUhlYWRlciA9PSBudWxsIHx8ICF2YXJ5SGVhZGVyLmNvbnRhaW5zKEh0dHBIZWFkZXJzLkFDQ0VQVF9FTkNPRElORykpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlLmdldEhlYWRlcnMoKS5hZGQoSHR0cEhlYWRlcnMuVkFSWSwgSHR0cEhlYWRlcnMuQUNDRVBUX0VOQ09ESU5HKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGlmIENvbnRlbnQtRW5jb2RpbmcgaXMgYWxyZWFkeSBzZXQsIGRvbid0IGRvIGFueXRoaW5nCisgICAgICAgIGlmIChyZXNwb25zZS5nZXRIZWFkZXJzKCkuZ2V0Rmlyc3QoSHR0cEhlYWRlcnMuQ09OVEVOVF9FTkNPRElORykgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gcmV0cmlldmUgdGhlIGxpc3Qgb2YgYWNjZXB0ZWQgZW5jb2RpbmdzCisgICAgICAgIExpc3Q8U3RyaW5nPiBhY2NlcHRFbmNvZGluZyA9IHJlcXVlc3QuZ2V0SGVhZGVycygpLmdldChIdHRwSGVhZGVycy5BQ0NFUFRfRU5DT0RJTkcpOworCisgICAgICAgIC8vIGlmIGVtcHR5LCBkb24ndCBkbyBhbnl0aGluZworICAgICAgICBpZiAoYWNjZXB0RW5jb2RpbmcgPT0gbnVsbCB8fCBhY2NlcHRFbmNvZGluZy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNvbnZlcnQgZW5jb2RpbmdzIGZyb20gU3RyaW5nIHRvIEVuY29kaW5nIG9iamVjdHMKKyAgICAgICAgTGlzdDxDb250ZW50RW5jb2Rpbmc+IGVuY29kaW5ncyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb3IgKFN0cmluZyBpbnB1dCA6IGFjY2VwdEVuY29kaW5nKSB7CisgICAgICAgICAgICBTdHJpbmdbXSB0b2tlbnMgPSBpbnB1dC5zcGxpdCgiLCIpOworICAgICAgICAgICAgZm9yIChTdHJpbmcgdG9rZW4gOiB0b2tlbnMpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBDb250ZW50RW5jb2RpbmcgZW5jb2RpbmcgPSBDb250ZW50RW5jb2RpbmcuZnJvbVN0cmluZyh0b2tlbik7CisgICAgICAgICAgICAgICAgICAgIGVuY29kaW5ncy5hZGQoZW5jb2RpbmcpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlIHRoZSBlbmNvZGluZyB0aGF0IGNvdWxkIG5vdCBwYXJzZQorICAgICAgICAgICAgICAgICAgICAvLyBidXQgbG9nIHRoZSBleGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihFbmNvZGluZ0ZpbHRlci5jbGFzcy5nZXROYW1lKCkpLmxvZyhMZXZlbC5XQVJOSU5HLCBlLmdldExvY2FsaXplZE1lc3NhZ2UoKSwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIHNvcnQgYmFzZWQgb24gcXVhbGl0eSBwYXJhbWV0ZXIKKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChlbmNvZGluZ3MpOworICAgICAgICAvLyBtYWtlIHN1cmUgSURFTlRJVFlfRU5DT0RJTkcgaXMgYXQgdGhlIGVuZCAoc2luY2UgaXQgYWNjZXB0ZWQgaWYgbm90IGV4cGxpY2l0bHkgZm9yYmlkZGVuCisgICAgICAgIC8vIGluIHRoZSBBY2NlcHQtQ29udGVudCBoZWFkZXIgYnkgYXNzaWduaW5nIHE9MAorICAgICAgICBlbmNvZGluZ3MuYWRkKG5ldyBDb250ZW50RW5jb2RpbmcoSURFTlRJVFlfRU5DT0RJTkcsIC0xKSk7CisKKyAgICAgICAgLy8gZ2V0IGEgY29weSBvZiBzdXBwb3J0ZWQgZW5jb2RpbmcgKHdlJ2xsIGJlIG1vZGlmeWluZyB0aGlzIHNldCwgaGVuY2UgdGhlIGNvcHkpCisgICAgICAgIFNvcnRlZFNldDxTdHJpbmc+IGFjY2VwdGVkRW5jb2RpbmdzID0gbmV3IFRyZWVTZXQ8PihnZXRTdXBwb3J0ZWRFbmNvZGluZ3MoKSk7CisKKyAgICAgICAgLy8gaW5kaWNhdGVzIHRoYXQgd2UgY2FuIHBpY2sgYW55IG9mIHRoZSBlbmNvZGluZ3MgdGhhdCByZW1haW5lZCBpbiB0aGUgYWNjZXB0ZWRFbmNvZGluZ3Mgc2V0CisgICAgICAgIGJvb2xlYW4gYW55UmVtYWluaW5nID0gZmFsc2U7CisgICAgICAgIC8vIGZpbmFsIHJlc3VsdGluZyB2YWx1ZSBvZiB0aGUgQ29udGVudC1FbmNvZGluZyBoZWFkZXIgdG8gYmUgc2V0CisgICAgICAgIFN0cmluZyBjb250ZW50RW5jb2RpbmcgPSBudWxsOworCisgICAgICAgIC8vIGl0ZXJhdGUgdGhyb3VnaCB0aGUgYWNjZXB0ZWQgZW5jb2RpbmdzLCBzdGFydGluZyB3aXRoIHRoZSBoaWdoZXN0IHF1YWxpdHkgb25lCisgICAgICAgIGZvciAoQ29udGVudEVuY29kaW5nIGVuY29kaW5nIDogZW5jb2RpbmdzKSB7CisgICAgICAgICAgICBpZiAoZW5jb2RpbmcucSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gb2ssIHdlIGFyZSBkb3duIGF0IDAgcXVhbGl0eQorICAgICAgICAgICAgICAgIGlmICgiKiIuZXF1YWxzKGVuY29kaW5nLm5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5vIG90aGVyIGVuY29kaW5nIGlzIGFjY2VwdGFibGUKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGFsbCB0aGUgMCBxdWFsaXR5IGVuY29kaW5ncyBuZWVkIHRvIGJlIHJlbW92ZWQgZnJvbSB0aGUgYWNjZXB0ZWQgb25lcyAodGhlc2UgYXJlIGV4cGxpY2l0bHkKKyAgICAgICAgICAgICAgICAvLyBmb3JiaWRkZW4gYnkgdGhlIGNsaWVudCkKKyAgICAgICAgICAgICAgICBhY2NlcHRlZEVuY29kaW5ncy5yZW1vdmUoZW5jb2RpbmcubmFtZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICgiKiIuZXF1YWxzKGVuY29kaW5nLm5hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGFueSByZW1haW5pbmcgZW5jb2RpbmcgKGFmdGVyIGZpbHRlcmluZyBvdXQgcT0wKSB3aWxsIGJlIGFjY2VwdGFibGUKKyAgICAgICAgICAgICAgICAgICAgYW55UmVtYWluaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoYWNjZXB0ZWRFbmNvZGluZ3MuY29udGFpbnMoZW5jb2RpbmcubmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvdW5kIGFuIGFjY2VwdGFibGUgb25lIC0+IHdlIGFyZSBkb25lCisgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50RW5jb2RpbmcgPSBlbmNvZGluZy5uYW1lOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29udGVudEVuY29kaW5nID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIGhhdmVuJ3QgZm91bmQgYW55IGV4cGxpY2l0IGFjY2VwdGFibGUgZW5jb2RpbmcsIGxldCdzIHNlZSBpZiB3ZSBjYW4ganVzdCBwaWNrIGFueSBvZiB0aGUgcmVtYWluaW5nIG9uZXMKKyAgICAgICAgICAgIC8vIChpZiB0aGVyZSBhcmUgYW55IGxlZnQpCisgICAgICAgICAgICBpZiAoYW55UmVtYWluaW5nICYmICFhY2NlcHRlZEVuY29kaW5ncy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBjb250ZW50RW5jb2RpbmcgPSBhY2NlcHRlZEVuY29kaW5ncy5maXJzdCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBubyBhY2NlcHRhYmxlIGVuY29kaW5nIGNhbiBiZSBzZW50IC0+IHJldHVybiBOT1QgQUNDRVBUQUJMRSBzdGF0dXMgY29kZSBiYWNrIHRvIHRoZSBjbGllbnQKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm90QWNjZXB0YWJsZUV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gZmluYWxseSBzZXQgdGhlIGhlYWRlciAtIGJ1dCBubyBuZWVkIHRvIHNldCBmb3IgaWRlbnRpdHkgZW5jb2RpbmcKKyAgICAgICAgaWYgKCFJREVOVElUWV9FTkNPRElORy5lcXVhbHMoY29udGVudEVuY29kaW5nKSkgeworICAgICAgICAgICAgcmVzcG9uc2UuZ2V0SGVhZGVycygpLnB1dFNpbmdsZShIdHRwSGVhZGVycy5DT05URU5UX0VOQ09ESU5HLCBjb250ZW50RW5jb2RpbmcpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gcmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgQ29udGVudC1FbmNvZGluZyBoZWFkZXIgdmFsdWUKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDb250ZW50RW5jb2RpbmcgaW1wbGVtZW50cyBDb21wYXJhYmxlPENvbnRlbnRFbmNvZGluZz4geworICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIG5hbWU7CisgICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgcTsKKworICAgICAgICBwdWJsaWMgQ29udGVudEVuY29kaW5nKFN0cmluZyBlbmNvZGluZywgaW50IHEpIHsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IGVuY29kaW5nOworICAgICAgICAgICAgdGhpcy5xID0gcTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQ29udGVudEVuY29kaW5nIGZyb21TdHJpbmcoU3RyaW5nIGlucHV0KSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICAgICAgSHR0cEhlYWRlclJlYWRlciByZWFkZXIgPSBIdHRwSGVhZGVyUmVhZGVyLm5ld0luc3RhbmNlKGlucHV0KTsKKworICAgICAgICAgICAgLy8gU2tpcCBhbnkgd2hpdGUgc3BhY2UKKyAgICAgICAgICAgIHJlYWRlci5oYXNOZXh0KCk7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ29udGVudEVuY29kaW5nKHJlYWRlci5uZXh0VG9rZW4oKS50b1N0cmluZygpLCBIdHRwSGVhZGVyUmVhZGVyLnJlYWRRdWFsaXR5RmFjdG9yUGFyYW1ldGVyKHJlYWRlcikpOworCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiA0MSAqIG5hbWUuaGFzaENvZGUoKSArIHE7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgICAgIHJldHVybiBvYmogPT0gdGhpcyB8fCBvYmogIT0gbnVsbCAmJiAob2JqIGluc3RhbmNlb2YgQ29udGVudEVuY29kaW5nKSAmJiBuYW1lLmVxdWFscygoKENvbnRlbnRFbmNvZGluZykgb2JqKS5uYW1lKQorICAgICAgICAgICAgICAgICAgICAmJiBxID09ICgoQ29udGVudEVuY29kaW5nKSBvYmopLnE7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBjb21wYXJlVG8oQ29udGVudEVuY29kaW5nIG8pIHsKKyAgICAgICAgICAgIC8vIGhpZ2hlciBxIGdvZXMgZmlyc3QgKGkuZS4gZGVzY2VuZGluZyBvcmRlcikKKyAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLmNvbXBhcmUoby5xLCBxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSAobGV4aWNhbGx5KSBzb3J0ZWQgc2V0IG9mIHN1cHBvcnRlZCBlbmNvZGluZ3MuCisgICAgICogQHJldHVybiBzb3J0ZWQgc2V0IG9mIHN1cHBvcnRlZCBlbmNvZGluZ3MuCisgICAgICovCisgICAgU29ydGVkU2V0PFN0cmluZz4gZ2V0U3VwcG9ydGVkRW5jb2RpbmdzKCkgeworICAgICAgICAvLyBubyBuZWVkIGZvciBzeW5jaHJvbml6YXRpb24gLSBpbiBjYXNlIG9mIGEgcmFjZSBjb25kaXRpb24sIHRoZSBwcm9wZXJ0eQorICAgICAgICAvLyBtYXkgYmUgc2V0IHR3aWNlLCBidXQgaXQgZG9lcyBub3QgYnJlYWsgYW55dGhpbmcKKyAgICAgICAgaWYgKHN1cHBvcnRlZEVuY29kaW5ncyA9PSBudWxsKSB7CisgICAgICAgICAgICBTb3J0ZWRTZXQ8U3RyaW5nPiBzZSA9IG5ldyBUcmVlU2V0PD4oKTsKKyAgICAgICAgICAgIExpc3Q8Q29udGVudEVuY29kZXI+IGVuY29kZXJzID0gaW5qZWN0aW9uTWFuYWdlci5nZXRBbGxJbnN0YW5jZXMoQ29udGVudEVuY29kZXIuY2xhc3MpOworICAgICAgICAgICAgZm9yIChDb250ZW50RW5jb2RlciBlbmNvZGVyIDogZW5jb2RlcnMpIHsKKyAgICAgICAgICAgICAgICBzZS5hZGRBbGwoZW5jb2Rlci5nZXRTdXBwb3J0ZWRFbmNvZGluZ3MoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZS5hZGQoSURFTlRJVFlfRU5DT0RJTkcpOworICAgICAgICAgICAgc3VwcG9ydGVkRW5jb2RpbmdzID0gc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cHBvcnRlZEVuY29kaW5nczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9maWx0ZXIvSHR0cE1ldGhvZE92ZXJyaWRlRmlsdGVyLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9maWx0ZXIvSHR0cE1ldGhvZE92ZXJyaWRlRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRmYzQ2MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ZpbHRlci9IdHRwTWV0aG9kT3ZlcnJpZGVGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDI2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuZmlsdGVyOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5CYWRSZXF1ZXN0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLlByaW9yaXRpZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5QcmVNYXRjaGluZzsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRm9ybTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJpb3JpdHk7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlRva2VuaXplcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworCitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuVG9rZW5pemVyLkNPTU1PTl9ERUxJTUlURVJTOworCisvKioKKyAqIEEgcHJlLW1hdGNoaW5nIGZpbHRlciB0byBzdXBwb3J0IEhUVFAgbWV0aG9kIHJlcGxhY2luZyBvZiBhIFBPU1QgcmVxdWVzdCB0byBhIHJlcXVlc3QKKyAqIHV0aWxpemluZyBhbm90aGVyIEhUVFAgbWV0aG9kIGZvciB0aGUgY2FzZSB3aGVyZSBwcm94aWVzIG9yIEhUVFAKKyAqIHNlcnZlcnMgd291bGQgb3RoZXJ3aXNlIGJsb2NrIHRoYXQgSFRUUCBtZXRob2QuCisgKiA8cD4KKyAqIFRoaXMgZmlsdGVyIG1heSBiZSB1c2VkIHRvIHJlcGxhY2UgYSBQT1NUIHJlcXVlc3Qgd2l0aCBhIFBVVCwgREVMRVRFIG9yIEdFVAorICogcmVxdWVzdC4KKyAqIDxwPgorICogUmVwbGFjZW1lbnQgd2lsbCBvY2N1ciBpZiB0aGUgcmVxdWVzdCBtZXRob2QgaXMgUE9TVCBhbmQgdGhlcmUgZXhpc3RzIGVpdGhlcgorICogYSByZXF1ZXN0IGhlYWRlciAiWC1IVFRQLU1ldGhvZC1PdmVycmlkZSIsIG9yCisgKiBhIHF1ZXJ5IHBhcmFtZXRlciAiX21ldGhvZCIgd2l0aCBhIG5vbi1lbXB0eSB2YWx1ZS4gVGhhdCB2YWx1ZQorICogd2lsbCBiZSB0aGUgSFRUUCBtZXRob2QgdGhhdCByZXBsYWNlcyB0aGUgUE9TVCBtZXRob2QuIEluIGFkZGl0aW9uIHRvIHRoYXQsCisgKiB3aGVuIHJlcGxhY2luZyB0aGUgUE9TVCBtZXRob2Qgd2l0aCBHRVQsIHRoZSBmaWx0ZXIgd2lsbCBjb252ZXJ0IHRoZSBmb3JtIHBhcmFtZXRlcnMKKyAqIHRvIHF1ZXJ5IHBhcmFtZXRlcnMuIElmIHRoZSBmaWx0ZXIgaXMgY29uZmlndXJlZCB0byBsb29rIGZvciBib3RoIHRoZSBYLUhUVFAtTWV0aG9kLU92ZXJyaWRlCisgKiBoZWFkZXIgYXMgd2VsbCBhcyB0aGUgX21ldGhvZCBxdWVyeSBwYXJhbWV0ZXIgKHRoZSBkZWZhdWx0IHNldHRpbmcpLCBib3RoIGFyZSBwcmVzZW50IGluIHRoZQorICogcmVxdWVzdCBhbmQgdGhleSBkaWZmZXIsIHRoZSBmaWx0ZXIgcmV0dXJucyB7QGxpbmsgamF2YXgud3MucnMuY29yZS5SZXNwb25zZS5TdGF0dXMjQkFEX1JFUVVFU1R9IHJlc3BvbnNlLgorICogPC9wPgorICogPHA+CisgKiBUaGUgZmlsdGVyIGJlaGF2aW9yIGNhbiBiZSBjb25maWd1cmVkIHVzaW5nIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcyNIVFRQX01FVEhPRF9PVkVSUklERX0KKyAqIHByb3BlcnR5LgorICogPC9wPgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICogQGF1dGhvciBGcmVkeSBOYWd5CisgKiBAYXV0aG9yIEZsb3JpYW4gSGFycyAoZmxvcmlhbiBhdCBoYXJzLmRlKQorICovCitAUHJlTWF0Y2hpbmcKK0BQcmlvcml0eShQcmlvcml0aWVzLkhFQURFUl9ERUNPUkFUT1IgKyA1MCkgLy8gbXVzdCBnbyBhZnRlciBVcmlDb25uZWdGaWx0ZXIgKGlmIHByZXNlbnQpCitwdWJsaWMgZmluYWwgY2xhc3MgSHR0cE1ldGhvZE92ZXJyaWRlRmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciB7CisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmF0aW9uIGZsYWdzLgorICAgICAqIDxwLz4KKyAgICAgKiBQYWNrYWdlLXByaXZhdGUgZm9yIHRlc3RpbmcgcHVycG9zZXMuCisgICAgICovCisgICAgZmluYWwgaW50IGNvbmZpZzsKKworICAgIC8qKgorICAgICAqIEVudW1lcmF0aW9uIHJlcHJlc2VudGluZyBwb3NzaWJsZSBzb3VyY2VzIG9mIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtZXRob2Qgb3ZlcnJpZGluZworICAgICAqIHRoZSBmaWx0ZXIgc2hvdWxkIGxvb2sgZm9yLgorICAgICAqLworICAgIHB1YmxpYyBlbnVtIFNvdXJjZSB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIElmIHByZXNlbnQgaW4gdGhlIGZpbHRlciBjb25maWd1cmF0aW9uLAorICAgICAgICAgKiBjYXVzZXMgdGhlIGZpbHRlciB0byBsb29rIGZvciBhIG1ldGhvZCBvdmVycmlkZSBpbiB0aGUgWC1IVFRQLU1ldGhvZC1PdmVycmlkZSBoZWFkZXIuCisgICAgICAgICAqLworICAgICAgICBIRUFERVIoMSksCisgICAgICAgIC8qKgorICAgICAgICAgKiBJZiBwcmVzZW50IGluIHRoZSBmaWx0ZXIgY29uZmlndXJhdGlvbiwKKyAgICAgICAgICogY2F1c2VzIHRoZSBmaWx0ZXIgdG8gbG9vayBmb3IgYSBtZXRob2Qgb3ZlcnJpZGUgaW4gdGhlIF9tZXRob2QgcXVlcnkgcGFyYW1ldGVyLgorICAgICAgICAgKi8KKyAgICAgICAgUVVFUlkoMik7CisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IGZsYWc7CisKKyAgICAgICAgU291cmNlKGZpbmFsIGludCBmbGFnKSB7CisgICAgICAgICAgICB0aGlzLmZsYWcgPSBmbGFnOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIG51bWVyaWMgdmFsdWUgb2YgdGhlIGJpdCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgZmxhZy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBudW1lcmljIHZhbHVlIG9mIHRoaXMgZmxhZy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0RmxhZygpIHsKKyAgICAgICAgICAgIHJldHVybiBmbGFnOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoZSBiaXQgY29ycmVzcG9uZGluZyB0byB0aGlzIGZsYWcgaXMgc2V0IGluIGEgZ2l2ZW4gaW50ZWdlciB2YWx1ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNvbmZpZyBpbnRlZ2VyIHZhbHVlIHRvIGNoZWNrIGZvciB0aGUgYml0IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBmbGFnLgorICAgICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgcGFzc2VkIHZhbHVlIGhhcyB0aGUgYml0IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBmbGFnIHNldC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUHJlc2VudEluKGZpbmFsIGludCBjb25maWcpIHsKKyAgICAgICAgICAgIHJldHVybiAoY29uZmlnICYgZmxhZykgPT0gZmxhZzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVycyB0aGlzIGZpbHRlciBpbnRvIHRoZSBwYXNzZWQge0BsaW5rIFJlc291cmNlQ29uZmlnfSBpbnN0YW5jZSBhbmQKKyAgICAgKiBjb25maWd1cmVzIGl0LgorICAgICAqCisgICAgICogQHBhcmFtIHJjICAgICAgUmVzb3VyY2UgY29uZmlnLgorICAgICAqIEBwYXJhbSBzb3VyY2VzIFNvdXJjZXMgb2YgbWV0aG9kIG92ZXJyaWRlIGluZm9ybWF0aW9uLiBJZiBlbXB0eSwgYm90aAorICAgICAqICAgICAgICAgICAgICAgIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuZmlsdGVyLkh0dHBNZXRob2RPdmVycmlkZUZpbHRlci5Tb3VyY2UjSEVBREVSfSBhbmQKKyAgICAgKiAgICAgICAgICAgICAgICB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmZpbHRlci5IdHRwTWV0aG9kT3ZlcnJpZGVGaWx0ZXIuU291cmNlI1FVRVJZfSB3aWxsCisgICAgICogICAgICAgICAgICAgICAgYmUgYWRkZWQgdG8gdGhlIGNvbmZpZyBieSBkZWZhdWx0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBlbmFibGVGb3IoZmluYWwgUmVzb3VyY2VDb25maWcgcmMsIGZpbmFsIFNvdXJjZS4uLiBzb3VyY2VzKSB7CisgICAgICAgIHJjLnJlZ2lzdGVyQ2xhc3NlcyhIdHRwTWV0aG9kT3ZlcnJpZGVGaWx0ZXIuY2xhc3MpOworICAgICAgICByYy5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLkhUVFBfTUVUSE9EX09WRVJSSURFLCBzb3VyY2VzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBmaWx0ZXIgdGhhdCByZWFkcyB0aGUgY29uZmlndXJhdGlvbiAoe0BsaW5rIFNlcnZlclByb3BlcnRpZXMjSFRUUF9NRVRIT0RfT1ZFUlJJREV9KQorICAgICAqIGZyb20gdGhlIHByb3ZpZGVkIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWd9IGluc3RhbmNlLgorICAgICAqIDxwLz4KKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIHdpbGwgYmUgY2FsbGVkIGJ5IHRoZSBKZXJzZXkgcnVudGltZSB3aGVuIHRoZSBmaWx0ZXIgY2xhc3MgaXMgcmV0dXJuZWQgZnJvbQorICAgICAqIHtAbGluayBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uI2dldENsYXNzZXMoKX0uIFRoZSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnfQorICAgICAqIGluc3RhbmNlIHdpbGwgZ2V0IGF1dG8taW5qZWN0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmMgUmVzb3VyY2VDb25maWcgaW5zdGFuY2UgdGhhdCBob2xkcyB0aGUgY29uZmlndXJhdGlvbiBmb3IgdGhlIGZpbHRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgSHR0cE1ldGhvZE92ZXJyaWRlRmlsdGVyKEBDb250ZXh0IGZpbmFsIENvbmZpZ3VyYXRpb24gcmMpIHsKKyAgICAgICAgdGhpcyhwYXJzZUNvbmZpZyhyYy5nZXRQcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLkhUVFBfTUVUSE9EX09WRVJSSURFKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemVzIHRoaXMgZmlsdGVyIHNldHRpbmcgdGhlIHNvdXJjZXMgb2YgaW5mb3JtYXRpb24gdGhlIGZpbHRlciBzaG91bGQgbG9vayBmb3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc291cmNlcyBTb3VyY2VzIG9mIG1ldGhvZCBvdmVycmlkZSBpbmZvcm1hdGlvbi4gSWYgZW1wdHksIGJvdGgKKyAgICAgKiAgICAgICAgICAgICAgICB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmZpbHRlci5IdHRwTWV0aG9kT3ZlcnJpZGVGaWx0ZXIuU291cmNlI0hFQURFUn0gYW5kCisgICAgICogICAgICAgICAgICAgICAge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5maWx0ZXIuSHR0cE1ldGhvZE92ZXJyaWRlRmlsdGVyLlNvdXJjZSNRVUVSWX0gd2lsbAorICAgICAqICAgICAgICAgICAgICAgIGJlIGFkZGVkIHRvIHRoZSBjb25maWcgYnkgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgSHR0cE1ldGhvZE92ZXJyaWRlRmlsdGVyKGZpbmFsIFNvdXJjZS4uLiBzb3VyY2VzKSB7CisgICAgICAgIGludCBjID0gMDsKKyAgICAgICAgZm9yIChmaW5hbCBTb3VyY2UgY2YgOiBzb3VyY2VzKSB7CisgICAgICAgICAgICBpZiAoY2YgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGMgfD0gY2YuZ2V0RmxhZygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjID09IDApIHsKKyAgICAgICAgICAgIGMgPSAzOworICAgICAgICB9CisgICAgICAgIHRoaXMuY29uZmlnID0gYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0cyBjb25maWd1cmF0aW9uIHByb3BlcnR5IHZhbHVlIHRvIGFuIGFycmF5IG9mIHtAbGluayBTb3VyY2V9IGxpdGVyYWxzLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZyB7QGxpbmsgU2VydmVyUHJvcGVydGllcyNIVFRQX01FVEhPRF9PVkVSUklERSBjb25maWd1cmF0aW9uIHByb3BlcnR5fSB2YWx1ZQorICAgICAqIEByZXR1cm4gYXJyYXkgb2Yge0Bjb2RlIFNvdXJjZX0gb2JqZWN0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTb3VyY2VbXSBwYXJzZUNvbmZpZyhmaW5hbCBPYmplY3QgY29uZmlnKSB7CisgICAgICAgIGlmIChjb25maWcgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTb3VyY2VbMF07CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29uZmlnIGluc3RhbmNlb2YgU291cmNlW10pIHsKKyAgICAgICAgICAgIHJldHVybiAoU291cmNlW10pIGNvbmZpZzsKKyAgICAgICAgfSBlbHNlIGlmIChjb25maWcgaW5zdGFuY2VvZiBTb3VyY2UpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU291cmNlW10geyhTb3VyY2UpIGNvbmZpZ307CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBzdHJpbmdWYWx1ZXM7CisgICAgICAgICAgICBpZiAoY29uZmlnIGluc3RhbmNlb2YgU3RyaW5nKSB7CisgICAgICAgICAgICAgICAgc3RyaW5nVmFsdWVzID0gVG9rZW5pemVyLnRva2VuaXplKChTdHJpbmcpIGNvbmZpZywgQ09NTU9OX0RFTElNSVRFUlMpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjb25maWcgaW5zdGFuY2VvZiBTdHJpbmdbXSkgeworICAgICAgICAgICAgICAgIHN0cmluZ1ZhbHVlcyA9IFRva2VuaXplci50b2tlbml6ZSgoU3RyaW5nW10pIGNvbmZpZywgQ09NTU9OX0RFTElNSVRFUlMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNvdXJjZVswXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgU291cmNlW10gcmVzdWx0ID0gbmV3IFNvdXJjZVtzdHJpbmdWYWx1ZXMubGVuZ3RoXTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyaW5nVmFsdWVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gU291cmNlLnZhbHVlT2Yoc3RyaW5nVmFsdWVzW2ldKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKEh0dHBNZXRob2RPdmVycmlkZUZpbHRlci5jbGFzcy5nZXROYW1lKCkpLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsaXphdGlvbk1lc3NhZ2VzLklOVkFMSURfQ09ORklHX1BST1BFUlRZX1ZBTFVFKFNlcnZlclByb3BlcnRpZXMuSFRUUF9NRVRIT0RfT1ZFUlJJREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdWYWx1ZXNbaV0pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBwYXJhbWV0ZXIgdmFsdWUgaW4gYSBub3JtYWxpemVkIGZvcm0gKHVwcGVyY2FzZSwgdHJpbW1lZCBhbmQge0Bjb2RlIG51bGx9IGlmIGVtcHR5IHN0cmluZykKKyAgICAgKiBjb25zaWRlcmluZyB0aGUgY29uZmlnIGZsYWdzLgorICAgICAqCisgICAgICogQHBhcmFtIHNvdXJjZSAgICBDb25maWcgZmxhZyB0byBsb29rIGZvciAoaWYgc2V0IGluIHRoZSBjb25maWcsIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHBhcmFtIHZhbHVlLAorICAgICAqICAgICAgICAgICAgICAgICAgaWYgbm90IHNldCwgdGhpcyBtZXRob2QgcmV0dXJucyB7QGNvZGUgbnVsbH0pLgorICAgICAqIEBwYXJhbSBwYXJhbXNNYXAgTWFwIHRvIHJldHJpZXZlIHRoZSBwYXJhbWV0ZXIgZnJvbS4KKyAgICAgKiBAcGFyYW0gcGFyYW1OYW1lIE5hbWUgb2YgdGhlIHBhcmFtZXRlciB0byByZXRyaWV2ZS4KKyAgICAgKiBAcmV0dXJuIE5vcm1hbGl6ZWQgcGFyYW1ldGVyIHZhbHVlLiBOZXZlciByZXR1cm5zIGFuIGVtcHR5IHN0cmluZyAtIGNvbnZlcnRzIGl0IHRvIHtAY29kZSBudWxsfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBnZXRQYXJhbVZhbHVlKGZpbmFsIFNvdXJjZSBzb3VyY2UsIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbXNNYXAsIGZpbmFsIFN0cmluZyBwYXJhbU5hbWUpIHsKKyAgICAgICAgU3RyaW5nIHZhbHVlID0gc291cmNlLmlzUHJlc2VudEluKGNvbmZpZykgPyBwYXJhbXNNYXAuZ2V0Rmlyc3QocGFyYW1OYW1lKSA6IG51bGw7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICB2YWx1ZSA9IHZhbHVlLnRyaW0oKTsKKyAgICAgICAgcmV0dXJuIHZhbHVlLmxlbmd0aCgpID09IDAgPyBudWxsIDogdmFsdWUudG9VcHBlckNhc2UoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoZmluYWwgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdCkgeworICAgICAgICBpZiAoIXJlcXVlc3QuZ2V0TWV0aG9kKCkuZXF1YWxzSWdub3JlQ2FzZSgiUE9TVCIpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBTdHJpbmcgaGVhZGVyID0gZ2V0UGFyYW1WYWx1ZShTb3VyY2UuSEVBREVSLCByZXF1ZXN0LmdldEhlYWRlcnMoKSwgIlgtSFRUUC1NZXRob2QtT3ZlcnJpZGUiKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHF1ZXJ5ID0gZ2V0UGFyYW1WYWx1ZShTb3VyY2UuUVVFUlksIHJlcXVlc3QuZ2V0VXJpSW5mbygpLmdldFF1ZXJ5UGFyYW1ldGVycygpLCAiX21ldGhvZCIpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBvdmVycmlkZTsKKyAgICAgICAgaWYgKGhlYWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICBvdmVycmlkZSA9IHF1ZXJ5OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgb3ZlcnJpZGUgPSBoZWFkZXI7CisgICAgICAgICAgICBpZiAocXVlcnkgIT0gbnVsbCAmJiAhcXVlcnkuZXF1YWxzKGhlYWRlcikpIHsKKyAgICAgICAgICAgICAgICAvLyBpbmNvbnNpc3RlbnQgcXVlcnkgYW5kIGhlYWRlciBwYXJhbSB2YWx1ZXMKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG92ZXJyaWRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlcXVlc3Quc2V0TWV0aG9kKG92ZXJyaWRlKTsKKyAgICAgICAgICAgIGlmIChvdmVycmlkZS5lcXVhbHMoIkdFVCIpKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3QuZ2V0TWVkaWFUeXBlKCkgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0ZPUk1fVVJMRU5DT0RFRF9UWVBFLmdldFR5cGUoKS5lcXVhbHMocmVxdWVzdC5nZXRNZWRpYVR5cGUoKS5nZXRUeXBlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFVyaUJ1aWxkZXIgdWIgPSByZXF1ZXN0LmdldFVyaUluZm8oKS5nZXRSZXF1ZXN0VXJpQnVpbGRlcigpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBGb3JtIGYgPSAoKENvbnRhaW5lclJlcXVlc3QpIHJlcXVlc3QpLnJlYWRFbnRpdHkoRm9ybS5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoZmluYWwgTWFwLkVudHJ5PFN0cmluZywgTGlzdDxTdHJpbmc+PiBwYXJhbSA6IGYuYXNNYXAoKS5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1Yi5xdWVyeVBhcmFtKHBhcmFtLmdldEtleSgpLCBwYXJhbS5nZXRWYWx1ZSgpLnRvQXJyYXkoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5zZXRSZXF1ZXN0VXJpKHJlcXVlc3QuZ2V0VXJpSW5mbygpLmdldEJhc2VVcmkoKSwgdWIuYnVpbGQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvZmlsdGVyL1JvbGVzQWxsb3dlZER5bmFtaWNGZWF0dXJlLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9maWx0ZXIvUm9sZXNBbGxvd2VkRHluYW1pY0ZlYXR1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjFhOGJmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvZmlsdGVyL1JvbGVzQWxsb3dlZER5bmFtaWNGZWF0dXJlLmphdmEKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmZpbHRlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5Gb3JiaWRkZW5FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuTm90QXV0aG9yaXplZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcmlvcml0aWVzOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuRHluYW1pY0ZlYXR1cmU7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlJlc291cmNlSW5mbzsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmVDb250ZXh0OworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qcmlvcml0eTsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLnNlY3VyaXR5LkRlbnlBbGw7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5zZWN1cml0eS5QZXJtaXRBbGw7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5zZWN1cml0eS5Sb2xlc0FsbG93ZWQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLkFubm90YXRlZE1ldGhvZDsKKworLyoqCisgKiBBIHtAbGluayBEeW5hbWljRmVhdHVyZX0gc3VwcG9ydGluZyB0aGUge0Bjb2RlIGphdmF4LmFubm90YXRpb24uc2VjdXJpdHkuUm9sZXNBbGxvd2VkfSwKKyAqIHtAY29kZSBqYXZheC5hbm5vdGF0aW9uLnNlY3VyaXR5LlBlcm1pdEFsbH0gYW5kIHtAY29kZSBqYXZheC5hbm5vdGF0aW9uLnNlY3VyaXR5LkRlbnlBbGx9CisgKiBvbiByZXNvdXJjZSBtZXRob2RzIGFuZCBzdWItcmVzb3VyY2UgbWV0aG9kcy4KKyAqIDxwLz4KKyAqIFRoZSB7QGxpbmsgamF2YXgud3MucnMuY29yZS5TZWN1cml0eUNvbnRleHR9IGlzIHV0aWxpemVkLCB1c2luZyB0aGUKKyAqIHtAbGluayBqYXZheC53cy5ycy5jb3JlLlNlY3VyaXR5Q29udGV4dCNpc1VzZXJJblJvbGUoU3RyaW5nKSB9IG1ldGhvZCwKKyAqIHRvIGFzY2VydGFpbiBpZiB0aGUgdXNlciBpcyBpbiBvbmUKKyAqIG9mIHRoZSByb2xlcyBkZWNsYXJlZCBpbiBieSBhIHtAY29kZSAmIzY0O1JvbGVzQWxsb3dlZH0uIElmIGEgdXNlciBpcyBpbiBub25lIG9mCisgKiB0aGUgZGVjbGFyZWQgcm9sZXMgdGhlbiBhIDQwMyAoRm9yYmlkZGVuKSByZXNwb25zZSBpcyByZXR1cm5lZC4KKyAqIDxwLz4KKyAqIElmIHRoZSB7QGNvZGUgJiM2NDtEZW55QWxsfSBhbm5vdGF0aW9uIGlzIGRlY2xhcmVkIHRoZW4gYSA0MDMgKEZvcmJpZGRlbikgcmVzcG9uc2UKKyAqIGlzIHJldHVybmVkLgorICogPHAvPgorICogSWYgdGhlIHtAY29kZSAmIzY0O1Blcm1pdEFsbH0gYW5ub3RhdGlvbiBpcyBkZWNsYXJlZCBhbmQgaXMgbm90IG92ZXJyaWRkZW4gdGhlbgorICogdGhpcyBmaWx0ZXIgd2lsbCBub3QgYmUgYXBwbGllZC4KKyAqIDxwLz4KKyAqIElmIGEgdXNlciBpcyBub3QgYXV0aGVudGljYXRlZCBhbmQgYW5ub3RhdGVkIG1ldGhvZCBpcyByZXN0cmljdGVkIGZvciBjZXJ0YWluIHJvbGVzIHRoZW4gYSA0MDMKKyAqIChOb3QgQXV0aGVudGljYXRlZCkgcmVzcG9uc2UgaXMgcmV0dXJuZWQuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK3B1YmxpYyBjbGFzcyBSb2xlc0FsbG93ZWREeW5hbWljRmVhdHVyZSBpbXBsZW1lbnRzIER5bmFtaWNGZWF0dXJlIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShmaW5hbCBSZXNvdXJjZUluZm8gcmVzb3VyY2VJbmZvLCBmaW5hbCBGZWF0dXJlQ29udGV4dCBjb25maWd1cmF0aW9uKSB7CisgICAgICAgIGZpbmFsIEFubm90YXRlZE1ldGhvZCBhbSA9IG5ldyBBbm5vdGF0ZWRNZXRob2QocmVzb3VyY2VJbmZvLmdldFJlc291cmNlTWV0aG9kKCkpOworCisgICAgICAgIC8vIERlbnlBbGwgb24gdGhlIG1ldGhvZCB0YWtlIHByZWNlZGVuY2Ugb3ZlciBSb2xlc0FsbG93ZWQgYW5kIFBlcm1pdEFsbAorICAgICAgICBpZiAoYW0uaXNBbm5vdGF0aW9uUHJlc2VudChEZW55QWxsLmNsYXNzKSkgeworICAgICAgICAgICAgY29uZmlndXJhdGlvbi5yZWdpc3RlcihuZXcgUm9sZXNBbGxvd2VkUmVxdWVzdEZpbHRlcigpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJvbGVzQWxsb3dlZCBvbiB0aGUgbWV0aG9kIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBQZXJtaXRBbGwKKyAgICAgICAgUm9sZXNBbGxvd2VkIHJhID0gYW0uZ2V0QW5ub3RhdGlvbihSb2xlc0FsbG93ZWQuY2xhc3MpOworICAgICAgICBpZiAocmEgIT0gbnVsbCkgeworICAgICAgICAgICAgY29uZmlndXJhdGlvbi5yZWdpc3RlcihuZXcgUm9sZXNBbGxvd2VkUmVxdWVzdEZpbHRlcihyYS52YWx1ZSgpKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBQZXJtaXRBbGwgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIFJvbGVzQWxsb3dlZCBvbiB0aGUgY2xhc3MKKyAgICAgICAgaWYgKGFtLmlzQW5ub3RhdGlvblByZXNlbnQoUGVybWl0QWxsLmNsYXNzKSkgeworICAgICAgICAgICAgLy8gRG8gbm90aGluZy4KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIERlbnlBbGwgY2FuJ3QgYmUgYXR0YWNoZWQgdG8gY2xhc3NlcworCisgICAgICAgIC8vIFJvbGVzQWxsb3dlZCBvbiB0aGUgY2xhc3MgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIFBlcm1pdEFsbAorICAgICAgICByYSA9IHJlc291cmNlSW5mby5nZXRSZXNvdXJjZUNsYXNzKCkuZ2V0QW5ub3RhdGlvbihSb2xlc0FsbG93ZWQuY2xhc3MpOworICAgICAgICBpZiAocmEgIT0gbnVsbCkgeworICAgICAgICAgICAgY29uZmlndXJhdGlvbi5yZWdpc3RlcihuZXcgUm9sZXNBbGxvd2VkUmVxdWVzdEZpbHRlcihyYS52YWx1ZSgpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJpb3JpdHkoUHJpb3JpdGllcy5BVVRIT1JJWkFUSU9OKSAvLyBhdXRob3JpemF0aW9uIGZpbHRlciAtIHNob3VsZCBnbyBhZnRlciBhbnkgYXV0aGVudGljYXRpb24gZmlsdGVycworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJvbGVzQWxsb3dlZFJlcXVlc3RGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gZGVueUFsbDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSByb2xlc0FsbG93ZWQ7CisKKyAgICAgICAgUm9sZXNBbGxvd2VkUmVxdWVzdEZpbHRlcigpIHsKKyAgICAgICAgICAgIHRoaXMuZGVueUFsbCA9IHRydWU7CisgICAgICAgICAgICB0aGlzLnJvbGVzQWxsb3dlZCA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICBSb2xlc0FsbG93ZWRSZXF1ZXN0RmlsdGVyKGZpbmFsIFN0cmluZ1tdIHJvbGVzQWxsb3dlZCkgeworICAgICAgICAgICAgdGhpcy5kZW55QWxsID0gZmFsc2U7CisgICAgICAgICAgICB0aGlzLnJvbGVzQWxsb3dlZCA9IChyb2xlc0FsbG93ZWQgIT0gbnVsbCkgPyByb2xlc0FsbG93ZWQgOiBuZXcgU3RyaW5nW10ge307CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKGZpbmFsIENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKCFkZW55QWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKHJvbGVzQWxsb3dlZC5sZW5ndGggPiAwICYmICFpc0F1dGhlbnRpY2F0ZWQocmVxdWVzdENvbnRleHQpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JiaWRkZW5FeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuVVNFUl9OT1RfQVVUSE9SSVpFRCgpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyByb2xlIDogcm9sZXNBbGxvd2VkKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0Q29udGV4dC5nZXRTZWN1cml0eUNvbnRleHQoKS5pc1VzZXJJblJvbGUocm9sZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhyb3cgbmV3IEZvcmJpZGRlbkV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5VU0VSX05PVF9BVVRIT1JJWkVEKCkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0F1dGhlbnRpY2F0ZWQoZmluYWwgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHsKKyAgICAgICAgICAgIHJldHVybiByZXF1ZXN0Q29udGV4dC5nZXRTZWN1cml0eUNvbnRleHQoKS5nZXRVc2VyUHJpbmNpcGFsKCkgIT0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ZpbHRlci9VcmlDb25uZWdGaWx0ZXIuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ZpbHRlci9VcmlDb25uZWdGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODg2NDdmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvZmlsdGVyL1VyaUNvbm5lZ0ZpbHRlci5qYXZhCkBAIC0wLDAgKzEsMjc4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5maWx0ZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXgud3MucnMuUHJpb3JpdGllczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlByZU1hdGNoaW5nOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlBhdGhTZWdtZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJpb3JpdHk7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkxhbmd1YWdlVGFnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudXJpLlVyaUNvbXBvbmVudDsKKworLyoqCisgKiBBIFVSSS1iYXNlZCBjb250ZW50IG5lZ290aWF0aW9uIGZpbHRlciBtYXBwaW5nIGEgZG90LWRlY2xhcmVkIHN1ZmZpeCBpbgorICogVVJJIHRvIG1lZGlhIHR5cGUgdGhhdCBpcyB0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPkFjY2VwdDwvY29kZT4gaGVhZGVyCisgKiBvciBhIGxhbmd1YWdlIHRoYXQgaXMgdGhlIHZhbHVlIG9mIHRoZSA8Y29kZT5BY2NlcHQtTGFuZ3VhZ2U8L2NvZGU+IGhlYWRlci4KKyAqIDxwPgorICogVGhpcyBmaWx0ZXIgbWF5IGJlIHVzZWQgd2hlbiB0aGUgYWNjZXB0YWJsZSBtZWRpYSB0eXBlIGFuZCBhY2NlcHRhYmxlCisgKiBsYW5ndWFnZSBuZWVkIHRvIGJlIGRlY2xhcmVkIGluIHRoZSBVUkkuCisgKiA8cD4KKyAqIFRoaXMgY2xhc3MgbWF5IGJlIGV4dGVuZGVkIHRvIGRlY2xhcmUgdGhlIG1hcHBpbmdzIGFuZCB0aGUgZXh0ZW5kaW5nIGNsYXNzLAorICogPGNvZGU+Zm9vLk15VXJpQ29ubmVnRmlsdGVyPC9jb2RlPiBzYXksIGNhbiBiZSByZWdpc3RlcmVkIGFzIGEgY29udGFpbmVyIHJlcXVlc3QKKyAqIGZpbHRlci4KKyAqIDxwPgorICogSWYgYSBzdWZmaXggb2YgImF0b20iIGlzIHJlZ2lzdGVyZWQgd2l0aCBhIG1lZGlhIHR5cGUgb2YKKyAqICJhcHBsaWNhdGlvbi9hdG9tK3htbCIgdGhlbiBhIEdFVCByZXF1ZXN0IG9mOgorICogPHByZT5HRVQgL3Jlc291cmNlLmF0b208L3ByZT4KKyAqIDxwPmlzIHRyYW5zZm9ybWVkIHRvOjwvcD4KKyAqIDxwcmU+R0VUIC9yZXNvdXJjZQorICogQWNjZXB0OiBhcHBsaWNhdGlvbi9hdG9tK3htbDwvcHJlPgorICogQW55IGV4aXN0aW5nICJBY2NlcHQiIGhlYWRlciB2YWx1ZSB3aWxsIGJlIHJlcGxhY2VkLgorICogPHA+CisgKiBJZiBhIHN1ZmZpeCBvZiAiZW5nbGlzaCIgaXMgcmVnaXN0ZXJlZCB3aXRoIGEgbGFuZ3VhZ2Ugb2YKKyAqICJlbiIgdGhlbiBhIEdFVCByZXF1ZXN0IG9mOgorICogPHByZT5HRVQgL3Jlc291cmNlLmVuZ2xpc2g8L3ByZT4KKyAqIDxwPmlzIHRyYW5zZm9ybWVkIHRvOjwvcD4KKyAqIDxwcmU+R0VUIC9yZXNvdXJjZQorICogQWNjZXB0LUxhbmd1YWdlOiBlbjwvcHJlPgorICogQW55IGV4aXN0aW5nICJBY2NlcHQtTGFuZ3VhZ2UiaGVhZGVyICB2YWx1ZSB3aWxsIGJlIHJlcGxhY2VkLgorICogPHAvPgorICogVGhlIG1lZGlhIHR5cGUgbWFwcGluZ3MgYXJlIHByb2Nlc3NlZCBiZWZvcmUgdGhlIGxhbmd1YWdlIHR5cGUgbWFwcGluZ3MuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK0BQcmVNYXRjaGluZworQFByaW9yaXR5KFByaW9yaXRpZXMuSEVBREVSX0RFQ09SQVRPUikKK3B1YmxpYyBmaW5hbCBjbGFzcyBVcmlDb25uZWdGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHsKKworICAgIHByb3RlY3RlZCBmaW5hbCBNYXA8U3RyaW5nLCBNZWRpYVR5cGU+IG1lZGlhVHlwZU1hcHBpbmdzOworICAgIHByb3RlY3RlZCBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IGxhbmd1YWdlTWFwcGluZ3M7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBmaWx0ZXIgdGhhdCByZWFkcyB0aGUgY29uZmlndXJhdGlvbiAobWVkaWEgdHlwZSBhbmQgbGFuZ3VhZ2UgbWFwcGluZ3MpCisgICAgICogZnJvbSB0aGUgcHJvdmlkZWQge0BsaW5rIFJlc291cmNlQ29uZmlnfSBpbnN0YW5jZS4KKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIHdpbGwgYmUgY2FsbGVkIGJ5IHRoZSBKZXJzZXkgcnVudGltZSB3aGVuIHRoZSBmaWx0ZXIKKyAgICAgKiBjbGFzcyBpcyByZXR1cm5lZCBmcm9tIHtAbGluayBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uI2dldENsYXNzZXMoKX0uCisgICAgICogVGhlIHtAbGluayBSZXNvdXJjZUNvbmZpZ30gaW5zdGFuY2Ugd2lsbCBnZXQgYXV0by1pbmplY3RlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByYyBSZXNvdXJjZUNvbmZpZyBpbnN0YW5jZSB0aGF0IGhvbGRzIHRoZSBjb25maWd1cmF0aW9uIGZvciB0aGUgZmlsdGVyLgorICAgICAqLworICAgIHB1YmxpYyBVcmlDb25uZWdGaWx0ZXIoQENvbnRleHQgZmluYWwgQ29uZmlndXJhdGlvbiByYykgeworICAgICAgICB0aGlzKGV4dHJhY3RNZWRpYVR5cGVNYXBwaW5ncyhyYy5nZXRQcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLk1FRElBX1RZUEVfTUFQUElOR1MpKSwKKyAgICAgICAgICAgICAgICBleHRyYWN0TGFuZ3VhZ2VNYXBwaW5ncyhyYy5nZXRQcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLkxBTkdVQUdFX01BUFBJTkdTKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGZpbHRlciB3aXRoIHN1ZmZpeCB0byBtZWRpYSB0eXBlIG1hcHBpbmdzIGFuZCBzdWZmaXggdG8KKyAgICAgKiBsYW5ndWFnZSBtYXBwaW5ncy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZWRpYVR5cGVNYXBwaW5ncyB0aGUgc3VmZml4IHRvIG1lZGlhIHR5cGUgbWFwcGluZ3MuCisgICAgICogQHBhcmFtIGxhbmd1YWdlTWFwcGluZ3MgIHRoZSBzdWZmaXggdG8gbGFuZ3VhZ2UgbWFwcGluZ3MuCisgICAgICovCisgICAgcHVibGljIFVyaUNvbm5lZ0ZpbHRlcihNYXA8U3RyaW5nLCBNZWRpYVR5cGU+IG1lZGlhVHlwZU1hcHBpbmdzLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGxhbmd1YWdlTWFwcGluZ3MpIHsKKyAgICAgICAgaWYgKG1lZGlhVHlwZU1hcHBpbmdzID09IG51bGwpIHsKKyAgICAgICAgICAgIG1lZGlhVHlwZU1hcHBpbmdzID0gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsYW5ndWFnZU1hcHBpbmdzID09IG51bGwpIHsKKyAgICAgICAgICAgIGxhbmd1YWdlTWFwcGluZ3MgPSBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5tZWRpYVR5cGVNYXBwaW5ncyA9IG1lZGlhVHlwZU1hcHBpbmdzOworICAgICAgICB0aGlzLmxhbmd1YWdlTWFwcGluZ3MgPSBsYW5ndWFnZU1hcHBpbmdzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZpbHRlcihmaW5hbCBDb250YWluZXJSZXF1ZXN0Q29udGV4dCByYykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgVXJpSW5mbyB1cmlJbmZvID0gcmMuZ2V0VXJpSW5mbygpOworCisgICAgICAgIC8vIFF1aWNrIGNoZWNrIGZvciBhICcuJyBjaGFyYWN0ZXIKKyAgICAgICAgU3RyaW5nIHBhdGggPSB1cmlJbmZvLmdldFJlcXVlc3RVcmkoKS5nZXRSYXdQYXRoKCk7CisgICAgICAgIGlmIChwYXRoLmluZGV4T2YoJy4nKSA9PSAtMSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgTGlzdDxQYXRoU2VnbWVudD4gbCA9IHVyaUluZm8uZ2V0UGF0aFNlZ21lbnRzKGZhbHNlKTsKKyAgICAgICAgaWYgKGwuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBHZXQgdGhlIGxhc3Qgbm9uLWVtcHR5IHBhdGggc2VnbWVudAorICAgICAgICBQYXRoU2VnbWVudCBzZWdtZW50ID0gbnVsbDsKKyAgICAgICAgZm9yIChpbnQgaSA9IGwuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgICAgIHNlZ21lbnQgPSBsLmdldChpKTsKKyAgICAgICAgICAgIGlmIChzZWdtZW50LmdldFBhdGgoKS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc2VnbWVudCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gcGF0aC5sZW5ndGgoKTsKKworICAgICAgICAvLyBHZXQgdGhlIHN1ZmZpeGVzCisgICAgICAgIGZpbmFsIFN0cmluZ1tdIHN1ZmZpeGVzID0gc2VnbWVudC5nZXRQYXRoKCkuc3BsaXQoIlxcLiIpOworCisgICAgICAgIGZvciAoaW50IGkgPSBzdWZmaXhlcy5sZW5ndGggLSAxOyBpID49IDE7IGktLSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHN1ZmZpeCA9IHN1ZmZpeGVzW2ldOworICAgICAgICAgICAgaWYgKHN1ZmZpeC5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBhY2NlcHQgPSBtZWRpYVR5cGVNYXBwaW5ncy5nZXQoc3VmZml4KTsKKworICAgICAgICAgICAgaWYgKGFjY2VwdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmMuZ2V0SGVhZGVycygpLnB1dFNpbmdsZShIdHRwSGVhZGVycy5BQ0NFUFQsIGFjY2VwdC50b1N0cmluZygpKTsKKworICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCA9IHBhdGgubGFzdEluZGV4T2YoJy4nICsgc3VmZml4KTsKKyAgICAgICAgICAgICAgICBwYXRoID0gbmV3IFN0cmluZ0J1aWxkZXIocGF0aCkuZGVsZXRlKGluZGV4LCBpbmRleCArIHN1ZmZpeC5sZW5ndGgoKSArIDEpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgc3VmZml4ZXNbaV0gPSAiIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGkgPSBzdWZmaXhlcy5sZW5ndGggLSAxOyBpID49IDE7IGktLSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHN1ZmZpeCA9IHN1ZmZpeGVzW2ldOworICAgICAgICAgICAgaWYgKHN1ZmZpeC5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhY2NlcHRMYW5ndWFnZSA9IGxhbmd1YWdlTWFwcGluZ3MuZ2V0KHN1ZmZpeCk7CisgICAgICAgICAgICBpZiAoYWNjZXB0TGFuZ3VhZ2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJjLmdldEhlYWRlcnMoKS5wdXRTaW5nbGUoSHR0cEhlYWRlcnMuQUNDRVBUX0xBTkdVQUdFLCBhY2NlcHRMYW5ndWFnZSk7CisKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXggPSBwYXRoLmxhc3RJbmRleE9mKCcuJyArIHN1ZmZpeCk7CisgICAgICAgICAgICAgICAgcGF0aCA9IG5ldyBTdHJpbmdCdWlsZGVyKHBhdGgpLmRlbGV0ZShpbmRleCwgaW5kZXggKyBzdWZmaXgubGVuZ3RoKCkgKyAxKS50b1N0cmluZygpOworICAgICAgICAgICAgICAgIHN1ZmZpeGVzW2ldID0gIiI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobGVuZ3RoICE9IHBhdGgubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgIHJjLnNldFJlcXVlc3RVcmkodXJpSW5mby5nZXRSZXF1ZXN0VXJpQnVpbGRlcigpLnJlcGxhY2VQYXRoKHBhdGgpLmJ1aWxkKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50ZXJmYWNlIFR5cGVQYXJzZXI8VD4geworCisgICAgICAgIHB1YmxpYyBUIHZhbHVlT2YoU3RyaW5nIHMpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIE1lZGlhVHlwZT4gZXh0cmFjdE1lZGlhVHlwZU1hcHBpbmdzKGZpbmFsIE9iamVjdCBtYXBwaW5ncykgeworICAgICAgICAvLyBwYXJzZSBhbmQgdmFsaWRhdGUgbWVkaWFUeXBlTWFwcGluZ3Mgc2V0IHRocm91Z2ggTUVESUFfVFlQRV9NQVBQSU5HUyBwcm9wZXJ0eQorICAgICAgICByZXR1cm4gcGFyc2VBbmRWYWxpZGF0ZU1hcHBpbmdzKFNlcnZlclByb3BlcnRpZXMuTUVESUFfVFlQRV9NQVBQSU5HUywgbWFwcGluZ3MsIG5ldyBUeXBlUGFyc2VyPE1lZGlhVHlwZT4oKSB7CisgICAgICAgICAgICBwdWJsaWMgTWVkaWFUeXBlIHZhbHVlT2YoZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE1lZGlhVHlwZS52YWx1ZU9mKHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgU3RyaW5nPiBleHRyYWN0TGFuZ3VhZ2VNYXBwaW5ncyhmaW5hbCBPYmplY3QgbWFwcGluZ3MpIHsKKyAgICAgICAgLy8gcGFyc2UgYW5kIHZhbGlkYXRlIGxhbmd1YWdlTWFwcGluZ3Mgc2V0IHRocm91Z2ggTEFOR1VBR0VfTUFQUElOR1MgcHJvcGVydHkKKyAgICAgICAgcmV0dXJuIHBhcnNlQW5kVmFsaWRhdGVNYXBwaW5ncyhTZXJ2ZXJQcm9wZXJ0aWVzLkxBTkdVQUdFX01BUFBJTkdTLCBtYXBwaW5ncywgbmV3IFR5cGVQYXJzZXI8U3RyaW5nPigpIHsKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgdmFsdWVPZihmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTGFuZ3VhZ2VUYWcudmFsdWVPZih2YWx1ZSkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgPFQ+IE1hcDxTdHJpbmcsIFQ+IHBhcnNlQW5kVmFsaWRhdGVNYXBwaW5ncyhmaW5hbCBTdHJpbmcgcHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgbWFwcGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlUGFyc2VyPFQ+IHBhcnNlcikgeworICAgICAgICBpZiAobWFwcGluZ3MgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWFwcGluZ3MgaW5zdGFuY2VvZiBNYXApIHsKKyAgICAgICAgICAgIHJldHVybiAoTWFwPFN0cmluZywgVD4pIG1hcHBpbmdzOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgSGFzaE1hcDxTdHJpbmcsIFQ+IG1hcHBpbmdzTWFwID0gbmV3IEhhc2hNYXA8PigpOworCisgICAgICAgIGlmIChtYXBwaW5ncyBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgcGFyc2VNYXBwaW5ncyhwcm9wZXJ0eSwgKFN0cmluZykgbWFwcGluZ3MsIG1hcHBpbmdzTWFwLCBwYXJzZXIpOworICAgICAgICB9IGVsc2UgaWYgKG1hcHBpbmdzIGluc3RhbmNlb2YgU3RyaW5nW10pIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIG1hcHBpbmdzQXJyYXkgPSAoU3RyaW5nW10pIG1hcHBpbmdzOworICAgICAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgYU1hcHBpbmdzQXJyYXkgOiBtYXBwaW5nc0FycmF5KSB7CisgICAgICAgICAgICAgICAgcGFyc2VNYXBwaW5ncyhwcm9wZXJ0eSwgYU1hcHBpbmdzQXJyYXksIG1hcHBpbmdzTWFwLCBwYXJzZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5JTlZBTElEX01BUFBJTkdfVFlQRShwcm9wZXJ0eSkpOworICAgICAgICB9CisKKyAgICAgICAgZW5jb2RlS2V5cyhtYXBwaW5nc01hcCk7CisKKyAgICAgICAgcmV0dXJuIG1hcHBpbmdzTWFwOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIDxUPiB2b2lkIHBhcnNlTWFwcGluZ3MoZmluYWwgU3RyaW5nIHByb3BlcnR5LCBmaW5hbCBTdHJpbmcgbWFwcGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBUPiBtYXBwaW5nc01hcCwgZmluYWwgVHlwZVBhcnNlcjxUPiBwYXJzZXIpIHsKKyAgICAgICAgaWYgKG1hcHBpbmdzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFN0cmluZ1tdIHJlY29yZHMgPSBtYXBwaW5ncy5zcGxpdCgiLCIpOworCisgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIHJlY29yZCA6IHJlY29yZHMpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIG1hcHBpbmcgPSByZWNvcmQuc3BsaXQoIjoiKTsKKyAgICAgICAgICAgIGlmIChtYXBwaW5nLmxlbmd0aCAhPSAyKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5JTlZBTElEX01BUFBJTkdfRk9STUFUKHByb3BlcnR5LCBtYXBwaW5ncykpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdHJpbW1lZFNlZ21lbnQgPSBtYXBwaW5nWzBdLnRyaW0oKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0cmltbWVkVmFsdWUgPSBtYXBwaW5nWzFdLnRyaW0oKTsKKworICAgICAgICAgICAgaWYgKHRyaW1tZWRTZWdtZW50Lmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLklOVkFMSURfTUFQUElOR19LRVlfRU1QVFkocHJvcGVydHksIHJlY29yZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRyaW1tZWRWYWx1ZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5JTlZBTElEX01BUFBJTkdfVkFMVUVfRU1QVFkocHJvcGVydHksIHJlY29yZCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtYXBwaW5nc01hcC5wdXQodHJpbW1lZFNlZ21lbnQsIHBhcnNlci52YWx1ZU9mKHRyaW1tZWRWYWx1ZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgPFQ+IHZvaWQgZW5jb2RlS2V5cyhmaW5hbCBNYXA8U3RyaW5nLCBUPiBtYXApIHsKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgVD4gdGVtcE1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8U3RyaW5nLCBUPiBlbnRyeSA6IG1hcC5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICB0ZW1wTWFwLnB1dChVcmlDb21wb25lbnQuY29udGV4dHVhbEVuY29kZShlbnRyeS5nZXRLZXkoKSwgVXJpQ29tcG9uZW50LlR5cGUuUEFUSF9TRUdNRU5UKSwgZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgbWFwLmNsZWFyKCk7CisgICAgICAgIG1hcC5wdXRBbGwodGVtcE1hcCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvZmlsdGVyL2ludGVybmFsL1NlcnZlckZpbHRlcnNBdXRvRGlzY292ZXJhYmxlLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9maWx0ZXIvaW50ZXJuYWwvU2VydmVyRmlsdGVyc0F1dG9EaXNjb3ZlcmFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODM3OWFkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvZmlsdGVyL2ludGVybmFsL1NlcnZlckZpbHRlcnNBdXRvRGlzY292ZXJhYmxlLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuZmlsdGVyLmludGVybmFsOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qcmlvcml0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdHJhaW5lZFRvOworaW1wb3J0IGphdmF4LndzLnJzLlJ1bnRpbWVUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmVDb250ZXh0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuc3BpLkF1dG9EaXNjb3ZlcmFibGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmZpbHRlci5VcmlDb25uZWdGaWx0ZXI7CisKKy8qKgorICogRW5hYmxlIGF1dG8tZGlzY292ZXJhYmxlIG9mIGNlcnRhaW4gc2VydmVyIGZpbHRlcnMuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BDb25zdHJhaW5lZFRvKFJ1bnRpbWVUeXBlLlNFUlZFUikKK0BQcmlvcml0eShBdXRvRGlzY292ZXJhYmxlLkRFRkFVTFRfUFJJT1JJVFkpCitwdWJsaWMgZmluYWwgY2xhc3MgU2VydmVyRmlsdGVyc0F1dG9EaXNjb3ZlcmFibGUgaW1wbGVtZW50cyBBdXRvRGlzY292ZXJhYmxlIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShmaW5hbCBGZWF0dXJlQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlnID0gY29udGV4dC5nZXRDb25maWd1cmF0aW9uKCk7CisKKyAgICAgICAgLy8gVXJpQ29ubmVnRmlsdGVyLgorICAgICAgICBmaW5hbCBPYmplY3QgbGFuZ3VhZ2VNYXBwaW5ncyA9IGNvbmZpZy5nZXRQcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLkxBTkdVQUdFX01BUFBJTkdTKTsKKyAgICAgICAgZmluYWwgT2JqZWN0IG1lZGlhVHlwZXNNYXBwaW5ncyA9IGNvbmZpZy5nZXRQcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLk1FRElBX1RZUEVfTUFQUElOR1MpOworCisgICAgICAgIGlmICghY29uZmlnLmlzUmVnaXN0ZXJlZChVcmlDb25uZWdGaWx0ZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgJiYgKGxhbmd1YWdlTWFwcGluZ3MgIT0gbnVsbCB8fCBtZWRpYVR5cGVzTWFwcGluZ3MgIT0gbnVsbCkpIHsKKyAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoVXJpQ29ubmVnRmlsdGVyLmNsYXNzKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ZpbHRlci9pbnRlcm5hbC9wYWNrYWdlLWluZm8uamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ZpbHRlci9pbnRlcm5hbC9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDhiN2RlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvZmlsdGVyL2ludGVybmFsL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKKy8qKgorICogU2VydmVyIGZpbHRlciBpbnRlcm5hbCBjbGFzc2VzLgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5maWx0ZXIuaW50ZXJuYWw7CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9maWx0ZXIvcGFja2FnZS1pbmZvLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9maWx0ZXIvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIyMGJhZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ZpbHRlci9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvKioKKyAqIFByb3ZpZGVzIGNvcmUgc2VydmVyIGZpbHRlcnMuCisgKi8KK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmZpbHRlcjsKZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL0Fic3RyYWN0UmVzb3VyY2VGaW5kZXJBZGFwdGVyLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9BYnN0cmFjdFJlc291cmNlRmluZGVyQWRhcHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlOWQyMjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9BYnN0cmFjdFJlc291cmNlRmluZGVyQWRhcHRlci5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlRmluZGVyOworCisvKioKKyAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgcGFydGlhbCBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VGaW5kZXJ9LgorICoKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqIEBzaW5jZSAyLjE4CisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFJlc291cmNlRmluZGVyQWRhcHRlciBpbXBsZW1lbnRzIFJlc291cmNlRmluZGVyIHsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2Yge0Bjb2RlICNyZW1vdmUoKX0gd2hpY2ggY29tcGxpZXMgd2l0aCB0aGUgZGVmaW5lZCBjb250cmFjdC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2Yge0Bjb2RlICNjbG9zZSgpfSB3aGljaCBkb2VzIG5vdGhpbmcuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIC8vIE5PLU9QLgorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL0NvbnRhaW5lclV0aWxzLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9Db250YWluZXJVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MmUxYjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9Db250YWluZXJVdGlscy5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsOworCisvKioKKyAqIFV0aWxpdHkgbWV0aG9kcyB1c2VkIGJ5IGNvbnRhaW5lciBpbXBsZW1lbnRhdGlvbnMuCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQ29udGFpbmVyVXRpbHMgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFRPS0VOUyA9IHsKKyAgICAgICAgICAgICJ7IiwgIn0iLCAiXFwiLCAiXiIsICJ8IiwgImAiCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIFJFUExBQ0VNRU5UUyA9IHsKKyAgICAgICAgICAgICIlN0IiLCAiJTdEIiwgIiU1QyIsICIlNUUiLCAiJTdDIiwgIiU2MCIKKyAgICB9OworCisgICAgLyoqCisgICAgICogRW5jb2RlcyAocHJlZGVmaW5lZCBzdWJzZXQgb2YpIHVuc2FmZS91bndpc2UgVVJJIGNoYXJhY3RlcnMgd2l0aCB0aGUgcGVyY2VudC1lbmNvZGluZy4KKyAgICAgKgorICAgICAqIDxwPlJlcGxhY2VzIHRoZSBwcmVkZWZpbmVkIHNldCBvZiB1bnNhZmUgVVJJIGNoYXJhY3RlcnMgaW4gdGhlIHF1ZXJ5IHN0cmluZyB3aXRoIGl0cyBwZXJjZW50LWVuY29kZWQKKyAgICAgKiBjb3VudGVycGFydHMuIFRoZSByZXNlcnZlZCBjaGFyYWN0ZXJzIChhcyBkZWZpbmVkIGJ5IHRoZSBSRkMpIGFyZSBhdXRvbWF0aWNhbGx5IGVuY29kZWQgYnkgYnJvd3NlcnMsIGJ1dCBzb21lCisgICAgICogY2hhcmFjdGVycyBhcmUgaW4gdGhlICJncmF5IHpvbmUiIC0gYXJlIG5vdCBleHBsaWNpdGx5IGZvcmJpZGRlbiwgYnV0IG5vdCByZWNvbW1lbmRlZCBhbmQga25vd24gdG8gY2F1c2UKKyAgICAgKiBpc3N1ZXMuPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIG9yaWdpbmFsUXVlcnlTdHJpbmcgVVJJIHF1ZXJ5IHN0cmluZyAodGhlIHBhcnQgYmVoaW5kIHRoZSBxdWVzdGlvbiBtYXJrIGNoYXJhY3RlcikuCisgICAgICogQHJldHVybiB0aGUgc2FtZSBzdHJpbmcgd2l0aCB1bnNhZmUgY2hhcmFjdGVycyBwZXJjZW50IGVuY29kZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZW5jb2RlVW5zYWZlQ2hhcmFjdGVycyhmaW5hbCBTdHJpbmcgb3JpZ2luYWxRdWVyeVN0cmluZykgeworICAgICAgICBpZiAob3JpZ2luYWxRdWVyeVN0cmluZyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyByZXN1bHQgPSBvcmlnaW5hbFF1ZXJ5U3RyaW5nOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IFRPS0VOUy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKG9yaWdpbmFsUXVlcnlTdHJpbmcuY29udGFpbnMoVE9LRU5TW2ldKSkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5yZXBsYWNlKFRPS0VOU1tpXSwgUkVQTEFDRU1FTlRTW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVkdWNlcyB0aGUgbnVtYmVyIG9mIHNsYXNoZXMgYmVmb3JlIHRoZSBwYXRoIHRvIG9ubHkgb25lIHNsYXNoLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggcGF0aCBzdHJpbmcKKyAgICAgKiBAcmV0dXJuIHBhdGggc3RyaW5nIHdpdGggcmVkdWNlZCBzbGFzaGVzIHRvIG9ubHkgb25lLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlZHVjZUxlYWRpbmdTbGFzaGVzKGZpbmFsIFN0cmluZyBwYXRoKSB7CisgICAgICAgIGludCBsZW5ndGg7CisgICAgICAgIGlmIChwYXRoID09IG51bGwgfHwgKGxlbmd0aCA9IHBhdGgubGVuZ3RoKCkpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBwYXRoOworICAgICAgICB9CisKKyAgICAgICAgaW50IHN0YXJ0ID0gMDsKKyAgICAgICAgd2hpbGUgKHN0YXJ0ICE9IGxlbmd0aCAmJiAiLyIuaW5kZXhPZihwYXRoLmNoYXJBdChzdGFydCkpICE9IC0xKSB7CisgICAgICAgICAgICBzdGFydCsrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHBhdGguc3Vic3RyaW5nKHN0YXJ0ID4gMCA/IHN0YXJ0IC0gMSA6IDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNwbGl0cyBVUkkgYWRkcmVzcyBmcm9tIHF1ZXJ5IHBhcmFtcyBhbmQgcmV0dXJucyBpdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgVVJJIGFkZHJlc3MgaW4gc3RyaW5nIGZvcm1hdCB3aXRoIHF1ZXJ5IHBhcmFtcworICAgICAqIEByZXR1cm4gVVJJIGFkZHJlc3MgaW4gc3RyaW5nIGZvcm1hdCB3aXRob3V0IHF1ZXJ5IHBhcmFtcworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEhhbmRsZXJQYXRoKFN0cmluZyB1cmkpIHsKKyAgICAgICAgaWYgKHVyaSA9PSBudWxsIHx8IHVyaS5sZW5ndGgoKSA9PSAwIHx8ICF1cmkuY29udGFpbnMoIj8iKSkgeworICAgICAgICAgICAgcmV0dXJuIHVyaTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiB1cmkuc3Vic3RyaW5nKDAsIHVyaS5pbmRleE9mKCI/IikpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvSW50ZXJuYWxTZXJ2ZXJQcm9wZXJ0aWVzLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9JbnRlcm5hbFNlcnZlclByb3BlcnRpZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjYyZTZlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvSW50ZXJuYWxTZXJ2ZXJQcm9wZXJ0aWVzLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlByb3BlcnRpZXNDbGFzczsKKworLyoqCisgKiBKZXJzZXkgaW50ZXJuYWwgc2VydmVyLXNpZGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQcm9wZXJ0aWVzQ2xhc3MKK3B1YmxpYyBmaW5hbCBjbGFzcyBJbnRlcm5hbFNlcnZlclByb3BlcnRpZXMgeworCisKKyAgICAvKioKKyAgICAgKiBVc2VkIGludGVybmFsbHkgZm9yIHN0b3Jpbmcge0BsaW5rIGphdmF4LndzLnJzLmNvcmUuRm9ybX0gaW5zdGFuY2Ugd2l0aCBvcmlnaW5hbCAobm90IHVybC1kZWNvZGVkKSB2YWx1ZXMgaW4KKyAgICAgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3R9IHByb3BlcnRpZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9STV9QUk9QRVJUWSA9ICJqZXJzZXkuY29uZmlnLnNlcnZlci5yZXByZXNlbnRhdGlvbi5mb3JtIjsKKworICAgIC8qKgorICAgICAqIFVzZWQgaW50ZXJuYWxseSBmb3Igc3RvcmluZyB7QGxpbmsgamF2YXgud3MucnMuY29yZS5Gb3JtfSBpbnN0YW5jZSB3aXRoIHVybC1kZWNvZGVkIHZhbHVlcyBpbgorICAgICAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdH0gcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNX0RFQ09ERURfUFJPUEVSVFkgPSAiamVyc2V5LmNvbmZpZy5zZXJ2ZXIucmVwcmVzZW50YXRpb24uZGVjb2RlZC5mb3JtIjsKKworICAgIHByaXZhdGUgSW50ZXJuYWxTZXJ2ZXJQcm9wZXJ0aWVzKCkgeworICAgICAgICAvLyBwcmV2ZW50cyBpbnN0YW50aWF0aW9uCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvSmVyc2V5UmVxdWVzdFRpbWVvdXRIYW5kbGVyLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9KZXJzZXlSZXF1ZXN0VGltZW91dEhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzQ4NjYyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvSmVyc2V5UmVxdWVzdFRpbWVvdXRIYW5kbGVyLmphdmEKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQXN5bmNSZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29udGFpbmVyUmVzcG9uc2VXcml0ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5Db250YWluZXJSZXNwb25zZVdyaXRlci5UaW1lb3V0SGFuZGxlcjsKKworLyoqCisgKiBDb21tb24ge0BsaW5rIENvbnRhaW5lclJlc3BvbnNlV3JpdGVyI3N1c3BlbmQobG9uZywgVGltZVVuaXQsIENvbnRhaW5lclJlc3BvbnNlV3JpdGVyLlRpbWVvdXRIYW5kbGVyKX0KKyAqIGFuZCB7QGxpbmsgQ29udGFpbmVyUmVzcG9uc2VXcml0ZXIjc2V0U3VzcGVuZFRpbWVvdXQobG9uZywgVGltZVVuaXQpfSBoYW5kbGVyIHRoYXQgY2FuIGJlIHVzZWQgaW4KKyAqIHtAbGluayBDb250YWluZXJSZXNwb25zZVdyaXRlcn0gaW1wbGVtZW50YXRpb25zIGluc3RlYWQgb2YgdGhlIHVuZGVybHlpbmcgaW5mcmFzdHJ1Y3R1cmUuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSmVyc2V5UmVxdWVzdFRpbWVvdXRIYW5kbGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEplcnNleVJlcXVlc3RUaW1lb3V0SGFuZGxlci5jbGFzcy5nZXROYW1lKCkpOworCisgICAgcHJpdmF0ZSBTY2hlZHVsZWRGdXR1cmU8Pz4gdGltZW91dFRhc2sgPSBudWxsOyAvLyBndWFyZGVkIGJ5IHJ1bnRpbWVMb2NrCisgICAgcHJpdmF0ZSBDb250YWluZXJSZXNwb25zZVdyaXRlci5UaW1lb3V0SGFuZGxlciB0aW1lb3V0SGFuZGxlciA9IG51bGw7IC8vIGd1YXJkZWQgYnkgcnVudGltZUxvY2sKKyAgICBwcml2YXRlIGJvb2xlYW4gc3VzcGVuZGVkID0gZmFsc2U7IC8vIGd1YXJkZWQgYnkgcnVudGltZUxvY2sKKyAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBydW50aW1lTG9jayA9IG5ldyBPYmplY3QoKTsKKworICAgIHByaXZhdGUgZmluYWwgQ29udGFpbmVyUmVzcG9uc2VXcml0ZXIgY29udGFpbmVyUmVzcG9uc2VXcml0ZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3I7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgcmVxdWVzdCB0aW1lb3V0IGhhbmRsZXIgZm9yIHRoZSBnaXZlciB7QGxpbmsgQ29udGFpbmVyUmVzcG9uc2VXcml0ZXIgcmVzcG9uc2Ugd3JpdGVyfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250YWluZXJSZXNwb25zZVdyaXRlciByZXNwb25zZSB3cml0ZXIgdG8gY3JlYXRlIHJlcXVlc3QgdGltZW91dCBoYW5kbGVyIGZvci4KKyAgICAgKiBAcGFyYW0gdGltZW91dFRhc2tFeGVjdXRvciAgICAgSmVyc2V5IHJ1bnRpbWUgZXhlY3V0b3IgdXNlZCBmb3IgYmFja2dyb3VuZCBleGVjdXRpb24gb2YgdGltZW91dAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGluZyB0YXNrcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgSmVyc2V5UmVxdWVzdFRpbWVvdXRIYW5kbGVyKGZpbmFsIENvbnRhaW5lclJlc3BvbnNlV3JpdGVyIGNvbnRhaW5lclJlc3BvbnNlV3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlIHRpbWVvdXRUYXNrRXhlY3V0b3IpIHsKKyAgICAgICAgdGhpcy5jb250YWluZXJSZXNwb25zZVdyaXRlciA9IGNvbnRhaW5lclJlc3BvbnNlV3JpdGVyOworICAgICAgICB0aGlzLmV4ZWN1dG9yID0gdGltZW91dFRhc2tFeGVjdXRvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdXNwZW5kIHRoZSByZXF1ZXN0L3Jlc3BvbnNlIHByb2Nlc3NpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGltZU91dCB0aW1lLW91dCB2YWx1ZS4gVmFsdWUgbGVzcyBvciBlcXVhbCB0byAwLCBpbmRpY2F0ZXMgdGhhdAorICAgICAqICAgICAgICAgICAgICAgIHRoZSBwcm9jZXNzaW5nIGlzIHN1c3BlbmRlZCBpbmRlZmluaXRlbHkuCisgICAgICogQHBhcmFtIHVuaXQgICAgdGltZS1vdXQgdGltZSB1bml0LgorICAgICAqIEBwYXJhbSBoYW5kbGVyIHRpbWUtb3V0IGhhbmRsZXIgdG8gcHJvY2VzcyBhIHRpbWUtb3V0IGV2ZW50IGlmIGl0IG9jY3Vycy4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgc3VzcGVuZCBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNlZSBDb250YWluZXJSZXNwb25zZVdyaXRlciNzdXNwZW5kKGxvbmcsIFRpbWVVbml0LCBDb250YWluZXJSZXNwb25zZVdyaXRlci5UaW1lb3V0SGFuZGxlcikKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzdXNwZW5kKGZpbmFsIGxvbmcgdGltZU91dCwgZmluYWwgVGltZVVuaXQgdW5pdCwgZmluYWwgVGltZW91dEhhbmRsZXIgaGFuZGxlcikgeworICAgICAgICBzeW5jaHJvbml6ZWQgKHJ1bnRpbWVMb2NrKSB7CisgICAgICAgICAgICBpZiAoc3VzcGVuZGVkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdXNwZW5kZWQgPSB0cnVlOworICAgICAgICAgICAgdGltZW91dEhhbmRsZXIgPSBoYW5kbGVyOworCisgICAgICAgICAgICBjb250YWluZXJSZXNwb25zZVdyaXRlci5zZXRTdXNwZW5kVGltZW91dCh0aW1lT3V0LCB1bml0KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBzdXNwZW5kIHRpbWVvdXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGltZU91dCB0aW1lLW91dCB2YWx1ZS4gVmFsdWUgbGVzcyBvciBlcXVhbCB0byAwLCBpbmRpY2F0ZXMgdGhhdAorICAgICAqICAgICAgICAgICAgICAgIHRoZSBwcm9jZXNzaW5nIGlzIHN1c3BlbmRlZCBpbmRlZmluaXRlbHkuCisgICAgICogQHBhcmFtIHVuaXQgICAgdGltZS1vdXQgdGltZSB1bml0LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGluIGNhc2UgdGhlIHJlc3BvbnNlIHdyaXRlciBoYXMgbm90IGJlZW4gc3VzcGVuZGVkIHlldC4KKyAgICAgKiBAc2VlIENvbnRhaW5lclJlc3BvbnNlV3JpdGVyI3NldFN1c3BlbmRUaW1lb3V0KGxvbmcsIFRpbWVVbml0KQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN1c3BlbmRUaW1lb3V0KGZpbmFsIGxvbmcgdGltZU91dCwgZmluYWwgVGltZVVuaXQgdW5pdCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgIHN5bmNocm9uaXplZCAocnVudGltZUxvY2spIHsKKyAgICAgICAgICAgIGlmICghc3VzcGVuZGVkKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5TVVNQRU5EX05PVF9TVVNQRU5ERUQoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNsb3NlKHRydWUpOworCisgICAgICAgICAgICBpZiAodGltZU91dCA8PSBBc3luY1Jlc3BvbnNlLk5PX1RJTUVPVVQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdGltZW91dFRhc2sgPSBleGVjdXRvci5zY2hlZHVsZShuZXcgUnVubmFibGUoKSB7CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChydW50aW1lTG9jaykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0SGFuZGxlci5vblRpbWVvdXQoY29udGFpbmVyUmVzcG9uc2VXcml0ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLldBUk5JTkcsIExvY2FsaXphdGlvbk1lc3NhZ2VzLlNVU1BFTkRfSEFORExFUl9FWEVDVVRJT05fRkFJTEVEKCksIHRocm93YWJsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9LCB0aW1lT3V0LCB1bml0KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuV0FSTklORywgTG9jYWxpemF0aW9uTWVzc2FnZXMuU1VTUEVORF9TQ0hFRFVMSU5HX0VSUk9SKCksIGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENhbmNlbCB0aGUgc3VzcGVuZGVkIHRhc2suCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIGNsb3NlKGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN5bmNocm9uaXplZCB2b2lkIGNsb3NlKGZpbmFsIGJvb2xlYW4gaW50ZXJydXB0SWZSdW5uaW5nKSB7CisgICAgICAgIGlmICh0aW1lb3V0VGFzayAhPSBudWxsKSB7CisgICAgICAgICAgICB0aW1lb3V0VGFzay5jYW5jZWwoaW50ZXJydXB0SWZSdW5uaW5nKTsKKyAgICAgICAgICAgIHRpbWVvdXRUYXNrID0gbnVsbDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL0plcnNleVJlc291cmNlQ29udGV4dC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvSmVyc2V5UmVzb3VyY2VDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAyYmU1MAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL0plcnNleVJlc291cmNlQ29udGV4dC5qYXZhCkBAIC0wLDAgKzEsMjM3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5SZXNvdXJjZUNvbnRleHQ7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2NvcGU7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5CaW5kaW5nOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5CaW5kaW5nczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQ2xhc3NCaW5kaW5nOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5DdXN0b21Bbm5vdGF0aW9uTGl0ZXJhbDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuUHJvdmlkZXJzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUmVmbGVjdGlvbkhlbHBlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb2RlbC5Db250cmFjdFByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWwuUmVxdWVzdFNjb3BlZDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuRXh0ZW5kZWRSZXNvdXJjZUNvbnRleHQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTW9kZWw7CisKKy8qKgorICogSmVyc2V5IGltcGxlbWVudGF0aW9uIG9mIEpBWC1SUyB7QGxpbmsgUmVzb3VyY2VDb250ZXh0IHJlc291cmNlIGNvbnRleHR9LgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXlSZXNvdXJjZUNvbnRleHQgaW1wbGVtZW50cyBFeHRlbmRlZFJlc291cmNlQ29udGV4dCB7CisKKyAgICBwcml2YXRlIGZpbmFsIEZ1bmN0aW9uPENsYXNzPD8+LCA/PiBnZXRPckNyZWF0ZUluc3RhbmNlOworICAgIHByaXZhdGUgZmluYWwgQ29uc3VtZXI8T2JqZWN0PiBpbmplY3RJbnN0YW5jZTsKKyAgICBwcml2YXRlIGZpbmFsIENvbnN1bWVyPEJpbmRpbmc+IHJlZ2lzdGVyQmluZGluZzsKKworICAgIHByaXZhdGUgZmluYWwgU2V0PENsYXNzPD8+PiBiaW5kaW5nQ2FjaGU7CisgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgYmluZGluZ0NhY2hlTG9jazsKKworICAgIHByaXZhdGUgdm9sYXRpbGUgUmVzb3VyY2VNb2RlbCByZXNvdXJjZU1vZGVsOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBKZXJzZXlSZXNvdXJjZUNvbnRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZ2V0T3JDcmVhdGVJbnN0YW5jZSBmdW5jdGlvbiB0byBjcmVhdGUgb3IgZ2V0IGV4aXN0aW5nIGluc3RhbmNlLgorICAgICAqIEBwYXJhbSBpbmplY3RJbnN0YW5jZSAgICAgIGNvbnN1bWVyIHRvIGluamVjdCBpbnN0YW5jZXMgaW50byBhbiB1bm1hbmFnZWQgaW5zdGFuY2UuCisgICAgICogQHBhcmFtIHJlZ2lzdGVyQmluZGluZyAgICAgY29uc3VtZXIgdG8gcmVnaXN0ZXIgYSBuZXcgYmluZGluZyBpbnRvIGluamVjdGlvbiBtYW5hZ2VyLgorICAgICAqLworICAgIHB1YmxpYyBKZXJzZXlSZXNvdXJjZUNvbnRleHQoCisgICAgICAgICAgICBGdW5jdGlvbjxDbGFzczw/PiwgPz4gZ2V0T3JDcmVhdGVJbnN0YW5jZSwKKyAgICAgICAgICAgIENvbnN1bWVyPE9iamVjdD4gaW5qZWN0SW5zdGFuY2UsCisgICAgICAgICAgICBDb25zdW1lcjxCaW5kaW5nPiByZWdpc3RlckJpbmRpbmcpIHsKKyAgICAgICAgdGhpcy5nZXRPckNyZWF0ZUluc3RhbmNlID0gZ2V0T3JDcmVhdGVJbnN0YW5jZTsKKyAgICAgICAgdGhpcy5pbmplY3RJbnN0YW5jZSA9IGluamVjdEluc3RhbmNlOworICAgICAgICB0aGlzLnJlZ2lzdGVyQmluZGluZyA9IHJlZ2lzdGVyQmluZGluZzsKKyAgICAgICAgdGhpcy5iaW5kaW5nQ2FjaGUgPSBDb2xsZWN0aW9ucy5uZXdTZXRGcm9tTWFwKG5ldyBJZGVudGl0eUhhc2hNYXA8PigpKTsKKyAgICAgICAgdGhpcy5iaW5kaW5nQ2FjaGVMb2NrID0gbmV3IE9iamVjdCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyA8VD4gVCBnZXRSZXNvdXJjZShDbGFzczxUPiByZXNvdXJjZUNsYXNzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gKFQpIGdldE9yQ3JlYXRlSW5zdGFuY2UuYXBwbHkocmVzb3VyY2VDbGFzcyk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihKZXJzZXlSZXNvdXJjZUNvbnRleHQuY2xhc3MuZ2V0TmFtZSgpKS5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgTG9jYWxpemF0aW9uTWVzc2FnZXMuUkVTT1VSQ0VfTE9PS1VQX0ZBSUxFRChyZXNvdXJjZUNsYXNzKSwgZXgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gVCBpbml0UmVzb3VyY2UoVCByZXNvdXJjZSkgeworICAgICAgICBpbmplY3RJbnN0YW5jZS5hY2NlcHQocmVzb3VyY2UpOworICAgICAgICByZXR1cm4gcmVzb3VyY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQmluZHMge0Bjb2RlIHJlc291cmNlQ2xhc3N9IGludG8gSEsyIGNvbnRleHQgYXMgc2luZ2xldG9uLgorICAgICAqCisgICAgICogVGhlIGJvdW5kIGNsYXNzIGlzIHRoZW4gY2FjaGVkIGludGVybmFsbHkgc28gdGhhdCBhbnkgc3ViLXNlcXVlbnQgYXR0ZW1wdCB0byBiaW5kIHRoYXQgY2xhc3MKKyAgICAgKiBhcyBhIHNpbmdsZXRvbiBpcyBzaWxlbnRseSBpZ25vcmVkLgorICAgICAqCisgICAgICogQHBhcmFtIDxUPiAgICAgICAgICAgdHlwZSBvZiB0aGUgcmVzb3VyY2UgY2xhc3MuCisgICAgICogQHBhcmFtIHJlc291cmNlQ2xhc3MgcmVzb3VyY2UgY2xhc3MgdGhhdCBzaG91bGQgYmUgYm91bmQuIElmIHRoZSBjbGFzcyBpcyBub3QKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0ZWQgd2l0aCB7QGxpbmsgamF2YXguaW5qZWN0LlNpbmdsZXRvbiBTaW5nbGV0b24gYW5ub3RhdGlvbn0gaXQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGlnbm9yZWQgYnkgdGhpcyBtZXRob2QuCisgICAgICovCisgICAgcHVibGljIDxUPiB2b2lkIGJpbmRSZXNvdXJjZShDbGFzczxUPiByZXNvdXJjZUNsYXNzKSB7CisgICAgICAgIGlmIChiaW5kaW5nQ2FjaGUuY29udGFpbnMocmVzb3VyY2VDbGFzcykpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHN5bmNocm9uaXplZCAoYmluZGluZ0NhY2hlTG9jaykgeworICAgICAgICAgICAgaWYgKGJpbmRpbmdDYWNoZS5jb250YWlucyhyZXNvdXJjZUNsYXNzKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVuc2FmZUJpbmRSZXNvdXJjZShyZXNvdXJjZUNsYXNzLCBudWxsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEJpbmRzIHtAY29kZSByZXNvdXJjZUNsYXNzfSBpbnRvIEhLMiBjb250ZXh0IGFzIHNpbmdsZXRvbi4KKyAgICAgKgorICAgICAqIFRoZSBib3VuZCBjbGFzcyBpcyB0aGVuIGNhY2hlZCBpbnRlcm5hbGx5IHNvIHRoYXQgYW55IHN1Yi1zZXF1ZW50IGF0dGVtcHQgdG8gYmluZCB0aGF0IGNsYXNzCisgICAgICogYXMgYSBzaW5nbGV0b24gaXMgc2lsZW50bHkgaWdub3JlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZSBzaW5nbGV0b24gcmVzb3VyY2UgaW5zdGFuY2UgdGhhdCBzaG91bGQgYmUgYm91bmQgYXMgc2luZ2xldG9uLiBJZiB0aGUgY2xhc3MgaXMgbm90CisgICAgICogICAgICAgICAgICAgICAgIGFubm90YXRlZCB3aXRoIHtAbGluayBqYXZheC5pbmplY3QuU2luZ2xldG9uIFNpbmdsZXRvbiBhbm5vdGF0aW9ufSBpdAorICAgICAqICAgICAgICAgICAgICAgICB3aWxsIGJlIGlnbm9yZWQgYnkgdGhpcyBtZXRob2QuCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIDxUPiB2b2lkIGJpbmRSZXNvdXJjZUlmU2luZ2xldG9uKFQgcmVzb3VyY2UpIHsKKyAgICAgICAgZmluYWwgQ2xhc3M8Pz4gcmVzb3VyY2VDbGFzcyA9IHJlc291cmNlLmdldENsYXNzKCk7CisgICAgICAgIGlmIChiaW5kaW5nQ2FjaGUuY29udGFpbnMocmVzb3VyY2VDbGFzcykpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHN5bmNocm9uaXplZCAoYmluZGluZ0NhY2hlTG9jaykgeworICAgICAgICAgICAgaWYgKGJpbmRpbmdDYWNoZS5jb250YWlucyhyZXNvdXJjZUNsYXNzKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChnZXRTY29wZShyZXNvdXJjZUNsYXNzKSA9PSBTaW5nbGV0b24uY2xhc3MpIHsKKyAgICAgICAgICAgICAgICByZWdpc3RlckJpbmRpbmcuYWNjZXB0KEJpbmRpbmdzLnNlcnZpY2UocmVzb3VyY2UpLnRvKChDbGFzczw/IHN1cGVyIFQ+KSByZXNvdXJjZUNsYXNzKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJpbmRpbmdDYWNoZS5hZGQocmVzb3VyY2VDbGFzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCaW5kIGEgcmVzb3VyY2UgaW5zdGFuY2UgaW4gYSBJbmplY3Rpb25NYW5hZ2VyLgorICAgICAqCisgICAgICogVGhlIGJvdW5kIHJlc291cmNlIGluc3RhbmNlIGlzIGludGVybmFsbHkgY2FjaGVkIHRvIG1ha2Ugc3VyZSBhbnkgc3ViLXNlcXVlbnQgYXR0ZW1wdHMgdG8gc2VydmljZSB0aGUKKyAgICAgKiBjbGFzcyBhcmUgc2lsZW50bHkgaWdub3JlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBXQVJOSU5HOiBUaGlzIHZlcnNpb24gb2YgbWV0aG9kIGlzIG5vdCBzeW5jaHJvbml6ZWQgYXMgd2VsbCBhcyB0aGUgY2FjaGUgaXMgbm90IGNoZWNrZWQgZm9yIGV4aXN0aW5nCisgICAgICogYmluZGluZ3MgYmVmb3JlIHRoZSByZXNvdXJjZSBpcyBib3VuZCBhbmQgY2FjaGVkLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZSByZXNvdXJjZSBpbnN0YW5jZSB0byBiZSBib3VuZC4KKyAgICAgKiBAcGFyYW0gcHJvdmlkZXJNb2RlbCBwcm92aWRlciBtb2RlbCBmb3IgdGhlIHJlc291cmNlIGNsYXNzLiBJZiBub3Qge0Bjb2RlIG51bGx9LCB0aGUgY2xhc3MKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB3aWwgYmUgYm91bmQgYXMgYSBjb250cmFjdCBwcm92aWRlciB0b28uCisgICAgICovCisgICAgcHVibGljIHZvaWQgdW5zYWZlQmluZFJlc291cmNlKE9iamVjdCByZXNvdXJjZSwgQ29udHJhY3RQcm92aWRlciBwcm92aWRlck1vZGVsKSB7CisgICAgICAgIEJpbmRpbmcgYmluZGluZzsKKyAgICAgICAgQ2xhc3M8Pz4gcmVzb3VyY2VDbGFzcyA9IHJlc291cmNlLmdldENsYXNzKCk7CisgICAgICAgIGlmIChwcm92aWRlck1vZGVsICE9IG51bGwpIHsKKyAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBzY29wZSA9IHByb3ZpZGVyTW9kZWwuZ2V0U2NvcGUoKTsKKyAgICAgICAgICAgIGJpbmRpbmcgPSBCaW5kaW5ncy5zZXJ2aWNlKHJlc291cmNlKS50byhyZXNvdXJjZUNsYXNzKTsKKworICAgICAgICAgICAgZm9yIChDbGFzcyBjb250cmFjdCA6IFByb3ZpZGVycy5nZXRQcm92aWRlckNvbnRyYWN0cyhyZXNvdXJjZUNsYXNzKSkgeworICAgICAgICAgICAgICAgIGJpbmRpbmcuYWRkQWxpYXMoY29udHJhY3QpCisgICAgICAgICAgICAgICAgICAgICAgICAuaW4oc2NvcGUuZ2V0TmFtZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgLnF1YWxpZmllZEJ5KEN1c3RvbUFubm90YXRpb25MaXRlcmFsLklOU1RBTkNFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJpbmRpbmcgPSBCaW5kaW5ncy5zZXJ2aWNlQXNDb250cmFjdChyZXNvdXJjZUNsYXNzKTsKKyAgICAgICAgfQorICAgICAgICByZWdpc3RlckJpbmRpbmcuYWNjZXB0KGJpbmRpbmcpOworICAgICAgICBiaW5kaW5nQ2FjaGUuYWRkKHJlc291cmNlQ2xhc3MpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBnZXRTY29wZShDbGFzczw/PiByZXNvdXJjZUNsYXNzKSB7CisgICAgICAgIGZpbmFsIENvbGxlY3Rpb248Q2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+PiBzY29wZXMgPQorICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25IZWxwZXIuZ2V0QW5ub3RhdGlvblR5cGVzKHJlc291cmNlQ2xhc3MsIFNjb3BlLmNsYXNzKTsKKworICAgICAgICByZXR1cm4gc2NvcGVzLmlzRW1wdHkoKSA/IFJlcXVlc3RTY29wZWQuY2xhc3MgOiBzY29wZXMuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQmluZCBhIHJlc291cmNlIGNsYXNzIGluIGEgSEsyIGNvbnRleHQuCisgICAgICoKKyAgICAgKiBUaGUgYm91bmQgcmVzb3VyY2UgY2xhc3MgaXMgaW50ZXJuYWxseSBjYWNoZWQgdG8gbWFrZSBzdXJlIGFueSBzdWItc2VxdWVudCBhdHRlbXB0cyB0byBiaW5kIHRoZQorICAgICAqIGNsYXNzIGFyZSBzaWxlbnRseSBpZ25vcmVkLgorICAgICAqIDxwPgorICAgICAqIFdBUk5JTkc6IFRoaXMgdmVyc2lvbiBvZiBtZXRob2QgaXMgbm90IHN5bmNocm9uaXplZCBhcyB3ZWxsIGFzIHRoZSBjYWNoZSBpcyBub3QgY2hlY2tlZCBmb3IgZXhpc3RpbmcKKyAgICAgKiBiaW5kaW5ncyBiZWZvcmUgdGhlIHJlc291cmNlIGlzIGJvdW5kIGFuZCBjYWNoZWQuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIDxUPiAgICAgICAgICAgcmVzb3VyY2UgY2xhc3MgdHlwZS4KKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VDbGFzcyByZXNvdXJjZSBjbGFzcyB0byBiZSBib3VuZC4KKyAgICAgKiBAcGFyYW0gcHJvdmlkZXJNb2RlbCBwcm92aWRlciBtb2RlbCBmb3IgdGhlIGNsYXNzLiBJZiBub3Qge0Bjb2RlIG51bGx9LCB0aGUgY2xhc3MKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB3aWwgYmUgYm91bmQgYXMgYSBjb250cmFjdCBwcm92aWRlciB0b28uCisgICAgICovCisgICAgcHVibGljIDxUPiB2b2lkIHVuc2FmZUJpbmRSZXNvdXJjZShDbGFzczxUPiByZXNvdXJjZUNsYXNzLCBDb250cmFjdFByb3ZpZGVyIHByb3ZpZGVyTW9kZWwpIHsKKyAgICAgICAgQ2xhc3NCaW5kaW5nPFQ+IGRlc2NyaXB0b3I7CisgICAgICAgIGlmIChwcm92aWRlck1vZGVsICE9IG51bGwpIHsKKyAgICAgICAgICAgIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBzY29wZSA9IHByb3ZpZGVyTW9kZWwuZ2V0U2NvcGUoKTsKKyAgICAgICAgICAgIGRlc2NyaXB0b3IgPSBCaW5kaW5ncy5zZXJ2aWNlQXNDb250cmFjdChyZXNvdXJjZUNsYXNzKS5pbihzY29wZSk7CisKKyAgICAgICAgICAgIGZvciAoQ2xhc3MgY29udHJhY3QgOiBwcm92aWRlck1vZGVsLmdldENvbnRyYWN0cygpKSB7CisgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5hZGRBbGlhcyhjb250cmFjdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5pbihzY29wZS5nZXROYW1lKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAucmFua2VkKHByb3ZpZGVyTW9kZWwuZ2V0UHJpb3JpdHkoY29udHJhY3QpKQorICAgICAgICAgICAgICAgICAgICAgICAgLnF1YWxpZmllZEJ5KEN1c3RvbUFubm90YXRpb25MaXRlcmFsLklOU1RBTkNFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlc2NyaXB0b3IgPSBCaW5kaW5ncy5zZXJ2aWNlQXNDb250cmFjdChyZXNvdXJjZUNsYXNzKS5pbihnZXRTY29wZShyZXNvdXJjZUNsYXNzKSk7CisgICAgICAgIH0KKyAgICAgICAgcmVnaXN0ZXJCaW5kaW5nLmFjY2VwdChkZXNjcmlwdG9yKTsKKyAgICAgICAgYmluZGluZ0NhY2hlLmFkZChyZXNvdXJjZUNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb3VyY2VNb2RlbCBnZXRSZXNvdXJjZU1vZGVsKCkgeworICAgICAgICByZXR1cm4gdGhpcy5yZXNvdXJjZU1vZGVsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUge0BsaW5rIFJlc291cmNlTW9kZWwgcmVzb3VyY2UgbW9kZX0gb2YgdGhlIGFwcGxpY2F0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbnRleHQuCisgICAgICogQHBhcmFtIHJlc291cmNlTW9kZWwgUmVzb3VyY2UgbW9kZWwgb24gd2hpY2ggdGhlIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyIGFwcGxpY2F0aW9ufQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGlzIGJhc2VkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlc291cmNlTW9kZWwoUmVzb3VyY2VNb2RlbCByZXNvdXJjZU1vZGVsKSB7CisgICAgICAgIHRoaXMucmVzb3VyY2VNb2RlbCA9IHJlc291cmNlTW9kZWw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvSnNvbldpdGhQYWRkaW5nSW50ZXJjZXB0b3IuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL0pzb25XaXRoUGFkZGluZ0ludGVyY2VwdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdhYzgwZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL0pzb25XaXRoUGFkZGluZ0ludGVyY2VwdG9yLmphdmEKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5JbnRlcmNlcHRvckNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvckNvbnRleHQ7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5OworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuSmVyc2V5UHJpb3JpdGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLk1lc3NhZ2VVdGlsczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuSlNPTlA7CisKKy8qKgorICogQSB7QGxpbmsgV3JpdGVySW50ZXJjZXB0b3J9IGltcGxlbWVudGF0aW9uIGZvciBKU09OUCBmb3JtYXQuIFRoaXMgaW50ZXJjZXB0b3Igd3JhcHMgYSBKU09OIHN0cmVhbSBvYnRhaW5lZCBieSBhIHVuZGVybHlpbmcKKyAqIEpTT04gcHJvdmlkZXIgaW50byBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGRlZmluZWQgYnkgdGhlIHtAbGluayBKU09OUH0gYW5ub3RhdGlvbi4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqIEBzZWUgSlNPTlAKKyAqLworQFByaW9yaXR5KEplcnNleVByaW9yaXRpZXMuUE9TVF9FTlRJVFlfQ09ERVIpCisvLyB0aGlzIGludGVyY2VwdG9yIGhhcyB0byBydW4gYWZ0ZXIgY29udGVudCBlbmNvZGVycyAoZS5nLiBnemlwL2RlZmxhdGUpLCBvdGhlcndpc2UgdGhlIGFkZGVkIGNvbnRlbnQgKHBhZGRpbmcgd2l0aCB0aGUgY2FsbGJhY2sKKy8vIG1ldGhvZCBjYWxsIHdvdWxkIG5vdCBiZSBlbmNvZGVkLgorcHVibGljIGNsYXNzIEpzb25XaXRoUGFkZGluZ0ludGVyY2VwdG9yIGltcGxlbWVudHMgV3JpdGVySW50ZXJjZXB0b3IgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgU2V0PFN0cmluZz4+IEpBVkFTQ1JJUFRfVFlQRVM7CisKKyAgICBzdGF0aWMgeworICAgICAgICBKQVZBU0NSSVBUX1RZUEVTID0gbmV3IEhhc2hNYXA8PigyKTsKKworICAgICAgICBKQVZBU0NSSVBUX1RZUEVTLnB1dCgiYXBwbGljYXRpb24iLCBBcnJheXMuYXNMaXN0KCJ4LWphdmFzY3JpcHQiLCAiZWNtYXNjcmlwdCIsICJqYXZhc2NyaXB0IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnN0cmVhbSgpLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKSk7CisgICAgICAgIEpBVkFTQ1JJUFRfVFlQRVMucHV0KCJ0ZXh0IiwgQXJyYXlzLmFzTGlzdCgiamF2YXNjcmlwdCIsICJ4LWphdmFzY3JpcHQiLCAiZWNtYXNjcmlwdCIsICJqc2NyaXB0IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3RyZWFtKCkuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpKTsKKyAgICB9CisKKyAgICBASW5qZWN0CisgICAgcHJpdmF0ZSBQcm92aWRlcjxDb250YWluZXJSZXF1ZXN0PiBjb250YWluZXJSZXF1ZXN0UHJvdmlkZXI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhcm91bmRXcml0ZVRvKGZpbmFsIFdyaXRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpc0phdmFzY3JpcHQgPSBpc0phdmFzY3JpcHQoY29udGV4dC5nZXRNZWRpYVR5cGUoKSk7CisgICAgICAgIGZpbmFsIEpTT05QIGpzb25wID0gZ2V0SnNvbnBBbm5vdGF0aW9uKGNvbnRleHQpOworCisgICAgICAgIGZpbmFsIGJvb2xlYW4gd3JhcEludG9DYWxsYmFjayA9IGlzSmF2YXNjcmlwdCAmJiBqc29ucCAhPSBudWxsOworCisgICAgICAgIGlmICh3cmFwSW50b0NhbGxiYWNrKSB7CisgICAgICAgICAgICBjb250ZXh0LnNldE1lZGlhVHlwZShNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFKTsKKworICAgICAgICAgICAgY29udGV4dC5nZXRPdXRwdXRTdHJlYW0oKS53cml0ZShnZXRDYWxsYmFja05hbWUoanNvbnApLmdldEJ5dGVzKE1lc3NhZ2VVdGlscy5nZXRDaGFyc2V0KGNvbnRleHQuZ2V0TWVkaWFUeXBlKCkpKSk7CisgICAgICAgICAgICBjb250ZXh0LmdldE91dHB1dFN0cmVhbSgpLndyaXRlKCcoJyk7CisgICAgICAgIH0KKworICAgICAgICBjb250ZXh0LnByb2NlZWQoKTsKKworICAgICAgICBpZiAod3JhcEludG9DYWxsYmFjaykgeworICAgICAgICAgICAgY29udGV4dC5nZXRPdXRwdXRTdHJlYW0oKS53cml0ZSgnKScpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGZsYWcgd2hldGhlciB0aGUgZ2l2ZW4ge0BsaW5rIE1lZGlhVHlwZSBtZWRpYSB0eXBlfSBiZWxvbmdzIHRvIHRoZSBncm91cCBvZiBKYXZhU2NyaXB0IG1lZGlhIHR5cGVzLgorICAgICAqCisgICAgICogQHBhcmFtIG1lZGlhVHlwZSBtZWRpYSB0eXBlIHRvIGNoZWNrLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBnaXZlbiBtZWRpYSB0eXBlIGlzIGEgSmF2YVNjcmlwdCB0eXBlLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZSAob3IgaWYgdGhlIG1lZGlhIHR5cGUgaXMKKyAgICAgKiAgICAgICAgIHtAY29kZSBudWxsfX0KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNKYXZhc2NyaXB0KGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgaWYgKG1lZGlhVHlwZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiBzdWJ0eXBlcyA9IEpBVkFTQ1JJUFRfVFlQRVMuZ2V0KG1lZGlhVHlwZS5nZXRUeXBlKCkpOworICAgICAgICByZXR1cm4gc3VidHlwZXMgIT0gbnVsbCAmJiBzdWJ0eXBlcy5jb250YWlucyhtZWRpYVR5cGUuZ2V0U3VidHlwZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgSmF2YVNjcmlwdCBjYWxsYmFjayBuYW1lIHRvIHdyYXAgdGhlIEpTT04gZW50aXR5IGludG8uIFRoZSBjYWxsYmFjayBuYW1lIGlzIGRldGVybWluZWQgZnJvbSB0aGUge0BsaW5rIEpTT05QfQorICAgICAqIGFubm90YXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0ganNvbnAge0BsaW5rIEpTT05QfSBhbm5vdGF0aW9uIHRvIGRldGVybWluZSB0aGUgY2FsbGJhY2sgbmFtZSBmcm9tLgorICAgICAqIEByZXR1cm4gYSBKYXZhU2NyaXB0IGNhbGxiYWNrIG5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0Q2FsbGJhY2tOYW1lKGZpbmFsIEpTT05QIGpzb25wKSB7CisgICAgICAgIFN0cmluZyBjYWxsYmFjayA9IGpzb25wLmNhbGxiYWNrKCk7CisKKyAgICAgICAgaWYgKCEiIi5lcXVhbHMoanNvbnAucXVlcnlQYXJhbSgpKSkgeworICAgICAgICAgICAgZmluYWwgQ29udGFpbmVyUmVxdWVzdCBjb250YWluZXJSZXF1ZXN0ID0gY29udGFpbmVyUmVxdWVzdFByb3ZpZGVyLmdldCgpOworICAgICAgICAgICAgZmluYWwgVXJpSW5mbyB1cmlJbmZvID0gY29udGFpbmVyUmVxdWVzdC5nZXRVcmlJbmZvKCk7CisgICAgICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gcXVlcnlQYXJhbWV0ZXJzID0gdXJpSW5mby5nZXRRdWVyeVBhcmFtZXRlcnMoKTsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBxdWVyeVBhcmFtZXRlciA9IHF1ZXJ5UGFyYW1ldGVycy5nZXQoanNvbnAucXVlcnlQYXJhbSgpKTsKKworICAgICAgICAgICAgY2FsbGJhY2sgPSAocXVlcnlQYXJhbWV0ZXIgIT0gbnVsbCAmJiAhcXVlcnlQYXJhbWV0ZXIuaXNFbXB0eSgpKSA/IHF1ZXJ5UGFyYW1ldGVyLmdldCgwKSA6IGNhbGxiYWNrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNhbGxiYWNrOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSB7QGxpbmsgSlNPTlB9IGFubm90YXRpb24gb2YgdGhlIHJlc291cmNlIG1ldGhvZCByZXNwb25zaWJsZSBmb3IgaGFuZGxpbmcgdGhlIGN1cnJlbnQgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IGFuIHtAbGluayBJbnRlcmNlcHRvckNvbnRleHQgaW50ZXJjZXB0b3IgY29udGV4dH0gdG8gb2J0YWluIHRoZSBhbm5vdGF0aW9uIGZyb20uCisgICAgICogQHJldHVybiB7QGxpbmsgSlNPTlB9IGFubm90YXRpb24gb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSByZXNvdXJjZSBtZXRob2QgaXMgbm90IGFubm90YXRlZCB3aXRoIHRoaXMgYW5ub3RhdGlvbi4KKyAgICAgKiBAc2VlIGphdmF4LndzLnJzLmV4dC5JbnRlcmNlcHRvckNvbnRleHQjZ2V0QW5ub3RhdGlvbnMoKQorICAgICAqLworICAgIHByaXZhdGUgSlNPTlAgZ2V0SnNvbnBBbm5vdGF0aW9uKGZpbmFsIEludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucyA9IGNvbnRleHQuZ2V0QW5ub3RhdGlvbnMoKTsKKworICAgICAgICBpZiAoYW5ub3RhdGlvbnMgIT0gbnVsbCAmJiBhbm5vdGF0aW9ucy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBmb3IgKGZpbmFsIEFubm90YXRpb24gYW5ub3RhdGlvbiA6IGFubm90YXRpb25zKSB7CisgICAgICAgICAgICAgICAgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBKU09OUCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gKEpTT05QKSBhbm5vdGF0aW9uOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL01hcHBhYmxlRXhjZXB0aW9uV3JhcHBlckludGVyY2VwdG9yLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9NYXBwYWJsZUV4Y2VwdGlvbldyYXBwZXJJbnRlcmNlcHRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ZTNlMzQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9NYXBwYWJsZUV4Y2VwdGlvbldyYXBwZXJJbnRlcmNlcHRvci5qYXZhCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJlYWRlckludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SZWFkZXJJbnRlcmNlcHRvckNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvckNvbnRleHQ7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5OworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQWJzdHJhY3RCaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5NZXNzYWdlQm9keVByb3ZpZGVyTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLnByb2Nlc3MuTWFwcGFibGVFeGNlcHRpb247CisKKy8qKgorICogSW50ZXJjZXB0b3IgdGhhdCB3cmFwcyBzcGVjaWZpYyBleGNlcHRpb25zIHR5cGVzIHRocm93biBieSB3cmFwcGVkIGludGVyY2VwdG9ycyBhbmQgYnkgbWVzc2FnZQorICogYm9keSByZWFkZXJzIGFuZCB3cml0ZXJzIGludG8gYSBtYXBwYWJsZSBleGNlcHRpb24uCisgKiBJdCBtdXN0IGhhdmUgdGhlIGxvd2VzdCBwcmlvcml0eSBpbiBvcmRlciB0byB3cmFwIGFsbCBvdGhlciBpbnRlcmNlcHRvcnMuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitAUHJpb3JpdHkoMTApCitAU2luZ2xldG9uCitwdWJsaWMgY2xhc3MgTWFwcGFibGVFeGNlcHRpb25XcmFwcGVySW50ZXJjZXB0b3IgaW1wbGVtZW50cyBSZWFkZXJJbnRlcmNlcHRvciwgV3JpdGVySW50ZXJjZXB0b3IgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdCBhcm91bmRSZWFkRnJvbShmaW5hbCBSZWFkZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5wcm9jZWVkKCk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHwgTWFwcGFibGVFeGNlcHRpb24gfCBNZXNzYWdlQm9keVByb3ZpZGVyTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNYXBwYWJsZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYXJvdW5kV3JpdGVUbyhmaW5hbCBXcml0ZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb250ZXh0LnByb2NlZWQoKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24gfCBNYXBwYWJsZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICB9IGNhdGNoIChmaW5hbCBNZXNzYWdlQm9keVByb3ZpZGVyTm90Rm91bmRFeGNlcHRpb24gbmZlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbihuZmUpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE1hcHBhYmxlRXhjZXB0aW9uKGUpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCaW5kZXIgcmVnaXN0ZXJpbmcgdGhlIHtAbGluayBNYXBwYWJsZUV4Y2VwdGlvbldyYXBwZXJJbnRlcmNlcHRvciBFeGNlcHRpb24gV3JhcHBlciBJbnRlcmNlcHRvcn0KKyAgICAgKiAodXNlZCBvbiB0aGUgY2xpZW50IHNpZGUpLgorICAgICAqCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCaW5kZXIgZXh0ZW5kcyBBYnN0cmFjdEJpbmRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIGJpbmQoTWFwcGFibGVFeGNlcHRpb25XcmFwcGVySW50ZXJjZXB0b3IuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIC50byhSZWFkZXJJbnRlcmNlcHRvci5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgLnRvKFdyaXRlckludGVyY2VwdG9yLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAuaW4oU2luZ2xldG9uLmNsYXNzKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL1Byb2Nlc3NpbmdQcm92aWRlcnMuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL1Byb2Nlc3NpbmdQcm92aWRlcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmRiY2I0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvUHJvY2Vzc2luZ1Byb3ZpZGVycy5qYXZhCkBAIC0wLDAgKzEsMjkyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkR5bmFtaWNGZWF0dXJlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJlYWRlckludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5Qcm92aWRlcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW9kZWwuaW50ZXJuYWwuUmFua2VkQ29tcGFyYXRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb2RlbC5pbnRlcm5hbC5SYW5rZWRQcm92aWRlcjsKKworLyoqCisgKiBJbmplY3RhYmxlIGVuY2Fwc3VsYXRpbmcgY2xhc3MgY29udGFpbmluZyBwcm9jZXNzaW5nIHByb3ZpZGVycyBsaWtlIGZpbHRlcnMsIGludGVyY2VwdG9ycywKKyAqIG5hbWUgYm91bmQgcHJvdmlkZXJzLCBkeW5hbWljIGZlYXR1cmVzLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIFByb2Nlc3NpbmdQcm92aWRlcnMgeworCisgICAgcHJpdmF0ZSBmaW5hbCBNdWx0aXZhbHVlZE1hcDxDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4sIFJhbmtlZFByb3ZpZGVyPENvbnRhaW5lclJlcXVlc3RGaWx0ZXI+PiBuYW1lQm91bmRSZXF1ZXN0RmlsdGVyczsKKyAgICBwcml2YXRlIGZpbmFsIE11bHRpdmFsdWVkTWFwPENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiwgUmFua2VkUHJvdmlkZXI8Q29udGFpbmVyUmVzcG9uc2VGaWx0ZXI+PiBuYW1lQm91bmRSZXNwb25zZUZpbHRlcnM7CisgICAgcHJpdmF0ZSBmaW5hbCBNdWx0aXZhbHVlZE1hcDxDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4sIFJhbmtlZFByb3ZpZGVyPFJlYWRlckludGVyY2VwdG9yPj4gbmFtZUJvdW5kUmVhZGVySW50ZXJjZXB0b3JzOworICAgIHByaXZhdGUgZmluYWwgTXVsdGl2YWx1ZWRNYXA8Q2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+LCBSYW5rZWRQcm92aWRlcjxXcml0ZXJJbnRlcmNlcHRvcj4+IG5hbWVCb3VuZFdyaXRlckludGVyY2VwdG9yczsKKyAgICBwcml2YXRlIGZpbmFsIE11bHRpdmFsdWVkTWFwPFJhbmtlZFByb3ZpZGVyPENvbnRhaW5lclJlcXVlc3RGaWx0ZXI+LCBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4+CisgICAgICAgICAgICBuYW1lQm91bmRSZXF1ZXN0RmlsdGVyc0ludmVyc2U7CisgICAgcHJpdmF0ZSBmaW5hbCBNdWx0aXZhbHVlZE1hcDxSYW5rZWRQcm92aWRlcjxDb250YWluZXJSZXNwb25zZUZpbHRlcj4sIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPj4KKyAgICAgICAgICAgIG5hbWVCb3VuZFJlc3BvbnNlRmlsdGVyc0ludmVyc2U7CisgICAgcHJpdmF0ZSBmaW5hbCBNdWx0aXZhbHVlZE1hcDxSYW5rZWRQcm92aWRlcjxSZWFkZXJJbnRlcmNlcHRvcj4sIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPj4KKyAgICAgICAgICAgIG5hbWVCb3VuZFJlYWRlckludGVyY2VwdG9yc0ludmVyc2U7CisgICAgcHJpdmF0ZSBmaW5hbCBNdWx0aXZhbHVlZE1hcDxSYW5rZWRQcm92aWRlcjxXcml0ZXJJbnRlcmNlcHRvcj4sIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPj4KKyAgICAgICAgICAgIG5hbWVCb3VuZFdyaXRlckludGVyY2VwdG9yc0ludmVyc2U7CisgICAgcHJpdmF0ZSBmaW5hbCBJdGVyYWJsZTxSYW5rZWRQcm92aWRlcjxDb250YWluZXJSZXF1ZXN0RmlsdGVyPj4gZ2xvYmFsUmVxdWVzdEZpbHRlcnM7CisgICAgcHJpdmF0ZSBmaW5hbCBJdGVyYWJsZTxDb250YWluZXJSZXF1ZXN0RmlsdGVyPiBzb3J0ZWRHbG9iYWxSZXF1ZXN0RmlsdGVyczsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8UmFua2VkUHJvdmlkZXI8Q29udGFpbmVyUmVxdWVzdEZpbHRlcj4+IHByZU1hdGNoRmlsdGVyczsKKyAgICBwcml2YXRlIGZpbmFsIEl0ZXJhYmxlPFJhbmtlZFByb3ZpZGVyPENvbnRhaW5lclJlc3BvbnNlRmlsdGVyPj4gZ2xvYmFsUmVzcG9uc2VGaWx0ZXJzOworICAgIHByaXZhdGUgZmluYWwgSXRlcmFibGU8Q29udGFpbmVyUmVzcG9uc2VGaWx0ZXI+IHNvcnRlZEdsb2JhbFJlc3BvbnNlRmlsdGVyczsKKworICAgIHByaXZhdGUgZmluYWwgSXRlcmFibGU8UmFua2VkUHJvdmlkZXI8UmVhZGVySW50ZXJjZXB0b3I+PiBnbG9iYWxSZWFkZXJJbnRlcmNlcHRvcnM7CisgICAgcHJpdmF0ZSBmaW5hbCBJdGVyYWJsZTxSZWFkZXJJbnRlcmNlcHRvcj4gc29ydGVkR2xvYmFsUmVhZGVySW50ZXJjZXB0b3JzOworICAgIHByaXZhdGUgZmluYWwgSXRlcmFibGU8UmFua2VkUHJvdmlkZXI8V3JpdGVySW50ZXJjZXB0b3I+PiBnbG9iYWxXcml0ZXJJbnRlcmNlcHRvcnM7CisgICAgcHJpdmF0ZSBmaW5hbCBJdGVyYWJsZTxXcml0ZXJJbnRlcmNlcHRvcj4gc29ydGVkR2xvYmFsV3JpdGVySW50ZXJjZXB0b3JzOworICAgIHByaXZhdGUgZmluYWwgSXRlcmFibGU8RHluYW1pY0ZlYXR1cmU+IGR5bmFtaWNGZWF0dXJlczsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgbmV3IGluc3RhbmNlIG9mIHRoZSBwcm9jZXNzaW5nIHByb3ZpZGVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lQm91bmRSZXF1ZXN0RmlsdGVycyBOYW1lIGJvdW5kIHtAbGluayBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHJlcXVlc3QgZmlsdGVyc30uCisgICAgICogQHBhcmFtIG5hbWVCb3VuZFJlcXVlc3RGaWx0ZXJzSW52ZXJzZSBJbnZlcnNlIG1hcCB3aXRoIG5hbWUgYm91bmQgIHtAbGluayBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHJlcXVlc3QgZmlsdGVyc30uCisgICAgICogQHBhcmFtIG5hbWVCb3VuZFJlc3BvbnNlRmlsdGVycyBOYW1lIGJvdW5kIHtAbGluayBDb250YWluZXJSZXNwb25zZUZpbHRlciByZXNwb25zZSBmaWx0ZXJzfS4KKyAgICAgKiBAcGFyYW0gbmFtZUJvdW5kUmVzcG9uc2VGaWx0ZXJzSW52ZXJzZSBJbnZlcnNlIG1hcCB3aXRoIG5hbWUgYm91bmQge0BsaW5rIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyIHJlc3BvbnNlIGZpbHRlcnN9LgorICAgICAqIEBwYXJhbSBuYW1lQm91bmRSZWFkZXJJbnRlcmNlcHRvcnMgTmFtZSBib3VuZCB7QGxpbmsgUmVhZGVySW50ZXJjZXB0b3IgcmVhZGVyIGludGVyY2VwdG9yc30uCisgICAgICogQHBhcmFtIG5hbWVCb3VuZFJlYWRlckludGVyY2VwdG9yc0ludmVyc2UgSW52ZXJzZSBtYXAgd2l0aCBuYW1lIGJvdW5kIHtAbGluayBSZWFkZXJJbnRlcmNlcHRvciByZWFkZXIgaW50ZXJjZXB0b3JzfS4KKyAgICAgKiBAcGFyYW0gbmFtZUJvdW5kV3JpdGVySW50ZXJjZXB0b3JzIE5hbWUgYm91bmQge0BsaW5rIFdyaXRlckludGVyY2VwdG9yIHdyaXRlciBpbnRlcmNlcHRvcnN9LgorICAgICAqIEBwYXJhbSBuYW1lQm91bmRXcml0ZXJJbnRlcmNlcHRvcnNJbnZlcnNlIEludmVyc2UgbWFwIHdpdGggbmFtZSBib3VuZCB7QGxpbmsgV3JpdGVySW50ZXJjZXB0b3Igd3JpdGVyIGludGVyY2VwdG9yc30uCisgICAgICogQHBhcmFtIGdsb2JhbFJlcXVlc3RGaWx0ZXJzIEdsb2JhbCB7QGxpbmsgQ29udGFpbmVyUmVxdWVzdEZpbHRlciByZXF1ZXN0IGZpbHRlcnN9LgorICAgICAqIEBwYXJhbSBwcmVNYXRjaEZpbHRlcnMge0BsaW5rIGphdmF4LndzLnJzLmNvbnRhaW5lci5QcmVNYXRjaGluZyBQcmUtbWF0Y2hpbmd9CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHtAbGluayBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHJlcXVlc3QgZmlsdGVyc30uCisgICAgICogQHBhcmFtIGdsb2JhbFJlc3BvbnNlRmlsdGVycyBHbG9iYWwge0BsaW5rIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyIHJlc3BvbnNlIGZpbHRlcnN9LgorICAgICAqIEBwYXJhbSBnbG9iYWxSZWFkZXJJbnRlcmNlcHRvcnMgR2xvYmFsIHtAbGluayBSZWFkZXJJbnRlcmNlcHRvciByZWFkZXIgaW50ZXJjZXB0b3JzfS4KKyAgICAgKiBAcGFyYW0gZ2xvYmFsV3JpdGVySW50ZXJjZXB0b3JzIEdsb2JhbCB7QGxpbmsgV3JpdGVySW50ZXJjZXB0b3Igd3JpdGVyIGludGVyY2VwdG9yc30uCisgICAgICogQHBhcmFtIGR5bmFtaWNGZWF0dXJlcyB7QGxpbmsgRHluYW1pY0ZlYXR1cmUgRHluYW1pYyBmZWF0dXJlc30uCisgICAgICovCisgICAgcHVibGljIFByb2Nlc3NpbmdQcm92aWRlcnMoCisgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4sIFJhbmtlZFByb3ZpZGVyPENvbnRhaW5lclJlcXVlc3RGaWx0ZXI+PiBuYW1lQm91bmRSZXF1ZXN0RmlsdGVycywKKyAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFJhbmtlZFByb3ZpZGVyPENvbnRhaW5lclJlcXVlc3RGaWx0ZXI+LCBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4+IG5hbWVCb3VuZFJlcXVlc3RGaWx0ZXJzSW52ZXJzZSwKKyAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiwgUmFua2VkUHJvdmlkZXI8Q29udGFpbmVyUmVzcG9uc2VGaWx0ZXI+PiBuYW1lQm91bmRSZXNwb25zZUZpbHRlcnMsCisgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxSYW5rZWRQcm92aWRlcjxDb250YWluZXJSZXNwb25zZUZpbHRlcj4sIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPj4gbmFtZUJvdW5kUmVzcG9uc2VGaWx0ZXJzSW52ZXJzZSwKKyAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiwgUmFua2VkUHJvdmlkZXI8UmVhZGVySW50ZXJjZXB0b3I+PiBuYW1lQm91bmRSZWFkZXJJbnRlcmNlcHRvcnMsCisgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxSYW5rZWRQcm92aWRlcjxSZWFkZXJJbnRlcmNlcHRvcj4sIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPj4gbmFtZUJvdW5kUmVhZGVySW50ZXJjZXB0b3JzSW52ZXJzZSwKKyAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiwgUmFua2VkUHJvdmlkZXI8V3JpdGVySW50ZXJjZXB0b3I+PiBuYW1lQm91bmRXcml0ZXJJbnRlcmNlcHRvcnMsCisgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxSYW5rZWRQcm92aWRlcjxXcml0ZXJJbnRlcmNlcHRvcj4sIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPj4gbmFtZUJvdW5kV3JpdGVySW50ZXJjZXB0b3JzSW52ZXJzZSwKKyAgICAgICAgICAgIEl0ZXJhYmxlPFJhbmtlZFByb3ZpZGVyPENvbnRhaW5lclJlcXVlc3RGaWx0ZXI+PiBnbG9iYWxSZXF1ZXN0RmlsdGVycywKKyAgICAgICAgICAgIExpc3Q8UmFua2VkUHJvdmlkZXI8Q29udGFpbmVyUmVxdWVzdEZpbHRlcj4+IHByZU1hdGNoRmlsdGVycywKKyAgICAgICAgICAgIEl0ZXJhYmxlPFJhbmtlZFByb3ZpZGVyPENvbnRhaW5lclJlc3BvbnNlRmlsdGVyPj4gZ2xvYmFsUmVzcG9uc2VGaWx0ZXJzLAorICAgICAgICAgICAgSXRlcmFibGU8UmFua2VkUHJvdmlkZXI8UmVhZGVySW50ZXJjZXB0b3I+PiBnbG9iYWxSZWFkZXJJbnRlcmNlcHRvcnMsCisgICAgICAgICAgICBJdGVyYWJsZTxSYW5rZWRQcm92aWRlcjxXcml0ZXJJbnRlcmNlcHRvcj4+IGdsb2JhbFdyaXRlckludGVyY2VwdG9ycywKKyAgICAgICAgICAgIEl0ZXJhYmxlPER5bmFtaWNGZWF0dXJlPiBkeW5hbWljRmVhdHVyZXMpIHsKKworICAgICAgICB0aGlzLm5hbWVCb3VuZFJlYWRlckludGVyY2VwdG9ycyA9IG5hbWVCb3VuZFJlYWRlckludGVyY2VwdG9yczsKKyAgICAgICAgdGhpcy5uYW1lQm91bmRSZWFkZXJJbnRlcmNlcHRvcnNJbnZlcnNlID0gbmFtZUJvdW5kUmVhZGVySW50ZXJjZXB0b3JzSW52ZXJzZTsKKyAgICAgICAgdGhpcy5uYW1lQm91bmRSZXF1ZXN0RmlsdGVycyA9IG5hbWVCb3VuZFJlcXVlc3RGaWx0ZXJzOworICAgICAgICB0aGlzLm5hbWVCb3VuZFJlcXVlc3RGaWx0ZXJzSW52ZXJzZSA9IG5hbWVCb3VuZFJlcXVlc3RGaWx0ZXJzSW52ZXJzZTsKKyAgICAgICAgdGhpcy5uYW1lQm91bmRSZXNwb25zZUZpbHRlcnMgPSBuYW1lQm91bmRSZXNwb25zZUZpbHRlcnM7CisgICAgICAgIHRoaXMubmFtZUJvdW5kUmVzcG9uc2VGaWx0ZXJzSW52ZXJzZSA9IG5hbWVCb3VuZFJlc3BvbnNlRmlsdGVyc0ludmVyc2U7CisgICAgICAgIHRoaXMubmFtZUJvdW5kV3JpdGVySW50ZXJjZXB0b3JzID0gbmFtZUJvdW5kV3JpdGVySW50ZXJjZXB0b3JzOworICAgICAgICB0aGlzLm5hbWVCb3VuZFdyaXRlckludGVyY2VwdG9yc0ludmVyc2UgPSBuYW1lQm91bmRXcml0ZXJJbnRlcmNlcHRvcnNJbnZlcnNlOworICAgICAgICB0aGlzLmdsb2JhbFJlcXVlc3RGaWx0ZXJzID0gZ2xvYmFsUmVxdWVzdEZpbHRlcnM7CisgICAgICAgIHRoaXMucHJlTWF0Y2hGaWx0ZXJzID0gcHJlTWF0Y2hGaWx0ZXJzOworICAgICAgICB0aGlzLmdsb2JhbFJlc3BvbnNlRmlsdGVycyA9IGdsb2JhbFJlc3BvbnNlRmlsdGVyczsKKyAgICAgICAgdGhpcy5nbG9iYWxSZWFkZXJJbnRlcmNlcHRvcnMgPSBnbG9iYWxSZWFkZXJJbnRlcmNlcHRvcnM7CisgICAgICAgIHRoaXMuZ2xvYmFsV3JpdGVySW50ZXJjZXB0b3JzID0gZ2xvYmFsV3JpdGVySW50ZXJjZXB0b3JzOworICAgICAgICB0aGlzLmR5bmFtaWNGZWF0dXJlcyA9IGR5bmFtaWNGZWF0dXJlczsKKyAgICAgICAgdGhpcy5zb3J0ZWRHbG9iYWxSZWFkZXJJbnRlcmNlcHRvcnMgPSBQcm92aWRlcnMuc29ydFJhbmtlZFByb3ZpZGVycyhuZXcgUmFua2VkQ29tcGFyYXRvcjw+KCksIGdsb2JhbFJlYWRlckludGVyY2VwdG9ycyk7CisgICAgICAgIHRoaXMuc29ydGVkR2xvYmFsV3JpdGVySW50ZXJjZXB0b3JzID0gUHJvdmlkZXJzLnNvcnRSYW5rZWRQcm92aWRlcnMobmV3IFJhbmtlZENvbXBhcmF0b3I8PigpLCBnbG9iYWxXcml0ZXJJbnRlcmNlcHRvcnMpOworICAgICAgICB0aGlzLnNvcnRlZEdsb2JhbFJlcXVlc3RGaWx0ZXJzID0gUHJvdmlkZXJzLnNvcnRSYW5rZWRQcm92aWRlcnMobmV3IFJhbmtlZENvbXBhcmF0b3I8PigpLCBnbG9iYWxSZXF1ZXN0RmlsdGVycyk7CisgICAgICAgIHRoaXMuc29ydGVkR2xvYmFsUmVzcG9uc2VGaWx0ZXJzID0gUHJvdmlkZXJzLnNvcnRSYW5rZWRQcm92aWRlcnMobmV3IFJhbmtlZENvbXBhcmF0b3I8PigpLCBnbG9iYWxSZXNwb25zZUZpbHRlcnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBuYW1lIGJvdW5kIHJlcXVlc3QgZmlsdGVycy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTmFtZSBib3VuZCB7QGxpbmsgQ29udGFpbmVyUmVxdWVzdEZpbHRlciByZXF1ZXN0IGZpbHRlcn0gbWFwLiBLZXlzIGFyZSByZXF1ZXN0IGZpbHRlcnMgYW5kCisgICAgICogICAgICAgICB2YWx1ZXMgYXJlIHtAbGluayBqYXZheC53cy5ycy5OYW1lQmluZGluZyBuYW1lIGJvdW5kIGFubm90YXRpb25zfSBhdHRhY2hlZCB0byB0aGVzZSBmaWx0ZXJzLgorICAgICAqLworICAgIHB1YmxpYyBNdWx0aXZhbHVlZE1hcDxDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4sIFJhbmtlZFByb3ZpZGVyPENvbnRhaW5lclJlcXVlc3RGaWx0ZXI+PiBnZXROYW1lQm91bmRSZXF1ZXN0RmlsdGVycygpIHsKKyAgICAgICAgcmV0dXJuIG5hbWVCb3VuZFJlcXVlc3RGaWx0ZXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBuYW1lIGJvdW5kIHJlcXVlc3QgZmlsdGVyIGludmVyc2UgbWFwLgorICAgICAqCisgICAgICogQHJldHVybiBOYW1lIGJvdW5kIHtAbGluayBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHJlcXVlc3QgZmlsdGVyfSBtYXAuIEtleXMgYXJlIHJlcXVlc3QgZmlsdGVycyBhbmQKKyAgICAgKiAgICAgICAgIHZhbHVlcyBhcmUge0BsaW5rIGphdmF4LndzLnJzLk5hbWVCaW5kaW5nIG5hbWUgYm91bmQgYW5ub3RhdGlvbnN9IGF0dGFjaGVkIHRvIHRoZXNlIGZpbHRlcnMuCisgICAgICovCisgICAgcHVibGljCisgICAgTXVsdGl2YWx1ZWRNYXA8UmFua2VkUHJvdmlkZXI8Q29udGFpbmVyUmVxdWVzdEZpbHRlcj4sIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPj4gZ2V0TmFtZUJvdW5kUmVxdWVzdEZpbHRlcnNJbnZlcnNlKCkgeworICAgICAgICByZXR1cm4gbmFtZUJvdW5kUmVxdWVzdEZpbHRlcnNJbnZlcnNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBuYW1lIGJvdW5kIHJlc3BvbnNlIGZpbHRlcnMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE5hbWUgYm91bmQge0BsaW5rIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyIHJlc3BvbnNlIGZpbHRlcn0gbWFwLiBLZXlzIGFyZSByZXNwb25zZSBmaWx0ZXJzIGFuZAorICAgICAqICAgICAgICAgdmFsdWVzIGFyZSB7QGxpbmsgamF2YXgud3MucnMuTmFtZUJpbmRpbmcgbmFtZSBib3VuZCBhbm5vdGF0aW9uc30gYXR0YWNoZWQgdG8gdGhlc2UgZmlsdGVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTXVsdGl2YWx1ZWRNYXA8Q2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+LCBSYW5rZWRQcm92aWRlcjxDb250YWluZXJSZXNwb25zZUZpbHRlcj4+IGdldE5hbWVCb3VuZFJlc3BvbnNlRmlsdGVycygpIHsKKyAgICAgICAgcmV0dXJuIG5hbWVCb3VuZFJlc3BvbnNlRmlsdGVyczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgbmFtZSBib3VuZCByZXNwb25zZSBmaWx0ZXIgaW52ZXJzZSBtYXAuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE5hbWUgYm91bmQge0BsaW5rIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIgcmVzcG9uc2UgZmlsdGVyfSBtYXAuIEtleXMgYXJlIHJlc3BvbnNlIGZpbHRlcnMgYW5kCisgICAgICogICAgICAgICB2YWx1ZXMgYXJlIHtAbGluayBqYXZheC53cy5ycy5OYW1lQmluZGluZyBuYW1lIGJvdW5kIGFubm90YXRpb25zfSBhdHRhY2hlZCB0byB0aGVzZSBmaWx0ZXJzLgorICAgICAqLworICAgIHB1YmxpYworICAgIE11bHRpdmFsdWVkTWFwPFJhbmtlZFByb3ZpZGVyPENvbnRhaW5lclJlc3BvbnNlRmlsdGVyPiwgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+PiBnZXROYW1lQm91bmRSZXNwb25zZUZpbHRlcnNJbnZlcnNlKCkgeworICAgICAgICByZXR1cm4gbmFtZUJvdW5kUmVzcG9uc2VGaWx0ZXJzSW52ZXJzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgbmFtZSBib3VuZCByZWFkZXIgaW50ZXJjZXB0b3IgbWFwLgorICAgICAqCisgICAgICogQHJldHVybiBSZXR1cm5zIE5hbWUgYm91bmQge0BsaW5rIFJlYWRlckludGVyY2VwdG9yIHJlYWRlciBpbnRlcmNlcHRvcn0gbWFwLiBLZXlzIGFyZSB7QGxpbmsgamF2YXgud3MucnMuTmFtZUJpbmRpbmcgbmFtZQorICAgICAqICAgICAgICAgYm91bmQgYW5ub3RhdGlvbnN9IGFuZCB2YWx1ZXMgYXJlIHByb3ZpZGVycyB3aGljaCBhcmUgYW5ub3RhdGVkIHdpdGggdGhlc2UgYW5ub3RhdGlvbnMuCisgICAgICovCisgICAgcHVibGljIE11bHRpdmFsdWVkTWFwPENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiwgUmFua2VkUHJvdmlkZXI8UmVhZGVySW50ZXJjZXB0b3I+PiBnZXROYW1lQm91bmRSZWFkZXJJbnRlcmNlcHRvcnMoKSB7CisgICAgICAgIHJldHVybiBuYW1lQm91bmRSZWFkZXJJbnRlcmNlcHRvcnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IG5hbWUgYm91bmQgcmVhZGVyIGludGVyY2VwdG9yIGludmVyc2UgbWFwLgorICAgICAqCisgICAgICogQHJldHVybiBOYW1lIGJvdW5kIHtAbGluayBSZWFkZXJJbnRlcmNlcHRvciByZWFkZXIgaW50ZXJjZXB0b3J9IG1hcC4gS2V5cyBhcmUgcmVhZGVyIGludGVyY2VwdG9ycyBhbmQKKyAgICAgKiAgICAgICAgIHZhbHVlcyBhcmUge0BsaW5rIGphdmF4LndzLnJzLk5hbWVCaW5kaW5nIG5hbWUgYm91bmQgYW5ub3RhdGlvbnN9IGF0dGFjaGVkIHRvIHRoZXNlIGludGVyY2VwdG9ycy4KKyAgICAgKi8KKyAgICBwdWJsaWMKKyAgICBNdWx0aXZhbHVlZE1hcDxSYW5rZWRQcm92aWRlcjxSZWFkZXJJbnRlcmNlcHRvcj4sIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPj4gZ2V0TmFtZUJvdW5kUmVhZGVySW50ZXJjZXB0b3JzSW52ZXJzZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWVCb3VuZFJlYWRlckludGVyY2VwdG9yc0ludmVyc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IG5hbWUgYm91bmQgd3JpdGVyIGludGVyY2VwdG9yIG1hcC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gUmV0dXJucyBOYW1lIGJvdW5kIHtAbGluayBXcml0ZXJJbnRlcmNlcHRvciB3cml0ZXIgaW50ZXJjZXB0b3J9IG1hcC4gS2V5cyBhcmUge0BsaW5rIGphdmF4LndzLnJzLk5hbWVCaW5kaW5nIG5hbWUKKyAgICAgKiAgICAgICAgIGJvdW5kIGFubm90YXRpb25zfSBhbmQgdmFsdWVzIGFyZSBpbnRlcmNlcHRvcnMgd2hpY2ggYXJlIGFubm90YXRlZCB3aXRoIHRoZXNlIGFubm90YXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBNdWx0aXZhbHVlZE1hcDxDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4sIFJhbmtlZFByb3ZpZGVyPFdyaXRlckludGVyY2VwdG9yPj4gZ2V0TmFtZUJvdW5kV3JpdGVySW50ZXJjZXB0b3JzKCkgeworICAgICAgICByZXR1cm4gbmFtZUJvdW5kV3JpdGVySW50ZXJjZXB0b3JzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBuYW1lIGJvdW5kIHdyaXRlciBpbnRlcmNlcHRvciBpbnZlcnNlIG1hcC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTmFtZSBib3VuZCB7QGxpbmsgV3JpdGVySW50ZXJjZXB0b3Igd3JpdGVyIGludGVyY2VwdG9yfSBtYXAuIEtleXMgYXJlIHJlYWRlciBpbnRlcmNlcHRvcnMgYW5kCisgICAgICogICAgICAgICB2YWx1ZXMgYXJlIHtAbGluayBqYXZheC53cy5ycy5OYW1lQmluZGluZyBuYW1lIGJvdW5kIGFubm90YXRpb25zfSBhdHRhY2hlZCB0byB0aGVzZSBpbnRlcmNlcHRvcnMuCisgICAgICovCisgICAgcHVibGljCisgICAgTXVsdGl2YWx1ZWRNYXA8UmFua2VkUHJvdmlkZXI8V3JpdGVySW50ZXJjZXB0b3I+LCBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4+IGdldE5hbWVCb3VuZFdyaXRlckludGVyY2VwdG9yc0ludmVyc2UoKSB7CisgICAgICAgIHJldHVybiBuYW1lQm91bmRXcml0ZXJJbnRlcmNlcHRvcnNJbnZlcnNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBnbG9iYWwgcmVxdWVzdCBmaWx0ZXJzLgorICAgICAqCisgICAgICogQHJldHVybiBHbG9iYWwgcmVxdWVzdCBmaWx0ZXIgcmFua2VkIHByb3ZpZGVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlcmFibGU8UmFua2VkUHJvdmlkZXI8Q29udGFpbmVyUmVxdWVzdEZpbHRlcj4+IGdldEdsb2JhbFJlcXVlc3RGaWx0ZXJzKCkgeworICAgICAgICByZXR1cm4gZ2xvYmFsUmVxdWVzdEZpbHRlcnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGdsb2JhbCByZXNwb25zZSBmaWx0ZXJzLgorICAgICAqCisgICAgICogQHJldHVybiBHbG9iYWwgcmVzcG9uc2UgZmlsdGVyIHJhbmtlZCBwcm92aWRlcnMuCisgICAgICovCisgICAgcHVibGljIEl0ZXJhYmxlPFJhbmtlZFByb3ZpZGVyPENvbnRhaW5lclJlc3BvbnNlRmlsdGVyPj4gZ2V0R2xvYmFsUmVzcG9uc2VGaWx0ZXJzKCkgeworICAgICAgICByZXR1cm4gZ2xvYmFsUmVzcG9uc2VGaWx0ZXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBnbG9iYWwgcmVxdWVzdCBmaWx0ZXJzIHNvcnRlZCBieSBwcmlvcml0eS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gU29ydGVkIGdsb2JhbCByZXF1ZXN0IGZpbHRlcnMuCisgICAgICovCisgICAgcHVibGljIEl0ZXJhYmxlPENvbnRhaW5lclJlcXVlc3RGaWx0ZXI+IGdldFNvcnRlZEdsb2JhbFJlcXVlc3RGaWx0ZXJzKCkgeworICAgICAgICByZXR1cm4gc29ydGVkR2xvYmFsUmVxdWVzdEZpbHRlcnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGdsb2JhbCByZXNwb25zZSBmaWx0ZXJzIHNvcnRlZCBieSBwcmlvcml0eS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gU29ydGVkIGdsb2JhbCByZXNwb25zZSBmaWx0ZXJzLgorICAgICAqLworICAgIHB1YmxpYyBJdGVyYWJsZTxDb250YWluZXJSZXNwb25zZUZpbHRlcj4gZ2V0U29ydGVkR2xvYmFsUmVzcG9uc2VGaWx0ZXJzKCkgeworICAgICAgICByZXR1cm4gc29ydGVkR2xvYmFsUmVzcG9uc2VGaWx0ZXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBnbG9iYWwgcmVhZGVyIGludGVyY2VwdG9ycy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gR2xvYmFsIHJlYWRlciBpbnRlcmNlcHRvcnMgcmFua2VkIHByb3ZpZGVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlcmFibGU8UmFua2VkUHJvdmlkZXI8UmVhZGVySW50ZXJjZXB0b3I+PiBnZXRHbG9iYWxSZWFkZXJJbnRlcmNlcHRvcnMoKSB7CisgICAgICAgIHJldHVybiBnbG9iYWxSZWFkZXJJbnRlcmNlcHRvcnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGdsb2JhbCB3cml0ZXIgaW50ZXJjZXB0b3JzLgorICAgICAqCisgICAgICogQHJldHVybiBHbG9iYWwgd3JpdGVyIGludGVyY2VwdG9ycyByYW5rZWQgcHJvdmlkZXJzLgorICAgICAqLworICAgIHB1YmxpYyBJdGVyYWJsZTxSYW5rZWRQcm92aWRlcjxXcml0ZXJJbnRlcmNlcHRvcj4+IGdldEdsb2JhbFdyaXRlckludGVyY2VwdG9ycygpIHsKKyAgICAgICAgcmV0dXJuIGdsb2JhbFdyaXRlckludGVyY2VwdG9yczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgZ2xvYmFsIHJlYWRlciBpbnRlcmNlcHRvcnMgc29ydGVkIGJ5IHByaW9yaXR5LgorICAgICAqCisgICAgICogQHJldHVybiBHbG9iYWwgcmVhZGVyIGludGVyY2VwdG9ycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlcmFibGU8UmVhZGVySW50ZXJjZXB0b3I+IGdldFNvcnRlZEdsb2JhbFJlYWRlckludGVyY2VwdG9ycygpIHsKKyAgICAgICAgcmV0dXJuIHNvcnRlZEdsb2JhbFJlYWRlckludGVyY2VwdG9yczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgZ2xvYmFsIHdyaXRlciBpbnRlcmNlcHRvcnMgc29ydGVkIGJ5IHByaW9yaXR5LgorICAgICAqCisgICAgICogQHJldHVybiBHbG9iYWwgd3JpdGVyIGludGVyY2VwdG9ycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlcmFibGU8V3JpdGVySW50ZXJjZXB0b3I+IGdldFNvcnRlZEdsb2JhbFdyaXRlckludGVyY2VwdG9ycygpIHsKKyAgICAgICAgcmV0dXJuIHNvcnRlZEdsb2JhbFdyaXRlckludGVyY2VwdG9yczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgZHluYW1pYyBmZWF0dXJlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gRHluYW1pYyBmZWF0dXJlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlcmFibGU8RHluYW1pY0ZlYXR1cmU+IGdldER5bmFtaWNGZWF0dXJlcygpIHsKKyAgICAgICAgcmV0dXJuIGR5bmFtaWNGZWF0dXJlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQge0BsaW5rIGphdmF4LndzLnJzLmNvbnRhaW5lci5QcmVNYXRjaGluZyBwcmUtbWF0Y2hpbmd9IHJlcXVlc3QgZmlsdGVycy4KKyAgICAgKiBAcmV0dXJuIFByZS1tYXRjaGluZyByZXF1ZXN0IGZpbHRlciByYW5rZWQgcHJvdmlkZXJzLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFJhbmtlZFByb3ZpZGVyPENvbnRhaW5lclJlcXVlc3RGaWx0ZXI+PiBnZXRQcmVNYXRjaEZpbHRlcnMoKSB7CisgICAgICAgIHJldHVybiBwcmVNYXRjaEZpbHRlcnM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvUnVudGltZURlbGVnYXRlSW1wbC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvUnVudGltZURlbGVnYXRlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMDA4MGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9SdW50aW1lRGVsZWdhdGVJbXBsLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuQWJzdHJhY3RSdW50aW1lRGVsZWdhdGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5NZXNzYWdpbmdCaW5kZXJzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJGYWN0b3J5OworCisvKioKKyAqIFNlcnZlci1zaWRlIGltcGxlbWVudGF0aW9uIG9mIEpBWC1SUyB7QGxpbmsgamF2YXgud3MucnMuZXh0LlJ1bnRpbWVEZWxlZ2F0ZX0uCisgKiBUaGlzIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgamF2YXgud3MucnMuZXh0LlJ1bnRpbWVEZWxlZ2F0ZX0gZnJvbQorICogamVyc2V5LWNvbW1vbiB3aGljaCBkb2VzIG5vdCBpbXBsZW1lbnQge0BsaW5rICNjcmVhdGVFbmRwb2ludChqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uLCBqYXZhLmxhbmcuQ2xhc3MpfQorICogbWV0aG9kLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIFJ1bnRpbWVEZWxlZ2F0ZUltcGwgZXh0ZW5kcyBBYnN0cmFjdFJ1bnRpbWVEZWxlZ2F0ZSB7CisKKyAgICBwdWJsaWMgUnVudGltZURlbGVnYXRlSW1wbCgpIHsKKyAgICAgICAgc3VwZXIobmV3IE1lc3NhZ2luZ0JpbmRlcnMuSGVhZGVyRGVsZWdhdGVQcm92aWRlcnMoKS5nZXRIZWFkZXJEZWxlZ2F0ZVByb3ZpZGVycygpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFQ+IFQgY3JlYXRlRW5kcG9pbnQoQXBwbGljYXRpb24gYXBwbGljYXRpb24sIENsYXNzPFQ+IGVuZHBvaW50VHlwZSkKKyAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGFwcGxpY2F0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFwcGxpY2F0aW9uIGlzIG51bGwuIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIENvbnRhaW5lckZhY3RvcnkuY3JlYXRlQ29udGFpbmVyKGVuZHBvaW50VHlwZSwgYXBwbGljYXRpb24pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL1NlcnZlclRyYWNlRXZlbnQuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL1NlcnZlclRyYWNlRXZlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDkzNWEwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvU2VydmVyVHJhY2VFdmVudC5qYXZhCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuUHJlTWF0Y2hpbmc7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuRXhjZXB0aW9uTWFwcGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5UcmFjaW5nTG9nZ2VyOworCisvKioKKyAqIFNlcnZlciBzaWRlIHRyYWNpbmcgZXZlbnRzLgorICoKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKiBAc2luY2UgMi4zCisgKi8KK3B1YmxpYyBlbnVtIFNlcnZlclRyYWNlRXZlbnQgaW1wbGVtZW50cyBUcmFjaW5nTG9nZ2VyLkV2ZW50IHsKKyAgICAvKioKKyAgICAgKiBSZXF1ZXN0IHByb2Nlc3Npbmcgc3RhcnRlZC4KKyAgICAgKi8KKyAgICBTVEFSVChUcmFjaW5nTG9nZ2VyLkxldmVsLlNVTU1BUlksICJTVEFSVCIsIG51bGwpLAorICAgIC8qKgorICAgICAqIEFsbCBIVFRQIHJlcXVlc3QgaGVhZGVycy4KKyAgICAgKi8KKyAgICBTVEFSVF9IRUFERVJTKFRyYWNpbmdMb2dnZXIuTGV2ZWwuVkVSQk9TRSwgIlNUQVJUIiwgbnVsbCksCisgICAgLyoqCisgICAgICoge0BsaW5rIFByZU1hdGNoaW5nfSB7QGxpbmsgQ29udGFpbmVyUmVxdWVzdEZpbHRlcn0gaW52b2tlZC4KKyAgICAgKi8KKyAgICBQUkVfTUFUQ0goVHJhY2luZ0xvZ2dlci5MZXZlbC5UUkFDRSwgIlBSRS1NQVRDSCIsICJGaWx0ZXIgYnkgJXMiKSwKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgUHJlTWF0Y2hpbmd9IHtAbGluayBDb250YWluZXJSZXF1ZXN0RmlsdGVyfSBpbnZvY2F0aW9uIHN1bW1hcnkuCisgICAgICovCisgICAgUFJFX01BVENIX1NVTU1BUlkoVHJhY2luZ0xvZ2dlci5MZXZlbC5TVU1NQVJZLCAiUFJFLU1BVENIIiwgIlByZU1hdGNoUmVxdWVzdCBzdW1tYXJ5OiAlcyBmaWx0ZXJzIiksCisgICAgLyoqCisgICAgICogTWF0Y2hpbmcgcGF0aCBwYXR0ZXJuLgorICAgICAqLworICAgIE1BVENIX1BBVEhfRklORChUcmFjaW5nTG9nZ2VyLkxldmVsLlRSQUNFLCAiTUFUQ0giLCAiTWF0Y2hpbmcgcGF0aCBbJXNdIiksCisgICAgLyoqCisgICAgICogUGF0aCBwYXR0ZXJuIG5vdCBtYXRjaGVkLgorICAgICAqLworICAgIE1BVENIX1BBVEhfTk9UX01BVENIRUQoVHJhY2luZ0xvZ2dlci5MZXZlbC5WRVJCT1NFLCAiTUFUQ0giLCAiUGF0dGVybiBbJXNdIGlzIE5PVCBtYXRjaGVkIiksCisgICAgLyoqCisgICAgICogUGF0aCBwYXR0ZXJuIG1hdGNoZWQvc2VsZWN0ZWQuCisgICAgICovCisgICAgTUFUQ0hfUEFUSF9TRUxFQ1RFRChUcmFjaW5nTG9nZ2VyLkxldmVsLlRSQUNFLCAiTUFUQ0giLCAiUGF0dGVybiBbJXNdIElTIHNlbGVjdGVkIiksCisgICAgLyoqCisgICAgICogUGF0aCBwYXR0ZXJuIHNraXBwZWQgYXMgaGlnaGVyLXByaW9yaXR5IHBhdHRlcm4gaGFzIGJlZW4gc2VsZWN0ZWQgYWxyZWFkeS4KKyAgICAgKi8KKyAgICBNQVRDSF9QQVRIX1NLSVBQRUQoVHJhY2luZ0xvZ2dlci5MZXZlbC5WRVJCT1NFLCAiTUFUQ0giLCAiUGF0dGVybiBbJXNdIGlzIHNraXBwZWQiKSwKKyAgICAvKioKKyAgICAgKiBNYXRjaGVkIHN1Yi1yZXNvdXJjZSBsb2NhdG9yIG1ldGhvZC4KKyAgICAgKi8KKyAgICBNQVRDSF9MT0NBVE9SKFRyYWNpbmdMb2dnZXIuTGV2ZWwuVFJBQ0UsICJNQVRDSCIsICJNYXRjaGVkIGxvY2F0b3IgOiAlcyIpLAorICAgIC8qKgorICAgICAqIE1hdGNoZWQgcmVzb3VyY2UgbWV0aG9kLgorICAgICAqLworICAgIE1BVENIX1JFU09VUkNFX01FVEhPRChUcmFjaW5nTG9nZ2VyLkxldmVsLlRSQUNFLCAiTUFUQ0giLCAiTWF0Y2hlZCBtZXRob2QgIDogJXMiKSwKKyAgICAvKioKKyAgICAgKiBNYXRjaGVkIHJ1bnRpbWUgcmVzb3VyY2UuCisgICAgICovCisgICAgTUFUQ0hfUlVOVElNRV9SRVNPVVJDRShUcmFjaW5nTG9nZ2VyLkxldmVsLlRSQUNFLCAiTUFUQ0giLAorICAgICAgICAgICAgIk1hdGNoZWQgcmVzb3VyY2U6IHRlbXBsYXRlPVslc10gcmVnZXhwPVslc10gbWF0Y2hlcz1bJXNdIGZyb209WyVzXSIpLAorICAgIC8qKgorICAgICAqIE1hdGNoZWQgcmVzb3VyY2UgaW5zdGFuY2UuCisgICAgICovCisgICAgTUFUQ0hfUkVTT1VSQ0UoVHJhY2luZ0xvZ2dlci5MZXZlbC5UUkFDRSwgIk1BVENIIiwgIlJlc291cmNlIGluc3RhbmNlOiAlcyIpLAorICAgIC8qKgorICAgICAqIE1hdGNoaW5nIHN1bW1hcnkuCisgICAgICovCisgICAgTUFUQ0hfU1VNTUFSWShUcmFjaW5nTG9nZ2VyLkxldmVsLlNVTU1BUlksICJNQVRDSCIsICJSZXF1ZXN0TWF0Y2hpbmcgc3VtbWFyeSIpLAorICAgIC8qKgorICAgICAqIEdsb2JhbCB7QGxpbmsgQ29udGFpbmVyUmVxdWVzdEZpbHRlcn0gaW52b2tlZC4KKyAgICAgKi8KKyAgICBSRVFVRVNUX0ZJTFRFUihUcmFjaW5nTG9nZ2VyLkxldmVsLlRSQUNFLCAiUkVRLUZJTFRFUiIsICJGaWx0ZXIgYnkgJXMiKSwKKyAgICAvKioKKyAgICAgKiBHbG9iYWwge0BsaW5rIENvbnRhaW5lclJlcXVlc3RGaWx0ZXJ9IGludm9jYXRpb24gc3VtbWFyeS4KKyAgICAgKi8KKyAgICBSRVFVRVNUX0ZJTFRFUl9TVU1NQVJZKFRyYWNpbmdMb2dnZXIuTGV2ZWwuU1VNTUFSWSwgIlJFUS1GSUxURVIiLCAiUmVxdWVzdCBzdW1tYXJ5OiAlcyBmaWx0ZXJzIiksCisgICAgLyoqCisgICAgICogUmVzb3VyY2UgbWV0aG9kIGludm9rZWQuCisgICAgICovCisgICAgTUVUSE9EX0lOVk9LRShUcmFjaW5nTG9nZ2VyLkxldmVsLlNVTU1BUlksICJJTlZPS0UiLCAiUmVzb3VyY2UgJXMgbWV0aG9kPVslc10iKSwKKyAgICAvKioKKyAgICAgKiBSZXNvdXJjZSBtZXRob2QgaW52b2NhdGlvbiByZXN1bHRzIHRvIEpBWC1SUyB7QGxpbmsgUmVzcG9uc2V9LgorICAgICAqLworICAgIERJU1BBVENIX1JFU1BPTlNFKFRyYWNpbmdMb2dnZXIuTGV2ZWwuVFJBQ0UsICJJTlZPS0UiLCAiUmVzcG9uc2U6ICVzIiksCisgICAgLyoqCisgICAgICoge0BsaW5rIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyfSBpbnZva2VkLgorICAgICAqLworICAgIFJFU1BPTlNFX0ZJTFRFUihUcmFjaW5nTG9nZ2VyLkxldmVsLlRSQUNFLCAiUkVTUC1GSUxURVIiLCAiRmlsdGVyIGJ5ICVzIiksCisgICAgLyoqCisgICAgICoge0BsaW5rIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyfSBpbnZvY2F0aW9uIHN1bW1hcnkuCisgICAgICovCisgICAgUkVTUE9OU0VfRklMVEVSX1NVTU1BUlkoVHJhY2luZ0xvZ2dlci5MZXZlbC5TVU1NQVJZLCAiUkVTUC1GSUxURVIiLCAiUmVzcG9uc2Ugc3VtbWFyeTogJXMgZmlsdGVycyIpLAorICAgIC8qKgorICAgICAqIFJlcXVlc3QgcHJvY2Vzc2luZyBmaW5pc2hlZC4KKyAgICAgKi8KKyAgICBGSU5JU0hFRChUcmFjaW5nTG9nZ2VyLkxldmVsLlNVTU1BUlksICJGSU5JU0hFRCIsICJSZXNwb25zZSBzdGF0dXM6ICVzIiksCisgICAgLyoqCisgICAgICoge0BsaW5rIEV4Y2VwdGlvbk1hcHBlcn0gaW52b2tlZC4KKyAgICAgKi8KKyAgICBFWENFUFRJT05fTUFQUElORyhUcmFjaW5nTG9nZ2VyLkxldmVsLlNVTU1BUlksICJFWENFUFRJT04iLCAiRXhjZXB0aW9uIG1hcHBlciAlcyBtYXBzICVzICgnJXMnKSB0byA8JXM+Iik7CisKKyAgICBwcml2YXRlIGZpbmFsIFRyYWNpbmdMb2dnZXIuTGV2ZWwgbGV2ZWw7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY2F0ZWdvcnk7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbWVzc2FnZUZvcm1hdDsKKworICAgIHByaXZhdGUgU2VydmVyVHJhY2VFdmVudChUcmFjaW5nTG9nZ2VyLkxldmVsIGxldmVsLCBTdHJpbmcgY2F0ZWdvcnksIFN0cmluZyBtZXNzYWdlRm9ybWF0KSB7CisgICAgICAgIHRoaXMubGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgdGhpcy5jYXRlZ29yeSA9IGNhdGVnb3J5OworICAgICAgICB0aGlzLm1lc3NhZ2VGb3JtYXQgPSBtZXNzYWdlRm9ybWF0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgY2F0ZWdvcnkoKSB7CisgICAgICAgIHJldHVybiBjYXRlZ29yeTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVHJhY2luZ0xvZ2dlci5MZXZlbCBsZXZlbCgpIHsKKyAgICAgICAgcmV0dXJuIGxldmVsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgbWVzc2FnZUZvcm1hdCgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VGb3JtYXQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L0Fic3RyYWN0UGFyYW1WYWx1ZUV4dHJhY3Rvci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L0Fic3RyYWN0UGFyYW1WYWx1ZUV4dHJhY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNzkyZTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvQWJzdHJhY3RQYXJhbVZhbHVlRXh0cmFjdG9yLmphdmEKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLmluamVjdDsKKworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5QYXJhbUNvbnZlcnRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5FeHRyYWN0b3JFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLlVuc2FmZVZhbHVlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5WYWx1ZXM7CisKKy8qKgorICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgaW1wbGVtZW50aW5nIG11bHRpdmFsdWVkIHBhcmFtZXRlciB2YWx1ZSBleHRyYWN0b3IKKyAqIGxvZ2ljIHN1cHBsaWVkIHVzaW5nIHtAbGluayBQYXJhbUNvbnZlcnRlciBwYXJhbWV0ZXIgY29udmVydGVyc30uCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQYXJhbVZhbHVlRXh0cmFjdG9yPFQ+IHsKKworICAgIHByaXZhdGUgZmluYWwgUGFyYW1Db252ZXJ0ZXI8VD4gcGFyYW1Db252ZXJ0ZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcGFyYW1ldGVyTmFtZTsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBkZWZhdWx0VmFsdWVTdHJpbmc7CisgICAgcHJpdmF0ZSBmaW5hbCBVbnNhZmVWYWx1ZTxULCBSdW50aW1lRXhjZXB0aW9uPiBjb252ZXJ0ZWREZWZhdWx0VmFsdWU7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IGluaXRpYWxpemVzIGNvbW1vbiBzdHJpbmcgcmVhZGVyLWJhc2VkIHBhcmFtZXRlciBleHRyYWN0b3IKKyAgICAgKiBkYXRhLgorICAgICAqIDxwIC8+CisgICAgICogQXMgcGFydCBvZiB0aGUgaW5pdGlhbGl6YXRpb24sIHRoZSBkZWZhdWx0IHZhbHVlIHZhbGlkYXRpb24gaXMgcGVyZm9ybWVkCisgICAgICogYmFzZWQgb24gdGhlIHByZXNlbmNlIGFuZCB2YWx1ZSBvZiB0aGUge0BsaW5rIFBhcmFtQ29udmVydGVyLkxhenl9CisgICAgICogYW5ub3RhdGlvbiBvbiB0aGUgc3VwcGxpZWQgc3RyaW5nIHZhbHVlIHJlYWRlciBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb252ZXJ0ZXIgICAgICAgICAgcGFyYW1ldGVyIGNvbnZlcnRlci4KKyAgICAgKiBAcGFyYW0gcGFyYW1ldGVyTmFtZSAgICAgIG5hbWUgb2YgdGhlIHBhcmFtZXRlci4KKyAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlU3RyaW5nIGRlZmF1bHQgcGFyYW1ldGVyIHZhbHVlIHN0cmluZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQWJzdHJhY3RQYXJhbVZhbHVlRXh0cmFjdG9yKFBhcmFtQ29udmVydGVyPFQ+IGNvbnZlcnRlciwgU3RyaW5nIHBhcmFtZXRlck5hbWUsIGZpbmFsIFN0cmluZyBkZWZhdWx0VmFsdWVTdHJpbmcpIHsKKyAgICAgICAgdGhpcy5wYXJhbUNvbnZlcnRlciA9IGNvbnZlcnRlcjsKKyAgICAgICAgdGhpcy5wYXJhbWV0ZXJOYW1lID0gcGFyYW1ldGVyTmFtZTsKKyAgICAgICAgdGhpcy5kZWZhdWx0VmFsdWVTdHJpbmcgPSBkZWZhdWx0VmFsdWVTdHJpbmc7CisKKworICAgICAgICBpZiAoZGVmYXVsdFZhbHVlU3RyaW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuY29udmVydGVkRGVmYXVsdFZhbHVlID0gVmFsdWVzLmxhenkobmV3IFVuc2FmZVZhbHVlPFQsIFJ1bnRpbWVFeGNlcHRpb24+KCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBUIGdldCgpIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnQoZGVmYXVsdFZhbHVlU3RyaW5nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgaWYgKCFjb252ZXJ0ZXIuZ2V0Q2xhc3MoKS5pc0Fubm90YXRpb25QcmVzZW50KFBhcmFtQ29udmVydGVyLkxhenkuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgLy8gaWdub3JlIHJldHVybiB2YWx1ZSAtIGV4ZWN1dGVkIGp1c3QgZm9yIHZhbGlkYXRpb24gcmVhc29ucworICAgICAgICAgICAgICAgIGNvbnZlcnRlZERlZmF1bHRWYWx1ZS5nZXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnZlcnRlZERlZmF1bHRWYWx1ZSA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciB0aGlzIGV4dHJhY3RvciBiZWxvbmdzIHRvLgorICAgICAqCisgICAgICogQHJldHVybiBwYXJhbWV0ZXIgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBwYXJhbWV0ZXJOYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZGVmYXVsdCBzdHJpbmcgdmFsdWUgb2YgdGhlIHBhcmFtZXRlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gZGVmYXVsdCBwYXJhbWV0ZXIgc3RyaW5nIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlU3RyaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4dHJhY3QgcGFyYW1ldGVyIHZhbHVlIGZyb20gc3RyaW5nIHVzaW5nIHRoZSBjb25maWd1cmVkIHtAbGluayBQYXJhbUNvbnZlcnRlciBwYXJhbWV0ZXIgY29udmVydGVyfS4KKyAgICAgKgorICAgICAqIEEge0BsaW5rIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9ufSB0aHJvd24gZnJvbSB0aGUgY29udmVydGVyIGlzIHByb3BhZ2F0ZWQKKyAgICAgKiB1bmNoYW5nZWQuIEFueSBvdGhlciBleGNlcHRpb24gdGhyb3dzIGJ5IHRoZSBjb252ZXJ0ZXIgaXMgd3JhcHBlZCBpbiBhIG5ldworICAgICAqIHtAbGluayBFeHRyYWN0b3JFeGNlcHRpb259IGJlZm9yZSByZXRocm93aW5nLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIHBhcmFtZXRlciBzdHJpbmcgdmFsdWUgdG8gYmUgY29udmVydGVkL2V4dHJhY3RlZC4KKyAgICAgKiBAcmV0dXJuIGV4dHJhY3RlZCB2YWx1ZSBvZiBhIGdpdmVuIEphdmEgdHlwZS4KKyAgICAgKiBAdGhyb3dzIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIGluIGNhc2UgdGhlIHVuZGVybHlpbmcgcGFyYW1ldGVyIGNvbnZlcnRlciB0aHJvd3MgYSB7QGNvZGUgV2ViQXBwbGljYXRpb25FeGNlcHRpb259LgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBpcyByZXRocm93biB3aXRob3V0IGEgY2hhbmdlLgorICAgICAqIEB0aHJvd3MgRXh0cmFjdG9yRXhjZXB0aW9uICAgICAgd3JhcHBpbmcgYW55IG90aGVyIGV4Y2VwdGlvbiB0aHJvd24gYnkgdGhlIHBhcmFtZXRlciBjb252ZXJ0ZXIuCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIFQgZnJvbVN0cmluZyhTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgVCByZXN1bHQgPSBjb252ZXJ0KHZhbHVlKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwcml2YXRlIFQgY29udmVydChTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBwYXJhbUNvbnZlcnRlci5mcm9tU3RyaW5nKHZhbHVlKTsKKyAgICAgICAgfSBjYXRjaCAoV2ViQXBwbGljYXRpb25FeGNlcHRpb24gd2FlKSB7CisgICAgICAgICAgICB0aHJvdyB3YWU7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKKyAgICAgICAgICAgIHRocm93IGlhZTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXh0cmFjdG9yRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIHRoZXJlIGlzIGEgZGVmYXVsdCBzdHJpbmcgdmFsdWUgcmVnaXN0ZXJlZCBmb3IgdGhlIHBhcmFtZXRlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZXJlIGlzIGEgZGVmYXVsdCBwYXJhbWV0ZXIgc3RyaW5nIHZhbHVlIHJlZ2lzdGVyZWQsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCBib29sZWFuIGlzRGVmYXVsdFZhbHVlUmVnaXN0ZXJlZCgpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZVN0cmluZyAhPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBjb252ZXJ0ZWQgZGVmYXVsdCB2YWx1ZS4KKyAgICAgKgorICAgICAqIFRoZSBjb252ZXJzaW9uIGhhcHBlbnMgbGF6aWx5IGR1cmluZyBmaXJzdCBjYWxsIG9mIHRoZSBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGNvbnZlcnRlZCBkZWZhdWx0IHZhbHVlLgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCBUIGRlZmF1bHRWYWx1ZSgpIHsKKyAgICAgICAgaWYgKCFpc0RlZmF1bHRWYWx1ZVJlZ2lzdGVyZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY29udmVydGVkRGVmYXVsdFZhbHVlLmdldCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9BYnN0cmFjdFZhbHVlUGFyYW1Qcm92aWRlci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L0Fic3RyYWN0VmFsdWVQYXJhbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUzOTVlZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9BYnN0cmFjdFZhbHVlUGFyYW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5pbmplY3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworCitpbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLmludGVybmFsLlZhbHVlUGFyYW1Qcm92aWRlcjsKKworLyoqCisgKiBBIHBhcmFtZXRlciB2YWx1ZSBwcm92aWRlciB0aGF0IHByb3ZpZGVzIHBhcmFtZXRlciB2YWx1ZSBmYWN0b3JpZXMKKyAqIHdoaWNoIGFyZSB1c2luZyB7QGxpbmsgTXVsdGl2YWx1ZWRQYXJhbWV0ZXJFeHRyYWN0b3JQcm92aWRlcn0gdG8gZXh0cmFjdCBwYXJhbWV0ZXIKKyAqIHZhbHVlcyBmcm9tIHRoZSBzdXBwbGllZCB7QGxpbmsgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcCBtdWx0aXZhbHVlZAorICogcGFyYW1ldGVyIG1hcH0uCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VmFsdWVQYXJhbVByb3ZpZGVyIGltcGxlbWVudHMgVmFsdWVQYXJhbVByb3ZpZGVyIHsKKworICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8TXVsdGl2YWx1ZWRQYXJhbWV0ZXJFeHRyYWN0b3JQcm92aWRlcj4gbXBlcDsKKyAgICBwcml2YXRlIGZpbmFsIFNldDxQYXJhbWV0ZXIuU291cmNlPiBjb21wYXRpYmxlU291cmNlczsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgdGhlIHByb3ZpZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIG1wZXAgICAgICAgICAgICAgIG11bHRpdmFsdWVkIG1hcCBwYXJhbWV0ZXIgZXh0cmFjdG9yIHByb3ZpZGVyLgorICAgICAqIEBwYXJhbSBjb21wYXRpYmxlU291cmNlcyBjb21wYXRpYmxlIHBhcmFtZXRlciBzb3VyY2VzLgorICAgICAqLworICAgIHByb3RlY3RlZCBBYnN0cmFjdFZhbHVlUGFyYW1Qcm92aWRlcihQcm92aWRlcjxNdWx0aXZhbHVlZFBhcmFtZXRlckV4dHJhY3RvclByb3ZpZGVyPiBtcGVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXIuU291cmNlLi4uIGNvbXBhdGlibGVTb3VyY2VzKSB7CisgICAgICAgIHRoaXMubXBlcCA9IG1wZXA7CisgICAgICAgIHRoaXMuY29tcGF0aWJsZVNvdXJjZXMgPSBuZXcgSGFzaFNldDw+KEFycmF5cy5hc0xpc3QoY29tcGF0aWJsZVNvdXJjZXMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBwYXJhbWV0ZXIgZXh0cmFjdG9yLgorICAgICAqIFRoZSBleHRyYWN0b3IgcmV0dXJuZWQgZnJvbSB0aGlzIG1ldGhvZCB3aWxsIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZQorICAgICAqIHNldCBvbiB0aGUgcGFyYW1ldGVyLCBpbiBjYXNlIHRoZSBwYXJhbWV0ZXIgaXMgbm90IGZvdW5kIGluIHRoZSBzdXBwbGllZAorICAgICAqIHtAbGluayBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwIG11bHRpdmFsdWVkIHBhcmFtZXRlciBtYXB9LgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmFtZXRlciBwYXJhbWV0ZXIgc3VwcG9ydGVkIGJ5IHRoZSByZXR1cm5lZCBleHRyYWN0b3IuCisgICAgICogQHJldHVybiBleHRyYWN0b3Igc3VwcG9ydGluZyB0aGUgcGFyYW1ldGVyLiBUaGUgcmV0dXJuZWQgaW5zdGFuY2UgaWdub3JlcworICAgICAqIGFueSBkZWZhdWx0IHZhbHVlcyBzZXQgb24gdGhlIHBhcmFtZXRlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgTXVsdGl2YWx1ZWRQYXJhbWV0ZXJFeHRyYWN0b3I8Pz4gZ2V0KFBhcmFtZXRlciBwYXJhbWV0ZXIpIHsKKyAgICAgICAgcmV0dXJuIG1wZXAuZ2V0KCkuZ2V0KHBhcmFtZXRlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgdmFsdWUgcHJvdmlkZXIgZm9yIHRoZSBwYXJhbWV0ZXIuIE1heSByZXR1cm4ge0Bjb2RlIG51bGx9IGluIGNhc2UKKyAgICAgKiB0aGUgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIHZhbHVlIHByb3ZpZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmFtZXRlciAgICAgICBwYXJhbWV0ZXIgcmVxdWVzdGluZyB0aGUgdmFsdWUgcHJvdmlkZXIgaW5zdGFuY2UuCisgICAgICogQHJldHVybiBwYXJhbWV0ZXIgdmFsdWUgc3VwcGxpZXIuIFJldHVybnMge0Bjb2RlIG51bGx9IGlmIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBGdW5jdGlvbjxDb250YWluZXJSZXF1ZXN0LCA/PiBjcmVhdGVWYWx1ZVByb3ZpZGVyKFBhcmFtZXRlciBwYXJhbWV0ZXIpOworCisgICAgLyoqCisgICAgICogR2V0IGFuIGluamVjdGVkIHZhbHVlIHByb3ZpZGVyIGZvciB0aGUgcGFyYW1ldGVyLiBNYXkgcmV0dXJuIHtAY29kZSBudWxsfQorICAgICAqIGluIGNhc2UgdGhlIHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSB2YWx1ZSBwcm92aWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJhbWV0ZXIgcGFyYW1ldGVyIHJlcXVlc3RpbmcgdGhlIHZhbHVlIHByb3ZpZGVyIGluc3RhbmNlLgorICAgICAqIEByZXR1cm4gaW5qZWN0ZWQgcGFyYW1ldGVyIHZhbHVlIHN1cHBsaWVyLiBSZXR1cm5zIHtAY29kZSBudWxsfSBpZiBwYXJhbWV0ZXIKKyAgICAgKiBpcyBub3Qgc3VwcG9ydGVkLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmaW5hbCBGdW5jdGlvbjxDb250YWluZXJSZXF1ZXN0LCA/PiBnZXRWYWx1ZVByb3ZpZGVyKFBhcmFtZXRlciBwYXJhbWV0ZXIpIHsKKyAgICAgICAgaWYgKCFjb21wYXRpYmxlU291cmNlcy5jb250YWlucyhwYXJhbWV0ZXIuZ2V0U291cmNlKCkpKSB7CisgICAgICAgICAgICAvLyBub3QgY29tcGF0aWJsZQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNyZWF0ZVZhbHVlUHJvdmlkZXIocGFyYW1ldGVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUHJpb3JpdHlUeXBlIGdldFByaW9yaXR5KCkgeworICAgICAgICByZXR1cm4gUHJpb3JpdHkuTk9STUFMOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9Bc3luY1Jlc3BvbnNlVmFsdWVQYXJhbVByb3ZpZGVyLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvQXN5bmNSZXNwb25zZVZhbHVlUGFyYW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYjgzNGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvQXN5bmNSZXNwb25zZVZhbHVlUGFyYW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLmluamVjdDsKKworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Bc3luY1Jlc3BvbnNlOworCitpbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFzeW5jQ29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUGFyYW1ldGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuaW50ZXJuYWwuVmFsdWVQYXJhbVByb3ZpZGVyOworCisvKioKKyAqIFZhbHVlIGZhY3RvcnkgcHJvdmlkZXIgc3VwcG9ydGluZyB0aGUge0BsaW5rIGphdmF4LndzLnJzLmNvbnRhaW5lci5TdXNwZW5kZWR9IGluamVjdGlvbiBhbm5vdGF0aW9uLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK2ZpbmFsIGNsYXNzIEFzeW5jUmVzcG9uc2VWYWx1ZVBhcmFtUHJvdmlkZXIgaW1wbGVtZW50cyBWYWx1ZVBhcmFtUHJvdmlkZXIgeworCisgICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxBc3luY0NvbnRleHQ+IGFzeW5jQ29udGV4dFByb3ZpZGVyOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSB0aGUgcHJvdmlkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXN5bmNDb250ZXh0UHJvdmlkZXIgYXN5bmMgcHJvY2Vzc2luZyBjb250ZXh0IHByb3ZpZGVyLgorICAgICAqLworICAgIHB1YmxpYyBBc3luY1Jlc3BvbnNlVmFsdWVQYXJhbVByb3ZpZGVyKFByb3ZpZGVyPEFzeW5jQ29udGV4dD4gYXN5bmNDb250ZXh0UHJvdmlkZXIpIHsKKyAgICAgICAgdGhpcy5hc3luY0NvbnRleHRQcm92aWRlciA9IGFzeW5jQ29udGV4dFByb3ZpZGVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBGdW5jdGlvbjxDb250YWluZXJSZXF1ZXN0LCBBc3luY1Jlc3BvbnNlPiBnZXRWYWx1ZVByb3ZpZGVyKGZpbmFsIFBhcmFtZXRlciBwYXJhbWV0ZXIpIHsKKyAgICAgICAgaWYgKHBhcmFtZXRlci5nZXRTb3VyY2UoKSAhPSBQYXJhbWV0ZXIuU291cmNlLlNVU1BFTkRFRCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFBc3luY1Jlc3BvbnNlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20ocGFyYW1ldGVyLmdldFJhd1R5cGUoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5lclJlcXVlc3QgLT4gYXN5bmNDb250ZXh0UHJvdmlkZXIuZ2V0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFByaW9yaXR5VHlwZSBnZXRQcmlvcml0eSgpIHsKKyAgICAgICAgcmV0dXJuIFByaW9yaXR5Lk5PUk1BTDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvQmVhblBhcmFtVmFsdWVQYXJhbVByb3ZpZGVyLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvQmVhblBhcmFtVmFsdWVQYXJhbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJkMGE3YQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9CZWFuUGFyYW1WYWx1ZVBhcmFtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDkyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5pbmplY3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5CZWFuUGFyYW07CisKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5CaW5kaW5nczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuRm9yZWlnbkRlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLkNhY2hlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWwuUmVxdWVzdFNjb3BlZDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUGFyYW1ldGVyOworCisvKioKKyAqIFZhbHVlIGZhY3RvcnkgcHJvdmlkZXIgZm9yIHtAbGluayBCZWFuUGFyYW0gYmVhbiBwYXJhbWV0ZXJzfS4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK0BTaW5nbGV0b24KK2ZpbmFsIGNsYXNzIEJlYW5QYXJhbVZhbHVlUGFyYW1Qcm92aWRlciBleHRlbmRzIEFic3RyYWN0VmFsdWVQYXJhbVByb3ZpZGVyIHsKKworICAgIHByaXZhdGUgZmluYWwgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgQmVhblBhcmFtVmFsdWVQcm92aWRlciBpbXBsZW1lbnRzIEZ1bmN0aW9uPENvbnRhaW5lclJlcXVlc3QsIE9iamVjdD4geworICAgICAgICBwcml2YXRlIGZpbmFsIFBhcmFtZXRlciBwYXJhbWV0ZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyOworCisgICAgICAgIHByaXZhdGUgZmluYWwgQ2FjaGU8Q2xhc3M8Pz4sIEZvcmVpZ25EZXNjcmlwdG9yPiBkZXNjcmlwdG9yQ2FjaGUKKyAgICAgICAgICAgICAgICA9IG5ldyBDYWNoZTw+KG5ldyBGdW5jdGlvbjxDbGFzczw/PiwgRm9yZWlnbkRlc2NyaXB0b3I+KCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIEZvcmVpZ25EZXNjcmlwdG9yIGFwcGx5KENsYXNzPD8+IGtleSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVsb3cgd2UgbWFrZSBzdXJlIEhLMiBiZWhhdmVzIGFzIGlmIGluamVjdGlvbiBoYXBwZW5zIGludG8gYSByZXF1ZXN0IHNjb3BlZCB0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIHRvIGF2b2lkIGhhdmluZyBwcm94aWVzIGluamVjdGVkIChzZWUgSkVSU0VZLTIzODYpCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgdG91Y2hpbmcgdGhlIGZvbGxvd2luZyBzdGF0ZW1lbnQsIGNoZWNrIEJlYW5QYXJhbU1lbW9yeUxlYWtUZXN0IGZpcnN0IQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluamVjdGlvbk1hbmFnZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZUZvcmVpZ25EZXNjcmlwdG9yKEJpbmRpbmdzLnNlcnZpY2VBc0NvbnRyYWN0KGtleSkuaW4oUmVxdWVzdFNjb3BlZC5jbGFzcykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgcHJpdmF0ZSBCZWFuUGFyYW1WYWx1ZVByb3ZpZGVyKEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciwgUGFyYW1ldGVyIHBhcmFtZXRlcikgeworICAgICAgICAgICAgdGhpcy5pbmplY3Rpb25NYW5hZ2VyID0gaW5qZWN0aW9uTWFuYWdlcjsKKyAgICAgICAgICAgIHRoaXMucGFyYW1ldGVyID0gcGFyYW1ldGVyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPYmplY3QgYXBwbHkoQ29udGFpbmVyUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgICAgICBDbGFzczw/PiByYXdUeXBlID0gcGFyYW1ldGVyLmdldFJhd1R5cGUoKTsKKyAgICAgICAgICAgIE9iamVjdCBmcm9tSGsyID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShyYXdUeXBlKTsKKyAgICAgICAgICAgIGlmIChmcm9tSGsyICE9IG51bGwpIHsgLy8gdGhlIGJlYW4gcGFyYW1ldGVyIHR5cGUgaXMgYWxyZWFkeSBib3VuZCBpbiBISzIsIGxldCdzIGp1c3QgdGFrZSBpdCBmcm9tIHRoZXJlCisgICAgICAgICAgICAgICAgcmV0dXJuIGZyb21IazI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBGb3JlaWduRGVzY3JpcHRvciBmb3JlaWduRGVzY3JpcHRvciA9IGRlc2NyaXB0b3JDYWNoZS5hcHBseShyYXdUeXBlKTsKKyAgICAgICAgICAgIHJldHVybiBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKGZvcmVpZ25EZXNjcmlwdG9yKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgbmV3IGluc3RhbmNlIGluaXRpYWxpemVkIGZyb20gcGFyYW1ldGVycyBpbmplY3RlZCBieSBISzIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbXBlcCAgICAgICAgICAgIG11bHRpdmFsdWVkIHBhcmFtZXRlciBleHRyYWN0b3IgcHJvdmlkZXIuCisgICAgICovCisgICAgcHVibGljIEJlYW5QYXJhbVZhbHVlUGFyYW1Qcm92aWRlcihQcm92aWRlcjxNdWx0aXZhbHVlZFBhcmFtZXRlckV4dHJhY3RvclByb3ZpZGVyPiBtcGVwLAorICAgICAgICAgICAgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyKSB7CisgICAgICAgIHN1cGVyKG1wZXAsIFBhcmFtZXRlci5Tb3VyY2UuQkVBTl9QQVJBTSk7CisgICAgICAgIHRoaXMuaW5qZWN0aW9uTWFuYWdlciA9IGluamVjdGlvbk1hbmFnZXI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEZ1bmN0aW9uPENvbnRhaW5lclJlcXVlc3QsID8+IGNyZWF0ZVZhbHVlUHJvdmlkZXIoUGFyYW1ldGVyIHBhcmFtZXRlcikgeworICAgICAgICByZXR1cm4gbmV3IEJlYW5QYXJhbVZhbHVlUHJvdmlkZXIoaW5qZWN0aW9uTWFuYWdlciwgcGFyYW1ldGVyKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvQ29sbGVjdGlvbkV4dHJhY3Rvci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L0NvbGxlY3Rpb25FeHRyYWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjI4Yjg1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L0NvbGxlY3Rpb25FeHRyYWN0b3IuamF2YQpAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuaW5qZWN0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7CitpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlBhcmFtQ29udmVydGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworCisvKioKKyAqIEV4dHJhY3QgcGFyYW1ldGVyIHZhbHVlIGFzIGEgdHlwZWQgY29sbGVjdGlvbi4KKyAqCisgKiBAcGFyYW0gPFQ+IHBhcmFtZXRlciB2YWx1ZSB0eXBlLgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworYWJzdHJhY3QgY2xhc3MgQ29sbGVjdGlvbkV4dHJhY3RvcjxUPiBleHRlbmRzIEFic3RyYWN0UGFyYW1WYWx1ZUV4dHJhY3RvcjxUPgorICAgICAgICBpbXBsZW1lbnRzIE11bHRpdmFsdWVkUGFyYW1ldGVyRXh0cmFjdG9yPENvbGxlY3Rpb248VD4+IHsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgY29sbGVjdGlvbiBwYXJhbWV0ZXIgZXh0cmFjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnZlcnRlciAgICAgICAgICBwYXJhbWV0ZXIgY29udmVydGVyIHRvIGJlIHVzZWQgdG8gY29udmVydCBwYXJhbWV0ZXIgZnJvbSBhIFN0cmluZy4KKyAgICAgKiBAcGFyYW0gcGFyYW1ldGVyTmFtZSAgICAgIHBhcmFtZXRlciBuYW1lLgorICAgICAqIEBwYXJhbSBkZWZhdWx0U3RyaW5nVmFsdWUgZGVmYXVsdCBwYXJhbWV0ZXIgU3RyaW5nIHZhbHVlLgorICAgICAqLworICAgIHByb3RlY3RlZCBDb2xsZWN0aW9uRXh0cmFjdG9yKGZpbmFsIFBhcmFtQ29udmVydGVyPFQ+IGNvbnZlcnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGFyYW1ldGVyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlKSB7CisgICAgICAgIHN1cGVyKGNvbnZlcnRlciwgcGFyYW1ldGVyTmFtZSwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxUPiBleHRyYWN0KGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKSB7CisgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBzdHJpbmdMaXN0ID0gcGFyYW1ldGVycy5nZXQoZ2V0TmFtZSgpKTsKKworICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPFQ+IHZhbHVlTGlzdCA9IG5ld0NvbGxlY3Rpb24oKTsKKyAgICAgICAgaWYgKHN0cmluZ0xpc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgdiA6IHN0cmluZ0xpc3QpIHsKKyAgICAgICAgICAgICAgICB2YWx1ZUxpc3QuYWRkKGZyb21TdHJpbmcodikpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGlzRGVmYXVsdFZhbHVlUmVnaXN0ZXJlZCgpKSB7CisgICAgICAgICAgICB2YWx1ZUxpc3QuYWRkKGRlZmF1bHRWYWx1ZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB2YWx1ZUxpc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgbmV3IGNvbGxlY3Rpb24gaW5zdGFuY2UgdGhhdCB3aWxsIGJlIHVzZWQgdG8gc3RvcmUgdGhlIGV4dHJhY3RlZCBwYXJhbWV0ZXJzLgorICAgICAqIDxwLz4KKyAgICAgKiBUaGUgbWV0aG9kIGlzIG92ZXJyaWRkZW4gYnkgY29uY3JldGUgaW1wbGVtZW50YXRpb25zIHRvIHJldHVybiBhbiBpbnN0YW5jZQorICAgICAqIG9mIGEgcHJvcGVyIGNvbGxlY3Rpb24gc3ViLXR5cGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGluc3RhbmNlIG9mIGEgcHJvcGVyIGNvbGxlY3Rpb24gc3ViLXR5cGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgQ29sbGVjdGlvbjxUPiBuZXdDb2xsZWN0aW9uKCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBMaXN0VmFsdWVPZjxUPiBleHRlbmRzIENvbGxlY3Rpb25FeHRyYWN0b3I8VD4geworCisgICAgICAgIExpc3RWYWx1ZU9mKGZpbmFsIFBhcmFtQ29udmVydGVyPFQ+IGNvbnZlcnRlciwgZmluYWwgU3RyaW5nIHBhcmFtZXRlciwgZmluYWwgU3RyaW5nIGRlZmF1bHRWYWx1ZVN0cmluZykgeworICAgICAgICAgICAgc3VwZXIoY29udmVydGVyLCBwYXJhbWV0ZXIsIGRlZmF1bHRWYWx1ZVN0cmluZyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIExpc3Q8VD4gbmV3Q29sbGVjdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFNldFZhbHVlT2Y8VD4gZXh0ZW5kcyBDb2xsZWN0aW9uRXh0cmFjdG9yPFQ+IHsKKworICAgICAgICBTZXRWYWx1ZU9mKGZpbmFsIFBhcmFtQ29udmVydGVyPFQ+IGNvbnZlcnRlciwgZmluYWwgU3RyaW5nIHBhcmFtZXRlciwgZmluYWwgU3RyaW5nIGRlZmF1bHRWYWx1ZVN0cmluZykgeworICAgICAgICAgICAgc3VwZXIoY29udmVydGVyLCBwYXJhbWV0ZXIsIGRlZmF1bHRWYWx1ZVN0cmluZyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIFNldDxUPiBuZXdDb2xsZWN0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFNvcnRlZFNldFZhbHVlT2Y8VD4gZXh0ZW5kcyBDb2xsZWN0aW9uRXh0cmFjdG9yPFQ+IHsKKworICAgICAgICBTb3J0ZWRTZXRWYWx1ZU9mKGZpbmFsIFBhcmFtQ29udmVydGVyPFQ+IGNvbnZlcnRlciwgZmluYWwgU3RyaW5nIHBhcmFtZXRlciwgZmluYWwgU3RyaW5nIGRlZmF1bHRWYWx1ZVN0cmluZykgeworICAgICAgICAgICAgc3VwZXIoY29udmVydGVyLCBwYXJhbWV0ZXIsIGRlZmF1bHRWYWx1ZVN0cmluZyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIFNvcnRlZFNldDxUPiBuZXdDb2xsZWN0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBUcmVlU2V0PD4oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIG5ldyB7QGNvZGUgQ29sbGVjdGlvbkV4dHJhY3Rvcn0gaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29sbGVjdGlvblR5cGUgICAgIHJhdyBjb2xsZWN0aW9uIHR5cGUuCisgICAgICogQHBhcmFtIGNvbnZlcnRlciAgICAgICAgICBwYXJhbWV0ZXIgY29udmVydGVyIHRvIGJlIHVzZWQgdG8gY29udmVydCBwYXJhbWV0ZXIgc3RyaW5nIHZhbHVlcyBpbnRvCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgb2YgdGhlIHJlcXVlc3RlZCBKYXZhIHR5cGUuCisgICAgICogQHBhcmFtIHBhcmFtZXRlck5hbWUgICAgICBwYXJhbWV0ZXIgbmFtZS4KKyAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlU3RyaW5nIGRlZmF1bHQgcGFyYW1ldGVyIHN0cmluZyB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gPFQ+ICAgICAgICAgICAgICAgIGNvbnZlcnRlZCBwYXJhbWV0ZXIgSmF2YSB0eXBlLgorICAgICAqIEByZXR1cm4gbmV3IGNvbGxlY3Rpb24gcGFyYW1ldGVyIGV4dHJhY3RvciBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUPiBDb2xsZWN0aW9uRXh0cmFjdG9yIGdldEluc3RhbmNlKGZpbmFsIENsYXNzPD8+IGNvbGxlY3Rpb25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUGFyYW1Db252ZXJ0ZXI8VD4gY29udmVydGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBhcmFtZXRlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGVmYXVsdFZhbHVlU3RyaW5nKSB7CisgICAgICAgIGlmIChMaXN0LmNsYXNzID09IGNvbGxlY3Rpb25UeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IExpc3RWYWx1ZU9mPD4oY29udmVydGVyLCBwYXJhbWV0ZXJOYW1lLCBkZWZhdWx0VmFsdWVTdHJpbmcpOworICAgICAgICB9IGVsc2UgaWYgKFNldC5jbGFzcyA9PSBjb2xsZWN0aW9uVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXRWYWx1ZU9mPD4oY29udmVydGVyLCBwYXJhbWV0ZXJOYW1lLCBkZWZhdWx0VmFsdWVTdHJpbmcpOworICAgICAgICB9IGVsc2UgaWYgKFNvcnRlZFNldC5jbGFzcyA9PSBjb2xsZWN0aW9uVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTb3J0ZWRTZXRWYWx1ZU9mPD4oY29udmVydGVyLCBwYXJhbWV0ZXJOYW1lLCBkZWZhdWx0VmFsdWVTdHJpbmcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuQ09MTEVDVElPTl9FWFRSQUNUT1JfVFlQRV9VTlNVUFBPUlRFRCgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9Db25maWd1cmVkVmFsaWRhdG9yLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvQ29uZmlndXJlZFZhbGlkYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZDJmM2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvQ29uZmlndXJlZFZhbGlkYXRvci5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLmluamVjdDsKKworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRvcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5JbnZvY2FibGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLkNvbnRyYWN0OworCisvKioKKyAqIENvbmZpZ3VyZWQgdmFsaWRhdG9yIGZvciBKZXJzZXkgdmFsaWRhdGlvbiBwdXJwb3Nlcy4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQENvbnRyYWN0CitwdWJsaWMgaW50ZXJmYWNlIENvbmZpZ3VyZWRWYWxpZGF0b3IgZXh0ZW5kcyBWYWxpZGF0b3IgeworCisgICAgLyoqCisgICAgICogVmFsaWRhdGVzIHJlc291cmNlIGNsYXNzIGluc3RhbmNlIGFuZCBpbnB1dCBwYXJhbWV0ZXJzIG9mIHRoZSB7QGNvZGUgbWV0aG9kfS4ge0BsaW5rIENvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb259IHJhaXNlZAorICAgICAqIGZyb20gdGhpcyBtZXRob2Qgc2hvdWxkIGJlIG1hcHBlZCB0byBIVFRQIDQwMCBzdGF0dXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgcmVzb3VyY2UgY2xhc3MgaW5zdGFuY2UuCisgICAgICogQHBhcmFtIHJlc291cmNlTWV0aG9kIGludm9jYWJsZSBjb250YWluaW5nIGhhbmRsaW5nIGFuZCB2YWxpZGF0aW9uIG1ldGhvZHMuCisgICAgICogQHBhcmFtIGFyZ3MgaW5wdXQgbWV0aG9kIHBhcmFtZXRlcnMuCisgICAgICogQHRocm93cyBDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uIGlmIHtAbGluayBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWaW9sYXRpb259IG9jY3VycyAoc2hvdWxkIGJlIG1hcHBlZCB0byBIVFRQCisgICAgICogNDAwIHN0YXR1cykuCisgICAgICovCisgICAgdm9pZCB2YWxpZGF0ZVJlc291cmNlQW5kSW5wdXRQYXJhbXMoZmluYWwgT2JqZWN0IHJlc291cmNlLCBmaW5hbCBJbnZvY2FibGUgcmVzb3VyY2VNZXRob2QsIGZpbmFsIE9iamVjdFtdIGFyZ3MpCisgICAgICAgICAgICB0aHJvd3MgQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFZhbGlkYXRlcyByZXNwb25zZSBpbnN0YW5jZSAvIHJlc3BvbnNlIGVudGl0eSBvZiB0aGUge0Bjb2RlIG1ldGhvZH0uIHtAbGluayBDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9ufSByYWlzZWQKKyAgICAgKiBmcm9tIHRoaXMgbWV0aG9kIHNob3VsZCBiZSBtYXBwZWQgdG8gSFRUUCA1MDAgc3RhdHVzLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlIHJlc291cmNlIGNsYXNzIGluc3RhbmNlLgorICAgICAqIEBwYXJhbSByZXNvdXJjZU1ldGhvZCBpbnZvY2FibGUgY29udGFpbmluZyBoYW5kbGluZyBhbmQgdmFsaWRhdGlvbiBtZXRob2RzLgorICAgICAqIEBwYXJhbSByZXN1bHQgcmVzcG9uc2UgZW50aXR5LgorICAgICAqIEB0aHJvd3MgQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbiBpZiB7QGxpbmsgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmlvbGF0aW9ufSBvY2N1cnMgKHNob3VsZCBiZSBtYXBwZWQgdG8gSFRUUAorICAgICAqIDUwMCBzdGF0dXMpLgorICAgICAqLworICAgIHZvaWQgdmFsaWRhdGVSZXN1bHQoZmluYWwgT2JqZWN0IHJlc291cmNlLCBmaW5hbCBJbnZvY2FibGUgcmVzb3VyY2VNZXRob2QsIGZpbmFsIE9iamVjdCByZXN1bHQpCisgICAgICAgICAgICB0aHJvd3MgQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9Db29raWVQYXJhbVZhbHVlUGFyYW1Qcm92aWRlci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L0Nvb2tpZVBhcmFtVmFsdWVQYXJhbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRkNTYyOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9Db29raWVQYXJhbVZhbHVlUGFyYW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5pbmplY3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvb2tpZVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29va2llOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5FeHRyYWN0b3JFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLk11bHRpdmFsdWVkU3RyaW5nTWFwOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5QYXJhbUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUGFyYW1ldGVyOworCisvKioKKyAqIFZhbHVlIGZhY3RvcnkgcHJvdmlkZXIgc3VwcG9ydGluZyB0aGUge0BsaW5rIENvb2tpZVBhcmFtfSBpbmplY3Rpb24gYW5ub3RhdGlvbi4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitAU2luZ2xldG9uCitmaW5hbCBjbGFzcyBDb29raWVQYXJhbVZhbHVlUGFyYW1Qcm92aWRlciBleHRlbmRzIEFic3RyYWN0VmFsdWVQYXJhbVByb3ZpZGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIENvb2tpZVBhcmFtVmFsdWVQcm92aWRlciBpbXBsZW1lbnRzIEZ1bmN0aW9uPENvbnRhaW5lclJlcXVlc3QsIE9iamVjdD4geworCisgICAgICAgIHByaXZhdGUgZmluYWwgTXVsdGl2YWx1ZWRQYXJhbWV0ZXJFeHRyYWN0b3I8Pz4gZXh0cmFjdG9yOworCisgICAgICAgIENvb2tpZVBhcmFtVmFsdWVQcm92aWRlcihNdWx0aXZhbHVlZFBhcmFtZXRlckV4dHJhY3Rvcjw/PiBleHRyYWN0b3IpIHsKKyAgICAgICAgICAgIHRoaXMuZXh0cmFjdG9yID0gZXh0cmFjdG9yOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPYmplY3QgYXBwbHkoQ29udGFpbmVyUmVxdWVzdCBjb250YWluZXJSZXF1ZXN0KSB7CisgICAgICAgICAgICAvLyBUT0RPOiBjYWNoZT8KKyAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBjb29raWVzID0gbmV3IE11bHRpdmFsdWVkU3RyaW5nTWFwKCk7CisKKyAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgQ29va2llPiBlIDogY29udGFpbmVyUmVxdWVzdC5nZXRDb29raWVzKCkuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgIGNvb2tpZXMucHV0U2luZ2xlKGUuZ2V0S2V5KCksIGUuZ2V0VmFsdWUoKS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXh0cmFjdG9yLmV4dHJhY3QoY29va2llcyk7CisgICAgICAgICAgICB9IGNhdGNoIChFeHRyYWN0b3JFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFyYW1FeGNlcHRpb24uQ29va2llUGFyYW1FeGNlcHRpb24oZXguZ2V0Q2F1c2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3Rvci5nZXROYW1lKCksIGV4dHJhY3Rvci5nZXREZWZhdWx0VmFsdWVTdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBDb29raWVUeXBlUGFyYW1WYWx1ZVByb3ZpZGVyICBpbXBsZW1lbnRzIEZ1bmN0aW9uPENvbnRhaW5lclJlcXVlc3QsIENvb2tpZT4geworCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisKKyAgICAgICAgQ29va2llVHlwZVBhcmFtVmFsdWVQcm92aWRlcihTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ29va2llIGFwcGx5KENvbnRhaW5lclJlcXVlc3QgY29udGFpbmVyUmVxdWVzdCkgeworICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lclJlcXVlc3QuZ2V0Q29va2llcygpLmdldChuYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHtAbGluayBDb29raWVQYXJhbX0gYW5ub3RhdGlvbiB2YWx1ZSBmYWN0b3J5IHByb3ZpZGVyIGluamVjdGlvbiBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtcGVwICAgICAgICAgICAgbXVsdGl2YWx1ZWQgcGFyYW1ldGVyIGV4dHJhY3RvciBwcm92aWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29va2llUGFyYW1WYWx1ZVBhcmFtUHJvdmlkZXIoUHJvdmlkZXI8TXVsdGl2YWx1ZWRQYXJhbWV0ZXJFeHRyYWN0b3JQcm92aWRlcj4gbXBlcCkgeworICAgICAgICBzdXBlcihtcGVwLCBQYXJhbWV0ZXIuU291cmNlLkNPT0tJRSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEZ1bmN0aW9uPENvbnRhaW5lclJlcXVlc3QsID8+IGNyZWF0ZVZhbHVlUHJvdmlkZXIoUGFyYW1ldGVyIHBhcmFtZXRlcikgeworICAgICAgICBTdHJpbmcgcGFyYW1ldGVyTmFtZSA9IHBhcmFtZXRlci5nZXRTb3VyY2VOYW1lKCk7CisgICAgICAgIGlmIChwYXJhbWV0ZXJOYW1lID09IG51bGwgfHwgcGFyYW1ldGVyTmFtZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICAvLyBJbnZhbGlkIGNvb2tpZSBwYXJhbWV0ZXIgbmFtZQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBpZiAocGFyYW1ldGVyLmdldFJhd1R5cGUoKSA9PSBDb29raWUuY2xhc3MpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ29va2llVHlwZVBhcmFtVmFsdWVQcm92aWRlcihwYXJhbWV0ZXJOYW1lKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIE11bHRpdmFsdWVkUGFyYW1ldGVyRXh0cmFjdG9yIGUgPSBnZXQocGFyYW1ldGVyKTsKKyAgICAgICAgICAgIGlmIChlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgQ29va2llUGFyYW1WYWx1ZVByb3ZpZGVyKGUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L0RlbGVnYXRlZEluamVjdGlvblZhbHVlUGFyYW1Qcm92aWRlci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L0RlbGVnYXRlZEluamVjdGlvblZhbHVlUGFyYW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMjAwMWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvRGVsZWdhdGVkSW5qZWN0aW9uVmFsdWVQYXJhbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLmluamVjdDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlBhcmFtZXRlcml6ZWRUeXBlOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQmluZGluZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQmluZGluZ3M7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkNvbnRleHRJbmplY3Rpb25SZXNvbHZlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuRm9yZWlnbkRlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGVlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3RlZUltcGw7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLkNhY2hlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5MYXp5VmFsdWU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5pbnRlcm5hbC5SZXF1ZXN0U2NvcGVkOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5QYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlBhcmFtZXRlci5Tb3VyY2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5pbnRlcm5hbC5WYWx1ZVBhcmFtUHJvdmlkZXI7CisKKy8qKgorICogVmFsdWUgZmFjdG9yeSBwcm92aWRlciB0aGF0IGRlbGVnYXRlcyB0aGUgaW5qZWN0aW9uIHRhcmdldCBsb29rdXAgdG8gdGhlIHVuZGVybHlpbmcgaW5qZWN0aW9uIHByb3ZpZGVyLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAU2luZ2xldG9uCitjbGFzcyBEZWxlZ2F0ZWRJbmplY3Rpb25WYWx1ZVBhcmFtUHJvdmlkZXIgaW1wbGVtZW50cyBWYWx1ZVBhcmFtUHJvdmlkZXIgeworCisgICAgcHJpdmF0ZSBmaW5hbCBMYXp5VmFsdWU8Q29udGV4dEluamVjdGlvblJlc29sdmVyPiByZXNvbHZlcjsKKworICAgIHByaXZhdGUgZmluYWwgRnVuY3Rpb248QmluZGluZywgRm9yZWlnbkRlc2NyaXB0b3I+IGZvcmVpZ25EZXNjcmlwdG9yRmFjdG9yeTsKKworICAgIC8qKgorICAgICAqIEluamVjdGlvbiBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvbHZlciAgICAgICAgICAgICAgICAgY29udGV4dCBpbmplY3Rpb24gcmVzb2x2ZXIuCisgICAgICogQHBhcmFtIGZvcmVpZ25EZXNjcmlwdG9yRmFjdG9yeSBmdW5jdGlvbiB0aGF0IGlzIGFibGUgdG8gY3JlYXRlIGEgbmV3IGZvcmVpZ24gZGVzY3JpcHRvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgRGVsZWdhdGVkSW5qZWN0aW9uVmFsdWVQYXJhbVByb3ZpZGVyKExhenlWYWx1ZTxDb250ZXh0SW5qZWN0aW9uUmVzb2x2ZXI+IHJlc29sdmVyLAorICAgICAgICAgICAgRnVuY3Rpb248QmluZGluZywgRm9yZWlnbkRlc2NyaXB0b3I+IGZvcmVpZ25EZXNjcmlwdG9yRmFjdG9yeSkgeworICAgICAgICB0aGlzLnJlc29sdmVyID0gcmVzb2x2ZXI7CisgICAgICAgIHRoaXMuZm9yZWlnbkRlc2NyaXB0b3JGYWN0b3J5ID0gZm9yZWlnbkRlc2NyaXB0b3JGYWN0b3J5OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBGdW5jdGlvbjxDb250YWluZXJSZXF1ZXN0LCA/PiBnZXRWYWx1ZVByb3ZpZGVyKGZpbmFsIFBhcmFtZXRlciBwYXJhbWV0ZXIpIHsKKyAgICAgICAgU291cmNlIHBhcmFtU291cmNlID0gcGFyYW1ldGVyLmdldFNvdXJjZSgpOworICAgICAgICBpZiAocGFyYW1Tb3VyY2UgPT0gUGFyYW1ldGVyLlNvdXJjZS5DT05URVhUKSB7CisgICAgICAgICAgICByZXR1cm4gY29udGFpbmVyUmVxdWVzdCAtPiByZXNvbHZlci5nZXQoKS5yZXNvbHZlKGdldEluamVjdGVlKHBhcmFtZXRlcikpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBQcmlvcml0eVR5cGUgZ2V0UHJpb3JpdHkoKSB7CisgICAgICAgIHJldHVybiBQcmlvcml0eS5MT1c7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBvYmplY3Qge0BsaW5rIEluamVjdGVlfSBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbmplY3RpbmcgcG9pbnQuIFRoZSBpbmplY3RlZSBjb250YWlucyBiYXNpYyBpbmZvcm1hdGlvbgorICAgICAqIGFib3V0IHRoZSBpbmplY3Rpb24gcG9pbnQgdHlwZXMgYW5kIHtAbGluayBGb3JlaWduRGVzY3JpcHRvcn0gb2YgdGhlIHVuZGVybHlpbmcgREkgcHJvdmlkZXIgdG8gbWFrZSBkZWxlZ2F0ZWQgaW5qZWN0aW9uCisgICAgICogcmVzb2x2ZXIgYXMgc2ltcGxlIGFzIHBvc3NpYmxlLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmFtZXRlciBqZXJzZXktbGlrZSBwYXJhbWV0ZXIgY29ycmVzcG9uZGluZyB0byBvbmUgcmVzb3VyY2UtbWV0aG9kJ3MgcGFyYW1ldGVyLgorICAgICAqIEByZXR1cm4gaW5qZWN0ZWUgaW5zdGFuY2UgYXMgYSBzb3VyY2Ugb2YgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBpbmplY3RpbmcgcG9pbnQuCisgICAgICovCisgICAgcHJpdmF0ZSBJbmplY3RlZSBnZXRJbmplY3RlZShQYXJhbWV0ZXIgcGFyYW1ldGVyKSB7CisgICAgICAgIEluamVjdGVlSW1wbCBpbmplY3RlZSA9IG5ldyBJbmplY3RlZUltcGwoKTsKKyAgICAgICAgaW5qZWN0ZWUuc2V0UmVxdWlyZWRUeXBlKHBhcmFtZXRlci5nZXRUeXBlKCkpOworICAgICAgICBpbmplY3RlZS5zZXRJbmplY3RlZUNsYXNzKHBhcmFtZXRlci5nZXRSYXdUeXBlKCkpOworICAgICAgICBGb3JlaWduRGVzY3JpcHRvciBwcm94eURlc2NyaXB0b3IgPSBkZXNjcmlwdG9yQ2FjaGUuYXBwbHkocGFyYW1ldGVyKTsKKyAgICAgICAgaWYgKHByb3h5RGVzY3JpcHRvciAhPSBudWxsKSB7CisgICAgICAgICAgICBpbmplY3RlZS5zZXRJbmplY3RlZURlc2NyaXB0b3IocHJveHlEZXNjcmlwdG9yKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW5qZWN0ZWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2UgZG8gbm90IHdhbnQgdG8gY3JlYXRlIGEgbmV3IGRlc2NyaXB0b3IgaW5zdGFuY2UgZm9yIGV2ZXJ5IGFuZCBlYWNoIG1ldGhvZCBpbnZvY2F0aW9uLgorICAgICAqIElmIHRoZSB1bmRlcmx5aW5nIERJIGRlc2NyaXB0b3Ige0BsaW5rIEZvcmVpZ25EZXNjcmlwdG9yfSBpcyBhbHJlYWR5IGNyZWF0ZWQgZm9yIHRoZSBnaXZlbiB7QGxpbmsgUGFyYW1ldGVyfSB0aGVuCisgICAgICogdXNlZCB0aGUgYWxyZWFkeSBjcmVhdGVkIGRlc2NyaXB0b3IuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBDYWNoZTxQYXJhbWV0ZXIsIEZvcmVpZ25EZXNjcmlwdG9yPiBkZXNjcmlwdG9yQ2FjaGUgPQorICAgICAgICAgICAgbmV3IENhY2hlPD4ocGFyYW1ldGVyIC0+IHsKKyAgICAgICAgICAgICAgICBDbGFzczw/PiByYXdUeXBlID0gcGFyYW1ldGVyLmdldFJhd1R5cGUoKTsKKyAgICAgICAgICAgICAgICBpZiAocmF3VHlwZS5pc0ludGVyZmFjZSgpICYmICEocGFyYW1ldGVyLmdldFR5cGUoKSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRUeXBlKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlRGVzY3JpcHRvcihyYXdUeXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9KTsKKworICAgIC8qKgorICAgICAqIE1ldGhvZCBpcyBhYmxlIHRvIGNyZWF0ZSBmb3JtIGluY29taW5nIGNsYXNzIGFuZCB7QGxpbmsgQmluZGluZyBqZXJzZXkgZGVzY3JpcHRvcn0gYSB7QGxpbmsgRm9yZWlnbkRlc2NyaXB0b3J9IHdoaWNoIGlzCisgICAgICogcHJvdmlkZWQgYnkgdW5kZXJseWluZyBESSBwcm92aWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGF6eiBjbGFzcyBmcm9tIHdoaWNoIGplcnNleS1saWtlIGRlc2NyaXB0b3IgaXMgY3JlYXRlZC4KKyAgICAgKiBAcmV0dXJuIGZvcmVpZ24gZGVzY3JpcHRvciBvZiB0aGUgdW5kZXJseWluZyBESSBwcm92aWRlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIEZvcmVpZ25EZXNjcmlwdG9yIGNyZWF0ZURlc2NyaXB0b3IoQ2xhc3M8Pz4gY2xhenopIHsKKyAgICAgICAgcmV0dXJuIGZvcmVpZ25EZXNjcmlwdG9yRmFjdG9yeS5hcHBseShCaW5kaW5ncy5zZXJ2aWNlQXNDb250cmFjdChjbGF6eikuaW4oUmVxdWVzdFNjb3BlZC5jbGFzcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9FbnRpdHlQYXJhbVZhbHVlUGFyYW1Qcm92aWRlci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L0VudGl0eVBhcmFtVmFsdWVQYXJhbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVkMzc5ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9FbnRpdHlQYXJhbVZhbHVlUGFyYW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLmluamVjdDsKKworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkJhZFJlcXVlc3RFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVxdWVzdDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlBhcmFtZXRlcjsKKworLyoqCisgKiBQcm92aWRlcyBpbmplY3Rpb24gb2Yge0BsaW5rIFJlcXVlc3R9IGVudGl0eSB2YWx1ZSBvciB7QGxpbmsgUmVxdWVzdH0gaW5zdGFuY2UKKyAqIGl0c2VsZi4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitAU2luZ2xldG9uCitjbGFzcyBFbnRpdHlQYXJhbVZhbHVlUGFyYW1Qcm92aWRlciBleHRlbmRzIEFic3RyYWN0VmFsdWVQYXJhbVByb3ZpZGVyIHsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgbmV3IGluc3RhbmNlIGluaXRpYWxpemVkIHdpdGggcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtcGVwIEluamVjdGVkIG11bHRpdmFsdWVkUGFyYW1ldGVyRXh0cmFjdG9yIHByb3ZpZGVyLgorICAgICAqLworICAgIEVudGl0eVBhcmFtVmFsdWVQYXJhbVByb3ZpZGVyKFByb3ZpZGVyPE11bHRpdmFsdWVkUGFyYW1ldGVyRXh0cmFjdG9yUHJvdmlkZXI+IG1wZXApIHsKKyAgICAgICAgc3VwZXIobXBlcCwgUGFyYW1ldGVyLlNvdXJjZS5FTlRJVFkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBGdW5jdGlvbjxDb250YWluZXJSZXF1ZXN0LCA/PiBjcmVhdGVWYWx1ZVByb3ZpZGVyKFBhcmFtZXRlciBwYXJhbWV0ZXIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFbnRpdHlWYWx1ZVN1cHBsaWVyKHBhcmFtZXRlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRW50aXR5VmFsdWVTdXBwbGllciBpbXBsZW1lbnRzIEZ1bmN0aW9uPENvbnRhaW5lclJlcXVlc3QsIE9iamVjdD4geworCisgICAgICAgIHByaXZhdGUgZmluYWwgUGFyYW1ldGVyIHBhcmFtZXRlcjsKKworICAgICAgICBwdWJsaWMgRW50aXR5VmFsdWVTdXBwbGllcihQYXJhbWV0ZXIgcGFyYW1ldGVyKSB7CisgICAgICAgICAgICB0aGlzLnBhcmFtZXRlciA9IHBhcmFtZXRlcjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0IGFwcGx5KENvbnRhaW5lclJlcXVlc3QgY29udGFpbmVyUmVxdWVzdCkgeworICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gcmF3VHlwZSA9IHBhcmFtZXRlci5nZXRSYXdUeXBlKCk7CisKKyAgICAgICAgICAgIE9iamVjdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICgoUmVxdWVzdC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHJhd1R5cGUpIHx8IENvbnRhaW5lclJlcXVlc3RDb250ZXh0LmNsYXNzLmlzQXNzaWduYWJsZUZyb20ocmF3VHlwZSkpCisgICAgICAgICAgICAgICAgICAgICYmIHJhd1R5cGUuaXNJbnN0YW5jZShjb250YWluZXJSZXF1ZXN0KSkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gY29udGFpbmVyUmVxdWVzdDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBjb250YWluZXJSZXF1ZXN0LnJlYWRFbnRpdHkocmF3VHlwZSwgcGFyYW1ldGVyLmdldFR5cGUoKSwgcGFyYW1ldGVyLmdldEFubm90YXRpb25zKCkpOworICAgICAgICAgICAgICAgIGlmIChyYXdUeXBlLmlzUHJpbWl0aXZlKCkgJiYgdmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihSZXNwb25zZS5zdGF0dXMoUmVzcG9uc2UuU3RhdHVzLkJBRF9SRVFVRVNUKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lbnRpdHkoTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfUFJJTUlUSVZFX1RZUEVfTlVMTCgpKS5idWlsZCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9Gb3JtUGFyYW1WYWx1ZVBhcmFtUHJvdmlkZXIuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9Gb3JtUGFyYW1WYWx1ZVBhcmFtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjQ3NzcxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L0Zvcm1QYXJhbVZhbHVlUGFyYW1Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMjAyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5pbmplY3Q7CisKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkxEZWNvZGVyOworaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkVuY29kZWQ7CitpbXBvcnQgamF2YXgud3MucnMuRm9ybVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Gb3JtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKKworaW1wb3J0IGphdmF4LmluamVjdC5Qcm92aWRlcjsKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkV4dHJhY3RvckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uTnVsbGFibGVNdWx0aXZhbHVlZEhhc2hNYXA7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5NZWRpYVR5cGVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuUmVhZGVyV3JpdGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5QYXJhbUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuSW50ZXJuYWxTZXJ2ZXJQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUGFyYW1ldGVyOworCisvKioKKyAqIFZhbHVlIGZhY3RvcnkgcHJvdmlkZXIgc3VwcG9ydGluZyB0aGUge0BsaW5rIEZvcm1QYXJhbX0gaW5qZWN0aW9uIGFubm90YXRpb24uCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQFNpbmdsZXRvbgorZmluYWwgY2xhc3MgRm9ybVBhcmFtVmFsdWVQYXJhbVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RWYWx1ZVBhcmFtUHJvdmlkZXIgeworCisgICAgLyoqCisgICAgICogSW5qZWN0aW9uIGNvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIG1wZXAgZXh0cmFjdG9yIHByb3ZpZGVyLgorICAgICAqLworICAgIHB1YmxpYyBGb3JtUGFyYW1WYWx1ZVBhcmFtUHJvdmlkZXIoUHJvdmlkZXI8TXVsdGl2YWx1ZWRQYXJhbWV0ZXJFeHRyYWN0b3JQcm92aWRlcj4gbXBlcCkgeworICAgICAgICBzdXBlcihtcGVwLCBQYXJhbWV0ZXIuU291cmNlLkZPUk0pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBGdW5jdGlvbjxDb250YWluZXJSZXF1ZXN0LCA/PiBjcmVhdGVWYWx1ZVByb3ZpZGVyKFBhcmFtZXRlciBwYXJhbWV0ZXIpIHsKKyAgICAgICAgU3RyaW5nIHBhcmFtZXRlck5hbWUgPSBwYXJhbWV0ZXIuZ2V0U291cmNlTmFtZSgpOworCisgICAgICAgIGlmIChwYXJhbWV0ZXJOYW1lID09IG51bGwgfHwgcGFyYW1ldGVyTmFtZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIC8vIEludmFsaWQgcXVlcnkgcGFyYW1ldGVyIG5hbWUKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgTXVsdGl2YWx1ZWRQYXJhbWV0ZXJFeHRyYWN0b3IgZSA9IGdldChwYXJhbWV0ZXIpOworICAgICAgICBpZiAoZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IEZvcm1QYXJhbVZhbHVlUHJvdmlkZXIoZSwgIXBhcmFtZXRlci5pc0VuY29kZWQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgRm9ybVBhcmFtVmFsdWVQcm92aWRlciBpbXBsZW1lbnRzIEZ1bmN0aW9uPENvbnRhaW5lclJlcXVlc3QsIE9iamVjdD4geworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb24gZW5jb2RlZEFubm90YXRpb24gPSBnZXRFbmNvZGVkQW5ub3RhdGlvbigpOworICAgICAgICBwcml2YXRlIGZpbmFsIE11bHRpdmFsdWVkUGFyYW1ldGVyRXh0cmFjdG9yPD8+IGV4dHJhY3RvcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGRlY29kZTsKKworICAgICAgICBGb3JtUGFyYW1WYWx1ZVByb3ZpZGVyKE11bHRpdmFsdWVkUGFyYW1ldGVyRXh0cmFjdG9yPD8+IGV4dHJhY3RvciwgYm9vbGVhbiBkZWNvZGUpIHsKKyAgICAgICAgICAgIHRoaXMuZXh0cmFjdG9yID0gZXh0cmFjdG9yOworICAgICAgICAgICAgdGhpcy5kZWNvZGUgPSBkZWNvZGU7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBGb3JtIGdldENhY2hlZEZvcm0oZmluYWwgQ29udGFpbmVyUmVxdWVzdCByZXF1ZXN0LCBib29sZWFuIGRlY29kZSkgeworICAgICAgICAgICAgcmV0dXJuIChGb3JtKSByZXF1ZXN0LmdldFByb3BlcnR5KGRlY29kZSA/IEludGVybmFsU2VydmVyUHJvcGVydGllcworICAgICAgICAgICAgICAgICAgICAuRk9STV9ERUNPREVEX1BST1BFUlRZIDogSW50ZXJuYWxTZXJ2ZXJQcm9wZXJ0aWVzLkZPUk1fUFJPUEVSVFkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgQ29udGFpbmVyUmVxdWVzdCBlbnN1cmVWYWxpZFJlcXVlc3QoZmluYWwgQ29udGFpbmVyUmVxdWVzdCByZXF1ZXN0KSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0LmdldE1ldGhvZCgpLmVxdWFscygiR0VUIikpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxpemF0aW9uTWVzc2FnZXMuRk9STV9QQVJBTV9NRVRIT0RfRVJST1IoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghTWVkaWFUeXBlcy50eXBlRXF1YWwoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0ZPUk1fVVJMRU5DT0RFRF9UWVBFLCByZXF1ZXN0LmdldE1lZGlhVHlwZSgpKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGl6YXRpb25NZXNzYWdlcy5GT1JNX1BBUkFNX0NPTlRFTlRfVFlQRV9FUlJPUigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXF1ZXN0OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgQW5ub3RhdGlvbiBnZXRFbmNvZGVkQW5ub3RhdGlvbigpIHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogRW5jb2RlZC1hbm5vdGF0ZWQgY2xhc3MuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEBFbmNvZGVkCisgICAgICAgICAgICBmaW5hbCBjbGFzcyBFbmNvZGVkQW5ub3RhdGlvblRlbXAgeworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEVuY29kZWRBbm5vdGF0aW9uVGVtcC5jbGFzcy5nZXRBbm5vdGF0aW9uKEVuY29kZWQuY2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPYmplY3QgYXBwbHkoQ29udGFpbmVyUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgICAgICBGb3JtIGZvcm0gPSBnZXRDYWNoZWRGb3JtKHJlcXVlc3QsIGRlY29kZSk7CisKKyAgICAgICAgICAgIGlmIChmb3JtID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBGb3JtIG90aGVyRm9ybSA9IGdldENhY2hlZEZvcm0ocmVxdWVzdCwgIWRlY29kZSk7CisgICAgICAgICAgICAgICAgaWYgKG90aGVyRm9ybSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcm0gPSBzd2l0Y2hVcmxFbmNvZGluZyhyZXF1ZXN0LCBvdGhlckZvcm0pOworICAgICAgICAgICAgICAgICAgICBjYWNoZUZvcm0ocmVxdWVzdCwgZm9ybSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybSA9IGdldEZvcm0ocmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgIGNhY2hlRm9ybShyZXF1ZXN0LCBmb3JtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3Rvci5leHRyYWN0KGZvcm0uYXNNYXAoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeHRyYWN0b3JFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBQYXJhbUV4Y2VwdGlvbi5Gb3JtUGFyYW1FeGNlcHRpb24oZS5nZXRDYXVzZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdG9yLmdldE5hbWUoKSwgZXh0cmFjdG9yLmdldERlZmF1bHRWYWx1ZVN0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgRm9ybSBzd2l0Y2hVcmxFbmNvZGluZyhmaW5hbCBDb250YWluZXJSZXF1ZXN0IHJlcXVlc3QsIGZpbmFsIEZvcm0gb3RoZXJGb3JtKSB7CisgICAgICAgICAgICBmaW5hbCBTZXQ8TWFwLkVudHJ5PFN0cmluZywgTGlzdDxTdHJpbmc+Pj4gZW50cmllcyA9IG90aGVyRm9ybS5hc01hcCgpLmVudHJ5U2V0KCk7CisKKyAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBmb3JtTWFwID0gbmV3IE51bGxhYmxlTXVsdGl2YWx1ZWRIYXNoTWFwPD4oKTsKKyAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTGlzdDxTdHJpbmc+PiBlbnRyeSA6IGVudHJpZXMpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2hhcnNldE5hbWUgPSBSZWFkZXJXcml0ZXIuZ2V0Q2hhcnNldChNZWRpYVR5cGUudmFsdWVPZigKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0SGVhZGVyU3RyaW5nKEh0dHBIZWFkZXJzLkNPTlRFTlRfVFlQRSkpKS5uYW1lKCk7CisKKyAgICAgICAgICAgICAgICBTdHJpbmcga2V5OworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGtleSA9IGRlY29kZSA/IFVSTERlY29kZXIuZGVjb2RlKGVudHJ5LmdldEtleSgpLCBjaGFyc2V0TmFtZSkgOiBVUkxFbmNvZGVyLmVuY29kZShlbnRyeS5nZXRLZXkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyc2V0TmFtZSk7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgdmFsdWUgOiBlbnRyeS5nZXRWYWx1ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1NYXAuYWRkKGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZSA/IFVSTERlY29kZXIuZGVjb2RlKHZhbHVlLCBjaGFyc2V0TmFtZSkgOiBVUkxFbmNvZGVyLmVuY29kZSh2YWx1ZSwgY2hhcnNldE5hbWUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybU1hcC5hZGQoa2V5LCBudWxsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB1ZWUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfVU5TVVBQT1JURURfRU5DT0RJTkcoY2hhcnNldE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdG9yLmdldE5hbWUoKSksIHVlZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBGb3JtKGZvcm1NYXApOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGNhY2hlRm9ybShmaW5hbCBDb250YWluZXJSZXF1ZXN0IHJlcXVlc3QsIGZpbmFsIEZvcm0gZm9ybSkgeworICAgICAgICAgICAgcmVxdWVzdC5zZXRQcm9wZXJ0eShkZWNvZGUgPyBJbnRlcm5hbFNlcnZlclByb3BlcnRpZXMKKyAgICAgICAgICAgICAgICAgICAgLkZPUk1fREVDT0RFRF9QUk9QRVJUWSA6IEludGVybmFsU2VydmVyUHJvcGVydGllcy5GT1JNX1BST1BFUlRZLCBmb3JtKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgRm9ybSBnZXRGb3JtKGZpbmFsIENvbnRhaW5lclJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEZvcm1QYXJhbWV0ZXJzKGVuc3VyZVZhbGlkUmVxdWVzdChyZXF1ZXN0KSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEZvcm0gZ2V0Rm9ybVBhcmFtZXRlcnMoQ29udGFpbmVyUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgICAgICBpZiAoTWVkaWFUeXBlcy50eXBlRXF1YWwoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0ZPUk1fVVJMRU5DT0RFRF9UWVBFLCByZXF1ZXN0LmdldE1lZGlhVHlwZSgpKSkgeworICAgICAgICAgICAgICAgIHJlcXVlc3QuYnVmZmVyRW50aXR5KCk7CisgICAgICAgICAgICAgICAgRm9ybSBmb3JtOworICAgICAgICAgICAgICAgIGlmIChkZWNvZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybSA9IHJlcXVlc3QucmVhZEVudGl0eShGb3JtLmNsYXNzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMgPSBuZXcgQW5ub3RhdGlvblsxXTsKKyAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnNbMF0gPSBlbmNvZGVkQW5ub3RhdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgZm9ybSA9IHJlcXVlc3QucmVhZEVudGl0eShGb3JtLmNsYXNzLCBhbm5vdGF0aW9ucyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIChmb3JtID09IG51bGwgPyBuZXcgRm9ybSgpIDogZm9ybSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRm9ybSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L0hlYWRlclBhcmFtVmFsdWVQYXJhbVByb3ZpZGVyLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvSGVhZGVyUGFyYW1WYWx1ZVBhcmFtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTkyZDFjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L0hlYWRlclBhcmFtVmFsdWVQYXJhbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuaW5qZWN0OworCitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuSGVhZGVyUGFyYW07CisKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5FeHRyYWN0b3JFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlBhcmFtRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5QYXJhbWV0ZXI7CisKKy8qKgorICogVmFsdWUgc3VwcGxpZXIgcHJvdmlkZXIgc3VwcG9ydGluZyB0aGUge0BsaW5rIEhlYWRlclBhcmFtICYjNjQ7SGVhZGVyUGFyYW19IGluamVjdGlvbiBhbm5vdGF0aW9uLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTaW5nbGV0b24KK2ZpbmFsIGNsYXNzIEhlYWRlclBhcmFtVmFsdWVQYXJhbVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RWYWx1ZVBhcmFtUHJvdmlkZXIgeworCisgICAgLyoqCisgICAgICogSW5qZWN0aW9uIGNvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIG1wZXAgbXVsdGl2YWx1ZWQgbWFwIHBhcmFtZXRlciBleHRyYWN0b3IgcHJvdmlkZXIuCisgICAgICovCisgICAgcHVibGljIEhlYWRlclBhcmFtVmFsdWVQYXJhbVByb3ZpZGVyKFByb3ZpZGVyPE11bHRpdmFsdWVkUGFyYW1ldGVyRXh0cmFjdG9yUHJvdmlkZXI+IG1wZXApIHsKKyAgICAgICAgc3VwZXIobXBlcCwgUGFyYW1ldGVyLlNvdXJjZS5IRUFERVIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBGdW5jdGlvbjxDb250YWluZXJSZXF1ZXN0LCA/PiBjcmVhdGVWYWx1ZVByb3ZpZGVyKFBhcmFtZXRlciBwYXJhbWV0ZXIpIHsKKyAgICAgICAgU3RyaW5nIHBhcmFtZXRlck5hbWUgPSBwYXJhbWV0ZXIuZ2V0U291cmNlTmFtZSgpOworICAgICAgICBpZiAocGFyYW1ldGVyTmFtZSA9PSBudWxsIHx8IHBhcmFtZXRlck5hbWUubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgLy8gSW52YWxpZCBoZWFkZXIgcGFyYW1ldGVyIG5hbWUKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgTXVsdGl2YWx1ZWRQYXJhbWV0ZXJFeHRyYWN0b3IgZSA9IGdldChwYXJhbWV0ZXIpOworICAgICAgICBpZiAoZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgSGVhZGVyUGFyYW1WYWx1ZVByb3ZpZGVyKGUpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEhlYWRlclBhcmFtVmFsdWVQcm92aWRlciBpbXBsZW1lbnRzIEZ1bmN0aW9uPENvbnRhaW5lclJlcXVlc3QsIE9iamVjdD4geworCisgICAgICAgIHByaXZhdGUgZmluYWwgTXVsdGl2YWx1ZWRQYXJhbWV0ZXJFeHRyYWN0b3I8Pz4gZXh0cmFjdG9yOworCisgICAgICAgIEhlYWRlclBhcmFtVmFsdWVQcm92aWRlcihNdWx0aXZhbHVlZFBhcmFtZXRlckV4dHJhY3Rvcjw/PiBleHRyYWN0b3IpIHsKKyAgICAgICAgICAgIHRoaXMuZXh0cmFjdG9yID0gZXh0cmFjdG9yOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPYmplY3QgYXBwbHkoQ29udGFpbmVyUmVxdWVzdCBjb250YWluZXJSZXF1ZXN0KSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBleHRyYWN0b3IuZXh0cmFjdChjb250YWluZXJSZXF1ZXN0LmdldEhlYWRlcnMoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeHRyYWN0b3JFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBQYXJhbUV4Y2VwdGlvbi5IZWFkZXJQYXJhbUV4Y2VwdGlvbihlLmdldENhdXNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0b3IuZ2V0TmFtZSgpLCBleHRyYWN0b3IuZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L01hdHJpeFBhcmFtVmFsdWVQYXJhbVByb3ZpZGVyLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvTWF0cml4UGFyYW1WYWx1ZVBhcmFtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjkyMjU2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L01hdHJpeFBhcmFtVmFsdWVQYXJhbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuaW5qZWN0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuTWF0cml4UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5QYXRoU2VnbWVudDsKKworaW1wb3J0IGphdmF4LmluamVjdC5Qcm92aWRlcjsKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkV4dHJhY3RvckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUGFyYW1FeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlBhcmFtZXRlcjsKKworLyoqCisgKiBWYWx1ZSBzdXBwbGllciBwcm92aWRlciBzdXBwb3J0aW5nIHRoZSB7QGxpbmsgTWF0cml4UGFyYW0gJiM2NDtNYXRyaXhQYXJhbX0gaW5qZWN0aW9uIGFubm90YXRpb24uCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQFNpbmdsZXRvbgorZmluYWwgY2xhc3MgTWF0cml4UGFyYW1WYWx1ZVBhcmFtUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFZhbHVlUGFyYW1Qcm92aWRlciB7CisKKyAgICAvKioKKyAgICAgKiBJbmplY3Rpb24gY29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbXBlcCBtdWx0aXZhbHVlZCBtYXAgcGFyYW1ldGVyIGV4dHJhY3RvciBwcm92aWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWF0cml4UGFyYW1WYWx1ZVBhcmFtUHJvdmlkZXIoUHJvdmlkZXI8TXVsdGl2YWx1ZWRQYXJhbWV0ZXJFeHRyYWN0b3JQcm92aWRlcj4gbXBlcCkgeworICAgICAgICBzdXBlcihtcGVwLCBQYXJhbWV0ZXIuU291cmNlLk1BVFJJWCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEZ1bmN0aW9uPENvbnRhaW5lclJlcXVlc3QsID8+IGNyZWF0ZVZhbHVlUHJvdmlkZXIoUGFyYW1ldGVyIHBhcmFtZXRlcikgeworICAgICAgICBTdHJpbmcgcGFyYW1ldGVyTmFtZSA9IHBhcmFtZXRlci5nZXRTb3VyY2VOYW1lKCk7CisgICAgICAgIGlmIChwYXJhbWV0ZXJOYW1lID09IG51bGwgfHwgcGFyYW1ldGVyTmFtZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICAvLyBJbnZhbGlkIGhlYWRlciBwYXJhbWV0ZXIgbmFtZQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBNdWx0aXZhbHVlZFBhcmFtZXRlckV4dHJhY3RvciBlID0gZ2V0KHBhcmFtZXRlcik7CisgICAgICAgIGlmIChlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ldyBNYXRyaXhQYXJhbVZhbHVlUHJvdmlkZXIoZSwgIXBhcmFtZXRlci5pc0VuY29kZWQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgTWF0cml4UGFyYW1WYWx1ZVByb3ZpZGVyIGltcGxlbWVudHMgRnVuY3Rpb248Q29udGFpbmVyUmVxdWVzdCwgT2JqZWN0PiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBNdWx0aXZhbHVlZFBhcmFtZXRlckV4dHJhY3Rvcjw/PiBleHRyYWN0b3I7CisgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBkZWNvZGU7CisKKyAgICAgICAgTWF0cml4UGFyYW1WYWx1ZVByb3ZpZGVyKE11bHRpdmFsdWVkUGFyYW1ldGVyRXh0cmFjdG9yPD8+IGV4dHJhY3RvciwgYm9vbGVhbiBkZWNvZGUpIHsKKyAgICAgICAgICAgIHRoaXMuZXh0cmFjdG9yID0gZXh0cmFjdG9yOworICAgICAgICAgICAgdGhpcy5kZWNvZGUgPSBkZWNvZGU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE9iamVjdCBhcHBseShDb250YWluZXJSZXF1ZXN0IGNvbnRhaW5lclJlcXVlc3QpIHsKKyAgICAgICAgICAgIExpc3Q8UGF0aFNlZ21lbnQ+IGwgPSBjb250YWluZXJSZXF1ZXN0LmdldFVyaUluZm8oKS5nZXRQYXRoU2VnbWVudHMoZGVjb2RlKTsKKyAgICAgICAgICAgIFBhdGhTZWdtZW50IHAgPSBsLmdldChsLnNpemUoKSAtIDEpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXh0cmFjdG9yLmV4dHJhY3QocC5nZXRNYXRyaXhQYXJhbWV0ZXJzKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoRXh0cmFjdG9yRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFyYW1FeGNlcHRpb24uTWF0cml4UGFyYW1FeGNlcHRpb24oZS5nZXRDYXVzZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdG9yLmdldE5hbWUoKSwgZXh0cmFjdG9yLmdldERlZmF1bHRWYWx1ZVN0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9NdWx0aXZhbHVlZFBhcmFtZXRlckV4dHJhY3Rvci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L011bHRpdmFsdWVkUGFyYW1ldGVyRXh0cmFjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FhMjNmYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9NdWx0aXZhbHVlZFBhcmFtZXRlckV4dHJhY3Rvci5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLmluamVjdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CisKKy8qKgorICogUHJvdmlkZXIgdGhhdCBjb252ZXJ0cyB0aGUgdmFsdWVzIG9mIGFuIGVudHJ5IG9mIGEgZ2l2ZW4ge0BsaW5rICNnZXROYW1lKCkgbmFtZX0KKyAqIGZyb20gdGhlIHN1cHBsaWVkIHtAbGluayBNdWx0aXZhbHVlZE1hcCBtdWx0aXZhbHVlZCBtYXB9IGludG8gYW4gb2JqZWN0IG9mIGEgY3VzdG9tCisgKiBKYXZhIHR5cGUuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGludGVyZmFjZSBNdWx0aXZhbHVlZFBhcmFtZXRlckV4dHJhY3RvcjxUPiB7CisKKyAgICAvKioKKyAgICAgKiBOYW1lIG9mIHRoZSBwYXJhbWV0ZXIgKG1hcCBrZXkpIHRvIGJlIGV4dHJhY3RlZCBmcm9tIHRoZSBzdXBwbGllZAorICAgICAqIHtAbGluayBNdWx0aXZhbHVlZE1hcCBtdWx0aXZhbHVlZCBtYXB9LgorICAgICAqCisgICAgICogQHJldHVybiBuYW1lIG9mIHRoZSBleHRyYWN0ZWQgcGFyYW1ldGVyLgorICAgICAqLworICAgIFN0cmluZyBnZXROYW1lKCk7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGVudHJ5IHZhbHVlIChzdHJpbmcpIHRoYXQgd2lsbCBiZSB1c2VkIGluIGNhc2UgdGhlIGVudHJ5CisgICAgICogaXMgbm90IHByZXNlbnQgaW4gdGhlIHN1cHBsaWVkIHtAbGluayBNdWx0aXZhbHVlZE1hcCBtdWx0aXZhbHVlZCBtYXB9LgorICAgICAqCisgICAgICogQHJldHVybiBkZWZhdWx0IChiYWNrLXVwKSBtYXAgZW50cnkgdmFsdWUuCisgICAgICovCisgICAgU3RyaW5nIGdldERlZmF1bHRWYWx1ZVN0cmluZygpOworCisgICAgLyoqCisgICAgICogRXh0cmFjdCB0aGUgbWFwIGVudHJ5IGlkZW50aWZpZWQgYnkgYSB7QGxpbmsgI2dldE5hbWUoKSBuYW1lfSAoYW5kIHVzaW5nCisgICAgICogdGhlIGNvbmZpZ3VyZWQge0BsaW5rICNnZXREZWZhdWx0VmFsdWVTdHJpbmcoKSBkZWZhdWx0IHZhbHVlfSkgZnJvbQorICAgICAqIHRoZSBzdXBwbGllZCB7QGxpbmsgTXVsdGl2YWx1ZWRNYXAgbXVsdGl2YWx1ZWQgbWFwfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIG11bHRpdmFsdWVkIHBhcmFtZXRlciBtYXAuCisgICAgICogQHJldHVybiBjdXN0b20gSmF2YSB0eXBlIGluc3RhbmNlIHJlcHJlc2VudGluZyB0aGUgZXh0cmFjdGVkIG11bHRpdmFsdWVkCisgICAgICogICAgICAgICBtYXAgZW50cnkuCisgICAgICovCisgICAgVCBleHRyYWN0KE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9NdWx0aXZhbHVlZFBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9NdWx0aXZhbHVlZFBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjM5MDM2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L011bHRpdmFsdWVkUGFyYW1ldGVyRXh0cmFjdG9yRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5pbmplY3Q7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5QYXJhbUNvbnZlcnRlcjsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuRXh0cmFjdG9yRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUmVmbGVjdGlvbkhlbHBlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uQ2xhc3NUeXBlUGFpcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uTGF6eVZhbHVlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUGFyYW1ldGVyOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHtAbGluayBNdWx0aXZhbHVlZFBhcmFtZXRlckV4dHJhY3RvclByb3ZpZGVyfS4gRm9yIGVhY2gKKyAqIHBhcmFtZXRlciwgdGhlIGltcGxlbWVudGF0aW9uIG9idGFpbnMgYSB7QGxpbmsgUGFyYW1Db252ZXJ0ZXIgcGFyYW0gY29udmVydGVyfSBpbnN0YW5jZSB2aWEKKyAqIHtAbGluayBQYXJhbUNvbnZlcnRlckZhY3Rvcnl9IGFuZCBjcmVhdGVzIHRoZSBwcm9wZXIKKyAqIHtAbGluayBNdWx0aXZhbHVlZFBhcmFtZXRlckV4dHJhY3RvciBtdWx0aXZhbHVlZCBwYXJhbWV0ZXIgZXh0cmFjdG9yfS4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitAU2luZ2xldG9uCitmaW5hbCBjbGFzcyBNdWx0aXZhbHVlZFBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkgaW1wbGVtZW50cyBNdWx0aXZhbHVlZFBhcmFtZXRlckV4dHJhY3RvclByb3ZpZGVyIHsKKworICAgIHByaXZhdGUgZmluYWwgTGF6eVZhbHVlPFBhcmFtQ29udmVydGVyRmFjdG9yeT4gcGFyYW1Db252ZXJ0ZXJGYWN0b3J5OworCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyBtdWx0aXZhbHVlZCBtYXAgcGFyYW1ldGVyIGV4dHJhY3RvciBmYWN0b3J5LgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmFtQ29udmVydGVyRmFjdG9yeSBzdHJpbmcgcmVhZGVycyBmYWN0b3J5LgorICAgICAqLworICAgIHB1YmxpYyBNdWx0aXZhbHVlZFBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkoTGF6eVZhbHVlPFBhcmFtQ29udmVydGVyRmFjdG9yeT4gcGFyYW1Db252ZXJ0ZXJGYWN0b3J5KSB7CisgICAgICAgIHRoaXMucGFyYW1Db252ZXJ0ZXJGYWN0b3J5ID0gcGFyYW1Db252ZXJ0ZXJGYWN0b3J5OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNdWx0aXZhbHVlZFBhcmFtZXRlckV4dHJhY3Rvcjw/PiBnZXQoZmluYWwgUGFyYW1ldGVyIHApIHsKKyAgICAgICAgcmV0dXJuIHByb2Nlc3MoCisgICAgICAgICAgICAgICAgcGFyYW1Db252ZXJ0ZXJGYWN0b3J5LmdldCgpLAorICAgICAgICAgICAgICAgIHAuZ2V0RGVmYXVsdFZhbHVlKCksCisgICAgICAgICAgICAgICAgcC5nZXRSYXdUeXBlKCksCisgICAgICAgICAgICAgICAgcC5nZXRUeXBlKCksCisgICAgICAgICAgICAgICAgcC5nZXRBbm5vdGF0aW9ucygpLAorICAgICAgICAgICAgICAgIHAuZ2V0U291cmNlTmFtZSgpKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwcml2YXRlIE11bHRpdmFsdWVkUGFyYW1ldGVyRXh0cmFjdG9yPD8+IHByb2Nlc3MoCisgICAgICAgICAgICBmaW5hbCBQYXJhbUNvbnZlcnRlckZhY3RvcnkgcGFyYW1Db252ZXJ0ZXJGYWN0b3J5LAorICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRlZmF1bHRWYWx1ZSwKKyAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IHJhd1R5cGUsCisgICAgICAgICAgICBmaW5hbCBUeXBlIHR5cGUsCisgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGFyYW1ldGVyTmFtZSkgeworCisgICAgICAgIC8vIFRyeSB0byBmaW5kIGEgY29udmVydGVyIHRoYXQgc3VwcG9ydCByYXdUeXBlIGFuZCB0eXBlIGF0IGZpcnN0LgorICAgICAgICAvLyBFLmcuIGlmIHNvbWVvbmUgd3JpdGVzIGEgY29udmVydGVyIHRoYXQgc3VwcG9ydCBMaXN0PEludGVnZXI+IHRoaXMgYXBwcm9hY2ggc2hvdWxkIHByZWNlZGUgdGhlIG5leHQgb25lLgorICAgICAgICBQYXJhbUNvbnZlcnRlcjw/PiBjb252ZXJ0ZXIgPSBwYXJhbUNvbnZlcnRlckZhY3RvcnkuZ2V0Q29udmVydGVyKHJhd1R5cGUsIHR5cGUsIGFubm90YXRpb25zKTsKKyAgICAgICAgaWYgKGNvbnZlcnRlciAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2luZ2xlVmFsdWVFeHRyYWN0b3IoY29udmVydGVyLCBwYXJhbWV0ZXJOYW1lLCBkZWZhdWx0VmFsdWUpOworICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgRXh0cmFjdG9yRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9QQVJBTUVURVJfVFlQRV9QUk9DRVNTSU5HKHJhd1R5cGUpLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIHJhd1R5cGUgaXMgdGhlIHR5cGUgb2YgdGhlIGNvbGxlY3Rpb24gc3VwcG9ydGVkLgorICAgICAgICBpZiAocmF3VHlwZSA9PSBMaXN0LmNsYXNzIHx8IHJhd1R5cGUgPT0gU2V0LmNsYXNzIHx8IHJhd1R5cGUgPT0gU29ydGVkU2V0LmNsYXNzKSB7CisgICAgICAgICAgICAvLyBHZXQgdGhlIGdlbmVyaWMgdHlwZSBvZiB0aGUgbGlzdC4gSWYgbm9uZSBpcyBmb3VuZCBkZWZhdWx0IHRvIFN0cmluZy4KKyAgICAgICAgICAgIGZpbmFsIExpc3Q8Q2xhc3NUeXBlUGFpcj4gdHlwZVBhaXJzID0gUmVmbGVjdGlvbkhlbHBlci5nZXRUeXBlQXJndW1lbnRBbmRDbGFzcyh0eXBlKTsKKyAgICAgICAgICAgIGZpbmFsIENsYXNzVHlwZVBhaXIgdHlwZVBhaXIgPSAodHlwZVBhaXJzLnNpemUoKSA9PSAxKSA/IHR5cGVQYWlycy5nZXQoMCkgOiBudWxsOworCisgICAgICAgICAgICBpZiAodHlwZVBhaXIgPT0gbnVsbCB8fCB0eXBlUGFpci5yYXdDbGFzcygpID09IFN0cmluZy5jbGFzcykgeworICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmdDb2xsZWN0aW9uRXh0cmFjdG9yLmdldEluc3RhbmNlKHJhd1R5cGUsIHBhcmFtZXRlck5hbWUsIGRlZmF1bHRWYWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvbnZlcnRlciA9IHBhcmFtQ29udmVydGVyRmFjdG9yeS5nZXRDb252ZXJ0ZXIodHlwZVBhaXIucmF3Q2xhc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVQYWlyLnR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25zKTsKKworICAgICAgICAgICAgICAgIGlmIChjb252ZXJ0ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbkV4dHJhY3Rvci5nZXRJbnN0YW5jZShyYXdUeXBlLCBjb252ZXJ0ZXIsIHBhcmFtZXRlck5hbWUsIGRlZmF1bHRWYWx1ZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgRXh0cmFjdG9yRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9QQVJBTUVURVJfVFlQRV9QUk9DRVNTSU5HKHJhd1R5cGUpLCBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayBwcmltaXRpdmUgdHlwZXMuCisgICAgICAgIGlmIChyYXdUeXBlID09IFN0cmluZy5jbGFzcykgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTaW5nbGVTdHJpbmdWYWx1ZUV4dHJhY3RvcihwYXJhbWV0ZXJOYW1lLCBkZWZhdWx0VmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKHJhd1R5cGUgPT0gQ2hhcmFjdGVyLmNsYXNzKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFByaW1pdGl2ZUNoYXJhY3RlckV4dHJhY3RvcihwYXJhbWV0ZXJOYW1lLAorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUsCisgICAgICAgICAgICAgICAgICAgIFByaW1pdGl2ZU1hcHBlci5wcmltaXRpdmVUb0RlZmF1bHRWYWx1ZU1hcC5nZXQocmF3VHlwZSkpOworICAgICAgICB9IGVsc2UgaWYgKHJhd1R5cGUuaXNQcmltaXRpdmUoKSkgeworICAgICAgICAgICAgLy8gQ29udmVydCBwcmltaXRpdmUgdG8gd3JhcHBlciBjbGFzcworICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gd3JhcHBlZFJhdyA9IFByaW1pdGl2ZU1hcHBlci5wcmltaXRpdmVUb0NsYXNzTWFwLmdldChyYXdUeXBlKTsKKyAgICAgICAgICAgIGlmICh3cmFwcGVkUmF3ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyBQcmltaXRpdmUgdHlwZSBub3Qgc3VwcG9ydGVkCisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh3cmFwcGVkUmF3ID09IENoYXJhY3Rlci5jbGFzcykgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJpbWl0aXZlQ2hhcmFjdGVyRXh0cmFjdG9yKHBhcmFtZXRlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBQcmltaXRpdmVNYXBwZXIucHJpbWl0aXZlVG9EZWZhdWx0VmFsdWVNYXAuZ2V0KHdyYXBwZWRSYXcpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHN0YXRpYyB2YWx1ZU9mKFN0cmluZykKKyAgICAgICAgICAgIGZpbmFsIE1ldGhvZCB2YWx1ZU9mID0gQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoUmVmbGVjdGlvbkhlbHBlci5nZXRWYWx1ZU9mU3RyaW5nTWV0aG9kUEEod3JhcHBlZFJhdykpOworICAgICAgICAgICAgaWYgKHZhbHVlT2YgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJpbWl0aXZlVmFsdWVPZkV4dHJhY3Rvcih2YWx1ZU9mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW1pdGl2ZU1hcHBlci5wcmltaXRpdmVUb0RlZmF1bHRWYWx1ZU1hcC5nZXQod3JhcHBlZFJhdykpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLkRFRkFVTFRfQ09VTERfTk9UX1BST0NFU1NfTUVUSE9EKGRlZmF1bHRWYWx1ZSwgdmFsdWVPZikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L011bHRpdmFsdWVkUGFyYW1ldGVyRXh0cmFjdG9yUHJvdmlkZXIuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9NdWx0aXZhbHVlZFBhcmFtZXRlckV4dHJhY3RvclByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y4YjdhZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9NdWx0aXZhbHVlZFBhcmFtZXRlckV4dHJhY3RvclByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuaW5qZWN0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlBhcmFtZXRlcjsKKworLyoqCisgKiBQcm92aWRlciBvZiBtdWx0aXZhbHVlZCBwYXJhbWV0ZXIgZXh0cmFjdG9ycy4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgaW50ZXJmYWNlIE11bHRpdmFsdWVkUGFyYW1ldGVyRXh0cmFjdG9yUHJvdmlkZXIgeworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBleHRyYWN0b3IgY29uZmlndXJlZCB0byBleHRyYWN0IHZhbHVlIG9mIGdpdmVuIHtAbGluayBQYXJhbWV0ZXIgcGFyYW1ldGVyfS4KKyAgICAgKiA8cCAvPgorICAgICAqIElmIHRoZSBkZWZhdWx0IHZhbHVlIGhhcyBiZWVuIHNldCBvbiB0aGUgcGFyYW1ldGVyLCBpdCB3aWxsIGJlIGNvbmZpZ3VyZWQKKyAgICAgKiBpbiB0aGUgZXh0cmFjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmFtZXRlciBzZXJ2ZXIgbW9kZWwgcGFyYW1ldGVyLgorICAgICAqIEByZXR1cm4gZXh0cmFjdG9yIGZvciB0aGUgbWV0aG9kIHBhcmFtZXRlci4KKyAgICAgKi8KKyAgICBNdWx0aXZhbHVlZFBhcmFtZXRlckV4dHJhY3Rvcjw/PiBnZXQoUGFyYW1ldGVyIHBhcmFtZXRlcik7Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvUGFyYW1Db252ZXJ0ZXJDb25maWd1cmF0b3IuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9QYXJhbUNvbnZlcnRlckNvbmZpZ3VyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5Zjk3ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvUGFyYW1Db252ZXJ0ZXJDb25maWd1cmF0b3IuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5pbmplY3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUGFyYW1Db252ZXJ0ZXJQcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkJvb3RzdHJhcEJhZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Cb290c3RyYXBDb25maWd1cmF0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkJpbmRpbmdzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbnN0YW5jZUJpbmRpbmc7CisKKy8qKgorICogQ29uZmlndXJhdG9yIHdoaWNoIGluaXRpYWxpemVzIGFuZCByZWdpc3RlciB7QGxpbmsgUGFyYW1Db252ZXJ0ZXJzLkFnZ3JlZ2F0ZWRQcm92aWRlcn0gaW5zdGFuY2VzIGludG8ge0BsaW5rIEluamVjdGlvbk1hbmFnZXJ9LgorICoKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitwdWJsaWMgY2xhc3MgUGFyYW1Db252ZXJ0ZXJDb25maWd1cmF0b3IgaW1wbGVtZW50cyBCb290c3RyYXBDb25maWd1cmF0b3IgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaW5pdChJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIsIEJvb3RzdHJhcEJhZyBib290c3RyYXBCYWcpIHsKKyAgICAgICAgSW5zdGFuY2VCaW5kaW5nPFBhcmFtQ29udmVydGVycy5BZ2dyZWdhdGVkUHJvdmlkZXI+IGFnZ3JlZ2F0ZWRDb252ZXJ0ZXJzID0KKyAgICAgICAgICAgICAgICBCaW5kaW5ncy5zZXJ2aWNlKG5ldyBQYXJhbUNvbnZlcnRlcnMuQWdncmVnYXRlZFByb3ZpZGVyKCkpCisgICAgICAgICAgICAgICAgICAgIC50byhQYXJhbUNvbnZlcnRlclByb3ZpZGVyLmNsYXNzKTsKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5yZWdpc3RlcihhZ2dyZWdhdGVkQ29udmVydGVycyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L1BhcmFtQ29udmVydGVyRmFjdG9yeS5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L1BhcmFtQ29udmVydGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNTQyMzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvUGFyYW1Db252ZXJ0ZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuaW5qZWN0OworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5QYXJhbUNvbnZlcnRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUGFyYW1Db252ZXJ0ZXJQcm92aWRlcjsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKKy8qKgorICogQW4gYWdncmVnYXRlIHtAbGluayBQYXJhbUNvbnZlcnRlclByb3ZpZGVyIHBhcmFtIGNvbnZlcnRlciBwcm92aWRlcn0gdGhhdCBsb2FkcyBhbGwKKyAqIHRoZSByZWdpc3RlcmVkIHtAbGluayBQYXJhbUNvbnZlcnRlclByb3ZpZGVyfSBpbXBsZW1lbnRhdGlvbnMuCisgKiA8cCAvPgorICogV2hlbiBpbnZva2VkLCB0aGUgcHJvdmlkZXIgaXRlcmF0ZXMgdGhyb3VnaCB0aGUgcmVnaXN0ZXJlZCBpbXBsZW1lbnRhdGlvbnMgdW50aWwKKyAqIGl0IGZpbmRzIHRoZSBmaXJzdCBpbXBsZW1lbnRhdGlvbiB0aGF0IHJldHVybnMgYSBub24tbnVsbCB7QGxpbmsgUGFyYW1Db252ZXJ0ZXIgcGFyYW0gY29udmVydGVyfSwKKyAqIHdoaWNoIGlzIHN1YnNlcXVlbnRseSByZXR1cm5lZCBmcm9tIHRoZSBmYWN0b3J5LiBJbiBjYXNlIG5vIG5vbi1udWxsIHN0cmluZyByZWFkZXIKKyAqIGluc3RhbmNlIGlzIGZvdW5kLCB7QGNvZGUgbnVsbH0gaXMgcmV0dXJuZWQgZnJvbSB0aGUgZmFjdG9yeS4ge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5DdXN0b20gQ3VzdG9tfQorICogcHJvdmlkZXJzIGFyZSBpdGVyYXRlZCBmaXJzdCwgc28gdGhhdCB1c2VyIHJlZ2lzdGVyZWQgcHJvdmlkZXJzIGFyZSBwcmVmZXJyZWQgYWdhaW5zdCBpbnRlcm5hbCBqZXJzZXkgcHJvdmlkZXJzLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK0BTaW5nbGV0b24KK3B1YmxpYyBjbGFzcyBQYXJhbUNvbnZlcnRlckZhY3RvcnkgaW1wbGVtZW50cyBQYXJhbUNvbnZlcnRlclByb3ZpZGVyIHsKKworICAgIHByaXZhdGUgZmluYWwgTGlzdDxQYXJhbUNvbnZlcnRlclByb3ZpZGVyPiBjb252ZXJ0ZXJQcm92aWRlcnM7CisKKyAgICBQYXJhbUNvbnZlcnRlckZhY3RvcnkoU2V0PFBhcmFtQ29udmVydGVyUHJvdmlkZXI+IHByb3ZpZGVycywgU2V0PFBhcmFtQ29udmVydGVyUHJvdmlkZXI+IGN1c3RvbVByb3ZpZGVycykgeworCisgICAgICAgIFNldDxQYXJhbUNvbnZlcnRlclByb3ZpZGVyPiBjb3B5UHJvdmlkZXJzID0gbmV3IEhhc2hTZXQ8Pihwcm92aWRlcnMpOworICAgICAgICBjb252ZXJ0ZXJQcm92aWRlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgY29udmVydGVyUHJvdmlkZXJzLmFkZEFsbChjdXN0b21Qcm92aWRlcnMpOworICAgICAgICBjb3B5UHJvdmlkZXJzLnJlbW92ZUFsbChjdXN0b21Qcm92aWRlcnMpOworICAgICAgICBjb252ZXJ0ZXJQcm92aWRlcnMuYWRkQWxsKGNvcHlQcm92aWRlcnMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gUGFyYW1Db252ZXJ0ZXI8VD4gZ2V0Q29udmVydGVyKENsYXNzPFQ+IHJhd1R5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucykgeworICAgICAgICBmb3IgKFBhcmFtQ29udmVydGVyUHJvdmlkZXIgcHJvdmlkZXIgOiBjb252ZXJ0ZXJQcm92aWRlcnMpIHsKKyAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICAgICAgUGFyYW1Db252ZXJ0ZXI8VD4gY29udmVydGVyID0gcHJvdmlkZXIuZ2V0Q29udmVydGVyKHJhd1R5cGUsIGdlbmVyaWNUeXBlLCBhbm5vdGF0aW9ucyk7CisgICAgICAgICAgICBpZiAoY29udmVydGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydGVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9QYXJhbUNvbnZlcnRlcnMuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9QYXJhbUNvbnZlcnRlcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2FjMTk0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L1BhcmFtQ29udmVydGVycy5qYXZhCkBAIC0wLDAgKzEsMjkwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5pbmplY3Q7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKKworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlBhcmFtQ29udmVydGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5QYXJhbUNvbnZlcnRlclByb3ZpZGVyOworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5FeHRyYWN0b3JFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5SZWZsZWN0aW9uSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuSHR0cERhdGVGb3JtYXQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworCisvKioKKyAqIENvbnRhaW5lciBvZiBzZXZlcmFsIGRpZmZlcmVudCB7QGxpbmsgUGFyYW1Db252ZXJ0ZXJQcm92aWRlciBwYXJhbSBjb252ZXJ0ZXIgcHJvdmlkZXJzfQorICogaW1wbGVtZW50YXRpb25zLiBUaGUgbmVzdGVkIHByb3ZpZGVyIGltcGxlbWVudGF0aW9ucyBlbmNhcHN1bGF0ZSB2YXJpb3VzIGRpZmZlcmVudAorICogc3RyYXRlZ2llcyBvZiBjb25zdHJ1Y3RpbmcgYW4gaW5zdGFuY2UgZnJvbSBhIHtAY29kZSBTdHJpbmd9IHZhbHVlLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTaW5nbGV0b24KK2NsYXNzIFBhcmFtQ29udmVydGVycyB7CisKKyAgICBwcml2YXRlIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBBYnN0cmFjdFN0cmluZ1JlYWRlcjxUPiBpbXBsZW1lbnRzIFBhcmFtQ29udmVydGVyPFQ+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFQgZnJvbVN0cmluZyhmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5NRVRIT0RfUEFSQU1FVEVSX0NBTk5PVF9CRV9OVUxMKCJ2YWx1ZSIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9mcm9tU3RyaW5nKHZhbHVlKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAvLyBpZiB0aGUgdmFsdWUgaXMgYW4gZW1wdHkgc3RyaW5nLCByZXR1cm4gbnVsbAorICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsIFRocm93YWJsZSBjYXVzZSA9IGV4LmdldENhdXNlKCk7CisgICAgICAgICAgICAgICAgaWYgKGNhdXNlIGluc3RhbmNlb2YgV2ViQXBwbGljYXRpb25FeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKSBjYXVzZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXh0cmFjdG9yRXhjZXB0aW9uKGNhdXNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbihleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgVCBfZnJvbVN0cmluZyhTdHJpbmcgdmFsdWUpIHRocm93cyBFeGNlcHRpb247CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoZmluYWwgVCB2YWx1ZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuTUVUSE9EX1BBUkFNRVRFUl9DQU5OT1RfQkVfTlVMTCgidmFsdWUiKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvdmlkZXIgb2Yge0BsaW5rIFBhcmFtQ29udmVydGVyIHBhcmFtIGNvbnZlcnRlcn0gdGhhdCBwcm9kdWNlIHRoZSB0YXJnZXQgSmF2YSB0eXBlIGluc3RhbmNlCisgICAgICogYnkgaW52b2tpbmcgYSBzaW5nbGUge0Bjb2RlIFN0cmluZ30gcGFyYW1ldGVyIGNvbnN0cnVjdG9yIG9uIHRoZSB0YXJnZXQgdHlwZS4KKyAgICAgKi8KKyAgICBAU2luZ2xldG9uCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdHJpbmdDb25zdHJ1Y3RvciBpbXBsZW1lbnRzIFBhcmFtQ29udmVydGVyUHJvdmlkZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgPFQ+IFBhcmFtQ29udmVydGVyPFQ+IGdldENvbnZlcnRlcihmaW5hbCBDbGFzczxUPiByYXdUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMpIHsKKworICAgICAgICAgICAgZmluYWwgQ29uc3RydWN0b3IgY29uc3RydWN0b3IgPSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChSZWZsZWN0aW9uSGVscGVyLmdldFN0cmluZ0NvbnN0cnVjdG9yUEEocmF3VHlwZSkpOworCisgICAgICAgICAgICByZXR1cm4gKGNvbnN0cnVjdG9yID09IG51bGwpID8gbnVsbCA6IG5ldyBBYnN0cmFjdFN0cmluZ1JlYWRlcjxUPigpIHsKKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHByb3RlY3RlZCBUIF9mcm9tU3RyaW5nKGZpbmFsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByYXdUeXBlLmNhc3QoY29uc3RydWN0b3IubmV3SW5zdGFuY2UodmFsdWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlciBvZiB7QGxpbmsgUGFyYW1Db252ZXJ0ZXIgcGFyYW0gY29udmVydGVyfSB0aGF0IHByb2R1Y2UgdGhlIHRhcmdldCBKYXZhIHR5cGUgaW5zdGFuY2UKKyAgICAgKiBieSBpbnZva2luZyBhIHN0YXRpYyB7QGNvZGUgdmFsdWVPZihTdHJpbmcpfSBtZXRob2Qgb24gdGhlIHRhcmdldCB0eXBlLgorICAgICAqLworICAgIEBTaW5nbGV0b24KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFR5cGVWYWx1ZU9mIGltcGxlbWVudHMgUGFyYW1Db252ZXJ0ZXJQcm92aWRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyA8VD4gUGFyYW1Db252ZXJ0ZXI8VD4gZ2V0Q29udmVydGVyKGZpbmFsIENsYXNzPFQ+IHJhd1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucykgeworCisgICAgICAgICAgICBmaW5hbCBNZXRob2QgdmFsdWVPZiA9IEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKFJlZmxlY3Rpb25IZWxwZXIuZ2V0VmFsdWVPZlN0cmluZ01ldGhvZFBBKHJhd1R5cGUpKTsKKworICAgICAgICAgICAgcmV0dXJuICh2YWx1ZU9mID09IG51bGwpID8gbnVsbCA6IG5ldyBBYnN0cmFjdFN0cmluZ1JlYWRlcjxUPigpIHsKKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBUIF9mcm9tU3RyaW5nKGZpbmFsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByYXdUeXBlLmNhc3QodmFsdWVPZi5pbnZva2UobnVsbCwgdmFsdWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvdmlkZXIgb2Yge0BsaW5rIFBhcmFtQ29udmVydGVyIHBhcmFtIGNvbnZlcnRlcn0gdGhhdCBwcm9kdWNlIHRoZSB0YXJnZXQgSmF2YSB0eXBlIGluc3RhbmNlCisgICAgICogYnkgaW52b2tpbmcgYSBzdGF0aWMge0Bjb2RlIGZyb21TdHJpbmcoU3RyaW5nKX0gbWV0aG9kIG9uIHRoZSB0YXJnZXQgdHlwZS4KKyAgICAgKi8KKyAgICBAU2luZ2xldG9uCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUeXBlRnJvbVN0cmluZyBpbXBsZW1lbnRzIFBhcmFtQ29udmVydGVyUHJvdmlkZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgPFQ+IFBhcmFtQ29udmVydGVyPFQ+IGdldENvbnZlcnRlcihmaW5hbCBDbGFzczxUPiByYXdUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMpIHsKKworICAgICAgICAgICAgZmluYWwgTWV0aG9kIGZyb21TdHJpbmdNZXRob2QgPSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChSZWZsZWN0aW9uSGVscGVyLmdldEZyb21TdHJpbmdTdHJpbmdNZXRob2RQQShyYXdUeXBlKSk7CisKKyAgICAgICAgICAgIHJldHVybiAoZnJvbVN0cmluZ01ldGhvZCA9PSBudWxsKSA/IG51bGwgOiBuZXcgQWJzdHJhY3RTdHJpbmdSZWFkZXI8VD4oKSB7CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgVCBfZnJvbVN0cmluZyhmaW5hbCBTdHJpbmcgdmFsdWUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmF3VHlwZS5jYXN0KGZyb21TdHJpbmdNZXRob2QuaW52b2tlKG51bGwsIHZhbHVlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFByb3ZpZGVyIG9mIHtAbGluayBQYXJhbUNvbnZlcnRlciBwYXJhbSBjb252ZXJ0ZXJ9IHRoYXQgcHJvZHVjZSB0aGUgdGFyZ2V0IEphdmEge0BsaW5rIEVudW0gZW51bX0gdHlwZSBpbnN0YW5jZQorICAgICAqIGJ5IGludm9raW5nIGEgc3RhdGljIHtAY29kZSBmcm9tU3RyaW5nKFN0cmluZyl9IG1ldGhvZCBvbiB0aGUgdGFyZ2V0IGVudW0gdHlwZS4KKyAgICAgKi8KKyAgICBAU2luZ2xldG9uCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUeXBlRnJvbVN0cmluZ0VudW0gZXh0ZW5kcyBUeXBlRnJvbVN0cmluZyB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyA8VD4gUGFyYW1Db252ZXJ0ZXI8VD4gZ2V0Q29udmVydGVyKGZpbmFsIENsYXNzPFQ+IHJhd1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucykgeworICAgICAgICAgICAgcmV0dXJuICghRW51bS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHJhd1R5cGUpKSA/IG51bGwgOiBzdXBlci5nZXRDb252ZXJ0ZXIocmF3VHlwZSwgZ2VuZXJpY1R5cGUsIGFubm90YXRpb25zKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBTaW5nbGV0b24KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENoYXJhY3RlclByb3ZpZGVyIGltcGxlbWVudHMgUGFyYW1Db252ZXJ0ZXJQcm92aWRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyA8VD4gUGFyYW1Db252ZXJ0ZXI8VD4gZ2V0Q29udmVydGVyKGZpbmFsIENsYXNzPFQ+IHJhd1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucykgeworICAgICAgICAgICAgaWYgKHJhd1R5cGUuZXF1YWxzKENoYXJhY3Rlci5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBhcmFtQ29udmVydGVyPFQ+KCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIFQgZnJvbVN0cmluZyhTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuTUVUSE9EX1BBUkFNRVRFUl9DQU5OT1RfQkVfTlVMTCgidmFsdWUiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGgoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJhd1R5cGUuY2FzdCh2YWx1ZS5jaGFyQXQoMCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXh0cmFjdG9yRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX1BBUkFNRVRFUl9JTlZBTElEX0NIQVJfVkFMVUUodmFsdWUpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKFQgdmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5NRVRIT0RfUEFSQU1FVEVSX0NBTk5PVF9CRV9OVUxMKCJ2YWx1ZSIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlciBvZiB7QGxpbmsgUGFyYW1Db252ZXJ0ZXIgcGFyYW0gY29udmVydGVyfSB0aGF0IGNvbnZlcnQgdGhlIHN1cHBsaWVkIHN0cmluZyBpbnRvIGEgSmF2YQorICAgICAqIHtAbGluayBEYXRlfSBpbnN0YW5jZSB1c2luZyBjb252ZXJzaW9uIG1ldGhvZCBmcm9tIHRoZQorICAgICAqIHtAbGluayBIdHRwRGF0ZUZvcm1hdCBodHRwIGRhdGUgZm9ybWF0dGVyfSB1dGlsaXR5IGNsYXNzLgorICAgICAqLworICAgIEBTaW5nbGV0b24KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERhdGVQcm92aWRlciBpbXBsZW1lbnRzIFBhcmFtQ29udmVydGVyUHJvdmlkZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgPFQ+IFBhcmFtQ29udmVydGVyPFQ+IGdldENvbnZlcnRlcihmaW5hbCBDbGFzczxUPiByYXdUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgICAgIHJldHVybiAocmF3VHlwZSAhPSBEYXRlLmNsYXNzKSA/IG51bGwgOiBuZXcgUGFyYW1Db252ZXJ0ZXI8VD4oKSB7CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgVCBmcm9tU3RyaW5nKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5NRVRIT0RfUEFSQU1FVEVSX0NBTk5PVF9CRV9OVUxMKCJ2YWx1ZSIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJhd1R5cGUuY2FzdChIdHRwRGF0ZUZvcm1hdC5yZWFkRGF0ZSh2YWx1ZSkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBQYXJzZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4dHJhY3RvckV4Y2VwdGlvbihleCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGZpbmFsIFQgdmFsdWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5NRVRIT0RfUEFSQU1FVEVSX0NBTk5PVF9CRV9OVUxMKCJ2YWx1ZSIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWdncmVnYXRlZCB7QGxpbmsgUGFyYW1Db252ZXJ0ZXJQcm92aWRlciBwYXJhbSBjb252ZXJ0ZXIgcHJvdmlkZXJ9LgorICAgICAqLworICAgIEBTaW5nbGV0b24KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFnZ3JlZ2F0ZWRQcm92aWRlciBpbXBsZW1lbnRzIFBhcmFtQ29udmVydGVyUHJvdmlkZXIgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgUGFyYW1Db252ZXJ0ZXJQcm92aWRlcltdIHByb3ZpZGVyczsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIG5ldyBhZ2dyZWdhdGVkIHtAbGluayBQYXJhbUNvbnZlcnRlclByb3ZpZGVyIHBhcmFtIGNvbnZlcnRlciBwcm92aWRlcn0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQWdncmVnYXRlZFByb3ZpZGVyKCkgeworICAgICAgICAgICAgcHJvdmlkZXJzID0gbmV3IFBhcmFtQ29udmVydGVyUHJvdmlkZXJbXSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG9yZGVyaW5nIGlzIGltcG9ydGFudCAoZS5nLiBEYXRlIHByb3ZpZGVyIG11c3QgYmUgZXhlY3V0ZWQgYmVmb3JlIFN0cmluZyBDb25zdHJ1Y3RvcgorICAgICAgICAgICAgICAgICAgICAvLyBhcyBEYXRlIGhhcyBhIGRlcHJlY2F0ZWQgU3RyaW5nIGNvbnN0cnVjdG9yCisgICAgICAgICAgICAgICAgICAgIG5ldyBEYXRlUHJvdmlkZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFR5cGVGcm9tU3RyaW5nRW51bSgpLAorICAgICAgICAgICAgICAgICAgICBuZXcgVHlwZVZhbHVlT2YoKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENoYXJhY3RlclByb3ZpZGVyKCksCisgICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlRnJvbVN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICBuZXcgU3RyaW5nQ29uc3RydWN0b3IoKQorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgPFQ+IFBhcmFtQ29udmVydGVyPFQ+IGdldENvbnZlcnRlcihmaW5hbCBDbGFzczxUPiByYXdUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgICAgIGZvciAoZmluYWwgUGFyYW1Db252ZXJ0ZXJQcm92aWRlciBwIDogcHJvdmlkZXJzKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpdGVyYXRpb24gdHJvdWdoIHByb3ZpZGVycyBpcyBpbXBvcnRhbnQuIEl0IGNhbid0IGJlIHJlcGxhY2VkIGJ5IGp1c3QgcmVnaXN0ZXJpbmcgYWxsIHRoZSBpbnRlcm5hbAorICAgICAgICAgICAgICAgIC8vIHByb3ZpZGVycyBvZiB0aGlzIGNsYXNzLiBVc2luZyBpdGVyYXRpb24gdHJvdWdoIGFycmF5IHRoZSBjb3JyZWN0IG9yZGVyaW5nIG9mIHByb3ZpZGVycyBpcyBlbnN1cmVkIChzZWUKKyAgICAgICAgICAgICAgICAvLyBqYXZhZG9jIG9mIFBhdGhQYXJhbSwgSGVhZGVyUGFyYW0sIC4uLiAtIHRoZXJlIGlzIGRlZmluZWQgYSBmaXhlZCBvcmRlciBvZiBjb25zdHJ1Y3Rpbmcgb2JqZWN0cyBmb3JtIFN0cmluZ3MpLgorICAgICAgICAgICAgICAgIGZpbmFsIFBhcmFtQ29udmVydGVyPFQ+IHJlYWRlciA9IHAuZ2V0Q29udmVydGVyKHJhd1R5cGUsIGdlbmVyaWNUeXBlLCBhbm5vdGF0aW9ucyk7CisgICAgICAgICAgICAgICAgaWYgKHJlYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWFkZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvUGFyYW1FeHRyYWN0b3JDb25maWd1cmF0b3IuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9QYXJhbUV4dHJhY3RvckNvbmZpZ3VyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNTZmODgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvUGFyYW1FeHRyYWN0b3JDb25maWd1cmF0b3IuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5pbmplY3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUGFyYW1Db252ZXJ0ZXJQcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkJvb3RzdHJhcEJhZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Cb290c3RyYXBDb25maWd1cmF0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkJpbmRpbmdzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5Qcm92aWRlcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLkxhenlWYWx1ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uVmFsdWU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLlZhbHVlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyQm9vdHN0cmFwQmFnOworCisvKioKKyAqIENvbmZpZ3VyYXRvciB3aGljaCBpbml0aWFsaXplcyBhbmQgcmVnaXN0ZXIge0BsaW5rIE11bHRpdmFsdWVkUGFyYW1ldGVyRXh0cmFjdG9yUHJvdmlkZXJ9IGluc3RhbmNlIGludG8KKyAqIHtAbGluayBJbmplY3Rpb25NYW5hZ2VyfS4KKyAqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworcHVibGljIGNsYXNzIFBhcmFtRXh0cmFjdG9yQ29uZmlndXJhdG9yIGltcGxlbWVudHMgQm9vdHN0cmFwQ29uZmlndXJhdG9yIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGluaXQoSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyLCBCb290c3RyYXBCYWcgYm9vdHN0cmFwQmFnKSB7CisgICAgICAgIFNlcnZlckJvb3RzdHJhcEJhZyBzZXJ2ZXJCYWcgPSAoU2VydmVyQm9vdHN0cmFwQmFnKSBib290c3RyYXBCYWc7CisKKyAgICAgICAgLy8gUGFyYW0gQ29udmVydGVycyBtdXN0IGJlIGluaXRpYWxpemVkIExhenkgYW5kIGNyZWF0ZWQgYXQgdGhlIHRpbWUgb2YgdGhlIGNhbGwgb24gZXh0cmFjdG9yCisgICAgICAgIExhenlWYWx1ZTxQYXJhbUNvbnZlcnRlckZhY3Rvcnk+IGxhenlQYXJhbUNvbnZlcnRlckZhY3RvcnkgPQorICAgICAgICAgICAgICAgIFZhbHVlcy5sYXp5KChWYWx1ZTxQYXJhbUNvbnZlcnRlckZhY3Rvcnk+KSAoKSAtPiBuZXcgUGFyYW1Db252ZXJ0ZXJGYWN0b3J5KAorICAgICAgICAgICAgICAgICAgICAgICAgUHJvdmlkZXJzLmdldFByb3ZpZGVycyhpbmplY3Rpb25NYW5hZ2VyLCBQYXJhbUNvbnZlcnRlclByb3ZpZGVyLmNsYXNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFByb3ZpZGVycy5nZXRDdXN0b21Qcm92aWRlcnMoaW5qZWN0aW9uTWFuYWdlciwgUGFyYW1Db252ZXJ0ZXJQcm92aWRlci5jbGFzcykpKTsKKworICAgICAgICBNdWx0aXZhbHVlZFBhcmFtZXRlckV4dHJhY3RvckZhY3RvcnkgbXVsdGlFeHRyYWN0b3IgPSBuZXcgTXVsdGl2YWx1ZWRQYXJhbWV0ZXJFeHRyYWN0b3JGYWN0b3J5KGxhenlQYXJhbUNvbnZlcnRlckZhY3RvcnkpOworICAgICAgICBzZXJ2ZXJCYWcuc2V0TXVsdGl2YWx1ZWRQYXJhbWV0ZXJFeHRyYWN0b3JQcm92aWRlcihtdWx0aUV4dHJhY3Rvcik7CisgICAgICAgIGluamVjdGlvbk1hbmFnZXIucmVnaXN0ZXIoCisgICAgICAgICAgICAgICAgQmluZGluZ3Muc2VydmljZShtdWx0aUV4dHJhY3RvcikKKyAgICAgICAgICAgICAgICAgICAgICAgIC50byhNdWx0aXZhbHVlZFBhcmFtZXRlckV4dHJhY3RvclByb3ZpZGVyLmNsYXNzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L1BhcmFtSW5qZWN0aW9uUmVzb2x2ZXIuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9QYXJhbUluamVjdGlvblJlc29sdmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRkYjA4OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9QYXJhbUluamVjdGlvblJlc29sdmVyLmphdmEKQEAgLTAsMCArMSwxNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLmluamVjdDsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQW5ub3RhdGVkRWxlbWVudDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOworCitpbXBvcnQgamF2YXgud3MucnMuRW5jb2RlZDsKKworaW1wb3J0IGphdmF4LmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3RlZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uUmVzb2x2ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5SZWZsZWN0aW9uSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5QYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5pbnRlcm5hbC5WYWx1ZVBhcmFtUHJvdmlkZXI7CisKKy8qKgorICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgcmVzb2x2aW5nIEpBWC1SUyB7QGNvZGUgJiM2NDtYeHhQYXJhbX0gaW5qZWN0aW9uLgorICoKKyAqIEBwYXJhbSA8QT4gc3VwcG9ydGVkIHBhcmFtZXRlciBpbmplY3Rpb24gYW5ub3RhdGlvbi4KKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBQYXJhbUluamVjdGlvblJlc29sdmVyPEEgZXh0ZW5kcyBBbm5vdGF0aW9uPiBpbXBsZW1lbnRzIEluamVjdGlvblJlc29sdmVyPEE+IHsKKworICAgIHByaXZhdGUgZmluYWwgVmFsdWVQYXJhbVByb3ZpZGVyIHZhbHVlUGFyYW1Qcm92aWRlcjsKKyAgICBwcml2YXRlIGZpbmFsIENsYXNzPEE+IGFubm90YXRpb247CisgICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxDb250YWluZXJSZXF1ZXN0PiByZXF1ZXN0OworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSB0aGUgYmFzZSBwYXJhbWV0ZXIgaW5qZWN0aW9uIHJlc29sdmVyLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlUGFyYW1Qcm92aWRlciBwYXJhbWV0ZXIgdmFsdWUgc3VwcGxpZXIgcHJvdmlkZXIuCisgICAgICovCisgICAgcHVibGljIFBhcmFtSW5qZWN0aW9uUmVzb2x2ZXIoVmFsdWVQYXJhbVByb3ZpZGVyIHZhbHVlUGFyYW1Qcm92aWRlciwgQ2xhc3M8QT4gYW5ub3RhdGlvbiwKKyAgICAgICAgICAgIFByb3ZpZGVyPENvbnRhaW5lclJlcXVlc3Q+IHJlcXVlc3QpIHsKKyAgICAgICAgdGhpcy52YWx1ZVBhcmFtUHJvdmlkZXIgPSB2YWx1ZVBhcmFtUHJvdmlkZXI7CisgICAgICAgIHRoaXMuYW5ub3RhdGlvbiA9IGFubm90YXRpb247CisgICAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIE9iamVjdCByZXNvbHZlKEluamVjdGVlIGluamVjdGVlKSB7CisgICAgICAgIEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkID0gaW5qZWN0ZWUuZ2V0UGFyZW50KCk7CisgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9uczsKKyAgICAgICAgaWYgKGFubm90YXRlZC5nZXRDbGFzcygpLmVxdWFscyhDb25zdHJ1Y3Rvci5jbGFzcykpIHsKKyAgICAgICAgICAgIGFubm90YXRpb25zID0gKChDb25zdHJ1Y3RvcikgYW5ub3RhdGVkKS5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucygpW2luamVjdGVlLmdldFBvc2l0aW9uKCldOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYW5ub3RhdGlvbnMgPSBhbm5vdGF0ZWQuZ2V0RGVjbGFyZWRBbm5vdGF0aW9ucygpOworICAgICAgICB9CisKKyAgICAgICAgQ2xhc3MgY29tcG9uZW50Q2xhc3MgPSBpbmplY3RlZS5nZXRJbmplY3RlZUNsYXNzKCk7CisgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUgPSBpbmplY3RlZS5nZXRSZXF1aXJlZFR5cGUoKTsKKworICAgICAgICBmaW5hbCBUeXBlIHRhcmdldEdlbmVyaWNUeXBlOworICAgICAgICBpZiAoaW5qZWN0ZWUuaXNGYWN0b3J5KCkpIHsKKyAgICAgICAgICAgIHRhcmdldEdlbmVyaWNUeXBlID0gUmVmbGVjdGlvbkhlbHBlci5nZXRUeXBlQXJndW1lbnQoZ2VuZXJpY1R5cGUsIDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGFyZ2V0R2VuZXJpY1R5cGUgPSBnZW5lcmljVHlwZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBDbGFzczw/PiB0YXJnZXRUeXBlID0gUmVmbGVjdGlvbkhlbHBlci5lcmFzdXJlKHRhcmdldEdlbmVyaWNUeXBlKTsKKworICAgICAgICBmaW5hbCBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gUGFyYW1ldGVyLmNyZWF0ZSgKKyAgICAgICAgICAgICAgICBjb21wb25lbnRDbGFzcywKKyAgICAgICAgICAgICAgICBjb21wb25lbnRDbGFzcywKKyAgICAgICAgICAgICAgICBoYXNFbmNvZGVkQW5ub3RhdGlvbihpbmplY3RlZSksCisgICAgICAgICAgICAgICAgdGFyZ2V0VHlwZSwKKyAgICAgICAgICAgICAgICB0YXJnZXRHZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucyk7CisKKyAgICAgICAgZmluYWwgRnVuY3Rpb248Q29udGFpbmVyUmVxdWVzdCwgPz4gdmFsdWVQcm92aWRlciA9IHZhbHVlUGFyYW1Qcm92aWRlci5nZXRWYWx1ZVByb3ZpZGVyKHBhcmFtZXRlcik7CisgICAgICAgIGlmICh2YWx1ZVByb3ZpZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChpbmplY3RlZS5pc0ZhY3RvcnkoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAoU3VwcGxpZXI8T2JqZWN0PikgKCkgLT4gdmFsdWVQcm92aWRlci5hcHBseShyZXF1ZXN0LmdldCgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlUHJvdmlkZXIuYXBwbHkocmVxdWVzdC5nZXQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaGFzRW5jb2RlZEFubm90YXRpb24oSW5qZWN0ZWUgaW5qZWN0ZWUpIHsKKyAgICAgICAgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50ID0gaW5qZWN0ZWUuZ2V0UGFyZW50KCk7CisKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpc0NvbnN0cnVjdG9yID0gZWxlbWVudCBpbnN0YW5jZW9mIENvbnN0cnVjdG9yOworICAgICAgICBmaW5hbCBib29sZWFuIGlzTWV0aG9kID0gZWxlbWVudCBpbnN0YW5jZW9mIE1ldGhvZDsKKworICAgICAgICAvLyBpZiBpbmplY3RlZSBpcyBtZXRob2Qgb3IgY29uc3RydWN0b3IsIGNoZWNrIGl0cyBwYXJhbWV0ZXJzCisgICAgICAgIGlmIChpc0NvbnN0cnVjdG9yIHx8IGlzTWV0aG9kKSB7CisgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnM7CisgICAgICAgICAgICBpZiAoaXNNZXRob2QpIHsKKyAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucyA9ICgoTWV0aG9kKSBlbGVtZW50KS5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucygpW2luamVjdGVlLmdldFBvc2l0aW9uKCldOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucyA9ICgoQ29uc3RydWN0b3IpIGVsZW1lbnQpLmdldFBhcmFtZXRlckFubm90YXRpb25zKClbaW5qZWN0ZWUuZ2V0UG9zaXRpb24oKV07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgICAgICAgICBpZiAoYW5ub3RhdGlvbi5hbm5vdGF0aW9uVHlwZSgpLmVxdWFscyhFbmNvZGVkLmNsYXNzKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBjaGVjayBpbmplY3RlZSBpdHNlbGYgKG1ldGhvZCwgY29uc3RydWN0b3Igb3IgZmllbGQpCisgICAgICAgIGlmIChlbGVtZW50LmlzQW5ub3RhdGlvblByZXNlbnQoRW5jb2RlZC5jbGFzcykpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gY2hlY2sgY2xhc3Mgd2hpY2ggY29udGFpbnMgaW5qZWN0ZWUKKyAgICAgICAgQ2xhc3M8Pz4gY2xhenogPSBpbmplY3RlZS5nZXRJbmplY3RlZUNsYXNzKCk7CisgICAgICAgIHJldHVybiBjbGF6ei5pc0Fubm90YXRpb25QcmVzZW50KEVuY29kZWQuY2xhc3MpOworICAgIH0KKworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNDb25zdHJ1Y3RvclBhcmFtZXRlckluZGljYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNNZXRob2RQYXJhbWV0ZXJJbmRpY2F0b3IoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2xhc3M8QT4gZ2V0QW5ub3RhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGFubm90YXRpb247CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L1BhdGhQYXJhbVZhbHVlUGFyYW1Qcm92aWRlci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L1BhdGhQYXJhbVZhbHVlUGFyYW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4OTcyNWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvUGF0aFBhcmFtVmFsdWVQYXJhbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLmluamVjdDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlBhcmFtZXRlcml6ZWRUeXBlOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUGF0aFNlZ21lbnQ7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5FeHRyYWN0b3JFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlBhcmFtRXhjZXB0aW9uLlBhdGhQYXJhbUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUGFyYW1ldGVyOworCisvKioKKyAqIHtAbGluayBQYXRoUGFyYW0gJiM2NDtQYXRoUGFyYW19IGluamVjdGlvbiB2YWx1ZSBwcm92aWRlci4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKi8KK0BTaW5nbGV0b24KK2ZpbmFsIGNsYXNzIFBhdGhQYXJhbVZhbHVlUGFyYW1Qcm92aWRlciBleHRlbmRzIEFic3RyYWN0VmFsdWVQYXJhbVByb3ZpZGVyIHsKKworICAgIC8qKgorICAgICAqIEluamVjdGlvbiBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtcGVwIG11bHRpdmFsdWVkIG1hcCBwYXJhbWV0ZXIgZXh0cmFjdG9yIHByb3ZpZGVyLgorICAgICAqLworICAgIHB1YmxpYyBQYXRoUGFyYW1WYWx1ZVBhcmFtUHJvdmlkZXIoUHJvdmlkZXI8TXVsdGl2YWx1ZWRQYXJhbWV0ZXJFeHRyYWN0b3JQcm92aWRlcj4gbXBlcCkgeworICAgICAgICBzdXBlcihtcGVwLCBQYXJhbWV0ZXIuU291cmNlLlBBVEgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBGdW5jdGlvbjxDb250YWluZXJSZXF1ZXN0LCA/PiBjcmVhdGVWYWx1ZVByb3ZpZGVyKFBhcmFtZXRlciBwYXJhbWV0ZXIpIHsKKyAgICAgICAgU3RyaW5nIHBhcmFtZXRlck5hbWUgPSBwYXJhbWV0ZXIuZ2V0U291cmNlTmFtZSgpOworICAgICAgICBpZiAocGFyYW1ldGVyTmFtZSA9PSBudWxsIHx8IHBhcmFtZXRlck5hbWUubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgLy8gSW52YWxpZCBVUkkgcGFyYW1ldGVyIG5hbWUKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgQ2xhc3M8Pz4gcmF3UGFyYW1ldGVyVHlwZSA9IHBhcmFtZXRlci5nZXRSYXdUeXBlKCk7CisgICAgICAgIGlmIChyYXdQYXJhbWV0ZXJUeXBlID09IFBhdGhTZWdtZW50LmNsYXNzKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFBhdGhQYXJhbVBhdGhTZWdtZW50VmFsdWVTdXBwbGllcihwYXJhbWV0ZXJOYW1lLCAhcGFyYW1ldGVyLmlzRW5jb2RlZCgpKTsKKyAgICAgICAgfSBlbHNlIGlmIChyYXdQYXJhbWV0ZXJUeXBlID09IExpc3QuY2xhc3MgJiYgcGFyYW1ldGVyLmdldFR5cGUoKSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRUeXBlKSB7CisgICAgICAgICAgICBQYXJhbWV0ZXJpemVkVHlwZSBwdCA9IChQYXJhbWV0ZXJpemVkVHlwZSkgcGFyYW1ldGVyLmdldFR5cGUoKTsKKyAgICAgICAgICAgIFR5cGVbXSB0YXJncyA9IHB0LmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKTsKKyAgICAgICAgICAgIGlmICh0YXJncy5sZW5ndGggPT0gMSAmJiB0YXJnc1swXSA9PSBQYXRoU2VnbWVudC5jbGFzcykgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUGF0aFBhcmFtTGlzdFBhdGhTZWdtZW50VmFsdWVTdXBwbGllcihwYXJhbWV0ZXJOYW1lLCAhcGFyYW1ldGVyLmlzRW5jb2RlZCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIE11bHRpdmFsdWVkUGFyYW1ldGVyRXh0cmFjdG9yPD8+IGUgPSBnZXQocGFyYW1ldGVyKTsKKyAgICAgICAgaWYgKGUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3IFBhdGhQYXJhbVZhbHVlUHJvdmlkZXIoZSwgIXBhcmFtZXRlci5pc0VuY29kZWQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUGF0aFBhcmFtVmFsdWVQcm92aWRlciBpbXBsZW1lbnRzIEZ1bmN0aW9uPENvbnRhaW5lclJlcXVlc3QsIE9iamVjdD4geworCisgICAgICAgIHByaXZhdGUgZmluYWwgTXVsdGl2YWx1ZWRQYXJhbWV0ZXJFeHRyYWN0b3I8Pz4gZXh0cmFjdG9yOworICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gZGVjb2RlOworCisgICAgICAgIFBhdGhQYXJhbVZhbHVlUHJvdmlkZXIoTXVsdGl2YWx1ZWRQYXJhbWV0ZXJFeHRyYWN0b3I8Pz4gZXh0cmFjdG9yLCBib29sZWFuIGRlY29kZSkgeworICAgICAgICAgICAgdGhpcy5leHRyYWN0b3IgPSBleHRyYWN0b3I7CisgICAgICAgICAgICB0aGlzLmRlY29kZSA9IGRlY29kZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0IGFwcGx5KENvbnRhaW5lclJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXh0cmFjdG9yLmV4dHJhY3QocmVxdWVzdC5nZXRVcmlJbmZvKCkuZ2V0UGF0aFBhcmFtZXRlcnMoZGVjb2RlKSk7CisgICAgICAgICAgICB9IGNhdGNoIChFeHRyYWN0b3JFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBQYXRoUGFyYW1FeGNlcHRpb24oZS5nZXRDYXVzZSgpLCBleHRyYWN0b3IuZ2V0TmFtZSgpLCBleHRyYWN0b3IuZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUGF0aFBhcmFtUGF0aFNlZ21lbnRWYWx1ZVN1cHBsaWVyIGltcGxlbWVudHMgRnVuY3Rpb248Q29udGFpbmVyUmVxdWVzdCwgUGF0aFNlZ21lbnQ+IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gZGVjb2RlOworCisgICAgICAgIFBhdGhQYXJhbVBhdGhTZWdtZW50VmFsdWVTdXBwbGllcihTdHJpbmcgbmFtZSwgYm9vbGVhbiBkZWNvZGUpIHsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgICAgICB0aGlzLmRlY29kZSA9IGRlY29kZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUGF0aFNlZ21lbnQgYXBwbHkoQ29udGFpbmVyUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgICAgICBMaXN0PFBhdGhTZWdtZW50PiBwcyA9IHJlcXVlc3QuZ2V0VXJpSW5mbygpLmdldFBhdGhTZWdtZW50cyhuYW1lLCBkZWNvZGUpOworICAgICAgICAgICAgaWYgKHBzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHBzLmdldChwcy5zaXplKCkgLSAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFBhdGhQYXJhbUxpc3RQYXRoU2VnbWVudFZhbHVlU3VwcGxpZXIgaW1wbGVtZW50cyBGdW5jdGlvbjxDb250YWluZXJSZXF1ZXN0LCBMaXN0PFBhdGhTZWdtZW50Pj4geworCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBkZWNvZGU7CisKKyAgICAgICAgUGF0aFBhcmFtTGlzdFBhdGhTZWdtZW50VmFsdWVTdXBwbGllcihTdHJpbmcgbmFtZSwgYm9vbGVhbiBkZWNvZGUpIHsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgICAgICB0aGlzLmRlY29kZSA9IGRlY29kZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTGlzdDxQYXRoU2VnbWVudD4gYXBwbHkoQ29udGFpbmVyUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRVcmlJbmZvKCkuZ2V0UGF0aFNlZ21lbnRzKG5hbWUsIGRlY29kZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvUHJpbWl0aXZlQ2hhcmFjdGVyRXh0cmFjdG9yLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvUHJpbWl0aXZlQ2hhcmFjdGVyRXh0cmFjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc1NTg4MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9QcmltaXRpdmVDaGFyYWN0ZXJFeHRyYWN0b3IuamF2YQpAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5pbmplY3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkV4dHJhY3RvckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CisKKy8qKgorICogVmFsdWUgZXh0cmFjdG9yIGZvciB7QGxpbmsgamF2YS5sYW5nLkNoYXJhY3Rlcn0gYW5kIHtAY29kZSBjaGFyfSBwYXJhbWV0ZXJzLgorICoKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK2NsYXNzIFByaW1pdGl2ZUNoYXJhY3RlckV4dHJhY3RvciBpbXBsZW1lbnRzIE11bHRpdmFsdWVkUGFyYW1ldGVyRXh0cmFjdG9yPE9iamVjdD4geworCisgICAgZmluYWwgU3RyaW5nIHBhcmFtZXRlcjsKKyAgICBmaW5hbCBTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlOworICAgIGZpbmFsIE9iamVjdCBkZWZhdWx0UHJpbWl0aXZlVHlwZVZhbHVlOworCisgICAgcHVibGljIFByaW1pdGl2ZUNoYXJhY3RlckV4dHJhY3RvcihTdHJpbmcgcGFyYW1ldGVyLCBTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlLCBPYmplY3QgZGVmYXVsdFByaW1pdGl2ZVR5cGVWYWx1ZSkgeworICAgICAgICB0aGlzLnBhcmFtZXRlciA9IHBhcmFtZXRlcjsKKyAgICAgICAgdGhpcy5kZWZhdWx0U3RyaW5nVmFsdWUgPSBkZWZhdWx0U3RyaW5nVmFsdWU7CisgICAgICAgIHRoaXMuZGVmYXVsdFByaW1pdGl2ZVR5cGVWYWx1ZSA9IGRlZmF1bHRQcmltaXRpdmVUeXBlVmFsdWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gcGFyYW1ldGVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gZGVmYXVsdFN0cmluZ1ZhbHVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgZXh0cmFjdChNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycykgeworICAgICAgICBTdHJpbmcgdiA9IHBhcmFtZXRlcnMuZ2V0Rmlyc3QocGFyYW1ldGVyKTsKKyAgICAgICAgaWYgKHYgIT0gbnVsbCAmJiAhdi50cmltKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBpZiAodi5sZW5ndGgoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHYuY2hhckF0KDApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXh0cmFjdG9yRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX1BBUkFNRVRFUl9JTlZBTElEX0NIQVJfVkFMVUUodikpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGRlZmF1bHRTdHJpbmdWYWx1ZSAhPSBudWxsICYmICFkZWZhdWx0U3RyaW5nVmFsdWUudHJpbSgpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgaWYgKGRlZmF1bHRTdHJpbmdWYWx1ZS5sZW5ndGgoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRTdHJpbmdWYWx1ZS5jaGFyQXQoMCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeHRyYWN0b3JFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfUEFSQU1FVEVSX0lOVkFMSURfQ0hBUl9WQUxVRShkZWZhdWx0U3RyaW5nVmFsdWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBkZWZhdWx0UHJpbWl0aXZlVHlwZVZhbHVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9QcmltaXRpdmVNYXBwZXIuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9QcmltaXRpdmVNYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjljZTE0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L1ByaW1pdGl2ZU1hcHBlci5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLmluamVjdDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5XZWFrSGFzaE1hcDsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIHRoYXQgbWFwcyB0aGUgcHJpbWl0aXZlIHR5cGVzIHRvIHRoZWlyIHJlc3BlY3RpdmUgY2xhc3NlcyBhcyB3ZWxsCisgKiBhcyB0aGUgZGVmYXVsdCB2YWx1ZXMgYXMgZGVmaW5lZCBieSB0aGUgSkFYLVJTIHNwZWNpZmljYXRpb24uCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworZmluYWwgY2xhc3MgUHJpbWl0aXZlTWFwcGVyIHsKKworICAgIHN0YXRpYyBmaW5hbCBNYXA8Q2xhc3MsIENsYXNzPiBwcmltaXRpdmVUb0NsYXNzTWFwID0KKyAgICAgICAgICAgIGdldFByaW1pdGl2ZVRvQ2xhc3NNYXAoKTsKKyAgICBzdGF0aWMgZmluYWwgTWFwPENsYXNzLCBPYmplY3Q+IHByaW1pdGl2ZVRvRGVmYXVsdFZhbHVlTWFwID0KKyAgICAgICAgICAgIGdldFByaW1pdGl2ZVRvRGVmYXVsdFZhbHVlTWFwKCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBNYXA8Q2xhc3MsIENsYXNzPiBnZXRQcmltaXRpdmVUb0NsYXNzTWFwKCkgeworICAgICAgICBNYXA8Q2xhc3MsIENsYXNzPiBtID0gbmV3IFdlYWtIYXNoTWFwPD4oKTsKKyAgICAgICAgLy8gUHV0IGFsbCBwcmltaXRpdmUgdG8gd3JhcHBlciBjbGFzcyBtYXBwaW5ncyBleGNlcHQKKyAgICAgICAgLy8gdGhhdCBmb3IgQ2hhcmFjdGVyCisgICAgICAgIG0ucHV0KEJvb2xlYW4uVFlQRSwgQm9vbGVhbi5jbGFzcyk7CisgICAgICAgIG0ucHV0KEJ5dGUuVFlQRSwgQnl0ZS5jbGFzcyk7CisgICAgICAgIG0ucHV0KENoYXJhY3Rlci5UWVBFLCBDaGFyYWN0ZXIuY2xhc3MpOworICAgICAgICBtLnB1dChTaG9ydC5UWVBFLCBTaG9ydC5jbGFzcyk7CisgICAgICAgIG0ucHV0KEludGVnZXIuVFlQRSwgSW50ZWdlci5jbGFzcyk7CisgICAgICAgIG0ucHV0KExvbmcuVFlQRSwgTG9uZy5jbGFzcyk7CisgICAgICAgIG0ucHV0KEZsb2F0LlRZUEUsIEZsb2F0LmNsYXNzKTsKKyAgICAgICAgbS5wdXQoRG91YmxlLlRZUEUsIERvdWJsZS5jbGFzcyk7CisKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChtKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBNYXA8Q2xhc3MsIE9iamVjdD4gZ2V0UHJpbWl0aXZlVG9EZWZhdWx0VmFsdWVNYXAoKSB7CisgICAgICAgIE1hcDxDbGFzcywgT2JqZWN0PiBtID0gbmV3IFdlYWtIYXNoTWFwPD4oKTsKKyAgICAgICAgbS5wdXQoQm9vbGVhbi5jbGFzcywgQm9vbGVhbi52YWx1ZU9mKGZhbHNlKSk7CisgICAgICAgIG0ucHV0KEJ5dGUuY2xhc3MsIEJ5dGUudmFsdWVPZigoYnl0ZSkgMCkpOworICAgICAgICBtLnB1dChDaGFyYWN0ZXIuY2xhc3MsIENoYXJhY3Rlci52YWx1ZU9mKChjaGFyKSAweDAwKSk7CisgICAgICAgIG0ucHV0KFNob3J0LmNsYXNzLCBTaG9ydC52YWx1ZU9mKChzaG9ydCkgMCkpOworICAgICAgICBtLnB1dChJbnRlZ2VyLmNsYXNzLCBJbnRlZ2VyLnZhbHVlT2YoMCkpOworICAgICAgICBtLnB1dChMb25nLmNsYXNzLCBMb25nLnZhbHVlT2YoMEwpKTsKKyAgICAgICAgbS5wdXQoRmxvYXQuY2xhc3MsIEZsb2F0LnZhbHVlT2YoMC4wZikpOworICAgICAgICBtLnB1dChEb3VibGUuY2xhc3MsIERvdWJsZS52YWx1ZU9mKDAuMGQpKTsKKworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKG0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByZXZlbnRzIGluc3RhbnRpYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBQcmltaXRpdmVNYXBwZXIoKSB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L1ByaW1pdGl2ZVZhbHVlT2ZFeHRyYWN0b3IuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9QcmltaXRpdmVWYWx1ZU9mRXh0cmFjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM1ZTRjNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9QcmltaXRpdmVWYWx1ZU9mRXh0cmFjdG9yLmphdmEKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuaW5qZWN0OworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuRXh0cmFjdG9yRXhjZXB0aW9uOworCisvKioKKyAqIEV4dHJhY3QgcHJpbWl0aXZlIHBhcmFtZXRlciB2YWx1ZSBmcm9tIHRoZSB7QGxpbmsgTXVsdGl2YWx1ZWRNYXAgbXVsdGl2YWx1ZWQgcGFyYW1ldGVyIG1hcH0KKyAqIHVzaW5nIG9uZSBvZiB0aGUge0Bjb2RlIHZhbHVlT2YoU3RyaW5nKX0gbWV0aG9kcyBvbiB0aGUgcHJpbWl0aXZlIEphdmEgdHlwZSB3cmFwcGVyCisgKiBjbGFzc2VzLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK2ZpbmFsIGNsYXNzIFByaW1pdGl2ZVZhbHVlT2ZFeHRyYWN0b3IgaW1wbGVtZW50cyBNdWx0aXZhbHVlZFBhcmFtZXRlckV4dHJhY3RvcjxPYmplY3Q+IHsKKworICAgIHByaXZhdGUgZmluYWwgTWV0aG9kIHZhbHVlT2Y7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcGFyYW1ldGVyOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZTsKKyAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBkZWZhdWx0VmFsdWU7CisgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgZGVmYXVsdFByaW1pdGl2ZVR5cGVWYWx1ZTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgcHJpbWl0aXZlIHBhcmFtZXRlciB2YWx1ZSBleHRyYWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWVPZiAgICAgICAgICAgICAgICAgICB7QGNvZGUgdmFsdWVPZigpfSBtZXRob2QgaGFuZGxlci4KKyAgICAgKiBAcGFyYW0gcGFyYW1ldGVyICAgICAgICAgICAgICAgICBzdHJpbmcgcGFyYW1ldGVyIHZhbHVlLgorICAgICAqIEBwYXJhbSBkZWZhdWx0U3RyaW5nVmFsdWUgICAgICAgIGRlZmF1bHQgc3RyaW5nIHZhbHVlLgorICAgICAqIEBwYXJhbSBkZWZhdWx0UHJpbWl0aXZlVHlwZVZhbHVlIGRlZmF1bHQgcHJpbWl0aXZlIHR5cGUgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIFByaW1pdGl2ZVZhbHVlT2ZFeHRyYWN0b3IoTWV0aG9kIHZhbHVlT2YsIFN0cmluZyBwYXJhbWV0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGRlZmF1bHRTdHJpbmdWYWx1ZSwgT2JqZWN0IGRlZmF1bHRQcmltaXRpdmVUeXBlVmFsdWUpIHsKKyAgICAgICAgdGhpcy52YWx1ZU9mID0gdmFsdWVPZjsKKyAgICAgICAgdGhpcy5wYXJhbWV0ZXIgPSBwYXJhbWV0ZXI7CisgICAgICAgIHRoaXMuZGVmYXVsdFN0cmluZ1ZhbHVlID0gZGVmYXVsdFN0cmluZ1ZhbHVlOworICAgICAgICB0aGlzLmRlZmF1bHRWYWx1ZSA9IChkZWZhdWx0U3RyaW5nVmFsdWUgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICA/IGdldFZhbHVlKGRlZmF1bHRTdHJpbmdWYWx1ZSkgOiBudWxsOworICAgICAgICB0aGlzLmRlZmF1bHRQcmltaXRpdmVUeXBlVmFsdWUgPSBkZWZhdWx0UHJpbWl0aXZlVHlwZVZhbHVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHBhcmFtZXRlcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRWYWx1ZVN0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRTdHJpbmdWYWx1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIE9iamVjdCBnZXRWYWx1ZShTdHJpbmcgdikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlT2YuaW52b2tlKG51bGwsIHYpOworICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBUaHJvd2FibGUgdGFyZ2V0ID0gZXguZ2V0VGFyZ2V0RXhjZXB0aW9uKCk7CisgICAgICAgICAgICBpZiAodGFyZ2V0IGluc3RhbmNlb2YgV2ViQXBwbGljYXRpb25FeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAoV2ViQXBwbGljYXRpb25FeGNlcHRpb24pIHRhcmdldDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4dHJhY3RvckV4Y2VwdGlvbih0YXJnZXQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgZXh0cmFjdChNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycykgeworICAgICAgICBTdHJpbmcgdiA9IHBhcmFtZXRlcnMuZ2V0Rmlyc3QocGFyYW1ldGVyKTsKKyAgICAgICAgaWYgKHYgIT0gbnVsbCAmJiAhdi50cmltKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VmFsdWUodik7CisgICAgICAgIH0gZWxzZSBpZiAoZGVmYXVsdFZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFRPRE8gZG8gd2UgbmVlZCB0byBjbG9uZSB0aGUgZGVmYXVsdCB2YWx1ZT8KKyAgICAgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZGVmYXVsdFByaW1pdGl2ZVR5cGVWYWx1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvUXVlcnlQYXJhbVZhbHVlUGFyYW1Qcm92aWRlci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L1F1ZXJ5UGFyYW1WYWx1ZVBhcmFtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjNjN2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L1F1ZXJ5UGFyYW1WYWx1ZVBhcmFtUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5pbmplY3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworCitpbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuRXh0cmFjdG9yRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5QYXJhbUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUGFyYW1ldGVyOworCisvKioKKyAqIFZhbHVlIHN1cHBsaWVyIHByb3ZpZGVyIHN1cHBvcnRpbmcgdGhlIHtAbGluayBRdWVyeVBhcmFtICYjNjQ7UXVlcnlQYXJhbX0gaW5qZWN0aW9uIGFubm90YXRpb24uCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQFNpbmdsZXRvbgorZmluYWwgY2xhc3MgUXVlcnlQYXJhbVZhbHVlUGFyYW1Qcm92aWRlciBleHRlbmRzIEFic3RyYWN0VmFsdWVQYXJhbVByb3ZpZGVyIHsKKworICAgIC8qKgorICAgICAqIEluamVjdGlvbiBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtcGVwIG11bHRpdmFsdWVkIG1hcCBwYXJhbWV0ZXIgZXh0cmFjdG9yIHByb3ZpZGVyLgorICAgICAqLworICAgIHB1YmxpYyBRdWVyeVBhcmFtVmFsdWVQYXJhbVByb3ZpZGVyKFByb3ZpZGVyPE11bHRpdmFsdWVkUGFyYW1ldGVyRXh0cmFjdG9yUHJvdmlkZXI+IG1wZXApIHsKKyAgICAgICAgc3VwZXIobXBlcCwgUGFyYW1ldGVyLlNvdXJjZS5RVUVSWSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEZ1bmN0aW9uPENvbnRhaW5lclJlcXVlc3QsID8+IGNyZWF0ZVZhbHVlUHJvdmlkZXIoUGFyYW1ldGVyIHBhcmFtZXRlcikgeworICAgICAgICBTdHJpbmcgcGFyYW1ldGVyTmFtZSA9IHBhcmFtZXRlci5nZXRTb3VyY2VOYW1lKCk7CisgICAgICAgIGlmIChwYXJhbWV0ZXJOYW1lID09IG51bGwgfHwgcGFyYW1ldGVyTmFtZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICAvLyBJbnZhbGlkIHF1ZXJ5IHBhcmFtZXRlciBuYW1lCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIE11bHRpdmFsdWVkUGFyYW1ldGVyRXh0cmFjdG9yIGUgPSBnZXQocGFyYW1ldGVyKTsKKyAgICAgICAgaWYgKGUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3IFF1ZXJ5UGFyYW1WYWx1ZVByb3ZpZGVyKGUsICFwYXJhbWV0ZXIuaXNFbmNvZGVkKCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFF1ZXJ5UGFyYW1WYWx1ZVByb3ZpZGVyIGltcGxlbWVudHMgRnVuY3Rpb248Q29udGFpbmVyUmVxdWVzdCwgT2JqZWN0PiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBNdWx0aXZhbHVlZFBhcmFtZXRlckV4dHJhY3Rvcjw/PiBleHRyYWN0b3I7CisgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBkZWNvZGU7CisKKyAgICAgICAgUXVlcnlQYXJhbVZhbHVlUHJvdmlkZXIoTXVsdGl2YWx1ZWRQYXJhbWV0ZXJFeHRyYWN0b3I8Pz4gZXh0cmFjdG9yLCBib29sZWFuIGRlY29kZSkgeworICAgICAgICAgICAgdGhpcy5leHRyYWN0b3IgPSBleHRyYWN0b3I7CisgICAgICAgICAgICB0aGlzLmRlY29kZSA9IGRlY29kZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0IGFwcGx5KENvbnRhaW5lclJlcXVlc3QgY29udGFpbmVyUmVxdWVzdCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXh0cmFjdG9yLmV4dHJhY3QoY29udGFpbmVyUmVxdWVzdC5nZXRVcmlJbmZvKCkuZ2V0UXVlcnlQYXJhbWV0ZXJzKGRlY29kZSkpOworICAgICAgICAgICAgfSBjYXRjaCAoRXh0cmFjdG9yRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUGFyYW1FeGNlcHRpb24uUXVlcnlQYXJhbUV4Y2VwdGlvbihlLmdldENhdXNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0b3IuZ2V0TmFtZSgpLCBleHRyYWN0b3IuZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L1NpbmdsZVN0cmluZ1ZhbHVlRXh0cmFjdG9yLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvU2luZ2xlU3RyaW5nVmFsdWVFeHRyYWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTk0YzdiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L1NpbmdsZVN0cmluZ1ZhbHVlRXh0cmFjdG9yLmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuaW5qZWN0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKKworLyoqCisgKiBFeHRyYWN0IHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIgYnkgcmV0dXJuaW5nIHRoZSBmaXJzdCBzdHJpbmcgcGFyYW1ldGVyIHZhbHVlCisgKiBmb3VuZCBpbiB0aGUgbGlzdCBvZiBzdHJpbmcgcGFyYW1ldGVyIHZhbHVlcy4KKyAqIDxwIC8+CisgKiBUaGlzIGNsYXNzIGNhbiBiZSBzZWVuIGFzIGEgc3BlY2lhbCwgb3B0aW1pemVkLCBjYXNlIG9mIHtAbGluayBTaW5nbGVWYWx1ZUV4dHJhY3Rvcn0uCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworZmluYWwgY2xhc3MgU2luZ2xlU3RyaW5nVmFsdWVFeHRyYWN0b3IgaW1wbGVtZW50cyBNdWx0aXZhbHVlZFBhcmFtZXRlckV4dHJhY3RvcjxTdHJpbmc+IHsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHBhcmFtTmFtZTsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBkZWZhdWx0VmFsdWU7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IHNpbmdsZSBzdHJpbmcgdmFsdWUgZXh0cmFjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmFtZXRlck5hbWUgc3RyaW5nIHBhcmFtZXRlciBuYW1lLgorICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgIGRlZmF1bHQgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIFNpbmdsZVN0cmluZ1ZhbHVlRXh0cmFjdG9yKFN0cmluZyBwYXJhbWV0ZXJOYW1lLCBTdHJpbmcgZGVmYXVsdFZhbHVlKSB7CisgICAgICAgIHRoaXMucGFyYW1OYW1lID0gcGFyYW1ldGVyTmFtZTsKKyAgICAgICAgdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gcGFyYW1OYW1lOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKiA8cC8+CisgICAgICogVGhpcyBpbXBsZW1lbnRhdGlvbiByZXR1cm4gcyB0aGUgZmlyc3QgU3RyaW5nIHZhbHVlIGZvdW5kIGluIHRoZSBsaXN0IG9mCisgICAgICogcG90ZW50aWFsIG11bHRpcGxlIHN0cmluZyBwYXJhbWV0ZXIgdmFsdWVzLiBBbnkgb3RoZXIgdmFsdWVzIGluIHRoZSBtdWx0aS12YWx1ZQorICAgICAqIGxpc3Qgd2lsbCBiZSBpZ25vcmVkLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmFtZXRlcnMgbWFwIG9mIHBhcmFtZXRlcnMuCisgICAgICogQHJldHVybiBleHRyYWN0ZWQgc2luZ2xlIHN0cmluZyBwYXJhbWV0ZXIgdmFsdWUuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBleHRyYWN0KE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzKSB7CisgICAgICAgIFN0cmluZyB2YWx1ZSA9IHBhcmFtZXRlcnMuZ2V0Rmlyc3QocGFyYW1OYW1lKTsKKyAgICAgICAgcmV0dXJuICh2YWx1ZSAhPSBudWxsKSA/IHZhbHVlIDogZGVmYXVsdFZhbHVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9TaW5nbGVWYWx1ZUV4dHJhY3Rvci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L1NpbmdsZVZhbHVlRXh0cmFjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZiZTAyMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9TaW5nbGVWYWx1ZUV4dHJhY3Rvci5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLmluamVjdDsKKworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUGFyYW1Db252ZXJ0ZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuRXh0cmFjdG9yRXhjZXB0aW9uOworCisvKioKKyAqIEV4dHJhY3QgdmFsdWUgb2YgdGhlIHBhcmFtZXRlciB1c2luZyBhIHNpbmdsZSBwYXJhbWV0ZXIgdmFsdWUgYW5kIHRoZSB1bmRlcmx5aW5nCisgKiB7QGxpbmsgUGFyYW1Db252ZXJ0ZXIgcGFyYW0gY29udmVydGVyfS4KKyAqCisgKiBAcGFyYW0gPFQ+IGV4dHJhY3RlZCBKYXZhIHR5cGUuCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitmaW5hbCBjbGFzcyBTaW5nbGVWYWx1ZUV4dHJhY3RvcjxUPiBleHRlbmRzIEFic3RyYWN0UGFyYW1WYWx1ZUV4dHJhY3RvcjxUPiBpbXBsZW1lbnRzIE11bHRpdmFsdWVkUGFyYW1ldGVyRXh0cmFjdG9yPFQ+IHsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgc2luZ2xlIHZhbHVlIGV4dHJhY3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb252ZXJ0ZXIgICAgICAgICAgc3RyaW5nIHZhbHVlIHJlYWRlci4KKyAgICAgKiBAcGFyYW0gcGFyYW1ldGVyTmFtZSAgICAgIHN0cmluZyBwYXJhbWV0ZXIgbmFtZS4KKyAgICAgKiBAcGFyYW0gZGVmYXVsdFN0cmluZ1ZhbHVlIGRlZmF1bHQgc3RyaW5nIHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBTaW5nbGVWYWx1ZUV4dHJhY3RvcihmaW5hbCBQYXJhbUNvbnZlcnRlcjxUPiBjb252ZXJ0ZXIsIGZpbmFsIFN0cmluZyBwYXJhbWV0ZXJOYW1lLCBmaW5hbCBTdHJpbmcgZGVmYXVsdFN0cmluZ1ZhbHVlKSB7CisgICAgICAgIHN1cGVyKGNvbnZlcnRlciwgcGFyYW1ldGVyTmFtZSwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICogPHAvPgorICAgICAqIFRoaXMgaW1wbGVtZW50YXRpb24gZXh0cmFjdHMgdGhlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIgYXBwbHlpbmcgdGhlIHVuZGVybHlpbmcKKyAgICAgKiB7QGxpbmsgUGFyYW1Db252ZXJ0ZXIgcGFyYW0gY29udmVydGVyfSB0byB0aGUgZmlyc3QgdmFsdWUgZm91bmQgaW4gdGhlIGxpc3Qgb2YgcG90ZW50aWFsIG11bHRpcGxlCisgICAgICogcGFyYW1ldGVyIHZhbHVlcy4gQW55IG90aGVyIHZhbHVlcyBpbiB0aGUgbXVsdGktdmFsdWUgbGlzdCB3aWxsIGJlIGlnbm9yZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyBtYXAgb2YgcGFyYW1ldGVycy4KKyAgICAgKiBAcmV0dXJuIGV4dHJhY3RlZCBzaW5nbGUgcGFyYW1ldGVyIHZhbHVlLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUIGV4dHJhY3QoZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlID0gcGFyYW1ldGVycy5nZXRGaXJzdChnZXROYW1lKCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGZyb21TdHJpbmcoKHZhbHVlID09IG51bGwgJiYgaXNEZWZhdWx0VmFsdWVSZWdpc3RlcmVkKCkpID8gZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKCkgOiB2YWx1ZSk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHwgUHJvY2Vzc2luZ0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgZXg7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZSgpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeHRyYWN0b3JFeGNlcHRpb24oZXgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L1N0cmluZ0NvbGxlY3Rpb25FeHRyYWN0b3IuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9TdHJpbmdDb2xsZWN0aW9uRXh0cmFjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY0Yjk4NQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9TdHJpbmdDb2xsZWN0aW9uRXh0cmFjdG9yLmphdmEKQEAgLTAsMCArMSwxNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLmluamVjdDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OworaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKKworLyoqCisgKiBFeHRyYWN0IHBhcmFtZXRlciB2YWx1ZSBhcyBhIHNwZWNpZmljIHtAY29kZSBTdHJpbmd9IEphdmEgY29sbGVjdGlvbiB0eXBlLgorICogPHAgLz4KKyAqIFRoaXMgY2xhc3MgY2FuIGJlIHNlZW4gYXMgYSBzcGVjaWFsLCBvcHRpbWl6ZWQsIGNhc2Ugb2Yge0BsaW5rIENvbGxlY3Rpb25FeHRyYWN0b3J9LgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK2Fic3RyYWN0IGNsYXNzIFN0cmluZ0NvbGxlY3Rpb25FeHRyYWN0b3IgaW1wbGVtZW50cyBNdWx0aXZhbHVlZFBhcmFtZXRlckV4dHJhY3RvcjxDb2xsZWN0aW9uPFN0cmluZz4+IHsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHBhcmFtZXRlcjsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBkZWZhdWx0VmFsdWU7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IHN0cmluZyBjb2xsZWN0aW9uIHBhcmFtZXRlciBleHRyYWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyYW1ldGVyTmFtZSBwYXJhbWV0ZXIgbmFtZS4KKyAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlICBkZWZhdWx0IHBhcmFtZXRlciB2YWx1ZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nQ29sbGVjdGlvbkV4dHJhY3RvcihTdHJpbmcgcGFyYW1ldGVyTmFtZSwgU3RyaW5nIGRlZmF1bHRWYWx1ZSkgeworICAgICAgICB0aGlzLnBhcmFtZXRlciA9IHBhcmFtZXRlck5hbWU7CisgICAgICAgIHRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHBhcmFtZXRlcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRWYWx1ZVN0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxTdHJpbmc+IGV4dHJhY3QoTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtZXRlcnMpIHsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHN0cmluZ0xpc3QgPSBwYXJhbWV0ZXJzLmdldChwYXJhbWV0ZXIpOworCisgICAgICAgIGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiBjb2xsZWN0aW9uID0gbmV3Q29sbGVjdGlvbigpOworICAgICAgICBpZiAoc3RyaW5nTGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICBjb2xsZWN0aW9uLmFkZEFsbChzdHJpbmdMaXN0KTsKKyAgICAgICAgfSBlbHNlIGlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgY29sbGVjdGlvbi5hZGQoZGVmYXVsdFZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjb2xsZWN0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIG5ldyBzdHJpbmcgY29sbGVjdGlvbiBpbnN0YW5jZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBzdG9yZSB0aGUgZXh0cmFjdGVkIHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiBUaGUgbWV0aG9kIGlzIG92ZXJyaWRkZW4gYnkgY29uY3JldGUgaW1wbGVtZW50YXRpb25zIHRvIHJldHVybiBhbiBpbnN0YW5jZQorICAgICAqIG9mIGEgcHJvcGVyIGNvbGxlY3Rpb24gc3ViLXR5cGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGluc3RhbmNlIG9mIGEgcHJvcGVyIGNvbGxlY3Rpb24gc3ViLXR5cGUKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgQ29sbGVjdGlvbjxTdHJpbmc+IG5ld0NvbGxlY3Rpb24oKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIExpc3RTdHJpbmcgZXh0ZW5kcyBTdHJpbmdDb2xsZWN0aW9uRXh0cmFjdG9yIHsKKworICAgICAgICBwdWJsaWMgTGlzdFN0cmluZyhTdHJpbmcgcGFyYW1ldGVyLCBTdHJpbmcgZGVmYXVsdFZhbHVlKSB7CisgICAgICAgICAgICBzdXBlcihwYXJhbWV0ZXIsIGRlZmF1bHRWYWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBuZXdDb2xsZWN0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgU2V0U3RyaW5nIGV4dGVuZHMgU3RyaW5nQ29sbGVjdGlvbkV4dHJhY3RvciB7CisKKyAgICAgICAgcHVibGljIFNldFN0cmluZyhTdHJpbmcgcGFyYW1ldGVyLCBTdHJpbmcgZGVmYXVsdFZhbHVlKSB7CisgICAgICAgICAgICBzdXBlcihwYXJhbWV0ZXIsIGRlZmF1bHRWYWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIFNldDxTdHJpbmc+IG5ld0NvbGxlY3Rpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgU29ydGVkU2V0U3RyaW5nIGV4dGVuZHMgU3RyaW5nQ29sbGVjdGlvbkV4dHJhY3RvciB7CisKKyAgICAgICAgcHVibGljIFNvcnRlZFNldFN0cmluZyhTdHJpbmcgcGFyYW1ldGVyLCBTdHJpbmcgZGVmYXVsdFZhbHVlKSB7CisgICAgICAgICAgICBzdXBlcihwYXJhbWV0ZXIsIGRlZmF1bHRWYWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIFNvcnRlZFNldDxTdHJpbmc+IG5ld0NvbGxlY3Rpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFRyZWVTZXQ8U3RyaW5nPigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHN0cmluZyBjb2xsZWN0aW9uIGV4dHJhY3RvciBpbnN0YW5jZSBzdXBwb3J0aW5nIHRoZSBnaXZlbiBjb2xsZWN0aW9uCisgICAgICogY2xhc3MgdHlwZSBmb3IgdGhlIHBhcmFtZXRlciBzcGVjaWZpZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29sbGVjdGlvblR5cGUgY29sbGVjdGlvbiB0eXBlIHRvIGJlIHN1cHBvcnRlZCBieSB0aGUgZXh0cmFjdG9yLgorICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJOYW1lICBleHRyYWN0ZWQgcGFyYW1ldGVyIG5hbWUuCisgICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSAgIGRlZmF1bHQgcGFyYW1ldGVyIHZhbHVlLgorICAgICAqIEByZXR1cm4gc3RyaW5nIGNvbGxlY3Rpb24gZXh0cmFjdG9yIGluc3RhbmNlIHN1cHBvcnRpbmcgdGhlIGdpdmVuIGNvbGxlY3Rpb24KKyAgICAgKiAgICAgICAgIGNsYXNzIHR5cGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmdDb2xsZWN0aW9uRXh0cmFjdG9yIGdldEluc3RhbmNlKENsYXNzPD8+IGNvbGxlY3Rpb25UeXBlLCBTdHJpbmcgcGFyYW1ldGVyTmFtZSwgU3RyaW5nIGRlZmF1bHRWYWx1ZSkgeworICAgICAgICBpZiAoTGlzdC5jbGFzcyA9PSBjb2xsZWN0aW9uVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBMaXN0U3RyaW5nKHBhcmFtZXRlck5hbWUsIGRlZmF1bHRWYWx1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoU2V0LmNsYXNzID09IGNvbGxlY3Rpb25UeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFNldFN0cmluZyhwYXJhbWV0ZXJOYW1lLCBkZWZhdWx0VmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKFNvcnRlZFNldC5jbGFzcyA9PSBjb2xsZWN0aW9uVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTb3J0ZWRTZXRTdHJpbmcocGFyYW1ldGVyTmFtZSwgZGVmYXVsdFZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCBjb2xsZWN0aW9uIHR5cGU6ICIgKyBjb2xsZWN0aW9uVHlwZS5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L1ZhbHVlUGFyYW1Qcm92aWRlckNvbmZpZ3VyYXRvci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L1ZhbHVlUGFyYW1Qcm92aWRlckNvbmZpZ3VyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYTY5NzkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvVmFsdWVQYXJhbVByb3ZpZGVyQ29uZmlndXJhdG9yLmphdmEKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLmluamVjdDsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOworCitpbXBvcnQgamF2YXgud3MucnMuQmVhblBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLkNvb2tpZVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLkZvcm1QYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5IZWFkZXJQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5NYXRyaXhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuU3VzcGVuZGVkOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKKworaW1wb3J0IGphdmF4LmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkJvb3RzdHJhcEJhZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Cb290c3RyYXBDb25maWd1cmF0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkJpbmRpbmdzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5Db250ZXh0SW5qZWN0aW9uUmVzb2x2ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLkxhenlWYWx1ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uVmFsdWU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLlZhbHVlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyQm9vdHN0cmFwQmFnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Vcmk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFzeW5jQ29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwucHJvY2Vzcy5SZXF1ZXN0UHJvY2Vzc2luZ0NvbnRleHRSZWZlcmVuY2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5pbnRlcm5hbC5WYWx1ZVBhcmFtUHJvdmlkZXI7CisKKy8qKgorICogQ29uZmlndXJhdG9yIHdoaWNoIGluaXRpYWxpemVzIGFuZCByZWdpc3RlciB7QGxpbmsgVmFsdWVQYXJhbVByb3ZpZGVyfSBpbnN0YW5jZXMgaW50byB7QGxpbmsgSW5qZWN0aW9uTWFuYWdlcn0gYW5kCisgKiB7QGxpbmsgQm9vdHN0cmFwQmFnfS4KKyAqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworcHVibGljIGNsYXNzIFZhbHVlUGFyYW1Qcm92aWRlckNvbmZpZ3VyYXRvciBpbXBsZW1lbnRzIEJvb3RzdHJhcENvbmZpZ3VyYXRvciB7CisKKyAgICBwdWJsaWMgdm9pZCBpbml0KEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciwgQm9vdHN0cmFwQmFnIGJvb3RzdHJhcEJhZykgeworICAgICAgICBTZXJ2ZXJCb290c3RyYXBCYWcgc2VydmVyQmFnID0gKFNlcnZlckJvb3RzdHJhcEJhZykgYm9vdHN0cmFwQmFnOworCisgICAgICAgIC8vIFByb3ZpZGUgcmVxdWVzdCBzY29wZWQgQXN5bmNDb250ZXh0IHdpdGhvdXQgdGhlIHByb3h5LgorICAgICAgICBQcm92aWRlcjxBc3luY0NvbnRleHQ+IGFzeW5jQ29udGV4dFByb3ZpZGVyID0gKCkgLT4geworICAgICAgICAgICAgUmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0UmVmZXJlbmNlIHJlZmVyZW5jZSA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoUmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0UmVmZXJlbmNlLmNsYXNzKTsKKyAgICAgICAgICAgIHJldHVybiByZWZlcmVuY2UuZ2V0KCkuYXN5bmNDb250ZXh0KCk7CisgICAgICAgIH07CisKKyAgICAgICAgLy8gUHJvdmlkZSBDb250ZXh0SW5qZWN0aW9uUmVzb2x2ZXIgdGhhdCBpcyBpbXBsZW1lbnRlZCBieSBJbmplY3Rpb24gUHJvdmlkZXIuCisgICAgICAgIExhenlWYWx1ZTxDb250ZXh0SW5qZWN0aW9uUmVzb2x2ZXI+IGxhenlDb250ZXh0UmVzb2x2ZXIgPQorICAgICAgICAgICAgICAgIFZhbHVlcy5sYXp5KChWYWx1ZTxDb250ZXh0SW5qZWN0aW9uUmVzb2x2ZXI+KSAoKSAtPiBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKENvbnRleHRJbmplY3Rpb25SZXNvbHZlci5jbGFzcykpOworCisgICAgICAgIFN1cHBsaWVyPENvbmZpZ3VyYXRpb24+IGNvbmZpZ3VyYXRpb24gPSBzZXJ2ZXJCYWc6OmdldENvbmZpZ3VyYXRpb247CisgICAgICAgIFByb3ZpZGVyPE11bHRpdmFsdWVkUGFyYW1ldGVyRXh0cmFjdG9yUHJvdmlkZXI+IHBhcmFtRXh0cmFjdG9yID0gc2VydmVyQmFnOjpnZXRNdWx0aXZhbHVlZFBhcmFtZXRlckV4dHJhY3RvclByb3ZpZGVyOworCisgICAgICAgIC8vIFBhcmFtZXRlciBpbmplY3Rpb24gdmFsdWUgcHJvdmlkZXJzCisgICAgICAgIENvbGxlY3Rpb248VmFsdWVQYXJhbVByb3ZpZGVyPiBzdXBwbGllcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgICAgICBBc3luY1Jlc3BvbnNlVmFsdWVQYXJhbVByb3ZpZGVyIGFzeW5jUHJvdmlkZXIgPSBuZXcgQXN5bmNSZXNwb25zZVZhbHVlUGFyYW1Qcm92aWRlcihhc3luY0NvbnRleHRQcm92aWRlcik7CisgICAgICAgIHN1cHBsaWVycy5hZGQoYXN5bmNQcm92aWRlcik7CisKKyAgICAgICAgQ29va2llUGFyYW1WYWx1ZVBhcmFtUHJvdmlkZXIgY29va2llUHJvdmlkZXIgPSBuZXcgQ29va2llUGFyYW1WYWx1ZVBhcmFtUHJvdmlkZXIocGFyYW1FeHRyYWN0b3IpOworICAgICAgICBzdXBwbGllcnMuYWRkKGNvb2tpZVByb3ZpZGVyKTsKKworICAgICAgICBFbnRpdHlQYXJhbVZhbHVlUGFyYW1Qcm92aWRlciBlbnRpdHlQcm92aWRlciA9IG5ldyBFbnRpdHlQYXJhbVZhbHVlUGFyYW1Qcm92aWRlcihwYXJhbUV4dHJhY3Rvcik7CisgICAgICAgIHN1cHBsaWVycy5hZGQoZW50aXR5UHJvdmlkZXIpOworCisgICAgICAgIEZvcm1QYXJhbVZhbHVlUGFyYW1Qcm92aWRlciBmb3JtUHJvdmlkZXIgPSBuZXcgRm9ybVBhcmFtVmFsdWVQYXJhbVByb3ZpZGVyKHBhcmFtRXh0cmFjdG9yKTsKKyAgICAgICAgc3VwcGxpZXJzLmFkZChmb3JtUHJvdmlkZXIpOworCisgICAgICAgIEhlYWRlclBhcmFtVmFsdWVQYXJhbVByb3ZpZGVyIGhlYWRlclByb3ZpZGVyID0gbmV3IEhlYWRlclBhcmFtVmFsdWVQYXJhbVByb3ZpZGVyKHBhcmFtRXh0cmFjdG9yKTsKKyAgICAgICAgc3VwcGxpZXJzLmFkZChoZWFkZXJQcm92aWRlcik7CisKKyAgICAgICAgTWF0cml4UGFyYW1WYWx1ZVBhcmFtUHJvdmlkZXIgbWF0cml4UHJvdmlkZXIgPSBuZXcgTWF0cml4UGFyYW1WYWx1ZVBhcmFtUHJvdmlkZXIocGFyYW1FeHRyYWN0b3IpOworICAgICAgICBzdXBwbGllcnMuYWRkKG1hdHJpeFByb3ZpZGVyKTsKKworICAgICAgICBQYXRoUGFyYW1WYWx1ZVBhcmFtUHJvdmlkZXIgcGF0aFByb3ZpZGVyID0gbmV3IFBhdGhQYXJhbVZhbHVlUGFyYW1Qcm92aWRlcihwYXJhbUV4dHJhY3Rvcik7CisgICAgICAgIHN1cHBsaWVycy5hZGQocGF0aFByb3ZpZGVyKTsKKworICAgICAgICBRdWVyeVBhcmFtVmFsdWVQYXJhbVByb3ZpZGVyIHF1ZXJ5UHJvdmlkZXIgPSBuZXcgUXVlcnlQYXJhbVZhbHVlUGFyYW1Qcm92aWRlcihwYXJhbUV4dHJhY3Rvcik7CisgICAgICAgIHN1cHBsaWVycy5hZGQocXVlcnlQcm92aWRlcik7CisKKyAgICAgICAgQmVhblBhcmFtVmFsdWVQYXJhbVByb3ZpZGVyIGJlYW5Qcm92aWRlciA9IG5ldyBCZWFuUGFyYW1WYWx1ZVBhcmFtUHJvdmlkZXIocGFyYW1FeHRyYWN0b3IsIGluamVjdGlvbk1hbmFnZXIpOworICAgICAgICBzdXBwbGllcnMuYWRkKGJlYW5Qcm92aWRlcik7CisKKyAgICAgICAgV2ViVGFyZ2V0VmFsdWVQYXJhbVByb3ZpZGVyIHdlYlRhcmdldFByb3ZpZGVyID0gbmV3IFdlYlRhcmdldFZhbHVlUGFyYW1Qcm92aWRlcihjb25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgIGNsaWVudENvbmZpZ0NsYXNzIC0+IEluamVjdGlvbnMuZ2V0T3JDcmVhdGUoaW5qZWN0aW9uTWFuYWdlciwgY2xpZW50Q29uZmlnQ2xhc3MpKTsKKyAgICAgICAgc3VwcGxpZXJzLmFkZCh3ZWJUYXJnZXRQcm92aWRlcik7CisKKyAgICAgICAgRGVsZWdhdGVkSW5qZWN0aW9uVmFsdWVQYXJhbVByb3ZpZGVyIGNvbnRleHRQcm92aWRlciA9CisgICAgICAgICAgICAgICAgbmV3IERlbGVnYXRlZEluamVjdGlvblZhbHVlUGFyYW1Qcm92aWRlcihsYXp5Q29udGV4dFJlc29sdmVyLCBpbmplY3Rpb25NYW5hZ2VyOjpjcmVhdGVGb3JlaWduRGVzY3JpcHRvcik7CisgICAgICAgIHN1cHBsaWVycy5hZGQoY29udGV4dFByb3ZpZGVyKTsKKworICAgICAgICBzZXJ2ZXJCYWcuc2V0VmFsdWVQYXJhbVByb3ZpZGVycyhDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKHN1cHBsaWVycykpOworCisgICAgICAgIC8vIE5lZWRzIHRvIGJlIGluIEluamVjdGlvbk1hbmFnZXIgYmVjYXVzZSBvZiBDZGlDb21wb25lbnRQcm92aWRlcgorICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyKEJpbmRpbmdzLnNlcnZpY2UoYXN5bmNQcm92aWRlcikudG8oVmFsdWVQYXJhbVByb3ZpZGVyLmNsYXNzKSk7CisgICAgICAgIGluamVjdGlvbk1hbmFnZXIucmVnaXN0ZXIoQmluZGluZ3Muc2VydmljZShjb29raWVQcm92aWRlcikudG8oVmFsdWVQYXJhbVByb3ZpZGVyLmNsYXNzKSk7CisgICAgICAgIGluamVjdGlvbk1hbmFnZXIucmVnaXN0ZXIoQmluZGluZ3Muc2VydmljZShmb3JtUHJvdmlkZXIpLnRvKFZhbHVlUGFyYW1Qcm92aWRlci5jbGFzcykpOworICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyKEJpbmRpbmdzLnNlcnZpY2UoaGVhZGVyUHJvdmlkZXIpLnRvKFZhbHVlUGFyYW1Qcm92aWRlci5jbGFzcykpOworICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyKEJpbmRpbmdzLnNlcnZpY2UobWF0cml4UHJvdmlkZXIpLnRvKFZhbHVlUGFyYW1Qcm92aWRlci5jbGFzcykpOworICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyKEJpbmRpbmdzLnNlcnZpY2UocGF0aFByb3ZpZGVyKS50byhWYWx1ZVBhcmFtUHJvdmlkZXIuY2xhc3MpKTsKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5yZWdpc3RlcihCaW5kaW5ncy5zZXJ2aWNlKHF1ZXJ5UHJvdmlkZXIpLnRvKFZhbHVlUGFyYW1Qcm92aWRlci5jbGFzcykpOworICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyKEJpbmRpbmdzLnNlcnZpY2Uod2ViVGFyZ2V0UHJvdmlkZXIpLnRvKFZhbHVlUGFyYW1Qcm92aWRlci5jbGFzcykpOworICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyKEJpbmRpbmdzLnNlcnZpY2UoYmVhblByb3ZpZGVyKS50byhWYWx1ZVBhcmFtUHJvdmlkZXIuY2xhc3MpKTsKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5yZWdpc3RlcihCaW5kaW5ncy5zZXJ2aWNlKGVudGl0eVByb3ZpZGVyKS50byhWYWx1ZVBhcmFtUHJvdmlkZXIuY2xhc3MpKTsKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5yZWdpc3RlcihCaW5kaW5ncy5zZXJ2aWNlKGNvbnRleHRQcm92aWRlcikudG8oVmFsdWVQYXJhbVByb3ZpZGVyLmNsYXNzKSk7CisKKyAgICAgICAgLy8gUHJvdmlkZSByZXF1ZXN0IHNjb3BlZCBDb250YWluZXJSZXF1ZXN0IHdpdGhvdXQgdGhlIHByb3h5LgorICAgICAgICBQcm92aWRlcjxDb250YWluZXJSZXF1ZXN0PiByZXF1ZXN0ID0gKCkgLT4geworICAgICAgICAgICAgUmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0UmVmZXJlbmNlIHJlZmVyZW5jZSA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoUmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0UmVmZXJlbmNlLmNsYXNzKTsKKyAgICAgICAgICAgIHJldHVybiByZWZlcmVuY2UuZ2V0KCkucmVxdWVzdCgpOworICAgICAgICB9OworCisgICAgICAgIHJlZ2lzdGVyUmVzb2x2ZXIoaW5qZWN0aW9uTWFuYWdlciwgYXN5bmNQcm92aWRlciwgU3VzcGVuZGVkLmNsYXNzLCByZXF1ZXN0KTsKKyAgICAgICAgcmVnaXN0ZXJSZXNvbHZlcihpbmplY3Rpb25NYW5hZ2VyLCBjb29raWVQcm92aWRlciwgQ29va2llUGFyYW0uY2xhc3MsIHJlcXVlc3QpOworICAgICAgICByZWdpc3RlclJlc29sdmVyKGluamVjdGlvbk1hbmFnZXIsIGZvcm1Qcm92aWRlciwgRm9ybVBhcmFtLmNsYXNzLCByZXF1ZXN0KTsKKyAgICAgICAgcmVnaXN0ZXJSZXNvbHZlcihpbmplY3Rpb25NYW5hZ2VyLCBoZWFkZXJQcm92aWRlciwgSGVhZGVyUGFyYW0uY2xhc3MsIHJlcXVlc3QpOworICAgICAgICByZWdpc3RlclJlc29sdmVyKGluamVjdGlvbk1hbmFnZXIsIG1hdHJpeFByb3ZpZGVyLCBNYXRyaXhQYXJhbS5jbGFzcywgcmVxdWVzdCk7CisgICAgICAgIHJlZ2lzdGVyUmVzb2x2ZXIoaW5qZWN0aW9uTWFuYWdlciwgcGF0aFByb3ZpZGVyLCBQYXRoUGFyYW0uY2xhc3MsIHJlcXVlc3QpOworICAgICAgICByZWdpc3RlclJlc29sdmVyKGluamVjdGlvbk1hbmFnZXIsIHF1ZXJ5UHJvdmlkZXIsIFF1ZXJ5UGFyYW0uY2xhc3MsIHJlcXVlc3QpOworICAgICAgICByZWdpc3RlclJlc29sdmVyKGluamVjdGlvbk1hbmFnZXIsIHdlYlRhcmdldFByb3ZpZGVyLCBVcmkuY2xhc3MsIHJlcXVlc3QpOworICAgICAgICByZWdpc3RlclJlc29sdmVyKGluamVjdGlvbk1hbmFnZXIsIGJlYW5Qcm92aWRlciwgQmVhblBhcmFtLmNsYXNzLCByZXF1ZXN0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVnaXN0ZXJSZXNvbHZlcihJbmplY3Rpb25NYW5hZ2VyIGltLCBWYWx1ZVBhcmFtUHJvdmlkZXIgdmZwLCBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gYW5ub3RhdGlvbiwKKyAgICAgICAgICAgIFByb3ZpZGVyPENvbnRhaW5lclJlcXVlc3Q+IHJlcXVlc3QpIHsKKyAgICAgICAgaW0ucmVnaXN0ZXIoQmluZGluZ3MuaW5qZWN0aW9uUmVzb2x2ZXIobmV3IFBhcmFtSW5qZWN0aW9uUmVzb2x2ZXI8Pih2ZnAsIGFubm90YXRpb24sIHJlcXVlc3QpKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcG9zdEluaXQoSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyLCBCb290c3RyYXBCYWcgYm9vdHN0cmFwQmFnKSB7CisgICAgICAgIC8vIEFkZCB0aGUgVmFsdWVTdXBwbGllclByb3ZpZGVycyB3aGljaCBoYXMgYmVlbiBhZGRlZCB0byBSZXNvdXJjZUNvbmZpZy9GZWF0dXJlCisgICAgICAgIExpc3Q8VmFsdWVQYXJhbVByb3ZpZGVyPiBhZGRlZEluc3RhbmNlcyA9IGluamVjdGlvbk1hbmFnZXIuZ2V0QWxsSW5zdGFuY2VzKFZhbHVlUGFyYW1Qcm92aWRlci5jbGFzcyk7CisgICAgICAgIGlmICghYWRkZWRJbnN0YW5jZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBTZXJ2ZXJCb290c3RyYXBCYWcgc2VydmVyQmFnID0gKFNlcnZlckJvb3RzdHJhcEJhZykgYm9vdHN0cmFwQmFnOworICAgICAgICAgICAgYWRkZWRJbnN0YW5jZXMuYWRkQWxsKHNlcnZlckJhZy5nZXRWYWx1ZVBhcmFtUHJvdmlkZXJzKCkpOworICAgICAgICAgICAgc2VydmVyQmFnLnNldFZhbHVlUGFyYW1Qcm92aWRlcnMoQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbihhZGRlZEluc3RhbmNlcykpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L1dlYlRhcmdldFZhbHVlUGFyYW1Qcm92aWRlci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L1dlYlRhcmdldFZhbHVlUGFyYW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YWJhOWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvV2ViVGFyZ2V0VmFsdWVQYXJhbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwzODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLmluamVjdDsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TWFwOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmFibGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5FcnJvcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5Qcm9kdWNlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlByb3BlcnRpZXNIZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5SZWZsZWN0aW9uSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5WYWx1ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uVmFsdWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5DbGllbnRCaW5kaW5nOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5FeHRlbmRlZFVyaUluZm87CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlVyaTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS51cmkuaW50ZXJuYWwuSmVyc2V5VXJpQnVpbGRlcjsKKworLyoqCisgKiBWYWx1ZSBzdXBwbGllciBwcm92aWRlciBzdXBwb3J0aW5nIHRoZSB7QGxpbmsgVXJpfSBpbmplY3Rpb24gYW5ub3RhdGlvbi4KKyAqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitmaW5hbCBjbGFzcyBXZWJUYXJnZXRWYWx1ZVBhcmFtUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFZhbHVlUGFyYW1Qcm92aWRlciB7CisKKyAgICBwcml2YXRlIGZpbmFsIEZ1bmN0aW9uPENsYXNzPD8gZXh0ZW5kcyBDb25maWd1cmF0aW9uPiwgQ29uZmlndXJhdGlvbj4gY2xpZW50Q29uZmlnUHJvdmlkZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBTdXBwbGllcjxDb25maWd1cmF0aW9uPiBzZXJ2ZXJDb25maWc7CisgICAgcHJpdmF0ZSBmaW5hbCBDb25jdXJyZW50TWFwPEJpbmRpbmdNb2RlbCwgVmFsdWU8TWFuYWdlZENsaWVudD4+IG1hbmFnZWRDbGllbnRzOworCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTWFuYWdlZENsaWVudCB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDbGllbnQgaW5zdGFuY2U7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGN1c3RvbUJhc2VVcmk7CisKKyAgICAgICAgcHJpdmF0ZSBNYW5hZ2VkQ2xpZW50KENsaWVudCBpbnN0YW5jZSwgU3RyaW5nIGN1c3RvbUJhc2VVcmkpIHsKKyAgICAgICAgICAgIHRoaXMuaW5zdGFuY2UgPSBpbnN0YW5jZTsKKyAgICAgICAgICAgIHRoaXMuY3VzdG9tQmFzZVVyaSA9IGN1c3RvbUJhc2VVcmk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBCaW5kaW5nTW9kZWwgeworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQmluZGluZ01vZGVsIEVNUFRZID0gbmV3IEJpbmRpbmdNb2RlbChudWxsKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGEgY2xpZW50IGJpbmRpbmcgbW9kZWwgZnJvbSBhIHtAbGluayBDbGllbnRCaW5kaW5nIGNsaWVudCBiaW5kaW5nfSBhbm5vdGF0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYmluZGluZyBjbGllbnQgYmluZGluZyBhbm5vdGF0aW9uLgorICAgICAgICAgKiBAcmV0dXJuIGJpbmRpbmcgbW9kZWwgcmVwcmVzZW50aW5nIGEgc2luZ2xlIGNsaWVudCBiaW5kaW5nIGFubm90YXRpb24uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIEJpbmRpbmdNb2RlbCBjcmVhdGUoQW5ub3RhdGlvbiBiaW5kaW5nKSB7CisgICAgICAgICAgICBpZiAoYmluZGluZyA9PSBudWxsIHx8IGJpbmRpbmcuYW5ub3RhdGlvblR5cGUoKS5nZXRBbm5vdGF0aW9uKENsaWVudEJpbmRpbmcuY2xhc3MpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRU1QVFk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQmluZGluZ01vZGVsKGJpbmRpbmcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhIGNsaWVudCBiaW5kaW5nIG1vZGVsIGZyb20gYSBzZXQgb2Yge0BsaW5rIENsaWVudEJpbmRpbmcgY2xpZW50IGJpbmRpbmd9CisgICAgICAgICAqIGFubm90YXRpb24gY2FuZGlkYXRlcy4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIEEge0Bjb2RlIENsaWVudEJpbmRpbmd9IG1hcmtlciBtZXRhLWFubm90YXRpb24gaXMgdXNlZCB0byBzZWxlY3QgdGhlIHNldCBvZiBiaW5kaW5nCisgICAgICAgICAqIGFubm90YXRpb25zLiBPbmx5IHRob3NlIGFubm90YXRpb25zIHRoYXQgYXJlIGFubm90YXRlZCB3aXRoIHRoZSBiaW5kaW5nIG1hcmtlcgorICAgICAgICAgKiBtZXRhLWFubm90YXRpb24gYXJlIGNvbnNpZGVyZWQgYXMgYmluZGluZyBhbm5vdGF0aW9ucy4gQWxsIG90aGVyIGFubm90YXRpb25zIGFyZSBmaWx0ZXJlZAorICAgICAgICAgKiBvdXQgYW5kIGlnbm9yZWQuCisgICAgICAgICAqIDwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGJpbmRpbmdDYW5kaWRhdGVzIGNhbmRpZGF0ZSBiaW5kaW5nIGFubm90YXRpb25zLgorICAgICAgICAgKiBAcmV0dXJuIGNvbXBvc2l0ZSBiaW5kaW5nIHJlcHJlc2VudGluZyB0aGUgdW5pb24gb2YgdGhlIGluZGl2aWR1YWwgYmluZGluZyBhbm5vdGF0aW9ucworICAgICAgICAgKiAgICAgICAgIGZvdW5kIGFtb25nIHRoZSBiaW5kaW5nIGNhbmRpZGF0ZXMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIEJpbmRpbmdNb2RlbCBjcmVhdGUoZmluYWwgQ29sbGVjdGlvbjxBbm5vdGF0aW9uPiBiaW5kaW5nQ2FuZGlkYXRlcykgeworICAgICAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxBbm5vdGF0aW9uPiBmaWx0ZXJlZCA9CisgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdDYW5kaWRhdGVzLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihpbnB1dCAtPiBpbnB1dCAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbnB1dC5hbm5vdGF0aW9uVHlwZSgpLmdldEFubm90YXRpb24oQ2xpZW50QmluZGluZy5jbGFzcykgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKworICAgICAgICAgICAgaWYgKGZpbHRlcmVkLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFTVBUWTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZmlsdGVyZWQuc2l6ZSgpID4gMSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKCJUb28gbWFueSBjbGllbnQgYmluZGluZyBhbm5vdGF0aW9ucy4iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCaW5kaW5nTW9kZWwoZmlsdGVyZWQuaXRlcmF0b3IoKS5uZXh0KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uIGFubm90YXRpb247CisgICAgICAgIHByaXZhdGUgZmluYWwgQ2xhc3M8PyBleHRlbmRzIENvbmZpZ3VyYXRpb24+IGNvbmZpZ0NsYXNzOworICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaW5oZXJpdFByb3ZpZGVyczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYmFzZVVyaTsKKworICAgICAgICBwcml2YXRlIEJpbmRpbmdNb2RlbChBbm5vdGF0aW9uIGFubm90YXRpb24pIHsKKyAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmFubm90YXRpb24gPSBudWxsOworICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnQ2xhc3MgPSBDbGllbnRDb25maWcuY2xhc3M7CisgICAgICAgICAgICAgICAgdGhpcy5pbmhlcml0UHJvdmlkZXJzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB0aGlzLmJhc2VVcmkgPSAiIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uID0gYW5ub3RhdGlvbjsKKyAgICAgICAgICAgICAgICBmaW5hbCBDbGllbnRCaW5kaW5nIGNiYSA9IGFubm90YXRpb24uYW5ub3RhdGlvblR5cGUoKS5nZXRBbm5vdGF0aW9uKENsaWVudEJpbmRpbmcuY2xhc3MpOworICAgICAgICAgICAgICAgIHRoaXMuY29uZmlnQ2xhc3MgPSBjYmEuY29uZmlnQ2xhc3MoKTsKKyAgICAgICAgICAgICAgICB0aGlzLmluaGVyaXRQcm92aWRlcnMgPSBjYmEuaW5oZXJpdFNlcnZlclByb3ZpZGVycygpOworICAgICAgICAgICAgICAgIHRoaXMuYmFzZVVyaSA9IGNiYS5iYXNlVXJpKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBjbGllbnQgYmluZGluZyBhbm5vdGF0aW9uIHRoaXMgbW9kZWwgcmVwcmVzZW50cy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBjbGllbnQgYmluZGluZyBhbm5vdGF0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEFubm90YXRpb24gZ2V0QW5ub3RhdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBhbm5vdGF0aW9uOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgY29uZmlndXJhdGlvbiBjbGFzcyB0byBiZSB1c2VkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIGNsaWVudCBjb25maWd1cmF0aW9uIGNsYXNzIHRvIGJlIHVzZWQuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIENvbmZpZ3VyYXRpb24+IGdldENvbmZpZ0NsYXNzKCkgeworICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ0NsYXNzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENoZWNrIGlmIHRoZSBzZXJ2ZXItc2lkZSBwcm92aWRlcnMgc2hvdWxkIGJlIGluaGVyaXRlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgc2VydmVyLXNpZGUgcHJvdmlkZXJzIHNob3VsZCBiZSBpbmhlcml0ZWQsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaW5oZXJpdFByb3ZpZGVycygpIHsKKyAgICAgICAgICAgIHJldHVybiBpbmhlcml0UHJvdmlkZXJzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgY2xpZW50IGJhc2UgVVJJLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIGNsaWVudCBiYXNlIFVSSS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgYmFzZVVyaSgpIHsKKyAgICAgICAgICAgIHJldHVybiBiYXNlVXJpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICAgICAgaWYgKHRoaXMgPT0gbykgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQmluZGluZ01vZGVsIHRoYXQgPSAoQmluZGluZ01vZGVsKSBvOworICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb24gIT0gbnVsbCA/IGFubm90YXRpb24uZXF1YWxzKHRoYXQuYW5ub3RhdGlvbikgOiB0aGF0LmFubm90YXRpb24gPT0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb24gIT0gbnVsbCA/IGFubm90YXRpb24uaGFzaENvZGUoKSA6IDA7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiQmluZGluZ01vZGVseyIKKyAgICAgICAgICAgICAgICAgICAgKyAiYmluZGluZz0iICsgYW5ub3RhdGlvbgorICAgICAgICAgICAgICAgICAgICArICIsIGNvbmZpZ0NsYXNzPSIgKyBjb25maWdDbGFzcworICAgICAgICAgICAgICAgICAgICArICIsIGluaGVyaXRQcm92aWRlcnM9IiArIGluaGVyaXRQcm92aWRlcnMKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBiYXNlVXJpPSIgKyBiYXNlVXJpCisgICAgICAgICAgICAgICAgICAgICsgJ30nOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgV2ViVGFyZ2V0VmFsdWVTdXBwbGllciBpbXBsZW1lbnRzIEZ1bmN0aW9uPENvbnRhaW5lclJlcXVlc3QsIFdlYlRhcmdldD4geworCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHVyaTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBWYWx1ZTxNYW5hZ2VkQ2xpZW50PiBjbGllbnQ7CisKKyAgICAgICAgV2ViVGFyZ2V0VmFsdWVTdXBwbGllcihTdHJpbmcgdXJpLCBWYWx1ZTxNYW5hZ2VkQ2xpZW50PiBjbGllbnQpIHsKKyAgICAgICAgICAgIHRoaXMudXJpID0gdXJpOworICAgICAgICAgICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFdlYlRhcmdldCBhcHBseShDb250YWluZXJSZXF1ZXN0IGNvbnRhaW5lclJlcXVlc3QpIHsKKyAgICAgICAgICAgIC8vIG5vIG5lZWQgZm9yIHRyeS1jYXRjaCAtIHVubGlrZSBmb3IgQCpQYXJhbSBhbm5vdGF0aW9ucywgYW55IGlzc3VlcyB3aXRoIEBVcmkgd291bGQgdXN1YWxseSBiZSBjYXVzZWQKKyAgICAgICAgICAgIC8vIGJ5IGluY29ycmVjdCBzZXJ2ZXIgY29kZSwgc28gdGhlIGRlZmF1bHQgcnVudGltZSBleGNlcHRpb24gbWFwcGluZyB0byA1MDAgaXMgYXBwcm9wcmlhdGUKKyAgICAgICAgICAgIGZpbmFsIEV4dGVuZGVkVXJpSW5mbyB1cmlJbmZvID0gY29udGFpbmVyUmVxdWVzdC5nZXRVcmlJbmZvKCk7CisKKyAgICAgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gcGF0aFBhcmFtVmFsdWVzID0KKyAgICAgICAgICAgICAgICAgICAgdXJpSW5mby5nZXRQYXRoUGFyYW1ldGVycygpLmVudHJ5U2V0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b01hcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwLkVudHJ5OjpnZXRLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGdW5jdGlvbjxNYXAuRW50cnk8U3RyaW5nLCBMaXN0PFN0cmluZz4+LCBPYmplY3Q+KSBzdHJpbmdPYmplY3RFbnRyeSAtPiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gaW5wdXQgPSBzdHJpbmdPYmplY3RFbnRyeS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlucHV0LmlzRW1wdHkoKSA/IG51bGwgOiBpbnB1dC5nZXQoMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKKworICAgICAgICAgICAgSmVyc2V5VXJpQnVpbGRlciB1cmlCdWlsZGVyID0gbmV3IEplcnNleVVyaUJ1aWxkZXIoKS51cmkodGhpcy51cmkpLnJlc29sdmVUZW1wbGF0ZXMocGF0aFBhcmFtVmFsdWVzKTsKKworICAgICAgICAgICAgZmluYWwgTWFuYWdlZENsaWVudCBtYW5hZ2VkQ2xpZW50ID0gY2xpZW50LmdldCgpOworCisgICAgICAgICAgICBpZiAoIXVyaUJ1aWxkZXIuaXNBYnNvbHV0ZSgpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGN1c3RvbUJhc2VVcmkgPSBtYW5hZ2VkQ2xpZW50LmN1c3RvbUJhc2VVcmk7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJvb3RVcmkgPSBjdXN0b21CYXNlVXJpLmlzRW1wdHkoKSA/IHVyaUluZm8uZ2V0QmFzZVVyaSgpLnRvU3RyaW5nKCkgOiBjdXN0b21CYXNlVXJpOworCisgICAgICAgICAgICAgICAgdXJpQnVpbGRlciA9IG5ldyBKZXJzZXlVcmlCdWlsZGVyKCkudXJpKHJvb3RVcmkpLnBhdGgodXJpQnVpbGRlci50b1RlbXBsYXRlKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbWFuYWdlZENsaWVudC5pbnN0YW5jZS50YXJnZXQodXJpQnVpbGRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHRoZSBwcm92aWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2ZXJDb25maWcgICAgICAgIHNlcnZlci1zaWRlIHNlcnZlckNvbmZpZy4KKyAgICAgKiBAcGFyYW0gY2xpZW50Q29uZmlnUHJvdmlkZXIgZnVuY3Rpb24gd2hpY2ggZ2V0IG9yIGNyZWF0ZSBhIG5ldyBjbGllbnQgc2VydmVyQ29uZmlnIGFjY29yZGluZyB0byBwcm92aWRlZCBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgV2ViVGFyZ2V0VmFsdWVQYXJhbVByb3ZpZGVyKFN1cHBsaWVyPENvbmZpZ3VyYXRpb24+IHNlcnZlckNvbmZpZywKKyAgICAgICAgICAgIEZ1bmN0aW9uPENsYXNzPD8gZXh0ZW5kcyBDb25maWd1cmF0aW9uPiwgQ29uZmlndXJhdGlvbj4gY2xpZW50Q29uZmlnUHJvdmlkZXIpIHsKKyAgICAgICAgc3VwZXIobnVsbCwgUGFyYW1ldGVyLlNvdXJjZS5VUkkpOworICAgICAgICB0aGlzLmNsaWVudENvbmZpZ1Byb3ZpZGVyID0gY2xpZW50Q29uZmlnUHJvdmlkZXI7CisgICAgICAgIHRoaXMuc2VydmVyQ29uZmlnID0gc2VydmVyQ29uZmlnOworCisgICAgICAgIHRoaXMubWFuYWdlZENsaWVudHMgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpOworICAgICAgICAvLyBpbml0IGRlZmF1bHQgY2xpZW50CisgICAgICAgIHRoaXMubWFuYWdlZENsaWVudHMucHV0KEJpbmRpbmdNb2RlbC5FTVBUWSwgVmFsdWVzLmxhenkobmV3IFZhbHVlPE1hbmFnZWRDbGllbnQ+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgTWFuYWdlZENsaWVudCBnZXQoKSB7CisgICAgICAgICAgICAgICAgZmluYWwgQ2xpZW50IGNsaWVudDsKKyAgICAgICAgICAgICAgICBpZiAoc2VydmVyQ29uZmlnLmdldCgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBDbGllbnRDb25maWcgY2xpZW50Q29uZmlnID0gbmV3IENsaWVudENvbmZpZygpOworICAgICAgICAgICAgICAgICAgICBjb3B5UHJvdmlkZXJzKHNlcnZlckNvbmZpZy5nZXQoKSwgY2xpZW50Q29uZmlnKTsKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoY2xpZW50Q29uZmlnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNYW5hZ2VkQ2xpZW50KGNsaWVudCwgIiIpOworICAgICAgICAgICAgfQorICAgICAgICB9KSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNvcHlQcm92aWRlcnMoQ29uZmlndXJhdGlvbiBzb3VyY2UsIENvbmZpZ3VyYWJsZTw/PiB0YXJnZXQpIHsKKyAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbiB0YXJnZXRDb25maWcgPSB0YXJnZXQuZ2V0Q29uZmlndXJhdGlvbigpOworICAgICAgICBmb3IgKENsYXNzPD8+IGMgOiBzb3VyY2UuZ2V0Q2xhc3NlcygpKSB7CisgICAgICAgICAgICBpZiAoIXRhcmdldENvbmZpZy5pc1JlZ2lzdGVyZWQoYykpIHsKKyAgICAgICAgICAgICAgICB0YXJnZXQucmVnaXN0ZXIoYywgc291cmNlLmdldENvbnRyYWN0cyhjKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKE9iamVjdCBvIDogc291cmNlLmdldEluc3RhbmNlcygpKSB7CisgICAgICAgICAgICBDbGFzczw/PiBjID0gby5nZXRDbGFzcygpOworICAgICAgICAgICAgaWYgKCF0YXJnZXRDb25maWcuaXNSZWdpc3RlcmVkKG8pKSB7CisgICAgICAgICAgICAgICAgdGFyZ2V0LnJlZ2lzdGVyKGMsIHNvdXJjZS5nZXRDb250cmFjdHMoYykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEZ1bmN0aW9uPENvbnRhaW5lclJlcXVlc3QsID8+IGNyZWF0ZVZhbHVlUHJvdmlkZXIoZmluYWwgUGFyYW1ldGVyIHBhcmFtZXRlcikgeworICAgICAgICByZXR1cm4gRXJyb3JzLnByb2Nlc3NXaXRoRXhjZXB0aW9uKG5ldyBQcm9kdWNlcjxGdW5jdGlvbjxDb250YWluZXJSZXF1ZXN0LCA/Pj4oKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEZ1bmN0aW9uPENvbnRhaW5lclJlcXVlc3QsID8+IGNhbGwoKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHRhcmdldFVyaVRlbXBsYXRlID0gcGFyYW1ldGVyLmdldFNvdXJjZU5hbWUoKTsKKyAgICAgICAgICAgICAgICBpZiAodGFyZ2V0VXJpVGVtcGxhdGUgPT0gbnVsbCB8fCB0YXJnZXRVcmlUZW1wbGF0ZS5sZW5ndGgoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEludmFsaWQgVVJJIHBhcmFtZXRlciBuYW1lCisgICAgICAgICAgICAgICAgICAgIEVycm9ycy53YXJuaW5nKHRoaXMsIExvY2FsaXphdGlvbk1lc3NhZ2VzLklOSkVDVEVEX1dFQlRBUkdFVF9VUklfSU5WQUxJRCh0YXJnZXRVcmlUZW1wbGF0ZSkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiByYXdQYXJhbWV0ZXJUeXBlID0gcGFyYW1ldGVyLmdldFJhd1R5cGUoKTsKKyAgICAgICAgICAgICAgICBpZiAocmF3UGFyYW1ldGVyVHlwZSA9PSBXZWJUYXJnZXQuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQmluZGluZ01vZGVsIGJpbmRpbmcgPSBCaW5kaW5nTW9kZWwuY3JlYXRlKEFycmF5cy48QW5ub3RhdGlvbj5hc0xpc3QocGFyYW1ldGVyLmdldEFubm90YXRpb25zKCkpKTsKKworICAgICAgICAgICAgICAgICAgICBWYWx1ZTxNYW5hZ2VkQ2xpZW50PiBjbGllbnQgPSBtYW5hZ2VkQ2xpZW50cy5nZXQoYmluZGluZyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGllbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50ID0gVmFsdWVzLmxhenkobmV3IFZhbHVlPE1hbmFnZWRDbGllbnQ+KCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBNYW5hZ2VkQ2xpZW50IGdldCgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByZWZpeCA9IGJpbmRpbmcuZ2V0QW5ub3RhdGlvbigpLmFubm90YXRpb25UeXBlKCkuZ2V0TmFtZSgpICsgIi4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYmFzZVVyaVByb3BlcnR5ID0gcHJlZml4ICsgImJhc2VVcmkiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgYnUgPSBzZXJ2ZXJDb25maWcuZ2V0KCkuZ2V0UHJvcGVydHkoYmFzZVVyaVByb3BlcnR5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGN1c3RvbUJhc2VVcmkgPSAoYnUgIT0gbnVsbCkgPyBidS50b1N0cmluZygpIDogYmluZGluZy5iYXNlVXJpKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNvbmZpZ0NsYXNzUHJvcGVydHkgPSBwcmVmaXggKyAiY29uZmlnQ2xhc3MiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGllbnRDb25maWcgY2ZnID0gcmVzb2x2ZUNvbmZpZyhjb25maWdDbGFzc1Byb3BlcnR5LCBiaW5kaW5nKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaW5oZXJpdFByb3ZpZGVyc1Byb3BlcnR5ID0gcHJlZml4ICsgImluaGVyaXRTZXJ2ZXJQcm92aWRlcnMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUHJvcGVydGllc0hlbHBlci5pc1Byb3BlcnR5KHNlcnZlckNvbmZpZy5nZXQoKS5nZXRQcm9wZXJ0eShpbmhlcml0UHJvdmlkZXJzUHJvcGVydHkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGJpbmRpbmcuaW5oZXJpdFByb3ZpZGVycygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5UHJvdmlkZXJzKHNlcnZlckNvbmZpZy5nZXQoKSwgY2ZnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcm9wZXJ0eVByZWZpeCA9IHByZWZpeCArICJwcm9wZXJ0eS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPFN0cmluZz4gY2xpZW50UHJvcGVydGllcyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyQ29uZmlnLmdldCgpLmdldFByb3BlcnR5TmFtZXMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIocHJvcGVydHkgLT4gcHJvcGVydHkuc3RhcnRzV2l0aChwcm9wZXJ0eVByZWZpeCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBwcm9wZXJ0eSA6IGNsaWVudFByb3BlcnRpZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNmZy5wcm9wZXJ0eShwcm9wZXJ0eS5zdWJzdHJpbmcocHJvcGVydHlQcmVmaXgubGVuZ3RoKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJDb25maWcuZ2V0KCkuZ2V0UHJvcGVydHkocHJvcGVydHkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTWFuYWdlZENsaWVudChDbGllbnRCdWlsZGVyLm5ld0NsaWVudChjZmcpLCBjdXN0b21CYXNlVXJpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFZhbHVlPE1hbmFnZWRDbGllbnQ+IHByZXZpb3VzID0gbWFuYWdlZENsaWVudHMucHV0SWZBYnNlbnQoYmluZGluZywgY2xpZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2aW91cyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50ID0gcHJldmlvdXM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBXZWJUYXJnZXRWYWx1ZVN1cHBsaWVyKHRhcmdldFVyaVRlbXBsYXRlLCBjbGllbnQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEVycm9ycy53YXJuaW5nKHRoaXMsIExvY2FsaXphdGlvbk1lc3NhZ2VzLlVOU1VQUE9SVEVEX1VSSV9JTkpFQ1RJT05fVFlQRShyYXdQYXJhbWV0ZXJUeXBlKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBDbGllbnRDb25maWcgcmVzb2x2ZUNvbmZpZyhmaW5hbCBTdHJpbmcgY29uZmlnQ2xhc3NQcm9wZXJ0eSwgZmluYWwgQmluZGluZ01vZGVsIGJpbmRpbmcpIHsKKyAgICAgICAgQ2xhc3M8PyBleHRlbmRzIENvbmZpZ3VyYXRpb24+IGNvbmZpZ0NsYXNzID0gYmluZGluZy5nZXRDb25maWdDbGFzcygpOworICAgICAgICBmaW5hbCBPYmplY3QgX2NjID0gc2VydmVyQ29uZmlnLmdldCgpLmdldFByb3BlcnR5KGNvbmZpZ0NsYXNzUHJvcGVydHkpOworICAgICAgICBpZiAoX2NjICE9IG51bGwpIHsKKyAgICAgICAgICAgIENsYXNzPD8+IGNjOworICAgICAgICAgICAgaWYgKF9jYyBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgICAgIGNjID0gQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoUmVmbGVjdGlvbkhlbHBlci5jbGFzc0Zvck5hbWVQQSgoU3RyaW5nKSBfY2MpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoX2NjIGluc3RhbmNlb2YgQ2xhc3MpIHsKKyAgICAgICAgICAgICAgICBjYyA9IChDbGFzczw/PikgX2NjOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjYyA9IG51bGw7IC8vIHdpbGwgY2F1c2UgYSB3YXJuaW5nCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjYyAhPSBudWxsICYmIENvbmZpZ3VyYXRpb24uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjYykpIHsKKyAgICAgICAgICAgICAgICBjb25maWdDbGFzcyA9IGNjLmFzU3ViY2xhc3MoQ29uZmlndXJhdGlvbi5jbGFzcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEVycm9ycy53YXJuaW5nKHRoaXMsIExvY2FsaXphdGlvbk1lc3NhZ2VzLklMTEVHQUxfQ0xJRU5UX0NPTkZJR19DTEFTU19QUk9QRVJUWV9WQUxVRSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0NsYXNzUHJvcGVydHksCisgICAgICAgICAgICAgICAgICAgICAgICBfY2MsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWdDbGFzcy5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIENvbmZpZ3VyYXRpb24gY2ZnID0gY2xpZW50Q29uZmlnUHJvdmlkZXIuYXBwbHkoY29uZmlnQ2xhc3MpOworCisgICAgICAgIHJldHVybiAoY2ZnIGluc3RhbmNlb2YgQ2xpZW50Q29uZmlnKSA/IChDbGllbnRDb25maWcpIGNmZyA6IG5ldyBDbGllbnRDb25maWcoKS5sb2FkRnJvbShjZmcpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L3BhY2thZ2UtaW5mby5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNWNjOTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoqCisgKiBKZXJzZXkgc2VydmVyLXNpZGUgSkFYLVJTIGluamVjdGlvbiBzdXBwb3J0IGNsYXNzZXMuCisgKi8KK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLmluamVjdDsKZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3JpbmcvQWdncmVnYXRlZFNsaWRpbmdXaW5kb3dUaW1lUmVzZXJ2b2lyLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL0FnZ3JlZ2F0ZWRTbGlkaW5nV2luZG93VGltZVJlc2Vydm9pci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMWE1OGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL0FnZ3JlZ2F0ZWRTbGlkaW5nV2luZG93VGltZVJlc2Vydm9pci5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLm1vbml0b3Jpbmc7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwubW9uaXRvcmluZy5jb3JlLkFic3RyYWN0U2xpZGluZ1dpbmRvd1RpbWVSZXNlcnZvaXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLm1vbml0b3JpbmcuY29yZS5Vbmlmb3JtVGltZVNuYXBzaG90OworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKKy8qKgorICogQWdncmVnYXRlZCBzbGlkaW5nIHdpbmRvdyB0aW1lIHJlc2Vydm9pciBzdG9yZXMgYWdncmVnYXRlZCBtZWFzdXJlbWVudHMgaW4gYSB0aW1lIHdpbmRvdyBvZiBnaXZlbiBzaXplLiBUaGUgcmVzdWx0aW5nIHNuYXBzaG90CisgKiBwcm92aWRlcyBwcmVjaXNlIGRhdGEgYXMgZmFyIGFzIHRoZSBncmFudWxhcml0eSBvZiBhZ2dyZWdhdGluZyB0cmltbWVyIGlzIG5vdCBjb25jZXJuZWQuIFRoZSBncmFudWxhcml0eSBvZiB0aGUgdHJpbW1lcgorICogZGV0ZXJtaW5lcyB0aGUgZ3JhbnVsYXJpdHkgb2YgdGhlIGRhdGEgdGhlIHNuYXBzaG90IHByb3ZpZGVzLiBJbiBvdGhlciB3b3JkcywgdGhlIGFnZ3JlZ2F0ZWQgdmFsdWUgb2JqZWN0IGlzIGVpdGhlciBpbmNsdWRlZCBpbgorICogdGhlIHJlc3VsdGluZyBtZWFzdXJlbWVudHMgb3Igbm90IGRlcGVuZGluZyB3aGV0aGVyIGl0IHdhcyB0cmltbWVkIG9yIG5vdC4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK2NsYXNzIEFnZ3JlZ2F0ZWRTbGlkaW5nV2luZG93VGltZVJlc2Vydm9pciBleHRlbmRzIEFic3RyYWN0U2xpZGluZ1dpbmRvd1RpbWVSZXNlcnZvaXI8QWdncmVnYXRlZFZhbHVlT2JqZWN0PiB7CisKKyAgICBwcml2YXRlIGZpbmFsIEFnZ3JlZ2F0aW5nVHJpbW1lciBub3RpZmllcjsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gYWdncmVnYXRlZCBzbGlkaW5nIHdpbmRvdyByZXNlcnZvaXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd2luZG93IFRoZSB0aW1lIHNpemUgb2YgdGhlIHdpbmRvdworICAgICAqIEBwYXJhbSB3aW5kb3dVbml0IFRoZSB1bml0IG9mIHRoZSB3aW5kb3cgc2l6ZQorICAgICAqIEBwYXJhbSBzdGFydFRpbWUgVGhlIHN0YXJ0IHRpbWUgZnJvbSB3aGVuIHRvIGNhbGN1bGF0ZSB0aGUgc3RhdGlzdGljcworICAgICAqIEBwYXJhbSBzdGFydFRpbWVVbml0IFRoZSB1bml0IG9mIHRoZSBzdGFydCB0aW1lCisgICAgICogQHBhcmFtIG5vdGlmaWVyIFRoZSBhZ2dyZWdhdGluZyB0cmltbWVyIHRoYXQgcHJvZHVjZXMgdGhlIGFnZ3JlZ2F0ZWQgZGF0YQorICAgICAqLworICAgIHB1YmxpYyBBZ2dyZWdhdGVkU2xpZGluZ1dpbmRvd1RpbWVSZXNlcnZvaXIoCisgICAgICAgICAgICBmaW5hbCBsb25nIHdpbmRvdywKKyAgICAgICAgICAgIGZpbmFsIFRpbWVVbml0IHdpbmRvd1VuaXQsCisgICAgICAgICAgICBmaW5hbCBsb25nIHN0YXJ0VGltZSwKKyAgICAgICAgICAgIGZpbmFsIFRpbWVVbml0IHN0YXJ0VGltZVVuaXQsIGZpbmFsIEFnZ3JlZ2F0aW5nVHJpbW1lciBub3RpZmllcikgeworICAgICAgICBzdXBlcih3aW5kb3csIHdpbmRvd1VuaXQsIHN0YXJ0VGltZSwgc3RhcnRUaW1lVW5pdCk7CisgICAgICAgIHRoaXMubm90aWZpZXIgPSBub3RpZmllcjsKKyAgICAgICAgbm90aWZpZXIucmVnaXN0ZXIodGhpcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFVuaWZvcm1UaW1lU25hcHNob3Qgc25hcHNob3QoZmluYWwgQ29sbGVjdGlvbjxBZ2dyZWdhdGVkVmFsdWVPYmplY3Q+IHZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBsb25nIHRpbWVJbnRlcnZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUaW1lVW5pdCB0aW1lSW50ZXJ2YWxVbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUaW1lVW5pdCB0aW1lVW5pdCkgeworICAgICAgICBmaW5hbCBVbmlmb3JtVGltZVNuYXBzaG90IG5vdFRyaW1tZWRNZWFzdXJlbWVudHNTbmFwc2hvdCA9IG5vdGlmaWVyLmdldFRpbWVSZXNlcnZvaXJOb3RpZmllcigpCisgICAgICAgICAgICAgICAgLmdldFNuYXBzaG90KHRpbWUsIHRpbWVVbml0KTsKKworICAgICAgICBBZ2dyZWdhdGVkVmFsdWVPYmplY3RbXSBhcnJheVZhbHVlcyA9IG5ldyBBZ2dyZWdhdGVkVmFsdWVPYmplY3RbdmFsdWVzLnNpemUoKV07CisgICAgICAgIGFycmF5VmFsdWVzID0gdmFsdWVzLnRvQXJyYXkoYXJyYXlWYWx1ZXMpOworICAgICAgICBsb25nIG1pbiA9IExvbmcuTUFYX1ZBTFVFOworICAgICAgICBsb25nIG1heCA9IExvbmcuTUlOX1ZBTFVFOworICAgICAgICBsb25nIGNvdW50ID0gMDsKKyAgICAgICAgZG91YmxlIG1lYW5OdW1lcmF0b3IgPSAwOworCisgICAgICAgIGZvciAoQWdncmVnYXRlZFZhbHVlT2JqZWN0IHZhbHVlIDogYXJyYXlWYWx1ZXMpIHsKKyAgICAgICAgICAgIG1pbiA9IE1hdGgubWluKG1pbiwgdmFsdWUuZ2V0TWluKCkpOworICAgICAgICAgICAgbWF4ID0gTWF0aC5tYXgobWF4LCB2YWx1ZS5nZXRNYXgoKSk7CisgICAgICAgICAgICBjb3VudCArPSB2YWx1ZS5nZXRDb3VudCgpOworICAgICAgICAgICAgbWVhbk51bWVyYXRvciArPSB2YWx1ZS5nZXRDb3VudCgpICogdmFsdWUuZ2V0TWVhbigpOworICAgICAgICB9CisgICAgICAgIGlmIChub3RUcmltbWVkTWVhc3VyZW1lbnRzU25hcHNob3Quc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgbWluID0gTWF0aC5taW4obWluLCBub3RUcmltbWVkTWVhc3VyZW1lbnRzU25hcHNob3QuZ2V0TWluKCkpOworICAgICAgICAgICAgbWF4ID0gTWF0aC5tYXgobWF4LCBub3RUcmltbWVkTWVhc3VyZW1lbnRzU25hcHNob3QuZ2V0TWF4KCkpOworICAgICAgICAgICAgY291bnQgKz0gbm90VHJpbW1lZE1lYXN1cmVtZW50c1NuYXBzaG90LnNpemUoKTsKKyAgICAgICAgICAgIG1lYW5OdW1lcmF0b3IgKz0gbm90VHJpbW1lZE1lYXN1cmVtZW50c1NuYXBzaG90LnNpemUoKSAqIG5vdFRyaW1tZWRNZWFzdXJlbWVudHNTbmFwc2hvdC5nZXRNZWFuKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY291bnQgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBVbmlmb3JtVGltZVNpbXBsZVNuYXBzaG90KDAsIDAsIDAsIDAsIHRpbWVJbnRlcnZhbCwgdGltZUludGVydmFsVW5pdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFVuaWZvcm1UaW1lU2ltcGxlU25hcHNob3QobWF4LCBtaW4sIG1lYW5OdW1lcmF0b3IgLyBjb3VudCwgY291bnQsIHRpbWVJbnRlcnZhbCwgdGltZUludGVydmFsVW5pdCk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3JpbmcvQWdncmVnYXRlZFZhbHVlT2JqZWN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL0FnZ3JlZ2F0ZWRWYWx1ZU9iamVjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlYmQzOWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL0FnZ3JlZ2F0ZWRWYWx1ZU9iamVjdC5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5tb25pdG9yaW5nOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CisKKy8qKgorICogQWdncmVnYXRlZCB2YWx1ZSBvYmplY3Qgc3RvcmVzIGFnZ3JlZ2F0ZWQgbWVhc3VyZW1lbnRzIGZvciBwcm92aWRlZCBzZXQgb2YgZGF0YS4gVGhlIHB1cnBvc2Ugb2YgYWdncmVnYXRpb24gaXMgdG8gYXZvaWQgaGlnaAorICogbWVtb3J5IGFuZCBwcm9jZXNzb3IgdGltZSByZXF1aXJlbWVudHMgZm9yIHRoZSBjYWxjdWxhdGlvbiBvZiBzdGF0aXN0aWNzLgorICoKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLworY2xhc3MgQWdncmVnYXRlZFZhbHVlT2JqZWN0IHsKKworICAgIHByaXZhdGUgZmluYWwgbG9uZyBtYXg7CisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIG1pbjsKKyAgICBwcml2YXRlIGZpbmFsIGRvdWJsZSBtZWFuOworICAgIHByaXZhdGUgZmluYWwgbG9uZyBjb3VudDsKKworICAgIHByaXZhdGUgQWdncmVnYXRlZFZhbHVlT2JqZWN0KGZpbmFsIGxvbmcgbWF4LCBmaW5hbCBsb25nIG1pbiwgZmluYWwgZG91YmxlIG1lYW4sIGZpbmFsIGxvbmcgY291bnQpIHsKKyAgICAgICAgdGhpcy5tYXggPSBtYXg7CisgICAgICAgIHRoaXMubWluID0gbWluOworICAgICAgICB0aGlzLm1lYW4gPSBtZWFuOworICAgICAgICB0aGlzLmNvdW50ID0gY291bnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhZ2dyZWdhdGVkIHZhbHVlIG9iamVjdCBmb3IgbW9uaXRvcmluZyBzdGF0aXN0aWNzIGJhc2VkIG9uIHRoZSBwcm92aWRlZCB2YWx1ZXMuIER1cmluZyB0aGUgY29uc3RydWN0aW9uLCB0aGUgdmFsdWVzCisgICAgICogY29sbGVjdGlvbiBtdXN0IG5vdCBiZSBtb2RpZmllZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZXMgVGhlIGNvbGxlY3Rpb24gdG8gY3JlYXRlIHRoZSBhZ2dyZWdhdGVkIHN0YXRpc3RpY3MgZnJvbS4KKyAgICAgKiBAcmV0dXJuIEFnZ3JlZ2F0ZWQgdmFsdWUgb2JqZWN0IGZvciBwcm92aWRlZCBhcmd1bWVudHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBBZ2dyZWdhdGVkVmFsdWVPYmplY3QgY3JlYXRlRnJvbVZhbHVlcyhDb2xsZWN0aW9uPExvbmc+IHZhbHVlcykgeworICAgICAgICBpZiAodmFsdWVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgLy8gYWdncmVnYXRlZCBvYmplY3RzIG11c3QgYmUgY3JlYXRlZCBmb3IgYXQgbGVhc3Qgb25lIHZhbHVlLCBhZGRpdGlvbmFsbHksIHByZXZlbnQgZnJvbSBkaXZpc2lvbiBieSB6ZXJvIGluIHRoZSBtZWFuCisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgdmFsdWVzIGNvbGxlY3Rpb24gbXVzdCBub3QgYmUgZW1wdHkiKTsKKyAgICAgICAgfQorCisgICAgICAgIGxvbmcgbWF4ID0gTG9uZy5NSU5fVkFMVUU7CisgICAgICAgIGxvbmcgbWluID0gTG9uZy5NQVhfVkFMVUU7CisgICAgICAgIGxvbmcgc3VtID0gMDsKKyAgICAgICAgZm9yIChMb25nIHZhbHVlIDogdmFsdWVzKSB7CisgICAgICAgICAgICBtYXggPSBNYXRoLm1heChtYXgsIHZhbHVlKTsKKyAgICAgICAgICAgIG1pbiA9IE1hdGgubWluKG1pbiwgdmFsdWUpOworICAgICAgICAgICAgc3VtICs9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ldyBBZ2dyZWdhdGVkVmFsdWVPYmplY3QobWF4LCBtaW4sIChkb3VibGUpIHN1bSAvIHZhbHVlcy5zaXplKCksIHZhbHVlcy5zaXplKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYWdncmVnYXRlZCB2YWx1ZSBvYmplY3QgZm9yIG1vbml0b3Jpbmcgc3RhdGlzdGljcyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgY29sbGVjdGlvbiBvZiB2YWx1ZXMuIER1cmluZyB0aGUKKyAgICAgKiBjb25zdHJ1Y3Rpb24sIHRoZSB2YWx1ZXMgY29sbGVjdGlvbiBtdXN0IG5vdCBiZSBtb2RpZmllZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZXMgVGhlIGNvbGxlY3Rpb24gdG8gY3JlYXRlIHRoZSBhZ2dyZWdhdGVkIHN0YXRpc3RpY3MgZnJvbS4KKyAgICAgKiBAcmV0dXJuIEFnZ3JlZ2F0ZWQgdmFsdWUgb2JqZWN0IGZvciBwcm92aWRlZCBhcmd1bWVudHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBBZ2dyZWdhdGVkVmFsdWVPYmplY3QgY3JlYXRlRnJvbU11bHRpVmFsdWVzKENvbGxlY3Rpb248PyBleHRlbmRzIENvbGxlY3Rpb248TG9uZz4+IHZhbHVlcykgeworICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPExvbmc+IG1lcmdlZENvbGxlY3Rpb24gPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIGZvciAoQ29sbGVjdGlvbjxMb25nPiBjb2xsZWN0aW9uIDogdmFsdWVzKSB7CisgICAgICAgICAgICBtZXJnZWRDb2xsZWN0aW9uLmFkZEFsbChjb2xsZWN0aW9uKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3JlYXRlRnJvbVZhbHVlcyhtZXJnZWRDb2xsZWN0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSBtYXhpbXVtIHZhbHVlIG9mIHRoZSBhZ2dyZWdhdGVkIGRhdGEKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRNYXgoKSB7CisgICAgICAgIHJldHVybiBtYXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgbWluaW11bSB2YWx1ZSBvZiB0aGUgYWdncmVnYXRlZCBkYXRhCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0TWluKCkgeworICAgICAgICByZXR1cm4gbWluOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIG1lYW4gb2YgdGhlIGFnZ3JlZ2F0ZWQgZGF0YQorICAgICAqLworICAgIHB1YmxpYyBkb3VibGUgZ2V0TWVhbigpIHsKKyAgICAgICAgcmV0dXJuIG1lYW47CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgdG90YWwgbnVtYmVyIG9mIHRoZSB2YWx1ZXMgdGhpcyBhZ2dyZWdhdGVkIGRhdGEgcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dAorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldENvdW50KCkgeworICAgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9BZ2dyZWdhdGluZ1RyaW1tZXIuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3JpbmcvQWdncmVnYXRpbmdUcmltbWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc5OWU2MAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3JpbmcvQWdncmVnYXRpbmdUcmltbWVyLmphdmEKQEAgLTAsMCArMSwxNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLm1vbml0b3Jpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5OYXZpZ2FibGVNYXA7CitpbXBvcnQgamF2YS51dGlsLlNvcnRlZE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TmF2aWdhYmxlTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvcHlPbldyaXRlQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmEuVHJlZU11bHRpbWFwOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5tb25pdG9yaW5nLmNvcmUuU2xpZGluZ1dpbmRvd1RyaW1tZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLm1vbml0b3JpbmcuY29yZS5UaW1lUmVzZXJ2b2lyOworCitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5tb25pdG9yaW5nLmNvcmUuUmVzZXJ2b2lyQ29uc3RhbnRzLkNPTExJU0lPTl9CVUZGRVJfUE9XRVI7CisKKy8qKgorICogQW4gYWdncmVnYXRpbmcgdHJpbW1lciBmb3Igc2xpZGluZyB3aW5kb3cgbWVhc3VyZW1lbnRzLiBUaGlzIHRyaW1tZXIgdXBkYXRlcyByZWdpc3RlcmVkIHRpbWUgcmVzZXJ2b2lycyB3aXRoIHRoZSBhZ2dyZWdhdGVkCisgKiBtZWFzdXJlbWVudHMgZm9yIHRoZSB2YWx1ZXMgaXQgdHJpbW1lZC4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK2NsYXNzIEFnZ3JlZ2F0aW5nVHJpbW1lciBpbXBsZW1lbnRzIFNsaWRpbmdXaW5kb3dUcmltbWVyPExvbmc+IHsKKworICAgIHByaXZhdGUgZmluYWwgTGlzdDxUaW1lUmVzZXJ2b2lyPEFnZ3JlZ2F0ZWRWYWx1ZU9iamVjdD4+IGFnZ3JlZ2F0ZWRSZXNlcnZvaXJMaXN0ZW5lcnMgPSBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3Q8PigpOworICAgIHByaXZhdGUgVGltZVJlc2Vydm9pcjxMb25nPiB0aW1lUmVzZXJ2b2lyTm90aWZpZXI7CisKKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgc3RhcnRUaW1lOworICAgIHByaXZhdGUgZmluYWwgVGltZVVuaXQgc3RhcnRVbml0VGltZTsKKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgY2h1bmtTaXplOworCisgICAgLyoqCisgICAgICogVGhlIGxvY2sgdGhhdCBwcmV2ZW50cyBvdGhlciB0aHJlYWRzIHRvIHRyaW0gdGhlIGFzc29jaWF0ZWQgcmVzZXJ2b2lyIGluIHBhcmFsbGVsLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgQXRvbWljQm9vbGVhbiBsb2NrZWQgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIHRoZSB0cmltbWVyIHRoYXQgdXBkYXRlcyB0aGUgcmVnaXN0ZXJlZCB0aW1lIHJlc2Vydm9pcnMgd2l0aCB0aGUgYWdncmVnYXRlZCBtZWFzdXJlbWVudHMgZm9yIHRoZSB2YWx1ZXMgaXQKKyAgICAgKiB0cmltbWVkLgorICAgICAqCisgICAgICogQHBhcmFtIHN0YXJ0VGltZSAgICAgICAgIFRoZSBzdGFydCB0aW1lIHRoYXQgZGV0ZXJtaW5lcyB0aGUgb2Zmc2V0IGZvciB0aGUgY2h1bmtzLgorICAgICAqIEBwYXJhbSBzdGFydFVuaXRUaW1lICAgICBUaGUgdGltZSB1bml0IG9mIHRoZSBzdGFydCB0aW1lLgorICAgICAqIEBwYXJhbSBjaHVua1RpbWVTaXplICAgICBUaGUgc2l6ZSBvZiBvbmUgInRpbWUgY2h1bmsiLgorICAgICAqIEBwYXJhbSBjaHVua1RpbWVTaXplVW5pdCBUaGUgdGltZSB1bml0IG9mIHRoZSB0aW1lIGNodW5rLgorICAgICAqLworICAgIHB1YmxpYyBBZ2dyZWdhdGluZ1RyaW1tZXIoZmluYWwgbG9uZyBzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUaW1lVW5pdCBzdGFydFVuaXRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBjaHVua1RpbWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVGltZVVuaXQgY2h1bmtUaW1lU2l6ZVVuaXQpIHsKKyAgICAgICAgdGhpcy5zdGFydFRpbWUgPSBzdGFydFRpbWU7CisgICAgICAgIHRoaXMuc3RhcnRVbml0VGltZSA9IHN0YXJ0VW5pdFRpbWU7CisgICAgICAgIHRoaXMuY2h1bmtTaXplID0gVGltZVVuaXQuTkFOT1NFQ09ORFMuY29udmVydChjaHVua1RpbWVTaXplLCBjaHVua1RpbWVTaXplVW5pdCkgPDwgQ09MTElTSU9OX0JVRkZFUl9QT1dFUjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0cmltKGZpbmFsIENvbmN1cnJlbnROYXZpZ2FibGVNYXA8TG9uZywgTG9uZz4gbWFwLCBmaW5hbCBsb25nIGtleSkgeworICAgICAgICBpZiAoIWxvY2tlZC5jb21wYXJlQW5kU2V0KGZhbHNlLCB0cnVlKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFRyZWVNdWx0aW1hcDxMb25nLCBMb25nPiB0cmltTXVsdGlNYXAgPSBUcmVlTXVsdGltYXAuY3JlYXRlKCk7CisgICAgICAgIGZpbmFsIE5hdmlnYWJsZU1hcDxMb25nLCBDb2xsZWN0aW9uPExvbmc+PiB0cmltTWFwID0gdHJpbU11bHRpTWFwLmFzTWFwKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIENvbmN1cnJlbnROYXZpZ2FibGVNYXA8TG9uZywgTG9uZz4gaGVhZE1hcCA9IG1hcC5oZWFkTWFwKGtleSk7CisgICAgICAgICAgICB3aGlsZSAoIWhlYWRNYXAuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgLy8gaGVhZE1hcCBpdHNlbGYgaXMgYmVpbmcgYWNjZXNzZWQgd2l0aCB1cGRhdGVzIGZyb20gb3RoZXIgdGhyZWFkcworICAgICAgICAgICAgICAgIGZpbmFsIE1hcC5FbnRyeTxMb25nLCBMb25nPiBlbnRyeSA9IGhlYWRNYXAucG9sbEZpcnN0RW50cnkoKTsKKyAgICAgICAgICAgICAgICB0cmltTXVsdGlNYXAucHV0KGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIG5vdyB0aGUgaGVhZE1hcCBpcyB0cmltbWVkLi4uCisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBsb2NrZWQuc2V0KGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoTWFwLkVudHJ5PExvbmcsIENvbGxlY3Rpb248TG9uZz4+IGZpcnN0RW50cnkgPSB0cmltTWFwLmZpcnN0RW50cnkoKTsgZmlyc3RFbnRyeSAhPSBudWxsOworICAgICAgICAgICAgICAgIGZpcnN0RW50cnkgPSB0cmltTWFwLmZpcnN0RW50cnkoKSkgeworICAgICAgICAgICAgbG9uZyBjaHVua0xvd2VyQm91bmQgPSBsb3dlckJvdW5kKGZpcnN0RW50cnkuZ2V0S2V5KCkpOworICAgICAgICAgICAgbG9uZyBjaHVua1VwcGVyQm91bmQgPSB1cHBlckJvdW5kKGNodW5rTG93ZXJCb3VuZCwga2V5KTsKKworICAgICAgICAgICAgLy8gbm93LCB3ZSBuZWVkIHRvIHByb2Nlc3MgYW5kIHRoZW4gcmVtb3ZlIGVudHJpZXMgYXQgaW50ZXJ2YWwgW2NodW5rTG93ZXJCb3VuZCwgY2h1bmtVcHBlckJvdW5kKQorICAgICAgICAgICAgU29ydGVkTWFwPExvbmcsIENvbGxlY3Rpb248TG9uZz4+IGNodW5rTWFwID0gdHJpbU1hcC5oZWFkTWFwKGNodW5rVXBwZXJCb3VuZCk7CisKKyAgICAgICAgICAgIGZpbmFsIEFnZ3JlZ2F0ZWRWYWx1ZU9iamVjdCBhZ2dyZWdhdGVkVmFsdWVPYmplY3QgPSBBZ2dyZWdhdGVkVmFsdWVPYmplY3QuY3JlYXRlRnJvbU11bHRpVmFsdWVzKGNodW5rTWFwLnZhbHVlcygpKTsKKworICAgICAgICAgICAgLy8gdXBkYXRlIGFsbCBsaXN0ZW5pbmcgYWdncmVnYXRlZCByZXNlcnZvaXJzCisgICAgICAgICAgICBmb3IgKFRpbWVSZXNlcnZvaXI8QWdncmVnYXRlZFZhbHVlT2JqZWN0PiBhZ2dyZWdhdGVkUmVzZXJ2b2lyIDogYWdncmVnYXRlZFJlc2Vydm9pckxpc3RlbmVycykgeworICAgICAgICAgICAgICAgIGFnZ3JlZ2F0ZWRSZXNlcnZvaXIKKyAgICAgICAgICAgICAgICAgICAgICAgIC51cGRhdGUoYWdncmVnYXRlZFZhbHVlT2JqZWN0LCBjaHVua0xvd2VyQm91bmQgPj4gQ09MTElTSU9OX0JVRkZFUl9QT1dFUiwgVGltZVVuaXQuTkFOT1NFQ09ORFMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjbGVhbiB1cCB0aGUgY2h1bmssIHdoaWNoIGFsc28gcmVtb3ZlcyBpdHMgaXRlbXMgZnJvbSB0aGUgJ3RyaW1NYXAnCisgICAgICAgICAgICBjaHVua01hcC5jbGVhcigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBsb25nIHVwcGVyQm91bmQoZmluYWwgbG9uZyBjaHVua0xvd2VyQm91bmQsIGZpbmFsIGxvbmcga2V5KSB7CisgICAgICAgIGZpbmFsIGxvbmcgY2h1bmtVcHBlckJvdW5kQ2FuZGlkYXRlID0gY2h1bmtMb3dlckJvdW5kICsgY2h1bmtTaXplOworICAgICAgICByZXR1cm4gY2h1bmtVcHBlckJvdW5kQ2FuZGlkYXRlIDwga2V5ID8gY2h1bmtVcHBlckJvdW5kQ2FuZGlkYXRlIDoga2V5OworICAgIH0KKworICAgIHByaXZhdGUgbG9uZyBsb3dlckJvdW5kKGZpbmFsIExvbmcga2V5KSB7CisgICAgICAgIHJldHVybiBsb3dlckJvdW5kKGtleSwgVGltZVVuaXQuTkFOT1NFQ09ORFMuY29udmVydChzdGFydFRpbWUsIHN0YXJ0VW5pdFRpbWUpLCBjaHVua1NpemUsCisgICAgICAgICAgICAgICAgQ09MTElTSU9OX0JVRkZFUl9QT1dFUik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FsY3VsYXRlcyBsb3dlciBib3VuZCBmb3IgZ2l2ZW4ga2V5IHNvIHRoYXQgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlIHRydWUKKyAgICAgKiA8cHJlPjx1bD4KKyAgICAgKiAgICAgPGxpPntAY29kZSBsb3dlckJvdW5kIDw9IGtleSAmJiBrZXkgPCBsb3dlckJvdW5kICsgY2h1bmtTaXplfTwvbGk+CisgICAgICogICAgIDxsaT5UaGUgbG93ZXIgYm91bmQgaXMgYSBtdWx0aXBsZSBvZiBjaHVuayBzaXplIHdpdGggYW4gb2Zmc2V0IGNhbGN1bGF0ZWQgYXMge0Bjb2RlIChzdGFydFRpbWUgJSBjaHVua1NpemUpIDw8CisgICAgICogcG93ZXJ9PC9saT4KKyAgICAgKiA8L3VsPjwvcHJlPgorICAgICAqIE5vdGUgdGhlIG9mZnNldCBjYWxjdWxhdGlvbiBpcyBkZXRlcm1pbmVkIGJ5IHN0YXJ0IHRpbWUgYmVjYXVzZSBub3QgYWx3YXlzIG9uZSBsb3dlciBib3VuZCBmcm9tIHRoZSBzZXF1ZW5jZSBvZiBhbGwgbG93ZXIKKyAgICAgKiBib3VuZHMgZm9yIGdpdmVuIGFyZ3VtZW50cyBpcyBlcXVhbCB0byAwLjxici8+IFRoZSBwb3dlciBpcyB1c2VkIHRvIHNoaWZ0IHRoZSBvZmZzZXQgYmVjYXVzZSBhbGwgdGhlIGtleXMgYXJlIGFsc28gZXhwZWN0ZWQKKyAgICAgKiB0byBiZSBzaGlmdGVkIHdpdGggdGhlIHBvd2VyLgorICAgICAqCisgICAgICogQHBhcmFtIGtleSAgICAgICBUaGUga2V5IHRvIGZpbmQgdGhlIGxvd2VyIGJvdW5kIGZvci4KKyAgICAgKiBAcGFyYW0gc3RhcnRUaW1lIFRoZSBzdGFydCB0aW1lIHRoYXQgZGV0ZXJtaW5lcyB0aGUgb2Zmc2V0IGZvciB0aGUgY2h1bmtzLgorICAgICAqIEBwYXJhbSBjaHVua1NpemUgVGhlIHNpemUgb2Ygb25lIGNodW5rLgorICAgICAqIEBwYXJhbSBwb3dlciAgICAgVGhlIHBvd2VyIHRoZSBrZXlzIGFyZSBleHBlY3RlZCB0byBiZSBzaGlmdGVkIHdpdGguCisgICAgICogQHJldHVybiBUaGUgbG93ZXIgYm91bmQgZm9yIGdpdmVuIGFyZ3VtZW50cyBzYXRpc2Z5aW5nIGNvbmRpdGlvbnMgc3RhdGVkIGFib3ZlLgorICAgICAqLworICAgIHN0YXRpYyBsb25nIGxvd2VyQm91bmQoZmluYWwgbG9uZyBrZXksIGZpbmFsIGxvbmcgc3RhcnRUaW1lLCBmaW5hbCBsb25nIGNodW5rU2l6ZSwgZmluYWwgaW50IHBvd2VyKSB7CisgICAgICAgIGZpbmFsIGxvbmcgb2Zmc2V0ID0gKHN0YXJ0VGltZSAlIGNodW5rU2l6ZSkgPDwgcG93ZXI7CisgICAgICAgIGlmIChrZXkgLSBvZmZzZXQgPj0gMCkgeworICAgICAgICAgICAgcmV0dXJuICgoa2V5IC0gb2Zmc2V0KSAvIGNodW5rU2l6ZSAqIGNodW5rU2l6ZSkgKyBvZmZzZXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gKChrZXkgLSBvZmZzZXQgLSBjaHVua1NpemUgKyAxKSkgLyBjaHVua1NpemUgKiBjaHVua1NpemUgKyBvZmZzZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgZ2l2ZW4gYWdncmVnYXRpbmcgc2xpZGluZyB3aW5kb3cgcmVzZXJ2b2lyIHRvIGdldCB1cGRhdGVzIGZyb20gdGhpcyB0cmltbWVyLgorICAgICAqCisgICAgICogQHBhcmFtIHRpbWVSZXNlcnZvaXJMaXN0ZW5lciBUaGUgYWdncmVnYXRlZCBzbGlkaW5nIHdpbmRvdyByZXNlcnZvaXIgdG8gdXBkYXRlIHdpdGggdHJpbW1lZCBtZWFzdXJlbWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlcihmaW5hbCBUaW1lUmVzZXJ2b2lyPEFnZ3JlZ2F0ZWRWYWx1ZU9iamVjdD4gdGltZVJlc2Vydm9pckxpc3RlbmVyKSB7CisgICAgICAgIGFnZ3JlZ2F0ZWRSZXNlcnZvaXJMaXN0ZW5lcnMuYWRkKHRpbWVSZXNlcnZvaXJMaXN0ZW5lcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VGltZVJlc2Vydm9pcihmaW5hbCBUaW1lUmVzZXJ2b2lyPExvbmc+IHRpbWVSZXNlcnZvaXJOb3RpZmllcikgeworICAgICAgICB0aGlzLnRpbWVSZXNlcnZvaXJOb3RpZmllciA9IHRpbWVSZXNlcnZvaXJOb3RpZmllcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSByZXNlcnZvaXIgdGhhdCBwcm9kdWNlcyB0aGUgZGF0YSB0aGlzIHRyaW1tZXIgYWdncmVnYXRlcyBhbmQgdHJpbXMuCisgICAgICovCisgICAgcHVibGljIFRpbWVSZXNlcnZvaXI8TG9uZz4gZ2V0VGltZVJlc2Vydm9pck5vdGlmaWVyKCkgeworICAgICAgICByZXR1cm4gdGltZVJlc2Vydm9pck5vdGlmaWVyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3JpbmcvQXBwbGljYXRpb25FdmVudEltcGwuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3JpbmcvQXBwbGljYXRpb25FdmVudEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGY0NjExCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9BcHBsaWNhdGlvbkV2ZW50SW1wbC5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLm1vbml0b3Jpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1vZGVsOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLkFwcGxpY2F0aW9uRXZlbnQ7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIEFwcGxpY2F0aW9uRXZlbnQgYXBwbGljYXRpb24gZXZlbnR9LiBJbnN0YW5jZXMgYXJlIGltbXV0YWJsZS4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbkV2ZW50SW1wbCBpbXBsZW1lbnRzIEFwcGxpY2F0aW9uRXZlbnQgeworCisgICAgcHJpdmF0ZSBmaW5hbCBUeXBlIHR5cGU7CisgICAgcHJpdmF0ZSBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZzsKKyAgICBwcml2YXRlIGZpbmFsIFNldDxDbGFzczw/Pj4gcHJvdmlkZXJzOworICAgIHByaXZhdGUgZmluYWwgU2V0PENsYXNzPD8+PiByZWdpc3RlcmVkQ2xhc3NlczsKKyAgICBwcml2YXRlIGZpbmFsIFNldDxPYmplY3Q+IHJlZ2lzdGVyZWRJbnN0YW5jZXM7CisgICAgcHJpdmF0ZSBmaW5hbCBSZXNvdXJjZU1vZGVsIHJlc291cmNlTW9kZWw7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgYXBwbGljYXRpb24gZXZlbnQuCisgICAgICogQHBhcmFtIHR5cGUgVHlwZSBvZiB0aGUgZXZlbnQuCisgICAgICogQHBhcmFtIHJlc291cmNlQ29uZmlnIFJlc291cmNlIGNvbmZpZyBvZiB0aGUgYXBwbGljYXRpb24uCisgICAgICogQHBhcmFtIHJlZ2lzdGVyZWRDbGFzc2VzIFJlZ2lzdGVyZWQgcmVzb3VyY2UgY2xhc3Nlcy4KKyAgICAgKiBAcGFyYW0gcmVnaXN0ZXJlZEluc3RhbmNlcyBSZWdpc3RlcmVkIHJlc291cmNlIGluc3RhbmNlcy4KKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VNb2RlbCBSZXNvdXJjZSBtb2RlbCBvZiB0aGUgYXBwbGljYXRpb24gKGVuaGFuY2VkIGJ5CisgICAgICogICAgICAgICAgICAgICAgICAgICAge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5Nb2RlbFByb2Nlc3NvciBtb2RlbCBwcm9jZXNzb3JzfSkuCisgICAgICogQHBhcmFtIHByb3ZpZGVycyBSZWdpc3RlcmVkIHByb3ZpZGVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQXBwbGljYXRpb25FdmVudEltcGwoVHlwZSB0eXBlLCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0PENsYXNzPD8+PiBwcm92aWRlcnMsIFNldDxDbGFzczw/Pj4gcmVnaXN0ZXJlZENsYXNzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldDxPYmplY3Q+IHJlZ2lzdGVyZWRJbnN0YW5jZXMsIFJlc291cmNlTW9kZWwgcmVzb3VyY2VNb2RlbCkgeworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICB0aGlzLnJlc291cmNlQ29uZmlnID0gcmVzb3VyY2VDb25maWc7CisgICAgICAgIHRoaXMucHJvdmlkZXJzID0gcHJvdmlkZXJzOworICAgICAgICB0aGlzLnJlZ2lzdGVyZWRDbGFzc2VzID0gcmVnaXN0ZXJlZENsYXNzZXM7CisgICAgICAgIHRoaXMucmVnaXN0ZXJlZEluc3RhbmNlcyA9IHJlZ2lzdGVyZWRJbnN0YW5jZXM7CisgICAgICAgIHRoaXMucmVzb3VyY2VNb2RlbCA9IHJlc291cmNlTW9kZWw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc291cmNlQ29uZmlnIGdldFJlc291cmNlQ29uZmlnKCkgeworICAgICAgICByZXR1cm4gcmVzb3VyY2VDb25maWc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFR5cGUgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0UmVnaXN0ZXJlZENsYXNzZXMoKSB7CisgICAgICAgIHJldHVybiByZWdpc3RlcmVkQ2xhc3NlczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PE9iamVjdD4gZ2V0UmVnaXN0ZXJlZEluc3RhbmNlcygpIHsKKyAgICAgICAgcmV0dXJuIHJlZ2lzdGVyZWRJbnN0YW5jZXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0UHJvdmlkZXJzKCkgeworICAgICAgICByZXR1cm4gcHJvdmlkZXJzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvdXJjZU1vZGVsIGdldFJlc291cmNlTW9kZWwoKSB7CisgICAgICAgIHJldHVybiByZXNvdXJjZU1vZGVsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3JpbmcvQXBwbGljYXRpb25JbmZvSW1wbC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9BcHBsaWNhdGlvbkluZm9JbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThmMmE3ZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3JpbmcvQXBwbGljYXRpb25JbmZvSW1wbC5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLm1vbml0b3Jpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLkFwcGxpY2F0aW9uSW5mbzsKKworLyoqCisgKiBBcHBsaWNhdGlvbiBzdGF0aXN0aWNzLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworZmluYWwgY2xhc3MgQXBwbGljYXRpb25JbmZvSW1wbCBpbXBsZW1lbnRzIEFwcGxpY2F0aW9uSW5mbyB7CisKKyAgICBwcml2YXRlIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnOworICAgIHByaXZhdGUgZmluYWwgRGF0ZSBzdGFydFRpbWU7CisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IHJlZ2lzdGVyZWRDbGFzc2VzOworICAgIHByaXZhdGUgZmluYWwgU2V0PE9iamVjdD4gcmVnaXN0ZXJlZEluc3RhbmNlczsKKyAgICBwcml2YXRlIGZpbmFsIFNldDxDbGFzczw/Pj4gcHJvdmlkZXJzOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGFwcGxpY2F0aW9uIHN0YXRpc3RpY3MgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VDb25maWcgUmVzb3VyY2UgY29uZmlnIG9mIHRoZSBhcHBsaWNhdGlvbiBiZWluZyBtb25pdG9yZWQuCisgICAgICogQHBhcmFtIHN0YXJ0VGltZSBTdGFydCB0aW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAod2hlbiBpbml0aWFsaXphdGlvbiB3YXMgZmluaXNoZWQpLgorICAgICAqIEBwYXJhbSByZWdpc3RlcmVkQ2xhc3NlcyBSZWdpc3RlcmVkIHJlc291cmNlIGNsYXNzZXMuCisgICAgICogQHBhcmFtIHJlZ2lzdGVyZWRJbnN0YW5jZXMgUmVnaXN0ZXJlZCByZXNvdXJjZSBpbnN0YW5jZXMuCisgICAgICogQHBhcmFtIHByb3ZpZGVycyBSZWdpc3RlcmVkIHByb3ZpZGVycy4KKyAgICAgKi8KKyAgICBBcHBsaWNhdGlvbkluZm9JbXBsKGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnLCBmaW5hbCBEYXRlIHN0YXJ0VGltZSwgZmluYWwgU2V0PENsYXNzPD8+PiByZWdpc3RlcmVkQ2xhc3NlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNldDxPYmplY3Q+IHJlZ2lzdGVyZWRJbnN0YW5jZXMsIGZpbmFsIFNldDxDbGFzczw/Pj4gcHJvdmlkZXJzKSB7CisgICAgICAgIHRoaXMucmVzb3VyY2VDb25maWcgPSByZXNvdXJjZUNvbmZpZzsKKyAgICAgICAgdGhpcy5zdGFydFRpbWUgPSBzdGFydFRpbWU7CisKKyAgICAgICAgdGhpcy5yZWdpc3RlcmVkQ2xhc3NlcyA9IHJlZ2lzdGVyZWRDbGFzc2VzOworICAgICAgICB0aGlzLnJlZ2lzdGVyZWRJbnN0YW5jZXMgPSByZWdpc3RlcmVkSW5zdGFuY2VzOworICAgICAgICB0aGlzLnByb3ZpZGVycyA9IHByb3ZpZGVyczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb3VyY2VDb25maWcgZ2V0UmVzb3VyY2VDb25maWcoKSB7CisgICAgICAgIHJldHVybiByZXNvdXJjZUNvbmZpZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRGF0ZSBnZXRTdGFydFRpbWUoKSB7CisgICAgICAgIHJldHVybiBzdGFydFRpbWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0UmVnaXN0ZXJlZENsYXNzZXMoKSB7CisgICAgICAgIHJldHVybiByZWdpc3RlcmVkQ2xhc3NlczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PE9iamVjdD4gZ2V0UmVnaXN0ZXJlZEluc3RhbmNlcygpIHsKKyAgICAgICAgcmV0dXJuIHJlZ2lzdGVyZWRJbnN0YW5jZXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0UHJvdmlkZXJzKCkgeworICAgICAgICByZXR1cm4gcHJvdmlkZXJzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBcHBsaWNhdGlvbkluZm8gc25hcHNob3QoKSB7CisgICAgICAgIC8vIHNuYXBzaG90IGZ1bmN0aW9uYWxpdHkgbm90IHlldCBpbXBsZW1lbnRlZAorICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3JpbmcvQXBwbGljYXRpb25JbmZvTGlzdGVuZXIuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3JpbmcvQXBwbGljYXRpb25JbmZvTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjgyM2YyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9BcHBsaWNhdGlvbkluZm9MaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLm1vbml0b3Jpbmc7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uUmVmOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLkFwcGxpY2F0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuQXBwbGljYXRpb25FdmVudExpc3RlbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLkFwcGxpY2F0aW9uSW5mbzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5SZXF1ZXN0RXZlbnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuUmVxdWVzdEV2ZW50TGlzdGVuZXI7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5OworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCisvKioKKyAqIHtAbGluayBBcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXIgQXBwbGljYXRpb24gZXZlbnQgbGlzdGVuZXJ9IHRoYXQgbGlzdGVucyB0byB7QGxpbmsgQXBwbGljYXRpb25FdmVudCBhcHBsaWNhdGlvbn0KKyAqIGV2ZW50cyBhbmQganVzdCBwcmVwYXJlIHtAbGluayBBcHBsaWNhdGlvbkluZm99IGluc3RhbmNlIHRvIGJlIGluamVjdGFibGUuCisgKgorICogQHNlZSBNb25pdG9yaW5nRXZlbnRMaXN0ZW5lcgorICoKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQcmlvcml0eShBcHBsaWNhdGlvbkluZm9MaXN0ZW5lci5QUklPUklUWSkKK3B1YmxpYyBmaW5hbCBjbGFzcyBBcHBsaWNhdGlvbkluZm9MaXN0ZW5lciBpbXBsZW1lbnRzIEFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lciB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQUklPUklUWSA9IDEwMDA7CisKKyAgICBASW5qZWN0CisgICAgcHJpdmF0ZSBQcm92aWRlcjxSZWY8QXBwbGljYXRpb25JbmZvPj4gYXBwbGljYXRpb25JbmZvUmVmUHJvdmlkZXI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVxdWVzdEV2ZW50TGlzdGVuZXIgb25SZXF1ZXN0KGZpbmFsIFJlcXVlc3RFdmVudCByZXF1ZXN0RXZlbnQpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25FdmVudChmaW5hbCBBcHBsaWNhdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uRXZlbnQuVHlwZSB0eXBlID0gZXZlbnQuZ2V0VHlwZSgpOworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgUkVMT0FEX0ZJTklTSEVEOgorICAgICAgICAgICAgY2FzZSBJTklUSUFMSVpBVElPTl9GSU5JU0hFRDoKKyAgICAgICAgICAgICAgICBwcm9jZXNzQXBwbGljYXRpb25TdGF0aXN0aWNzKGV2ZW50KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQXBwbGljYXRpb25TdGF0aXN0aWNzKEFwcGxpY2F0aW9uRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgZmluYWwgbG9uZyBub3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgZmluYWwgQXBwbGljYXRpb25JbmZvIGFwcGxpY2F0aW9uSW5mbyA9IG5ldyBBcHBsaWNhdGlvbkluZm9JbXBsKGV2ZW50LmdldFJlc291cmNlQ29uZmlnKCksCisgICAgICAgICAgICAgICAgbmV3IERhdGUobm93KSwgZXZlbnQuZ2V0UmVnaXN0ZXJlZENsYXNzZXMoKSwKKyAgICAgICAgICAgICAgICBldmVudC5nZXRSZWdpc3RlcmVkSW5zdGFuY2VzKCksIGV2ZW50LmdldFByb3ZpZGVycygpKTsKKyAgICAgICAgYXBwbGljYXRpb25JbmZvUmVmUHJvdmlkZXIuZ2V0KCkuc2V0KGFwcGxpY2F0aW9uSW5mbyk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL0NvbXBvc2l0ZUFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9Db21wb3NpdGVBcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2EwZGY4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9Db21wb3NpdGVBcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5tb25pdG9yaW5nOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLkFwcGxpY2F0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuQXBwbGljYXRpb25FdmVudExpc3RlbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLlJlcXVlc3RFdmVudDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5SZXF1ZXN0RXZlbnRMaXN0ZW5lcjsKKworLyoqCisgKiB7QGxpbmsgQXBwbGljYXRpb25FdmVudExpc3RlbmVyIGFwcGxpY2F0aW9uIGV2ZW50IGxpc3RlbmVyfSB0aGF0IGFnZ3JlZ2F0ZXMgbW9yZSBldmVudCBsaXN0ZW5lcnMgaW50byBvbmUuCisgKiBDYWxsaW5nIGxpc3RlbmVyIG1ldGhvZHMgb24gdGhpcyBsaXN0ZW5lciB3aWxsIGNhdXNlIGNhbGxpbmcgbWV0aG9kcyBvbiBhbGwgYWdncmVnYXRlZCBsaXN0ZW5lcnMuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgY2xhc3MgQ29tcG9zaXRlQXBwbGljYXRpb25FdmVudExpc3RlbmVyIGltcGxlbWVudHMgQXBwbGljYXRpb25FdmVudExpc3RlbmVyIHsKKworICAgIHByaXZhdGUgZmluYWwgSXRlcmFibGU8QXBwbGljYXRpb25FdmVudExpc3RlbmVyPiBhcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXJzOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBjb21wb3NpdGUgZXZlbnQgbGlzdGVuZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXBwbGljYXRpb25FdmVudExpc3RlbmVycyBMaXN0IG9mIGFwcGxpY2F0aW9uIGV2ZW50IGxpc3RlbmVyIHRoYXQgc2hvdWxkIGJlIGFnZ3JlZ2F0ZWQuCisgICAgICovCisgICAgcHVibGljIENvbXBvc2l0ZUFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lcihmaW5hbCBJdGVyYWJsZTxBcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXI+IGFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lcnMpIHsKKyAgICAgICAgdGhpcy5hcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXJzID0gYXBwbGljYXRpb25FdmVudExpc3RlbmVyczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkV2ZW50KGZpbmFsIEFwcGxpY2F0aW9uRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgZm9yIChmaW5hbCBBcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXIgYXBwbGljYXRpb25FdmVudExpc3RlbmVyIDogYXBwbGljYXRpb25FdmVudExpc3RlbmVycykgeworICAgICAgICAgICAgYXBwbGljYXRpb25FdmVudExpc3RlbmVyLm9uRXZlbnQoZXZlbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlcXVlc3RFdmVudExpc3RlbmVyIG9uUmVxdWVzdChmaW5hbCBSZXF1ZXN0RXZlbnQgcmVxdWVzdEV2ZW50KSB7CisgICAgICAgIGZpbmFsIExpc3Q8UmVxdWVzdEV2ZW50TGlzdGVuZXI+IHJlcXVlc3RFdmVudExpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb3IgKGZpbmFsIEFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lciBhcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXIgOiBhcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXJzKSB7CisgICAgICAgICAgICBmaW5hbCBSZXF1ZXN0RXZlbnRMaXN0ZW5lciByZXF1ZXN0RXZlbnRMaXN0ZW5lciA9IGFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lci5vblJlcXVlc3QocmVxdWVzdEV2ZW50KTsKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0RXZlbnRMaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmVxdWVzdEV2ZW50TGlzdGVuZXJzLmFkZChyZXF1ZXN0RXZlbnRMaXN0ZW5lcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVxdWVzdEV2ZW50TGlzdGVuZXJzLmlzRW1wdHkoKSA/IG51bGwKKyAgICAgICAgICAgICAgICA6IG5ldyBDb21wb3NpdGVSZXF1ZXN0RXZlbnRMaXN0ZW5lcihyZXF1ZXN0RXZlbnRMaXN0ZW5lcnMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3JpbmcvQ29tcG9zaXRlUmVxdWVzdEV2ZW50TGlzdGVuZXIuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3JpbmcvQ29tcG9zaXRlUmVxdWVzdEV2ZW50TGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWZjMjAwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9Db21wb3NpdGVSZXF1ZXN0RXZlbnRMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLm1vbml0b3Jpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLlJlcXVlc3RFdmVudDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5SZXF1ZXN0RXZlbnRMaXN0ZW5lcjsKKworLyoqCisgKiB7QGxpbmsgUmVxdWVzdEV2ZW50TGlzdGVuZXIgcmVxdWVzdCBldmVudCBsaXN0ZW5lcn0gdGhhdCBhZ2dyZWdhdGVzIG1vcmUgcmVxdWVzdCBldmVudCBsaXN0ZW5lciBpbnRvIG9uZS4KKyAqIENhbGxpbmcge0BsaW5rIFJlcXVlc3RFdmVudExpc3RlbmVyI29uRXZlbnQob3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuUmVxdWVzdEV2ZW50KX0gb24KKyAqIHRoaXMgY29tcG9zaXRlIGxpc3RlbmVyIHdpbGwgZm9yd2FyZCBjYWxscyB0byBhbGwgYWdncmVnYXRlZCBsaXN0ZW5lcnMuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgY2xhc3MgQ29tcG9zaXRlUmVxdWVzdEV2ZW50TGlzdGVuZXIgaW1wbGVtZW50cyBSZXF1ZXN0RXZlbnRMaXN0ZW5lciB7CisKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8UmVxdWVzdEV2ZW50TGlzdGVuZXI+IHJlcXVlc3RFdmVudExpc3RlbmVyczsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBjb21wb3NpdGUgbGlzdGVuZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdEV2ZW50TGlzdGVuZXJzIExpc3Qgb2YgbGlzdGVuZXJzIHRoYXQgc2hvdWxkIGJlIGFnZ3JlZ2F0ZWQuCisgICAgICovCisgICAgcHVibGljIENvbXBvc2l0ZVJlcXVlc3RFdmVudExpc3RlbmVyKExpc3Q8UmVxdWVzdEV2ZW50TGlzdGVuZXI+IHJlcXVlc3RFdmVudExpc3RlbmVycykgeworICAgICAgICB0aGlzLnJlcXVlc3RFdmVudExpc3RlbmVycyA9IHJlcXVlc3RFdmVudExpc3RlbmVyczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkV2ZW50KFJlcXVlc3RFdmVudCBldmVudCkgeworICAgICAgICBmb3IgKFJlcXVlc3RFdmVudExpc3RlbmVyIHJlcXVlc3RFdmVudExpc3RlbmVyIDogcmVxdWVzdEV2ZW50TGlzdGVuZXJzKSB7CisgICAgICAgICAgICByZXF1ZXN0RXZlbnRMaXN0ZW5lci5vbkV2ZW50KGV2ZW50KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3JpbmcvRW1wdHlSZXF1ZXN0RXZlbnRCdWlsZGVyLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL0VtcHR5UmVxdWVzdEV2ZW50QnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NmMyMTYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL0VtcHR5UmVxdWVzdEV2ZW50QnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLm1vbml0b3Jpbmc7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LkV4Y2VwdGlvbk1hcHBlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuRXh0ZW5kZWRVcmlJbmZvOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLlJlcXVlc3RFdmVudDsKKworLyoqCisgKiBFbXB0eSBtb2NrIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBSZXF1ZXN0RXZlbnRCdWlsZGVyfS4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBFbXB0eVJlcXVlc3RFdmVudEJ1aWxkZXIgaW1wbGVtZW50cyBSZXF1ZXN0RXZlbnRCdWlsZGVyIHsKKworICAgIC8qKgorICAgICAqIEluc3RhbmNlIG9mIGVtcHR5IHJlcXVlc3QgZXZlbnQgYnVpbGRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEVtcHR5UmVxdWVzdEV2ZW50QnVpbGRlciBJTlNUQU5DRSA9IG5ldyBFbXB0eVJlcXVlc3RFdmVudEJ1aWxkZXIoKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXF1ZXN0RXZlbnRCdWlsZGVyIHNldEV4Y2VwdGlvbk1hcHBlcihFeGNlcHRpb25NYXBwZXI8Pz4gZXhjZXB0aW9uTWFwcGVyKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXF1ZXN0RXZlbnRCdWlsZGVyIHNldENvbnRhaW5lclJlcXVlc3QoQ29udGFpbmVyUmVxdWVzdCBjb250YWluZXJSZXF1ZXN0KSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXF1ZXN0RXZlbnRCdWlsZGVyIHNldENvbnRhaW5lclJlc3BvbnNlKENvbnRhaW5lclJlc3BvbnNlIGNvbnRhaW5lclJlc3BvbnNlKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXF1ZXN0RXZlbnRCdWlsZGVyIHNldFN1Y2Nlc3MoYm9vbGVhbiBzdWNjZXNzKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXF1ZXN0RXZlbnRCdWlsZGVyIHNldFJlc3BvbnNlV3JpdHRlbihib29sZWFuIHJlc3BvbnNlV3JpdHRlbikgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVxdWVzdEV2ZW50QnVpbGRlciBzZXRFeGNlcHRpb24oVGhyb3dhYmxlIHRocm93YWJsZSwgUmVxdWVzdEV2ZW50LkV4Y2VwdGlvbkNhdXNlIGV4Y2VwdGlvbkNhdXNlKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXF1ZXN0RXZlbnRCdWlsZGVyIHNldEV4dGVuZGVkVXJpSW5mbyhFeHRlbmRlZFVyaUluZm8gZXh0ZW5kZWRVcmlJbmZvKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXF1ZXN0RXZlbnRCdWlsZGVyIHNldENvbnRhaW5lclJlc3BvbnNlRmlsdGVycyhJdGVyYWJsZTxDb250YWluZXJSZXNwb25zZUZpbHRlcj4gY29udGFpbmVyUmVzcG9uc2VGaWx0ZXJzKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXF1ZXN0RXZlbnRCdWlsZGVyIHNldENvbnRhaW5lclJlcXVlc3RGaWx0ZXJzKEl0ZXJhYmxlPENvbnRhaW5lclJlcXVlc3RGaWx0ZXI+IGNvbnRhaW5lclJlcXVlc3RGaWx0ZXJzKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXF1ZXN0RXZlbnRCdWlsZGVyIHNldFJlc3BvbnNlU3VjY2Vzc2Z1bGx5TWFwcGVkKGJvb2xlYW4gcmVzcG9uc2VTdWNjZXNzZnVsbHlNYXBwZWQpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlcXVlc3RFdmVudCBidWlsZChSZXF1ZXN0RXZlbnQuVHlwZSBldmVudFR5cGUpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9FeGNlcHRpb25NYXBwZXJTdGF0aXN0aWNzSW1wbC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9FeGNlcHRpb25NYXBwZXJTdGF0aXN0aWNzSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZDUwNDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL0V4Y2VwdGlvbk1hcHBlclN0YXRpc3RpY3NJbXBsLmphdmEKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLm1vbml0b3Jpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLkV4Y2VwdGlvbk1hcHBlclN0YXRpc3RpY3M7CisKKy8qKgorICogRXhjZXB0aW9uIG1hcHBlciBzdGF0aXN0aWNzLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworZmluYWwgY2xhc3MgRXhjZXB0aW9uTWFwcGVyU3RhdGlzdGljc0ltcGwgaW1wbGVtZW50cyBFeGNlcHRpb25NYXBwZXJTdGF0aXN0aWNzIHsKKworICAgIC8qKgorICAgICAqIEJ1aWxkZXIgb2YgZXhjZXB0aW9uIG1hcHBlciBzdGF0aXN0aWNzLgorICAgICAqIDxwLz4KKyAgICAgKiBUaGlzIGJ1aWxkZXIgZG9lcyBub3QgbmVlZCB0byBiZSB0aHJlYWRzYWZlIHNpbmNlIGl0J3MgY2FsbGVkIG9ubHkgZnJvbSB0aGUgamVyc2V5LWJhY2tncm91bmQtdGFzay1zY2hlZHVsZXIuCisgICAgICovCisgICAgc3RhdGljIGNsYXNzIEJ1aWxkZXIgeworCisgICAgICAgIHByaXZhdGUgTWFwPENsYXNzPD8+LCBMb25nPiBleGNlcHRpb25NYXBwZXJFeGVjdXRpb25Db3VudE1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgcHJpdmF0ZSBsb25nIHN1Y2Nlc3NmdWxNYXBwaW5nczsKKyAgICAgICAgcHJpdmF0ZSBsb25nIHVuc3VjY2Vzc2Z1bE1hcHBpbmdzOworICAgICAgICBwcml2YXRlIGxvbmcgdG90YWxNYXBwaW5nczsKKworICAgICAgICBwcml2YXRlIEV4Y2VwdGlvbk1hcHBlclN0YXRpc3RpY3NJbXBsIGNhY2hlZDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIG1hcHBpbmdzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc3VjY2VzcyBUcnVlIGlmIG1hcHBpbmdzIHdlcmUgc3VjY2Vzc2Z1bC4KKyAgICAgICAgICogQHBhcmFtIGNvdW50IE51bWJlciBvZiBtYXBwaW5ncy4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgYWRkTWFwcGluZyhmaW5hbCBib29sZWFuIHN1Y2Nlc3MsIGZpbmFsIGludCBjb3VudCkgeworICAgICAgICAgICAgY2FjaGVkID0gbnVsbDsKKworICAgICAgICAgICAgdG90YWxNYXBwaW5ncysrOworICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICBzdWNjZXNzZnVsTWFwcGluZ3MgKz0gY291bnQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHVuc3VjY2Vzc2Z1bE1hcHBpbmdzICs9IGNvdW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBhbiBleGVjdXRpb24gb2YgZXhjZXB0aW9uIG1hcHBlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG1hcHBlciBFeGNlcHRpb24gbWFwcGVyLgorICAgICAgICAgKiBAcGFyYW0gY291bnQgTnVtYmVyIG9mIGV4ZWN1dGlvbnMgb2YgdGhlIHtAY29kZSBtYXBwZXJ9LgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBhZGRFeGNlcHRpb25NYXBwZXJFeGVjdXRpb24oZmluYWwgQ2xhc3M8Pz4gbWFwcGVyLCBmaW5hbCBpbnQgY291bnQpIHsKKyAgICAgICAgICAgIGNhY2hlZCA9IG51bGw7CisKKyAgICAgICAgICAgIExvbmcgY250ID0gZXhjZXB0aW9uTWFwcGVyRXhlY3V0aW9uQ291bnRNYXAuZ2V0KG1hcHBlcik7CisgICAgICAgICAgICBjbnQgPSBjbnQgPT0gbnVsbCA/IGNvdW50IDogY250ICsgY291bnQ7CisgICAgICAgICAgICBleGNlcHRpb25NYXBwZXJFeGVjdXRpb25Db3VudE1hcC5wdXQobWFwcGVyLCBjbnQpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJ1aWxkIGFuIGluc3RhbmNlIG9mIGV4Y2VwdGlvbiBtYXBwZXIgc3RhdGlzdGljcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBOZXcgaW5zdGFuY2Ugb2YgZXhjZXB0aW9uIG1hcHBlciBzdGF0aXN0aWNzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEV4Y2VwdGlvbk1hcHBlclN0YXRpc3RpY3NJbXBsIGJ1aWxkKCkgeworICAgICAgICAgICAgaWYgKGNhY2hlZCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgY2FjaGVkID0gbmV3IEV4Y2VwdGlvbk1hcHBlclN0YXRpc3RpY3NJbXBsKG5ldyBIYXNoTWFwPD4odGhpcy5leGNlcHRpb25NYXBwZXJFeGVjdXRpb25Db3VudE1hcCksCisgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzZnVsTWFwcGluZ3MsIHVuc3VjY2Vzc2Z1bE1hcHBpbmdzLCB0b3RhbE1hcHBpbmdzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGNhY2hlZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgTWFwPENsYXNzPD8+LCBMb25nPiBleGNlcHRpb25NYXBwZXJFeGVjdXRpb25Db3VudDsKKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgc3VjY2Vzc2Z1bE1hcHBpbmdzOworICAgIHByaXZhdGUgZmluYWwgbG9uZyB1bnN1Y2Nlc3NmdWxNYXBwaW5nczsKKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgdG90YWxNYXBwaW5nczsKKworICAgIHByaXZhdGUgRXhjZXB0aW9uTWFwcGVyU3RhdGlzdGljc0ltcGwoZmluYWwgTWFwPENsYXNzPD8+LCBMb25nPiBleGNlcHRpb25NYXBwZXJFeGVjdXRpb25Db3VudCwgZmluYWwgbG9uZyBzdWNjZXNzZnVsTWFwcGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBsb25nIHVuc3VjY2Vzc2Z1bE1hcHBpbmdzLCBmaW5hbCBsb25nIHRvdGFsTWFwcGluZ3MpIHsKKyAgICAgICAgdGhpcy5leGNlcHRpb25NYXBwZXJFeGVjdXRpb25Db3VudCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChleGNlcHRpb25NYXBwZXJFeGVjdXRpb25Db3VudCk7CisgICAgICAgIHRoaXMuc3VjY2Vzc2Z1bE1hcHBpbmdzID0gc3VjY2Vzc2Z1bE1hcHBpbmdzOworICAgICAgICB0aGlzLnVuc3VjY2Vzc2Z1bE1hcHBpbmdzID0gdW5zdWNjZXNzZnVsTWFwcGluZ3M7CisgICAgICAgIHRoaXMudG90YWxNYXBwaW5ncyA9IHRvdGFsTWFwcGluZ3M7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1hcDxDbGFzczw/PiwgTG9uZz4gZ2V0RXhjZXB0aW9uTWFwcGVyRXhlY3V0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbk1hcHBlckV4ZWN1dGlvbkNvdW50OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGdldFN1Y2Nlc3NmdWxNYXBwaW5ncygpIHsKKyAgICAgICAgcmV0dXJuIHN1Y2Nlc3NmdWxNYXBwaW5nczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBnZXRVbnN1Y2Nlc3NmdWxNYXBwaW5ncygpIHsKKyAgICAgICAgcmV0dXJuIHVuc3VjY2Vzc2Z1bE1hcHBpbmdzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGdldFRvdGFsTWFwcGluZ3MoKSB7CisgICAgICAgIHJldHVybiB0b3RhbE1hcHBpbmdzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBFeGNlcHRpb25NYXBwZXJTdGF0aXN0aWNzIHNuYXBzaG90KCkgeworICAgICAgICAvLyBzbmFwc2hvdCBmdW5jdGlvbmFsaXR5IG5vdCB5ZXQgaW1wbGVtZW50ZWQKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL0V4ZWN1dGlvblN0YXRpc3RpY3NJbXBsLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL0V4ZWN1dGlvblN0YXRpc3RpY3NJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhiYmE2YwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3JpbmcvRXhlY3V0aW9uU3RhdGlzdGljc0ltcGwuamF2YQpAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwubW9uaXRvcmluZzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwubW9uaXRvcmluZy5jb3JlLlVuaWZvcm1UaW1lUmVzZXJ2b2lyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLkV4ZWN1dGlvblN0YXRpc3RpY3M7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuVGltZVdpbmRvd1N0YXRpc3RpY3M7CisKKy8qKgorICogSW1tdXRhYmxlIEV4ZWN1dGlvbiBzdGF0aXN0aWNzLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLworZmluYWwgY2xhc3MgRXhlY3V0aW9uU3RhdGlzdGljc0ltcGwgaW1wbGVtZW50cyBFeGVjdXRpb25TdGF0aXN0aWNzIHsKKworICAgIC8qKgorICAgICAqIEVtcHR5IGV4ZWN1dGlvbiBzdGF0aXN0aWNzIGluc3RhbmNlLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBFeGVjdXRpb25TdGF0aXN0aWNzIEVNUFRZID0gbmV3IEJ1aWxkZXIoKS5idWlsZCgpOworCisgICAgLyoqCisgICAgICogQnVpbGRlciBvZiBleGVjdXRpb24gc3RhdGlzdGljcy4KKyAgICAgKiA8cC8+CisgICAgICogTXVzdCBiZSB0aHJlYWQtc2FmZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgQnVpbGRlciB7CisKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBsb25nIGxhc3RTdGFydFRpbWU7CisgICAgICAgIHByaXZhdGUgZmluYWwgTWFwPExvbmcsIFRpbWVXaW5kb3dTdGF0aXN0aWNzSW1wbC5CdWlsZGVyPiBpbnRlcnZhbFN0YXRpc3RpY3M7CisgICAgICAgIHByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxUaW1lV2luZG93U3RhdGlzdGljc0ltcGwuQnVpbGRlcjxMb25nPj4gdXBkYXRhYmxlSW50ZXJ2YWxTdGF0aXN0aWNzOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgYSBuZXcgYnVpbGRlci4KKyAgICAgICAgICovCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJNYWdpY051bWJlciIpCisgICAgICAgIHB1YmxpYyBCdWlsZGVyKCkgeworICAgICAgICAgICAgZmluYWwgbG9uZyBub3dNaWxsaXMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgICAgIGZpbmFsIEFnZ3JlZ2F0aW5nVHJpbW1lciB0cmltbWVyID0gbmV3IEFnZ3JlZ2F0aW5nVHJpbW1lcihub3dNaWxsaXMsIFRpbWVVbml0Lk1JTExJU0VDT05EUywgMSwgVGltZVVuaXQuU0VDT05EUyk7CisgICAgICAgICAgICBmaW5hbCBUaW1lV2luZG93U3RhdGlzdGljc0ltcGwuQnVpbGRlcjxMb25nPiBvbmVTZWNvbmRJbnRlcnZhbFdpbmRvd0J1aWxkZXIgPQorICAgICAgICAgICAgICAgICAgICBuZXcgVGltZVdpbmRvd1N0YXRpc3RpY3NJbXBsLkJ1aWxkZXI8PigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2xpZGluZ1dpbmRvd1RpbWVSZXNlcnZvaXIoMSwgVGltZVVuaXQuU0VDT05EUywgbm93TWlsbGlzLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMsIHRyaW1tZXIpKTsKKyAgICAgICAgICAgIGZpbmFsIFRpbWVXaW5kb3dTdGF0aXN0aWNzSW1wbC5CdWlsZGVyPExvbmc+IGluZmluaXRlSW50ZXJ2YWxXaW5kb3dCdWlsZGVyID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IFRpbWVXaW5kb3dTdGF0aXN0aWNzSW1wbC5CdWlsZGVyPD4obmV3IFVuaWZvcm1UaW1lUmVzZXJ2b2lyKG5vd01pbGxpcywgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisKKyAgICAgICAgICAgIHRoaXMudXBkYXRhYmxlSW50ZXJ2YWxTdGF0aXN0aWNzID0KKyAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChpbmZpbml0ZUludGVydmFsV2luZG93QnVpbGRlciwgb25lU2Vjb25kSW50ZXJ2YWxXaW5kb3dCdWlsZGVyKTsKKworICAgICAgICAgICAgLy8gY3JlYXRlIHVubW9kaWZpYWJsZSBtYXAgdG8gZW5zdXJlIHRoYXQgYW4gaXRlcmF0aW9uIGluIHRoZSBidWlsZCgpIHdvbid0IGhhdmUgbXVsdGktdGhyZWFkaW5nIGlzc3VlcworICAgICAgICAgICAgZmluYWwgSGFzaE1hcDxMb25nLCBUaW1lV2luZG93U3RhdGlzdGljc0ltcGwuQnVpbGRlcj4gdG1wSW50ZXJ2YWxTdGF0aXN0aWNzID0gbmV3IEhhc2hNYXA8Pig2KTsKKyAgICAgICAgICAgIC8vIEFkZCBhcHByb3hpbWF0ZSBpbmZpbml0ZSB0aW1lIHdpbmRvdyBidWlsZGVyCisgICAgICAgICAgICB0bXBJbnRlcnZhbFN0YXRpc3RpY3MucHV0KDBMLCBpbmZpbml0ZUludGVydmFsV2luZG93QnVpbGRlcik7CisgICAgICAgICAgICAvLyBBZGQgcHJlY2lzZSAxIHNlY29uZCB0aW1lIHdpbmRvdyBidWlsZGVyCisgICAgICAgICAgICB0bXBJbnRlcnZhbFN0YXRpc3RpY3MucHV0KFRpbWVVbml0LlNFQ09ORFMudG9NaWxsaXMoMSksIG9uZVNlY29uZEludGVydmFsV2luZG93QnVpbGRlcik7CisgICAgICAgICAgICAvLyBBZGQgYWdncmVnYXRlZCAxNSBzZWNvbmRzIHRpbWUgd2luZG93IGJ1aWxkZXIKKyAgICAgICAgICAgIGFkZEFnZ3JlZ2F0ZWRJbnRlcnZhbCh0bXBJbnRlcnZhbFN0YXRpc3RpY3MsIG5vd01pbGxpcywgMTUsIFRpbWVVbml0LlNFQ09ORFMsIHRyaW1tZXIpOworICAgICAgICAgICAgLy8gQWRkIGFnZ3JlZ2F0ZWQgMSBtaW51dGUgdGltZSB3aW5kb3cgYnVpbGRlcgorICAgICAgICAgICAgYWRkQWdncmVnYXRlZEludGVydmFsKHRtcEludGVydmFsU3RhdGlzdGljcywgbm93TWlsbGlzLCAxLCBUaW1lVW5pdC5NSU5VVEVTLCB0cmltbWVyKTsKKyAgICAgICAgICAgIC8vIEFkZCBhZ2dyZWdhdGVkIDE1IG1pbnV0ZXMgdGltZSB3aW5kb3cgYnVpbGRlcgorICAgICAgICAgICAgYWRkQWdncmVnYXRlZEludGVydmFsKHRtcEludGVydmFsU3RhdGlzdGljcywgbm93TWlsbGlzLCAxNSwgVGltZVVuaXQuTUlOVVRFUywgdHJpbW1lcik7CisgICAgICAgICAgICAvLyBBZGQgYWdncmVnYXRlZCAxIGhvdXIgdGltZSB3aW5kb3cgYnVpbGRlcgorICAgICAgICAgICAgYWRkQWdncmVnYXRlZEludGVydmFsKHRtcEludGVydmFsU3RhdGlzdGljcywgbm93TWlsbGlzLCAxLCBUaW1lVW5pdC5IT1VSUywgdHJpbW1lcik7CisKKyAgICAgICAgICAgIHRoaXMuaW50ZXJ2YWxTdGF0aXN0aWNzID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHRtcEludGVydmFsU3RhdGlzdGljcyk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZEFnZ3JlZ2F0ZWRJbnRlcnZhbCgKKyAgICAgICAgICAgICAgICBmaW5hbCBNYXA8TG9uZywgVGltZVdpbmRvd1N0YXRpc3RpY3NJbXBsLkJ1aWxkZXI+IGludGVydmFsU3RhdGlzdGljc01hcCwKKyAgICAgICAgICAgICAgICBmaW5hbCBsb25nIG5vd01pbGxpcywKKyAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGludGVydmFsLAorICAgICAgICAgICAgICAgIGZpbmFsIFRpbWVVbml0IHRpbWVVbml0LAorICAgICAgICAgICAgICAgIGZpbmFsIEFnZ3JlZ2F0aW5nVHJpbW1lciBub3RpZmllcikgeworICAgICAgICAgICAgZmluYWwgbG9uZyBpbnRlcnZhbEluTWlsbGlzID0gdGltZVVuaXQudG9NaWxsaXMoaW50ZXJ2YWwpOworICAgICAgICAgICAgaW50ZXJ2YWxTdGF0aXN0aWNzTWFwLnB1dChpbnRlcnZhbEluTWlsbGlzLCBuZXcgVGltZVdpbmRvd1N0YXRpc3RpY3NJbXBsLkJ1aWxkZXI8PigKKyAgICAgICAgICAgICAgICAgICAgbmV3IEFnZ3JlZ2F0ZWRTbGlkaW5nV2luZG93VGltZVJlc2Vydm9pcihpbnRlcnZhbEluTWlsbGlzLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMsIG5vd01pbGxpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdC5NSUxMSVNFQ09ORFMsIG5vdGlmaWVyKSkpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBleGVjdXRpb24gb2YgYSB0YXJnZXQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzdGFydFRpbWUgU3RhcnQgdGltZSBvZiBhbiBleGVjdXRpb24gZXZlbnQgKGluIFVuaXggdGltZXN0YW1wIGZvcm1hdCkuCisgICAgICAgICAqIEBwYXJhbSBkdXJhdGlvbiAgRHVyYXRpb24gb2YgYW4gZXhlY3V0aW9uIGV2ZW50IGluIG1pbGxpc2Vjb25kcy4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgYWRkRXhlY3V0aW9uKGZpbmFsIGxvbmcgc3RhcnRUaW1lLCBmaW5hbCBsb25nIGR1cmF0aW9uKSB7CisgICAgICAgICAgICBmb3IgKGZpbmFsIFRpbWVXaW5kb3dTdGF0aXN0aWNzSW1wbC5CdWlsZGVyPExvbmc+IHN0YXRCdWlsZGVyIDogdXBkYXRhYmxlSW50ZXJ2YWxTdGF0aXN0aWNzKSB7CisgICAgICAgICAgICAgICAgc3RhdEJ1aWxkZXIuYWRkUmVxdWVzdChzdGFydFRpbWUsIGR1cmF0aW9uKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy5sYXN0U3RhcnRUaW1lID0gc3RhcnRUaW1lOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJ1aWxkIGEgbmV3IGluc3RhbmNlIG9mIGV4ZWN1dGlvbiBzdGF0aXN0aWNzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIG5ldyBpbnN0YW5jZSBvZiBleGVjdXRpb24gc3RhdGlzdGljcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBFeGVjdXRpb25TdGF0aXN0aWNzSW1wbCBidWlsZCgpIHsKKyAgICAgICAgICAgIGZpbmFsIE1hcDxMb25nLCBUaW1lV2luZG93U3RhdGlzdGljcz4gbmV3SW50ZXJ2YWxTdGF0aXN0aWNzID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICAgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8TG9uZywgVGltZVdpbmRvd1N0YXRpc3RpY3NJbXBsLkJ1aWxkZXI+IGJ1aWxkZXJFbnRyeSA6IGludGVydmFsU3RhdGlzdGljcy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgbmV3SW50ZXJ2YWxTdGF0aXN0aWNzLnB1dChidWlsZGVyRW50cnkuZ2V0S2V5KCksIGJ1aWxkZXJFbnRyeS5nZXRWYWx1ZSgpLmJ1aWxkKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjYWNoZSB3aGVuIHJlcXVlc3QgcmF0ZSBpcyAwCisKKyAgICAgICAgICAgIHJldHVybiBuZXcgRXhlY3V0aW9uU3RhdGlzdGljc0ltcGwobGFzdFN0YXJ0VGltZSwgbmV3SW50ZXJ2YWxTdGF0aXN0aWNzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgbG9uZyBsYXN0U3RhcnRUaW1lOworICAgIHByaXZhdGUgZmluYWwgTWFwPExvbmcsIFRpbWVXaW5kb3dTdGF0aXN0aWNzPiB0aW1lV2luZG93U3RhdGlzdGljczsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBEYXRlIGdldExhc3RTdGFydFRpbWUoKSB7CisgICAgICAgIHJldHVybiBuZXcgRGF0ZShsYXN0U3RhcnRUaW1lKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWFwPExvbmcsIFRpbWVXaW5kb3dTdGF0aXN0aWNzPiBnZXRUaW1lV2luZG93U3RhdGlzdGljcygpIHsKKyAgICAgICAgcmV0dXJuIHRpbWVXaW5kb3dTdGF0aXN0aWNzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBFeGVjdXRpb25TdGF0aXN0aWNzIHNuYXBzaG90KCkgeworICAgICAgICAvLyB0aGlzIG9iamVjdCBpcyBpbW11dGFibGUgKFRpbWVXaW5kb3dTdGF0aXN0aWNzIGFyZSBpbW11dGFibGUgYXMgd2VsbCkKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHJpdmF0ZSBFeGVjdXRpb25TdGF0aXN0aWNzSW1wbChmaW5hbCBsb25nIGxhc3RTdGFydFRpbWUsIGZpbmFsIE1hcDxMb25nLCBUaW1lV2luZG93U3RhdGlzdGljcz4gdGltZVdpbmRvd1N0YXRpc3RpY3MpIHsKKyAgICAgICAgdGhpcy5sYXN0U3RhcnRUaW1lID0gbGFzdFN0YXJ0VGltZTsKKyAgICAgICAgdGhpcy50aW1lV2luZG93U3RhdGlzdGljcyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcCh0aW1lV2luZG93U3RhdGlzdGljcyk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL01vbml0b3JpbmdBdXRvZGlzY292ZXJhYmxlLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL01vbml0b3JpbmdBdXRvZGlzY292ZXJhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YyY2EwOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3JpbmcvTW9uaXRvcmluZ0F1dG9kaXNjb3ZlcmFibGUuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5tb25pdG9yaW5nOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qcmlvcml0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdHJhaW5lZFRvOworaW1wb3J0IGphdmF4LndzLnJzLlJ1bnRpbWVUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5zcGkuQXV0b0Rpc2NvdmVyYWJsZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5zcGkuRm9yY2VkQXV0b0Rpc2NvdmVyYWJsZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKKworLyoqCisgKiBBdXRvZGlzY292ZXJhYmxlIGZlYXR1cmUgdGhhdCByZWdpc3RlcnMge0BsaW5rIE1vbml0b3JpbmdGZWF0dXJlfQorICogYmFzZWQgb24gY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworQENvbnN0cmFpbmVkVG8oUnVudGltZVR5cGUuU0VSVkVSKQorQFByaW9yaXR5KEF1dG9EaXNjb3ZlcmFibGUuREVGQVVMVF9QUklPUklUWSkKK3B1YmxpYyBmaW5hbCBjbGFzcyBNb25pdG9yaW5nQXV0b2Rpc2NvdmVyYWJsZSBpbXBsZW1lbnRzIEZvcmNlZEF1dG9EaXNjb3ZlcmFibGUgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY29uZmlndXJlKGZpbmFsIEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgaWYgKCFjb250ZXh0LmdldENvbmZpZ3VyYXRpb24oKS5pc1JlZ2lzdGVyZWQoTW9uaXRvcmluZ0ZlYXR1cmUuY2xhc3MpKSB7CisgICAgICAgICAgICBmaW5hbCBCb29sZWFuIG1vbml0b3JpbmdFbmFibGVkID0gU2VydmVyUHJvcGVydGllcy5nZXRWYWx1ZShjb250ZXh0LmdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0aWVzKCksCisgICAgICAgICAgICAgICAgICAgIFNlcnZlclByb3BlcnRpZXMuTU9OSVRPUklOR19FTkFCTEVELCBCb29sZWFuLkZBTFNFKTsKKyAgICAgICAgICAgIGZpbmFsIEJvb2xlYW4gc3RhdGlzdGljc0VuYWJsZWQgPSBTZXJ2ZXJQcm9wZXJ0aWVzLmdldFZhbHVlKGNvbnRleHQuZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnRpZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgU2VydmVyUHJvcGVydGllcy5NT05JVE9SSU5HX1NUQVRJU1RJQ1NfRU5BQkxFRCwgQm9vbGVhbi5GQUxTRSk7CisgICAgICAgICAgICBmaW5hbCBCb29sZWFuIG1iZWFuc0VuYWJsZWQgPSBTZXJ2ZXJQcm9wZXJ0aWVzLmdldFZhbHVlKGNvbnRleHQuZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnRpZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgU2VydmVyUHJvcGVydGllcy5NT05JVE9SSU5HX1NUQVRJU1RJQ1NfTUJFQU5TX0VOQUJMRUQsIEJvb2xlYW4uRkFMU0UpOworCisgICAgICAgICAgICBpZiAobW9uaXRvcmluZ0VuYWJsZWQgfHwgc3RhdGlzdGljc0VuYWJsZWQgfHwgbWJlYW5zRW5hYmxlZCkgeworICAgICAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoTW9uaXRvcmluZ0ZlYXR1cmUuY2xhc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9Nb25pdG9yaW5nQ29udGFpbmVyTGlzdGVuZXIuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3JpbmcvTW9uaXRvcmluZ0NvbnRhaW5lckxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNjOTZhNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3JpbmcvTW9uaXRvcmluZ0NvbnRhaW5lckxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwubW9uaXRvcmluZzsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQWJzdHJhY3RCaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuQXBwbGljYXRpb25FdmVudDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5BcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5Db250YWluZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5Db250YWluZXJMaWZlY3ljbGVMaXN0ZW5lcjsKKworLyoqCisgKiBDb250YWluZXIgbGlzdGVuZXIgdGhhdCBsaXN0ZW5zIHRvIGNvbnRhaW5lciBldmVudHMgYW5kIHRyaWdnZXIgdGhlIHtAbGluayBBcHBsaWNhdGlvbkV2ZW50IGFwcGxpY2F0aW9uIGV2ZW50c30KKyAqIGFuZCBjYWxsIHRoZW0gb24gc3VwcGxpZWQge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLlJlcXVlc3RFdmVudExpc3RlbmVyfS4KKyAqIDxwLz4KKyAqIFRoaXMgbGlzdGVuZXIgbXVzdCBiZSByZWdpc3RlcmVkIGFzIGEgc3RhbmRhcmQgcHJvdmlkZXIgaW4gSmVyc2V5IHJ1bnRpbWUuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTW9uaXRvcmluZ0NvbnRhaW5lckxpc3RlbmVyIGltcGxlbWVudHMgQ29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXIgeworCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBBcHBsaWNhdGlvbkV2ZW50IGluaXRGaW5pc2hlZEV2ZW50OworICAgIHByaXZhdGUgdm9sYXRpbGUgQXBwbGljYXRpb25FdmVudExpc3RlbmVyIGxpc3RlbmVyOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXMgdGhlIGluc3RhbmNlIHdpdGggbGlzdGVuZXIgdGhhdCBtdXN0IGJlIGNhbGxlZCBhbmQgaW5pdGlhbGl6YXRpb24gZXZlbnQuIElmIHRoaXMgbWV0aG9kCisgICAgICogaXMgbm90IGNhbGxlZCB0aGVuIGV2ZW50cyBjYW5ub3Qgbm90IGJlIHRyaWdnZXJlZCB3aGljaCBtaWdodCBiZSBuZWVkZWQgd2hlbiBubworICAgICAqIHtAbGluayBBcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXJ9IGlzIHJlZ2lzdGVyZWQgaW4gSmVyc2V5IHJ1bnRpbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgTGlzdGVuZXIgdGhhdCBzaG91bGQgYmUgY2FsbGVkLgorICAgICAqIEBwYXJhbSBpbml0RmluaXNoZWRFdmVudCBFdmVudCBvZiB0eXBlIHtAbGluayBBcHBsaWNhdGlvbkV2ZW50LlR5cGUjSU5JVElBTElaQVRJT05fU1RBUlR9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGluaXQoQXBwbGljYXRpb25FdmVudExpc3RlbmVyIGxpc3RlbmVyLCBBcHBsaWNhdGlvbkV2ZW50IGluaXRGaW5pc2hlZEV2ZW50KSB7CisgICAgICAgIHRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICAgICAgdGhpcy5pbml0RmluaXNoZWRFdmVudCA9IGluaXRGaW5pc2hlZEV2ZW50OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU3RhcnR1cChDb250YWluZXIgY29udGFpbmVyKSB7CisgICAgICAgIGlmIChsaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICBsaXN0ZW5lci5vbkV2ZW50KGdldEFwcGxpY2F0aW9uRXZlbnQoQXBwbGljYXRpb25FdmVudC5UeXBlLklOSVRJQUxJWkFUSU9OX0ZJTklTSEVEKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblJlbG9hZChDb250YWluZXIgY29udGFpbmVyKSB7CisgICAgICAgIGlmIChsaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICBsaXN0ZW5lci5vbkV2ZW50KGdldEFwcGxpY2F0aW9uRXZlbnQoQXBwbGljYXRpb25FdmVudC5UeXBlLlJFTE9BRF9GSU5JU0hFRCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBBcHBsaWNhdGlvbkV2ZW50IGdldEFwcGxpY2F0aW9uRXZlbnQoQXBwbGljYXRpb25FdmVudC5UeXBlIHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBcHBsaWNhdGlvbkV2ZW50SW1wbCh0eXBlLAorICAgICAgICAgICAgICAgIGluaXRGaW5pc2hlZEV2ZW50LmdldFJlc291cmNlQ29uZmlnKCksIGluaXRGaW5pc2hlZEV2ZW50LmdldFByb3ZpZGVycygpLAorICAgICAgICAgICAgICAgIGluaXRGaW5pc2hlZEV2ZW50LmdldFJlZ2lzdGVyZWRDbGFzc2VzKCksIGluaXRGaW5pc2hlZEV2ZW50LmdldFJlZ2lzdGVyZWRJbnN0YW5jZXMoKSwKKyAgICAgICAgICAgICAgICBpbml0RmluaXNoZWRFdmVudC5nZXRSZXNvdXJjZU1vZGVsKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU2h1dGRvd24oQ29udGFpbmVyIGNvbnRhaW5lcikgeworICAgICAgICBpZiAobGlzdGVuZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbGlzdGVuZXIub25FdmVudChnZXRBcHBsaWNhdGlvbkV2ZW50KEFwcGxpY2F0aW9uRXZlbnQuVHlwZS5ERVNUUk9ZX0ZJTklTSEVEKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGJpbmRlciB0aGF0IGJpbmRzIHRoZSB7QGxpbmsgTW9uaXRvcmluZ0NvbnRhaW5lckxpc3RlbmVyfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJpbmRlciBleHRlbmRzIEFic3RyYWN0QmluZGVyIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIGJpbmRBc0NvbnRyYWN0KE1vbml0b3JpbmdDb250YWluZXJMaXN0ZW5lci5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgLnRvKENvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyLmNsYXNzKS5pbihTaW5nbGV0b24uY2xhc3MpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9Nb25pdG9yaW5nRXZlbnRMaXN0ZW5lci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9Nb25pdG9yaW5nRXZlbnRMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0YWJmZDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL01vbml0b3JpbmdFdmVudExpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwzMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLm1vbml0b3Jpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlF1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkFycmF5QmxvY2tpbmdRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJpb3JpdHk7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNZXRob2Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuQXBwbGljYXRpb25FdmVudDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5BcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuRGVzdHJveUxpc3RlbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLlJlcXVlc3RFdmVudDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5SZXF1ZXN0RXZlbnRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS51cmkuVXJpVGVtcGxhdGU7CisKKy8qKgorICoge0BsaW5rIEFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lciBhcHBsaWNhdGlvbiBldmVudCBsaXN0ZW5lcn0gdGhhdCBsaXN0ZW5zIHRvIHtAbGluayBBcHBsaWNhdGlvbkV2ZW50IGFwcGxpY2F0aW9ufQorICogYW5kIHtAbGluayBSZXF1ZXN0RXZlbnQgcmVxdWVzdH0gZXZlbnRzIGFuZCBzdXBwbGllcyBkYXRhIHRvIHtAbGluayBNb25pdG9yaW5nU3RhdGlzdGljc1Byb2Nlc3Nvcn0gd2hpY2gKKyAqIHByb2R1Y2VzIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5Nb25pdG9yaW5nU3RhdGlzdGljcyBtb25pdG9yaW5nIHN0YXRpc3RpY3N9LgorICogPHA+CisgKiBUaGUge0BsaW5rIE1vbml0b3JpbmdTdGF0aXN0aWNzUHJvY2Vzc29yfSBpcyBzdGFydGVkIGJ5IHRoaXMgY2xhc3MgYWZ0ZXIgdGhlIGZpcnN0IGFwcGxpY2F0aW9uIGV2ZW50CisgKiBjb21lcy4KKyAqIDwvcD4KKyAqIDxwPgorICogVGhpcyBldmVudCBsaXN0ZW5lciBtdXN0IGJlIHJlZ2lzdGVyZWQgYXMgYSBzdGFuZGFyZCBwcm92aWRlciB3aGVuIG1vbml0b3Jpbmcgc3RhdGlzdGljcyBhcmUgcmVxdWlyZWQKKyAqIGluIHRoZSBydW50aW1lLgorICogPC9wPgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqIEBzZWUgTW9uaXRvcmluZ1N0YXRpc3RpY3NQcm9jZXNzb3IKKyAqLworQFByaW9yaXR5KEFwcGxpY2F0aW9uSW5mb0xpc3RlbmVyLlBSSU9SSVRZICsgMTAwKQorcHVibGljIGZpbmFsIGNsYXNzIE1vbml0b3JpbmdFdmVudExpc3RlbmVyIGltcGxlbWVudHMgQXBwbGljYXRpb25FdmVudExpc3RlbmVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKE1vbml0b3JpbmdFdmVudExpc3RlbmVyLmNsYXNzLmdldE5hbWUoKSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVWRU5UX1FVRVVFX1NJWkUgPSA1MDBfMDAwOworCisgICAgQEluamVjdAorICAgIHByaXZhdGUgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyOworCisgICAgcHJpdmF0ZSBmaW5hbCBRdWV1ZTxSZXF1ZXN0U3RhdHM+IHJlcXVlc3RRdWV1ZWRJdGVtcyA9IG5ldyBBcnJheUJsb2NraW5nUXVldWU8PihFVkVOVF9RVUVVRV9TSVpFKTsKKyAgICBwcml2YXRlIGZpbmFsIFF1ZXVlPEludGVnZXI+IHJlc3BvbnNlU3RhdHVzZXMgPSBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPD4oRVZFTlRfUVVFVUVfU0laRSk7CisgICAgcHJpdmF0ZSBmaW5hbCBRdWV1ZTxSZXF1ZXN0RXZlbnQ+IGV4Y2VwdGlvbk1hcHBlckV2ZW50cyA9IG5ldyBBcnJheUJsb2NraW5nUXVldWU8PihFVkVOVF9RVUVVRV9TSVpFKTsKKyAgICBwcml2YXRlIHZvbGF0aWxlIE1vbml0b3JpbmdTdGF0aXN0aWNzUHJvY2Vzc29yIG1vbml0b3JpbmdTdGF0aXN0aWNzUHJvY2Vzc29yOworCisgICAgLyoqCisgICAgICogVGltZSBzdGF0aXN0aWNzLgorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBUaW1lU3RhdHMgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgbG9uZyBkdXJhdGlvbjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIHN0YXJ0VGltZTsKKworICAgICAgICBwcml2YXRlIFRpbWVTdGF0cyhmaW5hbCBsb25nIHN0YXJ0VGltZSwgZmluYWwgbG9uZyByZXF1ZXN0RHVyYXRpb24pIHsKKyAgICAgICAgICAgIHRoaXMuZHVyYXRpb24gPSByZXF1ZXN0RHVyYXRpb247CisgICAgICAgICAgICB0aGlzLnN0YXJ0VGltZSA9IHN0YXJ0VGltZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgZHVyYXRpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gRHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzLgorICAgICAgICAgKi8KKyAgICAgICAgbG9uZyBnZXREdXJhdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBkdXJhdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgc3RhcnQgdGltZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBTdGFydCB0aW1lIChVbml4IHRpbWVzdGFtcCBmb3JtYXQpLgorICAgICAgICAgKi8KKyAgICAgICAgbG9uZyBnZXRTdGFydFRpbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhcnRUaW1lOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTWV0aG9kIHN0YXRpc3RpY3MuCisgICAgICovCisgICAgc3RhdGljIGNsYXNzIE1ldGhvZFN0YXRzIGV4dGVuZHMgVGltZVN0YXRzIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFJlc291cmNlTWV0aG9kIG1ldGhvZDsKKworICAgICAgICBwcml2YXRlIE1ldGhvZFN0YXRzKGZpbmFsIFJlc291cmNlTWV0aG9kIG1ldGhvZCwgZmluYWwgbG9uZyBzdGFydFRpbWUsIGZpbmFsIGxvbmcgcmVxdWVzdER1cmF0aW9uKSB7CisgICAgICAgICAgICBzdXBlcihzdGFydFRpbWUsIHJlcXVlc3REdXJhdGlvbik7CisgICAgICAgICAgICB0aGlzLm1ldGhvZCA9IG1ldGhvZDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIHJlc291cmNlIG1ldGhvZCBleGVjdXRlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiByZXNvdXJjZSBtZXRob2QuCisgICAgICAgICAqLworICAgICAgICBSZXNvdXJjZU1ldGhvZCBnZXRNZXRob2QoKSB7CisgICAgICAgICAgICByZXR1cm4gbWV0aG9kOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVxdWVzdCBzdGF0aXN0aWNzLgorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBSZXF1ZXN0U3RhdHMgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgVGltZVN0YXRzIHJlcXVlc3RTdGF0czsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBNZXRob2RTdGF0cyBtZXRob2RTdGF0czsgLy8gbWlnaHQgYmUgbnVsbCBpZiBhIG1ldGhvZCB3YXMgbm90IGV4ZWN1dGVkIGR1cmluZyBhIHJlcXVlc3QKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcmVxdWVzdFVyaTsKKworICAgICAgICBwcml2YXRlIFJlcXVlc3RTdGF0cyhmaW5hbCBUaW1lU3RhdHMgcmVxdWVzdFN0YXRzLCBmaW5hbCBNZXRob2RTdGF0cyBtZXRob2RTdGF0cywgZmluYWwgU3RyaW5nIHJlcXVlc3RVcmkpIHsKKyAgICAgICAgICAgIHRoaXMucmVxdWVzdFN0YXRzID0gcmVxdWVzdFN0YXRzOworICAgICAgICAgICAgdGhpcy5tZXRob2RTdGF0cyA9IG1ldGhvZFN0YXRzOworICAgICAgICAgICAgdGhpcy5yZXF1ZXN0VXJpID0gcmVxdWVzdFVyaTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgcmVxdWVzdCBzdGF0aXN0aWNzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHJlcXVlc3Qgc3RhdGlzdGljcy4KKyAgICAgICAgICovCisgICAgICAgIFRpbWVTdGF0cyBnZXRSZXF1ZXN0U3RhdHMoKSB7CisgICAgICAgICAgICByZXR1cm4gcmVxdWVzdFN0YXRzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBtZXRob2Qgc3RhdGlzdGljcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBtZXRob2Qgc3RhdGlzdGljcy4KKyAgICAgICAgICovCisgICAgICAgIE1ldGhvZFN0YXRzIGdldE1ldGhvZFN0YXRzKCkgeworICAgICAgICAgICAgcmV0dXJuIG1ldGhvZFN0YXRzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgcmVxdWVzdCB1cmkuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gcmVxdWVzdCB1cmkuCisgICAgICAgICAqLworICAgICAgICBTdHJpbmcgZ2V0UmVxdWVzdFVyaSgpIHsKKyAgICAgICAgICAgIHJldHVybiByZXF1ZXN0VXJpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlcUV2ZW50TGlzdGVuZXIgb25SZXF1ZXN0KGZpbmFsIFJlcXVlc3RFdmVudCByZXF1ZXN0RXZlbnQpIHsKKyAgICAgICAgc3dpdGNoIChyZXF1ZXN0RXZlbnQuZ2V0VHlwZSgpKSB7CisgICAgICAgICAgICBjYXNlIFNUQVJUOgorICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVxRXZlbnRMaXN0ZW5lcigpOworCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25FdmVudChmaW5hbCBBcHBsaWNhdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uRXZlbnQuVHlwZSB0eXBlID0gZXZlbnQuZ2V0VHlwZSgpOworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgSU5JVElBTElaQVRJT05fU1RBUlQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJFTE9BRF9GSU5JU0hFRDoKKyAgICAgICAgICAgIGNhc2UgSU5JVElBTElaQVRJT05fRklOSVNIRUQ6CisgICAgICAgICAgICAgICAgdGhpcy5tb25pdG9yaW5nU3RhdGlzdGljc1Byb2Nlc3NvciA9IG5ldyBNb25pdG9yaW5nU3RhdGlzdGljc1Byb2Nlc3NvcihpbmplY3Rpb25NYW5hZ2VyLCB0aGlzKTsKKyAgICAgICAgICAgICAgICB0aGlzLm1vbml0b3JpbmdTdGF0aXN0aWNzUHJvY2Vzc29yLnN0YXJ0TW9uaXRvcmluZ1dvcmtlcigpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBERVNUUk9ZX0ZJTklTSEVEOgorICAgICAgICAgICAgICAgIGlmIChtb25pdG9yaW5nU3RhdGlzdGljc1Byb2Nlc3NvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtb25pdG9yaW5nU3RhdGlzdGljc1Byb2Nlc3Nvci5zaHV0RG93bigpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfTU9OSVRPUklOR19TSFVURE9XTl9JTlRFUlJVUFRFRCgpLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIG9uRGVzdHJveQorICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8RGVzdHJveUxpc3RlbmVyPiBsaXN0ZW5lcnMgPQorICAgICAgICAgICAgICAgICAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5nZXRBbGxJbnN0YW5jZXMoRGVzdHJveUxpc3RlbmVyLmNsYXNzKTsKKworICAgICAgICAgICAgICAgIGZvciAoZmluYWwgRGVzdHJveUxpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5vbkRlc3Ryb3koKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfTU9OSVRPUklOR19TVEFUSVNUSUNTX0xJU1RFTkVSX0RFU1RST1kobGlzdGVuZXIuZ2V0Q2xhc3MoKSksIGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgUmVxRXZlbnRMaXN0ZW5lciBpbXBsZW1lbnRzIFJlcXVlc3RFdmVudExpc3RlbmVyIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIGxvbmcgcmVxdWVzdFRpbWVTdGFydDsKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBsb25nIG1ldGhvZFRpbWVTdGFydDsKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBNZXRob2RTdGF0cyBtZXRob2RTdGF0czsKKworICAgICAgICBwdWJsaWMgUmVxRXZlbnRMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHRoaXMucmVxdWVzdFRpbWVTdGFydCA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRXZlbnQoZmluYWwgUmVxdWVzdEV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICBmaW5hbCBsb25nIG5vdyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LmdldFR5cGUoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgUkVTT1VSQ0VfTUVUSE9EX1NUQVJUOgorICAgICAgICAgICAgICAgICAgICB0aGlzLm1ldGhvZFRpbWVTdGFydCA9IG5vdzsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBSRVNPVVJDRV9NRVRIT0RfRklOSVNIRUQ6CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlc291cmNlTWV0aG9kIG1ldGhvZCA9IGV2ZW50LmdldFVyaUluZm8oKS5nZXRNYXRjaGVkUmVzb3VyY2VNZXRob2QoKTsKKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kU3RhdHMgPSBuZXcgTWV0aG9kU3RhdHMobWV0aG9kLCBtZXRob2RUaW1lU3RhcnQsIG5vdyAtIG1ldGhvZFRpbWVTdGFydCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRVhDRVBUSU9OX01BUFBJTkdfRklOSVNIRUQ6CisgICAgICAgICAgICAgICAgICAgIGlmICghZXhjZXB0aW9uTWFwcGVyRXZlbnRzLm9mZmVyKGV2ZW50KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLndhcm5pbmcoTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfTU9OSVRPUklOR19RVUVVRV9NQVBQRVIoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBGSU5JU0hFRDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50LmlzUmVzcG9uc2VXcml0dGVuKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2VTdGF0dXNlcy5vZmZlcihldmVudC5nZXRDb250YWluZXJSZXNwb25zZSgpLmdldFN0YXR1cygpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi53YXJuaW5nKExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX01PTklUT1JJTkdfUVVFVUVfUkVTUE9OU0UoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8VXJpVGVtcGxhdGU+IG9yZGVyZWRUZW1wbGF0ZXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldFVyaUluZm8oKS5nZXRNYXRjaGVkVGVtcGxhdGVzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy5jb2xsZWN0aW5nQW5kVGhlbihDb2xsZWN0b3JzLnRvTGlzdCgpLCB1cmlUZW1wbGF0ZXMgLT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnJldmVyc2UodXJpVGVtcGxhdGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXJpVGVtcGxhdGVzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoZmluYWwgVXJpVGVtcGxhdGUgdXJpVGVtcGxhdGUgOiBvcmRlcmVkVGVtcGxhdGVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQodXJpVGVtcGxhdGUuZ2V0VGVtcGxhdGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXVyaVRlbXBsYXRlLmVuZHNXaXRoU2xhc2goKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiLyIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc2Iuc2V0TGVuZ3RoKHNiLmxlbmd0aCgpIC0gMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoIXJlcXVlc3RRdWV1ZWRJdGVtcy5vZmZlcihuZXcgUmVxdWVzdFN0YXRzKG5ldyBUaW1lU3RhdHMocmVxdWVzdFRpbWVTdGFydCwgbm93IC0gcmVxdWVzdFRpbWVTdGFydCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kU3RhdHMsIHNiLnRvU3RyaW5nKCkpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLndhcm5pbmcoTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfTU9OSVRPUklOR19RVUVVRV9SRVFVRVNUKCkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZXhjZXB0aW9uIG1hcHBlciBldmVudCBxdWV1ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gRXhjZXB0aW9uIG1hcHBlciBldmVudCBxdWV1ZS4KKyAgICAgKi8KKyAgICBRdWV1ZTxSZXF1ZXN0RXZlbnQ+IGdldEV4Y2VwdGlvbk1hcHBlckV2ZW50cygpIHsKKyAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbk1hcHBlckV2ZW50czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHJlcXVlc3QgZXZlbnQgcXVldWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFJlcXVlc3QgZXZlbnQgcXVldWUuCisgICAgICovCisgICAgUXVldWU8UmVxdWVzdFN0YXRzPiBnZXRSZXF1ZXN0UXVldWVkSXRlbXMoKSB7CisgICAgICAgIHJldHVybiByZXF1ZXN0UXVldWVkSXRlbXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBxdWV1ZSB3aXRoIHJlc3BvbnNlIHN0YXR1cyBjb2Rlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gcmVzcG9uc2Ugc3RhdHVzIHF1ZXVlLgorICAgICAqLworICAgIFF1ZXVlPEludGVnZXI+IGdldFJlc3BvbnNlU3RhdHVzZXMoKSB7CisgICAgICAgIHJldHVybiByZXNwb25zZVN0YXR1c2VzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3JpbmcvTW9uaXRvcmluZ0ZlYXR1cmUuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3JpbmcvTW9uaXRvcmluZ0ZlYXR1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWY5ZmRhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9Nb25pdG9yaW5nRmVhdHVyZS5qYXZhCkBAIC0wLDAgKzEsMTk5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5tb25pdG9yaW5nOworCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljVHlwZTsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQWJzdHJhY3RCaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LlJlZmVyZW5jaW5nRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uUmVmOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwubW9uaXRvcmluZy5qbXguTUJlYW5FeHBvc2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLkFwcGxpY2F0aW9uSW5mbzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5Nb25pdG9yaW5nU3RhdGlzdGljczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5Nb25pdG9yaW5nU3RhdGlzdGljc0xpc3RlbmVyOworCisvKioKKyAqIEZlYXR1cmUgdGhhdCBlbmFibGVzIGNhbGN1bGF0aW5nIG9mIHtAbGluayBNb25pdG9yaW5nU3RhdGlzdGljcyBtb25pdG9yaW5nIHN0YXRpc3RpY3N9IGFuZAorICogb3B0aW9uYWxseSBhbHNvIGVuYWJsZXMgZXhwb3N1cmUgb2YgbW9uaXRvcmluZyBNQmVhbnMuCisgKiA8cD4KKyAqIENhbGN1bGF0aW9uIG9mIHtAY29kZSBNb25pdG9yaW5nU3RhdGlzdGljc30gaXMgbmVjZXNzYXJ5IGluIG9yZGVyIHRvIGV4cG9zZSBtb25pdG9yaW5nIE1CZWFucywgc28gYnkgZGVmYXVsdAorICogdGhpcyBmZWF0dXJlIGFsd2F5cyBlbmFibGVzIGNhbGN1bGF0aW9uIG9mIHtAY29kZSBNb25pdG9yaW5nU3RhdGlzdGljc30uIEFkZGl0aW9uYWxseSwgdGhlIGZlYXR1cmUgY2FuIGJlCisgKiBjb25maWd1cmVkIGJ5IHNldHRpbmcge0Bjb2RlIHRydWV9IHRvIHtAbGluayAjc2V0bUJlYW5zRW5hYmxlZChib29sZWFuKX0gaW4gb3JkZXIgdG8gZW5hYmxlIGV4cG9zdXJlCisgKiBvZiBtb25pdG9yaW5nIE1CZWFucy4gVGhlIHNhbWUgY2FuIGJlIGFjaGlldmVkIGJ5IGNvbmZpZ3VyYXRpb24gb2YgYSBwcm9wZXJ0eQorICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzI01PTklUT1JJTkdfU1RBVElTVElDU19NQkVBTlNfRU5BQkxFRH0gd2hpY2gKKyAqIG92ZXJyaWRlcyB0aGUgc2V0dGluZyBkZWZpbmVkIGJ5IHRoZSB7QGxpbmsgI3NldG1CZWFuc0VuYWJsZWQoYm9vbGVhbil9IG1ldGhvZC4KKyAqIDxwLz4KKyAqIDxwPgorICogVGhlIE1vbml0b3JpbmdTdGF0aXN0aWNzIGNhbiBiZSBjb250cm9sbGVkIGFsc28gYnkgZGVmaW5pdGlvbiBvZiBhIHByb3BlcnR5CisgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMjTU9OSVRPUklOR19TVEFUSVNUSUNTX0VOQUJMRUR9IHdoaWNoIG92ZXJyaWRlcworICogdGhlIHJlZ2lzdHJhdGlvbiBvZiB0aGlzIGZlYXR1cmUuCisgKiA8L3A+CisgKiBXaGVuIGF1dG8tZGlzY292ZXJ5IGlzIGVuYWJsZWQgdGhlbiBtb25pdG9yaW5nIHN0YXRpc3RpY3MgYW5kIGV4cG9zdXJlIG9mIE1CZWFucyBjYW4gYmUgY29udHJvbGxlZCBvbmx5CisgKiBieSBwcm9wZXJ0aWVzIGFib3ZlIHdpdGhvdXQgYSBuZWVkIHRvIGV4cGxpY2l0bHkgcmVnaXN0ZXIgdGhpcyBmZWF0dXJlLgorICoKKyAqIEBzZWUgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMjTU9OSVRPUklOR19TVEFUSVNUSUNTX0VOQUJMRUQgZm9yIG1vcmUgZGV0YWlscy4KKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE1vbml0b3JpbmdGZWF0dXJlIGltcGxlbWVudHMgRmVhdHVyZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihNb25pdG9yaW5nRmVhdHVyZS5jbGFzcy5nZXROYW1lKCkpOworCisgICAgcHJpdmF0ZSBib29sZWFuIG1vbml0b3JpbmdFbmFibGVkID0gdHJ1ZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gc3RhdGlzdGljc0VuYWJsZWQgPSB0cnVlOyAvLyBtb25pdG9yaW5nIHN0YXRpc3RpY3MgYXJlIGVuYWJsZWQgb25seSBpZiBtb25pdG9yaW5nIGlzIGVuYWJsZWQKKyAgICBwcml2YXRlIGJvb2xlYW4gbUJlYW5zRW5hYmxlZDsgLy8gbW9uaXRvcmluZyBtYmVhbnMgYXJlIGVuYWJsZWQgb25seSBpZiBtb25pdG9yaW5nIHN0YXRpc3RpY3MgaXMgZW5hYmxlZAorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlKEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgZmluYWwgQm9vbGVhbiBtb25pdG9yaW5nRW5hYmxlZFByb3BlcnR5ID0gU2VydmVyUHJvcGVydGllcy5nZXRWYWx1ZShjb250ZXh0LmdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0aWVzKCksCisgICAgICAgICAgICAgICAgU2VydmVyUHJvcGVydGllcy5NT05JVE9SSU5HX0VOQUJMRUQsIG51bGwsIEJvb2xlYW4uY2xhc3MpOworICAgICAgICBmaW5hbCBCb29sZWFuIHN0YXRpc3RpY3NFbmFibGVkUHJvcGVydHkgPSBTZXJ2ZXJQcm9wZXJ0aWVzLmdldFZhbHVlKGNvbnRleHQuZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnRpZXMoKSwKKyAgICAgICAgICAgICAgICBTZXJ2ZXJQcm9wZXJ0aWVzLk1PTklUT1JJTkdfU1RBVElTVElDU19FTkFCTEVELCBudWxsLCBCb29sZWFuLmNsYXNzKTsKKyAgICAgICAgZmluYWwgQm9vbGVhbiBtYmVhbnNFbmFibGVkUHJvcGVydHkgPSBTZXJ2ZXJQcm9wZXJ0aWVzLmdldFZhbHVlKGNvbnRleHQuZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnRpZXMoKSwKKyAgICAgICAgICAgICAgICBTZXJ2ZXJQcm9wZXJ0aWVzLk1PTklUT1JJTkdfU1RBVElTVElDU19NQkVBTlNfRU5BQkxFRCwgbnVsbCwgQm9vbGVhbi5jbGFzcyk7CisKKyAgICAgICAgaWYgKG1vbml0b3JpbmdFbmFibGVkUHJvcGVydHkgIT0gbnVsbCkgeworICAgICAgICAgICAgbW9uaXRvcmluZ0VuYWJsZWQgPSBtb25pdG9yaW5nRW5hYmxlZFByb3BlcnR5OworICAgICAgICAgICAgc3RhdGlzdGljc0VuYWJsZWQgPSBtb25pdG9yaW5nRW5hYmxlZDsgLy8gbW9uaXRvcmluZyBzdGF0aXN0aWNzIGFyZSBlbmFibGVkIGJ5IGRlZmF1bHQgaWYgbW9uaXRvcmluZyBpcyBlbmFibGVkCisgICAgICAgIH0KKworICAgICAgICBpZiAoc3RhdGlzdGljc0VuYWJsZWRQcm9wZXJ0eSAhPSBudWxsKSB7CisgICAgICAgICAgICBtb25pdG9yaW5nRW5hYmxlZCA9IG1vbml0b3JpbmdFbmFibGVkIHx8IHN0YXRpc3RpY3NFbmFibGVkUHJvcGVydHk7CisgICAgICAgICAgICBzdGF0aXN0aWNzRW5hYmxlZCA9IHN0YXRpc3RpY3NFbmFibGVkUHJvcGVydHk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWJlYW5zRW5hYmxlZFByb3BlcnR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1vbml0b3JpbmdFbmFibGVkID0gbW9uaXRvcmluZ0VuYWJsZWQgfHwgbWJlYW5zRW5hYmxlZFByb3BlcnR5OworICAgICAgICAgICAgc3RhdGlzdGljc0VuYWJsZWQgPSBzdGF0aXN0aWNzRW5hYmxlZCB8fCBtYmVhbnNFbmFibGVkUHJvcGVydHk7CisgICAgICAgICAgICBtQmVhbnNFbmFibGVkID0gbWJlYW5zRW5hYmxlZFByb3BlcnR5OworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0YXRpc3RpY3NFbmFibGVkUHJvcGVydHkgIT0gbnVsbCAmJiAhc3RhdGlzdGljc0VuYWJsZWRQcm9wZXJ0eSkgeworICAgICAgICAgICAgaWYgKG1iZWFuc0VuYWJsZWRQcm9wZXJ0eSAhPSBudWxsICYmIG1CZWFuc0VuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGl6YXRpb25NZXNzYWdlcy5XQVJOSU5HX01PTklUT1JJTkdfRkVBVFVSRV9FTkFCTEVEKFNlcnZlclByb3BlcnRpZXMuTU9OSVRPUklOR19TVEFUSVNUSUNTX0VOQUJMRUQpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxpemF0aW9uTWVzc2FnZXMuV0FSTklOR19NT05JVE9SSU5HX0ZFQVRVUkVfRElTQUJMRUQoU2VydmVyUHJvcGVydGllcy5NT05JVE9SSU5HX1NUQVRJU1RJQ1NfRU5BQkxFRCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG1vbml0b3JpbmdFbmFibGVkKSB7CisgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKEFwcGxpY2F0aW9uSW5mb0xpc3RlbmVyLmNsYXNzKTsKKyAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIobmV3IEFic3RyYWN0QmluZGVyKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgYmluZEZhY3RvcnkoUmVmZXJlbmNpbmdGYWN0b3J5LjxBcHBsaWNhdGlvbkluZm8+cmVmZXJlbmNlRmFjdG9yeSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50byhuZXcgR2VuZXJpY1R5cGU8UmVmPEFwcGxpY2F0aW9uSW5mbz4+KCkgeyB9KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbihTaW5nbGV0b24uY2xhc3MpOworCisgICAgICAgICAgICAgICAgICAgIGJpbmRGYWN0b3J5KEFwcGxpY2F0aW9uSW5mb0luamVjdGlvbkZhY3RvcnkuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvKEFwcGxpY2F0aW9uSW5mby5jbGFzcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc3RhdGlzdGljc0VuYWJsZWQpIHsKKyAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoTW9uaXRvcmluZ0V2ZW50TGlzdGVuZXIuY2xhc3MpOworICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihuZXcgQWJzdHJhY3RCaW5kZXIoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICAgICAgICAgICAgICBiaW5kRmFjdG9yeShSZWZlcmVuY2luZ0ZhY3RvcnkuPE1vbml0b3JpbmdTdGF0aXN0aWNzPnJlZmVyZW5jZUZhY3RvcnkoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG8obmV3IEdlbmVyaWNUeXBlPFJlZjxNb25pdG9yaW5nU3RhdGlzdGljcz4+KCkgeyB9KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbihTaW5nbGV0b24uY2xhc3MpOworCisgICAgICAgICAgICAgICAgICAgIGJpbmRGYWN0b3J5KFN0YXRpc3RpY3NJbmplY3Rpb25GYWN0b3J5LmNsYXNzKS50byhNb25pdG9yaW5nU3RhdGlzdGljcy5jbGFzcyk7CisKKyAgICAgICAgICAgICAgICAgICAgYmluZChTdGF0aXN0aWNzTGlzdGVuZXIuY2xhc3MpLnRvKE1vbml0b3JpbmdTdGF0aXN0aWNzTGlzdGVuZXIuY2xhc3MpLmluKFNpbmdsZXRvbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUJlYW5zRW5hYmxlZCkgeworICAgICAgICAgICAgLy8gaW5zdGFuY2UgcmVnaXN0cmF0aW9uIGlzIG5lZWRlZCBoZXJlIGFzIE1CZWFuRXhwb3NlciBuZWVkcyB0byBiZSBhIHNpbmdsZXRvbiBzbyB0aGF0CisgICAgICAgICAgICAvLyBvbmUgaW5zdGFuY2UgaGFuZGxlcyBsaXN0ZW5pbmcgdG8gZXZlbnRzIG9mIE1vbml0b3JpbmdTdGF0aXN0aWNzTGlzdGVuZXIgYW5kIENvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyCisgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKG5ldyBNQmVhbkV4cG9zZXIoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbW9uaXRvcmluZ0VuYWJsZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHdoZXRoZXIgdGhlIGZlYXR1cmUgc2hvdWxkIGFsc28gZW5hYmxlIGV4cG9zdXJlIG9mIG1vbml0b3Jpbmcgc3RhdGlzdGljcyBNQmVhbnMuCisgICAgICogVGhlIHNldCB2YWx1ZSBjYW4gYmUgb3ZlcndyaXR0ZW4gYnkgdGhlIGRlZmluaXRpb24gb2YgdGhlIHByb3BlcnR5CisgICAgICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzI01PTklUT1JJTkdfU1RBVElTVElDU19NQkVBTlNfRU5BQkxFRH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbUJlYW5zRW5hYmxlZCB7QGNvZGUgdHJ1ZX0gaXMgbW9uaXRvcmluZyBNQmVhbnMgc2hvdWxkIGJlIGV4cG9zZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0bUJlYW5zRW5hYmxlZChib29sZWFuIG1CZWFuc0VuYWJsZWQpIHsKKyAgICAgICAgdGhpcy5tQmVhbnNFbmFibGVkID0gbUJlYW5zRW5hYmxlZDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBcHBsaWNhdGlvbkluZm9JbmplY3Rpb25GYWN0b3J5IGV4dGVuZHMgUmVmZXJlbmNpbmdGYWN0b3J5PEFwcGxpY2F0aW9uSW5mbz4geworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgbmV3IHJlZmVyZW5jaW5nIGluamVjdGlvbiBmYWN0b3J5LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcmVmZXJlbmNlRmFjdG9yeSByZWZlcmVuY2UgcHJvdmlkZXIgYmFja2luZyB0aGUgZmFjdG9yeS4KKyAgICAgICAgICovCisgICAgICAgIEBJbmplY3QKKyAgICAgICAgcHVibGljIEFwcGxpY2F0aW9uSW5mb0luamVjdGlvbkZhY3RvcnkoUHJvdmlkZXI8UmVmPEFwcGxpY2F0aW9uSW5mbz4+IHJlZmVyZW5jZUZhY3RvcnkpIHsKKyAgICAgICAgICAgIHN1cGVyKHJlZmVyZW5jZUZhY3RvcnkpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTdGF0aXN0aWNzSW5qZWN0aW9uRmFjdG9yeSBleHRlbmRzIFJlZmVyZW5jaW5nRmFjdG9yeTxNb25pdG9yaW5nU3RhdGlzdGljcz4geworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgbmV3IHJlZmVyZW5jaW5nIGluamVjdGlvbiBmYWN0b3J5LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcmVmZXJlbmNlRmFjdG9yeSByZWZlcmVuY2UgcHJvdmlkZXIgYmFja2luZyB0aGUgZmFjdG9yeS4KKyAgICAgICAgICovCisgICAgICAgIEBJbmplY3QKKyAgICAgICAgcHVibGljIFN0YXRpc3RpY3NJbmplY3Rpb25GYWN0b3J5KFByb3ZpZGVyPFJlZjxNb25pdG9yaW5nU3RhdGlzdGljcz4+IHJlZmVyZW5jZUZhY3RvcnkpIHsKKyAgICAgICAgICAgIHN1cGVyKHJlZmVyZW5jZUZhY3RvcnkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBNb25pdG9yaW5nU3RhdGlzdGljcyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTdGF0aXN0aWNzTGlzdGVuZXIgaW1wbGVtZW50cyBNb25pdG9yaW5nU3RhdGlzdGljc0xpc3RlbmVyIHsKKworICAgICAgICBASW5qZWN0CisgICAgICAgIFByb3ZpZGVyPFJlZjxNb25pdG9yaW5nU3RhdGlzdGljcz4+IHN0YXRpc3RpY3NGYWN0b3J5OworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXRpc3RpY3MoTW9uaXRvcmluZ1N0YXRpc3RpY3Mgc3RhdGlzdGljcykgeworICAgICAgICAgICAgc3RhdGlzdGljc0ZhY3RvcnkuZ2V0KCkuc2V0KHN0YXRpc3RpY3MpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL01vbml0b3JpbmdTdGF0aXN0aWNzSW1wbC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9Nb25pdG9yaW5nU3RhdGlzdGljc0ltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDU2YmM2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9Nb25pdG9yaW5nU3RhdGlzdGljc0ltcGwuamF2YQpAQCAtMCwwICsxLDI3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwubW9uaXRvcmluZzsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRNYXA7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLlZpZXdzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNZXRob2Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTW9kZWw7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuRXhjZXB0aW9uTWFwcGVyU3RhdGlzdGljczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5FeGVjdXRpb25TdGF0aXN0aWNzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLk1vbml0b3JpbmdTdGF0aXN0aWNzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLlJlc291cmNlU3RhdGlzdGljczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5SZXNwb25zZVN0YXRpc3RpY3M7CisKKy8qKgorICogTW9uaXRvcmluZyBzdGF0aXN0aWNzIGltcGxlbWVudGF0aW9uLgorICogPHAvPgorICogVGhpcyBvYmplY3QgaXMgbG9vc2VseSBpbW11dGFibGUgKGkuZS4sIHtAbGluayAjZ2V0UmVzb3VyY2VDbGFzc1N0YXRpc3RpY3MoKX0gYW5kIHtAbGluayAjZ2V0VXJpU3RhdGlzdGljcygpfSBnZXRzIHVwZGF0ZWQgb24KKyAqIGFjY2VzcykuIEFzIGEgcmVzdWx0LCBpdCBpcyB1bm5lY2Vzc2FyeSB0byBjYWxsIHtAbGluayAjc25hcHNob3QoKX0uCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitmaW5hbCBjbGFzcyBNb25pdG9yaW5nU3RhdGlzdGljc0ltcGwgaW1wbGVtZW50cyBNb25pdG9yaW5nU3RhdGlzdGljcyB7CisKKyAgICAvKioKKyAgICAgKiBCdWlsZGVyIG9mIG1vbml0b3Jpbmcgc3RhdGlzdGljcy4KKyAgICAgKiA8cC8+CisgICAgICogVGhpcyBidWlsZGVyIGRvZXMgbm90IG5lZWQgdG8gYmUgdGhyZWFkc2FmZSBhcyBpdCdzIG9ubHkgYWNjZXNzZWQgYnkgamVyc2V5LWJhY2tncm91bmQtdGFzay1zY2hlZHVsZXIuIEhvd2V2ZXIsIHtAbGluaworICAgICAqICNCVUlMRElOR19GVU5DVElPTn0gaXMgdHJpZ2dlcmVkIHdoZW4gaXQgaXMgYWNjZXNzZWQgKGUuZy4sIGJ5IHNlcnZsZXQtY29udGFpbmVyIHRocmVhZC1wb29sIHRocmVhZHMpIHdoaWNoIGFkZHMgdGhyZWFkc2FmZQorICAgICAqIGNvbnN0cmFpbnQgb24gc29tZSBvZiB0aGUgc3ViLWJ1aWxkZXJzLgorICAgICAqIDxwLz4KKyAgICAgKiBTdWItQnVpbGRlcnMgdGhhdCByZXF1aXJlIHRocmVhZC1zYWZldHkKKyAgICAgKiA8cHJlPjx1bD4KKyAgICAgKiAgICAgPGxpPntAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwubW9uaXRvcmluZy5FeGVjdXRpb25TdGF0aXN0aWNzSW1wbC5CdWlsZGVyfTwvbGk+CisgICAgICogICAgIDxsaT57QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLm1vbml0b3JpbmcuUmVzb3VyY2VTdGF0aXN0aWNzSW1wbC5CdWlsZGVyfTwvbGk+CisgICAgICogICAgIDxsaT57QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLm1vbml0b3JpbmcuUmVzb3VyY2VNZXRob2RTdGF0aXN0aWNzSW1wbC5CdWlsZGVyfTwvbGk+CisgICAgICogICAgIDxsaT57QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLm1vbml0b3JpbmcuVGltZVdpbmRvd1N0YXRpc3RpY3NJbXBsLkJ1aWxkZXJ9PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIFRoZSByZXN0IGRvZXMgbm90IG5lZWQgdG8gYmUgdGhyZWFkLXNhZmUKKyAgICAgKiA8dWw+CisgICAgICogICAgIDxsaT57QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLm1vbml0b3JpbmcuRXhjZXB0aW9uTWFwcGVyU3RhdGlzdGljc0ltcGwuQnVpbGRlcn08L2xpPgorICAgICAqICAgICA8bGk+e0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5tb25pdG9yaW5nLlJlc3BvbnNlU3RhdGlzdGljc0ltcGwuQnVpbGRlcn08L2xpPgorICAgICAqIDwvdWw+PC9wcmU+CisgICAgICovCisgICAgc3RhdGljIGNsYXNzIEJ1aWxkZXIgeworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZ1bmN0aW9uPFJlc291cmNlU3RhdGlzdGljc0ltcGwuQnVpbGRlciwgUmVzb3VyY2VTdGF0aXN0aWNzPiBCVUlMRElOR19GVU5DVElPTiA9CisgICAgICAgICAgICAgICAgUmVzb3VyY2VTdGF0aXN0aWNzSW1wbC5CdWlsZGVyOjpidWlsZDsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFJlc3BvbnNlU3RhdGlzdGljc0ltcGwuQnVpbGRlciByZXNwb25zZVN0YXRpc3RpY3NCdWlsZGVyOworICAgICAgICBwcml2YXRlIGZpbmFsIEV4Y2VwdGlvbk1hcHBlclN0YXRpc3RpY3NJbXBsLkJ1aWxkZXIgZXhjZXB0aW9uTWFwcGVyU3RhdGlzdGljc0J1aWxkZXI7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZXNvdXJjZU1ldGhvZFN0YXRpc3RpY3NJbXBsLkZhY3RvcnkgbWV0aG9kRmFjdG9yeSA9IG5ldyBSZXNvdXJjZU1ldGhvZFN0YXRpc3RpY3NJbXBsLkZhY3RvcnkoKTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTb3J0ZWRNYXA8U3RyaW5nLCBSZXNvdXJjZVN0YXRpc3RpY3NJbXBsLkJ1aWxkZXI+IHVyaVN0YXRpc3RpY3MgPSBuZXcgVHJlZU1hcDw+KCk7CisgICAgICAgIHByaXZhdGUgZmluYWwgU29ydGVkTWFwPENsYXNzPD8+LCBSZXNvdXJjZVN0YXRpc3RpY3NJbXBsLkJ1aWxkZXI+IHJlc291cmNlQ2xhc3NTdGF0aXN0aWNzCisgICAgICAgICAgICAgICAgPSBuZXcgVHJlZU1hcDw+KChvMSwgbzIpIC0+IG8xLmdldE5hbWUoKS5jb21wYXJlVG8obzIuZ2V0TmFtZSgpKSk7CisKKyAgICAgICAgcHJpdmF0ZSBFeGVjdXRpb25TdGF0aXN0aWNzSW1wbC5CdWlsZGVyIGV4ZWN1dGlvblN0YXRpc3RpY3NCdWlsZGVyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgYSBuZXcgYnVpbGRlci4KKyAgICAgICAgICovCisgICAgICAgIEJ1aWxkZXIoKSB7CisgICAgICAgICAgICB0aGlzLnJlc3BvbnNlU3RhdGlzdGljc0J1aWxkZXIgPSBuZXcgUmVzcG9uc2VTdGF0aXN0aWNzSW1wbC5CdWlsZGVyKCk7CisgICAgICAgICAgICB0aGlzLmV4Y2VwdGlvbk1hcHBlclN0YXRpc3RpY3NCdWlsZGVyID0gbmV3IEV4Y2VwdGlvbk1hcHBlclN0YXRpc3RpY3NJbXBsLkJ1aWxkZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgYSBuZXcgYnVpbGRlciBhbmQgaW5pdGlhbGl6ZSBpdCBmcm9tIHJlc291cmNlIG1vZGVsLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcmVzb3VyY2VNb2RlbCByZXNvdXJjZSBtb2RlbC4KKyAgICAgICAgICovCisgICAgICAgIEJ1aWxkZXIoZmluYWwgUmVzb3VyY2VNb2RlbCByZXNvdXJjZU1vZGVsKSB7CisgICAgICAgICAgICB0aGlzKCk7CisKKyAgICAgICAgICAgIGZvciAoZmluYWwgUmVzb3VyY2UgcmVzb3VyY2UgOiByZXNvdXJjZU1vZGVsLmdldFJvb3RSZXNvdXJjZXMoKSkgeworICAgICAgICAgICAgICAgIHByb2Nlc3NSZXNvdXJjZShyZXNvdXJjZSwgIiIpOworICAgICAgICAgICAgICAgIGZvciAoZmluYWwgUmVzb3VyY2UgY2hpbGQgOiByZXNvdXJjZS5nZXRDaGlsZFJlc291cmNlcygpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwYXRoID0gcmVzb3VyY2UuZ2V0UGF0aCgpOworICAgICAgICAgICAgICAgICAgICBwcm9jZXNzUmVzb3VyY2UoY2hpbGQsIHBhdGguc3RhcnRzV2l0aCgiLyIpID8gcGF0aCA6ICIvIiArIHBhdGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NSZXNvdXJjZShmaW5hbCBSZXNvdXJjZSByZXNvdXJjZSwgZmluYWwgU3RyaW5nIHBhdGhQcmVmaXgpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgcGF0aFNCID0gbmV3IFN0cmluZ0J1aWxkZXIocGF0aFByZWZpeCk7CisgICAgICAgICAgICBpZiAoIXBhdGhQcmVmaXguZW5kc1dpdGgoIi8iKSAmJiAhcmVzb3VyY2UuZ2V0UGF0aCgpLnN0YXJ0c1dpdGgoIi8iKSkgeworICAgICAgICAgICAgICAgIHBhdGhTQi5hcHBlbmQoIi8iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhdGhTQi5hcHBlbmQocmVzb3VyY2UuZ2V0UGF0aCgpKTsKKworICAgICAgICAgICAgdXJpU3RhdGlzdGljcy5wdXQocGF0aFNCLnRvU3RyaW5nKCksIG5ldyBSZXNvdXJjZVN0YXRpc3RpY3NJbXBsLkJ1aWxkZXIocmVzb3VyY2UsIG1ldGhvZEZhY3RvcnkpKTsKKworICAgICAgICAgICAgZm9yIChmaW5hbCBSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCA6IHJlc291cmNlLmdldFJlc291cmNlTWV0aG9kcygpKSB7CisgICAgICAgICAgICAgICAgZ2V0T3JDcmVhdGVSZXNvdXJjZUJ1aWxkZXIocmVzb3VyY2VNZXRob2QpLmFkZE1ldGhvZChyZXNvdXJjZU1ldGhvZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFJlc291cmNlU3RhdGlzdGljc0ltcGwuQnVpbGRlciBnZXRPckNyZWF0ZVJlc291cmNlQnVpbGRlcihmaW5hbCBSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCkgeworICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gY2xhenogPSByZXNvdXJjZU1ldGhvZC5nZXRJbnZvY2FibGUoKS5nZXRIYW5kbGVyKCkuZ2V0SGFuZGxlckNsYXNzKCk7CisgICAgICAgICAgICBSZXNvdXJjZVN0YXRpc3RpY3NJbXBsLkJ1aWxkZXIgYnVpbGRlciA9IHJlc291cmNlQ2xhc3NTdGF0aXN0aWNzLmdldChjbGF6eik7CisgICAgICAgICAgICBpZiAoYnVpbGRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBSZXNvdXJjZVN0YXRpc3RpY3NJbXBsLkJ1aWxkZXIobWV0aG9kRmFjdG9yeSk7CisgICAgICAgICAgICAgICAgcmVzb3VyY2VDbGFzc1N0YXRpc3RpY3MucHV0KGNsYXp6LCBidWlsZGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBidWlsZGVyOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgZXhjZXB0aW9uIG1hcHBlciBzdGF0aXN0aWNzIGJ1aWxkZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gQnVpbGRlciBvZiBpbnRlcm5hbCBleGNlcHRpb24gbWFwcGVyIHN0YXRpc3RpY3MuCisgICAgICAgICAqLworICAgICAgICBFeGNlcHRpb25NYXBwZXJTdGF0aXN0aWNzSW1wbC5CdWlsZGVyIGdldEV4Y2VwdGlvbk1hcHBlclN0YXRpc3RpY3NCdWlsZGVyKCkgeworICAgICAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbk1hcHBlclN0YXRpc3RpY3NCdWlsZGVyOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBnbG9iYWwgcmVxdWVzdCBleGVjdXRpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzdGFydFRpbWUgdGltZSBvZiB0aGUgZXhlY3V0aW9uLgorICAgICAgICAgKiBAcGFyYW0gZHVyYXRpb24gIGR1cmF0aW9uIG9mIHRoZSBleGVjdXRpb24uCisgICAgICAgICAqLworICAgICAgICB2b2lkIGFkZFJlcXVlc3RFeGVjdXRpb24oZmluYWwgbG9uZyBzdGFydFRpbWUsIGZpbmFsIGxvbmcgZHVyYXRpb24pIHsKKyAgICAgICAgICAgIGlmIChleGVjdXRpb25TdGF0aXN0aWNzQnVpbGRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZXhlY3V0aW9uU3RhdGlzdGljc0J1aWxkZXIgPSBuZXcgRXhlY3V0aW9uU3RhdGlzdGljc0ltcGwuQnVpbGRlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZXhlY3V0aW9uU3RhdGlzdGljc0J1aWxkZXIuYWRkRXhlY3V0aW9uKHN0YXJ0VGltZSwgZHVyYXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBleGVjdXRpb24gb2YgYSByZXNvdXJjZSBtZXRob2QuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB1cmkgICAgICAgICAgICAgU3RyaW5nIHVyaSB3aGljaCB3YXMgZXhlY3V0ZWQuCisgICAgICAgICAqIEBwYXJhbSByZXNvdXJjZU1ldGhvZCAgUmVzb3VyY2UgbWV0aG9kLgorICAgICAgICAgKiBAcGFyYW0gbWV0aG9kVGltZSAgICAgIFRpbWUgc3BlbnQgb24gZXhlY3V0aW9uIG9mIHJlc291cmNlIG1ldGhvZCBpdHNlbGYgKFVuaXggdGltZXN0YW1wIGZvcm1hdCkuCisgICAgICAgICAqIEBwYXJhbSBtZXRob2REdXJhdGlvbiAgVGltZSBvZiBleGVjdXRpb24gb2YgdGhlIHJlc291cmNlIG1ldGhvZC4KKyAgICAgICAgICogQHBhcmFtIHJlcXVlc3RUaW1lICAgICBUaW1lIG9mIHdob2xlIHJlcXVlc3QgcHJvY2Vzc2luZyAoZnJvbSByZWNlaXZpbmcgdGhlIHJlcXVlc3QgdW50aWwgd3JpdGluZyB0aGUgcmVzcG9uc2UpLiAoVW5peAorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcCBmb3JtYXQpCisgICAgICAgICAqIEBwYXJhbSByZXF1ZXN0RHVyYXRpb24gVGltZSB3aGVuIHRoZSByZXF1ZXN0IG1hdGNoaW5nIHRvIHRoZSBleGVjdXRlZCByZXNvdXJjZSBtZXRob2QgaGFzIGJlZW4gcmVjZWl2ZWQgYnkgSmVyc2V5LgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBhZGRFeGVjdXRpb24oZmluYWwgU3RyaW5nIHVyaSwgZmluYWwgUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgbWV0aG9kVGltZSwgZmluYWwgbG9uZyBtZXRob2REdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyByZXF1ZXN0VGltZSwgZmluYWwgbG9uZyByZXF1ZXN0RHVyYXRpb24pIHsKKyAgICAgICAgICAgIC8vIFVyaSByZXNvdXJjZSBzdGF0cy4KKyAgICAgICAgICAgIFJlc291cmNlU3RhdGlzdGljc0ltcGwuQnVpbGRlciB1cmlTdGF0c0J1aWxkZXIgPSB1cmlTdGF0aXN0aWNzLmdldCh1cmkpOworICAgICAgICAgICAgaWYgKHVyaVN0YXRzQnVpbGRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdXJpU3RhdHNCdWlsZGVyID0gbmV3IFJlc291cmNlU3RhdGlzdGljc0ltcGwuQnVpbGRlcihyZXNvdXJjZU1ldGhvZC5nZXRQYXJlbnQoKSwgbWV0aG9kRmFjdG9yeSk7CisgICAgICAgICAgICAgICAgdXJpU3RhdGlzdGljcy5wdXQodXJpLCB1cmlTdGF0c0J1aWxkZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdXJpU3RhdHNCdWlsZGVyLmFkZEV4ZWN1dGlvbihyZXNvdXJjZU1ldGhvZCwgbWV0aG9kVGltZSwgbWV0aG9kRHVyYXRpb24sIHJlcXVlc3RUaW1lLCByZXF1ZXN0RHVyYXRpb24pOworCisgICAgICAgICAgICAvLyBDbGFzcyByZXNvdXJjZSBzdGF0cy4KKyAgICAgICAgICAgIGZpbmFsIFJlc291cmNlU3RhdGlzdGljc0ltcGwuQnVpbGRlciBjbGFzc1N0YXRzQnVpbGRlciA9IGdldE9yQ3JlYXRlUmVzb3VyY2VCdWlsZGVyKHJlc291cmNlTWV0aG9kKTsKKyAgICAgICAgICAgIGNsYXNzU3RhdHNCdWlsZGVyLmFkZEV4ZWN1dGlvbihyZXNvdXJjZU1ldGhvZCwgbWV0aG9kVGltZSwgbWV0aG9kRHVyYXRpb24sIHJlcXVlc3RUaW1lLCByZXF1ZXN0RHVyYXRpb24pOworCisgICAgICAgICAgICAvLyBSZXNvdXJjZSBtZXRob2Qgc3RhdHMuCisgICAgICAgICAgICBtZXRob2RGYWN0b3J5LmdldE9yQ3JlYXRlKHJlc291cmNlTWV0aG9kKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRSZXNvdXJjZU1ldGhvZEV4ZWN1dGlvbihtZXRob2RUaW1lLCBtZXRob2REdXJhdGlvbiwgcmVxdWVzdFRpbWUsIHJlcXVlc3REdXJhdGlvbik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIGEgcmVzcG9uc2Ugc3RhdHVzIGNvZGUgcHJvZHVjZXMgYnkgSmVyc2V5LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcmVzcG9uc2VDb2RlIFJlc3BvbnNlIHN0YXR1cyBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBhZGRSZXNwb25zZUNvZGUoZmluYWwgaW50IHJlc3BvbnNlQ29kZSkgeworICAgICAgICAgICAgcmVzcG9uc2VTdGF0aXN0aWNzQnVpbGRlci5hZGRSZXNwb25zZUNvZGUocmVzcG9uc2VDb2RlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBCdWlsZCBhIG5ldyBpbnN0YW5jZSBvZiBtb25pdG9yaW5nIHN0YXRpc3RpY3MuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gTmV3IGluc3RhbmNlIG9mIHtAY29kZSBNb25pdG9yaW5nU3RhdGlzdGljc0ltcGx9LgorICAgICAgICAgKi8KKyAgICAgICAgTW9uaXRvcmluZ1N0YXRpc3RpY3NJbXBsIGJ1aWxkKCkgeworICAgICAgICAgICAgZmluYWwgTWFwPFN0cmluZywgUmVzb3VyY2VTdGF0aXN0aWNzPiB1cmlTdGF0cyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcCgKKyAgICAgICAgICAgICAgICAgICAgVmlld3MubWFwVmlldyh1cmlTdGF0aXN0aWNzLCBCVUlMRElOR19GVU5DVElPTikpOworICAgICAgICAgICAgZmluYWwgTWFwPENsYXNzPD8+LCBSZXNvdXJjZVN0YXRpc3RpY3M+IGNsYXNzU3RhdHMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAoCisgICAgICAgICAgICAgICAgICAgIFZpZXdzLm1hcFZpZXcocmVzb3VyY2VDbGFzc1N0YXRpc3RpY3MsIEJVSUxESU5HX0ZVTkNUSU9OKSk7CisKKyAgICAgICAgICAgIGZpbmFsIEV4ZWN1dGlvblN0YXRpc3RpY3MgcmVxdWVzdFN0YXRzID0gZXhlY3V0aW9uU3RhdGlzdGljc0J1aWxkZXIgPT0gbnVsbAorICAgICAgICAgICAgICAgICAgICA/IEV4ZWN1dGlvblN0YXRpc3RpY3NJbXBsLkVNUFRZIDogZXhlY3V0aW9uU3RhdGlzdGljc0J1aWxkZXIuYnVpbGQoKTsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyBNb25pdG9yaW5nU3RhdGlzdGljc0ltcGwoCisgICAgICAgICAgICAgICAgICAgIHVyaVN0YXRzLCBjbGFzc1N0YXRzLCByZXF1ZXN0U3RhdHMsCisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlU3RhdGlzdGljc0J1aWxkZXIuYnVpbGQoKSwKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uTWFwcGVyU3RhdGlzdGljc0J1aWxkZXIuYnVpbGQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIEV4ZWN1dGlvblN0YXRpc3RpY3MgcmVxdWVzdFN0YXRpc3RpY3M7CisgICAgcHJpdmF0ZSBmaW5hbCBSZXNwb25zZVN0YXRpc3RpY3MgcmVzcG9uc2VTdGF0aXN0aWNzOworICAgIHByaXZhdGUgZmluYWwgRXhjZXB0aW9uTWFwcGVyU3RhdGlzdGljcyBleGNlcHRpb25NYXBwZXJTdGF0aXN0aWNzOworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgUmVzb3VyY2VTdGF0aXN0aWNzPiB1cmlTdGF0aXN0aWNzOworICAgIHByaXZhdGUgZmluYWwgTWFwPENsYXNzPD8+LCBSZXNvdXJjZVN0YXRpc3RpY3M+IHJlc291cmNlQ2xhc3NTdGF0aXN0aWNzOworCisgICAgcHJpdmF0ZSBNb25pdG9yaW5nU3RhdGlzdGljc0ltcGwoZmluYWwgTWFwPFN0cmluZywgUmVzb3VyY2VTdGF0aXN0aWNzPiB1cmlTdGF0aXN0aWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1hcDxDbGFzczw/PiwgUmVzb3VyY2VTdGF0aXN0aWNzPiByZXNvdXJjZUNsYXNzU3RhdGlzdGljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBFeGVjdXRpb25TdGF0aXN0aWNzIHJlcXVlc3RTdGF0aXN0aWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlU3RhdGlzdGljcyByZXNwb25zZVN0YXRpc3RpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRXhjZXB0aW9uTWFwcGVyU3RhdGlzdGljcyBleGNlcHRpb25NYXBwZXJTdGF0aXN0aWNzKSB7CisgICAgICAgIHRoaXMudXJpU3RhdGlzdGljcyA9IHVyaVN0YXRpc3RpY3M7CisgICAgICAgIHRoaXMucmVzb3VyY2VDbGFzc1N0YXRpc3RpY3MgPSByZXNvdXJjZUNsYXNzU3RhdGlzdGljczsKKyAgICAgICAgdGhpcy5yZXF1ZXN0U3RhdGlzdGljcyA9IHJlcXVlc3RTdGF0aXN0aWNzOworICAgICAgICB0aGlzLnJlc3BvbnNlU3RhdGlzdGljcyA9IHJlc3BvbnNlU3RhdGlzdGljczsKKyAgICAgICAgdGhpcy5leGNlcHRpb25NYXBwZXJTdGF0aXN0aWNzID0gZXhjZXB0aW9uTWFwcGVyU3RhdGlzdGljczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRXhlY3V0aW9uU3RhdGlzdGljcyBnZXRSZXF1ZXN0U3RhdGlzdGljcygpIHsKKyAgICAgICAgcmV0dXJuIHJlcXVlc3RTdGF0aXN0aWNzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNwb25zZVN0YXRpc3RpY3MgZ2V0UmVzcG9uc2VTdGF0aXN0aWNzKCkgeworICAgICAgICByZXR1cm4gcmVzcG9uc2VTdGF0aXN0aWNzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZnJlc2hlZCAocmUtYnVpbHQpIG9uIGV2ZXJ5IGFjY2Vzcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gcmVzb3VyY2Ugc3RhdGlzdGljcworICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBSZXNvdXJjZVN0YXRpc3RpY3M+IGdldFVyaVN0YXRpc3RpY3MoKSB7CisgICAgICAgIHJldHVybiB1cmlTdGF0aXN0aWNzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZnJlc2hlZCAocmUtYnVpbHQpIG9uIGV2ZXJ5IGFjY2Vzcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gcmVzb3VyY2Ugc3RhdGlzdGljcworICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNYXA8Q2xhc3M8Pz4sIFJlc291cmNlU3RhdGlzdGljcz4gZ2V0UmVzb3VyY2VDbGFzc1N0YXRpc3RpY3MoKSB7CisgICAgICAgIHJldHVybiByZXNvdXJjZUNsYXNzU3RhdGlzdGljczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRXhjZXB0aW9uTWFwcGVyU3RhdGlzdGljcyBnZXRFeGNlcHRpb25NYXBwZXJTdGF0aXN0aWNzKCkgeworICAgICAgICByZXR1cm4gZXhjZXB0aW9uTWFwcGVyU3RhdGlzdGljczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTW9uaXRvcmluZ1N0YXRpc3RpY3Mgc25hcHNob3QoKSB7CisgICAgICAgIC8vIHNuYXBzaG90IGlzIG5vdCBuZWVkZWQsIHRoaXMgb2JqZWN0IGlzIGxvb3NlbHkgaW1tdXRhYmxlIChzZWUgamF2YWRvYyBvZiBNYXBzIGdldHRlcnMpCisgICAgICAgIC8vIGFsbCB0aGUgb3RoZXIgU3RhdGlzdGljcyBvYmplY3RzIGFyZSBpbW11dGFibGUKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9Nb25pdG9yaW5nU3RhdGlzdGljc1Byb2Nlc3Nvci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9Nb25pdG9yaW5nU3RhdGlzdGljc1Byb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MDMxNzEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL01vbml0b3JpbmdTdGF0aXN0aWNzUHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSwyMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLm1vbml0b3Jpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5RdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRFeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlByb3BlcnRpZXNIZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkJhY2tncm91bmRTY2hlZHVsZXJMaXRlcmFsOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5FeHRlbmRlZFJlc291cmNlQ29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTWV0aG9kOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1vZGVsOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLk1vbml0b3JpbmdTdGF0aXN0aWNzTGlzdGVuZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuUmVxdWVzdEV2ZW50OworCisvKioKKyAqIFByb2Nlc3MgZXZlbnRzIG9mIGFwcGxpY2F0aW9uIGFuZCByZXF1ZXN0IHByb2Nlc3NpbmcgaW50bworICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLk1vbml0b3JpbmdTdGF0aXN0aWNzIG1vbml0b3Jpbmcgc3RhdGlzdGljc30uCisgKiBUaGUge0Bjb2RlIE1vbml0b3JpbmdTdGF0aXN0aWNzUHJvY2Vzc29yfSBzdGFydHMgYSBuZXcgdGhyZWFkIHdoaWNoIHByb2Nlc3MgZXZlbnRzIGluIHJlZ3VsYXIgaW50ZXJ2YWxzCisgKiBhbmQgZm9yIGVhY2ggbmV3IG1vbml0b3Jpbmcgc3RhdGlzdGljcyBpdCBjYWxscyByZWdpc3RlcmVkCisgKiB7QGxpbmsgTW9uaXRvcmluZ1N0YXRpc3RpY3NMaXN0ZW5lciBtb25pdG9yaW5nIHN0YXRpc3RpY3MgZXZlbnQgbGlzdGVuZXJzfS4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK2ZpbmFsIGNsYXNzIE1vbml0b3JpbmdTdGF0aXN0aWNzUHJvY2Vzc29yIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKE1vbml0b3JpbmdTdGF0aXN0aWNzUHJvY2Vzc29yLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9JTlRFUlZBTCA9IDUwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0hVVERPV05fVElNRU9VVCA9IDEwOworCisgICAgcHJpdmF0ZSBmaW5hbCBNb25pdG9yaW5nRXZlbnRMaXN0ZW5lciBtb25pdG9yaW5nRXZlbnRMaXN0ZW5lcjsKKyAgICBwcml2YXRlIGZpbmFsIE1vbml0b3JpbmdTdGF0aXN0aWNzSW1wbC5CdWlsZGVyIHN0YXRpc3RpY3NCdWlsZGVyOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxNb25pdG9yaW5nU3RhdGlzdGljc0xpc3RlbmVyPiBzdGF0aXN0aWNzQ2FsbGJhY2tMaXN0OworICAgIHByaXZhdGUgZmluYWwgU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlIHNjaGVkdWxlcjsKKworICAgIHByaXZhdGUgZmluYWwgaW50IGludGVydmFsOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBwcm9jZXNzb3IuCisgICAgICogQHBhcmFtIGluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uIG1hbmFnZXIuCisgICAgICogQHBhcmFtIG1vbml0b3JpbmdFdmVudExpc3RlbmVyIE1vbml0b3JpbmcgZXZlbnQgbGlzdGVuZXIuCisgICAgICovCisgICAgTW9uaXRvcmluZ1N0YXRpc3RpY3NQcm9jZXNzb3IoCisgICAgICAgICAgICBmaW5hbCBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIsIGZpbmFsIE1vbml0b3JpbmdFdmVudExpc3RlbmVyIG1vbml0b3JpbmdFdmVudExpc3RlbmVyKSB7CisgICAgICAgIHRoaXMubW9uaXRvcmluZ0V2ZW50TGlzdGVuZXIgPSBtb25pdG9yaW5nRXZlbnRMaXN0ZW5lcjsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VNb2RlbCByZXNvdXJjZU1vZGVsID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShFeHRlbmRlZFJlc291cmNlQ29udGV4dC5jbGFzcykuZ2V0UmVzb3VyY2VNb2RlbCgpOworICAgICAgICB0aGlzLnN0YXRpc3RpY3NCdWlsZGVyID0gbmV3IE1vbml0b3JpbmdTdGF0aXN0aWNzSW1wbC5CdWlsZGVyKHJlc291cmNlTW9kZWwpOworICAgICAgICB0aGlzLnN0YXRpc3RpY3NDYWxsYmFja0xpc3QgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEFsbEluc3RhbmNlcyhNb25pdG9yaW5nU3RhdGlzdGljc0xpc3RlbmVyLmNsYXNzKTsKKyAgICAgICAgdGhpcy5zY2hlZHVsZXIgPQorICAgICAgICAgICAgICAgIGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlLmNsYXNzLCBCYWNrZ3JvdW5kU2NoZWR1bGVyTGl0ZXJhbC5JTlNUQU5DRSk7CisgICAgICAgIHRoaXMuaW50ZXJ2YWwgPSBQcm9wZXJ0aWVzSGVscGVyLmdldFZhbHVlKGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoQ29uZmlndXJhdGlvbi5jbGFzcykuZ2V0UHJvcGVydGllcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2ZXJQcm9wZXJ0aWVzLk1PTklUT1JJTkdfU1RBVElTVElDU19SRUZSRVNIX0lOVEVSVkFMLCBERUZBVUxUX0lOVEVSVkFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy48U3RyaW5nLCBTdHJpbmc+ZW1wdHlNYXAoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgdGhlIHRocmVhZCB0aGF0IHdpbGwgcHJvY2VzcyB0aGUgZXZlbnRzCisgICAgICogaW50byB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuTW9uaXRvcmluZ1N0YXRpc3RpY3N9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0YXJ0TW9uaXRvcmluZ1dvcmtlcigpIHsKKyAgICAgICAgc2NoZWR1bGVyLnNjaGVkdWxlV2l0aEZpeGVkRGVsYXkobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1JlcXVlc3RJdGVtcygpOworICAgICAgICAgICAgICAgICAgICBwcm9jZXNzUmVzcG9uc2VDb2RlRXZlbnRzKCk7CisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NFeGNlcHRpb25NYXBwZXJFdmVudHMoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLlNFVkVSRSwgTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfTU9OSVRPUklOR19TVEFUSVNUSUNTX0dFTkVSQVRJT04oKSwgdCk7CisgICAgICAgICAgICAgICAgICAgIC8vIHJldGhyb3dpbmcgZXhjZXB0aW9uIHN0b3BzIGZ1cnRoZXIgdGFzayBleGVjdXRpb24KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfTU9OSVRPUklOR19TVEFUSVNUSUNTX0dFTkVSQVRJT04oKSwgdCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZmluYWwgTW9uaXRvcmluZ1N0YXRpc3RpY3NJbXBsIGltbXV0YWJsZVN0YXRzID0gc3RhdGlzdGljc0J1aWxkZXIuYnVpbGQoKTsKKworICAgICAgICAgICAgICAgIGZpbmFsIEl0ZXJhdG9yPE1vbml0b3JpbmdTdGF0aXN0aWNzTGlzdGVuZXI+IGl0ZXJhdG9yID0gc3RhdGlzdGljc0NhbGxiYWNrTGlzdC5pdGVyYXRvcigpOworICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkgJiYgIVRocmVhZC5jdXJyZW50VGhyZWFkKCkuaXNJbnRlcnJ1cHRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1vbml0b3JpbmdTdGF0aXN0aWNzTGlzdGVuZXIgbGlzdGVuZXIgPSBpdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5vblN0YXRpc3RpY3MoaW1tdXRhYmxlU3RhdHMpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5TRVZFUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX01PTklUT1JJTkdfU1RBVElTVElDU19MSVNURU5FUihsaXN0ZW5lci5nZXRDbGFzcygpKSwgdCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLnJlbW92ZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9LCAwLCBpbnRlcnZhbCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0V4Y2VwdGlvbk1hcHBlckV2ZW50cygpIHsKKyAgICAgICAgZmluYWwgUXVldWU8UmVxdWVzdEV2ZW50PiBldmVudFF1ZXVlID0gbW9uaXRvcmluZ0V2ZW50TGlzdGVuZXIuZ2V0RXhjZXB0aW9uTWFwcGVyRXZlbnRzKCk7CisgICAgICAgIGZpbmFsIEZsb29kaW5nTG9nZ2VyIGZsb29kaW5nTG9nZ2VyID0gbmV3IEZsb29kaW5nTG9nZ2VyKGV2ZW50UXVldWUpOworCisgICAgICAgIHdoaWxlICghZXZlbnRRdWV1ZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGZsb29kaW5nTG9nZ2VyLmNvbmRpdGlvbmFsbHlMb2dGbG9vZGluZygpOworCisgICAgICAgICAgICBmaW5hbCBSZXF1ZXN0RXZlbnQgZXZlbnQgPSBldmVudFF1ZXVlLnJlbW92ZSgpOworICAgICAgICAgICAgZmluYWwgRXhjZXB0aW9uTWFwcGVyU3RhdGlzdGljc0ltcGwuQnVpbGRlciBtYXBwZXJTdGF0cyA9IHN0YXRpc3RpY3NCdWlsZGVyLmdldEV4Y2VwdGlvbk1hcHBlclN0YXRpc3RpY3NCdWlsZGVyKCk7CisKKyAgICAgICAgICAgIGlmIChldmVudC5nZXRFeGNlcHRpb25NYXBwZXIoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbWFwcGVyU3RhdHMuYWRkRXhjZXB0aW9uTWFwcGVyRXhlY3V0aW9uKGV2ZW50LmdldEV4Y2VwdGlvbk1hcHBlcigpLmdldENsYXNzKCksIDEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtYXBwZXJTdGF0cy5hZGRNYXBwaW5nKGV2ZW50LmlzUmVzcG9uc2VTdWNjZXNzZnVsbHlNYXBwZWQoKSwgMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1JlcXVlc3RJdGVtcygpIHsKKyAgICAgICAgZmluYWwgUXVldWU8TW9uaXRvcmluZ0V2ZW50TGlzdGVuZXIuUmVxdWVzdFN0YXRzPiByZXF1ZXN0UXVldWVkSXRlbXMgPSBtb25pdG9yaW5nRXZlbnRMaXN0ZW5lci5nZXRSZXF1ZXN0UXVldWVkSXRlbXMoKTsKKyAgICAgICAgZmluYWwgRmxvb2RpbmdMb2dnZXIgZmxvb2RpbmdMb2dnZXIgPSBuZXcgRmxvb2RpbmdMb2dnZXIocmVxdWVzdFF1ZXVlZEl0ZW1zKTsKKworICAgICAgICB3aGlsZSAoIXJlcXVlc3RRdWV1ZWRJdGVtcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGZsb29kaW5nTG9nZ2VyLmNvbmRpdGlvbmFsbHlMb2dGbG9vZGluZygpOworCisgICAgICAgICAgICBmaW5hbCBNb25pdG9yaW5nRXZlbnRMaXN0ZW5lci5SZXF1ZXN0U3RhdHMgZXZlbnQgPSByZXF1ZXN0UXVldWVkSXRlbXMucmVtb3ZlKCk7CisKKyAgICAgICAgICAgIGZpbmFsIE1vbml0b3JpbmdFdmVudExpc3RlbmVyLlRpbWVTdGF0cyByZXF1ZXN0U3RhdHMgPSBldmVudC5nZXRSZXF1ZXN0U3RhdHMoKTsKKyAgICAgICAgICAgIHN0YXRpc3RpY3NCdWlsZGVyLmFkZFJlcXVlc3RFeGVjdXRpb24ocmVxdWVzdFN0YXRzLmdldFN0YXJ0VGltZSgpLCByZXF1ZXN0U3RhdHMuZ2V0RHVyYXRpb24oKSk7CisKKyAgICAgICAgICAgIGZpbmFsIE1vbml0b3JpbmdFdmVudExpc3RlbmVyLk1ldGhvZFN0YXRzIG1ldGhvZFN0YXQgPSBldmVudC5nZXRNZXRob2RTdGF0cygpOworICAgICAgICAgICAgaWYgKG1ldGhvZFN0YXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFJlc291cmNlTWV0aG9kIG1ldGhvZCA9IG1ldGhvZFN0YXQuZ2V0TWV0aG9kKCk7CisgICAgICAgICAgICAgICAgc3RhdGlzdGljc0J1aWxkZXIuYWRkRXhlY3V0aW9uKGV2ZW50LmdldFJlcXVlc3RVcmkoKSwgbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kU3RhdC5nZXRTdGFydFRpbWUoKSwgbWV0aG9kU3RhdC5nZXREdXJhdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFN0YXRzLmdldFN0YXJ0VGltZSgpLCByZXF1ZXN0U3RhdHMuZ2V0RHVyYXRpb24oKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc1Jlc3BvbnNlQ29kZUV2ZW50cygpIHsKKyAgICAgICAgZmluYWwgUXVldWU8SW50ZWdlcj4gcmVzcG9uc2VFdmVudHMgPSBtb25pdG9yaW5nRXZlbnRMaXN0ZW5lci5nZXRSZXNwb25zZVN0YXR1c2VzKCk7CisgICAgICAgIGZpbmFsIEZsb29kaW5nTG9nZ2VyIGZsb29kaW5nTG9nZ2VyID0gbmV3IEZsb29kaW5nTG9nZ2VyKHJlc3BvbnNlRXZlbnRzKTsKKworICAgICAgICB3aGlsZSAoIXJlc3BvbnNlRXZlbnRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgZmxvb2RpbmdMb2dnZXIuY29uZGl0aW9uYWxseUxvZ0Zsb29kaW5nKCk7CisKKyAgICAgICAgICAgIGZpbmFsIEludGVnZXIgY29kZSA9IHJlc3BvbnNlRXZlbnRzLnJlbW92ZSgpOworICAgICAgICAgICAgc3RhdGlzdGljc0J1aWxkZXIuYWRkUmVzcG9uc2VDb2RlKGNvZGUpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9wcyBwcm9jZXNzaW5nIG9mIGFueSBmdXJ0aGVyIGV4ZWN1dGlvbiBvZiB0aGlzIHByb2Nlc3Nvci4gVGhlIGludGVybmFsIHRocmVhZCB3aWxsIGZpbmlzaAorICAgICAqIHByb2Nlc3Npbmcgb2YgYWN0dWFsIGV2ZW50cyBhbmQgd2lsbCBiZSBub3QgZXhlY3V0ZWQgYWdhaW4uIFRoZSBtZXRob2QgZmluaXNoZXMgYWZ0ZXIgdGhlCisgICAgICogaW50ZXJuYWwgdGhyZWFkIGZpbmlzaCBpdHMgcHJvY2Vzc2luZyBsb29wLgorICAgICAqCisgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB0aHJvd24gd2hlbiB3YWl0aW5nIGZvciB0aGUgdGhyZWFkIHRvIGZpbmlzaCB0aGUgd29yayBpcyBpbnRlcnJ1cHRlZC4gSW4gdGhpcworICAgICAqIGNhc2UgaW50ZXJuYWwgbGlzdGVuZXJzIHdpbGwgYmUgc3RpbGwgc2h1dGRvd24uCisgICAgICovCisgICAgdm9pZCBzaHV0RG93bigpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIHNjaGVkdWxlci5zaHV0ZG93bigpOworCisgICAgICAgIGZpbmFsIGJvb2xlYW4gc3VjY2VzcyA9IHNjaGVkdWxlci5hd2FpdFRlcm1pbmF0aW9uKFNIVVRET1dOX1RJTUVPVVQsIFRpbWVVbml0LlNFQ09ORFMpOworICAgICAgICBpZiAoIXN1Y2Nlc3MpIHsKKyAgICAgICAgICAgIExPR0dFUi53YXJuaW5nKExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX01PTklUT1JJTkdfU0NIRURVTEVSX0RFU1RST1lfVElNRU9VVCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFVwb24gY2FsbGluZyBvZiB7QGxpbmsgI2NvbmRpdGlvbmFsbHlMb2dGbG9vZGluZygpfSwgZmxvb2RpbmcgbG9nZ2VyIGNvbmRpdGlvbmFsbHkgY2hlY2tzIGZvciB0aGUgc2l6ZSBvZiB0aGUgYXNzb2NpYXRlZAorICAgICAqIGNvbGxlY3Rpb24gYW5kIGlmIGl0cyBzaXplIGluY3JlYXNlcyBhIHdhcm5pbmcgYWJvdXQgZmxvb2RpbmcgaXMgbG9nZ2VkLgorICAgICAqIDxwLz4KKyAgICAgKiBUaGUgcHVycG9zZSBvZiB0aGlzIGZsb29kaW5nIGxvZ2dlciBmYWNpbGl0eSBpcyB0byB3YXJuIGFib3V0IGRpc2FiaWxpdHkgdG8gZGVjcmVhc2UgdGhlIHNpemUgb2YgZ2l2ZW4gY29sbGVjdGlvbiB3aGljaAorICAgICAqIGxlYWRzIHRvIG5ldmVyIGVuZGluZyBsb29waW5nIHdoaWxlIHRyeWluZyB0byBlbXB0eSB0aGF0IGNvbGxlY3Rpb24gaW4gYSBsb29wLgorICAgICAqCisgICAgICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYSBhdCBvcmFjbGUuY29tKQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEZsb29kaW5nTG9nZ2VyIHsKKworICAgICAgICAvKiogVGhlIGZyZXF1ZW5jeSBvZiBsb2dnaW5nIGEgd2FybmluZyBhYm91dCB0aGUgcmVxdWVzdCBxdWV1ZSBiZWluZyBmbG9vZGVkLiAqLworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRkxPT0RJTkdfV0FSTklOR19MT0dfSU5URVJWQUxfTUlMTElTID0gNV8wMDA7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb247CisgICAgICAgIHByaXZhdGUgZmluYWwgbG9uZyBzdGFydFRpbWUgPSBTeXN0ZW0ubmFub1RpbWUoKTsKKworICAgICAgICBwcml2YXRlIGludCBpID0gMDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgbGFzdFNpemU7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdHMgRmxvb2RpbmcgTG9nZ2VyIGFuZCBhc3NvY2lhdGUgaXQgd2l0aCBnaXZlbiBjb2xsZWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBhc3NvY2lhdGUgdGhpcyBmbG9vZGluZyBsb2dnZXIgd2l0aC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBGbG9vZGluZ0xvZ2dlcihmaW5hbCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsKKyAgICAgICAgICAgIHRoaXMuY29sbGVjdGlvbiA9IGNvbGxlY3Rpb247CisgICAgICAgICAgICB0aGlzLmxhc3RTaXplID0gY29sbGVjdGlvbi5zaXplKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogV2l0aCBhIGZyZXF1ZW5jeSBvZiB7QGxpbmsgI0ZMT09ESU5HX1dBUk5JTkdfTE9HX0lOVEVSVkFMX01JTExJU30sIGEgd2FybmluZyBhYm91dCBmbG9vZGluZyBpcyBsb2dnZWQgaWYgdGhlIHNpemUgb2YKKyAgICAgICAgICogdGhlIGFzc29jaWF0ZWQgY29sbGVjdGlvbiBpcyBpbmNyZWFzaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgY29uZGl0aW9uYWxseUxvZ0Zsb29kaW5nKCkgeworICAgICAgICAgICAgLy8gdGhpcyBjb25kaXRpb24gcHJldmVudHMgdGhlIGxvZyB3YXJuaW5nIGZyb20gYmVpbmcgbG9nZ2VkIG1vcmUgZnJlcXVlbnRseSB0aGFuCisgICAgICAgICAgICAvLyAnRkxPT0RJTkdfV0FSTklOR19MT0dfSU5URVJWQUxfTUlMTElTJyAtIGNvdW50ZWQgZnJvbSB0aGUgaW5pdGlhbGl6YXRpb24gb2YgdGhpcyBjbGFzcworICAgICAgICAgICAgaWYgKChTeXN0ZW0ubmFub1RpbWUoKSAtIHN0YXJ0VGltZSkgLyBUaW1lVW5pdC5OQU5PU0VDT05EUy5jb252ZXJ0KEZMT09ESU5HX1dBUk5JTkdfTE9HX0lOVEVSVkFMX01JTExJUywKKyAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQuTUlMTElTRUNPTkRTKSA8PSBpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY29sbGVjdGlvbi5zaXplKCkgPiBsYXN0U2l6ZSkgeworICAgICAgICAgICAgICAgIExPR0dFUi53YXJuaW5nKExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX01PTklUT1JJTkdfUVVFVUVfRkxPT0RFRChjb2xsZWN0aW9uLnNpemUoKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgbGFzdFNpemUgPSBjb2xsZWN0aW9uLnNpemUoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3JpbmcvTW9uaXRvcmluZ1V0aWxzLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL01vbml0b3JpbmdVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlYjdkNTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL01vbml0b3JpbmdVdGlscy5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLm1vbml0b3Jpbmc7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTWV0aG9kOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLkV4ZWN1dGlvblN0YXRpc3RpY3M7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuVGltZVdpbmRvd1N0YXRpc3RpY3M7CisKKy8qKgorICogTW9uaXRvcmluZyBoZWxwZXIgY2xhc3MgdGhhdCBjb250YWlucyB1dGlsaXR5IG1ldGhvZHMgdXNlZCBpbgorICogTW9uaXRvcmluZy4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBNb25pdG9yaW5nVXRpbHMgeworCisgICAgLyoqCisgICAgICogUmVxdWVzdCByYXRlIGxpbWl0IChwZXIgc2Vjb25kKSBiZWxvdyB3aGljaCBzdGF0aXN0aWNzIGNhbiBiZSBjb25zaWRlcmVkIGFzIGNhY2hlYWJsZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBkb3VibGUgQ0FDSEVBQkxFX1JFUVVFU1RfUkFURV9MSU1JVCA9IDAuMDAxOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBtZXRob2QgdW5pcXVlIHN0cmluZyBJRC4gVGhlIElEIGlzIGNvbnN0cnVjdGVkIGZyb20gbWV0aG9kIGF0dHJpYnV0ZXMgc2VwYXJhdGVkCisgICAgICogYnkgcGlwZSAnfCcuIFRoZSBhdHRyaWJ1dGVzIGFyZSB1c2VkIGluIHRoZSBmb2xsb3dpbmcgb3JkZXI6CisgICAgICogbWV0aG9kLXByb2R1Y2VzfG1ldGhvZC1jb25zdW1lc3xodHRwLW1ldGhvZHxtZXRob2QtcGF0aHxtZXRob2QtamF2YS1uYW1lCisgICAgICogPHA+CisgICAgICogICAgIElmIGFueSBvZiB0aGUgYXR0cmlidXRlcyBpcyBub3QgZGVmaW5lZCwgIm51bGwiIGlzIHVzZWQgZm9yIHN1Y2ggYW4gYXR0cmlidXRlLgorICAgICAqIDxwLz4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXRob2QgUmVzb3VyY2UgbWV0aG9kLgorICAgICAqIEByZXR1cm4gU3RyaW5nIGNvbnN0cnVjdGVkIGZyb20gcmVzb3VyY2UgbWV0aG9kIHBhcmFtZXRlcnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0TWV0aG9kVW5pcXVlSWQoZmluYWwgUmVzb3VyY2VNZXRob2QgbWV0aG9kKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBwYXRoID0gbWV0aG9kLmdldFBhcmVudCgpICE9IG51bGwgPyBjcmVhdGVQYXRoKG1ldGhvZC5nZXRQYXJlbnQoKSkgOiAibnVsbCI7CisKKyAgICAgICAgcmV0dXJuIG1ldGhvZC5nZXRQcm9kdWNlZFR5cGVzKCkudG9TdHJpbmcoKSArICJ8IgorICAgICAgICAgICAgICAgICsgbWV0aG9kLmdldENvbnN1bWVkVHlwZXMoKS50b1N0cmluZygpICsgInwiCisgICAgICAgICAgICAgICAgKyBtZXRob2QuZ2V0SHR0cE1ldGhvZCgpICsgInwiCisgICAgICAgICAgICAgICAgKyBwYXRoICsgInwiCisgICAgICAgICAgICAgICAgKyBtZXRob2QuZ2V0SW52b2NhYmxlKCkuZ2V0SGFuZGxpbmdNZXRob2QoKS5nZXROYW1lKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNyZWF0ZVBhdGgoUmVzb3VyY2UgcmVzb3VyY2UpIHsKKyAgICAgICAgcmV0dXJuIGFwcGVuZFBhdGgocmVzb3VyY2UsIG5ldyBTdHJpbmdCdWlsZGVyKCkpLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nQnVpbGRlciBhcHBlbmRQYXRoKFJlc291cmNlIHJlc291cmNlLCBTdHJpbmdCdWlsZGVyIHBhdGgpIHsKKyAgICAgICAgcmV0dXJuIHJlc291cmNlLmdldFBhcmVudCgpID09IG51bGwgPyBwYXRoLmFwcGVuZChyZXNvdXJjZS5nZXRQYXRoKCkpCisgICAgICAgICAgICAgICAgOiBhcHBlbmRQYXRoKHJlc291cmNlLmdldFBhcmVudCgpLCBwYXRoKS5hcHBlbmQoIi4iKS5hcHBlbmQocmVzb3VyY2UuZ2V0UGF0aCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZ2xvYmFsLCByZXNvdXJjZSwgcmVzb3VyY2UgbWV0aG9kIHN0YXRpc3RpY3MgY29udGFpbmluZyB0aGUgZ2l2ZSBleGVjdXRpb24gc3RhdGlzdGljcyBjYW4KKyAgICAgKiBiZSBjYWNoZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RhdHMgZXhlY3V0aW9uIHN0YXRpc3RpY3MgdG8gYmUgZXhhbWluZWQuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHN0YXRpc3RpY3MgY2FuIGJlIGNhY2hlZCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgc3RhdGljIGJvb2xlYW4gaXNDYWNoZWFibGUoZmluYWwgRXhlY3V0aW9uU3RhdGlzdGljcyBzdGF0cykgeworICAgICAgICBmb3IgKGZpbmFsIFRpbWVXaW5kb3dTdGF0aXN0aWNzIHdpbmRvdyA6IHN0YXRzLmdldFRpbWVXaW5kb3dTdGF0aXN0aWNzKCkudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIGlmICh3aW5kb3cuZ2V0UmVxdWVzdHNQZXJTZWNvbmQoKSA+PSBDQUNIRUFCTEVfUkVRVUVTVF9SQVRFX0xJTUlUKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByZXZlbnQgaW5zdGFudGlhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1vbml0b3JpbmdVdGlscygpIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL1JlcXVlc3RFdmVudEJ1aWxkZXIuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3JpbmcvUmVxdWVzdEV2ZW50QnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyY2JjNzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL1JlcXVlc3RFdmVudEJ1aWxkZXIuamF2YQpAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwubW9uaXRvcmluZzsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuRXhjZXB0aW9uTWFwcGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5FeHRlbmRlZFVyaUluZm87CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuUmVxdWVzdEV2ZW50OworCisvKioKKyAqIEEgY29udHJhY3QgZm9yIHtAbGluayBSZXF1ZXN0RXZlbnQgcmVxdWVzdCBtb25pdG9yaW5nIGV2ZW50fSBidWlsZGVyLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGludGVyZmFjZSBSZXF1ZXN0RXZlbnRCdWlsZGVyIHsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZXhjZXB0aW9uIG1hcHBlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBleGNlcHRpb25NYXBwZXIgRXhjZXB0aW9uIG1hcHBlci4KKyAgICAgKiBAcmV0dXJuIEJ1aWxkZXIgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIFJlcXVlc3RFdmVudEJ1aWxkZXIgc2V0RXhjZXB0aW9uTWFwcGVyKEV4Y2VwdGlvbk1hcHBlcjw/PiBleGNlcHRpb25NYXBwZXIpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjb250YWluZXIgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250YWluZXJSZXF1ZXN0IENvbnRhaW5lciByZXF1ZXN0LgorICAgICAqIEByZXR1cm4gQnVpbGRlciBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVxdWVzdEV2ZW50QnVpbGRlciBzZXRDb250YWluZXJSZXF1ZXN0KENvbnRhaW5lclJlcXVlc3QgY29udGFpbmVyUmVxdWVzdCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbnRhaW5lciByZXNwb25zZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250YWluZXJSZXNwb25zZSBDb250YWluZXIgcmVzcG9uc2UuCisgICAgICogQHJldHVybiBCdWlsZGVyIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBSZXF1ZXN0RXZlbnRCdWlsZGVyIHNldENvbnRhaW5lclJlc3BvbnNlKENvbnRhaW5lclJlc3BvbnNlIGNvbnRhaW5lclJlc3BvbnNlKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHJlc3BvbnNlIHByb2Nlc3Npbmcgd2FzIHN1Y2Nlc3NmdWwuIFNldCB7QGNvZGUgdHJ1ZX0KKyAgICAgKiBpZiB0aGUgcmVxdWVzdCBhbmQgcmVzcG9uc2UgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZC4gUmVzcG9uc2UgaXMgc3VjY2Vzc2Z1bGx5CisgICAgICogcHJvY2Vzc2VkIHdoZW4gdGhlIHJlc3BvbnNlIGNvZGUgaXMgc21hbGxlciB0aGFuIDQwMCBhbmQgcmVzcG9uc2Ugd2FzIHN1Y2Nlc3NmdWxseSB3cml0dGVuLgorICAgICAqCisgICAgICogQHBhcmFtIHN1Y2Nlc3MgVHJ1ZSBpZiByZXNwb25zZSBwcm9jZXNzaW5nIHdhcyBzdWNjZXNzZnVsLgorICAgICAqIEByZXR1cm4gQnVpbGRlciBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBzZWUgUmVxdWVzdEV2ZW50I2lzU3VjY2VzcygpCisgICAgICovCisgICAgcHVibGljIFJlcXVlc3RFdmVudEJ1aWxkZXIgc2V0U3VjY2Vzcyhib29sZWFuIHN1Y2Nlc3MpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBmbGFnIGluZGljYXRpbmcgd2hldGhlciByZXNwb25zZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgd3JpdHRlbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNwb25zZVdyaXR0ZW4ge0Bjb2RlIHRydWV9IGlzIHJlc3BvbnNlIGhhcyBiZWVuIHdyaXR0ZW4gd2l0aG91dCBmYWlsdXJlLgorICAgICAqIEByZXR1cm4gQnVpbGRlciBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVxdWVzdEV2ZW50QnVpbGRlciBzZXRSZXNwb25zZVdyaXR0ZW4oYm9vbGVhbiByZXNwb25zZVdyaXR0ZW4pOworCisgICAgLyoqCisgICAgICogU2V0IGV4Y2VwdGlvbiB0aHJvd24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGhyb3dhYmxlICAgICAgRXhjZXB0aW9uLgorICAgICAqIEBwYXJhbSBleGNlcHRpb25DYXVzZSBDYXVzZSBvZiB0aGUge0Bjb2RlIHRocm93YWJsZX0KKyAgICAgKiBAcmV0dXJuIEJ1aWxkZXIgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIFJlcXVlc3RFdmVudEJ1aWxkZXIgc2V0RXhjZXB0aW9uKFRocm93YWJsZSB0aHJvd2FibGUsIFJlcXVlc3RFdmVudC5FeGNlcHRpb25DYXVzZSBleGNlcHRpb25DYXVzZSk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdXJpIGluZm8uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXh0ZW5kZWRVcmlJbmZvIEV4dGVuZGVkIHVyaSBpbmZvLgorICAgICAqIEByZXR1cm4gQnVpbGRlciBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVxdWVzdEV2ZW50QnVpbGRlciBzZXRFeHRlbmRlZFVyaUluZm8oRXh0ZW5kZWRVcmlJbmZvIGV4dGVuZGVkVXJpSW5mbyk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgcmVzcG9uc2UgZmlsdGVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250YWluZXJSZXNwb25zZUZpbHRlcnMgQ29udGFpbmVyIHJlc3BvbnNlIGZpbHRlcnMuCisgICAgICogQHJldHVybiBCdWlsZGVyIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBSZXF1ZXN0RXZlbnRCdWlsZGVyIHNldENvbnRhaW5lclJlc3BvbnNlRmlsdGVycyhJdGVyYWJsZTxDb250YWluZXJSZXNwb25zZUZpbHRlcj4gY29udGFpbmVyUmVzcG9uc2VGaWx0ZXJzKTsKKworICAgIC8qKgorICAgICAqIFNldCByZXF1ZXN0IGZpbHRlcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyUmVxdWVzdEZpbHRlcnMgQ29udGFpbmVyIHJlcXVlc3QgZmlsdGVycy4KKyAgICAgKiBAcmV0dXJuIFJlcXVlc3QgZmlsdGVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVxdWVzdEV2ZW50QnVpbGRlciBzZXRDb250YWluZXJSZXF1ZXN0RmlsdGVycyhJdGVyYWJsZTxDb250YWluZXJSZXF1ZXN0RmlsdGVyPiBjb250YWluZXJSZXF1ZXN0RmlsdGVycyk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSByZXNwb25zZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgbWFwcGVkIGJ5IGFuIGV4Y2VwdGlvbiBtYXBwZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2VTdWNjZXNzZnVsbHlNYXBwZWQge0Bjb2RlIHRydWV9IGlmIHRoZSByZXNwb25zZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgbWFwcGVkLgorICAgICAqIEByZXR1cm4gQnVpbGRlciBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVxdWVzdEV2ZW50QnVpbGRlciBzZXRSZXNwb25zZVN1Y2Nlc3NmdWxseU1hcHBlZChib29sZWFuIHJlc3BvbnNlU3VjY2Vzc2Z1bGx5TWFwcGVkKTsKKworICAgIC8qKgorICAgICAqIEJ1aWxkIHRoZSBpbnN0YW5jZSBvZiB7QGxpbmsgUmVxdWVzdEV2ZW50IHJlcXVlc3QgZXZlbnR9LgorICAgICAqCisgICAgICogQHBhcmFtIGV2ZW50VHlwZSBUeXBlIG9mIHRoZSBldmVudCB0byBiZSBidWlsdC4KKyAgICAgKiBAcmV0dXJuIFJlcXVlc3QgZXZlbnQgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIFJlcXVlc3RFdmVudCBidWlsZChSZXF1ZXN0RXZlbnQuVHlwZSBldmVudFR5cGUpOworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9SZXF1ZXN0RXZlbnRJbXBsLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL1JlcXVlc3RFdmVudEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODM0NmRkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9SZXF1ZXN0RXZlbnRJbXBsLmphdmEKQEAgLTAsMCArMSwyMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLm1vbml0b3Jpbmc7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LkV4Y2VwdGlvbk1hcHBlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuRXh0ZW5kZWRVcmlJbmZvOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLlJlcXVlc3RFdmVudDsKKworLyoqCisgKiB7QGxpbmsgUmVxdWVzdEV2ZW50IFJlcXVlc3QgZXZlbnR9IGltcGxlbWVudGF0aW9uLiBJbnN0YW5jZXMgYXJlIGltbXV0YWJsZS4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBSZXF1ZXN0RXZlbnRJbXBsIGltcGxlbWVudHMgUmVxdWVzdEV2ZW50IHsKKworCisgICAgLyoqCisgICAgICogQnVpbGRlciBvZiB7QGxpbmsgUmVxdWVzdEV2ZW50SW1wbH0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyIGltcGxlbWVudHMgUmVxdWVzdEV2ZW50QnVpbGRlciB7CisgICAgICAgIHByaXZhdGUgQ29udGFpbmVyUmVxdWVzdCBjb250YWluZXJSZXF1ZXN0OworICAgICAgICBwcml2YXRlIENvbnRhaW5lclJlc3BvbnNlIGNvbnRhaW5lclJlc3BvbnNlOworICAgICAgICBwcml2YXRlIFRocm93YWJsZSB0aHJvd2FibGU7CisgICAgICAgIHByaXZhdGUgRXh0ZW5kZWRVcmlJbmZvIGV4dGVuZGVkVXJpSW5mbzsKKyAgICAgICAgcHJpdmF0ZSBJdGVyYWJsZTxDb250YWluZXJSZXNwb25zZUZpbHRlcj4gY29udGFpbmVyUmVzcG9uc2VGaWx0ZXJzOworICAgICAgICBwcml2YXRlIEl0ZXJhYmxlPENvbnRhaW5lclJlcXVlc3RGaWx0ZXI+IGNvbnRhaW5lclJlcXVlc3RGaWx0ZXJzOworICAgICAgICBwcml2YXRlIEV4Y2VwdGlvbk1hcHBlcjw/PiBleGNlcHRpb25NYXBwZXI7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBzdWNjZXNzOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gcmVzcG9uc2VXcml0dGVuOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gcmVzcG9uc2VTdWNjZXNzZnVsbHlNYXBwZWQ7CisgICAgICAgIHByaXZhdGUgRXhjZXB0aW9uQ2F1c2UgZXhjZXB0aW9uQ2F1c2U7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEV4Y2VwdGlvbk1hcHBlcihFeGNlcHRpb25NYXBwZXI8Pz4gZXhjZXB0aW9uTWFwcGVyKSB7CisgICAgICAgICAgICB0aGlzLmV4Y2VwdGlvbk1hcHBlciA9IGV4Y2VwdGlvbk1hcHBlcjsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldENvbnRhaW5lclJlcXVlc3QoQ29udGFpbmVyUmVxdWVzdCBjb250YWluZXJSZXF1ZXN0KSB7CisgICAgICAgICAgICB0aGlzLmNvbnRhaW5lclJlcXVlc3QgPSBjb250YWluZXJSZXF1ZXN0OworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Q29udGFpbmVyUmVzcG9uc2UoQ29udGFpbmVyUmVzcG9uc2UgY29udGFpbmVyUmVzcG9uc2UpIHsKKyAgICAgICAgICAgIHRoaXMuY29udGFpbmVyUmVzcG9uc2UgPSBjb250YWluZXJSZXNwb25zZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFJlc3BvbnNlV3JpdHRlbihib29sZWFuIHJlc3BvbnNlV3JpdHRlbikgeworICAgICAgICAgICAgdGhpcy5yZXNwb25zZVdyaXR0ZW4gPSByZXNwb25zZVdyaXR0ZW47CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRTdWNjZXNzKGJvb2xlYW4gc3VjY2VzcykgeworICAgICAgICAgICAgdGhpcy5zdWNjZXNzID0gc3VjY2VzczsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEV4Y2VwdGlvbihUaHJvd2FibGUgdGhyb3dhYmxlLCBFeGNlcHRpb25DYXVzZSBleGNlcHRpb25DYXVzZSkgeworICAgICAgICAgICAgdGhpcy50aHJvd2FibGUgPSB0aHJvd2FibGU7CisgICAgICAgICAgICB0aGlzLmV4Y2VwdGlvbkNhdXNlID0gZXhjZXB0aW9uQ2F1c2U7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEV4dGVuZGVkVXJpSW5mbyhFeHRlbmRlZFVyaUluZm8gZXh0ZW5kZWRVcmlJbmZvKSB7CisgICAgICAgICAgICB0aGlzLmV4dGVuZGVkVXJpSW5mbyA9IGV4dGVuZGVkVXJpSW5mbzsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldENvbnRhaW5lclJlc3BvbnNlRmlsdGVycyhJdGVyYWJsZTxDb250YWluZXJSZXNwb25zZUZpbHRlcj4gY29udGFpbmVyUmVzcG9uc2VGaWx0ZXJzKSB7CisgICAgICAgICAgICB0aGlzLmNvbnRhaW5lclJlc3BvbnNlRmlsdGVycyA9IGNvbnRhaW5lclJlc3BvbnNlRmlsdGVyczsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldENvbnRhaW5lclJlcXVlc3RGaWx0ZXJzKEl0ZXJhYmxlPENvbnRhaW5lclJlcXVlc3RGaWx0ZXI+IGNvbnRhaW5lclJlcXVlc3RGaWx0ZXJzKSB7CisgICAgICAgICAgICB0aGlzLmNvbnRhaW5lclJlcXVlc3RGaWx0ZXJzID0gY29udGFpbmVyUmVxdWVzdEZpbHRlcnM7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRSZXNwb25zZVN1Y2Nlc3NmdWxseU1hcHBlZChib29sZWFuIHJlc3BvbnNlU3VjY2Vzc2Z1bGx5TWFwcGVkKSB7CisgICAgICAgICAgICB0aGlzLnJlc3BvbnNlU3VjY2Vzc2Z1bGx5TWFwcGVkID0gcmVzcG9uc2VTdWNjZXNzZnVsbHlNYXBwZWQ7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVxdWVzdEV2ZW50SW1wbCBidWlsZChUeXBlIHR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVxdWVzdEV2ZW50SW1wbCh0eXBlLCBjb250YWluZXJSZXF1ZXN0LCBjb250YWluZXJSZXNwb25zZSwgdGhyb3dhYmxlLAorICAgICAgICAgICAgICAgICAgICBleHRlbmRlZFVyaUluZm8sIGNvbnRhaW5lclJlc3BvbnNlRmlsdGVycywgY29udGFpbmVyUmVxdWVzdEZpbHRlcnMsIGV4Y2VwdGlvbk1hcHBlciwgc3VjY2VzcywKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VTdWNjZXNzZnVsbHlNYXBwZWQsIGV4Y2VwdGlvbkNhdXNlLCByZXNwb25zZVdyaXR0ZW4pOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwcml2YXRlIFJlcXVlc3RFdmVudEltcGwoVHlwZSB0eXBlLCBDb250YWluZXJSZXF1ZXN0IGNvbnRhaW5lclJlcXVlc3QsIENvbnRhaW5lclJlc3BvbnNlIGNvbnRhaW5lclJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJvd2FibGUgdGhyb3dhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbmRlZFVyaUluZm8gZXh0ZW5kZWRVcmlJbmZvLCBJdGVyYWJsZTxDb250YWluZXJSZXNwb25zZUZpbHRlcj4gY29udGFpbmVyUmVzcG9uc2VGaWx0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGVyYWJsZTxDb250YWluZXJSZXF1ZXN0RmlsdGVyPiBjb250YWluZXJSZXF1ZXN0RmlsdGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uTWFwcGVyPD8+IGV4Y2VwdGlvbk1hcHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBzdWNjZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIHJlc3BvbnNlU3VjY2Vzc2Z1bGx5TWFwcGVkLCBFeGNlcHRpb25DYXVzZSBleGNlcHRpb25DYXVzZSwgYm9vbGVhbiByZXNwb25zZVdyaXR0ZW4pIHsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgdGhpcy5jb250YWluZXJSZXF1ZXN0ID0gY29udGFpbmVyUmVxdWVzdDsKKyAgICAgICAgdGhpcy5jb250YWluZXJSZXNwb25zZSA9IGNvbnRhaW5lclJlc3BvbnNlOworICAgICAgICB0aGlzLnRocm93YWJsZSA9IHRocm93YWJsZTsKKyAgICAgICAgdGhpcy5leHRlbmRlZFVyaUluZm8gPSBleHRlbmRlZFVyaUluZm87CisgICAgICAgIHRoaXMuY29udGFpbmVyUmVzcG9uc2VGaWx0ZXJzID0gY29udGFpbmVyUmVzcG9uc2VGaWx0ZXJzOworICAgICAgICB0aGlzLmNvbnRhaW5lclJlcXVlc3RGaWx0ZXJzID0gY29udGFpbmVyUmVxdWVzdEZpbHRlcnM7CisgICAgICAgIHRoaXMuZXhjZXB0aW9uTWFwcGVyID0gZXhjZXB0aW9uTWFwcGVyOworICAgICAgICB0aGlzLnN1Y2Nlc3MgPSBzdWNjZXNzOworICAgICAgICB0aGlzLnJlc3BvbnNlU3VjY2Vzc2Z1bGx5TWFwcGVkID0gcmVzcG9uc2VTdWNjZXNzZnVsbHlNYXBwZWQ7CisgICAgICAgIHRoaXMuZXhjZXB0aW9uQ2F1c2UgPSBleGNlcHRpb25DYXVzZTsKKyAgICAgICAgdGhpcy5yZXNwb25zZVdyaXR0ZW4gPSByZXNwb25zZVdyaXR0ZW47CisgICAgfQorCisKKyAgICBwcml2YXRlIGZpbmFsIFR5cGUgdHlwZTsKKyAgICBwcml2YXRlIGZpbmFsIENvbnRhaW5lclJlcXVlc3QgY29udGFpbmVyUmVxdWVzdDsKKyAgICBwcml2YXRlIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIGNvbnRhaW5lclJlc3BvbnNlOworICAgIHByaXZhdGUgZmluYWwgVGhyb3dhYmxlIHRocm93YWJsZTsKKyAgICBwcml2YXRlIGZpbmFsIEV4dGVuZGVkVXJpSW5mbyBleHRlbmRlZFVyaUluZm87CisgICAgcHJpdmF0ZSBmaW5hbCBJdGVyYWJsZTxDb250YWluZXJSZXNwb25zZUZpbHRlcj4gY29udGFpbmVyUmVzcG9uc2VGaWx0ZXJzOworICAgIHByaXZhdGUgZmluYWwgSXRlcmFibGU8Q29udGFpbmVyUmVxdWVzdEZpbHRlcj4gY29udGFpbmVyUmVxdWVzdEZpbHRlcnM7CisgICAgcHJpdmF0ZSBmaW5hbCBFeGNlcHRpb25NYXBwZXI8Pz4gZXhjZXB0aW9uTWFwcGVyOworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBzdWNjZXNzOworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiByZXNwb25zZVN1Y2Nlc3NmdWxseU1hcHBlZDsKKyAgICBwcml2YXRlIGZpbmFsIEV4Y2VwdGlvbkNhdXNlIGV4Y2VwdGlvbkNhdXNlOworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiByZXNwb25zZVdyaXR0ZW47CisKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb250YWluZXJSZXF1ZXN0IGdldENvbnRhaW5lclJlcXVlc3QoKSB7CisgICAgICAgIHJldHVybiBjb250YWluZXJSZXF1ZXN0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb250YWluZXJSZXNwb25zZSBnZXRDb250YWluZXJSZXNwb25zZSgpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5lclJlc3BvbnNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUaHJvd2FibGUgZ2V0RXhjZXB0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhyb3dhYmxlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUeXBlIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBFeHRlbmRlZFVyaUluZm8gZ2V0VXJpSW5mbygpIHsKKyAgICAgICAgcmV0dXJuIGV4dGVuZGVkVXJpSW5mbzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRXhjZXB0aW9uTWFwcGVyPD8+IGdldEV4Y2VwdGlvbk1hcHBlcigpIHsKKyAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbk1hcHBlcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSXRlcmFibGU8Q29udGFpbmVyUmVxdWVzdEZpbHRlcj4gZ2V0Q29udGFpbmVyUmVxdWVzdEZpbHRlcnMoKSB7CisgICAgICAgIHJldHVybiBjb250YWluZXJSZXF1ZXN0RmlsdGVyczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSXRlcmFibGU8Q29udGFpbmVyUmVzcG9uc2VGaWx0ZXI+IGdldENvbnRhaW5lclJlc3BvbnNlRmlsdGVycygpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5lclJlc3BvbnNlRmlsdGVyczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N1Y2Nlc3MoKSB7CisgICAgICAgIHJldHVybiBzdWNjZXNzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzUmVzcG9uc2VTdWNjZXNzZnVsbHlNYXBwZWQoKSB7CisgICAgICAgIHJldHVybiByZXNwb25zZVN1Y2Nlc3NmdWxseU1hcHBlZDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRXhjZXB0aW9uQ2F1c2UgZ2V0RXhjZXB0aW9uQ2F1c2UoKSB7CisgICAgICAgIHJldHVybiBleGNlcHRpb25DYXVzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Jlc3BvbnNlV3JpdHRlbigpIHsKKyAgICAgICAgcmV0dXJuIHJlc3BvbnNlV3JpdHRlbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL1Jlc291cmNlTWV0aG9kU3RhdGlzdGljc0ltcGwuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3JpbmcvUmVzb3VyY2VNZXRob2RTdGF0aXN0aWNzSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZjgyMjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL1Jlc291cmNlTWV0aG9kU3RhdGlzdGljc0ltcGwuamF2YQpAQCAtMCwwICsxLDE2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwubW9uaXRvcmluZzsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRNYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1ldGhvZDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5FeGVjdXRpb25TdGF0aXN0aWNzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLlJlc291cmNlTWV0aG9kU3RhdGlzdGljczsKKworLyoqCisgKiBJbW11dGFibGUgcmVzb3VyY2UgbWV0aG9kIHN0YXRpc3RpY3MuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYSBhdCBvcmFjbGUuY29tKQorICovCitmaW5hbCBjbGFzcyBSZXNvdXJjZU1ldGhvZFN0YXRpc3RpY3NJbXBsIGltcGxlbWVudHMgUmVzb3VyY2VNZXRob2RTdGF0aXN0aWNzIHsKKworICAgIC8qKgorICAgICAqIEZhY3RvcnkgZm9yIGNyZWF0aW5nIGFuZCBzdG9yaW5nIHJlc291cmNlIG1ldGhvZCBzdGF0aXN0aWNzLiBPbmUgaW5zdGFuY2UgcGVyIHJlc291cmNlIG1ldGhvZC4KKyAgICAgKiA8cC8+CisgICAgICogTXVzdCBiZSB0aHJlYWQtc2FmZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgRmFjdG9yeSB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb25jdXJyZW50TWFwPFN0cmluZywgQnVpbGRlcj4gc3RyaW5nVG9NZXRob2RzQnVpbGRlcnMgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpOworCisgICAgICAgIFJlc291cmNlTWV0aG9kU3RhdGlzdGljc0ltcGwuQnVpbGRlciBnZXRPckNyZWF0ZShmaW5hbCBSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1ldGhvZFVuaXF1ZUlkID0gTW9uaXRvcmluZ1V0aWxzLmdldE1ldGhvZFVuaXF1ZUlkKHJlc291cmNlTWV0aG9kKTsKKworICAgICAgICAgICAgaWYgKCFzdHJpbmdUb01ldGhvZHNCdWlsZGVycy5jb250YWluc0tleShtZXRob2RVbmlxdWVJZCkpIHsKKyAgICAgICAgICAgICAgICBzdHJpbmdUb01ldGhvZHNCdWlsZGVycy5wdXRJZkFic2VudChtZXRob2RVbmlxdWVJZCwgbmV3IFJlc291cmNlTWV0aG9kU3RhdGlzdGljc0ltcGwuQnVpbGRlcihyZXNvdXJjZU1ldGhvZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHN0cmluZ1RvTWV0aG9kc0J1aWxkZXJzLmdldChtZXRob2RVbmlxdWVJZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCdWlsZGVyIG9mIHJlc291cmNlIG1ldGhvZCBzdGF0aXN0aWNzLgorICAgICAqIDxwLz4KKyAgICAgKiBNdXN0IGJlIHRocmVhZC1zYWZlLgorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBCdWlsZGVyIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kOworCisgICAgICAgIHByaXZhdGUgZmluYWwgQXRvbWljUmVmZXJlbmNlPEV4ZWN1dGlvblN0YXRpc3RpY3NJbXBsLkJ1aWxkZXI+IHJlc291cmNlTWV0aG9kRXhlY3V0aW9uU3RhdGlzdGljc0J1aWxkZXIgPSBuZXcKKyAgICAgICAgICAgICAgICBBdG9taWNSZWZlcmVuY2U8PigpOworICAgICAgICBwcml2YXRlIGZpbmFsIEF0b21pY1JlZmVyZW5jZTxFeGVjdXRpb25TdGF0aXN0aWNzSW1wbC5CdWlsZGVyPiByZXF1ZXN0RXhlY3V0aW9uU3RhdGlzdGljc0J1aWxkZXIgPSBuZXcKKyAgICAgICAgICAgICAgICBBdG9taWNSZWZlcmVuY2U8PigpOworCisgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgUmVzb3VyY2VNZXRob2RTdGF0aXN0aWNzSW1wbCBjYWNoZWQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhIG5ldyBidWlsZGVyIGluc3RhbmNlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcmVzb3VyY2VNZXRob2QgUmVzb3VyY2UgbWV0aG9kIGZvciB3aGljaCBzdGF0aXN0aWNzIGFyZSBldmFsdWF0ZWQuCisgICAgICAgICAqLworICAgICAgICBCdWlsZGVyKGZpbmFsIFJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kKSB7CisgICAgICAgICAgICB0aGlzLnJlc291cmNlTWV0aG9kID0gcmVzb3VyY2VNZXRob2Q7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQnVpbGQgYW4gaW5zdGFuY2Ugb2YgcmVzb3VyY2UgbWV0aG9kIHN0YXRpc3RpY3MuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gTmV3IGluc3RhbmNlIG9mIHJlc291cmNlIG1ldGhvZCBzdGF0aXN0aWNzLgorICAgICAgICAgKi8KKyAgICAgICAgUmVzb3VyY2VNZXRob2RTdGF0aXN0aWNzSW1wbCBidWlsZCgpIHsKKyAgICAgICAgICAgIFJlc291cmNlTWV0aG9kU3RhdGlzdGljc0ltcGwgY2FjaGVkTG9jYWxSZWZlcmVuY2UgPSBjYWNoZWQ7CisgICAgICAgICAgICBpZiAoY2FjaGVkTG9jYWxSZWZlcmVuY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZWRMb2NhbFJlZmVyZW5jZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgRXhlY3V0aW9uU3RhdGlzdGljcyBtZXRob2RTdGF0cyA9IHJlc291cmNlTWV0aG9kRXhlY3V0aW9uU3RhdGlzdGljc0J1aWxkZXIuZ2V0KCkgPT0gbnVsbAorICAgICAgICAgICAgICAgICAgICA/IEV4ZWN1dGlvblN0YXRpc3RpY3NJbXBsLkVNUFRZIDogcmVzb3VyY2VNZXRob2RFeGVjdXRpb25TdGF0aXN0aWNzQnVpbGRlci5nZXQoKS5idWlsZCgpOworICAgICAgICAgICAgZmluYWwgRXhlY3V0aW9uU3RhdGlzdGljcyByZXF1ZXN0U3RhdHMgPSByZXF1ZXN0RXhlY3V0aW9uU3RhdGlzdGljc0J1aWxkZXIuZ2V0KCkgPT0gbnVsbAorICAgICAgICAgICAgICAgICAgICA/IEV4ZWN1dGlvblN0YXRpc3RpY3NJbXBsLkVNUFRZIDogcmVxdWVzdEV4ZWN1dGlvblN0YXRpc3RpY3NCdWlsZGVyLmdldCgpLmJ1aWxkKCk7CisKKyAgICAgICAgICAgIGZpbmFsIFJlc291cmNlTWV0aG9kU3RhdGlzdGljc0ltcGwgc3RhdHMgPSBuZXcgUmVzb3VyY2VNZXRob2RTdGF0aXN0aWNzSW1wbChyZXNvdXJjZU1ldGhvZCwgbWV0aG9kU3RhdHMsCisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RTdGF0cyk7CisKKyAgICAgICAgICAgIGlmIChNb25pdG9yaW5nVXRpbHMuaXNDYWNoZWFibGUobWV0aG9kU3RhdHMpKSB7CisgICAgICAgICAgICAgICAgLy8gb3ZlcndyaXRlIHRoZSBjYWNoZSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgaXQncyBudWxsIG9yIG5vdAorICAgICAgICAgICAgICAgIGNhY2hlZCA9IHN0YXRzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gc3RhdHM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIGV4ZWN1dGlvbiBvZiB0aGUgcmVzb3VyY2UgbWV0aG9kIHRvIHRoZSBzdGF0aXN0aWNzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbWV0aG9kU3RhcnRUaW1lICBUaW1lIHNwZW50IG9uIGV4ZWN1dGlvbiBvZiByZXNvdXJjZSBtZXRob2QgaXRzZWxmIChVbml4IHRpbWVzdGFtcCBmb3JtYXQpLgorICAgICAgICAgKiBAcGFyYW0gbWV0aG9kRHVyYXRpb24gICBUaW1lIG9mIGV4ZWN1dGlvbiBvZiB0aGUgcmVzb3VyY2UgbWV0aG9kLgorICAgICAgICAgKiBAcGFyYW0gcmVxdWVzdFN0YXJ0VGltZSBUaW1lIG9mIHdob2xlIHJlcXVlc3QgcHJvY2Vzc2luZyAoZnJvbSByZWNlaXZpbmcgdGhlIHJlcXVlc3QgdW50aWwgd3JpdGluZyB0aGUgcmVzcG9uc2UpLiAoVW5peAorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAgZm9ybWF0KQorICAgICAgICAgKiBAcGFyYW0gcmVxdWVzdER1cmF0aW9uICBUaW1lIHdoZW4gdGhlIHJlcXVlc3QgbWF0Y2hpbmcgdG8gdGhlIGV4ZWN1dGVkIHJlc291cmNlIG1ldGhvZCBoYXMgYmVlbiByZWNlaXZlZCBieSBKZXJzZXkuCisgICAgICAgICAqLworICAgICAgICB2b2lkIGFkZFJlc291cmNlTWV0aG9kRXhlY3V0aW9uKGZpbmFsIGxvbmcgbWV0aG9kU3RhcnRUaW1lLCBmaW5hbCBsb25nIG1ldGhvZER1cmF0aW9uLCBmaW5hbCBsb25nIHJlcXVlc3RTdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyByZXF1ZXN0RHVyYXRpb24pIHsKKyAgICAgICAgICAgIGNhY2hlZCA9IG51bGw7CisKKyAgICAgICAgICAgIGlmIChyZXNvdXJjZU1ldGhvZEV4ZWN1dGlvblN0YXRpc3RpY3NCdWlsZGVyLmdldCgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXNvdXJjZU1ldGhvZEV4ZWN1dGlvblN0YXRpc3RpY3NCdWlsZGVyLmNvbXBhcmVBbmRTZXQobnVsbCwgbmV3IEV4ZWN1dGlvblN0YXRpc3RpY3NJbXBsLkJ1aWxkZXIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXNvdXJjZU1ldGhvZEV4ZWN1dGlvblN0YXRpc3RpY3NCdWlsZGVyLmdldCgpLmFkZEV4ZWN1dGlvbihtZXRob2RTdGFydFRpbWUsIG1ldGhvZER1cmF0aW9uKTsKKworICAgICAgICAgICAgaWYgKHJlcXVlc3RFeGVjdXRpb25TdGF0aXN0aWNzQnVpbGRlci5nZXQoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmVxdWVzdEV4ZWN1dGlvblN0YXRpc3RpY3NCdWlsZGVyLmNvbXBhcmVBbmRTZXQobnVsbCwgbmV3IEV4ZWN1dGlvblN0YXRpc3RpY3NJbXBsLkJ1aWxkZXIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXF1ZXN0RXhlY3V0aW9uU3RhdGlzdGljc0J1aWxkZXIuZ2V0KCkuYWRkRXhlY3V0aW9uKHJlcXVlc3RTdGFydFRpbWUsIHJlcXVlc3REdXJhdGlvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIEV4ZWN1dGlvblN0YXRpc3RpY3MgcmVzb3VyY2VNZXRob2RFeGVjdXRpb25TdGF0aXN0aWNzOworICAgIHByaXZhdGUgZmluYWwgRXhlY3V0aW9uU3RhdGlzdGljcyByZXF1ZXN0RXhlY3V0aW9uU3RhdGlzdGljczsKKyAgICBwcml2YXRlIGZpbmFsIFJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kOworCisgICAgcHJpdmF0ZSBSZXNvdXJjZU1ldGhvZFN0YXRpc3RpY3NJbXBsKGZpbmFsIFJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBFeGVjdXRpb25TdGF0aXN0aWNzIHJlc291cmNlTWV0aG9kRXhlY3V0aW9uU3RhdGlzdGljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRXhlY3V0aW9uU3RhdGlzdGljcyByZXF1ZXN0RXhlY3V0aW9uU3RhdGlzdGljcykgeworICAgICAgICB0aGlzLnJlc291cmNlTWV0aG9kID0gcmVzb3VyY2VNZXRob2Q7CisKKyAgICAgICAgdGhpcy5yZXNvdXJjZU1ldGhvZEV4ZWN1dGlvblN0YXRpc3RpY3MgPSByZXNvdXJjZU1ldGhvZEV4ZWN1dGlvblN0YXRpc3RpY3M7CisgICAgICAgIHRoaXMucmVxdWVzdEV4ZWN1dGlvblN0YXRpc3RpY3MgPSByZXF1ZXN0RXhlY3V0aW9uU3RhdGlzdGljczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRXhlY3V0aW9uU3RhdGlzdGljcyBnZXRSZXF1ZXN0U3RhdGlzdGljcygpIHsKKyAgICAgICAgcmV0dXJuIHJlcXVlc3RFeGVjdXRpb25TdGF0aXN0aWNzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBFeGVjdXRpb25TdGF0aXN0aWNzIGdldE1ldGhvZFN0YXRpc3RpY3MoKSB7CisgICAgICAgIHJldHVybiByZXNvdXJjZU1ldGhvZEV4ZWN1dGlvblN0YXRpc3RpY3M7CisgICAgfQorCisgICAgcHVibGljIFJlc291cmNlTWV0aG9kIGdldFJlc291cmNlTWV0aG9kKCkgeworICAgICAgICByZXR1cm4gcmVzb3VyY2VNZXRob2Q7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc291cmNlTWV0aG9kU3RhdGlzdGljcyBzbmFwc2hvdCgpIHsKKyAgICAgICAgLy8gdGhpcyBvYmplY3QgaXMgaW1tdXRhYmxlIChub3QgY29uc2lkZXJpbmcgUmVzb3VyY2VNZXRob2Qgd2hpY2ggaXMgbm90IGEgbW9uaXRvcmluZyBvYmplY3QpCisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3JpbmcvUmVzb3VyY2VTdGF0aXN0aWNzSW1wbC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9SZXNvdXJjZVN0YXRpc3RpY3NJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQzMWE5NQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3JpbmcvUmVzb3VyY2VTdGF0aXN0aWNzSW1wbC5qYXZhCkBAIC0wLDAgKzEsMTg5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5tb25pdG9yaW5nOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1ldGhvZDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5FeGVjdXRpb25TdGF0aXN0aWNzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLlJlc291cmNlTWV0aG9kU3RhdGlzdGljczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5SZXNvdXJjZVN0YXRpc3RpY3M7CisKKy8qKgorICogSW1tdXRhYmxlIHJlc291cmNlIHN0YXRpc3RpY3MgaW1wbGVtZW50YXRpb24uCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYSBhdCBvcmFjbGUuY29tKQorICovCitmaW5hbCBjbGFzcyBSZXNvdXJjZVN0YXRpc3RpY3NJbXBsIGltcGxlbWVudHMgUmVzb3VyY2VTdGF0aXN0aWNzIHsKKworICAgIC8qKgorICAgICAqIEJ1aWxkZXIgb2YgcmVzb3VyY2Ugc3RhdGlzdGljcyBpbnN0YW5jZXMuCisgICAgICogPHAvPgorICAgICAqIE11c3QgYmUgdGhyZWFkLXNhZmUuCisgICAgICovCisgICAgc3RhdGljIGNsYXNzIEJ1aWxkZXIgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgQ29uY3VycmVudE1hcDxSZXNvdXJjZU1ldGhvZFN0YXRpc3RpY3NJbXBsLkJ1aWxkZXIsIEJvb2xlYW4+IG1ldGhvZHNCdWlsZGVycyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDw+KCk7CisgICAgICAgIHByaXZhdGUgZmluYWwgUmVzb3VyY2VNZXRob2RTdGF0aXN0aWNzSW1wbC5GYWN0b3J5IG1ldGhvZEZhY3Rvcnk7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNSZWZlcmVuY2U8RXhlY3V0aW9uU3RhdGlzdGljc0ltcGwuQnVpbGRlcj4gcmVzb3VyY2VFeGVjdXRpb25TdGF0aXN0aWNzQnVpbGRlciA9IG5ldworICAgICAgICAgICAgICAgIEF0b21pY1JlZmVyZW5jZTw+KCk7CisgICAgICAgIHByaXZhdGUgZmluYWwgQXRvbWljUmVmZXJlbmNlPEV4ZWN1dGlvblN0YXRpc3RpY3NJbXBsLkJ1aWxkZXI+IHJlcXVlc3RFeGVjdXRpb25TdGF0aXN0aWNzQnVpbGRlciA9IG5ldworICAgICAgICAgICAgICAgIEF0b21pY1JlZmVyZW5jZTw+KCk7CisKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBSZXNvdXJjZVN0YXRpc3RpY3NJbXBsIGNhY2hlZDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGEgbmV3IGJ1aWxkZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSByZXNvdXJjZSBSZXNvdXJjZSBmb3Igd2hpY2ggdGhlIGluc3RhbmNlIGlzIGNyZWF0ZWQuCisgICAgICAgICAqLworICAgICAgICBCdWlsZGVyKGZpbmFsIFJlc291cmNlIHJlc291cmNlLCBmaW5hbCBSZXNvdXJjZU1ldGhvZFN0YXRpc3RpY3NJbXBsLkZhY3RvcnkgbWV0aG9kRmFjdG9yeSkgeworICAgICAgICAgICAgdGhpcyhtZXRob2RGYWN0b3J5KTsKKworICAgICAgICAgICAgZm9yIChmaW5hbCBSZXNvdXJjZU1ldGhvZCBtZXRob2QgOiByZXNvdXJjZS5nZXRSZXNvdXJjZU1ldGhvZHMoKSkgeworICAgICAgICAgICAgICAgIGdldE9yQ3JlYXRlKG1ldGhvZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGEgbmV3IGJ1aWxkZXIuCisgICAgICAgICAqLworICAgICAgICBCdWlsZGVyKGZpbmFsIFJlc291cmNlTWV0aG9kU3RhdGlzdGljc0ltcGwuRmFjdG9yeSBtZXRob2RGYWN0b3J5KSB7CisgICAgICAgICAgICB0aGlzLm1ldGhvZEZhY3RvcnkgPSBtZXRob2RGYWN0b3J5OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJ1aWxkIGEgbmV3IGluc3RhbmNlIG9mIHtAbGluayBSZXNvdXJjZVN0YXRpc3RpY3NJbXBsfS4KKyAgICAgICAgICogPHAvPgorICAgICAgICAgKiBOb3RlIHRoYXQgdGhpcyBidWlsZCBtZXRob2QgaXMgY2FsbGVkIGZyb20gdmFyaW91cyBkaWZmZXJlbnQgdGhyZWFkcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBOZXcgaW5zdGFuY2Ugb2YgcmVzb3VyY2Ugc3RhdGlzdGljcy4KKyAgICAgICAgICovCisgICAgICAgIFJlc291cmNlU3RhdGlzdGljc0ltcGwgYnVpbGQoKSB7CisgICAgICAgICAgICBSZXNvdXJjZVN0YXRpc3RpY3NJbXBsIGNhY2hlZFJlZmVyZW5jZSA9IGNhY2hlZDsKKyAgICAgICAgICAgIGlmIChjYWNoZWRSZWZlcmVuY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZWRSZWZlcmVuY2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIE1hcDxSZXNvdXJjZU1ldGhvZCwgUmVzb3VyY2VNZXRob2RTdGF0aXN0aWNzPiByZXNvdXJjZU1ldGhvZHMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgICAgICBmb3IgKGZpbmFsIFJlc291cmNlTWV0aG9kU3RhdGlzdGljc0ltcGwuQnVpbGRlciBidWlsZGVyIDogbWV0aG9kc0J1aWxkZXJzLmtleVNldCgpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VNZXRob2RTdGF0aXN0aWNzSW1wbCBzdGF0cyA9IGJ1aWxkZXIuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICByZXNvdXJjZU1ldGhvZHMucHV0KHN0YXRzLmdldFJlc291cmNlTWV0aG9kKCksIHN0YXRzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgRXhlY3V0aW9uU3RhdGlzdGljcyByZXNvdXJjZVN0YXRzID0gcmVzb3VyY2VFeGVjdXRpb25TdGF0aXN0aWNzQnVpbGRlci5nZXQoKSA9PSBudWxsCisgICAgICAgICAgICAgICAgICAgID8gRXhlY3V0aW9uU3RhdGlzdGljc0ltcGwuRU1QVFkgOiByZXNvdXJjZUV4ZWN1dGlvblN0YXRpc3RpY3NCdWlsZGVyLmdldCgpLmJ1aWxkKCk7CisgICAgICAgICAgICBmaW5hbCBFeGVjdXRpb25TdGF0aXN0aWNzIHJlcXVlc3RTdGF0cyA9IHJlcXVlc3RFeGVjdXRpb25TdGF0aXN0aWNzQnVpbGRlci5nZXQoKSA9PSBudWxsCisgICAgICAgICAgICAgICAgICAgID8gRXhlY3V0aW9uU3RhdGlzdGljc0ltcGwuRU1QVFkgOiByZXF1ZXN0RXhlY3V0aW9uU3RhdGlzdGljc0J1aWxkZXIuZ2V0KCkuYnVpbGQoKTsKKworICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VTdGF0aXN0aWNzSW1wbCBzdGF0cyA9IG5ldyBSZXNvdXJjZVN0YXRpc3RpY3NJbXBsKHJlc291cmNlTWV0aG9kcywKKyAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VTdGF0cywgcmVxdWVzdFN0YXRzKTsKKworICAgICAgICAgICAgaWYgKE1vbml0b3JpbmdVdGlscy5pc0NhY2hlYWJsZShyZXF1ZXN0U3RhdHMpKSB7CisgICAgICAgICAgICAgICAgY2FjaGVkID0gc3RhdHM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBzdGF0czsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgZXhlY3V0aW9uIG9mIGEgcmVzb3VyY2UgbWV0aG9kIGluIHRoZSByZXNvdXJjZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHJlc291cmNlTWV0aG9kICAgUmVzb3VyY2UgbWV0aG9kIGV4ZWN1dGVkLgorICAgICAgICAgKiBAcGFyYW0gbWV0aG9kU3RhcnRUaW1lICBUaW1lIG9mIGV4ZWN1dGlvbiBvZiB0aGUgcmVzb3VyY2UgbWV0aG9kLgorICAgICAgICAgKiBAcGFyYW0gbWV0aG9kRHVyYXRpb24gICBUaW1lIHNwZW50IG9uIGV4ZWN1dGlvbiBvZiByZXNvdXJjZSBtZXRob2QgaXRzZWxmLgorICAgICAgICAgKiBAcGFyYW0gcmVxdWVzdFN0YXJ0VGltZSBUaW1lIHdoZW4gdGhlIHJlcXVlc3QgbWF0Y2hpbmcgdG8gdGhlIGV4ZWN1dGVkIHJlc291cmNlIG1ldGhvZCBoYXMgYmVlbiByZWNlaXZlZCBieSBKZXJzZXkuCisgICAgICAgICAqIEBwYXJhbSByZXF1ZXN0RHVyYXRpb24gIFRpbWUgb2Ygd2hvbGUgcmVxdWVzdCBwcm9jZXNzaW5nIChmcm9tIHJlY2VpdmluZyB0aGUgcmVxdWVzdCB1bnRpbCB3cml0aW5nIHRoZSByZXNwb25zZSkuCisgICAgICAgICAqLworICAgICAgICB2b2lkIGFkZEV4ZWN1dGlvbihmaW5hbCBSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCwgZmluYWwgbG9uZyBtZXRob2RTdGFydFRpbWUsIGZpbmFsIGxvbmcgbWV0aG9kRHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgcmVxdWVzdFN0YXJ0VGltZSwgZmluYWwgbG9uZyByZXF1ZXN0RHVyYXRpb24pIHsKKyAgICAgICAgICAgIGNhY2hlZCA9IG51bGw7CisKKyAgICAgICAgICAgIGlmIChyZXNvdXJjZUV4ZWN1dGlvblN0YXRpc3RpY3NCdWlsZGVyLmdldCgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXNvdXJjZUV4ZWN1dGlvblN0YXRpc3RpY3NCdWlsZGVyLmNvbXBhcmVBbmRTZXQobnVsbCwgbmV3IEV4ZWN1dGlvblN0YXRpc3RpY3NJbXBsLkJ1aWxkZXIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXNvdXJjZUV4ZWN1dGlvblN0YXRpc3RpY3NCdWlsZGVyLmdldCgpLmFkZEV4ZWN1dGlvbihtZXRob2RTdGFydFRpbWUsIG1ldGhvZER1cmF0aW9uKTsKKworICAgICAgICAgICAgaWYgKHJlcXVlc3RFeGVjdXRpb25TdGF0aXN0aWNzQnVpbGRlci5nZXQoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmVxdWVzdEV4ZWN1dGlvblN0YXRpc3RpY3NCdWlsZGVyLmNvbXBhcmVBbmRTZXQobnVsbCwgbmV3IEV4ZWN1dGlvblN0YXRpc3RpY3NJbXBsLkJ1aWxkZXIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXF1ZXN0RXhlY3V0aW9uU3RhdGlzdGljc0J1aWxkZXIuZ2V0KCkuYWRkRXhlY3V0aW9uKHJlcXVlc3RTdGFydFRpbWUsIHJlcXVlc3REdXJhdGlvbik7CisKKyAgICAgICAgICAgIGFkZE1ldGhvZChyZXNvdXJjZU1ldGhvZCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIGEgcmVzb3VyY2UgbWV0aG9kIHRvIHRoZSBzdGF0aXN0aWNzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcmVzb3VyY2VNZXRob2QgUmVzb3VyY2UgbWV0aG9kLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBhZGRNZXRob2QoZmluYWwgUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QpIHsKKyAgICAgICAgICAgIGNhY2hlZCA9IG51bGw7CisKKyAgICAgICAgICAgIGdldE9yQ3JlYXRlKHJlc291cmNlTWV0aG9kKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgUmVzb3VyY2VNZXRob2RTdGF0aXN0aWNzSW1wbC5CdWlsZGVyIGdldE9yQ3JlYXRlKGZpbmFsIFJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kKSB7CisgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZU1ldGhvZFN0YXRpc3RpY3NJbXBsLkJ1aWxkZXIgbWV0aG9kU3RhdHMgPSBtZXRob2RGYWN0b3J5LmdldE9yQ3JlYXRlKHJlc291cmNlTWV0aG9kKTsKKworICAgICAgICAgICAgbWV0aG9kc0J1aWxkZXJzLnB1dElmQWJzZW50KG1ldGhvZFN0YXRzLCBCb29sZWFuLlRSVUUpOworICAgICAgICAgICAgcmV0dXJuIG1ldGhvZFN0YXRzOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxSZXNvdXJjZU1ldGhvZCwgUmVzb3VyY2VNZXRob2RTdGF0aXN0aWNzPiByZXNvdXJjZU1ldGhvZHM7CisgICAgcHJpdmF0ZSBmaW5hbCBFeGVjdXRpb25TdGF0aXN0aWNzIHJlc291cmNlRXhlY3V0aW9uU3RhdGlzdGljczsKKyAgICBwcml2YXRlIGZpbmFsIEV4ZWN1dGlvblN0YXRpc3RpY3MgcmVxdWVzdEV4ZWN1dGlvblN0YXRpc3RpY3M7CisKKyAgICBwcml2YXRlIFJlc291cmNlU3RhdGlzdGljc0ltcGwoZmluYWwgTWFwPFJlc291cmNlTWV0aG9kLCBSZXNvdXJjZU1ldGhvZFN0YXRpc3RpY3M+IHJlc291cmNlTWV0aG9kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRXhlY3V0aW9uU3RhdGlzdGljcyByZXNvdXJjZUV4ZWN1dGlvblN0YXRpc3RpY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEV4ZWN1dGlvblN0YXRpc3RpY3MgcmVxdWVzdEV4ZWN1dGlvblN0YXRpc3RpY3MpIHsKKyAgICAgICAgdGhpcy5yZXNvdXJjZU1ldGhvZHMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAocmVzb3VyY2VNZXRob2RzKTsKKyAgICAgICAgdGhpcy5yZXNvdXJjZUV4ZWN1dGlvblN0YXRpc3RpY3MgPSByZXNvdXJjZUV4ZWN1dGlvblN0YXRpc3RpY3M7CisgICAgICAgIHRoaXMucmVxdWVzdEV4ZWN1dGlvblN0YXRpc3RpY3MgPSByZXF1ZXN0RXhlY3V0aW9uU3RhdGlzdGljczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRXhlY3V0aW9uU3RhdGlzdGljcyBnZXRSZXNvdXJjZU1ldGhvZEV4ZWN1dGlvblN0YXRpc3RpY3MoKSB7CisgICAgICAgIHJldHVybiByZXNvdXJjZUV4ZWN1dGlvblN0YXRpc3RpY3M7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEV4ZWN1dGlvblN0YXRpc3RpY3MgZ2V0UmVxdWVzdEV4ZWN1dGlvblN0YXRpc3RpY3MoKSB7CisgICAgICAgIHJldHVybiByZXF1ZXN0RXhlY3V0aW9uU3RhdGlzdGljczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWFwPFJlc291cmNlTWV0aG9kLCBSZXNvdXJjZU1ldGhvZFN0YXRpc3RpY3M+IGdldFJlc291cmNlTWV0aG9kU3RhdGlzdGljcygpIHsKKyAgICAgICAgcmV0dXJuIHJlc291cmNlTWV0aG9kczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb3VyY2VTdGF0aXN0aWNzIHNuYXBzaG90KCkgeworICAgICAgICAvLyB0aGlzIG9iamVjdCBpcyBpbW11dGFibGUgYW5kIGFsbCB0aGUgb3RoZXIgYWNjZXNzaWJsZSBvYmplY3RzIGFzIHdlbGwKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9SZXNwb25zZVN0YXRpc3RpY3NJbXBsLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL1Jlc3BvbnNlU3RhdGlzdGljc0ltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWYyZjExCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9SZXNwb25zZVN0YXRpc3RpY3NJbXBsLmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwubW9uaXRvcmluZzsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuUmVzcG9uc2VTdGF0aXN0aWNzOworCisvKioKKyAqIEltbXV0YWJsZSByZXNwb25zZSBzdGF0aXN0aWNzLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworZmluYWwgY2xhc3MgUmVzcG9uc2VTdGF0aXN0aWNzSW1wbCBpbXBsZW1lbnRzIFJlc3BvbnNlU3RhdGlzdGljcyB7CisKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxJbnRlZ2VyLCBMb25nPiByZXNwb25zZUNvZGVzOworICAgIHByaXZhdGUgZmluYWwgSW50ZWdlciBsYXN0UmVzcG9uc2VDb2RlOworCisgICAgLyoqCisgICAgICogVGhpcyBidWlsZGVyIGRvZXMgbm90IG5lZWQgdG8gYmUgdGhyZWFkc2FmZSBzaW5jZSBpdCdzIGNhbGxlZCBvbmx5IGZyb20gdGhlIGplcnNleS1iYWNrZ3JvdW5kLXRhc2stc2NoZWR1bGVyLgorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBCdWlsZGVyIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIE1hcDxJbnRlZ2VyLCBMb25nPiByZXNwb25zZUNvZGVzTWFwID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBwcml2YXRlIEludGVnZXIgbGFzdFJlc3BvbnNlQ29kZSA9IG51bGw7CisKKyAgICAgICAgcHJpdmF0ZSBSZXNwb25zZVN0YXRpc3RpY3NJbXBsIGNhY2hlZCA9IG51bGw7CisKKyAgICAgICAgdm9pZCBhZGRSZXNwb25zZUNvZGUoZmluYWwgaW50IHJlc3BvbnNlQ29kZSkgeworICAgICAgICAgICAgY2FjaGVkID0gbnVsbDsKKworICAgICAgICAgICAgbGFzdFJlc3BvbnNlQ29kZSA9IHJlc3BvbnNlQ29kZTsKKyAgICAgICAgICAgIExvbmcgY3VycmVudFZhbHVlID0gcmVzcG9uc2VDb2Rlc01hcC5nZXQocmVzcG9uc2VDb2RlKTsKKyAgICAgICAgICAgIGlmIChjdXJyZW50VmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IDBMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzcG9uc2VDb2Rlc01hcC5wdXQocmVzcG9uc2VDb2RlLCBjdXJyZW50VmFsdWUgKyAxKTsKKyAgICAgICAgfQorCisgICAgICAgIFJlc3BvbnNlU3RhdGlzdGljc0ltcGwgYnVpbGQoKSB7CisgICAgICAgICAgICBpZiAoY2FjaGVkID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjYWNoZWQgPSBuZXcgUmVzcG9uc2VTdGF0aXN0aWNzSW1wbChsYXN0UmVzcG9uc2VDb2RlLCBuZXcgSGFzaE1hcDw+KHRoaXMucmVzcG9uc2VDb2Rlc01hcCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gY2FjaGVkOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwcml2YXRlIFJlc3BvbnNlU3RhdGlzdGljc0ltcGwoZmluYWwgSW50ZWdlciBsYXN0UmVzcG9uc2VDb2RlLCBmaW5hbCBNYXA8SW50ZWdlciwgTG9uZz4gcmVzcG9uc2VDb2RlcykgeworICAgICAgICB0aGlzLmxhc3RSZXNwb25zZUNvZGUgPSBsYXN0UmVzcG9uc2VDb2RlOworICAgICAgICB0aGlzLnJlc3BvbnNlQ29kZXMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAocmVzcG9uc2VDb2Rlcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEludGVnZXIgZ2V0TGFzdFJlc3BvbnNlQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIGxhc3RSZXNwb25zZUNvZGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1hcDxJbnRlZ2VyLCBMb25nPiBnZXRSZXNwb25zZUNvZGVzKCkgeworICAgICAgICByZXR1cm4gcmVzcG9uc2VDb2RlczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzcG9uc2VTdGF0aXN0aWNzIHNuYXBzaG90KCkgeworICAgICAgICAvLyB0aGlzIG9iamVjdCBpcyBpbW11dGFibGUKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9TbGlkaW5nV2luZG93VGltZVJlc2Vydm9pci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9TbGlkaW5nV2luZG93VGltZVJlc2Vydm9pci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMDU3NzQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL1NsaWRpbmdXaW5kb3dUaW1lUmVzZXJ2b2lyLmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwubW9uaXRvcmluZzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5tb25pdG9yaW5nLmNvcmUuQWJzdHJhY3RTbGlkaW5nV2luZG93VGltZVJlc2Vydm9pcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwubW9uaXRvcmluZy5jb3JlLlNsaWRpbmdXaW5kb3dUcmltbWVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5tb25pdG9yaW5nLmNvcmUuVW5pZm9ybVRpbWVTbmFwc2hvdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwubW9uaXRvcmluZy5jb3JlLlVuaWZvcm1UaW1lVmFsdWVzU25hcHNob3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworLyoqCisgKiBTbGlkaW5nIHdpbmRvdyB0aW1lIHJlc2Vydm9pciBpbXBsZW1lbnRhdGlvbiB0aGF0IHN0b3JlcyBkYXRhIG9mIHR5cGUge0BsaW5rIExvbmd9LgorICoKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLworY2xhc3MgU2xpZGluZ1dpbmRvd1RpbWVSZXNlcnZvaXIgZXh0ZW5kcyBBYnN0cmFjdFNsaWRpbmdXaW5kb3dUaW1lUmVzZXJ2b2lyPExvbmc+IHsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgc2xpZGluZyB3aW5kb3cgdGltZSByZXNlcnZvaXIgd2l0aCB0aGUgc3RhcnQgdGltZSwgc3BlY2lmaWVkIHRpbWUgd2luZG93IGFuZCBhIGN1c3RvbSB0cmltbWVyLgorICAgICAqCisgICAgICogQHBhcmFtIHdpbmRvdyAgICAgICAgVGhlIHdpbmRvdyBvZiBzdGFydFRpbWUuCisgICAgICogQHBhcmFtIHdpbmRvd1VuaXQgICAgVGhlIHVuaXQgb2Yge0Bjb2RlIHdpbmRvd30uCisgICAgICogQHBhcmFtIHN0YXJ0VGltZSAgICAgVGhlIHN0YXJ0IHRpbWUgZnJvbSB3aGljaCB0aGlzIHJlc2Vydm9pciBjYWxjdWxhdGVzIG1lYXN1cmVtZW50cy4KKyAgICAgKiBAcGFyYW0gc3RhcnRUaW1lVW5pdCBUaGUgc3RhcnQgdGltZSB1bml0LgorICAgICAqIEBwYXJhbSB0cmltbWVyICAgICAgIFRoZSB0cmltbWVyIHRvIHVzZSBmb3IgdHJpbW1pbmcsIGlmIHtAY29kZSBudWxsfSwgZGVmYXVsdCB0cmltbWVyIGlzIHVzZWQuCisgICAgICovCisgICAgcHVibGljIFNsaWRpbmdXaW5kb3dUaW1lUmVzZXJ2b2lyKGZpbmFsIGxvbmcgd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUaW1lVW5pdCB3aW5kb3dVbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBsb25nIHN0YXJ0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVGltZVVuaXQgc3RhcnRUaW1lVW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU2xpZGluZ1dpbmRvd1RyaW1tZXI8TG9uZz4gdHJpbW1lcikgeworICAgICAgICBzdXBlcih3aW5kb3csIHdpbmRvd1VuaXQsIHN0YXJ0VGltZSwgc3RhcnRUaW1lVW5pdCwgdHJpbW1lcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBzbGlkaW5nIHdpbmRvdyB0aW1lIHJlc2Vydm9pciB3aXRoIHRoZSBzdGFydCB0aW1lLCBzcGVjaWZpZWQgdGltZSB3aW5kb3cgYW5kIGEgZGVmYXVsdCB0cmltbWVyLgorICAgICAqCisgICAgICogQHBhcmFtIHdpbmRvdyAgICAgICAgVGhlIHdpbmRvdyBvZiBzdGFydFRpbWUuCisgICAgICogQHBhcmFtIHdpbmRvd1VuaXQgICAgVGhlIHVuaXQgb2Yge0Bjb2RlIHdpbmRvd30uCisgICAgICogQHBhcmFtIHN0YXJ0VGltZSAgICAgVGhlIHN0YXJ0IHRpbWUgZnJvbSB3aGljaCB0aGlzIHJlc2Vydm9pciBjYWxjdWxhdGVzIG1lYXN1cmVtZW50cy4KKyAgICAgKiBAcGFyYW0gc3RhcnRUaW1lVW5pdCBUaGUgc3RhcnQgdGltZSB1bml0LgorICAgICAqLworICAgIHB1YmxpYyBTbGlkaW5nV2luZG93VGltZVJlc2Vydm9pcihmaW5hbCBsb25nIHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVGltZVVuaXQgd2luZG93VW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFRpbWVVbml0IHN0YXJ0VGltZVVuaXQpIHsKKyAgICAgICAgdGhpcyh3aW5kb3csIHdpbmRvd1VuaXQsIHN0YXJ0VGltZSwgc3RhcnRUaW1lVW5pdCwgbnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFVuaWZvcm1UaW1lU25hcHNob3Qgc25hcHNob3QoZmluYWwgQ29sbGVjdGlvbjxMb25nPiB2YWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyB0aW1lSW50ZXJ2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVGltZVVuaXQgdGltZUludGVydmFsVW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBsb25nIHRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVGltZVVuaXQgdGltZVVuaXQpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBVbmlmb3JtVGltZVZhbHVlc1NuYXBzaG90KHZhbHVlcywgdGltZUludGVydmFsLCB0aW1lSW50ZXJ2YWxVbml0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL1RpbWVXaW5kb3dTdGF0aXN0aWNzSW1wbC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9UaW1lV2luZG93U3RhdGlzdGljc0ltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGIxMzlkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9UaW1lV2luZG93U3RhdGlzdGljc0ltcGwuamF2YQpAQCAtMCwwICsxLDE3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwubW9uaXRvcmluZzsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLm1vbml0b3JpbmcuY29yZS5UaW1lUmVzZXJ2b2lyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5tb25pdG9yaW5nLmNvcmUuVW5pZm9ybVRpbWVTbmFwc2hvdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5UaW1lV2luZG93U3RhdGlzdGljczsKKworLyoqCisgKiBJbW11dGFibGUge0BsaW5rIFRpbWVXaW5kb3dTdGF0aXN0aWNzIFRpbWUgd2luZG93IHN0YXRpc3RpY3N9IHRoYXQgdXNlcyBiYWNraW5nIHtAbGluayBTbGlkaW5nV2luZG93VGltZVJlc2Vydm9pcn0gZm9yIGl0cworICoge0Bjb2RlIEJ1aWxkZXJ9IGltcGxlbWVudGF0aW9uLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLworZmluYWwgY2xhc3MgVGltZVdpbmRvd1N0YXRpc3RpY3NJbXBsIGltcGxlbWVudHMgVGltZVdpbmRvd1N0YXRpc3RpY3MgeworCisgICAgLyoqCisgICAgICogQnVpbGRlciBvZiB0aW1lIHdpbmRvdyBzdGF0aXN0aWNzLgorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBCdWlsZGVyPFY+IHsKKworICAgICAgICAvKioKKyAgICAgICAgICogVG90YWwgaW50ZXJ2YWwgZm9yIHdoaWNoIHRoZXNlIHN0YXRpc3RpY3MgYXJlIGNhbGN1bGF0ZWQgKGVnLiBsYXN0IDE1IHNlY29uZHMsIGxhc3Qgb25lIG1pbnV0ZSkgY29udmVydGVkIHRvIG1zCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGZpbmFsIGxvbmcgaW50ZXJ2YWw7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBUaW1lUmVzZXJ2b2lyPFY+IHRpbWVSZXNlcnZvaXI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBuZXcgdGltZSB3aW5kb3cgc3RhdGlzdGljcyBidWlsZGVyIGluc3RhbmNlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdGltZVJlc2Vydm9pciBzdGF0aXN0aWNhbGx5IHJlcHJlc2VudGF0aXZlIHJlc2Vydm9pciBvZiBsb25nIHZhbHVlcyBkYXRhIHN0cmVhbSBpbiB0aW1lLgorICAgICAgICAgKi8KKyAgICAgICAgQnVpbGRlcihUaW1lUmVzZXJ2b2lyPFY+IHRpbWVSZXNlcnZvaXIpIHsKKyAgICAgICAgICAgIGludGVydmFsID0gdGltZVJlc2Vydm9pci5pbnRlcnZhbChUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICAgICAgdGhpcy50aW1lUmVzZXJ2b2lyID0gdGltZVJlc2Vydm9pcjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgcmVxdWVzdCBleGVjdXRpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSByZXF1ZXN0VGltZSBUaW1lIG9mIGV4ZWN1dGlvbi4KKyAgICAgICAgICogQHBhcmFtIGR1cmF0aW9uICAgIER1cmF0aW9uIG9mIHJlcXVlc3QgcHJvY2Vzc2luZy4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgYWRkUmVxdWVzdChmaW5hbCBsb25nIHJlcXVlc3RUaW1lLCBmaW5hbCBWIGR1cmF0aW9uKSB7CisgICAgICAgICAgICB0aW1lUmVzZXJ2b2lyLnVwZGF0ZShkdXJhdGlvbiwgcmVxdWVzdFRpbWUsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQnVpbGQgdGhlIHRpbWUgd2luZG93IHN0YXRpc3RpY3MgaW5zdGFuY2UuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gTmV3IGluc3RhbmNlIG9mIHN0YXRpc3RpY3MuCisgICAgICAgICAqLworICAgICAgICBUaW1lV2luZG93U3RhdGlzdGljc0ltcGwgYnVpbGQoKSB7CisgICAgICAgICAgICByZXR1cm4gYnVpbGQoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJ1aWxkIHRoZSB0aW1lIHdpbmRvdyBzdGF0aXN0aWNzIGluc3RhbmNlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY3VycmVudFRpbWUgQ3VycmVudCB0aW1lIGFzIGEgcmVmZXJlbmNlIHRvIHdoaWNoIHRoZSBzdGF0aXN0aWNzIHNob3VsZCBiZSBidWlsdC4KKyAgICAgICAgICogQHJldHVybiBOZXcgaW5zdGFuY2Ugb2Ygc3RhdGlzdGljcy4KKyAgICAgICAgICovCisgICAgICAgIFRpbWVXaW5kb3dTdGF0aXN0aWNzSW1wbCBidWlsZChmaW5hbCBsb25nIGN1cnJlbnRUaW1lKSB7CisgICAgICAgICAgICBmaW5hbCBVbmlmb3JtVGltZVNuYXBzaG90IGR1cmF0aW9uUmVzZXJ2b2lyU25hcHNob3QgPSB0aW1lUmVzZXJ2b2lyCisgICAgICAgICAgICAgICAgICAgIC5nZXRTbmFwc2hvdChjdXJyZW50VGltZSwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKworICAgICAgICAgICAgLy8gaWYgbm90aGluZyB3YXMgY29sbGVjdGVkLCByZXR1cm4gYSBzaW5nbGUgZW1wdHkgc3RhdCBpbnN0YW5jZQorICAgICAgICAgICAgaWYgKGR1cmF0aW9uUmVzZXJ2b2lyU25hcHNob3Quc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0T3JDcmVhdGVFbXB0eVN0YXRzKGludGVydmFsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ldyBUaW1lV2luZG93U3RhdGlzdGljc0ltcGwoaW50ZXJ2YWwsIGR1cmF0aW9uUmVzZXJ2b2lyU25hcHNob3QpOworCisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFRpbWVXaW5kb3dTdGF0aXN0aWNzSW1wbCBnZXRPckNyZWF0ZUVtcHR5U3RhdHMoZmluYWwgbG9uZyBpbnRlcnZhbCkgeworICAgICAgICAgICAgaWYgKCFFTVBUWS5jb250YWluc0tleShpbnRlcnZhbCkpIHsKKyAgICAgICAgICAgICAgICBFTVBUWS5wdXRJZkFic2VudChpbnRlcnZhbCwgbmV3IFRpbWVXaW5kb3dTdGF0aXN0aWNzSW1wbChpbnRlcnZhbCwgMCwgLTEsIC0xLCAtMSwgMCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEVNUFRZLmdldChpbnRlcnZhbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgbG9uZyBnZXRJbnRlcnZhbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBpbnRlcnZhbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbmN1cnJlbnRIYXNoTWFwPExvbmcsIFRpbWVXaW5kb3dTdGF0aXN0aWNzSW1wbD4gRU1QVFkgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8Pig2KTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIEVNUFRZLnB1dElmQWJzZW50KDBMLCBuZXcgVGltZVdpbmRvd1N0YXRpc3RpY3NJbXBsKDAsIDAsIDAsIDAsIDAsIDApKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgaW50ZXJ2YWw7CisKKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgbWluaW11bUR1cmF0aW9uOworICAgIHByaXZhdGUgZmluYWwgbG9uZyBtYXhpbXVtRHVyYXRpb247CisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIGF2ZXJhZ2VEdXJhdGlvbjsKKworICAgIHByaXZhdGUgZmluYWwgbG9uZyB0b3RhbENvdW50OworICAgIHByaXZhdGUgZmluYWwgZG91YmxlIHJlcXVlc3RzUGVyU2Vjb25kOworCisgICAgcHJpdmF0ZSBUaW1lV2luZG93U3RhdGlzdGljc0ltcGwoZmluYWwgbG9uZyBpbnRlcnZhbCwgZmluYWwgZG91YmxlIHJlcXVlc3RzUGVyU2Vjb25kLCBmaW5hbCBsb25nIG1pbmltdW1EdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBsb25nIG1heGltdW1EdXJhdGlvbiwgZmluYWwgbG9uZyBhdmVyYWdlRHVyYXRpb24sIGZpbmFsIGxvbmcgdG90YWxDb3VudCkgeworICAgICAgICB0aGlzLmludGVydmFsID0gaW50ZXJ2YWw7CisgICAgICAgIHRoaXMucmVxdWVzdHNQZXJTZWNvbmQgPSByZXF1ZXN0c1BlclNlY29uZDsKKyAgICAgICAgdGhpcy5taW5pbXVtRHVyYXRpb24gPSBtaW5pbXVtRHVyYXRpb247CisgICAgICAgIHRoaXMubWF4aW11bUR1cmF0aW9uID0gbWF4aW11bUR1cmF0aW9uOworICAgICAgICB0aGlzLmF2ZXJhZ2VEdXJhdGlvbiA9IGF2ZXJhZ2VEdXJhdGlvbjsKKyAgICAgICAgdGhpcy50b3RhbENvdW50ID0gdG90YWxDb3VudDsKKyAgICB9CisKKyAgICBwcml2YXRlIFRpbWVXaW5kb3dTdGF0aXN0aWNzSW1wbChmaW5hbCBsb25nIGludGVydmFsLCBmaW5hbCBVbmlmb3JtVGltZVNuYXBzaG90IHNuYXBzaG90KSB7CisgICAgICAgIHRoaXMoaW50ZXJ2YWwsIHNuYXBzaG90LmdldFJhdGUoVGltZVVuaXQuU0VDT05EUyksIHNuYXBzaG90LmdldE1pbigpLCBzbmFwc2hvdC5nZXRNYXgoKSwgKGxvbmcpIHNuYXBzaG90LmdldE1lYW4oKSwKKyAgICAgICAgICAgICAgICBzbmFwc2hvdC5zaXplKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGdldFRpbWVXaW5kb3coKSB7CisgICAgICAgIHJldHVybiBpbnRlcnZhbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZG91YmxlIGdldFJlcXVlc3RzUGVyU2Vjb25kKCkgeworICAgICAgICByZXR1cm4gcmVxdWVzdHNQZXJTZWNvbmQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZ2V0TWluaW11bUR1cmF0aW9uKCkgeworICAgICAgICByZXR1cm4gbWluaW11bUR1cmF0aW9uOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGdldE1heGltdW1EdXJhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1heGltdW1EdXJhdGlvbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBnZXRSZXF1ZXN0Q291bnQoKSB7CisgICAgICAgIHJldHVybiB0b3RhbENvdW50OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUaW1lV2luZG93U3RhdGlzdGljcyBzbmFwc2hvdCgpIHsKKyAgICAgICAgLy8gVGltZVdpbmRvd1N0YXRpc3RpY3NJbXBsIGlzIGltbXV0YWJsZTsgdGhlIEJ1aWxkZXIgaXMgbXV0YWJsZQorICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBnZXRBdmVyYWdlRHVyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBhdmVyYWdlRHVyYXRpb247CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9Vbmlmb3JtVGltZVNpbXBsZVNuYXBzaG90LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL1VuaWZvcm1UaW1lU2ltcGxlU25hcHNob3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2NmMDc1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9Vbmlmb3JtVGltZVNpbXBsZVNuYXBzaG90LmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwubW9uaXRvcmluZzsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5tb25pdG9yaW5nLmNvcmUuQWJzdHJhY3RUaW1lU25hcHNob3Q7CisKKy8qKgorICogQSBzdGF0aXN0aWNhbCBzbmFwc2hvdCBvZiBhIHtAbGluayBVbmlmb3JtVGltZVNpbXBsZVNuYXBzaG90fS4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIERyb3B3aXphcmQgVGVhbQorICogQHNlZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZHJvcHdpemFyZC9tZXRyaWNzIj5odHRwczovL2dpdGh1Yi5jb20vZHJvcHdpemFyZC9tZXRyaWNzPC9hPgorICovCitjbGFzcyBVbmlmb3JtVGltZVNpbXBsZVNuYXBzaG90IGV4dGVuZHMgQWJzdHJhY3RUaW1lU25hcHNob3QgeworCisKKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgbWF4OworICAgIHByaXZhdGUgZmluYWwgbG9uZyBtaW47CisgICAgcHJpdmF0ZSBmaW5hbCBkb3VibGUgbWVhbjsKKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgY291bnQ7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIHRoZSBzbmFwc2hvdCB3aGljaCBzaW1wbHkgcmV0dXJucyB0aGUgcHJvdmlkZWQgZGF0YSBhcyBhcmd1bWVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWF4ICAgICAgICAgICAgICBUaGUgbWF4aW11bS4KKyAgICAgKiBAcGFyYW0gbWluICAgICAgICAgICAgICBUaGUgbWluaW11bS4KKyAgICAgKiBAcGFyYW0gbWVhbiAgICAgICAgICAgICBUaGUgbWVhbi4KKyAgICAgKiBAcGFyYW0gY291bnQgICAgICAgICAgICBUaGUgdG90YWwgY291bnQuCisgICAgICogQHBhcmFtIHRpbWVJbnRlcnZhbCAgICAgVGhlIHRpbWUgaW50ZXJ2YWwgb2YgdGhpcyBzbmFwc2hvdC4KKyAgICAgKiBAcGFyYW0gdGltZUludGVydmFsVW5pdCBUaGUgdGltZSBpbnRlcnZhbCB1bml0LgorICAgICAqLworICAgIHB1YmxpYyBVbmlmb3JtVGltZVNpbXBsZVNuYXBzaG90KGZpbmFsIGxvbmcgbWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGRvdWJsZSBtZWFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyB0aW1lSW50ZXJ2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVGltZVVuaXQgdGltZUludGVydmFsVW5pdCkgeworICAgICAgICBzdXBlcih0aW1lSW50ZXJ2YWwsIHRpbWVJbnRlcnZhbFVuaXQpOworICAgICAgICB0aGlzLm1heCA9IG1heDsKKyAgICAgICAgdGhpcy5taW4gPSBtaW47CisgICAgICAgIHRoaXMubWVhbiA9IG1lYW47CisgICAgICAgIHRoaXMuY291bnQgPSBjb3VudDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBzaXplKCkgeworICAgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZ2V0TWF4KCkgeworICAgICAgICByZXR1cm4gbWF4OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGdldE1pbigpIHsKKyAgICAgICAgcmV0dXJuIG1pbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZG91YmxlIGdldE1lYW4oKSB7CisgICAgICAgIHJldHVybiBtZWFuOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3JpbmcvY29yZS9BYnN0cmFjdFNsaWRpbmdXaW5kb3dUaW1lUmVzZXJ2b2lyLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL2NvcmUvQWJzdHJhY3RTbGlkaW5nV2luZG93VGltZVJlc2Vydm9pci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNzhiMTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL2NvcmUvQWJzdHJhY3RTbGlkaW5nV2luZG93VGltZVJlc2Vydm9pci5qYXZhCkBAIC0wLDAgKzEsMjU3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAxMCwgMjAxMyBDb2RhIEhhbGUgYW5kIFlhbW1lciwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5tb25pdG9yaW5nLmNvcmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnROYXZpZ2FibGVNYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudFNraXBMaXN0TWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNMb25nOworCitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5tb25pdG9yaW5nLmNvcmUuUmVzZXJ2b2lyQ29uc3RhbnRzLkNPTExJU0lPTl9CVUZGRVI7CitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5tb25pdG9yaW5nLmNvcmUuUmVzZXJ2b2lyQ29uc3RhbnRzLkNPTExJU0lPTl9CVUZGRVJfUE9XRVI7CisKKy8qKgorICogQW4gYWJzdHJhY3Qge0BsaW5rIFRpbWVSZXNlcnZvaXJ9IGltcGxlbWVudGF0aW9uIGJhY2tlZCBieSBhIHNsaWRpbmcgd2luZG93IHRoYXQgc3RvcmVzIG9ubHkgdGhlIG1lYXN1cmVtZW50cyBtYWRlIGluIHRoZSBsYXN0CisgKiB7QGNvZGUgTn0gc2Vjb25kcyAob3Igb3RoZXIgc3RhcnRUaW1lIHVuaXQpIGFuZCBhbGxvd3MgYW4gdXBkYXRlIHdpdGggZGF0YSB0aGF0IGhhcHBlbmVkIGluIHBhc3QgKHdoaWNoIGlzIHdoYXQgbWFrZXMgaXQKKyAqIGRpZmZlcmVudCBmcm9tIERyb3B3aXphcmQncyBNZXRyaWNzIFNsaWRpbmdUaW1lV2luZG93UmVzZXJ2b2lyLgorICogPHAvPgorICogVGhlIHNuYXBzaG90IHRoaXMgcmVzZXJ2b2lyIHJldHVybnMgaGFzIGxpbWl0YXRpb25zIGFzIG1lbnRpb25lZCBpbiB7QGxpbmsgVGltZVJlc2Vydm9pcn0uCisgKiA8cC8+CisgKiBUaGlzIHJlc2Vydm9pciBpcyBjYXBhYmxlIHRvIHN0b3JlIHVwIHRvIDJee0BsaW5rIFJlc2Vydm9pckNvbnN0YW50cyNDT0xMSVNJT05fQlVGRkVSX1BPV0VSfSwgdGhhdCBpcyAyNTYsIGluIGEgZ3JhbnVsYXJpdHkgb2YKKyAqIG5hbm9zZWNvbmRzLiBJbiBvdGhlciB3b3JkcywgdXAgdG8gMjU2IHZhbHVlcyB0aGF0IG9jY3VycmVkIGF0IHRoZSBzYW1lIG5hbm9zZWNvbmQgY2FuIGJlIHN0b3JlZCBpbiB0aGlzIHJlc2Vydm9pci4gRm9yCisgKiBwYXJ0aWN1bGFyIG5hbm9zZWNvbmQsIGlmIHRoZSBjb2xsaXNpb24gYnVmZmVyIGV4Y2VlZHMsIG5ld2x5IGFkZGVkIHZhbHVlcyBhcmUgdGhyb3duIGF3YXkuCisgKgorICogQHBhcmFtIDxWPiBUaGUgdHlwZSBvZiB2YWx1ZXMgdG8gc3RvcmUgaW4gdGhpcyBzbGlkaW5nIHdpbmRvdyByZXNlcnZvaXIKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqIEBzZWUgPHByZT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZHJvcHdpemFyZC9tZXRyaWNzL2Jsb2IvbWFzdGVyL21ldHJpY3MtY29yZS9zcmMvbWFpbi9qYXZhL2lvL2Ryb3B3aXphcmQvbWV0cmljcworICogL1NsaWRpbmdUaW1lV2luZG93UmVzZXJ2b2lyLmphdmEiPkRyb3B3aXphcmQncworICogTWV0cmljcyBTbGlkaW5nVGltZVdpbmRvd1Jlc2Vydm9pcjwvYT48L3ByZT4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2xpZGluZ1dpbmRvd1RpbWVSZXNlcnZvaXI8Vj4gaW1wbGVtZW50cyBUaW1lUmVzZXJ2b2lyPFY+IHsKKworICAgIHByaXZhdGUgZmluYWwgQ29uY3VycmVudE5hdmlnYWJsZU1hcDxMb25nLCBWPiBtZWFzdXJlbWVudHM7CisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIHdpbmRvdzsKKyAgICBwcml2YXRlIGZpbmFsIEF0b21pY0xvbmcgZ3JlYXRlc3RUaWNrOworICAgIHByaXZhdGUgZmluYWwgQXRvbWljTG9uZyB1cGRhdGVDb3VudDsKKyAgICBwcml2YXRlIGZpbmFsIEF0b21pY0xvbmcgc3RhcnRUaWNrOworICAgIHByaXZhdGUgZmluYWwgQXRvbWljSW50ZWdlciB0cmltT2ZmOworICAgIHByaXZhdGUgZmluYWwgU2xpZGluZ1dpbmRvd1RyaW1tZXI8Vj4gdHJpbW1lcjsKKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgaW50ZXJ2YWw7CisgICAgcHJpdmF0ZSBmaW5hbCBUaW1lVW5pdCBpbnRlcnZhbFVuaXQ7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBTbGlkaW5nV2luZG93VGltZVJlc2Vydm9pcn0gd2l0aCB0aGUgc3RhcnQgdGltZSBhbmQgd2luZG93IG9mIHN0YXJ0VGltZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3aW5kb3cgICAgICAgIFRoZSB3aW5kb3cgb2Ygc3RhcnRUaW1lCisgICAgICogQHBhcmFtIHdpbmRvd1VuaXQgICAgVGhlIHVuaXQgb2Yge0Bjb2RlIHdpbmRvd30KKyAgICAgKiBAcGFyYW0gc3RhcnRUaW1lICAgICBUaGUgc3RhcnQgdGltZSBmcm9tIHdoaWNoIHRoaXMgcmVzZXJ2b2lyIGNhbGN1bGF0ZXMgbWVhc3VyZW1lbnRzCisgICAgICogQHBhcmFtIHN0YXJ0VGltZVVuaXQgVGhlIHN0YXJ0IHRpbWUgdW5pdAorICAgICAqLworICAgIHB1YmxpYyBBYnN0cmFjdFNsaWRpbmdXaW5kb3dUaW1lUmVzZXJ2b2lyKGZpbmFsIGxvbmcgd2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFRpbWVVbml0IHdpbmRvd1VuaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVGltZVVuaXQgc3RhcnRUaW1lVW5pdCkgeworICAgICAgICB0aGlzKHdpbmRvdywgd2luZG93VW5pdCwgc3RhcnRUaW1lLCBzdGFydFRpbWVVbml0LCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGJhc2Ugc2xpZGluZyB0aW1lIHdpbmRvdyByZXNlcnZvaXIgd2l0aCB0aGUgc3RhcnQgdGltZSBhbmQgYSBzcGVjaWZpZWQgdGltZSB3aW5kb3cuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd2luZG93ICAgICAgICBUaGUgd2luZG93IG9mIHN0YXJ0VGltZS4KKyAgICAgKiBAcGFyYW0gd2luZG93VW5pdCAgICBUaGUgdW5pdCBvZiB7QGNvZGUgd2luZG93fS4KKyAgICAgKiBAcGFyYW0gc3RhcnRUaW1lICAgICBUaGUgc3RhcnQgdGltZSBmcm9tIHdoaWNoIHRoaXMgcmVzZXJ2b2lyIGNhbGN1bGF0ZXMgbWVhc3VyZW1lbnRzLgorICAgICAqIEBwYXJhbSBzdGFydFRpbWVVbml0IFRoZSBzdGFydCB0aW1lIHVuaXQuCisgICAgICogQHBhcmFtIHRyaW1tZXIgICAgICAgVGhlIHRyaW1tZXIgdG8gdXNlIGZvciB0cmltbWluZywgaWYge0Bjb2RlIG51bGx9LCBkZWZhdWx0IHRyaW1tZXIgaXMgdXNlZC4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgQWJzdHJhY3RTbGlkaW5nV2luZG93VGltZVJlc2Vydm9pcihmaW5hbCBsb25nIHdpbmRvdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUaW1lVW5pdCB3aW5kb3dVbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgc3RhcnRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFRpbWVVbml0IHN0YXJ0VGltZVVuaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU2xpZGluZ1dpbmRvd1RyaW1tZXI8Vj4gdHJpbW1lcikgeworICAgICAgICB0aGlzLnRyaW1tZXIgPSB0cmltbWVyICE9IG51bGwgPyB0cmltbWVyIDogKFNsaWRpbmdXaW5kb3dUcmltbWVyPFY+KSBEZWZhdWx0U2xpZGluZ1dpbmRvd1RyaW1tZXJIb2xkZXIuSU5TVEFOQ0U7CisgICAgICAgIHRoaXMubWVhc3VyZW1lbnRzID0gbmV3IENvbmN1cnJlbnRTa2lwTGlzdE1hcDw+KCk7CisgICAgICAgIHRoaXMuaW50ZXJ2YWwgPSB3aW5kb3c7CisgICAgICAgIHRoaXMuaW50ZXJ2YWxVbml0ID0gd2luZG93VW5pdDsKKyAgICAgICAgdGhpcy53aW5kb3cgPSB3aW5kb3dVbml0LnRvTmFub3Mod2luZG93KSA8PCBDT0xMSVNJT05fQlVGRkVSX1BPV0VSOworICAgICAgICB0aGlzLnN0YXJ0VGljayA9IG5ldyBBdG9taWNMb25nKHRpY2soc3RhcnRUaW1lLCBzdGFydFRpbWVVbml0KSk7CisgICAgICAgIHRoaXMuZ3JlYXRlc3RUaWNrID0gbmV3IEF0b21pY0xvbmcoc3RhcnRUaWNrLmdldCgpKTsKKyAgICAgICAgdGhpcy51cGRhdGVDb3VudCA9IG5ldyBBdG9taWNMb25nKDApOworICAgICAgICB0aGlzLnRyaW1PZmYgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKKworICAgICAgICB0aGlzLnRyaW1tZXIuc2V0VGltZVJlc2Vydm9pcih0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IHNpemUobG9uZyB0aW1lLCBUaW1lVW5pdCB0aW1lVW5pdCkgeworICAgICAgICBjb25kaXRpb25hbGx5VXBkYXRlR3JlYXRlc3RUaWNrKHRpY2sodGltZSwgdGltZVVuaXQpKTsKKyAgICAgICAgdHJpbSgpOworICAgICAgICByZXR1cm4gbWVhc3VyZW1lbnRzLnNpemUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGUoViB2YWx1ZSwgbG9uZyB0aW1lLCBUaW1lVW5pdCB0aW1lVW5pdCkgeworICAgICAgICBpZiAodXBkYXRlQ291bnQuaW5jcmVtZW50QW5kR2V0KCkgJSBSZXNlcnZvaXJDb25zdGFudHMuVFJJTV9USFJFU0hPTEQgPT0gMCkgeworICAgICAgICAgICAgdHJpbSgpOworICAgICAgICB9CisKKyAgICAgICAgbG9uZyB0aWNrID0gdGljayh0aW1lLCB0aW1lVW5pdCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQ09MTElTSU9OX0JVRkZFUjsgKytpKSB7CisgICAgICAgICAgICBpZiAobWVhc3VyZW1lbnRzLnB1dElmQWJzZW50KHRpY2ssIHZhbHVlKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29uZGl0aW9uYWxseVVwZGF0ZUdyZWF0ZXN0VGljayh0aWNrKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBpbmNyZWFzZSB0aGUgdGljaywgdGhlcmUgc2hvdWxkIGJlIHVwIHRvIENPTExJU0lPTl9CVUZGRVIgZW1wdHkgc2xvdHMKKyAgICAgICAgICAgIC8vIHdoZXJlIHRvIHB1dCB0aGUgdmFsdWUgZm9yIGdpdmVuICd0aW1lJworICAgICAgICAgICAgLy8gaWYgZW1wdHkgc2xvdCBpcyBub3QgZm91bmQsIHRocm93IGl0IGF3YXkgYXMgd2UncmUgZ2V0dGluZyBpbmFjY3VyYXRlIHN0YXRpc3RpY3MgYW55d2F5CisgICAgICAgICAgICB0aWNrKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBpbnRlcnZhbChmaW5hbCBUaW1lVW5pdCB0aW1lVW5pdCkgeworICAgICAgICByZXR1cm4gdGltZVVuaXQuY29udmVydChpbnRlcnZhbCwgaW50ZXJ2YWxVbml0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIGxvbmcgY29uZGl0aW9uYWxseVVwZGF0ZUdyZWF0ZXN0VGljayhmaW5hbCBsb25nIHRpY2spIHsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgY3VycmVudEdyZWF0ZXN0VGljayA9IGdyZWF0ZXN0VGljay5nZXQoKTsKKyAgICAgICAgICAgIGlmICh0aWNrIDw9IGN1cnJlbnRHcmVhdGVzdFRpY2spIHsKKyAgICAgICAgICAgICAgICAvLyB0aGUgdGljayBpcyB0b28gc21hbGwsIHJldHVybiB0aGUgZ3JlYXRlc3Qgb25lCisgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRHcmVhdGVzdFRpY2s7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZ3JlYXRlc3RUaWNrLmNvbXBhcmVBbmRTZXQoY3VycmVudEdyZWF0ZXN0VGljaywgdGljaykpIHsKKyAgICAgICAgICAgICAgICAvLyBzdWNjZXNzZnVsbHkgdXBkYXRlZCBncmVhdGVzdFRpY2sgd2l0aCB0aGUgdGljaworICAgICAgICAgICAgICAgIHJldHVybiB0aWNrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVXBkYXRlcyB0aGUgc3RhcnRUaWNrIGluIGNhc2UgdGhhdCB0aGUgc2xpZGluZyB3aW5kb3cgd2FzIGNyZWF0ZWQgQUZURVIgdGhlIHRpbWUgb2YgYSB2YWx1ZSB0aGF0IHVwZGF0ZWQgdGhpcyB3aW5kb3cuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlyc3RFbnRyeSBUaGUgZmlyc3QgZW50cnkgb2YgdGhlIHdpbmRvd2VkIG1lYXN1cm1lbnRzCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNvbmRpdGlvbmFsbHlVcGRhdGVTdGFydFRpY2soZmluYWwgTWFwLkVudHJ5PExvbmcsIFY+IGZpcnN0RW50cnkpIHsKKyAgICAgICAgZmluYWwgTG9uZyBmaXJzdEVudHJ5S2V5ID0gZmlyc3RFbnRyeSAhPSBudWxsID8gZmlyc3RFbnRyeS5nZXRLZXkoKSA6IG51bGw7CisgICAgICAgIGlmIChmaXJzdEVudHJ5S2V5ICE9IG51bGwgJiYgZmlyc3RFbnRyeUtleSA8IHN0YXJ0VGljay5nZXQoKSkgeworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGV4cGVjdGVkU3RhcnRUaWNrID0gc3RhcnRUaWNrLmdldCgpOworCisgICAgICAgICAgICAgICAgaWYgKHN0YXJ0VGljay5jb21wYXJlQW5kU2V0KGV4cGVjdGVkU3RhcnRUaWNrLCBmaXJzdEVudHJ5S2V5KSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU3ViY2xhc3NlcyBhcmUgcmVxdWlyZWQgdG8gaW5zdGFudGlhdGUge0BsaW5rIFVuaWZvcm1UaW1lU25hcHNob3R9IG9uIHRoZWlyIG93bi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YWx1ZXMgICAgICAgICAgIFRoZSB2YWx1ZXMgdG8gY3JlYXRlIHRoZSBzbmFwc2hvdCBmcm9tCisgICAgICogQHBhcmFtIHRpbWVJbnRlcnZhbCAgICAgVGhlIHRpbWUgaW50ZXJ2YWwgdGhpcyBzbmFwc2hvdCBjb25mb3JtcyB0bworICAgICAqIEBwYXJhbSB0aW1lSW50ZXJ2YWxVbml0IFRoZSBpbnRlcnZhbCB1bml0IG9mIHRoZSB0aW1lIGludGVydmFsCisgICAgICogQHBhcmFtIHRpbWUgICAgICAgICAgICAgVGhlIHRpbWUgb2YgdGhlIHJlcXVlc3Qgb2YgdGhlIHNuYXBzaG90CisgICAgICogQHBhcmFtIHRpbWVVbml0ICAgICAgICAgVGhlIHVuaXQgb2YgdGhlIHRpbWUgb2YgdGhlIHNuYXBzaG90IHJlcXVlc3QKKyAgICAgKiBAcmV0dXJuIFRoZSBzbmFwc2hvdAorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBVbmlmb3JtVGltZVNuYXBzaG90IHNuYXBzaG90KGZpbmFsIENvbGxlY3Rpb248Vj4gdmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyB0aW1lSW50ZXJ2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUaW1lVW5pdCB0aW1lSW50ZXJ2YWxVbml0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyB0aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVGltZVVuaXQgdGltZVVuaXQpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFVuaWZvcm1UaW1lU25hcHNob3QgZ2V0U25hcHNob3QobG9uZyB0aW1lLCBUaW1lVW5pdCB0aW1lVW5pdCkgeworICAgICAgICB0cmltT2ZmLmluY3JlbWVudEFuZEdldCgpOworICAgICAgICBmaW5hbCBsb25nIGJhc2VsaW5lVGljayA9IGNvbmRpdGlvbmFsbHlVcGRhdGVHcmVhdGVzdFRpY2sodGljayh0aW1lLCB0aW1lVW5pdCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gbm93LCB3aXRoIHRoZSAnYmFzZWxpbmVUaWNrJyB3ZSBjYW4gYmUgc3VyZSB0aGF0IG5vIHRyaW0gd2lsbCBiZSBwZXJmb3JtZWQKKyAgICAgICAgICAgIC8vIHdlIGp1c3QgY2Fubm90IGd1YXJhbnRlZSB0aGF0ICd0aW1lJyB3aWxsIGNvcnJlc3BvbmQgd2l0aCB0aGUgJ2Jhc2VsaW5lVGljaycgd2hpY2ggaXMgd2hhdCB0aGUgQVBJIHdhcm5zIGFib3V0CisgICAgICAgICAgICBmaW5hbCBDb25jdXJyZW50TmF2aWdhYmxlTWFwPExvbmcsIFY+IHdpbmRvd01hcCA9IG1lYXN1cmVtZW50cworICAgICAgICAgICAgICAgICAgICAuc3ViTWFwKChyb3VuZFRpY2soYmFzZWxpbmVUaWNrKSkgLSB3aW5kb3csIHRydWUsIGJhc2VsaW5lVGljaywgdHJ1ZSk7CisKKyAgICAgICAgICAgIC8vIGlmIHRoZSBmaXJzdCB1cGRhdGUgY2FtZSB3aXRoIHZhbHVlIGxvd2VyIHRoYXQgdGhlICdzdGFydFRpY2snIHdlIG5lZWQgdG8gZXh0ZW5kIHRoZSB3aW5kb3cgc2l6ZSBzbyB0aGF0IHRoZQorICAgICAgICAgICAgLy8gY2FsY3VsYXRpb24gZGVwZW5kaW5nIG9uIHRoZSBhY3R1YWwgbWVhc3VyZWQgaW50ZXJ2YWwgaXMgbm90IHVubmVjZXNzYXJ5IGJvb3N0ZWQKKyAgICAgICAgICAgIGNvbmRpdGlvbmFsbHlVcGRhdGVTdGFydFRpY2sod2luZG93TWFwLmZpcnN0RW50cnkoKSk7CisKKyAgICAgICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgYWN0dWFsIG1lYXN1cmVkIGludGVydmFsCisgICAgICAgICAgICBmaW5hbCBsb25nIG1lYXN1cmVkVGlja0ludGVydmFsID0gTWF0aC5taW4oYmFzZWxpbmVUaWNrIC0gc3RhcnRUaWNrLmdldCgpLCB3aW5kb3cpOworCisgICAgICAgICAgICByZXR1cm4gc25hcHNob3Qod2luZG93TWFwLnZhbHVlcygpLCBtZWFzdXJlZFRpY2tJbnRlcnZhbCA+PiBDT0xMSVNJT05fQlVGRkVSX1BPV0VSLAorICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdC5OQU5PU0VDT05EUywgdGltZSwgdGltZVVuaXQpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdHJpbU9mZi5kZWNyZW1lbnRBbmRHZXQoKTsKKyAgICAgICAgICAgIHRyaW0oYmFzZWxpbmVUaWNrKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgbG9uZyB0aWNrKGxvbmcgdGltZSwgVGltZVVuaXQgdGltZVVuaXQpIHsKKyAgICAgICAgcmV0dXJuIHRpbWVVbml0LnRvTmFub3ModGltZSkgPDwgQ09MTElTSU9OX0JVRkZFUl9QT1dFUjsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdHJpbSgpIHsKKyAgICAgICAgdHJpbShncmVhdGVzdFRpY2suZ2V0KCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0cmltKGZpbmFsIGxvbmcgYmFzZWxpbmVUaWNrKSB7CisgICAgICAgIGlmICh0cmltRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBmaW5hbCBsb25nIGtleSA9IHJvdW5kVGljayhiYXNlbGluZVRpY2spIC0gd2luZG93OworICAgICAgICAgICAgdHJpbW1lci50cmltKG1lYXN1cmVtZW50cywga2V5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiB0cmltRW5hYmxlZCgpIHsKKyAgICAgICAgcmV0dXJuIHRyaW1PZmYuZ2V0KCkgPT0gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgcHVycG9zZSBvZiB0aGlzIG1ldGhvZCBpcyB0byBkZWFsIHdpdGggdGhlIGZhY3QgdGhhdCBkYXRhIGZvciB0aGUgc2FtZSBuYW5vc2Vjb25kIGNhbiBiZSBkaXN0cmlidXRlZCBpbiBhbiBpbnRlcnZhbAorICAgICAqIFswLDI1NikuIEJ5IHJvdW5kaW5nIHRoZSB0aWNrLCB3ZSBnZXQgdGhlIHRpY2sgdG8gd2hpY2ggYWxsIHRoZSBvdGhlciB0aWNrcyBmcm9tIHRoZSBzYW1lIGludGVydmFsIGJlbG9uZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aWNrIFRoZSB0aWNrCisgICAgICogQHJldHVybiBUaGUgcm91bmRlZCB0aWNrCisgICAgICovCisgICAgcHJpdmF0ZSBsb25nIHJvdW5kVGljayhmaW5hbCBsb25nIHRpY2spIHsKKyAgICAgICAgLy8gdGljayAvIENPTExJU0lPTl9CVUZGRVIgKiBDT0xMSVNJT05fQlVGRkVSCisgICAgICAgIHJldHVybiB0aWNrID4+IENPTExJU0lPTl9CVUZGRVJfUE9XRVIgPDwgQ09MTElTSU9OX0JVRkZFUl9QT1dFUjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgaG9sZGVyIG9mIHRoZSBsYXp5IGxvYWRlZCBpbnN0YW5jZSBvZiB0aGUgZGVmYXVsdCB0cmltbWVyLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIERlZmF1bHRTbGlkaW5nV2luZG93VHJpbW1lckhvbGRlciB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBkZWZhdWx0IGluc3RhbmNlIG9mIHNsaWRpbmcgd2luZG93IHRyaW1tZXIuCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgZmluYWwgU2xpZGluZ1dpbmRvd1RyaW1tZXI8T2JqZWN0PiBJTlNUQU5DRSA9IG5ldyBTbGlkaW5nV2luZG93VHJpbW1lcjxPYmplY3Q+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB0cmltKGZpbmFsIENvbmN1cnJlbnROYXZpZ2FibGVNYXA8TG9uZywgT2JqZWN0PiBtYXAsIGZpbmFsIGxvbmcga2V5KSB7CisgICAgICAgICAgICAgICAgbWFwLmhlYWRNYXAoa2V5KS5jbGVhcigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldFRpbWVSZXNlcnZvaXIoZmluYWwgVGltZVJlc2Vydm9pcjxPYmplY3Q+IHJlc2Vydm9pcikgeworICAgICAgICAgICAgICAgIC8vIG5vdCB1c2VkCisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9jb3JlL0Fic3RyYWN0VGltZVNuYXBzaG90LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL2NvcmUvQWJzdHJhY3RUaW1lU25hcHNob3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjU4MjBhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9jb3JlL0Fic3RyYWN0VGltZVNuYXBzaG90LmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMTAsIDIwMTMgQ29kYSBIYWxlIGFuZCBZYW1tZXIsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5tb25pdG9yaW5nLmNvcmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworLyoqCisgKiBCYXNlIGltcGxlbWVudGF0aW9uIG9mIHtAY29kZSBVbmlmb3JtVGltZVNuYXBzaG90fS4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFRpbWVTbmFwc2hvdCBpbXBsZW1lbnRzIFVuaWZvcm1UaW1lU25hcHNob3QgeworCisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIHRpbWVJbnRlcnZhbDsKKyAgICBwcml2YXRlIGZpbmFsIFRpbWVVbml0IHRpbWVJbnRlcnZhbFVuaXQ7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciB0byBiZSB1c2VkIGJ5IHN1YmNsYXNzZXMgb3ZlcnJpZGluZyB0aGUgYmFzZSBhYnN0cmFjdCB1bmlmb3JtIHRpbWUgc25hcHNob3QgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGltZUludGVydmFsICAgICBUaGUgdGltZSBpbnRlcnZhbCBvZiB0aGlzIHNuYXBzaG90LgorICAgICAqIEBwYXJhbSB0aW1lSW50ZXJ2YWxVbml0IFRoZSB0aW1lIGludGVydmFsIHVuaXQuCisgICAgICovCisgICAgcHJvdGVjdGVkIEFic3RyYWN0VGltZVNuYXBzaG90KGZpbmFsIGxvbmcgdGltZUludGVydmFsLCBmaW5hbCBUaW1lVW5pdCB0aW1lSW50ZXJ2YWxVbml0KSB7CisgICAgICAgIHRoaXMudGltZUludGVydmFsID0gdGltZUludGVydmFsOworICAgICAgICB0aGlzLnRpbWVJbnRlcnZhbFVuaXQgPSB0aW1lSW50ZXJ2YWxVbml0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGdldFRpbWVJbnRlcnZhbChUaW1lVW5pdCB0aW1lVW5pdCkgeworICAgICAgICByZXR1cm4gdGltZVVuaXQuY29udmVydCh0aW1lSW50ZXJ2YWwsIHRpbWVJbnRlcnZhbFVuaXQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBkb3VibGUgZ2V0UmF0ZShUaW1lVW5pdCB0aW1lVW5pdCkgeworICAgICAgICBmaW5hbCBkb3VibGUgcmF0ZUluTmFub3MgPSAoZG91YmxlKSBzaXplKCkgLyBnZXRUaW1lSW50ZXJ2YWwoVGltZVVuaXQuTkFOT1NFQ09ORFMpOworICAgICAgICBmaW5hbCBsb25nIG11bHRpcGxpZXIgPSBUaW1lVW5pdC5OQU5PU0VDT05EUy5jb252ZXJ0KDEsIHRpbWVVbml0KTsKKyAgICAgICAgcmV0dXJuIHJhdGVJbk5hbm9zICogbXVsdGlwbGllcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL2NvcmUvUmVzZXJ2b2lyQ29uc3RhbnRzLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL2NvcmUvUmVzZXJ2b2lyQ29uc3RhbnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI3MDUwMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3JpbmcvY29yZS9SZXNlcnZvaXJDb25zdGFudHMuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLm1vbml0b3JpbmcuY29yZTsKKworLyoqCisgKiBUaGUgY29uc3RhbnRzIHRoYXQgZGV0ZXJtaW5lIHRoZSBiZWhhdmlvdXIgb2Ygc2xpZGluZyB3aW5kb3dzIGFuZCB0aGVpciB0cmltbWVycy4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBSZXNlcnZvaXJDb25zdGFudHMgeworCisgICAgLyoqCisgICAgICogQWxsb3cgZm9yIDJedGhhdCBtYW55IGR1cGxpY2F0ZSB0aWNrcyBiZWZvcmUgdGhyb3dpbmcgYXdheSBtZWFzdXJlbWVudHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09MTElTSU9OX0JVRkZFUl9QT1dFUiA9IDg7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2l6ZSBvZiB0aGUgY29sbGlzaW9uIGJ1ZmZlciBkZXJpdmVkIGZyb20gdGhlIGNvbGxpc2lvbiBidWZmZXIgcG93ZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09MTElTSU9OX0JVRkZFUiA9IDEgPDwgQ09MTElTSU9OX0JVRkZFUl9QT1dFUjsgLy8gMjU2CisKKyAgICAvKioKKyAgICAgKiBPbmx5IHRyaW0gb24gdXBkYXRpbmcgb25jZSBldmVyeSBOLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRSSU1fVEhSRVNIT0xEID0gMjU2OworCisgICAgcHJpdmF0ZSBSZXNlcnZvaXJDb25zdGFudHMoKSB7CisgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiSW5zdGFudGlhdGlvbiBub3QgYWxsb3dlZC4iKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL2NvcmUvU2xpZGluZ1dpbmRvd1RyaW1tZXIuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3JpbmcvY29yZS9TbGlkaW5nV2luZG93VHJpbW1lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlYjZjZjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL2NvcmUvU2xpZGluZ1dpbmRvd1RyaW1tZXIuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAxMCwgMjAxMyBDb2RhIEhhbGUgYW5kIFlhbW1lciwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLm1vbml0b3JpbmcuY29yZTsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnROYXZpZ2FibGVNYXA7CisKKy8qKgorICogVGhlIHRyaW1tZXIgb2YgYW4gYXNzb2NpYXRlZCBzbGlkaW5nIHdpbmRvdy4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU2xpZGluZ1dpbmRvd1RyaW1tZXI8Vj4geworCisgICAgLyoqCisgICAgICogVHJpbSB0aGUgbWVhc3VyZW1lbnRzIHByb3ZpZGVkIGFzIHRoZSBtYXAgZnJvbSB0aGUgaGVhZCB1cCB0byB0aGUga2V5IChub3QgaW5jbHVzaXZlKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXAgVGhlIG1hcCB0byB0cmltLgorICAgICAqIEBwYXJhbSBrZXkgVGhlIGtleSB0byB3aGljaCB0cmltIHRoZSBtYXAuCisgICAgICovCisgICAgdm9pZCB0cmltKENvbmN1cnJlbnROYXZpZ2FibGVNYXA8TG9uZywgVj4gbWFwLCBmaW5hbCBsb25nIGtleSk7CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gcmVzZXJ2b2lyIFRoZSByZXNlcnZvaXIgdGhhdCB1c2VzIHRoaXMgdHJpbW1lci4KKyAgICAgKi8KKyAgICB2b2lkIHNldFRpbWVSZXNlcnZvaXIoVGltZVJlc2Vydm9pcjxWPiByZXNlcnZvaXIpOworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9jb3JlL1RpbWVSZXNlcnZvaXIuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3JpbmcvY29yZS9UaW1lUmVzZXJ2b2lyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRkMDk0OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3JpbmcvY29yZS9UaW1lUmVzZXJ2b2lyLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMTAsIDIwMTMgQ29kYSBIYWxlIGFuZCBZYW1tZXIsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5tb25pdG9yaW5nLmNvcmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworLyoqCisgKiBBIHN0YXRpc3RpY2FsbHkgcmVwcmVzZW50YXRpdmUgcmVzZXJ2b2lyIG9mIGEgZGF0YSBzdHJlYW0gaW4gdGltZS4KKyAqIDxwLz4KKyAqIENvbXBhcmVkIHRvIERyb3B3aXphcmQgUmVzZXJ2b2lyLCB0aGlzIGludGVyZmFjZSBhZGRzIGEgcG9zc2liaWxpdHkgdG8gd29yayB3aXRoIGRhdGEgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggYSBzcGVjaWZpYworICogdGltZS4gSXQgbWF5IG5vdCBiZSBwb3NzaWJsZTsgaG93ZXZlciwgdG8gb2J0YWluIGEgc25hcHNob3Qgb3Igc2l6ZSBhdCBzb21lIG1vbWVudCBpbiBwYXN0IGR1ZSB0byBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zLgorICoKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqIEBzZWUgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2Ryb3B3aXphcmQvbWV0cmljcyI+aHR0cHM6Ly9naXRodWIuY29tL2Ryb3B3aXphcmQvbWV0cmljczwvYT4KKyAqLworcHVibGljIGludGVyZmFjZSBUaW1lUmVzZXJ2b2lyPFY+IHsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiB2YWx1ZXMgcmVjb3JkZWQgYXQgZ2l2ZW4gdGltZSBvciBuZXdlci4gSXQgbWF5IG5vdCBiZSBzdXBwb3J0ZWQgdG8gcmV0dXJuIGEgc2l6ZSBpbiBwYXN0IGR1ZSB0bworICAgICAqIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGltZSAgICAgVGhlIHRpbWUgdG8gZ2V0IHRoZSBzaXplIGZvcgorICAgICAqIEBwYXJhbSB0aW1lVW5pdCBUaW1lIHVuaXQgb2YgdGhlIHByb3ZpZGVkIHRpbWUKKyAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgdmFsdWVzIHJlY29yZGVkIGZvciBnaXZlbiB0aW1lIG9yIG5ld2VyCisgICAgICovCisgICAgaW50IHNpemUobG9uZyB0aW1lLCBUaW1lVW5pdCB0aW1lVW5pdCk7CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgbmV3IHJlY29yZGVkIHZhbHVlIHRvIHRoZSByZXNlcnZvaXIgYm91bmQgdG8gYSBnaXZlbiB0aW1lLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlICAgIGEgbmV3IHJlY29yZGVkIHZhbHVlCisgICAgICogQHBhcmFtIHRpbWUgICAgIFRoZSB0aW1lIHRoZSByZWNvcmRlZCB2YWx1ZSBvY2N1cnJlZCBhdAorICAgICAqIEBwYXJhbSB0aW1lVW5pdCBUaW1lIHVuaXQgb2YgdGhlIHByb3ZpZGVkIHRpbWUKKyAgICAgKi8KKyAgICB2b2lkIHVwZGF0ZShWIHZhbHVlLCBsb25nIHRpbWUsIFRpbWVVbml0IHRpbWVVbml0KTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzbmFwc2hvdCBvZiB0aGUgcmVzZXJ2b2lyJ3MgdmFsdWVzIGF0IGdpdmVuIHRpbWUgb3IgbmV3ZXIuIEl0IG1heSBub3QgYmUgc3VwcG9ydGVkIHRvIHJldHVybiBhIHNuYXBzaG90IGluIHBhc3QKKyAgICAgKiBkdWUgdG8gcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aW1lICAgICBUaGUgdGltZSBmb3Igd2hpY2ggdG8gZ2V0IHRoZSBzbmFwc2hvdAorICAgICAqIEBwYXJhbSB0aW1lVW5pdCBUaW1lIHVuaXQgb2YgdGhlIHByb3ZpZGVkIHRpbWUKKyAgICAgKiBAcmV0dXJuIGEgc25hcHNob3Qgb2YgdGhlIHJlc2Vydm9pcidzIHZhbHVlcyBmb3IgZ2l2ZW4gdGltZSBvciBuZXdlcgorICAgICAqLworICAgIFVuaWZvcm1UaW1lU25hcHNob3QgZ2V0U25hcHNob3QobG9uZyB0aW1lLCBUaW1lVW5pdCB0aW1lVW5pdCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGltZSBpbnRlcnZhbCB0aGlzIHJlc2Vydm9pciBzdG9yZXMgZGF0YSBvZi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aW1lVW5pdCBUaGUgdGltZSB1bml0IGluIHdoaWNoIHRvIGdldCB0aGUgaW50ZXJ2YWwKKyAgICAgKiBAcmV0dXJuIFRoZSB0aW1lIGludGVydmFsIG9mIHRoaXMgdGltZSByZXNlcnZvaXIKKyAgICAgKi8KKyAgICBsb25nIGludGVydmFsKFRpbWVVbml0IHRpbWVVbml0KTsKK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3JpbmcvY29yZS9Vbmlmb3JtVGltZVJlc2Vydm9pci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9jb3JlL1VuaWZvcm1UaW1lUmVzZXJ2b2lyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ3ZDMwZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3JpbmcvY29yZS9Vbmlmb3JtVGltZVJlc2Vydm9pci5qYXZhCkBAIC0wLDAgKzEsMTQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAxMCwgMjAxMyBDb2RhIEhhbGUgYW5kIFlhbW1lciwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLm1vbml0b3JpbmcuY29yZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkTG9jYWxSYW5kb207CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0xvbmc7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0xvbmdBcnJheTsKKworLyoqCisgKiBBIHJhbmRvbSBzYW1wbGluZyByZXNlcnZvaXIgb2YgYSBzdHJlYW0gb2Yge0Bjb2RlIGxvbmd9cy4gVXNlcyBWaXR0ZXIncyBBbGdvcml0aG0gUiB0byBwcm9kdWNlIGEgc3RhdGlzdGljYWxseSByZXByZXNlbnRhdGl2ZQorICogc2FtcGxlLgorICoKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgRHJvcHdpemFyZCBUZWFtCisgKiBAc2VlIDxhIGhyZWY9Imh0dHA6Ly93d3cuY3MudW1kLmVkdS9+c2FtaXIvNDk4L3ZpdHRlci5wZGYiPlJhbmRvbSBTYW1wbGluZyB3aXRoIGEgUmVzZXJ2b2lyPC9hPgorICogQHNlZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZHJvcHdpemFyZC9tZXRyaWNzIj5odHRwczovL2dpdGh1Yi5jb20vZHJvcHdpemFyZC9tZXRyaWNzPC9hPgorICovCitwdWJsaWMgY2xhc3MgVW5pZm9ybVRpbWVSZXNlcnZvaXIgaW1wbGVtZW50cyBUaW1lUmVzZXJ2b2lyPExvbmc+IHsKKworICAgIHByaXZhdGUgZmluYWwgbG9uZyBzdGFydFRpbWU7CisgICAgcHJpdmF0ZSBmaW5hbCBUaW1lVW5pdCBzdGFydFRpbWVVbml0OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfU0laRSA9IDEwMjQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJJVFNfUEVSX0xPTkcgPSA2MzsKKyAgICBwcml2YXRlIGZpbmFsIEF0b21pY0xvbmcgY291bnQgPSBuZXcgQXRvbWljTG9uZygpOworICAgIHByaXZhdGUgZmluYWwgQXRvbWljTG9uZ0FycmF5IHZhbHVlczsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcge0Bjb2RlIFVuaWZvcm1UaW1lUmVzZXJ2b2lyfSBpbnN0YW5jZSBvZiAxMDI0IGVsZW1lbnRzLCB3aGljaCBvZmZlcnMgYSA5OS45JSBjb25maWRlbmNlIGxldmVsCisgICAgICogd2l0aCBhIDUlIG1hcmdpbiBvZiBlcnJvciBhc3N1bWluZyBhIG5vcm1hbCBkaXN0cmlidXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RhcnRUaW1lICAgICBUaGUgc3RhcnQgdGltZQorICAgICAqIEBwYXJhbSBzdGFydFRpbWVVbml0IFRoZSBzdGFydCB0aW1lIHVuaXQKKyAgICAgKi8KKyAgICBwdWJsaWMgVW5pZm9ybVRpbWVSZXNlcnZvaXIoZmluYWwgbG9uZyBzdGFydFRpbWUsIGZpbmFsIFRpbWVVbml0IHN0YXJ0VGltZVVuaXQpIHsKKyAgICAgICAgdGhpcyhERUZBVUxUX1NJWkUsIHN0YXJ0VGltZSwgc3RhcnRUaW1lVW5pdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGNvZGUgVW5pZm9ybVRpbWVSZXNlcnZvaXJ9IGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHNpemUgICAgICAgICAgdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIGtlZXAgaW4gdGhlIHNhbXBsaW5nIHJlc2Vydm9pcgorICAgICAqIEBwYXJhbSBzdGFydFRpbWUgICAgIFRoZSBzdGFydCB0aW1lCisgICAgICogQHBhcmFtIHN0YXJ0VGltZVVuaXQgVGhlIHN0YXJ0IHRpbWUgdW5pdAorICAgICAqLworICAgIHB1YmxpYyBVbmlmb3JtVGltZVJlc2Vydm9pcihpbnQgc2l6ZSwgZmluYWwgbG9uZyBzdGFydFRpbWUsIGZpbmFsIFRpbWVVbml0IHN0YXJ0VGltZVVuaXQpIHsKKyAgICAgICAgdGhpcy5zdGFydFRpbWUgPSBzdGFydFRpbWU7CisgICAgICAgIHRoaXMuc3RhcnRUaW1lVW5pdCA9IHN0YXJ0VGltZVVuaXQ7CisgICAgICAgIHRoaXMudmFsdWVzID0gbmV3IEF0b21pY0xvbmdBcnJheShzaXplKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgdmFsdWVzLnNldChpLCAwKTsKKyAgICAgICAgfQorICAgICAgICBjb3VudC5zZXQoMCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBzaXplKGZpbmFsIGxvbmcgdGltZSwgZmluYWwgVGltZVVuaXQgdGltZVVuaXQpIHsKKyAgICAgICAgZmluYWwgbG9uZyBjID0gY291bnQuZ2V0KCk7CisgICAgICAgIGlmIChjID4gdmFsdWVzLmxlbmd0aCgpKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWVzLmxlbmd0aCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoaW50KSBjOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHVwZGF0ZShMb25nIHZhbHVlLCBmaW5hbCBsb25nIHRpbWUsIGZpbmFsIFRpbWVVbml0IHRpbWVVbml0KSB7CisgICAgICAgIGZpbmFsIGxvbmcgYyA9IGNvdW50LmluY3JlbWVudEFuZEdldCgpOworICAgICAgICBpZiAoYyA8PSB2YWx1ZXMubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgIHZhbHVlcy5zZXQoKGludCkgYyAtIDEsIHZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgciA9IG5leHRMb25nKGMpOworICAgICAgICAgICAgaWYgKHIgPCB2YWx1ZXMubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAgICB2YWx1ZXMuc2V0KChpbnQpIHIsIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIHBzZXVkby1yYW5kb20gbG9uZyB1bmlmb3JtbHkgYmV0d2VlbiAwIGFuZCBuLTEuIFN0b2xlbiBmcm9tIHtAbGluayBqYXZhLnV0aWwuUmFuZG9tI25leHRJbnQoKX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbiB0aGUgYm91bmQKKyAgICAgKiBAcmV0dXJuIGEgdmFsdWUgc2VsZWN0IHJhbmRvbWx5IGZyb20gdGhlIHJhbmdlIHtAY29kZSBbMC4ubil9LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGxvbmcgbmV4dExvbmcobG9uZyBuKSB7CisgICAgICAgIGxvbmcgYml0czsKKyAgICAgICAgbG9uZyB2YWw7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGJpdHMgPSBUaHJlYWRMb2NhbFJhbmRvbS5jdXJyZW50KCkubmV4dExvbmcoKSAmICh+KDFMIDw8IEJJVFNfUEVSX0xPTkcpKTsKKyAgICAgICAgICAgIHZhbCA9IGJpdHMgJSBuOworICAgICAgICB9IHdoaWxlIChiaXRzIC0gdmFsICsgKG4gLSAxKSA8IDBMKTsKKyAgICAgICAgcmV0dXJuIHZhbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVW5pZm9ybVRpbWVTbmFwc2hvdCBnZXRTbmFwc2hvdChmaW5hbCBsb25nIHRpbWUsIGZpbmFsIFRpbWVVbml0IHRpbWVVbml0KSB7CisgICAgICAgIGZpbmFsIGludCBzID0gc2l6ZSh0aW1lLCB0aW1lVW5pdCk7CisgICAgICAgIGZpbmFsIExpc3Q8TG9uZz4gY29weSA9IG5ldyBBcnJheUxpc3Q8PihzKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzOyBpKyspIHsKKyAgICAgICAgICAgIGNvcHkuYWRkKHZhbHVlcy5nZXQoaSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgVW5pZm9ybVRpbWVWYWx1ZXNTbmFwc2hvdChjb3B5LAorICAgICAgICAgICAgICAgIHN0YXJ0VGltZVVuaXQuY29udmVydCh0aW1lLCB0aW1lVW5pdCkgLSBzdGFydFRpbWUsCisgICAgICAgICAgICAgICAgc3RhcnRUaW1lVW5pdCkgeworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIE1ldGhvZCBzaXplIG11c3QgYmUgb3ZlcnJpZGRlbiBiZWNhdXNlIGl0IHJldHVybnMgdGhlIHZhbHVlcyBzaXplIGJ5IGRlZmF1bHQgd2hpY2ggaXMge0BsaW5rCisgICAgICAgICAgICAgKiBVbmlmb3JtVGltZVJlc2Vydm9pciNERUZBVUxUX1NJWkV9LgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIEByZXR1cm4gdG90YWwgbnVtYmVyIG9mIGRhdGEgZW50cmllcyBpbiB0aGUgcmVzZXJ2b2lyLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBsb25nIHNpemUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50LmdldCgpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGludGVydmFsKGZpbmFsIFRpbWVVbml0IHRpbWVVbml0KSB7CisgICAgICAgIC8vIFVuaWZvcm0gSW50ZXJ2YWwgcmV0dXJucyAwIGZvciBpbmZpbml0eQorICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL2NvcmUvVW5pZm9ybVRpbWVTbmFwc2hvdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9jb3JlL1VuaWZvcm1UaW1lU25hcHNob3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDU4NWY3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9jb3JlL1VuaWZvcm1UaW1lU25hcHNob3QuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKiBDb3B5cmlnaHQgMjAxMCwgMjAxMyBDb2RhIEhhbGUgYW5kIFlhbW1lciwgSW5jLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLm1vbml0b3JpbmcuY29yZTsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCisvKioKKyAqIEEgc3RhdGlzdGljYWwgc25hcHNob3Qgb2YgYSB7QGxpbmsgVW5pZm9ybVRpbWVTbmFwc2hvdH0uCisgKgorICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYSBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBEcm9wd2l6YXJkIFRlYW0KKyAqIEBzZWUgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2Ryb3B3aXphcmQvbWV0cmljcyI+aHR0cHM6Ly9naXRodWIuY29tL2Ryb3B3aXphcmQvbWV0cmljczwvYT4KKyAqLworcHVibGljIGludGVyZmFjZSBVbmlmb3JtVGltZVNuYXBzaG90IHsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiB2YWx1ZXMgaW4gdGhlIHNuYXBzaG90LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHZhbHVlcworICAgICAqLworICAgIGxvbmcgc2l6ZSgpOworCisgICAgLyoqCisgICAgICogQHJldHVybiBUaGUgbWF4aW11bSB2YWx1ZSBpbiB0aGlzIHNuYXBzaG90CisgICAgICovCisgICAgbG9uZyBnZXRNYXgoKTsKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gVGhlIG1pbmltdW0gdmFsdWUgaW4gdGhpcyBzbmFwc2hvdAorICAgICAqLworICAgIGxvbmcgZ2V0TWluKCk7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSBtZWFuIG9mIHRoZSB2YWx1ZXMgaW4gdGhpcyBzbmFwc2hvdAorICAgICAqLworICAgIGRvdWJsZSBnZXRNZWFuKCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGltZSBpbnRlcnZhbCBmb3Igd2hpY2ggdGhpcyBzbmFwc2hvdCB3YXMgY3JlYXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aW1lVW5pdCBUaGUgdGltZSB1bml0IGluIHdoaWNoIHRvIHJldHVybiB0aGUgdGltZSBpbnRlcnZhbC4KKyAgICAgKiBAcmV0dXJuIFRoZSB0aW1lIGludGVydmFsIHRoZSBzbmFwc2hvdCB3YXMgY3JlYXRlZCBhdCBmb3IgdGhlIGdpdmVuIHRpbWUgdW5pdC4KKyAgICAgKi8KKyAgICBsb25nIGdldFRpbWVJbnRlcnZhbChUaW1lVW5pdCB0aW1lVW5pdCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcmF0ZSBvZiB2YWx1ZXMgaW4gdGhpcyBzbmFwc2hvdCBmb3Igb25lIGdpdmVuIHRpbWUgdW5pdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aW1lVW5pdCBUaGUgdGltZSB1bml0IGF0IHdoaWNoIHRvIGdldCB0aGUgcmF0ZQorICAgICAqIEByZXR1cm4gVGhlIHJhdGUKKyAgICAgKi8KKyAgICBkb3VibGUgZ2V0UmF0ZShUaW1lVW5pdCB0aW1lVW5pdCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL2NvcmUvVW5pZm9ybVRpbWVWYWx1ZXNTbmFwc2hvdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9jb3JlL1VuaWZvcm1UaW1lVmFsdWVzU25hcHNob3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2FjNTM5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9jb3JlL1VuaWZvcm1UaW1lVmFsdWVzU25hcHNob3QuamF2YQpAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICogQ29weXJpZ2h0IDIwMTAsIDIwMTMgQ29kYSBIYWxlIGFuZCBZYW1tZXIsIEluYy4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5tb25pdG9yaW5nLmNvcmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5NYXRoLmZsb29yOworCisvKioKKyAqIEEgc3RhdGlzdGljYWwgc25hcHNob3Qgb2YgYSB7QGxpbmsgVW5pZm9ybVRpbWVWYWx1ZXNTbmFwc2hvdH0uCisgKgorICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYSBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBEcm9wd2l6YXJkIFRlYW0KKyAqIEBzZWUgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2Ryb3B3aXphcmQvbWV0cmljcyI+aHR0cHM6Ly9naXRodWIuY29tL2Ryb3B3aXphcmQvbWV0cmljczwvYT4KKyAqLworcHVibGljIGNsYXNzIFVuaWZvcm1UaW1lVmFsdWVzU25hcHNob3QgZXh0ZW5kcyBBYnN0cmFjdFRpbWVTbmFwc2hvdCB7CisKKyAgICBwcml2YXRlIGZpbmFsIGxvbmdbXSB2YWx1ZXM7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgc25hcHNob3Qgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlcyAgICAgICAgICAgYW4gdW5vcmRlcmVkIHNldCBvZiB2YWx1ZXMgaW4gdGhlIHJlc2Vydm9pcgorICAgICAqIEBwYXJhbSB0aW1lSW50ZXJ2YWwgICAgIFRoZSB0aW1lIGludGVydmFsIHRoaXMgc25hcHNob3QgcmVsYXRlcyB0bworICAgICAqIEBwYXJhbSB0aW1lSW50ZXJ2YWxVbml0IFRoZSB0aW1lIHVuaXQgb2YgdGhlIHRpbWUgaW50ZXJ2YWwKKyAgICAgKi8KKyAgICBwdWJsaWMgVW5pZm9ybVRpbWVWYWx1ZXNTbmFwc2hvdChDb2xsZWN0aW9uPExvbmc+IHZhbHVlcywgZmluYWwgbG9uZyB0aW1lSW50ZXJ2YWwsIGZpbmFsIFRpbWVVbml0IHRpbWVJbnRlcnZhbFVuaXQpIHsKKyAgICAgICAgc3VwZXIodGltZUludGVydmFsLCB0aW1lSW50ZXJ2YWxVbml0KTsKKyAgICAgICAgZmluYWwgT2JqZWN0W10gY29weSA9IHZhbHVlcy50b0FycmF5KCk7CisgICAgICAgIHRoaXMudmFsdWVzID0gbmV3IGxvbmdbY29weS5sZW5ndGhdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvcHkubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWVzW2ldID0gKExvbmcpIGNvcHlbaV07CisgICAgICAgIH0KKyAgICAgICAgQXJyYXlzLnNvcnQodGhpcy52YWx1ZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGF0IHRoZSBnaXZlbiBxdWFudGlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBxdWFudGlsZSBhIGdpdmVuIHF1YW50aWxlLCBpbiB7QGNvZGUgWzAuLjFdfQorICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIGluIHRoZSBkaXN0cmlidXRpb24gYXQge0Bjb2RlIHF1YW50aWxlfQorICAgICAqLworICAgIHB1YmxpYyBkb3VibGUgZ2V0VmFsdWUoZG91YmxlIHF1YW50aWxlKSB7CisgICAgICAgIGlmIChxdWFudGlsZSA8IDAuMCB8fCBxdWFudGlsZSA+IDEuMCB8fCBEb3VibGUuaXNOYU4ocXVhbnRpbGUpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKHF1YW50aWxlICsgIiBpcyBub3QgaW4gWzAuLjFdIHJhbmdlIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gMC4wOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgZG91YmxlIHBvcyA9IHF1YW50aWxlICogKHZhbHVlcy5sZW5ndGggKyAxKTsKKyAgICAgICAgZmluYWwgaW50IGluZGV4ID0gKGludCkgcG9zOworCisgICAgICAgIGlmIChpbmRleCA8IDEpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZXNbMF07CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW5kZXggPj0gdmFsdWVzLmxlbmd0aCkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlc1t2YWx1ZXMubGVuZ3RoIC0gMV07CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBkb3VibGUgbG93ZXIgPSB2YWx1ZXNbaW5kZXggLSAxXTsKKyAgICAgICAgZmluYWwgZG91YmxlIHVwcGVyID0gdmFsdWVzW2luZGV4XTsKKyAgICAgICAgcmV0dXJuIGxvd2VyICsgKHBvcyAtIGZsb29yKHBvcykpICogKHVwcGVyIC0gbG93ZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiB2YWx1ZXMgaW4gdGhlIHNuYXBzaG90LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIHZhbHVlcworICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIHNpemUoKSB7CisgICAgICAgIHJldHVybiB2YWx1ZXMubGVuZ3RoOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGVudGlyZSBzZXQgb2YgdmFsdWVzIGluIHRoZSBzbmFwc2hvdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGVudGlyZSBzZXQgb2YgdmFsdWVzCisgICAgICovCisgICAgcHVibGljIGxvbmdbXSBnZXRWYWx1ZXMoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuY29weU9mKHZhbHVlcywgdmFsdWVzLmxlbmd0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgaGlnaGVzdCB2YWx1ZSBpbiB0aGUgc25hcHNob3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBoaWdoZXN0IHZhbHVlCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZ2V0TWF4KCkgeworICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdmFsdWVzW3ZhbHVlcy5sZW5ndGggLSAxXTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBsb3dlc3QgdmFsdWUgaW4gdGhlIHNuYXBzaG90LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbG93ZXN0IHZhbHVlCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZ2V0TWluKCkgeworICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdmFsdWVzWzBdOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGFyaXRobWV0aWMgbWVhbiBvZiB0aGUgdmFsdWVzIGluIHRoZSBzbmFwc2hvdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGFyaXRobWV0aWMgbWVhbgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBkb3VibGUgZ2V0TWVhbigpIHsKKyAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBkb3VibGUgc3VtID0gMDsKKyAgICAgICAgZm9yIChsb25nIHZhbHVlIDogdmFsdWVzKSB7CisgICAgICAgICAgICBzdW0gKz0gdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1bSAvIHZhbHVlcy5sZW5ndGg7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9qbXgvQXBwbGljYXRpb25NWEJlYW5JbXBsLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL2pteC9BcHBsaWNhdGlvbk1YQmVhbkltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTRlZWRmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9qbXgvQXBwbGljYXRpb25NWEJlYW5JbXBsLmphdmEKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLm1vbml0b3Jpbmcuam14OworCitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5BcHBsaWNhdGlvbkluZm87CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuQXBwbGljYXRpb25NWEJlYW47CisKKy8qKgorICogTVhCZWFuIGltcGxlbWVudGluZyB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuQXBwbGljYXRpb25NWEJlYW59IE1YQmVhbiBpbnRlcmZhY2UuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgY2xhc3MgQXBwbGljYXRpb25NWEJlYW5JbXBsIGltcGxlbWVudHMgQXBwbGljYXRpb25NWEJlYW4geworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYXBwbGljYXRpb25OYW1lOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGFwcGxpY2F0aW9uQ2xhc3M7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IGNvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzOworICAgIHByaXZhdGUgZmluYWwgRGF0ZSBzdGFydFRpbWU7CisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8U3RyaW5nPiBwcm92aWRlcnM7CisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8U3RyaW5nPiByZWdpc3RlcmVkQ2xhc3NlczsKKyAgICBwcml2YXRlIGZpbmFsIFNldDxTdHJpbmc+IHJlZ2lzdGVyZWRJbnN0YW5jZXM7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgYXBwbGljYXRpb24gTVhCZWFuIGFuZCByZWdpc3RlciBpdCB0byB0aGUgbWJlYW4gc2VydmVyIHVzaW5nIHtAY29kZSBtQmVhbkV4cG9zZXJ9LgorICAgICAqCisgICAgICogQHBhcmFtIGFwcGxpY2F0aW9uSW5mbyBBcHBsaWNhdGlvbiBpbmZvIHdoaWNoIHNob3VsZCBiZSBleHBvc2VkLgorICAgICAqIEBwYXJhbSBtQmVhbkV4cG9zZXIgTUJlYW4gZXhwb3Nlci4KKyAgICAgKiBAcGFyYW0gcGFyZW50TmFtZSB7QGxpbmsgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lIE9iamVjdCBuYW1lfSBwcmVmaXggb2YgcGFyZW50IG1iZWFucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQXBwbGljYXRpb25NWEJlYW5JbXBsKGZpbmFsIEFwcGxpY2F0aW9uSW5mbyBhcHBsaWNhdGlvbkluZm8sIGZpbmFsIE1CZWFuRXhwb3NlciBtQmVhbkV4cG9zZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGFyZW50TmFtZSkgeworICAgICAgICB0aGlzLnByb3ZpZGVycyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgdGhpcy5yZWdpc3RlcmVkQ2xhc3NlcyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgdGhpcy5yZWdpc3RlcmVkSW5zdGFuY2VzID0gbmV3IEhhc2hTZXQ8PigpOworCisgICAgICAgIGZvciAoZmluYWwgQ2xhc3M8Pz4gcHJvdmlkZXIgOiBhcHBsaWNhdGlvbkluZm8uZ2V0UHJvdmlkZXJzKCkpIHsKKyAgICAgICAgICAgIHRoaXMucHJvdmlkZXJzLmFkZChwcm92aWRlci5nZXROYW1lKCkpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChmaW5hbCBDbGFzczw/PiByZWdpc3RlcmVkQ2xhc3MgOiBhcHBsaWNhdGlvbkluZm8uZ2V0UmVnaXN0ZXJlZENsYXNzZXMoKSkgeworICAgICAgICAgICAgdGhpcy5yZWdpc3RlcmVkQ2xhc3Nlcy5hZGQocmVnaXN0ZXJlZENsYXNzLnRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChmaW5hbCBPYmplY3QgcmVnaXN0ZXJlZEluc3RhbmNlIDogYXBwbGljYXRpb25JbmZvLmdldFJlZ2lzdGVyZWRJbnN0YW5jZXMoKSkgeworICAgICAgICAgICAgdGhpcy5yZWdpc3RlcmVkSW5zdGFuY2VzLmFkZChyZWdpc3RlcmVkSW5zdGFuY2UuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBhcHBsaWNhdGlvbkluZm8uZ2V0UmVzb3VyY2VDb25maWcoKTsKKyAgICAgICAgdGhpcy5hcHBsaWNhdGlvbk5hbWUgPSByZXNvdXJjZUNvbmZpZy5nZXRBcHBsaWNhdGlvbk5hbWUoKTsKKyAgICAgICAgdGhpcy5hcHBsaWNhdGlvbkNsYXNzID0gcmVzb3VyY2VDb25maWcuZ2V0QXBwbGljYXRpb24oKS5nZXRDbGFzcygpLmdldE5hbWUoKTsKKyAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uUHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8U3RyaW5nLCBPYmplY3Q+IGVudHJ5IDogcmVzb3VyY2VDb25maWcuZ2V0UHJvcGVydGllcygpLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgICAgICBTdHJpbmcgc3RyaW5nVmFsdWU7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHN0cmluZ1ZhbHVlID0gKHZhbHVlID09IG51bGwpID8gIltudWxsXSIgOiB2YWx1ZS50b1N0cmluZygpOworICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsgLy8gU2VlIEpFUlNFWS0yMDUzOiBTb21ldGltZXMgdG9TdHJpbmcoKSB0aHJvd3MgZXhjZXB0aW9uLi4uCisgICAgICAgICAgICAgICAgc3RyaW5nVmFsdWUgPSBMb2NhbGl6YXRpb25NZXNzYWdlcy5QUk9QRVJUWV9WQUxVRV9UT1NUUklOR19USFJPV1NfRVhDRVBUSU9OKAorICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRDbGFzcygpLmdldE5hbWUoKSwgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uZmlndXJhdGlvblByb3BlcnRpZXMucHV0KGVudHJ5LmdldEtleSgpLCBzdHJpbmdWYWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5zdGFydFRpbWUgPSBuZXcgRGF0ZShhcHBsaWNhdGlvbkluZm8uZ2V0U3RhcnRUaW1lKCkuZ2V0VGltZSgpKTsKKworICAgICAgICBtQmVhbkV4cG9zZXIucmVnaXN0ZXJNQmVhbih0aGlzLCBwYXJlbnROYW1lICsgIixnbG9iYWw9Q29uZmlndXJhdGlvbiIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXBwbGljYXRpb25OYW1lKCkgeworICAgICAgICByZXR1cm4gYXBwbGljYXRpb25OYW1lOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXBwbGljYXRpb25DbGFzcygpIHsKKyAgICAgICAgcmV0dXJuIGFwcGxpY2F0aW9uQ2xhc3M7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0UHJvcGVydGllcygpIHsKKyAgICAgICAgcmV0dXJuIGNvbmZpZ3VyYXRpb25Qcm9wZXJ0aWVzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBEYXRlIGdldFN0YXJ0VGltZSgpIHsKKyAgICAgICAgcmV0dXJuIHN0YXJ0VGltZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0UmVnaXN0ZXJlZENsYXNzZXMoKSB7CisgICAgICAgIHJldHVybiByZWdpc3RlcmVkQ2xhc3NlczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0UmVnaXN0ZXJlZEluc3RhbmNlcygpIHsKKyAgICAgICAgcmV0dXJuIHJlZ2lzdGVyZWRJbnN0YW5jZXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxTdHJpbmc+IGdldFByb3ZpZGVyQ2xhc3NlcygpIHsKKyAgICAgICAgcmV0dXJuIHByb3ZpZGVyczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL2pteC9FeGNlcHRpb25NYXBwZXJNWEJlYW5JbXBsLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL2pteC9FeGNlcHRpb25NYXBwZXJNWEJlYW5JbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJjZjgwZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3Jpbmcvam14L0V4Y2VwdGlvbk1hcHBlck1YQmVhbkltcGwuamF2YQpAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5tb25pdG9yaW5nLmpteDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5FeGNlcHRpb25NYXBwZXJNWEJlYW47CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuRXhjZXB0aW9uTWFwcGVyU3RhdGlzdGljczsKKworLyoqCisgKiBNWEJlYW4gaW1wbGVtZW50aW5nIGEge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLkV4Y2VwdGlvbk1hcHBlck1YQmVhbn0gbXhiZWFuIGludGVyZmFjZS4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBFeGNlcHRpb25NYXBwZXJNWEJlYW5JbXBsIGltcGxlbWVudHMgRXhjZXB0aW9uTWFwcGVyTVhCZWFuIHsKKyAgICBwcml2YXRlIHZvbGF0aWxlIEV4Y2VwdGlvbk1hcHBlclN0YXRpc3RpY3MgbWFwcGVyU3RhdGlzdGljczsKKyAgICBwcml2YXRlIHZvbGF0aWxlIE1hcDxTdHJpbmcsIExvbmc+IG1hcHBlckV4Y2VjdXRpb25zID0gbmV3IEhhc2hNYXA8PigpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IE1YQmVhbiBhbmQgcmVnaXN0ZXIgaXQgaW50byBtYmVhbiBzZXJ2ZXIgdXNpbmcge0Bjb2RlIG1CZWFuRXhwb3Nlcn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGVyU3RhdGlzdGljcyBFeGNlcHRpb24gbWFwcGVyIHN0YXRpc3RpY3MgdGhhdCBzaG91bGQgYmUgZXhwb3NlZC4KKyAgICAgKiBAcGFyYW0gbUJlYW5FeHBvc2VyIE1iZWFuIGV4cG9zZXIuCisgICAgICogQHBhcmFtIHBhcmVudE5hbWUgT2JqZWN0IG5hbWUgcHJlZml4IG9mIHRoZSBwYXJlbnQgbWJlYW5zLgorICAgICAqLworICAgIHB1YmxpYyBFeGNlcHRpb25NYXBwZXJNWEJlYW5JbXBsKEV4Y2VwdGlvbk1hcHBlclN0YXRpc3RpY3MgbWFwcGVyU3RhdGlzdGljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQmVhbkV4cG9zZXIgbUJlYW5FeHBvc2VyLCBTdHJpbmcgcGFyZW50TmFtZSkgeworICAgICAgICBtQmVhbkV4cG9zZXIucmVnaXN0ZXJNQmVhbih0aGlzLCBwYXJlbnROYW1lICsgIixleGNlcHRpb25zPUV4Y2VwdGlvbk1hcHBlciIpOworICAgICAgICB1cGRhdGVFeGNlcHRpb25NYXBwZXJTdGF0aXN0aWNzKG1hcHBlclN0YXRpc3RpY3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVwZGF0ZSB0aGUgTVhCZWFuIHdpdGggbmV3IHN0YXRpc3RpY3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFwcGVyU3RhdGlzdGljcyBOZXcgZXhjZXB0aW9uIG1hcHBlciBzdGF0aXN0aWNzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUV4Y2VwdGlvbk1hcHBlclN0YXRpc3RpY3MoRXhjZXB0aW9uTWFwcGVyU3RhdGlzdGljcyBtYXBwZXJTdGF0aXN0aWNzKSB7CisgICAgICAgIHRoaXMubWFwcGVyU3RhdGlzdGljcyA9IG1hcHBlclN0YXRpc3RpY3M7CisKKyAgICAgICAgZm9yIChNYXAuRW50cnk8Q2xhc3M8Pz4sIExvbmc+IGVudHJ5IDogbWFwcGVyU3RhdGlzdGljcy5nZXRFeGNlcHRpb25NYXBwZXJFeGVjdXRpb25zKCkuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgbWFwcGVyRXhjZWN1dGlvbnMucHV0KGVudHJ5LmdldEtleSgpLmdldE5hbWUoKSwgZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWFwPFN0cmluZywgTG9uZz4gZ2V0RXhjZXB0aW9uTWFwcGVyQ291bnQoKSB7CisgICAgICAgIHJldHVybiBtYXBwZXJFeGNlY3V0aW9uczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBnZXRTdWNjZXNzZnVsTWFwcGluZ3MoKSB7CisgICAgICAgIHJldHVybiBtYXBwZXJTdGF0aXN0aWNzLmdldFN1Y2Nlc3NmdWxNYXBwaW5ncygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGdldFVuc3VjY2Vzc2Z1bE1hcHBpbmdzKCkgeworICAgICAgICByZXR1cm4gbWFwcGVyU3RhdGlzdGljcy5nZXRVbnN1Y2Nlc3NmdWxNYXBwaW5ncygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGdldFRvdGFsTWFwcGluZ3MoKSB7CisgICAgICAgIHJldHVybiBtYXBwZXJTdGF0aXN0aWNzLmdldFRvdGFsTWFwcGluZ3MoKTsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9qbXgvRXhlY3V0aW9uU3RhdGlzdGljc0R5bmFtaWNCZWFuLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL2pteC9FeGVjdXRpb25TdGF0aXN0aWNzRHluYW1pY0JlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODU2MWRlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9qbXgvRXhlY3V0aW9uU3RhdGlzdGljc0R5bmFtaWNCZWFuLmphdmEKQEAgLTAsMCArMSwxOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLm1vbml0b3Jpbmcuam14OworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuQXR0cmlidXRlOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuQXR0cmlidXRlTGlzdDsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkF0dHJpYnV0ZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuRHluYW1pY01CZWFuOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuSW52YWxpZEF0dHJpYnV0ZVZhbHVlRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5BdHRyaWJ1dGVJbmZvOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5FeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbkluZm87CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5SZWZsZWN0aW9uRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLlZhbHVlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLkV4ZWN1dGlvblN0YXRpc3RpY3M7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuVGltZVdpbmRvd1N0YXRpc3RpY3M7CisKKy8qKgorICogRHluYW1pYyBNQmVhbiB0aGF0IGV4cG9zZXMgaW5mb3JtYXRpb24gYWJvdXQgZXhlY3V0aW9uIHN0YXRpc3RpY3MuIFRoZSBleHBvc2VkIGluZm9ybWF0aW9uIGNvbnRhaW5zCisgKiBleGVjdXRpb24gc3RhdGlzdGljcyBmb3IgdmFyaW91cyB0aW1lIHdpbmRvdyBzaXplcy4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBFeGVjdXRpb25TdGF0aXN0aWNzRHluYW1pY0JlYW4gaW1wbGVtZW50cyBEeW5hbWljTUJlYW4geworCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBFeGVjdXRpb25TdGF0aXN0aWNzIGV4ZWN1dGlvblN0YXRpc3RpY3M7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBWYWx1ZTxPYmplY3Q+PiBhdHRyaWJ1dGVWYWx1ZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisKKyAgICBwcml2YXRlIGZpbmFsIE1CZWFuSW5mbyBtQmVhbkluZm87CisKKyAgICBwcml2YXRlIE1CZWFuSW5mbyBpbml0TUJlYW5JbmZvKGZpbmFsIEV4ZWN1dGlvblN0YXRpc3RpY3MgaW5pdGlhbFN0YXRpc3RpY3MpIHsKKyAgICAgICAgZmluYWwgTWFwPExvbmcsIFRpbWVXaW5kb3dTdGF0aXN0aWNzPiBzdGF0c01hcCA9IGluaXRpYWxTdGF0aXN0aWNzLmdldFRpbWVXaW5kb3dTdGF0aXN0aWNzKCk7CisgICAgICAgIE1CZWFuQXR0cmlidXRlSW5mb1tdIGF0dHJzID0gbmV3IE1CZWFuQXR0cmlidXRlSW5mb1tzdGF0c01hcC5zaXplKCkgKiA1XTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBmb3IgKGZpbmFsIFRpbWVXaW5kb3dTdGF0aXN0aWNzIHN0YXRzIDogc3RhdHNNYXAudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIGZpbmFsIGxvbmcgaW50ZXJ2YWwgPSBzdGF0cy5nZXRUaW1lV2luZG93KCk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcG9zdGZpeCA9IGNvbnZlcnRJbnRlcnZhbFRvU3RyaW5nKChpbnQpIGludGVydmFsKTsKKworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSAiTWluVGltZVttc11fIiArIHBvc3RmaXg7CisgICAgICAgICAgICBhdHRyc1tpKytdID0gbmV3IE1CZWFuQXR0cmlidXRlSW5mbyhuYW1lLCAibG9uZyIsICJNaW5pbXVtIHJlcXVlc3QgcHJvY2Vzc2luZyB0aW1lIGluIG1pbGxpc2Vjb25kcyBpbiBsYXN0ICIKKyAgICAgICAgICAgICAgICAgICAgKyBwb3N0Zml4ICsgIi4iLCB0cnVlLCBmYWxzZSwgZmFsc2UpOworCisgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZXMucHV0KG5hbWUsIG5ldyBWYWx1ZTxPYmplY3Q+KCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0KCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhlY3V0aW9uU3RhdGlzdGljcy5nZXRUaW1lV2luZG93U3RhdGlzdGljcygpLmdldChpbnRlcnZhbCkuZ2V0TWluaW11bUR1cmF0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIG5hbWUgPSAiTWF4VGltZVttc11fIiArIHBvc3RmaXg7CisgICAgICAgICAgICBhdHRyc1tpKytdID0gbmV3IE1CZWFuQXR0cmlidXRlSW5mbyhuYW1lLCAibG9uZyIsICJNaW5pbXVtIHJlcXVlc3QgcHJvY2Vzc2luZyB0aW1lICBpbiBtaWxsaXNlY29uZHMgaW4gbGFzdCAiCisgICAgICAgICAgICAgICAgICAgICsgcG9zdGZpeCArICIuIiwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKKworICAgICAgICAgICAgYXR0cmlidXRlVmFsdWVzLnB1dChuYW1lLCBuZXcgVmFsdWU8T2JqZWN0PigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGdldCgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4ZWN1dGlvblN0YXRpc3RpY3MuZ2V0VGltZVdpbmRvd1N0YXRpc3RpY3MoKS5nZXQoaW50ZXJ2YWwpLmdldE1heGltdW1EdXJhdGlvbigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBuYW1lID0gIkF2ZXJhZ2VUaW1lW21zXV8iICsgcG9zdGZpeDsKKyAgICAgICAgICAgIGF0dHJzW2krK10gPSBuZXcgTUJlYW5BdHRyaWJ1dGVJbmZvKG5hbWUsICJsb25nIiwgIkF2ZXJhZ2UgcmVxdWVzdCBwcm9jZXNzaW5nIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGluIGxhc3QgIgorICAgICAgICAgICAgICAgICAgICArIHBvc3RmaXggKyAiLiIsIHRydWUsIGZhbHNlLCBmYWxzZSk7CisKKyAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlcy5wdXQobmFtZSwgbmV3IFZhbHVlPE9iamVjdD4oKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBnZXQoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBleGVjdXRpb25TdGF0aXN0aWNzLmdldFRpbWVXaW5kb3dTdGF0aXN0aWNzKCkuZ2V0KGludGVydmFsKS5nZXRBdmVyYWdlRHVyYXRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgbmFtZSA9ICJSZXF1ZXN0UmF0ZVtyZXF1ZXN0c1BlclNlY29uZHNdXyIgKyBwb3N0Zml4OworICAgICAgICAgICAgYXR0cnNbaSsrXSA9IG5ldyBNQmVhbkF0dHJpYnV0ZUluZm8obmFtZSwgImRvdWJsZSIsICJBdmVyYWdlIHJlcXVlc3RzIHBlciBzZWNvbmQgaW4gbGFzdCAiCisgICAgICAgICAgICAgICAgICAgICsgcG9zdGZpeCArICIuIiwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKKworICAgICAgICAgICAgYXR0cmlidXRlVmFsdWVzLnB1dChuYW1lLCBuZXcgVmFsdWU8T2JqZWN0PigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGdldCgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV4ZWN1dGlvblN0YXRpc3RpY3MuZ2V0VGltZVdpbmRvd1N0YXRpc3RpY3MoKS5nZXQoaW50ZXJ2YWwpLmdldFJlcXVlc3RzUGVyU2Vjb25kKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIG5hbWUgPSAiUmVxdWVzdENvdW50XyIgKyBwb3N0Zml4OworICAgICAgICAgICAgYXR0cnNbaSsrXSA9IG5ldyBNQmVhbkF0dHJpYnV0ZUluZm8obmFtZSwgImRvdWJsZSIsICJSZXF1ZXN0IGNvdW50IGluIGxhc3QgIgorICAgICAgICAgICAgICAgICAgICArIHBvc3RmaXggKyAiLiIsIHRydWUsIGZhbHNlLCBmYWxzZSk7CisKKyAgICAgICAgICAgIGF0dHJpYnV0ZVZhbHVlcy5wdXQobmFtZSwgbmV3IFZhbHVlPE9iamVjdD4oKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBnZXQoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBleGVjdXRpb25TdGF0aXN0aWNzLmdldFRpbWVXaW5kb3dTdGF0aXN0aWNzKCkuZ2V0KGludGVydmFsKS5nZXRSZXF1ZXN0Q291bnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgTUJlYW5JbmZvKHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCksICJFeGVjdXRpb24gc3RhdGlzdGljcyIsIGF0dHJzLCBudWxsLCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBjb252ZXJ0SW50ZXJ2YWxUb1N0cmluZyhpbnQgaW50ZXJ2YWwpIHsKKyAgICAgICAgaW50IGhvdXJzID0gKGludCkgaW50ZXJ2YWwgLyAzNjAwMDAwOworICAgICAgICBpbnRlcnZhbCA9IGludGVydmFsIC0gaG91cnMgKiAzNjAwMDAwOworICAgICAgICBpbnQgbWludXRlcyA9IChpbnQpIGludGVydmFsIC8gNjAwMDA7CisgICAgICAgIGludGVydmFsID0gaW50ZXJ2YWwgLSBtaW51dGVzICogNjAwMDA7CisgICAgICAgIGludCBzZWNvbmRzID0gKGludCkgaW50ZXJ2YWwgLyAxMDAwOworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGlmIChob3VycyA+IDApIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZChob3VycykuYXBwZW5kKCJoXyIpOworICAgICAgICB9CisgICAgICAgIGlmIChtaW51dGVzID4gMCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKG1pbnV0ZXMpLmFwcGVuZCgibV8iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2Vjb25kcyA+IDApIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZChzZWNvbmRzKS5hcHBlbmQoInNfIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNiLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgidG90YWwiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNiLnNldExlbmd0aChzYi5sZW5ndGgoKSAtIDEpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IE1YQmVhbiBhbmQgcmVnaXN0ZXIgaXQgaW50byB0aGUgbWJlYW4gc2VydmVyIHVzaW5nIHtAY29kZSBtQmVhbkV4cG9zZXJ9LgorICAgICAqIEBwYXJhbSBleGVjdXRpb25TdGF0aXN0aWNzIEV4ZWN1dGlvbiBzdGF0aXN0aWNzIHRvIGJlIGV4cG9zZWQuCisgICAgICogQHBhcmFtIG1CZWFuRXhwb3NlciBtYmVhbiBleHBvc2VyLgorICAgICAqIEBwYXJhbSBwYXJlbnRCZWFuTmFtZSBOYW1lIG9mIHRoZSBwYXJlbnQgbXhiZWFuLgorICAgICAqIEBwYXJhbSBiZWFuTmFtZSBBIHJlcXVpcmVkIG5hbWUgb2YgdGhpcyBleHBvc2VkIGJlYW4uCisgICAgICovCisgICAgcHVibGljIEV4ZWN1dGlvblN0YXRpc3RpY3NEeW5hbWljQmVhbihFeGVjdXRpb25TdGF0aXN0aWNzIGV4ZWN1dGlvblN0YXRpc3RpY3MsIE1CZWFuRXhwb3NlciBtQmVhbkV4cG9zZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFyZW50QmVhbk5hbWUsIFN0cmluZyBiZWFuTmFtZSkgeworICAgICAgICB0aGlzLmV4ZWN1dGlvblN0YXRpc3RpY3MgPSBleGVjdXRpb25TdGF0aXN0aWNzOworICAgICAgICB0aGlzLm1CZWFuSW5mbyA9IGluaXRNQmVhbkluZm8oZXhlY3V0aW9uU3RhdGlzdGljcyk7CisgICAgICAgIG1CZWFuRXhwb3Nlci5yZWdpc3Rlck1CZWFuKHRoaXMsIHBhcmVudEJlYW5OYW1lICsgIixleGVjdXRpb25UaW1lcz0iICsgYmVhbk5hbWUpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogVXBkYXRlIHRoZSBleGVjdXRpb24gc3RhdGlzdGljcyB0aGF0IGFyZSBleHBvc2VkIGJ5IHRoaXMgTUJlYW4uCisgICAgICogQHBhcmFtIGV4ZWN1dGlvblN0YXRpc3RpY3MgTmV3IGV4ZWN1dGlvbiBzdGF0aXN0aWNzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUV4ZWN1dGlvblN0YXRpc3RpY3MoRXhlY3V0aW9uU3RhdGlzdGljcyBleGVjdXRpb25TdGF0aXN0aWNzKSB7CisgICAgICAgIHRoaXMuZXhlY3V0aW9uU3RhdGlzdGljcyA9IGV4ZWN1dGlvblN0YXRpc3RpY3M7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZSkgdGhyb3dzIEF0dHJpYnV0ZU5vdEZvdW5kRXhjZXB0aW9uLCBNQmVhbkV4Y2VwdGlvbiwgUmVmbGVjdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZXMuZ2V0KGF0dHJpYnV0ZSkuZ2V0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlKEF0dHJpYnV0ZSBhdHRyaWJ1dGUpCisgICAgICAgICAgICB0aHJvd3MgQXR0cmlidXRlTm90Rm91bmRFeGNlcHRpb24sIEludmFsaWRBdHRyaWJ1dGVWYWx1ZUV4Y2VwdGlvbiwgTUJlYW5FeGNlcHRpb24sIFJlZmxlY3Rpb25FeGNlcHRpb24geworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBdHRyaWJ1dGVMaXN0IGdldEF0dHJpYnV0ZXMoU3RyaW5nW10gYXR0cmlidXRlcykgeworICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEF0dHJpYnV0ZUxpc3Qgc2V0QXR0cmlidXRlcyhBdHRyaWJ1dGVMaXN0IGF0dHJpYnV0ZXMpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdCBpbnZva2UoU3RyaW5nIGFjdGlvbk5hbWUsIE9iamVjdFtdIHBhcmFtcywgU3RyaW5nW10gc2lnbmF0dXJlKSB0aHJvd3MgTUJlYW5FeGNlcHRpb24sIFJlZmxlY3Rpb25FeGNlcHRpb24geworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTUJlYW5JbmZvIGdldE1CZWFuSW5mbygpIHsKKyAgICAgICAgcmV0dXJuIG1CZWFuSW5mbzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL2pteC9NQmVhbkV4cG9zZXIuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3Jpbmcvam14L01CZWFuRXhwb3Nlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMDg0OWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL2pteC9NQmVhbkV4cG9zZXIuamF2YQpAQCAtMCwwICsxLDE5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwubW9uaXRvcmluZy5qbXg7CisKK2ltcG9ydCBqYXZhLmxhbmcubWFuYWdlbWVudC5NYW5hZ2VtZW50RmFjdG9yeTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuSk1FeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuQXBwbGljYXRpb25JbmZvOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLk1vbml0b3JpbmdTdGF0aXN0aWNzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLk1vbml0b3JpbmdTdGF0aXN0aWNzTGlzdGVuZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuUmVzb3VyY2VTdGF0aXN0aWNzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQWJzdHJhY3RDb250YWluZXJMaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbnRhaW5lcjsKKworLyoqCisgKiBUaGUgbWFpbiBleHBvc2VyIGNsYXNzIG9mIEplcnNleSBKTVggTUJlYW5zLiBUaGUgY2xhc3MgY3JlYXRlcyBNQmVhbnMgYW5kIGNvbnRhaW5zIG1ldGhvZHMgdGhhdAorICogcmVnaXN0ZXIgYW5kIHVucmVnaXN0ZXIgTUJlYW5zLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIE1CZWFuRXhwb3NlciBleHRlbmRzIEFic3RyYWN0Q29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXIgaW1wbGVtZW50cyBNb25pdG9yaW5nU3RhdGlzdGljc0xpc3RlbmVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKE1CZWFuRXhwb3Nlci5jbGFzcy5nZXROYW1lKCkpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9TVUJUWVBFX0dMT0JBTCA9ICJHbG9iYWwiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfRVhFQ1VUSU9OX1RJTUVTX1JFUVVFU1RTID0gIlJlcXVlc3RUaW1lcyI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9FWEVDVVRJT05fVElNRVNfTUVUSE9EUyA9ICJNZXRob2RUaW1lcyI7CisKKyAgICAvLyBNQmVhbnMKKyAgICBwcml2YXRlIHZvbGF0aWxlIEV4ZWN1dGlvblN0YXRpc3RpY3NEeW5hbWljQmVhbiByZXF1ZXN0TUJlYW47CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBSZXNwb25zZU1YQmVhbkltcGwgcmVzcG9uc2VNWEJlYW47CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBSZXNvdXJjZXNNQmVhbkdyb3VwIHVyaVN0YXRzR3JvdXA7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBSZXNvdXJjZXNNQmVhbkdyb3VwIHJlc291cmNlQ2xhc3NTdGF0c0dyb3VwOworICAgIHByaXZhdGUgdm9sYXRpbGUgRXhjZXB0aW9uTWFwcGVyTVhCZWFuSW1wbCBleGNlcHRpb25NYXBwZXJNWEJlYW47CisgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNCb29sZWFuIGRlc3Ryb3llZCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKyAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBMT0NLID0gbmV3IE9iamVjdCgpOworCisgICAgLyoqCisgICAgICogTmFtZSBvZiBkb21haW4gdGhhdCB3aWxsIHByZWZpeCBtYmVhbnMge0BsaW5rIE9iamVjdE5hbWV9LiBUaGUgY29kZSB1c2VzIHRoaXMKKyAgICAgKiBmaWVsZCBhbHNvIGZvciBzeW5jaHJvbml6YXRpb24gcHVycG9zZXMuIElmIGRvbWFpbiBpcyB7QGNvZGUgbnVsbH0sIG5vIGJlYW4KKyAgICAgKiBoYXMgYmVlbiByZWdpc3RlcmVkIHlldC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvbGF0aWxlIFN0cmluZyBkb21haW47CisKKyAgICBASW5qZWN0CisgICAgcHJpdmF0ZSBQcm92aWRlcjxBcHBsaWNhdGlvbkluZm8+IGFwcGxpY2F0aW9uSW5mb1Byb3ZpZGVyOworCisKKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFJlc291cmNlU3RhdGlzdGljcz4gdHJhbnNmb3JtVG9TdHJpbmdLZXlzKE1hcDxDbGFzczw/PiwgUmVzb3VyY2VTdGF0aXN0aWNzPiBzdGF0cykgeworICAgICAgICBNYXA8U3RyaW5nLCBSZXNvdXJjZVN0YXRpc3RpY3M+IG5ld01hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgZm9yIChNYXAuRW50cnk8Q2xhc3M8Pz4sIFJlc291cmNlU3RhdGlzdGljcz4gZW50cnkgOiBzdGF0cy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBuZXdNYXAucHV0KGVudHJ5LmdldEtleSgpLmdldE5hbWUoKSwgZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ld01hcDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IHRoZSByZXNvdXJjZSBuYW1lIHRvIGEgdmFsaWQge0BsaW5rIGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0TmFtZSBvYmplY3QgbmFtZX0uCisgICAgICogQHBhcmFtIG5hbWUgUmVzb3VyY2UgbmFtZS4KKyAgICAgKiBAcGFyYW0gaXNVcmkge0Bjb2RlIHRydWV9IGlmIHRoZSByZXNvdXJjZSBuYW1lIGlzIGFuIFVSSS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQ29udmVydGVkIHZhbGlkIG9iamVjdCBuYW1lLgorICAgICAqLworICAgIHN0YXRpYyBTdHJpbmcgY29udmVydFRvT2JqZWN0TmFtZShTdHJpbmcgbmFtZSwgYm9vbGVhbiBpc1VyaSkgeworICAgICAgICBpZiAoIWlzVXJpKSB7CisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBzdHIgPSBuYW1lLnJlcGxhY2UoIlxcIiwgIlxcXFwiKTsKKyAgICAgICAgc3RyID0gc3RyLnJlcGxhY2UoIj8iLCAiXFw/Iik7CisgICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKCIqIiwgIlxcKiIpOworCisgICAgICAgIHJldHVybiAiXCIiICsgc3RyICsgIlwiIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciB0aGUgTUJlYW4gd2l0aCB0aGUgZ2l2ZW4gcG9zdGZpeCBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIG1iZWFuIE1CZWFuIHRvIGJlIHJlZ2lzdGVyZWQuCisgICAgICogQHBhcmFtIG5hbWVQb3N0Zml4IFBvc3RmaXggb2YgdGhlIG9iamVjdCBuYW1lIGluIHRoZSBwYXR0ZXJuICIsW3Byb3BlcnR5XT1bdmFsdWVdLi4uIi4gRXhhbXBsZQorICAgICAqICAgICAgICAgICAgICAgICAgICAiLHN1YlR5cGU9UmVxdWVzdHMsZGV0YWlscz1FeGVjdXRpb24iCisgICAgICovCisgICAgdm9pZCByZWdpc3Rlck1CZWFuKE9iamVjdCBtYmVhbiwgU3RyaW5nIG5hbWVQb3N0Zml4KSB7CisgICAgICAgIGZpbmFsIE1CZWFuU2VydmVyIG1CZWFuU2VydmVyID0gTWFuYWdlbWVudEZhY3RvcnkuZ2V0UGxhdGZvcm1NQmVhblNlcnZlcigpOworICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IGRvbWFpbiArIG5hbWVQb3N0Zml4OworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3luY2hyb25pemVkIChMT0NLKSB7CisgICAgICAgICAgICAgICAgaWYgKGRlc3Ryb3llZC5nZXQoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IGRlc3Ryb3llZAorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdE5hbWUgb2JqZWN0TmFtZSA9IG5ldyBPYmplY3ROYW1lKG5hbWUpOworICAgICAgICAgICAgICAgIGlmIChtQmVhblNlcnZlci5pc1JlZ2lzdGVyZWQob2JqZWN0TmFtZSkpIHsKKworICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxpemF0aW9uTWVzc2FnZXMuV0FSTklOR19NT05JVE9SSU5HX01CRUFOU19CRUFOX0FMUkVBRFlfUkVHSVNURVJFRChvYmplY3ROYW1lKSk7CisgICAgICAgICAgICAgICAgICAgIG1CZWFuU2VydmVyLnVucmVnaXN0ZXJNQmVhbihvYmplY3ROYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUJlYW5TZXJ2ZXIucmVnaXN0ZXJNQmVhbihtYmVhbiwgb2JqZWN0TmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKEpNRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX01PTklUT1JJTkdfTUJFQU5TX1JFR0lTVFJBVElPTihuYW1lKSwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdW5yZWdpc3RlckplcnNleU1CZWFucyhib29sZWFuIGRlc3Ryb3kpIHsKKyAgICAgICAgZmluYWwgTUJlYW5TZXJ2ZXIgbUJlYW5TZXJ2ZXIgPSBNYW5hZ2VtZW50RmFjdG9yeS5nZXRQbGF0Zm9ybU1CZWFuU2VydmVyKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKExPQ0spIHsKKyAgICAgICAgICAgICAgICBpZiAoZGVzdHJveSkgeworICAgICAgICAgICAgICAgICAgICBkZXN0cm95ZWQuc2V0KHRydWUpOyAvLyBkbyBub3QgcmVnaXN0ZXIgbmV3IGJlYW5zIHNpbmNlIG5vdworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChkb21haW4gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBObyBiZWFuIGhhcyBiZWVuIHJlZ2lzdGVyZWQgeWV0LgorICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsIFNldDxPYmplY3ROYW1lPiBuYW1lcyA9IG1CZWFuU2VydmVyLnF1ZXJ5TmFtZXMobmV3IE9iamVjdE5hbWUoZG9tYWluICsgIiwqIiksIG51bGwpOworICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0TmFtZSBuYW1lIDogbmFtZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgbUJlYW5TZXJ2ZXIudW5yZWdpc3Rlck1CZWFuKG5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX01PTklUT1JJTkdfTUJFQU5TX1VOUkVHSVNUUkFUSU9OX0RFU1RST1koKSwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblN0YXRpc3RpY3MoTW9uaXRvcmluZ1N0YXRpc3RpY3Mgc3RhdGlzdGljcykgeworICAgICAgICBpZiAoZG9tYWluID09IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBnbG9iYWxTdWJUeXBlID0gIixzdWJUeXBlPSIgKyBQUk9QRVJUWV9TVUJUWVBFX0dMT0JBTDsKKworICAgICAgICAgICAgZmluYWwgQXBwbGljYXRpb25JbmZvIGFwcFN0YXRzID0gYXBwbGljYXRpb25JbmZvUHJvdmlkZXIuZ2V0KCk7CisgICAgICAgICAgICBTdHJpbmcgYXBwTmFtZSA9IGFwcFN0YXRzLmdldFJlc291cmNlQ29uZmlnKCkuZ2V0QXBwbGljYXRpb25OYW1lKCk7CisgICAgICAgICAgICBpZiAoYXBwTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgYXBwTmFtZSA9ICJBcHBfIiArIEludGVnZXIudG9IZXhTdHJpbmcoYXBwU3RhdHMuZ2V0UmVzb3VyY2VDb25maWcoKS5oYXNoQ29kZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRvbWFpbiA9ICJvcmcuZ2xhc3NmaXNoLmplcnNleTp0eXBlPSIgKyBhcHBOYW1lOworICAgICAgICAgICAgdW5yZWdpc3RlckplcnNleU1CZWFucyhmYWxzZSk7CisKKyAgICAgICAgICAgIHVyaVN0YXRzR3JvdXAgPSBuZXcgUmVzb3VyY2VzTUJlYW5Hcm91cChzdGF0aXN0aWNzLmdldFVyaVN0YXRpc3RpY3MoKSwgdHJ1ZSwgdGhpcywgIixzdWJUeXBlPVVyaXMiKTsKKyAgICAgICAgICAgIE1hcDxTdHJpbmcsIFJlc291cmNlU3RhdGlzdGljcz4gbmV3TWFwID0gdHJhbnNmb3JtVG9TdHJpbmdLZXlzKHN0YXRpc3RpY3MuZ2V0UmVzb3VyY2VDbGFzc1N0YXRpc3RpY3MoKSk7CisKKyAgICAgICAgICAgIHJlc291cmNlQ2xhc3NTdGF0c0dyb3VwID0gbmV3IFJlc291cmNlc01CZWFuR3JvdXAobmV3TWFwLCBmYWxzZSwgdGhpcywgIixzdWJUeXBlPVJlc291cmNlcyIpOworCisgICAgICAgICAgICByZXNwb25zZU1YQmVhbiA9IG5ldyBSZXNwb25zZU1YQmVhbkltcGwoKTsKKyAgICAgICAgICAgIHJlZ2lzdGVyTUJlYW4ocmVzcG9uc2VNWEJlYW4sIGdsb2JhbFN1YlR5cGUgKyAiLGdsb2JhbD1SZXNwb25zZXMiKTsKKworICAgICAgICAgICAgcmVxdWVzdE1CZWFuID0gbmV3IEV4ZWN1dGlvblN0YXRpc3RpY3NEeW5hbWljQmVhbihzdGF0aXN0aWNzLmdldFJlcXVlc3RTdGF0aXN0aWNzKCksCisgICAgICAgICAgICAgICAgICAgIHRoaXMsIGdsb2JhbFN1YlR5cGUsICJBbGxSZXF1ZXN0VGltZXMiKTsKKworICAgICAgICAgICAgZXhjZXB0aW9uTWFwcGVyTVhCZWFuID0gbmV3IEV4Y2VwdGlvbk1hcHBlck1YQmVhbkltcGwoc3RhdGlzdGljcy5nZXRFeGNlcHRpb25NYXBwZXJTdGF0aXN0aWNzKCksIHRoaXMsCisgICAgICAgICAgICAgICAgICAgIGdsb2JhbFN1YlR5cGUpOworCisgICAgICAgICAgICBuZXcgQXBwbGljYXRpb25NWEJlYW5JbXBsKGFwcFN0YXRzLCB0aGlzLCBnbG9iYWxTdWJUeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlcXVlc3RNQmVhbi51cGRhdGVFeGVjdXRpb25TdGF0aXN0aWNzKHN0YXRpc3RpY3MuZ2V0UmVxdWVzdFN0YXRpc3RpY3MoKSk7CisgICAgICAgIHVyaVN0YXRzR3JvdXAudXBkYXRlUmVzb3VyY2VzU3RhdGlzdGljcyhzdGF0aXN0aWNzLmdldFVyaVN0YXRpc3RpY3MoKSk7CisgICAgICAgIHJlc3BvbnNlTVhCZWFuLnVwZGF0ZVJlc3BvbnNlU3RhdGlzdGljcyhzdGF0aXN0aWNzLmdldFJlc3BvbnNlU3RhdGlzdGljcygpKTsKKyAgICAgICAgZXhjZXB0aW9uTWFwcGVyTVhCZWFuLnVwZGF0ZUV4Y2VwdGlvbk1hcHBlclN0YXRpc3RpY3Moc3RhdGlzdGljcy5nZXRFeGNlcHRpb25NYXBwZXJTdGF0aXN0aWNzKCkpOworICAgICAgICB0aGlzLnJlc291cmNlQ2xhc3NTdGF0c0dyb3VwLnVwZGF0ZVJlc291cmNlc1N0YXRpc3RpY3ModHJhbnNmb3JtVG9TdHJpbmdLZXlzKHN0YXRpc3RpY3MuZ2V0UmVzb3VyY2VDbGFzc1N0YXRpc3RpY3MoKSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU2h1dGRvd24oQ29udGFpbmVyIGNvbnRhaW5lcikgeworICAgICAgICB1bnJlZ2lzdGVySmVyc2V5TUJlYW5zKHRydWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3Jpbmcvam14L1Jlc291cmNlTWV0aG9kTVhCZWFuSW1wbC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9qbXgvUmVzb3VyY2VNZXRob2RNWEJlYW5JbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM5M2NlZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3Jpbmcvam14L1Jlc291cmNlTWV0aG9kTVhCZWFuSW1wbC5qYXZhCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5tb25pdG9yaW5nLmpteDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuTWVkaWFUeXBlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNZXRob2Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuUmVzb3VyY2VNZXRob2RNWEJlYW47CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuUmVzb3VyY2VNZXRob2RTdGF0aXN0aWNzOworCisvKioKKyAqIE1YQmVhbiBpbXBsZW1lbnRpbmcgdGhlIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5SZXNvdXJjZU1ldGhvZE1YQmVhbn0gTVhCZWFuIGludGVyZmFjZS4KKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIFJlc291cmNlTWV0aG9kTVhCZWFuSW1wbCBpbXBsZW1lbnRzIFJlc291cmNlTWV0aG9kTVhCZWFuIHsKKyAgICBwcml2YXRlIHZvbGF0aWxlIEV4ZWN1dGlvblN0YXRpc3RpY3NEeW5hbWljQmVhbiBtZXRob2RFeGVjdXRpb25TdGF0aXN0aWNzTXhCZWFuOworICAgIHByaXZhdGUgdm9sYXRpbGUgRXhlY3V0aW9uU3RhdGlzdGljc0R5bmFtaWNCZWFuIHJlcXVlc3RFeGVjdXRpb25TdGF0aXN0aWNzTXhCZWFuOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHBhdGg7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKyAgICBwcml2YXRlIGZpbmFsIFJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1ldGhvZEJlYW5OYW1lOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IE1YQmVhbiBhbmQgZXhwb3NlIGl0IGludG8gbWJlYW4gc2VydmVyIHVzaW5nIHtAY29kZSBtQmVhbkV4cG9zZXJ9LgorICAgICAqCisgICAgICogQHBhcmFtIG1ldGhvZFN0YXRpc3RpY3MgU3RhdGlzdGljcyB0byBiZSBleHBvc2VkIGJ5IHRoZSBNWEJlYW4uCisgICAgICogQHBhcmFtIHVyaVJlc291cmNlIHtAY29kZSB0cnVlfSBpZiB0aGUgZW5jbG9zaW5nIHJlc291cmNlIGlzIGlkZW50aWZpZWQgYnkgVVJJIChhbmQgbm90IGJ5IGphdmEKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MgbmFtZSBmb3IgZXhhbXBsZSkuCisgICAgICogQHBhcmFtIG1CZWFuRXhwb3NlciBNQmVhbiBleHBvc2VyLgorICAgICAqIEBwYXJhbSBwYXJlbnROYW1lIE5hbWUgb2YgdGhlIHBhcmVudCBiZWFuLgorICAgICAqIEBwYXJhbSBtZXRob2RVbmlxdWVJZCBtZXRob2QgdW5pcXVlIGlkZW50aWZpZXIgaW4gdGhlIGVuY2xvc2luZyByZXNvdXJjZQorICAgICAqLworICAgIHB1YmxpYyBSZXNvdXJjZU1ldGhvZE1YQmVhbkltcGwoUmVzb3VyY2VNZXRob2RTdGF0aXN0aWNzIG1ldGhvZFN0YXRpc3RpY3MsIGJvb2xlYW4gdXJpUmVzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQmVhbkV4cG9zZXIgbUJlYW5FeHBvc2VyLCBTdHJpbmcgcGFyZW50TmFtZSwgU3RyaW5nIG1ldGhvZFVuaXF1ZUlkKSB7CisKKyAgICAgICAgLy8gaW5pdCBtYmVhbiBuYW1lCisgICAgICAgIHRoaXMucmVzb3VyY2VNZXRob2QgPSBtZXRob2RTdGF0aXN0aWNzLmdldFJlc291cmNlTWV0aG9kKCk7CisgICAgICAgIGZpbmFsIENsYXNzPD8+IGhhbmRsZXJDbGFzcyA9IHJlc291cmNlTWV0aG9kLmdldEludm9jYWJsZSgpLmdldEhhbmRsZXIoKS5nZXRIYW5kbGVyQ2xhc3MoKTsKKyAgICAgICAgZmluYWwgQ2xhc3M8Pz5bXSBwYXJhbVR5cGVzID0gcmVzb3VyY2VNZXRob2QuZ2V0SW52b2NhYmxlKCkuZ2V0SGFuZGxpbmdNZXRob2QoKS5nZXRQYXJhbWV0ZXJUeXBlcygpOworICAgICAgICB0aGlzLm5hbWUgPSByZXNvdXJjZU1ldGhvZC5nZXRJbnZvY2FibGUoKS5nZXRIYW5kbGluZ01ldGhvZCgpLmdldE5hbWUoKTsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBwYXJhbXMgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBmb3IgKENsYXNzPD8+IHR5cGUgOiBwYXJhbVR5cGVzKSB7CisgICAgICAgICAgICBwYXJhbXMuYXBwZW5kKHR5cGUuZ2V0U2ltcGxlTmFtZSgpKS5hcHBlbmQoIjsiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgcGFyYW1zLnNldExlbmd0aChwYXJhbXMubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh1cmlSZXNvdXJjZSkgeworICAgICAgICAgICAgcGF0aCA9ICJOL0EiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcGF0aCA9IHJlc291cmNlTWV0aG9kLmdldFBhcmVudCgpLmdldFBhcmVudCgpID09IG51bGwgPyAiIiA6IHJlc291cmNlTWV0aG9kLmdldFBhcmVudCgpLmdldFBhdGgoKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFN0cmluZyBoYXNoID0gSW50ZWdlci50b0hleFN0cmluZyhtZXRob2RVbmlxdWVJZC5oYXNoQ29kZSgpKTsKKworICAgICAgICBTdHJpbmcgYmVhbk5hbWUgPSByZXNvdXJjZU1ldGhvZC5nZXRIdHRwTWV0aG9kKCkgKyAiLT4iOworICAgICAgICBpZiAodXJpUmVzb3VyY2UpIHsKKyAgICAgICAgICAgIGJlYW5OYW1lICs9IGhhbmRsZXJDbGFzcy5nZXRTaW1wbGVOYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiLiIgKyBuYW1lICsgIigiICsgcGFyYW1zLnRvU3RyaW5nKCkgKyAiKSMiICsgaGFzaDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJlYW5OYW1lICs9IG5hbWUgKyAiKCIgKyBwYXJhbXMudG9TdHJpbmcoKSArICIpIyIKKyAgICAgICAgICAgICAgICAgICAgKyBoYXNoOworICAgICAgICB9CisgICAgICAgIHRoaXMubWV0aG9kQmVhbk5hbWUgPSBwYXJlbnROYW1lICsgIixkZXRhaWw9bWV0aG9kcyxtZXRob2Q9IiArIGJlYW5OYW1lOworCisKKyAgICAgICAgLy8gcmVnaXN0ZXIgbWJlYW4KKyAgICAgICAgbUJlYW5FeHBvc2VyLnJlZ2lzdGVyTUJlYW4odGhpcywgbWV0aG9kQmVhbk5hbWUpOworICAgICAgICBtZXRob2RFeGVjdXRpb25TdGF0aXN0aWNzTXhCZWFuID0gbmV3IEV4ZWN1dGlvblN0YXRpc3RpY3NEeW5hbWljQmVhbihtZXRob2RTdGF0aXN0aWNzLmdldE1ldGhvZFN0YXRpc3RpY3MoKSwKKyAgICAgICAgICAgICAgICBtQmVhbkV4cG9zZXIsIG1ldGhvZEJlYW5OYW1lLCBNQmVhbkV4cG9zZXIuUFJPUEVSVFlfRVhFQ1VUSU9OX1RJTUVTX01FVEhPRFMpOworICAgICAgICByZXF1ZXN0RXhlY3V0aW9uU3RhdGlzdGljc014QmVhbiA9IG5ldyBFeGVjdXRpb25TdGF0aXN0aWNzRHluYW1pY0JlYW4obWV0aG9kU3RhdGlzdGljcy5nZXRSZXF1ZXN0U3RhdGlzdGljcygpLAorICAgICAgICAgICAgICAgIG1CZWFuRXhwb3NlciwgbWV0aG9kQmVhbk5hbWUsIE1CZWFuRXhwb3Nlci5QUk9QRVJUWV9FWEVDVVRJT05fVElNRVNfUkVRVUVTVFMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVwZGF0ZSB0aGUgc3RhdGlzdGljcyB0aGF0IGFyZSBleHBvc2VkIGJ5IHRoaXMgTVhCZWFuLgorICAgICAqIEBwYXJhbSByZXNvdXJjZU1ldGhvZFN0YXRpc3RpY3NJbXBsIE5ldyBzdGF0aXN0aWNzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVJlc291cmNlTWV0aG9kU3RhdGlzdGljcyhSZXNvdXJjZU1ldGhvZFN0YXRpc3RpY3MgcmVzb3VyY2VNZXRob2RTdGF0aXN0aWNzSW1wbCkgeworICAgICAgICB0aGlzLm1ldGhvZEV4ZWN1dGlvblN0YXRpc3RpY3NNeEJlYW4udXBkYXRlRXhlY3V0aW9uU3RhdGlzdGljcyhyZXNvdXJjZU1ldGhvZFN0YXRpc3RpY3NJbXBsLmdldE1ldGhvZFN0YXRpc3RpY3MoKSk7CisgICAgICAgIHRoaXMucmVxdWVzdEV4ZWN1dGlvblN0YXRpc3RpY3NNeEJlYW4udXBkYXRlRXhlY3V0aW9uU3RhdGlzdGljcyhyZXNvdXJjZU1ldGhvZFN0YXRpc3RpY3NJbXBsLmdldFJlcXVlc3RTdGF0aXN0aWNzKCkpOworICAgIH0KKworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgeworICAgICAgICByZXR1cm4gcGF0aDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldEh0dHBNZXRob2QoKSB7CisgICAgICAgIHJldHVybiByZXNvdXJjZU1ldGhvZC5nZXRIdHRwTWV0aG9kKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXREZWNsYXJpbmdDbGFzc05hbWUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnJlc291cmNlTWV0aG9kLmdldEludm9jYWJsZSgpLmdldEhhbmRsaW5nTWV0aG9kKCkuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXROYW1lKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRDb25zdW1lc01lZGlhVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIE1lZGlhVHlwZXMuY29udmVydFRvU3RyaW5nKHJlc291cmNlTWV0aG9kLmdldENvbnN1bWVkVHlwZXMoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRQcm9kdWNlc01lZGlhVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIE1lZGlhVHlwZXMuY29udmVydFRvU3RyaW5nKHJlc291cmNlTWV0aG9kLmdldFByb2R1Y2VkVHlwZXMoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL2pteC9SZXNvdXJjZU14QmVhbkltcGwuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3Jpbmcvam14L1Jlc291cmNlTXhCZWFuSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNzEzMGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL2pteC9SZXNvdXJjZU14QmVhbkltcGwuamF2YQpAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwubW9uaXRvcmluZy5qbXg7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLm1vbml0b3JpbmcuTW9uaXRvcmluZ1V0aWxzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1ldGhvZDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5SZXNvdXJjZU1YQmVhbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5SZXNvdXJjZU1ldGhvZFN0YXRpc3RpY3M7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuUmVzb3VyY2VTdGF0aXN0aWNzOworCisvKioKKyAqIE1YQmVhbiBpbXBsZW1lbnRpbmcgdGhlIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5SZXNvdXJjZU1ldGhvZE1YQmVhbn0gTVhCZWFuIGludGVyZmFjZS4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNvdXJjZU14QmVhbkltcGwgaW1wbGVtZW50cyBSZXNvdXJjZU1YQmVhbiB7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKyAgICBwcml2YXRlIHZvbGF0aWxlIEV4ZWN1dGlvblN0YXRpc3RpY3NEeW5hbWljQmVhbiBtZXRob2RzRXhlY3V0aW9uU3RhdGlzdGljc0JlYW47CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBFeGVjdXRpb25TdGF0aXN0aWNzRHluYW1pY0JlYW4gcmVxdWVzdEV4ZWN1dGlvblN0YXRpc3RpY3NCZWFuOworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgUmVzb3VyY2VNZXRob2RNWEJlYW5JbXBsPiByZXNvdXJjZU1ldGhvZHMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcmVzb3VyY2VQcm9wZXJ0eU5hbWU7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHVyaVJlc291cmNlOworICAgIHByaXZhdGUgZmluYWwgTUJlYW5FeHBvc2VyIG1CZWFuRXhwb3NlcjsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbmQgcmVnaXN0ZXIgbmV3IE1YQmVhbiBpbnRvIHRoZSBtYmVhbiBzZXJ2ZXIgdXNpbmcgdGhlIHtAY29kZSBtQmVhbkV4cG9zZXJ9LgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlU3RhdGlzdGljcyByZXNvdXJjZSBzdGF0aXN0aWNzIHRoYXQgc2hvdWxkIGJlIGV4cG9zZWQgYnkgdGhpcyBhbmQgbmVzdGVkIE1YQmVhbnMuCisgICAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgcmVzb3VyY2UuCisgICAgICogQHBhcmFtIHVyaVJlc291cmNlIHtAY29kZSB0cnVlfSBpZiB0aGUgcmVzb3VyY2UgaXMgaWRlbnRpZmllZCBieSBVUkkgKGFuZCBub3QgYnkgamF2YSBjbGFzcyBuYW1lIGZvciBleGFtcGxlKS4KKyAgICAgKiBAcGFyYW0gbUJlYW5FeHBvc2VyIE1CZWFuIGV4cG9zZXIuCisgICAgICogQHBhcmFtIHBhcmVudE5hbWUgTmFtZSBvZiB0aGUgcGFyZW50IGJlYW4uCisgICAgICovCisgICAgcHVibGljIFJlc291cmNlTXhCZWFuSW1wbChSZXNvdXJjZVN0YXRpc3RpY3MgcmVzb3VyY2VTdGF0aXN0aWNzLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiB1cmlSZXNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1CZWFuRXhwb3NlciBtQmVhbkV4cG9zZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFyZW50TmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLnVyaVJlc291cmNlID0gdXJpUmVzb3VyY2U7CisgICAgICAgIHRoaXMubUJlYW5FeHBvc2VyID0gbUJlYW5FeHBvc2VyOworICAgICAgICB0aGlzLnJlc291cmNlUHJvcGVydHlOYW1lID0gcGFyZW50TmFtZSArICIscmVzb3VyY2U9IiArIE1CZWFuRXhwb3Nlci5jb252ZXJ0VG9PYmplY3ROYW1lKG5hbWUsIHVyaVJlc291cmNlKTsKKyAgICAgICAgbUJlYW5FeHBvc2VyLnJlZ2lzdGVyTUJlYW4odGhpcywgcmVzb3VyY2VQcm9wZXJ0eU5hbWUpOworICAgICAgICB0aGlzLm1ldGhvZHNFeGVjdXRpb25TdGF0aXN0aWNzQmVhbiA9IG5ldyBFeGVjdXRpb25TdGF0aXN0aWNzRHluYW1pY0JlYW4oCisgICAgICAgICAgICAgICAgcmVzb3VyY2VTdGF0aXN0aWNzLmdldFJlc291cmNlTWV0aG9kRXhlY3V0aW9uU3RhdGlzdGljcygpLCBtQmVhbkV4cG9zZXIsIHJlc291cmNlUHJvcGVydHlOYW1lLAorICAgICAgICAgICAgICAgIE1CZWFuRXhwb3Nlci5QUk9QRVJUWV9FWEVDVVRJT05fVElNRVNfTUVUSE9EUyk7CisgICAgICAgIHRoaXMucmVxdWVzdEV4ZWN1dGlvblN0YXRpc3RpY3NCZWFuID0gbmV3IEV4ZWN1dGlvblN0YXRpc3RpY3NEeW5hbWljQmVhbigKKyAgICAgICAgICAgICAgICByZXNvdXJjZVN0YXRpc3RpY3MuZ2V0UmVxdWVzdEV4ZWN1dGlvblN0YXRpc3RpY3MoKSwgbUJlYW5FeHBvc2VyLCByZXNvdXJjZVByb3BlcnR5TmFtZSwKKyAgICAgICAgICAgICAgICBNQmVhbkV4cG9zZXIuUFJPUEVSVFlfRVhFQ1VUSU9OX1RJTUVTX1JFUVVFU1RTKTsKKworICAgICAgICB1cGRhdGVSZXNvdXJjZVN0YXRpc3RpY3MocmVzb3VyY2VTdGF0aXN0aWNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGUgdGhlIHN0YXRpc3RpY3Mgb2YgdGhpcyBNWEJlYW4gYW5kIG9mIG5lc3RlZCBNWEJlYW5zLgorICAgICAqIEBwYXJhbSByZXNvdXJjZVN0YXRpc3RpY3MgTmV3IHJlc291cmNlIHN0YXRpc3RpY3MuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdXBkYXRlUmVzb3VyY2VTdGF0aXN0aWNzKFJlc291cmNlU3RhdGlzdGljcyByZXNvdXJjZVN0YXRpc3RpY3MpIHsKKyAgICAgICAgdGhpcy5tZXRob2RzRXhlY3V0aW9uU3RhdGlzdGljc0JlYW4udXBkYXRlRXhlY3V0aW9uU3RhdGlzdGljcyhyZXNvdXJjZVN0YXRpc3RpY3MuZ2V0UmVzb3VyY2VNZXRob2RFeGVjdXRpb25TdGF0aXN0aWNzKCkpOworICAgICAgICB0aGlzLnJlcXVlc3RFeGVjdXRpb25TdGF0aXN0aWNzQmVhbi51cGRhdGVFeGVjdXRpb25TdGF0aXN0aWNzKHJlc291cmNlU3RhdGlzdGljcy5nZXRSZXF1ZXN0RXhlY3V0aW9uU3RhdGlzdGljcygpKTsKKworICAgICAgICBmb3IgKE1hcC5FbnRyeTxSZXNvdXJjZU1ldGhvZCwgUmVzb3VyY2VNZXRob2RTdGF0aXN0aWNzPiBlbnRyeQorICAgICAgICAgICAgICAgIDogcmVzb3VyY2VTdGF0aXN0aWNzLmdldFJlc291cmNlTWV0aG9kU3RhdGlzdGljcygpLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIGZpbmFsIFJlc291cmNlTWV0aG9kU3RhdGlzdGljcyBtZXRob2RTdGF0cyA9IGVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZU1ldGhvZCBtZXRob2QgPSBlbnRyeS5nZXRLZXkoKTsKKworICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1ldGhvZElkID0gTW9uaXRvcmluZ1V0aWxzLmdldE1ldGhvZFVuaXF1ZUlkKG1ldGhvZCk7CisKKyAgICAgICAgICAgIFJlc291cmNlTWV0aG9kTVhCZWFuSW1wbCBtZXRob2RNWEJlYW4gPSB0aGlzLnJlc291cmNlTWV0aG9kcy5nZXQobWV0aG9kSWQpOworICAgICAgICAgICAgaWYgKG1ldGhvZE1YQmVhbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbWV0aG9kTVhCZWFuID0gbmV3IFJlc291cmNlTWV0aG9kTVhCZWFuSW1wbChtZXRob2RTdGF0cywgdXJpUmVzb3VyY2UsIG1CZWFuRXhwb3NlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlUHJvcGVydHlOYW1lLCBtZXRob2RJZCk7CisgICAgICAgICAgICAgICAgcmVzb3VyY2VNZXRob2RzLnB1dChtZXRob2RJZCwgbWV0aG9kTVhCZWFuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1ldGhvZE1YQmVhbi51cGRhdGVSZXNvdXJjZU1ldGhvZFN0YXRpc3RpY3MobWV0aG9kU3RhdHMpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gdGhpcy5uYW1lOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL2pteC9SZXNvdXJjZXNNQmVhbkdyb3VwLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL2pteC9SZXNvdXJjZXNNQmVhbkdyb3VwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM0NDE5NwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3Jpbmcvam14L1Jlc291cmNlc01CZWFuR3JvdXAuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5tb25pdG9yaW5nLmpteDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5SZXNvdXJjZVN0YXRpc3RpY3M7CisKKy8qKgorICogR3JvdXAgb2YgcmVzb3VyY2UgTVhCZWFucy4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNvdXJjZXNNQmVhbkdyb3VwIHsKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFJlc291cmNlTXhCZWFuSW1wbD4gZXhwb3NlZFJlc291cmNlTUJlYW5zID0gbmV3IEhhc2hNYXA8PigpOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHBhcmVudE5hbWU7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHVyaVJlc291cmNlOworICAgIHByaXZhdGUgZmluYWwgTUJlYW5FeHBvc2VyIGV4cG9zZXI7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgZ3JvdXAgb2YgTVhCZWFucyBhbmQgZXhwb3NlIG5lc3RlZCBSZXNvdXJjZSBNWEJlYW5zLgorICAgICAqIEBwYXJhbSByZXNvdXJjZVN0YXRpc3RpY3MgUmVzb3VyY2Ugc3RhdGlzdGljcyB0aGF0IHNob3VsZCBiZSBleHBvc2VkIGJ5IG5lc3RlZCBNWEJlYW5zLgorICAgICAqIEBwYXJhbSB1cmlSZXNvdXJjZSB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHJlc291cmNlcyBhcmUgaWRlbnRpZmllZCBieSBVUkkgKGFuZCBub3QgYnkgamF2YSBjbGFzcyBuYW1lcyBmb3IgZXhhbXBsZSkuCisgICAgICogQHBhcmFtIG1CZWFuRXhwb3NlciBtYmVhbiBleHBvc2VyLgorICAgICAqIEBwYXJhbSBwYXJlbnROYW1lIE5hbWUgb2YgdGhlIHBhcmVudCBiZWFuLgorICAgICAqLworICAgIHB1YmxpYyBSZXNvdXJjZXNNQmVhbkdyb3VwKE1hcDxTdHJpbmcsIFJlc291cmNlU3RhdGlzdGljcz4gcmVzb3VyY2VTdGF0aXN0aWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gdXJpUmVzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJlYW5FeHBvc2VyIG1CZWFuRXhwb3NlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFyZW50TmFtZSkgeworICAgICAgICB0aGlzLnVyaVJlc291cmNlID0gdXJpUmVzb3VyY2U7CisgICAgICAgIHRoaXMuZXhwb3NlciA9IG1CZWFuRXhwb3NlcjsKKyAgICAgICAgdGhpcy5wYXJlbnROYW1lID0gcGFyZW50TmFtZTsKKworICAgICAgICB1cGRhdGVSZXNvdXJjZXNTdGF0aXN0aWNzKHJlc291cmNlU3RhdGlzdGljcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXBkYXRlIHRoZSByZXNvdXJjZSBzdGF0aXN0aWNzIGV4cG9zZWQgYnkgbmVzdGVkIHJlc291cmNlIGJlYW5zLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlU3RhdGlzdGljcyBOZXcgcmVzb3VyY2Ugc3RhdGlzdGljcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVSZXNvdXJjZXNTdGF0aXN0aWNzKE1hcDxTdHJpbmcsIFJlc291cmNlU3RhdGlzdGljcz4gcmVzb3VyY2VTdGF0aXN0aWNzKSB7CisgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgUmVzb3VyY2VTdGF0aXN0aWNzPiBlbnRyeSA6IHJlc291cmNlU3RhdGlzdGljcy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBSZXNvdXJjZU14QmVhbkltcGwgcmVzb3VyY2VNeEJlYW4gPSBleHBvc2VkUmVzb3VyY2VNQmVhbnMuZ2V0KGVudHJ5LmdldEtleSgpKTsKKyAgICAgICAgICAgIGlmIChyZXNvdXJjZU14QmVhbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmVzb3VyY2VNeEJlYW4gPSBuZXcgUmVzb3VyY2VNeEJlYW5JbXBsKGVudHJ5LmdldFZhbHVlKCksIGVudHJ5LmdldEtleSgpLCB1cmlSZXNvdXJjZSwgZXhwb3NlciwgcGFyZW50TmFtZSk7CisgICAgICAgICAgICAgICAgZXhwb3NlZFJlc291cmNlTUJlYW5zLnB1dChlbnRyeS5nZXRLZXkoKSwgcmVzb3VyY2VNeEJlYW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzb3VyY2VNeEJlYW4udXBkYXRlUmVzb3VyY2VTdGF0aXN0aWNzKGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9qbXgvUmVzcG9uc2VNWEJlYW5JbXBsLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL2pteC9SZXNwb25zZU1YQmVhbkltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmNlN2JkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9qbXgvUmVzcG9uc2VNWEJlYW5JbXBsLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwubW9uaXRvcmluZy5qbXg7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuUmVzcG9uc2VNWEJlYW47CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuUmVzcG9uc2VTdGF0aXN0aWNzOworCisvKioKKyAqIE1YQmVhbiBpbXBsZW1lbnRpbmcgdGhlIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5SZXNwb25zZU1YQmVhbn0gTVhCZWFuIGludGVyZmFjZS4KKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNwb25zZU1YQmVhbkltcGwgaW1wbGVtZW50cyBSZXNwb25zZU1YQmVhbiB7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBSZXNwb25zZVN0YXRpc3RpY3MgcmVzcG9uc2VTdGF0aXN0aWNzOworCisKKyAgICAvKioKKyAgICAgKiBVcGRhdGUgdGhlIHN0YXRpc3RpY3MgZXhwb3NlZCBieSB0aGUgTVhCZWFuLgorICAgICAqIEBwYXJhbSByZXNwb25zZVN0YXRpc3RpY3MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVSZXNwb25zZVN0YXRpc3RpY3MoUmVzcG9uc2VTdGF0aXN0aWNzIHJlc3BvbnNlU3RhdGlzdGljcykgeworICAgICAgICB0aGlzLnJlc3BvbnNlU3RhdGlzdGljcyA9IHJlc3BvbnNlU3RhdGlzdGljczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWFwPEludGVnZXIsIExvbmc+IGdldFJlc3BvbnNlQ29kZXNUb0NvdW50TWFwKCkgeworICAgICAgICByZXR1cm4gcmVzcG9uc2VTdGF0aXN0aWNzLmdldFJlc3BvbnNlQ29kZXMoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSW50ZWdlciBnZXRMYXN0UmVzcG9uc2VDb2RlKCkgeworICAgICAgICByZXR1cm4gcmVzcG9uc2VTdGF0aXN0aWNzLmdldExhc3RSZXNwb25zZUNvZGUoKTsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9qbXgvcGFja2FnZS1pbmZvLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL2pteC9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzFjOGU1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9qbXgvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoqCisgKiBKZXJzZXkgaW50ZXJuYWwgc2VydmVyLXNpZGUgbW9uaXRvcmluZyBKTVggTUJlYW5zIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuCisgKi8KK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLm1vbml0b3Jpbmcuam14OwpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9wYWNrYWdlLWluZm8uamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3JpbmcvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBkY2NiZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3JpbmcvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoqCisgKiBKZXJzZXkgc2VydmVyLXNpZGUgaW50ZXJuYWwgbW9uaXRvcmluZyBhbmQgc3RhdGlzdGljcyBjbGFzc2VzLgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5tb25pdG9yaW5nOwpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvcGFja2FnZS1pbmZvLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDliMDg4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoqCisgKiBKZXJzZXkgc2VydmVyLXNpZGUgaW50ZXJuYWwgY2xhc3Nlcy4KKyAqLworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWw7CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9wcm9jZXNzL0RlZmF1bHRDbG9zZWFibGVTZXJ2aWNlLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9wcm9jZXNzL0RlZmF1bHRDbG9zZWFibGVTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjExZmYwNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3Byb2Nlc3MvRGVmYXVsdENsb3NlYWJsZVNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5wcm9jZXNzOworCitpbXBvcnQgamF2YS5pby5DbG9zZWFibGU7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ2xvc2VhYmxlU2VydmljZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CisKKy8qKgorICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgQ2xvc2VhYmxlU2VydmljZX0uCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBzdG9yZXMgaW5zdGFuY2VzIG9mIHtAY29kZSBDbG9zZWFibGV9IGluIGFuIGludGVybmFsIGlkZW50aXR5IGhhc2ggc2V0IGFuZCBtYWtlcyBzdXJlCisgKiB0aGF0IHRoZSBjbG9zZSBtZXRob2QgaXMgaW52b2tlZCBhdCBtb3N0IG9uY2UuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworY2xhc3MgRGVmYXVsdENsb3NlYWJsZVNlcnZpY2UgaW1wbGVtZW50cyBDbG9zZWFibGVTZXJ2aWNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKERlZmF1bHRDbG9zZWFibGVTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBwcml2YXRlIGZpbmFsIEF0b21pY0Jvb2xlYW4gY2xvc2VkID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOworICAgIHByaXZhdGUgZmluYWwgU2V0PENsb3NlYWJsZT4gY2xvc2VhYmxlcyA9IENvbGxlY3Rpb25zLm5ld1NldEZyb21NYXAobmV3IElkZW50aXR5SGFzaE1hcDw+KCkpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gYWRkKGZpbmFsIENsb3NlYWJsZSBjbG9zZWFibGUpIHsKKyAgICAgICAgcmV0dXJuICFjbG9zZWQuZ2V0KCkgJiYgY2xvc2VhYmxlcy5hZGQoY2xvc2VhYmxlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgaWYgKGNsb3NlZC5jb21wYXJlQW5kU2V0KGZhbHNlLCB0cnVlKSkgeworICAgICAgICAgICAgZm9yIChmaW5hbCBDbG9zZWFibGUgY2xvc2VhYmxlIDogY2xvc2VhYmxlcykgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGNsb3NlYWJsZS5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxpemF0aW9uTWVzc2FnZXMuQ0xPU0VBQkxFX1VOQUJMRV9UT19DTE9TRShjbG9zZWFibGUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpLCBleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvcHJvY2Vzcy9EZWZhdWx0UmVzcG9uZGluZ0NvbnRleHQuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3Byb2Nlc3MvRGVmYXVsdFJlc3BvbmRpbmdDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdjNDg0NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3Byb2Nlc3MvRGVmYXVsdFJlc3BvbmRpbmdDb250ZXh0LmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwucHJvY2VzczsKKworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWwuQ2hhaW5hYmxlU3RhZ2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5pbnRlcm5hbC5TdGFnZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLmludGVybmFsLlN0YWdlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVzcG9uc2U7CisKKy8qKgorICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcmVxdWVzdC1zY29wZWQKKyAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwucHJvY2Vzcy5SZXNwb25kaW5nQ29udGV4dCByZXNwb25kaW5nIGNvbnRleHR9LgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK2NsYXNzIERlZmF1bHRSZXNwb25kaW5nQ29udGV4dCBpbXBsZW1lbnRzIFJlc3BvbmRpbmdDb250ZXh0IHsKKworICAgIHByaXZhdGUgU3RhZ2U8Q29udGFpbmVyUmVzcG9uc2U+IHJvb3RTdGFnZTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHB1c2goRnVuY3Rpb248Q29udGFpbmVyUmVzcG9uc2UsIENvbnRhaW5lclJlc3BvbnNlPiByZXNwb25zZVRyYW5zZm9ybWF0aW9uKSB7CisgICAgICAgIHJvb3RTdGFnZSA9IChyb290U3RhZ2UgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICA/IG5ldyBTdGFnZXMuTGlua2VkU3RhZ2U8PihyZXNwb25zZVRyYW5zZm9ybWF0aW9uKQorICAgICAgICAgICAgICAgIDogbmV3IFN0YWdlcy5MaW5rZWRTdGFnZTw+KHJlc3BvbnNlVHJhbnNmb3JtYXRpb24sIHJvb3RTdGFnZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcHVzaChmaW5hbCBDaGFpbmFibGVTdGFnZTxDb250YWluZXJSZXNwb25zZT4gc3RhZ2UpIHsKKyAgICAgICAgaWYgKHJvb3RTdGFnZSAhPSBudWxsKSB7CisgICAgICAgICAgICBzdGFnZS5zZXREZWZhdWx0TmV4dChyb290U3RhZ2UpOworICAgICAgICB9CisKKyAgICAgICAgcm9vdFN0YWdlID0gc3RhZ2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0YWdlPENvbnRhaW5lclJlc3BvbnNlPiBjcmVhdGVSZXNwb25kaW5nUm9vdCgpIHsKKyAgICAgICAgcmV0dXJuIHJvb3RTdGFnZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9wcm9jZXNzL0VuZHBvaW50LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9wcm9jZXNzL0VuZHBvaW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNlMTg5MAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3Byb2Nlc3MvRW5kcG9pbnQuamF2YQpAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5wcm9jZXNzOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5JbmZsZWN0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlc3BvbnNlOworCisvKioKKyAqIFNlcnZlci1zaWRlIFJFU1QtZnVsIGVuZHBvaW50LgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRW5kcG9pbnQgZXh0ZW5kcyBJbmZsZWN0b3I8UmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0LCBDb250YWluZXJSZXNwb25zZT4geworCit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9wcm9jZXNzL01hcHBhYmxlRXhjZXB0aW9uLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9wcm9jZXNzL01hcHBhYmxlRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVmYTYyNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3Byb2Nlc3MvTWFwcGFibGVFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5wcm9jZXNzOworCitpbXBvcnQgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKKworLyoqCisgKiBBIHJ1bnRpbWUgZXhjZXB0aW9uIHRoYXQgY29udGFpbnMgYSBjYXVzZSwgYSBjaGVja2VkIG9yIHJ1bnRpbWUgZXhjZXB0aW9uLAorICogdGhhdCBtYXkgYmUgbWFwcGVkIHRvIGEge0BsaW5rIGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2V9IGluc3RhbmNlLgorICogPHA+CisgKiBUaGUgcnVudGltZSB3aWxsIGNhdGNoIHN1Y2ggZXhjZXB0aW9ucyBhbmQgYXR0ZW1wdCB0byBtYXAgdGhlIGNhdXNlCisgKiBleGNlcHRpb24gdG8gYSByZWdpc3RlcmVkIHtAbGluayBqYXZheC53cy5ycy5leHQuRXhjZXB0aW9uTWFwcGVyfSB0aGF0CisgKiBwcm92aWRlcyBhbiBhcHByb3ByaWF0ZSB7QGxpbmsgamF2YXgud3MucnMuY29yZS5SZXNwb25zZX0gaW5zdGFuY2UuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIE1hcHBhYmxlRXhjZXB0aW9uIGV4dGVuZHMgUHJvY2Vzc2luZ0V4Y2VwdGlvbiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNzMyNjAwNTUyMzk1Njg5Mjc1NEw7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBtYXBwYWJsZSBjb250YWluZXIgZXhjZXB0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNhdXNlIHRoZSBjYXVzZS4gSWYgdGhlIGNhdXNlIGlzIGFuIGluc3RhbmNlIG9mCisgICAgICogICAgIHtAbGluayBNYXBwYWJsZUV4Y2VwdGlvbn0gdGhlbiB0aGUgY2F1c2Ugb2YgdGhpcyBleGNlcHRpb24KKyAgICAgKiAgICAgd2lsbCBiZSBvYnRhaW5lZCBieSByZWN1cnNpdmVseSBzZWFyY2hpbmcgdGhvdWdoIHRoZSBleGNlcHRpb24KKyAgICAgKiAgICAgY2F1c2VzIHVudGlsIGEgY2F1c2UgaXMgb2J0YWluZWQgdGhhdCBpcyBub3QgYW4gaW5zdGFuY2Ugb2YKKyAgICAgKiAgICAge0Bjb2RlIE1hcHBhYmxlRXhjZXB0aW9ufS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwcGFibGVFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgICAgIHN1cGVyKHVud3JhcChjYXVzZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBtYXBwYWJsZSBleGNlcHRpb24gd2l0aCB0aGUgc3VwcGxpZWQgbWVzc2FnZSBhbmQgY2F1c2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UuCisgICAgICogQHBhcmFtIGNhdXNlIHRoZSBleGNlcHRpb24gY2F1c2UuCisgICAgICovCisgICAgcHVibGljIE1hcHBhYmxlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgICAgc3VwZXIobWVzc2FnZSwgdW53cmFwKGNhdXNlKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgVGhyb3dhYmxlIHVud3JhcChUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgICAgaWYgKGNhdXNlIGluc3RhbmNlb2YgTWFwcGFibGVFeGNlcHRpb24pIHsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBNYXBwYWJsZUV4Y2VwdGlvbiBtY2UgPSAoTWFwcGFibGVFeGNlcHRpb24pIGNhdXNlOworICAgICAgICAgICAgICAgIGNhdXNlID0gbWNlLmdldENhdXNlKCk7CisgICAgICAgICAgICB9IHdoaWxlIChjYXVzZSBpbnN0YW5jZW9mIE1hcHBhYmxlRXhjZXB0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjYXVzZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9wcm9jZXNzL1JlZmVyZW5jZXNJbml0aWFsaXplci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvcHJvY2Vzcy9SZWZlcmVuY2VzSW5pdGlhbGl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDA2NjUyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvcHJvY2Vzcy9SZWZlcmVuY2VzSW5pdGlhbGl6ZXIuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5wcm9jZXNzOworCitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworCitpbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5SZXF1ZXN0U2NvcGVkSW5pdGlhbGl6ZXI7CisKKy8qKgorICogUmVxdWVzdC9yZXNwb25zZSBzY29wZWQgaW5qZWN0aW9uIHN1cHBvcnQgaW5pdGlhbGl6YXRpb24gc3RhZ2UuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFJlZmVyZW5jZXNJbml0aWFsaXplciBpbXBsZW1lbnRzIEZ1bmN0aW9uPFJlcXVlc3RQcm9jZXNzaW5nQ29udGV4dCwgUmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0PiB7CisKKyAgICBwcml2YXRlIGZpbmFsIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlcjsKKyAgICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFJlcXVlc3RQcm9jZXNzaW5nQ29udGV4dFJlZmVyZW5jZT4gcHJvY2Vzc2luZ0NvbnRleHRSZWZQcm92aWRlcjsKKworICAgIC8qKgorICAgICAqIEluamVjdGlvbiBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmplY3Rpb25NYW5hZ2VyIGFwcGxpY2F0aW9uIGluamVjdGlvbiBtYW5hZ2VyLgorICAgICAqIEBwYXJhbSBwcm9jZXNzaW5nQ29udGV4dFJlZlByb3ZpZGVyIGNvbnRhaW5lciByZXF1ZXN0IHJlZmVyZW5jZSBwcm92aWRlciAocmVxdWVzdC1zY29wZWQpLgorICAgICAqLworICAgIHB1YmxpYyBSZWZlcmVuY2VzSW5pdGlhbGl6ZXIoCisgICAgICAgICAgICBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIsIFByb3ZpZGVyPFJlcXVlc3RQcm9jZXNzaW5nQ29udGV4dFJlZmVyZW5jZT4gcHJvY2Vzc2luZ0NvbnRleHRSZWZQcm92aWRlcikgeworICAgICAgICB0aGlzLmluamVjdGlvbk1hbmFnZXIgPSBpbmplY3Rpb25NYW5hZ2VyOworICAgICAgICB0aGlzLnByb2Nlc3NpbmdDb250ZXh0UmVmUHJvdmlkZXIgPSBwcm9jZXNzaW5nQ29udGV4dFJlZlByb3ZpZGVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgdGhlIHJlcXVlc3QgcmVmZXJlbmNlcyB1c2luZyB0aGUgaW5jb21pbmcgcmVxdWVzdCBwcm9jZXNzaW5nIGNvbnRleHQuCisgICAgICoKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IGluY29taW5nIHJlcXVlc3QgY29udGV4dC4KKyAgICAgKiBAcmV0dXJuIHNhbWUgKHVubW9kaWZpZWQpIHJlcXVlc3QgY29udGV4dC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0IGFwcGx5KGZpbmFsIFJlcXVlc3RQcm9jZXNzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHByb2Nlc3NpbmdDb250ZXh0UmVmUHJvdmlkZXIuZ2V0KCkuc2V0KGNvbnRleHQpOworCisgICAgICAgIGZpbmFsIFJlcXVlc3RTY29wZWRJbml0aWFsaXplciByZXF1ZXN0U2NvcGVkSW5pdGlhbGl6ZXIgPSBjb250ZXh0LnJlcXVlc3QoKS5nZXRSZXF1ZXN0U2NvcGVkSW5pdGlhbGl6ZXIoKTsKKyAgICAgICAgaWYgKHJlcXVlc3RTY29wZWRJbml0aWFsaXplciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXF1ZXN0U2NvcGVkSW5pdGlhbGl6ZXIuaW5pdGlhbGl6ZShpbmplY3Rpb25NYW5hZ2VyKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjb250ZXh0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3Byb2Nlc3MvUmVxdWVzdFByb2Nlc3NpbmdDb25maWd1cmF0b3IuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3Byb2Nlc3MvUmVxdWVzdFByb2Nlc3NpbmdDb25maWd1cmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2U2ZDAyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvcHJvY2Vzcy9SZXF1ZXN0UHJvY2Vzc2luZ0NvbmZpZ3VyYXRvci5qYXZhCkBAIC0wLDAgKzEsMTcwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5wcm9jZXNzOworCitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOworCitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkFzeW5jUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5SZXNvdXJjZUluZm87CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlcXVlc3Q7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5TZWN1cml0eUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkJvb3RzdHJhcEJhZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Cb290c3RyYXBDb25maWd1cmF0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkFic3RyYWN0QmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWwuUmVxdWVzdFNjb3BlZDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXN5bmNDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5DbG9zZWFibGVTZXJ2aWNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5FeHRlbmRlZFVyaUluZm87CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLnJvdXRpbmcuVXJpUm91dGluZ0NvbnRleHQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5FeHRlcm5hbFJlcXVlc3RTY29wZTsKKworLyoqCisgKiBDb25maWd1cmF0b3Igd2hpY2ggaW5pdGlhbGl6ZXMgYW5kIHJlZ2lzdGVyIHtAbGluayBFeHRlcm5hbFJlcXVlc3RTY29wZX0gaW5zdGFuY2UgaW50byB7QGxpbmsgSW5qZWN0aW9uTWFuYWdlcn0uCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK3B1YmxpYyBjbGFzcyBSZXF1ZXN0UHJvY2Vzc2luZ0NvbmZpZ3VyYXRvciBpbXBsZW1lbnRzIEJvb3RzdHJhcENvbmZpZ3VyYXRvciB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBpbml0KEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciwgQm9vdHN0cmFwQmFnIGJvb3RzdHJhcEJhZykgeworICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyKG5ldyBTZXJ2ZXJQcm9jZXNzaW5nQmluZGVyKCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENvbnRhaW5lclJlcXVlc3RGYWN0b3J5IGltcGxlbWVudHMgU3VwcGxpZXI8Q29udGFpbmVyUmVxdWVzdD4geworCisgICAgICAgIHByaXZhdGUgZmluYWwgUmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0UmVmZXJlbmNlIHJlZmVyZW5jZTsKKworICAgICAgICBASW5qZWN0CisgICAgICAgIHByaXZhdGUgQ29udGFpbmVyUmVxdWVzdEZhY3RvcnkoUmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0UmVmZXJlbmNlIHJlZmVyZW5jZSkgeworICAgICAgICAgICAgdGhpcy5yZWZlcmVuY2UgPSByZWZlcmVuY2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENvbnRhaW5lclJlcXVlc3QgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIHJlZmVyZW5jZS5nZXQoKS5yZXF1ZXN0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBVcmlSb3V0aW5nQ29udGV4dEZhY3RvcnkgaW1wbGVtZW50cyBTdXBwbGllcjxVcmlSb3V0aW5nQ29udGV4dD4geworCisgICAgICAgIHByaXZhdGUgZmluYWwgUmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0UmVmZXJlbmNlIHJlZmVyZW5jZTsKKworICAgICAgICBASW5qZWN0CisgICAgICAgIHByaXZhdGUgVXJpUm91dGluZ0NvbnRleHRGYWN0b3J5KFJlcXVlc3RQcm9jZXNzaW5nQ29udGV4dFJlZmVyZW5jZSByZWZlcmVuY2UpIHsKKyAgICAgICAgICAgIHRoaXMucmVmZXJlbmNlID0gcmVmZXJlbmNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBVcmlSb3V0aW5nQ29udGV4dCBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gcmVmZXJlbmNlLmdldCgpLnVyaVJvdXRpbmdDb250ZXh0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDbG9zZWFibGVTZXJ2aWNlRmFjdG9yeSBpbXBsZW1lbnRzIFN1cHBsaWVyPENsb3NlYWJsZVNlcnZpY2U+IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFJlcXVlc3RQcm9jZXNzaW5nQ29udGV4dFJlZmVyZW5jZSByZWZlcmVuY2U7CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBwcml2YXRlIENsb3NlYWJsZVNlcnZpY2VGYWN0b3J5KFJlcXVlc3RQcm9jZXNzaW5nQ29udGV4dFJlZmVyZW5jZSByZWZlcmVuY2UpIHsKKyAgICAgICAgICAgIHRoaXMucmVmZXJlbmNlID0gcmVmZXJlbmNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDbG9zZWFibGVTZXJ2aWNlIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiByZWZlcmVuY2UuZ2V0KCkuY2xvc2VhYmxlU2VydmljZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQXN5bmNDb250ZXh0RmFjdG9yeSBpbXBsZW1lbnRzIFN1cHBsaWVyPEFzeW5jQ29udGV4dD4geworCisgICAgICAgIHByaXZhdGUgZmluYWwgUmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0UmVmZXJlbmNlIHJlZmVyZW5jZTsKKworICAgICAgICBASW5qZWN0CisgICAgICAgIHByaXZhdGUgQXN5bmNDb250ZXh0RmFjdG9yeShSZXF1ZXN0UHJvY2Vzc2luZ0NvbnRleHRSZWZlcmVuY2UgcmVmZXJlbmNlKSB7CisgICAgICAgICAgICB0aGlzLnJlZmVyZW5jZSA9IHJlZmVyZW5jZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQXN5bmNDb250ZXh0IGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiByZWZlcmVuY2UuZ2V0KCkuYXN5bmNDb250ZXh0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZpbmVzIHNlcnZlci1zaWRlIHJlcXVlc3QgcHJvY2Vzc2luZyBpbmplY3Rpb24gYmluZGluZ3MuCisgICAgICoKKyAgICAgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICAgICAqLworICAgIHByaXZhdGUgY2xhc3MgU2VydmVyUHJvY2Vzc2luZ0JpbmRlciBleHRlbmRzIEFic3RyYWN0QmluZGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICAgICAgYmluZEFzQ29udHJhY3QoUmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0UmVmZXJlbmNlLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAuaW4oUmVxdWVzdFNjb3BlZC5jbGFzcyk7CisKKyAgICAgICAgICAgIC8vIEJpbmQgbm9uLXByb3hpYWJsZSBDb250YWluZXJSZXF1ZXN0IGluamVjdGlvbiBpbmplY3Rpb24gcG9pbnRzCisgICAgICAgICAgICBiaW5kRmFjdG9yeShDb250YWluZXJSZXF1ZXN0RmFjdG9yeS5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgLnRvKENvbnRhaW5lclJlcXVlc3QuY2xhc3MpLnRvKENvbnRhaW5lclJlcXVlc3RDb250ZXh0LmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAucHJveHkoZmFsc2UpCisgICAgICAgICAgICAgICAgICAgIC5pbihSZXF1ZXN0U2NvcGVkLmNsYXNzKTsKKworICAgICAgICAgICAgLy8gQmluZCBwcm94aWFibGUgSHR0cEhlYWRlcnMsIFJlcXVlc3QgYW5kIENvbnRhaW5lclJlcXVlc3RDb250ZXh0IGluamVjdGlvbiBpbmplY3Rpb24gcG9pbnRzCisgICAgICAgICAgICBiaW5kRmFjdG9yeShDb250YWluZXJSZXF1ZXN0RmFjdG9yeS5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgLnRvKEh0dHBIZWFkZXJzLmNsYXNzKS50byhSZXF1ZXN0LmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAucHJveHkodHJ1ZSkucHJveHlGb3JTYW1lU2NvcGUoZmFsc2UpCisgICAgICAgICAgICAgICAgICAgIC5pbihSZXF1ZXN0U2NvcGVkLmNsYXNzKTsKKworICAgICAgICAgICAgLy8gQmluZCBwcm94aWFibGUgVXJpSW5mbywgRXh0ZW5kZWRVcmlJbmZvIGFuZCBSZXNvdXJjZUluZm8gaW5qZWN0aW9uIHBvaW50cworICAgICAgICAgICAgYmluZEZhY3RvcnkoVXJpUm91dGluZ0NvbnRleHRGYWN0b3J5LmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAudG8oVXJpSW5mby5jbGFzcykudG8oRXh0ZW5kZWRVcmlJbmZvLmNsYXNzKS50byhSZXNvdXJjZUluZm8uY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIC5wcm94eSh0cnVlKS5wcm94eUZvclNhbWVTY29wZShmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgLmluKFJlcXVlc3RTY29wZWQuY2xhc3MpOworCisgICAgICAgICAgICAvLyBCaW5kIHByb3hpYWJsZSBTZWN1cml0eUNvbnRleHQgaW5qZWN0aW9uIHBvaW50LgorICAgICAgICAgICAgLy8gTk9URToKKyAgICAgICAgICAgIC8vIFNlY3VyaXR5Q29udGV4dCBtdXN0IGJlIGluamVjdGVkIHVzaW5nIHRoZSBJbmplY3RlZS4gVGhlIHJlYXNvbiBpcyB0aGF0IFNlY3VyaXR5Q29udGV4dCBjYW4gYmUgY2hhbmdlZCBieSBmaWx0ZXJzLAorICAgICAgICAgICAgLy8gYnV0IHRoZSBwcm94eSBpbnRlcm5hbGx5IGNhY2hlcyB0aGUgZmlyc3QgU2VjdXJpdHlDb250ZXh0IHZhbHVlIGluamVjdGVkIGluIHRoZSBSZXF1ZXN0U2NvcGUuIFRoaXMgaXMgcHJldmVudGVkIGJ5CisgICAgICAgICAgICAvLyB1c2luZyBTZWN1cml0eUNvbnRleHRJbmplY3RlZSB0aGF0IGRvZXMgbm90IGNhY2hlIHRoZSBTZWN1cml0eUNvbnRleHQgaW5zdGFuY2VzIGFuZCBpbnN0ZWFkIGRlbGVnYXRlcyBjYWxscyB0bworICAgICAgICAgICAgLy8gdGhlIFNlY3VyaXR5Q29udGV4dCBpbnN0YW5jZSByZXRyaWV2ZWQgZnJvbSBjdXJyZW50IENvbnRhaW5lclJlcXVlc3RDb250ZXh0LgorICAgICAgICAgICAgYmluZChTZWN1cml0eUNvbnRleHRJbmplY3RlZS5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgLnRvKFNlY3VyaXR5Q29udGV4dC5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgLnByb3h5KHRydWUpLnByb3h5Rm9yU2FtZVNjb3BlKGZhbHNlKQorICAgICAgICAgICAgICAgICAgICAuaW4oUmVxdWVzdFNjb3BlZC5jbGFzcyk7CisKKyAgICAgICAgICAgIC8vIEJpbmQgcHJveGlhYmxlIENsb3NlYWJsZVNlcnZpY2UgaW5qZWN0aW9uIHBvaW50LgorICAgICAgICAgICAgYmluZEZhY3RvcnkoQ2xvc2VhYmxlU2VydmljZUZhY3RvcnkuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIC50byhDbG9zZWFibGVTZXJ2aWNlLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAucHJveHkodHJ1ZSkucHJveHlGb3JTYW1lU2NvcGUoZmFsc2UpCisgICAgICAgICAgICAgICAgICAgIC5pbihSZXF1ZXN0U2NvcGVkLmNsYXNzKTsKKworICAgICAgICAgICAgLy8gQmluZCBwcm94aWFibGUgQXN5bmNDb250ZXh0IGFuZCBBc3luY1Jlc3BvbnNlIGluamVjdGlvbiBwb2ludHMuCisgICAgICAgICAgICAvLyBUT0RPIG1heWJlIHdlIGNhbiBnZXQgcmlkIG9mIHRoZXNlIGNvbXBsZXRlbHk/IE9yIGF0IGxlYXN0IGZvciBBc3luY0NvbnRleHQ/CisgICAgICAgICAgICBiaW5kRmFjdG9yeShBc3luY0NvbnRleHRGYWN0b3J5LmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAudG8oQXN5bmNDb250ZXh0LmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAudG8oQXN5bmNSZXNwb25zZS5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgLmluKFJlcXVlc3RTY29wZWQuY2xhc3MpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvcHJvY2Vzcy9SZXF1ZXN0UHJvY2Vzc2luZ0NvbnRleHQuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3Byb2Nlc3MvUmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGUwZDFkOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3Byb2Nlc3MvUmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0LmphdmEKQEAgLTAsMCArMSwyMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLnByb2Nlc3M7CisKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uUmVmOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5SZWZzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5WYWx1ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uVmFsdWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWwuQ2hhaW5hYmxlU3RhZ2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5pbnRlcm5hbC5TdGFnZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXN5bmNDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5DbG9zZWFibGVTZXJ2aWNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwubW9uaXRvcmluZy5SZXF1ZXN0RXZlbnRCdWlsZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5yb3V0aW5nLlJvdXRpbmdDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5yb3V0aW5nLlVyaVJvdXRpbmdDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLlJlcXVlc3RFdmVudDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5SZXF1ZXN0RXZlbnRMaXN0ZW5lcjsKKworLyoqCisgKiBSZXF1ZXN0IHByb2Nlc3NpbmcgY29udGV4dC4KKyAqCisgKiBTZXJ2ZXMgYXMgYSBodWIgZm9yIGFsbCByZXF1ZXN0IHByb2Nlc3NpbmcgcmVsYXRlZCBpbmZvcm1hdGlvbiBhbmQgaXMgYmVpbmcgcGFzc2VkIGJldHdlZW4gc3RhZ2VzLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KKy8vIFRPRE8gcmVwbGFjZSBhbHNvIENvbnRhaW5lclJlc3BvbnNlIGluIHN0YWdlcyB3aXRoIHRoaXMgZ3V5LgorcHVibGljIGZpbmFsIGNsYXNzIFJlcXVlc3RQcm9jZXNzaW5nQ29udGV4dCBpbXBsZW1lbnRzIFJlc3BvbmRpbmdDb250ZXh0IHsKKworICAgIHByaXZhdGUgZmluYWwgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyOworCisgICAgcHJpdmF0ZSBmaW5hbCBDb250YWluZXJSZXF1ZXN0IHJlcXVlc3Q7CisgICAgcHJpdmF0ZSBmaW5hbCBVcmlSb3V0aW5nQ29udGV4dCByb3V0aW5nQ29udGV4dDsKKyAgICBwcml2YXRlIGZpbmFsIFJlc3BvbmRpbmdDb250ZXh0IHJlc3BvbmRpbmdDb250ZXh0OworICAgIHByaXZhdGUgZmluYWwgQ2xvc2VhYmxlU2VydmljZSBjbG9zZWFibGVTZXJ2aWNlOworCisgICAgcHJpdmF0ZSBmaW5hbCBSZXF1ZXN0RXZlbnRCdWlsZGVyIG1vbml0b3JpbmdFdmVudEJ1aWxkZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBSZXF1ZXN0RXZlbnRMaXN0ZW5lciBtb25pdG9yaW5nRXZlbnRMaXN0ZW5lcjsKKworICAgIHByaXZhdGUgZmluYWwgUmVmPFZhbHVlPEFzeW5jQ29udGV4dD4+IGFzeW5jQ29udGV4dFZhbHVlUmVmOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyByZXF1ZXN0IHByb2Nlc3NpbmcgY29udGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmplY3Rpb25NYW5hZ2VyICAgICAgICBpbmplY3Rpb24gbWFuYWdlciAvIGluamVjdG9yLgorICAgICAqIEBwYXJhbSByZXF1ZXN0ICAgICAgICAgICAgICAgICBjb250YWluZXIgcmVxdWVzdC4KKyAgICAgKiBAcGFyYW0gcm91dGluZ0NvbnRleHQgICAgICAgICAgcm91dGluZyBjb250ZXh0LgorICAgICAqIEBwYXJhbSBtb25pdG9yaW5nRXZlbnRCdWlsZGVyICByZXF1ZXN0IG1vbml0b3JpbmcgZXZlbnQgYnVpbGRlci4KKyAgICAgKiBAcGFyYW0gbW9uaXRvcmluZ0V2ZW50TGlzdGVuZXIgcmVnaXN0ZXJlZCByZXF1ZXN0IG1vbml0b3JpbmcgZXZlbnQgbGlzdGVuZXIuCisgICAgICovCisgICAgcHVibGljIFJlcXVlc3RQcm9jZXNzaW5nQ29udGV4dCgKKyAgICAgICAgICAgIGZpbmFsIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciwKKyAgICAgICAgICAgIGZpbmFsIENvbnRhaW5lclJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgIGZpbmFsIFVyaVJvdXRpbmdDb250ZXh0IHJvdXRpbmdDb250ZXh0LAorICAgICAgICAgICAgZmluYWwgUmVxdWVzdEV2ZW50QnVpbGRlciBtb25pdG9yaW5nRXZlbnRCdWlsZGVyLAorICAgICAgICAgICAgZmluYWwgUmVxdWVzdEV2ZW50TGlzdGVuZXIgbW9uaXRvcmluZ0V2ZW50TGlzdGVuZXIpIHsKKyAgICAgICAgdGhpcy5pbmplY3Rpb25NYW5hZ2VyID0gaW5qZWN0aW9uTWFuYWdlcjsKKworICAgICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OworICAgICAgICB0aGlzLnJvdXRpbmdDb250ZXh0ID0gcm91dGluZ0NvbnRleHQ7CisgICAgICAgIHRoaXMucmVzcG9uZGluZ0NvbnRleHQgPSBuZXcgRGVmYXVsdFJlc3BvbmRpbmdDb250ZXh0KCk7CisgICAgICAgIHRoaXMuY2xvc2VhYmxlU2VydmljZSA9IG5ldyBEZWZhdWx0Q2xvc2VhYmxlU2VydmljZSgpOworCisgICAgICAgIHRoaXMubW9uaXRvcmluZ0V2ZW50QnVpbGRlciA9IG1vbml0b3JpbmdFdmVudEJ1aWxkZXI7CisgICAgICAgIHRoaXMubW9uaXRvcmluZ0V2ZW50TGlzdGVuZXIgPSBtb25pdG9yaW5nRXZlbnRMaXN0ZW5lcjsKKworICAgICAgICB0aGlzLmFzeW5jQ29udGV4dFZhbHVlUmVmID0gUmVmcy50aHJlYWRTYWZlKFZhbHVlcy48QXN5bmNDb250ZXh0PmVtcHR5KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcHJvY2Vzc2VkIGNvbnRhaW5lciByZXF1ZXN0LgorICAgICAqCisgICAgICogQHJldHVybiBwcm9jZXNzZWQgY29udGFpbmVyIHJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIENvbnRhaW5lclJlcXVlc3QgcmVxdWVzdCgpIHsKKyAgICAgICAgcmV0dXJuIHJlcXVlc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSByb3V0aW5nIGNvbnRleHQgZm9yIHRoZSBwcm9jZXNzZWQgY29udGFpbmVyIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHJlcXVlc3Qgcm91dGluZyBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBSb3V0aW5nQ29udGV4dCByb3V0aW5nQ29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIHJvdXRpbmdDb250ZXh0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdW5kZXJseWluZyB7QGxpbmsgVXJpUm91dGluZ0NvbnRleHR9IGluc3RhbmNlIGZvciB0aGUgcHJvY2Vzc2VkCisgICAgICogY29udGFpbmVyIHJlcXVlc3QuCisgICAgICogPHA+CisgICAgICogVGhpcyBpbnN0YW5jZSBpcyB1c2VkICBieSB7QGxpbmsgUmVxdWVzdFByb2Nlc3NpbmdDb25maWd1cmF0b3J9IHRvIHNhdGlzZnkgaW5qZWN0aW9uIG9mIG11bHRpcGxlIHR5cGVzLCBuYW1lbHk6CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGxpbmsgamF2YXgud3MucnMuY29yZS5VcmlJbmZvfTxsaT4KKyAgICAgKiA8L2xpPntAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuRXh0ZW5kZWRVcmlJbmZvfTxsaT4KKyAgICAgKiA8L2xpPntAbGluayBqYXZheC53cy5ycy5jb250YWluZXIuUmVzb3VyY2VJbmZvfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHJlcXVlc3Qgcm91dGluZyBjb250ZXh0LgorICAgICAqLworICAgIFVyaVJvdXRpbmdDb250ZXh0IHVyaVJvdXRpbmdDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gcm91dGluZ0NvbnRleHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGNsb3NlYWJsZSBzZXJ2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gY2xvc2VhYmxlIHNlcnZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSByZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBDbG9zZWFibGVTZXJ2aWNlIGNsb3NlYWJsZVNlcnZpY2UoKSB7CisgICAgICAgIHJldHVybiBjbG9zZWFibGVTZXJ2aWNlOworICAgIH0KKworCisgICAgLyoqCisgICAgICogTGF6aWx5IGluaXRpYWxpemUge0BsaW5rIEFzeW5jQ29udGV4dH0gZm9yIHRoaXMKKyAgICAgKiByZXF1ZXN0IHByb2Nlc3NpbmcgY29udGV4dC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUge0Bjb2RlIGxhenlDb250ZXh0VmFsdWV9IHdpbGwgYmUgb25seSBpbnZva2VkIG9uY2UgZHVyaW5nIHRoZSBmaXJzdCBjYWxsIHRvIHtAbGluayAjYXN5bmNDb250ZXh0KCl9LgorICAgICAqIEFzIHN1Y2gsIHRoZSBhc3luY2hyb25vdXMgY29udGV4dCBmb3IgdGhpcyByZXF1ZXN0IGNhbiBiZSBpbml0aWFsaXplZCBsYXppbHksIG9uIGRlbWFuZC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gbGF6eUNvbnRleHRWYWx1ZSBsYXppbHkgaW5pdGlhbGl6ZWQge0Bjb2RlIEFzeW5jQ29udGV4dH0gaW5zdGFuY2UgYm91bmQgdG8gdGhpcyByZXF1ZXN0IHByb2Nlc3NpbmcgY29udGV4dC4KKyAgICAgKi8KKyAgICAvLyBUT0RPIGZpZ3VyZSBvdXQgaG93IHRvIG1ha2UgdGhpcyBwYWNrYWdlLXByaXZhdGUuCisgICAgcHVibGljIHZvaWQgaW5pdEFzeW5jQ29udGV4dChWYWx1ZTxBc3luY0NvbnRleHQ+IGxhenlDb250ZXh0VmFsdWUpIHsKKyAgICAgICAgYXN5bmNDb250ZXh0VmFsdWVSZWYuc2V0KFZhbHVlcy5sYXp5KGxhenlDb250ZXh0VmFsdWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGFzeW5jaHJvbm91cyBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlcXVlc3QgcHJvY2Vzc2luZyBjb250ZXh0LgorICAgICAqCisgICAgICogTWF5IHJldHVybiB7QGNvZGUgbnVsbH0gaWYgbm8gYXN5bmNocm9ub3VzIGNvbnRleHQgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgaW4gdGhpcyByZXF1ZXN0IHByb2Nlc3NpbmcgY29udGV4dCB5ZXQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFzeW5jaHJvbm91cyBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJlcXVlc3QgcHJvY2Vzc2luZyBjb250ZXh0LCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlCisgICAgICogYXN5bmNocm9ub3VzIGNvbnRleHQgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIHlldAorICAgICAqIChzZWUge0BsaW5rICNpbml0QXN5bmNDb250ZXh0KG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5WYWx1ZSl9KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQXN5bmNDb250ZXh0IGFzeW5jQ29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIGFzeW5jQ29udGV4dFZhbHVlUmVmLmdldCgpLmdldCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIHtAbGluayBWYWx1ZX0gaW5zdGFuY2UgaG9sZGluZyB0aGUgYXN5bmNocm9ub3VzIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVxdWVzdCBwcm9jZXNzaW5nIGNvbnRleHQuCisgICAgICoKKyAgICAgKiBNYXkgcmV0dXJuIGFuIGVtcHR5IHZhbHVlIGlmIG5vIGFzeW5jaHJvbm91cyBjb250ZXh0IGhhcyBiZWVuIGluaXRpYWxpemVkIGluIHRoaXMgcmVxdWVzdCBwcm9jZXNzaW5nIGNvbnRleHQgeWV0LgorICAgICAqCisgICAgICogQHJldHVybiB2YWx1ZSBpbnN0YW5jZSBob2xkaW5nIHRoZSBhc3luY2hyb25vdXMgY29udGV4dCBhc3NvY2lhdGVkIHdpdGggdGhpcyByZXF1ZXN0IHByb2Nlc3NpbmcgY29udGV4dC4KKyAgICAgKiBUaGUgcmV0dXJuZWQgdmFsdWUgbWF5IGJlIGVtcHR5LCBpZiBubyBhc3luY2hyb25vdXMgY29udGV4dCBoYXMgYmVlbiBpbml0aWFsaXplZCB5ZXQKKyAgICAgKiAoc2VlIHtAbGluayAjaW5pdEFzeW5jQ29udGV4dChvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uVmFsdWUpfSkuCisgICAgICovCisgICAgcHVibGljIFZhbHVlPEFzeW5jQ29udGV4dD4gYXN5bmNDb250ZXh0VmFsdWUoKSB7CisgICAgICAgIHJldHVybiBhc3luY0NvbnRleHRWYWx1ZVJlZi5nZXQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgaW5qZWN0aW9uIG1hbmFnZXIuCisgICAgICoKKyAgICAgKiBUaGUgcmV0dXJuZWQgaW5zdGFuY2UgaXMgYXBwbGljYXRpb24tc2NvcGVkLgorICAgICAqCisgICAgICogQHJldHVybiBhcHBsaWNhdGlvbi1zY29wZWQgaW5qZWN0aW9uIG1hbmFnZXIuCisgICAgICovCisgICAgcHVibGljIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlcigpIHsKKyAgICAgICAgcmV0dXJuIGluamVjdGlvbk1hbmFnZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHJlcXVlc3QgbW9uaXRvcmluZyBldmVudCBidWlsZGVyLgorICAgICAqCisgICAgICogQHJldHVybiByZXF1ZXN0IG1vbml0b3JpbmcgZXZlbnQgYnVpbGRlci4KKyAgICAgKi8KKyAgICAvLyBUT0RPIHBlcmhhcHMgdGhpcyBtZXRob2QgY2FuIGJlIGNvbXBsZXRlbHkgcmVtb3ZlZCBvciByZXBsYWNlZCBieSBzZXR0aW5nIHZhbHVlcyBvbiB0aGUgY29udGV4dCBkaXJlY3RseT8KKyAgICBwdWJsaWMgUmVxdWVzdEV2ZW50QnVpbGRlciBtb25pdG9yaW5nRXZlbnRCdWlsZGVyKCkgeworICAgICAgICByZXR1cm4gbW9uaXRvcmluZ0V2ZW50QnVpbGRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmlnZ2VyIGEgbmV3IG1vbml0b3JpbmcgZXZlbnQgZm9yIHRoZSBjdXJyZW50bHkgcHJvY2Vzc2VkIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnRUeXBlIHJlcXVlc3QgZXZlbnQgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0cmlnZ2VyRXZlbnQoUmVxdWVzdEV2ZW50LlR5cGUgZXZlbnRUeXBlKSB7CisgICAgICAgIGlmIChtb25pdG9yaW5nRXZlbnRMaXN0ZW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICBtb25pdG9yaW5nRXZlbnRMaXN0ZW5lci5vbkV2ZW50KG1vbml0b3JpbmdFdmVudEJ1aWxkZXIuYnVpbGQoZXZlbnRUeXBlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwdXNoKGZpbmFsIEZ1bmN0aW9uPENvbnRhaW5lclJlc3BvbnNlLCBDb250YWluZXJSZXNwb25zZT4gcmVzcG9uc2VUcmFuc2Zvcm1hdGlvbikgeworICAgICAgICByZXNwb25kaW5nQ29udGV4dC5wdXNoKHJlc3BvbnNlVHJhbnNmb3JtYXRpb24pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHB1c2goZmluYWwgQ2hhaW5hYmxlU3RhZ2U8Q29udGFpbmVyUmVzcG9uc2U+IHN0YWdlKSB7CisgICAgICAgIHJlc3BvbmRpbmdDb250ZXh0LnB1c2goc3RhZ2UpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdGFnZTxDb250YWluZXJSZXNwb25zZT4gY3JlYXRlUmVzcG9uZGluZ1Jvb3QoKSB7CisgICAgICAgIHJldHVybiByZXNwb25kaW5nQ29udGV4dC5jcmVhdGVSZXNwb25kaW5nUm9vdCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3Byb2Nlc3MvUmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0UmVmZXJlbmNlLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9wcm9jZXNzL1JlcXVlc3RQcm9jZXNzaW5nQ29udGV4dFJlZmVyZW5jZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxZGMxNDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9wcm9jZXNzL1JlcXVlc3RQcm9jZXNzaW5nQ29udGV4dFJlZmVyZW5jZS5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLnByb2Nlc3M7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uUmVmOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWwuUmVxdWVzdFNjb3BlZDsKKworLyoqCisgKiBXcmFwcGVyIHRoYXQgaG9sZHMgdGhlIHJlZmVyZW5jZSBvZiB0aGUge0BsaW5rIFJlcXVlc3RQcm9jZXNzaW5nQ29udGV4dH0uIFRoaXMgY2xhc3MgaGVscHMgdG8gZ2V0IHRoZSBjdXJyZW50IHJlcXVlc3Qgc2NvcGVkCisgKiBvYmplY3Qgd2l0aG91dCB3cmFwcGluZyB1c2luZyB0aGUgcHJveHkuIE91dGVyIHdyYXBwZXIgY2FuIGJlIHByb3hpZWQgYnV0IGlubmVyIHJlZmVyZW5jZSBvYmplY3Qgc3RpbGwgcmVtYWlucyB0aGUgZGlyZWN0CisgKiByZWZlcmVuY2UuCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK0BSZXF1ZXN0U2NvcGVkCitwdWJsaWMgY2xhc3MgUmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0UmVmZXJlbmNlIGltcGxlbWVudHMgUmVmPFJlcXVlc3RQcm9jZXNzaW5nQ29udGV4dD4geworCisgICAgcHJpdmF0ZSBSZXF1ZXN0UHJvY2Vzc2luZ0NvbnRleHQgcHJvY2Vzc2luZ0NvbnRleHQ7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXQoUmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0IHByb2Nlc3NpbmdDb250ZXh0KSB7CisgICAgICAgIHRoaXMucHJvY2Vzc2luZ0NvbnRleHQgPSBwcm9jZXNzaW5nQ29udGV4dDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0IGdldCgpIHsKKyAgICAgICAgcmV0dXJuIHByb2Nlc3NpbmdDb250ZXh0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3Byb2Nlc3MvUmVzcG9uZGluZ0NvbnRleHQuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3Byb2Nlc3MvUmVzcG9uZGluZ0NvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmEzMDE1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvcHJvY2Vzcy9SZXNwb25kaW5nQ29udGV4dC5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLnByb2Nlc3M7CisKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLmludGVybmFsLkNoYWluYWJsZVN0YWdlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWwuU3RhZ2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlc3BvbnNlOworCisvKioKKyAqIENvbnRleHQgdGhhdCBjYW4gYmUgdXNlZCBkdXJpbmcgdGhlIGRhdGEgcHJvY2Vzc2luZyBmb3IgcmVnaXN0ZXJpbmcgcmVzcG9uc2UKKyAqIHByb2Nlc3Npbmcgc3RhZ2VzIGFuZC9vciBmdW5jdGlvbnMgdGhhdCB3aWxsIGJlIGludm9rZWQgZHVyaW5nIHRoZSByZXNwb25zZSBwcm9jZXNzaW5nCisgKiB0byB0cmFuc2Zvcm0gdGhlIHJlc3BvbnNlIGJlZm9yZSBpdCBpcyB3cml0dGVuIHRvIHRoZSBjbGllbnQuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGludGVyZmFjZSBSZXNwb25kaW5nQ29udGV4dCB7CisKKyAgICAvKioKKyAgICAgKiBQdXNoIHJlc3BvbnNlIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2VUcmFuc2Zvcm1hdGlvbiByZXNwb25zZSB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbi4KKyAgICAgKi8KKyAgICB2b2lkIHB1c2goRnVuY3Rpb248Q29udGFpbmVyUmVzcG9uc2UsIENvbnRhaW5lclJlc3BvbnNlPiByZXNwb25zZVRyYW5zZm9ybWF0aW9uKTsKKworICAgIC8qKgorICAgICAqIFB1c2ggY2hhaW5hYmxlIHJlc3BvbnNlIHRyYW5zZm9ybWF0aW9uIHN0YWdlIHRoYXQgc2hvdWxkIGJlIGFwcGxpZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RhZ2UgcmVzcG9uc2UgdHJhbnNmb3JtYXRpb24gY2hhaW5hYmxlIHN0YWdlLgorICAgICAqLworICAgIHZvaWQgcHVzaChDaGFpbmFibGVTdGFnZTxDb250YWluZXJSZXNwb25zZT4gc3RhZ2UpOworCisgICAgLyoqCisgICAgICogKE9wdGlvbmFsbHkpIGNyZWF0ZSBhIHJlc3BvbmRlciBjaGFpbiBmcm9tIGFsbCB0cmFuc2Zvcm1hdGlvbnMKKyAgICAgKiBwcmV2aW91c2x5IHB1c2hlZCBpbnRvIHRoZSBjb250ZXh0LgorICAgICAqCisgICAgICogQHJldHVybiBjcmVhdGVkIHJlc3BvbmRlciBjaGFpbiByb290IG9yIHtAY29kZSBudWxsfSBpbiBjYXNlIG9mIG5vCisgICAgICogICAgICAgICByZWdpc3RlcmVkIHRyYW5zZm9ybWF0aW9ucy4KKyAgICAgKi8KKyAgICBTdGFnZTxDb250YWluZXJSZXNwb25zZT4gY3JlYXRlUmVzcG9uZGluZ1Jvb3QoKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3Byb2Nlc3MvU2VjdXJpdHlDb250ZXh0SW5qZWN0ZWUuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3Byb2Nlc3MvU2VjdXJpdHlDb250ZXh0SW5qZWN0ZWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTNhZDdlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvcHJvY2Vzcy9TZWN1cml0eUNvbnRleHRJbmplY3RlZS5qYXZhCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5wcm9jZXNzOworCitpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5TZWN1cml0eUNvbnRleHQ7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworCisvKioKKyAqIFByb3hpYWJsZSB3cmFwcGVyIGZvciByZXF1ZXN0IHNjb3BlZCB7QGxpbmsgU2VjdXJpdHlDb250ZXh0fSBpbnN0YW5jZS4KKyAqCisgKiA8cD4KKyAqIFRoaXMgd3JhcHBlciBtdXN0IGJlIHVzZWQgYW5kIGNhbm5vdCBiZSByZXBsYWNlZCBieSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LlJlZmVyZW5jaW5nRmFjdG9yeX0uCisgKiBUaGUgcmVhc29uIGlzIHRoYXQge0BsaW5rIFNlY3VyaXR5Q29udGV4dCBzZWN1cml0eSBjb250ZXh0fSBjYW4gYmUgc2V0CisgKiBtYW55IHRpbWVzIGR1cmluZyB0aGUgcmVxdWVzdCBwcm9jZXNzaW5nLiBIb3dldmVyLCB0aGUgSEsyIHByb3h5IGNhY2hlcworICogdGhlIGZpcnN0IHZhbHVlIHRoYXQgaXMgaW5qZWN0ZWQuIFNvLCBpZiBmb3IgZXhhbXBsZSBhbnkgZmlsdGVyIGluamVjdHMKKyAqIHNlY3VyaXR5IGNvbnRleHQsIHRoZW4gdGhpcyBzZWN1cml0eSBjb250ZXh0IHdpbGwgYmUgY2FjaGVkIGFuZCBpdCB3aWxsCisgKiBuZXZlciBiZSByZXBsYWNlZCBmb3IgdGhlIHNhbWUgcmVxdWVzdC4gT24gdGhlIG90aGVyIGhhbmQsIEhLMiBzaG91bGQKKyAqIHByb2JhYmx5IGNhY2hlIHRoZSBmaXJzdCB2YWx1ZSByZXR1cm5lZCBpbiB0aGUgcmVxdWVzdCBzY29wZSB0byBwcmV2ZW50CisgKiB0aGF0IHR3byBzdWJzZXF1ZW50IGNhbGxzIGRvbmUgb24gdGhlIHByb3h5IHdpbGwgYmUgZm9yd2FyZGVkIHRvIGRpZmZlcmVudAorICogb2JqZWN0IGlmIHRoZSB0aGUgb2JqZWN0IGNoYW5nZXMgaW4gdGhlIG1lYW50aW1lLgorICogPHAvPgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK2NsYXNzIFNlY3VyaXR5Q29udGV4dEluamVjdGVlIGltcGxlbWVudHMgU2VjdXJpdHlDb250ZXh0IHsKKworICAgIHByaXZhdGUgZmluYWwgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQ7CisKKyAgICAvKioKKyAgICAgKiBJbmplY3Rpb24gY29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdENvbnRleHQge0Bjb2RlIFNlY3VyaXR5Q29udGV4dH0gc291cmNlLgorICAgICAqLworICAgIEBJbmplY3QKKyAgICBwdWJsaWMgU2VjdXJpdHlDb250ZXh0SW5qZWN0ZWUoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHsKKyAgICAgICAgdGhpcy5yZXF1ZXN0Q29udGV4dCA9IHJlcXVlc3RDb250ZXh0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBQcmluY2lwYWwgZ2V0VXNlclByaW5jaXBhbCgpIHsKKyAgICAgICAgY2hlY2tTdGF0ZSgpOworICAgICAgICByZXR1cm4gcmVxdWVzdENvbnRleHQuZ2V0U2VjdXJpdHlDb250ZXh0KCkuZ2V0VXNlclByaW5jaXBhbCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzVXNlckluUm9sZShTdHJpbmcgcm9sZSkgeworICAgICAgICBjaGVja1N0YXRlKCk7CisgICAgICAgIHJldHVybiByZXF1ZXN0Q29udGV4dC5nZXRTZWN1cml0eUNvbnRleHQoKS5pc1VzZXJJblJvbGUocm9sZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNTZWN1cmUoKSB7CisgICAgICAgIGNoZWNrU3RhdGUoKTsKKyAgICAgICAgcmV0dXJuIHJlcXVlc3RDb250ZXh0LmdldFNlY3VyaXR5Q29udGV4dCgpLmlzU2VjdXJlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRBdXRoZW50aWNhdGlvblNjaGVtZSgpIHsKKyAgICAgICAgY2hlY2tTdGF0ZSgpOworICAgICAgICByZXR1cm4gcmVxdWVzdENvbnRleHQuZ2V0U2VjdXJpdHlDb250ZXh0KCkuZ2V0QXV0aGVudGljYXRpb25TY2hlbWUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBjaGVja1N0YXRlKCk7CisgICAgICAgIHJldHVybiA3ICogcmVxdWVzdENvbnRleHQuZ2V0U2VjdXJpdHlDb250ZXh0KCkuaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHRoYXQpIHsKKyAgICAgICAgY2hlY2tTdGF0ZSgpOworCisgICAgICAgIHJldHVybiB0aGF0IGluc3RhbmNlb2YgU2VjdXJpdHlDb250ZXh0ICYmIHRoYXQuZXF1YWxzKHJlcXVlc3RDb250ZXh0LmdldFNlY3VyaXR5Q29udGV4dCgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tTdGF0ZSgpIHsKKyAgICAgICAgaWYgKHJlcXVlc3RDb250ZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuU0VDVVJJVFlfQ09OVEVYVF9XQVNfTk9UX1NFVCgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3Byb2Nlc3MvcGFja2FnZS1pbmZvLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9wcm9jZXNzL3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMWMyYmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9wcm9jZXNzL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKKy8qKgorICogSmVyc2V5IHNlcnZlci1zaWRlIGludGVybmFsIGNsYXNzZXMgcmVsYXRlZCB0byByZXF1ZXN0IGFuZCByZXNwb25zZSBwcm9jZXNzaW5nLgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5wcm9jZXNzOwpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvcm91dGluZy9Db21iaW5lZE1lZGlhVHlwZS5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvcm91dGluZy9Db21iaW5lZE1lZGlhVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNDc5ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9yb3V0aW5nL0NvbWJpbmVkTWVkaWFUeXBlLmphdmEKQEAgLTAsMCArMSwyNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLnJvdXRpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5NZXNzYWdlQm9keVdvcmtlcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5NZWRpYVR5cGVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuUXVhbGl0eTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLlF1YWxpdHlTb3VyY2VNZWRpYVR5cGU7CisKKy8qKgorICogUmVwcmVzZW50cyBmdW5jdGlvbiBTIGFzIGRlZmluZWQgaW4gdGhlIFJlcXVlc3QgTWF0Y2hpbmcgcGFydCBvZiB0aGUgc3BlYy4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK2ZpbmFsIGNsYXNzIENvbWJpbmVkTWVkaWFUeXBlIHsKKworICAgIC8qKgorICAgICAqIENvbnN0YW50IGNvbWJpbmVkIHR5cGUgcmVwcmVzZW50aW5nIG5vIG1hdGNoLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBDb21iaW5lZE1lZGlhVHlwZSBOT19NQVRDSCA9IG5ldyBDb21iaW5lZE1lZGlhVHlwZShudWxsLCAwLCAwLCAwKTsKKworICAgIHByaXZhdGUgc3RhdGljIGludCBtYXRjaGVkV2lsZGNhcmRzKE1lZGlhVHlwZSBjbGllbnRNdCwgRWZmZWN0aXZlTWVkaWFUeXBlIHNlcnZlck10KSB7CisgICAgICAgIHJldHVybiBiMmkoY2xpZW50TXQuaXNXaWxkY2FyZFR5cGUoKSBeIHNlcnZlck10LmlzV2lsZGNhcmRUeXBlKCkpCisgICAgICAgICAgICAgICAgKyBiMmkoY2xpZW50TXQuaXNXaWxkY2FyZFN1YnR5cGUoKSBeIHNlcnZlck10LmlzV2lsZGNhcmRTdWJUeXBlKCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludCBiMmkoYm9vbGVhbiBiKSB7CisgICAgICAgIHJldHVybiBiID8gMSA6IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tYmluZWQgY2xpZW50L3NlcnZlciBtZWRpYSB0eXBlLCBzdHJpcHBlZCBvZiBxIGFuZCBxcyBwYXJhbWV0ZXJzLgorICAgICAqLworICAgIGZpbmFsIE1lZGlhVHlwZSBjb21iaW5lZFR5cGU7CisgICAgLyoqCisgICAgICogQ2xpZW50LXNwZWNpZmllZCBtZWRpYSB0eXBlIHF1YWxpdHkuCisgICAgICovCisgICAgZmluYWwgaW50IHE7CisgICAgLyoqCisgICAgICogU2VydmVyLXNwZWNpZmllZCBtZWRpYSB0eXBlIHF1YWxpdHkuCisgICAgICovCisgICAgZmluYWwgaW50IHFzOworICAgIC8qKgorICAgICAqIERpc3RhbmNlIG9mIHRoZSBjb21iaW5lZCBtZWRpYSB0eXBlcy4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPgorICAgICAqIDAgLSBpZiB0aGUgdHlwZSBhbmQgc3VidHlwZSBvZiBib3RoIGNvbWJpbmVkIG1lZGlhIHR5cGVzIG1hdGNoIGV4YWN0bHkgKGkuZS4gWyJtL24iICsgIm0vbiJdKS4KKyAgICAgKiA8L2xpPgorICAgICAqIDxsaT4KKyAgICAgKiAxIC0gaWYgb25lIG1lZGlhIHR5cGUgY29udGFpbnMgYSB3aWxkY2FyZCB0eXBlIG9yIHN1YnR5cGUgdmFsdWUgdGhhdCBtYXRjaGVzIGEgY29uY3JldGUgdHlwZSBvciBzdWJ0eXBlIHZhbHVlLgorICAgICAqIDwvbGk+CisgICAgICogPGxpPgorICAgICAqIDIgLSBpZiBvbmUgb2YgdGhlIG1lZGlhIHR5cGVzIGlzIGEge0BsaW5rIE1lZGlhVHlwZSNXSUxEQ0FSRF9UWVBFfSBhbmQgdGhlIG90aGVyIG9uZSBpcyBhIGNvbmNyZXRlIG1lZGlhIHR5cGUuCisgICAgICogPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqLworICAgIGZpbmFsIGludCBkOworCisgICAgcHJpdmF0ZSBDb21iaW5lZE1lZGlhVHlwZShmaW5hbCBNZWRpYVR5cGUgY29tYmluZWRUeXBlLCBmaW5hbCBpbnQgcSwgZmluYWwgaW50IHFzLCBmaW5hbCBpbnQgZCkgeworICAgICAgICB0aGlzLmNvbWJpbmVkVHlwZSA9IGNvbWJpbmVkVHlwZTsKKyAgICAgICAgdGhpcy5xID0gcTsKKyAgICAgICAgdGhpcy5xcyA9IHFzOworICAgICAgICB0aGlzLmQgPSBkOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBjb21iaW5lZCBjbGllbnQvc2VydmVyIG1lZGlhIHR5cGUuCisgICAgICoKKyAgICAgKiBpZiB0aGUgdHdvIHR5cGVzIGFyZSBub3QgY29tcGF0aWJsZSwge0BsaW5rICNOT19NQVRDSH0gaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xpZW50VHlwZSBjbGllbnQtc2lkZSBtZWRpYSB0eXBlLgorICAgICAqIEBwYXJhbSBzZXJ2ZXJUeXBlIHNlcnZlci1zaWRlIG1lZGlhIHR5cGUuCisgICAgICogQHJldHVybiBjb21iaW5lZCBjbGllbnQvc2VydmVyIG1lZGlhIHR5cGUuCisgICAgICovCisgICAgc3RhdGljIENvbWJpbmVkTWVkaWFUeXBlIGNyZWF0ZShNZWRpYVR5cGUgY2xpZW50VHlwZSwgRWZmZWN0aXZlTWVkaWFUeXBlIHNlcnZlclR5cGUpIHsKKyAgICAgICAgaWYgKCFjbGllbnRUeXBlLmlzQ29tcGF0aWJsZShzZXJ2ZXJUeXBlLmdldE1lZGlhVHlwZSgpKSkgeworICAgICAgICAgICAgcmV0dXJuIE5PX01BVENIOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgTWVkaWFUeXBlIHN0cmlwcGVkQ2xpZW50VHlwZSA9IE1lZGlhVHlwZXMuc3RyaXBRdWFsaXR5UGFyYW1zKGNsaWVudFR5cGUpOworICAgICAgICBmaW5hbCBNZWRpYVR5cGUgc3RyaXBwZWRTZXJ2ZXJUeXBlID0gTWVkaWFUeXBlcy5zdHJpcFF1YWxpdHlQYXJhbXMoc2VydmVyVHlwZS5nZXRNZWRpYVR5cGUoKSk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBDb21iaW5lZE1lZGlhVHlwZSgKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGVzLm1vc3RTcGVjaWZpYyhzdHJpcHBlZENsaWVudFR5cGUsIHN0cmlwcGVkU2VydmVyVHlwZSksCisgICAgICAgICAgICAgICAgTWVkaWFUeXBlcy5nZXRRdWFsaXR5KGNsaWVudFR5cGUpLAorICAgICAgICAgICAgICAgIFF1YWxpdHlTb3VyY2VNZWRpYVR5cGUuZ2V0UXVhbGl0eVNvdXJjZShzZXJ2ZXJUeXBlLmdldE1lZGlhVHlwZSgpKSwKKyAgICAgICAgICAgICAgICBtYXRjaGVkV2lsZGNhcmRzKGNsaWVudFR5cGUsIHNlcnZlclR5cGUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb21wYXJhdG9yIHVzZWQgdG8gY29tcGFyZSB7QGxpbmsgQ29tYmluZWRNZWRpYVR5cGV9LiBUaGUgY29tcGFyYXRvciBzb3J0cyB0aGUgZWxlbWVudHMgb2YgbGlzdAorICAgICAqIGluIHRoZSBhc2NlbmRpbmcgb3JkZXIgZnJvbSB0aGUgbW9zdCBhcHByb3ByaWF0ZSB0byB0aGUgbGVhc3QgYXBwcm9wcmlhdGUgY29tYmluZWQgbWVkaWEgdHlwZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxDb21iaW5lZE1lZGlhVHlwZT4gQ09NUEFSQVRPUiA9IG5ldyBDb21wYXJhdG9yPENvbWJpbmVkTWVkaWFUeXBlPigpIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBjb21wYXJlKENvbWJpbmVkTWVkaWFUeXBlIGMxLCBDb21iaW5lZE1lZGlhVHlwZSBjMikgeworICAgICAgICAgICAgLy8gbW9yZSBjb25jcmV0ZSBpcyBiZXR0ZXIKKyAgICAgICAgICAgIGludCBkZWx0YSA9IE1lZGlhVHlwZXMuUEFSVElBTF9PUkRFUl9DT01QQVJBVE9SLmNvbXBhcmUoYzEuY29tYmluZWRUeXBlLCBjMi5jb21iaW5lZFR5cGUpOworICAgICAgICAgICAgaWYgKGRlbHRhICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVsdGE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGhpZ2hlciBpcyBiZXR0ZXIKKyAgICAgICAgICAgIGRlbHRhID0gUXVhbGl0eS5RVUFMSVRZX1ZBTFVFX0NPTVBBUkFUT1IuY29tcGFyZShjMS5xLCBjMi5xKTsKKyAgICAgICAgICAgIGlmIChkZWx0YSAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlbHRhOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBoaWdoZXIgaXMgYmV0dGVyCisgICAgICAgICAgICBkZWx0YSA9IFF1YWxpdHkuUVVBTElUWV9WQUxVRV9DT01QQVJBVE9SLmNvbXBhcmUoYzEucXMsIGMyLnFzKTsKKyAgICAgICAgICAgIGlmIChkZWx0YSAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlbHRhOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBsb3dlciBpcyBiZXR0ZXIKKyAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLmNvbXBhcmUoYzEuZCwgYzIuZCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiVzO3E9JWQ7cXM9JWQ7ZD0lZCIsIGNvbWJpbmVkVHlwZSwgcSwgcXMsIGQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAbGluayBNZWRpYVR5cGUgTWVkaWEgdHlwZX0gZXh0ZW5kZWQgYnkgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgbWVkaWEgdHlwZSB3YXMKKyAgICAgKiBvYnRhaW5lZCBmcm9tIHVzZXIgYW5ub3RhdGlvbnMge0BsaW5rIENvbnN1bWVzfSBvciB7QGxpbmsgUHJvZHVjZXN9IG9yIGhhcyBubworICAgICAqIGFubm90YXRpb24gYW5kIHRoZXJlZm9yZSB3YXMgZGVyaXZlZCBmcm9tIHtAbGluayBNZXNzYWdlQm9keVdvcmtlcnN9LgorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBFZmZlY3RpdmVNZWRpYVR5cGUgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUcnVlIGlmIHRoZSBNZWRpYVR5cGUgd2FzIG5vdCBkZWZpbmVkIGJ5IGFubm90YXRpb24gYW5kIHRoZXJlZm9yZSB3YXMKKyAgICAgICAgICogZGVyaXZlZCBmcm9tIE1lc3NhZ2UgQm9keSBQcm92aWRlcnMuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gZGVyaXZlZDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIG5ldyBpbnN0YW5jZSB3aXRoIHtAY29kZSBtZWRpYVR5cGV9IGFuZCBmbGFnIGluZGljYXRpbmcgdGhlIG9yaWdpbiBvZgorICAgICAgICAgKiB0aGUgbWVkaWFUeXBlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbWVkaWFUeXBlICAgICAgICAgICAgICAgIFRoZSBtZWRpYSB0eXBlLgorICAgICAgICAgKiBAcGFyYW0gZnJvbU1lc3NhZ2VCb2R5UHJvdmlkZXJzIFRydWUgaWYge0Bjb2RlIG1lZGlhVHlwZX0gd2FzIGRlcml2ZWQgZnJvbQorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAbGluayBNZXNzYWdlQm9keVdvcmtlcnN9LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEVmZmVjdGl2ZU1lZGlhVHlwZShNZWRpYVR5cGUgbWVkaWFUeXBlLCBib29sZWFuIGZyb21NZXNzYWdlQm9keVByb3ZpZGVycykgeworICAgICAgICAgICAgdGhpcy5kZXJpdmVkID0gZnJvbU1lc3NhZ2VCb2R5UHJvdmlkZXJzOworICAgICAgICAgICAgdGhpcy5tZWRpYVR5cGUgPSBtZWRpYVR5cGU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBuZXcgaW5zdGFuY2Ugd2l0aCB7QGNvZGUgbWVkaWFUeXBlfSB3aGljaCB3YXMgb2J0YWluZWQgZnJvbSB1c2VyCisgICAgICAgICAqIGFubm90YXRpb25zIHtAbGluayBDb25zdW1lc30gb3Ige0BsaW5rIFByb2R1Y2VzfS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG1lZGlhVHlwZVZhbHVlIFRoZSBzdHJpbmcgbWVkaWEgdHlwZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBFZmZlY3RpdmVNZWRpYVR5cGUoU3RyaW5nIG1lZGlhVHlwZVZhbHVlKSB7CisgICAgICAgICAgICB0aGlzKE1lZGlhVHlwZS52YWx1ZU9mKG1lZGlhVHlwZVZhbHVlKSwgZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgbmV3IGluc3RhbmNlIHdpdGgge0Bjb2RlIG1lZGlhVHlwZX0gd2hpY2ggd2FzIG9idGFpbmVkIGZyb20gdXNlcgorICAgICAgICAgKiBhbm5vdGF0aW9ucyB7QGxpbmsgQ29uc3VtZXN9IG9yIHtAbGluayBQcm9kdWNlc30uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBtZWRpYVR5cGUgVGhlIG1lZGlhIHR5cGUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgRWZmZWN0aXZlTWVkaWFUeXBlKE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHRoaXMobWVkaWFUeXBlLCBmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIFR5cGUgb2Yge0BsaW5rIE1lZGlhVHlwZX0gd2FzIG9yaWdpbmFsbHkgIGRlZmluZWQgYXMgd2lsZGNhcmQuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gUmV0dXJucyB0cnVlIGlmIG1ldGhvZCB7QGxpbmsgQ29uc3VtZXN9IG9yIHtAbGluayBQcm9kdWNlc30gd2FzCisgICAgICAgICAqIGFubm90YXRlZCB3aXRoIHdpbGRjYXJkIHR5cGUgKGZvciBleGFtcGxlICcqJiM0NzsqJykuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dpbGRjYXJkVHlwZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtZWRpYVR5cGUuaXNXaWxkY2FyZFR5cGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIFRydWUgaWYgU3ViVHlwZSBvZiB7QGxpbmsgTWVkaWFUeXBlfSB3YXMgb3JpZ2luYWxseSBkZWZpbmVkIGFzIHdpbGRjYXJkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFJldHVybnMgdHJ1ZSBpZiBtZXRob2Qge0BsaW5rIENvbnN1bWVzfSBvciB7QGxpbmsgUHJvZHVjZXN9IHdhcworICAgICAgICAgKiBhbm5vdGF0ZWQgd2l0aCB3aWxkY2FyZCBzdWJ0eXBlIChmb3IgZXhhbXBsZSAndGV4dCYjNDc7KicpLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXaWxkY2FyZFN1YlR5cGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbWVkaWFUeXBlLmlzV2lsZGNhcmRTdWJ0eXBlKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB7QGxpbmsgTWVkaWFUeXBlfS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBNZWRpYSB0eXBlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE1lZGlhVHlwZSBnZXRNZWRpYVR5cGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbWVkaWFUeXBlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybiBmbGFnIHZhbHVlIHdoZXRoZXIgdGhlIHtAY29kZSBNZWRpYVR5cGV9IHdhcyBub3QgZGVmaW5lZCBieSBhbm5vdGF0aW9uIGFuZCB0aGVyZWZvcmUgd2FzIGRlcml2ZWQgZnJvbQorICAgICAgICAgKiBNZXNzYWdlIEJvZHkgUHJvdmlkZXJzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUge0Bjb2RlIE1lZGlhVHlwZX0gd2FzIG5vdCBkZWZpbmVkIGJ5IGFubm90YXRpb24gYW5kIHRoZXJlZm9yZSB3YXMgZGVyaXZlZCBmcm9tCisgICAgICAgICAqIE1lc3NhZ2UgQm9keSBQcm92aWRlcnMsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbGVhbiBpc0Rlcml2ZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gZGVyaXZlZDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIm1lZGlhVHlwZT1bJXNdLCBmcm9tUHJvdmlkZXJzPSViIiwgbWVkaWFUeXBlLCBkZXJpdmVkKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIGlmICh0aGlzID09IG8pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBFZmZlY3RpdmVNZWRpYVR5cGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBFZmZlY3RpdmVNZWRpYVR5cGUgdGhhdCA9IChFZmZlY3RpdmVNZWRpYVR5cGUpIG87CisKKyAgICAgICAgICAgIHJldHVybiBkZXJpdmVkID09IHRoYXQuZGVyaXZlZCAmJiBtZWRpYVR5cGUuZXF1YWxzKHRoYXQubWVkaWFUeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgaW50IHJlc3VsdCA9IChkZXJpdmVkID8gMSA6IDApOworICAgICAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyBtZWRpYVR5cGUuaGFzaENvZGUoKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3JvdXRpbmcvTG9jYXRvclJvdXRpbmcuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3JvdXRpbmcvTG9jYXRvclJvdXRpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWE2OWRlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvcm91dGluZy9Mb2NhdG9yUm91dGluZy5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLnJvdXRpbmc7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNb2RlbDsKKworLyoqCisgKiBBIHBhaXIgb2Ygc3ViLXJlc291cmNlIGxvY2F0b3IgbW9kZWwgYW5kIGEgY29ycmVzcG9uZGluZyBtb2RlbCByb3V0ZXIuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK2ZpbmFsIGNsYXNzIExvY2F0b3JSb3V0aW5nIHsKKworICAgIC8qKgorICAgICAqIFN1Yi1yZXNvdXJjZSBsb2NhdG9yIG1vZGVsLgorICAgICAqLworICAgIGZpbmFsIFJlc291cmNlTW9kZWwgbG9jYXRvcjsKKworICAgIC8qKgorICAgICAqIFN1Yi1yZXNvdXJjZSBsb2NhdG9yIHJvdXRlci4KKyAgICAgKi8KKyAgICBmaW5hbCBSb3V0ZXIgcm91dGVyOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIGxvY2F0b3IgIHN1Yi1yZXNvdXJjZSBsb2NhdG9yIG1vZGVsLgorICAgICAqIEBwYXJhbSByb3V0ZXIgcm91dGVyIHRoYXQgaXMgbmVlZGVkIHRvIGV4ZWN1dGUgdGhlIHtAY29kZSBtb2RlbH0uCisgICAgICovCisgICAgTG9jYXRvclJvdXRpbmcoZmluYWwgUmVzb3VyY2VNb2RlbCBsb2NhdG9yLCBmaW5hbCBSb3V0ZXIgcm91dGVyKSB7CisgICAgICAgIHRoaXMubG9jYXRvciA9IGxvY2F0b3I7CisgICAgICAgIHRoaXMucm91dGVyID0gcm91dGVyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3JvdXRpbmcvTWF0Y2hSZXN1bHRJbml0aWFsaXplclJvdXRlci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvcm91dGluZy9NYXRjaFJlc3VsdEluaXRpYWxpemVyUm91dGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk4NDNmNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3JvdXRpbmcvTWF0Y2hSZXN1bHRJbml0aWFsaXplclJvdXRlci5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLnJvdXRpbmc7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwucHJvY2Vzcy5SZXF1ZXN0UHJvY2Vzc2luZ0NvbnRleHQ7CisKKy8qKgorICogUmVxdWVzdCBtYXRjaGluZyBib290c3RyYXBwaW5nIHN0YWdlIHRoYXQgcHVzaGVzIHRoZSB3aG9sZSByZXF1ZXN0IHBhdGggdG8gdGhlIHJvdXRpbmcKKyAqIGNvbnRleHQgYXMgYSByaWdodC1oYW5kIHBhdGggdG8gYmUgbWF0Y2hlZC4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitmaW5hbCBjbGFzcyBNYXRjaFJlc3VsdEluaXRpYWxpemVyUm91dGVyIGltcGxlbWVudHMgUm91dGVyIHsKKworICAgIHByaXZhdGUgZmluYWwgUm91dGVyIHJvb3RSb3V0ZXI7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgbWF0Y2ggcmVzdWx0IGluaXRpYWxpemVyLgorICAgICAqCisgICAgICogQHBhcmFtIHJvb3RSb3V0ZXIgcm9vdCByb3V0ZXIuCisgICAgICovCisgICAgTWF0Y2hSZXN1bHRJbml0aWFsaXplclJvdXRlcihSb3V0ZXIgcm9vdFJvdXRlcikgeworICAgICAgICB0aGlzLnJvb3RSb3V0ZXIgPSByb290Um91dGVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb250aW51YXRpb24gYXBwbHkoZmluYWwgUmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0IHByb2Nlc3NpbmdDb250ZXh0KSB7CisgICAgICAgIGZpbmFsIFJvdXRpbmdDb250ZXh0IHJjID0gcHJvY2Vzc2luZ0NvbnRleHQucm91dGluZ0NvbnRleHQoKTsKKyAgICAgICAgcmMucHVzaE1hdGNoUmVzdWx0KG5ldyBTaW5nbGVNYXRjaFJlc3VsdCgiLyIgKyBwcm9jZXNzaW5nQ29udGV4dC5yZXF1ZXN0KCkuZ2V0UGF0aChmYWxzZSkpKTsKKworICAgICAgICByZXR1cm4gQ29udGludWF0aW9uLm9mKHByb2Nlc3NpbmdDb250ZXh0LCByb290Um91dGVyKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9yb3V0aW5nL01hdGNoZWRFbmRwb2ludEV4dHJhY3RvclN0YWdlLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9yb3V0aW5nL01hdGNoZWRFbmRwb2ludEV4dHJhY3RvclN0YWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAwOWJlNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3JvdXRpbmcvTWF0Y2hlZEVuZHBvaW50RXh0cmFjdG9yU3RhZ2UuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5yb3V0aW5nOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5pbnRlcm5hbC5TdGFnZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLmludGVybmFsLlN0YWdlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwucHJvY2Vzcy5FbmRwb2ludDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwucHJvY2Vzcy5SZXF1ZXN0UHJvY2Vzc2luZ0NvbnRleHQ7CisKKy8qKgorICogUmVxdWVzdCBwcmUtcHJvY2Vzc2luZyBzdGFnZSB0aGF0IHtAbGluayBSb3V0aW5nQ29udGV4dCNnZXRFbmRwb2ludCgpIGV4dHJhY3RzCisgKiBhbiBpbmZsZWN0b3IgZnJvbSBhIHJvdXRpbmcgY29udGV4dH0gd2hlcmUgaXQgd2FzIHByZXZpb3VzbHkgc3RvcmVkIGJ5IHRoZQorICoge0BsaW5rIFJvdXRpbmdTdGFnZSByZXF1ZXN0IHRvIHJlc291cmNlIG1hdGNoaW5nIHN0YWdlfSBhbmQKKyAqIChpZiBhdmFpbGFibGUpIHJldHVybnMgdGhlIGluZmxlY3RvciB3cmFwcGVkIGluIGEgbmV4dCB0ZXJtaW5hbCBzdGFnZS4KKyAqCisgKiBUaGlzIHJlcXVlc3QgcHJlLXByb2Nlc3Npbmcgc3RhZ2Ugc2hvdWxkIGJlIGEgZmluYWwgc3RhZ2UgaW4gdGhlIHJlcXVlc3QKKyAqIHByb2Nlc3NpbmcgY2hhaW4uCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqIEBzZWUgUm91dGluZ1N0YWdlCisgKi8KK2ZpbmFsIGNsYXNzIE1hdGNoZWRFbmRwb2ludEV4dHJhY3RvclN0YWdlIGltcGxlbWVudHMgU3RhZ2U8UmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0PiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29udGludWF0aW9uPFJlcXVlc3RQcm9jZXNzaW5nQ29udGV4dD4gYXBwbHkoZmluYWwgUmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0IHByb2Nlc3NpbmdDb250ZXh0KSB7CisgICAgICAgIGZpbmFsIEVuZHBvaW50IGVuZHBvaW50ID0KKyAgICAgICAgICAgICAgICBwcm9jZXNzaW5nQ29udGV4dC5yb3V0aW5nQ29udGV4dCgpLmdldEVuZHBvaW50KCk7CisKKyAgICAgICAgcmV0dXJuIGVuZHBvaW50ICE9IG51bGwKKyAgICAgICAgICAgICAgICA/IENvbnRpbnVhdGlvbi5vZihwcm9jZXNzaW5nQ29udGV4dCwgU3RhZ2VzLmFzU3RhZ2UoZW5kcG9pbnQpKQorICAgICAgICAgICAgICAgIDogQ29udGludWF0aW9uLm9mKHByb2Nlc3NpbmdDb250ZXh0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9yb3V0aW5nL01ldGhvZFJvdXRpbmcuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3JvdXRpbmcvTWV0aG9kUm91dGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmMDViMDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9yb3V0aW5nL01ldGhvZFJvdXRpbmcuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5yb3V0aW5nOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1ldGhvZDsKKworLyoqCisgKiBBIGNvbWJpbmF0aW9uIG9mIGEgcmVzb3VyY2UgbWV0aG9kIG1vZGVsIGFuZCB0aGUgY29ycmVzcG9uZGluZyByb3V0ZXJzLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK2ZpbmFsIGNsYXNzIE1ldGhvZFJvdXRpbmcgeworCisgICAgLyoqCisgICAgICogUmVzb3VyY2UgbWV0aG9kIG1vZGVsLgorICAgICAqLworICAgIGZpbmFsIFJlc291cmNlTWV0aG9kIG1ldGhvZDsKKworICAgIC8qKgorICAgICAqIFJlc291cmNlIG1ldGhvZCByb3V0ZXJzLgorICAgICAqLworICAgIGZpbmFsIExpc3Q8Um91dGVyPiByb3V0ZXJzOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIG1ldGhvZCAgUmVzb3VyY2UgbWV0aG9kIGhhbmRsZXIuCisgICAgICogQHBhcmFtIHJvdXRlcnMgUm91dGVycyB0aGF0IGFyZSBuZWVkZWQgdG8gZXhlY3V0ZSB0aGUge0Bjb2RlIG1vZGVsfS4gVGhlc2Ugcm91dGVycyBzaG91bGQgY29udGFpbiBhCisgICAgICogICAgICAgICAgICAgICAge0BsaW5rIFJvdXRlcnMjZW5kcG9pbnQob3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLnByb2Nlc3MuRW5kcG9pbnQpIGVuZHBvaW50IHJvdXRlcn0KKyAgICAgKiAgICAgICAgICAgICAgICBhcyB0aGUgKGxhc3QpIHRlcm1pbmFsIHJvdXRlci4KKyAgICAgKi8KKyAgICBNZXRob2RSb3V0aW5nKGZpbmFsIFJlc291cmNlTWV0aG9kIG1ldGhvZCwgZmluYWwgUm91dGVyLi4uIHJvdXRlcnMpIHsKKyAgICAgICAgdGhpcy5tZXRob2QgPSBtZXRob2Q7CisgICAgICAgIHRoaXMucm91dGVycyA9IEFycmF5cy5hc0xpc3Qocm91dGVycyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJ7IiArIG1ldGhvZCArICIgLT4gIiArIHJvdXRlcnMgKyAnfSc7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvcm91dGluZy9NZXRob2RTZWxlY3RpbmdSb3V0ZXIuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3JvdXRpbmcvTWV0aG9kU2VsZWN0aW5nUm91dGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE3ZmE0NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3JvdXRpbmcvTWV0aG9kU2VsZWN0aW5nUm91dGVyLmphdmEKQEAgLTAsMCArMSw3NTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLnJvdXRpbmc7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLklkZW50aXR5SGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkh0dHBNZXRob2Q7CitpbXBvcnQgamF2YXgud3MucnMuTm90QWNjZXB0YWJsZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5Ob3RBbGxvd2VkRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLk5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2UuU3RhdHVzOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmEuUHJpbWl0aXZlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLk1lc3NhZ2VCb2R5V29ya2VyczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLlJlYWRlck1vZGVsOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuV3JpdGVyTW9kZWw7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5BY2NlcHRhYmxlTWVkaWFUeXBlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuTWVkaWFUeXBlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVzcG9uc2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5wcm9jZXNzLlJlcXVlc3RQcm9jZXNzaW5nQ29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuSW52b2NhYmxlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5QYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTWV0aG9kOworCisvKioKKyAqIEEgc2luZ2xlIHJvdXRlciByZXNwb25zaWJsZSBmb3Igc2VsZWN0aW5nIGEgc2luZ2xlIG1ldGhvZCBmcm9tIGFsbCB0aGUgbWV0aG9kcworICogYm91bmQgdG8gdGhlIHNhbWUgcm91dGVkIHJlcXVlc3QgcGF0aC4KKyAqCisgKiBUaGUgbWV0aG9kIHNlbGVjdGlvbiBhbGdvcml0aG0gc2VsZWN0cyB0aGUgaGFuZGxpbmcgbWV0aG9kIGJhc2VkIG9uIHRoZSBIVFRQIHJlcXVlc3QKKyAqIG1ldGhvZCBuYW1lLCByZXF1ZXN0ZWQgbWVkaWEgdHlwZSBhcyB3ZWxsIGFzIGRlZmluZWQgcmVzb3VyY2UgbWV0aG9kIG1lZGlhIHR5cGUKKyAqIGNhcGFiaWxpdGllcy4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworZmluYWwgY2xhc3MgTWV0aG9kU2VsZWN0aW5nUm91dGVyIGltcGxlbWVudHMgUm91dGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKE1ldGhvZFNlbGVjdGluZ1JvdXRlci5jbGFzcy5nZXROYW1lKCkpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxDb25zdW1lc1Byb2R1Y2VzQWNjZXB0b3I+IENPTlNVTUVTX1BST0RVQ0VTX0FDQ0VQVE9SX0NPTVBBUkFUT1IgPQorICAgICAgICAgICAgbmV3IENvbXBhcmF0b3I8Q29uc3VtZXNQcm9kdWNlc0FjY2VwdG9yPigpIHsKKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShmaW5hbCBDb25zdW1lc1Byb2R1Y2VzQWNjZXB0b3IgbzEsIGZpbmFsIENvbnN1bWVzUHJvZHVjZXNBY2NlcHRvciBvMikgeworICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBhbm5vdGF0ZWQgKEBDb25zdW1lcywgQFByb2R1Y2VzKSBnb2VzIGZpcnN0LgorICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZU1ldGhvZCBtb2RlbDEgPSBvMS5tZXRob2RSb3V0aW5nLm1ldGhvZDsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VNZXRob2QgbW9kZWwyID0gbzIubWV0aG9kUm91dGluZy5tZXRob2Q7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gQENvbnN1bWVzIG9uIG1ldGhvZC4KKyAgICAgICAgICAgICAgICAgICAgaW50IGNvbXBhcmVkID0gY29tcGFyZShtb2RlbDEuZ2V0Q29uc3VtZWRUeXBlcygpLCBtb2RlbDIuZ2V0Q29uc3VtZWRUeXBlcygpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBhcmVkICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wYXJlZDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVkID0gY29tcGFyZShtb2RlbDEuZ2V0UHJvZHVjZWRUeXBlcygpLCBtb2RlbDIuZ2V0UHJvZHVjZWRUeXBlcygpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBhcmVkICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wYXJlZDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNvbXBhcmVkID0gTWVkaWFUeXBlcy5QQVJUSUFMX09SREVSX0NPTVBBUkFUT1IuY29tcGFyZShvMS5jb25zdW1lcy5nZXRNZWRpYVR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvMi5jb25zdW1lcy5nZXRNZWRpYVR5cGUoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb21wYXJlZCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcGFyZWQ7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWVkaWFUeXBlcy5QQVJUSUFMX09SREVSX0NPTVBBUkFUT1IuY29tcGFyZShvMS5wcm9kdWNlcy5nZXRNZWRpYVR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvMi5wcm9kdWNlcy5nZXRNZWRpYVR5cGUoKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcHJpdmF0ZSBpbnQgY29tcGFyZShMaXN0PE1lZGlhVHlwZT4gbWVkaWFUeXBlTGlzdDEsIExpc3Q8TWVkaWFUeXBlPiBtZWRpYVR5cGVMaXN0MikgeworICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGVMaXN0MSA9IG1lZGlhVHlwZUxpc3QxLmlzRW1wdHkoKSA/IE1lZGlhVHlwZXMuV0lMRENBUkRfVFlQRV9TSU5HTEVUT05fTElTVCA6IG1lZGlhVHlwZUxpc3QxOworICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGVMaXN0MiA9IG1lZGlhVHlwZUxpc3QyLmlzRW1wdHkoKSA/IE1lZGlhVHlwZXMuV0lMRENBUkRfVFlQRV9TSU5HTEVUT05fTElTVCA6IG1lZGlhVHlwZUxpc3QyOworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBNZWRpYVR5cGVzLk1FRElBX1RZUEVfTElTVF9DT01QQVJBVE9SLmNvbXBhcmUobWVkaWFUeXBlTGlzdDEsIG1lZGlhVHlwZUxpc3QyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgcHJpdmF0ZSBmaW5hbCBNZXNzYWdlQm9keVdvcmtlcnMgd29ya2VyczsKKworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgTGlzdDxDb25zdW1lc1Byb2R1Y2VzQWNjZXB0b3I+PiBjb25zdW1lc1Byb2R1Y2VzQWNjZXB0b3JzOworICAgIHByaXZhdGUgZmluYWwgUm91dGVyIHJvdXRlcjsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyB7QGNvZGUgTWV0aG9kU2VsZWN0aW5nUm91dGVyfSBmb3IgYWxsIHRoZSBtZXRob2RzIG9uIHRoZSBzYW1lIHBhdGguCisgICAgICoKKyAgICAgKiBUaGUgcm91dGVyIHNlbGVjdHMgdGhlIG1ldGhvZCB0aGF0IGJlc3QgbWF0Y2hlcyB0aGUgcmVxdWVzdCBiYXNlZCBvbgorICAgICAqIHByb2R1Y2UvY29uc3VtZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSByZXNvdXJjZSBtZXRob2QgbW9kZWxzLgorICAgICAqCisgICAgICogQHBhcmFtIHdvcmtlcnMgICAgICAgIG1lc3NhZ2UgYm9keSB3b3JrZXJzLgorICAgICAqIEBwYXJhbSBtZXRob2RSb3V0aW5ncyBbbWV0aG9kIG1vZGVsLCBtZXRob2QgbWV0aG9kQWNjZXB0b3JQYWlyXSBwYWlycy4KKyAgICAgKi8KKyAgICBNZXRob2RTZWxlY3RpbmdSb3V0ZXIoTWVzc2FnZUJvZHlXb3JrZXJzIHdvcmtlcnMsIExpc3Q8TWV0aG9kUm91dGluZz4gbWV0aG9kUm91dGluZ3MpIHsKKyAgICAgICAgdGhpcy53b3JrZXJzID0gd29ya2VyczsKKworICAgICAgICB0aGlzLmNvbnN1bWVzUHJvZHVjZXNBY2NlcHRvcnMgPSBuZXcgSGFzaE1hcDw+KCk7CisKKyAgICAgICAgZmluYWwgU2V0PFN0cmluZz4gaHR0cE1ldGhvZHMgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgIGZvciAoZmluYWwgTWV0aG9kUm91dGluZyBtZXRob2RSb3V0aW5nIDogbWV0aG9kUm91dGluZ3MpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBodHRwTWV0aG9kID0gbWV0aG9kUm91dGluZy5tZXRob2QuZ2V0SHR0cE1ldGhvZCgpOworICAgICAgICAgICAgaHR0cE1ldGhvZHMuYWRkKGh0dHBNZXRob2QpOworCisgICAgICAgICAgICBMaXN0PENvbnN1bWVzUHJvZHVjZXNBY2NlcHRvcj4gaHR0cE1ldGhvZEJvdW5kQWNjZXB0b3JzID0gY29uc3VtZXNQcm9kdWNlc0FjY2VwdG9ycy5nZXQoaHR0cE1ldGhvZCk7CisgICAgICAgICAgICBpZiAoaHR0cE1ldGhvZEJvdW5kQWNjZXB0b3JzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBodHRwTWV0aG9kQm91bmRBY2NlcHRvcnMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgICAgICAgICAgY29uc3VtZXNQcm9kdWNlc0FjY2VwdG9ycy5wdXQoaHR0cE1ldGhvZCwgaHR0cE1ldGhvZEJvdW5kQWNjZXB0b3JzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYWRkQWxsQ29uc3VtZXNQcm9kdWNlc0NvbWJpbmF0aW9ucyhodHRwTWV0aG9kQm91bmRBY2NlcHRvcnMsIG1ldGhvZFJvdXRpbmcpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU29ydCBhY2NlcHRvcnMgZm9yIGFkZGVkIEhUVFAgbWV0aG9kcyAtIHByaW1hcnkgYmFzZWQgb24gQENvbnN1bWVzLCBAUHJvZHVjZXMgcHJlc2VudCBvbiBtZXRob2QsIHNlY29uZGFyeSBvbiBjb25zdW1lcywKKyAgICAgICAgLy8gcHJvZHVjZXMgdmFsdWVzIG9mIHRoZSBhY2NlcHRvci4KKyAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgaHR0cE1ldGhvZCA6IGh0dHBNZXRob2RzKSB7CisgICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGNvbnN1bWVzUHJvZHVjZXNBY2NlcHRvcnMuZ2V0KGh0dHBNZXRob2QpLCBDT05TVU1FU19QUk9EVUNFU19BQ0NFUFRPUl9DT01QQVJBVE9SKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghY29uc3VtZXNQcm9kdWNlc0FjY2VwdG9ycy5jb250YWluc0tleShIdHRwTWV0aG9kLkhFQUQpKSB7CisgICAgICAgICAgICB0aGlzLnJvdXRlciA9IGNyZWF0ZUhlYWRFbnJpY2hlZFJvdXRlcigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5yb3V0ZXIgPSBjcmVhdGVJbnRlcm5hbFJvdXRlcigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcmVzZW50cyBhIDEtMS0xIHJlbGF0aW9uIGJldHdlZW4gaW5wdXQgYW5kIG91dHB1dCBtZWRpYSB0eXBlIGFuZCBhbiBtZXRob2RBY2NlcHRvclBhaXIuCisgICAgICogPHA+RS5nLiBmb3IgYSBzaW5nbGUgcmVzb3VyY2UgbWV0aG9kCisgICAgICogPHByZT4KKyAgICAgKiAgICYjMDY0O0NvbnN1bWVzKCImIzA0MjsvJiMwNDI7IikKKyAgICAgKiAgICYjMDY0O1Byb2R1Y2VzKCJ0ZXh0L3BsYWluIiwidGV4dC9odG1sIikKKyAgICAgKiAgICYjMDY0O0dFVAorICAgICAqICAgcHVibGljIFN0cmluZyBteUdldE1ldGhvZCgpIHsKKyAgICAgKiAgICAgcmV0dXJuICJTIjsKKyAgICAgKiAgIH0KKyAgICAgKiA8L3ByZT4KKyAgICAgKiB0aGUgZm9sbG93aW5nIHR3byByZWxhdGlvbnMgd291bGQgYmUgZ2VuZXJhdGVkOgorICAgICAqIDx0YWJsZT4KKyAgICAgKiA8dHI+CisgICAgICogPHRoPmNvbnN1bWVzPC90aD4KKyAgICAgKiA8dGg+cHJvZHVjZXM8L3RoPgorICAgICAqIDx0aD5tZXRob2Q8L3RoPgorICAgICAqIDwvdHI+CisgICAgICogPHRyPgorICAgICAqIDx0ZD4mIzA0MjsvJiMwNDI7PC90ZD4KKyAgICAgKiA8dGQ+dGV4dC9wbGFpbjwvdGQ+CisgICAgICogPHRkPm15R2V0TWV0aG9kPC90ZD4KKyAgICAgKiA8L3RkPgorICAgICAqIDwvdHI+CisgICAgICogPHRyPgorICAgICAqIDx0ZD4mIzA0MjsvJiMwNDI7PC90ZD4KKyAgICAgKiA8dGQ+dGV4dC9odG1sPC90ZD4KKyAgICAgKiA8dGQ+bXlHZXRNZXRob2Q8L3RkPgorICAgICAqIDwvdGQ+CisgICAgICogPC90cj4KKyAgICAgKiA8L3RhYmxlPgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENvbnN1bWVzUHJvZHVjZXNBY2NlcHRvciB7CisKKyAgICAgICAgZmluYWwgQ29tYmluZWRNZWRpYVR5cGUuRWZmZWN0aXZlTWVkaWFUeXBlIGNvbnN1bWVzOworICAgICAgICBmaW5hbCBDb21iaW5lZE1lZGlhVHlwZS5FZmZlY3RpdmVNZWRpYVR5cGUgcHJvZHVjZXM7CisgICAgICAgIGZpbmFsIE1ldGhvZFJvdXRpbmcgbWV0aG9kUm91dGluZzsKKworICAgICAgICBwcml2YXRlIENvbnN1bWVzUHJvZHVjZXNBY2NlcHRvcigKKyAgICAgICAgICAgICAgICBDb21iaW5lZE1lZGlhVHlwZS5FZmZlY3RpdmVNZWRpYVR5cGUgY29uc3VtZXMsCisgICAgICAgICAgICAgICAgQ29tYmluZWRNZWRpYVR5cGUuRWZmZWN0aXZlTWVkaWFUeXBlIHByb2R1Y2VzLAorICAgICAgICAgICAgICAgIE1ldGhvZFJvdXRpbmcgbWV0aG9kUm91dGluZykgeworICAgICAgICAgICAgdGhpcy5tZXRob2RSb3V0aW5nID0gbWV0aG9kUm91dGluZzsKKyAgICAgICAgICAgIHRoaXMuY29uc3VtZXMgPSBjb25zdW1lczsKKyAgICAgICAgICAgIHRoaXMucHJvZHVjZXMgPSBwcm9kdWNlczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhpcyB7QGNvZGUgQ29uc3VtZXNQcm9kdWNlc0FjY2VwdG9yfSByb3V0ZXIgY2FuIHByb2Nlc3MgdGhlIHtAY29kZSByZXF1ZXN0fS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHJlcXVlc3RDb250ZXh0IFRoZSByZXF1ZXN0IHRvIGJlIHRlc3RlZC4KKyAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSB7QGNvZGUgcmVxdWVzdH0gY2FuIGJlIHByb2Nlc3NlZCBieSB0aGlzIHJvdXRlciwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbGVhbiBpc0NvbnN1bWFibGUoQ29udGFpbmVyUmVxdWVzdCByZXF1ZXN0Q29udGV4dCkgeworICAgICAgICAgICAgTWVkaWFUeXBlIGNvbnRlbnRUeXBlID0gcmVxdWVzdENvbnRleHQuZ2V0TWVkaWFUeXBlKCk7CisgICAgICAgICAgICByZXR1cm4gY29udGVudFR5cGUgPT0gbnVsbCB8fCBjb25zdW1lcy5nZXRNZWRpYVR5cGUoKS5pc0NvbXBhdGlibGUoY29udGVudFR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJXMtPiVzOiVzIiwgY29uc3VtZXMuZ2V0TWVkaWFUeXBlKCksIHByb2R1Y2VzLmdldE1lZGlhVHlwZSgpLCBtZXRob2RSb3V0aW5nKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygiUmVkdW5kYW50SWZTdGF0ZW1lbnQiKQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIGlmICh0aGlzID09IG8pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBDb25zdW1lc1Byb2R1Y2VzQWNjZXB0b3IpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBDb25zdW1lc1Byb2R1Y2VzQWNjZXB0b3IgdGhhdCA9IChDb25zdW1lc1Byb2R1Y2VzQWNjZXB0b3IpIG87CisKKyAgICAgICAgICAgIGlmIChjb25zdW1lcyAhPSBudWxsID8gIWNvbnN1bWVzLmVxdWFscyh0aGF0LmNvbnN1bWVzKSA6IHRoYXQuY29uc3VtZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtZXRob2RSb3V0aW5nICE9IG51bGwgPyAhbWV0aG9kUm91dGluZy5lcXVhbHModGhhdC5tZXRob2RSb3V0aW5nKSA6IHRoYXQubWV0aG9kUm91dGluZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHByb2R1Y2VzICE9IG51bGwgPyAhcHJvZHVjZXMuZXF1YWxzKHRoYXQucHJvZHVjZXMpIDogdGhhdC5wcm9kdWNlcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgaW50IHJlc3VsdCA9IGNvbnN1bWVzICE9IG51bGwgPyBjb25zdW1lcy5oYXNoQ29kZSgpIDogMDsKKyAgICAgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgKHByb2R1Y2VzICE9IG51bGwgPyBwcm9kdWNlcy5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIChtZXRob2RSb3V0aW5nICE9IG51bGwgPyBtZXRob2RSb3V0aW5nLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgc2FtZSBhcyBhYm92ZSBDb25zdW1lc1Byb2R1Y2VzQWNjZXB0b3IsCisgICAgICogb25seSBjb25jcmV0ZSByZXF1ZXN0IGNvbnRlbnQtdHlwZSBhbmQgYWNjZXB0IGhlYWRlciBpbmZvIGlzIGluY2x1ZGVkIGluIGFkZGl0aW9uLgorICAgICAqCisgICAgICogQHNlZSBDb21iaW5lZE1lZGlhVHlwZQorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJDb21wYXJhYmxlSW1wbGVtZW50ZWRCdXRFcXVhbHNOb3RPdmVycmlkZGVuIikKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXF1ZXN0U3BlY2lmaWNDb25zdW1lc1Byb2R1Y2VzQWNjZXB0b3IgaW1wbGVtZW50cyBDb21wYXJhYmxlIHsKKworICAgICAgICBmaW5hbCBDb21iaW5lZE1lZGlhVHlwZSBjb25zdW1lczsKKyAgICAgICAgZmluYWwgQ29tYmluZWRNZWRpYVR5cGUgcHJvZHVjZXM7CisgICAgICAgIGZpbmFsIE1ldGhvZFJvdXRpbmcgbWV0aG9kUm91dGluZzsKKworICAgICAgICBmaW5hbCBib29sZWFuIHByb2R1Y2VzRnJvbVByb3ZpZGVyczsKKworICAgICAgICBSZXF1ZXN0U3BlY2lmaWNDb25zdW1lc1Byb2R1Y2VzQWNjZXB0b3IoZmluYWwgQ29tYmluZWRNZWRpYVR5cGUgY29uc3VtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb21iaW5lZE1lZGlhVHlwZSBwcm9kdWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcHJvZHVjZXNGcm9tUHJvdmlkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWV0aG9kUm91dGluZyBtZXRob2RSb3V0aW5nKSB7CisKKyAgICAgICAgICAgIHRoaXMubWV0aG9kUm91dGluZyA9IG1ldGhvZFJvdXRpbmc7CisgICAgICAgICAgICB0aGlzLmNvbnN1bWVzID0gY29uc3VtZXM7CisgICAgICAgICAgICB0aGlzLnByb2R1Y2VzID0gcHJvZHVjZXM7CisKKyAgICAgICAgICAgIHRoaXMucHJvZHVjZXNGcm9tUHJvdmlkZXJzID0gcHJvZHVjZXNGcm9tUHJvdmlkZXJzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJXMtPiVzOiVzIiwgY29uc3VtZXMsIHByb2R1Y2VzLCBtZXRob2RSb3V0aW5nKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhPYmplY3QgbykgeworICAgICAgICAgICAgaWYgKG8gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBSZXF1ZXN0U3BlY2lmaWNDb25zdW1lc1Byb2R1Y2VzQWNjZXB0b3IpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUmVxdWVzdFNwZWNpZmljQ29uc3VtZXNQcm9kdWNlc0FjY2VwdG9yIG90aGVyID0gKFJlcXVlc3RTcGVjaWZpY0NvbnN1bWVzUHJvZHVjZXNBY2NlcHRvcikgbzsKKyAgICAgICAgICAgIGZpbmFsIGludCBjb25zdW1lZENvbXBhcmlzb24gPSBDb21iaW5lZE1lZGlhVHlwZS5DT01QQVJBVE9SLmNvbXBhcmUoY29uc3VtZXMsIG90aGVyLmNvbnN1bWVzKTsKKyAgICAgICAgICAgIHJldHVybiAoY29uc3VtZWRDb21wYXJpc29uICE9IDApCisgICAgICAgICAgICAgICAgICAgID8gY29uc3VtZWRDb21wYXJpc29uIDogQ29tYmluZWRNZWRpYVR5cGUuQ09NUEFSQVRPUi5jb21wYXJlKHByb2R1Y2VzLCBvdGhlci5wcm9kdWNlcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgY2xhc3MgdG8gc2VsZWN0IG1hdGNoaW5nIHJlc291cmNlIG1ldGhvZCB0byBiZSBpbnZva2VkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE1ldGhvZFNlbGVjdG9yIHsKKworICAgICAgICBSZXF1ZXN0U3BlY2lmaWNDb25zdW1lc1Byb2R1Y2VzQWNjZXB0b3Igc2VsZWN0ZWQ7CisgICAgICAgIExpc3Q8UmVxdWVzdFNwZWNpZmljQ29uc3VtZXNQcm9kdWNlc0FjY2VwdG9yPiBzYW1lRml0bmVzc0FjY2VwdG9yczsKKworICAgICAgICBNZXRob2RTZWxlY3RvcihSZXF1ZXN0U3BlY2lmaWNDb25zdW1lc1Byb2R1Y2VzQWNjZXB0b3IgaSkgeworICAgICAgICAgICAgc2VsZWN0ZWQgPSBpOworICAgICAgICAgICAgc2FtZUZpdG5lc3NBY2NlcHRvcnMgPSBudWxsOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBjb25zaWRlcihSZXF1ZXN0U3BlY2lmaWNDb25zdW1lc1Byb2R1Y2VzQWNjZXB0b3IgaSkgeworICAgICAgICAgICAgZmluYWwgaW50IHRoZUxlc3NUaGVCZXR0ZXIgPSBpLmNvbXBhcmVUbyhzZWxlY3RlZCk7CisgICAgICAgICAgICBpZiAodGhlTGVzc1RoZUJldHRlciA8IDApIHsKKyAgICAgICAgICAgICAgICBzZWxlY3RlZCA9IGk7CisgICAgICAgICAgICAgICAgc2FtZUZpdG5lc3NBY2NlcHRvcnMgPSBudWxsOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAodGhlTGVzc1RoZUJldHRlciA9PSAwICYmIChzZWxlY3RlZC5tZXRob2RSb3V0aW5nICE9IGkubWV0aG9kUm91dGluZykpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0U2FtZUZpdG5lc3NMaXN0KCkuYWRkKGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIExpc3Q8UmVxdWVzdFNwZWNpZmljQ29uc3VtZXNQcm9kdWNlc0FjY2VwdG9yPiBnZXRTYW1lRml0bmVzc0xpc3QoKSB7CisgICAgICAgICAgICBpZiAoc2FtZUZpdG5lc3NBY2NlcHRvcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNhbWVGaXRuZXNzQWNjZXB0b3JzID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHNhbWVGaXRuZXNzQWNjZXB0b3JzOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBSb3V0ZXIgY3JlYXRlSW50ZXJuYWxSb3V0ZXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgUm91dGVyKCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBDb250aW51YXRpb24gYXBwbHkoUmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENvbnRpbnVhdGlvbi5vZihyZXF1ZXN0Q29udGV4dCwgZ2V0TWV0aG9kUm91dGVyKHJlcXVlc3RDb250ZXh0KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENvbnRpbnVhdGlvbiBhcHBseShSZXF1ZXN0UHJvY2Vzc2luZ0NvbnRleHQgcmVxdWVzdENvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIHJvdXRlci5hcHBseShyZXF1ZXN0Q29udGV4dCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFkZEFsbENvbnN1bWVzUHJvZHVjZXNDb21iaW5hdGlvbnMoZmluYWwgTGlzdDxDb25zdW1lc1Byb2R1Y2VzQWNjZXB0b3I+IGFjY2VwdG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZXRob2RSb3V0aW5nIG1ldGhvZFJvdXRpbmcpIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QgPSBtZXRob2RSb3V0aW5nLm1ldGhvZDsKKworICAgICAgICBmaW5hbCBTZXQ8TWVkaWFUeXBlPiBlZmZlY3RpdmVJbnB1dFR5cGVzID0gbmV3IExpbmtlZEhhc2hTZXQ8PigpOworICAgICAgICBib29sZWFuIGNvbnN1bWVzRnJvbVdvcmtlcnMgPSBmaWxsTWVkaWFUeXBlcyhlZmZlY3RpdmVJbnB1dFR5cGVzLCByZXNvdXJjZU1ldGhvZCwKKyAgICAgICAgICAgICAgICByZXNvdXJjZU1ldGhvZC5nZXRDb25zdW1lZFR5cGVzKCksIHRydWUpOworCisgICAgICAgIGZpbmFsIFNldDxNZWRpYVR5cGU+IGVmZmVjdGl2ZU91dHB1dFR5cGVzID0gbmV3IExpbmtlZEhhc2hTZXQ8PigpOworICAgICAgICBib29sZWFuIHByb2R1Y2VzRnJvbVdvcmtlcnMgPSBmaWxsTWVkaWFUeXBlcyhlZmZlY3RpdmVPdXRwdXRUeXBlcywgcmVzb3VyY2VNZXRob2QsCisgICAgICAgICAgICAgICAgcmVzb3VyY2VNZXRob2QuZ2V0UHJvZHVjZWRUeXBlcygpLCBmYWxzZSk7CisKKyAgICAgICAgZmluYWwgU2V0PENvbnN1bWVzUHJvZHVjZXNBY2NlcHRvcj4gYWNjZXB0b3JTZXQgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgIGZvciAoTWVkaWFUeXBlIGNvbnN1bWVzIDogZWZmZWN0aXZlSW5wdXRUeXBlcykgeworICAgICAgICAgICAgZm9yIChNZWRpYVR5cGUgcHJvZHVjZXMgOiBlZmZlY3RpdmVPdXRwdXRUeXBlcykgeworCisgICAgICAgICAgICAgICAgYWNjZXB0b3JTZXQuYWRkKG5ldyBDb25zdW1lc1Byb2R1Y2VzQWNjZXB0b3IoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ29tYmluZWRNZWRpYVR5cGUuRWZmZWN0aXZlTWVkaWFUeXBlKGNvbnN1bWVzLCBjb25zdW1lc0Zyb21Xb3JrZXJzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb21iaW5lZE1lZGlhVHlwZS5FZmZlY3RpdmVNZWRpYVR5cGUocHJvZHVjZXMsIHByb2R1Y2VzRnJvbVdvcmtlcnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kUm91dGluZykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFjY2VwdG9ycy5hZGRBbGwoYWNjZXB0b3JTZXQpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBmaWxsTWVkaWFUeXBlcyhmaW5hbCBTZXQ8TWVkaWFUeXBlPiBlZmZlY3RpdmVUeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8TWVkaWFUeXBlPiBtZXRob2RUeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpbnB1dFR5cGVzKSB7CisKKyAgICAgICAgLy8gQWRkIG1ldGhvZCB0eXBlcyB0byB0aGUgcmVzdWx0aW5nIGxpc3QgaWZmIHRoZXJlIGlzIG1vcmUgdGhhbiBqdXN0ICovKgorICAgICAgICBpZiAobWV0aG9kVHlwZXMuc2l6ZSgpID4gMSB8fCAhbWV0aG9kVHlwZXMuY29udGFpbnMoTWVkaWFUeXBlLldJTERDQVJEX1RZUEUpKSB7CisgICAgICAgICAgICBlZmZlY3RpdmVUeXBlcy5hZGRBbGwobWV0aG9kVHlwZXMpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBtZWRpYVR5cGVzRnJvbVdvcmtlcnMgPSBlZmZlY3RpdmVUeXBlcy5pc0VtcHR5KCk7CisgICAgICAgIGlmIChtZWRpYVR5cGVzRnJvbVdvcmtlcnMpIHsKKyAgICAgICAgICAgIGZpbmFsIEludm9jYWJsZSBpbnZvY2FibGVNZXRob2QgPSByZXNvdXJjZU1ldGhvZC5nZXRJbnZvY2FibGUoKTsKKworICAgICAgICAgICAgLy8gSWYgbm90IHByZWRlZmluZWQgZnJvbSBtZXRob2QgLSBnZXQgaXQgZnJvbSB3b3JrZXJzLgorICAgICAgICAgICAgaWYgKGlucHV0VHlwZXMpIHsKKyAgICAgICAgICAgICAgICBmaWxsSW5wdXRUeXBlc0Zyb21Xb3JrZXJzKGVmZmVjdGl2ZVR5cGVzLCBpbnZvY2FibGVNZXRob2QpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmaWxsT3V0cHV0VHlwZXNGcm9tV29ya2VycyhlZmZlY3RpdmVUeXBlcywgaW52b2NhYmxlTWV0aG9kLmdldFJhd1Jlc3BvbnNlVHlwZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lZGlhVHlwZXNGcm9tV29ya2VycyA9ICFlZmZlY3RpdmVUeXBlcy5pc0VtcHR5KCk7CisKKyAgICAgICAgICAgIC8vIElmIHN0aWxsIGVtcHR5IC0gZ2V0IGFsbCBhdmFpbGFibGUuCisgICAgICAgICAgICBpZiAoIW1lZGlhVHlwZXNGcm9tV29ya2VycykgeworICAgICAgICAgICAgICAgIGlmIChpbnB1dFR5cGVzKSB7CisgICAgICAgICAgICAgICAgICAgIGVmZmVjdGl2ZVR5cGVzLmFkZEFsbCh3b3JrZXJzLmdldE1lc3NhZ2VCb2R5UmVhZGVyTWVkaWFUeXBlc0J5VHlwZShPYmplY3QuY2xhc3MpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBlZmZlY3RpdmVUeXBlcy5hZGRBbGwod29ya2Vycy5nZXRNZXNzYWdlQm9keVdyaXRlck1lZGlhVHlwZXNCeVR5cGUoT2JqZWN0LmNsYXNzKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1lZGlhVHlwZXNGcm9tV29ya2VycyA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbWVkaWFUeXBlc0Zyb21Xb3JrZXJzOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBmaWxsT3V0cHV0VHlwZXNGcm9tV29ya2VycyhmaW5hbCBTZXQ8TWVkaWFUeXBlPiBlZmZlY3RpdmVPdXRwdXRUeXBlcywgZmluYWwgQ2xhc3M8Pz4gcmV0dXJuRW50aXR5VHlwZSkgeworICAgICAgICBlZmZlY3RpdmVPdXRwdXRUeXBlcy5hZGRBbGwod29ya2Vycy5nZXRNZXNzYWdlQm9keVdyaXRlck1lZGlhVHlwZXNCeVR5cGUocmV0dXJuRW50aXR5VHlwZSkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBmaWxsSW5wdXRUeXBlc0Zyb21Xb3JrZXJzKGZpbmFsIFNldDxNZWRpYVR5cGU+IGVmZmVjdGl2ZUlucHV0VHlwZXMsIGZpbmFsIEludm9jYWJsZSBpbnZvY2FibGVNZXRob2QpIHsKKyAgICAgICAgZm9yIChQYXJhbWV0ZXIgcCA6IGludm9jYWJsZU1ldGhvZC5nZXRQYXJhbWV0ZXJzKCkpIHsKKyAgICAgICAgICAgIGlmIChwLmdldFNvdXJjZSgpID09IFBhcmFtZXRlci5Tb3VyY2UuRU5USVRZKSB7CisgICAgICAgICAgICAgICAgZWZmZWN0aXZlSW5wdXRUeXBlcy5hZGRBbGwod29ya2Vycy5nZXRNZXNzYWdlQm9keVJlYWRlck1lZGlhVHlwZXNCeVR5cGUocC5nZXRSYXdUeXBlKCkpKTsKKworICAgICAgICAgICAgICAgIC8vIHRoZXJlJ3MgYXQgbW9zdCBvbmUgZW50aXR5IHBhcmFtZXRlcgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBQYXJhbWV0ZXIgZ2V0RW50aXR5UGFyYW0oZmluYWwgSW52b2NhYmxlIGludm9jYWJsZSkgeworICAgICAgICBmb3IgKGZpbmFsIFBhcmFtZXRlciBwYXJhbWV0ZXIgOiBpbnZvY2FibGUuZ2V0UGFyYW1ldGVycygpKSB7CisgICAgICAgICAgICBpZiAocGFyYW1ldGVyLmdldFNvdXJjZSgpID09IFBhcmFtZXRlci5Tb3VyY2UuRU5USVRZCisgICAgICAgICAgICAgICAgICAgICYmICFDb250YWluZXJSZXF1ZXN0Q29udGV4dC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHBhcmFtZXRlci5nZXRSYXdUeXBlKCkpKSB7CisgICAgICAgICAgICAgICAgLy8gdGhlcmUncyBhdCBtb3N0IG9uZSBlbnRpdHkgcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtZXRlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8Um91dGVyPiBnZXRNZXRob2RSb3V0ZXIoZmluYWwgUmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVxdWVzdCByZXF1ZXN0ID0gY29udGV4dC5yZXF1ZXN0KCk7CisgICAgICAgIGZpbmFsIExpc3Q8Q29uc3VtZXNQcm9kdWNlc0FjY2VwdG9yPiBhY2NlcHRvcnMgPSBjb25zdW1lc1Byb2R1Y2VzQWNjZXB0b3JzLmdldChyZXF1ZXN0LmdldE1ldGhvZCgpKTsKKyAgICAgICAgaWYgKGFjY2VwdG9ycyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm90QWxsb3dlZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2Uuc3RhdHVzKFN0YXR1cy5NRVRIT0RfTk9UX0FMTE9XRUQpLmFsbG93KGNvbnN1bWVzUHJvZHVjZXNBY2NlcHRvcnMua2V5U2V0KCkpLmJ1aWxkKCkpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgTGlzdDxDb25zdW1lc1Byb2R1Y2VzQWNjZXB0b3I+IHNhdGlzZnlpbmdBY2NlcHRvcnMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIGZpbmFsIFNldDxSZXNvdXJjZU1ldGhvZD4gZGlmZmVyZW50SW52b2thYmxlTWV0aG9kcyA9IENvbGxlY3Rpb25zLm5ld1NldEZyb21NYXAobmV3IElkZW50aXR5SGFzaE1hcDw+KCkpOworICAgICAgICBmb3IgKENvbnN1bWVzUHJvZHVjZXNBY2NlcHRvciBjcGkgOiBhY2NlcHRvcnMpIHsKKyAgICAgICAgICAgIGlmIChjcGkuaXNDb25zdW1hYmxlKHJlcXVlc3QpKSB7CisgICAgICAgICAgICAgICAgc2F0aXNmeWluZ0FjY2VwdG9ycy5hZGQoY3BpKTsKKyAgICAgICAgICAgICAgICBkaWZmZXJlbnRJbnZva2FibGVNZXRob2RzLmFkZChjcGkubWV0aG9kUm91dGluZy5tZXRob2QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzYXRpc2Z5aW5nQWNjZXB0b3JzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgTGlzdDxBY2NlcHRhYmxlTWVkaWFUeXBlPiBhY2NlcHRhYmxlTWVkaWFUeXBlcyA9IHJlcXVlc3QuZ2V0UXVhbGlmaWVkQWNjZXB0YWJsZU1lZGlhVHlwZXMoKTsKKworICAgICAgICBmaW5hbCBNZWRpYVR5cGUgcmVxdWVzdENvbnRlbnRUeXBlID0gcmVxdWVzdC5nZXRNZWRpYVR5cGUoKTsKKyAgICAgICAgZmluYWwgTWVkaWFUeXBlIGVmZmVjdGl2ZUNvbnRlbnRUeXBlID0gcmVxdWVzdENvbnRlbnRUeXBlID09IG51bGwgPyBNZWRpYVR5cGUuV0lMRENBUkRfVFlQRSA6IHJlcXVlc3RDb250ZW50VHlwZTsKKworICAgICAgICBmaW5hbCBNZXRob2RTZWxlY3RvciBtZXRob2RTZWxlY3RvciA9IHNlbGVjdE1ldGhvZChhY2NlcHRhYmxlTWVkaWFUeXBlcywgc2F0aXNmeWluZ0FjY2VwdG9ycywgZWZmZWN0aXZlQ29udGVudFR5cGUsCisgICAgICAgICAgICAgICAgZGlmZmVyZW50SW52b2thYmxlTWV0aG9kcy5zaXplKCkgPT0gMSk7CisKKyAgICAgICAgaWYgKG1ldGhvZFNlbGVjdG9yLnNlbGVjdGVkICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIFJlcXVlc3RTcGVjaWZpY0NvbnN1bWVzUHJvZHVjZXNBY2NlcHRvciBzZWxlY3RlZCA9IG1ldGhvZFNlbGVjdG9yLnNlbGVjdGVkOworCisgICAgICAgICAgICBpZiAobWV0aG9kU2VsZWN0b3Iuc2FtZUZpdG5lc3NBY2NlcHRvcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJlcG9ydE1ldGhvZFNlbGVjdGlvbkFtYmlndWl0eShhY2NlcHRhYmxlTWVkaWFUeXBlcywgbWV0aG9kU2VsZWN0b3Iuc2VsZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RTZWxlY3Rvci5zYW1lRml0bmVzc0FjY2VwdG9ycyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnRleHQucHVzaChuZXcgRnVuY3Rpb248Q29udGFpbmVyUmVzcG9uc2UsIENvbnRhaW5lclJlc3BvbnNlPigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgQ29udGFpbmVyUmVzcG9uc2UgYXBwbHkoZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2VDb250ZXh0KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgbmVlZCB0byBjb21wdXRlIGFuZCBzZXQgdGhlIGVmZmVjdGl2ZSBtZWRpYSB0eXBlIGlmOgorICAgICAgICAgICAgICAgICAgICAvLyAtIGl0IGhhc24ndCBiZWVuIHNldCBhbHJlYWR5LCBhbmQKKyAgICAgICAgICAgICAgICAgICAgLy8gLSBlaXRoZXIgdGhlcmUgaXMgYW4gZW50aXR5LCBvciB3ZSBhcmUgcmVzcG9uZGluZyB0byBhIEhFQUQgcmVxdWVzdAorICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2VDb250ZXh0LmdldE1lZGlhVHlwZSgpID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoKHJlc3BvbnNlQ29udGV4dC5oYXNFbnRpdHkoKSB8fCBIdHRwTWV0aG9kLkhFQUQuZXF1YWxzKHJlcXVlc3QuZ2V0TWV0aG9kKCkpKSkpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlIGVmZmVjdGl2ZVJlc3BvbnNlVHlwZSA9IGRldGVybWluZVJlc3BvbnNlTWVkaWFUeXBlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuZ2V0RW50aXR5Q2xhc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LmdldEVudGl0eVR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kU2VsZWN0b3Iuc2VsZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2VwdGFibGVNZWRpYVR5cGVzKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKE1lZGlhVHlwZXMuaXNXaWxkY2FyZChlZmZlY3RpdmVSZXNwb25zZVR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVmZmVjdGl2ZVJlc3BvbnNlVHlwZS5pc1dpbGRjYXJkVHlwZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAiYXBwbGljYXRpb24iLmVxdWFsc0lnbm9yZUNhc2UoZWZmZWN0aXZlUmVzcG9uc2VUeXBlLmdldFR5cGUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0aXZlUmVzcG9uc2VUeXBlID0gTWVkaWFUeXBlLkFQUExJQ0FUSU9OX09DVEVUX1NUUkVBTV9UWVBFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb3RBY2NlcHRhYmxlRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LnNldE1lZGlhVHlwZShlZmZlY3RpdmVSZXNwb25zZVR5cGUpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlQ29udGV4dDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZC5tZXRob2RSb3V0aW5nLnJvdXRlcnM7CisgICAgICAgIH0KKworICAgICAgICB0aHJvdyBuZXcgTm90QWNjZXB0YWJsZUV4Y2VwdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZSB0aGUge0BsaW5rIE1lZGlhVHlwZX0gb2YgdGhlIHtAbGluayBSZXNwb25zZX0gYmFzZWQgb24gd3JpdGVycyBzdWl0YWJsZSBmb3IgdGhlIGdpdmVuIGVudGl0eSBjbGFzcywKKyAgICAgKiBwcmUtc2VsZWN0ZWQgbWV0aG9kIGFuZCBhY2NlcHRhYmxlIG1lZGlhIHR5cGVzLgorICAgICAqCisgICAgICogQHBhcmFtIGVudGl0eUNsYXNzICAgICAgICAgIGVudGl0eSBjbGFzcyB0byBkZXRlcm1pbmUgdGhlIG1lZGlhIHR5cGUgZm9yLgorICAgICAqIEBwYXJhbSBlbnRpdHlUeXBlICAgICAgICAgICBlbnRpdHkgdHlwZSBmb3Igd3JpdGVycy4KKyAgICAgKiBAcGFyYW0gc2VsZWN0ZWRNZXRob2QgICAgICAgcHJlLXNlbGVjdGVkIChpbnZva2VkKSBtZXRob2QuCisgICAgICogQHBhcmFtIGFjY2VwdGFibGVNZWRpYVR5cGVzIGFjY2VwdGFibGUgbWVkaWEgdHlwZXMgZnJvbSByZXF1ZXN0LgorICAgICAqIEByZXR1cm4gbWVkaWEgdHlwZSBvZiB0aGUgcmVzcG9uc2UuCisgICAgICovCisgICAgcHJpdmF0ZSBNZWRpYVR5cGUgZGV0ZXJtaW5lUmVzcG9uc2VNZWRpYVR5cGUoCisgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiBlbnRpdHlDbGFzcywKKyAgICAgICAgICAgIGZpbmFsIFR5cGUgZW50aXR5VHlwZSwKKyAgICAgICAgICAgIGZpbmFsIFJlcXVlc3RTcGVjaWZpY0NvbnN1bWVzUHJvZHVjZXNBY2NlcHRvciBzZWxlY3RlZE1ldGhvZCwKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8QWNjZXB0YWJsZU1lZGlhVHlwZT4gYWNjZXB0YWJsZU1lZGlhVHlwZXMpIHsKKworICAgICAgICAvLyBSZXR1cm4gcHJlLXNlbGVjdGVkIE1lZGlhVHlwZS4KKyAgICAgICAgaWYgKHVzZVByZVNlbGVjdGVkTWVkaWFUeXBlKHNlbGVjdGVkTWV0aG9kLCBhY2NlcHRhYmxlTWVkaWFUeXBlcykpIHsKKyAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZE1ldGhvZC5wcm9kdWNlcy5jb21iaW5lZFR5cGU7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCA9IHNlbGVjdGVkTWV0aG9kLm1ldGhvZFJvdXRpbmcubWV0aG9kOworICAgICAgICBmaW5hbCBJbnZvY2FibGUgaW52b2NhYmxlID0gcmVzb3VyY2VNZXRob2QuZ2V0SW52b2NhYmxlKCk7CisKKyAgICAgICAgLy8gRW50aXR5IGNsYXNzIGNhbiBiZSBudWxsIHdoZW4gY29uc2lkZXJpbmcgSEVBRCBtZXRob2QgfHwgZW1wdHkgZW50aXR5LgorICAgICAgICBmaW5hbCBDbGFzczw/PiByZXNwb25zZUVudGl0eUNsYXNzID0gZW50aXR5Q2xhc3MgPT0gbnVsbCA/IGludm9jYWJsZS5nZXRSYXdSb3V0aW5nUmVzcG9uc2VUeXBlKCkgOiBlbnRpdHlDbGFzczsKKyAgICAgICAgZmluYWwgTWV0aG9kIGhhbmRsaW5nTWV0aG9kID0gaW52b2NhYmxlLmdldEhhbmRsaW5nTWV0aG9kKCk7CisKKyAgICAgICAgLy8gTWVkaWEgdHlwZXMgcHJvZHVjaWJsZSBieSBtZXRob2QuCisgICAgICAgIGZpbmFsIExpc3Q8TWVkaWFUeXBlPiBtZXRob2RQcm9kdWNlc1R5cGVzID0gIXJlc291cmNlTWV0aG9kLmdldFByb2R1Y2VkVHlwZXMoKS5pc0VtcHR5KCkKKyAgICAgICAgICAgICAgICA/IHJlc291cmNlTWV0aG9kLmdldFByb2R1Y2VkVHlwZXMoKSA6IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoTWVkaWFUeXBlLldJTERDQVJEX1RZUEUpOworICAgICAgICAvLyBBcHBsaWNhYmxlIGVudGl0eSBwcm92aWRlcnMKKyAgICAgICAgZmluYWwgTGlzdDxXcml0ZXJNb2RlbD4gd3JpdGVyc0ZvckVudGl0eVR5cGUgPSB3b3JrZXJzLmdldFdyaXRlcnNNb2RlbHNGb3JUeXBlKHJlc3BvbnNlRW50aXR5Q2xhc3MpOworCisgICAgICAgIENvbWJpbmVkTWVkaWFUeXBlIHNlbGVjdGVkID0gbnVsbDsKKyAgICAgICAgZm9yIChmaW5hbCBNZWRpYVR5cGUgYWNjZXB0YWJsZU1lZGlhVHlwZSA6IGFjY2VwdGFibGVNZWRpYVR5cGVzKSB7CisgICAgICAgICAgICBmb3IgKGZpbmFsIE1lZGlhVHlwZSBtZXRob2RQcm9kdWNlc1R5cGUgOiBtZXRob2RQcm9kdWNlc1R5cGVzKSB7CisgICAgICAgICAgICAgICAgaWYgKCFhY2NlcHRhYmxlTWVkaWFUeXBlLmlzQ29tcGF0aWJsZShtZXRob2RQcm9kdWNlc1R5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gZ28gZGVlcGVyIGlmIGFjY2VwdGFibGUgYW5kIG1ldGhvZCBwcm9kdWNlcyB0eXBlIGFyZSBpbmNvbXBhdGlibGUKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gVXNlIHdyaXRlcnMgc3VpdGFibGUgZm9yIGVudGl0eSBjbGFzcyB0byBkZXRlcm1pbmUgdGhlIG1lZGlhIHR5cGUuCisgICAgICAgICAgICAgICAgZm9yIChmaW5hbCBXcml0ZXJNb2RlbCBtb2RlbCA6IHdyaXRlcnNGb3JFbnRpdHlUeXBlKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoZmluYWwgTWVkaWFUeXBlIHdyaXRlclByb2R1Y2VzIDogbW9kZWwuZGVjbGFyZWRUeXBlcygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXdyaXRlclByb2R1Y2VzLmlzQ29tcGF0aWJsZShhY2NlcHRhYmxlTWVkaWFUeXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhbWV0aG9kUHJvZHVjZXNUeXBlLmlzQ29tcGF0aWJsZSh3cml0ZXJQcm9kdWNlcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29tYmluZWRNZWRpYVR5cGUuRWZmZWN0aXZlTWVkaWFUeXBlIGVmZmVjdGl2ZVByb2R1Y2VzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvbWJpbmVkTWVkaWFUeXBlLkVmZmVjdGl2ZU1lZGlhVHlwZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGVzLm1vc3RTcGVjaWZpYyhtZXRob2RQcm9kdWNlc1R5cGUsIHdyaXRlclByb2R1Y2VzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbWJpbmVkTWVkaWFUeXBlIGNhbmRpZGF0ZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbWJpbmVkTWVkaWFUeXBlLmNyZWF0ZShhY2NlcHRhYmxlTWVkaWFUeXBlLCBlZmZlY3RpdmVQcm9kdWNlcyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYW5kaWRhdGUgIT0gQ29tYmluZWRNZWRpYVR5cGUuTk9fTUFUQ0gpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMb29rIGZvciBhIGJldHRlciBjb21wYXRpYmxlIHdvcmtlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWQgPT0gbnVsbCB8fCBDb21iaW5lZE1lZGlhVHlwZS5DT01QQVJBVE9SLmNvbXBhcmUoY2FuZGlkYXRlLCBzZWxlY3RlZCkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2RlbC5pc1dyaXRlYWJsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZUVudGl0eUNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxpbmdNZXRob2QuZ2V0RGVjbGFyZWRBbm5vdGF0aW9ucygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZS5jb21iaW5lZFR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCA9IGNhbmRpZGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEZvdW5kIG1lZGlhIHR5cGUgZm9yIGN1cnJlbnQgd3JpdGVyLgorICAgICAgICBpZiAoc2VsZWN0ZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkLmNvbWJpbmVkVHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHRoZSBtZWRpYSB0eXBlIGNvdWxkbid0IGJlIGRldGVybWluZWQsIGNob29zZSBwcmUtc2VsZWN0ZWQgb25lIGFuZCB3YWl0IHdoZXRoZXIgaW50ZXJjZXB0b3JzIGNoYW5nZSB0aGUgbWVkaWFUeXBlCisgICAgICAgIC8vIHNvIGl0IGNhbiBiZSB3cml0dGVuLgorICAgICAgICByZXR1cm4gc2VsZWN0ZWRNZXRob2QucHJvZHVjZXMuY29tYmluZWRUeXBlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gdXNlUHJlU2VsZWN0ZWRNZWRpYVR5cGUoZmluYWwgUmVxdWVzdFNwZWNpZmljQ29uc3VtZXNQcm9kdWNlc0FjY2VwdG9yIHNlbGVjdGVkTWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxBY2NlcHRhYmxlTWVkaWFUeXBlPiBhY2NlcHRhYmxlTWVkaWFUeXBlcykgeworICAgICAgICAvLyBSZXNvdXJjZSBtZXRob2QgaXMgYW5ub3RhdGVkIHdpdGggQFByb2R1Y2VzIGFuZCB0aGlzIGFubm90YXRpb24gY29udGFpbnMgb25seSBvbmUgTWVkaWFUeXBlLgorICAgICAgICBpZiAoIXNlbGVjdGVkTWV0aG9kLnByb2R1Y2VzRnJvbVByb3ZpZGVycworICAgICAgICAgICAgICAgICYmIHNlbGVjdGVkTWV0aG9kLm1ldGhvZFJvdXRpbmcubWV0aG9kLmdldFByb2R1Y2VkVHlwZXMoKS5zaXplKCkgPT0gMSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGVyZSBpcyBvbmx5IG9uZSAobm9uLXdpbGRjYXJkKSBhY2NlcHRhYmxlIG1lZGlhIHR5cGUgLSBhdCB0aGlzIHBvaW50IHRoZSBwcmUtc2VsZWN0ZWQgbWV0aG9kIGhhcyB0byBiZSBjaG9zZW4gc28KKyAgICAgICAgLy8gdGhlcmUgYXJlIGNvbXBhdGlibGUgd3JpdGVycyAobm90IG5lY2Vzc2FyaWx5IHdyaXRlYWJsZSBvbmVzKS4KKyAgICAgICAgcmV0dXJuIGFjY2VwdGFibGVNZWRpYVR5cGVzLnNpemUoKSA9PSAxICYmICFNZWRpYVR5cGVzLmlzV2lsZGNhcmQoYWNjZXB0YWJsZU1lZGlhVHlwZXMuZ2V0KDApKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNXcml0ZWFibGUoZmluYWwgUmVxdWVzdFNwZWNpZmljQ29uc3VtZXNQcm9kdWNlc0FjY2VwdG9yIGNhbmRpZGF0ZSkgeworICAgICAgICBmaW5hbCBJbnZvY2FibGUgaW52b2NhYmxlID0gY2FuZGlkYXRlLm1ldGhvZFJvdXRpbmcubWV0aG9kLmdldEludm9jYWJsZSgpOworICAgICAgICBmaW5hbCBDbGFzczw/PiByZXNwb25zZVR5cGUgPSBQcmltaXRpdmVzLndyYXAoaW52b2NhYmxlLmdldFJhd1JvdXRpbmdSZXNwb25zZVR5cGUoKSk7CisKKyAgICAgICAgaWYgKFJlc3BvbnNlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20ocmVzcG9uc2VUeXBlKQorICAgICAgICAgICAgICAgIHx8IFZvaWQuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShyZXNwb25zZVR5cGUpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUgPSBpbnZvY2FibGUuZ2V0Um91dGluZ1Jlc3BvbnNlVHlwZSgpOworCisgICAgICAgIGZpbmFsIFR5cGUgZ2VuZXJpY1JldHVyblR5cGUgPSBnZW5lcmljVHlwZSBpbnN0YW5jZW9mIEdlbmVyaWNUeXBlCisgICAgICAgICAgICAgICAgPyAoKEdlbmVyaWNUeXBlKSBnZW5lcmljVHlwZSkuZ2V0VHlwZSgpIDogZ2VuZXJpY1R5cGU7CisKKyAgICAgICAgZm9yIChmaW5hbCBXcml0ZXJNb2RlbCBtb2RlbCA6IHdvcmtlcnMuZ2V0V3JpdGVyc01vZGVsc0ZvclR5cGUocmVzcG9uc2VUeXBlKSkgeworICAgICAgICAgICAgaWYgKG1vZGVsLmlzV3JpdGVhYmxlKAorICAgICAgICAgICAgICAgICAgICByZXNwb25zZVR5cGUsCisgICAgICAgICAgICAgICAgICAgIGdlbmVyaWNSZXR1cm5UeXBlLAorICAgICAgICAgICAgICAgICAgICBpbnZvY2FibGUuZ2V0SGFuZGxpbmdNZXRob2QoKS5nZXREZWNsYXJlZEFubm90YXRpb25zKCksCisgICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZS5wcm9kdWNlcy5jb21iaW5lZFR5cGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzUmVhZGFibGUoZmluYWwgUmVxdWVzdFNwZWNpZmljQ29uc3VtZXNQcm9kdWNlc0FjY2VwdG9yIGNhbmRpZGF0ZSkgeworICAgICAgICBmaW5hbCBJbnZvY2FibGUgaW52b2NhYmxlID0gY2FuZGlkYXRlLm1ldGhvZFJvdXRpbmcubWV0aG9kLmdldEludm9jYWJsZSgpOworICAgICAgICBmaW5hbCBNZXRob2QgaGFuZGxpbmdNZXRob2QgPSBpbnZvY2FibGUuZ2V0SGFuZGxpbmdNZXRob2QoKTsKKyAgICAgICAgZmluYWwgUGFyYW1ldGVyIGVudGl0eVBhcmFtID0gZ2V0RW50aXR5UGFyYW0oaW52b2NhYmxlKTsKKworICAgICAgICBpZiAoZW50aXR5UGFyYW0gPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiBlbnRpdHlUeXBlID0gZW50aXR5UGFyYW0uZ2V0UmF3VHlwZSgpOworCisgICAgICAgICAgICBmb3IgKGZpbmFsIFJlYWRlck1vZGVsIG1vZGVsIDogd29ya2Vycy5nZXRSZWFkZXJNb2RlbHNGb3JUeXBlKGVudGl0eVR5cGUpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1vZGVsLmlzUmVhZGFibGUoCisgICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5UGFyYW0uZ2V0VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxpbmdNZXRob2QuZ2V0RGVjbGFyZWRBbm5vdGF0aW9ucygpLAorICAgICAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlLmNvbnN1bWVzLmNvbWJpbmVkVHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbGVjdCBtZXRob2QgdG8gYmUgaW52b2tlZC4gTWV0aG9kIGlzIGNob3NlbiBhbW9uZyB0aGUgZ2l2ZW4gc2V0IG9mIGFjY2VwdG9ycyAoaWYgdGhleSBhcmUgY29tcGF0aWJsZSB3aXRoIGFjY2VwdGFibGUKKyAgICAgKiBtZWRpYSB0eXBlcykuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWNjZXB0YWJsZU1lZGlhVHlwZXMgIG1lZGlhIHR5cGVzIGFjY2VwdGFibGUgYnkgdGhlIGNsaWVudC4KKyAgICAgKiBAcGFyYW0gc2F0aXNmeWluZ0FjY2VwdG9ycyAgIHByZS1jb21wdXRlZCBhY2NlcHRvcnMuCisgICAgICogQHBhcmFtIGVmZmVjdGl2ZUNvbnRlbnRUeXBlICBtZWRpYSB0eXBlIG9mIGluY29taW5nIGVudGl0eS4KKyAgICAgKiBAcGFyYW0gc2luZ2xlSW52b2thYmxlTWV0aG9kIGZsYWcgZGV0ZXJtaW5pbmcgd2hldGhlciBvbmx5IG9uZSBtZXRob2QgdG8gYmUgaW52b2tlZCBoYXMgYmVlbiBmb3VuZCBhbW9uZyBzYXRpc2Z5aW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY2NlcHRvcnMuCisgICAgICogQHJldHVybiBtZXRob2QgdG8gYmUgaW52b2tlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1ldGhvZFNlbGVjdG9yIHNlbGVjdE1ldGhvZChmaW5hbCBMaXN0PEFjY2VwdGFibGVNZWRpYVR5cGU+IGFjY2VwdGFibGVNZWRpYVR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8Q29uc3VtZXNQcm9kdWNlc0FjY2VwdG9yPiBzYXRpc2Z5aW5nQWNjZXB0b3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBlZmZlY3RpdmVDb250ZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHNpbmdsZUludm9rYWJsZU1ldGhvZCkgeworCisgICAgICAgIC8vIFNlbGVjdGVkIG1ldGhvZCB3ZSBoYXZlIGEgcmVhZGVyIGFuZCB3cml0ZXIgZm9yLgorICAgICAgICBmaW5hbCBNZXRob2RTZWxlY3RvciBtZXRob2QgPSBuZXcgTWV0aG9kU2VsZWN0b3IobnVsbCk7CisgICAgICAgIC8vIElmIHdlIGNhbm5vdCBmaW5kIGEgd3JpdGVyIGF0IHRoaXMgcG9pbnQgdXNlIHRoZSBiZXN0IGFsdGVybmF0aXZlLgorICAgICAgICBmaW5hbCBNZXRob2RTZWxlY3RvciBhbHRlcm5hdGl2ZSA9IG5ldyBNZXRob2RTZWxlY3RvcihudWxsKTsKKworICAgICAgICBmb3IgKGZpbmFsIE1lZGlhVHlwZSBhY2NlcHRhYmxlTWVkaWFUeXBlIDogYWNjZXB0YWJsZU1lZGlhVHlwZXMpIHsKKyAgICAgICAgICAgIGZvciAoZmluYWwgQ29uc3VtZXNQcm9kdWNlc0FjY2VwdG9yIHNhdGlzZmlhYmxlIDogc2F0aXNmeWluZ0FjY2VwdG9ycykgeworCisgICAgICAgICAgICAgICAgZmluYWwgQ29tYmluZWRNZWRpYVR5cGUgcHJvZHVjZXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgQ29tYmluZWRNZWRpYVR5cGUuY3JlYXRlKGFjY2VwdGFibGVNZWRpYVR5cGUsIHNhdGlzZmlhYmxlLnByb2R1Y2VzKTsKKworICAgICAgICAgICAgICAgIGlmIChwcm9kdWNlcyAhPSBDb21iaW5lZE1lZGlhVHlwZS5OT19NQVRDSCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb21iaW5lZE1lZGlhVHlwZSBjb25zdW1lcyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tYmluZWRNZWRpYVR5cGUuY3JlYXRlKGVmZmVjdGl2ZUNvbnRlbnRUeXBlLCBzYXRpc2ZpYWJsZS5jb25zdW1lcyk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlcXVlc3RTcGVjaWZpY0NvbnN1bWVzUHJvZHVjZXNBY2NlcHRvciBjYW5kaWRhdGUgPSBuZXcgUmVxdWVzdFNwZWNpZmljQ29uc3VtZXNQcm9kdWNlc0FjY2VwdG9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdGlzZmlhYmxlLnByb2R1Y2VzLmlzRGVyaXZlZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdGlzZmlhYmxlLm1ldGhvZFJvdXRpbmcpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChzaW5nbGVJbnZva2FibGVNZXRob2QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgb25lIHBvc3NpYmxlIG1ldGhvZCBhbmQgaXQncyBjb21wYXRpYmxlLgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNZXRob2RTZWxlY3RvcihjYW5kaWRhdGUpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNhbmRpZGF0ZS5jb21wYXJlVG8obWV0aG9kLnNlbGVjdGVkKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhbmRpZGF0ZSBpcyBiZXR0ZXIgdGhhbiB0aGUgcHJldmlvdXMgb25lLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZC5zZWxlY3RlZCA9PSBudWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNhbmRpZGF0ZS5tZXRob2RSb3V0aW5nLm1ldGhvZCAhPSBtZXRob2Quc2VsZWN0ZWQubWV0aG9kUm91dGluZy5tZXRob2QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBjYW5kaWRhdGUgc28gZmFyIG9yIGJldHRlciBjYW5kaWRhdGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUmVhZGFibGUoY2FuZGlkYXRlKSAmJiBpc1dyaXRlYWJsZShjYW5kaWRhdGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5jb25zaWRlcihjYW5kaWRhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdGVybmF0aXZlLmNvbnNpZGVyKGNhbmRpZGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW1lIHJlc291cmNlIG1ldGhvZCAtIGJldHRlciBjYW5kaWRhdGUsIG5vIG5lZWQgdG8gY29tcGFyZSBhbnl0aGluZyBlbHNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5jb25zaWRlcihjYW5kaWRhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1ldGhvZC5zZWxlY3RlZCAhPSBudWxsID8gbWV0aG9kIDogYWx0ZXJuYXRpdmU7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlcG9ydE1ldGhvZFNlbGVjdGlvbkFtYmlndWl0eShMaXN0PEFjY2VwdGFibGVNZWRpYVR5cGU+IGFjY2VwdGFibGVUeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RTcGVjaWZpY0NvbnN1bWVzUHJvZHVjZXNBY2NlcHRvciBzZWxlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8UmVxdWVzdFNwZWNpZmljQ29uc3VtZXNQcm9kdWNlc0FjY2VwdG9yPiBzYW1lRml0bmVzc0FjY2VwdG9ycykgeworICAgICAgICBpZiAoTE9HR0VSLmlzTG9nZ2FibGUoTGV2ZWwuV0FSTklORykpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgbXNnQnVpbGRlciA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJpbmdCdWlsZGVyKExvY2FsaXphdGlvbk1lc3NhZ2VzLkFNQklHVU9VU19SRVNPVVJDRV9NRVRIT0QoYWNjZXB0YWJsZVR5cGVzKSkuYXBwZW5kKCdcbicpOworICAgICAgICAgICAgbXNnQnVpbGRlci5hcHBlbmQoJ1x0JykuYXBwZW5kKHNlbGVjdGVkLm1ldGhvZFJvdXRpbmcubWV0aG9kKS5hcHBlbmQoJ1xuJyk7CisgICAgICAgICAgICBmaW5hbCBTZXQ8UmVzb3VyY2VNZXRob2Q+IHJlcG9ydGVkTWV0aG9kcyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgICAgIHJlcG9ydGVkTWV0aG9kcy5hZGQoc2VsZWN0ZWQubWV0aG9kUm91dGluZy5tZXRob2QpOworICAgICAgICAgICAgZm9yIChSZXF1ZXN0U3BlY2lmaWNDb25zdW1lc1Byb2R1Y2VzQWNjZXB0b3IgaSA6IHNhbWVGaXRuZXNzQWNjZXB0b3JzKSB7CisgICAgICAgICAgICAgICAgaWYgKCFyZXBvcnRlZE1ldGhvZHMuY29udGFpbnMoaS5tZXRob2RSb3V0aW5nLm1ldGhvZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbXNnQnVpbGRlci5hcHBlbmQoJ1x0JykuYXBwZW5kKGkubWV0aG9kUm91dGluZy5tZXRob2QpLmFwcGVuZCgnXG4nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVwb3J0ZWRNZXRob2RzLmFkZChpLm1ldGhvZFJvdXRpbmcubWV0aG9kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuV0FSTklORywgbXNnQnVpbGRlci50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgUm91dGVyIGNyZWF0ZUhlYWRFbnJpY2hlZFJvdXRlcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSb3V0ZXIoKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIENvbnRpbnVhdGlvbiBhcHBseShmaW5hbCBSZXF1ZXN0UHJvY2Vzc2luZ0NvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgICAgIGZpbmFsIENvbnRhaW5lclJlcXVlc3QgcmVxdWVzdCA9IGNvbnRleHQucmVxdWVzdCgpOworICAgICAgICAgICAgICAgIGlmIChIdHRwTWV0aG9kLkhFQUQuZXF1YWxzKHJlcXVlc3QuZ2V0TWV0aG9kKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0TWV0aG9kV2l0aG91dEV4Y2VwdGlvbihIdHRwTWV0aG9kLkdFVCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQucHVzaCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRnVuY3Rpb248Q29udGFpbmVyUmVzcG9uc2UsIENvbnRhaW5lclJlc3BvbnNlPigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBDb250YWluZXJSZXNwb25zZSBhcHBseShmaW5hbCBDb250YWluZXJSZXNwb25zZSByZXNwb25zZUNvbnRleHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlQ29udGV4dC5nZXRSZXF1ZXN0Q29udGV4dCgpLnNldE1ldGhvZFdpdGhvdXRFeGNlcHRpb24oSHR0cE1ldGhvZC5IRUFEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZUNvbnRleHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBDb250aW51YXRpb24ub2YoY29udGV4dCwgZ2V0TWV0aG9kUm91dGVyKGNvbnRleHQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9yb3V0aW5nL1BhdGhNYXRjaGluZ1JvdXRlci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvcm91dGluZy9QYXRoTWF0Y2hpbmdSb3V0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWIxZmUyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvcm91dGluZy9QYXRoTWF0Y2hpbmdSb3V0ZXIuamF2YQpAQCAtMCwwICsxLDkwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5yb3V0aW5nOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaFJlc3VsdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuVHJhY2luZ0xvZ2dlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuU2VydmVyVHJhY2VFdmVudDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwucHJvY2Vzcy5SZXF1ZXN0UHJvY2Vzc2luZ0NvbnRleHQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudXJpLlBhdGhQYXR0ZXJuOworCisvKioKKyAqIE1hdGNoZXMgdGhlIHVuLW1hdGNoZWQgcmlnaHQtaGFuZCByZXF1ZXN0IHBhdGggdG8gdGhlIGNvbmZpZ3VyZWQgY29sbGVjdGlvbiBvZiBwYXRoIHBhdHRlcm4gbWF0Y2hpbmcgcm91dGVzLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK2ZpbmFsIGNsYXNzIFBhdGhNYXRjaGluZ1JvdXRlciBpbXBsZW1lbnRzIFJvdXRlciB7CisKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8Um91dGU+IGFjY2VwdGVkUm91dGVzOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyByb3V0ZSBtZXRob2RBY2NlcHRvclBhaXIgdGhhdCB1c2VzIHtAbGluayBQYXRoUGF0dGVybn0gaW5zdGFuY2VzIGZvcgorICAgICAqIHBhdGNoIG1hdGNoaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIHJvdXRlcyAgIG5leHQtbGV2ZWwgcmVxdWVzdCByb3V0ZXJzIHRvIGJlIHJldHVybmVkIGluIGNhc2UgdGhlIHJvdXRlciBtYXRjaGluZworICAgICAqICAgICAgICAgICAgICAgICB0aGUgYnVpbHQgcm91dGVyIGlzIHN1Y2Nlc3NmdWwuCisgICAgICovCisgICAgUGF0aE1hdGNoaW5nUm91dGVyKGZpbmFsIExpc3Q8Um91dGU+IHJvdXRlcykgeworICAgICAgICB0aGlzLmFjY2VwdGVkUm91dGVzID0gcm91dGVzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSb3V0ZXIuQ29udGludWF0aW9uIGFwcGx5KGZpbmFsIFJlcXVlc3RQcm9jZXNzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGZpbmFsIFJvdXRpbmdDb250ZXh0IHJjID0gY29udGV4dC5yb3V0aW5nQ29udGV4dCgpOworICAgICAgICAvLyBQZWVrIGF0IG1hdGNoaW5nIGluZm9ybWF0aW9uIHRvIG9idGFpbiBwYXRoIHRvIG1hdGNoCisgICAgICAgIFN0cmluZyBwYXRoID0gcmMuZ2V0RmluYWxNYXRjaGluZ0dyb3VwKCk7CisKKyAgICAgICAgZmluYWwgVHJhY2luZ0xvZ2dlciB0cmFjaW5nTG9nZ2VyID0gVHJhY2luZ0xvZ2dlci5nZXRJbnN0YW5jZShjb250ZXh0LnJlcXVlc3QoKSk7CisgICAgICAgIHRyYWNpbmdMb2dnZXIubG9nKFNlcnZlclRyYWNlRXZlbnQuTUFUQ0hfUEFUSF9GSU5ELCBwYXRoKTsKKworICAgICAgICBSb3V0ZXIuQ29udGludWF0aW9uIHJlc3VsdCA9IG51bGw7CisgICAgICAgIGZpbmFsIEl0ZXJhdG9yPFJvdXRlPiBpdGVyYXRvciA9IGFjY2VwdGVkUm91dGVzLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIGZpbmFsIFJvdXRlIGFjY2VwdGVkUm91dGUgPSBpdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICBmaW5hbCBQYXRoUGF0dGVybiByb3V0ZVBhdHRlcm4gPSBhY2NlcHRlZFJvdXRlLnJvdXRpbmdQYXR0ZXJuKCk7CisgICAgICAgICAgICBmaW5hbCBNYXRjaFJlc3VsdCBtID0gcm91dGVQYXR0ZXJuLm1hdGNoKHBhdGgpOworICAgICAgICAgICAgaWYgKG0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIFB1c2ggbWF0Y2ggcmVzdWx0IGluZm9ybWF0aW9uIGFuZCByZXN0IG9mIHBhdGggdG8gbWF0Y2gKKyAgICAgICAgICAgICAgICByYy5wdXNoTWF0Y2hSZXN1bHQobSk7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gUm91dGVyLkNvbnRpbnVhdGlvbi5vZihjb250ZXh0LCBhY2NlcHRlZFJvdXRlLm5leHQoKSk7CisKKyAgICAgICAgICAgICAgICAvL3RyYWNpbmcKKyAgICAgICAgICAgICAgICB0cmFjaW5nTG9nZ2VyLmxvZyhTZXJ2ZXJUcmFjZUV2ZW50Lk1BVENIX1BBVEhfU0VMRUNURUQsIHJvdXRlUGF0dGVybi5nZXRSZWdleCgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdHJhY2luZ0xvZ2dlci5sb2coU2VydmVyVHJhY2VFdmVudC5NQVRDSF9QQVRIX05PVF9NQVRDSEVELCByb3V0ZVBhdHRlcm4uZ2V0UmVnZXgoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAodHJhY2luZ0xvZ2dlci5pc0xvZ0VuYWJsZWQoU2VydmVyVHJhY2VFdmVudC5NQVRDSF9QQVRIX1NLSVBQRUQpKSB7CisgICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgdHJhY2luZ0xvZ2dlci5sb2coU2VydmVyVHJhY2VFdmVudC5NQVRDSF9QQVRIX1NLSVBQRUQsIGl0ZXJhdG9yLm5leHQoKS5yb3V0aW5nUGF0dGVybigpLmdldFJlZ2V4KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBObyBtYXRjaAorICAgICAgICAgICAgcmV0dXJuIFJvdXRlci5Db250aW51YXRpb24ub2YoY29udGV4dCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3JvdXRpbmcvUGF0aE1hdGNoaW5nUm91dGVyQnVpbGRlci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvcm91dGluZy9QYXRoTWF0Y2hpbmdSb3V0ZXJCdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE4ZTFjNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3JvdXRpbmcvUGF0aE1hdGNoaW5nUm91dGVyQnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLnJvdXRpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnVyaS5QYXRoUGF0dGVybjsKKworLyoqCisgLyoqCisgKiBBIHJlcXVlc3QgcGF0aCBwYXR0ZXJuIG1hdGNoaW5nIHJvdXRlciBoaWVyYXJjaHkgYnVpbGRlciBlbnRyeSBwb2ludC4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitmaW5hbCBjbGFzcyBQYXRoTWF0Y2hpbmdSb3V0ZXJCdWlsZGVyIGltcGxlbWVudHMgUGF0aFRvUm91dGVyQnVpbGRlciB7CisKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8Um91dGU+IGFjY2VwdGVkUm91dGVzID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgIHByaXZhdGUgTGlzdDxSb3V0ZXI+IGN1cnJlbnRSb3V0ZXJzOworCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IHJlcXVlc3QgcGF0aCBwYXR0ZXJuIG1hdGNoaW5nIHJvdXRlciBidWlsZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdHRlcm4gcmVxdWVzdCBwYXRoIG1hdGNoaW5nIHBhdHRlcm4uCisgICAgICogQHJldHVybiBuZXcgcmVxdWVzdCBwYXRoIHBhdHRlcm4gbWF0Y2hpbmcgcm91dGVyIGJ1aWxkZXIuCisgICAgICovCisgICAgc3RhdGljIFBhdGhUb1JvdXRlckJ1aWxkZXIgbmV3Um91dGUoZmluYWwgUGF0aFBhdHRlcm4gcGF0dGVybikgeworICAgICAgICBmaW5hbCBQYXRoTWF0Y2hpbmdSb3V0ZXJCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUGF0aE1hdGNoaW5nUm91dGVyQnVpbGRlcigpOworICAgICAgICBidWlsZGVyLnN0YXJ0TmV3Um91dGUocGF0dGVybik7CisgICAgICAgIHJldHVybiBidWlsZGVyOworICAgIH0KKworICAgIHByaXZhdGUgUGF0aE1hdGNoaW5nUm91dGVyQnVpbGRlcigpIHsKKyAgICAgICAgLy8gcHJldmVudGluZyBkaXJlY3QgaW5zdGFudGlhdGlvbgorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdGFydE5ld1JvdXRlKGZpbmFsIFBhdGhQYXR0ZXJuIHBhdHRlcm4pIHsKKyAgICAgICAgY3VycmVudFJvdXRlcnMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIGFjY2VwdGVkUm91dGVzLmFkZChSb3V0ZS5vZihwYXR0ZXJuLCBjdXJyZW50Um91dGVycykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbGlzdCBvZiB0aGUgcmVnaXN0ZXJlZCBzdWItcm91dGVzLgorICAgICAqCisgICAgICogQHJldHVybiBsaXN0IG9mIHRoZSByZWdpc3RlcmVkIHN1Yi1yb3V0ZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIExpc3Q8Um91dGU+IGFjY2VwdGVkUm91dGVzKCkgeworICAgICAgICByZXR1cm4gYWNjZXB0ZWRSb3V0ZXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFBhdGhNYXRjaGluZ1JvdXRlckJ1aWxkZXIgdG8oZmluYWwgUm91dGVyIHJvdXRlcikgeworICAgICAgICBjdXJyZW50Um91dGVycy5hZGQocm91dGVyKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGxldGUgdGhlIGN1cnJlbnRseSBidWlsdCB1bmZpbmlzaGVkIHN1Yi1yb3V0ZSAoaWYgYW55KSBhbmQgc3RhcnQgYnVpbGRpbmcgYSBuZXcgb25lLgorICAgICAqCisgICAgICogVGhlIGNvbXBsZXRlZCBzdWItcm91dGUgaXMgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgdGhlIHJvdXRlcyBhY2NlcHRlZCBieSB0aGUgcm91dGVyIHRoYXQgaXMgYmVpbmcgYnVpbHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0dGVybiByb3V0aW5nIHBhdHRlcm4gZm9yIHRoZSBuZXcgc3ViLXJvdXRlLgorICAgICAqIEByZXR1cm4gdXBkYXRlZCByb3V0ZXIgYnVpbGRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGF0aFRvUm91dGVyQnVpbGRlciByb3V0ZShmaW5hbCBQYXRoUGF0dGVybiBwYXR0ZXJuKSB7CisgICAgICAgIHN0YXJ0TmV3Um91dGUocGF0dGVybik7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJ1aWxkIGEge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5yb3V0aW5nLlJvdXRlciBoaWVyYXJjaGljYWwgcmVxdWVzdCBwYXRoIG1hdGNoaW5nIHByb2Nlc3Nvcn0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGhpZXJhcmNoaWNhbCByZXF1ZXN0IHBhdGggbWF0Y2hpbmcgcHJvY2Vzc29yIChpLmUuIHJvdXRlcikuCisgICAgICovCisgICAgcHVibGljIFBhdGhNYXRjaGluZ1JvdXRlciBidWlsZCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQYXRoTWF0Y2hpbmdSb3V0ZXIoYWNjZXB0ZWRSb3V0ZXMoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9yb3V0aW5nL1BhdGhUb1JvdXRlckJ1aWxkZXIuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3JvdXRpbmcvUGF0aFRvUm91dGVyQnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYTAzODIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9yb3V0aW5nL1BhdGhUb1JvdXRlckJ1aWxkZXIuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5yb3V0aW5nOworCisvKioKKyAqIEFuIGludGVybWVkaWF0ZSBwYXRoIG1hdGNoaW5nIHJvdXRlciBidWlsZGVyLgorICoKKyAqIFRoaXMgYnVpbGRlciBjb21wbGV0ZXMgYSByb3V0aW5nIGluZm9ybWF0aW9uIGZvciBhIHNpbmdsZSByb3V0ZWQge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnVyaS5QYXRoUGF0dGVybn0uCisgKiBJbiBjYXNlIHRoZSB1bm1hdGNoZWQgcmlnaHQtaGFuZCBwYXJ0IG9mIHRoZSByZXF1ZXN0IHBhdGggaXMgbWF0Y2hlZCBieSB0aGUgcm91dGVkIHBhdGggcGF0dGVybiwgdGhlIHJlcXVlc3QKKyAqIHByb2Nlc3NpbmcgY29udGV4dCB3aWxsIGJlIHNlcmlhbGx5IHJvdXRlZCB0byBhbGwgdGhlIGNoaWxkIHJvdXRlcnMgYXR0YWNoZWQgdG8gdGhlIHJvdXRpbmcgcGF0dGVybiB1c2luZyB0aGlzCisgKiByb3V0aW5nIGNvbXBsZXRpb24gYnVpbGRlci4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitAU3VwcHJlc3NXYXJuaW5ncygiQ2xhc3NSZWZlcmVuY2VzU3ViY2xhc3MiKQoraW50ZXJmYWNlIFBhdGhUb1JvdXRlckJ1aWxkZXIgeworCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgYSBuZXcgbmV4dC1sZXZlbCByb3V0ZXIgdG8gYmUgdXNlZCBmb3IgcmVxdWVzdCByb3V0aW5nIGluIGNhc2UgdGhlIHJvdXRpbmcgcGF0dGVybiBtYXRjaGVzIHRoZQorICAgICAqIHVubWF0Y2hlZCByaWdodC1oYW5kIHBhcnQgb2YgdGhlIHJlcXVlc3QgcGF0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb3V0ZXIgbmV3IG5leHQtbGV2ZWwgcm91dGVyIHRvIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgcm91dGVkIHBhdGggcGF0dGVybi4KKyAgICAgKiBAcmV0dXJuIHVwZGF0ZWQgcm91dGUgYnVpbGRlciByZWFkeSB0byBidWlsZCBhIG5ldyB7QGxpbmsgUm91dGVyIHJvdXRlcn0gaW5zdGFuY2UKKyAgICAgKiAob3IgYWRkIG1vcmUgcm91dGVzIHRvIHRoZSBjdXJyZW50bHkgYnVpbHQgb25lKS4KKyAgICAgKi8KKyAgICBQYXRoTWF0Y2hpbmdSb3V0ZXJCdWlsZGVyIHRvKFJvdXRlciByb3V0ZXIpOworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvcm91dGluZy9QdXNoTWF0Y2hlZE1ldGhvZFJvdXRlci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvcm91dGluZy9QdXNoTWF0Y2hlZE1ldGhvZFJvdXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMGYyMzkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9yb3V0aW5nL1B1c2hNYXRjaGVkTWV0aG9kUm91dGVyLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwucm91dGluZzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5wcm9jZXNzLlJlcXVlc3RQcm9jZXNzaW5nQ29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNZXRob2Q7CisKKy8qKgorICogUm91dGVyIHRoYXQgcHVzaGVzIG1hdGNoZWQge0BsaW5rIFJlc291cmNlTWV0aG9kIHJlc291cmNlIG1ldGhvZH0KKyAqIHRvIHtAbGluayBSb3V0aW5nQ29udGV4dCByb3V0aW5nIGNvbnRleHR9LgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworZmluYWwgY2xhc3MgUHVzaE1hdGNoZWRNZXRob2RSb3V0ZXIgaW1wbGVtZW50cyBSb3V0ZXIgeworCisgICAgcHJpdmF0ZSBmaW5hbCBSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBwdXNoIG1hdGNoZWQgcmVzb3VyY2Ugcm91dGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlTWV0aG9kIFRoZSBtYXRjaGVkIHJlc291cmNlIG1ldGhvZCB0aGF0IHNob3VsZCBiZSBwdXNoZWQgaW50byB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAge0BsaW5rIFJvdXRpbmdDb250ZXh0IHJvdXRpbmcgY29udGV4dH0uCisgICAgICovCisgICAgUHVzaE1hdGNoZWRNZXRob2RSb3V0ZXIoUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QpIHsKKyAgICAgICAgdGhpcy5yZXNvdXJjZU1ldGhvZCA9IHJlc291cmNlTWV0aG9kOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb250aW51YXRpb24gYXBwbHkoZmluYWwgUmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0IHByb2Nlc3NpbmdDb250ZXh0KSB7CisKKyAgICAgICAgZmluYWwgUm91dGluZ0NvbnRleHQgcmMgPSBwcm9jZXNzaW5nQ29udGV4dC5yb3V0aW5nQ29udGV4dCgpOworCisgICAgICAgIHN3aXRjaCAocmVzb3VyY2VNZXRob2QuZ2V0VHlwZSgpKSB7CisgICAgICAgICAgICBjYXNlIFJFU09VUkNFX01FVEhPRDoKKyAgICAgICAgICAgIGNhc2UgU1VCX1JFU09VUkNFX01FVEhPRDoKKyAgICAgICAgICAgICAgICByYy5zZXRNYXRjaGVkUmVzb3VyY2VNZXRob2QocmVzb3VyY2VNZXRob2QpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTVUJfUkVTT1VSQ0VfTE9DQVRPUjoKKyAgICAgICAgICAgICAgICByYy5wdXNoTWF0Y2hlZExvY2F0b3IocmVzb3VyY2VNZXRob2QpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIENvbnRpbnVhdGlvbi5vZihwcm9jZXNzaW5nQ29udGV4dCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvcm91dGluZy9QdXNoTWF0Y2hlZFJ1bnRpbWVSZXNvdXJjZVJvdXRlci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvcm91dGluZy9QdXNoTWF0Y2hlZFJ1bnRpbWVSZXNvdXJjZVJvdXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMzVmOWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9yb3V0aW5nL1B1c2hNYXRjaGVkUnVudGltZVJlc291cmNlUm91dGVyLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwucm91dGluZzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5wcm9jZXNzLlJlcXVlc3RQcm9jZXNzaW5nQ29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUnVudGltZVJlc291cmNlOworCisvKioKKyAqIFJvdXRlciB0aGF0IHB1c2hlcyB7QGxpbmsgUnVudGltZVJlc291cmNlIHJ1bnRpbWUgcmVzb3VyY2V9IG1hdGNoZWQgZHVyaW5nIGEgYW55IHJvdXRpbmcgcGhhc2UKKyAqIHRvIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwucm91dGluZy5Sb3V0aW5nQ29udGV4dCByb3V0aW5nIGNvbnRleHR9LgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworCitmaW5hbCBjbGFzcyBQdXNoTWF0Y2hlZFJ1bnRpbWVSZXNvdXJjZVJvdXRlciBpbXBsZW1lbnRzIFJvdXRlciB7CisKKyAgICBwcml2YXRlIGZpbmFsIFJ1bnRpbWVSZXNvdXJjZSByZXNvdXJjZTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBwdXNoIG1hdGNoZWQgcmVzb3VyY2Ugcm91dGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlIFJ1bnRpbWVSZXNvdXJjZSBydW50aW1lIHRvIGJlIHB1c2hlZCBpbnRvIHRoZSB7QGxpbmsgUm91dGluZ0NvbnRleHQgcm91dGluZyBjb250ZXh0fS4KKyAgICAgKi8KKyAgICBQdXNoTWF0Y2hlZFJ1bnRpbWVSZXNvdXJjZVJvdXRlcihSdW50aW1lUmVzb3VyY2UgcmVzb3VyY2UpIHsKKyAgICAgICAgdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb250aW51YXRpb24gYXBwbHkoZmluYWwgUmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgY29udGV4dC5yb3V0aW5nQ29udGV4dCgpLnB1c2hNYXRjaGVkUnVudGltZVJlc291cmNlKHJlc291cmNlKTsKKyAgICAgICAgcmV0dXJuIENvbnRpbnVhdGlvbi5vZihjb250ZXh0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9yb3V0aW5nL1B1c2hNYXRjaGVkVGVtcGxhdGVSb3V0ZXIuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3JvdXRpbmcvUHVzaE1hdGNoZWRUZW1wbGF0ZVJvdXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZjIzN2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9yb3V0aW5nL1B1c2hNYXRjaGVkVGVtcGxhdGVSb3V0ZXIuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5yb3V0aW5nOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLnByb2Nlc3MuUmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnVyaS5VcmlUZW1wbGF0ZTsKKworLyoqCisgKiBSb3V0ZXIgdGhhdCBwdXNoZXMge0BsaW5rIFVyaVRlbXBsYXRlIHVyaSB0ZW1wbGF0ZX0gb2YgbWF0Y2hlZCByZXNvdXJjZSBvZiBzdWJSZXNvdXJjZQorICogdG8ge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5yb3V0aW5nLlJvdXRpbmdDb250ZXh0IHJvdXRpbmcgY29udGV4dH0uCisgKiBCZWZvcmUgY2FsbGluZyB0aGlzIHJvdXRlciB0aGUge0BsaW5rIFBhdGhNYXRjaGluZ1JvdXRlcn0gbXVzdCBiZSBjYWxsZWQgd2hpY2ggbWF0Y2hlcyB0aGUgcGF0aAorICogYW5kIHB1c2hlcyB0aGUge0BsaW5rIGphdmEudXRpbC5yZWdleC5NYXRjaFJlc3VsdCBtYXRjaGVkIHJlc3VsdH0gaW50byB0aGUgcm91dGluZyBjb250ZXh0LgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqIEBzZWUgUm91dGluZ0NvbnRleHQjcHVzaFRlbXBsYXRlcyhvcmcuZ2xhc3NmaXNoLmplcnNleS51cmkuVXJpVGVtcGxhdGUsIG9yZy5nbGFzc2Zpc2guamVyc2V5LnVyaS5VcmlUZW1wbGF0ZSkKKyAqLworZmluYWwgY2xhc3MgUHVzaE1hdGNoZWRUZW1wbGF0ZVJvdXRlciBpbXBsZW1lbnRzIFJvdXRlciB7CisKKyAgICBwcml2YXRlIGZpbmFsIFVyaVRlbXBsYXRlIHJlc291cmNlVGVtcGxhdGU7CisgICAgcHJpdmF0ZSBmaW5hbCBVcmlUZW1wbGF0ZSBtZXRob2RUZW1wbGF0ZTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgcHVzaCBtYXRjaGVkIHRlbXBsYXRlIHJvdXRlci4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIHNob3VsZCBiZSB1c2VkIGluIGNhc2UgYSBwYXRoIG1hdGNoaW5nIGhhcyBiZWVuIHBlcmZvcm1lZCBvbiBib3RoIGEgcmVzb3VyY2UgYW5kIG1ldGhvZCBwYXRocworICAgICAqIChpbiBjYXNlIG9mIHN1Yi1yZXNvdXJjZSBtZXRob2RzIGFuZCBsb2NhdG9ycykuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlVGVtcGxhdGUgcmVzb3VyY2UgVVJJIHRlbXBsYXRlIHRoYXQgc2hvdWxkIGJlIHB1c2hlZC4KKyAgICAgKiBAcGFyYW0gbWV0aG9kVGVtcGxhdGUgICAoc3ViLXJlc291cmNlKSBtZXRob2Qgb3IgbG9jYXRvciBVUkkgdGVtcGxhdGUgdGhhdCBzaG91bGQgYmUgcHVzaGVkLgorICAgICAqLworICAgIFB1c2hNYXRjaGVkVGVtcGxhdGVSb3V0ZXIoZmluYWwgVXJpVGVtcGxhdGUgcmVzb3VyY2VUZW1wbGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFVyaVRlbXBsYXRlIG1ldGhvZFRlbXBsYXRlKSB7CisgICAgICAgIHRoaXMucmVzb3VyY2VUZW1wbGF0ZSA9IHJlc291cmNlVGVtcGxhdGU7CisgICAgICAgIHRoaXMubWV0aG9kVGVtcGxhdGUgPSBtZXRob2RUZW1wbGF0ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHB1c2ggbWF0Y2hlZCB0ZW1wbGF0ZSByb3V0ZXIuCisgICAgICogPHA+CisgICAgICogVGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgYmUgdXNlZCBpbiBjYXNlIGEgc2luZ2xlIHBhdGggbWF0Y2hpbmcgaGFzIGJlZW4gcGVyZm9ybWVkIChpbiBjYXNlIG9mIHJlc291cmNlIG1ldGhvZHMsCisgICAgICogb25seSB0aGUgcmVzb3VyY2UgcGF0aCBpcyBtYXRjaGVkKS4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VUZW1wbGF0ZSByZXNvdXJjZSBVUkkgdGVtcGxhdGUgdGhhdCBzaG91bGQgYmUgcHVzaGVkLgorICAgICAqLworICAgIFB1c2hNYXRjaGVkVGVtcGxhdGVSb3V0ZXIoZmluYWwgVXJpVGVtcGxhdGUgcmVzb3VyY2VUZW1wbGF0ZSkgeworICAgICAgICB0aGlzLnJlc291cmNlVGVtcGxhdGUgPSByZXNvdXJjZVRlbXBsYXRlOworICAgICAgICB0aGlzLm1ldGhvZFRlbXBsYXRlID0gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29udGludWF0aW9uIGFwcGx5KGZpbmFsIFJlcXVlc3RQcm9jZXNzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGNvbnRleHQucm91dGluZ0NvbnRleHQoKS5wdXNoVGVtcGxhdGVzKHJlc291cmNlVGVtcGxhdGUsIG1ldGhvZFRlbXBsYXRlKTsKKworICAgICAgICByZXR1cm4gQ29udGludWF0aW9uLm9mKGNvbnRleHQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3JvdXRpbmcvUHVzaE1hdGNoZWRVcmlSb3V0ZXIuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3JvdXRpbmcvUHVzaE1hdGNoZWRVcmlSb3V0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTQ2ODNlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvcm91dGluZy9QdXNoTWF0Y2hlZFVyaVJvdXRlci5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLnJvdXRpbmc7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwucHJvY2Vzcy5SZXF1ZXN0UHJvY2Vzc2luZ0NvbnRleHQ7CisKKy8qKgorICogVGVybWluYWwgcm91dGVyIHRoYXQgcHVzaGVzIHRoZSBVUkkgbWF0Y2hlZCBzbyBmYXIgdG8gdGhlIHN0YWNrIHJldHVybmVkCisgKiBieSB7QGxpbmsgamF2YXgud3MucnMuY29yZS5VcmlJbmZvI2dldE1hdGNoZWRVUklzKCl9IG1ldGhvZC4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitmaW5hbCBjbGFzcyBQdXNoTWF0Y2hlZFVyaVJvdXRlciBpbXBsZW1lbnRzIFJvdXRlciB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29udGludWF0aW9uIGFwcGx5KGZpbmFsIFJlcXVlc3RQcm9jZXNzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGNvbnRleHQucm91dGluZ0NvbnRleHQoKS5wdXNoTGVmdEhhbmRQYXRoKCk7CisKKyAgICAgICAgcmV0dXJuIENvbnRpbnVhdGlvbi5vZihjb250ZXh0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9yb3V0aW5nL1B1c2hNZXRob2RIYW5kbGVyUm91dGVyLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9yb3V0aW5nL1B1c2hNZXRob2RIYW5kbGVyUm91dGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNkNGY2NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3JvdXRpbmcvUHVzaE1ldGhvZEhhbmRsZXJSb3V0ZXIuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5yb3V0aW5nOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLnByb2Nlc3MuUmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5NZXRob2RIYW5kbGVyOworCisvKioKKyAqIFRlcm1pbmFsIHJvdXRlciB0aGF0IHB1c2hlcyB0aGUgbWF0Y2hlZCBtZXRob2QncyBoYW5kbGVyIGluc3RhbmNlIHRvIHRoZSBzdGFjaworICogcmV0dXJuZWQgYnkge0BsaW5rIGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbyNnZXRNYXRjaGVkUmVzb3VyY2VzKCl9IG1ldGhvZC4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitmaW5hbCBjbGFzcyBQdXNoTWV0aG9kSGFuZGxlclJvdXRlciBpbXBsZW1lbnRzIFJvdXRlciB7CisKKyAgICBwcml2YXRlIGZpbmFsIE1ldGhvZEhhbmRsZXIgbWV0aG9kSGFuZGxlcjsKKyAgICBwcml2YXRlIGZpbmFsIFJvdXRlciBuZXh0OworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IHtAY29kZSBQdXNoTWV0aG9kSGFuZGxlclJvdXRlcn0gaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWV0aG9kSGFuZGxlciBtZXRob2QgaGFuZGxlciBtb2RlbCBwcm92aWRpbmcgdGhlIG1ldGhvZCBoYW5kbGVyCisgICAgICogICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UuCisgICAgICogQHBhcmFtIG5leHQgICAgICAgICAgbmV4dCByb3V0ZXIgdG8gYmUgaW52b2tlZCBhZnRlciB0aGUgdGhpcyBvbmUuCisgICAgICovCisgICAgUHVzaE1ldGhvZEhhbmRsZXJSb3V0ZXIoZmluYWwgTWV0aG9kSGFuZGxlciBtZXRob2RIYW5kbGVyLCBmaW5hbCBSb3V0ZXIgbmV4dCkgeworICAgICAgICB0aGlzLm1ldGhvZEhhbmRsZXIgPSBtZXRob2RIYW5kbGVyOworICAgICAgICB0aGlzLm5leHQgPSBuZXh0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb250aW51YXRpb24gYXBwbHkoZmluYWwgUmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgZmluYWwgUm91dGluZ0NvbnRleHQgcm91dGluZ0NvbnRleHQgPSBjb250ZXh0LnJvdXRpbmdDb250ZXh0KCk7CisKKyAgICAgICAgZmluYWwgT2JqZWN0IHN0b3JlZFJlc291cmNlID0gcm91dGluZ0NvbnRleHQucGVla01hdGNoZWRSZXNvdXJjZSgpOworICAgICAgICBpZiAoc3RvcmVkUmVzb3VyY2UgPT0gbnVsbCB8fCAhc3RvcmVkUmVzb3VyY2UuZ2V0Q2xhc3MoKS5lcXVhbHMobWV0aG9kSGFuZGxlci5nZXRIYW5kbGVyQ2xhc3MoKSkpIHsKKyAgICAgICAgICAgIE9iamVjdCBoYW5kbGVySW5zdGFuY2UgPSBtZXRob2RIYW5kbGVyLmdldEluc3RhbmNlKGNvbnRleHQuaW5qZWN0aW9uTWFuYWdlcigpKTsKKyAgICAgICAgICAgIHJvdXRpbmdDb250ZXh0LnB1c2hNYXRjaGVkUmVzb3VyY2UoaGFuZGxlckluc3RhbmNlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQ29udGludWF0aW9uLm9mKGNvbnRleHQsIG5leHQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3JvdXRpbmcvUm91dGUuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3JvdXRpbmcvUm91dGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTg5NjU1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvcm91dGluZy9Sb3V0ZS5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLnJvdXRpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnVyaS5QYXRoUGF0dGVybjsKKworLyoqCisgKiBSZXF1ZXN0IHJvdXRpbmcgaW5mb3JtYXRpb24uIENvbnRhaW5zIGEge0BsaW5rICNyb3V0aW5nUGF0dGVybigpIHJvdXRpbmcgcGF0dGVybn0KKyAqIGFuZCBhIHtAbGluayAjbmV4dCgpIGxpc3Qgb2YgbmV4dC1sZXZlbCBzdGFnZXN9IHRvIGJlIHByb2Nlc3NlZCBpbiBjYXNlIHRoZQorICogcm91dGluZyBwYXR0ZXJuIHN1Y2Nlc3NmdWxseSBtYXRjaGVzIHRoZSB1bi1tYXRjaGVkIHJpZ2h0LWhhbmQgcGFydCBvZiB0aGUgcmVxdWVzdC4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitmaW5hbCBjbGFzcyBSb3V0ZSB7CisgICAgcHJpdmF0ZSBmaW5hbCBQYXRoUGF0dGVybiByb3V0aW5nUGF0dGVybjsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8Um91dGVyPiByb3V0ZXJzOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IHJlcXVlc3Qgcm91dGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm91dGluZ1BhdHRlcm4gcmVxdWVzdCBwYXRoIHJvdXRpbmcgcGF0dGVybi4KKyAgICAgKiBAcGFyYW0gcm91dGVycyAgICAgICAgbmV4dC1sZXZlbCByb3V0ZXJzIHRvIGJlIHByb2Nlc3NlZCBpbiBjYXNlIHRoZSByb3V0aW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIHBhdHRlcm4gbWF0Y2hlcyB0aGUgdW5tYXRjaGVkIHJpZ2h0LWhhbmQgcGFydCBvZiB0aGUgcmVxdWVzdCBwYXRoLgorICAgICAqIEByZXR1cm4gbmV3IHJlcXVlc3Qgcm91dGUuCisgICAgICovCisgICAgc3RhdGljIFJvdXRlIG9mKFBhdGhQYXR0ZXJuIHJvdXRpbmdQYXR0ZXJuLCBMaXN0PFJvdXRlcj4gcm91dGVycykgeworICAgICAgICByZXR1cm4gbmV3IFJvdXRlKHJvdXRpbmdQYXR0ZXJuLCByb3V0ZXJzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFJvdXRlKFBhdGhQYXR0ZXJuIHJvdXRpbmdQYXR0ZXJuLCBMaXN0PFJvdXRlcj4gcm91dGVycykgeworICAgICAgICB0aGlzLnJvdXRpbmdQYXR0ZXJuID0gcm91dGluZ1BhdHRlcm47CisgICAgICAgIC8vIE1VU1QgTk9UIHRyeSB0byBzdWJzdGl0dXRlIGZvciBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSBpcyB0aGUgcm91dGVycyBsaXN0IGlzIGVtcHR5IGFzIGl0IGNhbiBiZSBmaWxsZWQgaW4gbGF0ZXIuCisgICAgICAgIC8vIFNlZSBQYXRoTWF0Y2hpbmdSb3V0ZXJCdWlsZGVyLnN0YXJ0TmV3Um91dGUoLi4uKSBtZXRob2QuCisgICAgICAgIHRoaXMucm91dGVycyA9IHJvdXRlcnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSByZXF1ZXN0IHBhdGggcm91dGluZyBwYXR0ZXJuLgorICAgICAqCisgICAgICogQHJldHVybiByZXF1ZXN0IHBhdGggcm91dGluZyBwYXR0ZXJuLgorICAgICAqLworICAgIHB1YmxpYyBQYXRoUGF0dGVybiByb3V0aW5nUGF0dGVybigpIHsKKyAgICAgICAgcmV0dXJuIHJvdXRpbmdQYXR0ZXJuOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBuZXh0LWxldmVsIHJvdXRlcnMgdG8gYmUgcHJvY2Vzc2VkIGluIGNhc2UgdGhlIHJvdXRpbmcgcGF0dGVybiBtYXRjaGVzCisgICAgICogdGhlIHVubWF0Y2hlZCByaWdodC1oYW5kIHBhcnQgb2YgdGhlIHJlcXVlc3QgcGF0aC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gcm91dGVkIG5leHQtbGV2ZWwgbmV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxSb3V0ZXI+IG5leHQoKSB7CisgICAgICAgIHJldHVybiByb3V0ZXJzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3JvdXRpbmcvUm91dGVyLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9yb3V0aW5nL1JvdXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZDU3NjcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9yb3V0aW5nL1JvdXRlci5qYXZhCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5yb3V0aW5nOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLnByb2Nlc3MuUmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0OworCisvKioKKyAqIEhpZXJhcmNoaWNhbCByZXF1ZXN0IHJvdXRlciB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBkeW5hbWljIHJvdXRpbmcgdHJlZQorICogc3RydWN0dXJlcy4gIEVhY2ggcm91dGluZyB0cmVlIGNhbiBiZSBleGVjdXRlZCB1c2luZyBhIGRlZGljYXRlZAorICoge0BsaW5rIFJvdXRpbmdTdGFnZSByb3V0aW5nIHN0YWdlfS4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitpbnRlcmZhY2UgUm91dGVyIHsKKyAgICAvKioKKyAgICAgKiBIaWVyYXJjaGljYWwgcmVxdWVzdCByb3V0aW5nIGNvbnRpbnVhdGlvbi4KKyAgICAgKiA8cD4KKyAgICAgKiBBIGNvbnRpbnVhdGlvbiBvZiBhIGhpZXJhcmNoaWNhbCByZXF1ZXN0IHJvdXRpbmcgaXMgcmVwcmVzZW50ZWQKKyAgICAgKiBieSBhbiBvcmRlcmVkIGNvbGxlY3Rpb24gb2YgbmV4dCBsZXZlbCBvZiByb3V0ZXJzIHJlc3VsdGluZworICAgICAqIGluIGEgaGllcmFyY2hpY2FsIGRlcHRoLWZpcnN0IChkZXB0aC1vbmx5KSByZXF1ZXN0IHJvdXRpbmcuCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQ29udGludWF0aW9uIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZXF1ZXN0UHJvY2Vzc2luZ0NvbnRleHQgcmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0OworICAgICAgICBwcml2YXRlIGZpbmFsIEl0ZXJhYmxlPFJvdXRlcj4gbmV4dDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGEgdGVybWluYWwgY29udGludWF0aW9uIGZyb20gdGhlIHJvdXRlZCByZXF1ZXN0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcmVzdWx0IHJvdXRlZCByZXF1ZXN0LgorICAgICAgICAgKiBAcmV0dXJuIHRlcm1pbmFsIGNvbnRpbnVhdGlvbiB3aXRoIG5vIHtAbGluayAjbmV4dCgpIG5leHQgbGV2ZWwgcm91dGVyc30KKyAgICAgICAgICogICAgICAgICBpbiB0aGUgcm91dGluZyBoaWVyYXJjaHkgYW5kIHRoZSBzdXBwbGllZCByb3V0ZWQgcmVxdWVzdC4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBDb250aW51YXRpb24gb2YoZmluYWwgUmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0IHJlc3VsdCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDb250aW51YXRpb24ocmVzdWx0LCBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgYSBjb250aW51YXRpb24gZnJvbSB0aGUgcm91dGVkIHJlcXVlc3QgYW5kIGEgY29sbGVjdGlvbgorICAgICAgICAgKiBvZiBuZXh0IGxldmVsIHJvdXRlcnMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSByZXN1bHQgcm91dGVkIHJlcXVlc3QuCisgICAgICAgICAqIEBwYXJhbSBuZXh0ICAgbmV4dCBsZXZlbCByb3V0ZXJzLgorICAgICAgICAgKiBAcmV0dXJuIGEgY29udGludWF0aW9uIHdpdGggdGhlIHN1cHBsaWVkIG5leHQgbGV2ZWwgcm91dGVycyB0byBiZSBpbnZva2VkCisgICAgICAgICAqICAgICAgICAge0BsaW5rICNuZXh0KCkgbmV4dH0gaW4gdGhlIHJvdXRpbmcgY2hhaW4gYW5kIHRoZSBzdXBwbGllZCByb3V0ZWQKKyAgICAgICAgICogICAgICAgICByZXF1ZXN0LgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIENvbnRpbnVhdGlvbiBvZihmaW5hbCBSZXF1ZXN0UHJvY2Vzc2luZ0NvbnRleHQgcmVzdWx0LCBJdGVyYWJsZTxSb3V0ZXI+IG5leHQpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ29udGludWF0aW9uKHJlc3VsdCwgbmV4dCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGEgY29udGludWF0aW9uIGZyb20gdGhlIHJvdXRlZCByZXF1ZXN0IGFuZCBhIHNpbmdsZQorICAgICAgICAgKiBvZiBuZXh0IGxldmVsIHJvdXRlcnMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSByZXF1ZXN0IHJvdXRlZCByZXF1ZXN0LgorICAgICAgICAgKiBAcGFyYW0gbmV4dCAgICBuZXh0IGxldmVsIHJvdXRlci4KKyAgICAgICAgICogQHJldHVybiBhIGNvbnRpbnVhdGlvbiB3aXRoIHRoZSBzdXBwbGllZCBuZXh0IGxldmVsIHJvdXRlciB0byBiZSBpbnZva2VkCisgICAgICAgICAqICAgICAgICAge0BsaW5rICNuZXh0KCkgbmV4dH0gaW4gdGhlIHJvdXRpbmcgY2hhaW4gYW5kIHRoZSBzdXBwbGllZCByb3V0ZWQKKyAgICAgICAgICogICAgICAgICByZXF1ZXN0LgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIENvbnRpbnVhdGlvbiBvZihmaW5hbCBSZXF1ZXN0UHJvY2Vzc2luZ0NvbnRleHQgcmVxdWVzdCwgZmluYWwgUm91dGVyIG5leHQpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ29udGludWF0aW9uKHJlcXVlc3QsIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QobmV4dCkpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBDb250aW51YXRpb24oZmluYWwgUmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0IHJlcXVlc3QsIGZpbmFsIEl0ZXJhYmxlPFJvdXRlcj4gbmV4dCkgeworICAgICAgICAgICAgdGhpcy5yZXF1ZXN0UHJvY2Vzc2luZ0NvbnRleHQgPSByZXF1ZXN0OworICAgICAgICAgICAgdGhpcy5uZXh0ID0gKG5leHQgPT0gbnVsbCkgPyBDb2xsZWN0aW9ucy48Um91dGVyPmVtcHR5TGlzdCgpIDogbmV4dDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIHJvdXRlZCByZXF1ZXN0IGNvbnRleHQuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gcm91dGVkIHJlcXVlc3QgY29udGV4dC4KKyAgICAgICAgICovCisgICAgICAgIFJlcXVlc3RQcm9jZXNzaW5nQ29udGV4dCByZXF1ZXN0Q29udGV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiByZXF1ZXN0UHJvY2Vzc2luZ0NvbnRleHQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBuZXh0IGxldmVsIHJvdXRlcnMgdG8gYmUgaW52b2tlZCBvciB7QGNvZGUgYW4gZW1wdHl9IGlmIG5vIG5leHQKKyAgICAgICAgICogbGV2ZWwgcm91dGVycyBhcmUgcHJlc2VudC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB0aGUgbmV4dCBsZXZlbCByb3V0ZXJzIHRvIGJlIGludm9rZWQgb3IgYW4gZW1wdHkgY29sbGVjdGlvbiBpZiBub3QKKyAgICAgICAgICogICAgICAgICBwcmVzZW50LgorICAgICAgICAgKi8KKyAgICAgICAgSXRlcmFibGU8Um91dGVyPiBuZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5leHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtcyBhIHJlcXVlc3Qgcm91dGluZyB0YXNrIGFuZCByZXR1cm5zIHRoZSByb3V0ZWQgcmVxdWVzdCB0b2dldGhlciB3aXRoCisgICAgICogYSB7QGxpbmsgQ29udGludWF0aW9uIHJvdXRpbmcgY29udGludWF0aW9ufS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRhIGRhdGEgdG8gYmUgdHJhbnNmb3JtZWQuCisgICAgICogQHJldHVybiBhIHByb2Nlc3NpbmcgY29udGludWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBDb250aW51YXRpb24gYXBwbHkoUmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0IGRhdGEpOworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvcm91dGluZy9Sb3V0ZXJzLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9yb3V0aW5nL1JvdXRlcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTk0MGMxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvcm91dGluZy9Sb3V0ZXJzLmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwucm91dGluZzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5wcm9jZXNzLkVuZHBvaW50OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5wcm9jZXNzLlJlcXVlc3RQcm9jZXNzaW5nQ29udGV4dDsKKworLyoqCisgKiBSb3V0aW5nIHRyZWUgYXNzZW1ibHkgdXRpbGl0aWVzLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK2ZpbmFsIGNsYXNzIFJvdXRlcnMgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUm91dGVyIElERU5USVRZX1JPVVRFUiA9IG5ldyBSb3V0ZXIoKSB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDb250aW51YXRpb24gYXBwbHkoZmluYWwgUmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0IGRhdGEpIHsKKyAgICAgICAgICAgIHJldHVybiBDb250aW51YXRpb24ub2YoZGF0YSk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBSb3V0ZXJzKCkgeworICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIk5vIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzLiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHRlcm1pbmFsICJuby1vcCByb3V0ZXIiIHRoYXQgYWNjZXB0cyBhbnkgaW5wdXQgY29udGV4dCBhbmQgcmV0dXJucyB0aGUgdW5jaGFuZ2VkIHJlcXVlc3QgYW5kIGFuIGVtcHR5CisgICAgICogY29udGludWF0aW9uIGl0ZXJhdG9yLgorICAgICAqCisgICAgICogQHJldHVybiBhIHRlcm1pbmFsICJuby1vcCIgcm91dGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUm91dGVyIG5vb3AoKSB7CisgICAgICAgIHJldHVybiBJREVOVElUWV9ST1VURVI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHRlcm1pbmFsIHtAbGluayBSb3V0ZXJ9IHRoYXQgd3JhcHMgdGhlIGdpdmVuIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwucHJvY2Vzcy5FbmRwb2ludAorICAgICAqIGVuZHBvaW50fS4KKyAgICAgKgorICAgICAqIFRoZSB7QGxpbmsgUm91dGVyI2FwcGx5fSBtZXRob2Qgb2YgdGhlIGNyZWF0ZWQgaGllcmFyY2hpY2FsIHJvdXRlciByZXR1cm5zIHRoZSB1bmNoYW5nZWQgcmVxdWVzdCBhbmQgYW4gZW1wdHkKKyAgICAgKiBjb250aW51YXRpb24gaXRlcmF0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW5kcG9pbnQgYSBzZXJ2ZXItc2lkZSBlbmRwb2ludCB0byBiZSB3cmFwcGVkIGluIGEgcm91dGVyIGluc3RhbmNlLgorICAgICAqIEByZXR1cm4gYSByb3V0ZXIgdGhhdCB3cmFwcyB0aGUgc3VwcGxpZWQgZW5kcG9pbnQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBSb3V0ZXIgZW5kcG9pbnQoZmluYWwgRW5kcG9pbnQgZW5kcG9pbnQpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFbmRwb2ludFJvdXRlcihlbmRwb2ludCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRXh0cmFjdCBlbmRwb2ludCBzdG9yZWQgaW4gYSByb3V0ZXIgKGlmIGFueSkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm91dGVyIHJvdXRlciBmcm9tIHdoaWNoIGEgc2VydmVyIGVuZHBvaW50IHNob3VsZCBiZSBleHRyYWN0ZWQuCisgICAgICogQHJldHVybiBleHRyYWN0ZWQgZW5kcG9pbnQgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZXJlIHdhcyBubyBlbmRwb2ludCBzdG9yZWQgaW4gdGhlIHJvdXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEVuZHBvaW50IGV4dHJhY3RFbmRwb2ludChmaW5hbCBSb3V0ZXIgcm91dGVyKSB7CisgICAgICAgIGlmIChyb3V0ZXIgaW5zdGFuY2VvZiBFbmRwb2ludFJvdXRlcikgeworICAgICAgICAgICAgcmV0dXJuICgoRW5kcG9pbnRSb3V0ZXIpIHJvdXRlcikuZW5kcG9pbnQ7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBFbmRwb2ludFJvdXRlciBpbXBsZW1lbnRzIFJvdXRlciB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBFbmRwb2ludCBlbmRwb2ludDsKKworICAgICAgICBwdWJsaWMgRW5kcG9pbnRSb3V0ZXIoZmluYWwgRW5kcG9pbnQgZW5kcG9pbnQpIHsKKyAgICAgICAgICAgIHRoaXMuZW5kcG9pbnQgPSBlbmRwb2ludDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ29udGludWF0aW9uIGFwcGx5KFJlcXVlc3RQcm9jZXNzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICByZXR1cm4gQ29udGludWF0aW9uLm9mKGNvbnRleHQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvcm91dGluZy9Sb3V0aW5nLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9yb3V0aW5nL1JvdXRpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjlkNzA4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvcm91dGluZy9Sb3V0aW5nLmphdmEKQEAgLTAsMCArMSwyMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLnJvdXRpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLk1lc3NhZ2VCb2R5V29ya2VyczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLmludGVybmFsLkNoYWluYWJsZVN0YWdlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWwuU3RhZ2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLkplcnNleVJlc291cmNlQ29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuUHJvY2Vzc2luZ1Byb3ZpZGVyczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwucHJvY2Vzcy5SZXF1ZXN0UHJvY2Vzc2luZ0NvbnRleHQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLk1vZGVsUHJvY2Vzc29yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1ldGhvZEludm9rZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJ1bnRpbWVSZXNvdXJjZU1vZGVsOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuaW50ZXJuYWwuVmFsdWVQYXJhbVByb3ZpZGVyOworCisvKioKKyAqIEplcnNleSByb3V0aW5nIGVudHJ5IHBvaW50LgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBSb3V0aW5nIHsKKyAgICBwcml2YXRlIFJvdXRpbmcoKSB7CisgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiTm8gaW5zdGFuY2VzIGFsbG93ZWQuIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IHJlcXVlc3QgcHJlLXByb2Nlc3Npbmcgc3RhZ2UgdGhhdCBleHRyYWN0cyBhIG1hdGNoZWQgZW5kcG9pbnQgZnJvbSBhIHJvdXRpbmcgY29udGV4dCwKKyAgICAgKiB3aGVyZSBpdCB3YXMgcHJldmlvdXNseSBzdG9yZWQgYnkgdGhlIHJlcXVlc3Qgcm91dGluZyBzdGFnZSBhbmQKKyAgICAgKiAoaWYgYXZhaWxhYmxlKSByZXR1cm5zIHRoZSBlbmRwb2ludCB3cmFwcGVkIGluIGEgbmV4dCB0ZXJtaW5hbCBzdGFnZS4KKyAgICAgKgorICAgICAqIFRoaXMgcmVxdWVzdCBwcmUtcHJvY2Vzc2luZyBzdGFnZSBzaG91bGQgYmUgYSBmaW5hbCBzdGFnZSBpbiB0aGUgcmVxdWVzdCBwcm9jZXNzaW5nIGNoYWluLgorICAgICAqCisgICAgICogQHJldHVybiBuZXcgbWF0Y2hlZCBlbmRwb2ludCBleHRyYWN0b3IgcmVxdWVzdCBwcmUtcHJvY2Vzc2luZyBzdGFnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0YWdlPFJlcXVlc3RQcm9jZXNzaW5nQ29udGV4dD4gbWF0Y2hlZEVuZHBvaW50RXh0cmFjdG9yKCkgeworICAgICAgICByZXR1cm4gbmV3IE1hdGNoZWRFbmRwb2ludEV4dHJhY3RvclN0YWdlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgcm91dGluZyBzdGFnZSBidWlsZGVyIGZvciBhIGdpdmVuIHJ1bnRpbWUgcmVzb3VyY2UgbW9kZWwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VNb2RlbCBydW50aW1lIHJlc291cmNlIG1vZGVsCisgICAgICogQHJldHVybiBuZXcgcm91dGluZyBzdGFnZSBidWlsZGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBmb3JNb2RlbChSdW50aW1lUmVzb3VyY2VNb2RlbCByZXNvdXJjZU1vZGVsKSB7CisgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihyZXNvdXJjZU1vZGVsKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc291cmNlIHJvdXRpbmcgYnVpbGRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgUnVudGltZVJlc291cmNlTW9kZWwgcmVzb3VyY2VNb2RlbDsKKworICAgICAgICBwcml2YXRlIEplcnNleVJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHQ7CisgICAgICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbiBjb25maWc7CisgICAgICAgIHByaXZhdGUgTWVzc2FnZUJvZHlXb3JrZXJzIGVudGl0eVByb3ZpZGVyczsKKyAgICAgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPFZhbHVlUGFyYW1Qcm92aWRlcj4gdmFsdWVTdXBwbGllcnM7CisgICAgICAgIHByaXZhdGUgSXRlcmFibGU8TW9kZWxQcm9jZXNzb3I+IG1vZGVsUHJvY2Vzc29yczsKKyAgICAgICAgcHJpdmF0ZSBGdW5jdGlvbjxDbGFzczw/PiwgPz4gY3JlYXRlU2VydmljZUZ1bmN0aW9uOworICAgICAgICBwcml2YXRlIFByb2Nlc3NpbmdQcm92aWRlcnMgcHJvY2Vzc2luZ1Byb3ZpZGVyczsKKyAgICAgICAgcHJpdmF0ZSBSZXNvdXJjZU1ldGhvZEludm9rZXIuQnVpbGRlciByZXNvdXJjZU1ldGhvZEludm9rZXJCdWlsZGVyOworCisgICAgICAgIHByaXZhdGUgQnVpbGRlcihSdW50aW1lUmVzb3VyY2VNb2RlbCByZXNvdXJjZU1vZGVsKSB7CisgICAgICAgICAgICBpZiAocmVzb3VyY2VNb2RlbCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gTm8gTDEwTiAtIGludGVybmFsbHkgdXNlZCBjbGFzcworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiUmVzb3VyY2UgbW9kZWwgbXVzdCBub3QgYmUgbnVsbC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMucmVzb3VyY2VNb2RlbCA9IHJlc291cmNlTW9kZWw7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHJlc291cmNlIGNvbnRleHQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSByZXNvdXJjZUNvbnRleHQgcmVzb3VyY2UgY29udGV4dC4KKyAgICAgICAgICogQHJldHVybiB1cGRhdGVkIHJvdXRpbmcgYnVpbGRlci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHJlc291cmNlQ29udGV4dChKZXJzZXlSZXNvdXJjZUNvbnRleHQgcmVzb3VyY2VDb250ZXh0KSB7CisgICAgICAgICAgICB0aGlzLnJlc291cmNlQ29udGV4dCA9IHJlc291cmNlQ29udGV4dDsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCBydW50aW1lIGNvbmZpZ3VyYXRpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb25maWcgcnVudGltZSBjb25maWd1cmF0aW9uLgorICAgICAgICAgKiBAcmV0dXJuIHVwZGF0ZWQgcm91dGluZyBidWlsZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgY29uZmlndXJhdGlvbihDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgZW50aXR5IHByb3ZpZGVycy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHdvcmtlcnMgZW50aXR5IHByb3ZpZGVycy4KKyAgICAgICAgICogQHJldHVybiB1cGRhdGVkIHJvdXRpbmcgYnVpbGRlci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGVudGl0eVByb3ZpZGVycyhNZXNzYWdlQm9keVdvcmtlcnMgd29ya2VycykgeworICAgICAgICAgICAgdGhpcy5lbnRpdHlQcm92aWRlcnMgPSB3b3JrZXJzOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHZhbHVlIHN1cHBsaWVycy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHZhbHVlU3VwcGxpZXJzIGFsbCByZWdpc3RlcmVkIHZhbHVlIHN1cHBsaWVycy4KKyAgICAgICAgICogQHJldHVybiB1cGRhdGVkIHJvdXRpbmcgYnVpbGRlci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHZhbHVlU3VwcGxpZXJQcm92aWRlcnMoQ29sbGVjdGlvbjxWYWx1ZVBhcmFtUHJvdmlkZXI+IHZhbHVlU3VwcGxpZXJzKSB7CisgICAgICAgICAgICB0aGlzLnZhbHVlU3VwcGxpZXJzID0gdmFsdWVTdXBwbGllcnM7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgcmVxdWVzdC9yZXNwb25zZSBwcm9jZXNzaW5nIHByb3ZpZGVycy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHByb2Nlc3NpbmdQcm92aWRlcnMgcmVxdWVzdC9yZXNwb25zZSBwcm9jZXNzaW5nIHByb3ZpZGVycy4KKyAgICAgICAgICogQHJldHVybiB1cGRhdGVkIHJvdXRpbmcgYnVpbGRlci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHByb2Nlc3NpbmdQcm92aWRlcnMoUHJvY2Vzc2luZ1Byb3ZpZGVycyBwcm9jZXNzaW5nUHJvdmlkZXJzKSB7CisgICAgICAgICAgICB0aGlzLnByb2Nlc3NpbmdQcm92aWRlcnMgPSBwcm9jZXNzaW5nUHJvdmlkZXJzOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IG1vZGVsIHByb2Nlc3NvcnMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBtb2RlbFByb2Nlc3NvcnMgYWxsIHJlZ2lzdGVyZWQgbW9kZWwgcHJvY2Vzc29ycy4KKyAgICAgICAgICogQHJldHVybiB1cGRhdGVkIHJvdXRpbmcgYnVpbGRlci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIG1vZGVsUHJvY2Vzc29ycyhJdGVyYWJsZTxNb2RlbFByb2Nlc3Nvcj4gbW9kZWxQcm9jZXNzb3JzKSB7CisgICAgICAgICAgICB0aGlzLm1vZGVsUHJvY2Vzc29ycyA9IG1vZGVsUHJvY2Vzc29yczsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCBtb2RlbCBwcm9jZXNzb3JzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY3JlYXRlU2VydmljZUZ1bmN0aW9uIGFsbCByZWdpc3RlcmVkIG1vZGVsIHByb2Nlc3NvcnMuCisgICAgICAgICAqIEByZXR1cm4gdXBkYXRlZCByb3V0aW5nIGJ1aWxkZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBjcmVhdGVTZXJ2aWNlKEZ1bmN0aW9uPENsYXNzPD8+LCA/PiBjcmVhdGVTZXJ2aWNlRnVuY3Rpb24pIHsKKyAgICAgICAgICAgIHRoaXMuY3JlYXRlU2VydmljZUZ1bmN0aW9uID0gY3JlYXRlU2VydmljZUZ1bmN0aW9uOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IGJ1aWxkZXIgb2YgUmVzb3VyY2VNZXRob2RJbnZva2VyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcmVzb3VyY2VNZXRob2RJbnZva2VyQnVpbGRlciByZXNvdXJjZSBtZXRob2QgaW52b2tlciBidWlsZGVyLgorICAgICAgICAgKiBAcmV0dXJuIHVwZGF0ZWQgcm91dGluZyBidWlsZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgcmVzb3VyY2VNZXRob2RJbnZva2VyQnVpbGRlcihSZXNvdXJjZU1ldGhvZEludm9rZXIuQnVpbGRlciByZXNvdXJjZU1ldGhvZEludm9rZXJCdWlsZGVyKSB7CisgICAgICAgICAgICB0aGlzLnJlc291cmNlTWV0aG9kSW52b2tlckJ1aWxkZXIgPSByZXNvdXJjZU1ldGhvZEludm9rZXJCdWlsZGVyOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQnVpbGQgcm91dGluZyBzdGFnZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiByb3V0aW5nIHN0YWdlIGZvciB0aGUgcnVudGltZSByZXNvdXJjZSBtb2RlbC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBDaGFpbmFibGVTdGFnZTxSZXF1ZXN0UHJvY2Vzc2luZ0NvbnRleHQ+IGJ1aWxkU3RhZ2UoKSB7CisgICAgICAgICAgICAvLyBObyBMMTBOIC0gaW50ZXJuYWxseSB1c2VkIGNsYXNzCisgICAgICAgICAgICBpZiAocmVzb3VyY2VDb250ZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIlJlc291cmNlIGNvbnRleHQgaXMgbm90IHNldC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb25maWcgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiUnVudGltZSBjb25maWd1cmF0aW9uIGlzIG5vdCBzZXQuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZW50aXR5UHJvdmlkZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkVudGl0eSBwcm92aWRlcnMgYXJlIG5vdCBzZXQuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodmFsdWVTdXBwbGllcnMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiVmFsdWUgc3VwcGxpZXIgcHJvdmlkZXJzIGFyZSBub3Qgc2V0LiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1vZGVsUHJvY2Vzc29ycyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJNb2RlbCBwcm9jZXNzb3JzIGFyZSBub3Qgc2V0LiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNyZWF0ZVNlcnZpY2VGdW5jdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJDcmVhdGUgZnVuY3Rpb24gaXMgbm90IHNldC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwcm9jZXNzaW5nUHJvdmlkZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIlByb2Nlc3NpbmcgcHJvdmlkZXJzIGFyZSBub3Qgc2V0LiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJlc291cmNlTWV0aG9kSW52b2tlckJ1aWxkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiUmVzb3VyY2VNZXRob2RJbnZva2VyQnVpbGRlciBpcyBub3Qgc2V0LiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBSdW50aW1lTW9kZWxCdWlsZGVyIHJ1bnRpbWVNb2RlbEJ1aWxkZXIgPSBuZXcgUnVudGltZU1vZGVsQnVpbGRlcigKKyAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICBjb25maWcsCisgICAgICAgICAgICAgICAgICAgIGVudGl0eVByb3ZpZGVycywKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVTdXBwbGllcnMsCisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NpbmdQcm92aWRlcnMsCisgICAgICAgICAgICAgICAgICAgIHJlc291cmNlTWV0aG9kSW52b2tlckJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgIG1vZGVsUHJvY2Vzc29ycywKKyAgICAgICAgICAgICAgICAgICAgY3JlYXRlU2VydmljZUZ1bmN0aW9uKTsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyBSb3V0aW5nU3RhZ2UocnVudGltZU1vZGVsQnVpbGRlci5idWlsZE1vZGVsKHJlc291cmNlTW9kZWwsIGZhbHNlKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9yb3V0aW5nL1JvdXRpbmdDb250ZXh0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9yb3V0aW5nL1JvdXRpbmdDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM1OTIxZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3JvdXRpbmcvUm91dGluZ0NvbnRleHQuamF2YQpAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwucm91dGluZzsKKworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaFJlc3VsdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5SZXNvdXJjZUluZm87CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuRXh0ZW5kZWRVcmlJbmZvOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5wcm9jZXNzLkVuZHBvaW50OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNZXRob2Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJ1bnRpbWVSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS51cmkuVXJpVGVtcGxhdGU7CisKKy8qKgorICogSmVyc2V5IHJlcXVlc3QgbWF0Y2hpbmcgYW5kIHJvdXRpbmcgY29udGV4dC4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUm91dGluZ0NvbnRleHQgZXh0ZW5kcyBSZXNvdXJjZUluZm8sIEV4dGVuZGVkVXJpSW5mbyB7CisKKyAgICAvKioKKyAgICAgKiBQdXNoIHRoZSByZXN1bHQgb2YgdGhlIHN1Y2Nlc3NmdWwgcmVxdWVzdCBVUkkgcm91dGluZyBwYXR0ZXJuIG1hdGNoLgorICAgICAqCisgICAgICogQHBhcmFtIG1hdGNoUmVzdWx0IHN1Y2Nlc3NmdWwgcmVxdWVzdCBVUkkgcm91dGluZyBwYXR0ZXJuCisgICAgICogICAgICAgICAgICAgICAgICAgIHtAbGluayBqYXZhLnV0aWwucmVnZXguTWF0Y2hSZXN1bHQgbWF0Y2ggcmVzdWx0fS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwdXNoTWF0Y2hSZXN1bHQoTWF0Y2hSZXN1bHQgbWF0Y2hSZXN1bHQpOworCisgICAgLyoqCisgICAgICogUHVzaCB0aGUgcmVzb3VyY2UgdGhhdCBtYXRjaGVkIHRoZSByZXF1ZXN0IFVSSS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZSBpbnN0YW5jZSBvZiB0aGUgcmVzb3VyY2UgdGhhdCBtYXRjaGVkIHRoZSByZXF1ZXN0IFVSSS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwdXNoTWF0Y2hlZFJlc291cmNlKE9iamVjdCByZXNvdXJjZSk7CisKKyAgICAvKioKKyAgICAgKiBQZWVrIHRoZSBsYXN0IHJlc291cmNlIG9iamVjdCB0aGF0IHN1Y2Nlc3NmdWxseSBtYXRjaGVkIHRoZSByZXF1ZXN0IFVSSS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbGFzdCByZXNvdXJjZSBtYXRjaGVkIGFzIHByZXZpb3VzbHkgc2V0IGJ5IHtAbGluayAjcHVzaE1hdGNoZWRSZXNvdXJjZX0KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IHBlZWtNYXRjaGVkUmVzb3VyY2UoKTsKKworICAgIC8qKgorICAgICAqIFB1c2ggbWF0Y2hlZCByZXF1ZXN0IFVSSSByb3V0aW5nIHBhdHRlcm4ge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnVyaS5VcmlUZW1wbGF0ZSB0ZW1wbGF0ZXN9CisgICAgICogZm9yIGEgc2luZ2xlIG1hdGNoZWQgbWV0aG9kLgorICAgICAqIDxwPgorICAgICAqIEluIGNhc2Ugb25seSBhIHNpbmdsZSBwYXRoIG1hdGNoaW5nIGhhcyBiZWVuIHBlcmZvcm1lZCBvbiB0aGUgcmVzb3VyY2UgKGluIGNhc2Ugb2YgcmVzb3VyY2UgbWV0aG9kcywKKyAgICAgKiBvbmx5IHRoZSByZXNvdXJjZSBwYXRoIGlzIG1hdGNoZWQpLCB0aGUgbWV0aG9kIHRlbXBsYXRlIHNob3VsZCBiZSBwYXNzZWQgYXMge0Bjb2RlIG51bGx9LgorICAgICAqIEluIGNhc2UgYSBwYXRoIG1hdGNoaW5nIGhhcyBiZWVuIHBlcmZvcm1lZCBvbiBib3RoIGEgcmVzb3VyY2UgYW5kIG1ldGhvZCBwYXRocworICAgICAqIChpbiBjYXNlIG9mIHN1Yi1yZXNvdXJjZSBtZXRob2RzIGFuZCBsb2NhdG9ycyksIGJvdGggdGVtcGxhdGVzIChyZXNvdXJjZSBhbmQgbWV0aG9kKSBtdXN0IGJlIHNwZWNpZmllZC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VUZW1wbGF0ZSByZXNvdXJjZSBVUkkgdGVtcGxhdGUgdGhhdCBzaG91bGQgYmUgcHVzaGVkLgorICAgICAqIEBwYXJhbSBtZXRob2RUZW1wbGF0ZSAgIChzdWItcmVzb3VyY2UpIG1ldGhvZCBvciBsb2NhdG9yIFVSSSB0ZW1wbGF0ZSB0aGF0IHNob3VsZCBiZSBwdXNoZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHVzaFRlbXBsYXRlcyhVcmlUZW1wbGF0ZSByZXNvdXJjZVRlbXBsYXRlLCBVcmlUZW1wbGF0ZSBtZXRob2RUZW1wbGF0ZSk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGZpbmFsIG1hdGNoaW5nIGdyb3VwIG9mIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgcmVxdWVzdCBVUkkgcm91dGluZworICAgICAqIHBhdHRlcm4ge0BsaW5rIGphdmEudXRpbC5yZWdleC5NYXRjaFJlc3VsdCBtYXRjaCByZXN1bHR9LiBBbHNvIGtub3duIGFzIHJpZ2h0LWhhbmQgcGF0aC4KKyAgICAgKiA8cD4KKyAgICAgKiBNYXkgYmUgZW1wdHkgYnV0IGlzIG5ldmVyIHtAY29kZSBudWxsfS4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIGZpbmFsIG1hdGNoaW5nIGdyb3VwIG9mIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgcmVxdWVzdCBVUkkgcm91dGluZyBwYXR0ZXJuIG1hdGNoIHJlc3VsdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpbmFsTWF0Y2hpbmdHcm91cCgpOworCisgICAgLyoqCisgICAgICogQWRkIGN1cnJlbnRseSBtYXRjaGVkIGxlZnQtaGFuZCBzaWRlIHBhcnQgb2YgcmVxdWVzdCBwYXRoIHRvIHRoZSBsaXN0IG9mCisgICAgICogbWF0Y2hlZCBwYXRocyByZXR1cm5lZCBieSB7QGxpbmsgamF2YXgud3MucnMuY29yZS5VcmlJbmZvI2dldE1hdGNoZWRVUklzKCl9LgorICAgICAqIDxwLz4KKyAgICAgKiBMZWZ0LWhhbmQgc2lkZSByZXF1ZXN0IHBhdGggaXMgdGhlIHJlcXVlc3QgcGF0aCBleGNsdWRpbmcgdGhlIHN1ZmZpeAorICAgICAqIHBhcnQgb2YgdGhlIHBhdGggbWF0Y2hlZCBieSB0aGUge0BsaW5rICNnZXRGaW5hbE1hdGNoaW5nR3JvdXAoKSBmaW5hbAorICAgICAqIG1hdGNoaW5nIGdyb3VwfSBvZiB0aGUgbGFzdCBzdWNjZXNzZnVsIHJlcXVlc3QgVVJJIHJvdXRpbmcgcGF0dGVybi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwdXNoTGVmdEhhbmRQYXRoKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG1hdGNoZWQgc2VydmVyLXNpZGUgZW5kcG9pbnQuCisgICAgICogPHAvPgorICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIGluIGEgbm9uLXRlcm1pbmFsIHN0YWdlIHRvIHNldCB0aGUgc2VydmVyLXNpZGUgZW5kcG9pbnQgdGhhdAorICAgICAqIGNhbiBiZSByZXRyaWV2ZWQgYW5kIHByb2Nlc3NlZCBieSBhIHN1YnNlcXVlbnQgc3RhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW5kcG9pbnQgbWF0Y2hlZCBzZXJ2ZXItc2lkZSBlbmRwb2ludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRFbmRwb2ludChFbmRwb2ludCBlbmRwb2ludCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG1hdGNoZWQgc2VydmVyLXNpZGUgZW5kcG9pbnQgaWYgcHJlc2VudCwgb3Ige0Bjb2RlIG51bGx9IG90aGVyd2lzZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbWF0Y2hlZCBzZXJ2ZXItc2lkZSBlbmRwb2ludCwgb3Ige0Bjb2RlIG51bGx9IGlmIG5vdCBhdmFpbGFibGUuCisgICAgICovCisgICAgcHVibGljIEVuZHBvaW50IGdldEVuZHBvaW50KCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG1hdGNoZWQge0BsaW5rIFJlc291cmNlTWV0aG9kIHJlc291cmNlIG1ldGhvZH0uIFRoaXMgbWV0aG9kIG5lZWRzIHRvIGJlIGNhbGxlZCBvbmx5IGlmIHRoZSBtZXRob2Qgd2FzCisgICAgICogbWF0Y2hlZC4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IGZvciBzZXR0aW5nIHRoZSBmaW5hbCByZXNvdXJjZSBtZXRob2QgYW5kIG5vdCBmb3Igc2V0dGluZyBzdWIgcmVzb3VyY2UKKyAgICAgKiBsb2NhdG9ycyBpbnZva2VkIGR1cmluZyBtYXRjaGluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZU1ldGhvZCBSZXNvdXJjZSBtZXRob2QgdGhhdCB3YXMgbWF0Y2hlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNYXRjaGVkUmVzb3VyY2VNZXRob2QoUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QpOworCisgICAgLyoqCisgICAgICogUHVzaCB0aGUgbWF0Y2hlZCB7QGxpbmsgUmVzb3VyY2VNZXRob2Qgc3ViIHJlc291cmNlIGxvY2F0b3IgbWV0aG9kfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZUxvY2F0b3IgU3ViIHJlc291cmNlIGxvY2F0b3IgbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHB1c2hNYXRjaGVkTG9jYXRvcihSZXNvdXJjZU1ldGhvZCByZXNvdXJjZUxvY2F0b3IpOworCisgICAgLyoqCisgICAgICogUHVzaCBhIG1hdGNoZWQge0BsaW5rIFJ1bnRpbWVSZXNvdXJjZSBydW50aW1lIHJlc291cmNlfSB0aGF0IHdhcyB2aXNpdGVkIGR1cmluZyBtYXRjaGluZyBwaGFzZS4gVGhpcyBtZXRob2QgbXVzdAorICAgICAqIGJlIGNhbGxlZCBmb3IgYW55IG1hdGNoZWQgcnVudGltZSByZXNvdXJjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBydW50aW1lUmVzb3VyY2UgUnVudGltZSByZXNvdXJjZSB0aGF0IHdhcyBtYXRjaGVkIGR1cmluZyBtYXRjaGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwdXNoTWF0Y2hlZFJ1bnRpbWVSZXNvdXJjZShSdW50aW1lUmVzb3VyY2UgcnVudGltZVJlc291cmNlKTsKKworICAgIC8qKgorICAgICAqIFB1c2gge0BsaW5rIFJlc291cmNlIHN1YiByZXNvdXJjZX0gcmV0dXJuZWQgZnJvbSBhIHN1YiByZXNvdXJjZSBsb2NhdG9yIG1ldGhvZC4gVGhlIHB1c2hlZAorICAgICAqIHtAY29kZSBzdWJSZXNvdXJjZUZyb21Mb2NhdG9yfSBpcyB0aGUgZmluYWwgbW9kZWwgb2YgYSBzdWIgcmVzb3VyY2Ugd2hpY2ggaXMgYWxyZWFkeSBlbmhhbmNlZCBieQorICAgICAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuTW9kZWxQcm9jZXNzb3IgbW9kZWwgcHJvY2Vzc29yc30gYW5kCisgICAgICogdmFsaWRhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHN1YlJlc291cmNlRnJvbUxvY2F0b3IgUmVzb3VyY2UgY29uc3RydWN0ZWQgZnJvbSByZXN1bHQgb2Ygc3ViIHJlc291cmNlIGxvY2F0b3IgbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHB1c2hMb2NhdG9yU3ViUmVzb3VyY2UoUmVzb3VyY2Ugc3ViUmVzb3VyY2VGcm9tTG9jYXRvcik7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHRocm93YWJsZSB0aGF0IHdhcyBtYXBwZWQgdG8gYSByZXNwb25zZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aHJvd2FibGUgdGhyb3dhYmxlIHRoYXQgd2FzIG1hcHBlZCB0byBhIHJlc3BvbnNlLgorICAgICAqIEBzZWUgI2dldE1hcHBlZFRocm93YWJsZSgpCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWFwcGVkVGhyb3dhYmxlKFRocm93YWJsZSB0aHJvd2FibGUpOworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvcm91dGluZy9Sb3V0aW5nU3RhZ2UuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3JvdXRpbmcvUm91dGluZ1N0YWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBkNjEwYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3JvdXRpbmcvUm91dGluZ1N0YWdlLmphdmEKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLnJvdXRpbmc7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLlRyYWNpbmdMb2dnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5pbnRlcm5hbC5BYnN0cmFjdENoYWluYWJsZVN0YWdlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWwuU3RhZ2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLlNlcnZlclRyYWNlRXZlbnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLnByb2Nlc3MuRW5kcG9pbnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLnByb2Nlc3MuUmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLlJlcXVlc3RFdmVudDsKKworLyoqCisgKiBSZXF1ZXN0IHByZS1wcm9jZXNzaW5nIHN0YWdlIHRoYXQgZW5jYXBzdWxhdGVzIGhpZXJhcmNoaWNhbCByZXNvdXJjZSBtYXRjaGluZworICogYW5kIHJlcXVlc3Qgcm91dGluZy4KKyAqCisgKiBPbmNlIHRoZSByb3V0aW5nIGlzIGZpbmlzaGVkLCBhbiBlbmRwb2ludCAoaWYgbWF0Y2hlZCkgaXMKKyAqIHtAbGluayBSb3V0aW5nQ29udGV4dCNzZXRFbmRwb2ludCBzdG9yZWQgaW4gdGhlIHJvdXRpbmcgY29udGV4dH0uCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqIEBzZWUgTWF0Y2hlZEVuZHBvaW50RXh0cmFjdG9yU3RhZ2UKKyAqLworZmluYWwgY2xhc3MgUm91dGluZ1N0YWdlIGV4dGVuZHMgQWJzdHJhY3RDaGFpbmFibGVTdGFnZTxSZXF1ZXN0UHJvY2Vzc2luZ0NvbnRleHQ+IHsKKworICAgIHByaXZhdGUgZmluYWwgUm91dGVyIHJvdXRpbmdSb290OworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IHJvdXRpbmcgc3RhZ2UgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm91dGluZ1Jvb3Qgcm9vdCByb3V0ZXIuCisgICAgICovCisgICAgIFJvdXRpbmdTdGFnZShmaW5hbCBSb3V0ZXIgcm91dGluZ1Jvb3QpIHsKKyAgICAgICAgdGhpcy5yb3V0aW5nUm9vdCA9IHJvdXRpbmdSb290OworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKiA8cC8+CisgICAgICogUm91dGluZyBzdGFnZSBuYXZpZ2F0ZXMgdGhyb3VnaCB0aGUgbmVzdGVkIHtAbGluayBSb3V0ZXIgcm91dGluZyBoaWVyYXJjaHl9CisgICAgICogdXNpbmcgYSBkZXB0aC1maXJzdCB0cmFuc2Zvcm1hdGlvbiBzdHJhdGVneSB1bnRpbCBhIHJlcXVlc3QtdG8tcmVzcG9uc2UKKyAgICAgKiBpbmZsZWN0b3IgaXMge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWwuSW5mbGVjdGluZyBmb3VuZCBvbgorICAgICAqIGEgbGVhZiBzdGFnZSBub2RlfSwgaW4gd2hpY2ggY2FzZSB0aGUgcmVxdWVzdCByb3V0aW5nIGlzIHRlcm1pbmF0ZWQgYW5kIGFuCisgICAgICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuSW5mbGVjdG9yIGluZmxlY3Rvcn0gKGlmIGZvdW5kKSBpcyBwdXNoZWQKKyAgICAgKiB0byB0aGUge0BsaW5rIFJvdXRpbmdDb250ZXh0IHJvdXRpbmcgY29udGV4dH0uCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENvbnRpbnVhdGlvbjxSZXF1ZXN0UHJvY2Vzc2luZ0NvbnRleHQ+IGFwcGx5KGZpbmFsIFJlcXVlc3RQcm9jZXNzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlcXVlc3QgcmVxdWVzdCA9IGNvbnRleHQucmVxdWVzdCgpOworICAgICAgICBjb250ZXh0LnRyaWdnZXJFdmVudChSZXF1ZXN0RXZlbnQuVHlwZS5NQVRDSElOR19TVEFSVCk7CisKKyAgICAgICAgZmluYWwgVHJhY2luZ0xvZ2dlciB0cmFjaW5nTG9nZ2VyID0gVHJhY2luZ0xvZ2dlci5nZXRJbnN0YW5jZShyZXF1ZXN0KTsKKyAgICAgICAgZmluYWwgbG9uZyB0aW1lc3RhbXAgPSB0cmFjaW5nTG9nZ2VyLnRpbWVzdGFtcChTZXJ2ZXJUcmFjZUV2ZW50Lk1BVENIX1NVTU1BUlkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgUm91dGluZ1Jlc3VsdCByZXN1bHQgPSBfYXBwbHkoY29udGV4dCwgcm91dGluZ1Jvb3QpOworCisgICAgICAgICAgICBTdGFnZTxSZXF1ZXN0UHJvY2Vzc2luZ0NvbnRleHQ+IG5leHRTdGFnZSA9IG51bGw7CisgICAgICAgICAgICBpZiAocmVzdWx0LmVuZHBvaW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LnJvdXRpbmdDb250ZXh0KCkuc2V0RW5kcG9pbnQocmVzdWx0LmVuZHBvaW50KTsKKyAgICAgICAgICAgICAgICBuZXh0U3RhZ2UgPSBnZXREZWZhdWx0TmV4dCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gQ29udGludWF0aW9uLm9mKHJlc3VsdC5jb250ZXh0LCBuZXh0U3RhZ2UpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdHJhY2luZ0xvZ2dlci5sb2dEdXJhdGlvbihTZXJ2ZXJUcmFjZUV2ZW50Lk1BVENIX1NVTU1BUlksIHRpbWVzdGFtcCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwcml2YXRlIFJvdXRpbmdSZXN1bHQgX2FwcGx5KGZpbmFsIFJlcXVlc3RQcm9jZXNzaW5nQ29udGV4dCByZXF1ZXN0LCBmaW5hbCBSb3V0ZXIgcm91dGVyKSB7CisKKyAgICAgICAgZmluYWwgUm91dGVyLkNvbnRpbnVhdGlvbiBjb250aW51YXRpb24gPSByb3V0ZXIuYXBwbHkocmVxdWVzdCk7CisKKyAgICAgICAgZm9yIChSb3V0ZXIgY2hpbGQgOiBjb250aW51YXRpb24ubmV4dCgpKSB7CisgICAgICAgICAgICBSb3V0aW5nUmVzdWx0IHJlc3VsdCA9IF9hcHBseShjb250aW51YXRpb24ucmVxdWVzdENvbnRleHQoKSwgY2hpbGQpOworCisgICAgICAgICAgICBpZiAocmVzdWx0LmVuZHBvaW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSdyZSBkb25lCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0gLy8gZWxzZSBjb250aW51ZQorICAgICAgICB9CisKKyAgICAgICAgRW5kcG9pbnQgZW5kcG9pbnQgPSBSb3V0ZXJzLmV4dHJhY3RFbmRwb2ludChyb3V0ZXIpOworICAgICAgICBpZiAoZW5kcG9pbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gaW5mbGVjdG9yIGF0IHRlcm1pbmFsIHN0YWdlIGZvdW5kCisgICAgICAgICAgICByZXR1cm4gUm91dGluZ1Jlc3VsdC5mcm9tKGNvbnRpbnVhdGlvbi5yZXF1ZXN0Q29udGV4dCgpLCBlbmRwb2ludCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBpbmZsZWN0b3IgYXQgdGVybWluYWwgc3RhZ2Ugbm90IGZvdW5kCisgICAgICAgIHJldHVybiBSb3V0aW5nUmVzdWx0LmZyb20oY29udGludWF0aW9uLnJlcXVlc3RDb250ZXh0KCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJvdXRpbmdSZXN1bHQgeworICAgICAgICBwcml2YXRlIGZpbmFsIFJlcXVlc3RQcm9jZXNzaW5nQ29udGV4dCBjb250ZXh0OworICAgICAgICBwcml2YXRlIGZpbmFsIEVuZHBvaW50IGVuZHBvaW50OworCisgICAgICAgIHByaXZhdGUgc3RhdGljIFJvdXRpbmdSZXN1bHQgZnJvbShmaW5hbCBSZXF1ZXN0UHJvY2Vzc2luZ0NvbnRleHQgcmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0LCBmaW5hbCBFbmRwb2ludCBlbmRwb2ludCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSb3V0aW5nUmVzdWx0KHJlcXVlc3RQcm9jZXNzaW5nQ29udGV4dCwgZW5kcG9pbnQpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgUm91dGluZ1Jlc3VsdCBmcm9tKGZpbmFsIFJlcXVlc3RQcm9jZXNzaW5nQ29udGV4dCByZXF1ZXN0UHJvY2Vzc2luZ0NvbnRleHQpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUm91dGluZ1Jlc3VsdChyZXF1ZXN0UHJvY2Vzc2luZ0NvbnRleHQsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBSb3V0aW5nUmVzdWx0KGZpbmFsIFJlcXVlc3RQcm9jZXNzaW5nQ29udGV4dCBjb250ZXh0LCBmaW5hbCBFbmRwb2ludCBlbmRwb2ludCkgeworICAgICAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgICAgIHRoaXMuZW5kcG9pbnQgPSBlbmRwb2ludDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3JvdXRpbmcvUnVudGltZUxvY2F0b3JNb2RlbEJ1aWxkZXIuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3JvdXRpbmcvUnVudGltZUxvY2F0b3JNb2RlbEJ1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTQ1YmRkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvcm91dGluZy9SdW50aW1lTG9jYXRvck1vZGVsQnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsMzA0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5yb3V0aW5nOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkVycm9yczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YS5DYWNoZUJ1aWxkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmEuQ2FjaGVMb2FkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmEuTG9hZGluZ0NhY2hlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuTWVzc2FnZUJvZHlXb3JrZXJzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5KZXJzZXlSZXNvdXJjZUNvbnRleHQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5Db21wb25lbnRNb2RlbFZhbGlkYXRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuTW9kZWxQcm9jZXNzb3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLk1vZGVsVmFsaWRhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTWV0aG9kOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1vZGVsOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1vZGVsQ29tcG9uZW50OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5pbnRlcm5hbC5Nb2RlbEVycm9yczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLmludGVybmFsLlZhbHVlUGFyYW1Qcm92aWRlcjsKKworLyoqCisgKiBCYXNlIGZvciBzdWItcmVzb3VyY2UgbG9jYXRvciBydW50aW1lIG1vZGVsIGJ1aWxkZXIuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK2ZpbmFsIGNsYXNzIFJ1bnRpbWVMb2NhdG9yTW9kZWxCdWlsZGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFJ1bnRpbWVMb2NhdG9yTW9kZWxCdWlsZGVyLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBwcml2YXRlIGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlnOworICAgIHByaXZhdGUgZmluYWwgUnVudGltZU1vZGVsQnVpbGRlciBydW50aW1lTW9kZWxCdWlsZGVyOworICAgIHByaXZhdGUgZmluYWwgTWVzc2FnZUJvZHlXb3JrZXJzIG1lc3NhZ2VCb2R5V29ya2VyczsKKyAgICBwcml2YXRlIGZpbmFsIENvbGxlY3Rpb248VmFsdWVQYXJhbVByb3ZpZGVyPiB2YWx1ZVN1cHBsaWVyczsKKyAgICBwcml2YXRlIGZpbmFsIEplcnNleVJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHQ7CisgICAgcHJpdmF0ZSBmaW5hbCBJdGVyYWJsZTxNb2RlbFByb2Nlc3Nvcj4gbW9kZWxQcm9jZXNzb3JzOworICAgIHByaXZhdGUgZmluYWwgRnVuY3Rpb248Q2xhc3M8Pz4sID8+IGNyZWF0ZVNlcnZpY2VGdW5jdGlvbjsKKyAgICBwcml2YXRlIGZpbmFsIExvYWRpbmdDYWNoZTxMb2NhdG9yQ2FjaGVLZXksIExvY2F0b3JSb3V0aW5nPiBjYWNoZTsKKworICAgIC8vIENvbmZpZ3VyYXRpb24uCisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGRpc2FibGVWYWxpZGF0aW9uOworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBpZ25vcmVWYWxpZGF0aW9uRXJyb3JzOworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBlbmFibGVKZXJzZXlSZXNvdXJjZUNhY2hpbmc7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHJ1bnRpbWUgbW9kZWwgYnVpbGRlciBmb3Igc3ViLXJlc291cmNlIGxvY2F0b3JzLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZyAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIG9mIHRoZSBhcHBsaWNhdGlvbi4KKyAgICAgKiBAcGFyYW0gbWVzc2FnZUJvZHlXb3JrZXJzICAgIG1lc3NhZ2UgYm9keSB3b3JrZXJzIHJlZ2lzdHJlZCBpbiBhbiBhcHBsaWNhdGlvbi4KKyAgICAgKiBAcGFyYW0gdmFsdWVTdXBwbGllcnMgICAgICAgIGFsbCB2YWx1ZSByZWdpc3RlcmVkIHZhbHVlIHByb3ZpZGVycy4KKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VDb250ZXh0ICAgICAgIHJlc291cmNlIGNvbnRleHQgdG8gYmluZCBzdWItcmVzb3VyY2UgbG9jYXRvciBzaW5nbGV0b24gaW5zdGFuY2VzLgorICAgICAqIEBwYXJhbSBydW50aW1lTW9kZWxCdWlsZGVyICAgcnVudGltZSBtb2RlbCBidWlsZGVyIHRvIGJ1aWxkIHJvdXRlcnMgZm9yIGxvY2F0b3IgbW9kZWxzLgorICAgICAqIEBwYXJhbSBtb2RlbFByb2Nlc3NvcnMgICAgICAgYWxsIHJlZ2lzdGVyZWQgbW9kZWwgcHJvY2Vzc29ycy4KKyAgICAgKiBAcGFyYW0gY3JlYXRlU2VydmljZUZ1bmN0aW9uIGZ1bmN0aW9uIHRoYXQgaXMgYWJsZSB0byBjcmVhdGUgYW5kIGluaXRpYWxpemUgbmV3IHNlcnZpY2UuCisgICAgICovCisgICAgUnVudGltZUxvY2F0b3JNb2RlbEJ1aWxkZXIoZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVzc2FnZUJvZHlXb3JrZXJzIG1lc3NhZ2VCb2R5V29ya2VycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPFZhbHVlUGFyYW1Qcm92aWRlcj4gdmFsdWVTdXBwbGllcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSmVyc2V5UmVzb3VyY2VDb250ZXh0IHJlc291cmNlQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSdW50aW1lTW9kZWxCdWlsZGVyIHJ1bnRpbWVNb2RlbEJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSXRlcmFibGU8TW9kZWxQcm9jZXNzb3I+IG1vZGVsUHJvY2Vzc29ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBGdW5jdGlvbjxDbGFzczw/PiwgPz4gY3JlYXRlU2VydmljZUZ1bmN0aW9uKSB7CisKKyAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7CisgICAgICAgIHRoaXMubWVzc2FnZUJvZHlXb3JrZXJzID0gbWVzc2FnZUJvZHlXb3JrZXJzOworICAgICAgICB0aGlzLnZhbHVlU3VwcGxpZXJzID0gdmFsdWVTdXBwbGllcnM7CisgICAgICAgIHRoaXMucnVudGltZU1vZGVsQnVpbGRlciA9IHJ1bnRpbWVNb2RlbEJ1aWxkZXI7CisgICAgICAgIHRoaXMucmVzb3VyY2VDb250ZXh0ID0gcmVzb3VyY2VDb250ZXh0OworICAgICAgICB0aGlzLm1vZGVsUHJvY2Vzc29ycyA9IG1vZGVsUHJvY2Vzc29yczsKKyAgICAgICAgdGhpcy5jcmVhdGVTZXJ2aWNlRnVuY3Rpb24gPSBjcmVhdGVTZXJ2aWNlRnVuY3Rpb247CisKKyAgICAgICAgLy8gQ29uZmlndXJhdGlvbi4KKyAgICAgICAgdGhpcy5kaXNhYmxlVmFsaWRhdGlvbiA9IFNlcnZlclByb3BlcnRpZXMuZ2V0VmFsdWUoY29uZmlnLmdldFByb3BlcnRpZXMoKSwKKyAgICAgICAgICAgICAgICBTZXJ2ZXJQcm9wZXJ0aWVzLlJFU09VUkNFX1ZBTElEQVRJT05fRElTQUJMRSwKKyAgICAgICAgICAgICAgICBCb29sZWFuLkZBTFNFLAorICAgICAgICAgICAgICAgIEJvb2xlYW4uY2xhc3MpOworICAgICAgICB0aGlzLmlnbm9yZVZhbGlkYXRpb25FcnJvcnMgPSBTZXJ2ZXJQcm9wZXJ0aWVzLmdldFZhbHVlKGNvbmZpZy5nZXRQcm9wZXJ0aWVzKCksCisgICAgICAgICAgICAgICAgU2VydmVyUHJvcGVydGllcy5SRVNPVVJDRV9WQUxJREFUSU9OX0lHTk9SRV9FUlJPUlMsCisgICAgICAgICAgICAgICAgQm9vbGVhbi5GQUxTRSwKKyAgICAgICAgICAgICAgICBCb29sZWFuLmNsYXNzKTsKKyAgICAgICAgdGhpcy5lbmFibGVKZXJzZXlSZXNvdXJjZUNhY2hpbmcgPSBTZXJ2ZXJQcm9wZXJ0aWVzLmdldFZhbHVlKGNvbmZpZy5nZXRQcm9wZXJ0aWVzKCksCisgICAgICAgICAgICAgICAgU2VydmVyUHJvcGVydGllcy5TVUJSRVNPVVJDRV9MT0NBVE9SX0NBQ0hFX0pFUlNFWV9SRVNPVVJDRV9FTkFCTEVELAorICAgICAgICAgICAgICAgIEJvb2xlYW4uRkFMU0UsCisgICAgICAgICAgICAgICAgQm9vbGVhbi5jbGFzcyk7CisKKyAgICAgICAgZmluYWwgaW50IHNpemUgPSBTZXJ2ZXJQcm9wZXJ0aWVzLmdldFZhbHVlKGNvbmZpZy5nZXRQcm9wZXJ0aWVzKCksCisgICAgICAgICAgICAgICAgU2VydmVyUHJvcGVydGllcy5TVUJSRVNPVVJDRV9MT0NBVE9SX0NBQ0hFX1NJWkUsCisgICAgICAgICAgICAgICAgU2VydmVyUHJvcGVydGllcy5TVUJSRVNPVVJDRV9MT0NBVE9SX0RFRkFVTFRfQ0FDSEVfU0laRSwKKyAgICAgICAgICAgICAgICBJbnRlZ2VyLmNsYXNzKTsKKyAgICAgICAgZmluYWwgaW50IGFnZSA9IFNlcnZlclByb3BlcnRpZXMuZ2V0VmFsdWUoY29uZmlnLmdldFByb3BlcnRpZXMoKSwKKyAgICAgICAgICAgICAgICBTZXJ2ZXJQcm9wZXJ0aWVzLlNVQlJFU09VUkNFX0xPQ0FUT1JfQ0FDSEVfQUdFLAorICAgICAgICAgICAgICAgIC0xLAorICAgICAgICAgICAgICAgIEludGVnZXIuY2xhc3MpOworCisgICAgICAgIC8vIENhY2hlLgorICAgICAgICBmaW5hbCBDYWNoZUJ1aWxkZXI8T2JqZWN0LCBPYmplY3Q+IGNhY2hlQnVpbGRlciA9IENhY2hlQnVpbGRlci5uZXdCdWlsZGVyKCk7CisgICAgICAgIGlmIChzaXplID4gMCkgeworICAgICAgICAgICAgLy8gU2l6ZSBldmljdGlvbiBwb2xpY3kuCisgICAgICAgICAgICBjYWNoZUJ1aWxkZXIubWF4aW11bVNpemUoc2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLkNPTkZJRywgTG9jYWxpemF0aW9uTWVzc2FnZXMuU1VCUkVTX0xPQ19DQUNIRV9JTlZBTElEX1NJWkUoc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgU2VydmVyUHJvcGVydGllcy5TVUJSRVNPVVJDRV9MT0NBVE9SX0RFRkFVTFRfQ0FDSEVfU0laRSkpOworCisgICAgICAgICAgICAvLyBJbnZhbGlkIHZhbHVlLiBGYWxsYmFjayB0byB0aGUgZGVmYXVsdCB2YWx1ZS4KKyAgICAgICAgICAgIGNhY2hlQnVpbGRlci5tYXhpbXVtU2l6ZShTZXJ2ZXJQcm9wZXJ0aWVzLlNVQlJFU09VUkNFX0xPQ0FUT1JfREVGQVVMVF9DQUNIRV9TSVpFKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYWdlID4gMCkgeworICAgICAgICAgICAgLy8gQWdlIGV2aWN0aW9uIHBvbGljeS4KKyAgICAgICAgICAgIGNhY2hlQnVpbGRlci5leHBpcmVBZnRlckFjY2VzcyhhZ2UsIFRpbWVVbml0LlNFQ09ORFMpOworICAgICAgICB9CisgICAgICAgIGNhY2hlID0gY2FjaGVCdWlsZGVyLmJ1aWxkKG5ldyBDYWNoZUxvYWRlcjxMb2NhdG9yQ2FjaGVLZXksIExvY2F0b3JSb3V0aW5nPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIExvY2F0b3JSb3V0aW5nIGxvYWQoZmluYWwgTG9jYXRvckNhY2hlS2V5IGtleSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGtleS5jbGF6eiAhPSBudWxsID8gY3JlYXRlUm91dGluZyhrZXkuY2xhenopIDogYnVpbGRSb3V0aW5nKGtleS5yZXNvdXJjZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIE9idGFpbiBhIHN1Yi1yZXNvdXJjZSBsb2NhdG9yIHJvdXRlciBmb3IgZ2l2ZW4gcmVzb3VyY2UgbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlTWV0aG9kIHJlc291cmNlIG1ldGhvZCB0byBvYnRhaW4gdGhlIHJvdXRlciBmb3IuCisgICAgICogQHJldHVybiBzdWItcmVzb3VyY2UgbG9jYXRvciByb3V0ZXIuCisgICAgICovCisgICAgUm91dGVyIGdldFJvdXRlcihmaW5hbCBSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCkgeworICAgICAgICByZXR1cm4gbmV3IFN1YlJlc291cmNlTG9jYXRvclJvdXRlcihjcmVhdGVTZXJ2aWNlRnVuY3Rpb24sIHZhbHVlU3VwcGxpZXJzLCByZXNvdXJjZU1ldGhvZCwgcmVzb3VyY2VDb250ZXh0LCB0aGlzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCdWlsZCAob3Igb2J0YWluIGZyb20gY2FjaGUpIGEgcmVzb3VyY2UgbW9kZWwgYW5kIHJvdXRlciBmb3IgZ2l2ZW4gc3ViLXJlc291cmNlIGxvY2F0b3IgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9jYXRvckNsYXNzIHN1Yi1yZXNvdXJjZSBsb2NhdG9yIGNsYXNzIHRvIGJ1aWx0IG1vZGVsIGFuZCByb3V0ZXIgZm9yLgorICAgICAqIEByZXR1cm4gW2xvY2F0b3IsIHJvdXRlcl0gcGFpciB3aXRoIGJ1aWx0IG1vZGVsIGFuZCByb3V0ZXIgZm9yIHN1Yi1yZXNvdXJjZSBsb2NhdG9yLgorICAgICAqLworICAgIExvY2F0b3JSb3V0aW5nIGdldFJvdXRpbmcoZmluYWwgQ2xhc3M8Pz4gbG9jYXRvckNsYXNzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gY2FjaGUuZ2V0KG5ldyBMb2NhdG9yQ2FjaGVLZXkobG9jYXRvckNsYXNzKSk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEV4ZWN1dGlvbkV4Y2VwdGlvbiBlZSkgeworICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5GSU5FLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5TVUJSRVNfTE9DX0NBQ0hFX0xPQURfRkFJTEVEKGxvY2F0b3JDbGFzcyksIGVlKTsKKyAgICAgICAgICAgIHJldHVybiBjcmVhdGVSb3V0aW5nKGxvY2F0b3JDbGFzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCdWlsZCAob3Igb2J0YWluIGZyb20gY2FjaGUpIGEgcmVzb3VyY2UgbW9kZWwgYW5kIHJvdXRlciBmb3IgZ2l2ZW4gc3ViLXJlc291cmNlIGluamVjdGlvbk1hbmFnZXIKKyAgICAgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlIHJlc291cmNlfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdWJyZXNvdXJjZSBzdWItcmVzb3VyY2UgaW5qZWN0aW9uTWFuYWdlciByZXNvdXJjZSB0byBidWlsdCBtb2RlbCBhbmQgcm91dGVyIGZvci4KKyAgICAgKiBAcmV0dXJuIFtpbmplY3Rpb25NYW5hZ2VyLCByb3V0ZXJdIHBhaXIgd2l0aCBidWlsdCBtb2RlbCBhbmQgcm91dGVyIGZvciBzdWItcmVzb3VyY2UgaW5qZWN0aW9uTWFuYWdlci4KKyAgICAgKi8KKyAgICBMb2NhdG9yUm91dGluZyBnZXRSb3V0aW5nKGZpbmFsIFJlc291cmNlIHN1YnJlc291cmNlKSB7CisgICAgICAgIGlmIChlbmFibGVKZXJzZXlSZXNvdXJjZUNhY2hpbmcpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlLmdldChuZXcgTG9jYXRvckNhY2hlS2V5KHN1YnJlc291cmNlKSk7CisgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGVjdXRpb25FeGNlcHRpb24gZWUpIHsKKyAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLkZJTkUsIExvY2FsaXphdGlvbk1lc3NhZ2VzLlNVQlJFU19MT0NfQ0FDSEVfTE9BRF9GQUlMRUQoc3VicmVzb3VyY2UpLCBlZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkUm91dGluZyhzdWJyZXNvdXJjZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gYnVpbGRSb3V0aW5nKHN1YnJlc291cmNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIHRoZSBtb2RlbCBidWlsZGVyIGNvbnRhaW5zIGEgY2FjaGVkIFtsb2NhdG9yLCByb3V0ZXJdIHBhaXIgZm9yIGEgZ2l2ZW4gc3ViLXJlc291cmNlIGxvY2F0b3IgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3JsQ2xhc3Mgc3ViLXJlc291cmNlIGxvY2F0b3IgY2xhc3MuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIFtsb2NhdG9yLCByb3V0ZXJdIHBhaXIgIGZvciB0aGUgc3ViLXJlc291cmNlIGxvY2F0b3IgY2xhc3MgaXMgcHJlc2VudCBpbiB0aGUgY2FjaGUsCisgICAgICoge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbGVhbiBpc0NhY2hlZChmaW5hbCBDbGFzczw/PiBzcmxDbGFzcykgeworICAgICAgICByZXR1cm4gY2FjaGUuZ2V0SWZQcmVzZW50KHNybENsYXNzKSAhPSBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgTG9jYXRvclJvdXRpbmcgY3JlYXRlUm91dGluZyhmaW5hbCBDbGFzczw/PiBsb2NhdG9yQ2xhc3MpIHsKKyAgICAgICAgUmVzb3VyY2UuQnVpbGRlciBidWlsZGVyID0gUmVzb3VyY2UuYnVpbGRlcihsb2NhdG9yQ2xhc3MsIGRpc2FibGVWYWxpZGF0aW9uKTsKKyAgICAgICAgaWYgKGJ1aWxkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gcmVzb3VyY2UgaXMgZW1wdHkgLSBkbyBub3QgdGhyb3cgNDA0LCB3YWl0IGlmIE1vZGVsUHJvY2Vzc29ycyBhZGQgYW55IG1ldGhvZAorICAgICAgICAgICAgYnVpbGRlciA9IFJlc291cmNlLmJ1aWxkZXIoKS5uYW1lKGxvY2F0b3JDbGFzcy5nZXROYW1lKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGJ1aWxkUm91dGluZyhidWlsZGVyLmJ1aWxkKCkpOworICAgIH0KKworICAgIHByaXZhdGUgTG9jYXRvclJvdXRpbmcgYnVpbGRSb3V0aW5nKGZpbmFsIFJlc291cmNlIHN1YlJlc291cmNlKSB7CisgICAgICAgIGZpbmFsIFJlc291cmNlTW9kZWwgbW9kZWwgPSBuZXcgUmVzb3VyY2VNb2RlbC5CdWlsZGVyKHRydWUpLmFkZFJlc291cmNlKHN1YlJlc291cmNlKS5idWlsZCgpOworICAgICAgICBmaW5hbCBSZXNvdXJjZU1vZGVsIGVuaGFuY2VkTW9kZWwgPSBlbmhhbmNlKG1vZGVsKTsKKworICAgICAgICBpZiAoIWRpc2FibGVWYWxpZGF0aW9uKSB7CisgICAgICAgICAgICB2YWxpZGF0ZVJlc291cmNlKGVuaGFuY2VkTW9kZWwpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgUmVzb3VyY2UgZW5oYW5jZWRMb2NhdG9yID0gZW5oYW5jZWRNb2RlbC5nZXRSZXNvdXJjZXMoKS5nZXQoMCk7CisgICAgICAgIGZvciAoZmluYWwgQ2xhc3M8Pz4gaGFuZGxlckNsYXNzIDogZW5oYW5jZWRMb2NhdG9yLmdldEhhbmRsZXJDbGFzc2VzKCkpIHsKKyAgICAgICAgICAgIHJlc291cmNlQ29udGV4dC5iaW5kUmVzb3VyY2UoaGFuZGxlckNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgTG9jYXRvclJvdXRpbmcoZW5oYW5jZWRNb2RlbCwKKyAgICAgICAgICAgICAgICBydW50aW1lTW9kZWxCdWlsZGVyLmJ1aWxkTW9kZWwoZW5oYW5jZWRNb2RlbC5nZXRSdW50aW1lUmVzb3VyY2VNb2RlbCgpLCB0cnVlKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZhbGlkYXRlUmVzb3VyY2UoZmluYWwgUmVzb3VyY2VNb2RlbENvbXBvbmVudCBjb21wb25lbnQpIHsKKyAgICAgICAgRXJyb3JzLnByb2Nlc3MobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgZmluYWwgQ29tcG9uZW50TW9kZWxWYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IENvbXBvbmVudE1vZGVsVmFsaWRhdG9yKHZhbHVlU3VwcGxpZXJzLCBtZXNzYWdlQm9keVdvcmtlcnMpOworICAgICAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZShjb21wb25lbnQpOworCisgICAgICAgICAgICAgICAgaWYgKEVycm9ycy5mYXRhbElzc3Vlc0ZvdW5kKCkgJiYgIWlnbm9yZVZhbGlkYXRpb25FcnJvcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1vZGVsVmFsaWRhdGlvbkV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9WQUxJREFUSU9OX1NVQlJFU09VUkNFKCksIE1vZGVsRXJyb3JzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEVycm9yc0FzUmVzb3VyY2VNb2RlbElzc3VlcygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgUmVzb3VyY2VNb2RlbCBlbmhhbmNlKFJlc291cmNlTW9kZWwgc3ViUmVzb3VyY2VNb2RlbCkgeworICAgICAgICBmb3IgKGZpbmFsIE1vZGVsUHJvY2Vzc29yIG1vZGVsUHJvY2Vzc29yIDogbW9kZWxQcm9jZXNzb3JzKSB7CisgICAgICAgICAgICBzdWJSZXNvdXJjZU1vZGVsID0gbW9kZWxQcm9jZXNzb3IucHJvY2Vzc1N1YlJlc291cmNlKHN1YlJlc291cmNlTW9kZWwsIGNvbmZpZyk7CisgICAgICAgICAgICB2YWxpZGF0ZVN1YlJlc291cmNlKHN1YlJlc291cmNlTW9kZWwpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdWJSZXNvdXJjZU1vZGVsOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVN1YlJlc291cmNlKGZpbmFsIFJlc291cmNlTW9kZWwgc3ViUmVzb3VyY2VNb2RlbCkgeworICAgICAgICBpZiAoc3ViUmVzb3VyY2VNb2RlbC5nZXRSZXNvdXJjZXMoKS5zaXplKCkgIT0gMSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfU1VCX1JFU09VUkNFX0xPQ0FUT1JfTU9SRV9SRVNPVVJDRVMoc3ViUmVzb3VyY2VNb2RlbAorICAgICAgICAgICAgICAgICAgICAuZ2V0UmVzb3VyY2VzKCkuc2l6ZSgpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBMb2NhdG9yQ2FjaGVLZXkgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgQ2xhc3M8Pz4gY2xheno7CisgICAgICAgIHByaXZhdGUgZmluYWwgUmVzb3VyY2UgcmVzb3VyY2U7CisKKyAgICAgICAgcHVibGljIExvY2F0b3JDYWNoZUtleShmaW5hbCBDbGFzczw/PiBjbGF6eikgeworICAgICAgICAgICAgdGhpcyhjbGF6eiwgbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTG9jYXRvckNhY2hlS2V5KGZpbmFsIFJlc291cmNlIHJlc291cmNlKSB7CisgICAgICAgICAgICB0aGlzKG51bGwsIHJlc291cmNlKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgTG9jYXRvckNhY2hlS2V5KGZpbmFsIENsYXNzPD8+IGNsYXp6LCBmaW5hbCBSZXNvdXJjZSByZXNvdXJjZSkgeworICAgICAgICAgICAgdGhpcy5jbGF6eiA9IGNsYXp6OworICAgICAgICAgICAgdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJSZWR1bmRhbnRJZlN0YXRlbWVudCIpCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3QgbykgeworICAgICAgICAgICAgaWYgKHRoaXMgPT0gbykgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgTG9jYXRvckNhY2hlS2V5IHRoYXQgPSAoTG9jYXRvckNhY2hlS2V5KSBvOworCisgICAgICAgICAgICBpZiAoY2xhenogIT0gbnVsbCA/ICFjbGF6ei5lcXVhbHModGhhdC5jbGF6eikgOiB0aGF0LmNsYXp6ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVzb3VyY2UgIT0gbnVsbCA/ICFyZXNvdXJjZS5lcXVhbHModGhhdC5yZXNvdXJjZSkgOiB0aGF0LnJlc291cmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICBpbnQgcmVzdWx0ID0gY2xhenogIT0gbnVsbCA/IGNsYXp6Lmhhc2hDb2RlKCkgOiAwOworICAgICAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyAocmVzb3VyY2UgIT0gbnVsbCA/IHJlc291cmNlLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9yb3V0aW5nL1J1bnRpbWVNb2RlbEJ1aWxkZXIuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3JvdXRpbmcvUnVudGltZU1vZGVsQnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMjliM2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9yb3V0aW5nL1J1bnRpbWVNb2RlbEJ1aWxkZXIuamF2YQpAQCAtMCwwICsxLDI5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwucm91dGluZzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5WYWx1ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uVmFsdWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuTWVzc2FnZUJvZHlXb3JrZXJzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5KZXJzZXlSZXNvdXJjZUNvbnRleHQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLlByb2Nlc3NpbmdQcm92aWRlcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLnByb2Nlc3MuRW5kcG9pbnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLk1vZGVsUHJvY2Vzc29yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNZXRob2Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTWV0aG9kSW52b2tlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUnVudGltZVJlc291cmNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SdW50aW1lUmVzb3VyY2VNb2RlbDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLmludGVybmFsLlZhbHVlUGFyYW1Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS51cmkuUGF0aFBhdHRlcm47CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudXJpLlVyaVRlbXBsYXRlOworCisvKioKKyAqIFRoaXMgaXMgYSBjb21tb24gYmFzZSBmb3Igcm9vdCByZXNvdXJjZSBhbmQgc3ViLXJlc291cmNlIHJ1bnRpbWUgbW9kZWwKKyAqIGJ1aWxkZXIuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworZmluYWwgY2xhc3MgUnVudGltZU1vZGVsQnVpbGRlciB7CisKKyAgICBwcml2YXRlIGZpbmFsIFJlc291cmNlTWV0aG9kSW52b2tlci5CdWlsZGVyIHJlc291cmNlTWV0aG9kSW52b2tlckJ1aWxkZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBNZXNzYWdlQm9keVdvcmtlcnMgbWVzc2FnZUJvZHlXb3JrZXJzOworICAgIHByaXZhdGUgZmluYWwgUHJvY2Vzc2luZ1Byb3ZpZGVycyBwcm9jZXNzaW5nUHJvdmlkZXJzOworCisgICAgLy8gU3ViUmVzb3VyY2VMb2NhdG9yIE1vZGVsIEJ1aWxkZXIuCisgICAgcHJpdmF0ZSBmaW5hbCBWYWx1ZTxSdW50aW1lTG9jYXRvck1vZGVsQnVpbGRlcj4gbG9jYXRvckJ1aWxkZXI7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHJ1bnRpbWUgbW9kZWwgYnVpbGRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZUNvbnRleHQgICAgICAgICAgICAgIEplcnNleSByZXNvdXJjZSBjb250ZXh0LgorICAgICAqIEBwYXJhbSBjb25maWcgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGFwcGxpY2F0aW9uLgorICAgICAqIEBwYXJhbSBtZXNzYWdlQm9keVdvcmtlcnMgICAgICAgICAgIG1lc3NhZ2UgYm9keSBtZXNzYWdlQm9keVdvcmtlcnMuCisgICAgICogQHBhcmFtIHByb2Nlc3NpbmdQcm92aWRlcnMgICAgICAgICAgcHJvY2Vzc2luZyBwcm92aWRlcnMuCisgICAgICogQHBhcmFtIHJlc291cmNlTWV0aG9kSW52b2tlckJ1aWxkZXIgbWV0aG9kIGludm9rZXIgYnVpbGRlci4KKyAgICAgKiBAcGFyYW0gbW9kZWxQcm9jZXNzb3JzICAgICAgICAgICAgICBhbGwgcmVnaXN0ZXJlZCBtb2RlbCBwcm9jZXNzb3JzLgorICAgICAqIEBwYXJhbSBjcmVhdGVTZXJ2aWNlRnVuY3Rpb24gICAgICAgIGZ1bmN0aW9uIHRoYXQgaXMgYWJsZSB0byBjcmVhdGUgYW5kIGluaXRpYWxpemUgbmV3IHNlcnZpY2UuCisgICAgICovCisgICAgcHVibGljIFJ1bnRpbWVNb2RlbEJ1aWxkZXIoCisgICAgICAgICAgICBmaW5hbCBKZXJzZXlSZXNvdXJjZUNvbnRleHQgcmVzb3VyY2VDb250ZXh0LAorICAgICAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWcsCisgICAgICAgICAgICBmaW5hbCBNZXNzYWdlQm9keVdvcmtlcnMgbWVzc2FnZUJvZHlXb3JrZXJzLAorICAgICAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxWYWx1ZVBhcmFtUHJvdmlkZXI+IHZhbHVlU3VwcGxpZXJzLAorICAgICAgICAgICAgZmluYWwgUHJvY2Vzc2luZ1Byb3ZpZGVycyBwcm9jZXNzaW5nUHJvdmlkZXJzLAorICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VNZXRob2RJbnZva2VyLkJ1aWxkZXIgcmVzb3VyY2VNZXRob2RJbnZva2VyQnVpbGRlciwKKyAgICAgICAgICAgIGZpbmFsIEl0ZXJhYmxlPE1vZGVsUHJvY2Vzc29yPiBtb2RlbFByb2Nlc3NvcnMsCisgICAgICAgICAgICBmaW5hbCBGdW5jdGlvbjxDbGFzczw/PiwgPz4gY3JlYXRlU2VydmljZUZ1bmN0aW9uKSB7CisKKyAgICAgICAgdGhpcy5yZXNvdXJjZU1ldGhvZEludm9rZXJCdWlsZGVyID0gcmVzb3VyY2VNZXRob2RJbnZva2VyQnVpbGRlcjsKKyAgICAgICAgdGhpcy5tZXNzYWdlQm9keVdvcmtlcnMgPSBtZXNzYWdlQm9keVdvcmtlcnM7CisgICAgICAgIHRoaXMucHJvY2Vzc2luZ1Byb3ZpZGVycyA9IHByb2Nlc3NpbmdQcm92aWRlcnM7CisgICAgICAgIHRoaXMubG9jYXRvckJ1aWxkZXIgPSBWYWx1ZXMubGF6eSgoVmFsdWU8UnVudGltZUxvY2F0b3JNb2RlbEJ1aWxkZXI+KQorICAgICAgICAgICAgICAgICgpIC0+IG5ldyBSdW50aW1lTG9jYXRvck1vZGVsQnVpbGRlcihjb25maWcsIG1lc3NhZ2VCb2R5V29ya2VycywgdmFsdWVTdXBwbGllcnMsIHJlc291cmNlQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFJ1bnRpbWVNb2RlbEJ1aWxkZXIudGhpcywgbW9kZWxQcm9jZXNzb3JzLCBjcmVhdGVTZXJ2aWNlRnVuY3Rpb24pKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFJvdXRlciBjcmVhdGVNZXRob2RSb3V0ZXIoZmluYWwgUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QpIHsKKyAgICAgICAgUm91dGVyIG1ldGhvZEFjY2VwdG9yID0gbnVsbDsKKyAgICAgICAgc3dpdGNoIChyZXNvdXJjZU1ldGhvZC5nZXRUeXBlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgUkVTT1VSQ0VfTUVUSE9EOgorICAgICAgICAgICAgY2FzZSBTVUJfUkVTT1VSQ0VfTUVUSE9EOgorICAgICAgICAgICAgICAgIG1ldGhvZEFjY2VwdG9yID0gUm91dGVycy5lbmRwb2ludChjcmVhdGVJbmZsZWN0b3IocmVzb3VyY2VNZXRob2QpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1VCX1JFU09VUkNFX0xPQ0FUT1I6CisgICAgICAgICAgICAgICAgbWV0aG9kQWNjZXB0b3IgPSBsb2NhdG9yQnVpbGRlci5nZXQoKS5nZXRSb3V0ZXIocmVzb3VyY2VNZXRob2QpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ldyBQdXNoTWV0aG9kSGFuZGxlclJvdXRlcihyZXNvdXJjZU1ldGhvZC5nZXRJbnZvY2FibGUoKS5nZXRIYW5kbGVyKCksIG1ldGhvZEFjY2VwdG9yKTsKKyAgICB9CisKKworICAgIHByaXZhdGUgRW5kcG9pbnQgY3JlYXRlSW5mbGVjdG9yKGZpbmFsIFJlc291cmNlTWV0aG9kIG1ldGhvZCkgeworCisgICAgICAgIHJldHVybiByZXNvdXJjZU1ldGhvZEludm9rZXJCdWlsZGVyLmJ1aWxkKAorICAgICAgICAgICAgICAgIG1ldGhvZCwKKyAgICAgICAgICAgICAgICBwcm9jZXNzaW5nUHJvdmlkZXJzCisgICAgICAgICk7CisgICAgfQorCisgICAgcHJpdmF0ZSBSb3V0ZXIgY3JlYXRlUm9vdFJvdXRlcihmaW5hbCBQYXRoTWF0Y2hpbmdSb3V0ZXJCdWlsZGVyIGxhc3RSb3V0ZWRCdWlsZGVyLCBmaW5hbCBib29sZWFuIHN1YlJlc291cmNlTW9kZSkgeworICAgICAgICBmaW5hbCBSb3V0ZXIgcm91dGluZ1Jvb3Q7CisgICAgICAgIGlmIChsYXN0Um91dGVkQnVpbGRlciAhPSBudWxsKSB7CisgICAgICAgICAgICByb3V0aW5nUm9vdCA9IGxhc3RSb3V0ZWRCdWlsZGVyLmJ1aWxkKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQ3JlYXRlIGFuIGVtcHR5IHJvdXRpbmcgcm9vdCB0aGF0IGFjY2VwdHMgYW55IHJlcXVlc3QsIGRvZXMgbm90IGRvCisgICAgICAgICAgICAgKiBhbnl0aGluZyBhbmQgZG9lcyBub3QgcmV0dXJuIGFueSBpbmZsZWN0b3IuIFRoaXMgd2lsbCBjYXVzZSA0MDQgYmVpbmcKKyAgICAgICAgICAgICAqIHJldHVybmVkIGZvciBldmVyeSByZXF1ZXN0LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICByb3V0aW5nUm9vdCA9IFJvdXRlcnMubm9vcCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN1YlJlc291cmNlTW9kZSkgeworICAgICAgICAgICAgcmV0dXJuIHJvdXRpbmdSb290OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBNYXRjaFJlc3VsdEluaXRpYWxpemVyUm91dGVyKHJvdXRpbmdSb290KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEJ1aWxkIGEgcnVudGltZSBtb2RlbCBvZiByb3V0ZXJzIGJhc2VkIG9uIHRoZSB7QGNvZGUgcmVzb3VyY2VNb2RlbH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VNb2RlbCAgIFJlc291cmNlIG1vZGVsIGZyb20gd2hpY2ggdGhlIHJ1bnRpbWUgbW9kZWwgc2hvdWxkIGJlIGJ1aWx0LgorICAgICAqIEBwYXJhbSBzdWJSZXNvdXJjZU1vZGUgVHJ1ZSBpZiB0aGUge0Bjb2RlIHJlc291cmNlTW9kZWx9IGlzIGEgc3ViIHJlc291cmNlIG1vZGVsIHJldHVybmVkIGZyb20gc3ViIHJlc291cmNlIGxvY2F0b3IuCisgICAgICogQHJldHVybiBSb290IHJvdXRlciBvZiB0aGUgcm91dGVyIHN0cnVjdHVyZSByZXByZXNlbnRpbmcgdGhlIHJlc291cmNlIG1vZGVsLgorICAgICAqLworICAgIHB1YmxpYyBSb3V0ZXIgYnVpbGRNb2RlbChmaW5hbCBSdW50aW1lUmVzb3VyY2VNb2RlbCByZXNvdXJjZU1vZGVsLCBmaW5hbCBib29sZWFuIHN1YlJlc291cmNlTW9kZSkgeworICAgICAgICBmaW5hbCBMaXN0PFJ1bnRpbWVSZXNvdXJjZT4gcnVudGltZVJlc291cmNlcyA9IHJlc291cmNlTW9kZWwuZ2V0UnVudGltZVJlc291cmNlcygpOworCisgICAgICAgIGZpbmFsIFB1c2hNYXRjaGVkVXJpUm91dGVyIHVyaVB1c2hpbmdSb3V0ZXIgPSBuZXcgUHVzaE1hdGNoZWRVcmlSb3V0ZXIoKTsKKyAgICAgICAgUGF0aE1hdGNoaW5nUm91dGVyQnVpbGRlciBjdXJyZW50Um91dGVyQnVpbGRlciA9IG51bGw7CisKKyAgICAgICAgLy8gcm91dGUgbWV0aG9kcworICAgICAgICBmb3IgKGZpbmFsIFJ1bnRpbWVSZXNvdXJjZSByZXNvdXJjZSA6IHJ1bnRpbWVSZXNvdXJjZXMpIHsKKyAgICAgICAgICAgIGZpbmFsIFB1c2hNYXRjaGVkUnVudGltZVJlc291cmNlUm91dGVyIHJlc291cmNlUHVzaGluZ1JvdXRlciA9IG5ldyBQdXNoTWF0Y2hlZFJ1bnRpbWVSZXNvdXJjZVJvdXRlcihyZXNvdXJjZSk7CisKKyAgICAgICAgICAgIC8vIHJlc291cmNlIG1ldGhvZHMKKyAgICAgICAgICAgIGlmICghcmVzb3VyY2UuZ2V0UmVzb3VyY2VNZXRob2RzKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxNZXRob2RSb3V0aW5nPiBtZXRob2RSb3V0aW5ncyA9IGNyZWF0ZVJlc291cmNlTWV0aG9kUm91dGVycyhyZXNvdXJjZSwgc3ViUmVzb3VyY2VNb2RlKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBSb3V0ZXIgbWV0aG9kU2VsZWN0aW5nUm91dGVyID0gbmV3IE1ldGhvZFNlbGVjdGluZ1JvdXRlcihtZXNzYWdlQm9keVdvcmtlcnMsIG1ldGhvZFJvdXRpbmdzKTsKKyAgICAgICAgICAgICAgICBpZiAoc3ViUmVzb3VyY2VNb2RlKSB7CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRSb3V0ZXJCdWlsZGVyID0gc3RhcnROZXh0Um91dGUoY3VycmVudFJvdXRlckJ1aWxkZXIsIFBhdGhQYXR0ZXJuLkVORF9PRl9QQVRIX1BBVFRFUk4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvKHJlc291cmNlUHVzaGluZ1JvdXRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG8obWV0aG9kU2VsZWN0aW5nUm91dGVyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjdXJyZW50Um91dGVyQnVpbGRlciA9IHN0YXJ0TmV4dFJvdXRlKGN1cnJlbnRSb3V0ZXJCdWlsZGVyLCBQYXRoUGF0dGVybi5hc0Nsb3NlZChyZXNvdXJjZS5nZXRQYXRoUGF0dGVybigpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG8odXJpUHVzaGluZ1JvdXRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG8ocmVzb3VyY2VQdXNoaW5nUm91dGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50byhtZXRob2RTZWxlY3RpbmdSb3V0ZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgUGF0aE1hdGNoaW5nUm91dGVyQnVpbGRlciBzclJvdXRlZEJ1aWxkZXIgPSBudWxsOworICAgICAgICAgICAgaWYgKCFyZXNvdXJjZS5nZXRDaGlsZFJ1bnRpbWVSZXNvdXJjZXMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIFJ1bnRpbWVSZXNvdXJjZSBjaGlsZFJlc291cmNlIDogcmVzb3VyY2UuZ2V0Q2hpbGRSdW50aW1lUmVzb3VyY2VzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgUGF0aFBhdHRlcm4gY2hpbGRPcGVuUGF0dGVybiA9IGNoaWxkUmVzb3VyY2UuZ2V0UGF0aFBhdHRlcm4oKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgUGF0aFBhdHRlcm4gY2hpbGRDbG9zZWRQYXR0ZXJuID0gUGF0aFBhdHRlcm4uYXNDbG9zZWQoY2hpbGRPcGVuUGF0dGVybik7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFB1c2hNYXRjaGVkUnVudGltZVJlc291cmNlUm91dGVyIGNoaWxkUmVzb3VyY2VQdXNoaW5nUm91dGVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHVzaE1hdGNoZWRSdW50aW1lUmVzb3VyY2VSb3V0ZXIoY2hpbGRSZXNvdXJjZSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gc3ViIHJlc291cmNlIG1ldGhvZHMKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZFJlc291cmNlLmdldFJlc291cmNlTWV0aG9kcygpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxNZXRob2RSb3V0aW5nPiBjaGlsZE1ldGhvZFJvdXRpbmdzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlUmVzb3VyY2VNZXRob2RSb3V0ZXJzKGNoaWxkUmVzb3VyY2UsIHN1YlJlc291cmNlTW9kZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyUm91dGVkQnVpbGRlciA9IHN0YXJ0TmV4dFJvdXRlKHNyUm91dGVkQnVpbGRlciwgY2hpbGRDbG9zZWRQYXR0ZXJuKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG8odXJpUHVzaGluZ1JvdXRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvKGNoaWxkUmVzb3VyY2VQdXNoaW5nUm91dGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG8obmV3IE1ldGhvZFNlbGVjdGluZ1JvdXRlcihtZXNzYWdlQm9keVdvcmtlcnMsIGNoaWxkTWV0aG9kUm91dGluZ3MpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIHN1YiByZXNvdXJjZSBsb2NhdG9yCisgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZFJlc291cmNlLmdldFJlc291cmNlTG9jYXRvcigpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFB1c2hNYXRjaGVkVGVtcGxhdGVSb3V0ZXIgbG9jVGVtcGxhdGVSb3V0ZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUZW1wbGF0ZVJvdXRlckZvckNoaWxkTG9jYXRvcihzdWJSZXNvdXJjZU1vZGUsIGNoaWxkUmVzb3VyY2UpOworCisgICAgICAgICAgICAgICAgICAgICAgICBzclJvdXRlZEJ1aWxkZXIgPSBzdGFydE5leHRSb3V0ZShzclJvdXRlZEJ1aWxkZXIsIGNoaWxkT3BlblBhdHRlcm4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50byh1cmlQdXNoaW5nUm91dGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG8obG9jVGVtcGxhdGVSb3V0ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50byhjaGlsZFJlc291cmNlUHVzaGluZ1JvdXRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvKG5ldyBQdXNoTWF0Y2hlZE1ldGhvZFJvdXRlcihjaGlsZFJlc291cmNlLmdldFJlc291cmNlTG9jYXRvcigpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvKGNyZWF0ZU1ldGhvZFJvdXRlcihjaGlsZFJlc291cmNlLmdldFJlc291cmNlTG9jYXRvcigpKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHJlc291cmNlIGxvY2F0b3Igd2l0aCBlbXB0eSBwYXRoCisgICAgICAgICAgICBpZiAocmVzb3VyY2UuZ2V0UmVzb3VyY2VMb2NhdG9yKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFB1c2hNYXRjaGVkVGVtcGxhdGVSb3V0ZXIgcmVzb3VyY2VUZW1wbGF0ZVJvdXRlciA9IGdldFRlbXBsYXRlUm91dGVyKHN1YlJlc291cmNlTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldExvY2F0b3JSZXNvdXJjZShyZXNvdXJjZSkuZ2V0UGF0aFBhdHRlcm4oKS5nZXRUZW1wbGF0ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgUGF0aFBhdHRlcm4uT1BFTl9ST09UX1BBVEhfUEFUVEVSTi5nZXRUZW1wbGF0ZSgpKTsKKworICAgICAgICAgICAgICAgIHNyUm91dGVkQnVpbGRlciA9IHN0YXJ0TmV4dFJvdXRlKHNyUm91dGVkQnVpbGRlciwgUGF0aFBhdHRlcm4uT1BFTl9ST09UX1BBVEhfUEFUVEVSTikKKyAgICAgICAgICAgICAgICAgICAgICAgIC50byh1cmlQdXNoaW5nUm91dGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgLnRvKHJlc291cmNlVGVtcGxhdGVSb3V0ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAudG8obmV3IFB1c2hNYXRjaGVkTWV0aG9kUm91dGVyKHJlc291cmNlLmdldFJlc291cmNlTG9jYXRvcigpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC50byhjcmVhdGVNZXRob2RSb3V0ZXIocmVzb3VyY2UuZ2V0UmVzb3VyY2VMb2NhdG9yKCkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNyUm91dGVkQnVpbGRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgUm91dGVyIG1ldGhvZFJvdXRlciA9IHNyUm91dGVkQnVpbGRlci5idWlsZCgpOworCisgICAgICAgICAgICAgICAgaWYgKHN1YlJlc291cmNlTW9kZSkgeworICAgICAgICAgICAgICAgICAgICBjdXJyZW50Um91dGVyQnVpbGRlciA9IHN0YXJ0TmV4dFJvdXRlKGN1cnJlbnRSb3V0ZXJCdWlsZGVyLCBQYXRoUGF0dGVybi5PUEVOX1JPT1RfUEFUSF9QQVRURVJOKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50byhyZXNvdXJjZVB1c2hpbmdSb3V0ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvKG1ldGhvZFJvdXRlcik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudFJvdXRlckJ1aWxkZXIgPSBzdGFydE5leHRSb3V0ZShjdXJyZW50Um91dGVyQnVpbGRlciwgcmVzb3VyY2UuZ2V0UGF0aFBhdHRlcm4oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG8odXJpUHVzaGluZ1JvdXRlcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG8ocmVzb3VyY2VQdXNoaW5nUm91dGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50byhtZXRob2RSb3V0ZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3JlYXRlUm9vdFJvdXRlcihjdXJyZW50Um91dGVyQnVpbGRlciwgc3ViUmVzb3VyY2VNb2RlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFB1c2hNYXRjaGVkVGVtcGxhdGVSb3V0ZXIgZ2V0VGVtcGxhdGVSb3V0ZXJGb3JDaGlsZExvY2F0b3IoZmluYWwgYm9vbGVhbiBzdWJSZXNvdXJjZU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJ1bnRpbWVSZXNvdXJjZSBjaGlsZCkgeworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIGZvciAoZmluYWwgUmVzb3VyY2UgcmVzIDogY2hpbGQuZ2V0UmVzb3VyY2VzKCkpIHsKKyAgICAgICAgICAgIGlmIChyZXMuZ2V0UmVzb3VyY2VMb2NhdG9yKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBnZXRUZW1wbGF0ZVJvdXRlcihzdWJSZXNvdXJjZU1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5nZXRQYXJlbnRSZXNvdXJjZXMoKS5nZXQoaSkuZ2V0UGF0aFBhdHRlcm4oKS5nZXRUZW1wbGF0ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVzLmdldFBhdGhQYXR0ZXJuKCkuZ2V0VGVtcGxhdGUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisKKyAgICBwcml2YXRlIFB1c2hNYXRjaGVkVGVtcGxhdGVSb3V0ZXIgZ2V0VGVtcGxhdGVSb3V0ZXIoZmluYWwgYm9vbGVhbiBzdWJSZXNvdXJjZU1vZGUsIGZpbmFsIFVyaVRlbXBsYXRlIHBhcmVudFRlbXBsYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBVcmlUZW1wbGF0ZSBjaGlsZFRlbXBsYXRlKSB7CisgICAgICAgIGlmIChjaGlsZFRlbXBsYXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUHVzaE1hdGNoZWRUZW1wbGF0ZVJvdXRlcigKKyAgICAgICAgICAgICAgICAgICAgc3ViUmVzb3VyY2VNb2RlID8gUGF0aFBhdHRlcm4uT1BFTl9ST09UX1BBVEhfUEFUVEVSTi5nZXRUZW1wbGF0ZSgpIDogcGFyZW50VGVtcGxhdGUsCisgICAgICAgICAgICAgICAgICAgIGNoaWxkVGVtcGxhdGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBQdXNoTWF0Y2hlZFRlbXBsYXRlUm91dGVyKAorICAgICAgICAgICAgICAgICAgICBzdWJSZXNvdXJjZU1vZGUgPyBQYXRoUGF0dGVybi5FTkRfT0ZfUEFUSF9QQVRURVJOLmdldFRlbXBsYXRlKCkgOiBwYXJlbnRUZW1wbGF0ZSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHByaXZhdGUgUmVzb3VyY2UgZ2V0TG9jYXRvclJlc291cmNlKGZpbmFsIFJ1bnRpbWVSZXNvdXJjZSByZXNvdXJjZSkgeworICAgICAgICBmb3IgKGZpbmFsIFJlc291cmNlIHJlcyA6IHJlc291cmNlLmdldFJlc291cmNlcygpKSB7CisgICAgICAgICAgICBpZiAocmVzLmdldFJlc291cmNlTG9jYXRvcigpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgTGlzdDxNZXRob2RSb3V0aW5nPiBjcmVhdGVSZXNvdXJjZU1ldGhvZFJvdXRlcnMoCisgICAgICAgICAgICBmaW5hbCBSdW50aW1lUmVzb3VyY2UgcnVudGltZVJlc291cmNlLCBmaW5hbCBib29sZWFuIHN1YlJlc291cmNlTW9kZSkgeworCisgICAgICAgIGZpbmFsIExpc3Q8TWV0aG9kUm91dGluZz4gbWV0aG9kUm91dGluZ3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBmb3IgKGZpbmFsIFJlc291cmNlIHJlc291cmNlIDogcnVudGltZVJlc291cmNlLmdldFJlc291cmNlcygpKSB7CisKKyAgICAgICAgICAgIGZpbmFsIFJlc291cmNlIHBhcmVudFJlc291cmNlID0gcnVudGltZVJlc291cmNlLmdldFBhcmVudCgpID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgPyBudWxsIDogcnVudGltZVJlc291cmNlLmdldFBhcmVudFJlc291cmNlcygpLmdldChpKyspOworCisgICAgICAgICAgICBmaW5hbCBVcmlUZW1wbGF0ZSB0ZW1wbGF0ZSA9IHJlc291cmNlLmdldFBhdGhQYXR0ZXJuKCkuZ2V0VGVtcGxhdGUoKTsKKworICAgICAgICAgICAgZmluYWwgUHVzaE1hdGNoZWRUZW1wbGF0ZVJvdXRlciB0ZW1wbGF0ZVJvdXRlciA9IHBhcmVudFJlc291cmNlID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgPyBnZXRUZW1wbGF0ZVJvdXRlcihzdWJSZXNvdXJjZU1vZGUsIHRlbXBsYXRlLCBudWxsKQorICAgICAgICAgICAgICAgICAgICA6IGdldFRlbXBsYXRlUm91dGVyKHN1YlJlc291cmNlTW9kZSwgcGFyZW50UmVzb3VyY2UuZ2V0UGF0aFBhdHRlcm4oKS5nZXRUZW1wbGF0ZSgpLCB0ZW1wbGF0ZSk7CisKKyAgICAgICAgICAgIGZvciAoZmluYWwgUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QgOiByZXNvdXJjZS5nZXRSZXNvdXJjZU1ldGhvZHMoKSkgeworICAgICAgICAgICAgICAgIG1ldGhvZFJvdXRpbmdzLmFkZChuZXcgTWV0aG9kUm91dGluZyhyZXNvdXJjZU1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUm91dGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFB1c2hNYXRjaGVkTWV0aG9kUm91dGVyKHJlc291cmNlTWV0aG9kKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZU1ldGhvZFJvdXRlcihyZXNvdXJjZU1ldGhvZCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbWV0aG9kUm91dGluZ3MuaXNFbXB0eSgpID8gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkgOiBtZXRob2RSb3V0aW5nczsKKyAgICB9CisKKyAgICBwcml2YXRlIFBhdGhUb1JvdXRlckJ1aWxkZXIgc3RhcnROZXh0Um91dGUoZmluYWwgUGF0aE1hdGNoaW5nUm91dGVyQnVpbGRlciBjdXJyZW50Um91dGVyQnVpbGRlciwgUGF0aFBhdHRlcm4gcm91dGluZ1BhdHRlcm4pIHsKKyAgICAgICAgcmV0dXJuIGN1cnJlbnRSb3V0ZXJCdWlsZGVyID09IG51bGwKKyAgICAgICAgICAgICAgICA/IFBhdGhNYXRjaGluZ1JvdXRlckJ1aWxkZXIubmV3Um91dGUocm91dGluZ1BhdHRlcm4pIDogY3VycmVudFJvdXRlckJ1aWxkZXIucm91dGUocm91dGluZ1BhdHRlcm4pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3JvdXRpbmcvU2luZ2xlTWF0Y2hSZXN1bHQuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3JvdXRpbmcvU2luZ2xlTWF0Y2hSZXN1bHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODJkNjZlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvcm91dGluZy9TaW5nbGVNYXRjaFJlc3VsdC5qYXZhCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5yb3V0aW5nOworCitpbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoUmVzdWx0OworCisvKioKKyAqIHtAbGluayBNYXRjaFJlc3VsdH0gaW1wbGVtZW50YXRpb24gdGhhdCByZXR1cm5zIHRoZSBuZXN0ZWQgc3RyaW5nIGFzIGEKKyAqIHNpbmdsZSBtYXRjaGluZyByZXN1bHQuIFRoaXMgbWF0Y2ggcmVzdWx0IG1pbWljcyBtYXRjaGluZyBvZiBhIHNpbmdsZQorICogbWF0Y2hpbmcgZ3JvdXAgd2l0aCBncm91cCBpbmRleCAwICh0aGUgb25lIGNvbnRhaW5pbmcgdGhlIHdob2xlIGV4cHJlc3Npb24pLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK2ZpbmFsIGNsYXNzIFNpbmdsZU1hdGNoUmVzdWx0IGltcGxlbWVudHMgTWF0Y2hSZXN1bHQgeworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcGF0aDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG1hdGNoIHJlc3VsdCBtYXRjaGluZyB0aGUgd2hvbGUgc3VwcGxpZWQgcGF0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIG1hdGNoZWQgcGF0aC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2luZ2xlTWF0Y2hSZXN1bHQoZmluYWwgU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgdGhpcy5wYXRoID0gc3RyaXBNYXRyaXhQYXJhbXMocGF0aCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RyaXAgdGhlIG1hdHJpeCBwYXJhbWV0ZXJzIGZyb20gYSBwYXRoLgorICAgICAqCisgICAgICogQHJldHVybiBwYXRoIHN0cmlwcGVkIG9mIG1hdHJpeCBwYXJhbWV0ZXJzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzdHJpcE1hdHJpeFBhcmFtcyhmaW5hbCBTdHJpbmcgcGF0aCkgeworICAgICAgICBpbnQgZSA9IHBhdGguaW5kZXhPZignOycpOworICAgICAgICBpZiAoZSA9PSAtMSkgeworICAgICAgICAgICAgcmV0dXJuIHBhdGg7CisgICAgICAgIH0KKworICAgICAgICBpbnQgcyA9IDA7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBkbyB7CisgICAgICAgICAgICAvLyBBcHBlbmQgZXZlcnl0aGluZyB1cCB0byBidXQgbm90IGluY2x1ZGluZyB0aGUgJzsnCisgICAgICAgICAgICBzYi5hcHBlbmQocGF0aCwgcywgZSk7CisKKyAgICAgICAgICAgIC8vIFNraXAgZXZlcnl0aGluZyB1cCB0byBidXQgbm90IGluY2x1ZGluZyB0aGUgJy8nCisgICAgICAgICAgICBzID0gcGF0aC5pbmRleE9mKCcvJywgZSArIDEpOworICAgICAgICAgICAgaWYgKHMgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGUgPSBwYXRoLmluZGV4T2YoJzsnLCBzKTsKKyAgICAgICAgfSB3aGlsZSAoZSAhPSAtMSk7CisKKyAgICAgICAgaWYgKHMgIT0gLTEpIHsKKyAgICAgICAgICAgIC8vIEFwcGVuZCBhbnkgcmVtYWluaW5nIGNoYXJhY3RlcnMKKyAgICAgICAgICAgIHNiLmFwcGVuZChwYXRoLCBzLCBwYXRoLmxlbmd0aCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBzdGFydCgpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBzdGFydChmaW5hbCBpbnQgZ3JvdXApIHsKKyAgICAgICAgaWYgKGdyb3VwID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBzdGFydCgpOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBlbmQoKSB7CisgICAgICAgIHJldHVybiBwYXRoLmxlbmd0aCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZW5kKGZpbmFsIGludCBncm91cCkgeworICAgICAgICBpZiAoZ3JvdXAgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGVuZCgpOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBncm91cCgpIHsKKyAgICAgICAgcmV0dXJuIHBhdGg7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBncm91cChmaW5hbCBpbnQgZ3JvdXApIHsKKyAgICAgICAgaWYgKGdyb3VwID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBncm91cCgpOworICAgICAgICB9CisgICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBncm91cENvdW50KCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9yb3V0aW5nL1N1YlJlc291cmNlTG9jYXRvclJvdXRlci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvcm91dGluZy9TdWJSZXNvdXJjZUxvY2F0b3JSb3V0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTBiMTczCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvcm91dGluZy9TdWJSZXNvdXJjZUxvY2F0b3JSb3V0ZXIuamF2YQpAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwucm91dGluZzsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlVuZGVjbGFyZWRUaHJvd2FibGVFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLk5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5TZWN1cml0eUNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU3ViamVjdFNlY3VyaXR5Q29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuSmVyc2V5UmVzb3VyY2VDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwucHJvY2Vzcy5NYXBwYWJsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwucHJvY2Vzcy5SZXF1ZXN0UHJvY2Vzc2luZ0NvbnRleHQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1ldGhvZDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5SZXF1ZXN0RXZlbnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5pbnRlcm5hbC5QYXJhbVZhbHVlRmFjdG9yeVdpdGhTb3VyY2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5pbnRlcm5hbC5QYXJhbWV0ZXJWYWx1ZUhlbHBlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLmludGVybmFsLlZhbHVlUGFyYW1Qcm92aWRlcjsKKworLyoqCisgKiBBbiBtZXRob2RBY2NlcHRvclBhaXIgdG8gYWNjZXB0IHN1Yi1yZXNvdXJjZSByZXF1ZXN0cy4KKyAqIEl0IGZpcnN0IHJldHJpZXZlcyB0aGUgc3ViLXJlc291cmNlIGluc3RhbmNlIGJ5IGludm9raW5nIHRoZSBnaXZlbiBtb2RlbCBtZXRob2QuCisgKiBUaGVuIHRoZSB7QGxpbmsgUnVudGltZUxvY2F0b3JNb2RlbEJ1aWxkZXJ9IGlzIHVzZWQgdG8gZ2VuZXJhdGUgY29ycmVzcG9uZGluZyBtZXRob2RBY2NlcHRvclBhaXIuCisgKiBGaW5hbGx5IHRoZSBnZW5lcmF0ZWQgbWV0aG9kQWNjZXB0b3JQYWlyIGlzIGludm9rZWQgdG8gcmV0dXJuIHRoZSByZXF1ZXN0IG1ldGhvZEFjY2VwdG9yUGFpciBjaGFpbi4KKyAqIDxwLz4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK2ZpbmFsIGNsYXNzIFN1YlJlc291cmNlTG9jYXRvclJvdXRlciBpbXBsZW1lbnRzIFJvdXRlciB7CisKKyAgICBwcml2YXRlIGZpbmFsIFJlc291cmNlTWV0aG9kIGxvY2F0b3JNb2RlbDsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8UGFyYW1WYWx1ZUZhY3RvcnlXaXRoU291cmNlPD8+PiB2YWx1ZVByb3ZpZGVyczsKKyAgICBwcml2YXRlIGZpbmFsIFJ1bnRpbWVMb2NhdG9yTW9kZWxCdWlsZGVyIHJ1bnRpbWVMb2NhdG9yQnVpbGRlcjsKKyAgICBwcml2YXRlIGZpbmFsIEplcnNleVJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHQ7CisgICAgcHJpdmF0ZSBmaW5hbCBGdW5jdGlvbjxDbGFzczw/PiwgPz4gY3JlYXRlRnVuY3Rpb247CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgc3ViLXJlc291cmNlIGxvY2F0b3Igcm91dGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGNyZWF0ZVNlcnZpY2VGdW5jdGlvbiBmdW5jdGlvbiB0byBjcmVhdGUgYSBuZXcgc2VydmljZSBhbmQgbWFrZSBvdGhlciBvcGVyYXRpb25zIChpbmplY3Rpb24pLgorICAgICAqIEBwYXJhbSB2YWx1ZVN1cHBsaWVycyAgICAgICAgYWxsIHJlZ2lzdGVyZWQgdmFsdWUgc3VwcGxpZXJzLgorICAgICAqIEBwYXJhbSBsb2NhdG9yTW9kZWwgICAgICAgICAgcmVzb3VyY2UgbG9jYXRvciBtZXRob2QgbW9kZWwuCisgICAgICogQHBhcmFtIHJlc291cmNlQ29udGV4dCAgICAgICByZXNvdXJjZSBjb250ZXh0IHRvIGJpbmQgc3ViLXJlc291cmNlIGxvY2F0b3Igc2luZ2xldG9uIGluc3RhbmNlcy4KKyAgICAgKiBAcGFyYW0gcnVudGltZUxvY2F0b3JCdWlsZGVyIG9yaWdpbmFsIHJ1bnRpbWUgbW9kZWwgYnVpbGRlci4KKyAgICAgKi8KKyAgICBTdWJSZXNvdXJjZUxvY2F0b3JSb3V0ZXIoZmluYWwgRnVuY3Rpb248Q2xhc3M8Pz4sID8+IGNyZWF0ZVNlcnZpY2VGdW5jdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxWYWx1ZVBhcmFtUHJvdmlkZXI+IHZhbHVlU3VwcGxpZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZU1ldGhvZCBsb2NhdG9yTW9kZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEplcnNleVJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJ1bnRpbWVMb2NhdG9yTW9kZWxCdWlsZGVyIHJ1bnRpbWVMb2NhdG9yQnVpbGRlcikgeworICAgICAgICB0aGlzLnJ1bnRpbWVMb2NhdG9yQnVpbGRlciA9IHJ1bnRpbWVMb2NhdG9yQnVpbGRlcjsKKyAgICAgICAgdGhpcy5sb2NhdG9yTW9kZWwgPSBsb2NhdG9yTW9kZWw7CisgICAgICAgIHRoaXMucmVzb3VyY2VDb250ZXh0ID0gcmVzb3VyY2VDb250ZXh0OworICAgICAgICB0aGlzLmNyZWF0ZUZ1bmN0aW9uID0gY3JlYXRlU2VydmljZUZ1bmN0aW9uOworICAgICAgICB0aGlzLnZhbHVlUHJvdmlkZXJzID0gUGFyYW1ldGVyVmFsdWVIZWxwZXIuY3JlYXRlVmFsdWVQcm92aWRlcnModmFsdWVTdXBwbGllcnMsIGxvY2F0b3JNb2RlbC5nZXRJbnZvY2FibGUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENvbnRpbnVhdGlvbiBhcHBseShmaW5hbCBSZXF1ZXN0UHJvY2Vzc2luZ0NvbnRleHQgcHJvY2Vzc2luZ0NvbnRleHQpIHsKKyAgICAgICAgT2JqZWN0IHN1YlJlc291cmNlSW5zdGFuY2UgPSBnZXRSZXNvdXJjZShwcm9jZXNzaW5nQ29udGV4dCk7CisKKyAgICAgICAgaWYgKHN1YlJlc291cmNlSW5zdGFuY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBSb3V0aW5nQ29udGV4dCByb3V0aW5nQ29udGV4dCA9IHByb2Nlc3NpbmdDb250ZXh0LnJvdXRpbmdDb250ZXh0KCk7CisKKyAgICAgICAgZmluYWwgTG9jYXRvclJvdXRpbmcgcm91dGluZzsKKyAgICAgICAgaWYgKHN1YlJlc291cmNlSW5zdGFuY2UgaW5zdGFuY2VvZiBSZXNvdXJjZSkgeworICAgICAgICAgICAgLy8gQ2FjaGluZyBoZXJlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuIEl0IGNhbiBiZSBlbmFibGVkIGJ5IHNldHRpbmcKKyAgICAgICAgICAgIC8vIFNlcnZlclByb3BlcnRpZXMuU1VCUkVTT1VSQ0VfTE9DQVRPUl9DQUNIRV9KRVJTRVlfUkVTT1VSQ0VfRU5BQkxFRCB0byB0cnVlLgorICAgICAgICAgICAgcm91dGluZyA9IHJ1bnRpbWVMb2NhdG9yQnVpbGRlci5nZXRSb3V0aW5nKChSZXNvdXJjZSkgc3ViUmVzb3VyY2VJbnN0YW5jZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDbGFzczw/PiBsb2NhdG9yQ2xhc3MgPSBzdWJSZXNvdXJjZUluc3RhbmNlLmdldENsYXNzKCk7CisKKyAgICAgICAgICAgIGlmIChsb2NhdG9yQ2xhc3MuaXNBc3NpZ25hYmxlRnJvbShDbGFzcy5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICAvLyBzdWJSZXNvdXJjZUluc3RhbmNlIGlzIGNsYXNzIGl0c2VsZgorICAgICAgICAgICAgICAgIGxvY2F0b3JDbGFzcyA9IChDbGFzczw/Pikgc3ViUmVzb3VyY2VJbnN0YW5jZTsKKworICAgICAgICAgICAgICAgIGlmICghcnVudGltZUxvY2F0b3JCdWlsZGVyLmlzQ2FjaGVkKGxvY2F0b3JDbGFzcykpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgY2FuJ3QgY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBjbGFzcywgZG9uJ3QgcHJvY2VlZC4KKyAgICAgICAgICAgICAgICAgICAgc3ViUmVzb3VyY2VJbnN0YW5jZSA9IGNyZWF0ZUZ1bmN0aW9uLmFwcGx5KGxvY2F0b3JDbGFzcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcm91dGluZ0NvbnRleHQucHVzaE1hdGNoZWRSZXNvdXJjZShzdWJSZXNvdXJjZUluc3RhbmNlKTsKKyAgICAgICAgICAgIHJlc291cmNlQ29udGV4dC5iaW5kUmVzb3VyY2VJZlNpbmdsZXRvbihzdWJSZXNvdXJjZUluc3RhbmNlKTsKKworICAgICAgICAgICAgcm91dGluZyA9IHJ1bnRpbWVMb2NhdG9yQnVpbGRlci5nZXRSb3V0aW5nKGxvY2F0b3JDbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICByb3V0aW5nQ29udGV4dC5wdXNoTG9jYXRvclN1YlJlc291cmNlKHJvdXRpbmcubG9jYXRvci5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpOworICAgICAgICBwcm9jZXNzaW5nQ29udGV4dC50cmlnZ2VyRXZlbnQoUmVxdWVzdEV2ZW50LlR5cGUuU1VCUkVTT1VSQ0VfTE9DQVRFRCk7CisKKyAgICAgICAgcmV0dXJuIENvbnRpbnVhdGlvbi5vZihwcm9jZXNzaW5nQ29udGV4dCwgcm91dGluZy5yb3V0ZXIpOworICAgIH0KKworICAgIHByaXZhdGUgT2JqZWN0IGdldFJlc291cmNlKGZpbmFsIFJlcXVlc3RQcm9jZXNzaW5nQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGZpbmFsIE9iamVjdCByZXNvdXJjZSA9IGNvbnRleHQucm91dGluZ0NvbnRleHQoKS5wZWVrTWF0Y2hlZFJlc291cmNlKCk7CisgICAgICAgIGZpbmFsIE1ldGhvZCBoYW5kbGluZ01ldGhvZCA9IGxvY2F0b3JNb2RlbC5nZXRJbnZvY2FibGUoKS5nZXRIYW5kbGluZ01ldGhvZCgpOworICAgICAgICBmaW5hbCBPYmplY3RbXSBwYXJhbWV0ZXJWYWx1ZXMgPSBQYXJhbWV0ZXJWYWx1ZUhlbHBlci5nZXRQYXJhbWV0ZXJWYWx1ZXModmFsdWVQcm92aWRlcnMsIGNvbnRleHQucmVxdWVzdCgpKTsKKworICAgICAgICBjb250ZXh0LnRyaWdnZXJFdmVudChSZXF1ZXN0RXZlbnQuVHlwZS5MT0NBVE9SX01BVENIRUQpOworCisgICAgICAgIGZpbmFsIFByaXZpbGVnZWRBY3Rpb24gaW52b2tlTWV0aG9kQWN0aW9uID0gKCkgLT4geworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxpbmdNZXRob2QuaW52b2tlKHJlc291cmNlLCBwYXJhbWV0ZXJWYWx1ZXMpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB8IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB8IFVuZGVjbGFyZWRUaHJvd2FibGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9SRVNPVVJDRV9KQVZBX01FVEhPRF9JTlZPQ0FUSU9OKCksIGV4KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBUaHJvd2FibGUgY2F1c2UgPSBleC5nZXRDYXVzZSgpOworICAgICAgICAgICAgICAgIGlmIChjYXVzZSBpbnN0YW5jZW9mIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IChXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbikgY2F1c2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gaGFuZGxlIGFsbCBleGNlcHRpb25zIGFzIHBvdGVudGlhbGx5IG1hcHBhYmxlIChpbmNsLiBQcm9jZXNzaW5nRXhjZXB0aW9uKQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBNYXBwYWJsZUV4Y2VwdGlvbihjYXVzZSk7CisgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKHQpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIGZpbmFsIFNlY3VyaXR5Q29udGV4dCBzZWN1cml0eUNvbnRleHQgPSBjb250ZXh0LnJlcXVlc3QoKS5nZXRTZWN1cml0eUNvbnRleHQoKTsKKyAgICAgICAgcmV0dXJuIChzZWN1cml0eUNvbnRleHQgaW5zdGFuY2VvZiBTdWJqZWN0U2VjdXJpdHlDb250ZXh0KQorICAgICAgICAgICAgICAgID8gKChTdWJqZWN0U2VjdXJpdHlDb250ZXh0KSBzZWN1cml0eUNvbnRleHQpLmRvQXNTdWJqZWN0KGludm9rZU1ldGhvZEFjdGlvbikgOiBpbnZva2VNZXRob2RBY3Rpb24ucnVuKCk7CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9yb3V0aW5nL1VyaVJvdXRpbmdDb250ZXh0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9yb3V0aW5nL1VyaVJvdXRpbmdDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYyMTRkMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3JvdXRpbmcvVXJpUm91dGluZ0NvbnRleHQuamF2YQpAQCAtMCwwICsxLDQ5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwucm91dGluZzsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaFJlc3VsdDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkSGFzaE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUGF0aFNlZ21lbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLkltbXV0YWJsZU11bHRpdmFsdWVkTWFwOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuVHJhY2luZ0xvZ2dlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuU2VydmVyVHJhY2VFdmVudDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwucHJvY2Vzcy5FbmRwb2ludDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTWV0aG9kOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1ldGhvZEludm9rZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJ1bnRpbWVSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS51cmkuVXJpQ29tcG9uZW50OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnVyaS5VcmlUZW1wbGF0ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS51cmkuaW50ZXJuYWwuSmVyc2V5VXJpQnVpbGRlcjsKKworLyoqCisgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSByb3V0aW5nIGNvbnRleHQgYXMgd2VsbCBhcyBVUkkgaW5mb3JtYXRpb24gcHJvdmlkZXIuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFVyaVJvdXRpbmdDb250ZXh0IGltcGxlbWVudHMgUm91dGluZ0NvbnRleHQgeworCisgICAgcHJpdmF0ZSBmaW5hbCBMaW5rZWRMaXN0PE1hdGNoUmVzdWx0PiBtYXRjaFJlc3VsdHMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBMaW5rZWRMaXN0PE9iamVjdD4gbWF0Y2hlZFJlc291cmNlcyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIExpbmtlZExpc3Q8VXJpVGVtcGxhdGU+IHRlbXBsYXRlcyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKworICAgIHByaXZhdGUgZmluYWwgTXVsdGl2YWx1ZWRIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBlbmNvZGVkVGVtcGxhdGVWYWx1ZXMgPSBuZXcgTXVsdGl2YWx1ZWRIYXNoTWFwPD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIEltbXV0YWJsZU11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBlbmNvZGVkVGVtcGxhdGVWYWx1ZXNWaWV3ID0KKyAgICAgICAgICAgIG5ldyBJbW11dGFibGVNdWx0aXZhbHVlZE1hcDw+KGVuY29kZWRUZW1wbGF0ZVZhbHVlcyk7CisKKyAgICBwcml2YXRlIGZpbmFsIExpbmtlZExpc3Q8U3RyaW5nPiBwYXRocyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIExpbmtlZExpc3Q8UnVudGltZVJlc291cmNlPiBtYXRjaGVkUnVudGltZVJlc291cmNlcyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIExpbmtlZExpc3Q8UmVzb3VyY2VNZXRob2Q+IG1hdGNoZWRMb2NhdG9ycyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIExpbmtlZExpc3Q8UmVzb3VyY2U+IGxvY2F0b3JTdWJSZXNvdXJjZXMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisKKyAgICBwcml2YXRlIGZpbmFsIFRyYWNpbmdMb2dnZXIgdHJhY2luZ0xvZ2dlcjsKKworICAgIHByaXZhdGUgdm9sYXRpbGUgUmVzb3VyY2VNZXRob2QgbWF0Y2hlZFJlc291cmNlTWV0aG9kID0gbnVsbDsKKyAgICBwcml2YXRlIHZvbGF0aWxlIFRocm93YWJsZSBtYXBwZWRUaHJvd2FibGUgPSBudWxsOworCisgICAgcHJpdmF0ZSBFbmRwb2ludCBlbmRwb2ludDsKKworICAgIHByaXZhdGUgTXVsdGl2YWx1ZWRIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBkZWNvZGVkVGVtcGxhdGVWYWx1ZXM7CisgICAgcHJpdmF0ZSBJbW11dGFibGVNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gZGVjb2RlZFRlbXBsYXRlVmFsdWVzVmlldzsKKworICAgIHByaXZhdGUgSW1tdXRhYmxlTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGVuY29kZWRRdWVyeVBhcmFtc1ZpZXc7CisgICAgcHJpdmF0ZSBJbW11dGFibGVNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gZGVjb2RlZFF1ZXJ5UGFyYW1zVmlldzsKKworICAgIC8qKgorICAgICAqIEluamVjdGlvbiBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0Q29udGV4dCByZXF1ZXN0IHJlZmVyZW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVXJpUm91dGluZ0NvbnRleHQoZmluYWwgQ29udGFpbmVyUmVxdWVzdCByZXF1ZXN0Q29udGV4dCkgeworICAgICAgICB0aGlzLnJlcXVlc3RDb250ZXh0ID0gcmVxdWVzdENvbnRleHQ7CisgICAgICAgIHRoaXMudHJhY2luZ0xvZ2dlciA9IFRyYWNpbmdMb2dnZXIuZ2V0SW5zdGFuY2UocmVxdWVzdENvbnRleHQpOworICAgIH0KKworICAgIC8vIFJvdXRpbmdDb250ZXh0CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcHVzaE1hdGNoUmVzdWx0KGZpbmFsIE1hdGNoUmVzdWx0IG1hdGNoUmVzdWx0KSB7CisgICAgICAgIG1hdGNoUmVzdWx0cy5wdXNoKG1hdGNoUmVzdWx0KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwdXNoTWF0Y2hlZFJlc291cmNlKGZpbmFsIE9iamVjdCByZXNvdXJjZSkgeworICAgICAgICB0cmFjaW5nTG9nZ2VyLmxvZyhTZXJ2ZXJUcmFjZUV2ZW50Lk1BVENIX1JFU09VUkNFLCByZXNvdXJjZSk7CisgICAgICAgIG1hdGNoZWRSZXNvdXJjZXMucHVzaChyZXNvdXJjZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdCBwZWVrTWF0Y2hlZFJlc291cmNlKCkgeworICAgICAgICByZXR1cm4gbWF0Y2hlZFJlc291cmNlcy5wZWVrKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcHVzaE1hdGNoZWRMb2NhdG9yKGZpbmFsIFJlc291cmNlTWV0aG9kIHJlc291cmNlTG9jYXRvcikgeworICAgICAgICB0cmFjaW5nTG9nZ2VyLmxvZyhTZXJ2ZXJUcmFjZUV2ZW50Lk1BVENIX0xPQ0FUT1IsIHJlc291cmNlTG9jYXRvci5nZXRJbnZvY2FibGUoKS5nZXRIYW5kbGluZ01ldGhvZCgpKTsKKyAgICAgICAgbWF0Y2hlZExvY2F0b3JzLnB1c2gocmVzb3VyY2VMb2NhdG9yKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwdXNoTGVmdEhhbmRQYXRoKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgcmlnaHRIYW5kUGF0aCA9IGdldEZpbmFsTWF0Y2hpbmdHcm91cCgpOworICAgICAgICBmaW5hbCBpbnQgcmhwTGVuZ3RoID0gKHJpZ2h0SGFuZFBhdGggIT0gbnVsbCkgPyByaWdodEhhbmRQYXRoLmxlbmd0aCgpIDogMDsKKworICAgICAgICBmaW5hbCBTdHJpbmcgZW5jb2RlZFJlcXVlc3RQYXRoID0gZ2V0UGF0aChmYWxzZSk7CisKKyAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IGVuY29kZWRSZXF1ZXN0UGF0aC5sZW5ndGgoKSAtIHJocExlbmd0aDsKKyAgICAgICAgaWYgKGxlbmd0aCA8PSAwKSB7CisgICAgICAgICAgICBwYXRocy5hZGRGaXJzdCgiIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwYXRocy5hZGRGaXJzdChlbmNvZGVkUmVxdWVzdFBhdGguc3Vic3RyaW5nKDAsIGxlbmd0aCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcHVzaFRlbXBsYXRlcyhmaW5hbCBVcmlUZW1wbGF0ZSByZXNvdXJjZVRlbXBsYXRlLCBmaW5hbCBVcmlUZW1wbGF0ZSBtZXRob2RUZW1wbGF0ZSkgeworICAgICAgICBmaW5hbCBJdGVyYXRvcjxNYXRjaFJlc3VsdD4gbWF0Y2hSZXN1bHRJdGVyYXRvciA9IG1hdGNoUmVzdWx0cy5pdGVyYXRvcigpOworICAgICAgICB0ZW1wbGF0ZXMucHVzaChyZXNvdXJjZVRlbXBsYXRlKTsKKyAgICAgICAgaWYgKG1ldGhvZFRlbXBsYXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRlbXBsYXRlcy5wdXNoKG1ldGhvZFRlbXBsYXRlKTsKKyAgICAgICAgICAgIC8vIGZhc3QtZm9yd2FyZCB0aGUgbWF0Y2ggcmVzdWx0IGl0ZXJhdG9yIHRvIHNlY29uZCBlbGVtZW50IGluIHRoZSBzdGFjaworICAgICAgICAgICAgbWF0Y2hSZXN1bHRJdGVyYXRvci5uZXh0KCk7CisgICAgICAgIH0KKworICAgICAgICBwdXNoTWF0Y2hlZFRlbXBsYXRlVmFsdWVzKHJlc291cmNlVGVtcGxhdGUsIG1hdGNoUmVzdWx0SXRlcmF0b3IubmV4dCgpKTsKKyAgICAgICAgaWYgKG1ldGhvZFRlbXBsYXRlICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIHVzZSB0aGUgbWF0Y2ggcmVzdWx0IGZyb20gdGhlIHRvcCBvZiB0aGUgc3RhY2sKKyAgICAgICAgICAgIHB1c2hNYXRjaGVkVGVtcGxhdGVWYWx1ZXMobWV0aG9kVGVtcGxhdGUsIG1hdGNoUmVzdWx0cy5wZWVrKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHB1c2hNYXRjaGVkVGVtcGxhdGVWYWx1ZXMoZmluYWwgVXJpVGVtcGxhdGUgdGVtcGxhdGUsIGZpbmFsIE1hdGNoUmVzdWx0IG1hdGNoUmVzdWx0KSB7CisgICAgICAgIGludCBpID0gMTsKKyAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgdGVtcGxhdGVWYXJpYWJsZSA6IHRlbXBsYXRlLmdldFRlbXBsYXRlVmFyaWFibGVzKCkpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSA9IG1hdGNoUmVzdWx0Lmdyb3VwKGkrKyk7CisgICAgICAgICAgICBlbmNvZGVkVGVtcGxhdGVWYWx1ZXMuYWRkRmlyc3QodGVtcGxhdGVWYXJpYWJsZSwgdmFsdWUpOworICAgICAgICAgICAgaWYgKGRlY29kZWRUZW1wbGF0ZVZhbHVlcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZGVjb2RlZFRlbXBsYXRlVmFsdWVzLmFkZEZpcnN0KAorICAgICAgICAgICAgICAgICAgICAgICAgVXJpQ29tcG9uZW50LmRlY29kZSh0ZW1wbGF0ZVZhcmlhYmxlLCBVcmlDb21wb25lbnQuVHlwZS5QQVRIX1NFR01FTlQpLAorICAgICAgICAgICAgICAgICAgICAgICAgVXJpQ29tcG9uZW50LmRlY29kZSh2YWx1ZSwgVXJpQ29tcG9uZW50LlR5cGUuUEFUSCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRGaW5hbE1hdGNoaW5nR3JvdXAoKSB7CisgICAgICAgIGZpbmFsIE1hdGNoUmVzdWx0IG1yID0gbWF0Y2hSZXN1bHRzLnBlZWsoKTsKKyAgICAgICAgaWYgKG1yID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGZpbmFsR3JvdXAgPSBtci5ncm91cChtci5ncm91cENvdW50KCkpOworICAgICAgICAvLyBXZSBoYXZlIGZvdW5kIGEgbWF0Y2ggYnV0IHRoZSByaWdodCBoYW5kIHBhdGggcGF0dGVybiBkaWQgbm90IG1hdGNoIGFueXRoaW5nCisgICAgICAgIC8vIHNvIGp1c3QgcmV0dXJuaW5nIGFuIGVtcHR5IHN0cmluZyBhcyBhIGZpbmFsIG1hdGNoaW5nIGdyb3VwIHJlc3VsdC4KKyAgICAgICAgLy8gT3RoZXJ3aXNlIGEgbm9uLWVtcHR5IHBhdHRlcm5zIHdvdWxkIGZhaWwgdG8gbWF0Y2ggdGhlIHJpZ2h0LWhhbmQtcGF0aCBwcm9wZXJseS4KKyAgICAgICAgLy8gU2VlIGFsc28gUGF0dGVybldpdGhHcm91cHMubWF0Y2goQ2hhclNlcXVlbmNlKSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgcmV0dXJuIGZpbmFsR3JvdXAgPT0gbnVsbCA/ICIiIDogZmluYWxHcm91cDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlua2VkTGlzdDxNYXRjaFJlc3VsdD4gZ2V0TWF0Y2hlZFJlc3VsdHMoKSB7CisgICAgICAgIHJldHVybiBtYXRjaFJlc3VsdHM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0RW5kcG9pbnQoZmluYWwgRW5kcG9pbnQgZW5kcG9pbnQpIHsKKyAgICAgICAgdGhpcy5lbmRwb2ludCA9IGVuZHBvaW50OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBFbmRwb2ludCBnZXRFbmRwb2ludCgpIHsKKyAgICAgICAgcmV0dXJuIGVuZHBvaW50OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldE1hdGNoZWRSZXNvdXJjZU1ldGhvZChmaW5hbCBSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCkgeworICAgICAgICB0cmFjaW5nTG9nZ2VyLmxvZyhTZXJ2ZXJUcmFjZUV2ZW50Lk1BVENIX1JFU09VUkNFX01FVEhPRCwgcmVzb3VyY2VNZXRob2QuZ2V0SW52b2NhYmxlKCkuZ2V0SGFuZGxpbmdNZXRob2QoKSk7CisgICAgICAgIHRoaXMubWF0Y2hlZFJlc291cmNlTWV0aG9kID0gcmVzb3VyY2VNZXRob2Q7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcHVzaE1hdGNoZWRSdW50aW1lUmVzb3VyY2UoZmluYWwgUnVudGltZVJlc291cmNlIHJ1bnRpbWVSZXNvdXJjZSkgeworICAgICAgICBpZiAodHJhY2luZ0xvZ2dlci5pc0xvZ0VuYWJsZWQoU2VydmVyVHJhY2VFdmVudC5NQVRDSF9SVU5USU1FX1JFU09VUkNFKSkgeworICAgICAgICAgICAgdHJhY2luZ0xvZ2dlci5sb2coU2VydmVyVHJhY2VFdmVudC5NQVRDSF9SVU5USU1FX1JFU09VUkNFLAorICAgICAgICAgICAgICAgICAgICBydW50aW1lUmVzb3VyY2UuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApLmdldFBhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgcnVudGltZVJlc291cmNlLmdldFJlc291cmNlcygpLmdldCgwKS5nZXRQYXRoUGF0dGVybigpLmdldFJlZ2V4KCksCisgICAgICAgICAgICAgICAgICAgIG1hdGNoUmVzdWx0cy5wZWVrKCkuZ3JvdXAoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdWJzdHJpbmcoMCwgbWF0Y2hSZXN1bHRzLnBlZWsoKS5ncm91cCgpLmxlbmd0aCgpIC0gZ2V0RmluYWxNYXRjaGluZ0dyb3VwKCkubGVuZ3RoKCkpLAorICAgICAgICAgICAgICAgICAgICBtYXRjaFJlc3VsdHMucGVlaygpLmdyb3VwKCkpOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5tYXRjaGVkUnVudGltZVJlc291cmNlcy5wdXNoKHJ1bnRpbWVSZXNvdXJjZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcHVzaExvY2F0b3JTdWJSZXNvdXJjZShmaW5hbCBSZXNvdXJjZSBzdWJSZXNvdXJjZUZyb21Mb2NhdG9yKSB7CisgICAgICAgIHRoaXMubG9jYXRvclN1YlJlc291cmNlcy5wdXNoKHN1YlJlc291cmNlRnJvbUxvY2F0b3IpOworICAgIH0KKworICAgIC8vIFVyaUluZm8KKyAgICBwcml2YXRlIGZpbmFsIENvbnRhaW5lclJlcXVlc3QgcmVxdWVzdENvbnRleHQ7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVVJJIGdldEFic29sdXRlUGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIHJlcXVlc3RDb250ZXh0LmdldEFic29sdXRlUGF0aCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBVcmlCdWlsZGVyIGdldEFic29sdXRlUGF0aEJ1aWxkZXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgSmVyc2V5VXJpQnVpbGRlcigpLnVyaShnZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFVSSSBnZXRCYXNlVXJpKCkgeworICAgICAgICByZXR1cm4gcmVxdWVzdENvbnRleHQuZ2V0QmFzZVVyaSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBVcmlCdWlsZGVyIGdldEJhc2VVcmlCdWlsZGVyKCkgeworICAgICAgICByZXR1cm4gbmV3IEplcnNleVVyaUJ1aWxkZXIoKS51cmkoZ2V0QmFzZVVyaSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxPYmplY3Q+IGdldE1hdGNoZWRSZXNvdXJjZXMoKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KG1hdGNoZWRSZXNvdXJjZXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0TWF0Y2hlZFVSSXMoKSB7CisgICAgICAgIHJldHVybiBnZXRNYXRjaGVkVVJJcyh0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGdW5jdGlvbjxTdHJpbmcsIFN0cmluZz4gUEFUSF9ERUNPREVSID0gaW5wdXQgLT4gVXJpQ29tcG9uZW50LmRlY29kZShpbnB1dCwgVXJpQ29tcG9uZW50LlR5cGUuUEFUSCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldE1hdGNoZWRVUklzKGZpbmFsIGJvb2xlYW4gZGVjb2RlKSB7CisgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiByZXN1bHQ7CisgICAgICAgIGlmIChkZWNvZGUpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IHBhdGhzLnN0cmVhbSgpLm1hcChQQVRIX0RFQ09ERVIpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXN1bHQgPSBwYXRoczsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChyZXN1bHQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIHJlcXVlc3RDb250ZXh0LmdldFBhdGgodHJ1ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRoKGZpbmFsIGJvb2xlYW4gZGVjb2RlKSB7CisgICAgICAgIHJldHVybiByZXF1ZXN0Q29udGV4dC5nZXRQYXRoKGRlY29kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBnZXRQYXRoUGFyYW1ldGVycygpIHsKKyAgICAgICAgcmV0dXJuIGdldFBhdGhQYXJhbWV0ZXJzKHRydWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0UGF0aFBhcmFtZXRlcnMoZmluYWwgYm9vbGVhbiBkZWNvZGUpIHsKKyAgICAgICAgaWYgKGRlY29kZSkgeworICAgICAgICAgICAgaWYgKGRlY29kZWRUZW1wbGF0ZVZhbHVlc1ZpZXcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBkZWNvZGVkVGVtcGxhdGVWYWx1ZXNWaWV3OworICAgICAgICAgICAgfSBlbHNlIGlmIChkZWNvZGVkVGVtcGxhdGVWYWx1ZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGRlY29kZWRUZW1wbGF0ZVZhbHVlcyA9IG5ldyBNdWx0aXZhbHVlZEhhc2hNYXA8PigpOworICAgICAgICAgICAgICAgIGZvciAoZmluYWwgTWFwLkVudHJ5PFN0cmluZywgTGlzdDxTdHJpbmc+PiBlIDogZW5jb2RlZFRlbXBsYXRlVmFsdWVzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVjb2RlZFRlbXBsYXRlVmFsdWVzLnB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcmlDb21wb25lbnQuZGVjb2RlKGUuZ2V0S2V5KCksIFVyaUNvbXBvbmVudC5UeXBlLlBBVEhfU0VHTUVOVCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBrZWVwIHRoZSBhYmlsaXR5IHRvIGFkZCBuZXcgZW50cmllcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuZ2V0VmFsdWUoKS5zdHJlYW0oKS5tYXAocyAtPiBVcmlDb21wb25lbnQuZGVjb2RlKHMsIFVyaUNvbXBvbmVudC5UeXBlLlBBVEgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvQ29sbGVjdGlvbihBcnJheUxpc3Q6Om5ldykpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWNvZGVkVGVtcGxhdGVWYWx1ZXNWaWV3ID0gbmV3IEltbXV0YWJsZU11bHRpdmFsdWVkTWFwPD4oZGVjb2RlZFRlbXBsYXRlVmFsdWVzKTsKKworICAgICAgICAgICAgcmV0dXJuIGRlY29kZWRUZW1wbGF0ZVZhbHVlc1ZpZXc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZW5jb2RlZFRlbXBsYXRlVmFsdWVzVmlldzsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFBhdGhTZWdtZW50PiBnZXRQYXRoU2VnbWVudHMoKSB7CisgICAgICAgIHJldHVybiBnZXRQYXRoU2VnbWVudHModHJ1ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8UGF0aFNlZ21lbnQ+IGdldFBhdGhTZWdtZW50cyhmaW5hbCBib29sZWFuIGRlY29kZSkgeworICAgICAgICBmaW5hbCBTdHJpbmcgcmVxdWVzdFBhdGggPSByZXF1ZXN0Q29udGV4dC5nZXRQYXRoKGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoVXJpQ29tcG9uZW50LmRlY29kZVBhdGgocmVxdWVzdFBhdGgsIGRlY29kZSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0UXVlcnlQYXJhbWV0ZXJzKCkgeworICAgICAgICByZXR1cm4gZ2V0UXVlcnlQYXJhbWV0ZXJzKHRydWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0UXVlcnlQYXJhbWV0ZXJzKGZpbmFsIGJvb2xlYW4gZGVjb2RlKSB7CisgICAgICAgIGlmIChkZWNvZGUpIHsKKyAgICAgICAgICAgIGlmIChkZWNvZGVkUXVlcnlQYXJhbXNWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVjb2RlZFF1ZXJ5UGFyYW1zVmlldzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVjb2RlZFF1ZXJ5UGFyYW1zVmlldyA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBJbW11dGFibGVNdWx0aXZhbHVlZE1hcDw+KFVyaUNvbXBvbmVudC5kZWNvZGVRdWVyeShnZXRSZXF1ZXN0VXJpKCksIHRydWUpKTsKKworICAgICAgICAgICAgcmV0dXJuIGRlY29kZWRRdWVyeVBhcmFtc1ZpZXc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoZW5jb2RlZFF1ZXJ5UGFyYW1zVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVuY29kZWRRdWVyeVBhcmFtc1ZpZXc7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVuY29kZWRRdWVyeVBhcmFtc1ZpZXcgPQorICAgICAgICAgICAgICAgICAgICBuZXcgSW1tdXRhYmxlTXVsdGl2YWx1ZWRNYXA8PihVcmlDb21wb25lbnQuZGVjb2RlUXVlcnkoZ2V0UmVxdWVzdFVyaSgpLCBmYWxzZSkpOworCisgICAgICAgICAgICByZXR1cm4gZW5jb2RlZFF1ZXJ5UGFyYW1zVmlldzsKKworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW52YWxpZGF0ZSBpbnRlcm5hbCBVUkkgY29tcG9uZW50IGNhY2hlIHZpZXdzLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIG5lZWRzIHRvIGJlIGNhbGxlZCBpZiByZXF1ZXN0IFVSSSBpbmZvcm1hdGlvbiBjaGFuZ2VzLgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbnZhbGlkYXRlVXJpQ29tcG9uZW50Vmlld3MoKSB7CisgICAgICAgIHRoaXMuZGVjb2RlZFF1ZXJ5UGFyYW1zVmlldyA9IG51bGw7CisgICAgICAgIHRoaXMuZW5jb2RlZFF1ZXJ5UGFyYW1zVmlldyA9IG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFVSSSBnZXRSZXF1ZXN0VXJpKCkgeworICAgICAgICByZXR1cm4gcmVxdWVzdENvbnRleHQuZ2V0UmVxdWVzdFVyaSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBVcmlCdWlsZGVyIGdldFJlcXVlc3RVcmlCdWlsZGVyKCkgeworICAgICAgICByZXR1cm4gVXJpQnVpbGRlci5mcm9tVXJpKGdldFJlcXVlc3RVcmkoKSk7CisgICAgfQorCisgICAgLy8gRXh0ZW5kZWRVcmlJbmZvCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRocm93YWJsZSBnZXRNYXBwZWRUaHJvd2FibGUoKSB7CisgICAgICAgIHJldHVybiBtYXBwZWRUaHJvd2FibGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0TWFwcGVkVGhyb3dhYmxlKGZpbmFsIFRocm93YWJsZSBtYXBwZWRUaHJvd2FibGUpIHsKKyAgICAgICAgdGhpcy5tYXBwZWRUaHJvd2FibGUgPSBtYXBwZWRUaHJvd2FibGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8VXJpVGVtcGxhdGU+IGdldE1hdGNoZWRUZW1wbGF0ZXMoKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHRlbXBsYXRlcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8UGF0aFNlZ21lbnQ+IGdldFBhdGhTZWdtZW50cyhmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gZ2V0UGF0aFNlZ21lbnRzKG5hbWUsIHRydWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFBhdGhTZWdtZW50PiBnZXRQYXRoU2VnbWVudHMoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIGJvb2xlYW4gZGVjb2RlKSB7CisgICAgICAgIGZpbmFsIGludFtdIGJvdW5kcyA9IGdldFBhdGhQYXJhbWV0ZXJCb3VuZHMobmFtZSk7CisgICAgICAgIGlmIChib3VuZHMgIT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBhdGggPSBtYXRjaFJlc3VsdHMuZ2V0TGFzdCgpLmdyb3VwKCk7CisgICAgICAgICAgICAvLyBXb3JrIG91dCBob3cgbWFueSBwYXRoIHNlZ21lbnRzIGFyZSB1cCB0byB0aGUgc3RhcnQKKyAgICAgICAgICAgIC8vIGFuZCBlbmQgcG9zaXRpb24gb2YgdGhlIG1hdGNoaW5nIHBhdGggcGFyYW1ldGVyIHZhbHVlCisgICAgICAgICAgICAvLyBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgcGF0aCBhbHdheXMgc3RhcnRzIHdpdGggYSAnLycKKyAgICAgICAgICAgIGludCBzZWdtZW50c1N0YXJ0ID0gMDsKKyAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgYm91bmRzWzBdOyB4KyspIHsKKyAgICAgICAgICAgICAgICBpZiAocGF0aC5jaGFyQXQoeCkgPT0gJy8nKSB7CisgICAgICAgICAgICAgICAgICAgIHNlZ21lbnRzU3RhcnQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgc2VnbWVudHNFbmQgPSBzZWdtZW50c1N0YXJ0OworICAgICAgICAgICAgZm9yIChpbnQgeCA9IGJvdW5kc1swXTsgeCA8IGJvdW5kc1sxXTsgeCsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHBhdGguY2hhckF0KHgpID09ICcvJykgeworICAgICAgICAgICAgICAgICAgICBzZWdtZW50c0VuZCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGdldFBhdGhTZWdtZW50cyhkZWNvZGUpLnN1Ykxpc3Qoc2VnbWVudHNTdGFydCAtIDEsIHNlZ21lbnRzRW5kKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgaW50W10gZ2V0UGF0aFBhcmFtZXRlckJvdW5kcyhmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICBmaW5hbCBJdGVyYXRvcjxVcmlUZW1wbGF0ZT4gdGVtcGxhdGVzSXRlcmF0b3IgPSB0ZW1wbGF0ZXMuaXRlcmF0b3IoKTsKKyAgICAgICAgZmluYWwgSXRlcmF0b3I8TWF0Y2hSZXN1bHQ+IG1hdGNoUmVzdWx0c0l0ZXJhdG9yID0gbWF0Y2hSZXN1bHRzLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlICh0ZW1wbGF0ZXNJdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIE1hdGNoUmVzdWx0IG1yID0gbWF0Y2hSZXN1bHRzSXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgLy8gRmluZCB0aGUgaW5kZXggb2YgcGF0aCBwYXJhbWV0ZXIKKyAgICAgICAgICAgIGZpbmFsIGludCBwSW5kZXggPSBnZXRMYXN0UGF0aFBhcmFtZXRlckluZGV4KG5hbWUsIHRlbXBsYXRlc0l0ZXJhdG9yLm5leHQoKSk7CisgICAgICAgICAgICBpZiAocEluZGV4ICE9IC0xKSB7CisgICAgICAgICAgICAgICAgaW50IHBhdGhMZW5ndGggPSBtci5ncm91cCgpLmxlbmd0aCgpOworICAgICAgICAgICAgICAgIGludCBzZWdtZW50SW5kZXggPSBtci5lbmQocEluZGV4ICsgMSk7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGdyb3VwTGVuZ3RoID0gc2VnbWVudEluZGV4IC0gbXIuc3RhcnQocEluZGV4ICsgMSk7CisKKyAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSBhYnNvbHV0ZSBwb3NpdGlvbiBvZiB0aGUgZW5kIG9mIHRoZQorICAgICAgICAgICAgICAgIC8vIGNhcHR1cmluZyBncm91cCBpbiB0aGUgcmVxdWVzdCBwYXRoCisgICAgICAgICAgICAgICAgd2hpbGUgKG1hdGNoUmVzdWx0c0l0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICBtciA9IG1hdGNoUmVzdWx0c0l0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgc2VnbWVudEluZGV4ICs9IG1yLmdyb3VwKCkubGVuZ3RoKCkgLSBwYXRoTGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBwYXRoTGVuZ3RoID0gbXIuZ3JvdXAoKS5sZW5ndGgoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBpbnRbXSB7c2VnbWVudEluZGV4IC0gZ3JvdXBMZW5ndGgsIHNlZ21lbnRJbmRleH07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZ2V0TGFzdFBhdGhQYXJhbWV0ZXJJbmRleChmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgVXJpVGVtcGxhdGUgdCkgeworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIGludCBwSW5kZXggPSAtMTsKKyAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgcGFyYW1ldGVyTmFtZSA6IHQuZ2V0VGVtcGxhdGVWYXJpYWJsZXMoKSkgeworICAgICAgICAgICAgaWYgKHBhcmFtZXRlck5hbWUuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgcEluZGV4ID0gaTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcEluZGV4OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNZXRob2QgZ2V0UmVzb3VyY2VNZXRob2QoKSB7CisgICAgICAgIHJldHVybiBlbmRwb2ludCBpbnN0YW5jZW9mIFJlc291cmNlTWV0aG9kSW52b2tlcgorICAgICAgICAgICAgICAgID8gKChSZXNvdXJjZU1ldGhvZEludm9rZXIpIGVuZHBvaW50KS5nZXRSZXNvdXJjZU1ldGhvZCgpIDogbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0UmVzb3VyY2VDbGFzcygpIHsKKyAgICAgICAgcmV0dXJuIGVuZHBvaW50IGluc3RhbmNlb2YgUmVzb3VyY2VNZXRob2RJbnZva2VyCisgICAgICAgICAgICAgICAgPyAoKFJlc291cmNlTWV0aG9kSW52b2tlcikgZW5kcG9pbnQpLmdldFJlc291cmNlQ2xhc3MoKSA6IG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8UnVudGltZVJlc291cmNlPiBnZXRNYXRjaGVkUnVudGltZVJlc291cmNlcygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2hlZFJ1bnRpbWVSZXNvdXJjZXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc291cmNlTWV0aG9kIGdldE1hdGNoZWRSZXNvdXJjZU1ldGhvZCgpIHsKKyAgICAgICAgcmV0dXJuIG1hdGNoZWRSZXNvdXJjZU1ldGhvZDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxSZXNvdXJjZU1ldGhvZD4gZ2V0TWF0Y2hlZFJlc291cmNlTG9jYXRvcnMoKSB7CisgICAgICAgIHJldHVybiBtYXRjaGVkTG9jYXRvcnM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8UmVzb3VyY2U+IGdldExvY2F0b3JTdWJSZXNvdXJjZXMoKSB7CisgICAgICAgIHJldHVybiBsb2NhdG9yU3ViUmVzb3VyY2VzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvdXJjZSBnZXRNYXRjaGVkTW9kZWxSZXNvdXJjZSgpIHsKKyAgICAgICAgcmV0dXJuIG1hdGNoZWRSZXNvdXJjZU1ldGhvZCA9PSBudWxsID8gbnVsbCA6IG1hdGNoZWRSZXNvdXJjZU1ldGhvZC5nZXRQYXJlbnQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVVJJIHJlc29sdmUoZmluYWwgVVJJIHVyaSkgeworICAgICAgICByZXR1cm4gVXJpVGVtcGxhdGUucmVzb2x2ZShnZXRCYXNlVXJpKCksIHVyaSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFVSSSByZWxhdGl2aXplKFVSSSB1cmkpIHsKKyAgICAgICAgaWYgKCF1cmkuaXNBYnNvbHV0ZSgpKSB7CisgICAgICAgICAgICB1cmkgPSByZXNvbHZlKHVyaSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gVXJpVGVtcGxhdGUucmVsYXRpdml6ZShnZXRSZXF1ZXN0VXJpKCksIHVyaSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvcm91dGluZy9wYWNrYWdlLWluZm8uamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3JvdXRpbmcvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjljZmY1MwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3JvdXRpbmcvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoqCisgKiBKZXJzZXkgc2VydmVyLXNpZGUgaW50ZXJuYWwgcmVzb3VyY2Ugcm91dGluZyBjbGFzc2VzLgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5yb3V0aW5nOwpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvc2Nhbm5pbmcvQW5ub3RhdGlvbkFjY2VwdGluZ0xpc3RlbmVyLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9zY2FubmluZy9Bbm5vdGF0aW9uQWNjZXB0aW5nTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjY4NmI1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvc2Nhbm5pbmcvQW5ub3RhdGlvbkFjY2VwdGluZ0xpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwyNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLnNjYW5uaW5nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Pc2dpUmVnaXN0cnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5SZWZsZWN0aW9uSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKKworaW1wb3J0IGplcnNleS5yZXBhY2thZ2VkLm9yZy5vYmplY3R3ZWIuYXNtLkFubm90YXRpb25WaXNpdG9yOworaW1wb3J0IGplcnNleS5yZXBhY2thZ2VkLm9yZy5vYmplY3R3ZWIuYXNtLkF0dHJpYnV0ZTsKK2ltcG9ydCBqZXJzZXkucmVwYWNrYWdlZC5vcmcub2JqZWN0d2ViLmFzbS5DbGFzc1JlYWRlcjsKK2ltcG9ydCBqZXJzZXkucmVwYWNrYWdlZC5vcmcub2JqZWN0d2ViLmFzbS5DbGFzc1Zpc2l0b3I7CitpbXBvcnQgamVyc2V5LnJlcGFja2FnZWQub3JnLm9iamVjdHdlYi5hc20uRmllbGRWaXNpdG9yOworaW1wb3J0IGplcnNleS5yZXBhY2thZ2VkLm9yZy5vYmplY3R3ZWIuYXNtLk1ldGhvZFZpc2l0b3I7CitpbXBvcnQgamVyc2V5LnJlcGFja2FnZWQub3JnLm9iamVjdHdlYi5hc20uT3Bjb2RlczsKKworLyoqCisgKiBBIHNjYW5uZXIgbGlzdGVuZXIgdGhhdCBwcm9jZXNzZXMgSmF2YSBjbGFzcyBmaWxlcyAocmVzb3VyY2UgbmFtZXMKKyAqIGVuZGluZyBpbiAiLmNsYXNzIikgYW5ub3RhdGVkIHdpdGggb25lIG9yIG1vcmUgb2YgYSBzZXQgb2YgZGVjbGFyZWQKKyAqIGFubm90YXRpb25zLgorICogPHA+CisgKiBKYXZhIGNsYXNzZXMgb2YgYSBKYXZhIGNsYXNzIGZpbGUgYXJlIHByb2Nlc3NlZCwgdXNpbmcgQVNNLCB0byBhc2NlcnRhaW4KKyAqIGlmIHRob3NlIGNsYXNzZXMgYXJlIGFubm90YXRlZCB3aXRoIG9uZSBvciBtb3JlIG9mIHRoZSBzZXQgb2YgZGVjbGFyZWQKKyAqIGFubm90YXRpb25zLgorICogPHA+CisgKiBTdWNoIGFuIGFubm90YXRlZCBKYXZhIGNsYXNzIG9mIGEgSmF2YSBjbGFzcyBmaWxlIGlzIGxvYWRlZCBpZiB0aGUgY2xhc3MKKyAqIGlzIHB1YmxpYyBvciBpcyBhbiBpbm5lciBjbGFzcyB0aGF0IGlzIHN0YXRpYyBhbmQgcHVibGljLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEFubm90YXRpb25BY2NlcHRpbmdMaXN0ZW5lciBpbXBsZW1lbnRzIFJlc291cmNlUHJvY2Vzc29yIHsKKworICAgIHByaXZhdGUgZmluYWwgQ2xhc3NMb2FkZXIgY2xhc3Nsb2FkZXI7CisKKyAgICBwcml2YXRlIGZpbmFsIFNldDxDbGFzczw/Pj4gY2xhc3NlczsKKworICAgIHByaXZhdGUgZmluYWwgU2V0PFN0cmluZz4gYW5ub3RhdGlvbnM7CisKKyAgICBwcml2YXRlIGZpbmFsIEFubm90YXRlZENsYXNzVmlzaXRvciBjbGFzc1Zpc2l0b3I7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBzY2FubmluZyBsaXN0ZW5lciB0byBjaGVjayBmb3IgSmF2YSBjbGFzc2VzIGluIEphdmEKKyAgICAgKiBjbGFzcyBmaWxlcyBhbm5vdGF0ZWQgd2l0aCB7QGxpbmsgamF2YXgud3MucnMuUGF0aH0gb3Ige0BsaW5rIGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcn0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIG5ldyBpbnN0YW5jZSBvZiB7QGxpbmsgQW5ub3RhdGlvbkFjY2VwdGluZ0xpc3RlbmVyfSB3aGljaCBsb29rcyBmb3IKKyAgICAgKiB7QGxpbmsgamF2YXgud3MucnMuUGF0aH0gb3Ige0BsaW5rIGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcn0gYW5ub3RhdGVkIGNsYXNzZXMuCisgICAgICoKKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCJ9KQorICAgIHB1YmxpYyBzdGF0aWMgQW5ub3RhdGlvbkFjY2VwdGluZ0xpc3RlbmVyIG5ld0pheHJzUmVzb3VyY2VBbmRQcm92aWRlckxpc3RlbmVyKCkgeworICAgICAgICByZXR1cm4gbmV3IEFubm90YXRpb25BY2NlcHRpbmdMaXN0ZW5lcihQYXRoLmNsYXNzLCBQcm92aWRlci5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgc2Nhbm5pbmcgbGlzdGVuZXIgdG8gY2hlY2sgZm9yIEphdmEgY2xhc3NlcyBpbiBKYXZhCisgICAgICogY2xhc3MgZmlsZXMgYW5ub3RhdGVkIHdpdGgge0BsaW5rIFBhdGh9IG9yIHtAbGluayBQcm92aWRlcn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhc3NMb2FkZXIgdGhlIGNsYXNzIGxvYWRlciB0byB1c2UgdG8gbG9hZCBKYXZhIGNsYXNzZXMgdGhhdAorICAgICAqICAgICAgICBhcmUgYW5ub3RhdGVkIHdpdGggYW55IG9uZSBvZiB0aGUgYW5ub3RhdGlvbnMuCisgICAgICogQHJldHVybiBuZXcgaW5zdGFuY2Ugb2Yge0BsaW5rIEFubm90YXRpb25BY2NlcHRpbmdMaXN0ZW5lcn0gd2hpY2ggbG9va3MgZm9yCisgICAgICoge0BsaW5rIGphdmF4LndzLnJzLlBhdGh9IG9yIHtAbGluayBqYXZheC53cy5ycy5leHQuUHJvdmlkZXJ9IGFubm90YXRlZCBjbGFzc2VzLgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pCisgICAgcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uQWNjZXB0aW5nTGlzdGVuZXIgbmV3SmF4cnNSZXNvdXJjZUFuZFByb3ZpZGVyTGlzdGVuZXIoZmluYWwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBbm5vdGF0aW9uQWNjZXB0aW5nTGlzdGVuZXIoY2xhc3NMb2FkZXIsIFBhdGguY2xhc3MsIFByb3ZpZGVyLmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBzY2FubmVyIGxpc3RlbmVyIHRvIGNoZWNrIGZvciBhbm5vdGF0ZWQgSmF2YSBjbGFzc2VzIGluIEphdmEKKyAgICAgKiBjbGFzcyBmaWxlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbm5vdGF0aW9ucyB0aGUgc2V0IG9mIGFubm90YXRpb24gY2xhc3NlcyB0byBjaGVjayBvbiBKYXZhIGNsYXNzCisgICAgICogICAgICAgIGZpbGVzLgorICAgICAqLworICAgIHB1YmxpYyBBbm5vdGF0aW9uQWNjZXB0aW5nTGlzdGVuZXIoZmluYWwgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+Li4uIGFubm90YXRpb25zKSB7CisgICAgICAgIHRoaXMoQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoUmVmbGVjdGlvbkhlbHBlci5nZXRDb250ZXh0Q2xhc3NMb2FkZXJQQSgpKSwgYW5ub3RhdGlvbnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHNjYW5uZXIgbGlzdGVuZXIgdG8gY2hlY2sgZm9yIGFubm90YXRlZCBKYXZhIGNsYXNzZXMgaW4gSmF2YQorICAgICAqIGNsYXNzIGZpbGVzLgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzbG9hZGVyIHRoZSBjbGFzcyBsb2FkZXIgdG8gdXNlIHRvIGxvYWQgSmF2YSBjbGFzc2VzIHRoYXQKKyAgICAgKiAgICAgICAgYXJlIGFubm90YXRlZCB3aXRoIGFueSBvbmUgb2YgdGhlIGFubm90YXRpb25zLgorICAgICAqIEBwYXJhbSBhbm5vdGF0aW9ucyB0aGUgc2V0IG9mIGFubm90YXRpb24gY2xhc3NlcyB0byBjaGVjayBvbiBKYXZhIGNsYXNzCisgICAgICogICAgICAgIGZpbGVzLgorICAgICAqLworICAgIHB1YmxpYyBBbm5vdGF0aW9uQWNjZXB0aW5nTGlzdGVuZXIoZmluYWwgQ2xhc3NMb2FkZXIgY2xhc3Nsb2FkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4uLi4gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgdGhpcy5jbGFzc2xvYWRlciA9IGNsYXNzbG9hZGVyOworICAgICAgICB0aGlzLmNsYXNzZXMgPSBuZXcgTGlua2VkSGFzaFNldDxDbGFzczw/Pj4oKTsKKyAgICAgICAgdGhpcy5hbm5vdGF0aW9ucyA9IGdldEFubm90YXRpb25TZXQoYW5ub3RhdGlvbnMpOworICAgICAgICB0aGlzLmNsYXNzVmlzaXRvciA9IG5ldyBBbm5vdGF0ZWRDbGFzc1Zpc2l0b3IoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHNldCBvZiBhbm5vdGF0ZWQgY2xhc3Nlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHNldCBvZiBhbm5vdGF0ZWQgY2xhc3Nlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRBbm5vdGF0ZWRDbGFzc2VzKCkgeworICAgICAgICByZXR1cm4gY2xhc3NlczsKKyAgICB9CisKKyAgICBwcml2YXRlIFNldDxTdHJpbmc+IGdldEFubm90YXRpb25TZXQoZmluYWwgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+Li4uIGFubm90YXRpb25zKSB7CisgICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IGEgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgICAgIGZvciAoZmluYWwgQ2xhc3MgYyA6IGFubm90YXRpb25zKSB7CisgICAgICAgICAgICBhLmFkZCgiTCIgKyBjLmdldE5hbWUoKS5yZXBsYWNlQWxsKCJcXC4iLCAiLyIpICsgIjsiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYTsKKyAgICB9CisKKyAgICAvLyBTY2FubmVyTGlzdGVuZXIKKyAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuICEobmFtZSA9PSBudWxsIHx8IG5hbWUuaXNFbXB0eSgpKSAmJiBuYW1lLmVuZHNXaXRoKCIuY2xhc3MiKTsKKworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHByb2Nlc3MoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBuZXcgQ2xhc3NSZWFkZXIoaW4pLmFjY2VwdChjbGFzc1Zpc2l0b3IsIDApOworICAgIH0KKworICAgIC8vCisKKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIEFubm90YXRlZENsYXNzVmlzaXRvciBleHRlbmRzIENsYXNzVmlzaXRvciB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSB2aXNpdGVkIGNsYXNzLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NOYW1lOworICAgICAgICAvKioKKyAgICAgICAgICogVHJ1ZSBpZiB0aGUgY2xhc3MgaGFzIHRoZSBjb3JyZWN0IHNjb3BlCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNTY29wZWQ7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUcnVlIGlmIHRoZSBjbGFzcyBoYXMgdGhlIGNvcnJlY3QgZGVjbGFyZWQgYW5ub3RhdGlvbnMKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc0Fubm90YXRlZDsKKworICAgICAgICBwcml2YXRlIEFubm90YXRlZENsYXNzVmlzaXRvcigpIHsKKyAgICAgICAgICAgIHN1cGVyKE9wY29kZXMuQVNNNSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChmaW5hbCBpbnQgdmVyc2lvbiwgZmluYWwgaW50IGFjY2VzcywgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzaWduYXR1cmUsIGZpbmFsIFN0cmluZyBzdXBlck5hbWUsIGZpbmFsIFN0cmluZ1tdIGludGVyZmFjZXMpIHsKKyAgICAgICAgICAgIGNsYXNzTmFtZSA9IG5hbWU7CisgICAgICAgICAgICBpc1Njb3BlZCA9IChhY2Nlc3MgJiBPcGNvZGVzLkFDQ19QVUJMSUMpICE9IDA7CisgICAgICAgICAgICBpc0Fubm90YXRlZCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEFubm90YXRpb25WaXNpdG9yIHZpc2l0QW5ub3RhdGlvbihmaW5hbCBTdHJpbmcgZGVzYywgZmluYWwgYm9vbGVhbiB2aXNpYmxlKSB7CisgICAgICAgICAgICBpc0Fubm90YXRlZCB8PSBhbm5vdGF0aW9ucy5jb250YWlucyhkZXNjKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXRJbm5lckNsYXNzKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgb3V0ZXJOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGlubmVyTmFtZSwgZmluYWwgaW50IGFjY2VzcykgeworICAgICAgICAgICAgLy8gSWYgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIHRoYXQgd2FzIHZpc2l0ZWQgaXMgZXF1YWwKKyAgICAgICAgICAgIC8vIHRvIHRoZSBuYW1lIG9mIHRoaXMgdmlzaXRlZCBpbm5lciBjbGFzcyB0aGVuCisgICAgICAgICAgICAvLyB0aGlzIGFjY2VzcyBmaWVsZCBuZWVkcyB0byBiZSB1c2VkIGZvciBjaGVja2luZyB0aGUgc2NvcGUKKyAgICAgICAgICAgIC8vIG9mIHRoZSBpbm5lciBjbGFzcworICAgICAgICAgICAgaWYgKGNsYXNzTmFtZS5lcXVhbHMobmFtZSkpIHsKKyAgICAgICAgICAgICAgICBpc1Njb3BlZCA9IChhY2Nlc3MgJiBPcGNvZGVzLkFDQ19QVUJMSUMpICE9IDA7CisKKyAgICAgICAgICAgICAgICAvLyBJbm5lciBjbGFzc2VzIG5lZWQgdG8gYmUgc3RhdGljYWxseSBzY29wZWQKKyAgICAgICAgICAgICAgICBpc1Njb3BlZCAmPSAoYWNjZXNzICYgT3Bjb2Rlcy5BQ0NfU1RBVElDKSA9PSBPcGNvZGVzLkFDQ19TVEFUSUM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdEVuZCgpIHsKKyAgICAgICAgICAgIGlmIChpc1Njb3BlZCAmJiBpc0Fubm90YXRlZCkgeworICAgICAgICAgICAgICAgIC8vIENvcnJlY3RseSBzY29wZWQgYW5kIGFubm90YXRlZAorICAgICAgICAgICAgICAgIC8vIGFkZCB0byB0aGUgc2V0IG9mIG1hdGNoaW5nIGNsYXNzZXMuCisgICAgICAgICAgICAgICAgY2xhc3Nlcy5hZGQoZ2V0Q2xhc3NGb3JOYW1lKGNsYXNzTmFtZS5yZXBsYWNlQWxsKCIvIiwgIi4iKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXRPdXRlckNsYXNzKGZpbmFsIFN0cmluZyBzdHJpbmcsIGZpbmFsIFN0cmluZyBzdHJpbmcwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHN0cmluZzEpIHsKKyAgICAgICAgICAgIC8vIERvIG5vdGhpbmcKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBGaWVsZFZpc2l0b3IgdmlzaXRGaWVsZChmaW5hbCBpbnQgaSwgZmluYWwgU3RyaW5nIHN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzdHJpbmcwLCBmaW5hbCBTdHJpbmcgc3RyaW5nMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBvYmplY3QpIHsKKyAgICAgICAgICAgIC8vIERvIG5vdGhpbmcKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgdmlzaXRTb3VyY2UoZmluYWwgU3RyaW5nIHN0cmluZywgZmluYWwgU3RyaW5nIHN0cmluZzApIHsKKyAgICAgICAgICAgIC8vIERvIG5vdGhpbmcKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0QXR0cmlidXRlKGZpbmFsIEF0dHJpYnV0ZSBhdHRyaWJ1dGUpIHsKKyAgICAgICAgICAgIC8vIERvIG5vdGhpbmcKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNZXRob2RWaXNpdG9yIHZpc2l0TWV0aG9kKGZpbmFsIGludCBpLCBmaW5hbCBTdHJpbmcgc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc3RyaW5nMCwgZmluYWwgU3RyaW5nIHN0cmluZzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIHN0cmluZzIpIHsKKyAgICAgICAgICAgIC8vIERvIG5vdGhpbmcKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBDbGFzcyBnZXRDbGFzc0Zvck5hbWUoZmluYWwgU3RyaW5nIGNsYXNzTmFtZSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmaW5hbCBPc2dpUmVnaXN0cnkgb3NnaVJlZ2lzdHJ5ID0gUmVmbGVjdGlvbkhlbHBlci5nZXRPc2dpUmVnaXN0cnlJbnN0YW5jZSgpOworCisgICAgICAgICAgICAgICAgaWYgKG9zZ2lSZWdpc3RyeSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBvc2dpUmVnaXN0cnkuY2xhc3NGb3JOYW1lV2l0aEV4Y2VwdGlvbihjbGFzc05hbWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChSZWZsZWN0aW9uSGVscGVyLmNsYXNzRm9yTmFtZVdpdGhFeGNlcHRpb25QRUEoY2xhc3NOYW1lLCBjbGFzc2xvYWRlcikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9TQ0FOTklOR19DTEFTU19OT1RfRk9VTkQoY2xhc3NOYW1lKSwgZXgpOworICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBwYWUpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBUaHJvd2FibGUgY2F1c2UgPSBwYWUuZ2V0Q2F1c2UoKTsKKyAgICAgICAgICAgICAgICBpZiAoY2F1c2UgaW5zdGFuY2VvZiBDbGFzc05vdEZvdW5kRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX1NDQU5OSU5HX0NMQVNTX05PVF9GT1VORChjbGFzc05hbWUpLCBjYXVzZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjYXVzZSBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pIGNhdXNlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGNhdXNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3NjYW5uaW5nL0J1bmRsZVNjaGVtZVJlc291cmNlRmluZGVyRmFjdG9yeS5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvc2Nhbm5pbmcvQnVuZGxlU2NoZW1lUmVzb3VyY2VGaW5kZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA4N2Y1YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3NjYW5uaW5nL0J1bmRsZVNjaGVtZVJlc291cmNlRmluZGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5zY2FubmluZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuQWJzdHJhY3RSZXNvdXJjZUZpbmRlckFkYXB0ZXI7CisKKy8qKgorICogUHJlcGFyYXRpb25zIGZvciBPU0dpIHN1cHBvcnQuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworZmluYWwgY2xhc3MgQnVuZGxlU2NoZW1lUmVzb3VyY2VGaW5kZXJGYWN0b3J5IGltcGxlbWVudHMgVXJpU2NoZW1lUmVzb3VyY2VGaW5kZXJGYWN0b3J5IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IFNDSEVNRVMgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b24oImJ1bmRsZSIpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxTdHJpbmc+IGdldFNjaGVtZXMoKSB7CisgICAgICAgIHJldHVybiBTQ0hFTUVTOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgYnVuZGxlIHNjaGVtZSByZXNvdXJjZSBmaW5kZXIgZmFjdG9yeS4KKyAgICAgKi8KKyAgICBCdW5kbGVTY2hlbWVSZXNvdXJjZUZpbmRlckZhY3RvcnkoKSB7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJ1bmRsZVNjaGVtZVNjYW5uZXIgY3JlYXRlKGZpbmFsIFVSSSB1cmksIGZpbmFsIGJvb2xlYW4gcmVjdXJzaXZlKSB7CisgICAgICAgIHJldHVybiBuZXcgQnVuZGxlU2NoZW1lU2Nhbm5lcih1cmkpOworICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgQnVuZGxlU2NoZW1lU2Nhbm5lciBleHRlbmRzIEFic3RyYWN0UmVzb3VyY2VGaW5kZXJBZGFwdGVyIHsKKworICAgICAgICBwcml2YXRlIEJ1bmRsZVNjaGVtZVNjYW5uZXIoZmluYWwgVVJJIHVyaSkgeworICAgICAgICAgICAgdGhpcy51cmkgPSB1cmk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGZpbmFsIFVSSSB1cmk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE1hcmtzIHRoaXMgaXRlcmF0b3IgYXMgaXRlcmF0ZWQgYWZ0ZXIgZXhlY3V0aW9uIG9mIHtAbGluayAjb3BlbigpfSBtZXRob2QuCisgICAgICAgICAqIFRvZ2V0aGVyIHdpdGgge0BsaW5rICNpdGVyYXRlZH0sIHRoaXMgZmllbGQgZGV0ZXJtaW5lcyBhIHJldHVybmVkIHZhbHVlIG9mIHtAbGluayAjaGFzTmV4dCgpfS4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBhY2Nlc3NlZCA9IGZhbHNlOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBNYXJrcyB0aGlzIGl0ZXJhdG9yIGFzIGl0ZXJhdGVkIGFmdGVyIGV4ZWN1dGlvbiBvZiB7QGxpbmsgI25leHQoKX0gbWV0aG9kLgorICAgICAgICAgKiBUb2dldGhlciB3aXRoIHtAbGluayAjYWNjZXNzZWR9LCB0aGlzIGZpZWxkIGRldGVybWluZXMgYSByZXR1cm5lZCB2YWx1ZSBvZiB7QGxpbmsgI2hhc05leHQoKX0uCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXRlcmF0ZWQgPSBmYWxzZTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiAhYWNjZXNzZWQgJiYgIWl0ZXJhdGVkOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgbmV4dCgpIHsKKyAgICAgICAgICAgIGlmIChoYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBpdGVyYXRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIHVyaS5nZXRQYXRoKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIElucHV0U3RyZWFtIG9wZW4oKSB7CisgICAgICAgICAgICBpZiAoIWFjY2Vzc2VkKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgYWNjZXNzZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXJpLnRvVVJMKCkub3BlblN0cmVhbSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlc291cmNlRmluZGVyRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvc2Nhbm5pbmcvQ29tcG9zaXRlUmVzb3VyY2VGaW5kZXIuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3NjYW5uaW5nL0NvbXBvc2l0ZVJlc291cmNlRmluZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcwNzM3MAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3NjYW5uaW5nL0NvbXBvc2l0ZVJlc291cmNlRmluZGVyLmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLnNjYW5uaW5nOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuRGVxdWU7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUZpbmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuQWJzdHJhY3RSZXNvdXJjZUZpbmRlckFkYXB0ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworCisvKioKKyAqIHtAbGluayBTdGFja30gb2Yge0BsaW5rIFJlc291cmNlRmluZGVyfSBpbnN0YW5jZXMuCisgKiA8cC8+CisgKiBVc2VkIHRvIGNvbWJpbmUgdmFyaW91cyBmaW5kZXJzIGludG8gb25lIGluc3RhbmNlLgorICoKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBDb21wb3NpdGVSZXNvdXJjZUZpbmRlciBleHRlbmRzIEFic3RyYWN0UmVzb3VyY2VGaW5kZXJBZGFwdGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKENvbXBvc2l0ZVJlc291cmNlRmluZGVyLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBwcml2YXRlIGZpbmFsIERlcXVlPFJlc291cmNlRmluZGVyPiBzdGFjayA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICBwcml2YXRlIFJlc291cmNlRmluZGVyIGN1cnJlbnQgPSBudWxsOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgaWYgKGN1cnJlbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKCFzdGFjay5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50ID0gc3RhY2sucG9wKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChjdXJyZW50Lmhhc05leHQoKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIXN0YWNrLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBzdGFjay5wb3AoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaGFzTmV4dCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIG5leHQoKSB7CisgICAgICAgIGlmIChoYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBjdXJyZW50Lm5leHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIElucHV0U3RyZWFtIG9wZW4oKSB7CisgICAgICAgIHJldHVybiBjdXJyZW50Lm9wZW4oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgaWYgKGN1cnJlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gSW5zZXJ0IHRoZSBjdXJyZW50bHkgcHJvY2Vzc2VkIHJlc291cmNlIGZpbmRlciBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjay4KKyAgICAgICAgICAgIHN0YWNrLmFkZEZpcnN0KGN1cnJlbnQpOworICAgICAgICAgICAgY3VycmVudCA9IG51bGw7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChmaW5hbCBSZXNvdXJjZUZpbmRlciBmaW5kZXIgOiBzdGFjaykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmaW5kZXIuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuQ09ORklHLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9DTE9TSU5HX0ZJTkRFUihmaW5kZXIuZ2V0Q2xhc3MoKSksIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0YWNrLmNsZWFyKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHB1c2goZmluYWwgUmVzb3VyY2VGaW5kZXIgaXRlcmF0b3IpIHsKKyAgICAgICAgc3RhY2sucHVzaChpdGVyYXRvcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvc2Nhbm5pbmcvRmlsZVNjaGVtZVJlc291cmNlRmluZGVyRmFjdG9yeS5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvc2Nhbm5pbmcvRmlsZVNjaGVtZVJlc291cmNlRmluZGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NjdkNWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9zY2FubmluZy9GaWxlU2NoZW1lUmVzb3VyY2VGaW5kZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLnNjYW5uaW5nOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5TdGFjazsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5BYnN0cmFjdFJlc291cmNlRmluZGVyQWRhcHRlcjsKKworLyoqCisgKiBBICJmaWxlIiBzY2hlbWUgVVJJIHNjYW5uZXIgdGhhdCByZWN1cnNpdmVseSBzY2FucyBkaXJlY3Rvcmllcy4KKyAqIEZpbGVzIGFyZSByZXBvcnRlZCB0byBhIHtAbGluayBSZXNvdXJjZVByb2Nlc3Nvcn0uCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitmaW5hbCBjbGFzcyBGaWxlU2NoZW1lUmVzb3VyY2VGaW5kZXJGYWN0b3J5IGltcGxlbWVudHMgVXJpU2NoZW1lUmVzb3VyY2VGaW5kZXJGYWN0b3J5IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IFNDSEVNRVMgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b24oImZpbGUiKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRTY2hlbWVzKCkgeworICAgICAgICByZXR1cm4gU0NIRU1FUzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3ICJmaWxlIiBzY2hlbWUgVVJJIHNjYW5uZXIgZmFjdG9yeS4KKyAgICAgKi8KKyAgICBGaWxlU2NoZW1lUmVzb3VyY2VGaW5kZXJGYWN0b3J5KCkgeworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBGaWxlU2NoZW1lU2Nhbm5lciBjcmVhdGUoZmluYWwgVVJJIHVyaSwgZmluYWwgYm9vbGVhbiByZWN1cnNpdmUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGaWxlU2NoZW1lU2Nhbm5lcih1cmksIHJlY3Vyc2l2ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBGaWxlU2NoZW1lU2Nhbm5lciBleHRlbmRzIEFic3RyYWN0UmVzb3VyY2VGaW5kZXJBZGFwdGVyIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIENvbXBvc2l0ZVJlc291cmNlRmluZGVyIGNvbXBvc2l0ZVJlc291cmNlRmluZGVyOworICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gcmVjdXJzaXZlOworCisgICAgICAgIHByaXZhdGUgRmlsZVNjaGVtZVNjYW5uZXIoZmluYWwgVVJJIHVyaSwgZmluYWwgYm9vbGVhbiByZWN1cnNpdmUpIHsKKyAgICAgICAgICAgIHRoaXMuY29tcG9zaXRlUmVzb3VyY2VGaW5kZXIgPSBuZXcgQ29tcG9zaXRlUmVzb3VyY2VGaW5kZXIoKTsKKyAgICAgICAgICAgIHRoaXMucmVjdXJzaXZlID0gcmVjdXJzaXZlOworCisgICAgICAgICAgICBwcm9jZXNzRmlsZShuZXcgRmlsZSh1cmkuZ2V0UGF0aCgpKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wb3NpdGVSZXNvdXJjZUZpbmRlci5oYXNOZXh0KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBuZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZVJlc291cmNlRmluZGVyLm5leHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSW5wdXRTdHJlYW0gb3BlbigpIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wb3NpdGVSZXNvdXJjZUZpbmRlci5vcGVuKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgICAgICBjb21wb3NpdGVSZXNvdXJjZUZpbmRlci5jbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0ZpbGUoZmluYWwgRmlsZSBmKSB7CisgICAgICAgICAgICBjb21wb3NpdGVSZXNvdXJjZUZpbmRlci5wdXNoKG5ldyBBYnN0cmFjdFJlc291cmNlRmluZGVyQWRhcHRlcigpIHsKKworICAgICAgICAgICAgICAgIFN0YWNrPEZpbGU+IGZpbGVzID0gbmV3IFN0YWNrPEZpbGU+KCkge3sKKyAgICAgICAgICAgICAgICAgICAgaWYgKGYuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsZVtdIHN1YkRpckZpbGVzID0gZi5saXN0RmlsZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJEaXJGaWxlcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChmaW5hbCBGaWxlIGZpbGUgOiBzdWJEaXJGaWxlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoKGZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goZik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9fTsKKworICAgICAgICAgICAgICAgIHByaXZhdGUgRmlsZSBjdXJyZW50OworICAgICAgICAgICAgICAgIHByaXZhdGUgRmlsZSBuZXh0OworCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG5leHQgPT0gbnVsbCAmJiAhZmlsZXMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCA9IGZpbGVzLnBvcCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dC5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlY3Vyc2l2ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRmlsZShuZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV4dCAhPSBudWxsOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgbmV4dCgpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgIT0gbnVsbCB8fCBoYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBuZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudC5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBvcGVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWxlSW5wdXRTdHJlYW0oY3VycmVudCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VGaW5kZXJFeGNlcHRpb24oZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9zY2FubmluZy9GaWxlc1NjYW5uZXIuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3NjYW5uaW5nL0ZpbGVzU2Nhbm5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZDkzMzIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9zY2FubmluZy9GaWxlc1NjYW5uZXIuamF2YQpAQCAtMCwwICsxLDE2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuc2Nhbm5pbmc7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5TdGFjazsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuVG9rZW5pemVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5BYnN0cmFjdFJlc291cmNlRmluZGVyQWRhcHRlcjsKKworLyoqCisgKiBBIHNjYW5uZXIgdGhhdCByZWN1cnNpdmVseSBzY2FucyBkaXJlY3RvcmllcyBhbmQgamFyIGZpbGVzLgorICogRmlsZXMgb3IgamFyIGVudHJpZXMgYXJlIHJlcG9ydGVkIHRvIGEge0BsaW5rIFJlc291cmNlUHJvY2Vzc29yfS4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBGaWxlc1NjYW5uZXIgZXh0ZW5kcyBBYnN0cmFjdFJlc291cmNlRmluZGVyQWRhcHRlciB7CisKKyAgICBwcml2YXRlIGZpbmFsIEZpbGVbXSBmaWxlczsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gcmVjdXJzaXZlOworCisgICAgcHJpdmF0ZSBDb21wb3NpdGVSZXNvdXJjZUZpbmRlciBjb21wb3NpdGVSZXNvdXJjZUZpbmRlcjsKKworICAgIC8qKgorICAgICAqIFNjYW4gZnJvbSBhIHNldCBvZiBwYWNrYWdlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlTmFtZXMgYW4gYXJyYXkgb2YgcGFja2FnZSBuYW1lcy4KKyAgICAgKiBAcGFyYW0gcmVjdXJzaXZlIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHN1Yi1kaXJlY3RvcmllcyBvZiBhbnkgZGlyZWN0b3JpZXMgaW4gdGhlIGxpc3Qgb2YKKyAgICAgKiAgICAgICAgICAgICAgICAgIGZpbGVzIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgc2Nhbm5pbmcgKHtAY29kZSB0cnVlfSkgb3Igbm90ICh7QGNvZGUgZmFsc2V9KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZXNTY2FubmVyKGZpbmFsIFN0cmluZ1tdIGZpbGVOYW1lcywgZmluYWwgYm9vbGVhbiByZWN1cnNpdmUpIHsKKyAgICAgICAgdGhpcy5yZWN1cnNpdmUgPSByZWN1cnNpdmU7CisgICAgICAgIHRoaXMuZmlsZXMgPSBuZXcgRmlsZVtUb2tlbml6ZXIudG9rZW5pemUoZmlsZU5hbWVzLCBUb2tlbml6ZXIuQ09NTU9OX0RFTElNSVRFUlMpLmxlbmd0aF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGZpbGVzW2ldID0gbmV3IEZpbGUoZmlsZU5hbWVzW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIGluaXQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0ZpbGUoZmluYWwgRmlsZSBmKSB7CisgICAgICAgIGlmIChmLmdldE5hbWUoKS5lbmRzV2l0aCgiLmphciIpIHx8IGYuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuemlwIikpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29tcG9zaXRlUmVzb3VyY2VGaW5kZXIucHVzaChuZXcgSmFyRmlsZVNjYW5uZXIobmV3IEZpbGVJbnB1dFN0cmVhbShmKSwgIiIsIHRydWUpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBsb2dnaW5nIG1pZ2h0IGJlIHN1ZmZpY2llbnQgaW4gdGhpcyBjYXNlCisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlc291cmNlRmluZGVyRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb21wb3NpdGVSZXNvdXJjZUZpbmRlci5wdXNoKG5ldyBBYnN0cmFjdFJlc291cmNlRmluZGVyQWRhcHRlcigpIHsKKworICAgICAgICAgICAgICAgIFN0YWNrPEZpbGU+IGZpbGVzID0gbmV3IFN0YWNrPEZpbGU+KCkge3sKKyAgICAgICAgICAgICAgICAgICAgaWYgKGYuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsZVtdIHN1YkRpckZpbGVzID0gZi5saXN0RmlsZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJEaXJGaWxlcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChmaW5hbCBGaWxlIGZpbGUgOiBzdWJEaXJGaWxlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoKGZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goZik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9fTsKKworICAgICAgICAgICAgICAgIHByaXZhdGUgRmlsZSBjdXJyZW50OworICAgICAgICAgICAgICAgIHByaXZhdGUgRmlsZSBuZXh0OworCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG5leHQgPT0gbnVsbCAmJiAhZmlsZXMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCA9IGZpbGVzLnBvcCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dC5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlY3Vyc2l2ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRmlsZShuZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5leHQuZ2V0TmFtZSgpLmVuZHNXaXRoKCIuamFyIikgfHwgbmV4dC5nZXROYW1lKCkuZW5kc1dpdGgoIi56aXAiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NGaWxlKG5leHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5leHQgIT0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIG5leHQoKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ICE9IG51bGwgfHwgaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gbmV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIElucHV0U3RyZWFtIG9wZW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGVJbnB1dFN0cmVhbShjdXJyZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZXNvdXJjZUZpbmRlckV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgIHJldHVybiBjb21wb3NpdGVSZXNvdXJjZUZpbmRlci5oYXNOZXh0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBuZXh0KCkgeworICAgICAgICByZXR1cm4gY29tcG9zaXRlUmVzb3VyY2VGaW5kZXIubmV4dCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBvcGVuKCkgeworICAgICAgICByZXR1cm4gY29tcG9zaXRlUmVzb3VyY2VGaW5kZXIub3BlbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICBjb21wb3NpdGVSZXNvdXJjZUZpbmRlci5jbG9zZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICBjbG9zZSgpOworICAgICAgICBpbml0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXQoKSB7CisgICAgICAgIHRoaXMuY29tcG9zaXRlUmVzb3VyY2VGaW5kZXIgPSBuZXcgQ29tcG9zaXRlUmVzb3VyY2VGaW5kZXIoKTsKKworICAgICAgICBmb3IgKGZpbmFsIEZpbGUgZmlsZSA6IGZpbGVzKSB7CisgICAgICAgICAgICBwcm9jZXNzRmlsZShmaWxlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3NjYW5uaW5nL0phckZpbGVTY2FubmVyLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9zY2FubmluZy9KYXJGaWxlU2Nhbm5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZTg2ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9zY2FubmluZy9KYXJGaWxlU2Nhbm5lci5qYXZhCkBAIC0wLDAgKzEsMTcwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5zY2FubmluZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuamFyLkphckVudHJ5OworaW1wb3J0IGphdmEudXRpbC5qYXIuSmFySW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLkFic3RyYWN0UmVzb3VyY2VGaW5kZXJBZGFwdGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKKworLyoqCisgKiBBIHV0aWxpdHkgY2xhc3MgdGhhdCBzY2FucyBlbnRyaWVzIGluIGphciBmaWxlcy4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBKYXJGaWxlU2Nhbm5lciBleHRlbmRzIEFic3RyYWN0UmVzb3VyY2VGaW5kZXJBZGFwdGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEphckZpbGVTY2FubmVyLmNsYXNzLmdldE5hbWUoKSk7CisgICAgLy8gcGxhdGZvcm0gaW5kZXBlbmRlbnQgZmlsZSBzZXBhcmF0b3Igd2l0aGluIHRoZSBqYXIgZmlsZQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgSkFSX0ZJTEVfU0VQQVJBVE9SID0gJy8nOworCisgICAgcHJpdmF0ZSBmaW5hbCBKYXJJbnB1dFN0cmVhbSBqYXJJbnB1dFN0cmVhbTsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBwYXJlbnQ7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHJlY3Vyc2l2ZTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgSkFSIGZpbGUgc2Nhbm5lci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnB1dFN0cmVhbSBKQVIgZmlsZSBpbnB1dCBzdHJlYW0KKyAgICAgKiBAcGFyYW0gcGFyZW50ICAgICAgSkFSIGZpbGUgZW50cnkgcHJlZml4LgorICAgICAqIEBwYXJhbSByZWN1cnNpdmUgICBpZiAoe0Bjb2RlIHRydWV9IHRoZSBwYWNrYWdlcyB3aWxsIGJlIHNjYW5uZWQgcmVjdXJzaXZlbHkgdG9nZXRoZXIgd2l0aCBhbnkgbmVzdGVkIHBhY2thZ2VzLCBpZgorICAgICAqICAgICAgICAgICAgICAgICAgICB7QGNvZGUgZmFsc2V9IG9ubHkgdGhlIGV4cGxpY2l0bHkgbGlzdGVkIHBhY2thZ2VzIHdpbGwgYmUgc2Nhbm5lZC4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIHdyYXBwaW5nIGdpdmVuIGlucHV0IHN0cmVhbSBpbnRvIHtAbGluayBKYXJJbnB1dFN0cmVhbX0gZmFpbGVkLgorICAgICAqLworICAgIHB1YmxpYyBKYXJGaWxlU2Nhbm5lcihmaW5hbCBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgZmluYWwgU3RyaW5nIHBhcmVudCwgZmluYWwgYm9vbGVhbiByZWN1cnNpdmUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMuamFySW5wdXRTdHJlYW0gPSBuZXcgSmFySW5wdXRTdHJlYW0oaW5wdXRTdHJlYW0pOworICAgICAgICB0aGlzLnBhcmVudCA9IChwYXJlbnQuaXNFbXB0eSgpIHx8IHBhcmVudC5lbmRzV2l0aChTdHJpbmcudmFsdWVPZihKQVJfRklMRV9TRVBBUkFUT1IpKSkKKyAgICAgICAgICAgICAgICA/IHBhcmVudCA6IHBhcmVudCArIEpBUl9GSUxFX1NFUEFSQVRPUjsKKyAgICAgICAgdGhpcy5yZWN1cnNpdmUgPSByZWN1cnNpdmU7CisgICAgfQorCisgICAgcHJpdmF0ZSBKYXJFbnRyeSBuZXh0ID0gbnVsbDsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgIGlmIChuZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHQgPSBqYXJJbnB1dFN0cmVhbS5nZXROZXh0SmFyRW50cnkoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFuZXh0LmlzRGlyZWN0b3J5KCkgJiYgbmV4dC5nZXROYW1lKCkuc3RhcnRzV2l0aChwYXJlbnQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVjdXJzaXZlIHx8IG5leHQuZ2V0TmFtZSgpLnN1YnN0cmluZyhwYXJlbnQubGVuZ3RoKCkpLmluZGV4T2YoSkFSX0ZJTEVfU0VQQVJBVE9SKSA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7CisgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiB8IFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLkNPTkZJRywgTG9jYWxpemF0aW9uTWVzc2FnZXMuSkFSX1NDQU5ORVJfVU5BQkxFX1RPX1JFQURfRU5UUlkoKSwgZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG5leHQgPT0gbnVsbCkgeworICAgICAgICAgICAgY2xvc2UoKTsKKworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBuZXh0KCkgeworICAgICAgICBpZiAobmV4dCAhPSBudWxsIHx8IGhhc05leHQoKSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSBuZXh0LmdldE5hbWUoKTsKKyAgICAgICAgICAgIG5leHQgPSBudWxsOworICAgICAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICAgIH0KKworICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSW5wdXRTdHJlYW0gb3BlbigpIHsKKyAgICAgICAgLy9ub2luc3BlY3Rpb24gTnVsbGFibGVQcm9ibGVtcworICAgICAgICByZXR1cm4gbmV3IElucHV0U3RyZWFtKCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGphcklucHV0U3RyZWFtLnJlYWQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgaW50IHJlYWQoZmluYWwgYnl0ZVtdIGJ5dGVzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIHJldHVybiBqYXJJbnB1dFN0cmVhbS5yZWFkKGJ5dGVzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgaW50IHJlYWQoZmluYWwgYnl0ZVtdIGJ5dGVzLCBmaW5hbCBpbnQgaSwgZmluYWwgaW50IGkyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIHJldHVybiBqYXJJbnB1dFN0cmVhbS5yZWFkKGJ5dGVzLCBpLCBpMik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGxvbmcgc2tpcChmaW5hbCBsb25nIGwpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGphcklucHV0U3RyZWFtLnNraXAobCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGludCBhdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIHJldHVybiBqYXJJbnB1dFN0cmVhbS5hdmFpbGFibGUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgamFySW5wdXRTdHJlYW0uY2xvc2VFbnRyeSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBtYXJrKGZpbmFsIGludCBpKSB7CisgICAgICAgICAgICAgICAgamFySW5wdXRTdHJlYW0ubWFyayhpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIGphcklucHV0U3RyZWFtLnJlc2V0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gamFySW5wdXRTdHJlYW0ubWFya1N1cHBvcnRlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgamFySW5wdXRTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLkZJTkUsIExvY2FsaXphdGlvbk1lc3NhZ2VzLkpBUl9TQ0FOTkVSX1VOQUJMRV9UT19DTE9TRV9GSUxFKCksIGlvZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3NjYW5uaW5nL0phclppcFNjaGVtZVJlc291cmNlRmluZGVyRmFjdG9yeS5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvc2Nhbm5pbmcvSmFyWmlwU2NoZW1lUmVzb3VyY2VGaW5kZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZmZjlhNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3NjYW5uaW5nL0phclppcFNjaGVtZVJlc291cmNlRmluZGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5zY2FubmluZzsKKworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5BYnN0cmFjdFJlc291cmNlRmluZGVyQWRhcHRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS51cmkuVXJpQ29tcG9uZW50OworCisvKioKKyAqIEEgImphciIsICJ6aXAiIGFuZCAid3NqYXIiIHNjaGVtZSBVUkkgc2Nhbm5lciB0aGF0IHJlY3Vyc2l2ZWx5IGphciBmaWxlcy4KKyAqIEphciBlbnRyaWVzIGFyZSByZXBvcnRlZCB0byBhIHtAbGluayBSZXNvdXJjZVByb2Nlc3Nvcn0uCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBHZXJhcmQgRGF2aXNvbiAoZ2VyYXJkLmRhdmlzb24gYXQgb3JhY2xlLmNvbSkKKyAqLworZmluYWwgY2xhc3MgSmFyWmlwU2NoZW1lUmVzb3VyY2VGaW5kZXJGYWN0b3J5IGltcGxlbWVudHMgVXJpU2NoZW1lUmVzb3VyY2VGaW5kZXJGYWN0b3J5IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IFNDSEVNRVMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQobmV3IEhhc2hTZXQ8PihBcnJheXMuYXNMaXN0KCJqYXIiLCAiemlwIiwgIndzamFyIikpKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRTY2hlbWVzKCkgeworICAgICAgICByZXR1cm4gU0NIRU1FUzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3ICJqYXIiLCAiemlwIiBhbmQgIndzamFyIiBzY2hlbWUgVVJJIHNjYW5uZXIgZmFjdG9yeS4KKyAgICAgKi8KKyAgICBKYXJaaXBTY2hlbWVSZXNvdXJjZUZpbmRlckZhY3RvcnkoKSB7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEphclppcFNjaGVtZVNjYW5uZXIgY3JlYXRlKGZpbmFsIFVSSSB1cmksIGZpbmFsIGJvb2xlYW4gcmVjdXJzaXZlKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBzc3AgPSB1cmkuZ2V0UmF3U2NoZW1lU3BlY2lmaWNQYXJ0KCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBqYXJVcmxTdHJpbmcgPSBzc3Auc3Vic3RyaW5nKDAsIHNzcC5sYXN0SW5kZXhPZignIScpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHBhcmVudCA9IHNzcC5zdWJzdHJpbmcoc3NwLmxhc3RJbmRleE9mKCchJykgKyAyKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBKYXJaaXBTY2hlbWVTY2FubmVyKGdldElucHV0U3RyZWFtKGphclVybFN0cmluZyksIHBhcmVudCwgcmVjdXJzaXZlKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJlc291cmNlRmluZGVyRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBKYXJaaXBTY2hlbWVTY2FubmVyIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUZpbmRlckFkYXB0ZXIgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW07CisgICAgICAgIHByaXZhdGUgZmluYWwgSmFyRmlsZVNjYW5uZXIgamFyRmlsZVNjYW5uZXI7CisKKyAgICAgICAgcHJpdmF0ZSBKYXJaaXBTY2hlbWVTY2FubmVyKGZpbmFsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBmaW5hbCBTdHJpbmcgcGFyZW50LCBmaW5hbCBib29sZWFuIHJlY3Vyc2l2ZSkKKyAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgdGhpcy5pbnB1dFN0cmVhbSA9IGlucHV0U3RyZWFtOworICAgICAgICAgICAgdGhpcy5qYXJGaWxlU2Nhbm5lciA9IG5ldyBKYXJGaWxlU2Nhbm5lcihpbnB1dFN0cmVhbSwgcGFyZW50LCByZWN1cnNpdmUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGhhc05leHQgPSBqYXJGaWxlU2Nhbm5lci5oYXNOZXh0KCk7CisgICAgICAgICAgICBpZiAoIWhhc05leHQpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpbnB1dFN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihKYXJaaXBTY2hlbWVTY2FubmVyLmNsYXNzLmdldE5hbWUoKSkubG9nKExldmVsLkZJTkUsICJVbmFibGUgdG8gY2xvc2UgamFyIGZpbGUuIiwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBuZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIGphckZpbGVTY2FubmVyLm5leHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSW5wdXRTdHJlYW0gb3BlbigpIHsKKyAgICAgICAgICAgIHJldHVybiBqYXJGaWxlU2Nhbm5lci5vcGVuKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgICAgICBqYXJGaWxlU2Nhbm5lci5jbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICAgICAgamFyRmlsZVNjYW5uZXIucmVzZXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE9idGFpbiBhIHtAbGluayBJbnB1dFN0cmVhbX0gb2YgdGhlIGphciBmaWxlLgorICAgICAqIDxwPgorICAgICAqIEZvciBtb3N0IHBsYXRmb3JtcyB0aGUgZm9ybWF0IGZvciB0aGUgemlwIG9yIGphciBmb2xsb3dzIHRoZSBmb3JtIG9mCisgICAgICogdGhlIDxhIGhyZWY9Imh0dHA6Ly9kb2NzLnN1bi5jb20vc291cmNlLzgxOS0wOTEzL2F1dGhvci9qYXIuaHRtbCNqYXJwcm90b2NvbCJqYXIgcHJvdGNvbC48L2E+PC9wPgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+PGNvZGU+amFyOmZpbGU6Ly8vdG1wL2Zpc2hmaW5nZXJzLnppcCEvZXhhbXBsZS50eHQ8L2NvZGU+PC9saT4KKyAgICAgKiA8bGk+PGNvZGU+emlwOmh0dHA6Ly93d3cuZXhhbXBsZS5jb20vZmlzaGZpbmdlcnMuemlwIS9leGFtcGxlLnR4dDwvY29kZT48L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPHA+CisgICAgICogT24gdmVyc2lvbnMgb2YgdGhlIFdlYkxvZ2ljIGFwcGxpY2F0aW9uIHNlcnZlciBhIHByb3ByaWV0YXJ5IGZvcm1hdCBpcworICAgICAqIHN1cHBvcnRlZCBvZiB0aGUgZm9sbG93aW5nIGZvcm0sIHdoaWNoIGFzc3VtZXMgYSB6aXAgZmlsZSBsb2NhdGVkIG9uCisgICAgICogdGhlIGxvY2FsIGZpbGUgc3lzdGVtOgorICAgICAqIDwvcD4KKyAgICAgKiA8dWw+CisgICAgICogPGxpPjxjb2RlPnppcDovdG1wL2Zpc2hmaW5nZXJzLnppcCEvZXhhbXBsZS50eHQ8L2NvZGU+PC9saT4KKyAgICAgKiA8bGk+PGNvZGU+emlwOmQ6L3RlbXBmaXNoZmluZ2Vycy56aXAhL2V4YW1wbGUudHh0PC9jb2RlPjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8cC8+CisgICAgICogVGhpcyBtZXRob2Qgd2lsbCBmaXJzdCBhdHRlbXB0IHRvIGNyZWF0ZSBhIHtAbGluayBJbnB1dFN0cmVhbX0gYXMgZm9sbG93czoKKyAgICAgKiA8cHJlPgorICAgICAqICAgbmV3IFVSTChqYXJVcmxTdHJpbmcpLm9wZW5TdHJlYW0oKTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKiBpZiB0aGF0IGZhaWxzIHdpdGggYSB7QGxpbmsgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9ufSB0aGVuIHRoZSBtZXRob2Qgd2lsbAorICAgICAqIGF0dGVtcHQgdG8gY3JlYXRlIGEge0BsaW5rIElucHV0U3RyZWFtfSBpbnN0YW5jZSBhcyBmb2xsb3dzOgorICAgICAqIDxwcmU+CisgICAgICogIHJldHVybiBuZXcgbmV3IEZpbGVJbnB1dFN0cmVhbSgKKyAgICAgKiAgICAgIFVyaUNvbXBvbmVudC5kZWNvZGUoamFyVXJsU3RyaW5nLCBVcmlDb21wb25lbnQuVHlwZS5QQVRIKSkpOworICAgICAqIDwvcHJlPgorICAgICAqCisgICAgICogQHBhcmFtIGphclVybFN0cmluZyB0aGUgcmF3IHNjaGVtZSBzcGVjaWZpYyBwYXJ0IG9mIGEgVVJJIG1pbnVzIHRoZSBqYXIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIGVudHJ5CisgICAgICogQHJldHVybiBhIHtAbGluayBJbnB1dFN0cmVhbX0uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvciBvcGVuaW5nIHRoZSBzdHJlYW0uCisgICAgICovCisgICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbShmaW5hbCBTdHJpbmcgamFyVXJsU3RyaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBVUkwoamFyVXJsU3RyaW5nKS5vcGVuU3RyZWFtKCk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGVJbnB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgVXJpQ29tcG9uZW50LmRlY29kZShqYXJVcmxTdHJpbmcsIFVyaUNvbXBvbmVudC5UeXBlLlBBVEgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3NjYW5uaW5nL1BhY2thZ2VOYW1lc1NjYW5uZXIuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3NjYW5uaW5nL1BhY2thZ2VOYW1lc1NjYW5uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWFkMzdlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvc2Nhbm5pbmcvUGFja2FnZU5hbWVzU2Nhbm5lci5qYXZhCkBAIC0wLDAgKzEsMzE5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5zY2FubmluZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5SZWZsZWN0UGVybWlzc2lvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Pc2dpUmVnaXN0cnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5SZWZsZWN0aW9uSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuVG9rZW5pemVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5BYnN0cmFjdFJlc291cmNlRmluZGVyQWRhcHRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS51cmkuVXJpQ29tcG9uZW50OworCisvKioKKyAqIEEgc2Nhbm5lciB0aGF0IHJlY3Vyc2l2ZWx5IHNjYW5zIFVSSS1iYXNlZCByZXNvdXJjZXMgcHJlc2VudCBpbiBhIHNldCBvZgorICogcGFja2FnZSBuYW1lcywgYW5kICBuZXN0ZWQgcGFja2FnZSBuYW1lcyBvZiB0aGF0IHNldC4gKFJlY3Vyc2l2ZSBzY2FubmluZyBvZgorICogbmVzdGVkIHBhY2thZ2VzIGNhbiBiZSBkaXNhYmxlZCB1c2luZyBhIHByb3BlciBjb25zdHJ1Y3Rvci4pCisgKiA8cD4KKyAqIFRoZSBVUklzIGZvciBhIHBhY2thZ2UgbmFtZSBhcmUgb2J0YWluZWQsIGJ5IGRlZmF1bHQsIGJ5IGludm9raW5nCisgKiB7QGxpbmsgQ2xhc3NMb2FkZXIjZ2V0UmVzb3VyY2VzKGphdmEubGFuZy5TdHJpbmcpIH0gd2l0aCB0aGUgcGFyYW1ldGVyIHRoYXQKKyAqIGlzIHRoZSBwYWNrYWdlIG5hbWUgd2l0aCAiLiIgcmVwbGFjZWQgYnkgIi8iLgorICogPHA+CisgKiBFYWNoIFVSSSBpcyB0aGVuIHNjYW5uZWQgdXNpbmcgYSByZWdpc3RlcmVkIHtAbGluayBVcmlTY2hlbWVSZXNvdXJjZUZpbmRlckZhY3Rvcnl9IHRoYXQKKyAqIHN1cHBvcnRzIHRoZSBVUkkgc2NoZW1lLgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIGFyZSByZWdpc3RlcmVkIGJ5IGRlZmF1bHQuCisgKiBUaGUge0BsaW5rIEZpbGVTY2hlbWVSZXNvdXJjZUZpbmRlckZhY3Rvcnl9IGZvciAiZmlsZSIgVVJJIHNjaGVtZXMuCisgKiBUaGUge0BsaW5rIEphclppcFNjaGVtZVJlc291cmNlRmluZGVyRmFjdG9yeX0gZm9yICJqYXIiIG9yICJ6aXAiIFVSSSBzY2hlbWVzIHRvIGphcgorICogcmVzb3VyY2VzLgorICogVGhlIHtAbGluayBWZnNTY2hlbWVSZXNvdXJjZUZpbmRlckZhY3Rvcnl9IGZvciB0aGUgSkJvc3MtYmFzZWQgInZmc2ZpbGUiIGFuZCAidmZzemlwIgorICogVVJJIHNjaGVtZXMuCisgKiA8cD4KKyAqIEZ1cnRoZXIgc2NoZW1lcyBtYXkgYmUgcmVnaXN0ZXJlZCBieSByZWdpc3RlcmluZyBhbiBpbXBsZW1lbnRhdGlvbiBvZgorICoge0BsaW5rIFVyaVNjaGVtZVJlc291cmNlRmluZGVyRmFjdG9yeX0gaW4gdGhlIE1FVEEtSU5GL3NlcnZpY2VzIGZpbGUgd2hvc2UgbmFtZSBpcyB0aGUKKyAqIHRoZSBmdWxseSBxdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB7QGxpbmsgVXJpU2NoZW1lUmVzb3VyY2VGaW5kZXJGYWN0b3J5fS4KKyAqIDxwPgorICogSWYgYSBVUkkgc2NoZW1lIGlzIG5vdCBzdXBwb3J0ZWQgYSB7QGxpbmsgUmVzb3VyY2VGaW5kZXJFeGNlcHRpb259IHdpbGwgYmUgdGhyb3duCisgKiBhbmQgcGFja2FnZSBzY2FubmluZyBkZXBsb3ltZW50IHdpbGwgZmFpbC4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgUGFja2FnZU5hbWVzU2Nhbm5lciBleHRlbmRzIEFic3RyYWN0UmVzb3VyY2VGaW5kZXJBZGFwdGVyIHsKKworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiByZWN1cnNpdmU7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBwYWNrYWdlczsKKyAgICBwcml2YXRlIGZpbmFsIENsYXNzTG9hZGVyIGNsYXNzbG9hZGVyOworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgVXJpU2NoZW1lUmVzb3VyY2VGaW5kZXJGYWN0b3J5PiBmaW5kZXJGYWN0b3JpZXM7CisKKyAgICBwcml2YXRlIENvbXBvc2l0ZVJlc291cmNlRmluZGVyIGNvbXBvc2l0ZVJlc291cmNlRmluZGVyOworCisgICAgLyoqCisgICAgICogU2NhbiBhIHNldCBvZiBwYWNrYWdlcyB1c2luZyBhIGNvbnRleHQge0BsaW5rIENsYXNzTG9hZGVyfS4KKyAgICAgKgorICAgICAqIFRoZSB7QGNvZGUgcmVjdXJzaXZlfSBmbGFnIGRldGVybWluZXMgd2hldGhlciB0aGUgcGFja2FnZXMgd2lsbCBiZSBzY2FubmVkIHJlY3Vyc2l2ZWx5CisgICAgICogdG9nZXRoZXIgd2l0aCB0aGVpciBuZXN0ZWQgcGFja2FnZXMgKHtAY29kZSB0cnVlfSkgb3IgaWYgb25seSB0aGUgc3BlY2lmaWVkIHBhY2thZ2VzCisgICAgICogc2hhbGwgYmUgc2Nhbm5lZCAoe0Bjb2RlIGZhbHNlfSkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFja2FnZXMgIGFuIGFycmF5IG9mIHBhY2thZ2UgbmFtZXMuCisgICAgICogQHBhcmFtIHJlY3Vyc2l2ZSBpZiAoe0Bjb2RlIHRydWV9IHRoZSBwYWNrYWdlcyB3aWxsIGJlIHNjYW5uZWQgcmVjdXJzaXZlbHkgdG9nZXRoZXIgd2l0aAorICAgICAqICAgICAgICAgICAgICAgICAgYW55IG5lc3RlZCBwYWNrYWdlcywgaWYge0Bjb2RlIGZhbHNlfSBvbmx5IHRoZSBleHBsaWNpdGx5IGxpc3RlZCBwYWNrYWdlcworICAgICAqICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzY2FubmVkLgorICAgICAqLworICAgIHB1YmxpYyBQYWNrYWdlTmFtZXNTY2FubmVyKGZpbmFsIFN0cmluZ1tdIHBhY2thZ2VzLCBmaW5hbCBib29sZWFuIHJlY3Vyc2l2ZSkgeworICAgICAgICB0aGlzKEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKFJlZmxlY3Rpb25IZWxwZXIuZ2V0Q29udGV4dENsYXNzTG9hZGVyUEEoKSksCisgICAgICAgICAgICAgICAgVG9rZW5pemVyLnRva2VuaXplKHBhY2thZ2VzLCBUb2tlbml6ZXIuQ09NTU9OX0RFTElNSVRFUlMpLCByZWN1cnNpdmUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNjYW4gYSBzZXQgb2YgcGFja2FnZXMgdXNpbmcgdGhlIHByb3ZpZGVkIHtAbGluayBDbGFzc0xvYWRlcn0uCisgICAgICoKKyAgICAgKiBUaGUge0Bjb2RlIHJlY3Vyc2l2ZX0gZmxhZyBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHBhY2thZ2VzIHdpbGwgYmUgc2Nhbm5lZCByZWN1cnNpdmVseQorICAgICAqIHRvZ2V0aGVyIHdpdGggdGhlaXIgbmVzdGVkIHBhY2thZ2VzICh7QGNvZGUgdHJ1ZX0pIG9yIGlmIG9ubHkgdGhlIHNwZWNpZmllZCBwYWNrYWdlcworICAgICAqIHNoYWxsIGJlIHNjYW5uZWQgKHtAY29kZSBmYWxzZX0pLgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzTG9hZGVyIHRoZSB7QGxpbmsgQ2xhc3NMb2FkZXJ9IHRvIGxvYWQgY2xhc3NlcyBmcm9tLgorICAgICAqIEBwYXJhbSBwYWNrYWdlcyAgICBhbiBhcnJheSBvZiBwYWNrYWdlIG5hbWVzLgorICAgICAqIEBwYXJhbSByZWN1cnNpdmUgICBpZiAoe0Bjb2RlIHRydWV9IHRoZSBwYWNrYWdlcyB3aWxsIGJlIHNjYW5uZWQgcmVjdXJzaXZlbHkgdG9nZXRoZXIgd2l0aAorICAgICAqICAgICAgICAgICAgICAgICAgICBhbnkgbmVzdGVkIHBhY2thZ2VzLCBpZiB7QGNvZGUgZmFsc2V9IG9ubHkgdGhlIGV4cGxpY2l0bHkgbGlzdGVkIHBhY2thZ2VzCisgICAgICogICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgc2Nhbm5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGFja2FnZU5hbWVzU2Nhbm5lcihmaW5hbCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciwgZmluYWwgU3RyaW5nW10gcGFja2FnZXMsIGZpbmFsIGJvb2xlYW4gcmVjdXJzaXZlKSB7CisgICAgICAgIHRoaXMucmVjdXJzaXZlID0gcmVjdXJzaXZlOworICAgICAgICB0aGlzLnBhY2thZ2VzID0gcGFja2FnZXMuY2xvbmUoKTsKKyAgICAgICAgdGhpcy5jbGFzc2xvYWRlciA9IGNsYXNzTG9hZGVyOworCisgICAgICAgIHRoaXMuZmluZGVyRmFjdG9yaWVzID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBhZGQobmV3IEphclppcFNjaGVtZVJlc291cmNlRmluZGVyRmFjdG9yeSgpKTsKKyAgICAgICAgYWRkKG5ldyBGaWxlU2NoZW1lUmVzb3VyY2VGaW5kZXJGYWN0b3J5KCkpOworICAgICAgICBhZGQobmV3IFZmc1NjaGVtZVJlc291cmNlRmluZGVyRmFjdG9yeSgpKTsKKyAgICAgICAgYWRkKG5ldyBCdW5kbGVTY2hlbWVSZXNvdXJjZUZpbmRlckZhY3RvcnkoKSk7CisKKyAgICAgICAgLy8gVE9ETyAtIFNlcnZpY2VzPworICAgICAgICAvLyBmb3IgKFVyaVNjaGVtZVJlc291cmNlRmluZGVyRmFjdG9yeSBzIDogU2VydmljZUZpbmRlci5maW5kKFVyaVNjaGVtZVJlc291cmNlRmluZGVyRmFjdG9yeS5jbGFzcykpIHsKKyAgICAgICAgLy8gICAgIGFkZChzKTsKKyAgICAgICAgLy8gfQorCisgICAgICAgIGZpbmFsIE9zZ2lSZWdpc3RyeSBvc2dpUmVnaXN0cnkgPSBSZWZsZWN0aW9uSGVscGVyLmdldE9zZ2lSZWdpc3RyeUluc3RhbmNlKCk7CisgICAgICAgIGlmIChvc2dpUmVnaXN0cnkgIT0gbnVsbCkgeworICAgICAgICAgICAgc2V0UmVzb3VyY2VzUHJvdmlkZXIobmV3IFBhY2thZ2VOYW1lc1NjYW5uZXIuUmVzb3VyY2VzUHJvdmlkZXIoKSB7CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgRW51bWVyYXRpb248VVJMPiBnZXRSZXNvdXJjZXMoZmluYWwgU3RyaW5nIHBhY2thZ2VQYXRoLCBmaW5hbCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9zZ2lSZWdpc3RyeS5nZXRQYWNrYWdlUmVzb3VyY2VzKHBhY2thZ2VQYXRoLCBjbGFzc0xvYWRlciwgcmVjdXJzaXZlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIGluaXQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkKGZpbmFsIFVyaVNjaGVtZVJlc291cmNlRmluZGVyRmFjdG9yeSB1cmlTY2hlbWVSZXNvdXJjZUZpbmRlckZhY3RvcnkpIHsKKyAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgc2NoZW1lIDogdXJpU2NoZW1lUmVzb3VyY2VGaW5kZXJGYWN0b3J5LmdldFNjaGVtZXMoKSkgeworICAgICAgICAgICAgZmluZGVyRmFjdG9yaWVzLnB1dChzY2hlbWUudG9Mb3dlckNhc2UoKSwgdXJpU2NoZW1lUmVzb3VyY2VGaW5kZXJGYWN0b3J5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgIHJldHVybiBjb21wb3NpdGVSZXNvdXJjZUZpbmRlci5oYXNOZXh0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBuZXh0KCkgeworICAgICAgICByZXR1cm4gY29tcG9zaXRlUmVzb3VyY2VGaW5kZXIubmV4dCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBvcGVuKCkgeworICAgICAgICByZXR1cm4gY29tcG9zaXRlUmVzb3VyY2VGaW5kZXIub3BlbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICBjb21wb3NpdGVSZXNvdXJjZUZpbmRlci5jbG9zZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICBjbG9zZSgpOworICAgICAgICBpbml0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXQoKSB7CisgICAgICAgIGNvbXBvc2l0ZVJlc291cmNlRmluZGVyID0gbmV3IENvbXBvc2l0ZVJlc291cmNlRmluZGVyKCk7CisKKyAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgcCA6IHBhY2thZ2VzKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZpbmFsIEVudW1lcmF0aW9uPFVSTD4gdXJscyA9CisgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZXNQcm92aWRlci5nZXRJbnN0YW5jZSgpLmdldFJlc291cmNlcyhwLnJlcGxhY2UoJy4nLCAnLycpLCBjbGFzc2xvYWRlcik7CisgICAgICAgICAgICAgICAgd2hpbGUgKHVybHMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlc291cmNlRmluZGVyKHRvVVJJKHVybHMubmV4dEVsZW1lbnQoKSkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBVUklTeW50YXhFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlc291cmNlRmluZGVyRXhjZXB0aW9uKCJFcnJvciB3aGVuIGNvbnZlcnRpbmcgYSBVUkwgdG8gYSBVUkkiLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VGaW5kZXJFeGNlcHRpb24oIklPIGVycm9yIHdoZW4gcGFja2FnZSBzY2FubmluZyBqYXIiLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogRmluZCByZXNvdXJjZXMgd2l0aCBhIGdpdmVuIG5hbWUgYW5kIGNsYXNzIGxvYWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIFJlc291cmNlc1Byb3ZpZGVyIHsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBSZXNvdXJjZXNQcm92aWRlciBwcm92aWRlcjsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBSZXNvdXJjZXNQcm92aWRlciBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgICAgIC8vIERvdWJsZS1jaGVjayBpZGlvbSBmb3IgbGF6eSBpbml0aWFsaXphdGlvbgorICAgICAgICAgICAgUmVzb3VyY2VzUHJvdmlkZXIgcmVzdWx0ID0gcHJvdmlkZXI7CisKKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeyAvLyBmaXJzdCBjaGVjayB3aXRob3V0IGxvY2tpbmcKKyAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKFJlc291cmNlc1Byb3ZpZGVyLmNsYXNzKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHByb3ZpZGVyOworICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsgLy8gc2Vjb25kIGNoZWNrIHdpdGggbG9ja2luZworICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIgPSByZXN1bHQgPSBuZXcgUmVzb3VyY2VzUHJvdmlkZXIoKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgRW51bWVyYXRpb248VVJMPiBnZXRSZXNvdXJjZXMoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIENsYXNzTG9hZGVyIGNsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsLmdldFJlc291cmNlcyhuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9OworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldEluc3RhbmNlKGZpbmFsIFJlc291cmNlc1Byb3ZpZGVyIHByb3ZpZGVyKSB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgU2VjdXJpdHlNYW5hZ2VyIHNlY3VyaXR5ID0gU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpOworICAgICAgICAgICAgaWYgKHNlY3VyaXR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBSZWZsZWN0UGVybWlzc2lvbiBycCA9IG5ldyBSZWZsZWN0UGVybWlzc2lvbigic3VwcHJlc3NBY2Nlc3NDaGVja3MiKTsKKyAgICAgICAgICAgICAgICBzZWN1cml0eS5jaGVja1Blcm1pc3Npb24ocnApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3luY2hyb25pemVkIChSZXNvdXJjZXNQcm92aWRlci5jbGFzcykgeworICAgICAgICAgICAgICAgIFJlc291cmNlc1Byb3ZpZGVyLnByb3ZpZGVyID0gcHJvdmlkZXI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRmluZCBhbGwgcmVzb3VyY2VzIHdpdGggdGhlIGdpdmVuIG5hbWUgdXNpbmcgYSBjbGFzcyBsb2FkZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjbCAgIHRoZSBjbGFzcyBsb2FkZXIgdXNlIHRvIGZpbmQgdGhlIHJlc291cmNlcworICAgICAgICAgKiBAcGFyYW0gbmFtZSB0aGUgcmVzb3VyY2UgbmFtZQorICAgICAgICAgKiBAcmV0dXJuIEFuIGVudW1lcmF0aW9uIG9mIFVSTCBvYmplY3RzIGZvciB0aGUgcmVzb3VyY2UuCisgICAgICAgICAqICAgICAgICAgSWYgbm8gcmVzb3VyY2VzIGNvdWxkIGJlIGZvdW5kLCB0aGUgZW51bWVyYXRpb24gd2lsbCBiZSBlbXB0eS4KKyAgICAgICAgICogICAgICAgICBSZXNvdXJjZXMgdGhhdCB0aGUgY2xhc3MgbG9hZGVyIGRvZXNuJ3QgaGF2ZSBhY2Nlc3MgdG8gd2lsbAorICAgICAgICAgKiAgICAgICAgIG5vdCBiZSBpbiB0aGUgZW51bWVyYXRpb24uCisgICAgICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgSS9PIGVycm9ycyBvY2N1cgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGFic3RyYWN0IEVudW1lcmF0aW9uPFVSTD4gZ2V0UmVzb3VyY2VzKFN0cmluZyBuYW1lLCBDbGFzc0xvYWRlciBjbCkgdGhyb3dzIElPRXhjZXB0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUge0BsaW5rIFJlc291cmNlc1Byb3ZpZGVyfSBpbXBsZW1lbnRhdGlvbiB0byBmaW5kIHJlc291cmNlcy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgaW52b2tlZCBiZWZvcmUgYW55IHBhY2thZ2Ugc2Nhbm5pbmcgaXMgcGVyZm9ybWVkCisgICAgICogb3RoZXJ3aXNlIHRoZSBmdW5jdGlvbmFsaXR5IG1ldGhvZCB3aWxsIGJlIHV0aWxpemVkLgorICAgICAqCisgICAgICogQHBhcmFtIHByb3ZpZGVyIHRoZSByZXNvdXJjZXMgcHJvdmlkZXIuCisgICAgICogQHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiBpZiB0aGUgcmVzb3VyY2VzIHByb3ZpZGVyIGNhbm5vdCBiZSBzZXQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFJlc291cmNlc1Byb3ZpZGVyKGZpbmFsIFJlc291cmNlc1Byb3ZpZGVyIHByb3ZpZGVyKSB0aHJvd3MgU2VjdXJpdHlFeGNlcHRpb24geworICAgICAgICBSZXNvdXJjZXNQcm92aWRlci5zZXRJbnN0YW5jZShwcm92aWRlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFkZFJlc291cmNlRmluZGVyKGZpbmFsIFVSSSB1KSB7CisgICAgICAgIGZpbmFsIFVyaVNjaGVtZVJlc291cmNlRmluZGVyRmFjdG9yeSBmaW5kZXJGYWN0b3J5ID0gZmluZGVyRmFjdG9yaWVzLmdldCh1LmdldFNjaGVtZSgpLnRvTG93ZXJDYXNlKCkpOworICAgICAgICBpZiAoZmluZGVyRmFjdG9yeSAhPSBudWxsKSB7CisgICAgICAgICAgICBjb21wb3NpdGVSZXNvdXJjZUZpbmRlci5wdXNoKGZpbmRlckZhY3RvcnkuY3JlYXRlKHUsIHJlY3Vyc2l2ZSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJlc291cmNlRmluZGVyRXhjZXB0aW9uKCJUaGUgVVJJIHNjaGVtZSAiICsgdS5nZXRTY2hlbWUoKQorICAgICAgICAgICAgICAgICAgICArICIgb2YgdGhlIFVSSSAiICsgdQorICAgICAgICAgICAgICAgICAgICArICIgaXMgbm90IHN1cHBvcnRlZC4gUGFja2FnZSBzY2FubmluZyBkZXBsb3ltZW50IGlzIG5vdCIKKyAgICAgICAgICAgICAgICAgICAgKyAiIHN1cHBvcnRlZCBmb3Igc3VjaCBVUklzLiIKKyAgICAgICAgICAgICAgICAgICAgKyAiXG5UcnkgdXNpbmcgYSBkaWZmZXJlbnQgZGVwbG95bWVudCBtZWNoYW5pc20gc3VjaCBhcyIKKyAgICAgICAgICAgICAgICAgICAgKyAiIGV4cGxpY2l0bHkgZGVjbGFyaW5nIHJvb3QgcmVzb3VyY2UgYW5kIHByb3ZpZGVyIGNsYXNzZXMiCisgICAgICAgICAgICAgICAgICAgICsgIiB1c2luZyBhbiBleHRlbnNpb24gb2YgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBVUkkgdG9VUkkoZmluYWwgVVJMIHVybCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gdXJsLnRvVVJJKCk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFVSSVN5bnRheEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBXb3JrIGFyb3VuZCBidWcgd2hlcmUgc29tZSBVUkxzIGFyZSBpbmNvcnJlY3RseSBlbmNvZGVkLgorICAgICAgICAgICAgLy8gVGhpcyBjYW4gb2NjdXIgd2hlbiBjZXJ0YWluIGNsYXNzIGxvYWRlcnMgYXJlIHV0aWxpemVkCisgICAgICAgICAgICAvLyB0byBvYnRhaW4gVVJMcyBmb3IgcmVzb3VyY2VzLgorICAgICAgICAgICAgcmV0dXJuIFVSSS5jcmVhdGUodG9FeHRlcm5hbEZvcm0odXJsKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyB0b0V4dGVybmFsRm9ybShmaW5hbCBVUkwgdSkgeworCisgICAgICAgIC8vIHByZS1jb21wdXRlIGxlbmd0aCBvZiBTdHJpbmdCdWZmZXIKKyAgICAgICAgaW50IGxlbiA9IHUuZ2V0UHJvdG9jb2woKS5sZW5ndGgoKSArIDE7CisgICAgICAgIGlmICh1LmdldEF1dGhvcml0eSgpICE9IG51bGwgJiYgdS5nZXRBdXRob3JpdHkoKS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIGxlbiArPSAyICsgdS5nZXRBdXRob3JpdHkoKS5sZW5ndGgoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodS5nZXRQYXRoKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgbGVuICs9IHUuZ2V0UGF0aCgpLmxlbmd0aCgpOworICAgICAgICB9CisgICAgICAgIGlmICh1LmdldFF1ZXJ5KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgbGVuICs9IDEgKyB1LmdldFF1ZXJ5KCkubGVuZ3RoKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHUuZ2V0UmVmKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgbGVuICs9IDEgKyB1LmdldFJlZigpLmxlbmd0aCgpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcihsZW4pOworICAgICAgICByZXN1bHQuYXBwZW5kKHUuZ2V0UHJvdG9jb2woKSk7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIjoiKTsKKyAgICAgICAgaWYgKHUuZ2V0QXV0aG9yaXR5KCkgIT0gbnVsbCAmJiB1LmdldEF1dGhvcml0eSgpLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiLy8iKTsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQodS5nZXRBdXRob3JpdHkoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHUuZ2V0UGF0aCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoVXJpQ29tcG9uZW50LmNvbnRleHR1YWxFbmNvZGUodS5nZXRQYXRoKCksIFVyaUNvbXBvbmVudC5UeXBlLlBBVEgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodS5nZXRRdWVyeSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJz8nKTsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoVXJpQ29tcG9uZW50LmNvbnRleHR1YWxFbmNvZGUodS5nZXRRdWVyeSgpLCBVcmlDb21wb25lbnQuVHlwZS5RVUVSWSkpOworICAgICAgICB9CisgICAgICAgIGlmICh1LmdldFJlZigpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiMiKTsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQodS5nZXRSZWYoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3NjYW5uaW5nL1Jlc291cmNlRmluZGVyRXhjZXB0aW9uLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9zY2FubmluZy9SZXNvdXJjZUZpbmRlckV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3OWM4YmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9zY2FubmluZy9SZXNvdXJjZUZpbmRlckV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLnNjYW5uaW5nOworCisvKioKKyAqIEFuIHJ1bnRpbWUgZXhjZXB0aW9uIHRoYXQgbWF5IGJlIHRocm93biB3aGVuIHNjYW5uaW5nLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqLworcHVibGljIGNsYXNzIFJlc291cmNlRmluZGVyRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugd2l0aCB0aGUgc3VwcGxpZWQgbWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyBSZXNvdXJjZUZpbmRlckV4Y2VwdGlvbigpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugd2l0aCB0aGUgc3VwcGxpZWQgbWVzc2FnZQorICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgICAgICovCisgICAgcHVibGljIFJlc291cmNlRmluZGVyRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIHN1cGVyKG1lc3NhZ2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSB3aXRoIHRoZSBzdXBwbGllZCBtZXNzYWdlIGFuZCBjYXVzZQorICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlCisgICAgICogQHBhcmFtIGNhdXNlIHRoZSBUaHJvd2FibGUgdGhhdCBjYXVzZWQgdGhlIGV4Y2VwdGlvbiB0byBiZSB0aHJvd24KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzb3VyY2VGaW5kZXJFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgeworICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIHdpdGggdGhlIHN1cHBsaWVkIGNhdXNlCisgICAgICogQHBhcmFtIGNhdXNlIHRoZSBUaHJvd2FibGUgdGhhdCBjYXVzZWQgdGhlIGV4Y2VwdGlvbiB0byBiZSB0aHJvd24KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzb3VyY2VGaW5kZXJFeGNlcHRpb24oVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgICAgIHN1cGVyKGNhdXNlKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3NjYW5uaW5nL1Jlc291cmNlUHJvY2Vzc29yLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9zY2FubmluZy9SZXNvdXJjZVByb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NmZjMmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9zY2FubmluZy9SZXNvdXJjZVByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLnNjYW5uaW5nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworCisvKioKKyAqIFByb2Nlc3NlcyByZXNvdXJjZXMgZm91bmQgYnkge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUZpbmRlcn0uCisgKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGludGVyZmFjZSBSZXNvdXJjZVByb2Nlc3NvciB7CisKKyAgICAvKioKKyAgICAgKiBBY2NlcHQgYSBzY2FubmVkIHJlc291cmNlLgorICAgICAqIDxwPgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIHJlc291cmNlIG5hbWUuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSByZXNvdXJjZSBpcyBhY2NlcHRlZCBmb3IgcHJvY2Vzc2luZywgb3RoZXJ3aXNlIGZhbHNlLgorICAgICAqLworICAgIGJvb2xlYW4gYWNjZXB0KFN0cmluZyBuYW1lKTsKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYSBzY2FubmVkIHJlc291cmNlLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgYmUgaW52b2tlZCBhZnRlciB0aGUgbGlzdGVuZXIgaGFzIGFjY2VwdGVkIHRoZQorICAgICAqIHJlc291cmNlLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIHJlc291cmNlIG5hbWUuCisgICAgICogQHBhcmFtIGluIHRoZSBpbnB1dCBzdHJlYW0gb2YgdGhlIHJlc291cmNlCisgICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycyB3aGVuIHByb2Nlc3NpbmcgdGhlIHJlc291cmNlLgorICAgICAqLworICAgIHZvaWQgcHJvY2VzcyhTdHJpbmcgbmFtZSwgSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbjsKKworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvc2Nhbm5pbmcvVXJpU2NoZW1lUmVzb3VyY2VGaW5kZXJGYWN0b3J5LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9zY2FubmluZy9VcmlTY2hlbWVSZXNvdXJjZUZpbmRlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTJlMGYzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvc2Nhbm5pbmcvVXJpU2NoZW1lUmVzb3VyY2VGaW5kZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuc2Nhbm5pbmc7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUZpbmRlcjsKKworLyoqCisgKiBBbiBpbnRlcmZhY2UgZm9yIHNjYW5uaW5nIFVSSS1iYXNlZCByZXNvdXJjZXMgYW5kIHJlcG9ydGluZyB0aG9zZSByZXNvdXJjZXMKKyAqIHRvIGEgc2Nhbm5pbmcgbGlzdGVuZXIuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitpbnRlcmZhY2UgVXJpU2NoZW1lUmVzb3VyY2VGaW5kZXJGYWN0b3J5IHsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgc2V0IG9mIHN1cHBvcnRlZCBVUkkgc2NoZW1lcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHN1cHBvcnRlZCBVUkkgc2NoZW1lcy4KKyAgICAgKi8KKyAgICBTZXQ8U3RyaW5nPiBnZXRTY2hlbWVzKCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IHtAbGluayBSZXNvdXJjZUZpbmRlcn0gZm9yIGEgZ2l2ZW4gcmVzb3VyY2UgVVJJLgorICAgICAqCisgICAgICogQHBhcmFtIHVyaSAgICAgICByZXNvdXJjZSBVUkkuCisgICAgICogQHBhcmFtIHJlY3Vyc2l2ZSBkZWZpbmVzIHdoZXRoZXIgYSByZXNvdXJjZSBmaW5kZXIgc2hvdWxkIHJlY3Vyc2l2ZWx5IHNjYW4gYW55IHJlY29nbml6ZWQgc3ViLXJlc291cmNlCisgICAgICogICAgICAgICAgICAgICAgICBVUklzICh2YWx1ZSBvZiB7QGNvZGUgdHJ1ZX0pIG9yIG5vdCAodmFsdWUgb2Yge0Bjb2RlIGZhbHNlfSkuCisgICAgICogQHJldHVybiByZXNvdXJjZSBmaW5kZXIgZm9yIGEgZ2l2ZW4gVVJJLgorICAgICAqLworICAgIFJlc291cmNlRmluZGVyIGNyZWF0ZShVUkkgdXJpLCBib29sZWFuIHJlY3Vyc2l2ZSk7Cit9CisKZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3NjYW5uaW5nL1Zmc1NjaGVtZVJlc291cmNlRmluZGVyRmFjdG9yeS5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvc2Nhbm5pbmcvVmZzU2NoZW1lUmVzb3VyY2VGaW5kZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE2ZjIxNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3NjYW5uaW5nL1Zmc1NjaGVtZVJlc291cmNlRmluZGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5zY2FubmluZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VGaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLkFic3RyYWN0UmVzb3VyY2VGaW5kZXJBZGFwdGVyOworCisvKioKKyAqIEEgSkJvc3MtYmFzZWQgInZmc2ZpbGUiLCAidmZzIiBhbmQgInZmc3ppcCIgc2NoZW1lIFVSSSBzY2FubmVyLgorICogPHAvPgorICogVGhpcyBhcHByb2FjaCB1c2VzIHJlZmxlY3Rpb24gdG8gYWxsb3cgZm9yIHplcm8tZGVwcyBhbmQgc3VwcG9ydAorICogZm9yIGJvdGggdGhlIHYyIChFQVA1LCBBUzUpIGFuZCB2MyBWRlMgQVBJcyAoQVM2LCBBUzcsIEVBUDYgJiBXaWxkRmx5KQorICogd2hpY2ggYXJlIG5vdCBiaW5hcnkgY29tcGF0aWJsZS4KKyAqCisgKiBAYXV0aG9yIEphc29uIFQuIEdyZWVuZQorICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitmaW5hbCBjbGFzcyBWZnNTY2hlbWVSZXNvdXJjZUZpbmRlckZhY3RvcnkgaW1wbGVtZW50cyBVcmlTY2hlbWVSZXNvdXJjZUZpbmRlckZhY3RvcnkgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gU0NIRU1FUyA9IENvbGxlY3Rpb25zCisgICAgICAgICAgICAudW5tb2RpZmlhYmxlU2V0KG5ldyBIYXNoU2V0PD4oQXJyYXlzLmFzTGlzdCgidmZzZmlsZSIsICJ2ZnN6aXAiLCAidmZzIikpKTsKKworICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRTY2hlbWVzKCkgeworICAgICAgICByZXR1cm4gU0NIRU1FUzsKKyAgICB9CisKKyAgICBWZnNTY2hlbWVSZXNvdXJjZUZpbmRlckZhY3RvcnkoKSB7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc291cmNlRmluZGVyIGNyZWF0ZShmaW5hbCBVUkkgdXJpLCBmaW5hbCBib29sZWFuIHJlY3Vyc2l2ZSkgeworICAgICAgICByZXR1cm4gbmV3IFZmc1Jlc291cmNlRmluZGVyKHVyaSwgcmVjdXJzaXZlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBWZnNSZXNvdXJjZUZpbmRlciBleHRlbmRzIEFic3RyYWN0UmVzb3VyY2VGaW5kZXJBZGFwdGVyIHsKKworICAgICAgICBwcml2YXRlIE9iamVjdCBjdXJyZW50OworICAgICAgICBwcml2YXRlIE9iamVjdCBuZXh0OworICAgICAgICBwcml2YXRlIGZpbmFsIE1ldGhvZCBvcGVuU3RyZWFtOworICAgICAgICBwcml2YXRlIGZpbmFsIE1ldGhvZCBnZXROYW1lOworICAgICAgICBwcml2YXRlIGZpbmFsIE1ldGhvZCBpc0xlYWY7CisgICAgICAgIHByaXZhdGUgZmluYWwgSXRlcmF0b3I8Pz4gaXRlcmF0b3I7CisKKyAgICAgICAgcHVibGljIFZmc1Jlc291cmNlRmluZGVyKGZpbmFsIFVSSSB1cmksIGZpbmFsIGJvb2xlYW4gcmVjdXJzaXZlKSB7CisgICAgICAgICAgICBmaW5hbCBPYmplY3QgZGlyZWN0b3J5ID0gYmluZERpcmVjdG9yeSh1cmkpOworICAgICAgICAgICAgdGhpcy5vcGVuU3RyZWFtID0gYmluZE1ldGhvZChkaXJlY3RvcnksICJvcGVuU3RyZWFtIik7CisgICAgICAgICAgICB0aGlzLmdldE5hbWUgPSBiaW5kTWV0aG9kKGRpcmVjdG9yeSwgImdldE5hbWUiKTsKKyAgICAgICAgICAgIHRoaXMuaXNMZWFmID0gYmluZE1ldGhvZChkaXJlY3RvcnksICJpc0xlYWYiKTsKKyAgICAgICAgICAgIHRoaXMuaXRlcmF0b3IgPSBnZXRDaGlsZHJlbihkaXJlY3RvcnksIHJlY3Vyc2l2ZSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEl0ZXJhdG9yPD8+IGdldENoaWxkcmVuKGZpbmFsIE9iamVjdCBkaXJlY3RvcnksIGZpbmFsIGJvb2xlYW4gcmVjdXJzaXZlKSB7CisgICAgICAgICAgICBmaW5hbCBNZXRob2QgZ2V0Q2hpbGRyZW4gPSBiaW5kTWV0aG9kKGRpcmVjdG9yeSwgcmVjdXJzaXZlID8gImdldENoaWxkcmVuUmVjdXJzaXZlbHkiIDogImdldENoaWxkcmVuIik7CisKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8Pz4gbGlzdCA9IGludm9rZShkaXJlY3RvcnksIGdldENoaWxkcmVuLCBMaXN0LmNsYXNzKTsKKyAgICAgICAgICAgIGlmIChsaXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmVzb3VyY2VGaW5kZXJFeGNlcHRpb24oIlZGUyBvYmplY3QgcmV0dXJuZWQgbnVsbCB3aGVuIGFjY2Vzc2luZyBjaGlsZHJlbiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbGlzdC5pdGVyYXRvcigpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBNZXRob2QgYmluZE1ldGhvZChmaW5hbCBPYmplY3Qgb2JqZWN0LCBmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgaWYgKFN5c3RlbS5nZXRTZWN1cml0eU1hbmFnZXIoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQobmV3IFByaXZpbGVnZWRBY3Rpb248TWV0aG9kPigpIHsKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIE1ldGhvZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYmluZE1ldGhvZDAob2JqZWN0LCBuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gYmluZE1ldGhvZDAob2JqZWN0LCBuYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgPFQ+IFQgaW52b2tlKGZpbmFsIE9iamVjdCBpbnN0YW5jZSwgZmluYWwgTWV0aG9kIG1ldGhvZCwgZmluYWwgQ2xhc3M8VD4gdHlwZSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHlwZS5jYXN0KG1ldGhvZC5pbnZva2UoaW5zdGFuY2UpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlc291cmNlRmluZGVyRXhjZXB0aW9uKCJWRlMgb2JqZWN0IGNvdWxkIG5vdCBiZSBpbnZva2VkIHVwb24iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgTWV0aG9kIGJpbmRNZXRob2QwKGZpbmFsIE9iamVjdCBvYmplY3QsIGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiBjbGF6eiA9IG9iamVjdC5nZXRDbGFzcygpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBjbGF6ei5nZXRNZXRob2QobmFtZSk7CisgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSZXNvdXJjZUZpbmRlckV4Y2VwdGlvbigiVkZTIG9iamVjdCBkaWQgbm90IGhhdmUgYSB2YWxpZCBzaWduYXR1cmUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgT2JqZWN0IGJpbmREaXJlY3RvcnkoZmluYWwgVVJJIHVyaSkgeworICAgICAgICAgICAgT2JqZWN0IGRpcmVjdG9yeSA9IG51bGw7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGRpcmVjdG9yeSA9IHVyaS50b1VSTCgpLmdldENvbnRlbnQoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBFYXQKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGRpcmVjdG9yeSA9PSBudWxsIHx8ICFkaXJlY3RvcnkuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkuZXF1YWxzKCJWaXJ0dWFsRmlsZSIpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJlc291cmNlRmluZGVyRXhjZXB0aW9uKCJWRlMgVVJMIGRpZCBub3QgbWFwIHRvIGEgdmFsaWQgVkZTIG9iamVjdCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZGlyZWN0b3J5OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBvcGVuKCkgeworICAgICAgICAgICAgZmluYWwgT2JqZWN0IGN1cnJlbnQgPSB0aGlzLmN1cnJlbnQ7CisgICAgICAgICAgICBpZiAoY3VycmVudCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigibmV4dCgpIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBvcGVuKCkiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGludm9rZShjdXJyZW50LCBvcGVuU3RyZWFtLCBJbnB1dFN0cmVhbS5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGFkdmFuY2UoKSB7CisgICAgICAgICAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IG5leHQgPSBpdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICAgICAgaWYgKGludm9rZShuZXh0LCBpc0xlYWYsIEJvb2xlYW4uY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMubmV4dCA9IG5leHQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV4dCAhPSBudWxsIHx8IGFkdmFuY2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIG5leHQoKSB7CisgICAgICAgICAgICBpZiAoIWhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGN1cnJlbnQgPSBuZXh0OworICAgICAgICAgICAgbmV4dCA9IG51bGw7CisgICAgICAgICAgICByZXR1cm4gaW52b2tlKGN1cnJlbnQsIGdldE5hbWUsIFN0cmluZy5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9zY2FubmluZy9wYWNrYWdlLWluZm8uamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3NjYW5uaW5nL3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyOGZjZjAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9zY2FubmluZy9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvKioKKyAqIEplcnNleSBzZXJ2ZXItc2lkZSBpbnRlcm5hbCByZXNvdXJjZSBzY2FubmluZyBjbGFzc2VzLgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5zY2FubmluZzsKZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3NvbmFyL1NvbmFySmVyc2V5U2VydmVyLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9zb25hci9Tb25hckplcnNleVNlcnZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlYWQyNzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9zb25hci9Tb25hckplcnNleVNlcnZlci5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLnNvbmFyOworCisvKioKKyAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgY2xhc3MgaXMgdG8gdmVyaWZ5IHRoZSByZXBvcnRlZCB0ZXN0IGNvdmVyYWdlIHNob3dzIGNvcnJlY3QgcmVzdWx0cyBpbiB2YXJpb3VzIG1vZGVzIG9mIHRlc3QgZXhlY3V0aW9ucy4KKyAqIEZvciBmdXJ0aGVyIGRldGFpbHMsIHNlZSBqYXZhZG9jIGJlbGxvdy4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBTb25hckplcnNleVNlcnZlciB7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGluZGlyZWN0bHkgZnJvbSB0aGUgdGVzdHMuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgc2VydmVyKCkgeworICAgICAgICByZXR1cm4gInNlcnZlciI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBtZXRob2QgdGhhdCBpcyBleGVjdXRlZCBmcm9tIGEgdW5pdCB0ZXN0IGJ5IG1hdmVuIHN1cmVmaXJlIHBsdWdpbiB3aXRoaW4gdGhlIHNhbWUgTWF2ZW4gbW9kdWxlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdW5pdFRlc3QoKSB7CisgICAgICAgIHJldHVybiBzZXJ2ZXIoKSArICIgdW5pdCB0ZXN0IjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBleGVjdXRlZCBmcm9tIGEgdW5pdCB0ZXN0IGJ5IG1hdmVuIHN1cmVmaXJlIHBsdWdpbiBmcm9tIGEgZGVwZW5kYW50IG1vZHVsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGUyZSgpIHsKKyAgICAgICAgcmV0dXJuIHNlcnZlcigpICsgIiBlMmUiOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgbWV0aG9kIHRoYXQgaXMgZXhlY3V0ZWQgaW4gYSBKVk0gb2YgbWF2ZW4gZmFpbHNhZmUgcGx1Z2luIGZyb20gYSBkZXBlbmRhbnQgbWF2ZW4gbW9kdWxlLiBUaGUgY2FsbCBpcyBleGVjdXRlZCBkaXJlY3RseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGludGVncmF0aW9uVGVzdEp2bSgpIHsKKyAgICAgICAgcmV0dXJuIHNlcnZlcigpICsgIiB0ZXN0IGp2bSI7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgZXhlY3V0ZWQgZnJvbSBhIHNlcnZlciAoSmV0dHkgZm9yIGluc3RhbmNlKSBkdXJpbmcgdGhlIGludGVncmF0aW9uIHRlc3QgcGhhc2UuIFRoaXMgc2VydmVyIGlzIGNhbGxlZCBieSBhCisgICAgICogSlVuaXQgdGVzdCB0aGF0IGlzIGV4ZWN1dGVkIGJ5IG1hdmVuIGZhaWxzYWZlIHBsdWdpbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGludGVncmF0aW9uU2VydmVySnZtKCkgeworICAgICAgICByZXR1cm4gc2VydmVyKCkgKyAiIHNlcnZlciBqdm0iOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL0Fic3RyYWN0UmVzb3VyY2VNb2RlbFZpc2l0b3IuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL0Fic3RyYWN0UmVzb3VyY2VNb2RlbFZpc2l0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjBmZjE2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvQWJzdHJhY3RSZXNvdXJjZU1vZGVsVmlzaXRvci5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsOworCisvKioKKyAqIEFic3RyYWN0IGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBSZXNvdXJjZU1vZGVsVmlzaXRvciByZXNvdXJjZSBtb2RlbCB2aXNpdG9yfSBjb250YWluaW5nIGVtcHR5IGltcGxlbWVudGF0aW9ucworICogb2YgaW50ZXJmYWNlIG1ldGhvZHMuIFRoaXMgY2xhc3MgY2FuIGJlIGRlcml2ZWQgYnkgdmFsaWRhdG9yIGltcGxlbWVudGluZyBvbmx5IG1ldGhvZHMgbmVlZGVkIGZvciBzcGVjaWZpYworICogdmFsaWRhdGlvbnMuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICoKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UmVzb3VyY2VNb2RlbFZpc2l0b3IgaW1wbGVtZW50cyBSZXNvdXJjZU1vZGVsVmlzaXRvciB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRSZXNvdXJjZShSZXNvdXJjZSByZXNvdXJjZSkgeworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0Q2hpbGRSZXNvdXJjZShSZXNvdXJjZSByZXNvdXJjZSkgeworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0UmVzb3VyY2VNZXRob2QoUmVzb3VyY2VNZXRob2QgbWV0aG9kKSB7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRJbnZvY2FibGUoSW52b2NhYmxlIGludm9jYWJsZSkgeworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0TWV0aG9kSGFuZGxlcihNZXRob2RIYW5kbGVyIG1ldGhvZEhhbmRsZXIpIHsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFJlc291cmNlSGFuZGxlckNvbnN0cnVjdG9yKEhhbmRsZXJDb25zdHJ1Y3RvciBjb25zdHJ1Y3RvcikgeworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0UmVzb3VyY2VNb2RlbChSZXNvdXJjZU1vZGVsIHJlc291cmNlTW9kZWwpIHsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFJ1bnRpbWVSZXNvdXJjZShSdW50aW1lUmVzb3VyY2UgcnVudGltZVJlc291cmNlKSB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvQW5ub3RhdGVkTWV0aG9kLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9Bbm5vdGF0ZWRNZXRob2QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjkxYjUwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvQW5ub3RhdGVkTWV0aG9kLmphdmEKQEAgLTAsMCArMSwzNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Bbm5vdGF0ZWRFbGVtZW50OworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGVWYXJpYWJsZTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5Db29raWVQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5EZWZhdWx0VmFsdWU7CitpbXBvcnQgamF2YXgud3MucnMuRW5jb2RlZDsKK2ltcG9ydCBqYXZheC53cy5ycy5Gb3JtUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuSGVhZGVyUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuSHR0cE1ldGhvZDsKK2ltcG9ydCBqYXZheC53cy5ycy5NYXRyaXhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUmVmbGVjdGlvbkhlbHBlcjsKKworLyoqCisgKiBBbm5vdGF0ZWQgbWV0aG9kIHJlcHJlc2VudGF0aW9uLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEFubm90YXRlZE1ldGhvZCBpbXBsZW1lbnRzIEFubm90YXRlZEVsZW1lbnQgeworCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPj4gTUVUSE9EX01FVEFfQU5OT1RBVElPTlMgPSBnZXRTZXQoCisgICAgICAgICAgICBIdHRwTWV0aG9kLmNsYXNzKTsKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8Q2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+PiBNRVRIT0RfQU5OT1RBVElPTlMgPSBnZXRTZXQoCisgICAgICAgICAgICBQYXRoLmNsYXNzLAorICAgICAgICAgICAgUHJvZHVjZXMuY2xhc3MsCisgICAgICAgICAgICBDb25zdW1lcy5jbGFzcyk7CisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPj4gUEFSQU1FVEVSX0FOTk9UQVRJT05TID0gZ2V0U2V0KAorICAgICAgICAgICAgQ29udGV4dC5jbGFzcywKKyAgICAgICAgICAgIEVuY29kZWQuY2xhc3MsCisgICAgICAgICAgICBEZWZhdWx0VmFsdWUuY2xhc3MsCisgICAgICAgICAgICBNYXRyaXhQYXJhbS5jbGFzcywKKyAgICAgICAgICAgIFF1ZXJ5UGFyYW0uY2xhc3MsCisgICAgICAgICAgICBDb29raWVQYXJhbS5jbGFzcywKKyAgICAgICAgICAgIEhlYWRlclBhcmFtLmNsYXNzLAorICAgICAgICAgICAgUGF0aFBhcmFtLmNsYXNzLAorICAgICAgICAgICAgRm9ybVBhcmFtLmNsYXNzKTsKKworICAgIEBTYWZlVmFyYXJncworICAgIHByaXZhdGUgc3RhdGljIFNldDxDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4+IGdldFNldChmaW5hbCBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4uLi4gY3MpIHsKKyAgICAgICAgZmluYWwgU2V0PENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPj4gcyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgcy5hZGRBbGwoQXJyYXlzLmFzTGlzdChjcykpOworICAgICAgICByZXR1cm4gczsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIE1ldGhvZCBtOworICAgIHByaXZhdGUgZmluYWwgTWV0aG9kIGFtOworICAgIHByaXZhdGUgZmluYWwgQW5ub3RhdGlvbltdIG1ldGhvZEFubm90YXRpb25zOworICAgIHByaXZhdGUgZmluYWwgQW5ub3RhdGlvbltdW10gcGFyYW1ldGVyQW5ub3RhdGlvbnM7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW5ub3RhdGVkIG1ldGhvZCBpbnN0YW5jZSBmcm9tIHRoZSB7QGxpbmsgTWV0aG9kIEphdmEgbWV0aG9kfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXRob2QgSmF2YSBtZXRob2QuCisgICAgICovCisgICAgcHVibGljIEFubm90YXRlZE1ldGhvZChmaW5hbCBNZXRob2QgbWV0aG9kKSB7CisgICAgICAgIHRoaXMubSA9IG1ldGhvZDsKKyAgICAgICAgdGhpcy5hbSA9IGZpbmRBbm5vdGF0ZWRNZXRob2QobWV0aG9kKTsKKworICAgICAgICBpZiAobWV0aG9kLmVxdWFscyhhbSkpIHsKKyAgICAgICAgICAgIG1ldGhvZEFubm90YXRpb25zID0gbWV0aG9kLmdldEFubm90YXRpb25zKCk7CisgICAgICAgICAgICBwYXJhbWV0ZXJBbm5vdGF0aW9ucyA9IG1ldGhvZC5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWV0aG9kQW5ub3RhdGlvbnMgPSBtZXJnZU1ldGhvZEFubm90YXRpb25zKG1ldGhvZCwgYW0pOworICAgICAgICAgICAgcGFyYW1ldGVyQW5ub3RhdGlvbnMgPSBtZXJnZVBhcmFtZXRlckFubm90YXRpb25zKG1ldGhvZCwgYW0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB1bmRlcmx5aW5nIEphdmEgbWV0aG9kLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgdW5kZXJseWluZyBKYXZhIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0aG9kIGdldE1ldGhvZCgpIHsKKyAgICAgICAgcmV0dXJuIGFtOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdW5kZXJseWluZyBkZWNsYXJlZCBKYXZhIG1ldGhvZC4gVGhpcyBtZXRob2Qgb3ZlcnJpZGVzIG9yIGlzIHRoZSBzYW1lIGFzIHRoZSBvbmUgcmV0cmlldmVkIGJ5IHtAY29kZSBnZXRNZXRob2R9LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgdW5kZXJseWluZyBkZWNsYXJlZCBKYXZhIG1ldGhvZC4KKyAgICAgKi8KKyAgICBNZXRob2QgZ2V0RGVjbGFyZWRNZXRob2QoKSB7CisgICAgICAgIHJldHVybiBtOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBtZXRob2QgcGFyYW1ldGVyIGFubm90YXRpb25zLgorICAgICAqCisgICAgICogQHJldHVybiBtZXRob2QgcGFyYW1ldGVyIGFubm90YXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBBbm5vdGF0aW9uW11bXSBnZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIHBhcmFtZXRlckFubm90YXRpb25zLmNsb25lKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IG1ldGhvZCBwYXJhbWV0ZXIgdHlwZXMuCisgICAgICoKKyAgICAgKiBTZWUgYWxzbyB7QGxpbmsgTWV0aG9kI2dldFBhcmFtZXRlclR5cGVzKCl9LgorICAgICAqCisgICAgICogQHJldHVybiBtZXRob2QgcGFyYW1ldGVyIHR5cGVzLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzczw/PltdIGdldFBhcmFtZXRlclR5cGVzKCkgeworICAgICAgICByZXR1cm4gYW0uZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgbWV0aG9kIHR5cGUgcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIFNlZSBhbHNvIHtAbGluayBNZXRob2QjZ2V0VHlwZVBhcmFtZXRlcnMoKX0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIG1ldGhvZCB0eXBlIHBhcmFtZXRlcnMuCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoIlVudXNlZERlY2xhcmF0aW9uIikKKyAgICBwdWJsaWMgVHlwZVZhcmlhYmxlPE1ldGhvZD5bXSBnZXRUeXBlUGFyYW1ldGVycygpIHsKKyAgICAgICAgcmV0dXJuIGFtLmdldFR5cGVQYXJhbWV0ZXJzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGdlbmVyaWMgbWV0aG9kIHBhcmFtZXRlciB0eXBlcy4KKyAgICAgKgorICAgICAqIFNlZSBhbHNvIHtAbGluayBNZXRob2QjZ2V0R2VuZXJpY1BhcmFtZXRlclR5cGVzKCl9LgorICAgICAqCisgICAgICogQHJldHVybiBnZW5lcmljIG1ldGhvZCBwYXJhbWV0ZXIgdHlwZXMuCisgICAgICovCisgICAgcHVibGljIFR5cGVbXSBnZXRHZW5lcmljUGFyYW1ldGVyVHlwZXMoKSB7CisgICAgICAgIHJldHVybiBhbS5nZXRHZW5lcmljUGFyYW1ldGVyVHlwZXMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYWxsIGluc3RhbmNlcyBvZiB0aGUgc3BlY2lmaWVkIG1ldGEtYW5ub3RhdGlvbiB0eXBlIGZvdW5kIG9uIHRoZSBtZXRob2QKKyAgICAgKiBhbm5vdGF0aW9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSA8VD4gICAgICAgIG1ldGEtYW5ub3RhdGlvbiB0eXBlLgorICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIG1ldGEtYW5ub3RhdGlvbiBjbGFzcyB0byBiZSBzZWFyY2hlZCBmb3IuCisgICAgICogQHJldHVybiBtZXRhLWFubm90YXRpb24gaW5zdGFuY2VzIG9mIGEgZ2l2ZW4gdHlwZSBhbm5vdGF0aW5nIHRoZSBtZXRob2QKKyAgICAgKiAgICAgICAgIGFubm90YXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyA8VCBleHRlbmRzIEFubm90YXRpb24+IExpc3Q8VD4gZ2V0TWV0YU1ldGhvZEFubm90YXRpb25zKAorICAgICAgICAgICAgZmluYWwgQ2xhc3M8VD4gYW5ub3RhdGlvbikgeworICAgICAgICBmaW5hbCBMaXN0PFQ+IG1hID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZvciAoZmluYWwgQW5ub3RhdGlvbiBhIDogbWV0aG9kQW5ub3RhdGlvbnMpIHsKKyAgICAgICAgICAgIGZpbmFsIFQgbWV0YUFubm90YXRpb24gPSBhLmFubm90YXRpb25UeXBlKCkuZ2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uKTsKKyAgICAgICAgICAgIGlmIChtZXRhQW5ub3RhdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbWEuYWRkKG1ldGFBbm5vdGF0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtYTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gbS50b1N0cmluZygpOworICAgIH0KKworICAgIC8vIEFubm90YXRlZEVsZW1lbnQKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Fubm90YXRpb25QcmVzZW50KGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uVHlwZSkgeworICAgICAgICBmb3IgKGZpbmFsIEFubm90YXRpb24gbWEgOiBtZXRob2RBbm5vdGF0aW9ucykgeworICAgICAgICAgICAgaWYgKG1hLmFubm90YXRpb25UeXBlKCkgPT0gYW5ub3RhdGlvblR5cGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxUIGV4dGVuZHMgQW5ub3RhdGlvbj4gVCBnZXRBbm5vdGF0aW9uKGZpbmFsIENsYXNzPFQ+IGFubm90YXRpb25UeXBlKSB7CisgICAgICAgIGZvciAoZmluYWwgQW5ub3RhdGlvbiBtYSA6IG1ldGhvZEFubm90YXRpb25zKSB7CisgICAgICAgICAgICBpZiAobWEuYW5ub3RhdGlvblR5cGUoKSA9PSBhbm5vdGF0aW9uVHlwZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBhbm5vdGF0aW9uVHlwZS5jYXN0KG1hKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYW0uZ2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uVHlwZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFubm90YXRpb25bXSBnZXRBbm5vdGF0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIG1ldGhvZEFubm90YXRpb25zLmNsb25lKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFubm90YXRpb25bXSBnZXREZWNsYXJlZEFubm90YXRpb25zKCkgeworICAgICAgICByZXR1cm4gZ2V0QW5ub3RhdGlvbnMoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBBbm5vdGF0aW9uW10gbWVyZ2VNZXRob2RBbm5vdGF0aW9ucyhmaW5hbCBNZXRob2QgbSwgZmluYWwgTWV0aG9kIGFtKSB7CisgICAgICAgIGZpbmFsIExpc3Q8QW5ub3RhdGlvbj4gYWwgPSBhc0xpc3QobS5nZXRBbm5vdGF0aW9ucygpKTsKKyAgICAgICAgZm9yIChmaW5hbCBBbm5vdGF0aW9uIGEgOiBhbS5nZXRBbm5vdGF0aW9ucygpKSB7CisgICAgICAgICAgICBpZiAoIW0uaXNBbm5vdGF0aW9uUHJlc2VudChhLmdldENsYXNzKCkpKSB7CisgICAgICAgICAgICAgICAgYWwuYWRkKGEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGFsLnRvQXJyYXkobmV3IEFubm90YXRpb25bYWwuc2l6ZSgpXSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQW5ub3RhdGlvbltdW10gbWVyZ2VQYXJhbWV0ZXJBbm5vdGF0aW9ucyhmaW5hbCBNZXRob2QgbSwgZmluYWwgTWV0aG9kIGFtKSB7CisgICAgICAgIGZpbmFsIEFubm90YXRpb25bXVtdIG1ldGhvZFBhcmFtQW5ub3RhdGlvbnMgPSBtLmdldFBhcmFtZXRlckFubm90YXRpb25zKCk7CisgICAgICAgIGZpbmFsIEFubm90YXRpb25bXVtdIGFubm90YXRlZE1ldGhvZFBhcmFtQW5ub3RhdGlvbnMgPSBhbS5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucygpOworCisgICAgICAgIGZpbmFsIExpc3Q8TGlzdDxBbm5vdGF0aW9uPj4gbWV0aG9kUGFyYW1Bbm5vdGF0aW9uc0xpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RQYXJhbUFubm90YXRpb25zLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBMaXN0PEFubm90YXRpb24+IGFsID0gYXNMaXN0KG1ldGhvZFBhcmFtQW5ub3RhdGlvbnNbaV0pOworICAgICAgICAgICAgZm9yIChmaW5hbCBBbm5vdGF0aW9uIGEgOiBhbm5vdGF0ZWRNZXRob2RQYXJhbUFubm90YXRpb25zW2ldKSB7CisgICAgICAgICAgICAgICAgaWYgKGFubm90YXRpb25Ob3RJbkxpc3QoYS5nZXRDbGFzcygpLCBhbCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYWwuYWRkKGEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1ldGhvZFBhcmFtQW5ub3RhdGlvbnNMaXN0LmFkZChhbCk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW11bXSBtZXJnZWRBbm5vdGF0aW9ucyA9IG5ldyBBbm5vdGF0aW9uW21ldGhvZFBhcmFtQW5ub3RhdGlvbnMubGVuZ3RoXVtdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZFBhcmFtQW5ub3RhdGlvbnMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8QW5ub3RhdGlvbj4gcGFyYW1Bbm5vdGF0aW9ucyA9IG1ldGhvZFBhcmFtQW5ub3RhdGlvbnNMaXN0LmdldChpKTsKKyAgICAgICAgICAgIG1lcmdlZEFubm90YXRpb25zW2ldID0gcGFyYW1Bbm5vdGF0aW9ucy50b0FycmF5KG5ldyBBbm5vdGF0aW9uW3BhcmFtQW5ub3RhdGlvbnMuc2l6ZSgpXSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbWVyZ2VkQW5ub3RhdGlvbnM7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBhbm5vdGF0aW9uTm90SW5MaXN0KGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBjYSwgZmluYWwgTGlzdDxBbm5vdGF0aW9uPiBsYSkgeworICAgICAgICBmb3IgKGZpbmFsIEFubm90YXRpb24gYSA6IGxhKSB7CisgICAgICAgICAgICBpZiAoY2EgPT0gYS5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE1ldGhvZCBmaW5kQW5ub3RhdGVkTWV0aG9kKGZpbmFsIE1ldGhvZCBtKSB7CisgICAgICAgIGZpbmFsIE1ldGhvZCBhbSA9IGZpbmRBbm5vdGF0ZWRNZXRob2QobS5nZXREZWNsYXJpbmdDbGFzcygpLCBtKTsKKyAgICAgICAgcmV0dXJuIChhbSAhPSBudWxsKSA/IGFtIDogbTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBNZXRob2QgZmluZEFubm90YXRlZE1ldGhvZChmaW5hbCBDbGFzczw/PiBjLCBNZXRob2QgbSkgeworICAgICAgICBpZiAoYyA9PSBPYmplY3QuY2xhc3MpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgbSA9IEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKFJlZmxlY3Rpb25IZWxwZXIuZmluZE1ldGhvZE9uQ2xhc3NQQShjLCBtKSk7CisgICAgICAgIGlmIChtID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGhhc0Fubm90YXRpb25zKG0pKSB7CisgICAgICAgICAgICByZXR1cm4gbTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFN1cGVyIGNsYXNzZXMgdGFrZSBwcmVjZWRlbmNlIG92ZXIgaW50ZXJmYWNlcworICAgICAgICBmaW5hbCBDbGFzczw/PiBzYyA9IGMuZ2V0U3VwZXJjbGFzcygpOworICAgICAgICBpZiAoc2MgIT0gbnVsbCAmJiBzYyAhPSBPYmplY3QuY2xhc3MpIHsKKyAgICAgICAgICAgIGZpbmFsIE1ldGhvZCBzbSA9IGZpbmRBbm5vdGF0ZWRNZXRob2Qoc2MsIG0pOworICAgICAgICAgICAgaWYgKHNtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc207CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGZpbmFsIENsYXNzPD8+IGljIDogYy5nZXRJbnRlcmZhY2VzKCkpIHsKKyAgICAgICAgICAgIGZpbmFsIE1ldGhvZCBpbSA9IGZpbmRBbm5vdGF0ZWRNZXRob2QoaWMsIG0pOworICAgICAgICAgICAgaWYgKGltICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGhhc0Fubm90YXRpb25zKGZpbmFsIE1ldGhvZCBtKSB7CisgICAgICAgIHJldHVybiBoYXNNZXRhTWV0aG9kQW5ub3RhdGlvbnMobSkKKyAgICAgICAgICAgICAgICB8fCBoYXNNZXRob2RBbm5vdGF0aW9ucyhtKQorICAgICAgICAgICAgICAgIHx8IGhhc1BhcmFtZXRlckFubm90YXRpb25zKG0pOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaGFzTWV0YU1ldGhvZEFubm90YXRpb25zKGZpbmFsIE1ldGhvZCBtKSB7CisgICAgICAgIGZvciAoZmluYWwgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGFjIDogTUVUSE9EX01FVEFfQU5OT1RBVElPTlMpIHsKKyAgICAgICAgICAgIGZvciAoZmluYWwgQW5ub3RhdGlvbiBhIDogbS5nZXRBbm5vdGF0aW9ucygpKSB7CisgICAgICAgICAgICAgICAgaWYgKGEuYW5ub3RhdGlvblR5cGUoKS5nZXRBbm5vdGF0aW9uKGFjKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGhhc01ldGhvZEFubm90YXRpb25zKGZpbmFsIE1ldGhvZCBtKSB7CisgICAgICAgIGZvciAoZmluYWwgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGFjIDogTUVUSE9EX0FOTk9UQVRJT05TKSB7CisgICAgICAgICAgICBpZiAobS5pc0Fubm90YXRpb25QcmVzZW50KGFjKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaGFzUGFyYW1ldGVyQW5ub3RhdGlvbnMoZmluYWwgTWV0aG9kIG0pIHsKKyAgICAgICAgZm9yIChmaW5hbCBBbm5vdGF0aW9uW10gYXMgOiBtLmdldFBhcmFtZXRlckFubm90YXRpb25zKCkpIHsKKyAgICAgICAgICAgIGZvciAoZmluYWwgQW5ub3RhdGlvbiBhIDogYXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoUEFSQU1FVEVSX0FOTk9UQVRJT05TLmNvbnRhaW5zKGEuYW5ub3RhdGlvblR5cGUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBTYWZlVmFyYXJncworICAgIHByaXZhdGUgc3RhdGljIDxUPiBMaXN0PFQ+IGFzTGlzdChmaW5hbCBULi4uIHRzKSB7CisgICAgICAgIGZpbmFsIExpc3Q8VD4gbCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBsLmFkZEFsbChBcnJheXMuYXNMaXN0KHRzKSk7CisgICAgICAgIHJldHVybiBsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL0NvbXBvbmVudE1vZGVsVmFsaWRhdG9yLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9Db21wb25lbnRNb2RlbFZhbGlkYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZjE5MTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9Db21wb25lbnRNb2RlbFZhbGlkYXRvci5qYXZhCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuU2V2ZXJpdHk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuRXJyb3JzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuTWVzc2FnZUJvZHlXb3JrZXJzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5pbnRlcm5hbC5Nb2RlbEVycm9yczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLmludGVybmFsLlZhbHVlUGFyYW1Qcm92aWRlcjsKKworLyoqCisgKiBBIHJlc291cmNlIG1vZGVsIHZhbGlkYXRvciB0aGF0IGNoZWNrcyB0aGUgZ2l2ZW4gcmVzb3VyY2UgbW9kZWwuCisgKgorICogVGhpcyBiYXNlIHJlc291cmNlIG1vZGVsIHZhbGlkYXRvciBjbGFzcyBpbXBsZW1lbnRzIHRoZSB2aXNpdG9yIHBhdHRlcm4gdG8KKyAqIHRyYXZlcnNlIHRocm91Z2ggYWxsIHRoZSB7QGxpbmsgUmVzb3VyY2VNb2RlbENvbXBvbmVudCByZXNvdXJjZSBtb2RlbCBjb21wb25lbnRzfQorICogdG8gY2hlY2sgdmFsaWRpdHkgb2YgYSByZXNvdXJjZSBtb2RlbC4KKyAqIDxwIC8+CisgKiBUaGlzIHZhbGlkYXRvciBtYWludGFpbnMgYSBsaXN0IG9mIGFsbCB0aGUge0BsaW5rIFJlc291cmNlTW9kZWxJc3N1ZSBpc3N1ZXN9CisgKiBmb3VuZCBpbiB0aGUgbW9kZWwuIFRoYXQgd2F5IGFsbCB0aGUgcmVzb3VyY2UgbW9kZWwgY29tcG9uZW50cyBjYW4gYmUgdmFsaWRhdGVkCisgKiBpbiBhIHNpbmdsZSBjYWxsIHRvIHRoZSB7QGxpbmsgI3ZhbGlkYXRlKFJlc291cmNlTW9kZWxDb21wb25lbnQpIHZhbGlkYXRlKC4uLil9CisgKiBtZXRob2QgYW5kIGNvbGxlY3QgYWxsIHRoZSB2YWxpZGF0aW9uIGlzc3VlcyBmcm9tIHRoZSBtb2RlbC4KKyAqIDxwIC8+CisgKiBUbyBjaGVjayBhIHNpbmdsZSByZXNvdXJjZSBjbGFzcywgdGhlIHRoZSB7QGxpbmsgUmVzb3VyY2V9CisgKiB7QGNvZGUgYnVpbGRlciguLi4pfSBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYSByZXNvdXJjZSBtb2RlbC4KKyAqCisgKiB7QGxpbmsgQ29tcG9uZW50TW9kZWxWYWxpZGF0b3IjdmFsaWRhdGUoUmVzb3VyY2VNb2RlbENvbXBvbmVudCl9CisgKiBtZXRob2QgdGhlbiBwb3B1bGF0ZXMgdGhlIGlzc3VlIGxpc3QsIHdoaWNoIGNvdWxkIGJlIHRoZW4gb2J0YWluZWQgYnkgdGhlCisgKiB7QGxpbmsgQ29tcG9uZW50TW9kZWxWYWxpZGF0b3IjZ2V0SXNzdWVMaXN0KCl9LiBVbmxlc3MgdGhlIGxpc3QgaXMgZXhwbGljaXRseSBjbGVhcmVkLAorICogYSBzdWJzZXF1ZW50IGNhbGxzIHRvIHRoZSB2YWxpZGF0ZSBtZXRob2Qgd2lsbCBhZGQgbmV3IGl0ZW1zIHRvIHRoZSBsaXN0LAorICogc28gdGhhdCBpdCBjYW4gYmUgdXNlZCB0byBidWlsZCB0aGUgaXNzdWUgbGlzdCBmb3IgbW9yZSB0aGFuIG9uZSByZXNvdXJjZS4gVG8gY2xlYXIgdGhlCisgKiBsaXN0LCB0aGUge0BsaW5rIENvbXBvbmVudE1vZGVsVmFsaWRhdG9yI2NsZWFuSXNzdWVMaXN0KCl9IG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkLgorICogPHAgLz4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIENvbXBvbmVudE1vZGVsVmFsaWRhdG9yIHsKKworICAgIHByaXZhdGUgZmluYWwgTGlzdDxSZXNvdXJjZU1vZGVsSXNzdWU+IGlzc3VlTGlzdCA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKworICAgIHB1YmxpYyBDb21wb25lbnRNb2RlbFZhbGlkYXRvcihDb2xsZWN0aW9uPFZhbHVlUGFyYW1Qcm92aWRlcj4gdmFsdWVQYXJhbVByb3ZpZGVycywgTWVzc2FnZUJvZHlXb3JrZXJzIG1zZ0JvZHlXb3JrZXJzKSB7CisgICAgICAgIHZhbGlkYXRvcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgdmFsaWRhdG9ycy5hZGQobmV3IFJlc291cmNlVmFsaWRhdG9yKCkpOworICAgICAgICB2YWxpZGF0b3JzLmFkZChuZXcgUnVudGltZVJlc291cmNlTW9kZWxWYWxpZGF0b3IobXNnQm9keVdvcmtlcnMpKTsKKyAgICAgICAgdmFsaWRhdG9ycy5hZGQobmV3IFJlc291cmNlTWV0aG9kVmFsaWRhdG9yKHZhbHVlUGFyYW1Qcm92aWRlcnMpKTsKKyAgICAgICAgdmFsaWRhdG9ycy5hZGQobmV3IEludm9jYWJsZVZhbGlkYXRvcigpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8UmVzb3VyY2VNb2RlbFZpc2l0b3I+IHZhbGlkYXRvcnM7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBpc3N1ZXMgZm91bmQgYWZ0ZXIKKyAgICAgKiB7QGxpbmsgI3ZhbGlkYXRlKG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1vZGVsQ29tcG9uZW50KX0KKyAgICAgKiBtZXRob2QgaGFzIGJlZW4gaW52b2tlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBub24tbnVsbCBsaXN0IG9mIGlzc3Vlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxSZXNvdXJjZU1vZGVsSXNzdWU+IGdldElzc3VlTGlzdCgpIHsKKyAgICAgICAgcmV0dXJuIGlzc3VlTGlzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gc2VlIGlmIHRoZXJlIHdlcmUgZmF0YWwgaXNzdWVzIGZvdW5kLgorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlcmUgYXJlIGFueSBmYXRhbCBpc3N1ZXMgcHJlc2VudCBpbiB0aGUgY3VycmVudAorICAgICAqICAgICAgICAgaXNzdWUgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBmYXRhbElzc3Vlc0ZvdW5kKCkgeworICAgICAgICBmb3IgKFJlc291cmNlTW9kZWxJc3N1ZSBpc3N1ZSA6IGdldElzc3VlTGlzdCgpKSB7CisgICAgICAgICAgICBpZiAoaXNzdWUuZ2V0U2V2ZXJpdHkoKSA9PSBTZXZlcml0eS5GQVRBTCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGFsbCBpc3N1ZXMgZnJvbSB0aGUgY3VycmVudCBpc3N1ZSBsaXN0LiBUaGUgbWV0aG9kIGNvdWxkIGJlIHVzZWQKKyAgICAgKiB0byByZS11c2UgdGhlIHNhbWUge0BsaW5rIENvbXBvbmVudE1vZGVsVmFsaWRhdG9yfSBmb3IgYW5vdGhlciByZXNvdXJjZSBtb2RlbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhbklzc3VlTGlzdCgpIHsKKyAgICAgICAgaXNzdWVMaXN0LmNsZWFyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHZhbGlkYXRlIG1ldGhvZCB2YWxpZGF0ZXMgYSBjb21wb25lbnQgYW5kIGFkZHMgcG9zc2libGUKKyAgICAgKiBpc3N1ZXMgZm91bmQgdG8gaXQncyBsaXN0LiBUaGUgbGlzdCBvZiBpc3N1ZXMgY291bGQgYmUgdGhlbiByZXRyaWV2ZWQKKyAgICAgKiB2aWEgZ2V0SXNzdWVMaXN0IG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb21wb25lbnQgcmVzb3VyY2UgbW9kZWwgY29tcG9uZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHZhbGlkYXRlKGZpbmFsIFJlc291cmNlTW9kZWxDb21wb25lbnQgY29tcG9uZW50KSB7CisgICAgICAgIEVycm9ycy5wcm9jZXNzKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIEVycm9ycy5tYXJrKCk7CisKKyAgICAgICAgICAgICAgICB2YWxpZGF0ZVdpdGhFcnJvcnMoY29tcG9uZW50KTsKKyAgICAgICAgICAgICAgICBpc3N1ZUxpc3QuYWRkQWxsKE1vZGVsRXJyb3JzLmdldEVycm9yc0FzUmVzb3VyY2VNb2RlbElzc3Vlcyh0cnVlKSk7CisKKyAgICAgICAgICAgICAgICBFcnJvcnMudW5tYXJrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2YWxpZGF0ZVdpdGhFcnJvcnMoZmluYWwgUmVzb3VyY2VNb2RlbENvbXBvbmVudCBjb21wb25lbnQpIHsKKyAgICAgICAgZm9yIChSZXNvdXJjZU1vZGVsVmlzaXRvciB2YWxpZGF0b3IgOiB2YWxpZGF0b3JzKSB7CisgICAgICAgICAgICBjb21wb25lbnQuYWNjZXB0KHZhbGlkYXRvcik7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBMaXN0PD8gZXh0ZW5kcyBSZXNvdXJjZU1vZGVsQ29tcG9uZW50PiBjb21wb25lbnRMaXN0ID0gY29tcG9uZW50LmdldENvbXBvbmVudHMoKTsKKyAgICAgICAgaWYgKG51bGwgIT0gY29tcG9uZW50TGlzdCkgeworICAgICAgICAgICAgZm9yIChSZXNvdXJjZU1vZGVsQ29tcG9uZW50IHN1YkNvbXBvbmVudCA6IGNvbXBvbmVudExpc3QpIHsKKyAgICAgICAgICAgICAgICB2YWxpZGF0ZVdpdGhFcnJvcnMoc3ViQ29tcG9uZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL0NvbnN1bWluZy5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvQ29uc3VtaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNiYzVjMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL0NvbnN1bWluZy5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworLyoqCisgKiBNb2RlbCBjb21wb25lbnQgdGhhdCBpcyBhYmxlIHRvIGNvbnN1bWUgbWVkaWEgdHlwZXMuCisgKgorICogQSBjb21wb25lbnQgaW1wbGVtZW50aW5nIHRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQKKyAqIHRoZSBzdXBwb3J0ZWQgY29uc3VtZWQge0BsaW5rIE1lZGlhVHlwZSBtZWRpYSB0eXBlc30uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKgorICogQHNlZSBqYXZheC53cy5ycy5Db25zdW1lcworICogQHNlZSBQcm9kdWNpbmcKKyAqLworcHVibGljIGludGVyZmFjZSBDb25zdW1pbmcgeworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjb25zdW1lZCBtZWRpYSB0eXBlcyBzdXBwb3J0ZWQgYnkgdGhlIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gaW1tdXRhYmxlIGNvbGxlY3Rpb24gb2Ygc3VwcG9ydGVkIGNvbnN1bWVkIG1lZGlhIHR5cGVzLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PE1lZGlhVHlwZT4gZ2V0Q29uc3VtZWRUeXBlcygpOworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvRXh0ZW5kZWRSZXNvdXJjZS5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvRXh0ZW5kZWRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZDYzOTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9FeHRlbmRlZFJlc291cmNlLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWw7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCisvKioKKyAqIFRoaXMgYW5ub3RhdGlvbiBjYW4gbWFyayByZXNvdXJjZSBjbGFzc2VzIG9yIHJlc291cmNlIG1ldGhvZHMgdGhhdCBzaG91bGQgYmUgY29uc2lkZXJlZCBhcyBleHRlbmRlZCByZXNvdXJjZXMuCisgKiA8cD4KKyAqIEV4dGVuZGVkIHJlc291cmNlIG1vZGVsIGNvbXBvbmVudHMgYXJlIGhlbHBlciBjb21wb25lbnRzIHRoYXQgYXJlIG5vdCBjb25zaWRlcmVkIGFzIGEgY29yZSBvZiBhCisgKiBSRVNUZnVsIEFQSS4gVGhlc2UgY2FuIGJlIGZvciBleGFtcGxlIHtAY29kZSBPUFRJT05TfSB7QGxpbmsgUmVzb3VyY2VNZXRob2QgcmVzb3VyY2UgbWV0aG9kc30KKyAqIGFkZGVkIGJ5IHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuTW9kZWxQcm9jZXNzb3IgbW9kZWwgcHJvY2Vzc29yc30KKyAqIG9yIHtAY29kZSBhcHBsaWNhdGlvbi53YWRsfSByZXNvdXJjZSBwcm9kdWNpbmcgdGhlIFdBREwuIEJvdGggcmVzb3VyY2UgYXJlIHJhdGhlciBzdXBwb3J0aXZlCisgKiB0aGFuIHRoZSBjb3JlIG9mIFJFU1RmdWwgQVBJLgorICogPC9wPgorICogPHA+CisgKiBNYXJraW5nIHJlc291cmNlcyBhbmQgcmVzb3VyY2UgbWV0aG9kcyBhcyBleHRlbmRlZCBjYW4gaW5mbHVlbmNlIHRoZSB3YXkgaG93IHRoZXNlIGNvbXBvbmVudHMKKyAqIGFyZSBwcm9jZXNzZWQgaW4gSmVyc2V5IGZlYXR1cmVzIGxpa2UgV0FETCBnZW5lcmF0aW9uIG9yIG1vbml0b3JpbmcuIEV4dGVuZGVkIHJlc291cmNlcyBhcmUKKyAqIGZvciBleGFtcGxlIHNraXBwZWQgd2hlbiBnZW5lcmF0aW9uIFdBREwgaW4gc2ltcGxlIGRlZmF1bHQgZm9ybWF0LgorICogPC9wPgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworQFRhcmdldCh7RWxlbWVudFR5cGUuVFlQRSwgRWxlbWVudFR5cGUuTUVUSE9EfSkKK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitARG9jdW1lbnRlZAorcHVibGljIEBpbnRlcmZhY2UgRXh0ZW5kZWRSZXNvdXJjZSB7Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9IYW5kbGVyQ29uc3RydWN0b3IuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL0hhbmRsZXJDb25zdHJ1Y3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NGFmYTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9IYW5kbGVyQ29uc3RydWN0b3IuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEFic3RyYWN0aW9uIGZvciBhIHJlc291cmNlIGhhbmRsZXIgY2xhc3MgY29uc3RydWN0b3IuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBIYW5kbGVyQ29uc3RydWN0b3IgaW1wbGVtZW50cyBQYXJhbWV0ZXJpemVkLCBSZXNvdXJjZU1vZGVsQ29tcG9uZW50IHsKKworICAgIHByaXZhdGUgZmluYWwgQ29uc3RydWN0b3I8Pz4gY29uc3RydWN0b3I7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFBhcmFtZXRlcj4gcGFyYW1ldGVyczsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgUmVzb3VyY2VDb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25zdHJ1Y3RvciB1bmRlcmx5aW5nIEphdmEgY29uc3RydWN0b3IuCisgICAgICogQHBhcmFtIHBhcmFtZXRlcnMgY29uc3RydWN0b3IgcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICBIYW5kbGVyQ29uc3RydWN0b3IoQ29uc3RydWN0b3I8Pz4gY29uc3RydWN0b3IsIExpc3Q8UGFyYW1ldGVyPiBwYXJhbWV0ZXJzKSB7CisgICAgICAgIHRoaXMuY29uc3RydWN0b3IgPSBjb25zdHJ1Y3RvcjsKKyAgICAgICAgdGhpcy5wYXJhbWV0ZXJzID0gcGFyYW1ldGVyczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHVuZGVybHlpbmcgamF2YSBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdW5kZXJseWluZyBqYXZhIGNvbnN0cnVjdG9yLgorICAgICAqLworICAgIHB1YmxpYyBDb25zdHJ1Y3Rvcjw/PiBnZXRDb25zdHJ1Y3RvcigpIHsKKyAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFBhcmFtZXRlcj4gZ2V0UGFyYW1ldGVycygpIHsKKyAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gcmVxdWlyZXNFbnRpdHkoKSB7CisgICAgICAgIGZvciAoUGFyYW1ldGVyIHAgOiBnZXRQYXJhbWV0ZXJzKCkpIHsKKyAgICAgICAgICAgIGlmIChQYXJhbWV0ZXIuU291cmNlLkVOVElUWSA9PSBwLmdldFNvdXJjZSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFjY2VwdChSZXNvdXJjZU1vZGVsVmlzaXRvciB2aXNpdG9yKSB7CisgICAgICAgIHZpc2l0b3IudmlzaXRSZXNvdXJjZUhhbmRsZXJDb25zdHJ1Y3Rvcih0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxSZXNvdXJjZU1vZGVsQ29tcG9uZW50PiBnZXRDb21wb25lbnRzKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9JbmZsZWN0aW5nLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9JbmZsZWN0aW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYwNTAzYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL0luZmxlY3RpbmcuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVxdWVzdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuSW5mbGVjdG9yOworCisvKioKKyAqIEluZmxlY3RvciBwcm92aWRlciByZXNvdXJjZSBtb2RlbCBjb21wb25lbnQuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEluZmxlY3Rpbmc8VD4geworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBpbmZsZWN0b3IuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGluZmxlY3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgSW5mbGVjdG9yPFJlcXVlc3QsIFQ+IGdldEluZmxlY3RvcigpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvSW50cm9zcGVjdGlvbk1vZGVsbGVyLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9JbnRyb3NwZWN0aW9uTW9kZWxsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzlhYjllCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvSW50cm9zcGVjdGlvbk1vZGVsbGVyLmphdmEKQEAgLTAsMCArMSwzODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkVuY29kZWQ7CitpbXBvcnQgamF2YXgud3MucnMuSHR0cE1ldGhvZDsKK2ltcG9ydCBqYXZheC53cy5ycy5OYW1lQmluZGluZzsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Bc3luY1Jlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5TdXNwZW5kZWQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuc3NlLlNzZUV2ZW50U2luazsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkVycm9yczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlByb2R1Y2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUmVmbGVjdGlvbkhlbHBlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlRva2VuaXplcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuTWFuYWdlZEFzeW5jOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuaW50ZXJuYWwuTW9kZWxIZWxwZXI7CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyBmb3IgY29uc3RydWN0aW5nIHJlc291cmNlIG1vZGVsIGZyb20gSkFYLVJTIGFubm90YXRlZCBQT0pPLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK2ZpbmFsIGNsYXNzIEludHJvc3BlY3Rpb25Nb2RlbGxlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihJbnRyb3NwZWN0aW9uTW9kZWxsZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIC8vIGludHJvc3BlY3RlZCBhbm5vdGF0ZWQgSkFYLVJTIHJlc291cmNlIGNsYXNzCisgICAgcHJpdmF0ZSBmaW5hbCBDbGFzczw/PiBoYW5kbGVyQ2xhc3M7CisgICAgLy8gdmFsaWRhdGlvbiBmbGFnCisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGRpc2FibGVWYWxpZGF0aW9uOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGludHJvc3BlY3Rpb24gbW9kZWxsZXIgZm9yIGEgZ2l2ZW4gSkFYLVJTIHJlc291cmNlIGNsYXNzLgorICAgICAqCisgICAgICogQHBhcmFtIGhhbmRsZXJDbGFzcyAgICAgIEpBWC1SUyByZXNvdXJjZSAoaGFuZGxlcikgY2xhc3MuCisgICAgICogQHBhcmFtIGRpc2FibGVWYWxpZGF0aW9uIGlmIHNldCB0byB7QGNvZGUgdHJ1ZX0sIHRoZW4gYW55IG1vZGVsIHZhbGlkYXRpb24gY2hlY2tzIHdpbGwgYmUgZGlzYWJsZWQuCisgICAgICovCisgICAgcHVibGljIEludHJvc3BlY3Rpb25Nb2RlbGxlcihDbGFzczw/PiBoYW5kbGVyQ2xhc3MsIGJvb2xlYW4gZGlzYWJsZVZhbGlkYXRpb24pIHsKKyAgICAgICAgdGhpcy5oYW5kbGVyQ2xhc3MgPSBoYW5kbGVyQ2xhc3M7CisgICAgICAgIHRoaXMuZGlzYWJsZVZhbGlkYXRpb24gPSBkaXNhYmxlVmFsaWRhdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgcmVzb3VyY2UgbW9kZWwgYnVpbGRlciBmb3IgdGhlIGludHJvc3BlY3RlZCBjbGFzcy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbW9kZWwgcmV0dXJuZWQgaXMgZmlsbGVkIHdpdGggdGhlIGludHJvc3BlY3RlZCBkYXRhLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbmV3IHJlc291cmNlIG1vZGVsIGJ1aWxkZXIgZm9yIHRoZSBpbnRyb3NwZWN0ZWQgY2xhc3MuCisgICAgICovCisgICAgcHVibGljIFJlc291cmNlLkJ1aWxkZXIgY3JlYXRlUmVzb3VyY2VCdWlsZGVyKCkgeworICAgICAgICByZXR1cm4gRXJyb3JzLnByb2Nlc3NXaXRoRXhjZXB0aW9uKG5ldyBQcm9kdWNlcjxSZXNvdXJjZS5CdWlsZGVyPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFJlc291cmNlLkJ1aWxkZXIgY2FsbCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZG9DcmVhdGVSZXNvdXJjZUJ1aWxkZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZXNvdXJjZS5CdWlsZGVyIGRvQ3JlYXRlUmVzb3VyY2VCdWlsZGVyKCkgeworICAgICAgICBpZiAoIWRpc2FibGVWYWxpZGF0aW9uKSB7CisgICAgICAgICAgICBjaGVja0Zvck5vblB1YmxpY01ldGhvZElzc3VlcygpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgQ2xhc3M8Pz4gYW5ub3RhdGVkUmVzb3VyY2VDbGFzcyA9IE1vZGVsSGVscGVyLmdldEFubm90YXRlZFJlc291cmNlQ2xhc3MoaGFuZGxlckNsYXNzKTsKKyAgICAgICAgZmluYWwgUGF0aCByUGF0aEFubm90YXRpb24gPSBhbm5vdGF0ZWRSZXNvdXJjZUNsYXNzLmdldEFubm90YXRpb24oUGF0aC5jbGFzcyk7CisKKyAgICAgICAgZmluYWwgYm9vbGVhbiBrZWVwRW5jb2RlZFBhcmFtcyA9CisgICAgICAgICAgICAgICAgKG51bGwgIT0gYW5ub3RhdGVkUmVzb3VyY2VDbGFzcy5nZXRBbm5vdGF0aW9uKEVuY29kZWQuY2xhc3MpKTsKKworICAgICAgICBmaW5hbCBMaXN0PE1lZGlhVHlwZT4gZGVmYXVsdENvbnN1bWVkVHlwZXMgPQorICAgICAgICAgICAgICAgIGV4dHJhY3RNZWRpYVR5cGVzKGFubm90YXRlZFJlc291cmNlQ2xhc3MuZ2V0QW5ub3RhdGlvbihDb25zdW1lcy5jbGFzcykpOworICAgICAgICBmaW5hbCBMaXN0PE1lZGlhVHlwZT4gZGVmYXVsdFByb2R1Y2VkVHlwZXMgPQorICAgICAgICAgICAgICAgIGV4dHJhY3RNZWRpYVR5cGVzKGFubm90YXRlZFJlc291cmNlQ2xhc3MuZ2V0QW5ub3RhdGlvbihQcm9kdWNlcy5jbGFzcykpOworICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPj4gZGVmYXVsdE5hbWVCaW5kaW5ncyA9CisgICAgICAgICAgICAgICAgUmVmbGVjdGlvbkhlbHBlci5nZXRBbm5vdGF0aW9uVHlwZXMoYW5ub3RhdGVkUmVzb3VyY2VDbGFzcywgTmFtZUJpbmRpbmcuY2xhc3MpOworCisgICAgICAgIGZpbmFsIE1ldGhvZExpc3QgbWV0aG9kTGlzdCA9IG5ldyBNZXRob2RMaXN0KGhhbmRsZXJDbGFzcyk7CisKKyAgICAgICAgZmluYWwgTGlzdDxQYXJhbWV0ZXI+IHJlc291cmNlQ2xhc3NQYXJhbWV0ZXJzID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgICAgICBjaGVja1Jlc291cmNlQ2xhc3NTZXR0ZXJzKG1ldGhvZExpc3QsIGtlZXBFbmNvZGVkUGFyYW1zLCByZXNvdXJjZUNsYXNzUGFyYW1ldGVycyk7CisgICAgICAgIGNoZWNrUmVzb3VyY2VDbGFzc0ZpZWxkcyhrZWVwRW5jb2RlZFBhcmFtcywgSW52b2NhYmxlVmFsaWRhdG9yLmlzU2luZ2xldG9uKGhhbmRsZXJDbGFzcyksIHJlc291cmNlQ2xhc3NQYXJhbWV0ZXJzKTsKKworICAgICAgICBSZXNvdXJjZS5CdWlsZGVyIHJlc291cmNlQnVpbGRlcjsKKworICAgICAgICBpZiAobnVsbCAhPSByUGF0aEFubm90YXRpb24pIHsKKyAgICAgICAgICAgIHJlc291cmNlQnVpbGRlciA9IFJlc291cmNlLmJ1aWxkZXIoclBhdGhBbm5vdGF0aW9uLnZhbHVlKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzb3VyY2VCdWlsZGVyID0gUmVzb3VyY2UuYnVpbGRlcigpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbGVhbiBleHRlbmRlZCA9IGZhbHNlOworICAgICAgICBpZiAoaGFuZGxlckNsYXNzLmlzQW5ub3RhdGlvblByZXNlbnQoRXh0ZW5kZWRSZXNvdXJjZS5jbGFzcykpIHsKKyAgICAgICAgICAgIHJlc291cmNlQnVpbGRlci5leHRlbmRlZCh0cnVlKTsKKyAgICAgICAgICAgIGV4dGVuZGVkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHJlc291cmNlQnVpbGRlci5uYW1lKGhhbmRsZXJDbGFzcy5nZXROYW1lKCkpOworCisgICAgICAgIGFkZFJlc291cmNlTWV0aG9kcyhyZXNvdXJjZUJ1aWxkZXIsIG1ldGhvZExpc3QsIHJlc291cmNlQ2xhc3NQYXJhbWV0ZXJzLCBrZWVwRW5jb2RlZFBhcmFtcywKKyAgICAgICAgICAgICAgICBkZWZhdWx0Q29uc3VtZWRUeXBlcywgZGVmYXVsdFByb2R1Y2VkVHlwZXMsIGRlZmF1bHROYW1lQmluZGluZ3MsIGV4dGVuZGVkKTsKKyAgICAgICAgYWRkU3ViUmVzb3VyY2VNZXRob2RzKHJlc291cmNlQnVpbGRlciwgbWV0aG9kTGlzdCwgcmVzb3VyY2VDbGFzc1BhcmFtZXRlcnMsIGtlZXBFbmNvZGVkUGFyYW1zLAorICAgICAgICAgICAgICAgIGRlZmF1bHRDb25zdW1lZFR5cGVzLCBkZWZhdWx0UHJvZHVjZWRUeXBlcywgZGVmYXVsdE5hbWVCaW5kaW5ncywgZXh0ZW5kZWQpOworICAgICAgICBhZGRTdWJSZXNvdXJjZUxvY2F0b3JzKHJlc291cmNlQnVpbGRlciwgbWV0aG9kTGlzdCwgcmVzb3VyY2VDbGFzc1BhcmFtZXRlcnMsIGtlZXBFbmNvZGVkUGFyYW1zLCBleHRlbmRlZCk7CisKKyAgICAgICAgaWYgKExPR0dFUi5pc0xvZ2dhYmxlKExldmVsLkZJTkVTVCkpIHsKKyAgICAgICAgICAgIExPR0dFUi5maW5lc3QoTG9jYWxpemF0aW9uTWVzc2FnZXMuTkVXX0FSX0NSRUFURURfQllfSU5UUk9TUEVDVElPTl9NT0RFTEVSKAorICAgICAgICAgICAgICAgICAgICByZXNvdXJjZUJ1aWxkZXIudG9TdHJpbmcoKSkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc291cmNlQnVpbGRlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tGb3JOb25QdWJsaWNNZXRob2RJc3N1ZXMoKSB7CisgICAgICAgIGZpbmFsIE1ldGhvZExpc3QgYWxsRGVjbGFyZWRNZXRob2RzID0gbmV3IE1ldGhvZExpc3QoZ2V0QWxsRGVjbGFyZWRNZXRob2RzKGhhbmRsZXJDbGFzcykpOworCisgICAgICAgIC8vIG5vbi1wdWJsaWMgcmVzb3VyY2UgbWV0aG9kcworICAgICAgICBmb3IgKEFubm90YXRlZE1ldGhvZCBtIDogYWxsRGVjbGFyZWRNZXRob2RzLndpdGhNZXRhQW5ub3RhdGlvbihIdHRwTWV0aG9kLmNsYXNzKQorICAgICAgICAgICAgICAgIC53aXRob3V0QW5ub3RhdGlvbihQYXRoLmNsYXNzKS5pc05vdFB1YmxpYygpKSB7CisgICAgICAgICAgICBFcnJvcnMud2FybmluZyhoYW5kbGVyQ2xhc3MsIExvY2FsaXphdGlvbk1lc3NhZ2VzLk5PTl9QVUJfUkVTX01FVEhPRChtLmdldE1ldGhvZCgpLnRvR2VuZXJpY1N0cmluZygpKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gbm9uLXB1YmxpYyBzdWItcmVzb3VyY2UgbWV0aG9kcworICAgICAgICBmb3IgKEFubm90YXRlZE1ldGhvZCBtIDogYWxsRGVjbGFyZWRNZXRob2RzLndpdGhNZXRhQW5ub3RhdGlvbihIdHRwTWV0aG9kLmNsYXNzKQorICAgICAgICAgICAgICAgIC53aXRoQW5ub3RhdGlvbihQYXRoLmNsYXNzKS5pc05vdFB1YmxpYygpKSB7CisgICAgICAgICAgICBFcnJvcnMud2FybmluZyhoYW5kbGVyQ2xhc3MsIExvY2FsaXphdGlvbk1lc3NhZ2VzLk5PTl9QVUJfU1VCX1JFU19NRVRIT0QobS5nZXRNZXRob2QoKS50b0dlbmVyaWNTdHJpbmcoKSkpOworICAgICAgICB9CisgICAgICAgIC8vIG5vbi1wdWJsaWMgc3ViLXJlc291cmNlIGxvY2F0b3JzCisgICAgICAgIGZvciAoQW5ub3RhdGVkTWV0aG9kIG0gOiBhbGxEZWNsYXJlZE1ldGhvZHMud2l0aG91dE1ldGFBbm5vdGF0aW9uKEh0dHBNZXRob2QuY2xhc3MpCisgICAgICAgICAgICAgICAgLndpdGhBbm5vdGF0aW9uKFBhdGguY2xhc3MpLmlzTm90UHVibGljKCkpIHsKKyAgICAgICAgICAgIEVycm9ycy53YXJuaW5nKGhhbmRsZXJDbGFzcywgTG9jYWxpemF0aW9uTWVzc2FnZXMuTk9OX1BVQl9TVUJfUkVTX0xPQyhtLmdldE1ldGhvZCgpLnRvR2VuZXJpY1N0cmluZygpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tSZXNvdXJjZUNsYXNzU2V0dGVycyhmaW5hbCBNZXRob2RMaXN0IG1ldGhvZExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBlbmNvZGVkRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uPFBhcmFtZXRlcj4gaW5qZWN0YWJsZVBhcmFtZXRlcnMpIHsKKworICAgICAgICBmb3IgKEFubm90YXRlZE1ldGhvZCBtZXRob2QgOiBtZXRob2RMaXN0LndpdGhvdXRNZXRhQW5ub3RhdGlvbihIdHRwTWV0aG9kLmNsYXNzKQorICAgICAgICAgICAgICAgIC53aXRob3V0QW5ub3RhdGlvbihQYXRoLmNsYXNzKQorICAgICAgICAgICAgICAgIC5oYXNOdW1QYXJhbXMoMSkKKyAgICAgICAgICAgICAgICAuaGFzUmV0dXJuVHlwZSh2b2lkLmNsYXNzKQorICAgICAgICAgICAgICAgIC5uYW1lU3RhcnRzV2l0aCgic2V0IikpIHsKKyAgICAgICAgICAgIFBhcmFtZXRlciBwID0gUGFyYW1ldGVyLmNyZWF0ZSgKKyAgICAgICAgICAgICAgICAgICAgaGFuZGxlckNsYXNzLAorICAgICAgICAgICAgICAgICAgICBtZXRob2QuZ2V0TWV0aG9kKCkuZ2V0RGVjbGFyaW5nQ2xhc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlZEZsYWcgfHwgbWV0aG9kLmlzQW5ub3RhdGlvblByZXNlbnQoRW5jb2RlZC5jbGFzcyksCisgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpWzBdLAorICAgICAgICAgICAgICAgICAgICBtZXRob2QuZ2V0R2VuZXJpY1BhcmFtZXRlclR5cGVzKClbMF0sCisgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5nZXRBbm5vdGF0aW9ucygpKTsKKyAgICAgICAgICAgIGlmIChudWxsICE9IHApIHsKKyAgICAgICAgICAgICAgICBSZXNvdXJjZU1ldGhvZFZhbGlkYXRvci52YWxpZGF0ZVBhcmFtZXRlcihwLCBtZXRob2QuZ2V0TWV0aG9kKCksIG1ldGhvZC5nZXRNZXRob2QoKS50b0dlbmVyaWNTdHJpbmcoKSwgIjEiLAorICAgICAgICAgICAgICAgICAgICAgICAgSW52b2NhYmxlVmFsaWRhdG9yLmlzU2luZ2xldG9uKGhhbmRsZXJDbGFzcykpOworCisgICAgICAgICAgICAgICAgLy8gd2UgZG8gbm90IGluamVjdCBlbnRpdHkgcGFyYW1ldGVycyBpbnRvIGNsYXNzIGluc3RhbmNlIGZpZWxkcyBhbmQgcHJvcGVydGllcy4KKyAgICAgICAgICAgICAgICBpZiAocC5nZXRTb3VyY2UoKSAhPSBQYXJhbWV0ZXIuU291cmNlLkVOVElUWSkgeworICAgICAgICAgICAgICAgICAgICBpbmplY3RhYmxlUGFyYW1ldGVycy5hZGQocCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrUmVzb3VyY2VDbGFzc0ZpZWxkcyhmaW5hbCBib29sZWFuIGVuY29kZWRGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0luU2luZ2xldG9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbjxQYXJhbWV0ZXI+IGluamVjdGFibGVQYXJhbWV0ZXJzKSB7CisKKyAgICAgICAgZm9yIChGaWVsZCBmaWVsZCA6IEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKFJlZmxlY3Rpb25IZWxwZXIuZ2V0RGVjbGFyZWRGaWVsZHNQQShoYW5kbGVyQ2xhc3MpKSkgeworICAgICAgICAgICAgaWYgKGZpZWxkLmdldERlY2xhcmVkQW5ub3RhdGlvbnMoKS5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgUGFyYW1ldGVyIHAgPSBQYXJhbWV0ZXIuY3JlYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlckNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuZ2V0RGVjbGFyaW5nQ2xhc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZWRGbGFnIHx8IGZpZWxkLmlzQW5ub3RhdGlvblByZXNlbnQoRW5jb2RlZC5jbGFzcyksCisgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5nZXRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5nZXRHZW5lcmljVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuZ2V0QW5ub3RhdGlvbnMoKSk7CisgICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gcCkgeworICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZU1ldGhvZFZhbGlkYXRvci52YWxpZGF0ZVBhcmFtZXRlcihwLCBmaWVsZCwgZmllbGQudG9HZW5lcmljU3RyaW5nKCksIGZpZWxkLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0luU2luZ2xldG9uKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gd2UgZG8gbm90IGluamVjdCBlbnRpdHkgYW5kIHVua25vd24gcGFyYW1ldGVycyBpbnRvIGNsYXNzIGluc3RhbmNlIGZpZWxkcyBhbmQgcHJvcGVydGllcy4KKyAgICAgICAgICAgICAgICAgICAgaWYgKHAuZ2V0U291cmNlKCkgIT0gUGFyYW1ldGVyLlNvdXJjZS5FTlRJVFkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGFibGVQYXJhbWV0ZXJzLmFkZChwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgTGlzdDxNZXRob2Q+IGdldEFsbERlY2xhcmVkTWV0aG9kcyhmaW5hbCBDbGFzczw/PiBjbGF6eikgeworICAgICAgICBmaW5hbCBMaXN0PE1ldGhvZD4gcmVzdWx0ID0gbmV3IExpbmtlZExpc3Q8PigpOworCisgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uPE9iamVjdD4oKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIE9iamVjdCBydW4oKSB7CisgICAgICAgICAgICAgICAgQ2xhc3MgY3VycmVudCA9IGNsYXp6OworICAgICAgICAgICAgICAgIHdoaWxlIChjdXJyZW50ICE9IE9iamVjdC5jbGFzcyAmJiBjdXJyZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZEFsbChBcnJheXMuYXNMaXN0KGN1cnJlbnQuZ2V0RGVjbGFyZWRNZXRob2RzKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQuZ2V0U3VwZXJjbGFzcygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBMaXN0PE1lZGlhVHlwZT4gcmVzb2x2ZUNvbnN1bWVkVHlwZXMoZmluYWwgQW5ub3RhdGVkTWV0aG9kIGFtLCBmaW5hbCBMaXN0PE1lZGlhVHlwZT4gZGVmYXVsdENvbnN1bWVkVHlwZXMpIHsKKyAgICAgICAgLy8gT3ZlcnJpZGUgZGVmYXVsdCB0eXBlcyBpZiB0aGUgYW5ub3RhdGlvbiBpcyBwcmVzZW50IG9uIHRoZSBtZXRob2QKKyAgICAgICAgaWYgKGFtLmlzQW5ub3RhdGlvblByZXNlbnQoQ29uc3VtZXMuY2xhc3MpKSB7CisgICAgICAgICAgICByZXR1cm4gZXh0cmFjdE1lZGlhVHlwZXMoYW0uZ2V0QW5ub3RhdGlvbihDb25zdW1lcy5jbGFzcykpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRDb25zdW1lZFR5cGVzOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIExpc3Q8TWVkaWFUeXBlPiByZXNvbHZlUHJvZHVjZWRUeXBlcyhmaW5hbCBBbm5vdGF0ZWRNZXRob2QgYW0sIGZpbmFsIExpc3Q8TWVkaWFUeXBlPiBkZWZhdWx0UHJvZHVjZWRUeXBlcykgeworICAgICAgICAvLyBPdmVycmlkZSBkZWZhdWx0IHR5cGVzIGlmIHRoZSBhbm5vdGF0aW9uIGlzIHByZXNlbnQgb24gdGhlIG1ldGhvZAorICAgICAgICBpZiAoYW0uaXNBbm5vdGF0aW9uUHJlc2VudChQcm9kdWNlcy5jbGFzcykpIHsKKyAgICAgICAgICAgIHJldHVybiBleHRyYWN0TWVkaWFUeXBlcyhhbS5nZXRBbm5vdGF0aW9uKFByb2R1Y2VzLmNsYXNzKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZGVmYXVsdFByb2R1Y2VkVHlwZXM7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxNZWRpYVR5cGU+IGV4dHJhY3RNZWRpYVR5cGVzKGZpbmFsIENvbnN1bWVzIGFubm90YXRpb24pIHsKKyAgICAgICAgcmV0dXJuIChhbm5vdGF0aW9uICE9IG51bGwpID8gZXh0cmFjdE1lZGlhVHlwZXMoYW5ub3RhdGlvbi52YWx1ZSgpKSA6IENvbGxlY3Rpb25zLjxNZWRpYVR5cGU+ZW1wdHlMaXN0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxNZWRpYVR5cGU+IGV4dHJhY3RNZWRpYVR5cGVzKGZpbmFsIFByb2R1Y2VzIGFubm90YXRpb24pIHsKKyAgICAgICAgcmV0dXJuIChhbm5vdGF0aW9uICE9IG51bGwpID8gZXh0cmFjdE1lZGlhVHlwZXMoYW5ub3RhdGlvbi52YWx1ZSgpKSA6IENvbGxlY3Rpb25zLjxNZWRpYVR5cGU+ZW1wdHlMaXN0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxNZWRpYVR5cGU+IGV4dHJhY3RNZWRpYVR5cGVzKGZpbmFsIFN0cmluZ1tdIHZhbHVlcykgeworICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBMaXN0PE1lZGlhVHlwZT4gdHlwZXMgPSBuZXcgQXJyYXlMaXN0PD4odmFsdWVzLmxlbmd0aCk7CisgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIG10RW50cnkgOiB2YWx1ZXMpIHsKKyAgICAgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIG10IDogVG9rZW5pemVyLnRva2VuaXplKG10RW50cnksICIsIikpIHsKKyAgICAgICAgICAgICAgICB0eXBlcy5hZGQoTWVkaWFUeXBlLnZhbHVlT2YobXQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0eXBlczsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGludHJvc3BlY3RBc3luY0ZlYXR1cmVzKEFubm90YXRlZE1ldGhvZCBhbSwgUmVzb3VyY2VNZXRob2QuQnVpbGRlciByZXNvdXJjZU1ldGhvZEJ1aWxkZXIpIHsKKyAgICAgICAgaWYgKGFtLmlzQW5ub3RhdGlvblByZXNlbnQoTWFuYWdlZEFzeW5jLmNsYXNzKSkgeworICAgICAgICAgICAgcmVzb3VyY2VNZXRob2RCdWlsZGVyLm1hbmFnZWRBc3luYygpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMgOiBhbS5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucygpKSB7CisgICAgICAgICAgICBmb3IgKEFubm90YXRpb24gYW5ub3RhdGlvbiA6IGFubm90YXRpb25zKSB7CisgICAgICAgICAgICAgICAgaWYgKGFubm90YXRpb24uYW5ub3RhdGlvblR5cGUoKSA9PSBTdXNwZW5kZWQuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VNZXRob2RCdWlsZGVyLnN1c3BlbmRlZChBc3luY1Jlc3BvbnNlLk5PX1RJTUVPVVQsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChDbGFzczw/PiBwYXJhbVR5cGUgOiBhbS5nZXRQYXJhbWV0ZXJUeXBlcygpKSB7CisgICAgICAgICAgICBpZiAoU3NlRXZlbnRTaW5rLmNsYXNzLmVxdWFscyhwYXJhbVR5cGUpKSB7CisgICAgICAgICAgICAgICAgcmVzb3VyY2VNZXRob2RCdWlsZGVyLnNzZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFkZFJlc291cmNlTWV0aG9kcygKKyAgICAgICAgICAgIGZpbmFsIFJlc291cmNlLkJ1aWxkZXIgcmVzb3VyY2VCdWlsZGVyLAorICAgICAgICAgICAgZmluYWwgTWV0aG9kTGlzdCBtZXRob2RMaXN0LAorICAgICAgICAgICAgZmluYWwgTGlzdDxQYXJhbWV0ZXI+IHJlc291cmNlQ2xhc3NQYXJhbWV0ZXJzLCAvLyBwYXJhbWV0ZXJzIGRlcml2ZWQgZnJvbSBmaWVsZHMgYW5kIHNldHRlcnMgb24gdGhlIHJlc291cmNlIGNsYXNzCisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGVuY29kZWRQYXJhbWV0ZXJzLAorICAgICAgICAgICAgZmluYWwgTGlzdDxNZWRpYVR5cGU+IGRlZmF1bHRDb25zdW1lZFR5cGVzLAorICAgICAgICAgICAgZmluYWwgTGlzdDxNZWRpYVR5cGU+IGRlZmF1bHRQcm9kdWNlZFR5cGVzLAorICAgICAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4+IGRlZmF1bHROYW1lQmluZGluZ3MsCisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGV4dGVuZGVkCisgICAgKSB7CisgICAgICAgIGZvciAoQW5ub3RhdGVkTWV0aG9kIGFtIDogbWV0aG9kTGlzdC53aXRoTWV0YUFubm90YXRpb24oSHR0cE1ldGhvZC5jbGFzcykud2l0aG91dEFubm90YXRpb24oUGF0aC5jbGFzcykpIHsKKyAgICAgICAgICAgIFJlc291cmNlTWV0aG9kLkJ1aWxkZXIgbWV0aG9kQnVpbGRlciA9CisgICAgICAgICAgICAgICAgICAgIHJlc291cmNlQnVpbGRlci5hZGRNZXRob2QoYW0uZ2V0TWV0YU1ldGhvZEFubm90YXRpb25zKEh0dHBNZXRob2QuY2xhc3MpLmdldCgwKS52YWx1ZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb25zdW1lcyhyZXNvbHZlQ29uc3VtZWRUeXBlcyhhbSwgZGVmYXVsdENvbnN1bWVkVHlwZXMpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9kdWNlcyhyZXNvbHZlUHJvZHVjZWRUeXBlcyhhbSwgZGVmYXVsdFByb2R1Y2VkVHlwZXMpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lbmNvZGVkUGFyYW1ldGVycyhlbmNvZGVkUGFyYW1ldGVycyB8fCBhbS5pc0Fubm90YXRpb25QcmVzZW50KEVuY29kZWQuY2xhc3MpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lQmluZGluZ3MoZGVmYXVsdE5hbWVCaW5kaW5ncykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAubmFtZUJpbmRpbmdzKGFtLmdldEFubm90YXRpb25zKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmhhbmRsZWRCeShoYW5kbGVyQ2xhc3MsIGFtLmdldE1ldGhvZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5oYW5kbGluZ01ldGhvZChhbS5nZXREZWNsYXJlZE1ldGhvZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5oYW5kbGVyUGFyYW1ldGVycyhyZXNvdXJjZUNsYXNzUGFyYW1ldGVycykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXh0ZW5kZWQoZXh0ZW5kZWQgfHwgYW0uaXNBbm5vdGF0aW9uUHJlc2VudChFeHRlbmRlZFJlc291cmNlLmNsYXNzKSk7CisKKyAgICAgICAgICAgIGludHJvc3BlY3RBc3luY0ZlYXR1cmVzKGFtLCBtZXRob2RCdWlsZGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhZGRTdWJSZXNvdXJjZU1ldGhvZHMoCisgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZS5CdWlsZGVyIHJlc291cmNlQnVpbGRlciwKKyAgICAgICAgICAgIGZpbmFsIE1ldGhvZExpc3QgbWV0aG9kTGlzdCwKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8UGFyYW1ldGVyPiByZXNvdXJjZUNsYXNzUGFyYW1ldGVycywgLy8gcGFyYW1ldGVycyBkZXJpdmVkIGZyb20gZmllbGRzIGFuZCBzZXR0ZXJzIG9uIHRoZSByZXNvdXJjZSBjbGFzcworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBlbmNvZGVkUGFyYW1ldGVycywKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8TWVkaWFUeXBlPiBkZWZhdWx0Q29uc3VtZWRUeXBlcywKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8TWVkaWFUeXBlPiBkZWZhdWx0UHJvZHVjZWRUeXBlcywKKyAgICAgICAgICAgIGZpbmFsIENvbGxlY3Rpb248Q2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+PiBkZWZhdWx0TmFtZUJpbmRpbmdzLAorICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBleHRlbmRlZAorICAgICkgeworCisgICAgICAgIGZvciAoQW5ub3RhdGVkTWV0aG9kIGFtIDogbWV0aG9kTGlzdC53aXRoTWV0YUFubm90YXRpb24oSHR0cE1ldGhvZC5jbGFzcykud2l0aEFubm90YXRpb24oUGF0aC5jbGFzcykpIHsKKyAgICAgICAgICAgIFJlc291cmNlLkJ1aWxkZXIgY2hpbGRSZXNvdXJjZUJ1aWxkZXIgPSByZXNvdXJjZUJ1aWxkZXIuYWRkQ2hpbGRSZXNvdXJjZShhbS5nZXRBbm5vdGF0aW9uKFBhdGguY2xhc3MpLnZhbHVlKCkpOworCisgICAgICAgICAgICBSZXNvdXJjZU1ldGhvZC5CdWlsZGVyIG1ldGhvZEJ1aWxkZXIgPQorICAgICAgICAgICAgICAgICAgICBjaGlsZFJlc291cmNlQnVpbGRlci5hZGRNZXRob2QoYW0uZ2V0TWV0YU1ldGhvZEFubm90YXRpb25zKEh0dHBNZXRob2QuY2xhc3MpLmdldCgwKS52YWx1ZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb25zdW1lcyhyZXNvbHZlQ29uc3VtZWRUeXBlcyhhbSwgZGVmYXVsdENvbnN1bWVkVHlwZXMpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9kdWNlcyhyZXNvbHZlUHJvZHVjZWRUeXBlcyhhbSwgZGVmYXVsdFByb2R1Y2VkVHlwZXMpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lbmNvZGVkUGFyYW1ldGVycyhlbmNvZGVkUGFyYW1ldGVycyB8fCBhbS5pc0Fubm90YXRpb25QcmVzZW50KEVuY29kZWQuY2xhc3MpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lQmluZGluZ3MoZGVmYXVsdE5hbWVCaW5kaW5ncykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAubmFtZUJpbmRpbmdzKGFtLmdldEFubm90YXRpb25zKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmhhbmRsZWRCeShoYW5kbGVyQ2xhc3MsIGFtLmdldE1ldGhvZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5oYW5kbGluZ01ldGhvZChhbS5nZXREZWNsYXJlZE1ldGhvZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5oYW5kbGVyUGFyYW1ldGVycyhyZXNvdXJjZUNsYXNzUGFyYW1ldGVycykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXh0ZW5kZWQoZXh0ZW5kZWQgfHwgYW0uaXNBbm5vdGF0aW9uUHJlc2VudChFeHRlbmRlZFJlc291cmNlLmNsYXNzKSk7CisKKyAgICAgICAgICAgIGludHJvc3BlY3RBc3luY0ZlYXR1cmVzKGFtLCBtZXRob2RCdWlsZGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhZGRTdWJSZXNvdXJjZUxvY2F0b3JzKAorICAgICAgICAgICAgZmluYWwgUmVzb3VyY2UuQnVpbGRlciByZXNvdXJjZUJ1aWxkZXIsCisgICAgICAgICAgICBmaW5hbCBNZXRob2RMaXN0IG1ldGhvZExpc3QsCisgICAgICAgICAgICBmaW5hbCBMaXN0PFBhcmFtZXRlcj4gcmVzb3VyY2VDbGFzc1BhcmFtZXRlcnMsIC8vIHBhcmFtZXRlcnMgZGVyaXZlZCBmcm9tIGZpZWxkcyBhbmQgc2V0dGVycyBvbiB0aGUgcmVzb3VyY2UgY2xhc3MKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gZW5jb2RlZFBhcmFtZXRlcnMsCisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGV4dGVuZGVkKSB7CisKKyAgICAgICAgZm9yIChBbm5vdGF0ZWRNZXRob2QgYW0gOiBtZXRob2RMaXN0LndpdGhvdXRNZXRhQW5ub3RhdGlvbihIdHRwTWV0aG9kLmNsYXNzKS53aXRoQW5ub3RhdGlvbihQYXRoLmNsYXNzKSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBhdGggPSBhbS5nZXRBbm5vdGF0aW9uKFBhdGguY2xhc3MpLnZhbHVlKCk7CisgICAgICAgICAgICBSZXNvdXJjZS5CdWlsZGVyIGJ1aWxkZXIgPSByZXNvdXJjZUJ1aWxkZXI7CisgICAgICAgICAgICBpZiAocGF0aCAhPSBudWxsICYmICFwYXRoLmlzRW1wdHkoKSAmJiAhIi8iLmVxdWFscyhwYXRoKSkgeworICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSByZXNvdXJjZUJ1aWxkZXIuYWRkQ2hpbGRSZXNvdXJjZShwYXRoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnVpbGRlci5hZGRNZXRob2QoKQorICAgICAgICAgICAgICAgICAgICAuZW5jb2RlZFBhcmFtZXRlcnMoZW5jb2RlZFBhcmFtZXRlcnMgfHwgYW0uaXNBbm5vdGF0aW9uUHJlc2VudChFbmNvZGVkLmNsYXNzKSkKKyAgICAgICAgICAgICAgICAgICAgLmhhbmRsZWRCeShoYW5kbGVyQ2xhc3MsIGFtLmdldE1ldGhvZCgpKQorICAgICAgICAgICAgICAgICAgICAuaGFuZGxpbmdNZXRob2QoYW0uZ2V0RGVjbGFyZWRNZXRob2QoKSkKKyAgICAgICAgICAgICAgICAgICAgLmhhbmRsZXJQYXJhbWV0ZXJzKHJlc291cmNlQ2xhc3NQYXJhbWV0ZXJzKQorICAgICAgICAgICAgICAgICAgICAuZXh0ZW5kZWQoZXh0ZW5kZWQgfHwgYW0uaXNBbm5vdGF0aW9uUHJlc2VudChFeHRlbmRlZFJlc291cmNlLmNsYXNzKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9JbnZvY2FibGUuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL0ludm9jYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYTAzMjIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9JbnZvY2FibGUuamF2YQpAQCAtMCwwICsxLDM0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWw7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUGFyYW1ldGVyaXplZFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY1R5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXF1ZXN0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5SZWZsZWN0aW9uSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5DbGFzc1R5cGVQYWlyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuSW5mbGVjdG9yOworCisvKioKKyAqIEEgY29tbW9uIGludGVyZmFjZSBmb3IgaW52b2NhYmxlIHJlc291cmNlIGNvbXBvbmVudHMuIFRoaXMgaW5jbHVkZXMgcmVzb3VyY2UKKyAqIG1ldGhvZHMsIHN1Yi1yZXNvdXJjZSBtZXRob2RzIGFuZCBzdWItcmVzb3VyY2UgbG9jYXRvcnMgYm91bmQgdG8gYSBjb25jcmV0ZQorICogaGFuZGxlciBjbGFzcyBhbmQgYSBKYXZhIG1ldGhvZCAoZWl0aGVyIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkpIGRlY2xhcmVkICYKKyAqIGltcGxlbWVudGVkIGJ5IHRoZSBoYW5kbGVyIGNsYXNzLgorICogPHAvPgorICogSW52b2NhYmxlIGNvbXBvbmVudCBpbmZvcm1hdGlvbiBpcyB1c2VkIGF0IHJ1bnRpbWUgYnkgYSBKYXZhIG1ldGhvZCBkaXNwYXRjaGVyCisgKiB3aGVuIHByb2Nlc3NpbmcgcmVxdWVzdHMuCisgKiA8cD4KKyAqIENsYXNzIGRlZmluZXMgdHdvIGtpbmRzIG9mIHtAbGluayBNZXRob2QgamF2YSBtZXRob2RzfToge0BsaW5rICNnZXREZWZpbml0aW9uTWV0aG9kKCkgZGVmaW5pdGlvbiBtZXRob2R9IGFuZAorICoge0BsaW5rICNnZXRIYW5kbGluZ01ldGhvZCgpIGhhbmRsaW5nIG1ldGhvZH0uIERlZmluaXRpb24gbWV0aG9kIGlzIHRoZSBqYXZhIHtAY29kZSBNZXRob2R9IHRoYXQgaXMgZGVmaW5lZAorICogYnkgdGhlIHVzZXIgdG8gYmUKKyAqIGV4ZWN1dGVkLiBUaGlzIGNhbiBiZSBqYXZhIHtAY29kZSBNZXRob2R9IG9mIHRoZSBjbGFzcyBidXQgYWxzbyBtZXRob2Qgb2YgdGhlIGludGVyZmFjZS4gSWYgaXQgaXMgdGhlCisgKiBtZXRob2Qgb2YgdGhlIGludGVyZmFjZSAobWV0aG9kIGhhbmRsZXIgY2xhc3MgaXMgdGhlIHtAY29kZSBjbGFzc30gYnV0IG1ldGhvZCBpdHNlbGYgaXMgZnJvbQorICogdGhlIHtAY29kZSBpbnRlcmZhY2V9KSB0aGVuIHRoZSBkZWZpbml0aW9uIG1ldGhvZCBpcyB0aGUgbWV0aG9kIGZyb20gdGhlIGluaGVyaXRlZCB7QGNvZGUgY2xhc3N9LiBJbiBvdGhlciB3b3JkcywgdGhlCisgKiBoYW5kbGluZyBtZXRob2QgaXMgdGhlIGNvbmNyZXRlIG1ldGhvZCBidXQgZGVmaW5pdGlvbiBtZXRob2QgY2FuIGJlIGl0cyBwYXJlbnQgYWJzdHJhY3QgZGVmaW5pdGlvbi4gSG93ZXZlciwgaW4gbW9zdAorICogY2FzZXMgdGhlc2UgbWV0aG9kcyBhcmUgdGhlIHNhbWUuCisgKiA8L3A+CisgKgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKiBAc2VlIFJlc291cmNlTWV0aG9kCisgKiBAc2VlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuaW50ZXJuYWwuUmVzb3VyY2VNZXRob2REaXNwYXRjaGVyCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBJbnZvY2FibGUgaW1wbGVtZW50cyBQYXJhbWV0ZXJpemVkLCBSZXNvdXJjZU1vZGVsQ29tcG9uZW50IHsKKworICAgIC8qKgorICAgICAqIE1ldGhvZCBpbnN0YW5jZSByZXByZXNlbnRpbmcgdGhlIHtAbGluayBJbmZsZWN0b3IjYXBwbHkoT2JqZWN0KX0gbWV0aG9kLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBNZXRob2QgQVBQTFlfSU5GTEVDVE9SX01FVEhPRCA9IGluaXRBcHBseU1ldGhvZCgpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kIGluaXRBcHBseU1ldGhvZCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBJbmZsZWN0b3IuY2xhc3MuZ2V0TWV0aG9kKCJhcHBseSIsIE9iamVjdC5jbGFzcyk7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBJbmNvbXBhdGlibGVDbGFzc0NoYW5nZUVycm9yIGVycm9yID0gbmV3IEluY29tcGF0aWJsZUNsYXNzQ2hhbmdlRXJyb3IoIkluZmxlY3Rvci5hcHBseShPYmplY3QpIG1ldGhvZCBub3QgZm91bmQiKTsKKyAgICAgICAgICAgIGVycm9yLmluaXRDYXVzZShlKTsKKyAgICAgICAgICAgIHRocm93IGVycm9yOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IHJlc291cmNlIG1ldGhvZCBpbnZvY2FibGUgbW9kZWwgYmFja2VkIGJ5IGFuIGluZmxlY3RvciBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmZsZWN0b3IgaW5mbGVjdG9yIHByb2Nlc3NpbmcgdGhlIHJlcXVlc3QgbWV0aG9kLgorICAgICAqCisgICAgICogQHJldHVybiBJbnZvY2FibGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8VD4gSW52b2NhYmxlIGNyZWF0ZShJbmZsZWN0b3I8UmVxdWVzdCwgVD4gaW5mbGVjdG9yKSB7CisgICAgICAgIHJldHVybiBjcmVhdGUoTWV0aG9kSGFuZGxlci5jcmVhdGUoaW5mbGVjdG9yKSwgQVBQTFlfSU5GTEVDVE9SX01FVEhPRCwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyByZXNvdXJjZSBtZXRob2QgaW52b2NhYmxlIG1vZGVsIGJhY2tlZCBieSBhbiBpbmZsZWN0b3IgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5mbGVjdG9yQ2xhc3MgaW5mbGVjdG9yIHN5Yi10eXBlIHByb2Nlc3NpbmcgdGhlIHJlcXVlc3QgbWV0aG9kLgorICAgICAqIEByZXR1cm4gSW52b2NhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgSW52b2NhYmxlIGNyZWF0ZShDbGFzczw/IGV4dGVuZHMgSW5mbGVjdG9yPiBpbmZsZWN0b3JDbGFzcykgeworICAgICAgICByZXR1cm4gY3JlYXRlKE1ldGhvZEhhbmRsZXIuY3JlYXRlKGluZmxlY3RvckNsYXNzKSwgQVBQTFlfSU5GTEVDVE9SX01FVEhPRCwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyByZXNvdXJjZSBtZXRob2QgaW52b2NhYmxlIG1vZGVsLiBQYXJhbWV0ZXIgdmFsdWVzIHdpbGwgYmUKKyAgICAgKiBhdXRvbWF0aWNhbGx5IGRlY29kZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaGFuZGxlciAgICAgICAgcmVzb3VyY2UgbWV0aG9kIGhhbmRsZXIuCisgICAgICogQHBhcmFtIGhhbmRsaW5nTWV0aG9kIGhhbmRsaW5nIEphdmEgbWV0aG9kLgorICAgICAqIEByZXR1cm4gSW52b2NhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgSW52b2NhYmxlIGNyZWF0ZShNZXRob2RIYW5kbGVyIGhhbmRsZXIsIE1ldGhvZCBoYW5kbGluZ01ldGhvZCkgeworICAgICAgICByZXR1cm4gY3JlYXRlKGhhbmRsZXIsIGhhbmRsaW5nTWV0aG9kLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IHJlc291cmNlIG1ldGhvZCBpbnZvY2FibGUgbW9kZWwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaGFuZGxlciAgICAgICAgICAgcmVzb3VyY2UgbWV0aG9kIGhhbmRsZXIuCisgICAgICogQHBhcmFtIGRlZmluaXRpb25NZXRob2QgIG1ldGhvZCB0aGF0IGlzIGRlZmluZWQgdG8gYmUgZXhlY3V0ZWQgb24gdGhlIHtAY29kZSBoYW5kbGVyfS4KKyAgICAgKiBAcGFyYW0gZW5jb2RlZFBhcmFtZXRlcnMge0Bjb2RlIHRydWV9IGlmIHRoZSBhdXRvbWF0aWMgcGFyYW1ldGVyIGRlY29kaW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBkaXNhYmxlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4gSW52b2NhYmxlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBJbnZvY2FibGUgY3JlYXRlKE1ldGhvZEhhbmRsZXIgaGFuZGxlciwgTWV0aG9kIGRlZmluaXRpb25NZXRob2QsIGJvb2xlYW4gZW5jb2RlZFBhcmFtZXRlcnMpIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZShoYW5kbGVyLCBkZWZpbml0aW9uTWV0aG9kLCBudWxsLCBlbmNvZGVkUGFyYW1ldGVycyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IHJlc291cmNlIG1ldGhvZCBpbnZvY2FibGUgbW9kZWwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaGFuZGxlciAgICAgICAgICAgcmVzb3VyY2UgbWV0aG9kIGhhbmRsZXIuCisgICAgICogQHBhcmFtIGRlZmluaXRpb25NZXRob2QgIG1ldGhvZCB0aGF0IGlzIGRlZmluZWQgdG8gYmUgZXhlY3V0ZWQgb24gdGhlIHtAY29kZSBoYW5kbGVyfS4KKyAgICAgKiBAcGFyYW0gaGFuZGxpbmdNZXRob2QgICAgc3BlY2lmaWMgYW5kIGNvbmNyZXRlIG1ldGhvZCB0byBiZSBhY3R1YWxseSBleGVjdXRlZCBhcyBhIHJlc291cmNlIG1ldGhvZC4gSWYge0Bjb2RlIG51bGx9CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4gdGhlIHtAY29kZSBkZWZpbml0aW9uTWV0aG9kfSB3aWxsIGJlIHVzZWQuCisgICAgICogQHBhcmFtIGVuY29kZWRQYXJhbWV0ZXJzIHtAY29kZSB0cnVlfSBpZiB0aGUgYXV0b21hdGljIHBhcmFtZXRlciBkZWNvZGluZworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgZGlzYWJsZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIEludm9jYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEludm9jYWJsZSBjcmVhdGUoTWV0aG9kSGFuZGxlciBoYW5kbGVyLCBNZXRob2QgZGVmaW5pdGlvbk1ldGhvZCwgTWV0aG9kIGhhbmRsaW5nTWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGVuY29kZWRQYXJhbWV0ZXJzKSB7CisgICAgICAgIHJldHVybiBuZXcgSW52b2NhYmxlKGhhbmRsZXIsIGRlZmluaXRpb25NZXRob2QsIGhhbmRsaW5nTWV0aG9kLCBlbmNvZGVkUGFyYW1ldGVycywgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IHJlc291cmNlIG1ldGhvZCBpbnZvY2FibGUgbW9kZWwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaGFuZGxlciAgICAgICAgICAgcmVzb3VyY2UgbWV0aG9kIGhhbmRsZXIuCisgICAgICogQHBhcmFtIGRlZmluaXRpb25NZXRob2QgIG1ldGhvZCB0aGF0IGlzIGRlZmluZWQgdG8gYmUgZXhlY3V0ZWQgb24gdGhlIHtAY29kZSBoYW5kbGVyfS4KKyAgICAgKiBAcGFyYW0gaGFuZGxpbmdNZXRob2QgICAgc3BlY2lmaWMgYW5kIGNvbmNyZXRlIG1ldGhvZCB0byBiZSBhY3R1YWxseSBleGVjdXRlZCBhcyBhIHJlc291cmNlIG1ldGhvZC4gSWYge0Bjb2RlIG51bGx9CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4gdGhlIHtAY29kZSBkZWZpbml0aW9uTWV0aG9kfSB3aWxsIGJlIHVzZWQuCisgICAgICogQHBhcmFtIGVuY29kZWRQYXJhbWV0ZXJzIHtAY29kZSB0cnVlfSBpZiB0aGUgYXV0b21hdGljIHBhcmFtZXRlciBkZWNvZGluZworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgZGlzYWJsZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcGFyYW0gcm91dGluZ1Jlc3BvbnNlVHlwZSByZXNwb25zZSB0eXBlIHRoYXQgd2lsbCBiZSB1c2VkIGR1cmluZyB0aGUgcm91dGluZyBmb3IgcHVycG9zZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHNlbGVjdGlvbiBvZiB0aGUgcmVzb3VyY2UgbWV0aG9kIHRvIGJlIGV4ZWN1dGVkLiBJZiB0aGlzIHBhcmFtZXRlciBpcworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbi17QGNvZGUgbnVsbH0gdGhlbiBpdCB3aWxsIG92ZXJyaWRlIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7QGxpbmsgI2dldEhhbmRsaW5nTWV0aG9kKCkgdGhlIEphdmEgaGFuZGxpbmcgbWV0aG9kfSkgZm9yIHB1cnBvc2VzIG9mCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UgbWV0aG9kIHNlbGVjdGlvbi4gVGhpcyBtaWdodCBiZSB1c2VmdWwgaW4gY2FzZXMgd2hlbiByZXNvdXJjZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCByZXR1cm5zIGEgdHlwZSB7QGNvZGUgQX0gYnV0IHRoYW5rcyB0byByZWdpc3RlcmVkIHByb3ZpZGVycworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlZy4ge0BsaW5rIGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvcn0pIGl0IHdpbGwgYmUgYWx3YXlzIGNvbnZlcnRlZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHR5cGUge0Bjb2RlIEJ9LiBUaGVuIHRoZSBtZXRob2Qgc2VsZWN0aW5nIGFsZ29yaXRobSB3b3VsZCBjaGVjayBwcmVzZW5jZSBvZgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAbGluayBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXJ9IGZvciB0eXBlIHtAY29kZSBBfSAod2hpY2ggd2lsbAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldmVyIGJlIGFjdHVhbGx5IG5lZWRlZCkgYW5kIG1pZ2h0IHJlc3VsdCBpbiBjaG9vc2luZyB1bmRlc2lyZWQgbWV0aG9kLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSBwYXJhbWV0ZXIgaXMge0Bjb2RlIG51bGx9IHRoZW4gdGhlIGRlZmF1bHQgcmVzcG9uc2UgdHlwZSB3aWxsIGJlIHVzZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEludm9jYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEludm9jYWJsZSBjcmVhdGUoTWV0aG9kSGFuZGxlciBoYW5kbGVyLCBNZXRob2QgZGVmaW5pdGlvbk1ldGhvZCwgTWV0aG9kIGhhbmRsaW5nTWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGVuY29kZWRQYXJhbWV0ZXJzLCBUeXBlIHJvdXRpbmdSZXNwb25zZVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJbnZvY2FibGUoaGFuZGxlciwgZGVmaW5pdGlvbk1ldGhvZCwgaGFuZGxpbmdNZXRob2QsIGVuY29kZWRQYXJhbWV0ZXJzLCByb3V0aW5nUmVzcG9uc2VUeXBlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIE1ldGhvZEhhbmRsZXIgaGFuZGxlcjsKKyAgICBwcml2YXRlIGZpbmFsIE1ldGhvZCBkZWZpbml0aW9uTWV0aG9kOworICAgIHByaXZhdGUgZmluYWwgTWV0aG9kIGhhbmRsaW5nTWV0aG9kOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxQYXJhbWV0ZXI+IHBhcmFtZXRlcnM7CisKKyAgICBwcml2YXRlIGZpbmFsIENsYXNzPD8+IHJhd1Jlc3BvbnNlVHlwZTsKKyAgICBwcml2YXRlIGZpbmFsIFR5cGUgcmVzcG9uc2VUeXBlOworICAgIHByaXZhdGUgZmluYWwgVHlwZSByb3V0aW5nUmVzcG9uc2VUeXBlOworICAgIHByaXZhdGUgZmluYWwgQ2xhc3M8Pz4gcmF3Um91dGluZ1Jlc3BvbnNlVHlwZTsKKworICAgIHByaXZhdGUgSW52b2NhYmxlKE1ldGhvZEhhbmRsZXIgaGFuZGxlciwgTWV0aG9kIGRlZmluaXRpb25NZXRob2QsIE1ldGhvZCBoYW5kbGluZ01ldGhvZCwgYm9vbGVhbiBlbmNvZGVkUGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICBUeXBlIHJvdXRpbmdSZXNwb25zZVR5cGUpIHsKKyAgICAgICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcjsKKyAgICAgICAgdGhpcy5kZWZpbml0aW9uTWV0aG9kID0gZGVmaW5pdGlvbk1ldGhvZDsKKyAgICAgICAgdGhpcy5oYW5kbGluZ01ldGhvZCA9IGhhbmRsaW5nTWV0aG9kID09IG51bGwgPyBSZWZsZWN0aW9uSGVscGVyCisgICAgICAgICAgICAgICAgLmZpbmRPdmVycmlkaW5nTWV0aG9kT25DbGFzcyhoYW5kbGVyLmdldEhhbmRsZXJDbGFzcygpLCBkZWZpbml0aW9uTWV0aG9kKSA6IGhhbmRsaW5nTWV0aG9kOworCisgICAgICAgIGZpbmFsIENsYXNzPD8+IGhhbmRsZXJDbGFzcyA9IGhhbmRsZXIuZ2V0SGFuZGxlckNsYXNzKCk7CisgICAgICAgIGZpbmFsIENsYXNzPD8+IGRlZmluaXRpb25DbGFzcyA9IGRlZmluaXRpb25NZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKKyAgICAgICAgZmluYWwgQ2xhc3NUeXBlUGFpciBoYW5kbGluZ0N0UGFpciA9IFJlZmxlY3Rpb25IZWxwZXIucmVzb2x2ZUdlbmVyaWNUeXBlKAorICAgICAgICAgICAgICAgIGhhbmRsZXJDbGFzcywKKyAgICAgICAgICAgICAgICB0aGlzLmhhbmRsaW5nTWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCksCisgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGluZ01ldGhvZC5nZXRSZXR1cm5UeXBlKCksCisgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGluZ01ldGhvZC5nZXRHZW5lcmljUmV0dXJuVHlwZSgpKTsKKworICAgICAgICAvLyBoZXJlIHdlIG5lZWQgdG8gZmluZCB0eXBlcyBhbHNvIGZvciBkZWZpbml0aW9uIG1ldGhvZC4gRGVmaW5pdGlvbiBtZXRob2QgaXMgaW4gbW9zdAorICAgICAgICAvLyBjYXNlcyB1c2VkIGZvciBwYXJlbnQgbWV0aG9kcyAoZm9yIGV4YW1wbGUgZm9yIGludGVyZmFjZSBtZXRob2Qgb2YgcmVzb3VyY2UgY2xhc3MpLiBCdXQgaGVyZSB3ZQorICAgICAgICAvLyBjb25zaWRlciBhbHNvIHNpdHVhdGlvbiB3aGVuIHJlc291cmNlIGlzIGEgcHJveHkgKGZvciBleGFtcGxlIHByb3h5IG9mIEVKQikgYW5kIGRlZmluaXRpb24KKyAgICAgICAgLy8gbWV0aG9kIGlzIHRoZSBvcmlnaW5hbCBtZXRob2QgYW5kIGhhbmRsaW5nIG1ldGhvZCBpcyBtZXRob2Qgb24gcHJveHkuIFNvLCB3ZSB0cnkgdG8gZmluZCBnZW5lcmljCisgICAgICAgIC8vIHR5cGUgaW4gdGhlIG9yaWdpbmFsIGNsYXNzIHVzaW5nIGRlZmluaXRpb24gbWV0aG9kLgorICAgICAgICBmaW5hbCBDbGFzc1R5cGVQYWlyIGRlZmluaXRpb25DdFBhaXIgPSBSZWZsZWN0aW9uSGVscGVyLnJlc29sdmVHZW5lcmljVHlwZSgKKyAgICAgICAgICAgICAgICBkZWZpbml0aW9uQ2xhc3MsCisgICAgICAgICAgICAgICAgdGhpcy5kZWZpbml0aW9uTWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCksCisgICAgICAgICAgICAgICAgdGhpcy5kZWZpbml0aW9uTWV0aG9kLmdldFJldHVyblR5cGUoKSwKKyAgICAgICAgICAgICAgICB0aGlzLmRlZmluaXRpb25NZXRob2QuZ2V0R2VuZXJpY1JldHVyblR5cGUoKSk7CisgICAgICAgIHRoaXMucmF3UmVzcG9uc2VUeXBlID0gaGFuZGxpbmdDdFBhaXIucmF3Q2xhc3MoKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBoYW5kbGVyUmV0dXJuVHlwZUlzUGFyYW1ldGVyaXplZCA9IGhhbmRsaW5nQ3RQYWlyLnR5cGUoKSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRUeXBlOworICAgICAgICBmaW5hbCBib29sZWFuIGRlZmluaXRpb25SZXR1cm5UeXBlSXNQYXJhbWV0ZXJpemVkID0gZGVmaW5pdGlvbkN0UGFpci50eXBlKCkgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkVHlwZTsKKyAgICAgICAgdGhpcy5yZXNwb25zZVR5cGUgPQorICAgICAgICAgICAgICAgIChoYW5kbGluZ0N0UGFpci5yYXdDbGFzcygpID09IGRlZmluaXRpb25DdFBhaXIucmF3Q2xhc3MoKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZGVmaW5pdGlvblJldHVyblR5cGVJc1BhcmFtZXRlcml6ZWQgJiYgIWhhbmRsZXJSZXR1cm5UeXBlSXNQYXJhbWV0ZXJpemVkKQorICAgICAgICAgICAgICAgICAgICAgICAgPyBkZWZpbml0aW9uQ3RQYWlyLnR5cGUoKSA6IGhhbmRsaW5nQ3RQYWlyLnR5cGUoKTsKKyAgICAgICAgaWYgKHJvdXRpbmdSZXNwb25zZVR5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5yb3V0aW5nUmVzcG9uc2VUeXBlID0gcmVzcG9uc2VUeXBlOworICAgICAgICAgICAgdGhpcy5yYXdSb3V0aW5nUmVzcG9uc2VUeXBlID0gcmF3UmVzcG9uc2VUeXBlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgR2VuZXJpY1R5cGUgcm91dGluZ1Jlc3BvbnNlR2VuZXJpY1R5cGUgPSBuZXcgR2VuZXJpY1R5cGUocm91dGluZ1Jlc3BvbnNlVHlwZSk7CisgICAgICAgICAgICB0aGlzLnJvdXRpbmdSZXNwb25zZVR5cGUgPSByb3V0aW5nUmVzcG9uc2VHZW5lcmljVHlwZS5nZXRUeXBlKCk7CisgICAgICAgICAgICB0aGlzLnJhd1JvdXRpbmdSZXNwb25zZVR5cGUgPSByb3V0aW5nUmVzcG9uc2VHZW5lcmljVHlwZS5nZXRSYXdUeXBlKCk7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLnBhcmFtZXRlcnMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KFBhcmFtZXRlci5jcmVhdGUoCisgICAgICAgICAgICAgICAgaGFuZGxlckNsYXNzLCBkZWZpbml0aW9uTWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCksIGRlZmluaXRpb25NZXRob2QsIGVuY29kZWRQYXJhbWV0ZXJzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBtb2RlbCBvZiB0aGUgcmVzb3VyY2UgbWV0aG9kIGhhbmRsZXIgdGhhdCB3aWxsIGJlIHVzZWQgdG8gaW52b2tlCisgICAgICogdGhlIHtAbGluayAjZ2V0SGFuZGxpbmdNZXRob2QoKSBoYW5kbGluZyByZXNvdXJjZSBtZXRob2R9IG9uLgorICAgICAqCisgICAgICogQHJldHVybiByZXNvdXJjZSBtZXRob2QgaGFuZGxlciBtb2RlbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0aG9kSGFuZGxlciBnZXRIYW5kbGVyKCkgeworICAgICAgICByZXR1cm4gaGFuZGxlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXR0ZXIgZm9yIHRoZSBKYXZhIG1ldGhvZAorICAgICAqCisgICAgICogQHJldHVybiBjb3JyZXNwb25kaW5nIEphdmEgbWV0aG9kCisgICAgICovCisgICAgcHVibGljIE1ldGhvZCBnZXRIYW5kbGluZ01ldGhvZCgpIHsKKyAgICAgICAgcmV0dXJuIGhhbmRsaW5nTWV0aG9kOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHRlciBmb3IgdGhlIEphdmEgbWV0aG9kIHRoYXQgc2hvdWxkIGJlIGV4ZWN1dGVkLgorICAgICAqCisgICAgICogQHJldHVybiBjb3JyZXNwb25kaW5nIEphdmEgbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyBNZXRob2QgZ2V0RGVmaW5pdGlvbk1ldGhvZCgpIHsKKyAgICAgICAgcmV0dXJuIGRlZmluaXRpb25NZXRob2Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSByZXNvdXJjZSBtZXRob2QgZ2VuZXJpYyByZXNwb25zZSB0eXBlIGluZm9ybWF0aW9uLgorICAgICAqIDxwPgorICAgICAqIFRoZSByZXR1cm5lZCB2YWx1ZSBwcm92aWRlcyB0aGUgVHlwZSBpbmZvcm1hdGlvbiB0aGF0IGNvbnRhaW5zIGFkZGl0aW9uYWwKKyAgICAgKiBnZW5lcmljIGRlY2xhcmF0aW9uIGluZm9ybWF0aW9uIGZvciBnZW5lcmljIEphdmEgY2xhc3MgdHlwZXMuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHJldHVybiByZXNvdXJjZSBtZXRob2QgZ2VuZXJpYyByZXNwb25zZSB0eXBlIGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBUeXBlIGdldFJlc3BvbnNlVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHJlc3BvbnNlVHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHJlc291cmNlIG1ldGhvZCByYXcgcmVzcG9uc2UgdHlwZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgcmV0dXJuZWQgdmFsdWUgcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJhdyBKYXZhIGNsYXNzLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gcmVzb3VyY2UgbWV0aG9kIHJhdyByZXNwb25zZSB0eXBlIGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzczw/PiBnZXRSYXdSZXNwb25zZVR5cGUoKSB7CisgICAgICAgIHJldHVybiByYXdSZXNwb25zZVR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgdGhlIGludm9jYWJsZSByZXByZXNlbnRzIGFuIHtAbGluayBJbmZsZWN0b3IjYXBwbHkoT2JqZWN0KSBpbmZsZWN0b3IKKyAgICAgKiBwcm9jZXNzaW5nIG1ldGhvZH0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSwgaWYgdGhpcyBpbnZvY2FibGUgcmVwcmVzZW50cyBhbiBpbmZsZWN0b3IgaW52b2NhdGlvbiwKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzSW5mbGVjdG9yKCkgeworICAgICAgICAvLyBNZXRob2QuZXF1YWxzKC4uLikgZG9lcyBub3QgcGVyZm9ybSB0aGUgaWRlbnRpdHkgY2hlY2sgKGluIEphdmEgU0UgNikKKyAgICAgICAgcmV0dXJuIEFQUExZX0lORkxFQ1RPUl9NRVRIT0QgPT0gZGVmaW5pdGlvbk1ldGhvZCB8fCBBUFBMWV9JTkZMRUNUT1JfTUVUSE9ELmVxdWFscyhkZWZpbml0aW9uTWV0aG9kKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiByZXF1aXJlc0VudGl0eSgpIHsKKyAgICAgICAgZm9yIChQYXJhbWV0ZXIgcCA6IGdldFBhcmFtZXRlcnMoKSkgeworICAgICAgICAgICAgaWYgKFBhcmFtZXRlci5Tb3VyY2UuRU5USVRZID09IHAuZ2V0U291cmNlKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8UGFyYW1ldGVyPiBnZXRQYXJhbWV0ZXJzKCkgeworICAgICAgICByZXR1cm4gcGFyYW1ldGVyczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhY2NlcHQoUmVzb3VyY2VNb2RlbFZpc2l0b3IgdmlzaXRvcikgeworICAgICAgICB2aXNpdG9yLnZpc2l0SW52b2NhYmxlKHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PD8gZXh0ZW5kcyBSZXNvdXJjZU1vZGVsQ29tcG9uZW50PiBnZXRDb21wb25lbnRzKCkgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChoYW5kbGVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIkludm9jYWJsZXsiCisgICAgICAgICAgICAgICAgKyAiaGFuZGxlcj0iICsgaGFuZGxlcgorICAgICAgICAgICAgICAgICsgIiwgZGVmaW5pdGlvbk1ldGhvZD0iICsgZGVmaW5pdGlvbk1ldGhvZAorICAgICAgICAgICAgICAgICsgIiwgcGFyYW1ldGVycz0iICsgcGFyYW1ldGVycworICAgICAgICAgICAgICAgICsgIiwgcmVzcG9uc2VUeXBlPSIgKyByZXNwb25zZVR5cGUgKyAnfSc7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSByZXNwb25zZSB0eXBlIG9mIHRoZSB7QGxpbmsgI2hhbmRsaW5nTWV0aG9kfSB0aGF0IHdpbGwgYmUgdXNlZCBkdXJpbmcKKyAgICAgKiB0aGUgcm91dGluZyBmb3IgdGhlIHB1cnBvc2UKKyAgICAgKiBvZiBzZWxlY3Rpb24gb2YgdGhlIHJlc291cmNlIG1ldGhvZC4gUmV0dXJuZWQgdmFsdWUKKyAgICAgKiBpcyBpbiBtb3N0IGNhc2VzIGVxdWFsIHRvIHRoZSB7QGxpbmsgI2dldFJlc3BvbnNlVHlwZSgpIHJlc3BvbnNlIHR5cGV9LgorICAgICAqIElmIHJldHVybmVkIHZhbHVlIGlzIGRpZmZlcmVudCB0aGVuIGl0IG92ZXJyaWRlcyB0aGUgcmVzcG9uc2UgdHlwZSBmb3IKKyAgICAgKiBwdXJwb3NlcyBvZiByZXNvdXJjZSBtZXRob2Qgc2VsZWN0aW9uIGFuZCB3aWxsIGJlIHVzZWQgdG8gbG9vayBmb3IgYXZhaWxhYmxlCisgICAgICoge0BsaW5rIGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlciBtZXNzYWdlIGJvZHkgd3JpdGVyc30uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFJlc3BvbnNlIHR5cGUgdXNlZCBmb3IgdGhlIHJvdXRpbmcuCisgICAgICovCisgICAgcHVibGljIFR5cGUgZ2V0Um91dGluZ1Jlc3BvbnNlVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHJvdXRpbmdSZXNwb25zZVR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSByZXNwb25zZSB7QGxpbmsgQ2xhc3N9IG9mIHRoZSB7QGxpbmsgI2hhbmRsaW5nTWV0aG9kfSB0aGF0IHdpbGwgYmUgdXNlZCBkdXJpbmcKKyAgICAgKiB0aGUgcm91dGluZyBmb3IgdGhlIHB1cnBvc2UKKyAgICAgKiBvZiBzZWxlY3Rpb24gb2YgdGhlIHJlc291cmNlIG1ldGhvZC4gUmV0dXJuZWQgdmFsdWUKKyAgICAgKiBpcyBpbiBtb3N0IGNhc2VzIGVxdWFsIHRvIHRoZSB7QGxpbmsgI2dldFJlc3BvbnNlVHlwZSgpIHJlc3BvbnNlIHR5cGV9LgorICAgICAqIElmIHJldHVybmVkIHZhbHVlIGlzIGRpZmZlcmVudCB0aGVuIGl0IG92ZXJyaWRlcyB0aGUgcmVzcG9uc2UgdHlwZSBmb3IKKyAgICAgKiBwdXJwb3NlcyBvZiByZXNvdXJjZSBtZXRob2Qgc2VsZWN0aW9uIGFuZCB3aWxsIGJlIHVzZWQgdG8gbG9vayBmb3IgYXZhaWxhYmxlCisgICAgICoge0BsaW5rIGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlciBtZXNzYWdlIGJvZHkgd3JpdGVyc30uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFJlc3BvbnNlIHR5cGUgdXNlZCBmb3IgdGhlIHJvdXRpbmcuCisgICAgICovCisgICAgcHVibGljIENsYXNzPD8+IGdldFJhd1JvdXRpbmdSZXNwb25zZVR5cGUoKSB7CisgICAgICAgIHJldHVybiByYXdSb3V0aW5nUmVzcG9uc2VUeXBlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL0ludm9jYWJsZVZhbGlkYXRvci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvSW52b2NhYmxlVmFsaWRhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI3OWJmMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL0ludm9jYWJsZVZhbGlkYXRvci5qYXZhCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbDsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5FcnJvcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LlBlckxvb2t1cDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuUHJvdmlkZXJzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKKworLyoqCisgKiBWYWxpZGF0b3IgZW5zdXJpbmcgdGhhdCB7QGxpbmsgSW52b2NhYmxlIGludm9jYWJsZX0gYW5kIHtAbGluayBIYW5kbGVyQ29uc3RydWN0b3IgY29uc3RydWN0b3J9IGlzIGNvcnJlY3RseSBkZWZpbmVkIChmb3IKKyAqIGV4YW1wbGUgY29ycmVjdGx5IGFubm90YXRlZCB3aXRoIHNjb3BlIGFubm90YXRpb24pLiBUaGlzIHZhbGlkYXRvciBpcyBzdGF0ZWZ1bCBhbmQgdGhlcmVmb3JlIG5ldyBpbnN0YW5jZSBtdXN0IGJlIGNyZWF0ZWQKKyAqIGZvciBlYWNoIHJlc291cmNlIG1vZGVsIHZhbGlkYXRpb24uCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICoKKyAqLworY2xhc3MgSW52b2NhYmxlVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZU1vZGVsVmlzaXRvciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PENsYXNzPD8+PiBTQ09QRV9BTk5PVEFUSU9OUyA9IGdldFNjb3BlQW5ub3RhdGlvbnMoKTsKKyAgICAvKioKKyAgICAgKiBDbGFzc2VzIHRoYXQgaGF2ZSBiZWVuIGNoZWNrZWQgYWxyZWFkeS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgU2V0PENsYXNzPD8+PiBjaGVja2VkQ2xhc3NlcyA9IG5ldyBIYXNoU2V0PENsYXNzPD8+PigpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgU2V0PENsYXNzPD8+PiBnZXRTY29wZUFubm90YXRpb25zKCkgeworICAgICAgICBTZXQ8Q2xhc3M8Pz4+IHNjb3BlQW5ub3RhdGlvbnMgPSBuZXcgSGFzaFNldDxDbGFzczw/Pj4oKTsKKyAgICAgICAgc2NvcGVBbm5vdGF0aW9ucy5hZGQoU2luZ2xldG9uLmNsYXNzKTsKKyAgICAgICAgc2NvcGVBbm5vdGF0aW9ucy5hZGQoUGVyTG9va3VwLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIHNjb3BlQW5ub3RhdGlvbnM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRJbnZvY2FibGUoZmluYWwgSW52b2NhYmxlIGludm9jYWJsZSkgeworICAgICAgICAvLyBUT0RPOiBjaGVjayBpbnZvY2FibGUuCisgICAgICAgIENsYXNzIHJlc0NsYXNzID0gaW52b2NhYmxlLmdldEhhbmRsZXIoKS5nZXRIYW5kbGVyQ2xhc3MoKTsKKyAgICAgICAgaWYgKHJlc0NsYXNzICE9IG51bGwgJiYgIWNoZWNrZWRDbGFzc2VzLmNvbnRhaW5zKHJlc0NsYXNzKSkgeworICAgICAgICAgICAgY2hlY2tlZENsYXNzZXMuYWRkKHJlc0NsYXNzKTsKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcHJvdmlkZXIgPSBQcm92aWRlcnMuaXNQcm92aWRlcihyZXNDbGFzcyk7CisgICAgICAgICAgICBpbnQgY291bnRlciA9IDA7CisgICAgICAgICAgICBmb3IgKEFubm90YXRpb24gYW5ub3RhdGlvbiA6IHJlc0NsYXNzLmdldEFubm90YXRpb25zKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoU0NPUEVfQU5OT1RBVElPTlMuY29udGFpbnMoYW5ub3RhdGlvbi5hbm5vdGF0aW9uVHlwZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBjb3VudGVyKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNvdW50ZXIgPT0gMCAmJiBwcm92aWRlcikgeworICAgICAgICAgICAgICAgIEVycm9ycy53YXJuaW5nKHJlc0NsYXNzLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5SRVNPVVJDRV9JTVBMRU1FTlRTX1BST1ZJREVSKHJlc0NsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgUHJvdmlkZXJzLmdldFByb3ZpZGVyQ29udHJhY3RzKHJlc0NsYXNzKSkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjb3VudGVyID4gMSkgeworICAgICAgICAgICAgICAgIEVycm9ycy5mYXRhbChyZXNDbGFzcywgTG9jYWxpemF0aW9uTWVzc2FnZXMuUkVTT1VSQ0VfTVVMVElQTEVfU0NPUEVfQU5OT1RBVElPTlMocmVzQ2xhc3MpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiB0aGUgcmVzb3VyY2UgY2xhc3MgaXMgZGVjbGFyZWQgdG8gYmUgYSBzaW5nbGV0b24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VDbGFzcyByZXNvdXJjZSBjbGFzcy4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgcmVzb3VyY2UgY2xhc3MgaXMgYSBzaW5nbGV0b24sIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1NpbmdsZXRvbihDbGFzczw/PiByZXNvdXJjZUNsYXNzKSB7CisgICAgICAgIHJldHVybiByZXNvdXJjZUNsYXNzLmlzQW5ub3RhdGlvblByZXNlbnQoU2luZ2xldG9uLmNsYXNzKQorICAgICAgICAgICAgICAgIHx8IChQcm92aWRlcnMuaXNQcm92aWRlcihyZXNvdXJjZUNsYXNzKSAmJiAhcmVzb3VyY2VDbGFzcy5pc0Fubm90YXRpb25QcmVzZW50KFBlckxvb2t1cC5jbGFzcykpOworICAgIH0KKworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRSZXNvdXJjZUhhbmRsZXJDb25zdHJ1Y3RvcihmaW5hbCBIYW5kbGVyQ29uc3RydWN0b3IgY29uc3RydWN0b3IpIHsKKyAgICAgICAgQ2xhc3M8Pz4gcmVzQ2xhc3MgPSBjb25zdHJ1Y3Rvci5nZXRDb25zdHJ1Y3RvcigpLmdldERlY2xhcmluZ0NsYXNzKCk7CisgICAgICAgIGJvb2xlYW4gaXNTaW5nbGV0b24gPSBpc1NpbmdsZXRvbihyZXNDbGFzcyk7CisgICAgICAgIGludCBwYXJhbUNvdW50ID0gMDsKKyAgICAgICAgZm9yIChQYXJhbWV0ZXIgcCA6IGNvbnN0cnVjdG9yLmdldFBhcmFtZXRlcnMoKSkgeworICAgICAgICAgICAgUmVzb3VyY2VNZXRob2RWYWxpZGF0b3IudmFsaWRhdGVQYXJhbWV0ZXIocCwgY29uc3RydWN0b3IuZ2V0Q29uc3RydWN0b3IoKSwgY29uc3RydWN0b3IuZ2V0Q29uc3RydWN0b3IoKQorICAgICAgICAgICAgICAgICAgICAudG9HZW5lcmljU3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcoKytwYXJhbUNvdW50KSwgaXNTaW5nbGV0b24pOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvLyBUT0RPOiB2YWxpZGF0ZSBhbHNvIG1ldGhvZCBoYW5kbGVyLgorCisKK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL01ldGhvZEhhbmRsZXIuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL01ldGhvZEhhbmRsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGFlYTFiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvTWV0aG9kSGFuZGxlci5qYXZhCkBAIC0wLDAgKzEsMzQzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuRW5jb2RlZDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25zOworCisvKioKKyAqIFJlc291cmNlIG1ldGhvZCBoYW5kbGVyIG1vZGVsLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBNZXRob2RIYW5kbGVyIGltcGxlbWVudHMgUmVzb3VyY2VNb2RlbENvbXBvbmVudCB7CisKKyAgICBwcml2YXRlIGZpbmFsIENvbGxlY3Rpb248UGFyYW1ldGVyPiBoYW5kbGVyUGFyYW1ldGVyczsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgaW5zdGFuY2Ugb2YgYSByZXNvdXJjZSBtZXRob2QgaGFuZGxlciBtb2RlbC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTWV0aG9kSGFuZGxlcigpIHsKKyAgICAgICAgdGhpcy5oYW5kbGVyUGFyYW1ldGVycyA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgaW5zdGFuY2Ugb2YgYSByZXNvdXJjZSBtZXRob2QgaGFuZGxlciBtb2RlbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIGhhbmRsZXIgcGFyYW1ldGVycyBhc3NvY2lhdGVkIGRpcmVjdGx5IHdpdGggdGhlIHJlc291cmNlIG1ldGhvZCBoYW5kbGVyCisgICAgICogICAgICAgICAgICAgICAgICAgKGUuZy4gY2xhc3MtbGV2ZWwgcHJvcGVydHkgc2V0dGVycyBhbmQgZmllbGRzKS4gTWF5IGJlIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgMi4yMAorICAgICAqLworICAgIHByb3RlY3RlZCBNZXRob2RIYW5kbGVyKGZpbmFsIENvbGxlY3Rpb248UGFyYW1ldGVyPiBwYXJhbWV0ZXJzKSB7CisKKyAgICAgICAgaWYgKHBhcmFtZXRlcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5oYW5kbGVyUGFyYW1ldGVycyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUNvbGxlY3Rpb24obmV3IEFycmF5TGlzdDw+KHBhcmFtZXRlcnMpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMuaGFuZGxlclBhcmFtZXRlcnMgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgY2xhc3MtYmFzZWQgbWV0aG9kIGhhbmRsZXIgZnJvbSBhIGNsYXNzLgorICAgICAqCisgICAgICogQHBhcmFtIGhhbmRsZXJDbGFzcyBtZXRob2QgaGFuZGxlciBjbGFzcy4KKyAgICAgKiBAcmV0dXJuIG5ldyBjbGFzcy1iYXNlZCBtZXRob2QgaGFuZGxlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE1ldGhvZEhhbmRsZXIgY3JlYXRlKGZpbmFsIENsYXNzPD8+IGhhbmRsZXJDbGFzcykgeworICAgICAgICByZXR1cm4gbmV3IENsYXNzQmFzZWRNZXRob2RIYW5kbGVyKGhhbmRsZXJDbGFzcywgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgY2xhc3MtYmFzZWQgbWV0aG9kIGhhbmRsZXIgZnJvbSBhIGNsYXNzLgorICAgICAqCisgICAgICogQHBhcmFtIGhhbmRsZXJDbGFzcyAgICAgICAgICAgICAgICAgbWV0aG9kIGhhbmRsZXIgY2xhc3MuCisgICAgICogQHBhcmFtIGtlZXBDb25zdHJ1Y3RvclBhcmFtc0VuY29kZWQgaWYgc2V0IHRvIHtAY29kZSB0cnVlfSwgYW55IGluamVjdGVkIGNvbnN0cnVjdG9yCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyBtdXN0IGJlIGtlcHQgZW5jb2RlZCBhbmQgbXVzdCBub3QgYmUgYXV0b21hdGljYWxseSBkZWNvZGVkLgorICAgICAqIEByZXR1cm4gbmV3IGNsYXNzLWJhc2VkIG1ldGhvZCBoYW5kbGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kSGFuZGxlciBjcmVhdGUoZmluYWwgQ2xhc3M8Pz4gaGFuZGxlckNsYXNzLCBmaW5hbCBib29sZWFuIGtlZXBDb25zdHJ1Y3RvclBhcmFtc0VuY29kZWQpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDbGFzc0Jhc2VkTWV0aG9kSGFuZGxlcihoYW5kbGVyQ2xhc3MsIGtlZXBDb25zdHJ1Y3RvclBhcmFtc0VuY29kZWQsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGluc3RhbmNlLWJhc2VkIChzaW5nbGV0b24pIG1ldGhvZCBoYW5kbGVyIGZyb20gYSBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBoYW5kbGVySW5zdGFuY2UgbWV0aG9kIGhhbmRsZXIgaW5zdGFuY2UgKHNpbmdsZXRvbikuCisgICAgICogQHJldHVybiBuZXcgaW5zdGFuY2UtYmFzZWQgbWV0aG9kIGhhbmRsZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBNZXRob2RIYW5kbGVyIGNyZWF0ZShmaW5hbCBPYmplY3QgaGFuZGxlckluc3RhbmNlKSB7CisgICAgICAgIHJldHVybiBuZXcgSW5zdGFuY2VCYXNlZE1ldGhvZEhhbmRsZXIoaGFuZGxlckluc3RhbmNlLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBpbnN0YW5jZS1iYXNlZCAoc2luZ2xldG9uKSBtZXRob2QgaGFuZGxlciBmcm9tIGEgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaGFuZGxlckluc3RhbmNlIG1ldGhvZCBoYW5kbGVyIGluc3RhbmNlIChzaW5nbGV0b24pLgorICAgICAqIEBwYXJhbSBoYW5kbGVyQ2xhc3MgICAgZGVjbGFyZWQgaGFuZGxlciBjbGFzcy4KKyAgICAgKiBAcmV0dXJuIG5ldyBpbnN0YW5jZS1iYXNlZCBtZXRob2QgaGFuZGxlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE1ldGhvZEhhbmRsZXIgY3JlYXRlKGZpbmFsIE9iamVjdCBoYW5kbGVySW5zdGFuY2UsIENsYXNzPD8+IGhhbmRsZXJDbGFzcykgeworICAgICAgICByZXR1cm4gbmV3IEluc3RhbmNlQmFzZWRNZXRob2RIYW5kbGVyKGhhbmRsZXJJbnN0YW5jZSwgaGFuZGxlckNsYXNzLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBjbGFzcy1iYXNlZCBtZXRob2QgaGFuZGxlciBmcm9tIGEgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaGFuZGxlckNsYXNzICAgICAgbWV0aG9kIGhhbmRsZXIgY2xhc3MuCisgICAgICogQHBhcmFtIGhhbmRsZXJQYXJhbWV0ZXJzIG1ldGhvZCBoYW5kbGVyIHBhcmFtZXRlcnMgKGUuZy4gY2xhc3MtbGV2ZWwgcHJvcGVydHkgc2V0dGVycyBhbmQgZmllbGRzKS4KKyAgICAgKiBAcmV0dXJuIG5ldyBjbGFzcy1iYXNlZCBtZXRob2QgaGFuZGxlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE1ldGhvZEhhbmRsZXIgY3JlYXRlKGZpbmFsIENsYXNzPD8+IGhhbmRsZXJDbGFzcywgZmluYWwgQ29sbGVjdGlvbjxQYXJhbWV0ZXI+IGhhbmRsZXJQYXJhbWV0ZXJzKSB7CisgICAgICAgIHJldHVybiBuZXcgQ2xhc3NCYXNlZE1ldGhvZEhhbmRsZXIoaGFuZGxlckNsYXNzLCBoYW5kbGVyUGFyYW1ldGVycyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgY2xhc3MtYmFzZWQgbWV0aG9kIGhhbmRsZXIgZnJvbSBhIGNsYXNzLgorICAgICAqCisgICAgICogQHBhcmFtIGhhbmRsZXJDbGFzcyAgICAgICAgICAgICAgICAgbWV0aG9kIGhhbmRsZXIgY2xhc3MuCisgICAgICogQHBhcmFtIGtlZXBDb25zdHJ1Y3RvclBhcmFtc0VuY29kZWQgaWYgc2V0IHRvIHtAY29kZSB0cnVlfSwgYW55IGluamVjdGVkIGNvbnN0cnVjdG9yCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyBtdXN0IGJlIGtlcHQgZW5jb2RlZCBhbmQgbXVzdCBub3QgYmUgYXV0b21hdGljYWxseSBkZWNvZGVkLgorICAgICAqIEBwYXJhbSBoYW5kbGVyUGFyYW1ldGVycyAgICAgICAgICAgIG1ldGhvZCBoYW5kbGVyIHBhcmFtZXRlcnMgKGUuZy4gY2xhc3MtbGV2ZWwgcHJvcGVydHkgc2V0dGVycyBhbmQgZmllbGRzKS4KKyAgICAgKiBAcmV0dXJuIG5ldyBjbGFzcy1iYXNlZCBtZXRob2QgaGFuZGxlci4KKyAgICAgKiBAc2luY2UgMi4yMAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kSGFuZGxlciBjcmVhdGUoZmluYWwgQ2xhc3M8Pz4gaGFuZGxlckNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBrZWVwQ29uc3RydWN0b3JQYXJhbXNFbmNvZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxQYXJhbWV0ZXI+IGhhbmRsZXJQYXJhbWV0ZXJzKSB7CisgICAgICAgIHJldHVybiBuZXcgQ2xhc3NCYXNlZE1ldGhvZEhhbmRsZXIoaGFuZGxlckNsYXNzLCBrZWVwQ29uc3RydWN0b3JQYXJhbXNFbmNvZGVkLCBoYW5kbGVyUGFyYW1ldGVycyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgaW5zdGFuY2UtYmFzZWQgKHNpbmdsZXRvbikgbWV0aG9kIGhhbmRsZXIgZnJvbSBhIGNsYXNzLgorICAgICAqCisgICAgICogQHBhcmFtIGhhbmRsZXJJbnN0YW5jZSAgIG1ldGhvZCBoYW5kbGVyIGluc3RhbmNlIChzaW5nbGV0b24pLgorICAgICAqIEBwYXJhbSBoYW5kbGVyUGFyYW1ldGVycyBtZXRob2QgaGFuZGxlciBwYXJhbWV0ZXJzIChlLmcuIGNsYXNzLWxldmVsIHByb3BlcnR5IHNldHRlcnMgYW5kIGZpZWxkcykuCisgICAgICogQHJldHVybiBuZXcgaW5zdGFuY2UtYmFzZWQgbWV0aG9kIGhhbmRsZXIuCisgICAgICogQHNpbmNlIDIuMjAKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE1ldGhvZEhhbmRsZXIgY3JlYXRlKGZpbmFsIE9iamVjdCBoYW5kbGVySW5zdGFuY2UsIGZpbmFsIENvbGxlY3Rpb248UGFyYW1ldGVyPiBoYW5kbGVyUGFyYW1ldGVycykgeworICAgICAgICByZXR1cm4gbmV3IEluc3RhbmNlQmFzZWRNZXRob2RIYW5kbGVyKGhhbmRsZXJJbnN0YW5jZSwgaGFuZGxlclBhcmFtZXRlcnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGluc3RhbmNlLWJhc2VkIChzaW5nbGV0b24pIG1ldGhvZCBoYW5kbGVyIGZyb20gYSBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBoYW5kbGVySW5zdGFuY2UgICBtZXRob2QgaGFuZGxlciBpbnN0YW5jZSAoc2luZ2xldG9uKS4KKyAgICAgKiBAcGFyYW0gaGFuZGxlckNsYXNzICAgICAgZGVjbGFyZWQgaGFuZGxlciBjbGFzcy4KKyAgICAgKiBAcGFyYW0gaGFuZGxlclBhcmFtZXRlcnMgbWV0aG9kIGhhbmRsZXIgcGFyYW1ldGVycyAoZS5nLiBjbGFzcy1sZXZlbCBwcm9wZXJ0eSBzZXR0ZXJzIGFuZCBmaWVsZHMpLgorICAgICAqIEByZXR1cm4gbmV3IGluc3RhbmNlLWJhc2VkIG1ldGhvZCBoYW5kbGVyLgorICAgICAqIEBzaW5jZSAyLjIwCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBNZXRob2RIYW5kbGVyIGNyZWF0ZShmaW5hbCBPYmplY3QgaGFuZGxlckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gaGFuZGxlckNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxQYXJhbWV0ZXI+IGhhbmRsZXJQYXJhbWV0ZXJzKSB7CisgICAgICAgIHJldHVybiBuZXcgSW5zdGFuY2VCYXNlZE1ldGhvZEhhbmRsZXIoaGFuZGxlckluc3RhbmNlLCBoYW5kbGVyQ2xhc3MsIGhhbmRsZXJQYXJhbWV0ZXJzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHJlc291cmNlIG1ldGhvZCBoYW5kbGVyIGNsYXNzLgorICAgICAqCisgICAgICogQHJldHVybiByZXNvdXJjZSBtZXRob2QgaGFuZGxlciBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgQ2xhc3M8Pz4gZ2V0SGFuZGxlckNsYXNzKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHJlc291cmNlIG1ldGhvZCBoYW5kbGVyIGNvbnN0cnVjdG9ycy4KKyAgICAgKiA8cC8+CisgICAgICogVGhlIHJldHVybmVkIGlzIGVtcHR5IGJ5IGRlZmF1bHQuIENvbmNyZXRlIGltcGxlbWVudGF0aW9ucyBtYXkgb3ZlcnJpZGUKKyAgICAgKiB0aGUgbWV0aG9kIHRvIHJldHVybiB0aGUgYWN0dWFsIGxpc3Qgb2YgY29uc3RydWN0b3JzIHRoYXQgd2lsbCBiZSB1c2VkCisgICAgICogZm9yIHRoZSBoYW5kbGVyIGluaXRpYWxpemF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiByZXNvdXJjZSBtZXRob2QgaGFuZGxlciBjb25zdHJ1Y3RvcnMuCisgICAgICovCisgICAgcHVibGljIExpc3Q8SGFuZGxlckNvbnN0cnVjdG9yPiBnZXRDb25zdHJ1Y3RvcnMoKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGluamVjdGVkIHJlc291cmNlIG1ldGhvZCBoYW5kbGVyIGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIGluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uIG1hbmFnZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBpbmplY3QgZ2V0IHRoZSBpbnN0YW5jZS4KKyAgICAgKiBAcmV0dXJuIGluamVjdGVkIHJlc291cmNlIG1ldGhvZCBoYW5kbGVyIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgZ2V0SW5zdGFuY2UoZmluYWwgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB3aGV0aGVyIHRoZSBtZXRob2QgaGFuZGxlciB7QGxpbmsgSW5qZWN0aW9uTWFuYWdlciBjcmVhdGVzIGluc3RhbmNlc30KKyAgICAgKiBiYXNlZCBvbiB7QGxpbmsgQ2xhc3MgY2xhc3Nlc30uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRydWUgaXMgaW5zdGFuY2VzIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kIGhhbmRsZXIgYXJlIGNyZWF0ZWQgZnJvbSB7QGxpbmsgQ2xhc3MgY2xhc3Nlc30gZ2l2ZW4gdG8KKyAgICAgKiB7QGNvZGUgSW5qZWN0aW9uTWFuYWdlcn0sIGZhbHNlIG90aGVyd2lzZSAoZm9yIGV4YW1wbGUgd2hlbiBtZXRob2QgaGFuZGxlciB3YXMgaW5pdGlhbGl6ZWQgZnJvbSBpbnN0YW5jZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc0NsYXNzQmFzZWQoKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcGFyYW1ldGVycyBhc3NvY2lhdGVkIGRpcmVjdGx5IHdpdGggdGhlIHJlc291cmNlIG1ldGhvZCBoYW5kbGVyLCBpZiBhbnkKKyAgICAgKiAoZS5nLiBjbGFzcy1sZXZlbCBwcm9wZXJ0eSBzZXR0ZXJzIGFuZCBmaWVsZHMpLgorICAgICAqIDxwPgorICAgICAqIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBkb2VzIG5vdCByZXR1cm4gYW55IHBhcmFtZXRlcnMgYXNzb2NpYXRlZCB3aXRoCisgICAgICoge0BsaW5rICNnZXRDb25zdHJ1Y3RvcnMoKSBtZXRob2QgaGFuZGxlciBjb25zdHJ1Y3RvcnN9LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gcGFyYW1ldGVycyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlIG1ldGhvZCBoYW5kbGVyLiBNYXkgcmV0dXJuIGFuIGVtcHR5IGNvbGxlY3Rpb24KKyAgICAgKiBidXQgZG9lcyBub3QgcmV0dXJuIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgMi4yMAorICAgICAqLworICAgIHB1YmxpYyBDb2xsZWN0aW9uPFBhcmFtZXRlcj4gZ2V0UGFyYW1ldGVycygpIHsKKyAgICAgICAgcmV0dXJuIGhhbmRsZXJQYXJhbWV0ZXJzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PD8gZXh0ZW5kcyBSZXNvdXJjZU1vZGVsQ29tcG9uZW50PiBnZXRDb21wb25lbnRzKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhY2NlcHQoZmluYWwgUmVzb3VyY2VNb2RlbFZpc2l0b3IgdmlzaXRvcikgeworICAgICAgICB2aXNpdG9yLnZpc2l0TWV0aG9kSGFuZGxlcih0aGlzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDbGFzc0Jhc2VkTWV0aG9kSGFuZGxlciBleHRlbmRzIE1ldGhvZEhhbmRsZXIgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgQ2xhc3M8Pz4gaGFuZGxlckNsYXNzOworICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8SGFuZGxlckNvbnN0cnVjdG9yPiBoYW5kbGVyQ29uc3RydWN0b3JzOworCisgICAgICAgIHB1YmxpYyBDbGFzc0Jhc2VkTWV0aG9kSGFuZGxlcihmaW5hbCBDbGFzczw/PiBoYW5kbGVyQ2xhc3MsIGZpbmFsIENvbGxlY3Rpb248UGFyYW1ldGVyPiBoYW5kbGVyUGFyYW1ldGVycykgeworICAgICAgICAgICAgdGhpcyhoYW5kbGVyQ2xhc3MsIGhhbmRsZXJDbGFzcy5pc0Fubm90YXRpb25QcmVzZW50KEVuY29kZWQuY2xhc3MpLCBoYW5kbGVyUGFyYW1ldGVycyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ2xhc3NCYXNlZE1ldGhvZEhhbmRsZXIoZmluYWwgQ2xhc3M8Pz4gaGFuZGxlckNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBkaXNhYmxlUGFyYW1EZWNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbGxlY3Rpb248UGFyYW1ldGVyPiBoYW5kbGVyUGFyYW1ldGVycykgeworICAgICAgICAgICAgc3VwZXIoaGFuZGxlclBhcmFtZXRlcnMpOworCisgICAgICAgICAgICB0aGlzLmhhbmRsZXJDbGFzcyA9IGhhbmRsZXJDbGFzczsKKworICAgICAgICAgICAgTGlzdDxIYW5kbGVyQ29uc3RydWN0b3I+IGNvbnN0cnVjdG9ycyA9IG5ldyBMaW5rZWRMaXN0PEhhbmRsZXJDb25zdHJ1Y3Rvcj4oKTsKKyAgICAgICAgICAgIGZvciAoQ29uc3RydWN0b3I8Pz4gY29uc3RydWN0b3IgOiBoYW5kbGVyQ2xhc3MuZ2V0Q29uc3RydWN0b3JzKCkpIHsKKyAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcnMuYWRkKG5ldyBIYW5kbGVyQ29uc3RydWN0b3IoCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvciwgUGFyYW1ldGVyLmNyZWF0ZShoYW5kbGVyQ2xhc3MsIGhhbmRsZXJDbGFzcywgY29uc3RydWN0b3IsIGRpc2FibGVQYXJhbURlY29kaW5nKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcy5oYW5kbGVyQ29uc3RydWN0b3JzID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChjb25zdHJ1Y3RvcnMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDbGFzczw/PiBnZXRIYW5kbGVyQ2xhc3MoKSB7CisgICAgICAgICAgICByZXR1cm4gaGFuZGxlckNsYXNzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBMaXN0PEhhbmRsZXJDb25zdHJ1Y3Rvcj4gZ2V0Q29uc3RydWN0b3JzKCkgeworICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXJDb25zdHJ1Y3RvcnM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRJbnN0YW5jZShmaW5hbCBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBJbmplY3Rpb25zLmdldE9yQ3JlYXRlKGluamVjdGlvbk1hbmFnZXIsIGhhbmRsZXJDbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDbGFzc0Jhc2VkKCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBnZXRIYW5kbGVySW5zdGFuY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTGlzdDw/IGV4dGVuZHMgUmVzb3VyY2VNb2RlbENvbXBvbmVudD4gZ2V0Q29tcG9uZW50cygpIHsKKyAgICAgICAgICAgIHJldHVybiBoYW5kbGVyQ29uc3RydWN0b3JzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIkNsYXNzQmFzZWRNZXRob2RIYW5kbGVyeyIKKyAgICAgICAgICAgICAgICAgICAgKyAiaGFuZGxlckNsYXNzPSIgKyBoYW5kbGVyQ2xhc3MKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBoYW5kbGVyQ29uc3RydWN0b3JzPSIgKyBoYW5kbGVyQ29uc3RydWN0b3JzICsgJ30nOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSW5zdGFuY2VCYXNlZE1ldGhvZEhhbmRsZXIgZXh0ZW5kcyBNZXRob2RIYW5kbGVyIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBoYW5kbGVyOworICAgICAgICBwcml2YXRlIGZpbmFsIENsYXNzPD8+IGhhbmRsZXJDbGFzczsKKworICAgICAgICBwdWJsaWMgSW5zdGFuY2VCYXNlZE1ldGhvZEhhbmRsZXIoZmluYWwgT2JqZWN0IGhhbmRsZXIsIGZpbmFsIENvbGxlY3Rpb248UGFyYW1ldGVyPiBoYW5kbGVyUGFyYW1ldGVycykgeworICAgICAgICAgICAgc3VwZXIoaGFuZGxlclBhcmFtZXRlcnMpOworCisgICAgICAgICAgICB0aGlzLmhhbmRsZXIgPSBoYW5kbGVyOworICAgICAgICAgICAgdGhpcy5oYW5kbGVyQ2xhc3MgPSBoYW5kbGVyLmdldENsYXNzKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSW5zdGFuY2VCYXNlZE1ldGhvZEhhbmRsZXIoZmluYWwgT2JqZWN0IGhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiBoYW5kbGVyQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPFBhcmFtZXRlcj4gaGFuZGxlclBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgIHN1cGVyKGhhbmRsZXJQYXJhbWV0ZXJzKTsKKworICAgICAgICAgICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcjsKKyAgICAgICAgICAgIHRoaXMuaGFuZGxlckNsYXNzID0gaGFuZGxlckNsYXNzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDbGFzczw/PiBnZXRIYW5kbGVyQ2xhc3MoKSB7CisgICAgICAgICAgICByZXR1cm4gaGFuZGxlckNsYXNzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0SGFuZGxlckluc3RhbmNlKCkgeworICAgICAgICAgICAgcmV0dXJuIGhhbmRsZXI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRJbnN0YW5jZShmaW5hbCBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBoYW5kbGVyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ2xhc3NCYXNlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJJbnN0YW5jZUJhc2VkTWV0aG9kSGFuZGxlcnsiCisgICAgICAgICAgICAgICAgICAgICsgImhhbmRsZXI9IiArIGhhbmRsZXIKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBoYW5kbGVyQ2xhc3M9IiArIGhhbmRsZXJDbGFzcworICAgICAgICAgICAgICAgICAgICArICd9JzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcmF3IGhhbmRsZXIgaW5zdGFuY2UgdGhhdCBpcyBiYWNraW5nIHRoaXMgbWV0aG9kIGhhbmRsZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHJhdyBoYW5kbGVyIGluc3RhbmNlLiBNYXkgcmV0dXJuIHtAY29kZSBudWxsfSBpZiB0aGUgaGFuZGxlciBpcworICAgICAqIHtAbGluayAjaXNDbGFzc0Jhc2VkKCkgY2xhc3MtYmFzZWR9LgorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBPYmplY3QgZ2V0SGFuZGxlckluc3RhbmNlKCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9NZXRob2RMaXN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9NZXRob2RMaXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ4ZmMwNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL01ldGhvZExpc3QuamF2YQpAQCAtMCwwICsxLDMzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWw7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUmVmbGVjdGlvbkhlbHBlcjsKKworLyoqCisgKiBJdGVyYWJsZSBsaXN0IG9mIG1ldGhvZHMgb24gYSBzaW5nbGUgY2xhc3Mgd2l0aCBjb252ZW5pZW5jZSBnZXR0ZXJzIGZvcgorICogYWRkaXRpb25hbCBtZXRob2QgaW5mb3JtYXRpb24uCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE1ldGhvZExpc3QgaW1wbGVtZW50cyBJdGVyYWJsZTxBbm5vdGF0ZWRNZXRob2Q+IHsKKworICAgIHByaXZhdGUgQW5ub3RhdGVkTWV0aG9kW10gbWV0aG9kczsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgbWV0aG9kIGxpc3QgZm9yIGEgY2xhc3MuCisgICAgICoKKyAgICAgKiBUaGUgbWV0aG9kIGxpc3QgY29udGFpbnMge0BsaW5rIENsYXNzI2dldE1ldGhvZHMoKSBhbGwgbWV0aG9kc30gYXZhaWxhYmxlCisgICAgICogb24gdGhlIGNsYXNzLgorICAgICAqCisgICAgICogVGhlIHtAbGluayBNZXRob2QjaXNCcmlkZ2UoKSBicmlkZ2UgbWV0aG9kc30gYW5kIG1ldGhvZHMgZGVjbGFyZWQgZGlyZWN0bHkKKyAgICAgKiBvbiB0aGUge0BsaW5rIE9iamVjdH0gY2xhc3MgYXJlIGZpbHRlcmVkIG91dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjIGNsYXNzIGZyb20gd2hpY2ggdGhlIG1ldGhvZCBsaXN0IGlzIGNyZWF0ZWQuCisgICAgICovCisgICAgcHVibGljIE1ldGhvZExpc3QoQ2xhc3M8Pz4gYykgeworICAgICAgICB0aGlzKGMsIGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IG1ldGhvZCBsaXN0IGZvciBhIGNsYXNzLgorICAgICAqCisgICAgICogVGhlIG1ldGhvZCBsaXN0IGNvbnRhaW5zIHtAbGluayBDbGFzcyNnZXRNZXRob2RzKCkgYWxsIG1ldGhvZHN9IGF2YWlsYWJsZQorICAgICAqIG9uIHRoZSBjbGFzcyBvciB7QGxpbmsgQ2xhc3MjZ2V0RGVjbGFyZWRNZXRob2RzKCkgZGVjbGFyZWQgbWV0aG9kc30gb25seSwKKyAgICAgKiBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIHRoZSB7QGNvZGUgZGVjbGFyZWRNZXRob2RzfSBwYXJhbWV0ZXIuCisgICAgICoKKyAgICAgKiBUaGUge0BsaW5rIE1ldGhvZCNpc0JyaWRnZSgpIGJyaWRnZSBtZXRob2RzfSBhbmQgbWV0aG9kcyBkZWNsYXJlZCBkaXJlY3RseQorICAgICAqIG9uIHRoZSB7QGxpbmsgT2JqZWN0fSBjbGFzcyBhcmUgZmlsdGVyZWQgb3V0LgorICAgICAqCisgICAgICogQHBhcmFtIGMgY2xhc3MgZnJvbSB3aGljaCB0aGUgbWV0aG9kIGxpc3QgaXMgY3JlYXRlZC4KKyAgICAgKiBAcGFyYW0gZGVjbGFyZWRNZXRob2RzIGlmIHtAY29kZSB0cnVlfSBvbmx5IHRoZSB7QGxpbmsgQ2xhc3MjZ2V0RGVjbGFyZWRNZXRob2RzKCkKKyAgICAgKiAgICAgZGVjbGFyZWQgbWV0aG9kc30gd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgbWV0aG9kIGxpc3Q7IG90aGVyd2lzZQorICAgICAqICAgICB7QGxpbmsgQ2xhc3MjZ2V0TWV0aG9kcygpIGFsbCBtZXRob2RzfSB3aWxsIGJlIGxpc3RlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0aG9kTGlzdChDbGFzczw/PiBjLCBib29sZWFuIGRlY2xhcmVkTWV0aG9kcykgeworICAgICAgICB0aGlzKGRlY2xhcmVkTWV0aG9kcyA/IGdldEFsbERlY2xhcmVkTWV0aG9kcyhjKSA6IGdldE1ldGhvZHMoYykpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIExpc3Q8TWV0aG9kPiBnZXRBbGxEZWNsYXJlZE1ldGhvZHMoQ2xhc3M8Pz4gYykgeworICAgICAgICBMaXN0PE1ldGhvZD4gbCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICB3aGlsZSAoYyAhPSBudWxsICYmIGMgIT0gT2JqZWN0LmNsYXNzKSB7CisgICAgICAgICAgICBsLmFkZEFsbChBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChSZWZsZWN0aW9uSGVscGVyLmdldERlY2xhcmVkTWV0aG9kc1BBKGMpKSk7CisgICAgICAgICAgICBjID0gYy5nZXRTdXBlcmNsYXNzKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxNZXRob2Q+IGdldE1ldGhvZHMoQ2xhc3M8Pz4gYykgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChjLmdldE1ldGhvZHMoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyBtZXRob2QgbGlzdCBmcm9tIHRoZSBnaXZlbiBjb2xsZWN0aW9uIG9mIG1ldGhvZHMuCisgICAgICoKKyAgICAgKiBUaGUge0BsaW5rIE1ldGhvZCNpc0JyaWRnZSgpIGJyaWRnZSBtZXRob2RzfSBhbmQgbWV0aG9kcyBkZWNsYXJlZCBkaXJlY3RseQorICAgICAqIG9uIHRoZSB7QGxpbmsgT2JqZWN0fSBjbGFzcyBhcmUgZmlsdGVyZWQgb3V0LgorICAgICAqCisgICAgICogQHBhcmFtIG1ldGhvZHMgbWV0aG9kcyB0byBiZSBpbmNsdWRlZCBpbiB0aGUgbWV0aG9kIGxpc3QuCisgICAgICovCisgICAgcHVibGljIE1ldGhvZExpc3QoQ29sbGVjdGlvbjxNZXRob2Q+IG1ldGhvZHMpIHsKKyAgICAgICAgTGlzdDxBbm5vdGF0ZWRNZXRob2Q+IGwgPSBuZXcgQXJyYXlMaXN0PD4obWV0aG9kcy5zaXplKCkpOworICAgICAgICBmb3IgKE1ldGhvZCBtIDogbWV0aG9kcykgeworICAgICAgICAgICAgaWYgKCFtLmlzQnJpZGdlKCkgJiYgbS5nZXREZWNsYXJpbmdDbGFzcygpICE9IE9iamVjdC5jbGFzcykgeworICAgICAgICAgICAgICAgIGwuYWRkKG5ldyBBbm5vdGF0ZWRNZXRob2QobSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdGhpcy5tZXRob2RzID0gbmV3IEFubm90YXRlZE1ldGhvZFtsLnNpemUoKV07CisgICAgICAgIHRoaXMubWV0aG9kcyA9IGwudG9BcnJheSh0aGlzLm1ldGhvZHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgbWV0aG9kIGxpc3QgZnJvbSB0aGUgZ2l2ZW4gYXJyYXkgb2YgbWV0aG9kcy4KKyAgICAgKgorICAgICAqIFRoZSB7QGxpbmsgTWV0aG9kI2lzQnJpZGdlKCkgYnJpZGdlIG1ldGhvZHN9IGFuZCBtZXRob2RzIGRlY2xhcmVkIGRpcmVjdGx5CisgICAgICogb24gdGhlIHtAbGluayBPYmplY3R9IGNsYXNzIGFyZSBmaWx0ZXJlZCBvdXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWV0aG9kcyBtZXRob2RzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBtZXRob2QgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0aG9kTGlzdChNZXRob2QuLi4gbWV0aG9kcykgeworICAgICAgICB0aGlzKEFycmF5cy5hc0xpc3QobWV0aG9kcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgbWV0aG9kIGxpc3QgZnJvbSB0aGUgZ2l2ZW4gYXJyYXkgb2Yge0BsaW5rIEFubm90YXRlZE1ldGhvZAorICAgICAqIGFubm90YXRlZCBtZXRob2RzfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXRob2RzIG1ldGhvZHMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIG1ldGhvZCBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyBNZXRob2RMaXN0KEFubm90YXRlZE1ldGhvZC4uLiBtZXRob2RzKSB7CisgICAgICAgIHRoaXMubWV0aG9kcyA9IG1ldGhvZHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogSXRlcmF0b3Igb3ZlciB0aGUgbGlzdCBvZiB7QGxpbmsgQW5ub3RhdGVkTWV0aG9kIGFubm90YXRlZCBtZXRob2RzfSBjb250YWluZWQKKyAgICAgKiBpbiB0aGlzIG1ldGhvZCBsaXN0LgorICAgICAqCisgICAgICogQHJldHVybiBtZXRob2QgbGlzdCBpdGVyYXRvci4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSXRlcmF0b3I8QW5ub3RhdGVkTWV0aG9kPiBpdGVyYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobWV0aG9kcykuaXRlcmF0b3IoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBuZXcgc3ViLWxpc3Qgb2YgbWV0aG9kcyBjb250YWluaW5nIGFsbCB0aGUgbWV0aG9kcyBmcm9tIHRoaXMgbWV0aG9kCisgICAgICogbGlzdCB0aGF0IGFyZSBub3QgcHVibGljLgorICAgICAqCisgICAgICogQHJldHVybiBuZXcgZmlsdGVyZWQgbWV0aG9kIHN1Yi1saXN0LgorICAgICAqLworICAgIHB1YmxpYyBNZXRob2RMaXN0IGlzTm90UHVibGljKCkgeworICAgICAgICByZXR1cm4gZmlsdGVyKG5ldyBGaWx0ZXIoKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4ga2VlcChBbm5vdGF0ZWRNZXRob2QgbSkgeworICAgICAgICAgICAgICAgIHJldHVybiAhTW9kaWZpZXIuaXNQdWJsaWMobS5nZXRNZXRob2QoKS5nZXRNb2RpZmllcnMoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIG5ldyBzdWItbGlzdCBvZiBtZXRob2RzIGNvbnRhaW5pbmcgYWxsIHRoZSBtZXRob2RzIGZyb20gdGhpcyBtZXRob2QKKyAgICAgKiBsaXN0IHRoYXQgaGF2ZSB0aGUgc3BlY2lmaWMgbnVtYmVyIG9mIHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyYW1Db3VudCBudW1iZXIgb2YgbWV0aG9kIHBhcmFtZXRlcnMuCisgICAgICogQHJldHVybiBuZXcgZmlsdGVyZWQgbWV0aG9kIHN1Yi1saXN0LgorICAgICAqLworICAgIHB1YmxpYyBNZXRob2RMaXN0IGhhc051bVBhcmFtcyhmaW5hbCBpbnQgcGFyYW1Db3VudCkgeworICAgICAgICByZXR1cm4gZmlsdGVyKG5ldyBGaWx0ZXIoKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4ga2VlcChBbm5vdGF0ZWRNZXRob2QgbSkgeworICAgICAgICAgICAgICAgIHJldHVybiBtLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IHBhcmFtQ291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIG5ldyBzdWItbGlzdCBvZiBtZXRob2RzIGNvbnRhaW5pbmcgYWxsIHRoZSBtZXRob2RzIGZyb20gdGhpcyBtZXRob2QKKyAgICAgKiBsaXN0IHRoYXQgZGVjbGFyZSB0aGUgc3BlY2lmaWVkIHJldHVybiB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIHJldHVyblR5cGUgbWV0aG9kIHJldHVybiB0eXBlLgorICAgICAqIEByZXR1cm4gbmV3IGZpbHRlcmVkIG1ldGhvZCBzdWItbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0aG9kTGlzdCBoYXNSZXR1cm5UeXBlKGZpbmFsIENsYXNzPD8+IHJldHVyblR5cGUpIHsKKyAgICAgICAgcmV0dXJuIGZpbHRlcihuZXcgRmlsdGVyKCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGtlZXAoQW5ub3RhdGVkTWV0aG9kIG0pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbS5nZXRNZXRob2QoKS5nZXRSZXR1cm5UeXBlKCkgPT0gcmV0dXJuVHlwZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgbmV3IHN1Yi1saXN0IG9mIG1ldGhvZHMgY29udGFpbmluZyBhbGwgdGhlIG1ldGhvZHMgZnJvbSB0aGlzIG1ldGhvZAorICAgICAqIGxpc3Qgd2l0aCBhIHNwZWNpZmllZCBtZXRob2QgbmFtZSBwcmVmaXguCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJlZml4IG1ldGhvZCBuYW1lIHByZWZpeC4KKyAgICAgKiBAcmV0dXJuIG5ldyBmaWx0ZXJlZCBtZXRob2Qgc3ViLWxpc3QuCisgICAgICovCisgICAgcHVibGljIE1ldGhvZExpc3QgbmFtZVN0YXJ0c1dpdGgoZmluYWwgU3RyaW5nIHByZWZpeCkgeworICAgICAgICByZXR1cm4gZmlsdGVyKG5ldyBGaWx0ZXIoKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4ga2VlcChBbm5vdGF0ZWRNZXRob2QgbSkgeworICAgICAgICAgICAgICAgIHJldHVybiBtLmdldE1ldGhvZCgpLmdldE5hbWUoKS5zdGFydHNXaXRoKHByZWZpeCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIG5ldyBzdWItbGlzdCBvZiBtZXRob2RzIGNvbnRhaW5pbmcgYWxsIHRoZSBtZXRob2RzIGZyb20gdGhpcyBtZXRob2QKKyAgICAgKiBsaXN0IHdpdGggYSBzcGVjaWZpZWQgbWV0aG9kLWxldmVsIGFubm90YXRpb24gZGVjbGFyZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gPFQ+IGFubm90YXRpb24gdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIGFubm90YXRpb24gY2xhc3MuCisgICAgICogQHJldHVybiBuZXcgZmlsdGVyZWQgbWV0aG9kIHN1Yi1saXN0LgorICAgICAqLworICAgIHB1YmxpYyA8VCBleHRlbmRzIEFubm90YXRpb24+IE1ldGhvZExpc3Qgd2l0aEFubm90YXRpb24oZmluYWwgQ2xhc3M8VD4gYW5ub3RhdGlvbikgeworICAgICAgICByZXR1cm4gZmlsdGVyKG5ldyBGaWx0ZXIoKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4ga2VlcChBbm5vdGF0ZWRNZXRob2QgbSkgeworICAgICAgICAgICAgICAgIHJldHVybiBtLmdldEFubm90YXRpb24oYW5ub3RhdGlvbikgIT0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgbmV3IHN1Yi1saXN0IG9mIG1ldGhvZHMgY29udGFpbmluZyBhbGwgdGhlIG1ldGhvZHMgZnJvbSB0aGlzIG1ldGhvZAorICAgICAqIGxpc3Qgd2l0aCBhIG1ldGhvZC1sZXZlbCBhbm5vdGF0aW9uIGRlY2xhcmVkIHRoYXQgaXMgaXRzZWxmIGFubm90YXRlZCB3aXRoCisgICAgICogYSBzcGVjaWZpZWQgbWV0YS1hbm5vdGF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIDxUPiBtZXRhLWFubm90YXRpb24gdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIG1ldGEtYW5ub3RhdGlvbiBjbGFzcy4KKyAgICAgKiBAcmV0dXJuIG5ldyBmaWx0ZXJlZCBtZXRob2Qgc3ViLWxpc3QuCisgICAgICovCisgICAgcHVibGljIDxUIGV4dGVuZHMgQW5ub3RhdGlvbj4gTWV0aG9kTGlzdCB3aXRoTWV0YUFubm90YXRpb24oZmluYWwgQ2xhc3M8VD4gYW5ub3RhdGlvbikgeworICAgICAgICByZXR1cm4gZmlsdGVyKG5ldyBGaWx0ZXIoKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4ga2VlcChBbm5vdGF0ZWRNZXRob2QgbSkgeworICAgICAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbiBhIDogbS5nZXRBbm5vdGF0aW9ucygpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChhLmFubm90YXRpb25UeXBlKCkuZ2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIG5ldyBzdWItbGlzdCBvZiBtZXRob2RzIGNvbnRhaW5pbmcgYWxsIHRoZSBtZXRob2RzIGZyb20gdGhpcyBtZXRob2QKKyAgICAgKiBsaXN0IHdpdGhvdXQgYSBzcGVjaWZpZWQgbWV0aG9kLWxldmVsIGFubm90YXRpb24gZGVjbGFyZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gPFQ+IGFubm90YXRpb24gdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIGFubm90YXRpb24gY2xhc3MuCisgICAgICogQHJldHVybiBuZXcgZmlsdGVyZWQgbWV0aG9kIHN1Yi1saXN0LgorICAgICAqLworICAgIHB1YmxpYyA8VCBleHRlbmRzIEFubm90YXRpb24+IE1ldGhvZExpc3Qgd2l0aG91dEFubm90YXRpb24oZmluYWwgQ2xhc3M8VD4gYW5ub3RhdGlvbikgeworICAgICAgICByZXR1cm4gZmlsdGVyKG5ldyBGaWx0ZXIoKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4ga2VlcChBbm5vdGF0ZWRNZXRob2QgbSkgeworICAgICAgICAgICAgICAgIHJldHVybiBtLmdldEFubm90YXRpb24oYW5ub3RhdGlvbikgPT0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgbmV3IHN1Yi1saXN0IG9mIG1ldGhvZHMgY29udGFpbmluZyBhbGwgdGhlIG1ldGhvZHMgZnJvbSB0aGlzIG1ldGhvZAorICAgICAqIGxpc3Qgd2l0aG91dCBhbnkgbWV0aG9kLWxldmVsIGFubm90YXRpb24gZGVjbGFyZWQgdGhhdCB3b3VsZCBpdHNlbGYgYmUKKyAgICAgKiBhbm5vdGF0ZWQgd2l0aCBhIHNwZWNpZmllZCBtZXRhLWFubm90YXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gPFQ+IG1ldGEtYW5ub3RhdGlvbiB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIGFubm90YXRpb24gbWV0YS1hbm5vdGF0aW9uIGNsYXNzLgorICAgICAqIEByZXR1cm4gbmV3IGZpbHRlcmVkIG1ldGhvZCBzdWItbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgPFQgZXh0ZW5kcyBBbm5vdGF0aW9uPiBNZXRob2RMaXN0IHdpdGhvdXRNZXRhQW5ub3RhdGlvbihmaW5hbCBDbGFzczxUPiBhbm5vdGF0aW9uKSB7CisgICAgICAgIHJldHVybiBmaWx0ZXIobmV3IEZpbHRlcigpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBrZWVwKEFubm90YXRlZE1ldGhvZCBtKSB7CisgICAgICAgICAgICAgICAgZm9yIChBbm5vdGF0aW9uIGEgOiBtLmdldEFubm90YXRpb25zKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGEuYW5ub3RhdGlvblR5cGUoKS5nZXRBbm5vdGF0aW9uKGFubm90YXRpb24pICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWV0aG9kIGxpc3QgZmlsdGVyLgorICAgICAqCisgICAgICogQHNlZSBNZXRob2RMaXN0I2ZpbHRlcihGaWx0ZXIpCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBGaWx0ZXIgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBEZWNpZGUgd2hldGhlciB0aGUgbWV0aG9kIHNob3VsZCByZW1haW4gaW4gdGhlIGxpc3Qgb3Igc2hvdWxkIGJlIGZpbHRlcmVkCisgICAgICAgICAqIG91dC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG1ldGhvZCBhbm5vdGF0ZWQgbWV0aG9kLgorICAgICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgbWV0aG9kIHNob3VsZCBiZSBrZXB0IGluIHRoZSBtZXRob2QgbGlzdCwKKyAgICAgICAgICogICAgIHtAY29kZSBmYWxzZX0gaWYgaXQgc2hvdWxkIGJlIGZpbHRlcmVkIG91dC4KKyAgICAgICAgICovCisgICAgICAgIGJvb2xlYW4ga2VlcChBbm5vdGF0ZWRNZXRob2QgbWV0aG9kKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVkIGEgbmV3IG1ldGhvZCBsaXN0IGNvbnRhaW5pbmcgb25seSB0aGUgbWV0aG9kcyBzdXBwb3J0ZWQgYnkgdGhlCisgICAgICoge0BsaW5rIEZpbHRlciBtZXRob2QgbGlzdCBmaWx0ZXJ9LgorICAgICAqCisgICAgICogQHBhcmFtIGZpbHRlciBtZXRob2QgbGlzdCBmaWx0ZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIG5ldyBmaWx0ZXJlZCBtZXRob2QgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0aG9kTGlzdCBmaWx0ZXIoRmlsdGVyIGZpbHRlcikgeworICAgICAgICBMaXN0PEFubm90YXRlZE1ldGhvZD4gcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZvciAoQW5ub3RhdGVkTWV0aG9kIG0gOiBtZXRob2RzKSB7CisgICAgICAgICAgICBpZiAoZmlsdGVyLmtlZXAobSkpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkKG0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgTWV0aG9kTGlzdChyZXN1bHQudG9BcnJheShuZXcgQW5ub3RhdGVkTWV0aG9kW3Jlc3VsdC5zaXplKCldKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvTW9kZWxQcm9jZXNzb3IuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL01vZGVsUHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE1OTlkMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL01vZGVsUHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWw7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdHJhaW5lZFRvOworaW1wb3J0IGphdmF4LndzLnJzLlJ1bnRpbWVUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5Db250cmFjdDsKKworLyoqCisgKiBDb250cmFjdCBmb3IgYSBtb2RlbCBwcm9jZXNzb3JzIHRoYXQgcHJvY2Vzc2VzIHtAbGluayBSZXNvdXJjZU1vZGVsIHJlc291cmNlIG1vZGVsc30gZHVyaW5nIGFwcGxpY2F0aW9uIGluaXRpYWxpemF0aW9uCisgKiBhbmQge0BsaW5rIFJlc291cmNlIHJlc291cmNlfSByZXR1cm5lZCBieSBzdWIgcmVzb3VyY2UgbG9jYXRvcnMuIEV2ZW4gdGhvdWdoIHtAbGluayBNb2RlbFByb2Nlc3NvciBtb2RlbCBwcm9jZXNzb3JzfSBjYW4KKyAqIGNvbXBsZXRlbHkgY2hhbmdlIHRoZSByZXNvdXJjZSBtb2RlbCwgdGhlIHN0YW5kYXJkIHVzZSBjYXNlIGl0IHRvIGVuaGFuY2UgdGhlIGN1cnJlbnQgcmVzb3VyY2UgbW9kZWwgYnkKKyAqIGFkZGl0aW9uYWwgbWV0aG9kcyBhbmQgcmVzb3VyY2VzIChsaWtlIGZvciBleGFtcGxlIGFkZGluZyBPUFRJT05TIGh0dHAgbWV0aG9kcyBmb3IgZXZlcnkgVVJJIGVuZHBvaW50KS4KKyAqIDxwLz4KKyAqIE1vcmUgbW9kZWwgcHJvY2Vzc29ycyBjYW4gYmUgcmVnaXN0ZXJlZC4gVGhlc2UgcHJvdmlkZXJzIHdpbGwgYmUgZXhlY3V0ZSBpbiB0aGUgY2hhaW4gc28gdGhhdCBlYWNoIG1vZGVsCisgKiBwcm9jZXNzb3Igd2lsbCBiZSBleGVjdXRlZCB3aXRoIHJlc291cmNlIG1vZGVsIHByb2Nlc3NlZCBieSB0aGUgcHJldmlvdXMgbW9kZWwgcHJvY2Vzc29yLiBUaGUgZmlyc3QgbW9kZWwKKyAqIHByb2Nlc3NvciBpbiB0aGUgY2hhaW4gd2lsbCBiZSBpbnZva2VkIHdpdGggdGhlIGluaXRpYWwgcmVzb3VyY2UgbW9kZWwgZnJvbSB3aGljaCB0aGUgYXBwbGljYXRpb24gd2FzIGluaXRpYXRlZC4KKyAqIDxwLz4KKyAqIE1vZGVsIHByb2Nlc3NvcnMgaW1wbGVtZW50YXRpb25zIGNhbiBkZWZpbmUge0BsaW5rIGphdmF4LmFubm90YXRpb24uUHJpb3JpdHkgYmluZGluZyBwcmlvcml0eX0KKyAqIHRvIGRlZmluZSB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcmUgZXhlY3V0ZWQgKHByb2Nlc3NvcnMgd2l0aCBhIGxvd2VyIHByaW9yaXR5IGlzIGludm9rZWQKKyAqIGJlZm9yZSBwcm9jZXNzb3Igd2l0aCBhIGhpZ2hlciBwcmlvcml0eSkuIFRoZSBoaWdoZXN0IHBvc3NpYmxlIHByaW9yaXR5IChJbnRlZ2VyLk1BWF9WQUxVRSkgaXMgdXNlZCBmb3IKKyAqIG1vZGVsIHByb2Nlc3NvciB3aGljaCBlbmhhbmNlIHJlc291cmNlIG1vZGVscyBieSB0aGUgZGVmYXVsdCBPUFRJT05TIG1ldGhvZCBkZWZpbmVkIGJ5IEpBWC1SUyBzcGVjaWZpY2F0aW9uIGFuZCB0aGVyZWZvcmUKKyAqIHRoaXMgcHJpb3JpdHkgc2hvdWxkIG5vdCBiZSB1c2VkLgorICogPHAvPgorICogTm90ZSB0aGF0IGlmIG1vZGVsIHByb2Nlc3NvciBhZGRzIGEgcmVzb3VyY2VzIHRoYXQgYXJlIGludGVuZGVkIHRvIGJlIHN1cHBvcnRpdmUgcmVzb3VyY2VzIGxpa2UKKyAqIHtAY29kZSBPUFRJT05TfSBtZXRob2QgcHJvdmlkaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZXNvdXJjZSwgaXQgc2hvdWxkIHByb3Blcmx5IGRlZmluZSB0aGUKKyAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNZXRob2QjaXNFeHRlbmRlZCgpIGV4dGVuZGVkfSBmbGFnIG9mIHN1Y2ggYSBuZXcgbWV0aG9kLgorICogU2VlIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuRXh0ZW5kZWRSZXNvdXJjZX0gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICoKKyAqLworQENvbnRyYWN0CitAQ29uc3RyYWluZWRUbyhSdW50aW1lVHlwZS5TRVJWRVIpCitwdWJsaWMgaW50ZXJmYWNlIE1vZGVsUHJvY2Vzc29yIHsKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIHtAY29kZSByZXNvdXJjZU1vZGVsfSBhbmQgcmV0dXJuIHRoZSBwcm9jZXNzZWQgbW9kZWwuIFJldHVybmluZyBpbnB1dCB7QGNvZGUgcmVzb3VyY2VNb2RlbH0gd2lsbCBjYXVzZQorICAgICAqIG5vIGVmZmVjdCBvbiB0aGUgZmluYWwgcmVzb3VyY2UgbW9kZWwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VNb2RlbCBJbnB1dCByZXNvdXJjZSBtb2RlbCB0byBiZSBwcm9jZXNzZWQuCisgICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gUnVudGltZSBjb25maWd1cmF0aW9uLgorICAgICAqIEByZXR1cm4gUHJvY2Vzc2VkIHJlc291cmNlIG1vZGVsIGNvbnRhaW5pbmcgcm9vdCByZXNvdXJjZXMuIE5vbiByb290IHJlc291cmNlcyB3aWxsIGJlIGlnbm9yZWQuCisgICAgICovCisgICAgcHVibGljIFJlc291cmNlTW9kZWwgcHJvY2Vzc1Jlc291cmNlTW9kZWwoUmVzb3VyY2VNb2RlbCByZXNvdXJjZU1vZGVsLCBDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pOworCisgICAgLyoqCisgICAgICogUHJvY2VzcyB7QGNvZGUgc3ViUmVzb3VyY2VNb2RlbH0gd2hpY2ggd2FzIHJldHVybmVkIGEgc3ViIHJlc291cmNlIGxvY2F0b3IuCisgICAgICogPHAvPgorICAgICAqIFRoZSB7QGNvZGUgc3ViUmVzb3VyY2VNb2RlbH0gY29udGFpbnMgb25seSBvbmUge0BsaW5rIFJlc291cmNlIHJlc291cmNlfSByZXByZXNlbnRpbmcgbW9kZWwgdGhhdCBzaG91bGQgYmUgcHJvY2Vzc2VkCisgICAgICogYnkgZnVydGhlciBtYXRjaGluZy4gVGhlIG1ldGhvZCBtdXN0IHJldHVybiBhbHNvIGV4YWN0bHkgb25lIHJlc291cmNlIGluIHRoZSBtb2RlbC4gUmV0dXJuaW5nIGlucHV0CisgICAgICoge0Bjb2RlIHN1YlJlc291cmNlTW9kZWx9IGluc3RhbmNlIHdpbGwgY2F1c2Ugbm8gZWZmZWN0IG9uIHRoZSBmaW5hbCBzdWIgcmVzb3VyY2UgbW9kZWwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3ViUmVzb3VyY2VNb2RlbCB7QGxpbmsgUmVzb3VyY2UgU3ViIHJlc291cmNlfSB3aGljaCBpcyBiYXNlZCBvbiBzdWIgcmVzb3VyY2UgcmV0dXJuZWQgZnJvbSBzdWIgcmVzb3VyY2UgbG9jYXRvci4KKyAgICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbiBSdW50aW1lIGNvbmZpZ3VyYXRpb24uCisgICAgICogQHJldHVybiBQcm9jZXNzZWQgcmVzb3VyY2UgbW9kZWwgd2l0aCBvbmUge0BsaW5rIFJlc291cmNlIHJlc291cmNlfSB3aGljaCBzaG91bGQgYmUgdXNlZCBmb3IgaGFuZGxpbmcgc3ViIHJlc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyBSZXNvdXJjZU1vZGVsIHByb2Nlc3NTdWJSZXNvdXJjZShSZXNvdXJjZU1vZGVsIHN1YlJlc291cmNlTW9kZWwsIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbik7Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9Nb2RlbFZhbGlkYXRpb25FeGNlcHRpb24uamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL01vZGVsVmFsaWRhdGlvbkV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYzJiZTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9Nb2RlbFZhbGlkYXRpb25FeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFJlc291cmNlIG1vZGVsIHZhbGlkYXRpb24gZXhjZXB0aW9uLgorICoKKyAqIEluZGljYXRlcyB0aGUgaXNzdWVzIHdpdGggdGhlIG1vZGVsLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgTW9kZWxWYWxpZGF0aW9uRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA0MDc2MDE1NzE2NDg3NTk2MjEwTDsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8UmVzb3VyY2VNb2RlbElzc3VlPiBpc3N1ZXM7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIG5ldyByZXNvdXJjZSBtb2RlbCB2YWxpZGF0aW9uIGV4Y2VwdGlvbiB3aXRoIHRoZSBsaXN0IG9mIHZhbGlkYXRpb24gaXNzdWVzIGFuZCB0aGUgbWVzc2FnZS4KKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBtZXNzYWdlIGZvciB0aGUgZXhjZXB0aW9uLiBUaGUgZmluYWwgbWVzc2FnZSByZXR1cm5lZCBieSB7QGxpbmsgI2dldE1lc3NhZ2UoKX0gd2lsbAorICAgICAqICAgICAgICAgICAgICAgY29udGFpbnMgdGhlIHtAY29kZSBtZXNzYWdlfSBhbmQgb3RoZXIgaW5mb3JtYXRpb24gYWJvdXQgZXhjZXB0aW9uLgorICAgICAqIEBwYXJhbSBpc3N1ZXMgdmFsaWRhdGlvbiBpc3N1ZXMuCisgICAgICovCisgICAgcHVibGljIE1vZGVsVmFsaWRhdGlvbkV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgTGlzdDxSZXNvdXJjZU1vZGVsSXNzdWU+IGlzc3VlcykgeworICAgICAgICBzdXBlcihtZXNzYWdlKTsKKyAgICAgICAgdGhpcy5pc3N1ZXMgPSBpc3N1ZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHZhbGlkYXRpb24gaXNzdWVzLgorICAgICAqCisgICAgICogQHJldHVybiB2YWxpZGF0aW9uIGlzc3Vlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxSZXNvdXJjZU1vZGVsSXNzdWU+IGdldElzc3VlcygpIHsKKyAgICAgICAgcmV0dXJuIGlzc3VlczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gc3VwZXIuZ2V0TWVzc2FnZSgpOworICAgICAgICByZXR1cm4gKG1lc3NhZ2UgPT0gbnVsbCA/ICIiIDogbWVzc2FnZSArICdcbicpICsgaXNzdWVzLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvUGFyYW1RdWFsaWZpZXIuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL1BhcmFtUXVhbGlmaWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBjYTU1NwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL1BhcmFtUXVhbGlmaWVyLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWw7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCisvKioKKyAqIEEgbWV0YS1hbm5vdGF0aW9uIHRoYXQgaWRlbnRpZmllcyBhbiBhbm5vdGF0aW9uIGFzIGEgcGFyYW1ldGVyLWJhc2VkCisgKiBhbm5vdGF0aW9uLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqLworQFRhcmdldCh7RWxlbWVudFR5cGUuQU5OT1RBVElPTl9UWVBFfSkKK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitARG9jdW1lbnRlZAorcHVibGljIEBpbnRlcmZhY2UgUGFyYW1RdWFsaWZpZXIgeworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvUGFyYW1ldGVyLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9QYXJhbWV0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDY3ZWE4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvUGFyYW1ldGVyLmphdmEKQEAgLTAsMCArMSw3MTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Bbm5vdGF0ZWRFbGVtZW50OworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkJlYW5QYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Db29raWVQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5EZWZhdWx0VmFsdWU7CitpbXBvcnQgamF2YXgud3MucnMuRW5jb2RlZDsKK2ltcG9ydCBqYXZheC53cy5ycy5Gb3JtUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuSGVhZGVyUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuTWF0cml4UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlN1c3BlbmRlZDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlJlZmxlY3Rpb25IZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLkNsYXNzVHlwZVBhaXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlVyaTsKKworLyoqCisgKiBNZXRob2QgcGFyYW1ldGVyIG1vZGVsLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBQYXJhbWV0ZXIgaW1wbGVtZW50cyBBbm5vdGF0ZWRFbGVtZW50IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFBhcmFtZXRlci5jbGFzcy5nZXROYW1lKCkpOworCisgICAgLyoqCisgICAgICogUGFyYW1ldGVyIGluamVjdGlvbiBzb3VyY2VzIHR5cGUuCisgICAgICovCisgICAgcHVibGljIGVudW0gU291cmNlIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29udGV4dCBwYXJhbWV0ZXIgaW5qZWN0aW9uIHNvdXJjZS4KKyAgICAgICAgICovCisgICAgICAgIENPTlRFWFQsCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb29raWUgcGFyYW1ldGVyIGluamVjdGlvbiBzb3VyY2UuCisgICAgICAgICAqLworICAgICAgICBDT09LSUUsCisgICAgICAgIC8qKgorICAgICAgICAgKiBFbnRpdHkgcGFyYW1ldGVyIGluamVjdGlvbiBzb3VyY2UuCisgICAgICAgICAqLworICAgICAgICBFTlRJVFksCisgICAgICAgIC8qKgorICAgICAgICAgKiBGb3JtIHBhcmFtZXRlciBpbmplY3Rpb24gc291cmNlLgorICAgICAgICAgKi8KKyAgICAgICAgRk9STSwKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhlYWRlciBwYXJhbWV0ZXIgaW5qZWN0aW9uIHNvdXJjZS4KKyAgICAgICAgICovCisgICAgICAgIEhFQURFUiwKKyAgICAgICAgLyoqCisgICAgICAgICAqIFVyaSBwYXJhbWV0ZXIgaW5qZWN0aW9uIHNvdXJjZS4KKyAgICAgICAgICovCisgICAgICAgIFVSSSwKKyAgICAgICAgLyoqCisgICAgICAgICAqIE1hdHJpeCBwYXJhbWV0ZXIgaW5qZWN0aW9uIHNvdXJjZS4KKyAgICAgICAgICovCisgICAgICAgIE1BVFJJWCwKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBhdGggcGFyYW1ldGVyIGluamVjdGlvbiBzb3VyY2UuCisgICAgICAgICAqLworICAgICAgICBQQVRILAorICAgICAgICAvKioKKyAgICAgICAgICogUXVlcnkgcGFyYW1ldGVyIGluamVjdGlvbiBzb3VyY2UuCisgICAgICAgICAqLworICAgICAgICBRVUVSWSwKKyAgICAgICAgLyoqCisgICAgICAgICAqIFN1c3BlbmRlZCBhc3luYyByZXNwb25zZSBpbmplY3Rpb24gc291cmNlLgorICAgICAgICAgKi8KKyAgICAgICAgU1VTUEVOREVELAorICAgICAgICAvKioKKyAgICAgICAgICogQmVhbiBwYXJhbSBwYXJhbWV0ZXIgaW5qZWN0aW9uIHNvdXJjZS4KKyAgICAgICAgICovCisgICAgICAgIEJFQU5fUEFSQU0sCisgICAgICAgIC8qKgorICAgICAgICAgKiBVbmtub3duIHBhcmFtZXRlciBpbmplY3Rpb24gc291cmNlLgorICAgICAgICAgKi8KKyAgICAgICAgVU5LTk9XTgorICAgIH0KKworICAgIHByaXZhdGUgaW50ZXJmYWNlIFBhcmFtQW5ub3RhdGlvbkhlbHBlcjxUIGV4dGVuZHMgQW5ub3RhdGlvbj4geworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVPZihUIGEpOworCisgICAgICAgIHB1YmxpYyBQYXJhbWV0ZXIuU291cmNlIGdldFNvdXJjZSgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE1hcDxDbGFzcywgUGFyYW1Bbm5vdGF0aW9uSGVscGVyPiBjcmVhdGVQYXJhbUFubm90YXRpb25IZWxwZXJNYXAoKSB7CisgICAgICAgIE1hcDxDbGFzcywgUGFyYW1Bbm5vdGF0aW9uSGVscGVyPiBtID0gbmV3IFdlYWtIYXNoTWFwPENsYXNzLCBQYXJhbUFubm90YXRpb25IZWxwZXI+KCk7CisgICAgICAgIG0ucHV0KENvbnRleHQuY2xhc3MsIG5ldyBQYXJhbUFubm90YXRpb25IZWxwZXI8Q29udGV4dD4oKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZU9mKENvbnRleHQgYSkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBQYXJhbWV0ZXIuU291cmNlIGdldFNvdXJjZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUGFyYW1ldGVyLlNvdXJjZS5DT05URVhUOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgbS5wdXQoQ29va2llUGFyYW0uY2xhc3MsIG5ldyBQYXJhbUFubm90YXRpb25IZWxwZXI8Q29va2llUGFyYW0+KCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVPZihDb29raWVQYXJhbSBhKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGEudmFsdWUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgUGFyYW1ldGVyLlNvdXJjZSBnZXRTb3VyY2UoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFBhcmFtZXRlci5Tb3VyY2UuQ09PS0lFOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgbS5wdXQoRm9ybVBhcmFtLmNsYXNzLCBuZXcgUGFyYW1Bbm5vdGF0aW9uSGVscGVyPEZvcm1QYXJhbT4oKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZU9mKEZvcm1QYXJhbSBhKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGEudmFsdWUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgUGFyYW1ldGVyLlNvdXJjZSBnZXRTb3VyY2UoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFBhcmFtZXRlci5Tb3VyY2UuRk9STTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIG0ucHV0KEhlYWRlclBhcmFtLmNsYXNzLCBuZXcgUGFyYW1Bbm5vdGF0aW9uSGVscGVyPEhlYWRlclBhcmFtPigpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlT2YoSGVhZGVyUGFyYW0gYSkgeworICAgICAgICAgICAgICAgIHJldHVybiBhLnZhbHVlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFBhcmFtZXRlci5Tb3VyY2UgZ2V0U291cmNlKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBQYXJhbWV0ZXIuU291cmNlLkhFQURFUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIG0ucHV0KE1hdHJpeFBhcmFtLmNsYXNzLCBuZXcgUGFyYW1Bbm5vdGF0aW9uSGVscGVyPE1hdHJpeFBhcmFtPigpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlT2YoTWF0cml4UGFyYW0gYSkgeworICAgICAgICAgICAgICAgIHJldHVybiBhLnZhbHVlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFBhcmFtZXRlci5Tb3VyY2UgZ2V0U291cmNlKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBQYXJhbWV0ZXIuU291cmNlLk1BVFJJWDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIG0ucHV0KFBhdGhQYXJhbS5jbGFzcywgbmV3IFBhcmFtQW5ub3RhdGlvbkhlbHBlcjxQYXRoUGFyYW0+KCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVPZihQYXRoUGFyYW0gYSkgeworICAgICAgICAgICAgICAgIHJldHVybiBhLnZhbHVlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFBhcmFtZXRlci5Tb3VyY2UgZ2V0U291cmNlKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBQYXJhbWV0ZXIuU291cmNlLlBBVEg7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBtLnB1dChRdWVyeVBhcmFtLmNsYXNzLCBuZXcgUGFyYW1Bbm5vdGF0aW9uSGVscGVyPFF1ZXJ5UGFyYW0+KCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVPZihRdWVyeVBhcmFtIGEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYS52YWx1ZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBQYXJhbWV0ZXIuU291cmNlIGdldFNvdXJjZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUGFyYW1ldGVyLlNvdXJjZS5RVUVSWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIG0ucHV0KFN1c3BlbmRlZC5jbGFzcywgbmV3IFBhcmFtQW5ub3RhdGlvbkhlbHBlcjxTdXNwZW5kZWQ+KCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVPZihTdXNwZW5kZWQgYSkgeworICAgICAgICAgICAgICAgIHJldHVybiBTdXNwZW5kZWQuY2xhc3MuZ2V0TmFtZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBQYXJhbWV0ZXIuU291cmNlIGdldFNvdXJjZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUGFyYW1ldGVyLlNvdXJjZS5TVVNQRU5ERUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBtLnB1dChVcmkuY2xhc3MsIG5ldyBQYXJhbUFubm90YXRpb25IZWxwZXI8VXJpPigpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlT2YoVXJpIGEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYS52YWx1ZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBQYXJhbWV0ZXIuU291cmNlIGdldFNvdXJjZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUGFyYW1ldGVyLlNvdXJjZS5VUkk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBtLnB1dChCZWFuUGFyYW0uY2xhc3MsIG5ldyBQYXJhbUFubm90YXRpb25IZWxwZXI8QmVhblBhcmFtPigpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlT2YoQmVhblBhcmFtIGEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgUGFyYW1ldGVyLlNvdXJjZSBnZXRTb3VyY2UoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFBhcmFtZXRlci5Tb3VyY2UuQkVBTl9QQVJBTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAobSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPENsYXNzLCBQYXJhbUFubm90YXRpb25IZWxwZXI+IEFOTk9UQVRJT05fSEVMUEVSX01BUCA9IGNyZWF0ZVBhcmFtQW5ub3RhdGlvbkhlbHBlck1hcCgpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgcGFyYW1ldGVyIG1vZGVsLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmNyZXRlQ2xhc3MgICBjb25jcmV0ZSByZXNvdXJjZSBtZXRob2QgaGFuZGxlciBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KKyAgICAgKiBAcGFyYW0gZGVjbGFyaW5nQ2xhc3MgIGRlY2xhcmluZyBjbGFzcyBvZiB0aGUgbWV0aG9kIHRoZSBwYXJhbWV0ZXIgYmVsb25ncyB0byBvciBmaWVsZCB0aGF0IHRoaXMgcGFyYW1ldGVyIHJlcHJlc2VudHMuCisgICAgICogQHBhcmFtIGVuY29kZUJ5RGVmYXVsdCBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgcGFyYW1ldGVyIHNob3VsZCBiZSBlbmNvZGVkIGJ5IGRlZmF1bHQgb3Igbm90LiBOb3RlIHRoYXQgYSBwcmVzZW5jZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgb2Yge0BsaW5rIEVuY29kZWR9IGFubm90YXRpb24gaW4gdGhlIGxpc3Qgb2YgdGhlIHBhcmFtZXRlciB7QGNvZGUgYW5ub3RhdGlvbnN9IHdpbGwgb3ZlcnJpZGUgYW55CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBzZXQgaW4gdGhlIGZsYWcgdG8ge0Bjb2RlIHRydWV9LgorICAgICAqIEBwYXJhbSByYXdUeXBlICAgICAgICAgcmF3IEphdmEgcGFyYW1ldGVyIHR5cGUuCisgICAgICogQHBhcmFtIHR5cGUgICAgICAgICAgICBnZW5lcmljIEphdmEgcGFyYW1ldGVyIHR5cGUuCisgICAgICogQHBhcmFtIGFubm90YXRpb25zICAgICBwYXJhbWV0ZXIgYW5ub3RhdGlvbnMuCisgICAgICogQHJldHVybiBuZXcgcGFyYW1ldGVyIG1vZGVsLgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBzdGF0aWMgUGFyYW1ldGVyIGNyZWF0ZSgKKyAgICAgICAgICAgIENsYXNzIGNvbmNyZXRlQ2xhc3MsCisgICAgICAgICAgICBDbGFzcyBkZWNsYXJpbmdDbGFzcywKKyAgICAgICAgICAgIGJvb2xlYW4gZW5jb2RlQnlEZWZhdWx0LAorICAgICAgICAgICAgQ2xhc3M8Pz4gcmF3VHlwZSwKKyAgICAgICAgICAgIFR5cGUgdHlwZSwKKyAgICAgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucykgeworCisgICAgICAgIGlmIChudWxsID09IGFubm90YXRpb25zKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEFubm90YXRpb24gcGFyYW1Bbm5vdGF0aW9uID0gbnVsbDsKKyAgICAgICAgUGFyYW1ldGVyLlNvdXJjZSBwYXJhbVNvdXJjZSA9IG51bGw7CisgICAgICAgIFN0cmluZyBwYXJhbU5hbWUgPSBudWxsOworICAgICAgICBib29sZWFuIHBhcmFtRW5jb2RlZCA9IGVuY29kZUJ5RGVmYXVsdDsKKyAgICAgICAgU3RyaW5nIHBhcmFtRGVmYXVsdCA9IG51bGw7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhIHBhcmFtZXRlciBmcm9tIHRoZSBsaXN0IG9mIGFubm90YXRpb25zLiBVbmtub3duIGFubm90YXRlZAorICAgICAgICAgKiBwYXJhbWV0ZXJzIGFyZSBhbHNvIHN1cHBvcnRlZCwgYW5kIGluIHN1Y2ggYSBjYXNlcyB0aGUgbGFzdAorICAgICAgICAgKiB1bnJlY29nbml6ZWQgYW5ub3RhdGlvbiBpcyB0YWtlbiB0byBiZSB0aGF0IGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAgICAgICAgICogcGFyYW1ldGVyLgorICAgICAgICAgKi8KKyAgICAgICAgZm9yIChBbm5vdGF0aW9uIGFubm90YXRpb24gOiBhbm5vdGF0aW9ucykgeworICAgICAgICAgICAgaWYgKEFOTk9UQVRJT05fSEVMUEVSX01BUC5jb250YWluc0tleShhbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkpKSB7CisgICAgICAgICAgICAgICAgUGFyYW1Bbm5vdGF0aW9uSGVscGVyIGhlbHBlciA9IEFOTk9UQVRJT05fSEVMUEVSX01BUC5nZXQoYW5ub3RhdGlvbi5hbm5vdGF0aW9uVHlwZSgpKTsKKyAgICAgICAgICAgICAgICBwYXJhbUFubm90YXRpb24gPSBhbm5vdGF0aW9uOworICAgICAgICAgICAgICAgIHBhcmFtU291cmNlID0gaGVscGVyLmdldFNvdXJjZSgpOworICAgICAgICAgICAgICAgIHBhcmFtTmFtZSA9IGhlbHBlci5nZXRWYWx1ZU9mKGFubm90YXRpb24pOworICAgICAgICAgICAgfSBlbHNlIGlmIChFbmNvZGVkLmNsYXNzID09IGFubm90YXRpb24uYW5ub3RhdGlvblR5cGUoKSkgeworICAgICAgICAgICAgICAgIHBhcmFtRW5jb2RlZCA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKERlZmF1bHRWYWx1ZS5jbGFzcyA9PSBhbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkpIHsKKyAgICAgICAgICAgICAgICBwYXJhbURlZmF1bHQgPSAoKERlZmF1bHRWYWx1ZSkgYW5ub3RhdGlvbikudmFsdWUoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gVGFrZSBsYXRlc3QgdW5rbm93biBhbm5vdGF0aW9uLCBidXQgZG9uJ3Qgb3ZlcnJpZGUga25vd24gYW5ub3RhdGlvbgorICAgICAgICAgICAgICAgIGlmICgocGFyYW1Bbm5vdGF0aW9uID09IG51bGwpIHx8IChwYXJhbVNvdXJjZSA9PSBTb3VyY2UuVU5LTk9XTikpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1Bbm5vdGF0aW9uID0gYW5ub3RhdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1Tb3VyY2UgPSBTb3VyY2UuVU5LTk9XTjsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lID0gZ2V0VmFsdWUoYW5ub3RhdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHBhcmFtQW5ub3RhdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICBwYXJhbVNvdXJjZSA9IFBhcmFtZXRlci5Tb3VyY2UuRU5USVRZOworICAgICAgICB9CisKKyAgICAgICAgQ2xhc3NUeXBlUGFpciBjdCA9IFJlZmxlY3Rpb25IZWxwZXIucmVzb2x2ZUdlbmVyaWNUeXBlKAorICAgICAgICAgICAgICAgIGNvbmNyZXRlQ2xhc3MsIGRlY2xhcmluZ0NsYXNzLCByYXdUeXBlLCB0eXBlKTsKKworICAgICAgICBpZiAocGFyYW1Tb3VyY2UgPT0gU291cmNlLkJFQU5fUEFSQU0pIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQmVhblBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgIHBhcmFtQW5ub3RhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lLAorICAgICAgICAgICAgICAgICAgICBjdC5yYXdDbGFzcygpLAorICAgICAgICAgICAgICAgICAgICBjdC50eXBlKCksCisgICAgICAgICAgICAgICAgICAgIHBhcmFtRW5jb2RlZCwKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1EZWZhdWx0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1Bbm5vdGF0aW9uLAorICAgICAgICAgICAgICAgICAgICBwYXJhbVNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1OYW1lLAorICAgICAgICAgICAgICAgICAgICBjdC5yYXdDbGFzcygpLAorICAgICAgICAgICAgICAgICAgICBjdC50eXBlKCksCisgICAgICAgICAgICAgICAgICAgIHBhcmFtRW5jb2RlZCwKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1EZWZhdWx0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIExpc3Q8UGFyYW1ldGVyPiBjcmVhdGUoCisgICAgICAgICAgICBDbGFzcyBjb25jcmV0ZUNsYXNzLAorICAgICAgICAgICAgQ2xhc3MgZGVjbGFyaW5nQ2xhc3MsCisgICAgICAgICAgICBib29sZWFuIGtlZXBFbmNvZGVkLAorICAgICAgICAgICAgQ2xhc3NbXSBwYXJhbWV0ZXJUeXBlcywKKyAgICAgICAgICAgIFR5cGVbXSBnZW5lcmljUGFyYW1ldGVyVHlwZXMsCisgICAgICAgICAgICBBbm5vdGF0aW9uW11bXSBwYXJhbWV0ZXJBbm5vdGF0aW9ucykgeworCisgICAgICAgIGZpbmFsIExpc3Q8UGFyYW1ldGVyPiBwYXJhbWV0ZXJzID0gbmV3IEFycmF5TGlzdDw+KHBhcmFtZXRlclR5cGVzLmxlbmd0aCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJUeXBlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgZmluYWwgUGFyYW1ldGVyIHBhcmFtZXRlciA9IFBhcmFtZXRlci5jcmVhdGUoCisgICAgICAgICAgICAgICAgICAgIGNvbmNyZXRlQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgIGRlY2xhcmluZ0NsYXNzLAorICAgICAgICAgICAgICAgICAgICBrZWVwRW5jb2RlZCwKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyVHlwZXNbaV0sCisgICAgICAgICAgICAgICAgICAgIGdlbmVyaWNQYXJhbWV0ZXJUeXBlc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyQW5ub3RhdGlvbnNbaV0pOworICAgICAgICAgICAgaWYgKG51bGwgIT0gcGFyYW1ldGVyKSB7CisgICAgICAgICAgICAgICAgcGFyYW1ldGVycy5hZGQocGFyYW1ldGVyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETyB0aHJvdyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaW5zdGVhZD8KKyAgICAgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcGFyYW1ldGVyczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBsaXN0IG9mIHBhcmFtZXRlciBtb2RlbHMgZm9yIGEgZ2l2ZW4gcmVzb3VyY2UgbWV0aG9kIGhhbmRsZXIKKyAgICAgKiBpbmplY3RhYmxlIGNvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmNyZXRlQ2xhc3MgIGNvbmNyZXRlIHJlc291cmNlIG1ldGhvZCBoYW5kbGVyIGltcGxlbWVudGF0aW9uIGNsYXNzLgorICAgICAqIEBwYXJhbSBkZWNsYXJpbmdDbGFzcyBjbGFzcyB3aGVyZSB0aGUgbWV0aG9kIGhhcyBiZWVuIGRlY2xhcmVkLgorICAgICAqIEBwYXJhbSBjdG9yICAgICAgICAgICBpbmplY3RhYmxlIGNvbnN0cnVjdG9yIG9mIHRoZSByZXNvdXJjZSBtZXRob2QgaGFuZGxlci4KKyAgICAgKiBAcGFyYW0ga2VlcEVuY29kZWQgICAgc2V0IHRvIHtAY29kZSB0cnVlfSB0byBkaXNhYmxlIGF1dG9tYXRpYyBkZWNvZGluZworICAgICAqICAgICAgICAgICAgICAgICAgICAgICBvZiBhbGwgdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMuIChTZWUge0BsaW5rIEVuY29kZWR9LgorICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIGNvbnN0cnVjdG9yIHBhcmFtZXRlciBtb2RlbHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0PFBhcmFtZXRlcj4gY3JlYXRlKAorICAgICAgICAgICAgQ2xhc3MgY29uY3JldGVDbGFzcywKKyAgICAgICAgICAgIENsYXNzIGRlY2xhcmluZ0NsYXNzLAorICAgICAgICAgICAgQ29uc3RydWN0b3I8Pz4gY3RvciwKKyAgICAgICAgICAgIGJvb2xlYW4ga2VlcEVuY29kZWQpIHsKKworICAgICAgICBDbGFzc1tdIHBhcmFtZXRlclR5cGVzID0gY3Rvci5nZXRQYXJhbWV0ZXJUeXBlcygpOworICAgICAgICBUeXBlW10gZ2VuZXJpY1BhcmFtZXRlclR5cGVzID0gY3Rvci5nZXRHZW5lcmljUGFyYW1ldGVyVHlwZXMoKTsKKyAgICAgICAgLy8gV29ya2Fyb3VuZCBidWcgaHR0cDovL2J1Z3Muc3VuLmNvbS92aWV3X2J1Zy5kbz9idWdfaWQ9NTA4NzI0MAorICAgICAgICBpZiAocGFyYW1ldGVyVHlwZXMubGVuZ3RoICE9IGdlbmVyaWNQYXJhbWV0ZXJUeXBlcy5sZW5ndGgpIHsKKyAgICAgICAgICAgIFR5cGVbXSBfZ2VuZXJpY1BhcmFtZXRlclR5cGVzID0gbmV3IFR5cGVbcGFyYW1ldGVyVHlwZXMubGVuZ3RoXTsKKyAgICAgICAgICAgIF9nZW5lcmljUGFyYW1ldGVyVHlwZXNbMF0gPSBwYXJhbWV0ZXJUeXBlc1swXTsKKyAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoZ2VuZXJpY1BhcmFtZXRlclR5cGVzLCAwLCBfZ2VuZXJpY1BhcmFtZXRlclR5cGVzLCAxLCBnZW5lcmljUGFyYW1ldGVyVHlwZXMubGVuZ3RoKTsKKyAgICAgICAgICAgIGdlbmVyaWNQYXJhbWV0ZXJUeXBlcyA9IF9nZW5lcmljUGFyYW1ldGVyVHlwZXM7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY3JlYXRlKAorICAgICAgICAgICAgICAgIGNvbmNyZXRlQ2xhc3MsIGRlY2xhcmluZ0NsYXNzLAorICAgICAgICAgICAgICAgICgobnVsbCAhPSBjdG9yLmdldEFubm90YXRpb24oRW5jb2RlZC5jbGFzcykpIHx8IGtlZXBFbmNvZGVkKSwKKyAgICAgICAgICAgICAgICBwYXJhbWV0ZXJUeXBlcywKKyAgICAgICAgICAgICAgICBnZW5lcmljUGFyYW1ldGVyVHlwZXMsCisgICAgICAgICAgICAgICAgY3Rvci5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBsaXN0IG9mIHBhcmFtZXRlciBtb2RlbHMgZm9yIGEgZ2l2ZW4gSmF2YSBtZXRob2QgaGFuZGxpbmcgYSByZXNvdXJjZQorICAgICAqIG1ldGhvZCwgc3ViLXJlc291cmNlIG1ldGhvZCBvciBhIHN1Yi1yZXNvdXJjZSBsb2NhdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmNyZXRlQ2xhc3MgIGNvbmNyZXRlIHJlc291cmNlIG1ldGhvZCBoYW5kbGVyIGltcGxlbWVudGF0aW9uIGNsYXNzLgorICAgICAqIEBwYXJhbSBkZWNsYXJpbmdDbGFzcyB0aGUgY2xhc3MgZGVjbGFyaW5nIHRoZSBoYW5kbGluZyBKYXZhIG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gamF2YU1ldGhvZCAgICAgSmF2YSBtZXRob2QgaGFuZGxpbmcgYSByZXNvdXJjZSBtZXRob2QsIHN1Yi1yZXNvdXJjZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Qgb3IgYSBzdWItcmVzb3VyY2UgbG9jYXRvci4KKyAgICAgKiBAcGFyYW0ga2VlcEVuY29kZWQgICAgc2V0IHRvIHtAY29kZSB0cnVlfSB0byBkaXNhYmxlIGF1dG9tYXRpYyBkZWNvZGluZworICAgICAqICAgICAgICAgICAgICAgICAgICAgICBvZiBhbGwgdGhlIG1ldGhvZCBwYXJhbWV0ZXJzLiAoU2VlIHtAbGluayBFbmNvZGVkfS4KKyAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBoYW5kbGluZyBtZXRob2QgcGFyYW1ldGVyIG1vZGVscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8UGFyYW1ldGVyPiBjcmVhdGUoCisgICAgICAgICAgICBDbGFzcyBjb25jcmV0ZUNsYXNzLAorICAgICAgICAgICAgQ2xhc3MgZGVjbGFyaW5nQ2xhc3MsCisgICAgICAgICAgICBNZXRob2QgamF2YU1ldGhvZCwKKyAgICAgICAgICAgIGJvb2xlYW4ga2VlcEVuY29kZWQpIHsKKworICAgICAgICBBbm5vdGF0ZWRNZXRob2QgbWV0aG9kID0gbmV3IEFubm90YXRlZE1ldGhvZChqYXZhTWV0aG9kKTsKKworICAgICAgICByZXR1cm4gY3JlYXRlKAorICAgICAgICAgICAgICAgIGNvbmNyZXRlQ2xhc3MsIGRlY2xhcmluZ0NsYXNzLAorICAgICAgICAgICAgICAgICgobnVsbCAhPSBtZXRob2QuZ2V0QW5ub3RhdGlvbihFbmNvZGVkLmNsYXNzKSkgfHwga2VlcEVuY29kZWQpLAorICAgICAgICAgICAgICAgIG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpLAorICAgICAgICAgICAgICAgIG1ldGhvZC5nZXRHZW5lcmljUGFyYW1ldGVyVHlwZXMoKSwKKyAgICAgICAgICAgICAgICBtZXRob2QuZ2V0UGFyYW1ldGVyQW5ub3RhdGlvbnMoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyBwYXJhbWV0ZXIgbW9kZWwgYnkgb3ZlcnJpZGluZyB7QGxpbmsgUGFyYW1ldGVyLlNvdXJjZSBzb3VyY2V9CisgICAgICogb2YgdGhlIG9yaWdpbmFsIHBhcmFtZXRlciBtb2RlbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvcmlnaW5hbCBvcmlnaW5hbCBwYXJhbWV0ZXIgbW9kZWwuCisgICAgICogQHBhcmFtIHNvdXJjZSAgIG5ldyBvdmVycmlkaW5nIHBhcmFtZXRlciBzb3VyY2UuCisgICAgICogQHJldHVybiBzb3VyY2Utb3ZlcnJpZGRlbiBjb3B5IG9mIHRoZSBvcmlnaW5hbCBwYXJhbWV0ZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBQYXJhbWV0ZXIgb3ZlcnJpZGVTb3VyY2UoUGFyYW1ldGVyIG9yaWdpbmFsLCBQYXJhbWV0ZXIuU291cmNlIHNvdXJjZSkgeworCisgICAgICAgIHJldHVybiBuZXcgUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIG9yaWdpbmFsLmFubm90YXRpb25zLAorICAgICAgICAgICAgICAgIG9yaWdpbmFsLnNvdXJjZUFubm90YXRpb24sCisgICAgICAgICAgICAgICAgc291cmNlLAorICAgICAgICAgICAgICAgIHNvdXJjZS5uYW1lKCksCisgICAgICAgICAgICAgICAgb3JpZ2luYWwucmF3VHlwZSwKKyAgICAgICAgICAgICAgICBvcmlnaW5hbC50eXBlLAorICAgICAgICAgICAgICAgIG9yaWdpbmFsLmVuY29kZWQsCisgICAgICAgICAgICAgICAgb3JpZ2luYWwuZGVmYXVsdFZhbHVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VmFsdWUoQW5ub3RhdGlvbiBhKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBNZXRob2QgbSA9IGEuYW5ub3RhdGlvblR5cGUoKS5nZXRNZXRob2QoInZhbHVlIik7CisgICAgICAgICAgICBpZiAobS5nZXRSZXR1cm5UeXBlKCkgIT0gU3RyaW5nLmNsYXNzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKFN0cmluZykgbS5pbnZva2UoYSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgaWYgKExPR0dFUi5pc0xvZ2dhYmxlKExldmVsLkZJTkVSKSkgeworICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuRklORVIsCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJVbmFibGUgdG8gZ2V0IHRoZSAlcyBhbm5vdGF0aW9uIHZhbHVlIHByb3BlcnR5IiwgYS5nZXRDbGFzcygpLmdldE5hbWUoKSksIGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvLyBJbnN0YW5jZQorICAgIHByaXZhdGUgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zOworICAgIHByaXZhdGUgZmluYWwgQW5ub3RhdGlvbiBzb3VyY2VBbm5vdGF0aW9uOworICAgIHByaXZhdGUgZmluYWwgUGFyYW1ldGVyLlNvdXJjZSBzb3VyY2U7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc291cmNlTmFtZTsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gZW5jb2RlZDsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBkZWZhdWx0VmFsdWU7CisgICAgcHJpdmF0ZSBmaW5hbCBDbGFzczw/PiByYXdUeXBlOworICAgIHByaXZhdGUgZmluYWwgVHlwZSB0eXBlOworCisgICAgcHJpdmF0ZSBQYXJhbWV0ZXIoCisgICAgICAgICAgICBBbm5vdGF0aW9uW10gbWFya2VycywKKyAgICAgICAgICAgIEFubm90YXRpb24gbWFya2VyLAorICAgICAgICAgICAgU291cmNlIHNvdXJjZSwKKyAgICAgICAgICAgIFN0cmluZyBzb3VyY2VOYW1lLAorICAgICAgICAgICAgQ2xhc3M8Pz4gcmF3VHlwZSwKKyAgICAgICAgICAgIFR5cGUgdHlwZSwKKyAgICAgICAgICAgIGJvb2xlYW4gZW5jb2RlZCwKKyAgICAgICAgICAgIFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgdGhpcy5hbm5vdGF0aW9ucyA9IG1hcmtlcnM7CisgICAgICAgIHRoaXMuc291cmNlQW5ub3RhdGlvbiA9IG1hcmtlcjsKKyAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7CisgICAgICAgIHRoaXMuc291cmNlTmFtZSA9IHNvdXJjZU5hbWU7CisgICAgICAgIHRoaXMucmF3VHlwZSA9IHJhd1R5cGU7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIHRoaXMuZW5jb2RlZCA9IGVuY29kZWQ7CisgICAgICAgIHRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJlYW4gUGFyYW1ldGVyIGNsYXNzIHJlcHJlc2VudHMgYSBwYXJhbWV0ZXIgYW5ub3RhdGVkIHdpdGgge0BsaW5rIEJlYW5QYXJhbX0gd2hpY2ggaW4gZmFjdCByZXByZXNlbnRzCisgICAgICogYWRkaXRpb25hbCBzZXQgb2YgcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJlYW5QYXJhbWV0ZXIgZXh0ZW5kcyBQYXJhbWV0ZXIgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxQYXJhbWV0ZXI+IHBhcmFtZXRlcnM7CisKKyAgICAgICAgcHJpdmF0ZSBCZWFuUGFyYW1ldGVyKGZpbmFsIEFubm90YXRpb25bXSBtYXJrZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbiBtYXJrZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc291cmNlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IHJhd1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIHR5cGUsIGZpbmFsIGJvb2xlYW4gZW5jb2RlZCwgZmluYWwgU3RyaW5nIGRlZmF1bHRWYWx1ZSkgeworICAgICAgICAgICAgc3VwZXIobWFya2VycywgbWFya2VyLCBTb3VyY2UuQkVBTl9QQVJBTSwgc291cmNlTmFtZSwgcmF3VHlwZSwgdHlwZSwgZW5jb2RlZCwgZGVmYXVsdFZhbHVlKTsKKworICAgICAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxQYXJhbWV0ZXI+IHBhcmFtZXRlcnMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisKKyAgICAgICAgICAgIGZvciAoRmllbGQgZmllbGQgOiBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChSZWZsZWN0aW9uSGVscGVyLmdldERlY2xhcmVkRmllbGRzUEEocmF3VHlwZSkpKSB7CisgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmdldERlY2xhcmVkQW5ub3RhdGlvbnMoKS5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlciBiZWFuUGFyYW1QYXJhbWV0ZXIgPSBQYXJhbWV0ZXIuY3JlYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuZ2V0RGVjbGFyaW5nQ2xhc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5pc0Fubm90YXRpb25QcmVzZW50KEVuY29kZWQuY2xhc3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5nZXRHZW5lcmljVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLmdldEFubm90YXRpb25zKCkpOworICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLmFkZChiZWFuUGFyYW1QYXJhbWV0ZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoQ29uc3RydWN0b3IgY29uc3RydWN0b3IgOiBBY2Nlc3NDb250cm9sbGVyCisgICAgICAgICAgICAgICAgICAgIC5kb1ByaXZpbGVnZWQoUmVmbGVjdGlvbkhlbHBlci5nZXREZWNsYXJlZENvbnN0cnVjdG9yc1BBKHJhd1R5cGUpKSkgeworICAgICAgICAgICAgICAgIGZvciAoUGFyYW1ldGVyIHBhcmFtZXRlciA6IFBhcmFtZXRlci5jcmVhdGUocmF3VHlwZSwgcmF3VHlwZSwgY29uc3RydWN0b3IsIGZhbHNlKSkgeworICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLmFkZChwYXJhbWV0ZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy5wYXJhbWV0ZXJzID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlQ29sbGVjdGlvbihwYXJhbWV0ZXJzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIFRoZSB0cmFuc2l0aXZlbHkgYXNzb2NpYXRlZCBwYXJhbWV0ZXJzIHRocm91Z2ggdGhpcyB7QGxpbmsgQmVhblBhcmFtfSBwYXJhbWV0ZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQ29sbGVjdGlvbjxQYXJhbWV0ZXI+IGdldFBhcmFtZXRlcnMoKSB7CisgICAgICAgICAgICByZXR1cm4gcGFyYW1ldGVyczsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcGFyYW1ldGVyIHNvdXJjZSBhbm5vdGF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBwYXJhbWV0ZXIgc291cmNlIGFubm90YXRpb24uCisgICAgICovCisgICAgcHVibGljIEFubm90YXRpb24gZ2V0U291cmNlQW5ub3RhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHNvdXJjZUFubm90YXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBwYXJhbWV0ZXIgdmFsdWUgc291cmNlIHR5cGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHBhcmFtZXRlciB2YWx1ZSBzb3VyY2UgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGFyYW1ldGVyLlNvdXJjZSBnZXRTb3VyY2UoKSB7CisgICAgICAgIHJldHVybiBzb3VyY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBwYXJhbWV0ZXIgc291cmNlIG5hbWUsIGkuZS4gdmFsdWUgb2YgdGhlIHBhcmFtZXRlciBzb3VyY2UgYW5ub3RhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gcGFyYW1ldGVyIHNvdXJjZSBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U291cmNlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHNvdXJjZU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWYge0Bjb2RlIHRydWV9LCB0aGUgaW5qZWN0ZWQgcGFyYW1ldGVyIHZhbHVlIHNob3VsZCByZW1haW4gZW5jb2RlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBwYXJhbWV0ZXIgdmFsdWUgc2hvdWxkIHJlbWFpbiBlbmNvZGVkLAorICAgICAqIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRW5jb2RlZCgpIHsKKyAgICAgICAgcmV0dXJuIGVuY29kZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgdGhlIHBhcmFtZXRlciBoYXMgYSBkZWZhdWx0IHZhbHVlIHNldC4KKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBkZWZhdWx0IHBhcmFtZXRlciB2YWx1ZSBoYXMgYmVlbiBzZXQsCisgICAgICoge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaGFzRGVmYXVsdFZhbHVlKCkgeworICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlICE9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBkZWZhdWx0IHBhcmFtZXRlciB2YWx1ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gZGVmYXVsdCBwYXJhbWV0ZXIgdmFsdWUgb3Ige0Bjb2RlIG51bGx9IGlmIG5vIGRlZmF1bHQgdmFsdWUgaGFzCisgICAgICogYmVlbiBzZXQgZm9yIHRoZSBwYXJhbWV0ZXIuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0VmFsdWUoKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHJhdyB0eXBlIGluZm9ybWF0aW9uIGZvciB0aGUgcGFyYW1ldGVyLgorICAgICAqCisgICAgICogQHJldHVybiByYXcgcGFyYW1ldGVyIHR5cGUgaW5mb3JtYXRpb24uCisgICAgICovCisgICAgcHVibGljIENsYXNzPD8+IGdldFJhd1R5cGUoKSB7CisgICAgICAgIHJldHVybiByYXdUeXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBnZW5lcmljIHR5cGUgaW5mb3JtYXRpb24gZm9yIHRoZSBwYXJhbWV0ZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGdlbmVyaWMgcGFyYW1ldGVyIHR5cGUgaW5mb3JtYXRpb24uCisgICAgICovCisgICAgcHVibGljIFR5cGUgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgdGhlIHBhcmFtZXRlciBpcyB7QGxpbmsgUGFyYW1RdWFsaWZpZXIgcXVhbGlmaWVkfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBwYXJhbWV0ZXIgaXMgcXVhbGlmaWVkLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1F1YWxpZmllZCgpIHsKKyAgICAgICAgZm9yIChBbm5vdGF0aW9uIGEgOiBnZXRBbm5vdGF0aW9ucygpKSB7CisgICAgICAgICAgICBpZiAoYS5hbm5vdGF0aW9uVHlwZSgpLmlzQW5ub3RhdGlvblByZXNlbnQoUGFyYW1RdWFsaWZpZXIuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzQW5ub3RhdGlvblByZXNlbnQoQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGFubm90YXRpb25DbGFzcykgeworICAgICAgICByZXR1cm4gZ2V0QW5ub3RhdGlvbihhbm5vdGF0aW9uQ2xhc3MpICE9IG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxUIGV4dGVuZHMgQW5ub3RhdGlvbj4gVCBnZXRBbm5vdGF0aW9uKENsYXNzPFQ+IGFubm90YXRpb25DbGFzcykgeworICAgICAgICBpZiAoYW5ub3RhdGlvbkNsYXNzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGZvciAoQW5ub3RhdGlvbiBhIDogYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgICAgIGlmIChhLmFubm90YXRpb25UeXBlKCkgPT0gYW5ub3RhdGlvbkNsYXNzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb25DbGFzcy5jYXN0KGEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBbm5vdGF0aW9uW10gZ2V0QW5ub3RhdGlvbnMoKSB7CisgICAgICAgIHJldHVybiBhbm5vdGF0aW9ucy5jbG9uZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBbm5vdGF0aW9uW10gZ2V0RGVjbGFyZWRBbm5vdGF0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIGFubm90YXRpb25zLmNsb25lKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIlBhcmFtZXRlciBbdHlwZT0lcywgc291cmNlPSVzLCBkZWZhdWx0VmFsdWU9JXNdIiwKKyAgICAgICAgICAgICAgICBnZXRSYXdUeXBlKCksIGdldFNvdXJjZU5hbWUoKSwgZ2V0RGVmYXVsdFZhbHVlKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICBpZiAodGhpcyA9PSBvKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBQYXJhbWV0ZXIgcGFyYW1ldGVyID0gKFBhcmFtZXRlcikgbzsKKworICAgICAgICBpZiAoZW5jb2RlZCAhPSBwYXJhbWV0ZXIuZW5jb2RlZCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICghQXJyYXlzLmVxdWFscyhhbm5vdGF0aW9ucywgcGFyYW1ldGVyLmFubm90YXRpb25zKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChkZWZhdWx0VmFsdWUgIT0gbnVsbCA/ICFkZWZhdWx0VmFsdWUuZXF1YWxzKHBhcmFtZXRlci5kZWZhdWx0VmFsdWUpIDogcGFyYW1ldGVyLmRlZmF1bHRWYWx1ZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJhd1R5cGUgIT0gbnVsbCA/ICFyYXdUeXBlLmVxdWFscyhwYXJhbWV0ZXIucmF3VHlwZSkgOiBwYXJhbWV0ZXIucmF3VHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNvdXJjZSAhPSBwYXJhbWV0ZXIuc291cmNlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNvdXJjZUFubm90YXRpb24gIT0gbnVsbCA/ICFzb3VyY2VBbm5vdGF0aW9uLmVxdWFscyhwYXJhbWV0ZXIuc291cmNlQW5ub3RhdGlvbikgOiBwYXJhbWV0ZXIuc291cmNlQW5ub3RhdGlvbgorICAgICAgICAgICAgICAgICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc291cmNlTmFtZSAhPSBudWxsID8gIXNvdXJjZU5hbWUuZXF1YWxzKHBhcmFtZXRlci5zb3VyY2VOYW1lKSA6IHBhcmFtZXRlci5zb3VyY2VOYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZSAhPSBudWxsID8gIXR5cGUuZXF1YWxzKHBhcmFtZXRlci50eXBlKSA6IHBhcmFtZXRlci50eXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCByZXN1bHQgPSBhbm5vdGF0aW9ucyAhPSBudWxsID8gQXJyYXlzLmhhc2hDb2RlKGFubm90YXRpb25zKSA6IDA7CisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgKHNvdXJjZUFubm90YXRpb24gIT0gbnVsbCA/IHNvdXJjZUFubm90YXRpb24uaGFzaENvZGUoKSA6IDApOworICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIChzb3VyY2UgIT0gbnVsbCA/IHNvdXJjZS5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgKHNvdXJjZU5hbWUgIT0gbnVsbCA/IHNvdXJjZU5hbWUuaGFzaENvZGUoKSA6IDApOworICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIChlbmNvZGVkID8gMSA6IDApOworICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIChkZWZhdWx0VmFsdWUgIT0gbnVsbCA/IGRlZmF1bHRWYWx1ZS5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgKHJhd1R5cGUgIT0gbnVsbCA/IHJhd1R5cGUuaGFzaENvZGUoKSA6IDApOworICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArICh0eXBlICE9IG51bGwgPyB0eXBlLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9QYXJhbWV0ZXJpemVkLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9QYXJhbWV0ZXJpemVkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI4OTZhNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL1BhcmFtZXRlcml6ZWQuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIFVzZWQgaW4gdGhlIHJlc291cmNlIG1vZGVsIHRvIGNhcHR1cmUgaW5mb3JtYXRpb24gb24gbWV0aG9kIHBhcmFtZXRlcnMuCisgKgorICogQHNlZSBQYXJhbWV0ZXIKKyAqCisgKiBAYXV0aG9yIE1hcmMgSGFkbGV5CisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgaW50ZXJmYWNlIFBhcmFtZXRlcml6ZWQgeworCisgICAgLyoqCisgICAgICogUHJvdmlkZXMgYWNjZXNzIHRvIGFsbCBwYXJhbWV0ZXJzIGFzc29jaWF0ZWQgd2l0aCBnaXZlbiBQYXJhbWV0ZXJpemVkIGluc3RhbmNlLgorICAgICAqCisgICAgICogQHJldHVybiBsaXN0IG9mIGFjdHVhbCBwYXJhbWV0ZXJzCisgICAgICovCisgICAgcHVibGljIExpc3Q8UGFyYW1ldGVyPiBnZXRQYXJhbWV0ZXJzKCk7CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlcyBpbmZvcm1hdGlvbiBvbiBwcmVzZW5jZSBvZiBhbiBlbnRpdHkgcGFyYW1ldGVyLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIGVudGl0eSBwYXJhbWV0ZXIgaXMgcHJlc2VudCwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gcmVxdWlyZXNFbnRpdHkoKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL1Byb2R1Y2luZy5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvUHJvZHVjaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc1NTRhOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL1Byb2R1Y2luZy5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworLyoqCisgKiBNb2RlbCBjb21wb25lbnQgdGhhdCBpcyBhYmxlIHRvIHByb2R1Y2UgbWVkaWEgdHlwZXMuCisgKgorICogQSBjb21wb25lbnQgaW1wbGVtZW50aW5nIHRoaXMgaW50ZXJmYWNlIHByb3ZpZGVzIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQKKyAqIHRoZSBzdXBwb3J0ZWQgcHJvZHVjZWQge0BsaW5rIE1lZGlhVHlwZSBtZWRpYSB0eXBlc30uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKgorICogQHNlZSBqYXZheC53cy5ycy5Qcm9kdWNlcworICogQHNlZSBDb25zdW1pbmcKKyAqLworcHVibGljIGludGVyZmFjZSBQcm9kdWNpbmcgeworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBwcm9kdWNlZCBtZWRpYSB0eXBlcyBzdXBwb3J0ZWQgYnkgdGhlIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gaW1tdXRhYmxlIGNvbGxlY3Rpb24gb2Ygc3VwcG9ydGVkIHByb2R1Y2VkIG1lZGlhIHR5cGVzLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PE1lZGlhVHlwZT4gZ2V0UHJvZHVjZWRUeXBlcygpOworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvUmVzb3VyY2UuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL1Jlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MyM2Y3MAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL1Jlc291cmNlLmphdmEKQEAgLTAsMCArMSwxMDQ5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LlNldmVyaXR5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkVycm9yczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YS5QcmVjb25kaXRpb25zOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5WYWx1ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uVmFsdWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuaW50ZXJuYWwuTW9kZWxIZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudXJpLlBhdGhQYXR0ZXJuOworCisvKioKKyAqIE1vZGVsIG9mIGEgc2luZ2xlIHJlc291cmNlIGNvbXBvbmVudC4KKyAqIDxwPgorICogUmVzb3VyY2UgY29tcG9uZW50IG1vZGVsIHJlcHJlc2VudHMgYSBjb2xsZWN0aW9uIG9mIHtAbGluayBSZXNvdXJjZU1ldGhvZCBtZXRob2RzfQorICogZ3JvdXBlZCB1bmRlciB0aGUgc2FtZSBwYXJlbnQgcmVxdWVzdCBwYXRoIHRlbXBsYXRlLiB7QGNvZGUgUmVzb3VyY2V9IGNsYXNzIGlzIGFsc28KKyAqIHRoZSBtYWluIGVudHJ5IHBvaW50IHRvIHRoZSBwcm9ncmFtbWF0aWMgcmVzb3VyY2UgbW9kZWxpbmcgQVBJIHRoYXQgcHJvdmlkZXMgYWJpbGl0eQorICogdG8gcHJvZ3JhbW1hdGljYWxseSBleHRlbmQgdGhlIGV4aXN0aW5nIEpBWC1SUyBhbm5vdGF0ZWQgcmVzb3VyY2UgY2xhc3NlcyBvciBidWlsZAorICogbmV3IHJlc291cmNlIG1vZGVscyB0aGF0IG1heSBiZSB1dGlsaXplZCBieSBKZXJzZXkgcnVudGltZS4KKyAqIDwvcD4KKyAqIDxwPgorICogRm9yIGV4YW1wbGU6CisgKiA8cHJlPgorICogJiM2NDtQYXRoKCJoZWxsbyIpCisgKiBwdWJsaWMgY2xhc3MgSGVsbG9SZXNvdXJjZSB7CisgKiAgICAgICYjNjQ7R0VUCisgKiAgICAgICYjNjQ7UHJvZHVjZXMoInRleHQvcGxhaW4iKQorICogICAgICBwdWJsaWMgU3RyaW5nIHNheUhlbGxvKCkgeworICogICAgICAgICAgcmV0dXJuICJIZWxsbyEiOworICogICAgICB9CisgKiB9CisgKgorICogLi4uCisgKgorICogLy8gUmVnaXN0ZXIgdGhlIGFubm90YXRlZCByZXNvdXJjZS4KKyAqIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKEhlbGxvUmVzb3VyY2UuY2xhc3MpOworICoKKyAqIC8vIEFkZCBuZXcgImhlbGxvMiIgcmVzb3VyY2UgdXNpbmcgdGhlIGFubm90YXRlZCByZXNvdXJjZSBjbGFzcworICogLy8gYW5kIG92ZXJyaWRpbmcgdGhlIHJlc291cmNlIHBhdGguCisgKiBSZXNvdXJjZS5CdWlsZGVyIHJlc291cmNlQnVpbGRlciA9CisgKiAgICAgICAgIFJlc291cmNlLmJ1aWxkZXIoSGVsbG9SZXNvdXJjZS5jbGFzcywgbmV3IExpbmtlZExpc3QmbHQ7UmVzb3VyY2VNb2RlbElzc3VlJmd0OygpKQorICogICAgICAgICAucGF0aCgiaGVsbG8yIik7CisgKgorICogLy8gQWRkIGEgbmV3ICh2aXJ0dWFsKSBzdWItcmVzb3VyY2UgbWV0aG9kIHRvIHRoZSAiaGVsbG8yIiByZXNvdXJjZS4KKyAqIHJlc291cmNlQnVpbGRlci5hZGRDaGlsZFJlc291cmNlKCJ3b3JsZCIpLmFkZE1ldGhvZCgiR0VUIikKKyAqICAgICAgICAgLnByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAqICAgICAgICAgLmhhbmRsZWRCeShuZXcgSW5mbGVjdG9yJmx0O1JlcXVlc3QsIFN0cmluZyZndDsoKSB7CisgKiAgICAgICAgICAgICAgICAgJiM2NDtPdmVycmlkZQorICogICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgYXBwbHkoUmVxdWVzdCByZXF1ZXN0KSB7CisgKiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiSGVsbG8gV29ybGQhIjsKKyAqICAgICAgICAgICAgICAgICB9CisgKiAgICAgICAgIH0pOworICoKKyAqIC8vIFJlZ2lzdGVyIHRoZSBuZXcgcHJvZ3JhbW1hdGljIHJlc291cmNlIGluIHRoZSBhcHBsaWNhdGlvbidzIGNvbmZpZ3VyYXRpb24uCisgKiByZXNvdXJjZUNvbmZpZy5yZWdpc3RlclJlc291cmNlcyhyZXNvdXJjZUJ1aWxkZXIuYnVpbGQoKSk7CisgKiA8L3ByZT4KKyAqIFRoZSBmb2xsb3dpbmcgdGFibGUgaWxsdXN0cmF0ZXMgdGhlIHN1cHBvcnRlZCByZXF1ZXN0cyBhbmQgcHJvdmlkZWQgcmVzcG9uc2VzCisgKiBmb3IgdGhlIGFwcGxpY2F0aW9uIGNvbmZpZ3VyZWQgaW4gdGhlIGV4YW1wbGUgYWJvdmUuCisgKiA8dGFibGU+CisgKiA8dHI+CisgKiA8dGg+UmVxdWVzdDwvdGg+PHRoPlJlc3BvbnNlPC90aD48dGg+TWV0aG9kIGludm9rZWQ8L3RoPgorICogPC90cj4KKyAqIDx0cj4KKyAqIDx0ZD57QGNvZGUgIkdFVCAvaGVsbG8ifTwvdGQ+PHRkPntAY29kZSAiSGVsbG8hIn08L3RkPjx0ZD57QGNvZGUgSGVsbG9SZXNvdXJjZS5zYXlIZWxsbygpfTwvdGQ+CisgKiA8L3RyPgorICogPHRyPgorICogPHRkPntAY29kZSAiR0VUIC9oZWxsbzIifTwvdGQ+PHRkPntAY29kZSAiSGVsbG8hIn08L3RkPjx0ZD57QGNvZGUgSGVsbG9SZXNvdXJjZS5zYXlIZWxsbygpfTwvdGQ+CisgKiA8L3RyPgorICogPHRyPgorICogPHRkPntAY29kZSAiR0VUIC9oZWxsbzIvd29ybGQifTwvdGQ+PHRkPntAY29kZSAiSGVsbG8gV29ybGQhIn08L3RkPjx0ZD57QGNvZGUgSW5mbGVjdG9yLmFwcGx5KCl9PC90ZD4KKyAqIDwvdHI+CisgKiA8L3RhYmxlPgorICogPC9wPgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZSBpbXBsZW1lbnRzIFJvdXRlZCwgUmVzb3VyY2VNb2RlbENvbXBvbmVudCB7CisKKyAgICAvKioKKyAgICAgKiBJbW11dGFibGUgcmVzb3VyY2UgZGF0YSBob2xkZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGF0YSB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFN0cmluZz4gbmFtZXM7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHBhdGg7CisgICAgICAgIHByaXZhdGUgZmluYWwgUGF0aFBhdHRlcm4gcGF0aFBhdHRlcm47CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFJlc291cmNlTWV0aG9kLkRhdGE+IHJlc291cmNlTWV0aG9kczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZXNvdXJjZU1ldGhvZC5EYXRhIHN1YlJlc291cmNlTG9jYXRvcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFJlc291cmNlLkRhdGE+IGNoaWxkUmVzb3VyY2VzOworCisgICAgICAgIHByaXZhdGUgZmluYWwgU2V0PENsYXNzPD8+PiBoYW5kbGVyQ2xhc3NlczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8T2JqZWN0PiBoYW5kbGVySW5zdGFuY2VzOworCisgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBleHRlbmRlZDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGEgbmV3IGltbXV0YWJsZSByZXNvdXJjZSBkYXRhIGhvbGRlciBmcm9tIHRoZSBzdXBwbGllZCBwYXJhbWV0ZXJzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbmFtZXMgICAgICAgICAgICByZXNvdXJjZSBuYW1lcy4KKyAgICAgICAgICogQHBhcmFtIHBhdGggICAgICAgICAgICAgcmVzb3VyY2UgcGF0aC4KKyAgICAgICAgICogQHBhcmFtIHJlc291cmNlTWV0aG9kcyAgY2hpbGQgcmVzb3VyY2UgbWV0aG9kcy4KKyAgICAgICAgICogQHBhcmFtIHN1YlJlc291cmNlTG9jYXRvciAgICAgICAgICBjaGlsZCByZXNvdXJjZSBsb2NhdG9yLgorICAgICAgICAgKiBAcGFyYW0gY2hpbGRSZXNvdXJjZXMgICBjaGlsZCBzdWItcmVzb3VyY2VzLgorICAgICAgICAgKiBAcGFyYW0gaGFuZGxlckNsYXNzZXMgICBoYW5kbGVyIGNsYXNzZXMgaGFuZGxpbmcgdGhlIHJlc291cmNlIG1ldGhvZHMuCisgICAgICAgICAqIEBwYXJhbSBoYW5kbGVySW5zdGFuY2VzIGhhbmRsZXIgaW5zdGFuY2VzIGhhbmRsaW5nIHRoZSByZXNvdXJjZSBtZXRob2RzLgorICAgICAgICAgKiBAcGFyYW0gZXh0ZW5kZWQgICAgICAgICBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGUgcmVzb3VyY2UgaXMgZXh0ZW5kZWQKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgRGF0YSgKKyAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gbmFtZXMsCisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBhdGgsCisgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxSZXNvdXJjZU1ldGhvZC5EYXRhPiByZXNvdXJjZU1ldGhvZHMsCisgICAgICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VNZXRob2QuRGF0YSBzdWJSZXNvdXJjZUxvY2F0b3IsCisgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxEYXRhPiBjaGlsZFJlc291cmNlcywKKyAgICAgICAgICAgICAgICBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IGhhbmRsZXJDbGFzc2VzLAorICAgICAgICAgICAgICAgIGZpbmFsIFNldDxPYmplY3Q+IGhhbmRsZXJJbnN0YW5jZXMsCisgICAgICAgICAgICAgICAgYm9vbGVhbiBleHRlbmRlZCkgeworCisgICAgICAgICAgICB0aGlzLmV4dGVuZGVkID0gZXh0ZW5kZWQ7CisKKyAgICAgICAgICAgIHRoaXMubmFtZXMgPSBSZXNvdXJjZS5pbW11dGFibGVDb3B5KG5hbWVzKTsKKyAgICAgICAgICAgIHRoaXMucGF0aCA9IHBhdGg7CisgICAgICAgICAgICB0aGlzLnBhdGhQYXR0ZXJuID0gKHBhdGggPT0gbnVsbCB8fCBwYXRoLmlzRW1wdHkoKSkKKyAgICAgICAgICAgICAgICAgICAgPyBQYXRoUGF0dGVybi5PUEVOX1JPT1RfUEFUSF9QQVRURVJOCisgICAgICAgICAgICAgICAgICAgIDogbmV3IFBhdGhQYXR0ZXJuKHBhdGgsIFBhdGhQYXR0ZXJuLlJpZ2h0SGFuZFBhdGguY2FwdHVyaW5nWmVyb09yTW9yZVNlZ21lbnRzKTsKKyAgICAgICAgICAgIHRoaXMucmVzb3VyY2VNZXRob2RzID0gUmVzb3VyY2UuaW1tdXRhYmxlQ29weShyZXNvdXJjZU1ldGhvZHMpOworICAgICAgICAgICAgdGhpcy5zdWJSZXNvdXJjZUxvY2F0b3IgPSBzdWJSZXNvdXJjZUxvY2F0b3I7CisgICAgICAgICAgICB0aGlzLmNoaWxkUmVzb3VyY2VzID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChjaGlsZFJlc291cmNlcyk7IC8vIG5vIG5lZWQgdG8gZGVlcC1jb3B5IHRoZSBsaXN0CisKKyAgICAgICAgICAgIHRoaXMuaGFuZGxlckNsYXNzZXMgPSBSZXNvdXJjZS5pbW11dGFibGVDb3B5KGhhbmRsZXJDbGFzc2VzKTsKKyAgICAgICAgICAgIHRoaXMuaGFuZGxlckluc3RhbmNlcyA9IFJlc291cmNlLmltbXV0YWJsZUNvcHkoaGFuZGxlckluc3RhbmNlcyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiUmVzb3VyY2V7IgorICAgICAgICAgICAgICAgICAgICArICgocGF0aCA9PSBudWxsKSA/ICJbdW5ib3VuZF0sICIgOiAiXCIiICsgcGF0aCArICJcIiwgIikKKyAgICAgICAgICAgICAgICAgICAgKyBjaGlsZFJlc291cmNlcy5zaXplKCkgKyAiIGNoaWxkIHJlc291cmNlcywgIgorICAgICAgICAgICAgICAgICAgICArIHJlc291cmNlTWV0aG9kcy5zaXplKCkgKyAiIHJlc291cmNlIG1ldGhvZHMsICIKKyAgICAgICAgICAgICAgICAgICAgKyAoc3ViUmVzb3VyY2VMb2NhdG9yID09IG51bGwgPyAiMCIgOiAiMSIpICsgIiBzdWItcmVzb3VyY2UgbG9jYXRvciwgIgorICAgICAgICAgICAgICAgICAgICArIGhhbmRsZXJDbGFzc2VzLnNpemUoKSArICIgbWV0aG9kIGhhbmRsZXIgY2xhc3NlcywgIgorICAgICAgICAgICAgICAgICAgICArIGhhbmRsZXJJbnN0YW5jZXMuc2l6ZSgpICsgIiBtZXRob2QgaGFuZGxlciBpbnN0YW5jZXMiCisgICAgICAgICAgICAgICAgICAgICsgJ30nOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzb3VyY2UgbW9kZWwgY29tcG9uZW50IGJ1aWxkZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCdWlsZGVyIHsKKworICAgICAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBuYW1lczsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcGF0aDsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFNldDxSZXNvdXJjZU1ldGhvZC5CdWlsZGVyPiBtZXRob2RCdWlsZGVyczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8UmVzb3VyY2UuQnVpbGRlcj4gY2hpbGRSZXNvdXJjZUJ1aWxkZXJzOworICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8UmVzb3VyY2UuRGF0YT4gY2hpbGRSZXNvdXJjZXM7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFJlc291cmNlTWV0aG9kLkRhdGE+IHJlc291cmNlTWV0aG9kczsKKyAgICAgICAgcHJpdmF0ZSBSZXNvdXJjZU1ldGhvZC5EYXRhIHN1YlJlc291cmNlTG9jYXRvcjsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFNldDxDbGFzczw/Pj4gaGFuZGxlckNsYXNzZXM7CisgICAgICAgIHByaXZhdGUgZmluYWwgU2V0PE9iamVjdD4gaGFuZGxlckluc3RhbmNlczsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFJlc291cmNlLkJ1aWxkZXIgcGFyZW50UmVzb3VyY2U7CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGV4dGVuZGVkOworCisgICAgICAgIHByaXZhdGUgQnVpbGRlcihmaW5hbCBSZXNvdXJjZS5CdWlsZGVyIHBhcmVudFJlc291cmNlKSB7CisgICAgICAgICAgICB0aGlzLm1ldGhvZEJ1aWxkZXJzID0gbmV3IExpbmtlZEhhc2hTZXQ8PigpOworICAgICAgICAgICAgdGhpcy5jaGlsZFJlc291cmNlQnVpbGRlcnMgPSBuZXcgTGlua2VkSGFzaFNldDw+KCk7CisgICAgICAgICAgICB0aGlzLmNoaWxkUmVzb3VyY2VzID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgICAgICAgICAgdGhpcy5yZXNvdXJjZU1ldGhvZHMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgICAgICB0aGlzLmhhbmRsZXJDbGFzc2VzID0gQ29sbGVjdGlvbnMubmV3U2V0RnJvbU1hcChuZXcgSWRlbnRpdHlIYXNoTWFwPD4oKSk7CisgICAgICAgICAgICB0aGlzLmhhbmRsZXJJbnN0YW5jZXMgPSBDb2xsZWN0aW9ucy5uZXdTZXRGcm9tTWFwKG5ldyBJZGVudGl0eUhhc2hNYXA8PigpKTsKKyAgICAgICAgICAgIHRoaXMucGFyZW50UmVzb3VyY2UgPSBwYXJlbnRSZXNvdXJjZTsKKworICAgICAgICAgICAgbmFtZSgiW3VubmFtZWRdIik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEJ1aWxkZXIoZmluYWwgU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgICAgIHRoaXMoKFJlc291cmNlLkJ1aWxkZXIpIG51bGwpOworICAgICAgICAgICAgcGF0aChwYXRoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgQnVpbGRlcihmaW5hbCBTdHJpbmcgcGF0aCwgZmluYWwgUmVzb3VyY2UuQnVpbGRlciBwYXJlbnRSZXNvdXJjZSkgeworICAgICAgICAgICAgdGhpcyhwYXJlbnRSZXNvdXJjZSk7CisgICAgICAgICAgICB0aGlzLnBhdGggPSBwYXRoOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBCdWlsZGVyKCkgeworICAgICAgICAgICAgdGhpcygoUmVzb3VyY2UuQnVpbGRlcikgbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNFbXB0eSgpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnBhdGggPT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAmJiBtZXRob2RCdWlsZGVycy5pc0VtcHR5KCkKKyAgICAgICAgICAgICAgICAgICAgJiYgY2hpbGRSZXNvdXJjZUJ1aWxkZXJzLmlzRW1wdHkoKQorICAgICAgICAgICAgICAgICAgICAmJiByZXNvdXJjZU1ldGhvZHMuaXNFbXB0eSgpCisgICAgICAgICAgICAgICAgICAgICYmIGNoaWxkUmVzb3VyY2VzLmlzRW1wdHkoKQorICAgICAgICAgICAgICAgICAgICAmJiBzdWJSZXNvdXJjZUxvY2F0b3IgPT0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBEZWZpbmUgYSBuZXcgbmFtZSBvZiB0aGUgYnVpbHQgcmVzb3VyY2UuCisgICAgICAgICAqIDxwLz4KKyAgICAgICAgICogVGhlIHJlc291cmNlIG1vZGVsIG5hbWUgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIHJlcG9ydGluZworICAgICAgICAgKiBwdXJwb3NlcyAoZS5nLiB2YWxpZGF0aW9uIGV0Yy4pLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbmFtZSBuZXcgbmFtZSBvZiB0aGUgcmVzb3VyY2UuCisgICAgICAgICAqIEByZXR1cm4gdXBkYXRlZCBidWlsZGVyIG9iamVjdC4KKyAgICAgICAgICogQHNlZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2UjZ2V0TmFtZSgpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBuYW1lKGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICB0aGlzLm5hbWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICB0aGlzLm5hbWVzLmFkZChuYW1lKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIERlZmluZSBhIG5ldyBwYXRoIGZvciB0aGUgYnVpbHQgcmVzb3VyY2UuCisgICAgICAgICAqIDxwLz4KKyAgICAgICAgICogTk9URTogSW52b2tpbmcgdGhpcyBtZXRob2QgbWFya3MgYSByZXNvdXJjZSBhcyBhIHJvb3QgcmVzb3VyY2UuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwYXRoIG5ldyBwYXRoIGZvciB0aGUgcmVzb3VyY2UuCisgICAgICAgICAqIEByZXR1cm4gdXBkYXRlZCBidWlsZGVyIG9iamVjdC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHBhdGgoZmluYWwgU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgICAgIHRoaXMucGF0aCA9IHBhdGg7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgYSBuZXcgbWV0aG9kIG1vZGVsIHRvIHRoZSByZXNvdXJjZSBmb3IgcHJvY2Vzc2luZyByZXF1ZXN0cyBvZgorICAgICAgICAgKiB0aGUgc3BlY2lmaWVkIEhUVFAgbWV0aG9kLgorICAgICAgICAgKiA8cC8+CisgICAgICAgICAqIFRoZSByZXR1cm5lZCBidWlsZGVyIGlzIGF1dG9tYXRpY2FsbHkgYm91bmQgdG8gdGhlIHRoZSByZXNvdXJjZS4gSXQgaXMKKyAgICAgICAgICogbm90IG5lY2Vzc2FyeSB0byBpbnZva2UgdGhlIHtAbGluayBSZXNvdXJjZU1ldGhvZC5CdWlsZGVyI2J1aWxkKCkgYnVpbGQoKX0KKyAgICAgICAgICogbWV0aG9kIG9uIHRoZSBtZXRob2QgYnVpbGRlciBhZnRlciBzZXR0aW5nIGFsbCB0aGUgZGF0YS4gVGhpcyB3aWxsIGJlCisgICAgICAgICAqIGRvbmUgYXV0b21hdGljYWxseSB3aGVuIHRoZSByZXNvdXJjZSBpcyBidWlsdC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGh0dHBNZXRob2QgSFRUUCBtZXRob2QgdGhhdCB3aWxsIGJlIHByb2Nlc3NlZCBieSB0aGUgbWV0aG9kLgorICAgICAgICAgKiBAcmV0dXJuIGEgbmV3IHJlc291cmNlIG1ldGhvZCBidWlsZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFJlc291cmNlTWV0aG9kLkJ1aWxkZXIgYWRkTWV0aG9kKGZpbmFsIFN0cmluZyBodHRwTWV0aG9kKSB7CisgICAgICAgICAgICBSZXNvdXJjZU1ldGhvZC5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUmVzb3VyY2VNZXRob2QuQnVpbGRlcih0aGlzKTsKKyAgICAgICAgICAgIG1ldGhvZEJ1aWxkZXJzLmFkZChidWlsZGVyKTsKKyAgICAgICAgICAgIHJldHVybiBidWlsZGVyLmh0dHBNZXRob2QoaHR0cE1ldGhvZCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIGEgbmV3IGFyYml0cmFyeSBtZXRob2QgbW9kZWwgdG8gdGhlIHJlc291cmNlLgorICAgICAgICAgKiA8cC8+CisgICAgICAgICAqIFRoZSByZXR1cm5lZCBidWlsZGVyIGlzIGF1dG9tYXRpY2FsbHkgYm91bmQgdG8gdGhlIHRoZSByZXNvdXJjZS4gSXQgaXMKKyAgICAgICAgICogbm90IG5lY2Vzc2FyeSB0byBpbnZva2UgdGhlIHtAbGluayBSZXNvdXJjZU1ldGhvZC5CdWlsZGVyI2J1aWxkKCkgYnVpbGQoKX0KKyAgICAgICAgICogbWV0aG9kIG9uIHRoZSBtZXRob2QgYnVpbGRlciBhZnRlciBzZXR0aW5nIGFsbCB0aGUgZGF0YS4gVGhpcyB3aWxsIGJlCisgICAgICAgICAqIGRvbmUgYXV0b21hdGljYWxseSB3aGVuIHRoZSByZXNvdXJjZSBpcyBidWlsdC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBhIG5ldyByZXNvdXJjZSBtZXRob2QgYnVpbGRlci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBSZXNvdXJjZU1ldGhvZC5CdWlsZGVyIGFkZE1ldGhvZCgpIHsKKyAgICAgICAgICAgIFJlc291cmNlTWV0aG9kLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBSZXNvdXJjZU1ldGhvZC5CdWlsZGVyKHRoaXMpOworICAgICAgICAgICAgbWV0aG9kQnVpbGRlcnMuYWRkKGJ1aWxkZXIpOworICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXI7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIGEgbmV3IG1ldGhvZCBtb2RlbCB0aGF0IGlzIGEgY29weSBvZiB0aGUgZ2l2ZW4ge0Bjb2RlIHJlc291cmNlTWV0aG9kfS4KKyAgICAgICAgICogPHAvPgorICAgICAgICAgKiBUaGUgcmV0dXJuZWQgYnVpbGRlciBpcyBhdXRvbWF0aWNhbGx5IGJvdW5kIHRvIHRoZSB0aGUgcmVzb3VyY2UuIEl0IGlzCisgICAgICAgICAqIG5vdCBuZWNlc3NhcnkgdG8gaW52b2tlIHRoZSB7QGxpbmsgUmVzb3VyY2VNZXRob2QuQnVpbGRlciNidWlsZCgpIGJ1aWxkKCl9CisgICAgICAgICAqIG1ldGhvZCBvbiB0aGUgbWV0aG9kIGJ1aWxkZXIgYWZ0ZXIgc2V0dGluZyBhbGwgdGhlIGRhdGEuIFRoaXMgd2lsbCBiZQorICAgICAgICAgKiBkb25lIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgcmVzb3VyY2UgaXMgYnVpbHQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSByZXNvdXJjZU1ldGhvZCBUaGUgcmVzb3VyY2UgbWV0aG9kIGJhc2VkIG9uIHdoaWNoIHRoZSBuZXcgbWV0aG9kIGJ1aWxkZXIKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBjcmVhdGVkLgorICAgICAgICAgKiBAcmV0dXJuIGEgbmV3IHJlc291cmNlIG1ldGhvZCBidWlsZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFJlc291cmNlTWV0aG9kLkJ1aWxkZXIgYWRkTWV0aG9kKFJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kKSB7CisgICAgICAgICAgICBSZXNvdXJjZU1ldGhvZC5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUmVzb3VyY2VNZXRob2QuQnVpbGRlcih0aGlzLCByZXNvdXJjZU1ldGhvZCk7CisgICAgICAgICAgICBtZXRob2RCdWlsZGVycy5hZGQoYnVpbGRlcik7CisgICAgICAgICAgICByZXR1cm4gYnVpbGRlcjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgYSBtZXRob2QgYnVpbGRlciBmb3IgYW4gZXhpc3RpbmcgcmVzb3VyY2UgbWV0aG9kLgorICAgICAgICAgKiA8cC8+CisgICAgICAgICAqIFRoZSBvcmlnaW5hbCBtZXRob2QgaXMgcmVtb3ZlZCBmcm9tIHRoZSByZXNvdXJjZSBhbmQgYSBidWlsZGVyIGJhc2VkIG9uIGl0IGlzIGFkZGVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcmVzb3VyY2VNZXRob2QgVGhlIHJlc291cmNlIG1ldGhvZCB0byBiZSByZXBsYWNlZCBieSBhIGJ1aWxkZXIuCisgICAgICAgICAqIEByZXR1cm4gYSBuZXcgcmVzb3VyY2UgbWV0aG9kIGJ1aWxkZXIuCisgICAgICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbiBjYXNlIHRoZSBtZXRob2QgdG8gYmUgdXBkYXRlZCBpcyBub3QgcmVnaXN0ZXJlZAorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhpcyByZXNvdXJjZSBidWlsZGVyLgorICAgICAgICAgKiBAc2luY2UgMi4xOAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFJlc291cmNlTWV0aG9kLkJ1aWxkZXIgdXBkYXRlTWV0aG9kKFJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kKSB7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIHJlbW92ZWQgPSByZXNvdXJjZU1ldGhvZHMucmVtb3ZlKHJlc291cmNlTWV0aG9kLmdldERhdGEoKSk7CisgICAgICAgICAgICBpZiAoIXJlbW92ZWQpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxpemF0aW9uTWVzc2FnZXMuUkVTT1VSQ0VfVVBEQVRFRF9NRVRIT0RfRE9FU19OT1RfRVhJU1QocmVzb3VyY2VNZXRob2QudG9TdHJpbmcoKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgUmVzb3VyY2VNZXRob2QuQnVpbGRlciBidWlsZGVyID0gbmV3IFJlc291cmNlTWV0aG9kLkJ1aWxkZXIodGhpcywgcmVzb3VyY2VNZXRob2QpOworICAgICAgICAgICAgbWV0aG9kQnVpbGRlcnMuYWRkKGJ1aWxkZXIpOworICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXI7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIGEgbmV3IGNoaWxkIHJlc291cmNlIHRvIHRoZSByZXNvdXJjZS4KKyAgICAgICAgICogPHAvPgorICAgICAgICAgKiBUaGUgcmV0dXJuZWQgYnVpbGRlciBpcyBhdXRvbWF0aWNhbGx5IGJvdW5kIHRvIHRoZSB0aGUgcmVzb3VyY2UuIEl0IGlzCisgICAgICAgICAqIG5vdCBuZWNlc3NhcnkgdG8gaW52b2tlIHRoZSB7QGxpbmsgUmVzb3VyY2UuQnVpbGRlciNidWlsZCgpIGJ1aWxkKCl9CisgICAgICAgICAqIG1ldGhvZCBvbiB0aGUgcmVzb3VyY2UgYnVpbGRlciBhZnRlciBzZXR0aW5nIGFsbCB0aGUgZGF0YS4gVGhpcyB3aWxsIGJlCisgICAgICAgICAqIGRvbmUgYXV0b21hdGljYWxseSB3aGVuIHRoZSByZXNvdXJjZSBpcyBidWlsdC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHJlbGF0aXZlUGF0aCBUaGUgcGF0aCBvZiB0aGUgbmV3IGNoaWxkIHJlc291cmNlIHJlbGF0aXZlIHRvIHRoaXMgcmVzb3VyY2UuCisgICAgICAgICAqIEByZXR1cm4gY2hpbGQgcmVzb3VyY2UgYnVpbGRlci4KKyAgICAgICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGluIGNhc2UgdGhlIGNoaWxkIHJlc291cmNlIGZvciB0aGlzIHBhdGggZXhpc3RzIGFscmVhZHkuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRDaGlsZFJlc291cmNlKFN0cmluZyByZWxhdGl2ZVBhdGgpIHsKKyAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudFJlc291cmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlJFU09VUkNFX0FERF9DSElMRF9BTFJFQURZX0NISUxEKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgQnVpbGRlciByZXNvdXJjZUJ1aWxkZXIgPSBuZXcgQnVpbGRlcihyZWxhdGl2ZVBhdGgsIHRoaXMpOworCisgICAgICAgICAgICBjaGlsZFJlc291cmNlQnVpbGRlcnMuYWRkKHJlc291cmNlQnVpbGRlcik7CisgICAgICAgICAgICByZXR1cm4gcmVzb3VyY2VCdWlsZGVyOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBhbiBleGlzdGluZyBSZXNvdXJjZSBhcyBhIGNoaWxkIHJlc291cmNlIG9mIGN1cnJlbnQgcmVzb3VyY2UuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSByZXNvdXJjZSBSZXNvdXJjZSB0byBiZSBhZGRlZCBhcyBjaGlsZCByZXNvdXJjZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGFkZENoaWxkUmVzb3VyY2UoUmVzb3VyY2UgcmVzb3VyY2UpIHsKKyAgICAgICAgICAgIHRoaXMuY2hpbGRSZXNvdXJjZXMuYWRkKHJlc291cmNlLmRhdGEpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlcGxhY2UgYW4gZXhpc3RpbmcgY2hpbGQgcmVzb3VyY2Ugd2l0aCBhIG5ld2x5IHN1cHBsaWVkIG9uZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHJlcGxhY2VkUmVzb3VyY2Ugb2xkIHJlc291cmNlIHRvIGJlIHJlcGxhY2VkLgorICAgICAgICAgKiBAcGFyYW0gbmV3UmVzb3VyY2UgICAgICBuZXcgcmVzb3VyY2UgdG8gYWRkLgorICAgICAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW4gY2FzZSB0aGVyZSBpcyBubyBzdWNoIGNoaWxkIHJlc291cmNlIHRvIGJlIHJlcGxhY2VkLgorICAgICAgICAgKiBAc2luY2UgMi4xOAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgcmVwbGFjZUNoaWxkUmVzb3VyY2UoUmVzb3VyY2UgcmVwbGFjZWRSZXNvdXJjZSwgUmVzb3VyY2UgbmV3UmVzb3VyY2UpIHsKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVtb3ZlZCA9IHRoaXMuY2hpbGRSZXNvdXJjZXMucmVtb3ZlKHJlcGxhY2VkUmVzb3VyY2UuZGF0YSk7CisgICAgICAgICAgICBpZiAoIXJlbW92ZWQpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxpemF0aW9uTWVzc2FnZXMuUkVTT1VSQ0VfUkVQTEFDRURfQ0hJTERfRE9FU19OT1RfRVhJU1QocmVwbGFjZWRSZXNvdXJjZS50b1N0cmluZygpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhZGRDaGlsZFJlc291cmNlKG5ld1Jlc291cmNlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBNZXJnZSBtZXRob2RzIGZyb20gYSBnaXZlbiByZXNvdXJjZSBtb2RlbCBpbnRvIHRoaXMgcmVzb3VyY2UgbW9kZWwgYnVpbGRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHJlc291cmNlIHRvIGJlIG1lcmdlZCBpbnRvIHRoaXMgcmVzb3VyY2UgbW9kZWwgYnVpbGRlci4KKyAgICAgICAgICogQHJldHVybiB1cGRhdGVkIGJ1aWxkZXIgb2JqZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgbWVyZ2VXaXRoKGZpbmFsIFJlc291cmNlIHJlc291cmNlKSB7CisgICAgICAgICAgICBtZXJnZVdpdGgocmVzb3VyY2UuZGF0YSk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSByZXNvdXJjZSBpcyBleHRlbmRlZCBvciBpcyBhIGNvcmUgb2YgZXhwb3NlZCBSRVNUZnVsIEFQSS4KKyAgICAgICAgICogPHAvPgorICAgICAgICAgKiBUaGUgbWV0aG9kIGRlZmluZXMgdGhlIGZsYWcgYXZhaWxhYmxlIGF0IHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2UjaXNFeHRlbmRlZCgpfS4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIEV4dGVuZGVkIHJlc291cmNlIG1vZGVsIGNvbXBvbmVudHMgYXJlIGhlbHBlciBjb21wb25lbnRzIHRoYXQgYXJlIG5vdCBjb25zaWRlcmVkIGFzIGEgY29yZSBvZiBhCisgICAgICAgICAqIFJFU1RmdWwgQVBJLiBUaGVzZSBjYW4gYmUgZm9yIGV4YW1wbGUge0Bjb2RlIE9QVElPTlN9IHtAbGluayBSZXNvdXJjZU1ldGhvZCByZXNvdXJjZSBtZXRob2RzfQorICAgICAgICAgKiBhZGRlZCBieSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLk1vZGVsUHJvY2Vzc29yIG1vZGVsIHByb2Nlc3NvcnN9CisgICAgICAgICAqIG9yIHtAY29kZSBhcHBsaWNhdGlvbi53YWRsfSByZXNvdXJjZSBwcm9kdWNpbmcgdGhlIFdBREwuIEJvdGggcmVzb3VyY2UgYXJlIHJhdGhlciBzdXBwb3J0aXZlCisgICAgICAgICAqIHRoYW4gdGhlIGNvcmUgb2YgUkVTVGZ1bCBBUEkuCisgICAgICAgICAqIDwvcD4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIElmIG5vdCBzZXQgdGhlIHJlc291cmNlIHdpbGwgbm90IGJlIGRlZmluZWQgYXMgZXh0ZW5kZWQgYnkgZGVmYXVsdC4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZXh0ZW5kZWQgSWYge0Bjb2RlIHRydWV9IHRoZW4gcmVzb3VyY2UgaXMgbWFya2VkIGFzIGV4dGVuZGVkLgorICAgICAgICAgKiBAcmV0dXJuIHVwZGF0ZWQgYnVpbGRlciBvYmplY3QuCisgICAgICAgICAqIEBzZWUgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLkV4dGVuZGVkUmVzb3VyY2UKKyAgICAgICAgICogQHNpbmNlIDIuNS4xCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBleHRlbmRlZChib29sZWFuIGV4dGVuZGVkKSB7CisgICAgICAgICAgICB0aGlzLmV4dGVuZGVkID0gZXh0ZW5kZWQ7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSByZXNvdXJjZSBtZXRob2QgaXMgZXh0ZW5kZWQgb3IgaXMgYSBjb3JlIG9mIGV4cG9zZWQgUkVTVGZ1bCBBUEkuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBtZXRob2QgaXMgZXh0ZW5kZWQuCisgICAgICAgICAqLworICAgICAgICAvKiBwYWNrYWdlICovIGJvb2xlYW4gaXNFeHRlbmRlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBleHRlbmRlZDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgQnVpbGRlciBtZXJnZVdpdGgoZmluYWwgUmVzb3VyY2UuRGF0YSByZXNvdXJjZURhdGEpIHsKKyAgICAgICAgICAgIHRoaXMucmVzb3VyY2VNZXRob2RzLmFkZEFsbChyZXNvdXJjZURhdGEucmVzb3VyY2VNZXRob2RzKTsKKyAgICAgICAgICAgIHRoaXMuY2hpbGRSZXNvdXJjZXMuYWRkQWxsKHJlc291cmNlRGF0YS5jaGlsZFJlc291cmNlcyk7CisKKyAgICAgICAgICAgIGlmIChzdWJSZXNvdXJjZUxvY2F0b3IgIT0gbnVsbCAmJiByZXNvdXJjZURhdGEuc3ViUmVzb3VyY2VMb2NhdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBFcnJvcnMucHJvY2Vzc1dpdGhFeGNlcHRpb24obmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JzLmVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGl6YXRpb25NZXNzYWdlcy5SRVNPVVJDRV9NRVJHRV9DT05GTElDVF9MT0NBVE9SUyhCdWlsZGVyLnRoaXMsIHJlc291cmNlRGF0YSwgcGF0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldmVyaXR5LkZBVEFMKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNvdXJjZURhdGEuc3ViUmVzb3VyY2VMb2NhdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnN1YlJlc291cmNlTG9jYXRvciA9IHJlc291cmNlRGF0YS5zdWJSZXNvdXJjZUxvY2F0b3I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMuaGFuZGxlckNsYXNzZXMuYWRkQWxsKHJlc291cmNlRGF0YS5oYW5kbGVyQ2xhc3Nlcyk7CisgICAgICAgICAgICB0aGlzLmhhbmRsZXJJbnN0YW5jZXMuYWRkQWxsKHJlc291cmNlRGF0YS5oYW5kbGVySW5zdGFuY2VzKTsKKworICAgICAgICAgICAgdGhpcy5uYW1lcy5hZGRBbGwocmVzb3VyY2VEYXRhLm5hbWVzKTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogTWVyZ2UgbWV0aG9kcyBmcm9tIGEgZ2l2ZW4gcmVzb3VyY2UgbW9kZWwgYnVpbGRlciBpbnRvIHRoaXMgcmVzb3VyY2UgbW9kZWwKKyAgICAgICAgICogYnVpbGRlci4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIE5PVEU6IEFueSAib3BlbiIgbWV0aG9kIGJ1aWxkZXJzIGluIHRoZSBzdXBwbGllZCB7QGNvZGUgcmVzb3VyY2VCdWlsZGVyfSB0aGF0IGhhdmUKKyAgICAgICAgICogbm90IGJlZW4ge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1ldGhvZC5CdWlsZGVyI2J1aWxkKCkKKyAgICAgICAgICogZXhwbGljaXRseSBjb252ZXJ0ZWQgdG8gbWV0aG9kIG1vZGVsc30gd2lsbCBiZSBjbG9zZWQgYXMgcGFydCBvZiB0aGlzIG1lcmdlIG9wZXJhdGlvbgorICAgICAgICAgKiBiZWZvcmUgbWVyZ2luZyB0aGUgcmVzb3VyY2UgYnVpbGRlciBpbnN0YW5jZXMuCisgICAgICAgICAqIDwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHJlc291cmNlQnVpbGRlciB0byBiZSBtZXJnZWQgaW50byB0aGlzIHJlc291cmNlIG1vZGVsIGJ1aWxkZXIuCisgICAgICAgICAqIEByZXR1cm4gdXBkYXRlZCBidWlsZGVyIG9iamVjdC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIG1lcmdlV2l0aChmaW5hbCBCdWlsZGVyIHJlc291cmNlQnVpbGRlcikgeworICAgICAgICAgICAgcmVzb3VyY2VCdWlsZGVyLnByb2Nlc3NNZXRob2RCdWlsZGVycygpOworCisgICAgICAgICAgICB0aGlzLnJlc291cmNlTWV0aG9kcy5hZGRBbGwocmVzb3VyY2VCdWlsZGVyLnJlc291cmNlTWV0aG9kcyk7CisgICAgICAgICAgICB0aGlzLmNoaWxkUmVzb3VyY2VzLmFkZEFsbChyZXNvdXJjZUJ1aWxkZXIuY2hpbGRSZXNvdXJjZXMpOworICAgICAgICAgICAgaWYgKFJlc291cmNlLkJ1aWxkZXIudGhpcy5zdWJSZXNvdXJjZUxvY2F0b3IgIT0gbnVsbCAmJiByZXNvdXJjZUJ1aWxkZXIuc3ViUmVzb3VyY2VMb2NhdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBFcnJvcnMucHJvY2Vzc1dpdGhFeGNlcHRpb24obmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JzLndhcm5pbmcodGhpcywgTG9jYWxpemF0aW9uTWVzc2FnZXMuUkVTT1VSQ0VfTUVSR0VfQ09ORkxJQ1RfTE9DQVRPUlMoUmVzb3VyY2UuQnVpbGRlci50aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZUJ1aWxkZXIsIHBhdGgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfSBlbHNlIGlmIChyZXNvdXJjZUJ1aWxkZXIuc3ViUmVzb3VyY2VMb2NhdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnN1YlJlc291cmNlTG9jYXRvciA9IHJlc291cmNlQnVpbGRlci5zdWJSZXNvdXJjZUxvY2F0b3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLmhhbmRsZXJDbGFzc2VzLmFkZEFsbChyZXNvdXJjZUJ1aWxkZXIuaGFuZGxlckNsYXNzZXMpOworICAgICAgICAgICAgdGhpcy5oYW5kbGVySW5zdGFuY2VzLmFkZEFsbChyZXNvdXJjZUJ1aWxkZXIuaGFuZGxlckluc3RhbmNlcyk7CisgICAgICAgICAgICB0aGlzLm5hbWVzLmFkZEFsbChyZXNvdXJjZUJ1aWxkZXIubmFtZXMpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBuZXcgcmVzb3VyY2UsIHN1Yi1yZXNvdXJjZSBhbmQgc3ViLXJlc291cmNlIGxvY2F0b3IgbWV0aG9kCisgICAgICAgICAqIHdhcyBidWlsdCBhbmQgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgcmVzb3VyY2UgYnVpbGRlci4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoaXMgaXMgYSBmcmllbmQgY2FsbC1iYWNrIEFQSSBleHBvc2VkIGZvciBhIHVzZSBieSBhIHtAbGluayBSZXNvdXJjZU1ldGhvZC5CdWlsZGVyCisgICAgICAgICAqIFJlc291cmNlTWV0aG9kLkJ1aWxkZXJ9LgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBidWlsZGVyICAgIGJ1aWxkZXIgaW5zdGFuY2UgdGhhdCBidWlsdCB0aGUgbWV0aG9kLgorICAgICAgICAgKiBAcGFyYW0gbWV0aG9kRGF0YSBuZXcgcmVzb3VyY2UsIHN1Yi1yZXNvdXJjZSBvciBzdWItcmVzb3VyY2UgbG9jYXRvcgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBvbkJ1aWxkTWV0aG9kKFJlc291cmNlTWV0aG9kLkJ1aWxkZXIgYnVpbGRlciwgUmVzb3VyY2VNZXRob2QuRGF0YSBtZXRob2REYXRhKSB7CisgICAgICAgICAgICBQcmVjb25kaXRpb25zLmNoZWNrU3RhdGUobWV0aG9kQnVpbGRlcnMucmVtb3ZlKGJ1aWxkZXIpLAorICAgICAgICAgICAgICAgICAgICAiUmVzb3VyY2UuQnVpbGRlci5vbkJ1aWxkTWV0aG9kKCkgaW52b2tlZCBmcm9tIGEgcmVzb3VyY2UgbWV0aG9kIGJ1aWxkZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInRoYXQgaXMgbm90IHJlZ2lzdGVyZWQgaW4gdGhlIHJlc291cmNlIGJ1aWxkZXIgaW5zdGFuY2UuIik7CisKKyAgICAgICAgICAgIHN3aXRjaCAobWV0aG9kRGF0YS5nZXRUeXBlKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIFJFU09VUkNFX01FVEhPRDoKKyAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VNZXRob2RzLmFkZChtZXRob2REYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBTVUJfUkVTT1VSQ0VfTE9DQVRPUjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN1YlJlc291cmNlTG9jYXRvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBFcnJvcnMucHJvY2Vzc1dpdGhFeGNlcHRpb24obmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JzLmVycm9yKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxpemF0aW9uTWVzc2FnZXMuQU1CSUdVT1VTX1NSTFModGhpcywgcGF0aCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V2ZXJpdHkuRkFUQUwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3ViUmVzb3VyY2VMb2NhdG9yID0gbWV0aG9kRGF0YTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIE1ldGhvZEhhbmRsZXIgbWV0aG9kSGFuZGxlciA9IG1ldGhvZERhdGEuZ2V0SW52b2NhYmxlKCkuZ2V0SGFuZGxlcigpOworICAgICAgICAgICAgaWYgKG1ldGhvZEhhbmRsZXIuaXNDbGFzc0Jhc2VkKCkpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVyQ2xhc3Nlcy5hZGQobWV0aG9kSGFuZGxlci5nZXRIYW5kbGVyQ2xhc3MoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGhhbmRsZXJJbnN0YW5jZXMuYWRkKG1ldGhvZEhhbmRsZXIuZ2V0SGFuZGxlckluc3RhbmNlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIG9uQnVpbGRDaGlsZFJlc291cmNlKEJ1aWxkZXIgY2hpbGRSZXNvdXJjZUJ1aWxkZXIsIFJlc291cmNlLkRhdGEgY2hpbGRSZXNvdXJjZURhdGEpIHsKKyAgICAgICAgICAgIFByZWNvbmRpdGlvbnMuY2hlY2tTdGF0ZShjaGlsZFJlc291cmNlQnVpbGRlcnMucmVtb3ZlKGNoaWxkUmVzb3VyY2VCdWlsZGVyKSwKKyAgICAgICAgICAgICAgICAgICAgIlJlc291cmNlLkJ1aWxkZXIub25CdWlsZENoaWxkUmVzb3VyY2UoKSBpbnZva2VkIGZyb20gYSByZXNvdXJjZSBidWlsZGVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJ0aGF0IGlzIG5vdCByZWdpc3RlcmVkIGluIHRoZSByZXNvdXJjZSBidWlsZGVyIGluc3RhbmNlIGFzIGEgY2hpbGQgcmVzb3VyY2UgYnVpbGRlci4iKTsKKyAgICAgICAgICAgIGNoaWxkUmVzb3VyY2VzLmFkZChjaGlsZFJlc291cmNlRGF0YSk7CisKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgTGlzdDxSZXNvdXJjZS5EYXRhPiBtZXJnZVJlc291cmNlcyhMaXN0PFJlc291cmNlLkRhdGE+IHJlc291cmNlcykgeworICAgICAgICAgICAgTGlzdDxSZXNvdXJjZS5EYXRhPiBtZXJnZWRSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgUmVzb3VyY2UuRGF0YSBvdXRlciA9IHJlc291cmNlcy5nZXQoaSk7CisgICAgICAgICAgICAgICAgUmVzb3VyY2UuQnVpbGRlciBidWlsZGVyID0gbnVsbDsKKworICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSBpICsgMTsgaiA8IHJlc291cmNlcy5zaXplKCk7IGorKykgeworICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZS5EYXRhIGlubmVyID0gcmVzb3VyY2VzLmdldChqKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAob3V0ZXIucGF0aC5lcXVhbHMoaW5uZXIucGF0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidWlsZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyID0gUmVzb3VyY2UuYnVpbGRlcihvdXRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLm1lcmdlV2l0aChpbm5lcik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMucmVtb3ZlKGopOworICAgICAgICAgICAgICAgICAgICAgICAgLy9ub2luc3BlY3Rpb24gQXNzaWdubWVudFRvRm9yTG9vcFBhcmFtZXRlcgorICAgICAgICAgICAgICAgICAgICAgICAgai0tOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChidWlsZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVyZ2VkUmVzb3VyY2VzLmFkZChvdXRlcik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbWVyZ2VkUmVzb3VyY2VzLmFkZChidWlsZGVyLmJ1aWxkUmVzb3VyY2VEYXRhKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtZXJnZWRSZXNvdXJjZXM7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIERhdGEgYnVpbGRSZXNvdXJjZURhdGEoKSB7CisgICAgICAgICAgICBpZiAocGFyZW50UmVzb3VyY2UgIT0gbnVsbCAmJiBwYXJlbnRSZXNvdXJjZS5pc0V4dGVuZGVkKCkpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmV4dGVuZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJvY2Vzc01ldGhvZEJ1aWxkZXJzKCk7CisgICAgICAgICAgICBwcm9jZXNzQ2hpbGRSZXNvdXJjZUJ1aWxkZXJzKCk7CisKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8RGF0YT4gbWVyZ2VkQ2hpbGRSZXNvdXJjZXMgPSBtZXJnZVJlc291cmNlcyhjaGlsZFJlc291cmNlcyk7CisgICAgICAgICAgICBTZXQ8Q2xhc3M8Pz4+IGNsYXNzZXMgPSBuZXcgSGFzaFNldDw+KGhhbmRsZXJDbGFzc2VzKTsKKyAgICAgICAgICAgIFNldDxPYmplY3Q+IGluc3RhbmNlcyA9IG5ldyBIYXNoU2V0PD4oaGFuZGxlckluc3RhbmNlcyk7CisgICAgICAgICAgICBmb3IgKERhdGEgY2hpbGRSZXNvdXJjZSA6IG1lcmdlZENoaWxkUmVzb3VyY2VzKSB7CisgICAgICAgICAgICAgICAgY2xhc3Nlcy5hZGRBbGwoY2hpbGRSZXNvdXJjZS5oYW5kbGVyQ2xhc3Nlcyk7CisgICAgICAgICAgICAgICAgaW5zdGFuY2VzLmFkZEFsbChjaGlsZFJlc291cmNlLmhhbmRsZXJJbnN0YW5jZXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoYXJlQWxsTWVtYmVyc0V4dGVuZGVkKG1lcmdlZENoaWxkUmVzb3VyY2VzKSkgeworICAgICAgICAgICAgICAgIGV4dGVuZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgRGF0YSByZXNvdXJjZURhdGEgPSBuZXcgRGF0YSgKKyAgICAgICAgICAgICAgICAgICAgbmFtZXMsCisgICAgICAgICAgICAgICAgICAgIHBhdGgsCisgICAgICAgICAgICAgICAgICAgIHJlc291cmNlTWV0aG9kcywKKyAgICAgICAgICAgICAgICAgICAgc3ViUmVzb3VyY2VMb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICBtZXJnZWRDaGlsZFJlc291cmNlcywKKyAgICAgICAgICAgICAgICAgICAgY2xhc3NlcywKKyAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VzLAorICAgICAgICAgICAgICAgICAgICBleHRlbmRlZCk7CisKKyAgICAgICAgICAgIGlmIChwYXJlbnRSZXNvdXJjZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcGFyZW50UmVzb3VyY2Uub25CdWlsZENoaWxkUmVzb3VyY2UodGhpcywgcmVzb3VyY2VEYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXNvdXJjZURhdGE7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gYXJlQWxsTWVtYmVyc0V4dGVuZGVkKExpc3Q8RGF0YT4gbWVyZ2VkQ2hpbGRSZXNvdXJjZXMpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gYWxsRXh0ZW5kZWQgPSB0cnVlOworICAgICAgICAgICAgZm9yIChSZXNvdXJjZU1ldGhvZC5EYXRhIHJlc291cmNlTWV0aG9kIDogcmVzb3VyY2VNZXRob2RzKSB7CisgICAgICAgICAgICAgICAgaWYgKCFyZXNvdXJjZU1ldGhvZC5pc0V4dGVuZGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYWxsRXh0ZW5kZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3ViUmVzb3VyY2VMb2NhdG9yICE9IG51bGwgJiYgIXN1YlJlc291cmNlTG9jYXRvci5pc0V4dGVuZGVkKCkpIHsKKyAgICAgICAgICAgICAgICBhbGxFeHRlbmRlZCA9IGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKERhdGEgY2hpbGRSZXNvdXJjZSA6IG1lcmdlZENoaWxkUmVzb3VyY2VzKSB7CisgICAgICAgICAgICAgICAgaWYgKCFjaGlsZFJlc291cmNlLmV4dGVuZGVkKSB7CisgICAgICAgICAgICAgICAgICAgIGFsbEV4dGVuZGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGFsbEV4dGVuZGVkOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJ1aWxkIGEgbmV3IHJlc291cmNlIG1vZGVsLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIG5ldyAoaW1tdXRhYmxlKSByZXNvdXJjZSBtb2RlbC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBSZXNvdXJjZSBidWlsZCgpIHsKKyAgICAgICAgICAgIGZpbmFsIERhdGEgcmVzb3VyY2VEYXRhID0gYnVpbGRSZXNvdXJjZURhdGEoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2UobnVsbCwgcmVzb3VyY2VEYXRhKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTWV0aG9kQnVpbGRlcnMoKSB7CisgICAgICAgICAgICAvLyBXZSBoYXZlIHRvIGl0ZXJhdGUgdGhlIHNldCB0aGlzIHdheSB0byBwcmV2ZW50IENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb25zCisgICAgICAgICAgICAvLyBjYXVzZWQgYnkgdGhlIG5lc3RlZCBpbnZvY2F0aW9uIG9mIFNldC5yZW1vdmUoLi4uKSBpbiBSZXNvdXJjZS5CdWlsZGVyLm9uQnVpbGRNZXRob2QoLi4uKS4KKyAgICAgICAgICAgIHdoaWxlICghbWV0aG9kQnVpbGRlcnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgbWV0aG9kQnVpbGRlcnMuaXRlcmF0b3IoKS5uZXh0KCkuYnVpbGQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQ2hpbGRSZXNvdXJjZUJ1aWxkZXJzKCkgeworICAgICAgICAgICAgLy8gV2UgaGF2ZSB0byBpdGVyYXRlIHRoZSBzZXQgdGhpcyB3YXkgdG8gcHJldmVudCBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9ucworICAgICAgICAgICAgLy8gY2F1c2VkIGJ5IHRoZSBuZXN0ZWQgaW52b2NhdGlvbiBvZiBTZXQucmVtb3ZlKC4uLikgaW4gUmVzb3VyY2UuQnVpbGRlci5vbkJ1aWxkQ2hpbGRSZXNvdXJjZSguLi4pLgorICAgICAgICAgICAgd2hpbGUgKCFjaGlsZFJlc291cmNlQnVpbGRlcnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgY2hpbGRSZXNvdXJjZUJ1aWxkZXJzLml0ZXJhdG9yKCkubmV4dCgpLmJ1aWxkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiQnVpbGRlcnsiCisgICAgICAgICAgICAgICAgICAgICsgIm5hbWVzPSIgKyBuYW1lcworICAgICAgICAgICAgICAgICAgICArICIsIHBhdGg9JyIgKyBwYXRoICsgJ1wnJworICAgICAgICAgICAgICAgICAgICArICIsIG1ldGhvZEJ1aWxkZXJzPSIgKyBtZXRob2RCdWlsZGVycworICAgICAgICAgICAgICAgICAgICArICIsIGNoaWxkUmVzb3VyY2VCdWlsZGVycz0iICsgY2hpbGRSZXNvdXJjZUJ1aWxkZXJzCisgICAgICAgICAgICAgICAgICAgICsgIiwgY2hpbGRSZXNvdXJjZXM9IiArIGNoaWxkUmVzb3VyY2VzCisgICAgICAgICAgICAgICAgICAgICsgIiwgcmVzb3VyY2VNZXRob2RzPSIgKyByZXNvdXJjZU1ldGhvZHMKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBzdWJSZXNvdXJjZUxvY2F0b3I9IiArIHN1YlJlc291cmNlTG9jYXRvcgorICAgICAgICAgICAgICAgICAgICArICIsIGhhbmRsZXJDbGFzc2VzPSIgKyBoYW5kbGVyQ2xhc3NlcworICAgICAgICAgICAgICAgICAgICArICIsIGhhbmRsZXJJbnN0YW5jZXM9IiArIGhhbmRsZXJJbnN0YW5jZXMKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBwYXJlbnRSZXNvdXJjZT0iICsgKChwYXJlbnRSZXNvdXJjZSA9PSBudWxsKSA/ICI8bm8gcGFyZW50PiIgOiBwYXJlbnRSZXNvdXJjZS5zaG9ydFRvU3RyaW5nKCkpCisgICAgICAgICAgICAgICAgICAgICsgIiwgZXh0ZW5kZWQ9IiArIGV4dGVuZGVkCisgICAgICAgICAgICAgICAgICAgICsgJ30nOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgc2hvcnRUb1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiQnVpbGRlcntuYW1lcz0iICsgbmFtZXMgKyAiLCBwYXRoPSciICsgcGF0aCArICInfSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBuZXcgdW5ib3VuZCByZXNvdXJjZSBtb2RlbCBidWlsZGVyLgorICAgICAqCisgICAgICogQHJldHVybiBuZXcgdW5ib3VuZCByZXNvdXJjZSBtb2RlbCBidWlsZGVyLgorICAgICAqIEBzZWUgUmVzb3VyY2UuQnVpbGRlciNwYXRoKGphdmEubGFuZy5TdHJpbmcpCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIGJ1aWxkZXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIG5ldyByZXNvdXJjZSBtb2RlbCBidWlsZGVyIGZvciBhIHJlc291cmNlIGJvdW5kIHRvIGEgZ2l2ZW4gcGF0aC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXRoIHJlc291cmNlIHBhdGguCisgICAgICogQHJldHVybiBuZXcgcmVzb3VyY2UgbW9kZWwgYnVpbGRlci4KKyAgICAgKiBAc2VlIFJlc291cmNlLkJ1aWxkZXIjcGF0aChqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBidWlsZGVyKGZpbmFsIFN0cmluZyBwYXRoKSB7CisgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihwYXRoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEge0BsaW5rIEJ1aWxkZXIgcmVzb3VyY2UgYnVpbGRlcn0gaW5zdGFuY2UgZnJvbSB0aGUgbGlzdCBvZiB7QGNvZGUgcmVzb3VyY2V9IHdoaWNoIGNhbiBiZSBtZXJnZWQKKyAgICAgKiBpbnRvIGEgc2luZ2xlIHJlc291cmNlLiBJdCBtdXN0IGJlIHBvc3NpYmxlIHRvIG1lcmdlIHRoZSB7QGNvZGUgcmVzb3VyY2VzfSBpbnRvIGEgc2luZ2xlIHZhbGlkIHJlc291cmNlLgorICAgICAqIEZvciBleGFtcGxlIGFsbCByZXNvdXJjZXMgbXVzdCBoYXZlIHRoZSBzYW1lIHtAbGluayBSZXNvdXJjZSNnZXRQYXRoKCkgcGF0aH0sIHRoZXkgY2Fubm90IGhhdmUgYW1iaWd1b3VzIG1ldGhvZHMKKyAgICAgKiBvbiB0aGUgc2FtZSBwYXRoLCBldGMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VzIFJlc291cmNlcyB3aXRoIHRoZSBzYW1lIHBhdGguCisgICAgICogQHJldHVybiBSZXNvdXJjZSBidWlsZGVyIGluaXRpYWxpemVkIGZyb20gbWVyZ2VkIHJlc291cmNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgYnVpbGRlcihMaXN0PFJlc291cmNlPiByZXNvdXJjZXMpIHsKKyAgICAgICAgaWYgKHJlc291cmNlcyA9PSBudWxsIHx8IHJlc291cmNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBidWlsZGVyKCk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBJdGVyYXRvcjxSZXNvdXJjZT4gaXQgPSByZXNvdXJjZXMuaXRlcmF0b3IoKTsKKyAgICAgICAgUmVzb3VyY2UuRGF0YSByZXNvdXJjZURhdGEgPSBpdC5uZXh0KCkuZGF0YTsKKyAgICAgICAgQnVpbGRlciBidWlsZGVyID0gUmVzb3VyY2UuYnVpbGRlcihyZXNvdXJjZURhdGEpOworICAgICAgICBTdHJpbmcgcGF0aCA9IHJlc291cmNlRGF0YS5wYXRoOworCisgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIHJlc291cmNlRGF0YSA9IGl0Lm5leHQoKS5kYXRhOworICAgICAgICAgICAgaWYgKChyZXNvdXJjZURhdGEucGF0aCA9PSBudWxsICYmIHBhdGggPT0gbnVsbCkgfHwgKHBhdGggIT0gbnVsbCAmJiBwYXRoLmVxdWFscyhyZXNvdXJjZURhdGEucGF0aCkpKSB7CisgICAgICAgICAgICAgICAgYnVpbGRlci5tZXJnZVdpdGgocmVzb3VyY2VEYXRhKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9SRVNPVVJDRVNfQ0FOTk9UX01FUkdFKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGJ1aWxkZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgcmVzb3VyY2UgbW9kZWwgYnVpbGRlciBpbml0aWFsaXplZCBieSBpbnRyb3NwZWN0aW5nIGFuIGFubm90YXRlZAorICAgICAqIEpBWC1SUyByZXNvdXJjZSBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZUNsYXNzIHJlc291cmNlIGNsYXNzIHRvIGJlIG1vZGVsbGVkLgorICAgICAqIEByZXR1cm4gcmVzb3VyY2UgbW9kZWwgYnVpbGRlciBpbml0aWFsaXplZCBieSB0aGUgY2xhc3Mgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZQorICAgICAqIGNsYXNzIGRvZXMgbm90IHJlcHJlc2VudCBhIHJlc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBidWlsZGVyKENsYXNzPD8+IHJlc291cmNlQ2xhc3MpIHsKKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIocmVzb3VyY2VDbGFzcywgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHJlc291cmNlIG1vZGVsIGJ1aWxkZXIgaW5pdGlhbGl6ZWQgYnkgaW50cm9zcGVjdGluZyBhbiBhbm5vdGF0ZWQKKyAgICAgKiBKQVgtUlMgcmVzb3VyY2UgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VDbGFzcyAgICAgcmVzb3VyY2UgY2xhc3MgdG8gYmUgbW9kZWxsZWQuCisgICAgICogQHBhcmFtIGRpc2FibGVWYWxpZGF0aW9uIGlmIHNldCB0byB7QGNvZGUgdHJ1ZX0sIHRoZW4gYW55IG1vZGVsIHZhbGlkYXRpb24gY2hlY2tzIHdpbGwgYmUgZGlzYWJsZWQuCisgICAgICogQHJldHVybiByZXNvdXJjZSBtb2RlbCBidWlsZGVyIGluaXRpYWxpemVkIGJ5IHRoZSBjbGFzcyBvciB7QGNvZGUgbnVsbH0gaWYgdGhlCisgICAgICogY2xhc3MgZG9lcyBub3QgcmVwcmVzZW50IGEgcmVzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIGJ1aWxkZXIoQ2xhc3M8Pz4gcmVzb3VyY2VDbGFzcywgYm9vbGVhbiBkaXNhYmxlVmFsaWRhdGlvbikgeworICAgICAgICBmaW5hbCBCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgSW50cm9zcGVjdGlvbk1vZGVsbGVyKHJlc291cmNlQ2xhc3MsIGRpc2FibGVWYWxpZGF0aW9uKS5jcmVhdGVSZXNvdXJjZUJ1aWxkZXIoKTsKKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIuaXNFbXB0eSgpID8gbnVsbCA6IGJ1aWxkZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgcmVzb3VyY2UgbW9kZWwgaW5pdGlhbGl6ZWQgYnkgaW50cm9zcGVjdGluZyBhbiBhbm5vdGF0ZWQKKyAgICAgKiBKQVgtUlMgcmVzb3VyY2UgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VDbGFzcyByZXNvdXJjZSBjbGFzcyB0byBiZSBtb2RlbGxlZC4KKyAgICAgKiBAcmV0dXJuIHJlc291cmNlIG1vZGVsIGluaXRpYWxpemVkIGJ5IHRoZSBjbGFzcyBvciB7QGNvZGUgbnVsbH0gaWYgdGhlCisgICAgICogY2xhc3MgZG9lcyBub3QgcmVwcmVzZW50IGEgcmVzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZSBmcm9tKENsYXNzPD8+IHJlc291cmNlQ2xhc3MpIHsKKyAgICAgICAgcmV0dXJuIGZyb20ocmVzb3VyY2VDbGFzcywgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHJlc291cmNlIG1vZGVsIGluaXRpYWxpemVkIGJ5IGludHJvc3BlY3RpbmcgYW4gYW5ub3RhdGVkCisgICAgICogSkFYLVJTIHJlc291cmNlIGNsYXNzLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlQ2xhc3MgICAgIHJlc291cmNlIGNsYXNzIHRvIGJlIG1vZGVsbGVkLgorICAgICAqIEBwYXJhbSBkaXNhYmxlVmFsaWRhdGlvbiBpZiBzZXQgdG8ge0Bjb2RlIHRydWV9LCB0aGVuIGFueSBtb2RlbCB2YWxpZGF0aW9uIGNoZWNrcyB3aWxsIGJlIGRpc2FibGVkLgorICAgICAqIEByZXR1cm4gcmVzb3VyY2UgbW9kZWwgaW5pdGlhbGl6ZWQgYnkgdGhlIGNsYXNzIG9yIHtAY29kZSBudWxsfSBpZiB0aGUKKyAgICAgKiBjbGFzcyBkb2VzIG5vdCByZXByZXNlbnQgYSByZXNvdXJjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlIGZyb20oQ2xhc3M8Pz4gcmVzb3VyY2VDbGFzcywgYm9vbGVhbiBkaXNhYmxlVmFsaWRhdGlvbikgeworICAgICAgICBmaW5hbCBCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgSW50cm9zcGVjdGlvbk1vZGVsbGVyKHJlc291cmNlQ2xhc3MsIGRpc2FibGVWYWxpZGF0aW9uKS5jcmVhdGVSZXNvdXJjZUJ1aWxkZXIoKTsKKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIuaXNFbXB0eSgpID8gbnVsbCA6IGJ1aWxkZXIuYnVpbGQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiB0aGUgY2xhc3MgaXMgYWNjZXB0YWJsZSBhcyBhIEpBWC1SUyBwcm92aWRlciBvciByZXNvdXJjZS4KKyAgICAgKiA8cC8+CisgICAgICogTWV0aG9kIHJldHVybnMge0Bjb2RlIGZhbHNlfSBpZiB0aGUgY2xhc3MgaXMgZWl0aGVyCisgICAgICogPHVsPgorICAgICAqIDxsaT5hYnN0cmFjdDwvbGk+CisgICAgICogPGxpPmludGVyZmFjZTwvbGk+CisgICAgICogPGxpPmFubm90YXRpb248L2xpPgorICAgICAqIDxsaT5wcmltaXRpdmU8L2xpPgorICAgICAqIDxsaT5sb2NhbCBjbGFzczwvbGk+CisgICAgICogPGxpPm5vbi1zdGF0aWMgbWVtYmVyIGNsYXNzPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogQHBhcmFtIGMgY2xhc3MgdG8gYmUgY2hlY2tlZC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgY2xhc3MgaXMgYW4gYWNjZXB0YWJsZSBKQVgtUlMgcHJvdmlkZXIgb3IKKyAgICAgKiByZXNvdXJjZSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQWNjZXB0YWJsZShDbGFzczw/PiBjKSB7CisgICAgICAgIHJldHVybiAhKChjLmdldE1vZGlmaWVycygpICYgTW9kaWZpZXIuQUJTVFJBQ1QpICE9IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICB8fCBjLmlzUHJpbWl0aXZlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICB8fCBjLmlzQW5ub3RhdGlvbigpCisgICAgICAgICAgICAgICAgICAgICAgICAgfHwgYy5pc0ludGVyZmFjZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgfHwgYy5pc0xvY2FsQ2xhc3MoKQorICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChjLmlzTWVtYmVyQ2xhc3MoKSAmJiAoYy5nZXRNb2RpZmllcnMoKSAmIE1vZGlmaWVyLlNUQVRJQykgPT0gMCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcmVzb3VyY2UgY2xhc3Mge0BsaW5rIFBhdGggQFBhdGh9IGFubm90YXRpb24uCisgICAgICogPHAvPgorICAgICAqIE1heSByZXR1cm4ge0Bjb2RlIG51bGx9IGluIGNhc2UgdGhlcmUgaXMgbm8ge0Bjb2RlIEBQYXRofSBhbm5vdGF0aW9uIG9uIHRoZSByZXNvdXJjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZUNsYXNzIHJlc291cmNlIGNsYXNzLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIEBQYXRofSBhbm5vdGF0aW9uIGluc3RhbmNlIGlmIHByZXNlbnQgb24gdGhlIHJlc291cmNlIGNsYXNzIChpLmUuCisgICAgICogdGhlIGNsYXNzIGlzIGEgcm9vdCByZXNvdXJjZSBjbGFzcyksIG9yIHtAY29kZSBudWxsfSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBQYXRoIGdldFBhdGgoQ2xhc3M8Pz4gcmVzb3VyY2VDbGFzcykgeworICAgICAgICByZXR1cm4gTW9kZWxIZWxwZXIuZ2V0QW5ub3RhdGVkUmVzb3VyY2VDbGFzcyhyZXNvdXJjZUNsYXNzKS5nZXRBbm5vdGF0aW9uKFBhdGguY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIG5ldyByZXNvdXJjZSBtb2RlbCBidWlsZGVyIGluaXRpYWxpemVkIGZyb20gYSBnaXZlbiByZXNvdXJjZSBtb2RlbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZSByZXNvdXJjZSBtb2RlbCBpbml0aWFsaXppbmcgdGhlIHJlc291cmNlIGJ1aWxkZXIuCisgICAgICogQHJldHVybiBuZXcgcmVzb3VyY2UgbW9kZWwgYnVpbGRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgYnVpbGRlcihSZXNvdXJjZSByZXNvdXJjZSkgeworICAgICAgICByZXR1cm4gYnVpbGRlcihyZXNvdXJjZS5kYXRhKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBCdWlsZGVyIGJ1aWxkZXIoUmVzb3VyY2UuRGF0YSByZXNvdXJjZURhdGEpIHsKKyAgICAgICAgZmluYWwgQnVpbGRlciBiOworICAgICAgICBpZiAocmVzb3VyY2VEYXRhLnBhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgYiA9IG5ldyBCdWlsZGVyKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBiID0gbmV3IEJ1aWxkZXIocmVzb3VyY2VEYXRhLnBhdGgpOworICAgICAgICB9CisKKyAgICAgICAgYi5yZXNvdXJjZU1ldGhvZHMuYWRkQWxsKHJlc291cmNlRGF0YS5yZXNvdXJjZU1ldGhvZHMpOworICAgICAgICBiLmNoaWxkUmVzb3VyY2VzLmFkZEFsbChyZXNvdXJjZURhdGEuY2hpbGRSZXNvdXJjZXMpOworICAgICAgICBiLnN1YlJlc291cmNlTG9jYXRvciA9IHJlc291cmNlRGF0YS5zdWJSZXNvdXJjZUxvY2F0b3I7CisKKyAgICAgICAgYi5oYW5kbGVyQ2xhc3Nlcy5hZGRBbGwocmVzb3VyY2VEYXRhLmhhbmRsZXJDbGFzc2VzKTsKKyAgICAgICAgYi5oYW5kbGVySW5zdGFuY2VzLmFkZEFsbChyZXNvdXJjZURhdGEuaGFuZGxlckluc3RhbmNlcyk7CisKKyAgICAgICAgYi5uYW1lcy5hZGRBbGwocmVzb3VyY2VEYXRhLm5hbWVzKTsKKworICAgICAgICByZXR1cm4gYjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFJlc291cmNlPiB0cmFuc2Zvcm0oZmluYWwgUmVzb3VyY2UgcGFyZW50LCBmaW5hbCBMaXN0PERhdGE+IGxpc3QpIHsKKyAgICAgICAgcmV0dXJuIGxpc3Quc3RyZWFtKCkubWFwKGRhdGEgLT4gbmV3IFJlc291cmNlKHBhcmVudCwgZGF0YSkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgPFQ+IExpc3Q8VD4gaW1tdXRhYmxlQ29weShMaXN0PFQ+IGxpc3QpIHsKKyAgICAgICAgcmV0dXJuIGxpc3QuaXNFbXB0eSgpID8gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkgOiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KGxpc3QpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIDxUPiBTZXQ8VD4gaW1tdXRhYmxlQ29weShTZXQ8VD4gc2V0KSB7CisgICAgICAgIGlmIChzZXQuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFNldDxUPiByZXN1bHQgPSBDb2xsZWN0aW9ucy5uZXdTZXRGcm9tTWFwKG5ldyBJZGVudGl0eUhhc2hNYXA8PigpKTsKKyAgICAgICAgcmVzdWx0LmFkZEFsbChzZXQpOworICAgICAgICByZXR1cm4gc2V0OworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgUmVzb3VyY2UgcGFyZW50OworICAgIHByaXZhdGUgZmluYWwgRGF0YSBkYXRhOworCisgICAgcHJpdmF0ZSBmaW5hbCBWYWx1ZTxTdHJpbmc+IG5hbWU7CisKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8UmVzb3VyY2VNZXRob2Q+IHJlc291cmNlTWV0aG9kczsKKyAgICBwcml2YXRlIGZpbmFsIFJlc291cmNlTWV0aG9kIGxvY2F0b3I7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFJlc291cmNlPiBjaGlsZFJlc291cmNlczsKKworICAgIHByaXZhdGUgUmVzb3VyY2UoZmluYWwgUmVzb3VyY2UgcGFyZW50LCBmaW5hbCBEYXRhIGRhdGEpIHsKKyAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7CisKKyAgICAgICAgdGhpcy5uYW1lID0gVmFsdWVzLmxhenkobmV3IFZhbHVlPFN0cmluZz4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgICAgIGlmIChkYXRhLm5hbWVzLnNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhLm5hbWVzLmdldCgwKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gbWVyZ2VkIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJNZXJnZSBvZiAiICsgZGF0YS5uYW1lcy50b1N0cmluZygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgdGhpcy5yZXNvdXJjZU1ldGhvZHMgPSBpbW11dGFibGVDb3B5KFJlc291cmNlTWV0aG9kLnRyYW5zZm9ybShSZXNvdXJjZS50aGlzLCBkYXRhLnJlc291cmNlTWV0aG9kcykpOworICAgICAgICB0aGlzLmxvY2F0b3IgPSBkYXRhLnN1YlJlc291cmNlTG9jYXRvciA9PSBudWxsID8gbnVsbCA6IG5ldyBSZXNvdXJjZU1ldGhvZChSZXNvdXJjZS50aGlzLCBkYXRhLnN1YlJlc291cmNlTG9jYXRvcik7CisgICAgICAgIHRoaXMuY2hpbGRSZXNvdXJjZXMgPSBpbW11dGFibGVDb3B5KFJlc291cmNlLnRyYW5zZm9ybShSZXNvdXJjZS50aGlzLCBkYXRhLmNoaWxkUmVzb3VyY2VzKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgeworICAgICAgICByZXR1cm4gZGF0YS5wYXRoOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBQYXRoUGF0dGVybiBnZXRQYXRoUGF0dGVybigpIHsKKyAgICAgICAgcmV0dXJuIGRhdGEucGF0aFBhdHRlcm47CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBwYXJlbnQgcmVzb3VyY2UgZm9yIHRoaXMgcmVzb3VyY2UgbW9kZWwgb3Ige0Bjb2RlIG51bGx9IGluIGNhc2UgdGhpcworICAgICAqIHJlc291cmNlIGlzIGEgdG9wLWxldmVsIHJlc291cmNlIGFuZCBkb2VzIG5vdCBoYXZlIGEgcGFyZW50LgorICAgICAqCisgICAgICogQHJldHVybiBwYXJlbnQgcmVzb3VyY2Ugb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSByZXNvdXJjZSBkb2VzIG5vdCBoYXZlIGEgcGFyZW50LgorICAgICAqIEBzaW5jZSAyLjEKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzb3VyY2UgZ2V0UGFyZW50KCkgeworICAgICAgICByZXR1cm4gcGFyZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcmVzb3VyY2UgbmFtZS4KKyAgICAgKiA8cC8+CisgICAgICogSWYgdGhlIHJlc291cmNlIHdhcyBjb25zdHJ1Y3RlZCBmcm9tIGEgSkFYLVJTIGFubm90YXRlZCByZXNvdXJjZSBjbGFzcywKKyAgICAgKiB0aGUgcmVzb3VyY2UgbmFtZSB3aWxsIGJlIHNldCB0byB0aGUge0BsaW5rIENsYXNzI2dldE5hbWUoKSBmdWxseS1xdWFsaWZpZWQgbmFtZX0KKyAgICAgKiBvZiB0aGUgcmVzb3VyY2UgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHJlZmVyZW5jZSBKQVgtUlMgcmVzb3VyY2UgaGFuZGxlciBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lLmdldCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGxpc3Qgb2YgcmVzb3VyY2UgbmFtZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiByZXNvdXJjZSBuYW1lcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldE5hbWVzKCkgeworICAgICAgICByZXR1cm4gZGF0YS5uYW1lczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlcyBhIG5vbi1udWxsIGxpc3Qgb2YgcmVzb3VyY2UgbWV0aG9kcyBhdmFpbGFibGUgb24gdGhlIHJlc291cmNlLgorICAgICAqCisgICAgICogQHJldHVybiBub24tbnVsbCBhYnN0cmFjdCByZXNvdXJjZSBtZXRob2QgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxSZXNvdXJjZU1ldGhvZD4gZ2V0UmVzb3VyY2VNZXRob2RzKCkgeworICAgICAgICByZXR1cm4gcmVzb3VyY2VNZXRob2RzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb3ZpZGVzIGEgcmVzb3VyY2UgbG9jYXRvciBhdmFpbGFibGUgb24gdGhlIHJlc291cmNlLgorICAgICAqCisgICAgICogQHJldHVybiBSZXNvdXJjZSBsb2NhdG9yIGlmIGl0IGlzIHByZXNlbnQsIG51bGwgb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBSZXNvdXJjZU1ldGhvZCBnZXRSZXNvdXJjZUxvY2F0b3IoKSB7CisgICAgICAgIHJldHVybiBsb2NhdG9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb3ZpZGVzIHJlc291cmNlIG1ldGhvZHMgYW5kIHJlc291cmNlIGxvY2F0b3IgYXJlIGF2YWlsYWJsZSBvbiB0aGUgcmVzb3VyY2UuIFRoZSBsaXN0IGlzIG9yZGVyZWQgc28gdGhhdCByZXNvdXJjZQorICAgICAqIG1ldGhvZHMgYXJlIHBvc2l0aW9uZWQgZmlyc3QgYmVmb3JlIHJlc291cmNlIGxvY2F0b3IuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIExpc3Qgb2YgcmVzb3VyY2UgbWV0aG9kcyBhbmQgcmVzb3VyY2UgbG9jYXRvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxSZXNvdXJjZU1ldGhvZD4gZ2V0QWxsTWV0aG9kcygpIHsKKyAgICAgICAgZmluYWwgTGlua2VkTGlzdDxSZXNvdXJjZU1ldGhvZD4gbWV0aG9kc0FuZExvY2F0b3JzID0gbmV3IExpbmtlZExpc3Q8PihnZXRSZXNvdXJjZU1ldGhvZHMoKSk7CisgICAgICAgIGZpbmFsIFJlc291cmNlTWV0aG9kIGxvYyA9IGdldFJlc291cmNlTG9jYXRvcigpOworICAgICAgICBpZiAobG9jICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1ldGhvZHNBbmRMb2NhdG9ycy5hZGQobG9jKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbWV0aG9kc0FuZExvY2F0b3JzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgY2hpbGQgcmVzb3VyY2VzIGF2YWlsYWJsZSBvbiB0aGlzIHJlc291cmNlLgorICAgICAqCisgICAgICogQHJldHVybiBOb24tbnVsbCBsaXN0IG9mIGNoaWxkIHJlc291cmNlcyAobWF5IGJlIGVtcHR5KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxSZXNvdXJjZT4gZ2V0Q2hpbGRSZXNvdXJjZXMoKSB7CisgICAgICAgIHJldHVybiBjaGlsZFJlc291cmNlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG1ldGhvZCBoYW5kbGVyIGNsYXNzZXMgZm9yIHRoZSByZXNvdXJjZSBtZXRob2RzIHJlZ2lzdGVyZWQgb24gdGhlIHJlc291cmNlLgorICAgICAqCisgICAgICogQHJldHVybiByZXNvdXJjZSBtZXRob2QgaGFuZGxlciBjbGFzc2VzLgorICAgICAqLworICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldEhhbmRsZXJDbGFzc2VzKCkgeworICAgICAgICByZXR1cm4gZGF0YS5oYW5kbGVyQ2xhc3NlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG1ldGhvZCBoYW5kbGVyIChzaW5nbGV0b24pIGluc3RhbmNlcyBmb3IgdGhlIHJlc291cmNlIG1ldGhvZHMgcmVnaXN0ZXJlZAorICAgICAqIG9uIHRoZSByZXNvdXJjZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gcmVzb3VyY2UgbWV0aG9kIGhhbmRsZXIgaW5zdGFuY2VzLgorICAgICAqLworICAgIHB1YmxpYyBTZXQ8T2JqZWN0PiBnZXRIYW5kbGVySW5zdGFuY2VzKCkgeworICAgICAgICByZXR1cm4gZGF0YS5oYW5kbGVySW5zdGFuY2VzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFjY2VwdChSZXNvdXJjZU1vZGVsVmlzaXRvciB2aXNpdG9yKSB7CisgICAgICAgIGlmIChnZXRQYXJlbnQoKSA9PSBudWxsKSB7CisgICAgICAgICAgICB2aXNpdG9yLnZpc2l0UmVzb3VyY2UodGhpcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2aXNpdG9yLnZpc2l0Q2hpbGRSZXNvdXJjZSh0aGlzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHJlc291cmNlIGlzIGV4dGVuZGVkLgorICAgICAqIDxwLz4KKyAgICAgKiBJLmUuIGl0IGlzIG5vdCBwYXJ0IG9mIHRoZSByZXNvdXJjZSBzZXQgdGhhdCBmb3JtcyB0aGUgUkVTVCBBUEkgZXhwbGljaXRseSBkZWZpbmVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBkZXZlbG9wZXIgKHJlc291cmNlCisgICAgICogY2xhc3NlcyBhbmQgaW5zdGFuY2VzIHJldHVybmVkIGZyb20gdGhlIHtAbGluayBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9ufSBzdWJjbGFzcyBnZXR0ZXJzKS4KKyAgICAgKiA8cD4KKyAgICAgKiBFeHRlbmRlZCByZXNvdXJjZSBtb2RlbCBjb21wb25lbnRzIGFyZSBoZWxwZXIgY29tcG9uZW50cyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgZXhwbGljaXRseSBkZWZpbmVkIFJFU1QgQVBJIG9mCisgICAgICogYSBKQVgtUlMgYXBwbGljYXRpb24sIGluc3RlYWQgdGhleSBhcmUgZ2VuZXJhdGVkIGJ5IEplcnNleSBydW50aW1lLiBGb3IgZXhhbXBsZSwgZXh0ZW5kZWQgcmVzb3VyY2UgbW9kZWwgY29tcG9uZW50cworICAgICAqIGluY2x1ZGUge0Bjb2RlIE9QVElPTlN9IHtAbGluayBSZXNvdXJjZU1ldGhvZCByZXNvdXJjZSBtZXRob2RzfQorICAgICAqIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IEplcnNleSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLk1vZGVsUHJvY2Vzc29yIHJlc291cmNlIG1vZGVsIHByb2Nlc3NvcnN9CisgICAgICogb3Ige0Bjb2RlIGFwcGxpY2F0aW9uLndhZGx9IHJlc291cmNlIEFQSSB0aGF0IGV4cG9zZXMgdGhlIGFwcGxpY2F0aW9uIFdBREwgZGVzY3JpcHRvci4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgcmVzb3VyY2UgaXMgcGFydCBvZiB0aGUgYXBwbGljYXRpb24ncyBleHRlbmRlZCBSRVNUIEFQSSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNlZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuRXh0ZW5kZWRSZXNvdXJjZQorICAgICAqIEBzaW5jZSAyLjUuMQorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRXh0ZW5kZWQoKSB7CisgICAgICAgIHJldHVybiBkYXRhLmV4dGVuZGVkOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBkYXRhLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8PyBleHRlbmRzIFJlc291cmNlTW9kZWxDb21wb25lbnQ+IGdldENvbXBvbmVudHMoKSB7CisgICAgICAgIExpc3Q8UmVzb3VyY2VNb2RlbENvbXBvbmVudD4gY29tcG9uZW50cyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKworICAgICAgICBjb21wb25lbnRzLmFkZEFsbChnZXRDaGlsZFJlc291cmNlcygpKTsKKyAgICAgICAgY29tcG9uZW50cy5hZGRBbGwoZ2V0UmVzb3VyY2VNZXRob2RzKCkpOworCisgICAgICAgIGZpbmFsIFJlc291cmNlTWV0aG9kIHJlc291cmNlTG9jYXRvciA9IGdldFJlc291cmNlTG9jYXRvcigpOworICAgICAgICBpZiAocmVzb3VyY2VMb2NhdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbXBvbmVudHMuYWRkKHJlc291cmNlTG9jYXRvcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbXBvbmVudHM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvUmVzb3VyY2VNZXRob2QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL1Jlc291cmNlTWV0aG9kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJmOGY3NQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL1Jlc291cmNlTWV0aG9kLmphdmEKQEAgLTAsMCArMSw4OTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IGphdmF4LndzLnJzLk5hbWVCaW5kaW5nOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Bc3luY1Jlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuTWVkaWFUeXBlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb2RlbC5OYW1lQm91bmQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5JbmZsZWN0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudXJpLlBhdGhQYXR0ZXJuOworCisvKioKKyAqIE1vZGVsIG9mIGEgbWV0aG9kIGF2YWlsYWJsZSBvbiBhIHJlc291cmNlLiBDb3ZlcnMgcmVzb3VyY2UgbWV0aG9kLCBzdWItcmVzb3VyY2UKKyAqIG1ldGhvZCBhbmQgc3ViLXJlc291cmNlIGxvY2F0b3IuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFJlc291cmNlTWV0aG9kIGltcGxlbWVudHMgUmVzb3VyY2VNb2RlbENvbXBvbmVudCwgUHJvZHVjaW5nLCBDb25zdW1pbmcsIFN1c3BlbmRhYmxlLCBOYW1lQm91bmQgeworCisgICAgLyoqCisgICAgICogUmVzb3VyY2UgbWV0aG9kIGNsYXNzaWZpY2F0aW9uIGJhc2VkIG9uIHRoZSByZWNvZ25pemVkIEpBWC1SUworICAgICAqIHJlc291cmNlIG1ldGhvZCB0eXBlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGVudW0gSmF4cnNUeXBlIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEpBWC1SUyByZXNvdXJjZSBtZXRob2QuCisgICAgICAgICAqIDxwLz4KKyAgICAgICAgICogRG9lcyBub3QgaGF2ZSBhIHBhdGggdGVtcGxhdGUgYXNzaWduZWQuIElzIGFzc2lnbmVkIHRvIGEgcGFydGljdWxhciBIVFRQIG1ldGhvZC4KKyAgICAgICAgICovCisgICAgICAgIFJFU09VUkNFX01FVEhPRCB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIFBhdGhQYXR0ZXJuIGNyZWF0ZVBhdHRlcm5Gb3IoU3RyaW5nIHBhdGhUZW1wbGF0ZSkgeworICAgICAgICAgICAgICAgIC8vIHRlbXBsYXRlIGlzIGlnbm9yZWQuCisgICAgICAgICAgICAgICAgcmV0dXJuIFBhdGhQYXR0ZXJuLkVORF9PRl9QQVRIX1BBVFRFUk47CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIC8qKgorICAgICAgICAgKiBKQVgtUlMgc3ViLXJlc291cmNlIG1ldGhvZC4KKyAgICAgICAgICogPHAvPgorICAgICAgICAgKiBIYXMgYSBzdWItcGF0aCB0ZW1wbGF0ZSBhc3NpZ25lZCBhbmQgaXMgYXNzaWduZWQgdG8gYSBwYXJ0aWN1bGFyIEhUVFAgbWV0aG9kLgorICAgICAgICAgKi8KKyAgICAgICAgU1VCX1JFU09VUkNFX01FVEhPRCB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIFBhdGhQYXR0ZXJuIGNyZWF0ZVBhdHRlcm5Gb3IoU3RyaW5nIHBhdGhUZW1wbGF0ZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUGF0aFBhdHRlcm4ocGF0aFRlbXBsYXRlLCBQYXRoUGF0dGVybi5SaWdodEhhbmRQYXRoLmNhcHR1cmluZ1plcm9TZWdtZW50cyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIC8qKgorICAgICAgICAgKiBKQVgtUlMgc3ViLXJlc291cmNlIGxvY2F0b3IuCisgICAgICAgICAqIDxwLz4KKyAgICAgICAgICogSGFzIGEgc3ViLXBhdGggdGVtcGxhdGUgYXNzaWduZWQgYnV0IGlzIG5vdCBhc3NpZ25lZCB0byBhbnkgcGFydGljdWxhciBIVFRQIG1ldGhvZC4KKyAgICAgICAgICogSW5zdGVhZCBpdCBwcm9kdWNlcyBhIHN1Yi1yZXNvdXJjZSBpbnN0YW5jZSB0aGF0IHNob3VsZCBiZSBmdXJ0aGVyCisgICAgICAgICAqIHVzZWQgaW4gdGhlIHJlcXVlc3QgVVJJIG1hdGNoaW5nLgorICAgICAgICAgKi8KKyAgICAgICAgU1VCX1JFU09VUkNFX0xPQ0FUT1IgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBQYXRoUGF0dGVybiBjcmVhdGVQYXR0ZXJuRm9yKFN0cmluZyBwYXRoVGVtcGxhdGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBhdGhQYXR0ZXJuKHBhdGhUZW1wbGF0ZSwgUGF0aFBhdHRlcm4uUmlnaHRIYW5kUGF0aC5jYXB0dXJpbmdaZXJvT3JNb3JlU2VnbWVudHMpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgYSBwcm9wZXIgbWF0Y2hpbmcgcGF0aCBwYXR0ZXJuIGZyb20gdGhlIHByb3ZpZGVkIHRlbXBsYXRlIGZvcgorICAgICAgICAgKiB0aGUgc2VsZWN0ZWQgbWV0aG9kIHR5cGUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwYXRoVGVtcGxhdGUgbWV0aG9kIHBhdGggdGVtcGxhdGUuCisgICAgICAgICAqIEByZXR1cm4gbWV0aG9kIG1hdGNoaW5nIHBhdGggcGF0dGVybi4KKyAgICAgICAgICovCisgICAgICAgIC8qIHBhY2thZ2UgKi8KKyAgICAgICAgYWJzdHJhY3QgUGF0aFBhdHRlcm4gY3JlYXRlUGF0dGVybkZvcihTdHJpbmcgcGF0aFRlbXBsYXRlKTsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBKYXhyc1R5cGUgY2xhc3NpZnkoU3RyaW5nIGh0dHBNZXRob2QpIHsKKyAgICAgICAgICAgIGlmIChodHRwTWV0aG9kICE9IG51bGwgJiYgIWh0dHBNZXRob2QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJFU09VUkNFX01FVEhPRDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFNVQl9SRVNPVVJDRV9MT0NBVE9SOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzb3VyY2UgbWV0aG9kIG1vZGVsIGJ1aWxkZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCdWlsZGVyIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFJlc291cmNlLkJ1aWxkZXIgcGFyZW50OworCisgICAgICAgIC8vIEh0dHBNZXRob2QKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgaHR0cE1ldGhvZDsKKyAgICAgICAgLy8gQ29uc3VtaW5nICYgUHJvZHVjaW5nCisgICAgICAgIHByaXZhdGUgZmluYWwgU2V0PE1lZGlhVHlwZT4gY29uc3VtZWRUeXBlczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8TWVkaWFUeXBlPiBwcm9kdWNlZFR5cGVzOworICAgICAgICAvLyBTdXNwZW5kYWJsZQorICAgICAgICBwcml2YXRlIGJvb2xlYW4gbWFuYWdlZEFzeW5jOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gc3NlOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gc3VzcGVuZGVkOworICAgICAgICBwcml2YXRlIGxvbmcgc3VzcGVuZFRpbWVvdXQ7CisgICAgICAgIHByaXZhdGUgVGltZVVuaXQgc3VzcGVuZFRpbWVvdXRVbml0OworICAgICAgICAvLyBJbnZvY2FibGUKKyAgICAgICAgcHJpdmF0ZSBDbGFzczw/PiBoYW5kbGVyQ2xhc3M7CisgICAgICAgIHByaXZhdGUgT2JqZWN0IGhhbmRsZXJJbnN0YW5jZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPFBhcmFtZXRlcj4gaGFuZGxlclBhcmFtZXRlcnM7CisKKyAgICAgICAgLy8gbWV0aG9kIChjYW4gYmUgYWxzbyBpbnRlcmZhY2UgbWV0aG9kKS4gU3BlY2lmaWMgbWV0aG9kIHRvIGV4ZWN1dGUgaXMgZGVmaW5lZCBieSBoYW5kbGluZ01ldGhvZAorICAgICAgICBwcml2YXRlIE1ldGhvZCBkZWZpbml0aW9uTWV0aG9kOworCisgICAgICAgIC8vIHRoaXMgY2FuIGJlIGVpdGhlciBlcXVhbCB0byBkZWZpbml0aW9uTWV0aG9kIG9yIGNoaWxkIG9mIGRlZmluaXRpb25NZXRob2QKKyAgICAgICAgcHJpdmF0ZSBNZXRob2QgaGFuZGxpbmdNZXRob2Q7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBlbmNvZGVkUGFyYW1zOworICAgICAgICBwcml2YXRlIFR5cGUgcm91dGluZ1Jlc3BvbnNlVHlwZTsKKyAgICAgICAgLy8gTmFtZUJvdW5kCisgICAgICAgIHByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4+IG5hbWVCaW5kaW5nczsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGV4dGVuZGVkOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgYSByZXNvdXJjZSBtZXRob2QgYnVpbGRlci4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoZSBzdXBwbGllZCBwYXJlbnQgcmVzb3VyY2UgbW9kZWwgYnVpbGRlciB3aWxsIGJlIGNhbGxlZCB0byByZWdpc3RlcgorICAgICAgICAgKiB0aGUgbmV3bHkgY3JlYXRlZCByZXNvdXJjZSBtZXRob2QgaW5zdGFuY2UgYXMgcGFydCBvZiB0aGUge0BsaW5rICNidWlsZCgpfQorICAgICAgICAgKiBtZXRob2QgaW52b2NhdGlvbi4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogTm90ZSB0aGF0IHRoZSB7QGxpbmsgI2J1aWxkKCl9IG1ldGhvZCBkb2VzIG5vdCBoYXZlIHRvIGJlIGludm9rZWQgbWFudWFsbHkKKyAgICAgICAgICogYXMgdGhlIHJlZ2lzdHJhdGlvbiB3aWxsIGhhcHBlbiBhdXRvbWF0aWNhbGx5IGFzIHBhcnQgb2YgdGhlCisgICAgICAgICAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2UuQnVpbGRlciNidWlsZCgpfSBtZXRob2QKKyAgICAgICAgICogaW52b2NhdGlvbi4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcGFyZW50IHBhcmVudCByZXNvdXJjZSBtb2RlbCBidWlsZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgLyogcGFja2FnZSAqLyBCdWlsZGVyKGZpbmFsIFJlc291cmNlLkJ1aWxkZXIgcGFyZW50KSB7CisgICAgICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKKworICAgICAgICAgICAgdGhpcy5odHRwTWV0aG9kID0gbnVsbDsKKworICAgICAgICAgICAgdGhpcy5jb25zdW1lZFR5cGVzID0gbmV3IExpbmtlZEhhc2hTZXQ8PigpOworICAgICAgICAgICAgdGhpcy5wcm9kdWNlZFR5cGVzID0gbmV3IExpbmtlZEhhc2hTZXQ8PigpOworICAgICAgICAgICAgdGhpcy5zdXNwZW5kZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHRoaXMuc3VzcGVuZFRpbWVvdXQgPSBBc3luY1Jlc3BvbnNlLk5PX1RJTUVPVVQ7CisgICAgICAgICAgICB0aGlzLnN1c3BlbmRUaW1lb3V0VW5pdCA9IFRpbWVVbml0Lk1JTExJU0VDT05EUzsKKworICAgICAgICAgICAgdGhpcy5oYW5kbGVyUGFyYW1ldGVycyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKworICAgICAgICAgICAgdGhpcy5lbmNvZGVkUGFyYW1zID0gZmFsc2U7CisKKyAgICAgICAgICAgIHRoaXMubmFtZUJpbmRpbmdzID0gbmV3IExpbmtlZEhhc2hTZXQ8PigpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhIGJ1aWxkZXIgZnJvbSBhbiBleGlzdGluZyByZXNvdXJjZSBtZXRob2QgbW9kZWwuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwYXJlbnQgICAgICAgICBwYXJlbnQgcmVzb3VyY2UgbW9kZWwgYnVpbGRlci4KKyAgICAgICAgICogQHBhcmFtIG9yaWdpbmFsTWV0aG9kIGV4aXN0aW5nIHJlc291cmNlIG1ldGhvZCBtb2RlbCB0byBjcmVhdGUgdGhlIGJ1aWxkZXIgZnJvbS4KKyAgICAgICAgICovCisgICAgICAgIC8qIHBhY2thZ2UgKi8gQnVpbGRlcihmaW5hbCBSZXNvdXJjZS5CdWlsZGVyIHBhcmVudCwgUmVzb3VyY2VNZXRob2Qgb3JpZ2luYWxNZXRob2QpIHsKKyAgICAgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OworICAgICAgICAgICAgdGhpcy5jb25zdW1lZFR5cGVzID0gbmV3IExpbmtlZEhhc2hTZXQ8PihvcmlnaW5hbE1ldGhvZC5nZXRDb25zdW1lZFR5cGVzKCkpOworICAgICAgICAgICAgdGhpcy5wcm9kdWNlZFR5cGVzID0gbmV3IExpbmtlZEhhc2hTZXQ8PihvcmlnaW5hbE1ldGhvZC5nZXRQcm9kdWNlZFR5cGVzKCkpOworICAgICAgICAgICAgdGhpcy5zdXNwZW5kZWQgPSBvcmlnaW5hbE1ldGhvZC5pc1N1c3BlbmREZWNsYXJlZCgpOworICAgICAgICAgICAgdGhpcy5zdXNwZW5kVGltZW91dCA9IG9yaWdpbmFsTWV0aG9kLmdldFN1c3BlbmRUaW1lb3V0KCk7CisgICAgICAgICAgICB0aGlzLnN1c3BlbmRUaW1lb3V0VW5pdCA9IG9yaWdpbmFsTWV0aG9kLmdldFN1c3BlbmRUaW1lb3V0VW5pdCgpOworICAgICAgICAgICAgdGhpcy5oYW5kbGVyUGFyYW1ldGVycyA9IG5ldyBMaW5rZWRIYXNoU2V0PD4ob3JpZ2luYWxNZXRob2QuZ2V0SW52b2NhYmxlKCkuZ2V0SGFuZGxlcigpLmdldFBhcmFtZXRlcnMoKSk7CisgICAgICAgICAgICB0aGlzLm5hbWVCaW5kaW5ncyA9IG9yaWdpbmFsTWV0aG9kLmdldE5hbWVCaW5kaW5ncygpOworICAgICAgICAgICAgdGhpcy5odHRwTWV0aG9kID0gb3JpZ2luYWxNZXRob2QuZ2V0SHR0cE1ldGhvZCgpOworICAgICAgICAgICAgdGhpcy5tYW5hZ2VkQXN5bmMgPSBvcmlnaW5hbE1ldGhvZC5pc01hbmFnZWRBc3luY0RlY2xhcmVkKCk7CisKKyAgICAgICAgICAgIEludm9jYWJsZSBpbnZvY2FibGUgPSBvcmlnaW5hbE1ldGhvZC5nZXRJbnZvY2FibGUoKTsKKyAgICAgICAgICAgIHRoaXMuaGFuZGxpbmdNZXRob2QgPSBpbnZvY2FibGUuZ2V0SGFuZGxpbmdNZXRob2QoKTsKKyAgICAgICAgICAgIHRoaXMuZW5jb2RlZFBhcmFtcyA9IGZhbHNlOworICAgICAgICAgICAgdGhpcy5yb3V0aW5nUmVzcG9uc2VUeXBlID0gaW52b2NhYmxlLmdldFJvdXRpbmdSZXNwb25zZVR5cGUoKTsKKyAgICAgICAgICAgIHRoaXMuZXh0ZW5kZWQgPSBvcmlnaW5hbE1ldGhvZC5pc0V4dGVuZGVkKCk7CisgICAgICAgICAgICBNZXRob2QgaGFuZGxlck1ldGhvZCA9IGludm9jYWJsZS5nZXREZWZpbml0aW9uTWV0aG9kKCk7CisgICAgICAgICAgICBNZXRob2RIYW5kbGVyIGhhbmRsZXIgPSBpbnZvY2FibGUuZ2V0SGFuZGxlcigpOworICAgICAgICAgICAgaWYgKGhhbmRsZXIuaXNDbGFzc0Jhc2VkKCkpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVkQnkoaGFuZGxlci5nZXRIYW5kbGVyQ2xhc3MoKSwgaGFuZGxlck1ldGhvZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGhhbmRsZWRCeShoYW5kbGVyLmdldEhhbmRsZXJJbnN0YW5jZSgpLCBoYW5kbGVyTWV0aG9kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIGFzc29jaWF0ZWQgSFRUUCBtZXRob2QgbmFtZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5hbWUgSFRUUCBtZXRob2QgbmFtZS4KKyAgICAgICAgICogQHJldHVybiB1cGRhdGVkIGJ1aWxkZXIgb2JqZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgaHR0cE1ldGhvZChTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgdGhpcy5odHRwTWV0aG9kID0gbmFtZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBwcm9kdWNlZCBtZWRpYSB0eXBlcyBzdXBwb3J0ZWQgYnkgdGhlIGNvbXBvbmVudC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHR5cGVzIHByb2R1Y2VkIG1lZGlhIHR5cGVzLgorICAgICAgICAgKiBAcmV0dXJuIHVwZGF0ZWQgYnVpbGRlciBvYmplY3QuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBwcm9kdWNlcyhTdHJpbmcuLi4gdHlwZXMpIHsKKyAgICAgICAgICAgIHJldHVybiBwcm9kdWNlcyhNZWRpYVR5cGVzLmNyZWF0ZUZyb20odHlwZXMpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgcHJvZHVjZWQgbWVkaWEgdHlwZXMgc3VwcG9ydGVkIGJ5IHRoZSBjb21wb25lbnQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB0eXBlcyBwcm9kdWNlZCBtZWRpYSB0eXBlcy4KKyAgICAgICAgICogQHJldHVybiB1cGRhdGVkIGJ1aWxkZXIgb2JqZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgcHJvZHVjZXMoTWVkaWFUeXBlLi4uIHR5cGVzKSB7CisgICAgICAgICAgICByZXR1cm4gcHJvZHVjZXMoQXJyYXlzLmFzTGlzdCh0eXBlcykpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBwcm9kdWNlZCBtZWRpYSB0eXBlcyBzdXBwb3J0ZWQgYnkgdGhlIGNvbXBvbmVudC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHR5cGVzIHByb2R1Y2VkIG1lZGlhIHR5cGVzLgorICAgICAgICAgKiBAcmV0dXJuIHVwZGF0ZWQgYnVpbGRlciBvYmplY3QuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBwcm9kdWNlcyhDb2xsZWN0aW9uPE1lZGlhVHlwZT4gdHlwZXMpIHsKKyAgICAgICAgICAgIHRoaXMucHJvZHVjZWRUeXBlcy5hZGRBbGwodHlwZXMpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIGNvbnN1bWVkIG1lZGlhIHR5cGVzIHN1cHBvcnRlZCBieSB0aGUgY29tcG9uZW50LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdHlwZXMgY29uc3VtZWQgbWVkaWEgdHlwZXMuCisgICAgICAgICAqIEByZXR1cm4gdXBkYXRlZCBidWlsZGVyIG9iamVjdC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGNvbnN1bWVzKFN0cmluZy4uLiB0eXBlcykgeworICAgICAgICAgICAgcmV0dXJuIGNvbnN1bWVzKE1lZGlhVHlwZXMuY3JlYXRlRnJvbSh0eXBlcykpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBjb25zdW1lZCBtZWRpYSB0eXBlcyBzdXBwb3J0ZWQgYnkgdGhlIGNvbXBvbmVudC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHR5cGVzIGNvbnN1bWVkIG1lZGlhIHR5cGVzLgorICAgICAgICAgKiBAcmV0dXJuIHVwZGF0ZWQgYnVpbGRlciBvYmplY3QuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBjb25zdW1lcyhNZWRpYVR5cGUuLi4gdHlwZXMpIHsKKyAgICAgICAgICAgIHJldHVybiBjb25zdW1lcyhBcnJheXMuYXNMaXN0KHR5cGVzKSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIGNvbnN1bWVkIG1lZGlhIHR5cGVzIHN1cHBvcnRlZCBieSB0aGUgY29tcG9uZW50LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdHlwZXMgY29uc3VtZWQgbWVkaWEgdHlwZXMuCisgICAgICAgICAqIEByZXR1cm4gdXBkYXRlZCBidWlsZGVyIG9iamVjdC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGNvbnN1bWVzKENvbGxlY3Rpb248TWVkaWFUeXBlPiB0eXBlcykgeworICAgICAgICAgICAgdGhpcy5jb25zdW1lZFR5cGVzLmFkZEFsbCh0eXBlcyk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGRzIG5hbWUgYmluZGluZ3MuIFRoZSBwYXNzZWQgYW5ub3RhdGlvbiB0eXBlcyBub3QgYW5ub3RhdGVkIHdpdGgge0BsaW5rIGphdmF4LndzLnJzLk5hbWVCaW5kaW5nfQorICAgICAgICAgKiBtZXRhLWFubm90YXRpb24gd2lsbCBiZSBpZ25vcmVkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbmFtZUJpbmRpbmdzIGNvbGxlY3Rpb24gb2YgbmFtZSBiaW5kaW5nIGFubm90YXRpb24gdHlwZXMuCisgICAgICAgICAqIEByZXR1cm4gdXBkYXRlZCBidWlsZGVyIG9iamVjdC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIG5hbWVCaW5kaW5ncyhmaW5hbCBDb2xsZWN0aW9uPENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPj4gbmFtZUJpbmRpbmdzKSB7CisgICAgICAgICAgICBmb3IgKENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBuYW1lQmluZGluZyA6IG5hbWVCaW5kaW5ncykgeworICAgICAgICAgICAgICAgIGlmIChuYW1lQmluZGluZy5nZXRBbm5vdGF0aW9uKE5hbWVCaW5kaW5nLmNsYXNzKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRoaXMubmFtZUJpbmRpbmdzLmFkZChuYW1lQmluZGluZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkcyBuYW1lIGJpbmRpbmdzLiBUaGUgcGFzc2VkIGFubm90YXRpb24gdHlwZXMgbm90IGFubm90YXRlZCB3aXRoIHtAbGluayBqYXZheC53cy5ycy5OYW1lQmluZGluZ30KKyAgICAgICAgICogbWV0YS1hbm5vdGF0aW9uIHdpbGwgYmUgaWdub3JlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5hbWVCaW5kaW5ncyBuYW1lIGJpbmRpbmcgYW5ub3RhdGlvbiB0eXBlcy4KKyAgICAgICAgICogQHJldHVybiB1cGRhdGVkIGJ1aWxkZXIgb2JqZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgQFNhZmVWYXJhcmdzCisgICAgICAgIHB1YmxpYyBmaW5hbCBCdWlsZGVyIG5hbWVCaW5kaW5ncyhmaW5hbCBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4uLi4gbmFtZUJpbmRpbmdzKSB7CisgICAgICAgICAgICByZXR1cm4gbmFtZUJpbmRpbmdzKEFycmF5cy5hc0xpc3QobmFtZUJpbmRpbmdzKSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkcyBuYW1lIGJpbmRpbmdzLiBUaGUgcGFzc2VkIGFubm90YXRpb25zIG5vdCBhbm5vdGF0ZWQgd2l0aCB7QGxpbmsgamF2YXgud3MucnMuTmFtZUJpbmRpbmd9CisgICAgICAgICAqIG1ldGEtYW5ub3RhdGlvbiB3aWxsIGJlIGlnbm9yZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBuYW1lQmluZGluZ3MgbmFtZSBiaW5kaW5nIGFubm90YXRpb25zLgorICAgICAgICAgKiBAcmV0dXJuIHVwZGF0ZWQgYnVpbGRlciBvYmplY3QuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBuYW1lQmluZGluZ3MoZmluYWwgQW5ub3RhdGlvbi4uLiBuYW1lQmluZGluZ3MpIHsKKyAgICAgICAgICAgIHJldHVybiBuYW1lQmluZGluZ3MoCisgICAgICAgICAgICAgICAgICAgIEFycmF5cy5zdHJlYW0obmFtZUJpbmRpbmdzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKChGdW5jdGlvbjxBbm5vdGF0aW9uLCBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4+KSBBbm5vdGF0aW9uOjphbm5vdGF0aW9uVHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogTWFyayB0aGUgY29tcG9uZW50IGZvciBzdXNwZW5kaW5nLgorICAgICAgICAgKiA8cC8+CisgICAgICAgICAqIEFuIGludm9jYXRpb24gb2YgYSBjb21wb25lbnQgKHJlc291cmNlIG9yIHN1Yi1yZXNvdXJjZSBtZXRob2QpIG1hcmtlZAorICAgICAgICAgKiBmb3Igc3VzcGVuZGluZyB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc3VzcGVuZGVkIGJ5IHRoZSBKZXJzZXkgcnVudGltZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHRpbWVvdXQgc3VzcGVuZCB0aW1lb3V0IHZhbHVlLgorICAgICAgICAgKiBAcGFyYW0gdW5pdCAgICBzdXNwZW5kIHRpbWVvdXQgdGltZSB1bml0LgorICAgICAgICAgKiBAcmV0dXJuIHVwZGF0ZWQgYnVpbGRlciBvYmplY3QuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBzdXNwZW5kZWQobG9uZyB0aW1lb3V0LCBUaW1lVW5pdCB1bml0KSB7CisgICAgICAgICAgICBzdXNwZW5kZWQgPSB0cnVlOworICAgICAgICAgICAgc3VzcGVuZFRpbWVvdXQgPSB0aW1lb3V0OworICAgICAgICAgICAgc3VzcGVuZFRpbWVvdXRVbml0ID0gdW5pdDsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBTU0UgZmxhZyBvbiB0aGUgbWV0aG9kIG1vZGVsIHRvIHtAY29kZSB0cnVlfS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB1cGRhdGVkIGJ1aWxkZXIgb2JqZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc3NlKCkgeworICAgICAgICAgICAgc3NlID0gdHJ1ZTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBtYW5hZ2VkIGFzeW5jIHJlcXVpcmVkIGZsYWcgb24gdGhlIG1ldGhvZCBtb2RlbCB0byB7QGNvZGUgdHJ1ZX0uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gdXBkYXRlZCBidWlsZGVyIG9iamVjdC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIG1hbmFnZWRBc3luYygpIHsKKyAgICAgICAgICAgIG1hbmFnZWRBc3luYyA9IHRydWU7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIElmIHNldCB0byB7QGNvZGUgdHJ1ZX0sIHRoZSBwYXJhbWV0ZXIgdmFsdWVzIHdpbGwgbm90IGJlIGF1dG9tYXRpY2FsbHkKKyAgICAgICAgICogZGVjb2RlZC4KKyAgICAgICAgICogPHAvPgorICAgICAgICAgKiBEZWZhdWx0cyB0byB7QGNvZGUgZmFsc2V9LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUge0Bjb2RlIHRydWV9IGlmIHRoZSBhdXRvbWF0aWMgcGFyYW1ldGVyIGRlY29kaW5nIHNob3VsZCBiZQorICAgICAgICAgKiAgICAgICAgICAgICAgZGlzYWJsZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgICogQHJldHVybiB1cGRhdGVkIGJ1aWxkZXIgb2JqZWN0LgorICAgICAgICAgKiBAc2VlIGphdmF4LndzLnJzLkVuY29kZWQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGVuY29kZWRQYXJhbWV0ZXJzKGJvb2xlYW4gdmFsdWUpIHsKKyAgICAgICAgICAgIGVuY29kZWRQYXJhbXMgPSB2YWx1ZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIERlZmluZSBhIHJlc291cmNlIG1ldGhvZCBoYW5kbGVyIGJpbmRpbmcuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBoYW5kbGVyQ2xhc3MgY29uY3JldGUgcmVzb3VyY2UgbWV0aG9kIGhhbmRsZXIgY2xhc3MuCisgICAgICAgICAqIEBwYXJhbSBtZXRob2QgICAgICAgbWV0aG9kIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBhcyBhIHJlc291cmNlIG1ldGhvZC4gVGhlIHBhcmFtZXRlcnMgaW5pdGlhbGl6ZXMKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLkludm9jYWJsZSNnZXREZWZpbml0aW9uTWV0aG9kKCkgaW52b2NhYmxlCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbiBtZXRob2R9LgorICAgICAgICAgKiBAcmV0dXJuIHVwZGF0ZWQgYnVpbGRlciBvYmplY3QuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBoYW5kbGVkQnkoQ2xhc3M8Pz4gaGFuZGxlckNsYXNzLCBNZXRob2QgbWV0aG9kKSB7CisgICAgICAgICAgICB0aGlzLmhhbmRsZXJJbnN0YW5jZSA9IG51bGw7CisKKyAgICAgICAgICAgIHRoaXMuaGFuZGxlckNsYXNzID0gaGFuZGxlckNsYXNzOworICAgICAgICAgICAgdGhpcy5kZWZpbml0aW9uTWV0aG9kID0gbWV0aG9kOworCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBEZWZpbmUgYSByZXNvdXJjZSBtZXRob2QgaGFuZGxlciBiaW5kaW5nLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gaGFuZGxlckluc3RhbmNlIGNvbmNyZXRlIHJlc291cmNlIG1ldGhvZCBoYW5kbGVyIGluc3RhbmNlLgorICAgICAgICAgKiBAcGFyYW0gbWV0aG9kICAgICAgICAgIGhhbmRsaW5nIG1ldGhvZC4KKyAgICAgICAgICogQHJldHVybiB1cGRhdGVkIGJ1aWxkZXIgb2JqZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgaGFuZGxlZEJ5KE9iamVjdCBoYW5kbGVySW5zdGFuY2UsIE1ldGhvZCBtZXRob2QpIHsKKyAgICAgICAgICAgIHRoaXMuaGFuZGxlckNsYXNzID0gbnVsbDsKKworICAgICAgICAgICAgdGhpcy5oYW5kbGVySW5zdGFuY2UgPSBoYW5kbGVySW5zdGFuY2U7CisgICAgICAgICAgICB0aGlzLmRlZmluaXRpb25NZXRob2QgPSBtZXRob2Q7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIERlZmluZSBhbiBpbmZsZWN0b3ItYmFzZWQgcmVzb3VyY2UgbWV0aG9kIGhhbmRsZXIgYmluZGluZy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGluZmxlY3RvciBpbmZsZWN0b3IgaGFuZGxpbmcgdGhlIHJlc291cmNlIG1ldGhvZC4KKyAgICAgICAgICogQHJldHVybiB1cGRhdGVkIGJ1aWxkZXIgb2JqZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgaGFuZGxlZEJ5KEluZmxlY3RvcjxDb250YWluZXJSZXF1ZXN0Q29udGV4dCwgPz4gaW5mbGVjdG9yKSB7CisgICAgICAgICAgICByZXR1cm4gaGFuZGxlZEJ5KGluZmxlY3RvciwgSW52b2NhYmxlLkFQUExZX0lORkxFQ1RPUl9NRVRIT0QpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIERlZmluZSBhbiBpbmZsZWN0b3ItYmFzZWQgcmVzb3VyY2UgbWV0aG9kIGhhbmRsZXIgYmluZGluZy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGluZmxlY3RvckNsYXNzIGNsYXNzIG9mIHRoZSBpbmZsZWN0b3IgaGFuZGxpbmcgdGhlIHJlc291cmNlIG1ldGhvZC4KKyAgICAgICAgICogQHJldHVybiB1cGRhdGVkIGJ1aWxkZXIgb2JqZWN0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgaGFuZGxlZEJ5KENsYXNzPD8gZXh0ZW5kcyBJbmZsZWN0b3I+IGluZmxlY3RvckNsYXNzKSB7CisgICAgICAgICAgICByZXR1cm4gaGFuZGxlZEJ5KGluZmxlY3RvckNsYXNzLCBJbnZvY2FibGUuQVBQTFlfSU5GTEVDVE9SX01FVEhPRCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUGFyYW1ldGVycyBkZWZpbmVkIG9uIHRoZSBoYW5kbGVyIChpLmUuIG5vdCBpbiB0aGUgaGFuZGxpbmcgbWV0aG9kKSwgZS5nLiB2aWEgcHJvcGVydHkgc2V0dGVycyBvciBmaWVsZHMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJzIGhhbmRsZXIgcGFyYW1ldGVycyB0byBiZSBhZGRlZCB0byB0aGUgc2V0IG9mIGhhbmRsZXIgcGFyYW1ldGVycyBmb3IgdGhlIG1ldGhvZC4KKyAgICAgICAgICogQHJldHVybiB1cGRhdGVkIGJ1aWxkZXIgb2JqZWN0LgorICAgICAgICAgKiBAc2luY2UgMi4yMAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgaGFuZGxlclBhcmFtZXRlcnMoQ29sbGVjdGlvbjxQYXJhbWV0ZXI+IHBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgIHRoaXMuaGFuZGxlclBhcmFtZXRlcnMuYWRkQWxsKHBhcmFtZXRlcnMpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRGVmaW5lIGEgc3BlY2lmaWMgbWV0aG9kIG9mIHRoZSBoYW5kbGluZyBjbGFzcyB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQuIElmIHRoZSBtZXRob2QKKyAgICAgICAgICogaXMgbm90IGRlZmluZWQgdGhlbiB0aGUgbWV0aG9kIHdpbGwgYmUgZXF1YWwgdG8gdGhlIG1ldGhvZCBpbml0aWFsaXplZCBieQorICAgICAgICAgKiBvbmUgb2YgdGhlIHtAY29kZSBoYW5kbGVkQnkoKX0gYnVpbGRlciBtZXRob2RzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gaGFuZGxpbmdNZXRob2Qgc3BlY2lmaWMgaGFuZGxpbmcgbWV0aG9kLgorICAgICAgICAgKiBAcmV0dXJuIHVwZGF0ZWQgYnVpbGRlciBvYmplY3QuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBoYW5kbGluZ01ldGhvZChmaW5hbCBNZXRob2QgaGFuZGxpbmdNZXRob2QpIHsKKyAgICAgICAgICAgIHRoaXMuaGFuZGxpbmdNZXRob2QgPSBoYW5kbGluZ01ldGhvZDsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRGVmaW5lIHRoZSByZXNwb25zZSBlbnRpdHkgdHlwZSB1c2VkIGR1cmluZyB0aGUgcm91dGluZyBmb3IKKyAgICAgICAgICogc2VsZWN0aW9uIG9mIHRoZSByZXNvdXJjZSBtZXRob2RzLiBJZiB0aGlzIG1ldGhvZCBpcyBub3QgY2FsbGVkIHRoZW4KKyAgICAgICAgICogdGhlIHtAbGluayBJbnZvY2FibGUjZ2V0Um91dGluZ1Jlc3BvbnNlVHlwZSgpfSB3aWxsIGJlIGVxdWFsIHRvCisgICAgICAgICAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuSW52b2NhYmxlI2dldFJlc3BvbnNlVHlwZSgpfSB3aGljaAorICAgICAgICAgKiBpcyB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHN0YXRlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcm91dGluZ1Jlc3BvbnNlVHlwZSBSb3V0aW5nIHJlc3BvbnNlIHR5cGUuCisgICAgICAgICAqIEByZXR1cm4gdXBkYXRlZCBidWlsZGVyIG9iamVjdC4KKyAgICAgICAgICogQHNlZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuSW52b2NhYmxlI2dldFJvdXRpbmdSZXNwb25zZVR5cGUoKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgcm91dGluZ1Jlc3BvbnNlVHlwZShUeXBlIHJvdXRpbmdSZXNwb25zZVR5cGUpIHsKKyAgICAgICAgICAgIHRoaXMucm91dGluZ1Jlc3BvbnNlVHlwZSA9IHJvdXRpbmdSZXNwb25zZVR5cGU7CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHJlc291cmNlIG1ldGhvZCBpcyBleHRlbmRlZCBvciBpcyBhIGNvcmUgb2YgZXhwb3NlZCBSRVNUZnVsIEFQSS4KKyAgICAgICAgICogVGhlIG1ldGhvZCBkZWZpbmVzIHRoZQorICAgICAgICAgKiBmbGFnIGF2YWlsYWJsZSBhdCB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTWV0aG9kI2lzRXh0ZW5kZWQoKX0uCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBFeHRlbmRlZCByZXNvdXJjZSBtb2RlbCBjb21wb25lbnRzIGFyZSBoZWxwZXIgY29tcG9uZW50cyB0aGF0IGFyZSBub3QgY29uc2lkZXJlZCBhcyBhIGNvcmUgb2YgYQorICAgICAgICAgKiBSRVNUZnVsIEFQSS4gVGhlc2UgY2FuIGJlIGZvciBleGFtcGxlIHtAY29kZSBPUFRJT05TfSB7QGxpbmsgUmVzb3VyY2VNZXRob2QgcmVzb3VyY2UgbWV0aG9kc30KKyAgICAgICAgICogYWRkZWQgYnkge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5Nb2RlbFByb2Nlc3NvciBtb2RlbCBwcm9jZXNzb3JzfQorICAgICAgICAgKiBvciB7QGNvZGUgYXBwbGljYXRpb24ud2FkbH0gcmVzb3VyY2UgcHJvZHVjaW5nIHRoZSBXQURMLiBCb3RoIHJlc291cmNlIGFyZSByYXRoZXIgc3VwcG9ydGl2ZQorICAgICAgICAgKiB0aGFuIHRoZSBjb3JlIG9mIFJFU1RmdWwgQVBJLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBleHRlbmRlZCBJZiB7QGNvZGUgdHJ1ZX0gdGhlbiByZXNvdXJjZSBtZXRob2QgaXMgbWFya2VkIGFzIGV4dGVuZGVkLgorICAgICAgICAgKiBAcmV0dXJuIHVwZGF0ZWQgYnVpbGRlciBvYmplY3QuCisgICAgICAgICAqIEBzZWUgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLkV4dGVuZGVkUmVzb3VyY2UKKyAgICAgICAgICogQHNpbmNlIDIuNS4xCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBleHRlbmRlZChib29sZWFuIGV4dGVuZGVkKSB7CisgICAgICAgICAgICB0aGlzLmV4dGVuZGVkID0gZXh0ZW5kZWQ7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBCdWlsZCB0aGUgcmVzb3VyY2UgbWV0aG9kIG1vZGVsIGFuZCByZWdpc3RlciBpdCB3aXRoIHRoZSBwYXJlbnQKKyAgICAgICAgICoge0BsaW5rIFJlc291cmNlLkJ1aWxkZXIgUmVzb3VyY2UuQnVpbGRlcn0uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gbmV3IHJlc291cmNlIG1ldGhvZCBtb2RlbC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBSZXNvdXJjZU1ldGhvZCBidWlsZCgpIHsKKworICAgICAgICAgICAgZmluYWwgRGF0YSBtZXRob2REYXRhID0gbmV3IERhdGEoCisgICAgICAgICAgICAgICAgICAgIGh0dHBNZXRob2QsCisgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVkVHlwZXMsCisgICAgICAgICAgICAgICAgICAgIHByb2R1Y2VkVHlwZXMsCisgICAgICAgICAgICAgICAgICAgIG1hbmFnZWRBc3luYywKKyAgICAgICAgICAgICAgICAgICAgc3VzcGVuZGVkLAorICAgICAgICAgICAgICAgICAgICBzc2UsCisgICAgICAgICAgICAgICAgICAgIHN1c3BlbmRUaW1lb3V0LAorICAgICAgICAgICAgICAgICAgICBzdXNwZW5kVGltZW91dFVuaXQsCisgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUludm9jYWJsZSgpLAorICAgICAgICAgICAgICAgICAgICBuYW1lQmluZGluZ3MsCisgICAgICAgICAgICAgICAgICAgIHBhcmVudC5pc0V4dGVuZGVkKCkgfHwgZXh0ZW5kZWQpOworCisgICAgICAgICAgICBwYXJlbnQub25CdWlsZE1ldGhvZCh0aGlzLCBtZXRob2REYXRhKTsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZU1ldGhvZChudWxsLCBtZXRob2REYXRhKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgSW52b2NhYmxlIGNyZWF0ZUludm9jYWJsZSgpIHsKKyAgICAgICAgICAgIGFzc2VydCBoYW5kbGVyQ2xhc3MgIT0gbnVsbCB8fCBoYW5kbGVySW5zdGFuY2UgIT0gbnVsbDsKKworICAgICAgICAgICAgZmluYWwgTWV0aG9kSGFuZGxlciBoYW5kbGVyOworICAgICAgICAgICAgaWYgKGhhbmRsZXJDbGFzcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlciA9IE1ldGhvZEhhbmRsZXIuY3JlYXRlKGhhbmRsZXJDbGFzcywgZW5jb2RlZFBhcmFtcywgaGFuZGxlclBhcmFtZXRlcnMpOworICAgICAgICAgICAgfSBlbHNlIHsgLy8gaW5zdGFuY2UgYmFzZWQKKyAgICAgICAgICAgICAgICBoYW5kbGVyID0gTWV0aG9kSGFuZGxlci5jcmVhdGUoaGFuZGxlckluc3RhbmNlLCBoYW5kbGVyUGFyYW1ldGVycyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBJbnZvY2FibGUuY3JlYXRlKGhhbmRsZXIsIGRlZmluaXRpb25NZXRob2QsIGhhbmRsaW5nTWV0aG9kLCBlbmNvZGVkUGFyYW1zLCByb3V0aW5nUmVzcG9uc2VUeXBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEltbXV0YWJsZSByZXNvdXJjZSBtZXRob2QgZGF0YS4KKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBjbGFzcyBEYXRhIHsKKworICAgICAgICAvLyBKQVgtUlMgbWV0aG9kIHR5cGUKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBKYXhyc1R5cGUgdHlwZTsKKyAgICAgICAgLy8gSHR0cE1ldGhvZAorICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBodHRwTWV0aG9kOworICAgICAgICAvLyBDb25zdW1pbmcgJiBQcm9kdWNpbmcKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PE1lZGlhVHlwZT4gY29uc3VtZWRUeXBlczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PE1lZGlhVHlwZT4gcHJvZHVjZWRUeXBlczsKKyAgICAgICAgLy8gU3VzcGVuZGFibGVDb21wb25lbnQKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1hbmFnZWRBc3luYzsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHN1c3BlbmRlZDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHNzZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBsb25nIHN1c3BlbmRUaW1lb3V0OworICAgICAgICBwcml2YXRlIGZpbmFsIFRpbWVVbml0IHN1c3BlbmRUaW1lb3V0VW5pdDsKKyAgICAgICAgLy8gSW52b2NhYmxlCisgICAgICAgIHByaXZhdGUgZmluYWwgSW52b2NhYmxlIGludm9jYWJsZTsKKyAgICAgICAgLy8gTmFtZUJvdW5kCisgICAgICAgIHByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4+IG5hbWVCaW5kaW5nczsKKworICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gZXh0ZW5kZWQ7CisKKyAgICAgICAgcHJpdmF0ZSBEYXRhKGZpbmFsIFN0cmluZyBodHRwTWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxNZWRpYVR5cGU+IGNvbnN1bWVkVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPE1lZGlhVHlwZT4gcHJvZHVjZWRUeXBlcywKKyAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gbWFuYWdlZEFzeW5jLCBmaW5hbCBib29sZWFuIHN1c3BlbmRlZCwgYm9vbGVhbiBzc2UsCisgICAgICAgICAgICAgICAgICAgICBmaW5hbCBsb25nIHN1c3BlbmRUaW1lb3V0LAorICAgICAgICAgICAgICAgICAgICAgZmluYWwgVGltZVVuaXQgc3VzcGVuZFRpbWVvdXRVbml0LAorICAgICAgICAgICAgICAgICAgICAgZmluYWwgSW52b2NhYmxlIGludm9jYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbGxlY3Rpb248Q2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+PiBuYW1lQmluZGluZ3MsCisgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGV4dGVuZGVkKSB7CisgICAgICAgICAgICB0aGlzLm1hbmFnZWRBc3luYyA9IG1hbmFnZWRBc3luYzsKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IEpheHJzVHlwZS5jbGFzc2lmeShodHRwTWV0aG9kKTsKKworICAgICAgICAgICAgdGhpcy5odHRwTWV0aG9kID0gKGh0dHBNZXRob2QgPT0gbnVsbCkgPyBodHRwTWV0aG9kIDogaHR0cE1ldGhvZC50b1VwcGVyQ2FzZSgpOworCisgICAgICAgICAgICB0aGlzLmNvbnN1bWVkVHlwZXMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KG5ldyBBcnJheUxpc3Q8Pihjb25zdW1lZFR5cGVzKSk7CisgICAgICAgICAgICB0aGlzLnByb2R1Y2VkVHlwZXMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KG5ldyBBcnJheUxpc3Q8Pihwcm9kdWNlZFR5cGVzKSk7CisgICAgICAgICAgICB0aGlzLmludm9jYWJsZSA9IGludm9jYWJsZTsKKyAgICAgICAgICAgIHRoaXMuc3VzcGVuZGVkID0gc3VzcGVuZGVkOworICAgICAgICAgICAgdGhpcy5zc2UgPSBzc2U7CisgICAgICAgICAgICB0aGlzLnN1c3BlbmRUaW1lb3V0ID0gc3VzcGVuZFRpbWVvdXQ7CisgICAgICAgICAgICB0aGlzLnN1c3BlbmRUaW1lb3V0VW5pdCA9IHN1c3BlbmRUaW1lb3V0VW5pdDsKKworICAgICAgICAgICAgdGhpcy5uYW1lQmluZGluZ3MgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVDb2xsZWN0aW9uKG5ldyBBcnJheUxpc3Q8PihuYW1lQmluZGluZ3MpKTsKKyAgICAgICAgICAgIHRoaXMuZXh0ZW5kZWQgPSBleHRlbmRlZDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIEpBWC1SUyBtZXRob2QgdHlwZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB0aGUgSkFYLVJTIG1ldGhvZCB0eXBlLgorICAgICAgICAgKi8KKyAgICAgICAgLyogcGFja2FnZSAqLyBKYXhyc1R5cGUgZ2V0VHlwZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgYXNzb2NpYXRlZCBIVFRQIG1ldGhvZC4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIE1heSByZXR1cm4ge0Bjb2RlIG51bGx9IGluIGNhc2UgdGhlIG1ldGhvZCByZXByZXNlbnRzIGEgc3ViLXJlc291cmNlCisgICAgICAgICAqIGxvY2F0b3IuCisgICAgICAgICAqIDwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB0aGUgYXNzb2NpYXRlZCBIVFRQIG1ldGhvZCwgb3Ige0Bjb2RlIG51bGx9IGluIGNhc2UgdGhpcyBtZXRob2QKKyAgICAgICAgICogcmVwcmVzZW50cyBhIHN1Yi1yZXNvdXJjZSBsb2NhdG9yLgorICAgICAgICAgKi8KKyAgICAgICAgLyogcGFja2FnZSAqLyBTdHJpbmcgZ2V0SHR0cE1ldGhvZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBodHRwTWV0aG9kOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBjb25zdW1hYmxlIG1lZGlhIHR5cGVzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIGNvbnN1bWFibGUgbWVkaWEgdHlwZXMuCisgICAgICAgICAqLworICAgICAgICAvKiBwYWNrYWdlICovIExpc3Q8TWVkaWFUeXBlPiBnZXRDb25zdW1lZFR5cGVzKCkgeworICAgICAgICAgICAgcmV0dXJuIGNvbnN1bWVkVHlwZXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHByb2R1Y2VkIG1lZGlhIHR5cGVzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHByb2R1Y2VkIG1lZGlhIHR5cGVzLgorICAgICAgICAgKi8KKyAgICAgICAgLyogcGFja2FnZSAqLyBMaXN0PE1lZGlhVHlwZT4gZ2V0UHJvZHVjZWRUeXBlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBwcm9kdWNlZFR5cGVzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIG1hbmFnZWQgYXN5bmMgc3VwcG9ydCBkZWNsYXJlZCBvbiB0aGUgbWV0aG9kLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBtYW5hZ2VkIGFzeW5jIHN1cHBvcnQgaXMgZGVjbGFyZWQgb24gdGhlIG1ldGhvZCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICAvKiBwYWNrYWdlICovIGJvb2xlYW4gaXNNYW5hZ2VkQXN5bmMoKSB7CisgICAgICAgICAgICByZXR1cm4gbWFuYWdlZEFzeW5jOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBtZXRob2QgcmVxdWlyZXMgaW5qZWN0aW9uIG9mIHN1c3BlbmRlZCByZXNwb25zZSBjb250ZXh0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgbWV0aG9kIHJlcXVpcmVzIGluamVjdGlvbiBvZiBzdXNwZW5kZWQgcmVzcG9uc2UgY29udGV4dCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICAvKiBwYWNrYWdlICovIGJvb2xlYW4gaXNTdXNwZW5kZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gc3VzcGVuZGVkOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBtZXRob2QgcmVxdWlyZXMgaW5qZWN0aW9uIG9mIFNzZSBFdmVudCBTaW5rLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgbWV0aG9kIHJlcXVpcmVzIGluamVjdGlvbiBvZiBTc2UgRXZlbnQgU2luaywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICAvKiBwYWNrYWdlICovIGJvb2xlYW4gaXNTc2UoKSB7CisgICAgICAgICAgICByZXR1cm4gc3NlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgc3VzcGVuZGVkIHRpbWVvdXQgdmFsdWUgZm9yIHRoZSBtZXRob2QuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gdGhlIHN1c3BlbmRlZCB0aW1lb3V0IHZhbHVlIGZvciB0aGUgbWV0aG9kLgorICAgICAgICAgKi8KKyAgICAgICAgLyogcGFja2FnZSAqLyBsb25nIGdldFN1c3BlbmRUaW1lb3V0KCkgeworICAgICAgICAgICAgcmV0dXJuIHN1c3BlbmRUaW1lb3V0OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgc3VzcGVuZGVkIHRpbWVvdXQgdGltZSB1bml0IGZvciB0aGUgbWV0aG9kLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBzdXNwZW5kZWQgdGltZW91dCB0aW1lIHVuaXQgZm9yIHRoZSBtZXRob2QuCisgICAgICAgICAqLworICAgICAgICAvKiBwYWNrYWdlICovIFRpbWVVbml0IGdldFN1c3BlbmRUaW1lb3V0VW5pdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBzdXNwZW5kVGltZW91dFVuaXQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSBpbnZvY2FibGUgbWV0aG9kIG1vZGVsLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIGludm9jYWJsZSBtZXRob2QgbW9kZWwuCisgICAgICAgICAqLworICAgICAgICAvKiBwYWNrYWdlICovIEludm9jYWJsZSBnZXRJbnZvY2FibGUoKSB7CisgICAgICAgICAgICByZXR1cm4gaW52b2NhYmxlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCB0aGUgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHJlc291cmNlIG1ldGhvZCBpcyBleHRlbmRlZCBvciBpcyBhIGNvcmUgb2YgZXhwb3NlZCBSRVNUZnVsIEFQSS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgcmVzb3VyY2UgaXMgZXh0ZW5kZWQuCisgICAgICAgICAqLworICAgICAgICAvKiBwYWNrYWdlICovIGJvb2xlYW4gaXNFeHRlbmRlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBleHRlbmRlZDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgdGhlIGNvbGxlY3Rpb24gb2YgbmFtZSBiaW5kaW5ncyBhdHRhY2hlZCB0byB0aGlzIG1ldGhvZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBjb2xsZWN0aW9uIG9mIG5hbWUgYmluZGluZyBhbm5vdGF0aW9uIHR5cGVzIGF0dGFjaGVkIHRvIHRoZSBtZXRob2QuCisgICAgICAgICAqLworICAgICAgICAvKiBwYWNrYWdlICovIENvbGxlY3Rpb248Q2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+PiBnZXROYW1lQmluZGluZ3MoKSB7CisgICAgICAgICAgICByZXR1cm4gbmFtZUJpbmRpbmdzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gImh0dHBNZXRob2Q9IiArIGh0dHBNZXRob2QKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBjb25zdW1lZFR5cGVzPSIgKyBjb25zdW1lZFR5cGVzCisgICAgICAgICAgICAgICAgICAgICsgIiwgcHJvZHVjZWRUeXBlcz0iICsgcHJvZHVjZWRUeXBlcworICAgICAgICAgICAgICAgICAgICArICIsIHN1c3BlbmRlZD0iICsgc3VzcGVuZGVkCisgICAgICAgICAgICAgICAgICAgICsgIiwgc3VzcGVuZFRpbWVvdXQ9IiArIHN1c3BlbmRUaW1lb3V0CisgICAgICAgICAgICAgICAgICAgICsgIiwgc3VzcGVuZFRpbWVvdXRVbml0PSIgKyBzdXNwZW5kVGltZW91dFVuaXQKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBpbnZvY2FibGU9IiArIGludm9jYWJsZQorICAgICAgICAgICAgICAgICAgICArICIsIG5hbWVCaW5kaW5ncz0iICsgbmFtZUJpbmRpbmdzOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJhbnNmb3JtIGEgY29sbGVjdGlvbiBvZiByZXNvdXJjZSBtZXRob2QgZGF0YSBpbnRvIHJlc291cmNlIG1ldGhvZCBtb2RlbHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50IHBhcmVudCByZXNvdXJjZSBtb2RlbC4KKyAgICAgKiBAcGFyYW0gbGlzdCAgIHJlc291cmNlIG1ldGhvZCBkYXRhIGNvbGxlY3Rpb24uCisgICAgICogQHJldHVybiB0cmFuc2Zvcm1lZCByZXNvdXJjZSBtZXRob2QgbW9kZWxzLgorICAgICAqLworICAgIHN0YXRpYyBMaXN0PFJlc291cmNlTWV0aG9kPiB0cmFuc2Zvcm0oZmluYWwgUmVzb3VyY2UgcGFyZW50LCBmaW5hbCBMaXN0PERhdGE+IGxpc3QpIHsKKyAgICAgICAgcmV0dXJuIGxpc3Quc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgICAubWFwKGRhdGExIC0+IChkYXRhMSA9PSBudWxsKSA/IG51bGwgOiBuZXcgUmVzb3VyY2VNZXRob2QocGFyZW50LCBkYXRhMSkpCisgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBEYXRhIGRhdGE7CisgICAgcHJpdmF0ZSBmaW5hbCBSZXNvdXJjZSBwYXJlbnQ7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IHJlc291cmNlIG1ldGhvZCBtb2RlbCBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgcGFyZW50IHJlc291cmNlIG1vZGVsLgorICAgICAqIEBwYXJhbSBkYXRhICAgcmVzb3VyY2UgbWV0aG9kIG1vZGVsIGRhdGEuCisgICAgICovCisgICAgUmVzb3VyY2VNZXRob2QoZmluYWwgUmVzb3VyY2UgcGFyZW50LCBmaW5hbCBEYXRhIGRhdGEpIHsKKyAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IG1vZGVsIGRhdGEgcmVwcmVzZW50ZWQgYnkgdGhpcyByZXNvdXJjZSBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIG1vZGVsIGRhdGEgcmVwcmVzZW50ZWQgYnkgdGhpcyByZXNvdXJjZSBtZXRob2QuCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBEYXRhIGdldERhdGEoKSB7CisgICAgICAgIHJldHVybiBkYXRhOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcGFyZW50IHJlc291cmNlIGZvciB0aGlzIHJlc291cmNlIG1ldGhvZCBtb2RlbC4KKyAgICAgKiA8cD4KKyAgICAgKiBNYXkgcmV0dXJuIHtAY29kZSBudWxsfSBpbiBjYXNlIHRoZSByZXNvdXJjZSBtZXRob2QgaXMgbm90IGJvdW5kIHRvIGFuIGV4aXN0aW5nIHJlc291cmNlLgorICAgICAqIFRoaXMgaXMgdHlwaWNhbCBmb3IgcmVzb3VyY2UgbWV0aG9kIG1vZGVscyByZXR1cm5lZCBkaXJlY3RseSBmcm9tIHRoZQorICAgICAqIHtAbGluayBSZXNvdXJjZU1ldGhvZC5CdWlsZGVyI2J1aWxkKCkgUmVzb3VyY2VNZXRob2QuQnVpbGRlci5idWlsZCgpfSBtZXRob2QuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHJldHVybiBwYXJlbnQgcmVzb3VyY2UsIG9yIHtAY29kZSBudWxsfSBpZiB0aGVyZSBpcyBubyBwYXJlbnQgcmVzb3VyY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZXRob2QuCisgICAgICogQHNpbmNlIDIuMQorICAgICAqLworICAgIHB1YmxpYyBSZXNvdXJjZSBnZXRQYXJlbnQoKSB7CisgICAgICAgIHJldHVybiBwYXJlbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBKQVgtUlMgbWV0aG9kIHR5cGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBKQVgtUlMgbWV0aG9kIHR5cGUuCisgICAgICovCisgICAgcHVibGljIEpheHJzVHlwZSBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gZGF0YS5nZXRUeXBlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBhc3NvY2lhdGVkIEhUVFAgbWV0aG9kLgorICAgICAqIDxwPgorICAgICAqIE1heSByZXR1cm4ge0Bjb2RlIG51bGx9IGluIGNhc2UgdGhlIG1ldGhvZCByZXByZXNlbnRzIGEgc3ViLXJlc291cmNlCisgICAgICogbG9jYXRvci4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBhc3NvY2lhdGVkIEhUVFAgbWV0aG9kLCBvciB7QGNvZGUgbnVsbH0gaW4gY2FzZSB0aGlzIG1ldGhvZAorICAgICAqIHJlcHJlc2VudHMgYSBzdWItcmVzb3VyY2UgbG9jYXRvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEh0dHBNZXRob2QoKSB7CisgICAgICAgIHJldHVybiBkYXRhLmdldEh0dHBNZXRob2QoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGludm9jYWJsZSBtZXRob2QgbW9kZWwuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGludm9jYWJsZSBtZXRob2QgbW9kZWwuCisgICAgICovCisgICAgcHVibGljIEludm9jYWJsZSBnZXRJbnZvY2FibGUoKSB7CisgICAgICAgIHJldHVybiBkYXRhLmdldEludm9jYWJsZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHJlc291cmNlIG1ldGhvZCBpcyBleHRlbmRlZCBvciBpcyBhIGNvcmUgb2YgZXhwb3NlZCBSRVNUZnVsIEFQSS4KKyAgICAgKiA8cD4KKyAgICAgKiBFeHRlbmRlZCByZXNvdXJjZSBtb2RlbCBjb21wb25lbnRzIGFyZSBoZWxwZXIgY29tcG9uZW50cyB0aGF0IGFyZSBub3QgY29uc2lkZXJlZCBhcyBhIGNvcmUgb2YgYQorICAgICAqIFJFU1RmdWwgQVBJLiBUaGVzZSBjYW4gYmUgZm9yIGV4YW1wbGUge0Bjb2RlIE9QVElPTlN9IHJlc291cmNlIG1ldGhvZHMKKyAgICAgKiBhZGRlZCBieSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLk1vZGVsUHJvY2Vzc29yIG1vZGVsIHByb2Nlc3NvcnN9CisgICAgICogb3Ige0Bjb2RlIGFwcGxpY2F0aW9uLndhZGx9IHJlc291cmNlIHByb2R1Y2luZyB0aGUgV0FETC4gQm90aCByZXNvdXJjZSBhcmUgcmF0aGVyIHN1cHBvcnRpdmUKKyAgICAgKiB0aGFuIHRoZSBjb3JlIG9mIFJFU1RmdWwgQVBJLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiBub3Qgc2V0IHRoZSByZXNvdXJjZSB3aWxsIG5vdCBiZSBkZWZpbmVkIGFzIGV4dGVuZGVkIGJ5IGRlZmF1bHQuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG1ldGhvZCBpcyBleHRlbmRlZC4KKyAgICAgKiBAc2VlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5FeHRlbmRlZFJlc291cmNlCisgICAgICogQHNpbmNlIDIuNS4xCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNFeHRlbmRlZCgpIHsKKyAgICAgICAgcmV0dXJuIGRhdGEuZXh0ZW5kZWQ7CisgICAgfQorCisgICAgLy8gQ29uc3VtaW5nCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8TWVkaWFUeXBlPiBnZXRDb25zdW1lZFR5cGVzKCkgeworICAgICAgICByZXR1cm4gZGF0YS5nZXRDb25zdW1lZFR5cGVzKCk7CisgICAgfQorCisgICAgLy8gUHJvZHVjaW5nCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8TWVkaWFUeXBlPiBnZXRQcm9kdWNlZFR5cGVzKCkgeworICAgICAgICByZXR1cm4gZGF0YS5nZXRQcm9kdWNlZFR5cGVzKCk7CisgICAgfQorCisgICAgLy8gU3VzcGVuZGFibGUKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBnZXRTdXNwZW5kVGltZW91dCgpIHsKKyAgICAgICAgcmV0dXJuIGRhdGEuZ2V0U3VzcGVuZFRpbWVvdXQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVGltZVVuaXQgZ2V0U3VzcGVuZFRpbWVvdXRVbml0KCkgeworICAgICAgICByZXR1cm4gZGF0YS5nZXRTdXNwZW5kVGltZW91dFVuaXQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1N1c3BlbmREZWNsYXJlZCgpIHsKKyAgICAgICAgcmV0dXJuIGRhdGEuaXNTdXNwZW5kZWQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayB3aGV0aGVyIHRoZSByZXNvdXJjZSBtZXRob2Qgd2lsbCBiZSBwcm9kdWNpbmcgU2VydmVyLXNlbnQgZXZlbnQgc3RyZWFtLgorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHJlc291cmNlIG1ldGhvZCBwcm9kdWNlcyBTZXJ2ZXItc2VudCBldmVudCBzdHJlYW0sIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU3NlKCkgeworICAgICAgICByZXR1cm4gZGF0YS5pc1NzZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzTWFuYWdlZEFzeW5jRGVjbGFyZWQoKSB7CisgICAgICAgIHJldHVybiBkYXRhLmlzTWFuYWdlZEFzeW5jKCk7CisgICAgfQorCisgICAgLy8gUmVzb3VyY2VNb2RlbENvbXBvbmVudAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PD8gZXh0ZW5kcyBSZXNvdXJjZU1vZGVsQ29tcG9uZW50PiBnZXRDb21wb25lbnRzKCkgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChkYXRhLmdldEludm9jYWJsZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhY2NlcHQoUmVzb3VyY2VNb2RlbFZpc2l0b3IgdmlzaXRvcikgeworICAgICAgICB2aXNpdG9yLnZpc2l0UmVzb3VyY2VNZXRob2QodGhpcyk7CisgICAgfQorCisgICAgLy8gTmFtZUJvdW5kCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNOYW1lQm91bmQoKSB7CisgICAgICAgIHJldHVybiAhZGF0YS5nZXROYW1lQmluZGluZ3MoKS5pc0VtcHR5KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENvbGxlY3Rpb248Q2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+PiBnZXROYW1lQmluZGluZ3MoKSB7CisgICAgICAgIHJldHVybiBkYXRhLmdldE5hbWVCaW5kaW5ncygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiUmVzb3VyY2VNZXRob2R7IiArIGRhdGEudG9TdHJpbmcoKSArICd9JzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9SZXNvdXJjZU1ldGhvZENvbmZpZy5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvUmVzb3VyY2VNZXRob2RDb25maWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGMzY2RlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvUmVzb3VyY2VNZXRob2RDb25maWcuamF2YQpAQCAtMCwwICsxLDkzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuUnVudGltZVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlc3BvbnNlRmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SZWFkZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3I7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb2RlbC5Db250cmFjdFByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1vZGVsLmludGVybmFsLkNvbW1vbkNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb2RlbC5pbnRlcm5hbC5Db21wb25lbnRCYWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5JbmZsZWN0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworCisvKioKKyAqIERlZmF1bHQge0BsaW5rIGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9ufSBmb3IgcmVzb3VyY2UgbWV0aG9kcy4KKyAqIFRoZSBvbmx5IGFsbG93ZWQgY29udHJhY3QgdHlwZXMgZm9yIHRoaXMgY29uZmlndXJhdGlvbiBhcmU6CisgKiA8dWw+CisgKiA8bGk+Q29udGFpbmVyUmVxdWVzdEZpbHRlcjwvbGk+CisgKiA8bGk+Q29udGFpbmVyUmVzcG9uc2VGaWx0ZXI8L2xpPgorICogPGxpPlJlYWRlckludGVyY2VwdG9yPC9saT4KKyAqIDxsaT5Xcml0ZXJJbnRlcmNlcHRvcjwvbGk+CisgKiA8L3VsPgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitjbGFzcyBSZXNvdXJjZU1ldGhvZENvbmZpZyBleHRlbmRzIENvbW1vbkNvbmZpZyB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihSZXNvdXJjZU1ldGhvZENvbmZpZy5jbGFzcy5nZXROYW1lKCkpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PENsYXNzPD8+PiBhbGxvd2VkQ29udHJhY3RzOworCisgICAgc3RhdGljIHsKKyAgICAgICAgLy9ub2luc3BlY3Rpb24gdW5jaGVja2VkCisgICAgICAgIFNldDxDbGFzczw/Pj4gdGVtcFNldCA9IENvbGxlY3Rpb25zLm5ld1NldEZyb21NYXAobmV3IElkZW50aXR5SGFzaE1hcDw+KCkpOworICAgICAgICB0ZW1wU2V0LmFkZChDb250YWluZXJSZXF1ZXN0RmlsdGVyLmNsYXNzKTsKKyAgICAgICAgdGVtcFNldC5hZGQoQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXIuY2xhc3MpOworICAgICAgICB0ZW1wU2V0LmFkZChSZWFkZXJJbnRlcmNlcHRvci5jbGFzcyk7CisgICAgICAgIHRlbXBTZXQuYWRkKFdyaXRlckludGVyY2VwdG9yLmNsYXNzKTsKKyAgICAgICAgYWxsb3dlZENvbnRyYWN0cyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldCh0ZW1wU2V0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IHJlc291cmNlIG1ldGhvZCBydW50aW1lIGNvbmZpZ3VyYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvcGVydGllcyBpbmhlcml0ZWQgcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICBSZXNvdXJjZU1ldGhvZENvbmZpZyhmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpIHsKKyAgICAgICAgc3VwZXIoUnVudGltZVR5cGUuU0VSVkVSLCBDb21wb25lbnRCYWcuRVhDTFVERV9FTVBUWSk7CisgICAgICAgIHNldFByb3BlcnRpZXMocHJvcGVydGllcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEluZmxlY3RvcjxDb250cmFjdFByb3ZpZGVyLkJ1aWxkZXIsIENvbnRyYWN0UHJvdmlkZXI+IGdldE1vZGVsRW5oYW5jZXIoZmluYWwgQ2xhc3M8Pz4gcHJvdmlkZXJDbGFzcykgeworICAgICAgICByZXR1cm4gbmV3IEluZmxlY3RvcjxDb250cmFjdFByb3ZpZGVyLkJ1aWxkZXIsIENvbnRyYWN0UHJvdmlkZXI+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgQ29udHJhY3RQcm92aWRlciBhcHBseShDb250cmFjdFByb3ZpZGVyLkJ1aWxkZXIgYnVpbGRlcikgeworICAgICAgICAgICAgICAgIGZvciAoSXRlcmF0b3I8Q2xhc3M8Pz4+IGl0ID0gIGJ1aWxkZXIuZ2V0Q29udHJhY3RzKCkua2V5U2V0KCkuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gY29udHJhY3QgPSBpdC5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghYWxsb3dlZENvbnRyYWN0cy5jb250YWlucyhjb250cmFjdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi53YXJuaW5nKExvY2FsaXphdGlvbk1lc3NhZ2VzLkNPTlRSQUNUX0NBTk5PVF9CRV9CT1VORF9UT19SRVNPVVJDRV9NRVRIT0QoY29udHJhY3QsIHByb3ZpZGVyQ2xhc3MpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0LnJlbW92ZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9SZXNvdXJjZU1ldGhvZEludm9rZXIuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL1Jlc291cmNlTWV0aG9kSW52b2tlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZDQzODkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9SZXNvdXJjZU1ldGhvZEludm9rZXIuamF2YQpAQCAtMCwwICsxLDUyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWw7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5QYXJhbWV0ZXJpemVkVHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbmNlbGxhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db21wbGV0aW9uU3RhZ2U7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkJpQ29uc3VtZXI7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLlN0cmVhbVN1cHBvcnQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuRHluYW1pY0ZlYXR1cmU7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlJlc291cmNlSW5mbzsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZEhhc2hNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SZWFkZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3I7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQWJzdHJhY3RCaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LlByb3ZpZGVyczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb2RlbC5Db250cmFjdFByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1vZGVsLk5hbWVCb3VuZDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb2RlbC5pbnRlcm5hbC5Db21wb25lbnRCYWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW9kZWwuaW50ZXJuYWwuUmFua2VkQ29tcGFyYXRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb2RlbC5pbnRlcm5hbC5SYW5rZWRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLkluZmxlY3RvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVzcG9uc2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5Qcm9jZXNzaW5nUHJvdmlkZXJzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5pbmplY3QuQ29uZmlndXJlZFZhbGlkYXRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwucHJvY2Vzcy5FbmRwb2ludDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwucHJvY2Vzcy5SZXF1ZXN0UHJvY2Vzc2luZ0NvbnRleHQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLmludGVybmFsLlJlc291cmNlTWV0aG9kRGlzcGF0Y2hlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLmludGVybmFsLlJlc291cmNlTWV0aG9kSW52b2NhdGlvbkhhbmRsZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLlJlcXVlc3RFdmVudDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLmludGVybmFsLlJlc291cmNlTWV0aG9kRGlzcGF0Y2hlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLmludGVybmFsLlJlc291cmNlTWV0aG9kSW52b2NhdGlvbkhhbmRsZXJQcm92aWRlcjsKKworLyoqCisgKiBTZXJ2ZXItc2lkZSByZXF1ZXN0LXJlc3BvbnNlIHtAbGluayBJbmZsZWN0b3IgaW5mbGVjdG9yfSBmb3IgaW52b2tpbmcgbWV0aG9kcworICogb2YgYW5ub3RhdGlvbi1iYXNlZCByZXNvdXJjZSBjbGFzc2VzLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIFJlc291cmNlTWV0aG9kSW52b2tlciBpbXBsZW1lbnRzIEVuZHBvaW50LCBSZXNvdXJjZUluZm8geworCisgICAgcHJpdmF0ZSBmaW5hbCBSZXNvdXJjZU1ldGhvZCBtZXRob2Q7CisgICAgcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uW10gbWV0aG9kQW5ub3RhdGlvbnM7CisgICAgcHJpdmF0ZSBmaW5hbCBUeXBlIGludm9jYWJsZVJlc3BvbnNlVHlwZTsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gY2FuVXNlSW52b2NhYmxlUmVzcG9uc2VUeXBlOworICAgIHByaXZhdGUgZmluYWwgUmVzb3VyY2VNZXRob2REaXNwYXRjaGVyIGRpc3BhdGNoZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBNZXRob2QgcmVzb3VyY2VNZXRob2Q7CisgICAgcHJpdmF0ZSBmaW5hbCBDbGFzczw/PiByZXNvdXJjZUNsYXNzOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxSYW5rZWRQcm92aWRlcjxDb250YWluZXJSZXF1ZXN0RmlsdGVyPj4gcmVxdWVzdEZpbHRlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8UmFua2VkUHJvdmlkZXI8Q29udGFpbmVyUmVzcG9uc2VGaWx0ZXI+PiByZXNwb25zZUZpbHRlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIEl0ZXJhYmxlPFJlYWRlckludGVyY2VwdG9yPiByZWFkZXJJbnRlcmNlcHRvcnM7CisgICAgcHJpdmF0ZSBmaW5hbCBJdGVyYWJsZTxXcml0ZXJJbnRlcmNlcHRvcj4gd3JpdGVySW50ZXJjZXB0b3JzOworCisgICAgLyoqCisgICAgICogUmVzb3VyY2UgbWV0aG9kIGludm9rZXIgaGVscGVyLgorICAgICAqIDxwPgorICAgICAqIFRoZSBidWlsZGVyIEFQSSBwcm92aWRlcyBtZWFucyBmb3IgY29uc3RydWN0aW5nIGEgcHJvcGVybHkgaW5pdGlhbGl6ZWQKKyAgICAgKiB7QGxpbmsgUmVzb3VyY2VNZXRob2RJbnZva2VyIHJlc291cmNlIG1ldGhvZCBpbnZva2VyfSBpbnN0YW5jZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyIHsKKworICAgICAgICBwcml2YXRlIFJlc291cmNlTWV0aG9kRGlzcGF0Y2hlckZhY3RvcnkgcmVzb3VyY2VNZXRob2REaXNwYXRjaGVyRmFjdG9yeTsKKyAgICAgICAgcHJpdmF0ZSBSZXNvdXJjZU1ldGhvZEludm9jYXRpb25IYW5kbGVyRmFjdG9yeSByZXNvdXJjZU1ldGhvZEludm9jYXRpb25IYW5kbGVyRmFjdG9yeTsKKyAgICAgICAgcHJpdmF0ZSBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXI7CisgICAgICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uOworICAgICAgICBwcml2YXRlIFN1cHBsaWVyPENvbmZpZ3VyZWRWYWxpZGF0b3I+IGNvbmZpZ3VyYXRpb25WYWxpZGF0b3I7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCByZXNvdXJjZSBtZXRob2QgZGlzcGF0Y2hlciBmYWN0b3J5LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcmVzb3VyY2VNZXRob2REaXNwYXRjaGVyRmFjdG9yeSByZXNvdXJjZSBtZXRob2QgZGlzcGF0Y2hlciBmYWN0b3J5LgorICAgICAgICAgKiBAcmV0dXJuIHVwZGF0ZWQgYnVpbGRlci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHJlc291cmNlTWV0aG9kRGlzcGF0Y2hlckZhY3RvcnkoUmVzb3VyY2VNZXRob2REaXNwYXRjaGVyRmFjdG9yeSByZXNvdXJjZU1ldGhvZERpc3BhdGNoZXJGYWN0b3J5KSB7CisgICAgICAgICAgICB0aGlzLnJlc291cmNlTWV0aG9kRGlzcGF0Y2hlckZhY3RvcnkgPSByZXNvdXJjZU1ldGhvZERpc3BhdGNoZXJGYWN0b3J5OworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHJlc291cmNlIG1ldGhvZCBpbnZvY2F0aW9uIGhhbmRsZXIgZmFjdG9yeS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHJlc291cmNlTWV0aG9kSW52b2NhdGlvbkhhbmRsZXJGYWN0b3J5IHJlc291cmNlIG1ldGhvZCBpbnZvY2F0aW9uIGhhbmRsZXIgZmFjdG9yeS4KKyAgICAgICAgICogQHJldHVybiB1cGRhdGVkIGJ1aWxkZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciByZXNvdXJjZU1ldGhvZEludm9jYXRpb25IYW5kbGVyRmFjdG9yeSgKKyAgICAgICAgICAgICAgICBSZXNvdXJjZU1ldGhvZEludm9jYXRpb25IYW5kbGVyRmFjdG9yeSByZXNvdXJjZU1ldGhvZEludm9jYXRpb25IYW5kbGVyRmFjdG9yeSkgeworICAgICAgICAgICAgdGhpcy5yZXNvdXJjZU1ldGhvZEludm9jYXRpb25IYW5kbGVyRmFjdG9yeSA9IHJlc291cmNlTWV0aG9kSW52b2NhdGlvbkhhbmRsZXJGYWN0b3J5OworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHJ1bnRpbWUgREkgaW5qZWN0aW9uIG1hbmFnZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBpbmplY3Rpb25NYW5hZ2VyIERJIGluamVjdGlvbiBtYW5hZ2VyLgorICAgICAgICAgKiBAcmV0dXJuIHVwZGF0ZWQgYnVpbGRlci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGluamVjdGlvbk1hbmFnZXIoSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyKSB7CisgICAgICAgICAgICB0aGlzLmluamVjdGlvbk1hbmFnZXIgPSBpbmplY3Rpb25NYW5hZ2VyOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IGdsb2JhbCBjb25maWd1cmF0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbiBnbG9iYWwgY29uZmlndXJhdGlvbi4KKyAgICAgICAgICogQHJldHVybiB1cGRhdGVkIGJ1aWxkZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBjb25maWd1cmF0aW9uKENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgeworICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCBnbG9iYWwgY29uZmlndXJhdGlvbiB2YWxpZGF0b3IuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uVmFsaWRhdG9yIGNvbmZpZ3VyYXRpb24gdmFsaWRhdG9yLgorICAgICAgICAgKiBAcmV0dXJuIHVwZGF0ZWQgYnVpbGRlci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGNvbmZpZ3VyYXRpb25WYWxpZGF0b3IoU3VwcGxpZXI8Q29uZmlndXJlZFZhbGlkYXRvcj4gY29uZmlndXJhdGlvblZhbGlkYXRvcikgeworICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uVmFsaWRhdG9yID0gY29uZmlndXJhdGlvblZhbGlkYXRvcjsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJ1aWxkIGEgbmV3IHJlc291cmNlIG1ldGhvZCBpbnZva2VyIGluc3RhbmNlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbWV0aG9kICAgICAgICAgICAgICByZXNvdXJjZSBtZXRob2QgbW9kZWwuCisgICAgICAgICAqIEBwYXJhbSBwcm9jZXNzaW5nUHJvdmlkZXJzIFByb2Nlc3NpbmcgcHJvdmlkZXJzLgorICAgICAgICAgKiBAcmV0dXJuIG5ldyByZXNvdXJjZSBtZXRob2QgaW52b2tlciBpbnN0YW5jZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBSZXNvdXJjZU1ldGhvZEludm9rZXIgYnVpbGQoUmVzb3VyY2VNZXRob2QgbWV0aG9kLCBQcm9jZXNzaW5nUHJvdmlkZXJzIHByb2Nlc3NpbmdQcm92aWRlcnMpIHsKKyAgICAgICAgICAgIGlmIChyZXNvdXJjZU1ldGhvZERpc3BhdGNoZXJGYWN0b3J5ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIlJlc291cmNlTWV0aG9kRGlzcGF0Y2hlckZhY3RvcnkgaXMgbm90IHNldC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZXNvdXJjZU1ldGhvZEludm9jYXRpb25IYW5kbGVyRmFjdG9yeSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJSZXNvdXJjZU1ldGhvZEludm9jYXRpb25IYW5kbGVyRmFjdG9yeSBpcyBub3Qgc2V0LiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGluamVjdGlvbk1hbmFnZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiREkgaW5qZWN0aW9uIG1hbmFnZXIgaXMgbm90IHNldC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkNvbmZpZ3VyYXRpb24gaXMgbm90IHNldC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uVmFsaWRhdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkNvbmZpZ3VyYXRpb24gdmFsaWRhdG9yIGlzIG5vdCBzZXQuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VNZXRob2RJbnZva2VyKAorICAgICAgICAgICAgICAgICAgICByZXNvdXJjZU1ldGhvZERpc3BhdGNoZXJGYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICByZXNvdXJjZU1ldGhvZEludm9jYXRpb25IYW5kbGVyRmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICBwcm9jZXNzaW5nUHJvdmlkZXJzLCBpbmplY3Rpb25NYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uVmFsaWRhdG9yLmdldCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgUmVzb3VyY2VNZXRob2RJbnZva2VyKAorICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VNZXRob2REaXNwYXRjaGVyLlByb3ZpZGVyIGRpc3BhdGNoZXJQcm92aWRlciwKKyAgICAgICAgICAgIGZpbmFsIFJlc291cmNlTWV0aG9kSW52b2NhdGlvbkhhbmRsZXJQcm92aWRlciBpbnZvY2F0aW9uSGFuZGxlclByb3ZpZGVyLAorICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VNZXRob2QgbWV0aG9kLAorICAgICAgICAgICAgZmluYWwgUHJvY2Vzc2luZ1Byb3ZpZGVycyBwcm9jZXNzaW5nUHJvdmlkZXJzLAorICAgICAgICAgICAgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyLAorICAgICAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbiBnbG9iYWxDb25maWcsCisgICAgICAgICAgICBmaW5hbCBDb25maWd1cmVkVmFsaWRhdG9yIHZhbGlkYXRvcikgeworCisKKyAgICAgICAgdGhpcy5tZXRob2QgPSBtZXRob2Q7CisgICAgICAgIGZpbmFsIEludm9jYWJsZSBpbnZvY2FibGUgPSBtZXRob2QuZ2V0SW52b2NhYmxlKCk7CisgICAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IGRpc3BhdGNoZXJQcm92aWRlci5jcmVhdGUoaW52b2NhYmxlLAorICAgICAgICAgICAgICAgIGludm9jYXRpb25IYW5kbGVyUHJvdmlkZXIuY3JlYXRlKGludm9jYWJsZSksIHZhbGlkYXRvcik7CisKKyAgICAgICAgdGhpcy5yZXNvdXJjZU1ldGhvZCA9IGludm9jYWJsZS5nZXRIYW5kbGluZ01ldGhvZCgpOworICAgICAgICB0aGlzLnJlc291cmNlQ2xhc3MgPSBpbnZvY2FibGUuZ2V0SGFuZGxlcigpLmdldEhhbmRsZXJDbGFzcygpOworCisgICAgICAgIC8vIENvbmZpZ3VyZSBkeW5hbWljIGZlYXR1cmVzLgorICAgICAgICBmaW5hbCBSZXNvdXJjZU1ldGhvZENvbmZpZyBjb25maWcgPSBuZXcgUmVzb3VyY2VNZXRob2RDb25maWcoZ2xvYmFsQ29uZmlnLmdldFByb3BlcnRpZXMoKSk7CisgICAgICAgIGZvciAoZmluYWwgRHluYW1pY0ZlYXR1cmUgZHluYW1pY0ZlYXR1cmUgOiBwcm9jZXNzaW5nUHJvdmlkZXJzLmdldER5bmFtaWNGZWF0dXJlcygpKSB7CisgICAgICAgICAgICBkeW5hbWljRmVhdHVyZS5jb25maWd1cmUodGhpcywgY29uZmlnKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIENvbXBvbmVudEJhZyBjb21wb25lbnRCYWcgPSBjb25maWcuZ2V0Q29tcG9uZW50QmFnKCk7CisgICAgICAgIGZpbmFsIExpc3Q8T2JqZWN0PiBwcm92aWRlcnMgPSBuZXcgQXJyYXlMaXN0PD4oCisgICAgICAgICAgICAgICAgY29tcG9uZW50QmFnLmdldEluc3RhbmNlcyhDb21wb25lbnRCYWcuZXhjbHVkZU1ldGFQcm92aWRlcnMoaW5qZWN0aW9uTWFuYWdlcikpKTsKKworICAgICAgICAvLyBHZXQgaW5zdGFuY2VzIG9mIHByb3ZpZGVycy4KKyAgICAgICAgZmluYWwgU2V0PENsYXNzPD8+PiBwcm92aWRlckNsYXNzZXMgPSBjb21wb25lbnRCYWcuZ2V0Q2xhc3NlcyhDb21wb25lbnRCYWcuZXhjbHVkZU1ldGFQcm92aWRlcnMoaW5qZWN0aW9uTWFuYWdlcikpOworICAgICAgICBpZiAoIXByb3ZpZGVyQ2xhc3Nlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGluamVjdGlvbk1hbmFnZXIgPSBJbmplY3Rpb25zLmNyZWF0ZUluamVjdGlvbk1hbmFnZXIoaW5qZWN0aW9uTWFuYWdlcik7CisgICAgICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyKG5ldyBBYnN0cmFjdEJpbmRlcigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgICAgICAgICAgICAgIGJpbmQoY29uZmlnKS50byhDb25maWd1cmF0aW9uLmNsYXNzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgZm9yIChmaW5hbCBDbGFzczw/PiBwcm92aWRlckNsYXNzIDogcHJvdmlkZXJDbGFzc2VzKSB7CisgICAgICAgICAgICAgICAgcHJvdmlkZXJzLmFkZChpbmplY3Rpb25NYW5hZ2VyLmNyZWF0ZUFuZEluaXRpYWxpemUocHJvdmlkZXJDbGFzcykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZmluYWwgTGlzdDxSYW5rZWRQcm92aWRlcjxSZWFkZXJJbnRlcmNlcHRvcj4+IF9yZWFkZXJJbnRlcmNlcHRvcnMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIGZpbmFsIExpc3Q8UmFua2VkUHJvdmlkZXI8V3JpdGVySW50ZXJjZXB0b3I+PiBfd3JpdGVySW50ZXJjZXB0b3JzID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgICAgICBmaW5hbCBMaXN0PFJhbmtlZFByb3ZpZGVyPENvbnRhaW5lclJlcXVlc3RGaWx0ZXI+PiBfcmVxdWVzdEZpbHRlcnMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIGZpbmFsIExpc3Q8UmFua2VkUHJvdmlkZXI8Q29udGFpbmVyUmVzcG9uc2VGaWx0ZXI+PiBfcmVzcG9uc2VGaWx0ZXJzID0gbmV3IExpbmtlZExpc3Q8PigpOworCisgICAgICAgIGZvciAoZmluYWwgT2JqZWN0IHByb3ZpZGVyIDogcHJvdmlkZXJzKSB7CisgICAgICAgICAgICBmaW5hbCBDb250cmFjdFByb3ZpZGVyIG1vZGVsID0gY29tcG9uZW50QmFnLmdldE1vZGVsKHByb3ZpZGVyLmdldENsYXNzKCkpOworICAgICAgICAgICAgZmluYWwgU2V0PENsYXNzPD8+PiBjb250cmFjdHMgPSBtb2RlbC5nZXRDb250cmFjdHMoKTsKKworICAgICAgICAgICAgaWYgKGNvbnRyYWN0cy5jb250YWlucyhXcml0ZXJJbnRlcmNlcHRvci5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICBfd3JpdGVySW50ZXJjZXB0b3JzLmFkZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSYW5rZWRQcm92aWRlcjw+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoV3JpdGVySW50ZXJjZXB0b3IpIHByb3ZpZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5nZXRQcmlvcml0eShXcml0ZXJJbnRlcmNlcHRvci5jbGFzcykpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvbnRyYWN0cy5jb250YWlucyhSZWFkZXJJbnRlcmNlcHRvci5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICBfcmVhZGVySW50ZXJjZXB0b3JzLmFkZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSYW5rZWRQcm92aWRlcjw+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUmVhZGVySW50ZXJjZXB0b3IpIHByb3ZpZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5nZXRQcmlvcml0eShSZWFkZXJJbnRlcmNlcHRvci5jbGFzcykpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvbnRyYWN0cy5jb250YWlucyhDb250YWluZXJSZXF1ZXN0RmlsdGVyLmNsYXNzKSkgeworICAgICAgICAgICAgICAgIF9yZXF1ZXN0RmlsdGVycy5hZGQoCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmFua2VkUHJvdmlkZXI8PigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKENvbnRhaW5lclJlcXVlc3RGaWx0ZXIpIHByb3ZpZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbC5nZXRQcmlvcml0eShDb250YWluZXJSZXF1ZXN0RmlsdGVyLmNsYXNzKSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY29udHJhY3RzLmNvbnRhaW5zKENvbnRhaW5lclJlc3BvbnNlRmlsdGVyLmNsYXNzKSkgeworICAgICAgICAgICAgICAgIF9yZXNwb25zZUZpbHRlcnMuYWRkKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJhbmtlZFByb3ZpZGVyPD4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDb250YWluZXJSZXNwb25zZUZpbHRlcikgcHJvdmlkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVsLmdldFByaW9yaXR5KENvbnRhaW5lclJlc3BvbnNlRmlsdGVyLmNsYXNzKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgX3JlYWRlckludGVyY2VwdG9ycy5hZGRBbGwoCisgICAgICAgICAgICAgICAgU3RyZWFtU3VwcG9ydC5zdHJlYW0ocHJvY2Vzc2luZ1Byb3ZpZGVycy5nZXRHbG9iYWxSZWFkZXJJbnRlcmNlcHRvcnMoKS5zcGxpdGVyYXRvcigpLCBmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkpOworICAgICAgICBfd3JpdGVySW50ZXJjZXB0b3JzLmFkZEFsbCgKKyAgICAgICAgICAgICAgICBTdHJlYW1TdXBwb3J0LnN0cmVhbShwcm9jZXNzaW5nUHJvdmlkZXJzLmdldEdsb2JhbFdyaXRlckludGVyY2VwdG9ycygpLnNwbGl0ZXJhdG9yKCksIGZhbHNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKSk7CisKKyAgICAgICAgaWYgKHJlc291cmNlTWV0aG9kICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFkZE5hbWVCb3VuZEZpbHRlcnNBbmRJbnRlcmNlcHRvcnMoCisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NpbmdQcm92aWRlcnMsCisgICAgICAgICAgICAgICAgICAgIF9yZXF1ZXN0RmlsdGVycywgX3Jlc3BvbnNlRmlsdGVycywgX3JlYWRlckludGVyY2VwdG9ycywgX3dyaXRlckludGVyY2VwdG9ycywKKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMucmVhZGVySW50ZXJjZXB0b3JzID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChTdHJlYW1TdXBwb3J0LnN0cmVhbShQcm92aWRlcnMuc29ydFJhbmtlZFByb3ZpZGVycygKKyAgICAgICAgICAgICAgICBuZXcgUmFua2VkQ29tcGFyYXRvcjw+KCksIF9yZWFkZXJJbnRlcmNlcHRvcnMpLnNwbGl0ZXJhdG9yKCksIGZhbHNlKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpKTsKKyAgICAgICAgdGhpcy53cml0ZXJJbnRlcmNlcHRvcnMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KFN0cmVhbVN1cHBvcnQuc3RyZWFtKFByb3ZpZGVycy5zb3J0UmFua2VkUHJvdmlkZXJzKAorICAgICAgICAgICAgICAgIG5ldyBSYW5rZWRDb21wYXJhdG9yPD4oKSwgX3dyaXRlckludGVyY2VwdG9ycykuc3BsaXRlcmF0b3IoKSwgZmFsc2UpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkpOworICAgICAgICB0aGlzLnJlcXVlc3RGaWx0ZXJzLmFkZEFsbChfcmVxdWVzdEZpbHRlcnMpOworICAgICAgICB0aGlzLnJlc3BvbnNlRmlsdGVycy5hZGRBbGwoX3Jlc3BvbnNlRmlsdGVycyk7CisKKyAgICAgICAgLy8gcHJlLWNvbXB1dGUgJiBjYWNoZSBpbnZvY2F0aW9uIHByb3BlcnRpZXMKKyAgICAgICAgdGhpcy5tZXRob2RBbm5vdGF0aW9ucyA9IGludm9jYWJsZS5nZXRIYW5kbGluZ01ldGhvZCgpLmdldERlY2xhcmVkQW5ub3RhdGlvbnMoKTsKKyAgICAgICAgdGhpcy5pbnZvY2FibGVSZXNwb25zZVR5cGUgPSBpbnZvY2FibGUuZ2V0UmVzcG9uc2VUeXBlKCk7CisgICAgICAgIHRoaXMuY2FuVXNlSW52b2NhYmxlUmVzcG9uc2VUeXBlID0gaW52b2NhYmxlUmVzcG9uc2VUeXBlICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBWb2lkLlRZUEUgIT0gaW52b2NhYmxlUmVzcG9uc2VUeXBlCisgICAgICAgICAgICAgICAgJiYgVm9pZC5jbGFzcyAhPSBpbnZvY2FibGVSZXNwb25zZVR5cGUKKyAgICAgICAgICAgICAgICAmJiAvLyBEbyBOT1QgY2hhbmdlIHRoZSBlbnRpdHkgdHlwZSBmb3IgUmVzcG9uc2Ugb3IgaXQncyBzdWJjbGFzc2VzLgorICAgICAgICAgICAgICAgICEoKGludm9jYWJsZVJlc3BvbnNlVHlwZSBpbnN0YW5jZW9mIENsYXNzKSAmJiBSZXNwb25zZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKChDbGFzcykgaW52b2NhYmxlUmVzcG9uc2VUeXBlKSk7CisKKyAgICB9CisKKyAgICBwcml2YXRlIDxUPiB2b2lkIGFkZE5hbWVCb3VuZFByb3ZpZGVycygKKyAgICAgICAgICAgIGZpbmFsIENvbGxlY3Rpb248UmFua2VkUHJvdmlkZXI8VD4+IHRhcmdldENvbGxlY3Rpb24sCisgICAgICAgICAgICBmaW5hbCBOYW1lQm91bmQgbmFtZUJvdW5kLAorICAgICAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8Q2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+LCBSYW5rZWRQcm92aWRlcjxUPj4gbmFtZUJvdW5kUHJvdmlkZXJzLAorICAgICAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8UmFua2VkUHJvdmlkZXI8VD4sIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPj4gbmFtZUJvdW5kUHJvdmlkZXJzSW52ZXJzZSkgeworCisgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFJhbmtlZFByb3ZpZGVyPFQ+LCBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4+IGZvdW5kQmluZGluZ3NNYXAgPSBuZXcgTXVsdGl2YWx1ZWRIYXNoTWFwPD4oKTsKKyAgICAgICAgZm9yIChmaW5hbCBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gbmFtZUJpbmRpbmcgOiBuYW1lQm91bmQuZ2V0TmFtZUJpbmRpbmdzKCkpIHsKKyAgICAgICAgICAgIGZpbmFsIEl0ZXJhYmxlPFJhbmtlZFByb3ZpZGVyPFQ+PiBwcm92aWRlcnMgPSBuYW1lQm91bmRQcm92aWRlcnMuZ2V0KG5hbWVCaW5kaW5nKTsKKyAgICAgICAgICAgIGlmIChwcm92aWRlcnMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoZmluYWwgUmFua2VkUHJvdmlkZXI8VD4gcHJvdmlkZXIgOiBwcm92aWRlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgZm91bmRCaW5kaW5nc01hcC5hZGQocHJvdmlkZXIsIG5hbWVCaW5kaW5nKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxSYW5rZWRQcm92aWRlcjxUPiwgTGlzdDxDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4+PiBlbnRyeSA6IGZvdW5kQmluZGluZ3NNYXAuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgZmluYWwgUmFua2VkUHJvdmlkZXI8VD4gcHJvdmlkZXIgPSBlbnRyeS5nZXRLZXkoKTsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8Q2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+PiBmb3VuZEJpbmRpbmdzID0gZW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8Q2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+PiBwcm92aWRlckJpbmRpbmdzID0gbmFtZUJvdW5kUHJvdmlkZXJzSW52ZXJzZS5nZXQocHJvdmlkZXIpOworICAgICAgICAgICAgaWYgKGZvdW5kQmluZGluZ3Muc2l6ZSgpID09IHByb3ZpZGVyQmluZGluZ3Muc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgdGFyZ2V0Q29sbGVjdGlvbi5hZGQocHJvdmlkZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFkZE5hbWVCb3VuZEZpbHRlcnNBbmRJbnRlcmNlcHRvcnMoCisgICAgICAgICAgICBmaW5hbCBQcm9jZXNzaW5nUHJvdmlkZXJzIHByb2Nlc3NpbmdQcm92aWRlcnMsCisgICAgICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPFJhbmtlZFByb3ZpZGVyPENvbnRhaW5lclJlcXVlc3RGaWx0ZXI+PiB0YXJnZXRSZXF1ZXN0RmlsdGVycywKKyAgICAgICAgICAgIGZpbmFsIENvbGxlY3Rpb248UmFua2VkUHJvdmlkZXI8Q29udGFpbmVyUmVzcG9uc2VGaWx0ZXI+PiB0YXJnZXRSZXNwb25zZUZpbHRlcnMsCisgICAgICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPFJhbmtlZFByb3ZpZGVyPFJlYWRlckludGVyY2VwdG9yPj4gdGFyZ2V0UmVhZGVySW50ZXJjZXB0b3JzLAorICAgICAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxSYW5rZWRQcm92aWRlcjxXcml0ZXJJbnRlcmNlcHRvcj4+IHRhcmdldFdyaXRlckludGVyY2VwdG9ycywKKyAgICAgICAgICAgIGZpbmFsIE5hbWVCb3VuZCBuYW1lQm91bmQKKyAgICApIHsKKyAgICAgICAgYWRkTmFtZUJvdW5kUHJvdmlkZXJzKHRhcmdldFJlcXVlc3RGaWx0ZXJzLCBuYW1lQm91bmQsIHByb2Nlc3NpbmdQcm92aWRlcnMuZ2V0TmFtZUJvdW5kUmVxdWVzdEZpbHRlcnMoKSwKKyAgICAgICAgICAgICAgICBwcm9jZXNzaW5nUHJvdmlkZXJzLmdldE5hbWVCb3VuZFJlcXVlc3RGaWx0ZXJzSW52ZXJzZSgpKTsKKyAgICAgICAgYWRkTmFtZUJvdW5kUHJvdmlkZXJzKHRhcmdldFJlc3BvbnNlRmlsdGVycywgbmFtZUJvdW5kLCBwcm9jZXNzaW5nUHJvdmlkZXJzLmdldE5hbWVCb3VuZFJlc3BvbnNlRmlsdGVycygpLAorICAgICAgICAgICAgICAgIHByb2Nlc3NpbmdQcm92aWRlcnMuZ2V0TmFtZUJvdW5kUmVzcG9uc2VGaWx0ZXJzSW52ZXJzZSgpKTsKKyAgICAgICAgYWRkTmFtZUJvdW5kUHJvdmlkZXJzKHRhcmdldFJlYWRlckludGVyY2VwdG9ycywgbmFtZUJvdW5kLCBwcm9jZXNzaW5nUHJvdmlkZXJzLmdldE5hbWVCb3VuZFJlYWRlckludGVyY2VwdG9ycygpLAorICAgICAgICAgICAgICAgIHByb2Nlc3NpbmdQcm92aWRlcnMuZ2V0TmFtZUJvdW5kUmVhZGVySW50ZXJjZXB0b3JzSW52ZXJzZSgpKTsKKyAgICAgICAgYWRkTmFtZUJvdW5kUHJvdmlkZXJzKHRhcmdldFdyaXRlckludGVyY2VwdG9ycywgbmFtZUJvdW5kLCBwcm9jZXNzaW5nUHJvdmlkZXJzLmdldE5hbWVCb3VuZFdyaXRlckludGVyY2VwdG9ycygpLAorICAgICAgICAgICAgICAgIHByb2Nlc3NpbmdQcm92aWRlcnMuZ2V0TmFtZUJvdW5kV3JpdGVySW50ZXJjZXB0b3JzSW52ZXJzZSgpKTsKKyAgICB9CisKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNZXRob2QgZ2V0UmVzb3VyY2VNZXRob2QoKSB7CisgICAgICAgIHJldHVybiByZXNvdXJjZU1ldGhvZDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0UmVzb3VyY2VDbGFzcygpIHsKKyAgICAgICAgcmV0dXJuIHJlc291cmNlQ2xhc3M7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIENvbnRhaW5lclJlc3BvbnNlIGFwcGx5KGZpbmFsIFJlcXVlc3RQcm9jZXNzaW5nQ29udGV4dCBwcm9jZXNzaW5nQ29udGV4dCkgeworICAgICAgICBmaW5hbCBDb250YWluZXJSZXF1ZXN0IHJlcXVlc3QgPSBwcm9jZXNzaW5nQ29udGV4dC5yZXF1ZXN0KCk7CisgICAgICAgIGZpbmFsIE9iamVjdCByZXNvdXJjZSA9IHByb2Nlc3NpbmdDb250ZXh0LnJvdXRpbmdDb250ZXh0KCkucGVla01hdGNoZWRSZXNvdXJjZSgpOworCisgICAgICAgIGlmIChtZXRob2QuaXNTdXNwZW5kRGVjbGFyZWQoKSB8fCBtZXRob2QuaXNNYW5hZ2VkQXN5bmNEZWNsYXJlZCgpIHx8IG1ldGhvZC5pc1NzZSgpKSB7CisgICAgICAgICAgICBpZiAoIXByb2Nlc3NpbmdDb250ZXh0LmFzeW5jQ29udGV4dCgpLnN1c3BlbmQoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX1NVU1BFTkRJTkdfQVNZTkNfUkVRVUVTVCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChtZXRob2QuaXNNYW5hZ2VkQXN5bmNEZWNsYXJlZCgpKSB7CisgICAgICAgICAgICBwcm9jZXNzaW5nQ29udGV4dC5hc3luY0NvbnRleHQoKS5pbnZva2VNYW5hZ2VkKCgpIC0+IHsKKyAgICAgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IGludm9rZShwcm9jZXNzaW5nQ29udGV4dCwgcmVzb3VyY2UpOworICAgICAgICAgICAgICAgIGlmIChtZXRob2QuaXNTdXNwZW5kRGVjbGFyZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAvLyB3ZSBpZ25vcmUgYW55IHJlc3BvbnNlIHJldHVybmVkIGZyb20gYSBtZXRob2QgdGhhdCBpbmplY3RzIEFzeW5jUmVzcG9uc2UKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIG51bGw7IC8vIHJldHVybiBudWxsIG9uIGN1cnJlbnQgdGhyZWFkCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUT0RPIHJlcGxhY2Ugd2l0aCBwcm9jZXNzaW5nIGNvbnRleHQgZmFjdG9yeSBtZXRob2QuCisgICAgICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IGludm9rZShwcm9jZXNzaW5nQ29udGV4dCwgcmVzb3VyY2UpOworCisgICAgICAgICAgICAvLyB3ZSBkb24ndCBjYXJlIGFib3V0IHRoZSByZXNwb25zZSB3aGVuIFNzZUV2ZW50U2luayBpcyBpbmplY3RlZCAtIGl0IHdpbGwgYmUgc2VudCBhc3luY2hyb25vdXNseS4KKyAgICAgICAgICAgIGlmIChtZXRob2QuaXNTc2UoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocmVzcG9uc2UuaGFzRW50aXR5KCkpIHsKKyAgICAgICAgICAgICAgICBPYmplY3QgZW50aXR5RnV0dXJlID0gcmVzcG9uc2UuZ2V0RW50aXR5KCk7CisgICAgICAgICAgICAgICAgaWYgKGVudGl0eUZ1dHVyZSBpbnN0YW5jZW9mIENvbXBsZXRpb25TdGFnZSkgeworICAgICAgICAgICAgICAgICAgICBDb21wbGV0aW9uU3RhZ2UgY29tcGxldGlvblN0YWdlID0gKChDb21wbGV0aW9uU3RhZ2UpIGVudGl0eUZ1dHVyZSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gc3VzcGVuZCAtIHdlIGtub3cgdGhhdCB0aGlzIGZlYXR1cmUgaXMgbm90IGRvbmUsIHNlZSBBYnN0cmFjdEphdmFSZXNvdXJjZU1ldGhvZERpc3BhdGNoZXIjaW52b2tlCisgICAgICAgICAgICAgICAgICAgIGlmICghcHJvY2Vzc2luZ0NvbnRleHQuYXN5bmNDb250ZXh0KCkuc3VzcGVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9TVVNQRU5ESU5HX0FTWU5DX1JFUVVFU1QoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGZvciBhIHJlc3BvbnNlCisgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25TdGFnZS53aGVuQ29tcGxldGUod2hlbkNvbXBsZXRlKHByb2Nlc3NpbmdDb250ZXh0KSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7IC8vIHJldHVybiBudWxsIG9uIHRoZSBjdXJyZW50IHRocmVhZAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ldyBDb250YWluZXJSZXNwb25zZShyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIEJpQ29uc3VtZXIgd2hlbkNvbXBsZXRlKFJlcXVlc3RQcm9jZXNzaW5nQ29udGV4dCBwcm9jZXNzaW5nQ29udGV4dCkgeworICAgICAgICByZXR1cm4gKGVudGl0eSwgZXhjZXB0aW9uKSAtPiB7CisKKyAgICAgICAgICAgIGlmIChleGNlcHRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChleGNlcHRpb24gaW5zdGFuY2VvZiBDYW5jZWxsYXRpb25FeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZ0NvbnRleHQuYXN5bmNDb250ZXh0KCkucmVzdW1lKFJlc3BvbnNlLnN0YXR1cyhSZXNwb25zZS5TdGF0dXMuU0VSVklDRV9VTkFWQUlMQUJMRSkuYnVpbGQoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZ0NvbnRleHQuYXN5bmNDb250ZXh0KCkucmVzdW1lKCgoVGhyb3dhYmxlKSBleGNlcHRpb24pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByb2Nlc3NpbmdDb250ZXh0LmFzeW5jQ29udGV4dCgpLnJlc3VtZShlbnRpdHkpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIHByaXZhdGUgUmVzcG9uc2UgaW52b2tlKGZpbmFsIFJlcXVlc3RQcm9jZXNzaW5nQ29udGV4dCBjb250ZXh0LCBmaW5hbCBPYmplY3QgcmVzb3VyY2UpIHsKKworICAgICAgICBSZXNwb25zZSBqYXhyc1Jlc3BvbnNlOworICAgICAgICBjb250ZXh0LnRyaWdnZXJFdmVudChSZXF1ZXN0RXZlbnQuVHlwZS5SRVNPVVJDRV9NRVRIT0RfU1RBUlQpOworCisgICAgICAgIGNvbnRleHQucHVzaChyZXNwb25zZSAtPiB7CisgICAgICAgICAgICAvLyBOZWVkIHRvIGNoZWNrIHdoZXRoZXIgdGhlIHJlc3BvbnNlIGlzIG51bGwgb3IgbWFwcGVkIGZyb20gZXhjZXB0aW9uLiBJbiB0aGVzZSBjYXNlcyB3ZSBkb24ndCB3YW50IHRvIG1vZGlmeQorICAgICAgICAgICAgLy8gcmVzcG9uc2Ugd2l0aCByZXNvdXJjZSBtZXRob2QgbWV0YWRhdGEuCisgICAgICAgICAgICBpZiAocmVzcG9uc2UgPT0gbnVsbAorICAgICAgICAgICAgICAgICAgICB8fCByZXNwb25zZS5pc01hcHBlZEZyb21FeGNlcHRpb24oKSkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGVudGl0eUFubiA9IHJlc3BvbnNlLmdldEVudGl0eUFubm90YXRpb25zKCk7CisgICAgICAgICAgICBpZiAobWV0aG9kQW5ub3RhdGlvbnMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgIGlmIChlbnRpdHlBbm4ubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0RW50aXR5QW5ub3RhdGlvbnMobWV0aG9kQW5ub3RhdGlvbnMpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBtZXJnZWRBbm4gPSBBcnJheXMuY29weU9mKG1ldGhvZEFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEFubm90YXRpb25zLmxlbmd0aCArIGVudGl0eUFubi5sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGVudGl0eUFubiwgMCwgbWVyZ2VkQW5uLCBtZXRob2RBbm5vdGF0aW9ucy5sZW5ndGgsIGVudGl0eUFubi5sZW5ndGgpOworICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRFbnRpdHlBbm5vdGF0aW9ucyhtZXJnZWRBbm4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNhblVzZUludm9jYWJsZVJlc3BvbnNlVHlwZQorICAgICAgICAgICAgICAgICAgICAmJiByZXNwb25zZS5oYXNFbnRpdHkoKQorICAgICAgICAgICAgICAgICAgICAmJiAhKHJlc3BvbnNlLmdldEVudGl0eVR5cGUoKSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRUeXBlKSkgeworICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldEVudGl0eVR5cGUoaW52b2NhYmxlUmVzcG9uc2VUeXBlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlOworICAgICAgICB9KTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgamF4cnNSZXNwb25zZSA9IGRpc3BhdGNoZXIuZGlzcGF0Y2gocmVzb3VyY2UsIGNvbnRleHQucmVxdWVzdCgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNvbnRleHQudHJpZ2dlckV2ZW50KFJlcXVlc3RFdmVudC5UeXBlLlJFU09VUkNFX01FVEhPRF9GSU5JU0hFRCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoamF4cnNSZXNwb25zZSA9PSBudWxsKSB7CisgICAgICAgICAgICBqYXhyc1Jlc3BvbnNlID0gUmVzcG9uc2Uubm9Db250ZW50KCkuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBqYXhyc1Jlc3BvbnNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhbGwgYm91bmQgcmVxdWVzdCBmaWx0ZXJzIGFwcGxpY2FibGUgdG8gdGhlIHtAbGluayAjZ2V0UmVzb3VyY2VNZXRob2QoKSByZXNvdXJjZSBtZXRob2R9CisgICAgICogd3JhcHBlZCBieSB0aGlzIGludm9rZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEFsbCBib3VuZCAoZHluYW1pY2FsbHkgb3IgYnkgbmFtZSkgcmVxdWVzdCBmaWx0ZXJzIGFwcGxpY2FibGUgdG8gdGhlIHtAbGluayAjZ2V0UmVzb3VyY2VNZXRob2QoKSByZXNvdXJjZQorICAgICAqIG1ldGhvZH0uCisgICAgICovCisgICAgcHVibGljIEl0ZXJhYmxlPFJhbmtlZFByb3ZpZGVyPENvbnRhaW5lclJlcXVlc3RGaWx0ZXI+PiBnZXRSZXF1ZXN0RmlsdGVycygpIHsKKyAgICAgICAgcmV0dXJuIHJlcXVlc3RGaWx0ZXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhbGwgYm91bmQgcmVzcG9uc2UgZmlsdGVycyBhcHBsaWNhYmxlIHRvIHRoZSB7QGxpbmsgI2dldFJlc291cmNlTWV0aG9kKCkgcmVzb3VyY2UgbWV0aG9kfQorICAgICAqIHdyYXBwZWQgYnkgdGhpcyBpbnZva2VyLgorICAgICAqCisgICAgICogQHJldHVybiBBbGwgYm91bmQgKGR5bmFtaWNhbGx5IG9yIGJ5IG5hbWUpIHJlc3BvbnNlIGZpbHRlcnMgYXBwbGljYWJsZSB0byB0aGUge0BsaW5rICNnZXRSZXNvdXJjZU1ldGhvZCgpIHJlc291cmNlCisgICAgICogbWV0aG9kfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlcmFibGU8UmFua2VkUHJvdmlkZXI8Q29udGFpbmVyUmVzcG9uc2VGaWx0ZXI+PiBnZXRSZXNwb25zZUZpbHRlcnMoKSB7CisgICAgICAgIHJldHVybiByZXNwb25zZUZpbHRlcnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGFsbCByZWFkZXIgaW50ZXJjZXB0b3JzIGFwcGxpY2FibGUgdG8gdGhlIHtAbGluayAjZ2V0UmVzb3VyY2VNZXRob2QoKSByZXNvdXJjZSBtZXRob2R9CisgICAgICogd3JhcHBlZCBieSB0aGlzIGludm9rZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEFsbCByZWFkZXIgaW50ZXJjZXB0b3JzIGFwcGxpY2FibGUgdG8gdGhlIHtAbGluayAjZ2V0UmVzb3VyY2VNZXRob2QoKSByZXNvdXJjZSBtZXRob2R9LgorICAgICAqLworICAgIHB1YmxpYyBJdGVyYWJsZTxXcml0ZXJJbnRlcmNlcHRvcj4gZ2V0V3JpdGVySW50ZXJjZXB0b3JzKCkgeworICAgICAgICByZXR1cm4gd3JpdGVySW50ZXJjZXB0b3JzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhbGwgd3JpdGVyIGludGVyY2VwdG9ycyBhcHBsaWNhYmxlIHRvIHRoZSB7QGxpbmsgI2dldFJlc291cmNlTWV0aG9kKCkgcmVzb3VyY2UgbWV0aG9kfQorICAgICAqIHdyYXBwZWQgYnkgdGhpcyBpbnZva2VyLgorICAgICAqCisgICAgICogQHJldHVybiBBbGwgd3JpdGVyIGludGVyY2VwdG9ycyBhcHBsaWNhYmxlIHRvIHRoZSB7QGxpbmsgI2dldFJlc291cmNlTWV0aG9kKCkgcmVzb3VyY2UgbWV0aG9kfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlcmFibGU8UmVhZGVySW50ZXJjZXB0b3I+IGdldFJlYWRlckludGVyY2VwdG9ycygpIHsKKyAgICAgICAgcmV0dXJuIHJlYWRlckludGVyY2VwdG9yczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gbWV0aG9kLmdldEludm9jYWJsZSgpLmdldEhhbmRsaW5nTWV0aG9kKCkudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9SZXNvdXJjZU1ldGhvZFZhbGlkYXRvci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvUmVzb3VyY2VNZXRob2RWYWxpZGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODM5ODJmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvUmVzb3VyY2VNZXRob2RWYWxpZGF0b3IuamF2YQpAQCAtMCwwICsxLDI5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWw7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5QYXJhbWV0ZXJpemVkVHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkJlYW5QYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Db29raWVQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Gb3JtUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuSGVhZGVyUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuSHR0cE1ldGhvZDsKK2ltcG9ydCBqYXZheC53cy5ycy5NYXRyaXhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLnNzZS5Tc2VFdmVudFNpbms7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5FcnJvcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuaW50ZXJuYWwuUGFyYW1ldGVyVmFsdWVIZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5pbnRlcm5hbC5WYWx1ZVBhcmFtUHJvdmlkZXI7CisKKy8qKgorICogVmFsaWRhdG9yIGNoZWNraW5nIHJlc291cmNlIG1ldGhvZHMgYW5kIHN1YiByZXNvdXJjZSBsb2NhdG9ycy4gVGhlIHZhbGlkYXRvciBtYWlubHkgY2hlY2tzIHRoZSBwYXJhbWV0ZXJzIG9mIHJlc291cmNlCisgKiBtZXRob2RzIGFuZCBzdWIgcmVzb3VyY2UgbG9jYXRvcnMuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitjbGFzcyBSZXNvdXJjZU1ldGhvZFZhbGlkYXRvciBleHRlbmRzIEFic3RyYWN0UmVzb3VyY2VNb2RlbFZpc2l0b3IgeworCisgICAgcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPFZhbHVlUGFyYW1Qcm92aWRlcj4gdmFsdWVQYXJhbVByb3ZpZGVyczsKKworICAgIFJlc291cmNlTWV0aG9kVmFsaWRhdG9yKENvbGxlY3Rpb248VmFsdWVQYXJhbVByb3ZpZGVyPiB2YWx1ZVBhcmFtUHJvdmlkZXJzKSB7CisgICAgICAgIHRoaXMudmFsdWVQYXJhbVByb3ZpZGVycyA9IHZhbHVlUGFyYW1Qcm92aWRlcnM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmlzaXRSZXNvdXJjZU1ldGhvZChmaW5hbCBSZXNvdXJjZU1ldGhvZCBtZXRob2QpIHsKKyAgICAgICAgc3dpdGNoIChtZXRob2QuZ2V0VHlwZSgpKSB7CisgICAgICAgICAgICBjYXNlIFJFU09VUkNFX01FVEhPRDoKKyAgICAgICAgICAgICAgICB2aXNpdEpheHJzUmVzb3VyY2VNZXRob2QobWV0aG9kKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1VCX1JFU09VUkNFX0xPQ0FUT1I6CisgICAgICAgICAgICAgICAgdmlzaXRTdWJSZXNvdXJjZUxvY2F0b3IobWV0aG9kKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZpc2l0SmF4cnNSZXNvdXJjZU1ldGhvZChSZXNvdXJjZU1ldGhvZCBtZXRob2QpIHsKKyAgICAgICAgY2hlY2tNZXRob2QobWV0aG9kKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tNZXRob2QoUmVzb3VyY2VNZXRob2QgbWV0aG9kKSB7CisgICAgICAgIGNoZWNrVmFsdWVQcm92aWRlcnMobWV0aG9kKTsKKyAgICAgICAgZmluYWwgSW52b2NhYmxlIGludm9jYWJsZSA9IG1ldGhvZC5nZXRJbnZvY2FibGUoKTsKKworICAgICAgICBjaGVja1BhcmFtZXRlcnMobWV0aG9kKTsKKworICAgICAgICBpZiAoIkdFVCIuZXF1YWxzKG1ldGhvZC5nZXRIdHRwTWV0aG9kKCkpKSB7CisgICAgICAgICAgICBmaW5hbCBsb25nIGV2ZW50U2lua0NvdW50ID0gaW52b2NhYmxlLmdldFBhcmFtZXRlcnMoKQorICAgICAgICAgICAgICAgICAgICAuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihwYXJhbWV0ZXIgLT4gU3NlRXZlbnRTaW5rLmNsYXNzLmVxdWFscyhwYXJhbWV0ZXIuZ2V0UmF3VHlwZSgpKSkKKyAgICAgICAgICAgICAgICAgICAgLmNvdW50KCk7CisKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNTc2UgPSBldmVudFNpbmtDb3VudCA+IDA7CisKKyAgICAgICAgICAgIGlmIChldmVudFNpbmtDb3VudCA+IDEpIHsKKyAgICAgICAgICAgICAgICBFcnJvcnMud2FybmluZyhtZXRob2QsIExvY2FsaXphdGlvbk1lc3NhZ2VzLk1VTFRJUExFX0VWRU5UX1NJTktfSU5KRUNUSU9OKGludm9jYWJsZS5nZXRIYW5kbGluZ01ldGhvZCgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBlbnN1cmUgR0VUIHJldHVybnMgbm9uLXZvaWQgdmFsdWUgaWYgbm90IHN1c3BlbmRhYmxlCisgICAgICAgICAgICBpZiAodm9pZC5jbGFzcyA9PSBpbnZvY2FibGUuZ2V0SGFuZGxpbmdNZXRob2QoKS5nZXRSZXR1cm5UeXBlKCkgJiYgIW1ldGhvZC5pc1N1c3BlbmREZWNsYXJlZCgpICYmICFpc1NzZSkgeworICAgICAgICAgICAgICAgIEVycm9ycy5oaW50KG1ldGhvZCwgTG9jYWxpemF0aW9uTWVzc2FnZXMuR0VUX1JFVFVSTlNfVk9JRChpbnZvY2FibGUuZ2V0SGFuZGxpbmdNZXRob2QoKSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBlbnN1cmUgR0VUIGRvZXMgbm90IGNvbnN1bWUgYW4gZW50aXR5IHBhcmFtZXRlciwgaWYgbm90IGluZmxlY3Rvci1iYXNlZAorICAgICAgICAgICAgaWYgKGludm9jYWJsZS5yZXF1aXJlc0VudGl0eSgpICYmICFpbnZvY2FibGUuaXNJbmZsZWN0b3IoKSkgeworICAgICAgICAgICAgICAgIEVycm9ycy53YXJuaW5nKG1ldGhvZCwgTG9jYWxpemF0aW9uTWVzc2FnZXMuR0VUX0NPTlNVTUVTX0VOVElUWShpbnZvY2FibGUuZ2V0SGFuZGxpbmdNZXRob2QoKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gZW5zdXJlIEdFVCBkb2VzIG5vdCBjb25zdW1lIGFueSBARm9ybVBhcmFtIGFubm90YXRlZCBwYXJhbWV0ZXIKKyAgICAgICAgICAgIGZvciAoUGFyYW1ldGVyIHAgOiBpbnZvY2FibGUuZ2V0UGFyYW1ldGVycygpKSB7CisgICAgICAgICAgICAgICAgaWYgKHAuaXNBbm5vdGF0aW9uUHJlc2VudChGb3JtUGFyYW0uY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgICAgIEVycm9ycy5mYXRhbChtZXRob2QsIExvY2FsaXphdGlvbk1lc3NhZ2VzLkdFVF9DT05TVU1FU19GT1JNX1BBUkFNKGludm9jYWJsZS5nZXRIYW5kbGluZ01ldGhvZCgpKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGlzU3NlICYmIHZvaWQuY2xhc3MgIT0gaW52b2NhYmxlLmdldEhhbmRsaW5nTWV0aG9kKCkuZ2V0UmV0dXJuVHlwZSgpKSB7CisgICAgICAgICAgICAgICAgRXJyb3JzLmZhdGFsKG1ldGhvZCwgTG9jYWxpemF0aW9uTWVzc2FnZXMuRVZFTlRfU0lOS19SRVRVUk5TX1RZUEUoaW52b2NhYmxlLmdldEhhbmRsaW5nTWV0aG9kKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGVuc3VyZSB0aGVyZSBpcyBub3QgbXVsdGlwbGUgSFRUUCBtZXRob2QgZGVzaWduYXRvcnMgc3BlY2lmaWVkIG9uIHRoZSBtZXRob2QKKyAgICAgICAgTGlzdDxTdHJpbmc+IGh0dHBNZXRob2RBbm5vdGF0aW9ucyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICAgICAgZm9yIChBbm5vdGF0aW9uIGEgOiBpbnZvY2FibGUuZ2V0SGFuZGxpbmdNZXRob2QoKS5nZXREZWNsYXJlZEFubm90YXRpb25zKCkpIHsKKyAgICAgICAgICAgIGlmIChudWxsICE9IGEuYW5ub3RhdGlvblR5cGUoKS5nZXRBbm5vdGF0aW9uKEh0dHBNZXRob2QuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgaHR0cE1ldGhvZEFubm90YXRpb25zLmFkZChhLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGh0dHBNZXRob2RBbm5vdGF0aW9ucy5zaXplKCkgPiAxKSB7CisgICAgICAgICAgICBFcnJvcnMuZmF0YWwobWV0aG9kLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5NVUxUSVBMRV9IVFRQX01FVEhPRF9ERVNJR05BVE9SUyhpbnZvY2FibGUuZ2V0SGFuZGxpbmdNZXRob2QoKSwKKyAgICAgICAgICAgICAgICAgICAgaHR0cE1ldGhvZEFubm90YXRpb25zLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFR5cGUgcmVzcG9uc2VUeXBlID0gaW52b2NhYmxlLmdldFJlc3BvbnNlVHlwZSgpOworICAgICAgICBpZiAoIWlzQ29uY3JldGVUeXBlKHJlc3BvbnNlVHlwZSkpIHsKKyAgICAgICAgICAgIEVycm9ycy53YXJuaW5nKGludm9jYWJsZS5nZXRIYW5kbGluZ01ldGhvZCgpLAorICAgICAgICAgICAgICAgICAgICBMb2NhbGl6YXRpb25NZXNzYWdlcy5UWVBFX09GX01FVEhPRF9OT1RfUkVTT0xWQUJMRV9UT19DT05DUkVURV9UWVBFKHJlc3BvbnNlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZvY2FibGUuZ2V0SGFuZGxpbmdNZXRob2QoKS50b0dlbmVyaWNTdHJpbmcoKSkpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgUGF0aCBwYXRoQW5ub3RhdGlvbiA9IGludm9jYWJsZS5nZXRIYW5kbGluZ01ldGhvZCgpLmdldEFubm90YXRpb24oUGF0aC5jbGFzcyk7CisgICAgICAgIGlmIChwYXRoQW5ub3RhdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGF0aCA9IHBhdGhBbm5vdGF0aW9uLnZhbHVlKCk7CisgICAgICAgICAgICBpZiAocGF0aCA9PSBudWxsIHx8IHBhdGguaXNFbXB0eSgpIHx8ICIvIi5lcXVhbHMocGF0aCkpIHsKKworICAgICAgICAgICAgICAgIEVycm9ycy53YXJuaW5nKGludm9jYWJsZS5nZXRIYW5kbGluZ01ldGhvZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxpemF0aW9uTWVzc2FnZXMuTUVUSE9EX0VNUFRZX1BBVEhfQU5OT1RBVElPTigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52b2NhYmxlLmdldEhhbmRsaW5nTWV0aG9kKCkuZ2V0TmFtZSgpLCBpbnZvY2FibGUuZ2V0SGFuZGxlcigpLmdldEhhbmRsZXJDbGFzcygpLmdldE5hbWUoKSkpOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBQcmV2ZW50IFBBUkFNX0FOTk9UQVRJT05fU0VUIGFubm90YXRpb25zIG9uIGEgcmVzb3VyY2UgbWV0aG9kCisgICAgICAgIGlmIChodHRwTWV0aG9kQW5ub3RhdGlvbnMuc2l6ZSgpICE9IDApIHsKKyAgICAgICAgICAgIGNoZWNrVW5leHBlY3RlZEFubm90YXRpb25zKG1ldGhvZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tVbmV4cGVjdGVkQW5ub3RhdGlvbnMoUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QpIHsKKyAgICAgICAgSW52b2NhYmxlIGludm9jYWJsZSA9IHJlc291cmNlTWV0aG9kLmdldEludm9jYWJsZSgpOworICAgICAgICBmb3IgKEFubm90YXRpb24gYW5ub3RhdGlvbiA6IGludm9jYWJsZS5nZXRIYW5kbGluZ01ldGhvZCgpLmdldERlY2xhcmVkQW5ub3RhdGlvbnMoKSkgeworICAgICAgICAgICAgaWYgKFBBUkFNX0FOTk9UQVRJT05fU0VULmNvbnRhaW5zKGFubm90YXRpb24uYW5ub3RhdGlvblR5cGUoKSkpIHsKKyAgICAgICAgICAgICAgICBFcnJvcnMuZmF0YWwocmVzb3VyY2VNZXRob2QsIExvY2FsaXphdGlvbk1lc3NhZ2VzLk1FVEhPRF9VTkVYUEVDVEVEX0FOTk9UQVRJT04oCisgICAgICAgICAgICAgICAgICAgICAgICBpbnZvY2FibGUuZ2V0SGFuZGxpbmdNZXRob2QoKS5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICBpbnZvY2FibGUuZ2V0SGFuZGxlcigpLmdldEhhbmRsZXJDbGFzcygpLmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb24uYW5ub3RhdGlvblR5cGUoKS5nZXROYW1lKCkpCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja1ZhbHVlUHJvdmlkZXJzKFJlc291cmNlTWV0aG9kIG1ldGhvZCkgeworICAgICAgICBMaXN0PD8gZXh0ZW5kcyBGdW5jdGlvbjxDb250YWluZXJSZXF1ZXN0LCA/Pj4gdmFsdWVQcm92aWRlcnMgPQorICAgICAgICAgICAgICAgIFBhcmFtZXRlclZhbHVlSGVscGVyLmNyZWF0ZVZhbHVlUHJvdmlkZXJzKHZhbHVlUGFyYW1Qcm92aWRlcnMsIG1ldGhvZC5nZXRJbnZvY2FibGUoKSk7CisgICAgICAgIGlmICh2YWx1ZVByb3ZpZGVycy5jb250YWlucyhudWxsKSkgeworICAgICAgICAgICAgaW50IGluZGV4ID0gdmFsdWVQcm92aWRlcnMuaW5kZXhPZihudWxsKTsKKyAgICAgICAgICAgIEVycm9ycy5mYXRhbChtZXRob2QsIExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX1BBUkFNRVRFUl9NSVNTSU5HX1ZBTFVFX1BST1ZJREVSKGluZGV4LCBtZXRob2QuZ2V0SW52b2NhYmxlKCkKKyAgICAgICAgICAgICAgICAgICAgLmdldEhhbmRsaW5nTWV0aG9kKCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB2aXNpdFN1YlJlc291cmNlTG9jYXRvcihSZXNvdXJjZU1ldGhvZCBsb2NhdG9yKSB7CisgICAgICAgIGNoZWNrUGFyYW1ldGVycyhsb2NhdG9yKTsKKyAgICAgICAgY2hlY2tWYWx1ZVByb3ZpZGVycyhsb2NhdG9yKTsKKworICAgICAgICBmaW5hbCBJbnZvY2FibGUgaW52b2NhYmxlID0gbG9jYXRvci5nZXRJbnZvY2FibGUoKTsKKyAgICAgICAgaWYgKHZvaWQuY2xhc3MgPT0gaW52b2NhYmxlLmdldFJhd1Jlc3BvbnNlVHlwZSgpKSB7CisgICAgICAgICAgICBFcnJvcnMuZmF0YWwobG9jYXRvciwgTG9jYWxpemF0aW9uTWVzc2FnZXMuU1VCUkVTX0xPQ19SRVRVUk5TX1ZPSUQoaW52b2NhYmxlLmdldEhhbmRsaW5nTWV0aG9kKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFByZXZlbnQgUEFSQU1fQU5OT1RBVElPTl9TRVQgYW5ub3RhdGlvbnMgb24gYSByZXNvdXJjZSBsb2NhdG9yCisgICAgICAgIGlmIChpbnZvY2FibGUuZ2V0SGFuZGxpbmdNZXRob2QoKS5nZXRBbm5vdGF0aW9uKFBhdGguY2xhc3MpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNoZWNrVW5leHBlY3RlZEFubm90YXRpb25zKGxvY2F0b3IpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrUGFyYW1ldGVycyhSZXNvdXJjZU1ldGhvZCBtZXRob2QpIHsKKyAgICAgICAgZmluYWwgSW52b2NhYmxlIGludm9jYWJsZSA9IG1ldGhvZC5nZXRJbnZvY2FibGUoKTsKKyAgICAgICAgZmluYWwgTWV0aG9kIGhhbmRsaW5nTWV0aG9kID0gaW52b2NhYmxlLmdldEhhbmRsaW5nTWV0aG9kKCk7CisgICAgICAgIGludCBwYXJhbUNvdW50ID0gMDsKKyAgICAgICAgaW50IG5vbkFubm90YXRlZFBhcmFtZXRlcnMgPSAwOworCisgICAgICAgIGZvciAoUGFyYW1ldGVyIHAgOiBpbnZvY2FibGUuZ2V0UGFyYW1ldGVycygpKSB7CisgICAgICAgICAgICB2YWxpZGF0ZVBhcmFtZXRlcihwLCBoYW5kbGluZ01ldGhvZCwgaGFuZGxpbmdNZXRob2QudG9HZW5lcmljU3RyaW5nKCksIEludGVnZXIudG9TdHJpbmcoKytwYXJhbUNvdW50KSwgZmFsc2UpOworICAgICAgICAgICAgaWYgKG1ldGhvZC5nZXRUeXBlKCkgPT0gUmVzb3VyY2VNZXRob2QuSmF4cnNUeXBlLlNVQl9SRVNPVVJDRV9MT0NBVE9SCisgICAgICAgICAgICAgICAgICAgICYmIFBhcmFtZXRlci5Tb3VyY2UuRU5USVRZID09IHAuZ2V0U291cmNlKCkpIHsKKyAgICAgICAgICAgICAgICBFcnJvcnMuZmF0YWwobWV0aG9kLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5TVUJSRVNfTE9DX0hBU19FTlRJVFlfUEFSQU0oaW52b2NhYmxlLmdldEhhbmRsaW5nTWV0aG9kKCkpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocC5nZXRBbm5vdGF0aW9ucygpLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgbm9uQW5ub3RhdGVkUGFyYW1ldGVycysrOworICAgICAgICAgICAgICAgIGlmIChub25Bbm5vdGF0ZWRQYXJhbWV0ZXJzID4gMSkgeworICAgICAgICAgICAgICAgICAgICBFcnJvcnMuZmF0YWwobWV0aG9kLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5BTUJJR1VPVVNfTk9OX0FOTk9UQVRFRF9QQVJBTUVURVIoaW52b2NhYmxlLmdldEhhbmRsaW5nTWV0aG9kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52b2NhYmxlLmdldEhhbmRsaW5nTWV0aG9kKCkuZ2V0RGVjbGFyaW5nQ2xhc3MoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc1NzZUluamVjdGVkKGZpbmFsIEludm9jYWJsZSBpbnZvY2FibGUpIHsKKyAgICAgICAgcmV0dXJuIGludm9jYWJsZS5nZXRQYXJhbWV0ZXJzKCkuc3RyZWFtKCkuYW55TWF0Y2gocGFyYW1ldGVyIC0+IFNzZUV2ZW50U2luay5jbGFzcy5lcXVhbHMocGFyYW1ldGVyLmdldFJhd1R5cGUoKSkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxDbGFzcz4gUEFSQU1fQU5OT1RBVElPTl9TRVQgPSBjcmVhdGVQYXJhbUFubm90YXRpb25TZXQoKTsKKworICAgIHByaXZhdGUgc3RhdGljIFNldDxDbGFzcz4gY3JlYXRlUGFyYW1Bbm5vdGF0aW9uU2V0KCkgeworICAgICAgICBTZXQ8Q2xhc3M+IHNldCA9IG5ldyBIYXNoU2V0PD4oNik7CisgICAgICAgIHNldC5hZGQoSGVhZGVyUGFyYW0uY2xhc3MpOworICAgICAgICBzZXQuYWRkKENvb2tpZVBhcmFtLmNsYXNzKTsKKyAgICAgICAgc2V0LmFkZChNYXRyaXhQYXJhbS5jbGFzcyk7CisgICAgICAgIHNldC5hZGQoUXVlcnlQYXJhbS5jbGFzcyk7CisgICAgICAgIHNldC5hZGQoUGF0aFBhcmFtLmNsYXNzKTsKKyAgICAgICAgc2V0LmFkZChCZWFuUGFyYW0uY2xhc3MpOworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KHNldCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmFsaWRhdGUgYSBzaW5nbGUgcGFyYW1ldGVyIGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmFtZXRlciAgICAgICAgICAgICBwYXJhbWV0ZXIgdG8gYmUgdmFsaWRhdGVkLgorICAgICAqIEBwYXJhbSBzb3VyY2UgICAgICAgICAgICAgICAgcGFyYW1ldGVyIHNvdXJjZTsgdXNlZCBmb3IgaXNzdWUgcmVwb3J0aW5nLgorICAgICAqIEBwYXJhbSByZXBvcnRlZFNvdXJjZU5hbWUgICAgc291cmNlIG5hbWU7IHVzZWQgZm9yIGlzc3VlIHJlcG9ydGluZy4KKyAgICAgKiBAcGFyYW0gcmVwb3J0ZWRQYXJhbWV0ZXJOYW1lIHBhcmFtZXRlciBuYW1lOyB1c2VkIGZvciBpc3N1ZSByZXBvcnRpbmcuCisgICAgICogQHBhcmFtIGluamVjdGlvbnNGb3JiaWRkZW4gICB7QGNvZGUgdHJ1ZX0gaWYgcGFyYW1ldGVycyBjYW5ub3QgYmUgaW5qZWN0ZWQgYnkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciBhbm5vdGF0aW9ucywgZWcuIHtAbGluayBIZWFkZXJQYXJhbSBASGVhZGVyUGFyYW19LgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIHZhbGlkYXRlUGFyYW1ldGVyKGZpbmFsIFBhcmFtZXRlciBwYXJhbWV0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVwb3J0ZWRTb3VyY2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZXBvcnRlZFBhcmFtZXRlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpbmplY3Rpb25zRm9yYmlkZGVuKSB7CisgICAgICAgIEVycm9ycy5wcm9jZXNzV2l0aEV4Y2VwdGlvbihuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBpbnQgY291bnRlciA9IDA7CisgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zID0gcGFyYW1ldGVyLmdldEFubm90YXRpb25zKCk7CisgICAgICAgICAgICAgICAgZm9yIChBbm5vdGF0aW9uIGEgOiBhbm5vdGF0aW9ucykgeworICAgICAgICAgICAgICAgICAgICBpZiAoUEFSQU1fQU5OT1RBVElPTl9TRVQuY29udGFpbnMoYS5hbm5vdGF0aW9uVHlwZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluamVjdGlvbnNGb3JiaWRkZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvcnMuZmF0YWwoc291cmNlLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5TSU5HTEVUT05fSU5KRUNUU19QQVJBTUVURVIocmVwb3J0ZWRTb3VyY2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZWRQYXJhbWV0ZXJOYW1lKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBjb3VudGVyKys7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY291bnRlciA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvcnMud2FybmluZyhzb3VyY2UsIExvY2FsaXphdGlvbk1lc3NhZ2VzLkFNQklHVU9VU19QQVJBTUVURVIocmVwb3J0ZWRTb3VyY2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0ZWRQYXJhbWV0ZXJOYW1lKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIHBhcmFtVHlwZSA9IHBhcmFtZXRlci5nZXRUeXBlKCk7CisgICAgICAgICAgICAgICAgaWYgKCFpc0NvbmNyZXRlVHlwZShwYXJhbVR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIEVycm9ycy53YXJuaW5nKHNvdXJjZSwgTG9jYWxpemF0aW9uTWVzc2FnZXMuUEFSQU1FVEVSX1VOUkVTT0xWQUJMRShyZXBvcnRlZFBhcmFtZXRlck5hbWUsIHBhcmFtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRlZFNvdXJjZU5hbWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJDaGFpbk9mSW5zdGFuY2VvZkNoZWNrcyIpCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0NvbmNyZXRlVHlwZShUeXBlIHQpIHsKKyAgICAgICAgaWYgKHQgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIGlzQ29uY3JldGVQYXJhbWV0ZXJpemVkVHlwZSgoUGFyYW1ldGVyaXplZFR5cGUpIHQpOworICAgICAgICB9IGVsc2UgaWYgKCEodCBpbnN0YW5jZW9mIENsYXNzKSkgeworICAgICAgICAgICAgLy8gR2VuZXJpY0FycmF5VHlwZSwgV2lsZGNhcmRUeXBlLCBUeXBlVmFyaWFibGUKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNDb25jcmV0ZVBhcmFtZXRlcml6ZWRUeXBlKFBhcmFtZXRlcml6ZWRUeXBlIHB0KSB7CisgICAgICAgIGJvb2xlYW4gaXNDb25jcmV0ZSA9IHRydWU7CisgICAgICAgIGZvciAoVHlwZSB0IDogcHQuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpKSB7CisgICAgICAgICAgICBpc0NvbmNyZXRlICY9IGlzQ29uY3JldGVUeXBlKHQpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGlzQ29uY3JldGU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvUmVzb3VyY2VNb2RlbC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvUmVzb3VyY2VNb2RlbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllNjY1YmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9SZXNvdXJjZU1vZGVsLmphdmEKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLklkZW50aXR5SGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uVmFsdWU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLlZhbHVlczsKKworLyoqCisgKiBSZXNvdXJjZSBtb2RlbCBvZiB0aGUgZGVwbG95ZWQgYXBwbGljYXRpb24gd2hpY2ggY29udGFpbnMgc2V0IG9mIHJvb3QgcmVzb3VyY2VzLiBBcyBpdCBpbXBsZW1lbnRzIHtAbGluaworICogUmVzb3VyY2VNb2RlbENvbXBvbmVudH0gaXQgY2FuIGJlIHZhbGlkYXRlZCBieSB7QGxpbmsgQ29tcG9uZW50TW9kZWxWYWxpZGF0b3IgY29tcG9uZW50IG1vZGVsIHZhbGlkYXRvcn0gd2hpY2ggd2lsbCBwZXJmb3JtCisgKiB2YWxpZGF0aW9uIG9mIHRoZSBlbnRpcmUgcmVzb3VyY2UgbW9kZWwgaW5jbHVkaW5nIGFsbCBzdWIgY29tcG9uZW50cyAoe0BsaW5rIFJlc291cmNlIHJlc291cmNlc30sCisgKiB7QGxpbmsgUmVzb3VyY2VNZXRob2QgcmVzb3VyY2UgbWV0aG9kc30gLi4uKS4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNvdXJjZU1vZGVsIGltcGxlbWVudHMgUmVzb3VyY2VNb2RlbENvbXBvbmVudCB7CisKKyAgICAvKioKKyAgICAgKiBCdWlsZGVyIHVzZWQgdG8gY3JlYXRlIHtAbGluayBSZXNvdXJjZU1vZGVsIHJlc291cmNlIG1vZGVsfSBpbnN0YW5jZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFJlc291cmNlPiByZXNvdXJjZXM7CisgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBzdWJSZXNvdXJjZU1vZGVsOworCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBuZXcgYnVpbGRlciBwcmUgaW5pdGlhbGl6ZWQgd2l0aCB7QGNvZGUgcmVzb3VyY2VNb2RlbH0uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSByZXNvdXJjZU1vZGVsICAgIFJlc291cmNlIG1vZGVsLgorICAgICAgICAgKiBAcGFyYW0gc3ViUmVzb3VyY2VNb2RlbCB7QGNvZGUgdHJ1ZX0gaWYgcmVzb3VyY2UgbW9kZWwgY3JlYXRlZCBieSB0aGlzIGJ1aWxkZXIgd2lsbCBiZSBzdWIgcmVzb3VyY2UgbW9kZWwsCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHtAY29kZSBmYWxzZX0gaWYgaXQgaXMgYSBhcHBsaWNhdGlvbiByb290IHJlc291cmNlIG1vZGVsLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIoUmVzb3VyY2VNb2RlbCByZXNvdXJjZU1vZGVsLCBib29sZWFuIHN1YlJlc291cmNlTW9kZWwpIHsKKyAgICAgICAgICAgIHRoaXMucmVzb3VyY2VzID0gcmVzb3VyY2VNb2RlbC5nZXRSZXNvdXJjZXMoKTsKKyAgICAgICAgICAgIHRoaXMuc3ViUmVzb3VyY2VNb2RlbCA9IHN1YlJlc291cmNlTW9kZWw7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIG5ldyBidWlsZGVyIHByZSBpbml0aWFsaXplZCB3aXRoIHtAY29kZSByZXNvdXJjZX0uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSByZXNvdXJjZXMgICAgICAgIFJlc291cmNlcyAocm9vdCBhbmQgbm9uIHJvb3QpLgorICAgICAgICAgKiBAcGFyYW0gc3ViUmVzb3VyY2VNb2RlbCB7QGNvZGUgdHJ1ZX0gaWYgcmVzb3VyY2UgbW9kZWwgY3JlYXRlZCBieSB0aGlzIGJ1aWxkZXIgd2lsbCBiZSBzdWIgcmVzb3VyY2UgbW9kZWwsCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHtAY29kZSBmYWxzZX0gaWYgaXQgaXMgYSBhcHBsaWNhdGlvbiByb290IHJlc291cmNlIG1vZGVsLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIoTGlzdDxSZXNvdXJjZT4gcmVzb3VyY2VzLCBib29sZWFuIHN1YlJlc291cmNlTW9kZWwpIHsKKyAgICAgICAgICAgIHRoaXMucmVzb3VyY2VzID0gcmVzb3VyY2VzOworICAgICAgICAgICAgdGhpcy5zdWJSZXNvdXJjZU1vZGVsID0gc3ViUmVzb3VyY2VNb2RlbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgbmV3IGJ1aWxkZXIgd2l0aCBlbXB0eSByZXNvdXJjZXMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzdWJSZXNvdXJjZU1vZGVsIHtAY29kZSB0cnVlfSBpZiByZXNvdXJjZSBtb2RlbCBjcmVhdGVkIGJ5IHRoaXMgYnVpbGRlciB3aWxsIGJlIHN1YiByZXNvdXJjZSBtb2RlbCwKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIGZhbHNlfSBpZiBpdCBpcyBhIGFwcGxpY2F0aW9uIHJvb3QgcmVzb3VyY2UgbW9kZWwuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlcihib29sZWFuIHN1YlJlc291cmNlTW9kZWwpIHsKKyAgICAgICAgICAgIHRoaXMucmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICB0aGlzLnN1YlJlc291cmNlTW9kZWwgPSBzdWJSZXNvdXJjZU1vZGVsOworICAgICAgICB9CisKKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIGEgcmVzb3VyY2UgdG8gdGhlIGJ1aWxkZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSByZXNvdXJjZSBSZXNvdXJjZSB0byBiZSBhZGRlZCB0byB0aGUgYnVpbGRlciAocm9vdCBvciBub24gcm9vdCByZXNvdXJjZSkuCisgICAgICAgICAqIEByZXR1cm4gQ3VycmVudCBidWlsZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkUmVzb3VyY2UoUmVzb3VyY2UgcmVzb3VyY2UpIHsKKyAgICAgICAgICAgIHRoaXMucmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBCdWlsZCB0aGUge0BsaW5rIFJlc291cmNlTW9kZWwgcmVzb3VyY2UgbW9kZWx9LiBSZXNvdXJjZXMgd2l0aCB0aGUgc2FtZSBwYXRoIGFyZSBtZXJnZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gUmVzb3VyY2UgbW9kZWwuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgUmVzb3VyY2VNb2RlbCBidWlsZCgpIHsKKyAgICAgICAgICAgIE1hcDxTdHJpbmcsIFJlc291cmNlPiByZXNvdXJjZU1hcCA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKKyAgICAgICAgICAgIC8vIHJlc291cmNlIHdpdGggbm8gcGF0aCB0aGF0IHNob3VsZCBub3QgYmUgbWVyZ2VkCisgICAgICAgICAgICBmaW5hbCBTZXQ8UmVzb3VyY2U+IHNlcGFyYXRlUmVzb3VyY2VzID0gQ29sbGVjdGlvbnMubmV3U2V0RnJvbU1hcChuZXcgSWRlbnRpdHlIYXNoTWFwPD4oKSk7CisKKyAgICAgICAgICAgIGZvciAoUmVzb3VyY2UgcmVzb3VyY2UgOiByZXNvdXJjZXMpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGF0aCA9IHJlc291cmNlLmdldFBhdGgoKTsKKyAgICAgICAgICAgICAgICBpZiAocGF0aCA9PSBudWxsICYmICFzdWJSZXNvdXJjZU1vZGVsKSB7CisgICAgICAgICAgICAgICAgICAgIHNlcGFyYXRlUmVzb3VyY2VzLmFkZChyZXNvdXJjZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVzb3VyY2UgZnJvbU1hcCA9IHJlc291cmNlTWFwLmdldChwYXRoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZyb21NYXAgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VNYXAucHV0KHBhdGgsIHJlc291cmNlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlTWFwLnB1dChwYXRoLCBSZXNvdXJjZS5idWlsZGVyKGZyb21NYXApLm1lcmdlV2l0aChyZXNvdXJjZSkuYnVpbGQoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMaXN0PFJlc291cmNlPiByb290UmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICBMaXN0PFJlc291cmNlPiBhbGxSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgICAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBSZXNvdXJjZT4gZW50cnkgOiByZXNvdXJjZU1hcC5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmdldEtleSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcm9vdFJlc291cmNlcy5hZGQoZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFsbFJlc291cmNlcy5hZGQoZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXN1YlJlc291cmNlTW9kZWwpIHsKKyAgICAgICAgICAgICAgICBhbGxSZXNvdXJjZXMuYWRkQWxsKHNlcGFyYXRlUmVzb3VyY2VzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZU1vZGVsKHJvb3RSZXNvdXJjZXMsIGFsbFJlc291cmNlcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8UmVzb3VyY2U+IHJvb3RSZXNvdXJjZXM7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFJlc291cmNlPiByZXNvdXJjZXM7CisKKyAgICBwcml2YXRlIGZpbmFsIFZhbHVlPFJ1bnRpbWVSZXNvdXJjZU1vZGVsPiBydW50aW1lUm9vdFJlc291cmNlTW9kZWxWYWx1ZTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgbmV3IGluc3RhbmNlIGZyb20gcm9vdCBhbGxSZXNvdXJjZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWxsUmVzb3VyY2VzIFJvb3QgcmVzb3VyY2Ugb2YgdGhlIHJlc291cmNlIG1vZGVsLgorICAgICAqLworICAgIHByaXZhdGUgUmVzb3VyY2VNb2RlbChMaXN0PFJlc291cmNlPiByb290UmVzb3VyY2VzLCBMaXN0PFJlc291cmNlPiBhbGxSZXNvdXJjZXMpIHsKKyAgICAgICAgdGhpcy5yZXNvdXJjZXMgPSBhbGxSZXNvdXJjZXM7CisgICAgICAgIHRoaXMucm9vdFJlc291cmNlcyA9IHJvb3RSZXNvdXJjZXM7CisgICAgICAgIHRoaXMucnVudGltZVJvb3RSZXNvdXJjZU1vZGVsVmFsdWUgPSBWYWx1ZXMubGF6eShuZXcgVmFsdWU8UnVudGltZVJlc291cmNlTW9kZWw+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgUnVudGltZVJlc291cmNlTW9kZWwgZ2V0KCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUnVudGltZVJlc291cmNlTW9kZWwoUmVzb3VyY2VNb2RlbC50aGlzLnJlc291cmNlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworCisgICAgLyoqCisgICAgICogUmV0dXJuIHJvb3QgcmVzb3VyY2VzIGZyb20gdGhpcyByZXNvdXJjZSBtb2RlbC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTGlzdCBvZiByb290IHJlc291cmNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxSZXNvdXJjZT4gZ2V0Um9vdFJlc291cmNlcygpIHsKKyAgICAgICAgcmV0dXJuIHJvb3RSZXNvdXJjZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGFsbCByZXNvdXJjZXMgZnJvbSB0aGlzIHJlc291cmNlIG1vZGVsLgorICAgICAqCisgICAgICogQHJldHVybiBMaXN0IG9mIGFsbCByZXNvdXJjZXMgKHJvb3QgYW5kIG5vbiByb290IHJlc291cmNlcykuCisgICAgICovCisgICAgcHVibGljIExpc3Q8UmVzb3VyY2U+IGdldFJlc291cmNlcygpIHsKKyAgICAgICAgcmV0dXJuIHJlc291cmNlczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhY2NlcHQoUmVzb3VyY2VNb2RlbFZpc2l0b3IgdmlzaXRvcikgeworICAgICAgICB2aXNpdG9yLnZpc2l0UmVzb3VyY2VNb2RlbCh0aGlzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDw/IGV4dGVuZHMgUmVzb3VyY2VNb2RlbENvbXBvbmVudD4gZ2V0Q29tcG9uZW50cygpIHsKKyAgICAgICAgTGlzdDxSZXNvdXJjZU1vZGVsQ29tcG9uZW50PiBjb21wb25lbnRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICAgICAgY29tcG9uZW50cy5hZGRBbGwocmVzb3VyY2VzKTsKKyAgICAgICAgY29tcG9uZW50cy5hZGRBbGwoZ2V0UnVudGltZVJlc291cmNlTW9kZWwoKS5nZXRSdW50aW1lUmVzb3VyY2VzKCkpOworICAgICAgICByZXR1cm4gY29tcG9uZW50czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4ge0BsaW5rIFJ1bnRpbWVSZXNvdXJjZU1vZGVsIHJ1bnRpbWUgcmVzb3VyY2UgbW9kZWx9IGJhc2VkIG9uIHRoaXMgdGhpcyByZXNvdXJjZSBtb2RlbC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gUnVudGltZSByZXNvdXJjZSBtb2RlbCBjcmVhdGVkIGZyb20gdGhpcyByZXNvdXJjZSBtb2RlbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUnVudGltZVJlc291cmNlTW9kZWwgZ2V0UnVudGltZVJlc291cmNlTW9kZWwoKSB7CisgICAgICAgIHJldHVybiBydW50aW1lUm9vdFJlc291cmNlTW9kZWxWYWx1ZS5nZXQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9SZXNvdXJjZU1vZGVsQ29tcG9uZW50LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9SZXNvdXJjZU1vZGVsQ29tcG9uZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU3ZDU5MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL1Jlc291cmNlTW9kZWxDb21wb25lbnQuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIE1hcmtlciBpbnRlcmZhY2UgZm9yIGFsbCBhYnN0cmFjdCByZXNvdXJjZSBtb2RlbCBjb21wb25lbnRzLAorICogc28gdGhhdCB0aGV5IGNhbiBiZSB0cmF2ZXJzZWQgdXNpbmcgYSB2aXNpdG9yIHBhdHRlcm4uCisgKgorICogQHNlZSBSZXNvdXJjZU1vZGVsVmlzaXRvcgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUmVzb3VyY2VNb2RlbENvbXBvbmVudCB7CisKKyAgICAvKioKKyAgICAgKiBBIGNvbXBvbmVudCBzaG91bGQgY2FsbCB0aGUgdmlzaXRvciBiYWNrIHdpdGggYW4gYXBwcm9wcmlhdGUKKyAgICAgKiB2aXNpdG9yIGludGVyZmFjZSBtZXRob2QgdG8gZ2l2ZSBpdCBhIGNoYW5jZSB0byBwcm9jZXNzLgorICAgICAqCisgICAgICogQHBhcmFtIHZpc2l0b3IgcmVzb3VyY2UgbW9kZWwgdmlzaXRvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhY2NlcHQoUmVzb3VyY2VNb2RlbFZpc2l0b3IgdmlzaXRvcik7CisKKyAgICAvKioKKyAgICAgKiBTaG91bGQgcmV0dXJuIGFsbCBleGlzdGluZyByZXNvdXJjZSBtb2RlbCBzdWItY29tcG9uZW50cy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbGlzdCBvZiBhbGwgc3ViLWNvbXBvbmVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDw/IGV4dGVuZHMgUmVzb3VyY2VNb2RlbENvbXBvbmVudD4gZ2V0Q29tcG9uZW50cygpOworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvUmVzb3VyY2VNb2RlbElzc3VlLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9SZXNvdXJjZU1vZGVsSXNzdWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWI2ZjRmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvUmVzb3VyY2VNb2RlbElzc3VlLmphdmEKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuU2V2ZXJpdHk7CisKKy8qKgorICogUmVzb3VyY2UgbW9kZWwgdmFsaWRpdHkgaXNzdWUuCisgKiA8cC8+CisgKiBDb3ZlcnMgdmFyaW91cyBtb2RlbCBpc3N1ZXMsIHN1Y2ggYXMgZHVwbGljYXRlIFVSSSB0ZW1wbGF0ZXMsIGR1cGxpY2F0ZQorICogSFRUUCBtZXRob2QgYW5ub3RhdGlvbnMsIGV0Yy4KKyAqIDxwLz4KKyAqIFRoZSBtb2RlbCBpc3N1ZXMgY2FuIGJlIGVpdGhlciBmYXRhbCB3YXJuaW5ncyBvciBoaW5ncyAoc2VlIHtAbGluayAjZ2V0U2V2ZXJpdHkoKX0pLgorICogV2hpbGUgdGhlIG5vbi1mYXRhbCBpc3N1ZXMgYXJlIG1lcmVseSByZXBvcnRlZCBhcyB3YXJuaW5ncyBpbiB0aGUgbG9nLCB0aGUKKyAqIGZhdGFsIGlzc3VlcyBwcmV2ZW50IHRoZSBzdWNjZXNzZnVsIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBSZXNvdXJjZU1vZGVsSXNzdWUgeworCisgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3Qgc291cmNlOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1lc3NhZ2U7CisgICAgcHJpdmF0ZSBmaW5hbCBTZXZlcml0eSBzZXZlcml0eTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyByZXNvdXJjZSBtb2RlbCB3YXJuaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIHNvdXJjZSAgaXNzdWUgc291cmNlLgorICAgICAqIEBwYXJhbSBtZXNzYWdlIGh1bWFuLXJlYWRhYmxlIGlzc3VlIGRlc2NyaXB0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBSZXNvdXJjZU1vZGVsSXNzdWUoZmluYWwgT2JqZWN0IHNvdXJjZSwgZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgdGhpcyhzb3VyY2UsIG1lc3NhZ2UsIFNldmVyaXR5LldBUk5JTkcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyByZXNvdXJjZSBtb2RlbCBpc3N1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzb3VyY2UgICBpc3N1ZSBzb3VyY2UuCisgICAgICogQHBhcmFtIG1lc3NhZ2UgIGh1bWFuLXJlYWRhYmxlIGlzc3VlIGRlc2NyaXB0aW9uLgorICAgICAqIEBwYXJhbSBzZXZlcml0eSBpbmRpY2F0ZXMgc2V2ZXJpdHkgb2YgYWRkZWQgZXJyb3IuCisgICAgICovCisgICAgcHVibGljIFJlc291cmNlTW9kZWxJc3N1ZShmaW5hbCBPYmplY3Qgc291cmNlLCBmaW5hbCBTdHJpbmcgbWVzc2FnZSwgZmluYWwgU2V2ZXJpdHkgc2V2ZXJpdHkpIHsKKyAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7CisgICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgICAgIHRoaXMuc2V2ZXJpdHkgPSBzZXZlcml0eTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIdW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgaXNzdWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIG1lc3NhZ2UgZGVzY3JpYmluZyB0aGUgaXNzdWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LlNldmVyaXR5fS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gc2V2ZXJpdHkgb2YgY3VycmVudCB7QGxpbmsgUmVzb3VyY2VNb2RlbElzc3VlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2V2ZXJpdHkgZ2V0U2V2ZXJpdHkoKSB7CisgICAgICAgIHJldHVybiBzZXZlcml0eTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgaXNzdWUgc291cmNlLgorICAgICAqIDxwLz4KKyAgICAgKiBJZGVudGlmaWVzIHRoZSBvYmplY3Qgd2hlcmUgdGhlIGlzc3VlIHdhcyBmb3VuZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gc291cmNlIG9mIHRoZSBpc3N1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0IGdldFNvdXJjZSgpIHsKKyAgICAgICAgcmV0dXJuIHNvdXJjZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIlsiICsgc2V2ZXJpdHkgKyAiXSAiICsgbWVzc2FnZSArICI7IHNvdXJjZT0nIiArIHNvdXJjZSArICdcJyc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvKSB7CisgICAgICAgIGlmICh0aGlzID09IG8pIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFJlc291cmNlTW9kZWxJc3N1ZSB0aGF0ID0gKFJlc291cmNlTW9kZWxJc3N1ZSkgbzsKKworICAgICAgICBpZiAobWVzc2FnZSAhPSBudWxsID8gIW1lc3NhZ2UuZXF1YWxzKHRoYXQubWVzc2FnZSkgOiB0aGF0Lm1lc3NhZ2UgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChzZXZlcml0eSAhPSB0aGF0LnNldmVyaXR5KSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsID8gIXNvdXJjZS5lcXVhbHModGhhdC5zb3VyY2UpIDogdGhhdC5zb3VyY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IHNvdXJjZSAhPSBudWxsID8gc291cmNlLmhhc2hDb2RlKCkgOiAwOworICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIChtZXNzYWdlICE9IG51bGwgPyBtZXNzYWdlLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyAoc2V2ZXJpdHkgIT0gbnVsbCA/IHNldmVyaXR5Lmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9SZXNvdXJjZU1vZGVsVmlzaXRvci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvUmVzb3VyY2VNb2RlbFZpc2l0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2U2ZDYzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvUmVzb3VyY2VNb2RlbFZpc2l0b3IuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbDsKKworLyoqCisgKiBGb2xsb3dpbmcgdGhlIHZpc2l0b3IgcGF0dGVybiwgdGhpcyBpbnRlcmZhY2UgYWxsb3dzIGltcGxlbWVudGluZyBwcm9jZXNzb3JzCisgKiB0cmF2ZXJzaW5nIGFsbCBhYnN0cmFjdCBtb2RlbCBjb21wb25lbnRzIHByZXNlbnQgaW4gYSBnaXZlbiBtb2RlbC4KKyAqCisgKiBAc2VlIFJlc291cmNlTW9kZWxDb21wb25lbnQKKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGludGVyZmFjZSBSZXNvdXJjZU1vZGVsVmlzaXRvciB7CisKKyAgICAvKioKKyAgICAgKiBTdGFydCB2aXNpdGluZyBhIHNpbmdsZSByZXNvdXJjZSBtb2RlbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZSByZXNvdXJjZSBtb2RlbC4KKyAgICAgKi8KKyAgICB2b2lkIHZpc2l0UmVzb3VyY2UoUmVzb3VyY2UgcmVzb3VyY2UpOworCisgICAgLyoqCisgICAgICogIFN0YXJ0IHZpc2l0aW5nIGEgc2luZ2xlIGNoaWxkIHJlc291cmNlIG1vZGVsLgorICAgICAqIEBwYXJhbSByZXNvdXJjZSBjaGlsZCByZXNvdXJjZSBtb2RlbC4KKyAgICAgKi8KKyAgICB2b2lkIHZpc2l0Q2hpbGRSZXNvdXJjZShSZXNvdXJjZSByZXNvdXJjZSk7CisKKyAgICAvKioKKyAgICAgKiBWaXNpdCBhIHNpbmdsZSByZXNvdXJjZSBtZXRob2QgbW9kZWwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWV0aG9kIHJlc291cmNlIG1ldGhvZCBtb2RlbC4KKyAgICAgKi8KKyAgICB2b2lkIHZpc2l0UmVzb3VyY2VNZXRob2QoUmVzb3VyY2VNZXRob2QgbWV0aG9kKTsKKworICAgIC8qKgorICAgICAqIFZpc2l0IGEgc2luZ2xlIHJlc291cmNlIG1ldGhvZCBpbnZvY2FibGUgbW9kZWwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW52b2NhYmxlIHJlc291cmNlIG1ldGhvZCBpbnZvY2FibGUgbW9kZWwuCisgICAgICovCisgICAgdm9pZCB2aXNpdEludm9jYWJsZShJbnZvY2FibGUgaW52b2NhYmxlKTsKKworICAgIC8qKgorICAgICAqIFZpc2l0IGEgc2luZ2xlIHJlc291cmNlIG1ldGhvZCBoYW5kbGVyIG1vZGVsLgorICAgICAqCisgICAgICogQHBhcmFtIG1ldGhvZEhhbmRsZXIgcmVzb3VyY2UgbWV0aG9kIGhhbmRsZXIgbW9kZWwuCisgICAgICovCisgICAgdm9pZCB2aXNpdE1ldGhvZEhhbmRsZXIoTWV0aG9kSGFuZGxlciBtZXRob2RIYW5kbGVyKTsKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYSByZXNvdXJjZSBtZXRob2QgaGFuZGxlciBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIFR5cGljYWxseSBhIGNvbnN0cnVjdG9yIG9mIGEgSkFYLVJTIGFubm90YXRlZCByZXNvdXJjZSBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25zdHJ1Y3RvciByZXNvdXJjZSBtZXRob2QgaGFuZGxlciBjb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICB2b2lkIHZpc2l0UmVzb3VyY2VIYW5kbGVyQ29uc3RydWN0b3IoSGFuZGxlckNvbnN0cnVjdG9yIGNvbnN0cnVjdG9yKTsKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYSByZXNvdXJjZSBtb2RlbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZU1vZGVsIHJlc291cmNlIG1vZGVsLgorICAgICAqLworICAgIHZvaWQgdmlzaXRSZXNvdXJjZU1vZGVsKFJlc291cmNlTW9kZWwgcmVzb3VyY2VNb2RlbCk7CisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzIGEgcnVudGltZSByZXNvdXJjZSBtb2RlbC4KKyAgICAgKiBAcGFyYW0gcnVudGltZVJlc291cmNlIHJ1bnRpbWUgcmVzb3VyY2UgbW9kZWwuCisgICAgICovCisgICAgdm9pZCB2aXNpdFJ1bnRpbWVSZXNvdXJjZShSdW50aW1lUmVzb3VyY2UgcnVudGltZVJlc291cmNlKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL1Jlc291cmNlVmFsaWRhdG9yLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9SZXNvdXJjZVZhbGlkYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNzVjNmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9SZXNvdXJjZVZhbGlkYXRvci5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuRXJyb3JzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKKworLyoqCisgKiBWYWxpZGF0b3IgZW5zdXJpbmcgdGhhdCByZXNvdXJjZSBhcmUgY29ycmVjdCAoZm9yIGV4YW1wbGUgdGhhdCByb290IHJlc291cmNlcyBjb250YWlucyBwYXRoLCBldGMuKS4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK2NsYXNzIFJlc291cmNlVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZU1vZGVsVmlzaXRvciB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2aXNpdFJlc291cmNlKGZpbmFsIFJlc291cmNlIHJlc291cmNlKSB7CisgICAgICAgIGNoZWNrUmVzb3VyY2UocmVzb3VyY2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja1Jlc291cmNlKGZpbmFsIFJlc291cmNlIHJlc291cmNlKSB7CisgICAgICAgIGlmICghcmVzb3VyY2UuZ2V0UmVzb3VyY2VNZXRob2RzKCkuaXNFbXB0eSgpICYmIHJlc291cmNlLmdldFJlc291cmNlTG9jYXRvcigpICE9IG51bGwpIHsKKyAgICAgICAgICAgIEVycm9ycy53YXJuaW5nKHJlc291cmNlLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5SRVNPVVJDRV9DT05UQUlOU19SRVNfTUVUSE9EU19BTkRfTE9DQVRPUihyZXNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UuZ2V0UGF0aCgpKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVzb3VyY2UuZ2V0UGF0aCgpICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiByZXNvdXJjZS5nZXRSZXNvdXJjZU1ldGhvZHMoKS5pc0VtcHR5KCkKKyAgICAgICAgICAgICAgICAmJiByZXNvdXJjZS5nZXRDaGlsZFJlc291cmNlcygpLmlzRW1wdHkoKQorICAgICAgICAgICAgICAgICYmIHJlc291cmNlLmdldFJlc291cmNlTG9jYXRvcigpID09IG51bGwpIHsKKyAgICAgICAgICAgIEVycm9ycy53YXJuaW5nKHJlc291cmNlLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5SRVNPVVJDRV9FTVBUWShyZXNvdXJjZSwgcmVzb3VyY2UuZ2V0UGF0aCgpKSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0Q2hpbGRSZXNvdXJjZShSZXNvdXJjZSByZXNvdXJjZSkgeworICAgICAgICBjaGVja1Jlc291cmNlKHJlc291cmNlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9Sb3V0ZWQuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL1JvdXRlZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNTdmODUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9Sb3V0ZWQuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnVyaS5QYXRoUGF0dGVybjsKKworLyoqCisgKiBNYXJrZXIgaW50ZXJmYWNlIGZvciBhbGwgcmVzb3VyY2UgbW9kZWwgY29tcG9uZW50cyB0aGF0IGNvbnRhaW4gcGF0aCBpbmZvcm1hdGlvbgorICogdXNhYmxlIGZvciByb3V0aW5nLgorICoKKyAqIEBhdXRob3IgTWFyYyBIYWRsZXkKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUm91dGVkIHsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcGF0aCBkaXJlY3QgYXNzaWduZWQgdG8gdGhlIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gY29tcG9uZW50IHBhdGguCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHBhdGggcGF0dGVybiB0aGF0IGNhbiBiZSB1c2VkIGZvciBtYXRjaGluZyB0aGUgcmVtYWluaW5nCisgICAgICogcmVxdWVzdCBVUkkgYWdhaW5zdCB0aGlzIGNvbXBvbmVudCByZXByZXNlbnRlZCBieSB0aGlzIG1vZGVsLgorICAgICAqCisgICAgICogQHJldHVybiBjb21wb25lbnQgcGF0aCBwYXR0ZXJuLgorICAgICAqLworICAgIHB1YmxpYyBQYXRoUGF0dGVybiBnZXRQYXRoUGF0dGVybigpOworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvUnVudGltZVJlc291cmNlLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9SdW50aW1lUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjQ2YWNlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvUnVudGltZVJlc291cmNlLmphdmEKQEAgLTAsMCArMSwyODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudXJpLlBhdGhQYXR0ZXJuOworCisvKioKKyAqIFJ1bnRpbWUgcmVzb3VyY2UgaXMgYSBncm91cCBvZiB7QGxpbmsgUmVzb3VyY2UgcmVzb3VyY2VzfSB3aXRoIHRoZSBzYW1lIHtAbGluayBSZXNvdXJjZSNnZXRQYXRoKCkgcGF0aH0KKyAqIHJlZ3VsYXIgZXhwcmVzc2lvbi4gUnVudGltZSByZXNvdXJjZSBpcyBjb25zdHJ1Y3RlZCBmcm9tIHtAbGluayBSZXNvdXJjZSByZXNvdXJjZXN9IGNyZWF0aW5nCisgKiB0aGUge0BsaW5rIFJlc291cmNlTW9kZWwgcmVzb3VyY2UgbW9kZWx9LgorICogPHAvPgorICogUnVudGltZSByZXNvdXJjZSBjYW4gaGF2ZSBjaGlsZCBydW50aW1lIHJlc291cmNlcyB3aGljaCBhcmUgZ3JvdXBzIG9mIGNoaWxkIHJlc291cmNlcyBvZiBhbGwgcmVzb3VyY2VzIGNvbnN0cnVjdGluZyB0aGlzCisgKiBydW50aW1lIHJlc291cmNlLgorICogPHAvPgorICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyBSdW50aW1lIHJlc291cmNlIHN0cnVjdHVyZSBpcyBidWlsdCBmcm9tIFJlc291cmNlIG1vZGVsOgorICogPHByZT4KKyAqICYjMDY0O1BhdGgoIntmb299IikKKyAqIHB1YmxpYyBjbGFzcyBUZW1wbGF0ZVJlc291cmNlRm9vIHsKKyAqICAgICAmIzA2NDtHRVQKKyAqICAgICAmIzA2NDtQYXRoKCJjaGlsZCIpCisgKiAgICAgcHVibGljIFN0cmluZyBnZXRGb28oKSB7Li4ufQorICoKKyAqICAgICAmIzA2NDtQYXRoKCJ7eH0iKQorICogICAgICYjMDY0O0dFVAorICogICAgIHB1YmxpYyBTdHJpbmcgZ2V0WCgpIHsuLi59CisgKgorICogICAgICYjMDY0O1BhdGgoInt5fSIpCisgKiAgICAgJiMwNjQ7UE9TVAorICogICAgIHB1YmxpYyBTdHJpbmcgcG9zdFkoU3RyaW5nIGVudGl0eSkgey4uLn0KKyAqIH0KKyAqCisgKiAmIzA2NDtQYXRoKCJ7YmFyfSIpCisgKiBwdWJsaWMgY2xhc3MgVGVtcGxhdGVSZXNvdXJjZUJhciB7CisgKiAgICAgJiMwNjQ7UGF0aCgie3p9IikKKyAqICAgICAmIzA2NDtQVVQKKyAqICAgICBwdWJsaWMgU3RyaW5nIHB1dFooU3RyaW5nIGVudGl0eSkgey4uLn0KKyAqIH0KKyAqIDwvcHJlPgorICoKKyAqIFdpbGwgYmUgcmVwcmVzZW50ZWQgYnkgUnVudGltZVJlc291cmNlczoKKyAqIDx0YWJsZSBib3JkZXI9IjEiPgorICogPHRyPgorICogPHRoPmxpbmU8L3RoPgorICogPHRoPlJ1bnRpbWVSZXNvdXJjZSByZWdleDwvdGg+CisgKiA8dGg+R3JvdXBlZCBSZXNvdXJjZXMgKHBhdGhzKTwvdGg+CisgKiA8dGg+UGFyZW50IFJ1bnRpbWVSZXNvdXJjZSAobGluZSk8L3RoPgorICogPC90cj4KKyAqIDx0cj4KKyAqIDx0ZD4xPC90ZD4KKyAqIDx0ZD4iLyhbXi9dKz8pIjwvdGQ+CisgKiA8dGQ+UmVzb3VyY2UoIntmb299IiksIFJlc291cmNlKCJ7YmFyfSIpPC90ZD4KKyAqIDx0ZD5ubyBwYXJlbnQ8L3RkPgorICogPC90cj4KKyAqIDx0cj4KKyAqIDx0ZD4yPC90ZD4KKyAqIDx0ZD4iY2hpbGQiPC90ZD4KKyAqIDx0ZD5DaGlsZCBSZXNvdXJjZSgiY2hpbGQiKTwvdGQ+CisgKiA8dGQ+MTwvdGQ+CisgKiA8L3RyPgorICogPHRyPgorICogPHRkPjM8L3RkPgorICogPHRkPiIvKFteL10rPykiPC90ZD4KKyAqIDx0ZD5DaGlsZCBSZXNvdXJjZSgie3h9IiksIENoaWxkIFJlc291cmNlKCJ7eX0iKSwgQ2hpbGQgUmVzb3VyY2UoInt6fSIpPC90ZD4KKyAqIDx0ZD4xPC90ZD4KKyAqIDwvdHI+CisgKiA8L3RhYmxlPgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIFJ1bnRpbWVSZXNvdXJjZSBpbXBsZW1lbnRzIFJlc291cmNlTW9kZWxDb21wb25lbnQgeworICAgIC8qKgorICAgICAqIFJ1bnRpbWUgUmVzb3VyY2UgYnVpbGRlci4KKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgQnVpbGRlciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxSZXNvdXJjZT4gcmVzb3VyY2VzOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyByZWdleDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFJ1bnRpbWVSZXNvdXJjZS5CdWlsZGVyPiBjaGlsZFJ1bnRpbWVSZXNvdXJjZUJ1aWxkZXJzOworCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBuZXcge0BsaW5rIFJ1bnRpbWVSZXNvdXJjZSBydW50aW1lIHJlc291cmNlfSBidWlsZGVyIGluc3RhbmNlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcmVzb3VyY2VzICAgICAgICAgICAgICAgICAgICBMaXN0IG9mIHJlc291cmNlcyB3aXRoIHNhbWUgcmVnZXggdGhhdCBjcmVhdGVzIGEgUnVudGltZVJlc291cmNlLgorICAgICAgICAgKiBAcGFyYW0gY2hpbGRSdW50aW1lUmVzb3VyY2VCdWlsZGVycyBMaXN0IG9mIGJ1aWxkZXJzIG9mIGNoaWxkIHJ1bnRpbWUgcmVzb3VyY2VzIHRoYXQgYmVsb25nIHJ1bnRpbWUgcmVzb3VyY2UuCisgICAgICAgICAqIEBwYXJhbSByZWdleCAgICAgICAgICAgICAgICAgICAgICAgIFBhdGggcmVndWxhciBleHByZXNzaW9uLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIoTGlzdDxSZXNvdXJjZT4gcmVzb3VyY2VzLCBMaXN0PEJ1aWxkZXI+IGNoaWxkUnVudGltZVJlc291cmNlQnVpbGRlcnMsIFN0cmluZyByZWdleCkgeworICAgICAgICAgICAgdGhpcy5jaGlsZFJ1bnRpbWVSZXNvdXJjZUJ1aWxkZXJzID0gY2hpbGRSdW50aW1lUmVzb3VyY2VCdWlsZGVyczsKKyAgICAgICAgICAgIHRoaXMucmVzb3VyY2VzID0gcmVzb3VyY2VzOworICAgICAgICAgICAgdGhpcy5yZWdleCA9IHJlZ2V4OworICAgICAgICB9CisKKworICAgICAgICAvKioKKyAgICAgICAgICogQnVpbGQgbmV3IFJ1bnRpbWVSZXNvdXJjZSBmcm9tIHRoaXMgYnVpbGRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHBhcmVudCBQYXJlbnQgcnVudGltZSByZXNvdXJjZS4KKyAgICAgICAgICogQHJldHVybiBOZXcgUnVudGltZVJlc291cmNlIGluc3RhbmNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFJ1bnRpbWVSZXNvdXJjZSBidWlsZChSdW50aW1lUmVzb3VyY2UgcGFyZW50KSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJ1bnRpbWVSZXNvdXJjZShyZXNvdXJjZXMsIGNoaWxkUnVudGltZVJlc291cmNlQnVpbGRlcnMsIHBhcmVudCwgcmVnZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGFyYXRvciBvZiBSdW50aW1lUmVzb3VyY2VzIGJhc2VkIG9uIHJ1bGVzIHJlc3BlY3RpbmcgcmVzb3VyY2UgbWF0Y2hpbmcgYWxnb3JpdGhtLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29tcGFyYXRvcjxSdW50aW1lUmVzb3VyY2U+IENPTVBBUkFUT1IgPSBuZXcgQ29tcGFyYXRvcjxSdW50aW1lUmVzb3VyY2U+KCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBjb21wYXJlKFJ1bnRpbWVSZXNvdXJjZSBvMSwgUnVudGltZVJlc291cmNlIG8yKSB7CisgICAgICAgICAgICByZXR1cm4gUGF0aFBhdHRlcm4uQ09NUEFSQVRPUi5jb21wYXJlKG8xLmdldFBhdGhQYXR0ZXJuKCksIG8yLmdldFBhdGhQYXR0ZXJuKCkpOworICAgICAgICB9CisgICAgfTsKKworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcmVnZXg7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFJlc291cmNlTWV0aG9kPiByZXNvdXJjZU1ldGhvZHM7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFJlc291cmNlTWV0aG9kPiByZXNvdXJjZUxvY2F0b3JzOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxSdW50aW1lUmVzb3VyY2U+IGNoaWxkUnVudGltZVJlc291cmNlczsKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8UmVzb3VyY2U+IHJlc291cmNlczsKKworICAgIHByaXZhdGUgZmluYWwgUnVudGltZVJlc291cmNlIHBhcmVudDsKKyAgICBwcml2YXRlIGZpbmFsIFBhdGhQYXR0ZXJuIHBhdGhQYXR0ZXJuOworCisKKyAgICBwcml2YXRlIFJ1bnRpbWVSZXNvdXJjZShMaXN0PFJlc291cmNlPiByZXNvdXJjZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxCdWlsZGVyPiBjaGlsZFJ1bnRpbWVSZXNvdXJjZUJ1aWxkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJ1bnRpbWVSZXNvdXJjZSBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlZ2V4KSB7CisgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OworICAgICAgICB0aGlzLnBhdGhQYXR0ZXJuID0gcmVzb3VyY2VzLmdldCgwKS5nZXRQYXRoUGF0dGVybigpOworCisgICAgICAgIHRoaXMucmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDw+KHJlc291cmNlcyk7CisKKyAgICAgICAgdGhpcy5yZWdleCA9IHJlZ2V4OworICAgICAgICB0aGlzLnJlc291cmNlTWV0aG9kcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICB0aGlzLnJlc291cmNlTG9jYXRvcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgdGhpcy5jaGlsZFJ1bnRpbWVSZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgZm9yIChCdWlsZGVyIGNoaWxkUnVudGltZVJlc291cmNlQnVpbGRlciA6IGNoaWxkUnVudGltZVJlc291cmNlQnVpbGRlcnMpIHsKKyAgICAgICAgICAgIHRoaXMuY2hpbGRSdW50aW1lUmVzb3VyY2VzLmFkZChjaGlsZFJ1bnRpbWVSZXNvdXJjZUJ1aWxkZXIuYnVpbGQodGhpcykpOworICAgICAgICB9CisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQodGhpcy5jaGlsZFJ1bnRpbWVSZXNvdXJjZXMsIENPTVBBUkFUT1IpOworCisgICAgICAgIGZvciAoZmluYWwgUmVzb3VyY2UgcmVzIDogdGhpcy5yZXNvdXJjZXMpIHsKKyAgICAgICAgICAgIHRoaXMucmVzb3VyY2VNZXRob2RzLmFkZEFsbChyZXMuZ2V0UmVzb3VyY2VNZXRob2RzKCkpOworCisgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZU1ldGhvZCByZXNvdXJjZUxvY2F0b3IgPSByZXMuZ2V0UmVzb3VyY2VMb2NhdG9yKCk7CisgICAgICAgICAgICBpZiAocmVzb3VyY2VMb2NhdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aGlzLnJlc291cmNlTG9jYXRvcnMuYWRkKHJlc291cmNlTG9jYXRvcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgY2hpbGQgcnVudGltZSByZXNvdXJjZXMgb2YgdGhpcyByZXNvdXJjZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTGlzdCBvZiBjaGlsZCBydW50aW1lIHJlc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFJ1bnRpbWVSZXNvdXJjZT4gZ2V0Q2hpbGRSdW50aW1lUmVzb3VyY2VzKCkgeworICAgICAgICByZXR1cm4gY2hpbGRSdW50aW1lUmVzb3VyY2VzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCByZWd1bGFyIGV4cHJlc3Npb24gb2YgcGF0aCBwYXR0ZXJuIG9mIHRoaXMgcnVudGltZSByZXNvdXJjZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTWF0Y2hpbmcgcmVndWxhciBleHByZXNzaW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVnZXgoKSB7CisgICAgICAgIHJldHVybiByZWdleDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgcmVzb3VyY2UgbWV0aG9kcyAoZXhjbHVkaW5nIHJlc291cmNlIGxvY2F0b3JzKSBvZiBhbGwge0BsaW5rIFJlc291cmNlIHJlc291cmNlc30gb2YgdGhpcyBydW50aW1lIHJlc291cmNlLgorICAgICAqCisgICAgICogQHJldHVybiBMaXN0IG9mIHJlc291cmNlIG1ldGhvZHMuCisgICAgICovCisgICAgcHVibGljIExpc3Q8UmVzb3VyY2VNZXRob2Q+IGdldFJlc291cmNlTWV0aG9kcygpIHsKKyAgICAgICAgcmV0dXJuIHJlc291cmNlTWV0aG9kczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgcmVzb3VyY2UgbG9jYXRvcnMgb2YgYWxsIHtAbGluayBSZXNvdXJjZSByZXNvdXJjZXN9IG9mIHRoaXMgcnVudGltZSByZXNvdXJjZS4KKyAgICAgKiA8cC8+CisgICAgICogTm90ZSB0aGF0IHZhbGlkIFJ1bnRpbWVSZXNvdXJjZSBzaG91bGQgaGF2ZSBvbmx5IG9uZSByZXNvdXJjZSBsb2NhdG9yLiBUaGlzIG1ldGhvZCBpcyB1c2VkIGZvciB2YWxpZGF0aW9uIHB1cnBvc2VzLgorICAgICAqCisgICAgICogQHJldHVybiBMaXN0IG9mIHJlc291cmNlIGxvY2F0b3JzLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFJlc291cmNlTWV0aG9kPiBnZXRSZXNvdXJjZUxvY2F0b3JzKCkgeworICAgICAgICByZXR1cm4gcmVzb3VyY2VMb2NhdG9yczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHJlc291cmNlIGxvY2F0b3Igb2YgdGhpcyByZXNvdXJjZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gUmVzb3VyY2UgbG9jYXRvciBvZiB0aGlzIHJ1bnRpbWUgcmVzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIFJlc291cmNlTWV0aG9kIGdldFJlc291cmNlTG9jYXRvcigpIHsKKyAgICAgICAgaWYgKHJlc291cmNlTG9jYXRvcnMuc2l6ZSgpID49IDEpIHsKKyAgICAgICAgICAgIHJldHVybiByZXNvdXJjZUxvY2F0b3JzLmdldCgwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHBhcmVudCBvZiB0aGlzIHJ1bnRpbWUgcmVzb3VyY2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFBhcmVudCBydW50aW1lIHJlc291cmNlIGlmIHRoaXMgcnVudGltZSByZXNvdXJjZSBpcyBhIGNoaWxkIHJlc291cmNlLCBudWxsIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUnVudGltZVJlc291cmNlIGdldFBhcmVudCgpIHsKKyAgICAgICAgcmV0dXJuIHBhcmVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgcGF0aCBwYXR0ZXJuIGZvciBtYXRjaGluZyBwdXJwb3Nlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gUGF0aCBwYXR0ZXJuLgorICAgICAqLworICAgIHB1YmxpYyBQYXRoUGF0dGVybiBnZXRQYXRoUGF0dGVybigpIHsKKyAgICAgICAgcmV0dXJuIHBhdGhQYXR0ZXJuOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBmdWxsIHJlZ3VsYXIgZXhwcmVzc2lvbiBvZiB0aGlzIHJ1bnRpbWUgcmVzb3VyY2UgcHJlZml4ZWQgYnkgcmVndWxhciBleHByZXNzaW9uIG9mIHBhcmVudCBpZiBwcmVzZW50LgorICAgICAqCisgICAgICogQHJldHVybiBGdWxsIHJlc291cmNlIHJlZ3VsYXIgZXhwcmVzc2lvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEZ1bGxQYXRoUmVnZXgoKSB7CisgICAgICAgIGlmIChwYXJlbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHJlZ2V4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHBhcmVudC5nZXRSZWdleCgpICsgcmVnZXg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gcGFyZW50IHtAbGluayBSZXNvdXJjZSByZXNvdXJjZXN9IG9mIHtAbGluayBSZXNvdXJjZSByZXNvdXJjZXN9IGZyb20gdGhpcyBydW50aW1lIHJlc291cmNlLiBUaGUgcmV0dXJuZWQgbGlzdAorICAgICAqIGlzIG9yZGVyZWQgc28gdGhhdCB0aGUgcG9zaXRpb24gb2YgdGhlIHBhcmVudCByZXNvdXJjZSBpbiB0aGUgcmV0dXJuZWQgbGlzdCBpcyB0aGUgc2FtZSBhcyBwb3NpdGlvbiBvZiBpdHMgY2hpbGQgcmVzb3VyY2UKKyAgICAgKiBpbiBsaXN0IHJldHVybmVkIGJ5IHtAbGluayAjZ2V0UmVzb3VyY2VzKCl9LiBTaW1wbHkgc2FpZCB0aGUgb3JkZXIgb2YgbGlzdHMgcmV0dXJuZWQKKyAgICAgKiBmcm9tIHtAY29kZSBnZXRQYXJlbnRSZXNvdXJjZXMoKX0gYW5kIHtAbGluayAjZ2V0UmVzb3VyY2VzKCl9IGZyb20gcGFyZW50LWNoaWxkIHBvaW50IG9mIHZpZXcgaXMgdGhlIHNhbWUuIElmIHRoZSByZXNvdXJjZQorICAgICAqIGhhcyBubyBwYXJlbnQgdGhlbiB0aGUgZWxlbWVudCB7QGNvZGUgbnVsbH0gaXMgaW4gdGhlIGxpc3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFBhcmVudCByZXNvdXJjZSBsaXN0IHdpdGggcmVzb3VyY2VzIGlmIHRoaXMgcnVudGltZSByZXNvdXJjZSBpcyBjaGlsZCByZXNvdXJjZSBvciB7QGNvZGUgbnVsbH0gZWxlbWVudHMgaWYKKyAgICAgKiAgICAgICAgIHRoaXMgcnVudGltZSByZXNvdXJjZSBpcyB0aGUgcGFyZW50IHJlc291cmNlLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFJlc291cmNlPiBnZXRQYXJlbnRSZXNvdXJjZXMoKSB7CisgICAgICAgIHJldHVybiByZXNvdXJjZXMuc3RyZWFtKCkubWFwKGNoaWxkIC0+IChjaGlsZCA9PSBudWxsKSA/IG51bGwgOiBjaGlsZC5nZXRQYXJlbnQoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgcmVzb3VyY2VzIGNyZWF0aW5nIHRoaXMgcnVudGltZSByZXNvdXJjZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTGlzdCBvZiByZXNvdXJjZXMgd2l0aCBzYW1lIHBhdGggcmVndWxhciBleHByZXNzaW9uIHdoaWNoIHRoaXMgcmVzb3VyY2UgaXMgYmFzZWQgb24uCisgICAgICovCisgICAgcHVibGljIExpc3Q8UmVzb3VyY2U+IGdldFJlc291cmNlcygpIHsKKyAgICAgICAgcmV0dXJuIHJlc291cmNlczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhY2NlcHQoUmVzb3VyY2VNb2RlbFZpc2l0b3IgdmlzaXRvcikgeworICAgICAgICB2aXNpdG9yLnZpc2l0UnVudGltZVJlc291cmNlKHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PD8gZXh0ZW5kcyBSZXNvdXJjZU1vZGVsQ29tcG9uZW50PiBnZXRDb21wb25lbnRzKCkgeworICAgICAgICByZXR1cm4gZ2V0Q2hpbGRSdW50aW1lUmVzb3VyY2VzKCk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9SdW50aW1lUmVzb3VyY2VNb2RlbC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvUnVudGltZVJlc291cmNlTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjI0NTM3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvUnVudGltZVJlc291cmNlTW9kZWwuamF2YQpAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS51cmkuUGF0aFRlbXBsYXRlOworCisvKioKKyAqIFJ1bnRpbWUgUmVzb3VyY2UgbW9kZWwgY29udGFpbnMgc3RydWN0dXJlZCBpbmZvcm1hdGlvbiBhYm91dCBydW50aW1lIHJlc291cmNlcy4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBSdW50aW1lUmVzb3VyY2VNb2RlbCB7CisKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8UnVudGltZVJlc291cmNlPiBydW50aW1lUmVzb3VyY2VzOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBuZXcgcnVudGltZSByZXNvdXJjZSBtb2RlbCBmcm9tIHRoZSBsaXN0IG9mIHJlc291cmNlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZXMgTGlzdCBvZiBhbGwgcmVzb3VyY2UgdGhhdCBzaG91bGQgYmUgYmFzZSBmb3IgdGhlIG1vZGVsLgorICAgICAqLworICAgIHB1YmxpYyBSdW50aW1lUmVzb3VyY2VNb2RlbChMaXN0PFJlc291cmNlPiByZXNvdXJjZXMpIHsKKyAgICAgICAgdGhpcy5ydW50aW1lUmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZvciAoUnVudGltZVJlc291cmNlLkJ1aWxkZXIgYnVpbGRlciA6IGdldFJ1bnRpbWVSZXNvdXJjZXMocmVzb3VyY2VzKSkgeworICAgICAgICAgICAgcnVudGltZVJlc291cmNlcy5hZGQoYnVpbGRlci5idWlsZChudWxsKSk7CisgICAgICAgIH0KKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydChydW50aW1lUmVzb3VyY2VzLCBSdW50aW1lUmVzb3VyY2UuQ09NUEFSQVRPUik7CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0PFJ1bnRpbWVSZXNvdXJjZS5CdWlsZGVyPiBnZXRSdW50aW1lUmVzb3VyY2VzKExpc3Q8UmVzb3VyY2U+IHJlc291cmNlcykgeworICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PFJlc291cmNlPj4gcmVnZXhNYXAgPSBuZXcgSGFzaE1hcDw+KCk7CisKKyAgICAgICAgZm9yIChSZXNvdXJjZSByZXNvdXJjZSA6IHJlc291cmNlcykgeworICAgICAgICAgICAgU3RyaW5nIHBhdGggPSByZXNvdXJjZS5nZXRQYXRoKCk7CisgICAgICAgICAgICBTdHJpbmcgcmVnZXggPSBudWxsOworICAgICAgICAgICAgaWYgKHBhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChwYXRoLmVuZHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVnZXggPSBuZXcgUGF0aFRlbXBsYXRlKHBhdGgpLmdldFBhdHRlcm4oKS5nZXRSZWdleCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMaXN0PFJlc291cmNlPiBsaXN0RnJvbU1hcCA9IHJlZ2V4TWFwLmdldChyZWdleCk7CisgICAgICAgICAgICBpZiAobGlzdEZyb21NYXAgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxpc3RGcm9tTWFwID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICAgICAgcmVnZXhNYXAucHV0KHJlZ2V4LCBsaXN0RnJvbU1hcCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsaXN0RnJvbU1hcC5hZGQocmVzb3VyY2UpOworICAgICAgICB9CisKKyAgICAgICAgTGlzdDxSdW50aW1lUmVzb3VyY2UuQnVpbGRlcj4gcnVudGltZVJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8UmVzb3VyY2U+PiBlbnRyeSA6IHJlZ2V4TWFwLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8UmVzb3VyY2U+IHJlc291cmNlc1dpdGhTYW1lUmVnZXggPSBlbnRyeS5nZXRWYWx1ZSgpOworCisgICAgICAgICAgICBMaXN0PFJlc291cmNlPiBjaGlsZFJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgZm9yIChmaW5hbCBSZXNvdXJjZSByZXMgOiByZXNvdXJjZXNXaXRoU2FtZVJlZ2V4KSB7CisgICAgICAgICAgICAgICAgY2hpbGRSZXNvdXJjZXMuYWRkQWxsKHJlcy5nZXRDaGlsZFJlc291cmNlcygpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTGlzdDxSdW50aW1lUmVzb3VyY2UuQnVpbGRlcj4gY2hpbGRSdW50aW1lUmVzb3VyY2VzID0gZ2V0UnVudGltZVJlc291cmNlcyhjaGlsZFJlc291cmNlcyk7CisgICAgICAgICAgICBydW50aW1lUmVzb3VyY2VzLmFkZChuZXcgUnVudGltZVJlc291cmNlLkJ1aWxkZXIocmVzb3VyY2VzV2l0aFNhbWVSZWdleCwgY2hpbGRSdW50aW1lUmVzb3VyY2VzLCBlbnRyeS5nZXRLZXkoKSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBydW50aW1lUmVzb3VyY2VzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBsaXN0IG9mIHJ1bnRpbWUgcmVzb3VyY2VzIGZyb20gdGhpcyBtb2RlbCAoZXhjbHVkaW5nIGNoaWxkIHJlc291cmNlcyB3aGljaCBhcmUgYWNjZXNzaWJsZSBpbiB0aGUKKyAgICAgKiByZXR1cm5lZCByZXNvdXJjZXMpLgorICAgICAqCisgICAgICogQHJldHVybiBMaXN0IG9mIHJ1bnRpbWUgcmVzb3VyY2VzLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFJ1bnRpbWVSZXNvdXJjZT4gZ2V0UnVudGltZVJlc291cmNlcygpIHsKKyAgICAgICAgcmV0dXJuIHJ1bnRpbWVSZXNvdXJjZXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvUnVudGltZVJlc291cmNlTW9kZWxWYWxpZGF0b3IuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL1J1bnRpbWVSZXNvdXJjZU1vZGVsVmFsaWRhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM5MzViMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL1J1bnRpbWVSZXNvdXJjZU1vZGVsVmFsaWRhdG9yLmphdmEKQEAgLTAsMCArMSwxNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5TZXZlcml0eTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5FcnJvcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5NZXNzYWdlQm9keVdvcmtlcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5NZWRpYVR5cGVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKKworLyoqCisgKiBSdW50aW1lIHJlc291cmNlIG1vZGVsIHZhbGlkYXRvciB2YWxpZGF0aW5nIGFtYmlndWl0eSBvZiByZXNvdXJjZSBtZXRob2RzLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIFJ1bnRpbWVSZXNvdXJjZU1vZGVsVmFsaWRhdG9yIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZU1vZGVsVmlzaXRvciB7CisKKyAgICBwcml2YXRlIGZpbmFsIE1lc3NhZ2VCb2R5V29ya2VycyB3b3JrZXJzOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IHZhbGlkYXRvciBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3b3JrZXJzIE1lc3NhZ2UgYm9keSB3b3JrZXJzLgorICAgICAqLworICAgIHB1YmxpYyBSdW50aW1lUmVzb3VyY2VNb2RlbFZhbGlkYXRvcihNZXNzYWdlQm9keVdvcmtlcnMgd29ya2VycykgeworICAgICAgICB0aGlzLndvcmtlcnMgPSB3b3JrZXJzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHZpc2l0UnVudGltZVJlc291cmNlKFJ1bnRpbWVSZXNvdXJjZSBydW50aW1lUmVzb3VyY2UpIHsKKyAgICAgICAgY2hlY2tNZXRob2RzKHJ1bnRpbWVSZXNvdXJjZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrTWV0aG9kcyhSdW50aW1lUmVzb3VyY2UgcmVzb3VyY2UpIHsKKyAgICAgICAgZmluYWwgTGlzdDxSZXNvdXJjZU1ldGhvZD4gcmVzb3VyY2VNZXRob2RzID0gbmV3IEFycmF5TGlzdDw+KHJlc291cmNlLmdldFJlc291cmNlTWV0aG9kcygpKTsKKyAgICAgICAgcmVzb3VyY2VNZXRob2RzLmFkZEFsbChyZXNvdXJjZS5nZXRSZXNvdXJjZUxvY2F0b3JzKCkpOworICAgICAgICBpZiAocmVzb3VyY2VNZXRob2RzLnNpemUoKSA+PSAyKSB7CisgICAgICAgICAgICBmb3IgKFJlc291cmNlTWV0aG9kIG0xIDogcmVzb3VyY2VNZXRob2RzLnN1Ykxpc3QoMCwgcmVzb3VyY2VNZXRob2RzLnNpemUoKSAtIDEpKSB7CisgICAgICAgICAgICAgICAgZm9yIChSZXNvdXJjZU1ldGhvZCBtMiA6IHJlc291cmNlTWV0aG9kcy5zdWJMaXN0KHJlc291cmNlTWV0aG9kcy5pbmRleE9mKG0xKSArIDEsIHJlc291cmNlTWV0aG9kcy5zaXplKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtMS5nZXRIdHRwTWV0aG9kKCkgPT0gbnVsbCAmJiBtMi5nZXRIdHRwTWV0aG9kKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JzLmVycm9yKHRoaXMsIExvY2FsaXphdGlvbk1lc3NhZ2VzLkFNQklHVU9VU19TUkxTX1BBVEhfUEFUVEVSTihyZXNvdXJjZS5nZXRGdWxsUGF0aFJlZ2V4KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXZlcml0eS5GQVRBTCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobTEuZ2V0SHR0cE1ldGhvZCgpICE9IG51bGwgJiYgbTIuZ2V0SHR0cE1ldGhvZCgpICE9IG51bGwgJiYgc2FtZUh0dHBNZXRob2QobTEsIG0yKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tJbnRlcnNlY3RpbmdNZWRpYVR5cGVzKHJlc291cmNlLCBtMS5nZXRIdHRwTWV0aG9kKCksIG0xLCBtMik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tJbnRlcnNlY3RpbmdNZWRpYVR5cGVzKAorICAgICAgICAgICAgUnVudGltZVJlc291cmNlIHJ1bnRpbWVSZXNvdXJjZSwKKyAgICAgICAgICAgIFN0cmluZyBodHRwTWV0aG9kLAorICAgICAgICAgICAgUmVzb3VyY2VNZXRob2QgbTEsCisgICAgICAgICAgICBSZXNvdXJjZU1ldGhvZCBtMikgeworCisgICAgICAgIGZpbmFsIExpc3Q8TWVkaWFUeXBlPiBpbnB1dFR5cGVzMSA9IGdldEVmZmVjdGl2ZUlucHV0VHlwZXMobTEpOworICAgICAgICBmaW5hbCBMaXN0PE1lZGlhVHlwZT4gaW5wdXRUeXBlczIgPSBnZXRFZmZlY3RpdmVJbnB1dFR5cGVzKG0yKTsKKyAgICAgICAgZmluYWwgTGlzdDxNZWRpYVR5cGU+IG91dHB1dFR5cGVzMSA9IGdldEVmZmVjdGl2ZU91dHB1dFR5cGVzKG0xKTsKKyAgICAgICAgZmluYWwgTGlzdDxNZWRpYVR5cGU+IG91dHB1dFR5cGVzMiA9IGdldEVmZmVjdGl2ZU91dHB1dFR5cGVzKG0yKTsKKworICAgICAgICBib29sZWFuIGNvbnN1bWVzRmFpbHM7CisgICAgICAgIGJvb2xlYW4gY29uc3VtZXNPbmx5SW50ZXJzZWN0cyA9IGZhbHNlOworICAgICAgICBpZiAobTEuZ2V0Q29uc3VtZWRUeXBlcygpLmlzRW1wdHkoKSB8fCBtMi5nZXRDb25zdW1lZFR5cGVzKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBjb25zdW1lc0ZhaWxzID0gaW5wdXRUeXBlczEuZXF1YWxzKGlucHV0VHlwZXMyKTsKKyAgICAgICAgICAgIGlmICghY29uc3VtZXNGYWlscykgeworICAgICAgICAgICAgICAgIGNvbnN1bWVzT25seUludGVyc2VjdHMgPSBNZWRpYVR5cGVzLmludGVyc2VjdChpbnB1dFR5cGVzMSwgaW5wdXRUeXBlczIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uc3VtZXNGYWlscyA9IE1lZGlhVHlwZXMuaW50ZXJzZWN0KGlucHV0VHlwZXMxLCBpbnB1dFR5cGVzMik7CisgICAgICAgIH0KKworICAgICAgICBib29sZWFuIHByb2R1Y2VzRmFpbHM7CisgICAgICAgIGJvb2xlYW4gcHJvZHVjZXNPbmx5SW50ZXJzZWN0cyA9IGZhbHNlOworICAgICAgICBpZiAobTEuZ2V0UHJvZHVjZWRUeXBlcygpLmlzRW1wdHkoKSB8fCBtMi5nZXRQcm9kdWNlZFR5cGVzKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBwcm9kdWNlc0ZhaWxzID0gb3V0cHV0VHlwZXMxLmVxdWFscyhvdXRwdXRUeXBlczIpOworICAgICAgICAgICAgaWYgKCFwcm9kdWNlc0ZhaWxzKSB7CisgICAgICAgICAgICAgICAgcHJvZHVjZXNPbmx5SW50ZXJzZWN0cyA9IE1lZGlhVHlwZXMuaW50ZXJzZWN0KG91dHB1dFR5cGVzMSwgb3V0cHV0VHlwZXMyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByb2R1Y2VzRmFpbHMgPSBNZWRpYVR5cGVzLmludGVyc2VjdChvdXRwdXRUeXBlczEsIG91dHB1dFR5cGVzMik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29uc3VtZXNGYWlscyAmJiBwcm9kdWNlc0ZhaWxzKSB7CisgICAgICAgICAgICAvLyBmYXRhbAorICAgICAgICAgICAgRXJyb3JzLmZhdGFsKHJ1bnRpbWVSZXNvdXJjZSwgTG9jYWxpemF0aW9uTWVzc2FnZXMuQU1CSUdVT1VTX0ZBVEFMX1JNUyhodHRwTWV0aG9kLCBtMS5nZXRJbnZvY2FibGUoKQorICAgICAgICAgICAgICAgICAgICAuZ2V0SGFuZGxpbmdNZXRob2QoKSwgbTIuZ2V0SW52b2NhYmxlKCkuZ2V0SGFuZGxpbmdNZXRob2QoKSwgcnVudGltZVJlc291cmNlLmdldFJlZ2V4KCkpKTsKKyAgICAgICAgfSBlbHNlIGlmICgocHJvZHVjZXNGYWlscyAmJiBjb25zdW1lc09ubHlJbnRlcnNlY3RzKQorICAgICAgICAgICAgICAgIHx8IChjb25zdW1lc0ZhaWxzICYmIHByb2R1Y2VzT25seUludGVyc2VjdHMpCisgICAgICAgICAgICAgICAgfHwgKGNvbnN1bWVzT25seUludGVyc2VjdHMgJiYgcHJvZHVjZXNPbmx5SW50ZXJzZWN0cykpIHsKKyAgICAgICAgICAgIC8vIHdhcm5pbmcKKyAgICAgICAgICAgIGlmIChtMS5nZXRJbnZvY2FibGUoKS5yZXF1aXJlc0VudGl0eSgpKSB7CisgICAgICAgICAgICAgICAgRXJyb3JzLmhpbnQocnVudGltZVJlc291cmNlLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5BTUJJR1VPVVNfUk1TX0lOKAorICAgICAgICAgICAgICAgICAgICAgICAgaHR0cE1ldGhvZCwgbTEuZ2V0SW52b2NhYmxlKCkuZ2V0SGFuZGxpbmdNZXRob2QoKSwgbTIuZ2V0SW52b2NhYmxlKCkuZ2V0SGFuZGxpbmdNZXRob2QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVSZXNvdXJjZS5nZXRSZWdleCgpKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEVycm9ycy5oaW50KHJ1bnRpbWVSZXNvdXJjZSwgTG9jYWxpemF0aW9uTWVzc2FnZXMuQU1CSUdVT1VTX1JNU19PVVQoCisgICAgICAgICAgICAgICAgICAgICAgICBodHRwTWV0aG9kLCBtMS5nZXRJbnZvY2FibGUoKS5nZXRIYW5kbGluZ01ldGhvZCgpLCBtMi5nZXRJbnZvY2FibGUoKS5nZXRIYW5kbGluZ01ldGhvZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZVJlc291cmNlLmdldFJlZ2V4KCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3Q8TWVkaWFUeXBlPiBTdGFyVHlwZUxpc3QgPSBBcnJheXMuYXNMaXN0KG5ldyBNZWRpYVR5cGUoIioiLCAiKiIpKTsKKworICAgIHByaXZhdGUgTGlzdDxNZWRpYVR5cGU+IGdldEVmZmVjdGl2ZUlucHV0VHlwZXMoZmluYWwgUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QpIHsKKyAgICAgICAgaWYgKCFyZXNvdXJjZU1ldGhvZC5nZXRDb25zdW1lZFR5cGVzKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzb3VyY2VNZXRob2QuZ2V0Q29uc3VtZWRUeXBlcygpOworICAgICAgICB9CisgICAgICAgIExpc3Q8TWVkaWFUeXBlPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIGlmICh3b3JrZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoUGFyYW1ldGVyIHAgOiByZXNvdXJjZU1ldGhvZC5nZXRJbnZvY2FibGUoKS5nZXRQYXJhbWV0ZXJzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAocC5nZXRTb3VyY2UoKSA9PSBQYXJhbWV0ZXIuU291cmNlLkVOVElUWSkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHdvcmtlcnMuZ2V0TWVzc2FnZUJvZHlSZWFkZXJNZWRpYVR5cGVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuZ2V0UmF3VHlwZSgpLCBwLmdldFR5cGUoKSwgcC5nZXREZWNsYXJlZEFubm90YXRpb25zKCkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5pc0VtcHR5KCkgPyBTdGFyVHlwZUxpc3QgOiByZXN1bHQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0PE1lZGlhVHlwZT4gZ2V0RWZmZWN0aXZlT3V0cHV0VHlwZXMoZmluYWwgUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QpIHsKKyAgICAgICAgaWYgKCFyZXNvdXJjZU1ldGhvZC5nZXRQcm9kdWNlZFR5cGVzKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzb3VyY2VNZXRob2QuZ2V0UHJvZHVjZWRUeXBlcygpOworICAgICAgICB9CisgICAgICAgIExpc3Q8TWVkaWFUeXBlPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIGlmICh3b3JrZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIEludm9jYWJsZSBpbnZvY2FibGUgPSByZXNvdXJjZU1ldGhvZC5nZXRJbnZvY2FibGUoKTsKKyAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwod29ya2Vycy5nZXRNZXNzYWdlQm9keVdyaXRlck1lZGlhVHlwZXMoCisgICAgICAgICAgICAgICAgICAgIGludm9jYWJsZS5nZXRSYXdSZXNwb25zZVR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgaW52b2NhYmxlLmdldFJlc3BvbnNlVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICBpbnZvY2FibGUuZ2V0SGFuZGxpbmdNZXRob2QoKS5nZXRBbm5vdGF0aW9ucygpKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC5pc0VtcHR5KCkgPyBTdGFyVHlwZUxpc3QgOiByZXN1bHQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHNhbWVIdHRwTWV0aG9kKFJlc291cmNlTWV0aG9kIG0xLCBSZXNvdXJjZU1ldGhvZCBtMikgeworICAgICAgICByZXR1cm4gbTEuZ2V0SHR0cE1ldGhvZCgpLmVxdWFscyhtMi5nZXRIdHRwTWV0aG9kKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL1N1c3BlbmRhYmxlLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9TdXNwZW5kYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNDUxNDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9TdXNwZW5kYWJsZS5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKKy8qKgorICogSmVyc2V5IG1vZGVsIGNvbXBvbmVudCB0aGF0IGlzIHN1c3BlbmRhYmxlIGFuZCBtYXkgaG9sZCBzdXNwZW5kLXJlbGF0ZWQKKyAqIGluZm9ybWF0aW9uLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgU3VzcGVuZGFibGUgeworCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgdGhlIGNvbXBvbmVudCBpcyBtYXJrZWQgZm9yIHN1c3BlbmRpbmcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgY29tcG9uZW50IGlzIG1hcmtlZCBmb3Igc3VzcGVuZGluZywKKyAgICAgKiAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNTdXNwZW5kRGVjbGFyZWQoKTsKKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIHRoZSBjb21wb25lbnQgaXMgbWFya2VkIHRvIGJlIGV4ZWN1dGVkIGFzeW5jaHJvbm91c2x5IGJ5IHVzaW5nCisgICAgICogYW4gaW50ZXJuYWwgSmVyc2V5IHtAbGluayBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2UgZXhlY3V0b3Igc2VydmljZX0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgY29tcG9uZW50IGlzIG1hcmtlZCBmb3IgbWFuYWdlZCBhc3luY2hyb25vdXMgZXhlY3V0aW9uLAorICAgICAqICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc01hbmFnZWRBc3luY0RlY2xhcmVkKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHN1c3BlbmQgdGltZW91dCB2YWx1ZSBpbiB0aGUgZ2l2ZW4ge0BsaW5rICNnZXRTdXNwZW5kVGltZW91dFVuaXQoKQorICAgICAqIHRpbWUgdW5pdH0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHN1c3BlbmQgdGltZW91dCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRTdXNwZW5kVGltZW91dCgpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBzdXNwZW5kIHtAbGluayAjZ2V0U3VzcGVuZFRpbWVvdXQoKSB0aW1lb3V0IHZhbHVlfSB0aW1lIHVuaXQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRpbWUgdW5pdCBvZiB0aGUgc3VzcGVuZCB0aW1lb3V0IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBUaW1lVW5pdCBnZXRTdXNwZW5kVGltZW91dFVuaXQoKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL2ludGVybmFsL0Fic3RyYWN0SmF2YVJlc291cmNlTWV0aG9kRGlzcGF0Y2hlci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvaW50ZXJuYWwvQWJzdHJhY3RKYXZhUmVzb3VyY2VNZXRob2REaXNwYXRjaGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZlZjc1YQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL2ludGVybmFsL0Fic3RyYWN0SmF2YVJlc291cmNlTWV0aG9kRGlzcGF0Y2hlci5qYXZhCkBAIC0wLDAgKzEsMTkzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25IYW5kbGVyOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlVuZGVjbGFyZWRUaHJvd2FibGVFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbXBsZXRhYmxlRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbXBsZXRpb25TdGFnZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5TZWN1cml0eUNvbnRleHQ7CisKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLlRyYWNpbmdMb2dnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlN1YmplY3RTZWN1cml0eUNvbnRleHQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5TZXJ2ZXJUcmFjZUV2ZW50OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5pbmplY3QuQ29uZmlndXJlZFZhbGlkYXRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwucHJvY2Vzcy5NYXBwYWJsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuSW52b2NhYmxlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuaW50ZXJuYWwuUmVzb3VyY2VNZXRob2REaXNwYXRjaGVyOworCisvKioKKyAqIEFic3RyYWN0IHJlc291cmNlIG1ldGhvZCBkaXNwYXRjaGVyIHRoYXQgcHJvdmlkZXMgc2tlbGV0b24gaW1wbGVtZW50YXRpb24gb2YKKyAqIGRpc3BhdGNoaW5nIHJlcXVlc3RzIHRvIGEgcGFydGljdWxhciB7QGxpbmsgTWV0aG9kIEphdmEgbWV0aG9kfSB1c2luZyBzdXBwbGllZAorICoge0BsaW5rIEludm9jYXRpb25IYW5kbGVyIEphdmEgbWV0aG9kIGludm9jYXRpb24gaGFuZGxlcn0uCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXZhUmVzb3VyY2VNZXRob2REaXNwYXRjaGVyIGltcGxlbWVudHMgUmVzb3VyY2VNZXRob2REaXNwYXRjaGVyIHsKKworICAgIHByaXZhdGUgZmluYWwgTWV0aG9kIG1ldGhvZDsKKyAgICBwcml2YXRlIGZpbmFsIEludm9jYXRpb25IYW5kbGVyIG1ldGhvZEhhbmRsZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBJbnZvY2FibGUgcmVzb3VyY2VNZXRob2Q7CisgICAgcHJpdmF0ZSBmaW5hbCBDb25maWd1cmVkVmFsaWRhdG9yIHZhbGlkYXRvcjsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgY29tbW9uIGphdmEgcmVzb3VyY2UgbWV0aG9kIGRpc3BhdGNoZXIgc3RydWN0dXJlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZU1ldGhvZCBpbnZvY2FibGUgcmVzb3VyY2UgY2xhc3MgSmF2YSBtZXRob2QuCisgICAgICogQHBhcmFtIG1ldGhvZEhhbmRsZXIgIG1ldGhvZCBpbnZvY2F0aW9uIGhhbmRsZXIuCisgICAgICogQHBhcmFtIHZhbGlkYXRvciAgICAgIGlucHV0L291dHB1dCBwYXJhbWV0ZXIgdmFsaWRhdG9yLgorICAgICAqLworICAgIEFic3RyYWN0SmF2YVJlc291cmNlTWV0aG9kRGlzcGF0Y2hlcihmaW5hbCBJbnZvY2FibGUgcmVzb3VyY2VNZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEludm9jYXRpb25IYW5kbGVyIG1ldGhvZEhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbmZpZ3VyZWRWYWxpZGF0b3IgdmFsaWRhdG9yKSB7CisgICAgICAgIHRoaXMubWV0aG9kID0gcmVzb3VyY2VNZXRob2QuZ2V0RGVmaW5pdGlvbk1ldGhvZCgpOworICAgICAgICB0aGlzLm1ldGhvZEhhbmRsZXIgPSBtZXRob2RIYW5kbGVyOworICAgICAgICB0aGlzLnJlc291cmNlTWV0aG9kID0gcmVzb3VyY2VNZXRob2Q7CisgICAgICAgIHRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmaW5hbCBSZXNwb25zZSBkaXNwYXRjaChPYmplY3QgcmVzb3VyY2UsIENvbnRhaW5lclJlcXVlc3QgcmVxdWVzdCkgdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXNwb25zZSA9IGRvRGlzcGF0Y2gocmVzb3VyY2UsIHJlcXVlc3QpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgVHJhY2luZ0xvZ2dlci5nZXRJbnN0YW5jZShyZXF1ZXN0KS5sb2coU2VydmVyVHJhY2VFdmVudC5ESVNQQVRDSF9SRVNQT05TRSwgcmVzcG9uc2UpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXNwb25zZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNwYXRjaGluZyBmdW5jdGlvbmFsaXR5IHRvIGJlIGltcGxlbWVudGVkIGJ5IGEgY29uY3JldGUgZGlzcGF0Y2hlcgorICAgICAqIGltcGxlbWVudGF0aW9uIHN1Yi1jbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZSByZXNvdXJjZSBjbGFzcyBpbnN0YW5jZS4KKyAgICAgKiBAcGFyYW0gcmVxdWVzdCAgcmVxdWVzdCB0byBiZSBkaXNwYXRjaGVkLgorICAgICAqIEByZXR1cm4gcmVzcG9uc2UgZm9yIHRoZSBkaXNwYXRjaGVkIHJlcXVlc3QuCisgICAgICogQHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uIGluIGNhc2Ugb2YgYSBwcm9jZXNzaW5nIGVycm9yLgorICAgICAqIEBzZWUgUmVzb3VyY2VNZXRob2REaXNwYXRjaGVyI2Rpc3BhdGNoKE9iamVjdCwgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3QpCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IFJlc3BvbnNlIGRvRGlzcGF0Y2goT2JqZWN0IHJlc291cmNlLCBDb250YWluZXJSZXF1ZXN0IHJlcXVlc3QpIHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogVXNlIHRoZSB1bmRlcmx5aW5nIGludm9jYXRpb24gaGFuZGxlciB0byBpbnZva2UgdGhlIHVuZGVybHlpbmcgSmF2YSBtZXRob2QKKyAgICAgKiB3aXRoIHRoZSBzdXBwbGllZCBpbnB1dCBtZXRob2QgYXJndW1lbnQgdmFsdWVzIG9uIGEgZ2l2ZW4gcmVzb3VyY2UgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyUmVxdWVzdCBjb250YWluZXIgcmVxdWVzdC4KKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgICAgICAgICByZXNvdXJjZSBjbGFzcyBpbnN0YW5jZS4KKyAgICAgKiBAcGFyYW0gYXJncyAgICAgICAgICAgICBpbnB1dCBhcmd1bWVudCB2YWx1ZXMgZm9yIHRoZSBpbnZva2VkIEphdmEgbWV0aG9kLgorICAgICAqIEByZXR1cm4gaW52b2NhdGlvbiByZXN1bHQuCisgICAgICogQHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uIChwb3NzaWJseSB7QGxpbmsgTWFwcGFibGVFeGNlcHRpb24gbWFwcGFibGV9KQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIgZXhjZXB0aW9uIGluIGNhc2UgdGhlIGludm9jYXRpb24gZmFpbGVkLgorICAgICAqLworICAgIGZpbmFsIE9iamVjdCBpbnZva2UoZmluYWwgQ29udGFpbmVyUmVxdWVzdCBjb250YWluZXJSZXF1ZXN0LCBmaW5hbCBPYmplY3QgcmVzb3VyY2UsIGZpbmFsIE9iamVjdC4uLiBhcmdzKQorICAgICAgICAgICAgdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gVmFsaWRhdGUgcmVzb3VyY2UgY2xhc3MgJiBtZXRob2QgaW5wdXQgcGFyYW1ldGVycy4KKyAgICAgICAgICAgIGlmICh2YWxpZGF0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZVJlc291cmNlQW5kSW5wdXRQYXJhbXMocmVzb3VyY2UsIHJlc291cmNlTWV0aG9kLCBhcmdzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgUHJpdmlsZWdlZEFjdGlvbiBpbnZva2VNZXRob2RBY3Rpb24gPSBuZXcgUHJpdmlsZWdlZEFjdGlvbigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgVHJhY2luZ0xvZ2dlciB0cmFjaW5nTG9nZ2VyID0gVHJhY2luZ0xvZ2dlci5nZXRJbnN0YW5jZShjb250YWluZXJSZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyB0aW1lc3RhbXAgPSB0cmFjaW5nTG9nZ2VyLnRpbWVzdGFtcChTZXJ2ZXJUcmFjZUV2ZW50Lk1FVEhPRF9JTlZPS0UpOworICAgICAgICAgICAgICAgICAgICB0cnkgeworCisgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gbWV0aG9kSGFuZGxlci5pbnZva2UocmVzb3VyY2UsIG1ldGhvZCwgYXJncyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGEgcmVzcG9uc2UgaXMgYSBDb21wbGV0aW9uU3RhZ2UgYW5kIGlzIGRvbmUsIHdlIGRvbid0IG5lZWQgdG8gc3VzcGVuZCBhbmQgcmVzdW1lCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgQ29tcGxldGlvblN0YWdlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmUgcmVzdWx0RnV0dXJlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdEZ1dHVyZSA9ICgoQ29tcGxldGlvblN0YWdlKSByZXN1bHQpLnRvQ29tcGxldGFibGVGdXR1cmUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbXBsZXRpb25TdGFnZSBpcyBub3QgcmVxdWlyZWQgdG8gaW1wbGVtZW50ICJ0b0NvbXBsZXRhYmxlRnV0dXJlIi4gSWYgaXQgZG9lc24ndAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSB0cmVhdCBpdCBhcyAidW5jb21wbGV0ZWQiIGZ1dHVyZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0RnV0dXJlICE9IG51bGwgJiYgcmVzdWx0RnV0dXJlLmlzRG9uZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHRGdXR1cmUuaXNDYW5jZWxsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyhSZXNwb25zZS5TdGF0dXMuU0VSVklDRV9VTkFWQUlMQUJMRSkuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdEZ1dHVyZS5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24oZS5nZXRDYXVzZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHwgVW5kZWNsYXJlZFRocm93YWJsZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfUkVTT1VSQ0VfSkFWQV9NRVRIT0RfSU5WT0NBVElPTigpLCBleCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG1hcFRhcmdldFRvUnVudGltZUV4KGV4LmdldENhdXNlKCkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24odCk7CisgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFjaW5nTG9nZ2VyLmxvZ0R1cmF0aW9uKFNlcnZlclRyYWNlRXZlbnQuTUVUSE9EX0lOVk9LRSwgdGltZXN0YW1wLCByZXNvdXJjZSwgbWV0aG9kKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGZpbmFsIFNlY3VyaXR5Q29udGV4dCBzZWN1cml0eUNvbnRleHQgPSBjb250YWluZXJSZXF1ZXN0LmdldFNlY3VyaXR5Q29udGV4dCgpOworCisgICAgICAgICAgICBmaW5hbCBPYmplY3QgaW52b2NhdGlvblJlc3VsdCA9IChzZWN1cml0eUNvbnRleHQgaW5zdGFuY2VvZiBTdWJqZWN0U2VjdXJpdHlDb250ZXh0KQorICAgICAgICAgICAgICAgICAgICA/ICgoU3ViamVjdFNlY3VyaXR5Q29udGV4dCkgc2VjdXJpdHlDb250ZXh0KS5kb0FzU3ViamVjdChpbnZva2VNZXRob2RBY3Rpb24pIDogaW52b2tlTWV0aG9kQWN0aW9uLnJ1bigpOworCisgICAgICAgICAgICAvLyBWYWxpZGF0ZSByZXNwb25zZSBlbnRpdHkuCisgICAgICAgICAgICBpZiAodmFsaWRhdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB2YWxpZGF0b3IudmFsaWRhdGVSZXN1bHQocmVzb3VyY2UsIHJlc291cmNlTWV0aG9kLCBpbnZvY2F0aW9uUmVzdWx0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGludm9jYXRpb25SZXN1bHQ7CisgICAgICAgIH0gY2F0Y2ggKFZhbGlkYXRpb25FeGNlcHRpb24gZXgpIHsgLy8gaGFuZGxlIHZhbGlkYXRpb24gZXhjZXB0aW9ucyAtPiBwb3RlbnRpYWxseSBtYXBwYWJsZQorICAgICAgICAgICAgdGhyb3cgbmV3IE1hcHBhYmxlRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFJ1bnRpbWVFeGNlcHRpb24gbWFwVGFyZ2V0VG9SdW50aW1lRXgoVGhyb3dhYmxlIHRocm93YWJsZSkgeworICAgICAgICBpZiAodGhyb3dhYmxlIGluc3RhbmNlb2YgV2ViQXBwbGljYXRpb25FeGNlcHRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiAoV2ViQXBwbGljYXRpb25FeGNlcHRpb24pIHRocm93YWJsZTsKKyAgICAgICAgfQorICAgICAgICAvLyBoYW5kbGUgYWxsIGV4Y2VwdGlvbnMgYXMgcG90ZW50aWFsbHkgbWFwcGFibGUgKGluY2wuIFByb2Nlc3NpbmdFeGNlcHRpb24pCisgICAgICAgIHJldHVybiBuZXcgTWFwcGFibGVFeGNlcHRpb24odGhyb3dhYmxlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gbWV0aG9kLnRvU3RyaW5nKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9pbnRlcm5hbC9KYXZhUmVzb3VyY2VNZXRob2REaXNwYXRjaGVyUHJvdmlkZXIuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL2ludGVybmFsL0phdmFSZXNvdXJjZU1ldGhvZERpc3BhdGNoZXJQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlOGZmNmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9pbnRlcm5hbC9KYXZhUmVzb3VyY2VNZXRob2REaXNwYXRjaGVyUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDIzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmlvLkZsdXNoYWJsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25IYW5kbGVyOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY0VudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLnNzZS5Tc2VFdmVudFNpbms7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuaW5qZWN0LkNvbmZpZ3VyZWRWYWxpZGF0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLkludm9jYWJsZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUGFyYW1ldGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuaW50ZXJuYWwuUGFyYW1WYWx1ZUZhY3RvcnlXaXRoU291cmNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuaW50ZXJuYWwuUGFyYW1ldGVyVmFsdWVIZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5pbnRlcm5hbC5SZXNvdXJjZU1ldGhvZERpc3BhdGNoZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5pbnRlcm5hbC5WYWx1ZVBhcmFtUHJvdmlkZXI7CisKKy8qKgorICogQW4gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIFJlc291cmNlTWV0aG9kRGlzcGF0Y2hlci5Qcm92aWRlcn0gdGhhdAorICogY3JlYXRlcyBpbnN0YW5jZXMgb2Yge0BsaW5rIFJlc291cmNlTWV0aG9kRGlzcGF0Y2hlcn0uCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworY2xhc3MgSmF2YVJlc291cmNlTWV0aG9kRGlzcGF0Y2hlclByb3ZpZGVyIGltcGxlbWVudHMgUmVzb3VyY2VNZXRob2REaXNwYXRjaGVyLlByb3ZpZGVyIHsKKworICAgIHByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxWYWx1ZVBhcmFtUHJvdmlkZXI+IGFsbFZhbHVlUHJvdmlkZXJzOworCisgICAgSmF2YVJlc291cmNlTWV0aG9kRGlzcGF0Y2hlclByb3ZpZGVyKENvbGxlY3Rpb248VmFsdWVQYXJhbVByb3ZpZGVyPiBhbGxWYWx1ZVByb3ZpZGVycykgeworICAgICAgICB0aGlzLmFsbFZhbHVlUHJvdmlkZXJzID0gYWxsVmFsdWVQcm92aWRlcnM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc291cmNlTWV0aG9kRGlzcGF0Y2hlciBjcmVhdGUoZmluYWwgSW52b2NhYmxlIHJlc291cmNlTWV0aG9kLAorICAgICAgICAgICAgZmluYWwgSW52b2NhdGlvbkhhbmRsZXIgaW52b2NhdGlvbkhhbmRsZXIsCisgICAgICAgICAgICBmaW5hbCBDb25maWd1cmVkVmFsaWRhdG9yIHZhbGlkYXRvcikgeworICAgICAgICBmaW5hbCBMaXN0PFBhcmFtVmFsdWVGYWN0b3J5V2l0aFNvdXJjZTw/Pj4gdmFsdWVQcm92aWRlcnMgPQorICAgICAgICAgICAgICAgIFBhcmFtZXRlclZhbHVlSGVscGVyLmNyZWF0ZVZhbHVlUHJvdmlkZXJzKGFsbFZhbHVlUHJvdmlkZXJzLCByZXNvdXJjZU1ldGhvZCk7CisgICAgICAgIGZpbmFsIENsYXNzPD8+IHJldHVyblR5cGUgPSByZXNvdXJjZU1ldGhvZC5nZXRIYW5kbGluZ01ldGhvZCgpLmdldFJldHVyblR5cGUoKTsKKworICAgICAgICBSZXNvdXJjZU1ldGhvZERpc3BhdGNoZXIgcmVzb3VyY2VNZXRob2REaXNwYXRjaGVyID0gbnVsbDsKKyAgICAgICAgaWYgKFJlc3BvbnNlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20ocmV0dXJuVHlwZSkpIHsKKyAgICAgICAgICAgIHJlc291cmNlTWV0aG9kRGlzcGF0Y2hlciA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBSZXNwb25zZU91dEludm9rZXIocmVzb3VyY2VNZXRob2QsIGludm9jYXRpb25IYW5kbGVyLCB2YWx1ZVByb3ZpZGVycywgdmFsaWRhdG9yKTsKKyAgICAgICAgfSBlbHNlIGlmIChyZXR1cm5UeXBlICE9IHZvaWQuY2xhc3MpIHsKKyAgICAgICAgICAgIGlmIChyZXR1cm5UeXBlID09IE9iamVjdC5jbGFzcyB8fCBHZW5lcmljRW50aXR5LmNsYXNzLmlzQXNzaWduYWJsZUZyb20ocmV0dXJuVHlwZSkpIHsKKyAgICAgICAgICAgICAgICByZXNvdXJjZU1ldGhvZERpc3BhdGNoZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdE91dEludm9rZXIocmVzb3VyY2VNZXRob2QsIGludm9jYXRpb25IYW5kbGVyLCB2YWx1ZVByb3ZpZGVycywgdmFsaWRhdG9yKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzb3VyY2VNZXRob2REaXNwYXRjaGVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUeXBlT3V0SW52b2tlcihyZXNvdXJjZU1ldGhvZCwgaW52b2NhdGlvbkhhbmRsZXIsIHZhbHVlUHJvdmlkZXJzLCB2YWxpZGF0b3IpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gcmV0dXJuIHR5cGUgaXMgdm9pZAorICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgZm9yIChmaW5hbCBQYXJhbWV0ZXIgcGFyYW1ldGVyIDogcmVzb3VyY2VNZXRob2QuZ2V0UGFyYW1ldGVycygpKSB7CisgICAgICAgICAgICAgICAgaWYgKFNzZUV2ZW50U2luay5jbGFzcy5lcXVhbHMocGFyYW1ldGVyLmdldFJhd1R5cGUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VNZXRob2REaXNwYXRjaGVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgU3NlRXZlbnRTaW5rSW52b2tlcihyZXNvdXJjZU1ldGhvZCwgaW52b2NhdGlvbkhhbmRsZXIsIHZhbHVlUHJvdmlkZXJzLCB2YWxpZGF0b3IsIGkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocmVzb3VyY2VNZXRob2REaXNwYXRjaGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXNvdXJjZU1ldGhvZERpc3BhdGNoZXIgPSBuZXcgVm9pZE91dEludm9rZXIocmVzb3VyY2VNZXRob2QsIGludm9jYXRpb25IYW5kbGVyLCB2YWx1ZVByb3ZpZGVycywgdmFsaWRhdG9yKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXNvdXJjZU1ldGhvZERpc3BhdGNoZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgQWJzdHJhY3RNZXRob2RQYXJhbUludm9rZXIgZXh0ZW5kcyBBYnN0cmFjdEphdmFSZXNvdXJjZU1ldGhvZERpc3BhdGNoZXIgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxQYXJhbVZhbHVlRmFjdG9yeVdpdGhTb3VyY2U8Pz4+IHZhbHVlUHJvdmlkZXJzOworCisgICAgICAgIEFic3RyYWN0TWV0aG9kUGFyYW1JbnZva2VyKAorICAgICAgICAgICAgICAgIGZpbmFsIEludm9jYWJsZSByZXNvdXJjZU1ldGhvZCwKKyAgICAgICAgICAgICAgICBmaW5hbCBJbnZvY2F0aW9uSGFuZGxlciBoYW5kbGVyLAorICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8UGFyYW1WYWx1ZUZhY3RvcnlXaXRoU291cmNlPD8+PiB2YWx1ZVByb3ZpZGVycywKKyAgICAgICAgICAgICAgICBmaW5hbCBDb25maWd1cmVkVmFsaWRhdG9yIHZhbGlkYXRvcikgeworICAgICAgICAgICAgc3VwZXIocmVzb3VyY2VNZXRob2QsIGhhbmRsZXIsIHZhbGlkYXRvcik7CisgICAgICAgICAgICB0aGlzLnZhbHVlUHJvdmlkZXJzID0gdmFsdWVQcm92aWRlcnM7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBPYmplY3RbXSBnZXRQYXJhbVZhbHVlcyhDb250YWluZXJSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgICAgIHJldHVybiBQYXJhbWV0ZXJWYWx1ZUhlbHBlci5nZXRQYXJhbWV0ZXJWYWx1ZXModmFsdWVQcm92aWRlcnMsIHJlcXVlc3QpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgU3NlRXZlbnRTaW5rSW52b2tlciBleHRlbmRzIEFic3RyYWN0TWV0aG9kUGFyYW1JbnZva2VyIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBwYXJhbWV0ZXJJbmRleDsKKworICAgICAgICBTc2VFdmVudFNpbmtJbnZva2VyKAorICAgICAgICAgICAgICAgIGZpbmFsIEludm9jYWJsZSByZXNvdXJjZU1ldGhvZCwKKyAgICAgICAgICAgICAgICBmaW5hbCBJbnZvY2F0aW9uSGFuZGxlciBoYW5kbGVyLAorICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8UGFyYW1WYWx1ZUZhY3RvcnlXaXRoU291cmNlPD8+PiB2YWx1ZVByb3ZpZGVycywKKyAgICAgICAgICAgICAgICBmaW5hbCBDb25maWd1cmVkVmFsaWRhdG9yIHZhbGlkYXRvciwKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcGFyYW1ldGVySW5kZXgpIHsKKyAgICAgICAgICAgIHN1cGVyKHJlc291cmNlTWV0aG9kLCBoYW5kbGVyLCB2YWx1ZVByb3ZpZGVycywgdmFsaWRhdG9yKTsKKyAgICAgICAgICAgIHRoaXMucGFyYW1ldGVySW5kZXggPSBwYXJhbWV0ZXJJbmRleDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgUmVzcG9uc2UgZG9EaXNwYXRjaChmaW5hbCBPYmplY3QgcmVzb3VyY2UsIGZpbmFsIENvbnRhaW5lclJlcXVlc3QgcmVxdWVzdCkgdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgT2JqZWN0W10gcGFyYW1WYWx1ZXMgPSBnZXRQYXJhbVZhbHVlcyhyZXF1ZXN0KTsKKyAgICAgICAgICAgIGludm9rZShyZXF1ZXN0LCByZXNvdXJjZSwgcGFyYW1WYWx1ZXMpOworCisgICAgICAgICAgICBmaW5hbCBTc2VFdmVudFNpbmsgZXZlbnRTaW5rID0gKFNzZUV2ZW50U2luaykgcGFyYW1WYWx1ZXNbcGFyYW1ldGVySW5kZXhdOworCisgICAgICAgICAgICBpZiAoZXZlbnRTaW5rID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTc2VFdmVudFNpbmsgcGFyYW1ldGVyIGRldGVjdGVkLCBidXQgbm90IGZvdW5kLiIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudFNpbmsgaW5zdGFuY2VvZiBGbHVzaGFibGUpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAoKEZsdXNoYWJsZSkgZXZlbnRTaW5rKS5mbHVzaCgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygpLmVudGl0eShldmVudFNpbmspLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBWb2lkT3V0SW52b2tlciBleHRlbmRzIEFic3RyYWN0TWV0aG9kUGFyYW1JbnZva2VyIHsKKworICAgICAgICBWb2lkT3V0SW52b2tlcigKKyAgICAgICAgICAgICAgICBmaW5hbCBJbnZvY2FibGUgcmVzb3VyY2VNZXRob2QsCisgICAgICAgICAgICAgICAgZmluYWwgSW52b2NhdGlvbkhhbmRsZXIgaGFuZGxlciwKKyAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PFBhcmFtVmFsdWVGYWN0b3J5V2l0aFNvdXJjZTw/Pj4gdmFsdWVQcm92aWRlcnMsCisgICAgICAgICAgICAgICAgZmluYWwgQ29uZmlndXJlZFZhbGlkYXRvciB2YWxpZGF0b3IpIHsKKyAgICAgICAgICAgIHN1cGVyKHJlc291cmNlTWV0aG9kLCBoYW5kbGVyLCB2YWx1ZVByb3ZpZGVycywgdmFsaWRhdG9yKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgUmVzcG9uc2UgZG9EaXNwYXRjaChmaW5hbCBPYmplY3QgcmVzb3VyY2UsIGZpbmFsIENvbnRhaW5lclJlcXVlc3QgY29udGFpbmVyUmVxdWVzdCkgdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24geworICAgICAgICAgICAgaW52b2tlKGNvbnRhaW5lclJlcXVlc3QsIHJlc291cmNlLCBnZXRQYXJhbVZhbHVlcyhjb250YWluZXJSZXF1ZXN0KSk7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uubm9Db250ZW50KCkuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlc3BvbnNlT3V0SW52b2tlciBleHRlbmRzIEFic3RyYWN0TWV0aG9kUGFyYW1JbnZva2VyIHsKKworICAgICAgICBSZXNwb25zZU91dEludm9rZXIoCisgICAgICAgICAgICAgICAgZmluYWwgSW52b2NhYmxlIHJlc291cmNlTWV0aG9kLAorICAgICAgICAgICAgICAgIGZpbmFsIEludm9jYXRpb25IYW5kbGVyIGhhbmRsZXIsCisgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxQYXJhbVZhbHVlRmFjdG9yeVdpdGhTb3VyY2U8Pz4+IHZhbHVlUHJvdmlkZXJzLAorICAgICAgICAgICAgICAgIGZpbmFsIENvbmZpZ3VyZWRWYWxpZGF0b3IgdmFsaWRhdG9yKSB7CisgICAgICAgICAgICBzdXBlcihyZXNvdXJjZU1ldGhvZCwgaGFuZGxlciwgdmFsdWVQcm92aWRlcnMsIHZhbGlkYXRvcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIFJlc3BvbnNlIGRvRGlzcGF0Y2goT2JqZWN0IHJlc291cmNlLCBmaW5hbCBDb250YWluZXJSZXF1ZXN0IGNvbnRhaW5lclJlcXVlc3QpIHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5jbGFzcy5jYXN0KGludm9rZShjb250YWluZXJSZXF1ZXN0LCByZXNvdXJjZSwgZ2V0UGFyYW1WYWx1ZXMoY29udGFpbmVyUmVxdWVzdCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIE9iamVjdE91dEludm9rZXIgZXh0ZW5kcyBBYnN0cmFjdE1ldGhvZFBhcmFtSW52b2tlciB7CisKKyAgICAgICAgT2JqZWN0T3V0SW52b2tlcigKKyAgICAgICAgICAgICAgICBmaW5hbCBJbnZvY2FibGUgcmVzb3VyY2VNZXRob2QsCisgICAgICAgICAgICAgICAgZmluYWwgSW52b2NhdGlvbkhhbmRsZXIgaGFuZGxlciwKKyAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PFBhcmFtVmFsdWVGYWN0b3J5V2l0aFNvdXJjZTw/Pj4gdmFsdWVQcm92aWRlcnMsCisgICAgICAgICAgICAgICAgZmluYWwgQ29uZmlndXJlZFZhbGlkYXRvciB2YWxpZGF0b3IpIHsKKyAgICAgICAgICAgIHN1cGVyKHJlc291cmNlTWV0aG9kLCBoYW5kbGVyLCB2YWx1ZVByb3ZpZGVycywgdmFsaWRhdG9yKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgUmVzcG9uc2UgZG9EaXNwYXRjaChmaW5hbCBPYmplY3QgcmVzb3VyY2UsIGZpbmFsIENvbnRhaW5lclJlcXVlc3QgY29udGFpbmVyUmVxdWVzdCkgdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgT2JqZWN0IG8gPSBpbnZva2UoY29udGFpbmVyUmVxdWVzdCwgcmVzb3VyY2UsIGdldFBhcmFtVmFsdWVzKGNvbnRhaW5lclJlcXVlc3QpKTsKKworICAgICAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBSZXNwb25zZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5jbGFzcy5jYXN0KG8pOworICAgICAgICAgICAgfSBlbHNlIGlmIChvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soKS5lbnRpdHkobykuYnVpbGQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm5vQ29udGVudCgpLmJ1aWxkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBUeXBlT3V0SW52b2tlciBleHRlbmRzIEFic3RyYWN0TWV0aG9kUGFyYW1JbnZva2VyIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFR5cGUgdDsKKworICAgICAgICBUeXBlT3V0SW52b2tlcigKKyAgICAgICAgICAgICAgICBmaW5hbCBJbnZvY2FibGUgcmVzb3VyY2VNZXRob2QsCisgICAgICAgICAgICAgICAgZmluYWwgSW52b2NhdGlvbkhhbmRsZXIgaGFuZGxlciwKKyAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PFBhcmFtVmFsdWVGYWN0b3J5V2l0aFNvdXJjZTw/Pj4gdmFsdWVQcm92aWRlcnMsCisgICAgICAgICAgICAgICAgZmluYWwgQ29uZmlndXJlZFZhbGlkYXRvciB2YWxpZGF0b3IpIHsKKyAgICAgICAgICAgIHN1cGVyKHJlc291cmNlTWV0aG9kLCBoYW5kbGVyLCB2YWx1ZVByb3ZpZGVycywgdmFsaWRhdG9yKTsKKyAgICAgICAgICAgIHRoaXMudCA9IHJlc291cmNlTWV0aG9kLmdldEhhbmRsaW5nTWV0aG9kKCkuZ2V0R2VuZXJpY1JldHVyblR5cGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgUmVzcG9uc2UgZG9EaXNwYXRjaChmaW5hbCBPYmplY3QgcmVzb3VyY2UsIGZpbmFsIENvbnRhaW5lclJlcXVlc3QgY29udGFpbmVyUmVxdWVzdCkgdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgT2JqZWN0IG8gPSBpbnZva2UoY29udGFpbmVyUmVxdWVzdCwgcmVzb3VyY2UsIGdldFBhcmFtVmFsdWVzKGNvbnRhaW5lclJlcXVlc3QpKTsKKyAgICAgICAgICAgIGlmIChvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAobyBpbnN0YW5jZW9mIFJlc3BvbnNlKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5jbGFzcy5jYXN0KG8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soKS5lbnRpdHkobykuYnVpbGQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm5vQ29udGVudCgpLmJ1aWxkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9pbnRlcm5hbC9Nb2RlbEVycm9ycy5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvaW50ZXJuYWwvTW9kZWxFcnJvcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDE3ZjJlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvaW50ZXJuYWwvTW9kZWxFcnJvcnMuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkVycm9yczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNb2RlbElzc3VlOworCisvKioKKyAqIFV0aWxpdHkgdG8gdHJhbnNmb3JtIHtAbGluayBFcnJvcnMuRXJyb3JNZXNzYWdlIGVycm9yIG1lc3NhZ2VzfSB0byB7QGxpbmsgUmVzb3VyY2VNb2RlbElzc3VlfXMuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBNb2RlbEVycm9ycyB7CisKKyAgICAvKioKKyAgICAgKiBHZXQgYWxsIGZpbGVkIGVycm9yIG1lc3NhZ2VzIGFzIHtAbGluayBSZXNvdXJjZU1vZGVsSXNzdWV9cy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbm9uLW51bGwgbGlzdCBvZiByZXNvdXJjZSBtb2RlbCBpc3N1ZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0PFJlc291cmNlTW9kZWxJc3N1ZT4gZ2V0RXJyb3JzQXNSZXNvdXJjZU1vZGVsSXNzdWVzKCkgeworICAgICAgICByZXR1cm4gZ2V0RXJyb3JzQXNSZXNvdXJjZU1vZGVsSXNzdWVzKGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgZXJyb3IgbWVzc2FnZXMgZmlsZWQgYWZ0ZXIge0BsaW5rIEVycm9ycyNtYXJrKCl9IGZsYWcgd2FzIHNldCBhcyB7QGxpbmsgUmVzb3VyY2VNb2RlbElzc3VlfXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIG5vbi1udWxsIGxpc3Qgb2YgcmVzb3VyY2UgbW9kZWwgaXNzdWVzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxSZXNvdXJjZU1vZGVsSXNzdWU+IGdldEVycm9yc0FzUmVzb3VyY2VNb2RlbElzc3VlcyhmaW5hbCBib29sZWFuIGFmdGVyTWFyaykgeworICAgICAgICByZXR1cm4gRXJyb3JzLmdldEVycm9yTWVzc2FnZXMoYWZ0ZXJNYXJrKS5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgLm1hcChpbnB1dCAtPiBuZXcgUmVzb3VyY2VNb2RlbElzc3VlKGlucHV0LmdldFNvdXJjZSgpLCBpbnB1dC5nZXRNZXNzYWdlKCksIGlucHV0LmdldFNldmVyaXR5KCkpKQorICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9pbnRlcm5hbC9Nb2RlbEhlbHBlci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvaW50ZXJuYWwvTW9kZWxIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTAxNzZkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvaW50ZXJuYWwvTW9kZWxIZWxwZXIuamF2YQpAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5pbnRlcm5hbDsKKworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CisKKy8qKgorICogQ29tbW9uIG1vZGVsIGhlbHBlciBtZXRob2RzLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICogQGF1dGhvciBDb25zdGFudGlubyBDcm9uZW1iZXJnZXIgKGNjcm9uZW1iZXJnZXIgYXQgeWFob28uY29tLmJyKQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgTW9kZWxIZWxwZXIgeworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjbGFzcyBpbiB0aGUgcHJvdmlkZWQgcmVzb3VyY2UgY2xhc3MgYW5jZXN0b3IgaGllcmFyY2h5IHRoYXQKKyAgICAgKiBpcyBhY3R1YWxseSBhbm5vdGF0ZWQgd2l0aCB0aGUge0BsaW5rIGphdmF4LndzLnJzLlBhdGggJiM2NDtQYXRofSBhbm5vdGF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlQ2xhc3MgcmVzb3VyY2UgY2xhc3MuCisgICAgICogQHJldHVybiByZXNvdXJjZSBjbGFzcyBvciBpdCdzIGFuY2VzdG9yIHRoYXQgaXMgYW5ub3RhdGVkIHdpdGggdGhlIHtAbGluayBqYXZheC53cy5ycy5QYXRoICYjNjQ7UGF0aH0KKyAgICAgKiAgICAgICAgIGFubm90YXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDbGFzczw/PiBnZXRBbm5vdGF0ZWRSZXNvdXJjZUNsYXNzKGZpbmFsIENsYXNzPD8+IHJlc291cmNlQ2xhc3MpIHsKKworICAgICAgICBDbGFzczw/PiBmb3VuZEludGVyZmFjZSA9IG51bGw7CisKKyAgICAgICAgLy8gdHJhdmVyc2UgdGhlIGNsYXNzIGhpZXJhcmNoeSB0byBmaW5kIHRoZSBhbm5vdGF0aW9uCisgICAgICAgIC8vIEFjY29yZGluZyB0byBzcGVjaWZpY2F0aW9uLCBhbm5vdGF0aW9uIGluIHRoZSBzdXBlci1jbGFzc2VzIG11c3QgdGFrZSBwcmVjZWRlbmNlIG92ZXIgYW5ub3RhdGlvbiBpbiB0aGUKKyAgICAgICAgLy8gaW1wbGVtZW50ZWQgaW50ZXJmYWNlcworICAgICAgICBDbGFzczw/PiBjbHMgPSByZXNvdXJjZUNsYXNzOworICAgICAgICBkbyB7CisgICAgICAgICAgICBpZiAoY2xzLmlzQW5ub3RhdGlvblByZXNlbnQoUGF0aC5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2xzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBpZiBubyBhbm5vdGF0aW9uIGZvdW5kIG9uIHRoZSBjbGFzcyBjdXJyZW50bHkgdHJhdmVyc2VkLCBjaGVjayBmb3IgYW5ub3RhdGlvbiBpbiB0aGUgaW50ZXJmYWNlcyBvbiB0aGlzCisgICAgICAgICAgICAvLyBsZXZlbCAtIGlmIG5vdCBhbHJlYWR5IHByZXZpb3VzbHkgZm91bmQKKyAgICAgICAgICAgIGlmIChmb3VuZEludGVyZmFjZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZm9yIChmaW5hbCBDbGFzczw/PiBpIDogY2xzLmdldEludGVyZmFjZXMoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaS5pc0Fubm90YXRpb25QcmVzZW50KFBhdGguY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdG9yZSB0aGUgaW50ZXJmYWNlIHJlZmVyZW5jZSBpbiBjYXNlIG5vIGFubm90YXRpb24gd2lsbCBiZSBmb3VuZCBpbiB0aGUgc3VwZXItY2xhc3NlcworICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRJbnRlcmZhY2UgPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKChjbHMgPSBjbHMuZ2V0U3VwZXJjbGFzcygpKSAhPSBudWxsKTsKKworICAgICAgICBpZiAoZm91bmRJbnRlcmZhY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZvdW5kSW50ZXJmYWNlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc291cmNlQ2xhc3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJldmVudCBpbnN0YW50aWF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgTW9kZWxIZWxwZXIoKSB7CisgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiSW5zdGFudGlhdGlvbiBub3QgYWxsb3dlZC4iKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9pbnRlcm5hbC9Nb2RlbFByb2Nlc3NvclV0aWwuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL2ludGVybmFsL01vZGVsUHJvY2Vzc29yVXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2OGEzZDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9pbnRlcm5hbC9Nb2RlbFByb2Nlc3NvclV0aWwuamF2YQpAQCAtMCwwICsxLDM1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLkh0dHBNZXRob2Q7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLkluZmxlY3RvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTWV0aG9kOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1vZGVsOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SdW50aW1lUmVzb3VyY2U7CisKKy8qKgorICogSGVscGVyIGNsYXNzIHdpdGggbWV0aG9kcyBzdXBwb3J0aW5nIHByb2Nlc3NpbmcgcmVzb3VyY2UgbW9kZWwgYnkge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5Nb2RlbFByb2Nlc3NvcgorICogbW9kZWwgcHJvY2Vzc29yc30uCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBNb2RlbFByb2Nlc3NvclV0aWwgeworCisgICAgcHJpdmF0ZSBNb2RlbFByb2Nlc3NvclV0aWwoKSB7CisgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiSW5zdGFudGlhdGlvbiBub3QgYWxsb3dlZC4iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYWxsb3dlZCBtZXRob2RzIGZvciB0aGUgZ2l2ZW4ge0Bjb2RlIHJlc291cmNlfS4gT1BUSU9OUyBhbmQgSEVBRCBhcmUgYWx3YXlzIHJldHVybmVkIGluIHRoZSByZXN1bHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgUmVzb3VyY2UgZm9yIHdoaWNoIHJlc291cmNlIG1ldGhvZHMgc2hvdWxkIGJlIGZvdW5kLgorICAgICAqIEByZXR1cm4gU2V0IG9mIHJlc291cmNlIG1ldGhvZHMgdGhhdCBjYW4gYmUgaW52b2tlZCBvbiB0aGUgZ2l2ZW4gcmVzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTZXQ8U3RyaW5nPiBnZXRBbGxvd2VkTWV0aG9kcyhSdW50aW1lUmVzb3VyY2UgcmVzb3VyY2UpIHsKKyAgICAgICAgYm9vbGVhbiBnZXRGb3VuZCA9IGZhbHNlOworICAgICAgICBTZXQ8U3RyaW5nPiBhbGxvd2VkTWV0aG9kcyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgZm9yIChSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCA6IHJlc291cmNlLmdldFJlc291cmNlTWV0aG9kcygpKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaHR0cE1ldGhvZCA9IHJlc291cmNlTWV0aG9kLmdldEh0dHBNZXRob2QoKTsKKyAgICAgICAgICAgIGFsbG93ZWRNZXRob2RzLmFkZChodHRwTWV0aG9kKTsKKyAgICAgICAgICAgIGlmICghZ2V0Rm91bmQgJiYgaHR0cE1ldGhvZC5lcXVhbHMoSHR0cE1ldGhvZC5HRVQpKSB7CisgICAgICAgICAgICAgICAgZ2V0Rm91bmQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFsbG93ZWRNZXRob2RzLmFkZChIdHRwTWV0aG9kLk9QVElPTlMpOworICAgICAgICBpZiAoZ2V0Rm91bmQpIHsKKyAgICAgICAgICAgIGFsbG93ZWRNZXRob2RzLmFkZChIdHRwTWV0aG9kLkhFQUQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbGxvd2VkTWV0aG9kczsKKyAgICB9CisKKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNNZXRob2RPdmVycmlkZGVuKFJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kLCBTdHJpbmcgaHR0cE1ldGhvZCwgTWVkaWFUeXBlIGNvbnN1bWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBwcm9kdWNlcykgeworICAgICAgICBpZiAoIXJlc291cmNlTWV0aG9kLmdldEh0dHBNZXRob2QoKS5lcXVhbHMoaHR0cE1ldGhvZCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBib29sZWFuIGNvbnN1bWVzTWF0Y2ggPSBvdmVycmlkZXMocmVzb3VyY2VNZXRob2QuZ2V0Q29uc3VtZWRUeXBlcygpLCBjb25zdW1lcyk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gcHJvZHVjZXNNYXRjaCA9IG92ZXJyaWRlcyhyZXNvdXJjZU1ldGhvZC5nZXRQcm9kdWNlZFR5cGVzKCksIHByb2R1Y2VzKTsKKyAgICAgICAgcmV0dXJuIGNvbnN1bWVzTWF0Y2ggJiYgcHJvZHVjZXNNYXRjaDsKKyAgICB9CisKKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gb3ZlcnJpZGVzKExpc3Q8TWVkaWFUeXBlPiBtZWRpYVR5cGVzLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIGlmIChtZWRpYVR5cGVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChNZWRpYVR5cGUgbXQgOiBtZWRpYVR5cGVzKSB7CisgICAgICAgICAgICBpZiAob3ZlcnJpZGVzKG10LCBtZWRpYVR5cGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBvdmVycmlkZXMoTWVkaWFUeXBlIG10MSwgTWVkaWFUeXBlIG10MikgeworICAgICAgICByZXR1cm4gbXQxLmlzV2lsZGNhcmRUeXBlKCkKKyAgICAgICAgICAgICAgICB8fCAobXQxLmdldFR5cGUoKS5lcXVhbHMobXQyLmdldFR5cGUoKSkgJiYgKG10MS5pc1dpbGRjYXJkU3VidHlwZSgpIHx8IG10MS5nZXRTdWJ0eXBlKCkuZXF1YWxzKG10Mi5nZXRTdWJ0eXBlKCkKKyAgICAgICAgKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ldGhvZCBiZWFuIGNvbnRhaW5pbmcgYmFzaWMgaW5mb3JtYXRpb24gYWJvdXQgZW5oYW5jaW5nIHJlc291cmNlIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1ldGhvZCB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaHR0cE1ldGhvZDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcGF0aDsKKworICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8TWVkaWFUeXBlPiBjb25zdW1lczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PE1lZGlhVHlwZT4gcHJvZHVjZXM7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDbGFzczw/IGV4dGVuZHMgSW5mbGVjdG9yPENvbnRhaW5lclJlcXVlc3RDb250ZXh0LCBSZXNwb25zZT4+IGluZmxlY3RvckNsYXNzOworICAgICAgICBwcml2YXRlIGZpbmFsIEluZmxlY3RvcjxDb250YWluZXJSZXF1ZXN0Q29udGV4dCwgUmVzcG9uc2U+IGluZmxlY3RvcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIG5ldyBtZXRob2QgaW5zdGFuY2UuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwYXRoIHJlbGF0aXZlIHBhdGggb2YgdGhlIG1ldGhvZC4KKyAgICAgICAgICogQHBhcmFtIGh0dHBNZXRob2QgSFRUUCBtZXRob2QgKGVnLiBHRVQsIFBPU1QsIE9QVElPTlMpLgorICAgICAgICAgKiBAcGFyYW0gY29uc3VtZXMgQ29uc3VtZWQgbWVkaWEgdHlwZS4KKyAgICAgICAgICogQHBhcmFtIHByb2R1Y2VzIFByb2R1Y2VzIG1lZGlhIHR5cGUuCisgICAgICAgICAqIEBwYXJhbSBpbmZsZWN0b3IgSW5mbGVjdG9yIGhhbmRsaW5nIHRoZSByZXNvdXJjZSBtZXRob2QuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTWV0aG9kKFN0cmluZyBwYXRoLCBTdHJpbmcgaHR0cE1ldGhvZCwgTWVkaWFUeXBlIGNvbnN1bWVzLCBNZWRpYVR5cGUgcHJvZHVjZXMsCisgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M8PyBleHRlbmRzIEluZmxlY3RvcjxDb250YWluZXJSZXF1ZXN0Q29udGV4dCwgUmVzcG9uc2U+PiBpbmZsZWN0b3IpIHsKKyAgICAgICAgICAgIHRoaXMocGF0aCwgaHR0cE1ldGhvZCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChjb25zdW1lcyksIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QocHJvZHVjZXMpLCBpbmZsZWN0b3IpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBuZXcgbWV0aG9kIGluc3RhbmNlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcGF0aCByZWxhdGl2ZSBwYXRoIG9mIHRoZSBtZXRob2QuCisgICAgICAgICAqIEBwYXJhbSBodHRwTWV0aG9kIEhUVFAgbWV0aG9kIChlZy4gR0VULCBQT1NULCBPUFRJT05TKS4KKyAgICAgICAgICogQHBhcmFtIGNvbnN1bWVzIENvbnN1bWVkIG1lZGlhIHR5cGVzLgorICAgICAgICAgKiBAcGFyYW0gcHJvZHVjZXMgUHJvZHVjZXMgbWVkaWEgdHlwZXMuCisgICAgICAgICAqIEBwYXJhbSBpbmZsZWN0b3JDbGFzcyBJbmZsZWN0b3IgaGFuZGxpbmcgdGhlIHJlc291cmNlIG1ldGhvZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBNZXRob2QoU3RyaW5nIHBhdGgsIFN0cmluZyBodHRwTWV0aG9kLCBMaXN0PE1lZGlhVHlwZT4gY29uc3VtZXMsIExpc3Q8TWVkaWFUeXBlPiBwcm9kdWNlcywKKyAgICAgICAgICAgICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgSW5mbGVjdG9yPENvbnRhaW5lclJlcXVlc3RDb250ZXh0LCBSZXNwb25zZT4+IGluZmxlY3RvckNsYXNzKSB7CisgICAgICAgICAgICB0aGlzLnBhdGggPSBwYXRoOworICAgICAgICAgICAgdGhpcy5odHRwTWV0aG9kID0gaHR0cE1ldGhvZDsKKyAgICAgICAgICAgIHRoaXMuY29uc3VtZXMgPSBjb25zdW1lczsKKyAgICAgICAgICAgIHRoaXMucHJvZHVjZXMgPSBwcm9kdWNlczsKKyAgICAgICAgICAgIHRoaXMuaW5mbGVjdG9yQ2xhc3MgPSBpbmZsZWN0b3JDbGFzczsKKyAgICAgICAgICAgIHRoaXMuaW5mbGVjdG9yID0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgbmV3IG1ldGhvZCBpbnN0YW5jZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGh0dHBNZXRob2QgSFRUUCBtZXRob2QgKGVnLiBHRVQsIFBPU1QsIE9QVElPTlMpLgorICAgICAgICAgKiBAcGFyYW0gY29uc3VtZXMgQ29uc3VtZWQgbWVkaWEgdHlwZS4KKyAgICAgICAgICogQHBhcmFtIHByb2R1Y2VzIFByb2R1Y2VzIG1lZGlhIHR5cGUuCisgICAgICAgICAqIEBwYXJhbSBpbmZsZWN0b3IgSW5mbGVjdG9yIGhhbmRsaW5nIHRoZSByZXNvdXJjZSBtZXRob2QuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTWV0aG9kKFN0cmluZyBodHRwTWV0aG9kLCBNZWRpYVR5cGUgY29uc3VtZXMsIE1lZGlhVHlwZSBwcm9kdWNlcywKKyAgICAgICAgICAgICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgSW5mbGVjdG9yPENvbnRhaW5lclJlcXVlc3RDb250ZXh0LCBSZXNwb25zZT4+IGluZmxlY3RvcikgeworICAgICAgICAgICAgdGhpcyhudWxsLCBodHRwTWV0aG9kLCBjb25zdW1lcywgcHJvZHVjZXMsIGluZmxlY3Rvcik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIG5ldyBtZXRob2QgaW5zdGFuY2UuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBodHRwTWV0aG9kIEhUVFAgbWV0aG9kIChlZy4gR0VULCBQT1NULCBPUFRJT05TKS4KKyAgICAgICAgICogQHBhcmFtIGNvbnN1bWVzIENvbnN1bWVkIG1lZGlhIHR5cGVzLgorICAgICAgICAgKiBAcGFyYW0gcHJvZHVjZXMgUHJvZHVjZXMgbWVkaWEgdHlwZXMuCisgICAgICAgICAqIEBwYXJhbSBpbmZsZWN0b3IgSW5mbGVjdG9yIGhhbmRsaW5nIHRoZSByZXNvdXJjZSBtZXRob2QuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTWV0aG9kKFN0cmluZyBodHRwTWV0aG9kLCBMaXN0PE1lZGlhVHlwZT4gY29uc3VtZXMsIExpc3Q8TWVkaWFUeXBlPiBwcm9kdWNlcywKKyAgICAgICAgICAgICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgSW5mbGVjdG9yPENvbnRhaW5lclJlcXVlc3RDb250ZXh0LCBSZXNwb25zZT4+IGluZmxlY3RvcikgeworICAgICAgICAgICAgdGhpcyhudWxsLCBodHRwTWV0aG9kLCBjb25zdW1lcywgcHJvZHVjZXMsIGluZmxlY3Rvcik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIG5ldyBtZXRob2QgaW5zdGFuY2UuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwYXRoIHJlbGF0aXZlIHBhdGggb2YgdGhlIG1ldGhvZC4KKyAgICAgICAgICogQHBhcmFtIGh0dHBNZXRob2QgSFRUUCBtZXRob2QgKGVnLiBHRVQsIFBPU1QsIE9QVElPTlMpLgorICAgICAgICAgKiBAcGFyYW0gY29uc3VtZXMgQ29uc3VtZWQgbWVkaWEgdHlwZXMuCisgICAgICAgICAqIEBwYXJhbSBwcm9kdWNlcyBQcm9kdWNlcyBtZWRpYSB0eXBlcy4KKyAgICAgICAgICogQHBhcmFtIGluZmxlY3RvciBJbmZsZWN0b3IgaGFuZGxpbmcgdGhlIHJlc291cmNlIG1ldGhvZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBNZXRob2QoU3RyaW5nIHBhdGgsIFN0cmluZyBodHRwTWV0aG9kLCBMaXN0PE1lZGlhVHlwZT4gY29uc3VtZXMsIExpc3Q8TWVkaWFUeXBlPiBwcm9kdWNlcywKKyAgICAgICAgICAgICAgICAgICAgICBJbmZsZWN0b3I8Q29udGFpbmVyUmVxdWVzdENvbnRleHQsIFJlc3BvbnNlPiBpbmZsZWN0b3IpIHsKKyAgICAgICAgICAgIHRoaXMucGF0aCA9IHBhdGg7CisgICAgICAgICAgICB0aGlzLmh0dHBNZXRob2QgPSBodHRwTWV0aG9kOworICAgICAgICAgICAgdGhpcy5jb25zdW1lcyA9IGNvbnN1bWVzOworICAgICAgICAgICAgdGhpcy5wcm9kdWNlcyA9IHByb2R1Y2VzOworICAgICAgICAgICAgdGhpcy5pbmZsZWN0b3JDbGFzcyA9IG51bGw7CisgICAgICAgICAgICB0aGlzLmluZmxlY3RvciA9IGluZmxlY3RvcjsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgbmV3IG1ldGhvZCBpbnN0YW5jZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHBhdGggcmVsYXRpdmUgcGF0aCBvZiB0aGUgbWV0aG9kLgorICAgICAgICAgKiBAcGFyYW0gaHR0cE1ldGhvZCBIVFRQIG1ldGhvZCAoZWcuIEdFVCwgUE9TVCwgT1BUSU9OUykuCisgICAgICAgICAqIEBwYXJhbSBjb25zdW1lcyBDb25zdW1lZCBtZWRpYSB0eXBlLgorICAgICAgICAgKiBAcGFyYW0gcHJvZHVjZXMgUHJvZHVjZXMgbWVkaWEgdHlwZS4KKyAgICAgICAgICogQHBhcmFtIGluZmxlY3RvciBJbmZsZWN0b3IgaGFuZGxpbmcgdGhlIHJlc291cmNlIG1ldGhvZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBNZXRob2QoU3RyaW5nIHBhdGgsIFN0cmluZyBodHRwTWV0aG9kLCBNZWRpYVR5cGUgY29uc3VtZXMsIE1lZGlhVHlwZSBwcm9kdWNlcywKKyAgICAgICAgICAgICAgICAgICAgICBJbmZsZWN0b3I8Q29udGFpbmVyUmVxdWVzdENvbnRleHQsIFJlc3BvbnNlPiBpbmZsZWN0b3IpIHsKKyAgICAgICAgICAgIHRoaXMocGF0aCwgaHR0cE1ldGhvZCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChjb25zdW1lcyksIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QocHJvZHVjZXMpLCBpbmZsZWN0b3IpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBuZXcgbWV0aG9kIGluc3RhbmNlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gaHR0cE1ldGhvZCBIVFRQIG1ldGhvZCAoZWcuIEdFVCwgUE9TVCwgT1BUSU9OUykuCisgICAgICAgICAqIEBwYXJhbSBjb25zdW1lcyBDb25zdW1lZCBtZWRpYSB0eXBlLgorICAgICAgICAgKiBAcGFyYW0gcHJvZHVjZXMgUHJvZHVjZXMgbWVkaWEgdHlwZS4KKyAgICAgICAgICogQHBhcmFtIGluZmxlY3RvciBJbmZsZWN0b3IgaGFuZGxpbmcgdGhlIHJlc291cmNlIG1ldGhvZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBNZXRob2QoU3RyaW5nIGh0dHBNZXRob2QsIE1lZGlhVHlwZSBjb25zdW1lcywgTWVkaWFUeXBlIHByb2R1Y2VzLAorICAgICAgICAgICAgICAgICAgICAgIEluZmxlY3RvcjxDb250YWluZXJSZXF1ZXN0Q29udGV4dCwgUmVzcG9uc2U+IGluZmxlY3RvcikgeworICAgICAgICAgICAgdGhpcyhudWxsLCBodHRwTWV0aG9kLCBjb25zdW1lcywgcHJvZHVjZXMsIGluZmxlY3Rvcik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIG5ldyBtZXRob2QgaW5zdGFuY2UuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBodHRwTWV0aG9kIEhUVFAgbWV0aG9kIChlZy4gR0VULCBQT1NULCBPUFRJT05TKS4KKyAgICAgICAgICogQHBhcmFtIGNvbnN1bWVzIENvbnN1bWVkIG1lZGlhIHR5cGVzLgorICAgICAgICAgKiBAcGFyYW0gcHJvZHVjZXMgUHJvZHVjZXMgbWVkaWEgdHlwZXMuCisgICAgICAgICAqIEBwYXJhbSBpbmZsZWN0b3IgSW5mbGVjdG9yIGhhbmRsaW5nIHRoZSByZXNvdXJjZSBtZXRob2QuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTWV0aG9kKFN0cmluZyBodHRwTWV0aG9kLCBMaXN0PE1lZGlhVHlwZT4gY29uc3VtZXMsIExpc3Q8TWVkaWFUeXBlPiBwcm9kdWNlcywKKyAgICAgICAgICAgICAgICAgICAgICBJbmZsZWN0b3I8Q29udGFpbmVyUmVxdWVzdENvbnRleHQsIFJlc3BvbnNlPiBpbmZsZWN0b3IpIHsKKyAgICAgICAgICAgIHRoaXMobnVsbCwgaHR0cE1ldGhvZCwgY29uc3VtZXMsIHByb2R1Y2VzLCBpbmZsZWN0b3IpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5oYW5jZSB7QGNvZGUgcmVzb3VyY2VNb2RlbH0gd2l0aCBhIGxpc3Qgb2YgYWRkaXRpb25hbCBtZXRob2RzLgorICAgICAqCisgICAgICogVGhlIHtAY29kZSByZXNvdXJjZU1vZGVsfSBpcyB0cmF2ZXJzZWQgYW5kIGZvciBlYWNoIGF2YWlsYWJsZSBydW50aW1lIHJlc291cmNlIFVSSSBpbiB0aGUgbW9kZWwge0Bjb2RlIG1ldGhvZHN9IGFyZSBhZGRlZC4KKyAgICAgKiBJbiBjYXNlIG9mIG1ldGhvZCBjb25mbGljdHMsIHRoZSBleGlzdGluZyByZXNvdXJjZSBtZXRob2RzIHdpbGwgYmUgcHJlc2VydmVkIGFuZCB3aWxsIG5vdCBiZSAnb3ZlcnJpZGRlbicgYnkgYW55IG5ldworICAgICAqIG1ldGhvZCBmcm9tIHRoZSB7QGNvZGUgbWV0aG9kc30gbGlzdC4gT3ZlcnJpZGluZyBjaGVjayB0YWtlcyBpbnRvIGFjY291bnQgbWVkaWEgdHlwZXMgb2YgbWV0aG9kcyBzbworICAgICAqIHRoYXQgbmV3IHJlc291cmNlIG1ldGhvZHMgd2l0aCBzYW1lIEhUVFAgbWV0aG9kIGNhbiBiZSBkZWZpbmVkIG9ubHkgZm9yIGEgbW9yZSBtb3JlIHNwZWNpZmljIG1lZGlhIHR5cGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VNb2RlbCBSZXNvdXJjZSBtb2RlbCB0byBiZSBlbmhhbmNlZC4KKyAgICAgKiBAcGFyYW0gc3ViUmVzb3VyY2VNb2RlbCB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHtAY29kZSByZXNvdXJjZU1vZGVsfSB0byBiZSBlbmhhbmNlZCBpcyBhIHN1YiByZXNvdXJjZSBtb2RlbCwge0Bjb2RlIGZhbHNlfQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGl0IGlzIGFwcGxpY2F0aW9uIHJlc291cmNlIG1vZGVsLgorICAgICAqIEBwYXJhbSBtZXRob2RzIExpc3Qgb2YgZW5oYW5jaW5nIG1ldGhvZHMuCisgICAgICogQHBhcmFtIGV4dGVuZGVkRmxhZyBUaGlzIGZsYWcgd2lsbCBpbml0aWFsaXplIHRoZSBwcm9wZXJ0eQorICAgICAqICAgICAgICAgICAgICAgICAge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1ldGhvZCNpc0V4dGVuZGVkKCl9LgorICAgICAqCisgICAgICogQHJldHVybiBOZXcgcmVzb3VyY2UgbW9kZWwgYnVpbGRlciBlbmhhbmNlZCBieSB7QGNvZGUgbWV0aG9kc30uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZU1vZGVsLkJ1aWxkZXIgZW5oYW5jZVJlc291cmNlTW9kZWwoUmVzb3VyY2VNb2RlbCByZXNvdXJjZU1vZGVsLCBib29sZWFuIHN1YlJlc291cmNlTW9kZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxNZXRob2Q+IG1ldGhvZHMsIGJvb2xlYW4gZXh0ZW5kZWRGbGFnKSB7CisgICAgICAgIFJlc291cmNlTW9kZWwuQnVpbGRlciBuZXdNb2RlbEJ1aWxkZXIgPSBuZXcgUmVzb3VyY2VNb2RlbC5CdWlsZGVyKHJlc291cmNlTW9kZWwsIHN1YlJlc291cmNlTW9kZWwpOworCisgICAgICAgIGZvciAoUnVudGltZVJlc291cmNlIHJlc291cmNlIDogcmVzb3VyY2VNb2RlbC5nZXRSdW50aW1lUmVzb3VyY2VNb2RlbCgpLmdldFJ1bnRpbWVSZXNvdXJjZXMoKSkgeworICAgICAgICAgICAgZW5oYW5jZVJlc291cmNlKHJlc291cmNlLCBuZXdNb2RlbEJ1aWxkZXIsIG1ldGhvZHMsIGV4dGVuZGVkRmxhZyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ld01vZGVsQnVpbGRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmhhbmNlIHRoZSBydW50aW1lIHJlc291cmNlIHJlZmVyZW5jZWQgYnkge0Bjb2RlIHJlc291cmNlfSBwYXJhbWV0ZXIgd2l0aCBhIGxpc3Qgb2YgYWRkaXRpb25hbCBtZXRob2RzLgorICAgICAqCisgICAgICogVGhlIG5ldyB7QGNvZGUgbWV0aG9kc30gYXJlIGFkZGVkIHRvIHRoZSBydW50aW1lIHJlc291cmNlLiBJbiBjYXNlIG9mIG1ldGhvZCBjb25mbGljdHMsIHRoZSBleGlzdGluZyByZXNvdXJjZSBtZXRob2RzCisgICAgICogd2lsbCBiZSBwcmVzZXJ2ZWQgYW5kIHdpbGwgbm90IGJlICdvdmVycmlkZGVuJyBieSBhbnkgbmV3IG1ldGhvZCBmcm9tIHRoZSB7QGNvZGUgbWV0aG9kc30gbGlzdC4KKyAgICAgKiBPdmVycmlkaW5nIGNoZWNrIHRha2VzIGludG8gYWNjb3VudCBtZWRpYSB0eXBlcyBvZiBtZXRob2RzIHNvIHRoYXQgbmV3IHJlc291cmNlIG1ldGhvZHMgd2l0aCBzYW1lIEhUVFAgbWV0aG9kCisgICAgICogY2FuIGJlIGRlZmluZWQgb25seSBmb3IgYSBtb3JlIG1vcmUgc3BlY2lmaWMgbWVkaWEgdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZSBSdW50aW1lIHJlc291cmNlIHRvIGJlIGVuaGFuY2VkLgorICAgICAqIEBwYXJhbSBlbmhhbmNlZE1vZGVsQnVpbGRlciBCdWlsZGVyIGZvciB0aGUgZW5oYW5jZWQgcmVzb3VyY2UgbW9kZWwgdG8gYmUgdXNlZC4KKyAgICAgKiBAcGFyYW0gbWV0aG9kcyBMaXN0IG9mIGVuaGFuY2luZyBtZXRob2RzLgorICAgICAqIEBwYXJhbSBleHRlbmRlZCBUaGlzIGZsYWcgd2lsbCBpbml0aWFsaXplIHRoZSBwcm9wZXJ0eQorICAgICAqICAgICAgICAgICAgICAgICAge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1ldGhvZCNpc0V4dGVuZGVkKCl9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBlbmhhbmNlUmVzb3VyY2UoUnVudGltZVJlc291cmNlIHJlc291cmNlLCBSZXNvdXJjZU1vZGVsLkJ1aWxkZXIgZW5oYW5jZWRNb2RlbEJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PE1ldGhvZD4gbWV0aG9kcywgYm9vbGVhbiBleHRlbmRlZCkgeworICAgICAgICBmaW5hbCBSZXNvdXJjZSBmaXJzdFJlc291cmNlID0gcmVzb3VyY2UuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApOworCisgICAgICAgIGlmIChtZXRob2RzU3VpdGFibGVGb3JSZXNvdXJjZShmaXJzdFJlc291cmNlLCBtZXRob2RzKSkgeworICAgICAgICAgICAgZm9yIChNZXRob2QgbWV0aG9kIDogbWV0aG9kcykgeworICAgICAgICAgICAgICAgIGZpbmFsIFNldDxNZWRpYVR5cGU+IHByb2R1Y2VzID0gbmV3IEhhc2hTZXQ8PihtZXRob2QucHJvZHVjZXMpOworCisgICAgICAgICAgICAgICAgZm9yIChSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCA6IHJlc291cmNlLmdldFJlc291cmNlTWV0aG9kcygpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoZmluYWwgTWVkaWFUeXBlIHByb2R1Y2UgOiBtZXRob2QucHJvZHVjZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChNb2RlbFByb2Nlc3NvclV0aWwuaXNNZXRob2RPdmVycmlkZGVuKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZU1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmh0dHBNZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5jb25zdW1lcy5nZXQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjZXMucmVtb3ZlKHByb2R1Y2UpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKCFwcm9kdWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVzb3VyY2UgcGFyZW50UmVzb3VyY2UgPSByZXNvdXJjZS5nZXRQYXJlbnRSZXNvdXJjZXMoKS5nZXQoMCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRSZXNvdXJjZSAhPSBudWxsICYmIG1ldGhvZC5wYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVzb3VyY2UuQnVpbGRlciByZXNvdXJjZUJ1aWxkZXIgPSBSZXNvdXJjZS5idWlsZGVyKGZpcnN0UmVzb3VyY2UuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVzb3VyY2UuQnVpbGRlciBidWlsZGVyID0gbWV0aG9kLnBhdGggIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gcmVzb3VyY2VCdWlsZGVyLmFkZENoaWxkUmVzb3VyY2UobWV0aG9kLnBhdGgpIDogcmVzb3VyY2VCdWlsZGVyOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZU1ldGhvZC5CdWlsZGVyIG1ldGhvZEJ1aWxkZXIgPSBidWlsZGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZE1ldGhvZChtZXRob2QuaHR0cE1ldGhvZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29uc3VtZXMobWV0aG9kLmNvbnN1bWVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9kdWNlcyhwcm9kdWNlcyk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZC5pbmZsZWN0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kQnVpbGRlci5oYW5kbGVkQnkobWV0aG9kLmluZmxlY3Rvcik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RCdWlsZGVyLmhhbmRsZWRCeShtZXRob2QuaW5mbGVjdG9yQ2xhc3MpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1ldGhvZEJ1aWxkZXIuZXh0ZW5kZWQoZXh0ZW5kZWQpOworCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlc291cmNlIG5ld1Jlc291cmNlID0gcmVzb3VyY2VCdWlsZGVyLmJ1aWxkKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRSZXNvdXJjZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZS5CdWlsZGVyIHBhcmVudEJ1aWxkZXIgPSBSZXNvdXJjZS5idWlsZGVyKHBhcmVudFJlc291cmNlLmdldFBhdGgoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRCdWlsZGVyLmFkZENoaWxkUmVzb3VyY2UobmV3UmVzb3VyY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgZW5oYW5jZWRNb2RlbEJ1aWxkZXIuYWRkUmVzb3VyY2UocGFyZW50QnVpbGRlci5idWlsZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuaGFuY2VkTW9kZWxCdWlsZGVyLmFkZFJlc291cmNlKG5ld1Jlc291cmNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoUnVudGltZVJlc291cmNlIGNoaWxkIDogcmVzb3VyY2UuZ2V0Q2hpbGRSdW50aW1lUmVzb3VyY2VzKCkpIHsKKyAgICAgICAgICAgIGVuaGFuY2VSZXNvdXJjZShjaGlsZCwgZW5oYW5jZWRNb2RlbEJ1aWxkZXIsIG1ldGhvZHMsIGV4dGVuZGVkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgZ2l2ZW4gbWV0aG9kcyBjYW4gZW5oYW5jZSB0aGUgcmVzb3VyY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgcmVzb3VyY2UgdG8gYWRkIHRoZSBtZXRob2RzIHRvLgorICAgICAqIEBwYXJhbSBtZXRob2RzIG1ldGhvZHMgdG8gYWRkLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIG1ldGhvZHMgY2FuIGVuaGFuY2UgdGhlIHJlc291cmNlLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIG1ldGhvZHNTdWl0YWJsZUZvclJlc291cmNlKGZpbmFsIFJlc291cmNlIHJlc291cmNlLCBmaW5hbCBMaXN0PE1ldGhvZD4gbWV0aG9kcykgeworICAgICAgICBpZiAoIXJlc291cmNlLmdldFJlc291cmNlTWV0aG9kcygpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gaGFuZGxlciBjbGFzc2VzL2luc3RhbmNlcyB3ZSB3YW50IHRvIGFkZCBvbmx5IG5vbi1IRUFEIC8gbm9uLU9QVElPTlMgbWV0aG9kcy4KKyAgICAgICAgaWYgKHJlc291cmNlLmdldEhhbmRsZXJJbnN0YW5jZXMoKS5pc0VtcHR5KCkgJiYgcmVzb3VyY2UuZ2V0SGFuZGxlckNsYXNzZXMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGZvciAoZmluYWwgTWV0aG9kIG1ldGhvZCA6IG1ldGhvZHMpIHsKKyAgICAgICAgICAgICAgICBpZiAoIUh0dHBNZXRob2QuSEVBRC5lcXVhbHMobWV0aG9kLmh0dHBNZXRob2QpICYmICFIdHRwTWV0aG9kLk9QVElPTlMuZXF1YWxzKG1ldGhvZC5odHRwTWV0aG9kKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL2ludGVybmFsL1Jlc291cmNlTWV0aG9kRGlzcGF0Y2hlckZhY3RvcnkuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL2ludGVybmFsL1Jlc291cmNlTWV0aG9kRGlzcGF0Y2hlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGNmMjA0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvaW50ZXJuYWwvUmVzb3VyY2VNZXRob2REaXNwYXRjaGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLmludGVybmFsOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvbkhhbmRsZXI7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuaW5qZWN0LkNvbmZpZ3VyZWRWYWxpZGF0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLkludm9jYWJsZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLmludGVybmFsLlJlc291cmNlTWV0aG9kRGlzcGF0Y2hlcjsKKworLyoqCisgKiBBIHJlc291cmNlIG1ldGhvZCBkaXNwYXRjaGVyIHByb3ZpZGVyIGZhY3RvcnkuCisgKiA8cD4KKyAqIFRoaXMgY2xhc3MgaXMgdXNlZCBieSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTWV0aG9kSW52b2tlcn0gdG8KKyAqIGNyZWF0ZSBhIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLmludGVybmFsLlJlc291cmNlTWV0aG9kRGlzcGF0Y2hlci5Qcm92aWRlcn0gaW5zdGFuY2UKKyAqIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHByb3ZpZGUgYSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5pbnRlcm5hbC5SZXNvdXJjZU1ldGhvZERpc3BhdGNoZXJ9CisgKiBpbnN0YW5jZXMgZm9yIGFsbCByZXNvdXJjZSBtZXRob2QgaW52b2NhdGlvbnMuCisgKiA8L3A+CisgKiA8cD4KKyAqIEpBWC1SUyByZXNvdXJjZSBtZXRob2RzIGFyZSBpbnZva2VkIGJ5IHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNZXRob2RJbnZva2VyCisgKiByZXNvdXJjZSBtZXRob2QgaW52b2tlcn0uIFdoZW5ldmVyIGEgbmV3IGluY29taW5nIHJlcXVlc3QgaGFzIGJlZW4gcm91dGVkIHRvIGEgcmVzb3VyY2UgbWV0aG9kIGFuZCB0aGUKKyAqIG1ldGhvZCBpcyBiZWluZyBpbnZva2VkIGJ5IHRoZSByZXNvdXJjZSBtZXRob2QgaW52b2tlciwgdGhlIGludm9rZXIgY29uc3VsdHMgYSByZWdpc3RlcmVkCisgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5pbnRlcm5hbC5SZXNvdXJjZU1ldGhvZERpc3BhdGNoZXIuUHJvdmlkZXJ9IGluc3RhbmNlIHRvIHJldHJpZXZlCisgKiBhIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLmludGVybmFsLlJlc291cmNlTWV0aG9kRGlzcGF0Y2hlcn0gdGhhdCB3aWxsIGJlIHVsdGltYXRlbHkgdXNlZAorICogdG8gZGlzcGF0Y2ggdGhlIHJlc291cmNlIG1ldGhvZCBpbnZvY2F0aW9uLiBUaGlzIG1lY2hhbmlzbSBpcyB1c2VmdWwgZm9yIGltcGxlbWVudGluZyBhbnkgcmVzb3VyY2UgbWV0aG9kCisgKiBpbnRlcmNlcHRpb24gbG9naWMuCisgKiA8L3A+CisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQFNpbmdsZXRvbgorcHVibGljIGZpbmFsIGNsYXNzIFJlc291cmNlTWV0aG9kRGlzcGF0Y2hlckZhY3RvcnkgaW1wbGVtZW50cyBSZXNvdXJjZU1ldGhvZERpc3BhdGNoZXIuUHJvdmlkZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoUmVzb3VyY2VNZXRob2REaXNwYXRjaGVyRmFjdG9yeS5jbGFzcy5nZXROYW1lKCkpOworICAgIHByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxSZXNvdXJjZU1ldGhvZERpc3BhdGNoZXIuUHJvdmlkZXI+IHByb3ZpZGVyczsKKworICAgIFJlc291cmNlTWV0aG9kRGlzcGF0Y2hlckZhY3RvcnkoQ29sbGVjdGlvbjxSZXNvdXJjZU1ldGhvZERpc3BhdGNoZXIuUHJvdmlkZXI+IHByb3ZpZGVycykgeworICAgICAgICB0aGlzLnByb3ZpZGVycyA9IHByb3ZpZGVyczsKKyAgICB9CisKKyAgICAvLyBSZXNvdXJjZU1ldGhvZERpc3BhdGNoUHJvdmlkZXIKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb3VyY2VNZXRob2REaXNwYXRjaGVyIGNyZWF0ZShJbnZvY2FibGUgcmVzb3VyY2VNZXRob2QsIEludm9jYXRpb25IYW5kbGVyIGhhbmRsZXIsIENvbmZpZ3VyZWRWYWxpZGF0b3IgdmFsaWRhdG9yKSB7CisgICAgICAgIGZvciAoUmVzb3VyY2VNZXRob2REaXNwYXRjaGVyLlByb3ZpZGVyIHByb3ZpZGVyIDogcHJvdmlkZXJzKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFJlc291cmNlTWV0aG9kRGlzcGF0Y2hlciBkaXNwYXRjaGVyID0gcHJvdmlkZXIuY3JlYXRlKHJlc291cmNlTWV0aG9kLCBoYW5kbGVyLCB2YWxpZGF0b3IpOworICAgICAgICAgICAgICAgIGlmIChkaXNwYXRjaGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRpc3BhdGNoZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLlNFVkVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX1BST0NFU1NJTkdfTUVUSE9EKHJlc291cmNlTWV0aG9kLCBwcm92aWRlci5nZXRDbGFzcygpLmdldE5hbWUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL2ludGVybmFsL1Jlc291cmNlTWV0aG9kSW52b2NhdGlvbkhhbmRsZXJGYWN0b3J5LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9pbnRlcm5hbC9SZXNvdXJjZU1ldGhvZEludm9jYXRpb25IYW5kbGVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZTA5M2EKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9pbnRlcm5hbC9SZXNvdXJjZU1ldGhvZEludm9jYXRpb25IYW5kbGVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLmludGVybmFsOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvbkhhbmRsZXI7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LlByb3ZpZGVyczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uTGF6eVZhbHVlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5WYWx1ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uVmFsdWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuSW52b2NhYmxlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuaW50ZXJuYWwuUmVzb3VyY2VNZXRob2RJbnZvY2F0aW9uSGFuZGxlclByb3ZpZGVyOworCisvKioKKyAqIEFuIGluamVjdGFibGUge0BsaW5rIFJlc291cmNlTWV0aG9kSW52b2NhdGlvbkhhbmRsZXJQcm92aWRlciByZXNvdXJjZSBtZXRob2QKKyAqIGludm9jYXRpb24gaGFuZGxlciBwcm92aWRlcn0gZmFjdG9yeS4KKyAqIDxwIC8+CisgKiBXaGVuIGludm9rZWQsIHRoZSBmYWN0b3J5IGl0ZXJhdGVzIG92ZXIgdGhlIHJlZ2lzdGVyZWQgY3VzdG9tIHtAbGluayBSZXNvdXJjZU1ldGhvZEludm9jYXRpb25IYW5kbGVyUHJvdmlkZXIKKyAqIHJlc291cmNlIG1ldGhvZCBpbnZvY2F0aW9uIGhhbmRsZXIgcHJvdmlkZXJzfSBpbnZva2luZyB0aGVpcgorICoge0BsaW5rIFJlc291cmNlTWV0aG9kSW52b2NhdGlvbkhhbmRsZXJQcm92aWRlciNjcmVhdGUob3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLkludm9jYWJsZSkgY3JlYXRlUGF0dGVybkZvciguLi4pfQorICogbWV0aG9kcyBhbmQgcmV0dXJucyB0aGUgZmlyc3Qgbm9uLW51bGwge0BsaW5rIEludm9jYXRpb25IYW5kbGVyCisgKiBpbnZvY2F0aW9uIGhhbmRsZXJ9IGluc3RhbmNlIHJldHJpZXZlZCBmcm9tIHRoZSBwcm92aWRlcnMuIElmIG5vIGN1c3RvbSBwcm92aWRlcnMKKyAqIGFyZSBhdmFpbGFibGUsIG9yIGlmIG5vbmUgb2YgdGhlIHByb3ZpZGVycyByZXR1cm5zIGEgbm9uLW51bGwgaW52b2NhdGlvbiBoYW5kbGVyLAorICogaW4gc3VjaCBjYXNlIGEgZGVmYXVsdCBpbnZvY2F0aW9uIGhhbmRsZXIgcHJvdmlkZWQgYnkgdGhlIGZhY3RvcnkgaXMgcmV0dXJuZWQuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQFNpbmdsZXRvbgorcHVibGljIGZpbmFsIGNsYXNzIFJlc291cmNlTWV0aG9kSW52b2NhdGlvbkhhbmRsZXJGYWN0b3J5IGltcGxlbWVudHMgUmVzb3VyY2VNZXRob2RJbnZvY2F0aW9uSGFuZGxlclByb3ZpZGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEludm9jYXRpb25IYW5kbGVyIERFRkFVTFRfSEFORExFUiA9ICh0YXJnZXQsIG1ldGhvZCwgYXJncykgLT4gbWV0aG9kLmludm9rZSh0YXJnZXQsIGFyZ3MpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFJlc291cmNlTWV0aG9kSW52b2NhdGlvbkhhbmRsZXJGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7CisgICAgcHJpdmF0ZSBmaW5hbCBMYXp5VmFsdWU8U2V0PFJlc291cmNlTWV0aG9kSW52b2NhdGlvbkhhbmRsZXJQcm92aWRlcj4+IHByb3ZpZGVyczsKKworICAgIFJlc291cmNlTWV0aG9kSW52b2NhdGlvbkhhbmRsZXJGYWN0b3J5KEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlcikgeworICAgICAgICB0aGlzLnByb3ZpZGVycyA9IFZhbHVlcy5sYXp5KChWYWx1ZTxTZXQ8UmVzb3VyY2VNZXRob2RJbnZvY2F0aW9uSGFuZGxlclByb3ZpZGVyPj4pCisgICAgICAgICAgICAgICAgKCkgLT4gUHJvdmlkZXJzLmdldFByb3ZpZGVycyhpbmplY3Rpb25NYW5hZ2VyLCBSZXNvdXJjZU1ldGhvZEludm9jYXRpb25IYW5kbGVyUHJvdmlkZXIuY2xhc3MpKTsKKyAgICB9CisKKyAgICAvLyBSZXNvdXJjZU1ldGhvZEludm9jYXRpb25IYW5kbGVyUHJvdmlkZXIKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSW52b2NhdGlvbkhhbmRsZXIgY3JlYXRlKEludm9jYWJsZSByZXNvdXJjZU1ldGhvZCkgeworICAgICAgICBmb3IgKFJlc291cmNlTWV0aG9kSW52b2NhdGlvbkhhbmRsZXJQcm92aWRlciBwcm92aWRlciA6IHByb3ZpZGVycy5nZXQoKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBJbnZvY2F0aW9uSGFuZGxlciBoYW5kbGVyID0gcHJvdmlkZXIuY3JlYXRlKHJlc291cmNlTWV0aG9kKTsKKyAgICAgICAgICAgICAgICBpZiAoaGFuZGxlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5TRVZFUkUsIExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX1BST0NFU1NJTkdfTUVUSE9EKAorICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VNZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlci5nZXRDbGFzcygpLmdldE5hbWUoKSksIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIERFRkFVTFRfSEFORExFUjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9pbnRlcm5hbC9SZXNvdXJjZU1ldGhvZEludm9rZXJDb25maWd1cmF0b3IuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL2ludGVybmFsL1Jlc291cmNlTWV0aG9kSW52b2tlckNvbmZpZ3VyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YTk0YmEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9pbnRlcm5hbC9SZXNvdXJjZU1ldGhvZEludm9rZXJDb25maWd1cmF0b3IuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Cb290c3RyYXBCYWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuQm9vdHN0cmFwQ29uZmlndXJhdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJCb290c3RyYXBCYWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLmluamVjdC5Db25maWd1cmVkVmFsaWRhdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1ldGhvZEludm9rZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5pbnRlcm5hbC5SZXNvdXJjZU1ldGhvZERpc3BhdGNoZXI7CisKKy8qKgorICogQ29uZmlndXJhdG9yIHdoaWNoIGluaXRpYWxpemVzIGFuZCByZWdpc3RlciB7QGxpbmsgUmVzb3VyY2VNZXRob2REaXNwYXRjaGVyfSBpbnN0YW5jZSBpbnRvIHtAbGluayBCb290c3RyYXBCYWd9LgorICoKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VNZXRob2RJbnZva2VyQ29uZmlndXJhdG9yIGltcGxlbWVudHMgQm9vdHN0cmFwQ29uZmlndXJhdG9yIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGluaXQoSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyLCBCb290c3RyYXBCYWcgYm9vdHN0cmFwQmFnKSB7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcG9zdEluaXQoSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyLCBCb290c3RyYXBCYWcgYm9vdHN0cmFwQmFnKSB7CisgICAgICAgIFNlcnZlckJvb3RzdHJhcEJhZyBzZXJ2ZXJCYWcgPSAoU2VydmVyQm9vdHN0cmFwQmFnKSBib290c3RyYXBCYWc7CisKKyAgICAgICAgTGlzdDxSZXNvdXJjZU1ldGhvZERpc3BhdGNoZXIuUHJvdmlkZXI+IHByb3ZpZGVycyA9IEFycmF5cy5hc0xpc3QoCisgICAgICAgICAgICAgICAgbmV3IFZvaWRWb2lkRGlzcGF0Y2hlclByb3ZpZGVyKHNlcnZlckJhZy5nZXRSZXNvdXJjZUNvbnRleHQoKSksCisgICAgICAgICAgICAgICAgbmV3IEphdmFSZXNvdXJjZU1ldGhvZERpc3BhdGNoZXJQcm92aWRlcihzZXJ2ZXJCYWcuZ2V0VmFsdWVQYXJhbVByb3ZpZGVycygpKSk7CisKKyAgICAgICAgUmVzb3VyY2VNZXRob2RJbnZva2VyLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBSZXNvdXJjZU1ldGhvZEludm9rZXIuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLmluamVjdGlvbk1hbmFnZXIoaW5qZWN0aW9uTWFuYWdlcikKKyAgICAgICAgICAgICAgICAucmVzb3VyY2VNZXRob2REaXNwYXRjaGVyRmFjdG9yeShuZXcgUmVzb3VyY2VNZXRob2REaXNwYXRjaGVyRmFjdG9yeShwcm92aWRlcnMpKQorICAgICAgICAgICAgICAgIC5yZXNvdXJjZU1ldGhvZEludm9jYXRpb25IYW5kbGVyRmFjdG9yeShuZXcgUmVzb3VyY2VNZXRob2RJbnZvY2F0aW9uSGFuZGxlckZhY3RvcnkoaW5qZWN0aW9uTWFuYWdlcikpCisgICAgICAgICAgICAgICAgLmNvbmZpZ3VyYXRpb24oYm9vdHN0cmFwQmFnLmdldENvbmZpZ3VyYXRpb24oKSkKKyAgICAgICAgICAgICAgICAuY29uZmlndXJhdGlvblZhbGlkYXRvcigoKSAtPiBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKENvbmZpZ3VyZWRWYWxpZGF0b3IuY2xhc3MpKTsKKworICAgICAgICBzZXJ2ZXJCYWcuc2V0UmVzb3VyY2VNZXRob2RJbnZva2VyQnVpbGRlcihidWlsZGVyKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9pbnRlcm5hbC9Wb2lkVm9pZERpc3BhdGNoZXJQcm92aWRlci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvaW50ZXJuYWwvVm9pZFZvaWREaXNwYXRjaGVyUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjU0Njg1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvaW50ZXJuYWwvVm9pZFZvaWREaXNwYXRjaGVyUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25IYW5kbGVyOworCitpbXBvcnQgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuUmVzb3VyY2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLmluamVjdC5Db25maWd1cmVkVmFsaWRhdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5JbnZvY2FibGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5pbnRlcm5hbC5SZXNvdXJjZU1ldGhvZERpc3BhdGNoZXI7CisKKy8qKgorICogU3BlY2lmaWMgcmVzb3VyY2UgbWV0aG9kIGRpc3BhdGNoZXIgZm9yIGRpc3BhdGNoaW5nIHJlcXVlc3RzIHRvIGEgdm9pZAorICoge0BsaW5rIGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZCBKYXZhIG1ldGhvZH0gd2l0aCBubyBpbnB1dCBhcmd1bWVudHMKKyAqIHVzaW5nIGEgc3VwcGxpZWQge0BsaW5rIEludm9jYXRpb25IYW5kbGVyIEphdmEgbWV0aG9kIGludm9jYXRpb24gaGFuZGxlcn0uCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTaW5nbGV0b24KK2ZpbmFsIGNsYXNzIFZvaWRWb2lkRGlzcGF0Y2hlclByb3ZpZGVyIGltcGxlbWVudHMgUmVzb3VyY2VNZXRob2REaXNwYXRjaGVyLlByb3ZpZGVyIHsKKworICAgIHByaXZhdGUgZmluYWwgUmVzb3VyY2VDb250ZXh0IHJlc291cmNlQ29udGV4dDsKKworICAgIFZvaWRWb2lkRGlzcGF0Y2hlclByb3ZpZGVyKFJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHQpIHsKKyAgICAgICAgdGhpcy5yZXNvdXJjZUNvbnRleHQgPSByZXNvdXJjZUNvbnRleHQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVm9pZFRvVm9pZERpc3BhdGNoZXIgZXh0ZW5kcyBBYnN0cmFjdEphdmFSZXNvdXJjZU1ldGhvZERpc3BhdGNoZXIgeworCisgICAgICAgIHByaXZhdGUgVm9pZFRvVm9pZERpc3BhdGNoZXIoZmluYWwgSW52b2NhYmxlIHJlc291cmNlTWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEludm9jYXRpb25IYW5kbGVyIGhhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29uZmlndXJlZFZhbGlkYXRvciB2YWxpZGF0b3IpIHsKKyAgICAgICAgICAgIHN1cGVyKHJlc291cmNlTWV0aG9kLCBoYW5kbGVyLCB2YWxpZGF0b3IpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBkb0Rpc3BhdGNoKGZpbmFsIE9iamVjdCByZXNvdXJjZSwgZmluYWwgQ29udGFpbmVyUmVxdWVzdCBjb250YWluZXJSZXF1ZXN0KSB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpbnZva2UoY29udGFpbmVyUmVxdWVzdCwgcmVzb3VyY2UpOworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm5vQ29udGVudCgpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb3VyY2VNZXRob2REaXNwYXRjaGVyIGNyZWF0ZShmaW5hbCBJbnZvY2FibGUgcmVzb3VyY2VNZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSW52b2NhdGlvbkhhbmRsZXIgaGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb25maWd1cmVkVmFsaWRhdG9yIHZhbGlkYXRvcikgeworICAgICAgICBpZiAocmVzb3VyY2VNZXRob2QuZ2V0SGFuZGxpbmdNZXRob2QoKS5nZXRSZXR1cm5UeXBlKCkgIT0gdm9pZC5jbGFzcyB8fCAhcmVzb3VyY2VNZXRob2QuZ2V0UGFyYW1ldGVycygpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzb3VyY2VDb250ZXh0LmluaXRSZXNvdXJjZShuZXcgVm9pZFRvVm9pZERpc3BhdGNoZXIocmVzb3VyY2VNZXRob2QsIGhhbmRsZXIsIHZhbGlkYXRvcikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL2ludGVybmFsL3BhY2thZ2UtaW5mby5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvaW50ZXJuYWwvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgxNTZmOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL2ludGVybmFsL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKKy8qKgorICogSmVyc2V5IHNlcnZlci1zaWRlIGludGVybmFsIG1vZGVsIHJlbGF0ZWQgYW5kIHJvdXRpbmcgaGVscGVyIGNsYXNzZXMuCisgKi8KK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLmludGVybmFsOwpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvcGFja2FnZS1pbmZvLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjMzNWVkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoqCisgKiBKZXJzZXkgc2VydmVyLXNpZGUgYXBwbGljYXRpb24gJiByZXNvdXJjZSBtb2RlbGluZyBjbGFzc2VzLgorICogPHAvPgorICogVGhlIGNsYXNzZXMgZnJvbSB0aGlzIHBhY2thZ2UgcHJvdmlkZSBtZWFucyB0byBtb2RlbCBhbmQgYnVpbGQgSmVyc2V5IGFwcGxpY2F0aW9ucworICogYmFzZWQgb24gYm90aCBkZWNsYXJhdGl2ZSBhbmQgcHJvZ3JhbW1hdGljIGFwcHJvYWNoLiBBbiBhcHBsaWNhdGlvbiBjb3VsZCBiZQorICogYnVpbHQgYmFzZWQgb24gYSBzZXQgb2YgSkFYLVJTIGFubm90YXRlZCBjbGFzc2VzIChzdGFuZGFyZCwgZGVjbGFyYXRpdmUgd2F5KQorICogb3IgdXNpbmcgSmVyc2V5IHNwZWNpZmljIHByb2dyYW1tYXRpYyBBUEksIHdoZXJlIHlvdSBhcmUgbm90IGNvbnN0cmFpbmVkCisgKiB0byBKYXZhIHJlZmxlY3Rpb24gQVBJIGFuZCBjYW4gZnJlZWx5IGJpbmQgSmF2YSBjb2RlIHRvIHNlcnZlIGEgSFRUUCBtZXRob2QKKyAqIGZvciBhIGdpdmVuIFVSSS4gQm90aCBtZXRob2RzIGNvdWxkIGJlIGNvbWJpbmVkLCBzbyB0aGF0IHlvdSBjYW4gZS5nLiBkeW5hbWljYWxseQorICogYWRkIGEgbmV3IHJlc291cmNlIG1ldGhvZCB0byBhbiBleGlzdGluZyBKQVgtUlMgcmVzb3VyY2UgY2xhc3MuCisgKi8KK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsOwpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9uaXRvcmluZy9BcHBsaWNhdGlvbkV2ZW50LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb25pdG9yaW5nL0FwcGxpY2F0aW9uRXZlbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDRmOWQwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9uaXRvcmluZy9BcHBsaWNhdGlvbkV2ZW50LmphdmEKQEAgLTAsMCArMSwxMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3Jpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1vZGVsOworCisvKioKKyAqIEFuIGV2ZW50IGluZm9ybWluZyBhYm91dCBhcHBsaWNhdGlvbiBsaWZlY3ljbGUgY2hhbmdlcy4gVGhlIGV2ZW50IGlzIGNyZWF0ZWQgYnkgSmVyc2V5IHJ1bnRpbWUgYW5kCisgKiBoYW5kbGVkIGJ5IHVzZXIgcmVnaXN0ZXJlZCB7QGxpbmsgQXBwbGljYXRpb25FdmVudExpc3RlbmVyIGFwcGxpY2F0aW9uIGV2ZW50IGxpc3RlbmVyfS4KKyAqIDxwLz4KKyAqIFRoZSBldmVudCBjb250YWlucyB0aGUge0BsaW5rIFR5cGV9IHdoaWNoIGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiB0eXBlcyBvZiBldmVudC4gVGhlcmUgYXJlIHZhcmlvdXMKKyAqIHByb3BlcnRpZXMgaW4gdGhlIGV2ZW50IChhY2Nlc3NpYmxlIGJ5IGdldHRlcnMpIGFuZCBzb21lIG9mIHRoZW0gbWlnaHQgYmUgcmVsZXZhbnQgb25seSB0byBzcGVjaWZpYyBldmVudCB0eXBlcy4KKyAqIDxwLz4KKyAqIE5vdGUgdGhhdCBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgZXZlbnQgbXVzdCBiZSBtb2RpZmllZC4gRXZlbiB0aGUgZXZlbnQgaXMgaW1tdXRhYmxlIGl0IGV4cG9zZXMgb2JqZWN0cworICogd2hpY2ggbWlnaHQgYmUgbXV0YWJsZSBhbmQgdGhlIGNvZGUgb2YgZXZlbnQgbGlzdGVuZXIgbXVzdCBub3QgY2hhbmdlIHN0YXRlIG9mIHRoZXNlIG9iamVjdHMuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgaW50ZXJmYWNlIEFwcGxpY2F0aW9uRXZlbnQgeworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2YgdGhlIGV2ZW50IHRoYXQgaWRlbnRpZmllcyBvbiB3aGljaCBsaWZlY3ljbGUgY2hhbmdlIHRoZSBldmVudCBpcyB0cmlnZ2VyZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBlbnVtIFR5cGUgeworICAgICAgICAvKioKKyAgICAgICAgICogSW5pdGlhbGl6YXRpb24gb2YgdGhlIGFwcGxpY2F0aW9uIGhhcyBzdGFydGVkLiBJbiB0aGlzIHBvaW50IG5vIGFsbCB0aGUgZXZlbnQgcHJvcGVydGllcworICAgICAgICAgKiBhcmUgaW5pdGlhbGl6ZWQgeWV0LgorICAgICAgICAgKi8KKyAgICAgICAgSU5JVElBTElaQVRJT05fU1RBUlQsCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbml0aWFsaXphdGlvbiBvZiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlciBqZXJzZXkgYXBwbGljYXRpb259IGlzCisgICAgICAgICAqIGZpbmlzaGVkIGJ1dCB0aGUgc2VydmVyIG1pZ2h0IG5vdCBiZSBzdGFydGVkIGFuZCByZWFkeSB5ZXQgdG8gc2VydmUgcmVxdWVzdHMgKHRoaXMgd2lsbCBiZQorICAgICAgICAgKiBpbmRpY2F0ZWQgYnkgdGhlIHtAbGluayAjSU5JVElBTElaQVRJT05fRklOSVNIRUR9IGV2ZW50KS4gVGhpcyBldmVudCBpbmRpY2F0ZXMgb25seSB0aGF0IHRoZQorICAgICAgICAgKiBlbnZpcm9ubWVudCBpcyByZWFkeSAoYWxsIHByb3ZpZGVycyBhcmUgcmVnaXN0ZXJlZCwgYXBwbGljYXRpb24gaXMgY29uZmlndXJlZCwgZXRjLikuCisgICAgICAgICAqCisgICAgICAgICAqIEBzaW5jZSAyLjUKKyAgICAgICAgICovCisgICAgICAgIElOSVRJQUxJWkFUSU9OX0FQUF9GSU5JU0hFRCwKKyAgICAgICAgLyoqCisgICAgICAgICAqIEluaXRpYWxpemF0aW9uIG9mIHRoZSBhcHBsaWNhdGlvbiBoYXMgZmluaXNoZWQsIHNlcnZlciBpcyBzdGFydGVkIGFuZCBhcHBsaWNhdGlvbiBpcyByZWFkeQorICAgICAgICAgKiB0byBoYW5kbGUgcmVxdWVzdHMgbm93LgorICAgICAgICAgKi8KKyAgICAgICAgSU5JVElBTElaQVRJT05fRklOSVNIRUQsCisgICAgICAgIC8qKgorICAgICAgICAgKiBBcHBsaWNhdGlvbiBoYXMgYmVlbiBkZXN0cm95ZWQgKHN0b3BwZWQpLiBJbiB0aGlzIHBvaW50IHRoZSBhcHBsaWNhdGlvbiBjYW5ub3QgcHJvY2VzcyBhbnkgbmV3IHJlcXVlc3RzLgorICAgICAgICAgKi8KKyAgICAgICAgREVTVFJPWV9GSU5JU0hFRCwKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBhcHBsaWNhdGlvbiByZWxvYWQgaXMgZmluaXNoZWQuIFRoZSByZWxvYWQgY2FuIGJlIGludm9rZWQgYnkKKyAgICAgICAgICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29udGFpbmVyI3JlbG9hZCgpfSBtZXRob2QuIFdoZW4gdGhpcyBldmVudCBpcyB0cmlnZ2VyZWQKKyAgICAgICAgICogdGhlIHJlbG9hZCBpcyBjb21wbGV0ZWx5IGZpbmlzaGVkLCB3aGljaCBtZWFucyB0aGF0IHRoZSBuZXcgYXBwbGljYXRpb24gaXMgaW5pdGlhbGl6ZWQgKGFwcHJvcHJpYXRlCisgICAgICAgICAqIGV2ZW50cyBhcmUgY2FsbGVkKSBhbmQgbmV3IHJlbG9hZGVkIGFwcGxpY2F0aW9uIGlzIHJlYWR5IHRvIHNlcnZlciByZXF1ZXN0cy4KKyAgICAgICAgICovCisgICAgICAgIFJFTE9BRF9GSU5JU0hFRAorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgdHlwZSBvZiB0aGUgZXZlbnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEV2ZW50IHR5cGUuCisgICAgICovCisgICAgcHVibGljIFR5cGUgZ2V0VHlwZSgpOworCisKKyAgICAvKioKKyAgICAgKiBHZXQgcmVzb3VyY2UgY29uZmlnIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXBwbGljYXRpb24uIFRoZSByZXNvdXJjZSBjb25maWcgaXMgc2V0IGZvciBhbGwgZXZlbnQgdHlwZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFJlc291cmNlIGNvbmZpZyBvbiB3aGljaCB0aGlzIGFwcGxpY2F0aW9uIGlzIGJhc2VkIG9uLgorICAgICAqLworICAgIHB1YmxpYyBSZXNvdXJjZUNvbmZpZyBnZXRSZXNvdXJjZUNvbmZpZygpOworCisgICAgLyoqCisgICAgICogR2V0IHJlc291cmNlIGNsYXNzZXMgcmVnaXN0ZXJlZCBieSB0aGUgdXNlciBpbiB0aGUgY3VycmVudCBhcHBsaWNhdGlvbi4gVGhlIHNldCBjb250YWlucyBvbmx5CisgICAgICogdXNlciByZXNvdXJjZSBjbGFzc2VzIGFuZCBub3QgcmVzb3VyY2UgY2xhc3NlcyBhZGRlZCBieSBKZXJzZXkKKyAgICAgKiBvciBieSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLk1vZGVsUHJvY2Vzc29yfS4KKyAgICAgKiA8cC8+CisgICAgICogVXNlciByZXNvdXJjZXMgYXJlIHJlc291cmNlcyB0aGF0CisgICAgICogd2VyZSBleHBsaWNpdGx5IHJlZ2lzdGVyZWQgYnkgdGhlIGNvbmZpZ3VyYXRpb24sIGRpc2NvdmVyZWQgYnkgdGhlIGNsYXNzIHBhdGggc2Nhbm5pbmcgb3IgdGhhdAorICAgICAqIGNvbnN0cnVjdHMgZXhwbGljaXRseSByZWdpc3RlcmVkIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2UgcHJvZ3JhbW1hdGljIHJlc291cmNlfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gUmVzb3VyY2UgdXNlciByZWdpc3RlcmVkIGNsYXNzZXMuCisgICAgICovCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0UmVnaXN0ZXJlZENsYXNzZXMoKTsKKworICAgIC8qKgorICAgICAqIEdldCByZXNvdXJjZSBpbnN0YW5jZXMgcmVnaXN0ZXJlZCBieSB0aGUgdXNlciBpbiB0aGUgY3VycmVudCBhcHBsaWNhdGlvbi4gVGhlIHNldCBjb250YWlucyBvbmx5CisgICAgICogdXNlciByZXNvdXJjZXMgYW5kIG5vdCByZXNvdXJjZXMgYWRkZWQgYnkgSmVyc2V5CisgICAgICogb3IgYnkge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5Nb2RlbFByb2Nlc3Nvcn0uCisgICAgICogPHAvPgorICAgICAqIFVzZXIgcmVzb3VyY2VzIGFyZSByZXNvdXJjZXMgdGhhdAorICAgICAqIHdlcmUgZXhwbGljaXRseSByZWdpc3RlcmVkIGJ5IHRoZSBjb25maWd1cmF0aW9uLCBkaXNjb3ZlcmVkIGJ5IHRoZSBjbGFzcyBwYXRoIHNjYW5uaW5nIG9yIHRoYXQKKyAgICAgKiBjb25zdHJ1Y3RzIGV4cGxpY2l0bHkgcmVnaXN0ZXJlZCB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlIHByb2dyYW1tYXRpYyByZXNvdXJjZX0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFJlc291cmNlIGluc3RhbmNlcyByZWdpc3RlcmVkIGJ5IHVzZXIuCisgICAgICovCisgICAgcHVibGljIFNldDxPYmplY3Q+IGdldFJlZ2lzdGVyZWRJbnN0YW5jZXMoKTsKKworICAgIC8qKgorICAgICAqIEdldCByZWdpc3RlcmVkIHByb3ZpZGVycyBhdmFpbGFibGUgaW4gdGhlIHJ1bnRpbWUuIFRoZSByZWdpc3RlcmVkIHByb3ZpZGVycworICAgICAqIGFyZSBwcm92aWRlcnMgbGlrZSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLk1ldGhvZExpc3QuRmlsdGVyIGZpbHRlcnN9LAorICAgICAqIHtAbGluayBqYXZheC53cy5ycy5leHQuUmVhZGVySW50ZXJjZXB0b3IgcmVhZGVyfSBhbmQge0BsaW5rIGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvciB3cml0ZXJ9CisgICAgICogaW50ZXJjZXB0b3JzIHdoaWNoIGFyZSBleHBsaWNpdGx5IHJlZ2lzdGVyZWQgYnkgY29uZmlndXJhdGlvbiwgb3IgYW5ub3RhdGVkIGJ5CisgICAgICoge0BsaW5rIGphdmF4LndzLnJzLmV4dC5Qcm92aWRlciBAUHJvdmlkZXJ9IG9yIHJlZ2lzdGVyZWQgaW4gTUVUQS1JTkYvc2VydmljZXMuIFRoZQorICAgICAqIHNldCBkb2VzIG5vdCBpbmNsdWRlIHByb3ZpZGVycyB0aGF0IGFyZSBieSBkZWZhdWx0IGJ1aWx0IGluIEplcnNleS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gU2V0IG9mIHByb3ZpZGVyIGNsYXNzZXMuCisgICAgICovCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0UHJvdmlkZXJzKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHJlc291cmNlIG1vZGVsIG9mIHRoZSBhcHBsaWNhdGlvbi4gVGhlIG1ldGhvZCByZXR1cm5zIG51bGwgZm9yCisgICAgICoge0BsaW5rIFR5cGUjSU5JVElBTElaQVRJT05fU1RBUlR9IGV2ZW50IHR5cGUgYXMgdGhlIHJlc291cmNlIG1vZGVsIGlzIG5vdCBpbml0aWFsaXplZCB5ZXQuCisgICAgICogVGhlIHJldHVybmVkIHJlc291cmNlIG1vZGVsIGlzIHRoZSBmaW5hbCBkZXBsb3llZCBtb2RlbCBpbmNsdWRpbmcgcmVzb3VyY2VzIGVuaGFuY2VkIGJ5CisgICAgICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5Nb2RlbFByb2Nlc3NvciBtb2RlbCBwcm9jZXNzb3JzfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gUmVzb3VyY2UgbW9kZWwgb2YgdGhlIGRlcGxveWVkIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBSZXNvdXJjZU1vZGVsIGdldFJlc291cmNlTW9kZWwoKTsKKworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9uaXRvcmluZy9BcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXIuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vbml0b3JpbmcvQXBwbGljYXRpb25FdmVudExpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgxMTZmNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vbml0b3JpbmcvQXBwbGljYXRpb25FdmVudExpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZzsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN0cmFpbmVkVG87CitpbXBvcnQgamF2YXgud3MucnMuUnVudGltZVR5cGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuQ29udHJhY3Q7CisKKy8qKgorICogSmVyc2V5IHNwZWNpZmljIHByb3ZpZGVyIHRoYXQgbGlzdGVucyB0byB7QGxpbmsgQXBwbGljYXRpb25FdmVudCBhcHBsaWNhdGlvbiBldmVudHN9LgorICogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgaW50ZXJmYWNlIHdpbGwgYmUgY2FsbGVkIGZvciB0d28ga2luZCBvZiBldmVudHM6CisgKiBhcHBsaWNhdGlvbiBldmVudHMgYW5kIHtAbGluayBSZXF1ZXN0RXZlbnQgcmVxdWVzdCBldmVudHN9LiBUaGlzIGludGVyZmFjZSB3aWxsIGxpc3RlbiB0bworICogYWxsIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5BcHBsaWNhdGlvbkV2ZW50LlR5cGUgYXBwbGljYXRpb24gZXZlbnQgdHlwZXN9CisgKiBidXQgb25seSB0byBmaXJzdCByZXF1ZXN0IGV2ZW50IHdoaWNoIGlzIHRoZSB7QGxpbmsgUmVxdWVzdEV2ZW50LlR5cGUjU1RBUlR9LiBPbiB0aGlzIGV2ZW50IHRoZQorICogYXBwbGljYXRpb24gZXZlbnQgbGlzdGVuZXIgY2FuIGRlY2lkZSB3aGV0aGVyIGl0IHdpbGwgbGlzdGVuIHRvIHRoZSByZXF1ZXN0IGFuZCByZXR1cm4ge0BsaW5rIFJlcXVlc3RFdmVudExpc3RlbmVyCisgKiByZXF1ZXN0IGV2ZW50IGxpc3RlbmVyfSBmb3IgbGlzdGVuaW5nIHRvIGZ1cnRoZXIgcmVxdWVzdCBldmVudHMuCisgKiB9CisgKiA8cC8+CisgKiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBpbnRlcmZhY2UgY2FuIGJlIHJlZ2lzdGVyZWQgYXMgYSBzdGFuZGFyZCBKZXJzZXkvSkFYLVJTIHByb3ZpZGVyCisgKiBieSBhbm5vdGF0aW5nIHdpdGgge0BsaW5rIGphdmF4LndzLnJzLmV4dC5Qcm92aWRlciBAUHJvdmlkZXJ9IGFubm90YXRpb24gaW4gdGhlIGNhc2Ugb2YKKyAqIGNsYXNzIHBhdGggc2Nhbm5pbmcsIGJ5IHJlZ2lzdGVyaW5nIGFzIGEgcHJvdmlkZXIgdXNpbmcge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZ30KKyAqIG9yIGJ5IHJldHVybmluZyBmcm9tIHtAbGluayBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uI2dldENsYXNzZXMoKX0KKyAqIG9yIHtAbGluayBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uI2dldFNpbmdsZXRvbnMoKX19LiBUaGUgcHJvdmlkZXIgY2FuIGJlIHJlZ2lzdGVyZWQgb25seSBvbiB0aGUgc2VydmVyCisgKiBzaWRlLgorICogPHAvPgorICogQXBwbGljYXRpb24gZXZlbnQgbGlzdGVuZXIgY2FuIHJlYWQgZGF0YSBvZiBldmVudHMgYnV0IG11c3Qgbm90IG1vZGlmeSB0aGVtIGluIGFueSB3YXkuIFRoZSBpbXBsZW1lbnRhdGlvbgorICogbXVzdCBiZSB0aHJlYWQgc2FmZSAodGhlIG1ldGhvZHMgbWlnaHQgYmUgY2FsbGVkIGZyb20gZGlmZmVyZW50IHRocmVhZHMpLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworQENvbnRyYWN0CitAQ29uc3RyYWluZWRUbyhSdW50aW1lVHlwZS5TRVJWRVIpCitwdWJsaWMgaW50ZXJmYWNlIEFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lciB7CisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgYXBwbGljYXRpb24ge0Bjb2RlIGV2ZW50fS4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gbmV3IGV2ZW50IG9jY3Vycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBBcHBsaWNhdGlvbiBldmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkV2ZW50KEFwcGxpY2F0aW9uRXZlbnQgZXZlbnQpOworCisgICAgLyoqCisgICAgICogUHJvY2VzcyBhIG5ldyByZXF1ZXN0IGFuZCByZXR1cm4gYSB7QGxpbmsgUmVxdWVzdEV2ZW50TGlzdGVuZXIgcmVxdWVzdCBldmVudCBsaXN0ZW5lcn0gaWYKKyAgICAgKiBsaXN0ZW5pbmcgdG8ge0BsaW5rIFJlcXVlc3RFdmVudCByZXF1ZXN0IGV2ZW50c30gaXMgcmVxdWlyZWQuIFRoZSBtZXRob2QgaXMgY2FsbGVkIG9uY2UgZm9yCisgICAgICogZWFjaCBuZXcgaW5jb21pbmcgcmVxdWVzdC4gSWYgbGlzdGVuaW5nIHRvIHRoZSByZXF1ZXN0IGlzIHJlcXVpcmVkIHRoZW4gcmVxdWVzdCBldmVudCBtdXN0IGJlIHJldHVybmVkCisgICAgICogZnJvbSB0aGUgbWV0aG9kLiBTdWNoIGEgcmVxdWVzdCBldmVudCBsaXN0ZW5lciB3aWxsIHJlY2VpdmUgYWxsIHJlcXVlc3QgZXZlbnRzIHRoYXQgb25lIHJlcXVlc3QuIElmIGxpc3RlbmluZworICAgICAqIHRvIHJlcXVlc3QgZXZlbnQgZm9yIHRoZSByZXF1ZXN0IGlzIG5vdCByZXF1aXJlZCB0aGVuIHtAY29kZSBudWxsfSBtdXN0IGJlIHJldHVybmVkCisgICAgICogZnJvbSB0aGUgbWV0aG9kIChkbyBub3QgcmV0dXJuIGVtcHR5IG1vY2sgbGlzdGVuZXIgaW4gdGhlc2UKKyAgICAgKiBjYXNlcyBhcyBpdCB3aWxsIGhhdmUgbmVnYXRpdmUgcGVyZm9ybWFuY2UgaW1wYWN0KS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0RXZlbnQgRXZlbnQgb2YgdHlwZSB7QGxpbmsgUmVxdWVzdEV2ZW50LlR5cGUjU1RBUlR9LgorICAgICAqIEByZXR1cm4gUmVxdWVzdCBldmVudCBsaXN0ZW5lciB0aGF0IHdpbGwgbW9uaXRvciB0aGUgZXZlbnRzIG9mIHRoZSByZXF1ZXN0CisgICAgICogICAgICAgICBjb25uZWN0ZWQgd2l0aCB7QGNvZGUgcmVxdWVzdEV2ZW50fTsgbnVsbCBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIFJlcXVlc3RFdmVudExpc3RlbmVyIG9uUmVxdWVzdChSZXF1ZXN0RXZlbnQgcmVxdWVzdEV2ZW50KTsKK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vbml0b3JpbmcvQXBwbGljYXRpb25JbmZvLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb25pdG9yaW5nL0FwcGxpY2F0aW9uSW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YWM3YmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb25pdG9yaW5nL0FwcGxpY2F0aW9uSW5mby5qYXZhCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nOworCitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworLyoqCisgKiBNb25pdG9yaW5nIGNvbmZpZ3VyYXRpb24gb2YgYW4gYXBwbGljYXRpb24uCisgKiA8cC8+CisgKiBBcHBsaWNhdGlvbiBpbmZvIGluc3RhbmNlIGNhbiBiZSBpbmplY3RlZCwgZS5nOgorICogPHByZT4KKyAqICAgJiMwNjQ7UGF0aCgicmVzb3VyY2UiKQorICogICBwdWJsaWMgc3RhdGljIGNsYXNzIEFwcGxpY2F0aW9uSW5mb1Rlc3QgeworICogICAgICAgJiMwNjQ7SW5qZWN0CisgKiAgICAgICBQcm92aWRlciZsdDtBcHBsaWNhdGlvbkluZm8mZ3Q7IGFwcGxpY2F0aW9uSW5mb1Byb3ZpZGVyOworICoKKyAqICAgICAgICYjMDY0O0dFVAorICogICAgICAgcHVibGljIFN0cmluZyBnZXRBcHBOYW1lKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAqICAgICAgICAgICBmaW5hbCBBcHBsaWNhdGlvbkluZm8gYXBwbGljYXRpb25JbmZvID0gYXBwSW5mb1Byb3ZpZGVyLmdldCgpOworICogICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gYXBwbGljYXRpb25JbmZvLmdldFJlc291cmNlQ29uZmlnKCkuZ2V0QXBwbGljYXRpb25OYW1lKCk7CisgKgorICogICAgICAgICAgIHJldHVybiBuYW1lOworICogICAgICAgfQorICogICB9CisgKiA8L3ByZT4KKyAqIE5vdGUgdXNhZ2Ugb2Yge0BsaW5rIGphdmF4LmluamVjdC5Qcm92aWRlcn0gdG8gcmV0cmlldmUgYXBwbGljYXRpb24gaW5mby4gSW5mbyBjaGFuZ2VzIG92ZXIgdGltZSBhbmQgdGhpcyB3aWxsCisgKiBpbmplY3QgdGhlIGxhdGVzdCBpbmZvLiBJbiB0aGUgY2FzZSBvZiBzaW5nbGV0b24gcmVzb3VyY2VzIHVzYWdlIG9mIHtAY29kZSBQcm92aWRlcn0gaXMgdGhlIG9ubHkgd2F5IGhvdworICogdG8gaW5qZWN0IGFwcGxpY2F0aW9uIGluZm8gdGhhdCBhcmUgdXAgdG8gZGF0ZS4KKyAqIDxwLz4KKyAqIEFwcGxpY2F0aW9uIGluZm8gcmV0cmlldmVkIGZyb20gSmVyc2V5IHJ1bnRpbWUgbWlnaHQgYmUgbXV0YWJsZSBhbmQgdGhhbmtzIHRvIGl0IG1pZ2h0IHByb3ZpZGUgaW5jb25zaXN0ZW50IGRhdGEKKyAqIGFzIG5vdCBhbGwgYXR0cmlidXRlcyBhcmUgdXBkYXRlZCBpbiB0aGUgc2FtZSB0aW1lLiBUbyByZXRyaWV2ZSB0aGUgaW1tdXRhYmxlIGFuZCBjb25zaXN0ZW50CisgKiBkYXRhIHRoZSBtZXRob2Qge0BsaW5rICNzbmFwc2hvdCgpfSBzaG91bGQgYmUgdXNlZC4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICogQHNlZSBBcHBsaWNhdGlvbkV2ZW50CisgKiBAc2VlIEFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lcgorICogQHNlZSBNb25pdG9yaW5nU3RhdGlzdGljcyBTZWUgTW9uaXRvcmluZ1N0YXRpc3RpY3MgY2xhc3MgZm9yIGdlbmVyYWwgZGV0YWlscyBhYm91dCBzdGF0aXN0aWNzLgorICogQHNpbmNlIDIuMTIKKyAqLworcHVibGljIGludGVyZmFjZSBBcHBsaWNhdGlvbkluZm8geworICAgIC8qKgorICAgICAqIEdldCB0aGUgcmVzb3VyY2UgY29uZmlnLgorICAgICAqCisgICAgICogQHJldHVybiBSZXNvdXJjZSBjb25maWcuCisgICAgICovCisgICAgcHVibGljIFJlc291cmNlQ29uZmlnIGdldFJlc291cmNlQ29uZmlnKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHN0YXJ0IHRpbWUgb2YgdGhlIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBUaW1lIHdoZW4gYW4gYXBwbGljYXRpb24gaW5pdGlhbGl6YXRpb24gaGFzIGJlZW4gZmluaXNoZWQuCisgICAgICovCisgICAgcHVibGljIERhdGUgZ2V0U3RhcnRUaW1lKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgcmVzb3VyY2UgY2xhc3NlcyByZWdpc3RlcmVkIGJ5IHRoZSB1c2VyIGluIHRoZSBjdXJyZW50IGFwcGxpY2F0aW9uLiBUaGUgc2V0IGNvbnRhaW5zIG9ubHkKKyAgICAgKiB1c2VyIHJlc291cmNlIGNsYXNzZXMgYW5kIG5vdCByZXNvdXJjZSBjbGFzc2VzIGFkZGVkIGJ5IEplcnNleQorICAgICAqIG9yIGJ5IHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuTW9kZWxQcm9jZXNzb3J9LgorICAgICAqIDxwLz4KKyAgICAgKiBVc2VyIHJlc291cmNlcyBhcmUgcmVzb3VyY2VzIHRoYXQKKyAgICAgKiB3ZXJlIGV4cGxpY2l0bHkgcmVnaXN0ZXJlZCBieSB0aGUgY29uZmlndXJhdGlvbiwgZGlzY292ZXJlZCBieSB0aGUgY2xhc3MgcGF0aCBzY2FubmluZyBvciB0aGF0CisgICAgICogY29uc3RydWN0cyBleHBsaWNpdGx5IHJlZ2lzdGVyZWQge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZSBwcm9ncmFtbWF0aWMgcmVzb3VyY2V9LgorICAgICAqCisgICAgICogQHJldHVybiBSZXNvdXJjZSB1c2VyIHJlZ2lzdGVyZWQgY2xhc3Nlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRSZWdpc3RlcmVkQ2xhc3NlcygpOworCisgICAgLyoqCisgICAgICogR2V0IHJlc291cmNlIGluc3RhbmNlcyByZWdpc3RlcmVkIGJ5IHRoZSB1c2VyIGluIHRoZSBjdXJyZW50IGFwcGxpY2F0aW9uLiBUaGUgc2V0IGNvbnRhaW5zIG9ubHkKKyAgICAgKiB1c2VyIHJlc291cmNlcyBhbmQgbm90IHJlc291cmNlcyBhZGRlZCBieSBKZXJzZXkKKyAgICAgKiBvciBieSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLk1vZGVsUHJvY2Vzc29yfS4KKyAgICAgKiA8cC8+CisgICAgICogVXNlciByZXNvdXJjZXMgYXJlIHJlc291cmNlcyB0aGF0CisgICAgICogd2VyZSBleHBsaWNpdGx5IHJlZ2lzdGVyZWQgYnkgdGhlIGNvbmZpZ3VyYXRpb24sIGRpc2NvdmVyZWQgYnkgdGhlIGNsYXNzIHBhdGggc2Nhbm5pbmcgb3IgdGhhdAorICAgICAqIGNvbnN0cnVjdHMgZXhwbGljaXRseSByZWdpc3RlcmVkIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2UgcHJvZ3JhbW1hdGljIHJlc291cmNlfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gUmVzb3VyY2UgaW5zdGFuY2VzIHJlZ2lzdGVyZWQgYnkgdXNlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2V0PE9iamVjdD4gZ2V0UmVnaXN0ZXJlZEluc3RhbmNlcygpOworCisgICAgLyoqCisgICAgICogR2V0IHJlZ2lzdGVyZWQgcHJvdmlkZXJzIGF2YWlsYWJsZSBpbiB0aGUgcnVudGltZS4gVGhlIHJlZ2lzdGVyZWQgcHJvdmlkZXJzCisgICAgICogYXJlIHByb3ZpZGVycyBsaWtlIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuTWV0aG9kTGlzdC5GaWx0ZXIgZmlsdGVyc30sCisgICAgICoge0BsaW5rIGphdmF4LndzLnJzLmV4dC5SZWFkZXJJbnRlcmNlcHRvciByZWFkZXJ9IGFuZCB7QGxpbmsgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yIHdyaXRlcn0KKyAgICAgKiBpbnRlcmNlcHRvcnMgd2hpY2ggYXJlIGV4cGxpY2l0bHkgcmVnaXN0ZXJlZCBieSBjb25maWd1cmF0aW9uLCBvciBhbm5vdGF0ZWQgYnkKKyAgICAgKiB7QGxpbmsgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyIEBQcm92aWRlcn0gb3IgcmVnaXN0ZXJlZCBpbiBNRVRBLUlORi9zZXJ2aWNlcy4gVGhlCisgICAgICogc2V0IGRvZXMgbm90IGluY2x1ZGUgcHJvdmlkZXJzIHRoYXQgYXJlIGJ5IGRlZmF1bHQgYnVpbHQgaW4gSmVyc2V5LgorICAgICAqCisgICAgICogQHJldHVybiBTZXQgb2YgcHJvdmlkZXIgY2xhc3Nlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRQcm92aWRlcnMoKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgaW1tdXRhYmxlIGNvbnNpc3RlbnQgc25hcHNob3Qgb2YgdGhlIGFwcGxpY2F0aW9uIGluZm8uIFdvcmtpbmcgd2l0aCBzbmFwc2hvdHMgbWlnaHQKKyAgICAgKiBoYXZlIG5lZ2F0aXZlIHBlcmZvcm1hbmNlIGltcGFjdCBhcyBzbmFwc2hvdCBtdXN0IGJlIGNyZWF0ZWQgYnV0IGVuc3VyZXMgY29uc2lzdGVuY3kgb2YgZGF0YSBvdmVyIHRpbWUuCisgICAgICogSG93ZXZlciwgdGhlIHVzYWdlIG9mIHNuYXBzaG90IGlzIGVuY291cmFnZWQgdG8gYXZvaWQgd29ya2luZyB3aXRoIGluY29uc2lzdGVudCBkYXRhLiBOb3QgYWxsIGF0dHJpYnV0ZXMKKyAgICAgKiBtdXN0IGJlIHVwZGF0ZWQgaW4gdGhlIHNhbWUgdGltZSBvbiBtdXRhYmxlIHZlcnNpb24gb2YgaW5mby4KKyAgICAgKgorICAgICAqIEByZXR1cm4gU25hcHNob3Qgb2YgYXBwbGljYXRpb24gaW5mby4KKyAgICAgKi8KKyAgICBwdWJsaWMgQXBwbGljYXRpb25JbmZvIHNuYXBzaG90KCk7Cit9CisKZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vbml0b3JpbmcvQXBwbGljYXRpb25NWEJlYW4uamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vbml0b3JpbmcvQXBwbGljYXRpb25NWEJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjFiMzkxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9uaXRvcmluZy9BcHBsaWNhdGlvbk1YQmVhbi5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3Jpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogQXBwbGljYXRpb24gTVggQmVhbi4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQXBwbGljYXRpb25NWEJlYW4geworICAgIC8qKgorICAgICAqIEdldCB0aGUgYXBwbGljYXRpb24gbmFtZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQXBwbGljYXRpb24gbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEFwcGxpY2F0aW9uTmFtZSgpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSB7QGxpbmsgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiBjbGFzc30gdXNlZCBmb3IgY29uZmlndXJhdGlvbiBvZiBKZXJzZXkgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEFwcGxpY2F0aW9uIGNsYXNzIG5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRBcHBsaWNhdGlvbkNsYXNzKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG1hcCBvZiBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgY29udmVydGVkIHRvIHN0cmluZ3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE1hcCBwcm9wZXJ0eSBrZXlzIHRvIHByb3BlcnR5IHN0cmluZyB2YWx1ZXMuCisgICAgICovCisgICAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0UHJvcGVydGllcygpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBzdGFydCB0aW1lIG9mIHRoZSBhcHBsaWNhdGlvbiAod2hlbiBhcHBsaWNhdGlvbiB3YXMgaW5pdGlhbGl6ZWQpLgorICAgICAqCisgICAgICogQHJldHVybiBBcHBsaWNhdGlvbiBzdGFydCB0aW1lLgorICAgICAqLworICAgIHB1YmxpYyBEYXRlIGdldFN0YXJ0VGltZSgpOworCisgICAgLyoqCisgICAgICogR2V0IGEgc2V0IG9mIHN0cmluZyBuYW1lcyBvZiByZXNvdXJjZSBjbGFzc2VzIHJlZ2lzdGVyZWQgYnkgdGhlIHVzZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFNldCBvZiBjbGFzc2VzIGZ1bGwgbmFtZXMgKHdpdGggcGFja2FnZSBuYW1lcykuCisgICAgICogQHNlZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5BcHBsaWNhdGlvbkV2ZW50I2dldFJlZ2lzdGVyZWRDbGFzc2VzKCkgZm9yIHNwZWNpZmljYXRpb24KKyAgICAgKiAgICAgIG9mIHJldHVybmVkIGNsYXNzZXMuCisgICAgICovCisgICAgcHVibGljIFNldDxTdHJpbmc+IGdldFJlZ2lzdGVyZWRDbGFzc2VzKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBzZXQgb2Ygc3RyaW5nIG5hbWVzIG9mIGNsYXNzZXMgb2YgdXNlciByZWdpc3RlcmVkIGluc3RhbmNlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gU2V0IG9mIHVzZXIgcmVnaXN0ZXJlZCBpbnN0YW5jZXMgY29udmVydGVkIHRvIHRoZWlyIGNsYXNzIGZ1bGwgbmFtZXMgKHdpdGggcGFja2FnZSBuYW1lcykuCisgICAgICogQHNlZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5BcHBsaWNhdGlvbkV2ZW50I2dldFJlZ2lzdGVyZWRJbnN0YW5jZXMoKQorICAgICAqICAgICAgZm9yIHNwZWNpZmljYXRpb24gb2YgcmV0dXJuZWQgaW5zdGFuY2VzLgorICAgICAqLworICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRSZWdpc3RlcmVkSW5zdGFuY2VzKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgY2xhc3NlcyBvZiByZWdpc3RlcmVkIHByb3ZpZGVycy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gU2V0IG9mIHByb3ZpZGVyIGNsYXNzIGZ1bGwgbmFtZXMgKHdpdGggcGFja2FnZXMgbmFtZXMpLgorICAgICAqIEBzZWUgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuQXBwbGljYXRpb25FdmVudCNnZXRQcm92aWRlcnMoKSBmb3Igc3BlY2lmaWNhdGlvbgorICAgICAqICAgICAgb2YgcmV0dXJuZWQgY2xhc3Nlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0UHJvdmlkZXJDbGFzc2VzKCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb25pdG9yaW5nL0Rlc3Ryb3lMaXN0ZW5lci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9uaXRvcmluZy9EZXN0cm95TGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmUwNThkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9uaXRvcmluZy9EZXN0cm95TGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3RyYWluZWRUbzsKK2ltcG9ydCBqYXZheC53cy5ycy5SdW50aW1lVHlwZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5Db250cmFjdDsKKworLyoqCisgKiBBIGxpc3RlbmVyIGNvbnRyYWN0IHRoYXQgYWxsb3dzIGFueSByZWdpc3RlcmVkIGltcGxlbWVudGF0aW9uIGNsYXNzIHRvIHJlY2VpdmUgYXBwbGljYXRpb24gZGVzdHJveSBldmVudHMuCisgKiA8cD4KKyAqIFRoZSB7QGxpbmsgI29uRGVzdHJveSgpfSBtZXRob2QgaXMgY2FsbGVkIHdoZW4gYXBwbGljYXRpb24gaXMgYmVpbmcgZGVzdHJveWVkIGFuZCBhZnRlciBhbGwgdGhlIHBlbmRpbmcKKyAqIHtAbGluayBNb25pdG9yaW5nU3RhdGlzdGljc0xpc3RlbmVyI29uU3RhdGlzdGljcyhNb25pdG9yaW5nU3RhdGlzdGljcykgbW9uaXRvcmluZyBzdGF0aXN0aWNzIGV2ZW50c30gaGF2ZSBiZWVuCisgKiBkaXNwYXRjaGVkIGFuZCBwcm9jZXNzZWQuCisgKiA8L3A+CisgKiA8cD4KKyAqIFRoZSBhZHZhbnRhZ2Ugb2YgdXNpbmcge0Bjb2RlIERlc3Ryb3lMaXN0ZW5lcn0gb3ZlciB1c2luZyB7QGxpbmsgQXBwbGljYXRpb25FdmVudExpc3RlbmVyfSBkaXJlY3RseSB0byBjaGVjayBmb3IgdGhlCisgKiB7QGxpbmsgQXBwbGljYXRpb25FdmVudC5UeXBlI0RFU1RST1lfRklOSVNIRUR9IGV2ZW50IGlzLCB0aGF0IHRoZSB7QGxpbmsgI29uRGVzdHJveSgpfQorICogbWV0aG9kIGlzIGd1YXJhbnRlZWQgdG8gYmUgY2FsbGVkIG9ubHkgQUZURVIgYWxsIHRoZSB7QGNvZGUgTW9uaXRvcmluZ1N0YXRpc3RpY3NMaXN0ZW5lciNvblN0YXRpc3RpY3MoKX0gZXZlbnRzIGhhdmUgYmVlbgorICogZGlzcGF0Y2hlZCBhbmQgcHJvY2Vzc2VkLCBhcyBvcHBvc2VkIHRvIHVzaW5nIHRoZSB7QGNvZGUgQXBwbGljYXRpb25FdmVudExpc3RlbmVyfSBkaXJlY3RseSwgaW4gd2hpY2ggY2FzZSBzb21lIG1vbml0b3JpbmcKKyAqIHN0YXRpc3RpY3MgZXZlbnRzIG1heSBzdGlsbCBiZSBjb25jdXJyZW50bHkgZmlyZWQgYWZ0ZXIgdGhlIHtAY29kZSBERVNUUk9ZX0ZJTklTSEVEfSBldmVudCBoYXMgYmVlbiBkaXNwYXRjaGVkCisgKiAoZHVlIHRvIHBvdGVudGlhbCByYWNlIGNvbmRpdGlvbnMpLgorICogPC9wPgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqIEBzZWUgTW9uaXRvcmluZ1N0YXRpc3RpY3NMaXN0ZW5lcgorICogQHNpbmNlIDIuMTIKKyAqLworQENvbnRyYWN0CitAQ29uc3RyYWluZWRUbyhSdW50aW1lVHlwZS5TRVJWRVIpCitwdWJsaWMgaW50ZXJmYWNlIERlc3Ryb3lMaXN0ZW5lciB7CisgICAgLyoqCisgICAgICogVGhlIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhcHBsaWNhdGlvbiBpcyBkZXN0cm95ZWQuIFVzZSB0aGlzIG1ldGhvZCByZWxlYXNlIHJlc291cmNlcyBvZgorICAgICAqIHRoZSBsaXN0ZW5lci4gVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgaW4gdGhlIHRocmVhZCBzYWZlIHdheSAoc3luY2hyb25vdXNseSBhbmQgYnkgYSBzaW5nbGUgdGhyZWFkKQorICAgICAqIGFjY29yZGluZyB0byBvdGhlciBtZXRob2RzIGZyb20gdGhlIHJlbGF0ZWQge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLk1vbml0b3JpbmdTdGF0aXN0aWNzTGlzdGVuZXJ9CisgICAgICogaW50ZXJmYWNlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uRGVzdHJveSgpOworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9uaXRvcmluZy9FeGNlcHRpb25NYXBwZXJNWEJlYW4uamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vbml0b3JpbmcvRXhjZXB0aW9uTWFwcGVyTVhCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDlmYzg4NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vbml0b3JpbmcvRXhjZXB0aW9uTWFwcGVyTVhCZWFuLmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZzsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogTVhCZWFuIGludGVyZmFjZSBvZiB0aGUge0BsaW5rIGphdmF4LndzLnJzLmV4dC5FeGNlcHRpb25NYXBwZXIgZXhjZXB0aW9uIG1hcHBlcn0gc3RhdGlzdGljcy4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRXhjZXB0aW9uTWFwcGVyTVhCZWFuIHsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgc3RhdGlzdGljcyBvZiBleGVjdXRpb24gb2YgZXhjZXB0aW9uIG1hcHBlcnMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE1hcCB3aGVyZSBrZXlzIGFyZSBzdHJpbmcgY2xhc3MgbmFtZXMgb2Yge0BsaW5rIGphdmF4LndzLnJzLmV4dC5FeGNlcHRpb25NYXBwZXIgZXhjZXB0aW9uIG1hcHBlcnN9CisgICAgICogICAgICAgICBhbmQgdmFsdWVzIGFyZSBjb3VudHMgb2YgZXhlY3V0aW9uIG9mIHRoZXNlIG1hcHBlcnMuCisgICAgICovCisgICAgcHVibGljIE1hcDxTdHJpbmcsIExvbmc+IGdldEV4Y2VwdGlvbk1hcHBlckNvdW50KCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgY291bnQgb2YgYWxsIHN1Y2Nlc3NmdWwgZXhjZXB0aW9uIG1hcHBpbmdzLiBTdWNjZXNzZnVsIGV4Y2VwdGlvbiBtYXBwaW5nIG9jY3VycyB3aGVuCisgICAgICogYW55IHtAbGluayBqYXZheC53cy5ycy5leHQuRXhjZXB0aW9uTWFwcGVyIGV4Y2VwdGlvbiBtYXBwZXJ9IHJldHVybnMgYW4gdmFsaWQgcmVzcG9uc2UKKyAgICAgKiAoZXZlbiBpZiByZXNwb25zZSBjb250YWlucyBub24tc3VjY2Vzc2Z1bCByZXNwb25zZSBzdGF0dXMgY29kZSkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIENvdW50IG9mIHN1Y2Nlc3NmdWxseSBtYXBwZWQgZXhjZXB0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldFN1Y2Nlc3NmdWxNYXBwaW5ncygpOworCisgICAgLyoqCisgICAgICogR2V0IGNvdW50IG9mIGFsbCB1bnN1Y2Nlc3NmdWwgZXhjZXB0aW9uIG1hcHBpbmdzLiBVbnN1Y2Nlc3NmdWwgZXhjZXB0aW9uIG1hcHBpbmcgb2NjdXJzIHdoZW4KKyAgICAgKiBhbnkgZXhjZXB0aW9uIG1hcHBpbmcgcHJvY2VzcyBkb2VzIG5vdCBwcm9kdWNlIGFuIHZhbGlkIHJlc3BvbnNlLiBUaGUgcmVhc29uIGNhbiBiZSB0aGF0IHRoZQorICAgICAqIHtAbGluayBqYXZheC53cy5ycy5leHQuRXhjZXB0aW9uTWFwcGVyIGV4Y2VwdGlvbiBtYXBwZXJ9IGlzIG5vdCBmb3VuZCwgb3IgaXMgZm91bmQgYnV0IHRocm93cworICAgICAqIGV4Y2VwdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQ291bnQgb2YgdW5tYXBwZWQgZXhjZXB0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldFVuc3VjY2Vzc2Z1bE1hcHBpbmdzKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgY291bnQgb2YgZXhjZXB0aW9uIG1hcHBpbmdzIHRoYXQgd2VyZSBwZXJmb3JtZWQgb24gZXhjZXB0aW9ucy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQ291bnQgb2YgYWxsIGV4Y2VwdGlvbiBiZWluZyBtYXBwZWQgaW4gdGhlIHJ1bnRpbWUuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0VG90YWxNYXBwaW5ncygpOworCisKK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vbml0b3JpbmcvRXhjZXB0aW9uTWFwcGVyU3RhdGlzdGljcy5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9uaXRvcmluZy9FeGNlcHRpb25NYXBwZXJTdGF0aXN0aWNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFhZjBkNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vbml0b3JpbmcvRXhjZXB0aW9uTWFwcGVyU3RhdGlzdGljcy5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3Jpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIE1vbml0b3Jpbmcgc3RhdGlzdGljcyBvZiB7QGxpbmsgamF2YXgud3MucnMuZXh0LkV4Y2VwdGlvbk1hcHBlciBleGNlcHRpb24gbWFwcGVyfSBleGVjdXRpb25zLgorICogPHAvPgorICogU3RhdGlzdGljcyByZXRyaWV2ZWQgZnJvbSBKZXJzZXkgcnVudGltZSBtaWdodCBiZSBtdXRhYmxlIGFuZCB0aGFua3MgdG8gaXQgbWlnaHQgcHJvdmlkZSBpbmNvbnNpc3RlbnQgZGF0YQorICogYXMgbm90IGFsbCBzdGF0aXN0aWNzIGFyZSB1cGRhdGVkIGluIHRoZSBzYW1lIHRpbWUuIFRvIHJldHJpZXZlIHRoZSBpbW11dGFibGUgYW5kIGNvbnNpc3RlbnQKKyAqIHN0YXRpc3RpY3MgZGF0YSB0aGUgbWV0aG9kIHtAbGluayAjc25hcHNob3QoKX0gc2hvdWxkIGJlIHVzZWQuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICogQHNlZSBNb25pdG9yaW5nU3RhdGlzdGljcyBTZWUgbW9uaXRvcmluZyBzdGF0aXN0aWNzIGZvciBnZW5lcmFsIGRldGFpbHMgYWJvdXQgc3RhdGlzdGljcy4KKyAqLworcHVibGljIGludGVyZmFjZSBFeGNlcHRpb25NYXBwZXJTdGF0aXN0aWNzIHsKKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjb3VudCBvZiBleGNlcHRpb24gbWFwcGVyIGV4ZWN1dGlvbnMuIFRoZSByZXR1cm5lZCBtYXAgY29udGFpbnMge0BsaW5rIENsYXNzIGNsYXNzZXN9CisgICAgICogb2Yge0BsaW5rIGphdmF4LndzLnJzLmV4dC5FeGNlcHRpb25NYXBwZXIgZXhjZXB0aW9uIG1hcHBlcnN9IGFuZCBjb3JyZXNwb25kaW5nIGV4ZWN1dGlvbiBjb3VudAorICAgICAqIGFzIHZhbHVlcy4gT25lIGV4ZWN1dGlvbiBvZiBleGNlcHRpb24gbWFwcGVyIGlzIG9uZSBjYWxsCisgICAgICogb2Yge0BsaW5rIGphdmF4LndzLnJzLmV4dC5FeGNlcHRpb25NYXBwZXIjdG9SZXNwb25zZShUaHJvd2FibGUpfSBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE1hcCB3aXRoIGV4Y2VwdGlvbiBtYXBwZXJzIGFzIGtleXMgYW5kIGV4ZWN1dGlvbiBjb3VudCBhcyB2YWx1ZXMuCisgICAgICovCisgICAgcHVibGljIE1hcDxDbGFzczw/PiwgTG9uZz4gZ2V0RXhjZXB0aW9uTWFwcGVyRXhlY3V0aW9ucygpOworCisgICAgLyoqCisgICAgICogR2V0IGNvdW50IG9mIGFsbCBzdWNjZXNzZnVsIGV4Y2VwdGlvbiBtYXBwaW5ncy4gU3VjY2Vzc2Z1bCBleGNlcHRpb24gbWFwcGluZyBvY2N1cnMgd2hlbgorICAgICAqIGFueSB7QGxpbmsgamF2YXgud3MucnMuZXh0LkV4Y2VwdGlvbk1hcHBlciBleGNlcHRpb24gbWFwcGVyfSByZXR1cm5zIGFuIHZhbGlkIHJlc3BvbnNlCisgICAgICogKGV2ZW4gaWYgcmVzcG9uc2UgY29udGFpbnMgbm9uLXN1Y2Nlc3NmdWwgcmVzcG9uc2Ugc3RhdHVzIGNvZGUpLgorICAgICAqCisgICAgICogQHJldHVybiBDb3VudCBvZiBzdWNjZXNzZnVsbHkgbWFwcGVkIGV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRTdWNjZXNzZnVsTWFwcGluZ3MoKTsKKworICAgIC8qKgorICAgICAqIEdldCBjb3VudCBvZiBhbGwgdW5zdWNjZXNzZnVsIGV4Y2VwdGlvbiBtYXBwaW5ncy4gVW5zdWNjZXNzZnVsIGV4Y2VwdGlvbiBtYXBwaW5nIG9jY3VycyB3aGVuCisgICAgICogYW55IGV4Y2VwdGlvbiBtYXBwaW5nIHByb2Nlc3MgZG9lcyBub3QgcHJvZHVjZSBhbiB2YWxpZCByZXNwb25zZS4gVGhlIHJlYXNvbiBjYW4gYmUgdGhhdCB0aGUKKyAgICAgKiB7QGxpbmsgamF2YXgud3MucnMuZXh0LkV4Y2VwdGlvbk1hcHBlciBleGNlcHRpb24gbWFwcGVyfSBpcyBub3QgZm91bmQsIG9yIGlzIGZvdW5kIGJ1dCB0aHJvd3MKKyAgICAgKiBleGNlcHRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIENvdW50IG9mIHVubWFwcGVkIGV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRVbnN1Y2Nlc3NmdWxNYXBwaW5ncygpOworCisgICAgLyoqCisgICAgICogR2V0IGNvdW50IG9mIGV4Y2VwdGlvbiBtYXBwaW5ncyB0aGF0IHdlcmUgcGVyZm9ybWVkIG9uIGV4Y2VwdGlvbnMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIENvdW50IG9mIGFsbCBleGNlcHRpb24gYmVpbmcgbWFwcGVkIGluIHRoZSBydW50aW1lLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldFRvdGFsTWFwcGluZ3MoKTsKKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBpbW11dGFibGUgY29uc2lzdGVudCBzbmFwc2hvdCBvZiB0aGUgbW9uaXRvcmluZyBzdGF0aXN0aWNzLiBXb3JraW5nIHdpdGggc25hcHNob3RzIG1pZ2h0CisgICAgICogaGF2ZSBuZWdhdGl2ZSBwZXJmb3JtYW5jZSBpbXBhY3QgYXMgc25hcHNob3QgbXVzdCBiZSBjcmVhdGVkIGJ1dCBlbnN1cmVzIGNvbnNpc3RlbmN5IG9mIGRhdGEgb3ZlciB0aW1lLgorICAgICAqIEhvd2V2ZXIsIHRoZSB1c2FnZSBvZiBzbmFwc2hvdCBpcyBlbmNvdXJhZ2VkIHRvIGF2b2lkIHdvcmtpbmcgd2l0aCBpbmNvbnNpc3RlbnQgZGF0YS4gTm90IGFsbCBzdGF0aXN0aWNzCisgICAgICogbXVzdCBiZSB1cGRhdGVkIGluIHRoZSBzYW1lIHRpbWUgb24gbXV0YWJsZSB2ZXJzaW9uIG9mIHN0YXRpc3RpY3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFNuYXBzaG90IG9mIGV4Y2VwdGlvbiBtYXBwZXIgc3RhdGlzdGljcy4KKyAgICAgKiBAZGVwcmVjYXRlZCBpbXBsZW1lbnRpbmcgY2xhc3MgaXMgaW1tdXRhYmxlIGhlbmNlIHNuYXBzaG90IGNyZWF0aW9uIGlzIG5vdCBuZWVkZWQgYW55bW9yZQorICAgICAqLworICAgIEBEZXByZWNhdGVkCisgICAgcHVibGljIEV4Y2VwdGlvbk1hcHBlclN0YXRpc3RpY3Mgc25hcHNob3QoKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vbml0b3JpbmcvRXhlY3V0aW9uU3RhdGlzdGljcy5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9uaXRvcmluZy9FeGVjdXRpb25TdGF0aXN0aWNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQwOTM3NwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vbml0b3JpbmcvRXhlY3V0aW9uU3RhdGlzdGljcy5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3Jpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIE1vbml0b3Jpbmcgc3RhdGlzdGljcyBvZiBleGVjdXRpb24gb2Ygb25lIHRhcmdldC4ge0Bjb2RlIEV4ZWN1dGlvblN0YXRpc3RpY3N9IGNvbnRhaW5zCisgKiB7QGxpbmsgVGltZVdpbmRvd1N0YXRpc3RpY3N9IGZvciB2YXJpb3VzIHRpbWUgd2luZG93IHNpemVzLgorICogPHAvPgorICogU3RhdGlzdGljcyByZXRyaWV2ZWQgZnJvbSBKZXJzZXkgcnVudGltZSBtaWdodCBiZSBtdXRhYmxlIGFuZCB0aGFua3MgdG8gaXQgbWlnaHQgcHJvdmlkZSBpbmNvbnNpc3RlbnQgZGF0YQorICogYXMgbm90IGFsbCBzdGF0aXN0aWNzIGFyZSB1cGRhdGVkIGluIHRoZSBzYW1lIHRpbWUuIFRvIHJldHJpZXZlIHRoZSBpbW11dGFibGUgYW5kIGNvbnNpc3RlbnQKKyAqIHN0YXRpc3RpY3MgZGF0YSB0aGUgbWV0aG9kIHtAbGluayAjc25hcHNob3QoKX0gc2hvdWxkIGJlIHVzZWQuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICogQHNlZSBNb25pdG9yaW5nU3RhdGlzdGljcyBTZWUgbW9uaXRvcmluZyBzdGF0aXN0aWNzIGZvciBnZW5lcmFsIGRldGFpbHMgYWJvdXQgc3RhdGlzdGljcy4KKyAqLworcHVibGljIGludGVyZmFjZSBFeGVjdXRpb25TdGF0aXN0aWNzIHsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aW1lIHdoZW4gdGFyZ2V0IHdhcyBleGVjdXRlZCBsYXN0IHRpbWUuIFRoZSB0aW1lIGlzIG1lYXN1cmVkIGJlZm9yZSB0aGUgdGFyZ2V0IHdhcyBleGVjdXRlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGltZSBvZiBsYXN0IGV4ZWN1dGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgRGF0ZSBnZXRMYXN0U3RhcnRUaW1lKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRpbWUgd2luZG93IHN0YXRpc3RpY3MgZm9yIGF2YWlsYWJsZSB0aW1lIHdpbmRvdyBzaXplcy4gVGhlIHJldHVybmVkIG1hcCBjb250YWlucyBzaXplcworICAgICAqIG9mIGEgdGltZSB3aW5kb3cgaW4gbWlsbGlzZWNvbmRzIGFzIGtleXMgYW5kCisgICAgICoge0BsaW5rIFRpbWVXaW5kb3dTdGF0aXN0aWNzIHRpbWUgd2luZG93IHN0YXRpc3RpY3N9IGZvciB0aGUgY29ycmVzcG9uZGluZyB0aW1lIHdpbmRvdworICAgICAqIGFzIHZhbHVlLgorICAgICAqCisgICAgICogQHJldHVybiBNYXAgd2l0aCBzaXplIG9mIGEgdGltZSB3aW5kb3cgaW4gbWlsbGlzZWNvbmRzIGFzIGtleXMgYW5kCisgICAgICogICAgICAgICB7QGxpbmsgVGltZVdpbmRvd1N0YXRpc3RpY3MgdGltZSB3aW5kb3cgc3RhdGlzdGljc30gZm9yIHRoZSBjb3JyZXNwb25kaW5nIHRpbWUgd2luZG93CisgICAgICogICAgICAgICBhcyB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwPExvbmcsIFRpbWVXaW5kb3dTdGF0aXN0aWNzPiBnZXRUaW1lV2luZG93U3RhdGlzdGljcygpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBpbW11dGFibGUgY29uc2lzdGVudCBzbmFwc2hvdCBvZiB0aGUgbW9uaXRvcmluZyBzdGF0aXN0aWNzLiBXb3JraW5nIHdpdGggc25hcHNob3RzIG1pZ2h0CisgICAgICogaGF2ZSBuZWdhdGl2ZSBwZXJmb3JtYW5jZSBpbXBhY3QgYXMgc25hcHNob3QgbXVzdCBiZSBjcmVhdGVkIGJ1dCBlbnN1cmVzIGNvbnNpc3RlbmN5IG9mIGRhdGEgb3ZlciB0aW1lLgorICAgICAqIEhvd2V2ZXIsIHRoZSB1c2FnZSBvZiBzbmFwc2hvdCBpcyBlbmNvdXJhZ2VkIHRvIGF2b2lkIHdvcmtpbmcgd2l0aCBpbmNvbnNpc3RlbnQgZGF0YS4gTm90IGFsbCBzdGF0aXN0aWNzCisgICAgICogbXVzdCBiZSB1cGRhdGVkIGluIHRoZSBzYW1lIHRpbWUgb24gbXV0YWJsZSB2ZXJzaW9uIG9mIHN0YXRpc3RpY3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFNuYXBzaG90IG9mIGV4ZWN1dGlvbiBzdGF0aXN0aWNzLgorICAgICAqIEBkZXByZWNhdGVkIGltcGxlbWVudGluZyBjbGFzcyBpcyBpbW11dGFibGUgaGVuY2Ugc25hcHNob3QgY3JlYXRpb24gaXMgbm90IG5lZWRlZCBhbnltb3JlCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgRXhlY3V0aW9uU3RhdGlzdGljcyBzbmFwc2hvdCgpOworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9uaXRvcmluZy9Nb25pdG9yaW5nU3RhdGlzdGljcy5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9uaXRvcmluZy9Nb25pdG9yaW5nU3RhdGlzdGljcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMGY0MDEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb25pdG9yaW5nL01vbml0b3JpbmdTdGF0aXN0aWNzLmphdmEKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3Jpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIE1vbml0b3Jpbmcgc3RhdGlzdGljcyByZXR1cm4gc3RhdGlzdGljIGluZm9ybWF0aW9uIGFib3V0IGFwcGxpY2F0aW9uIHJ1biBsaWtlIG51bWJlciBvZiByZXF1ZXN0cyByZWNlaXZlZCwKKyAqIGR1cmF0aW9uIG9mIHJlcXVlc3QgcHJvY2Vzc2luZywgbnVtYmVyIG9mIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQgcmVxdWVzdHMsIHN0YXRpc3RpY2FsIGluZm9ybWF0aW9uIGFib3V0CisgKiBleGVjdXRpb24gb2YgbWV0aG9kcyBhbmQgcmVzb3VyY2VzLCBpbmZvcm1hdGlvbiBhYm91dCBtYXRjaGluZy4KKyAqIDxwLz4KKyAqIE1vbml0b3Jpbmcgc3RhdGlzdGljcyBpcyB0aGUgbWFpbiBpbnRlcmZhY2UgZnJvbSB3aGljaCBhbGwgc3RhdGlzdGljIGluZm9ybWF0aW9uIGNhbiBiZSByZXRyaWV2ZWQuIFN0YXRpc3RpY3MKKyAqIGNhbiBiZSByZXRyaWVkIGluIHR3byB3YXlzOiB0aGVzZSBjYW4gYmUgaW5qZWN0ZWQgb3IgcmVjZWl2ZWQgZnJvbSByZWdpc3RlcmVkIGNhbGxiYWNrCisgKiBpbnRlcmZhY2Uge0BsaW5rIE1vbml0b3JpbmdTdGF0aXN0aWNzTGlzdGVuZXJ9LiBUaGUgZm9sbG93aW5nIGlzIHRoZSBleGFtcGxlIG9mIHN0YXRpc3RpYyBpbmplY3Rpb246CisgKiA8cHJlPgorICogICAmIzA2NDtQYXRoKCJyZXNvdXJjZSIpCisgKiAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3RhdGlzdGljc1Rlc3QgeworICogICAgICAgJiMwNjQ7SW5qZWN0CisgKiAgICAgICBQcm92aWRlciZsdDtNb25pdG9yaW5nU3RhdGlzdGljcyZndDsgc3RhdGlzdGljczsKKyAqCisgKiAgICAgICAmIzA2NDtHRVQKKyAqICAgICAgIHB1YmxpYyBsb25nIGdldFRvdGFsRXhjZXB0aW9uTWFwcGluZ3MoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICogICAgICAgICAgIGZpbmFsIE1vbml0b3JpbmdTdGF0aXN0aWNzIG1vbml0b3JpbmdTdGF0aXN0aWNzID0gc3RhdGlzdGljcy5nZXQoKTsKKyAqICAgICAgICAgICBmaW5hbCBsb25nIHRvdGFsRXhjZXB0aW9uTWFwcGluZ3MgPSBtb25pdG9yaW5nU3RhdGlzdGljcy5nZXRFeGNlcHRpb25NYXBwZXJTdGF0aXN0aWNzKCkuZ2V0VG90YWxNYXBwaW5ncygpOworICoKKyAqICAgICAgICAgICByZXR1cm4gdG90YWxFeGNlcHRpb25NYXBwaW5nczsKKyAqICAgICAgIH0KKyAqICAgfQorICogPC9wcmU+CisgKiBOb3RlIHVzYWdlIG9mIHtAbGluayBqYXZheC5pbmplY3QuUHJvdmlkZXJ9IHRvIHJldHJpZXZlIHN0YXRpc3RpY3MuIFN0YXRpc3RpY3MgY2hhbmdlIG92ZXIgdGltZSBhbmQgdGhpcyB3aWxsCisgKiBpbmplY3QgdGhlIGxhdGVzdCBzdGF0aXN0aWNzLiBJbiB0aGUgY2FzZSBvZiBzaW5nbGV0b24gcmVzb3VyY2VzIHVzYWdlIG9mIHtAY29kZSBQcm92aWRlcn0gaXMgdGhlIG9ubHkgd2F5IGhvdworICogdG8gaW5qZWN0IHN0YXRpc3RpY3MgdGhhdCBhcmUgdXAgdG8gZGF0ZS4KKyAqIDxwLz4KKyAqIFJldHJpZXZpbmcgc3RhdGlzdGljcyBieSB7QGNvZGUgTW9uaXRvcmluZ1N0YXRpc3RpY3NMaXN0ZW5lcn0gaXMgY29udmVuaWVudCBpbiBjYXNlcyB3aGVuIHRoZXJlIGlzIGEgbmVlZAorICogdG8gdGFrZSBhbiBhY3Rpb24gb25seSB3aGVuIG5ldyBzdGF0aXN0aWNzIGFyZSBjYWxjdWxhdGVkIHdoaWNoIG9jY3VycyBpbiBub3QgZGVmaW5lZCBpcnJlZ3VsYXIgaW50ZXJ2YWxzCisgKiAob25jZSBwZXIgc2Vjb25kIGZvciBleGFtcGxlKS4KKyAqIDxwLz4KKyAqIFRoZSBjb250cmFjdCBkb2VzIG5vdCBtYW5kYXRlIHtAY29kZSBNb25pdG9yaW5nU3RhdGlzdGljc30gdG8gYmUgaW1tdXRhYmxlLiBJbXBsZW1lbnRhdGlvbiBvZiBtb25pdG9yaW5nIHN0YXRpc3RpY3MKKyAqIG1pZ2h0IGJlIG11dGFibGUsIHdoaWNoIG1lYW5zIHRoYXQgYW4gaW5zdGFuY2Ugb2Yge0Bjb2RlIE1vbml0b3JpbmdTdGF0aXN0aWNzfQorICogbWlnaHQgY2hhbmdlIGl0cyBpbnRlcm5hbCBzdGF0ZSBvdmVyIHRpbWUuIEluIG9yZGVyIHRvIGdldCBpbW11dGFibGUgc25hcHNob3Qgb2Ygc3RhdGlzdGljcworICogdGhlIG1ldGhvZCB7QGxpbmsgI3NuYXBzaG90KCl9IG11c3QgYmUgY2FsbGVkIHRvIGdldCBhIHNuYXBzaG90IG9mIHRoZSBzdGF0aXN0aWNzIHRoYXQgZ3VhcmFudGVlcworICogdGhhdCBkYXRhIHRvIGJlIGltbXV0YWJsZSBhbmQgY29uc2lzdGVudC4gTmVzdGVkIHN0YXRpc3RpY3MgaW50ZXJmYWNlcyBjb250YWluIGFsc28ge0Bjb2RlIHNuYXBzaG90fSBtZXRob2Qgd2hpY2gKKyAqIGNhbiBiZSB1c2VkIGluIHRoZSBzYW1lIHdheS4KKyAqIE5vdGUgdGhhdCBhIHNuYXBzaG90IG9mIHtAY29kZSBNb25pdG9yaW5nU3RhdGlzdGljc30gcGVyZm9ybXMgYSBkZWVwIHNuYXBzaG90IG9mIG5lc3RlZCBzdGF0aXN0aWNzIG9iamVjdCB0b28sIHNvIHRoZXJlCisgKiBpcyBubyBuZWVkIHRvIGNhbGwgdGhlIHtAY29kZSBzbmFwc2hvdH0gbWV0aG9kIGFnYWluIG9uIG5lc3RlZCBzdGF0aXN0aWNzIGNvbXBvbmVudHMuCisgKiA8cD4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVyZmFjZSBtYXkgYmUgbXV0YWJsZSBhbmQgY2hhbmdlIGl0J3Mgc3RhdGUgYnkgYW4gZXh0ZXJuYWwgZXZlbnQsIGhvd2V2ZXIgaXQgaXMgZ3VhcmFudGVlZAorICogdG8gYmUgdGhyZWFkLXNhZmUuCisgKiA8L3A+CisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgaW50ZXJmYWNlIE1vbml0b3JpbmdTdGF0aXN0aWNzIHsKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHN0YXRpc3RpY3MgZm9yIGVhY2ggVVJJIHRoYXQgaXMgZXhwb3NlZCBpbiB0aGUgYXBwbGljYXRpb24uIEtleXMgb2YgcmV0dXJuZWQgbWFwCisgICAgICogYXJlIFN0cmluZyBVUklzIChmb3IgZXhhbXBsZSAiL2Jvb2tzdG9yZS91c2Vycy9hZG1pbiIpIGFuZCB2YWx1ZXMgYXJlCisgICAgICoge0BsaW5rIFJlc291cmNlU3RhdGlzdGljcyByZXNvdXJjZSBzdGF0aXN0aWNzfSB0aGF0IGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQKKyAgICAgKiBleGVjdXRpb24gb2YgcmVzb3VyY2UgbWV0aG9kcyBhdmFpbGFibGUgb24gdGhlIFVSSS4gVGhlIG1hcCBjb250YWluIFVSSXMgdGhhdCBhcmUgYXZhaWxhYmxlIGluCisgICAgICogYXBwbGljYXRpb24gd2l0aG91dCBVUklzIGF2YWlsYWJsZSBpbiBzdWIgcmVzb3VyY2UgbG9jYXRvcnMgYW5kIFVSSXMgdGhhdCBhcmUgYXZhaWxhYmxlIHRyb3VnaCBzdWIKKyAgICAgKiByZXNvdXJjZSBsb2NhdG9ycyBhbmQgd2VyZSBhbHJlYWR5IG1hdGNoZWQgYnkgYW55IHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE1hcCB3aXRoIFVSSSBrZXlzIGFuZCByZXNvdXJjZSBzdGF0aXN0aWNzIHZhbHVlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwPFN0cmluZywgUmVzb3VyY2VTdGF0aXN0aWNzPiBnZXRVcmlTdGF0aXN0aWNzKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHN0YXRpc3RpY3MgZm9yIGVhY2ggcmVzb3VyY2Uge0BsaW5rIENsYXNzfSB0aGF0IGlzIGRlcGxveWVkIGluIHRoZSBhcHBsaWNhdGlvbi4gS2V5cyBvZiByZXR1cm5lZAorICAgICAqIG1hcCBhcmUgY2xhc3NlcyBvZiByZXNvdXJjZXMgYW5kIHZhbHVlcyBhcmUge0BsaW5rIFJlc291cmNlU3RhdGlzdGljcyByZXNvdXJjZSBzdGF0aXN0aWNzfQorICAgICAqIHRoYXQgY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dAorICAgICAqIGV4ZWN1dGlvbiBvZiByZXNvdXJjZSBtZXRob2RzIGF2YWlsYWJsZSBpbiB0aGUgcmVzb3VyY2UgY2xhc3MuIE5vdGUgdGhhdCBvbmUgcmVzb3VyY2UgY2xhc3MgY2FuIHNlcnZlCisgICAgICogcmVxdWVzdCBtYXRjaGVkIHRvIGRpZmZlcmVudCBVUklzLiBCeSBkZWZhdWx0IHRoZSBtYXAgd2lsbCBjb250YWluIHJlc291cmNlIGNsYXNzZXMgd2hpY2ggYXJlIHJlZ2lzdGVyZWQKKyAgICAgKiBpbiB0aGUgcmVzb3VyY2UgbW9kZWwgcGx1cyByZXNvdXJjZSBjbGFzc2VzIG9mIHN1YiByZXNvdXJjZXMgcmV0dXJuZWQgZnJvbSBzdWIgcmVzb3VyY2UgbG9jYXRvcnMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE1hcCB3aXRoIHJlc291cmNlIGNsYXNzIGtleXMgYW5kIHJlc291cmNlIHN0YXRpc3RpY3MgdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyBNYXA8Q2xhc3M8Pz4sIFJlc291cmNlU3RhdGlzdGljcz4gZ2V0UmVzb3VyY2VDbGFzc1N0YXRpc3RpY3MoKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZ2xvYmFsIGFwcGxpY2F0aW9uIHN0YXRpc3RpY3Mgb2YgcmVxdWVzdCBleGVjdXRpb24uIFRoZSBzdGF0aXN0aWNzIGFyZSBub3QgYm91bmQgYW55IHNwZWNpZmljIHJlc291cmNlIG9yCisgICAgICogcmVzb3VyY2UgbWV0aG9kIGFuZCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhbGwgcmVxdWVzdHMgdGhhdCBhcHBsaWNhdGlvbiBoYW5kbGVzLgorICAgICAqCisgICAgICogQHJldHVybiBBcHBsaWNhdGlvbiByZXF1ZXN0IGV4ZWN1dGlvbiBzdGF0aXN0aWNzLgorICAgICAqLworICAgIHB1YmxpYyBFeGVjdXRpb25TdGF0aXN0aWNzIGdldFJlcXVlc3RTdGF0aXN0aWNzKCk7CisKKworICAgIC8qKgorICAgICAqIEdldCBnbG9iYWwgYXBwbGljYXRpb24gcmVzcG9uc2Ugc3RhdGlzdGljcy4gVGhlIHN0YXRpc3RpY3MgYXJlIG5vdCBib3VuZCBhbnkgc3BlY2lmaWMgcmVzb3VyY2Ugb3IKKyAgICAgKiByZXNvdXJjZSBtZXRob2QgYW5kIGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGFsbCByZXNwb25zZXMgdGhhdCBhcHBsaWNhdGlvbiBjcmVhdGVzLgorICAgICAqCisgICAgICogQHJldHVybiBBcHBsaWNhdGlvbiByZXNwb25zZSBzdGF0aXN0aWNzLgorICAgICAqLworICAgIHB1YmxpYyBSZXNwb25zZVN0YXRpc3RpY3MgZ2V0UmVzcG9uc2VTdGF0aXN0aWNzKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgc3RhdGlzdGljcyBhYm91dCByZWdpc3RlcmVkIHtAbGluayBqYXZheC53cy5ycy5leHQuRXhjZXB0aW9uTWFwcGVyIGV4Y2VwdGlvbiBtYXBwZXJzfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gRXhjZXB0aW9uIG1hcHBlciBzdGF0aXN0aWNzLgorICAgICAqLworICAgIHB1YmxpYyBFeGNlcHRpb25NYXBwZXJTdGF0aXN0aWNzIGdldEV4Y2VwdGlvbk1hcHBlclN0YXRpc3RpY3MoKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgaW1tdXRhYmxlIGNvbnNpc3RlbnQgc25hcHNob3Qgb2YgdGhlIG1vbml0b3Jpbmcgc3RhdGlzdGljcy4gV29ya2luZyB3aXRoIHNuYXBzaG90cyBtaWdodAorICAgICAqIGhhdmUgbmVnYXRpdmUgcGVyZm9ybWFuY2UgaW1wYWN0IGFzIHNuYXBzaG90IG11c3QgYmUgY3JlYXRlZCBidXQgZW5zdXJlcyBjb25zaXN0ZW5jeSBvZiBkYXRhIG92ZXIgdGltZS4KKyAgICAgKiBIb3dldmVyLCB0aGUgdXNhZ2Ugb2Ygc25hcHNob3QgaXMgZW5jb3VyYWdlZCB0byBhdm9pZCB3b3JraW5nIHdpdGggaW5jb25zaXN0ZW50IGRhdGEuIE5vdCBhbGwgc3RhdGlzdGljcworICAgICAqIG11c3QgYmUgdXBkYXRlZCBpbiB0aGUgc2FtZSB0aW1lIG9uIG11dGFibGUgdmVyc2lvbiBvZiBzdGF0aXN0aWNzLgorICAgICAqCisgICAgICogQHJldHVybiBTbmFwc2hvdCBvZiBtb25pdG9yaW5nIHN0YXRpc3RpY3MuCisgICAgICogQGRlcHJlY2F0ZWQgaW1wbGVtZW50aW5nIGNsYXNzIGlzIGltbXV0YWJsZSBoZW5jZSBzbmFwc2hvdCBjcmVhdGlvbiBpcyBub3QgbmVlZGVkIGFueW1vcmUKKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBNb25pdG9yaW5nU3RhdGlzdGljcyBzbmFwc2hvdCgpOworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9uaXRvcmluZy9Nb25pdG9yaW5nU3RhdGlzdGljc0xpc3RlbmVyLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb25pdG9yaW5nL01vbml0b3JpbmdTdGF0aXN0aWNzTGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzQxZjBkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9uaXRvcmluZy9Nb25pdG9yaW5nU3RhdGlzdGljc0xpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZzsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN0cmFpbmVkVG87CitpbXBvcnQgamF2YXgud3MucnMuUnVudGltZVR5cGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuQ29udHJhY3Q7CisKKy8qKgorICogQSBKZXJzZXkgc3BlY2lmaWMgcHJvdmlkZXIgdGhhdCBsaXN0ZW5zIHRvIG1vbml0b3Jpbmcgc3RhdGlzdGljcy4gRWFjaCB0aW1lIHdoZW4gbmV3IHN0YXRpc3RpY3MgYXJlIGF2YWlsYWJsZSwKKyAqIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB7QGNvZGUgTW9uaXRvcmluZ1N0YXRpc3RpY3NMaXN0ZW5lcn0gd2lsbCBiZSBjYWxsZWQgYW5kIG5ldyBzdGF0aXN0aWNzIHdpbGwgYmUgcGFzc2VkLgorICogU3RhdGlzdGljcyBhcmUgY2FsY3VsYXRlZCBpbiBpcnJlZ3VsYXIgdW5kZWZpbmVkIGludGVydmFscy4KKyAqIDxwLz4KKyAqIFRoZSBwcm92aWRlciBtdXN0IG5vdCB0aHJvdyBhbnkgZXhjZXB0aW9uLgorICogPHAvPgorICogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgaW50ZXJmYWNlIGNhbiBiZSByZWdpc3RlcmVkIGFzIGEgc3RhbmRhcmQgSmVyc2V5L0pBWC1SUyBwcm92aWRlcgorICogYnkgYW5ub3RhdGluZyB3aXRoIHtAbGluayBqYXZheC53cy5ycy5leHQuUHJvdmlkZXIgQFByb3ZpZGVyfSBhbm5vdGF0aW9uIGluIHRoZSBjYXNlIG9mCisgKiBjbGFzcyBwYXRoIHNjYW5uaW5nLCBieSByZWdpc3RlcmluZyBhcyBhIHByb3ZpZGVyIHVzaW5nIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWd9CisgKiBvciBieSByZXR1cm5pbmcgZnJvbSB7QGxpbmsgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbiNnZXRDbGFzc2VzKCl9CisgKiBvciB7QGxpbmsgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbiNnZXRTaW5nbGV0b25zKCl9fS4gVGhlIHByb3ZpZGVyIGNhbiBiZSByZWdpc3RlcmVkIG9ubHkgb24gdGhlIHNlcnZlcgorICogc2lkZS4KKyAqIDxwLz4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKiBAc2VlIERlc3Ryb3lMaXN0ZW5lcgorICovCitAQ29udHJhY3QKK0BDb25zdHJhaW5lZFRvKFJ1bnRpbWVUeXBlLlNFUlZFUikKK3B1YmxpYyBpbnRlcmZhY2UgTW9uaXRvcmluZ1N0YXRpc3RpY3NMaXN0ZW5lciB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIG5ldyBzdGF0aXN0aWNzIGFyZSBhdmFpbGFibGUgYW5kIHN0YXRpc3RpY3MgYXJlIHBhc3NlZCBhcyBhbiBhcmd1bWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdGF0aXN0aWNzIE5ld2x5IGNhbGN1bGF0ZWQgbW9uaXRvcmluZyBzdGF0aXN0aWNzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uU3RhdGlzdGljcyhNb25pdG9yaW5nU3RhdGlzdGljcyBzdGF0aXN0aWNzKTsKKworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9uaXRvcmluZy9SZXF1ZXN0RXZlbnQuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vbml0b3JpbmcvUmVxdWVzdEV2ZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ2MGNhMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vbml0b3JpbmcvUmVxdWVzdEV2ZW50LmphdmEKQEAgLTAsMCArMSwyNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3Jpbmc7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LkV4Y2VwdGlvbk1hcHBlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuRXh0ZW5kZWRVcmlJbmZvOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZTsKKworLyoqCisgKiBBbiBldmVudCBpbmZvcm1pbmcgYWJvdXQgZGV0YWlscyBvZiBhIHJlcXVlc3QgcHJvY2Vzc2luZy4gVGhlIGV2ZW50IGlzIGNyZWF0ZWQgYnkgYSBKZXJzZXkgcnVudGltZSBhbmQKKyAqIGhhbmRsZWQgYnkge0BsaW5rIFJlcXVlc3RFdmVudExpc3RlbmVyfSAoamF2YWRvYyBvZiBsaXN0ZW5lciBkZXNjcmliZXMgaG93IHRvIHJlZ2lzdGVyIHRoZSBsaXN0ZW5lciBmb3IKKyAqIHBhcnRpY3VsYXIgcmVxdWVzdCkuCisgKiA8cC8+CisgKiBUaGUgZXZlbnQgY29udGFpbnMgdGhlIHtAbGluayBUeXBlfSB3aGljaCBkaXN0aW5ndWlzaGVzIGJldHdlZW4gdHlwZXMgb2YgZXZlbnQuIFRoZXJlIGFyZSB2YXJpb3VzCisgKiBwcm9wZXJ0aWVzIGluIHRoZSBldmVudCAoYWNjZXNzaWJsZSBieSBnZXR0ZXJzKSBhbmQgc29tZSBvZiB0aGVtIG1pZ2h0IGJlIHJlbGV2YW50IG9ubHkgdG8gc3BlY2lmaWMgZXZlbnQgdHlwZXMuCisgKiA8cC8+CisgKiBOb3RlIHRoYXQgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIGV2ZW50IG11c3QgYmUgbW9kaWZpZWQuIEV2ZW4gdGhlIGV2ZW50IGlzIGltbXV0YWJsZSBpdCBleHBvc2VzIG9iamVjdHMKKyAqIHdoaWNoIG1pZ2h0IGJlIG11dGFibGUgYW5kIHRoZSBjb2RlIG9mIGV2ZW50IGxpc3RlbmVyIG11c3Qgbm90IGNoYW5nZSBzdGF0ZSBvZiB0aGVzZSBvYmplY3RzLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGludGVyZmFjZSBSZXF1ZXN0RXZlbnQgeworCisgICAgLyoqCisgICAgICogVGhlIHR5cGUgb2YgdGhlIGV2ZW50IHdoaWNoIGRlc2NyaWJlcyBpbiB3aGljaCByZXF1ZXN0IHByb2Nlc3NpbmcgcGhhc2UgdGhlIGV2ZW50CisgICAgICogaXMgdHJpZ2dlcmVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZW51bSBUeXBlIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSByZXF1ZXN0IHByb2Nlc3NpbmcgaGFzIHN0YXJ0ZWQuIFRoaXMgZXZlbnQgdHlwZSBpcyBoYW5kbGVkIG9ubHkgYnkKKyAgICAgICAgICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLkFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lciNvblJlcXVlc3QoUmVxdWVzdEV2ZW50KX0gYW5kIHdpbGwKKyAgICAgICAgICogbmV2ZXIgYmUgY2FsbGVkIGZvciB7QGxpbmsgUmVxdWVzdEV2ZW50TGlzdGVuZXIjb25FdmVudChSZXF1ZXN0RXZlbnQpfS4KKyAgICAgICAgICovCisgICAgICAgIFNUQVJULAorCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbWF0Y2hpbmcgb2YgdGhlIHJlc291cmNlIGFuZCByZXNvdXJjZSBtZXRob2QgaGFzIHN0YXJ0ZWQuCisgICAgICAgICAqLworICAgICAgICBNQVRDSElOR19TVEFSVCwKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzdWIgcmVzb3VyY2UgbG9jYXRvciBtZXRob2QgaXMgZm91bmQgYW5kIGl0IHdpbGwgYmUgY2FsbGVkLgorICAgICAgICAgKiBUaGUgbG9jYXRvciBtZXRob2QgY2FuIGJlIHJldHJpZXZlZCBmcm9tIHtAbGluayAjZ2V0VXJpSW5mbygpfSBieSBtZXRob2QKKyAgICAgICAgICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5FeHRlbmRlZFVyaUluZm8jZ2V0TWF0Y2hlZFJlc291cmNlTG9jYXRvcnMoKX0uCisgICAgICAgICAqLworICAgICAgICBMT0NBVE9SX01BVENIRUQsCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBzdWIgcmVzb3VyY2UgaGFzIGJlZW4gcmV0dXJuZWQgZnJvbSBzdWIgcmVzb3VyY2UgbG9jYXRvciwgbW9kZWwgd2FzIGNvbnN0cnVjdGVkLCBlbmhhbmNlZCBieQorICAgICAgICAgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLk1vZGVsUHJvY2Vzc29yIG1vZGVsIHByb2Nlc3Nvcn0sIHZhbGlkYXRlZCBhbmQgdGhlIG1hdGNoaW5nCisgICAgICAgICAqIGlzIGdvaW5nIHRvIGJlIHBlcmZvcm1lZCBvbiB0aGUgc3ViIHtAbGluayBSZXNvdXJjZSByZXNvdXJjZX0uCisgICAgICAgICAqIFRoZSBzdWIgcmVzb3VyY2UgY2FuIGJlIHJldHJpZXZlZCBmcm9tIHtAbGluayAjZ2V0VXJpSW5mbygpfSBieSBtZXRob2QKKyAgICAgICAgICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5FeHRlbmRlZFVyaUluZm8jZ2V0TG9jYXRvclN1YlJlc291cmNlcygpfS4KKyAgICAgICAgICovCisgICAgICAgIFNVQlJFU09VUkNFX0xPQ0FURUQsCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBtYXRjaGluZyBoYXMgYmVlbiBmaW5pc2hlZCBhbmQge0BsaW5rIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIgY29udGFpbmVyIHJlcXVlc3QgZmlsdGVyc30KKyAgICAgICAgICogYXJlIGdvaW5nIHRvIGJlIGV4ZWN1dGVkLiBUaGUgcmVxdWVzdCBmaWx0ZXJzIGNhbiBiZSByZXRyaWV2ZWQgZnJvbSBldmVudCBieQorICAgICAgICAgKiB7QGxpbmsgI2dldENvbnRhaW5lclJlcXVlc3RGaWx0ZXJzKCl9IG1ldGhvZC4gVGhpcyBtZXRob2QgYWxzbyBkZXRlcm1pbmVzIGVuZCBvZiB0aGUgbWF0Y2hpbmcKKyAgICAgICAgICogcHJvY2VzcyBhbmQgdGhlcmVmb3JlIHRoZSBtYXRjaGluZyByZXN1bHRzIGNhbiBiZSByZXRyaWV2ZWQgdXNpbmcge0BsaW5rICNnZXRVcmlJbmZvKCl9LgorICAgICAgICAgKi8KKyAgICAgICAgUkVRVUVTVF9NQVRDSEVELAorCisgICAgICAgIC8qKgorICAgICAgICAgKiBFeGVjdXRpb24gb2Yge0BsaW5rIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIgY29udGFpbmVyIHJlcXVlc3QgZmlsdGVyc30gaGFzIGJlZW4gZmluaXNoZWQuCisgICAgICAgICAqLworICAgICAgICBSRVFVRVNUX0ZJTFRFUkVELAorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXNvdXJjZSBtZXRob2QgaXMgZ29pbmcgdG8gYmUgZXhlY3V0ZWQuIFRoZSByZXNvdXJjZSBtZXRob2QgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIHtAbGluayBFeHRlbmRlZFVyaUluZm99CisgICAgICAgICAqIHJldHVybmVkIGJ5IHtAbGluayAjZ2V0VXJpSW5mbygpfS4KKyAgICAgICAgICovCisgICAgICAgIFJFU09VUkNFX01FVEhPRF9TVEFSVCwKKworICAgICAgICAvKioKKyAgICAgICAgICogUmVzb3VyY2UgbWV0aG9kIGV4ZWN1dGlvbiBoYXMgZmluaXNoZWQuIEluIHRoZSBjYXNlIG9mIHN5bmNocm9ub3VzIHByb2Nlc3NpbmcKKyAgICAgICAgICogdGhlIHJlc3BvbnNlIGlzIG5vdCBhdmFpbGFibGUgeWV0LiBJbiB0aGUgY2FzZSBvZiBhc3luY2hyb25vdXMgcHJvY2Vzc2luZyB0aGUgc2l0dWF0aW9uIGRlcGVuZHMgb24gdGhlCisgICAgICAgICAqIG1ldGhvZCBkZXNpZ24gYW5kIGl0IGluIHNvbWUgY2FzZXMgb24gcmFjZSBjb25kaXRpb25zLiBJbiBhc3luY2hyb25vdXMgY2FzZXMgdGhpcyBldmVudCBjYW4gYmUKKyAgICAgICAgICogdHJpZ2dlcmVkIGV2ZW4gYWZ0ZXIgdGhlIHJlc3BvbnNlIGlzIGNvbXBsZXRlbHkgcHJvY2Vzc2VkLiBFeGFjdGx5IGRlZmluZWQsIHRoaXMgZXZlbnQKKyAgICAgICAgICogaXMgdHJpZ2dlcmVkIHdoZW4gdGhlIHRocmVhZCBleGVjdXRpbmcgdGhlIHJlc291cmNlIG1ldGhvZCByZXR1cm5zIGZyb20gdGhlIHJlc291cmNlIG1ldGhvZC4KKyAgICAgICAgICovCisgICAgICAgIFJFU09VUkNFX01FVEhPRF9GSU5JU0hFRCwKKworICAgICAgICAvKioKKyAgICAgICAgICoge0BsaW5rIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyIENvbnRhaW5lciByZXNwb25zZSBmaWx0ZXJzfSBhcmUgZ29pbmcgdG8gYmUgZXhlY3V0ZWQuIEluIHRoaXMgcG9pbnQKKyAgICAgICAgICogdGhlIHJlc3BvbnNlIGlzIGFscmVhZHkgYXZhaWxhYmxlIGFuZCBjYW4gYmUgcmV0cmlldmVkIGJ5IHtAbGluayAjZ2V0Q29udGFpbmVyUmVzcG9uc2UoKX0uIFRoZQorICAgICAgICAgKiByZXNwb25zZSBmaWx0ZXJzIGNhbiBiZSByZXRyaWV2ZWQgYnkge0BsaW5rICNnZXRDb250YWluZXJSZXNwb25zZUZpbHRlcnMoKX0uCisgICAgICAgICAqIDxwLz4KKyAgICAgICAgICogVGhpcyBwaGFzZSBpcyBleGVjdXRlZCBpbiB0aGUgcmVndWxhciByZXNwb25zZSBwcm9jZXNzaW5nIGJ1dCBtaWdodCBhbHNvIGJlZW4gZXhlY3V0ZWQgZm9yCisgICAgICAgICAqIHByb2Nlc3Npbmcgb24gcmVzcG9uc2UgbWFwcGVkIGZyb20gZXhjZXB0aW9ucyBieSB7QGxpbmsgRXhjZXB0aW9uTWFwcGVyIGV4Y2VwdGlvbiBtYXBwZXJzfS4KKyAgICAgICAgICogSW4gdGhpcyBjYXNlIHRoZSB7QGxpbmsgI09OX0VYQ0VQVElPTn0gZXZlbnQgdHlwZSBwcmVjZWRlcyB0aGlzIGV2ZW50LgorICAgICAgICAgKi8KKyAgICAgICAgUkVTUF9GSUxURVJTX1NUQVJULAorCisgICAgICAgIC8qKgorICAgICAgICAgKiBFeGVjdXRpb24gb2Yge0BsaW5rIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyIENvbnRhaW5lciByZXNwb25zZSBmaWx0ZXJzfSBoYXMgZmluaXNoZWQuCisgICAgICAgICAqIDxwLz4KKyAgICAgICAgICogVGhpcyBwaGFzZSBpcyBleGVjdXRlZCBpbiB0aGUgcmVndWxhciByZXNwb25zZSBwcm9jZXNzaW5nIGJ1dCBtaWdodCBhbHNvIGJlZW4gZXhlY3V0ZWQgZm9yCisgICAgICAgICAqIHByb2Nlc3Npbmcgb24gcmVzcG9uc2UgbWFwcGVkIGZyb20gZXhjZXB0aW9ucyBieSB7QGxpbmsgRXhjZXB0aW9uTWFwcGVyIGV4Y2VwdGlvbiBtYXBwZXJzfS4KKyAgICAgICAgICogSW4gdGhpcyBjYXNlIHRoZSB7QGxpbmsgI09OX0VYQ0VQVElPTn0gZXZlbnQgdHlwZSBwcmVjZWRlcyB0aGlzIGV2ZW50LgorICAgICAgICAgKi8KKyAgICAgICAgUkVTUF9GSUxURVJTX0ZJTklTSEVELAorCisgICAgICAgIC8qKgorICAgICAgICAgKiBFeGNlcHRpb24gaGFzIGJlZW4gdGhyb3duIGR1cmluZyB0aGUgcmVxdWVzdC9yZXNwb25zZSBwcm9jZXNzaW5nLiBUaGlzIHNpdHVhdGlvbiBjYW4KKyAgICAgICAgICogb2NjdXIgaW4gYWxtb3N0IGFsbCBwaGFzZXMgb2YgcmVxdWVzdCBwcm9jZXNzaW5nIGFuZCB0aGVyZWZvcmUgdGhlcmUgaXMgbm8gZml4ZWQgb3JkZXIgb2YKKyAgICAgICAgICogZXZlbnRzIGluIHdoaWNoIHRoaXMgZXZlbnQgdHlwZSBjYW4gYmUgdHJpZ2dlcmVkLgorICAgICAgICAgKiA8cC8+CisgICAgICAgICAqIFRoZSBvcmlnaW4gb2YgZXhjZXB0aW9uIGNhbiBiZSByZXRyaWV2ZWQKKyAgICAgICAgICogYnkge0BsaW5rICNnZXRFeGNlcHRpb25DYXVzZSgpfS4gVGhpcyBldmVudCB0eXBlIGNhbiBiZSByZWNlaXZlZCBldmVuIHR3byB0eXBlcyBpbiB0aGUgY2FzZQorICAgICAgICAgKiB3aGVuIGZpcnN0IGV4Y2VwdGlvbiBpcyB0aHJvd24gZHVyaW5nIHRoZSBzdGFuZGFyZCByZXF1ZXN0IHByb2Nlc3NpbmcgYW5kIHRoZSBzZWNvbmQgb25lCisgICAgICAgICAqIGlzIHRocm93biBkdXJpbmcgdGhlIHByb2Nlc3Npbmcgb2YgdGhlIHJlc3BvbnNlIG1hcHBlZCBmcm9tIHRoZSBleGNlcHRpb24uCisgICAgICAgICAqIDxwLz4KKyAgICAgICAgICogVGhlIGV4Y2VwdGlvbiB0aHJvd24gY2FuIGJlIHJldHJpZXZlZCBieSB7QGxpbmsgI2dldEV4Y2VwdGlvbigpfS4KKyAgICAgICAgICovCisgICAgICAgIE9OX0VYQ0VQVElPTiwKKworICAgICAgICAvKioKKyAgICAgICAgICogQW4ge0BsaW5rIEV4Y2VwdGlvbk1hcHBlcn0gaXMgc3VjY2Vzc2Z1bGx5IGZvdW5kIGFuZCBpdCBpcyBnb2luZyB0byBiZSBleGVjdXRlZC4gVGhlCisgICAgICAgICAqIHtAY29kZSBFeGNlcHRpb25NYXBwZXJ9IGNhbiBiZSByZXRyaWV2ZWQgYnkge0BsaW5rICNnZXRFeGNlcHRpb25NYXBwZXIoKX0uCisgICAgICAgICAqLworICAgICAgICBFWENFUFRJT05fTUFQUEVSX0ZPVU5ELAorCisgICAgICAgIC8qKgorICAgICAgICAgKiBFeGNlcHRpb24gbWFwcGluZyBpcyBmaW5pc2hlZC4gVGhlIHJlc3VsdCBvZiBleGNlcHRpb24gbWFwcGluZyBjYW4gYmUgY2hlY2tlZCBieQorICAgICAgICAgKiB7QGxpbmsgI2lzUmVzcG9uc2VTdWNjZXNzZnVsbHlNYXBwZWQoKX0gd2hpY2ggcmV0dXJucyB0cnVlIHdoZW4gdGhlIGV4Y2VwdGlvbiBtYXBwaW5nCisgICAgICAgICAqIHdhcyBzdWNjZXNzZnVsLiBJbiB0aGlzIGNhc2UgdGhlIG5ldyByZXNwb25zZSBpcyBhdmFpbGFibGUgaW4gdGhlIHtAbGluayAjZ2V0Q29udGFpbmVyUmVzcG9uc2UoKX0uCisgICAgICAgICAqLworICAgICAgICBFWENFUFRJT05fTUFQUElOR19GSU5JU0hFRCwKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2Nlc3NpbmcgaGFzIGZpbmlzaGVkLiBUaGUgcmVzdWx0IG9mIHJlcXVlc3QgcHJvY2Vzc2luZyBjYW4gYmUgY2hlY2tlZAorICAgICAgICAgKiBieSB7QGxpbmsgI2lzU3VjY2VzcygpfSBtZXRob2QuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBldmVuIHdoZW4gcmVxdWVzdCBwcm9jZXNzaW5nIGZhaWxzIGFuZCBlbmRzCisgICAgICAgICAqIHVwIHdpdGggbm90IGhhbmRsZWQgZXhjZXB0aW9ucy4KKyAgICAgICAgICovCisgICAgICAgIEZJTklTSEVECisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBEZXNjcmliZXMgdGhlIG9yaWdpbiBvZiB0aGUgZXhjZXB0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZW51bSBFeGNlcHRpb25DYXVzZSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBBbiBleGNlcHRpb24gd2FzIHRocm93biBkdXJpbmcgdGhlIHN0YW5kYXJkIHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2Nlc3NpbmcgYW5kIHdhcyBub3QgdGhyb3duCisgICAgICAgICAqIGZyb20gcHJvY2Vzc2luZyBvZiBtYXBwZWQgcmVzcG9uc2UuCisgICAgICAgICAqLworICAgICAgICBPUklHSU5BTCwKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFuIGV4Y2VwdGlvbiB3YXMgdGhyb3duIGR1cmluZyB0aGUgcHJvY2Vzc2luZyBvZiByZXNwb25zZQorICAgICAgICAgKiBtYXBwZWQgZnJvbSB7QGxpbmsgRXhjZXB0aW9uTWFwcGVyIGV4Y2VwdGlvbiBtYXBwZXJzfS4KKyAgICAgICAgICovCisgICAgICAgIE1BUFBFRF9SRVNQT05TRQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHtAbGluayBUeXBlIHR5cGV9IG9mIHRoaXMgZXZlbnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFJlcXVlc3QgZXZlbnQgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVHlwZSBnZXRUeXBlKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNvbnRhaW5lciByZXF1ZXN0LiBUaGUgY29udGFpbmVyIHJlcXVlc3QgaXMgYXZhaWxhYmxlIGZvciBhbGwgZXZlbnQgdHlwZXMuIFJldHVybmVkCisgICAgICogcmVxdWVzdCBtdXN0IG5vdCBiZSBtb2RpZmllZCBieSB0aGUge0BsaW5rIFJlcXVlc3RFdmVudExpc3RlbmVyIHJlcXVlc3QgZXZlbnQgbGlzdGVuZXJ9LgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgbm9uLW51bGwgY29udGFpbmVyIHJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIENvbnRhaW5lclJlcXVlc3QgZ2V0Q29udGFpbmVyUmVxdWVzdCgpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjb250YWluZXIgcmVzcG9uc2UuIFRoZSByZXNwb25zZSBpcyBhdmFpbGFibGUgb25seSBmb3IgY2VydGFpbiB7QGxpbmsgVHlwZSBldmVudCB0eXBlc30uIFRoZQorICAgICAqIHJldHVybmVkIHJlc3BvbnNlIG1pZ2h0IHZhcnkgYWxzbyBvbiB0aGUgZXZlbnQgdHlwZS4gVGhlIGdldHRlciByZXR1cm5zIGFsd2F5cyB0aGUgbGF0ZXN0IHJlc3BvbnNlIGJlaW5nCisgICAgICogcHJvY2Vzc2VkLiBTbywgZm9yIGV4YW1wbGUgZm9yIGV2ZW50IHtAbGluayBUeXBlI0VYQ0VQVElPTl9NQVBQSU5HX0ZJTklTSEVEfSBldmVudCB0eXBlIHRoZSBtZXRob2QKKyAgICAgKiByZXR1cm5zIG1hcHBlZCByZXNwb25zZSBhbmQgbm90IHRoZSBvcmlnaW5hbCByZXNwb25zZSBjcmVhdGVkIGZyb20gZXhlY3V0aW9uIG9mIHRoZSByZXNvdXJjZSBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIExhdGVzdCByZXNwb25zZSBiZWluZyBwcm9jZXNzZWQgb3Ige0Bjb2RlIG51bGx9IGlmIG5vIHJlc3BvbnNlIGhhcyBiZWVuIHByb2R1Y2VkIHlldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGFpbmVyUmVzcG9uc2UgZ2V0Q29udGFpbmVyUmVzcG9uc2UoKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbGF0ZXN0IGV4Y2VwdGlvbiwgaWYgYW55LCB0aHJvd24gYnkgdGhlIHJlcXVlc3QgYW5kIHJlc3BvbnNlIHByb2Nlc3NpbmcuIFdoZW4gdGhpcyBtZXRob2QKKyAgICAgKiByZXR1cm5zIG5vdCBudWxsIHZhbHVlLCB0aGUgbWV0aG9kIHtAbGluayAjZ2V0RXhjZXB0aW9uQ2F1c2UoKX0gcmV0dXJucyB0aGUgb3JpZ2luIG9mIHRoZSBleGNlcHRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEV4Y2VwdGlvbiB0aHJvd24gb3Ige0Bjb2RlIG51bGx9IGlmIG5vIGV4Y2VwdGlvbiBoYXMgYmVlbiB0aHJvd24uCisgICAgICovCisgICAgcHVibGljIFRocm93YWJsZSBnZXRFeGNlcHRpb24oKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUge0BsaW5rIEV4dGVuZGVkVXJpSW5mbyBleHRlbmRlZCB1cmkgaW5mb30gYXNzb2NpYXRlZCB3aXRoIHRoaXMgcmVxdWVzdC4gVGhpcyBtZXRob2QgcmV0dXJucworICAgICAqIG51bGwgZm9yIHtAbGluayBUeXBlI1NUQVJUfSBldmVudC4gVGhlIHJldHVybmVkIHtAY29kZSBFeHRlbmRlZFVyaUluZm99IGNhbiBiZSB1c2VkIHRvIHJldHJpZXZlCisgICAgICogaW5mb3JtYXRpb24gcmVsZXZhbnQgdG8gbWFueSBldmVudCB0eXBlcyAoZXNwZWNpYWxseSBldmVudCB0eXBlcyBkZXNjcmliaW5nIHRoZSBtYXRjaGluZyBwcm9jZXNzKS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gRXh0ZW5kZWQgdXJpIGluZm8gb3Ige0Bjb2RlIG51bGx9IGlmIGl0IGlzIG5vdCBhdmFpbGFibGUgeWV0LgorICAgICAqLworICAgIHB1YmxpYyBFeHRlbmRlZFVyaUluZm8gZ2V0VXJpSW5mbygpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSB7QGxpbmsgRXhjZXB0aW9uTWFwcGVyfSB0aGF0IHdhcyBmb3VuZCBhbmQgdXNlZCBkdXJpbmcgdGhlIGV4Y2VwdGlvbiBtYXBwaW5nIHBoYXNlLgorICAgICAqCisgICAgICogQHJldHVybiBFeGNlcHRpb24gbWFwcGVyIG9yIHtAY29kZSBudWxsfSBpZiBubyBleGNlcHRpb24gbWFwcGVyIHdhcyBmb3VuZCBvciBldmVuIG5lZWRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRXhjZXB0aW9uTWFwcGVyPD8+IGdldEV4Y2VwdGlvbk1hcHBlcigpOworCisKKyAgICAvKioKKyAgICAgKiBHZXQge0BsaW5rIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIgY29udGFpbmVyIHJlcXVlc3QgZmlsdGVyc30gdXNlZCBkdXJpbmcgdGhlIHJlcXVlc3QgZmlsdGVyaW5nCisgICAgICogcGhhc2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIENvbnRhaW5lciByZXF1ZXN0IGZpbHRlcnMgb3Ige0Bjb2RlIG51bGx9IGlmIG5vIGZpbHRlcnMgd2VyZSB1c2VkIHlldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlcmFibGU8Q29udGFpbmVyUmVxdWVzdEZpbHRlcj4gZ2V0Q29udGFpbmVyUmVxdWVzdEZpbHRlcnMoKTsKKworICAgIC8qKgorICAgICAqIEdldCB7QGxpbmsgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXIgY29udGFpbmVyIHJlc3BvbnNlIGZpbHRlcnN9IHVzZWQgZHVyaW5nIHRoZSByZXNwb25zZSBmaWx0ZXJpbmcKKyAgICAgKiBwaGFzZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQ29udGFpbmVyIHJlc3BvbnNlIGZpbHRlciBvciB7QGNvZGUgbnVsbH0gaWYgbm8gZmlsdGVycyB3ZXJlIHVzZWQgeWV0LgorICAgICAqLworICAgIHB1YmxpYyBJdGVyYWJsZTxDb250YWluZXJSZXNwb25zZUZpbHRlcj4gZ2V0Q29udGFpbmVyUmVzcG9uc2VGaWx0ZXJzKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSByZXF1ZXN0IGFuZCByZXNwb25zZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgcHJvY2Vzc2VkLiBSZXNwb25zZSBpcyBzdWNjZXNzZnVsbHkKKyAgICAgKiBwcm9jZXNzZWQgd2hlbiB0aGUgcmVzcG9uc2UgY29kZSBpcyBzbWFsbGVyIHRoYW4gNDAwIGFuZCByZXNwb25zZSB3YXMgc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4uIElmIHRoZSBleGNlcHRpb24KKyAgICAgKiBvY2N1cnJlZCBidXQgd2FzIG1hcHBlZCBpbnRvIGEgcmVzcG9uc2Ugd2l0aCBzdWNjZXNzZnVsIHJlc3BvbnNlIGNvZGUgYW5kIHdyaXR0ZW4sIHRoaXMgbWV0aG9kIHJldHVybnMKKyAgICAgKiB7QGNvZGUgdHJ1ZX0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJlc3BvbnNlIHdhcyBzdWNjZXNzZnVsbHkgcHJvY2Vzc2VkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzU3VjY2VzcygpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHJlc3BvbnNlIHdhcyBzdWNjZXNzZnVsbHkgbWFwcGVkIGZyb20gYW4gZXhjZXB0aW9uCisgICAgICogYnkge0BsaW5rIEV4Y2VwdGlvbk1hcHBlciBleGNlcHRpb24gbWFwcGVyc30uIFdoZW4gZXhjZXB0aW9uIG1hcHBpbmcgcGhhc2UgZmFpbGVkIG9yIHdoZW4KKyAgICAgKiBubyBleGNlcHRpb24gd2FzIHRocm93biBhdCBhbGwgdGhlLCB0aGUgbWV0aG9kIHJldHVybnMgZmFsc2UuIFRoaXMgbWV0aG9kIGlzIGNvbnZlbmllbnQgd2hlbgorICAgICAqIGhhbmRsaW5nIHRoZSB7QGxpbmsgVHlwZSNFWENFUFRJT05fTUFQUElOR19GSU5JU0hFRH0gZXZlbnQgdHlwZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZXhjZXB0aW9uIG9jY3VycmVkIGFuZCBpdCB3YXMgc3VjY2Vzc2Z1bGx5IG1hcHBlZCBpbnRvIGEgcmVzcG9uc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNSZXNwb25zZVN1Y2Nlc3NmdWxseU1hcHBlZCgpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSB7QGxpbmsgRXhjZXB0aW9uQ2F1c2UgZXhjZXB0aW9uIGNhdXNlfS4gVGhpcyBtZXRob2QgaXMgcmVsZXZhbnQgb25seSBpbiBjYXNlcyB3aGVuCisgICAgICoge0BsaW5rICNnZXRFeGNlcHRpb24oKX0gcmV0dXJucyBub24tbnVsbCB2YWx1ZSAoZm9yIGV4YW1wbGUgd2hlbiBoYW5kbGluZyB7QGxpbmsgVHlwZSNPTl9FWENFUFRJT059KQorICAgICAqIGV2ZW50IHR5cGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEV4Y2VwdGlvbiBjYXVzZSBvZiB0aGUgbGF0ZXN0IGV4Y2VwdGlvbiBvciB7QGNvZGUgbnVsbH0gaWYgbm8gZXhjZXB0aW9uIGhhcyBvY2N1cnJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRXhjZXB0aW9uQ2F1c2UgZ2V0RXhjZXB0aW9uQ2F1c2UoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoZSByZXNwb25zZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgd3JpdHRlbi4ge0Bjb2RlIHRydWV9IGlzIHJldHVybmVkCisgICAgICogZXZlbiBmb3IgY2FzZXMgd2hlbiB0aGUgd3JpdHRlbiByZXNwb25zZSBjb250YWlucyBlcnJvciByZXNwb25zZSBjb2RlLgorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHJlc3BvbnNlIHdhcyBzdWNjZXNzZnVsbHkgd3JpdHRlbjt7QGNvZGUgZmFsc2V9IHdoZW4gdGhlIHJlc3BvbnNlCisgICAgICogICAgICAgICBoYXMgbm90IGJlZW4gd3JpdHRlbiB5ZXQgb3Igd2hlbiB3cml0aW5nIG9mIHJlc3BvbnNlIGZhaWxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Jlc3BvbnNlV3JpdHRlbigpOworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9uaXRvcmluZy9SZXF1ZXN0RXZlbnRMaXN0ZW5lci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9uaXRvcmluZy9SZXF1ZXN0RXZlbnRMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMmM1NGEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb25pdG9yaW5nL1JlcXVlc3RFdmVudExpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZzsKKworLyoqCisgKiBOb24tcmVnaXN0cmFibGUgcHJvdmlkZXIgdGhhdCBsaXN0ZW5zIHRvIHtAbGluayBSZXF1ZXN0RXZlbnQgcmVxdWVzdCBldmVudHN9LgorICogPHAvPgorICogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcmZhY2Ugd2lsbCBiZSBjYWxsZWQgZm9yIHJlcXVlc3QgZXZlbnRzIHdoZW4gdGhleSBvY2N1ci4gVGhlIHByb3ZpZGVyCisgKiBjYW5ub3QgYmUgcmVnaXN0ZXJlZCBhcyBhIHN0YW5kYXJkIEpBWC1SUyBvciBKZXJzZXkgcHJvdmlkZXIuIFRoZSBpbnN0YW5jZSBvZiB0aGUKKyAqIHtAY29kZSBSZXF1ZXN0RXZlbnRMaXN0ZW5lcn0gbXVzdCBiZSByZXR1cm5lZCBmcm9tIHRoZSB7QGxpbmsgQXBwbGljYXRpb25FdmVudExpc3RlbmVyI29uUmVxdWVzdChSZXF1ZXN0RXZlbnQpfS4KKyAqIFRoaXMgd2lsbCByZWdpc3RlciB0aGUgaW5zdGFuY2UgZm9yIGxpc3RlbmluZyBvZiByZXF1ZXN0IGV2ZW50cyBmb3Igb25lIHBhcnRpY3VsYXIgcmVxdWVzdC4gT25jZQorICogdGhlIHByb2Nlc3Npbmcgb2YgdGhlIHJlcXVlc3QgaXMgZmluaXNoZWQsIHRoZSBpbnN0YW5jZSB3aWxsIGJlIGlnbm9yZWQgYnkgdGhlIEplcnNleSBydW50aW1lIGFuZCBub3QgdXNlZAorICogZm9yIHByb2Nlc3Npbmcgb2YgZnVydGhlciByZXF1ZXN0cy4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKiBAc2VlIEFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lciBmb3IgZGV0YWlscyBvZiBob3cgdG8gcmVnaXN0ZXIgdGhlIHtAY29kZSBSZXF1ZXN0RXZlbnRMaXN0ZW5lcn0uCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUmVxdWVzdEV2ZW50TGlzdGVuZXIgeworICAgIC8qKgorICAgICAqIFRoZSBtZXRob2QgaXMgY2FsbGVkIHdoZW4gbmV3IHJlcXVlc3QgZXZlbnQgb2NjdXJzLiBUaGlzIG1ldGhvZCB3aWxsIG5ldmVyIGJlIGNhbGxlZCBmb3IgbWV0aG9kCisgICAgICoge0BsaW5rIFJlcXVlc3RFdmVudC5UeXBlI1NUQVJUfSBhcyB0aGlzIGV2ZW50IGlzIGhhbmRsZWQgYnkge0BsaW5rIEFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lcn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXZlbnQgUmVxdWVzdCBldmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkV2ZW50KFJlcXVlc3RFdmVudCBldmVudCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb25pdG9yaW5nL1Jlc291cmNlTVhCZWFuLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb25pdG9yaW5nL1Jlc291cmNlTVhCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE1MDE0NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vbml0b3JpbmcvUmVzb3VyY2VNWEJlYW4uamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nOworCisvKioKKyAqIE1YQmVhbiBpbnRlcmZhY2Ugb2YgcmVzb3VyY2UgTVhCZWFucy4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUmVzb3VyY2VNWEJlYW4geworICAgIC8qKgorICAgICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgcmVzb3VyY2UuIFRoZSBuYW1lIGNhbiBiZSBVUkkgb3IgcmVzb3VyY2UgY2xhc3MgbmFtZSBkZXBlbmRpbmcgb24gdGhlIHVzYWdlCisgICAgICogb2YgTVhCZWFuLgorICAgICAqCisgICAgICogQHJldHVybiBOYW1lIG9mIHRoZSBNWEJlYW4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb25pdG9yaW5nL1Jlc291cmNlTWV0aG9kTVhCZWFuLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb25pdG9yaW5nL1Jlc291cmNlTWV0aG9kTVhCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ1YjhjMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vbml0b3JpbmcvUmVzb3VyY2VNZXRob2RNWEJlYW4uamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nOworCisvKioKKyAqIE1YQmVhbiBpbnRlcmZhY2Ugb2YgcmVzb3VyY2UgbWV0aG9kIE1YQmVhbnMuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgaW50ZXJmYWNlIFJlc291cmNlTWV0aG9kTVhCZWFuIHsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbmFtZSBvZiB0aGUgSmF2YSBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE5hbWUgb2YgbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kTmFtZSgpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBzdWIgcmVzb3VyY2UgbWV0aG9kIHBhdGggb2YgdGhlIG1ldGhvZC4gVGhpcyBmaWVsZCBpcyBub24tbnVsbCBvbmx5IGZvcgorICAgICAqIHN1YiByZXNvdXJjZSBtZXRob2RzIGFuZCBjb250YWlucyBwYXRoIHJlbGF0aXZlIHRvIHJlc291cmNlIGluIHdoaWNoIHRoZSBtZXRob2QgaXMgZGVmaW5lZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gU3ViIHJlc291cmNlIG1ldGhvZCBwYXRoIG9yIG51bGwgaWYgdGhlIG1ldGhvZCBpcyBub3QgYSBzdWIgcmVzb3VyY2UgbWV0aG9kLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBIVFRQIG1ldGhvZCBvZiB0aGUgbWV0aG9kLgorICAgICAqCisgICAgICogQHJldHVybiBIVFRQIG1ldGhvZCAoZS5nLiBHRVQsIFBPU1QsIC4uLikKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEh0dHBNZXRob2QoKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZnVsbCBjbGFzcyBuYW1lIG9mIHRoZSBjbGFzcyB0aGF0IGRlY2xhcmVzIHRoZSBoYW5kbGluZyBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEZ1bGwgY2xhc3MgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERlY2xhcmluZ0NsYXNzTmFtZSgpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBzdHJpbmcgd2l0aCBtZWRpYSB0eXBlcyBjb25zdW1lZCBieSB0aGlzIG1ldGhvZCwgZW5jbG9zZWQgaW4gZG91YmxlIHF1b3RhcyBhbmQKKyAgICAgKiBzZXBhcmF0ZWQgYnkgYSBjb21tYSAoZS5nLiAidGV4dC9wbGFpbiIsInRleHQvaHRtbCIpLgorICAgICAqCisgICAgICogQHJldHVybiBDb25zdW1lZCBtZWRpYSB0eXBlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbnN1bWVzTWVkaWFUeXBlKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHN0cmluZyB3aXRoIG1lZGlhIHR5cGVzIHByb2R1Y2VkIGJ5IHRoaXMgbWV0aG9kLCBlbmNsb3NlZCBpbiBkb3VibGUgcXVvdGFzIGFuZAorICAgICAqIHNlcGFyYXRlZCBieSBhIGNvbW1hIChlLmcuICJ0ZXh0L3BsYWluIiwidGV4dC9odG1sIikuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFByb2R1Y2VkIG1lZGlhIHR5cGVzLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvZHVjZXNNZWRpYVR5cGUoKTsKKworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9uaXRvcmluZy9SZXNvdXJjZU1ldGhvZFN0YXRpc3RpY3MuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vbml0b3JpbmcvUmVzb3VyY2VNZXRob2RTdGF0aXN0aWNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIyMzllYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vbml0b3JpbmcvUmVzb3VyY2VNZXRob2RTdGF0aXN0aWNzLmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1ldGhvZDsKKworLyoqCisgKiBNb25pdG9yaW5nIHN0YXRpc3RpY3MgYW4gb2YgYW4gZXhlY3V0aW9uIG9mIHRoZSByZXNvdXJjZSBtZXRob2QuIFRoZSB7QGxpbmsgI3NuYXBzaG90KCl9CisgKiBtZXRob2QgcmV0dXJucyBhbiBpbW11dGFibGUgc25hcHNob3Qgd2l0aCBjb25zaXN0ZW50IGRhdGEuIFRoZSBwcmluY2lwbGVzIG9mIHVzaW5nIHN0YXRpc3RpY3MKKyAqIGlzIHNpbWlsYXIgdG8gcHJpbmNpcGxlcyBvZiB1c2luZyB7QGxpbmsgTW9uaXRvcmluZ1N0YXRpc3RpY3N9LgorICogPHAvPgorICogU3RhdGlzdGljcyBjb250YWluIHR3byB7QGxpbmsgRXhlY3V0aW9uU3RhdGlzdGljc30gd2hlcmUge0BsaW5rICNnZXRNZXRob2RTdGF0aXN0aWNzKCl9IGNvbnRhaW5zCisgKiBzdGF0aXN0aWNzIGZvciBleGVjdXRpb24gb2YgdGhlIGNvZGUgb2YgcmVzb3VyY2UgbWV0aG9kIGFuZCB7QGxpbmsgI2dldFJlcXVlc3RTdGF0aXN0aWNzKCl9IGNvbnRhaW5zCisgKiBzdGF0aXN0aWNzIGZvciBjb21wbGV0ZSBwcm9jZXNzaW5nIG9mIHJlcXVlc3RzIHRoYXQgd2VyZSBtYXRjaGVkIHRvIHRoZSByZXNvdXJjZSBtZXRob2QuIFRoaXMgaW1wbGllcyB0aGF0CisgKiB7QGxpbmsgI2dldFJlcXVlc3RTdGF0aXN0aWNzKCl9IHdpbGwgdGVuZCB0byBjb250YWluIGhpZ2hlciB0aW1lIG1lYXN1cmVtZW50cyBhcyB0aGV5IG1lYXN1cmUgdG90YWwgcmVxdWVzdAorICogcHJvY2Vzc2luZyB0aW1lIGFuZCBub3Qgb25seSBleGVjdXRpb24gb2YgdGhlIHJlc291cmNlIG1ldGhvZC4KKyAqIDxwLz4KKyAqIFN0YXRpc3RpY3MgcmV0cmlldmVkIGZyb20gSmVyc2V5IHJ1bnRpbWUgbWlnaHQgYmUgbXV0YWJsZSBhbmQgdGhhbmtzIHRvIGl0IG1pZ2h0IHByb3ZpZGUgaW5jb25zaXN0ZW50IGRhdGEKKyAqIGFzIG5vdCBhbGwgc3RhdGlzdGljcyBhcmUgdXBkYXRlZCBpbiB0aGUgc2FtZSB0aW1lLiBUbyByZXRyaWV2ZSB0aGUgaW1tdXRhYmxlIGFuZCBjb25zaXN0ZW50CisgKiBzdGF0aXN0aWNzIGRhdGEgdGhlIG1ldGhvZCB7QGxpbmsgI3NuYXBzaG90KCl9IHNob3VsZCBiZSB1c2VkLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqIEBzZWUgTW9uaXRvcmluZ1N0YXRpc3RpY3MgU2VlIG1vbml0b3Jpbmcgc3RhdGlzdGljcyBmb3IgbW9yZSBkZXRhaWxzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIFJlc291cmNlTWV0aG9kU3RhdGlzdGljcyB7CisKKyAgICAvKioKKyAgICAgKiBHZXQge0BsaW5rIEV4ZWN1dGlvblN0YXRpc3RpY3MgZXhlY3V0aW9uIHN0YXRpc3RpY3N9IHRoYXQgY29udGFpbiBtZWFzdXJlbWVudHMgb2YgdGltZXMgb25seSBmb3IKKyAgICAgKiBleGVjdXRpb24gb2YgcmVzb3VyY2UgbWV0aG9kLiBEdXJhdGlvbnMgYXZlcmFnZSB0aW1lLCBtaW5pbXVtIHRpbWUgYW5kIG1heGltdW0gdGltZQorICAgICAqIG1lYXN1cmUgb25seSB0aW1lIG9mIGV4ZWN1dGlvbiBvZiByZXNvdXJjZSBtZXRob2QgY29kZS4gSXQgZG9lcyBub3QgaW52b2x2ZSBvdGhlciByZXF1ZXN0IHByb2Nlc3NpbmcKKyAgICAgKiBwaGFzZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEV4ZWN1dGlvbiBzdGF0aXN0aWNzIG9mIG9uZSByZXNvdXJjZSBtZXRob2QuCisgICAgICovCisgICAgcHVibGljIEV4ZWN1dGlvblN0YXRpc3RpY3MgZ2V0TWV0aG9kU3RhdGlzdGljcygpOworCisKKyAgICAvKioKKyAgICAgKiBHZXQge0BsaW5rIEV4ZWN1dGlvblN0YXRpc3RpY3MgZXhlY3V0aW9uIHN0YXRpc3RpY3N9IHRoYXQgY29udGFpbiBtZWFzdXJlbWVudHMgb2YgdGltZXMgZm9yCisgICAgICogd2hvbGUgcHJvY2Vzc2luZyBmcm9tIHRpbWUgd2hlbiByZXF1ZXN0IGNvbWVzIGludG8gdGhlIEplcnNleSBhcHBsaWNhdGlvbiB1bnRpbCB0aGUgcmVzcG9uc2UKKyAgICAgKiBpcyB3cml0dGVuIHRvIHRoZSB1bmRlcmx5aW5nIElPIGNvbnRhaW5lci4gVGhlIHN0YXRpc3RpY3MgaW52b2x2ZXMgb25seSByZXF1ZXN0cyB0aGF0IHdlcmUgbWF0Y2hlZAorICAgICAqIHRvIHJlc291cmNlIG1ldGhvZCBkZWZpbmVkIGJ5IHtAbGluayAjZ2V0UmVzb3VyY2VNZXRob2QoKX0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEV4ZWN1dGlvbiBzdGF0aXN0aWNzIG9mIGVudGlyZSByZXF1ZXN0IHByb2Nlc3NpbmcgZm9yIG9uZSByZXNvdXJjZSBtZXRob2QuCisgICAgICovCisgICAgcHVibGljIEV4ZWN1dGlvblN0YXRpc3RpY3MgZ2V0UmVxdWVzdFN0YXRpc3RpY3MoKTsKKworICAgIC8qKgorICAgICAqIEdldCBhIHtAbGluayBSZXNvdXJjZU1ldGhvZCByZXNvdXJjZSBtZXRob2R9IGZvciB3aGljaCB0aGlzIHtAbGluayBSZXNvdXJjZU1ldGhvZFN0YXRpc3RpY3N9IGFyZSBjYWxjdWxhdGVkLgorICAgICAqCisgICAgICogQHJldHVybiBSZXNvdXJjZSBtZXRob2QuCisgICAgICovCisgICAgcHVibGljIFJlc291cmNlTWV0aG9kIGdldFJlc291cmNlTWV0aG9kKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGltbXV0YWJsZSBhbmQgY29uc2lzdGVudCBzbmFwc2hvdCBvZiB0aGUgbW9uaXRvcmluZyBzdGF0aXN0aWNzLiBXb3JraW5nIHdpdGggc25hcHNob3RzIG1pZ2h0CisgICAgICogaGF2ZSBuZWdhdGl2ZSBwZXJmb3JtYW5jZSBpbXBhY3QgYXMgc25hcHNob3QgbXVzdCBiZSBjcmVhdGVkIGJ1dCBlbnN1cmVzIGNvbnNpc3RlbmN5IG9mIGRhdGEgb3ZlciB0aW1lLgorICAgICAqIEhvd2V2ZXIsIHRoZSB1c2FnZSBvZiBzbmFwc2hvdCBpcyBlbmNvdXJhZ2VkIHRvIGF2b2lkIHdvcmtpbmcgd2l0aCBpbmNvbnNpc3RlbnQgZGF0YS4gTm90IGFsbCBzdGF0aXN0aWNzCisgICAgICogbXVzdCBiZSB1cGRhdGVkIGluIHRoZSBzYW1lIHRpbWUgb24gbXV0YWJsZSB2ZXJzaW9uIG9mIHN0YXRpc3RpY3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFNuYXBzaG90IG9mIHJlc291cmNlIG1ldGhvZCBzdGF0aXN0aWNzLgorICAgICAqIEBkZXByZWNhdGVkIGltcGxlbWVudGluZyBjbGFzcyBpcyBpbW11dGFibGUgaGVuY2Ugc25hcHNob3QgY3JlYXRpb24gaXMgbm90IG5lZWRlZCBhbnltb3JlCisgICAgICovCisgICAgQERlcHJlY2F0ZWQKKyAgICBwdWJsaWMgUmVzb3VyY2VNZXRob2RTdGF0aXN0aWNzIHNuYXBzaG90KCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb25pdG9yaW5nL1Jlc291cmNlU3RhdGlzdGljcy5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9uaXRvcmluZy9SZXNvdXJjZVN0YXRpc3RpY3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDhjOGU0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9uaXRvcmluZy9SZXNvdXJjZVN0YXRpc3RpY3MuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1ldGhvZDsKKworLyoqCisgKiBNb25pdG9yaW5nIHN0YXRpc3RpY3Mgb2YgdGhlIHJlc291cmNlLiBUaGUgcmVzb3VyY2UgaXMgYSBzZXQgb2YgcmVzb3VyY2UgbWV0aG9kcyB3aXRoIHNwZWNpZmljIGNoYXJhY3RlcmlzdGljcworICogdGhhdCBpcyBub3QgZGVmaW5lZCBieSB0aGlzIGludGVyZmFjZS4gVGhlIHJlc291cmNlIGNhbiBiZSBzZXQgb2YgcmVzb3VyY2UgbWV0aG9kcyB0aGF0IGFyZSBhY2Nlc3NpYmxlIG9uCisgKiB0aGUgc2FtZSBVUkkgKGluIHRoZSBjYXNlIG9mIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5Nb25pdG9yaW5nU3RhdGlzdGljcyNnZXRVcmlTdGF0aXN0aWNzKCl9KQorICogb3IgdGhlIHNldCBvZiByZXNvdXJjZSBtZXRob2RzIGRlZmluZWQgaW4gb25lIHtAbGluayBDbGFzc30gKGluIGNhc2UKKyAqIG9mIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5Nb25pdG9yaW5nU3RhdGlzdGljcyNnZXRSZXNvdXJjZUNsYXNzU3RhdGlzdGljcygpfSkuCisgKiA8cC8+CisgKiBTdGF0aXN0aWNzIHJldHJpZXZlZCBmcm9tIEplcnNleSBydW50aW1lIG1pZ2h0IGJlIG11dGFibGUgYW5kIHRoYW5rcyB0byBpdCBtaWdodCBwcm92aWRlIGluY29uc2lzdGVudCBkYXRhCisgKiBhcyBub3QgYWxsIHN0YXRpc3RpY3MgYXJlIHVwZGF0ZWQgaW4gdGhlIHNhbWUgdGltZS4gVG8gcmV0cmlldmUgdGhlIGltbXV0YWJsZSBhbmQgY29uc2lzdGVudAorICogc3RhdGlzdGljcyBkYXRhIHRoZSBtZXRob2Qge0BsaW5rICNzbmFwc2hvdCgpfSBzaG91bGQgYmUgdXNlZC4KKyAqIDxwLz4KKyAqCisgKiBUaGUgcHJpbmNpcGxlcyBvZiB1c2luZyBzdGF0aXN0aWNzCisgKiBpcyBzaW1pbGFyIHRvIHByaW5jaXBsZXMgb2YgdXNpbmcge0BsaW5rIE1vbml0b3JpbmdTdGF0aXN0aWNzfS4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKiBAc2VlIE1vbml0b3JpbmdTdGF0aXN0aWNzIFNlZSBtb25pdG9yaW5nIHN0YXRpc3RpY3MgZm9yIGdlbmVyYWwgZGV0YWlscyBhYm91dCBzdGF0aXN0aWNzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIFJlc291cmNlU3RhdGlzdGljcyB7CisgICAgLyoqCisgICAgICogR2V0IHtAbGluayBFeGVjdXRpb25TdGF0aXN0aWNzIGV4ZWN1dGlvbiBzdGF0aXN0aWNzfSB0aGF0IGNvbnRhaW4gbWVhc3VyZW1lbnRzIG9mIHRpbWVzIG9ubHkgZm9yCisgICAgICogZXhlY3V0aW9uIG9mIHJlc291cmNlIG1ldGhvZHMuIER1cmF0aW9ucyBhdmVyYWdlIHRpbWUsIG1pbmltdW0gdGltZSBhbmQgbWF4aW11bSB0aW1lCisgICAgICogbWVhc3VyZSBvbmx5IHRpbWUgb2YgZXhlY3V0aW9uIG9mIHJlc291cmNlIG1ldGhvZHMgY29kZS4gSXQgZG9lcyBub3QgaW52b2x2ZSBvdGhlciByZXF1ZXN0IHByb2Nlc3NpbmcKKyAgICAgKiBwaGFzZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEV4ZWN1dGlvbiBzdGF0aXN0aWNzIG9mIGFsbCByZXNvdXJjZSBtZXRob2QgaW4gdGhpcyByZXNvdXJjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRXhlY3V0aW9uU3RhdGlzdGljcyBnZXRSZXNvdXJjZU1ldGhvZEV4ZWN1dGlvblN0YXRpc3RpY3MoKTsKKworICAgIC8qKgorICAgICAqIEdldCB7QGxpbmsgRXhlY3V0aW9uU3RhdGlzdGljcyBleGVjdXRpb24gc3RhdGlzdGljc30gdGhhdCBjb250YWluIG1lYXN1cmVtZW50cyBvZiB0aW1lcyBmb3IKKyAgICAgKiB3aG9sZSBwcm9jZXNzaW5nIGZyb20gdGltZSB3aGVuIHJlcXVlc3QgY29tZXMgaW50byB0aGUgSmVyc2V5IGFwcGxpY2F0aW9uIHVudGlsIHRoZSByZXNwb25zZQorICAgICAqIGlzIHdyaXR0ZW4gdG8gdGhlIHVuZGVybHlpbmcgSU8gY29udGFpbmVyLiBUaGUgc3RhdGlzdGljcyBpbnZvbHZlcyBvbmx5IHJlcXVlc3RzIHRoYXQgd2VyZSBtYXRjaGVkCisgICAgICogdG8gcmVzb3VyY2UgbWV0aG9kcyBkZWZpbmVkIGluIHtAbGluayAjZ2V0UmVzb3VyY2VNZXRob2RTdGF0aXN0aWNzKCl9LgorICAgICAqCisgICAgICogQHJldHVybiBFeGVjdXRpb24gc3RhdGlzdGljcyBvZiBlbnRpcmUgcmVxdWVzdCBwcm9jZXNzaW5nIGZvciBhbGwgcmVzb3VyY2UgbWV0aG9kIGZyb20gdGhpcyByZXNvdXJjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRXhlY3V0aW9uU3RhdGlzdGljcyBnZXRSZXF1ZXN0RXhlY3V0aW9uU3RhdGlzdGljcygpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBzdGF0aXN0aWNzIGZvciByZXNvdXJjZSBtZXRob2QuIEtleXMgb2YgcmV0dXJuZWQgbWFwIGFyZSB7QGxpbmsgUmVzb3VyY2VNZXRob2QgcmVzb3VyY2UgbWV0aG9kc30KKyAgICAgKiBhdmFpbGFibGUgaW4gdGhlIHJlc291cmNlIGFuZCB2YWx1ZXMgYXJlIGV4ZWN1dGlvbiBzdGF0aXN0aWNzIG9mIHRoZXNlIHJlc291cmNlIG1ldGhvZHMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE1hcCB3aXRoIHtAbGluayBSZXNvdXJjZU1ldGhvZCByZXNvdXJjZSBtZXRob2R9IGtleXMKKyAgICAgKiAgICAgICAgIGFuZCBjb3JyZXNwb25kaW5nIHtAbGluayBSZXNvdXJjZU1ldGhvZFN0YXRpc3RpY3MgcmVzb3VyY2UgbWV0aG9kIHN0YXRpc3RpY3N9LgorICAgICAqLworICAgIHB1YmxpYyBNYXA8UmVzb3VyY2VNZXRob2QsIFJlc291cmNlTWV0aG9kU3RhdGlzdGljcz4gZ2V0UmVzb3VyY2VNZXRob2RTdGF0aXN0aWNzKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGltbXV0YWJsZSBhbmQgY29uc2lzdGVudCBzbmFwc2hvdCBvZiB0aGUgbW9uaXRvcmluZyBzdGF0aXN0aWNzLiBXb3JraW5nIHdpdGggc25hcHNob3RzIG1pZ2h0CisgICAgICogaGF2ZSBuZWdhdGl2ZSBwZXJmb3JtYW5jZSBpbXBhY3QgYXMgc25hcHNob3QgbXVzdCBiZSBjcmVhdGVkIGJ1dCBlbnN1cmVzIGNvbnNpc3RlbmN5IG9mIGRhdGEgb3ZlciB0aW1lLgorICAgICAqIEhvd2V2ZXIsIHRoZSB1c2FnZSBvZiBzbmFwc2hvdCBpcyBlbmNvdXJhZ2VkIHRvIGF2b2lkIHdvcmtpbmcgd2l0aCBpbmNvbnNpc3RlbnQgZGF0YS4gTm90IGFsbCBzdGF0aXN0aWNzCisgICAgICogbXVzdCBiZSB1cGRhdGVkIGluIHRoZSBzYW1lIHRpbWUgb24gbXV0YWJsZSB2ZXJzaW9uIG9mIHN0YXRpc3RpY3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFNuYXBzaG90IG9mIHJlc291cmNlIHN0YXRpc3RpY3MuCisgICAgICogQGRlcHJlY2F0ZWQgaW1wbGVtZW50aW5nIGNsYXNzIGlzIGltbXV0YWJsZSBoZW5jZSBzbmFwc2hvdCBjcmVhdGlvbiBpcyBub3QgbmVlZGVkIGFueW1vcmUKKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBSZXNvdXJjZVN0YXRpc3RpY3Mgc25hcHNob3QoKTsKKworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9uaXRvcmluZy9SZXNwb25zZU1YQmVhbi5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9uaXRvcmluZy9SZXNwb25zZU1YQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlODU4YmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb25pdG9yaW5nL1Jlc3BvbnNlTVhCZWFuLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZzsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogTVhCZWFuIGludGVyZmFjZSBvZiByZXNwb25zZSBNWEJlYW4uCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgaW50ZXJmYWNlIFJlc3BvbnNlTVhCZWFuIHsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHN0YXRpc3RpY3Mgb2YgcmVzcG9uc2UgY29kZXMgcHJvZHVjZXMgYnkgdGhlIGFwcGxpY2F0aW9uLiBLZXlzIG9mIGEgcmV0dXJuZWQKKyAgICAgKiBtYXAgYXJlIHJlc3BvbnNlIHN0YXR1cyBjb2RlcyBhbmQgdmFsdWVzIGlzIHRoZSB0aGUgY291bnQgb2YgcmVzcG9uc2VzIHdpdGggdGhlc2UKKyAgICAgKiBzdGF0dXMgY291bnQuIFZhbHVlcyBhcmUgbWVhc3VyZWQgc2luY2Ugc3RhcnQgb2YgdGhlIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBNYXAgd2l0aCBzdGF0dXMgY29kZXMga2V5cyBhbmQgY291bnQgYXMgdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyBNYXA8SW50ZWdlciwgTG9uZz4gZ2V0UmVzcG9uc2VDb2Rlc1RvQ291bnRNYXAoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHJlc3BvbnNlIGNvZGUgb2YgYSBsYXN0IHJlc3BvbnNlIHdyaXR0ZW4gYnkgdGhlIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBMYXN0IHJlc3BvbnNlIHN0YXR1cyBjb2RlLgorICAgICAqLworICAgIHB1YmxpYyBJbnRlZ2VyIGdldExhc3RSZXNwb25zZUNvZGUoKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vbml0b3JpbmcvUmVzcG9uc2VTdGF0aXN0aWNzLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb25pdG9yaW5nL1Jlc3BvbnNlU3RhdGlzdGljcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYjc5NWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb25pdG9yaW5nL1Jlc3BvbnNlU3RhdGlzdGljcy5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3Jpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIE1vbml0b3Jpbmcgc3RhdGlzdGljcyBvZiByZXNwb25zZXMgcHJvZHVjZWQgYnkgYXBwbGljYXRpb24uCisgKiA8cC8+CisgKiBTdGF0aXN0aWNzIHJldHJpZXZlZCBmcm9tIEplcnNleSBydW50aW1lIG1pZ2h0IGJlIG11dGFibGUgYW5kIHRoYW5rcyB0byBpdCBtaWdodCBwcm92aWRlIGluY29uc2lzdGVudCBkYXRhCisgKiBhcyBub3QgYWxsIHN0YXRpc3RpY3MgYXJlIHVwZGF0ZWQgaW4gdGhlIHNhbWUgdGltZS4gVG8gcmV0cmlldmUgdGhlIGltbXV0YWJsZSBhbmQgY29uc2lzdGVudAorICogc3RhdGlzdGljcyBkYXRhIHRoZSBtZXRob2Qge0BsaW5rICNzbmFwc2hvdCgpfSBzaG91bGQgYmUgdXNlZC4KKyAqIDxwLz4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKiBAc2VlIE1vbml0b3JpbmdTdGF0aXN0aWNzIFNlZSBtb25pdG9yaW5nIHN0YXRpc3RpY3MgZm9yIGdlbmVyYWwgZGV0YWlscyBhYm91dCBzdGF0aXN0aWNzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIFJlc3BvbnNlU3RhdGlzdGljcyB7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSByZXNwb25zZSBjb2RlIG9mIGEgbGFzdCByZXNwb25zZSB3cml0dGVuIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTGFzdCByZXNwb25zZSBzdGF0dXMgY29kZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSW50ZWdlciBnZXRMYXN0UmVzcG9uc2VDb2RlKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHN0YXRpc3RpY3Mgb2YgcmVzcG9uc2UgY29kZXMgcHJvZHVjZXMgYnkgdGhlIGFwcGxpY2F0aW9uLiBLZXlzIG9mIGEgcmV0dXJuZWQKKyAgICAgKiBtYXAgYXJlIHJlc3BvbnNlIHN0YXR1cyBjb2RlcyBhbmQgdmFsdWVzIGlzIHRoZSB0aGUgY291bnQgb2YgcmVzcG9uc2VzIHdpdGggdGhlc2UKKyAgICAgKiBzdGF0dXMgY291bnQuIFZhbHVlcyBhcmUgbWVhc3VyZWQgc2luY2Ugc3RhcnQgb2YgdGhlIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBNYXAgd2l0aCBzdGF0dXMgY29kZXMga2V5cyBhbmQgY291bnQgYXMgdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyBNYXA8SW50ZWdlciwgTG9uZz4gZ2V0UmVzcG9uc2VDb2RlcygpOworCisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGltbXV0YWJsZSBhbmQgY29uc2lzdGVudCBzbmFwc2hvdCBvZiB0aGUgbW9uaXRvcmluZyBzdGF0aXN0aWNzLiBXb3JraW5nIHdpdGggc25hcHNob3RzIG1pZ2h0CisgICAgICogaGF2ZSBuZWdhdGl2ZSBwZXJmb3JtYW5jZSBpbXBhY3QgYXMgc25hcHNob3QgbXVzdCBiZSBjcmVhdGVkIGJ1dCBlbnN1cmVzIGNvbnNpc3RlbmN5IG9mIGRhdGEgb3ZlciB0aW1lLgorICAgICAqIEhvd2V2ZXIsIHRoZSB1c2FnZSBvZiBzbmFwc2hvdCBpcyBlbmNvdXJhZ2VkIHRvIGF2b2lkIHdvcmtpbmcgd2l0aCBpbmNvbnNpc3RlbnQgZGF0YS4gTm90IGFsbCBzdGF0aXN0aWNzCisgICAgICogbXVzdCBiZSB1cGRhdGVkIGluIHRoZSBzYW1lIHRpbWUgb24gbXV0YWJsZSB2ZXJzaW9uIG9mIHN0YXRpc3RpY3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFNuYXBzaG90IG9mIHJlc3BvbnNlIHN0YXRpc3RpY3MuCisgICAgICogQGRlcHJlY2F0ZWQgaW1wbGVtZW50aW5nIGNsYXNzIGlzIGltbXV0YWJsZSBoZW5jZSBzbmFwc2hvdCBjcmVhdGlvbiBpcyBub3QgbmVlZGVkIGFueW1vcmUKKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBSZXNwb25zZVN0YXRpc3RpY3Mgc25hcHNob3QoKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vbml0b3JpbmcvVGltZVdpbmRvd1N0YXRpc3RpY3MuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vbml0b3JpbmcvVGltZVdpbmRvd1N0YXRpc3RpY3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTA2YjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9uaXRvcmluZy9UaW1lV2luZG93U3RhdGlzdGljcy5qYXZhCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nOworCisvKioKKyAqIE1vbml0b3Jpbmcgc3RhdGlzdGljcyBvZiBleGVjdXRpb24gb2YgYW55IHRhcmdldCAocmVzb3VyY2UsIHJlc291cmNlIG1ldGhvZCwgYXBwbGljYXRpb24pLgorICogVGhlIG1haW4gcGFyYW1ldGVyIG9mIHtAY29kZSBUaW1lV2luZG93U3RhdGlzdGljc30gaXMgdGhlIHNpemUgb2YgdGhlIHRpbWUgd2luZG93LiBUaGlzIGlzIHRoZSB0aW1lCisgKiBmb3Igd2hpY2ggdGhlIHN0YXRpc3RpY3MgYXJlIG1lYXN1cmVkIChmb3IgZXhhbXBsZSBmb3IgdGltZSB3aW5kb3cgMSBob3VyLCB0aGUgc3RhdGlzdGljcyBhcmUgZXZhbHVhdGVkCisgKiBmb3IgbGFzdCBvbmUgaG91ciBhbmQgb2xkZXIgc3RhdGlzdGljcyBhcmUgZHJvcHBlZCkuIFRoZSBzaXplIG9mIHRoZSB0aW1lIHdpbmRvdyBjYW4gYmUgcmV0cmlldmVkIGJ5CisgKiB7QGxpbmsgI2dldFRpbWVXaW5kb3coKX0uCisgKiA8cC8+CisgKiBTdGF0aXN0aWNzIHJldHJpZXZlZCBmcm9tIEplcnNleSBydW50aW1lIG1pZ2h0IGJlIG11dGFibGUgYW5kIHRoYW5rcyB0byBpdCBtaWdodCBwcm92aWRlIGluY29uc2lzdGVudCBkYXRhCisgKiBhcyBub3QgYWxsIHN0YXRpc3RpY3MgYXJlIHVwZGF0ZWQgaW4gdGhlIHNhbWUgdGltZS4gVG8gcmV0cmlldmUgdGhlIGltbXV0YWJsZSBhbmQgY29uc2lzdGVudAorICogc3RhdGlzdGljcyBkYXRhIHRoZSBtZXRob2Qge0BsaW5rICNzbmFwc2hvdCgpfSBzaG91bGQgYmUgdXNlZC4KKyAqIDxwLz4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKiBAc2VlIE1vbml0b3JpbmdTdGF0aXN0aWNzIFNlZSBtb25pdG9yaW5nIHN0YXRpc3RpY3MgZm9yIGdlbmVyYWwgZGV0YWlscyBhYm91dCBzdGF0aXN0aWNzLgorICovCitwdWJsaWMgaW50ZXJmYWNlIFRpbWVXaW5kb3dTdGF0aXN0aWNzIHsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHNpemUgb2YgdGltZSB3aW5kb3cgaW4gbWlsbGlzZWNvbmRzLiBSZXR1cm5lZCB2YWx1ZSBkZW5vdGVzIGluIGhvdyBtYW55IGxhc3QgbWlsbGlzZWNvbmRzCisgICAgICogdGhlIHN0YXRpc3RpY3MgYXJlIGV2YWx1YXRlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGltZSB3aW5kb3cgaW4gbWlsbGlzZWNvbmRzLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldFRpbWVXaW5kb3coKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYXZlcmFnZSB2YWx1ZSBvZiBob3cgbWFueSByZXF1ZXN0cyBwZXIgc2Vjb25kIHdlcmUgcmVjZWl2ZWQgYnkgYXBwbGljYXRpb24gaW4gdGhlIHRpbWUgd2luZG93LgorICAgICAqCisgICAgICogQHJldHVybiBBdmVyYWdlIG9mIHJlcXVlc3RzIHBlciBzZWNvbmQuCisgICAgICovCisgICAgcHVibGljIGRvdWJsZSBnZXRSZXF1ZXN0c1BlclNlY29uZCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbWluaW11bSBkdXJhdGlvbiAocHJvY2Vzc2luZyB0aW1lKSBpbiBtaWxsaXNlY29uZHMgb2YgdGhlIHJlcXVlc3QgcHJvY2Vzc2luZyBtZWFzdXJlZAorICAgICAqIGluIHRoZSB0aW1lIHdpbmRvdy4KKyAgICAgKiBUaGUgdGltZSBtZWFzdXJlcyB0aGUKKyAgICAgKiBwcm9jZXNzaW5nIG9mIHRoZSByZXF1ZXN0IHNpbmNlIHRoZSBzdGFydCBvZiByZXF1ZXN0IHByb2Nlc3NpbmcgYnkgSmVyc2V5IHVudGlsIHRoZSByZXNwb25zZSBpcworICAgICAqIHdyaXR0ZW4gb3IgcmVxdWVzdCBwcm9jZXNzaW5nIGZhaWxzIGFuZCBhbGwgcmVzb3VyY2VzIGZvciByZXF1ZXN0IHByb2Nlc3NpbmcgYXJlIHJlbGVhc2VkLgorICAgICAqCisgICAgICogQHJldHVybiBNaW5pbXVtIHByb2Nlc3NpbmcgdGltZSBvZiB0aGUgcmVxdWVzdCBvciAtMSBpZiBubyByZXF1ZXN0IGhhcyBiZWVuIHByb2Nlc3NlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRNaW5pbXVtRHVyYXRpb24oKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gZHVyYXRpb24gKHByb2Nlc3NpbmcgdGltZSkgaW4gbWlsbGlzZWNvbmRzIG9mIHRoZSByZXF1ZXN0IHByb2Nlc3NpbmcgbWVhc3VyZWQKKyAgICAgKiBpbiB0aGUgdGltZSB3aW5kb3cuCisgICAgICogcHJvY2Vzc2luZyBvZiB0aGUgcmVxdWVzdCBzaW5jZSB0aGUgc3RhcnQgb2YgcmVxdWVzdCBwcm9jZXNzaW5nIGJ5IEplcnNleSB1bnRpbCB0aGUgcmVzcG9uc2UgaXMKKyAgICAgKiB3cml0dGVuIG9yIHJlcXVlc3QgcHJvY2Vzc2luZyBmYWlscyBhbmQgYWxsIHJlc291cmNlcyBmb3IgcmVxdWVzdCBwcm9jZXNzaW5nIGFyZSByZWxlYXNlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTWF4aW11bSBwcm9jZXNzaW5nIHRpbWUgb2YgdGhlIHJlcXVlc3Qgb3IgLTEgaWYgbm8gcmVxdWVzdCBoYXMgYmVlbiBwcm9jZXNzZWQuCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0TWF4aW11bUR1cmF0aW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhdmVyYWdlIGR1cmF0aW9uIChwcm9jZXNzaW5nIHRpbWUpIGluIG1pbGxpc2Vjb25kcyBvZiB0aGUgcmVxdWVzdCBwcm9jZXNzaW5nIG1lYXN1cmVkCisgICAgICogaW4gdGhlIHRpbWUgd2luZG93LgorICAgICAqIFRoZSB0aW1lIG1lYXN1cmVzIHRoZQorICAgICAqIHByb2Nlc3Npbmcgb2YgdGhlIHJlcXVlc3Qgc2luY2UgdGhlIHN0YXJ0IG9mIHJlcXVlc3QgcHJvY2Vzc2luZyBieSBKZXJzZXkgdW50aWwgdGhlIHJlc3BvbnNlIGlzCisgICAgICogd3JpdHRlbiBvciByZXF1ZXN0IHByb2Nlc3NpbmcgZmFpbHMgYW5kIGFsbCByZXNvdXJjZXMgZm9yIHJlcXVlc3QgcHJvY2Vzc2luZyBhcmUgcmVsZWFzZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEF2ZXJhZ2UgcHJvY2Vzc2luZyB0aW1lIG9mIHRoZSByZXF1ZXN0IG9yIC0xIGlmIG5vIHJlcXVlc3QgaGFzIGJlZW4gcHJvY2Vzc2VkLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldEF2ZXJhZ2VEdXJhdGlvbigpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY291bnQgb2YgcmVxdWVzdHMgcmVjZWl2ZWQgbWVhc3VyZWQgaW4gdGhlIHRpbWUgd2luZG93LgorICAgICAqCisgICAgICogQHJldHVybiBDb3VudCBvZiByZXF1ZXN0cyB0aGF0IHdlcmUgaGFuZGxlZCBieSB0aGUgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0UmVxdWVzdENvdW50KCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGltbXV0YWJsZSBhbmQgY29uc2lzdGVudCBzbmFwc2hvdCBvZiB0aGUgbW9uaXRvcmluZyBzdGF0aXN0aWNzLiBXb3JraW5nIHdpdGggc25hcHNob3RzIG1pZ2h0CisgICAgICogaGF2ZSBuZWdhdGl2ZSBwZXJmb3JtYW5jZSBpbXBhY3QgYXMgc25hcHNob3QgbXVzdCBiZSBjcmVhdGVkIGJ1dCBlbnN1cmVzIGNvbnNpc3RlbmN5IG9mIGRhdGEgb3ZlciB0aW1lLgorICAgICAqIEhvd2V2ZXIsIHRoZSB1c2FnZSBvZiBzbmFwc2hvdCBpcyBlbmNvdXJhZ2VkIHRvIGF2b2lkIHdvcmtpbmcgd2l0aCBpbmNvbnNpc3RlbnQgZGF0YS4gTm90IGFsbCBzdGF0aXN0aWNzCisgICAgICogbXVzdCBiZSB1cGRhdGVkIGluIHRoZSBzYW1lIHRpbWUgb24gbXV0YWJsZSB2ZXJzaW9uIG9mIHN0YXRpc3RpY3MuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFNuYXBzaG90IG9mIHRpbWUgd2luZG93IHN0YXRpc3RpY3MuCisgICAgICogQGRlcHJlY2F0ZWQgaW1wbGVtZW50aW5nIGNsYXNzIGlzIGltbXV0YWJsZSBoZW5jZSBzbmFwc2hvdCBjcmVhdGlvbiBpcyBub3QgbmVlZGVkIGFueW1vcmUKKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHB1YmxpYyBUaW1lV2luZG93U3RhdGlzdGljcyBzbmFwc2hvdCgpOworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9uaXRvcmluZy9wYWNrYWdlLWluZm8uamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vbml0b3JpbmcvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZiNTgwNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vbml0b3JpbmcvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoqCisgKiBKZXJzZXkgc2VydmVyLXNpZGUgbW9uaXRvcmluZyBKTVggTUJlYW5zIGludGVyZmFjZXMuCisgKi8KK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3Jpbmc7CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9wYWNrYWdlLWluZm8uamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMjk3NjMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvKioKKyAqIEplcnNleSBzZXJ2ZXItc2lkZSBjbGFzc2VzLgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlcjsKZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwaS9BYnN0cmFjdENvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcGkvQWJzdHJhY3RDb250YWluZXJMaWZlY3ljbGVMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZTgyYTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcGkvQWJzdHJhY3RDb250YWluZXJMaWZlY3ljbGVMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaTsKKworLyoqCisgKiBDb252ZW5pZW5jZSBjbGFzcyB0byBhbGxvdyBpbXBsZW1lbnRpbmcgb25seSBhIHN1YnNldCBvZgorICoge0BsaW5rIENvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyIGNvbnRhaW5lciBsaWVmZWN5Y2xlIGxpc3RlbmVyfQorICogY2FsbGJhY2sgbWV0aG9kKHMpLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyIGltcGxlbWVudHMgQ29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXIgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TdGFydHVwKENvbnRhaW5lciBjb250YWluZXIpIHsKKyAgICAgICAgLy8gbm8tb3AKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblJlbG9hZChDb250YWluZXIgY29udGFpbmVyKSB7CisgICAgICAgIC8vIG5vLW9wCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TaHV0ZG93bihDb250YWluZXIgY29udGFpbmVyKSB7CisgICAgICAgIC8vIG5vLW9wCisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcGkvQ29tcG9uZW50UHJvdmlkZXIuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwaS9Db21wb25lbnRQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwN2U1NTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcGkvQ29tcG9uZW50UHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGk7CisKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CisKKy8qKgorICogQ29tcG9uZW50IHByb3ZpZGVyIGludGVyZmFjZSB0byBhbGxvdyBjdXN0b20gbWFuYWdlbWVudCBvZiAzcmQgcGFydHkKKyAqIGNvbXBvbmVudHMgbGlmZS1jeWNsZSBhbmQgZGVwZW5kZW5jeSBpbmplY3Rpb24uCisgKiA8cCAvPgorICogQW4gaW1wbGVtZW50YXRpb24gKGEgY29tcG9uZW50LXByb3ZpZGVyKSBpZGVudGlmaWVzIGl0c2VsZiBieSBwbGFjaW5nIGEgcHJvdmlkZXItY29uZmlndXJhdGlvbgorICogZmlsZSAoaWYgbm90IGFscmVhZHkgcHJlc2VudCksIHtAY29kZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbXBvbmVudFByb3ZpZGVyfQorICogaW4gdGhlIHJlc291cmNlIGRpcmVjdG9yeSA8dHQ+TUVUQS1JTkYvc2VydmljZXM8L3R0PiwgYW5kIGFkZGluZyB0aGUgZnVsbHkKKyAqIHF1YWxpZmllZCBzZXJ2aWNlLXByb3ZpZGVyLWNsYXNzIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgZmlsZS4KKyAqCisgKiBKZXJzZXkgd2lsbCBub3QgZXZlbiB0cnkgdG8gaW5qZWN0IGNvbXBvbmVudCBwcm92aWRlciBpbnN0YW5jZXMgd2l0aCBKZXJzZXkgYXJ0aWZhY3RzLgorICogVGhlIFNQSSBwcm92aWRlcnMgc2hvdWxkIGJlIGRlc2lnbmVkIHNvIHRoYXQgbm8gZGVwZW5kZW5jeSBpbmplY3Rpb24gaXMgbmVlZGVkIGF0IHRoZSBiaW5kIHRpbWUgcGhhc2UuCisKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQ29tcG9uZW50UHJvdmlkZXIgeworCisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplcyB0aGUgY29tcG9uZW50IHByb3ZpZGVyIHdpdGggYSByZWZlcmVuY2UgdG8gYSBpbmplY3Rpb24gbWFuYWdlcgorICAgICAqIGluc3RhbmNlLCB3aGljaCB3aWxsIGdldCB1c2VkIGluIHRoZSBhcHBsaWNhdGlvbiB0byBtYW5hZ2UgaW5kaXZpZHVhbCBjb21wb25lbnRzLgorICAgICAqIFByb3ZpZGVycyBzaG91bGQga2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgaW5qZWN0aW9uIG1hbmFnZXIgZm9yIGxhdGVyIHVzZS4KKyAgICAgKiBUaGlzIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgcHJpb3IgdG8gYW55IGJpbmQgbWV0aG9kIGNhbGxzLgorICAgICAqIFRoZSBpbmplY3Rpb24gbWFuYWdlciBwYXJhbWV0ZXIgd2lsbCBub3QgYmUgZnVsbHkgaW5pdGlhbGl6ZWQgYXQgdGhlIHRpbWUgb2YgaW52b2NhdGlvbgorICAgICAqIGFuZCBzaG91bGQgYmUgdXNlZCBhcyBhIHJlZmVyZW5jZSBvbmx5LgorICAgICAqCisgICAgICogQHBhcmFtIGluamVjdGlvbk1hbmFnZXIgYW4gaW5qZWN0aW9uIG1hbmFnZXIuCisgICAgICovCisgICAgdm9pZCBpbml0aWFsaXplKGZpbmFsIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlcik7CisKKyAgICAvKioKKyAgICAgKiBKZXJzZXkgd2lsbCBpbnZva2UgdGhpcyBtZXRob2QgYmVmb3JlIGJpbmRpbmcgb2YgZWFjaCBjb21wb25lbnQgY2xhc3MgaW50ZXJuYWxseQorICAgICAqIGR1cmluZyBpbml0aWFsaXphdGlvbiBvZiBpdCdzIGluamVjdGlvbiBtYW5hZ2VyLgorICAgICAqCisgICAgICogSWYgdGhlIGNvbXBvbmVudCBwcm92aWRlciB3YW50cyB0byBiaW5kIHRoZSBjb21wb25lbnQgY2xhc3MKKyAgICAgKiBpdHNlbGYsIGl0IG11c3QgZG8gc28gYW5kIHJldHVybiB0cnVlLiBJbiB0aGF0IGNhc2UsIEplcnNleSB3aWxsIG5vdAorICAgICAqIGJpbmQgdGhlIGNvbXBvbmVudCBhbmQgcmVseSBvbiB0aGUgY29tcG9uZW50IHByb3ZpZGVyIGluIHRoaXMgcmVnYXJkLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbXBvbmVudCBhIGNvbXBvbmVudCAocmVzb3VyY2UvcHJvdmlkZXIpIGNsYXNzLgorICAgICAqIEBwYXJhbSBwcm92aWRlckNvbnRyYWN0cyBwcm92aWRlciBjb250cmFjdHMgaW1wbGVtZW50ZWQgYnkgZ2l2ZW4gY29tcG9uZW50LgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgY29tcG9uZW50IGNsYXNzIGhhcyBiZWVuIGJvdW5kIGJ5IHRoZSBwcm92aWRlciwgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgYm9vbGVhbiBiaW5kKGZpbmFsIENsYXNzPD8+IGNvbXBvbmVudCwgU2V0PENsYXNzPD8+PiBwcm92aWRlckNvbnRyYWN0cyk7CisKKyAgICAvKioKKyAgICAgKiBKZXJzZXkgd2lsbCBpbnZva2UgdGhpcyBtZXRob2QgYWZ0ZXIgYWxsIGNvbXBvbmVudCBjbGFzc2VzIGhhdmUgYmVlbiBib3VuZC4KKyAgICAgKgorICAgICAqIElmIHRoZSBjb21wb25lbnQgcHJvdmlkZXIgd2FudHMgdG8gZG8gc29tZSBhY3Rpb25zIGFmdGVyIGl0IGhhcyBzZWVuIGFsbCBjb21wb25lbnQgY2xhc3NlcworICAgICAqIHJlZ2lzdGVyZWQgd2l0aCB0aGUgYXBwbGljYXRpb24sIHRoaXMgaXMgdGhlIHJpZ2h0IHBsYWNlIGZvciB0aGUgY29ycmVzcG9uZGluZyBjb2RlLgorICAgICAqLworICAgIHZvaWQgZG9uZSgpOworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3BpL0NvbnRhaW5lci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3BpL0NvbnRhaW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZDkxMTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcGkvQ29udGFpbmVyLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3RyYWluZWRUbzsKK2ltcG9ydCBqYXZheC53cy5ycy5SdW50aW1lVHlwZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5Db250cmFjdDsKKworLyoqCisgKiBKZXJzZXkgY29udGFpbmVyIHNlcnZpY2UgY29udHJhY3QuCisgKgorICogVGhlIHB1cnBvc2Ugb2YgdGhlIGNvbnRhaW5lciBpcyB0byBjb25maWd1cmUgYW5kIGhvc3QgYSBzaW5nbGUgSmVyc2V5CisgKiBhcHBsaWNhdGlvbi4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICoKKyAqIEBzZWUgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlcgorICovCitAQ29udHJhY3QKK0BDb25zdHJhaW5lZFRvKFJ1bnRpbWVUeXBlLlNFUlZFUikKK3B1YmxpYyBpbnRlcmZhY2UgQ29udGFpbmVyIHsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29udGFpbmVyIHBvcnQgbnVtYmVyIGZvciBIVFRQIHByb3RvY29sLgorICAgICAqCisgICAgICogQHNpbmNlIDIuMTgKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0hUVFBfUE9SVCA9IDgwOworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29udGFpbmVyIHBvcnQgbnVtYmVyIGZvciBIVFRQUyBwcm90b2NvbC4KKyAgICAgKgorICAgICAqIEBzaW5jZSAyLjE4CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9IVFRQU19QT1JUID0gNDQzOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIGltbXV0YWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgY3VycmVudCB7QGxpbmsgUmVzb3VyY2VDb25maWcKKyAgICAgKiBjb25maWd1cmF0aW9ufS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gY3VycmVudCBjb25maWd1cmF0aW9uIG9mIHRoZSBob3N0ZWQgSmVyc2V5IGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBSZXNvdXJjZUNvbmZpZyBnZXRDb25maWd1cmF0aW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIEplcnNleSBzZXJ2ZXItc2lkZSBhcHBsaWNhdGlvbiBoYW5kbGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29udGFpbmVyLgorICAgICAqCisgICAgICogQHJldHVybiBKZXJzZXkgc2VydmVyLXNpZGUgYXBwbGljYXRpb24gaGFuZGxlciBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnRhaW5lci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQXBwbGljYXRpb25IYW5kbGVyIGdldEFwcGxpY2F0aW9uSGFuZGxlcigpOworCisgICAgLyoqCisgICAgICogUmVsb2FkIHRoZSBob3N0ZWQgSmVyc2V5IGFwcGxpY2F0aW9uIHVzaW5nIHRoZSBjdXJyZW50IHtAbGluayBSZXNvdXJjZUNvbmZpZworICAgICAqIGNvbmZpZ3VyYXRpb259LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbG9hZCgpOworCisgICAgLyoqCisgICAgICogUmVsb2FkIHRoZSBob3N0ZWQgSmVyc2V5IGFwcGxpY2F0aW9uIHVzaW5nIGEgbmV3IHtAbGluayBSZXNvdXJjZUNvbmZpZworICAgICAqIGNvbmZpZ3VyYXRpb259LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZ3VyYXRpb24gbmV3IGNvbmZpZ3VyYXRpb24gdXNlZCBmb3IgdGhlIHJlbG9hZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWxvYWQoUmVzb3VyY2VDb25maWcgY29uZmlndXJhdGlvbik7Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcGkvQ29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXIuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwaS9Db250YWluZXJMaWZlY3ljbGVMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMjUzMTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcGkvQ29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdHJhaW5lZFRvOworaW1wb3J0IGphdmF4LndzLnJzLlJ1bnRpbWVUeXBlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLkNvbnRyYWN0OworCisvKioKKyAqIENsYXNzZXMgaW1wbGVtZW50aW5nIHRoaXMgY29udHJhY3QgcmVjZWl2ZSBjb250YWluZXIgbGlmZS1jeWNsZSBub3RpZmljYXRpb24KKyAqIGV2ZW50cy4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitAQ29udHJhY3QKK0BDb25zdHJhaW5lZFRvKFJ1bnRpbWVUeXBlLlNFUlZFUikKK3B1YmxpYyBpbnRlcmZhY2UgQ29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXIgeworCisgICAgLyoqCisgICAgICogSW52b2tlZCBhdCB0aGUge0BsaW5rIENvbnRhaW5lciBjb250YWluZXJ9IHN0YXJ0LXVwLiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGV2ZW4KKyAgICAgKiB3aGVuIGFwcGxpY2F0aW9uIGlzIHJlbG9hZGVkIGFuZCBuZXcgaW5zdGFuY2Ugb2YgYXBwbGljYXRpb24gaGFzIHN0YXJ0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyIGNvbnRhaW5lciB0aGF0IGhhcyBiZWVuIHN0YXJ0ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25TdGFydHVwKENvbnRhaW5lciBjb250YWluZXIpOworCisgICAgLyoqCisgICAgICogSW52b2tlZCB3aGVuIHRoZSB7QGxpbmsgQ29udGFpbmVyIGNvbnRhaW5lcn0gaGFzIGJlZW4gcmVsb2FkZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyIGNvbnRhaW5lciB0aGF0IGhhcyBiZWVuIHJlbG9hZGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uUmVsb2FkKENvbnRhaW5lciBjb250YWluZXIpOworCisgICAgLyoqCisgICAgICogSW52b2tlIGF0IHRoZSB7QGxpbmsgQ29udGFpbmVyIGNvbnRhaW5lcn0gc2h1dC1kb3duLiBUaGlzIG1ldGhvZCBpcyBpbnZva2VkIGV2ZW4gYmVmb3JlCisgICAgICogdGhlIGFwcGxpY2F0aW9uIGlzIGJlaW5nIHN0b3BwZWQgYXMgYSBwYXJ0IG9mIHJlbG9hZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250YWluZXIgY29udGFpbmVyIHRoYXQgaGFzIGJlZW4gc2h1dCBkb3duLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uU2h1dGRvd24oQ29udGFpbmVyIGNvbnRhaW5lcik7Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcGkvQ29udGFpbmVyUHJvdmlkZXIuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwaS9Db250YWluZXJQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYjRiOGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcGkvQ29udGFpbmVyUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdHJhaW5lZFRvOworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuUnVudGltZVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLkNvbnRyYWN0OworCisvKioKKyAqIFNlcnZpY2UtcHJvdmlkZXIgaW50ZXJmYWNlIGZvciBjcmVhdGluZyBjb250YWluZXIgaW5zdGFuY2VzLgorICoKKyAqIElmIHN1cHBvcnRlZCBieSB0aGUgcHJvdmlkZXIsIGEgY29udGFpbmVyIGluc3RhbmNlIG9mIHRoZSByZXF1ZXN0ZWQgSmF2YSB0eXBlCisgKiB3aWxsIGJlIGNyZWF0ZWQuCisgKiA8cD4KKyAqIFRoZSBjcmVhdGVkIGNvbnRhaW5lciBpcyByZXNwb25zaWJsZSBmb3IgbGlzdGVuaW5nIG9uIGEgY29tbXVuaWNhdGlvbiBjaGFuZWwKKyAqIGZvciBuZXcgY2xpZW50IHJlcXVlc3RzLCBkaXNwYXRjaGluZyB0aGVzZSByZXF1ZXN0cyB0byB0aGUgcmVnaXN0ZXJlZAorICoge0BsaW5rIEFwcGxpY2F0aW9uSGFuZGxlciBKZXJzZXkgYXBwbGljYXRpb24gaGFuZGxlcn0gdXNpbmcgdGhlIGhhbmRsZXIncworICoge0BsaW5rIEFwcGxpY2F0aW9uSGFuZGxlciNoYW5kbGUob3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3QpfQorICogaGFuZGxlKHJlcXVlc3RDb250ZXh0KX0gbWV0aG9kIGFuZCBzZW5kaW5nIHRoZSByZXNwb25zZXMgcHJvdmlkZWQgYnkgdGhlCisgKiBhcHBsaWNhdGlvbiBiYWNrIHRvIHRoZSBjbGllbnQuCisgKiA8L3A+CisgKiA8cD4KKyAqIEEgcHJvdmlkZXIgc2hhbGwgc3VwcG9ydCBhIG9uZS10by1vbmUgbWFwcGluZyBiZXR3ZWVuIGEgdHlwZSwgcHJvdmlkZWQgdGhlIHR5cGUKKyAqIGlzIG5vdCB7QGxpbmsgT2JqZWN0fS4gQSBwcm92aWRlciBtYXkgYWxzbyBzdXBwb3J0IG1hcHBpbmcgb2Ygc3ViLXR5cGVzIG9mIGEgdHlwZQorICogKHByb3ZpZGVkIHRoZSB0eXBlIGlzIG5vdCB7QGNvZGUgT2JqZWN0fSkuIEl0IGlzIGV4cGVjdGVkIHRoYXQgZWFjaCBwcm92aWRlcgorICogc3VwcG9ydHMgbWFwcGluZyBmb3IgZGlzdGluY3Qgc2V0IG9mIHR5cGVzIGFuZCBzdWJ0eXBlcyBzbyB0aGF0IGRpZmZlcmVudCBwcm92aWRlcnMKKyAqIGRvIG5vdCBjb25mbGljdCB3aXRoIGVhY2ggb3RoZXIuCisgKiA8L3A+CisgKiA8cD4KKyAqIEFuIGltcGxlbWVudGF0aW9uIGNhbiBpZGVudGlmeSBpdHNlbGYgYnkgcGxhY2luZyBhIEphdmEgc2VydmljZSBwcm92aWRlciBjb25maWd1cmF0aW9uCisgKiBmaWxlIChpZiBub3QgYWxyZWFkeSBwcmVzZW50KSAtIHtAY29kZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbnRhaW5lclByb3ZpZGVyfQorICogLSBpbiB0aGUgcmVzb3VyY2UgZGlyZWN0b3J5IHtAY29kZSBNRVRBLUlORi9zZXJ2aWNlc30sIGFuZCBhZGRpbmcgdGhlIGZ1bGx5CisgKiBxdWFsaWZpZWQgc2VydmljZS1wcm92aWRlci1jbGFzcyBvZiB0aGUgaW1wbGVtZW50YXRpb24gaW4gdGhlIGZpbGUuCisgKiA8L3A+CisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK0BDb250cmFjdAorQENvbnN0cmFpbmVkVG8oUnVudGltZVR5cGUuU0VSVkVSKQorcHVibGljIGludGVyZmFjZSBDb250YWluZXJQcm92aWRlciB7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gY29udGFpbmVyIG9mIGEgZ2l2ZW4gdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSA8VD4gICAgICAgICB0aGUgdHlwZSBvZiB0aGUgY29udGFpbmVyLgorICAgICAqIEBwYXJhbSB0eXBlICAgICAgICB0aGUgdHlwZSBvZiB0aGUgY29udGFpbmVyLgorICAgICAqIEBwYXJhbSBhcHBsaWNhdGlvbiBKQVgtUlMgLyBKZXJzZXkgYXBwbGljYXRpb24uCisgICAgICogQHJldHVybiB0aGUgY29udGFpbmVyLCBvdGhlcndpc2Uge0Bjb2RlIG51bGx9IGlmIHRoZSBwcm92aWRlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSByZXF1ZXN0ZWQge0Bjb2RlIHR5cGV9LgorICAgICAqCisgICAgICogQHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yIGNyZWF0aW5nIHRoZSBjb250YWluZXIuCisgICAgICovCisgICAgcHVibGljIDxUPiBUIGNyZWF0ZUNvbnRhaW5lcihDbGFzczxUPiB0eXBlLCBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbikgdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcGkvQ29udGFpbmVyUmVzcG9uc2VXcml0ZXIuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwaS9Db250YWluZXJSZXNwb25zZVdyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZTM1YWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcGkvQ29udGFpbmVyUmVzcG9uc2VXcml0ZXIuamF2YQpAQCAtMCwwICsxLDE4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpOworCitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlc3BvbnNlOworCisvKioKKyAqIEEgc3VzcGVuZGFibGUsIHJlcXVlc3Qtc2NvcGVkIEkvTyBjb250YWluZXIgcmVzcG9uc2Ugd3JpdGVyLgorICoKKyAqIEkvTyBjb250YWluZXIgc2VuZHMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHJlc3BvbnNlIHdyaXRlciB3aXRoIGV2ZXJ5IHJlcXVlc3QgYXMgcGFydAorICogb2YgdGhlIGNhbGwgdG8gdGhlIEplcnNleSBhcHBsaWNhdGlvbgorICoge0BsaW5rIEFwcGxpY2F0aW9uSGFuZGxlciNhcHBseShvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdCl9ICBhcHBseSguLi4pfQorICogbWV0aG9kLiBFYWNoIGNvbnRhaW5lciByZXNwb25zZSB3cml0ZXIgcmVwcmVzZW50cyBhbiBvcGVuIGNvbm5lY3Rpb24gdG8gdGhlIGNsaWVudAorICogKHdhaXRpbmcgZm9yIGEgcmVzcG9uc2UpLgorICogPHA+CisgKiBGb3IgZWFjaCByZXF1ZXN0IHRoZSBKZXJzZXkgcnVudGltZSB3aWxsIG1ha2Ugc3VyZSB0byBkaXJlY3RseSBjYWxsIGVpdGhlcgorICoge0BsaW5rICNzdXNwZW5kKGxvbmcsIFRpbWVVbml0LCBUaW1lb3V0SGFuZGxlcikgc3VzcGVuZCguLi4pfQorICogb3Ige0Bjb2RlIGNvbW1pdCgpfSBtZXRob2Qgb24gYSByZXNwb25zZSB3cml0ZXIgc3VwcGxpZWQgdG8gdGhlCisgKiB7QGNvZGUgSmVyc2V5QXBwbGljYXRpb24uYXBwbHkoLi4uKX0gbWV0aG9kIGJlZm9yZSB0aGUgbWV0aG9kIGhhcyBmaW5pc2hlZC4gVGhlcmVmb3JlCisgKiB0aGUgSS9PIGNvbnRhaW5lciBpbXBsZW1lbnRhdGlvbnMgbWF5IGFzc3VtZSB0aGF0IHdoZW4gdGhlIHtAY29kZSBKZXJzZXlBcHBsaWNhdGlvbi5hcHBseSguLi4pfQorICogbWV0aG9kIGlzIGZpbmlzaGVkLCB0aGUgY29udGFpbmVyIHJlc3BvbnNlIHdyaXRlciBpcyBlaXRoZXIge0BsaW5rICNjb21taXQoKSBjb21taXRlZH0sCisgKiBvciB7QGxpbmsgI3N1c3BlbmQobG9uZywgVGltZVVuaXQsIFRpbWVvdXRIYW5kbGVyKSBzdXNwZW5kZWR9LgorICogPC9wPgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIKKyAqLworcHVibGljIGludGVyZmFjZSBDb250YWluZXJSZXNwb25zZVdyaXRlciB7CisKKyAgICAvKioKKyAgICAgKiBUaW1lLW91dCBoYW5kbGVyIGNhbiBiZSByZWdpc3RlcmVkIHdoZW4gdGhlIGNvbnRhaW5lciByZXNwb25zZSB3cml0ZXIgZ2V0cworICAgICAqIHN1c3BlbmRlZC4KKyAgICAgKgorICAgICAqIFNob3VsZCB0aGUgc3VzcGVuZCBvcGVyYXRpb24gdGltZSBvdXQsIHRoZSBjb250YWluZXIgaXMgcmVzcG9uc2libGUgZm9yCisgICAgICogaW52b2tpbmcgdGhlIHtAbGluayBUaW1lb3V0SGFuZGxlciNvblRpbWVvdXQoQ29udGFpbmVyUmVzcG9uc2VXcml0ZXIpfQorICAgICAqIGNhbGxiYWNrIG1ldGhvZCB0byBnZXQgdGhlIHJlc3BvbnNlIHRoYXQgc2hvdWxkIGJlIHJldHVybmVkIHRvIHRoZSBjbGllbnQuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBUaW1lb3V0SGFuZGxlciB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE1ldGhvZCBpcyBjYWxsZWQsIHdoZW4ge0BsaW5rIENvbnRhaW5lclJlc3BvbnNlV3JpdGVyI3N1c3BlbmQobG9uZywgVGltZVVuaXQsCisgICAgICAgICAqIENvbnRhaW5lclJlc3BvbnNlV3JpdGVyLlRpbWVvdXRIYW5kbGVyKSBDb250YWluZXJSZXNwb25zZVdyaXRlci5zdXNwZW5kKC4uLil9CisgICAgICAgICAqIG9wZXJhdGlvbiB0aW1lcyBvdXQuCisgICAgICAgICAqCisgICAgICAgICAqIFRoZSBjdXN0b20gdGltZS1vdXQgaGFuZGxlciBpbXBsZW1lbnRhdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgbWFraW5nCisgICAgICAgICAqIHN1cmUgYSAodGltZS1vdXQpIHJlc3BvbnNlIGlzIHdyaXR0ZW4gdG8gdGhlIGNvbnRleHQgYW5kIHRoYXQgdGhlCisgICAgICAgICAqIGNvbnRhaW5lciBjb250ZXh0IGlzIHByb3Blcmx5IGNsb3NlZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHJlc3BvbnNlV3JpdGVyIHN1c3BlbmRlZCBjb250YWluZXIgcmVzcG9uc2Ugd3JpdGVyIHRoYXQgdGltZWQgb3V0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgb25UaW1lb3V0KENvbnRhaW5lclJlc3BvbnNlV3JpdGVyIHJlc3BvbnNlV3JpdGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSB0aGUgc3RhdHVzIGFuZCBoZWFkZXJzIG9mIHRoZSByZXNwb25zZSBhbmQgcmV0dXJuIGFuIG91dHB1dCBzdHJlYW0KKyAgICAgKiBmb3IgdGhlIHdlYiBhcHBsaWNhdGlvbiB0byB3cml0ZSB0aGUgZW50aXR5IG9mIHRoZSByZXNwb25zZS4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgcmVzcG9uc2UgY29udGVudCBsZW5ndGggaXMgZGVjbGFyZWQgdG8gYmUgZ3JlYXRlciBvciBlcXVhbCB0byAwLCBpdAorICAgICAqIG1lYW5zIHRoYXQgdGhlIGNvbnRlbnQgbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBlbnRpdHkgdG8gYmUgd3JpdHRlbiBpcyBrbm93biwKKyAgICAgKiBvdGhlcndpc2UgLTEuIEkvTyBjb250YWluZXJzIG1heSB1c2UgdGhpcyB2YWx1ZSB0byBkZXRlcm1pbmUgd2hldGhlciB0aGUKKyAgICAgKiB7QGNvZGUgIkNvbnRlbnQtTGVuZ3RoIn0gaGVhZGVyIGNhbiBiZSBzZXQgb3IgdXRpbGl6ZSBjaHVua2VkIHRyYW5zZmVyIGVuY29kaW5nLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZW50TGVuZ3RoIGdyZWF0ZXIgb3IgZXF1YWwgdG8gMCBpZiB0aGUgY29udGVudCBsZW5ndGggaW4gYnl0ZXMKKyAgICAgKiAgICAgb2YgdGhlIGVudGl0eSB0byBiZSB3cml0dGVuIGlzIGtub3duLCBvdGhlcndpc2UgLTEuIENvbnRhaW5lcnMKKyAgICAgKiAgICAgbWF5IHVzZSB0aGlzIHZhbHVlIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSB7QGNvZGUgIkNvbnRlbnQtTGVuZ3RoIn0KKyAgICAgKiAgICAgaGVhZGVyIGNhbiBiZSBzZXQgb3IgdXRpbGl6ZSBjaHVua2VkIHRyYW5zZmVyIGVuY29kaW5nLgorICAgICAqIEBwYXJhbSByZXNwb25zZUNvbnRleHQgdGhlIEpBWC1SUyByZXNwb25zZSB0byBiZSB3cml0dGVuLiBUaGUgc3RhdHVzIGFuZCBoZWFkZXJzCisgICAgICogICAgIGFyZSBvYnRhaW5lZCBmcm9tIHRoZSByZXNwb25zZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBvdXRwdXQgc3RyZWFtIHRvIHdyaXRlIHRoZSBlbnRpdHkgKGlmIGFueSkuCisgICAgICogQHRocm93cyBDb250YWluZXJFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJyZWQgd2hlbiB3cml0aW5nIG91dCB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgYW5kIGhlYWRlcnMgb3Igb2J0YWluaW5nIHRoZSBvdXRwdXQgc3RyZWFtLgorICAgICAqLworICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gd3JpdGVSZXNwb25zZVN0YXR1c0FuZEhlYWRlcnMobG9uZyBjb250ZW50TGVuZ3RoLCBDb250YWluZXJSZXNwb25zZSByZXNwb25zZUNvbnRleHQpCisgICAgICAgICAgICB0aHJvd3MgQ29udGFpbmVyRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU3VzcGVuZCB0aGUgcmVxdWVzdC9yZXNwb25zZSBwcm9jZXNzaW5nLgorICAgICAqCisgICAgICogVGhlIG1ldGhvZCByZXR1cm5zIHtAY29kZSB0cnVlfSB0byBpbmRpY2F0ZSB0aGUgcmVzcG9uc2Ugd3JpdGVyIHdhcyBzdXNwZW5kZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqIEluIGNhc2UgdGhlIHByb3ZpZGVyIGhhcyBhbHJlYWR5IGJlZW4gc3VzcGVuZGVkIGVhcmxpZXIsIHRoZSBtZXRob2QgcmV0dXJucyB7QGNvZGUgZmFsc2V9LgorICAgICAqIDxwPgorICAgICAqIEkvTyBjb250YWluZXIgbXVzdCBub3QgYXV0b21hdGljYWxseSB7QGxpbmsgI2NvbW1pdCgpIGNvbW1pdH0gdGhlIHJlc3BvbnNlIHdyaXRlcgorICAgICAqIHdoZW4gdGhlIHByb2Nlc3Npbmcgb24gdGhlIEkvTyBjb250YWluZXIgdGhyZWFkIGlzIGZpbmlzaGVkIGFuZCB0aGUgdGhyZWFkIGlzCisgICAgICogcmVsZWFzZWQuIEluc3RlYWQsIHRoZSBKZXJzZXkgcnVudGltZSB3aWxsIG1ha2Ugc3VyZSB0byBtYW51YWxseSBjbG9zZQorICAgICAqIHRoZSBjb250YWluZXIgcmVzcG9uc2Ugd3JpdGVyIGluc3RhbmNlIGJ5IGV4cGxpY2l0bHkgY2FsbGluZyB0aGUge0BsaW5rICNjb21taXQoKX0KKyAgICAgKiBvciB7QGxpbmsgI2ZhaWx1cmUoVGhyb3dhYmxlKX0gbWV0aG9kIGF0IHNvbWUgbGF0ZXIgcG9pbnQgaW4gdGltZS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogT25jZSBzdXNwZW5kZWQsIHRoZSBzcGVjaWZpZWQgc3VzcGVuZCB0aW1lb3V0IGNhbiBiZSBmdXJ0aGVyIHVwZGF0ZWQgdXNpbmcKKyAgICAgKiB7QGxpbmsgI3NldFN1c3BlbmRUaW1lb3V0KGxvbmcsIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0KSB9IG1ldGhvZC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gdGltZU91dCAgICAgICAgdGltZS1vdXQgdmFsdWUuIFZhbHVlIGxlc3Mgb3IgZXF1YWwgdG8gMCwgaW5kaWNhdGVzIHRoYXQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgdGhlIHByb2Nlc3NpbmcgaXMgc3VzcGVuZGVkIGluZGVmaW5pdGVseS4KKyAgICAgKiBAcGFyYW0gdGltZVVuaXQgICAgICAgdGltZS1vdXQgdGltZSB1bml0LgorICAgICAqIEBwYXJhbSB0aW1lb3V0SGFuZGxlciB0aW1lLW91dCBoYW5kbGVyIHRvIHByb2Nlc3MgYSB0aW1lLW91dCBldmVudCBpZiBpdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBvY2N1cnMuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHN1c3BlbmQgb3BlcmF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHksIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqCisgICAgICogQHNlZSAjc2V0U3VzcGVuZFRpbWVvdXQobG9uZywgVGltZVVuaXQpCisgICAgICogQHNlZSAjY29tbWl0KCkKKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBzdXNwZW5kKGxvbmcgdGltZU91dCwgVGltZVVuaXQgdGltZVVuaXQsIFRpbWVvdXRIYW5kbGVyIHRpbWVvdXRIYW5kbGVyKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc3VzcGVuZCB0aW1lb3V0LgorICAgICAqCisgICAgICogT25jZSB0aGUgY29udGFpbmVyIHJlc3BvbnNlIHdyaXRlciBpcyBzdXNwZW5kZWQsIHRoZSBzdXNwZW5kIHRpbWVvdXQgdmFsdWUKKyAgICAgKiBjYW4gYmUgZnVydGhlciB1cGRhdGVkIGJ5IHRoZSBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGltZU91dCAgdGltZS1vdXQgdmFsdWUuIFZhbHVlIGxlc3Mgb3IgZXF1YWwgdG8gMCwgaW5kaWNhdGVzIHRoYXQKKyAgICAgKiAgICAgICAgICAgICAgICAgdGhlIHByb2Nlc3NpbmcgaXMgc3VzcGVuZGVkIGluZGVmaW5pdGVseS4KKyAgICAgKiBAcGFyYW0gdGltZVVuaXQgdGltZS1vdXQgdGltZSB1bml0LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGluIGNhc2UgdGhlIHJlc3BvbnNlIHdyaXRlciBoYXMgbm90IGJlZW4gc3VzcGVuZGVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWV0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN1c3BlbmRUaW1lb3V0KGxvbmcgdGltZU91dCwgVGltZVVuaXQgdGltZVVuaXQpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBDb21taXQgdGhlIHJlc3BvbnNlICYgY2xvc2UgdGhlIGNvbnRhaW5lciByZXNwb25zZSB3cml0ZXIuCisgICAgICoKKyAgICAgKiBJbmRpY2F0ZXMgdG8gdGhlIEkvTyBjb250YWluZXIgdGhhdCByZXF1ZXN0IGhhcyBiZWVuIGZ1bGx5IHByb2Nlc3NlZCBhbmQgcmVzcG9uc2UKKyAgICAgKiBoYXMgYmVlbiBmdWxseSB3cml0dGVuLiBUaGlzIHNpZ25hbHMgdGhlIEkvTyAgY29udGFpbmVyIHRvIGZpbmlzaCB0aGUgcmVxdWVzdC9yZXNwb25zZQorICAgICAqIHByb2Nlc3NpbmcsIGNsZWFuIHVwIGFueSBzdGF0ZSwgZmx1c2ggYW55IHN0cmVhbXMsIHJlbGVhc2UgcmVzb3VyY2VzIGV0Yy4KKyAgICAgKgorICAgICAqIEBzZWUgI3N1c3BlbmQobG9uZywgVGltZVVuaXQsIFRpbWVvdXRIYW5kbGVyKQorICAgICAqIEBzZWUgI2ZhaWx1cmUoVGhyb3dhYmxlKQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNvbW1pdCgpOworCisgICAgLyoqCisgICAgICogUHJvcGFnYXRlIGFuIHVuaGFuZGxlZCBlcnJvciB0byB0aGUgSS9PIGNvbnRhaW5lci4KKyAgICAgKgorICAgICAqIEluZGljYXRlcyB0byB0aGUgSS9PIGNvbnRhaW5lciB0aGF0IHRoZSByZXF1ZXN0IHByb2Nlc3NpbmcgaGFzIGZpbmlzaGVkIHdpdGggYW4gZXJyb3IKKyAgICAgKiB0aGF0IGNvdWxkIG5vdCBiZSBwcm9jZXNzZWQgYnkgdGhlIEplcnNleSBydW50aW1lLiBUaGUgSS9PIGNvbnRhaW5lciBpcyBleHBlY3RlZCB0byBwcm9jZXNzCisgICAgICogdGhlIGV4Y2VwdGlvbiBpbiBhIGNvbnRhaW5lci1zcGVjaWZpYyB3YXkuIFRoaXMgbWV0aG9kIGFsc28gc2lnbmFscyB0aGUgSS9PIGNvbnRhaW5lciB0bworICAgICAqIGZpbmlzaCB0aGUgcmVxdWVzdC9yZXNwb25zZSBwcm9jZXNzaW5nLCBjbGVhbiB1cCBhbnkgc3RhdGUsIGZsdXNoIGFueSBzdHJlYW1zLCByZWxlYXNlCisgICAgICogcmVzb3VyY2VzIGV0Yy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlcnJvciB1bmhhbmRsZWQgcmVxdWVzdCBwcm9jZXNzaW5nIGVycm9yLgorICAgICAqCisgICAgICogQHNlZSAjc3VzcGVuZChsb25nLCBUaW1lVW5pdCwgVGltZW91dEhhbmRsZXIpCisgICAgICogQHNlZSAjY29tbWl0KCkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBmYWlsdXJlKFRocm93YWJsZSBlcnJvcik7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBlbnRpdHkgYnVmZmVyaW5nIHNob3VsZCBiZSBlbmFibGVkIGluIEplcnNleS4KKyAgICAgKgorICAgICAqIElmIGVuYWJsZWQsIHRoZSBvdXRib3VuZCBlbnRpdHkgaXMgYnVmZmVyZWQgYnkgSmVyc2V5IHJ1bnRpbWUgdXAgdG8gYSBjb25maWd1cmVkIGFtb3VudCBvZiBieXRlcworICAgICAqIHByaW9yIHRvIGJlaW5nIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBzdHJlYW0gdG8gZGV0ZXJtaW5lIGl0cyBzaXplIHRoYXQgbWF5IGJlIHVzZWQgdG8gc2V0IHRoZSB2YWx1ZQorICAgICAqIG9mIEhUVFAgPHR0PntAdmFsdWUgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVycyNDT05URU5UX0xFTkdUSH08L3R0PiBoZWFkZXIuCisgICAgICogPHA+CisgICAgICogQ29udGFpbmVycyB0aGF0IHByb3ZpZGUgaXQncyBvd24gc29sdXRpb24gZm9yIGRldGVybWluaW5nIHRoZSBtZXNzYWdlIHBheWxvYWQgc2l6ZSBtYXkgZGVjaWRlIHRvCisgICAgICogcmV0dXJuIHtAY29kZSBmYWxzZX0gdG8gcHJldmVudCBKZXJzZXkgZnJvbSBidWZmZXJpbmcgbWVzc2FnZSBlbnRpdGllcyB1bm5lY2Vzc2FyaWx5LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IHRvIGVuYWJsZSBlbnRpdHkgYnVmZmVyaW5nIHRvIGJlIGRvbmUgYnkgSmVyc2V5IHJ1bnRpbWUsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZVJlc3BvbnNlQnVmZmVyaW5nKCk7Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcGkvRXh0ZXJuYWxSZXF1ZXN0Q29udGV4dC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3BpL0V4dGVybmFsUmVxdWVzdENvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDFlMWJiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3BpL0V4dGVybmFsUmVxdWVzdENvbnRleHQuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGk7CisKKy8qKgorICogV3JhcHBlciBmb3IgZXh0ZXJuYWxseSBwcm92aWRlZCByZXF1ZXN0IGNvbnRleHQgZGF0YS4KKyAqCisgKiBAcGFyYW0gPFQ+IGV4dGVybmFsIHJlcXVlc3QgZGF0YS4KKyAqCisgKiBAc2VlIEV4dGVybmFsUmVxdWVzdFNjb3BlCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEV4dGVybmFsUmVxdWVzdENvbnRleHQ8VD4geworCisgICAgcHJpdmF0ZSBmaW5hbCBUIGNvbnRleHQ7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IGV4dGVybmFsIHJlcXVlc3QgY29udGV4dCBjb250YWluaW5nIGdpdmVuIGRhdGEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBleHRlcm5hbCBjb250ZXh0IGRhdGEuCisgICAgICovCisgICAgcHVibGljIEV4dGVybmFsUmVxdWVzdENvbnRleHQoVCBjb250ZXh0KSB7CisgICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IG1lIGN1cnJlbnQgZXh0ZXJuYWwgY29udGV4dCBkYXRhLgorICAgICAqCisgICAgICogQHJldHVybiBjb250ZXh0IGRhdGEuCisgICAgICovCisgICAgcHVibGljIFQgZ2V0Q29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3BpL0V4dGVybmFsUmVxdWVzdFNjb3BlLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcGkvRXh0ZXJuYWxSZXF1ZXN0U2NvcGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjhjOTI1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3BpL0V4dGVybmFsUmVxdWVzdFNjb3BlLmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CisKKy8qKgorICogVGhpcyBpcyB0byBhbGxvdyBpbnRlZ3JhdGlvbiB3aXRoIG90aGVyIERJIHByb3ZpZGVycyB0aGF0CisgKiBkZWZpbmUgdGhlaXIgb3duIHJlcXVlc3Qgc2NvcGUuIEFueSBzdWNoIHByb3ZpZGVyIHNob3VsZCBpbXBsZW1lbnQKKyAqIHRoaXMgdG8gcHJvcGVybHkgb3Blbi9maW5pc2ggdGhlIHNjb3BlLgorICogPHA+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBtdXN0IGJlIHJlZ2lzdGVyZWQgdmlhIE1FVEEtSU5GL3NlcnZpY2VzIG1lY2hhbmlzbS4KKyAqIE9ubHkgb25lIGltcGxlbWVudGF0aW9uIHdpbGwgYmUgdXRpbGl6ZWQgZHVyaW5nIHJ1bnRpbWUuCisgKiBJZiBtb3JlIHRoYW4gb25lIGltcGxlbWVudGF0aW9uIGlzIHJlZ2lzdGVyZWQsIG5vIG9uZSB3aWxsIGdldCB1c2VkIGFuZAorICogYW4gZXJyb3IgbWVzc2FnZSB3aWxsIGJlIGxvZ2dlZCBvdXQuCisgKiA8L3A+CisgKgorICogQHBhcmFtIDxUPiBleHRlcm5hbCByZXF1ZXN0IGNvbnRleHQgdHlwZQorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBzaW5jZSAyLjE1CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRXh0ZXJuYWxSZXF1ZXN0U2NvcGU8VD4gZXh0ZW5kcyBBdXRvQ2xvc2VhYmxlIHsKKworICAgIC8qKgorICAgICAqIEludm9rZWQgd2hlbiBhIG5ldyByZXF1ZXN0IGdldHMgc3RhcnRlZC4KKyAgICAgKiBSZXR1cm5lZCBjb250ZXh0IGRhdGEgd2lsbCBiZSByZXRhaW5lZAorICAgICAqIGJ5IEplcnNleSBydW50aW1lIGZvciB0aGUgd2hvbGUgcmVxdWVzdCBsaWZlLXNwYW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5qZWN0aW9uTWFuYWdlciBESSBpbmplY3Rpb24gbWFuYWdlcgorICAgICAqIEByZXR1cm4gZXh0ZXJuYWwgcmVxdWVzdCBjb250ZXh0IGRhdGEKKyAgICAgKi8KKyAgICBFeHRlcm5hbFJlcXVlc3RDb250ZXh0PFQ+IG9wZW4oSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyKTsKKworICAgIC8qKgorICAgICAqIFN1c3BlbmQgcmVxdWVzdCBhc3NvY2lhdGVkIHdpdGggcHJvdmlkZWQgY29udGV4dC4KKyAgICAgKiBUaGlzIHdpbGwgYmUgY2FsbGVkIHdpdGhpbiB0aGUgdmVyeSBzYW1lIHRocmVhZCBhcyBwcmV2aW91cyBvcGVuIG9yIHJlc3VtZSBjYWxsCisgICAgICogY29ycmVzcG9uZGluZyB0byB0aGUgYWN0dWFsIGNvbnRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYyAgICAgICAgICAgICAgICBleHRlcm5hbCByZXF1ZXN0IGNvbnRleHQKKyAgICAgKiBAcGFyYW0gaW5qZWN0aW9uTWFuYWdlciBESSBpbmplY3Rpb24gbWFuYWdlcgorICAgICAqLworICAgIHZvaWQgc3VzcGVuZChFeHRlcm5hbFJlcXVlc3RDb250ZXh0PFQ+IGMsIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlcik7CisKKyAgICAvKioKKyAgICAgKiBSZXN1bWUgcmVxdWVzdCBhc3NvY2lhdGVkIHdpdGggcHJvdmlkZWQgY29udGV4dC4KKyAgICAgKiBUaGUgZXh0ZXJuYWwgcmVxdWVzdCBjb250ZXh0IGluc3RhbmNlIHNob3VsZCBoYXZlIGJlZW4KKyAgICAgKiBwcmV2aW91c2x5IHN1c3BlbmRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjICAgICAgICAgICAgICAgIGV4dGVybmFsIHJlcXVlc3QgY29udGV4dAorICAgICAqIEBwYXJhbSBpbmplY3Rpb25NYW5hZ2VyIERJIGluamVjdGlvbiBtYW5hZ2VyCisgICAgICovCisgICAgdm9pZCByZXN1bWUoRXh0ZXJuYWxSZXF1ZXN0Q29udGV4dDxUPiBjLCBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIpOworCisgICAgLyoqCisgICAgICogRmluaXNoIHRoZSBhY3R1YWwgcmVxdWVzdC4gVGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQKKyAgICAgKiBmb2xsb3dpbmcgcHJldmlvdXMgb3BlbiBtZXRob2QgY2FsbCBvbiB0aGUgdmVyeSBzYW1lIHRocmVhZAorICAgICAqIG9yIGFmdGVyIG9wZW4gbWV0aG9kIGNhbGwgZm9sbG93ZWQgYnkgKHNldmVyYWwpIHN1c3BlbmQvcmVzdW1lIGludm9jYXRpb25zLAorICAgICAqIHdoZXJlIHRoZSBsYXN0IHJlc3VtZSBjYWxsIGhhcyBiZWVuIGludm9rZWQgb24gdGhlIHNhbWUgdGhyZWFkCisgICAgICogYXMgdGhlIGZpbmFsIGNsb3NlIG1ldGhvZCBpbnZvY2F0aW9uLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHZvaWQgY2xvc2UoKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwaS9SZXF1ZXN0U2NvcGVkSW5pdGlhbGl6ZXIuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwaS9SZXF1ZXN0U2NvcGVkSW5pdGlhbGl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTJiOTdmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3BpL1JlcXVlc3RTY29wZWRJbml0aWFsaXplci5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworCisvKioKKyAqIEN1c3RvbSBpbml0aWFsaXphdGlvbiBwcm92aWRlciB0aGF0IGlzIGd1YXJhbnRlZWQgdG8gYmUgcnVuIGZyb20gd2l0aGluIGFuIGFjdGl2ZQorICogcmVxdWVzdCBzY29wZS4KKyAqCisgKiBDb250YWluZXIgaW1wbGVtZW50YXRpb25zIG1heSB1c2UgdGhpcyBleHRlbnNpb24gcG9pbnQgdG8gcHJvdmlkZSBpbml0aWFsaXphdGlvbgorICogb2YgY3VzdG9tIHJlcXVlc3Qtc2NvcGVkIGRhdGEuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGludGVyZmFjZSBSZXF1ZXN0U2NvcGVkSW5pdGlhbGl6ZXIgeworICAgIC8qKgorICAgICAqIFBlcmZvcm0gcmVxdWVzdC1zY29wZWQgaW5pdGlhbGl6YXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5qZWN0aW9uTWFuYWdlciBjdXJyZW50IGluamVjdGlvbiBtYW5hZ2VyIGluc3RhbmNlIGNvbmZpZ3VyZWQgaW4gdGhlCisgICAgICogICAgICAgICAgICAgICAgIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlcik7Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcGkvUmVzcG9uc2VFcnJvck1hcHBlci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3BpL1Jlc3BvbnNlRXJyb3JNYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzFiNGM2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3BpL1Jlc3BvbnNlRXJyb3JNYXBwZXIuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdHJhaW5lZFRvOworaW1wb3J0IGphdmF4LndzLnJzLlJ1bnRpbWVUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuQ29udHJhY3Q7CisKKy8qKgorICogQ29udHJhY3QgZm9yIGEgcHJvdmlkZXIgdGhhdCBtYXBzIHJlc3BvbnNlIHByb2Nlc3NpbmcgZXJyb3JzIHRvIHtAbGluayBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlfS4KKyAqIDxwPgorICogUHJvdmlkZXJzIGltcGxlbWVudGluZyB7QGNvZGUgUmVzcG9uc2VFcnJvck1hcHBlcn0gY29udHJhY3QgbXVzdCBiZSBlaXRoZXIgcHJvZ3JhbW1hdGljYWxseSByZWdpc3RlcmVkIGluIGEgSkFYLVJTIHJ1bnRpbWUgb3IKKyAqIG11c3QgYmUgYW5ub3RhdGVkIHdpdGgge0BsaW5rIGphdmF4LndzLnJzLmV4dC5Qcm92aWRlciAmIzY0O1Byb3ZpZGVyfSBhbm5vdGF0aW9uIHRvIGJlIGF1dG9tYXRpY2FsbHkgZGlzY292ZXJlZCBieSB0aGUgSkFYLVJTCisgKiBydW50aW1lIGR1cmluZyBhIHByb3ZpZGVyIHNjYW5uaW5nIHBoYXNlLgorICogPC9wPgorICogPHA+CisgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMjUFJPQ0VTU0lOR19SRVNQT05TRV9FUlJPUlNfRU5BQkxFRH0gcHJvcGVydHkgaGFzIHRvIGJlIGVuYWJsZWQgaW4gb3JkZXIgdG8KKyAqIHVzZSB0aGlzIGNvbnRyYWN0LgorICogPC9wPgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICogQHNlZSBqYXZheC53cy5ycy5leHQuUHJvdmlkZXIKKyAqIEBzZWUgamF2YXgud3MucnMuY29yZS5SZXNwb25zZQorICogQHNpbmNlIDIuOAorICovCitAQ29udHJhY3QKK0BDb25zdHJhaW5lZFRvKFJ1bnRpbWVUeXBlLlNFUlZFUikKK3B1YmxpYyBpbnRlcmZhY2UgUmVzcG9uc2VFcnJvck1hcHBlciB7CisKKyAgICBwdWJsaWMgUmVzcG9uc2UgdG9SZXNwb25zZShUaHJvd2FibGUgdGhyb3dhYmxlKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwaS9WYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwaS9WYWxpZGF0aW9uSW50ZXJjZXB0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGQwMDU4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3BpL1ZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaTsKKworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuQ29udHJhY3Q7CisKKy8qKgorICogSW50ZXJjZXB0b3IgZm9yIG1ldGhvZCB2YWxpZGF0aW9uIHByb2Nlc3NpbmcuCisgKgorICogQWxsb3dzIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IEplcnNleSBiZWhhdmlvdXIuIEJ5IGRlZmF1bHQsIHRoZSBKZXJzZXkgcnVudGltZSB0aHJvd3MgYQorICoge0BsaW5rIGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdGlvbkV4Y2VwdGlvbn0gb3Igb25lIG9mIGl0cyBzdWJjbGFzc2VzLAorICogdGhhdCBnZXRzIG1hcHBlZCB0byBhIEhUVFAgNDAwIHJlc3BvbnNlLCBpZiBhbnkgdmFsaWRhdGlvbiBpc3N1ZXMgb2NjdXIuIEluIHN1Y2ggY2FzZQorICogdGhlIGFjdHVhbCByZXNvdXJjZSBtZXRob2QgZG9lcyBub3QgZ2V0IGludm9rZWQgYXQgYWxsLgorICogPHA+CisgKiBWYWxpZGF0aW9uIGludGVyY2VwdG9yIGltcGxlbWVudGF0aW9uIGFsbG93cyB0byBlLmcuIHN3YWxsb3cgdGhlIHtAbGluayBDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9ufQorICogYW5kIGhhbmRsZSB0aGUgdmFsaWRhdGlvbiBpc3N1ZXMgaW4gdGhlIHJlc291cmNlIG1ldGhvZC4gSXQgaXMgYWxzbyBwb3NzaWJsZSB0byB0d2VhaworICogdmFsaWRhdGVkIGNvbXBvbmVudHMuIFRoaXMgY291bGQgYmUgdXRpbGl6ZWQgaW4gY2FzZSBvZiBwcm94aWVkIHJlc291cmNlcywKKyAqIHdoZW4gZmllbGQgdmFsaWRhdGlvbiBpcyBub3QgcG9zc2libGUgb24gYSBkeW5hbWljIHByb3h5LCBhbmQgdGhlIHZhbGlkYXRvciByZXF1aXJlcworICogdGhlIG9yaWdpbmFsIGRlbGVnYXRlZCBpbnN0YW5jZS4KKyAqIDwvcD4KKyAqIDxwPgorICogRWFjaCB2YWxpZGF0aW9uIGludGVyY2VwdG9yIGltcGxlbWVudGF0aW9uIG11c3QgaW52b2tlIHByb2NlZWQKKyAqIG1ldGhvZCBvbiBwcm92aWRlZCBpbnRlcmNlcHRvciBjb250ZXh0IGFzIHBhcnQgb2YgaW50ZXJjZXB0aW9uIHByb2Nlc3NpbmcuCisgKiA8L3A+CisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVhayBhdCBvcmFjbGUuY29tKQorICogQHNpbmNlIDIuMTgKKyAqLworQENvbnRyYWN0CitwdWJsaWMgaW50ZXJmYWNlIFZhbGlkYXRpb25JbnRlcmNlcHRvciB7CisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIGludGVyY2VwdCByZXNvdXJjZSBtZXRob2QgdmFsaWRhdGlvbiBwcm9jZXNzaW5nLgorICAgICAqIDxwLz4KKyAgICAgKiBUbyBhbGxvdyBmdXJ0aGVyIHZhbGlkYXRpb24gcHJvY2Vzc2luZywgZXZlcnkgYW5kIGVhY2ggaW1wbGVtZW50YXRpb24KKyAgICAgKiBtdXN0IGludm9rZSB7QGxpbmsgVmFsaWRhdGlvbkludGVyY2VwdG9yQ29udGV4dCNwcm9jZWVkKCl9IG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IG1ldGhvZCB2YWxpZGF0aW9uIGNvbnRleHQuCisgICAgICogQHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIGluIGNhc2UgdGhlIHZhbGlkYXRpb24gZXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24gYXMgYSByZXN1bHQgb2YgdGhlIHZhbGlkYXRpb24gcHJvY2Vzc2luZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvblZhbGlkYXRlKFZhbGlkYXRpb25JbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIFZhbGlkYXRpb25FeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcGkvVmFsaWRhdGlvbkludGVyY2VwdG9yQ29udGV4dC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3BpL1ZhbGlkYXRpb25JbnRlcmNlcHRvckNvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmRhMzg4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3BpL1ZhbGlkYXRpb25JbnRlcmNlcHRvckNvbnRleHQuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGk7CisKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuSW52b2NhYmxlOworCisvKioKKyAqIENvbnRleHQgZm9yIHJlc291cmNlIG1ldGhvZCB2YWxpZGF0aW9uIGludGVyY2VwdGlvbiBwcm9jZXNzaW5nIChzZWUge0BsaW5rIFZhbGlkYXRpb25JbnRlcmNlcHRvcn0pLgorICogVGhlIGNvbnRleHQgZ2l2ZXMgYWNjZXNzIHRvIGtleSB2YWxpZGF0aW9uIGRhdGEuCisgKiBJdCBhbHNvIGFsbG93cyBpbnRlcmNlcHRvciBpbXBsZW1lbnRhdGlvbiB0byB0d2VhayByZXNvdXJjZSBhbmQvb3IgcGFyYW1ldGVycyB0aGF0IGFyZSBnb2luZyB0byBiZSB2YWxpZGF0ZWQuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBzZWUgVmFsaWRhdGlvbkludGVyY2VwdG9yCisgKiBAc2luY2UgMi4xOAorICovCitwdWJsaWMgaW50ZXJmYWNlIFZhbGlkYXRpb25JbnRlcmNlcHRvckNvbnRleHQgeworCisgICAgLyoqCisgICAgICogUHJvdmlkZSBhY3R1YWwgcmVzb3VyY2UgaW5zdGFuY2UgdGhhdCB3aWxsIGdldCB2YWxpZGF0ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGN1cnJlbnQgcmVzb3VyY2UgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRSZXNvdXJjZSgpOworCisgICAgLyoqCisgICAgICogU2V0dGVyIGZvciByZXNvdXJjZSBpbnN0YW5jZSB0aGF0IHNob3VsZCBnZXQgdmFsaWRhdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlIGluc3RhbmNlIHRvIHZhbGlkYXRlCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2UoT2JqZWN0IHJlc291cmNlKTsKKworICAgIC8qKgorICAgICAqIFByb3ZpZGUgaW52b2NhYmxlIGZvciB3aGljaCB2YWxpZGF0aW9uIHdpbGwgYmVlbiBkb25lLgorICAgICAqCisgICAgICogQHJldHVybiBhY3R1YWwgaW52b2NhYmxlIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBJbnZvY2FibGUgZ2V0SW52b2NhYmxlKCk7CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlIG1ldGhvZCBwYXJhbWV0ZXJzIGZvciB3aGljaCB2YWxpZGF0aW9uIHdpbGwgYmUgZG9uZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYWN0dWFsIG1ldGhvZCBwYXJhbWV0ZXJzLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3RbXSBnZXRBcmdzKCk7CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgcGFyYW1ldGVycyBzZXR0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXJncyBtZXRob2QgcGFyYW1ldGVycyB0byBiZSB1c2VkIGZvciB2YWxpZGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFyZ3MoT2JqZWN0W10gYXJncyk7CisKKyAgICAvKioKKyAgICAgKiBQcm9jZWVkIHdpdGggdmFsaWRhdGlvbi4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIG11c3QgYmUgaW52b2tlZCBieSBhIHZhbGlkYXRpb24gaW50ZXJjZXB0b3IgaW1wbGVtZW50YXRpb24uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdGlvbkV4Y2VwdGlvbiBpbiBjYXNlIHRoZSBmdXJ0aGVyIHZhbGlkYXRpb24gcHJvY2Vzc2luZyBmYWlsZWQgd2l0aCBhIHZhbGlkYXRpb24gZXJyb3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcHJvY2VlZCgpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3BpL2ludGVybmFsL1BhcmFtVmFsdWVGYWN0b3J5V2l0aFNvdXJjZS5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3BpL2ludGVybmFsL1BhcmFtVmFsdWVGYWN0b3J5V2l0aFNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmM2U2MWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcGkvaW50ZXJuYWwvUGFyYW1WYWx1ZUZhY3RvcnlXaXRoU291cmNlLmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5QYXJhbWV0ZXI7CisKKy8qKgorICogRXh0ZW5kcyB7QGxpbmsgU3VwcGxpZXJ9IGludGVyZmFjZSB3aXRoCisgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlBhcmFtZXRlci5Tb3VyY2V9IGluZm9ybWF0aW9uLgorICoKKyAqIEBwYXJhbSA8VD4gVGhpcyBtdXN0IGJlIHRoZSB0eXBlIG9mIGVudGl0eSBmb3Igd2hpY2ggdGhpcyBpcyBhIGZhY3RvcnkuCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFBhcmFtVmFsdWVGYWN0b3J5V2l0aFNvdXJjZTxUPiBpbXBsZW1lbnRzIEZ1bmN0aW9uPENvbnRhaW5lclJlcXVlc3QsIFQ+IHsKKworICAgIHByaXZhdGUgZmluYWwgRnVuY3Rpb248Q29udGFpbmVyUmVxdWVzdCwgVD4gcGFyYW1ldGVyRnVuY3Rpb247CisgICAgcHJpdmF0ZSBmaW5hbCBQYXJhbWV0ZXIuU291cmNlIHBhcmFtZXRlclNvdXJjZTsKKworICAgIC8qKgorICAgICAqIFdyYXAgcHJvdmlkZWQgcGFyYW0gc3VwcGxpZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyYW1GdW5jdGlvbiAgIHBhcmFtIHN1cHBsaWVyIHRvIGJlIHdyYXBwZWQuCisgICAgICogQHBhcmFtIHBhcmFtZXRlclNvdXJjZSBwYXJhbSBzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIFBhcmFtVmFsdWVGYWN0b3J5V2l0aFNvdXJjZShGdW5jdGlvbjxDb250YWluZXJSZXF1ZXN0LCBUPiBwYXJhbUZ1bmN0aW9uLCBQYXJhbWV0ZXIuU291cmNlIHBhcmFtZXRlclNvdXJjZSkgeworICAgICAgICB0aGlzLnBhcmFtZXRlckZ1bmN0aW9uID0gcGFyYW1GdW5jdGlvbjsKKyAgICAgICAgdGhpcy5wYXJhbWV0ZXJTb3VyY2UgPSBwYXJhbWV0ZXJTb3VyY2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFQgYXBwbHkoQ29udGFpbmVyUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIHJldHVybiBwYXJhbWV0ZXJGdW5jdGlvbi5hcHBseShyZXF1ZXN0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUGFyYW1ldGVyLlNvdXJjZX0KKyAgICAgKiB3aGljaCBjbG9zZWx5IGRldGVybWluZXMgYSBmdW5jdGlvbiBvZiB0aGUgY3VycmVudCBzdXBwbGllci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gU291cmNlIHdoaWNoIGEgZ2l2ZW4gcGFyYW1ldGVyIGJlbG9uZ3MgdG8uCisgICAgICoqLworICAgIHB1YmxpYyBQYXJhbWV0ZXIuU291cmNlIGdldFNvdXJjZSgpIHsKKyAgICAgICAgcmV0dXJuIHBhcmFtZXRlclNvdXJjZTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwaS9pbnRlcm5hbC9QYXJhbWV0ZXJWYWx1ZUhlbHBlci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3BpL2ludGVybmFsL1BhcmFtZXRlclZhbHVlSGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc1MmE1NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwaS9pbnRlcm5hbC9QYXJhbWV0ZXJWYWx1ZUhlbHBlci5qYXZhCkBAIC0wLDAgKzEsMTU4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IGphdmF4LndzLnJzLk5vdFN1cHBvcnRlZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5NZXNzYWdlQm9keVByb3ZpZGVyTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLnByb2Nlc3MuTWFwcGFibGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUGFyYW1ldGVyaXplZDsKKworLyoqCisgKiBVdGlsaXR5IG1ldGhvZHMgZm9yIHJldHJpZXZpbmcgdmFsdWVzIG9yIHZhbHVlIHByb3ZpZGVycyBmb3IgdGhlCisgKiB7QGxpbmsgUGFyYW1ldGVyaXplZCBwYXJhbWV0ZXJpemVkfSByZXNvdXJjZSBtb2RlbCBjb21wb25lbnRzLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBQYXJhbWV0ZXJWYWx1ZUhlbHBlciB7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGFycmF5IG9mIHBhcmFtZXRlciB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWVQcm92aWRlcnMgYSBsaXN0IG9mIHZhbHVlIHByb3ZpZGVycy4KKyAgICAgKiBAcmV0dXJuIGFycmF5IG9mIHBhcmFtZXRlciB2YWx1ZXMgcHJvdmlkZWQgYnkgdGhlIHZhbHVlIHByb3ZpZGVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdFtdIGdldFBhcmFtZXRlclZhbHVlcyhMaXN0PFBhcmFtVmFsdWVGYWN0b3J5V2l0aFNvdXJjZTw/Pj4gdmFsdWVQcm92aWRlcnMsIENvbnRhaW5lclJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICBmaW5hbCBPYmplY3RbXSBwYXJhbXMgPSBuZXcgT2JqZWN0W3ZhbHVlUHJvdmlkZXJzLnNpemUoKV07CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnQgZW50aXR5UHJvdmlkZXJJbmRleCA9IC0xOworICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKKworICAgICAgICAgICAgZm9yIChQYXJhbVZhbHVlRmFjdG9yeVdpdGhTb3VyY2U8Pz4gcGFyYW1WYWxQcm92aWRlciA6IHZhbHVlUHJvdmlkZXJzKSB7CisgICAgICAgICAgICAgICAgLy8gZW50aXR5IHByb3ZpZGVyIGhhcyB0byBiZSBjYWxsZWQgbGFzdDsgc2VlIEpFUlNFWS0yNjQyCisgICAgICAgICAgICAgICAgaWYgKHBhcmFtVmFsUHJvdmlkZXIuZ2V0U291cmNlKCkuZXF1YWxzKFBhcmFtZXRlci5Tb3VyY2UuRU5USVRZKSkgeworICAgICAgICAgICAgICAgICAgICBlbnRpdHlQcm92aWRlckluZGV4ID0gaW5kZXgrKzsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcGFyYW1zW2luZGV4KytdID0gcGFyYW1WYWxQcm92aWRlci5hcHBseShyZXF1ZXN0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGVudGl0eVByb3ZpZGVySW5kZXggIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBwYXJhbXNbZW50aXR5UHJvdmlkZXJJbmRleF0gPSB2YWx1ZVByb3ZpZGVycy5nZXQoZW50aXR5UHJvdmlkZXJJbmRleCkuYXBwbHkocmVxdWVzdCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBwYXJhbXM7CisgICAgICAgIH0gY2F0Y2ggKFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0gY2F0Y2ggKE1lc3NhZ2VCb2R5UHJvdmlkZXJOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKGUpOworICAgICAgICB9IGNhdGNoIChQcm9jZXNzaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKGUuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgKFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKSBlLmdldENhdXNlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRocm93IG5ldyBNYXBwYWJsZUV4Y2VwdGlvbigiRXhjZXB0aW9uIG9idGFpbmluZyBwYXJhbWV0ZXJzIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbGlzdCBvZiBwYXJhbWV0ZXIgdmFsdWUgcHJvdmlkZXJzIGZvciB0aGUgZ2l2ZW4ge0BsaW5rIFBhcmFtZXRlcml6ZWQKKyAgICAgKiBwYXJhbWV0ZXJpemVkfSByZXNvdXJjZSBtb2RlbCBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWVTdXBwbGllcnMgYWxsIHJlZ2lzdGVyZWQgdmFsdWUgc3VwcGxpZXJzLgorICAgICAqIEBwYXJhbSBwYXJhbWV0ZXJpemVkICBwYXJhbWV0ZXJpemVkIHJlc291cmNlIG1vZGVswqBjb21wb25lbnQuCisgICAgICogQHJldHVybiBsaXN0IG9mIHBhcmFtZXRlciB2YWx1ZSBwcm92aWRlcnMgZm9yIHRoZSBwYXJhbWV0ZXJpemVkIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8UGFyYW1WYWx1ZUZhY3RvcnlXaXRoU291cmNlPD8+PiBjcmVhdGVWYWx1ZVByb3ZpZGVycyhDb2xsZWN0aW9uPFZhbHVlUGFyYW1Qcm92aWRlcj4gdmFsdWVTdXBwbGllcnMsCisgICAgICAgICAgICBQYXJhbWV0ZXJpemVkIHBhcmFtZXRlcml6ZWQpIHsKKyAgICAgICAgaWYgKChudWxsID09IHBhcmFtZXRlcml6ZWQuZ2V0UGFyYW1ldGVycygpKSB8fCAoMCA9PSBwYXJhbWV0ZXJpemVkLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgICAgIH0KKworICAgICAgICBMaXN0PFZhbHVlUGFyYW1Qcm92aWRlcj4gdmFsdWVQYXJhbVByb3ZpZGVycyA9IHZhbHVlU3VwcGxpZXJzLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgICAgICAuc29ydGVkKChvMSwgbzIpIC0+IG8yLmdldFByaW9yaXR5KCkuZ2V0V2VpZ2h0KCkgLSBvMS5nZXRQcmlvcml0eSgpLmdldFdlaWdodCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisKKyAgICAgICAgYm9vbGVhbiBlbnRpdHlQYXJhbUZvdW5kID0gZmFsc2U7CisgICAgICAgIGZpbmFsIExpc3Q8UGFyYW1WYWx1ZUZhY3RvcnlXaXRoU291cmNlPD8+PiBwcm92aWRlcnMgPSBuZXcgQXJyYXlMaXN0PD4ocGFyYW1ldGVyaXplZC5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChmaW5hbCBQYXJhbWV0ZXIgcGFyYW1ldGVyIDogcGFyYW1ldGVyaXplZC5nZXRQYXJhbWV0ZXJzKCkpIHsKKyAgICAgICAgICAgIGZpbmFsIFBhcmFtZXRlci5Tb3VyY2UgcGFyYW1ldGVyU291cmNlID0gcGFyYW1ldGVyLmdldFNvdXJjZSgpOworICAgICAgICAgICAgZW50aXR5UGFyYW1Gb3VuZCA9IGVudGl0eVBhcmFtRm91bmQgfHwgUGFyYW1ldGVyLlNvdXJjZS5FTlRJVFkgPT0gcGFyYW1ldGVyU291cmNlOworICAgICAgICAgICAgZmluYWwgRnVuY3Rpb248Q29udGFpbmVyUmVxdWVzdCwgPz4gdmFsdWVGdW5jdGlvbiA9IGdldFBhcmFtVmFsdWVQcm92aWRlcih2YWx1ZVBhcmFtUHJvdmlkZXJzLCBwYXJhbWV0ZXIpOworICAgICAgICAgICAgaWYgKHZhbHVlRnVuY3Rpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHByb3ZpZGVycy5hZGQod3JhcFBhcmFtVmFsdWVQcm92aWRlcih2YWx1ZUZ1bmN0aW9uLCBwYXJhbWV0ZXJTb3VyY2UpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJvdmlkZXJzLmFkZChudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghZW50aXR5UGFyYW1Gb3VuZCAmJiBDb2xsZWN0aW9ucy5mcmVxdWVuY3kocHJvdmlkZXJzLCBudWxsKSA9PSAxKSB7CisgICAgICAgICAgICAvLyBUcnkgdG8gZmluZCBlbnRpdHkgaWYgdGhlcmUgaXMgb25lIHVucmVzb2x2ZWQgcGFyYW1ldGVyIGFuZCB0aGUgYW5ub3RhdGlvbnMgYXJlIHVua25vd24KKyAgICAgICAgICAgIGZpbmFsIGludCBlbnRpdHlQYXJhbUluZGV4ID0gcHJvdmlkZXJzLmxhc3RJbmRleE9mKG51bGwpOworICAgICAgICAgICAgZmluYWwgUGFyYW1ldGVyIHBhcmFtZXRlciA9IHBhcmFtZXRlcml6ZWQuZ2V0UGFyYW1ldGVycygpLmdldChlbnRpdHlQYXJhbUluZGV4KTsKKyAgICAgICAgICAgIGlmIChQYXJhbWV0ZXIuU291cmNlLlVOS05PV04gPT0gcGFyYW1ldGVyLmdldFNvdXJjZSgpICYmICFwYXJhbWV0ZXIuaXNRdWFsaWZpZWQoKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFBhcmFtZXRlciBvdmVycmlkZGVuUGFyYW1ldGVyID0gUGFyYW1ldGVyLm92ZXJyaWRlU291cmNlKHBhcmFtZXRlciwgUGFyYW1ldGVyLlNvdXJjZS5FTlRJVFkpOworICAgICAgICAgICAgICAgIGZpbmFsIEZ1bmN0aW9uPENvbnRhaW5lclJlcXVlc3QsID8+IHZhbHVlRnVuY3Rpb24gPSBnZXRQYXJhbVZhbHVlUHJvdmlkZXIoCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVBhcmFtUHJvdmlkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcnJpZGRlblBhcmFtZXRlcik7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlRnVuY3Rpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBwcm92aWRlcnMuc2V0KGVudGl0eVBhcmFtSW5kZXgsIHdyYXBQYXJhbVZhbHVlUHJvdmlkZXIodmFsdWVGdW5jdGlvbiwgb3ZlcnJpZGRlblBhcmFtZXRlci5nZXRTb3VyY2UoKSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVycy5zZXQoZW50aXR5UGFyYW1JbmRleCwgbnVsbCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHByb3ZpZGVyczsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyA8VD4gUGFyYW1WYWx1ZUZhY3RvcnlXaXRoU291cmNlPFQ+IHdyYXBQYXJhbVZhbHVlUHJvdmlkZXIoCisgICAgICAgICAgICBGdW5jdGlvbjxDb250YWluZXJSZXF1ZXN0LCBUPiBmYWN0b3J5LCBQYXJhbWV0ZXIuU291cmNlIHBhcmFtU291cmNlKSB7CisgICAgICAgIHJldHVybiBuZXcgUGFyYW1WYWx1ZUZhY3RvcnlXaXRoU291cmNlPD4oZmFjdG9yeSwgcGFyYW1Tb3VyY2UpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEZ1bmN0aW9uPENvbnRhaW5lclJlcXVlc3QsID8+IGdldFBhcmFtVmFsdWVQcm92aWRlcigKKyAgICAgICAgICAgIENvbGxlY3Rpb248VmFsdWVQYXJhbVByb3ZpZGVyPiB2YWx1ZVByb3ZpZGVycywgZmluYWwgUGFyYW1ldGVyIHBhcmFtZXRlcikgeworICAgICAgICBGdW5jdGlvbjxDb250YWluZXJSZXF1ZXN0LCA/PiB2YWx1ZVByb3ZpZGVyID0gbnVsbDsKKyAgICAgICAgSXRlcmF0b3I8VmFsdWVQYXJhbVByb3ZpZGVyPiB2ZnBJdGVyYXRvciA9IHZhbHVlUHJvdmlkZXJzLml0ZXJhdG9yKCk7CisgICAgICAgIHdoaWxlICh2YWx1ZVByb3ZpZGVyID09IG51bGwgJiYgdmZwSXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICB2YWx1ZVByb3ZpZGVyID0gdmZwSXRlcmF0b3IubmV4dCgpLmdldFZhbHVlUHJvdmlkZXIocGFyYW1ldGVyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdmFsdWVQcm92aWRlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmV2ZW50cyBpbnN0YW50aWF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgUGFyYW1ldGVyVmFsdWVIZWxwZXIoKSB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3BpL2ludGVybmFsL1Jlc291cmNlTWV0aG9kRGlzcGF0Y2hlci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3BpL2ludGVybmFsL1Jlc291cmNlTWV0aG9kRGlzcGF0Y2hlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NmFkZjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcGkvaW50ZXJuYWwvUmVzb3VyY2VNZXRob2REaXNwYXRjaGVyLmphdmEKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25IYW5kbGVyOworCitpbXBvcnQgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlcXVlc3Q7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5CaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLmluamVjdC5Db25maWd1cmVkVmFsaWRhdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5wcm9jZXNzLk1hcHBhYmxlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5JbnZvY2FibGU7CisKKy8qKgorICogQSByZXNvdXJjZSBtZXRob2QgZGlzcGF0Y2hlciByZXNwb25zaWJsZSBmb3IgY29uc3VtaW5nIGEgSkFYLVJTIHtAbGluayBSZXF1ZXN0IHJlcXVlc3R9CisgKiBieSBpbnZva2luZyB0aGUgY29uZmlndXJlZCB7QGxpbmsgSW52b2NhYmxlIHJlc291cmNlIG1ldGhvZH0gb24gYSBnaXZlbgorICogcmVzb3VyY2UgaW5zdGFuY2UgYW5kIHJldHVybmluZyB0aGUgbWV0aG9kIGludm9jYXRpb24gcmVzdWx0IGluIGEgZm9ybSBvZiBhCisgKiBKQVgtUlMge0BsaW5rIFJlc3BvbnNlIHJlc3BvbnNlfS4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGludGVyZmFjZSBSZXNvdXJjZU1ldGhvZERpc3BhdGNoZXIgeworCisgICAgLyoqCisgICAgICogUHJvdmlkZXIgaW50ZXJmYWNlIGZvciBjcmVhdGluZyBhIHtAbGluayBSZXNvdXJjZU1ldGhvZERpc3BhdGNoZXIgcmVzb3VyY2UKKyAgICAgKiBtZXRob2QgZGlzcGF0Y2hlcn0gaW5zdGFuY2VzLgorICAgICAqCisgICAgICogQSBwcm92aWRlciBleGFtaW5lcyB0aGUgbW9kZWwgb2YgdGhlIFdlYiByZXNvdXJjZSBtZXRob2QgYW5kCisgICAgICogZGV0ZXJtaW5lcyBpZiBhbiBpbnZva2VyIGNhbiBiZSBjcmVhdGVkIGZvciB0aGF0IFdlYiByZXNvdXJjZSBtZXRob2QuCisgICAgICogPHA+CisgICAgICogTXVsdGlwbGUgcHJvdmlkZXJzIGNhbiBzcGVjaWZ5IHRoZSBzdXBwb3J0IGZvciBkaWZmZXJlbnQgV2ViIHJlc291cmNlIG1ldGhvZAorICAgICAqIHBhdHRlcm5zLCByYW5naW5nIGZyb20gc2ltcGxlIHBhdHRlcm5zIChzdWNoIGFzIHZvaWQgcmV0dXJuIGFuZCBpbnB1dAorICAgICAqIHBhcmFtZXRlcnMpIHRvIGNvbXBsZXggcGF0dGVybnMgdGhhdCB0YWtlIHR5cGUgVVJJIGFuZCBxdWVyeSBhcmd1bWVudHMKKyAgICAgKiBhbmQgSFRUUCByZXF1ZXN0IGhlYWRlcnMgYXMgdHlwZWQgcGFyYW1ldGVycy4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogUmVzb3VyY2UgbWV0aG9kIGRpc3BhdGNoZXIgcHJvdmlkZXIgaW1wbGVtZW50YXRpb25zIGNhbiBiZSByZWdpc3RlcmVkIGluIEplcnNleSBhcHBsaWNhdGlvbgorICAgICAqIGJ5IHN1cHBseWluZyBhIGN1c3RvbSBISzIge0BsaW5rIEJpbmRlcn0gdGhhdCBiaW5kcyB0aGUKKyAgICAgKiBjdXN0b20gc2VydmljZSBpbXBsZW1lbnRhdGlvbihzKSB0byB0aGUge0Bjb2RlIFJlc291cmNlTWV0aG9kRGlzcGF0Y2hlci5Qcm92aWRlcn0gY29udHJhY3QuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQGF1dGhvciBQYXVsIFNhbmRvegorICAgICAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgUHJvdmlkZXIgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgYSB7QGxpbmsgUmVzb3VyY2VNZXRob2REaXNwYXRjaGVyIHJlc291cmNlIG1ldGhvZCBkaXNwYXRjaGVyfSBmb3IKKyAgICAgICAgICogYSBnaXZlbiB7QGxpbmsgSW52b2NhYmxlIGludm9jYWJsZSByZXNvdXJjZSBtZXRob2R9LgorICAgICAgICAgKiA8cC8+CisgICAgICAgICAqIElmIHRoZSBwcm92aWRlciBzdXBwb3J0cyB0aGUgaW52b2NhYmxlIHJlc291cmNlIG1ldGhvZCwgaXQgd2lsbAorICAgICAgICAgKiByZXR1cm4gYSBuZXcgbm9uLW51bGwgZGlzcGF0Y2hlciBpbnN0YW5jZSBjb25maWd1cmVkIHRvIGludm9rZSB0aGUgc3VwcGxpZWQKKyAgICAgICAgICogaW52b2NhYmxlIHJlc291cmNlIG1ldGhvZCB2aWEgdGhlIHByb3ZpZGVkIHtAbGluayBJbnZvY2F0aW9uSGFuZGxlcgorICAgICAgICAgKiBpbnZvY2F0aW9uIGhhbmRsZXJ9IHdoZW5ldmVyIHRoZQorICAgICAgICAgKiB7QGxpbmsgI2Rpc3BhdGNoKE9iamVjdCwgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3QpIGRpc3BhdGNoKC4uLil9CisgICAgICAgICAqIG1ldGhvZCBpcyBjYWxsZWQgb24gdGhhdCBkaXNwYXRjaGVyIGluc3RhbmNlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbWV0aG9kICB0aGUgaW52b2NhYmxlIHJlc291cmNlIG1ldGhvZC4KKyAgICAgICAgICogQHBhcmFtIGhhbmRsZXIgaW52b2NhdGlvbiBoYW5kbGVyIHRvIGJlIHVzZWQgZm9yIHRoZSByZXNvdXJjZSBtZXRob2QgaW52b2NhdGlvbi4KKyAgICAgICAgICogQHBhcmFtIHZhbGlkYXRvciBjb25maWd1cmVkIHZhbGlkYXRvciB0byBiZSB1c2VkIGZvciB2YWxpZGF0aW9uIGR1cmluZyByZXNvdXJjZSBtZXRob2QgaW52b2NhdGlvbgorICAgICAgICAgKiBAcmV0dXJuIHRoZSByZXNvdXJjZSBtZXRob2QgZGlzcGF0Y2hlciwgb3Ige0Bjb2RlIG51bGx9IGlmIGl0IGNvdWxkIG5vdCBiZQorICAgICAgICAgKiAgICAgICAgIGNyZWF0ZWQgZm9yIHRoZSBnaXZlbiByZXNvdXJjZSBtZXRob2QuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgUmVzb3VyY2VNZXRob2REaXNwYXRjaGVyIGNyZWF0ZShmaW5hbCBJbnZvY2FibGUgbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJbnZvY2F0aW9uSGFuZGxlciBoYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb25maWd1cmVkVmFsaWRhdG9yIHZhbGlkYXRvcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVmbGVjdGl2ZWx5IGRpc3BhdGNoIGEgcmVxdWVzdCB0byB0aGUgdW5kZXJseWluZyB7QGxpbmsgSW52b2NhYmxlCisgICAgICogaW52b2NhYmxlIHJlc291cmNlIG1ldGhvZH0gdmlhIHRoZSBjb25maWd1cmVkIHtAbGluayBJbnZvY2F0aW9uSGFuZGxlcgorICAgICAqIGludm9jYXRpb24gaGFuZGxlcn0gdXNpbmcgdGhlIHByb3ZpZGVkIHJlc291cmNlIGNsYXNzIGluc3RhbmNlLgorICAgICAqIDxwIC8+CisgICAgICogSW4gc3VtbWFyeSwgdGhlIG1haW4gam9iIG9mIHRoZSBkaXNwYXRjaGVyIGlzIHRvIGNvbnZlcnQgYSByZXF1ZXN0IGludG8KKyAgICAgKiBhbiBhcnJheSBvZiB0aGUgSmF2YSBtZXRob2QgaW5wdXQgcGFyYW1ldGVycyBhbmQgc3Vic2VxdWVudGx5IGNvbnZlcnQgdGhlCisgICAgICogcmV0dXJuZWQgcmVzcG9uc2Ugb2YgYW4gYXJiaXRyYXJ5IEphdmEgdHlwZSB0byBhIEpBWC1SUyB7QGxpbmsgUmVzcG9uc2UgcmVzcG9uc2V9CisgICAgICogaW5zdGFuY2UuCisgICAgICogPHAgLz4KKyAgICAgKiBXaGVuIHRoZSBtZXRob2QgaXMgaW52b2tlZCwgdGhlIGRpc3BhdGNoZXIgd2lsbCBleHRyYWN0IHRoZQorICAgICAqIHtAbGluayBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgSmF2YSBtZXRob2R9IGluZm9ybWF0aW9uIGZyb20gdGhlIGludm9jYWJsZQorICAgICAqIHJlc291cmNlIG1ldGhvZCBhbmQgdXNlIHRoZSBpbmZvcm1hdGlvbiB0byByZXRyaWV2ZSB0aGUgcmVxdWlyZWQgaW5wdXQKKyAgICAgKiBwYXJhbWV0ZXJzIGZyb20gZWl0aGVyIHRoZSByZXF1ZXN0IGluc3RhbmNlIG9yIGFueSBvdGhlciBhdmFpbGFibGUgcnVuLXRpbWUKKyAgICAgKiBpbmZvcm1hdGlvbi4gT25jZSB0aGUgc2V0IG9mIGlucHV0IHBhcmFtZXRlciB2YWx1ZXMgaXMgY29tcHV0ZWQsIHRoZSB1bmRlcmx5aW5nCisgICAgICogaW52b2NhdGlvbiBoYW5kbGVyIGluc3RhbmNlIGlzIGludm9rZWQgdG8gcHJvY2VzcyAoaW52b2tlKSB0aGUgSmF2YSByZXNvdXJjZQorICAgICAqIG1ldGhvZCB3aXRoIHRoZSBjb21wdXRlZCBpbnB1dCBwYXJhbWV0ZXIgdmFsdWVzLiBUaGUgcmV0dXJuZWQgcmVzcG9uc2UgaXMKKyAgICAgKiBzdWJzZXF1ZW50bHkgY29udmVydGVkIGludG8gYSBKQVgtUlMge0Bjb2RlIFJlc3BvbnNlfSB0eXBlIGFuZCByZXR1cm5lZAorICAgICAqIGZyb20gdGhlIGRpc3BhdGNoZXIuCisgICAgICogPHAgLz4KKyAgICAgKiBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIHN1cHBsaWVkIHJlc291cmNlIGltcGxlbWVudHMgdGhlIGludm9jYWJsZSBtZXRob2QuCisgICAgICogRGlzcGF0Y2hlciBpbXBsZW1lbnRhdGlvbiBzaG91bGQgbm90IG5lZWQgdG8gZG8gYW55IGFkZGl0aW9uYWwgY2hlY2tzIGluCisgICAgICogdGhhdCByZXNwZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlIHRoZSByZXNvdXJjZSBjbGFzcyBpbnN0YW5jZS4KKyAgICAgKiBAcGFyYW0gcmVxdWVzdCAgcmVxdWVzdCB0byBiZSBkaXNwYXRjaGVkLgorICAgICAqIEByZXR1cm4ge0BsaW5rIFJlc3BvbnNlIHJlc3BvbnNlfSBmb3IgdGhlIGRpc3BhdGNoZWQgcmVxdWVzdC4KKyAgICAgKiBAdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24gKHBvc3NpYmx5IHtAbGluayBNYXBwYWJsZUV4Y2VwdGlvbiBtYXBwYWJsZX0pCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciBleGNlcHRpb24gdGhhdCB3aWxsIGJlIGhhbmRsZWQgYnkgdGhlIEplcnNleSBzZXJ2ZXIgY29udGFpbmVyLgorICAgICAqLworICAgIHB1YmxpYyBSZXNwb25zZSBkaXNwYXRjaChmaW5hbCBPYmplY3QgcmVzb3VyY2UsIGZpbmFsIENvbnRhaW5lclJlcXVlc3QgcmVxdWVzdCkgdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcGkvaW50ZXJuYWwvUmVzb3VyY2VNZXRob2RJbnZvY2F0aW9uSGFuZGxlclByb3ZpZGVyLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcGkvaW50ZXJuYWwvUmVzb3VyY2VNZXRob2RJbnZvY2F0aW9uSGFuZGxlclByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBhMWI1OQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwaS9pbnRlcm5hbC9SZXNvdXJjZU1ldGhvZEludm9jYXRpb25IYW5kbGVyUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uSGFuZGxlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5JbnZvY2FibGU7CisKKy8qKgorICogUHJvdmlkZXMgdGhlIHtAbGluayBJbnZvY2F0aW9uSGFuZGxlciBpbnZvY2F0aW9uIGhhbmRsZXJ9IGluc3RhbmNlcyBkZXNpZ25hdGVkCisgKiB0byBoYW5kbGUgaW52b2NhdGlvbnMgb2YgdGhlIHN1cHBsaWVkIHtAbGluayBJbnZvY2FibGUgaW52b2NhYmxlIHJlc291cmNlIG1ldGhvZHN9LgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUmVzb3VyY2VNZXRob2RJbnZvY2F0aW9uSGFuZGxlclByb3ZpZGVyIHsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgaW52b2NhdGlvbiBoYW5kbGVyIGZvciB0aGUgaW52b2NhYmxlIHJlc291cmNlIG1ldGhvZC4gTWF5IHJldHVybgorICAgICAqIHtAY29kZSBudWxsfSBpbiBjYXNlIHRoZSBtZXRob2QgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgcHJvdmlkZXIgZm9yIHdoYXRldmVyCisgICAgICogcmVhc29uLgorICAgICAqCisgICAgICogQHBhcmFtIG1ldGhvZCBpbnZvY2FibGUgcmVzb3VyY2UgbWV0aG9kLgorICAgICAqIEByZXR1cm4gaW52b2NhdGlvbiBoYW5kbGVyIGZvciB0aGUgaW52b2NhYmxlIHJlc291cmNlIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgSW52b2NhdGlvbkhhbmRsZXIgY3JlYXRlKEludm9jYWJsZSBtZXRob2QpOworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3BpL2ludGVybmFsL1ZhbHVlUGFyYW1Qcm92aWRlci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3BpL2ludGVybmFsL1ZhbHVlUGFyYW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2OWU2NzQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcGkvaW50ZXJuYWwvVmFsdWVQYXJhbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN0cmFpbmVkVG87CitpbXBvcnQgamF2YXgud3MucnMuUnVudGltZVR5cGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUGFyYW1ldGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5Db250cmFjdDsKKworLyoqCisgKiBQYXJhbWV0ZXIgdmFsdWUgZmFjdG9yeSBTUEkuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAQ29udHJhY3QKK0BDb25zdHJhaW5lZFRvKFJ1bnRpbWVUeXBlLlNFUlZFUikKK3B1YmxpYyBpbnRlcmZhY2UgVmFsdWVQYXJhbVByb3ZpZGVyIHsKKworICAgIC8qKgorICAgICAqIEdldCBhbiBpbmplY3RlZCB2YWx1ZSBwcm92aWRlciBmb3IgdGhlIHBhcmFtZXRlci4gTWF5IHJldHVybiB7QGNvZGUgbnVsbH0KKyAgICAgKiBpbiBjYXNlIHRoZSBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgdmFsdWUgcHJvdmlkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyYW1ldGVyIHBhcmFtZXRlciByZXF1ZXN0aW5nIHRoZSB2YWx1ZSBwcm92aWRlciBpbnN0YW5jZS4KKyAgICAgKiBAcmV0dXJuIGluamVjdGVkIHBhcmFtZXRlciB2YWx1ZSBwcm92aWRlci4gUmV0dXJucyB7QGNvZGUgbnVsbH0gaWYgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQuCisgICAgICovCisgICAgRnVuY3Rpb248Q29udGFpbmVyUmVxdWVzdCwgPz4gZ2V0VmFsdWVQcm92aWRlcihQYXJhbWV0ZXIgcGFyYW1ldGVyKTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHByaW9yaXR5IG9mIHRoaXMgcHJvdmlkZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBwcmlvcml0eSBvZiB0aGlzIHByb3ZpZGVyLgorICAgICAqIEBzZWUgUHJpb3JpdHlUeXBlCisgICAgICogQHNlZSBQcmlvcml0eQorICAgICAqLworICAgIFByaW9yaXR5VHlwZSBnZXRQcmlvcml0eSgpOworCisgICAgLyoqCisgICAgICogUHJpb3JpdGllcyBhcmUgaW50ZW5kZWQgdG8gYmUgdXNlZCBhcyBhIG1lYW5zIHRvIGRldGVybWluZSB0aGUgb3JkZXIgaW4gd2hpY2ggb2JqZWN0cyBhcmUgY29uc2lkZXJlZCB3aGV0aGVyIHRoZXkgYXJlCisgICAgICogc3VpdGFibGUgZm9yIGEgcGFydGljdWxhciBhY3Rpb24gb3Igbm90IChlLmcuIHByb3ZpZGluZyBhIHNlcnZpY2UgbGlrZSBjcmVhdGluZyBhIHZhbHVlIHN1cHBsaWVyIGZvciBhbiBpbmplY3RhYmxlCisgICAgICogcGFyYW1ldGVyKS4KKyAgICAgKiBUaGUgaGlnaGVyIHRoZSB3ZWlnaHQgb2YgYSBwcmlvcml0eSBpcyB0aGUgc29vbmVyIHNob3VsZCBiZSBhbiBvYmplY3Qgd2l0aCB0aGlzIHByaW9yaXR5IGV4YW1pbmVkLgorICAgICAqIDxwLz4KKyAgICAgKiBJZiB0d28gb2JqZWN0cyBhcmUgb2YgdGhlIHNhbWUgcHJpb3JpdHkgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIHdoaWNoIG9uZSBjb21lcyBmaXJzdC4KKyAgICAgKgorICAgICAqIEBzZWUgVmFsdWVQYXJhbVByb3ZpZGVyLlByaW9yaXR5CisgICAgICovCisgICAgaW50ZXJmYWNlIFByaW9yaXR5VHlwZSB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIHdlaWdodCBvZiB0aGlzIHByaW9yaXR5LgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHdlaWdodCBvZiB0aGlzIHByaW9yaXR5LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGludCBnZXRXZWlnaHQoKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIEVudW1lcmF0aW9uIG9mIHByaW9yaXRpZXMgZm9yIHByb3ZpZGVycyAoZS5nLiB7QGNvZGUgVmFsdWVTdXBwbGllclByb3ZpZGVyfSkuIEF0IGZpcnN0IHByb3ZpZGVycyB3aXRoIHRoZSB7QGNvZGUgSElHSH0KKyAgICAgKiBwcmlvcml0eSBhcmUgZXhhbWluZWQgdGhlbiB0aG9zZSB3aXRoIHtAY29kZSBOT1JNQUx9IHByaW9yaXR5IGFuZCBhdCBsYXN0IHRoZSBvbmVzIHdpdGggdGhlIHtAY29kZSBMT1d9IHByaW9yaXR5LgorICAgICAqLworICAgIGVudW0gUHJpb3JpdHkgaW1wbGVtZW50cyBQcmlvcml0eVR5cGUgeworICAgICAgICAvKioKKyAgICAgICAgICogTG93IHByaW9yaXR5LgorICAgICAgICAgKi8KKyAgICAgICAgTE9XKDEwMCksCisgICAgICAgIC8qKgorICAgICAgICAgKiBOb3JtYWwgcHJpb3JpdHkuCisgICAgICAgICAqLworICAgICAgICBOT1JNQUwoMjAwKSwKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhpZ2ggcHJpb3JpdHkuCisgICAgICAgICAqLworICAgICAgICBISUdIKDMwMCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFdlaWdodCBvZiB0aGlzIHByaW9yaXR5LgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgd2VpZ2h0OworCisgICAgICAgIHByaXZhdGUgUHJpb3JpdHkoaW50IHdlaWdodCkgeworICAgICAgICAgICAgdGhpcy53ZWlnaHQgPSB3ZWlnaHQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBnZXRXZWlnaHQoKSB7CisgICAgICAgICAgICByZXR1cm4gd2VpZ2h0OworICAgICAgICB9CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcGkvaW50ZXJuYWwvcGFja2FnZS1pbmZvLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcGkvaW50ZXJuYWwvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ4Y2M4OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwaS9pbnRlcm5hbC9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvKioKKyAqIEplcnNleSBzZXJ2ZXItc2lkZSBpbnRlcm5hbCBzZXJ2aWNlIHByb3ZpZGVyIGNvbnRyYWN0IChTUEkpIGNsYXNzZXMuCisgKi8KK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5pbnRlcm5hbDsKZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwaS9wYWNrYWdlLWluZm8uamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwaS9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODM1YTc2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3BpL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKKy8qKgorICogSmVyc2V5IHNlcnZlci1zaWRlIHNlcnZpY2UgcHJvdmlkZXIgY29udHJhY3QgKFNQSSkgY2xhc3Nlcy4KKyAqLworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpOwpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9XYWRsQXBwbGljYXRpb25Db250ZXh0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci93YWRsL1dhZGxBcHBsaWNhdGlvbkNvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmMzOTk3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9XYWRsQXBwbGljYXRpb25Db250ZXh0LmphdmEKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGw7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLmludGVybmFsLkFwcGxpY2F0aW9uRGVzY3JpcHRpb247CisKK2ltcG9ydCBjb20uc3VuLnJlc2VhcmNoLndzLndhZGwuQXBwbGljYXRpb247CisKKy8qKgorICogQSBjb250ZXh0IHRvIG9idGFpbiBXQURMLWJhc2VkIGluZm9ybWF0aW9uLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqLworcHVibGljIGludGVyZmFjZSBXYWRsQXBwbGljYXRpb25Db250ZXh0IHsKKy8vICAgIC8qKgorLy8gICAgICogR2V0IGEgV0FETCBidWlsZGVyIGluaXRpYXRlZCB3aXRoIHRoZSBjb25maWd1cmVkIHtAbGluayBXYWRsR2VuZXJhdG9yfQorLy8gICAgICogZm9yIHRoZSBXZWIgYXBwbGljYXRpb24uCisvLyAgICAgKgorLy8gICAgICogQHJldHVybiB0aGUgV0FETCBidWlsZGVyLgorLy8gICAgICovCisvLyAgICBXYWRsQnVpbGRlciBnZXRXYWRsQnVpbGRlcigpOworCisvLyAgICAvKioKKy8vICAgICAqIEdldCBhIG5ldyBpbnN0YW5jZSBvZiBhICB7QGxpbmsgQXBwbGljYXRpb25EZXNjcmlwdGlvbn0gY29ycmVzcG9uZGluZyB0byBhbGwKKy8vICAgICAqIHRoZSByb290IHJlc291cmNlIGNsYXNzZXMuCisvLyAgICAgKgorLy8gICAgICogQHJldHVybiB0aGUgYXBwbGljYXRpb24gZGVzY3JpcHRpb24sIHRoZSBjb250ZW50cyBtYXkgYmUgbW9kaWZpZWQuCisvLyAgICAgKi8KKy8vICAgIEFwcGxpY2F0aW9uRGVzY3JpcHRpb24gZ2V0QXBwbGljYXRpb24oKTsKKworICAgIC8qKgorICAgICAqIEdldCBhIG5ldyBpbnN0YW5jZSBvZiBhIHtAbGluayBBcHBsaWNhdGlvbkRlc2NyaXB0aW9ufSBjb3JyZXNwb25kaW5nIHRvIGFsbAorICAgICAqIHRoZSByb290IHJlc291cmNlIGNsYXNzZXMsIGFuZCBjb25maWd1cmUgdGhlIGJhc2UgVVJJLgorICAgICAqCisgICAgICogQHBhcmFtIHVpIHRoZSBVUkkgaW5mb3JtYXRpb24gZnJvbSB3aGljaCB0aGUgYmFzZSBVUkkgaXMgc2V0IG9uIHRoZQorICAgICAqICAgICAgICAgICBXQURMIGFwcGxpY2F0aW9uLgorICAgICAqIEBwYXJhbSBkZXRhaWxlZFdhZGwgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgb3Igbm90IGRldGFpbGVkIFdBREwgc2hvdWxkIGJlIGdlbmVyYXRlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBhcHBsaWNhdGlvbiBkZXNjcmlwdGlvbiwgdGhlIGNvbnRlbnRzIG1heSBiZSBtb2RpZmllZC4KKyAgICAgKi8KKyAgICBBcHBsaWNhdGlvbkRlc2NyaXB0aW9uIGdldEFwcGxpY2F0aW9uKFVyaUluZm8gdWksIGJvb2xlYW4gZGV0YWlsZWRXYWRsKTsKKworCisgICAgLyoqCisgICAgICogR2V0IGEgbmV3IGluc3RhbmNlIG9mIHtAbGluayBBcHBsaWNhdGlvbn0gZm9yIGEgcGFydGljdWxhciByZXNvdXJjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmZvICAgICB0aGUgVVJJIGluZm9ybWF0aW9uIGZyb20gd2hpY2ggdGhlIGJhc2UgVVJJIGlzIHNldCBvbiB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgV0FETCBhcHBsaWNhdGlvbi4KKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgdGhlIHJlc291cmNlIHRvIGJ1aWxkIHRoZSBBcHBsaWNhdGlvbiBmb3IKKyAgICAgKiBAcGFyYW0gZGV0YWlsZWRXYWRsIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCBkZXRhaWxlZCBXQURMIHNob3VsZCBiZSBnZW5lcmF0ZWQuCisgICAgICogQHJldHVybiB0aGUgYXBwbGljYXRpb24gZm9yIHRoaXMgcmVzb3VyY2UKKyAgICAgKi8KKyAgICBBcHBsaWNhdGlvbiBnZXRBcHBsaWNhdGlvbihVcmlJbmZvIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlIHJlc291cmNlLCBib29sZWFuIGRldGFpbGVkV2FkbCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGRlZmF1bHQgSkFYQiBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGUge0BsaW5rIFdhZGxHZW5lcmF0b3J9CisgICAgICogZm9yIHRoZSBXZWIgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IEpBWEIgY29udGV4dC4KKyAgICAgKi8KKyAgICBKQVhCQ29udGV4dCBnZXRKQVhCQ29udGV4dCgpOworCisvLyAgICAvKioKKy8vICAgICAqIEdldCB0aGUgZGVmYXVsdCBKQVhCIGNvbnRleHQgcGF0aCB0byBjcmVhdGUgYSB7QGxpbmsgSkFYQkNvbnRleHR9LgorLy8gICAgICoKKy8vICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgSkFYQiBjb250ZXh0LgorLy8gICAgICovCisvLyAgICBTdHJpbmcgZ2V0SkFYQkNvbnRleHRQYXRoKCk7CisKKyAgICAvKioKKyAgICAgKiBFbmFibGUvZGlzYWJsZSBXQURMIGdlbmVyYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gd2FkbEdlbmVyYXRpb25FbmFibGVkIGlmIHdhZGxHZW5lcmF0aW9uRW5hYmxlZCBpcyB0cnVlIGFuZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzI1dBRExfRkVBVFVSRV9ESVNBQkxFfQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgZmFsc2UsIFdBREwgZ2VuZXJhdGlvbiBpcyBlbmFibGVkLiBJbiBhbGwgb3RoZXIgY2FzZXMgaXMgZGlzYWJsZWQuCisgICAgICovCisgICAgdm9pZCBzZXRXYWRsR2VuZXJhdGlvbkVuYWJsZWQoYm9vbGVhbiB3YWRsR2VuZXJhdGlvbkVuYWJsZWQpOworCisgICAgLyoqCisgICAgICogR2V0IFdBREwgZ2VuZXJhdGlvbiBzdGF0dXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgd2hlbiBXQURMIGdlbmVyYXRpb24gaXMgZW5hYmxlZC4gRG9lcyBub3QgdGFrZQorICAgICAqICAgICAgICAge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzI1dBRExfRkVBVFVSRV9ESVNBQkxFfQorICAgICAqLworICAgIGJvb2xlYW4gaXNXYWRsR2VuZXJhdGlvbkVuYWJsZWQoKTsKK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvV2FkbEZlYXR1cmUuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvV2FkbEZlYXR1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWIwM2ZlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9XYWRsRmVhdHVyZS5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGw7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlQ29udGV4dDsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQWJzdHJhY3RCaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5Qcm9wZXJ0aWVzSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5Nb2RlbFByb2Nlc3NvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5pbnRlcm5hbC5XYWRsQXBwbGljYXRpb25Db250ZXh0SW1wbDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5wcm9jZXNzb3IuV2FkbE1vZGVsUHJvY2Vzc29yOworCisKKy8qKgorICogRmVhdHVyZSBlbmFibGluZyBXQURMIHByb2Nlc3NpbmcuIFRoZSBmZWF0dXJlIHJlZ2lzdGVycyBwcm92aWRlcnMgYW5kIGJpbmRlcnMgbmVlZGVkIHRvIGVuYWJsZSB3YWRsIGluIHRoZQorICogamVyc2V5IGFwcGxpY2F0aW9uLiBPbmUgb2YgdGhlIHByb3ZpZGVycyBpcyB7QGxpbmsgTW9kZWxQcm9jZXNzb3Igd2FkbCBtb2RlbCBwcm9jZXNzb3J9IHdoaWNoIGVuaGFuY2VzCisgKiBjdXJyZW50IHJlc291cmNlcyBieSBhZGRpdGlvbmFsIHdhZGwgcmVzb3VyY2VzIGxpa2Uge0Bjb2RlIC9hcHBsaWNhdGlvbi53YWRsfSBhbmQgd2FkbCBvcHRpb25zIG1ldGhvZC4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBXYWRsRmVhdHVyZSBpbXBsZW1lbnRzIEZlYXR1cmUgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlKEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBkaXNhYmxlZCA9IFByb3BlcnRpZXNIZWxwZXIuaXNQcm9wZXJ0eShjb250ZXh0LmdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzCisgICAgICAgICAgICAgICAgLldBRExfRkVBVFVSRV9ESVNBQkxFKSk7CisgICAgICAgIGlmIChkaXNhYmxlZCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgY29udGV4dC5yZWdpc3RlcihXYWRsTW9kZWxQcm9jZXNzb3IuY2xhc3MpOworICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKG5ldyBBYnN0cmFjdEJpbmRlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICAgICAgICAgIGJpbmQoV2FkbEFwcGxpY2F0aW9uQ29udGV4dEltcGwuY2xhc3MpLnRvKFdhZGxBcHBsaWNhdGlvbkNvbnRleHQuY2xhc3MpLmluKFNpbmdsZXRvbi5jbGFzcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvV2FkbEdlbmVyYXRvci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9XYWRsR2VuZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNmZTUzMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvV2FkbEdlbmVyYXRvci5qYXZhCkBAIC0wLDAgKzEsMTgwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUmVnaXN0cnk7CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5QYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuaW50ZXJuYWwuQXBwbGljYXRpb25EZXNjcmlwdGlvbjsKKworaW1wb3J0IGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5BcHBsaWNhdGlvbjsKK2ltcG9ydCBjb20uc3VuLnJlc2VhcmNoLndzLndhZGwuUGFyYW07CitpbXBvcnQgY29tLnN1bi5yZXNlYXJjaC53cy53YWRsLlJlcHJlc2VudGF0aW9uOworaW1wb3J0IGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5SZXF1ZXN0OworaW1wb3J0IGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5SZXNvdXJjZTsKK2ltcG9ydCBjb20uc3VuLnJlc2VhcmNoLndzLndhZGwuUmVzb3VyY2VzOworaW1wb3J0IGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5SZXNwb25zZTsKKworLyoqCisgKiBBIFdhZGxHZW5lcmF0b3IgY3JlYXRlcyBhcnRpZmFjdHMgcmVsYXRlZCB0byB3YWRsLiBUaGlzIGlzIGRlc2lnbmVkIGFzIGFuIGludGVyZmFjZSwKKyAqIHNvIHRoYXQgc2V2ZXJhbCBpbXBsZW1lbnRhdGlvbnMgY2FuIGRlY29yYXRlIGV4aXN0aW5nIG9uZXMuIE9uZSBkZWNvcmF0b3IgY291bGQgZS5nLiBhZGQKKyAqIHJlZmVyZW5jZXMgdG8gZGVmaW5pdGlvbnMgd2l0aGluIHNvbWUgeHNkIGZvciBleGlzdGluZyByZXByZXNlbnRhdGlvbnMuPGJyPgorICogQ3JlYXRlZCBvbjogSnVuIDE2LCAyMDA4PGJyPgorICoKKyAqIEBhdXRob3IgTWFydGluIEdyb3R6a2UgKG1hcnRpbi5ncm90emtlIGF0IGZyZWloZWl0LmNvbSkKKyAqLworcHVibGljIGludGVyZmFjZSBXYWRsR2VuZXJhdG9yIHsKKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGRlbGVnYXRlIHRoYXQgaXMgZGVjb3JhdGVkIGJ5IHRoaXMgd2FkbCBnZW5lcmF0b3IuIElzIGludm9rZWQgZGlyZWN0bHkgYWZ0ZXIKKyAgICAgKiB0aGlzIGdlbmVyYXRvciBpcyBpbnN0YW50aWF0ZWQgYmVmb3JlIHtAbGluayAjaW5pdCgpfSBvciBhbnkgc2V0dGVyIG1ldGhvZCBpcyBpbnZva2VkLgorICAgICAqIEBwYXJhbSBkZWxlZ2F0ZSB0aGUgd2FkbCBnZW5lcmF0b3IgdG8gZGVjb3JhdGUKKyAgICAgKi8KKyAgICB2b2lkIHNldFdhZGxHZW5lcmF0b3JEZWxlZ2F0ZShXYWRsR2VuZXJhdG9yIGRlbGVnYXRlKTsKKworICAgIC8qKgorICAgICAqIEludm9rZWQgYmVmb3JlIGFsbCBtZXRob2RzIHJlbGF0ZWQgdG8gd2FkbC1idWlsZGluZyBhcmUgaW52b2tlZC4gVGhpcyBtZXRob2QgaXMgdXNlZCBpbiBhCisgICAgICogZGVjb3JhdG9yIGxpa2UgbWFubmVyLCBhbmQgdGhlcmVmb3JlIGhhcyB0byBpbnZva2Uge0Bjb2RlIHRoaXMuZGVsZWdhdGUuaW5pdCgpfS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCisgICAgICogQHRocm93cyBKQVhCRXhjZXB0aW9uCisgICAgICovCisgICAgdm9pZCBpbml0KCkgdGhyb3dzIEV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFRoZSBqYXhiIGNvbnRleHQgcGF0aCB0aGF0IGlzIHVzZWQgd2hlbiB0aGUgZ2VuZXJhdGVkIHdhZGwgYXBwbGljYXRpb24gaXMgbWFyc2hhbGxlZAorICAgICAqIHRvIGEgZmlsZS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgaW4gYSBkZWNvcmF0b3IgbGlrZSBtYW5uZXIuCisgICAgICogVGhlIHJlc3VsdCByZXR1cm4gdGhlIHBhdGggKG9yIGEgY29sb24tc2VwYXJhdGVkIGxpc3Qgb2YgcGFja2FnZSBuYW1lcykgY29udGFpbmluZworICAgICAqIGpheGItYmVhbnMgdGhhdCBhcmUgYWRkZWQgdG8gd2FkbCBlbGVtZW50cyBieSB0aGlzIFdhZGxHZW5lcmF0b3IsIGFkZGl0aW9uYWxseSB0bworICAgICAqIHRoZSBjb250ZXh0IHBhdGggb2YgdGhlIGRlY29yYXRlZCBXYWRsR2VuZXJhdG9yIChzZXQgYnkge0BsaW5rICNzZXRXYWRsR2VuZXJhdG9yRGVsZWdhdGUoV2FkbEdlbmVyYXRvcil9Ljxici8+CisgICAgICogSWYgeW91IGRvIG5vdCB1c2UgY3VzdG9tIGpheGIgYmVhbnMsIHRoZW4gc2ltcGx5IHJldHVybiB7QGNvZGUgX2RlbGVnYXRlLmdldFJlcXVpcmVkSmF4YkNvbnRleHRQYXRoKCl9LAorICAgICAqIG90aGVyd2lzZSByZXR1cm4gdGhlIGRlbGVnYXRlJ3MgI2dldFJlcXVpcmVkSmF4YkNvbnRleHRQYXRoKCkgdG9nZXRoZXIgd2l0aAorICAgICAqIHlvdXIgcmVxdWlyZWQgY29udGV4dCBwYXRoIChzZXBhcmF0ZWQgYnkgYSBjb2xvbik6PGJyLz4KKyAgICAgKiA8cHJlPl9kZWxlZ2F0ZS5nZXRSZXF1aXJlZEpheGJDb250ZXh0UGF0aCgpID09IG51bGwKKyAgICAgPyAke3lvdXJDb250ZXh0UGF0aH0KKyAgICAgOiBfZGVsZWdhdGUuZ2V0UmVxdWlyZWRKYXhiQ29udGV4dFBhdGgoKSArICI6IiArICR7eW91ckNvbnRleHRQYXRofTs8L3ByZT4KKyAgICAgKgorICAgICAqIElmIHlvdSBhZGQgdGhlIHBhdGggZm9yIHlvdXIgY3VzdG9tIGpheGIgYmVhbnMsIGRvbid0IGZvcmdldCB0byBhZGQgYW4KKyAgICAgKiBPYmplY3RGYWN0b3J5IChhbm5vdGF0ZWQgd2l0aCB7QGxpbmsgWG1sUmVnaXN0cnl9KSB0byB0aGlzIHBhY2thZ2UuCisgICAgICogQHJldHVybiBzaW1wbHkgdGhlIHtAY29kZSBnZXRSZXF1aXJlZEpheGJDb250ZXh0UGF0aCgpfSBvZiB0aGUgZGVsZWdhdGUgb3IgdGhlCisgICAgICoge0Bjb2RlIGdldFJlcXVpcmVkSmF4YkNvbnRleHRQYXRoKCkgKyAiOiIgKyAke3lvdXJDb250ZXh0UGF0aH19LgorICAgICAqLworICAgIFN0cmluZyBnZXRSZXF1aXJlZEpheGJDb250ZXh0UGF0aCgpOworCisgICAgLy8gPT09PT09PT09PT09PT09PSAgbWV0aG9kcyBmb3IgYnVpbGRpbmcgdGhlIHdhZGwgYXBwbGljYXRpb24gPT09PT09PT09PT09PQorCisgICAgQXBwbGljYXRpb24gY3JlYXRlQXBwbGljYXRpb24oKTsKKworICAgIFJlc291cmNlcyBjcmVhdGVSZXNvdXJjZXMoKTsKKworICAgIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZSByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCk7CisKKyAgICBjb20uc3VuLnJlc2VhcmNoLndzLndhZGwuTWV0aG9kIGNyZWF0ZU1ldGhvZChvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2UgciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTWV0aG9kIG0pOworCisgICAgUmVxdWVzdCBjcmVhdGVSZXF1ZXN0KG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZSByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTWV0aG9kIG0pOworCisgICAgUmVwcmVzZW50YXRpb24gY3JlYXRlUmVxdWVzdFJlcHJlc2VudGF0aW9uKG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZSByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTWV0aG9kIG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlKTsKKworICAgIExpc3Q8UmVzcG9uc2U+IGNyZWF0ZVJlc3BvbnNlcyhvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2UgciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1ldGhvZCBtKTsKKworICAgIFBhcmFtIGNyZWF0ZVBhcmFtKG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZSByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNZXRob2QgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyIHApOworCisgICAgLy8gPT09PT09PT09PT09PT09PSBtZXRob2RzIGZvciBwb3N0IGJ1aWxkIGFjdGlvbnMgPT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIC8qKgorICAgICAqIENhbGwgYmFjayBpbnRlcmZhY2UgdGhhdCB0aGUgY3JlYXRlZCBleHRlcm5hbCBncmFtbWFyIGNhbiB1c2UKKyAgICAgKiB0byBhbGxvdyBvdGhlciBwYXJ0cyBvZiB0aGUgY29kZSB0byBhdHRhY2ggdGhlIGNvcnJlY3QgZ3JhbW1hciBpbmZvcm1hdGlvbi4KKyAgICAgKi8KKyAgICBpbnRlcmZhY2UgUmVzb2x2ZXIgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXNvbHZlIGEgQ2xhc3MgdHlwZSB0byBhIFFOYW1lLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiB0aGUgY2xhc3MuCisgICAgICAgICAqIEByZXR1cm4gVGhlIHNjaGVtYSB0eXBlIG9mIHRoZSBjbGFzcyBpZiBkZWZpbmVkLCBudWxsIGlmIG5vdC4KKyAgICAgICAgICovCisgICAgICAgIFFOYW1lIHJlc29sdmUoQ2xhc3MgdHlwZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQW5kIGludGVybmFsIHN0b3JhZ2Ugb2JqZWN0IHRvIHN0b3JlIHRoZSBncmFtbWFyIGRlZmluaXRpb25zIGFuZAorICAgICAqIGFueSB0eXBlIHJlc29sdmVycyB0aGF0IGFyZSBjcmVhdGVkIGFsb25nIHRoZSB3YXkuCisgICAgICovCisgICAgY2xhc3MgRXh0ZXJuYWxHcmFtbWFyRGVmaW5pdGlvbiB7CisKKyAgICAgICAgLy8gZmluYWwgcHVibGljIGZpZWxkIHRvIG1ha2UgYSBwcm9wZXJ0eSB3YXMgdGhpbmtpbmcgYWJvdXQgZW5jYXBzdWxhdGlvbgorICAgICAgICAvLyBidXQgZGVjaWRlZCBjb2RlIG11Y2ggc2ltcGxlciB3aXRob3V0CisgICAgICAgIHB1YmxpYyBmaW5hbCBNYXA8U3RyaW5nLCBBcHBsaWNhdGlvbkRlc2NyaXB0aW9uLkV4dGVybmFsR3JhbW1hcj4KKyAgICAgICAgICAgICAgICBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEFwcGxpY2F0aW9uRGVzY3JpcHRpb24uRXh0ZXJuYWxHcmFtbWFyPigpOworCisgICAgICAgIHByaXZhdGUgTGlzdDxSZXNvbHZlcj4gdHlwZVJlc29sdmVycyA9IG5ldyBBcnJheUxpc3Q8UmVzb2x2ZXI+KCk7CisKKyAgICAgICAgcHVibGljIHZvaWQgYWRkUmVzb2x2ZXIoUmVzb2x2ZXIgcmVzb2x2ZXIpIHsKKyAgICAgICAgICAgIGFzc2VydCAhdHlwZVJlc29sdmVycy5jb250YWlucyhyZXNvbHZlcikgOiAiQWxyZWFkeSBpbiBsaXN0IjsKKyAgICAgICAgICAgIHR5cGVSZXNvbHZlcnMuYWRkKHJlc29sdmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcGFyYW0gdHlwZSB0aGUgY2xhc3MgdG8gbWFwCisgICAgICAgICAqIEByZXR1cm4gVGhlIHJlc29sdmVkIHF1YWxpZmllZCBuYW1lIGlmIG9uZSBpcyBkZWZpbmVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFFOYW1lIHJlc29sdmUoQ2xhc3MgdHlwZSkgeworICAgICAgICAgICAgUU5hbWUgbmFtZSA9IG51bGw7CisgICAgICAgICAgICBmb3VuZDoKKyAgICAgICAgICAgIGZvciAoUmVzb2x2ZXIgcmVzb2x2ZXIgOiB0eXBlUmVzb2x2ZXJzKSB7CisgICAgICAgICAgICAgICAgbmFtZSA9IHJlc29sdmVyLnJlc29sdmUodHlwZSk7CisgICAgICAgICAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBicmVhayBmb3VuZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm0gYW55IHBvc3QgY3JlYXRlIGZ1bmN0aW9ucyBzdWNoIGFzIGdlbmVyYXRpbmcgZ3JhbW1hcnMuCisgICAgICogQHJldHVybiBBIG1hcCBvZiBleHRyYSBmaWxlcyB0byB0aGUgY29udGVudCBvZiB0aG9zZSBmaWxlIGVuY29kZWQgaW4gVVRGLTgKKyAgICAgKi8KKyAgICBFeHRlcm5hbEdyYW1tYXJEZWZpbml0aW9uIGNyZWF0ZUV4dGVybmFsR3JhbW1hcigpOworCisgICAgLyoqCisgICAgICogUHJvY2VzcyB0aGUgZWxlbWVudHMgaW4gdGhlIFdBREwgZGVmaW5pdGlvbiB0byBhdHRhY2ggc2NoZW1hIHR5cGVzCisgICAgICogYXMgcmVxdWlyZWQuCisgICAgICogQHBhcmFtIGRlc2NyaXB0aW9uIFRoZSByb290IGRlc2NyaXB0aW9uIHVzZWQgdG8gcmVzb2x2ZSB0aGVzZSBlbnRyaWVzCisgICAgICovCisgICAgdm9pZCBhdHRhY2hUeXBlcyhBcHBsaWNhdGlvbkRlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKTsKKworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9jb25maWcvV2FkbEdlbmVyYXRvckNvbmZpZy5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9jb25maWcvV2FkbEdlbmVyYXRvckNvbmZpZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YjQ5NDMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci93YWRsL2NvbmZpZy9XYWRsR2VuZXJhdG9yQ29uZmlnLmphdmEKQEAgLTAsMCArMSwzMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuY29uZmlnOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuV2FkbEdlbmVyYXRvcjsKKworLyoqCisgKiBQcm92aWRlcyBhIGNvbmZpZ3VyZWQge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLldhZGxHZW5lcmF0b3J9IHdpdGggYWxsIGRlY29yYXRpb25zICh0aGUgZGVmYXVsdAorICogd2FkbCBnZW5lcmF0b3IgZGVjb3JhdGVkIGJ5IG90aGVyIGdlbmVyYXRvcnMpLgorICogPGgzPkNyZWF0aW5nIGEgV2FkbEdlbmVyYXRvckNvbmZpZzwvc3Ryb25nPjxoMy8+CisgKiA8cD4KKyAqIElmIHlvdSB3YW50IHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBhdCBydW50aW1lIHlvdSBjYW4gY29uZmlndXJlIHRoZQorICogV2FkbEdlbmVyYXRvciBjbGFzcyBhbmQgcHJvcGVydHkgbmFtZXMvdmFsdWVzLiBBIG5ldyBpbnN0YW5jZSBvZiB0aGUKKyAqIEdlbmVyYXRvciBpcyBjcmVhdGVkIGZvciBlYWNoIGdlbmVyYXRpb24gYWN0aW9uLgorICoKKyAqIFRoZSBmaXJzdCBvcHRpb24gd291bGQgbG9vayBsaWtlIHRoaXM6CisgKiA8cHJlPgorICogIFdhZGxHZW5lcmF0b3JDb25maWcgY29uZmlnID0gV2FkbEdlbmVyYXRvckNvbmZpZworICogICAgIC5nZW5lcmF0b3IoIE15V2FkbEdlbmVyYXRvci5jbGFzcyApCisgKiAgICAgLnByb3AoICJzb21lUHJvcGVydHkiLCAic29tZVZhbHVlIiApCisgKiAgICAgLmdlbmVyYXRvciggTXlXYWRsR2VuZXJhdG9yMi5jbGFzcyApCisgKiAgICAgLnByb3AoICJzb21lUHJvcGVydHkiLCAic29tZVZhbHVlIiApCisgKiAgICAgLnByb3AoICJhbm90aGVyUHJvcGVydHkiLCAiYW5vdGhlclZhbHVlIiApCisgKiAgICAgLmJ1aWxkKCk7CisgKiA8L3ByZT4KKyAqIDwvcD4KKyAqIDxwPgorICogSWYgeW91IHdhbnQgdG8gc3BlY2lmeSB0aGUge0BsaW5rIFdhZGxHZW5lcmF0b3JDb25maWd9IGluIHRoZSB3ZWIueG1sIHlvdSBoYXZlCisgKiB0byBzdWJjbGFzcyBpdCBhbmQgc2V0IHRoZSBzZXJ2bGV0IGluaXQtcGFyYW0ge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzI1dBRExfR0VORVJBVE9SX0NPTkZJR30KKyAqIHRvIHRoZSBuYW1lIG9mIHlvdXIgc3ViY2xhc3MuIFRoaXMgY2xhc3MgbWlnaHQgbG9vayBsaWtlIHRoaXM6CisgKiA8cHJlPgorICogIGNsYXNzIE15V2FkbEdlbmVyYXRvckNvbmZpZyBleHRlbmRzIFdhZGxHZW5lcmF0b3JDb25maWcgeworICoKKyAqICAgICAgcHVibGljIExpc3QmbHQ7V2FkbEdlbmVyYXRvckRlc2NyaXB0aW9uJmd0OyBjb25maWd1cmUoKSB7CisgKiAgICAgICAgICByZXR1cm4gZ2VuZXJhdG9yKCBNeVdhZGxHZW5lcmF0b3IuY2xhc3MgKQorICogICAgICAgICAgICAgICAgICAgICAucHJvcCggImZvbyIsIHByb3BWYWx1ZSApCisgKiAgICAgICAgICAgICAgICAgICAgIC5nZW5lcmF0b3IoIE15V2FkbEdlbmVyYXRvcjIuY2xhc3MgKQorICogICAgICAgICAgICAgICAgICAgICAucHJvcCggImJhciIsIHByb3BWYWx1ZTIgKQorICogICAgICAgICAgICAgICAgICAgICAuZGVzY3JpcHRpb25zKCk7CisgKiAgICAgIH0KKyAqCisgKiB9CisgKiA8L3ByZT4KKyAqIDwvcD4KKyAqCisgKiA8aDM+Q29uZmlndXJpbmcgdGhlIFdhZGxHZW5lcmF0b3I8aDMvPgorICogPHA+CisgKiBUaGUge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLldhZGxHZW5lcmF0b3J9IHByb3BlcnRpZXMgd2lsbCBiZSBwb3B1bGF0ZWQgd2l0aCB0aGUgcHJvdmlkZWQgcHJvcGVydGllcyBsaWtlIHRoaXM6CisgKiA8dWw+CisgKiA8bGk+VGhlIHR5cGVzIG1hdGNoIGV4YWN0bHk6PGJyLz4KKyAqIGlmIHRoZSBXYWRsR2VuZXJhdG9yIHByb3BlcnR5IGlzIG9mIHR5cGUge0Bjb2RlIG9yZy5leGFtcGxlLkZvb30gYW5kIHRoZQorICogcHJvdmlkZWQgcHJvcGVydHkgdmFsdWUgaXMgb2YgdHlwZSB7QGNvZGUgb3JnLmV4YW1wbGUuRm9vfTwvbGk+CisgKiA8bGk+VHlwZXMgdGhhdCBwcm92aWRlIGEgY29uc3RydWN0b3IgZm9yIHRoZSBwcm92aWRlZCB0eXBlIChtb3N0bHkgamF2YS5sYW5nLlN0cmluZyk8L2xpPgorICogPGxpPmphdmEuaW8uSW5wdXRTdHJlYW06IFRoZSB7QGxpbmsgSW5wdXRTdHJlYW19IGNhbiBlLmcuIHJlcHJlc2VudCBhIGZpbGUuIFRoZSBzdHJlYW0gaXMgbG9hZGVkIGZyb20gdGhlCisgKiBwcm9wZXJ0eSB2YWx1ZSAocHJvdmlkZWQgYnkgdGhlIHtAbGluayBXYWRsR2VuZXJhdG9yRGVzY3JpcHRpb259KSB2aWEKKyAqIHtAbGluayBDbGFzc0xvYWRlciNnZXRSZXNvdXJjZUFzU3RyZWFtKFN0cmluZyl9LiBJdCB3aWxsIGJlIGNsb3NlZCBhZnRlciB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuV2FkbEdlbmVyYXRvciNpbml0KCl9IHdhcyBjYWxsZWQuCisgKiA8L2xpPgorICoKKyAqIDxsaT48c3Ryb25nPkRlcHJlY2F0ZWQsIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnM6PC9zdHJvbmc+PGJyLz4KKyAqIFRoZSBXYWRsR2VuZXJhdG9yIHByb3BlcnR5IGlzIG9mIHR5cGUge0BsaW5rIEZpbGV9IGFuZCB0aGUgcHJvdmlkZWQgcHJvcGVydHkgdmFsdWUgaXMgYSB7QGxpbmsgU3RyaW5nfTo8YnIvPgorICogdGhlIHByb3ZpZGVkIHByb3BlcnR5IHZhbHVlIGNhbiBjb250YWluIHRoZSBwcmVmaXggPGVtPmNsYXNzcGF0aDo8L2VtPiB0byBkZW5vdGUsIHRoYXQgdGhlCisgKiBwYXRoIHRvIHRoZSBmaWxlIGlzIHJlbGF0aXZlIHRvIHRoZSBjbGFzc3BhdGguIEluIHRoaXMgY2FzZSwgdGhlIHByb3BlcnR5IHZhbHVlIGlzIHN0cmlwcGVkIGJ5CisgKiB0aGUgcHJlZml4IDxlbT5jbGFzc3BhdGg6PC9lbT4gYW5kIHRoZSB7QGxpbmsgRmlsZX0gaXMgY3JlYXRlZCB2aWEKKyAqIDxwcmU+CisgKiAgbmV3IEZpbGUoIGdlbmVyYXRvci5nZXRDbGFzcygpLmdldFJlc291cmNlKCBzdHJpcHBlZEZpbGVuYW1lICkudG9VUkkoKSApCisgKiA8L3ByZT4KKyAqIE5vdGljZSB0aGF0IHRoZSBmaWxlbmFtZSBpcyBsb2FkZWQgZnJvbSB0aGUgY2xhc3NwYXRoIGluIHRoaXMgY2FzZSwgZS5nLiA8ZW0+Y2xhc3NwYXRoOnRlc3QueG1sPC9lbT4KKyAqIHJlZmVycyB0byBhIGZpbGUgaW4gdGhlIHBhY2thZ2Ugb2YgdGhlIGNsYXNzICh7QGxpbmsgV2FkbEdlbmVyYXRvckRlc2NyaXB0aW9uI2dldEdlbmVyYXRvckNsYXNzKCl9KS4gVGhlCisgKiBmaWxlIHJlZmVyZW5jZSA8ZW0+Y2xhc3NwYXRoOi90ZXN0LnhtbDwvZW0+IHJlZmVycyB0byBhIGZpbGUgdGhhdCBpcyBpbiB0aGUgcm9vdCBvZiB0aGUgY2xhc3NwYXRoLgorICogPC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKiA8aDM+RXhpc3Rpbmcge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLldhZGxHZW5lcmF0b3J9IGltcGxlbWVudGF0aW9uczo8L2gzPgorICogPHA+CisgKiA8dWw+CisgKiA8bGk+e0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLmludGVybmFsLmdlbmVyYXRvcnMuV2FkbEdlbmVyYXRvckFwcGxpY2F0aW9uRG9jfTwvbGk+CisgKiA8bGk+e0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLmludGVybmFsLmdlbmVyYXRvcnMuV2FkbEdlbmVyYXRvckdyYW1tYXJzU3VwcG9ydH08L2xpPgorICogPGxpPntAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5pbnRlcm5hbC5nZW5lcmF0b3JzLldhZGxHZW5lcmF0b3JKQVhCR3JhbW1hckdlbmVyYXRvcn08L2xpPgorICogPGxpPntAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5pbnRlcm5hbC5nZW5lcmF0b3JzLnJlc291cmNlZG9jLldhZGxHZW5lcmF0b3JSZXNvdXJjZURvY1N1cHBvcnR9PC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKiA8cD4KKyAqIEEgY29tbW9uIGV4YW1wbGUgZm9yIGEge0BsaW5rIFdhZGxHZW5lcmF0b3JDb25maWd9IHdvdWxkIGJlIHRoaXM6CisgKiA8cHJlPgorICogIGNsYXNzIE15V2FkbEdlbmVyYXRvckNvbmZpZyBleHRlbmRzIFdhZGxHZW5lcmF0b3JDb25maWcgeworICoKKyAqICAgICAgcHVibGljIExpc3QmbHQ7V2FkbEdlbmVyYXRvckRlc2NyaXB0aW9uJmd0OyBjb25maWd1cmUoKSB7CisgKiAgICAgICAgICByZXR1cm4gZ2VuZXJhdG9yKCBXYWRsR2VuZXJhdG9yQXBwbGljYXRpb25Eb2MuY2xhc3MgKQorICogICAgICAgICAgICAgIC5wcm9wKCAiYXBwbGljYXRpb25Eb2NzU3RyZWFtIiwgImFwcGxpY2F0aW9uLWRvYy54bWwiICkKKyAqICAgICAgICAgICAgICAuZ2VuZXJhdG9yKCBXYWRsR2VuZXJhdG9yR3JhbW1hcnNTdXBwb3J0LmNsYXNzICkKKyAqICAgICAgICAgICAgICAucHJvcCggImdyYW1tYXJzU3RyZWFtIiwgImFwcGxpY2F0aW9uLWdyYW1tYXJzLnhtbCIgKQorICogICAgICAgICAgICAgIC5nZW5lcmF0b3IoIFdhZGxHZW5lcmF0b3JSZXNvdXJjZURvY1N1cHBvcnQuY2xhc3MgKQorICogICAgICAgICAgICAgIC5wcm9wKCAicmVzb3VyY2VEb2NTdHJlYW0iLCAicmVzb3VyY2Vkb2MueG1sIiApCisgKiAgICAgICAgICAgICAgLmRlc2NyaXB0aW9ucygpOworICogICAgICAgICAgICAgIC5kZXNjcmlwdGlvbnMoKTsKKyAqICAgICAgfQorICoKKyAqICB9CisgKiA8L3ByZT4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIE1hcnRpbiBHcm90emtlIChtYXJ0aW4uZ3JvdHprZSBhdCBmcmVpaGVpdC5jb20pCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBXYWRsR2VuZXJhdG9yQ29uZmlnIHsKKworICAgIHB1YmxpYyBXYWRsR2VuZXJhdG9yQ29uZmlnKCkgeworICAgIH0KKworICAgIHB1YmxpYyBhYnN0cmFjdCBMaXN0IGNvbmZpZ3VyZSgpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5XYWRsR2VuZXJhdG9yfSwgYmFzZWQgb24gdGhlIHtAbGluayBXYWRsR2VuZXJhdG9yRGVzY3JpcHRpb259cworICAgICAqIHByb3ZpZGVkIGJ5IHtAbGluayAjY29uZmlndXJlKCl9LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgaW5pdGlhbGl6ZWQge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLldhZGxHZW5lcmF0b3J9CisgICAgICovCisgICAgcHVibGljIFdhZGxHZW5lcmF0b3IgY3JlYXRlV2FkbEdlbmVyYXRvcihJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIpIHsKKyAgICAgICAgZmluYWwgV2FkbEdlbmVyYXRvciB3YWRsR2VuZXJhdG9yOworICAgICAgICBmaW5hbCBMaXN0PFdhZGxHZW5lcmF0b3JEZXNjcmlwdGlvbj4gd2FkbEdlbmVyYXRvckRlc2NyaXB0aW9uczsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdhZGxHZW5lcmF0b3JEZXNjcmlwdGlvbnMgPSBjb25maWd1cmUoKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX1dBRExfR0VORVJBVE9SX0NPTkZJR1VSRSgpLCBlKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGZpbmFsIFdhZGxHZW5lcmF0b3JEZXNjcmlwdGlvbiBkZXNjIDogd2FkbEdlbmVyYXRvckRlc2NyaXB0aW9ucykgeworICAgICAgICAgICAgZGVzYy5zZXRDb25maWd1cmF0b3JDbGFzcyh0aGlzLmdldENsYXNzKCkpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3YWRsR2VuZXJhdG9yID0gV2FkbEdlbmVyYXRvckxvYWRlci5sb2FkV2FkbEdlbmVyYXRvckRlc2NyaXB0aW9ucyhpbmplY3Rpb25NYW5hZ2VyLCB3YWRsR2VuZXJhdG9yRGVzY3JpcHRpb25zKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX1dBRExfR0VORVJBVE9SX0xPQUQoKSwgZSk7CisKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gd2FkbEdlbmVyYXRvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydCB0byBidWlsZCBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgV2FkbEdlbmVyYXRvckNvbmZpZ306CisgICAgICogPHByZT48Y29kZT5nZW5lcmF0b3IoJmx0O2NsYXNzJmd0OykKKyAgICAgKiAgICAgIC5wcm9wKCZsdDtuYW1lJmd0OywgJmx0O3ZhbHVlJmd0OykKKyAgICAgKiAgICAgIC5wcm9wKCZsdDtuYW1lJmd0OywgJmx0O3ZhbHVlJmd0OykKKyAgICAgKiAuZ2VuZXJhdG9yKCZsdDtjbGFzcyZndDspCisgICAgICogICAgICAucHJvcCgmbHQ7bmFtZSZndDssICZsdDt2YWx1ZSZndDspCisgICAgICogICAgICAucHJvcCgmbHQ7bmFtZSZndDssICZsdDt2YWx1ZSZndDspCisgICAgICogICAgICAuYnVpbGQoKTwvY29kZT48L3ByZT4KKyAgICAgKgorICAgICAqIEBwYXJhbSBnZW5lcmF0b3JDbGFzcyB0aGUgY2xhc3Mgb2YgdGhlIHdhZGwgZ2VuZXJhdG9yIHRvIGNvbmZpZ3VyZQorICAgICAqIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFdhZGxHZW5lcmF0b3JDb25maWdEZXNjcmlwdGlvbkJ1aWxkZXJ9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgV2FkbEdlbmVyYXRvckNvbmZpZ0Rlc2NyaXB0aW9uQnVpbGRlciBnZW5lcmF0b3IoZmluYWwgQ2xhc3M8PyBleHRlbmRzIFdhZGxHZW5lcmF0b3I+IGdlbmVyYXRvckNsYXNzKSB7CisgICAgICAgIHJldHVybiBuZXcgV2FkbEdlbmVyYXRvckNvbmZpZ0Rlc2NyaXB0aW9uQnVpbGRlcigpLmdlbmVyYXRvcihnZW5lcmF0b3JDbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBXYWRsR2VuZXJhdG9yQ29uZmlnRGVzY3JpcHRpb25CdWlsZGVyIHsKKworICAgICAgICBwcml2YXRlIExpc3Q8V2FkbEdlbmVyYXRvckRlc2NyaXB0aW9uPiBfZGVzY3JpcHRpb25zOworICAgICAgICBwcml2YXRlIFdhZGxHZW5lcmF0b3JEZXNjcmlwdGlvbiBfZGVzY3JpcHRpb247CisKKyAgICAgICAgcHVibGljIFdhZGxHZW5lcmF0b3JDb25maWdEZXNjcmlwdGlvbkJ1aWxkZXIoKSB7CisgICAgICAgICAgICBfZGVzY3JpcHRpb25zID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgV2FkbEdlbmVyYXRvckNvbmZpZ0Rlc2NyaXB0aW9uQnVpbGRlciBnZW5lcmF0b3IoZmluYWwgQ2xhc3M8PyBleHRlbmRzIFdhZGxHZW5lcmF0b3I+IGdlbmVyYXRvckNsYXNzKSB7CisgICAgICAgICAgICBpZiAoX2Rlc2NyaXB0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBfZGVzY3JpcHRpb25zLmFkZChfZGVzY3JpcHRpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX2Rlc2NyaXB0aW9uID0gbmV3IFdhZGxHZW5lcmF0b3JEZXNjcmlwdGlvbigpOworICAgICAgICAgICAgX2Rlc2NyaXB0aW9uLnNldEdlbmVyYXRvckNsYXNzKGdlbmVyYXRvckNsYXNzKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNwZWNpZnkgdGhlIHByb3BlcnR5IHZhbHVlIGZvciB0aGUgY3VycmVudCB7QGxpbmsgV2FkbEdlbmVyYXRvcn0uCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGUge0BsaW5rIFdhZGxHZW5lcmF0b3J9IHByb3BlcnR5IHR5cGUgY2FuIGJlIG9mIGFueSB0eXBlIHdpdGgKKyAgICAgICAgICogdGhlIGZvbGxvd2luZyBjb250cmFpbnRzOgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogSWYgdGhlIHtAbGluayBXYWRsR2VuZXJhdG9yfSBwcm9wZXJ0eSB0eXBlIGlzIGVxdWFsIHRvIHRoZQorICAgICAgICAgKiBwcm9wZXJ0eSB2YWx1ZSB0eXBlIHRoZW4gdGhlIHByb3BlcnR5IHZhbHVlIGlzIHNldCBhcyB0aGUKKyAgICAgICAgICoge0BsaW5rIFdhZGxHZW5lcmF0b3J9IHByb3BlcnR5IHZhbHVlLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBJZiB0aGUge0BsaW5rIFdhZGxHZW5lcmF0b3J9IHByb3BlcnR5IHR5cGUgaGFzIGEgY29uc3RydWN0b3Igd2l0aAorICAgICAgICAgKiBhIHNpbmdsZSB7QGxpbmsgU3RyaW5nfSBwYXJhbWV0ZXIgdHlwZSBhbmQgdGhlIHByb3BlcnR5IHZhbHVlIGlzIGEKKyAgICAgICAgICoge0BsaW5rIFN0cmluZ30gdGhlbiBhbiBpbnN0YW5jZSBvZiB0aGUgcHJvcGVydHkgdHlwZSBpcyBjb25zdHJ1Y3RlZAorICAgICAgICAgKiB3aXRoIHRoZSBwcm9wZXJ0eSB2YWx1ZSBhbmQgdGhhdCBpbnN0YW5jZSBpcyBzZXQgYXMgdGhlCisgICAgICAgICAqIHtAbGluayBXYWRsR2VuZXJhdG9yfSBwcm9wZXJ0eSB2YWx1ZS4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogSWYgdGhlIHtAbGluayBXYWRsR2VuZXJhdG9yfSBwcm9wZXJ0eSB0eXBlIGlzIG9mIHR5cGUge0BsaW5rIEZpbGV9LAorICAgICAgICAgKiB0aGVuIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkgdmFsdWUgbXVzdCBiZSBhIHtAbGluayBTdHJpbmd9IHN0YXJ0aW5nCisgICAgICAgICAqIHdpdGggdGhlIHByZWZpeCA8ZW0+Y2xhc3NwYXRoOjwvZW0+IHRvIGRlbm90ZSwgdGhhdCB0aGUgRmlsZSBzaGFsbAorICAgICAgICAgKiBiZSBsb2FkZWQgZnJvbSB0aGUgY2xhc3NwYXRoIGxpa2UgdGhpczoKKyAgICAgICAgICogPHByZT48Y29kZT5uZXcgRmlsZSggZ2VuZXJhdG9yLmdldENsYXNzKCkuZ2V0UmVzb3VyY2UoIHN0cmlwcGVkRmlsZW5hbWUgKS50b1VSSSgpICk8L2NvZGU+PC9wcmU+CisgICAgICAgICAqIE5vdGljZSB0aGF0IHRoZSBmaWxlIGlzIGxvYWRlZCBhcyBhIHJlc291cmNlIGZyb20gdGhlIGNsYXNzcGF0aAorICAgICAgICAgKiBpbiB0aGlzIGNhc2UsIHRoZXJlZm9yZSA8ZW0+Y2xhc3NwYXRoOnRlc3QueG1sPC9lbT4KKyAgICAgICAgICogcmVmZXJzIHRvIGEgZmlsZSBpbiB0aGUgcGFja2FnZSBvZiB0aGUgc3BlY2lmaWVkCisgICAgICAgICAqIDxjb2RlPiZsdDtjbGFzc25hbWUmZ3Q7PC9jb2RlPi4gVGhlIGZpbGUgcmVmZXJlbmNlCisgICAgICAgICAqIDxlbT5jbGFzc3BhdGg6L3Rlc3QueG1sPC9lbT4gcmVmZXJzIHRvIGEgZmlsZSB0aGF0IGlzIGluIHRoZSByb290CisgICAgICAgICAqIG9mIHRoZSBjbGFzc3BhdGguCisgICAgICAgICAqIDwvcD4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIElmIHRoZSB7QGxpbmsgV2FkbEdlbmVyYXRvcn0gcHJvcGVydHkgdHlwZSBpcyBvZiB0eXBlCisgICAgICAgICAqIHtAbGluayBJbnB1dFN0cmVhbX0sIHRoZW4gdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSB2YWx1ZSBtdXN0IGJlIGEKKyAgICAgICAgICoge0BsaW5rIFN0cmluZ30gYW5kIHRoZSBpbnN0YW5jZSBvZiB7QGxpbmsgSW5wdXRTdHJlYW19IGlzIG9idGFpbmVkCisgICAgICAgICAqIHdpdGgge0BsaW5rIENsYXNzTG9hZGVyI2dldFJlc291cmNlQXNTdHJlYW0oU3RyaW5nKX0gdXNpbmcgdGhlCisgICAgICAgICAqIGN1cnJlbnQgdGhyZWFkcyBjb250ZXh0IGNsYXNzbG9hZGVyLgorICAgICAgICAgKiBUaGUge0BsaW5rIElucHV0U3RyZWFtfSB3aWxsIGJlIGNsb3NlZCBhZnRlcgorICAgICAgICAgKiB7QGxpbmsgV2FkbEdlbmVyYXRvciNpbml0KCl9IHdhcyBjYWxsZWQgYW5kIHRoZXJlZm9yZSBtdXN0IG5vdCBiZQorICAgICAgICAgKiBjbG9zZWQgYnkgdGhlIHtAbGluayBXYWRsR2VuZXJhdG9yfSB1c2luZyB0aGlzIHN0cmVhbS4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcHJvcE5hbWUgIHRoZSBwcm9wZXJ0eSBuYW1lCisgICAgICAgICAqIEBwYXJhbSBwcm9wVmFsdWUgdGhlIHN0cmluZ2lmaWVkIHByb3BlcnR5IHZhbHVlCisgICAgICAgICAqIEByZXR1cm4gdGhpcyBidWlsZGVyIGluc3RhbmNlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgV2FkbEdlbmVyYXRvckNvbmZpZ0Rlc2NyaXB0aW9uQnVpbGRlciBwcm9wKGZpbmFsIFN0cmluZyBwcm9wTmFtZSwgZmluYWwgT2JqZWN0IHByb3BWYWx1ZSkgeworICAgICAgICAgICAgaWYgKF9kZXNjcmlwdGlvbi5nZXRQcm9wZXJ0aWVzKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIF9kZXNjcmlwdGlvbi5zZXRQcm9wZXJ0aWVzKG5ldyBQcm9wZXJ0aWVzKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX2Rlc2NyaXB0aW9uLmdldFByb3BlcnRpZXMoKS5wdXQocHJvcE5hbWUsIHByb3BWYWx1ZSk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBMaXN0PFdhZGxHZW5lcmF0b3JEZXNjcmlwdGlvbj4gZGVzY3JpcHRpb25zKCkgeworICAgICAgICAgICAgaWYgKF9kZXNjcmlwdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgX2Rlc2NyaXB0aW9ucy5hZGQoX2Rlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBfZGVzY3JpcHRpb25zOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFdhZGxHZW5lcmF0b3JDb25maWcgYnVpbGQoKSB7CisgICAgICAgICAgICBpZiAoX2Rlc2NyaXB0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBfZGVzY3JpcHRpb25zLmFkZChfZGVzY3JpcHRpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBXYWRsR2VuZXJhdG9yQ29uZmlnSW1wbChfZGVzY3JpcHRpb25zKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFdhZGxHZW5lcmF0b3JDb25maWdJbXBsIGV4dGVuZHMgV2FkbEdlbmVyYXRvckNvbmZpZyB7CisKKyAgICAgICAgcHVibGljIExpc3Q8V2FkbEdlbmVyYXRvckRlc2NyaXB0aW9uPiBfZGVzY3JpcHRpb25zOworCisgICAgICAgIHB1YmxpYyBXYWRsR2VuZXJhdG9yQ29uZmlnSW1wbCgKKyAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PFdhZGxHZW5lcmF0b3JEZXNjcmlwdGlvbj4gZGVzY3JpcHRpb25zKSB7CisgICAgICAgICAgICBfZGVzY3JpcHRpb25zID0gZGVzY3JpcHRpb25zOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBMaXN0PFdhZGxHZW5lcmF0b3JEZXNjcmlwdGlvbj4gY29uZmlndXJlKCkgeworICAgICAgICAgICAgcmV0dXJuIF9kZXNjcmlwdGlvbnM7CisgICAgICAgIH0KKworICAgIH0KKworLy8gICAgcHVibGljIHN0YXRpYyBjbGFzcyBXYWRsR2VuZXJhdG9yQ29uZmlnQnVpbGRlciB7CisvLworLy8gICAgICAgIHByaXZhdGUgTGlzdDxXYWRsR2VuZXJhdG9yPiBfZ2VuZXJhdG9yczsKKy8vCisvLyAgICAgICAgcHVibGljIFdhZGxHZW5lcmF0b3JDb25maWdCdWlsZGVyKCkgeworLy8gICAgICAgICAgICBfZ2VuZXJhdG9ycyA9IG5ldyBBcnJheUxpc3Q8V2FkbEdlbmVyYXRvcj4oKTsKKy8vICAgICAgICB9CisvLworLy8gICAgICAgIHB1YmxpYyBXYWRsR2VuZXJhdG9yQ29uZmlnQnVpbGRlciBnZW5lcmF0b3IoIFdhZGxHZW5lcmF0b3IgZ2VuZXJhdG9yICkgeworLy8gICAgICAgICAgICBpZiAoIGdlbmVyYXRvciA9PSBudWxsICkgeworLy8gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiggIlRoZSB3YWRsIGdlbmVyYXRvciBtdXN0IG5vdCBiZSBudWxsLiIgKTsKKy8vICAgICAgICAgICAgfQorLy8gICAgICAgICAgICBfZ2VuZXJhdG9ycy5hZGQoIGdlbmVyYXRvciApOworLy8gICAgICAgICAgICByZXR1cm4gdGhpczsKKy8vICAgICAgICB9CisvLworLy8gICAgICAgIHB1YmxpYyBXYWRsR2VuZXJhdG9yQ29uZmlnIGJ1aWxkKCkgeworLy8gICAgICAgICAgICB0cnkgeworLy8gICAgICAgICAgICAgICAgZmluYWwgV2FkbEdlbmVyYXRvciB3YWRsR2VuZXJhdG9yID0gV2FkbEdlbmVyYXRvckxvYWRlci5sb2FkV2FkbEdlbmVyYXRvcnMoIF9nZW5lcmF0b3JzICk7CisvLyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdhZGxHZW5lcmF0b3JDb25maWdHZW5lcmF0b3JJbXBsKCB3YWRsR2VuZXJhdG9yICkgeworLy8KKy8vICAgICAgICAgICAgICAgIH07CisvLyAgICAgICAgICAgIH0gY2F0Y2ggKCBFeGNlcHRpb24gZSApIHsKKy8vICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCAiQ291bGQgbm90IGxvYWQgd2FkbCBnZW5lcmF0b3JzLiIsIGUgKTsKKy8vICAgICAgICAgICAgfQorLy8gICAgICAgIH0KKy8vCisvLyAgICB9CisKKy8vICAgIHN0YXRpYyBjbGFzcyBXYWRsR2VuZXJhdG9yQ29uZmlnR2VuZXJhdG9ySW1wbCBleHRlbmRzIFdhZGxHZW5lcmF0b3JDb25maWcgeworLy8KKy8vICAgICAgICBwcml2YXRlIGZpbmFsIFdhZGxHZW5lcmF0b3IgX3dhZGxHZW5lcmF0b3I7CisvLworLy8gICAgICAgIHB1YmxpYyBXYWRsR2VuZXJhdG9yQ29uZmlnR2VuZXJhdG9ySW1wbChXYWRsR2VuZXJhdG9yIHdhZGxHZW5lcmF0b3IpIHsKKy8vICAgICAgICAgICAgX3dhZGxHZW5lcmF0b3IgPSB3YWRsR2VuZXJhdG9yOworLy8gICAgICAgIH0KKy8vCisvLyAgICAgICAgQE92ZXJyaWRlCisvLyAgICAgICAgcHVibGljIExpc3Q8V2FkbEdlbmVyYXRvckRlc2NyaXB0aW9uPiBjb25maWd1cmUoKSB7CisvLyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiggIk11c3Qgbm90IGJlIGNhbGxlZCIgKTsKKy8vICAgICAgICB9CisvLworLy8gICAgICAgIC8qIChub24tSmF2YWRvYykKKy8vICAgICAgICAgKiBAc2VlIGNvbS5zdW4uamVyc2V5LnNlcnZlci5pbXBsLndhZGwuY29uZmlnLldhZGxHZW5lcmF0b3JDb25maWcjY3JlYXRlV2FkbEdlbmVyYXRvcigpCisvLyAgICAgICAgICovCisvLyAgICAgICAgQE92ZXJyaWRlCisvLyAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCBXYWRsR2VuZXJhdG9yIGNyZWF0ZVdhZGxHZW5lcmF0b3IoKSB7CisvLyAgICAgICAgICAgIHJldHVybiBfd2FkbEdlbmVyYXRvcjsKKy8vICAgICAgICB9CisvLworLy8gICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci93YWRsL2NvbmZpZy9XYWRsR2VuZXJhdG9yQ29uZmlnTG9hZGVyLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci93YWRsL2NvbmZpZy9XYWRsR2VuZXJhdG9yQ29uZmlnTG9hZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFiOTFjYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvY29uZmlnL1dhZGxHZW5lcmF0b3JDb25maWdMb2FkZXIuamF2YQpAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLmNvbmZpZzsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5SZWZsZWN0aW9uSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKKworLyoqCisgKiBMb2FkcyBhIHtAbGluayBXYWRsR2VuZXJhdG9yQ29uZmlnfSBhbmQgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuV2FkbEdlbmVyYXRvcn0KKyAqIHByb3ZpZGVkIGJ5IHRoZSBsb2FkZWQge0BsaW5rIFdhZGxHZW5lcmF0b3JDb25maWd9Ljxici8+CisgKiBJZiBubyB7QGxpbmsgV2FkbEdlbmVyYXRvckNvbmZpZ30gaXMgcHJvdmlkZWQsIHRoZSBkZWZhdWx0IHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5XYWRsR2VuZXJhdG9yfQorICogd2lsbCBiZSBsb2FkZWQuPGJyIC8+CisgKgorICogQGF1dGhvciBNYXJ0aW4gR3JvdHprZSAobWFydGluLmdyb3R6a2UgYXQgZnJlaWhlaXQuY29tKQorICovCitwdWJsaWMgY2xhc3MgV2FkbEdlbmVyYXRvckNvbmZpZ0xvYWRlciB7CisKKyAgICAvKioKKyAgICAgKiBMb2FkIHRoZSB7QGxpbmsgV2FkbEdlbmVyYXRvckNvbmZpZ30gZnJvbSB0aGUgcHJvdmlkZWQge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZ30gdXNpbmcgdGhlCisgICAgICogcHJvcGVydHkge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzI1dBRExfR0VORVJBVE9SX0NPTkZJR30uCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgdHlwZSBvZiB0aGlzIHByb3BlcnR5IG11c3QgYmUgYSBzdWJjbGFzcyBvciBhbiBpbnN0YW5jZSBvZiBhIHN1YmNsYXNzIG9mCisgICAgICoge0BsaW5rIFdhZGxHZW5lcmF0b3JDb25maWd9Ljxici8+CisgICAgICogSWYgaXQncyBub3Qgc2V0LCB0aGUgZGVmYXVsdCB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuaW50ZXJuYWwuZ2VuZXJhdG9ycy5XYWRsR2VuZXJhdG9ySkFYQkdyYW1tYXJHZW5lcmF0b3J9CisgICAgICogd2lsbCBiZSB1c2VkLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBvZiBkZXBsb3llZCBKZXJzZXkgYXBwbGljYXRpb24uCisgICAgICogQHJldHVybiBhIGNvbmZpZ3VyZSB7QGxpbmsgV2FkbEdlbmVyYXRvckNvbmZpZ30uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBXYWRsR2VuZXJhdG9yQ29uZmlnIGxvYWRXYWRsR2VuZXJhdG9yc0Zyb21Db25maWcoZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKSB7CisgICAgICAgIGZpbmFsIE9iamVjdCB3YWRsR2VuZXJhdG9yQ29uZmlnUHJvcGVydHkgPSBwcm9wZXJ0aWVzLmdldCgKKyAgICAgICAgICAgICAgICBTZXJ2ZXJQcm9wZXJ0aWVzLldBRExfR0VORVJBVE9SX0NPTkZJRyk7CisgICAgICAgIGlmICh3YWRsR2VuZXJhdG9yQ29uZmlnUHJvcGVydHkgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBXYWRsR2VuZXJhdG9yQ29uZmlnKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBMaXN0PFdhZGxHZW5lcmF0b3JEZXNjcmlwdGlvbj4gY29uZmlndXJlKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgICAgIGlmICh3YWRsR2VuZXJhdG9yQ29uZmlnUHJvcGVydHkgaW5zdGFuY2VvZiBXYWRsR2VuZXJhdG9yQ29uZmlnKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAoKFdhZGxHZW5lcmF0b3JDb25maWcpIHdhZGxHZW5lcmF0b3JDb25maWdQcm9wZXJ0eSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIFdhZGxHZW5lcmF0b3JDb25maWc+IGNvbmZpZ0NsYXp6OworICAgICAgICAgICAgICAgIGlmICh3YWRsR2VuZXJhdG9yQ29uZmlnUHJvcGVydHkgaW5zdGFuY2VvZiBDbGFzcykgeworICAgICAgICAgICAgICAgICAgICBjb25maWdDbGF6eiA9ICgoQ2xhc3M8Pz4pIHdhZGxHZW5lcmF0b3JDb25maWdQcm9wZXJ0eSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXNTdWJjbGFzcyhXYWRsR2VuZXJhdG9yQ29uZmlnLmNsYXNzKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdhZGxHZW5lcmF0b3JDb25maWdQcm9wZXJ0eSBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgICAgICAgICBjb25maWdDbGF6eiA9IEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKFJlZmxlY3Rpb25IZWxwZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2xhc3NGb3JOYW1lV2l0aEV4Y2VwdGlvblBFQSgoU3RyaW5nKSB3YWRsR2VuZXJhdG9yQ29uZmlnUHJvcGVydHkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hc1N1YmNsYXNzKFdhZGxHZW5lcmF0b3JDb25maWcuY2xhc3MpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX1dBRExfR0VORVJBVE9SX0NPTkZJR19MT0FERVJfUFJPUEVSVFkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmVyUHJvcGVydGllcy5XQURMX0dFTkVSQVRPUl9DT05GSUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FkbEdlbmVyYXRvckNvbmZpZ1Byb3BlcnR5LmdldENsYXNzKCkuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBjb25maWdDbGF6ei5uZXdJbnN0YW5jZSgpOworCisgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBQcml2aWxlZ2VkQWN0aW9uRXhjZXB0aW9uIHBhZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX1dBRExfR0VORVJBVE9SX0NPTkZJR19MT0FERVIoCisgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2ZXJQcm9wZXJ0aWVzLldBRExfR0VORVJBVE9SX0NPTkZJRyksIHBhZS5nZXRDYXVzZSgpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfV0FETF9HRU5FUkFUT1JfQ09ORklHX0xPQURFUigKKyAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZlclByb3BlcnRpZXMuV0FETF9HRU5FUkFUT1JfQ09ORklHKSwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvY29uZmlnL1dhZGxHZW5lcmF0b3JEZXNjcmlwdGlvbi5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9jb25maWcvV2FkbEdlbmVyYXRvckRlc2NyaXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRhZDZjZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvY29uZmlnL1dhZGxHZW5lcmF0b3JEZXNjcmlwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLmNvbmZpZzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuV2FkbEdlbmVyYXRvcjsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBtb2RlbCBmb3IgdGhlIGRlZmluaXRpb24gb2Ygd2FkbCBnZW5lcmF0b3JzIHZpYSBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMuPGJyIC8+CisgKiBUaGUgcHJvcGVydGllcyByZWZlciB0byB0aGUgcHJvcGVydGllcyBvZiB0aGUge0BsaW5rIFdhZGxHZW5lcmF0b3J9IGltcGxlbWVudGF0aW9uIHdpdGgKKyAqIHRoZSBzcGVjaWZpZWQge0BsaW5rIFdhZGxHZW5lcmF0b3JEZXNjcmlwdGlvbiNnZXRHZW5lcmF0b3JDbGFzcygpfS4gVGhlIHtAbGluayBXYWRsR2VuZXJhdG9yfSBwcm9wZXJ0aWVzCisgKiBhcmUgcG9wdWxhdGVkIHdpdGggdGhlIHByb3ZpZGVkIHByb3BlcnRpZXMgbGlrZSB0aGlzOgorICogPHVsPgorICogPGxpPlRoZSB0eXBlcyBtYXRjaCBleGFjdGx5Ojxici8+aWYgdGhlIFdhZGxHZW5lcmF0b3IgcHJvcGVydHkgaXMgb2YgdHlwZSA8Y29kZT5vcmcuZXhhbXBsZS5Gb288L2NvZGU+IGFuZCB0aGUKKyAqIHByb3ZpZGVkIHByb3BlcnR5IHZhbHVlIGlzIG9mIHR5cGUgPGNvZGU+b3JnLmV4YW1wbGUuRm9vPC9jb2RlPjwvbGk+CisgKiA8bGk+VHlwZXMgdGhhdCBwcm92aWRlIGEgY29uc3RydWN0b3IgZm9yIHRoZSBwcm92aWRlZCB0eXBlIChtb3N0bHkgamF2YS5sYW5nLlN0cmluZyk8L2xpPgorICogPGxpPlRoZSBXYWRsR2VuZXJhdG9yIHByb3BlcnR5IGlzIG9mIHR5cGUge0BsaW5rIElucHV0U3RyZWFtfTogVGhlIHN0cmVhbSBpcyBsb2FkZWQgZnJvbSB0aGUKKyAqIHByb3BlcnR5IHZhbHVlIChwcm92aWRlZCBieSB0aGUge0BsaW5rIFdhZGxHZW5lcmF0b3JEZXNjcmlwdGlvbn0pIHZpYQorICoge0BsaW5rIENsYXNzTG9hZGVyI2dldFJlc291cmNlQXNTdHJlYW0oU3RyaW5nKX0uIEl0IHdpbGwgYmUgY2xvc2VkIGFmdGVyIHtAbGluayBXYWRsR2VuZXJhdG9yI2luaXQoKX0gd2FzIGNhbGxlZC4KKyAqIDwvbGk+CisgKgorICogPGxpPjxzdHJvbmc+RGVwcmVjYXRlZCwgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9uczo8L3N0cm9uZz48YnIvPgorICogVGhlIFdhZGxHZW5lcmF0b3IgcHJvcGVydHkgaXMgb2YgdHlwZSB7QGxpbmsgRmlsZX0gYW5kIHRoZSBwcm92aWRlZCBwcm9wZXJ0eSB2YWx1ZSBpcyBhIHtAbGluayBTdHJpbmd9Ojxici8+CisgKiB0aGUgcHJvdmlkZWQgcHJvcGVydHkgdmFsdWUgY2FuIGNvbnRhaW4gdGhlIHByZWZpeCA8ZW0+Y2xhc3NwYXRoOjwvZW0+IHRvIGRlbm90ZSwgdGhhdCB0aGUKKyAqIHBhdGggdG8gdGhlIGZpbGUgaXMgcmVsYXRpdmUgdG8gdGhlIGNsYXNzcGF0aC4gSW4gdGhpcyBjYXNlLCB0aGUgcHJvcGVydHkgdmFsdWUgaXMgc3RyaXBwZWQgYnkKKyAqIHRoZSBwcmVmaXggPGVtPmNsYXNzcGF0aDo8L2VtPiBhbmQgdGhlIHtAbGluayBGaWxlfSBpcyBjcmVhdGVkIHZpYQorICogPHByZT48Y29kZT5uZXcgRmlsZSggZ2VuZXJhdG9yLmdldENsYXNzKCkuZ2V0UmVzb3VyY2UoIHN0cmlwcGVkRmlsZW5hbWUgKS50b1VSSSgpICk8L2NvZGU+PC9wcmU+CisgKiBOb3RpY2UgdGhhdCB0aGUgZmlsZW5hbWUgaXMgbG9hZGVkIGZyb20gdGhlIGNsYXNzcGF0aCBpbiB0aGlzIGNhc2UsIGUuZy4gPGVtPmNsYXNzcGF0aDp0ZXN0LnhtbDwvZW0+CisgKiByZWZlcnMgdG8gYSBmaWxlIGluIHRoZSBwYWNrYWdlIG9mIHRoZSBjbGFzcyAoe0BsaW5rIFdhZGxHZW5lcmF0b3JEZXNjcmlwdGlvbiNnZXRHZW5lcmF0b3JDbGFzcygpfSkuIFRoZQorICogZmlsZSByZWZlcmVuY2UgPGVtPmNsYXNzcGF0aDovdGVzdC54bWw8L2VtPiByZWZlcnMgdG8gYSBmaWxlIHRoYXQgaXMgaW4gdGhlIHJvb3Qgb2YgdGhlIGNsYXNzcGF0aC4KKyAqIDwvbGk+CisgKgorICogPC91bD4KKyAqCisgKiBAYXV0aG9yIE1hcnRpbiBHcm90emtlIChtYXJ0aW4uZ3JvdHprZSBhdCBmcmVpaGVpdC5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBXYWRsR2VuZXJhdG9yRGVzY3JpcHRpb24geworCisgICAgcHJpdmF0ZSBDbGFzczw/IGV4dGVuZHMgV2FkbEdlbmVyYXRvcj4gZ2VuZXJhdG9yQ2xhc3M7CisgICAgcHJpdmF0ZSBQcm9wZXJ0aWVzIHByb3BlcnRpZXM7CisgICAgcHJpdmF0ZSBDbGFzczw/PiBjb25maWd1cmF0b3JDbGFzczsKKworICAgIHB1YmxpYyBXYWRsR2VuZXJhdG9yRGVzY3JpcHRpb24oKSB7CisgICAgfQorCisgICAgcHVibGljIFdhZGxHZW5lcmF0b3JEZXNjcmlwdGlvbihDbGFzczw/IGV4dGVuZHMgV2FkbEdlbmVyYXRvcj4gZ2VuZXJhdG9yQ2xhc3MsIFByb3BlcnRpZXMgcHJvcGVydGllcykgeworICAgICAgICB0aGlzLmdlbmVyYXRvckNsYXNzID0gZ2VuZXJhdG9yQ2xhc3M7CisgICAgICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgZ2VuZXJhdG9yQ2xhc3MKKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIFdhZGxHZW5lcmF0b3I+IGdldEdlbmVyYXRvckNsYXNzKCkgeworICAgICAgICByZXR1cm4gZ2VuZXJhdG9yQ2xhc3M7CisgICAgfQorICAgIC8qKgorICAgICAqIEBwYXJhbSBnZW5lcmF0b3JDbGFzcyB0aGUgZ2VuZXJhdG9yQ2xhc3MgdG8gc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0R2VuZXJhdG9yQ2xhc3MoQ2xhc3M8PyBleHRlbmRzIFdhZGxHZW5lcmF0b3I+IGdlbmVyYXRvckNsYXNzKSB7CisgICAgICAgIHRoaXMuZ2VuZXJhdG9yQ2xhc3MgPSBnZW5lcmF0b3JDbGFzczsKKyAgICB9CisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgcHJvcGVydGllcworICAgICAqLworICAgIHB1YmxpYyBQcm9wZXJ0aWVzIGdldFByb3BlcnRpZXMoKSB7CisgICAgICAgIHJldHVybiBwcm9wZXJ0aWVzOworICAgIH0KKyAgICAvKioKKyAgICAgKiBAcGFyYW0gcHJvcGVydGllcyB0aGUgcHJvcGVydGllcyB0byBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0aWVzKFByb3BlcnRpZXMgcHJvcGVydGllcykgeworICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB7QGxpbmsgV2FkbEdlbmVyYXRvckNvbmZpZ30gdGhhdCB3YXMgdXNlZCB0byBwcm9kdWNlIGN1cnJlbnQgZGVzY3JpcHRpb24gaW5zdGFuY2UuCisgICAgICogVGhlIHJlc3VsdCBjb3VsZCBiZSBudWxsIGlmIHRoZSBjb25maWcgd2FzIG5vdCBzZXQgb24gdGhpcyBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gY29uZmlnCisgICAgICovCisgICAgcHVibGljIENsYXNzPD8+IGdldENvbmZpZ3VyYXRvckNsYXNzKCkgeworICAgICAgICByZXR1cm4gY29uZmlndXJhdG9yQ2xhc3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHtAbGluayBXYWRsR2VuZXJhdG9yQ29uZmlnfSBjbGFzcyB0byBiZSBhc3NvY2lhdGVkIHdpdGggY3VycmVudCBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25maWd1cmF0b3JDbGFzcworICAgICAqLworICAgIHZvaWQgc2V0Q29uZmlndXJhdG9yQ2xhc3MoQ2xhc3M8Pz4gY29uZmlndXJhdG9yQ2xhc3MpIHsKKyAgICAgICAgdGhpcy5jb25maWd1cmF0b3JDbGFzcyA9IGNvbmZpZ3VyYXRvckNsYXNzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvY29uZmlnL1dhZGxHZW5lcmF0b3JMb2FkZXIuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvY29uZmlnL1dhZGxHZW5lcmF0b3JMb2FkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjFiYzQwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9jb25maWcvV2FkbEdlbmVyYXRvckxvYWRlci5qYXZhCkBAIC0wLDAgKzEsMjg5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLmNvbmZpZzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlJlZmxlY3Rpb25IZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuV2FkbEdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5pbnRlcm5hbC5nZW5lcmF0b3JzLldhZGxHZW5lcmF0b3JKQVhCR3JhbW1hckdlbmVyYXRvcjsKKworLyoqCisgKiBMb2FkcyB7QGxpbmsgV2FkbEdlbmVyYXRvcn1zIGZyb20gYSBwcm92aWRlZCBsaXN0IG9mIHtAbGluayBXYWRsR2VuZXJhdG9yRGVzY3JpcHRpb259cy48YnIvPgorICogVGhlIHByb3BlcnRpZXMgb2YgdGhlIHtAbGluayBXYWRsR2VuZXJhdG9yRGVzY3JpcHRpb259cyBjYW4gcmVmZXIgdG8ge0BsaW5rIFdhZGxHZW5lcmF0b3J9IHByb3BlcnRpZXMKKyAqIG9mIHRoZXNlIHR5cGVzOgorICogPHVsPgorICoKKyAqIDxsaT5leGFjdCBtYXRjaDogaWYgdGhlIFdhZGxHZW5lcmF0b3IgcHJvcGVydHkgaXMgb2YgdHlwZSA8Y29kZT5vcmcuZXhhbXBsZS5Gb288L2NvZGU+IGFuZCB0aGUKKyAqIHByb3BlcnR5IHZhbHVlIHByb3ZpZGVkIGJ5IHRoZSB7QGxpbmsgV2FkbEdlbmVyYXRvckRlc2NyaXB0aW9ufSBpcyBvZiB0eXBlIDxjb2RlPm9yZy5leGFtcGxlLkZvbzwvY29kZT48L2xpPgorICoKKyAqIDxsaT5qYXZhLmlvLklucHV0U3RyZWFtOiBUaGUge0BsaW5rIElucHV0U3RyZWFtfSBjYW4gZS5nLiByZXByZXNlbnQgYSBmaWxlLiBUaGUgc3RyZWFtIGlzIGxvYWRlZCBmcm9tIHRoZQorICogcHJvcGVydHkgdmFsdWUgKHByb3ZpZGVkIGJ5IHRoZSB7QGxpbmsgV2FkbEdlbmVyYXRvckRlc2NyaXB0aW9ufSkgdmlhCisgKiB7QGxpbmsgQ2xhc3NMb2FkZXIjZ2V0UmVzb3VyY2VBc1N0cmVhbShTdHJpbmcpfSBvciB2aWEgT1NHaSBBUEkgbWVhbnMgaWYgT1NHaSBydW50aW1lIGlzIGRldGVjdGVkLgorICogVGhlIHN0cmVhbSB3aWxsIGJlIGNsb3NlZCBhZnRlciB7QGxpbmsgV2FkbEdlbmVyYXRvciNpbml0KCl9IHdhcyBjYWxsZWQuCisgKiA8L2xpPgorICoKKyAqIDxsaT5UeXBlcyB0aGF0IHByb3ZpZGUgYSBjb25zdHJ1Y3RvciBmb3IgdGhlIHByb3ZpZGVkIHR5cGUgKG1vc3RseSBqYXZhLmxhbmcuU3RyaW5nKTwvbGk+CisgKgorICogPGxpPjxzdHJvbmc+RGVwcmVjYXRlZCwgd2lsbCBiZSByZW1vdmVkIGluIGZ1dHVyZSB2ZXJzaW9ucyBmcm9tIHRoZSB7QGxpbmsgV2FkbEdlbmVyYXRvckxvYWRlcn06PC9zdHJvbmc+PGJyLz4KKyAqIGphdmEubGFuZy5GaWxlOiBUaGUgcHJvcGVydHkgdmFsdWUgY2FuIGNvbnRhaW4gdGhlIHByZWZpeCA8ZW0+Y2xhc3NwYXRoOjwvZW0+IHRvIGRlbm90ZSwgdGhhdCB0aGUKKyAqIHBhdGggdG8gdGhlIGZpbGUgaXMgcmVsYXRpdmUgdG8gdGhlIGNsYXNzcGF0aC4gSW4gdGhpcyBjYXNlLCB0aGUgcHJvcGVydHkgdmFsdWUgaXMgc3RyaXBwZWQgYnkKKyAqIHRoZSBwcmVmaXggPGVtPmNsYXNzcGF0aDo8L2VtPiBhbmQgdGhlIGphdmEubGFuZy5GaWxlIGlzIGNyZWF0ZWQgdmlhCisgKiA8cHJlPjxjb2RlPm5ldyBGaWxlKCBnZW5lcmF0b3IuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSggc3RyaXBwZWRGaWxlbmFtZSApLnRvVVJJKCkgKTwvY29kZT48L3ByZT48L2xpPgorICoKKyAqIDwvdWw+CisgKgorICogQGF1dGhvciBNYXJ0aW4gR3JvdHprZSAobWFydGluLmdyb3R6a2UgYXQgZnJlaWhlaXQuY29tKQorICovCitjbGFzcyBXYWRsR2VuZXJhdG9yTG9hZGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFdhZGxHZW5lcmF0b3JMb2FkZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIHN0YXRpYyBXYWRsR2VuZXJhdG9yIGxvYWRXYWRsR2VuZXJhdG9ycygKKyAgICAgICAgICAgIExpc3Q8V2FkbEdlbmVyYXRvcj4gd2FkbEdlbmVyYXRvcnMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBXYWRsR2VuZXJhdG9yIHdhZGxHZW5lcmF0b3IgPSBuZXcgV2FkbEdlbmVyYXRvckpBWEJHcmFtbWFyR2VuZXJhdG9yKCk7CisgICAgICAgIGlmICh3YWRsR2VuZXJhdG9ycyAhPSBudWxsICYmICF3YWRsR2VuZXJhdG9ycy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGZvciAoV2FkbEdlbmVyYXRvciBnZW5lcmF0b3IgOiB3YWRsR2VuZXJhdG9ycykgeworICAgICAgICAgICAgICAgIGdlbmVyYXRvci5zZXRXYWRsR2VuZXJhdG9yRGVsZWdhdGUod2FkbEdlbmVyYXRvcik7CisgICAgICAgICAgICAgICAgd2FkbEdlbmVyYXRvciA9IGdlbmVyYXRvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB3YWRsR2VuZXJhdG9yLmluaXQoKTsKKyAgICAgICAgcmV0dXJuIHdhZGxHZW5lcmF0b3I7CisgICAgfQorCisgICAgc3RhdGljIFdhZGxHZW5lcmF0b3IgbG9hZFdhZGxHZW5lcmF0b3JEZXNjcmlwdGlvbnMoSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdhZGxHZW5lcmF0b3JEZXNjcmlwdGlvbi4uLiB3YWRsR2VuZXJhdG9yRGVzY3JpcHRpb25zKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgTGlzdDxXYWRsR2VuZXJhdG9yRGVzY3JpcHRpb24+IGxpc3QgPSB3YWRsR2VuZXJhdG9yRGVzY3JpcHRpb25zICE9IG51bGwKKyAgICAgICAgICAgICAgICA/IEFycmF5cy5hc0xpc3Qod2FkbEdlbmVyYXRvckRlc2NyaXB0aW9ucykgOiBudWxsOworICAgICAgICByZXR1cm4gbG9hZFdhZGxHZW5lcmF0b3JEZXNjcmlwdGlvbnMoaW5qZWN0aW9uTWFuYWdlciwgbGlzdCk7CisgICAgfQorCisgICAgc3RhdGljIFdhZGxHZW5lcmF0b3IgbG9hZFdhZGxHZW5lcmF0b3JEZXNjcmlwdGlvbnMoSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8V2FkbEdlbmVyYXRvckRlc2NyaXB0aW9uPiB3YWRsR2VuZXJhdG9yRGVzY3JpcHRpb25zKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFdhZGxHZW5lcmF0b3Igd2FkbEdlbmVyYXRvciA9IG5ldyBXYWRsR2VuZXJhdG9ySkFYQkdyYW1tYXJHZW5lcmF0b3IoKTsKKworICAgICAgICBmaW5hbCBDYWxsYmFja0xpc3QgY2FsbGJhY2tzID0gbmV3IENhbGxiYWNrTGlzdCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKHdhZGxHZW5lcmF0b3JEZXNjcmlwdGlvbnMgIT0gbnVsbCAmJiAhd2FkbEdlbmVyYXRvckRlc2NyaXB0aW9ucy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKFdhZGxHZW5lcmF0b3JEZXNjcmlwdGlvbiB3YWRsR2VuZXJhdG9yRGVzY3JpcHRpb24gOiB3YWRsR2VuZXJhdG9yRGVzY3JpcHRpb25zKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFdhZGxHZW5lcmF0b3JDb250cm9sIGNvbnRyb2wgPSBsb2FkV2FkbEdlbmVyYXRvcihpbmplY3Rpb25NYW5hZ2VyLCB3YWRsR2VuZXJhdG9yRGVzY3JpcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWRsR2VuZXJhdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgd2FkbEdlbmVyYXRvciA9IGNvbnRyb2wud2FkbEdlbmVyYXRvcjsKKyAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLmFkZChjb250cm9sLmNhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3YWRsR2VuZXJhdG9yLmluaXQoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNhbGxiYWNrcy5jYWxsYmFjaygpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHdhZGxHZW5lcmF0b3I7CisKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBXYWRsR2VuZXJhdG9yQ29udHJvbCBsb2FkV2FkbEdlbmVyYXRvcihJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2FkbEdlbmVyYXRvckRlc2NyaXB0aW9uIHdhZGxHZW5lcmF0b3JEZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXYWRsR2VuZXJhdG9yIHdhZGxHZW5lcmF0b3JEZWxlZ2F0ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIExPR0dFUi5pbmZvKCJMb2FkaW5nIHdhZGxHZW5lcmF0b3IgIiArIHdhZGxHZW5lcmF0b3JEZXNjcmlwdGlvbi5nZXRHZW5lcmF0b3JDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgIGZpbmFsIFdhZGxHZW5lcmF0b3IgZ2VuZXJhdG9yID0gSW5qZWN0aW9ucy5nZXRPckNyZWF0ZShpbmplY3Rpb25NYW5hZ2VyLCB3YWRsR2VuZXJhdG9yRGVzY3JpcHRpb24uZ2V0R2VuZXJhdG9yQ2xhc3MoKSk7CisgICAgICAgIGdlbmVyYXRvci5zZXRXYWRsR2VuZXJhdG9yRGVsZWdhdGUod2FkbEdlbmVyYXRvckRlbGVnYXRlKTsKKyAgICAgICAgQ2FsbGJhY2tMaXN0IGNhbGxiYWNrcyA9IG51bGw7CisgICAgICAgIGlmICh3YWRsR2VuZXJhdG9yRGVzY3JpcHRpb24uZ2V0UHJvcGVydGllcygpICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiAhd2FkbEdlbmVyYXRvckRlc2NyaXB0aW9uLmdldFByb3BlcnRpZXMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGNhbGxiYWNrcyA9IG5ldyBDYWxsYmFja0xpc3QoKTsKKyAgICAgICAgICAgIGZpbmFsIFByb3BlcnRpZXMgd2FkbEdlbmVyYXRvclByb3BlcnRpZXMgPSB3YWRsR2VuZXJhdG9yRGVzY3JpcHRpb24uZ2V0UHJvcGVydGllcygpOworICAgICAgICAgICAgQ2xhc3M8Pz4gb3NnaUNvbmZpZ3VyYXRvckNsYXNzID0gd2FkbEdlbmVyYXRvckRlc2NyaXB0aW9uLmdldENvbmZpZ3VyYXRvckNsYXNzKCk7CisgICAgICAgICAgICBmb3IgKEVudHJ5PE9iamVjdCwgT2JqZWN0PiBlbnRyeSA6IHdhZGxHZW5lcmF0b3JQcm9wZXJ0aWVzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBDYWxsYmFjayBjYWxsYmFjayA9IHNldFByb3BlcnR5KGdlbmVyYXRvciwgZW50cnkuZ2V0S2V5KCkudG9TdHJpbmcoKSwgZW50cnkuZ2V0VmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG9zZ2lDb25maWd1cmF0b3JDbGFzcyk7CisgICAgICAgICAgICAgICAgY2FsbGJhY2tzLmFkZChjYWxsYmFjayk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3IFdhZGxHZW5lcmF0b3JDb250cm9sKGdlbmVyYXRvciwgY2FsbGJhY2tzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG9iamVjdCAoZ2VuZXJhdG9yKSBwcm9wZXJ0eSB3aXRoIHRoZSBnaXZlbiBuYW1lIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCisgICAgICogQHBhcmFtIGdlbmVyYXRvciB0aGUgb2JqZWN0LCBvbiB3aGljaCB0aGUgcHJvcGVydHkgc2hhbGwgYmUgc2V0CisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSB0aGUgbmFtZSBvZiB0aGUgcHJvcGVydHksIHRoYXQgc2hhbGwgYmUgc2V0CisgICAgICogQHBhcmFtIHByb3BlcnR5VmFsdWUgdGhlIHZhbHVlIHRvIHBvcHVsYXRlIHRoZSBwcm9wZXJ0eSB3aXRoCisgICAgICogQHJldHVybiBhIHtAbGluayBDYWxsYmFja30gb2JqZWN0IHRoYXQgbXVzdCBiZSBjYWxsZWQgbGF0ZXIsIG9yIG51bGwgaWYgbm8gY2FsbGJhY2sgaXMgcmVxdWlyZWQuCisgICAgICogQHRocm93cyBFeGNlcHRpb24gaWYgcy50aC4gZ29lcyB3cm9uZworICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIENhbGxiYWNrIHNldFByb3BlcnR5KGZpbmFsIE9iamVjdCBnZW5lcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgcHJvcGVydHlWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiBvc2dpQ29uZmlnQ2xhc3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDYWxsYmFjayByZXN1bHQgPSBudWxsOworCisgICAgICAgIGZpbmFsIFN0cmluZyBtZXRob2ROYW1lID0gInNldCIgKyBwcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDAsIDEpLnRvVXBwZXJDYXNlKCkgKyBwcm9wZXJ0eU5hbWUuc3Vic3RyaW5nKDEpOworICAgICAgICBmaW5hbCBNZXRob2QgbWV0aG9kID0gZ2V0TWV0aG9kQnlOYW1lKG1ldGhvZE5hbWUsIGdlbmVyYXRvci5nZXRDbGFzcygpKTsKKyAgICAgICAgaWYgKG1ldGhvZC5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aCAhPSAxKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIk1ldGhvZCAiICsgbWV0aG9kTmFtZSArICIgaXMgbm8gc2V0dGVyLCBpdCBkb2VzIG5vdCBleHBlY3QgZXhhY3RseSBvbmUgcGFyYW1ldGVyLCBidXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBDbGFzczw/PiBwYXJhbUNsYXp6ID0gbWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKClbMF07CisgICAgICAgIGlmIChwYXJhbUNsYXp6LmlzQXNzaWduYWJsZUZyb20ocHJvcGVydHlWYWx1ZS5nZXRDbGFzcygpKSkgeworICAgICAgICAgICAgbWV0aG9kLmludm9rZShnZW5lcmF0b3IsIHByb3BlcnR5VmFsdWUpOworICAgICAgICB9IGVsc2UgaWYgKEZpbGUuY2xhc3MuZXF1YWxzKHBhcmFtQ2xhenopICYmIHByb3BlcnR5VmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKworICAgICAgICAgICAgLyogVGhpcyBpcyBub3cgZGVwcmVjYXRlZCBhbmQgY2FuIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb25zLgorICAgICAgICAgICAgICogSXQncyBiZWluZyByZXBsYWNlZCBieSB0aGUgSW5wdXRTdHJlYW0gc3VwcG9ydCwgd2hpY2ggbXVzdCBiZSB1c2VkIGluCisgICAgICAgICAgICAgKiBhIEpFRSBlbnZpcm9ubWVudCBpbnN0ZWFkIG9mIGZpbGVzLgorICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIExPR0dFUi53YXJuaW5nKCJDb25maWd1cmluZyB0aGUgIiArIG1ldGhvZC5nZXREZWNsYXJpbmdDbGFzcygpLmdldFNpbXBsZU5hbWUoKQorICAgICAgICAgICAgICAgICAgICArICIgd2l0aCB0aGUgZmlsZSBiYXNlZCBwcm9wZXJ0eSAiICsgcHJvcGVydHlOYW1lICsgIiBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQiCisgICAgICAgICAgICAgICAgICAgICsgIiBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgamVyc2V5ISBZb3Ugc2hvdWxkIHVzZSB0aGUgSW5wdXRTdHJlYW0gYmFzZWQgcHJvcGVydHkgaW5zdGVhZC4iKTsKKworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZpbGVuYW1lID0gcHJvcGVydHlWYWx1ZS50b1N0cmluZygpOworICAgICAgICAgICAgaWYgKGZpbGVuYW1lLnN0YXJ0c1dpdGgoImNsYXNzcGF0aDoiKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzdHJpcHBlZEZpbGVuYW1lID0gZmlsZW5hbWUuc3Vic3RyaW5nKCJjbGFzc3BhdGg6Ii5sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgZmluYWwgVVJMIHJlc291cmNlID0gZ2VuZXJhdG9yLmdldENsYXNzKCkuZ2V0UmVzb3VyY2Uoc3RyaXBwZWRGaWxlbmFtZSk7CisgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoZSBmaWxlICciICsgc3RyaXBwZWRGaWxlbmFtZSArICInIGRvZXMgbm90IGV4aXN0IGluIHRoZSBjbGFzc3BhdGguIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBJdCdzIGxvYWRlZCBieSB0aGUgZ2VuZXJhdG9yIGNsYXNzLCBzbyBpZiB5b3UgdXNlIGEgcmVsYXRpdmUgZmlsZW5hbWUgaXQncyByZWxhdGl2ZSB0byIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgdGhlIGdlbmVyYXRvciBjbGFzcywgb3RoZXJ3aXNlIHlvdSBtaWdodCB3YW50IHRvIGxvYWQgaXQgdmlhIGFuIGFic29sdXRlIGNsYXNzcGF0aCByZWZlcmVuY2UgbGlrZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgY2xhc3NwYXRoOi9zb21lZmlsZS54bWwiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmluYWwgRmlsZSBmaWxlID0gbmV3IEZpbGUocmVzb3VyY2UudG9VUkkoKSk7CisgICAgICAgICAgICAgICAgbWV0aG9kLmludm9rZShnZW5lcmF0b3IsIGZpbGUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtZXRob2QuaW52b2tlKGdlbmVyYXRvciwgbmV3IEZpbGUoZmlsZW5hbWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChJbnB1dFN0cmVhbS5jbGFzcy5lcXVhbHMocGFyYW1DbGF6eikgJiYgcHJvcGVydHlWYWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJlc291cmNlID0gcHJvcGVydHlWYWx1ZS50b1N0cmluZygpOworICAgICAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgICAgIGlmIChsb2FkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxvYWRlciA9IFdhZGxHZW5lcmF0b3JMb2FkZXIuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGlzID0gUmVmbGVjdGlvbkhlbHBlci5nZXRSZXNvdXJjZUFzU3RyZWFtKGxvYWRlciwgb3NnaUNvbmZpZ0NsYXNzLCByZXNvdXJjZSk7CisgICAgICAgICAgICBpZiAoaXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBtZXNzYWdlID0gIlRoZSByZXNvdXJjZSAnIiArIHJlc291cmNlICsgIicgZG9lcyBub3QgZXhpc3QuIjsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBDYWxsYmFjaygpIHsKKworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNhbGxiYWNrKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgaXMuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5XQVJOSU5HLCAiQ291bGQgbm90IGNsb3NlIElucHV0U3RyZWFtIGZyb20gcmVzb3VyY2UgIiArIHJlc291cmNlLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICAvKiBpZiB0aGUgbWV0aG9kIGludm9jYXRpb24gZmFpbHMgd2UgbmVlZCB0byBjbG9zZSB0aGUgaW5wdXQgc3RyZWFtCisgICAgICAgICAgICAgKiBieSBvdXJzZWx2ZXMuLi4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBtZXRob2QuaW52b2tlKGdlbmVyYXRvciwgaXMpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBpcy5jbG9zZSgpOworICAgICAgICAgICAgICAgIHRocm93IGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvKiBkb2VzIHRoZSBwYXJhbSBjbGFzcyBwcm92aWRlIGEgY29uc3RydWN0b3IgZm9yIHN0cmluZz8KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgZmluYWwgQ29uc3RydWN0b3I8Pz4gcGFyYW1UeXBlQ29uc3RydWN0b3IgPSBwYXJhbUNsYXp6LmdldENvbnN0cnVjdG9yKHByb3BlcnR5VmFsdWUuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICBpZiAocGFyYW1UeXBlQ29uc3RydWN0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCB0eXBlZFByb3BlcnR5VmFsdWUgPSBwYXJhbVR5cGVDb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZShwcm9wZXJ0eVZhbHVlKTsKKyAgICAgICAgICAgICAgICBtZXRob2QuaW52b2tlKGdlbmVyYXRvciwgdHlwZWRQcm9wZXJ0eVZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRoZSBwcm9wZXJ0eSAnIiArIHByb3BlcnR5TmFtZSArICInIGNvdWxkIG5vdCBiZSBzZXQiCisgICAgICAgICAgICAgICAgICAgICAgICArICIgYmVjYXVzZSB0aGUgZXhwZWN0ZWQgcGFyYW1ldGVyIGlzIG5laXRoZXIgb2YgdHlwZSAiICsgcHJvcGVydHlWYWx1ZS5nZXRDbGFzcygpCisgICAgICAgICAgICAgICAgICAgICAgICArICIgbm9yIG9mIGFueSB0eXBlIHRoYXQgcHJvdmlkZXMgYSBjb25zdHJ1Y3RvciBleHBlY3RpbmcgYSAiICsgcHJvcGVydHlWYWx1ZS5nZXRDbGFzcygpICsgIi4iCisgICAgICAgICAgICAgICAgICAgICAgICArICIgVGhlIGV4cGVjdGVkIHBhcmFtZXRlciBpcyBvZiB0eXBlICIgKyBwYXJhbUNsYXp6LmdldE5hbWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE1ldGhvZCBnZXRNZXRob2RCeU5hbWUoZmluYWwgU3RyaW5nIG1ldGhvZE5hbWUsIGZpbmFsIENsYXNzPD8+IGNsYXp6KSB7CisgICAgICAgIGZvciAoTWV0aG9kIG1ldGhvZCA6IGNsYXp6LmdldE1ldGhvZHMoKSkgeworICAgICAgICAgICAgaWYgKG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKG1ldGhvZE5hbWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTWV0aG9kICciICsgbWV0aG9kTmFtZSArICInIG5vdCBmb3VuZCBmb3IgY2xhc3MgIiArIGNsYXp6LmdldE5hbWUoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgV2FkbEdlbmVyYXRvckNvbnRyb2wgeworCisgICAgICAgIFdhZGxHZW5lcmF0b3Igd2FkbEdlbmVyYXRvcjsKKyAgICAgICAgQ2FsbGJhY2sgY2FsbGJhY2s7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBjb25zdHJ1Y3Rvci4KKyAgICAgICAgICogQHBhcmFtIHdhZGxHZW5lcmF0b3IgdGhlIGdlbmVyYXRvciwgbXVzdCBub3QgYmUgbnVsbAorICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrLCBjYW4gYmUgbnVsbAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFdhZGxHZW5lcmF0b3JDb250cm9sKFdhZGxHZW5lcmF0b3Igd2FkbEdlbmVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgICAgICB0aGlzLndhZGxHZW5lcmF0b3IgPSB3YWRsR2VuZXJhdG9yOworICAgICAgICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50ZXJmYWNlIENhbGxiYWNrIHsKKworICAgICAgICB2b2lkIGNhbGxiYWNrKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2FsbGJhY2tMaXN0IGV4dGVuZHMgQXJyYXlMaXN0PENhbGxiYWNrPiBpbXBsZW1lbnRzIENhbGxiYWNrIHsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2FsbGJhY2sgYWxsIHJlZ2lzdGVyZWQge0BsaW5rIENhbGxiYWNrfSBpdGVtcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIGNhbGxiYWNrKCkgeworICAgICAgICAgICAgZm9yIChDYWxsYmFjayBjYWxsYmFjayA6IHRoaXMpIHsKKyAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsYmFjaygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFwcGVuZHMgdGhlIHNwZWNpZmllZCBlbGVtZW50IHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QsIGlmIHRoZSBlbGVtZW50IGlzIG5vdCBudWxsLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZSB0aGUgZWxlbWVudCB0byBhcHBlbmQsIGNhbiBiZSBudWxsLgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGVsZW1lbnQgd2FzIGFwcGVuZGVkIHRvIHRoZSBsaXN0LCBvdGhlcndpc2UgbnVsbC4KKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBhZGQoQ2FsbGJhY2sgZSkgeworICAgICAgICAgICAgcmV0dXJuIGUgIT0gbnVsbCA/IHN1cGVyLmFkZChlKSA6IGZhbHNlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9jb25maWcvcGFja2FnZS1pbmZvLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci93YWRsL2NvbmZpZy9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2RkY2E5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9jb25maWcvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoqCisgKiBKZXJzZXkgc2VydmVyLXNpZGUgV0FETCBjb25maWd1cmF0aW9uIGNsYXNzZXMuCisgKi8KK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuY29uZmlnOwpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9pbnRlcm5hbC9BcHBsaWNhdGlvbkRlc2NyaXB0aW9uLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci93YWRsL2ludGVybmFsL0FwcGxpY2F0aW9uRGVzY3JpcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWJlNGU4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9pbnRlcm5hbC9BcHBsaWNhdGlvbkRlc2NyaXB0aW9uLmphdmEKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuV2FkbEdlbmVyYXRvcjsKKworaW1wb3J0IGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5BcHBsaWNhdGlvbjsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGRlc2lnbmVkIHRvIGNvbWJpbmUgdGhlIEFwcGxpY2F0aW9uIGluc3RhbmNlIHdpdGggYW55IG90aGVyCisgKiBleHRlcm5hbCBtZXRhZGF0YSB0aGF0IG1pZ2h0IGJlIHJlcXVpcmVkIHRvIGRlc2NyaWJlIHRoZSBhcHBsaWNhdGlvbi4KKyAqCisgKiBAYXV0aG9yIEdlcmFyZCBEYXZpc29uCisgKi8KK3B1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbkRlc2NyaXB0aW9uIHsKKworICAgIHByaXZhdGUgQXBwbGljYXRpb24gX2FwcGxpY2F0aW9uOworICAgIHByaXZhdGUgV2FkbEdlbmVyYXRvci5FeHRlcm5hbEdyYW1tYXJEZWZpbml0aW9uIF9leHRlcm5hbEdyYW1tYXJEZWZpbml0b247CisKKyAgICBBcHBsaWNhdGlvbkRlc2NyaXB0aW9uKEFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uLCBXYWRsR2VuZXJhdG9yLkV4dGVybmFsR3JhbW1hckRlZmluaXRpb24gZXh0ZXJuYWxHcmFtbWFyRGVmaW5pdG9uKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRoaXMuX2FwcGxpY2F0aW9uID0gYXBwbGljYXRpb247CisgICAgICAgIHRoaXMuX2V4dGVybmFsR3JhbW1hckRlZmluaXRvbiA9IGV4dGVybmFsR3JhbW1hckRlZmluaXRvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIFRoZSBpbnN0YW5jZSBvZiB0aGUgYXBwbGljYXRpb24gb2JqZWN0CisgICAgICovCisgICAgcHVibGljIEFwcGxpY2F0aW9uIGdldEFwcGxpY2F0aW9uKCkgeworICAgICAgICByZXR1cm4gX2FwcGxpY2F0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSB0eXBlIGphdmEgY2xhc3MgdG8gYmUgcmVzb2x2ZWQuCisgICAgICogQHJldHVybiB0aGUgUU5hbWUgZm9yIHRoZSBnaXZlbiBDbGFzcyBpbiB0aGUgZ3JhbW1hci4KKyAgICAgKi8KKyAgICBwdWJsaWMgUU5hbWUgcmVzb2x2ZShDbGFzcyB0eXBlKSB7CisgICAgICAgIHJldHVybiBfZXh0ZXJuYWxHcmFtbWFyRGVmaW5pdG9uLnJlc29sdmUodHlwZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHBhdGggcGF0aCB0byBleHRlcm5hbCBtZXRhZGF0YS4KKyAgICAgKiBAcmV0dXJuIHRoZSBleHRlcm5hbCBtZXRhZGF0YSBmb3IgYSBnaXZlbiBVUkwsIGdlbmVyYWxseSBwcm92aWRlZCBhcyBhIHN1YiByZXNvdXJjZQorICAgICAqICAgICAgICAgb3IgdGhlIHJvb3QgYXBwbGljYXRpb24ud2FkbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRXh0ZXJuYWxHcmFtbWFyIGdldEV4dGVybmFsR3JhbW1hcihTdHJpbmcgcGF0aCkgeworICAgICAgICByZXR1cm4gX2V4dGVybmFsR3JhbW1hckRlZmluaXRvbi5tYXAuZ2V0KHBhdGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gQSBzZXQgb2YgYWxsIHRoZSBleHRlcm5hbCBtZXRhZGF0YSBrZXlzCisgICAgICovCisgICAgcHVibGljIFNldDxTdHJpbmc+IGdldEV4dGVybmFsTWV0YWRhdGFLZXlzKCkgeworICAgICAgICByZXR1cm4gX2V4dGVybmFsR3JhbW1hckRlZmluaXRvbi5tYXAua2V5U2V0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBzaW1wbGUgaG9sZGVyIGNsYXNzIHRoYXQgc3RvcmVzIGEgdHlwZSBhbmQgYmluYXJ5IGNvbnRlbnQKKyAgICAgKiB0byBiZSB1c2VkIHRvIHJldHVybiBleHRyYSBtZXRhZGF0YSB3aXRoCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeHRlcm5hbEdyYW1tYXIgeworCisgICAgICAgIHByaXZhdGUgTWVkaWFUeXBlIF90eXBlOworICAgICAgICBwcml2YXRlIGJ5dGVbXSBfY29udGVudDsKKworICAgICAgICBwdWJsaWMgRXh0ZXJuYWxHcmFtbWFyKE1lZGlhVHlwZSB0eXBlLCBieXRlW10gY29udGVudCkgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgICAgIHRoaXMuX3R5cGUgPSB0eXBlOworICAgICAgICAgICAgdGhpcy5fY29udGVudCA9IGNvbnRlbnQuY2xvbmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNZWRpYVR5cGUgZ2V0VHlwZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBfdHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBieXRlW10gZ2V0Q29udGVudCgpIHsKKyAgICAgICAgICAgIC8vIERlZmVuc2l2ZSBjb3B5CisgICAgICAgICAgICByZXR1cm4gX2NvbnRlbnQuY2xvbmUoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvaW50ZXJuYWwvV2FkbEFwcGxpY2F0aW9uQ29udGV4dEltcGwuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvaW50ZXJuYWwvV2FkbEFwcGxpY2F0aW9uQ29udGV4dEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWE2NDQ4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9pbnRlcm5hbC9XYWRsQXBwbGljYXRpb25Db250ZXh0SW1wbC5qYXZhCkBAIC0wLDAgKzEsMjU4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLmludGVybmFsOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlJlZmxlY3Rpb25IZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkV4dGVuZGVkUmVzb3VyY2VDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5XYWRsQXBwbGljYXRpb25Db250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLldhZGxHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuY29uZmlnLldhZGxHZW5lcmF0b3JDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuY29uZmlnLldhZGxHZW5lcmF0b3JDb25maWdMb2FkZXI7CisKK2ltcG9ydCBjb20uc3VuLnJlc2VhcmNoLndzLndhZGwuQXBwbGljYXRpb247CitpbXBvcnQgY29tLnN1bi5yZXNlYXJjaC53cy53YWRsLkRvYzsKK2ltcG9ydCBjb20uc3VuLnJlc2VhcmNoLndzLndhZGwuR3JhbW1hcnM7CitpbXBvcnQgY29tLnN1bi5yZXNlYXJjaC53cy53YWRsLkluY2x1ZGU7CitpbXBvcnQgY29tLnN1bi5yZXNlYXJjaC53cy53YWRsLlJlc291cmNlOworaW1wb3J0IGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5SZXNvdXJjZXM7CisKKy8qKgorICogV0FETCBhcHBsaWNhdGlvbiBjb250ZXh0IGltcGxlbWVudGF0aW9uLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFdhZGxBcHBsaWNhdGlvbkNvbnRleHRJbXBsIGltcGxlbWVudHMgV2FkbEFwcGxpY2F0aW9uQ29udGV4dCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihXYWRsQXBwbGljYXRpb25Db250ZXh0SW1wbC5jbGFzcy5nZXROYW1lKCkpOworCisgICAgLyoqCisgICAgICogSmVyc2V5IFdBREwgZXh0ZW5zaW9uIFhNTCBuYW1lc3BhY2UuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBXQURMX0pFUlNFWV9OQU1FU1BBQ0UgPSAiaHR0cDovL2plcnNleS5qYXZhLm5ldC8iOworICAgIC8qKgorICAgICAqIEplcnNleSBXQURMIGV4dGVuc2lvbiBYTUwgZWxlbWVudC4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgSkFYQkVsZW1lbnQgRVhURU5ERURfRUxFTUVOVCA9CisgICAgICAgICAgICBuZXcgSkFYQkVsZW1lbnQ8PihuZXcgUU5hbWUoV0FETF9KRVJTRVlfTkFNRVNQQUNFLCAiZXh0ZW5kZWQiLCAiamVyc2V5IiksIFN0cmluZy5jbGFzcywgInRydWUiKTsKKworICAgIHByaXZhdGUgZmluYWwgRXh0ZW5kZWRSZXNvdXJjZUNvbnRleHQgcmVzb3VyY2VDb250ZXh0OworICAgIHByaXZhdGUgZmluYWwgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyOworICAgIHByaXZhdGUgZmluYWwgV2FkbEdlbmVyYXRvckNvbmZpZyB3YWRsR2VuZXJhdG9yQ29uZmlnOworICAgIHByaXZhdGUgZmluYWwgSkFYQkNvbnRleHQgamF4YkNvbnRleHQ7CisKKyAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gd2FkbEdlbmVyYXRpb25FbmFibGVkID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIEluamVjdGlvbiBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbiBtYW5hZ2VyLgorICAgICAqIEBwYXJhbSBjb25maWd1cmF0aW9uICAgIHJ1bnRpbWUgYXBwbGljYXRpb24gY29uZmlndXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VDb250ZXh0ICBleHRlbmRlZCByZXNvdXJjZSBjb250ZXh0LgorICAgICAqLworICAgIEBJbmplY3QKKyAgICBwdWJsaWMgV2FkbEFwcGxpY2F0aW9uQ29udGV4dEltcGwoCisgICAgICAgICAgICBmaW5hbCBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIsCisgICAgICAgICAgICBmaW5hbCBDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICBmaW5hbCBFeHRlbmRlZFJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHQpIHsKKyAgICAgICAgdGhpcy5pbmplY3Rpb25NYW5hZ2VyID0gaW5qZWN0aW9uTWFuYWdlcjsKKyAgICAgICAgdGhpcy53YWRsR2VuZXJhdG9yQ29uZmlnID0gV2FkbEdlbmVyYXRvckNvbmZpZ0xvYWRlci5sb2FkV2FkbEdlbmVyYXRvcnNGcm9tQ29uZmlnKGNvbmZpZ3VyYXRpb24uZ2V0UHJvcGVydGllcygpKTsKKyAgICAgICAgdGhpcy5yZXNvdXJjZUNvbnRleHQgPSByZXNvdXJjZUNvbnRleHQ7CisKKyAgICAgICAgLy8gVE9ETyBwZXJoYXBzIHRoaXMgc2hvdWxkIGJlIGRvbmUgYW5vdGhlciB3YXkgZm9yIHRoZSBtb21lbnQKKyAgICAgICAgLy8gY3JlYXRlIGEgdGVtcG9yYXJ5IGdlbmVyYXRvciBqdXN0IHRvIGRvIHRoaXMgb25lIHRhc2sKKyAgICAgICAgZmluYWwgV2FkbEdlbmVyYXRvciB3YWRsR2VuZXJhdG9yID0gd2FkbEdlbmVyYXRvckNvbmZpZy5jcmVhdGVXYWRsR2VuZXJhdG9yKGluamVjdGlvbk1hbmFnZXIpOworCisgICAgICAgIEpBWEJDb250ZXh0IGpheGJDb250ZXh0Q2FuZGlkYXRlOworCisgICAgICAgIGZpbmFsIENsYXNzTG9hZGVyIGNvbnRleHRDbGFzc0xvYWRlciA9IEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKFJlZmxlY3Rpb25IZWxwZXIuZ2V0Q29udGV4dENsYXNzTG9hZGVyUEEoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBOYXN0eSBDbGFzc0xvYWRlciBtYWdpYy4gSkFYQi1BUEkgaGFzIHNvbWUgc3RyYW5nZSBsaW1pdGF0aW9uIGFib3V0IHdoYXQgY2xhc3MgbG9hZGVyIGNhbgorICAgICAgICAgICAgLy8gYmUgdXNlZCBpbiBPU0dpIGVudmlyb25tZW50IC0gaXQgbXVzdCBiZSBzYW1lIGFzIGNvbnRleHQgQ2xhc3NMb2FkZXIuIEZvbGxvd2luZyBjb2RlIGp1c3QKKyAgICAgICAgICAgIC8vIHdvcmthcm91bmRzIHRoaXMgbGltaXRhdGlvbgorICAgICAgICAgICAgLy8gc2VlIEpFUlNFWS0xODE4CisgICAgICAgICAgICAvLyBzZWUgSlNSMjIyLTQ2CisKKyAgICAgICAgICAgIGZpbmFsIENsYXNzTG9hZGVyIGplcnNleU1vZHVsZUNsYXNzTG9hZGVyID0KKyAgICAgICAgICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoUmVmbGVjdGlvbkhlbHBlci5nZXRDbGFzc0xvYWRlclBBKHdhZGxHZW5lcmF0b3IuZ2V0Q2xhc3MoKSkpOworCisgICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChSZWZsZWN0aW9uSGVscGVyLnNldENvbnRleHRDbGFzc0xvYWRlclBBKGplcnNleU1vZHVsZUNsYXNzTG9hZGVyKSk7CisKKyAgICAgICAgICAgIGpheGJDb250ZXh0Q2FuZGlkYXRlID0gSkFYQkNvbnRleHQubmV3SW5zdGFuY2Uod2FkbEdlbmVyYXRvci5nZXRSZXF1aXJlZEpheGJDb250ZXh0UGF0aCgpLCBqZXJzZXlNb2R1bGVDbGFzc0xvYWRlcik7CisKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSkFYQkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyBmYWxsYmFjayBmb3IgZ2xhc3NmaXNoCisgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5GSU5FLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5XQURMX0pBWEJfQ09OVEVYVF9GQUxMQkFDSygpLCBleCk7CisgICAgICAgICAgICAgICAgamF4YkNvbnRleHRDYW5kaWRhdGUgPSBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZSh3YWRsR2VuZXJhdG9yLmdldFJlcXVpcmVkSmF4YkNvbnRleHRQYXRoKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSkFYQkV4Y2VwdGlvbiBpbm5lckV4KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfV0FETF9KQVhCX0NPTlRFWFQoKSwgZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoUmVmbGVjdGlvbkhlbHBlci5zZXRDb250ZXh0Q2xhc3NMb2FkZXJQQShjb250ZXh0Q2xhc3NMb2FkZXIpKTsKKyAgICAgICAgfQorCisgICAgICAgIGpheGJDb250ZXh0ID0gamF4YkNvbnRleHRDYW5kaWRhdGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEFwcGxpY2F0aW9uRGVzY3JpcHRpb24gZ2V0QXBwbGljYXRpb24oZmluYWwgVXJpSW5mbyB1cmlJbmZvLCBmaW5hbCBib29sZWFuIGRldGFpbGVkV2FkbCkgeworICAgICAgICBmaW5hbCBBcHBsaWNhdGlvbkRlc2NyaXB0aW9uIGFwcGxpY2F0aW9uRGVzY3JpcHRpb24gPSBnZXRXYWRsQnVpbGRlcihkZXRhaWxlZFdhZGwsIHVyaUluZm8pCisgICAgICAgICAgICAgICAgLmdlbmVyYXRlKHJlc291cmNlQ29udGV4dC5nZXRSZXNvdXJjZU1vZGVsKCkuZ2V0Um9vdFJlc291cmNlcygpKTsKKyAgICAgICAgZmluYWwgQXBwbGljYXRpb24gYXBwbGljYXRpb24gPSBhcHBsaWNhdGlvbkRlc2NyaXB0aW9uLmdldEFwcGxpY2F0aW9uKCk7CisgICAgICAgIGZvciAoZmluYWwgUmVzb3VyY2VzIHJlc291cmNlcyA6IGFwcGxpY2F0aW9uLmdldFJlc291cmNlcygpKSB7CisgICAgICAgICAgICBpZiAocmVzb3VyY2VzLmdldEJhc2UoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmVzb3VyY2VzLnNldEJhc2UodXJpSW5mby5nZXRCYXNlVXJpKCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXR0YWNoRXh0ZXJuYWxHcmFtbWFyKGFwcGxpY2F0aW9uLCBhcHBsaWNhdGlvbkRlc2NyaXB0aW9uLCB1cmlJbmZvLmdldFJlcXVlc3RVcmkoKSk7CisgICAgICAgIHJldHVybiBhcHBsaWNhdGlvbkRlc2NyaXB0aW9uOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBcHBsaWNhdGlvbiBnZXRBcHBsaWNhdGlvbihmaW5hbCBVcmlJbmZvIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZSByZXNvdXJjZSwgZmluYWwgYm9vbGVhbiBkZXRhaWxlZFdhZGwpIHsKKworICAgICAgICAvLyBHZXQgdGhlIHJvb3QgYXBwbGljYXRpb24gZGVzY3JpcHRpb24KKyAgICAgICAgLy8KKworICAgICAgICBmaW5hbCBBcHBsaWNhdGlvbkRlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gZ2V0QXBwbGljYXRpb24oaW5mbywgZGV0YWlsZWRXYWRsKTsKKworICAgICAgICBmaW5hbCBXYWRsR2VuZXJhdG9yIHdhZGxHZW5lcmF0b3IgPSB3YWRsR2VuZXJhdG9yQ29uZmlnLmNyZWF0ZVdhZGxHZW5lcmF0b3IoaW5qZWN0aW9uTWFuYWdlcik7CisgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uID0gbmV3IFdhZGxCdWlsZGVyKHdhZGxHZW5lcmF0b3IsIGRldGFpbGVkV2FkbCwgaW5mbykuZ2VuZXJhdGUoZGVzY3JpcHRpb24sIHJlc291cmNlKTsKKyAgICAgICAgaWYgKGFwcGxpY2F0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChmaW5hbCBSZXNvdXJjZXMgcmVzb3VyY2VzIDogYXBwbGljYXRpb24uZ2V0UmVzb3VyY2VzKCkpIHsKKyAgICAgICAgICAgIHJlc291cmNlcy5zZXRCYXNlKGluZm8uZ2V0QmFzZVVyaSgpLnRvU3RyaW5nKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQXR0YWNoIGFueSBncmFtbWFyIHdlIG1heSBoYXZlCisKKyAgICAgICAgYXR0YWNoRXh0ZXJuYWxHcmFtbWFyKGFwcGxpY2F0aW9uLCBkZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICBpbmZvLmdldFJlcXVlc3RVcmkoKSk7CisKKyAgICAgICAgZm9yIChmaW5hbCBSZXNvdXJjZXMgcmVzb3VyY2VzIDogYXBwbGljYXRpb24uZ2V0UmVzb3VyY2VzKCkpIHsKKyAgICAgICAgICAgIGZpbmFsIFJlc291cmNlIHIgPSByZXNvdXJjZXMuZ2V0UmVzb3VyY2UoKS5nZXQoMCk7CisgICAgICAgICAgICByLnNldFBhdGgoaW5mby5nZXRCYXNlVXJpKCkucmVsYXRpdml6ZShpbmZvLmdldEFic29sdXRlUGF0aCgpKS50b1N0cmluZygpKTsKKworICAgICAgICAgICAgLy8gcmVtb3ZlIHBhdGggcGFyYW1zIHNpbmNlIHBhdGggaXMgZml4ZWQgYXQgdGhpcyBwb2ludAorICAgICAgICAgICAgci5nZXRQYXJhbSgpLmNsZWFyKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYXBwbGljYXRpb247CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEpBWEJDb250ZXh0IGdldEpBWEJDb250ZXh0KCkgeworICAgICAgICByZXR1cm4gamF4YkNvbnRleHQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBXYWRsQnVpbGRlciBnZXRXYWRsQnVpbGRlcihmaW5hbCBib29sZWFuIGRldGFpbGVkV2FkbCwgZmluYWwgVXJpSW5mbyB1cmlJbmZvKSB7CisgICAgICAgIHJldHVybiAodGhpcy53YWRsR2VuZXJhdGlvbkVuYWJsZWQgPyBuZXcgV2FkbEJ1aWxkZXIod2FkbEdlbmVyYXRvckNvbmZpZy5jcmVhdGVXYWRsR2VuZXJhdG9yKGluamVjdGlvbk1hbmFnZXIpLAorICAgICAgICAgICAgICAgIGRldGFpbGVkV2FkbCwgdXJpSW5mbykgOiBudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRXYWRsR2VuZXJhdGlvbkVuYWJsZWQoZmluYWwgYm9vbGVhbiB3YWRsR2VuZXJhdGlvbkVuYWJsZWQpIHsKKyAgICAgICAgdGhpcy53YWRsR2VuZXJhdGlvbkVuYWJsZWQgPSB3YWRsR2VuZXJhdGlvbkVuYWJsZWQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNXYWRsR2VuZXJhdGlvbkVuYWJsZWQoKSB7CisgICAgICAgIHJldHVybiB3YWRsR2VuZXJhdGlvbkVuYWJsZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXBkYXRlIHRoZSBhcHBsaWNhdGlvbiBvYmplY3QgdG8gaW5jbHVkZSB0aGUgZ2VuZXJhdGVkIGdyYW1tYXIgb2JqZWN0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYXR0YWNoRXh0ZXJuYWxHcmFtbWFyKAorICAgICAgICAgICAgZmluYWwgQXBwbGljYXRpb24gYXBwbGljYXRpb24sCisgICAgICAgICAgICBmaW5hbCBBcHBsaWNhdGlvbkRlc2NyaXB0aW9uIGFwcGxpY2F0aW9uRGVzY3JpcHRpb24sCisgICAgICAgICAgICBVUkkgcmVxdWVzdFVSSSkgeworCisgICAgICAgIC8vIE1hc3NhZ2UgdGhlIGFwcGxpY2F0aW9uLndhZGwgVVJJIHNsaWdodGx5IHRvIGdldCB0aGUgcmlnaHQgZWZmZWN0CisgICAgICAgIC8vCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZXF1ZXN0VVJJUGF0aCA9IHJlcXVlc3RVUkkuZ2V0UGF0aCgpOworCisgICAgICAgICAgICBpZiAocmVxdWVzdFVSSVBhdGguZW5kc1dpdGgoImFwcGxpY2F0aW9uLndhZGwiKSkgeworICAgICAgICAgICAgICAgIHJlcXVlc3RVUkkgPSBVcmlCdWlsZGVyLmZyb21VcmkocmVxdWVzdFVSSSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlUGF0aCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFVSSVBhdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3Vic3RyaW5nKDAsIHJlcXVlc3RVUklQYXRoLmxhc3RJbmRleE9mKCcvJykgKyAxKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcm9vdCA9IGFwcGxpY2F0aW9uLmdldFJlc291cmNlcygpLmdldCgwKS5nZXRCYXNlKCk7CisgICAgICAgICAgICBmaW5hbCBVcmlCdWlsZGVyIGV4dGVuZGVkUGF0aCA9IHJvb3QgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICA/IFVyaUJ1aWxkZXIuZnJvbVBhdGgocm9vdCkucGF0aCgiL2FwcGxpY2F0aW9uLndhZGwvIikgOiBVcmlCdWlsZGVyLmZyb21QYXRoKCIuL2FwcGxpY2F0aW9uLndhZGwvIik7CisgICAgICAgICAgICBmaW5hbCBVUkkgcm9vdFVSSSA9IHJvb3QgIT0gbnVsbCA/IFVyaUJ1aWxkZXIuZnJvbVBhdGgocm9vdCkuYnVpbGQoKSA6IG51bGw7CisKKyAgICAgICAgICAgIC8vIEFkZCBhIHJlZmVyZW5jZSB0byB0aGlzIGdyYW1tYXIKKyAgICAgICAgICAgIC8vCisKKyAgICAgICAgICAgIGZpbmFsIEdyYW1tYXJzIGdyYW1tYXJzOworICAgICAgICAgICAgaWYgKGFwcGxpY2F0aW9uLmdldEdyYW1tYXJzKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIExPR0dFUi5pbmZvKExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX1dBRExfR1JBTU1BUl9BTFJFQURZX0NPTlRBSU5TKCkpOworICAgICAgICAgICAgICAgIGdyYW1tYXJzID0gYXBwbGljYXRpb24uZ2V0R3JhbW1hcnMoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZ3JhbW1hcnMgPSBuZXcgR3JhbW1hcnMoKTsKKyAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbi5zZXRHcmFtbWFycyhncmFtbWFycyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENyZWF0ZSBhIHJlZmVyZW5jZSBiYWNrIHRvIHRoZSByb290IFdBREwKKyAgICAgICAgICAgIC8vCisKKyAgICAgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIHBhdGggOiBhcHBsaWNhdGlvbkRlc2NyaXB0aW9uLmdldEV4dGVybmFsTWV0YWRhdGFLZXlzKCkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBVUkkgc2NoZW1hVVJJID0gZXh0ZW5kZWRQYXRoLmNsb25lKCkucGF0aChwYXRoKS5idWlsZCgpOworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzY2hlbWFQYXRoID0gcm9vdFVSSSAhPSBudWxsID8gcmVxdWVzdFVSSS5yZWxhdGl2aXplKHNjaGVtYVVSSSkudG9TdHJpbmcoKSA6IHNjaGVtYVVSSS50b1N0cmluZygpOworCisgICAgICAgICAgICAgICAgZmluYWwgSW5jbHVkZSBpbmNsdWRlID0gbmV3IEluY2x1ZGUoKTsKKyAgICAgICAgICAgICAgICBpbmNsdWRlLnNldEhyZWYoc2NoZW1hUGF0aCk7CisgICAgICAgICAgICAgICAgZmluYWwgRG9jIGRvYyA9IG5ldyBEb2MoKTsKKyAgICAgICAgICAgICAgICBkb2Muc2V0TGFuZygiZW4iKTsKKyAgICAgICAgICAgICAgICBkb2Muc2V0VGl0bGUoIkdlbmVyYXRlZCIpOworICAgICAgICAgICAgICAgIGluY2x1ZGUuZ2V0RG9jKCkuYWRkKGRvYyk7CisKKyAgICAgICAgICAgICAgICAvLyBGaW5hbGx5IGFkZCB0byBsaXN0CisgICAgICAgICAgICAgICAgZ3JhbW1hcnMuZ2V0SW5jbHVkZSgpLmFkZChpbmNsdWRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX1dBRExfRVhURVJOQUxfR1JBTU1BUigpLCBlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvaW50ZXJuYWwvV2FkbEF1dG9EaXNjb3ZlcmFibGUuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvaW50ZXJuYWwvV2FkbEF1dG9EaXNjb3ZlcmFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTJjMjczCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9pbnRlcm5hbC9XYWRsQXV0b0Rpc2NvdmVyYWJsZS5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5OworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN0cmFpbmVkVG87CitpbXBvcnQgamF2YXgud3MucnMuUnVudGltZVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlQ29udGV4dDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnNwaS5BdXRvRGlzY292ZXJhYmxlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnNwaS5Gb3JjZWRBdXRvRGlzY292ZXJhYmxlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLldhZGxGZWF0dXJlOworCisvKioKKyAqIHtAbGluayBBdXRvRGlzY292ZXJhYmxlfSByZWdpc3RlcmluZyB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuV2FkbEZlYXR1cmV9IGlmIHRoaXMgZmVhdHVyZQorICogaXMgbm90IGFscmVhZHkgcmVnaXN0ZXJlZC4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQENvbnN0cmFpbmVkVG8oUnVudGltZVR5cGUuU0VSVkVSKQorQFByaW9yaXR5KEF1dG9EaXNjb3ZlcmFibGUuREVGQVVMVF9QUklPUklUWSkKK3B1YmxpYyBmaW5hbCBjbGFzcyBXYWRsQXV0b0Rpc2NvdmVyYWJsZSBpbXBsZW1lbnRzIEZvcmNlZEF1dG9EaXNjb3ZlcmFibGUgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY29uZmlndXJlKGZpbmFsIEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgaWYgKCFjb250ZXh0LmdldENvbmZpZ3VyYXRpb24oKS5pc1JlZ2lzdGVyZWQoV2FkbEZlYXR1cmUuY2xhc3MpKSB7CisgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKFdhZGxGZWF0dXJlLmNsYXNzKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvaW50ZXJuYWwvV2FkbEJ1aWxkZXIuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvaW50ZXJuYWwvV2FkbEJ1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGY2Y2FmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9pbnRlcm5hbC9XYWRsQnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsNDYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLkZvcm1QYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuVmVyc2lvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNZXRob2Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuV2FkbEdlbmVyYXRvcjsKKworaW1wb3J0IGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5BcHBsaWNhdGlvbjsKK2ltcG9ydCBjb20uc3VuLnJlc2VhcmNoLndzLndhZGwuRG9jOworaW1wb3J0IGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5QYXJhbTsKK2ltcG9ydCBjb20uc3VuLnJlc2VhcmNoLndzLndhZGwuUGFyYW1TdHlsZTsKK2ltcG9ydCBjb20uc3VuLnJlc2VhcmNoLndzLndhZGwuUmVwcmVzZW50YXRpb247CitpbXBvcnQgY29tLnN1bi5yZXNlYXJjaC53cy53YWRsLlJlcXVlc3Q7CitpbXBvcnQgY29tLnN1bi5yZXNlYXJjaC53cy53YWRsLlJlc291cmNlOworaW1wb3J0IGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5SZXNvdXJjZXM7CitpbXBvcnQgY29tLnN1bi5yZXNlYXJjaC53cy53YWRsLlJlc3BvbnNlOworCisvKioKKyAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgYWxnb3JpdGhtIGhvdyB0aGUgd2FkbCBpcyBidWlsdCBmb3Igb25lIG9yIG1vcmUge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZX0KKyAqIGNsYXNzZXMuIFdhZGwgYXJ0aWZhY3RzIGFyZSBjcmVhdGVkIGJ5IGEge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLldhZGxHZW5lcmF0b3J9LiBDcmVhdGVkIG9uOiBKdW4gMTgsIDIwMDg8YnI+CisgKgorICogQGF1dGhvciBNYXJjIEhhZGxleQorICogQGF1dGhvciBNYXJ0aW4gR3JvdHprZSAobWFydGluLmdyb3R6a2UgYXQgZnJlaWhlaXQuY29tKQorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgY2xhc3MgV2FkbEJ1aWxkZXIgeworCisgICAgcHJpdmF0ZSBmaW5hbCBXYWRsR2VuZXJhdG9yIF93YWRsR2VuZXJhdG9yOworICAgIHByaXZhdGUgZmluYWwgVXJpSW5mbyB1cmlJbmZvOworCisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGRldGFpbGVkV2FkbDsKKworICAgIHB1YmxpYyBXYWRsQnVpbGRlcihXYWRsR2VuZXJhdG9yIHdhZGxHZW5lcmF0b3IsIGJvb2xlYW4gZGV0YWlsZWRXYWRsLCBVcmlJbmZvIHVyaUluZm8pIHsKKyAgICAgICAgdGhpcy5kZXRhaWxlZFdhZGwgPSBkZXRhaWxlZFdhZGw7CisgICAgICAgIF93YWRsR2VuZXJhdG9yID0gd2FkbEdlbmVyYXRvcjsKKyAgICAgICAgdGhpcy51cmlJbmZvID0gdXJpSW5mbzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZSBXQURMIGZvciBhIHNldCBvZiByZXNvdXJjZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VzIHRoZSBzZXQgb2YgcmVzb3VyY2VzLgorICAgICAqIEByZXR1cm4gdGhlIEpBWEIgV0FETCBhcHBsaWNhdGlvbiBiZWFuLgorICAgICAqLworICAgIHB1YmxpYyBBcHBsaWNhdGlvbkRlc2NyaXB0aW9uIGdlbmVyYXRlKExpc3Q8b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlPiByZXNvdXJjZXMpIHsKKyAgICAgICAgQXBwbGljYXRpb24gd2FkbEFwcGxpY2F0aW9uID0gX3dhZGxHZW5lcmF0b3IuY3JlYXRlQXBwbGljYXRpb24oKTsKKyAgICAgICAgUmVzb3VyY2VzIHdhZGxSZXNvdXJjZXMgPSBfd2FkbEdlbmVyYXRvci5jcmVhdGVSZXNvdXJjZXMoKTsKKworICAgICAgICAvLyBmb3IgZWFjaCByZXNvdXJjZQorICAgICAgICBmb3IgKG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZSByIDogcmVzb3VyY2VzKSB7CisgICAgICAgICAgICBSZXNvdXJjZSB3YWRsUmVzb3VyY2UgPSBnZW5lcmF0ZVJlc291cmNlKHIsIHIuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgIGlmICh3YWRsUmVzb3VyY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd2FkbFJlc291cmNlcy5nZXRSZXNvdXJjZSgpLmFkZCh3YWRsUmVzb3VyY2UpOworICAgICAgICB9CisgICAgICAgIHdhZGxBcHBsaWNhdGlvbi5nZXRSZXNvdXJjZXMoKS5hZGQod2FkbFJlc291cmNlcyk7CisKKyAgICAgICAgYWRkVmVyc2lvbih3YWRsQXBwbGljYXRpb24pOworICAgICAgICBhZGRIaW50KHdhZGxBcHBsaWNhdGlvbik7CisKKyAgICAgICAgLy8gQnVpbGQgYW55IGV4dGVybmFsIGdyYW1tYXJzCisKKyAgICAgICAgV2FkbEdlbmVyYXRvci5FeHRlcm5hbEdyYW1tYXJEZWZpbml0aW9uIGV4dGVybmFsID0KKyAgICAgICAgICAgICAgICBfd2FkbEdlbmVyYXRvci5jcmVhdGVFeHRlcm5hbEdyYW1tYXIoKTsKKyAgICAgICAgLy8KKworICAgICAgICBBcHBsaWNhdGlvbkRlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gbmV3IEFwcGxpY2F0aW9uRGVzY3JpcHRpb24od2FkbEFwcGxpY2F0aW9uLCBleHRlcm5hbCk7CisKKyAgICAgICAgLy8gQXR0YWNoIHRoZSBkYXRhIHRvIHRoZSBwYXJ0cyBvZiB0aGUgbW9kZWwKKworICAgICAgICBfd2FkbEdlbmVyYXRvci5hdHRhY2hUeXBlcyhkZXNjcmlwdGlvbik7CisKKyAgICAgICAgLy8gUmV0dXJuIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgYXBwbGljYXRpb24KKworICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGUgV0FETCBmb3IgYSByZXNvdXJjZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZSAgICB0aGUgcmVzb3VyY2UKKyAgICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gdGhlIG92ZXJhbGwgYXBwbGljYXRpb24gZGVzY3JpcHRpb24gc28gd2UgY2FuCisgICAgICogQHJldHVybiB0aGUgSkFYQiBXQURMIGFwcGxpY2F0aW9uIGJlYW4KKyAgICAgKi8KKyAgICBwdWJsaWMgQXBwbGljYXRpb24gZ2VuZXJhdGUoCisgICAgICAgICAgICBBcHBsaWNhdGlvbkRlc2NyaXB0aW9uIGRlc2NyaXB0aW9uLAorICAgICAgICAgICAgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlIHJlc291cmNlKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBcHBsaWNhdGlvbiB3YWRsQXBwbGljYXRpb24gPSBfd2FkbEdlbmVyYXRvci5jcmVhdGVBcHBsaWNhdGlvbigpOworICAgICAgICAgICAgUmVzb3VyY2VzIHdhZGxSZXNvdXJjZXMgPSBfd2FkbEdlbmVyYXRvci5jcmVhdGVSZXNvdXJjZXMoKTsKKyAgICAgICAgICAgIFJlc291cmNlIHdhZGxSZXNvdXJjZSA9IGdlbmVyYXRlUmVzb3VyY2UocmVzb3VyY2UsIG51bGwpOworICAgICAgICAgICAgaWYgKHdhZGxSZXNvdXJjZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3YWRsUmVzb3VyY2VzLmdldFJlc291cmNlKCkuYWRkKHdhZGxSZXNvdXJjZSk7CisgICAgICAgICAgICB3YWRsQXBwbGljYXRpb24uZ2V0UmVzb3VyY2VzKCkuYWRkKHdhZGxSZXNvdXJjZXMpOworCisgICAgICAgICAgICBhZGRWZXJzaW9uKHdhZGxBcHBsaWNhdGlvbik7CisKKyAgICAgICAgICAgIC8vIEF0dGFjaCB0aGUgZGF0YSB0byB0aGUgcGFydHMgb2YgdGhlIG1vZGVsCisKKyAgICAgICAgICAgIF93YWRsR2VuZXJhdG9yLmF0dGFjaFR5cGVzKGRlc2NyaXB0aW9uKTsKKworICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBXQURMCisKKyAgICAgICAgICAgIHJldHVybiB3YWRsQXBwbGljYXRpb247CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9XQURMX0JVSUxERVJfR0VORVJBVElPTl9SRVNPVVJDRShyZXNvdXJjZSksIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFkZFZlcnNpb24oQXBwbGljYXRpb24gd2FkbEFwcGxpY2F0aW9uKSB7CisgICAgICAgIC8vIEluY2x1ZGUgSmVyc2V5IHZlcnNpb24gYXMgZG9jIGVsZW1lbnQgd2l0aCBnZW5lcmF0ZWRCeSBhdHRyaWJ1dGUKKyAgICAgICAgRG9jIGQgPSBuZXcgRG9jKCk7CisgICAgICAgIGQuZ2V0T3RoZXJBdHRyaWJ1dGVzKCkucHV0KG5ldyBRTmFtZShXYWRsQXBwbGljYXRpb25Db250ZXh0SW1wbC5XQURMX0pFUlNFWV9OQU1FU1BBQ0UsICJnZW5lcmF0ZWRCeSIsICJqZXJzZXkiKSwKKyAgICAgICAgICAgICAgICBWZXJzaW9uLmdldEJ1aWxkSWQoKSk7CisKKyAgICAgICAgd2FkbEFwcGxpY2F0aW9uLmdldERvYygpLmFkZChkKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkSGludChBcHBsaWNhdGlvbiB3YWRsQXBwbGljYXRpb24pIHsKKyAgICAgICAgLy8gVE9ETzogdGhpcyBub3QtbnVsbCBjaGVjayBpcyBoZXJlIG9ubHkgYmVjYXVzZSBvZiB1bml0IHRlc3RzCisgICAgICAgIGlmICh1cmlJbmZvICE9IG51bGwpIHsKKyAgICAgICAgICAgIERvYyBkID0gbmV3IERvYygpOworCisgICAgICAgICAgICBTdHJpbmcgbWVzc2FnZTsKKworICAgICAgICAgICAgaWYgKGRldGFpbGVkV2FkbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB1cmlXaXRob3V0UXVlcnlQYXJhbSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSh1cmlJbmZvLmdldFJlcXVlc3RVcmkoKSkucmVwbGFjZVF1ZXJ5KCIiKS5idWlsZCgpCisgICAgICAgICAgICAgICAgICAgICAgICAudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBtZXNzYWdlID0gTG9jYWxpemF0aW9uTWVzc2FnZXMuV0FETF9ET0NfRVhURU5ERURfV0FETChXYWRsVXRpbHMuREVUQUlMRURfV0FETF9RVUVSWV9QQVJBTSwgdXJpV2l0aG91dFF1ZXJ5UGFyYW0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdXJpV2l0aFF1ZXJ5UGFyYW0gPSBVcmlCdWlsZGVyLmZyb21VcmkodXJpSW5mby5nZXRSZXF1ZXN0VXJpKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAucXVlcnlQYXJhbShXYWRsVXRpbHMuREVUQUlMRURfV0FETF9RVUVSWV9QQVJBTSwgInRydWUiKS5idWlsZCgpLnRvU3RyaW5nKCk7CisKKyAgICAgICAgICAgICAgICBtZXNzYWdlID0gTG9jYWxpemF0aW9uTWVzc2FnZXMuV0FETF9ET0NfU0lNUExFX1dBREwoV2FkbFV0aWxzLkRFVEFJTEVEX1dBRExfUVVFUllfUEFSQU0sIHVyaVdpdGhRdWVyeVBhcmFtKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZC5nZXRPdGhlckF0dHJpYnV0ZXMoKS5wdXQobmV3IFFOYW1lKFdhZGxBcHBsaWNhdGlvbkNvbnRleHRJbXBsLldBRExfSkVSU0VZX05BTUVTUEFDRSwgImhpbnQiLCAiamVyc2V5IiksIG1lc3NhZ2UpOworICAgICAgICAgICAgd2FkbEFwcGxpY2F0aW9uLmdldERvYygpLmFkZChkKTsKKworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjb20uc3VuLnJlc2VhcmNoLndzLndhZGwuTWV0aG9kIGdlbmVyYXRlTWV0aG9kKAorICAgICAgICAgICAgZmluYWwgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlIHBhcmVudFJlc291cmNlLAorICAgICAgICAgICAgZmluYWwgTWFwPFN0cmluZywgUGFyYW0+IHdhZGxSZXNvdXJjZVBhcmFtcywKKyAgICAgICAgICAgIGZpbmFsIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCkgeworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoIWRldGFpbGVkV2FkbCAmJiByZXNvdXJjZU1ldGhvZC5pc0V4dGVuZGVkKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5NZXRob2Qgd2FkbE1ldGhvZCA9IF93YWRsR2VuZXJhdG9yLmNyZWF0ZU1ldGhvZChwYXJlbnRSZXNvdXJjZSwgcmVzb3VyY2VNZXRob2QpOworCisgICAgICAgICAgICAvLyBnZW5lcmF0ZSB0aGUgcmVxdWVzdCBwYXJ0CisgICAgICAgICAgICBSZXF1ZXN0IHdhZGxSZXF1ZXN0ID0gZ2VuZXJhdGVSZXF1ZXN0KHBhcmVudFJlc291cmNlLCByZXNvdXJjZU1ldGhvZCwgd2FkbFJlc291cmNlUGFyYW1zKTsKKyAgICAgICAgICAgIGlmICh3YWRsUmVxdWVzdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgd2FkbE1ldGhvZC5zZXRSZXF1ZXN0KHdhZGxSZXF1ZXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGdlbmVyYXRlIHRoZSByZXNwb25zZSBwYXJ0CisgICAgICAgICAgICBmaW5hbCBMaXN0PFJlc3BvbnNlPiByZXNwb25zZXMgPSBnZW5lcmF0ZVJlc3BvbnNlcyhwYXJlbnRSZXNvdXJjZSwgcmVzb3VyY2VNZXRob2QpOworICAgICAgICAgICAgaWYgKHJlc3BvbnNlcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgd2FkbE1ldGhvZC5nZXRSZXNwb25zZSgpLmFkZEFsbChyZXNwb25zZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHdhZGxNZXRob2Q7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfV0FETF9CVUlMREVSX0dFTkVSQVRJT05fTUVUSE9EKHJlc291cmNlTWV0aG9kLCBwYXJlbnRSZXNvdXJjZSksIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBSZXF1ZXN0IGdlbmVyYXRlUmVxdWVzdChvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2UgcGFyZW50UmVzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBQYXJhbT4gd2FkbFJlc291cmNlUGFyYW1zKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBMaXN0PFBhcmFtZXRlcj4gcmVxdWVzdFBhcmFtcyA9IG5ldyBMaW5rZWRMaXN0PD4ocmVzb3VyY2VNZXRob2QuZ2V0SW52b2NhYmxlKCkuZ2V0UGFyYW1ldGVycygpKTsKKyAgICAgICAgICAgIC8vIEFkZGluZyBoYW5kbGVyIGluc3RhbmNlIHBhcmFtZXRlcnMgdG8gdGhlIGxpc3Qgb2YgcG90ZW50aWFsIHJlcXVlc3QgcGFyYW1ldGVycy4KKyAgICAgICAgICAgIHJlcXVlc3RQYXJhbXMuYWRkQWxsKHJlc291cmNlTWV0aG9kLmdldEludm9jYWJsZSgpLmdldEhhbmRsZXIoKS5nZXRQYXJhbWV0ZXJzKCkpOworCisgICAgICAgICAgICBpZiAocmVxdWVzdFBhcmFtcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgUmVxdWVzdCB3YWRsUmVxdWVzdCA9IF93YWRsR2VuZXJhdG9yLmNyZWF0ZVJlcXVlc3QocGFyZW50UmVzb3VyY2UsIHJlc291cmNlTWV0aG9kKTsKKworICAgICAgICAgICAgcHJvY2Vzc1JlcXVlc3RQYXJhbWV0ZXJzKHBhcmVudFJlc291cmNlLCByZXNvdXJjZU1ldGhvZCwgd2FkbFJlc291cmNlUGFyYW1zLCByZXF1ZXN0UGFyYW1zLCB3YWRsUmVxdWVzdCk7CisKKyAgICAgICAgICAgIGlmICh3YWRsUmVxdWVzdC5nZXRSZXByZXNlbnRhdGlvbigpLnNpemUoKSArIHdhZGxSZXF1ZXN0LmdldFBhcmFtKCkuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHdhZGxSZXF1ZXN0OworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfV0FETF9CVUlMREVSX0dFTkVSQVRJT05fUkVRVUVTVCgKKyAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VNZXRob2QsIHBhcmVudFJlc291cmNlKSwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWN1cnNpdmVseSBwcm9jZXNzZXMgcHJvdmlkZWQgcmVxdWVzdCBwYXJhbWV0ZXJzIGFuZCBhZGRzIHRoZSByZXN1bHRpbmcgV0FETCBpbmZvcm1hdGlvbiBpbnRvIHRoZSBXQURMIHJlcXVlc3QuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NSZXF1ZXN0UGFyYW1ldGVycyhmaW5hbCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2UgcGFyZW50UmVzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIFBhcmFtPiB3YWRsUmVzb3VyY2VQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPFBhcmFtZXRlcj4gcmVxdWVzdFBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZXF1ZXN0IHdhZGxSZXF1ZXN0KSB7CisgICAgICAgIGZvciAoUGFyYW1ldGVyIHBhcmFtZXRlciA6IHJlcXVlc3RQYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICBpZiAocGFyYW1ldGVyLmdldFNvdXJjZSgpID09IFBhcmFtZXRlci5Tb3VyY2UuRU5USVRZIHx8IHBhcmFtZXRlci5nZXRTb3VyY2UoKSA9PSBQYXJhbWV0ZXIuU291cmNlLlVOS05PV04pIHsKKyAgICAgICAgICAgICAgICBmb3IgKE1lZGlhVHlwZSBtZWRpYVR5cGUgOiByZXNvdXJjZU1ldGhvZC5nZXRDb25zdW1lZFR5cGVzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2V0UmVwcmVzZW50YXRpb25Gb3JNZWRpYVR5cGUocGFyZW50UmVzb3VyY2UsIHJlc291cmNlTWV0aG9kLCBtZWRpYVR5cGUsIHdhZGxSZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcmFtZXRlci5nZXRTb3VyY2VBbm5vdGF0aW9uKCkuYW5ub3RhdGlvblR5cGUoKSA9PSBGb3JtUGFyYW0uY2xhc3MpIHsKKyAgICAgICAgICAgICAgICAvLyBVc2UgYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIGlmIG5vIEBDb25zdW1lcworICAgICAgICAgICAgICAgIExpc3Q8TWVkaWFUeXBlPiBzdXBwb3J0ZWRJbnB1dFR5cGVzID0gcmVzb3VyY2VNZXRob2QuZ2V0Q29uc3VtZWRUeXBlcygpOworICAgICAgICAgICAgICAgIGlmIChzdXBwb3J0ZWRJbnB1dFR5cGVzLmlzRW1wdHkoKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHN1cHBvcnRlZElucHV0VHlwZXMuc2l6ZSgpID09IDEgJiYgc3VwcG9ydGVkSW5wdXRUeXBlcy5nZXQoMCkuaXNXaWxkY2FyZFR5cGUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkSW5wdXRUeXBlcyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0ZPUk1fVVJMRU5DT0RFRF9UWVBFKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKE1lZGlhVHlwZSBtZWRpYVR5cGUgOiBzdXBwb3J0ZWRJbnB1dFR5cGVzKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlcHJlc2VudGF0aW9uIHdhZGxSZXByZXNlbnRhdGlvbiA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UmVwcmVzZW50YXRpb25Gb3JNZWRpYVR5cGUocGFyZW50UmVzb3VyY2UsIHJlc291cmNlTWV0aG9kLCBtZWRpYVR5cGUsIHdhZGxSZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFBhcmFtQnlOYW1lKHdhZGxSZXByZXNlbnRhdGlvbi5nZXRQYXJhbSgpLCBwYXJhbWV0ZXIuZ2V0U291cmNlTmFtZSgpKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBQYXJhbSB3YWRsUGFyYW0gPSBnZW5lcmF0ZVBhcmFtKHBhcmVudFJlc291cmNlLCByZXNvdXJjZU1ldGhvZCwgcGFyYW1ldGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3YWRsUGFyYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhZGxSZXByZXNlbnRhdGlvbi5nZXRQYXJhbSgpLmFkZCh3YWRsUGFyYW0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICgib3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LkZvcm1EYXRhUGFyYW0iLmVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyLmdldFNvdXJjZUFubm90YXRpb24oKS5hbm5vdGF0aW9uVHlwZSgpLmdldE5hbWUoKSkpIHsgLy8gamVyc2V5LW11bHRpcGFydCBzdXBwb3J0CisgICAgICAgICAgICAgICAgLy8gVXNlIG11bHRpcGFydC9mb3JtLWRhdGEgaWYgbm8gQENvbnN1bWVzCisgICAgICAgICAgICAgICAgTGlzdDxNZWRpYVR5cGU+IHN1cHBvcnRlZElucHV0VHlwZXMgPSByZXNvdXJjZU1ldGhvZC5nZXRDb25zdW1lZFR5cGVzKCk7CisgICAgICAgICAgICAgICAgaWYgKHN1cHBvcnRlZElucHV0VHlwZXMuaXNFbXB0eSgpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAoc3VwcG9ydGVkSW5wdXRUeXBlcy5zaXplKCkgPT0gMSAmJiBzdXBwb3J0ZWRJbnB1dFR5cGVzLmdldCgwKS5pc1dpbGRjYXJkVHlwZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWRJbnB1dFR5cGVzID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChNZWRpYVR5cGUuTVVMVElQQVJUX0ZPUk1fREFUQV9UWVBFKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmb3IgKE1lZGlhVHlwZSBtZWRpYVR5cGUgOiBzdXBwb3J0ZWRJbnB1dFR5cGVzKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlcHJlc2VudGF0aW9uIHdhZGxSZXByZXNlbnRhdGlvbiA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UmVwcmVzZW50YXRpb25Gb3JNZWRpYVR5cGUocGFyZW50UmVzb3VyY2UsIHJlc291cmNlTWV0aG9kLCBtZWRpYVR5cGUsIHdhZGxSZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGdldFBhcmFtQnlOYW1lKHdhZGxSZXByZXNlbnRhdGlvbi5nZXRQYXJhbSgpLCBwYXJhbWV0ZXIuZ2V0U291cmNlTmFtZSgpKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBQYXJhbSB3YWRsUGFyYW0gPSBnZW5lcmF0ZVBhcmFtKHBhcmVudFJlc291cmNlLCByZXNvdXJjZU1ldGhvZCwgcGFyYW1ldGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3YWRsUGFyYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhZGxSZXByZXNlbnRhdGlvbi5nZXRQYXJhbSgpLmFkZCh3YWRsUGFyYW0pOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJhbWV0ZXIgaW5zdGFuY2VvZiBQYXJhbWV0ZXIuQmVhblBhcmFtZXRlcikgeworICAgICAgICAgICAgICAgIHByb2Nlc3NSZXF1ZXN0UGFyYW1ldGVycyhwYXJlbnRSZXNvdXJjZSwgcmVzb3VyY2VNZXRob2QsIHdhZGxSZXNvdXJjZVBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICgoUGFyYW1ldGVyLkJlYW5QYXJhbWV0ZXIpIHBhcmFtZXRlcikuZ2V0UGFyYW1ldGVycygpLCB3YWRsUmVxdWVzdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFBhcmFtIHdhZGxQYXJhbSA9IGdlbmVyYXRlUGFyYW0ocGFyZW50UmVzb3VyY2UsIHJlc291cmNlTWV0aG9kLCBwYXJhbWV0ZXIpOworICAgICAgICAgICAgICAgIGlmICh3YWRsUGFyYW0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHdhZGxQYXJhbS5nZXRTdHlsZSgpID09IFBhcmFtU3R5bGUuVEVNUExBVEUgfHwgd2FkbFBhcmFtLmdldFN0eWxlKCkgPT0gUGFyYW1TdHlsZS5NQVRSSVgpIHsKKyAgICAgICAgICAgICAgICAgICAgd2FkbFJlc291cmNlUGFyYW1zLnB1dCh3YWRsUGFyYW0uZ2V0TmFtZSgpLCB3YWRsUGFyYW0pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHdhZGxSZXF1ZXN0LmdldFBhcmFtKCkuYWRkKHdhZGxQYXJhbSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBQYXJhbSBnZXRQYXJhbUJ5TmFtZShmaW5hbCBMaXN0PFBhcmFtPiBwYXJhbXMsIGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIGZvciAoUGFyYW0gcGFyYW0gOiBwYXJhbXMpIHsKKyAgICAgICAgICAgIGlmIChwYXJhbS5nZXROYW1lKCkuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSB0aGUgd2FkbCB7QGxpbmsgUmVwcmVzZW50YXRpb259IGZvciB0aGUgc3BlY2lmaWVkIHtAbGluayBNZWRpYVR5cGV9IGlmIG5vdCB5ZXQgZXhpc3RpbmcgZm9yIHRoZSB3YWRsIHtAbGluayBSZXF1ZXN0fQorICAgICAqIGFuZCByZXR1cm4gaXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gciAgICAgICAgICAgdGhlIHJlc291cmNlCisgICAgICogQHBhcmFtIG0gICAgICAgICAgIHRoZSByZXNvdXJjZSBtZXRob2QKKyAgICAgKiBAcGFyYW0gbWVkaWFUeXBlICAgYW4gYWNjZXB0ZWQgbWVkaWEgdHlwZSBvZiB0aGUgcmVzb3VyY2UgbWV0aG9kCisgICAgICogQHBhcmFtIHdhZGxSZXF1ZXN0IHRoZSB3YWRsIHJlcXVlc3QgdGhlIHdhZGwgcmVwcmVzZW50YXRpb24gaXMgdG8gYmUgY3JlYXRlZCBmb3IgKGlmIG5vdCB5ZXQgZXhpc3RpbmcpLgorICAgICAqIEByZXR1cm4gdGhlIHdhZGwgcmVxdWVzdCByZXByZXNlbnRhdGlvbiBmb3IgdGhlIHNwZWNpZmllZCB7QGxpbmsgTWVkaWFUeXBlfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFJlcHJlc2VudGF0aW9uIHNldFJlcHJlc2VudGF0aW9uRm9yTWVkaWFUeXBlKG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZSByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTWV0aG9kIG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVxdWVzdCB3YWRsUmVxdWVzdCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgUmVwcmVzZW50YXRpb24gd2FkbFJlcHJlc2VudGF0aW9uID0gZ2V0UmVwcmVzZW50YXRpb25CeU1lZGlhVHlwZSh3YWRsUmVxdWVzdC5nZXRSZXByZXNlbnRhdGlvbigpLCBtZWRpYVR5cGUpOworICAgICAgICAgICAgaWYgKHdhZGxSZXByZXNlbnRhdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgd2FkbFJlcHJlc2VudGF0aW9uID0gX3dhZGxHZW5lcmF0b3IuY3JlYXRlUmVxdWVzdFJlcHJlc2VudGF0aW9uKHIsIG0sIG1lZGlhVHlwZSk7CisgICAgICAgICAgICAgICAgd2FkbFJlcXVlc3QuZ2V0UmVwcmVzZW50YXRpb24oKS5hZGQod2FkbFJlcHJlc2VudGF0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB3YWRsUmVwcmVzZW50YXRpb247CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9XQURMX0JVSUxERVJfR0VORVJBVElPTl9SRVFVRVNUX01FRElBX1RZUEUobWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICBtLCByKSwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFJlcHJlc2VudGF0aW9uIGdldFJlcHJlc2VudGF0aW9uQnlNZWRpYVR5cGUoCisgICAgICAgICAgICBmaW5hbCBMaXN0PFJlcHJlc2VudGF0aW9uPiByZXByZXNlbnRhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgZm9yIChSZXByZXNlbnRhdGlvbiByZXByZXNlbnRhdGlvbiA6IHJlcHJlc2VudGF0aW9ucykgeworICAgICAgICAgICAgaWYgKG1lZGlhVHlwZS50b1N0cmluZygpLmVxdWFscyhyZXByZXNlbnRhdGlvbi5nZXRNZWRpYVR5cGUoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVwcmVzZW50YXRpb247CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBQYXJhbSBnZW5lcmF0ZVBhcmFtKGZpbmFsIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZSByZXNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTWV0aG9kIG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUGFyYW1ldGVyIHBhcmFtKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAocGFyYW0uZ2V0U291cmNlKCkgPT0gUGFyYW1ldGVyLlNvdXJjZS5FTlRJVFkgfHwgcGFyYW0uZ2V0U291cmNlKCkgPT0gUGFyYW1ldGVyLlNvdXJjZS5DT05URVhUKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gX3dhZGxHZW5lcmF0b3IuY3JlYXRlUGFyYW0ocmVzb3VyY2UsIG1ldGhvZCwgcGFyYW0pOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfV0FETF9CVUlMREVSX0dFTkVSQVRJT05fUEFSQU0ocGFyYW0sIHJlc291cmNlLCBtZXRob2QpLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgUmVzb3VyY2UgZ2VuZXJhdGVSZXNvdXJjZShvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2UgciwgU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgcmV0dXJuIGdlbmVyYXRlUmVzb3VyY2UociwgcGF0aCwgQ29sbGVjdGlvbnMuPG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZT5lbXB0eVNldCgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlc291cmNlIGdlbmVyYXRlUmVzb3VyY2UoZmluYWwgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0PG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZT4gdmlzaXRlZFJlc291cmNlcykgeworICAgICAgICB0cnkgeworCisgICAgICAgICAgICBpZiAoIWRldGFpbGVkV2FkbCAmJiByZXNvdXJjZS5pc0V4dGVuZGVkKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFJlc291cmNlIHdhZGxSZXNvdXJjZSA9IF93YWRsR2VuZXJhdG9yLmNyZWF0ZVJlc291cmNlKHJlc291cmNlLCBwYXRoKTsKKworICAgICAgICAgICAgLy8gcHJldmVudCBpbmZpbml0ZSByZWN1cnNpb24KKyAgICAgICAgICAgIGlmICh2aXNpdGVkUmVzb3VyY2VzLmNvbnRhaW5zKHJlc291cmNlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB3YWRsUmVzb3VyY2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHZpc2l0ZWRSZXNvdXJjZXMgPSBuZXcgSGFzaFNldDw+KHZpc2l0ZWRSZXNvdXJjZXMpOworICAgICAgICAgICAgICAgIHZpc2l0ZWRSZXNvdXJjZXMuYWRkKHJlc291cmNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gaWYgdGhlIHJlc291cmNlIGNvbnRhaW5zIHN1YnJlc291cmNlIGxvY2F0b3IgY3JlYXRlIG5ldyByZXNvdXJjZSBmb3IgdGhpcyBsb2NhdG9yIGFuZCByZXR1cm4gaXQgaW5zdGVhZAorICAgICAgICAgICAgLy8gb2YgdGhpcyByZXNvdXJjZQorICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VNZXRob2QgbG9jYXRvciA9IHJlc291cmNlLmdldFJlc291cmNlTG9jYXRvcigpOworICAgICAgICAgICAgaWYgKGxvY2F0b3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZS5CdWlsZGVyIGJ1aWxkZXIgPSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGRlcihsb2NhdG9yLmdldEludm9jYWJsZSgpLmdldFJhd1Jlc3BvbnNlVHlwZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ1aWxkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGV4YW1wbGUgaW4gdGhlIGNhc2UgdGhlIHJldHVybiB0eXBlIG9mIHRoZSBzdWIgcmVzb3VyY2UgbG9jYXRvciBpcyBPYmplY3QKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2UuYnVpbGRlcigpLnBhdGgocmVzb3VyY2UuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2Ugc3ViUmVzb3VyY2UgPSBidWlsZGVyLmJ1aWxkKCk7CisKKyAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2Ugd2FkbFN1YlJlc291cmNlID0gZ2VuZXJhdGVSZXNvdXJjZShzdWJSZXNvdXJjZSwgcmVzb3VyY2UuZ2V0UGF0aCgpLCB2aXNpdGVkUmVzb3VyY2VzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHdhZGxTdWJSZXNvdXJjZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAobG9jYXRvci5pc0V4dGVuZGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdhZGxTdWJSZXNvdXJjZS5nZXRBbnkoKS5hZGQoV2FkbEFwcGxpY2F0aW9uQ29udGV4dEltcGwuRVhURU5ERURfRUxFTUVOVCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3IgKFBhcmFtZXRlciBwYXJhbSA6IGxvY2F0b3IuZ2V0SW52b2NhYmxlKCkuZ2V0UGFyYW1ldGVycygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbSB3YWRsUGFyYW0gPSBnZW5lcmF0ZVBhcmFtKHJlc291cmNlLCBsb2NhdG9yLCBwYXJhbSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3YWRsUGFyYW0gIT0gbnVsbCAmJiB3YWRsUGFyYW0uZ2V0U3R5bGUoKSA9PSBQYXJhbVN0eWxlLlRFTVBMQVRFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FkbFN1YlJlc291cmNlLmdldFBhcmFtKCkuYWRkKHdhZGxQYXJhbSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdhZGxTdWJSZXNvdXJjZTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfV0FETF9CVUlMREVSX0dFTkVSQVRJT05fUkVTT1VSQ0VfTE9DQVRPUihsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlKSwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBNYXA8U3RyaW5nLCBQYXJhbT4gd2FkbFJlc291cmNlUGFyYW1zID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICAgICAgLy8gZm9yIGVhY2ggcmVzb3VyY2UgbWV0aG9kCisgICAgICAgICAgICBmb3IgKG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1ldGhvZCBtZXRob2QgOiByZXNvdXJjZS5nZXRSZXNvdXJjZU1ldGhvZHMoKSkgeworICAgICAgICAgICAgICAgIGlmICghZGV0YWlsZWRXYWRsICYmIG1ldGhvZC5pc0V4dGVuZGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5NZXRob2Qgd2FkbE1ldGhvZCA9IGdlbmVyYXRlTWV0aG9kKHJlc291cmNlLCB3YWRsUmVzb3VyY2VQYXJhbXMsIG1ldGhvZCk7CisgICAgICAgICAgICAgICAgd2FkbFJlc291cmNlLmdldE1ldGhvZE9yUmVzb3VyY2UoKS5hZGQod2FkbE1ldGhvZCk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGFkZCBtZXRob2QgcGFyYW1ldGVycyB0aGF0IGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc291cmNlIFBBVEggdGVtcGxhdGUKKyAgICAgICAgICAgIGZvciAoUGFyYW0gd2FkbFBhcmFtIDogd2FkbFJlc291cmNlUGFyYW1zLnZhbHVlcygpKSB7CisgICAgICAgICAgICAgICAgd2FkbFJlc291cmNlLmdldFBhcmFtKCkuYWRkKHdhZGxQYXJhbSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGZvciBlYWNoIHN1Yi1yZXNvdXJjZSBtZXRob2QKKyAgICAgICAgICAgIE1hcDxTdHJpbmcsIFJlc291cmNlPiB3YWRsU3ViUmVzb3VyY2VzID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICAgICAgTWFwPFN0cmluZywgTWFwPFN0cmluZywgUGFyYW0+PiB3YWRsU3ViUmVzb3VyY2VzUGFyYW1zID0gbmV3IEhhc2hNYXA8PigpOworCisgICAgICAgICAgICBmb3IgKG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZSBjaGlsZFJlc291cmNlIDogcmVzb3VyY2UuZ2V0Q2hpbGRSZXNvdXJjZXMoKSkgeworICAgICAgICAgICAgICAgIFJlc291cmNlIGNoaWxkV2FkbFJlc291cmNlID0gZ2VuZXJhdGVSZXNvdXJjZShjaGlsZFJlc291cmNlLCBjaGlsZFJlc291cmNlLmdldFBhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpc2l0ZWRSZXNvdXJjZXMpOworICAgICAgICAgICAgICAgIGlmIChjaGlsZFdhZGxSZXNvdXJjZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3YWRsUmVzb3VyY2UuZ2V0TWV0aG9kT3JSZXNvdXJjZSgpLmFkZChjaGlsZFdhZGxSZXNvdXJjZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB3YWRsUmVzb3VyY2U7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9XQURMX0JVSUxERVJfR0VORVJBVElPTl9SRVNPVVJDRV9QQVRIKHJlc291cmNlLCBwYXRoKSwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8UmVzcG9uc2U+IGdlbmVyYXRlUmVzcG9uc2VzKG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZSByLCBmaW5hbCBSZXNvdXJjZU1ldGhvZCBtKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAobS5nZXRJbnZvY2FibGUoKS5nZXRSYXdSZXNwb25zZVR5cGUoKSA9PSB2b2lkLmNsYXNzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gX3dhZGxHZW5lcmF0b3IuY3JlYXRlUmVzcG9uc2VzKHIsIG0pOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfV0FETF9CVUlMREVSX0dFTkVSQVRJT05fUkVTUE9OU0UobSwgciksIGUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9pbnRlcm5hbC9XYWRsR2VuZXJhdG9ySW1wbC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9pbnRlcm5hbC9XYWRsR2VuZXJhdG9ySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNzAzZTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci93YWRsL2ludGVybmFsL1dhZGxHZW5lcmF0b3JJbXBsLmphdmEKQEAgLTAsMCArMSwyMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlBhcmFtZXRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNZXRob2Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuV2FkbEdlbmVyYXRvcjsKKworaW1wb3J0IGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5BcHBsaWNhdGlvbjsKK2ltcG9ydCBjb20uc3VuLnJlc2VhcmNoLndzLndhZGwuUGFyYW07CitpbXBvcnQgY29tLnN1bi5yZXNlYXJjaC53cy53YWRsLlBhcmFtU3R5bGU7CitpbXBvcnQgY29tLnN1bi5yZXNlYXJjaC53cy53YWRsLlJlcHJlc2VudGF0aW9uOworaW1wb3J0IGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5SZXF1ZXN0OworaW1wb3J0IGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5SZXNvdXJjZTsKK2ltcG9ydCBjb20uc3VuLnJlc2VhcmNoLndzLndhZGwuUmVzb3VyY2VzOworaW1wb3J0IGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5SZXNwb25zZTsKKworLyoqCisgKiBUaGlzIFdhZGxHZW5lcmF0b3IgY3JlYXRlcyB0aGUgYmFzaWMgd2FkbCBhcnRpZmFjdHMuPGJyPgorICogQ3JlYXRlZCBvbjogSnVuIDE2LCAyMDA4PGJyPgorICoKKyAqIEBhdXRob3IgTWFydGluIEdyb3R6a2UgKG1hcnRpbi5ncm90emtlIGF0IGZyZWloZWl0LmNvbSkKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIFdhZGxHZW5lcmF0b3JJbXBsIGltcGxlbWVudHMgV2FkbEdlbmVyYXRvciB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlcXVpcmVkSmF4YkNvbnRleHRQYXRoKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgbmFtZSA9IEFwcGxpY2F0aW9uLmNsYXNzLmdldE5hbWUoKTsKKyAgICAgICAgcmV0dXJuIG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGFzdEluZGV4T2YoJy4nKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaW5pdCgpIHsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRXYWRsR2VuZXJhdG9yRGVsZWdhdGUoV2FkbEdlbmVyYXRvciBkZWxlZ2F0ZSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vIGRlbGVnYXRlIHN1cHBvcnRlZC4iKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb3VyY2VzIGNyZWF0ZVJlc291cmNlcygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZXMoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQXBwbGljYXRpb24gY3JlYXRlQXBwbGljYXRpb24oKSB7CisgICAgICAgIHJldHVybiBuZXcgQXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgY29tLnN1bi5yZXNlYXJjaC53cy53YWRsLk1ldGhvZCBjcmVhdGVNZXRob2QoCisgICAgICAgICAgICBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2UgciwgZmluYWwgUmVzb3VyY2VNZXRob2QgbSkgeworICAgICAgICBjb20uc3VuLnJlc2VhcmNoLndzLndhZGwuTWV0aG9kIHdhZGxNZXRob2QgPQorICAgICAgICAgICAgICAgIG5ldyBjb20uc3VuLnJlc2VhcmNoLndzLndhZGwuTWV0aG9kKCk7CisgICAgICAgIHdhZGxNZXRob2Quc2V0TmFtZShtLmdldEh0dHBNZXRob2QoKSk7CisgICAgICAgIHdhZGxNZXRob2Quc2V0SWQobS5nZXRJbnZvY2FibGUoKS5nZXREZWZpbml0aW9uTWV0aG9kKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgaWYgKG0uaXNFeHRlbmRlZCgpKSB7CisgICAgICAgICAgICB3YWRsTWV0aG9kLmdldEFueSgpLmFkZChXYWRsQXBwbGljYXRpb25Db250ZXh0SW1wbC5FWFRFTkRFRF9FTEVNRU5UKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gd2FkbE1ldGhvZDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVwcmVzZW50YXRpb24gY3JlYXRlUmVxdWVzdFJlcHJlc2VudGF0aW9uKG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZSByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VNZXRob2QgbSwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICBSZXByZXNlbnRhdGlvbiB3YWRsUmVwcmVzZW50YXRpb24gPSBuZXcgUmVwcmVzZW50YXRpb24oKTsKKyAgICAgICAgd2FkbFJlcHJlc2VudGF0aW9uLnNldE1lZGlhVHlwZShtZWRpYVR5cGUudG9TdHJpbmcoKSk7CisgICAgICAgIHJldHVybiB3YWRsUmVwcmVzZW50YXRpb247CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlcXVlc3QgY3JlYXRlUmVxdWVzdChvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2UgciwgUmVzb3VyY2VNZXRob2QgbSkgeworICAgICAgICByZXR1cm4gbmV3IFJlcXVlc3QoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUGFyYW0gY3JlYXRlUGFyYW0ob3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlIHIsIFJlc291cmNlTWV0aG9kIG0sIGZpbmFsIFBhcmFtZXRlciBwKSB7CisKKyAgICAgICAgaWYgKHAuZ2V0U291cmNlKCkgPT0gUGFyYW1ldGVyLlNvdXJjZS5VTktOT1dOKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIFBhcmFtIHdhZGxQYXJhbSA9IG5ldyBQYXJhbSgpOworICAgICAgICB3YWRsUGFyYW0uc2V0TmFtZShwLmdldFNvdXJjZU5hbWUoKSk7CisKKyAgICAgICAgc3dpdGNoIChwLmdldFNvdXJjZSgpKSB7CisgICAgICAgICAgICBjYXNlIEZPUk06CisgICAgICAgICAgICAgICAgd2FkbFBhcmFtLnNldFN0eWxlKFBhcmFtU3R5bGUuUVVFUlkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBRVUVSWToKKyAgICAgICAgICAgICAgICB3YWRsUGFyYW0uc2V0U3R5bGUoUGFyYW1TdHlsZS5RVUVSWSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1BVFJJWDoKKyAgICAgICAgICAgICAgICB3YWRsUGFyYW0uc2V0U3R5bGUoUGFyYW1TdHlsZS5NQVRSSVgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBQQVRIOgorICAgICAgICAgICAgICAgIHdhZGxQYXJhbS5zZXRTdHlsZShQYXJhbVN0eWxlLlRFTVBMQVRFKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgSEVBREVSOgorICAgICAgICAgICAgICAgIHdhZGxQYXJhbS5zZXRTdHlsZShQYXJhbVN0eWxlLkhFQURFUik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIENPT0tJRToKKyAgICAgICAgICAgICAgICAvLyBHZW5lcmF0ZXMgbmFtZT0iQ29va2llIiBwYXRoPSI8bmFtZT4iCisgICAgICAgICAgICAgICAgd2FkbFBhcmFtLnNldFN0eWxlKFBhcmFtU3R5bGUuSEVBREVSKTsKKyAgICAgICAgICAgICAgICB3YWRsUGFyYW0uc2V0TmFtZSgiQ29va2llIik7CisgICAgICAgICAgICAgICAgd2FkbFBhcmFtLnNldFBhdGgocC5nZXRTb3VyY2VOYW1lKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwLmhhc0RlZmF1bHRWYWx1ZSgpKSB7CisgICAgICAgICAgICB3YWRsUGFyYW0uc2V0RGVmYXVsdChwLmdldERlZmF1bHRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBDbGFzczw/PiBwQ2xhc3MgPSBwLmdldFJhd1R5cGUoKTsKKyAgICAgICAgaWYgKHBDbGFzcy5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgIHdhZGxQYXJhbS5zZXRSZXBlYXRpbmcodHJ1ZSk7CisgICAgICAgICAgICBwQ2xhc3MgPSBwQ2xhc3MuZ2V0Q29tcG9uZW50VHlwZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChwQ2xhc3MuZXF1YWxzKGludC5jbGFzcykgfHwgcENsYXNzLmVxdWFscyhJbnRlZ2VyLmNsYXNzKSkgeworICAgICAgICAgICAgd2FkbFBhcmFtLnNldFR5cGUobmV3IFFOYW1lKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIsICJpbnQiLCAieHMiKSk7CisgICAgICAgIH0gZWxzZSBpZiAocENsYXNzLmVxdWFscyhib29sZWFuLmNsYXNzKSB8fCBwQ2xhc3MuZXF1YWxzKEJvb2xlYW4uY2xhc3MpKSB7CisgICAgICAgICAgICB3YWRsUGFyYW0uc2V0VHlwZShuZXcgUU5hbWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiwgImJvb2xlYW4iLCAieHMiKSk7CisgICAgICAgIH0gZWxzZSBpZiAocENsYXNzLmVxdWFscyhsb25nLmNsYXNzKSB8fCBwQ2xhc3MuZXF1YWxzKExvbmcuY2xhc3MpKSB7CisgICAgICAgICAgICB3YWRsUGFyYW0uc2V0VHlwZShuZXcgUU5hbWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiwgImxvbmciLCAieHMiKSk7CisgICAgICAgIH0gZWxzZSBpZiAocENsYXNzLmVxdWFscyhzaG9ydC5jbGFzcykgfHwgcENsYXNzLmVxdWFscyhTaG9ydC5jbGFzcykpIHsKKyAgICAgICAgICAgIHdhZGxQYXJhbS5zZXRUeXBlKG5ldyBRTmFtZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLCAic2hvcnQiLCAieHMiKSk7CisgICAgICAgIH0gZWxzZSBpZiAocENsYXNzLmVxdWFscyhieXRlLmNsYXNzKSB8fCBwQ2xhc3MuZXF1YWxzKEJ5dGUuY2xhc3MpKSB7CisgICAgICAgICAgICB3YWRsUGFyYW0uc2V0VHlwZShuZXcgUU5hbWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiwgImJ5dGUiLCAieHMiKSk7CisgICAgICAgIH0gZWxzZSBpZiAocENsYXNzLmVxdWFscyhmbG9hdC5jbGFzcykgfHwgcENsYXNzLmVxdWFscyhGbG9hdC5jbGFzcykpIHsKKyAgICAgICAgICAgIHdhZGxQYXJhbS5zZXRUeXBlKG5ldyBRTmFtZSgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiLCAiZmxvYXQiLCAieHMiKSk7CisgICAgICAgIH0gZWxzZSBpZiAocENsYXNzLmVxdWFscyhkb3VibGUuY2xhc3MpIHx8IHBDbGFzcy5lcXVhbHMoRG91YmxlLmNsYXNzKSkgeworICAgICAgICAgICAgd2FkbFBhcmFtLnNldFR5cGUobmV3IFFOYW1lKCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIsICJkb3VibGUiLCAieHMiKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3YWRsUGFyYW0uc2V0VHlwZShuZXcgUU5hbWUoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiwgInN0cmluZyIsICJ4cyIpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gd2FkbFBhcmFtOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2UgcmVzb3VyY2UsIFN0cmluZyBwYXRoKSB7CisgICAgICAgIFJlc291cmNlIHdhZGxSZXNvdXJjZSA9IG5ldyBSZXNvdXJjZSgpOworICAgICAgICBpZiAocGF0aCAhPSBudWxsKSB7CisgICAgICAgICAgICB3YWRsUmVzb3VyY2Uuc2V0UGF0aChwYXRoKTsKKyAgICAgICAgfSBlbHNlIGlmIChyZXNvdXJjZS5nZXRQYXRoKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgd2FkbFJlc291cmNlLnNldFBhdGgocmVzb3VyY2UuZ2V0UGF0aCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXNvdXJjZS5pc0V4dGVuZGVkKCkpIHsKKworICAgICAgICAgICAgd2FkbFJlc291cmNlLmdldEFueSgpLmFkZChXYWRsQXBwbGljYXRpb25Db250ZXh0SW1wbC5FWFRFTkRFRF9FTEVNRU5UKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB3YWRsUmVzb3VyY2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8UmVzcG9uc2U+IGNyZWF0ZVJlc3BvbnNlcyhvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2UgciwgUmVzb3VyY2VNZXRob2QgbSkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IG5ldyBSZXNwb25zZSgpOworCisgICAgICAgIC8vIGFkZCBtZWRpYVR5cGU9IiovKiIgaW4gY2FzZSB0aGF0IG5vIG1lZGlhVHlwZSB3YXMgc3BlY2lmaWVkCisgICAgICAgIGlmIChoYXNFbXB0eVByb2R1Y2libGVNZWRpYVR5cGVTZXQobSkpIHsKKyAgICAgICAgICAgIFJlcHJlc2VudGF0aW9uIHdhZGxSZXByZXNlbnRhdGlvbiA9IGNyZWF0ZVJlc3BvbnNlUmVwcmVzZW50YXRpb24ociwgbSwgTWVkaWFUeXBlLldJTERDQVJEX1RZUEUpOworICAgICAgICAgICAgcmVzcG9uc2UuZ2V0UmVwcmVzZW50YXRpb24oKS5hZGQod2FkbFJlcHJlc2VudGF0aW9uKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoTWVkaWFUeXBlIG1lZGlhVHlwZSA6IG0uZ2V0UHJvZHVjZWRUeXBlcygpKSB7CisgICAgICAgICAgICAgICAgUmVwcmVzZW50YXRpb24gd2FkbFJlcHJlc2VudGF0aW9uID0gY3JlYXRlUmVzcG9uc2VSZXByZXNlbnRhdGlvbihyLCBtLCBtZWRpYVR5cGUpOworICAgICAgICAgICAgICAgIHJlc3BvbnNlLmdldFJlcHJlc2VudGF0aW9uKCkuYWRkKHdhZGxSZXByZXNlbnRhdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBMaXN0PFJlc3BvbnNlPiByZXNwb25zZXMgPSBuZXcgQXJyYXlMaXN0PFJlc3BvbnNlPigpOworICAgICAgICByZXNwb25zZXMuYWRkKHJlc3BvbnNlKTsKKyAgICAgICAgcmV0dXJuIHJlc3BvbnNlczsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaGFzRW1wdHlQcm9kdWNpYmxlTWVkaWFUeXBlU2V0KGZpbmFsIFJlc291cmNlTWV0aG9kIG1ldGhvZCkgeworICAgICAgICByZXR1cm4gbWV0aG9kLmdldFByb2R1Y2VkVHlwZXMoKS5pc0VtcHR5KCk7CisgICAgfQorCisgICAgcHVibGljIFJlcHJlc2VudGF0aW9uIGNyZWF0ZVJlc3BvbnNlUmVwcmVzZW50YXRpb24ob3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlIHIsIFJlc291cmNlTWV0aG9kIG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICBSZXByZXNlbnRhdGlvbiB3YWRsUmVwcmVzZW50YXRpb24gPSBuZXcgUmVwcmVzZW50YXRpb24oKTsKKyAgICAgICAgd2FkbFJlcHJlc2VudGF0aW9uLnNldE1lZGlhVHlwZShtZWRpYVR5cGUudG9TdHJpbmcoKSk7CisgICAgICAgIHJldHVybiB3YWRsUmVwcmVzZW50YXRpb247CisgICAgfQorCisgICAgLy8gPT09PT09PT09PT09PT09PSBtZXRob2RzIGZvciBwb3N0IGJ1aWxkIGFjdGlvbnMgPT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBFeHRlcm5hbEdyYW1tYXJEZWZpbml0aW9uIGNyZWF0ZUV4dGVybmFsR3JhbW1hcigpIHsKKyAgICAgICAgLy8gUmV0dXJuIGFuIGVtcHR5IGxpc3QgdG8gYWRkIHRvCisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxHcmFtbWFyRGVmaW5pdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGF0dGFjaFR5cGVzKEFwcGxpY2F0aW9uRGVzY3JpcHRpb24gZWdkKSB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9pbnRlcm5hbC9XYWRsUmVzb3VyY2UuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvaW50ZXJuYWwvV2FkbFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYzMmNmMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvaW50ZXJuYWwvV2FkbFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CitpbXBvcnQgamF2YXgueG1sLmJpbmQuTWFyc2hhbGxlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuRXh0ZW5kZWRSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5XYWRsQXBwbGljYXRpb25Db250ZXh0OworCitpbXBvcnQgY29tLnN1bi5yZXNlYXJjaC53cy53YWRsLkFwcGxpY2F0aW9uOworCisvKioKKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKi8KK0BTaW5nbGV0b24KK0BQYXRoKCJhcHBsaWNhdGlvbi53YWRsIikKK0BFeHRlbmRlZFJlc291cmNlCitwdWJsaWMgZmluYWwgY2xhc3MgV2FkbFJlc291cmNlIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhUVFBEQVRFRk9STUFUID0gIkVFRSwgZGQgTU1NIHl5eXkgSEg6bW06c3Mgenp6IjsKKworICAgIHByaXZhdGUgdm9sYXRpbGUgVVJJIGxhc3RCYXNlVXJpOworICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBsYXN0RGV0YWlsZWRXYWRsOworCisgICAgcHJpdmF0ZSBieXRlW10gd2FkbFhtbFJlcHJlc2VudGF0aW9uOworICAgIHByaXZhdGUgU3RyaW5nIGxhc3RNb2RpZmllZDsKKworICAgIEBDb250ZXh0CisgICAgcHJpdmF0ZSBXYWRsQXBwbGljYXRpb25Db250ZXh0IHdhZGxDb250ZXh0OworCisKKyAgICBwdWJsaWMgV2FkbFJlc291cmNlKCkgeworICAgICAgICB0aGlzLmxhc3RNb2RpZmllZCA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KEhUVFBEQVRFRk9STUFUKS5mb3JtYXQobmV3IERhdGUoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzQ2FjaGVkKFVyaUluZm8gdXJpSW5mbywgYm9vbGVhbiBkZXRhaWxlZFdhZGwpIHsKKyAgICAgICAgcmV0dXJuIChsYXN0QmFzZVVyaSAhPSBudWxsICYmIGxhc3RCYXNlVXJpLmVxdWFscyh1cmlJbmZvLmdldEJhc2VVcmkoKSkgJiYgbGFzdERldGFpbGVkV2FkbCA9PSBkZXRhaWxlZFdhZGwpOworICAgIH0KKworICAgIEBQcm9kdWNlcyh7ImFwcGxpY2F0aW9uL3ZuZC5zdW4ud2FkbCt4bWwiLCAiYXBwbGljYXRpb24veG1sIn0pCisgICAgQEdFVAorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgUmVzcG9uc2UgZ2V0V2FkbChAQ29udGV4dCBVcmlJbmZvIHVyaUluZm8pIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICghd2FkbENvbnRleHQuaXNXYWRsR2VuZXJhdGlvbkVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoUmVzcG9uc2UuU3RhdHVzLk5PVF9GT1VORCkuYnVpbGQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBkZXRhaWxlZFdhZGwgPSBXYWRsVXRpbHMuaXNEZXRhaWxlZFdhZGxSZXF1ZXN0ZWQodXJpSW5mbyk7CisgICAgICAgICAgICBpZiAoKHdhZGxYbWxSZXByZXNlbnRhdGlvbiA9PSBudWxsKSB8fCAoIWlzQ2FjaGVkKHVyaUluZm8sIGRldGFpbGVkV2FkbCkpKSB7CisgICAgICAgICAgICAgICAgdGhpcy5sYXN0QmFzZVVyaSA9IHVyaUluZm8uZ2V0QmFzZVVyaSgpOworICAgICAgICAgICAgICAgIGxhc3REZXRhaWxlZFdhZGwgPSBkZXRhaWxlZFdhZGw7CisgICAgICAgICAgICAgICAgdGhpcy5sYXN0TW9kaWZpZWQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdChIVFRQREFURUZPUk1BVCkuZm9ybWF0KG5ldyBEYXRlKCkpOworCisgICAgICAgICAgICAgICAgQXBwbGljYXRpb25EZXNjcmlwdGlvbiBhcHBsaWNhdGlvbkRlc2NyaXB0aW9uID0gd2FkbENvbnRleHQuZ2V0QXBwbGljYXRpb24odXJpSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldGFpbGVkV2FkbCk7CisKKyAgICAgICAgICAgICAgICBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiA9IGFwcGxpY2F0aW9uRGVzY3JpcHRpb24uZ2V0QXBwbGljYXRpb24oKTsKKworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1hcnNoYWxsZXIgbWFyc2hhbGxlciA9IHdhZGxDb250ZXh0LmdldEpBWEJDb250ZXh0KCkuY3JlYXRlTWFyc2hhbGxlcigpOworICAgICAgICAgICAgICAgICAgICBtYXJzaGFsbGVyLnNldFByb3BlcnR5KE1hcnNoYWxsZXIuSkFYQl9GT1JNQVRURURfT1VUUFVULCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgICAgICAgICBtYXJzaGFsbGVyLm1hcnNoYWwoYXBwbGljYXRpb24sIG9zKTsKKyAgICAgICAgICAgICAgICAgICAgd2FkbFhtbFJlcHJlc2VudGF0aW9uID0gb3MudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgb3MuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbigiQ291bGQgbm90IG1hcnNoYWwgdGhlIHdhZGwgQXBwbGljYXRpb24uIiwgZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2sobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHdhZGxYbWxSZXByZXNlbnRhdGlvbikpLmhlYWRlcigiTGFzdC1tb2RpZmllZCIsIGxhc3RNb2RpZmllZCkuYnVpbGQoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKCJFcnJvciBnZW5lcmF0aW5nIC9hcHBsaWNhdGlvbi53YWRsLiIsIGUpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBAUHJvZHVjZXMoeyJhcHBsaWNhdGlvbi94bWwifSkKKyAgICBAR0VUCisgICAgQFBhdGgoIntwYXRofSIpCisgICAgcHVibGljIHN5bmNocm9uaXplZCBSZXNwb25zZSBnZXRFeHRlcm5hbEdyYW1tYXIoCisgICAgICAgICAgICBAQ29udGV4dCBVcmlJbmZvIHVyaUluZm8sCisgICAgICAgICAgICBAUGF0aFBhcmFtKCJwYXRoIikgU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIEZhaWwgaWYgd2FkbCBnZW5lcmF0aW9uIGlzIGRpc2FibGVkCisgICAgICAgICAgICBpZiAoIXdhZGxDb250ZXh0LmlzV2FkbEdlbmVyYXRpb25FbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKFJlc3BvbnNlLlN0YXR1cy5OT1RfRk9VTkQpLmJ1aWxkKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFwcGxpY2F0aW9uRGVzY3JpcHRpb24gYXBwbGljYXRpb25EZXNjcmlwdGlvbiA9CisgICAgICAgICAgICAgICAgICAgIHdhZGxDb250ZXh0LmdldEFwcGxpY2F0aW9uKHVyaUluZm8sIFdhZGxVdGlscy5pc0RldGFpbGVkV2FkbFJlcXVlc3RlZCh1cmlJbmZvKSk7CisKKyAgICAgICAgICAgIC8vIEZhaWwgaXMgd2UgZG9uJ3QgaGF2ZSBhbnkgbWV0YWRhdGEgZm9yIHRoaXMgcGF0aAorICAgICAgICAgICAgQXBwbGljYXRpb25EZXNjcmlwdGlvbi5FeHRlcm5hbEdyYW1tYXIgZXh0ZXJuYWxNZXRhZGF0YSA9IGFwcGxpY2F0aW9uRGVzY3JpcHRpb24uZ2V0RXh0ZXJuYWxHcmFtbWFyKHBhdGgpOworCisgICAgICAgICAgICBpZiAoZXh0ZXJuYWxNZXRhZGF0YSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyhSZXNwb25zZS5TdGF0dXMuTk9UX0ZPVU5EKS5idWlsZCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIGRhdGEKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygpLnR5cGUoZXh0ZXJuYWxNZXRhZGF0YS5nZXRUeXBlKCkpCisgICAgICAgICAgICAgICAgICAgIC5lbnRpdHkoZXh0ZXJuYWxNZXRhZGF0YS5nZXRDb250ZW50KCkpCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfV0FETF9SRVNPVVJDRV9FWFRFUk5BTF9HUkFNTUFSKCksIGUpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci93YWRsL2ludGVybmFsL1dhZGxVdGlscy5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9pbnRlcm5hbC9XYWRsVXRpbHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTZhODg1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9pbnRlcm5hbC9XYWRsVXRpbHMuamF2YQpAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLmJpbmQuVW5tYXJzaGFsbGVyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYU291cmNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworCitpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworCisvKioKKyAqIFV0aWxzIGZvciB3YWRsIHByb2Nlc3NpbmcuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICoKKyAqLworcHVibGljIGNsYXNzIFdhZGxVdGlscyB7CisKKworICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhlIHF1ZXJ5IHBhcmFtZXRlciB0aGF0IGFsbG93cyBnZW5lcmF0aW9uIG9mIGZ1bGwgV0FETCBpbmNsdWRpbmcKKyAgICAgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLkV4dGVuZGVkUmVzb3VyY2UgZXh0ZW5kZWQgcmVzb3VyY2V9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFVEFJTEVEX1dBRExfUVVFUllfUEFSQU0gPSAiZGV0YWlsIjsKKworICAgIC8qKgorICAgICAqIFVubWFyc2hhbCBhIGpheGIgYmVhbiBpbnRvIGEgdHlwZSBvZiB7QGNvZGUgcmVzdWx0Q2xhc3N9IGZyb20gdGhlIGdpdmVuIHtAY29kZSBpbnB1dFN0cmVhbX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5wdXRTdHJlYW0gSW5wdXQgc3RyZWFtIHRoYXQgY29udGFpbnMgaW5wdXQgeG1sIHRoYXQgc2hvdWxkIGJlIHByb2Nlc3NlZC4KKyAgICAgKiBAcGFyYW0gc2F4UGFyc2VyRmFjdG9yeSBTYXggcGFyc2VyIGZhY3RvcnkgZm9yIHVubWFyc2hhbGxpbmcgeG1sLgorICAgICAqIEBwYXJhbSByZXN1bHRDbGFzcyBDbGFzcyBvZiB0aGUgcmVzdWx0IGJlYW4gaW50byB3aGljaCB0aGUgY29udGVudCBvZiB7QGNvZGUgaW5wdXRTdHJlYW19IHNob3VsZCBiZSB1bm1hcnNoYWxsZWQuCisgICAgICogQHBhcmFtIDxUPiBUeXBlIG9mIHRoZSByZXN1bHQgamF4YiBiZWFuLgorICAgICAqIEByZXR1cm4gVW5tYXJzaGFsbGVkIGpheGIgYmVhbi4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSkFYQkV4Y2VwdGlvbiBJbiBjYXNlIG9mIGpheGIgcHJvYmxlbS4KKyAgICAgKiBAdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gSW4gY2FzZSBvZiBwcm9ibGVtIHdpdGggcGFyc2luZyB4bWwuCisgICAgICogQHRocm93cyBTQVhFeGNlcHRpb24gSW4gY2FzZSBvZiBwcm9ibGVtIHdpdGggcGFyc2luZyB4bWwuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8VD4gVCB1bm1hcnNoYWxsKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBTQVhQYXJzZXJGYWN0b3J5IHNheFBhcnNlckZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPFQ+IHJlc3VsdENsYXNzKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiwgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uIHsKKworICAgICAgICBKQVhCQ29udGV4dCBqYXhiQ29udGV4dCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBqYXhiQ29udGV4dCA9IEpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKHJlc3VsdENsYXNzKTsKKyAgICAgICAgfSBjYXRjaCAoSkFYQkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfV0FETF9KQVhCX0NPTlRFWFQoKSwgZXgpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgU0FYUGFyc2VyIHNheFBhcnNlciA9IHNheFBhcnNlckZhY3RvcnkubmV3U0FYUGFyc2VyKCk7CisgICAgICAgIFNBWFNvdXJjZSBzb3VyY2UgPSBuZXcgU0FYU291cmNlKHNheFBhcnNlci5nZXRYTUxSZWFkZXIoKSwgbmV3IElucHV0U291cmNlKGlucHV0U3RyZWFtKSk7CisgICAgICAgIGZpbmFsIFVubWFyc2hhbGxlciB1bm1hcnNoYWxsZXIgPSBqYXhiQ29udGV4dC5jcmVhdGVVbm1hcnNoYWxsZXIoKTsKKyAgICAgICAgZmluYWwgT2JqZWN0IHJlc3VsdCA9IHVubWFyc2hhbGxlci51bm1hcnNoYWwoc291cmNlKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdENsYXNzLmNhc3QocmVzdWx0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGdlbmVyYXRpb24gb2YgZnVsbCBXQURMIHdpdGgKKyAgICAgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLkV4dGVuZGVkUmVzb3VyY2UgZXh0ZW5kZWQgcmVzb3VyY2VzfSBpcyByZXF1ZXN0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpSW5mbyBVUkkgaW5mbyBvZiB0aGUgcmVxdWVzdC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBmdWxsIGRldGFpbGVkIFdBREwgc2hvdWxkIGJlIGdlbmVyYXRlZDsgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0RldGFpbGVkV2FkbFJlcXVlc3RlZChVcmlJbmZvIHVyaUluZm8pIHsKKyAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHNpbXBsZSA9IHVyaUluZm8uZ2V0UXVlcnlQYXJhbWV0ZXJzKCkuZ2V0KERFVEFJTEVEX1dBRExfUVVFUllfUEFSQU0pOworCisgICAgICAgIGlmIChzaW1wbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHNpbXBsZS5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUgPSBzaW1wbGUuZ2V0KDApLnRyaW0oKTsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZS5pc0VtcHR5KCkgfHwgdmFsdWUudG9VcHBlckNhc2UoKS5lcXVhbHMoIlRSVUUiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci93YWRsL2ludGVybmFsL2dlbmVyYXRvcnMvQXBwbGljYXRpb25Eb2NzLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci93YWRsL2ludGVybmFsL2dlbmVyYXRvcnMvQXBwbGljYXRpb25Eb2NzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ0ZGJjOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvaW50ZXJuYWwvZ2VuZXJhdG9ycy9BcHBsaWNhdGlvbkRvY3MuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLmludGVybmFsLmdlbmVyYXRvcnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKKworaW1wb3J0IGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5Eb2M7CisKKy8qKgorICogVGhlIHdyYXBwZXIgcm9vdCBkb2N1bWVudCBmb3IgbXVsdGlwbGUge0BsaW5rIERvY30gZWxlbWVudHMuCisgKiBDcmVhdGVkIG9uOiBKdW4gMTAsIDIwMDg8YnI+CisgKgorICogQGF1dGhvciBNYXJ0aW4gR3JvdHprZSAobWFydGluLmdyb3R6a2UgYXQgZnJlaWhlaXQuY29tKQorICovCitAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCitAWG1sVHlwZShuYW1lID0gImFwcGxpY2F0aW9uRG9jcyIsIHByb3BPcmRlciA9IHsKKyAgICAgICAgImRvY3MiCit9KQorQFhtbFJvb3RFbGVtZW50KG5hbWUgPSAiYXBwbGljYXRpb25Eb2NzIikKK3B1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbkRvY3MgeworCisgICAgQFhtbEVsZW1lbnQobmFtZSA9ICJkb2MiKQorICAgIHByb3RlY3RlZCBMaXN0PERvYz4gZG9jczsKKworICAgIHB1YmxpYyBMaXN0PERvYz4gZ2V0RG9jcygpIHsKKyAgICAgICAgaWYgKGRvY3MgPT0gbnVsbCkgeworICAgICAgICAgICAgZG9jcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLmRvY3M7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci93YWRsL2ludGVybmFsL2dlbmVyYXRvcnMvT2JqZWN0RmFjdG9yeS5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9pbnRlcm5hbC9nZW5lcmF0b3JzL09iamVjdEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGRjODlkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9pbnRlcm5hbC9nZW5lcmF0b3JzL09iamVjdEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLmludGVybmFsLmdlbmVyYXRvcnM7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJlZ2lzdHJ5OworCisvKioKKyAqIFRoZSBvYmplY3QgZmFjdG9yeSBmb3IgYXBwbGljYXRpb24gZG9jcyBqYXhiIGJpbmRpbmdzLjxicj4KKyAqIENyZWF0ZWQgb246IEp1biAxNywgMjAwODxicj4KKyAqCisgKiBAYXV0aG9yIE1hcnRpbiBHcm90emtlIChtYXJ0aW4uZ3JvdHprZSBhdCBmcmVpaGVpdC5jb20pCisgKi8KK0BYbWxSZWdpc3RyeQorcHVibGljIGNsYXNzIE9iamVjdEZhY3RvcnkgeworCisgICAgcHVibGljIEFwcGxpY2F0aW9uRG9jcyBjcmVhdGVBcHBsaWNhdGlvbkRvY3MoKSB7CisgICAgICAgIHJldHVybiBuZXcgQXBwbGljYXRpb25Eb2NzKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci93YWRsL2ludGVybmFsL2dlbmVyYXRvcnMvV2FkbEdlbmVyYXRvckFwcGxpY2F0aW9uRG9jLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci93YWRsL2ludGVybmFsL2dlbmVyYXRvcnMvV2FkbEdlbmVyYXRvckFwcGxpY2F0aW9uRG9jLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZhMDhkZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvaW50ZXJuYWwvZ2VuZXJhdG9ycy9XYWRsR2VuZXJhdG9yQXBwbGljYXRpb25Eb2MuamF2YQpAQCAtMCwwICsxLDIxOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5pbnRlcm5hbC5nZW5lcmF0b3JzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5QYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuV2FkbEdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5pbnRlcm5hbC5BcHBsaWNhdGlvbkRlc2NyaXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLmludGVybmFsLldhZGxVdGlsczsKKworaW1wb3J0IGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5BcHBsaWNhdGlvbjsKK2ltcG9ydCBjb20uc3VuLnJlc2VhcmNoLndzLndhZGwuTWV0aG9kOworaW1wb3J0IGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5QYXJhbTsKK2ltcG9ydCBjb20uc3VuLnJlc2VhcmNoLndzLndhZGwuUmVwcmVzZW50YXRpb247CitpbXBvcnQgY29tLnN1bi5yZXNlYXJjaC53cy53YWRsLlJlcXVlc3Q7CitpbXBvcnQgY29tLnN1bi5yZXNlYXJjaC53cy53YWRsLlJlc291cmNlOworaW1wb3J0IGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5SZXNvdXJjZXM7CitpbXBvcnQgY29tLnN1bi5yZXNlYXJjaC53cy53YWRsLlJlc3BvbnNlOworCisvKioKKyAqIFRoaXMge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLldhZGxHZW5lcmF0b3J9IGFkZHMgYWxsIGRvYyBlbGVtZW50cyBwcm92aWRlZCBieSB7QGxpbmsgQXBwbGljYXRpb25Eb2NzI2dldERvY3MoKX0KKyAqIHRvIHRoZSBnZW5lcmF0ZWQgd2FkbC1maWxlLgorICogPHA+CisgKiBUaGUge0BsaW5rIEFwcGxpY2F0aW9uRG9jc30gY29udGVudCBjYW4gZWl0aGVyIGJlIHByb3ZpZGVkIHZpYSBhIHtAbGluayBGaWxlfSByZWZlcmVuY2UKKyAqICh7QGxpbmsgI3NldEFwcGxpY2F0aW9uRG9jc0ZpbGUoRmlsZSl9KSBvcgorICogdmlhIGFuIHtAbGluayBJbnB1dFN0cmVhbX0gKHtAbGluayAjc2V0QXBwbGljYXRpb25Eb2NzU3RyZWFtKElucHV0U3RyZWFtKX0pLgorICogPC9wPgorICogPHA+CisgKiBUaGUge0BsaW5rIEZpbGV9IHNob3VsZCBiZSB1c2VkIHdoZW4gdXNpbmcgdGhlIG1hdmVuLXdhZGwtcGx1Z2luIGZvciBnZW5lcmF0aW5nIHdhZGwgb2ZmbGluZSwKKyAqIHRoZSB7QGxpbmsgSW5wdXRTdHJlYW19IHNob3VsZCBiZSB1c2VkIHdoZW4gdGhlIGV4dGVuZGVkIHdhZGwgaXMgZ2VuZXJhdGVkIGJ5IGplcnNleSBhdCBydW50aW1lLCBlLmcuCisgKiB1c2luZyB0aGUge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLmNvbmZpZy5XYWRsR2VuZXJhdG9yQ29uZmlnfSBmb3IgY29uZmlndXJhdGlvbi4KKyAqIDwvcD4KKyAqCisgKiBDcmVhdGVkIG9uOiBKdW4gMTYsIDIwMDg8YnI+CisgKgorICogQGF1dGhvciBNYXJ0aW4gR3JvdHprZSAobWFydGluLmdyb3R6a2UgYXQgZnJlaWhlaXQuY29tKQorICovCitwdWJsaWMgY2xhc3MgV2FkbEdlbmVyYXRvckFwcGxpY2F0aW9uRG9jIGltcGxlbWVudHMgV2FkbEdlbmVyYXRvciB7CisKKyAgICBwcml2YXRlIFdhZGxHZW5lcmF0b3IgX2RlbGVnYXRlOworICAgIHByaXZhdGUgRmlsZSBfYXBwbGljYXRpb25Eb2NzRmlsZTsKKyAgICBwcml2YXRlIElucHV0U3RyZWFtIF9hcHBsaWNhdGlvbkRvY3NTdHJlYW07CisgICAgcHJpdmF0ZSBBcHBsaWNhdGlvbkRvY3MgX2FwcGxpY2F0aW9uRG9jczsKKyAgICBAQ29udGV4dAorICAgIHByaXZhdGUgUHJvdmlkZXI8U0FYUGFyc2VyRmFjdG9yeT4gc2F4RmFjdG9yeVByb3ZpZGVyOworCisKKyAgICBwdWJsaWMgdm9pZCBzZXRXYWRsR2VuZXJhdG9yRGVsZWdhdGUoV2FkbEdlbmVyYXRvciBkZWxlZ2F0ZSkgeworICAgICAgICBfZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlcXVpcmVkSmF4YkNvbnRleHRQYXRoKCkgeworICAgICAgICByZXR1cm4gX2RlbGVnYXRlLmdldFJlcXVpcmVkSmF4YkNvbnRleHRQYXRoKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QXBwbGljYXRpb25Eb2NzRmlsZShGaWxlIGFwcGxpY2F0aW9uRG9jc0ZpbGUpIHsKKyAgICAgICAgaWYgKF9hcHBsaWNhdGlvbkRvY3NTdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIGFwcGxpY2F0aW9uRG9jc1N0cmVhbSBwcm9wZXJ0eSBpcyBhbHJlYWR5IHNldCwiCisgICAgICAgICAgICAgICAgICAgICsgIiB0aGVyZWZvcmUgeW91IGNhbm5vdCBzZXQgdGhlIGFwcGxpY2F0aW9uRG9jc0ZpbGUgcHJvcGVydHkuIE9ubHkgb25lIG9mIGJvdGggY2FuIGJlIHNldCBhdCBhIHRpbWUuIik7CisgICAgICAgIH0KKyAgICAgICAgX2FwcGxpY2F0aW9uRG9jc0ZpbGUgPSBhcHBsaWNhdGlvbkRvY3NGaWxlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEFwcGxpY2F0aW9uRG9jc1N0cmVhbShJbnB1dFN0cmVhbSBhcHBsaWNhdGlvbkRvY3NTdHJlYW0pIHsKKyAgICAgICAgaWYgKF9hcHBsaWNhdGlvbkRvY3NGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSBhcHBsaWNhdGlvbkRvY3NGaWxlIHByb3BlcnR5IGlzIGFscmVhZHkgc2V0LCIKKyAgICAgICAgICAgICAgICAgICAgKyAiIHRoZXJlZm9yZSB5b3UgY2Fubm90IHNldCB0aGUgYXBwbGljYXRpb25Eb2NzU3RyZWFtIHByb3BlcnR5LiBPbmx5IG9uZSBvZiBib3RoIGNhbiBiZSBzZXQgYXQgYSB0aW1lLiIpOworICAgICAgICB9CisgICAgICAgIF9hcHBsaWNhdGlvbkRvY3NTdHJlYW0gPSBhcHBsaWNhdGlvbkRvY3NTdHJlYW07CisgICAgfQorCisKKyAgICBwdWJsaWMgdm9pZCBpbml0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChfYXBwbGljYXRpb25Eb2NzRmlsZSA9PSBudWxsICYmIF9hcHBsaWNhdGlvbkRvY3NTdHJlYW0gPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTmVpdGhlciB0aGUgYXBwbGljYXRpb25Eb2NzRmlsZSBub3IgdGhlIGFwcGxpY2F0aW9uRG9jc1N0cmVhbSIKKyAgICAgICAgICAgICAgICAgICAgKyAiIGlzIHNldCwgb25lIG9mIGJvdGggaXMgcmVxdWlyZWQuIik7CisgICAgICAgIH0KKyAgICAgICAgX2RlbGVnYXRlLmluaXQoKTsKKworICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbTsKKyAgICAgICAgaWYgKF9hcHBsaWNhdGlvbkRvY3NGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShfYXBwbGljYXRpb25Eb2NzRmlsZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnB1dFN0cmVhbSA9IF9hcHBsaWNhdGlvbkRvY3NTdHJlYW07CisgICAgICAgIH0KKyAgICAgICAgX2FwcGxpY2F0aW9uRG9jcyA9IFdhZGxVdGlscy51bm1hcnNoYWxsKGlucHV0U3RyZWFtLCBzYXhGYWN0b3J5UHJvdmlkZXIuZ2V0KCksIEFwcGxpY2F0aW9uRG9jcy5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgYXBwbGljYXRpb24KKyAgICAgKiBAc2VlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLldhZGxHZW5lcmF0b3IjY3JlYXRlQXBwbGljYXRpb24oKQorICAgICAqLworICAgIHB1YmxpYyBBcHBsaWNhdGlvbiBjcmVhdGVBcHBsaWNhdGlvbigpIHsKKyAgICAgICAgZmluYWwgQXBwbGljYXRpb24gcmVzdWx0ID0gX2RlbGVnYXRlLmNyZWF0ZUFwcGxpY2F0aW9uKCk7CisgICAgICAgIGlmIChfYXBwbGljYXRpb25Eb2NzICE9IG51bGwgJiYgX2FwcGxpY2F0aW9uRG9jcy5nZXREb2NzKCkgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmICFfYXBwbGljYXRpb25Eb2NzLmdldERvY3MoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJlc3VsdC5nZXREb2MoKS5hZGRBbGwoX2FwcGxpY2F0aW9uRG9jcy5nZXREb2NzKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHIKKyAgICAgKiBAcGFyYW0gbQorICAgICAqIEByZXR1cm4gdGhlIG1ldGhvZAorICAgICAqIEBzZWUgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuV2FkbEdlbmVyYXRvciNjcmVhdGVNZXRob2Qob3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlLAorICAgICAqIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1ldGhvZCkKKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0aG9kIGNyZWF0ZU1ldGhvZChvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2Ugciwgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTWV0aG9kIG0pIHsKKyAgICAgICAgcmV0dXJuIF9kZWxlZ2F0ZS5jcmVhdGVNZXRob2QociwgbSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHIKKyAgICAgKiBAcGFyYW0gbQorICAgICAqIEBwYXJhbSBtZWRpYVR5cGUKKyAgICAgKiBAcmV0dXJuIHJlcHJlc2VudGF0aW9uIHR5cGUKKyAgICAgKiBAc2VlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLldhZGxHZW5lcmF0b3IjY3JlYXRlUmVxdWVzdFJlcHJlc2VudGF0aW9uKG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZSwKKyAgICAgKiAgICAgIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1ldGhvZCwgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGUpCisgICAgICovCisgICAgcHVibGljIFJlcHJlc2VudGF0aW9uIGNyZWF0ZVJlcXVlc3RSZXByZXNlbnRhdGlvbihvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2UgciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1ldGhvZCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICByZXR1cm4gX2RlbGVnYXRlLmNyZWF0ZVJlcXVlc3RSZXByZXNlbnRhdGlvbihyLCBtLCBtZWRpYVR5cGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSByCisgICAgICogQHBhcmFtIG0KKyAgICAgKiBAcmV0dXJuIHJlcXVlc3QKKyAgICAgKiBAc2VlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLldhZGxHZW5lcmF0b3IjY3JlYXRlUmVxdWVzdChvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2UsCisgICAgICogb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTWV0aG9kKQorICAgICAqLworICAgIHB1YmxpYyBSZXF1ZXN0IGNyZWF0ZVJlcXVlc3Qob3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlIHIsIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1ldGhvZAorICAgICAgICAgICAgbSkgeworICAgICAgICByZXR1cm4gX2RlbGVnYXRlLmNyZWF0ZVJlcXVlc3QociwgbSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHIKKyAgICAgKiBAcGFyYW0gbQorICAgICAqIEBwYXJhbSBwCisgICAgICogQHJldHVybiBwYXJhbWV0ZXIKKyAgICAgKiBAc2VlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLldhZGxHZW5lcmF0b3IjY3JlYXRlUGFyYW0ob3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlLAorICAgICAqIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1ldGhvZCwgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlBhcmFtZXRlcikKKyAgICAgKi8KKyAgICBwdWJsaWMgUGFyYW0gY3JlYXRlUGFyYW0ob3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlIHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1ldGhvZCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXIgcCkgeworICAgICAgICByZXR1cm4gX2RlbGVnYXRlLmNyZWF0ZVBhcmFtKHIsIG0sIHApOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSByCisgICAgICogQHBhcmFtIHBhdGgKKyAgICAgKiBAcmV0dXJuIHJlc291cmNlCisgICAgICogQHNlZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5XYWRsR2VuZXJhdG9yI2NyZWF0ZVJlc291cmNlKG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZSwgU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2UgciwgU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgcmV0dXJuIF9kZWxlZ2F0ZS5jcmVhdGVSZXNvdXJjZShyLCBwYXRoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gcgorICAgICAqIEBwYXJhbSBtCisgICAgICogQHJldHVybiByZXNwb25zZQorICAgICAqIEBzZWUgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuV2FkbEdlbmVyYXRvciNjcmVhdGVSZXNwb25zZXMob3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlLAorICAgICAqIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1ldGhvZCkKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxSZXNwb25zZT4gY3JlYXRlUmVzcG9uc2VzKG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZSByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTWV0aG9kIG0pIHsKKyAgICAgICAgcmV0dXJuIF9kZWxlZ2F0ZS5jcmVhdGVSZXNwb25zZXMociwgbSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiByZXNvdXJjZXMKKyAgICAgKiBAc2VlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLldhZGxHZW5lcmF0b3IjY3JlYXRlUmVzb3VyY2VzKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzb3VyY2VzIGNyZWF0ZVJlc291cmNlcygpIHsKKyAgICAgICAgcmV0dXJuIF9kZWxlZ2F0ZS5jcmVhdGVSZXNvdXJjZXMoKTsKKyAgICB9CisKKyAgICAvLyA9PT09PT09PT09PT09PT09IG1ldGhvZHMgZm9yIHBvc3QgYnVpbGQgYWN0aW9ucyA9PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEV4dGVybmFsR3JhbW1hckRlZmluaXRpb24gY3JlYXRlRXh0ZXJuYWxHcmFtbWFyKCkgeworICAgICAgICByZXR1cm4gX2RlbGVnYXRlLmNyZWF0ZUV4dGVybmFsR3JhbW1hcigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGF0dGFjaFR5cGVzKEFwcGxpY2F0aW9uRGVzY3JpcHRpb24gZWdkKSB7CisgICAgICAgIF9kZWxlZ2F0ZS5hdHRhY2hUeXBlcyhlZ2QpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvaW50ZXJuYWwvZ2VuZXJhdG9ycy9XYWRsR2VuZXJhdG9yR3JhbW1hcnNTdXBwb3J0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci93YWRsL2ludGVybmFsL2dlbmVyYXRvcnMvV2FkbEdlbmVyYXRvckdyYW1tYXJzU3VwcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMmEzMWUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci93YWRsL2ludGVybmFsL2dlbmVyYXRvcnMvV2FkbEdlbmVyYXRvckdyYW1tYXJzU3VwcG9ydC5qYXZhCkBAIC0wLDAgKzEsMjQyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLmludGVybmFsLmdlbmVyYXRvcnM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5QYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuV2FkbEdlbmVyYXRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5pbnRlcm5hbC5BcHBsaWNhdGlvbkRlc2NyaXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLmludGVybmFsLldhZGxVdGlsczsKKworaW1wb3J0IGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5BcHBsaWNhdGlvbjsKK2ltcG9ydCBjb20uc3VuLnJlc2VhcmNoLndzLndhZGwuR3JhbW1hcnM7CitpbXBvcnQgY29tLnN1bi5yZXNlYXJjaC53cy53YWRsLk1ldGhvZDsKK2ltcG9ydCBjb20uc3VuLnJlc2VhcmNoLndzLndhZGwuUGFyYW07CitpbXBvcnQgY29tLnN1bi5yZXNlYXJjaC53cy53YWRsLlJlcHJlc2VudGF0aW9uOworaW1wb3J0IGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5SZXF1ZXN0OworaW1wb3J0IGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5SZXNvdXJjZTsKK2ltcG9ydCBjb20uc3VuLnJlc2VhcmNoLndzLndhZGwuUmVzb3VyY2VzOworaW1wb3J0IGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5SZXNwb25zZTsKKworLyoqCisgKiBUaGlzIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5XYWRsR2VuZXJhdG9yfSBhZGRzIHRoZSBwcm92aWRlZCB7QGxpbmsgR3JhbW1hcnN9IGVsZW1lbnQgdG8gdGhlCisgKiBnZW5lcmF0ZWQgd2FkbC1maWxlLgorICogPHA+CisgKiBUaGUge0BsaW5rIEdyYW1tYXJzfSBjb250ZW50IGNhbiBlaXRoZXIgYmUgcHJvdmlkZWQgdmlhIGEge0BsaW5rIEZpbGV9ICh7QGxpbmsgI3NldEdyYW1tYXJzRmlsZShGaWxlKX0pIHJlZmVyZW5jZSBvcgorICogdmlhIGFuIHtAbGluayBJbnB1dFN0cmVhbX0gKHtAbGluayAjc2V0R3JhbW1hcnNTdHJlYW0oSW5wdXRTdHJlYW0pfSkuCisgKiA8L3A+CisgKiA8cD4KKyAqIFRoZSB7QGxpbmsgRmlsZX0gc2hvdWxkIGJlIHVzZWQgd2hlbiB1c2luZyB0aGUgbWF2ZW4td2FkbC1wbHVnaW4gZm9yIGdlbmVyYXRpbmcgd2FkbCBvZmZsaW5lLAorICogdGhlIHtAbGluayBJbnB1dFN0cmVhbX0gc2hvdWxkIGJlIHVzZWQgd2hlbiB0aGUgZXh0ZW5kZWQgd2FkbCBpcyBnZW5lcmF0ZWQgYnkgamVyc2V5IGF0IHJ1bnRpbWUsIGUuZy4KKyAqIHVzaW5nIHRoZSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuY29uZmlnLldhZGxHZW5lcmF0b3JDb25maWd9IGZvciBjb25maWd1cmF0aW9uLgorICogPC9wPgorICogQ3JlYXRlZCBvbjogSnVuIDI0LCAyMDA4PGJyPgorICoKKyAqIEBhdXRob3IgTWFydGluIEdyb3R6a2UgKG1hcnRpbi5ncm90emtlIGF0IGZyZWloZWl0LmNvbSkKKyAqLworcHVibGljIGNsYXNzIFdhZGxHZW5lcmF0b3JHcmFtbWFyc1N1cHBvcnQgaW1wbGVtZW50cyBXYWRsR2VuZXJhdG9yIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFdhZGxHZW5lcmF0b3JHcmFtbWFyc1N1cHBvcnQuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIHByaXZhdGUgV2FkbEdlbmVyYXRvciBfZGVsZWdhdGU7CisgICAgcHJpdmF0ZSBGaWxlIF9ncmFtbWFyc0ZpbGU7CisgICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBfZ3JhbW1hcnNTdHJlYW07CisgICAgcHJpdmF0ZSBHcmFtbWFycyBfZ3JhbW1hcnM7CisgICAgcHJpdmF0ZSBCb29sZWFuIG92ZXJyaWRlR3JhbW1hcnMgPSBmYWxzZTsKKworICAgIEBDb250ZXh0CisgICAgcHJpdmF0ZSBQcm92aWRlcjxTQVhQYXJzZXJGYWN0b3J5PiBzYXhGYWN0b3J5UHJvdmlkZXI7CisKKworICAgIHB1YmxpYyBXYWRsR2VuZXJhdG9yR3JhbW1hcnNTdXBwb3J0KCkgeworICAgIH0KKworICAgIHB1YmxpYyBXYWRsR2VuZXJhdG9yR3JhbW1hcnNTdXBwb3J0KFdhZGxHZW5lcmF0b3IgZGVsZWdhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JhbW1hcnMgZ3JhbW1hcnMpIHsKKyAgICAgICAgX2RlbGVnYXRlID0gZGVsZWdhdGU7CisgICAgICAgIF9ncmFtbWFycyA9IGdyYW1tYXJzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFdhZGxHZW5lcmF0b3JEZWxlZ2F0ZShXYWRsR2VuZXJhdG9yIGRlbGVnYXRlKSB7CisgICAgICAgIF9kZWxlZ2F0ZSA9IGRlbGVnYXRlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE92ZXJyaWRlR3JhbW1hcnMoQm9vbGVhbiBvdmVycmlkZUdyYW1tYXJzKSB7CisgICAgICAgIHRoaXMub3ZlcnJpZGVHcmFtbWFycyA9IG92ZXJyaWRlR3JhbW1hcnM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRSZXF1aXJlZEpheGJDb250ZXh0UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIF9kZWxlZ2F0ZS5nZXRSZXF1aXJlZEpheGJDb250ZXh0UGF0aCgpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEdyYW1tYXJzRmlsZShGaWxlIGdyYW1tYXJzRmlsZSkgeworICAgICAgICBpZiAoX2dyYW1tYXJzU3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSBncmFtbWFyc1N0cmVhbSBwcm9wZXJ0eSBpcyBhbHJlYWR5IHNldCwiCisgICAgICAgICAgICAgICAgICAgICsgIiB0aGVyZWZvcmUgeW91IGNhbm5vdCBzZXQgdGhlIGdyYW1tYXJzRmlsZSBwcm9wZXJ0eS4gT25seSBvbmUgb2YgYm90aCBjYW4gYmUgc2V0IGF0IGEgdGltZS4iKTsKKyAgICAgICAgfQorICAgICAgICBfZ3JhbW1hcnNGaWxlID0gZ3JhbW1hcnNGaWxlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEdyYW1tYXJzU3RyZWFtKElucHV0U3RyZWFtIGdyYW1tYXJzU3RyZWFtKSB7CisgICAgICAgIGlmIChfZ3JhbW1hcnNGaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSBncmFtbWFyc0ZpbGUgcHJvcGVydHkgaXMgYWxyZWFkeSBzZXQsIgorICAgICAgICAgICAgICAgICAgICArICIgdGhlcmVmb3JlIHlvdSBjYW5ub3Qgc2V0IHRoZSBncmFtbWFyc1N0cmVhbSBwcm9wZXJ0eS4gT25seSBvbmUgb2YgYm90aCBjYW4gYmUgc2V0IGF0IGEgdGltZS4iKTsKKyAgICAgICAgfQorICAgICAgICBfZ3JhbW1hcnNTdHJlYW0gPSBncmFtbWFyc1N0cmVhbTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbml0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChfZ3JhbW1hcnNGaWxlID09IG51bGwgJiYgX2dyYW1tYXJzU3RyZWFtID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk5laXRoZXIgdGhlIGdyYW1tYXJzRmlsZSBub3IgdGhlIGdyYW1tYXJzU3RyZWFtIgorICAgICAgICAgICAgICAgICAgICArICIgaXMgc2V0LCBvbmUgb2YgYm90aCBpcyByZXF1aXJlZC4iKTsKKyAgICAgICAgfQorICAgICAgICBfZGVsZWdhdGUuaW5pdCgpOworICAgICAgICBfZ3JhbW1hcnMgPSBXYWRsVXRpbHMudW5tYXJzaGFsbChfZ3JhbW1hcnNGaWxlICE9IG51bGwgPyBuZXcgRmlsZUlucHV0U3RyZWFtKF9ncmFtbWFyc0ZpbGUpIDogX2dyYW1tYXJzU3RyZWFtLAorICAgICAgICAgICAgICAgIHNheEZhY3RvcnlQcm92aWRlci5nZXQoKSwgR3JhbW1hcnMuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gYXBwbGljYXRpb24KKyAgICAgKiBAc2VlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLldhZGxHZW5lcmF0b3IjY3JlYXRlQXBwbGljYXRpb24oKQorICAgICAqLworICAgIHB1YmxpYyBBcHBsaWNhdGlvbiBjcmVhdGVBcHBsaWNhdGlvbigpIHsKKyAgICAgICAgZmluYWwgQXBwbGljYXRpb24gcmVzdWx0ID0gX2RlbGVnYXRlLmNyZWF0ZUFwcGxpY2F0aW9uKCk7CisgICAgICAgIGlmIChyZXN1bHQuZ2V0R3JhbW1hcnMoKSAhPSBudWxsICYmICFvdmVycmlkZUdyYW1tYXJzKSB7CisgICAgICAgICAgICBMT0cuaW5mbygiVGhlIHdhZGwgYXBwbGljYXRpb24gY3JlYXRlZCBieSB0aGUgZGVsZWdhdGUgKCIgKyBfZGVsZWdhdGUgKyAiKSBhbHJlYWR5IGNvbnRhaW5zIGEgZ3JhbW1hcnMgZWxlbWVudCwiCisgICAgICAgICAgICAgICAgICAgICsgIiB3ZSdyZSBhZGRpbmcgZWxlbWVudHMgb2YgdGhlIHByb3ZpZGVkIGdyYW1tYXJzIGZpbGUuIik7CisgICAgICAgICAgICBpZiAoIV9ncmFtbWFycy5nZXRBbnkoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQuZ2V0R3JhbW1hcnMoKS5nZXRBbnkoKS5hZGRBbGwoX2dyYW1tYXJzLmdldEFueSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghX2dyYW1tYXJzLmdldERvYygpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHJlc3VsdC5nZXRHcmFtbWFycygpLmdldERvYygpLmFkZEFsbChfZ3JhbW1hcnMuZ2V0RG9jKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFfZ3JhbW1hcnMuZ2V0SW5jbHVkZSgpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHJlc3VsdC5nZXRHcmFtbWFycygpLmdldEluY2x1ZGUoKS5hZGRBbGwoX2dyYW1tYXJzLmdldEluY2x1ZGUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXN1bHQuc2V0R3JhbW1hcnMoX2dyYW1tYXJzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBhciAgYWJzdHJhY3QgcmVzb3VyY2UKKyAgICAgKiBAcGFyYW0gYXJtIGFic3RyYWN0IHJlc291cmNlIG1ldGhvZAorICAgICAqIEByZXR1cm4gbWV0aG9kCisgICAgICogQHNlZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5XYWRsR2VuZXJhdG9yI2NyZWF0ZU1ldGhvZChvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2UsCisgICAgICogb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTWV0aG9kKQorICAgICAqLworICAgIHB1YmxpYyBNZXRob2QgY3JlYXRlTWV0aG9kKG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZSBhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNZXRob2QgYXJtKSB7CisgICAgICAgIHJldHVybiBfZGVsZWdhdGUuY3JlYXRlTWV0aG9kKGFyLCBhcm0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBhciAgYWJzdHJhY3QgcmVzb3VyY2UKKyAgICAgKiBAcGFyYW0gYXJtIGFic3RyYWN0IHJlc291cmNlIG1ldGhvZAorICAgICAqIEByZXR1cm4gcmVxdWVzdAorICAgICAqIEBzZWUgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuV2FkbEdlbmVyYXRvciNjcmVhdGVSZXF1ZXN0KG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZSwKKyAgICAgKiBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNZXRob2QpCisgICAgICovCisgICAgcHVibGljIFJlcXVlc3QgY3JlYXRlUmVxdWVzdChvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2UgYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNZXRob2QgYXJtKSB7CisgICAgICAgIHJldHVybiBfZGVsZWdhdGUuY3JlYXRlUmVxdWVzdChhciwgYXJtKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gYXIgYWJzdHJhY3QgcmVzb3VyY2UKKyAgICAgKiBAcGFyYW0gYW0gYWJzdHJhY3QgbWV0aG9kCisgICAgICogQHBhcmFtIHAgIHBhcmFtZXRlcgorICAgICAqIEByZXR1cm4gcGFyYW1ldGVyCisgICAgICogQHNlZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5XYWRsR2VuZXJhdG9yI2NyZWF0ZVBhcmFtKG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZSwKKyAgICAgKiBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNZXRob2QsIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5QYXJhbWV0ZXIpCisgICAgICovCisgICAgcHVibGljIFBhcmFtIGNyZWF0ZVBhcmFtKG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZSBhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTWV0aG9kIGFtLCBQYXJhbWV0ZXIgcCkgeworICAgICAgICByZXR1cm4gX2RlbGVnYXRlLmNyZWF0ZVBhcmFtKGFyLCBhbSwgcCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGFyICBhYnN0cmFjdCByZXNvdXJjZQorICAgICAqIEBwYXJhbSBhcm0gYWJzdHJhY3QgcmVzb3VyY2UgbWV0aG9kCisgICAgICogQHBhcmFtIG10ICBtZWRpYSB0eXBlCisgICAgICogQHJldHVybiByZXNwcmVzZW50YXRpb24gdHlwZQorICAgICAqIEBzZWUgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuV2FkbEdlbmVyYXRvciNjcmVhdGVSZXF1ZXN0UmVwcmVzZW50YXRpb24ob3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlLAorICAgICAqIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1ldGhvZCwgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGUpCisgICAgICovCisgICAgcHVibGljIFJlcHJlc2VudGF0aW9uIGNyZWF0ZVJlcXVlc3RSZXByZXNlbnRhdGlvbigKKyAgICAgICAgICAgIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZSBhciwgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTWV0aG9kIGFybSwgTWVkaWFUeXBlIG10KSB7CisgICAgICAgIHJldHVybiBfZGVsZWdhdGUuY3JlYXRlUmVxdWVzdFJlcHJlc2VudGF0aW9uKGFyLCBhcm0sIG10KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gYXIgICBhYnN0cmFjdCByZXNvdXJjZQorICAgICAqIEBwYXJhbSBwYXRoIHJlc291cmNlIHBhdGgKKyAgICAgKiBAcmV0dXJuIHJlc291cmNlCisgICAgICogQHNlZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5XYWRsR2VuZXJhdG9yI2NyZWF0ZVJlc291cmNlKG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZSwgU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyBSZXNvdXJjZSBjcmVhdGVSZXNvdXJjZShvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2UgYXIsIFN0cmluZyBwYXRoKSB7CisgICAgICAgIHJldHVybiBfZGVsZWdhdGUuY3JlYXRlUmVzb3VyY2UoYXIsIHBhdGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gcmVzb3VyY2VzCisgICAgICogQHNlZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5XYWRsR2VuZXJhdG9yI2NyZWF0ZVJlc291cmNlcygpCisgICAgICovCisgICAgcHVibGljIFJlc291cmNlcyBjcmVhdGVSZXNvdXJjZXMoKSB7CisgICAgICAgIHJldHVybiBfZGVsZWdhdGUuY3JlYXRlUmVzb3VyY2VzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGFyICBhYnN0cmFjdCByZXNvdXJjZQorICAgICAqIEBwYXJhbSBhcm0gYWJzdHJhY3QgcmVzb3VyY2UgbWV0aG9kCisgICAgICogQHJldHVybiByZXNwb25zZQorICAgICAqIEBzZWUgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuV2FkbEdlbmVyYXRvciNjcmVhdGVSZXNwb25zZXMob3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlLAorICAgICAqIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1ldGhvZCkKKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxSZXNwb25zZT4gY3JlYXRlUmVzcG9uc2VzKG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZSBhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1ldGhvZCBhcm0pIHsKKyAgICAgICAgcmV0dXJuIF9kZWxlZ2F0ZS5jcmVhdGVSZXNwb25zZXMoYXIsIGFybSk7CisgICAgfQorCisgICAgLy8gPT09PT09PT09PT09PT09PSBtZXRob2RzIGZvciBwb3N0IGJ1aWxkIGFjdGlvbnMgPT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBFeHRlcm5hbEdyYW1tYXJEZWZpbml0aW9uIGNyZWF0ZUV4dGVybmFsR3JhbW1hcigpIHsKKyAgICAgICAgaWYgKG92ZXJyaWRlR3JhbW1hcnMpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxHcmFtbWFyRGVmaW5pdGlvbigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfZGVsZWdhdGUuY3JlYXRlRXh0ZXJuYWxHcmFtbWFyKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYXR0YWNoVHlwZXMoQXBwbGljYXRpb25EZXNjcmlwdGlvbiBlZ2QpIHsKKyAgICAgICAgX2RlbGVnYXRlLmF0dGFjaFR5cGVzKGVnZCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci93YWRsL2ludGVybmFsL2dlbmVyYXRvcnMvV2FkbEdlbmVyYXRvckpBWEJHcmFtbWFyR2VuZXJhdG9yLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci93YWRsL2ludGVybmFsL2dlbmVyYXRvcnMvV2FkbEdlbmVyYXRvckpBWEJHcmFtbWFyR2VuZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYzMDNlOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvaW50ZXJuYWwvZ2VuZXJhdG9ycy9XYWRsR2VuZXJhdG9ySkFYQkdyYW1tYXJHZW5lcmF0b3IuamF2YQpAQCAtMCwwICsxLDQ2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5pbnRlcm5hbC5nZW5lcmF0b3JzOworCitpbXBvcnQgamF2YS5pby5DaGFyQXJyYXlXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlBhcmFtZXRlcml6ZWRUeXBlOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY1R5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJJbnRyb3NwZWN0b3I7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuU2NoZW1hT3V0cHV0UmVzb2x2ZXI7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFNlZUFsc287CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdDsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUGFyYW1ldGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLldhZGxHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuaW50ZXJuYWwuQXBwbGljYXRpb25EZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5pbnRlcm5hbC5XYWRsR2VuZXJhdG9ySW1wbDsKKworaW1wb3J0IGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5BcHBsaWNhdGlvbjsKK2ltcG9ydCBjb20uc3VuLnJlc2VhcmNoLndzLndhZGwuTWV0aG9kOworaW1wb3J0IGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5QYXJhbTsKK2ltcG9ydCBjb20uc3VuLnJlc2VhcmNoLndzLndhZGwuUmVwcmVzZW50YXRpb247CitpbXBvcnQgY29tLnN1bi5yZXNlYXJjaC53cy53YWRsLlJlcXVlc3Q7CitpbXBvcnQgY29tLnN1bi5yZXNlYXJjaC53cy53YWRsLlJlc291cmNlOworaW1wb3J0IGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5SZXNvdXJjZXM7CitpbXBvcnQgY29tLnN1bi5yZXNlYXJjaC53cy53YWRsLlJlc3BvbnNlOworCisvKioKKyAqIFRoaXMge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLldhZGxHZW5lcmF0b3J9IGdlbmVyYXRlcyBhIFhNTCBTY2hlbWEgY29udGVudCBtb2RlbCBiYXNlZCBvbgorICogcmVmZXJlbmNlZCBqYXZhIGJlYW5zLgorICogPC9wPgorICogQ3JlYXRlZCBvbjogSnVuIDIyLCAyMDExPGJyPgorICoKKyAqIEBhdXRob3IgR2VyYXJkIERhdmlzb24KKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIFdhZGxHZW5lcmF0b3JKQVhCR3JhbW1hckdlbmVyYXRvciBpbXBsZW1lbnRzIFdhZGxHZW5lcmF0b3IgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50ZXJmYWNlIE5hbWVDYWxsYmFja1NldHRlciB7CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0TmFtZShRTmFtZSBuYW1lKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFR5cGVDYWxsYmFja1BhaXIgeworCisgICAgICAgIHB1YmxpYyBUeXBlQ2FsbGJhY2tQYWlyKGZpbmFsIEdlbmVyaWNUeXBlPD8+IGdlbmVyaWNUeXBlLCBmaW5hbCBOYW1lQ2FsbGJhY2tTZXR0ZXIgbmFtZUNhbGxiYWNrU2V0dGVyKSB7CisgICAgICAgICAgICB0aGlzLmdlbmVyaWNUeXBlID0gZ2VuZXJpY1R5cGU7CisgICAgICAgICAgICB0aGlzLm5hbWVDYWxsYmFja1NldHRlciA9IG5hbWVDYWxsYmFja1NldHRlcjsKKyAgICAgICAgfQorCisgICAgICAgIEdlbmVyaWNUeXBlPD8+IGdlbmVyaWNUeXBlOworICAgICAgICBOYW1lQ2FsbGJhY2tTZXR0ZXIgbmFtZUNhbGxiYWNrU2V0dGVyOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFdhZGxHZW5lcmF0b3JKQVhCR3JhbW1hckdlbmVyYXRvci5jbGFzcy5nZXROYW1lKCkpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGphdmEudXRpbC5TZXQ8Q2xhc3M+IFNQRUNJQUxfR0VORVJJQ19UWVBFUyA9CisgICAgICAgICAgICBuZXcgSGFzaFNldDxDbGFzcz4oKSB7eworICAgICAgICAgICAgICAgIC8vIFRPRE8gLSBKMiAtIHdlIGRvIG5vdCBoYXZlIEpSZXNwb25zZSBidXQgd2Ugc2hvdWxkIHN1cHBvcnQgR2VuZXJpY0VudGl0eQorICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICBhZGQoSlJlc3BvbnNlLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBhZGQoTGlzdC5jbGFzcyk7CisgICAgICAgICAgICB9fTsKKworICAgIC8vIFRoZSBnZW5lcmF0b3Igd2UgYXJlIGRlY29yYXRpbmcKKyAgICBwcml2YXRlIFdhZGxHZW5lcmF0b3Igd2FkbEdlbmVyYXRvckRlbGVnYXRlOworCisgICAgLy8gQW55IFNlZUFsc28gcmVmZXJlbmNlcworICAgIHByaXZhdGUgU2V0PENsYXNzPiBzZWVBbHNvQ2xhc3NlczsKKworICAgIC8vIEEgbWF0Y2hlZCBsaXN0IG9mIFBhcm0sIFBhcmFtZXRlciB0byBsaXN0IHRoZSByZWxhdmVudAorICAgIC8vIGVudGl0eSBvYmplY3RzIHRoYXQgd2UgbWlnaHQgbGlrZSB0byB0cmFuc2Zvcm0uCisgICAgcHJpdmF0ZSBMaXN0PFR5cGVDYWxsYmFja1BhaXI+IG5hbWVDYWxsYmFja3M7CisKKyAgICBwdWJsaWMgV2FkbEdlbmVyYXRvckpBWEJHcmFtbWFyR2VuZXJhdG9yKCkgeworICAgICAgICB3YWRsR2VuZXJhdG9yRGVsZWdhdGUgPSBuZXcgV2FkbEdlbmVyYXRvckltcGwoKTsKKyAgICB9CisKKyAgICAvLyA9PT09PT09PT09PT09PT0gSG91c2Uga2VlcGluZyBtZXRob2RzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICBwdWJsaWMgdm9pZCBzZXRXYWRsR2VuZXJhdG9yRGVsZWdhdGUoZmluYWwgV2FkbEdlbmVyYXRvciBkZWxlZ2F0ZSkgeworICAgICAgICB3YWRsR2VuZXJhdG9yRGVsZWdhdGUgPSBkZWxlZ2F0ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlcXVpcmVkSmF4YkNvbnRleHRQYXRoKCkgeworICAgICAgICByZXR1cm4gd2FkbEdlbmVyYXRvckRlbGVnYXRlLmdldFJlcXVpcmVkSmF4YkNvbnRleHRQYXRoKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5pdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB3YWRsR2VuZXJhdG9yRGVsZWdhdGUuaW5pdCgpOworICAgICAgICAvLworICAgICAgICBzZWVBbHNvQ2xhc3NlcyA9IG5ldyBIYXNoU2V0PD4oKTsKKworICAgICAgICAvLyBBIG1hdGNoZWQgbGlzdCBvZiBQYXJtLCBQYXJhbWV0ZXIgdG8gbGlzdCB0aGUgcmVsYXZlbnQKKyAgICAgICAgLy8gZW50aXR5IG9iamVjdHMgdGhhdCB3ZSBtaWdodCBsaWtlIHRvIHRyYW5zZm9ybS4KKyAgICAgICAgbmFtZUNhbGxiYWNrcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgIH0KKworICAgIC8vID09PT09PT09PT09PT09PSBBcHBsaWNhdGlvbiBDcmVhdGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgLyoqCisgICAgICogQHJldHVybiBhcHBsaWNhdGlvbgorICAgICAqIEBzZWUgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuV2FkbEdlbmVyYXRvciNjcmVhdGVBcHBsaWNhdGlvbigpCisgICAgICovCisgICAgcHVibGljIEFwcGxpY2F0aW9uIGNyZWF0ZUFwcGxpY2F0aW9uKCkgeworICAgICAgICByZXR1cm4gd2FkbEdlbmVyYXRvckRlbGVnYXRlLmNyZWF0ZUFwcGxpY2F0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGFyICBhYnN0cmFjdCByZXNvdXJjZQorICAgICAqIEBwYXJhbSBhcm0gYWJzdHJhY3QgcmVzb3VyY2UgbWV0aG9kCisgICAgICogQHJldHVybiBtZXRob2QKKyAgICAgKiBAc2VlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLldhZGxHZW5lcmF0b3IjY3JlYXRlTWV0aG9kKG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZSwKKyAgICAgKiAgICAgIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1ldGhvZCkKKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0aG9kIGNyZWF0ZU1ldGhvZChmaW5hbCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2UgYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTWV0aG9kIGFybSkgeworICAgICAgICByZXR1cm4gd2FkbEdlbmVyYXRvckRlbGVnYXRlLmNyZWF0ZU1ldGhvZChhciwgYXJtKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gYXIgIGFic3RyYWN0IHJlc291cmNlCisgICAgICogQHBhcmFtIGFybSBhYnN0cmFjdCByZXNvdXJjZSBtZXRob2QKKyAgICAgKiBAcmV0dXJuIHJlcXVlc3QKKyAgICAgKiBAc2VlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLldhZGxHZW5lcmF0b3IjY3JlYXRlUmVxdWVzdChvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2UsCisgICAgICogICAgICBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNZXRob2QpCisgICAgICovCisgICAgcHVibGljIFJlcXVlc3QgY3JlYXRlUmVxdWVzdChmaW5hbCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2UgYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNZXRob2QgYXJtKSB7CisKKyAgICAgICAgcmV0dXJuIHdhZGxHZW5lcmF0b3JEZWxlZ2F0ZS5jcmVhdGVSZXF1ZXN0KGFyLCBhcm0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBhciBhYnN0cmFjdCByZXNvdXJjZQorICAgICAqIEBwYXJhbSBhbSBhYnN0cmFjdCBtZXRob2QKKyAgICAgKiBAcGFyYW0gcCAgcGFyYW1ldGVyCisgICAgICogQHJldHVybiBwYXJhbWV0ZXIKKyAgICAgKiBAc2VlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLldhZGxHZW5lcmF0b3IjY3JlYXRlUGFyYW0ob3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlLAorICAgICAqICAgICAgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTWV0aG9kLCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUGFyYW1ldGVyKQorICAgICAqLworICAgIHB1YmxpYyBQYXJhbSBjcmVhdGVQYXJhbShmaW5hbCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2UgYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1ldGhvZCBhbSwgZmluYWwgUGFyYW1ldGVyIHApIHsKKyAgICAgICAgZmluYWwgUGFyYW0gcGFyYW0gPSB3YWRsR2VuZXJhdG9yRGVsZWdhdGUuY3JlYXRlUGFyYW0oYXIsIGFtLCBwKTsKKworICAgICAgICAvLyBJZiB0aGUgcGFyYW1ldGVyIGlzIGFuIGVudGl0eSB3ZSBwcm9iYWJseSB3YW50IHRvIGNvbnZlcnQgdGhpcyB0byBYTUwKKyAgICAgICAgaWYgKHAuZ2V0U291cmNlKCkgPT0gUGFyYW1ldGVyLlNvdXJjZS5FTlRJVFkpIHsKKyAgICAgICAgICAgIG5hbWVDYWxsYmFja3MuYWRkKG5ldyBUeXBlQ2FsbGJhY2tQYWlyKAorICAgICAgICAgICAgICAgICAgICBuZXcgR2VuZXJpY1R5cGUocC5nZXRUeXBlKCkpLAorICAgICAgICAgICAgICAgICAgICBuZXcgTmFtZUNhbGxiYWNrU2V0dGVyKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0TmFtZShmaW5hbCBRTmFtZSBuYW1lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0uc2V0VHlwZShuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHBhcmFtOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBhciAgYWJzdHJhY3QgcmVzb3VyY2UKKyAgICAgKiBAcGFyYW0gYXJtIGFic3RyYWN0IHJlc291cmNlIG1ldGhvZAorICAgICAqIEBwYXJhbSBtdCAgbWVkaWEgdHlwZQorICAgICAqIEByZXR1cm4gcmVzcHJlc2VudGF0aW9uIHR5cGUKKyAgICAgKiBAc2VlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLldhZGxHZW5lcmF0b3IjY3JlYXRlUmVxdWVzdFJlcHJlc2VudGF0aW9uKG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZSwKKyAgICAgKiBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNZXRob2QsIGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlKQorICAgICAqLworICAgIHB1YmxpYyBSZXByZXNlbnRhdGlvbiBjcmVhdGVSZXF1ZXN0UmVwcmVzZW50YXRpb24oCisgICAgICAgICAgICBmaW5hbCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2UgYXIsCisgICAgICAgICAgICBmaW5hbCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNZXRob2QgYXJtLAorICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG10KSB7CisKKyAgICAgICAgZmluYWwgUmVwcmVzZW50YXRpb24gcnQgPSB3YWRsR2VuZXJhdG9yRGVsZWdhdGUuY3JlYXRlUmVxdWVzdFJlcHJlc2VudGF0aW9uKGFyLCBhcm0sIG10KTsKKworICAgICAgICBmb3IgKGZpbmFsIFBhcmFtZXRlciBwIDogYXJtLmdldEludm9jYWJsZSgpLmdldFBhcmFtZXRlcnMoKSkgeworICAgICAgICAgICAgaWYgKHAuZ2V0U291cmNlKCkgPT0gUGFyYW1ldGVyLlNvdXJjZS5FTlRJVFkpIHsKKyAgICAgICAgICAgICAgICBuYW1lQ2FsbGJhY2tzLmFkZChuZXcgVHlwZUNhbGxiYWNrUGFpcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBHZW5lcmljVHlwZShwLmdldFR5cGUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTmFtZUNhbGxiYWNrU2V0dGVyKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoZmluYWwgUU5hbWUgbmFtZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydC5zZXRFbGVtZW50KG5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBydDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gYXIgICBhYnN0cmFjdCByZXNvdXJjZQorICAgICAqIEBwYXJhbSBwYXRoIHJlc291cmNlcyBwYXRoCisgICAgICogQHJldHVybiByZXNvdXJjZQorICAgICAqIEBzZWUgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuV2FkbEdlbmVyYXRvciNjcmVhdGVSZXNvdXJjZShvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2UsIFN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoZmluYWwgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlIGFyLCBmaW5hbCBTdHJpbmcgcGF0aCkgeworICAgICAgICBmb3IgKGZpbmFsIENsYXNzPD8+IHJlc0NsYXNzIDogYXIuZ2V0SGFuZGxlckNsYXNzZXMoKSkgeworICAgICAgICAgICAgZmluYWwgWG1sU2VlQWxzbyBzZWVBbHNvID0gcmVzQ2xhc3MuZ2V0QW5ub3RhdGlvbihYbWxTZWVBbHNvLmNsYXNzKTsKKyAgICAgICAgICAgIGlmIChzZWVBbHNvICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5hZGRBbGwoc2VlQWxzb0NsYXNzZXMsIHNlZUFsc28udmFsdWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gd2FkbEdlbmVyYXRvckRlbGVnYXRlLmNyZWF0ZVJlc291cmNlKGFyLCBwYXRoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHJlc291cmNlcworICAgICAqIEBzZWUgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuV2FkbEdlbmVyYXRvciNjcmVhdGVSZXNvdXJjZXMoKQorICAgICAqLworICAgIHB1YmxpYyBSZXNvdXJjZXMgY3JlYXRlUmVzb3VyY2VzKCkgeworICAgICAgICByZXR1cm4gd2FkbEdlbmVyYXRvckRlbGVnYXRlLmNyZWF0ZVJlc291cmNlcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSByZXNvdXJjZSAgICAgICBhYnN0cmFjdCByZXNvdXJjZQorICAgICAqIEBwYXJhbSByZXNvdXJjZU1ldGhvZCBhYnN0cmFjdCByZXNvdXJjZSBtZXRob2QKKyAgICAgKiBAcmV0dXJuIHJlc3BvbnNlCisgICAgICogQHNlZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5XYWRsR2VuZXJhdG9yI2NyZWF0ZVJlc3BvbnNlcyhvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2UsCisgICAgICogICAgICBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNZXRob2QpCisgICAgICovCisgICAgcHVibGljIExpc3Q8UmVzcG9uc2U+IGNyZWF0ZVJlc3BvbnNlcyhmaW5hbCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2UgcmVzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QpIHsKKyAgICAgICAgZmluYWwgTGlzdDxSZXNwb25zZT4gcmVzcG9uc2VzID0gd2FkbEdlbmVyYXRvckRlbGVnYXRlLmNyZWF0ZVJlc3BvbnNlcyhyZXNvdXJjZSwgcmVzb3VyY2VNZXRob2QpOworICAgICAgICBpZiAocmVzcG9uc2VzICE9IG51bGwpIHsKKworICAgICAgICAgICAgZm9yIChmaW5hbCBSZXNwb25zZSByZXNwb25zZSA6IHJlc3BvbnNlcykgeworICAgICAgICAgICAgICAgIGZvciAoZmluYWwgUmVwcmVzZW50YXRpb24gcmVwcmVzZW50YXRpb24gOiByZXNwb25zZS5nZXRSZXByZXNlbnRhdGlvbigpKSB7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gUHJvY2VzcyBlYWNoIHJlcHJlc2VudGF0aW9uCisgICAgICAgICAgICAgICAgICAgIG5hbWVDYWxsYmFja3MuYWRkKG5ldyBUeXBlQ2FsbGJhY2tQYWlyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBHZW5lcmljVHlwZShyZXNvdXJjZU1ldGhvZC5nZXRJbnZvY2FibGUoKS5nZXRSZXNwb25zZVR5cGUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5hbWVDYWxsYmFja1NldHRlcigpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXROYW1lKGZpbmFsIFFOYW1lIG5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHJlc2VudGF0aW9uLnNldEVsZW1lbnQobmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXNwb25zZXM7CisgICAgfQorCisgICAgLy8gPT09PT09PT09PT09PT09PSBtZXRob2RzIGZvciBwb3N0IGJ1aWxkIGFjdGlvbnMgPT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIHB1YmxpYyBFeHRlcm5hbEdyYW1tYXJEZWZpbml0aW9uIGNyZWF0ZUV4dGVybmFsR3JhbW1hcigpIHsKKworICAgICAgICAvLyBSaWdodCBub3cgbGV0cyBnZW5lcmF0ZSBzb21lIGV4dGVybmFsIG1ldGFkYXRhCisKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgQXBwbGljYXRpb25EZXNjcmlwdGlvbi5FeHRlcm5hbEdyYW1tYXI+IGV4dHJhRmlsZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisKKyAgICAgICAgLy8gQnVpbGQgdGhlIG1vZGVsIGFzIHJlcXVpcmVkCisgICAgICAgIGZpbmFsIFJlc29sdmVyIHJlc29sdmVyID0gYnVpbGRNb2RlbEFuZFNjaGVtYXMoZXh0cmFGaWxlcyk7CisKKyAgICAgICAgLy8gUGFzcyBvbnRvIHRoZSBuZXh0IGRlbGVnYXRlCisgICAgICAgIGZpbmFsIEV4dGVybmFsR3JhbW1hckRlZmluaXRpb24gcHJldmlvdXMgPSB3YWRsR2VuZXJhdG9yRGVsZWdhdGUuY3JlYXRlRXh0ZXJuYWxHcmFtbWFyKCk7CisgICAgICAgIHByZXZpb3VzLm1hcC5wdXRBbGwoZXh0cmFGaWxlcyk7CisgICAgICAgIGlmIChyZXNvbHZlciAhPSBudWxsKSB7CisgICAgICAgICAgICBwcmV2aW91cy5hZGRSZXNvbHZlcihyZXNvbHZlcik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcHJldmlvdXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQnVpbGQgdGhlIEpBWEIgbW9kZWwgYW5kIGdlbmVyYXRlIHRoZSBzY2hlbWFzIGJhc2VkIG9uIHRoYSBkYXRhCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXh0cmFGaWxlcyBhZGRpdGlvbmFsIGZpbGVzLgorICAgICAqIEByZXR1cm4gY2xhc3MgdG8ge0BsaW5rIFFOYW1lfSByZXNvbHZlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIFJlc29sdmVyIGJ1aWxkTW9kZWxBbmRTY2hlbWFzKGZpbmFsIE1hcDxTdHJpbmcsIEFwcGxpY2F0aW9uRGVzY3JpcHRpb24uRXh0ZXJuYWxHcmFtbWFyPiBleHRyYUZpbGVzKSB7CisKKyAgICAgICAgLy8gTGV0cyBnZXQgYWxsIGNhbmRpZGF0ZSBjbGFzc2VzIHNvIHdlIGNhbiBjcmVhdGUgdGhlIEpBWC1CIGNvbnRleHQKKyAgICAgICAgLy8gaW5jbHVkZSBhbnkgQFhtbFNlZUFsc28gcmVmZXJlbmNlcy4KKworICAgICAgICBmaW5hbCBTZXQ8Q2xhc3M+IGNsYXNzU2V0ID0gbmV3IEhhc2hTZXQ8PihzZWVBbHNvQ2xhc3Nlcyk7CisKKyAgICAgICAgZm9yIChmaW5hbCBUeXBlQ2FsbGJhY2tQYWlyIHBhaXIgOiBuYW1lQ2FsbGJhY2tzKSB7CisgICAgICAgICAgICBmaW5hbCBHZW5lcmljVHlwZSBnZW5lcmljVHlwZSA9IHBhaXIuZ2VuZXJpY1R5cGU7CisgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiBjbGF6eiA9IGdlbmVyaWNUeXBlLmdldFJhd1R5cGUoKTsKKworICAgICAgICAgICAgLy8gSXMgdGhpcyBjbGFzcyBpdHNlbGYgaW50ZXJlc3Rpbmc/CisKKyAgICAgICAgICAgIGlmIChjbGF6ei5nZXRBbm5vdGF0aW9uKFhtbFJvb3RFbGVtZW50LmNsYXNzKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY2xhc3NTZXQuYWRkKGNsYXp6KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoU1BFQ0lBTF9HRU5FUklDX1RZUEVTLmNvbnRhaW5zKGNsYXp6KSkgeworCisgICAgICAgICAgICAgICAgZmluYWwgVHlwZSB0eXBlID0gZ2VuZXJpY1R5cGUuZ2V0VHlwZSgpOworICAgICAgICAgICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgVHlwZSBwYXJhbWV0ZXJUeXBlID0gKChQYXJhbWV0ZXJpemVkVHlwZSkgdHlwZSkuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpWzBdOworICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyVHlwZSBpbnN0YW5jZW9mIENsYXNzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc1NldC5hZGQoKENsYXNzKSBwYXJhbWV0ZXJUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIENyZWF0ZSBhIEpBWC1CIGNvbnRleHQsIGFuZCB1c2UgdGhpcyB0byBnZW5lcmF0ZSB1cyBhIGJ1bmNoIG9mCisgICAgICAgIC8vIHNjaGVtYSBvYmplY3RzCisKKyAgICAgICAgSkFYQkludHJvc3BlY3RvciBpbnRyb3NwZWN0b3IgPSBudWxsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBKQVhCQ29udGV4dCBjb250ZXh0ID0gSkFYQkNvbnRleHQubmV3SW5zdGFuY2UoY2xhc3NTZXQudG9BcnJheShuZXcgQ2xhc3NbY2xhc3NTZXQuc2l6ZSgpXSkpOworCisgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmVhbVJlc3VsdD4gcmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgICAgICAgICBjb250ZXh0LmdlbmVyYXRlU2NoZW1hKG5ldyBTY2hlbWFPdXRwdXRSZXNvbHZlcigpIHsKKworICAgICAgICAgICAgICAgIGludCBjb3VudGVyID0gMDsKKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBSZXN1bHQgY3JlYXRlT3V0cHV0KGZpbmFsIFN0cmluZyBuYW1lc3BhY2VVcmksIGZpbmFsIFN0cmluZyBzdWdnZXN0ZWRGaWxlTmFtZSkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJlYW1SZXN1bHQgcmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChuZXcgQ2hhckFycmF5V3JpdGVyKCkpOworICAgICAgICAgICAgICAgICAgICByZXN1bHQuc2V0U3lzdGVtSWQoInhzZCIgKyAoY291bnRlcisrKSArICIueHNkIik7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMuYWRkKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIC8vIFN0b3JlIHRoZSBuZXcgZmlsZXMgZm9yIGxhdGVyIHVzZQorICAgICAgICAgICAgLy8KKworICAgICAgICAgICAgZm9yIChmaW5hbCBTdHJlYW1SZXN1bHQgcmVzdWx0IDogcmVzdWx0cykgeworICAgICAgICAgICAgICAgIGZpbmFsIENoYXJBcnJheVdyaXRlciB3cml0ZXIgPSAoQ2hhckFycmF5V3JpdGVyKSByZXN1bHQuZ2V0V3JpdGVyKCk7CisgICAgICAgICAgICAgICAgZmluYWwgYnl0ZVtdIGNvbnRlbnRzID0gd3JpdGVyLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoIlVURjgiKTsKKyAgICAgICAgICAgICAgICBleHRyYUZpbGVzLnB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5nZXRTeXN0ZW1JZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFwcGxpY2F0aW9uRGVzY3JpcHRpb24uRXh0ZXJuYWxHcmFtbWFyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MX1RZUEUsIC8vIEkgZG9uJ3QgdGhpbmsgdGhlcmUgaXMgYSBzcGVjaWZpYyBtZWRpYSB0eXBlIGZvciBYTUwgU2NoZW1hCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRzKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENyZWF0ZSBhbiBpbnRyb3NwZWN0b3IKKyAgICAgICAgICAgIC8vCisKKyAgICAgICAgICAgIGludHJvc3BlY3RvciA9IGNvbnRleHQuY3JlYXRlSkFYQkludHJvc3BlY3RvcigpOworCisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEpBWEJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5TRVZFUkUsICJGYWlsZWQgdG8gZ2VuZXJhdGUgdGhlIHNjaGVtYSBmb3IgdGhlIEpBWC1CIGVsZW1lbnRzIiwgZSk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuU0VWRVJFLCAiRmFpbGVkIHRvIGdlbmVyYXRlIHRoZSBzY2hlbWEgZm9yIHRoZSBKQVgtQiBlbGVtZW50cyBkdWUgdG8gYW4gSU8gZXJyb3IiLCBlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENyZWF0ZSBpbnRyb3NwZWN0b3IKKworICAgICAgICBpZiAoaW50cm9zcGVjdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIEpBWEJJbnRyb3NwZWN0b3IgY29weSA9IGludHJvc3BlY3RvcjsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvbHZlcigpIHsKKworICAgICAgICAgICAgICAgIHB1YmxpYyBRTmFtZSByZXNvbHZlKGZpbmFsIENsYXNzIHR5cGUpIHsKKworICAgICAgICAgICAgICAgICAgICBPYmplY3QgcGFyYW1ldGVyQ2xhc3NJbnN0YW5jZSA9IG51bGw7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb25zdHJ1Y3Rvcjw/PiBkZWZhdWx0Q29uc3RydWN0b3IgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjxDb25zdHJ1Y3Rvcjw/Pj4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIENvbnN0cnVjdG9yPD8+IHJ1bigpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbnN0cnVjdG9yPD8+IGNvbnN0cnVjdG9yID0gdHlwZS5nZXREZWNsYXJlZENvbnN0cnVjdG9yKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3Iuc2V0QWNjZXNzaWJsZSh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uc3RydWN0b3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyQ2xhc3NJbnN0YW5jZSA9IGRlZmF1bHRDb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJbnN0YW50aWF0aW9uRXhjZXB0aW9uIHwgU2VjdXJpdHlFeGNlcHRpb24gfCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gfCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLkZJTkUsIG51bGwsIGV4KTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgUHJpdmlsZWdlZEFjdGlvbkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5GSU5FLCBudWxsLCBleC5nZXRDYXVzZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJDbGFzc0luc3RhbmNlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb3B5LmdldEVsZW1lbnROYW1lKHBhcmFtZXRlckNsYXNzSW5zdGFuY2UpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBFY2xpcHNlTGluayB0aHJvd3MgYW4gTlBFIGlmIGFuIG9iamVjdCBhbm5vdGF0ZWQgd2l0aCBAWG1sVHlwZSBhbmQgd2l0aG91dCB0aGUgQFhtbFJvb3RFbGVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbm5vdGF0aW9uIGlzIHBhc3NlZCBhcyBhIHBhcmFtZXRlciBvZiAjZ2V0RWxlbWVudE5hbWUgbWV0aG9kLgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7IC8vIE5vIHJlc29sdmVyIGNyZWF0ZWQKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGF0dGFjaFR5cGVzKGZpbmFsIEFwcGxpY2F0aW9uRGVzY3JpcHRpb24gaW50cm9zcGVjdG9yKSB7CisKKyAgICAgICAgLy8gSWYgd2UgbWFuYWdlZCB0byBnZXQgYW4gaW50cm9zcGVjdG9yIHRoZW4gbGV0cyBnbyBiYWNrIGFuIHVwZGF0ZSB0aGUgcGFyYW1ldGVycworCisgICAgICAgIGlmIChpbnRyb3NwZWN0b3IgIT0gbnVsbCkgeworCisgICAgICAgICAgICBmb3IgKGZpbmFsIFR5cGVDYWxsYmFja1BhaXIgcGFpciA6IG5hbWVDYWxsYmFja3MpIHsKKworICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIGEgbWV0aG9kIG9uIHRoZSBSSSB2ZXJzaW9uIHRoYXQgd29ya3Mgd2l0aCBqdXN0CisgICAgICAgICAgICAgICAgLy8gdGhlIGNsYXNzIG5hbWU7IGJ1dCB1c2luZyB0aGUgaW50cm9zcGVjdG9yIGZvciB0aGUgbW9tZW50CisgICAgICAgICAgICAgICAgLy8gYXMgaXQgbGVhZHMgdG8gY2xlYW5lciBjb2RlCisgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gcGFyYW1ldGVyQ2xhc3MgPSBwYWlyLmdlbmVyaWNUeXBlLmdldFJhd1R5cGUoKTsKKworICAgICAgICAgICAgICAgIC8vIEZpeCB0aG9zZSBzcGVjaWZpYyBnZW5lcmljIHR5cGVzCisgICAgICAgICAgICAgICAgaWYgKFNQRUNJQUxfR0VORVJJQ19UWVBFUy5jb250YWlucyhwYXJhbWV0ZXJDbGFzcykpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgVHlwZSB0eXBlID0gcGFpci5nZW5lcmljVHlwZS5nZXRUeXBlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKFBhcmFtZXRlcml6ZWRUeXBlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZS5nZXRDbGFzcygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIENsYXNzLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oKChQYXJhbWV0ZXJpemVkVHlwZSkgdHlwZSkuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpWzBdLmdldENsYXNzKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJDbGFzcyA9IChDbGFzcykgKChQYXJhbWV0ZXJpemVkVHlwZSkgdHlwZSkuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpWzBdOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gV29ya3MgYXJvdW5kIEpFUlNFWS04MzAKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi5maW5lKCJDb3VsZG4ndCBmaW5kIEpBWC1CIGVsZW1lbnQgZHVlIHRvIG5lc3RlZCBwYXJhbWV0ZXJpemVkIHR5cGUgIiArIHR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZmluYWwgUU5hbWUgbmFtZSA9IGludHJvc3BlY3Rvci5yZXNvbHZlKHBhcmFtZXRlckNsYXNzKTsKKworICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFpci5uYW1lQ2FsbGJhY2tTZXR0ZXIuc2V0TmFtZShuYW1lKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBMT0dHRVIuZmluZSgiQ291bGRuJ3QgZmluZCBKQVgtQiBlbGVtZW50IGZvciBjbGFzcyAiICsgcGFyYW1ldGVyQ2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci93YWRsL2ludGVybmFsL2dlbmVyYXRvcnMvcGFja2FnZS1pbmZvLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci93YWRsL2ludGVybmFsL2dlbmVyYXRvcnMvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJhYTkzMwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvaW50ZXJuYWwvZ2VuZXJhdG9ycy9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDIxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvKioKKyAqIEplcnNleSBzZXJ2ZXItc2lkZSBXQURMIGludGVybmFsIGNsYXNzZXMgc3VwcG9ydGluZworICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLldhZGxHZW5lcmF0b3Igd2FkbCBnZW5lcmF0b3JzfS4KKyAqLworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5pbnRlcm5hbC5nZW5lcmF0b3JzOwpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9pbnRlcm5hbC9nZW5lcmF0b3JzL3Jlc291cmNlZG9jL1Jlc291cmNlRG9jQWNjZXNzb3IuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvaW50ZXJuYWwvZ2VuZXJhdG9ycy9yZXNvdXJjZWRvYy9SZXNvdXJjZURvY0FjY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYzMWM1YgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvaW50ZXJuYWwvZ2VuZXJhdG9ycy9yZXNvdXJjZWRvYy9SZXNvdXJjZURvY0FjY2Vzc29yLmphdmEKQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuaW50ZXJuYWwuZ2VuZXJhdG9ycy5yZXNvdXJjZWRvYzsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUGFyYW1ldGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLmludGVybmFsLmdlbmVyYXRvcnMucmVzb3VyY2Vkb2MubW9kZWwuQW5ub3RhdGlvbkRvY1R5cGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuaW50ZXJuYWwuZ2VuZXJhdG9ycy5yZXNvdXJjZWRvYy5tb2RlbC5DbGFzc0RvY1R5cGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuaW50ZXJuYWwuZ2VuZXJhdG9ycy5yZXNvdXJjZWRvYy5tb2RlbC5NZXRob2REb2NUeXBlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLmludGVybmFsLmdlbmVyYXRvcnMucmVzb3VyY2Vkb2MubW9kZWwuTmFtZWRWYWx1ZVR5cGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuaW50ZXJuYWwuZ2VuZXJhdG9ycy5yZXNvdXJjZWRvYy5tb2RlbC5QYXJhbURvY1R5cGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuaW50ZXJuYWwuZ2VuZXJhdG9ycy5yZXNvdXJjZWRvYy5tb2RlbC5SZXByZXNlbnRhdGlvbkRvY1R5cGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuaW50ZXJuYWwuZ2VuZXJhdG9ycy5yZXNvdXJjZWRvYy5tb2RlbC5SZXNvdXJjZURvY1R5cGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuaW50ZXJuYWwuZ2VuZXJhdG9ycy5yZXNvdXJjZWRvYy5tb2RlbC5SZXNwb25zZURvY1R5cGU7CisKKy8qKgorICogQSBjbGFzcyBwcm92aWRpbmcgYWNjZXNzIHRvIGluZm9ybWF0aW9uIHN0b3JlZCBpbiBhIHtAbGluayBSZXNvdXJjZURvY1R5cGV9Ljxicj4KKyAqIENyZWF0ZWQgb246IEp1biAxNiwgMjAwODxicj4KKyAqCisgKiBAYXV0aG9yIE1hcnRpbiBHcm90emtlIChtYXJ0aW4uZ3JvdHprZSBhdCBmcmVpaGVpdC5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNvdXJjZURvY0FjY2Vzc29yIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFJlc291cmNlRG9jQWNjZXNzb3IuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIHByaXZhdGUgUmVzb3VyY2VEb2NUeXBlIF9yZXNvdXJjZURvYzsKKworICAgIHB1YmxpYyBSZXNvdXJjZURvY0FjY2Vzc29yKFJlc291cmNlRG9jVHlwZSByZXNvdXJjZURvYykgeworICAgICAgICBfcmVzb3VyY2VEb2MgPSByZXNvdXJjZURvYzsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2xhc3NEb2NUeXBlIGdldENsYXNzRG9jKENsYXNzPD8+IHJlc291cmNlQ2xhc3MpIHsKKyAgICAgICAgaWYgKHJlc291cmNlQ2xhc3MgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKENsYXNzRG9jVHlwZSBjbGFzc0RvY1R5cGUgOiBfcmVzb3VyY2VEb2MuZ2V0RG9jcygpKSB7CisgICAgICAgICAgICBpZiAocmVzb3VyY2VDbGFzcy5nZXROYW1lKCkuZXF1YWxzKGNsYXNzRG9jVHlwZS5nZXRDbGFzc05hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2xhc3NEb2NUeXBlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBNZXRob2REb2NUeXBlIGdldE1ldGhvZERvYyhDbGFzczw/PiByZXNvdXJjZUNsYXNzLCBNZXRob2QgbWV0aG9kKSB7CisgICAgICAgIGlmIChyZXNvdXJjZUNsYXNzID09IG51bGwgfHwgbWV0aG9kID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgQ2xhc3NEb2NUeXBlIGNsYXNzRG9jID0gZ2V0Q2xhc3NEb2MocmVzb3VyY2VDbGFzcyk7CisgICAgICAgIGlmIChjbGFzc0RvYyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIE1ldGhvZERvY1R5cGUgY2FuZGlkYXRlID0gbnVsbDsKKyAgICAgICAgaW50IGNhbmRpZGF0ZUNvdW50ID0gMDsKKworICAgICAgICBmaW5hbCBTdHJpbmcgbWV0aG9kTmFtZSA9IG1ldGhvZC5nZXROYW1lKCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBtZXRob2RTaWduYXR1cmUgPSBjb21wdXRlU2lnbmF0dXJlKG1ldGhvZCk7CisgICAgICAgIGZvciAoTWV0aG9kRG9jVHlwZSBtZXRob2REb2NUeXBlIDogY2xhc3NEb2MuZ2V0TWV0aG9kRG9jcygpKSB7CisgICAgICAgICAgICBpZiAobWV0aG9kTmFtZS5lcXVhbHMobWV0aG9kRG9jVHlwZS5nZXRNZXRob2ROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgY2FuZGlkYXRlQ291bnQrKzsKKyAgICAgICAgICAgICAgICBpZiAoY2FuZGlkYXRlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FuZGlkYXRlID0gbWV0aG9kRG9jVHlwZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRvY01ldGhvZFNpZ25hdHVyZSA9IG1ldGhvZERvY1R5cGUuZ2V0TWV0aG9kU2lnbmF0dXJlKCk7CisgICAgICAgICAgICAgICAgaWYgKGRvY01ldGhvZFNpZ25hdHVyZSAhPSBudWxsICYmIGRvY01ldGhvZFNpZ25hdHVyZS5lcXVhbHMobWV0aG9kU2lnbmF0dXJlKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWV0aG9kRG9jVHlwZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoY2FuZGlkYXRlICE9IG51bGwgJiYgY2FuZGlkYXRlQ291bnQgPiAxICYmIExPR0dFUi5pc0xvZ2dhYmxlKExldmVsLkNPTkZJRykpIHsKKyAgICAgICAgICAgIExPR0dFUi5jb25maWcoTG9jYWxpemF0aW9uTWVzc2FnZXMuV0FETF9SRVNPVVJDRURPQ19BTUJJR1VPVVNfTUVUSE9EX0VOVFJJRVMoCisgICAgICAgICAgICAgICAgICAgIHJlc291cmNlQ2xhc3MuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICBtZXRob2ROYW1lLAorICAgICAgICAgICAgICAgICAgICBtZXRob2RTaWduYXR1cmUsCisgICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZUNvdW50KSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY2FuZGlkYXRlOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGNvbXB1dGVTaWduYXR1cmUoZmluYWwgTWV0aG9kIG1ldGhvZCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgbWV0aG9kQXNTdHJpbmcgPSBtZXRob2QudG9HZW5lcmljU3RyaW5nKCk7CisgICAgICAgIHJldHVybiBtZXRob2RBc1N0cmluZy5zdWJzdHJpbmcobWV0aG9kQXNTdHJpbmcuaW5kZXhPZignKCcpLCBtZXRob2RBc1N0cmluZy5sYXN0SW5kZXhPZignKScpICsgMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHJlc291cmNlQ2xhc3MKKyAgICAgKiBAcGFyYW0gbWV0aG9kCisgICAgICogQHBhcmFtIHAKKyAgICAgKiBAcmV0dXJuIHBhcmFtIGRvYyB0eXBlCisgICAgICovCisgICAgcHVibGljIFBhcmFtRG9jVHlwZSBnZXRQYXJhbURvYyhDbGFzczw/PiByZXNvdXJjZUNsYXNzLCBNZXRob2QgbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVyIHApIHsKKyAgICAgICAgZmluYWwgTWV0aG9kRG9jVHlwZSBtZXRob2REb2MgPSBnZXRNZXRob2REb2MocmVzb3VyY2VDbGFzcywgbWV0aG9kKTsKKyAgICAgICAgaWYgKG1ldGhvZERvYyAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKFBhcmFtRG9jVHlwZSBwYXJhbURvY1R5cGUgOiBtZXRob2REb2MuZ2V0UGFyYW1Eb2NzKCkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKEFubm90YXRpb25Eb2NUeXBlIGFubm90YXRpb25Eb2NUeXBlIDogcGFyYW1Eb2NUeXBlLmdldEFubm90YXRpb25Eb2NzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGFubm90YXRpb25UeXBlID0gcC5nZXRTb3VyY2VBbm5vdGF0aW9uKCkuYW5ub3RhdGlvblR5cGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFubm90YXRpb25UeXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzb3VyY2VOYW1lID0gZ2V0U291cmNlTmFtZShhbm5vdGF0aW9uRG9jVHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc291cmNlTmFtZSAhPSBudWxsICYmIHNvdXJjZU5hbWUuZXF1YWxzKHAuZ2V0U291cmNlTmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbURvY1R5cGU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIFJlcHJlc2VudGF0aW9uRG9jVHlwZSBnZXRSZXF1ZXN0UmVwcmVzZW50YXRpb24oQ2xhc3M8Pz4gcmVzb3VyY2VDbGFzcywgTWV0aG9kIG1ldGhvZCwgU3RyaW5nIG1lZGlhVHlwZSkgeworICAgICAgICBpZiAobWVkaWFUeXBlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIGZpbmFsIE1ldGhvZERvY1R5cGUgbWV0aG9kRG9jID0gZ2V0TWV0aG9kRG9jKHJlc291cmNlQ2xhc3MsIG1ldGhvZCk7CisgICAgICAgIHJldHVybiBtZXRob2REb2MgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIG1ldGhvZERvYy5nZXRSZXF1ZXN0RG9jKCkgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIG1ldGhvZERvYy5nZXRSZXF1ZXN0RG9jKCkuZ2V0UmVwcmVzZW50YXRpb25Eb2MoKSAhPSBudWxsCisgICAgICAgICAgICAgICAgLy8gJiYgbWVkaWFUeXBlLmVxdWFscyggbWV0aG9kRG9jLmdldFJlcXVlc3REb2MoKS5nZXRSZXByZXNlbnRhdGlvbkRvYygpLmdldE1lZGlhVHlwZSgpICkKKyAgICAgICAgICAgICAgICA/IG1ldGhvZERvYy5nZXRSZXF1ZXN0RG9jKCkuZ2V0UmVwcmVzZW50YXRpb25Eb2MoKSA6IG51bGw7CisgICAgfQorCisgICAgcHVibGljIFJlc3BvbnNlRG9jVHlwZSBnZXRSZXNwb25zZShDbGFzczw/PiByZXNvdXJjZUNsYXNzLCBNZXRob2QgbWV0aG9kKSB7CisgICAgICAgIGZpbmFsIE1ldGhvZERvY1R5cGUgbWV0aG9kRG9jID0gZ2V0TWV0aG9kRG9jKHJlc291cmNlQ2xhc3MsIG1ldGhvZCk7CisgICAgICAgIHJldHVybiBtZXRob2REb2MgIT0gbnVsbCAmJiBtZXRob2REb2MuZ2V0UmVzcG9uc2VEb2MoKSAhPSBudWxsCisgICAgICAgICAgICAgICAgPyBtZXRob2REb2MuZ2V0UmVzcG9uc2VEb2MoKSA6IG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0U291cmNlTmFtZShBbm5vdGF0aW9uRG9jVHlwZSBhbm5vdGF0aW9uRG9jVHlwZSkgeworICAgICAgICBpZiAoYW5ub3RhdGlvbkRvY1R5cGUuaGFzQXR0cmlidXRlRG9jcygpKSB7CisgICAgICAgICAgICBmb3IgKE5hbWVkVmFsdWVUeXBlIG5hbWVkVmFsdWVUeXBlIDogYW5ub3RhdGlvbkRvY1R5cGUuZ2V0QXR0cmlidXRlRG9jcygpKSB7CisgICAgICAgICAgICAgICAgLyogdGhlIHZhbHVlIG9mIHRoZSAidmFsdWUiLWF0dHJpYnV0ZSBpcyB0aGUgcGFyYW0uc291cmNlTmFtZS4uLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmICgidmFsdWUiLmVxdWFscyhuYW1lZFZhbHVlVHlwZS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuYW1lZFZhbHVlVHlwZS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvaW50ZXJuYWwvZ2VuZXJhdG9ycy9yZXNvdXJjZWRvYy9XYWRsR2VuZXJhdG9yUmVzb3VyY2VEb2NTdXBwb3J0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci93YWRsL2ludGVybmFsL2dlbmVyYXRvcnMvcmVzb3VyY2Vkb2MvV2FkbEdlbmVyYXRvclJlc291cmNlRG9jU3VwcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMWJiOWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci93YWRsL2ludGVybmFsL2dlbmVyYXRvcnMvcmVzb3VyY2Vkb2MvV2FkbEdlbmVyYXRvclJlc291cmNlRG9jU3VwcG9ydC5qYXZhCkBAIC0wLDAgKzEsMzU1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLmludGVybmFsLmdlbmVyYXRvcnMucmVzb3VyY2Vkb2M7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUGFyYW1ldGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1ldGhvZDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5XYWRsR2VuZXJhdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLmludGVybmFsLkFwcGxpY2F0aW9uRGVzY3JpcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuaW50ZXJuYWwuV2FkbFV0aWxzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLmludGVybmFsLmdlbmVyYXRvcnMucmVzb3VyY2Vkb2MubW9kZWwuQ2xhc3NEb2NUeXBlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLmludGVybmFsLmdlbmVyYXRvcnMucmVzb3VyY2Vkb2MubW9kZWwuTWV0aG9kRG9jVHlwZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5pbnRlcm5hbC5nZW5lcmF0b3JzLnJlc291cmNlZG9jLm1vZGVsLlBhcmFtRG9jVHlwZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5pbnRlcm5hbC5nZW5lcmF0b3JzLnJlc291cmNlZG9jLm1vZGVsLlJlcHJlc2VudGF0aW9uRG9jVHlwZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5pbnRlcm5hbC5nZW5lcmF0b3JzLnJlc291cmNlZG9jLm1vZGVsLlJlc291cmNlRG9jVHlwZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5pbnRlcm5hbC5nZW5lcmF0b3JzLnJlc291cmNlZG9jLm1vZGVsLlJlc3BvbnNlRG9jVHlwZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5pbnRlcm5hbC5nZW5lcmF0b3JzLnJlc291cmNlZG9jLm1vZGVsLldhZGxQYXJhbVR5cGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuaW50ZXJuYWwuZ2VuZXJhdG9ycy5yZXNvdXJjZWRvYy54aHRtbC5FbGVtZW50czsKKworaW1wb3J0IGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5BcHBsaWNhdGlvbjsKK2ltcG9ydCBjb20uc3VuLnJlc2VhcmNoLndzLndhZGwuRG9jOworaW1wb3J0IGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5NZXRob2Q7CitpbXBvcnQgY29tLnN1bi5yZXNlYXJjaC53cy53YWRsLlBhcmFtOworaW1wb3J0IGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5QYXJhbVN0eWxlOworaW1wb3J0IGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5SZXByZXNlbnRhdGlvbjsKK2ltcG9ydCBjb20uc3VuLnJlc2VhcmNoLndzLndhZGwuUmVxdWVzdDsKK2ltcG9ydCBjb20uc3VuLnJlc2VhcmNoLndzLndhZGwuUmVzb3VyY2U7CitpbXBvcnQgY29tLnN1bi5yZXNlYXJjaC53cy53YWRsLlJlc291cmNlczsKK2ltcG9ydCBjb20uc3VuLnJlc2VhcmNoLndzLndhZGwuUmVzcG9uc2U7CisKKy8qKgorICogQSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuV2FkbEdlbmVyYXRvcn0gaW1wbGVtZW50YXRpb24gdGhhdCBlbmhhbmNlcyB0aGUgZ2VuZXJhdGVkIHdhZGwgYnkKKyAqIGluZm9ybWF0aW9uIHJlYWQgZnJvbSBhIHJlc291cmNlZG9jIChjb250YWluaW5nIGphdmFkb2MgaW5mb3JtYXRpb24gYWJvdXQgcmVzb3VyY2UKKyAqIGNsYXNzZXMpLgorICogPHA+CisgKiBUaGUgcmVzb3VyY2Vkb2MgaW5mb3JtYXRpb24gY2FuIGVpdGhlciBiZSBwcm92aWRlZCB2aWEgYSB7QGxpbmsgRmlsZX0gKHtAbGluayAjc2V0UmVzb3VyY2VEb2NGaWxlKEZpbGUpfSkgcmVmZXJlbmNlIG9yCisgKiB2aWEgYW4ge0BsaW5rIElucHV0U3RyZWFtfSAoe0BsaW5rICNzZXRSZXNvdXJjZURvY1N0cmVhbShJbnB1dFN0cmVhbSl9KS4KKyAqIDwvcD4KKyAqIDxwPgorICogVGhlIHtAbGluayBGaWxlfSBzaG91bGQgYmUgdXNlZCB3aGVuIHVzaW5nIHRoZSBtYXZlbi13YWRsLXBsdWdpbiBmb3IgZ2VuZXJhdGluZyB3YWRsIG9mZmxpbmUsCisgKiB0aGUge0BsaW5rIElucHV0U3RyZWFtfSBzaG91bGQgYmUgdXNlZCB3aGVuIHRoZSBleHRlbmRlZCB3YWRsIGlzIGdlbmVyYXRlZCBieSBqZXJzZXkgYXQgcnVudGltZSwgZS5nLgorICogdXNpbmcgdGhlIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5jb25maWcuV2FkbEdlbmVyYXRvckNvbmZpZ30gZm9yIGNvbmZpZ3VyYXRpb24uCisgKiA8L3A+CisgKgorICogQGF1dGhvciBNYXJ0aW4gR3JvdHprZSAobWFydGluLmdyb3R6a2UgYXQgZnJlaWhlaXQuY29tKQorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgY2xhc3MgV2FkbEdlbmVyYXRvclJlc291cmNlRG9jU3VwcG9ydCBpbXBsZW1lbnRzIFdhZGxHZW5lcmF0b3IgeworCisgICAgcHJpdmF0ZSBXYWRsR2VuZXJhdG9yIGRlbGVnYXRlOworICAgIHByaXZhdGUgRmlsZSByZXNvdXJjZURvY0ZpbGU7CisgICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSByZXNvdXJjZURvY1N0cmVhbTsKKyAgICBwcml2YXRlIFJlc291cmNlRG9jQWNjZXNzb3IgcmVzb3VyY2VEb2M7CisgICAgQENvbnRleHQKKyAgICBwcml2YXRlIFByb3ZpZGVyPFNBWFBhcnNlckZhY3Rvcnk+IHNheEZhY3RvcnlQcm92aWRlcjsKKworCisgICAgcHVibGljIFdhZGxHZW5lcmF0b3JSZXNvdXJjZURvY1N1cHBvcnQoKSB7CisgICAgfQorCisgICAgcHVibGljIFdhZGxHZW5lcmF0b3JSZXNvdXJjZURvY1N1cHBvcnQoZmluYWwgV2FkbEdlbmVyYXRvciB3YWRsR2VuZXJhdG9yLCBmaW5hbCBSZXNvdXJjZURvY1R5cGUgcmVzb3VyY2VEb2MpIHsKKyAgICAgICAgZGVsZWdhdGUgPSB3YWRsR2VuZXJhdG9yOworICAgICAgICB0aGlzLnJlc291cmNlRG9jID0gbmV3IFJlc291cmNlRG9jQWNjZXNzb3IocmVzb3VyY2VEb2MpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFdhZGxHZW5lcmF0b3JEZWxlZ2F0ZShmaW5hbCBXYWRsR2VuZXJhdG9yIGRlbGVnYXRlKSB7CisgICAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIDxjb2RlPnJlc291cmNlRG9jRmlsZTwvY29kZT4gdG8gdGhlIGdpdmVuIGZpbGUuIEludm9raW5nIHRoaXMgbWV0aG9kIGlzIG9ubHkgYWxsb3dlZCwgYXMgbG9uZyBhcworICAgICAqIHRoZSA8Y29kZT5yZXNvdXJjZURvY1N0cmVhbTwvY29kZT4gaXMgbm90IHNldCwgb3RoZXJ3aXNlIGFuIHtAbGluayBJbGxlZ2FsU3RhdGVFeGNlcHRpb259IHdpbGwgYmUgdGhyb3duLgorICAgICAqIEBwYXJhbSByZXNvdXJjZURvY0ZpbGUgdGhlIHJlc291cmNlZG9jIGZpbGUgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlc291cmNlRG9jRmlsZShmaW5hbCBGaWxlIHJlc291cmNlRG9jRmlsZSkgeworICAgICAgICBpZiAocmVzb3VyY2VEb2NTdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIHJlc291cmNlRG9jU3RyZWFtIHByb3BlcnR5IGlzIGFscmVhZHkgc2V0LCIKKyAgICAgICAgICAgICAgICAgICAgKyAiIHRoZXJlZm9yZSB5b3UgY2Fubm90IHNldCB0aGUgcmVzb3VyY2VEb2NGaWxlIHByb3BlcnR5LiBPbmx5IG9uZSBvZiBib3RoIGNhbiBiZSBzZXQgYXQgYSB0aW1lLiIpOworICAgICAgICB9CisgICAgICAgIHRoaXMucmVzb3VyY2VEb2NGaWxlID0gcmVzb3VyY2VEb2NGaWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgPGNvZGU+cmVzb3VyY2VEb2NTdHJlYW08L2NvZGU+IHRvIHRoZSBnaXZlbiBmaWxlLiBJbnZva2luZyB0aGlzIG1ldGhvZCBpcyBvbmx5IGFsbG93ZWQsIGFzIGxvbmcgYXMKKyAgICAgKiB0aGUgPGNvZGU+cmVzb3VyY2VEb2NGaWxlPC9jb2RlPiBpcyBub3Qgc2V0LCBvdGhlcndpc2UgYW4ge0BsaW5rIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbn0gd2lsbCBiZSB0aHJvd24uCisgICAgICogPHA+CisgICAgICogVGhlIHJlc291cmNlZG9jIHN0cmVhbSBtdXN0IGJlIGNsb3NlZCBieSB0aGUgY2xpZW50IHByb3ZpZGluZyB0aGUgc3RyZWFtLgorICAgICAqIDwvcD4KKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VEb2NTdHJlYW0gdGhlIHJlc291cmNlZG9jIHN0cmVhbSB0byBzZXQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2VEb2NTdHJlYW0oZmluYWwgSW5wdXRTdHJlYW0gcmVzb3VyY2VEb2NTdHJlYW0pIHsKKyAgICAgICAgaWYgKHRoaXMucmVzb3VyY2VEb2NTdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIHJlc291cmNlRG9jRmlsZSBwcm9wZXJ0eSBpcyBhbHJlYWR5IHNldCwiCisgICAgICAgICAgICAgICAgICAgICsgIiB0aGVyZWZvcmUgeW91IGNhbm5vdCBzZXQgdGhlIHJlc291cmNlRG9jU3RyZWFtIHByb3BlcnR5LiBPbmx5IG9uZSBvZiBib3RoIGNhbiBiZSBzZXQgYXQgYSB0aW1lLiIpOworICAgICAgICB9CisgICAgICAgIHRoaXMucmVzb3VyY2VEb2NTdHJlYW0gPSByZXNvdXJjZURvY1N0cmVhbTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBpbml0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChyZXNvdXJjZURvY0ZpbGUgPT0gbnVsbCAmJiByZXNvdXJjZURvY1N0cmVhbSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJOZWl0aGVyIHRoZSByZXNvdXJjZURvY0ZpbGUgbm9yIHRoZSByZXNvdXJjZURvY1N0cmVhbSIKKyAgICAgICAgICAgICAgICAgICAgKyAiIGlzIHNldCwgb25lIG9mIGJvdGggaXMgcmVxdWlyZWQuIik7CisgICAgICAgIH0KKyAgICAgICAgZGVsZWdhdGUuaW5pdCgpOworCisgICAgICAgIHRyeSAoZmluYWwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSByZXNvdXJjZURvY0ZpbGUgIT0gbnVsbCA/IG5ldyBGaWxlSW5wdXRTdHJlYW0ocmVzb3VyY2VEb2NGaWxlKSA6IHJlc291cmNlRG9jU3RyZWFtKSB7CisgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZURvY1R5cGUgcmVzb3VyY2VEb2NUeXBlID0KKyAgICAgICAgICAgICAgICAgICAgV2FkbFV0aWxzLnVubWFyc2hhbGwoaW5wdXRTdHJlYW0sIHNheEZhY3RvcnlQcm92aWRlci5nZXQoKSwgUmVzb3VyY2VEb2NUeXBlLmNsYXNzKTsKKyAgICAgICAgICAgIHJlc291cmNlRG9jID0gbmV3IFJlc291cmNlRG9jQWNjZXNzb3IocmVzb3VyY2VEb2NUeXBlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHJlc291cmNlRG9jRmlsZSA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlcXVpcmVkSmF4YkNvbnRleHRQYXRoKCkgeworICAgICAgICBTdHJpbmcgbmFtZSA9IEVsZW1lbnRzLmNsYXNzLmdldE5hbWUoKTsKKyAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDAsIG5hbWUubGFzdEluZGV4T2YoJy4nKSk7CisKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldFJlcXVpcmVkSmF4YkNvbnRleHRQYXRoKCkgPT0gbnVsbAorICAgICAgICAgICAgICAgID8gbmFtZQorICAgICAgICAgICAgICAgIDogZGVsZWdhdGUuZ2V0UmVxdWlyZWRKYXhiQ29udGV4dFBhdGgoKSArICI6IiArIG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUge0BsaW5rIGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5BcHBsaWNhdGlvbn0gY3JlYXRlZCBieSB0aGUgZGVsZWdhdGUuCisgICAgICogQHNlZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5XYWRsR2VuZXJhdG9yI2NyZWF0ZUFwcGxpY2F0aW9uKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgQXBwbGljYXRpb24gY3JlYXRlQXBwbGljYXRpb24oKSB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5jcmVhdGVBcHBsaWNhdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSByIEplcnNleSByZXNvdXJjZSBjb21wb25lbnQgZm9yIHdoaWNoIHRoZSBXQURMIHJlb3VyY2UgaXMgdG8gYmUgY3JlYXRlZC4KKyAgICAgKiBAcGFyYW0gcGF0aCBwYXRoIHdoZXJlIHRoZSByZXNvdXJjZSBpcyBleHBvc2VkLgorICAgICAqIEByZXR1cm4gdGhlIGVuaGFuY2VkIHtAbGluayBjb20uc3VuLnJlc2VhcmNoLndzLndhZGwuUmVzb3VyY2V9LgorICAgICAqIEBzZWUgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuV2FkbEdlbmVyYXRvciNjcmVhdGVSZXNvdXJjZShvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2UsIFN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoZmluYWwgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlIHIsIGZpbmFsIFN0cmluZyBwYXRoKSB7CisgICAgICAgIGZpbmFsIFJlc291cmNlIHJlc3VsdCA9IGRlbGVnYXRlLmNyZWF0ZVJlc291cmNlKHIsIHBhdGgpOworICAgICAgICBmb3IgKGZpbmFsIENsYXNzPD8+IHJlc291cmNlQ2xhc3MgOiByLmdldEhhbmRsZXJDbGFzc2VzKCkpIHsKKyAgICAgICAgICAgIGZpbmFsIENsYXNzRG9jVHlwZSBjbGFzc0RvYyA9IHJlc291cmNlRG9jLmdldENsYXNzRG9jKHJlc291cmNlQ2xhc3MpOworICAgICAgICAgICAgaWYgKGNsYXNzRG9jICE9IG51bGwgJiYgIWlzRW1wdHkoY2xhc3NEb2MuZ2V0Q29tbWVudFRleHQoKSkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBEb2MgZG9jID0gbmV3IERvYygpOworICAgICAgICAgICAgICAgIGRvYy5nZXRDb250ZW50KCkuYWRkKGNsYXNzRG9jLmdldENvbW1lbnRUZXh0KCkpOworICAgICAgICAgICAgICAgIHJlc3VsdC5nZXREb2MoKS5hZGQoZG9jKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSByZXNvdXJjZSBKZXJzZXkgcmVzb3VyY2UgY29tcG9uZW50LgorICAgICAqIEBwYXJhbSByZXNvdXJjZU1ldGhvZCByZXNvdXJjZSBtZXRob2QuCisgICAgICogQHJldHVybiB0aGUgZW5oYW5jZWQge0BsaW5rIGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5NZXRob2R9LgorICAgICAqIEBzZWUgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuV2FkbEdlbmVyYXRvciNjcmVhdGVNZXRob2Qob3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlLAorICAgICAqIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1ldGhvZCkKKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0aG9kIGNyZWF0ZU1ldGhvZChmaW5hbCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2UgcmVzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QpIHsKKyAgICAgICAgZmluYWwgTWV0aG9kIHJlc3VsdCA9IGRlbGVnYXRlLmNyZWF0ZU1ldGhvZChyZXNvdXJjZSwgcmVzb3VyY2VNZXRob2QpOworICAgICAgICBmaW5hbCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QgbWV0aG9kID0gcmVzb3VyY2VNZXRob2QuZ2V0SW52b2NhYmxlKCkuZ2V0RGVmaW5pdGlvbk1ldGhvZCgpOworICAgICAgICBmaW5hbCBNZXRob2REb2NUeXBlIG1ldGhvZERvYyA9IHJlc291cmNlRG9jLmdldE1ldGhvZERvYyhtZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKSwgbWV0aG9kKTsKKyAgICAgICAgaWYgKG1ldGhvZERvYyAhPSBudWxsICYmICFpc0VtcHR5KG1ldGhvZERvYy5nZXRDb21tZW50VGV4dCgpKSkgeworICAgICAgICAgICAgZmluYWwgRG9jIGRvYyA9IG5ldyBEb2MoKTsKKyAgICAgICAgICAgIGRvYy5nZXRDb250ZW50KCkuYWRkKG1ldGhvZERvYy5nZXRDb21tZW50VGV4dCgpKTsKKyAgICAgICAgICAgIC8vIGRvYy5nZXRPdGhlckF0dHJpYnV0ZXMoKS5wdXQoIG5ldyBRTmFtZSggInhtbG5zIiApLCAiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIgKTsKKyAgICAgICAgICAgIHJlc3VsdC5nZXREb2MoKS5hZGQoZG9jKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHIgSmVyc2V5IHJlc291cmNlIGNvbXBvbmVudC4KKyAgICAgKiBAcGFyYW0gbSByZXNvdXJjZSBtZXRob2QuCisgICAgICogQHBhcmFtIG1lZGlhVHlwZSBtZWRpYSB0eXBlLgorICAgICAqIEByZXR1cm4gdGhlIGVuaGFuY2VkIHtAbGluayBjb20uc3VuLnJlc2VhcmNoLndzLndhZGwuUmVwcmVzZW50YXRpb259LgorICAgICAqIEBzZWUgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuV2FkbEdlbmVyYXRvciNjcmVhdGVSZXF1ZXN0UmVwcmVzZW50YXRpb24ob3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlLAorICAgICAqIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1ldGhvZCwgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGUpCisgICAgICovCisgICAgcHVibGljIFJlcHJlc2VudGF0aW9uIGNyZWF0ZVJlcXVlc3RSZXByZXNlbnRhdGlvbihmaW5hbCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2UgciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1ldGhvZCBtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICBmaW5hbCBSZXByZXNlbnRhdGlvbiByZXN1bHQgPSBkZWxlZ2F0ZS5jcmVhdGVSZXF1ZXN0UmVwcmVzZW50YXRpb24ociwgbSwgbWVkaWFUeXBlKTsKKyAgICAgICAgZmluYWwgUmVwcmVzZW50YXRpb25Eb2NUeXBlIHJlcXVlc3RSZXByZXNlbnRhdGlvbiA9IHJlc291cmNlRG9jLmdldFJlcXVlc3RSZXByZXNlbnRhdGlvbihtLmdldEludm9jYWJsZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RGVmaW5pdGlvbk1ldGhvZCgpLmdldERlY2xhcmluZ0NsYXNzKCksCisgICAgICAgICAgICAgICAgbS5nZXRJbnZvY2FibGUoKS5nZXREZWZpbml0aW9uTWV0aG9kKCksIHJlc3VsdC5nZXRNZWRpYVR5cGUoKQorICAgICAgICApOworICAgICAgICBpZiAocmVxdWVzdFJlcHJlc2VudGF0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlc3VsdC5zZXRFbGVtZW50KHJlcXVlc3RSZXByZXNlbnRhdGlvbi5nZXRFbGVtZW50KCkpOworICAgICAgICAgICAgYWRkRG9jRm9yRXhhbXBsZShyZXN1bHQuZ2V0RG9jKCksIHJlcXVlc3RSZXByZXNlbnRhdGlvbi5nZXRFeGFtcGxlKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHIgSmVyc2V5IHJlc291cmNlIGNvbXBvbmVudC4KKyAgICAgKiBAcGFyYW0gbSByZXNvdXJjZSBtZXRob2QuCisgICAgICogQHJldHVybiB0aGUgZW5oYW5jZWQge0BsaW5rIGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5SZXF1ZXN0fS4KKyAgICAgKiBAc2VlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLldhZGxHZW5lcmF0b3IjY3JlYXRlUmVxdWVzdChvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2UsCisgICAgICogb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTWV0aG9kKQorICAgICAqLworICAgIHB1YmxpYyBSZXF1ZXN0IGNyZWF0ZVJlcXVlc3QoZmluYWwgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlIHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNZXRob2QgbSkgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUuY3JlYXRlUmVxdWVzdChyLCBtKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gciBKZXJzZXkgcmVzb3VyY2UgY29tcG9uZW50LgorICAgICAqIEBwYXJhbSBtIHJlc291cmNlIG1ldGhvZC4KKyAgICAgKiBAcmV0dXJuIHRoZSBlbmhhbmNlZCB7QGxpbmsgY29tLnN1bi5yZXNlYXJjaC53cy53YWRsLlJlc3BvbnNlfS4KKyAgICAgKiBAc2VlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLldhZGxHZW5lcmF0b3IjY3JlYXRlUmVzcG9uc2VzKG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZSwKKyAgICAgKiBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNZXRob2QpCisgICAgICovCisgICAgcHVibGljIExpc3Q8UmVzcG9uc2U+IGNyZWF0ZVJlc3BvbnNlcyhmaW5hbCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2UgciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1ldGhvZCBtKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlRG9jVHlwZSByZXNwb25zZURvYyA9IHJlc291cmNlRG9jLmdldFJlc3BvbnNlKG0uZ2V0SW52b2NhYmxlKCkuZ2V0RGVmaW5pdGlvbk1ldGhvZCgpLmdldERlY2xhcmluZ0NsYXNzKCksCisgICAgICAgICAgICAgICAgbS5nZXRJbnZvY2FibGUoKS5nZXREZWZpbml0aW9uTWV0aG9kKCkpOworICAgICAgICBMaXN0PFJlc3BvbnNlPiByZXNwb25zZXMgPSBuZXcgQXJyYXlMaXN0PFJlc3BvbnNlPigpOworICAgICAgICBpZiAocmVzcG9uc2VEb2MgIT0gbnVsbCAmJiByZXNwb25zZURvYy5oYXNSZXByZXNlbnRhdGlvbnMoKSkgeworICAgICAgICAgICAgZm9yIChmaW5hbCBSZXByZXNlbnRhdGlvbkRvY1R5cGUgcmVwcmVzZW50YXRpb25Eb2MgOiByZXNwb25zZURvYy5nZXRSZXByZXNlbnRhdGlvbnMoKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gbmV3IFJlc3BvbnNlKCk7CisKKyAgICAgICAgICAgICAgICBmaW5hbCBSZXByZXNlbnRhdGlvbiB3YWRsUmVwcmVzZW50YXRpb24gPSBuZXcgUmVwcmVzZW50YXRpb24oKTsKKyAgICAgICAgICAgICAgICB3YWRsUmVwcmVzZW50YXRpb24uc2V0RWxlbWVudChyZXByZXNlbnRhdGlvbkRvYy5nZXRFbGVtZW50KCkpOworICAgICAgICAgICAgICAgIHdhZGxSZXByZXNlbnRhdGlvbi5zZXRNZWRpYVR5cGUocmVwcmVzZW50YXRpb25Eb2MuZ2V0TWVkaWFUeXBlKCkpOworICAgICAgICAgICAgICAgIGFkZERvY0ZvckV4YW1wbGUod2FkbFJlcHJlc2VudGF0aW9uLmdldERvYygpLCByZXByZXNlbnRhdGlvbkRvYy5nZXRFeGFtcGxlKCkpOworICAgICAgICAgICAgICAgIGFkZERvYyh3YWRsUmVwcmVzZW50YXRpb24uZ2V0RG9jKCksIHJlcHJlc2VudGF0aW9uRG9jLmdldERvYygpKTsKKworICAgICAgICAgICAgICAgIHJlc3BvbnNlLmdldFN0YXR1cygpLmFkZChyZXByZXNlbnRhdGlvbkRvYy5nZXRTdGF0dXMoKSk7CisgICAgICAgICAgICAgICAgcmVzcG9uc2UuZ2V0UmVwcmVzZW50YXRpb24oKS5hZGQod2FkbFJlcHJlc2VudGF0aW9uKTsKKworICAgICAgICAgICAgICAgIHJlc3BvbnNlcy5hZGQocmVzcG9uc2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIXJlc3BvbnNlRG9jLmdldFdhZGxQYXJhbXMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIFdhZGxQYXJhbVR5cGUgd2FkbFBhcmFtVHlwZSA6IHJlc3BvbnNlRG9jLmdldFdhZGxQYXJhbXMoKSkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBQYXJhbSBwYXJhbSA9IG5ldyBQYXJhbSgpOworICAgICAgICAgICAgICAgICAgICBwYXJhbS5zZXROYW1lKHdhZGxQYXJhbVR5cGUuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW0uc2V0U3R5bGUoUGFyYW1TdHlsZS5mcm9tVmFsdWUod2FkbFBhcmFtVHlwZS5nZXRTdHlsZSgpKSk7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtLnNldFR5cGUod2FkbFBhcmFtVHlwZS5nZXRUeXBlKCkpOworICAgICAgICAgICAgICAgICAgICBhZGREb2MocGFyYW0uZ2V0RG9jKCksIHdhZGxQYXJhbVR5cGUuZ2V0RG9jKCkpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlIDogcmVzcG9uc2VzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5nZXRQYXJhbSgpLmFkZChwYXJhbSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghaXNFbXB0eShyZXNwb25zZURvYy5nZXRSZXR1cm5Eb2MoKSkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlIDogcmVzcG9uc2VzKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZERvYyhyZXNwb25zZS5nZXREb2MoKSwgcmVzcG9uc2VEb2MuZ2V0UmV0dXJuRG9jKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzcG9uc2VzID0gZGVsZWdhdGUuY3JlYXRlUmVzcG9uc2VzKHIsIG0pOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3BvbnNlczsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkRG9jRm9yRXhhbXBsZShmaW5hbCBMaXN0PERvYz4gZG9jcywgZmluYWwgU3RyaW5nIGV4YW1wbGUpIHsKKyAgICAgICAgaWYgKCFpc0VtcHR5KGV4YW1wbGUpKSB7CisgICAgICAgICAgICBmaW5hbCBEb2MgZG9jID0gbmV3IERvYygpOworCisgICAgICAgICAgICBmaW5hbCBFbGVtZW50cyBwRWxlbWVudCA9IEVsZW1lbnRzLmVsKCJwIikKKyAgICAgICAgICAgICAgICAgICAgLmFkZChFbGVtZW50cy52YWwoImg2IiwgIkV4YW1wbGUiKSkKKyAgICAgICAgICAgICAgICAgICAgLmFkZChFbGVtZW50cy5lbCgicHJlIikuYWRkKEVsZW1lbnRzLnZhbCgiY29kZSIsIGV4YW1wbGUpKSk7CisKKyAgICAgICAgICAgIGRvYy5nZXRDb250ZW50KCkuYWRkKHBFbGVtZW50KTsKKyAgICAgICAgICAgIGRvY3MuYWRkKGRvYyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkRG9jKGZpbmFsIExpc3Q8RG9jPiBkb2NzLCBmaW5hbCBTdHJpbmcgdGV4dCkgeworICAgICAgICBpZiAoIWlzRW1wdHkodGV4dCkpIHsKKyAgICAgICAgICAgIGZpbmFsIERvYyBkb2MgPSBuZXcgRG9jKCk7CisgICAgICAgICAgICBkb2MuZ2V0Q29udGVudCgpLmFkZCh0ZXh0KTsKKyAgICAgICAgICAgIGRvY3MuYWRkKGRvYyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gciBKZXJzZXkgcmVzb3VyY2UgY29tcG9uZW50LgorICAgICAqIEBwYXJhbSBtIHJlc291cmNlIG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gcCBtZXRob2QgcGFyYW1ldGVyLgorICAgICAqIEByZXR1cm4gdGhlIGVuaGFuY2VkIHtAbGluayBQYXJhbX0uCisgICAgICogQHNlZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5XYWRsR2VuZXJhdG9yI2NyZWF0ZVBhcmFtKG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZSwKKyAgICAgKiBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNZXRob2QsIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5QYXJhbWV0ZXIpCisgICAgICovCisgICAgcHVibGljIFBhcmFtIGNyZWF0ZVBhcmFtKGZpbmFsIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZSByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNZXRob2QgbSwgZmluYWwgUGFyYW1ldGVyIHApIHsKKyAgICAgICAgZmluYWwgUGFyYW0gcmVzdWx0ID0gZGVsZWdhdGUuY3JlYXRlUGFyYW0ociwgbSwgcCk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgUGFyYW1Eb2NUeXBlIHBhcmFtRG9jID0gcmVzb3VyY2VEb2MuZ2V0UGFyYW1Eb2MobS5nZXRJbnZvY2FibGUoKS5nZXREZWZpbml0aW9uTWV0aG9kKCkuZ2V0RGVjbGFyaW5nQ2xhc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgbS5nZXRJbnZvY2FibGUoKS5nZXREZWZpbml0aW9uTWV0aG9kKCksIHApOworICAgICAgICAgICAgaWYgKHBhcmFtRG9jICE9IG51bGwgJiYgIWlzRW1wdHkocGFyYW1Eb2MuZ2V0Q29tbWVudFRleHQoKSkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBEb2MgZG9jID0gbmV3IERvYygpOworICAgICAgICAgICAgICAgIGRvYy5nZXRDb250ZW50KCkuYWRkKHBhcmFtRG9jLmdldENvbW1lbnRUZXh0KCkpOworICAgICAgICAgICAgICAgIHJlc3VsdC5nZXREb2MoKS5hZGQoZG9jKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBjb20uc3VuLnJlc2VhcmNoLndzLndhZGwuUmVzb3VyY2VzfSBjcmVhdGVkIGJ5IHRoZSBkZWxlZ2F0ZS4KKyAgICAgKiBAc2VlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLldhZGxHZW5lcmF0b3IjY3JlYXRlUmVzb3VyY2VzKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzb3VyY2VzIGNyZWF0ZVJlc291cmNlcygpIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmNyZWF0ZVJlc291cmNlcygpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc0VtcHR5KGZpbmFsIFN0cmluZyB0ZXh0KSB7CisgICAgICAgIHJldHVybiB0ZXh0ID09IG51bGwgfHwgdGV4dC5pc0VtcHR5KCkgfHwgIiIuZXF1YWxzKHRleHQudHJpbSgpKTsKKyAgICB9CisKKyAgICAvLyA9PT09PT09PT09PT09PT09IG1ldGhvZHMgZm9yIHBvc3QgYnVpbGQgYWN0aW9ucyA9PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEV4dGVybmFsR3JhbW1hckRlZmluaXRpb24gY3JlYXRlRXh0ZXJuYWxHcmFtbWFyKCkgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUuY3JlYXRlRXh0ZXJuYWxHcmFtbWFyKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYXR0YWNoVHlwZXMoZmluYWwgQXBwbGljYXRpb25EZXNjcmlwdGlvbiBlZ2QpIHsKKyAgICAgICAgZGVsZWdhdGUuYXR0YWNoVHlwZXMoZWdkKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvaW50ZXJuYWwvZ2VuZXJhdG9ycy9yZXNvdXJjZWRvYy9tb2RlbC9Bbm5vdGF0aW9uRG9jVHlwZS5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9pbnRlcm5hbC9nZW5lcmF0b3JzL3Jlc291cmNlZG9jL21vZGVsL0Fubm90YXRpb25Eb2NUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEyZmQyNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvaW50ZXJuYWwvZ2VuZXJhdG9ycy9yZXNvdXJjZWRvYy9tb2RlbC9Bbm5vdGF0aW9uRG9jVHlwZS5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuaW50ZXJuYWwuZ2VuZXJhdG9ycy5yZXNvdXJjZWRvYy5tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50V3JhcHBlcjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7CisKKy8qKgorICogVGhlIGRvY3VtZW50YXRpb24gdHlwZSBmb3IgYW5ub3RhdGlvbnMuPGJyPgorICogQ3JlYXRlZCBvbjogSnVuIDEyLCAyMDA4PGJyPgorICoKKyAqIEBhdXRob3IgTWFydGluIEdyb3R6a2UgKG1hcnRpbi5ncm90emtlIGF0IGZyZWloZWl0LmNvbSkKKyAqLworQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQorQFhtbFR5cGUobmFtZSA9ICJhbm5vdGF0aW9uRG9jIiwgcHJvcE9yZGVyID0ge30pCitwdWJsaWMgY2xhc3MgQW5ub3RhdGlvbkRvY1R5cGUgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgYW5ub3RhdGlvblR5cGVOYW1lOworCisgICAgQFhtbEVsZW1lbnRXcmFwcGVyKG5hbWUgPSAiYXR0cmlidXRlcyIpCisgICAgcHJvdGVjdGVkIExpc3Q8TmFtZWRWYWx1ZVR5cGU+IGF0dHJpYnV0ZTsKKworICAgIHB1YmxpYyBMaXN0PE5hbWVkVmFsdWVUeXBlPiBnZXRBdHRyaWJ1dGVEb2NzKCkgeworICAgICAgICBpZiAoYXR0cmlidXRlID09IG51bGwpIHsKKyAgICAgICAgICAgIGF0dHJpYnV0ZSA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLmF0dHJpYnV0ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNBdHRyaWJ1dGVEb2NzKCkgeworICAgICAgICByZXR1cm4gYXR0cmlidXRlICE9IG51bGwgJiYgIWF0dHJpYnV0ZS5pc0VtcHR5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgYW5ub3RhdGlvblR5cGVOYW1lCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRBbm5vdGF0aW9uVHlwZU5hbWUoKSB7CisgICAgICAgIHJldHVybiBhbm5vdGF0aW9uVHlwZU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGFubm90YXRpb25UeXBlTmFtZSB0aGUgYW5ub3RhdGlvblR5cGVOYW1lIHRvIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFubm90YXRpb25UeXBlTmFtZShTdHJpbmcgYW5ub3RhdGlvblR5cGVOYW1lKSB7CisgICAgICAgIHRoaXMuYW5ub3RhdGlvblR5cGVOYW1lID0gYW5ub3RhdGlvblR5cGVOYW1lOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9pbnRlcm5hbC9nZW5lcmF0b3JzL3Jlc291cmNlZG9jL21vZGVsL0NsYXNzRG9jVHlwZS5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9pbnRlcm5hbC9nZW5lcmF0b3JzL3Jlc291cmNlZG9jL21vZGVsL0NsYXNzRG9jVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYWM2ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci93YWRsL2ludGVybmFsL2dlbmVyYXRvcnMvcmVzb3VyY2Vkb2MvbW9kZWwvQ2xhc3NEb2NUeXBlLmphdmEKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5pbnRlcm5hbC5nZW5lcmF0b3JzLnJlc291cmNlZG9jLm1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFueUVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50V3JhcHBlcjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7CisKKy8qKgorICogVGhlIGRvY3VtZW50YXRpb24gdHlwZSBmb3IgY2xhc3Nlcy48YnI+CisgKiBDcmVhdGVkIG9uOiBKdW4gMTIsIDIwMDg8YnI+CisgKgorICogQGF1dGhvciBNYXJ0aW4gR3JvdHprZSAobWFydGluLmdyb3R6a2UgYXQgZnJlaWhlaXQuY29tKQorICovCitAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCitAWG1sVHlwZShuYW1lID0gImNsYXNzRG9jIiwgcHJvcE9yZGVyID0ge30pCitwdWJsaWMgY2xhc3MgQ2xhc3NEb2NUeXBlIHsKKworICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzTmFtZTsKKyAgICBwcml2YXRlIFN0cmluZyBjb21tZW50VGV4dDsKKworICAgIEBYbWxFbGVtZW50V3JhcHBlcihuYW1lID0gIm1ldGhvZERvY3MiKQorICAgIHByaXZhdGUgTGlzdDxNZXRob2REb2NUeXBlPiBtZXRob2REb2M7CisKKyAgICBwdWJsaWMgTGlzdDxNZXRob2REb2NUeXBlPiBnZXRNZXRob2REb2NzKCkgeworICAgICAgICBpZiAobWV0aG9kRG9jID09IG51bGwpIHsKKyAgICAgICAgICAgIG1ldGhvZERvYyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLm1ldGhvZERvYzsKKyAgICB9CisKKyAgICBAWG1sQW55RWxlbWVudChsYXggPSB0cnVlKQorICAgIHByaXZhdGUgTGlzdDxPYmplY3Q+IGFueTsKKworICAgIHB1YmxpYyBMaXN0PE9iamVjdD4gZ2V0QW55KCkgeworICAgICAgICBpZiAoYW55ID09IG51bGwpIHsKKyAgICAgICAgICAgIGFueSA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLmFueTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBjb21tZW50VGV4dAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tbWVudFRleHQoKSB7CisgICAgICAgIHJldHVybiBjb21tZW50VGV4dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gY29tbWVudFRleHQgdGhlIGNvbW1lbnRUZXh0IHRvIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbW1lbnRUZXh0KFN0cmluZyBjb21tZW50VGV4dCkgeworICAgICAgICB0aGlzLmNvbW1lbnRUZXh0ID0gY29tbWVudFRleHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgY2xhc3NOYW1lCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7CisgICAgICAgIHJldHVybiBjbGFzc05hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGNsYXNzTmFtZSB0aGUgY2xhc3NOYW1lIHRvIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENsYXNzTmFtZShTdHJpbmcgY2xhc3NOYW1lKSB7CisgICAgICAgIHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9pbnRlcm5hbC9nZW5lcmF0b3JzL3Jlc291cmNlZG9jL21vZGVsL01ldGhvZERvY1R5cGUuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvaW50ZXJuYWwvZ2VuZXJhdG9ycy9yZXNvdXJjZWRvYy9tb2RlbC9NZXRob2REb2NUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE2ZGQ0NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvaW50ZXJuYWwvZ2VuZXJhdG9ycy9yZXNvdXJjZWRvYy9tb2RlbC9NZXRob2REb2NUeXBlLmphdmEKQEAgLTAsMCArMSwxODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuaW50ZXJuYWwuZ2VuZXJhdG9ycy5yZXNvdXJjZWRvYy5tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBbnlFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnRXcmFwcGVyOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKKworLyoqCisgKiBUaGUgZG9jdW1lbnRhdGlvbiB0eXBlIGZvciBtZXRob2RzLjxicj4KKyAqIENyZWF0ZWQgb246IEp1biAxMiwgMjAwODxicj4KKyAqCisgKiBAYXV0aG9yIE1hcnRpbiBHcm90emtlIChtYXJ0aW4uZ3JvdHprZSBhdCBmcmVpaGVpdC5jb20pCisgKi8KK0BYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKK0BYbWxUeXBlKG5hbWUgPSAibWV0aG9kRG9jIiwgcHJvcE9yZGVyID0geworCit9KQorcHVibGljIGNsYXNzIE1ldGhvZERvY1R5cGUgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgbWV0aG9kTmFtZTsKKworICAgIEBYbWxFbGVtZW50KHJlcXVpcmVkID0gZmFsc2UsIG5pbGxhYmxlID0gZmFsc2UpCisgICAgcHJvdGVjdGVkIFN0cmluZyBtZXRob2RTaWduYXR1cmU7CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbW1lbnRUZXh0OworCisgICAgcHJpdmF0ZSBTdHJpbmcgcmV0dXJuRG9jOworICAgIHByaXZhdGUgU3RyaW5nIHJldHVyblR5cGVFeGFtcGxlOworCisgICAgcHJpdmF0ZSBSZXF1ZXN0RG9jVHlwZSByZXF1ZXN0RG9jOworICAgIHByaXZhdGUgUmVzcG9uc2VEb2NUeXBlIHJlc3BvbnNlRG9jOworCisgICAgQFhtbEVsZW1lbnRXcmFwcGVyKG5hbWUgPSAicGFyYW1Eb2NzIikKKyAgICBwcm90ZWN0ZWQgTGlzdDxQYXJhbURvY1R5cGU+IHBhcmFtRG9jOworCisgICAgcHVibGljIExpc3Q8UGFyYW1Eb2NUeXBlPiBnZXRQYXJhbURvY3MoKSB7CisgICAgICAgIGlmIChwYXJhbURvYyA9PSBudWxsKSB7CisgICAgICAgICAgICBwYXJhbURvYyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLnBhcmFtRG9jOworICAgIH0KKworICAgIEBYbWxBbnlFbGVtZW50KGxheCA9IHRydWUpCisgICAgcHJpdmF0ZSBMaXN0PE9iamVjdD4gYW55OworCisgICAgcHVibGljIExpc3Q8T2JqZWN0PiBnZXRBbnkoKSB7CisgICAgICAgIGlmIChhbnkgPT0gbnVsbCkgeworICAgICAgICAgICAgYW55ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMuYW55OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbWV0aG9kIG5hbWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBtZXRob2QgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE1ldGhvZE5hbWUoKSB7CisgICAgICAgIHJldHVybiBtZXRob2ROYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbWV0aG9kIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWV0aG9kTmFtZSB0aGUgbWV0aG9kIG5hbWUgdG8gc2V0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1ldGhvZE5hbWUoU3RyaW5nIG1ldGhvZE5hbWUpIHsKKyAgICAgICAgdGhpcy5tZXRob2ROYW1lID0gbWV0aG9kTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG1ldGhvZCBzaWduYXR1cmUsIG9yIHtAY29kZSBudWxsfSBpZiBubyBtZXRob2Qgc2lnbmF0dXJlIGhhcyBiZWVuIHNldCBmb3IgdGhlIG1ldGhvZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIHN0cmluZyB1bmlxdWVseSBpZGVudGlmaWVzIHRoZSBtZXRob2QgaW4gY2FzZSB0aGVyZSBhcmUgbXVsdGlwbGUgbWV0aG9kcyBpbiB0aGUgY2xhc3Mgd2l0aCB0aGUgc2FtZSBuYW1lLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdW5pcXVlIG1ldGhvZCBzaWduYXR1cmUgd2l0aGluIGEgY2xhc3MuCisgICAgICogQHNpbmNlIDIuMjAKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE1ldGhvZFNpZ25hdHVyZSgpIHsKKyAgICAgICAgcmV0dXJuIG1ldGhvZFNpZ25hdHVyZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHVuaXF1ZSBtZXRob2Qgc2lnbmF0dXJlLCBpbmNsdWRpbmcgbWV0aG9kIHBhcmFtZXRlcnMsIGlmIGFueS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXRob2RTaWduYXR1cmUgbWV0aG9kIHNpZ25hdHVyZSBzdHJpbmcgdG8gc2V0LgorICAgICAqIEBzaW5jZSAyLjIwCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWV0aG9kU2lnbmF0dXJlKGZpbmFsIFN0cmluZyBtZXRob2RTaWduYXR1cmUpIHsKKyAgICAgICAgdGhpcy5tZXRob2RTaWduYXR1cmUgPSBtZXRob2RTaWduYXR1cmU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGNvbW1lbnRUZXh0IHByb3BlcnR5LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgY29tbWVudFRleHQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbW1lbnRUZXh0KCkgeworICAgICAgICByZXR1cm4gY29tbWVudFRleHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGNvbW1lbnRUZXh0IHByb3BlcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSBjb21tZW50VGV4dAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbW1lbnRUZXh0KFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0aGlzLmNvbW1lbnRUZXh0ID0gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgcmV0dXJuRG9jCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSZXR1cm5Eb2MoKSB7CisgICAgICAgIHJldHVybiByZXR1cm5Eb2M7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHJldHVybkRvYyB0aGUgcmV0dXJuRG9jIHRvIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJldHVybkRvYyhTdHJpbmcgcmV0dXJuRG9jKSB7CisgICAgICAgIHRoaXMucmV0dXJuRG9jID0gcmV0dXJuRG9jOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHJldHVyblR5cGVFeGFtcGxlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSZXR1cm5UeXBlRXhhbXBsZSgpIHsKKyAgICAgICAgcmV0dXJuIHJldHVyblR5cGVFeGFtcGxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSByZXR1cm5UeXBlRXhhbXBsZSB0aGUgcmV0dXJuVHlwZUV4YW1wbGUgdG8gc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmV0dXJuVHlwZUV4YW1wbGUoU3RyaW5nIHJldHVyblR5cGVFeGFtcGxlKSB7CisgICAgICAgIHRoaXMucmV0dXJuVHlwZUV4YW1wbGUgPSByZXR1cm5UeXBlRXhhbXBsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSByZXF1ZXN0RG9jCisgICAgICovCisgICAgcHVibGljIFJlcXVlc3REb2NUeXBlIGdldFJlcXVlc3REb2MoKSB7CisgICAgICAgIHJldHVybiByZXF1ZXN0RG9jOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSByZXF1ZXN0RG9jIHRoZSByZXF1ZXN0RG9jIHRvIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlcXVlc3REb2MoUmVxdWVzdERvY1R5cGUgcmVxdWVzdERvYykgeworICAgICAgICB0aGlzLnJlcXVlc3REb2MgPSByZXF1ZXN0RG9jOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHJlc3BvbnNlRG9jCisgICAgICovCisgICAgcHVibGljIFJlc3BvbnNlRG9jVHlwZSBnZXRSZXNwb25zZURvYygpIHsKKyAgICAgICAgcmV0dXJuIHJlc3BvbnNlRG9jOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSByZXNwb25zZURvYyB0aGUgcmVzcG9uc2VEb2MgdG8gc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVzcG9uc2VEb2MoUmVzcG9uc2VEb2NUeXBlIHJlc3BvbnNlRG9jKSB7CisgICAgICAgIHRoaXMucmVzcG9uc2VEb2MgPSByZXNwb25zZURvYzsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvaW50ZXJuYWwvZ2VuZXJhdG9ycy9yZXNvdXJjZWRvYy9tb2RlbC9OYW1lZFZhbHVlVHlwZS5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9pbnRlcm5hbC9nZW5lcmF0b3JzL3Jlc291cmNlZG9jL21vZGVsL05hbWVkVmFsdWVUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAwYjFjYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvaW50ZXJuYWwvZ2VuZXJhdG9ycy9yZXNvdXJjZWRvYy9tb2RlbC9OYW1lZFZhbHVlVHlwZS5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuaW50ZXJuYWwuZ2VuZXJhdG9ycy5yZXNvdXJjZWRvYy5tb2RlbDsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7CisKKy8qKgorICogVGhlIGRvY3VtZW50YXRpb24gdHlwZSBmb3IgbmFtZWQgdmFsdWVzLjxicj4KKyAqIENyZWF0ZWQgb246IEp1biAxMiwgMjAwODxicj4KKyAqCisgKiBAYXV0aG9yIE1hcnRpbiBHcm90emtlIChtYXJ0aW4uZ3JvdHprZSBhdCBmcmVpaGVpdC5jb20pCisgKi8KK0BYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKK0BYbWxUeXBlKG5hbWUgPSAibmFtZWRWYWx1ZSIsIHByb3BPcmRlciA9IHsKKworfSkKK3B1YmxpYyBjbGFzcyBOYW1lZFZhbHVlVHlwZSB7CisKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlOworCisgICAgcHVibGljIE5hbWVkVmFsdWVUeXBlKCkgeworICAgIH0KKworICAgIHB1YmxpYyBOYW1lZFZhbHVlVHlwZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgbmFtZSB0byBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9pbnRlcm5hbC9nZW5lcmF0b3JzL3Jlc291cmNlZG9jL21vZGVsL09iamVjdEZhY3RvcnkuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvaW50ZXJuYWwvZ2VuZXJhdG9ycy9yZXNvdXJjZWRvYy9tb2RlbC9PYmplY3RGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFjYjEyOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvaW50ZXJuYWwvZ2VuZXJhdG9ycy9yZXNvdXJjZWRvYy9tb2RlbC9PYmplY3RGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5pbnRlcm5hbC5nZW5lcmF0b3JzLnJlc291cmNlZG9jLm1vZGVsOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSZWdpc3RyeTsKKworLyoqCisgKiBUaGUgb2JqZWN0IGZhY3RvcnkgZm9yIHhodG1sIHN1cHBvcnRpbmcgamF4YiBiaW5kaW5ncy48YnI+CisgKiBDcmVhdGVkIG9uOiBKdW4gMTcsIDIwMDg8YnI+CisgKgorICogQGF1dGhvciBNYXJ0aW4gR3JvdHprZSAobWFydGluLmdyb3R6a2UgYXQgZnJlaWhlaXQuY29tKQorICovCitAWG1sUmVnaXN0cnkKK3B1YmxpYyBjbGFzcyBPYmplY3RGYWN0b3J5IHsKKworICAgIHB1YmxpYyBSZXNvdXJjZURvY1R5cGUgY3JlYXRlUmVzb3VyY2VEb2NUeXBlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlRG9jVHlwZSgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9pbnRlcm5hbC9nZW5lcmF0b3JzL3Jlc291cmNlZG9jL21vZGVsL1BhcmFtRG9jVHlwZS5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9pbnRlcm5hbC9nZW5lcmF0b3JzL3Jlc291cmNlZG9jL21vZGVsL1BhcmFtRG9jVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5OGQyNWEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci93YWRsL2ludGVybmFsL2dlbmVyYXRvcnMvcmVzb3VyY2Vkb2MvbW9kZWwvUGFyYW1Eb2NUeXBlLmphdmEKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5pbnRlcm5hbC5nZW5lcmF0b3JzLnJlc291cmNlZG9jLm1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFueUVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50V3JhcHBlcjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7CisKKy8qKgorICogVGhlIGRvY3VtZW50YXRpb24gdHlwZSBmb3IgcGFyYW1zOiBtZXRob2QgcGFyYW1zLCBwYXRoIHBhcmFtcyBvbiBhIGNsYXNzIGV0Yy48YnI+CisgKiBDcmVhdGVkIG9uOiBKdW4gMTIsIDIwMDg8YnI+CisgKgorICogQGF1dGhvciBNYXJ0aW4gR3JvdHprZSAobWFydGluLmdyb3R6a2UgYXQgZnJlaWhlaXQuY29tKQorICovCitAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCitAWG1sVHlwZShuYW1lID0gInBhcmFtRG9jIiwgcHJvcE9yZGVyID0geworCit9KQorcHVibGljIGNsYXNzIFBhcmFtRG9jVHlwZSB7CisKKyAgICBwcml2YXRlIFN0cmluZyBwYXJhbU5hbWU7CisgICAgcHJpdmF0ZSBTdHJpbmcgY29tbWVudFRleHQ7CisKKyAgICBwdWJsaWMgUGFyYW1Eb2NUeXBlKCkgeworICAgIH0KKworICAgIHB1YmxpYyBQYXJhbURvY1R5cGUoU3RyaW5nIHBhcmFtTmFtZSwgU3RyaW5nIGNvbW1lbnRUZXh0KSB7CisgICAgICAgIHRoaXMucGFyYW1OYW1lID0gcGFyYW1OYW1lOworICAgICAgICB0aGlzLmNvbW1lbnRUZXh0ID0gY29tbWVudFRleHQ7CisgICAgfQorCisgICAgQFhtbEVsZW1lbnRXcmFwcGVyKG5hbWUgPSAiYW5ub3RhdGlvbkRvY3MiKQorICAgIHByb3RlY3RlZCBMaXN0PEFubm90YXRpb25Eb2NUeXBlPiBhbm5vdGF0aW9uRG9jOworCisgICAgcHVibGljIExpc3Q8QW5ub3RhdGlvbkRvY1R5cGU+IGdldEFubm90YXRpb25Eb2NzKCkgeworICAgICAgICBpZiAoYW5ub3RhdGlvbkRvYyA9PSBudWxsKSB7CisgICAgICAgICAgICBhbm5vdGF0aW9uRG9jID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMuYW5ub3RhdGlvbkRvYzsKKyAgICB9CisKKyAgICBAWG1sQW55RWxlbWVudChsYXggPSB0cnVlKQorICAgIHByaXZhdGUgTGlzdDxPYmplY3Q+IGFueTsKKworICAgIHB1YmxpYyBMaXN0PE9iamVjdD4gZ2V0QW55KCkgeworICAgICAgICBpZiAoYW55ID09IG51bGwpIHsKKyAgICAgICAgICAgIGFueSA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLmFueTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBjb21tZW50VGV4dAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tbWVudFRleHQoKSB7CisgICAgICAgIHJldHVybiBjb21tZW50VGV4dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gY29tbWVudFRleHQgdGhlIGNvbW1lbnRUZXh0IHRvIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbW1lbnRUZXh0KFN0cmluZyBjb21tZW50VGV4dCkgeworICAgICAgICB0aGlzLmNvbW1lbnRUZXh0ID0gY29tbWVudFRleHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgY2xhc3NOYW1lCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQYXJhbU5hbWUoKSB7CisgICAgICAgIHJldHVybiBwYXJhbU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIHBhcmFtTmFtZSB0aGUgY2xhc3NOYW1lIHRvIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFBhcmFtTmFtZShTdHJpbmcgcGFyYW1OYW1lKSB7CisgICAgICAgIHRoaXMucGFyYW1OYW1lID0gcGFyYW1OYW1lOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvaW50ZXJuYWwvZ2VuZXJhdG9ycy9yZXNvdXJjZWRvYy9tb2RlbC9SZXByZXNlbnRhdGlvbkRvY1R5cGUuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvaW50ZXJuYWwvZ2VuZXJhdG9ycy9yZXNvdXJjZWRvYy9tb2RlbC9SZXByZXNlbnRhdGlvbkRvY1R5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODExODFjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9pbnRlcm5hbC9nZW5lcmF0b3JzL3Jlc291cmNlZG9jL21vZGVsL1JlcHJlc2VudGF0aW9uRG9jVHlwZS5qYXZhCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLmludGVybmFsLmdlbmVyYXRvcnMucmVzb3VyY2Vkb2MubW9kZWw7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CisKKy8qKgorICogVGhlIGRvY3VtZW50YXRpb24gdHlwZSBmb3IgcmVwcmVzZW50YXRpb25zLjxicj4KKyAqIENyZWF0ZWQgb246IEp1biAxNiwgMjAwODxicj4KKyAqCisgKiBAYXV0aG9yIE1hcnRpbiBHcm90emtlIChtYXJ0aW4uZ3JvdHprZSBhdCBmcmVpaGVpdC5jb20pCisgKi8KK0BYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKK0BYbWxUeXBlKG5hbWUgPSAicmVwcmVzZW50YXRpb25Eb2MiLCBwcm9wT3JkZXIgPSB7CisKK30pCitwdWJsaWMgY2xhc3MgUmVwcmVzZW50YXRpb25Eb2NUeXBlIHsKKworICAgIEBYbWxBdHRyaWJ1dGUKKyAgICBwcml2YXRlIFFOYW1lIGVsZW1lbnQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgZXhhbXBsZTsKKyAgICBAWG1sQXR0cmlidXRlCisgICAgcHJpdmF0ZSBMb25nIHN0YXR1czsKKyAgICBAWG1sQXR0cmlidXRlCisgICAgcHJpdmF0ZSBTdHJpbmcgbWVkaWFUeXBlOworICAgIHByaXZhdGUgU3RyaW5nIGRvYzsKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGVsZW1lbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgUU5hbWUgZ2V0RWxlbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGVsZW1lbnQgdGhlIGVsZW1lbnQgdG8gc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RWxlbWVudChRTmFtZSBlbGVtZW50KSB7CisgICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgZXhhbXBsZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhhbXBsZSgpIHsKKyAgICAgICAgcmV0dXJuIGV4YW1wbGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGV4YW1wbGUgdGhlIGV4YW1wbGUgdG8gc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RXhhbXBsZShTdHJpbmcgZXhhbXBsZSkgeworICAgICAgICB0aGlzLmV4YW1wbGUgPSBleGFtcGxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHN0YXR1cworICAgICAqLworICAgIHB1YmxpYyBMb25nIGdldFN0YXR1cygpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gc3RhdHVzIHRoZSBzdGF0dXMgdG8gc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3RhdHVzKExvbmcgc3RhdHVzKSB7CisgICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIG1lZGlhVHlwZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVkaWFUeXBlKCkgeworICAgICAgICByZXR1cm4gbWVkaWFUeXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBtZWRpYVR5cGUgdGhlIG1lZGlhVHlwZSB0byBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNZWRpYVR5cGUoU3RyaW5nIG1lZGlhVHlwZSkgeworICAgICAgICB0aGlzLm1lZGlhVHlwZSA9IG1lZGlhVHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBkb2MKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERvYygpIHsKKyAgICAgICAgcmV0dXJuIGRvYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gZG9jIHRoZSBkb2MgdG8gc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RG9jKFN0cmluZyBkb2MpIHsKKyAgICAgICAgdGhpcy5kb2MgPSBkb2M7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci93YWRsL2ludGVybmFsL2dlbmVyYXRvcnMvcmVzb3VyY2Vkb2MvbW9kZWwvUmVxdWVzdERvY1R5cGUuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvaW50ZXJuYWwvZ2VuZXJhdG9ycy9yZXNvdXJjZWRvYy9tb2RlbC9SZXF1ZXN0RG9jVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyN2E1ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci93YWRsL2ludGVybmFsL2dlbmVyYXRvcnMvcmVzb3VyY2Vkb2MvbW9kZWwvUmVxdWVzdERvY1R5cGUuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLmludGVybmFsLmdlbmVyYXRvcnMucmVzb3VyY2Vkb2MubW9kZWw7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOworCisvKioKKyAqIFRoZSBkb2N1bWVudGF0aW9uIHR5cGUgZm9yIHJlcXVlc3RzLjxicj4KKyAqIENyZWF0ZWQgb246IEp1biAxNiwgMjAwODxicj4KKyAqCisgKiBAYXV0aG9yIE1hcnRpbiBHcm90emtlIChtYXJ0aW4uZ3JvdHprZSBhdCBmcmVpaGVpdC5jb20pCisgKi8KK0BYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKK0BYbWxUeXBlKG5hbWUgPSAicmVxdWVzdERvYyIsIHByb3BPcmRlciA9IHsKKworfSkKK3B1YmxpYyBjbGFzcyBSZXF1ZXN0RG9jVHlwZSB7CisKKyAgICBwcml2YXRlIFJlcHJlc2VudGF0aW9uRG9jVHlwZSByZXByZXNlbnRhdGlvbkRvYzsKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHJlcHJlc2VudGF0aW9uRG9jCisgICAgICovCisgICAgcHVibGljIFJlcHJlc2VudGF0aW9uRG9jVHlwZSBnZXRSZXByZXNlbnRhdGlvbkRvYygpIHsKKyAgICAgICAgcmV0dXJuIHJlcHJlc2VudGF0aW9uRG9jOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSByZXByZXNlbnRhdGlvbkRvYyB0aGUgcmVwcmVzZW50YXRpb25Eb2MgdG8gc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVwcmVzZW50YXRpb25Eb2MoUmVwcmVzZW50YXRpb25Eb2NUeXBlIHJlcHJlc2VudGF0aW9uRG9jKSB7CisgICAgICAgIHRoaXMucmVwcmVzZW50YXRpb25Eb2MgPSByZXByZXNlbnRhdGlvbkRvYzsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvaW50ZXJuYWwvZ2VuZXJhdG9ycy9yZXNvdXJjZWRvYy9tb2RlbC9SZXNvdXJjZURvY1R5cGUuamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvaW50ZXJuYWwvZ2VuZXJhdG9ycy9yZXNvdXJjZWRvYy9tb2RlbC9SZXNvdXJjZURvY1R5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjIzYjVkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9pbnRlcm5hbC9nZW5lcmF0b3JzL3Jlc291cmNlZG9jL21vZGVsL1Jlc291cmNlRG9jVHlwZS5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuaW50ZXJuYWwuZ2VuZXJhdG9ycy5yZXNvdXJjZWRvYy5tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50V3JhcHBlcjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKKworLyoqCisgKiBUaGUgZG9jdW1lbnRhdGlvbiB0eXBlIGZvciByZXNvdXJjZXMuPGJyPgorICogQ3JlYXRlZCBvbjogSnVuIDExLCAyMDA4PGJyPgorICoKKyAqIEBhdXRob3IgTWFydGluIEdyb3R6a2UgKG1hcnRpbi5ncm90emtlIGF0IGZyZWloZWl0LmNvbSkKKyAqLworCitAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCitAWG1sVHlwZShuYW1lID0gInJlc291cmNlRG9jIiwgcHJvcE9yZGVyID0geworICAgICAgICAiY2xhc3NEb2MiCit9KQorQFhtbFJvb3RFbGVtZW50KG5hbWUgPSAicmVzb3VyY2VEb2MiKQorcHVibGljIGNsYXNzIFJlc291cmNlRG9jVHlwZSB7CisKKyAgICBAWG1sRWxlbWVudFdyYXBwZXIobmFtZSA9ICJjbGFzc0RvY3MiKQorICAgIHByb3RlY3RlZCBMaXN0PENsYXNzRG9jVHlwZT4gY2xhc3NEb2M7CisKKyAgICBwdWJsaWMgTGlzdDxDbGFzc0RvY1R5cGU+IGdldERvY3MoKSB7CisgICAgICAgIGlmIChjbGFzc0RvYyA9PSBudWxsKSB7CisgICAgICAgICAgICBjbGFzc0RvYyA9IG5ldyBBcnJheUxpc3Q8Q2xhc3NEb2NUeXBlPigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLmNsYXNzRG9jOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9pbnRlcm5hbC9nZW5lcmF0b3JzL3Jlc291cmNlZG9jL21vZGVsL1Jlc3BvbnNlRG9jVHlwZS5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9pbnRlcm5hbC9nZW5lcmF0b3JzL3Jlc291cmNlZG9jL21vZGVsL1Jlc3BvbnNlRG9jVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjZTNmYTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci93YWRsL2ludGVybmFsL2dlbmVyYXRvcnMvcmVzb3VyY2Vkb2MvbW9kZWwvUmVzcG9uc2VEb2NUeXBlLmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5pbnRlcm5hbC5nZW5lcmF0b3JzLnJlc291cmNlZG9jLm1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnRXcmFwcGVyOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKKworLyoqCisgKiBUaGUgZG9jdW1lbnRhdGlvbiB0eXBlIGZvciBhIHJlc3BvbnNlLjxicj4KKyAqIENyZWF0ZWQgb246IEp1biAxNiwgMjAwODxicj4KKyAqCisgKiBAYXV0aG9yIE1hcnRpbiBHcm90emtlIChtYXJ0aW4uZ3JvdHprZSBhdCBmcmVpaGVpdC5jb20pCisgKi8KK0BYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKK0BYbWxUeXBlKG5hbWUgPSAicmVzcG9uc2VEb2MiLCBwcm9wT3JkZXIgPSB7CisKK30pCitwdWJsaWMgY2xhc3MgUmVzcG9uc2VEb2NUeXBlIHsKKworICAgIHByaXZhdGUgU3RyaW5nIHJldHVybkRvYzsKKworICAgIEBYbWxFbGVtZW50V3JhcHBlcihuYW1lID0gIndhZGxQYXJhbXMiKQorICAgIHByb3RlY3RlZCBMaXN0PFdhZGxQYXJhbVR5cGU+IHdhZGxQYXJhbTsKKworICAgIHB1YmxpYyBMaXN0PFdhZGxQYXJhbVR5cGU+IGdldFdhZGxQYXJhbXMoKSB7CisgICAgICAgIGlmICh3YWRsUGFyYW0gPT0gbnVsbCkgeworICAgICAgICAgICAgd2FkbFBhcmFtID0gbmV3IEFycmF5TGlzdDxXYWRsUGFyYW1UeXBlPigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLndhZGxQYXJhbTsKKyAgICB9CisKKyAgICBAWG1sRWxlbWVudFdyYXBwZXIobmFtZSA9ICJyZXByZXNlbnRhdGlvbnMiKQorICAgIHByb3RlY3RlZCBMaXN0PFJlcHJlc2VudGF0aW9uRG9jVHlwZT4gcmVwcmVzZW50YXRpb247CisKKyAgICBwdWJsaWMgTGlzdDxSZXByZXNlbnRhdGlvbkRvY1R5cGU+IGdldFJlcHJlc2VudGF0aW9ucygpIHsKKyAgICAgICAgaWYgKHJlcHJlc2VudGF0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlcHJlc2VudGF0aW9uID0gbmV3IEFycmF5TGlzdDxSZXByZXNlbnRhdGlvbkRvY1R5cGU+KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMucmVwcmVzZW50YXRpb247CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzUmVwcmVzZW50YXRpb25zKCkgeworICAgICAgICByZXR1cm4gdGhpcy5yZXByZXNlbnRhdGlvbiAhPSBudWxsICYmICF0aGlzLnJlcHJlc2VudGF0aW9uLmlzRW1wdHkoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSByZXR1cm5Eb2MKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJldHVybkRvYygpIHsKKyAgICAgICAgcmV0dXJuIHJldHVybkRvYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gcmV0dXJuRG9jIHRoZSByZXR1cm5Eb2MgdG8gc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmV0dXJuRG9jKFN0cmluZyByZXR1cm5Eb2MpIHsKKyAgICAgICAgdGhpcy5yZXR1cm5Eb2MgPSByZXR1cm5Eb2M7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci93YWRsL2ludGVybmFsL2dlbmVyYXRvcnMvcmVzb3VyY2Vkb2MvbW9kZWwvV2FkbFBhcmFtVHlwZS5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9pbnRlcm5hbC9nZW5lcmF0b3JzL3Jlc291cmNlZG9jL21vZGVsL1dhZGxQYXJhbVR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjRlNTMxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9pbnRlcm5hbC9nZW5lcmF0b3JzL3Jlc291cmNlZG9jL21vZGVsL1dhZGxQYXJhbVR5cGUuamF2YQpAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5pbnRlcm5hbC5nZW5lcmF0b3JzLnJlc291cmNlZG9jLm1vZGVsOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworCisvKioKKyAqIFRoZSBkb2N1bWVudGF0aW9uIHR5cGUgZm9yIHdhZGwgcGFyYW1zLjxicj4KKyAqIENyZWF0ZWQgb246IEp1biAxMiwgMjAwODxicj4KKyAqCisgKiBAYXV0aG9yIE1hcnRpbiBHcm90emtlIChtYXJ0aW4uZ3JvdHprZSBhdCBmcmVpaGVpdC5jb20pCisgKi8KK0BYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKK0BYbWxUeXBlKG5hbWUgPSAid2FkbFBhcmFtIiwgcHJvcE9yZGVyID0geworCit9KQorcHVibGljIGNsYXNzIFdhZGxQYXJhbVR5cGUgeworCisgICAgQFhtbEF0dHJpYnV0ZQorICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisgICAgQFhtbEF0dHJpYnV0ZQorICAgIHByaXZhdGUgU3RyaW5nIHN0eWxlOworICAgIEBYbWxBdHRyaWJ1dGUKKyAgICBwcml2YXRlIFFOYW1lIHR5cGU7CisgICAgcHJpdmF0ZSBTdHJpbmcgZG9jOworCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgY29tbWVudFRleHQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERvYygpIHsKKyAgICAgICAgcmV0dXJuIGRvYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW0gY29tbWVudFRleHQgdGhlIGNvbW1lbnRUZXh0IHRvIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldERvYyhTdHJpbmcgY29tbWVudFRleHQpIHsKKyAgICAgICAgdGhpcy5kb2MgPSBjb21tZW50VGV4dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSBjbGFzc05hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBwYXJhbU5hbWUgdGhlIGNsYXNzTmFtZSB0byBzZXQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBwYXJhbU5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gcGFyYW1OYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHN0eWxlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTdHlsZSgpIHsKKyAgICAgICAgcmV0dXJuIHN0eWxlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSBzdHlsZSB0aGUgc3R5bGUgdG8gc2V0CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3R5bGUoU3RyaW5nIHN0eWxlKSB7CisgICAgICAgIHRoaXMuc3R5bGUgPSBzdHlsZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRoZSB0eXBlCisgICAgICovCisgICAgcHVibGljIFFOYW1lIGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBwYXJhbSB0eXBlIHRoZSB0eXBlIHRvIHNldAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFR5cGUoUU5hbWUgdHlwZSkgeworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvaW50ZXJuYWwvZ2VuZXJhdG9ycy9yZXNvdXJjZWRvYy9tb2RlbC9wYWNrYWdlLWluZm8uamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvaW50ZXJuYWwvZ2VuZXJhdG9ycy9yZXNvdXJjZWRvYy9tb2RlbC9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWM5ZTMxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9pbnRlcm5hbC9nZW5lcmF0b3JzL3Jlc291cmNlZG9jL21vZGVsL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKKy8qKgorICogSmVyc2V5IHNlcnZlci1zaWRlIFdBREwgaW50ZXJuYWwgSkFYQiBiZWFucyB1c2VkIGZvcgorICogZ2VuZXJhdGlvbiBvZiByZXNvdXJjZSBkb2N1bWVudGF0aW9uIHdpdGgKKyAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5XYWRsR2VuZXJhdG9yIHdhZGwgZ2VuZXJhdG9yc30uCisgKi8KK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuaW50ZXJuYWwuZ2VuZXJhdG9ycy5yZXNvdXJjZWRvYy5tb2RlbDsKZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvaW50ZXJuYWwvZ2VuZXJhdG9ycy9yZXNvdXJjZWRvYy9wYWNrYWdlLWluZm8uamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvaW50ZXJuYWwvZ2VuZXJhdG9ycy9yZXNvdXJjZWRvYy9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTRlNTE5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9pbnRlcm5hbC9nZW5lcmF0b3JzL3Jlc291cmNlZG9jL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKKy8qKgorICogSmVyc2V5IHNlcnZlci1zaWRlIFdBREwgaW50ZXJuYWwgY2xhc3NlcyBzdXBwb3J0aW5nCisgKiBnZW5lcmF0aW9uIG9mIHJlc291cmNlIGRvY3VtZW50YXRpb24gd2l0aAorICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLldhZGxHZW5lcmF0b3Igd2FkbCBnZW5lcmF0b3JzfS4KKyAqLworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5pbnRlcm5hbC5nZW5lcmF0b3JzLnJlc291cmNlZG9jOwpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9pbnRlcm5hbC9nZW5lcmF0b3JzL3Jlc291cmNlZG9jL3hodG1sL0VsZW1lbnRzLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci93YWRsL2ludGVybmFsL2dlbmVyYXRvcnMvcmVzb3VyY2Vkb2MveGh0bWwvRWxlbWVudHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTQyODRhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9pbnRlcm5hbC9nZW5lcmF0b3JzL3Jlc291cmNlZG9jL3hodG1sL0VsZW1lbnRzLmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5pbnRlcm5hbC5nZW5lcmF0b3JzLnJlc291cmNlZG9jLnhodG1sOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgZmx1ZW50IGludGVyZmFjZSB0byB4aHRtbCBzdXBwb3J0aW5nIGpheGIgYmluZGluZ3MuPGJyPgorICogQ3JlYXRlZCBvbjogSnVuIDE3LCAyMDA4PGJyPgorICoKKyAqIEBhdXRob3IgTWFydGluIEdyb3R6a2UgKG1hcnRpbi5ncm90emtlIGF0IGZyZWloZWl0LmNvbSkKKyAqLworcHVibGljIGNsYXNzIEVsZW1lbnRzIGV4dGVuZHMgSkFYQkVsZW1lbnQ8WGh0bWxFbGVtZW50VHlwZT4geworCisgICAgcHVibGljIHN0YXRpYyBFbGVtZW50cyBlbChTdHJpbmcgZWxlbWVudE5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnQoZWxlbWVudE5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IHZhbChTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICByZXR1cm4gY3JlYXRlRWxlbWVudChlbGVtZW50TmFtZSwgdmFsdWUpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOworCisgICAgcHVibGljIEVsZW1lbnRzKFFOYW1lIG5hbWUsIENsYXNzPFhodG1sRWxlbWVudFR5cGU+IGNsYXp6LAorICAgICAgICAgICAgICAgICAgICBYaHRtbEVsZW1lbnRUeXBlIGVsZW1lbnQpIHsKKyAgICAgICAgc3VwZXIobmFtZSwgY2xhenosIGVsZW1lbnQpOworICAgIH0KKworICAgIHB1YmxpYyBFbGVtZW50cyBhZGQoT2JqZWN0Li4uIGNoaWxkTm9kZXMpIHsKKyAgICAgICAgaWYgKGNoaWxkTm9kZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChPYmplY3QgY2hpbGROb2RlIDogY2hpbGROb2RlcykgeworICAgICAgICAgICAgICAgIGdldFZhbHVlKCkuZ2V0Q2hpbGROb2RlcygpLmFkZChjaGlsZE5vZGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBFbGVtZW50cyBhZGRDaGlsZChPYmplY3QgY2hpbGQpIHsKKyAgICAgICAgZ2V0VmFsdWUoKS5nZXRDaGlsZE5vZGVzKCkuYWRkKGNoaWxkKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgRWxlbWVudHMgY3JlYXRlRWxlbWVudChmaW5hbCBTdHJpbmcgZWxlbWVudE5hbWUpIHsKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgZmluYWwgWGh0bWxFbGVtZW50VHlwZSBlbGVtZW50ID0gbmV3IFhodG1sRWxlbWVudFR5cGUoKTsKKworICAgICAgICAgICAgZmluYWwgRWxlbWVudHMgamF4YkVsZW1lbnQgPSBuZXcgRWxlbWVudHMoCisgICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsIGVsZW1lbnROYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgWGh0bWxFbGVtZW50VHlwZS5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgZWxlbWVudCk7CisKKyAgICAgICAgICAgIHJldHVybiBqYXhiRWxlbWVudDsKKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBKQVhCRWxlbWVudDxYaHRtbFZhbHVlVHlwZT4gY3JlYXRlRWxlbWVudChmaW5hbCBTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0cnkgeworCisgICAgICAgICAgICBmaW5hbCBYaHRtbFZhbHVlVHlwZSBlbGVtZW50ID0gbmV3IFhodG1sVmFsdWVUeXBlKCk7CisgICAgICAgICAgICBlbGVtZW50LnZhbHVlID0gdmFsdWU7CisKKyAgICAgICAgICAgIGZpbmFsIEpBWEJFbGVtZW50PFhodG1sVmFsdWVUeXBlPiBqYXhiRWxlbWVudCA9IG5ldyBKQVhCRWxlbWVudDxYaHRtbFZhbHVlVHlwZT4oCisgICAgICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsIGVsZW1lbnROYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgWGh0bWxWYWx1ZVR5cGUuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQpOworCisgICAgICAgICAgICByZXR1cm4gamF4YkVsZW1lbnQ7CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci93YWRsL2ludGVybmFsL2dlbmVyYXRvcnMvcmVzb3VyY2Vkb2MveGh0bWwvT2JqZWN0RmFjdG9yeS5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9pbnRlcm5hbC9nZW5lcmF0b3JzL3Jlc291cmNlZG9jL3hodG1sL09iamVjdEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjU0ZGMxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9pbnRlcm5hbC9nZW5lcmF0b3JzL3Jlc291cmNlZG9jL3hodG1sL09iamVjdEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLmludGVybmFsLmdlbmVyYXRvcnMucmVzb3VyY2Vkb2MueGh0bWw7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJlZ2lzdHJ5OworCisvKioKKyAqIFRoZSBvYmplY3QgZmFjdG9yeSBmb3IgeGh0bWwgc3VwcG9ydGluZyBqYXhiIGJpbmRpbmdzLjxicj4KKyAqIENyZWF0ZWQgb246IEp1biAxNywgMjAwODxicj4KKyAqCisgKiBAYXV0aG9yIE1hcnRpbiBHcm90emtlIChtYXJ0aW4uZ3JvdHprZSBhdCBmcmVpaGVpdC5jb20pCisgKi8KK0BYbWxSZWdpc3RyeQorcHVibGljIGNsYXNzIE9iamVjdEZhY3RvcnkgeworCisgICAgcHVibGljIFhodG1sRWxlbWVudFR5cGUgY3JlYXRlWGh0bWxFbGVtZW50VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBYaHRtbEVsZW1lbnRUeXBlKCk7CisgICAgfQorCisgICAgcHVibGljIFhodG1sVmFsdWVUeXBlIGNyZWF0ZVhodG1sQ29kZVR5cGUoKSB7CisgICAgICAgIHJldHVybiBuZXcgWGh0bWxWYWx1ZVR5cGUoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvaW50ZXJuYWwvZ2VuZXJhdG9ycy9yZXNvdXJjZWRvYy94aHRtbC9YaHRtbEVsZW1lbnRUeXBlLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci93YWRsL2ludGVybmFsL2dlbmVyYXRvcnMvcmVzb3VyY2Vkb2MveGh0bWwvWGh0bWxFbGVtZW50VHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNjNjNDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci93YWRsL2ludGVybmFsL2dlbmVyYXRvcnMvcmVzb3VyY2Vkb2MveGh0bWwvWGh0bWxFbGVtZW50VHlwZS5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuaW50ZXJuYWwuZ2VuZXJhdG9ycy5yZXNvdXJjZWRvYy54aHRtbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBbnlFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOworCisvKioKKyAqIFRoZSB0eXBlIGZvciBhbiBlbGVtZW50IGhvbGRpbmcgY2hpbGQgbm9kZXMuPGJyPgorICogQ3JlYXRlZCBvbjogSnVuIDE3LCAyMDA4PGJyPgorICoKKyAqIEBhdXRob3IgTWFydGluIEdyb3R6a2UgKG1hcnRpbi5ncm90emtlIGF0IGZyZWloZWl0LmNvbSkKKyAqLworQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQorQFhtbFR5cGUobmFtZSA9ICJmb28iLCBwcm9wT3JkZXIgPSB7fSkKK0BYbWxSb290RWxlbWVudChuYW1lID0gImZvbyIpCitwdWJsaWMgY2xhc3MgWGh0bWxFbGVtZW50VHlwZSB7CisKKyAgICBAWG1sQW55RWxlbWVudAorICAgIHByb3RlY3RlZCBMaXN0PE9iamVjdD4gYW55OworCisgICAgcHVibGljIExpc3Q8T2JqZWN0PiBnZXRDaGlsZE5vZGVzKCkgeworICAgICAgICBpZiAoYW55ID09IG51bGwpIHsKKyAgICAgICAgICAgIGFueSA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzLmFueTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvaW50ZXJuYWwvZ2VuZXJhdG9ycy9yZXNvdXJjZWRvYy94aHRtbC9YaHRtbFZhbHVlVHlwZS5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9pbnRlcm5hbC9nZW5lcmF0b3JzL3Jlc291cmNlZG9jL3hodG1sL1hodG1sVmFsdWVUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBiNzQ4MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvaW50ZXJuYWwvZ2VuZXJhdG9ycy9yZXNvdXJjZWRvYy94aHRtbC9YaHRtbFZhbHVlVHlwZS5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuaW50ZXJuYWwuZ2VuZXJhdG9ycy5yZXNvdXJjZWRvYy54aHRtbDsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFZhbHVlOworCisvKioKKyAqIFRoZSB0eXBlIGZvciBhbiBlbGVtZW50IGhvbGRpbmcgYSBzdHJpbmcgdmFsdWUuPGJyPgorICogQ3JlYXRlZCBvbjogSnVuIDE3LCAyMDA4PGJyPgorICoKKyAqIEBhdXRob3IgTWFydGluIEdyb3R6a2UgKG1hcnRpbi5ncm90emtlIGF0IGZyZWloZWl0LmNvbSkKKyAqLworQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQorQFhtbFR5cGUobmFtZSA9ICJ2YWx1ZVR5cGUiLCBwcm9wT3JkZXIgPSB7fSkKK0BYbWxSb290RWxlbWVudChuYW1lID0gInZhbHVlVHlwZSIpCitwdWJsaWMgY2xhc3MgWGh0bWxWYWx1ZVR5cGUgeworCisgICAgQFhtbFZhbHVlCisgICAgcHJvdGVjdGVkIFN0cmluZyB2YWx1ZTsKKworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9pbnRlcm5hbC9nZW5lcmF0b3JzL3Jlc291cmNlZG9jL3hodG1sL3BhY2thZ2UtaW5mby5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9pbnRlcm5hbC9nZW5lcmF0b3JzL3Jlc291cmNlZG9jL3hodG1sL3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNDY3NmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci93YWRsL2ludGVybmFsL2dlbmVyYXRvcnMvcmVzb3VyY2Vkb2MveGh0bWwvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoqCisgKiBKZXJzZXkgc2VydmVyLXNpZGUgV0FETCBpbnRlcm5hbCB4aHRtbCBKQVhCIGJlYW5zIHVzZWQgZm9yCisgKiBnZW5lcmF0aW9uIG9mIHJlc291cmNlIGRvY3VtZW50YXRpb24gd2l0aAorICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLldhZGxHZW5lcmF0b3Igd2FkbCBnZW5lcmF0b3JzfS4KKyAqLworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5pbnRlcm5hbC5nZW5lcmF0b3JzLnJlc291cmNlZG9jLnhodG1sOwpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9pbnRlcm5hbC9wYWNrYWdlLWluZm8uamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvaW50ZXJuYWwvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc1ZWMyOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvaW50ZXJuYWwvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoqCisgKiBKZXJzZXkgc2VydmVyLXNpZGUgV0FETCBpbnRlcm5hbCBjbGFzc2VzLgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLmludGVybmFsOwpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9wYWNrYWdlLWluZm8uamF2YSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFiOWU1OQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoqCisgKiBKZXJzZXkgc2VydmVyLXNpZGUgV0FETCBzdXBwb3J0IHB1YmxpYyBjbGFzc2VzIGFuZCBpbnRlcmZhY2VzLgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsOwpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9wcm9jZXNzb3IvT3B0aW9uc01ldGhvZFByb2Nlc3Nvci5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9wcm9jZXNzb3IvT3B0aW9uc01ldGhvZFByb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxOThiNzQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci93YWRsL3Byb2Nlc3Nvci9PcHRpb25zTWV0aG9kUHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwucHJvY2Vzc29yOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuSHR0cE1ldGhvZDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJpb3JpdHk7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLkluZmxlY3RvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuRXh0ZW5kZWRVcmlJbmZvOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5Nb2RlbFByb2Nlc3NvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTW9kZWw7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLmludGVybmFsLk1vZGVsUHJvY2Vzc29yVXRpbDsKKworLyoqCisgKiB7QGxpbmsgTW9kZWxQcm9jZXNzb3IgTW9kZWwgcHJvY2Vzc29yfSBlbmhhbmNpbmcge0BsaW5rIFJlc291cmNlTW9kZWwgcmVzb3VyY2UgbW9kZWx9IGFuZCB7QGxpbmsgUmVzb3VyY2Ugc3ViIHJlc291cmNlc30KKyAqIGJ5IGRlZmF1bHQgT1BUSU9OUyBtZXRob2RzIGRlZmluZWQgYnkgSkFYLVJTIHNwZWNpZmljYXRpb24uCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitAUHJpb3JpdHkoSW50ZWdlci5NQVhfVkFMVUUpCitwdWJsaWMgY2xhc3MgT3B0aW9uc01ldGhvZFByb2Nlc3NvciBpbXBsZW1lbnRzIE1vZGVsUHJvY2Vzc29yIHsKKworICAgIHByaXZhdGUgZmluYWwgTGlzdDxNb2RlbFByb2Nlc3NvclV0aWwuTWV0aG9kPiBtZXRob2RMaXN0OworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBuZXcgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIE9wdGlvbnNNZXRob2RQcm9jZXNzb3IoKSB7CisgICAgICAgIG1ldGhvZExpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgbWV0aG9kTGlzdC5hZGQobmV3IE1vZGVsUHJvY2Vzc29yVXRpbC5NZXRob2QoSHR0cE1ldGhvZC5PUFRJT05TLCBNZWRpYVR5cGUuV0lMRENBUkRfVFlQRSwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSwKKyAgICAgICAgICAgICAgICBQbGFpblRleHRPcHRpb25zSW5mbGVjdG9yLmNsYXNzKSk7CisKKyAgICAgICAgbWV0aG9kTGlzdC5hZGQobmV3IE1vZGVsUHJvY2Vzc29yVXRpbC5NZXRob2QoSHR0cE1ldGhvZC5PUFRJT05TLCBNZWRpYVR5cGUuV0lMRENBUkRfVFlQRSwgTWVkaWFUeXBlLldJTERDQVJEX1RZUEUsCisgICAgICAgICAgICAgICAgR2VuZXJpY09wdGlvbnNJbmZsZWN0b3IuY2xhc3MpKTsKKyAgICB9CisKKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFBsYWluVGV4dE9wdGlvbnNJbmZsZWN0b3IgaW1wbGVtZW50cyBJbmZsZWN0b3I8Q29udGFpbmVyUmVxdWVzdENvbnRleHQsIFJlc3BvbnNlPiB7CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBwcml2YXRlIFByb3ZpZGVyPEV4dGVuZGVkVXJpSW5mbz4gZXh0ZW5kZWRVcmlJbmZvOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgYXBwbHkoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgY29udGFpbmVyUmVxdWVzdENvbnRleHQpIHsKKyAgICAgICAgICAgIFNldDxTdHJpbmc+IGFsbG93ZWRNZXRob2RzID0gTW9kZWxQcm9jZXNzb3JVdGlsLmdldEFsbG93ZWRNZXRob2RzKGV4dGVuZGVkVXJpSW5mby5nZXQoKQorICAgICAgICAgICAgICAgICAgICAuZ2V0TWF0Y2hlZFJ1bnRpbWVSZXNvdXJjZXMoKS5nZXQoMCkpOworCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYWxsb3dlZExpc3QgPSBhbGxvd2VkTWV0aG9kcy50b1N0cmluZygpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIG9wdGlvbnNCb2R5ID0gYWxsb3dlZExpc3Quc3Vic3RyaW5nKDEsIGFsbG93ZWRMaXN0Lmxlbmd0aCgpIC0gMSk7CisKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vayhvcHRpb25zQm9keSwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkKKyAgICAgICAgICAgICAgICAgICAgLmFsbG93KGFsbG93ZWRNZXRob2RzKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEdlbmVyaWNPcHRpb25zSW5mbGVjdG9yIGltcGxlbWVudHMgSW5mbGVjdG9yPENvbnRhaW5lclJlcXVlc3RDb250ZXh0LCBSZXNwb25zZT4geworICAgICAgICBASW5qZWN0CisgICAgICAgIHByaXZhdGUgUHJvdmlkZXI8RXh0ZW5kZWRVcmlJbmZvPiBleHRlbmRlZFVyaUluZm87CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBhcHBseShDb250YWluZXJSZXF1ZXN0Q29udGV4dCBjb250YWluZXJSZXF1ZXN0Q29udGV4dCkgeworICAgICAgICAgICAgZmluYWwgU2V0PFN0cmluZz4gYWxsb3dlZE1ldGhvZHMgPSBNb2RlbFByb2Nlc3NvclV0aWwuZ2V0QWxsb3dlZE1ldGhvZHMoCisgICAgICAgICAgICAgICAgICAgIChleHRlbmRlZFVyaUluZm8uZ2V0KCkuZ2V0TWF0Y2hlZFJ1bnRpbWVSZXNvdXJjZXMoKS5nZXQoMCkpKTsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygpCisgICAgICAgICAgICAgICAgICAgIC5hbGxvdyhhbGxvd2VkTWV0aG9kcykKKyAgICAgICAgICAgICAgICAgICAgLmhlYWRlcihIdHRwSGVhZGVycy5DT05URU5UX0xFTkdUSCwgIjAiKQorICAgICAgICAgICAgICAgICAgICAudHlwZShjb250YWluZXJSZXF1ZXN0Q29udGV4dC5nZXRBY2NlcHRhYmxlTWVkaWFUeXBlcygpLmdldCgwKSkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb3VyY2VNb2RlbCBwcm9jZXNzUmVzb3VyY2VNb2RlbChSZXNvdXJjZU1vZGVsIHJlc291cmNlTW9kZWwsIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgeworICAgICAgICByZXR1cm4gTW9kZWxQcm9jZXNzb3JVdGlsLmVuaGFuY2VSZXNvdXJjZU1vZGVsKHJlc291cmNlTW9kZWwsIGZhbHNlLCBtZXRob2RMaXN0LCB0cnVlKS5idWlsZCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvdXJjZU1vZGVsIHByb2Nlc3NTdWJSZXNvdXJjZShSZXNvdXJjZU1vZGVsIHN1YlJlc291cmNlTW9kZWwsIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgeworICAgICAgICByZXR1cm4gTW9kZWxQcm9jZXNzb3JVdGlsLmVuaGFuY2VSZXNvdXJjZU1vZGVsKHN1YlJlc291cmNlTW9kZWwsIHRydWUsIG1ldGhvZExpc3QsIHRydWUpLmJ1aWxkKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9wcm9jZXNzb3IvV2FkbE1vZGVsUHJvY2Vzc29yLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci93YWRsL3Byb2Nlc3Nvci9XYWRsTW9kZWxQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTcxNWZkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9wcm9jZXNzb3IvV2FkbE1vZGVsUHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwucHJvY2Vzc29yOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkh0dHBNZXRob2Q7CitpbXBvcnQgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJpb3JpdHk7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuTWFyc2hhbGxlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUHJvcGVydGllc0hlbHBlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLk1lZGlhVHlwZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5JbmZsZWN0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkV4dGVuZGVkVXJpSW5mbzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuTW9kZWxQcm9jZXNzb3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1vZGVsOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SdW50aW1lUmVzb3VyY2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLmludGVybmFsLk1vZGVsUHJvY2Vzc29yVXRpbDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5XYWRsQXBwbGljYXRpb25Db250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLmludGVybmFsLldhZGxSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5pbnRlcm5hbC5XYWRsVXRpbHM7CisKK2ltcG9ydCBjb20uc3VuLnJlc2VhcmNoLndzLndhZGwuQXBwbGljYXRpb247CisKKy8qKgorICogV0FETCB7QGxpbmsgTW9kZWxQcm9jZXNzb3IgbW9kZWwgcHJvY2Vzc29yfSB3aGljaCBlbmhhbmNlIHJlc291cmNlIG1vZGVsIGJ5IFdBREwgcmVsYXRlZCByZXNvdXJjZXMgKGxpa2UgIi9hcHBsaWNhdGlvbi53YWRsIikuCisgKiBUaGUgcHJvdmlkZXIgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgdXNpbmcKKyAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5pbnRlcm5hbC5XYWRsQXV0b0Rpc2NvdmVyYWJsZX0gb3IgYnkKKyAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5XYWRsRmVhdHVyZX0gaWYgYXV0by1kaXNjb3ZlcnkgaXMgZGlzYWJsZWQuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICoKKyAqLworQFByaW9yaXR5KDEwMDAwKQorcHVibGljIGNsYXNzIFdhZGxNb2RlbFByb2Nlc3NvciBpbXBsZW1lbnRzIE1vZGVsUHJvY2Vzc29yIHsKKworCisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PE1vZGVsUHJvY2Vzc29yVXRpbC5NZXRob2Q+IG1ldGhvZExpc3Q7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IFdBREwgbW9kZWwgcHJvY2Vzc29yIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBXYWRsTW9kZWxQcm9jZXNzb3IoKSB7CisgICAgICAgIG1ldGhvZExpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgbWV0aG9kTGlzdC5hZGQobmV3IE1vZGVsUHJvY2Vzc29yVXRpbC5NZXRob2QoSHR0cE1ldGhvZC5PUFRJT05TLCBNZWRpYVR5cGUuV0lMRENBUkRfVFlQRSwgTWVkaWFUeXBlcy5XQURMX1RZUEUsCisgICAgICAgICAgICAgICAgT3B0aW9uc0hhbmRsZXIuY2xhc3MpKTsKKyAgICB9CisKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvdXJjZU1vZGVsIHByb2Nlc3NSZXNvdXJjZU1vZGVsKGZpbmFsIFJlc291cmNlTW9kZWwgcmVzb3VyY2VNb2RlbCwgZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gZGlzYWJsZWQgPSBQcm9wZXJ0aWVzSGVscGVyLmlzUHJvcGVydHkoY29uZmlndXJhdGlvbi5nZXRQcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLldBRExfRkVBVFVSRV9ESVNBQkxFKSk7CisgICAgICAgIGlmIChkaXNhYmxlZCkgeworICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlTW9kZWw7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBSZXNvdXJjZU1vZGVsLkJ1aWxkZXIgYnVpbGRlciA9IE1vZGVsUHJvY2Vzc29yVXRpbC5lbmhhbmNlUmVzb3VyY2VNb2RlbChyZXNvdXJjZU1vZGVsLCBmYWxzZSwgbWV0aG9kTGlzdCwgdHJ1ZSk7CisKKyAgICAgICAgLy8gRG8gbm90IGFkZCBXYWRsUmVzb3VyY2UgaWYgYWxyZWFkeSBwcmVzZW50IGluIHRoZSBjbGFzc2VzIChpLmUuIGFkZGVkIGR1cmluZyBzY2FubmluZykuCisgICAgICAgIGlmICghY29uZmlndXJhdGlvbi5nZXRDbGFzc2VzKCkuY29udGFpbnMoV2FkbFJlc291cmNlLmNsYXNzKSkgeworICAgICAgICAgICAgZmluYWwgUmVzb3VyY2Ugd2FkbFJlc291cmNlID0gUmVzb3VyY2UuYnVpbGRlcihXYWRsUmVzb3VyY2UuY2xhc3MpLmJ1aWxkKCk7CisgICAgICAgICAgICBidWlsZGVyLmFkZFJlc291cmNlKHdhZGxSZXNvdXJjZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogT1BUSU9OUyByZXNvdXJjZSBtZXRob2QgaGFuZGxlciB0aGF0IHNlcnZlcyByZXNvdXJjZSBXQURMLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgT3B0aW9uc0hhbmRsZXIgaW1wbGVtZW50cyBJbmZsZWN0b3I8Q29udGFpbmVyUmVxdWVzdENvbnRleHQsIFJlc3BvbnNlPiB7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGxhc3RNb2RpZmllZCA9CisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZURhdGVGb3JtYXQoV2FkbFJlc291cmNlLkhUVFBEQVRFRk9STUFUKS5mb3JtYXQobmV3IERhdGUoKSk7CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBwcml2YXRlIFByb3ZpZGVyPEV4dGVuZGVkVXJpSW5mbz4gZXh0ZW5kZWRVcmlJbmZvOworCisgICAgICAgIEBDb250ZXh0CisgICAgICAgIHByaXZhdGUgV2FkbEFwcGxpY2F0aW9uQ29udGV4dCB3YWRsQXBwbGljYXRpb25Db250ZXh0OworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgYXBwbHkoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgY29udGFpbmVyUmVxdWVzdENvbnRleHQpIHsKKworICAgICAgICAgICAgZmluYWwgUnVudGltZVJlc291cmNlIHJlc291cmNlID0gZXh0ZW5kZWRVcmlJbmZvLmdldCgpLmdldE1hdGNoZWRSdW50aW1lUmVzb3VyY2VzKCkuZ2V0KDApOworICAgICAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBtdWx0aXBsZSByZXNvdXJjZXMsIHNlZSBpZ25vcmVkIHRlc3RzIGluIFdhZGxSZXNvdXJjZVRlc3QuV2FkbDhUZXN0CisgICAgICAgICAgICBmaW5hbCBVcmlJbmZvIHVyaUluZm8gPSBjb250YWluZXJSZXF1ZXN0Q29udGV4dC5nZXRVcmlJbmZvKCk7CisKKyAgICAgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uIHdhZGxBcHBsaWNhdGlvbiA9IHdhZGxBcHBsaWNhdGlvbkNvbnRleHQuZ2V0QXBwbGljYXRpb24odXJpSW5mbywKKyAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApLCBXYWRsVXRpbHMuaXNEZXRhaWxlZFdhZGxSZXF1ZXN0ZWQodXJpSW5mbykpOworCisgICAgICAgICAgICBpZiAod2FkbEFwcGxpY2F0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyB3YWRsQXBwbGljYXRpb24gY2FuIGJlIG51bGwgaWYgbGltaXRlZCBXQURMIGlzIHJlcXVlc3RlZCBhbmQgYWxsIGNvbnRlbnQKKyAgICAgICAgICAgICAgICAvLyBvZiB3YWRsQXBwbGljYXRpb24gaXMgaW52aXNpYmxlIGluIGxpbWl0ZWQgV0FETAorICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoUmVzcG9uc2UuU3RhdHVzLk5PVF9GT1VORCkuYnVpbGQoKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBieXRlW10gYnl0ZXM7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZpbmFsIE1hcnNoYWxsZXIgbWFyc2hhbGxlciA9IHdhZGxBcHBsaWNhdGlvbkNvbnRleHQuZ2V0SkFYQkNvbnRleHQoKS5jcmVhdGVNYXJzaGFsbGVyKCk7CisgICAgICAgICAgICAgICAgbWFyc2hhbGxlci5zZXRQcm9wZXJ0eShNYXJzaGFsbGVyLkpBWEJfRk9STUFUVEVEX09VVFBVVCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgICAgIG1hcnNoYWxsZXIubWFyc2hhbCh3YWRsQXBwbGljYXRpb24sIG9zKTsKKyAgICAgICAgICAgICAgICBieXRlcyA9IG9zLnRvQnl0ZUFycmF5KCk7CisgICAgICAgICAgICAgICAgb3MuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oIkNvdWxkIG5vdCBtYXJzaGFsIHRoZSB3YWRsIEFwcGxpY2F0aW9uLiIsIGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soKQorICAgICAgICAgICAgICAgICAgICAudHlwZShNZWRpYVR5cGVzLldBRExfVFlQRSkKKyAgICAgICAgICAgICAgICAgICAgLmFsbG93KE1vZGVsUHJvY2Vzc29yVXRpbC5nZXRBbGxvd2VkTWV0aG9kcyhyZXNvdXJjZSkpCisgICAgICAgICAgICAgICAgICAgIC5oZWFkZXIoIkxhc3QtbW9kaWZpZWQiLCBsYXN0TW9kaWZpZWQpCisgICAgICAgICAgICAgICAgICAgIC5lbnRpdHkoYnl0ZXMpCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc291cmNlTW9kZWwgcHJvY2Vzc1N1YlJlc291cmNlKFJlc291cmNlTW9kZWwgcmVzb3VyY2VNb2RlbCwgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gZGlzYWJsZWQgPSBQcm9wZXJ0aWVzSGVscGVyLmlzUHJvcGVydHkoY29uZmlndXJhdGlvbi5nZXRQcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLldBRExfRkVBVFVSRV9ESVNBQkxFKSk7CisgICAgICAgIGlmIChkaXNhYmxlZCkgeworICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlTW9kZWw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE1vZGVsUHJvY2Vzc29yVXRpbC5lbmhhbmNlUmVzb3VyY2VNb2RlbChyZXNvdXJjZU1vZGVsLCB0cnVlLCBtZXRob2RMaXN0LCB0cnVlKS5idWlsZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvcHJvY2Vzc29yL3BhY2thZ2UtaW5mby5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9wcm9jZXNzb3IvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ4ZTRjYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvcHJvY2Vzc29yL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKKy8qKgorICogSmVyc2V5IHNlcnZlci1zaWRlIFdBREwge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5Nb2RlbFByb2Nlc3NvciBtb2RlbCBwcm9jZXNzb3J9IGNsYXNzZXMKKyAqIHRoYXQgZXh0ZW5kcyByZXNvdXJjZSBtb2RlbCB3aXRoIHJlc291cmNlcyBhbmQgcmVzb3VyY2UgbWV0aG9kcyB0aGF0IHByb2R1Y2UgV0FETCBjb250ZW50LgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLnByb2Nlc3NvcjsKZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UubWQgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlOWJjMDAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFLm1kCkBAIC0wLDAgKzEsNDEgQEAKKyMgTm90aWNlIGZvciBKZXJzZXkgQ29yZSBTZXJ2ZXIgbW9kdWxlIA0KK1RoaXMgY29udGVudCBpcyBwcm9kdWNlZCBhbmQgbWFpbnRhaW5lZCBieSB0aGUgRWNsaXBzZSBKZXJzZXkgcHJvamVjdC4NCisNCisqIGh0dHBzOi8vcHJvamVjdHMuZWNsaXBzZS5vcmcvcHJvamVjdHMvZWU0ai5qZXJzZXkNCisNCisjIyBUcmFkZW1hcmtzDQorRWNsaXBzZSBKZXJzZXkgaXMgYSB0cmFkZW1hcmsgb2YgdGhlIEVjbGlwc2UgRm91bmRhdGlvbi4NCisNCisjIyBDb3B5cmlnaHQNCisNCitBbGwgY29udGVudCBpcyB0aGUgcHJvcGVydHkgb2YgdGhlIHJlc3BlY3RpdmUgYXV0aG9ycyBvciB0aGVpciBlbXBsb3llcnMuIEZvcg0KK21vcmUgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGF1dGhvcnNoaXAgb2YgY29udGVudCwgcGxlYXNlIGNvbnN1bHQgdGhlIGxpc3RlZA0KK3NvdXJjZSBjb2RlIHJlcG9zaXRvcnkgbG9ncy4NCisNCisjIyBEZWNsYXJlZCBQcm9qZWN0IExpY2Vuc2VzDQorDQorVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zDQorb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdA0KK2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4gVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlDQorYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5IExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2gNCithdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUNCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24gd2hpY2ggaXMNCithdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLg0KKw0KK1NQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMA0KKw0KKyMjIFNvdXJjZSBDb2RlDQorVGhlIHByb2plY3QgbWFpbnRhaW5zIHRoZSBmb2xsb3dpbmcgc291cmNlIGNvZGUgcmVwb3NpdG9yaWVzOg0KKw0KKyogaHR0cHM6Ly9naXRodWIuY29tL2VjbGlwc2UtZWU0ai9qZXJzZXkNCisNCisjIyBUaGlyZC1wYXJ0eSBDb250ZW50DQorDQorb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLm1vbml0b3JpbmcuY29yZQ0KKyogTGljZW5zZTogQXBhY2hlIExpY2Vuc2UsIDIuMA0KKyogQ29weXJpZ2h0IChjKSAyMDE1LTIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCisqIENvcHlyaWdodCAyMDEwLTIwMTMgQ29kYSBIYWxlIGFuZCBZYW1tZXIsIEluYy4NCisNCitvcmcub2JqZWN0d2ViLmFzbSBWZXJzaW9uIDUuMC40DQorKiBMaWNlbnNlOiBNb2RpZmllZCBCU0QgKGh0dHA6Ly9hc20ub2JqZWN0d2ViLm9yZy9saWNlbnNlLmh0bWwpDQorKiBDb3B5cmlnaHQ6IChjKSAyMDAwLTIwMTEgSU5SSUEsIEZyYW5jZSBUZWxlY29tLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9qYXZheC53cy5ycy5leHQuUnVudGltZURlbGVnYXRlIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL2phdmF4LndzLnJzLmV4dC5SdW50aW1lRGVsZWdhdGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlmMzdjYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9qYXZheC53cy5ycy5leHQuUnVudGltZURlbGVnYXRlCkBAIC0wLDAgKzEgQEAKK29yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5SdW50aW1lRGVsZWdhdGVJbXBsClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnNwaS5BdXRvRGlzY292ZXJhYmxlIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnNwaS5BdXRvRGlzY292ZXJhYmxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNjYwODQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuc3BpLkF1dG9EaXNjb3ZlcmFibGUKQEAgLTAsMCArMSBAQAorb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmZpbHRlci5pbnRlcm5hbC5TZXJ2ZXJGaWx0ZXJzQXV0b0Rpc2NvdmVyYWJsZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5zcGkuRm9yY2VkQXV0b0Rpc2NvdmVyYWJsZSBiL2NvcmUtc2VydmVyL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5zcGkuRm9yY2VkQXV0b0Rpc2NvdmVyYWJsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjUwNDViCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnNwaS5Gb3JjZWRBdXRvRGlzY292ZXJhYmxlCkBAIC0wLDAgKzEsMiBAQAorb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuaW50ZXJuYWwuV2FkbEF1dG9EaXNjb3ZlcmFibGUKK29yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5tb25pdG9yaW5nLk1vbml0b3JpbmdBdXRvZGlzY292ZXJhYmxlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL21haW4vcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9sb2NhbGl6YXRpb24ucHJvcGVydGllcyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMxMjVhNwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxOTYgQEAKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisjCisjIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyMgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorIyBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyMgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorIworIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyMKKworYW1iaWd1b3VzLmZhdGFsLnJtcz1BIHJlc291cmNlIG1vZGVsIGhhcyBhbWJpZ3VvdXMgKHN1Yi0pcmVzb3VyY2UgbWV0aG9kIGZvciBIVFRQIG1ldGhvZCB7MH0gYW5kIGlucHV0IG1pbWUtdHlwZXMgYXMgZGVmaW5lZCBieVwKKyAgICJAQ29uc3VtZXMiIGFuZCAiQFByb2R1Y2VzIiBhbm5vdGF0aW9ucyBhdCBKYXZhIG1ldGhvZHMgezF9IGFuZCB7Mn0gYXQgbWF0Y2hpbmcgcmVndWxhciBleHByZXNzaW9uIHszfS4gVGhlc2UgdHdvIG1ldGhvZHMgXAorICBwcm9kdWNlcyBhbmQgY29uc3VtZXMgZXhhY3RseSB0aGUgc2FtZSBtaW1lLXR5cGVzIGFuZCB0aGVyZWZvcmUgdGhlaXIgaW52b2NhdGlvbiBhcyBhIHJlc291cmNlIG1ldGhvZHMgd2lsbCBhbHdheXMgZmFpbC4KK2FtYmlndW91cy5ub24uYW5ub3RhdGVkLnBhcmFtZXRlcj1NZXRob2QgezB9IG9uIHJlc291cmNlIHsxfSBjb250YWlucyBtdWx0aXBsZSBwYXJhbWV0ZXJzIHdpdGggbm8gYW5ub3RhdGlvbi4gVW5hYmxlIHRvIHJlc29sdmUgdGhlIGluamVjdGlvbiBzb3VyY2UuCithbWJpZ3VvdXMucGFyYW1ldGVyPVBhcmFtZXRlciB7MX0gb2YgezB9IE1VU1QgYmUgb25seSBvbmUgb2YgYSBwYXRoLCBxdWVyeSwgbWF0cml4IG9yIGhlYWRlciBwYXJhbWV0ZXIuCithbWJpZ3VvdXMucmVzb3VyY2UubWV0aG9kPU11bHRpcGxlIG1ldGhvZHMgZm91bmQgdG8gc3VpdCBjbGllbnQgcmVxdWVzdCB3aXRoIGFjY2VwdCBoZWFkZXIgezB9LiBTZWxlY3RlZCB0aGUgZmlyc3QgbWV0aG9kIGZyb20gdGhlIGZvbGxvd2luZyBsaXN0LgorYW1iaWd1b3VzLnJtcy5pbj1BIHJlc291cmNlIG1vZGVsIGhhcyBhbWJpZ3VvdXMgKHN1Yi0pcmVzb3VyY2UgbWV0aG9kIGZvciBIVFRQIG1ldGhvZCB7MH0gYW5kIGlucHV0IG1pbWUtdHlwZXMgYXMgZGVmaW5lZCBieSBcCisgICJAQ29uc3VtZXMiIGFubm90YXRpb24gYXQgSmF2YSBtZXRob2RzIHsxfSBhbmQgezJ9IGF0IG1hdGNoaW5nIHBhdGggcGF0dGVybiB7M30uIFRoaXMgY291bGQgY2F1c2UgYW4gZXJyb3IgZm9yIGNvbmZsaWN0aW5nIFwKKyAgb3V0cHV0IHR5cGVzIQorYW1iaWd1b3VzLnJtcy5vdXQ9QSByZXNvdXJjZSBtb2RlbCBoYXMgYW1iaWd1b3VzIChzdWItKXJlc291cmNlIG1ldGhvZCBmb3IgSFRUUCBtZXRob2QgezB9IGFuZCBvdXRwdXQgbWltZS10eXBlcyBhcyBkZWZpbmVkIGJ5IEBQcm9kdWNlcyBhbm5vdGF0aW9uIGF0IEphdmEgbWV0aG9kcyB7MX0gYW5kIHsyfSBhdCBtYXRjaGluZyBwYXRoIHBhdHRlcm4gezN9LgorYW1iaWd1b3VzLnNybHMucGF0aFBhdHRlcm49QSByZXNvdXJjZSBtb2RlbCBoYXMgYW1iaWd1b3VzIHN1Yi1yZXNvdXJjZSBsb2NhdG9ycyBvbiBwYXRoIHBhdHRlcm4gezB9LgorYW1iaWd1b3VzLnNybHM9QSByZXNvdXJjZSwgezB9LCBoYXMgYW1iaWd1b3VzIHN1Yi1yZXNvdXJjZSBsb2NhdG9ycyBvbiBwYXRoIHsxfS4KK2Jyb2FkY2FzdGVyLmxpc3RlbmVyLmV4Y2VwdGlvbj17MH0gdGhyb3duIGZyb20gQnJvYWRjYXN0ZXJMaXN0ZW5lci4KK2NhbGxiYWNrLmFycmF5Lm51bGw9QWRkaXRpb25hbCBhcnJheSBvZiBjYWxsYmFja3MgaXMgbnVsbC4KK2NhbGxiYWNrLmFycmF5LmVsZW1lbnQubnVsbD1PbmUgb2YgYWRkaXRpb25hbCBjYWxsYmFja3MgaXMgbnVsbC4KK2Nsb3NlYWJsZS5pbmplY3RlZC5yZXF1ZXN0LmNvbnRleHQubnVsbD1JbmplY3RlZCByZXF1ZXN0IGNvbnRleHQgaXMgJ251bGwnIG9uIHRocmVhZCB7MH0uCitjbG9zZWFibGUudW5hYmxlLnRvLmNsb3NlPUVycm9yIHdoaWxlIGNsb3NpbmcgezB9LgorY29sbGVjdGlvbi5leHRyYWN0b3IudHlwZS51bnN1cHBvcnRlZD1VbnN1cHBvcnRlZCBjb2xsZWN0aW9uIHR5cGUuCitjb250cmFjdC5jYW5ub3QuYmUuYm91bmQudG8ucmVzb3VyY2UubWV0aG9kPVRoZSBnaXZlbiBjb250cmFjdCAoezB9KSBvZiB7MX0gcHJvdmlkZXIgY2Fubm90IGJlIGJvdW5kIHRvIGEgcmVzb3VyY2UgbWV0aG9kLgorZGVmYXVsdC5jb3VsZC5ub3QucHJvY2Vzcy5tZXRob2Q9RGVmYXVsdCB2YWx1ZSwgezB9IGNvdWxkIG5vdCBiZSBwcm9jZXNzZWQgYnkgbWV0aG9kIHsxfS4KK2Vycm9yLmFzeW5jLmNhbGxiYWNrLmZhaWxlZD1DYWxsYmFjayB7MH0gaW52b2NhdGlvbiBmYWlsZWQuCitlcnJvci5jb21taXR0aW5nLm91dHB1dC5zdHJlYW09RXJyb3Igd2hpbGUgY29tbWl0dGluZyB0aGUgb3V0cHV0IHN0cmVhbS4KK2Vycm9yLmNsb3NpbmcuY29tbWl0Lm91dHB1dC5zdHJlYW09RXJyb3Igd2hpbGUgY2xvc2luZyB0aGUgb3V0cHV0IHN0cmVhbSBpbiBvcmRlciB0byBjb21taXQgcmVzcG9uc2UuCitlcnJvci5jbG9zaW5nLmZpbmRlcj1FcnJvciB3aGlsZSBjbG9zaW5nIHswfSByZXNvdXJjZSBmaW5kZXIuCitlcnJvci5leGNlcHRpb24ubWFwcGluZy5vcmlnaW5hbC5leGNlcHRpb249QW4gZXhjZXB0aW9uIG1hcHBpbmcgZGlkIG5vdCBzdWNjZXNzZnVsbHkgcHJvZHVjZSBhbmQgcHJvY2Vzc2VkIGEgcmVzcG9uc2UuIExvZ2dpbmcgdGhlIG9yaWdpbmFsIGVycm9yLgorZXJyb3IuZXhjZXB0aW9uLm1hcHBpbmcucHJvY2Vzc2VkLnJlc3BvbnNlLmVycm9yPUEgcmVzcG9uc2UgZXJyb3IgbWFwcGluZyBkaWQgbm90IHN1Y2Nlc3NmdWxseSBwcm9kdWNlIGFuZCBwcm9jZXNzZWQgYSByZXNwb25zZS4KK2Vycm9yLmV4Y2VwdGlvbi5tYXBwaW5nLnRocm93bi50by5jb250YWluZXI9QW4gZXhjZXB0aW9uIG1hcHBpbmcgZGlkIG5vdCBzdWNjZXNzZnVsbHkgcHJvZHVjZSBhbmQgcHJvY2Vzc2VkIGEgcmVzcG9uc2UuIExvZ2dpbmcgdGhlIGV4Y2VwdGlvbiBwcm9wYWdhdGVkIHRvIHRoZSBjb250YWluZXIuCitlcnJvci5tYXJzaGFsbGluZy5qYXhiPUVycm9yIG1hcnNoYWxsaW5nIEpBWEIgb2JqZWN0IG9mIHR5cGUgInswfSIuCitlcnJvci5tc2c9RVJST1I6IHswfQorZXJyb3IubW9uaXRvcmluZy5zdGF0aXN0aWNzLmdlbmVyYXRpb249RXJyb3IgZ2VuZXJhdGluZyBtb25pdG9yaW5nIHN0YXRpc3RpY3MuCitlcnJvci5tb25pdG9yaW5nLnN0YXRpc3RpY3MubGlzdGVuZXI9RXhjZXB0aW9uIHRocm93biB3aGVuIHByb3ZpZGVyIHswfSB3YXMgcHJvY2Vzc2luZyBNb25pdG9yaW5nU3RhdGlzdGljcy4gUmVtb3ZpbmcgcHJvdmlkZXIgZnJvbSBmdXJ0aGVyIHByb2Nlc3NpbmcuCitlcnJvci5tb25pdG9yaW5nLnN0YXRpc3RpY3MubGlzdGVuZXIuZGVzdHJveT1FeGNlcHRpb24gdGhyb3duIHdoZW4gbGlzdGVuZXIgezB9IGhhcyBiZWVuIHByb2Nlc3NpbmcgdGhlIGRlc3Ryb3kgZXZlbnQuCitlcnJvci5tb25pdG9yaW5nLm1iZWFucy5yZWdpc3RyYXRpb249RXJyb3Igd2hlbiByZWdpc3RlcmluZyBKZXJzZXkgbW9uaXRvcmluZyBNQmVhbnMuIFJlZ2lzdHJhdGlvbiBvZiBNQmVhbiB3aXRoIG5hbWUgInswfSIgZmFpbGVkLgorZXJyb3IubW9uaXRvcmluZy5tYmVhbnMudW5yZWdpc3RyYXRpb24uZGVzdHJveT1FcnJvciB1bi1yZWdpc3RlcmluZyBKZXJzZXkgbW9uaXRvcmluZyBNQmVhbnMgb24gYXBwbGljYXRpb24gZGVzdHJveS4KK2Vycm9yLm1vbml0b3Jpbmcuc2NoZWR1bGVyLmRlc3Ryb3kudGltZW91dD1XYWl0aW5nIGZvciBzaHV0ZG93biBvZiBNb25pdG9yaW5nU3RhdGlzdGljc1Byb2Nlc3NvciBoYXMgdGltZWQgb3V0ISBQb3NzaWJsZSBjYXVzZSBjYW4gYmUgdGhhdCBhbnkgcmVnaXN0ZXJlZCBNb25pdG9yaW5nU3RhdGlzdGljc0xpc3RlbmVyIHRha2VzIHRvbyBsb25nIHRvIGV4ZWN1dGUuCitlcnJvci5tb25pdG9yaW5nLnNodXRkb3duLmludGVycnVwdGVkPVdhaXRpbmcgZm9yIHNodXRkb3duIG9mIE1vbml0b3JpbmdTdGF0aXN0aWNzUHJvY2Vzc29yIGhhcyBiZWVuIGludGVycnVwdGVkLgorZXJyb3IubW9uaXRvcmluZy5xdWV1ZS5hcHA9RmFpbGVkIHRvIGFkZCB0aGUgbW9uaXRvcmluZyBldmVudCBpbnRvIHRoZSBBcHBsaWNhdGlvbiBFdmVudCBRdWV1ZSAtIHF1ZXVlIGlzIGZ1bGwuIE9uZSBvZiB0aGUgXAorICByZWdpc3RlcmVkIE1vbml0b3JpbmdTdGF0aXN0aWNzTGlzdGVuZXJzIG1pZ2h0IGJlIGJsb2NraW5nIHRoZSBldmVudCBwcm9jZXNzaW5nLgorZXJyb3IubW9uaXRvcmluZy5xdWV1ZS5yZXF1ZXN0PUZhaWxlZCB0byBhZGQgdGhlIG1vbml0b3JpbmcgZXZlbnQgaW50byB0aGUgUmVxdWVzdCBJdGVtcyBRdWV1ZSAtIHF1ZXVlIGlzIGZ1bGwuIE9uZSBvZiB0aGUgXAorICByZWdpc3RlcmVkIE1vbml0b3JpbmdTdGF0aXN0aWNzTGlzdGVuZXJzIG1pZ2h0IGJlIGJsb2NraW5nIHRoZSBldmVudCBwcm9jZXNzaW5nLgorZXJyb3IubW9uaXRvcmluZy5xdWV1ZS5yZXNwb25zZT1GYWlsZWQgdG8gYWRkIHRoZSBtb25pdG9yaW5nIGV2ZW50IGludG8gdGhlIFJlc3BvbnNlIFN0YXR1c2VzIFF1ZXVlIC0gcXVldWUgaXMgZnVsbC4gT25lIG9mIHRoZSBcCisgIHJlZ2lzdGVyZWQgTW9uaXRvcmluZ1N0YXRpc3RpY3NMaXN0ZW5lcnMgbWlnaHQgYmUgYmxvY2tpbmcgdGhlIGV2ZW50IHByb2Nlc3NpbmcuCitlcnJvci5tb25pdG9yaW5nLnF1ZXVlLm1hcHBlcj1GYWlsZWQgdG8gYWRkIHRoZSBtb25pdG9yaW5nIGV2ZW50IGludG8gdGhlIEV4Y2VwdGlvbiBNYXBwZXIgRXZlbnRzIFF1ZXVlIC0gcXVldWUgaXMgZnVsbC4gT25lIG9mIFwKKyAgdGhlIHJlZ2lzdGVyZWQgTW9uaXRvcmluZ1N0YXRpc3RpY3NMaXN0ZW5lcnMgbWlnaHQgYmUgYmxvY2tpbmcgdGhlIGV2ZW50IHByb2Nlc3NpbmcuCitlcnJvci5tb25pdG9yaW5nLnF1ZXVlLmZsb29kZWQ9QSBNb25pdG9yaW5nIEV2ZW50IFF1ZXVlIGlzIGJlaW5nIGZsb29kZWQuIFRoZSBtb25pdG9yaW5nIHN0YXRpc3RpY3Mgd2lsbCBzaG93IGluYWNjdXJhdGUgXAorICBtZWFzdXJlbWVudHM7IGVzcGVjaWFsbHkgaW4gY2FzZSBvZiBzaG9ydCB0aW1lIHdpbmRvdyBzdGF0aXN0aWNzLiBUaGUgcXVldWUgc2l6ZSBpcyB7MH0uCitlcnJvci5wYXJhbWV0ZXIuaW52YWxpZC5jaGFyLnZhbHVlPVZhbHVlICJ7MH0iIGlzIG5vdCBhIGNoYXJhY3Rlci4KK2Vycm9yLnBhcmFtZXRlci5taXNzaW5nLnZhbHVlLnByb3ZpZGVyPU5vIGluamVjdGlvbiBzb3VyY2UgZm91bmQgZm9yIGEgcGFyYW1ldGVyIG9mIHR5cGUgezF9IGF0IGluZGV4IHswfS4KK2Vycm9yLnBhcmFtZXRlci50eXBlLnByb2Nlc3Npbmc9Q291bGQgbm90IHByb2Nlc3MgcGFyYW1ldGVyIHR5cGUgezB9LgorZXJyb3IucHJpbWl0aXZlLnR5cGUubnVsbD1UaGUgcmVxdWVzdCBlbnRpdHkgY2Fubm90IGJlIGVtcHR5LgorZXJyb3IucHJvY2Vzc2luZy5tZXRob2Q9RXJyb3IgcHJvY2Vzc2luZyByZXNvdXJjZSBtZXRob2QsIHswfSwgZm9yIFJlc291cmNlTWV0aG9kRGlzcGF0Y2hQcm92aWRlciwgezF9LgorZXJyb3IucHJvY2Vzc2luZy5yZXNwb25zZS5mcm9tLmFscmVhZHkubWFwcGVkLmV4Y2VwdGlvbj1FcnJvciBvY2N1cnJlZCB3aGVuIHByb2Nlc3NpbmcgYSByZXNwb25zZSBjcmVhdGVkIGZyb20gYW4gYWxyZWFkeSBtYXBwZWQgZXhjZXB0aW9uLgorZXJyb3IucmVzb3VyY2UuamF2YS5tZXRob2QuaW52b2NhdGlvbj1SZXNvdXJjZSBKYXZhIG1ldGhvZCBpbnZvY2F0aW9uIGVycm9yLgorZXJyb3IucmVzb3VyY2VzLmNhbm5vdC5tZXJnZT1SZXNvdXJjZXMgZG8gbm90IGhhdmUgdGhlIHNhbWUgcGF0aCBhbmQgY2Fubm90IGJlIG1lcmdlZC4KK2Vycm9yLnJlcXVlc3QuYWJvcnQuaW4ucmVzcG9uc2UucGhhc2U9VGhlIHJlcXVlc3QgY2Fubm90IGJlIGFib3J0ZWQgYXMgaXQgaXMgYWxyZWFkeSBpbiB0aGUgcmVzcG9uc2UgcHJvY2Vzc2luZyBwaGFzZS4KK2Vycm9yLnJlcXVlc3Quc2V0LmVudGl0eS5zdHJlYW0uaW4ucmVzcG9uc2UucGhhc2U9VGhlIGVudGl0eSBzdHJlYW0gY2Fubm90IGJlIHNldCBpbiB0aGUgcmVxdWVzdCBhcyBpdCBpcyBhbHJlYWR5IGluIHRoZSByZXNwb25zZSBwcm9jZXNzaW5nIHBoYXNlLgorZXJyb3IucmVxdWVzdC5zZXQuc2VjdXJpdHkuY29udGV4dC5pbi5yZXNwb25zZS5waGFzZT1UaGUgc2VjdXJpdHkgY29udGV4dCBjYW5ub3QgYmUgc2V0IGluIHRoZSByZXF1ZXN0IGFzIGl0IGlzIGFscmVhZHkgaW4gdGhlIHJlc3BvbnNlIHByb2Nlc3NpbmcgcGhhc2UuCitlcnJvci5zY2FubmluZy5jbGFzcy5ub3QuZm91bmQ9QSBjbGFzcyBmaWxlIG9mIHRoZSBjbGFzcyBuYW1lLCB7MH0sIGlzIGlkZW50aWZpZWQgYnV0IHRoZSBjbGFzcyBjb3VsZCBub3QgYmUgZm91bmQuCitlcnJvci5zdWIucmVzb3VyY2UubG9jYXRvci5tb3JlLnJlc291cmNlcz1TdWIgcmVzb3VyY2UgbG9jYXRvciByZXR1cm5lZCB7MH0gaW4gdGhlIHJlc291cmNlIG1vZGVsLiBFeGFjdGx5IG9uZSByZXNvdXJjZSBtdXN0IGJlIHJldHVybmVkLgorZXJyb3Iuc3VzcGVuZGluZy5jaHVua2VkLm91dHB1dC5yZXNwb25zZT1BdHRlbXB0IHRvIHN1c3BlbmQgYSBjbGllbnQgY29ubmVjdGlvbiBhc3NvY2lhdGVkIHdpdGggYSBjaHVua2VkIG91dHB1dCBoYXMgZmFpbGVkIGluIHRoZSB1bmRlcmx5aW5nIGNvbnRhaW5lci4KK2Vycm9yLnN1c3BlbmRpbmcuYXN5bmMucmVxdWVzdD1BdHRlbXB0IHRvIHN1c3BlbmQgYSBjb25uZWN0aW9uIG9mIGFuIGFzeW5jaHJvbm91cyByZXF1ZXN0IGZhaWxlZCBpbiB0aGUgdW5kZXJseWluZyBjb250YWluZXIuCitlcnJvci51bm1hcnNoYWxsaW5nLmpheGI9RXJyb3IgdW5tYXJzaGFsbGluZyBKQVhCIG9iamVjdCBvZiB0eXBlICJ7MH0iLgorZXJyb3IudW5zdXBwb3J0ZWQuZW5jb2Rpbmc9VGhlIGVuY29kaW5nIHswfSBpcyBub3Qgc3VwcG9ydGVkIGZvciBwYXJhbWV0ZXIgezF9LgorZXJyb3IudmFsaWRhdGlvbi5zdWJyZXNvdXJjZT1Nb2RlbCB2YWxpZGF0aW9uIGVycm9yKHMpIGZvdW5kIGluIHN1YiByZXNvdXJjZSByZXR1cm5lZCBieSBzdWIgcmVzb3VyY2UgbG9jYXRvci4KK2Vycm9yLndhZGwuYnVpbGRlci5nZW5lcmF0aW9uLm1ldGhvZD1FcnJvciBnZW5lcmF0aW5nIHdhZGwgZm9yIG1ldGhvZCB7MH0gb2YgcmVzb3VyY2UgezF9LgorZXJyb3Iud2FkbC5idWlsZGVyLmdlbmVyYXRpb24ucGFyYW09RXJyb3IgZ2VuZXJhdGluZyB3YWRsIGZvciBwYXJhbWV0ZXIgezB9IG9mIHJlc291cmNlIHsxfSBhbmQgcmVzb3VyY2UgbWV0aG9kIHsyfS4KK2Vycm9yLndhZGwuYnVpbGRlci5nZW5lcmF0aW9uLnJlcXVlc3QubWVkaWEudHlwZT1FcnJvciBnZW5lcmF0aW5nIHdhZGwgcmVxdWVzdCByZXByZXNlbnRhdGlvbiBmb3IgbWVkaWEgdHlwZSB7MH0gb2YgbWV0aG9kIHsxfSBvZiByZXNvdXJjZSB7Mn0uCitlcnJvci53YWRsLmJ1aWxkZXIuZ2VuZXJhdGlvbi5yZXF1ZXN0PUVycm9yIGdlbmVyYXRpbmcgd2FkbCBmb3IgcmVxdWVzdCByZXByZXNlbnRhdGlvbiBvZiByZXNvdXJjZSBtZXRob2QgezB9IG9mIHJlc291cmNlIHsxfS4KK2Vycm9yLndhZGwuYnVpbGRlci5nZW5lcmF0aW9uLnJlc291cmNlLmxvY2F0b3I9RXJyb3IgZ2VuZXJhdGluZyB3YWRsIGZvciBzdWIgcmVzb3VyY2UgbG9jYXRvciB7MH0gb2YgcmVzb3VyY2UgezF9LgorZXJyb3Iud2FkbC5idWlsZGVyLmdlbmVyYXRpb24ucmVzb3VyY2UucGF0aD1FcnJvciBnZW5lcmF0aW5nIHdhZGwgZm9yIFJlc291cmNlIHswfSB3aXRoIHBhdGggInsxfSIuCitlcnJvci53YWRsLmJ1aWxkZXIuZ2VuZXJhdGlvbi5yZXNvdXJjZT1FcnJvciBnZW5lcmF0aW5nIHdhZGwgYXBwbGljYXRpb24gZm9yIG9uZSBzcGVjaWZpYyByZXNvdXJjZSB7MH0uCitlcnJvci53YWRsLmJ1aWxkZXIuZ2VuZXJhdGlvbi5yZXNwb25zZT1FcnJvciBnZW5lcmF0aW5nIHdhZGwgcmVzcG9uc2UgcmVwcmVzZW50YXRpb24gZm9yIG1ldGhvZCB7MH0gb2YgcmVzb3VyY2UgezF9LgorZXJyb3Iud2FkbC5leHRlcm5hbC5ncmFtbWFyPUVycm9yIGF0dGFjaGluZyBhbiBleHRlcm5hbCBncmFtbWFyIHRvIHRoZSB3YWRsLgorZXJyb3Iud2FkbC5nZW5lcmF0b3IuY29uZmlnLmxvYWRlci5wcm9wZXJ0eT1UaGUgcHJvcGVydHkgezB9IGlzIGFuIGludmFsaWQgdHlwZTogezF9IChzdXBwb3J0ZWQ6IFN0cmluZywgQ2xhc3M8PyBleHRlbmRzIFdhZGxHZW5lcmF0b3JDb25maWd1cmF0aW9uPiwgV2FkbEdlbmVyYXRvckNvbmZpZ3VyYXRpb24pLgorZXJyb3Iud2FkbC5nZW5lcmF0b3IuY29uZmlnLmxvYWRlcj1Db3VsZCBub3QgbG9hZCBXYWRsR2VuZXJhdG9yQ29uZmlndXJhdGlvbiwgY2hlY2sgdGhlIGNvbmZpZ3VyYXRpb24gb2YgInswfSIuCitlcnJvci53YWRsLmdlbmVyYXRvci5jb25maWd1cmU9RXJyb3IgY29uZmlndXJpbmcgdGhlIGdpdmVuIHVzZXIgV2FkbEdlbmVyYXRvciBieSBjb25maWd1cmUoKSBtZXRob2QuCitlcnJvci53YWRsLmdlbmVyYXRvci5sb2FkPUNvdWxkIG5vdCBsb2FkIHdhZGwgZ2VuZXJhdG9ycyBmcm9tIHdhZGxHZW5lcmF0b3JEZXNjcmlwdGlvbnMuCitlcnJvci53YWRsLmdyYW1tYXIuYWxyZWFkeS5jb250YWlucz1UaGUgd2FkbCBhcHBsaWNhdGlvbiBhbHJlYWR5IGNvbnRhaW5zIGEgZ3JhbW1hcnMgZWxlbWVudCwgd2UncmUgYWRkaW5nIGVsZW1lbnRzIG9mIHRoZSBwcm92aWRlZCBncmFtbWFycyBmaWxlLgorZXJyb3Iud2FkbC5qYXhiLmNvbnRleHQ9RXJyb3IgY3JlYXRpbmcgYSBKQVhCQ29udGV4dCBmb3Igd2FkbCBwcm9jZXNzaW5nLgorZXJyb3Iud2FkbC5yZXNvdXJjZS5hcHBsaWNhdGlvbi53YWRsPUVycm9yIGdlbmVyYXRpbmcgL2FwcGxpY2F0aW9uLndhZGwuCitlcnJvci53YWRsLnJlc291cmNlLmV4dGVybmFsLmdyYW1tYXI9RXJyb3IgZ2VuZXJhdGluZyBleHRlcm5hbCB3YWRsIGdyYW1tYXIgb24gL2FwcGxpY2F0aW9uLndhZGwvW3BhdGhdLgorZXJyb3Iud2FkbC5yZXNvdXJjZS5tYXJzaGFsPUNvdWxkIG5vdCBtYXJzaGFsIHRoZSB3YWRsIEFwcGxpY2F0aW9uLgorZXJyb3Iud3JpdGluZy5yZXNwb25zZS5lbnRpdHkuY2h1bms9QW4gSS9PIGVycm9yIGhhcyBvY2N1cnJlZCB3aGlsZSB3cml0aW5nIGEgcmVzcG9uc2UgbWVzc2FnZSBlbnRpdHkgY2h1bmsgdG8gdGhlIGNvbnRhaW5lciBvdXRwdXQgc3RyZWFtLgorZXJyb3Iud3JpdGluZy5yZXNwb25zZS5lbnRpdHk9QW4gSS9PIGVycm9yIGhhcyBvY2N1cnJlZCB3aGlsZSB3cml0aW5nIGEgcmVzcG9uc2UgbWVzc2FnZSBlbnRpdHkgdG8gdGhlIGNvbnRhaW5lciBvdXRwdXQgc3RyZWFtLgorZXhjZXB0aW9uLm1hcHBlci5mYWlsZWQuZm9yLmV4Y2VwdGlvbj1BbiBleGNlcHRpb24gd2FzIG5vdCBtYXBwZWQgZHVlIHRvIGV4Y2VwdGlvbiBtYXBwZXIgZmFpbHVyZS4gVGhlIEhUVFAgNTAwIHJlc3BvbnNlIHdpbGwgYmUgcmV0dXJuZWQuCitleGNlcHRpb24ubWFwcGVyLnRocm93cy5leGNlcHRpb249QW4gZXhjZXB0aW9uIGhhcyBiZWVuIHRocm93biBmcm9tIGFuIGV4Y2VwdGlvbiBtYXBwZXIgezB9LgorZXhjZXB0aW9uLm1hcHBpbmcuc3RhcnQ9U3RhcnRpbmcgbWFwcGluZyBvZiB0aGUgZXhjZXB0aW9uLgorZXhjZXB0aW9uLm1hcHBpbmcud2FlLmVudGl0eT1XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiAoV0FFKSB3aXRoIG5vbi1udWxsIGVudGl0eSB0aHJvd24uIFJlc3BvbnNlIHdpdGggc3RhdHVzIHswfSBpcyBkaXJlY3RseSBnZW5lcmF0ZWQgZnJvbSB0aGUgV0FFLgorZXhjZXB0aW9uLm1hcHBpbmcud2FlLm5vLmVudGl0eT1XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiAoV0FFKSB3aXRoIG5vIGVudGl0eSB0aHJvd24gYW5kIG5vIEV4Y2VwdGlvbk1hcHBlcnMgaGF2ZSBiZWVuIGZvdW5kIGZvciB0aGlzIFdBRS4gUmVzcG9uc2Ugd2l0aCBzdGF0dXMgezB9IGlzIGRpcmVjdGx5IGdlbmVyYXRlZCBmcm9tIHRoZSBXQUUuCitmb3JtLnBhcmFtLmNvbnRlbnQtdHlwZS5lcnJvcj1UaGUgQEZvcm1QYXJhbSBpcyB1dGlsaXplZCB3aGVuIHRoZSBjb250ZW50IHR5cGUgb2YgdGhlIHJlcXVlc3QgZW50aXR5IGlzIG5vdCBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQKK2Zvcm0ucGFyYW0ubWV0aG9kLmVycm9yPVRoZSAiQEZvcm1QYXJhbSIgaXMgdXRpbGl6ZWQgd2hlbiB0aGUgcmVxdWVzdCBtZXRob2QgaXMgR0VUCitnZXQuY29uc3VtZXMuZW50aXR5PUEgSFRUUCBHRVQgbWV0aG9kLCB7MH0sIHNob3VsZCBub3QgY29uc3VtZSBhbnkgZW50aXR5LgorZ2V0LmNvbnN1bWVzLmZvcm0ucGFyYW09QSBIVFRQIEdFVCBtZXRob2QsIHswfSwgc2hvdWxkIG5vdCBjb25zdW1lIGFueSBmb3JtIHBhcmFtZXRlci4KK2dldC5yZXR1cm5zLnZvaWQ9QSBIVFRQIEdFVCBtZXRob2QsIHswfSwgcmV0dXJucyBhIHZvaWQgdHlwZS4gSXQgY2FuIGJlIGludGVudGlvbmFsIGFuZCBwZXJmZWN0bHkgZmluZSwgYnV0IGl0IGlzIGEgbGl0dGxlIHVuY29tbW9uIHRoYXQgR0VUIG1ldGhvZCByZXR1cm5zIGFsd2F5cyAiMjA0IE5vIENvbnRlbnQiLgorZXZlbnQuc2luay5yZXR1cm5zLnR5cGU9QSBIVFRQIEdFVCBtZXRob2QgezB9IHRoYXQgaXMgYmVpbmcgaW5qZWN0ZWQgd2l0aCBTc2VFdmVudFNpbmsgc2hvdWxkIHJldHVybiB2b2lkLiBUaGUgb3V0cHV0IHdpbGwgcHJvcGFnYXRlIGF1dG9tYXRpY2FsbHkuCittdWx0aXBsZS5ldmVudC5zaW5rLmluamVjdGlvbj1BIEhUVFAgR0VUIG1ldGhvZCB7MH0gZGVmaW5lcyB0byBTc2VFdmVudFNpbmsgcGFyYW1ldGVycyB0byBiZSBpbmplY3RlZC4gT25seSBvbmUgb2YgdGhlIGluamVjdGVkIGV2ZW50IHNpbmtzIHdpbGwgYmUgY29ubmVjdGVkIHRvIHRoZSBvdXRwdXQuCitjaHVua2VkLm91dHB1dC5jbG9zZWQ9VGhpcyBjaHVua2VkIG91dHB1dCBoYXMgYmVlbiBjbG9zZWQuCitpbGxlZ2FsLmNsaWVudC5jb25maWcuY2xhc3MucHJvcGVydHkudmFsdWU9InswfSIgcHJvcGVydHkgdmFsdWUgKHsxfSkgZG9lcyBub3QgcmVwcmVzZW50IGEgdmFsaWQgY2xpZW50IGNvbmZpZ3VyYXRpb24gY2xhc3MuIEZhbGxpbmcgYmFjayB0byAiezJ9Ii4KK2luaXQubXNnPUluaXRpYXRpbmcgSmVyc2V5IGFwcGxpY2F0aW9uLCB2ZXJzaW9uIHswfS4uLgoraW5qZWN0ZWQud2VidGFyZ2V0LnVyaS5pbnZhbGlkPSJAVXJpIiBhbm5vdGF0aW9uIHZhbHVlIGlzIG5vdCBhIHZhbGlkIFVSSSB0ZW1wbGF0ZTogInswfSIKK2ludmFsaWQuY29uZmlnLnByb3BlcnR5LnZhbHVlPUludmFsaWQgdmFsdWUgZm9yIHswfSBjb25maWd1cmF0aW9uIHByb3BlcnR5OiB7MX0KK2ludmFsaWQubWFwcGluZy5mb3JtYXQ9UHJvdmlkZWQgezB9IHByb3BlcnR5IHZhbHVlICJ7MX0iIGlzIGludmFsaWQuIEl0IHNob3VsZCBjb250YWluIHR3byBwYXJ0cywga2V5IGFuZCB2YWx1ZSwgc2VwYXJhdGVkIGJ5ICc6Jy4KK2ludmFsaWQubWFwcGluZy5rZXkuZW1wdHk9VGhlIGtleSBpbiB7MH0gbWFwcGluZ3MgcmVjb3JkICJ7MX0iIGlzIGVtcHR5LgoraW52YWxpZC5tYXBwaW5nLnR5cGU9UHJvdmlkZWQgezB9IHByb3BlcnR5IHZhbHVlIHR5cGUgaXMgaW52YWxpZC4gQWNjZXB0YWJsZSB0eXBlcyBhcmUgU3RyaW5nIGFuZCBTdHJpbmdbXS4KK2ludmFsaWQubWFwcGluZy52YWx1ZS5lbXB0eT1UaGUgdmFsdWUgaW4gezB9IG1hcHBpbmdzIHJlY29yZCAiezF9IiBpcyBlbXB0eS4KK2phci5zY2FubmVyLnVuYWJsZS50by5jbG9zZS5maWxlPVVuYWJsZSB0byBjbG9zZSBKYXIgZmlsZS4KK2phci5zY2FubmVyLnVuYWJsZS50by5yZWFkLmVudHJ5PVVuYWJsZSB0byByZWFkIHRoZSBuZXh0IEphciBlbnRyeS4KK2xvZ2dpbmcuYXBwbGljYXRpb24uaW5pdGlhbGl6ZWQ9SmVyc2V5IGFwcGxpY2F0aW9uIGluaXRpYWxpemVkLgorbG9nZ2luZy5yb290LnJlc291cmNlLmNsYXNzZXM9Um9vdCBSZXNvdXJjZSBDbGFzc2VzCitsb2dnaW5nLnByZS5tYXRjaC5maWx0ZXJzPVByZS1tYXRjaCBGaWx0ZXJzCitsb2dnaW5nLmdsb2JhbC5yZXF1ZXN0LmZpbHRlcnM9R2xvYmFsIFJlcXVlc3QgRmlsdGVycworbG9nZ2luZy5nbG9iYWwucmVzcG9uc2UuZmlsdGVycz1HbG9iYWwgUmVzcG9uc2UgRmlsdGVycworbG9nZ2luZy5nbG9iYWwucmVhZGVyLmludGVyY2VwdG9ycz1HbG9iYWwgUmVhZGVyIEludGVyY2VwdG9ycworbG9nZ2luZy5nbG9iYWwud3JpdGVyLmludGVyY2VwdG9ycz1HbG9iYWwgV3JpdGVyIEludGVyY2VwdG9ycworbG9nZ2luZy5uYW1lLmJvdW5kLnJlcXVlc3QuZmlsdGVycz1OYW1lLWJvdW5kIFJlcXVlc3QgRmlsdGVycworbG9nZ2luZy5uYW1lLmJvdW5kLnJlc3BvbnNlLmZpbHRlcnM9TmFtZS1ib3VuZCBSZXNwb25zZSBGaWx0ZXJzCitsb2dnaW5nLm5hbWUuYm91bmQucmVhZGVyLmludGVyY2VwdG9ycz1OYW1lLWJvdW5kIFJlYWRlciBJbnRlcmNlcHRvcnMKK2xvZ2dpbmcubmFtZS5ib3VuZC53cml0ZXIuaW50ZXJjZXB0b3JzPU5hbWUtYm91bmQgV3JpdGVyIEludGVyY2VwdG9ycworbG9nZ2luZy5keW5hbWljLmZlYXR1cmVzPUR5bmFtaWMgRmVhdHVyZXMKK2xvZ2dpbmcubWVzc2FnZS5ib2R5LnJlYWRlcnM9TWVzc2FnZSBCb2R5IFJlYWRlcnMKK2xvZ2dpbmcubWVzc2FnZS5ib2R5LndyaXRlcnM9TWVzc2FnZSBCb2R5IFdyaXRlcnMKK2xvZ2dpbmcucHJvdmlkZXIuYm91bmQ9ezB9IGJvdW5kIHRvIHsxfQorbWV0aG9kLmVtcHR5LnBhdGguYW5ub3RhdGlvbj1UaGUgKHN1YilyZXNvdXJjZSBtZXRob2QgezB9IGluIHsxfSBjb250YWlucyBlbXB0eSBwYXRoIGFubm90YXRpb24uCittZXRob2QuaW52b2NhYmxlLmZyb20ucHJlbWF0Y2guZmlsdGVycy5vbmx5PU1ldGhvZCBjYW4gb25seSBiZSBpbnZva2VkIGZyb20gcHJlLW1hdGNoaW5nIHJlcXVlc3QgZmlsdGVycy4KK21ldGhvZC5wYXJhbWV0ZXIuY2Fubm90LmJlLm51bGwub3IuZW1wdHk9TWV0aG9kIHBhcmFtZXRlciAiezB9IiBjYW5ub3QgYmUgbnVsbCBvciBlbXB0eS4KK21ldGhvZC5wYXJhbWV0ZXIuY2Fubm90LmJlLm51bGw9TWV0aG9kIHBhcmFtZXRlciAiezB9IiBjYW5ub3QgYmUgbnVsbC4KK21ldGhvZC51bmV4cGVjdGVkLmFubm90YXRpb249KFN1YilyZXNvdXJjZSBtZXRob2QgezB9IGluIHsxfSBjb250YWlucyB1bmV4cGVjdGVkIGFubm90YXRpb24gezJ9LgorbXVsdGlwbGUuaHR0cC5tZXRob2QuZGVzaWduYXRvcnM9QSAoc3ViLSlyZXNvdXJjZSBtZXRob2QsIHswfSwgc2hvdWxkIGhhdmUgb25seSBvbmUgSFRUUCBtZXRob2QgZGVzaWduYXRvci4gSXQgY3VycmVudGx5IGhhcyB0aGUgZm9sbG93aW5nIGRlc2lnbmF0b3JzIGRlZmluZWQ6IHsxfQorbmV3LmFyLmNyZWF0ZWQuYnkuaW50cm9zcGVjdGlvbi5tb2RlbGVyPUEgbmV3IGFic3RyYWN0IHJlc291cmNlIGNyZWF0ZWQgYnkgSW50cm9zcGVjdGlvbk1vZGVsZXI6IHswfQorbm9uLmluc3RhbnRpYWJsZS5jb21wb25lbnQ9Q29tcG9uZW50IG9mIGNsYXNzIHswfSBjYW5ub3QgYmUgaW5zdGFudGlhdGVkIGFuZCB3aWxsIGJlIGlnbm9yZWQuCitub24ucHViLnJlcy5tZXRob2Q9QSByZXNvdXJjZSBtZXRob2QsIHswfSwgTVVTVCBiZSBwdWJsaWMgc2NvcGVkIG90aGVyd2lzZSB0aGUgbWV0aG9kIGlzIGlnbm9yZWQKK25vbi5wdWIuc3ViLnJlcy5sb2M9QSBzdWItcmVzb3VyY2UgbW9kZWwsIHswfSwgTVVTVCBiZSBwdWJsaWMgc2NvcGVkIG90aGVyd2lzZSB0aGUgbWV0aG9kIGlzIGlnbm9yZWQKK25vbi5wdWIuc3ViLnJlcy5tZXRob2Q9QSBzdWItcmVzb3VyY2UgbWV0aG9kLCB7MH0sIE1VU1QgYmUgcHVibGljIHNjb3BlZCBvdGhlcndpc2UgdGhlIG1ldGhvZCBpcyBpZ25vcmVkCitwYXJhbS5udWxsPSJ7MH0iIHBhcmFtZXRlciBpcyBudWxsLgorIyB7MH0gPSBwYXJhbWV0ZXIgbmFtZTsgezF9ID0gcGFyYW1ldGVyIHR5cGU7IHsyfSA9IGZpZWxkIGRlc2NyaXB0aW9uCitwYXJhbWV0ZXIudW5yZXNvbHZhYmxlPVBhcmFtZXRlciB7MH0gb2YgdHlwZSB7MX0gZnJvbSB7Mn0gaXMgbm90IHJlc29sdmFibGUgdG8gYSBjb25jcmV0ZSB0eXBlLgorcHJlbWF0Y2hpbmcuYWxzby5uYW1lLmJvdW5kPUBQcmVNYXRjaGluZyBwcm92aWRlciwgezB9LCBhbHNvIGFubm90YXRlZCB3aXRoIGEgbmFtZSBiaW5kaW5nIGFubm90YXRpb24uIE5hbWUgYmluZGluZyB3aWxsIGJlIGlnbm9yZWQuCisjIHswfSA9IGV4Y2VwdGlvbiBjbGFzcyBuYW1lOyB7MX0gPSBleGNlcHRpb24gbWVzc2FnZQorcHJvcGVydHkudmFsdWUudG9zdHJpbmcudGhyb3dzLmV4Y2VwdGlvbj1bezB9IHRocm93biBmcm9tIHByb3BlcnR5IHZhbHVlIHRvU3RyaW5nKCk6IHsxfV0KK3JjLm5vdC5tb2RpZmlhYmxlPVRoZSByZXNvdXJjZSBjb25maWd1cmF0aW9uIGlzIG5vdCBtb2RpZmlhYmxlIGluIHRoaXMgY29udGV4dC4KK3JlbGVhc2luZy5yZXF1ZXN0LnByb2Nlc3NpbmcucmVzb3VyY2VzLmZhaWxlZD1BdHRlbXB0IHRvIHJlbGVhc2UgcmVxdWVzdCBwcm9jZXNzaW5nIHJlc291cmNlcyBoYXMgZmFpbGVkIGZvciBhIHJlcXVlc3QuCityZXNvdXJjZS5hZGQuY2hpbGQuYWxyZWFkeS5jaGlsZD1UaGUgcmVzb3VyY2UgaXMgYWxyZWFkeSBhIGNoaWxkIHJlc291cmNlIGFuZCBjYW5ub3QgY29udGFpbiBhbm90aGVyIGNoaWxkIHJlc291cmNlLgorcmVzb3VyY2UuYW1iaWd1b3VzPUEgcmVzb3VyY2UsIHswfSwgaGFzIGFtYmlndW91cyBwYXRoIGRlZmluaXRpb24gd2l0aCByZXNvdXJjZSB7MX0uIEJvdGggcmVzb3VyY2VzIG1hdGNoIHRvIHRoZSBzYW1lIHBhdGggcGF0dGVybiB7Mn0uCityZXNvdXJjZS5jb25maWcuZXJyb3IubnVsbC5hcHBsaWNhdGlvbmNsYXNzPUJvdGggYXBwbGljYXRpb24gYW5kIGFwcGxpY2F0aW9uQ2xhc3MgY2FuJ3QgYmUgbnVsbC4KK3Jlc291cmNlLmNvbmZpZy51bmFibGUudG8ucHJvY2Vzcz1VbmFibGUgdG8gcHJvY2VzcyB7MH0KK3Jlc291cmNlLmNvbnRhaW5zLnJlcy5tZXRob2RzLmFuZC5sb2NhdG9yPVRoZSByZXNvdXJjZSAob3Igc3ViIHJlc291cmNlKSB7MH0gd2l0aCBwYXRoICJ7MX0iIGNvbnRhaW5zIChzdWIpIHJlc291cmNlIG1ldGhvZChzKSBhbmQgc3ViIHJlc291cmNlIGxvY2F0b3IuIFRoZSByZXNvdXJjZSBjYW5ub3QgaGF2ZSBib3RoLCBtZXRob2RzIGFuZCBsb2NhdG9yLCBkZWZpbmVkIG9uIHNhbWUgcGF0aC4gVGhlIGxvY2F0b3Igd2lsbCBiZSBpZ25vcmVkLgorcmVzb3VyY2UuZW1wdHk9QSByZXNvdXJjZSwgezB9LCB3aXRoIHBhdGggInsxfSIgaXMgZW1wdHkuIEl0IGhhcyBubyByZXNvdXJjZSAob3Igc3ViIHJlc291cmNlKSBtZXRob2RzIG5laXRoZXIgc3ViIHJlc291cmNlIGxvY2F0b3JzIGRlZmluZWQuCityZXNvdXJjZS5pbXBsZW1lbnRzLnByb3ZpZGVyPUEgcmVzb3VyY2UsIHswfSwgaW1wbGVtZW50cyBwcm92aWRlciBpbnRlcmZhY2UgezF9IGJ1dCBkb2VzIG5vdCBleHBsaWNpdGx5IGRlZmluZSB0aGUgc2NvcGUgKEBTaW5nbGV0b24sIEBQZXJMb29rdXApLiBUaGUgcmVzb3VyY2UgY2xhc3Mgd2lsbCBiZSBtYW5hZ2VkIGFzIHNpbmdsZXRvbi4KK3Jlc291cmNlLmxvb2t1cC5mYWlsZWQ9TG9va3VwIGFuZCBpbml0aWFsaXphdGlvbiBmYWlsZWQgZm9yIGEgcmVzb3VyY2UgY2xhc3M6IHswfS4KK3Jlc291cmNlLm1lcmdlLmNvbmZsaWN0LmxvY2F0b3JzPUJvdGggcmVzb3VyY2VzLCByZXNvdXJjZSB7MH0gYW5kIHJlc291cmNlIHsxfSwgY29udGFpbnMgc3ViIHJlc291cmNlIGxvY2F0b3JzIG9uIHRoZSBzYW1lIHBhdGggezJ9LgorcmVzb3VyY2UubW9kZWwudmFsaWRhdGlvbi5mYWlsZWQuYXQuaW5pdD1WYWxpZGF0aW9uIG9mIHRoZSBhcHBsaWNhdGlvbiByZXNvdXJjZSBtb2RlbCBoYXMgZmFpbGVkIGR1cmluZyBhcHBsaWNhdGlvbiBpbml0aWFsaXphdGlvbi4KK3Jlc291cmNlLm11bHRpcGxlLnNjb3BlLmFubm90YXRpb25zPUEgcmVzb3VyY2UsIHswfSwgaXMgYW5ub3RhdGVkIHdpdGggbXVsdGlwbGUgc2NvcGUgYW5ub3RhdGlvbnMuIE9ubHkgb25lIHNjb3BlIGFubm90YXRpb24gaXMgYWxsb3dlZCBmb3IgdGhlIHJlc291cmNlLgorcmVzb3VyY2UucmVwbGFjZWQuY2hpbGQuZG9lcy5ub3QuZXhpc3Q9UmVwbGFjZWQgY2hpbGQgcmVzb3VyY2UgZG9lcyBub3QgZXhpc3QgaW4gbW9kZWw6IHswfS4KK3Jlc291cmNlLnVwZGF0ZWQubWV0aG9kLmRvZXMubm90LmV4aXN0PVVwZGF0ZWQgcmVzb3VyY2UgbWV0aG9kIGRvZXMgbm90IGV4aXN0IGluIHRoZSBtb2RlbDogezB9Lgorc2VjdXJpdHkuY29udGV4dC53YXMubm90LnNldD1TZWN1cml0eUNvbnRleHQgd2FzIG5vdCBzZXQuCitzaW5nbGV0b24uaW5qZWN0cy5wYXJhbWV0ZXI9UGFyYW1ldGVyIHsxfSBvZiB7MH0gY2Fubm90IGJlIGluamVjdGVkIGludG8gc2luZ2xldG9uIHJlc291cmNlLgorc3ViLnJlcy5tZXRob2QudHJlYXRlZC5hcy5yZXMubWV0aG9kPUEgc3ViLXJlc291cmNlIG1ldGhvZCwgezB9LCB3aXRoIFVSSSB0ZW1wbGF0ZSwgInsxfSIsIGlzIHRyZWF0ZWQgYXMgYSByZXNvdXJjZSBtZXRob2QKK3N1YnJlcy5sb2MuY2FjaGUuaW52YWxpZC5zaXplPUludmFsaWQgdmFsdWUgZm9yIHN1Yi1yZXNvdXJjZSBsb2NhdG9yIGNhY2hlIHNpemU6IHswfS4gVXNpbmcgZGVmYXVsdCB2YWx1ZTogezF9Lgorc3VicmVzLmxvYy5jYWNoZS5sb2FkLmZhaWxlZD1Mb2FkaW5nIG1vZGVsIGFuZCByb3V0ZXIgZnJvbSBzdWItcmVzb3VyY2UgbG9jYXRvciBjYWNoZSBmYWlsZWQgZm9yICJ7MH0iLgorc3VicmVzLmxvYy5oYXMuZW50aXR5LnBhcmFtPUEgc3ViLXJlc291cmNlIG1vZGVsLCB7MH0sIGNhbiBub3QgaGF2ZSBhbiBlbnRpdHkgcGFyYW1ldGVyLiBUcnkgdG8gbW92ZSB0aGUgcGFyYW1ldGVyIHRvIHRoZSBjb3JyZXNwb25kaW5nIHJlc291cmNlIG1ldGhvZC4KK3N1YnJlcy5sb2MucmV0dXJucy52b2lkPUEgc3ViLXJlc291cmNlIG1vZGVsLCB7MH0sIE1VU1QgcmV0dXJuIGEgbm9uLXZvaWQgdHlwZS4KK3N1YnJlcy5sb2MudXJpLnBhdGguaW52YWxpZD1BIHN1Yi1yZXNvdXJjZSBtb2RlbCwgezB9LCBoYXMgYW4gaW52YWxpZCBVUkkgcGF0aDogezF9CitzdXNwZW5kLmhhbmRsZXIuZXhlY3V0aW9uLmZhaWxlZD1UaW1lLW91dCBoYW5kbGVyIGV4ZWN1dGlvbiBmYWlsZWQuCitzdXNwZW5kLm5vdC5zdXNwZW5kZWQ9Tm90IHN1c3BlbmRlZC4KK3N1c3BlbmQuc2NoZWR1bGluZy5lcnJvcj1FcnJvciB3aGlsZSBzY2hlZHVsaW5nIGEgdGltZW91dCB0YXNrLgordHlwZS5vZi5tZXRob2Qubm90LnJlc29sdmFibGUudG8uY29uY3JldGUudHlwZT1SZXR1cm4gdHlwZSwgezB9LCBvZiBtZXRob2QsIHsxfSwgaXMgbm90IHJlc29sdmFibGUgdG8gYSBjb25jcmV0ZSB0eXBlLgordW5hYmxlLnRvLmxvYWQuY2xhc3M9Q2xhc3MgInswfSIgY2Fubm90IGJlIGxvYWRlZC4KK3Vuc3VwcG9ydGVkLnVyaS5pbmplY3Rpb24udHlwZT0iQFVyaSItYmFzZWQgaW5qZWN0aW9uIG9mICJ7MH0iIHR5cGUgaXMgbm90IHN1cHBvcnRlZC4KK3VzZXIubm90LmF1dGhvcml6ZWQ9VXNlciBub3QgYXV0aG9yaXplZC4KK3dhZGwuZG9jLmV4dGVuZGVkLndhZGw9VGhpcyBpcyBmdWxsIFdBREwgaW5jbHVkaW5nIGV4dGVuZGVkIHJlc291cmNlcy4gVG8gZ2V0IHNpbXBsaWZpZWQgV0FETCB3aXRoIHVzZXJzIHJlc291cmNlcyBvbmx5IGRvIG5vdCB1c2UgdGhlIHF1ZXJ5IHBhcmFtZXRlciB7MH0uIExpbms6IHsxfQord2FkbC5kb2Muc2ltcGxlLndhZGw9VGhpcyBpcyBzaW1wbGlmaWVkIFdBREwgd2l0aCB1c2VyIGFuZCBjb3JlIHJlc291cmNlcyBvbmx5LiBUbyBnZXQgZnVsbCBXQURMIHdpdGggZXh0ZW5kZWQgcmVzb3VyY2VzIHVzZSB0aGUgcXVlcnkgcGFyYW1ldGVyIHswfS4gTGluazogezF9Cit3YWRsLmpheGIuY29udGV4dC5mYWxsYmFjaz1FcnJvciBjcmVhdGluZyBhIEpBWEJDb250ZXh0IGZvciB3YWRsIHNlcmlhbGl6YXRpb24uIFRyeWluZyBhIGZhbGxiYWNrIHNvbHV0aW9uIGZvciBvc2dpIGVudmlyb25tZW50cy4KK3dhZGwucmVzb3VyY2Vkb2MuYW1iaWd1b3VzLm1ldGhvZC5lbnRyaWVzPUFtYmlndW91cyByZXNvdXJjZSBkb2N1bWVudGF0aW9uIGRldGVjdGVkOiBcCisgIFVuaXF1ZSByZXNvdXJjZSBtZXRob2QgZG9jdW1lbnRhdGlvbiBjYW5ub3QgYmUgZm91bmQgZm9yIG1ldGhvZCAlezB9LiV7MX0lezJ9LiBcCisgIFNlbGVjdGluZyB0aGUgZmlyc3QgYXZhaWxhYmxlIG1ldGhvZCBkb2N1bWVudGF0aW9uIGVsZW1lbnQgZnJvbSB0aGUgbGlzdCBvZiB7M30gcG9zc2libGUgY2FuZGlkYXRlcy4iCit3YXJuaW5nLm1vbml0b3JpbmcubWJlYW5zLmJlYW4uYWxyZWFkeS5yZWdpc3RlcmVkPU1vbml0b3JpbmcgTUJlYW5zICJ7MH0iIGlzIGFscmVhZHkgcmVnaXN0ZXJlZC4gVW4tcmVnaXN0ZXJpbmcgdGhlIGN1cnJlbnQgbWJlYW4gYW5kIHJlZ2lzdGVyaW5nIGEgbmV3IG9uZSBpbnN0ZWFkLgord2FybmluZy5tb25pdG9yaW5nLmZlYXR1cmUuZGlzYWJsZWQ9TW9uaXRvcmluZ0ZlYXR1cmUgaXMgcmVnaXN0ZXJlZCBidXQgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgInswfSIgKGVuYWJsaW5nIGJhc2ljIG1vbml0b3Jpbmcgc3RhdGlzdGljcykgaXMgRkFMU0UuIEhvd2V2ZXIsIHRoZSBmZWF0dXJlIGlzIGNvbmZpZ3VyZWQgdG8gZW5hYmxlIGV4cG9zdXJlIG9mIG1vbml0b3JpbmcgTUJlYW5zIChlaXRoZXIgYnkgcHJvcGVydHkgb3IgYnkgZGlyZWN0IGluc3RhbmNlIHNldHVwKSwgc28gdGhlIG1vbml0b3Jpbmcgc3RhdGlzdGljcyB3aWxsIGJlIGVuYWJsZWQgYXMgdGhpcyBpcyBwcmVyZXF1aXNpdGUgZm9yIE1vbml0b3JpbmcgTUJlYW5zLiBUaGUgY29uZmlndXJhdGlvbiBpcyBpbmNvbnNpc3RlbnQgYW5kIG1heSBwcm9kdWNlIHVud2FudGVkIGJlaGF2aW91ci4gVW5yZWdpc3RlciB0aGUgZmVhdHVyZSBvciBjaGFuZ2UgdGhlIHByb3BlcnR5IHZhbHVlLgord2FybmluZy5tb25pdG9yaW5nLmZlYXR1cmUuZW5hYmxlZD1Nb25pdG9yaW5nRmVhdHVyZSBpcyByZWdpc3RlcmVkIGJ1dCB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSAiezB9IiAoZW5hYmxpbmcgYmFzaWMgbW9uaXRvcmluZyBzdGF0aXN0aWNzKSBpcyBGQUxTRS4gTW9uaXRvcmluZyBzdGF0aXN0aWNzIHdpbGwgYmUgZGlzYWJsZWQuIFRoZSBjb25maWd1cmF0aW9uIGlzIGluY29uc2lzdGVudCBhbmQgbWF5IHByb2R1Y2UgdW53YW50ZWQgYmVoYXZpb3VyLiBEaXNhYmxlIE1CZWFucyBleHBvc3VyZSBvciBlbmFibGUgbW9uaXRvcmluZyBzdGF0aXN0aWNzLgord2FybmluZy5tc2c9V0FSTklORzogezB9Cit3YXJuaW5nLnRvby5tYW55LmV4dGVybmFsLnJlcS5zY29wZXM9TW9yZSB0aGFuIG9uZSBleHRlcm5hbCByZXF1ZXN0IHNjb3BlIGZvdW5kLiBOb25lIG9mIHRoZW0gd2lsbCBiZSB1c2VkLiBKZXJzZXkgcnVudGltZSBjYW4gb25seSBhY2NvbW1vZGF0ZSBhIHNpbmdsZSBleHRlcm5hbCByZXF1ZXN0IHNjb3BlOiB7MH0KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL0Fubm90YXRlZEVudGl0eVRlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL0Fubm90YXRlZEVudGl0eVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTNlM2E0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvQW5ub3RhdGVkRW50aXR5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlcjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLk1vZGVsVmFsaWRhdGlvbkV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICogVGVzdHMgZW50aXR5IHBhcmFtZXRlciBhbm5vdGF0ZWQgd2l0aCBub24gaW5qZWN0aW9uIGFubm90YXRpb25zLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBBbm5vdGF0ZWRFbnRpdHlUZXN0IHsKKworICAgIHByaXZhdGUgQXBwbGljYXRpb25IYW5kbGVyIGNyZWF0ZUFwcGxpY2F0aW9uKENsYXNzPD8+Li4uIHJjKSB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKHJjKTsKKyAgICAgICAgcmV0dXJuIG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIocmVzb3VyY2VDb25maWcpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVudGl0eUFubm90YXRlZCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgQXBwbGljYXRpb25IYW5kbGVyIGFwcCA9IGNyZWF0ZUFwcGxpY2F0aW9uKFJlc291cmNlLmNsYXNzKTsKKworICAgICAgICBDb250YWluZXJSZXNwb25zZSByZXMgPSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9yZXNvdXJjZS9wYXRoUGFyYW0/cXVlcnk9cXVlcnlQYXJhbSIsCisgICAgICAgICAgICAgICAgIlBPU1QiKS5lbnRpdHkoImVudGl0eSIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXMuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImVudGl0eSIsIHJlcy5nZXRFbnRpdHkoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWxsQW5ub3RhdGVkKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwID0gY3JlYXRlQXBwbGljYXRpb24oUmVzb3VyY2UuY2xhc3MpOworCisgICAgICAgIENvbnRhaW5lclJlc3BvbnNlIHJlcyA9IGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3Jlc291cmNlL3BhdGhQYXJhbS9hbGxBbm5vdGF0ZWQ/cXVlcnk9cXVlcnlQYXJhbSIsCisgICAgICAgICAgICAgICAgIlBPU1QiKS5lbnRpdHkoImVudGl0eSIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXMuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImVudGl0eSIsIHJlcy5nZXRFbnRpdHkoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGV4dEFubm90YXRlZCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgQXBwbGljYXRpb25IYW5kbGVyIGFwcCA9IGNyZWF0ZUFwcGxpY2F0aW9uKFJlc291cmNlLmNsYXNzKTsKKworICAgICAgICBDb250YWluZXJSZXNwb25zZSByZXMgPSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9yZXNvdXJjZS9wYXRoUGFyYW0vY29udGV4dD9xdWVyeT1xdWVyeVBhcmFtIiwKKyAgICAgICAgICAgICAgICAiUE9TVCIpLmVudGl0eSgiZW50aXR5IikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlcy5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZW50aXR5IiwgcmVzLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBbWJpZ3VvdXNFbnRpdHlQYXJhbWV0ZXIoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwID0gY3JlYXRlQXBwbGljYXRpb24oV3JvbmdSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgICAgICBmYWlsKCJNb2RlbCB2YWxpZGF0aW9uIHNob3VsZCBmYWlsLiIpOworICAgICAgICB9IGNhdGNoIChNb2RlbFZhbGlkYXRpb25FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIG9rIC0gc2hvdWxkIGJlIHRocm93bgorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiTW9kZWxWYWxpZGF0aW9uRXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24uIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorICAgIHB1YmxpYyBzdGF0aWMgQGludGVyZmFjZSBUZXN0QW5ub3RhdGlvbiB7CisgICAgfQorCisgICAgQFBhdGgoInJlc291cmNlL3twYXRofSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0RW50aXR5QW5ub3RhdGVkKEBQYXRoUGFyYW0oInBhdGgiKSBTdHJpbmcgcGF0aFBhcmFtLCBAVGVzdEFubm90YXRpb24gU3RyaW5nIGVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBRdWVyeVBhcmFtKCJxdWVyeSIpIFN0cmluZyBxdWVyeVBhcmFtKSB7CisKKyAgICAgICAgICAgIHRlc3RQYXJhbWV0ZXJzKHBhdGhQYXJhbSwgZW50aXR5LCBxdWVyeVBhcmFtKTsKKyAgICAgICAgICAgIHJldHVybiBlbnRpdHk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgdGVzdFBhcmFtZXRlcnMoU3RyaW5nIHBhdGhQYXJhbSwgU3RyaW5nIGVudGl0eSwgU3RyaW5nIHF1ZXJ5UGFyYW0pIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygicGF0aFBhcmFtIiwgcGF0aFBhcmFtKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygicXVlcnlQYXJhbSIsIHF1ZXJ5UGFyYW0pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJlbnRpdHkiLCBlbnRpdHkpOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoImFsbEFubm90YXRlZCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdEFsbEFubm90YXRlZChAVGVzdEFubm90YXRpb24gQFBhdGhQYXJhbSgicGF0aCIpIFN0cmluZyBwYXRoUGFyYW0sIEBUZXN0QW5ub3RhdGlvbiBTdHJpbmcgZW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQFRlc3RBbm5vdGF0aW9uIEBRdWVyeVBhcmFtKCJxdWVyeSIpIFN0cmluZyBxdWVyeVBhcmFtKSB7CisKKyAgICAgICAgICAgIHRlc3RQYXJhbWV0ZXJzKHBhdGhQYXJhbSwgZW50aXR5LCBxdWVyeVBhcmFtKTsKKyAgICAgICAgICAgIHJldHVybiBlbnRpdHk7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgiY29udGV4dCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdENvbnRleHRBbm5vdGF0aW9uKEBQYXRoUGFyYW0oInBhdGgiKSBTdHJpbmcgcGF0aFBhcmFtLCBAQ29udGV4dCBIdHRwSGVhZGVycyBoZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAVGVzdEFubm90YXRpb24gU3RyaW5nIGVudGl0eSwgQFF1ZXJ5UGFyYW0oInF1ZXJ5IikgU3RyaW5nIHF1ZXJ5UGFyYW0pIHsKKyAgICAgICAgICAgIHRlc3RQYXJhbWV0ZXJzKHBhdGhQYXJhbSwgZW50aXR5LCBxdWVyeVBhcmFtKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoaGVhZGVycyk7CisgICAgICAgICAgICByZXR1cm4gZW50aXR5OworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIndyb25nUmVzb3VyY2Uve3BhdGh9IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFdyb25nUmVzb3VyY2UgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdEVudGl0eUFubm90YXRlZChAUGF0aFBhcmFtKCJwYXRoIikgU3RyaW5nIHBhdGhQYXJhbSwgQFRlc3RBbm5vdGF0aW9uIFN0cmluZyBhbWJpZ3VvdXNFbnRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYW1iaWd1b3VzUGFyYW1ldGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQFF1ZXJ5UGFyYW0oInF1ZXJ5IikgU3RyaW5nIHF1ZXJ5UGFyYW0pIHsKKworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIG5vdCBiZSBjYWxsZWQgKGFtYmlndW91cyBlbnRpdHkgcGFyYW1ldGVyKS4iKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9BcHBsaWNhdGlvbkhhbmRsZXJUZXN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9BcHBsaWNhdGlvbkhhbmRsZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EyOTdkMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL0FwcGxpY2F0aW9uSGFuZGxlclRlc3QuamF2YQpAQCAtMCwwICsxLDU2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLkludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVxdWVzdDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUmVhZGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJlYWRlckludGVyY2VwdG9yQ29udGV4dDsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuTWVzc2FnZUJvZHlQcm92aWRlck5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuSW5mbGVjdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5wcm9jZXNzLk1hcHBhYmxlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5Nb2RlbFZhbGlkYXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5SZXNwb25zZUVycm9yTWFwcGVyOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiBUZXN0IGJhc2ljIGFwcGxpY2F0aW9uIGJlaGF2aW9yLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbkhhbmRsZXJUZXN0IHsKKworICAgIHByaXZhdGUgQXBwbGljYXRpb25IYW5kbGVyIGNyZWF0ZUFwcGxpY2F0aW9uKENsYXNzPD8+Li4uIGNsYXNzZXMpIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoY2xhc3Nlcyk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIocmVzb3VyY2VDb25maWcpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRGb28oQENvbnRleHQgSHR0cEhlYWRlcnMgaGVhZGVycykgeworCisgICAgICAgICAgICByZXR1cm4gSW50ZWdlci50b1N0cmluZyhoZWFkZXJzLmdldExlbmd0aCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJtZXJnZWQiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWVyZ2VkQSB7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTUE9OU0UgPSAiR290IGluIEEiOworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSRVNQT05TRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJtZXJnZWQiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWVyZ2VkQTEgeworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1BPTlNFID0gIkdvdCBpbiBBIjsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gUkVTUE9OU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgibWVyZ2VkIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1lcmdlZEIgeworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1BPTlNFID0gIlBvc3RlZCBpbiBCIjsKKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvUG9zdCgpIHsKKworICAgICAgICAgICAgcmV0dXJuIFJFU1BPTlNFOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmV0dXJuQmFkUmVxdWVzdE9uSWxsSGVhZGVyVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQXBwbGljYXRpb25IYW5kbGVyIGFwcCA9IGNyZWF0ZUFwcGxpY2F0aW9uKFJlc291cmNlLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLAorICAgICAgICAgICAgICAgIGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJHRVQiKS5oZWFkZXIoSHR0cEhlYWRlcnMuQ09OVEVOVF9MRU5HVEgsICJ0ZXh0IikuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoKS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWVyZ2VkUmVzb3VyY2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEFwcGxpY2F0aW9uSGFuZGxlciBhcHAgPSBjcmVhdGVBcHBsaWNhdGlvbihNZXJnZWRBLmNsYXNzLCBNZXJnZWRCLmNsYXNzKTsKKworICAgICAgICBDb250YWluZXJSZXNwb25zZSByZXNwb25zZTsKKworICAgICAgICByZXNwb25zZSA9IGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL21lcmdlZCIsICJHRVQiKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWVyZ2VkQS5SRVNQT05TRSwgcmVzcG9uc2UuZ2V0RW50aXR5KCkpOworCisgICAgICAgIHJlc3BvbnNlID0gYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvbWVyZ2VkIiwgIlBPU1QiKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWVyZ2VkQi5SRVNQT05TRSwgcmVzcG9uc2UuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgdGVzdCBlbnN1cmVzIHRoYXQgcmVzb3VyY2UgdmFsaWRhdGlvbiBraWNrcyBpbiBBRlRFUiByZXNvdXJjZXMgYXJlIG1lcmdlZC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNZXJnZWRSZXNvdXJjZXNWYWxpZGF0aW9uRmFpbHVyZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgY3JlYXRlQXBwbGljYXRpb24oTWVyZ2VkQS5jbGFzcywgTWVyZ2VkQTEuY2xhc3MpOworICAgICAgICB9IGNhdGNoIChNb2RlbFZhbGlkYXRpb25FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIHN1Y2Nlc3MKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZhaWwoIk1vZGVsIHZhbGlkYXRpb24gZXhjZXB0aW9uIHdhcyBleHBlY3RlZCBidXQgbm90IHRocm93bi4iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEN1c3RvbVJlc3BvbnNlRmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoZmluYWwgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQpIHRocm93cworICAgICAgICAgICAgICAgIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJlc3BvbnNlQ29udGV4dC5zZXRFbnRpdHkoCisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlQ29udGV4dC5nZXRFbnRpdHkoKSArICItZmlsdGVyZWQiLAorICAgICAgICAgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuZ2V0RW50aXR5QW5ub3RhdGlvbnMoKSwKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LmdldE1lZGlhVHlwZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQ3VzdG9tRmVhdHVyZSBpbXBsZW1lbnRzIEZlYXR1cmUgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmUoZmluYWwgRmVhdHVyZUNvbnRleHQgY29uZmlndXJhdGlvbikgeworICAgICAgICAgICAgY29uZmlndXJhdGlvbi5yZWdpc3RlcihDdXN0b21SZXNwb25zZUZpbHRlci5jbGFzcyk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJwcm9wZXJ0eSIpCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQcm92aWRlclByb3BlcnR5UmVzb3VyY2UgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWc7CisgICAgICAgIHByaXZhdGUgZmluYWwgUmVzb3VyY2VDb25maWcgYXBwbGljYXRpb247CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBwdWJsaWMgUHJvdmlkZXJQcm9wZXJ0eVJlc291cmNlKGZpbmFsIEFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uLCBmaW5hbCBDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7CisgICAgICAgICAgICB0aGlzLmFwcGxpY2F0aW9uID0gKFJlc291cmNlQ29uZmlnKSBhcHBsaWNhdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYXBwbGljYXRpb24uZ2V0UmVnaXN0ZXJlZENsYXNzZXMoKS5zaXplKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhcHBsaWNhdGlvbi5pc1JlZ2lzdGVyZWQoUHJvdmlkZXJQcm9wZXJ0eVJlc291cmNlLmNsYXNzKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgYXBwbGljYXRpb24uZ2V0Q2xhc3NlcygpLnNpemUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgYXBwbGljYXRpb24uZ2V0SW5zdGFuY2VzKCkuc2l6ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBhcHBsaWNhdGlvbi5nZXRTaW5nbGV0b25zKCkuc2l6ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGFwcGxpY2F0aW9uLmlzRW5hYmxlZChDdXN0b21GZWF0dXJlLmNsYXNzKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShhcHBsaWNhdGlvbi5pc1JlZ2lzdGVyZWQoQ3VzdG9tUmVzcG9uc2VGaWx0ZXIuY2xhc3MpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoYXBwbGljYXRpb24uZ2V0UHJvcGVydHlOYW1lcygpLmNvbnRhaW5zKFNlcnZlclByb3BlcnRpZXMuUFJPVklERVJfQ0xBU1NOQU1FUykpOworCisgICAgICAgICAgICBhc3NlcnRUcnVlKGNvbmZpZy5pc0VuYWJsZWQoQ3VzdG9tRmVhdHVyZS5jbGFzcykpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWcuaXNSZWdpc3RlcmVkKFByb3ZpZGVyUHJvcGVydHlSZXNvdXJjZS5jbGFzcykpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWcuaXNSZWdpc3RlcmVkKEN1c3RvbVJlc3BvbnNlRmlsdGVyLmNsYXNzKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGNvbmZpZy5pc1JlZ2lzdGVyZWQoQ3VzdG9tRmVhdHVyZS5jbGFzcykpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWcuZ2V0UHJvcGVydHlOYW1lcygpLmNvbnRhaW5zKFNlcnZlclByb3BlcnRpZXMuUFJPVklERVJfQ0xBU1NOQU1FUykpOworCisgICAgICAgICAgICByZXR1cm4gImdldCI7CisgICAgICAgIH0KKworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByb3ZpZGVyQXNTZXJ2ZXJQcm9wZXJ0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhQcm92aWRlclByb3BlcnR5UmVzb3VyY2UuY2xhc3MpLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMKKyAgICAgICAgICAgICAgICAuV0FETF9GRUFUVVJFX0RJU0FCTEUsIHRydWUpOworICAgICAgICByZXNvdXJjZUNvbmZpZy5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLlBST1ZJREVSX0NMQVNTTkFNRVMsIEN1c3RvbUZlYXR1cmUuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgICAgICBmaW5hbCBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwbGljYXRpb25IYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihyZXNvdXJjZUNvbmZpZyk7CisKKyAgICAgICAgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBhcHBsaWNhdGlvbkhhbmRsZXIuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9wcm9wZXJ0eSIsICJHRVQiKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImdldC1maWx0ZXJlZCIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAUGF0aCgicnVudGltZUNvbmZpZyIpCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBSdW50aW1lQ29uZmlnUmVzb3VyY2UgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWc7CisgICAgICAgIHByaXZhdGUgZmluYWwgUmVzb3VyY2VDb25maWcgYXBwbGljYXRpb247CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBwdWJsaWMgUnVudGltZUNvbmZpZ1Jlc291cmNlKGZpbmFsIEFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uLCBmaW5hbCBDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7CisgICAgICAgICAgICB0aGlzLmFwcGxpY2F0aW9uID0gKFJlc291cmNlQ29uZmlnKSBhcHBsaWNhdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgYXBwbGljYXRpb24uZ2V0UmVnaXN0ZXJlZENsYXNzZXMoKS5zaXplKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhcHBsaWNhdGlvbi5pc1JlZ2lzdGVyZWQoUnVudGltZUNvbmZpZ1Jlc291cmNlLmNsYXNzKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGFwcGxpY2F0aW9uLmlzUmVnaXN0ZXJlZChDdXN0b21GZWF0dXJlLmNsYXNzKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgYXBwbGljYXRpb24uZ2V0Q2xhc3NlcygpLnNpemUoKSk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShhcHBsaWNhdGlvbi5pc0VuYWJsZWQoQ3VzdG9tRmVhdHVyZS5jbGFzcykpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoYXBwbGljYXRpb24uaXNSZWdpc3RlcmVkKEN1c3RvbVJlc3BvbnNlRmlsdGVyLmNsYXNzKSk7CisKKyAgICAgICAgICAgIGFzc2VydFRydWUoY29uZmlnLmlzRW5hYmxlZChDdXN0b21GZWF0dXJlLmNsYXNzKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGNvbmZpZy5pc1JlZ2lzdGVyZWQoUnVudGltZUNvbmZpZ1Jlc291cmNlLmNsYXNzKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGNvbmZpZy5pc1JlZ2lzdGVyZWQoQ3VzdG9tUmVzcG9uc2VGaWx0ZXIuY2xhc3MpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoY29uZmlnLmlzUmVnaXN0ZXJlZChDdXN0b21GZWF0dXJlLmNsYXNzKSk7CisKKyAgICAgICAgICAgIHJldHVybiAiZ2V0IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJ1bnRpbWVSZXNvdXJjZUNvbmZpZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhSdW50aW1lQ29uZmlnUmVzb3VyY2UuY2xhc3MpLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMKKyAgICAgICAgICAgICAgICAuV0FETF9GRUFUVVJFX0RJU0FCTEUsIHRydWUpOworICAgICAgICByZXNvdXJjZUNvbmZpZy5yZWdpc3RlcihDdXN0b21GZWF0dXJlLmNsYXNzKTsKKworICAgICAgICBmaW5hbCBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwbGljYXRpb25IYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihyZXNvdXJjZUNvbmZpZyk7CisKKyAgICAgICAgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBhcHBsaWNhdGlvbkhhbmRsZXIuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9ydW50aW1lQ29uZmlnIiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZ2V0LWZpbHRlcmVkIiwgcmVzcG9uc2UuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBQYXRoKCJzaW5nbGV0b24iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2luZ2xldG9uUmVzb3VyY2VBbmRQcm92aWRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklMVEVSX1JFRiA9ICJGSUxURVJfUkVGIjsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuc2V0UHJvcGVydHkoRklMVEVSX1JFRiwgdGhpcyk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdGVzdChAQ29udGV4dCBDb250YWluZXJSZXF1ZXN0Q29udGV4dCByYykgeworICAgICAgICAgICAgZmluYWwgT2JqZWN0IGZpbHRlclJlZiA9IHJjLmdldFByb3BlcnR5KEZJTFRFUl9SRUYpOworICAgICAgICAgICAgaWYgKGZpbHRlclJlZiA9PSB0aGlzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJwYXNzZWQiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gImZhaWxlZCI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGV0b25SZXNvdXJjZUFuZFByb3ZpZGVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQXBwbGljYXRpb25IYW5kbGVyIGFoID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihuZXcgUmVzb3VyY2VDb25maWcoU2luZ2xldG9uUmVzb3VyY2VBbmRQcm92aWRlci5jbGFzcykpOworICAgICAgICBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGFoLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvc2luZ2xldG9uIiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygicGFzc2VkIiwgcmVzcG9uc2UuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBTaW5nbGV0b24KKyAgICBAUGF0aCgic2luZ2xldG9uIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNpbmdsZXRvblJlc291cmNlIHsKKyAgICAgICAgcHJpdmF0ZSBpbnQgY291bnRlciA9IDA7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHRlc3QoQENvbnRleHQgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmMpIHsKKyAgICAgICAgICAgIHJldHVybiArK2NvdW50ZXIgKyAiIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZXRvblJlc291cmNlQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQXBwbGljYXRpb25IYW5kbGVyIGFoID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihuZXcgUmVzb3VyY2VDb25maWcoU2luZ2xldG9uUmVzb3VyY2UuY2xhc3MpKTsKKyAgICAgICAgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBhaC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3NpbmdsZXRvbiIsICJHRVQiKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSBhaC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3NpbmdsZXRvbiIsICJHRVQiKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjIiLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgfQorCisgICAgQFNpbmdsZXRvbgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHJvZ3JhbW1hdGljU2luZ2xldG9uIGltcGxlbWVudHMgSW5mbGVjdG9yPFJlcXVlc3QsIFJlc3BvbnNlPiB7CisgICAgICAgIHByaXZhdGUgaW50IGNvdW50ZXIgPSAwOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgYXBwbHkoUmVxdWVzdCBkYXRhKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soKytjb3VudGVyICsgIiIpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFByb2dyYW1tYXRpY0RlZmF1bHQgaW1wbGVtZW50cyBJbmZsZWN0b3I8Q29udGFpbmVyUmVxdWVzdENvbnRleHQsIFJlc3BvbnNlPiB7CisgICAgICAgIHByaXZhdGUgaW50IGNvdW50ZXIgPSAwOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgYXBwbHkoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgZGF0YSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCsrY291bnRlciArICIiKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvZ3JhbW1hdGljU2luZ2xldG9uUmVzb3VyY2VDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNvdXJjZUNvbmZpZyByYyA9IG5ldyBSZXNvdXJjZUNvbmZpZygpOworCisgICAgICAgIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZS5CdWlsZGVyIHJiOworICAgICAgICByYiA9IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZS5idWlsZGVyKCk7CisgICAgICAgIHJiLnBhdGgoInNpbmdsZXRvbiIpLmFkZE1ldGhvZCgiR0VUIikuaGFuZGxlZEJ5KFByb2dyYW1tYXRpY1NpbmdsZXRvbi5jbGFzcyk7CisgICAgICAgIHJjLnJlZ2lzdGVyUmVzb3VyY2VzKHJiLmJ1aWxkKCkpOworCisgICAgICAgIHJiID0gb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlLmJ1aWxkZXIoKTsKKyAgICAgICAgcmIucGF0aCgiZGVmYXVsdCIpLmFkZE1ldGhvZCgiR0VUIikuaGFuZGxlZEJ5KFByb2dyYW1tYXRpY0RlZmF1bHQuY2xhc3MpOworICAgICAgICByYy5yZWdpc3RlclJlc291cmNlcyhyYi5idWlsZCgpKTsKKworICAgICAgICByYiA9IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZS5idWlsZGVyKCk7CisgICAgICAgIHJiLnBhdGgoImRlZmF1bHRpbnN0YW5jZSIpLmFkZE1ldGhvZCgiR0VUIikuaGFuZGxlZEJ5KG5ldyBQcm9ncmFtbWF0aWNEZWZhdWx0KCkpOworICAgICAgICByYy5yZWdpc3RlclJlc291cmNlcyhyYi5idWlsZCgpKTsKKworICAgICAgICBBcHBsaWNhdGlvbkhhbmRsZXIgYWggPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKHJjKTsKKyAgICAgICAgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBhaC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3NpbmdsZXRvbiIsICJHRVQiKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSBhaC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3NpbmdsZXRvbiIsICJHRVQiKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjIiLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSBhaC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL2RlZmF1bHQiLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgcmVzcG9uc2UuZ2V0RW50aXR5KCkpOworCisgICAgICAgIHJlc3BvbnNlID0gYWguYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9kZWZhdWx0IiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMSIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKworICAgICAgICByZXNwb25zZSA9IGFoLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvZGVmYXVsdGluc3RhbmNlIiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMSIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKworICAgICAgICByZXNwb25zZSA9IGFoLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvZGVmYXVsdGluc3RhbmNlIiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMiIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEplcnNleTI0MDIgZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEhhc2hTZXQ8Q2xhc3M8Pz4+KCkge3sKKyAgICAgICAgICAgICAgICBhZGQoSmVyc2V5MjQwMkZlYXR1cmUuY2xhc3MpOworICAgICAgICAgICAgICAgIGFkZChKZXJzZXkyNDAyUmVzb3VyY2UuY2xhc3MpOworICAgICAgICAgICAgfX07CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdD4gZ2V0UHJvcGVydGllcygpIHsKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy48U3RyaW5nLCBPYmplY3Q+c2luZ2xldG9uTWFwKCJmb28iLCAiYmFyIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEplcnNleTI0MDJGZWF0dXJlIGltcGxlbWVudHMgRmVhdHVyZSB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZShmaW5hbCBGZWF0dXJlQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJvcGVydHkgPSBjb250ZXh0LmdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0eSgiZm9vIikgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICA/IChTdHJpbmcpIGNvbnRleHQuZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnR5KCJmb28iKSA6ICJiYXoiOworCisgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKG5ldyBSZWFkZXJJbnRlcmNlcHRvcigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGFyb3VuZFJlYWRGcm9tKGZpbmFsIFJlYWRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zZXRJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocHJvcGVydHkuZ2V0Qnl0ZXMoKSkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5wcm9jZWVkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSmVyc2V5MjQwMlJlc291cmNlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3QoZmluYWwgU3RyaW5nIHBvc3QpIHsKKyAgICAgICAgICAgIHJldHVybiBwb3N0OworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSkVSU0VZLTI0MDIgcmVwcm9kdWNlci4KKyAgICAgKgorICAgICAqIFRlc3QgdGhhdCBwcm9wZXJ0eSBzZXQgdmlhIEFwcGxpY2F0aW9uI2dldFByb3BlcnRpZXMoKSBhcmUgYXZhaWxhYmxlIGluIGZlYXR1cmVzLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByb3BhZ2F0aW9uT2ZQcm9wZXJ0aWVzVG9GZWF0dXJlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBBcHBsaWNhdGlvbkhhbmRsZXIgaGFuZGxlciA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIoSmVyc2V5MjQwMi5jbGFzcyk7CisKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBoYW5kbGVyLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvIiwgIlBPU1QiKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImJhciIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1hcFJlc3BvbnNlRXJyb3JBcHBsaWNhdGlvbiBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSGFzaFNldDxDbGFzczw/Pj4oKSB7eworICAgICAgICAgICAgICAgIGFkZChNYXBSZXNwb25zZUVycm9yUmVzb3VyY2UuY2xhc3MpOworICAgICAgICAgICAgICAgIGFkZChNeVJlc3BvbnNlRXJyb3JNYXBwZXIuY2xhc3MpOworICAgICAgICAgICAgICAgIGFkZChSZXNwb25zZUVycm9yRW50aXR5V3JpdGVyLmNsYXNzKTsKKyAgICAgICAgICAgIH19OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFByb3BlcnRpZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCkge3sKKyAgICAgICAgICAgICAgICBwdXQoU2VydmVyUHJvcGVydGllcy5QUk9DRVNTSU5HX1JFU1BPTlNFX0VSUk9SU19FTkFCTEVELCB0cnVlKTsKKyAgICAgICAgICAgIH19OworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNwb25zZUVycm9yRW50aXR5IHsKKworICAgICAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworICAgICAgICBwdWJsaWMgUmVzcG9uc2VFcnJvckVudGl0eSgpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBSZXNwb25zZUVycm9yRW50aXR5KGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVJlc3BvbnNlRXJyb3JNYXBwZXIgaW1wbGVtZW50cyBSZXNwb25zZUVycm9yTWFwcGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHRvUmVzcG9uc2UoZmluYWwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgaWYgKChleGNlcHRpb24gaW5zdGFuY2VvZiBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZXhjZXB0aW9uLmdldENhdXNlKCkgaW5zdGFuY2VvZiBNZXNzYWdlQm9keVByb3ZpZGVyTm90Rm91bmRFeGNlcHRpb24pCisgICAgICAgICAgICAgICAgICAgIHx8IChleGNlcHRpb24gaW5zdGFuY2VvZiBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soKS5lbnRpdHkoImJhciIpLmJ1aWxkKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIE1hcHBhYmxlRXhjZXB0aW9uIHx8IGV4Y2VwdGlvbiBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soKS5lbnRpdHkobmV3IFJlc3BvbnNlRXJyb3JFbnRpdHkoImJhciIpKS50eXBlKCJmb28vYmFyIikuYnVpbGQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgQFByb2R1Y2VzKCJmb28vYmFyIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc3BvbnNlRXJyb3JFbnRpdHlXcml0ZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVdyaXRlcjxSZXNwb25zZUVycm9yRW50aXR5PiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShmaW5hbCBSZXNwb25zZUVycm9yRW50aXR5IHJlc3BvbnNlRXJyb3JFbnRpdHksIGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIFJlc3BvbnNlRXJyb3JFbnRpdHkgcmVzcG9uc2VFcnJvckVudGl0eSwgZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUsIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywKKyAgICAgICAgICAgICAgICBPYmplY3Q+IGh0dHBIZWFkZXJzLCBmaW5hbCBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYW5ub3QgZG8gdGhhdCEiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1hcFJlc3BvbnNlRXJyb3JSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2VFcnJvckVudGl0eSBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlRXJyb3JFbnRpdHkoImZvbyIpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImZvby9iYXIiKQorICAgICAgICBAUGF0aCgiZm9vYmFyIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlRXJyb3JFbnRpdHkgZ2V0Rm9vQmFyKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0aGF0IHVuLW1hcHBlZCByZXNwb25zZSBlcnJvcnMgYXJlIHRyaWVkIHRvIGJlIHByb2Nlc3NlZCAoTUJXKS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXBSZXNwb25zZUVycm9yRm9yTWJ3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uSGFuZGxlciBoYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihNYXBSZXNwb25zZUVycm9yQXBwbGljYXRpb24uY2xhc3MpOworCisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlcXVlc3QgY29udGV4dCA9IFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvIiwgIkdFVCIpLmJ1aWxkKCk7CisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gaGFuZGxlci5hcHBseShjb250ZXh0KS5nZXQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYmFyIiwgcmVzcG9uc2UuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCB1bi1tYXBwZWQgcmVzcG9uc2UgZXJyb3JzIGFyZSB0cmllZCB0byBiZSBwcm9jZXNzZWQgb25seSBvbmNlIChNQlcpLgorICAgICAqLworICAgIEBUZXN0KGV4cGVjdGVkID0gRXhlY3V0aW9uRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXBDeWNsaWNSZXNwb25zZUVycm9yRm9yTWJ3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uSGFuZGxlciBoYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihNYXBSZXNwb25zZUVycm9yQXBwbGljYXRpb24uY2xhc3MpOworCisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlcXVlc3QgY29udGV4dCA9IFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvZm9vYmFyIiwgIkdFVCIpLmJ1aWxkKCk7CisKKyAgICAgICAgaGFuZGxlci5hcHBseShjb250ZXh0KS5nZXQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9BcHBsaWNhdGlvblRlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL0FwcGxpY2F0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4OWUzNjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9BcHBsaWNhdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBBcHBsaWNhdGlvblRlc3QgeworCisgICAgQFBhdGgoInRlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRHVtbXlSZXNvdXJjZSB7CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDbGFzc2VzQ29udGFpbnNOdWxsKCkgeworICAgICAgICBBcHBsaWNhdGlvbiBhID0gbmV3IEFwcGxpY2F0aW9uKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSGFzaFNldDxDbGFzczw/Pj4oKSB7eworICAgICAgICAgICAgICAgICAgICBhZGQobnVsbCk7CisgICAgICAgICAgICAgICAgICAgIGFkZChEdW1teVJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgICAgICAgICB9fTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU2V0PE9iamVjdD4gZ2V0U2luZ2xldG9ucygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBuZXcgQXBwbGljYXRpb25IYW5kbGVyKGEpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFNpbmdsZXRvbnNDb250YWluc051bGwoKSB7CisgICAgICAgIEFwcGxpY2F0aW9uIGEgPSBuZXcgQXBwbGljYXRpb24oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFNldDxPYmplY3Q+IGdldFNpbmdsZXRvbnMoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIYXNoU2V0PE9iamVjdD4oKSB7eworICAgICAgICAgICAgICAgICAgICBhZGQobnVsbCk7CisgICAgICAgICAgICAgICAgICAgIGFkZChuZXcgRHVtbXlSZXNvdXJjZSgpKTsKKyAgICAgICAgICAgICAgICB9fTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBuZXcgQXBwbGljYXRpb25IYW5kbGVyKGEpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFNpbmdsZXRvbnNOdWxsKCkgeworICAgICAgICBBcHBsaWNhdGlvbiBhID0gbmV3IEFwcGxpY2F0aW9uKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTZXQ8T2JqZWN0PiBnZXRTaW5nbGV0b25zKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIoYSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q2xhc3Nlc051bGwoKSB7CisgICAgICAgIEFwcGxpY2F0aW9uIGEgPSBuZXcgQXBwbGljYXRpb24oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFNldDxPYmplY3Q+IGdldFNpbmdsZXRvbnMoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihhKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9Bc3luY0FwcGxpY2F0aW9uQnVpbGRpbmdUZXN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9Bc3luY0FwcGxpY2F0aW9uQnVpbGRpbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlkOGY1MAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL0FzeW5jQXBwbGljYXRpb25CdWlsZGluZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDI1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLkluZmxlY3RvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2U7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBVbml0IHRlc3QgZm9yIGNyZWF0aW5nIGFuIGFwcGxpY2F0aW9uIHdpdGggYXN5bmNocm9ub3VzbHkgaGFuZGxlZCByZXF1ZXN0IHByb2Nlc3NpbmcKKyAqIHZpYSB7QGxpbmsgUmVzb3VyY2V9J3MgcHJvZ3JhbW1hdGljIEFQSS4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQXN5bmNBcHBsaWNhdGlvbkJ1aWxkaW5nVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQkFTRV9VUkkgPSAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2Jhc2UvIjsKKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFzeW5jSW5mbGVjdG9yIGltcGxlbWVudHMgSW5mbGVjdG9yPENvbnRhaW5lclJlcXVlc3RDb250ZXh0LCBSZXNwb25zZT4geworCisgICAgICAgIEBJbmplY3QKKyAgICAgICAgcHJpdmF0ZSBQcm92aWRlcjxBc3luY0NvbnRleHQ+IGFzeW5jQ29udGV4dFByb3ZpZGVyOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyByZXNwb25zZUNvbnRlbnQ7CisKKyAgICAgICAgcHVibGljIEFzeW5jSW5mbGVjdG9yKCkgeworICAgICAgICAgICAgdGhpcy5yZXNwb25zZUNvbnRlbnQgPSAiREVGQVVMVCI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQXN5bmNJbmZsZWN0b3IoU3RyaW5nIHJlc3BvbnNlQ29udGVudCkgeworICAgICAgICAgICAgdGhpcy5yZXNwb25zZUNvbnRlbnQgPSByZXNwb25zZUNvbnRlbnQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGFwcGx5KGZpbmFsIENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcSkgeworICAgICAgICAgICAgLy8gU3VzcGVuZCBjdXJyZW50IHJlcXVlc3QKKyAgICAgICAgICAgIGZpbmFsIEFzeW5jQ29udGV4dCBhc3luY0NvbnRleHQgPSBhc3luY0NvbnRleHRQcm92aWRlci5nZXQoKTsKKyAgICAgICAgICAgIGFzeW5jQ29udGV4dC5zdXNwZW5kKCk7CisKKyAgICAgICAgICAgIEV4ZWN1dG9ycy5uZXdTaW5nbGVUaHJlYWRFeGVjdXRvcigpLnN1Ym1pdChuZXcgUnVubmFibGUoKSB7CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTAwKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZShTeXN0ZW0uZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIFJldHVybmluZyB3aWxsIGVudGVyIHRoZSBzdXNwZW5kZWQgcmVxdWVzdAorICAgICAgICAgICAgICAgICAgICBhc3luY0NvbnRleHQucmVzdW1lKFJlc3BvbnNlLm9rKCkuZW50aXR5KHJlc3BvbnNlQ29udGVudCkuYnVpbGQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEFwcGxpY2F0aW9uSGFuZGxlciBzZXR1cEFwcGxpY2F0aW9uMSgpIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmMgPSBuZXcgUmVzb3VyY2VDb25maWcoKTsKKworICAgICAgICBSZXNvdXJjZS5CdWlsZGVyIHJiOworCisgICAgICAgIHJiID0gUmVzb3VyY2UuYnVpbGRlcigiYS9iL2MiKTsKKyAgICAgICAgcmIuYWRkTWV0aG9kKCJHRVQiKS5oYW5kbGVkQnkobmV3IEFzeW5jSW5mbGVjdG9yKCJBLUItQyIpKTsKKyAgICAgICAgcmMucmVnaXN0ZXJSZXNvdXJjZXMocmIuYnVpbGQoKSk7CisKKyAgICAgICAgcmIgPSBSZXNvdXJjZS5idWlsZGVyKCJhL2IvZCIpOworICAgICAgICByYi5hZGRNZXRob2QoIkdFVCIpLmhhbmRsZWRCeShuZXcgQXN5bmNJbmZsZWN0b3IoIkEtQi1EIikpOworICAgICAgICByYy5yZWdpc3RlclJlc291cmNlcyhyYi5idWlsZCgpKTsKKworICAgICAgICByZXR1cm4gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihyYyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNBcHAxKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24geworICAgICAgICBDb250YWluZXJSZXF1ZXN0IHJlcSA9IFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKAorICAgICAgICAgICAgICAgIEJBU0VfVVJJLCBCQVNFX1VSSSArICJhL2IvYyIsICJHRVQiKS5idWlsZCgpOworCisgICAgICAgIEZ1dHVyZTxDb250YWluZXJSZXNwb25zZT4gcmVzID0gc2V0dXBBcHBsaWNhdGlvbjEoKS5hcHBseShyZXEpOworCisgICAgICAgIGFzc2VydEVxdWFscygiQS1CLUMiLCByZXMuZ2V0KCkuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFzeW5jQXBwMigpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgQ29udGFpbmVyUmVxdWVzdCByZXEgPSBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgKKyAgICAgICAgICAgICAgICBCQVNFX1VSSSwgQkFTRV9VUkkgKyAiYS9iL2QiLCAiR0VUIikuYnVpbGQoKTsKKworICAgICAgICBGdXR1cmU8Q29udGFpbmVyUmVzcG9uc2U+IHJlcyA9IHNldHVwQXBwbGljYXRpb24xKCkuYXBwbHkocmVxKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIkEtQi1EIiwgcmVzLmdldCgpLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZUEgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gImdldCEiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0YXBwQnVpbGRlckNsYXNzZXMoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlQS5jbGFzcyk7CisgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbiA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIocmVzb3VyY2VDb25maWcpOworCisgICAgICAgIENvbnRhaW5lclJlcXVlc3QgcmVxID0gUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oQkFTRV9VUkksIEJBU0VfVVJJLCAiR0VUIikuYnVpbGQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImdldCEiLCBhcHBsaWNhdGlvbi5hcHBseShyZXEpLmdldCgpLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUFwcENyZWF0aW9uUGFzc2VzKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZygpOworICAgICAgICBmaW5hbCBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwbGljYXRpb24gPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKHJlc291cmNlQ29uZmlnKTsKKworICAgICAgICBDb250YWluZXJSZXF1ZXN0IHJlcSA9IFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKEJBU0VfVVJJLCBCQVNFX1VSSSwgIkdFVCIpLmJ1aWxkKCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwNCwgYXBwbGljYXRpb24uYXBwbHkocmVxKS5nZXQoKS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwQnVpbGRlckpheFJzQXBwbGljYXRpb24oKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEFwcGxpY2F0aW9uIGpheFJzQXBwbGljYXRpb24gPSBuZXcgQXBwbGljYXRpb24oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgICAgICAgICAgSGFzaFNldDxDbGFzczw/Pj4gc2V0ID0gbmV3IEhhc2hTZXQ8Q2xhc3M8Pz4+KCk7CisgICAgICAgICAgICAgICAgc2V0LmFkZChSZXNvdXJjZUEuY2xhc3MpOworICAgICAgICAgICAgICAgIHJldHVybiBzZXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFNldDxPYmplY3Q+IGdldFNpbmdsZXRvbnMoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldFNpbmdsZXRvbnMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBmaW5hbCBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwbGljYXRpb24gPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKGpheFJzQXBwbGljYXRpb24pOworCisgICAgICAgIENvbnRhaW5lclJlcXVlc3QgcmVxID0gUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oQkFTRV9VUkksIEJBU0VfVVJJLCAiR0VUIikuYnVpbGQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImdldCEiLCBhcHBsaWNhdGlvbi5hcHBseShyZXEpLmdldCgpLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZUIgeworCisgICAgICAgIEBDb250ZXh0CisgICAgICAgIGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb24gYXBwbGljYXRpb247CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoYXBwbGljYXRpb24gIT0gbnVsbCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGFwcGxpY2F0aW9uLmdldENsYXNzZXMoKS5jb250YWlucyhSZXNvdXJjZUIuY2xhc3MpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoYXBwbGljYXRpb24uZ2V0U2luZ2xldG9ucygpLnNpemUoKSA+IDApOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhcHBsaWNhdGlvbi5nZXRTaW5nbGV0b25zKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0Q2xhc3MoKS5lcXVhbHMoUmVzb3VyY2VBUmVhZGVyLmNsYXNzKSk7CisgICAgICAgICAgICByZXR1cm4gImdldCEiOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZUFSZWFkZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVJlYWRlcjxSZXNvdXJjZUE+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzb3VyY2VBIHJlYWRGcm9tKENsYXNzPFJlc291cmNlQT4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBodHRwSGVhZGVycywgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKQorICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKYXhyc0FwcGxpY2F0aW9uSW5qZWN0aW9uKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZUIuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVySW5zdGFuY2VzKG5ldyBSZXNvdXJjZUFSZWFkZXIoKSk7CisKKyAgICAgICAgZmluYWwgQXBwbGljYXRpb25IYW5kbGVyIGFwcGxpY2F0aW9uID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihyZXNvdXJjZUNvbmZpZyk7CisKKyAgICAgICAgQ29udGFpbmVyUmVxdWVzdCByZXEgPSBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbShCQVNFX1VSSSwgQkFTRV9VUkksICJHRVQiKS5idWlsZCgpOworCisgICAgICAgIGFzc2VydEVxdWFscygiZ2V0ISIsIGFwcGxpY2F0aW9uLmFwcGx5KHJlcSkuZ2V0KCkuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBAQ29uc3VtZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXJyb3Jub3VzUmVzb3VyY2UgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdE9uZShTdHJpbmcgcykgeworICAgICAgICAgICAgcmV0dXJuICJPbmUiOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0VHdvKFN0cmluZyBzKSB7CisgICAgICAgICAgICByZXR1cm4gIlR3byI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZXBsb3ltZW50RmFpbHNGb3JBbWJpZ3VvdXNSZXNvdXJjZSgpIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoRXJyb3Jub3VzUmVzb3VyY2UuY2xhc3MpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQXBwbGljYXRpb25IYW5kbGVyIHNlcnZlciA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIocmVzb3VyY2VDb25maWcpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiSmVyc2V5IHNlcnZlciBpbml0aWFsaXphdGlvbiBzaG91bGQgaGF2ZSBmYWlsZWQ6ICIgKyBzZXJ2ZXIsIGZhbHNlKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL0FzeW5jQ2FsbGJhY2tTZXJ2ZXJUZXN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9Bc3luY0NhbGxiYWNrU2VydmVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZTI1YmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9Bc3luY0NhbGxiYWNrU2VydmVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjU1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLk5hbWVCaW5kaW5nOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkFzeW5jUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbXBsZXRpb25DYWxsYmFjazsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlc3BvbnNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlN1c3BlbmRlZDsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCisvKioKKyAqIFRlc3RzIHtAbGluayBDb21wbGV0aW9uQ2FsbGJhY2t9LgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIEFzeW5jQ2FsbGJhY2tTZXJ2ZXJUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEZsYWdzIHsKKyAgICAgICAgcHVibGljIHZvbGF0aWxlIGJvb2xlYW4gb25SZXN1bWVDYWxsZWQ7CisgICAgICAgIHB1YmxpYyB2b2xhdGlsZSBib29sZWFuIG9uQ29tcGxldGlvbkNhbGxlZDsKKyAgICAgICAgcHVibGljIHZvbGF0aWxlIGJvb2xlYW4gb25Db21wbGV0aW9uQ2FsbGVkV2l0aEVycm9yOworICAgICAgICBwdWJsaWMgdm9sYXRpbGUgYm9vbGVhbiBvblJlc3VtZUZhaWxlZENhbGxlZDsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wbGV0aW9uQ2FsbGJhY2soKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEZsYWdzIGZsYWdzID0gbmV3IEZsYWdzKCk7CisKKyAgICAgICAgQXBwbGljYXRpb25IYW5kbGVyIGFwcCA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIoCisgICAgICAgICAgICAgICAgbmV3IFJlc291cmNlQ29uZmlnKCkucmVnaXN0ZXIobmV3IENvbXBsZXRpb25SZXNvdXJjZShmbGFncykpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKG5ldyBDaGVja2luZ0NvbXBsZXRpb25GaWx0ZXIoZmxhZ3MpKSk7CisgICAgICAgIENvbnRhaW5lclJlcXVlc3QgcmVxID0gUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oCisgICAgICAgICAgICAgICAgIi9jb21wbGV0aW9uL29uQ29tcGxldGlvbiIsICJHRVQiKS5idWlsZCgpOworCisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gYXBwLmFwcGx5KHJlcSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgib25Db21wbGV0ZSgpIHdhcyBub3QgY2FsbGVkLiIsIGZsYWdzLm9uQ29tcGxldGlvbkNhbGxlZCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGxldGlvbkZhaWwoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEZsYWdzIGZsYWdzID0gbmV3IEZsYWdzKCk7CisKKyAgICAgICAgQXBwbGljYXRpb25IYW5kbGVyIGFwcCA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIoCisgICAgICAgICAgICAgICAgbmV3IFJlc291cmNlQ29uZmlnKCkucmVnaXN0ZXIobmV3IENvbXBsZXRpb25SZXNvdXJjZShmbGFncykpCisgICAgICAgICAgICAgICAgICAgICAgICAucmVnaXN0ZXIobmV3IENoZWNraW5nQ29tcGxldGlvbkZpbHRlcihmbGFncykpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oCisgICAgICAgICAgICAgICAgICAgICIvY29tcGxldGlvbi9vbkVycm9yIiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICAgICAgZmFpbCgic2hvdWxkIGZhaWwiKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIG9rIC0gc2hvdWxkIHRocm93IGFuIGV4Y2VwdGlvbgorICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoIm9uRXJyb3IoKS4iLCBmbGFncy5vbkNvbXBsZXRpb25DYWxsZWRXaXRoRXJyb3IpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlZ2lzdGVyTnVsbENsYXNzKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihuZXcgUmVzb3VyY2VDb25maWcoTnVsbENhbGxiYWNrUmVzb3VyY2UuY2xhc3MpKTsKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVxdWVzdCByZXEgPSBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL251bGwtY2FsbGJhY2svY2xhc3MiLCAiR0VUIikuYnVpbGQoKTsKKworICAgICAgICBmaW5hbCBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGFwcC5hcHBseShyZXEpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVnaXN0ZXJOdWxsT2JqZWN0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihuZXcgUmVzb3VyY2VDb25maWcoTnVsbENhbGxiYWNrUmVzb3VyY2UuY2xhc3MpKTsKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVxdWVzdCByZXEgPSBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL251bGwtY2FsbGJhY2svb2JqZWN0IiwgIkdFVCIpLmJ1aWxkKCk7CisKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBhcHAuYXBwbHkocmVxKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBDb21wbGV0aW9uQmluZGluZworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2hlY2tpbmdDb21wbGV0aW9uRmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXIgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgRmxhZ3MgZmxhZ3M7CisKKyAgICAgICAgcHVibGljIENoZWNraW5nQ29tcGxldGlvbkZpbHRlcihGbGFncyBmbGFncykgeworICAgICAgICAgICAgdGhpcy5mbGFncyA9IGZsYWdzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCwgQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKCJvbkNvbXBsZXRlKCkgY2FsbGJhY2sgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3Mub25Db21wbGV0aW9uQ2FsbGVkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlDb21wbGV0aW9uQ2FsbGJhY2sgaW1wbGVtZW50cyBDb21wbGV0aW9uQ2FsbGJhY2sgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgRmxhZ3MgZmxhZ3M7CisKKyAgICAgICAgcHVibGljIE15Q29tcGxldGlvbkNhbGxiYWNrKEZsYWdzIGZsYWdzKSB7CisgICAgICAgICAgICB0aGlzLmZsYWdzID0gZmxhZ3M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZShUaHJvd2FibGUgdGhyb3dhYmxlKSB7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSgib25Db21wbGV0ZSgpIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkLiIsIGZsYWdzLm9uQ29tcGxldGlvbkNhbGxlZCk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZSgib25Db21wbGV0ZSgpIGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIHdpdGggZXJyb3IuIiwgZmxhZ3Mub25Db21wbGV0aW9uQ2FsbGVkV2l0aEVycm9yKTsKKyAgICAgICAgICAgIGlmICh0aHJvd2FibGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZsYWdzLm9uQ29tcGxldGlvbkNhbGxlZCA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZsYWdzLm9uQ29tcGxldGlvbkNhbGxlZFdpdGhFcnJvciA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiY29tcGxldGlvbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb21wbGV0aW9uUmVzb3VyY2UgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgRmxhZ3MgZmxhZ3M7CisKKyAgICAgICAgcHVibGljIENvbXBsZXRpb25SZXNvdXJjZShGbGFncyBmbGFncykgeworICAgICAgICAgICAgdGhpcy5mbGFncyA9IGZsYWdzOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgib25Db21wbGV0aW9uIikKKyAgICAgICAgQENvbXBsZXRpb25CaW5kaW5nCisgICAgICAgIHB1YmxpYyB2b2lkIG9uQ29tcGxldGUoQFN1c3BlbmRlZCBBc3luY1Jlc3BvbnNlIGFzeW5jUmVzcG9uc2UpIHsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGZsYWdzLm9uQ29tcGxldGlvbkNhbGxlZCk7CisgICAgICAgICAgICBhc3luY1Jlc3BvbnNlLnJlZ2lzdGVyKG5ldyBNeUNvbXBsZXRpb25DYWxsYmFjayhmbGFncykpOworICAgICAgICAgICAgYXN5bmNSZXNwb25zZS5yZXN1bWUoIm9rIik7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGZsYWdzLm9uQ29tcGxldGlvbkNhbGxlZCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJvbkVycm9yIikKKyAgICAgICAgQENvbXBsZXRpb25CaW5kaW5nCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoQFN1c3BlbmRlZCBBc3luY1Jlc3BvbnNlIGFzeW5jUmVzcG9uc2UpIHsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGZsYWdzLm9uQ29tcGxldGlvbkNhbGxlZFdpdGhFcnJvcik7CisgICAgICAgICAgICBhc3luY1Jlc3BvbnNlLnJlZ2lzdGVyKG5ldyBNeUNvbXBsZXRpb25DYWxsYmFjayhmbGFncykpOworICAgICAgICAgICAgYXN5bmNSZXNwb25zZS5yZXN1bWUobmV3IFJ1bnRpbWVFeGNlcHRpb24oInRlc3QtZXhjZXB0aW9uIikpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmbGFncy5vbkNvbXBsZXRpb25DYWxsZWRXaXRoRXJyb3IpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIm51bGwtY2FsbGJhY2siKQorICAgIEBTaW5nbGV0b24KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE51bGxDYWxsYmFja1Jlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJjbGFzcyIpCisgICAgICAgIEBDb21wbGV0aW9uQmluZGluZworICAgICAgICBwdWJsaWMgdm9pZCByZWdpc3RlckNsYXNzKEBTdXNwZW5kZWQgQXN5bmNSZXNwb25zZSBhc3luY1Jlc3BvbnNlKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGFzeW5jUmVzcG9uc2UucmVnaXN0ZXIobnVsbCk7CisgICAgICAgICAgICAgICAgZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhwZWN0ZWQuIik7CisgICAgICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBucGUpIHsKKyAgICAgICAgICAgICAgICAvLyBFeHBlY3RlZC4KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBhc3luY1Jlc3BvbnNlLnJlZ2lzdGVyKG51bGwsIE15Q29tcGxldGlvbkNhbGxiYWNrLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBleHBlY3RlZC4iKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIG5wZSkgeworICAgICAgICAgICAgICAgIC8vIEV4cGVjdGVkLgorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGFzeW5jUmVzcG9uc2UucmVnaXN0ZXIoTXlDb21wbGV0aW9uQ2FsbGJhY2suY2xhc3MsIG51bGwpOworICAgICAgICAgICAgICAgIGZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIGV4cGVjdGVkLiIpOworICAgICAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gbnBlKSB7CisgICAgICAgICAgICAgICAgLy8gRXhwZWN0ZWQuCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYXN5bmNSZXNwb25zZS5yZWdpc3RlcihNeUNvbXBsZXRpb25DYWxsYmFjay5jbGFzcywgTXlDb21wbGV0aW9uQ2FsbGJhY2suY2xhc3MsIG51bGwpOworICAgICAgICAgICAgICAgIGZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIGV4cGVjdGVkLiIpOworICAgICAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gbnBlKSB7CisgICAgICAgICAgICAgICAgLy8gRXhwZWN0ZWQuCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFzeW5jUmVzcG9uc2UucmVzdW1lKCJvayIpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgib2JqZWN0IikKKyAgICAgICAgQENvbXBsZXRpb25CaW5kaW5nCisgICAgICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyT2JqZWN0KEBTdXNwZW5kZWQgQXN5bmNSZXNwb25zZSBhc3luY1Jlc3BvbnNlKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGFzeW5jUmVzcG9uc2UucmVnaXN0ZXIoKE9iamVjdCkgbnVsbCk7CisgICAgICAgICAgICAgICAgZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhwZWN0ZWQuIik7CisgICAgICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBucGUpIHsKKyAgICAgICAgICAgICAgICAvLyBFeHBlY3RlZC4KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBhc3luY1Jlc3BvbnNlLnJlZ2lzdGVyKG51bGwsIG5ldyBNeUNvbXBsZXRpb25DYWxsYmFjayhuZXcgRmxhZ3MoKSkpOworICAgICAgICAgICAgICAgIGZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIGV4cGVjdGVkLiIpOworICAgICAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gbnBlKSB7CisgICAgICAgICAgICAgICAgLy8gRXhwZWN0ZWQuCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYXN5bmNSZXNwb25zZS5yZWdpc3RlcihuZXcgTXlDb21wbGV0aW9uQ2FsbGJhY2sobmV3IEZsYWdzKCkpLCBudWxsKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBleHBlY3RlZC4iKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIG5wZSkgeworICAgICAgICAgICAgICAgIC8vIEV4cGVjdGVkLgorICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGFzeW5jUmVzcG9uc2UucmVnaXN0ZXIobmV3IE15Q29tcGxldGlvbkNhbGxiYWNrKG5ldyBGbGFncygpKSwgbmV3IE15Q29tcGxldGlvbkNhbGxiYWNrKG5ldyBGbGFncygpKSwgbnVsbCk7CisgICAgICAgICAgICAgICAgZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhwZWN0ZWQuIik7CisgICAgICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBucGUpIHsKKyAgICAgICAgICAgICAgICAvLyBFeHBlY3RlZC4KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXN5bmNSZXNwb25zZS5yZXN1bWUoIm9rIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBATmFtZUJpbmRpbmcKKyAgICBAVGFyZ2V0KHtFbGVtZW50VHlwZS5UWVBFLCBFbGVtZW50VHlwZS5NRVRIT0R9KQorICAgIEBSZXRlbnRpb24odmFsdWUgPSBSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgICBwdWJsaWMgQGludGVyZmFjZSBDb21wbGV0aW9uQmluZGluZyB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvQXV0b0Rpc2NvdmVyYWJsZVNlcnZlclRlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL0F1dG9EaXNjb3ZlcmFibGVTZXJ2ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZhYzlkZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL0F1dG9EaXNjb3ZlcmFibGVTZXJ2ZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuQ29tbW9uUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5zcGkuQXV0b0Rpc2NvdmVyYWJsZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlByb3BlcnRpZXNIZWxwZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogTm90ZTogQXV0by1kaXNjb3ZlcmFibGVzIGZyb20gdGhpcyB0ZXN0ICJhZmZlY3RzIiBhbGwgb3RoZXIgdGVzdHMgaW4gc3VpdC4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEF1dG9EaXNjb3ZlcmFibGVTZXJ2ZXJUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWSA9ICJBdXRvRGlzY292ZXJhYmxlVGVzdCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb250YWluZXJSZXF1ZXN0RmlsdGVyIGNvbXBvbmVudCA9IG5ldyBDb250YWluZXJSZXF1ZXN0RmlsdGVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKGZpbmFsIENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuYWJvcnRXaXRoKFJlc3BvbnNlLnN0YXR1cyg0MDApLmVudGl0eSgiQ29tbW9uQXV0b0Rpc2NvdmVyYWJsZSIpLmJ1aWxkKCkpOworICAgICAgICB9CisgICAgfTsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29tbW9uQXV0b0Rpc2NvdmVyYWJsZSBpbXBsZW1lbnRzIEF1dG9EaXNjb3ZlcmFibGUgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoZmluYWwgRmVhdHVyZUNvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgLy8gUmV0dXJuIGlmIFBST1BFUlRZIGlzIG5vdCB0cnVlIC0gYXBwbGljYWJsZSBmb3Igb3RoZXIgdGVzdHMuCisgICAgICAgICAgICBpZiAoIVByb3BlcnRpZXNIZWxwZXIuaXNQcm9wZXJ0eShjb250ZXh0LmdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0eShQUk9QRVJUWSkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKGNvbXBvbmVudCwgMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJpb3JpdHkoMTApCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBYm9ydEZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoZmluYWwgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5hYm9ydFdpdGgoUmVzcG9uc2Uuc3RhdHVzKDQwMCkuZW50aXR5KCJBYm9ydEZpbHRlciIpLmJ1aWxkKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldEZvbyhAQ29udGV4dCBIdHRwSGVhZGVycyBoZWFkZXJzKSB7CisgICAgICAgICAgICByZXR1cm4gSW50ZWdlci50b1N0cmluZyhoZWFkZXJzLmdldExlbmd0aCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEF1dG9EaXNjb3ZlcmFibGVHbG9iYWxEZWZhdWx0U2VydmVyRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgiQ29tbW9uQXV0b0Rpc2NvdmVyYWJsZSIsIG51bGwsIG51bGwpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEF1dG9EaXNjb3ZlcmFibGVHbG9iYWxEZWZhdWx0U2VydmVyRW5hYmxlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgiQ29tbW9uQXV0b0Rpc2NvdmVyYWJsZSIsIG51bGwsIGZhbHNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvRGlzY292ZXJhYmxlR2xvYmFsRGVmYXVsdFNlcnZlckRpc2FibGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJBYm9ydEZpbHRlciIsIG51bGwsIHRydWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEF1dG9EaXNjb3ZlcmFibGVHbG9iYWxEaXNhYmxlZFNlcnZlckRlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoIkFib3J0RmlsdGVyIiwgdHJ1ZSwgbnVsbCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0b0Rpc2NvdmVyYWJsZUdsb2JhbERpc2FibGVkU2VydmVyRW5hYmxlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgiQ29tbW9uQXV0b0Rpc2NvdmVyYWJsZSIsIHRydWUsIGZhbHNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvRGlzY292ZXJhYmxlR2xvYmFsRGlzYWJsZWRTZXJ2ZXJEaXNhYmxlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgiQWJvcnRGaWx0ZXIiLCB0cnVlLCB0cnVlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvRGlzY292ZXJhYmxlR2xvYmFsRW5hYmxlZFNlcnZlckRlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoIkNvbW1vbkF1dG9EaXNjb3ZlcmFibGUiLCBmYWxzZSwgbnVsbCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0b0Rpc2NvdmVyYWJsZUdsb2JhbEVuYWJsZWRTZXJ2ZXJFbmFibGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJDb21tb25BdXRvRGlzY292ZXJhYmxlIiwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvRGlzY292ZXJhYmxlR2xvYmFsRW5hYmxlZFNlcnZlckRpc2FibGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJBYm9ydEZpbHRlciIsIGZhbHNlLCB0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3QoZmluYWwgU3RyaW5nIHJlc3BvbnNlLCBmaW5hbCBCb29sZWFuIGdsb2JhbERpc2FibGUsIGZpbmFsIEJvb2xlYW4gc2VydmVyRGlzYWJsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzLCBBYm9ydEZpbHRlci5jbGFzcykKKyAgICAgICAgICAgICAgICAucHJvcGVydHkoUFJPUEVSVFksIHRydWUpOworCisgICAgICAgIGlmIChnbG9iYWxEaXNhYmxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlc291cmNlQ29uZmlnLnByb3BlcnR5KENvbW1vblByb3BlcnRpZXMuRkVBVFVSRV9BVVRPX0RJU0NPVkVSWV9ESVNBQkxFLCBnbG9iYWxEaXNhYmxlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2VydmVyRGlzYWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXNvdXJjZUNvbmZpZy5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLkZFQVRVUkVfQVVUT19ESVNDT1ZFUllfRElTQUJMRSwgc2VydmVyRGlzYWJsZSk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihyZXNvdXJjZUNvbmZpZyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3BvbnNlLCBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8iLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCkuZ2V0RW50aXR5KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL0NvbnRhaW5lclJlcXVlc3RUZXN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9Db250YWluZXJSZXF1ZXN0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZGUxNTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9Db250YWluZXJSZXF1ZXN0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMjAxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlcjsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CitpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkVudGl0eVRhZzsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5TZWN1cml0eUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5WYXJpYW50OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuTWFwUHJvcGVydGllc0RlbGVnYXRlOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBKZXJzZXkgY29udGFpbmVyIHJlcXVlc3QgY29udGV4dCB0ZXN0LgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBDb250YWluZXJSZXF1ZXN0VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZWN1cml0eUNvbnRleHQgU0VDVVJJVFlfQ09OVEVYVCA9IG5ldyBTZWN1cml0eUNvbnRleHQoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUHJpbmNpcGFsIGdldFVzZXJQcmluY2lwYWwoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1VzZXJJblJvbGUoU3RyaW5nIHJvbGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1NlY3VyZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEF1dGhlbnRpY2F0aW9uU2NoZW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9OworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWNjZXB0YWJsZU1lZGlhVHlwZXMoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKKyAgICAgICAgQ29udGFpbmVyUmVxdWVzdCByID0gbmV3IENvbnRhaW5lclJlcXVlc3QoCisgICAgICAgICAgICAgICAgVVJJLmNyZWF0ZSgiaHR0cDovL2V4YW1wbGUub3JnL2FwcCIpLCBVUkkuY3JlYXRlKCJodHRwOi8vZXhhbXBsZS5vcmcvYXBwL3Jlc291cmNlIiksCisgICAgICAgICAgICAgICAgIkdFVCIsIFNFQ1VSSVRZX0NPTlRFWFQsIG5ldyBNYXBQcm9wZXJ0aWVzRGVsZWdhdGUoKSk7CisgICAgICAgIHIuaGVhZGVyKEh0dHBIZWFkZXJzLkFDQ0VQVCwgImFwcGxpY2F0aW9uL3htbCwgdGV4dC9wbGFpbiIpOworICAgICAgICByLmhlYWRlcihIdHRwSGVhZGVycy5BQ0NFUFQsICJhcHBsaWNhdGlvbi9qc29uIik7CisgICAgICAgIGFzc2VydEVxdWFscyhyLmdldEFjY2VwdGFibGVNZWRpYVR5cGVzKCkuc2l6ZSgpLCAzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyLmdldEFjY2VwdGFibGVNZWRpYVR5cGVzKCkuY29udGFpbnMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTF9UWVBFKSk7CisgICAgICAgIGFzc2VydFRydWUoci5nZXRBY2NlcHRhYmxlTWVkaWFUeXBlcygpLmNvbnRhaW5zKE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyLmdldEFjY2VwdGFibGVNZWRpYVR5cGVzKCkuY29udGFpbnMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFjY2VwdGFibGVMYW5ndWFnZXMoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKKyAgICAgICAgQ29udGFpbmVyUmVxdWVzdCByID0gbmV3IENvbnRhaW5lclJlcXVlc3QoCisgICAgICAgICAgICAgICAgVVJJLmNyZWF0ZSgiaHR0cDovL2V4YW1wbGUub3JnL2FwcCIpLCBVUkkuY3JlYXRlKCJodHRwOi8vZXhhbXBsZS5vcmcvYXBwL3Jlc291cmNlIiksCisgICAgICAgICAgICAgICAgIkdFVCIsIFNFQ1VSSVRZX0NPTlRFWFQsIG5ldyBNYXBQcm9wZXJ0aWVzRGVsZWdhdGUoKSk7CisgICAgICAgIHIuaGVhZGVyKEh0dHBIZWFkZXJzLkFDQ0VQVF9MQU5HVUFHRSwgImVuLWdiO3E9MC44LCBlbjtxPTAuNyIpOworICAgICAgICByLmhlYWRlcihIdHRwSGVhZGVycy5BQ0NFUFRfTEFOR1VBR0UsICJkZSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoci5nZXRBY2NlcHRhYmxlTGFuZ3VhZ2VzKCkuc2l6ZSgpLCAzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyLmdldEFjY2VwdGFibGVMYW5ndWFnZXMoKS5jb250YWlucyhMb2NhbGUuVUspKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyLmdldEFjY2VwdGFibGVMYW5ndWFnZXMoKS5jb250YWlucyhMb2NhbGUuRU5HTElTSCkpOworICAgICAgICBhc3NlcnRUcnVlKHIuZ2V0QWNjZXB0YWJsZUxhbmd1YWdlcygpLmNvbnRhaW5zKExvY2FsZS5HRVJNQU4pKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2QoKSB7CisgICAgICAgIENvbnRhaW5lclJlcXVlc3QgciA9IG5ldyBDb250YWluZXJSZXF1ZXN0KAorICAgICAgICAgICAgICAgIFVSSS5jcmVhdGUoImh0dHA6Ly9leGFtcGxlLm9yZy9hcHAiKSwgVVJJLmNyZWF0ZSgiaHR0cDovL2V4YW1wbGUub3JnL2FwcC9yZXNvdXJjZSIpLAorICAgICAgICAgICAgICAgICJHRVQiLCBTRUNVUklUWV9DT05URVhULCBuZXcgTWFwUHJvcGVydGllc0RlbGVnYXRlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoci5nZXRNZXRob2QoKSwgIkdFVCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVyaSgpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24geworICAgICAgICBDb250YWluZXJSZXF1ZXN0IHIgPSBuZXcgQ29udGFpbmVyUmVxdWVzdCgKKyAgICAgICAgICAgICAgICBVUkkuY3JlYXRlKCJodHRwOi8vZXhhbXBsZS5vcmcvYXBwIiksIFVSSS5jcmVhdGUoImh0dHA6Ly9leGFtcGxlLm9yZy9hcHAvcmVzb3VyY2UiKSwKKyAgICAgICAgICAgICAgICAiR0VUIiwgU0VDVVJJVFlfQ09OVEVYVCwgbmV3IE1hcFByb3BlcnRpZXNEZWxlZ2F0ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHIuZ2V0UmVxdWVzdFVyaSgpLCBVUkkuY3JlYXRlKCJodHRwOi8vZXhhbXBsZS5vcmcvYXBwL3Jlc291cmNlIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbGVjdFZhcmlhbnQoKSB7CisgICAgICAgIENvbnRhaW5lclJlcXVlc3QgciA9IG5ldyBDb250YWluZXJSZXF1ZXN0KAorICAgICAgICAgICAgICAgIFVSSS5jcmVhdGUoImh0dHA6Ly9leGFtcGxlLm9yZy9hcHAiKSwgVVJJLmNyZWF0ZSgiaHR0cDovL2V4YW1wbGUub3JnL2FwcC9yZXNvdXJjZSIpLAorICAgICAgICAgICAgICAgICJHRVQiLCBTRUNVUklUWV9DT05URVhULCBuZXcgTWFwUHJvcGVydGllc0RlbGVnYXRlKCkpOworICAgICAgICByLmhlYWRlcihIdHRwSGVhZGVycy5BQ0NFUFQsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKTsKKyAgICAgICAgci5oZWFkZXIoSHR0cEhlYWRlcnMuQUNDRVBUX0xBTkdVQUdFLCAiZW4iKTsKKyAgICAgICAgTGlzdDxWYXJpYW50PiBsdiA9IFZhcmlhbnQKKyAgICAgICAgICAgICAgICAubWVkaWFUeXBlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MX1RZUEUsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUpCisgICAgICAgICAgICAgICAgLmxhbmd1YWdlcyhMb2NhbGUuRU5HTElTSCwgTG9jYWxlLkZSRU5DSCkKKyAgICAgICAgICAgICAgICAuYWRkKCkuYnVpbGQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHIuc2VsZWN0VmFyaWFudChsdikuZ2V0TWVkaWFUeXBlKCksIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUpOworICAgICAgICBhc3NlcnRFcXVhbHMoci5zZWxlY3RWYXJpYW50KGx2KS5nZXRMYW5ndWFnZSgpLCBMb2NhbGUuRU5HTElTSCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlY29uZGl0aW9uc01hdGNoKCkgeworICAgICAgICBDb250YWluZXJSZXF1ZXN0IHIgPSBuZXcgQ29udGFpbmVyUmVxdWVzdCgKKyAgICAgICAgICAgICAgICBVUkkuY3JlYXRlKCJodHRwOi8vZXhhbXBsZS5vcmcvYXBwIiksIFVSSS5jcmVhdGUoImh0dHA6Ly9leGFtcGxlLm9yZy9hcHAvcmVzb3VyY2UiKSwKKyAgICAgICAgICAgICAgICAiR0VUIiwgU0VDVVJJVFlfQ09OVEVYVCwgbmV3IE1hcFByb3BlcnRpZXNEZWxlZ2F0ZSgpKTsKKyAgICAgICAgci5oZWFkZXIoSHR0cEhlYWRlcnMuSUZfTUFUQ0gsICJcIjY4Njg5NzY5NmE3Yzg3NmI3ZVwiIik7CisgICAgICAgIGFzc2VydE51bGwoci5ldmFsdWF0ZVByZWNvbmRpdGlvbnMobmV3IEVudGl0eVRhZygiNjg2ODk3Njk2YTdjODc2YjdlIikpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHIuZXZhbHVhdGVQcmVjb25kaXRpb25zKG5ldyBFbnRpdHlUYWcoIjAiKSkuYnVpbGQoKS5nZXRTdGF0dXMoKSwKKyAgICAgICAgICAgICAgICBSZXNwb25zZS5TdGF0dXMuUFJFQ09ORElUSU9OX0ZBSUxFRC5nZXRTdGF0dXNDb2RlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByZWNvbmRpdGlvbnNOb25lTWF0Y2goKSB7CisgICAgICAgIENvbnRhaW5lclJlcXVlc3QgciA9IG5ldyBDb250YWluZXJSZXF1ZXN0KAorICAgICAgICAgICAgICAgIFVSSS5jcmVhdGUoImh0dHA6Ly9leGFtcGxlLm9yZy9hcHAiKSwgVVJJLmNyZWF0ZSgiaHR0cDovL2V4YW1wbGUub3JnL2FwcC9yZXNvdXJjZSIpLAorICAgICAgICAgICAgICAgICJHRVQiLCBTRUNVUklUWV9DT05URVhULCBuZXcgTWFwUHJvcGVydGllc0RlbGVnYXRlKCkpOworICAgICAgICByLmhlYWRlcihIdHRwSGVhZGVycy5JRl9OT05FX01BVENILCAiXCI2ODY4OTc2OTZhN2M4NzZiN2VcIiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoci5ldmFsdWF0ZVByZWNvbmRpdGlvbnMobmV3IEVudGl0eVRhZygiNjg2ODk3Njk2YTdjODc2YjdlIikpLmJ1aWxkKCkuZ2V0U3RhdHVzKCksCisgICAgICAgICAgICAgICAgUmVzcG9uc2UuU3RhdHVzLk5PVF9NT0RJRklFRC5nZXRTdGF0dXNDb2RlKCkpOworICAgICAgICBhc3NlcnROdWxsKHIuZXZhbHVhdGVQcmVjb25kaXRpb25zKG5ldyBFbnRpdHlUYWcoIjAwMDAwMDAwMDAwMDAwMDAwMCIpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlY29uZGl0aW9uc01vZGlmaWVkKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgQ29udGFpbmVyUmVxdWVzdCByID0gbmV3IENvbnRhaW5lclJlcXVlc3QoCisgICAgICAgICAgICAgICAgVVJJLmNyZWF0ZSgiaHR0cDovL2V4YW1wbGUub3JnL2FwcCIpLCBVUkkuY3JlYXRlKCJodHRwOi8vZXhhbXBsZS5vcmcvYXBwL3Jlc291cmNlIiksCisgICAgICAgICAgICAgICAgIkdFVCIsIFNFQ1VSSVRZX0NPTlRFWFQsIG5ldyBNYXBQcm9wZXJ0aWVzRGVsZWdhdGUoKSk7CisgICAgICAgIHIuaGVhZGVyKEh0dHBIZWFkZXJzLklGX01PRElGSUVEX1NJTkNFLCAiU2F0LCAyOSBPY3QgMjAxMSAxOTo0MzozMSBHTVQiKTsKKyAgICAgICAgU2ltcGxlRGF0ZUZvcm1hdCBmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoIkUsIGRkIE1NTSB5eXl5IEhIOm1tOnNzIFoiLCBMb2NhbGUuRU5HTElTSCk7CisgICAgICAgIERhdGUgZGF0ZSA9IGYucGFyc2UoIlNhdCwgMjkgT2N0IDIwMTEgMTk6NDM6MzEgR01UIik7CisgICAgICAgIGFzc2VydEVxdWFscyhyLmV2YWx1YXRlUHJlY29uZGl0aW9ucyhkYXRlKS5idWlsZCgpLmdldFN0YXR1cygpLAorICAgICAgICAgICAgICAgIFJlc3BvbnNlLlN0YXR1cy5OT1RfTU9ESUZJRUQuZ2V0U3RhdHVzQ29kZSgpKTsKKyAgICAgICAgZGF0ZSA9IGYucGFyc2UoIlNhdCwgMzAgT2N0IDIwMTEgMTk6NDM6MzEgR01UIik7CisgICAgICAgIGFzc2VydE51bGwoci5ldmFsdWF0ZVByZWNvbmRpdGlvbnMoZGF0ZSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByZWNvbmRpdGlvbnNVbk1vZGlmaWVkKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgQ29udGFpbmVyUmVxdWVzdCByID0gbmV3IENvbnRhaW5lclJlcXVlc3QoCisgICAgICAgICAgICAgICAgVVJJLmNyZWF0ZSgiaHR0cDovL2V4YW1wbGUub3JnL2FwcCIpLCBVUkkuY3JlYXRlKCJodHRwOi8vZXhhbXBsZS5vcmcvYXBwL3Jlc291cmNlIiksCisgICAgICAgICAgICAgICAgIkdFVCIsIFNFQ1VSSVRZX0NPTlRFWFQsIG5ldyBNYXBQcm9wZXJ0aWVzRGVsZWdhdGUoKSk7CisgICAgICAgIHIuaGVhZGVyKEh0dHBIZWFkZXJzLklGX1VOTU9ESUZJRURfU0lOQ0UsICJTYXQsIDI5IE9jdCAyMDExIDE5OjQzOjMxIEdNVCIpOworICAgICAgICBTaW1wbGVEYXRlRm9ybWF0IGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiRSwgZGQgTU1NIHl5eXkgSEg6bW06c3MgWiIsIExvY2FsZS5FTkdMSVNIKTsKKyAgICAgICAgRGF0ZSBkYXRlID0gZi5wYXJzZSgiU2F0LCAyOSBPY3QgMjAxMSAxOTo0MzozMSBHTVQiKTsKKyAgICAgICAgYXNzZXJ0TnVsbChyLmV2YWx1YXRlUHJlY29uZGl0aW9ucyhkYXRlKSk7CisgICAgICAgIGRhdGUgPSBmLnBhcnNlKCJTYXQsIDMwIE9jdCAyMDExIDE5OjQzOjMxIEdNVCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoci5ldmFsdWF0ZVByZWNvbmRpdGlvbnMoZGF0ZSkuYnVpbGQoKS5nZXRTdGF0dXMoKSwKKyAgICAgICAgICAgICAgICBSZXNwb25zZS5TdGF0dXMuUFJFQ09ORElUSU9OX0ZBSUxFRC5nZXRTdGF0dXNDb2RlKCkpOworICAgIH0KKworICAgIHByaXZhdGUgQ29udGFpbmVyUmVxdWVzdCBnZXRDb250YWluZXJSZXF1ZXN0Rm9yUHJlY29uZGl0aW9uc1Rlc3QoKSB7CisgICAgICAgIHJldHVybiBuZXcgQ29udGFpbmVyUmVxdWVzdChVUkkuY3JlYXRlKCJodHRwOi8vZXhhbXBsZS5vcmciKSwKKyAgICAgICAgICAgICAgICAgICAgVVJJLmNyZWF0ZSgiaHR0cDovL2V4YW1wbGUub3JnL2FwcC9yZXNwb3VyY2UiKSwgIkdFVCIsIFNFQ1VSSVRZX0NPTlRFWFQsIG5ldyBNYXBQcm9wZXJ0aWVzRGVsZWdhdGUoKSk7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdEV2YWx1YXRlUHJlY29uZGl0aW9uc0RhdGVOdWxsKCkgeworICAgICAgICBDb250YWluZXJSZXF1ZXN0IHIgPSBnZXRDb250YWluZXJSZXF1ZXN0Rm9yUHJlY29uZGl0aW9uc1Rlc3QoKTsKKyAgICAgICAgci5ldmFsdWF0ZVByZWNvbmRpdGlvbnMoKERhdGUpIG51bGwpOworICAgIH0KKworCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdEV2YWx1YXRlUHJlY29uZGl0aW9uc0VudGl0eVRhZ051bGwoKSB7CisgICAgICAgIENvbnRhaW5lclJlcXVlc3QgciA9IGdldENvbnRhaW5lclJlcXVlc3RGb3JQcmVjb25kaXRpb25zVGVzdCgpOworICAgICAgICByLmV2YWx1YXRlUHJlY29uZGl0aW9ucygoRW50aXR5VGFnKSBudWxsKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXZhbHVhdGVQcmVjb25kaXRpb25zQm90aE51bGwoKSB7CisgICAgICAgIENvbnRhaW5lclJlcXVlc3QgciA9IGdldENvbnRhaW5lclJlcXVlc3RGb3JQcmVjb25kaXRpb25zVGVzdCgpOworICAgICAgICByLmV2YWx1YXRlUHJlY29uZGl0aW9ucyhudWxsLCBudWxsKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9FeHRlbmRlZFJlc291cmNlQ29udGV4dFRlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL0V4dGVuZGVkUmVzb3VyY2VDb250ZXh0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZGM5MjQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9FeHRlbmRlZFJlc291cmNlQ29udGV4dFRlc3QuamF2YQpAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNb2RlbDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VUZXN0VXRpbHM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiBUZXN0IChAbGluayBFeHRlbmRlZFJlc291cmNlQ29udGV4dCBleHRlbmRlZCByZXNvdXJjZSBjb250ZXh0fS4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBFeHRlbmRlZFJlc291cmNlQ29udGV4dFRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoTGlzdDxSZXNvdXJjZT4gcmVzb3VyY2VzLCBTdHJpbmcgcGF0aCkgeworICAgICAgICBmb3IgKFJlc291cmNlIHJlc291cmNlIDogcmVzb3VyY2VzKSB7CisgICAgICAgICAgICBpZiAocmVzb3VyY2UuZ2V0UGF0aCgpLmVxdWFscyhwYXRoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXNvdXJjZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmYWlsKCJSZXNvdXJjZSB3aXRoIHBhdGggJyIgKyBwYXRoICsgIicgaXMgbm90IGluIHRoZSBsaXN0IG9mIHJlc291cmNlcyAiICsgcmVzb3VyY2VzICsgIiEiKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQFBhdGgoImEiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VBIHsKKyAgICAgICAgQENvbnRleHQKKyAgICAgICAgRXh0ZW5kZWRSZXNvdXJjZUNvbnRleHQgcmVzb3VyY2VDb250ZXh0OworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gImdldCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJjaGlsZCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgY2hpbGRHZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gImNoaWxkLWdldCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJtb2RlbCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgbW9kZWwoKSB7CisgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZU1vZGVsIHJlc291cmNlTW9kZWwgPSByZXNvdXJjZUNvbnRleHQuZ2V0UmVzb3VyY2VNb2RlbCgpOworICAgICAgICAgICAgZmluYWwgTGlzdDxSZXNvdXJjZT4gcmVzb3VyY2VzID0gcmVzb3VyY2VNb2RlbC5nZXRSb290UmVzb3VyY2VzKCk7CisgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZSBhID0gZ2V0UmVzb3VyY2UocmVzb3VyY2VzLCAiYSIpOworICAgICAgICAgICAgUmVzb3VyY2VUZXN0VXRpbHMuY29udGFpbnNNZXRob2QoYSwgIkdFVCIpOworICAgICAgICAgICAgUmVzb3VyY2VUZXN0VXRpbHMuY29udGFpbnNNZXRob2QoYSwgIlBPU1QiKTsKKworICAgICAgICAgICAgZmluYWwgUmVzb3VyY2UgYiA9IGdldFJlc291cmNlKHJlc291cmNlcywgImIiKTsKKyAgICAgICAgICAgIFJlc291cmNlVGVzdFV0aWxzLmNvbnRhaW5zTWV0aG9kKGIsICJHRVQiKTsKKworICAgICAgICAgICAgZmluYWwgUmVzb3VyY2UgcSA9IGdldFJlc291cmNlKHJlc291cmNlcywgImIiKTsKKyAgICAgICAgICAgIFJlc291cmNlVGVzdFV0aWxzLmNvbnRhaW5zTWV0aG9kKHEsICJHRVQiKTsKKworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMywgcmVzb3VyY2VzLnNpemUoKSk7CisKKyAgICAgICAgICAgIHJldHVybiAib2siOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAUGF0aCgiYSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZUFTZWNvbmQgeworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3QoU3RyaW5nIHBvc3QpIHsKKyAgICAgICAgICAgIHJldHVybiAicG9zdCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiYiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZUIgeworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJnZXQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiY2hpbGQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGNoaWxkR2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJjaGlsZC1nZXQiOworICAgICAgICB9CisgICAgfQorCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeHRlbmRlZFJlc291cmNlQ29udGV4dCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgQXBwbGljYXRpb25IYW5kbGVyIGFwcGxpY2F0aW9uSGFuZGxlciA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIobmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlQS5jbGFzcywgUmVzb3VyY2VBU2Vjb25kLmNsYXNzLAorICAgICAgICAgICAgICAgIFJlc291cmNlQi5jbGFzcykpOworICAgICAgICBmaW5hbCBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGFwcGxpY2F0aW9uSGFuZGxlci5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL2EvbW9kZWwiLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygib2siLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvSmFyVXRpbHMuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL0phclV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRiNGEyYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL0phclV0aWxzLmphdmEKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7CitpbXBvcnQgamF2YS51dGlsLmphci5KYXJPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLmphci5NYW5pZmVzdDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEphclV0aWxzIHsKKworICAgIHB1YmxpYyBlbnVtIFN1ZmZpeCB7CisgICAgICAgIGphciwgemlwCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBGaWxlIGNyZWF0ZUphckZpbGUoZmluYWwgU3RyaW5nIGJhc2UsIGZpbmFsIFN0cmluZy4uLiBlbnRyaWVzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gY3JlYXRlSmFyRmlsZShTdWZmaXguamFyLCBiYXNlLCBlbnRyaWVzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEZpbGUgY3JlYXRlSmFyRmlsZShmaW5hbCBTdWZmaXggcywgZmluYWwgU3RyaW5nIGJhc2UsIGZpbmFsIFN0cmluZy4uLiBlbnRyaWVzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudHJpZXNNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgZW50cnkgOiBlbnRyaWVzKSB7CisgICAgICAgICAgICBlbnRyaWVzTWFwLnB1dChlbnRyeSwgZW50cnkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjcmVhdGVKYXJGaWxlKHMsIGJhc2UsIGVudHJpZXNNYXApOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgRmlsZSBjcmVhdGVKYXJGaWxlKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdWZmaXggcywgZmluYWwgU3RyaW5nIGJhc2UsIGZpbmFsIFN0cmluZy4uLiBlbnRyaWVzKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBlbnRyaWVzTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIGVudHJ5IDogZW50cmllcykgeworICAgICAgICAgICAgZW50cmllc01hcC5wdXQoZW50cnksIGVudHJ5KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3JlYXRlSmFyRmlsZShuYW1lLCBzLCBiYXNlLCBlbnRyaWVzTWFwKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEZpbGUgY3JlYXRlSmFyRmlsZShmaW5hbCBTdWZmaXggcywgZmluYWwgU3RyaW5nIGJhc2UsIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gZW50cmllcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUphckZpbGUoInRlc3QiLCBzLCBiYXNlLCBlbnRyaWVzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEZpbGUgY3JlYXRlSmFyRmlsZShmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3VmZml4IHMsIGZpbmFsIFN0cmluZyBiYXNlLCBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IGVudHJpZXMpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBGaWxlIHRlbXBKYXIgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKG5hbWUsICIuIiArIHMpOworICAgICAgICB0ZW1wSmFyLmRlbGV0ZU9uRXhpdCgpOworICAgICAgICBmaW5hbCBKYXJPdXRwdXRTdHJlYW0gam9zID0gbmV3IEphck91dHB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICBuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZU91dHB1dFN0cmVhbSh0ZW1wSmFyKSksIG5ldyBNYW5pZmVzdCgpKTsKKworICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiB1c2VkU2VnbWVudHMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgICAgIGZvciAoZmluYWwgTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA6IGVudHJpZXMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgcGF0aCA6IGdldFBhdGhzKGVudHJ5LmdldFZhbHVlKCkpKSB7CisgICAgICAgICAgICAgICAgaWYgKHVzZWRTZWdtZW50cy5jb250YWlucyhwYXRoKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB1c2VkU2VnbWVudHMuYWRkKHBhdGgpOworICAgICAgICAgICAgICAgIGZpbmFsIEphckVudHJ5IGUgPSBuZXcgSmFyRW50cnkocGF0aCk7CisgICAgICAgICAgICAgICAgam9zLnB1dE5leHRFbnRyeShlKTsKKyAgICAgICAgICAgICAgICBqb3MuY2xvc2VFbnRyeSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBKYXJFbnRyeSBlID0gbmV3IEphckVudHJ5KGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICAgICAgam9zLnB1dE5leHRFbnRyeShlKTsKKworICAgICAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gZiA9IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKAorICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZUlucHV0U3RyZWFtKGJhc2UgKyBlbnRyeS5nZXRLZXkoKSkpOworICAgICAgICAgICAgZmluYWwgYnl0ZVtdIGJ1ZiA9IG5ldyBieXRlWzEwMjRdOworICAgICAgICAgICAgaW50IHJlYWQgPSAxMDI0OworICAgICAgICAgICAgd2hpbGUgKChyZWFkID0gZi5yZWFkKGJ1ZiwgMCwgcmVhZCkpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgam9zLndyaXRlKGJ1ZiwgMCwgcmVhZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBqb3MuY2xvc2VFbnRyeSgpOworICAgICAgICB9CisKKyAgICAgICAgam9zLmNsb3NlKCk7CisgICAgICAgIHJldHVybiB0ZW1wSmFyOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZ1tdIGdldFBhdGhzKGZpbmFsIFN0cmluZyBlbnRyeSkgeworICAgICAgICBmaW5hbCBTdHJpbmdbXSBzZWdtZW50cyA9IGVudHJ5LnNwbGl0KCIvIik7CisgICAgICAgIGZpbmFsIFN0cmluZ1tdIHBhdGhzID0gbmV3IFN0cmluZ1tzZWdtZW50cy5sZW5ndGggLSAxXTsKKworICAgICAgICBpZiAocGF0aHMubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBwYXRoczsKKyAgICAgICAgfQorCisgICAgICAgIHBhdGhzWzBdID0gc2VnbWVudHNbMF0gKyAiLyI7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgcGF0aHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIHBhdGhzW2ldID0gIiI7CisgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8PSBpOyBqKyspIHsKKyAgICAgICAgICAgICAgICBwYXRoc1tpXSArPSBzZWdtZW50c1tqXSArICIvIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBwYXRoczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmV2ZW50IGluc3RhbnRpYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBKYXJVdGlscygpIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9Nb2RlbFByb2Nlc3NvclNjb3BlVGVzdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvTW9kZWxQcm9jZXNzb3JTY29wZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjUwNzE0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvTW9kZWxQcm9jZXNzb3JTY29wZVRlc3QuamF2YQpAQCAtMCwwICsxLDI3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmVDb250ZXh0OworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qcmlvcml0eTsKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5JbmZsZWN0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLk1vZGVsUHJvY2Vzc29yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNb2RlbDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0IHNjb3BlIG9mIHJlc291cmNlcyBlbmhhbmNlZCBieSBtb2RlbCBwcm9jZXNzb3JzLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBNb2RlbFByb2Nlc3NvclNjb3BlVGVzdCB7CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNb2RlbFByb2Nlc3NvckZlYXR1cmUgaW1wbGVtZW50cyBGZWF0dXJlIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlKEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoU2ltcGxlTW9kZWxQcm9jZXNzb3IuY2xhc3MpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAUHJpb3JpdHkoNTAwMCkKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2ltcGxlTW9kZWxQcm9jZXNzb3IgaW1wbGVtZW50cyBNb2RlbFByb2Nlc3NvciB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFJlc291cmNlTW9kZWwgcHJvY2Vzc1Jlc291cmNlTW9kZWwoUmVzb3VyY2VNb2RlbCByZXNvdXJjZU1vZGVsLCBDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBSZXNvdXJjZU1vZGVsLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBSZXNvdXJjZU1vZGVsLkJ1aWxkZXIocmVzb3VyY2VNb2RlbC5nZXRSb290UmVzb3VyY2VzKCksIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZSBzaW5nbGV0b25SZXNvdXJjZSA9IFJlc291cmNlLmZyb20oU2luZ2xldG9uUmVzb3VyY2UuY2xhc3MpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkUmVzb3VyY2Uoc2luZ2xldG9uUmVzb3VyY2UpOworCisgICAgICAgICAgICAgICAgZmluYWwgUmVzb3VyY2UgcmVxdWVzdFNjb3BlUmVzb3VyY2UgPSBSZXNvdXJjZS5mcm9tKFJlcXVlc3RTY29wZVJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFkZFJlc291cmNlKHJlcXVlc3RTY29wZVJlc291cmNlKTsKKworICAgICAgICAgICAgICAgIGZpbmFsIFJlc291cmNlLkJ1aWxkZXIgcmVzb3VyY2VCdWlsZGVyID0gUmVzb3VyY2UuYnVpbGRlcigiaW5zdGFuY2UiKTsKKyAgICAgICAgICAgICAgICByZXNvdXJjZUJ1aWxkZXIuYWRkTWV0aG9kKCJHRVQiKS5oYW5kbGVkQnkobmV3IEluZmxlY3RvcjxDb250YWluZXJSZXF1ZXN0Q29udGV4dCwgU3RyaW5nPigpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBpbnQgY291bnRlciA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgYXBwbHkoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgY29udGFpbmVyUmVxdWVzdENvbnRleHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZigiSW5mbGVjdG9yOiIgKyBjb3VudGVyKyspOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgZmluYWwgUmVzb3VyY2UgaW5zdGFuY2VSZXNvdXJjZSA9IHJlc291cmNlQnVpbGRlci5idWlsZCgpOworCisgICAgICAgICAgICAgICAgYnVpbGRlci5hZGRSZXNvdXJjZShpbnN0YW5jZVJlc291cmNlKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFJlc291cmNlTW9kZWwgcHJvY2Vzc1N1YlJlc291cmNlKFJlc291cmNlTW9kZWwgc3ViUmVzb3VyY2UsIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgeworICAgICAgICAgICAgICAgIGZpbmFsIFJlc291cmNlIHJlc291cmNlID0gUmVzb3VyY2UuYnVpbGRlcigpLm1lcmdlV2l0aChSZXNvdXJjZS5mcm9tKEVuaGFuY2VkU3ViUmVzb3VyY2VTaW5nbGV0b24uY2xhc3MpKQorICAgICAgICAgICAgICAgICAgICAgICAgLm1lcmdlV2l0aChSZXNvdXJjZS5mcm9tKEVuaGFuY2VkU3ViUmVzb3VyY2UuY2xhc3MpKS5tZXJnZVdpdGgoc3ViUmVzb3VyY2UuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApKS5idWlsZCgpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZU1vZGVsLkJ1aWxkZXIodHJ1ZSkuYWRkUmVzb3VyY2UocmVzb3VyY2UpLmJ1aWxkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgicmVxdWVzdC1zY29wZSIpCisgICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVxdWVzdFNjb3BlUmVzb3VyY2UgeworICAgICAgICAgICAgcHJpdmF0ZSBpbnQgY291bnRlciA9IDA7CisKKyAgICAgICAgICAgIEBHRVQKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZigiUmVxdWVzdFNjb3BlUmVzb3VyY2U6IiArIGNvdW50ZXIrKyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgic2luZ2xldG9uIikKKyAgICAgICAgQFNpbmdsZXRvbgorICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNpbmdsZXRvblJlc291cmNlIHsKKyAgICAgICAgICAgIHByaXZhdGUgaW50IGNvdW50ZXIgPSAwOworCisgICAgICAgICAgICBAR0VUCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLnZhbHVlT2YoIlNpbmdsZXRvblJlc291cmNlOiIgKyBjb3VudGVyKyspOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInJvb3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUm9vdFJlc291cmNlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAicm9vdCI7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgic3ViLXJlc291cmNlLXNpbmdsZXRvbiIpCisgICAgICAgIHB1YmxpYyBDbGFzczxTdWJSZXNvdXJjZVNpbmdsZXRvbj4gZ2V0U3ViUmVzb3VyY2VTaW5nbGV0b24oKSB7CisgICAgICAgICAgICByZXR1cm4gU3ViUmVzb3VyY2VTaW5nbGV0b24uY2xhc3M7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgic3ViLXJlc291cmNlLWluc3RhbmNlIikKKyAgICAgICAgcHVibGljIFN1YlJlc291cmNlU2luZ2xldG9uIGdldFN1YlJlc291cmNlU2luZ2xldG9uSW5zdGFuY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN1YlJlc291cmNlU2luZ2xldG9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAU2luZ2xldG9uCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdWJSZXNvdXJjZVNpbmdsZXRvbiB7CisgICAgICAgIHByaXZhdGUgaW50IGNvdW50ZXIgPSAwOworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gU3RyaW5nLnZhbHVlT2YoIlN1YlJlc291cmNlU2luZ2xldG9uOiIgKyBjb3VudGVyKyspOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFbmhhbmNlZFN1YlJlc291cmNlIHsKKyAgICAgICAgcHJpdmF0ZSBpbnQgY291bnRlciA9IDA7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiZW5oYW5jZWQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZigiRW5oYW5jZWRTdWJSZXNvdXJjZToiICsgY291bnRlcisrKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBTaW5nbGV0b24KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEVuaGFuY2VkU3ViUmVzb3VyY2VTaW5nbGV0b24geworICAgICAgICBwcml2YXRlIGludCBjb3VudGVyID0gMDsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJlbmhhbmNlZC1zaW5nbGV0b24iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiRW5oYW5jZWRTdWJSZXNvdXJjZVNpbmdsZXRvbjoiICsgU3RyaW5nLnZhbHVlT2YoY291bnRlcisrKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJyb290LXNpbmdsZXRvbiIpCisgICAgQFNpbmdsZXRvbgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUm9vdFNpbmdsZXRvblJlc291cmNlIHsKKyAgICAgICAgcHJpdmF0ZSBpbnQgY291bnRlciA9IDA7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiUm9vdFNpbmdsZXRvblJlc291cmNlOiIgKyBTdHJpbmcudmFsdWVPZihjb3VudGVyKyspOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0Q291bnRlcihBcHBsaWNhdGlvbkhhbmRsZXIgYXBwbGljYXRpb25IYW5kbGVyLCBTdHJpbmcgcmVxdWVzdFVyaSwgZmluYWwgU3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZFNlY29uZEhpdCkgdGhyb3dzCisgICAgICAgICAgICBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBhcHBsaWNhdGlvbkhhbmRsZXIuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20ocmVxdWVzdFVyaSwKKyAgICAgICAgICAgICAgICAiR0VUIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHByZWZpeCArICI6MCIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICAgICAgcmVzcG9uc2UgPSBhcHBsaWNhdGlvbkhhbmRsZXIuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20ocmVxdWVzdFVyaSwKKyAgICAgICAgICAgICAgICAiR0VUIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhwcmVmaXggKyAiOiIgKyBleHBlY3RlZFNlY29uZEhpdCwgcmVzcG9uc2UuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZXRvbigpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgQXBwbGljYXRpb25IYW5kbGVyIGFwcGxpY2F0aW9uSGFuZGxlciA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIobmV3IFJlc291cmNlQ29uZmlnKE1vZGVsUHJvY2Vzc29yRmVhdHVyZQorICAgICAgICAgICAgICAgIC5TaW5nbGV0b25SZXNvdXJjZS5jbGFzcykpOworICAgICAgICBmaW5hbCBTdHJpbmcgcmVxdWVzdFVyaSA9ICIvc2luZ2xldG9uIjsKKyAgICAgICAgX3Rlc3RDb3VudGVyKGFwcGxpY2F0aW9uSGFuZGxlciwgcmVxdWVzdFVyaSwgIlNpbmdsZXRvblJlc291cmNlIiwgIjEiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGV0b25Jbk1vZGVsUHJvY2Vzc29yKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwbGljYXRpb25IYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihuZXcgUmVzb3VyY2VDb25maWcoUm9vdFJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIE1vZGVsUHJvY2Vzc29yRmVhdHVyZS5jbGFzcykpOworICAgICAgICBmaW5hbCBTdHJpbmcgcmVxdWVzdFVyaSA9ICIvc2luZ2xldG9uIjsKKyAgICAgICAgX3Rlc3RDb3VudGVyKGFwcGxpY2F0aW9uSGFuZGxlciwgcmVxdWVzdFVyaSwgIlNpbmdsZXRvblJlc291cmNlIiwgIjEiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJSZXNvdXJjZVNpbmdsZXRvbkluT3JpZ2luYWxNb2RlbCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgQXBwbGljYXRpb25IYW5kbGVyIGFwcGxpY2F0aW9uSGFuZGxlciA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIobmV3IFJlc291cmNlQ29uZmlnKFJvb3RSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBNb2RlbFByb2Nlc3NvckZlYXR1cmUuY2xhc3MpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlcXVlc3RVcmkgPSAiL3Jvb3Qvc3ViLXJlc291cmNlLXNpbmdsZXRvbiI7CisgICAgICAgIF90ZXN0Q291bnRlcihhcHBsaWNhdGlvbkhhbmRsZXIsIHJlcXVlc3RVcmksICJTdWJSZXNvdXJjZVNpbmdsZXRvbiIsICIxIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3ViUmVzb3VyY2VFbmhhbmNlZFNpbmdsZXRvbigpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgQXBwbGljYXRpb25IYW5kbGVyIGFwcGxpY2F0aW9uSGFuZGxlciA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIobmV3IFJlc291cmNlQ29uZmlnKFJvb3RSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBNb2RlbFByb2Nlc3NvckZlYXR1cmUuY2xhc3MpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlcXVlc3RVcmkgPSAiL3Jvb3Qvc3ViLXJlc291cmNlLXNpbmdsZXRvbi9lbmhhbmNlZC1zaW5nbGV0b24iOworICAgICAgICBfdGVzdENvdW50ZXIoYXBwbGljYXRpb25IYW5kbGVyLCByZXF1ZXN0VXJpLCAiRW5oYW5jZWRTdWJSZXNvdXJjZVNpbmdsZXRvbiIsICIxIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3ViUmVzb3VyY2VJbnN0YW5jZUVuaGFuY2VkU2luZ2xldG9uKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwbGljYXRpb25IYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihuZXcgUmVzb3VyY2VDb25maWcoUm9vdFJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIE1vZGVsUHJvY2Vzc29yRmVhdHVyZS5jbGFzcykpOworICAgICAgICBmaW5hbCBTdHJpbmcgcmVxdWVzdFVyaSA9ICIvcm9vdC9zdWItcmVzb3VyY2UtaW5zdGFuY2UvZW5oYW5jZWQtc2luZ2xldG9uIjsKKyAgICAgICAgX3Rlc3RDb3VudGVyKGFwcGxpY2F0aW9uSGFuZGxlciwgcmVxdWVzdFVyaSwgIkVuaGFuY2VkU3ViUmVzb3VyY2VTaW5nbGV0b24iLCAiMSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN1YlJlc291cmNlSW5zdGFuY2VFbmhhbmNlZFN1YlJlc291cmNlKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwbGljYXRpb25IYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihuZXcgUmVzb3VyY2VDb25maWcoUm9vdFJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIE1vZGVsUHJvY2Vzc29yRmVhdHVyZS5jbGFzcykpOworICAgICAgICBmaW5hbCBTdHJpbmcgcmVxdWVzdFVyaSA9ICIvcm9vdC9zdWItcmVzb3VyY2UtaW5zdGFuY2UvZW5oYW5jZWQiOworICAgICAgICBfdGVzdENvdW50ZXIoYXBwbGljYXRpb25IYW5kbGVyLCByZXF1ZXN0VXJpLCAiRW5oYW5jZWRTdWJSZXNvdXJjZSIsICIwIik7CisgICAgfQorCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJSZXNvdXJjZUVuaGFuY2VkU3ViUmVzb3VyY2UoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbkhhbmRsZXIgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKG5ldyBSZXNvdXJjZUNvbmZpZyhSb290UmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgTW9kZWxQcm9jZXNzb3JGZWF0dXJlLmNsYXNzKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXF1ZXN0VXJpID0gIi9yb290L3N1Yi1yZXNvdXJjZS1zaW5nbGV0b24vZW5oYW5jZWQiOworICAgICAgICBfdGVzdENvdW50ZXIoYXBwbGljYXRpb25IYW5kbGVyLCByZXF1ZXN0VXJpLCAiRW5oYW5jZWRTdWJSZXNvdXJjZSIsICIwIik7CisgICAgfQorCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YW5jZUluTW9kZWxQcm9jZXNzb3IoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbkhhbmRsZXIgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKG5ldyBSZXNvdXJjZUNvbmZpZyhSb290UmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgTW9kZWxQcm9jZXNzb3JGZWF0dXJlLmNsYXNzKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXF1ZXN0VXJpID0gIi9pbnN0YW5jZSI7CisgICAgICAgIF90ZXN0Q291bnRlcihhcHBsaWNhdGlvbkhhbmRsZXIsIHJlcXVlc3RVcmksICJJbmZsZWN0b3IiLCAiMSIpOworICAgIH0KKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Um9vdFNpbmdsZXRvbigpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgQXBwbGljYXRpb25IYW5kbGVyIGFwcGxpY2F0aW9uSGFuZGxlciA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIobmV3IFJlc291cmNlQ29uZmlnKFJvb3RSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBSb290U2luZ2xldG9uUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgTW9kZWxQcm9jZXNzb3JGZWF0dXJlLmNsYXNzKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXF1ZXN0VXJpID0gIi9yb290LXNpbmdsZXRvbiI7CisgICAgICAgIF90ZXN0Q291bnRlcihhcHBsaWNhdGlvbkhhbmRsZXIsIHJlcXVlc3RVcmksICJSb290U2luZ2xldG9uUmVzb3VyY2UiLCAiMSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcXVlc3RTY29wZVJlc291cmNlKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwbGljYXRpb25IYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihuZXcgUmVzb3VyY2VDb25maWcoUm9vdFJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIFJvb3RTaW5nbGV0b25SZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBNb2RlbFByb2Nlc3NvckZlYXR1cmUuY2xhc3MpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlcXVlc3RVcmkgPSAiL3JlcXVlc3Qtc2NvcGUiOworICAgICAgICBfdGVzdENvdW50ZXIoYXBwbGljYXRpb25IYW5kbGVyLCByZXF1ZXN0VXJpLCAiUmVxdWVzdFNjb3BlUmVzb3VyY2UiLCAiMCIpOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9SZXF1ZXN0Q29udGV4dEJ1aWxkZXIuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL1JlcXVlc3RDb250ZXh0QnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMDk0MDcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9SZXF1ZXN0Q29udGV4dEJ1aWxkZXIuamF2YQpAQCAtMCwwICsxLDIwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db29raWU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY1R5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkSGFzaE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuU2VjdXJpdHlDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SdW50aW1lRGVsZWdhdGU7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuTWFwUHJvcGVydGllc0RlbGVnYXRlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLlByb3BlcnRpZXNEZWxlZ2F0ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLk1lc3NhZ2VCb2R5V29ya2VyczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkhlYWRlclV0aWxzOworCisvKioKKyAqIFVzZWQgYnkgdGVzdHMgdG8gY3JlYXRlIG1vY2sgSmVyc2V5Q29udGFpbmVyUmVxdWVzdENvbnRleHQgaW5zdGFuY2VzLgorICoKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitwdWJsaWMgY2xhc3MgUmVxdWVzdENvbnRleHRCdWlsZGVyIHsKKworICAgIHB1YmxpYyBjbGFzcyBUZXN0Q29udGFpbmVyUmVxdWVzdCBleHRlbmRzIENvbnRhaW5lclJlcXVlc3QgeworCisgICAgICAgIHByaXZhdGUgT2JqZWN0IGVudGl0eTsKKyAgICAgICAgcHJpdmF0ZSBHZW5lcmljVHlwZSBlbnRpdHlUeXBlOworICAgICAgICBwcml2YXRlIGZpbmFsIFByb3BlcnRpZXNEZWxlZ2F0ZSBwcm9wZXJ0aWVzRGVsZWdhdGU7CisKKyAgICAgICAgcHVibGljIFRlc3RDb250YWluZXJSZXF1ZXN0KGZpbmFsIFVSSSBiYXNlVXJpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVVJJIHJlcXVlc3RVcmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU2VjdXJpdHlDb250ZXh0IHNlY3VyaXR5Q29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFByb3BlcnRpZXNEZWxlZ2F0ZSBwcm9wZXJ0aWVzRGVsZWdhdGUpIHsKKyAgICAgICAgICAgIHN1cGVyKGJhc2VVcmksIHJlcXVlc3RVcmksIG1ldGhvZCwgc2VjdXJpdHlDb250ZXh0LCBwcm9wZXJ0aWVzRGVsZWdhdGUpOworICAgICAgICAgICAgdGhpcy5wcm9wZXJ0aWVzRGVsZWdhdGUgPSBwcm9wZXJ0aWVzRGVsZWdhdGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRFbnRpdHkoZmluYWwgT2JqZWN0IGVudGl0eSkgeworICAgICAgICAgICAgaWYgKGVudGl0eSBpbnN0YW5jZW9mIEdlbmVyaWNFbnRpdHkpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmVudGl0eSA9ICgoR2VuZXJpY0VudGl0eSkgZW50aXR5KS5nZXRFbnRpdHkoKTsKKyAgICAgICAgICAgICAgICB0aGlzLmVudGl0eVR5cGUgPSBuZXcgR2VuZXJpY1R5cGUoKChHZW5lcmljRW50aXR5KSBlbnRpdHkpLmdldFR5cGUoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRoaXMuZW50aXR5ID0gZW50aXR5OworICAgICAgICAgICAgICAgIHRoaXMuZW50aXR5VHlwZSA9IG5ldyBHZW5lcmljVHlwZShlbnRpdHkuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0V29ya2VycyhmaW5hbCBNZXNzYWdlQm9keVdvcmtlcnMgd29ya2VycykgeworICAgICAgICAgICAgc3VwZXIuc2V0V29ya2Vycyh3b3JrZXJzKTsKKyAgICAgICAgICAgIGZpbmFsIGJ5dGVbXSBlbnRpdHlCeXRlczsKKyAgICAgICAgICAgIGlmIChlbnRpdHkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBteU1hcCA9IG5ldyBNdWx0aXZhbHVlZEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KGdldEhlYWRlcnMoKSk7CisgICAgICAgICAgICAgICAgZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtID0gd29ya2Vycy53cml0ZVRvKGVudGl0eSwgZW50aXR5LmdldENsYXNzKCksIGVudGl0eVR5cGUuZ2V0VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBbm5vdGF0aW9uWzBdLCBnZXRNZWRpYVR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBteU1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzRGVsZWdhdGUsIGJhb3MsIENvbGxlY3Rpb25zLjxXcml0ZXJJbnRlcmNlcHRvcj5lbXB0eUxpc3QoKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gfCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKFRlc3RDb250YWluZXJSZXF1ZXN0LmNsYXNzLmdldE5hbWUoKSkubG9nKExldmVsLlNFVkVSRSwgbnVsbCwgZXgpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbnRpdHlCeXRlcyA9IGJhb3MudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZW50aXR5Qnl0ZXMgPSBuZXcgYnl0ZVswXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldEVudGl0eVN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZW50aXR5Qnl0ZXMpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgUnVudGltZURlbGVnYXRlIGRlbGVnYXRlID0gUnVudGltZURlbGVnYXRlLmdldEluc3RhbmNlKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBUZXN0Q29udGFpbmVyUmVxdWVzdCByZXF1ZXN0OworCisgICAgcHVibGljIHN0YXRpYyBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIgZnJvbShmaW5hbCBTdHJpbmcgcmVxdWVzdFVyaSwgZmluYWwgU3RyaW5nIG1ldGhvZCkgeworICAgICAgICByZXR1cm4gZnJvbShudWxsLCByZXF1ZXN0VXJpLCBtZXRob2QpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUmVxdWVzdENvbnRleHRCdWlsZGVyIGZyb20oZmluYWwgU3RyaW5nIGJhc2VVcmksIGZpbmFsIFN0cmluZyByZXF1ZXN0VXJpLCBmaW5hbCBTdHJpbmcgbWV0aG9kKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVxdWVzdENvbnRleHRCdWlsZGVyKGJhc2VVcmksIHJlcXVlc3RVcmksIG1ldGhvZCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIgZnJvbShmaW5hbCBVUkkgcmVxdWVzdFVyaSwgZmluYWwgU3RyaW5nIG1ldGhvZCkgeworICAgICAgICByZXR1cm4gZnJvbShudWxsLCByZXF1ZXN0VXJpLCBtZXRob2QpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUmVxdWVzdENvbnRleHRCdWlsZGVyIGZyb20oZmluYWwgVVJJIGJhc2VVcmksIGZpbmFsIFVSSSByZXF1ZXN0VXJpLCBmaW5hbCBTdHJpbmcgbWV0aG9kKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVxdWVzdENvbnRleHRCdWlsZGVyKGJhc2VVcmksIHJlcXVlc3RVcmksIG1ldGhvZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIoZmluYWwgU3RyaW5nIGJhc2VVcmksIGZpbmFsIFN0cmluZyByZXF1ZXN0VXJpLCBmaW5hbCBTdHJpbmcgbWV0aG9kKSB7CisgICAgICAgIHRoaXMoYmFzZVVyaSA9PSBudWxsIHx8IGJhc2VVcmkuaXNFbXB0eSgpID8gbnVsbCA6IFVSSS5jcmVhdGUoYmFzZVVyaSksIFVSSS5jcmVhdGUocmVxdWVzdFVyaSksIG1ldGhvZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIoZmluYWwgVVJJIGJhc2VVcmksIGZpbmFsIFVSSSByZXF1ZXN0VXJpLCBmaW5hbCBTdHJpbmcgbWV0aG9kKSB7CisgICAgICAgIHJlcXVlc3QgPSBuZXcgVGVzdENvbnRhaW5lclJlcXVlc3QoYmFzZVVyaSwgcmVxdWVzdFVyaSwgbWV0aG9kLCBudWxsLAorICAgICAgICAgICAgICAgIG5ldyBNYXBQcm9wZXJ0aWVzRGVsZWdhdGUoKSk7CisgICAgfQorCisgICAgcHVibGljIENvbnRhaW5lclJlcXVlc3QgYnVpbGQoKSB7CisgICAgICAgIHJldHVybiByZXF1ZXN0OworICAgIH0KKworICAgIHB1YmxpYyBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIgYWNjZXB0KGZpbmFsIFN0cmluZy4uLiBhY2NlcHRIZWFkZXIpIHsKKyAgICAgICAgcHV0SGVhZGVycyhIdHRwSGVhZGVycy5BQ0NFUFQsIGFjY2VwdEhlYWRlcik7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIgYWNjZXB0KGZpbmFsIE1lZGlhVHlwZS4uLiBhY2NlcHRIZWFkZXIpIHsKKyAgICAgICAgcHV0SGVhZGVycyhIdHRwSGVhZGVycy5BQ0NFUFQsIChPYmplY3RbXSkgYWNjZXB0SGVhZGVyKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFJlcXVlc3RDb250ZXh0QnVpbGRlciBlbnRpdHkoZmluYWwgT2JqZWN0IGVudGl0eSkgeworICAgICAgICByZXF1ZXN0LnNldEVudGl0eShlbnRpdHkpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVxdWVzdENvbnRleHRCdWlsZGVyIHR5cGUoZmluYWwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7CisgICAgICAgIHJlcXVlc3QuZ2V0SGVhZGVycygpLnB1dFNpbmdsZShIdHRwSGVhZGVycy5DT05URU5UX1RZUEUsIGNvbnRlbnRUeXBlKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICB9CisKKyAgICBwdWJsaWMgUmVxdWVzdENvbnRleHRCdWlsZGVyIHR5cGUoZmluYWwgTWVkaWFUeXBlIGNvbnRlbnRUeXBlKSB7CisgICAgICAgIHJlcXVlc3QuZ2V0SGVhZGVycygpLnB1dFNpbmdsZShIdHRwSGVhZGVycy5DT05URU5UX1RZUEUsIEhlYWRlclV0aWxzLmFzU3RyaW5nKGNvbnRlbnRUeXBlLCBkZWxlZ2F0ZSkpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVxdWVzdENvbnRleHRCdWlsZGVyIGhlYWRlcihmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIHB1dEhlYWRlcihuYW1lLCB2YWx1ZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIgY29va2llKGZpbmFsIENvb2tpZSBjb29raWUpIHsKKyAgICAgICAgcHV0SGVhZGVyKEh0dHBIZWFkZXJzLkNPT0tJRSwgY29va2llKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFJlcXVlc3RDb250ZXh0QnVpbGRlciBjb29raWVzKGZpbmFsIENvb2tpZS4uLiBjb29raWVzKSB7CisgICAgICAgIHB1dEhlYWRlcnMoSHR0cEhlYWRlcnMuQ09PS0lFLCAoT2JqZWN0W10pIGNvb2tpZXMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHV0SGVhZGVyKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlcXVlc3QuZ2V0SGVhZGVycygpLnJlbW92ZShuYW1lKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICByZXF1ZXN0LmhlYWRlcihuYW1lLCBIZWFkZXJVdGlscy5hc1N0cmluZyh2YWx1ZSwgZGVsZWdhdGUpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHV0SGVhZGVycyhmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgT2JqZWN0Li4uIHZhbHVlcykgeworICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlcXVlc3QuZ2V0SGVhZGVycygpLnJlbW92ZShuYW1lKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICByZXF1ZXN0LmdldEhlYWRlcnMoKS5hZGRBbGwobmFtZSwgSGVhZGVyVXRpbHMuYXNTdHJpbmdMaXN0KEFycmF5cy5hc0xpc3QodmFsdWVzKSwgZGVsZWdhdGUpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHV0SGVhZGVycyhmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nLi4uIHZhbHVlcykgeworICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlcXVlc3QuZ2V0SGVhZGVycygpLnJlbW92ZShuYW1lKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICByZXF1ZXN0LmdldEhlYWRlcnMoKS5hZGRBbGwobmFtZSwgdmFsdWVzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9SZXNvdXJjZUNvbmZpZ0J1aWxkZXJUZXN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9SZXNvdXJjZUNvbmZpZ0J1aWxkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYxNDA5OQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL1Jlc291cmNlQ29uZmlnQnVpbGRlclRlc3QuamF2YQpAQCAtMCwwICsxLDE2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SZWFkZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNvdXJjZUNvbmZpZ0J1aWxkZXJUZXN0IHsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eSgpIHsKKyAgICAgICAgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoKTsKKworICAgICAgICBhc3NlcnRUcnVlKHJlc291cmNlQ29uZmlnLmdldENsYXNzZXMoKSAhPSBudWxsKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXNvdXJjZUNvbmZpZy5nZXRDbGFzc2VzKCkuaXNFbXB0eSgpKTsKKworICAgICAgICBhc3NlcnRUcnVlKHJlc291cmNlQ29uZmlnLmdldFNpbmdsZXRvbnMoKSAhPSBudWxsKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXNvdXJjZUNvbmZpZy5nZXRTaW5nbGV0b25zKCkuaXNFbXB0eSgpKTsKKworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsYXNzZXMoKSB7CisgICAgICAgIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlQ29uZmlnQnVpbGRlclRlc3QuY2xhc3MpOworCisgICAgICAgIGFzc2VydFRydWUocmVzb3VyY2VDb25maWcuZ2V0Q2xhc3NlcygpICE9IG51bGwpOworICAgICAgICBhc3NlcnRUcnVlKHJlc291cmNlQ29uZmlnLmdldENsYXNzZXMoKS5zaXplKCkgPT0gMSk7CisgICAgICAgIGFzc2VydFRydWUocmVzb3VyY2VDb25maWcuZ2V0Q2xhc3NlcygpLmNvbnRhaW5zKFJlc291cmNlQ29uZmlnQnVpbGRlclRlc3QuY2xhc3MpKTsKKworICAgICAgICBhc3NlcnRUcnVlKHJlc291cmNlQ29uZmlnLmdldFNpbmdsZXRvbnMoKSAhPSBudWxsKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXNvdXJjZUNvbmZpZy5nZXRTaW5nbGV0b25zKCkuaXNFbXB0eSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGV0b25zKCkgeworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZ0J1aWxkZXJUZXN0IHJlc291cmNlQ29uZmlnQnVpbGRlclRlc3QgPSBuZXcgUmVzb3VyY2VDb25maWdCdWlsZGVyVGVzdCgpOworCisgICAgICAgIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKCkucmVnaXN0ZXJJbnN0YW5jZXMocmVzb3VyY2VDb25maWdCdWlsZGVyVGVzdCk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXNvdXJjZUNvbmZpZy5nZXRDbGFzc2VzKCkgIT0gbnVsbCk7CisgICAgICAgIGFzc2VydFRydWUocmVzb3VyY2VDb25maWcuZ2V0Q2xhc3NlcygpLmlzRW1wdHkoKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXNvdXJjZUNvbmZpZy5nZXRTaW5nbGV0b25zKCkgIT0gbnVsbCk7CisgICAgICAgIGFzc2VydFRydWUocmVzb3VyY2VDb25maWcuZ2V0U2luZ2xldG9ucygpLnNpemUoKSA9PSAxKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXNvdXJjZUNvbmZpZy5nZXRTaW5nbGV0b25zKCkuY29udGFpbnMocmVzb3VyY2VDb25maWdCdWlsZGVyVGVzdCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFwcGxpY2F0aW9uKCkgeworICAgICAgICBmaW5hbCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uID0gbmV3IEFwcGxpY2F0aW9uKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRDbGFzc2VzKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFNldDxPYmplY3Q+IGdldFNpbmdsZXRvbnMoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmdldFNpbmdsZXRvbnMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBBcHBsaWNhdGlvbkhhbmRsZXIgYWggPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKGFwcGxpY2F0aW9uKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShhaC5nZXRJbmplY3Rpb25NYW5hZ2VyKCkuZ2V0SW5zdGFuY2UoQXBwbGljYXRpb24uY2xhc3MpLmVxdWFscyhhcHBsaWNhdGlvbikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHRlc3QgdGhhdCBJIGNhbiBpbml0aWFsaXplIHJlc291cmNlIGNvbmZpZyB3aXRoIGFwcGxpY2F0aW9uIGNsYXNzIGluc3RlYWQgb2YgYW4gYXBwbGljYXRpb24gaW5zdGFuY2UKKyAgICAgKiBhbmQgdGhlbiByZWFkIHRoZSBhcHAgcHJvcGVydGllcworICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFwcGxpY2F0aW9uQ2xhc3NQcm9wZXJ0aWVzKCkgeworICAgICAgICBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IGluaXRBcHAoTXlBcHBsaWNhdGlvbi5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXNvdXJjZUNvbmZpZy5nZXRQcm9wZXJ0aWVzKCkuY29udGFpbnNLZXkoIm15UHJvcGVydHkiKSk7CisgICAgICAgIGFzc2VydFRydWUocmVzb3VyY2VDb25maWcuZ2V0UHJvcGVydGllcygpLmdldCgibXlQcm9wZXJ0eSIpLmVxdWFscygibXlWYWx1ZSIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB0ZXN0IHRoYXQgSSBjYW4gaW5pdGlhbGl6ZSByZXNvdXJjZSBjb25maWcgd2l0aCBhcHBsaWNhdGlvbiBjbGFzcyBpbnN0ZWFkIG9mIGFuIGFwcGxpY2F0aW9uIGluc3RhbmNlCisgICAgICogYW5kIHRoZW4gcmVhZCB0aGUgYXBwIGNsYXNzZXMKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBsaWNhdGlvbkNsYXNzQ2xhc3NlcygpIHsKKyAgICAgICAgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBpbml0QXBwKE15QXBwbGljYXRpb24yLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRUcnVlKCFyZXNvdXJjZUNvbmZpZy5nZXRDbGFzc2VzKCkuaXNFbXB0eSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNeUFwcGxpY2F0aW9uIGV4dGVuZHMgUmVzb3VyY2VDb25maWcgeworICAgICAgICBwdWJsaWMgTXlBcHBsaWNhdGlvbigpIHsKKyAgICAgICAgICAgIHByb3BlcnR5KCJteVByb3BlcnR5IiwgIm15VmFsdWUiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlBcHBsaWNhdGlvbjIgZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisgICAgICAgIHB1YmxpYyBNeUFwcGxpY2F0aW9uMigpIHsKKyAgICAgICAgICAgIHN1cGVyKE15UmVzb3VyY2UuY2xhc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15UmVzb3VyY2UgeworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SXQoKSB7CisgICAgICAgICAgICByZXR1cm4gImdldCBpdCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUNvbmZpZyBpbml0QXBwKENsYXNzPD8gZXh0ZW5kcyBBcHBsaWNhdGlvbj4gYXBwQ2xhc3MpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIoYXBwQ2xhc3MpLmdldENvbmZpZ3VyYXRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RQcm92aWRlciBpbXBsZW1lbnRzIFJlYWRlckludGVyY2VwdG9yIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE9iamVjdCBhcm91bmRSZWFkRnJvbShSZWFkZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5wcm9jZWVkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBSZXByb2R1Y2VyIEpFUlNFWS0xNjM3CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVnaXN0ZXJOdWxsT3JFbXB0eUNvbnRyYWN0cygpIHsKKyAgICAgICAgZmluYWwgVGVzdFByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IFRlc3RQcm92aWRlcigpOworCisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKCk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVyKFRlc3RQcm92aWRlci5jbGFzcywgKENsYXNzPD8+W10pIG51bGwpOworICAgICAgICBhc3NlcnRGYWxzZShyZXNvdXJjZUNvbmZpZy5nZXRDb25maWd1cmF0aW9uKCkuaXNSZWdpc3RlcmVkKFRlc3RQcm92aWRlci5jbGFzcykpOworCisgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVyKHByb3ZpZGVyLCAgKENsYXNzPD8+W10pIG51bGwpOworICAgICAgICBhc3NlcnRGYWxzZShyZXNvdXJjZUNvbmZpZy5nZXRDb25maWd1cmF0aW9uKCkuaXNSZWdpc3RlcmVkKFRlc3RQcm92aWRlci5jbGFzcykpOworICAgICAgICBhc3NlcnRGYWxzZShyZXNvdXJjZUNvbmZpZy5nZXRDb25maWd1cmF0aW9uKCkuaXNSZWdpc3RlcmVkKHByb3ZpZGVyKSk7CisKKyAgICAgICAgcmVzb3VyY2VDb25maWcucmVnaXN0ZXIoVGVzdFByb3ZpZGVyLmNsYXNzLCAgbmV3IENsYXNzWzBdKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocmVzb3VyY2VDb25maWcuZ2V0Q29uZmlndXJhdGlvbigpLmlzUmVnaXN0ZXJlZChUZXN0UHJvdmlkZXIuY2xhc3MpKTsKKworICAgICAgICByZXNvdXJjZUNvbmZpZy5yZWdpc3Rlcihwcm92aWRlciwgIG5ldyBDbGFzc1swXSk7CisgICAgICAgIGFzc2VydEZhbHNlKHJlc291cmNlQ29uZmlnLmdldENvbmZpZ3VyYXRpb24oKS5pc1JlZ2lzdGVyZWQoVGVzdFByb3ZpZGVyLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHJlc291cmNlQ29uZmlnLmdldENvbmZpZ3VyYXRpb24oKS5pc1JlZ2lzdGVyZWQocHJvdmlkZXIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9SZXNvdXJjZUNvbmZpZ1Rlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL1Jlc291cmNlQ29uZmlnVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmNGVlOTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9SZXNvdXJjZUNvbmZpZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDQwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQWJzdHJhY3RCaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5Ub2tlbml6ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW9kZWwuaW50ZXJuYWwuQ29tcG9uZW50QmFnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5jb25maWcuaW5uZXJzdGF0aWMuSW5uZXJTdGF0aWNDbGFzczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuY29uZmlnLnRvcGxldmVsLlB1YmxpY1Jvb3RSZXNvdXJjZUNsYXNzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5jb25maWcudG9wbGV2ZWxpbm5lcnN0YXRpYy5QdWJsaWNSb290UmVzb3VyY2VJbm5lclN0YXRpY0NsYXNzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5zY2FubmluZy5QYWNrYWdlTmFtZXNTY2FubmVyOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5KYXJVdGlscy5jcmVhdGVKYXJGaWxlOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmhhc0l0ZW07CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBtb2NraXQuTW9ja2VkOworaW1wb3J0IG1vY2tpdC5WZXJpZmljYXRpb25zOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNvdXJjZUNvbmZpZ1Rlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RWxlbWVudHNEZWZhdWx0MSgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nW10gZWxlbWVudHMgPSBUb2tlbml6ZXIudG9rZW5pemUobmV3IFN0cmluZ1tdIHsiYSBiLGM7ZFxuZSJ9KTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoZWxlbWVudHNbMF0sICJhIik7CisgICAgICAgIGFzc2VydEVxdWFscyhlbGVtZW50c1sxXSwgImIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGVsZW1lbnRzWzJdLCAiYyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZWxlbWVudHNbM10sICJkIik7CisgICAgICAgIGFzc2VydEVxdWFscyhlbGVtZW50c1s0XSwgImUiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRFbGVtZW50c0RlZmF1bHQyKCkgeworICAgICAgICBmaW5hbCBTdHJpbmdbXSBlbGVtZW50cyA9IFRva2VuaXplci50b2tlbml6ZShuZXcgU3RyaW5nW10geyJhICAgIGIsICxjO2RcblxuXG5lIn0pOworCisgICAgICAgIGFzc2VydEVxdWFscyhlbGVtZW50c1swXSwgImEiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGVsZW1lbnRzWzFdLCAiYiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZWxlbWVudHNbMl0sICJjIik7CisgICAgICAgIGFzc2VydEVxdWFscyhlbGVtZW50c1szXSwgImQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGVsZW1lbnRzWzRdLCAiZSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEVsZW1lbnRzRXhwbGljaXREZWxpbWl0ZXIoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZ1tdIGVsZW1lbnRzID0gVG9rZW5pemVyLnRva2VuaXplKG5ldyBTdHJpbmdbXSB7ImEgYixjO2RcbmUifSwgIiA7Iik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGVsZW1lbnRzWzBdLCAiYSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZWxlbWVudHNbMV0sICJiLGMiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGVsZW1lbnRzWzJdLCAiZFxuZSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlQ29uZmlnQ2xhc3NlcygpIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgTXlSZXNvdXJjZUNvbmZpZzIoKTsKKyAgICAgICAgZmluYWwgQXBwbGljYXRpb25IYW5kbGVyIGFoID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihyZXNvdXJjZUNvbmZpZyk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShhaC5nZXRDb25maWd1cmF0aW9uKCkuZ2V0Q2xhc3NlcygpLmNvbnRhaW5zKE15UmVzb3VyY2UuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUNvbmZpZ0luamVjdGlvbigpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgaW50IHJjSWQgPSAxMjM0NTsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgTXlSZXNvdXJjZUNvbmZpZzIocmNJZCk7CisgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uSGFuZGxlciBoYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihyZXNvdXJjZUNvbmZpZyk7CisKKyAgICAgICAgYXNzZXJ0U2FtZShyZXNvdXJjZUNvbmZpZywgaGFuZGxlci5nZXRJbmplY3Rpb25NYW5hZ2VyKCkuZ2V0SW5zdGFuY2UoQXBwbGljYXRpb24uY2xhc3MpKTsKKworICAgICAgICBmaW5hbCBDb250YWluZXJSZXNwb25zZSByID0gaGFuZGxlci5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICIvcmVzb3VyY2U/aWQ9IiArIHJjSWQsICJHRVQiKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgci5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiSW5qZWN0ZWQgYXBwbGljYXRpb24gaW5zdGFuY2Ugbm90IHNhbWUgYXMgdXNlZCBmb3IgYnVpbGRpbmcgdGhlIEplcnNleSBoYW5kbGVyLiIsCisgICAgICAgICAgICAgICAgInRydWUiLCByLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUNvbmZpZ01lcmdlQXBwbGljYXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIEFkZCBteUJpbmRlciArIG9uZSBkZWZhdWx0LgorICAgICAgICBmaW5hbCBNeU90aGVyQmluZGVyIGRlZmF1bHRCaW5kZXIgPSBuZXcgTXlPdGhlckJpbmRlcigpOworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByYyA9IFJlc291cmNlQ29uZmlnLmZvckFwcGxpY2F0aW9uQ2xhc3MoTXlSZXNvdXJjZUNvbmZpZzEuY2xhc3MpOworICAgICAgICByYy5yZWdpc3RlcihkZWZhdWx0QmluZGVyKTsKKyAgICAgICAgZmluYWwgQXBwbGljYXRpb25IYW5kbGVyIGhhbmRsZXIgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKHJjKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShoYW5kbGVyLmdldENvbmZpZ3VyYXRpb24oKS5nZXRDb21wb25lbnRCYWcoKS5nZXRJbnN0YW5jZXMoQ29tcG9uZW50QmFnLkJJTkRFUlNfT05MWSkuY29udGFpbnMoZGVmYXVsdEJpbmRlcikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFwcGxpY2F0aW9uTmFtZSgpIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoTXlSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnNldEFwcGxpY2F0aW9uTmFtZSgiYXBwIik7CisgICAgICAgIGFzc2VydEVxdWFscygiYXBwIiwgcmVzb3VyY2VDb25maWcuZ2V0QXBwbGljYXRpb25OYW1lKCkpOworICAgICAgICByZXNvdXJjZUNvbmZpZy5sb2NrKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYXBwIiwgcmVzb3VyY2VDb25maWcuZ2V0QXBwbGljYXRpb25OYW1lKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFwcGxpY2F0aW9uTmFtZURlZmluZWRCeVByb3BlcnR5KCkgeworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhNeVJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5BUFBMSUNBVElPTl9OQU1FLCAiYXBwIik7CisgICAgICAgIGFzc2VydE51bGwocmVzb3VyY2VDb25maWcuZ2V0QXBwbGljYXRpb25OYW1lKCkpOworICAgICAgICByZXNvdXJjZUNvbmZpZy5sb2NrKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYXBwIiwgcmVzb3VyY2VDb25maWcuZ2V0QXBwbGljYXRpb25OYW1lKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlSZXNvdXJjZUNvbmZpZzEgZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisKKyAgICAgICAgcHVibGljIE15UmVzb3VyY2VDb25maWcxKCkgeworICAgICAgICAgICAgcHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5XQURMX0ZFQVRVUkVfRElTQUJMRSwgdHJ1ZSk7CisgICAgICAgICAgICByZWdpc3RlcihuZXcgTXlCaW5kZXIoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15UmVzb3VyY2VDb25maWcyIGV4dGVuZHMgUmVzb3VyY2VDb25maWcgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IGlkOworCisgICAgICAgIHB1YmxpYyBNeVJlc291cmNlQ29uZmlnMigpIHsKKyAgICAgICAgICAgIHRoaXMoMCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTXlSZXNvdXJjZUNvbmZpZzIoZmluYWwgaW50IGlkKSB7CisgICAgICAgICAgICBwcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLldBRExfRkVBVFVSRV9ESVNBQkxFLCB0cnVlKTsKKyAgICAgICAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICAgICAgICAgIHJlZ2lzdGVyQ2xhc3NlcyhNeVJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJyZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVJlc291cmNlIHsKKworICAgICAgICBAQ29udGV4dAorICAgICAgICBBcHBsaWNhdGlvbiBhcHA7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHRlc3QoQFF1ZXJ5UGFyYW0oImlkIikgZmluYWwgaW50IHJjSWQpIHsKKyAgICAgICAgICAgIHJldHVybiBCb29sZWFuLnRvU3RyaW5nKChhcHAgaW5zdGFuY2VvZiBNeVJlc291cmNlQ29uZmlnMikgJiYgKChNeVJlc291cmNlQ29uZmlnMikgYXBwKS5pZCA9PSByY0lkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlCaW5kZXIgZXh0ZW5kcyBBYnN0cmFjdEJpbmRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlPdGhlckJpbmRlciBleHRlbmRzIEFic3RyYWN0QmluZGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICAgICAgLy8gZG8gbm90aGluZworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NQYXRoUHJvcGVydHlUb3BMZXZlbCgpIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmMgPSBuZXcgUmVzb3VyY2VDb25maWcoKQorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLlBST1ZJREVSX0NMQVNTUEFUSCwgUHVibGljUm9vdFJlc291cmNlQ2xhc3MuY2xhc3MuZ2V0UmVzb3VyY2UoIiIpLmdldFBhdGgoKSk7CisKKyAgICAgICAgZmluYWwgU2V0PENsYXNzPD8+PiBjbGFzc2VzID0gcmMuZ2V0Q2xhc3NlcygpOworICAgICAgICBhc3NlcnRUaGF0KGNsYXNzZXMsIGhhc0l0ZW0oUHVibGljUm9vdFJlc291cmNlQ2xhc3MuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjbGFzc2VzLnNpemUoKSwgaXMoMSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsYXNzUGF0aFByb3BlcnR5SW5uZXJTdGF0aWMoKSB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJjID0gbmV3IFJlc291cmNlQ29uZmlnKCkKKyAgICAgICAgICAgICAgICAucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5QUk9WSURFUl9DTEFTU1BBVEgsIElubmVyU3RhdGljQ2xhc3MuY2xhc3MuZ2V0UmVzb3VyY2UoIiIpLmdldFBhdGgoKSk7CisKKyAgICAgICAgZmluYWwgU2V0PENsYXNzPD8+PiBjbGFzc2VzID0gcmMuZ2V0Q2xhc3NlcygpOworICAgICAgICBhc3NlcnRUaGF0KGNsYXNzZXMsIGhhc0l0ZW0oSW5uZXJTdGF0aWNDbGFzcy5QdWJsaWNDbGFzcy5jbGFzcykpOworICAgICAgICBhc3NlcnRUaGF0KGNsYXNzZXMuc2l6ZSgpLCBpcygxKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NQYXRoUHJvcGVydHlUb3BMZXZlbElubmVyU3RhdGljKCkgeworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByYyA9IG5ldyBSZXNvdXJjZUNvbmZpZygpCisgICAgICAgICAgICAgICAgLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuUFJPVklERVJfQ0xBU1NQQVRILAorICAgICAgICAgICAgICAgICAgICAgICAgUHVibGljUm9vdFJlc291cmNlSW5uZXJTdGF0aWNDbGFzcy5jbGFzcy5nZXRSZXNvdXJjZSgiIikuZ2V0UGF0aCgpKTsKKworICAgICAgICBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IGNsYXNzZXMgPSByYy5nZXRDbGFzc2VzKCk7CisgICAgICAgIGFzc2VydFRoYXQoY2xhc3NlcywgaGFzSXRlbShQdWJsaWNSb290UmVzb3VyY2VJbm5lclN0YXRpY0NsYXNzLmNsYXNzKSk7CisgICAgICAgIGFzc2VydFRoYXQoY2xhc3NlcywgaGFzSXRlbShQdWJsaWNSb290UmVzb3VyY2VJbm5lclN0YXRpY0NsYXNzLlB1YmxpY0NsYXNzLmNsYXNzKSk7CisgICAgICAgIGFzc2VydFRoYXQoY2xhc3Nlcy5zaXplKCksIGlzKDIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbGFzc1BhdGhQcm9wZXJ0eUFsbCgpIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmMgPSBuZXcgUmVzb3VyY2VDb25maWcoKQorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLlBST1ZJREVSX0NMQVNTUEFUSCwgUmVzb3VyY2VDb25maWdUZXN0LmNsYXNzLmdldFJlc291cmNlKCIiKS5nZXRQYXRoKCkgKyAiL2NvbmZpZyIpOworCisgICAgICAgIGZpbmFsIFNldDxDbGFzczw/Pj4gY2xhc3NlcyA9IHJjLmdldENsYXNzZXMoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjbGFzc2VzLCBoYXNJdGVtKFB1YmxpY1Jvb3RSZXNvdXJjZUNsYXNzLmNsYXNzKSk7CisgICAgICAgIGFzc2VydFRoYXQoY2xhc3NlcywgaGFzSXRlbShJbm5lclN0YXRpY0NsYXNzLlB1YmxpY0NsYXNzLmNsYXNzKSk7CisgICAgICAgIGFzc2VydFRoYXQoY2xhc3NlcywgaGFzSXRlbShQdWJsaWNSb290UmVzb3VyY2VJbm5lclN0YXRpY0NsYXNzLmNsYXNzKSk7CisgICAgICAgIGFzc2VydFRoYXQoY2xhc3NlcywgaGFzSXRlbShQdWJsaWNSb290UmVzb3VyY2VJbm5lclN0YXRpY0NsYXNzLlB1YmxpY0NsYXNzLmNsYXNzKSk7CisgICAgICAgIGFzc2VydFRoYXQoY2xhc3Nlcy5zaXplKCksIGlzKDQpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbGFzc1BhdGhQcm9wZXJ0eUFsbE11bHRpcGxlUGF0aHMoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBwYXRocyA9IFB1YmxpY1Jvb3RSZXNvdXJjZUNsYXNzLmNsYXNzLmdldFJlc291cmNlKCIiKS5nZXRQYXRoKCkgKyAiOyIKKyAgICAgICAgICAgICAgICArIElubmVyU3RhdGljQ2xhc3MuY2xhc3MuZ2V0UmVzb3VyY2UoIiIpLmdldFBhdGgoKSArICI7IgorICAgICAgICAgICAgICAgICsgUHVibGljUm9vdFJlc291cmNlSW5uZXJTdGF0aWNDbGFzcy5jbGFzcy5nZXRSZXNvdXJjZSgiIikuZ2V0UGF0aCgpOworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByYyA9IG5ldyBSZXNvdXJjZUNvbmZpZygpCisgICAgICAgICAgICAgICAgLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuUFJPVklERVJfQ0xBU1NQQVRILCBwYXRocyk7CisKKyAgICAgICAgZmluYWwgU2V0PENsYXNzPD8+PiBjbGFzc2VzID0gcmMuZ2V0Q2xhc3NlcygpOworICAgICAgICBhc3NlcnRUaGF0KGNsYXNzZXMsIGhhc0l0ZW0oUHVibGljUm9vdFJlc291cmNlQ2xhc3MuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjbGFzc2VzLCBoYXNJdGVtKElubmVyU3RhdGljQ2xhc3MuUHVibGljQ2xhc3MuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjbGFzc2VzLCBoYXNJdGVtKFB1YmxpY1Jvb3RSZXNvdXJjZUlubmVyU3RhdGljQ2xhc3MuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjbGFzc2VzLCBoYXNJdGVtKFB1YmxpY1Jvb3RSZXNvdXJjZUlubmVyU3RhdGljQ2xhc3MuUHVibGljQ2xhc3MuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjbGFzc2VzLnNpemUoKSwgaXMoNCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsYXNzUGF0aFByb3BlcnR5QWxsTXVsdGlwbGVQYXRoc1dpdGhTcGFjZXMoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBwYXRocyA9IFB1YmxpY1Jvb3RSZXNvdXJjZUNsYXNzLmNsYXNzLmdldFJlc291cmNlKCIiKS5nZXRQYXRoKCkgKyAiOyAiCisgICAgICAgICAgICAgICAgKyBJbm5lclN0YXRpY0NsYXNzLmNsYXNzLmdldFJlc291cmNlKCIiKS5nZXRQYXRoKCkgKyAiOzsiCisgICAgICAgICAgICAgICAgKyBQdWJsaWNSb290UmVzb3VyY2VJbm5lclN0YXRpY0NsYXNzLmNsYXNzLmdldFJlc291cmNlKCIiKS5nZXRQYXRoKCkgKyAiOyA7OyAiOworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByYyA9IG5ldyBSZXNvdXJjZUNvbmZpZygpCisgICAgICAgICAgICAgICAgLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuUFJPVklERVJfQ0xBU1NQQVRILCBwYXRocyk7CisKKyAgICAgICAgZmluYWwgU2V0PENsYXNzPD8+PiBjbGFzc2VzID0gcmMuZ2V0Q2xhc3NlcygpOworICAgICAgICBhc3NlcnRUaGF0KGNsYXNzZXMsIGhhc0l0ZW0oUHVibGljUm9vdFJlc291cmNlQ2xhc3MuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjbGFzc2VzLCBoYXNJdGVtKElubmVyU3RhdGljQ2xhc3MuUHVibGljQ2xhc3MuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjbGFzc2VzLCBoYXNJdGVtKFB1YmxpY1Jvb3RSZXNvdXJjZUlubmVyU3RhdGljQ2xhc3MuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjbGFzc2VzLCBoYXNJdGVtKFB1YmxpY1Jvb3RSZXNvdXJjZUlubmVyU3RhdGljQ2xhc3MuUHVibGljQ2xhc3MuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjbGFzc2VzLnNpemUoKSwgaXMoNCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsYXNzUGF0aFByb3BlcnR5SmFyVG9wTGV2ZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmMgPSBjcmVhdGVDb25maWdXaXRoQ2xhc3NQYXRoUHJvcGVydHkoCisgICAgICAgICAgICAgICAgY3JlYXRlSmFyRmlsZShSZXNvdXJjZUNvbmZpZ1Rlc3QuY2xhc3MuZ2V0UmVzb3VyY2UoIiIpLmdldFBhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb25maWcvdG9wbGV2ZWwvUHVibGljUm9vdFJlc291cmNlQ2xhc3MuY2xhc3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgImNvbmZpZy90b3BsZXZlbC9QYWNrYWdlUm9vdFJlc291cmNlQ2xhc3MuY2xhc3MiKQorICAgICAgICApOworCisgICAgICAgIGZpbmFsIFNldDxDbGFzczw/Pj4gY2xhc3NlcyA9IHJjLmdldENsYXNzZXMoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjbGFzc2VzLCBoYXNJdGVtKFB1YmxpY1Jvb3RSZXNvdXJjZUNsYXNzLmNsYXNzKSk7CisgICAgICAgIGFzc2VydFRoYXQoY2xhc3Nlcy5zaXplKCksIGlzKDEpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbGFzc1BhdGhQcm9wZXJ0eUphcklubmVyU3RhdGljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJjID0gY3JlYXRlQ29uZmlnV2l0aENsYXNzUGF0aFByb3BlcnR5KAorICAgICAgICAgICAgICAgIGNyZWF0ZUphckZpbGUoUmVzb3VyY2VDb25maWdUZXN0LmNsYXNzLmdldFJlc291cmNlKCIiKS5nZXRQYXRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAiY29uZmlnL2lubmVyc3RhdGljL0lubmVyU3RhdGljQ2xhc3MuY2xhc3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgImNvbmZpZy9pbm5lcnN0YXRpYy9Jbm5lclN0YXRpY0NsYXNzJFB1YmxpY0NsYXNzLmNsYXNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb25maWcvaW5uZXJzdGF0aWMvSW5uZXJTdGF0aWNDbGFzcyRQYWNrYWdlQ2xhc3MuY2xhc3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgImNvbmZpZy9pbm5lcnN0YXRpYy9Jbm5lclN0YXRpY0NsYXNzJFByb3RlY3RlZENsYXNzLmNsYXNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb25maWcvaW5uZXJzdGF0aWMvSW5uZXJTdGF0aWNDbGFzcyRQcml2YXRlQ2xhc3MuY2xhc3MiKQorICAgICAgICApOworCisgICAgICAgIGZpbmFsIFNldDxDbGFzczw/Pj4gY2xhc3NlcyA9IHJjLmdldENsYXNzZXMoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjbGFzc2VzLCBoYXNJdGVtKElubmVyU3RhdGljQ2xhc3MuUHVibGljQ2xhc3MuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjbGFzc2VzLnNpemUoKSwgaXMoMSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsYXNzUGF0aFByb3BlcnR5SmFyQWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJjID0gY3JlYXRlQ29uZmlnV2l0aENsYXNzUGF0aFByb3BlcnR5KAorICAgICAgICAgICAgICAgIGNyZWF0ZUphckZpbGUoUmVzb3VyY2VDb25maWdUZXN0LmNsYXNzLmdldFJlc291cmNlKCIiKS5nZXRQYXRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAiY29uZmlnL3RvcGxldmVsL1B1YmxpY1Jvb3RSZXNvdXJjZUNsYXNzLmNsYXNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb25maWcvdG9wbGV2ZWwvUGFja2FnZVJvb3RSZXNvdXJjZUNsYXNzLmNsYXNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb25maWcvaW5uZXJzdGF0aWMvSW5uZXJTdGF0aWNDbGFzcy5jbGFzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY29uZmlnL2lubmVyc3RhdGljL0lubmVyU3RhdGljQ2xhc3MkUHVibGljQ2xhc3MuY2xhc3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgImNvbmZpZy9pbm5lcnN0YXRpYy9Jbm5lclN0YXRpY0NsYXNzJFBhY2thZ2VDbGFzcy5jbGFzcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAiY29uZmlnL2lubmVyc3RhdGljL0lubmVyU3RhdGljQ2xhc3MkUHJvdGVjdGVkQ2xhc3MuY2xhc3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgImNvbmZpZy9pbm5lcnN0YXRpYy9Jbm5lclN0YXRpY0NsYXNzJFByaXZhdGVDbGFzcy5jbGFzcyIpCisgICAgICAgICk7CisKKyAgICAgICAgZmluYWwgU2V0PENsYXNzPD8+PiBjbGFzc2VzID0gcmMuZ2V0Q2xhc3NlcygpOworICAgICAgICBhc3NlcnRUaGF0KGNsYXNzZXMsIGhhc0l0ZW0oUHVibGljUm9vdFJlc291cmNlQ2xhc3MuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjbGFzc2VzLCBoYXNJdGVtKElubmVyU3RhdGljQ2xhc3MuUHVibGljQ2xhc3MuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjbGFzc2VzLnNpemUoKSwgaXMoMikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsYXNzUGF0aFByb3BlcnR5WmlwQWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJjID0gY3JlYXRlQ29uZmlnV2l0aENsYXNzUGF0aFByb3BlcnR5KAorICAgICAgICAgICAgICAgIGNyZWF0ZUphckZpbGUoSmFyVXRpbHMuU3VmZml4LnppcCwgUmVzb3VyY2VDb25maWdUZXN0LmNsYXNzLmdldFJlc291cmNlKCIiKS5nZXRQYXRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAiY29uZmlnL3RvcGxldmVsL1B1YmxpY1Jvb3RSZXNvdXJjZUNsYXNzLmNsYXNzIiwgImNvbmZpZy90b3BsZXZlbC9QYWNrYWdlUm9vdFJlc291cmNlQ2xhc3MuY2xhc3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgImNvbmZpZy9pbm5lcnN0YXRpYy9Jbm5lclN0YXRpY0NsYXNzLmNsYXNzIiwgImNvbmZpZy9pbm5lcnN0YXRpYy9Jbm5lclN0YXRpY0NsYXNzJFB1YmxpY0NsYXNzLmNsYXNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb25maWcvaW5uZXJzdGF0aWMvSW5uZXJTdGF0aWNDbGFzcyRQYWNrYWdlQ2xhc3MuY2xhc3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgImNvbmZpZy9pbm5lcnN0YXRpYy9Jbm5lclN0YXRpY0NsYXNzJFByb3RlY3RlZENsYXNzLmNsYXNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJjb25maWcvaW5uZXJzdGF0aWMvSW5uZXJTdGF0aWNDbGFzcyRQcml2YXRlQ2xhc3MuY2xhc3MiKQorICAgICAgICApOworCisgICAgICAgIGZpbmFsIFNldDxDbGFzczw/Pj4gY2xhc3NlcyA9IHJjLmdldENsYXNzZXMoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjbGFzc2VzLCBoYXNJdGVtKFB1YmxpY1Jvb3RSZXNvdXJjZUNsYXNzLmNsYXNzKSk7CisgICAgICAgIGFzc2VydFRoYXQoY2xhc3NlcywgaGFzSXRlbShJbm5lclN0YXRpY0NsYXNzLlB1YmxpY0NsYXNzLmNsYXNzKSk7CisgICAgICAgIGFzc2VydFRoYXQoY2xhc3Nlcy5zaXplKCksIGlzKDIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByb2R1Y2VyIGZvciBKRVJTRVktMjc5NjogQ2FsbGluZyBnZXRDbGFzc2VzKCkgb24gUmVzb3VyY2VDb25maWcgYnJlYWtzIGV4YW1wbGUgaW4gc29tZSBjYXNlcy4KKyAgICAgKiA8cC8+CisgICAgICogUmVnaXN0ZXJpbmcgYSBjb21wb25lbnQgYWZ0ZXIgY2FsbGluZyB7QGxpbmsgUmVzb3VyY2VDb25maWcjZ2V0Q2xhc3NlcygpfSBhbmQgY2hlY2tpbmcgdGhhdCBhbGwgZXhwZWN0ZWQgY29tcG9uZW50cyBhcmUKKyAgICAgKiByZWdpc3RlcmVkLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldENsYXNzZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmMgPSBuZXcgUmVzb3VyY2VDb25maWcoKQorICAgICAgICAgICAgICAgIC5wYWNrYWdlcyhmYWxzZSwgUHVibGljUm9vdFJlc291cmNlQ2xhc3MuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7CisKKyAgICAgICAgU2V0PENsYXNzPD8+PiBjbGFzc2VzID0gcmMuZ2V0Q2xhc3NlcygpOworICAgICAgICBhc3NlcnRUaGF0KGNsYXNzZXMuc2l6ZSgpLCBpcygxKSk7CisgICAgICAgIGFzc2VydFRoYXQoY2xhc3NlcywgaGFzSXRlbShQdWJsaWNSb290UmVzb3VyY2VDbGFzcy5jbGFzcykpOworCisgICAgICAgIHJjLnJlZ2lzdGVyKElubmVyU3RhdGljQ2xhc3MuUHVibGljQ2xhc3MuY2xhc3MpOworCisgICAgICAgIGNsYXNzZXMgPSByYy5nZXRDbGFzc2VzKCk7CisgICAgICAgIGFzc2VydFRoYXQoY2xhc3Nlcy5zaXplKCksIGlzKDIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjbGFzc2VzLCBoYXNJdGVtKFB1YmxpY1Jvb3RSZXNvdXJjZUNsYXNzLmNsYXNzKSk7CisgICAgICAgIGFzc2VydFRoYXQoY2xhc3NlcywgaGFzSXRlbShJbm5lclN0YXRpY0NsYXNzLlB1YmxpY0NsYXNzLmNsYXNzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcm9kdWNlciBmb3IgT1dMUy0xOTc5MDogSW52YWxpZGF0ZSByZXNvdXJjZSBmaW5kZXJzIGluIHJlc291cmNlIGNvbmZpZyBvbmx5IHdoZW4gbmVlZGVkLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRhdGVSZXNvdXJjZUZpbmRlcnMoQE1vY2tlZCBmaW5hbCBQYWNrYWdlTmFtZXNTY2FubmVyIHNjYW5uZXIpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZygpCisgICAgICAgICAgICAgICAgLnBhY2thZ2VzKGZhbHNlLCBQdWJsaWNSb290UmVzb3VyY2VDbGFzcy5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKKworICAgICAgICAvLyBTY2FuIHBhY2thZ2VzLgorICAgICAgICByZXNvdXJjZUNvbmZpZy5nZXRDbGFzc2VzKCk7CisKKyAgICAgICAgLy8gTm8gcmVzZXQuCisgICAgICAgIG5ldyBWZXJpZmljYXRpb25zKCkge3sKKyAgICAgICAgICAgIHNjYW5uZXIucmVzZXQoKTsKKyAgICAgICAgICAgIHRpbWVzID0gMDsKKyAgICAgICAgfX07CisKKyAgICAgICAgcmVzb3VyY2VDb25maWcucmVnaXN0ZXIoSW5uZXJTdGF0aWNDbGFzcy5QdWJsaWNDbGFzcy5jbGFzcyk7CisKKyAgICAgICAgLy8gUmVzZXQgLSB3ZSBjYWxsZWQgZ2V0Q2xhc3NlcygpIG9uIFJlc291cmNlQ29uZmlnLgorICAgICAgICBuZXcgVmVyaWZpY2F0aW9ucygpIHt7CisgICAgICAgICAgICBzY2FubmVyLnJlc2V0KCk7CisgICAgICAgICAgICB0aW1lcyA9IDE7CisgICAgICAgIH19OworCisgICAgICAgIC8vIE5vIHJlc2V0LgorICAgICAgICByZXNvdXJjZUNvbmZpZy5yZWdpc3RlcihQdWJsaWNSb290UmVzb3VyY2VDbGFzcy5jbGFzcyk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVyKFB1YmxpY1Jvb3RSZXNvdXJjZUlubmVyU3RhdGljQ2xhc3MuUHVibGljQ2xhc3MuY2xhc3MpOworCisgICAgICAgIC8vIE5vIHJlc2V0IC0gc2ltcGxlIHJlZ2lzdGVyaW5nIGRvZXMgbm90IGludm9rZSBjYWNoZSBpbnZhbGlkYXRpb24gYW5kIHJlc2V0IG9mIHJlc291cmNlIGZpbmRlcnMuCisgICAgICAgIG5ldyBWZXJpZmljYXRpb25zKCkge3sKKyAgICAgICAgICAgIHNjYW5uZXIucmVzZXQoKTsKKyAgICAgICAgICAgIHRpbWVzID0gMTsKKyAgICAgICAgfX07CisKKyAgICAgICAgLy8gU2NhbiBwYWNrYWdlcy4KKyAgICAgICAgcmVzb3VyY2VDb25maWcuZ2V0Q2xhc3NlcygpOworCisgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVyRmluZGVyKG5ldyBQYWNrYWdlTmFtZXNTY2FubmVyKG5ldyBTdHJpbmdbXSB7ImphdmF4LndzLnJzIn0sIGZhbHNlKSk7CisKKyAgICAgICAgLy8gUmVzZXQgLSB3ZSBjYWxsZWQgZ2V0Q2xhc3NlcygpIG9uIFJlc291cmNlQ29uZmlnLgorICAgICAgICBuZXcgVmVyaWZpY2F0aW9ucygpIHt7CisgICAgICAgICAgICBzY2FubmVyLnJlc2V0KCk7CisgICAgICAgICAgICB0aW1lcyA9IDI7CisgICAgICAgIH19OworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlRmluZGVyU3RyZWFtc0Nsb3NlZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihuZXcgUmVzb3VyY2VDb25maWcoKS5wYWNrYWdlcygiamF2YXgud3MucnMiKS5nZXRDbGFzc2VzKCkpOworICAgIH0KKworICAgIHByaXZhdGUgUmVzb3VyY2VDb25maWcgY3JlYXRlQ29uZmlnV2l0aENsYXNzUGF0aFByb3BlcnR5KGZpbmFsIEZpbGUgamFyRmlsZSkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKCkucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5QUk9WSURFUl9DTEFTU1BBVEgsIGphckZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL1Jlc291cmNlTWVyZ2VUZXN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9SZXNvdXJjZU1lcmdlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NDg5YTAKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9SZXNvdXJjZU1lcmdlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzA0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlcjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUFVUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5JbmZsZWN0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZVRlc3RVdGlsczsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICogVGVzdCBtZXJnaW5nIG9mIHJlc291cmNlcyBhbmQgY2hpbGQgcmVzb3VyY2VzLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNvdXJjZU1lcmdlVGVzdCB7CisKKyAgICBAUGF0aCgiYSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZUEgeworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJnZXQiOworICAgICAgICB9CisKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJjaGlsZCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgY2hpbGRHZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gImNoaWxkLWdldCI7CisgICAgICAgIH0KKworCisgICAgICAgIEBQYXRoKCJjaGlsZCIpCisgICAgICAgIHB1YmxpYyBSZXNvdXJjZUIgZ2V0TG9jYXRvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VCKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJjaGlsZDIiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGNoaWxkMkdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiY2hpbGQyLWdldCI7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIEBQYXRoKCJhIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlQiB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0KCkgeworICAgICAgICAgICAgcmV0dXJuICJwb3N0IjsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJjaGlsZCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgY2hpbGRQb3N0KCkgeworICAgICAgICAgICAgcmV0dXJuICJjaGlsZC1wb3N0IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJkaWZmZXJlbnQtcGF0aCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZUMgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdCgpIHsKKyAgICAgICAgICAgIHJldHVybiAicG9zdCI7CisgICAgICAgIH0KKworICAgICAgICBAUFVUCisgICAgICAgIEBQYXRoKCJjaGlsZCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgY2hpbGRQdXQoKSB7CisgICAgICAgICAgICByZXR1cm4gImNoaWxkLXB1dCI7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgibG9jYXRvciIpCisgICAgICAgIHB1YmxpYyBSZXNvdXJjZUEgbG9jYXRvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VBKCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlTWVyZ2UoKSB7CisgICAgICAgIGZpbmFsIExpc3Q8UmVzb3VyY2U+IHJvb3RSZXNvdXJjZXMgPSBjcmVhdGVSb290UmVzb3VyY2VzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCByb290UmVzb3VyY2VzLnNpemUoKSk7CisKKyAgICAgICAgZmluYWwgUmVzb3VyY2UgcmVzb3VyY2VDID0gUmVzb3VyY2VUZXN0VXRpbHMuZ2V0UmVzb3VyY2Uocm9vdFJlc291cmNlcywgImRpZmZlcmVudC1wYXRoIik7CisgICAgICAgIFJlc291cmNlVGVzdFV0aWxzLmNvbnRhaW5zRXhhY3RNZXRob2RzKHJlc291cmNlQywgZmFsc2UsICJQT1NUIik7CisKKyAgICAgICAgZmluYWwgUmVzb3VyY2UgcmVzb3VyY2VBQiA9IFJlc291cmNlVGVzdFV0aWxzLmdldFJlc291cmNlKHJvb3RSZXNvdXJjZXMsICJhIik7CisgICAgICAgIFJlc291cmNlVGVzdFV0aWxzLmNvbnRhaW5zRXhhY3RNZXRob2RzKHJlc291cmNlQUIsIGZhbHNlLCAiUE9TVCIsICJHRVQiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8UmVzb3VyY2U+IGNyZWF0ZVJvb3RSZXNvdXJjZXMoKSB7CisgICAgICAgIGZpbmFsIFJlc291cmNlIHJlc291cmNlQSA9IFJlc291cmNlLmZyb20oUmVzb3VyY2VBLmNsYXNzKTsKKyAgICAgICAgZmluYWwgUmVzb3VyY2UgcmVzb3VyY2VCID0gUmVzb3VyY2UuZnJvbShSZXNvdXJjZUIuY2xhc3MpOworICAgICAgICBmaW5hbCBSZXNvdXJjZUJhZy5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUmVzb3VyY2VCYWcuQnVpbGRlcigpOworICAgICAgICBidWlsZGVyLnJlZ2lzdGVyUHJvZ3JhbW1hdGljUmVzb3VyY2UocmVzb3VyY2VBKTsKKyAgICAgICAgYnVpbGRlci5yZWdpc3RlclByb2dyYW1tYXRpY1Jlc291cmNlKHJlc291cmNlQik7CisgICAgICAgIGJ1aWxkZXIucmVnaXN0ZXJQcm9ncmFtbWF0aWNSZXNvdXJjZShSZXNvdXJjZS5mcm9tKFJlc291cmNlQy5jbGFzcykpOworICAgICAgICBmaW5hbCBSZXNvdXJjZUJhZyBiYWcgPSBidWlsZGVyLmJ1aWxkKCk7CisgICAgICAgIHJldHVybiBiYWcuZ2V0Um9vdFJlc291cmNlcygpOworICAgIH0KKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hpbGRSZXNvdXJjZU1lcmdlKCkgeworICAgICAgICBmaW5hbCBMaXN0PFJlc291cmNlPiByb290UmVzb3VyY2VzID0gY3JlYXRlUm9vdFJlc291cmNlcygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcm9vdFJlc291cmNlcy5zaXplKCkpOworICAgICAgICBmaW5hbCBSZXNvdXJjZSByZXNvdXJjZUFCID0gUmVzb3VyY2VUZXN0VXRpbHMuZ2V0UmVzb3VyY2Uocm9vdFJlc291cmNlcywgImEiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHJlc291cmNlQUIuZ2V0Q2hpbGRSZXNvdXJjZXMoKS5zaXplKCkpOworICAgICAgICBmaW5hbCBSZXNvdXJjZSBjaGlsZCA9IFJlc291cmNlVGVzdFV0aWxzLmdldFJlc291cmNlKHJlc291cmNlQUIuZ2V0Q2hpbGRSZXNvdXJjZXMoKSwgImNoaWxkIik7CisgICAgICAgIGZpbmFsIFJlc291cmNlIGNoaWxkMiA9IFJlc291cmNlVGVzdFV0aWxzLmdldFJlc291cmNlKHJlc291cmNlQUIuZ2V0Q2hpbGRSZXNvdXJjZXMoKSwgImNoaWxkMiIpOworCisgICAgICAgIFJlc291cmNlVGVzdFV0aWxzLmNvbnRhaW5zRXhhY3RNZXRob2RzKGNoaWxkLCB0cnVlLCAiR0VUIiwgIlBPU1QiKTsKKyAgICAgICAgUmVzb3VyY2VUZXN0VXRpbHMuY29udGFpbnNFeGFjdE1ldGhvZHMoY2hpbGQyLCBmYWxzZSwgIkdFVCIpOworCisKKyAgICAgICAgZmluYWwgUmVzb3VyY2UgcmVzb3VyY2VDID0gUmVzb3VyY2VUZXN0VXRpbHMuZ2V0UmVzb3VyY2Uocm9vdFJlc291cmNlcywgImRpZmZlcmVudC1wYXRoIik7CisgICAgICAgIGZpbmFsIExpc3Q8UmVzb3VyY2U+IGNoaWxkUmVzb3VyY2VzQyA9IHJlc291cmNlQy5nZXRDaGlsZFJlc291cmNlcygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgY2hpbGRSZXNvdXJjZXNDLnNpemUoKSk7CisgICAgICAgIGZpbmFsIFJlc291cmNlIGNoaWxkQzEgPSBSZXNvdXJjZVRlc3RVdGlscy5nZXRSZXNvdXJjZShjaGlsZFJlc291cmNlc0MsICJjaGlsZCIpOworICAgICAgICBSZXNvdXJjZVRlc3RVdGlscy5jb250YWluc0V4YWN0TWV0aG9kcyhjaGlsZEMxLCBmYWxzZSwgIlBVVCIpOworCisgICAgICAgIGZpbmFsIFJlc291cmNlIGNoaWxkQzIgPSBSZXNvdXJjZVRlc3RVdGlscy5nZXRSZXNvdXJjZShjaGlsZFJlc291cmNlc0MsICJsb2NhdG9yIik7CisgICAgICAgIFJlc291cmNlVGVzdFV0aWxzLmNvbnRhaW5zRXhhY3RNZXRob2RzKGNoaWxkQzIsIHRydWUpOworCisgICAgICAgIGNoaWxkLmdldFJlc291cmNlTWV0aG9kcygpLnNpemUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15SW5mbGVjdG9yIGltcGxlbWVudHMgSW5mbGVjdG9yPENvbnRhaW5lclJlcXVlc3RDb250ZXh0LCBPYmplY3Q+IHsKKworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0IGFwcGx5KENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwcm9ncmFtbWF0aWNUZXN0KCkgeworICAgICAgICBmaW5hbCBMaXN0PFJlc291cmNlPiByb290UmVzb3VyY2VzID0gZ2V0UmVzb3VyY2VzRnJvbVByb2dyYW1tYXRpYygpOworCisgICAgICAgIGFzc2VydEVxdWFscygxLCByb290UmVzb3VyY2VzLnNpemUoKSk7CisgICAgICAgIGZpbmFsIFJlc291cmNlIHJvb3QgPSBSZXNvdXJjZVRlc3RVdGlscy5nZXRSZXNvdXJjZShyb290UmVzb3VyY2VzLCAicm9vdCIpOworICAgICAgICBmaW5hbCBMaXN0PFJlc291cmNlPiBjaGlsZFJlc291cmNlcyA9IHJvb3QuZ2V0Q2hpbGRSZXNvdXJjZXMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGNoaWxkUmVzb3VyY2VzLnNpemUoKSk7CisgICAgICAgIGZpbmFsIFJlc291cmNlIGNoaWxkID0gUmVzb3VyY2VUZXN0VXRpbHMuZ2V0UmVzb3VyY2UoY2hpbGRSZXNvdXJjZXMsICJjaGlsZCIpOworICAgICAgICBSZXNvdXJjZVRlc3RVdGlscy5jb250YWluc0V4YWN0TWV0aG9kcyhjaGlsZCwgdHJ1ZSwgIkdFVCIsICJQT1NUIiwgIkRFTEVURSIpOworICAgICAgICBmaW5hbCBSZXNvdXJjZSBjaGlsZDIgPSBSZXNvdXJjZVRlc3RVdGlscy5nZXRSZXNvdXJjZShjaGlsZFJlc291cmNlcywgImNoaWxkMiIpOworICAgICAgICBSZXNvdXJjZVRlc3RVdGlscy5jb250YWluc0V4YWN0TWV0aG9kcyhjaGlsZDIsIGZhbHNlLCAiUFVUIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0PFJlc291cmNlPiBnZXRSZXNvdXJjZXNGcm9tUHJvZ3JhbW1hdGljKCkgeworICAgICAgICBmaW5hbCBSZXNvdXJjZS5CdWlsZGVyIHJvb3QgPSBSZXNvdXJjZS5idWlsZGVyKCJyb290Iik7CisgICAgICAgIHJvb3QuYWRkQ2hpbGRSZXNvdXJjZSgiY2hpbGQiKS5hZGRNZXRob2QoIkdFVCIpLmhhbmRsZWRCeShuZXcgTXlJbmZsZWN0b3IoKSk7CisgICAgICAgIHJvb3QuYWRkQ2hpbGRSZXNvdXJjZSgiY2hpbGQiKS5hZGRNZXRob2QoIlBPU1QiKS5oYW5kbGVkQnkobmV3IE15SW5mbGVjdG9yKCkpOworICAgICAgICByb290LmFkZENoaWxkUmVzb3VyY2UoImNoaWxkMiIpLmFkZE1ldGhvZCgiUFVUIikuaGFuZGxlZEJ5KG5ldyBNeUluZmxlY3RvcigpKTsKKworICAgICAgICBmaW5hbCBSZXNvdXJjZS5CdWlsZGVyIHJvb3QyID0gUmVzb3VyY2UuYnVpbGRlcigicm9vdCIpOworICAgICAgICByb290Mi5hZGRDaGlsZFJlc291cmNlKCJjaGlsZCIpLmFkZE1ldGhvZCgiREVMRVRFIikuaGFuZGxlZEJ5KG5ldyBNeUluZmxlY3RvcigpKTsKKyAgICAgICAgcm9vdDIuYWRkQ2hpbGRSZXNvdXJjZSgiY2hpbGQiKS5hZGRNZXRob2QoKFN0cmluZykgbnVsbCkuaGFuZGxlZEJ5KG5ldyBNeUluZmxlY3RvcigpKTsKKworICAgICAgICBmaW5hbCBSZXNvdXJjZUJhZy5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUmVzb3VyY2VCYWcuQnVpbGRlcigpOworICAgICAgICBidWlsZGVyLnJlZ2lzdGVyUHJvZ3JhbW1hdGljUmVzb3VyY2Uocm9vdC5idWlsZCgpKTsKKyAgICAgICAgYnVpbGRlci5yZWdpc3RlclByb2dyYW1tYXRpY1Jlc291cmNlKHJvb3QyLmJ1aWxkKCkpOworICAgICAgICBmaW5hbCBSZXNvdXJjZUJhZyBiYWcgPSBidWlsZGVyLmJ1aWxkKCk7CisgICAgICAgIHJldHVybiBiYWcuZ2V0Um9vdFJlc291cmNlcygpOworICAgIH0KKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBtZXJnZVR3b0xvY2F0b3JzVGVzdCgpIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2UuQnVpbGRlciByb290ID0gUmVzb3VyY2UuYnVpbGRlcigicm9vdCIpOworICAgICAgICByb290LmFkZENoaWxkUmVzb3VyY2UoImNoaWxkIikuYWRkTWV0aG9kKCkuaGFuZGxlZEJ5KG5ldyBNeUluZmxlY3RvcigpKS5jb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MX1RZUEUpOworICAgICAgICByb290LmFkZENoaWxkUmVzb3VyY2UoImNoaWxkIikuYWRkTWV0aG9kKCkuaGFuZGxlZEJ5KG5ldyBNeUluZmxlY3RvcigpKS5jb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFKTsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VCYWcuQnVpbGRlciBidWlsZGVyID0gbmV3IFJlc291cmNlQmFnLkJ1aWxkZXIoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJ1aWxkZXIucmVnaXN0ZXJQcm9ncmFtbWF0aWNSZXNvdXJjZShyb290LmJ1aWxkKCkpOworICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VCYWcgYmFnID0gYnVpbGRlci5idWlsZCgpOworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGZhaWwgLSB0d28gbG9jYXRvcnMgb24gdGhlIHNhbWUgcGF0aC4iKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIG9rIC0gc2hvdWxkIGZhaWwKKyAgICAgICAgfQorICAgIH0KKworCisgICAgQFBhdGgoInJvb3Qve2F9IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlVGVtcGxhdGVBIHsKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgie3F9IikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gImdldCI7CisgICAgICAgIH0KKworICAgICAgICBAUFVUCisgICAgICAgIEBQYXRoKCJ7cX0iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHB1dCgpIHsKKyAgICAgICAgICAgIHJldHVybiAicHV0IjsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJ7cG9zdH0iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3QoKSB7CisgICAgICAgICAgICByZXR1cm4gInBvc3QiOworICAgICAgICB9CisKKworICAgIH0KKworICAgIEBQYXRoKCJyb290L3tifSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVRlbXBsYXRlQiB7CisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRCKCkgeworICAgICAgICAgICAgcmV0dXJuICJnZXQtQiI7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1lcmdpbmdPZlRlbXBsYXRlcygpIHsKKyAgICAgICAgZmluYWwgTGlzdDxSZXNvdXJjZT4gcmVzb3VyY2VzID0gY3JlYXRlUmVzb3VyY2VzKFJlc291cmNlVGVtcGxhdGVBLmNsYXNzLCBSZXNvdXJjZVRlbXBsYXRlQi5jbGFzcyk7CisgICAgICAgIHRlc3RNZXJnaW5nVGVtcGxhdGVSZXNvdXJjZXMocmVzb3VyY2VzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNZXJnaW5nT2ZUZW1wbGF0ZXNQcm9ncmFtbWF0aWMoKSB7CisgICAgICAgIGZpbmFsIExpc3Q8UmVzb3VyY2U+IHJlc291cmNlcyA9IGdldFJlc291cmNlc1RlbXBsYXRlc1Byb2dyYW1tYXRpYygpOworICAgICAgICB0ZXN0TWVyZ2luZ1RlbXBsYXRlUmVzb3VyY2VzKHJlc291cmNlcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RNZXJnaW5nVGVtcGxhdGVSZXNvdXJjZXMoTGlzdDxSZXNvdXJjZT4gcmVzb3VyY2VzKSB7CisgICAgICAgIGFzc2VydEVxdWFscygyLCByZXNvdXJjZXMuc2l6ZSgpKTsKKyAgICAgICAgZmluYWwgUmVzb3VyY2UgcmVzQiA9IFJlc291cmNlVGVzdFV0aWxzLmdldFJlc291cmNlKHJlc291cmNlcywgInJvb3Qve2J9Iik7CisgICAgICAgIFJlc291cmNlVGVzdFV0aWxzLmNvbnRhaW5zRXhhY3RNZXRob2RzKHJlc0IsIGZhbHNlLCAiR0VUIik7CisgICAgICAgIGZpbmFsIFJlc291cmNlIHJlc0EgPSBSZXNvdXJjZVRlc3RVdGlscy5nZXRSZXNvdXJjZShyZXNvdXJjZXMsICJyb290L3thfSIpOworCisgICAgICAgIGFzc2VydFRydWUocmVzQS5nZXRSZXNvdXJjZU1ldGhvZHMoKS5pc0VtcHR5KCkpOworICAgICAgICBmaW5hbCBMaXN0PFJlc291cmNlPiBjaGlsZFJlc291cmNlcyA9IHJlc0EuZ2V0Q2hpbGRSZXNvdXJjZXMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGNoaWxkUmVzb3VyY2VzLnNpemUoKSk7CisgICAgICAgIGZpbmFsIFJlc291cmNlIGNoaWxkUSA9IFJlc291cmNlVGVzdFV0aWxzLmdldFJlc291cmNlKGNoaWxkUmVzb3VyY2VzLCAie3F9Iik7CisgICAgICAgIFJlc291cmNlVGVzdFV0aWxzLmNvbnRhaW5zRXhhY3RNZXRob2RzKGNoaWxkUSwgZmFsc2UsICJHRVQiLCAiUFVUIik7CisgICAgICAgIGZpbmFsIFJlc291cmNlIGNoaWxkUG9zdCA9IFJlc291cmNlVGVzdFV0aWxzLmdldFJlc291cmNlKGNoaWxkUmVzb3VyY2VzLCAie3Bvc3R9Iik7CisgICAgICAgIFJlc291cmNlVGVzdFV0aWxzLmNvbnRhaW5zRXhhY3RNZXRob2RzKGNoaWxkUG9zdCwgZmFsc2UsICJQT1NUIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0PFJlc291cmNlPiBjcmVhdGVSZXNvdXJjZXMoQ2xhc3M8Pz4uLi4gcmVzb3VyY2VDbGFzcykgeworICAgICAgICBmaW5hbCBSZXNvdXJjZUJhZy5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUmVzb3VyY2VCYWcuQnVpbGRlcigpOworICAgICAgICBmb3IgKENsYXNzPD8+IGNsYXp6IDogcmVzb3VyY2VDbGFzcykgeworICAgICAgICAgICAgZmluYWwgUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNvdXJjZS5mcm9tKGNsYXp6KTsKKyAgICAgICAgICAgIGJ1aWxkZXIucmVnaXN0ZXJQcm9ncmFtbWF0aWNSZXNvdXJjZShyZXNvdXJjZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgUmVzb3VyY2VCYWcgYmFnID0gYnVpbGRlci5idWlsZCgpOworICAgICAgICByZXR1cm4gYmFnLmdldFJvb3RSZXNvdXJjZXMoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8UmVzb3VyY2U+IGdldFJlc291cmNlc1RlbXBsYXRlc1Byb2dyYW1tYXRpYygpIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2UuQnVpbGRlciByb290ID0gUmVzb3VyY2UuYnVpbGRlcigicm9vdC97YX0iKTsKKyAgICAgICAgcm9vdC5hZGRDaGlsZFJlc291cmNlKCJ7cX0iKS5hZGRNZXRob2QoIkdFVCIpLmhhbmRsZWRCeShuZXcgTXlJbmZsZWN0b3IoKSk7CisgICAgICAgIHJvb3QuYWRkQ2hpbGRSZXNvdXJjZSgie3F9IikuYWRkTWV0aG9kKCJQVVQiKS5oYW5kbGVkQnkobmV3IE15SW5mbGVjdG9yKCkpOworICAgICAgICByb290LmFkZENoaWxkUmVzb3VyY2UoIntwb3N0fSIpLmFkZE1ldGhvZCgiUE9TVCIpLmhhbmRsZWRCeShuZXcgTXlJbmZsZWN0b3IoKSk7CisKKyAgICAgICAgZmluYWwgUmVzb3VyY2UuQnVpbGRlciByb290MiA9IFJlc291cmNlLmJ1aWxkZXIoInJvb3Qve2J9Iik7CisgICAgICAgIHJvb3QyLmFkZE1ldGhvZCgiR0VUIikuaGFuZGxlZEJ5KG5ldyBNeUluZmxlY3RvcigpKTsKKworICAgICAgICBmaW5hbCBSZXNvdXJjZUJhZy5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUmVzb3VyY2VCYWcuQnVpbGRlcigpOworICAgICAgICBidWlsZGVyLnJlZ2lzdGVyUHJvZ3JhbW1hdGljUmVzb3VyY2Uocm9vdC5idWlsZCgpKTsKKyAgICAgICAgYnVpbGRlci5yZWdpc3RlclByb2dyYW1tYXRpY1Jlc291cmNlKHJvb3QyLmJ1aWxkKCkpOworICAgICAgICBmaW5hbCBSZXNvdXJjZUJhZyBiYWcgPSBidWlsZGVyLmJ1aWxkKCk7CisgICAgICAgIHJldHVybiBiYWcuZ2V0Um9vdFJlc291cmNlcygpOworICAgIH0KKworfQorCisKKwpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvU2VjdXJpdHlDb250ZXh0VGVzdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvU2VjdXJpdHlDb250ZXh0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxM2YyYWMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9TZWN1cml0eUNvbnRleHRUZXN0LmphdmEKQEAgLTAsMCArMSwyODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5TZWN1cml0eUNvbnRleHQ7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBUZXN0IGNsYXNzIGZvciB0ZXN0aW5nIHNlY3VyaXR5IGNvbnRleHQgaW4gdGhlIEZpbHRlciBhbmQgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgY2xhc3MgU2VjdXJpdHlDb250ZXh0VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTkNJUEFMX05BTUUgPSAiU2V0QnlGaWx0ZXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUklOQ0lQQUxfTkFNRV9TRUNPTkQgPSAiU2V0QnlGaWx0ZXJTZWNvbmQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTS0lQX0ZJTFRFUiA9ICJza2lwRmlsdGVyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJJTkNJUEFMX0lTX05VTEwgPSAicHJpbmNpcGFsSXNOdWxsIjsKKworICAgIEBQcmlvcml0eSgxMDApCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2VjdXJpdHlDb250ZXh0RmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAvLyB0ZXN0IGluamVjdGlvbnMKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmMuZ2V0U2VjdXJpdHlDb250ZXh0KCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyYy5nZXRTZWN1cml0eUNvbnRleHQoKS5nZXRVc2VyUHJpbmNpcGFsKCkgPT0gbnVsbCk7CisKKyAgICAgICAgICAgIFN0cmluZyBoZWFkZXIgPSByYy5nZXRIZWFkZXJzKCkuZ2V0Rmlyc3QoU0tJUF9GSUxURVIpOworICAgICAgICAgICAgaWYgKCJ0cnVlIi5lcXVhbHMoaGVhZGVyKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gc2V0IG5ldyBTZWN1cml0eSBDb250ZXh0CisgICAgICAgICAgICByYy5zZXRTZWN1cml0eUNvbnRleHQobmV3IFNlY3VyaXR5Q29udGV4dCgpIHsKKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzVXNlckluUm9sZShTdHJpbmcgcm9sZSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTZWN1cmUoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgUHJpbmNpcGFsIGdldFVzZXJQcmluY2lwYWwoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUHJpbmNpcGFsKCkgeworCisgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUFJJTkNJUEFMX05BTUU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAob2JqIGluc3RhbmNlb2YgUHJpbmNpcGFsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgUFJJTkNJUEFMX05BTUUuZXF1YWxzKCgoUHJpbmNpcGFsKSBvYmopLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEF1dGhlbnRpY2F0aW9uU2NoZW1lKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IHRoYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0aGF0ICE9IG51bGwgJiYgdGhhdC5nZXRDbGFzcygpID09IHRoaXMuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgfQorCisKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorCisKKyAgICBAUHJpb3JpdHkoMTAxKQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNlY3VyaXR5Q29udGV4dEZpbHRlclNlY29uZEluQ2hhaW4gaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHsKKyAgICAgICAgQENvbnRleHQKKyAgICAgICAgU2VjdXJpdHlDb250ZXh0IHNjOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHNjKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhzYy5nZXRVc2VyUHJpbmNpcGFsKCkuZ2V0TmFtZSgpLCBQUklOQ0lQQUxfTkFNRSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoc2MsIHJjLmdldFNlY3VyaXR5Q29udGV4dCgpKTsKKworICAgICAgICAgICAgU3RyaW5nIGhlYWRlciA9IHJjLmdldEhlYWRlcnMoKS5nZXRGaXJzdChTS0lQX0ZJTFRFUik7CisgICAgICAgICAgICBpZiAoInRydWUiLmVxdWFscyhoZWFkZXIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzZXQgbmV3IFNlY3VyaXR5IENvbnRleHQKKyAgICAgICAgICAgIHJjLnNldFNlY3VyaXR5Q29udGV4dChuZXcgU2VjdXJpdHlDb250ZXh0KCkgeworCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNVc2VySW5Sb2xlKFN0cmluZyByb2xlKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1NlY3VyZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBQcmluY2lwYWwgZ2V0VXNlclByaW5jaXBhbCgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcmluY2lwYWwoKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQUklOQ0lQQUxfTkFNRV9TRUNPTkQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuaGFzaENvZGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAob2JqIGluc3RhbmNlb2YgUHJpbmNpcGFsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgUFJJTkNJUEFMX05BTUVfU0VDT05ELmVxdWFscygoKFByaW5jaXBhbCkgb2JqKS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRBdXRoZW50aWNhdGlvblNjaGVtZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmhhc2hDb2RlKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCB0aGF0KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAodGhhdCAhPSBudWxsICYmIHRoYXQuZ2V0Q2xhc3MoKSA9PSB0aGlzLmdldENsYXNzKCkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci50b1N0cmluZygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgU2VjdXJpdHlDb250ZXh0IGluamVjdGlvbiBpbnRvIGEgcmVzb3VyY2UgbWV0aG9kLgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24gVGhyb3duIHdoZW4gcmVxdWVzdCBwcm9jZXNzaW5nIGZhaWxzIGluIHRoZSBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZWN1cml0eUNvbnRleHRJbmplY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MsIFNlY3VyaXR5Q29udGV4dEZpbHRlci5jbGFzcywKKyAgICAgICAgICAgICAgICBTZWN1cml0eUNvbnRleHRGaWx0ZXJTZWNvbmRJbkNoYWluLmNsYXNzKTsKKyAgICAgICAgZmluYWwgQXBwbGljYXRpb25IYW5kbGVyIGFwcGxpY2F0aW9uID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihyZXNvdXJjZUNvbmZpZyk7CisKKyAgICAgICAgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBhcHBsaWNhdGlvbi5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3Rlc3QvMiIsICJHRVQiKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUFJJTkNJUEFMX05BTUVfU0VDT05ELCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgU2VjdXJpdHlDb250ZXh0IGluIGZpbHRlci4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIFRocm93biB3aGVuIHJlcXVlc3QgcHJvY2Vzc2luZyBmYWlscyBpbiB0aGUgYXBwbGljYXRpb24uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VjdXJpdHlDb250ZXh0SW5qZWN0aW9uRmlsdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzLCBTZWN1cml0eUNvbnRleHRGaWx0ZXIuY2xhc3MpOworICAgICAgICBmaW5hbCBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwbGljYXRpb24gPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKHJlc291cmNlQ29uZmlnKTsKKworICAgICAgICBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGFwcGxpY2F0aW9uLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvdGVzdCIsICJHRVQiKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUFJJTkNJUEFMX05BTUUsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBTZWN1cml0eUNvbnRleHQgaW4gZmlsdGVyLgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24gVGhyb3duIHdoZW4gcmVxdWVzdCBwcm9jZXNzaW5nIGZhaWxzIGluIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRTZWN1cml0eUNvbnRleHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MsIFNlY3VyaXR5Q29udGV4dEZpbHRlci5jbGFzcyk7CisgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbiA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIocmVzb3VyY2VDb25maWcpOworCisgICAgICAgIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0KKyAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbi5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3Rlc3QiLCAiR0VUIikuaGVhZGVyKFNLSVBfRklMVEVSLCAidHJ1ZSIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIE9iamVjdCBlbnRpdHkgPSByZXNwb25zZS5nZXRFbnRpdHkoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghUFJJTkNJUEFMX05BTUUuZXF1YWxzKGVudGl0eSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgcmVzb3VyY2UgY2xhc3MuCisgICAgICovCisgICAgQFBhdGgoInRlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUZXN0IHJlc291cmNlIG1ldGhvZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNyIENvbnRhaW5lciByZXF1ZXN0IGNvbnRleHQuCisgICAgICAgICAqIEByZXR1cm4gU3RyaW5nIHJlc3BvbnNlIHdpdGggcHJpbmNpcGFsIG5hbWUuCisgICAgICAgICAqLworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U29tZXRoaW5nKEBDb250ZXh0IENvbnRhaW5lclJlcXVlc3RDb250ZXh0IGNyKSB7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGNyLmdldFNlY3VyaXR5Q29udGV4dCgpKTsKKyAgICAgICAgICAgIFByaW5jaXBhbCB1c2VyUHJpbmNpcGFsID0gY3IuZ2V0U2VjdXJpdHlDb250ZXh0KCkuZ2V0VXNlclByaW5jaXBhbCgpOworICAgICAgICAgICAgcmV0dXJuIHVzZXJQcmluY2lwYWwgPT0gbnVsbCA/IFBSSU5DSVBBTF9JU19OVUxMIDogdXNlclByaW5jaXBhbC5nZXROYW1lKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVGVzdCByZXNvdXJjZSBtZXRob2QuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzYyBzZWN1cml0eSBjb250ZXh0LgorICAgICAgICAgKiBAcGFyYW0gY3IgY29udGFpbmVyIHJlcXVlc3QgY29udGV4dC4KKyAgICAgICAgICogQHJldHVybiBTdHJpbmcgcmVzcG9uc2Ugd2l0aCBwcmluY2lwYWwgbmFtZS4KKyAgICAgICAgICovCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIjIiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFNvbWV0aGluZzIoQENvbnRleHQgU2VjdXJpdHlDb250ZXh0IHNjLCBAQ29udGV4dCBDb250YWluZXJSZXF1ZXN0Q29udGV4dCBjcikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHNjLCBjci5nZXRTZWN1cml0eUNvbnRleHQoKSk7CisgICAgICAgICAgICBQcmluY2lwYWwgdXNlclByaW5jaXBhbCA9IHNjLmdldFVzZXJQcmluY2lwYWwoKTsKKyAgICAgICAgICAgIHJldHVybiB1c2VyUHJpbmNpcGFsID09IG51bGwgPyBQUklOQ0lQQUxfSVNfTlVMTCA6IHVzZXJQcmluY2lwYWwuZ2V0TmFtZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvU2VjdXJpdHlNYW5hZ2VyQ29uZmlndXJlZFRlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL1NlY3VyaXR5TWFuYWdlckNvbmZpZ3VyZWRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDljNWYxOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL1NlY3VyaXR5TWFuYWdlckNvbmZpZ3VyZWRUZXN0LmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworCisvKioKKyAqIFRlc3QgdGhhdCB2ZXJpZmllcyB0aGF0IHNlY3VyaXR5IG1hbmFnZXIgaXMgc2V0dXAgdG8gcnVuIHRoZSBKZXJzZXkgY29yZSBzZXJ2ZXIgdW5pdCB0ZXN0cy4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgU2VjdXJpdHlNYW5hZ2VyQ29uZmlndXJlZFRlc3QgeworICAgIC8qKgorICAgICAqIENoZWNrIHRoYXQgc3lzdGVtIHNlY3VyaXR5IG1hbmFnZXIgaGFzIGJlZW4gY29uZmlndXJlZC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZWN1cml0eU1hbmFnZXJJc0NvbmZpZ3VyZWQoKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwoIkplcnNleSBjb3JlIHNlcnZlciB1bml0IHRlc3RzIHNob3VsZCBydW4gd2l0aCBhY3RpdmUgc2VjdXJpdHkgbWFuYWdlciIsCisgICAgICAgICAgICAgICAgU3lzdGVtLmdldFNlY3VyaXR5TWFuYWdlcigpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9UZXN0Q29uZmlnQ29uZmlndXJhdG9yLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9UZXN0Q29uZmlnQ29uZmlndXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZiZWUxMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL1Rlc3RDb25maWdDb25maWd1cmF0b3IuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkJvb3RzdHJhcEJhZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Cb290c3RyYXBDb25maWd1cmF0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CisKKy8qKgorICogQ29uZmlndXJhdG9yIHdoaWNoIGluaXRpYWxpemVzIGFuZCByZWdpc3RlciBjb25maWd1cmF0aW9uLgorICoKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitwdWJsaWMgY2xhc3MgVGVzdENvbmZpZ0NvbmZpZ3VyYXRvciBpbXBsZW1lbnRzIEJvb3RzdHJhcENvbmZpZ3VyYXRvciB7CisKKyAgICBwcml2YXRlIGZpbmFsIFJlc291cmNlQ29uZmlnIHJ1bnRpbWVDb25maWc7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgdGVzdCBydW50aW1lIGNvbmZpZyBjb25maWd1cmF0b3Igd2l0aCBkdW1teSByZXNvdXJjZSBjb25maWcuCisgICAgICovCisgICAgcHVibGljIFRlc3RDb25maWdDb25maWd1cmF0b3IoKSB7CisgICAgICAgIHRoaXMobmV3IFJlc291cmNlQ29uZmlnKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSB0ZXN0IHJ1bnRpbWUgY29uZmlnIGNvbmZpZ3VyYXRvciB3aXRoIGR1bW15IHJlc291cmNlIGNvbmZpZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBydW50aW1lQ29uZmlnIGR1bW15IHJlc291cmNlIGNvbmZpZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGVzdENvbmZpZ0NvbmZpZ3VyYXRvcihSZXNvdXJjZUNvbmZpZyBydW50aW1lQ29uZmlnKSB7CisgICAgICAgIHRoaXMucnVudGltZUNvbmZpZyA9IHJ1bnRpbWVDb25maWc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaW5pdChJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIsIEJvb3RzdHJhcEJhZyBib290c3RyYXBCYWcpIHsKKyAgICAgICAgYm9vdHN0cmFwQmFnLnNldENvbmZpZ3VyYXRpb24ocnVudGltZUNvbmZpZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcG9zdEluaXQoSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyLCBCb290c3RyYXBCYWcgYm9vdHN0cmFwQmFnKSB7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9UZXN0SW5qZWN0aW9uTWFuYWdlckZhY3RvcnkuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL1Rlc3RJbmplY3Rpb25NYW5hZ2VyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZDI4ODgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9UZXN0SW5qZWN0aW9uTWFuYWdlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuUnVudGltZVR5cGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5BdXRvRGlzY292ZXJhYmxlQ29uZmlndXJhdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkJvb3RzdHJhcENvbmZpZ3VyYXRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Db250ZXh0UmVzb2x2ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkV4Y2VwdGlvbk1hcHBlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkFic3RyYWN0QmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5CaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5NZXNzYWdlQm9keUZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5NZXNzYWdpbmdCaW5kZXJzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1vZGVsLmludGVybmFsLk1hbmFnZWRPYmplY3RzRmluYWxpemVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWwuUmVxdWVzdFNjb3BlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5pbmplY3QuUGFyYW1Db252ZXJ0ZXJDb25maWd1cmF0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLmluamVjdC5QYXJhbUV4dHJhY3RvckNvbmZpZ3VyYXRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuaW5qZWN0LlZhbHVlUGFyYW1Qcm92aWRlckNvbmZpZ3VyYXRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwucHJvY2Vzcy5SZXF1ZXN0UHJvY2Vzc2luZ0NvbmZpZ3VyYXRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuaW50ZXJuYWwuUmVzb3VyY2VNZXRob2RJbnZva2VyQ29uZmlndXJhdG9yOworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgdG8gY3JlYXRlIGluaXRpYWxpemVkIHNlcnZlci1zaWRlIGluamVjdGlvbiBtYW5hZ2VyLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBUZXN0SW5qZWN0aW9uTWFuYWdlckZhY3RvcnkgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgQmluZGVyIEVNUFRZX0JJTkRFUiA9IG5ldyBBYnN0cmFjdEJpbmRlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIFRlc3RJbmplY3Rpb25NYW5hZ2VyRmFjdG9yeSgpIHsKKyAgICAgICAgLy8gcHJldmVudHMgaW5zdGFudGlhdGlvbgorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgaW5pdGlhbGl6ZWQgc2VydmVyIGluamVjdGlvbiBtYW5hZ2VyLgorICAgICAqCisgICAgICogQHJldHVybiBuZXcgaW5pdGlhbGl6ZWQgc2VydmVyIGluamVjdGlvbiBtYW5hZ2VyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQm9vdHN0cmFwUmVzdWx0IGNyZWF0ZUluamVjdGlvbk1hbmFnZXIoKSB7CisgICAgICAgIHJldHVybiBjcmVhdGVJbmplY3Rpb25NYW5hZ2VyKG5ldyBSZXNvdXJjZUNvbmZpZygpLCBFTVBUWV9CSU5ERVIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgaW5pdGlhbGl6ZWQgc2VydmVyIGluamVjdGlvbiBtYW5hZ2VyLgorICAgICAqCisgICAgICogQHBhcmFtIHJ1bnRpbWVDb25maWcgcnVudGltZSBjb25maWcgd2l0aCB0ZXN0J3MgY29tcG9uZW50cy4KKyAgICAgKiBAcmV0dXJuIG5ldyBpbml0aWFsaXplZCBzZXJ2ZXIgaW5qZWN0aW9uIG1hbmFnZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCb290c3RyYXBSZXN1bHQgY3JlYXRlSW5qZWN0aW9uTWFuYWdlcihSZXNvdXJjZUNvbmZpZyBydW50aW1lQ29uZmlnKSB7CisgICAgICAgIHJldHVybiBjcmVhdGVJbmplY3Rpb25NYW5hZ2VyKHJ1bnRpbWVDb25maWcsIEVNUFRZX0JJTkRFUik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyBpbml0aWFsaXplZCBzZXJ2ZXIgaW5qZWN0aW9uIG1hbmFnZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcnVudGltZUNvbmZpZyBydW50aW1lIGNvbmZpZyB3aXRoIHRlc3QncyBjb21wb25lbnRzLgorICAgICAqIEBwYXJhbSBjdXN0b21CaW5kZXIgIGJpbmRlciB3aGljaCBpcyBpbW1lZGlhdGVseSByZWdpc3RlcmVkLgorICAgICAqIEByZXR1cm4gbmV3IGluaXRpYWxpemVkIHNlcnZlciBpbmplY3Rpb24gbWFuYWdlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEJvb3RzdHJhcFJlc3VsdCBjcmVhdGVJbmplY3Rpb25NYW5hZ2VyKFJlc291cmNlQ29uZmlnIHJ1bnRpbWVDb25maWcsICBCaW5kZXIgY3VzdG9tQmluZGVyKSB7CisgICAgICAgIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciA9IEluamVjdGlvbnMuY3JlYXRlSW5qZWN0aW9uTWFuYWdlcigpOworICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyKG5ldyBTZXJ2ZXJCaW5kZXIoKSk7CisgICAgICAgIGluamVjdGlvbk1hbmFnZXIucmVnaXN0ZXIobmV3IE1lc3NhZ2luZ0JpbmRlcnMuTWVzc2FnZUJvZHlQcm92aWRlcnMocnVudGltZUNvbmZpZy5nZXRQcm9wZXJ0aWVzKCksIFJ1bnRpbWVUeXBlLlNFUlZFUikpOworICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyKGN1c3RvbUJpbmRlcik7CisKKyAgICAgICAgU2VydmVyQm9vdHN0cmFwQmFnIGJvb3RzdHJhcEJhZyA9IG5ldyBTZXJ2ZXJCb290c3RyYXBCYWcoKTsKKyAgICAgICAgTWFuYWdlZE9iamVjdHNGaW5hbGl6ZXIgbWFuYWdlZE9iamVjdHNGaW5hbGl6ZXIgPSBuZXcgTWFuYWdlZE9iamVjdHNGaW5hbGl6ZXIoaW5qZWN0aW9uTWFuYWdlcik7CisgICAgICAgIGJvb3RzdHJhcEJhZy5zZXRNYW5hZ2VkT2JqZWN0c0ZpbmFsaXplcihtYW5hZ2VkT2JqZWN0c0ZpbmFsaXplcik7CisKKyAgICAgICAgTGlzdDxCb290c3RyYXBDb25maWd1cmF0b3I+IGJvb3RzdHJhcENvbmZpZ3VyYXRvcnMgPSBBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgICAgIG5ldyBSZXF1ZXN0UHJvY2Vzc2luZ0NvbmZpZ3VyYXRvcigpLAorICAgICAgICAgICAgICAgIG5ldyBSZXF1ZXN0U2NvcGUuUmVxdWVzdFNjb3BlQ29uZmlndXJhdG9yKCksCisgICAgICAgICAgICAgICAgbmV3IFBhcmFtQ29udmVydGVyQ29uZmlndXJhdG9yKCksCisgICAgICAgICAgICAgICAgbmV3IFBhcmFtRXh0cmFjdG9yQ29uZmlndXJhdG9yKCksCisgICAgICAgICAgICAgICAgbmV3IFZhbHVlUGFyYW1Qcm92aWRlckNvbmZpZ3VyYXRvcigpLAorICAgICAgICAgICAgICAgIG5ldyBKZXJzZXlSZXNvdXJjZUNvbnRleHRDb25maWd1cmF0b3IoKSwKKyAgICAgICAgICAgICAgICBuZXcgQ29tcG9uZW50UHJvdmlkZXJDb25maWd1cmF0b3IoKSwKKyAgICAgICAgICAgICAgICBuZXcgVGVzdENvbmZpZ0NvbmZpZ3VyYXRvcihydW50aW1lQ29uZmlnKSwKKyAgICAgICAgICAgICAgICBuZXcgQ29udGV4dFJlc29sdmVyRmFjdG9yeS5Db250ZXh0UmVzb2x2ZXJzQ29uZmlndXJhdG9yKCksCisgICAgICAgICAgICAgICAgbmV3IE1lc3NhZ2VCb2R5RmFjdG9yeS5NZXNzYWdlQm9keVdvcmtlcnNDb25maWd1cmF0b3IoKSwKKyAgICAgICAgICAgICAgICBuZXcgRXhjZXB0aW9uTWFwcGVyRmFjdG9yeS5FeGNlcHRpb25NYXBwZXJzQ29uZmlndXJhdG9yKCksCisgICAgICAgICAgICAgICAgbmV3IFJlc291cmNlTWV0aG9kSW52b2tlckNvbmZpZ3VyYXRvcigpLAorICAgICAgICAgICAgICAgIG5ldyBQcm9jZXNzaW5nUHJvdmlkZXJzQ29uZmlndXJhdG9yKCksCisgICAgICAgICAgICAgICAgbmV3IENvbnRhaW5lclByb3ZpZGVyQ29uZmlndXJhdG9yKFJ1bnRpbWVUeXBlLlNFUlZFUiksCisgICAgICAgICAgICAgICAgbmV3IEF1dG9EaXNjb3ZlcmFibGVDb25maWd1cmF0b3IoUnVudGltZVR5cGUuU0VSVkVSKSwKKyAgICAgICAgICAgICAgICBuZXcgUmVzb3VyY2VCYWdDb25maWd1cmF0b3IoKSwKKyAgICAgICAgICAgICAgICBuZXcgRXh0ZXJuYWxSZXF1ZXN0U2NvcGVDb25maWd1cmF0b3IoKSwKKyAgICAgICAgICAgICAgICBuZXcgTW9kZWxQcm9jZXNzb3JDb25maWd1cmF0b3IoKSwKKyAgICAgICAgICAgICAgICBuZXcgUmVzb3VyY2VNb2RlbENvbmZpZ3VyYXRvcigpLAorICAgICAgICAgICAgICAgIG5ldyBTZXJ2ZXJFeGVjdXRvclByb3ZpZGVyc0NvbmZpZ3VyYXRvcigpKTsKKworICAgICAgICBib290c3RyYXBDb25maWd1cmF0b3JzLmZvckVhY2goY29uZmlndXJhdG9yIC0+IGNvbmZpZ3VyYXRvci5pbml0KGluamVjdGlvbk1hbmFnZXIsIGJvb3RzdHJhcEJhZykpOworCisgICAgICAgIC8vIENvbmZpZ3VyZSBiaW5kZXJzIGFuZCBmZWF0dXJlcy4KKyAgICAgICAgYm9vdHN0cmFwQmFnLmdldFJ1bnRpbWVDb25maWcoKS5jb25maWd1cmVNZXRhUHJvdmlkZXJzKGluamVjdGlvbk1hbmFnZXIsIGJvb3RzdHJhcEJhZy5nZXRNYW5hZ2VkT2JqZWN0c0ZpbmFsaXplcigpKTsKKworICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLmNvbXBsZXRlUmVnaXN0cmF0aW9uKCk7CisgICAgICAgIGJvb3RzdHJhcENvbmZpZ3VyYXRvcnMuZm9yRWFjaChjb25maWd1cmF0b3IgLT4gY29uZmlndXJhdG9yLnBvc3RJbml0KGluamVjdGlvbk1hbmFnZXIsIGJvb3RzdHJhcEJhZykpOworICAgICAgICByZXR1cm4gbmV3IEJvb3RzdHJhcFJlc3VsdChpbmplY3Rpb25NYW5hZ2VyLCBib290c3RyYXBCYWcpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQm9vdHN0cmFwUmVzdWx0IHsKKyAgICAgICAgcHVibGljIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlcjsKKyAgICAgICAgcHVibGljIFNlcnZlckJvb3RzdHJhcEJhZyBib290c3RyYXBCYWc7CisKKyAgICAgICAgQm9vdHN0cmFwUmVzdWx0KEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciwgU2VydmVyQm9vdHN0cmFwQmFnIGJvb3RzdHJhcEJhZykgeworICAgICAgICAgICAgdGhpcy5pbmplY3Rpb25NYW5hZ2VyID0gaW5qZWN0aW9uTWFuYWdlcjsKKyAgICAgICAgICAgIHRoaXMuYm9vdHN0cmFwQmFnID0gYm9vdHN0cmFwQmFnOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvVXJpSW5mb01hdGNoZWRSZXNvdXJjZXNUZXN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9VcmlJbmZvTWF0Y2hlZFJlc291cmNlc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGUxMTA5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvVXJpSW5mb01hdGNoZWRSZXNvdXJjZXNUZXN0LmphdmEKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3QgVXJpSW5mbyBjb250ZW50LgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBVcmlJbmZvTWF0Y2hlZFJlc291cmNlc1Rlc3QgeworCisgICAgQXBwbGljYXRpb25IYW5kbGVyIGFwcGxpY2F0aW9uOworCisgICAgcHJpdmF0ZSBBcHBsaWNhdGlvbkhhbmRsZXIgY3JlYXRlQXBwbGljYXRpb24oQ2xhc3M8Pz4uLi4gcmMpIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcocmMpOworICAgICAgICByZXR1cm4gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihyZXNvdXJjZUNvbmZpZyk7CisgICAgfQorCisgICAgQFBhdGgoImZvbyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEZvbyhAQ29udGV4dCBVcmlJbmZvIHVyaUluZm8pIHsKKyAgICAgICAgICAgIGFzc2VydE1hdGNoZWRSZXNvdXJjZXModXJpSW5mbywgUmVzb3VyY2UuY2xhc3MpOworICAgICAgICAgICAgcmV0dXJuICJmb28iOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiYmFyIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRGb29CYXIoQENvbnRleHQgVXJpSW5mbyB1cmlJbmZvKSB7CisgICAgICAgICAgICBhc3NlcnRNYXRjaGVkUmVzb3VyY2VzKHVyaUluZm8sIFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgICAgIHJldHVybiAiZm9vYmFyIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJiYXoiKQorICAgICAgICBwdWJsaWMgU3ViUmVzb3VyY2UgZ2V0Rm9vQmF6KEBDb250ZXh0IFVyaUluZm8gdXJpSW5mbykgeworICAgICAgICAgICAgYXNzZXJ0TWF0Y2hlZFJlc291cmNlcyh1cmlJbmZvLCBSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN1YlJlc291cmNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN1YlJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9vQmF6KEBDb250ZXh0IFVyaUluZm8gdXJpSW5mbykgeworICAgICAgICAgICAgYXNzZXJ0TWF0Y2hlZFJlc291cmNlcyh1cmlJbmZvLCBTdWJSZXNvdXJjZS5jbGFzcywgUmVzb3VyY2UuY2xhc3MpOworICAgICAgICAgICAgcmV0dXJuICJmb29iYXoiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiYmFyIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRGb29CYXpCYXIoQENvbnRleHQgVXJpSW5mbyB1cmlJbmZvKSB7CisgICAgICAgICAgICBhc3NlcnRNYXRjaGVkUmVzb3VyY2VzKHVyaUluZm8sIFN1YlJlc291cmNlLmNsYXNzLCBSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgICAgICByZXR1cm4gImZvb2JhemJhciI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXRjaGVkUmVzb3VyY2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEFwcGxpY2F0aW9uSGFuZGxlciBhcHAgPSBjcmVhdGVBcHBsaWNhdGlvbihSZXNvdXJjZS5jbGFzcyk7CisKKyAgICAgICAgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2VDb250ZXh0OworICAgICAgICByZXNwb25zZUNvbnRleHQgPSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9mb28iLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlQ29udGV4dC5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwgcmVzcG9uc2VDb250ZXh0LmdldEVudGl0eSgpKTsKKworICAgICAgICByZXNwb25zZUNvbnRleHQgPSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9mb28vYmFyIiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZUNvbnRleHQuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZvb2JhciIsIHJlc3BvbnNlQ29udGV4dC5nZXRFbnRpdHkoKSk7CisKKyAgICAgICAgcmVzcG9uc2VDb250ZXh0ID0gYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvZm9vL2JheiIsICJHRVQiKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2VDb250ZXh0LmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb29iYXoiLCByZXNwb25zZUNvbnRleHQuZ2V0RW50aXR5KCkpOworCisgICAgICAgIHJlc3BvbnNlQ29udGV4dCA9IGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL2Zvby9iYXovYmFyIiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZUNvbnRleHQuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZvb2JhemJhciIsIHJlc3BvbnNlQ29udGV4dC5nZXRFbnRpdHkoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRNYXRjaGVkUmVzb3VyY2VzKFVyaUluZm8gdXJpSW5mbywgQ2xhc3M8Pz4uLi4gZXhwZWN0ZWRNYXRjaGVkUmVzb3VyY2VDbGFzc2VzKSB7CisgICAgICAgIGZpbmFsIExpc3Q8T2JqZWN0PiByZXNvdXJjZXMgPSB1cmlJbmZvLmdldE1hdGNoZWRSZXNvdXJjZXMoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRNYXRjaGVkUmVzb3VyY2VDbGFzc2VzLmxlbmd0aCwgcmVzb3VyY2VzLnNpemUoKSk7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgZm9yIChDbGFzczw/PiByYyA6IGV4cGVjdGVkTWF0Y2hlZFJlc291cmNlQ2xhc3NlcykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJjLCByZXNvdXJjZXMuZ2V0KGkrKykuZ2V0Q2xhc3MoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9VcmlJbmZvTWF0Y2hlZFVyaXNUZXN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9VcmlJbmZvTWF0Y2hlZFVyaXNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ5MDY4MAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL1VyaUluZm9NYXRjaGVkVXJpc1Rlc3QuamF2YQpAQCAtMCwwICsxLDIyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdCBVcmlJbmZvIGNvbnRlbnQuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFVyaUluZm9NYXRjaGVkVXJpc1Rlc3QgeworCisgICAgcHJpdmF0ZSBBcHBsaWNhdGlvbkhhbmRsZXIgY3JlYXRlQXBwbGljYXRpb24oQ2xhc3M8Pz4uLi4gcmMpIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcocmMpOworICAgICAgICByZXR1cm4gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihyZXNvdXJjZUNvbmZpZyk7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUm9vdFBhdGhSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFJvb3QoQENvbnRleHQgVXJpSW5mbyB1cmlJbmZvKSB7CisgICAgICAgICAgICBhc3NlcnRNYXRjaGVkVXJpcyh1cmlJbmZvLCAiIik7CisgICAgICAgICAgICByZXR1cm4gInJvb3QiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiYmFyIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRSb290QmFyKEBDb250ZXh0IFVyaUluZm8gdXJpSW5mbykgeworICAgICAgICAgICAgYXNzZXJ0TWF0Y2hlZFVyaXModXJpSW5mbywgImJhciIsICIiKTsKKyAgICAgICAgICAgIHJldHVybiAicm9vdGJhciI7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiYmF6IikKKyAgICAgICAgcHVibGljIFJvb3RTdWJSZXNvdXJjZSBnZXRSb290QmF6KEBDb250ZXh0IFVyaUluZm8gdXJpSW5mbykgeworICAgICAgICAgICAgYXNzZXJ0TWF0Y2hlZFVyaXModXJpSW5mbywgImJheiIsICIiKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUm9vdFN1YlJlc291cmNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJvb3RTdWJSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFJvb3RCYXooQENvbnRleHQgVXJpSW5mbyB1cmlJbmZvKSB7CisgICAgICAgICAgICBhc3NlcnRNYXRjaGVkVXJpcyh1cmlJbmZvLCAiYmF6IiwgIiIpOworICAgICAgICAgICAgcmV0dXJuICJyb290YmF6IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImJhciIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Um9vdEJhekJhcihAQ29udGV4dCBVcmlJbmZvIHVyaUluZm8pIHsKKyAgICAgICAgICAgIGFzc2VydE1hdGNoZWRVcmlzKHVyaUluZm8sICJiYXovYmFyIiwgImJheiIsICIiKTsKKyAgICAgICAgICAgIHJldHVybiAicm9vdGJhemJhciI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiZm9vIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9vKEBDb250ZXh0IFVyaUluZm8gdXJpSW5mbykgeworICAgICAgICAgICAgYXNzZXJ0TWF0Y2hlZFVyaXModXJpSW5mbywgImZvbyIpOworICAgICAgICAgICAgcmV0dXJuICJmb28iOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiYmFyIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRGb29CYXIoQENvbnRleHQgVXJpSW5mbyB1cmlJbmZvKSB7CisgICAgICAgICAgICBhc3NlcnRNYXRjaGVkVXJpcyh1cmlJbmZvLCAiZm9vL2JhciIsICJmb28iKTsKKyAgICAgICAgICAgIHJldHVybiAiZm9vYmFyIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJiYXoiKQorICAgICAgICBwdWJsaWMgU3ViUmVzb3VyY2UgZ2V0Rm9vQmF6KEBDb250ZXh0IFVyaUluZm8gdXJpSW5mbykgeworICAgICAgICAgICAgYXNzZXJ0TWF0Y2hlZFVyaXModXJpSW5mbywgImZvby9iYXoiLCAiZm9vIik7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN1YlJlc291cmNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN1YlJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9vQmF6KEBDb250ZXh0IFVyaUluZm8gdXJpSW5mbykgeworICAgICAgICAgICAgYXNzZXJ0TWF0Y2hlZFVyaXModXJpSW5mbywgImZvby9iYXoiLCAiZm9vIik7CisgICAgICAgICAgICByZXR1cm4gImZvb2JheiI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJiYXIiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEZvb0JhekJhcihAQ29udGV4dCBVcmlJbmZvIHVyaUluZm8pIHsKKyAgICAgICAgICAgIGFzc2VydE1hdGNoZWRVcmlzKHVyaUluZm8sICJmb28vYmF6L2JhciIsICJmb28vYmF6IiwgImZvbyIpOworICAgICAgICAgICAgcmV0dXJuICJmb29iYXpiYXIiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWF0Y2hlZFVyaXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQXBwbGljYXRpb25IYW5kbGVyIGFwcCA9IGNyZWF0ZUFwcGxpY2F0aW9uKFJlc291cmNlLmNsYXNzLCBSb290UGF0aFJlc291cmNlLmNsYXNzKTsKKworICAgICAgICBDb250YWluZXJSZXNwb25zZSByZXNwb25zZUNvbnRleHQ7CisKKyAgICAgICAgcmVzcG9uc2VDb250ZXh0ID0gYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvIiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZUNvbnRleHQuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInJvb3QiLCByZXNwb25zZUNvbnRleHQuZ2V0RW50aXR5KCkpOworCisgICAgICAgIHJlc3BvbnNlQ29udGV4dCA9IGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL2JhciIsICJHRVQiKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2VDb250ZXh0LmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJyb290YmFyIiwgcmVzcG9uc2VDb250ZXh0LmdldEVudGl0eSgpKTsKKworICAgICAgICByZXNwb25zZUNvbnRleHQgPSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9iYXoiLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlQ29udGV4dC5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygicm9vdGJheiIsIHJlc3BvbnNlQ29udGV4dC5nZXRFbnRpdHkoKSk7CisKKyAgICAgICAgcmVzcG9uc2VDb250ZXh0ID0gYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvYmF6L2JhciIsICJHRVQiKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2VDb250ZXh0LmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJyb290YmF6YmFyIiwgcmVzcG9uc2VDb250ZXh0LmdldEVudGl0eSgpKTsKKworICAgICAgICByZXNwb25zZUNvbnRleHQgPSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9mb28iLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlQ29udGV4dC5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwgcmVzcG9uc2VDb250ZXh0LmdldEVudGl0eSgpKTsKKworICAgICAgICByZXNwb25zZUNvbnRleHQgPSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9mb28vYmFyIiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZUNvbnRleHQuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZvb2JhciIsIHJlc3BvbnNlQ29udGV4dC5nZXRFbnRpdHkoKSk7CisKKyAgICAgICAgcmVzcG9uc2VDb250ZXh0ID0gYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvZm9vL2JheiIsICJHRVQiKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2VDb250ZXh0LmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb29iYXoiLCByZXNwb25zZUNvbnRleHQuZ2V0RW50aXR5KCkpOworCisgICAgICAgIHJlc3BvbnNlQ29udGV4dCA9IGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL2Zvby9iYXovYmFyIiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZUNvbnRleHQuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZvb2JhemJhciIsIHJlc3BvbnNlQ29udGV4dC5nZXRFbnRpdHkoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcm9kdWNlciB0ZXN0IGZvciBKRVJTRVktMjA3MS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGluIGNhc2Ugb2YgdGVzdCBlcnJvci4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBYnNvbHV0ZU1hdGNoZWRVcmlzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEFwcGxpY2F0aW9uSGFuZGxlciBhcHAgPSBjcmVhdGVBcHBsaWNhdGlvbihSZXNvdXJjZS5jbGFzcywgUm9vdFBhdGhSZXNvdXJjZS5jbGFzcyk7CisKKyAgICAgICAgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2VDb250ZXh0OworICAgICAgICByZXNwb25zZUNvbnRleHQgPSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8iLCAiaHR0cDovL2xvY2FsaG9zdDo4MDgwLyIsICJHRVQiKS5idWlsZCgpKQorICAgICAgICAgICAgICAgIC5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2VDb250ZXh0LmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJyb290IiwgcmVzcG9uc2VDb250ZXh0LmdldEVudGl0eSgpKTsKKworICAgICAgICByZXNwb25zZUNvbnRleHQgPSBhcHAKKyAgICAgICAgICAgICAgICAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8iLCAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2JhciIsICJHRVQiKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2VDb250ZXh0LmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJyb290YmFyIiwgcmVzcG9uc2VDb250ZXh0LmdldEVudGl0eSgpKTsKKworICAgICAgICByZXNwb25zZUNvbnRleHQgPSBhcHAKKyAgICAgICAgICAgICAgICAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8iLCAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2JheiIsICJHRVQiKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2VDb250ZXh0LmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJyb290YmF6IiwgcmVzcG9uc2VDb250ZXh0LmdldEVudGl0eSgpKTsKKworICAgICAgICByZXNwb25zZUNvbnRleHQgPSBhcHAKKyAgICAgICAgICAgICAgICAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8iLCAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2Jhei9iYXIiLCAiR0VUIikuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlQ29udGV4dC5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygicm9vdGJhemJhciIsIHJlc3BvbnNlQ29udGV4dC5nZXRFbnRpdHkoKSk7CisKKyAgICAgICAgcmVzcG9uc2VDb250ZXh0ID0gYXBwCisgICAgICAgICAgICAgICAgLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCJodHRwOi8vbG9jYWxob3N0OjgwODAvIiwgImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9mb28iLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlQ29udGV4dC5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwgcmVzcG9uc2VDb250ZXh0LmdldEVudGl0eSgpKTsKKworICAgICAgICByZXNwb25zZUNvbnRleHQgPSBhcHAKKyAgICAgICAgICAgICAgICAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8iLCAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2Zvby9iYXIiLCAiR0VUIikuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlQ29udGV4dC5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9vYmFyIiwgcmVzcG9uc2VDb250ZXh0LmdldEVudGl0eSgpKTsKKworICAgICAgICByZXNwb25zZUNvbnRleHQgPSBhcHAKKyAgICAgICAgICAgICAgICAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8iLCAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2Zvby9iYXoiLCAiR0VUIikuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlQ29udGV4dC5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9vYmF6IiwgcmVzcG9uc2VDb250ZXh0LmdldEVudGl0eSgpKTsKKworICAgICAgICByZXNwb25zZUNvbnRleHQgPSBhcHAKKyAgICAgICAgICAgICAgICAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8iLCAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2Zvby9iYXovYmFyIiwgIkdFVCIpLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZUNvbnRleHQuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZvb2JhemJhciIsIHJlc3BvbnNlQ29udGV4dC5nZXRFbnRpdHkoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRNYXRjaGVkVXJpcyhVcmlJbmZvIHVyaUluZm8sIFN0cmluZy4uLiBleHBlY3RlZE1hdGNoZWRVcmlzKSB7CisgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiB1cmlzID0gdXJpSW5mby5nZXRNYXRjaGVkVVJJcygpOworCisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZE1hdGNoZWRVcmlzLmxlbmd0aCwgdXJpcy5zaXplKCkpOworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIGZvciAoU3RyaW5nIHVyaSA6IGV4cGVjdGVkTWF0Y2hlZFVyaXMpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh1cmksIHVyaXMuZ2V0KGkrKykpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvY29uZmlnL2lubmVyc3RhdGljL0lubmVyU3RhdGljQ2xhc3MuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2NvbmZpZy9pbm5lcnN0YXRpYy9Jbm5lclN0YXRpY0NsYXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJmYTA0OAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2NvbmZpZy9pbm5lcnN0YXRpYy9Jbm5lclN0YXRpY0NsYXNzLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuY29uZmlnLmlubmVyc3RhdGljOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CisKKy8qKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitwdWJsaWMgY2xhc3MgSW5uZXJTdGF0aWNDbGFzcyB7CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQdWJsaWNDbGFzcyB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1lKCkgeworICAgICAgICAgICAgcmV0dXJuICJNRSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJpdmF0ZUNsYXNzIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWUoKSB7CisgICAgICAgICAgICByZXR1cm4gIk1FIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIFByb3RlY3RlZENsYXNzIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWUoKSB7CisgICAgICAgICAgICByZXR1cm4gIk1FIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICAvKiBwYWNrYWdlICovIHN0YXRpYyBjbGFzcyBQYWNrYWdlQ2xhc3MgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRNZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAiTUUiOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvY29uZmlnL3RvcGxldmVsL1BhY2thZ2VSb290UmVzb3VyY2VDbGFzcy5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvY29uZmlnL3RvcGxldmVsL1BhY2thZ2VSb290UmVzb3VyY2VDbGFzcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZmViYWQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9jb25maWcvdG9wbGV2ZWwvUGFja2FnZVJvb3RSZXNvdXJjZUNsYXNzLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuY29uZmlnLnRvcGxldmVsOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CisKKy8qKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitAUGF0aCgiLyIpCisvKiBwYWNrYWdlICovIGNsYXNzIFBhY2thZ2VSb290UmVzb3VyY2VDbGFzcyB7CisKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBnZXRNZSgpIHsKKyAgICAgICAgcmV0dXJuICJNRSI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvY29uZmlnL3RvcGxldmVsL1B1YmxpY1Jvb3RSZXNvdXJjZUNsYXNzLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9jb25maWcvdG9wbGV2ZWwvUHVibGljUm9vdFJlc291cmNlQ2xhc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2YzMmMwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvY29uZmlnL3RvcGxldmVsL1B1YmxpY1Jvb3RSZXNvdXJjZUNsYXNzLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuY29uZmlnLnRvcGxldmVsOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CisKKy8qKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitAUGF0aCgiLyIpCitwdWJsaWMgY2xhc3MgUHVibGljUm9vdFJlc291cmNlQ2xhc3MgeworCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWUoKSB7CisgICAgICAgIHJldHVybiAiTUUiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2NvbmZpZy90b3BsZXZlbGlubmVyc3RhdGljL1B1YmxpY1Jvb3RSZXNvdXJjZUlubmVyU3RhdGljQ2xhc3MuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2NvbmZpZy90b3BsZXZlbGlubmVyc3RhdGljL1B1YmxpY1Jvb3RSZXNvdXJjZUlubmVyU3RhdGljQ2xhc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWNmM2RkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvY29uZmlnL3RvcGxldmVsaW5uZXJzdGF0aWMvUHVibGljUm9vdFJlc291cmNlSW5uZXJTdGF0aWNDbGFzcy5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmNvbmZpZy50b3BsZXZlbGlubmVyc3RhdGljOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CisKKy8qKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitAUGF0aCgiLyIpCitwdWJsaWMgY2xhc3MgUHVibGljUm9vdFJlc291cmNlSW5uZXJTdGF0aWNDbGFzcyB7CisKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBnZXRNZSgpIHsKKyAgICAgICAgcmV0dXJuICJNRSI7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHVibGljQ2xhc3MgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRNZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAiTUUiOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvZmlsdGVyL0FwcGxpY2F0aW9uRmlsdGVyVGVzdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvZmlsdGVyL0FwcGxpY2F0aW9uRmlsdGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjOTRmZDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9maWx0ZXIvQXBwbGljYXRpb25GaWx0ZXJUZXN0LmphdmEKQEAgLTAsMCArMSwzMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmZpbHRlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qcmlvcml0eTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5BYnN0cmFjdEJpbmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLkluZmxlY3RvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVxdWVzdENvbnRleHRCdWlsZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2U7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIFRlc3QgZm9yIEpBWC1SUyBmaWx0ZXJzLgorICoKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQXBwbGljYXRpb25GaWx0ZXJUZXN0IHsKKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgSW5qZWN0aW9uIGJpbmRlciB0aGF0IG1heSBiZSB1c2VkIGZvciByZWdpc3RlcmluZyBwcm92aWRlciBpbnN0YW5jZXMgb2YgcHJvdmlkZXIKKyAgICAgKiB0eXBlIHtAY29kZSBUfSBpbiBISzIuCisgICAgICovCisgICAgc3RhdGljIGNsYXNzIFByb3ZpZGVySW5zdGFuY2VCaW5kaW5nQmluZGVyPFQ+IGV4dGVuZHMgQWJzdHJhY3RCaW5kZXIgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgSXRlcmFibGU8PyBleHRlbmRzIFQ+IHByb3ZpZGVyczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDbGFzczxUPiBwcm92aWRlclR5cGU7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhbiBpbmplY3Rpb24gYmluZGVyIGZvciB0aGUgc3VwcGxpZWQgY29sbGVjdGlvbiBvZiBwcm92aWRlciBpbnN0YW5jZXMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwcm92aWRlcnMgbGlzdCBvZiBwcm92aWRlciBpbnN0YW5jZXMuCisgICAgICAgICAqIEBwYXJhbSBwcm92aWRlclR5cGUgcmVnaXN0ZXJlZCBwcm92aWRlciBjb250cmFjdCB0eXBlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFByb3ZpZGVySW5zdGFuY2VCaW5kaW5nQmluZGVyKGZpbmFsIEl0ZXJhYmxlPD8gZXh0ZW5kcyBUPiBwcm92aWRlcnMsIGZpbmFsIENsYXNzPFQ+IHByb3ZpZGVyVHlwZSkgeworICAgICAgICAgICAgdGhpcy5wcm92aWRlcnMgPSBwcm92aWRlcnM7CisgICAgICAgICAgICB0aGlzLnByb3ZpZGVyVHlwZSA9IHByb3ZpZGVyVHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgICAgICBmb3IgKGZpbmFsIFQgcHJvdmlkZXIgOiBwcm92aWRlcnMpIHsKKyAgICAgICAgICAgICAgICBiaW5kKHByb3ZpZGVyKS50byhwcm92aWRlclR5cGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlUmVxdWVzdEZpbHRlcigpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGZpbmFsIEF0b21pY0ludGVnZXIgY2FsbGVkID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CisKKyAgICAgICAgZmluYWwgTGlzdDxDb250YWluZXJSZXF1ZXN0RmlsdGVyPiByZXF1ZXN0RmlsdGVycyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICByZXF1ZXN0RmlsdGVycy5hZGQobmV3IENvbnRhaW5lclJlcXVlc3RGaWx0ZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihmaW5hbCBDb250YWluZXJSZXF1ZXN0Q29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIGNhbGxlZC5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihuZXcgUHJvdmlkZXJJbnN0YW5jZUJpbmRpbmdCaW5kZXI8PihyZXF1ZXN0RmlsdGVycywgQ29udGFpbmVyUmVxdWVzdEZpbHRlci5jbGFzcykpOworCisgICAgICAgIGZpbmFsIFJlc291cmNlLkJ1aWxkZXIgcmIgPSBSZXNvdXJjZS5idWlsZGVyKCJ0ZXN0Iik7CisgICAgICAgIHJiLmFkZE1ldGhvZCgiR0VUIikuaGFuZGxlZEJ5KG5ldyBJbmZsZWN0b3I8Q29udGFpbmVyUmVxdWVzdENvbnRleHQsIFJlc3BvbnNlPigpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgUmVzcG9uc2UgYXBwbHkoZmluYWwgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdCkgeworICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygpLmJ1aWxkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICByZXNvdXJjZUNvbmZpZy5yZWdpc3RlclJlc291cmNlcyhyYi5idWlsZCgpKTsKKyAgICAgICAgZmluYWwgQXBwbGljYXRpb25IYW5kbGVyIGFwcGxpY2F0aW9uID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihyZXNvdXJjZUNvbmZpZyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgYXBwbGljYXRpb24uYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi90ZXN0IiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNhbGxlZC5pbnRWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVSZXNwb25zZUZpbHRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBBdG9taWNJbnRlZ2VyIGNhbGxlZCA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOworCisgICAgICAgIGZpbmFsIExpc3Q8Q29udGFpbmVyUmVzcG9uc2VGaWx0ZXI+IHJlc3BvbnNlRmlsdGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICByZXNwb25zZUZpbHRlckxpc3QuYWRkKG5ldyBDb250YWluZXJSZXNwb25zZUZpbHRlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKGZpbmFsIENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LCBmaW5hbCBDb250YWluZXJSZXNwb25zZUNvbnRleHQgcmVzcG9uc2VDb250ZXh0KQorICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIGNhbGxlZC5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihuZXcgUHJvdmlkZXJJbnN0YW5jZUJpbmRpbmdCaW5kZXI8PihyZXNwb25zZUZpbHRlckxpc3QsIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyLmNsYXNzKSk7CisKKyAgICAgICAgZmluYWwgUmVzb3VyY2UuQnVpbGRlciByYiA9IFJlc291cmNlLmJ1aWxkZXIoInRlc3QiKTsKKyAgICAgICAgcmIuYWRkTWV0aG9kKCJHRVQiKS5oYW5kbGVkQnkobmV3IEluZmxlY3RvcjxDb250YWluZXJSZXF1ZXN0Q29udGV4dCwgUmVzcG9uc2U+KCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBSZXNwb25zZSBhcHBseShmaW5hbCBDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCkuYnVpbGQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVyUmVzb3VyY2VzKHJiLmJ1aWxkKCkpOworICAgICAgICBmaW5hbCBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwbGljYXRpb24gPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKHJlc291cmNlQ29uZmlnKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCBhcHBsaWNhdGlvbi5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3Rlc3QiLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCkuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY2FsbGVkLmludFZhbHVlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpbHRlckNhbGxlZE9uMjAwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFNpbXBsZUZpbHRlciBzaW1wbGVGaWx0ZXIgPSBuZXcgU2ltcGxlRmlsdGVyKCk7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKFNpbXBsZVJlc291cmNlLmNsYXNzKS5yZWdpc3RlcihzaW1wbGVGaWx0ZXIpOworICAgICAgICBmaW5hbCBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwbGljYXRpb24gPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKHJlc291cmNlQ29uZmlnKTsKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBhcHBsaWNhdGlvbi5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3NpbXBsZSIsICJHRVQiKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShzaW1wbGVGaWx0ZXIuY2FsbGVkKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJOb3RDYWxsZWRPbjQwNCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBub3QgZm91bmQKKyAgICAgICAgZmluYWwgU2ltcGxlRmlsdGVyIHNpbXBsZUZpbHRlciA9IG5ldyBTaW1wbGVGaWx0ZXIoKTsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoU2ltcGxlUmVzb3VyY2UuY2xhc3MpLnJlZ2lzdGVyKHNpbXBsZUZpbHRlcik7CisgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbiA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIocmVzb3VyY2VDb25maWcpOworICAgICAgICBmaW5hbCBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGFwcGxpY2F0aW9uLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvTk9ULUZPVU5EIiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDA0LCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShzaW1wbGVGaWx0ZXIuY2FsbGVkKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJOb3RDYWxsZWRPbjQwNSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBtZXRob2Qgbm90IGFsbG93ZWQKKyAgICAgICAgZmluYWwgU2ltcGxlRmlsdGVyIHNpbXBsZUZpbHRlciA9IG5ldyBTaW1wbGVGaWx0ZXIoKTsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoU2ltcGxlUmVzb3VyY2UuY2xhc3MpLnJlZ2lzdGVyKHNpbXBsZUZpbHRlcik7CisgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbiA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIocmVzb3VyY2VDb25maWcpOworICAgICAgICBmaW5hbCBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGFwcGxpY2F0aW9uLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvc2ltcGxlIiwgIlBPU1QiKS5lbnRpdHkoImVudGl0eSIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDA1LCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShzaW1wbGVGaWx0ZXIuY2FsbGVkKTsKKyAgICB9CisKKyAgICBAUGF0aCgic2ltcGxlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNpbXBsZVJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJnZXQiOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGFic3RyYWN0IGNsYXNzIENvbW1vbkZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIgeworCisgICAgICAgIHB1YmxpYyBib29sZWFuIGNhbGxlZCA9IGZhbHNlOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoZmluYWwgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHZlcmlmeSgpOworICAgICAgICAgICAgY2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIHZlcmlmeSgpOworICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBTaW1wbGVGaWx0ZXIgZXh0ZW5kcyBDb21tb25GaWx0ZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCB2ZXJpZnkoKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJpb3JpdHkoMSkKKyAgICBwdWJsaWMgY2xhc3MgRmlsdGVyMSBleHRlbmRzIENvbW1vbkZpbHRlciB7CisKKyAgICAgICAgcHJpdmF0ZSBGaWx0ZXIxMCBmaWx0ZXIxMDsKKyAgICAgICAgcHJpdmF0ZSBGaWx0ZXIxMDAgZmlsdGVyMTAwOworCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEZpbHRlcnMoZmluYWwgRmlsdGVyMTAgZmlsdGVyMTAsIGZpbmFsIEZpbHRlcjEwMCBmaWx0ZXIxMDApIHsKKyAgICAgICAgICAgIHRoaXMuZmlsdGVyMTAgPSBmaWx0ZXIxMDsKKyAgICAgICAgICAgIHRoaXMuZmlsdGVyMTAwID0gZmlsdGVyMTAwOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHZlcmlmeSgpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZmlsdGVyMTAuY2FsbGVkID09IGZhbHNlKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZmlsdGVyMTAwLmNhbGxlZCA9PSBmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJpb3JpdHkoMTApCisgICAgcHVibGljIGNsYXNzIEZpbHRlcjEwIGV4dGVuZHMgQ29tbW9uRmlsdGVyIHsKKworICAgICAgICBwcml2YXRlIEZpbHRlcjEgZmlsdGVyMTsKKyAgICAgICAgcHJpdmF0ZSBGaWx0ZXIxMDAgZmlsdGVyMTAwOworCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEZpbHRlcnMoZmluYWwgRmlsdGVyMSBmaWx0ZXIxLCBmaW5hbCBGaWx0ZXIxMDAgZmlsdGVyMTAwKSB7CisgICAgICAgICAgICB0aGlzLmZpbHRlcjEgPSBmaWx0ZXIxOworICAgICAgICAgICAgdGhpcy5maWx0ZXIxMDAgPSBmaWx0ZXIxMDA7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgdmVyaWZ5KCkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShmaWx0ZXIxLmNhbGxlZCA9PSB0cnVlKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZmlsdGVyMTAwLmNhbGxlZCA9PSBmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJpb3JpdHkoMTAwKQorICAgIHB1YmxpYyBjbGFzcyBGaWx0ZXIxMDAgZXh0ZW5kcyBDb21tb25GaWx0ZXIgeworCisgICAgICAgIHByaXZhdGUgRmlsdGVyMSBmaWx0ZXIxOworICAgICAgICBwcml2YXRlIEZpbHRlcjEwIGZpbHRlcjEwOworCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEZpbHRlcnMoZmluYWwgRmlsdGVyMSBmaWx0ZXIxLCBmaW5hbCBGaWx0ZXIxMCBmaWx0ZXIxMCkgeworICAgICAgICAgICAgdGhpcy5maWx0ZXIxID0gZmlsdGVyMTsKKyAgICAgICAgICAgIHRoaXMuZmlsdGVyMTAgPSBmaWx0ZXIxMDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCB2ZXJpZnkoKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGZpbHRlcjEuY2FsbGVkKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZmlsdGVyMTAuY2FsbGVkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlRmlsdGVyc1dpdGhCaW5kaW5nUHJpb3JpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBmaW5hbCBGaWx0ZXIxIGZpbHRlcjEgPSBuZXcgRmlsdGVyMSgpOworICAgICAgICBmaW5hbCBGaWx0ZXIxMCBmaWx0ZXIxMCA9IG5ldyBGaWx0ZXIxMCgpOworICAgICAgICBmaW5hbCBGaWx0ZXIxMDAgZmlsdGVyMTAwID0gbmV3IEZpbHRlcjEwMCgpOworCisgICAgICAgIGZpbHRlcjEuc2V0RmlsdGVycyhmaWx0ZXIxMCwgZmlsdGVyMTAwKTsKKyAgICAgICAgZmlsdGVyMTAuc2V0RmlsdGVycyhmaWx0ZXIxLCBmaWx0ZXIxMDApOworICAgICAgICBmaWx0ZXIxMDAuc2V0RmlsdGVycyhmaWx0ZXIxLCBmaWx0ZXIxMCk7CisKKyAgICAgICAgZmluYWwgTGlzdDxDb250YWluZXJSZXF1ZXN0RmlsdGVyPiByZXF1ZXN0RmlsdGVyTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICByZXF1ZXN0RmlsdGVyTGlzdC5hZGQoZmlsdGVyMTAwKTsKKyAgICAgICAgcmVxdWVzdEZpbHRlckxpc3QuYWRkKGZpbHRlcjEpOworICAgICAgICByZXF1ZXN0RmlsdGVyTGlzdC5hZGQoZmlsdGVyMTApOworCisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKCkKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIobmV3IFByb3ZpZGVySW5zdGFuY2VCaW5kaW5nQmluZGVyPD4ocmVxdWVzdEZpbHRlckxpc3QsIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIuY2xhc3MpKTsKKworICAgICAgICBmaW5hbCBSZXNvdXJjZS5CdWlsZGVyIHJiID0gUmVzb3VyY2UuYnVpbGRlcigidGVzdCIpOworICAgICAgICByYi5hZGRNZXRob2QoIkdFVCIpLmhhbmRsZWRCeShuZXcgSW5mbGVjdG9yPENvbnRhaW5lclJlcXVlc3RDb250ZXh0LCBSZXNwb25zZT4oKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFJlc3BvbnNlIGFwcGx5KGZpbmFsIENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3QpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soKS5idWlsZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucmVnaXN0ZXJSZXNvdXJjZXMocmIuYnVpbGQoKSk7CisgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbiA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIocmVzb3VyY2VDb25maWcpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIGFwcGxpY2F0aW9uLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvdGVzdCIsICJHRVQiKS5idWlsZCgpKS5nZXQoKS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIEV4Y2VwdGlvbkZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoZmluYWwgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigidGVzdCIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsdGVyRXhjZXB0aW9uSGFuZGxpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBmaW5hbCBMaXN0PENvbnRhaW5lclJlcXVlc3RGaWx0ZXI+IHJlcXVlc3RGaWx0ZXJMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIHJlcXVlc3RGaWx0ZXJMaXN0LmFkZChuZXcgRXhjZXB0aW9uRmlsdGVyKCkpOworCisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKCkKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIobmV3IFByb3ZpZGVySW5zdGFuY2VCaW5kaW5nQmluZGVyPD4ocmVxdWVzdEZpbHRlckxpc3QsIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIuY2xhc3MpKTsKKworICAgICAgICBmaW5hbCBSZXNvdXJjZS5CdWlsZGVyIHJiID0gUmVzb3VyY2UuYnVpbGRlcigidGVzdCIpOworICAgICAgICByYi5hZGRNZXRob2QoIkdFVCIpLmhhbmRsZWRCeShuZXcgSW5mbGVjdG9yPENvbnRhaW5lclJlcXVlc3RDb250ZXh0LCBSZXNwb25zZT4oKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFJlc3BvbnNlIGFwcGx5KGZpbmFsIENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3QpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soKS5idWlsZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucmVnaXN0ZXJSZXNvdXJjZXMocmIuYnVpbGQoKSk7CisgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbiA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIocmVzb3VyY2VDb25maWcpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYXBwbGljYXRpb24uYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi90ZXN0IiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpLmdldFN0YXR1cygpOworICAgICAgICAgICAgQXNzZXJ0LmZhaWwoInNob3VsZCB0aHJvdyBhbiBleGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIG9rCisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9maWx0ZXIvQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXJPcmRlcmluZ1Rlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ZpbHRlci9Db250YWluZXJSZXNwb25zZUZpbHRlck9yZGVyaW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NjAzMWYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9maWx0ZXIvQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXJPcmRlcmluZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuZmlsdGVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlc3BvbnNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVzcG9uc2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlcXVlc3RDb250ZXh0QnVpbGRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXJPcmRlcmluZ1Rlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzcG9uc2VGaWx0ZXIoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIEFwcGxpY2F0aW9uSGFuZGxlciBoYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcigKKyAgICAgICAgICAgICAgICBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MsIFJlc3BvbnNlRmlsdGVyMS5jbGFzcywgUmVzcG9uc2VGaWx0ZXIyLmNsYXNzLCBSZXNwb25zZUZpbHRlcjMuY2xhc3MpKTsKKyAgICAgICAgQ29udGFpbmVyUmVzcG9uc2UgcmVzID0gaGFuZGxlci5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiIiwgIi9yZXNvdXJjZS8iLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlcy5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgQFByaW9yaXR5KDEpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNwb25zZUZpbHRlcjEgaW1wbGVtZW50cyBDb250YWluZXJSZXNwb25zZUZpbHRlciB7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBCb29sZWFuIGNhbGxlZCA9IGZhbHNlOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250YWluZXJSZXNwb25zZUNvbnRleHQgcmVzcG9uc2VDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgY2FsbGVkID0gdHJ1ZTsKKworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShSZXNwb25zZUZpbHRlcjMuY2FsbGVkKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoUmVzcG9uc2VGaWx0ZXIyLmNhbGxlZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBAUHJpb3JpdHkoMikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc3BvbnNlRmlsdGVyMiBpbXBsZW1lbnRzIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyIHsKKworICAgICAgICBwdWJsaWMgc3RhdGljIEJvb2xlYW4gY2FsbGVkID0gZmFsc2U7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRhaW5lclJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBjYWxsZWQgPSB0cnVlOworCisgICAgICAgICAgICBhc3NlcnRUcnVlKFJlc3BvbnNlRmlsdGVyMy5jYWxsZWQpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoUmVzcG9uc2VGaWx0ZXIxLmNhbGxlZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBAUHJpb3JpdHkoMykKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc3BvbnNlRmlsdGVyMyBpbXBsZW1lbnRzIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyIHsKKworICAgICAgICBwdWJsaWMgc3RhdGljIEJvb2xlYW4gY2FsbGVkID0gZmFsc2U7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRhaW5lclJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBjYWxsZWQgPSB0cnVlOworCisgICAgICAgICAgICBhc3NlcnRGYWxzZShSZXNwb25zZUZpbHRlcjEuY2FsbGVkKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKFJlc3BvbnNlRmlsdGVyMi5jYWxsZWQpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvZmlsdGVyL0NzcmZQcm90ZWN0aW9uRmlsdGVyVGVzdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvZmlsdGVyL0NzcmZQcm90ZWN0aW9uRmlsdGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZmYwZmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9maWx0ZXIvQ3NyZlByb3RlY3Rpb25GaWx0ZXJUZXN0LmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuZmlsdGVyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBVVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVxdWVzdENvbnRleHRCdWlsZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIENzcmZQcm90ZWN0aW9uRmlsdGVyVGVzdCB7CisKKyAgICBwcml2YXRlIEFwcGxpY2F0aW9uSGFuZGxlciBoYW5kbGVyOworCisgICAgQFBhdGgoIi9yZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiR0VUIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQVVQKKyAgICAgICAgcHVibGljIFN0cmluZyBwdXQoKSB7CisgICAgICAgICAgICByZXR1cm4gIlBVVCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIFJlc291cmNlQ29uZmlnIHJjID0gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzLCBDc3JmUHJvdGVjdGlvbkZpbHRlci5jbGFzcyk7CisgICAgICAgIGhhbmRsZXIgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKHJjKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXROb0hlYWRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGhhbmRsZXIuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIiIsICIvcmVzb3VyY2UiLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiR0VUIiwgcmVzcG9uc2UuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFdpdGhIZWFkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBoYW5kbGVyCisgICAgICAgICAgICAgICAgLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIiLCAiL3Jlc291cmNlIiwgIkdFVCIpLmhlYWRlcihDc3JmUHJvdGVjdGlvbkZpbHRlci5IRUFERVJfTkFNRSwgIiIpLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQdXROb0hlYWRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGhhbmRsZXIuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIiIsICIvcmVzb3VyY2UiLCAiUFVUIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhSZXNwb25zZS5TdGF0dXMuQkFEX1JFUVVFU1QsIHJlc3BvbnNlLmdldFN0YXR1c0luZm8oKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0V2l0aEhlYWRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGhhbmRsZXIKKyAgICAgICAgICAgICAgICAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIiIsICIvcmVzb3VyY2UiLCAiUFVUIikuaGVhZGVyKENzcmZQcm90ZWN0aW9uRmlsdGVyLkhFQURFUl9OQU1FLCAiIikuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiUFVUIiwgcmVzcG9uc2UuZ2V0RW50aXR5KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ZpbHRlci9FbmNvZGluZ0ZpbHRlclRlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ZpbHRlci9FbmNvZGluZ0ZpbHRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2M0Yjk4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvZmlsdGVyL0VuY29kaW5nRmlsdGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTU4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5maWx0ZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CisKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5HWmlwRW5jb2RlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVxdWVzdENvbnRleHRCdWlsZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuQ29udGVudEVuY29kZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIEVuY29kaW5nRmlsdGVyVGVzdCB7CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGb29FbmNvZGluZyBleHRlbmRzIENvbnRlbnRFbmNvZGVyIHsKKyAgICAgICAgcHVibGljIEZvb0VuY29kaW5nKCkgeworICAgICAgICAgICAgc3VwZXIoImZvbyIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBkZWNvZGUoU3RyaW5nIGNvbnRlbnRFbmNvZGluZywgSW5wdXRTdHJlYW0gZW5jb2RlZFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBlbmNvZGVkU3RyZWFtOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gZW5jb2RlKFN0cmluZyBjb250ZW50RW5jb2RpbmcsIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gZW50aXR5U3RyZWFtOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9JbnRlcmNlcHRvcigpIHsKKyAgICAgICAgUmVzb3VyY2VDb25maWcgcmMgPSBuZXcgUmVzb3VyY2VDb25maWcoRW5jb2RpbmdGaWx0ZXIuY2xhc3MpOworICAgICAgICBDb250YWluZXJSZXNwb25zZUZpbHRlciBmaWx0ZXIgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKHJjKS5nZXRJbmplY3Rpb25NYW5hZ2VyKCkKKyAgICAgICAgICAgICAgICAuZ2V0SW5zdGFuY2UoQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXIuY2xhc3MpOworICAgICAgICBhc3NlcnROb3ROdWxsKGZpbHRlcik7CisgICAgICAgIGFzc2VydFRydWUoZmlsdGVyIGluc3RhbmNlb2YgRW5jb2RpbmdGaWx0ZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgKChFbmNvZGluZ0ZpbHRlcikgZmlsdGVyKS5nZXRTdXBwb3J0ZWRFbmNvZGluZ3MoKS5zaXplKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVuYWJsZUZvcigpIHsKKyAgICAgICAgRW5jb2RpbmdGaWx0ZXIgZmlsdGVyID0gaW5pdGlhbGl6ZUFuZEdldEZpbHRlcigpOworICAgICAgICBhc3NlcnROb3ROdWxsKGZpbHRlcik7CisgICAgICAgIGFzc2VydEVxdWFscyg0LCBmaWx0ZXIuZ2V0U3VwcG9ydGVkRW5jb2RpbmdzKCkuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb0FjY2VwdEVuY29kaW5nSGVhZGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdEVuY29kaW5nKG51bGwpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFjY2VwdEVuY29kaW5nSGVhZGVyTm90U3VwcG9ydGVkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdEVuY29kaW5nKG51bGwsICJub3QtZ3ppcCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdaaXBBY2NlcHRFbmNvZGluZ0hlYWRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RFbmNvZGluZygiZ3ppcCIsICJnemlwIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R1ppcFByZWZlcnJlZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RFbmNvZGluZygiZ3ppcCIsICJmb287IHE9LjUiLCAiZ3ppcCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZvb1ByZWZlcnJlZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RFbmNvZGluZygiZm9vIiwgImZvbyIsICJnemlwOyBxPS41Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90QWNjZXB0YWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0ZXN0RW5jb2RpbmcobnVsbCwgIm9uZSIsICJ0d28iLCAiKjsgcT0wIik7CisgICAgICAgICAgICBmYWlsKFJlc3BvbnNlLlN0YXR1cy5OT1RfQUNDRVBUQUJMRSArICIgcmVzcG9uc2Ugd2FzIGV4cGVjdGVkLiIpOworICAgICAgICB9IGNhdGNoIChXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoUmVzcG9uc2UuU3RhdHVzLk5PVF9BQ0NFUFRBQkxFLCBlLmdldFJlc3BvbnNlKCkuZ2V0U3RhdHVzSW5mbygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElkZW50aXR5UHJlZmVycmVkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdEVuY29kaW5nKG51bGwsICJpZGVudGl0eSIsICJmb287IHE9LjUiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBbnlBY2NlcHRhYmxlRXhjZXB0R1ppcEFuZElkZW50aXR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdEVuY29kaW5nKCJmb28iLCAiKiIsICJnemlwOyBxPTAiLCAiaWRlbnRpdHk7IHE9MCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vRW50aXR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRW5jb2RpbmdGaWx0ZXIgZmlsdGVyID0gaW5pdGlhbGl6ZUFuZEdldEZpbHRlcigpOworICAgICAgICBDb250YWluZXJSZXF1ZXN0IHJlcXVlc3QgPSBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3Jlc291cmNlIiwgIkdFVCIpLmhlYWRlcihIdHRwSGVhZGVycy5BQ0NFUFRfRU5DT0RJTkcsCisgICAgICAgICAgICAgICAgImd6aXAiKS5idWlsZCgpOworICAgICAgICBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IG5ldyBDb250YWluZXJSZXNwb25zZShyZXF1ZXN0LCBSZXNwb25zZS5vaygpLmJ1aWxkKCkpOworICAgICAgICBmaWx0ZXIuZmlsdGVyKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICAgICAgYXNzZXJ0TnVsbChyZXNwb25zZS5nZXRIZWFkZXJzKCkuZ2V0Rmlyc3QoSHR0cEhlYWRlcnMuQ09OVEVOVF9FTkNPRElORykpOworICAgICAgICBhc3NlcnROdWxsKHJlc3BvbnNlLmdldEhlYWRlcnMoKS5nZXRGaXJzdChIdHRwSGVhZGVycy5WQVJZKSk7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHJpdmF0ZSBFbmNvZGluZ0ZpbHRlciBpbml0aWFsaXplQW5kR2V0RmlsdGVyKCkgeworICAgICAgICBSZXNvdXJjZUNvbmZpZyByYyA9IG5ldyBSZXNvdXJjZUNvbmZpZygpOworICAgICAgICBFbmNvZGluZ0ZpbHRlci5lbmFibGVGb3IocmMsIEZvb0VuY29kaW5nLmNsYXNzLCBHWmlwRW5jb2Rlci5jbGFzcyk7CisgICAgICAgIHJldHVybiAoRW5jb2RpbmdGaWx0ZXIpIG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIocmMpLmdldEluamVjdGlvbk1hbmFnZXIoKS5nZXRJbnN0YW5jZShDb250YWluZXJSZXNwb25zZUZpbHRlci5jbGFzcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RFbmNvZGluZyhTdHJpbmcgZXhwZWN0ZWQsIFN0cmluZy4uLiBhY2NlcHRlZCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRW5jb2RpbmdGaWx0ZXIgZmlsdGVyID0gaW5pdGlhbGl6ZUFuZEdldEZpbHRlcigpOworICAgICAgICBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIgYnVpbGRlciA9IFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvcmVzb3VyY2UiLCAiR0VUIik7CisgICAgICAgIGZvciAoU3RyaW5nIGEgOiBhY2NlcHRlZCkgeworICAgICAgICAgICAgYnVpbGRlci5oZWFkZXIoSHR0cEhlYWRlcnMuQUNDRVBUX0VOQ09ESU5HLCBhKTsKKyAgICAgICAgfQorICAgICAgICBDb250YWluZXJSZXF1ZXN0IHJlcXVlc3QgPSBidWlsZGVyLmJ1aWxkKCk7CisgICAgICAgIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gbmV3IENvbnRhaW5lclJlc3BvbnNlKHJlcXVlc3QsIFJlc3BvbnNlLm9rKCJPSyEiKS5idWlsZCgpKTsKKyAgICAgICAgZmlsdGVyLmZpbHRlcihyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgICAgIGlmIChyZXNwb25zZS5nZXRTdGF0dXMoKSAhPSAyMDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbihSZXNwb25zZS5zdGF0dXMocmVzcG9uc2UuZ2V0U3RhdHVzKCkpLmJ1aWxkKCkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKEh0dHBIZWFkZXJzLkNPTlRFTlRfRU5DT0RJTkcpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEh0dHBIZWFkZXJzLkFDQ0VQVF9FTkNPRElORywgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKEh0dHBIZWFkZXJzLlZBUlkpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9maWx0ZXIvRW50aXR5VHlwZUZpbHRlclRlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ZpbHRlci9FbnRpdHlUeXBlRmlsdGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MzJjM2IKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9maWx0ZXIvRW50aXR5VHlwZUZpbHRlclRlc3QuamF2YQpAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5maWx0ZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJpb3JpdHk7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVxdWVzdENvbnRleHRCdWlsZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworCisKKy8qKgorICogVGVzdHMgZW1wdHkgZW50aXR5IGluIGZpbHRlci4KKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBFbnRpdHlUeXBlRmlsdGVyVGVzdCB7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBBcHBsaWNhdGlvbkhhbmRsZXIgaGFuZGxlciA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIobmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzLCBSZXNwb25zZUZpbHRlci5jbGFzcykpOworICAgICAgICBmaW5hbCBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGhhbmRsZXIuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9yZXNvdXJjZS9nZXRlbnRpdHl0eXBlIiwKKyAgICAgICAgICAgICAgICAiR0VUIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKworICAgIEBQcm92aWRlcgorICAgIEBQcmlvcml0eSg1MDApCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNwb25zZUZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRhaW5lclJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBhc3NlcnROdWxsKHJlc3BvbnNlQ29udGV4dC5nZXRFbnRpdHlUeXBlKCkpOworICAgICAgICAgICAgYXNzZXJ0TnVsbChyZXNwb25zZUNvbnRleHQuZ2V0RW50aXR5Q2xhc3MoKSk7CisgICAgICAgICAgICBhc3NlcnROdWxsKHJlc3BvbnNlQ29udGV4dC5nZXRFbnRpdHkoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJnZXRlbnRpdHl0eXBlIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldEVudGl0eVR5cGUoKSB7CisgICAgICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IFJlc3BvbnNlLm9rKCkuYnVpbGQoKTsKKyAgICAgICAgICAgIHJldHVybiByZXNwb25zZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ZpbHRlci9GaWx0ZXJTZXRNZXRob2RUZXN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9maWx0ZXIvRmlsdGVyU2V0TWV0aG9kVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MTFkM2YKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9maWx0ZXIvRmlsdGVyU2V0TWV0aG9kVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjQ0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5maWx0ZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlc3BvbnNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlByZU1hdGNoaW5nOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJpb3JpdHk7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVxdWVzdENvbnRleHRCdWlsZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCisvKioKKyAqIFRlc3RzIGNhbGxpbmcge0BsaW5rIENvbnRhaW5lclJlcXVlc3RDb250ZXh0I3NldE1ldGhvZChTdHJpbmcpfSBpbiBkaWZmZXJlbnQgcmVxdWVzdC9yZXNwb25zZSBwaGFzZXMuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgY2xhc3MgRmlsdGVyU2V0TWV0aG9kVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNwb25zZUZpbHRlcigpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgQXBwbGljYXRpb25IYW5kbGVyIGhhbmRsZXIgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcywgUmVzcG9uc2VGaWx0ZXIuY2xhc3MpKTsKKyAgICAgICAgQ29udGFpbmVyUmVzcG9uc2UgcmVzID0gaGFuZGxlci5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiIiwgIi9yZXNvdXJjZS9zZXRNZXRob2QiLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlcy5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlTWF0Y2hpbmdGaWx0ZXIoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIEFwcGxpY2F0aW9uSGFuZGxlciBoYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MsIFByZU1hdGNoRmlsdGVyLmNsYXNzKSk7CisgICAgICAgIENvbnRhaW5lclJlc3BvbnNlIHJlcyA9IGhhbmRsZXIuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIiIsICIvcmVzb3VyY2Uvc2V0TWV0aG9kIiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXMuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc3RNYXRjaGluZ0ZpbHRlcigpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgQXBwbGljYXRpb25IYW5kbGVyIGhhbmRsZXIgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcywgUG9zdE1hdGNoRmlsdGVyLmNsYXNzKSk7CisgICAgICAgIENvbnRhaW5lclJlc3BvbnNlIHJlcyA9IGhhbmRsZXIuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIiIsICIvcmVzb3VyY2Uvc2V0TWV0aG9kIiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXMuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBBcHBsaWNhdGlvbkhhbmRsZXIgaGFuZGxlciA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIobmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzLCBQb3N0TWF0Y2hGaWx0ZXIuY2xhc3MpKTsKKyAgICAgICAgQ29udGFpbmVyUmVzcG9uc2UgcmVzID0gaGFuZGxlci5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiIiwgIi9yZXNvdXJjZS9zZXRNZXRob2RJblJlc291cmNlIiwKKyAgICAgICAgICAgICAgICAiR0VUIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlcy5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3ViUmVzb3VyY2VMb2NhdG9yKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBBcHBsaWNhdGlvbkhhbmRsZXIgaGFuZGxlciA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIobmV3IFJlc291cmNlQ29uZmlnKEFub3RoZXJSZXNvdXJjZS5jbGFzcykpOworICAgICAgICBDb250YWluZXJSZXNwb25zZSByZXMgPSBoYW5kbGVyLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIiLCAiL2Fub3RoZXIvbG9jYXRvciIsCisgICAgICAgICAgICAgICAgIkdFVCIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXMuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlVXJpKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBBcHBsaWNhdGlvbkhhbmRsZXIgaGFuZGxlciA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIobmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlQ2hhbmdlVXJpLmNsYXNzLAorICAgICAgICAgICAgICAgIFByZU1hdGNoQ2hhbmdpbmdVcmlGaWx0ZXIuY2xhc3MpKTsKKyAgICAgICAgQ29udGFpbmVyUmVzcG9uc2UgcmVzID0gaGFuZGxlci5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiIiwgIi9yZXNvdXJjZUNoYW5nZVVyaS9maXJzdCIsCisgICAgICAgICAgICAgICAgIkdFVCIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXMuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm9rIiwgcmVzLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAUGF0aCgicmVzb3VyY2VDaGFuZ2VVcmkiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VDaGFuZ2VVcmkgeworCisgICAgICAgIEBQYXRoKCJmaXJzdCIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBmaXJzdCgpIHsKKyAgICAgICAgICAgIGZhaWwoInNob3VsZCBub3QgYmUgY2FsbGVkLiIpOworICAgICAgICAgICAgcmV0dXJuICJmYWlsIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJmaXJzdC9hIikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGEoKSB7CisgICAgICAgICAgICByZXR1cm4gIm9rIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIEBQcmlvcml0eSg1MDApCisgICAgQFByZU1hdGNoaW5nCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQcmVNYXRjaENoYW5naW5nVXJpRmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBVUkkgcmVxdWVzdFVyaSA9IHJlcXVlc3RDb250ZXh0LmdldFVyaUluZm8oKS5nZXRSZXF1ZXN0VXJpQnVpbGRlcigpLnBhdGgoImEiKS5idWlsZCgpOworICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuc2V0UmVxdWVzdFVyaShyZXF1ZXN0VXJpKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgQFByb3ZpZGVyCisgICAgQFByaW9yaXR5KDUwMCkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc3BvbnNlRmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXIgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGNoZWNrRXhjZXB0aW9uVGhyb3duKG5ldyBTZXRNZXRob2RDbG9zdXJlKHJlcXVlc3RDb250ZXh0KSk7CisgICAgICAgICAgICBjaGVja0V4Y2VwdGlvblRocm93bihuZXcgU2V0VXJpQ2xvc3VyZShyZXF1ZXN0Q29udGV4dCkpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBAUHJvdmlkZXIKKyAgICBAUHJpb3JpdHkoNTAwKQorICAgIEBQcmVNYXRjaGluZworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHJlTWF0Y2hGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIG5ldyBTZXRNZXRob2RDbG9zdXJlKHJlcXVlc3RDb250ZXh0KS5mKCk7CisgICAgICAgICAgICBuZXcgU2V0VXJpQ2xvc3VyZShyZXF1ZXN0Q29udGV4dCkuZigpOworICAgICAgICAgICAgLy8gU2hvdWxkIG5vdCB0aHJvdyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhjZXB0aW9uIGluIHByZSBtYXRjaCBmaWx0ZXIuCisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBAUHJpb3JpdHkoNTAwKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUG9zdE1hdGNoRmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoZmluYWwgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBjaGVja0V4Y2VwdGlvblRocm93bihuZXcgU2V0TWV0aG9kQ2xvc3VyZShyZXF1ZXN0Q29udGV4dCkpOworICAgICAgICAgICAgY2hlY2tFeGNlcHRpb25UaHJvd24obmV3IFNldFVyaUNsb3N1cmUocmVxdWVzdENvbnRleHQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJyZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInNldE1ldGhvZCIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBzZXRNZXRob2QoKSB7CisgICAgICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IFJlc3BvbnNlLm9rKCkuYnVpbGQoKTsKKyAgICAgICAgICAgIHJldHVybiByZXNwb25zZTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInNldE1ldGhvZEluUmVzb3VyY2UiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2Ugc2V0TWV0aG9kSW5SZXNvdXJjZShAQ29udGV4dCBDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0KSB7CisgICAgICAgICAgICBjaGVja0V4Y2VwdGlvblRocm93bihuZXcgU2V0TWV0aG9kQ2xvc3VyZShyZXF1ZXN0KSk7CisgICAgICAgICAgICBjaGVja0V4Y2VwdGlvblRocm93bihuZXcgU2V0VXJpQ2xvc3VyZShyZXF1ZXN0KSk7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soKS5idWlsZCgpOworICAgICAgICB9CisKKworICAgIH0KKworICAgIEBQYXRoKCJhbm90aGVyIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFub3RoZXJSZXNvdXJjZSB7CisKKyAgICAgICAgQFBhdGgoImxvY2F0b3IiKQorICAgICAgICBwdWJsaWMgU3ViUmVzb3VyY2UgbWV0aG9kSW5TdWJSZXNvdXJjZShAQ29udGV4dCBDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0KSB7CisgICAgICAgICAgICBjaGVja0V4Y2VwdGlvblRocm93bihuZXcgU2V0TWV0aG9kQ2xvc3VyZShyZXF1ZXN0KSk7CisgICAgICAgICAgICBjaGVja0V4Y2VwdGlvblRocm93bihuZXcgU2V0VXJpQ2xvc3VyZShyZXF1ZXN0KSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN1YlJlc291cmNlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN1YlJlc291cmNlIHsKKyAgICAgICAgICAgIEBHRVQKKyAgICAgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXQoQENvbnRleHQgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdCkgeworICAgICAgICAgICAgICAgIGNoZWNrRXhjZXB0aW9uVGhyb3duKG5ldyBTZXRNZXRob2RDbG9zdXJlKHJlcXVlc3QpKTsKKyAgICAgICAgICAgICAgICBjaGVja0V4Y2VwdGlvblRocm93bihuZXcgU2V0VXJpQ2xvc3VyZShyZXF1ZXN0KSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCkuYnVpbGQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgQ2xvc3VyZSB7CisgICAgICAgIHZvaWQgZigpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tFeGNlcHRpb25UaHJvd24oQ2xvc3VyZSBmKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmLmYoKTsKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCB0aHJvdyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhjZXB0aW9uLiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICAvLyBvayAtIHNob3VsZCB0aHJvdyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2V0TWV0aG9kQ2xvc3VyZSBpbXBsZW1lbnRzIENsb3N1cmUgeworICAgICAgICBmaW5hbCBDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dDsKKworICAgICAgICBwdWJsaWMgU2V0TWV0aG9kQ2xvc3VyZShDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgeworICAgICAgICAgICAgdGhpcy5yZXF1ZXN0Q29udGV4dCA9IHJlcXVlc3RDb250ZXh0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGYoKSB7CisgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5zZXRNZXRob2QoIk9QVElPTlMiKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTZXRVcmlDbG9zdXJlIGltcGxlbWVudHMgQ2xvc3VyZSB7CisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0OworCisgICAgICAgIHB1YmxpYyBTZXRVcmlDbG9zdXJlKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB7CisgICAgICAgICAgICB0aGlzLnJlcXVlc3RDb250ZXh0ID0gcmVxdWVzdENvbnRleHQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZigpIHsKKyAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LnNldFJlcXVlc3RVcmkocmVxdWVzdENvbnRleHQuZ2V0VXJpSW5mbygpLmdldFJlcXVlc3RVcmkoKSk7CisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvZmlsdGVyL0h0dHBNZXRob2RPdmVycmlkZUZpbHRlclRlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ZpbHRlci9IdHRwTWV0aG9kT3ZlcnJpZGVGaWx0ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY4YzU2ZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ZpbHRlci9IdHRwTWV0aG9kT3ZlcnJpZGVGaWx0ZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmZpbHRlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkRFTEVURTsKK2ltcG9ydCBqYXZheC53cy5ycy5QVVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVzcG9uc2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlcXVlc3RDb250ZXh0QnVpbGRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIEh0dHBNZXRob2RPdmVycmlkZUZpbHRlclRlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5hYmxlRm9yKCkgeworICAgICAgICBSZXNvdXJjZUNvbmZpZyByYyA9IG5ldyBSZXNvdXJjZUNvbmZpZygpOworICAgICAgICBIdHRwTWV0aG9kT3ZlcnJpZGVGaWx0ZXIuZW5hYmxlRm9yKHJjLCBIdHRwTWV0aG9kT3ZlcnJpZGVGaWx0ZXIuU291cmNlLkhFQURFUik7CisgICAgICAgIGFzc2VydFRydWUocmMuZ2V0Q2xhc3NlcygpLmNvbnRhaW5zKEh0dHBNZXRob2RPdmVycmlkZUZpbHRlci5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgKChIdHRwTWV0aG9kT3ZlcnJpZGVGaWx0ZXIuU291cmNlW10pIHJjLmdldFByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuSFRUUF9NRVRIT0RfT1ZFUlJJREUpKS5sZW5ndGgpOworICAgICAgICBhc3NlcnRFcXVhbHMoSHR0cE1ldGhvZE92ZXJyaWRlRmlsdGVyLlNvdXJjZS5IRUFERVIsCisgICAgICAgICAgICAgICAgKChIdHRwTWV0aG9kT3ZlcnJpZGVGaWx0ZXIuU291cmNlW10pIHJjLmdldFByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuSFRUUF9NRVRIT0RfT1ZFUlJJREUpKVswXSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdENvbmZpZygpIHsKKyAgICAgICAgSHR0cE1ldGhvZE92ZXJyaWRlRmlsdGVyIGYgPSBuZXcgSHR0cE1ldGhvZE92ZXJyaWRlRmlsdGVyKG5ldyBSZXNvdXJjZUNvbmZpZygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShIdHRwTWV0aG9kT3ZlcnJpZGVGaWx0ZXIuU291cmNlLkhFQURFUi5pc1ByZXNlbnRJbihmLmNvbmZpZykKKyAgICAgICAgICAgICAgICAmJiBIdHRwTWV0aG9kT3ZlcnJpZGVGaWx0ZXIuU291cmNlLlFVRVJZLmlzUHJlc2VudEluKGYuY29uZmlnKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVhZGVyT25seUNvbmZpZygpIHsKKyAgICAgICAgSHR0cE1ldGhvZE92ZXJyaWRlRmlsdGVyIGYgPSBuZXcgSHR0cE1ldGhvZE92ZXJyaWRlRmlsdGVyKG5ldyBSZXNvdXJjZUNvbmZpZygpLnByb3BlcnR5KAorICAgICAgICAgICAgICAgIFNlcnZlclByb3BlcnRpZXMuSFRUUF9NRVRIT0RfT1ZFUlJJREUsICJIRUFERVIiCisgICAgICAgICkpOworICAgICAgICBhc3NlcnRUcnVlKEh0dHBNZXRob2RPdmVycmlkZUZpbHRlci5Tb3VyY2UuSEVBREVSLmlzUHJlc2VudEluKGYuY29uZmlnKQorICAgICAgICAgICAgICAgICYmICFIdHRwTWV0aG9kT3ZlcnJpZGVGaWx0ZXIuU291cmNlLlFVRVJZLmlzUHJlc2VudEluKGYuY29uZmlnKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UXVlcnlPbmx5Q29uZmlnKCkgeworICAgICAgICBIdHRwTWV0aG9kT3ZlcnJpZGVGaWx0ZXIgZiA9IG5ldyBIdHRwTWV0aG9kT3ZlcnJpZGVGaWx0ZXIobmV3IFJlc291cmNlQ29uZmlnKCkucHJvcGVydHkoCisgICAgICAgICAgICAgICAgU2VydmVyUHJvcGVydGllcy5IVFRQX01FVEhPRF9PVkVSUklERSwgIlFVRVJZIgorICAgICAgICApKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghSHR0cE1ldGhvZE92ZXJyaWRlRmlsdGVyLlNvdXJjZS5IRUFERVIuaXNQcmVzZW50SW4oZi5jb25maWcpCisgICAgICAgICAgICAgICAgJiYgSHR0cE1ldGhvZE92ZXJyaWRlRmlsdGVyLlNvdXJjZS5RVUVSWS5pc1ByZXNlbnRJbihmLmNvbmZpZykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhlYWRlckFuZFF1ZXJ5Q29uZmlnKCkgeworICAgICAgICBIdHRwTWV0aG9kT3ZlcnJpZGVGaWx0ZXIgZiA9IG5ldyBIdHRwTWV0aG9kT3ZlcnJpZGVGaWx0ZXIobmV3IFJlc291cmNlQ29uZmlnKCkucHJvcGVydHkoCisgICAgICAgICAgICAgICAgU2VydmVyUHJvcGVydGllcy5IVFRQX01FVEhPRF9PVkVSUklERSwgIkhFQURFUiwgUVVFUlkiCisgICAgICAgICkpOworICAgICAgICBhc3NlcnRUcnVlKEh0dHBNZXRob2RPdmVycmlkZUZpbHRlci5Tb3VyY2UuSEVBREVSLmlzUHJlc2VudEluKGYuY29uZmlnKQorICAgICAgICAgICAgICAgICYmIEh0dHBNZXRob2RPdmVycmlkZUZpbHRlci5Tb3VyY2UuUVVFUlkuaXNQcmVzZW50SW4oZi5jb25maWcpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQW5kUXVlcnlDb25maWcoKSB7CisgICAgICAgIEh0dHBNZXRob2RPdmVycmlkZUZpbHRlciBmID0gbmV3IEh0dHBNZXRob2RPdmVycmlkZUZpbHRlcihuZXcgUmVzb3VyY2VDb25maWcoKS5wcm9wZXJ0eSgKKyAgICAgICAgICAgICAgICBTZXJ2ZXJQcm9wZXJ0aWVzLkhUVFBfTUVUSE9EX09WRVJSSURFLCAiZm9vLCBRVUVSWSIKKyAgICAgICAgKSk7CisgICAgICAgIGFzc2VydFRydWUoIUh0dHBNZXRob2RPdmVycmlkZUZpbHRlci5Tb3VyY2UuSEVBREVSLmlzUHJlc2VudEluKGYuY29uZmlnKQorICAgICAgICAgICAgICAgICYmIEh0dHBNZXRob2RPdmVycmlkZUZpbHRlci5Tb3VyY2UuUVVFUlkuaXNQcmVzZW50SW4oZi5jb25maWcpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbml0V2l0aFN0cmluZ0FycmF5Q29uZmlnKCkgeworICAgICAgICBIdHRwTWV0aG9kT3ZlcnJpZGVGaWx0ZXIgZiA9IG5ldyBIdHRwTWV0aG9kT3ZlcnJpZGVGaWx0ZXIobmV3IFJlc291cmNlQ29uZmlnKCkucHJvcGVydHkoCisgICAgICAgICAgICAgICAgU2VydmVyUHJvcGVydGllcy5IVFRQX01FVEhPRF9PVkVSUklERSwgbmV3IFN0cmluZ1tdIHsiSEVBREVSIn0KKyAgICAgICAgKSk7CisgICAgICAgIGFzc2VydFRydWUoSHR0cE1ldGhvZE92ZXJyaWRlRmlsdGVyLlNvdXJjZS5IRUFERVIuaXNQcmVzZW50SW4oZi5jb25maWcpCisgICAgICAgICAgICAgICAgJiYgIUh0dHBNZXRob2RPdmVycmlkZUZpbHRlci5Tb3VyY2UuUVVFUlkuaXNQcmVzZW50SW4oZi5jb25maWcpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQFBVVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHB1dCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiUFVUIjsKKyAgICAgICAgfQorCisgICAgICAgIEBERUxFVEUKKyAgICAgICAgcHVibGljIFN0cmluZyBkZWxldGUoKSB7CisgICAgICAgICAgICByZXR1cm4gIkRFTEVURSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0KCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIjQwMCIsIHRlc3QoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVhZGVyKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIlBVVCIsIHRlc3QoSHR0cE1ldGhvZE92ZXJyaWRlRmlsdGVyLlNvdXJjZS5IRUFERVIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RRdWVyeSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJERUxFVEUiLCB0ZXN0KEh0dHBNZXRob2RPdmVycmlkZUZpbHRlci5Tb3VyY2UuUVVFUlkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIZWFkZXJBbmRRdWVyeSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI0MDAiLCB0ZXN0KEh0dHBNZXRob2RPdmVycmlkZUZpbHRlci5Tb3VyY2UuSEVBREVSLCBIdHRwTWV0aG9kT3ZlcnJpZGVGaWx0ZXIuU291cmNlLlFVRVJZKSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0ZXN0KEh0dHBNZXRob2RPdmVycmlkZUZpbHRlci5Tb3VyY2UuLi4gc291cmNlcykgeworICAgICAgICBSZXNvdXJjZUNvbmZpZyByYyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIEh0dHBNZXRob2RPdmVycmlkZUZpbHRlci5lbmFibGVGb3IocmMsIHNvdXJjZXMpOworICAgICAgICBBcHBsaWNhdGlvbkhhbmRsZXIgaGFuZGxlciA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIocmMpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBoYW5kbGVyLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIiLCAiLz9fbWV0aG9kPURFTEVURSIsICJQT1NUIikKKyAgICAgICAgICAgICAgICAgICAgLmhlYWRlcigiWC1IVFRQLU1ldGhvZC1PdmVycmlkZSIsICJQVVQiKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgICAgIGlmIChSZXNwb25zZS5TdGF0dXMuT0suZXF1YWxzKHJlc3BvbnNlLmdldFN0YXR1c0luZm8oKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKFN0cmluZykgcmVzcG9uc2UuZ2V0RW50aXR5KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiAiIiArIHJlc3BvbnNlLmdldFN0YXR1cygpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHJldHVybiBlLmdldE1lc3NhZ2UoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ZpbHRlci9MYXllcmVkRmlsdGVyc1Rlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ZpbHRlci9MYXllcmVkRmlsdGVyc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzEyZmU2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvZmlsdGVyL0xheWVyZWRGaWx0ZXJzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjg4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5maWx0ZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLk5hbWVCaW5kaW5nOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJpb3JpdGllczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlc3BvbnNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVzcG9uc2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlcXVlc3RDb250ZXh0QnVpbGRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CisKKy8qKgorICogVGVzdHMgbGF5ZXJpbmcgb2YgZmlsdGVycyBhcHBsaWVkIG9uIGFwcHJvcHJpYXRlIG1ldGhvZHMgKHVzaW5nIG5hbWVkIGJpbmRpbmdzKSBvbiByZXNvdXJjZSBtZXRob2QsIHN1Yi1tZXRob2QsCisgKiBzdWItcmVzb3VyY2UgbG9jYXRvciwgc3ViLXJlc291cmNlIG1ldGhvZC4gSmVyc2V5IDIgZG9lcyBub3Qgc3VwcG9ydCBmdWxsIGZ1bmN0aW9uYWxpdHkgb2YgSmVyc2V5IDEgc3BlYWtpbmcgYWJvdXQKKyAqIGZpbHRlciBsYXllcmluZy4gSmVyc2V5IDIgaW1wbGVtZW50YXRpb24gaXMgSkFYLVJTIGNvbXBsaWFudC4KKyAqIDxwLz4KKyAqIEJ1dCBpdCBjb3VsZCBiZSBpbXBsZW1lbnRlZCBhcyBKZXJzZXkgc3BlY2lmaWMgZXh0ZW5zaW9uIC0gSkVSU0VZLTI0MTQuCisgKiBQbGVhc2UgdW4taWdub3JlIHRlc3RzIHdoZW5ldmVyIEpFUlNFWS0yNDE0IGZpeGVkLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBMYXllcmVkRmlsdGVyc1Rlc3QgeworCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VXaXRoU3VicmVzb3VyY2VMb2NhdG9yIHsKKyAgICAgICAgQFBhdGgoInN1YiIpCisgICAgICAgIEBPbmUKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlV2l0aE1ldGhvZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VXaXRoTWV0aG9kIHsKKyAgICAgICAgQEdFVAorICAgICAgICBAVHdvCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KEBDb250ZXh0IEh0dHBIZWFkZXJzIGhoKSB7CisgICAgICAgICAgICBMaXN0PFN0cmluZz4geFRlc3QgPSBoaC5nZXRSZXF1ZXN0SGVhZGVycygpLmdldCgiWC1URVNUIik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgeFRlc3Quc2l6ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiB4VGVzdC5nZXQoMCkgKyB4VGVzdC5nZXQoMSk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJzdWJtZXRob2QiKQorICAgICAgICBAVHdvCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3VibWV0aG9kKEBDb250ZXh0IEh0dHBIZWFkZXJzIGhoKSB7CisgICAgICAgICAgICBMaXN0PFN0cmluZz4geFRlc3QgPSBoaC5nZXRSZXF1ZXN0SGVhZGVycygpLmdldCgiWC1URVNUIik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgeFRlc3Quc2l6ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiB4VGVzdC5nZXQoMCkgKyB4VGVzdC5nZXQoMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBATmFtZUJpbmRpbmcKKyAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorICAgIHB1YmxpYyBAaW50ZXJmYWNlIE9uZSB7CisgICAgfQorCisgICAgQE9uZQorICAgIEBQcmlvcml0eShQcmlvcml0aWVzLlVTRVIgKyAxKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmlsdGVyT25lIGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciwgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXIgeworICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBMaXN0PFN0cmluZz4geFRlc3QgPSByZXF1ZXN0Q29udGV4dC5nZXRIZWFkZXJzKCkuZ2V0KCJYLVRFU1QiKTsKKyAgICAgICAgICAgIGFzc2VydE51bGwoeFRlc3QpOworCisgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5nZXRIZWFkZXJzKCkuYWRkKCJYLVRFU1QiLCAib25lIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsIENvbnRhaW5lclJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQpCisgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIExpc3Q8T2JqZWN0PiB4VGVzdCA9IHJlc3BvbnNlQ29udGV4dC5nZXRIZWFkZXJzKCkuZ2V0KCJYLVRFU1QiKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCB4VGVzdC5zaXplKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0d28iLCB4VGVzdC5nZXQoMCkpOworCisgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuZ2V0SGVhZGVycygpLmFkZCgiWC1URVNUIiwgIm9uZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgQE5hbWVCaW5kaW5nCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgICBwdWJsaWMgQGludGVyZmFjZSBUd28geworICAgIH0KKworICAgIEBUd28KKyAgICBAUHJpb3JpdHkoUHJpb3JpdGllcy5VU0VSICsgMikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZpbHRlclR3byBpbXBsZW1lbnRzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIsIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyIHsKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHhUZXN0ID0gcmVxdWVzdENvbnRleHQuZ2V0SGVhZGVycygpLmdldCgiWC1URVNUIik7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKCJGaWx0ZXJPbmUgbm90IGNhbGxlZCIsIHhUZXN0KTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCB4VGVzdC5zaXplKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJvbmUiLCB4VGVzdC5nZXQoMCkpOworCisgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5nZXRIZWFkZXJzKCkuYWRkKCJYLVRFU1QiLCAidHdvIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsIENvbnRhaW5lclJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQpCisgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIExpc3Q8T2JqZWN0PiB4VGVzdCA9IHJlc3BvbnNlQ29udGV4dC5nZXRIZWFkZXJzKCkuZ2V0KCJYLVRFU1QiKTsKKyAgICAgICAgICAgIGFzc2VydE51bGwoeFRlc3QpOworCisgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuZ2V0SGVhZGVycygpLmFkZCgiWC1URVNUIiwgInR3byIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBASWdub3JlKCJKRVJTRVktMjQxNCAtIG5vdCB5ZXQgaW1wbGVtZW50ZWQiKQorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZU1ldGhvZCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2VXaXRoU3VicmVzb3VyY2VMb2NhdG9yLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihGaWx0ZXJPbmUuY2xhc3MpLnJlZ2lzdGVyKEZpbHRlclR3by5jbGFzcyk7CisgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbiA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIocmVzb3VyY2VDb25maWcpOworICAgICAgICBmaW5hbCBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGFwcGxpY2F0aW9uLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvc3ViIiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJvbmV0d28iLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgICAgIExpc3Q8T2JqZWN0PiB4VGVzdCA9IHJlc3BvbnNlLmdldEhlYWRlcnMoKS5nZXQoIlgtVEVTVCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgeFRlc3Quc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0d28iLCB4VGVzdC5nZXQoMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm9uZSIsIHhUZXN0LmdldCgxKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBASWdub3JlKCJKRVJTRVktMjQxNCAtIG5vdCB5ZXQgaW1wbGVtZW50ZWQiKQorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZVN1YnJlc291cmNlTWV0aG9kKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZVdpdGhTdWJyZXNvdXJjZUxvY2F0b3IuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKEZpbHRlck9uZS5jbGFzcykucmVnaXN0ZXIoRmlsdGVyVHdvLmNsYXNzKTsKKyAgICAgICAgZmluYWwgQXBwbGljYXRpb25IYW5kbGVyIGFwcGxpY2F0aW9uID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihyZXNvdXJjZUNvbmZpZyk7CisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gYXBwbGljYXRpb24uYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9zdWIvc3VibWV0aG9kIiwgIkdFVCIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpLmdldCgpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJvbmV0d28iLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgICAgIExpc3Q8T2JqZWN0PiB4VGVzdCA9IHJlc3BvbnNlLmdldEhlYWRlcnMoKS5nZXQoIlgtVEVTVCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgeFRlc3Quc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0d28iLCB4VGVzdC5nZXQoMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm9uZSIsIHhUZXN0LmdldCgxKSk7CisgICAgfQorCisKKyAgICBAUGF0aCgiLyIpCisgICAgQE9uZQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VXaXRoU3VicmVzb3VyY2VMb2NhdG9yT25DbGFzcyB7CisgICAgICAgIEBQYXRoKCJzdWIiKQorICAgICAgICBwdWJsaWMgT2JqZWN0IGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VXaXRoTWV0aG9kT25DbGFzcygpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIEBUd28KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlV2l0aE1ldGhvZE9uQ2xhc3MgeworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KEBDb250ZXh0IEh0dHBIZWFkZXJzIGhoKSB7CisgICAgICAgICAgICBMaXN0PFN0cmluZz4geFRlc3QgPSBoaC5nZXRSZXF1ZXN0SGVhZGVycygpLmdldCgiWC1URVNUIik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgeFRlc3Quc2l6ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiB4VGVzdC5nZXQoMCkgKyB4VGVzdC5nZXQoMSk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJzdWJtZXRob2QiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFN1Ym1ldGhvZChAQ29udGV4dCBIdHRwSGVhZGVycyBoaCkgeworICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHhUZXN0ID0gaGguZ2V0UmVxdWVzdEhlYWRlcnMoKS5nZXQoIlgtVEVTVCIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHhUZXN0LnNpemUoKSk7CisgICAgICAgICAgICByZXR1cm4geFRlc3QuZ2V0KDApICsgeFRlc3QuZ2V0KDEpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBASWdub3JlKCJKRVJTRVktMjQxNCAtIG5vdCB5ZXQgaW1wbGVtZW50ZWQiKQorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZU1ldGhvZE9uQ2xhc3MoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlV2l0aFN1YnJlc291cmNlTG9jYXRvck9uQ2xhc3MuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKEZpbHRlck9uZS5jbGFzcykucmVnaXN0ZXIoRmlsdGVyVHdvLmNsYXNzKTsKKyAgICAgICAgZmluYWwgQXBwbGljYXRpb25IYW5kbGVyIGFwcGxpY2F0aW9uID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihyZXNvdXJjZUNvbmZpZyk7CisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gYXBwbGljYXRpb24uYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9zdWIiLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm9uZXR3byIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICAgICAgTGlzdDxPYmplY3Q+IHhUZXN0ID0gcmVzcG9uc2UuZ2V0SGVhZGVycygpLmdldCgiWC1URVNUIik7CisgICAgICAgIGFzc2VydEVxdWFscygyLCB4VGVzdC5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInR3byIsIHhUZXN0LmdldCgwKSk7CisgICAgICAgIGFzc2VydEVxdWFscygib25lIiwgeFRlc3QuZ2V0KDEpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBJZ25vcmUoIkpFUlNFWS0yNDE0IC0gbm90IHlldCBpbXBsZW1lbnRlZCIpCisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlU3VicmVzb3VyY2VNZXRob2RPbkNsYXNzKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZVdpdGhTdWJyZXNvdXJjZUxvY2F0b3JPbkNsYXNzLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihGaWx0ZXJPbmUuY2xhc3MpLnJlZ2lzdGVyKEZpbHRlclR3by5jbGFzcyk7CisgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbiA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIocmVzb3VyY2VDb25maWcpOworICAgICAgICBmaW5hbCBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGFwcGxpY2F0aW9uLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvc3ViL3N1Ym1ldGhvZCIsICJHRVQiKS5idWlsZCgpKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygib25ldHdvIiwgcmVzcG9uc2UuZ2V0RW50aXR5KCkpOworICAgICAgICBMaXN0PE9iamVjdD4geFRlc3QgPSByZXNwb25zZS5nZXRIZWFkZXJzKCkuZ2V0KCJYLVRFU1QiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHhUZXN0LnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidHdvIiwgeFRlc3QuZ2V0KDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJvbmUiLCB4VGVzdC5nZXQoMSkpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlV2l0aE1ldGhvZE11bHRpcGxlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBAT25lCisgICAgICAgIEBUd28KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoQENvbnRleHQgSHR0cEhlYWRlcnMgaGgpIHsKKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiB4VGVzdCA9IGhoLmdldFJlcXVlc3RIZWFkZXJzKCkuZ2V0KCJYLVRFU1QiKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCB4VGVzdC5zaXplKCkpOworICAgICAgICAgICAgcmV0dXJuIHhUZXN0LmdldCgwKSArIHhUZXN0LmdldCgxKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInN1Ym1ldGhvZCIpCisgICAgICAgIEBPbmUKKyAgICAgICAgQFR3bworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFN1Ym1ldGhvZChAQ29udGV4dCBIdHRwSGVhZGVycyBoaCkgeworICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHhUZXN0ID0gaGguZ2V0UmVxdWVzdEhlYWRlcnMoKS5nZXQoIlgtVEVTVCIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHhUZXN0LnNpemUoKSk7CisgICAgICAgICAgICByZXR1cm4geFRlc3QuZ2V0KDApICsgeFRlc3QuZ2V0KDEpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VNZXRob2RNdWx0aXBsZSgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2VXaXRoTWV0aG9kTXVsdGlwbGUuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKEZpbHRlck9uZS5jbGFzcykucmVnaXN0ZXIoRmlsdGVyVHdvLmNsYXNzKTsKKyAgICAgICAgZmluYWwgQXBwbGljYXRpb25IYW5kbGVyIGFwcGxpY2F0aW9uID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihyZXNvdXJjZUNvbmZpZyk7CisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gYXBwbGljYXRpb24uYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8iLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm9uZXR3byIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICAgICAgTGlzdDxPYmplY3Q+IHhUZXN0ID0gcmVzcG9uc2UuZ2V0SGVhZGVycygpLmdldCgiWC1URVNUIik7CisgICAgICAgIGFzc2VydEVxdWFscygyLCB4VGVzdC5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInR3byIsIHhUZXN0LmdldCgwKSk7CisgICAgICAgIGFzc2VydEVxdWFscygib25lIiwgeFRlc3QuZ2V0KDEpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZVN1YnJlc291cmNlTWV0aG9kTXVsdGlwbGUoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlV2l0aE1ldGhvZE11bHRpcGxlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihGaWx0ZXJPbmUuY2xhc3MpLnJlZ2lzdGVyKEZpbHRlclR3by5jbGFzcyk7CisgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbiA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIocmVzb3VyY2VDb25maWcpOworICAgICAgICBmaW5hbCBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGFwcGxpY2F0aW9uLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvc3VibWV0aG9kIiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJvbmV0d28iLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgICAgIExpc3Q8T2JqZWN0PiB4VGVzdCA9IHJlc3BvbnNlLmdldEhlYWRlcnMoKS5nZXQoIlgtVEVTVCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgeFRlc3Quc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0d28iLCB4VGVzdC5nZXQoMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm9uZSIsIHhUZXN0LmdldCgxKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9maWx0ZXIvVXJpQ29ubmVnRmlsdGVyVGVzdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvZmlsdGVyL1VyaUNvbm5lZ0ZpbHRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmYxNzIxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvZmlsdGVyL1VyaUNvbm5lZ0ZpbHRlclRlc3QuamF2YQpAQCAtMCwwICsxLDg0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5maWx0ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVxdWVzdENvbnRleHRCdWlsZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIFVyaUNvbm5lZ0ZpbHRlclRlc3QgeworCisgICAgcHJpdmF0ZSBBcHBsaWNhdGlvbkhhbmRsZXIgaGFuZGxlcjsKKworICAgIEBQYXRoKCIvcmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZm9vIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRGb28oKSB7CisgICAgICAgICAgICByZXR1cm4gImZvbyI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYmFyIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRCYXIoKSB7CisgICAgICAgICAgICByZXR1cm4gImJhciI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIE1hcDxTdHJpbmcsIE1lZGlhVHlwZT4gbWVkaWFUeXBlcyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgbWVkaWFUeXBlcy5wdXQoImZvbyIsIE1lZGlhVHlwZS52YWx1ZU9mKCJhcHBsaWNhdGlvbi9mb28iKSk7CisgICAgICAgIG1lZGlhVHlwZXMucHV0KCJiYXIiLCBNZWRpYVR5cGUudmFsdWVPZigiYXBwbGljYXRpb24vYmFyIikpOworCisgICAgICAgIFJlc291cmNlQ29uZmlnIHJjID0gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgcmMucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5NRURJQV9UWVBFX01BUFBJTkdTLCBtZWRpYVR5cGVzKTsKKyAgICAgICAgaGFuZGxlciA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIocmMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEZvbygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGhhbmRsZXIuYXBwbHkoCisgICAgICAgICAgICAgICAgUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIiIsICIvcmVzb3VyY2UuZm9vIiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRCYXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBoYW5kbGVyLmFwcGx5KAorICAgICAgICAgICAgICAgIFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIiLCAiL3Jlc291cmNlLmJhciIsICJHRVQiKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYXIiLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvZmlsdGVyL1VyaU1vZGlmaWNhdGlvbkZpbHRlclRlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ZpbHRlci9VcmlNb2RpZmljYXRpb25GaWx0ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYxYTZlMAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ZpbHRlci9VcmlNb2RpZmljYXRpb25GaWx0ZXJUZXN0LmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuZmlsdGVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuUHJlTWF0Y2hpbmc7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUGF0aFNlZ21lbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXF1ZXN0Q29udGV4dEJ1aWxkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3RzIGNhcGFiaWxpdHkgb2YgVVJJIG1vZGlmaWNhdGlvbiBkdXJpbmcgcHJlLW1hdGNoaW5nIGZpbHRlcmluZy4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgVXJpTW9kaWZpY2F0aW9uRmlsdGVyVGVzdCB7CisKKyAgICBAUGF0aCgiL2EvYiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoQENvbnRleHQgVXJpSW5mbyB1aSwgQFF1ZXJ5UGFyYW0oImZpbHRlciIpIFN0cmluZyBmKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImMiLCBmKTsKKyAgICAgICAgICAgIHJldHVybiB1aS5nZXRSZXF1ZXN0VXJpKCkudG9BU0NJSVN0cmluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgQFByZU1hdGNoaW5nCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBVcmlNb2RpZnlGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHsKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgVXJpQnVpbGRlciB1YiA9IHJlcXVlc3RDb250ZXh0LmdldFVyaUluZm8oKS5nZXRCYXNlVXJpQnVpbGRlcigpOworCisgICAgICAgICAgICBMaXN0PFBhdGhTZWdtZW50PiBwc3MgPSByZXF1ZXN0Q29udGV4dC5nZXRVcmlJbmZvKCkuZ2V0UGF0aFNlZ21lbnRzKCk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHNzLnNpemUoKSAtIDE7IGkrKykgeworICAgICAgICAgICAgICAgIHViLnNlZ21lbnQocHNzLmdldChpKS5nZXRQYXRoKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWIucXVlcnlQYXJhbSgiZmlsdGVyIiwgcHNzLmdldChwc3Muc2l6ZSgpIC0gMSkuZ2V0UGF0aCgpKTsKKworICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuc2V0UmVxdWVzdFVyaShyZXF1ZXN0Q29udGV4dC5nZXRVcmlJbmZvKCkuZ2V0QmFzZVVyaSgpLCB1Yi5idWlsZCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdpdGhJbnN0YW5jZSgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKFVyaU1vZGlmeUZpbHRlci5jbGFzcyk7CisgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbiA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIocmVzb3VyY2VDb25maWcpOworICAgICAgICBmaW5hbCBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGFwcGxpY2F0aW9uLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvYS9iL2MiLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9hL2I/ZmlsdGVyPWMiLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvQmFja2dyb3VuZFNjaGVkdWxlclByb3ZpZGVyVGVzdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvQmFja2dyb3VuZFNjaGVkdWxlclByb3ZpZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZDU0NzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9CYWNrZ3JvdW5kU2NoZWR1bGVyUHJvdmlkZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRFeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkRmFjdG9yeTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUHJvZHVjZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVzcG9uc2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlcXVlc3RDb250ZXh0QnVpbGRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkJhY2tncm91bmRTY2hlZHVsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLlNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvclByb3ZpZGVyOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3QgYmFzaWMgYXBwbGljYXRpb24gYmVoYXZpb3IuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEJhY2tncm91bmRTY2hlZHVsZXJQcm92aWRlclRlc3QgeworCisgICAgcHJpdmF0ZSBBcHBsaWNhdGlvbkhhbmRsZXIgY3JlYXRlQXBwbGljYXRpb24oQ2xhc3M8Pz4uLi4gY2xhc3NlcykgeworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhjbGFzc2VzKTsKKworICAgICAgICByZXR1cm4gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihyZXNvdXJjZUNvbmZpZyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBDdXN0b21UaHJlYWQgZXh0ZW5kcyBUaHJlYWQgeworICAgICAgICBwdWJsaWMgQ3VzdG9tVGhyZWFkKFJ1bm5hYmxlIHRhcmdldCkgeworICAgICAgICAgICAgc3VwZXIodGFyZ2V0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBCYWNrZ3JvdW5kU2NoZWR1bGVyCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBDdXN0b21UaHJlYWRQcm92aWRlciBleHRlbmRzIFNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvclByb3ZpZGVyIHsKKworICAgICAgICBwdWJsaWMgQ3VzdG9tVGhyZWFkUHJvdmlkZXIoKSB7CisgICAgICAgICAgICBzdXBlcigiY3VzdG9tLXNjaGVkdWxlciIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBUaHJlYWRGYWN0b3J5IGdldEJhY2tpbmdUaHJlYWRGYWN0b3J5KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBUaHJlYWRGYWN0b3J5KCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBUaHJlYWQgbmV3VGhyZWFkKFJ1bm5hYmxlIHIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDdXN0b21UaHJlYWQocik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJleGVjdXRvcnMtdGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBUZXN0UmVzb3VyY2UgeworICAgICAgICBASW5qZWN0CisgICAgICAgIEBCYWNrZ3JvdW5kU2NoZWR1bGVyCisgICAgICAgIHByaXZhdGUgU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlIGJzOworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIGludCBnZXRUZXN0UmVzdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICAgICAgaW50IHJlc3VsdCA9IDE7IC8vIG1ldGhvZCBpbnZva2VkCisKKyAgICAgICAgICAgIGZpbmFsIEZ1dHVyZTxJbnRlZ2VyPiBmdXR1cmUgPSBicy5zdWJtaXQobmV3IFByb2R1Y2VyPEludGVnZXI+KCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBJbnRlZ2VyIGNhbGwoKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFRocmVhZCB0aHJlYWQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOworICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkIGluc3RhbmNlb2YgQ3VzdG9tVGhyZWFkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTA7IC8vIEN1c3RvbVRocmVhZFByb3ZpZGVyIHVzZWQgdG8gcHJvdmlkZSBCYWNrZ3JvdW5kU2NoZWR1bGVyIGV4ZWN1dG9yIHNlcnZpY2UKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICByZXN1bHQgKz0gZnV0dXJlLmdldCgpOworCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tUnVudGltZVRocmVhZFByb3ZpZGVyU3VwcG9ydCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgQXBwbGljYXRpb25IYW5kbGVyIGFoID0gY3JlYXRlQXBwbGljYXRpb24oQ3VzdG9tVGhyZWFkUHJvdmlkZXIuY2xhc3MsIFRlc3RSZXNvdXJjZS5jbGFzcyk7CisKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBhaC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL2V4ZWN1dG9ycy10ZXN0IiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTb21lIGV4ZWN1dG9yIHRlc3QgYXNzZXJ0aW9ucyBmYWlsZWQuIiwgMTEsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9Db250YWluZXJVdGlsc1Rlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL0NvbnRhaW5lclV0aWxzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NjAxN2UKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9Db250YWluZXJVdGlsc1Rlc3QuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuQ29udGFpbmVyVXRpbHMuZ2V0SGFuZGxlclBhdGg7CitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5Db250YWluZXJVdGlscy5yZWR1Y2VMZWFkaW5nU2xhc2hlczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworCitpbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZS5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdHMgY29udGFpbmVyLW9yaWVudGVkIHV0aWxpdGllcyBmdW5jdGlvbnMuCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK3B1YmxpYyBjbGFzcyBDb250YWluZXJVdGlsc1Rlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVkdWNlTGVhZGluZ1NsYXNoZXMoKSB7CisgICAgICAgIGFzc2VydE51bGwocmVkdWNlTGVhZGluZ1NsYXNoZXMobnVsbCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBhdGgvdG8vZW5kcG9pbnQiLCByZWR1Y2VMZWFkaW5nU2xhc2hlcygicGF0aC90by9lbmRwb2ludCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvcGF0aC90by9lbmRwb2ludCIsIHJlZHVjZUxlYWRpbmdTbGFzaGVzKCIvcGF0aC90by9lbmRwb2ludCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvcGF0aC90by9lbmRwb2ludCIsIHJlZHVjZUxlYWRpbmdTbGFzaGVzKCIvLy8vcGF0aC90by9lbmRwb2ludCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvcGF0aC8vIiwgcmVkdWNlTGVhZGluZ1NsYXNoZXMoIi8vLy9wYXRoLy8iKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SGFuZGxlclBhdGgoKSB7CisgICAgICAgIGFzc2VydE51bGwoZ2V0SGFuZGxlclBhdGgobnVsbCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIGdldEhhbmRsZXJQYXRoKCIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiL3BhdGgvdG8vZW5kcG9pbnQiLCBnZXRIYW5kbGVyUGF0aCgiL3BhdGgvdG8vZW5kcG9pbnQiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiLy8vL3BhdGgvdG8vZW5kcG9pbnQiLCBnZXRIYW5kbGVyUGF0aCgiLy8vL3BhdGgvdG8vZW5kcG9pbnQiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiL3BhdGgvdG8vZW5kcG9pbnQiLCBnZXRIYW5kbGVyUGF0aCgiL3BhdGgvdG8vZW5kcG9pbnQ/IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9wYXRoL3RvL2VuZHBvaW50IiwgZ2V0SGFuZGxlclBhdGgoIi9wYXRoL3RvL2VuZHBvaW50P2Jhcj0xMjMmYmF6PTQzNSIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9SZXNvdXJjZUNvbnRleHRUZXN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9SZXNvdXJjZUNvbnRleHRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdlMjFmYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL1Jlc291cmNlQ29udGV4dFRlc3QuamF2YQpAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlJlc291cmNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXF1ZXN0Q29udGV4dEJ1aWxkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3QgYmFzaWMgYXBwbGljYXRpb24gYmVoYXZpb3IuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNvdXJjZUNvbnRleHRUZXN0IHsKKworICAgIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbjsKKworICAgIHByaXZhdGUgQXBwbGljYXRpb25IYW5kbGVyIGNyZWF0ZUFwcGxpY2F0aW9uKENsYXNzPD8+Li4uIGNsYXNzZXMpIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoY2xhc3Nlcyk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIocmVzb3VyY2VDb25maWcpOworICAgIH0KKworICAgIEBQYXRoKCJhIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlQSB7CisKKyAgICAgICAgQFBhdGgoImIve2lkfSIpCisgICAgICAgIHB1YmxpYyBSZXNvdXJjZUIgcmVzb3VyY2VCKEBDb250ZXh0IFJlc291cmNlQ29udGV4dCByYykgeworICAgICAgICAgICAgcmV0dXJuIHJjLmdldFJlc291cmNlKFJlc291cmNlQi5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgie25hbWV9IikKKyAgICAgICAgcHVibGljIFN1YlJlc291cmNlIHN1YlJlc291cmNlKEBDb250ZXh0IFJlc291cmNlQ29udGV4dCByYykgeworICAgICAgICAgICAgcmV0dXJuIHJjLmdldFJlc291cmNlKFN1YlJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImlzLW51bGwiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGlzTnVsbChAQ29udGV4dCBSZXNvdXJjZUNvbnRleHQgcmMpIHsKKyAgICAgICAgICAgIHJldHVybiAocmMuZ2V0UmVzb3VyY2UoTm90SW5zdGFudGlhYmxlLmNsYXNzKSA9PSBudWxsKSA/ICJudWxsIiA6ICJub3QgbnVsbCI7CisgICAgICAgIH0KKworCisgICAgICAgIEBQYXRoKCJub24taW5zdGFudGlhYmxlIikKKyAgICAgICAgcHVibGljIE5vdEluc3RhbnRpYWJsZSBub3RJbnN0YW50aWFibGUoQENvbnRleHQgUmVzb3VyY2VDb250ZXh0IHJjKSB7CisgICAgICAgICAgICByZXR1cm4gcmMuZ2V0UmVzb3VyY2UoTm90SW5zdGFudGlhYmxlLmNsYXNzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJiL3tpZH0iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VCIHsKKworICAgICAgICBAUGF0aFBhcmFtKCJpZCIpCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGlkOworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiQjogIiArIGlkOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdWJSZXNvdXJjZSB7CisKKyAgICAgICAgQFBhdGhQYXJhbSgibmFtZSIpCisgICAgICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJTUjogIiArIG5hbWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgTm90SW5zdGFudGlhYmxlIHsKKworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEFwcGxpY2F0aW9uSGFuZGxlciBhcHAgPSBjcmVhdGVBcHBsaWNhdGlvbihSZXNvdXJjZUEuY2xhc3MsIFJlc291cmNlQi5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJCOiBjIiwKKyAgICAgICAgICAgICAgICBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9hL2IvYyIsICJHRVQiKS5idWlsZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldCgpLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTUjogZm9vIiwKKyAgICAgICAgICAgICAgICBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9hL2ZvbyIsICJHRVQiKS5idWlsZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldCgpLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJudWxsIiwKKyAgICAgICAgICAgICAgICBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9hL2lzLW51bGwiLCAiR0VUIikuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoKS5nZXRFbnRpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDQsCisgICAgICAgICAgICAgICAgYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvYS9ub24taW5zdGFudGlhYmxlIiwgIkdFVCIpLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KCkuZ2V0U3RhdHVzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL1J1bnRpbWVEZWxlZ2F0ZUltcGxUZXN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9SdW50aW1lRGVsZWdhdGVJbXBsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZDk2NjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9SdW50aW1lRGVsZWdhdGVJbXBsVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUnVudGltZURlbGVnYXRlOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCisvKioKKyAqIFVuaXQgdGVzdCB0aGF0IGNoZWNrcyB0aGF0IHRoZSByaWdodCBSdW50aW1lRGVsZWdhdGVJbXBsIGlzIGxvYWRlZCBieSBKQVgtUlMuCisgKgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK3B1YmxpYyBjbGFzcyBSdW50aW1lRGVsZWdhdGVJbXBsVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVFbmRwb2ludCgpIHsKKyAgICAgICAgUnVudGltZURlbGVnYXRlIGRlbGVnYXRlID0gUnVudGltZURlbGVnYXRlLmdldEluc3RhbmNlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkZWxlZ2F0ZS5jcmVhdGVFbmRwb2ludCgoQXBwbGljYXRpb24pIG51bGwsIGNvbS5zdW4ubmV0Lmh0dHBzZXJ2ZXIuSHR0cEhhbmRsZXIuY2xhc3MpOworICAgICAgICAgICAgZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd24iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlhZSkgeworICAgICAgICAgICAgLy8gb2sgLSBzaG91bGQgYmUgdGhyb3duCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gc2hvdWxkIGJlIHRocm93biIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UnVudGltZURlbGVnYXRlSW5zdGFuY2UoKSB7CisgICAgICAgIGFzc2VydFNhbWUoUnVudGltZURlbGVnYXRlSW1wbC5jbGFzcywgUnVudGltZURlbGVnYXRlLmdldEluc3RhbmNlKCkuZ2V0Q2xhc3MoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvU2VydmljZUZpbmRlclRlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL1NlcnZpY2VGaW5kZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFjYzk0NgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL1NlcnZpY2VGaW5kZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5TZXJ2aWNlRmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5KYXJVdGlsczsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuSmFyVXRpbHMuY3JlYXRlSmFyRmlsZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIFNlcnZpY2VGaW5kZXJUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEphclRvcExldmVsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gbWFwID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBtYXAucHV0KCJvcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvY29uZmlnL2pheHJzLWNvbXBvbmVudHMiLCAiTUVUQS1JTkYvc2VydmljZXMvamF4cnMtY29tcG9uZW50cyIpOworICAgICAgICBtYXAucHV0KCJvcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvY29uZmlnL3RvcGxldmVsL1B1YmxpY1Jvb3RSZXNvdXJjZUNsYXNzLmNsYXNzIiwKKyAgICAgICAgICAgICAgICAib3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2NvbmZpZy90b3BsZXZlbC9QdWJsaWNSb290UmVzb3VyY2VDbGFzcy5jbGFzcyIpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBwYXRoID0gU2VydmljZUZpbmRlclRlc3QuY2xhc3MuZ2V0UmVzb3VyY2UoIiIpLmdldFBhdGgoKTsKKyAgICAgICAgZmluYWwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIgPSBjcmVhdGVDbGFzc0xvYWRlcihwYXRoLnN1YnN0cmluZygwLCBwYXRoLmluZGV4T2YoIm9yZyIpKSwgbWFwKTsKKworICAgICAgICBmaW5hbCBTZXJ2aWNlRmluZGVyPD8+IGZpbmRlciA9IGNyZWF0ZVNlcnZpY2VGaW5kZXIoY2xhc3NMb2FkZXIsICJqYXhycy1jb21wb25lbnRzIik7CisKKyAgICAgICAgZmluYWwgU2V0PENsYXNzPD8+PiBzID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICBDb2xsZWN0aW9ucy5hZGRBbGwocywgZmluZGVyLnRvQ2xhc3NBcnJheSgpKTsKKworICAgICAgICBhc3NlcnRUcnVlKHMuY29udGFpbnMoY2xhc3NMb2FkZXIubG9hZENsYXNzKCJvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuY29uZmlnLnRvcGxldmVsLlB1YmxpY1Jvb3RSZXNvdXJjZUNsYXNzIikpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHMuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFNlcnZpY2VGaW5kZXI8Pz4gY3JlYXRlU2VydmljZUZpbmRlcihmaW5hbCBDbGFzc0xvYWRlciBjbCwgZmluYWwgU3RyaW5nIHNlcnZpY2VOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBDbGFzc0xvYWRlciBvY2wgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihjbCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiBwcmMgPSBjbC5sb2FkQ2xhc3MoIm9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLlNlcnZpY2VGaW5kZXIiKTsKKyAgICAgICAgICAgIGZpbmFsIE1ldGhvZCBtID0gcHJjLmdldE1ldGhvZCgiZmluZCIsIFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgICAgIHJldHVybiAoU2VydmljZUZpbmRlcjw/PikgbS5pbnZva2UobnVsbCwgc2VydmljZU5hbWUpOworICAgICAgICAgICAgLy8gcmV0dXJuIG5ldyBQYWNrYWdlc1Jlc291cmNlQ29uZmlnKHBhY2thZ2VzKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIob2NsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgY3JlYXRlQ2xhc3NMb2FkZXIoZmluYWwgU3RyaW5nIGJhc2UsIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gZW50cmllcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUNsYXNzTG9hZGVyKEphclV0aWxzLlN1ZmZpeC5qYXIsIGJhc2UsIGVudHJpZXMpOworICAgIH0KKworICAgIHByaXZhdGUgQ2xhc3NMb2FkZXIgY3JlYXRlQ2xhc3NMb2FkZXIoZmluYWwgSmFyVXRpbHMuU3VmZml4IHMsIGZpbmFsIFN0cmluZyBiYXNlLCBmaW5hbCBNYXA8U3RyaW5nLAorICAgICAgICAgICAgU3RyaW5nPiBlbnRyaWVzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGZpbmFsIFVSTFtdIHVzID0gbmV3IFVSTFsxXTsKKyAgICAgICAgdXNbMF0gPSBjcmVhdGVKYXJGaWxlKHMsIGJhc2UsIGVudHJpZXMpLnRvVVJJKCkudG9VUkwoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBQYWNrYWdlQ2xhc3NMb2FkZXIodXMpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFBhY2thZ2VDbGFzc0xvYWRlciBleHRlbmRzIFVSTENsYXNzTG9hZGVyIHsKKworICAgICAgICBQYWNrYWdlQ2xhc3NMb2FkZXIoZmluYWwgVVJMW10gdXJscykgeworICAgICAgICAgICAgc3VwZXIodXJscywgbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ2xhc3M8Pz4gZmluZENsYXNzKGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5maW5kQ2xhc3MobmFtZSk7CisgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U3lzdGVtQ2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MobmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvQWJzdHJhY3RUZXN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvQWJzdHJhY3RUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFjM2FhYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9BYnN0cmFjdFRlc3QuamF2YQpAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5pbmplY3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvb2tpZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlcXVlc3Q7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVxdWVzdENvbnRleHRCdWlsZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBDbGFzcyB1c2VkIGZvciB7QGxpbmsgQXBwbGljYXRpb25IYW5kbGVyfSBpbml0aWFsaXphdGlvbiBhbmQgZm9yIGV4ZWN1dGluZyB7QGxpbmsgUmVxdWVzdH1zLgorICoKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFRlc3QgeworCisgICAgcHJpdmF0ZSBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwOworCisgICAgcHJvdGVjdGVkIHZvaWQgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihDbGFzczw/Pi4uLiBjbGFzc2VzKSB7CisgICAgICAgIGFwcCA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIobmV3IFJlc291cmNlQ29uZmlnKGNsYXNzZXMpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnKSB7CisgICAgICAgIGFwcCA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIocmVzb3VyY2VDb25maWcpOworICAgIH0KKworICAgIHByb3RlY3RlZCBDb250YWluZXJSZXNwb25zZSBhcHBseShDb250YWluZXJSZXF1ZXN0IHJlcXVlc3QpCisgICAgICAgICAgICB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcmV0dXJuIGFwcC5hcHBseShyZXF1ZXN0KS5nZXQoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgQ29udGFpbmVyUmVzcG9uc2UgZ2V0UmVzcG9uc2VDb250ZXh0KFN0cmluZyByZXF1ZXN0VXJpLCBDb29raWUuLi4gY29va2llcykKKyAgICAgICAgICAgIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKworICAgICAgICByZXR1cm4gZ2V0UmVzcG9uc2VDb250ZXh0KHJlcXVlc3RVcmksIG51bGwsIGNvb2tpZXMpOworICAgIH0KKworICAgIHByb3RlY3RlZCBDb250YWluZXJSZXNwb25zZSBnZXRSZXNwb25zZUNvbnRleHQoU3RyaW5nIHJlcXVlc3RVcmksIFN0cmluZyBhY2NlcHQsIENvb2tpZS4uLiBjb29raWVzKQorICAgICAgICAgICAgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworCisgICAgICAgIFJlcXVlc3RDb250ZXh0QnVpbGRlciByZXF1ZXN0QnVpbGRlciA9IFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKHJlcXVlc3RVcmksICJHRVQiKTsKKyAgICAgICAgaWYgKGFjY2VwdCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXF1ZXN0QnVpbGRlciA9IHJlcXVlc3RCdWlsZGVyLmFjY2VwdChhY2NlcHQpOworICAgICAgICB9CisgICAgICAgIHJlcXVlc3RCdWlsZGVyID0gcmVxdWVzdEJ1aWxkZXIuY29va2llcyhjb29raWVzKTsKKworICAgICAgICByZXR1cm4gYXBwbHkocmVxdWVzdEJ1aWxkZXIuYnVpbGQoKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgX3Rlc3QoU3RyaW5nIHJlcXVlc3RVcmksIFN0cmluZyBhY2NlcHQsIENvb2tpZS4uLiBjb29raWVzKQorICAgICAgICAgICAgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworCisgICAgICAgIGFzc2VydEVxdWFscygiY29udGVudCIsIGdldFJlc3BvbnNlQ29udGV4dChyZXF1ZXN0VXJpLCBhY2NlcHQsIGNvb2tpZXMpLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBfdGVzdChTdHJpbmcgcmVxdWVzdFVyaSwgQ29va2llLi4uIGNvb2tpZXMpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QocmVxdWVzdFVyaSwgbnVsbCwgY29va2llcyk7CisgICAgfQorCisgICAgcHVibGljIEFwcGxpY2F0aW9uSGFuZGxlciBhcHAoKSB7CisgICAgICAgIHJldHVybiBhcHA7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L0FjdGl2ZUJpbmRpbmdCaW5kaW5nVGVzdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L0FjdGl2ZUJpbmRpbmdCaW5kaW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3YTU3OTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvQWN0aXZlQmluZGluZ0JpbmRpbmdUZXN0LmphdmEKQEAgLTAsMCArMSwyODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLmluamVjdDsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY1R5cGU7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5QZXJMb29rdXA7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLlJlZjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLmludGVybmFsLlJlcXVlc3RTY29wZWQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXF1ZXN0Q29udGV4dEJ1aWxkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5wcm9jZXNzLlJlcXVlc3RQcm9jZXNzaW5nQ29udGV4dDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLmFwaS5EZXNjcmlwdG9yVHlwZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi5hcGkuRGVzY3JpcHRvclZpc2liaWxpdHk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIuYXBpLlNlcnZpY2VIYW5kbGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIudXRpbGl0aWVzLkFic3RyYWN0QWN0aXZlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi51dGlsaXRpZXMuYmluZGluZy5BYnN0cmFjdEJpbmRlcjsKKworaW1wb3J0IG9yZy5qdm5ldC5oazIuaW50ZXJuYWwuU2VydmljZUhhbmRsZUltcGw7CisKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLm5vdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBNYWtlIHN1cmUgaSBjYW4gYmluZCBhbiBhY3RpdmUgZGVzY3JpcHRvciBpbnRvIGFwcGxpY2F0aW9uIGluamVjdGlvbiBtYW5hZ2VyCisgKiB0byBnZXQgYmV0dGVyIGNvbnRyb2wgb3ZlciB0eXBlcyBvZiBpbnN0YW5jZXMgdGhhdCBhcmUgYmVpbmcgaW5qZWN0ZWQuCisgKiBJIHNob3VsZCBiZSBhYmxlIHRvIGluamVjdCBkaWZmZXJlbnQgdHlwZXMgYmFzZWQgb24gc2NvcGUgb2YgdGhlIGluamVjdGVkIGNvbXBvbmVudC4KKyAqCisgKiBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIHNrZXRjaCBmb3IgY29tcGxleCB1c2UgY2FzZXMgbGlrZSB0aGUgb25lIGZyb20gSkVSU0VZLTI4NTUuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEFjdGl2ZUJpbmRpbmdCaW5kaW5nVGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdCB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYX0NPVU5URVJfSEVBREVSID0gIlgtQ09VTlRFUiI7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVRVNUX1RBRyA9ICJSRVFVRVNUIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTSU5HTEVUT05fVEFHID0gIlNJTkdMRVRPTiI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPWFlfVEFHID0gIlBST1hZIjsKKworICAgIHByaXZhdGUgc3RhdGljIEF0b21pY0ludGVnZXIgY291bnRlciA9IG5ldyBBdG9taWNJbnRlZ2VyKDEpOworCisgICAgLyoqCisgICAgICogQm90aCBpbmplY3RlZCB0eXBlcyB3aWxsIGltcGxlbWVudCB0aGlzIGludGVyZmFjZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50ZXJmYWNlIE15UmVxdWVzdERhdGEgeworICAgICAgICBTdHJpbmcgZ2V0UmVxSW5mbygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgd2lsbCBnZXQgaW5qZWN0ZWQgaW50byByZXF1ZXN0IHNjb3BlZCBjb21wb25lbnRzIGFuZCBwYXJhbWV0ZXJzLAorICAgICAqIHdoZXJlIGluamVjdGlvbiBoYXBwZW5zIGZvciBldmVyeSBhbmQgZWFjaCByZXF1ZXN0LCBzbyB0aGF0CisgICAgICogaW5qZWN0ZWQgaW5zdGFuY2UgY2FuIGtlZXAgcmVxdWVzdCBzY29wZWQgZGF0YSBkaXJlY3RseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15UmVxdWVzdERhdGFEaXJlY3QgaW1wbGVtZW50cyBNeVJlcXVlc3REYXRhIHsKKworICAgICAgICBmaW5hbCBTdHJpbmcgczsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIG5ldyBkYXRhIGJlYW4uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzIHJlcXVlc3Qgc2NvcGVkIGRhdGEuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTXlSZXF1ZXN0RGF0YURpcmVjdChTdHJpbmcgcykgeworICAgICAgICAgICAgdGhpcy5zID0gczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFJlcUluZm8oKSB7CisgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJyZXEiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVxUmVzb3VyY2UgeworCisgICAgICAgIEBDb250ZXh0IE15UmVxdWVzdERhdGEgZmllbGQ7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFJlcSgpIHsKKyAgICAgICAgICAgIHJldHVybiBSRVFVRVNUX1RBRyArIGZpZWxkLmdldFJlcUluZm8oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInBhcmFtIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRQYXJhbShAQ29udGV4dCBNeVJlcXVlc3REYXRhIHBhcmFtKSB7CisgICAgICAgICAgICByZXR1cm4gUkVRVUVTVF9UQUcgKyBwYXJhbS5nZXRSZXFJbmZvKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgic2luZ2xldG9uIikKKyAgICBAU2luZ2xldG9uCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTaW5nbGV0b25SZXNvdXJjZSB7CisKKyAgICAgICAgQENvbnRleHQgTXlSZXF1ZXN0RGF0YSBmaWVsZDsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxKCkgeworICAgICAgICAgICAgcmV0dXJuIFNJTkdMRVRPTl9UQUcgKyBmaWVsZC5nZXRSZXFJbmZvKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJwYXJhbSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFyYW0oQENvbnRleHQgTXlSZXF1ZXN0RGF0YSBwYXJhbSkgeworICAgICAgICAgICAgcmV0dXJuIFNJTkdMRVRPTl9UQUcgKyBwYXJhbS5nZXRSZXFJbmZvKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBJZ25vcmUoIkF0IHRoZSB0aW1lIG9mIGlnbm9yaW5nIHRoaXMgdGVzdCwgUmVzb3VyY2VDb25maWcgZG9lcyBub3Qgc3VwcG9ydCBISzIgQmluZGVyIHJlZ2lzdGVyaW5nLiIpCisgICAgcHVibGljIHZvaWQgdGVzdFJlcSgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIC8vIGJvb3RzdHJhcCB0aGUgdGVzdCBhcHBsaWNhdGlvbgorICAgICAgICBSZXNvdXJjZUNvbmZpZyBteUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZygpOworICAgICAgICBteUNvbmZpZy5yZWdpc3RlcihSZXFSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIG15Q29uZmlnLnJlZ2lzdGVyKFNpbmdsZXRvblJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgZmluYWwgTXlSZXF1ZXN0RGF0YURlc2NyaXB0b3IgYWN0aXZlRGVzY3JpcHRvciA9IG5ldyBNeVJlcXVlc3REYXRhRGVzY3JpcHRvcigpOworICAgICAgICBteUNvbmZpZy5yZWdpc3RlcihuZXcgQWJzdHJhY3RCaW5kZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgICAgICBhZGRBY3RpdmVEZXNjcmlwdG9yKGFjdGl2ZURlc2NyaXB0b3IpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihteUNvbmZpZyk7CisgICAgICAgIGFjdGl2ZURlc2NyaXB0b3IuaW5qZWN0aW9uTWFuYWdlciA9IGFwcCgpLmdldEluamVjdGlvbk1hbmFnZXIoKTsKKyAgICAgICAgLy8gZW5kIGJvb3RzdHJhcAorCisgICAgICAgIFN0cmluZyByZXNwb25zZTsKKworICAgICAgICByZXNwb25zZSA9IGdldFJlc3BvbnNlRW50aXR5KCIvcmVxIik7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UsIGNvbnRhaW5zU3RyaW5nKFJFUVVFU1RfVEFHKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UsIG5vdChjb250YWluc1N0cmluZyhQUk9YWV9UQUcpKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSBnZXRSZXNwb25zZUVudGl0eSgiL3JlcS9wYXJhbSIpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLCBjb250YWluc1N0cmluZyhSRVFVRVNUX1RBRykpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLCBub3QoY29udGFpbnNTdHJpbmcoUFJPWFlfVEFHKSkpOworCisgICAgICAgIHJlc3BvbnNlID0gZ2V0UmVzcG9uc2VFbnRpdHkoIi9zaW5nbGV0b24iKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZSwgY29udGFpbnNTdHJpbmcoU0lOR0xFVE9OX1RBRykpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLCBjb250YWluc1N0cmluZyhQUk9YWV9UQUcpKTsKKworICAgICAgICByZXNwb25zZSA9IGdldFJlc3BvbnNlRW50aXR5KCIvcmVxIik7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UsIGNvbnRhaW5zU3RyaW5nKFJFUVVFU1RfVEFHKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UsIG5vdChjb250YWluc1N0cmluZyhQUk9YWV9UQUcpKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSBnZXRSZXNwb25zZUVudGl0eSgiL3NpbmdsZXRvbiIpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLCBjb250YWluc1N0cmluZyhTSU5HTEVUT05fVEFHKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UsIGNvbnRhaW5zU3RyaW5nKFBST1hZX1RBRykpOworCisgICAgICAgIHJlc3BvbnNlID0gZ2V0UmVzcG9uc2VFbnRpdHkoIi9zaW5nbGV0b24vcGFyYW0iKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZSwgY29udGFpbnNTdHJpbmcoU0lOR0xFVE9OX1RBRykpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLCBub3QoY29udGFpbnNTdHJpbmcoUFJPWFlfVEFHKSkpOworCisgICAgICAgIHJlc3BvbnNlID0gZ2V0UmVzcG9uc2VFbnRpdHkoIi9zaW5nbGV0b24vcGFyYW0iKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZSwgY29udGFpbnNTdHJpbmcoU0lOR0xFVE9OX1RBRykpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLCBub3QoY29udGFpbnNTdHJpbmcoUFJPWFlfVEFHKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiByZXNwb25zZSBib2R5IGFzIG9idGFpbmVkIGZyb20gdGhlIHJlc291cmNlIHdpdGggZ2l2ZW4gVVJJLgorICAgICAqIE1ha2Ugc3VyZSB0aGF0IHRoZSByZXNwb25zZSBjb250YWlucyB1bmlxdWUgZGF0YSBzZW50IG91dCBpbiBhIHJlcXVlc3QgaGVhZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHVyaSB0ZXN0ZWQgcmVzb3VyY2UgVVJJLgorICAgICAqIEByZXR1cm4gcmVzcG9uc2UgYm9keSBjb250ZW50LgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGlmIHJlcXVlc3QvcmVzcG9uc2UgZGF0YSBkb2VzIG5vdCBtYXRjaCBvciBhbnkgb3RoZXIgZXJyb3Igb2NjdXJzLgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGdldFJlc3BvbnNlRW50aXR5KGZpbmFsIFN0cmluZyB1cmkpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGZpbmFsIFN0cmluZyBjb3VudGVyVmFsdWUgPSBJbnRlZ2VyLnRvU3RyaW5nKGNvdW50ZXIuZ2V0QW5kSW5jcmVtZW50KCkpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBlbnRpdHkgPSAoU3RyaW5nKSByZXNwb25zZUZyb20odXJpLCBjb3VudGVyVmFsdWUpLmdldEVudGl0eSgpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eSwgY29udGFpbnNTdHJpbmcoY291bnRlclZhbHVlKSk7CisKKyAgICAgICAgcmV0dXJuIGVudGl0eTsKKyAgICB9CisKKyAgICBwcml2YXRlIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlRnJvbShmaW5hbCBTdHJpbmcgdXJpLCBmaW5hbCBTdHJpbmcgY291bnRlclZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKHVyaSwgIkdFVCIpLmhlYWRlcihYX0NPVU5URVJfSEVBREVSLCBjb3VudGVyVmFsdWUpLmJ1aWxkKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhLMiBhY3RpdmUgZGVzY3JpcHRvciB0aGF0IHByb2R1Y2VzIGluc3RhbmNlcyBvZiB0d28gZGlmZmVyZW50IHR5cGVzIGRlcGVuZGluZworICAgICAqIG9uIGludG8gd2hpY2ggY29tcG9uZW50IGl0IGlzIGFjdHVhbGx5IGluamVjdGluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNeVJlcXVlc3REYXRhRGVzY3JpcHRvciBleHRlbmRzIEFic3RyYWN0QWN0aXZlRGVzY3JpcHRvcjxNeVJlcXVlc3REYXRhPiB7CisKKyAgICAgICAgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyOworCisgICAgICAgIHN0YXRpYyBTZXQ8VHlwZT4gYWR2ZXJ0aXNlZENvbnRyYWN0cyA9IG5ldyBIYXNoU2V0PFR5cGU+KCkgeworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFkZChNeVJlcXVlc3REYXRhLmNsYXNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGEgbmV3IGN1c3RvbSBkZXNjcmlwdG9yLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE15UmVxdWVzdERhdGFEZXNjcmlwdG9yKCkgeworICAgICAgICAgICAgc3VwZXIoYWR2ZXJ0aXNlZENvbnRyYWN0cywKKyAgICAgICAgICAgICAgICAgICAgUGVyTG9va3VwLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICBudWxsLCBuZXcgSGFzaFNldDxBbm5vdGF0aW9uPigpLAorICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yVHlwZS5DTEFTUywgRGVzY3JpcHRvclZpc2liaWxpdHkuTE9DQUwsCisgICAgICAgICAgICAgICAgICAgIDAsIG51bGwsIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDbGFzczw/PiBnZXRJbXBsZW1lbnRhdGlvbkNsYXNzKCkgeworICAgICAgICAgICAgcmV0dXJuIE15UmVxdWVzdERhdGEuY2xhc3M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFR5cGUgZ2V0SW1wbGVtZW50YXRpb25UeXBlKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEltcGxlbWVudGF0aW9uQ2xhc3MoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTXlSZXF1ZXN0RGF0YSBjcmVhdGUoU2VydmljZUhhbmRsZTw/PiBzZXJ2aWNlSGFuZGxlKSB7CisKKyAgICAgICAgICAgIGJvb2xlYW4gZGlyZWN0ID0gZmFsc2U7CisKKyAgICAgICAgICAgIGZpbmFsIGphdmF4LmluamVjdC5Qcm92aWRlcjxSZWY8UmVxdWVzdFByb2Nlc3NpbmdDb250ZXh0Pj4gY3R4UmVmID0KKyAgICAgICAgICAgICAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShuZXcgR2VuZXJpY1R5cGU8UHJvdmlkZXI8UmVmPFJlcXVlc3RQcm9jZXNzaW5nQ29udGV4dD4+PigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LmdldFR5cGUoKSk7CisKKyAgICAgICAgICAgIGlmIChzZXJ2aWNlSGFuZGxlIGluc3RhbmNlb2YgU2VydmljZUhhbmRsZUltcGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTZXJ2aWNlSGFuZGxlSW1wbCBzZXJ2aWNlSGFuZGxlSW1wbCA9IChTZXJ2aWNlSGFuZGxlSW1wbCkgc2VydmljZUhhbmRsZTsKKyAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gc2NvcGVBbm5vdGF0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VIYW5kbGVJbXBsLmdldE9yaWdpbmFsUmVxdWVzdCgpLmdldEluamVjdGVlRGVzY3JpcHRvcigpLmdldFNjb3BlQW5ub3RhdGlvbigpOworCisgICAgICAgICAgICAgICAgaWYgKHNjb3BlQW5ub3RhdGlvbiA9PSBSZXF1ZXN0U2NvcGVkLmNsYXNzIHx8IHNjb3BlQW5ub3RhdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGRpcmVjdCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZGlyZWN0CisgICAgICAgICAgICAgICAgICAgID8gbmV3IE15UmVxdWVzdERhdGFEaXJlY3QoY3R4UmVmLmdldCgpLmdldCgpLnJlcXVlc3QoKS5nZXRIZWFkZXJTdHJpbmcoWF9DT1VOVEVSX0hFQURFUikpCisgICAgICAgICAgICAgICAgICAgIC8vIGluIGNhc2Ugb2Ygc2luZ2xldG9uLCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSByZXF1ZXN0IHNjb3BlZCBkYXRhIGFyZSBzdGlsbCBhY2Nlc3NpYmxlCisgICAgICAgICAgICAgICAgICAgIDogbmV3IE15UmVxdWVzdERhdGEoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxSW5mbygpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUFJPWFlfVEFHICsgY3R4UmVmLmdldCgpLmdldCgpLnJlcXVlc3QoKS5nZXRIZWFkZXJTdHJpbmcoWF9DT1VOVEVSX0hFQURFUik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIFN0cmluZyBnZXRJbXBsZW1lbnRhdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBNeVJlcXVlc3REYXRhLmNsYXNzLmdldE5hbWUoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9CZWFuUGFyYW1NZW1vcnlMZWFrVGVzdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L0JlYW5QYXJhbU1lbW9yeUxlYWtUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY5ZmViYgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9CZWFuUGFyYW1NZW1vcnlMZWFrVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5pbmplY3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5CZWFuUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXF1ZXN0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0LmhrMi5EZWxheWVkSGsySW5qZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuaGsyLkltbWVkaWF0ZUhrMkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXF1ZXN0Q29udGV4dEJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi5hcGkuRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi5hcGkuRmlsdGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLmFwaS5TZXJ2aWNlTG9jYXRvcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBSZXByb2R1Y2VyIGZvciBKRVJTRVktMjgwMC4gV2UgbmVlZCB0byBtYWtlIHN1cmUKKyAqIG51bWJlciBvZiBkZXNjcmlwdG9ycyBpbiBISzIgZm9yIHtAbGluayBCZWFuUGFyYW19IGluamVjdGVkCisgKiBwYXJhbWV0ZXIgZG9lcyBub3QgZ3JvdyB1cCBpbiB0aW1lLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBCZWFuUGFyYW1NZW1vcnlMZWFrVGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdCB7CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhcmFtZXRlckJlYW4geworCisgICAgICAgIEBDb250ZXh0CisgICAgICAgIFJlcXVlc3QgcmVxdWVzdDsKKyAgICAgICAgQFF1ZXJ5UGFyYW0oInEiKQorICAgICAgICBTdHJpbmcgcTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCZWFuUGFyYW1JbmplY3Rpb25SZXNvdXJjZSB7CisKKyAgICAgICAgQEJlYW5QYXJhbQorICAgICAgICBQYXJhbWV0ZXJCZWFuIGJlYW47CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiamF4cnMiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1pbGt5V2F5KCkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJHRVQiLCBiZWFuLnJlcXVlc3QuZ2V0TWV0aG9kKCkpOworICAgICAgICAgICAgcmV0dXJuIGJlYW4ucTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJlYW5QYXJhbSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKEJlYW5QYXJhbUluamVjdGlvblJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyID0gYXBwKCkuZ2V0SW5qZWN0aW9uTWFuYWdlcigpOworCisgICAgICAgIFNlcnZpY2VMb2NhdG9yIHNlcnZpY2VMb2NhdG9yOworICAgICAgICBpZiAoaW5qZWN0aW9uTWFuYWdlciBpbnN0YW5jZW9mIEltbWVkaWF0ZUhrMkluamVjdGlvbk1hbmFnZXIpIHsKKyAgICAgICAgICAgIHNlcnZpY2VMb2NhdG9yID0gKChJbW1lZGlhdGVIazJJbmplY3Rpb25NYW5hZ2VyKSBpbmplY3Rpb25NYW5hZ2VyKS5nZXRTZXJ2aWNlTG9jYXRvcigpOworICAgICAgICB9IGVsc2UgaWYgKGluamVjdGlvbk1hbmFnZXIgaW5zdGFuY2VvZiBEZWxheWVkSGsySW5qZWN0aW9uTWFuYWdlcikgeworICAgICAgICAgICAgc2VydmljZUxvY2F0b3IgPSAoKERlbGF5ZWRIazJJbmplY3Rpb25NYW5hZ2VyKSBpbmplY3Rpb25NYW5hZ2VyKS5nZXRTZXJ2aWNlTG9jYXRvcigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkluamVjdGlvbk1hbmFnZXIgaXMgbm90IGFuIGluamVjdGlvbiBtYW5hZ2VyIik7CisgICAgICAgIH0KKworICAgICAgICAvLyB3ZSBkbyBub3QgZXhwZWN0IGFueSBkZXNjcmlwdG9yIHJlZ2lzdGVyZWQgeWV0CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzZXJ2aWNlTG9jYXRvci5nZXREZXNjcmlwdG9ycyhuZXcgUGFyYW1ldGVyQmVhbkZpbHRlcigpKS5zaXplKCkpOworCisgICAgICAgIC8vIG5vdyBtYWtlIG9uZSByZWdpc3RlcmVkIHZpYSB0aGlzIGNhbGwKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJvbmUiLCByZXNvdXJjZSgiL2pheHJzP3E9b25lIikuZ2V0RW50aXR5KCkpOworCisgICAgICAgIC8vIG1ha2Ugc3VyZSBpdCBnb3QgcmVnaXN0ZXJlZAorICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc2VydmljZUxvY2F0b3IuZ2V0RGVzY3JpcHRvcnMobmV3IFBhcmFtZXRlckJlYW5GaWx0ZXIoKSkuc2l6ZSgpKTsKKworICAgICAgICAvLyBtYWtlIGFub3RoZXIgY2FsbAorICAgICAgICBhc3NlcnRFcXVhbHMoInR3byIsIHJlc291cmNlKCIvamF4cnM/cT10d28iKS5nZXRFbnRpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBzZXJ2aWNlTG9jYXRvci5nZXREZXNjcmlwdG9ycyhuZXcgUGFyYW1ldGVyQmVhbkZpbHRlcigpKS5zaXplKCkpOworCisgICAgICAgIC8vIGFuZCBzb21lIG1vcmUKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoSW50ZWdlci50b1N0cmluZyhpKSwgcmVzb3VyY2UoIi9qYXhycz9xPSIgKyBpKS5nZXRFbnRpdHkoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc2VydmljZUxvY2F0b3IuZ2V0RGVzY3JpcHRvcnMobmV3IFBhcmFtZXRlckJlYW5GaWx0ZXIoKSkuc2l6ZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgQ29udGFpbmVyUmVzcG9uc2UgcmVzb3VyY2UoU3RyaW5nIHVyaSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBhcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSh1cmksICJHRVQiKS5idWlsZCgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQYXJhbWV0ZXJCZWFuRmlsdGVyIGltcGxlbWVudHMgRmlsdGVyIHsKKworICAgICAgICBwdWJsaWMgUGFyYW1ldGVyQmVhbkZpbHRlcigpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzKERlc2NyaXB0b3IgZCkgeworICAgICAgICAgICAgcmV0dXJuIFBhcmFtZXRlckJlYW4uY2xhc3MuZ2V0TmFtZSgpLmVxdWFscyhkLmdldEltcGxlbWVudGF0aW9uKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L0NvbnN0cnVjdG9yUGFyYW1ldGVySW5qZWN0aW9uVGVzdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L0NvbnN0cnVjdG9yUGFyYW1ldGVySW5qZWN0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMWVmNTQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvQ29uc3RydWN0b3JQYXJhbWV0ZXJJbmplY3Rpb25UZXN0LmphdmEKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLmluamVjdDsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5NYXRyaXhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CisKKy8qKgorICogVGVzdHMgaW5qZWN0aW9ucyBpbnRvIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgY2xhc3MgQ29uc3RydWN0b3JQYXJhbWV0ZXJJbmplY3Rpb25UZXN0IGV4dGVuZHMgQWJzdHJhY3RUZXN0IHsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbmplY3Rpb24oKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VXaXRoQ29uc3RydWN0b3IuY2xhc3MpOworCisgICAgICAgIF90ZXN0KCIvcmVzb3VyY2UvcDttYXRyaXg9bT9xdWVyeT01Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5qZWN0aW9uSW50b0ZpZWxkcygpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVdpdGhGaWVsZEluamVjdGlvbnMuY2xhc3MpOworCisgICAgICAgIF90ZXN0KCIvZmllbGRzL3A7bWF0cml4PW0/cXVlcnk9NSIpOworICAgIH0KKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5qZWN0aW9uc1dpdGhvdXRNYXRyaXgoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VXaXRoQ29uc3RydWN0b3IuY2xhc3MpOworCisgICAgICAgIF90ZXN0KCIvcmVzb3VyY2UvcC9udWxsTWF0cml4Lz9xdWVyeT01Iik7CisgICAgfQorCisgICAgQFBhdGgoInJlc291cmNlL3twYXRofSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVdpdGhDb25zdHJ1Y3RvciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHBhdGhQYXJhbTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgcXVlcnlQYXJhbTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbWF0cml4UGFyYW07CisKKyAgICAgICAgcHVibGljIFJlc291cmNlV2l0aENvbnN0cnVjdG9yKEBQYXRoUGFyYW0oInBhdGgiKSBTdHJpbmcgcGF0aFBhcmFtLCBAUXVlcnlQYXJhbSgicXVlcnkiKSBpbnQgcXVlcnlQYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBNYXRyaXhQYXJhbSgibWF0cml4IikgU3RyaW5nIG1hdHJpeFBhcmFtKSB7CisgICAgICAgICAgICB0aGlzLm1hdHJpeFBhcmFtID0gbWF0cml4UGFyYW07CisgICAgICAgICAgICB0aGlzLnBhdGhQYXJhbSA9IHBhdGhQYXJhbTsKKyAgICAgICAgICAgIHRoaXMucXVlcnlQYXJhbSA9IHF1ZXJ5UGFyYW07CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJwIiwgcGF0aFBhcmFtKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg1LCBxdWVyeVBhcmFtKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygibSIsIG1hdHJpeFBhcmFtKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJudWxsTWF0cml4IikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRXaXRob3V0TWF0cml4UGFyYW0oKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInAiLCBwYXRoUGFyYW0pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIHF1ZXJ5UGFyYW0pOworICAgICAgICAgICAgYXNzZXJ0TnVsbChtYXRyaXhQYXJhbSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisKKyAgICBAUGF0aCgiZmllbGRzL3twYXRofSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVdpdGhGaWVsZEluamVjdGlvbnMgeworICAgICAgICBAUGF0aFBhcmFtKCJwYXRoIikKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcGF0aFBhcmFtOworICAgICAgICBAUXVlcnlQYXJhbSgicXVlcnkiKQorICAgICAgICBwcml2YXRlIGludCBxdWVyeVBhcmFtOworICAgICAgICBATWF0cml4UGFyYW0oIm1hdHJpeCIpCisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1hdHJpeFBhcmFtOworCisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygicCIsIHBhdGhQYXJhbSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoNSwgcXVlcnlQYXJhbSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm0iLCBtYXRyaXhQYXJhbSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvQ29udGV4dEJhc2VkSW5qZWN0aW9uVGVzdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L0NvbnRleHRCYXNlZEluamVjdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NDA1OWQyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L0NvbnRleHRCYXNlZEluamVjdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuaW5qZWN0OworCitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLkluZmxlY3RvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVxdWVzdENvbnRleHRCdWlsZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXN5bmNDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZTsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFVuaXQgdGVzdCBmb3IgY3JlYXRpbmcgYW4gYXBwbGljYXRpb24gd2l0aCBhc3luY2hyb25vdXNseSBoYW5kbGVkIHJlcXVlc3QgcHJvY2Vzc2luZworICogdmlhIHtAbGluayBSZXNvdXJjZX0ncyBwcm9ncmFtbWF0aWMgQVBJLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgQ29udGV4dEJhc2VkSW5qZWN0aW9uVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgQkFTRV9VUkkgPSBVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYmFzZS8iKTsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nW10+IHRlc3RVcmlTdWZmaXhlcygpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tdW117CisgICAgICAgICAgICAgICAgeyJhL2IvYyIsICJBLUItQyJ9LAorICAgICAgICAgICAgICAgIHsiYS9iL2QvIiwgIkEtQi1EIn0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdXJpU3VmZml4OworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGV4cGVjdGVkUmVzcG9uc2U7CisKKyAgICBwdWJsaWMgQ29udGV4dEJhc2VkSW5qZWN0aW9uVGVzdChTdHJpbmcgdXJpU3VmZml4LCBTdHJpbmcgZXhwZWN0ZWRSZXNwb25zZSkgeworICAgICAgICB0aGlzLnVyaVN1ZmZpeCA9IHVyaVN1ZmZpeDsKKyAgICAgICAgdGhpcy5leHBlY3RlZFJlc3BvbnNlID0gZXhwZWN0ZWRSZXNwb25zZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBc3luY0luZmxlY3RvciBpbXBsZW1lbnRzIEluZmxlY3RvcjxDb250YWluZXJSZXF1ZXN0Q29udGV4dCwgUmVzcG9uc2U+IHsKKworICAgICAgICBAQ29udGV4dAorICAgICAgICBwcml2YXRlIFByb3ZpZGVyPEFzeW5jQ29udGV4dD4gYXN5bmNDb250ZXh0UHJvdmlkZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHJlc3BvbnNlQ29udGVudDsKKworICAgICAgICBwdWJsaWMgQXN5bmNJbmZsZWN0b3IoKSB7CisgICAgICAgICAgICB0aGlzLnJlc3BvbnNlQ29udGVudCA9ICJERUZBVUxUIjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBBc3luY0luZmxlY3RvcihTdHJpbmcgcmVzcG9uc2VDb250ZW50KSB7CisgICAgICAgICAgICB0aGlzLnJlc3BvbnNlQ29udGVudCA9IHJlc3BvbnNlQ29udGVudDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgYXBwbHkoZmluYWwgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxKSB7CisgICAgICAgICAgICAvLyBTdXNwZW5kIGN1cnJlbnQgcmVxdWVzdAorICAgICAgICAgICAgZmluYWwgQXN5bmNDb250ZXh0IGFzeW5jQ29udGV4dCA9IGFzeW5jQ29udGV4dFByb3ZpZGVyLmdldCgpOworICAgICAgICAgICAgYXN5bmNDb250ZXh0LnN1c3BlbmQoKTsKKworICAgICAgICAgICAgRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yKCkuc3VibWl0KG5ldyBSdW5uYWJsZSgpIHsKKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCg1MDApOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5lcnIpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gUmV0dXJuaW5nIHdpbGwgZW50ZXIgdGhlIHN1c3BlbmRlZCByZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgIGFzeW5jQ29udGV4dC5yZXN1bWUoUmVzcG9uc2Uub2soKS5lbnRpdHkocmVzcG9uc2VDb250ZW50KS5idWlsZCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIEFwcGxpY2F0aW9uSGFuZGxlciBhcHA7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXBBcHBsaWNhdGlvbigpIHsKKyAgICAgICAgUmVzb3VyY2VDb25maWcgcmMgPSBuZXcgUmVzb3VyY2VDb25maWcoKTsKKworICAgICAgICBSZXNvdXJjZS5CdWlsZGVyIHJiOworICAgICAgICByYiA9IFJlc291cmNlLmJ1aWxkZXIoImEvYi9jIik7CisgICAgICAgIHJiLmFkZE1ldGhvZCgiR0VUIikuaGFuZGxlZEJ5KG5ldyBBc3luY0luZmxlY3RvcigiQS1CLUMiKSk7CisgICAgICAgIHJjLnJlZ2lzdGVyUmVzb3VyY2VzKHJiLmJ1aWxkKCkpOworCisgICAgICAgIHJiID0gUmVzb3VyY2UuYnVpbGRlcigiYS9iL2QiKTsKKyAgICAgICAgcmIuYWRkTWV0aG9kKCJHRVQiKS5oYW5kbGVkQnkobmV3IEFzeW5jSW5mbGVjdG9yKCJBLUItRCIpKTsKKyAgICAgICAgcmMucmVnaXN0ZXJSZXNvdXJjZXMocmIuYnVpbGQoKSk7CisKKyAgICAgICAgYXBwID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihyYyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNBcHAoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIENvbnRhaW5lclJlcXVlc3QgcmVxID0KKyAgICAgICAgICAgICAgICBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbShCQVNFX1VSSSwgVVJJLmNyZWF0ZShCQVNFX1VSSS5nZXRQYXRoKCkgKyB1cmlTdWZmaXgpLCAiR0VUIikuYnVpbGQoKTsKKworICAgICAgICBGdXR1cmU8Q29udGFpbmVyUmVzcG9uc2U+IHJlcyA9IGFwcC5hcHBseShyZXEpOworCisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFJlc3BvbnNlLCByZXMuZ2V0KCkuZ2V0RW50aXR5KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9Db29raWVQYXJhbUFzQ29va2llVGVzdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L0Nvb2tpZVBhcmFtQXNDb29raWVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgzNGI4MgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9Db29raWVQYXJhbUFzQ29va2llVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLmluamVjdDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuQ29va2llUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvb2tpZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlcXVlc3RDb250ZXh0QnVpbGRlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIENvb2tpZVBhcmFtQXNDb29raWVUZXN0IGV4dGVuZHMgQWJzdHJhY3RUZXN0IHsKKworCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29va2llVHlwZVJlc291cmNlIHsKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0KAorICAgICAgICAgICAgICAgIEBDb250ZXh0IEh0dHBIZWFkZXJzIGgsCisgICAgICAgICAgICAgICAgQENvb2tpZVBhcmFtKCJvbmUiKSBDb29raWUgb25lLAorICAgICAgICAgICAgICAgIEBDb29raWVQYXJhbSgidHdvIikgQ29va2llIHR3bywKKyAgICAgICAgICAgICAgICBAQ29va2llUGFyYW0oInRocmVlIikgQ29va2llIHRocmVlKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm9uZSIsIG9uZS5nZXROYW1lKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZV9vbmUiLCBvbmUuZ2V0VmFsdWUoKSk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygidHdvIiwgdHdvLmdldE5hbWUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlX3R3byIsIHR3by5nZXRWYWx1ZSgpKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIHRocmVlKTsKKworICAgICAgICAgICAgTWFwPFN0cmluZywgQ29va2llPiBjcyA9IGguZ2V0Q29va2llcygpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGNzLnNpemUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlX29uZSIsIGNzLmdldCgib25lIikuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlX3R3byIsIGNzLmdldCgidHdvIikuZ2V0VmFsdWUoKSk7CisKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb29raWVQYXJhbSgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihDb29raWVUeXBlUmVzb3VyY2UuY2xhc3MpOworCisgICAgICAgIENvb2tpZSBvbmUgPSBuZXcgQ29va2llKCJvbmUiLCAidmFsdWVfb25lIik7CisgICAgICAgIENvb2tpZSB0d28gPSBuZXcgQ29va2llKCJ0d28iLCAidmFsdWVfdHdvIik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb250ZW50IiwgYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8iLCAiUE9TVCIpLmNvb2tpZShvbmUpLmNvb2tpZSh0d28pLmJ1aWxkKCkpLmdldEVudGl0eSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvQ29va2llUGFyYW1Bc1ByaW1pdGl2ZVRlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9Db29raWVQYXJhbUFzUHJpbWl0aXZlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZWE2YjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvQ29va2llUGFyYW1Bc1ByaW1pdGl2ZVRlc3QuamF2YQpAQCAtMCwwICsxLDkwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuaW5qZWN0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuQ29va2llUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuRGVmYXVsdFZhbHVlOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29va2llOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXF1ZXN0Q29udGV4dEJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBDb29raWVQYXJhbUFzUHJpbWl0aXZlVGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdCB7CisKKyAgICBwdWJsaWMgQ29va2llUGFyYW1Bc1ByaW1pdGl2ZVRlc3QoKSB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oCisgICAgICAgICAgICAgICAgUmVzb3VyY2VIZWFkZXJQcmltaXRpdmVzLmNsYXNzLAorICAgICAgICAgICAgICAgIFJlc291cmNlSGVhZGVyUHJpbWl0aXZlc0RlZmF1bHROdWxsLmNsYXNzLAorICAgICAgICAgICAgICAgIFJlc291cmNlSGVhZGVyUHJpbWl0aXZlc0RlZmF1bHQuY2xhc3MsCisgICAgICAgICAgICAgICAgUmVzb3VyY2VIZWFkZXJQcmltaXRpdmVzRGVmYXVsdE92ZXJyaWRlLmNsYXNzLAorICAgICAgICAgICAgICAgIFJlc291cmNlSGVhZGVyUHJpbWl0aXZlV3JhcHBlcnMuY2xhc3MsCisgICAgICAgICAgICAgICAgUmVzb3VyY2VIZWFkZXJQcmltaXRpdmVXcmFwcGVyc0RlZmF1bHROdWxsLmNsYXNzLAorICAgICAgICAgICAgICAgIFJlc291cmNlSGVhZGVyUHJpbWl0aXZlV3JhcHBlcnNEZWZhdWx0LmNsYXNzLAorICAgICAgICAgICAgICAgIFJlc291cmNlSGVhZGVyUHJpbWl0aXZlV3JhcHBlcnNEZWZhdWx0T3ZlcnJpZGUuY2xhc3MsCisgICAgICAgICAgICAgICAgUmVzb3VyY2VIZWFkZXJQcmltaXRpdmVMaXN0LmNsYXNzLAorICAgICAgICAgICAgICAgIFJlc291cmNlSGVhZGVyUHJpbWl0aXZlTGlzdERlZmF1bHROdWxsLmNsYXNzLAorICAgICAgICAgICAgICAgIFJlc291cmNlSGVhZGVyUHJpbWl0aXZlTGlzdERlZmF1bHQuY2xhc3MsCisgICAgICAgICAgICAgICAgUmVzb3VyY2VIZWFkZXJQcmltaXRpdmVMaXN0RGVmYXVsdE92ZXJyaWRlLmNsYXNzCisgICAgICAgICk7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VIZWFkZXJQcmltaXRpdmVzIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYm9vbGVhbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQENvb2tpZVBhcmFtKCJib29sZWFuIikgYm9vbGVhbiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2J5dGUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBDb29raWVQYXJhbSgiYnl0ZSIpIGJ5dGUgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEyNywgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3Nob3J0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChAQ29va2llUGFyYW0oInNob3J0Iikgc2hvcnQgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMyNzY3LCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vaW50IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChAQ29va2llUGFyYW0oImludCIpIGludCB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMjE0NzQ4MzY0Nywgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2xvbmciKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBDb29raWVQYXJhbSgibG9uZyIpIGxvbmcgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDkyMjMzNzIwMzY4NTQ3NzU4MDdMLCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZmxvYXQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBDb29raWVQYXJhbSgiZmxvYXQiKSBmbG9hdCB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMy4xNDE1OTI2NWYsIHYsIDApOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9kb3VibGUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBDb29raWVQYXJhbSgiZG91YmxlIikgZG91YmxlIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzLjE0MTU5MjY1MzU4OTc5ZCwgdiwgMCk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi9kZWZhdWx0L251bGwiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VIZWFkZXJQcmltaXRpdmVzRGVmYXVsdE51bGwgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9ib29sZWFuIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChAQ29va2llUGFyYW0oImJvb2xlYW4iKSBib29sZWFuIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2J5dGUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBDb29raWVQYXJhbSgiYnl0ZSIpIGJ5dGUgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHYpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9zaG9ydCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQENvb2tpZVBhcmFtKCJzaG9ydCIpIHNob3J0IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vaW50IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChAQ29va2llUGFyYW0oImludCIpIGludCB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2xvbmciKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBDb29raWVQYXJhbSgibG9uZyIpIGxvbmcgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDBMLCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZmxvYXQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBDb29raWVQYXJhbSgiZmxvYXQiKSBmbG9hdCB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMC4wZiwgdiwgMCk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2RvdWJsZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQENvb2tpZVBhcmFtKCJkb3VibGUiKSBkb3VibGUgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAuMGQsIHYsIDApOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvZGVmYXVsdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZUhlYWRlclByaW1pdGl2ZXNEZWZhdWx0IHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYm9vbGVhbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQENvb2tpZVBhcmFtKCJib29sZWFuIikgQERlZmF1bHRWYWx1ZSgidHJ1ZSIpIGJvb2xlYW4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHYpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9ieXRlIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChAQ29va2llUGFyYW0oImJ5dGUiKSBARGVmYXVsdFZhbHVlKCIxMjciKSBieXRlIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxMjcsIHYpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9zaG9ydCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQENvb2tpZVBhcmFtKCJzaG9ydCIpIEBEZWZhdWx0VmFsdWUoIjMyNzY3Iikgc2hvcnQgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMyNzY3LCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vaW50IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChAQ29va2llUGFyYW0oImludCIpIEBEZWZhdWx0VmFsdWUoIjIxNDc0ODM2NDciKSBpbnQgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIxNDc0ODM2NDcsIHYpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9sb25nIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChAQ29va2llUGFyYW0oImxvbmciKSBARGVmYXVsdFZhbHVlKCI5MjIzMzcyMDM2ODU0Nzc1ODA3IikgbG9uZyB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoOTIyMzM3MjAzNjg1NDc3NTgwN0wsIHYpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mbG9hdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQENvb2tpZVBhcmFtKCJmbG9hdCIpIEBEZWZhdWx0VmFsdWUoIjMuMTQxNTkyNjUiKSBmbG9hdCB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMy4xNDE1OTI2NWYsIHYsIDApOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9kb3VibGUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBDb29raWVQYXJhbSgiZG91YmxlIikgQERlZmF1bHRWYWx1ZSgiMy4xNDE1OTI2NTM1ODk3OSIpIGRvdWJsZSB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMy4xNDE1OTI2NTM1ODk3OWQsIHYsIDApOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvZGVmYXVsdC9vdmVycmlkZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZUhlYWRlclByaW1pdGl2ZXNEZWZhdWx0T3ZlcnJpZGUgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9ib29sZWFuIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChAQ29va2llUGFyYW0oImJvb2xlYW4iKSBARGVmYXVsdFZhbHVlKCJmYWxzZSIpIGJvb2xlYW4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHYpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9ieXRlIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChAQ29va2llUGFyYW0oImJ5dGUiKSBARGVmYXVsdFZhbHVlKCIxIikgYnl0ZSB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMTI3LCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vc2hvcnQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBDb29raWVQYXJhbSgic2hvcnQiKSBARGVmYXVsdFZhbHVlKCIxIikgc2hvcnQgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMyNzY3LCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vaW50IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChAQ29va2llUGFyYW0oImludCIpIEBEZWZhdWx0VmFsdWUoIjEiKSBpbnQgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIxNDc0ODM2NDcsIHYpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9sb25nIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChAQ29va2llUGFyYW0oImxvbmciKSBARGVmYXVsdFZhbHVlKCIxIikgbG9uZyB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoOTIyMzM3MjAzNjg1NDc3NTgwN0wsIHYpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mbG9hdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQENvb2tpZVBhcmFtKCJmbG9hdCIpIEBEZWZhdWx0VmFsdWUoIjAuMCIpIGZsb2F0IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzLjE0MTU5MjY1ZiwgdiwgMCk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2RvdWJsZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQENvb2tpZVBhcmFtKCJkb3VibGUiKSBARGVmYXVsdFZhbHVlKCIwLjAiKSBkb3VibGUgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMuMTQxNTkyNjUzNTg5NzlkLCB2LCAwKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL3dyYXBwZXJzIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlSGVhZGVyUHJpbWl0aXZlV3JhcHBlcnMgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9ib29sZWFuIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChAQ29va2llUGFyYW0oImJvb2xlYW4iKSBCb29sZWFuIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYnl0ZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQENvb2tpZVBhcmFtKCJieXRlIikgQnl0ZSB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMTI3LCB2LmJ5dGVWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vc2hvcnQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBDb29raWVQYXJhbSgic2hvcnQiKSBTaG9ydCB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMzI3NjcsIHYuc2hvcnRWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vaW50IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChAQ29va2llUGFyYW0oImludCIpIEludGVnZXIgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIxNDc0ODM2NDcsIHYuaW50VmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2xvbmciKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBDb29raWVQYXJhbSgibG9uZyIpIExvbmcgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDkyMjMzNzIwMzY4NTQ3NzU4MDdMLCB2LmxvbmdWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZmxvYXQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBDb29raWVQYXJhbSgiZmxvYXQiKSBGbG9hdCB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMy4xNDE1OTI2NWYsIHYsIDApOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9kb3VibGUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBDb29raWVQYXJhbSgiZG91YmxlIikgRG91YmxlIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzLjE0MTU5MjY1MzU4OTc5ZCwgdiwgMCk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi93cmFwcGVycy9kZWZhdWx0L251bGwiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VIZWFkZXJQcmltaXRpdmVXcmFwcGVyc0RlZmF1bHROdWxsIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYm9vbGVhbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQENvb2tpZVBhcmFtKCJib29sZWFuIikgQm9vbGVhbiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2J5dGUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBDb29raWVQYXJhbSgiYnl0ZSIpIEJ5dGUgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIHYpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9zaG9ydCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQENvb2tpZVBhcmFtKCJzaG9ydCIpIFNob3J0IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vaW50IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChAQ29va2llUGFyYW0oImludCIpIEludGVnZXIgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIHYpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9sb25nIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChAQ29va2llUGFyYW0oImxvbmciKSBMb25nIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZmxvYXQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBDb29raWVQYXJhbSgiZmxvYXQiKSBGbG9hdCB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2RvdWJsZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQENvb2tpZVBhcmFtKCJkb3VibGUiKSBEb3VibGUgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIHYpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvd3JhcHBlcnMvZGVmYXVsdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZUhlYWRlclByaW1pdGl2ZVdyYXBwZXJzRGVmYXVsdCB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Jvb2xlYW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBDb29raWVQYXJhbSgiYm9vbGVhbiIpIEBEZWZhdWx0VmFsdWUoInRydWUiKSBCb29sZWFuIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYnl0ZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQENvb2tpZVBhcmFtKCJieXRlIikgQERlZmF1bHRWYWx1ZSgiMTI3IikgQnl0ZSB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMTI3LCB2LmJ5dGVWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vc2hvcnQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBDb29raWVQYXJhbSgic2hvcnQiKSBARGVmYXVsdFZhbHVlKCIzMjc2NyIpIFNob3J0IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzMjc2Nywgdi5zaG9ydFZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9pbnQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBDb29raWVQYXJhbSgiaW50IikgQERlZmF1bHRWYWx1ZSgiMjE0NzQ4MzY0NyIpIEludGVnZXIgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIxNDc0ODM2NDcsIHYuaW50VmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2xvbmciKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBDb29raWVQYXJhbSgibG9uZyIpIEBEZWZhdWx0VmFsdWUoIjkyMjMzNzIwMzY4NTQ3NzU4MDciKSBMb25nIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg5MjIzMzcyMDM2ODU0Nzc1ODA3TCwgdi5sb25nVmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Zsb2F0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChAQ29va2llUGFyYW0oImZsb2F0IikgQERlZmF1bHRWYWx1ZSgiMy4xNDE1OTI2NSIpIEZsb2F0IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzLjE0MTU5MjY1ZiwgdiwgMCk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2RvdWJsZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQENvb2tpZVBhcmFtKCJkb3VibGUiKSBARGVmYXVsdFZhbHVlKCIzLjE0MTU5MjY1MzU4OTc5IikgRG91YmxlIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzLjE0MTU5MjY1MzU4OTc5ZCwgdiwgMCk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi93cmFwcGVycy9kZWZhdWx0L292ZXJyaWRlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlSGVhZGVyUHJpbWl0aXZlV3JhcHBlcnNEZWZhdWx0T3ZlcnJpZGUgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9ib29sZWFuIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChAQ29va2llUGFyYW0oImJvb2xlYW4iKSBARGVmYXVsdFZhbHVlKCJmYWxzZSIpIEJvb2xlYW4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHYpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9ieXRlIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChAQ29va2llUGFyYW0oImJ5dGUiKSBARGVmYXVsdFZhbHVlKCIxIikgQnl0ZSB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMTI3LCB2LmJ5dGVWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vc2hvcnQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBDb29raWVQYXJhbSgic2hvcnQiKSBARGVmYXVsdFZhbHVlKCIxIikgU2hvcnQgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMyNzY3LCB2LnNob3J0VmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2ludCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQENvb2tpZVBhcmFtKCJpbnQiKSBARGVmYXVsdFZhbHVlKCIxIikgSW50ZWdlciB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMjE0NzQ4MzY0Nywgdi5pbnRWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vbG9uZyIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQENvb2tpZVBhcmFtKCJsb25nIikgQERlZmF1bHRWYWx1ZSgiMSIpIExvbmcgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDkyMjMzNzIwMzY4NTQ3NzU4MDdMLCB2LmxvbmdWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZmxvYXQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBDb29raWVQYXJhbSgiZmxvYXQiKSBARGVmYXVsdFZhbHVlKCIwLjAiKSBGbG9hdCB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMy4xNDE1OTI2NWYsIHYsIDApOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9kb3VibGUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBDb29raWVQYXJhbSgiZG91YmxlIikgQERlZmF1bHRWYWx1ZSgiMC4wIikgRG91YmxlIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzLjE0MTU5MjY1MzU4OTc5ZCwgdiwgMCk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi9saXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlSGVhZGVyUHJpbWl0aXZlTGlzdCB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Jvb2xlYW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0Qm9vbGVhbihAQ29va2llUGFyYW0oImJvb2xlYW4iKSBMaXN0PEJvb2xlYW4+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCB2LmdldCgwKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2J5dGUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0Qnl0ZShAQ29va2llUGFyYW0oImJ5dGUiKSBMaXN0PEJ5dGU+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxMjcsIHYuZ2V0KDApLmJ5dGVWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vc2hvcnQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0U2hvcnQoQENvb2tpZVBhcmFtKCJzaG9ydCIpIExpc3Q8U2hvcnQ+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzMjc2Nywgdi5nZXQoMCkuc2hvcnRWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vaW50IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldEludGVnZXIoQENvb2tpZVBhcmFtKCJpbnQiKSBMaXN0PEludGVnZXI+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyMTQ3NDgzNjQ3LCB2LmdldCgwKS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vbG9uZyIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRMb25nKEBDb29raWVQYXJhbSgibG9uZyIpIExpc3Q8TG9uZz4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDkyMjMzNzIwMzY4NTQ3NzU4MDdMLCB2LmdldCgwKS5sb25nVmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Zsb2F0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldEZsb2F0KEBDb29raWVQYXJhbSgiZmxvYXQiKSBMaXN0PEZsb2F0PiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMy4xNDE1OTI2NWYsIHYuZ2V0KDApLCAwKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZG91YmxlIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldERvdWJsZShAQ29va2llUGFyYW0oImRvdWJsZSIpIExpc3Q8RG91YmxlPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMy4xNDE1OTI2NTM1ODk3OWQsIHYuZ2V0KDApLCAwKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL2xpc3QvZGVmYXVsdC9udWxsIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlSGVhZGVyUHJpbWl0aXZlTGlzdERlZmF1bHROdWxsIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYm9vbGVhbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRCb29sZWFuKEBDb29raWVQYXJhbSgiYm9vbGVhbiIpIExpc3Q8Qm9vbGVhbj4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHYuc2l6ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYnl0ZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRCeXRlKEBDb29raWVQYXJhbSgiYnl0ZSIpIExpc3Q8Qnl0ZT4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHYuc2l6ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vc2hvcnQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0U2hvcnQoQENvb2tpZVBhcmFtKCJzaG9ydCIpIExpc3Q8U2hvcnQ+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCB2LnNpemUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2ludCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRJbnRlZ2VyKEBDb29raWVQYXJhbSgiaW50IikgTGlzdDxJbnRlZ2VyPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdi5zaXplKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9sb25nIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldExvbmcoQENvb2tpZVBhcmFtKCJsb25nIikgTGlzdDxMb25nPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdi5zaXplKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mbG9hdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRGbG9hdChAQ29va2llUGFyYW0oImZsb2F0IikgTGlzdDxGbG9hdD4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHYuc2l6ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZG91YmxlIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldERvdWJsZShAQ29va2llUGFyYW0oImRvdWJsZSIpIExpc3Q8RG91YmxlPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdi5zaXplKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvbGlzdC9kZWZhdWx0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlSGVhZGVyUHJpbWl0aXZlTGlzdERlZmF1bHQgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9ib29sZWFuIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldEJvb2xlYW4oQENvb2tpZVBhcmFtKCJib29sZWFuIikgQERlZmF1bHRWYWx1ZSgidHJ1ZSIpIExpc3Q8Qm9vbGVhbj4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHYuZ2V0KDApKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYnl0ZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRCeXRlKEBDb29raWVQYXJhbSgiYnl0ZSIpIEBEZWZhdWx0VmFsdWUoIjEyNyIpIExpc3Q8Qnl0ZT4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEyNywgdi5nZXQoMCkuYnl0ZVZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9zaG9ydCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRTaG9ydChAQ29va2llUGFyYW0oInNob3J0IikgQERlZmF1bHRWYWx1ZSgiMzI3NjciKSBMaXN0PFNob3J0PiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMzI3NjcsIHYuZ2V0KDApLnNob3J0VmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2ludCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRJbnRlZ2VyKEBDb29raWVQYXJhbSgiaW50IikgQERlZmF1bHRWYWx1ZSgiMjE0NzQ4MzY0NyIpIExpc3Q8SW50ZWdlcj4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIxNDc0ODM2NDcsIHYuZ2V0KDApLmludFZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9sb25nIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldExvbmcoQENvb2tpZVBhcmFtKCJsb25nIikgQERlZmF1bHRWYWx1ZSgiOTIyMzM3MjAzNjg1NDc3NTgwNyIpIExpc3Q8TG9uZz4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDkyMjMzNzIwMzY4NTQ3NzU4MDdMLCB2LmdldCgwKS5sb25nVmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Zsb2F0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldEZsb2F0KEBDb29raWVQYXJhbSgiZmxvYXQiKSBARGVmYXVsdFZhbHVlKCIzLjE0MTU5MjY1IikgTGlzdDxGbG9hdD4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMuMTQxNTkyNjVmLCB2LmdldCgwKSwgMCk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2RvdWJsZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXREb3VibGUoQENvb2tpZVBhcmFtKCJkb3VibGUiKSBARGVmYXVsdFZhbHVlKCIzLjE0MTU5MjY1MzU4OTc5IikgTGlzdDxEb3VibGU+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzLjE0MTU5MjY1MzU4OTc5ZCwgdi5nZXQoMCksIDApOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvbGlzdC9kZWZhdWx0L292ZXJyaWRlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlSGVhZGVyUHJpbWl0aXZlTGlzdERlZmF1bHRPdmVycmlkZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Jvb2xlYW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0Qm9vbGVhbihAQ29va2llUGFyYW0oImJvb2xlYW4iKSBARGVmYXVsdFZhbHVlKCJmYWxzZSIpIExpc3Q8Qm9vbGVhbj4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHYuZ2V0KDApKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYnl0ZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRCeXRlKEBDb29raWVQYXJhbSgiYnl0ZSIpIEBEZWZhdWx0VmFsdWUoIjAiKSBMaXN0PEJ5dGU+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxMjcsIHYuZ2V0KDApLmJ5dGVWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vc2hvcnQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0U2hvcnQoQENvb2tpZVBhcmFtKCJzaG9ydCIpIEBEZWZhdWx0VmFsdWUoIjAiKSBMaXN0PFNob3J0PiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMzI3NjcsIHYuZ2V0KDApLnNob3J0VmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2ludCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRJbnRlZ2VyKEBDb29raWVQYXJhbSgiaW50IikgQERlZmF1bHRWYWx1ZSgiMCIpIExpc3Q8SW50ZWdlcj4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIxNDc0ODM2NDcsIHYuZ2V0KDApLmludFZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9sb25nIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldExvbmcoQENvb2tpZVBhcmFtKCJsb25nIikgQERlZmF1bHRWYWx1ZSgiMCIpIExpc3Q8TG9uZz4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDkyMjMzNzIwMzY4NTQ3NzU4MDdMLCB2LmdldCgwKS5sb25nVmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Zsb2F0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldEZsb2F0KEBDb29raWVQYXJhbSgiZmxvYXQiKSBARGVmYXVsdFZhbHVlKCIwLjAiKSBMaXN0PEZsb2F0PiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMy4xNDE1OTI2NWYsIHYuZ2V0KDApLCAwKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZG91YmxlIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldERvdWJsZShAQ29va2llUGFyYW0oImRvdWJsZSIpIEBEZWZhdWx0VmFsdWUoIjAuMCIpIExpc3Q8RG91YmxlPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMy4xNDE1OTI2NTM1ODk3OWQsIHYuZ2V0KDApLCAwKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIF90ZXN0KFN0cmluZyB0eXBlLCBTdHJpbmcgdmFsdWUpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb250ZW50IiwKKyAgICAgICAgICAgICAgICBhcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJHRVQiKS5hY2NlcHQoImFwcGxpY2F0aW9uLyIgKyB0eXBlKS5jb29raWUobmV3IENvb2tpZSh0eXBlLCB2YWx1ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkuZ2V0RW50aXR5KCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygiY29udGVudCIsCisgICAgICAgICAgICAgICAgYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi93cmFwcGVycyIsICJHRVQiKS5hY2NlcHQoImFwcGxpY2F0aW9uLyIgKyB0eXBlKS5jb29raWUobmV3IENvb2tpZSh0eXBlLCB2YWx1ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkuZ2V0RW50aXR5KCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygiY29udGVudCIsCisgICAgICAgICAgICAgICAgYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9saXN0IiwgIkdFVCIpLmFjY2VwdCgiYXBwbGljYXRpb24vIiArIHR5cGUpLmNvb2tpZShuZXcgQ29va2llKHR5cGUsIHZhbHVlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKS5nZXRFbnRpdHkoKSk7CisgICAgfQorCisgICAgdm9pZCBfdGVzdERlZmF1bHQoU3RyaW5nIGJhc2UsIFN0cmluZyB0eXBlLCBTdHJpbmcgdmFsdWUpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb250ZW50IiwKKyAgICAgICAgICAgICAgICBhcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbShiYXNlICsgImRlZmF1bHQvbnVsbCIsICJHRVQiKS5hY2NlcHQoImFwcGxpY2F0aW9uLyIgKyB0eXBlKS5idWlsZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldEVudGl0eSgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbnRlbnQiLAorICAgICAgICAgICAgICAgIGFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKGJhc2UgKyAiZGVmYXVsdCIsICJHRVQiKS5hY2NlcHQoImFwcGxpY2F0aW9uLyIgKyB0eXBlKS5idWlsZCgpKS5nZXRFbnRpdHkoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb250ZW50IiwgYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oYmFzZSArICJkZWZhdWx0L292ZXJyaWRlIiwgIkdFVCIpLmFjY2VwdCgiYXBwbGljYXRpb24vIiArIHR5cGUpCisgICAgICAgICAgICAgICAgLmNvb2tpZShuZXcgQ29va2llKHR5cGUsIHZhbHVlKSkuYnVpbGQoKSkuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIHZvaWQgX3Rlc3REZWZhdWx0KFN0cmluZyB0eXBlLCBTdHJpbmcgdmFsdWUpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3REZWZhdWx0KCIvIiwgdHlwZSwgdmFsdWUpOworICAgIH0KKworICAgIHZvaWQgX3Rlc3RXcmFwcGVyc0RlZmF1bHQoU3RyaW5nIHR5cGUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdERlZmF1bHQoIi93cmFwcGVycy8iLCB0eXBlLCB2YWx1ZSk7CisgICAgfQorCisgICAgdm9pZCBfdGVzdExpc3REZWZhdWx0KFN0cmluZyB0eXBlLCBTdHJpbmcgdmFsdWUpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3REZWZhdWx0KCIvbGlzdC8iLCB0eXBlLCB2YWx1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Qm9vbGVhbigpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoImJvb2xlYW4iLCAidHJ1ZSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEJvb2xlYW5QcmltaXRpdmVzRGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3REZWZhdWx0KCJib29sZWFuIiwgInRydWUiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRCb29sZWFuUHJpbWl0aXZlV3JhcHBlckRlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0V3JhcHBlcnNEZWZhdWx0KCJib29sZWFuIiwgInRydWUiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRCb29sZWFuUHJpbWl0aXZlTGlzdERlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0TGlzdERlZmF1bHQoImJvb2xlYW4iLCAidHJ1ZSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEJ5dGUoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJieXRlIiwgIjEyNyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEJ5dGVQcmltaXRpdmVzRGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3REZWZhdWx0KCJieXRlIiwgIjEyNyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEJ5dGVQcmltaXRpdmVXcmFwcGVyc0RlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0V3JhcHBlcnNEZWZhdWx0KCJieXRlIiwgIjEyNyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEJ5dGVQcmltaXRpdmVMaXN0RGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RMaXN0RGVmYXVsdCgiYnl0ZSIsICIxMjciKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTaG9ydCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoInNob3J0IiwgIjMyNzY3Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2hvcnRQcmltdGl2ZXNEZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdERlZmF1bHQoInNob3J0IiwgIjMyNzY3Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2hvcnRQcmltdGl2ZVdyYXBwZXJzRGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RXcmFwcGVyc0RlZmF1bHQoInNob3J0IiwgIjMyNzY3Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2hvcnRQcmltdGl2ZUxpc3REZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdExpc3REZWZhdWx0KCJzaG9ydCIsICIzMjc2NyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEludCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoImludCIsICIyMTQ3NDgzNjQ3Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW50UHJpbWl0aXZlc0RlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0RGVmYXVsdCgiaW50IiwgIjIxNDc0ODM2NDciKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJbnRQcmltaXRpdmVXcmFwcGVyc0RlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0V3JhcHBlcnNEZWZhdWx0KCJpbnQiLCAiMjE0NzQ4MzY0NyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEludFByaW1pdGl2ZUxpc3REZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdExpc3REZWZhdWx0KCJpbnQiLCAiMjE0NzQ4MzY0NyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldExvbmcoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJsb25nIiwgIjkyMjMzNzIwMzY4NTQ3NzU4MDciKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRMb25nUHJpbWl0aXZlc0RlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0RGVmYXVsdCgibG9uZyIsICI5MjIzMzcyMDM2ODU0Nzc1ODA3Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TG9uZ1ByaW1pdGl2ZVdyYXBwZXJzRGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RXcmFwcGVyc0RlZmF1bHQoImxvbmciLCAiOTIyMzM3MjAzNjg1NDc3NTgwNyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldExvbmdQcmltaXRpdmVMaXN0RGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RMaXN0RGVmYXVsdCgibG9uZyIsICI5MjIzMzcyMDM2ODU0Nzc1ODA3Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RmxvYXQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJmbG9hdCIsICIzLjE0MTU5MjY1Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RmxvYXRQcmltaXRpdmVzRGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3REZWZhdWx0KCJmbG9hdCIsICIzLjE0MTU5MjY1Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RmxvYXRQcmltaXRpdmVXcmFwcGVyc0RlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0V3JhcHBlcnNEZWZhdWx0KCJmbG9hdCIsICIzLjE0MTU5MjY1Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RmxvYXRQcmltaXRpdmVMaXN0RGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RMaXN0RGVmYXVsdCgiZmxvYXQiLCAiMy4xNDE1OTI2NSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldERvdWJsZSgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoImRvdWJsZSIsICIzLjE0MTU5MjY1MzU4OTc5Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RG91YmxlUHJpbWl0aXZlc0RlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0RGVmYXVsdCgiZG91YmxlIiwgIjMuMTQxNTkyNjUzNTg5NzkiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXREb3VibGVQcmltaXRpdmVXcmFwcGVyc0RlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0V3JhcHBlcnNEZWZhdWx0KCJkb3VibGUiLCAiMy4xNDE1OTI2NTM1ODk3OSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldERvdWJsZVByaW1pdGl2ZUxpc3REZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdExpc3REZWZhdWx0KCJkb3VibGUiLCAiMy4xNDE1OTI2NTM1ODk3OSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJhZFByaW1pdGl2ZVZhbHVlKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworCisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlQ29udGV4dCA9IGFwcGx5KAorICAgICAgICAgICAgICAgIFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvIiwgIkdFVCIpLmFjY2VwdCgiYXBwbGljYXRpb24vaW50IikuY29va2llKG5ldyBDb29raWUoImludCIsICJhYmNkZWYiKSkuYnVpbGQoKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIHJlc3BvbnNlQ29udGV4dC5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFkUHJpbWl0aXZlV3JhcHBlclZhbHVlKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworCisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlQ29udGV4dCA9IGFwcGx5KAorICAgICAgICAgICAgICAgIFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvd3JhcHBlcnMiLCAiR0VUIikuYWNjZXB0KCJhcHBsaWNhdGlvbi9pbnQiKS5jb29raWUobmV3IENvb2tpZSgiaW50IiwgImFiY2RlZiIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCByZXNwb25zZUNvbnRleHQuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJhZFByaW1pdGl2ZUxpc3RWYWx1ZSgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKworICAgICAgICBmaW5hbCBDb250YWluZXJSZXNwb25zZSByZXNwb25zZUNvbnRleHQgPSBhcHBseSgKKyAgICAgICAgICAgICAgICBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3dyYXBwZXJzIiwgIkdFVCIpLmFjY2VwdCgiYXBwbGljYXRpb24vaW50IikuY29va2llKG5ldyBDb29raWUoImludCIsICJhYmNkZWYiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpCisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMCwgcmVzcG9uc2VDb250ZXh0LmdldFN0YXR1cygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvQ29va2llUGFyYW1Bc1N0cmluZ1Rlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9Db29raWVQYXJhbUFzU3RyaW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzYzgyYTgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvQ29va2llUGFyYW1Bc1N0cmluZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDMzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuaW5qZWN0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuQ29va2llUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuRGVmYXVsdFZhbHVlOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db29raWU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVzcG9uc2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlcXVlc3RDb250ZXh0QnVpbGRlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCitwdWJsaWMgY2xhc3MgQ29va2llUGFyYW1Bc1N0cmluZ1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdFRlc3QgeworCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VTdHJpbmcgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChAQ29va2llUGFyYW0oImFyZzEiKSBTdHJpbmcgYXJnMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBAQ29va2llUGFyYW0oImFyZzIiKSBTdHJpbmcgYXJnMiwgQENvb2tpZVBhcmFtKCJhcmczIikgU3RyaW5nIGFyZzMpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiYSIsIGFyZzEpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJiIiwgYXJnMik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImMiLCBhcmczKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvUG9zdChAQ29va2llUGFyYW0oImFyZzEiKSBTdHJpbmcgYXJnMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQENvb2tpZVBhcmFtKCJhcmcyIikgU3RyaW5nIGFyZzIsIEBDb29raWVQYXJhbSgiYXJnMyIpIFN0cmluZyBhcmczLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgYXJnMSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImIiLCBhcmcyKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiYyIsIGFyZzMpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb250ZW50Iiwgcik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VTdHJpbmdFbXB0eSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBDb29raWVQYXJhbSgiYXJnMSIpIFN0cmluZyBhcmcxKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIGFyZzEpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlU3RyaW5nQWJzZW50IHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQENvb2tpZVBhcmFtKCJhcmcxIikgU3RyaW5nIGFyZzEpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBhcmcxKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVN0cmluZ0xpc3QgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9zdHJpbmdsaXN0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldFN0cmluZyhAQ29va2llUGFyYW0oImFyZ3MiKSBMaXN0PFN0cmluZz4gYXJncykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgYXJncy5nZXQoMCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9saXN0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChAQ29va2llUGFyYW0oImFyZ3MiKSBMaXN0IGFyZ3MpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuY2xhc3MsIGFyZ3MuZ2V0KDApLmdldENsYXNzKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgYXJncy5nZXQoMCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlU3RyaW5nTGlzdEVtcHR5IHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vc3RyaW5nbGlzdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRTdHJpbmcoQENvb2tpZVBhcmFtKCJhcmdzIikgTGlzdDxTdHJpbmc+IGFyZ3MpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBhcmdzLnNpemUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIGFyZ3MuZ2V0KDApKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVN0cmluZ051bGxEZWZhdWx0IHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQENvb2tpZVBhcmFtKCJhcmcxIikgU3RyaW5nIGFyZzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQENvb2tpZVBhcmFtKCJhcmcyIikgU3RyaW5nIGFyZzIsIEBDb29raWVQYXJhbSgiYXJnMyIpIFN0cmluZyBhcmczKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgYXJnMSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgYXJnMik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgYXJnMyk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VTdHJpbmdEZWZhdWx0IHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoCisgICAgICAgICAgICAgICAgQENvb2tpZVBhcmFtKCJhcmcxIikgQERlZmF1bHRWYWx1ZSgiYSIpIFN0cmluZyBhcmcxLAorICAgICAgICAgICAgICAgIEBDb29raWVQYXJhbSgiYXJnMiIpIEBEZWZhdWx0VmFsdWUoImIiKSBTdHJpbmcgYXJnMiwKKyAgICAgICAgICAgICAgICBAQ29va2llUGFyYW0oImFyZzMiKSBARGVmYXVsdFZhbHVlKCJjIikgU3RyaW5nIGFyZzMpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiYSIsIGFyZzEpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJiIiwgYXJnMik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImMiLCBhcmczKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVN0cmluZ0RlZmF1bHRPdmVycmlkZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KAorICAgICAgICAgICAgICAgIEBDb29raWVQYXJhbSgiYXJnMSIpIEBEZWZhdWx0VmFsdWUoImEiKSBTdHJpbmcgYXJnMSwKKyAgICAgICAgICAgICAgICBAQ29va2llUGFyYW0oImFyZzIiKSBARGVmYXVsdFZhbHVlKCJiIikgU3RyaW5nIGFyZzIsCisgICAgICAgICAgICAgICAgQENvb2tpZVBhcmFtKCJhcmczIikgQERlZmF1bHRWYWx1ZSgiYyIpIFN0cmluZyBhcmczKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImQiLCBhcmcxKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZSIsIGFyZzIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJmIiwgYXJnMyk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VTdHJpbmdMaXN0RW1wdHlEZWZhdWx0IHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vc3RyaW5nbGlzdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgQENvb2tpZVBhcmFtKCJhcmdzIikgTGlzdDxTdHJpbmc+IGFyZ3MpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBhcmdzLnNpemUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2xpc3QiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KAorICAgICAgICAgICAgICAgIEBDb29raWVQYXJhbSgiYXJncyIpIExpc3QgYXJncykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGFyZ3Muc2l6ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVN0cmluZ0xpc3REZWZhdWx0IHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vc3RyaW5nbGlzdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgQENvb2tpZVBhcmFtKCJhcmdzIikgQERlZmF1bHRWYWx1ZSgiYSIpIExpc3Q8U3RyaW5nPiBhcmdzKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCBhcmdzLmdldCgwKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2xpc3QiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KAorICAgICAgICAgICAgICAgIEBDb29raWVQYXJhbSgiYXJncyIpIEBEZWZhdWx0VmFsdWUoImEiKSBMaXN0IGFyZ3MpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuY2xhc3MsIGFyZ3MuZ2V0KDApLmdldENsYXNzKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgYXJncy5nZXQoMCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlU3RyaW5nTGlzdERlZmF1bHRPdmVycmlkZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3N0cmluZ2xpc3QiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0U3RyaW5nKAorICAgICAgICAgICAgICAgIEBDb29raWVQYXJhbSgiYXJncyIpIEBEZWZhdWx0VmFsdWUoImEiKSBMaXN0PFN0cmluZz4gYXJncykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJiIiwgYXJncy5nZXQoMCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9saXN0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldCgKKyAgICAgICAgICAgICAgICBAQ29va2llUGFyYW0oImFyZ3MiKSBARGVmYXVsdFZhbHVlKCJhIikgTGlzdCBhcmdzKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmNsYXNzLCBhcmdzLmdldCgwKS5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiYiIsIGFyZ3MuZ2V0KDApKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdHZXQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VTdHJpbmcuY2xhc3MpOworCisgICAgICAgIF90ZXN0KCIvIiwgbmV3IENvb2tpZSgiYXJnMSIsICJhIiksIG5ldyBDb29raWUoImFyZzIiLCAiYiIpLCBuZXcgQ29va2llKCJhcmczIiwgImMiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nRW1wdHlHZXQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VTdHJpbmdFbXB0eS5jbGFzcyk7CisKKyAgICAgICAgX3Rlc3QoIi8iLCBuZXcgQ29va2llKCJhcmcxIiwgIiIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdBYnNlbnRHZXQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VTdHJpbmdBYnNlbnQuY2xhc3MpOworCisgICAgICAgIF90ZXN0KCIvIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nUG9zdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2VDb250ZXh0ID0gYXBwbHkoCisgICAgICAgICAgICAgICAgUmVxdWVzdENvbnRleHRCdWlsZGVyCisgICAgICAgICAgICAgICAgICAgICAgICAuZnJvbSgiLyIsICJQT1NUIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5jb29raWUobmV3IENvb2tpZSgiYXJnMSIsICJhIikpCisgICAgICAgICAgICAgICAgICAgICAgICAuY29va2llKG5ldyBDb29raWUoImFyZzIiLCAiYiIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmNvb2tpZShuZXcgQ29va2llKCJhcmczIiwgImMiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5lbnRpdHkoImNvbnRlbnQiKS5idWlsZCgpCisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb250ZW50IiwgcmVzcG9uc2VDb250ZXh0LmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdMaXN0R2V0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlU3RyaW5nTGlzdC5jbGFzcyk7CisKKyAgICAgICAgX3Rlc3QoIi8iLCAiYXBwbGljYXRpb24vc3RyaW5nbGlzdCIsIG5ldyBDb29raWUoImFyZ3MiLCAiYSIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdMaXN0RW1wdHlHZXQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VTdHJpbmdMaXN0RW1wdHkuY2xhc3MpOworCisgICAgICAgIF90ZXN0KCIvIiwgImFwcGxpY2F0aW9uL3N0cmluZ2xpc3QiLCBuZXcgQ29va2llKCJhcmdzIiwgIiIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0R2V0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlU3RyaW5nTGlzdC5jbGFzcyk7CisKKyAgICAgICAgX3Rlc3QoIi8iLCAiYXBwbGljYXRpb24vbGlzdCIsIG5ldyBDb29raWUoImFyZ3MiLCAiYSIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdOdWxsRGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZ051bGxEZWZhdWx0LmNsYXNzKTsKKworICAgICAgICBfdGVzdCgiLyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ0RlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VTdHJpbmdEZWZhdWx0LmNsYXNzKTsKKworICAgICAgICBfdGVzdCgiLyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ0RlZmF1bHRPdmVycmlkZSgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZ0RlZmF1bHRPdmVycmlkZS5jbGFzcyk7CisKKyAgICAgICAgX3Rlc3QoIi8iLCBuZXcgQ29va2llKCJhcmcxIiwgImQiKSwgbmV3IENvb2tpZSgiYXJnMiIsICJlIiksIG5ldyBDb29raWUoImFyZzMiLCAiZiIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdMaXN0RW1wdHlEZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlU3RyaW5nTGlzdEVtcHR5RGVmYXVsdC5jbGFzcyk7CisKKyAgICAgICAgX3Rlc3QoIi8iLCAiYXBwbGljYXRpb24vc3RyaW5nbGlzdCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExpc3RFbXB0eURlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VTdHJpbmdMaXN0RW1wdHlEZWZhdWx0LmNsYXNzKTsKKworICAgICAgICBfdGVzdCgiLyIsICJhcHBsaWNhdGlvbi9saXN0Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nTGlzdERlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VTdHJpbmdMaXN0RGVmYXVsdC5jbGFzcyk7CisKKyAgICAgICAgX3Rlc3QoIi8iLCAiYXBwbGljYXRpb24vc3RyaW5nbGlzdCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExpc3REZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlU3RyaW5nTGlzdERlZmF1bHQuY2xhc3MpOworCisgICAgICAgIF90ZXN0KCIvIiwgImFwcGxpY2F0aW9uL2xpc3QiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0RGVmYXVsdE92ZXJyaWRlKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlU3RyaW5nTGlzdERlZmF1bHRPdmVycmlkZS5jbGFzcyk7CisKKyAgICAgICAgX3Rlc3QoIi8iLCAiYXBwbGljYXRpb24vbGlzdCIsIG5ldyBDb29raWUoImFyZ3MiLCAiYiIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvQ29va2llUGFyYW1TdHJpbmdDb25zdHJ1Y3RvclRlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9Db29raWVQYXJhbVN0cmluZ0NvbnN0cnVjdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MWRmYmMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvQ29va2llUGFyYW1TdHJpbmdDb25zdHJ1Y3RvclRlc3QuamF2YQpAQCAtMCwwICsxLDIyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuaW5qZWN0OworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvb2tpZVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLkRlZmF1bHRWYWx1ZTsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvb2tpZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVxdWVzdENvbnRleHRCdWlsZGVyOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQ29va2llUGFyYW1TdHJpbmdDb25zdHJ1Y3RvclRlc3QgZXh0ZW5kcyBBYnN0cmFjdFRlc3QgeworCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VTdHJpbmcgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldCgKKyAgICAgICAgICAgICAgICBAQ29va2llUGFyYW0oImFyZzEiKSBCaWdEZWNpbWFsIGFyZzEsCisgICAgICAgICAgICAgICAgQENvb2tpZVBhcmFtKCJhcmcyIikgQmlnSW50ZWdlciBhcmcyLAorICAgICAgICAgICAgICAgIEBDb29raWVQYXJhbSgiYXJnMyIpIFVSSSBhcmczKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjMuMTQ1IiwgYXJnMS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMzE0NSIsIGFyZzIudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly90ZXN0IiwgYXJnMy50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVN0cmluZ0xpc3QgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldFN0cmluZyhAQ29va2llUGFyYW0oImFyZ3MiKSBMaXN0PEJpZ0RlY2ltYWw+IGFyZ3MpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMy4xNDUiLCBhcmdzLmdldCgwKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVN0cmluZ0xpc3RFbXB0eSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0U3RyaW5nKEBDb29raWVQYXJhbSgiYXJncyIpIExpc3Q8QmlnRGVjaW1hbD4gYXJncykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFyZ3Muc2l6ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBhcmdzLmdldCgwKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VTdHJpbmdOdWxsRGVmYXVsdCB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KAorICAgICAgICAgICAgICAgIEBDb29raWVQYXJhbSgiYXJnMSIpIEJpZ0RlY2ltYWwgYXJnMSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIGFyZzEpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlU3RyaW5nRGVmYXVsdCB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KAorICAgICAgICAgICAgICAgIEBDb29raWVQYXJhbSgiYXJnMSIpIEBEZWZhdWx0VmFsdWUoIjMuMTQ1IikgQmlnRGVjaW1hbCBhcmcxKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjMuMTQ1IiwgYXJnMS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVN0cmluZ0RlZmF1bHRPdmVycmlkZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KAorICAgICAgICAgICAgICAgIEBDb29raWVQYXJhbSgiYXJnMSIpIEBEZWZhdWx0VmFsdWUoIjMuMTQ1IikgQmlnRGVjaW1hbCBhcmcxKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjIuNzE4IiwgYXJnMS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVN0cmluZ0xpc3RFbXB0eURlZmF1bHQgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldFN0cmluZyhAQ29va2llUGFyYW0oImFyZ3MiKSBMaXN0PEJpZ0RlY2ltYWw+IGFyZ3MpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBhcmdzLnNpemUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VTdHJpbmdMaXN0RGVmYXVsdCB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0U3RyaW5nKAorICAgICAgICAgICAgICAgIEBDb29raWVQYXJhbSgiYXJncyIpIEBEZWZhdWx0VmFsdWUoIjMuMTQ1IikgTGlzdDxCaWdEZWNpbWFsPiBhcmdzKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjMuMTQ1IiwgYXJncy5nZXQoMCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VTdHJpbmdMaXN0RGVmYXVsdE92ZXJyaWRlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgQENvb2tpZVBhcmFtKCJhcmdzIikgQERlZmF1bHRWYWx1ZSgiMy4xNDUiKSBMaXN0PEJpZ0RlY2ltYWw+IGFyZ3MpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMi43MTgiLCBhcmdzLmdldCgwKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdDb25zdHJ1Y3RvckdldCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgX3Rlc3QoIi8iLCBuZXcgQ29va2llKCJhcmcxIiwgIjMuMTQ1IiksIG5ldyBDb29raWUoImFyZzIiLCAiMzE0NSIpLCBuZXcgQ29va2llKCJhcmczIiwgImh0dHA6Ly90ZXN0IikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ0NvbnN0cnVjdG9yTGlzdEdldCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZ0xpc3QuY2xhc3MpOworCisgICAgICAgIF90ZXN0KCIvIiwgImFwcGxpY2F0aW9uL3N0cmluZ2xpc3QiLCBuZXcgQ29va2llKCJhcmdzIiwgIjMuMTQ1IikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ0NvbnN0cnVjdG9yTGlzdEVtcHR5R2V0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlU3RyaW5nTGlzdEVtcHR5LmNsYXNzKTsKKworICAgICAgICBfdGVzdCgiLyIsICJhcHBsaWNhdGlvbi9zdHJpbmdsaXN0IiwgbmV3IENvb2tpZSgiYXJncyIsICIiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nQ29uc3RydWN0b3JOdWxsRGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZ051bGxEZWZhdWx0LmNsYXNzKTsKKworICAgICAgICBfdGVzdCgiLyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ0NvbnN0cnVjdG9yRGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZ0RlZmF1bHQuY2xhc3MpOworCisgICAgICAgIF90ZXN0KCIvIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nQ29uc3RydWN0b3JEZWZhdWx0T3ZlcnJpZGUoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VTdHJpbmdEZWZhdWx0LmNsYXNzKTsKKworICAgICAgICBfdGVzdCgiLyIsIG5ldyBDb29raWUoImFyZ3MiLCAiMi43MTgiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nQ29uc3RydWN0b3JMaXN0RW1wdHlEZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlU3RyaW5nTGlzdEVtcHR5RGVmYXVsdC5jbGFzcyk7CisKKyAgICAgICAgX3Rlc3QoIi8iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdDb25zdHJ1Y3Rvckxpc3REZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlU3RyaW5nTGlzdERlZmF1bHQuY2xhc3MpOworCisgICAgICAgIF90ZXN0KCIvIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nQ29uc3RydWN0b3JMaXN0RGVmYXVsdE92ZXJyaWRlKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlU3RyaW5nTGlzdERlZmF1bHRPdmVycmlkZS5jbGFzcyk7CisKKyAgICAgICAgX3Rlc3QoIi8iLCBuZXcgQ29va2llKCJhcmdzIiwgIjIuNzE4IikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJhZFN0cmluZ0NvbnN0cnVjdG9yVmFsdWUoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlQ29udGV4dCA9IGFwcGx5KAorICAgICAgICAgICAgICAgIFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvIiwgIkdFVCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuY29va2llKG5ldyBDb29raWUoImFyZzEiLCAiQUJDREVGIikpCisgICAgICAgICAgICAgICAgICAgICAgICAuY29va2llKG5ldyBDb29raWUoImFyZzIiLCAiMzE0NSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmNvb2tpZShuZXcgQ29va2llKCJhcmczIiwgImh0dHA6Ly90ZXN0IikpLmJ1aWxkKCkKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCByZXNwb25zZUNvbnRleHQuZ2V0U3RhdHVzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9FbmNvZGVkUGFyYW1zVGVzdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L0VuY29kZWRQYXJhbXNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc3ODc3NwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9FbmNvZGVkUGFyYW1zVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjg4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5pbmplY3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5FbmNvZGVkOworaW1wb3J0IGphdmF4LndzLnJzLkZvcm1QYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuTWF0cml4UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRm9ybTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXF1ZXN0Q29udGV4dEJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5ub3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorCitwdWJsaWMgY2xhc3MgRW5jb2RlZFBhcmFtc1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdFRlc3QgeworCisgICAgQFBhdGgoIi97dX0iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRW5jb2RlZE9uUG9zdENsYXNzIHsKKworICAgICAgICBwdWJsaWMgRW5jb2RlZE9uUG9zdENsYXNzKAorICAgICAgICAgICAgICAgIEBQYXRoUGFyYW0oInUiKSBTdHJpbmcgdSwKKyAgICAgICAgICAgICAgICBAUXVlcnlQYXJhbSgicSIpIFN0cmluZyBxLAorICAgICAgICAgICAgICAgIEBNYXRyaXhQYXJhbSgibSIpIFN0cmluZyBtLAorICAgICAgICAgICAgICAgIEBGb3JtUGFyYW0oImYiKSBTdHJpbmcgZikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIgdSIsIHUpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIgcSIsIHEpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIgbSIsIG0pOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCI6ZiIsIGYpOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQEVuY29kZWQKKyAgICAgICAgcHVibGljIFN0cmluZyBkb1Bvc3QoCisgICAgICAgICAgICAgICAgQFBhdGhQYXJhbSgidSIpIFN0cmluZyB1LAorICAgICAgICAgICAgICAgIEBRdWVyeVBhcmFtKCJxIikgU3RyaW5nIHEsCisgICAgICAgICAgICAgICAgQE1hdHJpeFBhcmFtKCJtIikgU3RyaW5nIG0sCisgICAgICAgICAgICAgICAgQEZvcm1QYXJhbSgiZiIpIFN0cmluZyBmKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIiUyMHUiLCB1KTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiJTIwcSIsIHEpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIlMjBtIiwgbSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIiUzQWYiLCBmKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgiY29tYmluZWQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvUG9zdENvbWJpbmVkKAorICAgICAgICAgICAgICAgIEBFbmNvZGVkIEBGb3JtUGFyYW0oImYiKSBTdHJpbmcgZiwKKyAgICAgICAgICAgICAgICBARm9ybVBhcmFtKCJmMiIpIFN0cmluZyBmMikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIlM0FmIiwgZik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjpmMiIsIGYyKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbmNvZGVkT25Qb3N0Q2xhc3MoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oRW5jb2RlZE9uUG9zdENsYXNzLmNsYXNzKTsKKyAgICAgICAgRm9ybSBmb3JtID0gbmV3IEZvcm0oKTsKKyAgICAgICAgZm9ybS5wYXJhbSgiZiIsICI6ZiIpOworICAgICAgICBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIgcmVxdWVzdEJ1aWxkZXIgPSBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyUyMHU7bT0lMjBtP3E9JTIwcSIsCisgICAgICAgICAgICAgICAgIlBPU1QiKS50eXBlKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9GT1JNX1VSTEVOQ09ERURfVFlQRSkuZW50aXR5KGZvcm0pOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbnRlbnQiLCBhcHBseShyZXF1ZXN0QnVpbGRlci5idWlsZCgpKS5nZXRFbnRpdHkoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tYmluZWRFbmNvZGVkT25Qb3N0Q2xhc3MoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oRW5jb2RlZE9uUG9zdENsYXNzLmNsYXNzKTsKKyAgICAgICAgRm9ybSBmb3JtID0gbmV3IEZvcm0oKTsKKyAgICAgICAgZm9ybS5wYXJhbSgiZiIsICI6ZiIpOworICAgICAgICBmb3JtLnBhcmFtKCJmMiIsICI6ZjIiKTsKKyAgICAgICAgUmVxdWVzdENvbnRleHRCdWlsZGVyIHJlcXVlc3RCdWlsZGVyID0gUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8lMjB1L2NvbWJpbmVkO209JTIwbT9xPSUyMHEiLAorICAgICAgICAgICAgICAgICJQT1NUIikudHlwZShNZWRpYVR5cGUuQVBQTElDQVRJT05fRk9STV9VUkxFTkNPREVEX1RZUEUpLmVudGl0eShmb3JtKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb250ZW50IiwgYXBwbHkocmVxdWVzdEJ1aWxkZXIuYnVpbGQoKSkuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBFbmNvZGVkCisgICAgQFBhdGgoIi97dX0iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRW5jb2RlZE9uQ2xhc3MgeworCisgICAgICAgIHB1YmxpYyBFbmNvZGVkT25DbGFzcygKKyAgICAgICAgICAgICAgICBAUGF0aFBhcmFtKCJ1IikgU3RyaW5nIHUsCisgICAgICAgICAgICAgICAgQFF1ZXJ5UGFyYW0oInEiKSBTdHJpbmcgcSwKKyAgICAgICAgICAgICAgICBATWF0cml4UGFyYW0oIm0iKSBTdHJpbmcgbSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIlMjB1IiwgdSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIiUyMHEiLCBxKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiJTIwbSIsIG0pOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KAorICAgICAgICAgICAgICAgIEBQYXRoUGFyYW0oInUiKSBTdHJpbmcgdSwKKyAgICAgICAgICAgICAgICBAUXVlcnlQYXJhbSgicSIpIFN0cmluZyBxLAorICAgICAgICAgICAgICAgIEBNYXRyaXhQYXJhbSgibSIpIFN0cmluZyBtKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIiUyMHUiLCB1KTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiJTIwcSIsIHEpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIlMjBtIiwgbSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5jb2RlZE9uQ2xhc3MoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oRW5jb2RlZE9uQ2xhc3MuY2xhc3MpOworCisgICAgICAgIF90ZXN0KCIvJTIwdTttPSUyMG0/cT0lMjBxIik7CisgICAgfQorCisKKyAgICBAUGF0aCgiL3t1fSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFbmNvZGVkT25BY2Nlc3NpYmxlT2JqZWN0IHsKKworICAgICAgICBARW5jb2RlZAorICAgICAgICBwdWJsaWMgRW5jb2RlZE9uQWNjZXNzaWJsZU9iamVjdCgKKyAgICAgICAgICAgICAgICBAUGF0aFBhcmFtKCJ1IikgU3RyaW5nIHUsCisgICAgICAgICAgICAgICAgQFF1ZXJ5UGFyYW0oInEiKSBTdHJpbmcgcSwKKyAgICAgICAgICAgICAgICBATWF0cml4UGFyYW0oIm0iKSBTdHJpbmcgbSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIlMjB1IiwgdSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIiUyMHEiLCBxKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiJTIwbSIsIG0pOworICAgICAgICB9CisKKyAgICAgICAgQEVuY29kZWQKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KAorICAgICAgICAgICAgICAgIEBQYXRoUGFyYW0oInUiKSBTdHJpbmcgdSwKKyAgICAgICAgICAgICAgICBAUXVlcnlQYXJhbSgicSIpIFN0cmluZyBxLAorICAgICAgICAgICAgICAgIEBNYXRyaXhQYXJhbSgibSIpIFN0cmluZyBtKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIiUyMHUiLCB1KTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiJTIwcSIsIHEpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIlMjBtIiwgbSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5jb2RlZE9uQWNjZXNzaWJsZU9iamVjdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihFbmNvZGVkT25BY2Nlc3NpYmxlT2JqZWN0LmNsYXNzKTsKKworICAgICAgICBfdGVzdCgiLyUyMHU7bT0lMjBtP3E9JTIwcSIpOworICAgIH0KKworICAgIEBQYXRoKCIve3V9IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEVuY29kZWRPblBhcmFtZXRlcnMgeworCisgICAgICAgIHB1YmxpYyBFbmNvZGVkT25QYXJhbWV0ZXJzKAorICAgICAgICAgICAgICAgIEBFbmNvZGVkIEBQYXRoUGFyYW0oInUiKSBTdHJpbmcgdSwKKyAgICAgICAgICAgICAgICBARW5jb2RlZCBAUXVlcnlQYXJhbSgicSIpIFN0cmluZyBxLAorICAgICAgICAgICAgICAgIEBFbmNvZGVkIEBNYXRyaXhQYXJhbSgibSIpIFN0cmluZyBtKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIiUyMHUiLCB1KTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiJTIwcSIsIHEpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIlMjBtIiwgbSk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoCisgICAgICAgICAgICAgICAgQEVuY29kZWQgQFBhdGhQYXJhbSgidSIpIFN0cmluZyB1LAorICAgICAgICAgICAgICAgIEBFbmNvZGVkIEBRdWVyeVBhcmFtKCJxIikgU3RyaW5nIHEsCisgICAgICAgICAgICAgICAgQEVuY29kZWQgQE1hdHJpeFBhcmFtKCJtIikgU3RyaW5nIG0pIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiJTIwdSIsIHUpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIlMjBxIiwgcSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIiUyMG0iLCBtKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbmNvZGVkT25QYXJhbWV0ZXJzKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKEVuY29kZWRPblBhcmFtZXRlcnMuY2xhc3MpOworCisgICAgICAgIF90ZXN0KCIvJTIwdTttPSUyMG0/cT0lMjBxIik7CisgICAgfQorCisgICAgQFBhdGgoIi97dX0iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWl4ZWRFbmNvZGVkT25QYXJhbWV0ZXJzIHsKKworICAgICAgICBwdWJsaWMgTWl4ZWRFbmNvZGVkT25QYXJhbWV0ZXJzKAorICAgICAgICAgICAgICAgIEBQYXRoUGFyYW0oInUiKSBTdHJpbmcgZHUsCisgICAgICAgICAgICAgICAgQFF1ZXJ5UGFyYW0oInEiKSBTdHJpbmcgZHEsCisgICAgICAgICAgICAgICAgQE1hdHJpeFBhcmFtKCJtIikgU3RyaW5nIGRtLAorICAgICAgICAgICAgICAgIEBFbmNvZGVkIEBQYXRoUGFyYW0oInUiKSBTdHJpbmcgZXUsCisgICAgICAgICAgICAgICAgQEVuY29kZWQgQFF1ZXJ5UGFyYW0oInEiKSBTdHJpbmcgZXEsCisgICAgICAgICAgICAgICAgQEVuY29kZWQgQE1hdHJpeFBhcmFtKCJtIikgU3RyaW5nIGVtKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIiB1IiwgZHUpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIgcSIsIGRxKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiIG0iLCBkbSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIiUyMHUiLCBldSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIiUyMHEiLCBlcSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIiUyMG0iLCBlbSk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoCisgICAgICAgICAgICAgICAgQFBhdGhQYXJhbSgidSIpIFN0cmluZyBkdSwKKyAgICAgICAgICAgICAgICBAUXVlcnlQYXJhbSgicSIpIFN0cmluZyBkcSwKKyAgICAgICAgICAgICAgICBATWF0cml4UGFyYW0oIm0iKSBTdHJpbmcgZG0sCisgICAgICAgICAgICAgICAgQEVuY29kZWQgQFBhdGhQYXJhbSgidSIpIFN0cmluZyBldSwKKyAgICAgICAgICAgICAgICBARW5jb2RlZCBAUXVlcnlQYXJhbSgicSIpIFN0cmluZyBlcSwKKyAgICAgICAgICAgICAgICBARW5jb2RlZCBATWF0cml4UGFyYW0oIm0iKSBTdHJpbmcgZW0pIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiIHUiLCBkdSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIiBxIiwgZHEpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIgbSIsIGRtKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiJTIwdSIsIGV1KTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiJTIwcSIsIGVxKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiJTIwbSIsIGVtKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNaXhlZEVuY29kZWRPblBhcmFtZXRlcnMoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oTWl4ZWRFbmNvZGVkT25QYXJhbWV0ZXJzLmNsYXNzKTsKKworICAgICAgICBfdGVzdCgiLyUyMHU7bT0lMjBtP3E9JTIwcSIpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEVuY29kZWRPbkZvcm1QYXJhbWV0ZXJzIHsKKworICAgICAgICBwdWJsaWMgRW5jb2RlZE9uRm9ybVBhcmFtZXRlcnMoCisgICAgICAgICAgICAgICAgQEVuY29kZWQgQEZvcm1QYXJhbSgidSIpIFN0cmluZyB1ZSwKKyAgICAgICAgICAgICAgICBARm9ybVBhcmFtKCJ1IikgU3RyaW5nIHUpIHsKKworICAgICAgICAgICAgYXNzZXJ0VGhhdCh1ZSwgaXMoIiVDNSVBMSIpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQodWUsIGlzKG5vdCgiXHUwMTYxIikpKTsKKworICAgICAgICAgICAgYXNzZXJ0VGhhdCh1LCBpcyhub3QoIiVDNSVBMSIpKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHUsIGlzKCJcdTAxNjEiKSk7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvUG9zdCgKKyAgICAgICAgICAgICAgICBARW5jb2RlZCBARm9ybVBhcmFtKCJ1IikgU3RyaW5nIHVlLAorICAgICAgICAgICAgICAgIEBGb3JtUGFyYW0oInUiKSBTdHJpbmcgdSkgeworCisgICAgICAgICAgICBhc3NlcnRUaGF0KHVlLCBpcygiJUM1JUExIikpOworICAgICAgICAgICAgYXNzZXJ0VGhhdCh1ZSwgaXMobm90KCJcdTAxNjEiKSkpOworCisgICAgICAgICAgICBhc3NlcnRUaGF0KHUsIGlzKG5vdCgiJUM1JUExIikpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQodSwgaXMoIlx1MDE2MSIpKTsKKworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVuY29kZWRPbkZvcm1QYXJhbWV0ZXJzKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKEVuY29kZWRPbkZvcm1QYXJhbWV0ZXJzLmNsYXNzKTsKKworICAgICAgICBmaW5hbCBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIgcmVxdWVzdEJ1aWxkZXIgPSBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJQT1NUIikKKyAgICAgICAgICAgICAgICAudHlwZShNZWRpYVR5cGUuQVBQTElDQVRJT05fRk9STV9VUkxFTkNPREVEKQorICAgICAgICAgICAgICAgIC5lbnRpdHkobmV3IEZvcm0oInUiLCAiXHUwMTYxIikpOworCisgICAgICAgIGFwcGx5KHJlcXVlc3RCdWlsZGVyLmJ1aWxkKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9Gb3JtUGFyYW1UZXN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvRm9ybVBhcmFtVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1OGU2NjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvRm9ybVBhcmFtVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTgzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5pbmplY3Q7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5EZWZhdWx0VmFsdWU7CitpbXBvcnQgamF2YXgud3MucnMuRm9ybVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZvcm07CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXF1ZXN0Q29udGV4dEJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKKworLyoqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgRm9ybVBhcmFtVGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdCB7CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTaW1wbGVGb3JtUmVzb3VyY2UgeworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3QoCisgICAgICAgICAgICAgICAgQEZvcm1QYXJhbSgiYSIpIGZpbmFsIFN0cmluZyBhCisgICAgICAgICkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCBhKTsKKyAgICAgICAgICAgIHJldHVybiBhOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlRm9ybVJlc291cmNlKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFNpbXBsZUZvcm1SZXNvdXJjZS5jbGFzcyk7CisKKyAgICAgICAgZmluYWwgRm9ybSBmb3JtID0gbmV3IEZvcm0oKTsKKyAgICAgICAgZm9ybS5wYXJhbSgiYSIsICJmb28iKTsKKworICAgICAgICBmaW5hbCBDb250YWluZXJSZXNwb25zZSByZXNwb25zZUNvbnRleHQgPSBhcHBseSgKKyAgICAgICAgICAgICAgICBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJQT1NUIikudHlwZShNZWRpYVR5cGUuQVBQTElDQVRJT05fRk9STV9VUkxFTkNPREVEKS5lbnRpdHkoZm9ybSkuYnVpbGQoKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwgcmVzcG9uc2VDb250ZXh0LmdldEVudGl0eSgpKTsKKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZUZvcm1SZXNvdXJjZVdpdGhDaGFyc2V0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFNpbXBsZUZvcm1SZXNvdXJjZS5jbGFzcyk7CisKKyAgICAgICAgZmluYWwgRm9ybSBmb3JtID0gbmV3IEZvcm0oKTsKKyAgICAgICAgZm9ybS5wYXJhbSgiYSIsICJmb28iKTsKKworICAgICAgICBmaW5hbCBDb250YWluZXJSZXNwb25zZSByZXNwb25zZUNvbnRleHQgPSBhcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJQT1NUIikKKyAgICAgICAgICAgICAgICAudHlwZShNZWRpYVR5cGUuQVBQTElDQVRJT05fRk9STV9VUkxFTkNPREVEX1RZUEUud2l0aENoYXJzZXQoIlVURi04IikpCisgICAgICAgICAgICAgICAgLmVudGl0eShmb3JtKQorICAgICAgICAgICAgICAgIC5idWlsZCgpCisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNwb25zZUNvbnRleHQuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZvcm1SZXNvdXJjZU5vQ29uc3VtZXMgeworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3QoCisgICAgICAgICAgICAgICAgQEZvcm1QYXJhbSgiYSIpIGZpbmFsIFN0cmluZyBhLAorICAgICAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBmb3JtKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYSwgZm9ybS5nZXRGaXJzdCgiYSIpKTsKKyAgICAgICAgICAgIHJldHVybiBhOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9ybVJlc291cmNlTm9Db25zdW1lcygpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihGb3JtUmVzb3VyY2VOb0NvbnN1bWVzLmNsYXNzKTsKKworICAgICAgICBmaW5hbCBGb3JtIGZvcm0gPSBuZXcgRm9ybSgpOworICAgICAgICBmb3JtLnBhcmFtKCJhIiwgImZvbyIpOworCisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlQ29udGV4dCA9IGFwcGx5KAorICAgICAgICAgICAgICAgIFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvIiwgIlBPU1QiKS50eXBlKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9GT1JNX1VSTEVOQ09ERUQpLmVudGl0eShmb3JtKS5idWlsZCgpCisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNwb25zZUNvbnRleHQuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZvcm1SZXNvdXJjZUZvcm1FbnRpdHlQYXJhbSB7CisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdCgKKyAgICAgICAgICAgICAgICBARm9ybVBhcmFtKCJhIikgZmluYWwgU3RyaW5nIGEsCisgICAgICAgICAgICAgICAgZmluYWwgRm9ybSBmb3JtKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYSwgZm9ybS5hc01hcCgpLmdldEZpcnN0KCJhIikpOworICAgICAgICAgICAgcmV0dXJuIGE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JtUmVzb3VyY2VGb3JtRW50aXR5UGFyYW0oKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oRm9ybVJlc291cmNlRm9ybUVudGl0eVBhcmFtLmNsYXNzKTsKKworICAgICAgICBmaW5hbCBGb3JtIGZvcm0gPSBuZXcgRm9ybSgpOworICAgICAgICBmb3JtLnBhcmFtKCJhIiwgImZvbyIpOworCisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlQ29udGV4dCA9IGFwcGx5KAorICAgICAgICAgICAgICAgIFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvIiwgIlBPU1QiKS50eXBlKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9GT1JNX1VSTEVOQ09ERUQpLmVudGl0eShmb3JtKS5idWlsZCgpCisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNwb25zZUNvbnRleHQuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBYbWxSb290RWxlbWVudChuYW1lID0gImpheGJCZWFuIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpBWEJCZWFuIHsKKworICAgICAgICBwdWJsaWMgU3RyaW5nIHZhbHVlOworCisgICAgICAgIHB1YmxpYyBKQVhCQmVhbigpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIHJldHVybiBvIGluc3RhbmNlb2YgSkFYQkJlYW4gJiYgKChKQVhCQmVhbikgbykudmFsdWUuZXF1YWxzKHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJKQVhCQ2xhc3M6ICIgKyB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZvcm1SZXNvdXJjZVggeworICAgICAgICBAUE9TVAorICAgICAgICBAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0ZPUk1fVVJMRU5DT0RFRCkKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0KAorICAgICAgICAgICAgICAgIEBGb3JtUGFyYW0oImEiKSBmaW5hbCBTdHJpbmcgYSwKKyAgICAgICAgICAgICAgICBARm9ybVBhcmFtKCJiIikgZmluYWwgU3RyaW5nIGIsCisgICAgICAgICAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGZvcm0sCisgICAgICAgICAgICAgICAgQENvbnRleHQgZmluYWwgVXJpSW5mbyB1aSwKKyAgICAgICAgICAgICAgICBAUXVlcnlQYXJhbSgiYSIpIGZpbmFsIFN0cmluZyBxYSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGEsIGZvcm0uZ2V0Rmlyc3QoImEiKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYiwgZm9ybS5nZXRGaXJzdCgiYiIpKTsKKyAgICAgICAgICAgIHJldHVybiBhICsgYjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZvcm1SZXNvdXJjZVkgeworICAgICAgICBAUE9TVAorICAgICAgICBAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0ZPUk1fVVJMRU5DT0RFRCkKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0KAorICAgICAgICAgICAgICAgIEBGb3JtUGFyYW0oImEiKSBmaW5hbCBTdHJpbmcgYSwKKyAgICAgICAgICAgICAgICBARm9ybVBhcmFtKCJiIikgZmluYWwgU3RyaW5nIGIsCisgICAgICAgICAgICAgICAgZmluYWwgRm9ybSBmb3JtLAorICAgICAgICAgICAgICAgIEBDb250ZXh0IGZpbmFsIFVyaUluZm8gdWksCisgICAgICAgICAgICAgICAgQFF1ZXJ5UGFyYW0oImEiKSBmaW5hbCBTdHJpbmcgcWEpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhhLCBmb3JtLmFzTWFwKCkuZ2V0Rmlyc3QoImEiKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYiwgZm9ybS5hc01hcCgpLmdldEZpcnN0KCJiIikpOworICAgICAgICAgICAgcmV0dXJuIGEgKyBiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9ybVBhcmFtWCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihGb3JtUmVzb3VyY2VYLmNsYXNzKTsKKworICAgICAgICBmaW5hbCBGb3JtIGZvcm0gPSBuZXcgRm9ybSgpOworICAgICAgICBmb3JtLnBhcmFtKCJhIiwgImZvbyIpOworICAgICAgICBmb3JtLnBhcmFtKCJiIiwgImJhciIpOworCisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlQ29udGV4dCA9IGFwcGx5KAorICAgICAgICAgICAgICAgIFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvIiwgIlBPU1QiKS50eXBlKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9GT1JNX1VSTEVOQ09ERUQpLmVudGl0eShmb3JtKS5idWlsZCgpCisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb29iYXIiLCByZXNwb25zZUNvbnRleHQuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZvcm1QYXJhbVkoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oRm9ybVJlc291cmNlWS5jbGFzcyk7CisKKyAgICAgICAgZmluYWwgRm9ybSBmb3JtID0gbmV3IEZvcm0oKTsKKyAgICAgICAgZm9ybS5wYXJhbSgiYSIsICJmb28iKTsKKyAgICAgICAgZm9ybS5wYXJhbSgiYiIsICJiYXIiKTsKKworICAgICAgICBmaW5hbCBDb250YWluZXJSZXNwb25zZSByZXNwb25zZUNvbnRleHQgPSBhcHBseSgKKyAgICAgICAgICAgICAgICBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJQT1NUIikudHlwZShNZWRpYVR5cGUuQVBQTElDQVRJT05fRk9STV9VUkxFTkNPREVEKS5lbnRpdHkoZm9ybSkuYnVpbGQoKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscygiZm9vYmFyIiwgcmVzcG9uc2VDb250ZXh0LmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGb3JtUGFyYW1UeXBlcyB7CisgICAgICAgIEBQT1NUCisgICAgICAgIEBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fRk9STV9VUkxFTkNPREVEKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZVN1YnNjcmlwdGlvbigKKyAgICAgICAgICAgICAgICBARm9ybVBhcmFtKCJpbnQiKSBmaW5hbCBpbnQgaSwKKyAgICAgICAgICAgICAgICBARm9ybVBhcmFtKCJmbG9hdCIpIGZpbmFsIGZsb2F0IGYsCisgICAgICAgICAgICAgICAgQEZvcm1QYXJhbSgiZGVjaW1hbCIpIGZpbmFsIEJpZ0RlY2ltYWwgZAorICAgICAgICApIHsKKyAgICAgICAgICAgIHJldHVybiAiIiArIGkgKyAiICIgKyBmICsgIiAiICsgZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZvcm1QYXJhbVR5cGVzKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKEZvcm1QYXJhbVR5cGVzLmNsYXNzKTsKKworICAgICAgICBmaW5hbCBGb3JtIGZvcm0gPSBuZXcgRm9ybSgpOworICAgICAgICBmb3JtLnBhcmFtKCJpbnQiLCAiMSIpOworICAgICAgICBmb3JtLnBhcmFtKCJmbG9hdCIsICIzLjE0Iik7CisgICAgICAgIGZvcm0ucGFyYW0oImRlY2ltYWwiLCAiMy4xNCIpOworCisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlQ29udGV4dCA9IGFwcGx5KAorICAgICAgICAgICAgICAgIFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvIiwgIlBPU1QiKS50eXBlKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9GT1JNX1VSTEVOQ09ERUQpLmVudGl0eShmb3JtKS5idWlsZCgpCisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIDMuMTQgMy4xNCIsIHJlc3BvbnNlQ29udGV4dC5nZXRFbnRpdHkoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSkVSU0VZLTI2MzcgcmVwcm9kdWNlciBvdXRzaWRlIG9mIGNvbnRhaW5lciAocHVyZSBzZXJ2ZXIpLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZvcm1QYXJhbUFzUXVlcnlQYXJhbXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihGb3JtUGFyYW1UeXBlcy5jbGFzcyk7CisKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2VDb250ZXh0ID0gYXBwbHkoCisgICAgICAgICAgICAgICAgUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8/aW50PTImZmxvYXQ9Mi43MSZkZWNpbWFsPTIuNzEiLCAiUE9TVCIpCisgICAgICAgICAgICAgICAgICAgICAgICAudHlwZShNZWRpYVR5cGUuQVBQTElDQVRJT05fRk9STV9VUkxFTkNPREVEKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIjAgMC4wIG51bGwiLCByZXNwb25zZUNvbnRleHQuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZvcm1EZWZhdWx0VmFsdWVQYXJhbVR5cGVzIHsKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9GT1JNX1VSTEVOQ09ERUQpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlU3Vic2NyaXB0aW9uKAorICAgICAgICAgICAgICAgIEBEZWZhdWx0VmFsdWUoIjEiKSBARm9ybVBhcmFtKCJpbnQiKSBmaW5hbCBpbnQgaSwKKyAgICAgICAgICAgICAgICBARGVmYXVsdFZhbHVlKCIzLjE0IikgQEZvcm1QYXJhbSgiZmxvYXQiKSBmaW5hbCBmbG9hdCBmLAorICAgICAgICAgICAgICAgIEBEZWZhdWx0VmFsdWUoIjMuMTQiKSBARm9ybVBhcmFtKCJkZWNpbWFsIikgZmluYWwgQmlnRGVjaW1hbCBkCisgICAgICAgICkgeworICAgICAgICAgICAgcmV0dXJuICIiICsgaSArICIgIiArIGYgKyAiICIgKyBkOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9ybURlZmF1bHRWYWx1ZVBhcmFtVHlwZXMoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oRm9ybURlZmF1bHRWYWx1ZVBhcmFtVHlwZXMuY2xhc3MpOworCisgICAgICAgIGZpbmFsIEZvcm0gZm9ybSA9IG5ldyBGb3JtKCk7CisKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2VDb250ZXh0ID0gYXBwbHkoCisgICAgICAgICAgICAgICAgUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8iLCAiUE9TVCIpLnR5cGUoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0ZPUk1fVVJMRU5DT0RFRCkuZW50aXR5KGZvcm0pLmJ1aWxkKCkKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIjEgMy4xNCAzLjE0IiwgcmVzcG9uc2VDb250ZXh0LmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRyaW1tZWRTdHJpbmcgeworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBzdHJpbmc7CisKKyAgICAgICAgcHVibGljIFRyaW1tZWRTdHJpbmcoZmluYWwgU3RyaW5nIHN0cmluZykgeworICAgICAgICAgICAgdGhpcy5zdHJpbmcgPSBzdHJpbmcudHJpbSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gc3RyaW5nOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRm9ybUNvbnN0cnVjdG9yVmFsdWVQYXJhbVR5cGVzIHsKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9GT1JNX1VSTEVOQ09ERUQpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlU3Vic2NyaXB0aW9uKAorICAgICAgICAgICAgICAgIEBEZWZhdWx0VmFsdWUoIiIpIEBGb3JtUGFyYW0oInRyaW0iKSBmaW5hbCBUcmltbWVkU3RyaW5nIHMpIHsKKyAgICAgICAgICAgIHJldHVybiBzLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JtQ29uc3RydWN0b3JWYWx1ZVBhcmFtVHlwZXMoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oRm9ybUNvbnN0cnVjdG9yVmFsdWVQYXJhbVR5cGVzLmNsYXNzKTsKKworICAgICAgICBmaW5hbCBGb3JtIGZvcm0gPSBuZXcgRm9ybSgpOworCisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlQ29udGV4dCA9IGFwcGx5KAorICAgICAgICAgICAgICAgIFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvIiwgIlBPU1QiKS50eXBlKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9GT1JNX1VSTEVOQ09ERUQpLmVudGl0eShmb3JtKS5idWlsZCgpCisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCByZXNwb25zZUNvbnRleHQuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZvcm1SZXNvdXJjZUpBWEIgeworICAgICAgICBAUE9TVAorICAgICAgICBAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0ZPUk1fVVJMRU5DT0RFRCkKKyAgICAgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUwpCisgICAgICAgIHB1YmxpYyBKQVhCQmVhbiBwb3N0KAorICAgICAgICAgICAgICAgIEBGb3JtUGFyYW0oImEiKSBmaW5hbCBKQVhCQmVhbiBhLAorICAgICAgICAgICAgICAgIEBGb3JtUGFyYW0oImIiKSBmaW5hbCBMaXN0PEpBWEJCZWFuPiBiKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCBhLnZhbHVlKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBiLnNpemUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImIxIiwgYi5nZXQoMCkudmFsdWUpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJiMiIsIGIuZ2V0KDEpLnZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiBhOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9ybVBhcmFtSkFYQigpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihGb3JtUmVzb3VyY2VKQVhCLmNsYXNzKTsKKworICAgICAgICBmaW5hbCBGb3JtIGZvcm0gPSBuZXcgRm9ybSgpOworICAgICAgICBmb3JtLnBhcmFtKCJhIiwgIjxqYXhiQmVhbj48dmFsdWU+YTwvdmFsdWU+PC9qYXhiQmVhbj4iKTsKKyAgICAgICAgZm9ybS5wYXJhbSgiYiIsICI8amF4YkJlYW4+PHZhbHVlPmIxPC92YWx1ZT48L2pheGJCZWFuPiIpOworICAgICAgICBmb3JtLnBhcmFtKCJiIiwgIjxqYXhiQmVhbj48dmFsdWU+YjI8L3ZhbHVlPjwvamF4YkJlYW4+Iik7CisKKworICAgICAgICBmaW5hbCBDb250YWluZXJSZXNwb25zZSByZXNwb25zZUNvbnRleHQgPSBhcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJQT1NUIikKKyAgICAgICAgICAgICAgICAuYWNjZXB0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUwpCisgICAgICAgICAgICAgICAgLnR5cGUoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0ZPUk1fVVJMRU5DT0RFRCkKKyAgICAgICAgICAgICAgICAuZW50aXR5KGZvcm0pCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkKKyAgICAgICAgKTsKKworICAgICAgICBmaW5hbCBKQVhCQmVhbiBiID0gKEpBWEJCZWFuKSByZXNwb25zZUNvbnRleHQuZ2V0RW50aXR5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYSIsIGIudmFsdWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZvcm1QYXJhbUpBWEJFcnJvcigpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihGb3JtUmVzb3VyY2VKQVhCLmNsYXNzKTsKKworICAgICAgICBmaW5hbCBGb3JtIGZvcm0gPSBuZXcgRm9ybSgpOworICAgICAgICBmb3JtLnBhcmFtKCJhIiwgIjx4Pjx2YWx1ZT5hPC92YWx1ZT48L2pheGJCZWFuPiIpOworICAgICAgICBmb3JtLnBhcmFtKCJiIiwgIjx4Pjx2YWx1ZT5iMTwvdmFsdWU+PC9qYXhiQmVhbj4iKTsKKyAgICAgICAgZm9ybS5wYXJhbSgiYiIsICI8eD48dmFsdWU+YjI8L3ZhbHVlPjwvamF4YkJlYW4+Iik7CisKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2VDb250ZXh0ID0gYXBwbHkoCisgICAgICAgICAgICAgICAgUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8iLCAiUE9TVCIpLnR5cGUoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0ZPUk1fVVJMRU5DT0RFRCkuZW50aXR5KGZvcm0pLmJ1aWxkKCkKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCByZXNwb25zZUNvbnRleHQuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZvcm1SZXNvdXJjZURhdGUgeworICAgICAgICBAUE9TVAorICAgICAgICBAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0ZPUk1fVVJMRU5DT0RFRCkKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0KAorICAgICAgICAgICAgICAgIEBGb3JtUGFyYW0oImEiKSBmaW5hbCBEYXRlIGEsCisgICAgICAgICAgICAgICAgQEZvcm1QYXJhbSgiYiIpIGZpbmFsIERhdGUgYiwKKyAgICAgICAgICAgICAgICBARm9ybVBhcmFtKCJjIikgZmluYWwgRGF0ZSBjKSB7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGEpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChiKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYyk7CisgICAgICAgICAgICByZXR1cm4gIlBPU1QiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9ybVBhcmFtRGF0ZSgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihGb3JtUmVzb3VyY2VEYXRlLmNsYXNzKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgZGF0ZV9SRkMxMTIzID0gIlN1biwgMDYgTm92IDE5OTQgMDg6NDk6MzcgR01UIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIGRhdGVfUkZDMTAzNiA9ICJTdW5kYXksIDA2LU5vdi05NCAwODo0OTozNyBHTVQiOworICAgICAgICBmaW5hbCBTdHJpbmcgZGF0ZV9BTlNJX0MgPSAiU3VuIE5vdiAgNiAwODo0OTozNyAxOTk0IjsKKworICAgICAgICBmaW5hbCBGb3JtIGZvcm0gPSBuZXcgRm9ybSgpOworICAgICAgICBmb3JtLnBhcmFtKCJhIiwgZGF0ZV9SRkMxMTIzKTsKKyAgICAgICAgZm9ybS5wYXJhbSgiYiIsIGRhdGVfUkZDMTAzNik7CisgICAgICAgIGZvcm0ucGFyYW0oImMiLCBkYXRlX0FOU0lfQyk7CisKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2VDb250ZXh0ID0gYXBwbHkoCisgICAgICAgICAgICAgICAgUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8iLCAiUE9TVCIpLnR5cGUoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0ZPUk1fVVJMRU5DT0RFRCkuZW50aXR5KGZvcm0pLmJ1aWxkKCkKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIlBPU1QiLCByZXNwb25zZUNvbnRleHQuZ2V0RW50aXR5KCkpOworICAgIH0KKworLy8gICAgQEluamVjdFBhcmFtIHJlcGxhY2Ugd2l0aCBASW5qZWN0PworCisvLyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhcmFtQmVhbiB7CisvLyAgICAgICAgQEZvcm1QYXJhbSgiYSIpIFN0cmluZyBhOworLy8KKy8vICAgICAgICBARm9ybVBhcmFtKCJiIikgU3RyaW5nIGI7CisvLworLy8gICAgICAgIEBDb250ZXh0CisvLyAgICAgICAgVXJpSW5mbyB1aTsKKy8vCisvLyAgICAgICAgQFF1ZXJ5UGFyYW0oImEiKSBTdHJpbmcgcWE7CisvLyAgICB9CisvLworLy8gICAgQFBhdGgoIi8iKQorLy8gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGb3JtUmVzb3VyY2VCZWFuIHsKKy8vICAgICAgICBAUE9TVAorLy8gICAgICAgIEBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fRk9STV9VUkxFTkNPREVEKQorLy8gICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdCgKKy8vICAgICAgICAgICAgICAgIEBJbmplY3RQYXJhbSBQYXJhbUJlYW4gcGIsCisvLyAgICAgICAgICAgICAgICBARm9ybVBhcmFtKCJhIikgU3RyaW5nIGEsCisvLyAgICAgICAgICAgICAgICBARm9ybVBhcmFtKCJiIikgU3RyaW5nIGIsCisvLyAgICAgICAgICAgICAgICBGb3JtIGZvcm0pIHsKKy8vICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHBiLmEsIGZvcm0uZ2V0Rmlyc3QoImEiKSk7CisvLyAgICAgICAgICAgIGFzc2VydEVxdWFscyhwYi5iLCBmb3JtLmdldEZpcnN0KCJiIikpOworLy8gICAgICAgICAgICByZXR1cm4gcGIuYSArIHBiLmI7CisvLyAgICAgICAgfQorLy8gICAgfQorLy8KKy8vICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JtUGFyYW1CZWFuKCkgeworLy8gICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oRm9ybVJlc291cmNlQmVhbi5jbGFzcyk7CisvLworLy8gICAgICAgIFdlYlJlc291cmNlIHIgPSByZXNvdXJjZSgiLyIpOworLy8KKy8vICAgICAgICBGb3JtIGZvcm0gPSBuZXcgRm9ybSgpOworLy8gICAgICAgIGZvcm0uYWRkKCJhIiwgImZvbyIpOworLy8gICAgICAgIGZvcm0uYWRkKCJiIiwgImJhciIpOworLy8KKy8vICAgICAgICBTdHJpbmcgcyA9IHIucG9zdChTdHJpbmcuY2xhc3MsIGZvcm0pOworLy8gICAgICAgIGFzc2VydEVxdWFscygiZm9vYmFyIiwgcyk7CisvLyAgICB9CisvLworLy8gICAgQFBhdGgoIi8iKQorLy8gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGb3JtUmVzb3VyY2VCZWFuTm9Gb3JtUGFyYW0geworLy8gICAgICAgIEBQT1NUCisvLyAgICAgICAgQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9GT1JNX1VSTEVOQ09ERUQpCisvLyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0KEBJbmplY3RQYXJhbSBQYXJhbUJlYW4gcGIpIHsKKy8vICAgICAgICAgICAgcmV0dXJuIHBiLmEgKyBwYi5iOworLy8gICAgICAgIH0KKy8vICAgIH0KKy8vCisvLyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9ybVBhcmFtQmVhbk5vRm9ybVBhcmFtKCkgeworLy8gICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oRm9ybVJlc291cmNlQmVhbk5vRm9ybVBhcmFtLmNsYXNzKTsKKy8vCisvLyAgICAgICAgV2ViUmVzb3VyY2UgciA9IHJlc291cmNlKCIvIik7CisvLworLy8gICAgICAgIEZvcm0gZm9ybSA9IG5ldyBGb3JtKCk7CisvLyAgICAgICAgZm9ybS5hZGQoImEiLCAiZm9vIik7CisvLyAgICAgICAgZm9ybS5hZGQoImIiLCAiYmFyIik7CisvLworLy8gICAgICAgIFN0cmluZyBzID0gci5wb3N0KFN0cmluZy5jbGFzcywgZm9ybSk7CisvLyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb29iYXIiLCBzKTsKKy8vICAgIH0KKy8vCisvLyAgICBAUGF0aCgiLyIpCisvLyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZvcm1SZXNvdXJjZUJlYW5Db25zdHJ1Y3RvciB7CisvLyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYXJhbUJlYW4gcGI7CisvLworLy8gICAgICAgIHB1YmxpYyBGb3JtUmVzb3VyY2VCZWFuQ29uc3RydWN0b3IoQEluamVjdFBhcmFtIFBhcmFtQmVhbiBwYikgeworLy8gICAgICAgICAgICB0aGlzLnBiID0gcGI7CisvLyAgICAgICAgfQorLy8KKy8vICAgICAgICBAR0VUCisvLyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisvLyAgICAgICAgICAgIHJldHVybiAiR0VUIjsKKy8vICAgICAgICB9CisvLworLy8gICAgICAgIEBQT1NUCisvLyAgICAgICAgQENvbnN1bWVzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorLy8gICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdFRleHQoU3RyaW5nIHMpIHsKKy8vICAgICAgICAgICAgcmV0dXJuIHM7CisvLyAgICAgICAgfQorLy8KKy8vICAgICAgICBAUE9TVAorLy8gICAgICAgIEBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fRk9STV9VUkxFTkNPREVEKQorLy8gICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdChTdHJpbmcgcykgeworLy8gICAgICAgICAgICBhc3NlcnRUcnVlKHMuY29udGFpbnMoImE9Zm9vIikpOworLy8gICAgICAgICAgICBhc3NlcnRUcnVlKHMuY29udGFpbnMoImI9YmFyIikpOworLy8KKy8vICAgICAgICAgICAgcmV0dXJuIHBiLmEgKyBwYi5iOworLy8gICAgICAgIH0KKy8vICAgIH0KKy8vCisvLyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9ybVBhcmFtQmVhbkNvbnN0cnVjdG9yKCkgeworLy8gICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oRm9ybVJlc291cmNlQmVhbkNvbnN0cnVjdG9yLmNsYXNzKTsKKy8vCisvLyAgICAgICAgV2ViUmVzb3VyY2UgciA9IHJlc291cmNlKCIvIik7CisvLworLy8gICAgICAgIEZvcm0gZm9ybSA9IG5ldyBGb3JtKCk7CisvLyAgICAgICAgZm9ybS5hZGQoImEiLCAiZm9vIik7CisvLyAgICAgICAgZm9ybS5hZGQoImIiLCAiYmFyIik7CisvLworLy8gICAgICAgIFN0cmluZyBzID0gci5wb3N0KFN0cmluZy5jbGFzcywgZm9ybSk7CisvLyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb29iYXIiLCBzKTsKKy8vICAgIH0KKy8vCisvLyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9ybVBhcmFtQmVhbkNvbnN0cnVjdG9ySWxsZWdhbFN0YXRlKCkgeworLy8gICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oRm9ybVJlc291cmNlQmVhbkNvbnN0cnVjdG9yLmNsYXNzKTsKKy8vCisvLyAgICAgICAgV2ViUmVzb3VyY2UgciA9IHJlc291cmNlKCIvIik7CisvLworLy8gICAgICAgIGJvb2xlYW4gY2F1Z2h0ID0gZmFsc2U7CisvLyAgICAgICAgdHJ5IHsKKy8vICAgICAgICAgICAgQ2xpZW50UmVzcG9uc2UgY3IgPSByLmdldChDbGllbnRSZXNwb25zZS5jbGFzcyk7CisvLyAgICAgICAgfSBjYXRjaCAoQ29udGFpbmVyRXhjZXB0aW9uIGV4KSB7CisvLyAgICAgICAgICAgIGFzc2VydEVxdWFscyhJbGxlZ2FsU3RhdGVFeGNlcHRpb24uY2xhc3MsIGV4LmdldENhdXNlKCkuZ2V0Q2F1c2UoKS5nZXRDbGFzcygpKTsKKy8vICAgICAgICAgICAgY2F1Z2h0ID0gdHJ1ZTsKKy8vICAgICAgICB9CisvLyAgICAgICAgYXNzZXJ0VHJ1ZShjYXVnaHQpOworLy8KKy8vCisvLyAgICAgICAgY2F1Z2h0ID0gZmFsc2U7CisvLyAgICAgICAgdHJ5IHsKKy8vICAgICAgICAgICAgQ2xpZW50UmVzcG9uc2UgY3IgPSByLnBvc3QoQ2xpZW50UmVzcG9uc2UuY2xhc3MsICJ0ZXh0Iik7CisvLyAgICAgICAgfSBjYXRjaCAoQ29udGFpbmVyRXhjZXB0aW9uIGV4KSB7CisvLyAgICAgICAgICAgIGFzc2VydEVxdWFscyhJbGxlZ2FsU3RhdGVFeGNlcHRpb24uY2xhc3MsIGV4LmdldENhdXNlKCkuZ2V0Q2F1c2UoKS5nZXRDbGFzcygpKTsKKy8vICAgICAgICAgICAgY2F1Z2h0ID0gdHJ1ZTsKKy8vICAgICAgICB9CisvLyAgICAgICAgYXNzZXJ0VHJ1ZShjYXVnaHQpOworLy8gICAgfQorLy8KKy8vCisvLyAgICBAUGF0aCgiLyIpCisvLyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZvcm1SZXNvdXJjZUJlYW5Db25zdHJ1Y3RvckZvcm1QYXJhbSB7CisvLyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYXJhbUJlYW4gcGI7CisvLworLy8gICAgICAgIHB1YmxpYyBGb3JtUmVzb3VyY2VCZWFuQ29uc3RydWN0b3JGb3JtUGFyYW0oQEluamVjdFBhcmFtIFBhcmFtQmVhbiBwYikgeworLy8gICAgICAgICAgICB0aGlzLnBiID0gcGI7CisvLyAgICAgICAgfQorLy8KKy8vICAgICAgICBAUE9TVAorLy8gICAgICAgIEBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fRk9STV9VUkxFTkNPREVEKQorLy8gICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdCgKKy8vICAgICAgICAgICAgICAgIEBGb3JtUGFyYW0oImEiKSBTdHJpbmcgYSwKKy8vICAgICAgICAgICAgICAgIEBGb3JtUGFyYW0oImIiKSBTdHJpbmcgYiwKKy8vICAgICAgICAgICAgICAgIEZvcm0gZm9ybSkgeworLy8gICAgICAgICAgICBhc3NlcnRFcXVhbHMoYSwgZm9ybS5nZXRGaXJzdCgiYSIpKTsKKy8vICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGIsIGZvcm0uZ2V0Rmlyc3QoImIiKSk7CisvLyAgICAgICAgICAgIHJldHVybiBhICsgYjsKKy8vICAgICAgICB9CisvLyAgICB9CisvLworLy8gICAgcHVibGljIHZvaWQgdGVzdEZvcm1QYXJhbUJlYW5Db25zdHJ1Y3RvckZvcm1QYXJhbSgpIHsKKy8vICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKEZvcm1SZXNvdXJjZUJlYW5Db25zdHJ1Y3RvckZvcm1QYXJhbS5jbGFzcyk7CisvLworLy8gICAgICAgIFdlYlJlc291cmNlIHIgPSByZXNvdXJjZSgiLyIpOworLy8KKy8vICAgICAgICBGb3JtIGZvcm0gPSBuZXcgRm9ybSgpOworLy8gICAgICAgIGZvcm0uYWRkKCJhIiwgImZvbyIpOworLy8gICAgICAgIGZvcm0uYWRkKCJiIiwgImJhciIpOworLy8KKy8vICAgICAgICBTdHJpbmcgcyA9IHIucG9zdChTdHJpbmcuY2xhc3MsIGZvcm0pOworLy8gICAgICAgIGFzc2VydEVxdWFscygiZm9vYmFyIiwgcyk7CisvLyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvSGVhZGVyUGFyYW1Bc1ByaW1pdGl2ZVRlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9IZWFkZXJQYXJhbUFzUHJpbWl0aXZlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZjAwYTIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvSGVhZGVyUGFyYW1Bc1ByaW1pdGl2ZVRlc3QuamF2YQpAQCAtMCwwICsxLDEwMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLmluamVjdDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkRlZmF1bHRWYWx1ZTsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuSGVhZGVyUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVxdWVzdENvbnRleHRCdWlsZGVyOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSGVhZGVyUGFyYW1Bc1ByaW1pdGl2ZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFRlc3QgeworCisgICAgcHVibGljIEhlYWRlclBhcmFtQXNQcmltaXRpdmVUZXN0KCkgeworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKAorICAgICAgICAgICAgICAgIFJlc291cmNlSGVhZGVyUHJpbWl0aXZlcy5jbGFzcywKKyAgICAgICAgICAgICAgICBSZXNvdXJjZUhlYWRlclByaW1pdGl2ZXNEZWZhdWx0TnVsbC5jbGFzcywKKyAgICAgICAgICAgICAgICBSZXNvdXJjZUhlYWRlclByaW1pdGl2ZXNEZWZhdWx0LmNsYXNzLAorICAgICAgICAgICAgICAgIFJlc291cmNlSGVhZGVyUHJpbWl0aXZlc0RlZmF1bHRPdmVycmlkZS5jbGFzcywKKyAgICAgICAgICAgICAgICBSZXNvdXJjZUhlYWRlclByaW1pdGl2ZVdyYXBwZXJzLmNsYXNzLAorICAgICAgICAgICAgICAgIFJlc291cmNlSGVhZGVyUHJpbWl0aXZlV3JhcHBlcnNEZWZhdWx0TnVsbC5jbGFzcywKKyAgICAgICAgICAgICAgICBSZXNvdXJjZUhlYWRlclByaW1pdGl2ZVdyYXBwZXJzRGVmYXVsdC5jbGFzcywKKyAgICAgICAgICAgICAgICBSZXNvdXJjZUhlYWRlclByaW1pdGl2ZVdyYXBwZXJzRGVmYXVsdE92ZXJyaWRlLmNsYXNzLAorICAgICAgICAgICAgICAgIFJlc291cmNlSGVhZGVyUHJpbWl0aXZlTGlzdC5jbGFzcywKKyAgICAgICAgICAgICAgICBSZXNvdXJjZUhlYWRlclByaW1pdGl2ZUxpc3REZWZhdWx0RW1wdHkuY2xhc3MsCisgICAgICAgICAgICAgICAgUmVzb3VyY2VIZWFkZXJQcmltaXRpdmVMaXN0RGVmYXVsdC5jbGFzcywKKyAgICAgICAgICAgICAgICBSZXNvdXJjZUhlYWRlclByaW1pdGl2ZUxpc3REZWZhdWx0T3ZlcnJpZGUuY2xhc3MKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZUhlYWRlclByaW1pdGl2ZXMgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9ib29sZWFuIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChASGVhZGVyUGFyYW0oImJvb2xlYW4iKSBib29sZWFuIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYnl0ZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQEhlYWRlclBhcmFtKCJieXRlIikgYnl0ZSB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMTI3LCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vY2hhciIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQEhlYWRlclBhcmFtKCJjaGFyIikgY2hhciB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoJ2MnLCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vc2hvcnQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBIZWFkZXJQYXJhbSgic2hvcnQiKSBzaG9ydCB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMzI3NjcsIHYpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9pbnQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBIZWFkZXJQYXJhbSgiaW50IikgaW50IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyMTQ3NDgzNjQ3LCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vbG9uZyIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQEhlYWRlclBhcmFtKCJsb25nIikgbG9uZyB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoOTIyMzM3MjAzNjg1NDc3NTgwN0wsIHYpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mbG9hdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQEhlYWRlclBhcmFtKCJmbG9hdCIpIGZsb2F0IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzLjE0MTU5MjY1ZiwgdiwgMCk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2RvdWJsZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQEhlYWRlclBhcmFtKCJkb3VibGUiKSBkb3VibGUgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMuMTQxNTkyNjUzNTg5NzlkLCB2LCAwKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL2RlZmF1bHQvbnVsbCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZUhlYWRlclByaW1pdGl2ZXNEZWZhdWx0TnVsbCB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Jvb2xlYW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBIZWFkZXJQYXJhbSgiYm9vbGVhbiIpIGJvb2xlYW4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYnl0ZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQEhlYWRlclBhcmFtKCJieXRlIikgYnl0ZSB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2NoYXIiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBIZWFkZXJQYXJhbSgiY2hhciIpIGNoYXIgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDB4MDAsIHYpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9zaG9ydCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQEhlYWRlclBhcmFtKCJzaG9ydCIpIHNob3J0IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vaW50IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChASGVhZGVyUGFyYW0oImludCIpIGludCB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2xvbmciKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBIZWFkZXJQYXJhbSgibG9uZyIpIGxvbmcgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDBMLCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZmxvYXQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBIZWFkZXJQYXJhbSgiZmxvYXQiKSBmbG9hdCB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMC4wZiwgdiwgMCk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2RvdWJsZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQEhlYWRlclBhcmFtKCJkb3VibGUiKSBkb3VibGUgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAuMGQsIHYsIDApOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvZGVmYXVsdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZUhlYWRlclByaW1pdGl2ZXNEZWZhdWx0IHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYm9vbGVhbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQEhlYWRlclBhcmFtKCJib29sZWFuIikgQERlZmF1bHRWYWx1ZSgidHJ1ZSIpIGJvb2xlYW4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHYpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9ieXRlIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChASGVhZGVyUGFyYW0oImJ5dGUiKSBARGVmYXVsdFZhbHVlKCIxMjciKSBieXRlIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxMjcsIHYpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9jaGFyIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChASGVhZGVyUGFyYW0oImNoYXIiKSBARGVmYXVsdFZhbHVlKCJjIikgY2hhciB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoJ2MnLCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vc2hvcnQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBIZWFkZXJQYXJhbSgic2hvcnQiKSBARGVmYXVsdFZhbHVlKCIzMjc2NyIpIHNob3J0IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzMjc2Nywgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2ludCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQEhlYWRlclBhcmFtKCJpbnQiKSBARGVmYXVsdFZhbHVlKCIyMTQ3NDgzNjQ3IikgaW50IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyMTQ3NDgzNjQ3LCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vbG9uZyIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQEhlYWRlclBhcmFtKCJsb25nIikgQERlZmF1bHRWYWx1ZSgiOTIyMzM3MjAzNjg1NDc3NTgwNyIpIGxvbmcgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDkyMjMzNzIwMzY4NTQ3NzU4MDdMLCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZmxvYXQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBIZWFkZXJQYXJhbSgiZmxvYXQiKSBARGVmYXVsdFZhbHVlKCIzLjE0MTU5MjY1IikgZmxvYXQgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMuMTQxNTkyNjVmLCB2LCAwKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZG91YmxlIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChASGVhZGVyUGFyYW0oImRvdWJsZSIpIEBEZWZhdWx0VmFsdWUoIjMuMTQxNTkyNjUzNTg5NzkiKSBkb3VibGUgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMuMTQxNTkyNjUzNTg5NzlkLCB2LCAwKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL2RlZmF1bHQvb3ZlcnJpZGUiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VIZWFkZXJQcmltaXRpdmVzRGVmYXVsdE92ZXJyaWRlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYm9vbGVhbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQEhlYWRlclBhcmFtKCJib29sZWFuIikgQERlZmF1bHRWYWx1ZSgiZmFsc2UiKSBib29sZWFuIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYnl0ZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQEhlYWRlclBhcmFtKCJieXRlIikgQERlZmF1bHRWYWx1ZSgiMSIpIGJ5dGUgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEyNywgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2NoYXIiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBIZWFkZXJQYXJhbSgiY2hhciIpIEBEZWZhdWx0VmFsdWUoIjEiKSBjaGFyIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygnYycsIHYpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9zaG9ydCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQEhlYWRlclBhcmFtKCJzaG9ydCIpIEBEZWZhdWx0VmFsdWUoIjEiKSBzaG9ydCB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMzI3NjcsIHYpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9pbnQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBIZWFkZXJQYXJhbSgiaW50IikgQERlZmF1bHRWYWx1ZSgiMSIpIGludCB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMjE0NzQ4MzY0Nywgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2xvbmciKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBIZWFkZXJQYXJhbSgibG9uZyIpIEBEZWZhdWx0VmFsdWUoIjEiKSBsb25nIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg5MjIzMzcyMDM2ODU0Nzc1ODA3TCwgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Zsb2F0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChASGVhZGVyUGFyYW0oImZsb2F0IikgQERlZmF1bHRWYWx1ZSgiMC4wIikgZmxvYXQgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMuMTQxNTkyNjVmLCB2LCAwKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZG91YmxlIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChASGVhZGVyUGFyYW0oImRvdWJsZSIpIEBEZWZhdWx0VmFsdWUoIjAuMCIpIGRvdWJsZSB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMy4xNDE1OTI2NTM1ODk3OWQsIHYsIDApOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvd3JhcHBlcnMiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VIZWFkZXJQcmltaXRpdmVXcmFwcGVycyB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Jvb2xlYW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBIZWFkZXJQYXJhbSgiYm9vbGVhbiIpIEJvb2xlYW4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHYpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9ieXRlIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChASGVhZGVyUGFyYW0oImJ5dGUiKSBCeXRlIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxMjcsIHYuYnl0ZVZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9jaGFyIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChASGVhZGVyUGFyYW0oImNoYXIiKSBDaGFyYWN0ZXIgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCdjJywgdi5jaGFyVmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3Nob3J0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChASGVhZGVyUGFyYW0oInNob3J0IikgU2hvcnQgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMyNzY3LCB2LnNob3J0VmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2ludCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQEhlYWRlclBhcmFtKCJpbnQiKSBJbnRlZ2VyIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyMTQ3NDgzNjQ3LCB2LmludFZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9sb25nIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChASGVhZGVyUGFyYW0oImxvbmciKSBMb25nIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg5MjIzMzcyMDM2ODU0Nzc1ODA3TCwgdi5sb25nVmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Zsb2F0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChASGVhZGVyUGFyYW0oImZsb2F0IikgRmxvYXQgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMuMTQxNTkyNjVmLCB2LCAwKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZG91YmxlIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChASGVhZGVyUGFyYW0oImRvdWJsZSIpIERvdWJsZSB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMy4xNDE1OTI2NTM1ODk3OWQsIHYsIDApOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvd3JhcHBlcnMvZGVmYXVsdC9udWxsIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlSGVhZGVyUHJpbWl0aXZlV3JhcHBlcnNEZWZhdWx0TnVsbCB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Jvb2xlYW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBIZWFkZXJQYXJhbSgiYm9vbGVhbiIpIEJvb2xlYW4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIHYpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9ieXRlIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChASGVhZGVyUGFyYW0oImJ5dGUiKSBCeXRlIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vY2hhciIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQEhlYWRlclBhcmFtKCJjaGFyIikgQ2hhcmFjdGVyIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vc2hvcnQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBIZWFkZXJQYXJhbSgic2hvcnQiKSBTaG9ydCB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2ludCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQEhlYWRlclBhcmFtKCJpbnQiKSBJbnRlZ2VyIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vbG9uZyIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQEhlYWRlclBhcmFtKCJsb25nIikgTG9uZyB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Zsb2F0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChASGVhZGVyUGFyYW0oImZsb2F0IikgRmxvYXQgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIHYpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9kb3VibGUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBIZWFkZXJQYXJhbSgiZG91YmxlIikgRG91YmxlIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL3dyYXBwZXJzL2RlZmF1bHQiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VIZWFkZXJQcmltaXRpdmVXcmFwcGVyc0RlZmF1bHQgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9ib29sZWFuIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChASGVhZGVyUGFyYW0oImJvb2xlYW4iKSBARGVmYXVsdFZhbHVlKCJ0cnVlIikgQm9vbGVhbiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2J5dGUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBIZWFkZXJQYXJhbSgiYnl0ZSIpIEBEZWZhdWx0VmFsdWUoIjEyNyIpIEJ5dGUgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEyNywgdi5ieXRlVmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2NoYXIiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBIZWFkZXJQYXJhbSgiY2hhciIpIEBEZWZhdWx0VmFsdWUoImQiKSBDaGFyYWN0ZXIgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCdkJywgdi5jaGFyVmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3Nob3J0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChASGVhZGVyUGFyYW0oInNob3J0IikgQERlZmF1bHRWYWx1ZSgiMzI3NjciKSBTaG9ydCB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMzI3NjcsIHYuc2hvcnRWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vaW50IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChASGVhZGVyUGFyYW0oImludCIpIEBEZWZhdWx0VmFsdWUoIjIxNDc0ODM2NDciKSBJbnRlZ2VyIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyMTQ3NDgzNjQ3LCB2LmludFZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9sb25nIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChASGVhZGVyUGFyYW0oImxvbmciKSBARGVmYXVsdFZhbHVlKCI5MjIzMzcyMDM2ODU0Nzc1ODA3IikgTG9uZyB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoOTIyMzM3MjAzNjg1NDc3NTgwN0wsIHYubG9uZ1ZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mbG9hdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQEhlYWRlclBhcmFtKCJmbG9hdCIpIEBEZWZhdWx0VmFsdWUoIjMuMTQxNTkyNjUiKSBGbG9hdCB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMy4xNDE1OTI2NWYsIHYsIDApOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9kb3VibGUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBIZWFkZXJQYXJhbSgiZG91YmxlIikgQERlZmF1bHRWYWx1ZSgiMy4xNDE1OTI2NTM1ODk3OSIpIERvdWJsZSB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMy4xNDE1OTI2NTM1ODk3OWQsIHYsIDApOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvd3JhcHBlcnMvZGVmYXVsdC9vdmVycmlkZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZUhlYWRlclByaW1pdGl2ZVdyYXBwZXJzRGVmYXVsdE92ZXJyaWRlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYm9vbGVhbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQEhlYWRlclBhcmFtKCJib29sZWFuIikgQERlZmF1bHRWYWx1ZSgiZmFsc2UiKSBCb29sZWFuIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYnl0ZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQEhlYWRlclBhcmFtKCJieXRlIikgQERlZmF1bHRWYWx1ZSgiMSIpIEJ5dGUgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEyNywgdi5ieXRlVmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2NoYXIiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBIZWFkZXJQYXJhbSgiY2hhciIpIEBEZWZhdWx0VmFsdWUoImQiKSBDaGFyYWN0ZXIgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCdjJywgdi5jaGFyVmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3Nob3J0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChASGVhZGVyUGFyYW0oInNob3J0IikgQERlZmF1bHRWYWx1ZSgiMSIpIFNob3J0IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzMjc2Nywgdi5zaG9ydFZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9pbnQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBIZWFkZXJQYXJhbSgiaW50IikgQERlZmF1bHRWYWx1ZSgiMSIpIEludGVnZXIgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIxNDc0ODM2NDcsIHYuaW50VmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2xvbmciKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBIZWFkZXJQYXJhbSgibG9uZyIpIEBEZWZhdWx0VmFsdWUoIjEiKSBMb25nIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg5MjIzMzcyMDM2ODU0Nzc1ODA3TCwgdi5sb25nVmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Zsb2F0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChASGVhZGVyUGFyYW0oImZsb2F0IikgQERlZmF1bHRWYWx1ZSgiMC4wIikgRmxvYXQgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMuMTQxNTkyNjVmLCB2LCAwKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZG91YmxlIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChASGVhZGVyUGFyYW0oImRvdWJsZSIpIEBEZWZhdWx0VmFsdWUoIjAuMCIpIERvdWJsZSB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMy4xNDE1OTI2NTM1ODk3OWQsIHYsIDApOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvbGlzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZUhlYWRlclByaW1pdGl2ZUxpc3QgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9ib29sZWFuIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldEJvb2xlYW4oQEhlYWRlclBhcmFtKCJib29sZWFuIikgTGlzdDxCb29sZWFuPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgdi5nZXQoMCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHYuZ2V0KDEpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCB2LmdldCgyKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2J5dGUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0Qnl0ZShASGVhZGVyUGFyYW0oImJ5dGUiKSBMaXN0PEJ5dGU+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxMjcsIHYuZ2V0KDApLmJ5dGVWYWx1ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxMjcsIHYuZ2V0KDEpLmJ5dGVWYWx1ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxMjcsIHYuZ2V0KDIpLmJ5dGVWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vY2hhciIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRDaGFyYWN0ZXIoQEhlYWRlclBhcmFtKCJjaGFyIikgTGlzdDxDaGFyYWN0ZXI+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygnYycsIHYuZ2V0KDApLmNoYXJWYWx1ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygnYycsIHYuZ2V0KDEpLmNoYXJWYWx1ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygnYycsIHYuZ2V0KDIpLmNoYXJWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vc2hvcnQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0U2hvcnQoQEhlYWRlclBhcmFtKCJzaG9ydCIpIExpc3Q8U2hvcnQ+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzMjc2Nywgdi5nZXQoMCkuc2hvcnRWYWx1ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzMjc2Nywgdi5nZXQoMSkuc2hvcnRWYWx1ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzMjc2Nywgdi5nZXQoMikuc2hvcnRWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vaW50IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldEludGVnZXIoQEhlYWRlclBhcmFtKCJpbnQiKSBMaXN0PEludGVnZXI+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyMTQ3NDgzNjQ3LCB2LmdldCgwKS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyMTQ3NDgzNjQ3LCB2LmdldCgxKS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyMTQ3NDgzNjQ3LCB2LmdldCgyKS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vbG9uZyIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRMb25nKEBIZWFkZXJQYXJhbSgibG9uZyIpIExpc3Q8TG9uZz4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDkyMjMzNzIwMzY4NTQ3NzU4MDdMLCB2LmdldCgwKS5sb25nVmFsdWUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoOTIyMzM3MjAzNjg1NDc3NTgwN0wsIHYuZ2V0KDEpLmxvbmdWYWx1ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg5MjIzMzcyMDM2ODU0Nzc1ODA3TCwgdi5nZXQoMikubG9uZ1ZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mbG9hdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRGbG9hdChASGVhZGVyUGFyYW0oImZsb2F0IikgTGlzdDxGbG9hdD4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMuMTQxNTkyNjVmLCB2LmdldCgwKSwgMCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMy4xNDE1OTI2NWYsIHYuZ2V0KDEpLCAwKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzLjE0MTU5MjY1Ziwgdi5nZXQoMiksIDApOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9kb3VibGUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0RG91YmxlKEBIZWFkZXJQYXJhbSgiZG91YmxlIikgTGlzdDxEb3VibGU+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzLjE0MTU5MjY1MzU4OTc5ZCwgdi5nZXQoMCksIDApOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMuMTQxNTkyNjUzNTg5NzlkLCB2LmdldCgxKSwgMCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMy4xNDE1OTI2NTM1ODk3OWQsIHYuZ2V0KDIpLCAwKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL2xpc3QvZGVmYXVsdC9udWxsIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlSGVhZGVyUHJpbWl0aXZlTGlzdERlZmF1bHRFbXB0eSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Jvb2xlYW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0Qm9vbGVhbihASGVhZGVyUGFyYW0oImJvb2xlYW4iKSBMaXN0PEJvb2xlYW4+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCB2LnNpemUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2J5dGUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0Qnl0ZShASGVhZGVyUGFyYW0oImJ5dGUiKSBMaXN0PEJ5dGU+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCB2LnNpemUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2NoYXIiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0Q2hhcmFyY3RlcihASGVhZGVyUGFyYW0oImNoYXIiKSBMaXN0PENoYXJhY3Rlcj4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHYuc2l6ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vc2hvcnQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0U2hvcnQoQEhlYWRlclBhcmFtKCJzaG9ydCIpIExpc3Q8U2hvcnQ+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCB2LnNpemUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2ludCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRJbnRlZ2VyKEBIZWFkZXJQYXJhbSgiaW50IikgTGlzdDxJbnRlZ2VyPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdi5zaXplKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9sb25nIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldExvbmcoQEhlYWRlclBhcmFtKCJsb25nIikgTGlzdDxMb25nPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdi5zaXplKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mbG9hdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRGbG9hdChASGVhZGVyUGFyYW0oImZsb2F0IikgTGlzdDxGbG9hdD4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHYuc2l6ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZG91YmxlIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldERvdWJsZShASGVhZGVyUGFyYW0oImRvdWJsZSIpIExpc3Q8RG91YmxlPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdi5zaXplKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvbGlzdC9kZWZhdWx0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlSGVhZGVyUHJpbWl0aXZlTGlzdERlZmF1bHQgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9ib29sZWFuIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldEJvb2xlYW4oQEhlYWRlclBhcmFtKCJib29sZWFuIikgQERlZmF1bHRWYWx1ZSgidHJ1ZSIpIExpc3Q8Qm9vbGVhbj4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHYuZ2V0KDApKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYnl0ZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRCeXRlKEBIZWFkZXJQYXJhbSgiYnl0ZSIpIEBEZWZhdWx0VmFsdWUoIjEyNyIpIExpc3Q8Qnl0ZT4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEyNywgdi5nZXQoMCkuYnl0ZVZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9jaGFyIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldENoYXJhY3RlcihASGVhZGVyUGFyYW0oImNoYXIiKSBARGVmYXVsdFZhbHVlKCJkIikgTGlzdDxDaGFyYWN0ZXI+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygnZCcsIHYuZ2V0KDApLmNoYXJWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vc2hvcnQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0U2hvcnQoQEhlYWRlclBhcmFtKCJzaG9ydCIpIEBEZWZhdWx0VmFsdWUoIjMyNzY3IikgTGlzdDxTaG9ydD4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMyNzY3LCB2LmdldCgwKS5zaG9ydFZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9pbnQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0SW50ZWdlcihASGVhZGVyUGFyYW0oImludCIpIEBEZWZhdWx0VmFsdWUoIjIxNDc0ODM2NDciKSBMaXN0PEludGVnZXI+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyMTQ3NDgzNjQ3LCB2LmdldCgwKS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vbG9uZyIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRMb25nKEBIZWFkZXJQYXJhbSgibG9uZyIpIEBEZWZhdWx0VmFsdWUoIjkyMjMzNzIwMzY4NTQ3NzU4MDciKSBMaXN0PExvbmc+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg5MjIzMzcyMDM2ODU0Nzc1ODA3TCwgdi5nZXQoMCkubG9uZ1ZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mbG9hdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRGbG9hdChASGVhZGVyUGFyYW0oImZsb2F0IikgQERlZmF1bHRWYWx1ZSgiMy4xNDE1OTI2NSIpIExpc3Q8RmxvYXQ+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzLjE0MTU5MjY1Ziwgdi5nZXQoMCksIDApOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9kb3VibGUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0RG91YmxlKEBIZWFkZXJQYXJhbSgiZG91YmxlIikgQERlZmF1bHRWYWx1ZSgiMy4xNDE1OTI2NTM1ODk3OSIpIExpc3Q8RG91YmxlPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMy4xNDE1OTI2NTM1ODk3OWQsIHYuZ2V0KDApLCAwKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL2xpc3QvZGVmYXVsdC9vdmVycmlkZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZUhlYWRlclByaW1pdGl2ZUxpc3REZWZhdWx0T3ZlcnJpZGUgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9ib29sZWFuIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldEJvb2xlYW4oQEhlYWRlclBhcmFtKCJib29sZWFuIikgQERlZmF1bHRWYWx1ZSgiZmFsc2UiKSBMaXN0PEJvb2xlYW4+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCB2LmdldCgwKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2J5dGUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0Qnl0ZShASGVhZGVyUGFyYW0oImJ5dGUiKSBARGVmYXVsdFZhbHVlKCIwIikgTGlzdDxCeXRlPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMTI3LCB2LmdldCgwKS5ieXRlVmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2NoYXIiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0Q2hhcmFjdGVyKEBIZWFkZXJQYXJhbSgiY2hhciIpIEBEZWZhdWx0VmFsdWUoImQiKSBMaXN0PENoYXJhY3Rlcj4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCdjJywgdi5nZXQoMCkuY2hhclZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9zaG9ydCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRTaG9ydChASGVhZGVyUGFyYW0oInNob3J0IikgQERlZmF1bHRWYWx1ZSgiMCIpIExpc3Q8U2hvcnQ+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzMjc2Nywgdi5nZXQoMCkuc2hvcnRWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vaW50IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldEludGVnZXIoQEhlYWRlclBhcmFtKCJpbnQiKSBARGVmYXVsdFZhbHVlKCIwIikgTGlzdDxJbnRlZ2VyPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMjE0NzQ4MzY0Nywgdi5nZXQoMCkuaW50VmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2xvbmciKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0TG9uZyhASGVhZGVyUGFyYW0oImxvbmciKSBARGVmYXVsdFZhbHVlKCIwIikgTGlzdDxMb25nPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoOTIyMzM3MjAzNjg1NDc3NTgwN0wsIHYuZ2V0KDApLmxvbmdWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZmxvYXQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0RmxvYXQoQEhlYWRlclBhcmFtKCJmbG9hdCIpIEBEZWZhdWx0VmFsdWUoIjAuMCIpIExpc3Q8RmxvYXQ+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzLjE0MTU5MjY1Ziwgdi5nZXQoMCksIDApOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9kb3VibGUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0RG91YmxlKEBIZWFkZXJQYXJhbSgiZG91YmxlIikgQERlZmF1bHRWYWx1ZSgiMC4wIikgTGlzdDxEb3VibGU+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzLjE0MTU5MjY1MzU4OTc5ZCwgdi5nZXQoMCksIDApOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgX3Rlc3QoU3RyaW5nIHR5cGUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbnRlbnQiLCBhcHBseSgKKyAgICAgICAgICAgICAgICBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJHRVQiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFjY2VwdCgiYXBwbGljYXRpb24vIiArIHR5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICAuaGVhZGVyKHR5cGUsIHZhbHVlKS5idWlsZCgpCisgICAgICAgICkuZ2V0RW50aXR5KCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygiY29udGVudCIsIGFwcGx5KAorICAgICAgICAgICAgICAgIFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvd3JhcHBlcnMiLCAiR0VUIikuYWNjZXB0KCJhcHBsaWNhdGlvbi8iICsgdHlwZSkuaGVhZGVyKHR5cGUsIHZhbHVlKS5idWlsZCgpCisgICAgICAgICkuZ2V0RW50aXR5KCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygiY29udGVudCIsIGFwcGx5KAorICAgICAgICAgICAgICAgIFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvbGlzdCIsICJHRVQiKS5hY2NlcHQoImFwcGxpY2F0aW9uLyIgKyB0eXBlKS5oZWFkZXIodHlwZSwgdmFsdWUpLmhlYWRlcih0eXBlLCB2YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5oZWFkZXIodHlwZSwgdmFsdWUpLmJ1aWxkKCkKKyAgICAgICAgKS5nZXRFbnRpdHkoKSk7CisgICAgfQorCisgICAgdm9pZCBfdGVzdERlZmF1bHQoU3RyaW5nIGJhc2UsIFN0cmluZyB0eXBlLCBTdHJpbmcgdmFsdWUpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb250ZW50IiwgYXBwbHkoCisgICAgICAgICAgICAgICAgUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oYmFzZSArICJkZWZhdWx0L251bGwiLCAiR0VUIikuYWNjZXB0KCJhcHBsaWNhdGlvbi8iICsgdHlwZSkuYnVpbGQoKQorICAgICAgICApLmdldEVudGl0eSgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbnRlbnQiLCBhcHBseSgKKyAgICAgICAgICAgICAgICBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbShiYXNlICsgImRlZmF1bHQiLCAiR0VUIikuYWNjZXB0KCJhcHBsaWNhdGlvbi8iICsgdHlwZSkuYnVpbGQoKQorICAgICAgICApLmdldEVudGl0eSgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbnRlbnQiLCBhcHBseSgKKyAgICAgICAgICAgICAgICBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbShiYXNlICsgImRlZmF1bHQvb3ZlcnJpZGUiLCAiR0VUIikuYWNjZXB0KCJhcHBsaWNhdGlvbi8iICsgdHlwZSkuaGVhZGVyKHR5cGUsIHZhbHVlKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkKKyAgICAgICAgKS5nZXRFbnRpdHkoKSk7CisgICAgfQorCisgICAgdm9pZCBfdGVzdERlZmF1bHQoU3RyaW5nIHR5cGUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdERlZmF1bHQoIi8iLCB0eXBlLCB2YWx1ZSk7CisgICAgfQorCisgICAgdm9pZCBfdGVzdFdyYXBwZXJzRGVmYXVsdChTdHJpbmcgdHlwZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0RGVmYXVsdCgiL3dyYXBwZXJzLyIsIHR5cGUsIHZhbHVlKTsKKyAgICB9CisKKyAgICB2b2lkIF90ZXN0TGlzdERlZmF1bHQoU3RyaW5nIHR5cGUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdERlZmF1bHQoIi9saXN0LyIsIHR5cGUsIHZhbHVlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRCb29sZWFuKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdCgiYm9vbGVhbiIsICJ0cnVlIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Qm9vbGVhblByaW1pdGl2ZXNEZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdERlZmF1bHQoImJvb2xlYW4iLCAidHJ1ZSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEJvb2xlYW5QcmltaXRpdmVXcmFwcGVyRGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RXcmFwcGVyc0RlZmF1bHQoImJvb2xlYW4iLCAidHJ1ZSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEJvb2xlYW5QcmltaXRpdmVMaXN0RGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RMaXN0RGVmYXVsdCgiYm9vbGVhbiIsICJ0cnVlIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Qnl0ZSgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoImJ5dGUiLCAiMTI3Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Qnl0ZVByaW1pdGl2ZXNEZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdERlZmF1bHQoImJ5dGUiLCAiMTI3Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Qnl0ZVByaW1pdGl2ZVdyYXBwZXJzRGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RXcmFwcGVyc0RlZmF1bHQoImJ5dGUiLCAiMTI3Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Qnl0ZVByaW1pdGl2ZUxpc3REZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdExpc3REZWZhdWx0KCJieXRlIiwgIjEyNyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldENoYXJhY3RlcigpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoImNoYXIiLCAiYyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldENoYXJhY3RlclByaW1pdGl2ZXNEZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdERlZmF1bHQoImNoYXIiLCAiYyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldENoYXJhY3RlclByaW1pdGl2ZVdyYXBwZXJzRGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RXcmFwcGVyc0RlZmF1bHQoImNoYXIiLCAiYyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldENoYXJhY3RlclByaW1pdGl2ZUxpc3REZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdExpc3REZWZhdWx0KCJjaGFyIiwgImMiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTaG9ydCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoInNob3J0IiwgIjMyNzY3Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2hvcnRQcmltdGl2ZXNEZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdERlZmF1bHQoInNob3J0IiwgIjMyNzY3Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2hvcnRQcmltdGl2ZVdyYXBwZXJzRGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RXcmFwcGVyc0RlZmF1bHQoInNob3J0IiwgIjMyNzY3Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2hvcnRQcmltdGl2ZUxpc3REZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdExpc3REZWZhdWx0KCJzaG9ydCIsICIzMjc2NyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEludCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoImludCIsICIyMTQ3NDgzNjQ3Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW50UHJpbWl0aXZlc0RlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0RGVmYXVsdCgiaW50IiwgIjIxNDc0ODM2NDciKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJbnRQcmltaXRpdmVXcmFwcGVyc0RlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0V3JhcHBlcnNEZWZhdWx0KCJpbnQiLCAiMjE0NzQ4MzY0NyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEludFByaW1pdGl2ZUxpc3REZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdExpc3REZWZhdWx0KCJpbnQiLCAiMjE0NzQ4MzY0NyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldExvbmcoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJsb25nIiwgIjkyMjMzNzIwMzY4NTQ3NzU4MDciKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRMb25nUHJpbWl0aXZlc0RlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0RGVmYXVsdCgibG9uZyIsICI5MjIzMzcyMDM2ODU0Nzc1ODA3Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TG9uZ1ByaW1pdGl2ZVdyYXBwZXJzRGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RXcmFwcGVyc0RlZmF1bHQoImxvbmciLCAiOTIyMzM3MjAzNjg1NDc3NTgwNyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldExvbmdQcmltaXRpdmVMaXN0RGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RMaXN0RGVmYXVsdCgibG9uZyIsICI5MjIzMzcyMDM2ODU0Nzc1ODA3Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RmxvYXQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJmbG9hdCIsICIzLjE0MTU5MjY1Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RmxvYXRQcmltaXRpdmVzRGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3REZWZhdWx0KCJmbG9hdCIsICIzLjE0MTU5MjY1Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RmxvYXRQcmltaXRpdmVXcmFwcGVyc0RlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0V3JhcHBlcnNEZWZhdWx0KCJmbG9hdCIsICIzLjE0MTU5MjY1Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RmxvYXRQcmltaXRpdmVMaXN0RGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RMaXN0RGVmYXVsdCgiZmxvYXQiLCAiMy4xNDE1OTI2NSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldERvdWJsZSgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoImRvdWJsZSIsICIzLjE0MTU5MjY1MzU4OTc5Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RG91YmxlUHJpbWl0aXZlc0RlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0RGVmYXVsdCgiZG91YmxlIiwgIjMuMTQxNTkyNjUzNTg5NzkiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXREb3VibGVQcmltaXRpdmVXcmFwcGVyc0RlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0V3JhcHBlcnNEZWZhdWx0KCJkb3VibGUiLCAiMy4xNDE1OTI2NTM1ODk3OSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldERvdWJsZVByaW1pdGl2ZUxpc3REZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdExpc3REZWZhdWx0KCJkb3VibGUiLCAiMy4xNDE1OTI2NTM1ODk3OSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJhZFByaW1pdGl2ZVZhbHVlKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBDb250YWluZXJSZXNwb25zZSByZXNwb25zZUNvbnRleHQgPSBhcHBseSgKKyAgICAgICAgICAgICAgICBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJHRVQiKS5hY2NlcHQoImFwcGxpY2F0aW9uL2ludCIpLmhlYWRlcigiaW50IiwgImFiY2RlZiIpLmJ1aWxkKCkKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCByZXNwb25zZUNvbnRleHQuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJhZFByaW1pdGl2ZVdyYXBwZXJWYWx1ZSgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2VDb250ZXh0ID0gYXBwbHkoCisgICAgICAgICAgICAgICAgUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi93cmFwcGVycyIsICJHRVQiKS5hY2NlcHQoImFwcGxpY2F0aW9uL2ludCIpLmhlYWRlcigiaW50IiwgImFiY2RlZiIpLmJ1aWxkKCkKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCByZXNwb25zZUNvbnRleHQuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJhZFByaW1pdGl2ZUxpc3RWYWx1ZSgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2VDb250ZXh0ID0gYXBwbHkoCisgICAgICAgICAgICAgICAgUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8iLCAiR0VUIikuYWNjZXB0KCJhcHBsaWNhdGlvbi9pbnQiKS5oZWFkZXIoImludCIsICJhYmNkZWYiKS5oZWFkZXIoImludCIsICJhYmNkZWYiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmhlYWRlcigiaW50IiwgImFiY2RlZiIpLmJ1aWxkKCkKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCByZXNwb25zZUNvbnRleHQuZ2V0U3RhdHVzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9IZWFkZXJQYXJhbUFzU3RyaW5nVGVzdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L0hlYWRlclBhcmFtQXNTdHJpbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgyZGE4ZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9IZWFkZXJQYXJhbUFzU3RyaW5nVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDAyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5pbmplY3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5EZWZhdWx0VmFsdWU7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLkhlYWRlclBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVxdWVzdENvbnRleHRCdWlsZGVyOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKK3B1YmxpYyBjbGFzcyBIZWFkZXJQYXJhbUFzU3RyaW5nVGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdCB7CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVN0cmluZyB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBIZWFkZXJQYXJhbSgiYXJnMSIpIFN0cmluZyBhcmcxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBIZWFkZXJQYXJhbSgiYXJnMiIpIFN0cmluZyBhcmcyLCBASGVhZGVyUGFyYW0oImFyZzMiKSBTdHJpbmcgYXJnMykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgYXJnMSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImIiLCBhcmcyKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiYyIsIGFyZzMpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9Qb3N0KEBIZWFkZXJQYXJhbSgiYXJnMSIpIFN0cmluZyBhcmcxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBASGVhZGVyUGFyYW0oImFyZzIiKSBTdHJpbmcgYXJnMiwgQEhlYWRlclBhcmFtKCJhcmczIikgU3RyaW5nIGFyZzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCBhcmcxKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiYiIsIGFyZzIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJjIiwgYXJnMyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImNvbnRlbnQiLCByKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVN0cmluZ0VtcHR5IHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQEhlYWRlclBhcmFtKCJhcmcxIikgU3RyaW5nIGFyZzEpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiIiwgYXJnMSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VTdHJpbmdBYnNlbnQgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChASGVhZGVyUGFyYW0oImFyZzEiKSBTdHJpbmcgYXJnMSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIGFyZzEpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlU3RyaW5nTGlzdCB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3N0cmluZ2xpc3QiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0U3RyaW5nKEBIZWFkZXJQYXJhbSgiYXJncyIpIExpc3Q8U3RyaW5nPiBhcmdzKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCBhcmdzLmdldCgwKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImIiLCBhcmdzLmdldCgxKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImMiLCBhcmdzLmdldCgyKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2xpc3QiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBIZWFkZXJQYXJhbSgiYXJncyIpIExpc3QgYXJncykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5jbGFzcywgYXJncy5nZXQoMCkuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCBhcmdzLmdldCgwKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmNsYXNzLCBhcmdzLmdldCgxKS5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiYiIsIGFyZ3MuZ2V0KDEpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuY2xhc3MsIGFyZ3MuZ2V0KDIpLmdldENsYXNzKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJjIiwgYXJncy5nZXQoMikpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlU3RyaW5nTGlzdEVtcHR5IHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vc3RyaW5nbGlzdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRTdHJpbmcoQEhlYWRlclBhcmFtKCJhcmdzIikgTGlzdDxTdHJpbmc+IGFyZ3MpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzLCBhcmdzLnNpemUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIGFyZ3MuZ2V0KDApKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiIiwgYXJncy5nZXQoMSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBhcmdzLmdldCgyKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VTdHJpbmdFbXB0eURlZmF1bHQgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChASGVhZGVyUGFyYW0oImFyZzEiKSBTdHJpbmcgYXJnMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBASGVhZGVyUGFyYW0oImFyZzIiKSBTdHJpbmcgYXJnMiwgQEhlYWRlclBhcmFtKCJhcmczIikgU3RyaW5nIGFyZzMpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBhcmcxKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBhcmcyKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBhcmczKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVN0cmluZ0RlZmF1bHQgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldCgKKyAgICAgICAgICAgICAgICBASGVhZGVyUGFyYW0oImFyZzEiKSBARGVmYXVsdFZhbHVlKCJhIikgU3RyaW5nIGFyZzEsCisgICAgICAgICAgICAgICAgQEhlYWRlclBhcmFtKCJhcmcyIikgQERlZmF1bHRWYWx1ZSgiYiIpIFN0cmluZyBhcmcyLAorICAgICAgICAgICAgICAgIEBIZWFkZXJQYXJhbSgiYXJnMyIpIEBEZWZhdWx0VmFsdWUoImMiKSBTdHJpbmcgYXJnMykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgYXJnMSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImIiLCBhcmcyKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiYyIsIGFyZzMpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlU3RyaW5nRGVmYXVsdE92ZXJyaWRlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoCisgICAgICAgICAgICAgICAgQEhlYWRlclBhcmFtKCJhcmcxIikgQERlZmF1bHRWYWx1ZSgiYSIpIFN0cmluZyBhcmcxLAorICAgICAgICAgICAgICAgIEBIZWFkZXJQYXJhbSgiYXJnMiIpIEBEZWZhdWx0VmFsdWUoImIiKSBTdHJpbmcgYXJnMiwKKyAgICAgICAgICAgICAgICBASGVhZGVyUGFyYW0oImFyZzMiKSBARGVmYXVsdFZhbHVlKCJjIikgU3RyaW5nIGFyZzMpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZCIsIGFyZzEpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJlIiwgYXJnMik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImYiLCBhcmczKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVN0cmluZ0xpc3ROdWxsRGVmYXVsdCB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3N0cmluZ2xpc3QiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0U3RyaW5nKAorICAgICAgICAgICAgICAgIEBIZWFkZXJQYXJhbSgiYXJncyIpIExpc3Q8U3RyaW5nPiBhcmdzKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgYXJncy5zaXplKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9saXN0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldCgKKyAgICAgICAgICAgICAgICBASGVhZGVyUGFyYW0oImFyZ3MiKSBMaXN0IGFyZ3MpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBhcmdzLnNpemUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VTdHJpbmdMaXN0RGVmYXVsdCB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3N0cmluZ2xpc3QiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0U3RyaW5nKAorICAgICAgICAgICAgICAgIEBIZWFkZXJQYXJhbSgiYXJncyIpIEBEZWZhdWx0VmFsdWUoImEiKSBMaXN0PFN0cmluZz4gYXJncykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgYXJncy5nZXQoMCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9saXN0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldCgKKyAgICAgICAgICAgICAgICBASGVhZGVyUGFyYW0oImFyZ3MiKSBARGVmYXVsdFZhbHVlKCJhIikgTGlzdCBhcmdzKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmNsYXNzLCBhcmdzLmdldCgwKS5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiYSIsIGFyZ3MuZ2V0KDApKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVN0cmluZ0xpc3REZWZhdWx0T3ZlcnJpZGUgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9zdHJpbmdsaXN0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldFN0cmluZygKKyAgICAgICAgICAgICAgICBASGVhZGVyUGFyYW0oImFyZ3MiKSBARGVmYXVsdFZhbHVlKCJhIikgTGlzdDxTdHJpbmc+IGFyZ3MpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiYiIsIGFyZ3MuZ2V0KDApKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vbGlzdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoCisgICAgICAgICAgICAgICAgQEhlYWRlclBhcmFtKCJhcmdzIikgQERlZmF1bHRWYWx1ZSgiYSIpIExpc3QgYXJncykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5jbGFzcywgYXJncy5nZXQoMCkuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImIiLCBhcmdzLmdldCgwKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nR2V0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbnRlbnQiLCBhcHBseSgKKyAgICAgICAgICAgICAgICBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJHRVQiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmhlYWRlcigiYXJnMSIsICJhIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5oZWFkZXIoImFyZzIiLCAiYiIpCisgICAgICAgICAgICAgICAgICAgICAgICAuaGVhZGVyKCJhcmczIiwgImMiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkKKyAgICAgICAgKS5nZXRFbnRpdHkoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nRW1wdHlHZXQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VTdHJpbmdFbXB0eS5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb250ZW50IiwgYXBwbHkoCisgICAgICAgICAgICAgICAgUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8iLCAiR0VUIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5oZWFkZXIoImFyZzEiLCAiIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpCisgICAgICAgICkuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ0Fic2VudEdldCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZ0Fic2VudC5jbGFzcyk7CisKKyAgICAgICAgX3Rlc3QoIi8iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdQb3N0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBmaW5hbCBDb250YWluZXJSZXNwb25zZSByZXNwb25zZUNvbnRleHQgPSBhcHBseSgKKyAgICAgICAgICAgICAgICBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJQT1NUIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5lbnRpdHkoImNvbnRlbnQiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmhlYWRlcigiYXJnMSIsICJhIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5oZWFkZXIoImFyZzIiLCAiYiIpCisgICAgICAgICAgICAgICAgICAgICAgICAuaGVhZGVyKCJhcmczIiwgImMiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbnRlbnQiLCByZXNwb25zZUNvbnRleHQuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ0xpc3RHZXQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VTdHJpbmdMaXN0LmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbnRlbnQiLCBhcHBseSgKKyAgICAgICAgICAgICAgICBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJHRVQiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFjY2VwdCgiYXBwbGljYXRpb24vc3RyaW5nbGlzdCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuaGVhZGVyKCJhcmdzIiwgImEiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmhlYWRlcigiYXJncyIsICJiIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5oZWFkZXIoImFyZ3MiLCAiYyIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKQorICAgICAgICApLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdMaXN0RW1wdHlHZXQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VTdHJpbmdMaXN0RW1wdHkuY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscygiY29udGVudCIsIGFwcGx5KAorICAgICAgICAgICAgICAgIFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvIiwgIkdFVCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYWNjZXB0KCJhcHBsaWNhdGlvbi9zdHJpbmdsaXN0IikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5oZWFkZXIoImFyZ3MiLCAiIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5oZWFkZXIoImFyZ3MiLCAiIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5oZWFkZXIoImFyZ3MiLCAiIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpCisgICAgICAgICkuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExpc3RHZXQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VTdHJpbmdMaXN0LmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbnRlbnQiLCBhcHBseSgKKyAgICAgICAgICAgICAgICBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJHRVQiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFjY2VwdCgiYXBwbGljYXRpb24vbGlzdCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuaGVhZGVyKCJhcmdzIiwgImEiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmhlYWRlcigiYXJncyIsICJiIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5oZWFkZXIoImFyZ3MiLCAiYyIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKQorICAgICAgICApLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdOdWxsRGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZ0VtcHR5RGVmYXVsdC5jbGFzcyk7CisKKyAgICAgICAgX3Rlc3QoIi8iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdEZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlU3RyaW5nRGVmYXVsdC5jbGFzcyk7CisKKyAgICAgICAgX3Rlc3QoIi8iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdEZWZhdWx0T3ZlcnJpZGUoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VTdHJpbmdEZWZhdWx0T3ZlcnJpZGUuY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscygiY29udGVudCIsIGFwcGx5KAorICAgICAgICAgICAgICAgIFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvIiwgIkdFVCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuaGVhZGVyKCJhcmcxIiwgImQiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmhlYWRlcigiYXJnMiIsICJlIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5oZWFkZXIoImFyZzMiLCAiZiIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKQorICAgICAgICApLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdMaXN0RW1wdHlEZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlU3RyaW5nTGlzdE51bGxEZWZhdWx0LmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbnRlbnQiLCBhcHBseSgKKyAgICAgICAgICAgICAgICBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJHRVQiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFjY2VwdCgiYXBwbGljYXRpb24vc3RyaW5nbGlzdCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKQorICAgICAgICApLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0RW1wdHlEZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlU3RyaW5nTGlzdE51bGxEZWZhdWx0LmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbnRlbnQiLCBhcHBseSgKKyAgICAgICAgICAgICAgICBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJHRVQiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFjY2VwdCgiYXBwbGljYXRpb24vbGlzdCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKQorICAgICAgICApLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdMaXN0RGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZ0xpc3REZWZhdWx0LmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbnRlbnQiLCBhcHBseSgKKyAgICAgICAgICAgICAgICBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJHRVQiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFjY2VwdCgiYXBwbGljYXRpb24vc3RyaW5nbGlzdCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKQorICAgICAgICApLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0RGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZ0xpc3REZWZhdWx0LmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbnRlbnQiLCBhcHBseSgKKyAgICAgICAgICAgICAgICBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJHRVQiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFjY2VwdCgiYXBwbGljYXRpb24vbGlzdCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKQorICAgICAgICApLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0RGVmYXVsdE92ZXJyaWRlKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlU3RyaW5nTGlzdERlZmF1bHRPdmVycmlkZS5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb250ZW50IiwgYXBwbHkoCisgICAgICAgICAgICAgICAgUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8iLCAiR0VUIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hY2NlcHQoImFwcGxpY2F0aW9uL2xpc3QiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmhlYWRlcigiYXJncyIsICJiIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpCisgICAgICAgICkuZ2V0RW50aXR5KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9IZWFkZXJQYXJhbVN0cmluZ0NvbnN0cnVjdG9yVGVzdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L0hlYWRlclBhcmFtU3RyaW5nQ29uc3RydWN0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRiZDNmNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9IZWFkZXJQYXJhbVN0cmluZ0NvbnN0cnVjdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjUzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5pbmplY3Q7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKK2ltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuRGVmYXVsdFZhbHVlOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5IZWFkZXJQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXF1ZXN0Q29udGV4dEJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBIZWFkZXJQYXJhbVN0cmluZ0NvbnN0cnVjdG9yVGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdCB7CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVN0cmluZyB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KAorICAgICAgICAgICAgICAgIEBIZWFkZXJQYXJhbSgiYXJnMSIpIEJpZ0RlY2ltYWwgYXJnMSwKKyAgICAgICAgICAgICAgICBASGVhZGVyUGFyYW0oImFyZzIiKSBCaWdJbnRlZ2VyIGFyZzIsCisgICAgICAgICAgICAgICAgQEhlYWRlclBhcmFtKCJhcmczIikgVVJJIGFyZzMpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMy4xNDUiLCBhcmcxLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIzMTQ1IiwgYXJnMi50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL3Rlc3QiLCBhcmczLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlU3RyaW5nTGlzdCB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0U3RyaW5nKEBIZWFkZXJQYXJhbSgiYXJncyIpIExpc3Q8QmlnRGVjaW1hbD4gYXJncykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIzLjE0NSIsIGFyZ3MuZ2V0KDApLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIyLjcxOCIsIGFyZ3MuZ2V0KDEpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIxLjYxOCIsIGFyZ3MuZ2V0KDIpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlU3RyaW5nTGlzdEVtcHR5IHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRTdHJpbmcoQEhlYWRlclBhcmFtKCJhcmdzIikgTGlzdDxCaWdEZWNpbWFsPiBhcmdzKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMywgYXJncy5zaXplKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIGFyZ3MuZ2V0KDApKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBhcmdzLmdldCgxKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgYXJncy5nZXQoMikpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlU3RyaW5nTnVsbERlZmF1bHQgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldCgKKyAgICAgICAgICAgICAgICBASGVhZGVyUGFyYW0oImFyZzEiKSBCaWdEZWNpbWFsIGFyZzEpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBhcmcxKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVN0cmluZ0RlZmF1bHQgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldCgKKyAgICAgICAgICAgICAgICBASGVhZGVyUGFyYW0oImFyZzEiKSBARGVmYXVsdFZhbHVlKCIzLjE0NSIpIEJpZ0RlY2ltYWwgYXJnMSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIzLjE0NSIsIGFyZzEudG9TdHJpbmcoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VTdHJpbmdEZWZhdWx0T3ZlcnJpZGUgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldCgKKyAgICAgICAgICAgICAgICBASGVhZGVyUGFyYW0oImFyZzEiKSBARGVmYXVsdFZhbHVlKCIzLjE0NSIpIEJpZ0RlY2ltYWwgYXJnMSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIyLjcxOCIsIGFyZzEudG9TdHJpbmcoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VTdHJpbmdMaXN0RW1wdHlEZWZhdWx0IHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRTdHJpbmcoQEhlYWRlclBhcmFtKCJhcmdzIikgTGlzdDxCaWdEZWNpbWFsPiBhcmdzKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgYXJncy5zaXplKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlU3RyaW5nTGlzdERlZmF1bHQgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldFN0cmluZygKKyAgICAgICAgICAgICAgICBASGVhZGVyUGFyYW0oImFyZ3MiKSBARGVmYXVsdFZhbHVlKCIzLjE0NSIpIExpc3Q8QmlnRGVjaW1hbD4gYXJncykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIzLjE0NSIsIGFyZ3MuZ2V0KDApLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlU3RyaW5nTGlzdERlZmF1bHRPdmVycmlkZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0U3RyaW5nKAorICAgICAgICAgICAgICAgIEBIZWFkZXJQYXJhbSgiYXJncyIpIEBEZWZhdWx0VmFsdWUoIjMuMTQ1IikgTGlzdDxCaWdEZWNpbWFsPiBhcmdzKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjIuNzE4IiwgYXJncy5nZXQoMCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nQ29uc3RydWN0b3JHZXQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscygiY29udGVudCIsIGFwcGx5KAorICAgICAgICAgICAgICAgIFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvIiwgIkdFVCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuaGVhZGVyKCJhcmcxIiwgIjMuMTQ1IikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5oZWFkZXIoImFyZzIiLCAiMzE0NSIpCisgICAgICAgICAgICAgICAgICAgICAgICAuaGVhZGVyKCJhcmczIiwgImh0dHA6Ly90ZXN0IikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpCisgICAgICAgICkuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ0NvbnN0cnVjdG9yTGlzdEdldCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZ0xpc3QuY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscygiY29udGVudCIsIGFwcGx5KAorICAgICAgICAgICAgICAgIFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvIiwgIkdFVCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYWNjZXB0KCJhcHBsaWNhdGlvbi9zdHJpbmdsaXN0IikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5oZWFkZXIoImFyZ3MiLCAiMy4xNDUiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmhlYWRlcigiYXJncyIsICIyLjcxOCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuaGVhZGVyKCJhcmdzIiwgIjEuNjE4IikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpCisgICAgICAgICkuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ0NvbnN0cnVjdG9yTGlzdEVtcHR5R2V0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlU3RyaW5nTGlzdEVtcHR5LmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbnRlbnQiLCBhcHBseSgKKyAgICAgICAgICAgICAgICBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJHRVQiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFjY2VwdCgiYXBwbGljYXRpb24vc3RyaW5nbGlzdCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuaGVhZGVyKCJhcmdzIiwgIiIpCisgICAgICAgICAgICAgICAgICAgICAgICAuaGVhZGVyKCJhcmdzIiwgIiIpCisgICAgICAgICAgICAgICAgICAgICAgICAuaGVhZGVyKCJhcmdzIiwgIiIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKQorICAgICAgICApLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdDb25zdHJ1Y3RvckVtcHR5RGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZ051bGxEZWZhdWx0LmNsYXNzKTsKKworICAgICAgICBfdGVzdCgiLyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ0NvbnN0cnVjdG9yRGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZ0RlZmF1bHQuY2xhc3MpOworCisgICAgICAgIF90ZXN0KCIvIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nQ29uc3RydWN0b3JEZWZhdWx0T3ZlcnJpZGUoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VTdHJpbmdEZWZhdWx0LmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbnRlbnQiLCBhcHBseSgKKyAgICAgICAgICAgICAgICBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJHRVQiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmhlYWRlcigiYXJncyIsICIyLjcxOCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKQorICAgICAgICApLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdDb25zdHJ1Y3Rvckxpc3ROdWxsRGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZ0xpc3RFbXB0eURlZmF1bHQuY2xhc3MpOworCisgICAgICAgIF90ZXN0KCIvIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nQ29uc3RydWN0b3JMaXN0RGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZ0xpc3REZWZhdWx0LmNsYXNzKTsKKworICAgICAgICBfdGVzdCgiLyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ0NvbnN0cnVjdG9yTGlzdERlZmF1bHRPdmVycmlkZSgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZ0xpc3REZWZhdWx0T3ZlcnJpZGUuY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscygiY29udGVudCIsIGFwcGx5KAorICAgICAgICAgICAgICAgIFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvIiwgIkdFVCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuaGVhZGVyKCJhcmdzIiwgIjIuNzE4IikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpCisgICAgICAgICkuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJhZFN0cmluZ0NvbnN0cnVjdG9yVmFsdWUoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlQ29udGV4dCA9IGFwcGx5KAorICAgICAgICAgICAgICAgIFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvIiwgIkdFVCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuaGVhZGVyKCJhcmcxIiwgIkFCQ0RFRiIpCisgICAgICAgICAgICAgICAgICAgICAgICAuaGVhZGVyKCJhcmcyIiwgIjMxNDUiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmhlYWRlcigiYXJnMyIsICJodHRwOi8vdGVzdCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIHJlc3BvbnNlQ29udGV4dC5nZXRTdGF0dXMoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L0ludmFsaWRQYXJhbXNUZXN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvSW52YWxpZFBhcmFtc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmFiZThlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L0ludmFsaWRQYXJhbXNUZXN0LmphdmEKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLmluamVjdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvb2tpZVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LkV4Y2VwdGlvbk1hcHBlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXF1ZXN0Q29udGV4dEJ1aWxkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBJbnZhbGlkUGFyYW1zVGVzdCB7CisKKyAgICBwcml2YXRlIEFwcGxpY2F0aW9uSGFuZGxlciBjcmVhdGVBcHBsaWNhdGlvbihDbGFzczw/Pi4uLiBjbGFzc2VzKSB7CisgICAgICAgIHJldHVybiBuZXcgQXBwbGljYXRpb25IYW5kbGVyKG5ldyBSZXNvdXJjZUNvbmZpZyhjbGFzc2VzKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXJhbUVudGl0eSB7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBQYXJhbUVudGl0eSBmcm9tU3RyaW5nKFN0cmluZyBhcmcpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUGFyYW1FbnRpdHkoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJpbnZhbGlkL3BhdGgvcGFyYW0iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VJbnZhbGlkUGFyYW1zIHsKKworICAgICAgICBAUGF0aFBhcmFtKCJhcmcxIikKKyAgICAgICAgU3RyaW5nIGYxOworICAgICAgICBAUXVlcnlQYXJhbSgiYXJnMiIpCisgICAgICAgIFN0cmluZyBmMjsKKyAgICAgICAgQENvb2tpZVBhcmFtKCJhcmczIikKKyAgICAgICAgU3RyaW5nIGYzOworICAgICAgICBAUXVlcnlQYXJhbSgiYXJnNCIpCisgICAgICAgIFBhcmFtRW50aXR5IGY0OworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChAUGF0aFBhcmFtKCJhcmcxIikgU3RyaW5nIHMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBRdWVyeVBhcmFtKCJhcmcyIikgU3RyaW5nIHMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBDb29raWVQYXJhbSgiYXJnMyIpIFN0cmluZyBzMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBAUXVlcnlQYXJhbSgiYXJnNCIpIFBhcmFtRW50aXR5IHM0KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoczEsIG51bGwpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHMyLCBudWxsKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhzMywgbnVsbCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoczQsIG51bGwpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGYxLCBudWxsKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhmMiwgbnVsbCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZjMsIG51bGwpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGY0LCBudWxsKTsKKworICAgICAgICAgICAgcmV0dXJuIHMxOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFBhdGhQYXJhbSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDb250YWluZXJSZXNwb25zZSByZXNwb25zZUNvbnRleHQgPSBjcmVhdGVBcHBsaWNhdGlvbihSZXNvdXJjZUludmFsaWRQYXJhbXMuY2xhc3MpCisgICAgICAgICAgICAgICAgLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvaW52YWxpZC9wYXRoL3BhcmFtIiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICAvLyByZXR1cm5lZCBwYXJhbSBpcyBudWxsIC0+IDIwNCBOTyBDT05URU5UCisgICAgICAgIGFzc2VydEVxdWFscygyMDQsIHJlc3BvbnNlQ29udGV4dC5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYXVsdHlQYXJhbUVudGl0eVdBRSB7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBGYXVsdHlQYXJhbUVudGl0eVdBRSBmcm9tU3RyaW5nKFN0cmluZyBhcmcpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbig1MDApOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbk1hcHBlciBpbXBsZW1lbnRzIEV4Y2VwdGlvbk1hcHBlcjxXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbj4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgdG9SZXNwb25zZShXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoNTAwKS5lbnRpdHkoImNhdWdodCIpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiaW52YWxpZC9wYXRoL3BhcmFtIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlV2l0aEZhdWx0eVBhcmFtRW50aXR5UGFyYW1XQUUgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChAUXVlcnlQYXJhbSgiYXJnNCIpIEZhdWx0eVBhcmFtRW50aXR5V0FFIHM0KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoczQsIG51bGwpOworCisgICAgICAgICAgICByZXR1cm4gImZvbyI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkUXVlcnlQYXJhbVBhcmFtV0FFKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlQ29udGV4dCA9IGNyZWF0ZUFwcGxpY2F0aW9uKFJlc291cmNlV2l0aEZhdWx0eVBhcmFtRW50aXR5UGFyYW1XQUUuY2xhc3MsCisgICAgICAgICAgICAgICAgV2ViQXBwbGljYXRpb25FeGNlcHRpb25NYXBwZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvaW52YWxpZC9wYXRoL3BhcmFtP2FyZzQ9dGVzdCIsICJHRVQiKS5idWlsZCgpKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNTAwLCByZXNwb25zZUNvbnRleHQuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNhdWdodCIsIHJlc3BvbnNlQ29udGV4dC5nZXRFbnRpdHkoKSk7CisgICAgfQorCisgICAgQFBhdGgoImludmFsaWQvcGF0aC9wYXJhbSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVdpdGhGYXVsdHlQYXJhbUVudGl0eUZpZWxkV0FFIHsKKworICAgICAgICBAUXVlcnlQYXJhbSgiYXJnNCIpCisgICAgICAgIEZhdWx0eVBhcmFtRW50aXR5V0FFIGY0OworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldCgpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhmNCwgbnVsbCk7CisKKyAgICAgICAgICAgIHJldHVybiAiZm9vIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRRdWVyeVBhcmFtRmllbGRXQUUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2VDb250ZXh0ID0gY3JlYXRlQXBwbGljYXRpb24oUmVzb3VyY2VXaXRoRmF1bHR5UGFyYW1FbnRpdHlGaWVsZFdBRS5jbGFzcywKKyAgICAgICAgICAgICAgICBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbk1hcHBlci5jbGFzcykKKyAgICAgICAgICAgICAgICAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9pbnZhbGlkL3BhdGgvcGFyYW0/YXJnND10ZXN0IiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpOworCisgICAgICAgIGFzc2VydEVxdWFscyg1MDAsIHJlc3BvbnNlQ29udGV4dC5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY2F1Z2h0IiwgcmVzcG9uc2VDb250ZXh0LmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhdWx0eVBhcmFtRW50aXR5SVNFIHsKKworICAgICAgICBwdWJsaWMgc3RhdGljIEZhdWx0eVBhcmFtRW50aXR5SVNFIGZyb21TdHJpbmcoU3RyaW5nIGFyZykgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiZXJyb3IiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJpbnZhbGlkL3BhdGgvcGFyYW0iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VXaXRoRmF1bHR5UGFyYW1FbnRpdHlGaWVsZElTRSB7CisKKyAgICAgICAgQFF1ZXJ5UGFyYW0oImFyZzQiKQorICAgICAgICBGYXVsdHlQYXJhbUVudGl0eUlTRSBmNDsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZjQsIG51bGwpOworCisgICAgICAgICAgICByZXR1cm4gImZvbyI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkUXVlcnlQYXJhbUZpZWxkSVNFKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlQ29udGV4dCA9IGNyZWF0ZUFwcGxpY2F0aW9uKFJlc291cmNlV2l0aEZhdWx0eVBhcmFtRW50aXR5RmllbGRJU0UuY2xhc3MpCisgICAgICAgICAgICAgICAgLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvaW52YWxpZC9wYXRoL3BhcmFtP2FyZzQ9dGVzdCIsICJHRVQiKS5idWlsZCgpKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNDA0LCByZXNwb25zZUNvbnRleHQuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBQYXRoKCJpbnZhbGlkL3BhdGgvcGFyYW0iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VXaXRoRmF1bHR5UGFyYW1FbnRpdHlQYXJhbUlTRSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBRdWVyeVBhcmFtKCJhcmc0IikgRmF1bHR5UGFyYW1FbnRpdHlJU0UgczQpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhzNCwgbnVsbCk7CisKKyAgICAgICAgICAgIHJldHVybiAiZm9vIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRRdWVyeVBhcmFtUGFyYW1JU0UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2VDb250ZXh0ID0gY3JlYXRlQXBwbGljYXRpb24oUmVzb3VyY2VXaXRoRmF1bHR5UGFyYW1FbnRpdHlQYXJhbUlTRS5jbGFzcykKKyAgICAgICAgICAgICAgICAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9pbnZhbGlkL3BhdGgvcGFyYW0/YXJnND10ZXN0IiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpOworCisgICAgICAgIGFzc2VydEVxdWFscyg0MDQsIHJlc3BvbnNlQ29udGV4dC5nZXRTdGF0dXMoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L0pheFJzSW5qZWN0YWJsZXNUZXN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvSmF4UnNJbmplY3RhYmxlc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzU2MGZkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L0pheFJzSW5qZWN0YWJsZXNUZXN0LmphdmEKQEAgLTAsMCArMSw1NDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLmluamVjdDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlcXVlc3Q7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5TZWN1cml0eUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXF1ZXN0Q29udGV4dEJ1aWxkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiBDb3ZlcnMgSkFYLVJTIGRlZmluZWQgQENvbnRleHQgaW5qZWN0YWJsZSB2YWx1ZXMgaW5jbHVkaW5nCisgKiBwcm94eSBzdXBwb3J0IGZvciB0aGVzZS4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSmF4UnNJbmplY3RhYmxlc1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdFRlc3QgeworCisgICAgcHJpdmF0ZSBDb250YWluZXJSZXNwb25zZSByZXNvdXJjZShTdHJpbmcgdXJpKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKHVyaSwgIkdFVCIpLmJ1aWxkKCkpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBlclJlcXVlc3RDb250ZXh0UmVzb3VyY2UgeworCisgICAgICAgIEBDb250ZXh0CisgICAgICAgIFVyaUluZm8gdWk7CisKKyAgICAgICAgQENvbnRleHQKKyAgICAgICAgSHR0cEhlYWRlcnMgaHM7CisKKyAgICAgICAgQENvbnRleHQKKyAgICAgICAgUmVxdWVzdCByOworCisgICAgICAgIEBDb250ZXh0CisgICAgICAgIFNlY3VyaXR5Q29udGV4dCBzYzsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh1aSk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGhzKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocik7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHNjKTsKKyAgICAgICAgICAgIHJldHVybiAiR0VUIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBlclJlcXVlc3RDb250ZXh0Q29uc3RydWN0b3JQYXJhbWV0ZXJSZXNvdXJjZSB7CisKKyAgICAgICAgcHVibGljIFBlclJlcXVlc3RDb250ZXh0Q29uc3RydWN0b3JQYXJhbWV0ZXJSZXNvdXJjZSgKKyAgICAgICAgICAgICAgICBAQ29udGV4dCBVcmlJbmZvIHVpLAorICAgICAgICAgICAgICAgIEBDb250ZXh0IEh0dHBIZWFkZXJzIGhzLAorICAgICAgICAgICAgICAgIEBDb250ZXh0IFJlcXVlc3QgciwKKyAgICAgICAgICAgICAgICBAQ29udGV4dCBTZWN1cml0eUNvbnRleHQgc2MpIHsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwodWkpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChocyk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHIpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChzYyk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJHRVQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGVyUmVxdWVzdENvbnRleHRNZXRob2RQYXJhbWV0ZXJSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgKKyAgICAgICAgICAgICAgICBAQ29udGV4dCBVcmlJbmZvIHVpLAorICAgICAgICAgICAgICAgIEBDb250ZXh0IEh0dHBIZWFkZXJzIGhzLAorICAgICAgICAgICAgICAgIEBDb250ZXh0IFJlcXVlc3QgciwKKyAgICAgICAgICAgICAgICBAQ29udGV4dCBTZWN1cml0eUNvbnRleHQgc2MpIHsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwodWkpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChocyk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHIpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChzYyk7CisgICAgICAgICAgICByZXR1cm4gIkdFVCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgQFNpbmdsZXRvbgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2luZ2xldG9uQ29udGV4dFJlc291cmNlIHsKKworICAgICAgICBAQ29udGV4dAorICAgICAgICBVcmlJbmZvIHVpOworCisgICAgICAgIEBDb250ZXh0CisgICAgICAgIEh0dHBIZWFkZXJzIGhzOworCisgICAgICAgIEBDb250ZXh0CisgICAgICAgIFJlcXVlc3QgcjsKKworICAgICAgICBAQ29udGV4dAorICAgICAgICBTZWN1cml0eUNvbnRleHQgc2M7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoaHMpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh1aSk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHIpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChzYyk7CisgICAgICAgICAgICByZXR1cm4gIkdFVCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgQFNpbmdsZXRvbgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2luZ2xldG9uQ29udGV4dENvbnN0cnVjdG9yUGFyYW1ldGVyUmVzb3VyY2UgeworCisgICAgICAgIHB1YmxpYyBTaW5nbGV0b25Db250ZXh0Q29uc3RydWN0b3JQYXJhbWV0ZXJSZXNvdXJjZSgKKyAgICAgICAgICAgICAgICBAQ29udGV4dCBVcmlJbmZvIHVpLAorICAgICAgICAgICAgICAgIEBDb250ZXh0IEh0dHBIZWFkZXJzIGhzLAorICAgICAgICAgICAgICAgIEBDb250ZXh0IFJlcXVlc3QgciwKKyAgICAgICAgICAgICAgICBAQ29udGV4dCBTZWN1cml0eUNvbnRleHQgc2MpIHsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoaHMpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh1aSk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHIpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChzYyk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJHRVQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGVyUmVxdWVzdEluamVjdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUGVyUmVxdWVzdENvbnRleHRSZXNvdXJjZS5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJHRVQiLCByZXNvdXJjZSgiLyIpLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQZXJSZXF1ZXN0Q29uc3RydWN0b3JQYXJhbWV0ZXJJbmplY3RlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFBlclJlcXVlc3RDb250ZXh0Q29uc3RydWN0b3JQYXJhbWV0ZXJSZXNvdXJjZS5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJHRVQiLCByZXNvdXJjZSgiLyIpLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQZXJSZXF1ZXN0TWV0aG9kUGFyYW1ldGVySW5qZWN0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihQZXJSZXF1ZXN0Q29udGV4dE1ldGhvZFBhcmFtZXRlclJlc291cmNlLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCIsIHJlc291cmNlKCIvIikuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZXRvbkluamVjdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oU2luZ2xldG9uQ29udGV4dFJlc291cmNlLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCIsIHJlc291cmNlKCIvIikuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZXRvbkNvbnN0cnVjdG9yUGFyYW1ldGVySW5qZWN0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihTaW5nbGV0b25Db250ZXh0Q29uc3RydWN0b3JQYXJhbWV0ZXJSZXNvdXJjZS5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJHRVQiLCByZXNvdXJjZSgiLyIpLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdHJpbmdXcml0ZXJSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiR0VUIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIEBDb25zdW1lcyh7InRleHQvcGxhaW4iLCAiKi8qIn0pCisgICAgQFByb2R1Y2VzKHsidGV4dC9wbGFpbiIsICIqLyoifSkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN0cmluZ1dyaXRlckZpZWxkIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8U3RyaW5nPiB7CisKKyAgICAgICAgcHVibGljIFN0cmluZ1dyaXRlckZpZWxkKCkgeworICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKENsYXNzPD8+IGFyZzAsIFR5cGUgYXJnMSwgQW5ub3RhdGlvbltdIGFyZzIsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBhcmcwID09IFN0cmluZy5jbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKFN0cmluZyBhcmcwLCBDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uIGFubm90YXRpb25zW10sIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKFN0cmluZyBhcmcwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IGFyZzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSBhcmcyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25bXSBhcmczLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBhcmc0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBhcmc1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBhcmc2KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwodWkpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChocyk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHIpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChzYyk7CisgICAgICAgICAgICBhcmc2LndyaXRlKGFyZzAuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIH0KKworICAgICAgICBAQ29udGV4dAorICAgICAgICBVcmlJbmZvIHVpOworCisgICAgICAgIEBDb250ZXh0CisgICAgICAgIEh0dHBIZWFkZXJzIGhzOworCisgICAgICAgIEBDb250ZXh0CisgICAgICAgIFJlcXVlc3QgcjsKKworICAgICAgICBAQ29udGV4dAorICAgICAgICBTZWN1cml0eUNvbnRleHQgc2M7CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgQENvbnN1bWVzKHsidGV4dC9wbGFpbiIsICIqLyoifSkKKyAgICBAUHJvZHVjZXMoeyJ0ZXh0L3BsYWluIiwgIiovKiJ9KQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3RyaW5nV3JpdGVyQ29uc3RydWN0b3IgaW1wbGVtZW50cyBNZXNzYWdlQm9keVdyaXRlcjxTdHJpbmc+IHsKKworICAgICAgICBwdWJsaWMgU3RyaW5nV3JpdGVyQ29uc3RydWN0b3IoCisgICAgICAgICAgICAgICAgQENvbnRleHQgVXJpSW5mbyB1aSwKKyAgICAgICAgICAgICAgICBAQ29udGV4dCBIdHRwSGVhZGVycyBocywKKyAgICAgICAgICAgICAgICBAQ29udGV4dCBSZXF1ZXN0IHIsCisgICAgICAgICAgICAgICAgQENvbnRleHQgU2VjdXJpdHlDb250ZXh0IHNjCisgICAgICAgICkgeworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh1aSk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGhzKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocik7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHNjKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShDbGFzczw/PiBhcmcwLCBUeXBlIGFyZzEsIEFubm90YXRpb25bXSBhcmcyLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gYXJnMCA9PSBTdHJpbmcuY2xhc3M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShTdHJpbmcgYXJnMCwgQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uc1tdLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbyhTdHJpbmcgYXJnMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzczw/PiBhcmcxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgYXJnMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uW10gYXJnMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUgYXJnNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gYXJnNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gYXJnNikgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBhcmc2LndyaXRlKGFyZzAuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBAQ29uc3VtZXMoeyJ0ZXh0L3BsYWluIiwgIiovKiJ9KQorICAgIEBQcm9kdWNlcyh7InRleHQvcGxhaW4iLCAiKi8qIn0pCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdHJpbmdXcml0ZXJNdXRsaXBsZUNvbnN0cnVjdG9yIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8U3RyaW5nPiB7CisKKyAgICAgICAgcHVibGljIFN0cmluZ1dyaXRlck11dGxpcGxlQ29uc3RydWN0b3IoCisgICAgICAgICAgICAgICAgQENvbnRleHQgVXJpSW5mbyB1aSwKKyAgICAgICAgICAgICAgICBAQ29udGV4dCBIdHRwSGVhZGVycyBocywKKyAgICAgICAgICAgICAgICBAQ29udGV4dCBSZXF1ZXN0IHIsCisgICAgICAgICAgICAgICAgQENvbnRleHQgU2VjdXJpdHlDb250ZXh0IHNjCisgICAgICAgICkgeworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh1aSk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGhzKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocik7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHNjKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmdXcml0ZXJNdXRsaXBsZUNvbnN0cnVjdG9yKCkgeworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKENsYXNzPD8+IGFyZzAsIFR5cGUgYXJnMSwgQW5ub3RhdGlvbltdIGFyZzIsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBhcmcwID09IFN0cmluZy5jbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKFN0cmluZyBhcmcwLCBDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uIGFubm90YXRpb25zW10sIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKFN0cmluZyBhcmcwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IGFyZzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSBhcmcyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25bXSBhcmczLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBhcmc0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBhcmc1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBhcmc2KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGFyZzYud3JpdGUoYXJnMC5nZXRCeXRlcygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIEBDb25zdW1lcyh7InRleHQvcGxhaW4iLCAiKi8qIn0pCisgICAgQFByb2R1Y2VzKHsidGV4dC9wbGFpbiIsICIqLyoifSkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN0cmluZ1dyaXRlck11dGxpcGxlUGFydGlhbENvbnN0cnVjdG9yIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8U3RyaW5nPiB7CisKKyAgICAgICAgcHVibGljIFN0cmluZ1dyaXRlck11dGxpcGxlUGFydGlhbENvbnN0cnVjdG9yKAorICAgICAgICAgICAgICAgIEBDb250ZXh0IFVyaUluZm8gdWksCisgICAgICAgICAgICAgICAgQENvbnRleHQgSHR0cEhlYWRlcnMgaHMsCisgICAgICAgICAgICAgICAgQENvbnRleHQgUmVxdWVzdCByLAorICAgICAgICAgICAgICAgIEBDb250ZXh0IFNlY3VyaXR5Q29udGV4dCBzYworICAgICAgICApIHsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwodWkpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChocyk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHIpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChzYyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nV3JpdGVyTXV0bGlwbGVQYXJ0aWFsQ29uc3RydWN0b3IoCisgICAgICAgICAgICAgICAgU3RyaW5nIHJjLAorICAgICAgICAgICAgICAgIEBDb250ZXh0IFVyaUluZm8gdWksCisgICAgICAgICAgICAgICAgQENvbnRleHQgSHR0cEhlYWRlcnMgaHMsCisgICAgICAgICAgICAgICAgQENvbnRleHQgUmVxdWVzdCByKSB7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoQ2xhc3M8Pz4gYXJnMCwgVHlwZSBhcmcxLCBBbm5vdGF0aW9uW10gYXJnMiwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIGFyZzAgPT0gU3RyaW5nLmNsYXNzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldFNpemUoU3RyaW5nIGFyZzAsIENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb24gYW5ub3RhdGlvbnNbXSwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oU3RyaW5nIGFyZzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gYXJnMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlIGFyZzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFyZzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlIGFyZzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGFyZzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIGFyZzYpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgYXJnNi53cml0ZShhcmcwLmdldEJ5dGVzKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvdmlkZXJGaWVsZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFN0cmluZ1dyaXRlclJlc291cmNlLmNsYXNzLCBTdHJpbmdXcml0ZXJGaWVsZC5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJHRVQiLCByZXNvdXJjZSgiLyIpLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm92aWRlckluc3RhbmNlRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzb3VyY2VDb25maWcgcmMgPSBuZXcgUmVzb3VyY2VDb25maWcoU3RyaW5nV3JpdGVyUmVzb3VyY2UuY2xhc3MpOworICAgICAgICByYy5yZWdpc3RlcihuZXcgU3RyaW5nV3JpdGVyRmllbGQoKSk7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24ocmMpOworCisgICAgICAgIGFzc2VydEVxdWFscygiR0VUIiwgcmVzb3VyY2UoIi8iKS5nZXRFbnRpdHkoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvdmlkZXJDb25zdHJ1Y3RvcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFN0cmluZ1dyaXRlclJlc291cmNlLmNsYXNzLCBTdHJpbmdXcml0ZXJDb25zdHJ1Y3Rvci5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJHRVQiLCByZXNvdXJjZSgiLyIpLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm92aWRlck11bHRpcGxlQ29uc3RydWN0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihTdHJpbmdXcml0ZXJSZXNvdXJjZS5jbGFzcywgU3RyaW5nV3JpdGVyTXV0bGlwbGVDb25zdHJ1Y3Rvci5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJHRVQiLCByZXNvdXJjZSgiLyIpLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm92aWRlck11bHRpcGxlUGFydGlhbENvbnN0cnVjdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oU3RyaW5nV3JpdGVyUmVzb3VyY2UuY2xhc3MsIFN0cmluZ1dyaXRlck11dGxpcGxlUGFydGlhbENvbnN0cnVjdG9yLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCIsIHJlc291cmNlKCIvIikuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBQYXRoKCIve3B9IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBlclJlcXVlc3RGaWVsZFJlc291cmNlIHsKKworICAgICAgICBAUGF0aFBhcmFtKCJwIikKKyAgICAgICAgU3RyaW5nIHA7CisKKyAgICAgICAgQFF1ZXJ5UGFyYW0oInEiKQorICAgICAgICBTdHJpbmcgcTsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIHAgKyBxOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGVyUmVxdWVzdFBhcmFtSW5qZWN0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihQZXJSZXF1ZXN0RmllbGRSZXNvdXJjZS5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb29iYXIiLCByZXNvdXJjZSgiL2Zvbz9xPWJhciIpLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3RyaW5nV3JpdGVyUGFyYW1Db25zdHJ1Y3RvciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5V3JpdGVyPFN0cmluZz4geworCisgICAgICAgIHN0YXRpYyBpbnQgaWxsZWdhbFN0YXRlRXhjZXB0aW9uQ291bnQgPSAwOworICAgICAgICBzdGF0aWMgaW50IHJ1bnRpbWVFeGNlcHRpb25Db3VudCA9IDA7CisKKyAgICAgICAgcHVibGljIFN0cmluZ1dyaXRlclBhcmFtQ29uc3RydWN0b3IoCisgICAgICAgICAgICAgICAgQENvbnRleHQgVXJpSW5mbyB1aSwKKyAgICAgICAgICAgICAgICBAQ29udGV4dCBIdHRwSGVhZGVycyBocywKKyAgICAgICAgICAgICAgICBAQ29udGV4dCBSZXF1ZXN0IHIsCisgICAgICAgICAgICAgICAgQENvbnRleHQgU2VjdXJpdHlDb250ZXh0IHNjCisgICAgICAgICkgeworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHVpLmdldEFic29sdXRlUGF0aCgpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgaWxsZWdhbFN0YXRlRXhjZXB0aW9uQ291bnQrKzsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICBydW50aW1lRXhjZXB0aW9uQ291bnQrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBocy5nZXREYXRlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICBpbGxlZ2FsU3RhdGVFeGNlcHRpb25Db3VudCsrOworICAgICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHJ1bnRpbWVFeGNlcHRpb25Db3VudCsrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHIuZ2V0TWV0aG9kKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICBpbGxlZ2FsU3RhdGVFeGNlcHRpb25Db3VudCsrOworICAgICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHJ1bnRpbWVFeGNlcHRpb25Db3VudCsrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNjLmdldEF1dGhlbnRpY2F0aW9uU2NoZW1lKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICBpbGxlZ2FsU3RhdGVFeGNlcHRpb25Db3VudCsrOworICAgICAgICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHJ1bnRpbWVFeGNlcHRpb25Db3VudCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKENsYXNzPD8+IGFyZzAsIFR5cGUgYXJnMSwgQW5ub3RhdGlvbltdIGFyZzIsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBhcmcwID09IFN0cmluZy5jbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKFN0cmluZyBhcmcwLCBDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uIGFubm90YXRpb25zW10sIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKFN0cmluZyBhcmcwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IGFyZzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSBhcmcyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25bXSBhcmczLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBhcmc0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBhcmc1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvcykgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBTdHJpbmcgcyA9IGlsbGVnYWxTdGF0ZUV4Y2VwdGlvbkNvdW50ICsgIiAiICsgcnVudGltZUV4Y2VwdGlvbkNvdW50ICsgIiAiICsgYXJnMDsKKyAgICAgICAgICAgIG9zLndyaXRlKHMuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdHJpbmdXcml0ZXJQYXJhbUNvbnN0cnVjdG9yUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gU3RyaW5nV3JpdGVyUGFyYW1Db25zdHJ1Y3Rvci5pbGxlZ2FsU3RhdGVFeGNlcHRpb25Db3VudCArICIgIgorICAgICAgICAgICAgICAgICAgICArIFN0cmluZ1dyaXRlclBhcmFtQ29uc3RydWN0b3IucnVudGltZUV4Y2VwdGlvbkNvdW50ICsgIiBHRVQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nV3JpdGVyUGFyYW1Db25zdHJ1Y3RvcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFN0cmluZ1dyaXRlclBhcmFtQ29uc3RydWN0b3JSZXNvdXJjZS5jbGFzcywgU3RyaW5nV3JpdGVyUGFyYW1Db25zdHJ1Y3Rvci5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI0IDAgR0VUIiwgcmVzb3VyY2UoIi8iKS5nZXRFbnRpdHkoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L01hdHJpeFBhcmFtQXNQcmltaXRpdmVUZXN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvTWF0cml4UGFyYW1Bc1ByaW1pdGl2ZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTU3MWY5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L01hdHJpeFBhcmFtQXNQcmltaXRpdmVUZXN0LmphdmEKQEAgLTAsMCArMSwxMDQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5pbmplY3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5EZWZhdWx0VmFsdWU7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLk1hdHJpeFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVzcG9uc2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlcXVlc3RDb250ZXh0QnVpbGRlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIE1hdHJpeFBhcmFtQXNQcmltaXRpdmVUZXN0IGV4dGVuZHMgQWJzdHJhY3RUZXN0IHsKKworICAgIHB1YmxpYyBNYXRyaXhQYXJhbUFzUHJpbWl0aXZlVGVzdCgpIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbigKKyAgICAgICAgICAgICAgICBSZXNvdXJjZU1hdHJpeFByaW1pdGl2ZXMuY2xhc3MsCisgICAgICAgICAgICAgICAgUmVzb3VyY2VNYXRyaXhQcmltaXRpdmVzRGVmYXVsdE51bGwuY2xhc3MsCisgICAgICAgICAgICAgICAgUmVzb3VyY2VNYXRyaXhQcmltaXRpdmVzRGVmYXVsdC5jbGFzcywKKyAgICAgICAgICAgICAgICBSZXNvdXJjZU1hdHJpeFByaW1pdGl2ZXNEZWZhdWx0T3ZlcnJpZGUuY2xhc3MsCisgICAgICAgICAgICAgICAgUmVzb3VyY2VNYXRyaXhQcmltaXRpdmVXcmFwcGVycy5jbGFzcywKKyAgICAgICAgICAgICAgICBSZXNvdXJjZU1hdHJpeFByaW1pdGl2ZVdyYXBwZXJzRGVmYXVsdE51bGwuY2xhc3MsCisgICAgICAgICAgICAgICAgUmVzb3VyY2VNYXRyaXhQcmltaXRpdmVXcmFwcGVyc0RlZmF1bHQuY2xhc3MsCisgICAgICAgICAgICAgICAgUmVzb3VyY2VNYXRyaXhQcmltaXRpdmVXcmFwcGVyc0RlZmF1bHRPdmVycmlkZS5jbGFzcywKKyAgICAgICAgICAgICAgICBSZXNvdXJjZU1hdHJpeFByaW1pdGl2ZUxpc3QuY2xhc3MsCisgICAgICAgICAgICAgICAgUmVzb3VyY2VNYXRyaXhQcmltaXRpdmVMaXN0RGVmYXVsdEVtcHR5LmNsYXNzLAorICAgICAgICAgICAgICAgIFJlc291cmNlTWF0cml4UHJpbWl0aXZlTGlzdERlZmF1bHQuY2xhc3MsCisgICAgICAgICAgICAgICAgUmVzb3VyY2VNYXRyaXhQcmltaXRpdmVMaXN0RGVmYXVsdE92ZXJyaWRlLmNsYXNzCisgICAgICAgICk7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VNYXRyaXhQcmltaXRpdmVzIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYm9vbGVhbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQE1hdHJpeFBhcmFtKCJib29sZWFuIikgYm9vbGVhbiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2J5dGUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBNYXRyaXhQYXJhbSgiYnl0ZSIpIGJ5dGUgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEyNywgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2NoYXIiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBNYXRyaXhQYXJhbSgiY2hhciIpIGNoYXIgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCdjJywgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3Nob3J0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChATWF0cml4UGFyYW0oInNob3J0Iikgc2hvcnQgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMyNzY3LCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vaW50IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChATWF0cml4UGFyYW0oImludCIpIGludCB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMjE0NzQ4MzY0Nywgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2xvbmciKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBNYXRyaXhQYXJhbSgibG9uZyIpIGxvbmcgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDkyMjMzNzIwMzY4NTQ3NzU4MDdMLCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZmxvYXQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBNYXRyaXhQYXJhbSgiZmxvYXQiKSBmbG9hdCB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMy4xNDE1OTI2NWYsIHYsIDApOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9kb3VibGUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBNYXRyaXhQYXJhbSgiZG91YmxlIikgZG91YmxlIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzLjE0MTU5MjY1MzU4OTc5ZCwgdiwgMCk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi9kZWZhdWx0L251bGwiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VNYXRyaXhQcmltaXRpdmVzRGVmYXVsdE51bGwgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9ib29sZWFuIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChATWF0cml4UGFyYW0oImJvb2xlYW4iKSBib29sZWFuIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2J5dGUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBNYXRyaXhQYXJhbSgiYnl0ZSIpIGJ5dGUgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHYpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9jaGFyIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChATWF0cml4UGFyYW0oImNoYXIiKSBjaGFyIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vc2hvcnQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBNYXRyaXhQYXJhbSgic2hvcnQiKSBzaG9ydCB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2ludCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQE1hdHJpeFBhcmFtKCJpbnQiKSBpbnQgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHYpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9sb25nIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChATWF0cml4UGFyYW0oImxvbmciKSBsb25nIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwTCwgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Zsb2F0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChATWF0cml4UGFyYW0oImZsb2F0IikgZmxvYXQgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAuMGYsIHYsIDApOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9kb3VibGUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBNYXRyaXhQYXJhbSgiZG91YmxlIikgZG91YmxlIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLjBkLCB2LCAwKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL2RlZmF1bHQiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VNYXRyaXhQcmltaXRpdmVzRGVmYXVsdCB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Jvb2xlYW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBNYXRyaXhQYXJhbSgiYm9vbGVhbiIpIEBEZWZhdWx0VmFsdWUoInRydWUiKSBib29sZWFuIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYnl0ZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQE1hdHJpeFBhcmFtKCJieXRlIikgQERlZmF1bHRWYWx1ZSgiMTI3IikgYnl0ZSB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMTI3LCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vY2hhciIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQE1hdHJpeFBhcmFtKCJjaGFyIikgQERlZmF1bHRWYWx1ZSgiZCIpIGNoYXIgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCdkJywgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3Nob3J0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChATWF0cml4UGFyYW0oInNob3J0IikgQERlZmF1bHRWYWx1ZSgiMzI3NjciKSBzaG9ydCB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMzI3NjcsIHYpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9pbnQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBNYXRyaXhQYXJhbSgiaW50IikgQERlZmF1bHRWYWx1ZSgiMjE0NzQ4MzY0NyIpIGludCB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMjE0NzQ4MzY0Nywgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2xvbmciKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBNYXRyaXhQYXJhbSgibG9uZyIpIEBEZWZhdWx0VmFsdWUoIjkyMjMzNzIwMzY4NTQ3NzU4MDciKSBsb25nIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg5MjIzMzcyMDM2ODU0Nzc1ODA3TCwgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Zsb2F0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChATWF0cml4UGFyYW0oImZsb2F0IikgQERlZmF1bHRWYWx1ZSgiMy4xNDE1OTI2NSIpIGZsb2F0IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzLjE0MTU5MjY1ZiwgdiwgMCk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2RvdWJsZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQE1hdHJpeFBhcmFtKCJkb3VibGUiKSBARGVmYXVsdFZhbHVlKCIzLjE0MTU5MjY1MzU4OTc5IikgZG91YmxlIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzLjE0MTU5MjY1MzU4OTc5ZCwgdiwgMCk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi9kZWZhdWx0L292ZXJyaWRlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlTWF0cml4UHJpbWl0aXZlc0RlZmF1bHRPdmVycmlkZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Jvb2xlYW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBNYXRyaXhQYXJhbSgiYm9vbGVhbiIpIEBEZWZhdWx0VmFsdWUoImZhbHNlIikgYm9vbGVhbiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2J5dGUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBNYXRyaXhQYXJhbSgiYnl0ZSIpIEBEZWZhdWx0VmFsdWUoIjEiKSBieXRlIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxMjcsIHYpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9jaGFyIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChATWF0cml4UGFyYW0oImNoYXIiKSBARGVmYXVsdFZhbHVlKCIxIikgY2hhciB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoJ2MnLCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vc2hvcnQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBNYXRyaXhQYXJhbSgic2hvcnQiKSBARGVmYXVsdFZhbHVlKCIxIikgc2hvcnQgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMyNzY3LCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vaW50IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChATWF0cml4UGFyYW0oImludCIpIEBEZWZhdWx0VmFsdWUoIjEiKSBpbnQgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIxNDc0ODM2NDcsIHYpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9sb25nIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChATWF0cml4UGFyYW0oImxvbmciKSBARGVmYXVsdFZhbHVlKCIxIikgbG9uZyB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoOTIyMzM3MjAzNjg1NDc3NTgwN0wsIHYpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mbG9hdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQE1hdHJpeFBhcmFtKCJmbG9hdCIpIEBEZWZhdWx0VmFsdWUoIjAuMCIpIGZsb2F0IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzLjE0MTU5MjY1ZiwgdiwgMCk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2RvdWJsZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQE1hdHJpeFBhcmFtKCJkb3VibGUiKSBARGVmYXVsdFZhbHVlKCIwLjAiKSBkb3VibGUgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMuMTQxNTkyNjUzNTg5NzlkLCB2LCAwKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL3dyYXBwZXJzIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlTWF0cml4UHJpbWl0aXZlV3JhcHBlcnMgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9ib29sZWFuIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChATWF0cml4UGFyYW0oImJvb2xlYW4iKSBCb29sZWFuIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYnl0ZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQE1hdHJpeFBhcmFtKCJieXRlIikgQnl0ZSB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMTI3LCB2LmJ5dGVWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vY2hhciIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQE1hdHJpeFBhcmFtKCJjaGFyIikgQ2hhcmFjdGVyIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygnYycsIHYuY2hhclZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9zaG9ydCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQE1hdHJpeFBhcmFtKCJzaG9ydCIpIFNob3J0IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzMjc2Nywgdi5zaG9ydFZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9pbnQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBNYXRyaXhQYXJhbSgiaW50IikgSW50ZWdlciB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMjE0NzQ4MzY0Nywgdi5pbnRWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vbG9uZyIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQE1hdHJpeFBhcmFtKCJsb25nIikgTG9uZyB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoOTIyMzM3MjAzNjg1NDc3NTgwN0wsIHYubG9uZ1ZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mbG9hdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQE1hdHJpeFBhcmFtKCJmbG9hdCIpIEZsb2F0IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzLjE0MTU5MjY1ZiwgdiwgMCk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2RvdWJsZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQE1hdHJpeFBhcmFtKCJkb3VibGUiKSBEb3VibGUgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMuMTQxNTkyNjUzNTg5NzlkLCB2LCAwKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL3dyYXBwZXJzL2RlZmF1bHQvbnVsbCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZU1hdHJpeFByaW1pdGl2ZVdyYXBwZXJzRGVmYXVsdE51bGwgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9ib29sZWFuIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChATWF0cml4UGFyYW0oImJvb2xlYW4iKSBCb29sZWFuIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYnl0ZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQE1hdHJpeFBhcmFtKCJieXRlIikgQnl0ZSB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2NoYXIiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBNYXRyaXhQYXJhbSgiY2hhciIpIENoYXJhY3RlciB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3Nob3J0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChATWF0cml4UGFyYW0oInNob3J0IikgU2hvcnQgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIHYpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9pbnQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBNYXRyaXhQYXJhbSgiaW50IikgSW50ZWdlciB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2xvbmciKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBNYXRyaXhQYXJhbSgibG9uZyIpIExvbmcgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIHYpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mbG9hdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQE1hdHJpeFBhcmFtKCJmbG9hdCIpIEZsb2F0IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZG91YmxlIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChATWF0cml4UGFyYW0oImRvdWJsZSIpIERvdWJsZSB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi93cmFwcGVycy9kZWZhdWx0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlTWF0cml4UHJpbWl0aXZlV3JhcHBlcnNEZWZhdWx0IHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYm9vbGVhbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQE1hdHJpeFBhcmFtKCJib29sZWFuIikgQERlZmF1bHRWYWx1ZSgidHJ1ZSIpIEJvb2xlYW4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHYpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9ieXRlIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChATWF0cml4UGFyYW0oImJ5dGUiKSBARGVmYXVsdFZhbHVlKCIxMjciKSBCeXRlIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxMjcsIHYuYnl0ZVZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9jaGFyIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChATWF0cml4UGFyYW0oImNoYXIiKSBARGVmYXVsdFZhbHVlKCJjIikgQ2hhcmFjdGVyIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygnYycsIHYuY2hhclZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9zaG9ydCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQE1hdHJpeFBhcmFtKCJzaG9ydCIpIEBEZWZhdWx0VmFsdWUoIjMyNzY3IikgU2hvcnQgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMyNzY3LCB2LnNob3J0VmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2ludCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQE1hdHJpeFBhcmFtKCJpbnQiKSBARGVmYXVsdFZhbHVlKCIyMTQ3NDgzNjQ3IikgSW50ZWdlciB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMjE0NzQ4MzY0Nywgdi5pbnRWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vbG9uZyIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQE1hdHJpeFBhcmFtKCJsb25nIikgQERlZmF1bHRWYWx1ZSgiOTIyMzM3MjAzNjg1NDc3NTgwNyIpIExvbmcgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDkyMjMzNzIwMzY4NTQ3NzU4MDdMLCB2LmxvbmdWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZmxvYXQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBNYXRyaXhQYXJhbSgiZmxvYXQiKSBARGVmYXVsdFZhbHVlKCIzLjE0MTU5MjY1IikgRmxvYXQgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMuMTQxNTkyNjVmLCB2LCAwKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZG91YmxlIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChATWF0cml4UGFyYW0oImRvdWJsZSIpIEBEZWZhdWx0VmFsdWUoIjMuMTQxNTkyNjUzNTg5NzkiKSBEb3VibGUgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMuMTQxNTkyNjUzNTg5NzlkLCB2LCAwKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL3dyYXBwZXJzL2RlZmF1bHQvb3ZlcnJpZGUiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VNYXRyaXhQcmltaXRpdmVXcmFwcGVyc0RlZmF1bHRPdmVycmlkZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Jvb2xlYW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBNYXRyaXhQYXJhbSgiYm9vbGVhbiIpIEBEZWZhdWx0VmFsdWUoImZhbHNlIikgQm9vbGVhbiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2J5dGUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBNYXRyaXhQYXJhbSgiYnl0ZSIpIEBEZWZhdWx0VmFsdWUoIjEiKSBCeXRlIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxMjcsIHYuYnl0ZVZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9jaGFyIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChATWF0cml4UGFyYW0oImNoYXIiKSBARGVmYXVsdFZhbHVlKCIxIikgQ2hhcmFjdGVyIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygnYycsIHYuY2hhclZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9zaG9ydCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQE1hdHJpeFBhcmFtKCJzaG9ydCIpIEBEZWZhdWx0VmFsdWUoIjEiKSBTaG9ydCB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMzI3NjcsIHYuc2hvcnRWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vaW50IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChATWF0cml4UGFyYW0oImludCIpIEBEZWZhdWx0VmFsdWUoIjEiKSBJbnRlZ2VyIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyMTQ3NDgzNjQ3LCB2LmludFZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9sb25nIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChATWF0cml4UGFyYW0oImxvbmciKSBARGVmYXVsdFZhbHVlKCIxIikgTG9uZyB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoOTIyMzM3MjAzNjg1NDc3NTgwN0wsIHYubG9uZ1ZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mbG9hdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQE1hdHJpeFBhcmFtKCJmbG9hdCIpIEBEZWZhdWx0VmFsdWUoIjAuMCIpIEZsb2F0IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzLjE0MTU5MjY1ZiwgdiwgMCk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2RvdWJsZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQE1hdHJpeFBhcmFtKCJkb3VibGUiKSBARGVmYXVsdFZhbHVlKCIwLjAiKSBEb3VibGUgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMuMTQxNTkyNjUzNTg5NzlkLCB2LCAwKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL2xpc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VNYXRyaXhQcmltaXRpdmVMaXN0IHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYm9vbGVhbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRCb29sZWFuKEBNYXRyaXhQYXJhbSgiYm9vbGVhbiIpIExpc3Q8Qm9vbGVhbj4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHYuZ2V0KDApKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCB2LmdldCgxKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgdi5nZXQoMikpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9ieXRlIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldEJ5dGUoQE1hdHJpeFBhcmFtKCJieXRlIikgTGlzdDxCeXRlPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMTI3LCB2LmdldCgwKS5ieXRlVmFsdWUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMTI3LCB2LmdldCgxKS5ieXRlVmFsdWUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMTI3LCB2LmdldCgyKS5ieXRlVmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2NoYXIiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0Q2hhcmFjdGVyKEBNYXRyaXhQYXJhbSgiY2hhciIpIExpc3Q8Q2hhcmFjdGVyPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoJ2MnLCB2LmdldCgwKS5jaGFyVmFsdWUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoJ2MnLCB2LmdldCgxKS5jaGFyVmFsdWUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoJ2MnLCB2LmdldCgyKS5jaGFyVmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3Nob3J0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldFNob3J0KEBNYXRyaXhQYXJhbSgic2hvcnQiKSBMaXN0PFNob3J0PiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMzI3NjcsIHYuZ2V0KDApLnNob3J0VmFsdWUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMzI3NjcsIHYuZ2V0KDEpLnNob3J0VmFsdWUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMzI3NjcsIHYuZ2V0KDIpLnNob3J0VmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2ludCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRJbnRlZ2VyKEBNYXRyaXhQYXJhbSgiaW50IikgTGlzdDxJbnRlZ2VyPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMjE0NzQ4MzY0Nywgdi5nZXQoMCkuaW50VmFsdWUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMjE0NzQ4MzY0Nywgdi5nZXQoMSkuaW50VmFsdWUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMjE0NzQ4MzY0Nywgdi5nZXQoMikuaW50VmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2xvbmciKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0TG9uZyhATWF0cml4UGFyYW0oImxvbmciKSBMaXN0PExvbmc+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg5MjIzMzcyMDM2ODU0Nzc1ODA3TCwgdi5nZXQoMCkubG9uZ1ZhbHVlKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDkyMjMzNzIwMzY4NTQ3NzU4MDdMLCB2LmdldCgxKS5sb25nVmFsdWUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoOTIyMzM3MjAzNjg1NDc3NTgwN0wsIHYuZ2V0KDIpLmxvbmdWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZmxvYXQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0RmxvYXQoQE1hdHJpeFBhcmFtKCJmbG9hdCIpIExpc3Q8RmxvYXQ+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzLjE0MTU5MjY1Ziwgdi5nZXQoMCksIDApOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMuMTQxNTkyNjVmLCB2LmdldCgxKSwgMCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMy4xNDE1OTI2NWYsIHYuZ2V0KDIpLCAwKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZG91YmxlIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldERvdWJsZShATWF0cml4UGFyYW0oImRvdWJsZSIpIExpc3Q8RG91YmxlPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMy4xNDE1OTI2NTM1ODk3OWQsIHYuZ2V0KDApLCAwKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzLjE0MTU5MjY1MzU4OTc5ZCwgdi5nZXQoMSksIDApOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMuMTQxNTkyNjUzNTg5NzlkLCB2LmdldCgyKSwgMCk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi9saXN0L2RlZmF1bHQvbnVsbCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZU1hdHJpeFByaW1pdGl2ZUxpc3REZWZhdWx0RW1wdHkgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9ib29sZWFuIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldEJvb2xlYW4oQE1hdHJpeFBhcmFtKCJib29sZWFuIikgTGlzdDxCb29sZWFuPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdi5zaXplKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9ieXRlIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldEJ5dGUoQE1hdHJpeFBhcmFtKCJieXRlIikgTGlzdDxCeXRlPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdi5zaXplKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9jaGFyIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldENoYXJhY3RlcihATWF0cml4UGFyYW0oImNoYXIiKSBMaXN0PENoYXJhY3Rlcj4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHYuc2l6ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vc2hvcnQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0U2hvcnQoQE1hdHJpeFBhcmFtKCJzaG9ydCIpIExpc3Q8U2hvcnQ+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCB2LnNpemUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2ludCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRJbnRlZ2VyKEBNYXRyaXhQYXJhbSgiaW50IikgTGlzdDxJbnRlZ2VyPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdi5zaXplKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9sb25nIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldExvbmcoQE1hdHJpeFBhcmFtKCJsb25nIikgTGlzdDxMb25nPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdi5zaXplKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mbG9hdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRGbG9hdChATWF0cml4UGFyYW0oImZsb2F0IikgTGlzdDxGbG9hdD4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHYuc2l6ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZG91YmxlIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldERvdWJsZShATWF0cml4UGFyYW0oImRvdWJsZSIpIExpc3Q8RG91YmxlPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdi5zaXplKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvbGlzdC9kZWZhdWx0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlTWF0cml4UHJpbWl0aXZlTGlzdERlZmF1bHQgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9ib29sZWFuIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldEJvb2xlYW4oQE1hdHJpeFBhcmFtKCJib29sZWFuIikgQERlZmF1bHRWYWx1ZSgidHJ1ZSIpIExpc3Q8Qm9vbGVhbj4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHYuZ2V0KDApKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYnl0ZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRCeXRlKEBNYXRyaXhQYXJhbSgiYnl0ZSIpIEBEZWZhdWx0VmFsdWUoIjEyNyIpIExpc3Q8Qnl0ZT4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEyNywgdi5nZXQoMCkuYnl0ZVZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9jaGFyIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldENoYXJhY3RlcihATWF0cml4UGFyYW0oImNoYXIiKSBARGVmYXVsdFZhbHVlKCJjIikgTGlzdDxDaGFyYWN0ZXI+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygnYycsIHYuZ2V0KDApLmNoYXJWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vc2hvcnQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0U2hvcnQoQE1hdHJpeFBhcmFtKCJzaG9ydCIpIEBEZWZhdWx0VmFsdWUoIjMyNzY3IikgTGlzdDxTaG9ydD4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMyNzY3LCB2LmdldCgwKS5zaG9ydFZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9pbnQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0SW50ZWdlcihATWF0cml4UGFyYW0oImludCIpIEBEZWZhdWx0VmFsdWUoIjIxNDc0ODM2NDciKSBMaXN0PEludGVnZXI+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyMTQ3NDgzNjQ3LCB2LmdldCgwKS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vbG9uZyIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRMb25nKEBNYXRyaXhQYXJhbSgibG9uZyIpIEBEZWZhdWx0VmFsdWUoIjkyMjMzNzIwMzY4NTQ3NzU4MDciKSBMaXN0PExvbmc+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg5MjIzMzcyMDM2ODU0Nzc1ODA3TCwgdi5nZXQoMCkubG9uZ1ZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mbG9hdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRGbG9hdChATWF0cml4UGFyYW0oImZsb2F0IikgQERlZmF1bHRWYWx1ZSgiMy4xNDE1OTI2NSIpIExpc3Q8RmxvYXQ+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzLjE0MTU5MjY1Ziwgdi5nZXQoMCksIDApOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9kb3VibGUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0RG91YmxlKEBNYXRyaXhQYXJhbSgiZG91YmxlIikgQERlZmF1bHRWYWx1ZSgiMy4xNDE1OTI2NTM1ODk3OSIpIExpc3Q8RG91YmxlPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMy4xNDE1OTI2NTM1ODk3OWQsIHYuZ2V0KDApLCAwKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL2xpc3QvZGVmYXVsdC9vdmVycmlkZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZU1hdHJpeFByaW1pdGl2ZUxpc3REZWZhdWx0T3ZlcnJpZGUgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9ib29sZWFuIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldEJvb2xlYW4oQE1hdHJpeFBhcmFtKCJib29sZWFuIikgQERlZmF1bHRWYWx1ZSgiZmFsc2UiKSBMaXN0PEJvb2xlYW4+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCB2LmdldCgwKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2J5dGUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0Qnl0ZShATWF0cml4UGFyYW0oImJ5dGUiKSBARGVmYXVsdFZhbHVlKCIwIikgTGlzdDxCeXRlPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMTI3LCB2LmdldCgwKS5ieXRlVmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2NoYXIiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0Q2hhcmFjdGVyKEBNYXRyaXhQYXJhbSgiY2hhciIpIEBEZWZhdWx0VmFsdWUoIjAiKSBMaXN0PENoYXJhY3Rlcj4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCdjJywgdi5nZXQoMCkuY2hhclZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9zaG9ydCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRTaG9ydChATWF0cml4UGFyYW0oInNob3J0IikgQERlZmF1bHRWYWx1ZSgiMCIpIExpc3Q8U2hvcnQ+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzMjc2Nywgdi5nZXQoMCkuc2hvcnRWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vaW50IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldEludGVnZXIoQE1hdHJpeFBhcmFtKCJpbnQiKSBARGVmYXVsdFZhbHVlKCIwIikgTGlzdDxJbnRlZ2VyPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMjE0NzQ4MzY0Nywgdi5nZXQoMCkuaW50VmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2xvbmciKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0TG9uZyhATWF0cml4UGFyYW0oImxvbmciKSBARGVmYXVsdFZhbHVlKCIwIikgTGlzdDxMb25nPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoOTIyMzM3MjAzNjg1NDc3NTgwN0wsIHYuZ2V0KDApLmxvbmdWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZmxvYXQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0RmxvYXQoQE1hdHJpeFBhcmFtKCJmbG9hdCIpIEBEZWZhdWx0VmFsdWUoIjAuMCIpIExpc3Q8RmxvYXQ+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzLjE0MTU5MjY1Ziwgdi5nZXQoMCksIDApOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9kb3VibGUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0RG91YmxlKEBNYXRyaXhQYXJhbSgiZG91YmxlIikgQERlZmF1bHRWYWx1ZSgiMC4wIikgTGlzdDxEb3VibGU+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzLjE0MTU5MjY1MzU4OTc5ZCwgdi5nZXQoMCksIDApOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgX3Rlc3QoU3RyaW5nIHR5cGUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgcGFyYW0gPSAiOyIgKyB0eXBlICsgIj0iICsgdmFsdWU7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb250ZW50IiwgYXBwbHkoCisgICAgICAgICAgICAgICAgUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8iICsgcGFyYW0sICJHRVQiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFjY2VwdCgiYXBwbGljYXRpb24vIiArIHR5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKQorICAgICAgICApLmdldEVudGl0eSgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbnRlbnQiLCBhcHBseSgKKyAgICAgICAgICAgICAgICBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3dyYXBwZXJzIiArIHBhcmFtLCAiR0VUIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hY2NlcHQoImFwcGxpY2F0aW9uLyIgKyB0eXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkKKyAgICAgICAgKS5nZXRFbnRpdHkoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb250ZW50IiwgYXBwbHkoCisgICAgICAgICAgICAgICAgUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9saXN0IiArIHBhcmFtICsgcGFyYW0gKyBwYXJhbSwgIkdFVCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYWNjZXB0KCJhcHBsaWNhdGlvbi8iICsgdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpCisgICAgICAgICkuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIHZvaWQgX3Rlc3REZWZhdWx0KFN0cmluZyBiYXNlLCBTdHJpbmcgdHlwZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygiY29udGVudCIsIGFwcGx5KAorICAgICAgICAgICAgICAgIFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKGJhc2UgKyAiZGVmYXVsdC9udWxsIiwgIkdFVCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYWNjZXB0KCJhcHBsaWNhdGlvbi8iICsgdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpCisgICAgICAgICkuZ2V0RW50aXR5KCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygiY29udGVudCIsIGFwcGx5KAorICAgICAgICAgICAgICAgIFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKGJhc2UgKyAiZGVmYXVsdCIsICJHRVQiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFjY2VwdCgiYXBwbGljYXRpb24vIiArIHR5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKQorICAgICAgICApLmdldEVudGl0eSgpKTsKKworICAgICAgICBTdHJpbmcgcGFyYW0gPSAiOyIgKyB0eXBlICsgIj0iICsgdmFsdWU7CisgICAgICAgIGFzc2VydEVxdWFscygiY29udGVudCIsIGFwcGx5KAorICAgICAgICAgICAgICAgIFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKGJhc2UgKyAiZGVmYXVsdC9vdmVycmlkZSIgKyBwYXJhbSwgIkdFVCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYWNjZXB0KCJhcHBsaWNhdGlvbi8iICsgdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpCisgICAgICAgICkuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIHZvaWQgX3Rlc3REZWZhdWx0KFN0cmluZyB0eXBlLCBTdHJpbmcgdmFsdWUpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3REZWZhdWx0KCIvIiwgdHlwZSwgdmFsdWUpOworICAgIH0KKworICAgIHZvaWQgX3Rlc3RXcmFwcGVyc0RlZmF1bHQoU3RyaW5nIHR5cGUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdERlZmF1bHQoIi93cmFwcGVycy8iLCB0eXBlLCB2YWx1ZSk7CisgICAgfQorCisgICAgdm9pZCBfdGVzdExpc3REZWZhdWx0KFN0cmluZyB0eXBlLCBTdHJpbmcgdmFsdWUpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3REZWZhdWx0KCIvbGlzdC8iLCB0eXBlLCB2YWx1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Qm9vbGVhbigpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoImJvb2xlYW4iLCAidHJ1ZSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEJvb2xlYW5QcmltaXRpdmVzRGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3REZWZhdWx0KCJib29sZWFuIiwgInRydWUiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRCb29sZWFuUHJpbWl0aXZlV3JhcHBlckRlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0V3JhcHBlcnNEZWZhdWx0KCJib29sZWFuIiwgInRydWUiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRCb29sZWFuUHJpbWl0aXZlTGlzdERlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0TGlzdERlZmF1bHQoImJvb2xlYW4iLCAidHJ1ZSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEJ5dGUoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJieXRlIiwgIjEyNyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEJ5dGVQcmltaXRpdmVzRGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3REZWZhdWx0KCJieXRlIiwgIjEyNyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEJ5dGVQcmltaXRpdmVXcmFwcGVyc0RlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0V3JhcHBlcnNEZWZhdWx0KCJieXRlIiwgIjEyNyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEJ5dGVQcmltaXRpdmVMaXN0RGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RMaXN0RGVmYXVsdCgiYnl0ZSIsICIxMjciKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDaGFyYWN0ZXIoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJjaGFyIiwgImMiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDaGFyYWN0ZXJQcmltaXRpdmVzRGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3REZWZhdWx0KCJjaGFyIiwgImMiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDaGFyYWN0ZXJQcmltaXRpdmVXcmFwcGVyc0RlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0V3JhcHBlcnNEZWZhdWx0KCJjaGFyIiwgImMiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDaGFyYWN0ZXJQcmltaXRpdmVMaXN0RGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RMaXN0RGVmYXVsdCgiY2hhciIsICJjIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2hvcnQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJzaG9ydCIsICIzMjc2NyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFNob3J0UHJpbXRpdmVzRGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3REZWZhdWx0KCJzaG9ydCIsICIzMjc2NyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFNob3J0UHJpbXRpdmVXcmFwcGVyc0RlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0V3JhcHBlcnNEZWZhdWx0KCJzaG9ydCIsICIzMjc2NyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFNob3J0UHJpbXRpdmVMaXN0RGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RMaXN0RGVmYXVsdCgic2hvcnQiLCAiMzI3NjciKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJbnQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJpbnQiLCAiMjE0NzQ4MzY0NyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEludFByaW1pdGl2ZXNEZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdERlZmF1bHQoImludCIsICIyMTQ3NDgzNjQ3Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW50UHJpbWl0aXZlV3JhcHBlcnNEZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdFdyYXBwZXJzRGVmYXVsdCgiaW50IiwgIjIxNDc0ODM2NDciKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJbnRQcmltaXRpdmVMaXN0RGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RMaXN0RGVmYXVsdCgiaW50IiwgIjIxNDc0ODM2NDciKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRMb25nKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdCgibG9uZyIsICI5MjIzMzcyMDM2ODU0Nzc1ODA3Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TG9uZ1ByaW1pdGl2ZXNEZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdERlZmF1bHQoImxvbmciLCAiOTIyMzM3MjAzNjg1NDc3NTgwNyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldExvbmdQcmltaXRpdmVXcmFwcGVyc0RlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0V3JhcHBlcnNEZWZhdWx0KCJsb25nIiwgIjkyMjMzNzIwMzY4NTQ3NzU4MDciKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRMb25nUHJpbWl0aXZlTGlzdERlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0TGlzdERlZmF1bHQoImxvbmciLCAiOTIyMzM3MjAzNjg1NDc3NTgwNyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEZsb2F0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdCgiZmxvYXQiLCAiMy4xNDE1OTI2NSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEZsb2F0UHJpbWl0aXZlc0RlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0RGVmYXVsdCgiZmxvYXQiLCAiMy4xNDE1OTI2NSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEZsb2F0UHJpbWl0aXZlV3JhcHBlcnNEZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdFdyYXBwZXJzRGVmYXVsdCgiZmxvYXQiLCAiMy4xNDE1OTI2NSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEZsb2F0UHJpbWl0aXZlTGlzdERlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0TGlzdERlZmF1bHQoImZsb2F0IiwgIjMuMTQxNTkyNjUiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXREb3VibGUoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJkb3VibGUiLCAiMy4xNDE1OTI2NTM1ODk3OSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldERvdWJsZVByaW1pdGl2ZXNEZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdERlZmF1bHQoImRvdWJsZSIsICIzLjE0MTU5MjY1MzU4OTc5Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RG91YmxlUHJpbWl0aXZlV3JhcHBlcnNEZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdFdyYXBwZXJzRGVmYXVsdCgiZG91YmxlIiwgIjMuMTQxNTkyNjUzNTg5NzkiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXREb3VibGVQcmltaXRpdmVMaXN0RGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RMaXN0RGVmYXVsdCgiZG91YmxlIiwgIjMuMTQxNTkyNjUzNTg5NzkiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCYWRQcmltaXRpdmVWYWx1ZSgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2VDb250ZXh0ID0gYXBwbHkoCisgICAgICAgICAgICAgICAgUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi87aW50PWFiY2RlZiIsICJHRVQiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFjY2VwdCgiYXBwbGljYXRpb24vaW50IikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpCisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwNCwgcmVzcG9uc2VDb250ZXh0LmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCYWRQcmltaXRpdmVXcmFwcGVyVmFsdWUoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlQ29udGV4dCA9IGFwcGx5KAorICAgICAgICAgICAgICAgIFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvd3JhcHBlcnM7aW50PWFiY2RlZiIsICJHRVQiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFjY2VwdCgiYXBwbGljYXRpb24vaW50IikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpCisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwNCwgcmVzcG9uc2VDb250ZXh0LmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCYWRQcmltaXRpdmVMaXN0VmFsdWUoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlQ29udGV4dCA9IGFwcGx5KAorICAgICAgICAgICAgICAgIFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvbGlzdDtpbnQ9YWJjZGVmO2ludD1hYmNkZWYiLCAiR0VUIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hY2NlcHQoImFwcGxpY2F0aW9uL2ludCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscyg0MDQsIHJlc3BvbnNlQ29udGV4dC5nZXRTdGF0dXMoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L01hdHJpeFBhcmFtQXNTdHJpbmdUZXN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvTWF0cml4UGFyYW1Bc1N0cmluZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTk4N2U2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L01hdHJpeFBhcmFtQXNTdHJpbmdUZXN0LmphdmEKQEAgLTAsMCArMSwzNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLmluamVjdDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkRlZmF1bHRWYWx1ZTsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuTWF0cml4UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXF1ZXN0Q29udGV4dEJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorcHVibGljIGNsYXNzIE1hdHJpeFBhcmFtQXNTdHJpbmdUZXN0IGV4dGVuZHMgQWJzdHJhY3RUZXN0IHsKKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlU3RyaW5nIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQE1hdHJpeFBhcmFtKCJhcmcxIikgU3RyaW5nIGFyZzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE1hdHJpeFBhcmFtKCJhcmcyIikgU3RyaW5nIGFyZzIsIEBNYXRyaXhQYXJhbSgiYXJnMyIpIFN0cmluZyBhcmczKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCBhcmcxKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiYiIsIGFyZzIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJjIiwgYXJnMyk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyBkb1Bvc3QoQE1hdHJpeFBhcmFtKCJhcmcxIikgU3RyaW5nIGFyZzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBNYXRyaXhQYXJhbSgiYXJnMiIpIFN0cmluZyBhcmcyLCBATWF0cml4UGFyYW0oImFyZzMiKSBTdHJpbmcgYXJnMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHIpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiYSIsIGFyZzEpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJiIiwgYXJnMik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImMiLCBhcmczKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiY29udGVudCIsIHIpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlU3RyaW5nRW1wdHkgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChATWF0cml4UGFyYW0oImFyZzEiKSBTdHJpbmcgYXJnMSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBhcmcxKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVN0cmluZ0Fic2VudCB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBNYXRyaXhQYXJhbSgiYXJnMSIpIFN0cmluZyBhcmcxKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgYXJnMSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VTdHJpbmdMaXN0IHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vc3RyaW5nbGlzdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRTdHJpbmcoQE1hdHJpeFBhcmFtKCJhcmdzIikgTGlzdDxTdHJpbmc+IGFyZ3MpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiYSIsIGFyZ3MuZ2V0KDApKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiYiIsIGFyZ3MuZ2V0KDEpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiYyIsIGFyZ3MuZ2V0KDIpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vbGlzdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQE1hdHJpeFBhcmFtKCJhcmdzIikgTGlzdCBhcmdzKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmNsYXNzLCBhcmdzLmdldCgwKS5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiYSIsIGFyZ3MuZ2V0KDApKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuY2xhc3MsIGFyZ3MuZ2V0KDEpLmdldENsYXNzKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJiIiwgYXJncy5nZXQoMSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5jbGFzcywgYXJncy5nZXQoMikuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImMiLCBhcmdzLmdldCgyKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VTdHJpbmdMaXN0RW1wdHkgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9zdHJpbmdsaXN0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldFN0cmluZyhATWF0cml4UGFyYW0oImFyZ3MiKSBMaXN0PFN0cmluZz4gYXJncykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGFyZ3Muc2l6ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiIiwgYXJncy5nZXQoMCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBhcmdzLmdldCgxKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIGFyZ3MuZ2V0KDIpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVN0cmluZ051bGxEZWZhdWx0IHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQE1hdHJpeFBhcmFtKCJhcmcxIikgU3RyaW5nIGFyZzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE1hdHJpeFBhcmFtKCJhcmcyIikgU3RyaW5nIGFyZzIsIEBNYXRyaXhQYXJhbSgiYXJnMyIpIFN0cmluZyBhcmczKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgYXJnMSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgYXJnMik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgYXJnMyk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VTdHJpbmdEZWZhdWx0IHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoCisgICAgICAgICAgICAgICAgQE1hdHJpeFBhcmFtKCJhcmcxIikgQERlZmF1bHRWYWx1ZSgiYSIpIFN0cmluZyBhcmcxLAorICAgICAgICAgICAgICAgIEBNYXRyaXhQYXJhbSgiYXJnMiIpIEBEZWZhdWx0VmFsdWUoImIiKSBTdHJpbmcgYXJnMiwKKyAgICAgICAgICAgICAgICBATWF0cml4UGFyYW0oImFyZzMiKSBARGVmYXVsdFZhbHVlKCJjIikgU3RyaW5nIGFyZzMpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiYSIsIGFyZzEpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJiIiwgYXJnMik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImMiLCBhcmczKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVN0cmluZ0RlZmF1bHRPdmVycmlkZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KAorICAgICAgICAgICAgICAgIEBNYXRyaXhQYXJhbSgiYXJnMSIpIEBEZWZhdWx0VmFsdWUoImEiKSBTdHJpbmcgYXJnMSwKKyAgICAgICAgICAgICAgICBATWF0cml4UGFyYW0oImFyZzIiKSBARGVmYXVsdFZhbHVlKCJiIikgU3RyaW5nIGFyZzIsCisgICAgICAgICAgICAgICAgQE1hdHJpeFBhcmFtKCJhcmczIikgQERlZmF1bHRWYWx1ZSgiYyIpIFN0cmluZyBhcmczKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImQiLCBhcmcxKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZSIsIGFyZzIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJmIiwgYXJnMyk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VTdHJpbmdMaXN0RW1wdHlEZWZhdWx0IHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vc3RyaW5nbGlzdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgQE1hdHJpeFBhcmFtKCJhcmdzIikgTGlzdDxTdHJpbmc+IGFyZ3MpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBhcmdzLnNpemUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2xpc3QiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KAorICAgICAgICAgICAgICAgIEBNYXRyaXhQYXJhbSgiYXJncyIpIExpc3QgYXJncykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGFyZ3Muc2l6ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVN0cmluZ0xpc3REZWZhdWx0IHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vc3RyaW5nbGlzdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgQE1hdHJpeFBhcmFtKCJhcmdzIikgQERlZmF1bHRWYWx1ZSgiYSIpIExpc3Q8U3RyaW5nPiBhcmdzKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCBhcmdzLmdldCgwKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2xpc3QiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KAorICAgICAgICAgICAgICAgIEBNYXRyaXhQYXJhbSgiYXJncyIpIEBEZWZhdWx0VmFsdWUoImEiKSBMaXN0IGFyZ3MpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuY2xhc3MsIGFyZ3MuZ2V0KDApLmdldENsYXNzKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgYXJncy5nZXQoMCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlU3RyaW5nTGlzdERlZmF1bHRPdmVycmlkZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3N0cmluZ2xpc3QiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0U3RyaW5nKAorICAgICAgICAgICAgICAgIEBNYXRyaXhQYXJhbSgiYXJncyIpIEBEZWZhdWx0VmFsdWUoImEiKSBMaXN0PFN0cmluZz4gYXJncykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJiIiwgYXJncy5nZXQoMCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9saXN0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldCgKKyAgICAgICAgICAgICAgICBATWF0cml4UGFyYW0oImFyZ3MiKSBARGVmYXVsdFZhbHVlKCJhIikgTGlzdCBhcmdzKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmNsYXNzLCBhcmdzLmdldCgwKS5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiYiIsIGFyZ3MuZ2V0KDApKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdHZXQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlQ29udGV4dCA9IGdldFJlc3BvbnNlQ29udGV4dCgiLzthcmcxPWE7YXJnMj1iO2FyZzM9YyIpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlQ29udGV4dC5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nRW1wdHlHZXQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VTdHJpbmdFbXB0eS5jbGFzcyk7CisKKyAgICAgICAgX3Rlc3QoIi87YXJnMSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ0Fic2VudEdldCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZ0Fic2VudC5jbGFzcyk7CisKKyAgICAgICAgX3Rlc3QoIi8iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdQb3N0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBmaW5hbCBDb250YWluZXJSZXNwb25zZSByZXNwb25zZUNvbnRleHQgPSBhcHBseSgKKyAgICAgICAgICAgICAgICBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLzthcmcxPWE7YXJnMj1iO2FyZzM9YyIsICJQT1NUIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5lbnRpdHkoImNvbnRlbnQiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbnRlbnQiLCByZXNwb25zZUNvbnRleHQuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ0xpc3RHZXQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VTdHJpbmdMaXN0LmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbnRlbnQiLCBhcHBseSgKKyAgICAgICAgICAgICAgICBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLzthcmdzPWE7YXJncz1iO2FyZ3M9YyIsICJHRVQiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmVudGl0eSgiY29udGVudCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKQorICAgICAgICApLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdMaXN0RW1wdHlHZXQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VTdHJpbmdMaXN0RW1wdHkuY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscygiY29udGVudCIsIGFwcGx5KAorICAgICAgICAgICAgICAgIFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvO2FyZ3M7YXJnczthcmdzIiwgIkdFVCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYWNjZXB0KCJhcHBsaWNhdGlvbi9zdHJpbmdsaXN0IikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpCisgICAgICAgICkuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExpc3RHZXQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VTdHJpbmdMaXN0LmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbnRlbnQiLCBhcHBseSgKKyAgICAgICAgICAgICAgICBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLzthcmdzPWE7YXJncz1iO2FyZ3M9YyIsICJHRVQiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFjY2VwdCgiYXBwbGljYXRpb24vbGlzdCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKQorICAgICAgICApLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdOdWxsRGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZ051bGxEZWZhdWx0LmNsYXNzKTsKKworICAgICAgICBfdGVzdCgiLyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ0RlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VTdHJpbmdEZWZhdWx0LmNsYXNzKTsKKworICAgICAgICBfdGVzdCgiLyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ0RlZmF1bHRPdmVycmlkZSgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZ0RlZmF1bHRPdmVycmlkZS5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb250ZW50IiwgYXBwbHkoCisgICAgICAgICAgICAgICAgUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi87YXJnMT1kO2FyZzI9ZTthcmczPWYiLCAiR0VUIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpCisgICAgICAgICkuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ0xpc3RFbXB0eURlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VTdHJpbmdMaXN0RW1wdHlEZWZhdWx0LmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbnRlbnQiLCBhcHBseSgKKyAgICAgICAgICAgICAgICBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJHRVQiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFjY2VwdCgiYXBwbGljYXRpb24vc3RyaW5nbGlzdCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKQorICAgICAgICApLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0RW1wdHlEZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlU3RyaW5nTGlzdEVtcHR5RGVmYXVsdC5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb250ZW50IiwgYXBwbHkoCisgICAgICAgICAgICAgICAgUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8iLCAiR0VUIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hY2NlcHQoImFwcGxpY2F0aW9uL2xpc3QiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkKKyAgICAgICAgKS5nZXRFbnRpdHkoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nTGlzdERlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VTdHJpbmdMaXN0RGVmYXVsdC5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb250ZW50IiwgYXBwbHkoCisgICAgICAgICAgICAgICAgUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8iLCAiR0VUIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hY2NlcHQoImFwcGxpY2F0aW9uL3N0cmluZ2xpc3QiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkKKyAgICAgICAgKS5nZXRFbnRpdHkoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGlzdERlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VTdHJpbmdMaXN0RGVmYXVsdC5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb250ZW50IiwgYXBwbHkoCisgICAgICAgICAgICAgICAgUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8iLCAiR0VUIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hY2NlcHQoImFwcGxpY2F0aW9uL2xpc3QiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkKKyAgICAgICAgKS5nZXRFbnRpdHkoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGlzdERlZmF1bHRPdmVycmlkZSgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZ0xpc3REZWZhdWx0T3ZlcnJpZGUuY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscygiY29udGVudCIsIGFwcGx5KAorICAgICAgICAgICAgICAgIFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvO2FyZ3M9YiIsICJHRVQiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFjY2VwdCgiYXBwbGljYXRpb24vbGlzdCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKQorICAgICAgICApLmdldEVudGl0eSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvTWF0cml4UGFyYW1TdHJpbmdDb25zdHJ1Y3RvclRlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9NYXRyaXhQYXJhbVN0cmluZ0NvbnN0cnVjdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMmM2MmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvTWF0cml4UGFyYW1TdHJpbmdDb25zdHJ1Y3RvclRlc3QuamF2YQpAQCAtMCwwICsxLDIwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuaW5qZWN0OworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkRlZmF1bHRWYWx1ZTsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuTWF0cml4UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXNwb25zZTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIE1hdHJpeFBhcmFtU3RyaW5nQ29uc3RydWN0b3JUZXN0IGV4dGVuZHMgQWJzdHJhY3RUZXN0IHsKKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlU3RyaW5nIHsKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KAorICAgICAgICAgICAgICAgIEBNYXRyaXhQYXJhbSgiYXJnMSIpIEJpZ0RlY2ltYWwgYXJnMSwKKyAgICAgICAgICAgICAgICBATWF0cml4UGFyYW0oImFyZzIiKSBCaWdJbnRlZ2VyIGFyZzIsCisgICAgICAgICAgICAgICAgQE1hdHJpeFBhcmFtKCJhcmczIikgVVJJIGFyZzMpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMy4xNDUiLCBhcmcxLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIzMTQ1IiwgYXJnMi50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL3Rlc3QiLCBhcmczLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlU3RyaW5nTGlzdCB7CisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldFN0cmluZyhATWF0cml4UGFyYW0oImFyZ3MiKSBMaXN0PEJpZ0RlY2ltYWw+IGFyZ3MpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMy4xNDUiLCBhcmdzLmdldCgwKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMi43MTgiLCBhcmdzLmdldCgxKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMS42MTgiLCBhcmdzLmdldCgyKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVN0cmluZ0xpc3RFbXB0eSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldFN0cmluZyhATWF0cml4UGFyYW0oImFyZ3MiKSBMaXN0PEJpZ0RlY2ltYWw+IGFyZ3MpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzLCBhcmdzLnNpemUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgYXJncy5nZXQoMCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIGFyZ3MuZ2V0KDEpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBhcmdzLmdldCgyKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VTdHJpbmdOdWxsRGVmYXVsdCB7CisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldCgKKyAgICAgICAgICAgICAgICBATWF0cml4UGFyYW0oImFyZzEiKSBCaWdEZWNpbWFsIGFyZzEpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBhcmcxKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVN0cmluZ0RlZmF1bHQgeworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoCisgICAgICAgICAgICAgICAgQE1hdHJpeFBhcmFtKCJhcmcxIikgQERlZmF1bHRWYWx1ZSgiMy4xNDUiKSBCaWdEZWNpbWFsIGFyZzEpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMy4xNDUiLCBhcmcxLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlU3RyaW5nRGVmYXVsdE92ZXJyaWRlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KAorICAgICAgICAgICAgICAgIEBNYXRyaXhQYXJhbSgiYXJnMSIpIEBEZWZhdWx0VmFsdWUoIjMuMTQ1IikgQmlnRGVjaW1hbCBhcmcxKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjIuNzE4IiwgYXJnMS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVN0cmluZ0xpc3RFbXB0eURlZmF1bHQgeworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRTdHJpbmcoQE1hdHJpeFBhcmFtKCJhcmdzIikgTGlzdDxCaWdEZWNpbWFsPiBhcmdzKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgYXJncy5zaXplKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlU3RyaW5nTGlzdERlZmF1bHQgeworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgQE1hdHJpeFBhcmFtKCJhcmdzIikgQERlZmF1bHRWYWx1ZSgiMy4xNDUiKSBMaXN0PEJpZ0RlY2ltYWw+IGFyZ3MpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMy4xNDUiLCBhcmdzLmdldCgwKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVN0cmluZ0xpc3REZWZhdWx0T3ZlcnJpZGUgeworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgQE1hdHJpeFBhcmFtKCJhcmdzIikgQERlZmF1bHRWYWx1ZSgiMy4xNDUiKSBMaXN0PEJpZ0RlY2ltYWw+IGFyZ3MpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMi43MTgiLCBhcmdzLmdldCgwKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdDb25zdHJ1Y3RvckdldCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgX3Rlc3QoIi87YXJnMT0zLjE0NTthcmcyPTMxNDU7YXJnMz1odHRwOiUyRiUyRnRlc3QiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdDb25zdHJ1Y3Rvckxpc3RHZXQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VTdHJpbmdMaXN0LmNsYXNzKTsKKworICAgICAgICBfdGVzdCgiLzthcmdzPTMuMTQ1O2FyZ3M9Mi43MTg7YXJncz0xLjYxOCIsICJhcHBsaWNhdGlvbi9zdHJpbmdsaXN0Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nQ29uc3RydWN0b3JMaXN0RW1wdHlHZXQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VTdHJpbmdMaXN0RW1wdHkuY2xhc3MpOworCisgICAgICAgIF90ZXN0KCIvO2FyZ3M7YXJnczthcmdzIiwgImFwcGxpY2F0aW9uL3N0cmluZ2xpc3QiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdDb25zdHJ1Y3Rvck51bGxEZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlU3RyaW5nTnVsbERlZmF1bHQuY2xhc3MpOworCisgICAgICAgIF90ZXN0KCIvIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nQ29uc3RydWN0b3JEZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlU3RyaW5nRGVmYXVsdC5jbGFzcyk7CisKKyAgICAgICAgX3Rlc3QoIi8iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdDb25zdHJ1Y3RvckRlZmF1bHRPdmVycmlkZSgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZ0RlZmF1bHQuY2xhc3MpOworCisgICAgICAgIF90ZXN0KCIvO2FyZ3M9Mi43MTgiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdDb25zdHJ1Y3Rvckxpc3ROdWxsRGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZ0xpc3RFbXB0eURlZmF1bHQuY2xhc3MpOworCisgICAgICAgIF90ZXN0KCIvIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nQ29uc3RydWN0b3JMaXN0RGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZ0xpc3REZWZhdWx0LmNsYXNzKTsKKworICAgICAgICBfdGVzdCgiLyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ0NvbnN0cnVjdG9yTGlzdERlZmF1bHRPdmVycmlkZSgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZ0xpc3REZWZhdWx0T3ZlcnJpZGUuY2xhc3MpOworCisgICAgICAgIF90ZXN0KCIvO2FyZ3M9Mi43MTgiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCYWRTdHJpbmdDb25zdHJ1Y3RvclZhbHVlKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBmaW5hbCBDb250YWluZXJSZXNwb25zZSByZXNwb25zZUNvbnRleHQgPSBnZXRSZXNwb25zZUNvbnRleHQoIi87YXJnMT1BQkNERUY7YXJnMj0zMTQ1O2FyZzM9aHR0cDolMkYlMkZ0ZXN0Iik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwNCwgcmVzcG9uc2VDb250ZXh0LmdldFN0YXR1cygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvUGFyYW1Db252ZXJ0ZXJJbnRlcm5hbFRlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9QYXJhbUNvbnZlcnRlckludGVybmFsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNGMzOTMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvUGFyYW1Db252ZXJ0ZXJJbnRlcm5hbFRlc3QuamF2YQpAQCAtMCwwICsxLDM4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuaW5qZWN0OworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5QYXJhbWV0ZXJpemVkVHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5EZWZhdWx0VmFsdWU7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLkhlYWRlclBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5QYXJhbUNvbnZlcnRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUGFyYW1Db252ZXJ0ZXJQcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5FeHRyYWN0b3JFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5SZWZsZWN0aW9uSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5DbGFzc1R5cGVQYWlyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXF1ZXN0Q29udGV4dEJ1aWxkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiBUZXN0cyB7QGxpbmsgUGFyYW1Db252ZXJ0ZXIgcGFyYW0gY29udmVydGVyc30uCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgY2xhc3MgUGFyYW1Db252ZXJ0ZXJJbnRlcm5hbFRlc3QgZXh0ZW5kcyBBYnN0cmFjdFRlc3QgeworCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQmFkRGF0ZVJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQFF1ZXJ5UGFyYW0oImQiKSBmaW5hbCBEYXRlIGQpIHsKKyAgICAgICAgICAgIHJldHVybiAiREFURSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCYWREYXRlUmVzb3VyY2UoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oQmFkRGF0ZVJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2VDb250ZXh0ID0gZ2V0UmVzcG9uc2VDb250ZXh0KFVyaUJ1aWxkZXIuZnJvbVBhdGgoIi8iKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJkIiwgIjEyMyIpLmJ1aWxkKCkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwNCwgcmVzcG9uc2VDb250ZXh0LmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCYWRFbnVtUmVzb3VyY2UgeworCisgICAgICAgIHB1YmxpYyBlbnVtIEFCQyB7CisgICAgICAgICAgICBBLCBCLCBDCisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQFF1ZXJ5UGFyYW0oImQiKSBmaW5hbCBBQkMgZCkgeworICAgICAgICAgICAgcmV0dXJuICJFTlVNIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJhZEVudW1SZXNvdXJjZSgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihCYWRFbnVtUmVzb3VyY2UuY2xhc3MpOworICAgICAgICBmaW5hbCBDb250YWluZXJSZXNwb25zZSByZXNwb25zZUNvbnRleHQgPSBnZXRSZXNwb25zZUNvbnRleHQoVXJpQnVpbGRlci5mcm9tUGF0aCgiLyIpCisgICAgICAgICAgICAgICAgLnF1ZXJ5UGFyYW0oImQiLCAiMTIzIikuYnVpbGQoKS50b1N0cmluZygpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNDA0LCByZXNwb25zZUNvbnRleHQuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVVJJU3RyaW5nUmVhZGVyUHJvdmlkZXIgaW1wbGVtZW50cyBQYXJhbUNvbnZlcnRlclByb3ZpZGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIDxUPiBQYXJhbUNvbnZlcnRlcjxUPiBnZXRDb252ZXJ0ZXIoZmluYWwgQ2xhc3M8VD4gcmF3VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zKSB7CisgICAgICAgICAgICBpZiAocmF3VHlwZSAhPSBVUkkuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9ub2luc3BlY3Rpb24gdW5jaGVja2VkCisgICAgICAgICAgICByZXR1cm4gKFBhcmFtQ29udmVydGVyPFQ+KSBuZXcgUGFyYW1Db252ZXJ0ZXI8VVJJPigpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgVVJJIGZyb21TdHJpbmcoZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVVJJLmNyZWF0ZSh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpYWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeHRyYWN0b3JFeGNlcHRpb24oaWFlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoZmluYWwgVVJJIHZhbHVlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJhZFVSSVJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQFF1ZXJ5UGFyYW0oImQiKSBmaW5hbCBVUkkgZCkgeworICAgICAgICAgICAgcmV0dXJuICJVUkkiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFkVVJJUmVzb3VyY2UoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oQmFkVVJJUmVzb3VyY2UuY2xhc3MsIFVSSVN0cmluZ1JlYWRlclByb3ZpZGVyLmNsYXNzKTsKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2VDb250ZXh0ID0gZ2V0UmVzcG9uc2VDb250ZXh0KFVyaUJ1aWxkZXIuZnJvbVBhdGgoIi8iKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJkIiwgIjo6OjoxMjMiKS5idWlsZCgpLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDA0LCByZXNwb25zZUNvbnRleHQuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTGlzdE9mU3RyaW5nUmVhZGVyUHJvdmlkZXIgaW1wbGVtZW50cyBQYXJhbUNvbnZlcnRlclByb3ZpZGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIDxUPiBQYXJhbUNvbnZlcnRlcjxUPiBnZXRDb252ZXJ0ZXIoZmluYWwgQ2xhc3M8VD4gcmF3VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zKSB7CisgICAgICAgICAgICBpZiAocmF3VHlwZSAhPSBMaXN0LmNsYXNzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChnZW5lcmljVHlwZSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRUeXBlKSB7CisgICAgICAgICAgICAgICAgZmluYWwgUGFyYW1ldGVyaXplZFR5cGUgcGFyYW1ldGVyaXplZFR5cGUgPSAoUGFyYW1ldGVyaXplZFR5cGUpIGdlbmVyaWNUeXBlOworICAgICAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJpemVkVHlwZS5nZXRBY3R1YWxUeXBlQXJndW1lbnRzKCkubGVuZ3RoICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlcml6ZWRUeXBlLmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKVswXSAhPSBTdHJpbmcuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9ub2luc3BlY3Rpb24gdW5jaGVja2VkCisgICAgICAgICAgICByZXR1cm4gKFBhcmFtQ29udmVydGVyPFQ+KSBuZXcgUGFyYW1Db252ZXJ0ZXI8TGlzdDxTdHJpbmc+PigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGZyb21TdHJpbmcoZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KHZhbHVlLnNwbGl0KCIsIikpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoZmluYWwgTGlzdDxTdHJpbmc+IHZhbHVlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTGlzdE9mU3RyaW5nUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChAUXVlcnlQYXJhbSgibCIpIGZpbmFsIExpc3Q8TGlzdDxTdHJpbmc+PiBsKSB7CisgICAgICAgICAgICByZXR1cm4gbC50b1N0cmluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGlzdE9mU3RyaW5nUmVhZGVyUHJvdmlkZXIoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oTGlzdE9mU3RyaW5nUmVzb3VyY2UuY2xhc3MsIExpc3RPZlN0cmluZ1JlYWRlclByb3ZpZGVyLmNsYXNzKTsKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2VDb250ZXh0ID0gZ2V0UmVzcG9uc2VDb250ZXh0KFVyaUJ1aWxkZXIuZnJvbVBhdGgoIi8iKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJsIiwgIjEsMiwzIikuYnVpbGQoKS50b1N0cmluZygpKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgcyA9IChTdHJpbmcpIHJlc3BvbnNlQ29udGV4dC5nZXRFbnRpdHkoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChBcnJheXMuYXNMaXN0KCIxIiwgIjIiLCAiMyIpKS50b1N0cmluZygpLCBzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEludGVnZXJMaXN0Q29udmVydGVyUHJvdmlkZXIgaW1wbGVtZW50cyBQYXJhbUNvbnZlcnRlclByb3ZpZGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIDxUPiBQYXJhbUNvbnZlcnRlcjxUPiBnZXRDb252ZXJ0ZXIoZmluYWwgQ2xhc3M8VD4gcmF3VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zKSB7CisgICAgICAgICAgICBpZiAocmF3VHlwZSA9PSBMaXN0LmNsYXNzKSB7CisgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxDbGFzc1R5cGVQYWlyPiB0eXBlUGFpcnMgPSBSZWZsZWN0aW9uSGVscGVyLmdldFR5cGVBcmd1bWVudEFuZENsYXNzKGdlbmVyaWNUeXBlKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBDbGFzc1R5cGVQYWlyIHR5cGVQYWlyID0gKHR5cGVQYWlycy5zaXplKCkgPT0gMSkgPyB0eXBlUGFpcnMuZ2V0KDApIDogbnVsbDsKKworICAgICAgICAgICAgICAgIGlmICh0eXBlUGFpciAhPSBudWxsICYmIHR5cGVQYWlyLnJhd0NsYXNzKCkgPT0gSW50ZWdlci5jbGFzcykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBhcmFtQ29udmVydGVyPFQ+KCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgVCBmcm9tU3RyaW5nKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiB2YWx1ZXMgPSBBcnJheXMuYXNMaXN0KHZhbHVlLnNwbGl0KCIsIikpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJhd1R5cGUuY2FzdCh2YWx1ZXMuc3RyZWFtKCkubWFwKEludGVnZXI6OnZhbHVlT2YpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoZmluYWwgVCB2YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbnRlZ2VyTGlzdFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJ7cGF0aH0iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldChAUGF0aFBhcmFtKCJwYXRoIikgZmluYWwgTGlzdDxJbnRlZ2VyPiBwYXRocywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQFF1ZXJ5UGFyYW0oInF1ZXJ5IikgZmluYWwgTGlzdDxJbnRlZ2VyPiBxdWVyaWVzKSB7CisgICAgICAgICAgICBmaW5hbCBMaXN0PEludGVnZXI+IGludGVyc2VjdGlvbiA9IG5ldyBBcnJheUxpc3Q8PihwYXRocyk7CisgICAgICAgICAgICBpbnRlcnNlY3Rpb24ucmV0YWluQWxsKHF1ZXJpZXMpOworICAgICAgICAgICAgcmV0dXJuIGludGVyc2VjdGlvbi50b1N0cmluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tTGlzdFBhcmFtQ29udmVydGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oSW50ZWdlckxpc3RSZXNvdXJjZS5jbGFzcywgSW50ZWdlckxpc3RDb252ZXJ0ZXJQcm92aWRlci5jbGFzcyk7CisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlQ29udGV4dCA9IGdldFJlc3BvbnNlQ29udGV4dChVcmlCdWlsZGVyLmZyb21QYXRoKCIvMSwyLDMsNCw1IikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgicXVlcnkiLCAiMyw0LDUsNiw3IikuYnVpbGQoKS50b1N0cmluZygpKTsKKworICAgICAgICAvL25vaW5zcGVjdGlvbiB1bmNoZWNrZWQKKyAgICAgICAgYXNzZXJ0VGhhdCgoU3RyaW5nKSByZXNwb25zZUNvbnRleHQuZ2V0RW50aXR5KCksIGlzKCJbMywgNCwgNV0iKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RWFnZXJDb252ZXJ0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIobmV3IFJlc291cmNlQ29uZmlnKE15RWFnZXJQYXJhbVByb3ZpZGVyLmNsYXNzLCBSZXNvdXJjZS5jbGFzcykpOworICAgICAgICAgICAgZmFpbCgiRXh0cmFjdG9yRXhjZXB0aW9uIGV4cGVjdGVkLiIpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBFeHRyYWN0b3JFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgICAgIC8vIG9rCisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMYXp5Q29udmVydGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbiA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIoCisgICAgICAgICAgICAgICAgbmV3IFJlc291cmNlQ29uZmlnKE15TGF6eVBhcmFtUHJvdmlkZXIuY2xhc3MsIFJlc291cmNlLmNsYXNzKSk7CisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gYXBwbGljYXRpb24uYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9yZXNvdXJjZSIsICJHRVQiKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGF0IHRoZSBEYXRlUHJvdmlkZXIgaXMgdXNlZCBmb3IgZGF0ZSBzdHJpbmcgY29udmVyc2lvbiBpbnN0ZWFkIG9mCisgICAgICogc3RyaW5nIGNvbnN0cnVjdG9yIHRoYXQgd291bGQgYmUgaW52b2tpbmcgZGVwcmVjYXRlZCBEYXRlKFN0cmluZykgY29uc3RydWN0b3IuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGF0ZVBhcmFtQ29udmVydGVySXNDaG9zZW5Gb3JEYXRlU3RyaW5nKCkgeworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKCk7CisgICAgICAgIGZpbmFsIFBhcmFtQ29udmVydGVyPERhdGU+IGNvbnZlcnRlciA9CisgICAgICAgICAgICAgICAgbmV3IFBhcmFtQ29udmVydGVycy5BZ2dyZWdhdGVkUHJvdmlkZXIoKS5nZXRDb252ZXJ0ZXIoRGF0ZS5jbGFzcywgRGF0ZS5jbGFzcywgbnVsbCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGRhdGUgY29udmVydGVyIHByb3ZpZGVyIGNsYXNzIiwKKyAgICAgICAgICAgICAgICBQYXJhbUNvbnZlcnRlcnMuRGF0ZVByb3ZpZGVyLmNsYXNzLCBjb252ZXJ0ZXIuZ2V0Q2xhc3MoKS5nZXRFbmNsb3NpbmdDbGFzcygpKTsKKyAgICB9CisKKyAgICBAUGF0aCgicmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyB3cm9uZ0RlZmF1bHRWYWx1ZShASGVhZGVyUGFyYW0oImhlYWRlciIpIEBEZWZhdWx0VmFsdWUoImZhaWwiKSBmaW5hbCBNeUJlYW4gaGVhZGVyKSB7CisgICAgICAgICAgICByZXR1cm4gImEiOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUVhZ2VyUGFyYW1Qcm92aWRlciBpbXBsZW1lbnRzIFBhcmFtQ29udmVydGVyUHJvdmlkZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgPFQ+IFBhcmFtQ29udmVydGVyPFQ+IGdldENvbnZlcnRlcihmaW5hbCBDbGFzczxUPiByYXdUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgICAgIGlmIChyYXdUeXBlICE9IE15QmVhbi5jbGFzcykgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL25vaW5zcGVjdGlvbiB1bmNoZWNrZWQKKyAgICAgICAgICAgIHJldHVybiAoUGFyYW1Db252ZXJ0ZXI8VD4pIG5ldyBNeUVhZ2VyUGFyYW1Db252ZXJ0ZXIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlMYXp5UGFyYW1Qcm92aWRlciBpbXBsZW1lbnRzIFBhcmFtQ29udmVydGVyUHJvdmlkZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgPFQ+IFBhcmFtQ29udmVydGVyPFQ+IGdldENvbnZlcnRlcihmaW5hbCBDbGFzczxUPiByYXdUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgICAgIGlmIChyYXdUeXBlICE9IE15QmVhbi5jbGFzcykgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL25vaW5zcGVjdGlvbiB1bmNoZWNrZWQKKyAgICAgICAgICAgIHJldHVybiAoUGFyYW1Db252ZXJ0ZXI8VD4pIG5ldyBNeUxhenlQYXJhbUNvbnZlcnRlcigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUFic3RyYWN0UGFyYW1Db252ZXJ0ZXIgaW1wbGVtZW50cyBQYXJhbUNvbnZlcnRlcjxNeUJlYW4+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE15QmVhbiBmcm9tU3RyaW5nKGZpbmFsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlN1cHBsaWVkIHZhbHVlIGlzIG51bGwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgiZmFpbCIuZXF1YWxzKHZhbHVlKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJmYWlsIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBNeUJlYW4gbXlCZWFuID0gbmV3IE15QmVhbigpOworICAgICAgICAgICAgbXlCZWFuLnNldFZhbHVlKCIqIiArIHZhbHVlICsgIioiKTsKKyAgICAgICAgICAgIHJldHVybiBteUJlYW47CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZyhmaW5hbCBNeUJlYW4gYmVhbikgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gIio6IiArIGJlYW4uZ2V0VmFsdWUoKSArICI6KiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15RWFnZXJQYXJhbUNvbnZlcnRlciBleHRlbmRzIE15QWJzdHJhY3RQYXJhbUNvbnZlcnRlciB7CisgICAgfQorCisgICAgQFBhcmFtQ29udmVydGVyLkxhenkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15TGF6eVBhcmFtQ29udmVydGVyIGV4dGVuZHMgTXlBYnN0cmFjdFBhcmFtQ29udmVydGVyIHsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15QmVhbiB7CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKyAgICAgICAgcHVibGljIE15QmVhbigpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJNeUJlYW57IgorICAgICAgICAgICAgICAgICAgICArICJ2YWx1ZT0nIiArIHZhbHVlICsgJ1wnJworICAgICAgICAgICAgICAgICAgICArICd9JzsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L1BhcmFtRXhjZXB0aW9uTWFwcGluZ1Rlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9QYXJhbUV4Y2VwdGlvbk1hcHBpbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRmNmRlNAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9QYXJhbUV4Y2VwdGlvbk1hcHBpbmdUZXN0LmphdmEKQEAgLTAsMCArMSwyODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLmluamVjdDsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5Db29raWVQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5EZWZhdWx0VmFsdWU7CitpbXBvcnQgamF2YXgud3MucnMuRm9ybVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5IZWFkZXJQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5NYXRyaXhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlc3BvbnNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvb2tpZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZvcm07CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LkV4Y2VwdGlvbk1hcHBlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUGFyYW1FeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlcXVlc3RDb250ZXh0QnVpbGRlcjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBOb3Qgc3VyZSB3aGV0aGVyIHRoaXMgaXMgcmVsZXZhbnQgYW55bW9yZS4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKK3B1YmxpYyBjbGFzcyBQYXJhbUV4Y2VwdGlvbk1hcHBpbmdUZXN0IGV4dGVuZHMgQWJzdHJhY3RUZXN0IHsKKworICAgIHB1YmxpYyBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgQmFzZUV4Y2VwdGlvbk1hcHBlcjxUIGV4dGVuZHMgUGFyYW1FeGNlcHRpb24+IGltcGxlbWVudHMgRXhjZXB0aW9uTWFwcGVyPFQ+IHsKKworICAgICAgICBwdWJsaWMgUmVzcG9uc2UgdG9SZXNwb25zZShUIGV4Y2VwdGlvbiwgU3RyaW5nIGVudGl0eSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4IiwgZXhjZXB0aW9uLmdldFBhcmFtZXRlck5hbWUoKSk7CisKKyAgICAgICAgICAgIC8vIHBhdGggcGFyYW0gYW5kIGZvcm0gcGFyYW0gY2FuIGJlIGludGVnZXJzIGluIHRoaXMgdGVzdCwgdGh1cyBkaWZmZXJlbnQgZGVmYXVsdCB2YWx1ZQorICAgICAgICAgICAgaWYgKCFleGNlcHRpb24uZ2V0UGFyYW1ldGVyVHlwZSgpLmVxdWFscyhQYXRoUGFyYW0uY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICYmICFleGNlcHRpb24uZ2V0UGFyYW1ldGVyVHlwZSgpLmVxdWFscyhGb3JtUGFyYW0uY2xhc3MpKSB7CisKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImRlZmF1bHQiLCBleGNlcHRpb24uZ2V0RGVmYXVsdFN0cmluZ1ZhbHVlKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGV4Y2VwdGlvbi5nZXREZWZhdWx0U3RyaW5nVmFsdWUoKS5lcXVhbHMoImRlZmF1bHQiKSB8fCBleGNlcHRpb24uZ2V0RGVmYXVsdFN0cmluZ1ZhbHVlKCkuZXF1YWxzKCIxIikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLmZyb21SZXNwb25zZShleGNlcHRpb24uZ2V0UmVzcG9uc2UoKSkuZW50aXR5KGVudGl0eSkuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGFyYW1FeGNlcHRpb25NYXBwZXIgZXh0ZW5kcyBCYXNlRXhjZXB0aW9uTWFwcGVyPFBhcmFtRXhjZXB0aW9uPiB7CisKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHRvUmVzcG9uc2UoUGFyYW1FeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gdG9SZXNwb25zZShleGNlcHRpb24sICJwYXJhbSIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBVcmlFeGNlcHRpb25NYXBwZXIgZXh0ZW5kcyBCYXNlRXhjZXB0aW9uTWFwcGVyPFBhcmFtRXhjZXB0aW9uLlVyaVBhcmFtRXhjZXB0aW9uPiB7CisKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHRvUmVzcG9uc2UoUGFyYW1FeGNlcHRpb24uVXJpUGFyYW1FeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gdG9SZXNwb25zZShleGNlcHRpb24sICJ1cmkiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGF0aEV4Y2VwdGlvbk1hcHBlciBleHRlbmRzIEJhc2VFeGNlcHRpb25NYXBwZXI8UGFyYW1FeGNlcHRpb24uUGF0aFBhcmFtRXhjZXB0aW9uPiB7CisKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHRvUmVzcG9uc2UoUGFyYW1FeGNlcHRpb24uUGF0aFBhcmFtRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIHRvUmVzcG9uc2UoZXhjZXB0aW9uLCAicGF0aCIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNYXRyaXhFeGNlcHRpb25NYXBwZXIgZXh0ZW5kcyBCYXNlRXhjZXB0aW9uTWFwcGVyPFBhcmFtRXhjZXB0aW9uLk1hdHJpeFBhcmFtRXhjZXB0aW9uPiB7CisKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHRvUmVzcG9uc2UoUGFyYW1FeGNlcHRpb24uTWF0cml4UGFyYW1FeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gdG9SZXNwb25zZShleGNlcHRpb24sICJtYXRyaXgiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUXVlcnlFeGNlcHRpb25NYXBwZXIgZXh0ZW5kcyBCYXNlRXhjZXB0aW9uTWFwcGVyPFBhcmFtRXhjZXB0aW9uLlF1ZXJ5UGFyYW1FeGNlcHRpb24+IHsKKworICAgICAgICBwdWJsaWMgUmVzcG9uc2UgdG9SZXNwb25zZShQYXJhbUV4Y2VwdGlvbi5RdWVyeVBhcmFtRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIHRvUmVzcG9uc2UoZXhjZXB0aW9uLCAicXVlcnkiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MKKyAgICBDb29raWVFeGNlcHRpb25NYXBwZXIgZXh0ZW5kcyBCYXNlRXhjZXB0aW9uTWFwcGVyPFBhcmFtRXhjZXB0aW9uLkNvb2tpZVBhcmFtRXhjZXB0aW9uPiB7CisKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHRvUmVzcG9uc2UoUGFyYW1FeGNlcHRpb24uQ29va2llUGFyYW1FeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gdG9SZXNwb25zZShleGNlcHRpb24sICJjb29raWUiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSGVhZGVyRXhjZXB0aW9uTWFwcGVyIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbk1hcHBlcjxQYXJhbUV4Y2VwdGlvbi5IZWFkZXJQYXJhbUV4Y2VwdGlvbj4geworCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSB0b1Jlc3BvbnNlKFBhcmFtRXhjZXB0aW9uLkhlYWRlclBhcmFtRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIHRvUmVzcG9uc2UoZXhjZXB0aW9uLCAiaGVhZGVyIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZvcm1FeGNlcHRpb25NYXBwZXIgZXh0ZW5kcyBCYXNlRXhjZXB0aW9uTWFwcGVyPFBhcmFtRXhjZXB0aW9uLkZvcm1QYXJhbUV4Y2VwdGlvbj4geworCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSB0b1Jlc3BvbnNlKFBhcmFtRXhjZXB0aW9uLkZvcm1QYXJhbUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiB0b1Jlc3BvbnNlKGV4Y2VwdGlvbiwgImZvcm0iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhcmFtRXhjZXB0aW9uTWFwcGVyUmVzb3VyY2UgeworCisgICAgICAgIEBQYXRoKCJwYXRoL3t4fSIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRQYXRoKEBEZWZhdWx0VmFsdWUoIjEiKSBAUGF0aFBhcmFtKCJ4IikgaW50IHgpIHsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJtYXRyaXgiKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWF0cml4KEBEZWZhdWx0VmFsdWUoImRlZmF1bHQiKSBATWF0cml4UGFyYW0oIngiKSBVUkkgeCkgeworICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInF1ZXJ5IikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFF1ZXJ5KEBEZWZhdWx0VmFsdWUoImRlZmF1bHQiKSBAUXVlcnlQYXJhbSgieCIpIFVSSSB4KSB7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiY29va2llIikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvb2tpZShARGVmYXVsdFZhbHVlKCJkZWZhdWx0IikgQENvb2tpZVBhcmFtKCJ4IikgVVJJIHgpIHsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJoZWFkZXIiKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SGVhZGVyKEBEZWZhdWx0VmFsdWUoImRlZmF1bHQiKSBASGVhZGVyUGFyYW0oIngiKSBVUkkgeCkgeworICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImZvcm0iKQorICAgICAgICBAUE9TVAorICAgICAgICBAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0ZPUk1fVVJMRU5DT0RFRCkKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0Rm9ybShARGVmYXVsdFZhbHVlKCJkZWZhdWx0IikgQEZvcm1QYXJhbSgieCIpIFVSSSB4KSB7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiZm9ybS1pbnQiKQorICAgICAgICBAUE9TVAorICAgICAgICBAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0ZPUk1fVVJMRU5DT0RFRCkKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0Rm9ybShARGVmYXVsdFZhbHVlKCIxIikgQEZvcm1QYXJhbSgieCIpIGludCB4KSB7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJhbUV4Y2VwdGlvbigpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihQYXJhbUV4Y2VwdGlvbk1hcHBlclJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGhFeGNlcHRpb25NYXBwZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0cml4RXhjZXB0aW9uTWFwcGVyLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1ZXJ5RXhjZXB0aW9uTWFwcGVyLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvb2tpZUV4Y2VwdGlvbk1hcHBlci5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIZWFkZXJFeGNlcHRpb25NYXBwZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybUV4Y2VwdGlvbk1hcHBlci5jbGFzcyk7CisKKyAgICAgICAgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2VDb250ZXh0ID0gZ2V0UmVzcG9uc2VDb250ZXh0KFVyaUJ1aWxkZXIuZnJvbVBhdGgoIi8iKS5wYXRoKCJwYXRoLyB0ZXN0IikuYnVpbGQoKS50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXRoIiwgcmVzcG9uc2VDb250ZXh0LmdldEVudGl0eSgpKTsKKworICAgICAgICByZXNwb25zZUNvbnRleHQgPSBnZXRSZXNwb25zZUNvbnRleHQoVXJpQnVpbGRlci5mcm9tUGF0aCgiLyIpLnBhdGgoIm1hdHJpeDt4PSAxMjMiKS5idWlsZCgpLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm1hdHJpeCIsIHJlc3BvbnNlQ29udGV4dC5nZXRFbnRpdHkoKSk7CisKKyAgICAgICAgcmVzcG9uc2VDb250ZXh0ID0gZ2V0UmVzcG9uc2VDb250ZXh0KFVyaUJ1aWxkZXIuZnJvbVBhdGgoIi8iKS5wYXRoKCJxdWVyeSIpLnF1ZXJ5UGFyYW0oIngiLCAiIDEyMyIpLmJ1aWxkKCkudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygicXVlcnkiLCByZXNwb25zZUNvbnRleHQuZ2V0RW50aXR5KCkpOworCisgICAgICAgIHJlc3BvbnNlQ29udGV4dCA9IGdldFJlc3BvbnNlQ29udGV4dChVcmlCdWlsZGVyLmZyb21QYXRoKCIvIikucGF0aCgiY29va2llIikuYnVpbGQoKS50b1N0cmluZygpLCBuZXcgQ29va2llKCJ4IiwgIiAxMjMiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29va2llIiwgcmVzcG9uc2VDb250ZXh0LmdldEVudGl0eSgpKTsKKworICAgICAgICByZXNwb25zZUNvbnRleHQgPSBhcHBseSgKKyAgICAgICAgICAgICAgICBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL2hlYWRlciIsICJHRVQiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmhlYWRlcigieCIsICIgMTIzIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpCisgICAgICAgICk7CisgICAgICAgIGFzc2VydEVxdWFscygiaGVhZGVyIiwgcmVzcG9uc2VDb250ZXh0LmdldEVudGl0eSgpKTsKKworICAgICAgICBGb3JtIGYgPSBuZXcgRm9ybSgpOworICAgICAgICBmLnBhcmFtKCJ4IiwgIiAxMjMiKTsKKyAgICAgICAgcmVzcG9uc2VDb250ZXh0ID0gYXBwbHkoCisgICAgICAgICAgICAgICAgUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9mb3JtIiwgIlBPU1QiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnR5cGUoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0ZPUk1fVVJMRU5DT0RFRF9UWVBFKQorICAgICAgICAgICAgICAgICAgICAgICAgLmVudGl0eShmKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkKKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb3JtIiwgcmVzcG9uc2VDb250ZXh0LmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JtUGFyYW1QcmltaXRpdmVWYWxpZGF0aW9uKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFBhcmFtRXhjZXB0aW9uTWFwcGVyUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybUV4Y2VwdGlvbk1hcHBlci5jbGFzcyk7CisKKyAgICAgICAgRm9ybSBmID0gbmV3IEZvcm0oKTsKKyAgICAgICAgZi5wYXJhbSgieCIsICJodHRwOi8vb3JhY2xlLmNvbSIpOworICAgICAgICBDb250YWluZXJSZXNwb25zZUNvbnRleHQgcmVzcG9uc2VDb250ZXh0ID0gYXBwbHkoCisgICAgICAgICAgICAgICAgUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9mb3JtLWludCIsICJQT1NUIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudHlwZShNZWRpYVR5cGUuQVBQTElDQVRJT05fRk9STV9VUkxFTkNPREVEX1RZUEUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVudGl0eShmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpCisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb3JtIiwgcmVzcG9uc2VDb250ZXh0LmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmFsUGFyYW1FeGNlcHRpb24oKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUGFyYW1FeGNlcHRpb25NYXBwZXJSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBQYXJhbUV4Y2VwdGlvbk1hcHBlci5jbGFzcyk7CisKKyAgICAgICAgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2VDb250ZXh0ID0gZ2V0UmVzcG9uc2VDb250ZXh0KFVyaUJ1aWxkZXIuZnJvbVBhdGgoIi8iKS5wYXRoKCJwYXRoLyAxMjMiKS5idWlsZCgpLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBhcmFtIiwgcmVzcG9uc2VDb250ZXh0LmdldEVudGl0eSgpKTsKKworICAgICAgICByZXNwb25zZUNvbnRleHQgPSBnZXRSZXNwb25zZUNvbnRleHQoVXJpQnVpbGRlci5mcm9tUGF0aCgiLyIpLnBhdGgoIm1hdHJpeDt4PSAxMjMiKS5idWlsZCgpLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBhcmFtIiwgcmVzcG9uc2VDb250ZXh0LmdldEVudGl0eSgpKTsKKworICAgICAgICByZXNwb25zZUNvbnRleHQgPSBnZXRSZXNwb25zZUNvbnRleHQoVXJpQnVpbGRlci5mcm9tUGF0aCgiLyIpLnBhdGgoInF1ZXJ5IikucXVlcnlQYXJhbSgieCIsICIgMTIzIikuYnVpbGQoKS50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXJhbSIsIHJlc3BvbnNlQ29udGV4dC5nZXRFbnRpdHkoKSk7CisKKyAgICAgICAgcmVzcG9uc2VDb250ZXh0ID0gZ2V0UmVzcG9uc2VDb250ZXh0KFVyaUJ1aWxkZXIuZnJvbVBhdGgoIi8iKS5wYXRoKCJjb29raWUiKS5idWlsZCgpLnRvU3RyaW5nKCksIG5ldyBDb29raWUoIngiLCAiIDEyMyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXJhbSIsIHJlc3BvbnNlQ29udGV4dC5nZXRFbnRpdHkoKSk7CisKKyAgICAgICAgcmVzcG9uc2VDb250ZXh0ID0gYXBwbHkoCisgICAgICAgICAgICAgICAgUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9oZWFkZXIiLCAiR0VUIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5oZWFkZXIoIngiLCAiIDEyMyIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKQorICAgICAgICApOworICAgICAgICBhc3NlcnRFcXVhbHMoInBhcmFtIiwgcmVzcG9uc2VDb250ZXh0LmdldEVudGl0eSgpKTsKKworICAgICAgICBGb3JtIGYgPSBuZXcgRm9ybSgpOworICAgICAgICBmLnBhcmFtKCJ4IiwgIiAxMjMiKTsKKyAgICAgICAgcmVzcG9uc2VDb250ZXh0ID0gYXBwbHkoCisgICAgICAgICAgICAgICAgUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9mb3JtIiwgIlBPU1QiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnR5cGUoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0ZPUk1fVVJMRU5DT0RFRF9UWVBFKQorICAgICAgICAgICAgICAgICAgICAgICAgLmVudGl0eShmKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkKKyAgICAgICAgKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXJhbSIsIHJlc3BvbnNlQ29udGV4dC5nZXRFbnRpdHkoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VVJJUGFyYW1FeGNlcHRpb24oKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUGFyYW1FeGNlcHRpb25NYXBwZXJSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBVcmlFeGNlcHRpb25NYXBwZXIuY2xhc3MpOworCisgICAgICAgIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlQ29udGV4dCA9IGdldFJlc3BvbnNlQ29udGV4dChVcmlCdWlsZGVyLmZyb21QYXRoKCIvIikucGF0aCgicGF0aC8gMTIzIikuYnVpbGQoKS50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ1cmkiLCByZXNwb25zZUNvbnRleHQuZ2V0RW50aXR5KCkpOworCisgICAgICAgIHJlc3BvbnNlQ29udGV4dCA9IGdldFJlc3BvbnNlQ29udGV4dChVcmlCdWlsZGVyLmZyb21QYXRoKCIvIikucGF0aCgibWF0cml4O3g9IDEyMyIpLmJ1aWxkKCkudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidXJpIiwgcmVzcG9uc2VDb250ZXh0LmdldEVudGl0eSgpKTsKKworICAgICAgICByZXNwb25zZUNvbnRleHQgPSBnZXRSZXNwb25zZUNvbnRleHQoVXJpQnVpbGRlci5mcm9tUGF0aCgiLyIpLnBhdGgoInF1ZXJ5IikucXVlcnlQYXJhbSgieCIsICIgMTIzIikuYnVpbGQoKS50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ1cmkiLCByZXNwb25zZUNvbnRleHQuZ2V0RW50aXR5KCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L1BhdGhQYXJhbUFzUGF0aFNlZ21lbnRUZXN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvUGF0aFBhcmFtQXNQYXRoU2VnbWVudFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2FlNjFkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L1BhdGhQYXJhbUFzUGF0aFNlZ21lbnRUZXN0LmphdmEKQEAgLTAsMCArMSwyOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLmluamVjdDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUGF0aFNlZ21lbnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXF1ZXN0Q29udGV4dEJ1aWxkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRha2VuIGZyb20gSmVyc2V5LTE6IGplcnNleS10ZXN0czogY29tLnN1bi5qZXJzZXkuaW1wbC5tZXRob2RwYXJhbXMuUGF0aFBhcmFtQXNQYXRoU2VnbWVudFRlc3QKKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKi8KK3B1YmxpYyBjbGFzcyBQYXRoUGFyYW1Bc1BhdGhTZWdtZW50VGVzdCB7CisKKyAgICBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwOworCisgICAgcHJpdmF0ZSB2b2lkIGluaXRpYXRlV2ViQXBwbGljYXRpb24oQ2xhc3M8Pz4uLi4gY2xhc3NlcykgeworICAgICAgICBhcHAgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKG5ldyBSZXNvdXJjZUNvbmZpZyhjbGFzc2VzKSk7CisgICAgfQorCisgICAgQFBhdGgoIi97YXJnMX0ve2FyZzJ9L3thcmczfSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KAorICAgICAgICAgICAgICAgIEBQYXRoUGFyYW0oImFyZzEiKSBQYXRoU2VnbWVudCBhcmcxLAorICAgICAgICAgICAgICAgIEBQYXRoUGFyYW0oImFyZzIiKSBQYXRoU2VnbWVudCBhcmcyLAorICAgICAgICAgICAgICAgIEBQYXRoUGFyYW0oImFyZzMiKSBQYXRoU2VnbWVudCBhcmczKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCBhcmcxLmdldFBhdGgoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImIiLCBhcmcyLmdldFBhdGgoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImMiLCBhcmczLmdldFBhdGgoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nQXJnc0dldCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb250ZW50IiwgYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvYS9iL2MiLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCkuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBQYXRoKCIve2lkfSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEdXBsaWNhdGUgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoQFBhdGhQYXJhbSgiaWQiKSBQYXRoU2VnbWVudCBpZCkgeworICAgICAgICAgICAgcmV0dXJuIGlkLmdldFBhdGgoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIi97aWR9IikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRTdWIoQFBhdGhQYXJhbSgiaWQiKSBQYXRoU2VnbWVudCBpZCkgeworICAgICAgICAgICAgcmV0dXJuIGlkLmdldFBhdGgoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdER1cGxpY2F0ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKER1cGxpY2F0ZS5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9mb28iLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCkuZ2V0RW50aXR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImJhciIsIGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL2Zvby9iYXIiLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCkuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBQYXRoKCIve2F9L3tifS97Y30iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUm9vdCB7CisKKyAgICAgICAgQFBhdGgoIi97eH0ve3l9L3t6fSIpCisgICAgICAgIHB1YmxpYyBTdWIgZ2V0U3ViKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdWIoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3ViIHsKKworICAgICAgICBAUGF0aCgie2Zvb30iKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KAorICAgICAgICAgICAgICAgIEBQYXRoUGFyYW0oImEiKSBQYXRoU2VnbWVudCBhLAorICAgICAgICAgICAgICAgIEBQYXRoUGFyYW0oImIiKSBQYXRoU2VnbWVudCBiLAorICAgICAgICAgICAgICAgIEBQYXRoUGFyYW0oImMiKSBQYXRoU2VnbWVudCBjLAorICAgICAgICAgICAgICAgIEBQYXRoUGFyYW0oIngiKSBQYXRoU2VnbWVudCB4LAorICAgICAgICAgICAgICAgIEBQYXRoUGFyYW0oInkiKSBQYXRoU2VnbWVudCB5LAorICAgICAgICAgICAgICAgIEBQYXRoUGFyYW0oInoiKSBQYXRoU2VnbWVudCB6LAorICAgICAgICAgICAgICAgIEBQYXRoUGFyYW0oImZvbyIpIFBhdGhTZWdtZW50IGZvbykgeworICAgICAgICAgICAgcmV0dXJuIGFjYyhhLCBiLCBjLCB4LCB5LCB6LCBmb28pOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGFjYyhQYXRoU2VnbWVudC4uLiBwcykgeworICAgICAgICAgICAgU3RyaW5nIHMgPSAiIjsKKyAgICAgICAgICAgIGZvciAoUGF0aFNlZ21lbnQgcCA6IHBzKSB7CisgICAgICAgICAgICAgICAgcyArPSBwLmdldFBhdGgoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJSZXNvdXJjZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSb290LmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIjEyMzQ1NjciLCBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8xLzIvMy80LzUvNi83IiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiL3thfS17Yn0ve2N9LXtkfSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXRoU2VnIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoCisgICAgICAgICAgICAgICAgQFBhdGhQYXJhbSgiYSIpIFBhdGhTZWdtZW50IGEsCisgICAgICAgICAgICAgICAgQFBhdGhQYXJhbSgiYiIpIFBhdGhTZWdtZW50IGIsCisgICAgICAgICAgICAgICAgQFBhdGhQYXJhbSgiYyIpIFBhdGhTZWdtZW50IGMsCisgICAgICAgICAgICAgICAgQFBhdGhQYXJhbSgiZCIpIFBhdGhTZWdtZW50IGQpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhhLmdldFBhdGgoKSwgYi5nZXRQYXRoKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGMuZ2V0UGF0aCgpLCBkLmdldFBhdGgoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoIntlfS17Zn0iKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRTdWIoCisgICAgICAgICAgICAgICAgQFBhdGhQYXJhbSgiYSIpIFBhdGhTZWdtZW50IGEsCisgICAgICAgICAgICAgICAgQFBhdGhQYXJhbSgiYiIpIFBhdGhTZWdtZW50IGIsCisgICAgICAgICAgICAgICAgQFBhdGhQYXJhbSgiYyIpIFBhdGhTZWdtZW50IGMsCisgICAgICAgICAgICAgICAgQFBhdGhQYXJhbSgiZCIpIFBhdGhTZWdtZW50IGQsCisgICAgICAgICAgICAgICAgQFBhdGhQYXJhbSgiZSIpIFBhdGhTZWdtZW50IGUsCisgICAgICAgICAgICAgICAgQFBhdGhQYXJhbSgiZiIpIFBhdGhTZWdtZW50IGYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhhLmdldFBhdGgoKSwgYi5nZXRQYXRoKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGMuZ2V0UGF0aCgpLCBkLmdldFBhdGgoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZS5nZXRQYXRoKCksIGYuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgIHJldHVybiAic3ViLWNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGF0aFNlZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFBhdGhTZWcuY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscygiY29udGVudCIsIGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL2EtYi9jLWQiLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCkuZ2V0RW50aXR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInN1Yi1jb250ZW50IiwgYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvYS1iL2MtZC9lLWYiLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCkuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBQYXRoKCIve2E6IC4rfS9lZGl0L3tifSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXRoU2VncyB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KAorICAgICAgICAgICAgICAgIEBQYXRoUGFyYW0oImEiKSBQYXRoU2VnbWVudCBhLAorICAgICAgICAgICAgICAgIEBQYXRoUGFyYW0oImIiKSBQYXRoU2VnbWVudCBiKSB7CisgICAgICAgICAgICByZXR1cm4gYS5nZXRQYXRoKCkgKyAiLSIgKyBiLmdldFBhdGgoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhdGhTZWdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUGF0aFNlZ3MuY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscygiei1iIiwgYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIveC95L3ovZWRpdC9iIiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ6LWIiLCBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8vL3gveS96L2VkaXQvYiIsICJHRVQiKS5idWlsZCgpKS5nZXQoKS5nZXRFbnRpdHkoKSk7CisgICAgfQorCisgICAgQFBhdGgoIi97YTogLit9IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhdGhTZWdzRW5kIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoCisgICAgICAgICAgICAgICAgQFBhdGhQYXJhbSgiYSIpIFBhdGhTZWdtZW50IGEpIHsKKyAgICAgICAgICAgIHJldHVybiBhLmdldFBhdGgoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhdGhTZWdzRW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUGF0aFNlZ3NFbmQuY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscygieiIsIGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3gveS96IiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi94L3kvei8iLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCkuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBQYXRoKCIve2E6IC4rfS9lZGl0L3tifSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXRoU2Vnc0xpc3QgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldCgKKyAgICAgICAgICAgICAgICBAUGF0aFBhcmFtKCJhIikgTGlzdDxQYXRoU2VnbWVudD4gYSwKKyAgICAgICAgICAgICAgICBAUGF0aFBhcmFtKCJiIikgTGlzdDxQYXRoU2VnbWVudD4gYikgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIGZvciAoUGF0aFNlZ21lbnQgcCA6IGEpIHsKKyAgICAgICAgICAgICAgICBpZiAocC5nZXRQYXRoKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHMuYXBwZW5kKCcvJyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcy5hcHBlbmQocC5nZXRQYXRoKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHMuYXBwZW5kKCctJyk7CisgICAgICAgICAgICBmb3IgKFBhdGhTZWdtZW50IHAgOiBiKSB7CisgICAgICAgICAgICAgICAgaWYgKHAuZ2V0UGF0aCgpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBzLmFwcGVuZCgnLycpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHMuYXBwZW5kKHAuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBzLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXRoU2Vnc0xpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihQYXRoU2Vnc0xpc3QuY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscygieHl6LWIiLCBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi94L3kvei9lZGl0L2IiLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCkuZ2V0RW50aXR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi8veHl6LWIiLCBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oCisgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3QvIiwgImh0dHA6Ly9sb2NhbGhvc3QvLy94L3kvei9lZGl0L2IiLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCkuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBQYXRoKCIve2E6IC4rfSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXRoU2Vnc0VuZExpc3QgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldCgKKyAgICAgICAgICAgICAgICBAUGF0aFBhcmFtKCJhIikgTGlzdDxQYXRoU2VnbWVudD4gYSkgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIGZvciAoUGF0aFNlZ21lbnQgcCA6IGEpIHsKKyAgICAgICAgICAgICAgICBpZiAocC5nZXRQYXRoKCkubGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBzLmFwcGVuZCgnLycpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHMuYXBwZW5kKHAuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcy50b1N0cmluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGF0aFNlZ3NFbmRMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUGF0aFNlZ3NFbmRMaXN0LmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoInh5eiIsIGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3gveS96IiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4eXovIiwgYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIveC95L3ovIiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXRoU2VnT25TdWJSZXNvdXJjZSB7CisKKyAgICAgICAgUGF0aFNlZ21lbnQgcHM7CisKKyAgICAgICAgcHVibGljIFBhdGhTZWdPblN1YlJlc291cmNlKCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFBhdGhTZWdPblN1YlJlc291cmNlKFBhdGhTZWdtZW50IHBzKSB7CisgICAgICAgICAgICB0aGlzLnBzID0gcHM7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIHBzLmdldFBhdGgoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJ7aWR9IikKKyAgICAgICAgcHVibGljIFBhdGhTZWdPblN1YlJlc291cmNlIGdldFN1blJlc291cmNlKEBQYXRoUGFyYW0oImlkIikgUGF0aFNlZ21lbnQgcHMpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUGF0aFNlZ09uU3ViUmVzb3VyY2UocHMpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGF0aFNlZ09uU3ViUmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihQYXRoU2VnT25TdWJSZXNvdXJjZS5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4IiwgYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIveCIsICJHRVQiKS5idWlsZCgpKS5nZXQoKS5nZXRFbnRpdHkoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L1BhdGhQYXJhbUFzUHJpbWl0aXZlVGVzdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L1BhdGhQYXJhbUFzUHJpbWl0aXZlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyM2U0ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvUGF0aFBhcmFtQXNQcmltaXRpdmVUZXN0LmphdmEKQEAgLTAsMCArMSwyNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLmluamVjdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXF1ZXN0Q29udGV4dEJ1aWxkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRha2VuIGZyb20gSmVyc2V5LTE6IGplcnNleS10ZXN0czogY29tLnN1bi5qZXJzZXkuaW1wbC5tZXRob2RwYXJhbXMuUGF0aFBhcmFtQXNQcmltaXRpdmVUZXN0CisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitwdWJsaWMgY2xhc3MgUGF0aFBhcmFtQXNQcmltaXRpdmVUZXN0IHsKKworICAgIEFwcGxpY2F0aW9uSGFuZGxlciBhcHA7CisKKyAgICBwcml2YXRlIEFwcGxpY2F0aW9uSGFuZGxlciBjcmVhdGVBcHBsaWNhdGlvbihDbGFzczw/Pi4uLiBjbGFzc2VzKSB7CisgICAgICAgIHJldHVybiBuZXcgQXBwbGljYXRpb25IYW5kbGVyKG5ldyBSZXNvdXJjZUNvbmZpZyhjbGFzc2VzKSk7CisgICAgfQorCisgICAgcHVibGljIFBhdGhQYXJhbUFzUHJpbWl0aXZlVGVzdCgpIHsKKyAgICAgICAgYXBwID0gY3JlYXRlQXBwbGljYXRpb24oCisgICAgICAgICAgICAgICAgUmVzb3VyY2VVcmlCb29sZWFuLmNsYXNzLAorICAgICAgICAgICAgICAgIFJlc291cmNlVXJpQnl0ZS5jbGFzcywKKyAgICAgICAgICAgICAgICBSZXNvdXJjZVVyaUNoYXJhY3Rlci5jbGFzcywKKyAgICAgICAgICAgICAgICBSZXNvdXJjZVVyaVNob3J0LmNsYXNzLAorICAgICAgICAgICAgICAgIFJlc291cmNlVXJpSW50LmNsYXNzLAorICAgICAgICAgICAgICAgIFJlc291cmNlVXJpTG9uZy5jbGFzcywKKyAgICAgICAgICAgICAgICBSZXNvdXJjZVVyaUZsb2F0LmNsYXNzLAorICAgICAgICAgICAgICAgIFJlc291cmNlVXJpRG91YmxlLmNsYXNzLAorICAgICAgICAgICAgICAgIFJlc291cmNlVXJpQm9vbGVhbldyYXBwZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgUmVzb3VyY2VVcmlCeXRlV3JhcHBlci5jbGFzcywKKyAgICAgICAgICAgICAgICBSZXNvdXJjZVVyaUNoYXJhY3RlcldyYXBwZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgUmVzb3VyY2VVcmlTaG9ydFdyYXBwZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgUmVzb3VyY2VVcmlJbnRXcmFwcGVyLmNsYXNzLAorICAgICAgICAgICAgICAgIFJlc291cmNlVXJpTG9uZ1dyYXBwZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgUmVzb3VyY2VVcmlGbG9hdFdyYXBwZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgUmVzb3VyY2VVcmlEb3VibGVXcmFwcGVyLmNsYXNzKTsKKyAgICB9CisKKyAgICBAUGF0aCgiL2Jvb2xlYW4ve2FyZ30iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VVcmlCb29sZWFuIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQFBhdGhQYXJhbSgiYXJnIikgYm9vbGVhbiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi9ieXRlL3thcmd9IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlVXJpQnl0ZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBQYXRoUGFyYW0oImFyZyIpIGJ5dGUgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEyNywgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorICAgIEBQYXRoKCIvY2hhci97YXJnfSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVVyaUNoYXJhY3RlciB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBQYXRoUGFyYW0oImFyZyIpIGNoYXIgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCdjJywgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi9zaG9ydC97YXJnfSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVVyaVNob3J0IHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQFBhdGhQYXJhbSgiYXJnIikgc2hvcnQgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMyNzY3LCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL2ludC97YXJnfSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVVyaUludCB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBQYXRoUGFyYW0oImFyZyIpIGludCB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMjE0NzQ4MzY0Nywgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi9sb25nL3thcmd9IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlVXJpTG9uZyB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBQYXRoUGFyYW0oImFyZyIpIGxvbmcgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDkyMjMzNzIwMzY4NTQ3NzU4MDdMLCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL2Zsb2F0L3thcmd9IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlVXJpRmxvYXQgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChAUGF0aFBhcmFtKCJhcmciKSBmbG9hdCB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMy4xNDE1OTI2NWYsIHYsIDBmKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL2RvdWJsZS97YXJnfSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVVyaURvdWJsZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBQYXRoUGFyYW0oImFyZyIpIGRvdWJsZSB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMy4xNDE1OTI2NTM1ODk3OWQsIHYsIDBkKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL2Jvb2xlYW4vd3JhcHBlci97YXJnfSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVVyaUJvb2xlYW5XcmFwcGVyIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQFBhdGhQYXJhbSgiYXJnIikgQm9vbGVhbiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi9ieXRlL3dyYXBwZXIve2FyZ30iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VVcmlCeXRlV3JhcHBlciB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBQYXRoUGFyYW0oImFyZyIpIEJ5dGUgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEyNywgdi5ieXRlVmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi9jaGFyL3dyYXBwZXIve2FyZ30iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VVcmlDaGFyYWN0ZXJXcmFwcGVyIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQFBhdGhQYXJhbSgiYXJnIikgQ2hhcmFjdGVyIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygnYycsIHYuY2hhclZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvc2hvcnQvd3JhcHBlci97YXJnfSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVVyaVNob3J0V3JhcHBlciB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBQYXRoUGFyYW0oImFyZyIpIFNob3J0IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzMjc2Nywgdi5zaG9ydFZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvaW50L3dyYXBwZXIve2FyZ30iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VVcmlJbnRXcmFwcGVyIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQFBhdGhQYXJhbSgiYXJnIikgSW50ZWdlciB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMjE0NzQ4MzY0Nywgdi5pbnRWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL2xvbmcvd3JhcHBlci97YXJnfSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVVyaUxvbmdXcmFwcGVyIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQFBhdGhQYXJhbSgiYXJnIikgTG9uZyB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoOTIyMzM3MjAzNjg1NDc3NTgwN0wsIHYubG9uZ1ZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvZmxvYXQvd3JhcHBlci97YXJnfSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVVyaUZsb2F0V3JhcHBlciB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBQYXRoUGFyYW0oImFyZyIpIEZsb2F0IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzLjE0MTU5MjY1ZiwgdiwgMGYpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvZG91YmxlL3dyYXBwZXIve2FyZ30iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VVcmlEb3VibGVXcmFwcGVyIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQFBhdGhQYXJhbSgiYXJnIikgRG91YmxlIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzLjE0MTU5MjY1MzU4OTc5ZCwgdiwgMGQpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgX3Rlc3QoU3RyaW5nIHR5cGUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIgKyB0eXBlICsgIi8iICsgdmFsdWUsICJHRVQiKS5idWlsZCgpKS5nZXQoKS5nZXRFbnRpdHkoKTsKKyAgICAgICAgYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvIiArIHR5cGUgKyAiL3dyYXBwZXIvIiArIHZhbHVlLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCkuZ2V0RW50aXR5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Qm9vbGVhbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgiYm9vbGVhbiIsICJ0cnVlIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Qnl0ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgiYnl0ZSIsICIxMjciKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDaGFyYWN0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoImNoYXIiLCAiYyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFNob3J0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJzaG9ydCIsICIzMjc2NyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEludCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgiaW50IiwgIjIxNDc0ODM2NDciKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRMb25nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJsb25nIiwgIjkyMjMzNzIwMzY4NTQ3NzU4MDciKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRGbG9hdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgiZmxvYXQiLCAiMy4xNDE1OTI2NSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldERvdWJsZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgiZG91YmxlIiwgIjMuMTQxNTkyNjUzNTg5NzkiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCYWRQcmltaXRpdmVWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDb250YWluZXJSZXNwb25zZSByZXNwb25zZUNvbnRleHQgPSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9pbnQvYWJjZGVmIiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDA0LCByZXNwb25zZUNvbnRleHQuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJhZFByaW1pdGl2ZVdyYXBwZXJWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDb250YWluZXJSZXNwb25zZSByZXNwb25zZUNvbnRleHQgPSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9pbnQvd3JhcHBlci9hYmNkZWYiLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDQsIHJlc3BvbnNlQ29udGV4dC5nZXRTdGF0dXMoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L1BhdGhQYXJhbUFzU3RyaW5nVGVzdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L1BhdGhQYXJhbUFzU3RyaW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhMGE5ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvUGF0aFBhcmFtQXNTdHJpbmdUZXN0LmphdmEKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLmluamVjdDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXF1ZXN0Q29udGV4dEJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorcHVibGljIGNsYXNzIFBhdGhQYXJhbUFzU3RyaW5nVGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdCB7CisKKyAgICBAUGF0aCgiL3thcmcxfS97YXJnMn0ve2FyZzN9IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQFBhdGhQYXJhbSgiYXJnMSIpIFN0cmluZyBhcmcxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBQYXRoUGFyYW0oImFyZzIiKSBTdHJpbmcgYXJnMiwgQFBhdGhQYXJhbSgiYXJnMyIpIFN0cmluZyBhcmczKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCBhcmcxKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiYiIsIGFyZzIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJjIiwgYXJnMyk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyBkb1Bvc3QoQFBhdGhQYXJhbSgiYXJnMSIpIFN0cmluZyBhcmcxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAUGF0aFBhcmFtKCJhcmcyIikgU3RyaW5nIGFyZzIsIEBQYXRoUGFyYW0oImFyZzMiKSBTdHJpbmcgYXJnMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHIpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiYSIsIGFyZzEpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJiIiwgYXJnMik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImMiLCBhcmczKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiY29udGVudCIsIHIpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ0FyZ3NHZXQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2UuY2xhc3MpOworCisgICAgICAgIF90ZXN0KCIvYS9iL2MiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdBcmdzUG9zdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZS5jbGFzcyk7CisKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBhcHBseSgKKyAgICAgICAgICAgICAgICBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL2EvYi9jIiwgIlBPU1QiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmVudGl0eSgiY29udGVudCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscygiY29udGVudCIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiL3tpZH0iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRHVwbGljYXRlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KEBQYXRoUGFyYW0oImlkIikgU3RyaW5nIGlkKSB7CisgICAgICAgICAgICByZXR1cm4gaWQ7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCIve2lkfSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3ViKEBQYXRoUGFyYW0oImlkIikgU3RyaW5nIGlkKSB7CisgICAgICAgICAgICByZXR1cm4gaWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REdXBsaWNhdGUoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oRHVwbGljYXRlLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsIGdldFJlc3BvbnNlQ29udGV4dCgiL2ZvbyIpLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYXIiLCBnZXRSZXNwb25zZUNvbnRleHQoIi9mb28vYmFyIikuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBQYXRoKCIve2lkfSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEdXBsaWNhdGVMaXN0IHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KEBQYXRoUGFyYW0oImlkIikgU3RyaW5nIGlkKSB7CisgICAgICAgICAgICByZXR1cm4gaWQ7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCIve2lkfSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3ViKEBQYXRoUGFyYW0oImlkIikgTGlzdDxTdHJpbmc+IGlkKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgaWQuc2l6ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBpZC5nZXQoMCkgKyBpZC5nZXQoMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REdXBsaWNhdGVMaXN0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKER1cGxpY2F0ZUxpc3QuY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwgZ2V0UmVzcG9uc2VDb250ZXh0KCIvZm9vIikuZ2V0RW50aXR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImJhcmZvbyIsIGdldFJlc3BvbnNlQ29udGV4dCgiL2Zvby9iYXIiKS5nZXRFbnRpdHkoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L1BhdGhQYXJhbURlZmF1bHRWYWx1ZVRlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9QYXRoUGFyYW1EZWZhdWx0VmFsdWVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJmZWMwYwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9QYXRoUGFyYW1EZWZhdWx0VmFsdWVUZXN0LmphdmEKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLmluamVjdDsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkRlZmF1bHRWYWx1ZTsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoUGFyYW07CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICoKKyAqLworcHVibGljIGNsYXNzIFBhdGhQYXJhbURlZmF1bHRWYWx1ZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFRlc3QgeworCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFuZGFyZFBhdGhQYXJhbVZhbHVlRm9vKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKEZvb1Jlc291cmNlLmNsYXNzKTsKKworICAgICAgICBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGdldFJlc3BvbnNlQ29udGV4dCgiL2Zvby9iYXIvdGVzdCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QiLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFBhdGhQYXJhbVZhbHVlRm9vKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKEZvb1Jlc291cmNlLmNsYXNzKTsKKworICAgICAgICBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGdldFJlc3BvbnNlQ29udGV4dCgiL2ZvbyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImRlZmF1bHQtaWQiLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFBhdGhQYXJhbVZhbHVlT25SZXNvdXJjZTEoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2UuY2xhc3MpOworCisgICAgICAgIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gZ2V0UmVzcG9uc2VDb250ZXh0KCIvZm9vIik7CisgICAgICAgIGFzc2VydEVxdWFscygiZGVmYXVsdC1pZCIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRQYXRoUGFyYW1WYWx1ZU9uUmVzb3VyY2UyKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlLmNsYXNzKTsKKworICAgICAgICBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGdldFJlc3BvbnNlQ29udGV4dCgiL2Zvby9iYXIvYWFhIik7CisgICAgICAgIGFzc2VydEVxdWFscygiYWFhIiwgcmVzcG9uc2UuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENhbGxXaXRoTWlzc2luZ1BhdGhQYXJhbTQwNCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZS5jbGFzcyk7CisKKyAgICAgICAgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBnZXRSZXNwb25zZUNvbnRleHQoIi9mb28vYmFyIik7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDQsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0UGF0aFBhcmFtSW5TdWJSZXNvdXJjZSgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihGb29SZXNvdXJjZS5jbGFzcyk7CisKKyAgICAgICAgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBnZXRSZXNwb25zZUNvbnRleHQoIi9mb28vYmF6L3N1YiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZGVmYXVsdC1pZCIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhcmFtSW5TdWJSZXNvdXJjZSgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihGb29SZXNvdXJjZS5jbGFzcyk7CisKKyAgICAgICAgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBnZXRSZXNwb25zZUNvbnRleHQoIi9mb28vYmF6L2lkZGQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImlkZGQiLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgfQorCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0UGF0aFBhcmFtVmFsdWVPbkFub3RoZXJSZXNvdXJjZTEoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oQW5vdGhlclJlc291cmNlLmNsYXNzKTsKKworICAgICAgICBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGdldFJlc3BvbnNlQ29udGV4dCgiL2Zvby90ZXN0L2Jhci9iYXJyciIpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3Q6YmFycnIiLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgfQorCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0UGF0aFBhcmFtVmFsdWVPbkFub3RoZXJSZXNvdXJjZTIoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oQW5vdGhlclJlc291cmNlLmNsYXNzKTsKKworICAgICAgICBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGdldFJlc3BvbnNlQ29udGV4dCgiL2ZvbyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImRlZmF1bHQtaWQ6ZGVmYXVsdC1iYXIiLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgfQorCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0UGF0aFBhcmFtVmFsdWVPbkFub3RoZXJSZXNvdXJjZTMoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oQW5vdGhlclJlc291cmNlLmNsYXNzKTsKKworICAgICAgICBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGdldFJlc3BvbnNlQ29udGV4dCgiL2Zvby90ZXN0Iik7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdDpkZWZhdWx0LWJhciIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiZm9vIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZvb1Jlc291cmNlIHsKKyAgICAgICAgQFBhdGhQYXJhbSgiaWQiKQorICAgICAgICBARGVmYXVsdFZhbHVlKCJkZWZhdWx0LWlkIikKKyAgICAgICAgU3RyaW5nIGlkOworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRGb28oKSB7CisgICAgICAgICAgICByZXR1cm4gaWQ7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJiYXIve2lkfSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmFyKCkgeworICAgICAgICAgICAgcmV0dXJuIGlkOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImJhei97aWR9IikKKyAgICAgICAgcHVibGljIFJlc291cmNlIGdldFJlc291cmNlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZSgpOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImJhei9zdWIiKQorICAgICAgICBwdWJsaWMgUmVzb3VyY2UgZ2V0UmVzb3VyY2UyKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZSgpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAUGF0aCgiZm9vIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEZvbyhAUGF0aFBhcmFtKCJpZCIpIEBEZWZhdWx0VmFsdWUoImRlZmF1bHQtaWQiKSBTdHJpbmcgaWQpIHsKKyAgICAgICAgICAgIHJldHVybiBpZDsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImJhci97aWR9IikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRCYXIoQFBhdGhQYXJhbSgiaWQiKSBARGVmYXVsdFZhbHVlKCJkZWZhdWx0LWlkIikgU3RyaW5nIGlkKSB7CisgICAgICAgICAgICByZXR1cm4gaWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiZm9vIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFub3RoZXJSZXNvdXJjZSB7CisgICAgICAgIEBQYXRoUGFyYW0oImJhciIpCisgICAgICAgIEBEZWZhdWx0VmFsdWUoImRlZmF1bHQtYmFyIikKKyAgICAgICAgU3RyaW5nIGJhcjsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9vKEBQYXRoUGFyYW0oImlkIikgQERlZmF1bHRWYWx1ZSgiZGVmYXVsdC1pZCIpIFN0cmluZyBpZCkgeworICAgICAgICAgICAgcmV0dXJuIGlkICsgIjoiICsgYmFyOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgie2lkfSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmFyKEBQYXRoUGFyYW0oImlkIikgQERlZmF1bHRWYWx1ZSgiZGVmYXVsdC1pZCIpIFN0cmluZyBpZCkgeworICAgICAgICAgICAgcmV0dXJuIGlkICsgIjoiICsgYmFyOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgie2lkfS9iYXIve2Jhcn0iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEJhckJhcihAUGF0aFBhcmFtKCJpZCIpIEBEZWZhdWx0VmFsdWUoImRlZmF1bHQtaWQiKSBTdHJpbmcgaWQpIHsKKyAgICAgICAgICAgIHJldHVybiBpZCArICI6IiArIGJhcjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9QYXRoUGFyYW1TdHJpbmdDb25zdHJ1Y3RvclRlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9QYXRoUGFyYW1TdHJpbmdDb25zdHJ1Y3RvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTM4OTJmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L1BhdGhQYXJhbVN0cmluZ0NvbnN0cnVjdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLmluamVjdDsKKworaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOworaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXNwb25zZTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFBhdGhQYXJhbVN0cmluZ0NvbnN0cnVjdG9yVGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdCB7CisKKyAgICBwdWJsaWMgUGF0aFBhcmFtU3RyaW5nQ29uc3RydWN0b3JUZXN0KCkgeworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAUGF0aCgiL3thfS97Yn0iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoCisgICAgICAgICAgICAgICAgQFBhdGhQYXJhbSgiYSIpIEJpZ0RlY2ltYWwgYSwKKyAgICAgICAgICAgICAgICBAUGF0aFBhcmFtKCJiIikgQmlnSW50ZWdlciBiKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjMuMTQ1IiwgYS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMzE0NSIsIGIudG9TdHJpbmcoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nQ29uc3RydWN0b3JHZXQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCIvMy4xNDUvMzE0NSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJhZFN0cmluZ0NvbnN0cnVjdG9yVmFsdWUoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlQ29udGV4dCA9IGdldFJlc3BvbnNlQ29udGV4dCgiL0FCQ0RFL0FCQ0RFIik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwNCwgcmVzcG9uc2VDb250ZXh0LmdldFN0YXR1cygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvUXVlcnlQYXJhbUFzUHJpbWl0aXZlVGVzdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L1F1ZXJ5UGFyYW1Bc1ByaW1pdGl2ZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWZiYmJmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L1F1ZXJ5UGFyYW1Bc1ByaW1pdGl2ZVRlc3QuamF2YQpAQCAtMCwwICsxLDEwMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLmluamVjdDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkRlZmF1bHRWYWx1ZTsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXF1ZXN0Q29udGV4dEJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBRdWVyeVBhcmFtQXNQcmltaXRpdmVUZXN0IGV4dGVuZHMgQWJzdHJhY3RUZXN0IHsKKworICAgIHB1YmxpYyBRdWVyeVBhcmFtQXNQcmltaXRpdmVUZXN0KCkgeworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKAorICAgICAgICAgICAgICAgIFJlc291cmNlUXVlcnlQcmltaXRpdmVzLmNsYXNzLAorICAgICAgICAgICAgICAgIFJlc291cmNlUXVlcnlQcmltaXRpdmVzRGVmYXVsdE51bGwuY2xhc3MsCisgICAgICAgICAgICAgICAgUmVzb3VyY2VRdWVyeVByaW1pdGl2ZXNEZWZhdWx0LmNsYXNzLAorICAgICAgICAgICAgICAgIFJlc291cmNlUXVlcnlQcmltaXRpdmVzRGVmYXVsdE92ZXJyaWRlLmNsYXNzLAorICAgICAgICAgICAgICAgIFJlc291cmNlUXVlcnlQcmltaXRpdmVXcmFwcGVycy5jbGFzcywKKyAgICAgICAgICAgICAgICBSZXNvdXJjZVF1ZXJ5UHJpbWl0aXZlV3JhcHBlcnNEZWZhdWx0TnVsbC5jbGFzcywKKyAgICAgICAgICAgICAgICBSZXNvdXJjZVF1ZXJ5UHJpbWl0aXZlV3JhcHBlcnNEZWZhdWx0LmNsYXNzLAorICAgICAgICAgICAgICAgIFJlc291cmNlUXVlcnlQcmltaXRpdmVXcmFwcGVyc0RlZmF1bHRPdmVycmlkZS5jbGFzcywKKyAgICAgICAgICAgICAgICBSZXNvdXJjZVF1ZXJ5UHJpbWl0aXZlTGlzdC5jbGFzcywKKyAgICAgICAgICAgICAgICBSZXNvdXJjZVF1ZXJ5UHJpbWl0aXZlTGlzdERlZmF1bHRFbXB0eS5jbGFzcywKKyAgICAgICAgICAgICAgICBSZXNvdXJjZVF1ZXJ5UHJpbWl0aXZlTGlzdERlZmF1bHQuY2xhc3MsCisgICAgICAgICAgICAgICAgUmVzb3VyY2VRdWVyeVByaW1pdGl2ZUxpc3REZWZhdWx0T3ZlcnJpZGUuY2xhc3MKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVF1ZXJ5UHJpbWl0aXZlcyB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Jvb2xlYW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBRdWVyeVBhcmFtKCJib29sZWFuIikgYm9vbGVhbiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2J5dGUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBRdWVyeVBhcmFtKCJieXRlIikgYnl0ZSB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMTI3LCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vY2hhciIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQFF1ZXJ5UGFyYW0oImNoYXIiKSBjaGFyIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygnYycsIHYpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9zaG9ydCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQFF1ZXJ5UGFyYW0oInNob3J0Iikgc2hvcnQgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMyNzY3LCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vaW50IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChAUXVlcnlQYXJhbSgiaW50IikgaW50IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyMTQ3NDgzNjQ3LCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vbG9uZyIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQFF1ZXJ5UGFyYW0oImxvbmciKSBsb25nIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg5MjIzMzcyMDM2ODU0Nzc1ODA3TCwgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Zsb2F0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChAUXVlcnlQYXJhbSgiZmxvYXQiKSBmbG9hdCB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMy4xNDE1OTI2NWYsIHYsIDApOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9kb3VibGUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBRdWVyeVBhcmFtKCJkb3VibGUiKSBkb3VibGUgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMuMTQxNTkyNjUzNTg5NzlkLCB2LCAwKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL2RlZmF1bHQvbnVsbCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVF1ZXJ5UHJpbWl0aXZlc0RlZmF1bHROdWxsIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYm9vbGVhbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQFF1ZXJ5UGFyYW0oImJvb2xlYW4iKSBib29sZWFuIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhmYWxzZSwgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2J5dGUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBRdWVyeVBhcmFtKCJieXRlIikgYnl0ZSB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2NoYXIiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBRdWVyeVBhcmFtKCJjaGFyIikgY2hhciB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMHgwMCwgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3Nob3J0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChAUXVlcnlQYXJhbSgic2hvcnQiKSBzaG9ydCB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2ludCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQFF1ZXJ5UGFyYW0oImludCIpIGludCB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2xvbmciKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBRdWVyeVBhcmFtKCJsb25nIikgbG9uZyB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMEwsIHYpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mbG9hdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQFF1ZXJ5UGFyYW0oImZsb2F0IikgZmxvYXQgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAuMGYsIHYsIDApOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9kb3VibGUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBRdWVyeVBhcmFtKCJkb3VibGUiKSBkb3VibGUgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAuMGQsIHYsIDApOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvZGVmYXVsdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVF1ZXJ5UHJpbWl0aXZlc0RlZmF1bHQgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9ib29sZWFuIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChAUXVlcnlQYXJhbSgiYm9vbGVhbiIpIEBEZWZhdWx0VmFsdWUoInRydWUiKSBib29sZWFuIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYnl0ZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQFF1ZXJ5UGFyYW0oImJ5dGUiKSBARGVmYXVsdFZhbHVlKCIxMjciKSBieXRlIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxMjcsIHYpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9jaGFyIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChAUXVlcnlQYXJhbSgiY2hhciIpIEBEZWZhdWx0VmFsdWUoImMiKSBjaGFyIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygnYycsIHYpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9zaG9ydCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQFF1ZXJ5UGFyYW0oInNob3J0IikgQERlZmF1bHRWYWx1ZSgiMzI3NjciKSBzaG9ydCB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMzI3NjcsIHYpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9pbnQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBRdWVyeVBhcmFtKCJpbnQiKSBARGVmYXVsdFZhbHVlKCIyMTQ3NDgzNjQ3IikgaW50IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyMTQ3NDgzNjQ3LCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vbG9uZyIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQFF1ZXJ5UGFyYW0oImxvbmciKSBARGVmYXVsdFZhbHVlKCI5MjIzMzcyMDM2ODU0Nzc1ODA3IikgbG9uZyB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoOTIyMzM3MjAzNjg1NDc3NTgwN0wsIHYpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mbG9hdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQFF1ZXJ5UGFyYW0oImZsb2F0IikgQERlZmF1bHRWYWx1ZSgiMy4xNDE1OTI2NSIpIGZsb2F0IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzLjE0MTU5MjY1ZiwgdiwgMCk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2RvdWJsZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQFF1ZXJ5UGFyYW0oImRvdWJsZSIpIEBEZWZhdWx0VmFsdWUoIjMuMTQxNTkyNjUzNTg5NzkiKSBkb3VibGUgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMuMTQxNTkyNjUzNTg5NzlkLCB2LCAwKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL2RlZmF1bHQvb3ZlcnJpZGUiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VRdWVyeVByaW1pdGl2ZXNEZWZhdWx0T3ZlcnJpZGUgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9ib29sZWFuIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChAUXVlcnlQYXJhbSgiYm9vbGVhbiIpIEBEZWZhdWx0VmFsdWUoImZhbHNlIikgYm9vbGVhbiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2J5dGUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBRdWVyeVBhcmFtKCJieXRlIikgQERlZmF1bHRWYWx1ZSgiMSIpIGJ5dGUgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEyNywgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2NoYXIiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBRdWVyeVBhcmFtKCJjaGFyIikgQERlZmF1bHRWYWx1ZSgiZCIpIGNoYXIgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCdjJywgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3Nob3J0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChAUXVlcnlQYXJhbSgic2hvcnQiKSBARGVmYXVsdFZhbHVlKCIxIikgc2hvcnQgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMyNzY3LCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vaW50IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChAUXVlcnlQYXJhbSgiaW50IikgQERlZmF1bHRWYWx1ZSgiMSIpIGludCB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMjE0NzQ4MzY0Nywgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2xvbmciKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBRdWVyeVBhcmFtKCJsb25nIikgQERlZmF1bHRWYWx1ZSgiMSIpIGxvbmcgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDkyMjMzNzIwMzY4NTQ3NzU4MDdMLCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZmxvYXQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBRdWVyeVBhcmFtKCJmbG9hdCIpIEBEZWZhdWx0VmFsdWUoIjAuMCIpIGZsb2F0IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzLjE0MTU5MjY1ZiwgdiwgMCk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2RvdWJsZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQFF1ZXJ5UGFyYW0oImRvdWJsZSIpIEBEZWZhdWx0VmFsdWUoIjAuMCIpIGRvdWJsZSB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMy4xNDE1OTI2NTM1ODk3OWQsIHYsIDApOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvd3JhcHBlcnMiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VRdWVyeVByaW1pdGl2ZVdyYXBwZXJzIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYm9vbGVhbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQFF1ZXJ5UGFyYW0oImJvb2xlYW4iKSBCb29sZWFuIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYnl0ZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQFF1ZXJ5UGFyYW0oImJ5dGUiKSBCeXRlIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxMjcsIHYuYnl0ZVZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9jaGFyIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChAUXVlcnlQYXJhbSgiY2hhciIpIENoYXJhY3RlciB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoJ2MnLCB2LmNoYXJWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vc2hvcnQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBRdWVyeVBhcmFtKCJzaG9ydCIpIFNob3J0IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzMjc2Nywgdi5zaG9ydFZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9pbnQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBRdWVyeVBhcmFtKCJpbnQiKSBJbnRlZ2VyIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyMTQ3NDgzNjQ3LCB2LmludFZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9sb25nIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChAUXVlcnlQYXJhbSgibG9uZyIpIExvbmcgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDkyMjMzNzIwMzY4NTQ3NzU4MDdMLCB2LmxvbmdWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZmxvYXQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBRdWVyeVBhcmFtKCJmbG9hdCIpIEZsb2F0IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzLjE0MTU5MjY1ZiwgdiwgMCk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2RvdWJsZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQFF1ZXJ5UGFyYW0oImRvdWJsZSIpIERvdWJsZSB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMy4xNDE1OTI2NTM1ODk3OWQsIHYsIDApOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvd3JhcHBlcnMvZGVmYXVsdC9udWxsIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlUXVlcnlQcmltaXRpdmVXcmFwcGVyc0RlZmF1bHROdWxsIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYm9vbGVhbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQFF1ZXJ5UGFyYW0oImJvb2xlYW4iKSBCb29sZWFuIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYnl0ZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQFF1ZXJ5UGFyYW0oImJ5dGUiKSBCeXRlIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vY2hhciIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQFF1ZXJ5UGFyYW0oImNoYXIiKSBDaGFyYWN0ZXIgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIHYpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9zaG9ydCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQFF1ZXJ5UGFyYW0oInNob3J0IikgU2hvcnQgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIHYpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9pbnQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBRdWVyeVBhcmFtKCJpbnQiKSBJbnRlZ2VyIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vbG9uZyIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQFF1ZXJ5UGFyYW0oImxvbmciKSBMb25nIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZmxvYXQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBRdWVyeVBhcmFtKCJmbG9hdCIpIEZsb2F0IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZG91YmxlIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChAUXVlcnlQYXJhbSgiZG91YmxlIikgRG91YmxlIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCB2KTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL3dyYXBwZXJzL2RlZmF1bHQiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VRdWVyeVByaW1pdGl2ZVdyYXBwZXJzRGVmYXVsdCB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Jvb2xlYW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBRdWVyeVBhcmFtKCJib29sZWFuIikgQERlZmF1bHRWYWx1ZSgidHJ1ZSIpIEJvb2xlYW4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHYpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9ieXRlIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChAUXVlcnlQYXJhbSgiYnl0ZSIpIEBEZWZhdWx0VmFsdWUoIjEyNyIpIEJ5dGUgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEyNywgdi5ieXRlVmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2NoYXIiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBRdWVyeVBhcmFtKCJjaGFyIikgQERlZmF1bHRWYWx1ZSgiYyIpIENoYXJhY3RlciB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoJ2MnLCB2LmNoYXJWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vc2hvcnQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBRdWVyeVBhcmFtKCJzaG9ydCIpIEBEZWZhdWx0VmFsdWUoIjMyNzY3IikgU2hvcnQgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMyNzY3LCB2LnNob3J0VmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2ludCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQFF1ZXJ5UGFyYW0oImludCIpIEBEZWZhdWx0VmFsdWUoIjIxNDc0ODM2NDciKSBJbnRlZ2VyIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyMTQ3NDgzNjQ3LCB2LmludFZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9sb25nIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChAUXVlcnlQYXJhbSgibG9uZyIpIEBEZWZhdWx0VmFsdWUoIjkyMjMzNzIwMzY4NTQ3NzU4MDciKSBMb25nIHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg5MjIzMzcyMDM2ODU0Nzc1ODA3TCwgdi5sb25nVmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Zsb2F0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChAUXVlcnlQYXJhbSgiZmxvYXQiKSBARGVmYXVsdFZhbHVlKCIzLjE0MTU5MjY1IikgRmxvYXQgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMuMTQxNTkyNjVmLCB2LCAwKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZG91YmxlIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChAUXVlcnlQYXJhbSgiZG91YmxlIikgQERlZmF1bHRWYWx1ZSgiMy4xNDE1OTI2NTM1ODk3OSIpIERvdWJsZSB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMy4xNDE1OTI2NTM1ODk3OWQsIHYsIDApOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvd3JhcHBlcnMvZGVmYXVsdC9vdmVycmlkZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVF1ZXJ5UHJpbWl0aXZlV3JhcHBlcnNEZWZhdWx0T3ZlcnJpZGUgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9ib29sZWFuIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChAUXVlcnlQYXJhbSgiYm9vbGVhbiIpIEBEZWZhdWx0VmFsdWUoImZhbHNlIikgQm9vbGVhbiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgdik7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2J5dGUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBRdWVyeVBhcmFtKCJieXRlIikgQERlZmF1bHRWYWx1ZSgiMSIpIEJ5dGUgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEyNywgdi5ieXRlVmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2NoYXIiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBRdWVyeVBhcmFtKCJjaGFyIikgQERlZmF1bHRWYWx1ZSgiZCIpIENoYXJhY3RlciB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoJ2MnLCB2LmNoYXJWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vc2hvcnQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBRdWVyeVBhcmFtKCJzaG9ydCIpIEBEZWZhdWx0VmFsdWUoIjEiKSBTaG9ydCB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMzI3NjcsIHYuc2hvcnRWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vaW50IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChAUXVlcnlQYXJhbSgiaW50IikgQERlZmF1bHRWYWx1ZSgiMSIpIEludGVnZXIgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIxNDc0ODM2NDcsIHYuaW50VmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2xvbmciKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBRdWVyeVBhcmFtKCJsb25nIikgQERlZmF1bHRWYWx1ZSgiMSIpIExvbmcgdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDkyMjMzNzIwMzY4NTQ3NzU4MDdMLCB2LmxvbmdWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZmxvYXQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBRdWVyeVBhcmFtKCJmbG9hdCIpIEBEZWZhdWx0VmFsdWUoIjAuMCIpIEZsb2F0IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzLjE0MTU5MjY1ZiwgdiwgMCk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2RvdWJsZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQFF1ZXJ5UGFyYW0oImRvdWJsZSIpIEBEZWZhdWx0VmFsdWUoIjAuMCIpIERvdWJsZSB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMy4xNDE1OTI2NTM1ODk3OWQsIHYsIDApOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvbGlzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVF1ZXJ5UHJpbWl0aXZlTGlzdCB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Jvb2xlYW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0Qm9vbGVhbihAUXVlcnlQYXJhbSgiYm9vbGVhbiIpIExpc3Q8Qm9vbGVhbj4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHYuZ2V0KDApKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCB2LmdldCgxKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgdi5nZXQoMikpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9ieXRlIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldEJ5dGUoQFF1ZXJ5UGFyYW0oImJ5dGUiKSBMaXN0PEJ5dGU+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxMjcsIHYuZ2V0KDApLmJ5dGVWYWx1ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxMjcsIHYuZ2V0KDEpLmJ5dGVWYWx1ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxMjcsIHYuZ2V0KDIpLmJ5dGVWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vY2hhciIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRDaGFyKEBRdWVyeVBhcmFtKCJjaGFyIikgTGlzdDxDaGFyYWN0ZXI+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygnYycsIHYuZ2V0KDApLmNoYXJWYWx1ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygnYycsIHYuZ2V0KDEpLmNoYXJWYWx1ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygnYycsIHYuZ2V0KDIpLmNoYXJWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vc2hvcnQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0U2hvcnQoQFF1ZXJ5UGFyYW0oInNob3J0IikgTGlzdDxTaG9ydD4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMyNzY3LCB2LmdldCgwKS5zaG9ydFZhbHVlKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMyNzY3LCB2LmdldCgxKS5zaG9ydFZhbHVlKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMyNzY3LCB2LmdldCgyKS5zaG9ydFZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9pbnQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0SW50ZWdlcihAUXVlcnlQYXJhbSgiaW50IikgTGlzdDxJbnRlZ2VyPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMjE0NzQ4MzY0Nywgdi5nZXQoMCkuaW50VmFsdWUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMjE0NzQ4MzY0Nywgdi5nZXQoMSkuaW50VmFsdWUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMjE0NzQ4MzY0Nywgdi5nZXQoMikuaW50VmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2xvbmciKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0TG9uZyhAUXVlcnlQYXJhbSgibG9uZyIpIExpc3Q8TG9uZz4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDkyMjMzNzIwMzY4NTQ3NzU4MDdMLCB2LmdldCgwKS5sb25nVmFsdWUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoOTIyMzM3MjAzNjg1NDc3NTgwN0wsIHYuZ2V0KDEpLmxvbmdWYWx1ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg5MjIzMzcyMDM2ODU0Nzc1ODA3TCwgdi5nZXQoMikubG9uZ1ZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mbG9hdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRGbG9hdChAUXVlcnlQYXJhbSgiZmxvYXQiKSBMaXN0PEZsb2F0PiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMy4xNDE1OTI2NWYsIHYuZ2V0KDApLCAwKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzLjE0MTU5MjY1Ziwgdi5nZXQoMSksIDApOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMuMTQxNTkyNjVmLCB2LmdldCgyKSwgMCk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2RvdWJsZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXREb3VibGUoQFF1ZXJ5UGFyYW0oImRvdWJsZSIpIExpc3Q8RG91YmxlPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMy4xNDE1OTI2NTM1ODk3OWQsIHYuZ2V0KDApLCAwKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzLjE0MTU5MjY1MzU4OTc5ZCwgdi5nZXQoMSksIDApOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMuMTQxNTkyNjUzNTg5NzlkLCB2LmdldCgyKSwgMCk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi9saXN0L2RlZmF1bHQvbnVsbCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVF1ZXJ5UHJpbWl0aXZlTGlzdERlZmF1bHRFbXB0eSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Jvb2xlYW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0Qm9vbGVhbihAUXVlcnlQYXJhbSgiYm9vbGVhbiIpIExpc3Q8Qm9vbGVhbj4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHYuc2l6ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYnl0ZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRCeXRlKEBRdWVyeVBhcmFtKCJieXRlIikgTGlzdDxCeXRlPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdi5zaXplKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9jaGFyIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldENoYXJhY3RlcihAUXVlcnlQYXJhbSgiYnl0ZSIpIExpc3Q8Q2hhcmFjdGVyPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdi5zaXplKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9zaG9ydCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRTaG9ydChAUXVlcnlQYXJhbSgic2hvcnQiKSBMaXN0PFNob3J0PiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdi5zaXplKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9pbnQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0SW50ZWdlcihAUXVlcnlQYXJhbSgiaW50IikgTGlzdDxJbnRlZ2VyPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdi5zaXplKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9sb25nIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldExvbmcoQFF1ZXJ5UGFyYW0oImxvbmciKSBMaXN0PExvbmc+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCB2LnNpemUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Zsb2F0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldEZsb2F0KEBRdWVyeVBhcmFtKCJmbG9hdCIpIExpc3Q8RmxvYXQ+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCB2LnNpemUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2RvdWJsZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXREb3VibGUoQFF1ZXJ5UGFyYW0oImRvdWJsZSIpIExpc3Q8RG91YmxlPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdi5zaXplKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvbGlzdC9kZWZhdWx0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlUXVlcnlQcmltaXRpdmVMaXN0RGVmYXVsdCB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Jvb2xlYW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0Qm9vbGVhbihAUXVlcnlQYXJhbSgiYm9vbGVhbiIpIEBEZWZhdWx0VmFsdWUoInRydWUiKSBMaXN0PEJvb2xlYW4+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCB2LmdldCgwKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2J5dGUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0Qnl0ZShAUXVlcnlQYXJhbSgiYnl0ZSIpIEBEZWZhdWx0VmFsdWUoIjEyNyIpIExpc3Q8Qnl0ZT4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEyNywgdi5nZXQoMCkuYnl0ZVZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9jaGFyIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldENoYXJhY3RlcihAUXVlcnlQYXJhbSgiYnl0ZSIpIEBEZWZhdWx0VmFsdWUoImMiKSBMaXN0PENoYXJhY3Rlcj4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCdjJywgdi5nZXQoMCkuY2hhclZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9zaG9ydCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRTaG9ydChAUXVlcnlQYXJhbSgic2hvcnQiKSBARGVmYXVsdFZhbHVlKCIzMjc2NyIpIExpc3Q8U2hvcnQ+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzMjc2Nywgdi5nZXQoMCkuc2hvcnRWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vaW50IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldEludGVnZXIoQFF1ZXJ5UGFyYW0oImludCIpIEBEZWZhdWx0VmFsdWUoIjIxNDc0ODM2NDciKSBMaXN0PEludGVnZXI+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyMTQ3NDgzNjQ3LCB2LmdldCgwKS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vbG9uZyIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRMb25nKEBRdWVyeVBhcmFtKCJsb25nIikgQERlZmF1bHRWYWx1ZSgiOTIyMzM3MjAzNjg1NDc3NTgwNyIpIExpc3Q8TG9uZz4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDkyMjMzNzIwMzY4NTQ3NzU4MDdMLCB2LmdldCgwKS5sb25nVmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Zsb2F0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldEZsb2F0KEBRdWVyeVBhcmFtKCJmbG9hdCIpIEBEZWZhdWx0VmFsdWUoIjMuMTQxNTkyNjUiKSBMaXN0PEZsb2F0PiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMy4xNDE1OTI2NWYsIHYuZ2V0KDApLCAwKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZG91YmxlIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldERvdWJsZShAUXVlcnlQYXJhbSgiZG91YmxlIikgQERlZmF1bHRWYWx1ZSgiMy4xNDE1OTI2NTM1ODk3OSIpIExpc3Q8RG91YmxlPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMy4xNDE1OTI2NTM1ODk3OWQsIHYuZ2V0KDApLCAwKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL2xpc3QvZGVmYXVsdC9vdmVycmlkZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVF1ZXJ5UHJpbWl0aXZlTGlzdERlZmF1bHRPdmVycmlkZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Jvb2xlYW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0Qm9vbGVhbihAUXVlcnlQYXJhbSgiYm9vbGVhbiIpIEBEZWZhdWx0VmFsdWUoImZhbHNlIikgTGlzdDxCb29sZWFuPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgdi5nZXQoMCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9ieXRlIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldEJ5dGUoQFF1ZXJ5UGFyYW0oImJ5dGUiKSBARGVmYXVsdFZhbHVlKCIwIikgTGlzdDxCeXRlPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMTI3LCB2LmdldCgwKS5ieXRlVmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2NoYXIiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0Q2hhcmFjdGVyKEBRdWVyeVBhcmFtKCJjaGFyIikgQERlZmF1bHRWYWx1ZSgiZCIpIExpc3Q8Q2hhcmFjdGVyPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoJ2MnLCB2LmdldCgwKS5jaGFyVmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3Nob3J0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldFNob3J0KEBRdWVyeVBhcmFtKCJzaG9ydCIpIEBEZWZhdWx0VmFsdWUoIjAiKSBMaXN0PFNob3J0PiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMzI3NjcsIHYuZ2V0KDApLnNob3J0VmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2ludCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRJbnRlZ2VyKEBRdWVyeVBhcmFtKCJpbnQiKSBARGVmYXVsdFZhbHVlKCIwIikgTGlzdDxJbnRlZ2VyPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMjE0NzQ4MzY0Nywgdi5nZXQoMCkuaW50VmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2xvbmciKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0TG9uZyhAUXVlcnlQYXJhbSgibG9uZyIpIEBEZWZhdWx0VmFsdWUoIjAiKSBMaXN0PExvbmc+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg5MjIzMzcyMDM2ODU0Nzc1ODA3TCwgdi5nZXQoMCkubG9uZ1ZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mbG9hdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRGbG9hdChAUXVlcnlQYXJhbSgiZmxvYXQiKSBARGVmYXVsdFZhbHVlKCIwLjAiKSBMaXN0PEZsb2F0PiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMy4xNDE1OTI2NWYsIHYuZ2V0KDApLCAwKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZG91YmxlIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldERvdWJsZShAUXVlcnlQYXJhbSgiZG91YmxlIikgQERlZmF1bHRWYWx1ZSgiMC4wIikgTGlzdDxEb3VibGU+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzLjE0MTU5MjY1MzU4OTc5ZCwgdi5nZXQoMCksIDApOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgX3Rlc3QoU3RyaW5nIHR5cGUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgcGFyYW0gPSB0eXBlICsgIj0iICsgdmFsdWU7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb250ZW50IiwgYXBwbHkoCisgICAgICAgICAgICAgICAgUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8/IiArIHBhcmFtLCAiR0VUIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hY2NlcHQoImFwcGxpY2F0aW9uLyIgKyB0eXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkKKyAgICAgICAgKS5nZXRFbnRpdHkoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb250ZW50IiwgYXBwbHkoCisgICAgICAgICAgICAgICAgUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi93cmFwcGVycz8iICsgcGFyYW0sICJHRVQiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFjY2VwdCgiYXBwbGljYXRpb24vIiArIHR5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKQorICAgICAgICApLmdldEVudGl0eSgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbnRlbnQiLCBhcHBseSgKKyAgICAgICAgICAgICAgICBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL2xpc3Q/IiArIHBhcmFtICsgIiYiICsgcGFyYW0gKyAiJiIgKyBwYXJhbSwgIkdFVCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYWNjZXB0KCJhcHBsaWNhdGlvbi8iICsgdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpCisgICAgICAgICkuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIHZvaWQgX3Rlc3REZWZhdWx0KFN0cmluZyBiYXNlLCBTdHJpbmcgdHlwZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIENvbnRhaW5lclJlc3BvbnNlIGdldCA9IGFwcGx5KAorICAgICAgICAgICAgICAgIFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKGJhc2UgKyAiZGVmYXVsdC9udWxsIiwgIkdFVCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYWNjZXB0KCJhcHBsaWNhdGlvbi8iICsgdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpCisgICAgICAgICk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIyMjICIgKyBnZXQuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbnRlbnQiLCBnZXQuZ2V0RW50aXR5KCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygiY29udGVudCIsIGFwcGx5KAorICAgICAgICAgICAgICAgIFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKGJhc2UgKyAiZGVmYXVsdCIsICJHRVQiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFjY2VwdCgiYXBwbGljYXRpb24vIiArIHR5cGUpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKQorICAgICAgICApLmdldEVudGl0eSgpKTsKKworICAgICAgICBTdHJpbmcgcGFyYW0gPSB0eXBlICsgIj0iICsgdmFsdWU7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb250ZW50IiwgYXBwbHkoCisgICAgICAgICAgICAgICAgUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oYmFzZSArICJkZWZhdWx0L292ZXJyaWRlPyIgKyBwYXJhbSwgIkdFVCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYWNjZXB0KCJhcHBsaWNhdGlvbi8iICsgdHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpCisgICAgICAgICkuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIHZvaWQgX3Rlc3REZWZhdWx0KFN0cmluZyB0eXBlLCBTdHJpbmcgdmFsdWUpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3REZWZhdWx0KCIvIiwgdHlwZSwgdmFsdWUpOworICAgIH0KKworICAgIHZvaWQgX3Rlc3RXcmFwcGVyc0RlZmF1bHQoU3RyaW5nIHR5cGUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdERlZmF1bHQoIi93cmFwcGVycy8iLCB0eXBlLCB2YWx1ZSk7CisgICAgfQorCisgICAgdm9pZCBfdGVzdExpc3REZWZhdWx0KFN0cmluZyB0eXBlLCBTdHJpbmcgdmFsdWUpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3REZWZhdWx0KCIvbGlzdC8iLCB0eXBlLCB2YWx1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Qm9vbGVhbigpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoImJvb2xlYW4iLCAidHJ1ZSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEJvb2xlYW5QcmltaXRpdmVzRGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3REZWZhdWx0KCJib29sZWFuIiwgInRydWUiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRCb29sZWFuUHJpbWl0aXZlV3JhcHBlckRlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0V3JhcHBlcnNEZWZhdWx0KCJib29sZWFuIiwgInRydWUiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRCb29sZWFuUHJpbWl0aXZlTGlzdERlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0TGlzdERlZmF1bHQoImJvb2xlYW4iLCAidHJ1ZSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEJ5dGUoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJieXRlIiwgIjEyNyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEJ5dGVQcmltaXRpdmVzRGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3REZWZhdWx0KCJieXRlIiwgIjEyNyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEJ5dGVQcmltaXRpdmVXcmFwcGVyc0RlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0V3JhcHBlcnNEZWZhdWx0KCJieXRlIiwgIjEyNyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEJ5dGVQcmltaXRpdmVMaXN0RGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RMaXN0RGVmYXVsdCgiYnl0ZSIsICIxMjciKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDaGFyYWN0ZXIoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJjaGFyIiwgImMiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDaGFyYWN0ZXJQcmltaXRpdmVzRGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3REZWZhdWx0KCJjaGFyIiwgImMiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDaGFyYWN0ZXJQcmltaXRpdmVXcmFwcGVyc0RlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0V3JhcHBlcnNEZWZhdWx0KCJjaGFyIiwgImMiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDaGFyYWN0ZXJQcmltaXRpdmVMaXN0RGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RMaXN0RGVmYXVsdCgiY2hhciIsICJjIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2hvcnQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJzaG9ydCIsICIzMjc2NyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFNob3J0UHJpbXRpdmVzRGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3REZWZhdWx0KCJzaG9ydCIsICIzMjc2NyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFNob3J0UHJpbXRpdmVXcmFwcGVyc0RlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0V3JhcHBlcnNEZWZhdWx0KCJzaG9ydCIsICIzMjc2NyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFNob3J0UHJpbXRpdmVMaXN0RGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RMaXN0RGVmYXVsdCgic2hvcnQiLCAiMzI3NjciKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJbnQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJpbnQiLCAiMjE0NzQ4MzY0NyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEludFByaW1pdGl2ZXNEZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdERlZmF1bHQoImludCIsICIyMTQ3NDgzNjQ3Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW50UHJpbWl0aXZlV3JhcHBlcnNEZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdFdyYXBwZXJzRGVmYXVsdCgiaW50IiwgIjIxNDc0ODM2NDciKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJbnRQcmltaXRpdmVMaXN0RGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RMaXN0RGVmYXVsdCgiaW50IiwgIjIxNDc0ODM2NDciKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRMb25nKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdCgibG9uZyIsICI5MjIzMzcyMDM2ODU0Nzc1ODA3Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TG9uZ1ByaW1pdGl2ZXNEZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdERlZmF1bHQoImxvbmciLCAiOTIyMzM3MjAzNjg1NDc3NTgwNyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldExvbmdQcmltaXRpdmVXcmFwcGVyc0RlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0V3JhcHBlcnNEZWZhdWx0KCJsb25nIiwgIjkyMjMzNzIwMzY4NTQ3NzU4MDciKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRMb25nUHJpbWl0aXZlTGlzdERlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0TGlzdERlZmF1bHQoImxvbmciLCAiOTIyMzM3MjAzNjg1NDc3NTgwNyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEZsb2F0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdCgiZmxvYXQiLCAiMy4xNDE1OTI2NSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEZsb2F0UHJpbWl0aXZlc0RlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0RGVmYXVsdCgiZmxvYXQiLCAiMy4xNDE1OTI2NSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEZsb2F0UHJpbWl0aXZlV3JhcHBlcnNEZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdFdyYXBwZXJzRGVmYXVsdCgiZmxvYXQiLCAiMy4xNDE1OTI2NSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEZsb2F0UHJpbWl0aXZlTGlzdERlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0TGlzdERlZmF1bHQoImZsb2F0IiwgIjMuMTQxNTkyNjUiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXREb3VibGUoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJkb3VibGUiLCAiMy4xNDE1OTI2NTM1ODk3OSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldERvdWJsZVByaW1pdGl2ZXNEZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdERlZmF1bHQoImRvdWJsZSIsICIzLjE0MTU5MjY1MzU4OTc5Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RG91YmxlUHJpbWl0aXZlV3JhcHBlcnNEZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdFdyYXBwZXJzRGVmYXVsdCgiZG91YmxlIiwgIjMuMTQxNTkyNjUzNTg5NzkiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXREb3VibGVQcmltaXRpdmVMaXN0RGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RMaXN0RGVmYXVsdCgiZG91YmxlIiwgIjMuMTQxNTkyNjUzNTg5NzkiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCYWRQcmltaXRpdmVWYWx1ZSgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBzdXBlci5nZXRSZXNwb25zZUNvbnRleHQoIi8/aW50PWFiY2RlZiIsICJhcHBsaWNhdGlvbi9pbnQiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNDA0LCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFkUHJpbWl0aXZlV3JhcHBlclZhbHVlKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IHN1cGVyLmdldFJlc3BvbnNlQ29udGV4dCgiL3dyYXBwZXJzP2ludD1hYmNkZWYiLCAiYXBwbGljYXRpb24vaW50Iik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwNCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJhZFByaW1pdGl2ZUxpc3RWYWx1ZSgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBzdXBlci5nZXRSZXNwb25zZUNvbnRleHQoIi9saXN0P2ludD1hYmNkZWYmaW50PWFiY2RlZiIsICJhcHBsaWNhdGlvbi9pbnQiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNDA0LCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L1F1ZXJ5UGFyYW1Bc1NldFByaW1pdGl2ZVRlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9RdWVyeVBhcmFtQXNTZXRQcmltaXRpdmVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg3Nzc0MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9RdWVyeVBhcmFtQXNTZXRQcmltaXRpdmVUZXN0LmphdmEKQEAgLTAsMCArMSwzNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLmluamVjdDsKKworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuRGVmYXVsdFZhbHVlOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFF1ZXJ5UGFyYW1Bc1NldFByaW1pdGl2ZVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFRlc3QgeworCisgICAgcHVibGljIFF1ZXJ5UGFyYW1Bc1NldFByaW1pdGl2ZVRlc3QoKSB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oCisgICAgICAgICAgICAgICAgUmVzb3VyY2VRdWVyeVByaW1pdGl2ZVNldC5jbGFzcywKKyAgICAgICAgICAgICAgICBSZXNvdXJjZVF1ZXJ5UHJpbWl0aXZlU2V0RGVmYXVsdEVtcHR5LmNsYXNzLAorICAgICAgICAgICAgICAgIFJlc291cmNlUXVlcnlQcmltaXRpdmVTZXREZWZhdWx0LmNsYXNzLAorICAgICAgICAgICAgICAgIFJlc291cmNlUXVlcnlQcmltaXRpdmVTZXREZWZhdWx0T3ZlcnJpZGUuY2xhc3MKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICBAUGF0aCgiL1NldCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVF1ZXJ5UHJpbWl0aXZlU2V0IHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYm9vbGVhbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRCb29sZWFuKEBRdWVyeVBhcmFtKCJib29sZWFuIikgU2V0PEJvb2xlYW4+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUodi5jb250YWlucyh0cnVlKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2J5dGUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0Qnl0ZShAUXVlcnlQYXJhbSgiYnl0ZSIpIFNldDxCeXRlPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHYuY29udGFpbnMoKGJ5dGUpIDEyNykpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9zaG9ydCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRTaG9ydChAUXVlcnlQYXJhbSgic2hvcnQiKSBTZXQ8U2hvcnQ+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUodi5jb250YWlucygoc2hvcnQpIDMyNzY3KSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2ludCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRJbnRlZ2VyKEBRdWVyeVBhcmFtKCJpbnQiKSBTZXQ8SW50ZWdlcj4gdikgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh2LmNvbnRhaW5zKDIxNDc0ODM2NDcpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vbG9uZyIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRMb25nKEBRdWVyeVBhcmFtKCJsb25nIikgU2V0PExvbmc+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUodi5jb250YWlucyg5MjIzMzcyMDM2ODU0Nzc1ODA3TCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mbG9hdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRGbG9hdChAUXVlcnlQYXJhbSgiZmxvYXQiKSBTZXQ8RmxvYXQ+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUodi5jb250YWlucygzLjE0MTU5MjY1ZikpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9kb3VibGUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0RG91YmxlKEBRdWVyeVBhcmFtKCJkb3VibGUiKSBTZXQ8RG91YmxlPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHYuY29udGFpbnMoMy4xNDE1OTI2NTM1ODk3OWQpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL1NldC9kZWZhdWx0L251bGwiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VRdWVyeVByaW1pdGl2ZVNldERlZmF1bHRFbXB0eSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Jvb2xlYW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0Qm9vbGVhbihAUXVlcnlQYXJhbSgiYm9vbGVhbiIpIFNldDxCb29sZWFuPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdi5zaXplKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9ieXRlIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldEJ5dGUoQFF1ZXJ5UGFyYW0oImJ5dGUiKSBTZXQ8Qnl0ZT4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHYuc2l6ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vc2hvcnQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0U2hvcnQoQFF1ZXJ5UGFyYW0oInNob3J0IikgU2V0PFNob3J0PiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdi5zaXplKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9pbnQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0SW50ZWdlcihAUXVlcnlQYXJhbSgiaW50IikgU2V0PEludGVnZXI+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCB2LnNpemUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2xvbmciKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0TG9uZyhAUXVlcnlQYXJhbSgibG9uZyIpIFNldDxMb25nPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdi5zaXplKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mbG9hdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRGbG9hdChAUXVlcnlQYXJhbSgiZmxvYXQiKSBTZXQ8RmxvYXQ+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCB2LnNpemUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2RvdWJsZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXREb3VibGUoQFF1ZXJ5UGFyYW0oImRvdWJsZSIpIFNldDxEb3VibGU+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCB2LnNpemUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi9TZXQvZGVmYXVsdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVF1ZXJ5UHJpbWl0aXZlU2V0RGVmYXVsdCB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Jvb2xlYW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0Qm9vbGVhbihAUXVlcnlQYXJhbSgiYm9vbGVhbiIpIEBEZWZhdWx0VmFsdWUoInRydWUiKSBTZXQ8Qm9vbGVhbj4gdikgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh2LmNvbnRhaW5zKHRydWUpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYnl0ZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRCeXRlKEBRdWVyeVBhcmFtKCJieXRlIikgQERlZmF1bHRWYWx1ZSgiMTI3IikgU2V0PEJ5dGU+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUodi5jb250YWlucygoYnl0ZSkgMTI3KSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3Nob3J0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldFNob3J0KEBRdWVyeVBhcmFtKCJzaG9ydCIpIEBEZWZhdWx0VmFsdWUoIjMyNzY3IikgU2V0PFNob3J0PiB2KSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHYuY29udGFpbnMoKHNob3J0KSAzMjc2NykpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9pbnQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0SW50ZWdlcihAUXVlcnlQYXJhbSgiaW50IikgQERlZmF1bHRWYWx1ZSgiMjE0NzQ4MzY0NyIpIFNldDxJbnRlZ2VyPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHYuY29udGFpbnMoMjE0NzQ4MzY0NykpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9sb25nIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldExvbmcoQFF1ZXJ5UGFyYW0oImxvbmciKSBARGVmYXVsdFZhbHVlKCI5MjIzMzcyMDM2ODU0Nzc1ODA3IikgU2V0PExvbmc+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUodi5jb250YWlucyg5MjIzMzcyMDM2ODU0Nzc1ODA3TCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mbG9hdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRGbG9hdChAUXVlcnlQYXJhbSgiZmxvYXQiKSBARGVmYXVsdFZhbHVlKCIzLjE0MTU5MjY1IikgU2V0PEZsb2F0PiB2KSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHYuY29udGFpbnMoMy4xNDE1OTI2NWYpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZG91YmxlIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldERvdWJsZShAUXVlcnlQYXJhbSgiZG91YmxlIikgQERlZmF1bHRWYWx1ZSgiMy4xNDE1OTI2NTM1ODk3OSIpIFNldDxEb3VibGU+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUodi5jb250YWlucygzLjE0MTU5MjY1MzU4OTc5ZCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvU2V0L2RlZmF1bHQvb3ZlcnJpZGUiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VRdWVyeVByaW1pdGl2ZVNldERlZmF1bHRPdmVycmlkZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Jvb2xlYW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0Qm9vbGVhbihAUXVlcnlQYXJhbSgiYm9vbGVhbiIpIEBEZWZhdWx0VmFsdWUoImZhbHNlIikgU2V0PEJvb2xlYW4+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUodi5jb250YWlucyh0cnVlKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2J5dGUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0Qnl0ZShAUXVlcnlQYXJhbSgiYnl0ZSIpIEBEZWZhdWx0VmFsdWUoIjAiKSBTZXQ8Qnl0ZT4gdikgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh2LmNvbnRhaW5zKChieXRlKSAxMjcpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vc2hvcnQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0U2hvcnQoQFF1ZXJ5UGFyYW0oInNob3J0IikgQERlZmF1bHRWYWx1ZSgiMCIpIFNldDxTaG9ydD4gdikgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh2LmNvbnRhaW5zKChzaG9ydCkgMzI3NjcpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vaW50IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldEludGVnZXIoQFF1ZXJ5UGFyYW0oImludCIpIEBEZWZhdWx0VmFsdWUoIjAiKSBTZXQ8SW50ZWdlcj4gdikgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh2LmNvbnRhaW5zKDIxNDc0ODM2NDcpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vbG9uZyIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRMb25nKEBRdWVyeVBhcmFtKCJsb25nIikgQERlZmF1bHRWYWx1ZSgiMCIpIFNldDxMb25nPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHYuY29udGFpbnMoOTIyMzM3MjAzNjg1NDc3NTgwN0wpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZmxvYXQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0RmxvYXQoQFF1ZXJ5UGFyYW0oImZsb2F0IikgQERlZmF1bHRWYWx1ZSgiMC4wIikgU2V0PEZsb2F0PiB2KSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHYuY29udGFpbnMoMy4xNDE1OTI2NWYpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZG91YmxlIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldERvdWJsZShAUXVlcnlQYXJhbSgiZG91YmxlIikgQERlZmF1bHRWYWx1ZSgiMC4wIikgU2V0PERvdWJsZT4gdikgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh2LmNvbnRhaW5zKDMuMTQxNTkyNjUzNTg5NzlkKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBfdGVzdChTdHJpbmcgdHlwZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBwYXJhbSA9IHR5cGUgKyAiPSIgKyB2YWx1ZTsKKworICAgICAgICBzdXBlci5nZXRSZXNwb25zZUNvbnRleHQoIi9TZXQ/IiArIHBhcmFtICsgIiYiICsgcGFyYW0gKyAiJiIgKyBwYXJhbSwgImFwcGxpY2F0aW9uLyIgKyB0eXBlKTsKKyAgICB9CisKKyAgICB2b2lkIF90ZXN0RGVmYXVsdChTdHJpbmcgYmFzZSwgU3RyaW5nIHR5cGUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBzdXBlci5nZXRSZXNwb25zZUNvbnRleHQoYmFzZSArICJkZWZhdWx0L251bGwiLCAiYXBwbGljYXRpb24vIiArIHR5cGUpOworCisgICAgICAgIHN1cGVyLmdldFJlc3BvbnNlQ29udGV4dChiYXNlICsgImRlZmF1bHQiLCAiYXBwbGljYXRpb24vIiArIHR5cGUpOworCisgICAgICAgIFN0cmluZyBwYXJhbSA9IHR5cGUgKyAiPSIgKyB2YWx1ZTsKKyAgICAgICAgc3VwZXIuZ2V0UmVzcG9uc2VDb250ZXh0KGJhc2UgKyAiZGVmYXVsdC9vdmVycmlkZT8iICsgcGFyYW0sICJhcHBsaWNhdGlvbi8iICsgdHlwZSk7CisgICAgfQorCisgICAgdm9pZCBfdGVzdFNldERlZmF1bHQoU3RyaW5nIHR5cGUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdERlZmF1bHQoIi9TZXQvIiwgdHlwZSwgdmFsdWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEJvb2xlYW4oKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJib29sZWFuIiwgInRydWUiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRCb29sZWFuUHJpbWl0aXZlU2V0RGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RTZXREZWZhdWx0KCJib29sZWFuIiwgInRydWUiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRCeXRlKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdCgiYnl0ZSIsICIxMjciKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRCeXRlUHJpbWl0aXZlU2V0RGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RTZXREZWZhdWx0KCJieXRlIiwgIjEyNyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFNob3J0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdCgic2hvcnQiLCAiMzI3NjciKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTaG9ydFByaW10aXZlU2V0RGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RTZXREZWZhdWx0KCJzaG9ydCIsICIzMjc2NyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEludCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoImludCIsICIyMTQ3NDgzNjQ3Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW50UHJpbWl0aXZlU2V0RGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RTZXREZWZhdWx0KCJpbnQiLCAiMjE0NzQ4MzY0NyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldExvbmcoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJsb25nIiwgIjkyMjMzNzIwMzY4NTQ3NzU4MDciKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRMb25nUHJpbWl0aXZlU2V0RGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RTZXREZWZhdWx0KCJsb25nIiwgIjkyMjMzNzIwMzY4NTQ3NzU4MDciKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRGbG9hdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoImZsb2F0IiwgIjMuMTQxNTkyNjUiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRGbG9hdFByaW1pdGl2ZVNldERlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0U2V0RGVmYXVsdCgiZmxvYXQiLCAiMy4xNDE1OTI2NSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldERvdWJsZSgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoImRvdWJsZSIsICIzLjE0MTU5MjY1MzU4OTc5Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RG91YmxlUHJpbWl0aXZlU2V0RGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RTZXREZWZhdWx0KCJkb3VibGUiLCAiMy4xNDE1OTI2NTM1ODk3OSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJhZFByaW1pdGl2ZVNldFZhbHVlKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IHN1cGVyLmdldFJlc3BvbnNlQ29udGV4dCgiL1NldD9pbnQ9YWJjZGVmJmludD1hYmNkZWYiLCAiYXBwbGljYXRpb24vaW50Iik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwNCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9RdWVyeVBhcmFtQXNTZXRTdHJpbmdUZXN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvUXVlcnlQYXJhbUFzU2V0U3RyaW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMWM3NmYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvUXVlcnlQYXJhbUFzU2V0U3RyaW5nVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTg1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5pbmplY3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkRlZmF1bHRWYWx1ZTsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorcHVibGljIGNsYXNzIFF1ZXJ5UGFyYW1Bc1NldFN0cmluZ1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdFRlc3QgeworCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VTdHJpbmdTZXQgeworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vc3RyaW5nU2V0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldFN0cmluZyhAUXVlcnlQYXJhbSgiYXJncyIpIFNldDxTdHJpbmc+IGFyZ3MpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoYXJncy5jb250YWlucygiYSIpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoYXJncy5jb250YWlucygiYiIpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoYXJncy5jb250YWlucygiYyIpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vU2V0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChAUXVlcnlQYXJhbSgiYXJncyIpIFNldCBhcmdzKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGFyZ3MuY29udGFpbnMoImEiKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGFyZ3MuY29udGFpbnMoImIiKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGFyZ3MuY29udGFpbnMoImMiKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VTdHJpbmdTZXRFbXB0eSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9zdHJpbmdTZXQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0U3RyaW5nKEBRdWVyeVBhcmFtKCJhcmdzIikgU2V0PFN0cmluZz4gYXJncykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFyZ3Muc2l6ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoYXJncy5jb250YWlucygiIikpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlU3RyaW5nU2V0RW1wdHlEZWZhdWx0IHsKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3N0cmluZ1NldCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgQFF1ZXJ5UGFyYW0oImFyZ3MiKSBTZXQ8U3RyaW5nPiBhcmdzKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgYXJncy5zaXplKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9TZXQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KAorICAgICAgICAgICAgICAgIEBRdWVyeVBhcmFtKCJhcmdzIikgU2V0IGFyZ3MpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBhcmdzLnNpemUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VTdHJpbmdTZXREZWZhdWx0IHsKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3N0cmluZ1NldCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgQFF1ZXJ5UGFyYW0oImFyZ3MiKSBARGVmYXVsdFZhbHVlKCJhIikgU2V0PFN0cmluZz4gYXJncykgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhcmdzLmNvbnRhaW5zKCJhIikpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9TZXQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KAorICAgICAgICAgICAgICAgIEBRdWVyeVBhcmFtKCJhcmdzIikgQERlZmF1bHRWYWx1ZSgiYSIpIFNldCBhcmdzKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGFyZ3MuY29udGFpbnMoImEiKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VTdHJpbmdTZXREZWZhdWx0T3ZlcnJpZGUgeworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vc3RyaW5nU2V0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldFN0cmluZygKKyAgICAgICAgICAgICAgICBAUXVlcnlQYXJhbSgiYXJncyIpIEBEZWZhdWx0VmFsdWUoImEiKSBTZXQ8U3RyaW5nPiBhcmdzKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGFyZ3MuY29udGFpbnMoImIiKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL1NldCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoCisgICAgICAgICAgICAgICAgQFF1ZXJ5UGFyYW0oImFyZ3MiKSBARGVmYXVsdFZhbHVlKCJhIikgU2V0IGFyZ3MpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoYXJncy5jb250YWlucygiYiIpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ1NldEdldCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZ1NldC5jbGFzcyk7CisKKyAgICAgICAgX3Rlc3QoIi8/YXJncz1hJmFyZ3M9YiZhcmdzPWMiLCAiYXBwbGljYXRpb24vc3RyaW5nU2V0Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nU2V0RW1wdHlHZXQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VTdHJpbmdTZXRFbXB0eS5jbGFzcyk7CisKKyAgICAgICAgX3Rlc3QoIi8/YXJncyZhcmdzJmFyZ3MiLCAiYXBwbGljYXRpb24vc3RyaW5nU2V0Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0R2V0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlU3RyaW5nU2V0LmNsYXNzKTsKKworICAgICAgICBfdGVzdCgiLz9hcmdzPWEmYXJncz1iJmFyZ3M9YyIsICJhcHBsaWNhdGlvbi9TZXQiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdTZXRFbXB0eURlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VTdHJpbmdTZXRFbXB0eURlZmF1bHQuY2xhc3MpOworCisgICAgICAgIF90ZXN0KCIvIiwgImFwcGxpY2F0aW9uL3N0cmluZ1NldCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNldEVtcHR5RGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZ1NldEVtcHR5RGVmYXVsdC5jbGFzcyk7CisKKyAgICAgICAgX3Rlc3QoIi8iLCAiYXBwbGljYXRpb24vU2V0Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nU2V0RGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZ1NldERlZmF1bHQuY2xhc3MpOworCisgICAgICAgIF90ZXN0KCIvIiwgImFwcGxpY2F0aW9uL3N0cmluZ1NldCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNldERlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VTdHJpbmdTZXREZWZhdWx0LmNsYXNzKTsKKworICAgICAgICBfdGVzdCgiLyIsICJhcHBsaWNhdGlvbi9TZXQiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXREZWZhdWx0T3ZlcnJpZGUoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VTdHJpbmdTZXREZWZhdWx0T3ZlcnJpZGUuY2xhc3MpOworCisgICAgICAgIF90ZXN0KCIvP2FyZ3M9YiIsICJhcHBsaWNhdGlvbi9TZXQiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvUXVlcnlQYXJhbUFzU29ydGVkU2V0UHJpbWl0aXZlVGVzdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L1F1ZXJ5UGFyYW1Bc1NvcnRlZFNldFByaW1pdGl2ZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDJhNTZhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L1F1ZXJ5UGFyYW1Bc1NvcnRlZFNldFByaW1pdGl2ZVRlc3QuamF2YQpAQCAtMCwwICsxLDM1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuaW5qZWN0OworCitpbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5EZWZhdWx0VmFsdWU7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXNwb25zZTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgUXVlcnlQYXJhbUFzU29ydGVkU2V0UHJpbWl0aXZlVGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdCB7CisKKyAgICBwdWJsaWMgUXVlcnlQYXJhbUFzU29ydGVkU2V0UHJpbWl0aXZlVGVzdCgpIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbigKKyAgICAgICAgICAgICAgICBSZXNvdXJjZVF1ZXJ5UHJpbWl0aXZlU29ydGVkU2V0LmNsYXNzLAorICAgICAgICAgICAgICAgIFJlc291cmNlUXVlcnlQcmltaXRpdmVTb3J0ZWRTZXREZWZhdWx0RW1wdHkuY2xhc3MsCisgICAgICAgICAgICAgICAgUmVzb3VyY2VRdWVyeVByaW1pdGl2ZVNvcnRlZFNldERlZmF1bHQuY2xhc3MsCisgICAgICAgICAgICAgICAgUmVzb3VyY2VRdWVyeVByaW1pdGl2ZVNvcnRlZFNldERlZmF1bHRPdmVycmlkZS5jbGFzcworICAgICAgICApOworICAgIH0KKworICAgIEBQYXRoKCIvU29ydGVkU2V0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlUXVlcnlQcmltaXRpdmVTb3J0ZWRTZXQgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9ib29sZWFuIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldEJvb2xlYW4oQFF1ZXJ5UGFyYW0oImJvb2xlYW4iKSBTb3J0ZWRTZXQ8Qm9vbGVhbj4gdikgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh2LmNvbnRhaW5zKHRydWUpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYnl0ZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRCeXRlKEBRdWVyeVBhcmFtKCJieXRlIikgU29ydGVkU2V0PEJ5dGU+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUodi5jb250YWlucygoYnl0ZSkgMTI3KSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3Nob3J0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldFNob3J0KEBRdWVyeVBhcmFtKCJzaG9ydCIpIFNvcnRlZFNldDxTaG9ydD4gdikgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh2LmNvbnRhaW5zKChzaG9ydCkgMzI3NjcpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vaW50IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldEludGVnZXIoQFF1ZXJ5UGFyYW0oImludCIpIFNvcnRlZFNldDxJbnRlZ2VyPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHYuY29udGFpbnMoMjE0NzQ4MzY0NykpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9sb25nIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldExvbmcoQFF1ZXJ5UGFyYW0oImxvbmciKSBTb3J0ZWRTZXQ8TG9uZz4gdikgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh2LmNvbnRhaW5zKDkyMjMzNzIwMzY4NTQ3NzU4MDdMKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Zsb2F0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldEZsb2F0KEBRdWVyeVBhcmFtKCJmbG9hdCIpIFNvcnRlZFNldDxGbG9hdD4gdikgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh2LmNvbnRhaW5zKDMuMTQxNTkyNjVmKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2RvdWJsZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXREb3VibGUoQFF1ZXJ5UGFyYW0oImRvdWJsZSIpIFNvcnRlZFNldDxEb3VibGU+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUodi5jb250YWlucygzLjE0MTU5MjY1MzU4OTc5ZCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvU29ydGVkU2V0L2RlZmF1bHQvbnVsbCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVF1ZXJ5UHJpbWl0aXZlU29ydGVkU2V0RGVmYXVsdEVtcHR5IHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYm9vbGVhbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRCb29sZWFuKEBRdWVyeVBhcmFtKCJib29sZWFuIikgU29ydGVkU2V0PEJvb2xlYW4+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCB2LnNpemUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2J5dGUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0Qnl0ZShAUXVlcnlQYXJhbSgiYnl0ZSIpIFNvcnRlZFNldDxCeXRlPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdi5zaXplKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9zaG9ydCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRTaG9ydChAUXVlcnlQYXJhbSgic2hvcnQiKSBTb3J0ZWRTZXQ8U2hvcnQ+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCB2LnNpemUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2ludCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRJbnRlZ2VyKEBRdWVyeVBhcmFtKCJpbnQiKSBTb3J0ZWRTZXQ8SW50ZWdlcj4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHYuc2l6ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vbG9uZyIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRMb25nKEBRdWVyeVBhcmFtKCJsb25nIikgU29ydGVkU2V0PExvbmc+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCB2LnNpemUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Zsb2F0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldEZsb2F0KEBRdWVyeVBhcmFtKCJmbG9hdCIpIFNvcnRlZFNldDxGbG9hdD4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHYuc2l6ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZG91YmxlIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldERvdWJsZShAUXVlcnlQYXJhbSgiZG91YmxlIikgU29ydGVkU2V0PERvdWJsZT4gdikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHYuc2l6ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL1NvcnRlZFNldC9kZWZhdWx0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlUXVlcnlQcmltaXRpdmVTb3J0ZWRTZXREZWZhdWx0IHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYm9vbGVhbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRCb29sZWFuKEBRdWVyeVBhcmFtKCJib29sZWFuIikgQERlZmF1bHRWYWx1ZSgidHJ1ZSIpIFNvcnRlZFNldDxCb29sZWFuPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHYuY29udGFpbnModHJ1ZSkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9ieXRlIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldEJ5dGUoQFF1ZXJ5UGFyYW0oImJ5dGUiKSBARGVmYXVsdFZhbHVlKCIxMjciKSBTb3J0ZWRTZXQ8Qnl0ZT4gdikgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh2LmNvbnRhaW5zKChieXRlKSAxMjcpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vc2hvcnQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0U2hvcnQoQFF1ZXJ5UGFyYW0oInNob3J0IikgQERlZmF1bHRWYWx1ZSgiMzI3NjciKSBTb3J0ZWRTZXQ8U2hvcnQ+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUodi5jb250YWlucygoc2hvcnQpIDMyNzY3KSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2ludCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRJbnRlZ2VyKEBRdWVyeVBhcmFtKCJpbnQiKSBARGVmYXVsdFZhbHVlKCIyMTQ3NDgzNjQ3IikgU29ydGVkU2V0PEludGVnZXI+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUodi5jb250YWlucygyMTQ3NDgzNjQ3KSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2xvbmciKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0TG9uZyhAUXVlcnlQYXJhbSgibG9uZyIpIEBEZWZhdWx0VmFsdWUoIjkyMjMzNzIwMzY4NTQ3NzU4MDciKSBTb3J0ZWRTZXQ8TG9uZz4gdikgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh2LmNvbnRhaW5zKDkyMjMzNzIwMzY4NTQ3NzU4MDdMKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Zsb2F0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldEZsb2F0KEBRdWVyeVBhcmFtKCJmbG9hdCIpIEBEZWZhdWx0VmFsdWUoIjMuMTQxNTkyNjUiKSBTb3J0ZWRTZXQ8RmxvYXQ+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUodi5jb250YWlucygzLjE0MTU5MjY1ZikpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9kb3VibGUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0RG91YmxlKEBRdWVyeVBhcmFtKCJkb3VibGUiKSBARGVmYXVsdFZhbHVlKCIzLjE0MTU5MjY1MzU4OTc5IikgU29ydGVkU2V0PERvdWJsZT4gdikgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh2LmNvbnRhaW5zKDMuMTQxNTkyNjUzNTg5NzlkKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi9Tb3J0ZWRTZXQvZGVmYXVsdC9vdmVycmlkZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVF1ZXJ5UHJpbWl0aXZlU29ydGVkU2V0RGVmYXVsdE92ZXJyaWRlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYm9vbGVhbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRCb29sZWFuKEBRdWVyeVBhcmFtKCJib29sZWFuIikgQERlZmF1bHRWYWx1ZSgiZmFsc2UiKSBTb3J0ZWRTZXQ8Qm9vbGVhbj4gdikgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh2LmNvbnRhaW5zKHRydWUpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYnl0ZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRCeXRlKEBRdWVyeVBhcmFtKCJieXRlIikgQERlZmF1bHRWYWx1ZSgiMCIpIFNvcnRlZFNldDxCeXRlPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHYuY29udGFpbnMoKGJ5dGUpIDEyNykpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9zaG9ydCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRTaG9ydChAUXVlcnlQYXJhbSgic2hvcnQiKSBARGVmYXVsdFZhbHVlKCIwIikgU29ydGVkU2V0PFNob3J0PiB2KSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHYuY29udGFpbnMoKHNob3J0KSAzMjc2NykpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9pbnQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0SW50ZWdlcihAUXVlcnlQYXJhbSgiaW50IikgQERlZmF1bHRWYWx1ZSgiMCIpIFNvcnRlZFNldDxJbnRlZ2VyPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHYuY29udGFpbnMoMjE0NzQ4MzY0NykpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9sb25nIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldExvbmcoQFF1ZXJ5UGFyYW0oImxvbmciKSBARGVmYXVsdFZhbHVlKCIwIikgU29ydGVkU2V0PExvbmc+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUodi5jb250YWlucyg5MjIzMzcyMDM2ODU0Nzc1ODA3TCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mbG9hdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRGbG9hdChAUXVlcnlQYXJhbSgiZmxvYXQiKSBARGVmYXVsdFZhbHVlKCIwLjAiKSBTb3J0ZWRTZXQ8RmxvYXQ+IHYpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUodi5jb250YWlucygzLjE0MTU5MjY1ZikpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9kb3VibGUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0RG91YmxlKEBRdWVyeVBhcmFtKCJkb3VibGUiKSBARGVmYXVsdFZhbHVlKCIwLjAiKSBTb3J0ZWRTZXQ8RG91YmxlPiB2KSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHYuY29udGFpbnMoMy4xNDE1OTI2NTM1ODk3OWQpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIF90ZXN0KFN0cmluZyB0eXBlLCBTdHJpbmcgdmFsdWUpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHBhcmFtID0gdHlwZSArICI9IiArIHZhbHVlOworCisgICAgICAgIHN1cGVyLmdldFJlc3BvbnNlQ29udGV4dCgiL1NvcnRlZFNldD8iICsgcGFyYW0gKyAiJiIgKyBwYXJhbSArICImIiArIHBhcmFtLCAiYXBwbGljYXRpb24vIiArIHR5cGUpOworICAgIH0KKworICAgIHZvaWQgX3Rlc3REZWZhdWx0KFN0cmluZyBiYXNlLCBTdHJpbmcgdHlwZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLmdldFJlc3BvbnNlQ29udGV4dChiYXNlICsgImRlZmF1bHQvbnVsbCIsICJhcHBsaWNhdGlvbi8iICsgdHlwZSk7CisKKyAgICAgICAgc3VwZXIuZ2V0UmVzcG9uc2VDb250ZXh0KGJhc2UgKyAiZGVmYXVsdCIsICJhcHBsaWNhdGlvbi8iICsgdHlwZSk7CisKKyAgICAgICAgU3RyaW5nIHBhcmFtID0gdHlwZSArICI9IiArIHZhbHVlOworICAgICAgICBzdXBlci5nZXRSZXNwb25zZUNvbnRleHQoYmFzZSArICJkZWZhdWx0L292ZXJyaWRlPyIgKyBwYXJhbSwgImFwcGxpY2F0aW9uLyIgKyB0eXBlKTsKKyAgICB9CisKKyAgICB2b2lkIF90ZXN0U29ydGVkU2V0RGVmYXVsdChTdHJpbmcgdHlwZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0RGVmYXVsdCgiL1NvcnRlZFNldC8iLCB0eXBlLCB2YWx1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Qm9vbGVhbigpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoImJvb2xlYW4iLCAidHJ1ZSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEJvb2xlYW5QcmltaXRpdmVTb3J0ZWRTZXREZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdFNvcnRlZFNldERlZmF1bHQoImJvb2xlYW4iLCAidHJ1ZSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEJ5dGUoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJieXRlIiwgIjEyNyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEJ5dGVQcmltaXRpdmVTb3J0ZWRTZXREZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdFNvcnRlZFNldERlZmF1bHQoImJ5dGUiLCAiMTI3Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2hvcnQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJzaG9ydCIsICIzMjc2NyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFNob3J0UHJpbXRpdmVTb3J0ZWRTZXREZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdFNvcnRlZFNldERlZmF1bHQoInNob3J0IiwgIjMyNzY3Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW50KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdCgiaW50IiwgIjIxNDc0ODM2NDciKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJbnRQcmltaXRpdmVTb3J0ZWRTZXREZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdFNvcnRlZFNldERlZmF1bHQoImludCIsICIyMTQ3NDgzNjQ3Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TG9uZygpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoImxvbmciLCAiOTIyMzM3MjAzNjg1NDc3NTgwNyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldExvbmdQcmltaXRpdmVTb3J0ZWRTZXREZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdFNvcnRlZFNldERlZmF1bHQoImxvbmciLCAiOTIyMzM3MjAzNjg1NDc3NTgwNyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEZsb2F0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdCgiZmxvYXQiLCAiMy4xNDE1OTI2NSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEZsb2F0UHJpbWl0aXZlU29ydGVkU2V0RGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RTb3J0ZWRTZXREZWZhdWx0KCJmbG9hdCIsICIzLjE0MTU5MjY1Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RG91YmxlKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdCgiZG91YmxlIiwgIjMuMTQxNTkyNjUzNTg5NzkiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXREb3VibGVQcmltaXRpdmVTb3J0ZWRTZXREZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdFNvcnRlZFNldERlZmF1bHQoImRvdWJsZSIsICIzLjE0MTU5MjY1MzU4OTc5Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFkUHJpbWl0aXZlU29ydGVkU2V0VmFsdWUoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gc3VwZXIuZ2V0UmVzcG9uc2VDb250ZXh0KCIvU29ydGVkU2V0P2ludD1hYmNkZWYmaW50PWFiY2RlZiIsICJhcHBsaWNhdGlvbi9pbnQiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNDA0LCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L1F1ZXJ5UGFyYW1Bc1NvcnRlZFNldFN0cmluZ1Rlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9RdWVyeVBhcmFtQXNTb3J0ZWRTZXRTdHJpbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFjMjM0MQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9RdWVyeVBhcmFtQXNTb3J0ZWRTZXRTdHJpbmdUZXN0LmphdmEKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLmluamVjdDsKKworaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRTZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuRGVmYXVsdFZhbHVlOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCitwdWJsaWMgY2xhc3MgUXVlcnlQYXJhbUFzU29ydGVkU2V0U3RyaW5nVGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdCB7CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVN0cmluZ1NvcnRlZFNldCB7CisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9zdHJpbmdTb3J0ZWRTZXQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0U3RyaW5nKEBRdWVyeVBhcmFtKCJhcmdzIikgU29ydGVkU2V0PFN0cmluZz4gYXJncykgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhcmdzLmNvbnRhaW5zKCJhIikpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhcmdzLmNvbnRhaW5zKCJiIikpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhcmdzLmNvbnRhaW5zKCJjIikpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9Tb3J0ZWRTZXQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBRdWVyeVBhcmFtKCJhcmdzIikgU29ydGVkU2V0IGFyZ3MpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoYXJncy5jb250YWlucygiYSIpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoYXJncy5jb250YWlucygiYiIpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoYXJncy5jb250YWlucygiYyIpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVN0cmluZ1NvcnRlZFNldEVtcHR5IHsKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3N0cmluZ1NvcnRlZFNldCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRTdHJpbmcoQFF1ZXJ5UGFyYW0oImFyZ3MiKSBTb3J0ZWRTZXQ8U3RyaW5nPiBhcmdzKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYXJncy5zaXplKCkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhcmdzLmNvbnRhaW5zKCIiKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VTdHJpbmdTb3J0ZWRTZXRFbXB0eURlZmF1bHQgeworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vc3RyaW5nU29ydGVkU2V0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldFN0cmluZygKKyAgICAgICAgICAgICAgICBAUXVlcnlQYXJhbSgiYXJncyIpIFNvcnRlZFNldDxTdHJpbmc+IGFyZ3MpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBhcmdzLnNpemUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL1NvcnRlZFNldCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoCisgICAgICAgICAgICAgICAgQFF1ZXJ5UGFyYW0oImFyZ3MiKSBTb3J0ZWRTZXQgYXJncykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGFyZ3Muc2l6ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVN0cmluZ1NvcnRlZFNldERlZmF1bHQgeworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vc3RyaW5nU29ydGVkU2V0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldFN0cmluZygKKyAgICAgICAgICAgICAgICBAUXVlcnlQYXJhbSgiYXJncyIpIEBEZWZhdWx0VmFsdWUoImEiKSBTb3J0ZWRTZXQ8U3RyaW5nPiBhcmdzKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGFyZ3MuY29udGFpbnMoImEiKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL1NvcnRlZFNldCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoCisgICAgICAgICAgICAgICAgQFF1ZXJ5UGFyYW0oImFyZ3MiKSBARGVmYXVsdFZhbHVlKCJhIikgU29ydGVkU2V0IGFyZ3MpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoYXJncy5jb250YWlucygiYSIpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVN0cmluZ1NvcnRlZFNldERlZmF1bHRPdmVycmlkZSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9zdHJpbmdTb3J0ZWRTZXQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0U3RyaW5nKAorICAgICAgICAgICAgICAgIEBRdWVyeVBhcmFtKCJhcmdzIikgQERlZmF1bHRWYWx1ZSgiYSIpIFNvcnRlZFNldDxTdHJpbmc+IGFyZ3MpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoYXJncy5jb250YWlucygiYiIpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vU29ydGVkU2V0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldCgKKyAgICAgICAgICAgICAgICBAUXVlcnlQYXJhbSgiYXJncyIpIEBEZWZhdWx0VmFsdWUoImEiKSBTb3J0ZWRTZXQgYXJncykgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhcmdzLmNvbnRhaW5zKCJiIikpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ1NvcnRlZFNldEdldCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZ1NvcnRlZFNldC5jbGFzcyk7CisKKyAgICAgICAgX3Rlc3QoIi8/YXJncz1hJmFyZ3M9YiZhcmdzPWMiLCAiYXBwbGljYXRpb24vc3RyaW5nU29ydGVkU2V0Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nU29ydGVkU2V0RW1wdHlHZXQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VTdHJpbmdTb3J0ZWRTZXRFbXB0eS5jbGFzcyk7CisKKyAgICAgICAgX3Rlc3QoIi8/YXJncyZhcmdzJmFyZ3MiLCAiYXBwbGljYXRpb24vc3RyaW5nU29ydGVkU2V0Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U29ydGVkU2V0R2V0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlU3RyaW5nU29ydGVkU2V0LmNsYXNzKTsKKworICAgICAgICBfdGVzdCgiLz9hcmdzPWEmYXJncz1iJmFyZ3M9YyIsICJhcHBsaWNhdGlvbi9Tb3J0ZWRTZXQiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdTb3J0ZWRTZXRFbXB0eURlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VTdHJpbmdTb3J0ZWRTZXRFbXB0eURlZmF1bHQuY2xhc3MpOworCisgICAgICAgIF90ZXN0KCIvIiwgImFwcGxpY2F0aW9uL3N0cmluZ1NvcnRlZFNldCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNvcnRlZFNldEVtcHR5RGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZ1NvcnRlZFNldEVtcHR5RGVmYXVsdC5jbGFzcyk7CisKKyAgICAgICAgX3Rlc3QoIi8iLCAiYXBwbGljYXRpb24vU29ydGVkU2V0Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nU29ydGVkU2V0RGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZ1NvcnRlZFNldERlZmF1bHQuY2xhc3MpOworCisgICAgICAgIF90ZXN0KCIvIiwgImFwcGxpY2F0aW9uL3N0cmluZ1NvcnRlZFNldCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNvcnRlZFNldERlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VTdHJpbmdTb3J0ZWRTZXREZWZhdWx0LmNsYXNzKTsKKworICAgICAgICBfdGVzdCgiLyIsICJhcHBsaWNhdGlvbi9Tb3J0ZWRTZXQiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTb3J0ZWRTZXREZWZhdWx0T3ZlcnJpZGUoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VTdHJpbmdTb3J0ZWRTZXREZWZhdWx0T3ZlcnJpZGUuY2xhc3MpOworCisgICAgICAgIF90ZXN0KCIvP2FyZ3M9YiIsICJhcHBsaWNhdGlvbi9Tb3J0ZWRTZXQiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvUXVlcnlQYXJhbUFzU3RyaW5nVGVzdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L1F1ZXJ5UGFyYW1Bc1N0cmluZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTEwZmNhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L1F1ZXJ5UGFyYW1Bc1N0cmluZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDM0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuaW5qZWN0OworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuRGVmYXVsdFZhbHVlOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVxdWVzdENvbnRleHRCdWlsZGVyOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKK3B1YmxpYyBjbGFzcyBRdWVyeVBhcmFtQXNTdHJpbmdUZXN0IGV4dGVuZHMgQWJzdHJhY3RUZXN0IHsKKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlU3RyaW5nIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQFF1ZXJ5UGFyYW0oImFyZzEiKSBTdHJpbmcgYXJnMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBAUXVlcnlQYXJhbSgiYXJnMiIpIFN0cmluZyBhcmcyLCBAUXVlcnlQYXJhbSgiYXJnMyIpIFN0cmluZyBhcmczKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCBhcmcxKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiYiIsIGFyZzIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJjIiwgYXJnMyk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyBkb1Bvc3QoQFF1ZXJ5UGFyYW0oImFyZzEiKSBTdHJpbmcgYXJnMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQFF1ZXJ5UGFyYW0oImFyZzIiKSBTdHJpbmcgYXJnMiwgQFF1ZXJ5UGFyYW0oImFyZzMiKSBTdHJpbmcgYXJnMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHIpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiYSIsIGFyZzEpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJiIiwgYXJnMik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImMiLCBhcmczKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiY29udGVudCIsIHIpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlU3RyaW5nRW1wdHkgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChAUXVlcnlQYXJhbSgiYXJnMSIpIFN0cmluZyBhcmcxKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIGFyZzEpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlU3RyaW5nQWJzZW50IHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQFF1ZXJ5UGFyYW0oImFyZzEiKSBTdHJpbmcgYXJnMSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIGFyZzEpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlU3RyaW5nTGlzdCB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3N0cmluZ2xpc3QiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0U3RyaW5nKEBRdWVyeVBhcmFtKCJhcmdzIikgTGlzdDxTdHJpbmc+IGFyZ3MpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiYSIsIGFyZ3MuZ2V0KDApKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiYiIsIGFyZ3MuZ2V0KDEpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiYyIsIGFyZ3MuZ2V0KDIpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vbGlzdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoQFF1ZXJ5UGFyYW0oImFyZ3MiKSBMaXN0IGFyZ3MpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuY2xhc3MsIGFyZ3MuZ2V0KDApLmdldENsYXNzKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgYXJncy5nZXQoMCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5jbGFzcywgYXJncy5nZXQoMSkuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImIiLCBhcmdzLmdldCgxKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmNsYXNzLCBhcmdzLmdldCgyKS5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiYyIsIGFyZ3MuZ2V0KDIpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVN0cmluZ0xpc3RFbXB0eSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3N0cmluZ2xpc3QiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0U3RyaW5nKEBRdWVyeVBhcmFtKCJhcmdzIikgTGlzdDxTdHJpbmc+IGFyZ3MpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzLCBhcmdzLnNpemUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIGFyZ3MuZ2V0KDApKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiIiwgYXJncy5nZXQoMSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBhcmdzLmdldCgyKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VTdHJpbmdOdWxsRGVmYXVsdCB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KEBRdWVyeVBhcmFtKCJhcmcxIikgU3RyaW5nIGFyZzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQFF1ZXJ5UGFyYW0oImFyZzIiKSBTdHJpbmcgYXJnMiwgQFF1ZXJ5UGFyYW0oImFyZzMiKSBTdHJpbmcgYXJnMykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIGFyZzEpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIGFyZzIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIGFyZzMpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlU3RyaW5nRGVmYXVsdCB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KAorICAgICAgICAgICAgICAgIEBRdWVyeVBhcmFtKCJhcmcxIikgQERlZmF1bHRWYWx1ZSgiYSIpIFN0cmluZyBhcmcxLAorICAgICAgICAgICAgICAgIEBRdWVyeVBhcmFtKCJhcmcyIikgQERlZmF1bHRWYWx1ZSgiYiIpIFN0cmluZyBhcmcyLAorICAgICAgICAgICAgICAgIEBRdWVyeVBhcmFtKCJhcmczIikgQERlZmF1bHRWYWx1ZSgiYyIpIFN0cmluZyBhcmczKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCBhcmcxKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiYiIsIGFyZzIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJjIiwgYXJnMyk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VTdHJpbmdEZWZhdWx0T3ZlcnJpZGUgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldCgKKyAgICAgICAgICAgICAgICBAUXVlcnlQYXJhbSgiYXJnMSIpIEBEZWZhdWx0VmFsdWUoImEiKSBTdHJpbmcgYXJnMSwKKyAgICAgICAgICAgICAgICBAUXVlcnlQYXJhbSgiYXJnMiIpIEBEZWZhdWx0VmFsdWUoImIiKSBTdHJpbmcgYXJnMiwKKyAgICAgICAgICAgICAgICBAUXVlcnlQYXJhbSgiYXJnMyIpIEBEZWZhdWx0VmFsdWUoImMiKSBTdHJpbmcgYXJnMykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJkIiwgYXJnMSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImUiLCBhcmcyKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZiIsIGFyZzMpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlU3RyaW5nTGlzdEVtcHR5RGVmYXVsdCB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3N0cmluZ2xpc3QiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0U3RyaW5nKAorICAgICAgICAgICAgICAgIEBRdWVyeVBhcmFtKCJhcmdzIikgTGlzdDxTdHJpbmc+IGFyZ3MpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBhcmdzLnNpemUoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2xpc3QiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KAorICAgICAgICAgICAgICAgIEBRdWVyeVBhcmFtKCJhcmdzIikgTGlzdCBhcmdzKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgYXJncy5zaXplKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlU3RyaW5nTGlzdERlZmF1bHQgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9zdHJpbmdsaXN0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldFN0cmluZygKKyAgICAgICAgICAgICAgICBAUXVlcnlQYXJhbSgiYXJncyIpIEBEZWZhdWx0VmFsdWUoImEiKSBMaXN0PFN0cmluZz4gYXJncykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgYXJncy5nZXQoMCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9saXN0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldCgKKyAgICAgICAgICAgICAgICBAUXVlcnlQYXJhbSgiYXJncyIpIEBEZWZhdWx0VmFsdWUoImEiKSBMaXN0IGFyZ3MpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhTdHJpbmcuY2xhc3MsIGFyZ3MuZ2V0KDApLmdldENsYXNzKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgYXJncy5nZXQoMCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlU3RyaW5nTGlzdERlZmF1bHRPdmVycmlkZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3N0cmluZ2xpc3QiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0U3RyaW5nKAorICAgICAgICAgICAgICAgIEBRdWVyeVBhcmFtKCJhcmdzIikgQERlZmF1bHRWYWx1ZSgiYSIpIExpc3Q8U3RyaW5nPiBhcmdzKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImIiLCBhcmdzLmdldCgwKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2xpc3QiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KAorICAgICAgICAgICAgICAgIEBRdWVyeVBhcmFtKCJhcmdzIikgQERlZmF1bHRWYWx1ZSgiYSIpIExpc3QgYXJncykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5jbGFzcywgYXJncy5nZXQoMCkuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImIiLCBhcmdzLmdldCgwKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nR2V0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBfdGVzdCgiLz9hcmcxPWEmYXJnMj1iJmFyZzM9YyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ0VtcHR5R2V0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlU3RyaW5nRW1wdHkuY2xhc3MpOworCisgICAgICAgIF90ZXN0KCIvP2FyZzEiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdBYnNlbnRHZXQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VTdHJpbmdBYnNlbnQuY2xhc3MpOworCisgICAgICAgIF90ZXN0KCIvIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nUG9zdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2VDb250ZXh0ID0gYXBwbHkoCisgICAgICAgICAgICAgICAgUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8/YXJnMT1hJmFyZzI9YiZhcmczPWMiLCAiUE9TVCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuZW50aXR5KCJjb250ZW50IikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpCisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb250ZW50IiwgcmVzcG9uc2VDb250ZXh0LmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdMaXN0R2V0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlU3RyaW5nTGlzdC5jbGFzcyk7CisKKyAgICAgICAgX3Rlc3QoIi8/YXJncz1hJmFyZ3M9YiZhcmdzPWMiLCAiYXBwbGljYXRpb24vc3RyaW5nbGlzdCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ0xpc3RFbXB0eUdldCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZ0xpc3RFbXB0eS5jbGFzcyk7CisKKyAgICAgICAgX3Rlc3QoIi8/YXJncyZhcmdzJmFyZ3MiLCAiYXBwbGljYXRpb24vc3RyaW5nbGlzdCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExpc3RHZXQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VTdHJpbmdMaXN0LmNsYXNzKTsKKworICAgICAgICBfdGVzdCgiLz9hcmdzPWEmYXJncz1iJmFyZ3M9YyIsICJhcHBsaWNhdGlvbi9saXN0Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nTnVsbERlZmF1bHQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VTdHJpbmdOdWxsRGVmYXVsdC5jbGFzcyk7CisKKyAgICAgICAgX3Rlc3QoIi8iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdEZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlU3RyaW5nRGVmYXVsdC5jbGFzcyk7CisKKyAgICAgICAgX3Rlc3QoIi8iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdEZWZhdWx0T3ZlcnJpZGUoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VTdHJpbmdEZWZhdWx0T3ZlcnJpZGUuY2xhc3MpOworCisgICAgICAgIF90ZXN0KCIvP2FyZzE9ZCZhcmcyPWUmYXJnMz1mIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nTGlzdEVtcHR5RGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZ0xpc3RFbXB0eURlZmF1bHQuY2xhc3MpOworCisgICAgICAgIF90ZXN0KCIvIiwgImFwcGxpY2F0aW9uL3N0cmluZ2xpc3QiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0RW1wdHlEZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlU3RyaW5nTGlzdEVtcHR5RGVmYXVsdC5jbGFzcyk7CisKKyAgICAgICAgX3Rlc3QoIi8iLCAiYXBwbGljYXRpb24vbGlzdCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ0xpc3REZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlU3RyaW5nTGlzdERlZmF1bHQuY2xhc3MpOworCisgICAgICAgIF90ZXN0KCIvIiwgImFwcGxpY2F0aW9uL3N0cmluZ2xpc3QiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0RGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZ0xpc3REZWZhdWx0LmNsYXNzKTsKKworICAgICAgICBfdGVzdCgiLyIsICJhcHBsaWNhdGlvbi9saXN0Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGlzdERlZmF1bHRPdmVycmlkZSgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZ0xpc3REZWZhdWx0T3ZlcnJpZGUuY2xhc3MpOworCisgICAgICAgIF90ZXN0KCIvP2FyZ3M9YiIsICJhcHBsaWNhdGlvbi9saXN0Iik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L1F1ZXJ5UGFyYW1FbnVtVGVzdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L1F1ZXJ5UGFyYW1FbnVtVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkZWM4ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvUXVlcnlQYXJhbUVudW1UZXN0LmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuaW5qZWN0OworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgUXVlcnlQYXJhbUVudW1UZXN0IGV4dGVuZHMgQWJzdHJhY3RUZXN0IHsKKworICAgIHB1YmxpYyBzdGF0aWMgZW51bSBEYXlzIHsKKyAgICAgICAgTU9OLCBUVUUsIFdFRCwgVEhVLCBGUkksIFNBVCwgU1VOOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgRGF5cyBmcm9tU3RyaW5nKFN0cmluZyBzKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWVPZihzLnRvVXBwZXJDYXNlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VTdHJpbmcgeworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoCisgICAgICAgICAgICAgICAgQFF1ZXJ5UGFyYW0oImFyZzEiKSBEYXlzIGQpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhEYXlzLk1PTiwgZCk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW51bUdldCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgX3Rlc3QoIi8/YXJnMT1NT04iKTsKKyAgICAgICAgX3Rlc3QoIi8/YXJnMT1tb24iKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvUXVlcnlQYXJhbUZyb21TdHJpbmdUZXN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvUXVlcnlQYXJhbUZyb21TdHJpbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUyZDBlNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9RdWVyeVBhcmFtRnJvbVN0cmluZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5pbmplY3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgUXVlcnlQYXJhbUZyb21TdHJpbmdUZXN0IGV4dGVuZHMgQWJzdHJhY3RUZXN0IHsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGFyYW1ldGVyIHsKKyAgICAgICAgcHVibGljIFN0cmluZyBzOworCisgICAgICAgIHByaXZhdGUgUGFyYW1ldGVyKENoYXJTZXF1ZW5jZSBjcykgeworICAgICAgICAgICAgdGhpcy5zID0gY3MudG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUGFyYW1ldGVyIGZyb21TdHJpbmcoU3RyaW5nIHMpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUGFyYW1ldGVyKHMgKyAiZnJvbVN0cmluZyIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlU3RyaW5nIHsKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KAorICAgICAgICAgICAgICAgIEBRdWVyeVBhcmFtKCJhcmcxIikgUGFyYW1ldGVyIHApIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMy4xNDVmcm9tU3RyaW5nIiwgcC5zKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJsaXN0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldChAUXVlcnlQYXJhbSgiYXJnIikgTGlzdDxQYXJhbWV0ZXI+IHApIHsKKyAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbihwLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJbYWZyb21TdHJpbmcsIGZyb21TdHJpbmcsIGJmcm9tU3RyaW5nXSIsIHAudG9TdHJpbmcoKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiZW1wdHkiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0RW1wdHkoCisgICAgICAgICAgICAgICAgQFF1ZXJ5UGFyYW0oImFyZzEiKSBQYXJhbWV0ZXIgcCkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJmcm9tU3RyaW5nIiwgcC5zKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGcm9tU3RyaW5nR2V0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBfdGVzdCgiLz9hcmcxPTMuMTQ1Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGlzdEZyb21TdHJpbmdHZXQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VTdHJpbmcuY2xhc3MpOworCisgICAgICAgIF90ZXN0KCIvbGlzdC8/YXJnPWEmYXJnPSZhcmc9YiIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZyb21FbXB0eVN0cmluZ0dldCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgX3Rlc3QoIi9lbXB0eS8/YXJnMT0iKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvUXVlcnlQYXJhbVNldFN0cmluZ0NvbnN0cnVjdG9yVGVzdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L1F1ZXJ5UGFyYW1TZXRTdHJpbmdDb25zdHJ1Y3RvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2ViNzFhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L1F1ZXJ5UGFyYW1TZXRTdHJpbmdDb25zdHJ1Y3RvclRlc3QuamF2YQpAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuaW5qZWN0OworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5EZWZhdWx0VmFsdWU7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgUXVlcnlQYXJhbVNldFN0cmluZ0NvbnN0cnVjdG9yVGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdCB7CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVN0cmluZ1NldCB7CisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldFN0cmluZyhAUXVlcnlQYXJhbSgiYXJncyIpIFNldDxCaWdEZWNpbWFsPiBhcmdzKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGFyZ3MuY29udGFpbnMobmV3IEJpZ0RlY2ltYWwoIjMuMTQ1IikpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoYXJncy5jb250YWlucyhuZXcgQmlnRGVjaW1hbCgiMi43MTgiKSkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhcmdzLmNvbnRhaW5zKG5ldyBCaWdEZWNpbWFsKCIxLjYxOCIpKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VTdHJpbmdTZXRFbXB0eURlZmF1bHQgeworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRTdHJpbmcoQFF1ZXJ5UGFyYW0oImFyZ3MiKSBTZXQ8QmlnRGVjaW1hbD4gYXJncykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGFyZ3Muc2l6ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVN0cmluZ1NldERlZmF1bHQgeworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgQFF1ZXJ5UGFyYW0oImFyZ3MiKSBARGVmYXVsdFZhbHVlKCIzLjE0NSIpIFNldDxCaWdEZWNpbWFsPiBhcmdzKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGFyZ3MuY29udGFpbnMobmV3IEJpZ0RlY2ltYWwoIjMuMTQ1IikpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVN0cmluZ1NldERlZmF1bHRPdmVycmlkZSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldFN0cmluZygKKyAgICAgICAgICAgICAgICBAUXVlcnlQYXJhbSgiYXJncyIpIEBEZWZhdWx0VmFsdWUoIjMuMTQ1IikgU2V0PEJpZ0RlY2ltYWw+IGFyZ3MpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoYXJncy5jb250YWlucyhuZXcgQmlnRGVjaW1hbCgiMi43MTgiKSkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ0NvbnN0cnVjdG9yU2V0R2V0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlU3RyaW5nU2V0LmNsYXNzKTsKKworICAgICAgICBfdGVzdCgiLz9hcmdzPTMuMTQ1JmFyZ3M9Mi43MTgmYXJncz0xLjYxOCIsICJhcHBsaWNhdGlvbi9zdHJpbmdTZXQiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdDb25zdHJ1Y3RvclNldE51bGxEZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlU3RyaW5nU2V0RW1wdHlEZWZhdWx0LmNsYXNzKTsKKworICAgICAgICBfdGVzdCgiLyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ0NvbnN0cnVjdG9yU2V0RGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZ1NldERlZmF1bHQuY2xhc3MpOworCisgICAgICAgIF90ZXN0KCIvIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nQ29uc3RydWN0b3JTZXREZWZhdWx0T3ZlcnJpZGUoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VTdHJpbmdTZXREZWZhdWx0T3ZlcnJpZGUuY2xhc3MpOworCisgICAgICAgIF90ZXN0KCIvP2FyZ3M9Mi43MTgiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvUXVlcnlQYXJhbVNvcnRlZFNldFN0cmluZ0NvbnN0cnVjdG9yVGVzdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L1F1ZXJ5UGFyYW1Tb3J0ZWRTZXRTdHJpbmdDb25zdHJ1Y3RvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjMyNDEyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L1F1ZXJ5UGFyYW1Tb3J0ZWRTZXRTdHJpbmdDb25zdHJ1Y3RvclRlc3QuamF2YQpAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuaW5qZWN0OworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CitpbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5EZWZhdWx0VmFsdWU7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgUXVlcnlQYXJhbVNvcnRlZFNldFN0cmluZ0NvbnN0cnVjdG9yVGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdCB7CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVN0cmluZ1NvcnRlZFNldCB7CisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldFN0cmluZyhAUXVlcnlQYXJhbSgiYXJncyIpIFNvcnRlZFNldDxCaWdEZWNpbWFsPiBhcmdzKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGFyZ3MuY29udGFpbnMobmV3IEJpZ0RlY2ltYWwoIjMuMTQ1IikpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoYXJncy5jb250YWlucyhuZXcgQmlnRGVjaW1hbCgiMi43MTgiKSkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShhcmdzLmNvbnRhaW5zKG5ldyBCaWdEZWNpbWFsKCIxLjYxOCIpKSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VTdHJpbmdTb3J0ZWRTZXRFbXB0eURlZmF1bHQgeworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRTdHJpbmcoQFF1ZXJ5UGFyYW0oImFyZ3MiKSBTb3J0ZWRTZXQ8QmlnRGVjaW1hbD4gYXJncykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGFyZ3Muc2l6ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVN0cmluZ1NvcnRlZFNldERlZmF1bHQgeworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgQFF1ZXJ5UGFyYW0oImFyZ3MiKSBARGVmYXVsdFZhbHVlKCIzLjE0NSIpIFNvcnRlZFNldDxCaWdEZWNpbWFsPiBhcmdzKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGFyZ3MuY29udGFpbnMobmV3IEJpZ0RlY2ltYWwoIjMuMTQ1IikpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVN0cmluZ1NvcnRlZFNldERlZmF1bHRPdmVycmlkZSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldFN0cmluZygKKyAgICAgICAgICAgICAgICBAUXVlcnlQYXJhbSgiYXJncyIpIEBEZWZhdWx0VmFsdWUoIjMuMTQ1IikgU29ydGVkU2V0PEJpZ0RlY2ltYWw+IGFyZ3MpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoYXJncy5jb250YWlucyhuZXcgQmlnRGVjaW1hbCgiMi43MTgiKSkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ0NvbnN0cnVjdG9yU29ydGVkU2V0R2V0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlU3RyaW5nU29ydGVkU2V0LmNsYXNzKTsKKworICAgICAgICBfdGVzdCgiLz9hcmdzPTMuMTQ1JmFyZ3M9Mi43MTgmYXJncz0xLjYxOCIsICJhcHBsaWNhdGlvbi9zdHJpbmdTb3J0ZWRTZXQiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdDb25zdHJ1Y3RvclNvcnRlZFNldE51bGxEZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlU3RyaW5nU29ydGVkU2V0RW1wdHlEZWZhdWx0LmNsYXNzKTsKKworICAgICAgICBfdGVzdCgiLyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ0NvbnN0cnVjdG9yU29ydGVkU2V0RGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZ1NvcnRlZFNldERlZmF1bHQuY2xhc3MpOworCisgICAgICAgIF90ZXN0KCIvIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nQ29uc3RydWN0b3JTb3J0ZWRTZXREZWZhdWx0T3ZlcnJpZGUoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VTdHJpbmdTb3J0ZWRTZXREZWZhdWx0T3ZlcnJpZGUuY2xhc3MpOworCisgICAgICAgIF90ZXN0KCIvP2FyZ3M9Mi43MTgiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvUXVlcnlQYXJhbVN0cmluZ0NvbnN0cnVjdG9yVGVzdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L1F1ZXJ5UGFyYW1TdHJpbmdDb25zdHJ1Y3RvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWYzZGE0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvaW5qZWN0L1F1ZXJ5UGFyYW1TdHJpbmdDb25zdHJ1Y3RvclRlc3QuamF2YQpAQCAtMCwwICsxLDIyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuaW5qZWN0OworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkRlZmF1bHRWYWx1ZTsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlc3BvbnNlOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgUXVlcnlQYXJhbVN0cmluZ0NvbnN0cnVjdG9yVGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdCB7CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVN0cmluZyB7CisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldCgKKyAgICAgICAgICAgICAgICBAUXVlcnlQYXJhbSgiYXJnMSIpIEJpZ0RlY2ltYWwgYXJnMSwKKyAgICAgICAgICAgICAgICBAUXVlcnlQYXJhbSgiYXJnMiIpIEJpZ0ludGVnZXIgYXJnMiwKKyAgICAgICAgICAgICAgICBAUXVlcnlQYXJhbSgiYXJnMyIpIFVSSSBhcmczKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjMuMTQ1IiwgYXJnMS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMzE0NSIsIGFyZzIudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly90ZXN0IiwgYXJnMy50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVN0cmluZ0xpc3QgeworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRTdHJpbmcoQFF1ZXJ5UGFyYW0oImFyZ3MiKSBMaXN0PEJpZ0RlY2ltYWw+IGFyZ3MpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMy4xNDUiLCBhcmdzLmdldCgwKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMi43MTgiLCBhcmdzLmdldCgxKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMS42MTgiLCBhcmdzLmdldCgyKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVN0cmluZ0xpc3RFbXB0eSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldFN0cmluZyhAUXVlcnlQYXJhbSgiYXJncyIpIExpc3Q8QmlnRGVjaW1hbD4gYXJncykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGFyZ3Muc2l6ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBhcmdzLmdldCgwKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgYXJncy5nZXQoMSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIGFyZ3MuZ2V0KDIpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVN0cmluZ051bGwgeworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQoCisgICAgICAgICAgICAgICAgQFF1ZXJ5UGFyYW0oImFyZzEiKSBCaWdEZWNpbWFsIGFyZzEsCisgICAgICAgICAgICAgICAgQFF1ZXJ5UGFyYW0oImFyZzIiKSBCaWdJbnRlZ2VyIGFyZzIpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBhcmcxKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBhcmcyKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVN0cmluZ051bGxEZWZhdWx0IHsKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KAorICAgICAgICAgICAgICAgIEBRdWVyeVBhcmFtKCJhcmcxIikgQmlnRGVjaW1hbCBhcmcxKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgYXJnMSk7CisgICAgICAgICAgICByZXR1cm4gImNvbnRlbnQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VTdHJpbmdEZWZhdWx0IHsKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KAorICAgICAgICAgICAgICAgIEBRdWVyeVBhcmFtKCJhcmcxIikgQERlZmF1bHRWYWx1ZSgiMy4xNDUiKSBCaWdEZWNpbWFsIGFyZzEpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMy4xNDUiLCBhcmcxLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlU3RyaW5nRGVmYXVsdE92ZXJyaWRlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KAorICAgICAgICAgICAgICAgIEBRdWVyeVBhcmFtKCJhcmcxIikgQERlZmF1bHRWYWx1ZSgiMy4xNDUiKSBCaWdEZWNpbWFsIGFyZzEpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMi43MTgiLCBhcmcxLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlU3RyaW5nTGlzdEVtcHR5RGVmYXVsdCB7CisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldFN0cmluZyhAUXVlcnlQYXJhbSgiYXJncyIpIExpc3Q8QmlnRGVjaW1hbD4gYXJncykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGFyZ3Muc2l6ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVN0cmluZ0xpc3REZWZhdWx0IHsKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0U3RyaW5nKAorICAgICAgICAgICAgICAgIEBRdWVyeVBhcmFtKCJhcmdzIikgQERlZmF1bHRWYWx1ZSgiMy4xNDUiKSBMaXN0PEJpZ0RlY2ltYWw+IGFyZ3MpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMy4xNDUiLCBhcmdzLmdldCgwKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiAiY29udGVudCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVN0cmluZ0xpc3REZWZhdWx0T3ZlcnJpZGUgeworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgQFF1ZXJ5UGFyYW0oImFyZ3MiKSBARGVmYXVsdFZhbHVlKCIzLjE0NSIpIExpc3Q8QmlnRGVjaW1hbD4gYXJncykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIyLjcxOCIsIGFyZ3MuZ2V0KDApLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuICJjb250ZW50IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ0NvbnN0cnVjdG9yR2V0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBfdGVzdCgiLz9hcmcxPTMuMTQ1JmFyZzI9MzE0NSZhcmczPWh0dHA6JTJGJTJGdGVzdCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ0NvbnN0cnVjdG9yTGlzdEdldCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZ0xpc3QuY2xhc3MpOworCisgICAgICAgIF90ZXN0KCIvP2FyZ3M9My4xNDUmYXJncz0yLjcxOCZhcmdzPTEuNjE4IiwgImFwcGxpY2F0aW9uL3N0cmluZ2xpc3QiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdDb25zdHJ1Y3Rvckxpc3RFbXB0eUdldCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZ0xpc3RFbXB0eS5jbGFzcyk7CisKKyAgICAgICAgX3Rlc3QoIi8/YXJncyZhcmdzJmFyZ3MiLCAiYXBwbGljYXRpb24vc3RyaW5nbGlzdCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ0NvbnN0cnVjdG9yTnVsbEdldCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZ051bGwuY2xhc3MpOworCisgICAgICAgIF90ZXN0KCIvP2FyZzE9JmFyZzI9Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nQ29uc3RydWN0b3JOdWxsRGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZ051bGxEZWZhdWx0LmNsYXNzKTsKKworICAgICAgICBfdGVzdCgiLyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ0NvbnN0cnVjdG9yRGVmYXVsdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZVN0cmluZ0RlZmF1bHQuY2xhc3MpOworCisgICAgICAgIF90ZXN0KCIvIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nQ29uc3RydWN0b3JEZWZhdWx0T3ZlcnJpZGUoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VTdHJpbmdEZWZhdWx0LmNsYXNzKTsKKworICAgICAgICBfdGVzdCgiLz9hcmdzPTIuNzE4Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nQ29uc3RydWN0b3JMaXN0RW1wdHlEZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlU3RyaW5nTGlzdEVtcHR5RGVmYXVsdC5jbGFzcyk7CisKKyAgICAgICAgX3Rlc3QoIi8iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdDb25zdHJ1Y3Rvckxpc3REZWZhdWx0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlU3RyaW5nTGlzdERlZmF1bHQuY2xhc3MpOworCisgICAgICAgIF90ZXN0KCIvIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nQ29uc3RydWN0b3JMaXN0RGVmYXVsdE92ZXJyaWRlKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlU3RyaW5nTGlzdERlZmF1bHRPdmVycmlkZS5jbGFzcyk7CisKKyAgICAgICAgX3Rlc3QoIi8/YXJncz0yLjcxOCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJhZFN0cmluZ0NvbnN0cnVjdG9yVmFsdWUoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlQ29udGV4dCA9IGdldFJlc3BvbnNlQ29udGV4dCgiLz9hcmcxPUFCQ0RFRiZhcmcyPTMxNDUmYXJnMz1odHRwOiUyRiUyRnRlc3QiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNDA0LCByZXNwb25zZUNvbnRleHQuZ2V0U3RhdHVzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL2luamVjdC9VcmlUZXN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvVXJpVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2OTBkODYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9pbmplY3QvVXJpVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjk3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5pbmplY3Q7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNsaWVudEJpbmRpbmc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXF1ZXN0Q29udGV4dEJ1aWxkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Vcmk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmluc3RhbmNlT2Y7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFVyaVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFRlc3QgeworCisgICAgQFBhdGgoInRlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UxIHsKKworICAgICAgICBAVXJpKCJodHRwOi8vb3JhY2xlLmNvbSIpCisgICAgICAgIFdlYlRhcmdldCB3ZWJUYXJnZXQxOworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIjEiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0MSgpIHsKKyAgICAgICAgICAgIHJldHVybiB3ZWJUYXJnZXQxLmdldFVyaSgpLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCIyIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldDIoQFVyaSgiaHR0cDovL29yYWNsZS5jb20iKSBXZWJUYXJnZXQgd2ViVGFyZ2V0MikgeworICAgICAgICAgICAgcmV0dXJuIHdlYlRhcmdldDIuZ2V0VXJpKCkudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJ0ZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlMiB7CisKKyAgICAgICAgQFVyaSgiaHR0cDovL29yYWNsZS5jb20ve3BhcmFtfSIpCisgICAgICAgIFdlYlRhcmdldCB3ZWJUYXJnZXQxOworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIjEiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0MSgpIHsKKyAgICAgICAgICAgIHJldHVybiB3ZWJUYXJnZXQxLmdldFVyaSgpID09IG51bGwgPyAibnVsbCIgOiB3ZWJUYXJnZXQxLmdldFVyaSgpLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJ7cGFyYW19IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldDIoQFVyaSgiaHR0cDovL29yYWNsZS5jb20ve3BhcmFtfSIpIFdlYlRhcmdldCB3ZWJUYXJnZXQyKSB7CisgICAgICAgICAgICByZXR1cm4gd2ViVGFyZ2V0Mi5nZXRVcmkoKS50b1N0cmluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInRlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UzIHsKKworICAgICAgICBAVXJpKCJ7cGFyYW19IikKKyAgICAgICAgV2ViVGFyZ2V0IHdlYlRhcmdldDE7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiMSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQxKCkgeworICAgICAgICAgICAgcmV0dXJuIHdlYlRhcmdldDEuZ2V0VXJpKCkgPT0gbnVsbCA/ICJudWxsIiA6IHdlYlRhcmdldDEuZ2V0VXJpKCkudG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIntwYXJhbX0iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0MihAVXJpKCJ7cGFyYW19IikgV2ViVGFyZ2V0IHdlYlRhcmdldDIpIHsKKyAgICAgICAgICAgIHJldHVybiB3ZWJUYXJnZXQyLmdldFVyaSgpLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIEBDbGllbnRCaW5kaW5nCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgICBAVGFyZ2V0KHtFbGVtZW50VHlwZS5GSUVMRCwgRWxlbWVudFR5cGUuUEFSQU1FVEVSfSkKKyAgICBwdWJsaWMgc3RhdGljIEBpbnRlcmZhY2UgTWFuYWdlZCB7CisKKyAgICB9CisKKyAgICBAUGF0aCgidGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZTQgeworCisgICAgICAgIEBVcmkoImh0dHA6Ly9vcmFjbGUuY29tIikKKyAgICAgICAgQE1hbmFnZWQKKyAgICAgICAgV2ViVGFyZ2V0IHdlYlRhcmdldDE7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiMSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQxKCkgeworICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIHdlYlRhcmdldDEuZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnRpZXMoKS5nZXQoInRlc3QtcHJvcGVydHkiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIjIiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0MihAVXJpKCJodHRwOi8vb3JhY2xlLmNvbSIpIEBNYW5hZ2VkIFdlYlRhcmdldCB3ZWJUYXJnZXQyKSB7CisgICAgICAgICAgICByZXR1cm4gKFN0cmluZykgd2ViVGFyZ2V0Mi5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UHJvcGVydGllcygpLmdldCgidGVzdC1wcm9wZXJ0eSIpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiMyIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQzKEBVcmkoInJlbGF0aXZlIikgQE1hbmFnZWQgV2ViVGFyZ2V0IHJlbGF0aXZlVGFyZ2V0KSB7CisgICAgICAgICAgICByZXR1cm4gcmVsYXRpdmVUYXJnZXQuZ2V0VXJpKCkudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldDEoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2UxLmNsYXNzKTsKKworICAgICAgICBmaW5hbCBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGFwcGx5KAorICAgICAgICAgICAgICAgIFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvdGVzdC8xIiwgIkdFVCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL29yYWNsZS5jb20iLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0MigpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZTEuY2xhc3MpOworCisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gYXBwbHkoCisgICAgICAgICAgICAgICAgUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi90ZXN0LzIiLCAiR0VUIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpCisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vb3JhY2xlLmNvbSIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFBhcmFtMSgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZTIuY2xhc3MpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhcHBseSgKKyAgICAgICAgICAgICAgICAgICAgUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi90ZXN0LzEiLCAiR0VUIikuYnVpbGQoKQorICAgICAgICAgICAgKTsKKyAgICAgICAgfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBJU0UgdGhyb3duIGZyb20gV2ViVGFyZ2V0CisgICAgICAgICAgICBhc3NlcnRUaGF0KGV4LmdldENhdXNlKCksIGluc3RhbmNlT2YoSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzKSk7CisgICAgICAgICAgICAvLyBJQUUgdGhyb3duIGZyb20gVXJpQnVpbGRlciAtIHVucmVzb2x2ZWQgdGVtcGxhdGUgcGFyYW1ldGVyIHZhbHVlCisgICAgICAgICAgICBhc3NlcnRUaGF0KGV4LmdldENhdXNlKCkuZ2V0Q2F1c2UoKSwgaW5zdGFuY2VPZihJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFBhcmFtMigpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZTIuY2xhc3MpOworCisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gYXBwbHkoCisgICAgICAgICAgICAgICAgUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi90ZXN0L3BhcmFtZXRlciIsICJHRVQiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9vcmFjbGUuY29tL3BhcmFtZXRlciIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFJlbGF0aXZlMSgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZTMuY2xhc3MpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhcHBseSgKKyAgICAgICAgICAgICAgICAgICAgUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi90ZXN0LzEiLCAiR0VUIikuYnVpbGQoKQorICAgICAgICAgICAgKTsKKyAgICAgICAgfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBJU0UgdGhyb3duIGZyb20gV2ViVGFyZ2V0CisgICAgICAgICAgICBhc3NlcnRUaGF0KGV4LmdldENhdXNlKCksIGluc3RhbmNlT2YoSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzKSk7CisgICAgICAgICAgICAvLyBJQUUgdGhyb3duIGZyb20gVXJpQnVpbGRlciAtIHVucmVzb2x2ZWQgdGVtcGxhdGUgcGFyYW1ldGVyIHZhbHVlCisgICAgICAgICAgICBhc3NlcnRUaGF0KGV4LmdldENhdXNlKCkuZ2V0Q2F1c2UoKSwgaW5zdGFuY2VPZihJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFJlbGF0aXZlMigpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZTMuY2xhc3MpOworCisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gYXBwbHkoCisgICAgICAgICAgICAgICAgUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi90ZXN0L3BhcmFtZXRlciIsICJHRVQiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkKKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIi9wYXJhbWV0ZXIiLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFuYWdlZENsaWVudEluamVjdGlvbjEoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlNC5jbGFzcyk7CisgICAgICAgIC8vIFRPRE8gaW50cm9kdWNlIG5ldyBSZXNvdXJjZUNvbmZpZy5zZXRDbGllbnRQcm9wZXJ0eShDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4sIFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIGhlbHBlciBtZXRob2QKKyAgICAgICAgcmVzb3VyY2VDb25maWcucHJvcGVydHkoTWFuYWdlZC5jbGFzcy5nZXROYW1lKCkgKyAiLnByb3BlcnR5LnRlc3QtcHJvcGVydHkiLCAidGVzdC12YWx1ZSIpOworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKHJlc291cmNlQ29uZmlnKTsKKworICAgICAgICBmaW5hbCBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGFwcGx5KAorICAgICAgICAgICAgICAgIFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvdGVzdC8xIiwgIkdFVCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscygidGVzdC12YWx1ZSIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYW5hZ2VkQ2xpZW50SW5qZWN0aW9uMigpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2U0LmNsYXNzKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucHJvcGVydHkoTWFuYWdlZC5jbGFzcy5nZXROYW1lKCkgKyAiLnByb3BlcnR5LnRlc3QtcHJvcGVydHkiLCAidGVzdC12YWx1ZSIpOworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKHJlc291cmNlQ29uZmlnKTsKKworICAgICAgICBmaW5hbCBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGFwcGx5KAorICAgICAgICAgICAgICAgIFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvdGVzdC8yIiwgIkdFVCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscygidGVzdC12YWx1ZSIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYW5hZ2VkQ2xpZW50SW5qZWN0aW9uMygpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2U0LmNsYXNzKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucHJvcGVydHkoTWFuYWdlZC5jbGFzcy5nZXROYW1lKCkgKyAiLnByb3BlcnR5LnRlc3QtcHJvcGVydHkiLCAidGVzdC12YWx1ZSIpOworICAgICAgICByZXNvdXJjZUNvbmZpZy5wcm9wZXJ0eShNYW5hZ2VkLmNsYXNzLmdldE5hbWUoKSArICIuYmFzZVVyaSIsICJodHRwOi8vb3JhY2xlLmNvbSIpOworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKHJlc291cmNlQ29uZmlnKTsKKworICAgICAgICBmaW5hbCBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGFwcGx5KAorICAgICAgICAgICAgICAgIFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvdGVzdC8zIiwgIkdFVCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKQorICAgICAgICApOworCisgICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL29yYWNsZS5jb20vcmVsYXRpdmUiLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgfQorCisgICAgQFBhdGgoInRlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2U1IHsKKworICAgICAgICBAVXJpKCJodHRwOi8vb3JhY2xlLmNvbS97dGVtcGxhdGV9IikKKyAgICAgICAgV2ViVGFyZ2V0IHdlYlRhcmdldDE7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiMSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQxKCkgeworICAgICAgICAgICAgcmV0dXJuIHdlYlRhcmdldDEucmVzb2x2ZVRlbXBsYXRlKCJ0ZW1wbGF0ZSIsICJmb28iKS5nZXRVcmkoKS50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiMiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXQyKEBVcmkoImh0dHA6Ly9vcmFjbGUuY29tL3t0ZW1wbGF0ZX0iKSBXZWJUYXJnZXQgd2ViVGFyZ2V0MikgeworICAgICAgICAgICAgcmV0dXJuIHdlYlRhcmdldDIucmVzb2x2ZVRlbXBsYXRlKCJ0ZW1wbGF0ZSIsICJiYXIiKS5nZXRVcmkoKS50b1N0cmluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZVRlbXBsYXRlSW5GaWVsZE1hbmFnZWRDbGllbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZTUuY2xhc3MpOworICAgICAgICBmaW5hbCBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvdGVzdC8xIiwgIkdFVCIpLmJ1aWxkKCkpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0RW50aXR5KCkudG9TdHJpbmcoKSwgZXF1YWxUbygiaHR0cDovL29yYWNsZS5jb20vZm9vIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc29sdmVUZW1wbGF0ZUluUGFyYW1NYW5hZ2VkQ2xpZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2U1LmNsYXNzKTsKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBhcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3Rlc3QvMiIsICJHRVQiKS5idWlsZCgpKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldEVudGl0eSgpLnRvU3RyaW5nKCksIGVxdWFsVG8oImh0dHA6Ly9vcmFjbGUuY29tL2JhciIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL0Fic3RyYWN0TmFub3NSZXNlcnZvaXJUZXN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL0Fic3RyYWN0TmFub3NSZXNlcnZvaXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM2NTIyNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3JpbmcvQWJzdHJhY3ROYW5vc1Jlc2Vydm9pclRlc3QuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5tb25pdG9yaW5nOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLm1vbml0b3JpbmcuY29yZS5UaW1lUmVzZXJ2b2lyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5tb25pdG9yaW5nLmNvcmUuVW5pZm9ybVRpbWVTbmFwc2hvdDsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEFic3RyYWN0TmFub3NSZXNlcnZvaXJUZXN0IHsKKworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgZG91YmxlIERFTFRBID0gMC4wMDAxOworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IENPTExJU0lPTl9CVUZGRVIgPSAyNTY7CisKKyAgICBwcm90ZWN0ZWQgdm9pZCByZXNlcnZvaXJVcGRhdGVJbk5hbm9zKFRpbWVSZXNlcnZvaXIgcmVzZXJ2b2lyLCBsb25nIHZhbHVlLCBsb25nIHRpbWUpIHsKKyAgICAgICAgcmVzZXJ2b2lyLnVwZGF0ZSh2YWx1ZSwgdGltZSwgVGltZVVuaXQuTkFOT1NFQ09ORFMpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrSW5OYW5vcyhmaW5hbCBUaW1lUmVzZXJ2b2lyIHJlc2Vydm9pciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBzbmFwc2hvdFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBleHBlY3RlZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBleHBlY3RlZE1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGV4cGVjdGVkTWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBkb3VibGUgZXhwZWN0ZWRNZWFuKSB7CisgICAgICAgIGNoZWNrSW5OYW5vcyhyZXNlcnZvaXIsIHNuYXBzaG90VGltZSwgZXhwZWN0ZWRTaXplLCBleHBlY3RlZE1pbiwgZXhwZWN0ZWRNYXgsIGV4cGVjdGVkTWVhbiwKKyAgICAgICAgICAgICAgICByZXNlcnZvaXIuZ2V0U25hcHNob3Qoc25hcHNob3RUaW1lLCBUaW1lVW5pdC5OQU5PU0VDT05EUykuZ2V0VGltZUludGVydmFsKFRpbWVVbml0Lk5BTk9TRUNPTkRTKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHNuYXBzaG90IG9mIGdpdmVuIHJlc2Vydm9pciBleGhpYml0cyB3aXRoIGV4cGVjdGVkIG1lYXN1cmVtZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNlcnZvaXIgICAgICAgIFRoZSByZXNlcnZvaXIgdG8gYXNzZXJ0LgorICAgICAqIEBwYXJhbSBzbmFwc2hvdFRpbWUgICAgIFRoZSB0aW1lIGZvciB3aGljaCB0byBnZXQgdGhlIHNuYXBzaG90CisgICAgICogQHBhcmFtIGV4cGVjdGVkU2l6ZSAgICAgRXhwZWN0ZWQgc2l6ZSBvZiB0aGUgc25hcHNob3QKKyAgICAgKiBAcGFyYW0gZXhwZWN0ZWRNaW4gICAgICBFeHBlY3RlZCBtaW5pbXVtCisgICAgICogQHBhcmFtIGV4cGVjdGVkTWF4ICAgICAgRXhwZWN0ZWQgbWF4aW11bQorICAgICAqIEBwYXJhbSBleHBlY3RlZE1lYW4gICAgIEV4cGVjdGVkIG1lYW4KKyAgICAgKiBAcGFyYW0gZXhwZWN0ZWRJbnRlcnZhbCBFeHBlY3RlZCBpbnRlcnZhbAorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIGNoZWNrSW5OYW5vcyhmaW5hbCBUaW1lUmVzZXJ2b2lyIHJlc2Vydm9pciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBzbmFwc2hvdFRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgZXhwZWN0ZWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGV4cGVjdGVkTWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGV4cGVjdGVkTWF4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBkb3VibGUgZXhwZWN0ZWRNZWFuLCBmaW5hbCBsb25nIGV4cGVjdGVkSW50ZXJ2YWwpIHsKKyAgICAgICAgZmluYWwgVW5pZm9ybVRpbWVTbmFwc2hvdCBzbmFwc2hvdCA9IHJlc2Vydm9pci5nZXRTbmFwc2hvdChzbmFwc2hvdFRpbWUsIFRpbWVVbml0Lk5BTk9TRUNPTkRTKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIlRvdGFsIGNvdW50IGRvZXMgbm90IG1hdGNoISIsIGV4cGVjdGVkU2l6ZSwgc25hcHNob3Quc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJNaW4gZXhlYyB0aW1lIGRvZXMgbm90IG1hdGNoISIsIGV4cGVjdGVkTWluLCBzbmFwc2hvdC5nZXRNaW4oKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiTWF4IGV4ZWMgdGltZSBkb2VzIG5vdCBtYXRjaCEiLCBleHBlY3RlZE1heCwgc25hcHNob3QuZ2V0TWF4KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkF2ZXJhZ2UgZXhlYyB0aW1lIGRvZXMgbm90IG1hdGNoISIsIGV4cGVjdGVkTWVhbiwgc25hcHNob3QuZ2V0TWVhbigpLCBERUxUQSk7CisgICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgaW50ZXJ2YWwgZG9lcyBub3QgbWF0Y2ghIiwgZXhwZWN0ZWRJbnRlcnZhbCwgc25hcHNob3QuZ2V0VGltZUludGVydmFsKFRpbWVVbml0Lk5BTk9TRUNPTkRTKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL0FnZ3JlZ2F0aW5nVHJpbW1lclRlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3JpbmcvQWdncmVnYXRpbmdUcmltbWVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MDA4ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL0FnZ3JlZ2F0aW5nVHJpbW1lclRlc3QuamF2YQpAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwubW9uaXRvcmluZzsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBBZ2dyZWdhdGluZ1RyaW1tZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3ROYW5vc1Jlc2Vydm9pclRlc3QgeworCisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIHN0YXJ0VGltZSA9IFN5c3RlbS5uYW5vVGltZSgpOworICAgIHByaXZhdGUgZmluYWwgVGltZVVuaXQgc3RhcnRVbml0VGltZSA9IFRpbWVVbml0Lk5BTk9TRUNPTkRTOworICAgIHByaXZhdGUgZmluYWwgQWdncmVnYXRpbmdUcmltbWVyIHRyaW1tZXIgPSBuZXcgQWdncmVnYXRpbmdUcmltbWVyKHN0YXJ0VGltZSgpLCBzdGFydFVuaXRUaW1lLCAxMCwgVGltZVVuaXQuTkFOT1NFQ09ORFMpOworICAgIHByaXZhdGUgZmluYWwgU2xpZGluZ1dpbmRvd1RpbWVSZXNlcnZvaXIgdGltZTEwbnNSZXNlcnZvaXIgPSBuZXcgU2xpZGluZ1dpbmRvd1RpbWVSZXNlcnZvaXIoMTAsIFRpbWVVbml0Lk5BTk9TRUNPTkRTLAorICAgICAgICAgICAgc3RhcnRUaW1lKCksIHN0YXJ0VW5pdFRpbWUsIHRyaW1tZXIpOworICAgIHByaXZhdGUgZmluYWwgQWdncmVnYXRlZFNsaWRpbmdXaW5kb3dUaW1lUmVzZXJ2b2lyIGFnZ3JlZ2F0ZWRUaW1lMTAwbnNSZXNlcnZvaXIgPSBuZXcKKyAgICAgICAgICAgIEFnZ3JlZ2F0ZWRTbGlkaW5nV2luZG93VGltZVJlc2Vydm9pcigxMDAsIFRpbWVVbml0Lk5BTk9TRUNPTkRTLCBzdGFydFRpbWUoKSwgc3RhcnRVbml0VGltZSwgdHJpbW1lcik7CisKKyAgICBwcm90ZWN0ZWQgbG9uZyBzdGFydFRpbWUoKSB7CisgICAgICAgIHJldHVybiBzdGFydFRpbWU7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaW1wbGVDaGVjaygpIHsKKworICAgICAgICB0aW1lMTBuc1Jlc2Vydm9pci51cGRhdGUoMTBMLCBzdGFydFRpbWUoKSwgc3RhcnRVbml0VGltZSk7CisgICAgICAgIHRpbWUxMG5zUmVzZXJ2b2lyLnVwZGF0ZSgyMEwsIHN0YXJ0VGltZSgpICsgNTAsIHN0YXJ0VW5pdFRpbWUpOworCisgICAgICAgIGNoZWNrSW5OYW5vcyhhZ2dyZWdhdGVkVGltZTEwMG5zUmVzZXJ2b2lyLCBzdGFydFRpbWUoKSArIDEwMCwgMiwgMTAsIDIwLCAxNSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0cmltU2xpZGluZ1dpbmRvd0JlZm9yZUFnZ3JlZ2F0ZWRXaW5kb3coKSB7CisKKyAgICAgICAgdGltZTEwbnNSZXNlcnZvaXIudXBkYXRlKDEwTCwgc3RhcnRUaW1lKCksIHN0YXJ0VW5pdFRpbWUpOworICAgICAgICB0aW1lMTBuc1Jlc2Vydm9pci51cGRhdGUoMjBMLCBzdGFydFRpbWUoKSArIDUwLCBzdGFydFVuaXRUaW1lKTsKKworICAgICAgICBjaGVja0luTmFub3ModGltZTEwbnNSZXNlcnZvaXIsIHN0YXJ0VGltZSgpICsgMTAwLCAwLCAwLCAwLCAwKTsKKyAgICAgICAgY2hlY2tJbk5hbm9zKGFnZ3JlZ2F0ZWRUaW1lMTAwbnNSZXNlcnZvaXIsIHN0YXJ0VGltZSgpICsgMTAwLCAyLCAxMCwgMjAsIDE1KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBZ2dyZWdhdGluZ1RyaW1tZXIoKSB7CisKKyAgICAgICAgdGltZTEwbnNSZXNlcnZvaXIudXBkYXRlKDEwTCwgc3RhcnRUaW1lKCksIHN0YXJ0VW5pdFRpbWUpOworICAgICAgICB0aW1lMTBuc1Jlc2Vydm9pci51cGRhdGUoMjBMLCBzdGFydFRpbWUoKSArIDUwLCBzdGFydFVuaXRUaW1lKTsKKworICAgICAgICBjaGVja0luTmFub3ModGltZTEwbnNSZXNlcnZvaXIsIHN0YXJ0VGltZSgpICsgNTAsIDEsIDIwLCAyMCwgMjApOworICAgICAgICBjaGVja0luTmFub3MoYWdncmVnYXRlZFRpbWUxMDBuc1Jlc2Vydm9pciwgc3RhcnRUaW1lKCkgKyAxMDAsIDIsIDEwLCAyMCwgMTUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFnZ3JlZ2F0aW5nVHJpbW1lckRvdWJsZVZhbHVlcygpIHsKKyAgICAgICAgY2hlY2tJbk5hbm9zKGFnZ3JlZ2F0ZWRUaW1lMTAwbnNSZXNlcnZvaXIsIHN0YXJ0VGltZSgpLCAwLCAwLCAwLCAwKTsKKworICAgICAgICB0aW1lMTBuc1Jlc2Vydm9pci51cGRhdGUoMUwsIHN0YXJ0VGltZSgpLCBzdGFydFVuaXRUaW1lKTsKKyAgICAgICAgY2hlY2tJbk5hbm9zKGFnZ3JlZ2F0ZWRUaW1lMTAwbnNSZXNlcnZvaXIsIHN0YXJ0VGltZSgpICsgNSwgMSwgMSwgMSwgMSk7CisKKyAgICAgICAgdGltZTEwbnNSZXNlcnZvaXIudXBkYXRlKDJMLCBzdGFydFRpbWUoKSArIDUsIHN0YXJ0VW5pdFRpbWUpOworICAgICAgICBjaGVja0luTmFub3MoYWdncmVnYXRlZFRpbWUxMDBuc1Jlc2Vydm9pciwgc3RhcnRUaW1lKCkgKyA1LCAyLCAxLCAyLCAxLjUpOworCisgICAgICAgIHRpbWUxMG5zUmVzZXJ2b2lyLnVwZGF0ZSg1TCwgc3RhcnRUaW1lKCkgKyAxMSwgc3RhcnRVbml0VGltZSk7CisgICAgICAgIGNoZWNrSW5OYW5vcyhhZ2dyZWdhdGVkVGltZTEwMG5zUmVzZXJ2b2lyLCBzdGFydFRpbWUoKSArIDEyLCAzLCAxLCA1LCAyLjY2NjYpOworICAgICAgICBjaGVja0luTmFub3MoYWdncmVnYXRlZFRpbWUxMDBuc1Jlc2Vydm9pciwgc3RhcnRUaW1lKCkgKyAzMCwgMywgMSwgNSwgMi42NjY2KTsKKyAgICAgICAgY2hlY2tJbk5hbm9zKGFnZ3JlZ2F0ZWRUaW1lMTAwbnNSZXNlcnZvaXIsIHN0YXJ0VGltZSgpICsgMTAwLCAzLCAxLCA1LCAyLjY2NjYpOworICAgICAgICBjaGVja0luTmFub3MoYWdncmVnYXRlZFRpbWUxMDBuc1Jlc2Vydm9pciwgc3RhcnRUaW1lKCkgKyAxMDEsIDEsIDUsIDUsIDUpOworICAgICAgICBjaGVja0luTmFub3MoYWdncmVnYXRlZFRpbWUxMDBuc1Jlc2Vydm9pciwgc3RhcnRUaW1lKCkgKyAxMTAsIDEsIDUsIDUsIDUpOworICAgICAgICBjaGVja0luTmFub3MoYWdncmVnYXRlZFRpbWUxMDBuc1Jlc2Vydm9pciwgc3RhcnRUaW1lKCkgKyAxMTEsIDAsIDAsIDAsIDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFnZ3JlZ2F0aW5nVHJpbW1lck11bHRpcGxlRG91YmxlVmFsdWVzSW5PbmVDaHVuaygpIHsKKyAgICAgICAgLy8gZ28gdG8gdGhlIGZpcnN0IGNodW5rCisgICAgICAgIHRpbWUxMG5zUmVzZXJ2b2lyLnVwZGF0ZSgxTCwgc3RhcnRUaW1lKCkgKyA1LCBzdGFydFVuaXRUaW1lKTsKKyAgICAgICAgdGltZTEwbnNSZXNlcnZvaXIudXBkYXRlKDJMLCBzdGFydFRpbWUoKSArIDYsIHN0YXJ0VW5pdFRpbWUpOworCisgICAgICAgIC8vIGdvIHRvIHRoZSBzZWNvbmQgY2h1bmsKKyAgICAgICAgdGltZTEwbnNSZXNlcnZvaXIudXBkYXRlKDZMLCBzdGFydFRpbWUoKSArIDExLCBzdGFydFVuaXRUaW1lKTsKKyAgICAgICAgdGltZTEwbnNSZXNlcnZvaXIudXBkYXRlKDNMLCBzdGFydFRpbWUoKSArIDExLCBzdGFydFVuaXRUaW1lKTsKKyAgICAgICAgdGltZTEwbnNSZXNlcnZvaXIudXBkYXRlKDExTCwgc3RhcnRUaW1lKCkgKyAxNCwgc3RhcnRVbml0VGltZSk7CisKKyAgICAgICAgY2hlY2tJbk5hbm9zKGFnZ3JlZ2F0ZWRUaW1lMTAwbnNSZXNlcnZvaXIsIHN0YXJ0VGltZSgpICsgMTQsIDUsIDEsIDExLCAyM2QgLyA1KTsKKyAgICAgICAgY2hlY2tJbk5hbm9zKGFnZ3JlZ2F0ZWRUaW1lMTAwbnNSZXNlcnZvaXIsIHN0YXJ0VGltZSgpICsgMTQsIDUsIDEsIDExLCAyM2QgLyA1KTsKKyAgICAgICAgY2hlY2tJbk5hbm9zKGFnZ3JlZ2F0ZWRUaW1lMTAwbnNSZXNlcnZvaXIsIHN0YXJ0VGltZSgpICsgMTUsIDUsIDEsIDExLCAyM2QgLyA1KTsKKyAgICAgICAgY2hlY2tJbk5hbm9zKGFnZ3JlZ2F0ZWRUaW1lMTAwbnNSZXNlcnZvaXIsIHN0YXJ0VGltZSgpICsgMTYsIDUsIDEsIDExLCAyM2QgLyA1KTsKKyAgICAgICAgY2hlY2tJbk5hbm9zKGFnZ3JlZ2F0ZWRUaW1lMTAwbnNSZXNlcnZvaXIsIHN0YXJ0VGltZSgpICsgMTAwLCA1LCAxLCAxMSwgMjNkIC8gNSk7CisgICAgICAgIGNoZWNrSW5OYW5vcyhhZ2dyZWdhdGVkVGltZTEwMG5zUmVzZXJ2b2lyLCBzdGFydFRpbWUoKSArIDEwMSwgMywgMywgMTEsIDIwZCAvIDMpOworICAgICAgICBjaGVja0luTmFub3MoYWdncmVnYXRlZFRpbWUxMDBuc1Jlc2Vydm9pciwgc3RhcnRUaW1lKCkgKyAxMTAsIDMsIDMsIDExLCAyMGQgLyAzKTsKKyAgICAgICAgY2hlY2tJbk5hbm9zKGFnZ3JlZ2F0ZWRUaW1lMTAwbnNSZXNlcnZvaXIsIHN0YXJ0VGltZSgpICsgMTExLCAwLCAwLCAwLCAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb3dlckJvdW5kRnVuY3Rpb24oKSB7CisgICAgICAgIGZvciAobG9uZyBjaHVua1NpemUgPSAxOyBjaHVua1NpemUgPCAxNTsgKytjaHVua1NpemUpIHsKKyAgICAgICAgICAgIGZvciAoaW50IHBvd2VyID0gMDsgcG93ZXIgPCA4OyArK3Bvd2VyKSB7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgc3RhcnRUaW1lID0gLTUwOyBzdGFydFRpbWUgPCA1MDsgKytzdGFydFRpbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IC01MDsgaSA8IDUwOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgbG93ZXJCb3VuZCA9IEFnZ3JlZ2F0aW5nVHJpbW1lci5sb3dlckJvdW5kKGksIHN0YXJ0VGltZSwgY2h1bmtTaXplLCBwb3dlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiRXJyb3Igb2NjdXJyZWQgZm9yOiAiICsgaSArICIgLi4gbG93ZXIgYm91bmQ6ICIgKyBsb3dlckJvdW5kICsgIiAuLiBwb3dlcjogIiArIHBvd2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIC4uIHN0YXJ0VGltZTogIiArIHN0YXJ0VGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXJCb3VuZCA8PSBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJFcnJvciBvY2N1cnJlZCBmb3I6ICIgKyBpICsgIiAuLiBsb3dlciBib3VuZDogIiArIGxvd2VyQm91bmQgKyAiIC4uIHBvd2VyOiAiICsgcG93ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgLi4gc3RhcnRUaW1lOiAiICsgc3RhcnRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpIDwgbG93ZXJCb3VuZCArIGNodW5rU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL0FnZ3JlZ2F0aW5nVHJpbW1lclplcm9UaW1lVGVzdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9BZ2dyZWdhdGluZ1RyaW1tZXJaZXJvVGltZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTFlMTU2Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9BZ2dyZWdhdGluZ1RyaW1tZXJaZXJvVGltZVRlc3QuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5tb25pdG9yaW5nOworCisvKioKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEFnZ3JlZ2F0aW5nVHJpbW1lclplcm9UaW1lVGVzdCBleHRlbmRzIEFnZ3JlZ2F0aW5nVHJpbW1lclRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGxvbmcgc3RhcnRUaW1lKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL01vbml0b3JpbmdTdGF0aXN0aWNzVGVzdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9Nb25pdG9yaW5nU3RhdGlzdGljc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGMyN2M0Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9Nb25pdG9yaW5nU3RhdGlzdGljc1Rlc3QuamF2YQpAQCAtMCwwICsxLDIzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwubW9uaXRvcmluZzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW07CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QVVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuSW5mbGVjdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNZXRob2Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTW9kZWw7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuRXhlY3V0aW9uU3RhdGlzdGljczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5SZXNvdXJjZU1ldGhvZFN0YXRpc3RpY3M7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuUmVzb3VyY2VTdGF0aXN0aWNzOworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBNb25pdG9yaW5nU3RhdGlzdGljc1Rlc3QgeworCisgICAgQFBhdGgoIi90ZXN0LXJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiZ2V0IjsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJjaGlsZCIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBjaGlsZEdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiY2hpbGRHZXQiOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImNoaWxkIikKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIHZvaWQgY2hpbGRQb3N0KCkgeworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImNoaWxkIikKKyAgICAgICAgQFBVVAorICAgICAgICBwdWJsaWMgdm9pZCBjaGlsZFB1dCgpIHsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICBAUGF0aCgiaGVsbG8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSGVsbG9SZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiaGVsbG8iOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIHZvaWQgcG9zdCgpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCIvd29ybGQiKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgY2hpbGRHZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gImhlbGxvLXdvcmxkIjsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUluZmxlY3RvciBpbXBsZW1lbnRzIEluZmxlY3RvcjxDb250YWluZXJSZXF1ZXN0Q29udGV4dCwgT2JqZWN0PiB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0IGFwcGx5KENvbnRhaW5lclJlcXVlc3RDb250ZXh0IGNvbnRhaW5lclJlcXVlc3RDb250ZXh0KSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlVXJpcygpIHsKKyAgICAgICAgZmluYWwgTW9uaXRvcmluZ1N0YXRpc3RpY3NJbXBsIHN0YXRzID0gZ2V0U2ltcGxlU3RhdHMoKTsKKyAgICAgICAgZmluYWwgU2V0PFN0cmluZz4ga2V5cyA9IHN0YXRzLmdldFVyaVN0YXRpc3RpY3MoKS5rZXlTZXQoKTsKKyAgICAgICAgZmluYWwgSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvciA9IGtleXMuaXRlcmF0b3IoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiL2hlbGxvIiwgaXRlcmF0b3IubmV4dCgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiL2hlbGxvL3dvcmxkIiwgaXRlcmF0b3IubmV4dCgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiL3Rlc3QtcmVzb3VyY2UiLCBpdGVyYXRvci5uZXh0KCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIvdGVzdC1yZXNvdXJjZS9jaGlsZCIsIGl0ZXJhdG9yLm5leHQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBNb25pdG9yaW5nU3RhdGlzdGljc0ltcGwgZ2V0U2ltcGxlU3RhdHMoKSB7CisgICAgICAgIGZpbmFsIExpc3Q8UmVzb3VyY2U+IHJlc291cmNlcyA9IFN0cmVhbS5vZihUZXN0UmVzb3VyY2UuY2xhc3MsIEhlbGxvUmVzb3VyY2UuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoUmVzb3VyY2U6OmZyb20pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCisgICAgICAgIFJlc291cmNlTW9kZWwgbW9kZWwgPSBuZXcgUmVzb3VyY2VNb2RlbC5CdWlsZGVyKHJlc291cmNlcywgZmFsc2UpLmJ1aWxkKCk7CisgICAgICAgIE1vbml0b3JpbmdTdGF0aXN0aWNzSW1wbC5CdWlsZGVyIG1vbkJ1aWxkZXIgPSBuZXcgTW9uaXRvcmluZ1N0YXRpc3RpY3NJbXBsLkJ1aWxkZXIobW9kZWwpOworICAgICAgICByZXR1cm4gbW9uQnVpbGRlci5idWlsZCgpOworICAgIH0KKworICAgIHByaXZhdGUgTW9uaXRvcmluZ1N0YXRpc3RpY3NJbXBsLkJ1aWxkZXIgZ2V0UHJvZ1N0YXRzKCkgeworICAgICAgICBmaW5hbCBSZXNvdXJjZS5CdWlsZGVyIHRlc3RCdWlsZGVyID0gUmVzb3VyY2UuYnVpbGRlcihUZXN0UmVzb3VyY2UuY2xhc3MpOworICAgICAgICB0ZXN0QnVpbGRlci5hZGRDaGlsZFJlc291cmNlKCIvcHJvZy1jaGlsZCIpLmFkZE1ldGhvZCgiR0VUIikuaGFuZGxlZEJ5KE15SW5mbGVjdG9yLmNsYXNzKTsKKyAgICAgICAgZmluYWwgTGlzdDxSZXNvdXJjZT4gcmVzb3VyY2VzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIHJlc291cmNlcy5hZGQodGVzdEJ1aWxkZXIuYnVpbGQoKSk7CisgICAgICAgIHJlc291cmNlcy5hZGQoUmVzb3VyY2UuZnJvbShIZWxsb1Jlc291cmNlLmNsYXNzKSk7CisgICAgICAgIGZpbmFsIFJlc291cmNlLkJ1aWxkZXIgcHJvZyA9IFJlc291cmNlLmJ1aWxkZXIoInByb2ciKTsKKyAgICAgICAgcHJvZy5hZGRNZXRob2QoIkdFVCIpLmhhbmRsZWRCeShNeUluZmxlY3Rvci5jbGFzcyk7CisKKyAgICAgICAgcmVzb3VyY2VzLmFkZChwcm9nLmJ1aWxkKCkpOworCisgICAgICAgIFJlc291cmNlTW9kZWwgbW9kZWwgPSBuZXcgUmVzb3VyY2VNb2RlbC5CdWlsZGVyKHJlc291cmNlcywgZmFsc2UpLmJ1aWxkKCk7CisgICAgICAgIHJldHVybiBuZXcgTW9uaXRvcmluZ1N0YXRpc3RpY3NJbXBsLkJ1aWxkZXIobW9kZWwpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZVJlc291cmNlQ2xhc3NlcygpIHsKKyAgICAgICAgZmluYWwgTW9uaXRvcmluZ1N0YXRpc3RpY3NJbXBsIHN0YXRzID0gZ2V0U2ltcGxlU3RhdHMoKTsKKyAgICAgICAgZmluYWwgU2V0PENsYXNzPD8+PiBrZXlzID0gc3RhdHMuZ2V0UmVzb3VyY2VDbGFzc1N0YXRpc3RpY3MoKS5rZXlTZXQoKTsKKyAgICAgICAgZmluYWwgSXRlcmF0b3I8Q2xhc3M8Pz4+IGl0ID0ga2V5cy5pdGVyYXRvcigpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoSGVsbG9SZXNvdXJjZS5jbGFzcywgaXQubmV4dCgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0UmVzb3VyY2UuY2xhc3MsIGl0Lm5leHQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VDbGFzc2VzV2l0aFByb2dyYW1tYXRpY1Jlc291cmNlcygpIHsKKyAgICAgICAgZmluYWwgTW9uaXRvcmluZ1N0YXRpc3RpY3NJbXBsIHN0YXRzID0gZ2V0UHJvZ1N0YXRzKCkuYnVpbGQoKTsKKyAgICAgICAgZmluYWwgU2V0PENsYXNzPD8+PiBrZXlzID0gc3RhdHMuZ2V0UmVzb3VyY2VDbGFzc1N0YXRpc3RpY3MoKS5rZXlTZXQoKTsKKyAgICAgICAgZmluYWwgSXRlcmF0b3I8Q2xhc3M8Pz4+IGl0ID0ga2V5cy5pdGVyYXRvcigpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoSGVsbG9SZXNvdXJjZS5jbGFzcywgaXQubmV4dCgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhNeUluZmxlY3Rvci5jbGFzcywgaXQubmV4dCgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0UmVzb3VyY2UuY2xhc3MsIGl0Lm5leHQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXJpc1dpdGhQcm9ncmFtbWF0aWNSZXNvdXJjZXMoKSB7CisgICAgICAgIGZpbmFsIE1vbml0b3JpbmdTdGF0aXN0aWNzSW1wbCBzdGF0cyA9IGdldFByb2dTdGF0cygpLmJ1aWxkKCk7CisgICAgICAgIGZpbmFsIEl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIFJlc291cmNlU3RhdGlzdGljcz4+IGl0ID0gc3RhdHMuZ2V0VXJpU3RhdGlzdGljcygpLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKKworICAgICAgICBjaGVjayhpdCwgIi9oZWxsbyIsIDIpOworICAgICAgICBjaGVjayhpdCwgIi9oZWxsby93b3JsZCIsIDEpOworICAgICAgICBjaGVjayhpdCwgIi9wcm9nIiwgMSk7CisgICAgICAgIGNoZWNrKGl0LCAiL3Rlc3QtcmVzb3VyY2UiLCAxKTsKKyAgICAgICAgY2hlY2soaXQsICIvdGVzdC1yZXNvdXJjZS9jaGlsZCIsIDMpOworICAgICAgICBjaGVjayhpdCwgIi90ZXN0LXJlc291cmNlL3Byb2ctY2hpbGQiLCAxKTsKKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVyaXNXaXRoUHJvZ3JhbW1hdGljUmVzb3VyY2VzQW5kRXhlY3V0aW9uKCkgeworICAgICAgICBmaW5hbCBNb25pdG9yaW5nU3RhdGlzdGljc0ltcGwuQnVpbGRlciBzdGF0QnVpbGRlciA9IGdldFByb2dTdGF0cygpOworCisgICAgICAgIGZpbmFsIFJlc291cmNlLkJ1aWxkZXIgcmVzb3VyY2VCdWlsZGVyID0gUmVzb3VyY2UuYnVpbGRlcigpOworICAgICAgICByZXNvdXJjZUJ1aWxkZXIuYWRkTWV0aG9kKCJHRVQiKS5oYW5kbGVkQnkoTXlJbmZsZWN0b3IuY2xhc3MpOworICAgICAgICByZXNvdXJjZUJ1aWxkZXIuYWRkTWV0aG9kKCJQT1NUIikuaGFuZGxlZEJ5KE15SW5mbGVjdG9yLmNsYXNzKTsKKyAgICAgICAgZmluYWwgUmVzb3VyY2UgcmVzID0gcmVzb3VyY2VCdWlsZGVyLmJ1aWxkKCk7CisgICAgICAgIFJlc291cmNlTWV0aG9kIGdldE1ldGhvZDsKKyAgICAgICAgUmVzb3VyY2VNZXRob2QgcG9zdE1ldGhvZDsKKyAgICAgICAgaWYgKHJlcy5nZXRSZXNvdXJjZU1ldGhvZHMoKS5nZXQoMCkuZ2V0SHR0cE1ldGhvZCgpLmVxdWFscygiR0VUIikpIHsKKyAgICAgICAgICAgIGdldE1ldGhvZCA9IHJlcy5nZXRSZXNvdXJjZU1ldGhvZHMoKS5nZXQoMCk7CisgICAgICAgICAgICBwb3N0TWV0aG9kID0gcmVzLmdldFJlc291cmNlTWV0aG9kcygpLmdldCgxKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGdldE1ldGhvZCA9IHJlcy5nZXRSZXNvdXJjZU1ldGhvZHMoKS5nZXQoMSk7CisgICAgICAgICAgICBwb3N0TWV0aG9kID0gcmVzLmdldFJlc291cmNlTWV0aG9kcygpLmdldCgwKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRCdWlsZGVyLmFkZEV4ZWN1dGlvbigiL25ldy9lbGVmYW50IiwgZ2V0TWV0aG9kLCAxMCwgNSwgOCwgOCk7CisgICAgICAgIHN0YXRCdWlsZGVyLmFkZEV4ZWN1dGlvbigiL25ldy9lbGVmYW50IiwgZ2V0TWV0aG9kLCAyMCwgMTIsIDE4LCAxMCk7CisgICAgICAgIHN0YXRCdWlsZGVyLmFkZEV4ZWN1dGlvbigiL25ldy9lbGVmYW50IiwgcG9zdE1ldGhvZCwgMzAsIDIsIDI4LCA0KTsKKworICAgICAgICBmaW5hbCBNb25pdG9yaW5nU3RhdGlzdGljc0ltcGwgc3RhdCA9IHN0YXRCdWlsZGVyLmJ1aWxkKCk7CisgICAgICAgIGZpbmFsIEl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIFJlc291cmNlU3RhdGlzdGljcz4+IGl0ID0gc3RhdC5nZXRVcmlTdGF0aXN0aWNzKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOworCisgICAgICAgIGNoZWNrKGl0LCAiL2hlbGxvIiwgMik7CisgICAgICAgIGNoZWNrKGl0LCAiL2hlbGxvL3dvcmxkIiwgMSk7CisgICAgICAgIGNoZWNrKGl0LCAiL25ldy9lbGVmYW50IiwgMik7CisgICAgICAgIGNoZWNrKGl0LCAiL3Byb2ciLCAxKTsKKyAgICAgICAgY2hlY2soaXQsICIvdGVzdC1yZXNvdXJjZSIsIDEpOworICAgICAgICBjaGVjayhpdCwgIi90ZXN0LXJlc291cmNlL2NoaWxkIiwgMyk7CisgICAgICAgIGNoZWNrKGl0LCAiL3Rlc3QtcmVzb3VyY2UvcHJvZy1jaGlsZCIsIDEpOworCisgICAgICAgIGZpbmFsIE1hcDxSZXNvdXJjZU1ldGhvZCwgUmVzb3VyY2VNZXRob2RTdGF0aXN0aWNzPiByZXNvdXJjZU1ldGhvZFN0YXRpc3RpY3MKKyAgICAgICAgICAgICAgICA9IHN0YXQuZ2V0VXJpU3RhdGlzdGljcygpLmdldCgiL25ldy9lbGVmYW50IikuZ2V0UmVzb3VyY2VNZXRob2RTdGF0aXN0aWNzKCk7CisgICAgICAgIGZvciAoUmVzb3VyY2VNZXRob2RTdGF0aXN0aWNzIG1ldGhvZFN0YXRpc3RpY3MgOiByZXNvdXJjZU1ldGhvZFN0YXRpc3RpY3MudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIGZpbmFsIFJlc291cmNlTWV0aG9kIG1ldGhvZCA9IG1ldGhvZFN0YXRpc3RpY3MuZ2V0UmVzb3VyY2VNZXRob2QoKTsKKyAgICAgICAgICAgIGZpbmFsIEV4ZWN1dGlvblN0YXRpc3RpY3Mgc3QgPSBtZXRob2RTdGF0aXN0aWNzLmdldE1ldGhvZFN0YXRpc3RpY3MoKTsKKyAgICAgICAgICAgIGlmIChtZXRob2QuZ2V0SHR0cE1ldGhvZCgpLmVxdWFscygiR0VUIikpIHsKKyAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwLCBzdC5nZXRMYXN0U3RhcnRUaW1lKCkuZ2V0VGltZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobWV0aG9kLmdldEh0dHBNZXRob2QoKS5lcXVhbHMoIlBPU1QiKSkgeworICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzAsIHN0LmdldExhc3RTdGFydFRpbWUoKS5nZXRUaW1lKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBc3NlcnQuZmFpbCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2soSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgUmVzb3VyY2VTdGF0aXN0aWNzPj4gaXQsCisgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBleHBlY3RlZFVyaSwgaW50IGV4cGVjdGVkTWV0aG9kcykgeworICAgICAgICBNYXAuRW50cnk8U3RyaW5nLCBSZXNvdXJjZVN0YXRpc3RpY3M+IGVudHJ5ID0gaXQubmV4dCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVXJpLCBlbnRyeS5nZXRLZXkoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZXhwZWN0ZWRNZXRob2RzLCBlbnRyeS5nZXRWYWx1ZSgpLmdldFJlc291cmNlTWV0aG9kU3RhdGlzdGljcygpLnNpemUoKSk7CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3JpbmcvTW9uaXRvcmluZ1V0aWxzVGVzdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9Nb25pdG9yaW5nVXRpbHNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQxOGYwZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3JpbmcvTW9uaXRvcmluZ1V0aWxzVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLm1vbml0b3Jpbmc7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1ldGhvZDsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIE1vbml0b3JpbmdVdGlsc1Rlc3QgeworCisgICAgQFBhdGgoInJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15UmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gImdldCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9IVE1MKQorICAgICAgICBAUGF0aCgic3ViIikKKyAgICAgICAgcHVibGljIFN0cmluZyBzdWJHZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gInN1YiI7CisgICAgICAgIH0KKworICAgICAgICBAQ29uc3VtZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9YTUwpCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdCgpIHsKKyAgICAgICAgICAgIHJldHVybiAieG1sIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldE1ldGhvZFVuaXF1ZUlkKCkgeworICAgICAgICBmaW5hbCBSZXNvdXJjZSByZXNvdXJjZSA9IFJlc291cmNlLmJ1aWxkZXIoTXlSZXNvdXJjZS5jbGFzcykuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiW118W118R0VUfHJlc291cmNlfGdldCIsCisgICAgICAgICAgICAgICAgTW9uaXRvcmluZ1V0aWxzLmdldE1ldGhvZFVuaXF1ZUlkKGdldE1ldGhvZChyZXNvdXJjZSwgImdldCIpKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIlt0ZXh0L2h0bWxdfFtdfEdFVHxyZXNvdXJjZS5zdWJ8c3ViR2V0IiwKKyAgICAgICAgICAgICAgICBNb25pdG9yaW5nVXRpbHMuZ2V0TWV0aG9kVW5pcXVlSWQoZ2V0TWV0aG9kKHJlc291cmNlLCAic3ViR2V0IikpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiW3RleHQvaHRtbF18W118R0VUfHJlc291cmNlLnN1YnxzdWJHZXQiLAorICAgICAgICAgICAgICAgIE1vbml0b3JpbmdVdGlscy5nZXRNZXRob2RVbmlxdWVJZChnZXRNZXRob2QocmVzb3VyY2UsICJzdWJHZXQiKSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJbdGV4dC94bWxdfFt0ZXh0L3BsYWluXXxQT1NUfHJlc291cmNlfHBvc3QiLAorICAgICAgICAgICAgICAgIE1vbml0b3JpbmdVdGlscy5nZXRNZXRob2RVbmlxdWVJZChnZXRNZXRob2QocmVzb3VyY2UsICJwb3N0IikpKTsKKworICAgIH0KKworICAgIHByaXZhdGUgUmVzb3VyY2VNZXRob2QgZ2V0TWV0aG9kKFJlc291cmNlIHJlc291cmNlLCBTdHJpbmcgamF2YU5hbWUpIHsKKworICAgICAgICBmb3IgKFJlc291cmNlTWV0aG9kIG1ldGhvZCA6IHJlc291cmNlLmdldFJlc291cmNlTWV0aG9kcygpKSB7CisgICAgICAgICAgICBpZiAobWV0aG9kLmdldEludm9jYWJsZSgpLmdldEhhbmRsaW5nTWV0aG9kKCkuZ2V0TmFtZSgpLmVxdWFscyhqYXZhTmFtZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWV0aG9kOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvciAoUmVzb3VyY2UgY2hpbGQgOiByZXNvdXJjZS5nZXRDaGlsZFJlc291cmNlcygpKSB7CisgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZU1ldGhvZCBjaGlsZE1ldGhvZCA9IGdldE1ldGhvZChjaGlsZCwgamF2YU5hbWUpOworICAgICAgICAgICAgaWYgKGNoaWxkTWV0aG9kICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGRNZXRob2Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9SZXNwb25zZVN0YXRpc3RpY3NJbXBsVGVzdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9SZXNwb25zZVN0YXRpc3RpY3NJbXBsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ODJkMGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL1Jlc3BvbnNlU3RhdGlzdGljc0ltcGxUZXN0LmphdmEKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwubW9uaXRvcmluZzsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOworCisvKioKKyAqIFJlc3BvbnNlIHN0YXRpc3RpY3MgdGVzdHMuCisgKgorICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYSBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgUmVzcG9uc2VTdGF0aXN0aWNzSW1wbFRlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FjaGluZygpIHsKKyAgICAgICAgUmVzcG9uc2VTdGF0aXN0aWNzSW1wbC5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUmVzcG9uc2VTdGF0aXN0aWNzSW1wbC5CdWlsZGVyKCk7CisKKyAgICAgICAgYnVpbGRlci5hZGRSZXNwb25zZUNvZGUoMTAwKTsKKworICAgICAgICAvLyB0ZXN0IHRoYXQgY2FjaGluZyB3b3JrcworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShidWlsZGVyLmJ1aWxkKCkgPT0gYnVpbGRlci5idWlsZCgpKTsKKworICAgICAgICBPYmplY3Qgb3JpZ2luYWwgPSBidWlsZGVyLmJ1aWxkKCk7CisgICAgICAgIGJ1aWxkZXIuYWRkUmVzcG9uc2VDb2RlKDEwMCk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG9yaWdpbmFsID09IGJ1aWxkZXIuYnVpbGQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2FuaXR5KCkgeworICAgICAgICBSZXNwb25zZVN0YXRpc3RpY3NJbXBsLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBSZXNwb25zZVN0YXRpc3RpY3NJbXBsLkJ1aWxkZXIoKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0TnVsbChidWlsZGVyLmJ1aWxkKCkuZ2V0TGFzdFJlc3BvbnNlQ29kZSgpKTsKKworICAgICAgICBidWlsZGVyLmFkZFJlc3BvbnNlQ29kZSgxMDApOworCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTAwLCAoaW50KSBidWlsZGVyLmJ1aWxkKCkuZ2V0TGFzdFJlc3BvbnNlQ29kZSgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCAobG9uZykgYnVpbGRlci5idWlsZCgpLmdldFJlc3BvbnNlQ29kZXMoKS5nZXQoMTAwKSk7CisKKyAgICAgICAgYnVpbGRlci5hZGRSZXNwb25zZUNvZGUoMjAwKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgKGludCkgYnVpbGRlci5idWlsZCgpLmdldExhc3RSZXNwb25zZUNvZGUoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgKGxvbmcpIGJ1aWxkZXIuYnVpbGQoKS5nZXRSZXNwb25zZUNvZGVzKCkuZ2V0KDEwMCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIChsb25nKSBidWlsZGVyLmJ1aWxkKCkuZ2V0UmVzcG9uc2VDb2RlcygpLmdldCgyMDApKTsKKworICAgICAgICBidWlsZGVyLmFkZFJlc3BvbnNlQ29kZSgxMDApOworCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTAwLCAoaW50KSBidWlsZGVyLmJ1aWxkKCkuZ2V0TGFzdFJlc3BvbnNlQ29kZSgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCAobG9uZykgYnVpbGRlci5idWlsZCgpLmdldFJlc3BvbnNlQ29kZXMoKS5nZXQoMTAwKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgKGxvbmcpIGJ1aWxkZXIuYnVpbGQoKS5nZXRSZXNwb25zZUNvZGVzKCkuZ2V0KDIwMCkpOworICAgIH0KKworICAgIEBSdWxlCisgICAgcHVibGljIGZpbmFsIEV4cGVjdGVkRXhjZXB0aW9uIGV4Y2VwdGlvbiA9IEV4cGVjdGVkRXhjZXB0aW9uLm5vbmUoKTsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEltbXV0YWJpbGl0eSgpIHsKKyAgICAgICAgUmVzcG9uc2VTdGF0aXN0aWNzSW1wbC5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUmVzcG9uc2VTdGF0aXN0aWNzSW1wbC5CdWlsZGVyKCk7CisKKyAgICAgICAgYnVpbGRlci5hZGRSZXNwb25zZUNvZGUoMTAwKTsKKworICAgICAgICAvLyBtb2RpZmljYXRpb24gaXMgbm90IGFsbG93ZWQKKyAgICAgICAgZXhjZXB0aW9uLmV4cGVjdChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIGJ1aWxkZXIuYnVpbGQoKS5nZXRSZXNwb25zZUNvZGVzKCkucHV0KDEwMCwgMkwpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3JpbmcvU2xpZGluZ1dpbmRvd1RpbWVSZXNlcnZvaXJBZ2dyZWdhdGluZ1RyaW1tZXJUZXN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL1NsaWRpbmdXaW5kb3dUaW1lUmVzZXJ2b2lyQWdncmVnYXRpbmdUcmltbWVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYjk5MDYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL1NsaWRpbmdXaW5kb3dUaW1lUmVzZXJ2b2lyQWdncmVnYXRpbmdUcmltbWVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLm1vbml0b3Jpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFRlc3RzIG9mIHtAbGluayBTbGlkaW5nV2luZG93VGltZVJlc2Vydm9pcn0uCisgKgorICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYSBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgU2xpZGluZ1dpbmRvd1RpbWVSZXNlcnZvaXJBZ2dyZWdhdGluZ1RyaW1tZXJUZXN0IGV4dGVuZHMgU2xpZGluZ1dpbmRvd1RpbWVSZXNlcnZvaXJUZXN0IHsKKworICAgIHByb3RlY3RlZCBTbGlkaW5nV2luZG93VGltZVJlc2Vydm9pciBzbGlkaW5nV2luZG93VGltZVJlc2Vydm9pcihmaW5hbCBsb25nIG5vdykgeworICAgICAgICByZXR1cm4gbmV3IFNsaWRpbmdXaW5kb3dUaW1lUmVzZXJ2b2lyKDEwLCBUaW1lVW5pdC5OQU5PU0VDT05EUywgbm93LAorICAgICAgICAgICAgICAgIFRpbWVVbml0Lk5BTk9TRUNPTkRTLCBuZXcgQWdncmVnYXRpbmdUcmltbWVyKG5vdywgVGltZVVuaXQuTkFOT1NFQ09ORFMsIDEsIFRpbWVVbml0LlNFQ09ORFMpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3JpbmcvU2xpZGluZ1dpbmRvd1RpbWVSZXNlcnZvaXJUZXN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL1NsaWRpbmdXaW5kb3dUaW1lUmVzZXJ2b2lyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkN2FjZjEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL1NsaWRpbmdXaW5kb3dUaW1lUmVzZXJ2b2lyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTk5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5tb25pdG9yaW5nOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdHMgb2Yge0BsaW5rIFNsaWRpbmdXaW5kb3dUaW1lUmVzZXJ2b2lyfS4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBTbGlkaW5nV2luZG93VGltZVJlc2Vydm9pclRlc3QgZXh0ZW5kcyBBYnN0cmFjdE5hbm9zUmVzZXJ2b2lyVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZVJlcXVlc3RzQXRUaGVTYW1lVGltZVplcm9UaW1lKCkgeworICAgICAgICB0ZXN0TXVsdGlwbGVSZXF1ZXN0c0F0VGhlU2FtZVRpbWUoMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVSZXF1ZXN0c0F0VGhlU2FtZVRpbWVTeXN0ZW1UaW1lKCkgeworICAgICAgICB0ZXN0TXVsdGlwbGVSZXF1ZXN0c0F0VGhlU2FtZVRpbWUoU3lzdGVtLm5hbm9UaW1lKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0TXVsdGlwbGVSZXF1ZXN0c0F0VGhlU2FtZVRpbWUoZmluYWwgbG9uZyBub3cpIHsKKyAgICAgICAgZmluYWwgU2xpZGluZ1dpbmRvd1RpbWVSZXNlcnZvaXIgcmVzZXJ2b2lyID0gc2xpZGluZ1dpbmRvd1RpbWVSZXNlcnZvaXIobm93KTsKKworICAgICAgICAvLyBwdXQgbXVsdGlwbGUgcmVxdWVzdHMgYXQgdGhlIGJlZ2lubmluZyBzbyB0aGF0IGV2ZW4gdGhlIENPTExJU0lPTl9CVUZGRVIgYm91bmRzIGlzIHRlc3RlZAorICAgICAgICByZXNlcnZvaXJVcGRhdGVJbk5hbm9zKHJlc2Vydm9pciwgMTAsIG5vdyk7CisgICAgICAgIHJlc2Vydm9pclVwZGF0ZUluTmFub3MocmVzZXJ2b2lyLCAyMCwgbm93KTsKKyAgICAgICAgcmVzZXJ2b2lyVXBkYXRlSW5OYW5vcyhyZXNlcnZvaXIsIDMwLCBub3cpOworICAgICAgICByZXNlcnZvaXJVcGRhdGVJbk5hbm9zKHJlc2Vydm9pciwgNDAsIG5vdyk7CisKKyAgICAgICAgcmVzZXJ2b2lyVXBkYXRlSW5OYW5vcyhyZXNlcnZvaXIsIDUwLCBub3cgKyAxKTsKKyAgICAgICAgLy8gcHV0IG11bHRpcGxlIHJlcXVlc3RzIGluIHRoZSBtaWRkbGUgb2YgdGhlIHdpbmRvdworICAgICAgICByZXNlcnZvaXJVcGRhdGVJbk5hbm9zKHJlc2Vydm9pciwgNjAsIG5vdyArIDUpOworICAgICAgICByZXNlcnZvaXJVcGRhdGVJbk5hbm9zKHJlc2Vydm9pciwgNzAsIG5vdyArIDUpOworICAgICAgICBjaGVja0luTmFub3MocmVzZXJ2b2lyLCBub3cgKyA1LCA3LCAxMCwgNzAsIDQwLCA1KTsKKworICAgICAgICAvLyBwdXQgbXVsdGlwbGUgcmVxdWVzdHMgYXQgdGhlIGVuZCBvZiB0aGUgd2luZG93CisgICAgICAgIHJlc2Vydm9pclVwZGF0ZUluTmFub3MocmVzZXJ2b2lyLCA4MCwgbm93ICsgMTApOworICAgICAgICByZXNlcnZvaXJVcGRhdGVJbk5hbm9zKHJlc2Vydm9pciwgOTAsIG5vdyArIDEwKTsKKyAgICAgICAgY2hlY2tJbk5hbm9zKHJlc2Vydm9pciwgbm93ICsgMTAsIDksIDEwLCA5MCwgNTApOworCisgICAgICAgIC8vIGF0ICdub3cgKyAxMScgYWxsIHRoZSByZXF1ZXN0cyBmcm9tICdub3cnIHNob3VsZCBiZSBnb25lCisgICAgICAgIGNoZWNrSW5OYW5vcyhyZXNlcnZvaXIsIG5vdyArIDExLCA1LCA1MCwgOTAsIDcwKTsKKyAgICAgICAgLy8gYXQgJ25vdyArIDEyJyB0aGUgJzUwJyB2YWx1ZSBzaG91bGQgYmUgZ29uZSBhcyB3ZWxsCisgICAgICAgIGNoZWNrSW5OYW5vcyhyZXNlcnZvaXIsIG5vdyArIDEyLCA0LCA2MCwgOTAsIDc1KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGaXJzdFVwZGF0ZU9sZGVyVGhhblN0YXJ0VGltZVplcm9UaW1lKCkgeworICAgICAgICB0ZXN0Rmlyc3RVcGRhdGVPbGRlclRoYW5TdGFydFRpbWUoMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rmlyc3RVcGRhdGVPbGRlclRoYW5TdGFydFRpbWVTeXN0ZW1UaW1lKCkgeworICAgICAgICB0ZXN0Rmlyc3RVcGRhdGVPbGRlclRoYW5TdGFydFRpbWUoU3lzdGVtLm5hbm9UaW1lKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpcnN0VXBkYXRlT2xkZXJUaGFuU3RhcnRUaW1lTWluVGltZSgpIHsKKyAgICAgICAgdGVzdEZpcnN0VXBkYXRlT2xkZXJUaGFuU3RhcnRUaW1lKExvbmcuTUlOX1ZBTFVFKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdEZpcnN0VXBkYXRlT2xkZXJUaGFuU3RhcnRUaW1lKGZpbmFsIGxvbmcgbm93KSB7CisgICAgICAgIGZpbmFsIFNsaWRpbmdXaW5kb3dUaW1lUmVzZXJ2b2lyIHJlc2Vydm9pciA9IHNsaWRpbmdXaW5kb3dUaW1lUmVzZXJ2b2lyKG5vdyk7CisKKyAgICAgICAgLy8gcHV0IG11bHRpcGxlIHJlcXVlc3RzIGF0IHRoZSBiZWdpbm5pbmcgc28gdGhhdCBldmVuIHRoZSBDT0xMSVNJT05fQlVGRkVSIGJvdW5kcyBpcyB0ZXN0ZWQKKyAgICAgICAgcmVzZXJ2b2lyVXBkYXRlSW5OYW5vcyhyZXNlcnZvaXIsIDEwLCBub3cgLSA1KTsKKyAgICAgICAgcmVzZXJ2b2lyVXBkYXRlSW5OYW5vcyhyZXNlcnZvaXIsIDIwLCBub3cgLSA0KTsKKyAgICAgICAgY2hlY2tJbk5hbm9zKHJlc2Vydm9pciwgbm93LCAyLCAxMCwgMjAsIDE1LCA1KTsKKworICAgICAgICAvLyBwdXQgbXVsdGlwbGUgcmVxdWVzdHMgYXQgdGhlIGVuZCBvZiB0aGUgd2luZG93CisgICAgICAgIHJlc2Vydm9pclVwZGF0ZUluTmFub3MocmVzZXJ2b2lyLCAzMCwgbm93KTsKKyAgICAgICAgY2hlY2tJbk5hbm9zKHJlc2Vydm9pciwgbm93LCAzLCAxMCwgMzAsIDIwLCA1KTsKKworICAgICAgICByZXNlcnZvaXJVcGRhdGVJbk5hbm9zKHJlc2Vydm9pciwgNDAsIG5vdyArIDEpOworICAgICAgICBjaGVja0luTmFub3MocmVzZXJ2b2lyLCBub3cgKyAxLCA0LCAxMCwgNDAsIDI1LCA2KTsKKworICAgICAgICBjaGVja0luTmFub3MocmVzZXJ2b2lyLCBub3cgKyA1LCA0LCAxMCwgNDAsIDI1LCAxMCk7CisgICAgICAgIGNoZWNrSW5OYW5vcyhyZXNlcnZvaXIsIG5vdyArIDYsIDMsIDIwLCA0MCwgMzAsIDEwKTsKKyAgICAgICAgY2hlY2tJbk5hbm9zKHJlc2Vydm9pciwgbm93ICsgNywgMiwgMzAsIDQwLCAzNSwgMTApOworICAgICAgICBjaGVja0luTmFub3MocmVzZXJ2b2lyLCBub3cgKyAxMCwgMiwgMzAsIDQwLCAzNSwgMTApOworICAgICAgICBjaGVja0luTmFub3MocmVzZXJ2b2lyLCBub3cgKyAxMSwgMSwgNDAsIDQwLCA0MCwgMTApOworICAgICAgICBjaGVja0luTmFub3MocmVzZXJ2b2lyLCBub3cgKyAxMiwgMCwgMCwgMCwgMCwgMTApOworCisgICAgfQorCisgICAgcHJvdGVjdGVkIFNsaWRpbmdXaW5kb3dUaW1lUmVzZXJ2b2lyIHNsaWRpbmdXaW5kb3dUaW1lUmVzZXJ2b2lyKGZpbmFsIGxvbmcgbm93KSB7CisgICAgICAgIHJldHVybiBuZXcgU2xpZGluZ1dpbmRvd1RpbWVSZXNlcnZvaXIoMTAsIFRpbWVVbml0Lk5BTk9TRUNPTkRTLCBub3csCisgICAgICAgICAgICAgICAgVGltZVVuaXQuTkFOT1NFQ09ORFMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEV4aGF1c3RpdmVSZXF1ZXN0c0F0VGhlU2FtZVRpbWVaZXJvVGltZSgpIHsKKyAgICAgICAgdGVzdEV4aGF1c3RpdmVSZXF1ZXN0c0F0VGhlU2FtZVRpbWUoMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhoYXVzdGl2ZVJlcXVlc3RzQXRUaGVTYW1lVGltZVN5c3RlbVRpbWUoKSB7CisgICAgICAgIHRlc3RFeGhhdXN0aXZlUmVxdWVzdHNBdFRoZVNhbWVUaW1lKFN5c3RlbS5uYW5vVGltZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeGhhdXN0aXZlUmVxdWVzdHNBdFRoZVNhbWVUaW1lTWF4VGltZSgpIHsKKyAgICAgICAgdGVzdEV4aGF1c3RpdmVSZXF1ZXN0c0F0VGhlU2FtZVRpbWUoTG9uZy5NQVhfVkFMVUUgLSA1KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHRlc3QgZXhoYXVzdGl2ZWx5IHZlcmlmaWVzIHRoZSBzbGlkaW5nIHdpbmRvdyB0aW1lIHJlc2Vydm9pci4gU3RlcCBieSBzdGVwLCBiYXNpY2FsbHkgYWxsIGl0cyBjYXBhYmlsaXRpZXMgYXJlCisgICAgICogdGhvcm91Z2hseSB0ZXN0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RFeGhhdXN0aXZlUmVxdWVzdHNBdFRoZVNhbWVUaW1lKGZpbmFsIGxvbmcgbm93KSB7CisgICAgICAgIGZpbmFsIFNsaWRpbmdXaW5kb3dUaW1lUmVzZXJ2b2lyIHJlc2Vydm9pciA9IHNsaWRpbmdXaW5kb3dUaW1lUmVzZXJ2b2lyKG5vdyk7CisKKyAgICAgICAgLy8gcHV0IG11bHRpcGxlIHJlcXVlc3RzIGF0IHRoZSBiZWdpbm5pbmcgc28gdGhhdCBldmVuIHRoZSBDT0xMSVNJT05fQlVGRkVSIGJvdW5kcyBpcyB0ZXN0ZWQKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBDT0xMSVNJT05fQlVGRkVSOyArK2kpIHsKKyAgICAgICAgICAgIHJlc2Vydm9pclVwZGF0ZUluTmFub3MocmVzZXJ2b2lyLCAxMCwgbm93KTsKKyAgICAgICAgfQorICAgICAgICAvLyBhZGQgb25lIG1vcmUgcmVxdWVzdCB3aGljaCBzaG91bGQgbm90IGZpdCBpbnRvIHRoZSBjb2xsaXNpb24gYnVmZmVyIGFuZCB3aWxsIGJlIHRocm93biBhd2F5CisgICAgICAgIHJlc2Vydm9pclVwZGF0ZUluTmFub3MocmVzZXJ2b2lyLCA5OTk5OTksIG5vdyk7CisKKyAgICAgICAgLy8gY2hlY2sgYWdhaW4gYXQgJ25vdyArIDUnIGJlZm9yZSB3ZSBhZGQgbW9yZSB2YWx1ZXMKKyAgICAgICAgY2hlY2tJbk5hbm9zKHJlc2Vydm9pciwgbm93ICsgNSwgQ09MTElTSU9OX0JVRkZFUiwgMTAsIDEwLCAxMCwgNSk7CisKKyAgICAgICAgLy8gcHV0IG11bHRpcGxlIHJlcXVlc3RzIGluIHRoZSBtaWRkbGUgb2YgdGhlIHdpbmRvdworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IENPTExJU0lPTl9CVUZGRVI7ICsraSkgeworICAgICAgICAgICAgcmVzZXJ2b2lyVXBkYXRlSW5OYW5vcyhyZXNlcnZvaXIsIDEwLCBub3cgKyA1KTsKKyAgICAgICAgfQorICAgICAgICAvLyBhZGQgb25lIG1vcmUgcmVxdWVzdCB3aGljaCBzaG91bGQgbm90IGZpdCBpbnRvIHRoZSBjb2xsaXNpb24gYnVmZmVyIGFuZCB3aWxsIGJlIHRocm93biBhd2F5CisgICAgICAgIHJlc2Vydm9pclVwZGF0ZUluTmFub3MocmVzZXJ2b2lyLCA5OTk5OTksIG5vdyArIDUpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IDU7ICsraSkgeworICAgICAgICAgICAgLy8gYWxsIHRoZSBzbmFwc2hvdHMgaW4gcGFzdCB3aWxsIHJldHVybiB0aGUgc2FtZSB2YWx1ZSBhcyBhdCAnbm93ICsgNScKKyAgICAgICAgICAgIGNoZWNrSW5OYW5vcyhyZXNlcnZvaXIsIG5vdyArIGksIENPTExJU0lPTl9CVUZGRVIgKiAyLCAxMCwgMTAsIDEwLCA1KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGFkZCBhIHZhbHVlIGluIHBhc3QsIGF0ICdub3cgKyAxJywgdGhpcyB3aWxsIGFsc28gaGVscCB1cyB0ZXN0IHRoYXQgd2UgdHJpbSB0aGUgcmVzZXJ2b2lyIGNvcnJlY3RseQorICAgICAgICByZXNlcnZvaXJVcGRhdGVJbk5hbm9zKHJlc2Vydm9pciwgMTAsIG5vdyArIDEpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IDU7ICsraSkgeworICAgICAgICAgICAgLy8gYWxsIHRoZSBzbmFwc2hvdHMgaW4gcGFzdCB3aWxsIHJldHVybiB0aGUgc2FtZSB2YWx1ZSBhcyBhdCAnbm93ICsgNScKKyAgICAgICAgICAgIGNoZWNrSW5OYW5vcyhyZXNlcnZvaXIsIG5vdyArIGksIENPTExJU0lPTl9CVUZGRVIgKiAyICsgMSwgMTAsIDEwLCAxMCwgNSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBwdXQgbXVsdGlwbGUgcmVxdWVzdHMgYXQgdGhlIGVuZCBvZiB0aGUgd2luZG93CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQ09MTElTSU9OX0JVRkZFUjsgKytpKSB7CisgICAgICAgICAgICByZXNlcnZvaXJVcGRhdGVJbk5hbm9zKHJlc2Vydm9pciwgMTAsIG5vdyArIDEwKTsKKyAgICAgICAgfQorICAgICAgICAvLyBhZGQgb25lIG1vcmUgcmVxdWVzdCB3aGljaCBzaG91bGQgbm90IGZpdCBpbnRvIHRoZSBjb2xsaXNpb24gYnVmZmVyIGFuZCB3aWxsIGJlIHRocm93biBhd2F5CisgICAgICAgIHJlc2Vydm9pclVwZGF0ZUluTmFub3MocmVzZXJ2b2lyLCA5OTk5OTksIG5vdyArIDEwKTsKKworICAgICAgICBjaGVja0luTmFub3MocmVzZXJ2b2lyLCBub3cgKyAxMCwgQ09MTElTSU9OX0JVRkZFUiAqIDMgKyAxLCAxMCwgMTAsIDEwKTsKKworICAgICAgICAvLyBhdCAnbm93ICsgMTEnIGFsbCB0aGUgcmVxdWVzdHMgZnJvbSAnbm93JyBzaG91bGQgYmUgZ29uZQorICAgICAgICBjaGVja0luTmFub3MocmVzZXJ2b2lyLCBub3cgKyAxMSwgQ09MTElTSU9OX0JVRkZFUiAqIDIgKyAxLCAxMCwgMTAsIDEwKTsKKworICAgICAgICAvLyB0aGVzZSB2YWx1ZXMgKGZyb20gJ25vdycpIGRvbid0IGV2ZW4gZml0IGludG8gdGhlIHJlc2Vydm9pciwgYWxsIHRoZSB2YWx1ZXMgd2lsbCBiZSB0aHJvd24gYXdheQorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IENPTExJU0lPTl9CVUZGRVIgKyAxOyArK2kpIHsKKyAgICAgICAgICAgIHJlc2Vydm9pclVwZGF0ZUluTmFub3MocmVzZXJ2b2lyLCA5OTk5OTksIG5vdyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBjaGVjayBhZ2FpbiBhdCAnbm93ICsgMTEnIHRvIHByb3ZlIHRoYXQgdmFsdWVzIGF0ICdub3cnIHdlcmVuJ3QgYWRkZWQgYXQgYWxsCisgICAgICAgIGNoZWNrSW5OYW5vcyhyZXNlcnZvaXIsIG5vdyArIDExLCBDT0xMSVNJT05fQlVGRkVSICogMiArIDEsIDEwLCAxMCwgMTApOworCisgICAgICAgIC8vIGF0ICdub3cgKyAxMicgdGhlIG9uZSBhZGRpdGlvbmFsIHJlcXVlc3Qgd2UgYWRkZWQgaXMgZ29uZQorICAgICAgICBjaGVja0luTmFub3MocmVzZXJ2b2lyLCBub3cgKyAxMiwgQ09MTElTSU9OX0JVRkZFUiAqIDIsIDEwLCAxMCwgMTApOworCisgICAgICAgIC8vIGF0ICdub3cgKyAxNScgaXQncyB0aGUgc2FtZSBhcyBhdCAnbm93ICsgMScKKyAgICAgICAgY2hlY2tJbk5hbm9zKHJlc2Vydm9pciwgbm93ICsgMTUsIENPTExJU0lPTl9CVUZGRVIgKiAyLCAxMCwgMTAsIDEwKTsKKworICAgICAgICAvLyBhdCAnbm93ICsgMTYnIHRoZSB2YWx1ZXMgZnJvbSAnbm93ICsgNScgYXJlIGdvbmUKKyAgICAgICAgY2hlY2tJbk5hbm9zKHJlc2Vydm9pciwgbm93ICsgMTYsIENPTExJU0lPTl9CVUZGRVIsIDEwLCAxMCwgMTApOworCisgICAgICAgIC8vIGF0ICdub3cgKyAyMCcgaXQncyB0aGUgdGhlIHNhbWUgYXMgYXQgJ25vdyArIDE2JworICAgICAgICBjaGVja0luTmFub3MocmVzZXJ2b2lyLCBub3cgKyAyMCwgQ09MTElTSU9OX0JVRkZFUiwgMTAsIDEwLCAxMCk7CisKKyAgICAgICAgLy8gYXQgJ25vdyArIDIxJyBhbGwgdGhlIHJlcXVlc3RzIGFyZSBnb25lCisgICAgICAgIGNoZWNrSW5OYW5vcyhyZXNlcnZvaXIsIG5vdyArIDIxLCAwLCAwLCAwLCAwKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3JpbmcvVGltZVdpbmRvd1N0YXRpc3RpY3NJbXBsVGVzdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9UaW1lV2luZG93U3RhdGlzdGljc0ltcGxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU1OTcwYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3JpbmcvVGltZVdpbmRvd1N0YXRpc3RpY3NJbXBsVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjkxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5tb25pdG9yaW5nOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwubW9uaXRvcmluZy5jb3JlLlVuaWZvcm1UaW1lUmVzZXJ2b2lyOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0cyBvZiB7QGxpbmsgVGltZVdpbmRvd1N0YXRpc3RpY3NJbXBsfS4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBUaW1lV2luZG93U3RhdGlzdGljc0ltcGxUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBERUxUQSA9IDAuMDAwMTsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdCgpIHsKKyAgICAgICAgZmluYWwgbG9uZyBub3cgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgZmluYWwgVGltZVdpbmRvd1N0YXRpc3RpY3NJbXBsLkJ1aWxkZXI8TG9uZz4gYnVpbGRlciA9IG5ldyBUaW1lV2luZG93U3RhdGlzdGljc0ltcGwuQnVpbGRlcjw+KAorICAgICAgICAgICAgICAgIG5ldyBTbGlkaW5nV2luZG93VGltZVJlc2Vydm9pcigxMDAwTCwgVGltZVVuaXQuTUlMTElTRUNPTkRTLCBub3csIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICBidWlsZGVyLmFkZFJlcXVlc3Qobm93LCAzMEwpOworICAgICAgICBidWlsZGVyLmFkZFJlcXVlc3Qobm93ICsgMzAwLCAxMDBMKTsKKyAgICAgICAgYnVpbGRlci5hZGRSZXF1ZXN0KG5vdyArIDYwMCwgMTUwTCk7CisgICAgICAgIGJ1aWxkZXIuYWRkUmVxdWVzdChub3cgKyA4MDAsIDE1TCk7CisgICAgICAgIGJ1aWxkZXIuYWRkUmVxdWVzdChub3cgKyA5OTksIDYwTCk7CisgICAgICAgIGJ1aWxkZXIuYWRkUmVxdWVzdChub3cgKyAxMDAwLCA5NUwpOworCisgICAgICAgIGNoZWNrKGJ1aWxkZXIsIG5vdyArIDEwMDAsIDYsIDE1LCAxNTAsIDc1LCA2KTsKKyAgICAgICAgYnVpbGRlci5hZGRSZXF1ZXN0KG5vdyArIDEwMDEsIDk5OUwpOworICAgICAgICAvLyB0aGUgb3JpZ2luYWwgaW1wbGVtZW50YXRpb24gd2FzIHN1cHBvc2VkIHRvIHRyaW0gdGhlIGZpcnN0IHJlcXVlc3QsIHdlIGNhbiBvbmx5IGd1ZXNzIHdoeSBpdCBkaWRuJ3QgLi4uCisgICAgICAgIGNoZWNrKGJ1aWxkZXIsIG5vdyArIDEwMDEsIDYsIDE1LCA5OTksIDIzNiwgNik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MTAoKSB7CisgICAgICAgIGZpbmFsIGxvbmcgbm93ID0gMDsKKyAgICAgICAgZmluYWwgVGltZVdpbmRvd1N0YXRpc3RpY3NJbXBsLkJ1aWxkZXI8TG9uZz4gYnVpbGRlcgorICAgICAgICAgICAgICAgID0gbmV3IFRpbWVXaW5kb3dTdGF0aXN0aWNzSW1wbC5CdWlsZGVyPD4oCisgICAgICAgICAgICAgICAgbmV3IFNsaWRpbmdXaW5kb3dUaW1lUmVzZXJ2b2lyKDEwMDAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMsIG5vdywgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgIGJ1aWxkZXIuYWRkUmVxdWVzdChub3csIDMwTCk7CisgICAgICAgIGJ1aWxkZXIuYWRkUmVxdWVzdChub3cgKyAzMDAsIDEwMEwpOworICAgICAgICBidWlsZGVyLmFkZFJlcXVlc3Qobm93ICsgNjAwLCAxNTBMKTsKKyAgICAgICAgYnVpbGRlci5hZGRSZXF1ZXN0KG5vdyArIDgwMCwgMTVMKTsKKyAgICAgICAgYnVpbGRlci5hZGRSZXF1ZXN0KG5vdyArIDk5OSwgNjBMKTsKKyAgICAgICAgYnVpbGRlci5hZGRSZXF1ZXN0KG5vdyArIDEwMDAsIDk1TCk7CisgICAgICAgIGJ1aWxkZXIuYWRkUmVxdWVzdChub3cgKyA4MDAxLCA2MDBMKTsKKworICAgICAgICAvLyBjaGVjayB1bmZpbmlzaGVkIGludGVydmFsCisgICAgICAgIGNoZWNrKGJ1aWxkZXIsIG5vdyArIDgwMDEsIDcsIDE1LCA2MDAsIDE1MCwgMC44NzQ4OTA2KTsKKworICAgICAgICAvLyB0aGUgb3JpZ2luYWwgaW1wbGVtZW50YXRpb24gdXNlZCBjaHVua3MgZm9yIHRpbWUgdW5pdHMgYW5kIHRoZSBtZXRyaWNzIGNhbGN1bGF0aW9uCisgICAgICAgIC8vIHdhcyBhY2N1cmF0ZSBvbmx5IHdoZW4gYWxpZ25lZCB3aXRoIHRoZSBjaHVua3M7IG5vdywgd2UncmUgYWNjdXJhdGUgYXMgcG9zc2libGUgd2hpY2gKKyAgICAgICAgLy8gaXMgd2h5IHdlIGRvbid0IG5lZWQgdG8gdXNlIHJhdGlvICh0byBhZGp1c3QgdGhlIGNvdW50IG9mIHRoZSByZXF1ZXN0IGluIHRoZSBsYXN0IGNodW5rCisgICAgICAgIGNoZWNrKGJ1aWxkZXIsIG5vdyArIDEwOTAwLCAzLCA2MCwgNjAwLCAyNTEsIDAuMyk7CisgICAgICAgIC8vIHRoZSBvcmlnaW5hbCBjYWxjdWxhdGlvbiBsZWZ0IG1pbmltdW0gYXMgJzE1JyB3aGljaCBjb2xsaWRlcyB3aXRoIHRoZSBhcGkgZG9jCisgICAgICAgIGNoZWNrKGJ1aWxkZXIsIG5vdyArIDExMDAwLCAyLCA5NSwgNjAwLCAzNDcsIDAuMik7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHRlc3Qgc2hvd3MgdGhhdCBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5UaW1lV2luZG93U3RhdGlzdGljc30gaXMgYWJsZQorICAgICAqIHRvIHByb2Nlc3MgaW5mb3JtYXRpb24gdGhhdCBoYXBwZW5lZCBiZWZvcmUgdGhlIGxhc3QgdXBkYXRlIHRpbWUuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWVzdEluUGFzdCgpIHsKKyAgICAgICAgZmluYWwgbG9uZyBub3cgPSAwOworICAgICAgICBmaW5hbCBUaW1lV2luZG93U3RhdGlzdGljc0ltcGwuQnVpbGRlcjxMb25nPiBidWlsZGVyCisgICAgICAgICAgICAgICAgPSBuZXcgVGltZVdpbmRvd1N0YXRpc3RpY3NJbXBsLkJ1aWxkZXI8PigKKyAgICAgICAgICAgICAgICBuZXcgU2xpZGluZ1dpbmRvd1RpbWVSZXNlcnZvaXIoMTAwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTLCBub3csIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICBidWlsZGVyLmFkZFJlcXVlc3Qobm93LCA0MEwpOworICAgICAgICBidWlsZGVyLmFkZFJlcXVlc3Qobm93ICsgMTAwMCwgMzBMKTsKKyAgICAgICAgLy8gdGhpcyBpcyBhIHJlcXVlc3QgaW4gcGFzdCB3aGljaCB3aWxsIGFjdHVhbGx5IHJldXNlIHRoZSB0aW1lICdub3cgKyAxMDAwJworICAgICAgICBidWlsZGVyLmFkZFJlcXVlc3Qobm93ICsgMTAwLCAxMEwpOworCisgICAgICAgIGNoZWNrKGJ1aWxkZXIsIG5vdyArIDEwMDAsIDMsIDEwLCA0MCwgMjYsIDMpOworCisgICAgICAgIC8vIHRoaXMgcmVxdWVzdCBpbiBwYXN0IGlzIHNvIG9sZCB0aGF0IGl0IGRvZXNuJ3QgZXZlbiBmaXQgaW50byB0aGUgd2luZG93CisgICAgICAgIGJ1aWxkZXIuYWRkUmVxdWVzdChub3cgKyAxMDAsIDBMKTsKKyAgICAgICAgYnVpbGRlci5hZGRSZXF1ZXN0KG5vdyArIDEyMDAsIDIwTCk7CisKKyAgICAgICAgY2hlY2soYnVpbGRlciwgbm93ICsgMTIwMSwgMiwgMjAsIDMwLCAyNSwgMik7CisKKyAgICAgICAgLy8gc25hcHNob3QgcmV0cmlldmFsIGluIHBhc3QgZG9lcyByZXR1cm4gdmFsdWVzIGluIHBhc3Q7IGluIGZhY3QsIHRpbWUgJ25vdyArIDEyMDEnIGlzIHVzZWQKKyAgICAgICAgY2hlY2soYnVpbGRlciwgbm93ICsgMTAwMCwgMiwgMjAsIDMwLCAyNSwgMik7CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3QzcygpIHsKKyAgICAgICAgZmluYWwgbG9uZyBub3cgPSAwOworICAgICAgICBmaW5hbCBUaW1lV2luZG93U3RhdGlzdGljc0ltcGwuQnVpbGRlcjxMb25nPiBidWlsZGVyCisgICAgICAgICAgICAgICAgPSBuZXcgVGltZVdpbmRvd1N0YXRpc3RpY3NJbXBsLkJ1aWxkZXI8PigKKyAgICAgICAgICAgICAgICBuZXcgU2xpZGluZ1dpbmRvd1RpbWVSZXNlcnZvaXIoMzAwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTLCBub3csIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICBidWlsZGVyLmFkZFJlcXVlc3Qobm93LCA5OUwpOworICAgICAgICBidWlsZGVyLmFkZFJlcXVlc3Qobm93ICsgMzAwLCA5OEwpOworICAgICAgICBidWlsZGVyLmFkZFJlcXVlc3Qobm93ICsgNjAwLCAxTCk7CisgICAgICAgIGJ1aWxkZXIuYWRkUmVxdWVzdChub3cgKyAxMDAwLCA5NkwpOworICAgICAgICBidWlsZGVyLmFkZFJlcXVlc3Qobm93ICsgMTUwMCwgOTVMKTsKKyAgICAgICAgYnVpbGRlci5hZGRSZXF1ZXN0KG5vdyArIDI1MDAsIDNMKTsKKyAgICAgICAgLy8gLi4uIGFib3ZlIHNob3VsZCBiZSBpZ25vcmVkCisKKyAgICAgICAgYnVpbGRlci5hZGRSZXF1ZXN0KG5vdyArIDM1MDAsIDkwTCk7CisgICAgICAgIGJ1aWxkZXIuYWRkUmVxdWVzdChub3cgKyAzOTAwLCA0TCk7CisgICAgICAgIGJ1aWxkZXIuYWRkUmVxdWVzdChub3cgKyAzOTAwLCA4MEwpOworICAgICAgICBidWlsZGVyLmFkZFJlcXVlc3Qobm93ICsgNDIwMCwgOTJMKTsKKyAgICAgICAgYnVpbGRlci5hZGRSZXF1ZXN0KG5vdyArIDQ5MDAsIDE1TCk7CisgICAgICAgIGJ1aWxkZXIuYWRkUmVxdWVzdChub3cgKyA1MzAwLCA4TCk7CisgICAgICAgIGJ1aWxkZXIuYWRkUmVxdWVzdChub3cgKyA1NjAwLCA1MEwpOworCisgICAgICAgIGNoZWNrKGJ1aWxkZXIsIG5vdyArIDYwMDEsIDcsIDQsIDkyLCA0OCwgMi4zMzMzMzMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvbmdQYXVzZSgpIHsKKyAgICAgICAgZmluYWwgbG9uZyBub3cgPSAwOworICAgICAgICBmaW5hbCBUaW1lV2luZG93U3RhdGlzdGljc0ltcGwuQnVpbGRlcjxMb25nPiBidWlsZGVyID0gbmV3IFRpbWVXaW5kb3dTdGF0aXN0aWNzSW1wbC5CdWlsZGVyPD4oCisgICAgICAgICAgICAgICAgbmV3IFNsaWRpbmdXaW5kb3dUaW1lUmVzZXJ2b2lyKDYwLCBUaW1lVW5pdC5TRUNPTkRTLCBub3csIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICBidWlsZGVyLmFkZFJlcXVlc3Qobm93LCA5OUwpOworICAgICAgICBmaW5hbCBsb25nIHRpbWUgPSBub3cgKyAxMDAwICogNjAgKiA2MCAqIDIzOworICAgICAgICBidWlsZGVyLmFkZFJlcXVlc3QodGltZSwgOTVMKTsKKyAgICAgICAgYnVpbGRlci5hZGRSZXF1ZXN0KHRpbWUgKyA1LCA1TCk7CisgICAgICAgIGNoZWNrKGJ1aWxkZXIsIHRpbWUgKyAyMDAwMCwgMiwgNSwgOTUsIDUwLCAwLjAzMzMzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZVJlcXVlc3RzQXRUaGVTYW1lVGltZSgpIHsKKyAgICAgICAgZmluYWwgbG9uZyBub3cgPSAwOworICAgICAgICBmaW5hbCBUaW1lV2luZG93U3RhdGlzdGljc0ltcGwuQnVpbGRlcjxMb25nPiBidWlsZGVyID0gbmV3IFRpbWVXaW5kb3dTdGF0aXN0aWNzSW1wbC5CdWlsZGVyPD4oCisgICAgICAgICAgICAgICAgbmV3IFNsaWRpbmdXaW5kb3dUaW1lUmVzZXJ2b2lyKDEsIFRpbWVVbml0LlNFQ09ORFMsIG5vdywgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgIC8vIHB1dCBtdWx0aXBsZSByZXF1ZXN0cyBhdCB0aGUgYmVnaW5uaW5nIHNvIHRoYXQgZXZlbiB0aGUgQ09MTElTSU9OX0JVRkZFUiBib3VuZHMgaXMgdGVzdGVkCisgICAgICAgIGJ1aWxkZXIuYWRkUmVxdWVzdChub3csIDEwTCk7CisgICAgICAgIGJ1aWxkZXIuYWRkUmVxdWVzdChub3csIDIwTCk7CisgICAgICAgIGJ1aWxkZXIuYWRkUmVxdWVzdChub3csIDMwTCk7CisgICAgICAgIGJ1aWxkZXIuYWRkUmVxdWVzdChub3csIDQwTCk7CisKKyAgICAgICAgYnVpbGRlci5hZGRSZXF1ZXN0KG5vdyArIDEsIDUwTCk7CisgICAgICAgIC8vIHB1dCBtdWx0aXBsZSByZXF1ZXN0cyBpbiB0aGUgbWlkZGxlIG9mIHRoZSB3aW5kb3cKKyAgICAgICAgYnVpbGRlci5hZGRSZXF1ZXN0KG5vdyArIDUwMCwgNjBMKTsKKyAgICAgICAgYnVpbGRlci5hZGRSZXF1ZXN0KG5vdyArIDUwMCwgNzBMKTsKKyAgICAgICAgY2hlY2soYnVpbGRlciwgbm93ICsgNTAwLCA3LCAxMCwgNzAsIDQwLCAxNCk7CisKKyAgICAgICAgLy8gcHV0IG11bHRpcGxlIHJlcXVlc3RzIGF0IHRoZSBlbmQgb2YgdGhlIHdpbmRvdworICAgICAgICBidWlsZGVyLmFkZFJlcXVlc3Qobm93ICsgMTAwMCwgODBMKTsKKyAgICAgICAgYnVpbGRlci5hZGRSZXF1ZXN0KG5vdyArIDEwMDAsIDkwTCk7CisgICAgICAgIGNoZWNrKGJ1aWxkZXIsIG5vdyArIDEwMDAsIDksIDEwLCA5MCwgNTAsIDkpOworCisgICAgICAgIC8vIGF0ICdub3cgKyAxMDAxJyBhbGwgdGhlIHJlcXVlc3RzIGZyb20gJ25vdycgc2hvdWxkIGJlIGdvbmUKKyAgICAgICAgY2hlY2soYnVpbGRlciwgbm93ICsgMTAwMSwgNSwgNTAsIDkwLCA3MCwgNSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhoYXVzdGl2ZVJlcXVlc3RzQXRUaGVTYW1lVGltZSgpIHsKKyAgICAgICAgZmluYWwgbG9uZyBub3cgPSAwOworICAgICAgICBmaW5hbCBUaW1lV2luZG93U3RhdGlzdGljc0ltcGwuQnVpbGRlcjxMb25nPiBidWlsZGVyID0gbmV3IFRpbWVXaW5kb3dTdGF0aXN0aWNzSW1wbC5CdWlsZGVyPD4oCisgICAgICAgICAgICAgICAgbmV3IFNsaWRpbmdXaW5kb3dUaW1lUmVzZXJ2b2lyKDEsIFRpbWVVbml0LlNFQ09ORFMsIG5vdywgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgIC8vIHB1dCBtdWx0aXBsZSByZXF1ZXN0cyBhdCB0aGUgYmVnaW5uaW5nIHNvIHRoYXQgZXZlbiB0aGUgQ09MTElTSU9OX0JVRkZFUiBib3VuZHMgaXMgdGVzdGVkCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuYWRkUmVxdWVzdChub3csIDEwTCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gYWRkIG9uZSBtb3JlIHJlcXVlc3Qgd2hpY2ggc2hvdWxkIGJlIHZpc2libGUgYXQgJ25vdyArIDEwMDEnCisgICAgICAgIGJ1aWxkZXIuYWRkUmVxdWVzdChub3cgKyAxLCAxMEwpOworCisgICAgICAgIC8vIHB1dCBtdWx0aXBsZSByZXF1ZXN0cyBpbiB0aGUgbWlkZGxlIG9mIHRoZSB3aW5kb3cKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyNTY7ICsraSkgeworICAgICAgICAgICAgYnVpbGRlci5hZGRSZXF1ZXN0KG5vdyArIDUwMCwgMTBMKTsKKyAgICAgICAgfQorICAgICAgICBjaGVjayhidWlsZGVyLCBub3cgKyA1MDAsIDI1NiAqIDIgKyAxLCAxMCwgMTAsIDEwLCAyNTYgKiAyICogMiArIDEgKiAyKTsKKworICAgICAgICAvLyBwdXQgbXVsdGlwbGUgcmVxdWVzdHMgYXQgdGhlIGVuZCBvZiB0aGUgd2luZG93CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuYWRkUmVxdWVzdChub3cgKyAxMDAwLCAxMEwpOworICAgICAgICB9CisKKyAgICAgICAgY2hlY2soYnVpbGRlciwgbm93ICsgMTAwMCwgMjU2ICogMyArIDEsIDEwLCAxMCwgMTAsIDI1NiAqIDMgKyAxKTsKKworICAgICAgICAvLyBhdCAnbm93ICsgMTAwMScgYWxsIHRoZSByZXF1ZXN0cyBmcm9tICdub3cnIHNob3VsZCBiZSBnb25lCisgICAgICAgIGNoZWNrKGJ1aWxkZXIsIG5vdyArIDEwMDEsIDI1NiAqIDIgKyAxLCAxMCwgMTAsIDEwLCAyNTYgKiAyICsgMSk7CisKKyAgICAgICAgLy8gYXQgJ25vdyArIDEwMDInIHRoZSBvbmUgYWRkaXRpb25hbCByZXF1ZXN0IHdlIGFkZGVkIGlzIGdvbmUKKyAgICAgICAgY2hlY2soYnVpbGRlciwgbm93ICsgMTAwMiwgMjU2ICogMiwgMTAsIDEwLCAxMCwgMjU2ICogMik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgSkVSU0VZLTI4NDgKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHYXBHcmVhdGVyVGhhblRpbWVXaW5kb3dQYXVzZSgpIHsKKyAgICAgICAgZmluYWwgbG9uZyBub3cgPSAwOworICAgICAgICBmaW5hbCBUaW1lV2luZG93U3RhdGlzdGljc0ltcGwuQnVpbGRlcjxMb25nPiBidWlsZGVyID0gbmV3IFRpbWVXaW5kb3dTdGF0aXN0aWNzSW1wbC5CdWlsZGVyPD4oCisgICAgICAgICAgICAgICAgbmV3IFNsaWRpbmdXaW5kb3dUaW1lUmVzZXJ2b2lyKDEwLCBUaW1lVW5pdC5TRUNPTkRTLCBub3csIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICBidWlsZGVyLmFkZFJlcXVlc3Qobm93LCA5MUwpOworICAgICAgICBidWlsZGVyLmFkZFJlcXVlc3Qobm93ICsgMTAwMCwgOTJMKTsKKyAgICAgICAgYnVpbGRlci5hZGRSZXF1ZXN0KG5vdyArIDIwMDAsIDkzTCk7CisKKyAgICAgICAgLy8gd2UgbmVlZCB0byBhZGQgdGhlIHRpbWUgb2YgbGFzdCByZXF1ZXN0ICsgdGhlIHdob2xlIHRpbWUgd2luZG93cyBwYXVzZSArIGFkZGl0aW9uYWwgdGltZSB0aGF0IGlzIGdyZWF0ZXIgdGhhbiB1bml0IHRpbWUKKyAgICAgICAgLy8gd2hpY2ggaXMgMTAwMAorICAgICAgICBmaW5hbCBsb25nIHRpbWUgPSBub3cgKyAyMDAwICsgMTAwMDAgKyAxMDAxOworCisgICAgICAgIC8vIHRoaXMgcmVxdWVzdCBhZGRpdGlvbiBjYXVzZXMgdGhlIHF1ZXVlIHRvIHJlc2V0OyBob3dldmVyLCB0aGUgb3JpZ2luYWwgaW1wbGVtZW50YXRpb24gZGlkbid0IHJlc2V0IHRoZSB0b3RhbCBjb3VudAorICAgICAgICAvLyBhbmQgdG90YWwgZHVyYXRpb247IGFzIGEgcmVzdWx0LCB0aGUgc3RhdHMgaW4gdGhhdCB3aW5kb3cgYmVjYW1lIGNvcnJ1cHRlZAorICAgICAgICBidWlsZGVyLmFkZFJlcXVlc3QodGltZSwgOTRMKTsKKworICAgICAgICBidWlsZGVyLmFkZFJlcXVlc3QodGltZSArIDEwMDAsIDk1TCk7CisgICAgICAgIGJ1aWxkZXIuYWRkUmVxdWVzdCh0aW1lICsgMjAwMCwgOTZMKTsKKworICAgICAgICBjaGVjayhidWlsZGVyLCB0aW1lICsgMzAwMCwgMywgOTQsIDk2LCA5NSwgMC4zKTsKKworICAgICAgICAvLyB0aGlzIGxpbmUgd291bGQgcGFzcyBiZWZvcmUgSkVSU0VZLTI4NDggd2FzIGZpeGVkOyBhcHBhcmVudGx5LCB0aGUgdmFsdWVzIGluIHRoaXMgd2luZG93IGJlY2FtZSBjb3JydXB0ZWQKKyAgICAgICAgLy8gY2hlY2soYnVpbGRlciwgdGltZSArIDMwMDAsIDUsIDk0LCA5NiwgOTMsIDAuNSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrKGZpbmFsIFRpbWVXaW5kb3dTdGF0aXN0aWNzSW1wbC5CdWlsZGVyIGJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgYnVpbGRUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdG90YWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG1pbmltdW1FeGVjVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG1heGltdW1FeGVjVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBhdmVyYWdlLAorICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBkb3VibGUgcmVxdWVzdHNQZXJTZWNvbmQpIHsKKyAgICAgICAgZmluYWwgVGltZVdpbmRvd1N0YXRpc3RpY3NJbXBsIHN0YXQgPSBidWlsZGVyLmJ1aWxkKGJ1aWxkVGltZSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUb3RhbCBjb3VudCBkb2VzIG5vdCBtYXRjaCEiLCB0b3RhbENvdW50LCBzdGF0LmdldFJlcXVlc3RDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJNaW4gZXhlYyB0aW1lIGRvZXMgbm90IG1hdGNoISIsIG1pbmltdW1FeGVjVGltZSwgc3RhdC5nZXRNaW5pbXVtRHVyYXRpb24oKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiTWF4IGV4ZWMgdGltZSBkb2VzIG5vdCBtYXRjaCEiLCBtYXhpbXVtRXhlY1RpbWUsIHN0YXQuZ2V0TWF4aW11bUR1cmF0aW9uKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkF2ZXJhZ2UgZXhlYyB0aW1lIGRvZXMgbm90IG1hdGNoISIsIGF2ZXJhZ2UsIHN0YXQuZ2V0QXZlcmFnZUR1cmF0aW9uKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlJlcXVlc3RzIHBlciBzZWNvbmRzIGRvZXMgbm90IG1hdGNoISIsIHJlcXVlc3RzUGVyU2Vjb25kLCBzdGF0LmdldFJlcXVlc3RzUGVyU2Vjb25kKCksIERFTFRBKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmljKCkgeworICAgICAgICBmaW5hbCBUaW1lV2luZG93U3RhdGlzdGljc0ltcGwuQnVpbGRlcjxMb25nPiBidWlsZGVyID0gbmV3IFRpbWVXaW5kb3dTdGF0aXN0aWNzSW1wbC5CdWlsZGVyPD4oCisgICAgICAgICAgICAgICAgbmV3IFNsaWRpbmdXaW5kb3dUaW1lUmVzZXJ2b2lyKDEwLCBUaW1lVW5pdC5TRUNPTkRTLCAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgeworICAgICAgICAgICAgZmluYWwgaW50IHJlcXVlc3RUaW1lID0gaSAqIDEwMDAwOworICAgICAgICAgICAgYnVpbGRlci5hZGRSZXF1ZXN0KHJlcXVlc3RUaW1lICsgMSwgKGxvbmcpIGkpOworICAgICAgICAgICAgZm9yIChpbnQgaiA9IDExOyBqIDwgMTAwOyBqKyspIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBUaW1lV2luZG93U3RhdGlzdGljc0ltcGwgc3RhdCA9IGJ1aWxkZXIuYnVpbGQocmVxdWVzdFRpbWUgKyBqICogMTAwKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHN0YXQuZ2V0UmVxdWVzdENvdW50KCkpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaSwgc3RhdC5nZXRNaW5pbXVtRHVyYXRpb24oKSk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpLCBzdGF0LmdldE1heGltdW1EdXJhdGlvbigpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBBc3NlcnRpb25FcnJvciBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiaT0iICsgaSArICIsIGo9IiArIGosIGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVubGltaXRlZCgpIHsKKyAgICAgICAgZmluYWwgVGltZVdpbmRvd1N0YXRpc3RpY3NJbXBsLkJ1aWxkZXI8TG9uZz4gYnVpbGRlciA9IG5ldyBUaW1lV2luZG93U3RhdGlzdGljc0ltcGwuQnVpbGRlcjw+KAorICAgICAgICAgICAgICAgIG5ldyBVbmlmb3JtVGltZVJlc2Vydm9pcigwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKworICAgICAgICBjaGVjayhidWlsZGVyLCAwLCAwLCAwLCAwLCAwLCAwKTsKKyAgICAgICAgY2hlY2soYnVpbGRlciwgMTAwMDAsIDAsIDAsIDAsIDAsIDApOworCisgICAgICAgIGJ1aWxkZXIuYWRkUmVxdWVzdCgwLCAxMEwpOworCisgICAgICAgIGNoZWNrKGJ1aWxkZXIsIDUwLCAxLCAxMCwgMTAsIDEwLCAyMC4wKTsKKworICAgICAgICBidWlsZGVyLmFkZFJlcXVlc3QoMTAwICsgMzAwLCAyMEwpOworICAgICAgICBidWlsZGVyLmFkZFJlcXVlc3QoMTAwMCArIDYwMCwgMzBMKTsKKyAgICAgICAgYnVpbGRlci5hZGRSZXF1ZXN0KDE1ODcgKyA4MDAsIDQwTCk7CisgICAgICAgIGJ1aWxkZXIuYWRkUmVxdWVzdCg1NTQ0ICsgOTk5LCA2MEwpOworICAgICAgICBidWlsZGVyLmFkZFJlcXVlc3QoOTk5OCArIDEwMDAsIDUwTCk7CisKKyAgICAgICAgY2hlY2soYnVpbGRlciwgMTAwMDAsIDYsIDEwLCA2MCwgMzUsIDAuNik7CisgICAgfQorCit9CisKKworCmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9wcm9jZXNzL1Byb3h5SW5qZWN0YWJsZXNUZXN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9wcm9jZXNzL1Byb3h5SW5qZWN0YWJsZXNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMzZWNiOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3Byb2Nlc3MvUHJveHlJbmplY3RhYmxlc1Rlc3QuamF2YQpAQCAtMCwwICsxLDI3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwucHJvY2VzczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CisKK2ltcG9ydCBqYXZheC53cy5ycy5CZWFuUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVxdWVzdDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlNlY3VyaXR5Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXF1ZXN0Q29udGV4dEJ1aWxkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLmluamVjdC5BYnN0cmFjdFRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLnJvdXRpbmcuVXJpUm91dGluZ0NvbnRleHQ7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzOworCisvKioKKyAqIFRlc3QgaWYgcmVxdWVzdCBzY29wZWQgaW5qZWN0aW9uIHBvaW50cyBhcmUgaW5qZWN0ZWQgd2l0aG91dCB1c2luZworICogZHluYW1pYyBwcm94aWVzLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBQcm94eUluamVjdGFibGVzVGVzdCBleHRlbmRzIEFic3RyYWN0VGVzdCB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENsYXNzPFJlcXVlc3RDb250ZXh0QnVpbGRlci5UZXN0Q29udGFpbmVyUmVxdWVzdD4gUkVRVUVTVF9DTEFTUyA9IFJlcXVlc3RDb250ZXh0QnVpbGRlcgorICAgICAgICAgICAgLlRlc3RDb250YWluZXJSZXF1ZXN0LmNsYXNzOworCisgICAgcHJpdmF0ZSBDb250YWluZXJSZXNwb25zZSByZXNvdXJjZShTdHJpbmcgdXJpKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKHVyaSwgIkdFVCIpLmJ1aWxkKCkpOworICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2VjdXJpdHlDb250ZXh0RmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LnNldFNlY3VyaXR5Q29udGV4dChuZXcgTXlTZWN1cml0eUNvbnRleHQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNeVNlY3VyaXR5Q29udGV4dCBpbXBsZW1lbnRzIFNlY3VyaXR5Q29udGV4dCB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBQcmluY2lwYWwgZ2V0VXNlclByaW5jaXBhbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUHJpbmNpcGFsKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJhIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzVXNlckluUm9sZShTdHJpbmcgcm9sZSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTZWN1cmUoKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRBdXRoZW50aWNhdGlvblNjaGVtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAiQkFTSUMiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGVyUmVxdWVzdENvbnRleHRJbmplY3RlZFJlc291cmNlIHsKKworICAgICAgICBAQ29udGV4dAorICAgICAgICBVcmlJbmZvIHVpOworCisgICAgICAgIEBDb250ZXh0CisgICAgICAgIEh0dHBIZWFkZXJzIGhzOworCisgICAgICAgIEBDb250ZXh0CisgICAgICAgIFJlcXVlc3QgcjsKKworICAgICAgICBAQ29udGV4dAorICAgICAgICBTZWN1cml0eUNvbnRleHQgc2M7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhVcmlSb3V0aW5nQ29udGV4dC5jbGFzcywgdWkuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoUkVRVUVTVF9DTEFTUywgaHMuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoUkVRVUVTVF9DTEFTUywgci5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhTZWN1cml0eUNvbnRleHRJbmplY3RlZS5jbGFzcywgc2MuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCBzYy5nZXRVc2VyUHJpbmNpcGFsKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiR0VUIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBAU2luZ2xldG9uCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTaW5nbGV0b25JbmplY3RlZFJlc291cmNlIHsKKworICAgICAgICBASW5qZWN0CisgICAgICAgIFVyaUluZm8gdWk7CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBIdHRwSGVhZGVycyBoczsKKworICAgICAgICBASW5qZWN0CisgICAgICAgIFJlcXVlc3QgcjsKKworICAgICAgICBASW5qZWN0CisgICAgICAgIFNlY3VyaXR5Q29udGV4dCBzYzsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgYXNzZXJ0Tm90RXF1YWxzKFVyaVJvdXRpbmdDb250ZXh0LmNsYXNzLCB1aS5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIGFzc2VydE5vdEVxdWFscyhSRVFVRVNUX0NMQVNTLCBocy5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIGFzc2VydE5vdEVxdWFscyhSRVFVRVNUX0NMQVNTLCByLmdldENsYXNzKCkpOworICAgICAgICAgICAgYXNzZXJ0Tm90RXF1YWxzKE15U2VjdXJpdHlDb250ZXh0LmNsYXNzLCBzYy5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiYSIsIHNjLmdldFVzZXJQcmluY2lwYWwoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgcmV0dXJuICJHRVQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGVyUmVxdWVzdENvbnRleHRNZXRob2RQYXJhbWV0ZXJSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgKKyAgICAgICAgICAgICAgICBAQ29udGV4dCBVcmlJbmZvIHVpLAorICAgICAgICAgICAgICAgIEBDb250ZXh0IEh0dHBIZWFkZXJzIGhzLAorICAgICAgICAgICAgICAgIEBDb250ZXh0IFJlcXVlc3QgciwKKyAgICAgICAgICAgICAgICBAQ29udGV4dCBTZWN1cml0eUNvbnRleHQgc2MpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhVcmlSb3V0aW5nQ29udGV4dC5jbGFzcywgdWkuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoUkVRVUVTVF9DTEFTUywgaHMuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoUkVRVUVTVF9DTEFTUywgci5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhTZWN1cml0eUNvbnRleHRJbmplY3RlZS5jbGFzcywgc2MuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCBzYy5nZXRVc2VyUHJpbmNpcGFsKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiR0VUIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBAU2luZ2xldG9uCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTaW5nbGV0b25Db250ZXh0TWV0aG9kUGFyYW1ldGVyUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoCisgICAgICAgICAgICAgICAgQENvbnRleHQgVXJpSW5mbyB1aSwKKyAgICAgICAgICAgICAgICBAQ29udGV4dCBIdHRwSGVhZGVycyBocywKKyAgICAgICAgICAgICAgICBAQ29udGV4dCBSZXF1ZXN0IHIsCisgICAgICAgICAgICAgICAgQENvbnRleHQgU2VjdXJpdHlDb250ZXh0IHNjKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoVXJpUm91dGluZ0NvbnRleHQuY2xhc3MsIHVpLmdldENsYXNzKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFJFUVVFU1RfQ0xBU1MsIGhzLmdldENsYXNzKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFJFUVVFU1RfQ0xBU1MsIHIuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoU2VjdXJpdHlDb250ZXh0SW5qZWN0ZWUuY2xhc3MsIHNjLmdldENsYXNzKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgc2MuZ2V0VXNlclByaW5jaXBhbCgpLmdldE5hbWUoKSk7CisgICAgICAgICAgICByZXR1cm4gIkdFVCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQZXJSZXF1ZXN0Q29udGV4dEluamVjdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUGVyUmVxdWVzdENvbnRleHRJbmplY3RlZFJlc291cmNlLmNsYXNzLCBTZWN1cml0eUNvbnRleHRGaWx0ZXIuY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscygiR0VUIiwgcmVzb3VyY2UoIi8iKS5nZXRFbnRpdHkoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGVyUmVxdWVzdEluamVjdEluamVjdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oU2luZ2xldG9uSW5qZWN0ZWRSZXNvdXJjZS5jbGFzcywgU2VjdXJpdHlDb250ZXh0RmlsdGVyLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCIsIHJlc291cmNlKCIvIikuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBlclJlcXVlc3RNZXRob2RQYXJhbWV0ZXJJbmplY3RlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFBlclJlcXVlc3RDb250ZXh0TWV0aG9kUGFyYW1ldGVyUmVzb3VyY2UuY2xhc3MsIFNlY3VyaXR5Q29udGV4dEZpbHRlci5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJHRVQiLCByZXNvdXJjZSgiLyIpLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGV0b25QYXJhbWV0ZXJJbmplY3RlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFNpbmdsZXRvbkNvbnRleHRNZXRob2RQYXJhbWV0ZXJSZXNvdXJjZS5jbGFzcywgU2VjdXJpdHlDb250ZXh0RmlsdGVyLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCIsIHJlc291cmNlKCIvIikuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnQgb2YgSkVSU0VZLTIzODYgcmVwcm9kdWNlci4gVGhlIHJlcXVlc3QgZmllbGQKKyAgICAgKiBzaG91bGQgbm90IGdldCBpbmplY3RlZCBhcyBhIGR5bmFtaWMgcHJveHkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUZpZWxkSW5qZWN0ZWRCZWFuIHsKKworICAgICAgICBAQ29udGV4dAorICAgICAgICBSZXF1ZXN0IHJlcXVlc3Q7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGFydCBvZiBKRVJTRVktMjM4NiByZXByb2R1Y2VyLiBUaGUgcmVxdWVzdCBmaWVsZAorICAgICAqIHNob3VsZCBub3QgZ2V0IGluamVjdGVkIGFzIGEgZHluYW1pYyBwcm94eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15Q3RvckluamVjdGVkQmVhbiB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgc2hvdWxkIGdldCBkaXJlY3RseSBpbmplY3RlZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBNeUN0b3JJbmplY3RlZEJlYW4oQENvbnRleHQgUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OworICAgICAgICB9CisKKyAgICAgICAgUmVxdWVzdCByZXF1ZXN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEpFUlNFWS0yMzg2IHJlcHJvZHVjZXIuIEJlYW4gcGFyYW1ldGVyIGJlbG93IG11c3QKKyAgICAgKiBnZXQgaW5qZWN0ZWQgZGlyZWN0bHkgYXMgd2VsbCBhcyBpdHMgaW50ZXJuYWwgZmllbGQuCisgICAgICovCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQmVhblBhcmFtSW5qZWN0aW9uUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImZpZWxkIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRWaWFGaWVsZChAQmVhblBhcmFtIE15RmllbGRJbmplY3RlZEJlYW4gYmVhbikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKE15RmllbGRJbmplY3RlZEJlYW4uY2xhc3MsIGJlYW4uZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoUkVRVUVTVF9DTEFTUywgYmVhbi5yZXF1ZXN0LmdldENsYXNzKCkpOworICAgICAgICAgICAgcmV0dXJuICJmaWVsZCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJjdG9yIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRWaWFDdG9yKEBCZWFuUGFyYW0gTXlDdG9ySW5qZWN0ZWRCZWFuIGJlYW4pIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhNeUN0b3JJbmplY3RlZEJlYW4uY2xhc3MsIGJlYW4uZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoUkVRVUVTVF9DTEFTUywgYmVhbi5yZXF1ZXN0LmdldENsYXNzKCkpOworICAgICAgICAgICAgcmV0dXJuICJjdG9yIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEpFUlNFWS0yMzg2IHJlcHJvZHVjZXIuIE1ha2Ugc3VyZSBubyBkeW5hbWljIHByb3h5IGdldHMgaW52b2x2ZWQKKyAgICAgKiB3aGVuIGluamVjdGluZyBpbnRvIGEgYmVhbiBwYXJhbWV0ZXIuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmVhblBhcmFtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oQmVhblBhcmFtSW5qZWN0aW9uUmVzb3VyY2UuY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscygiZmllbGQiLCByZXNvdXJjZSgiL2ZpZWxkIikuZ2V0RW50aXR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImN0b3IiLCByZXNvdXJjZSgiL2N0b3IiKS5nZXRFbnRpdHkoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvcm91dGluZy9Db21iaW5lZE1lZGlhVHlwZVRlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3JvdXRpbmcvQ29tYmluZWRNZWRpYVR5cGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjczZmRlZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3JvdXRpbmcvQ29tYmluZWRNZWRpYVR5cGVUZXN0LmphdmEKQEAgLTAsMCArMSwxNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLnJvdXRpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5sZXNzVGhhbjsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIENvbWJpbmVkIG1lZGlhIHR5cGUgdGVzdHMuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhaworICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIENvbWJpbmVkTWVkaWFUeXBlVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGUoKSB7CisgICAgICAgIGNoZWNrQ29tYmluYXRpb24oInRleHQvaHRtbDtxPTEiLCAidGV4dC9odG1sO3FzPTEiLCAidGV4dCIsICJodG1sIiwgMTAwMCwgMTAwMCwgMCk7CisgICAgICAgIGNoZWNrQ29tYmluYXRpb24oInRleHQvKjtxPTAuNSIsICJ0ZXh0L2h0bWw7cXM9MC44IiwgInRleHQiLCAiaHRtbCIsIDUwMCwgODAwLCAxKTsKKyAgICAgICAgY2hlY2tDb21iaW5hdGlvbigiKi8qO3E9MC4yIiwgInRleHQvKjtxcz0wLjgiLCAidGV4dCIsICIqIiwgMjAwLCA4MDAsIDEpOworICAgICAgICBjaGVja0NvbWJpbmF0aW9uKCJ0ZXh0L2h0bWw7cT0wLjIiLCAiKi8qO3FzPTAuOCIsICJ0ZXh0IiwgImh0bWwiLCAyMDAsIDgwMCwgMik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tYmluZWRNZWRpYVR5cGVDb21wYXJhdG9yKCkgeworICAgICAgICBmaW5hbCBDb21wYXJhdG9yPENvbWJpbmVkTWVkaWFUeXBlPiBjb21wYXJhdG9yID0gQ29tYmluZWRNZWRpYVR5cGUuQ09NUEFSQVRPUjsKKworICAgICAgICBDb21iaW5lZE1lZGlhVHlwZSBjMTsKKyAgICAgICAgQ29tYmluZWRNZWRpYVR5cGUgYzI7CisKKyAgICAgICAgYzEgPSBDb21iaW5lZE1lZGlhVHlwZS5jcmVhdGUoCisgICAgICAgICAgICAgICAgTWVkaWFUeXBlLnZhbHVlT2YoInRleHQvaHRtbCIpLCBuZXcgQ29tYmluZWRNZWRpYVR5cGUuRWZmZWN0aXZlTWVkaWFUeXBlKCJ0ZXh0L2h0bWwiKSk7CisgICAgICAgIGMyID0gQ29tYmluZWRNZWRpYVR5cGUuY3JlYXRlKAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZS52YWx1ZU9mKCJ0ZXh0L2h0bWwiKSwgbmV3IENvbWJpbmVkTWVkaWFUeXBlLkVmZmVjdGl2ZU1lZGlhVHlwZSgidGV4dC9odG1sIikpOworICAgICAgICBhc3NlcnRUaGF0KGNvbXBhcmF0b3IuY29tcGFyZShjMSwgYzIpLCBlcXVhbFRvKDApKTsKKworICAgICAgICBjMSA9IENvbWJpbmVkTWVkaWFUeXBlLmNyZWF0ZSgKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUudmFsdWVPZigidGV4dC9odG1sIiksIG5ldyBDb21iaW5lZE1lZGlhVHlwZS5FZmZlY3RpdmVNZWRpYVR5cGUoInRleHQvaHRtbDtxcz0wLjciKSk7CisgICAgICAgIGMyID0gQ29tYmluZWRNZWRpYVR5cGUuY3JlYXRlKAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZS52YWx1ZU9mKCJhcHBsaWNhdGlvbi94bWwiKSwgbmV3IENvbWJpbmVkTWVkaWFUeXBlLkVmZmVjdGl2ZU1lZGlhVHlwZSgiYXBwbGljYXRpb24veG1sO3FzPTAuNyIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjb21wYXJhdG9yLmNvbXBhcmUoYzEsIGMyKSwgZXF1YWxUbygwKSk7CisKKyAgICAgICAgYzEgPSBDb21iaW5lZE1lZGlhVHlwZS5jcmVhdGUoCisgICAgICAgICAgICAgICAgTWVkaWFUeXBlLnZhbHVlT2YoInRleHQvaHRtbDtxPTAuNSIpLCBuZXcgQ29tYmluZWRNZWRpYVR5cGUuRWZmZWN0aXZlTWVkaWFUeXBlKCJ0ZXh0L2h0bWwiKSk7CisgICAgICAgIGMyID0gQ29tYmluZWRNZWRpYVR5cGUuY3JlYXRlKAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZS52YWx1ZU9mKCJhcHBsaWNhdGlvbi94bWw7cT0wLjUiKSwgbmV3IENvbWJpbmVkTWVkaWFUeXBlLkVmZmVjdGl2ZU1lZGlhVHlwZSgiYXBwbGljYXRpb24veG1sIikpOworICAgICAgICBhc3NlcnRUaGF0KGNvbXBhcmF0b3IuY29tcGFyZShjMSwgYzIpLCBlcXVhbFRvKDApKTsKKworICAgICAgICAvLyBsb3dlciBtZWFucyBiZXR0ZXIsIGhpZ2hlciBtZWFucyB3b3JzZS4uLgorCisgICAgICAgIGMxID0gQ29tYmluZWRNZWRpYVR5cGUuY3JlYXRlKAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZS52YWx1ZU9mKCJ0ZXh0L2h0bWwiKSwgbmV3IENvbWJpbmVkTWVkaWFUeXBlLkVmZmVjdGl2ZU1lZGlhVHlwZSgidGV4dC9odG1sIikpOworICAgICAgICBjMiA9IENvbWJpbmVkTWVkaWFUeXBlLmNyZWF0ZSgKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUudmFsdWVPZigidGV4dC8qIiksIG5ldyBDb21iaW5lZE1lZGlhVHlwZS5FZmZlY3RpdmVNZWRpYVR5cGUoInRleHQvaHRtbCIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjb21wYXJhdG9yLmNvbXBhcmUoYzEsIGMyKSwgbGVzc1RoYW4oMCkpOworCisgICAgICAgIGMxID0gQ29tYmluZWRNZWRpYVR5cGUuY3JlYXRlKAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZS52YWx1ZU9mKCJ0ZXh0LyoiKSwgbmV3IENvbWJpbmVkTWVkaWFUeXBlLkVmZmVjdGl2ZU1lZGlhVHlwZSgidGV4dC9odG1sIikpOworICAgICAgICBjMiA9IENvbWJpbmVkTWVkaWFUeXBlLmNyZWF0ZSgKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUudmFsdWVPZigiKi8qIiksIG5ldyBDb21iaW5lZE1lZGlhVHlwZS5FZmZlY3RpdmVNZWRpYVR5cGUoInRleHQvaHRtbCIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjb21wYXJhdG9yLmNvbXBhcmUoYzEsIGMyKSwgbGVzc1RoYW4oMCkpOworCisgICAgICAgIGMxID0gQ29tYmluZWRNZWRpYVR5cGUuY3JlYXRlKAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZS52YWx1ZU9mKCJ0ZXh0L2h0bWwiKSwgbmV3IENvbWJpbmVkTWVkaWFUeXBlLkVmZmVjdGl2ZU1lZGlhVHlwZSgidGV4dC9odG1sIikpOworICAgICAgICBjMiA9IENvbWJpbmVkTWVkaWFUeXBlLmNyZWF0ZSgKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUudmFsdWVPZigidGV4dC8qIiksIG5ldyBDb21iaW5lZE1lZGlhVHlwZS5FZmZlY3RpdmVNZWRpYVR5cGUoInRleHQvKiIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjb21wYXJhdG9yLmNvbXBhcmUoYzEsIGMyKSwgbGVzc1RoYW4oMCkpOworCisgICAgICAgIGMxID0gQ29tYmluZWRNZWRpYVR5cGUuY3JlYXRlKAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZS52YWx1ZU9mKCJ0ZXh0L2h0bWwiKSwgbmV3IENvbWJpbmVkTWVkaWFUeXBlLkVmZmVjdGl2ZU1lZGlhVHlwZSgidGV4dC9odG1sO3FzPTAuNSIpKTsKKyAgICAgICAgYzIgPSBDb21iaW5lZE1lZGlhVHlwZS5jcmVhdGUoCisgICAgICAgICAgICAgICAgTWVkaWFUeXBlLnZhbHVlT2YoInRleHQvKiIpLCBuZXcgQ29tYmluZWRNZWRpYVR5cGUuRWZmZWN0aXZlTWVkaWFUeXBlKCJ0ZXh0LyoiKSk7CisgICAgICAgIGFzc2VydFRoYXQoY29tcGFyYXRvci5jb21wYXJlKGMxLCBjMiksIGxlc3NUaGFuKDApKTsKKworICAgICAgICBjMSA9IENvbWJpbmVkTWVkaWFUeXBlLmNyZWF0ZSgKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUudmFsdWVPZigidGV4dC9odG1sO3E9MC41IiksIG5ldyBDb21iaW5lZE1lZGlhVHlwZS5FZmZlY3RpdmVNZWRpYVR5cGUoInRleHQvaHRtbCIpKTsKKyAgICAgICAgYzIgPSBDb21iaW5lZE1lZGlhVHlwZS5jcmVhdGUoCisgICAgICAgICAgICAgICAgTWVkaWFUeXBlLnZhbHVlT2YoInRleHQvKiIpLCBuZXcgQ29tYmluZWRNZWRpYVR5cGUuRWZmZWN0aXZlTWVkaWFUeXBlKCJ0ZXh0LyoiKSk7CisgICAgICAgIGFzc2VydFRoYXQoY29tcGFyYXRvci5jb21wYXJlKGMxLCBjMiksIGxlc3NUaGFuKDApKTsKKworICAgICAgICBjMSA9IENvbWJpbmVkTWVkaWFUeXBlLmNyZWF0ZSgKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUudmFsdWVPZigidGV4dC9odG1sIiksIG5ldyBDb21iaW5lZE1lZGlhVHlwZS5FZmZlY3RpdmVNZWRpYVR5cGUoInRleHQvaHRtbDtxcz0wLjgiKSk7CisgICAgICAgIGMyID0gQ29tYmluZWRNZWRpYVR5cGUuY3JlYXRlKAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZS52YWx1ZU9mKCJhcHBsaWNhdGlvbi94bWwiKSwgbmV3IENvbWJpbmVkTWVkaWFUeXBlLkVmZmVjdGl2ZU1lZGlhVHlwZSgiYXBwbGljYXRpb24veG1sO3FzPTAuNyIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjb21wYXJhdG9yLmNvbXBhcmUoYzEsIGMyKSwgbGVzc1RoYW4oMCkpOworCisgICAgICAgIGMxID0gQ29tYmluZWRNZWRpYVR5cGUuY3JlYXRlKAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZS52YWx1ZU9mKCJ0ZXh0L2h0bWw7cT0wLjgiKSwgbmV3IENvbWJpbmVkTWVkaWFUeXBlLkVmZmVjdGl2ZU1lZGlhVHlwZSgidGV4dC9odG1sIikpOworICAgICAgICBjMiA9IENvbWJpbmVkTWVkaWFUeXBlLmNyZWF0ZSgKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUudmFsdWVPZigiYXBwbGljYXRpb24veG1sO3E9MC43IiksIG5ldyBDb21iaW5lZE1lZGlhVHlwZS5FZmZlY3RpdmVNZWRpYVR5cGUoImFwcGxpY2F0aW9uL3htbCIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjb21wYXJhdG9yLmNvbXBhcmUoYzEsIGMyKSwgbGVzc1RoYW4oMCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbWJpbmVkTWVkaWFUeXBlc1NvcnRpbmcoKSB7CisgICAgICAgIGZpbmFsIExpc3Q8Q29tYmluZWRNZWRpYVR5cGU+IHNvcnRlZCA9IEFycmF5cy5hc0xpc3QoCisgICAgICAgICAgICAgICAgQ29tYmluZWRNZWRpYVR5cGUuY3JlYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlLnZhbHVlT2YoInRleHQvaHRtbCIpLCBuZXcgQ29tYmluZWRNZWRpYVR5cGUuRWZmZWN0aXZlTWVkaWFUeXBlKCJ0ZXh0L2h0bWwiKSksCisgICAgICAgICAgICAgICAgQ29tYmluZWRNZWRpYVR5cGUuY3JlYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlLnZhbHVlT2YoInRleHQvKiIpLCBuZXcgQ29tYmluZWRNZWRpYVR5cGUuRWZmZWN0aXZlTWVkaWFUeXBlKCJ0ZXh0L2h0bWwiKSksCisgICAgICAgICAgICAgICAgQ29tYmluZWRNZWRpYVR5cGUuY3JlYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlLnZhbHVlT2YoIiovKiIpLCBuZXcgQ29tYmluZWRNZWRpYVR5cGUuRWZmZWN0aXZlTWVkaWFUeXBlKCJ0ZXh0L2h0bWwiKSksCisgICAgICAgICAgICAgICAgQ29tYmluZWRNZWRpYVR5cGUuY3JlYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlLnZhbHVlT2YoInRleHQvaHRtbCIpLCBuZXcgQ29tYmluZWRNZWRpYVR5cGUuRWZmZWN0aXZlTWVkaWFUeXBlKCJ0ZXh0L2h0bWw7cXM9MC41IikpLAorICAgICAgICAgICAgICAgIENvbWJpbmVkTWVkaWFUeXBlLmNyZWF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZS52YWx1ZU9mKCJ0ZXh0LyoiKSwgbmV3IENvbWJpbmVkTWVkaWFUeXBlLkVmZmVjdGl2ZU1lZGlhVHlwZSgidGV4dC9odG1sO3FzPTAuNSIpKSwKKyAgICAgICAgICAgICAgICBDb21iaW5lZE1lZGlhVHlwZS5jcmVhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUudmFsdWVPZigiKi8qIiksIG5ldyBDb21iaW5lZE1lZGlhVHlwZS5FZmZlY3RpdmVNZWRpYVR5cGUoInRleHQvaHRtbDtxcz0wLjUiKSksCisgICAgICAgICAgICAgICAgQ29tYmluZWRNZWRpYVR5cGUuY3JlYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlLnZhbHVlT2YoInRleHQvaHRtbDtxPTAuNSIpLCBuZXcgQ29tYmluZWRNZWRpYVR5cGUuRWZmZWN0aXZlTWVkaWFUeXBlKCJ0ZXh0L2h0bWwiKSksCisgICAgICAgICAgICAgICAgQ29tYmluZWRNZWRpYVR5cGUuY3JlYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlLnZhbHVlT2YoInRleHQvKjtxPTAuNSIpLCBuZXcgQ29tYmluZWRNZWRpYVR5cGUuRWZmZWN0aXZlTWVkaWFUeXBlKCJ0ZXh0L2h0bWwiKSksCisgICAgICAgICAgICAgICAgQ29tYmluZWRNZWRpYVR5cGUuY3JlYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlLnZhbHVlT2YoIiovKjtxPTAuNSIpLCBuZXcgQ29tYmluZWRNZWRpYVR5cGUuRWZmZWN0aXZlTWVkaWFUeXBlKCJ0ZXh0L2h0bWwiKSksCisgICAgICAgICAgICAgICAgQ29tYmluZWRNZWRpYVR5cGUuY3JlYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlLnZhbHVlT2YoInRleHQvKiIpLCBuZXcgQ29tYmluZWRNZWRpYVR5cGUuRWZmZWN0aXZlTWVkaWFUeXBlKCJ0ZXh0LyoiKSksCisgICAgICAgICAgICAgICAgQ29tYmluZWRNZWRpYVR5cGUuY3JlYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlLnZhbHVlT2YoIiovKiIpLCBuZXcgQ29tYmluZWRNZWRpYVR5cGUuRWZmZWN0aXZlTWVkaWFUeXBlKCJ0ZXh0LyoiKSksCisgICAgICAgICAgICAgICAgQ29tYmluZWRNZWRpYVR5cGUuY3JlYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlLnZhbHVlT2YoInRleHQvKiIpLCBuZXcgQ29tYmluZWRNZWRpYVR5cGUuRWZmZWN0aXZlTWVkaWFUeXBlKCJ0ZXh0Lyo7cXM9MC41IikpLAorICAgICAgICAgICAgICAgIENvbWJpbmVkTWVkaWFUeXBlLmNyZWF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZS52YWx1ZU9mKCIqLyoiKSwgbmV3IENvbWJpbmVkTWVkaWFUeXBlLkVmZmVjdGl2ZU1lZGlhVHlwZSgidGV4dC8qO3FzPTAuNSIpKSwKKyAgICAgICAgICAgICAgICBDb21iaW5lZE1lZGlhVHlwZS5jcmVhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUudmFsdWVPZigidGV4dC8qO3E9MC41IiksIG5ldyBDb21iaW5lZE1lZGlhVHlwZS5FZmZlY3RpdmVNZWRpYVR5cGUoInRleHQvKiIpKSwKKyAgICAgICAgICAgICAgICBDb21iaW5lZE1lZGlhVHlwZS5jcmVhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUudmFsdWVPZigiKi8qO3E9MC41IiksIG5ldyBDb21iaW5lZE1lZGlhVHlwZS5FZmZlY3RpdmVNZWRpYVR5cGUoInRleHQvKiIpKSwKKyAgICAgICAgICAgICAgICBDb21iaW5lZE1lZGlhVHlwZS5jcmVhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUudmFsdWVPZigiKi8qIiksIG5ldyBDb21iaW5lZE1lZGlhVHlwZS5FZmZlY3RpdmVNZWRpYVR5cGUoIiovKiIpKSwKKyAgICAgICAgICAgICAgICBDb21iaW5lZE1lZGlhVHlwZS5jcmVhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUudmFsdWVPZigiKi8qIiksIG5ldyBDb21iaW5lZE1lZGlhVHlwZS5FZmZlY3RpdmVNZWRpYVR5cGUoIiovKjtxcz0wLjUiKSksCisgICAgICAgICAgICAgICAgQ29tYmluZWRNZWRpYVR5cGUuY3JlYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlLnZhbHVlT2YoIiovKjtxPTAuNSIpLCBuZXcgQ29tYmluZWRNZWRpYVR5cGUuRWZmZWN0aXZlTWVkaWFUeXBlKCIqLyoiKSkKKyAgICAgICAgKTsKKworICAgICAgICBMaXN0PENvbWJpbmVkTWVkaWFUeXBlPiB1bnNvcnRlZCA9IG5ldyBBcnJheUxpc3Q8Pihzb3J0ZWQpOworICAgICAgICBDb2xsZWN0aW9ucy5zaHVmZmxlKHVuc29ydGVkKTsKKyAgICAgICAgQ29sbGVjdGlvbnMuc29ydCh1bnNvcnRlZCwgQ29tYmluZWRNZWRpYVR5cGUuQ09NUEFSQVRPUik7CisKKyAgICAgICAgYXNzZXJ0VGhhdCgiQ29tYmluZWQgbWVkaWEgdHlwZSBzb3J0aW5nIGhhcyBmYWlsZWQuIiwgdW5zb3J0ZWQsIGVxdWFsVG8oc29ydGVkKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0NvbWJpbmF0aW9uKGZpbmFsIFN0cmluZyBjbGllbnRUeXBlLCBmaW5hbCBTdHJpbmcgc2VydmVyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHR5cGUsIGZpbmFsIFN0cmluZyBzdWJ0eXBlLCBmaW5hbCBpbnQgcSwgZmluYWwgaW50IHFzLCBmaW5hbCBpbnQgZCkgeworCisgICAgICAgIGZpbmFsIENvbWJpbmVkTWVkaWFUeXBlIGNvbWJpbmVkVHlwZSA9IENvbWJpbmVkTWVkaWFUeXBlLmNyZWF0ZSgKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUudmFsdWVPZihjbGllbnRUeXBlKSwKKyAgICAgICAgICAgICAgICBuZXcgQ29tYmluZWRNZWRpYVR5cGUuRWZmZWN0aXZlTWVkaWFUeXBlKHNlcnZlclR5cGUpKTsKKworICAgICAgICBhc3NlcnRUaGF0KCJVbmV4cGVjdGVkIHZhbHVlIG9mIHF1YWxpdHkgcGFyYW1ldGVyLiIsIGNvbWJpbmVkVHlwZS5xLCBlcXVhbFRvKHEpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgiVW5leHBlY3RlZCB2YWx1ZSBvZiBxdWFsaXR5IHNvdXJjZSBwYXJhbWV0ZXIuIiwgY29tYmluZWRUeXBlLnFzLCBlcXVhbFRvKHFzKSk7CisgICAgICAgIGFzc2VydFRoYXQoIlVuZXhwZWN0ZWQgdmFsdWUgb2YgZGlzdGFuY2UgcGFyYW1ldGVyLiIsIGNvbWJpbmVkVHlwZS5kLCBlcXVhbFRvKGQpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgiVW5leHBlY3RlZCB2YWx1ZSBvZiBjb21iaW5lZCBtZWRpYSB0eXBlIG1haW4gdHlwZS4iLCBjb21iaW5lZFR5cGUuY29tYmluZWRUeXBlLmdldFR5cGUoKSwgZXF1YWxUbyh0eXBlKSk7CisgICAgICAgIGFzc2VydFRoYXQoIlVuZXhwZWN0ZWQgdmFsdWUgb2YgY29tYmluZWQgbWVkaWEgdHlwZSBzdWJ0eXBlLiIsIGNvbWJpbmVkVHlwZS5jb21iaW5lZFR5cGUuZ2V0U3VidHlwZSgpLCBlcXVhbFRvKHN1YnR5cGUpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9yb3V0aW5nL0V4dGVuZGVkVXJpSW5mb1Rlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3JvdXRpbmcvRXh0ZW5kZWRVcmlJbmZvVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMDY1YWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9yb3V0aW5nL0V4dGVuZGVkVXJpSW5mb1Rlc3QuamF2YQpAQCAtMCwwICsxLDIwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwucm91dGluZzsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5FeHRlbmRlZFVyaUluZm87CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlcXVlc3RDb250ZXh0QnVpbGRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SdW50aW1lUmVzb3VyY2U7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKKworLyoqCisgKiB7QGxpbmsgRXh0ZW5kZWRVcmlJbmZvfSB1bml0IHRlc3RzIC0gdGVzdGluZyBlLmcuIGdldHRpbmcgbWF0Y2hlZCByZXNvdXJjZXMsIG1hcHBlZCB0aHJvd2FibGUsIGV0Yy4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIEV4dGVuZGVkVXJpSW5mb1Rlc3QgeworCisgICAgcHJpdmF0ZSBBcHBsaWNhdGlvbkhhbmRsZXIgZ2V0QXBwbGljYXRpb24oKSB7CisgICAgICAgIHJldHVybiBuZXcgQXBwbGljYXRpb25IYW5kbGVyKG5ldyBSZXNvdXJjZUNvbmZpZyhTaW1wbGVSZXNvdXJjZS5jbGFzcywgUmVzb3VyY2VXaXRoTG9jYXRvci5jbGFzcykpOworICAgIH0KKworICAgIEBQYXRoKCJyb290IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNpbXBsZVJlc291cmNlIHsKKworICAgICAgICBASW5qZWN0CisgICAgICAgIHByaXZhdGUgRXh0ZW5kZWRVcmlJbmZvIGV4dGVuZGVkVXJpSW5mbzsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInJvb3QiLCBleHRlbmRlZFVyaUluZm8uZ2V0TWF0Y2hlZE1vZGVsUmVzb3VyY2UoKS5nZXRQYXRoKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUsIGV4dGVuZGVkVXJpSW5mby5nZXRNYXRjaGVkUmVzb3VyY2VNZXRob2QoKS5nZXRQcm9kdWNlZFR5cGVzKCkuZ2V0KDApKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiL3Jvb3QiLCBleHRlbmRlZFVyaUluZm8uZ2V0TWF0Y2hlZFJ1bnRpbWVSZXNvdXJjZXMoKS5nZXQoMCkuZ2V0UmVnZXgoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZXh0ZW5kZWRVcmlJbmZvLmdldE1hdGNoZWRSdW50aW1lUmVzb3VyY2VzKCkuc2l6ZSgpKTsKKworICAgICAgICAgICAgcmV0dXJuICJyb290IjsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJjaGlsZCIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBjaGlsZCgpIHsKKyAgICAgICAgICAgIGZpbmFsIFJlc291cmNlIHJlc291cmNlID0gZXh0ZW5kZWRVcmlJbmZvLmdldE1hdGNoZWRNb2RlbFJlc291cmNlKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImNoaWxkIiwgcmVzb3VyY2UuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8UnVudGltZVJlc291cmNlPiBydW50aW1lUmVzb3VyY2VzID0gZXh0ZW5kZWRVcmlJbmZvLmdldE1hdGNoZWRSdW50aW1lUmVzb3VyY2VzKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInJvb3QiLCByZXNvdXJjZS5nZXRQYXJlbnQoKS5nZXRQYXRoKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHJ1bnRpbWVSZXNvdXJjZXMuc2l6ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiL2NoaWxkOy9yb290IiwgY29udmVydFRvU3RyaW5nKHJ1bnRpbWVSZXNvdXJjZXMpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiL2NoaWxkIiwgcnVudGltZVJlc291cmNlcy5nZXQoMCkuZ2V0UmVnZXgoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIi9yb290IiwgcnVudGltZVJlc291cmNlcy5nZXQoMSkuZ2V0UmVnZXgoKSk7CisgICAgICAgICAgICByZXR1cm4gImNoaWxkIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlTWV0aG9kKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwbGljYXRpb25IYW5kbGVyID0gZ2V0QXBwbGljYXRpb24oKTsKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBhcHBsaWNhdGlvbkhhbmRsZXIuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9yb290IiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoInJvb3QiLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hpbGRSZXNvdXJjZU1ldGhvZCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQXBwbGljYXRpb25IYW5kbGVyIGFwcGxpY2F0aW9uSGFuZGxlciA9IGdldEFwcGxpY2F0aW9uKCk7CisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gYXBwbGljYXRpb25IYW5kbGVyLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvcm9vdC9jaGlsZCIsICJHRVQiKS5idWlsZCgpKQorICAgICAgICAgICAgICAgIC5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjaGlsZCIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAUGF0aCgibG9jYXRvci10ZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlV2l0aExvY2F0b3IgeworCisgICAgICAgIEBQYXRoKCIvIikKKyAgICAgICAgcHVibGljIENsYXNzPFN1YlJlc291cmNlTG9jYXRvcj4gZ2V0UmVzb3VyY2VMb2NhdG9yKCkgeworICAgICAgICAgICAgcmV0dXJuIFN1YlJlc291cmNlTG9jYXRvci5jbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJzdWJsb2NhdG9yIikKKyAgICAgICAgcHVibGljIENsYXNzPFN1YlJlc291cmNlTG9jYXRvcj4gZ2V0U3ViUmVzb3VyY2VMb2NhdG9yKCkgeworICAgICAgICAgICAgcmV0dXJuIFN1YlJlc291cmNlTG9jYXRvci5jbGFzczsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdWJSZXNvdXJjZUxvY2F0b3IgeworCisgICAgICAgIEBJbmplY3QKKyAgICAgICAgcHJpdmF0ZSBFeHRlbmRlZFVyaUluZm8gZXh0ZW5kZWRVcmlJbmZvOworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShleHRlbmRlZFVyaUluZm8uZ2V0TWF0Y2hlZE1vZGVsUmVzb3VyY2UoKS5nZXRQYXRoKCkgIT0gbnVsbCk7CisgICAgICAgICAgICBmaW5hbCBMaXN0PFJ1bnRpbWVSZXNvdXJjZT4gbWF0Y2hlZFJ1bnRpbWVSZXNvdXJjZXMgPSBleHRlbmRlZFVyaUluZm8uZ2V0TWF0Y2hlZFJ1bnRpbWVSZXNvdXJjZXMoKTsKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0VG9TdHJpbmcobWF0Y2hlZFJ1bnRpbWVSZXNvdXJjZXMpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgic3ViZ2V0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBzdWJHZXQoKSB7CisgICAgICAgICAgICBmaW5hbCBMaXN0PFJ1bnRpbWVSZXNvdXJjZT4gbWF0Y2hlZFJ1bnRpbWVSZXNvdXJjZXMgPSBleHRlbmRlZFVyaUluZm8uZ2V0TWF0Y2hlZFJ1bnRpbWVSZXNvdXJjZXMoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiL3N1YmdldCIsIG1hdGNoZWRSdW50aW1lUmVzb3VyY2VzLmdldCgwKS5nZXRSZWdleCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygic3ViZ2V0IiwgZXh0ZW5kZWRVcmlJbmZvLmdldE1hdGNoZWRNb2RlbFJlc291cmNlKCkuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgIHJldHVybiBjb252ZXJ0VG9TdHJpbmcobWF0Y2hlZFJ1bnRpbWVSZXNvdXJjZXMpOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInN1YiIpCisgICAgICAgIHB1YmxpYyBDbGFzczxTdWJSZXNvdXJjZUxvY2F0b3I+IGdldFJlY3Vyc2l2ZSgpIHsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8UnVudGltZVJlc291cmNlPiBtYXRjaGVkUnVudGltZVJlc291cmNlcyA9IGV4dGVuZGVkVXJpSW5mby5nZXRNYXRjaGVkUnVudGltZVJlc291cmNlcygpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIvc3ViIiwgbWF0Y2hlZFJ1bnRpbWVSZXNvdXJjZXMuZ2V0KDApLmdldFJlZ2V4KCkpOworICAgICAgICAgICAgYXNzZXJ0TnVsbChleHRlbmRlZFVyaUluZm8uZ2V0TWF0Y2hlZE1vZGVsUmVzb3VyY2UoKSk7CisgICAgICAgICAgICBhc3NlcnROdWxsKGV4dGVuZGVkVXJpSW5mby5nZXRNYXRjaGVkUmVzb3VyY2VNZXRob2QoKSk7CisgICAgICAgICAgICByZXR1cm4gU3ViUmVzb3VyY2VMb2NhdG9yLmNsYXNzOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNvbnZlcnRUb1N0cmluZyhmaW5hbCBMaXN0PFJ1bnRpbWVSZXNvdXJjZT4gbWF0Y2hlZFJlc291cmNlcykgeworICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgZm9yIChmaW5hbCBSdW50aW1lUmVzb3VyY2UgcmVzb3VyY2UgOiBtYXRjaGVkUmVzb3VyY2VzKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGF0aCA9IHJlc291cmNlLmdldFJlZ2V4KCk7CisgICAgICAgICAgICBzYi5hcHBlbmQocGF0aCA9PSBudWxsID8gIjxuby1wYXRoPiIgOiBwYXRoKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiOyIpOworICAgICAgICB9CisgICAgICAgIHNiLnNldExlbmd0aChzYi5sZW5ndGgoKSAtIDEpOworICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NhdG9yKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgcmVxdWVzdFVyaSA9ICIvbG9jYXRvci10ZXN0IjsKKyAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkUmVzb3VyY2VMaXN0ID0gIjxuby1wYXRoPjsvbG9jYXRvclxcLXRlc3QiOworCisgICAgICAgIF90ZXN0UmVzb3VyY2VMaXN0KHJlcXVlc3RVcmksIGV4cGVjdGVkUmVzb3VyY2VMaXN0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3RSZXNvdXJjZUxpc3QoZmluYWwgU3RyaW5nIHJlcXVlc3RVcmksIGZpbmFsIFN0cmluZyBleHBlY3RlZFJlc291cmNlTGlzdCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLAorICAgICAgICAgICAgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQXBwbGljYXRpb25IYW5kbGVyIGFwcGxpY2F0aW9uSGFuZGxlciA9IGdldEFwcGxpY2F0aW9uKCk7CisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gYXBwbGljYXRpb25IYW5kbGVyLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKHJlcXVlc3RVcmksICJHRVQiKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzb3VyY2VzID0gKFN0cmluZykgcmVzcG9uc2UuZ2V0RW50aXR5KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFJlc291cmNlTGlzdCwgcmVzb3VyY2VzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NhdG9yQ2hpbGQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0UmVzb3VyY2VMaXN0KCIvbG9jYXRvci10ZXN0L3N1YmdldCIsICIvc3ViZ2V0Ozxuby1wYXRoPjsvbG9jYXRvclxcLXRlc3QiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJSZXNvdXJjZUxvY2F0b3IoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0UmVzb3VyY2VMaXN0KCIvbG9jYXRvci10ZXN0L3N1YmxvY2F0b3IiLCAiPG5vLXBhdGg+Oy9zdWJsb2NhdG9yOy9sb2NhdG9yXFwtdGVzdCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN1YlJlc291cmNlTG9jYXRvclN1YkdldCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RSZXNvdXJjZUxpc3QoIi9sb2NhdG9yLXRlc3Qvc3VibG9jYXRvci9zdWJnZXQiLCAiL3N1YmdldDs8bm8tcGF0aD47L3N1YmxvY2F0b3I7L2xvY2F0b3JcXC10ZXN0Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3ViUmVzb3VyY2VMb2NhdG9yUmVjdXJzaXZlKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBfdGVzdFJlc291cmNlTGlzdCgiL2xvY2F0b3ItdGVzdC9zdWJsb2NhdG9yL3N1YiIsICI8bm8tcGF0aD47L3N1Yjs8bm8tcGF0aD47L3N1YmxvY2F0b3I7L2xvY2F0b3JcXC10ZXN0Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3ViUmVzb3VyY2VMb2NhdG9yUmVjdXJzaXZlMigpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RSZXNvdXJjZUxpc3QoIi9sb2NhdG9yLXRlc3Qvc3VibG9jYXRvci9zdWIvc3ViL3N1YmdldCIsCisgICAgICAgICAgICAgICAgIi9zdWJnZXQ7PG5vLXBhdGg+Oy9zdWI7PG5vLXBhdGg+Oy9zdWI7PG5vLXBhdGg+Oy9zdWJsb2NhdG9yOy9sb2NhdG9yXFwtdGVzdCIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3JvdXRpbmcvUmVzcG9uc2VNZWRpYVR5cGVGcm9tUHJvdmlkZXJzVGVzdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvcm91dGluZy9SZXNwb25zZU1lZGlhVHlwZUZyb21Qcm92aWRlcnNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ5ODJhYQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3JvdXRpbmcvUmVzcG9uc2VNZWRpYVR5cGVGcm9tUHJvdmlkZXJzVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLnJvdXRpbmc7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVzcG9uc2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlcXVlc3RDb250ZXh0QnVpbGRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNwb25zZU1lZGlhVHlwZUZyb21Qcm92aWRlcnNUZXN0IHsKKworICAgIEBQYXRoKCJyZXNvdXJjZS9zdWJyZXNvdXJjZS9zdWIiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQW5vdGhlclN1YlJlc291cmNlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBAQ29uc3VtZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgICAgIHB1YmxpYyBTdHJpbmcgc3ViKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyBzdWJzdWIoKSB7CisgICAgICAgICAgICByZXR1cm4gc3ViKCkgKyBzdWIoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gc3ViKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gc3Vic3ViKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygidGV4dC8qIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRUZXh0U3RhcigpIHsKKyAgICAgICAgICAgIHJldHVybiAidGV4dC8qIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBDb25zdW1lcygidGV4dC8qIikKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0VGV4dFN0YXIoKSB7CisgICAgICAgICAgICByZXR1cm4gInRleHQvKiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhBbm90aGVyU3ViUmVzb3VyY2UuY2xhc3MpOworICAgICAgICBmaW5hbCBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwbGljYXRpb25IYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihyZXNvdXJjZUNvbmZpZyk7CisKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBhcHBsaWNhdGlvbkhhbmRsZXIuYXBwbHkoCisgICAgICAgICAgICAgICAgUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9yZXNvdXJjZS9zdWJyZXNvdXJjZS9zdWIiLCAiUE9TVCIpLmhlYWRlcigiQWNjZXB0IiwgInRleHQvcGxhaW4iKS5idWlsZCgpKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiQ29udGVudC1UeXBlIiksIGVxdWFsVG8oInRleHQvcGxhaW4iKSk7CisgICAgICAgIGFzc2VydFRoYXQoKFN0cmluZykgcmVzcG9uc2UuZ2V0RW50aXR5KCksIGVxdWFsVG8oIkFub3RoZXJTdWJSZXNvdXJjZSIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9yb3V0aW5nL1N1YlJlc291cmNlTG9jYXRvckNhY2hpbmdUZXN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9yb3V0aW5nL1N1YlJlc291cmNlTG9jYXRvckNhY2hpbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI4ZTY1NAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3JvdXRpbmcvU3ViUmVzb3VyY2VMb2NhdG9yQ2FjaGluZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDI0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwucm91dGluZzsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuSW5mbGVjdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXF1ZXN0Q29udGV4dEJ1aWxkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5Nb2RlbFByb2Nlc3NvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTW9kZWw7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogVGVzdCB0aGF0IHN1Yi1yZXNvdXJjZSBsb2NhdG9ycyAobW9kZWxzIGFuZCByb3V0ZXJzKSBhcmUgYmVpbmcgY2FjaGVkLgorICogPHAvPgorICogVE9ETzogcHJveHkgKGNsYXNzKSB0ZXN0cworICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgU3ViUmVzb3VyY2VMb2NhdG9yQ2FjaGluZ1Rlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVk9DQVRJT05fQ09VTlQgPSAzOworCisgICAgQFBhdGgoInJvb3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUm9vdFJlc291cmNlIHsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZXNvdXJjZSBSRVNPVVJDRSA9IGNyZWF0ZVJlc291cmNlKCk7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2UoKSB7CisgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZS5CdWlsZGVyIGJ1aWxkZXIgPSBSZXNvdXJjZS5idWlsZGVyKCk7CisgICAgICAgICAgICBidWlsZGVyLmFkZE1ldGhvZCgiR0VUIikuaGFuZGxlZEJ5KG5ldyBJbmZsZWN0b3I8Q29udGFpbmVyUmVxdWVzdENvbnRleHQsIFJlc3BvbnNlPigpIHsKKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBSZXNwb25zZSBhcHBseShmaW5hbCBDb250YWluZXJSZXF1ZXN0Q29udGV4dCBjb250YWluZXJSZXF1ZXN0Q29udGV4dCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soInN1YiIpLmJ1aWxkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkuYnVpbGQoKTsKKyAgICAgICAgICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiY2xhc3MiKQorICAgICAgICBwdWJsaWMgQ2xhc3M8Pz4gbG9jYXRvckNsYXNzKCkgeworICAgICAgICAgICAgcmV0dXJuIFN1YlJlc291cmNlLmNsYXNzOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImNvbmNyZXRlLWNsYXNzIikKKyAgICAgICAgcHVibGljIENsYXNzPFN1YlJlc291cmNlPiBsb2NhdG9yQ29uY3JldGVDbGFzcygpIHsKKyAgICAgICAgICAgIHJldHVybiBTdWJSZXNvdXJjZS5jbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJpbnN0YW5jZSIpCisgICAgICAgIHB1YmxpYyBTdWJSZXNvdXJjZSBsb2NhdG9ySW5zdGFuY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN1YlJlc291cmNlKCJzdWIiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJyZXNvdXJjZS1mcm9tLWNsYXNzIikKKyAgICAgICAgcHVibGljIFJlc291cmNlIGxvY2F0b3JSZXNvdXJjZUZyb21DbGFzcygpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNvdXJjZS5mcm9tKFN1YlJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJyZXNvdXJjZS1zaW5nbGV0b24iKQorICAgICAgICBwdWJsaWMgUmVzb3VyY2UgbG9jYXRvclJlc291cmNlU2luZ2xldG9uKCkgeworICAgICAgICAgICAgcmV0dXJuIFJFU09VUkNFOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInJlc291cmNlIikKKyAgICAgICAgcHVibGljIFJlc291cmNlIGxvY2F0b3JSZXNvdXJjZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXNvdXJjZSgpOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoIm9iamVjdC1jbGFzcyIpCisgICAgICAgIHB1YmxpYyBPYmplY3QgbG9jYXRvck9iamVjdENsYXNzKCkgeworICAgICAgICAgICAgcmV0dXJuIFN1YlJlc291cmNlLmNsYXNzOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoIm9iamVjdC1pbnN0YW5jZSIpCisgICAgICAgIHB1YmxpYyBPYmplY3QgbG9jYXRvck9iamVjdEluc3RhbmNlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdWJSZXNvdXJjZSgic3ViIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN1YlJlc291cmNlIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtZXNzYWdlOworCisgICAgICAgIHB1YmxpYyBTdWJSZXNvdXJjZSgpIHsKKyAgICAgICAgICAgIHRoaXMoInN1YiIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN1YlJlc291cmNlKGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHN1YigpIHsKKyAgICAgICAgICAgIHJldHVybiBtZXNzYWdlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb3VudGluZ01vZGVsUHJvY2Vzc29yIGltcGxlbWVudHMgTW9kZWxQcm9jZXNzb3IgeworCisgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgaW50IHJlc291cmNlTWVodG9kQ2FsbHMgPSAwOworICAgICAgICBwcml2YXRlIHZvbGF0aWxlIGludCBzdWJyZXNvdXJjZU1laHRvZENhbGxzID0gMDsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc291cmNlTW9kZWwgcHJvY2Vzc1Jlc291cmNlTW9kZWwoZmluYWwgUmVzb3VyY2VNb2RlbCByZXNvdXJjZU1vZGVsLCBmaW5hbCBDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgICAgIHJlc291cmNlTWVodG9kQ2FsbHMrKzsKKyAgICAgICAgICAgIHJldHVybiByZXNvdXJjZU1vZGVsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNvdXJjZU1vZGVsIHByb2Nlc3NTdWJSZXNvdXJjZShmaW5hbCBSZXNvdXJjZU1vZGVsIHN1YlJlc291cmNlTW9kZWwsIGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgeworICAgICAgICAgICAgc3VicmVzb3VyY2VNZWh0b2RDYWxscysrOworICAgICAgICAgICAgcmV0dXJuIHN1YlJlc291cmNlTW9kZWw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIENvdW50aW5nTW9kZWxQcm9jZXNzb3IgcHJvY2Vzc29yOworICAgIHByaXZhdGUgUmVzb3VyY2VDb25maWcgY29uZmlnOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHByb2Nlc3NvciA9IG5ldyBDb3VudGluZ01vZGVsUHJvY2Vzc29yKCk7CisgICAgICAgIGNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhSb290UmVzb3VyY2UuY2xhc3MpLnJlZ2lzdGVyKHByb2Nlc3Nvcik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0KGZpbmFsIFN0cmluZyByZXF1ZXN0VXJpKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KHJlcXVlc3RVcmksIDEpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfdGVzdChmaW5hbCBTdHJpbmcgcmVxdWVzdFVyaSwgZmluYWwgaW50IHN1YlJlc291cmNlQ2FsbHMpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QocmVxdWVzdFVyaSwgc3ViUmVzb3VyY2VDYWxscywgZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfdGVzdChmaW5hbCBTdHJpbmcgcmVxdWVzdFVyaSwgZmluYWwgaW50IHN1YlJlc291cmNlQ2FsbHMsIGZpbmFsIGJvb2xlYW4gc2xlZXApCisgICAgICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgZmluYWwgQXBwbGljYXRpb25IYW5kbGVyIGFwcGxpY2F0aW9uSGFuZGxlciA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIoY29uZmlnKTsKKworICAgICAgICBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IG51bGw7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgSU5WT0NBVElPTl9DT1VOVDsgaSsrKSB7CisgICAgICAgICAgICByZXNwb25zZSA9IGFwcGxpY2F0aW9uSGFuZGxlci5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbShyZXF1ZXN0VXJpLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCk7CisKKyAgICAgICAgICAgIGlmIChzbGVlcCkgeworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMTAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KChTdHJpbmcpIHJlc3BvbnNlLmdldEVudGl0eSgpLCBpcygic3ViIikpOworCisgICAgICAgIC8vIFRlc3QgaG93IG1hbnkgdGltZXMgbW9kZWwgcHJvY2Vzc29ycyBtZXRob2QgaGFzIGJlZW4gY2FsbGVkLgorICAgICAgICBhc3NlcnRUaGF0KHByb2Nlc3Nvci5yZXNvdXJjZU1laHRvZENhbGxzLCBpcygxKSk7CisgICAgICAgIGFzc2VydFRoYXQocHJvY2Vzc29yLnN1YnJlc291cmNlTWVodG9kQ2FsbHMsIGlzKHN1YlJlc291cmNlQ2FsbHMpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NhdG9yQXNDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgiL3Jvb3QvY2xhc3MiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NhdG9yQXNDb25jcmV0ZUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCIvcm9vdC9jbGFzcyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvY2F0b3JBc0luc3RhbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCIvcm9vdC9pbnN0YW5jZSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvY2F0b3JBc1Jlc291cmNlRnJvbUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCIvcm9vdC9yZXNvdXJjZS1mcm9tLWNsYXNzIiwgSU5WT0NBVElPTl9DT1VOVCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jYXRvckFzUmVzb3VyY2VTaW5nbGV0b25DYWNoaW5nRW5hYmxlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBjb25maWcucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5TVUJSRVNPVVJDRV9MT0NBVE9SX0NBQ0hFX0pFUlNFWV9SRVNPVVJDRV9FTkFCTEVELCB0cnVlKTsKKworICAgICAgICBfdGVzdCgiL3Jvb3QvcmVzb3VyY2Utc2luZ2xldG9uIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jYXRvckFzUmVzb3VyY2VTaW5nbGV0b25DYWNoaW5nRGlzYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoIi9yb290L3Jlc291cmNlLXNpbmdsZXRvbiIsIElOVk9DQVRJT05fQ09VTlQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvY2F0b3JBc1Jlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCIvcm9vdC9yZXNvdXJjZSIsIElOVk9DQVRJT05fQ09VTlQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvY2F0b3JBc0NsYXNzT2JqZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCIvcm9vdC9vYmplY3QtY2xhc3MiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NhdG9yQXNJbnN0YW5jZU9iamVjdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgiL3Jvb3Qvb2JqZWN0LWluc3RhbmNlIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jYXRvckNhY2hlQWdpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgY29uZmlnLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuU1VCUkVTT1VSQ0VfTE9DQVRPUl9DQUNIRV9BR0UsIDEpOworCisgICAgICAgIF90ZXN0KCIvcm9vdC9jbGFzcyIsIElOVk9DQVRJT05fQ09VTlQsIHRydWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvY2F0b3JDYWNoZUludmFsaWRBZ2luZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBjb25maWcucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5TVUJSRVNPVVJDRV9MT0NBVE9SX0NBQ0hFX0FHRSwgImZvbyIpOworCisgICAgICAgIF90ZXN0KCIvcm9vdC9jbGFzcyIsIDEsIHRydWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3JvdXRpbmcvU3ViUmVzb3VyY2VWYWxpZGF0aW9uVGVzdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvcm91dGluZy9TdWJSZXNvdXJjZVZhbGlkYXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcyODJjMgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3JvdXRpbmcvU3ViUmVzb3VyY2VWYWxpZGF0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5yb3V0aW5nOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVxdWVzdENvbnRleHRCdWlsZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRoaXMgdGVzdHMgZGlzYWJsaW5nIG9mIGEgc3ViIHJlc291cmNlIGxvY2F0b3IgdmFsaWRhdGlvbi4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKgorICovCitwdWJsaWMgY2xhc3MgU3ViUmVzb3VyY2VWYWxpZGF0aW9uVGVzdCB7CisKKyAgICBAUGF0aCgicm9vdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSb290UmVzb3VyY2UgeworICAgICAgICBAUGF0aCgic3ViIikKKyAgICAgICAgcHVibGljIEludmFsaWRTdWJSZXNvdXJjZSBnZXRTdWJSZXNvdXJjZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSW52YWxpZFN1YlJlc291cmNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW52YWxpZFN1YlJlc291cmNlIHsKKyAgICAgICAgLy8gaW52YWxpZDogbXVsdGlwbGUgZ2V0IG1ldGhvZHMgb24gdGhlIHNhbWUgcGF0aAorCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gImdldCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJhYWEiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGFnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gImFhYS1nZXQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiYWFhIikKKyAgICAgICAgcHVibGljIFN0cmluZyBhZ2V0MigpIHsKKyAgICAgICAgICAgIHJldHVybiAiYWFhLWdldDIiOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbmFibGUoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKFJvb3RSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuUkVTT1VSQ0VfVkFMSURBVElPTl9ESVNBQkxFLCAiZmFsc2UiKTsKKworICAgICAgICBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwbGljYXRpb25IYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihyZXNvdXJjZUNvbmZpZyk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gYXBwbGljYXRpb25IYW5kbGVyLmFwcGx5KAorICAgICAgICAgICAgICAgICAgICBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3Jvb3Qvc3ViIiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICAgICAgLy8gc2hvdWxkIHRocm93IGFuIGV4Y2VwdGlvbiBvciByZXR1cm4gNTAwCisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gb2sKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERpc2FibGUoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKFJvb3RSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuUkVTT1VSQ0VfVkFMSURBVElPTl9ESVNBQkxFLCAidHJ1ZSIpOworCisgICAgICAgIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbkhhbmRsZXIgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKHJlc291cmNlQ29uZmlnKTsKKworICAgICAgICBmaW5hbCBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGFwcGxpY2F0aW9uSGFuZGxlci5hcHBseSgKKyAgICAgICAgICAgICAgICBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3Jvb3Qvc3ViIiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZ2V0IiwgcmVzcG9uc2UuZ2V0RW50aXR5KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3JvdXRpbmcvVXJpUm91dGluZ0NvbnRleHRUZXN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9yb3V0aW5nL1VyaVJvdXRpbmdDb250ZXh0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MGM2MDgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9yb3V0aW5nL1VyaVJvdXRpbmdDb250ZXh0VGVzdC5qYXZhCkBAIC0wLDAgKzEsNDI5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5yb3V0aW5nOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUGF0aFNlZ21lbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlcXVlc3RDb250ZXh0QnVpbGRlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgVXJpUm91dGluZ0NvbnRleHRUZXN0IHsKKworICAgIHB1YmxpYyBVcmlSb3V0aW5nQ29udGV4dFRlc3QoKSB7CisgICAgfQorCisgICAgQEJlZm9yZUNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFVwQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICB9CisKKyAgICBAQWZ0ZXJDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB0ZWFyRG93bkNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgIH0KKworICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgeworICAgIH0KKworICAgIHByaXZhdGUgVXJpUm91dGluZ0NvbnRleHQgY3JlYXRlQ29udGV4dChTdHJpbmcgcmVxdWVzdFVyaSwgU3RyaW5nIG1ldGhvZCkgeworICAgICAgICByZXR1cm4gbmV3IFVyaVJvdXRpbmdDb250ZXh0KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKHJlcXVlc3RVcmksIG1ldGhvZCkuYnVpbGQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBVcmlSb3V0aW5nQ29udGV4dCBjcmVhdGVDb250ZXh0KFN0cmluZyBhcHBCYXNlVXJpLCBTdHJpbmcgcmVxdWVzdFVyaSwgU3RyaW5nIG1ldGhvZCkgeworICAgICAgICByZXR1cm4gbmV3IFVyaVJvdXRpbmdDb250ZXh0KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKGFwcEJhc2VVcmksIHJlcXVlc3RVcmksIG1ldGhvZCkuYnVpbGQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QWJzb2x1dGVQYXRoKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICAgIFVyaVJvdXRpbmdDb250ZXh0IGNvbnRleHQ7CisKKyAgICAgICAgY29udGV4dCA9IGNyZWF0ZUNvbnRleHQoImh0dHA6Ly9leGFtcGxlLm9yZy9hcHAvIiwgImh0dHA6Ly9leGFtcGxlLm9yZy9hcHAvcmVzb3VyY2U/Zm9vMT1iYXIxJmZvbzI9YmFyMiIsICJHRVQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9leGFtcGxlLm9yZy9hcHAvcmVzb3VyY2UiKSwgY29udGV4dC5nZXRBYnNvbHV0ZVBhdGgoKSk7CisKKyAgICAgICAgY29udGV4dCA9IGNyZWF0ZUNvbnRleHQoImh0dHA6Ly9leGFtcGxlLm9yZy9hcHAvIiwgImh0dHA6Ly9leGFtcGxlLm9yZy9hcHAvcmVzb3VyY2UlMjBkZWNvZGVkP2ZvbzE9YmFyMSIsICJHRVQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9leGFtcGxlLm9yZy9hcHAvcmVzb3VyY2UlMjBkZWNvZGVkIiksIGNvbnRleHQuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFBhdGgoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKKyAgICAgICAgVXJpUm91dGluZ0NvbnRleHQgY29udGV4dDsKKworICAgICAgICBjb250ZXh0ID0gY3JlYXRlQ29udGV4dCgiaHR0cDovL2V4YW1wbGUub3JnL215JTIwYXBwL3Jlc291cmNlP2ZvbzE9YmFyMSZmb28yPWJhcjIiLCAiR0VUIik7CisgICAgICAgIGFzc2VydEVxdWFscygibXkgYXBwL3Jlc291cmNlIiwgY29udGV4dC5nZXRQYXRoKCkpOworCisgICAgICAgIGNvbnRleHQgPSBjcmVhdGVDb250ZXh0KCJodHRwOi8vZXhhbXBsZS5vcmcvbXklMjBhcHAvIiwgImh0dHA6Ly9leGFtcGxlLm9yZy9teSUyMGFwcC9yZXNvdXJjZT9mb28xPWJhcjEmZm9vMj1iYXIyIiwKKyAgICAgICAgICAgICAgICAiR0VUIik7CisgICAgICAgIGFzc2VydEVxdWFscygicmVzb3VyY2UiLCBjb250ZXh0LmdldFBhdGgoKSk7CisKKyAgICAgICAgY29udGV4dCA9IGNyZWF0ZUNvbnRleHQoImh0dHA6Ly9leGFtcGxlLm9yZy9teSUyMGFwcC8iLAorICAgICAgICAgICAgICAgICJodHRwOi8vZXhhbXBsZS5vcmcvbXklMjBhcHAvcmVzb3VyY2U/Zm9vMT1iYXIxJmZvbzI9YmFyMiIsICJHRVQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZXNvdXJjZSIsIGNvbnRleHQuZ2V0UGF0aCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXREZWNvZGVkUGF0aCgpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24geworICAgICAgICBVcmlSb3V0aW5nQ29udGV4dCBjdHggPSBjcmVhdGVDb250ZXh0KCJodHRwOi8vZXhhbXBsZS5vcmcvbXklMjBhcHAvcmVzb3VyY2U/Zm9vMT1iYXIxJmZvbzI9YmFyMiIsICJHRVQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJteSUyMGFwcC9yZXNvdXJjZSIsIGN0eC5nZXRQYXRoKGZhbHNlKSk7CisgICAgICAgIGFzc2VydEVxdWFscygibXkgYXBwL3Jlc291cmNlIiwgY3R4LmdldFBhdGgodHJ1ZSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFBhdGhCdWlsZGVyKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICAgIFVyaVJvdXRpbmdDb250ZXh0IGN0eCA9IGNyZWF0ZUNvbnRleHQoImh0dHA6Ly9leGFtcGxlLm9yZy9teSUyMGFwcC8iLAorICAgICAgICAgICAgICAgICJodHRwOi8vZXhhbXBsZS5vcmcvbXklMjBhcHAvcmVzb3VyY2U/Zm9vMT1iYXIxJmZvbzI9YmFyMiIsICJHRVQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9leGFtcGxlLm9yZy9teSUyMGFwcC9yZXNvdXJjZSIpLCBjdHguZ2V0QWJzb2x1dGVQYXRoQnVpbGRlcigpLmJ1aWxkKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFBhdGhTZWdtZW50cygpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24geworICAgICAgICBMaXN0PFBhdGhTZWdtZW50PiBscHMgPSBjcmVhdGVDb250ZXh0KCJodHRwOi8vZXhhbXBsZS5vcmcvYXBwLyIsCisgICAgICAgICAgICAgICAgImh0dHA6Ly9leGFtcGxlLm9yZy9hcHAvbXklMjByZXNvdXJjZS9teSUyMHN1YnJlc291cmNlIiwgIkdFVCIpLmdldFBhdGhTZWdtZW50cygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbHBzLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygibXkgcmVzb3VyY2UiLCBscHMuZ2V0KDApLmdldFBhdGgoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygibXkgc3VicmVzb3VyY2UiLCBscHMuZ2V0KDEpLmdldFBhdGgoKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxwcy5yZW1vdmUoMCk7CisgICAgICAgICAgICBmYWlsKCJVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleHBlY3RlZCAtIHJldHVybmVkIGxpc3Qgc2hvdWxkIG5vdCBiZSBtb2RpZmlhYmxlLiIpOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gcGFzc2VkCisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQYXRoU2VnbWVudHMyKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICAgIExpc3Q8UGF0aFNlZ21lbnQ+IGxwcyA9IGNyZWF0ZUNvbnRleHQoImh0dHA6Ly9leGFtcGxlLm9yZy9hcHAvIiwKKyAgICAgICAgICAgICAgICAiaHR0cDovL2V4YW1wbGUub3JnL2FwcC9teSUyMHJlc291cmNlL215JTIwc3VicmVzb3VyY2UiLCAiR0VUIikuZ2V0UGF0aFNlZ21lbnRzKGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGxwcy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm15JTIwcmVzb3VyY2UiLCBscHMuZ2V0KDApLmdldFBhdGgoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygibXklMjBzdWJyZXNvdXJjZSIsIGxwcy5nZXQoMSkuZ2V0UGF0aCgpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbHBzLnJlbW92ZSgwKTsKKyAgICAgICAgICAgIGZhaWwoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4cGVjdGVkIC0gcmV0dXJuZWQgbGlzdCBzaG91bGQgbm90IGJlIG1vZGlmaWFibGUuIik7CisgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBwYXNzZWQKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFF1ZXJ5UGFyYW1zKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBtYXAgPQorICAgICAgICAgICAgICAgIGNyZWF0ZUNvbnRleHQoImh0dHA6Ly9leGFtcGxlLm9yZy9hcHAvcmVzb3VyY2U/Zm9vMT1iYXIxJmZvbzI9YmFyMiIsICJHRVQiKS5nZXRRdWVyeVBhcmFtZXRlcnMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG1hcC5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImJhcjEiLCBtYXAuZ2V0Rmlyc3QoImZvbzEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYmFyMiIsIG1hcC5nZXRGaXJzdCgiZm9vMiIpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbWFwLnJlbW92ZSgiZm9vMSIpOworICAgICAgICAgICAgZmFpbCgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXhwZWN0ZWQgLSByZXR1cm5lZCBsaXN0IHNob3VsZCBub3QgYmUgbW9kaWZpYWJsZS4iKTsKKyAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIHBhc3NlZAorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UXVlcnlQYXJhbXNEZWNvZGVkKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBtYXAgPQorICAgICAgICAgICAgICAgIGNyZWF0ZUNvbnRleHQoImh0dHA6Ly9leGFtcGxlLm9yZy9hcHAvcmVzb3VyY2U/Zm9vMT0lN0JiYXIxJTdEJmZvbzI9JTdCYmFyMiU3RCIsICJHRVQiKS5nZXRRdWVyeVBhcmFtZXRlcnModHJ1ZSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBtYXAuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ7YmFyMX0iLCBtYXAuZ2V0Rmlyc3QoImZvbzEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygie2JhcjJ9IiwgbWFwLmdldEZpcnN0KCJmb28yIikpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgbWFwLnJlbW92ZSgiZm9vMSIpOworICAgICAgICAgICAgZmFpbCgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXhwZWN0ZWQgLSByZXR1cm5lZCBsaXN0IHNob3VsZCBub3QgYmUgbW9kaWZpYWJsZS4iKTsKKyAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIHBhc3NlZAorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTWlncmF0ZWQgSmVyc2V5IDEueCB7QGNvZGUgY29tLnN1bi5qZXJzZXkuaW1wbC5QYXRoU2VnbWVudHNIdHRwUmVxdWVzdFRlc3R9LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFBhdGhTZWdtZW50c0dlbmVyYWwoKSB7CisgICAgICAgIGZpbmFsIFVyaUluZm8gdWkgPSBjcmVhdGVDb250ZXh0KCIvcDE7eD0xO3k9MS9wMjt4PTI7eT0yL3AzO3g9Mzt5PTMiLCAiR0VUIik7CisKKyAgICAgICAgTGlzdDxQYXRoU2VnbWVudD4gc2VnbWVudHMgPSB1aS5nZXRQYXRoU2VnbWVudHMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHNlZ21lbnRzLnNpemUoKSk7CisKKyAgICAgICAgZmluYWwgSXRlcmF0b3I8UGF0aFNlZ21lbnQ+IHBzaSA9IHNlZ21lbnRzLml0ZXJhdG9yKCk7CisgICAgICAgIFBhdGhTZWdtZW50IHNlZ21lbnQ7CisKKyAgICAgICAgc2VnbWVudCA9IHBzaS5uZXh0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygicDEiLCBzZWdtZW50LmdldFBhdGgoKSk7CisgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBtID0gc2VnbWVudC5nZXRNYXRyaXhQYXJhbWV0ZXJzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiMSIsIG0uZ2V0Rmlyc3QoIngiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMSIsIG0uZ2V0Rmlyc3QoInkiKSk7CisKKyAgICAgICAgc2VnbWVudCA9IHBzaS5uZXh0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygicDIiLCBzZWdtZW50LmdldFBhdGgoKSk7CisgICAgICAgIG0gPSBzZWdtZW50LmdldE1hdHJpeFBhcmFtZXRlcnMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIyIiwgbS5nZXRGaXJzdCgieCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIyIiwgbS5nZXRGaXJzdCgieSIpKTsKKworICAgICAgICBzZWdtZW50ID0gcHNpLm5leHQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwMyIsIHNlZ21lbnQuZ2V0UGF0aCgpKTsKKyAgICAgICAgbSA9IHNlZ21lbnQuZ2V0TWF0cml4UGFyYW1ldGVycygpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjMiLCBtLmdldEZpcnN0KCJ4IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjMiLCBtLmdldEZpcnN0KCJ5IikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1pZ3JhdGVkIEplcnNleSAxLngge0Bjb2RlIGNvbS5zdW4uamVyc2V5LmltcGwuUGF0aFNlZ21lbnRzSHR0cFJlcXVlc3RUZXN0fS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQYXRoU2VnbWVudHNNdWx0aXBsZVNsYXNoKCkgeworICAgICAgICBmaW5hbCBVcmlJbmZvIHVpID0gY3JlYXRlQ29udGV4dCgiL3AvL3AvL3AvLyIsICJHRVQiKTsKKyAgICAgICAgTGlzdDxQYXRoU2VnbWVudD4gc2VnbWVudHMgPSB1aS5nZXRQYXRoU2VnbWVudHMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDcsIHNlZ21lbnRzLnNpemUoKSk7CisKKyAgICAgICAgZmluYWwgSXRlcmF0b3I8UGF0aFNlZ21lbnQ+IHBzaSA9IHNlZ21lbnRzLml0ZXJhdG9yKCk7CisgICAgICAgIFBhdGhTZWdtZW50IHNlZ21lbnQ7CisKKyAgICAgICAgc2VnbWVudCA9IHBzaS5uZXh0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygicCIsIHNlZ21lbnQuZ2V0UGF0aCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHNlZ21lbnQuZ2V0TWF0cml4UGFyYW1ldGVycygpLnNpemUoKSk7CisKKyAgICAgICAgc2VnbWVudCA9IHBzaS5uZXh0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgc2VnbWVudC5nZXRQYXRoKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc2VnbWVudC5nZXRNYXRyaXhQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKworICAgICAgICBzZWdtZW50ID0gcHNpLm5leHQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwIiwgc2VnbWVudC5nZXRQYXRoKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc2VnbWVudC5nZXRNYXRyaXhQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKworICAgICAgICBzZWdtZW50ID0gcHNpLm5leHQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBzZWdtZW50LmdldFBhdGgoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzZWdtZW50LmdldE1hdHJpeFBhcmFtZXRlcnMoKS5zaXplKCkpOworCisgICAgICAgIHNlZ21lbnQgPSBwc2kubmV4dCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoInAiLCBzZWdtZW50LmdldFBhdGgoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBzZWdtZW50LmdldE1hdHJpeFBhcmFtZXRlcnMoKS5zaXplKCkpOworCisgICAgICAgIHNlZ21lbnQgPSBwc2kubmV4dCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIHNlZ21lbnQuZ2V0UGF0aCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHNlZ21lbnQuZ2V0TWF0cml4UGFyYW1ldGVycygpLnNpemUoKSk7CisKKyAgICAgICAgc2VnbWVudCA9IHBzaS5uZXh0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgc2VnbWVudC5nZXRQYXRoKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc2VnbWVudC5nZXRNYXRyaXhQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNaWdyYXRlZCBKZXJzZXkgMS54IHtAY29kZSBjb20uc3VuLmplcnNleS5pbXBsLlBhdGhTZWdtZW50c0h0dHBSZXF1ZXN0VGVzdH0uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UGF0aFNlZ21lbnRzTXVsdGlwbGVNYXRyaXgoKSB7CisgICAgICAgIGZpbmFsIFVyaUluZm8gdWkgPSBjcmVhdGVDb250ZXh0KCIvcDt4PTE7eD0yO3g9MyIsICJHRVQiKTsKKyAgICAgICAgTGlzdDxQYXRoU2VnbWVudD4gc2VnbWVudHMgPSB1aS5nZXRQYXRoU2VnbWVudHMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHNlZ21lbnRzLnNpemUoKSk7CisKKyAgICAgICAgZmluYWwgSXRlcmF0b3I8UGF0aFNlZ21lbnQ+IHBzaSA9IHNlZ21lbnRzLml0ZXJhdG9yKCk7CisgICAgICAgIFBhdGhTZWdtZW50IHNlZ21lbnQ7CisKKyAgICAgICAgc2VnbWVudCA9IHBzaS5uZXh0KCk7CisgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBtID0gc2VnbWVudC5nZXRNYXRyaXhQYXJhbWV0ZXJzKCk7CisgICAgICAgIExpc3Q8U3RyaW5nPiB2YWx1ZXMgPSBtLmdldCgieCIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG0uc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLnZhbHVlT2YoaSArIDEpLnRvU3RyaW5nKCksIHZhbHVlcy5nZXQoaSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTWlncmF0ZWQgSmVyc2V5IDEueCB7QGNvZGUgY29tLnN1bi5qZXJzZXkuaW1wbC5QYXRoU2VnbWVudHNIdHRwUmVxdWVzdFRlc3R9LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFBhdGhTZWdtZW50c011bHRpcGxlU2xhc2htdWxpdHBsZU1hdHJpeCgpIHsKKyAgICAgICAgZmluYWwgVXJpSW5mbyB1aSA9IGNyZWF0ZUNvbnRleHQoIi87eD0xO3k9MS87eD0yO3k9Mi87eD0zO3k9MyIsICJHRVQiKTsKKyAgICAgICAgTGlzdDxQYXRoU2VnbWVudD4gc2VnbWVudHMgPSB1aS5nZXRQYXRoU2VnbWVudHMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHNlZ21lbnRzLnNpemUoKSk7CisKKyAgICAgICAgZmluYWwgSXRlcmF0b3I8UGF0aFNlZ21lbnQ+IHBzaSA9IHNlZ21lbnRzLml0ZXJhdG9yKCk7CisgICAgICAgIFBhdGhTZWdtZW50IHNlZ21lbnQ7CisKKyAgICAgICAgc2VnbWVudCA9IHBzaS5uZXh0KCk7CisgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBtID0gc2VnbWVudC5nZXRNYXRyaXhQYXJhbWV0ZXJzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiMSIsIG0uZ2V0Rmlyc3QoIngiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMSIsIG0uZ2V0Rmlyc3QoInkiKSk7CisKKyAgICAgICAgc2VnbWVudCA9IHBzaS5uZXh0KCk7CisgICAgICAgIG0gPSBzZWdtZW50LmdldE1hdHJpeFBhcmFtZXRlcnMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIyIiwgbS5nZXRGaXJzdCgieCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIyIiwgbS5nZXRGaXJzdCgieSIpKTsKKworICAgICAgICBzZWdtZW50ID0gcHNpLm5leHQoKTsKKyAgICAgICAgbSA9IHNlZ21lbnQuZ2V0TWF0cml4UGFyYW1ldGVycygpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjMiLCBtLmdldEZpcnN0KCJ4IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjMiLCBtLmdldEZpcnN0KCJ5IikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1pZ3JhdGVkIEplcnNleSAxLngge0Bjb2RlIGNvbS5zdW4uamVyc2V5LmltcGwuUXVlcnlQYXJhbWV0ZXJzSHR0cFJlcXVlc3RUZXN0fS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRRdWVyeVBhcmFtZXRlcnNHZW5lcmFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFVyaUluZm8gdWkgPSBjcmVhdGVDb250ZXh0KCIvd2lkZ2V0cy8xMD92ZXJib3NlPXRydWUmaXRlbT0xJml0ZW09MiIsICJHRVQiKTsKKyAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IHAgPSB1aS5nZXRRdWVyeVBhcmFtZXRlcnMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHAuZ2V0KCJ2ZXJib3NlIikuc2l6ZSgpLCAxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHAuZ2V0Rmlyc3QoInZlcmJvc2UiKSwgInRydWUiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHAuZ2V0KCJpdGVtIikuc2l6ZSgpLCAyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHAuZ2V0Rmlyc3QoIml0ZW0iKSwgIjEiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHAuZ2V0KCJmb28iKSwgbnVsbCk7CisgICAgICAgIGFzc2VydEVxdWFscyhwLmdldEZpcnN0KCJmb28iKSwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWlncmF0ZWQgSmVyc2V5IDEueCB7QGNvZGUgY29tLnN1bi5qZXJzZXkuaW1wbC5RdWVyeVBhcmFtZXRlcnNIdHRwUmVxdWVzdFRlc3R9LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFF1ZXJ5UGFyYW1ldGVyc0VtcHR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFVyaUluZm8gdWkgPSBjcmVhdGVDb250ZXh0KCIvd2lkZ2V0cy8xMCIsICJHRVQiKTsKKyAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IHAgPSB1aS5nZXRRdWVyeVBhcmFtZXRlcnMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHAuc2l6ZSgpLCAwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNaWdyYXRlZCBKZXJzZXkgMS54IHtAY29kZSBjb20uc3VuLmplcnNleS5pbXBsLlF1ZXJ5UGFyYW1ldGVyc0h0dHBSZXF1ZXN0VGVzdH0uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UXVlcnlQYXJhbWV0ZXJzU2luZ2xlQW1wZXJzYW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFVyaUluZm8gdWkgPSBjcmVhdGVDb250ZXh0KCIvd2lkZ2V0cy8xMD8mIiwgIkdFVCIpOworICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gcCA9IHVpLmdldFF1ZXJ5UGFyYW1ldGVycygpOworICAgICAgICBhc3NlcnRFcXVhbHMocC5zaXplKCksIDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1pZ3JhdGVkIEplcnNleSAxLngge0Bjb2RlIGNvbS5zdW4uamVyc2V5LmltcGwuUXVlcnlQYXJhbWV0ZXJzSHR0cFJlcXVlc3RUZXN0fS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRRdWVyeVBhcmFtZXRlcnNNdWx0aXBsZUFtcGVyc2FuZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBVcmlJbmZvIHVpID0gY3JlYXRlQ29udGV4dCgiL3dpZGdldHMvMTA/JiYlMjA9JTIwJiYmIiwgIkdFVCIpOworICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gcCA9IHVpLmdldFF1ZXJ5UGFyYW1ldGVycygpOworICAgICAgICBhc3NlcnRFcXVhbHMocC5zaXplKCksIDEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1pZ3JhdGVkIEplcnNleSAxLngge0Bjb2RlIGNvbS5zdW4uamVyc2V5LmltcGwuUXVlcnlQYXJhbWV0ZXJzSHR0cFJlcXVlc3RUZXN0fS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRRdWVyeVBhcmFtZXRlcnNJbnRlcnNwZXJzZWRBbXBlcnNhbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgVXJpSW5mbyB1aSA9IGNyZWF0ZUNvbnRleHQoIi93aWRnZXRzLzEwP2E9MSYmYj0yIiwgIkdFVCIpOworICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gcCA9IHVpLmdldFF1ZXJ5UGFyYW1ldGVycygpOworICAgICAgICBhc3NlcnRFcXVhbHMocC5zaXplKCksIDIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1pZ3JhdGVkIEplcnNleSAxLngge0Bjb2RlIGNvbS5zdW4uamVyc2V5LmltcGwuUXVlcnlQYXJhbWV0ZXJzSHR0cFJlcXVlc3RUZXN0fS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRRdWVyeVBhcmFtZXRlcnNFbXB0eVZhbHVlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBVcmlJbmZvIHVpID0gY3JlYXRlQ29udGV4dCgiL3dpZGdldHMvMTA/b25lJnR3byZ0aHJlZSIsICJHRVQiKTsKKyAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IHAgPSB1aS5nZXRRdWVyeVBhcmFtZXRlcnMoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMocC5nZXRGaXJzdCgib25lIiksICIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHAuZ2V0Rmlyc3QoInR3byIpLCAiIik7CisgICAgICAgIGFzc2VydEVxdWFscyhwLmdldEZpcnN0KCJ0aHJlZSIpLCAiIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWlncmF0ZWQgSmVyc2V5IDEueCB7QGNvZGUgY29tLnN1bi5qZXJzZXkuaW1wbC5RdWVyeVBhcmFtZXRlcnNIdHRwUmVxdWVzdFRlc3R9LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFF1ZXJ5UGFyYW1ldGVyc011bHRpcGxlRW1wdHlWYWx1ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgVXJpSW5mbyB1aSA9IGNyZWF0ZUNvbnRleHQoIi93aWRnZXRzLzEwP29uZSZvbmUmb25lIiwgIkdFVCIpOworICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gcCA9IHVpLmdldFF1ZXJ5UGFyYW1ldGVycygpOworCisgICAgICAgIGFzc2VydEVxdWFscyhwLmdldCgib25lIikuc2l6ZSgpLCAzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHAuZ2V0KCJvbmUiKS5nZXQoMCksICIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHAuZ2V0KCJvbmUiKS5nZXQoMSksICIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHAuZ2V0KCJvbmUiKS5nZXQoMiksICIiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNaWdyYXRlZCBKZXJzZXkgMS54IHtAY29kZSBjb20uc3VuLmplcnNleS5pbXBsLlF1ZXJ5UGFyYW1ldGVyc0h0dHBSZXF1ZXN0VGVzdH0uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UXVlcnlQYXJhbWV0ZXJzV2hpdGVTcGFjZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBVcmlJbmZvIHVpID0gY3JlYXRlQ29udGV4dCgiL3dpZGdldHMvMTA/eCs9KzElMjAmJTIweSs9KzIiLCAiR0VUIik7CisgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBwID0gdWkuZ2V0UXVlcnlQYXJhbWV0ZXJzKCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIgMSAiLCBwLmdldEZpcnN0KCJ4ICIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIgMiIsIHAuZ2V0Rmlyc3QoIiB5ICIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNaWdyYXRlZCBKZXJzZXkgMS54IHtAY29kZSBjb20uc3VuLmplcnNleS5pbXBsLlF1ZXJ5UGFyYW1ldGVyc0h0dHBSZXF1ZXN0VGVzdH0uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UXVlcnlQYXJhbWV0ZXJzRGVjb2RlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBVcmlJbmZvIHVpOworICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gcDsKKworICAgICAgICB1aSA9IGNyZWF0ZUNvbnRleHQoIi93aWRnZXRzLzEwP3grPSsxJTIwJiUyMHkrPSsyIiwgIkdFVCIpOworICAgICAgICBwID0gdWkuZ2V0UXVlcnlQYXJhbWV0ZXJzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiIDEgIiwgcC5nZXRGaXJzdCgieCAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiIDIiLCBwLmdldEZpcnN0KCIgeSAiKSk7CisKKyAgICAgICAgdWkgPSBjcmVhdGVDb250ZXh0KCIvd2lkZ2V0cy8xMD94PTEmeT0xKyUyQisyIiwgIkdFVCIpOworICAgICAgICBwID0gdWkuZ2V0UXVlcnlQYXJhbWV0ZXJzKHRydWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCBwLmdldEZpcnN0KCJ4IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEgKyAyIiwgcC5nZXRGaXJzdCgieSIpKTsKKworICAgICAgICB1aSA9IGNyZWF0ZUNvbnRleHQoIi93aWRnZXRzLzEwP3g9MSZ5PTErJTI2KzIiLCAiR0VUIik7CisgICAgICAgIHAgPSB1aS5nZXRRdWVyeVBhcmFtZXRlcnModHJ1ZSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMSIsIHAuZ2V0Rmlyc3QoIngiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMSAmIDIiLCBwLmdldEZpcnN0KCJ5IikpOworCisgICAgICAgIHVpID0gY3JlYXRlQ29udGV4dCgiL3dpZGdldHMvMTA/eD0xJnk9MSslN0MlN0MrMiIsICJHRVQiKTsKKyAgICAgICAgcCA9IHVpLmdldFF1ZXJ5UGFyYW1ldGVycyh0cnVlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgcC5nZXRGaXJzdCgieCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIHx8IDIiLCBwLmdldEZpcnN0KCJ5IikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1pZ3JhdGVkIEplcnNleSAxLngge0Bjb2RlIGNvbS5zdW4uamVyc2V5LmltcGwuUXVlcnlQYXJhbWV0ZXJzSHR0cFJlcXVlc3RUZXN0fS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRRdWVyeVBhcmFtZXRlcnNFbmNvZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFVyaUluZm8gdWkgPSBjcmVhdGVDb250ZXh0KCIvd2lkZ2V0cy8xMD94Kz0rMSUyMCYlMjB5Kz0rMiIsICJHRVQiKTsKKyAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IHAgPSB1aS5nZXRRdWVyeVBhcmFtZXRlcnMoZmFsc2UpOworCisgICAgICAgIGFzc2VydEVxdWFscygiKzElMjAiLCBwLmdldEZpcnN0KCJ4ICIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIrMiIsIHAuZ2V0Rmlyc3QoIiB5ICIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9zY2FubmluZy9CdW5kbGVTY2hlbWVTY2FubmVyVGVzdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvc2Nhbm5pbmcvQnVuZGxlU2NoZW1lU2Nhbm5lclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjY3NTMzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvc2Nhbm5pbmcvQnVuZGxlU2NoZW1lU2Nhbm5lclRlc3QuamF2YQpAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5zY2FubmluZzsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUZpbmRlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBCdW5kbGVTY2hlbWVTY2FubmVyVGVzdCB7CisKKyAgICBwcml2YXRlIFJlc291cmNlRmluZGVyIGJ1bmRsZVNjaGVtZVNjYW5uZXI7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXBCdW5kbGVTY2hlbWVTY2FubmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBjYW5vbmljYWxOYW1lID0gZ2V0Q2xhc3MoKS5nZXRDYW5vbmljYWxOYW1lKCk7CisgICAgICAgIFVSSSB1cmkgPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2UoY2Fub25pY2FsTmFtZS5yZXBsYWNlKCcuJywgJy8nKSArICIuY2xhc3MiKS50b1VSSSgpOworICAgICAgICBidW5kbGVTY2hlbWVTY2FubmVyID0gbmV3IEJ1bmRsZVNjaGVtZVJlc291cmNlRmluZGVyRmFjdG9yeSgpLmNyZWF0ZSh1cmksIHRydWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgaGFzTmV4dFJldHVybnNUcnVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGJ1bmRsZVNjaGVtZVNjYW5uZXIuaGFzTmV4dCgpKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgbXVsdGlwbGVOZXh0SW52b2NhdGlvbkZhaWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJ1bmRsZVNjaGVtZVNjYW5uZXIubmV4dCgpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShidW5kbGVTY2hlbWVTY2FubmVyLmhhc05leHQoKSk7CisgICAgICAgIGJ1bmRsZVNjaGVtZVNjYW5uZXIubmV4dCgpOyAvLyB0aHJvdyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uCisgICAgfQorCisgICAgLyoqCisgICAgICogSXRlcmF0b3IgY2xhc3Mge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5zY2FubmluZy5CdW5kbGVTY2hlbWVSZXNvdXJjZUZpbmRlckZhY3RvcnkuQnVuZGxlU2NoZW1lU2Nhbm5lcn0KKyAgICAgKiBicmVha3MgdGhlIHtAbGluayBqYXZhLnV0aWwuSXRlcmF0b3J9IGNvbnRyYWN0IGFzIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VGaW5kZXIjb3BlbigpfSBjYXVzZXMgaXQgdG8KKyAgICAgKiBhZHZhbmNlLgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdChleHBlY3RlZCA9IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgb3BlbkZpbmlzaGVzVGhlSXRlcmF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGJ1bmRsZVNjaGVtZVNjYW5uZXIub3BlbigpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKGJ1bmRsZVNjaGVtZVNjYW5uZXIuaGFzTmV4dCgpKTsKKworICAgICAgICBidW5kbGVTY2hlbWVTY2FubmVyLm5leHQoKTsgLy8gdGhyb3cgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvc2Nhbm5pbmcvQ29tcG9zaXRlUmVzb3VyY2VGaW5kZXJUZXN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9zY2FubmluZy9Db21wb3NpdGVSZXNvdXJjZUZpbmRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmJjZjUyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvc2Nhbm5pbmcvQ29tcG9zaXRlUmVzb3VyY2VGaW5kZXJUZXN0LmphdmEKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuc2Nhbm5pbmc7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlRmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5BYnN0cmFjdFJlc291cmNlRmluZGVyQWRhcHRlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBDb21wb3NpdGVSZXNvdXJjZUZpbmRlclRlc3QgeworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUl0ZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RSZXNvdXJjZUZpbmRlckFkYXB0ZXIgeworCisgICAgICAgIGJvb2xlYW4gaXRlcmF0ZWQgPSBmYWxzZTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiAhaXRlcmF0ZWQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBuZXh0KCkgeworICAgICAgICAgICAgaWYgKCFpdGVyYXRlZCkgeworICAgICAgICAgICAgICAgIGl0ZXJhdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gInZhbHVlIjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSW5wdXRTdHJlYW0gb3BlbigpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0KCkgeworICAgICAgICBmaW5hbCBSZXNvdXJjZUZpbmRlciBpID0gbmV3IE15SXRlcmF0b3IoKTsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VGaW5kZXIgaiA9IG5ldyBNeUl0ZXJhdG9yKCk7CisKKyAgICAgICAgZmluYWwgQ29tcG9zaXRlUmVzb3VyY2VGaW5kZXIgaXRlcmF0b3JTdGFjayA9IG5ldyBDb21wb3NpdGVSZXNvdXJjZUZpbmRlcigpOworICAgICAgICBpdGVyYXRvclN0YWNrLnB1c2goaSk7CisgICAgICAgIGl0ZXJhdG9yU3RhY2sucHVzaChqKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoaXRlcmF0b3JTdGFjay5uZXh0KCksICJ2YWx1ZSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoaXRlcmF0b3JTdGFjay5uZXh0KCksICJ2YWx1ZSIpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpdGVyYXRvclN0YWNrLm5leHQoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoZmFsc2UpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIG5zZWUpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUodHJ1ZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9zY2FubmluZy9KYXJGaWxlU2Nhbm5lclRlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3NjYW5uaW5nL0phckZpbGVTY2FubmVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZjI1ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9zY2FubmluZy9KYXJGaWxlU2Nhbm5lclRlc3QuamF2YQpAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuc2Nhbm5pbmc7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRW50cnk7CitpbXBvcnQgamF2YS51dGlsLmphci5KYXJGaWxlOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQuZXhwZXJpbWVudGFsLnRoZW9yaWVzLkRhdGFQb2ludDsKK2ltcG9ydCBvcmcuanVuaXQuZXhwZXJpbWVudGFsLnRoZW9yaWVzLlRoZW9yaWVzOworaW1wb3J0IG9yZy5qdW5pdC5leHBlcmltZW50YWwudGhlb3JpZXMuVGhlb3J5OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiBAYXV0aG9yIE1hcnRpbiBTbnlkZXIKKyAqLworQFJ1bldpdGgoVGhlb3JpZXMuY2xhc3MpCitwdWJsaWMgY2xhc3MgSmFyRmlsZVNjYW5uZXJUZXN0IHsKKworICAgIEBEYXRhUG9pbnQKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gUkVDVVJTSVZFID0gdHJ1ZTsKKyAgICBARGF0YVBvaW50CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIE5PTl9SRUNVUlNJVkUgPSBmYWxzZTsKKworICAgIHByaXZhdGUgU3RyaW5nIGpheFJzQXBpUGF0aDsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgY2xhc3NQYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmNsYXNzLnBhdGgiKTsKKyAgICAgICAgZmluYWwgU3RyaW5nW10gZW50cmllcyA9IGNsYXNzUGF0aC5zcGxpdChTeXN0ZW0uZ2V0UHJvcGVydHkoInBhdGguc2VwYXJhdG9yIikpOworCisgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIGVudHJ5IDogZW50cmllcykgeworICAgICAgICAgICAgaWYgKGVudHJ5LmNvbnRhaW5zKCJqYXZheC53cy5ycy1hcGkiKSkgeworICAgICAgICAgICAgICAgIGpheFJzQXBpUGF0aCA9IGVudHJ5OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGpheFJzQXBpUGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICBmYWlsKCJDb3VsZCBub3QgZmluZCBqYXZheC53cy5ycy1hcGkuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWN1cnNpdmVSZXNvdXJjZUVudW1lcmF0aW9uT2ZBbGxQYWNrYWdlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGludCBhY3R1YWxFbnRyaWVzID0gY291bnRKYXJFbnRyaWVzQnlQYXR0ZXJuKFBhdHRlcm4uY29tcGlsZSgiLipcXC4oY2xhc3N8cHJvcGVydGllc3x4bWwpIikpOworICAgICAgICBmaW5hbCBpbnQgc2Nhbm5lZEVudHJpZXMgPSBjb3VudEphckVudHJpZXNVc2luZ1NjYW5uZXIoIiIsIHRydWUpOworICAgICAgICBhc3NlcnRUaGF0KCJGYWlsZWQgdG8gZW51bWVyYXRlIGFsbCBjb250ZW50cyBvZiBqYXZheC53cy5ycy1hcGkiLCBzY2FubmVkRW50cmllcywgZXF1YWxUbyhhY3R1YWxFbnRyaWVzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVjdXJzaXZlQ2xhc3NFbnVtZXJhdGlvbldpdGhFeGlzdGFudFBhY2thZ2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBpbnQgYWN0dWFsRW50cmllcyA9IGNvdW50SmFyRW50cmllc0J5UGF0dGVybihQYXR0ZXJuLmNvbXBpbGUoImphdmF4L3dzL3JzLy4qXFwuY2xhc3MiKSk7CisgICAgICAgIGZpbmFsIGludCBzY2FubmVkRW50cmllcyA9IGNvdW50SmFyRW50cmllc1VzaW5nU2Nhbm5lcigiamF2YXgvd3MvcnMiLCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgiRmFpbGVkIHRvIGVudW1lcmF0ZSBhbGwgY29udGVudHMgb2YgamF2YXgud3MucnMtYXBpIiwgc2Nhbm5lZEVudHJpZXMsIGVxdWFsVG8oYWN0dWFsRW50cmllcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vblJlY3Vyc2l2ZUNsYXNzRW51bWVyYXRpb25XaXRoRXhpc3RhbnRQYWNrYWdlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgaW50IGFjdHVhbEVudHJpZXMgPSBjb3VudEphckVudHJpZXNCeVBhdHRlcm4oUGF0dGVybi5jb21waWxlKCJqYXZheC93cy9ycy9bXi9dKlxcLmNsYXNzIikpOworICAgICAgICBmaW5hbCBpbnQgc2Nhbm5lZEVudHJpZXMgPSBjb3VudEphckVudHJpZXNVc2luZ1NjYW5uZXIoImphdmF4L3dzL3JzIiwgZmFsc2UpOworICAgICAgICBhc3NlcnRUaGF0KCJGYWlsZWQgdG8gZW51bWVyYXRlIHBhY2thZ2UgJ2phdmF4LndzLnJzJyBvZiBqYXZheC53cy5ycy1hcGkiLCBzY2FubmVkRW50cmllcywgZXF1YWxUbyhhY3R1YWxFbnRyaWVzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVjdXJzaXZlQ2xhc3NFbnVtZXJhdGlvbldpdGhPcHRpb25hbFRyYWlsaW5nU2xhc2goKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBpbnQgc2Nhbm5lZEVudHJpZXNXaXRob3V0U2xhc2ggPSBjb3VudEphckVudHJpZXNVc2luZ1NjYW5uZXIoImphdmF4L3dzL3JzIiwgdHJ1ZSk7CisgICAgICAgIGZpbmFsIGludCBzY2FubmVkRW50cmllc1dpdGhTbGFzaCA9IGNvdW50SmFyRW50cmllc1VzaW5nU2Nhbm5lcigiamF2YXgvd3MvcnMvIiwgdHJ1ZSk7CisgICAgICAgIGFzc2VydFRoYXQoIkFkZGluZyBhIHRyYWlsaW5nIHNsYXNoIGluY29ycmVjdGx5IGFmZmVjdHMgcmVjdXJzaXZlIHNjYW5uaW5nIiwgc2Nhbm5lZEVudHJpZXNXaXRoU2xhc2gsCisgICAgICAgICAgICAgICAgZXF1YWxUbyhzY2FubmVkRW50cmllc1dpdGhvdXRTbGFzaCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vblJlY3Vyc2l2ZUNsYXNzRW51bWVyYXRpb25XaXRoT3B0aW9uYWxUcmFpbGluZ1NsYXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgaW50IHNjYW5uZWRFbnRyaWVzV2l0aG91dFNsYXNoID0gY291bnRKYXJFbnRyaWVzVXNpbmdTY2FubmVyKCJqYXZheC93cy9ycyIsIGZhbHNlKTsKKyAgICAgICAgZmluYWwgaW50IHNjYW5uZWRFbnRyaWVzV2l0aFNsYXNoID0gY291bnRKYXJFbnRyaWVzVXNpbmdTY2FubmVyKCJqYXZheC93cy9ycy8iLCBmYWxzZSk7CisgICAgICAgIGFzc2VydFRoYXQoIkFkZGluZyBhIHRyYWlsaW5nIHNsYXNoIGluY29ycmVjdGx5IGFmZmVjdHMgcmVjdXJzaXZlIHNjYW5uaW5nIiwgc2Nhbm5lZEVudHJpZXNXaXRoU2xhc2gsCisgICAgICAgICAgICAgICAgZXF1YWxUbyhzY2FubmVkRW50cmllc1dpdGhvdXRTbGFzaCkpOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGNvdW50SmFyRW50cmllc0J5UGF0dGVybihmaW5hbCBQYXR0ZXJuIHBhdHRlcm4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGludCBtYXRjaGluZ0VudHJpZXMgPSAwOworCisgICAgICAgIHRyeSAoZmluYWwgSmFyRmlsZSBqYXJGaWxlID0gbmV3IEphckZpbGUodGhpcy5qYXhSc0FwaVBhdGgpKSB7CisgICAgICAgICAgICBmaW5hbCBFbnVtZXJhdGlvbjxKYXJFbnRyeT4gZW50cmllcyA9IGphckZpbGUuZW50cmllcygpOworICAgICAgICAgICAgd2hpbGUgKGVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBKYXJFbnRyeSBlbnRyeSA9IGVudHJpZXMubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAocGF0dGVybi5tYXRjaGVyKGVudHJ5LmdldE5hbWUoKSkubWF0Y2hlcygpKSB7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoaW5nRW50cmllcysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtYXRjaGluZ0VudHJpZXM7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgY291bnRKYXJFbnRyaWVzVXNpbmdTY2FubmVyKGZpbmFsIFN0cmluZyBwYXJlbnQsIGZpbmFsIGJvb2xlYW4gcmVjdXJzaXZlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpbnQgc2Nhbm5lZEVudHJ5Q291bnQgPSAwOworCisgICAgICAgIHRyeSAoZmluYWwgSW5wdXRTdHJlYW0gamF4UnNBcGkgPSBuZXcgRmlsZUlucHV0U3RyZWFtKHRoaXMuamF4UnNBcGlQYXRoKSkgeworICAgICAgICAgICAgZmluYWwgSmFyRmlsZVNjYW5uZXIgamFyRmlsZVNjYW5uZXIgPSBuZXcgSmFyRmlsZVNjYW5uZXIoamF4UnNBcGksIHBhcmVudCwgcmVjdXJzaXZlKTsKKyAgICAgICAgICAgIHdoaWxlIChqYXJGaWxlU2Nhbm5lci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBGZXRjaCBuZXh0IGVudHJ5LgorICAgICAgICAgICAgICAgIGphckZpbGVTY2FubmVyLm5leHQoKTsKKworICAgICAgICAgICAgICAgIC8vIEpFUlNFWS0yMTc1IGFuZCBKRVJTRVktMjE5NzoKKyAgICAgICAgICAgICAgICAvLyBUaGlzIHRlc3QgZG9lc24ndCBhY3R1YWxseSBkbyBhbnl0aGluZyB3aXRoIHRoZSBpbnB1dCBzdHJlYW0sIGJ1dCBpdCBpcyBpbXBvcnRhbnQgdGhhdCBpdAorICAgICAgICAgICAgICAgIC8vIG9wZW4vY2xvc2UgdGhlIHN0cmVhbSB0byBzaW11bGF0ZSBhY3R1YWwgdXNhZ2UuICBUaGUgcmVwb3J0ZWQgZGVmZWN0IGlzIG9ubHkgZXhwb3NlZCBpZiB5b3UKKyAgICAgICAgICAgICAgICAvLyBjYWxsIG9wZW4vY2xvc2UgaW4gc29tZSBmYXNoaW9uLgorICAgICAgICAgICAgICAgIHRyeSAoZmluYWwgSW5wdXRTdHJlYW0gY2xhc3NTdHJlYW0gPSBqYXJGaWxlU2Nhbm5lci5vcGVuKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2Nhbm5lZEVudHJ5Q291bnQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc2Nhbm5lZEVudHJ5Q291bnQ7CisgICAgfQorCisgICAgQFRoZW9yeQorICAgIHB1YmxpYyB2b2lkIHRlc3RDbGFzc0VudW1lcmF0aW9uV2l0aE5vbmV4aXN0ZW50UGFja2FnZShmaW5hbCBib29sZWFuIHJlY3Vyc2l2ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IChmaW5hbCBJbnB1dFN0cmVhbSBqYXhSc0FwaSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0odGhpcy5qYXhSc0FwaVBhdGgpKSB7CisgICAgICAgICAgICBmaW5hbCBKYXJGaWxlU2Nhbm5lciBqYXJGaWxlU2Nhbm5lciA9IG5ldyBKYXJGaWxlU2Nhbm5lcihqYXhSc0FwaSwgImphdmF4L3dzL3IiLCByZWN1cnNpdmUpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoIlVuZXhwZWN0ZWRseSBmb3VuZCBwYWNrYWdlICdqYXZheC53cy5yJyBpbiBqYXZheC53cy5ycy1hcGkiLCBqYXJGaWxlU2Nhbm5lci5oYXNOZXh0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRoZW9yeQorICAgIHB1YmxpYyB2b2lkIHRlc3RDbGFzc0VudW1lcmF0aW9uV2l0aENsYXNzUHJlZml4KGZpbmFsIGJvb2xlYW4gcmVjdXJzaXZlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgKGZpbmFsIElucHV0U3RyZWFtIGpheFJzQXBpID0gbmV3IEZpbGVJbnB1dFN0cmVhbSh0aGlzLmpheFJzQXBpUGF0aCkpIHsKKyAgICAgICAgICAgIGZpbmFsIEphckZpbGVTY2FubmVyIGphckZpbGVTY2FubmVyID0gbmV3IEphckZpbGVTY2FubmVyKGpheFJzQXBpLCAiamF2YXgvd3MvcnMvR0UiLCByZWN1cnNpdmUpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoIlVuZXhwZWN0ZWRseSBmb3VuZCBwYWNrYWdlICdqYXZheC53cy5ycy5HRScgaW4gamF2YXgud3MucnMtYXBpIiwgamFyRmlsZVNjYW5uZXIuaGFzTmV4dCgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3NjYW5uaW5nL1BhY2thZ2VOYW1lc1NjYW5uZXJUZXN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9zY2FubmluZy9QYWNrYWdlTmFtZXNTY2FubmVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzYWFlMDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9zY2FubmluZy9QYWNrYWdlTmFtZXNTY2FubmVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTgyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5zY2FubmluZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS5uZXQuVVJMU3RyZWFtSGFuZGxlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5FbnVtZXJhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOworaW1wb3J0IGphdmEudXRpbC5qYXIuSmFySW5wdXRTdHJlYW07CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworaW1wb3J0IG1vY2tpdC5FeHBlY3RhdGlvbnM7CitpbXBvcnQgbW9ja2l0Lk1vY2tlZDsKK2ltcG9ydCBtb2NraXQuVmVyaWZpY2F0aW9uczsKKworLyoqCisgKiBVbml0IHRlc3RzIGZvciB7QGxpbmsgUGFja2FnZU5hbWVzU2Nhbm5lcn0uCisgKgorICogQGF1dGhvciBFcmljIE5hdmFycm8KKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgUGFja2FnZU5hbWVzU2Nhbm5lclRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gcGFja2FnZXMgPSB7ImphdmF4LndzLnJzIn07CisKKyAgICBwcml2YXRlIFN0cmluZyBqYXhSc0FwaVBhdGg7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGNsYXNzUGF0aCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5jbGFzcy5wYXRoIik7CisgICAgICAgIGZpbmFsIFN0cmluZ1tdIGVudHJpZXMgPSBjbGFzc1BhdGguc3BsaXQoU3lzdGVtLmdldFByb3BlcnR5KCJwYXRoLnNlcGFyYXRvciIpKTsKKworICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBlbnRyeSA6IGVudHJpZXMpIHsKKyAgICAgICAgICAgIGlmIChlbnRyeS5jb250YWlucygiamF2YXgud3MucnMtYXBpIikpIHsKKyAgICAgICAgICAgICAgICBqYXhSc0FwaVBhdGggPSBlbnRyeTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChqYXhSc0FwaVBhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgZmFpbCgiQ291bGQgbm90IGZpbmQgamF2YXgud3MucnMtYXBpLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V3NKYXJTY2hlbWUoKSB7CisgICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkIGF0IGxlYXN0IG9uZSBjbGFzcyB0byBiZSBmb3VuZC4iLAorICAgICAgICAgICAgICAgIG5ldyBQYWNrYWdlTmFtZXNTY2FubmVyKGNyZWF0ZVRlc3RDbGFzc0xvYWRlcigid3NqYXIiLCBjcmVhdGVUZXN0VVJMU3RyZWFtSGFuZGxlcigid3NqYXIiKSwgamF4UnNBcGlQYXRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VzLCBmYWxzZSkuaGFzTmV4dCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKYXJTY2hlbWUoKSB7CisgICAgICAgIC8vIFVzZXMgZGVmYXVsdCBjbGFzcyBsb2FkZXIKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgYXQgbGVhc3Qgb25lIGNsYXNzIHRvIGJlIGZvdW5kLiIsIG5ldyBQYWNrYWdlTmFtZXNTY2FubmVyKHBhY2thZ2VzLCBmYWxzZSkuaGFzTmV4dCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RaaXBTY2hlbWUoKSB7CisgICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkIGF0IGxlYXN0IG9uZSBjbGFzcyB0byBiZSBmb3VuZC4iLAorICAgICAgICAgICAgICAgIG5ldyBQYWNrYWdlTmFtZXNTY2FubmVyKGNyZWF0ZVRlc3RDbGFzc0xvYWRlcigiemlwIiwgY3JlYXRlVGVzdFVSTFN0cmVhbUhhbmRsZXIoInppcCIpLCBqYXhSc0FwaVBhdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZXMsIGZhbHNlKS5oYXNOZXh0KCkpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gUmVzb3VyY2VGaW5kZXJFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRTY2hlbWUoKSB7CisgICAgICAgIG5ldyBQYWNrYWdlTmFtZXNTY2FubmVyKGNyZWF0ZVRlc3RDbGFzc0xvYWRlcigiYmFkIiwgY3JlYXRlVGVzdFVSTFN0cmVhbUhhbmRsZXIoImJhZCIpLCBqYXhSc0FwaVBhdGgpLCBwYWNrYWdlcywgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJvZHVjZXIgZm9yIE9XTFMtMTk3OTA6IFdoZW4gc2Nhbm5lciBpcyByZXNldCB0aGUgdW5kZXJseWluZyBKQVIgaW5wdXQgc3RyZWFtcyBzaG91bGQgYmUgY2xvc2VkLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElucHV0U3RyZWFtQ2xvc2VkQWZ0ZXJSZXNldChATW9ja2VkIGZpbmFsIEphcklucHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFBhY2thZ2VOYW1lc1NjYW5uZXIgc2Nhbm5lcjEgPSBuZXcgUGFja2FnZU5hbWVzU2Nhbm5lcihuZXcgU3RyaW5nW10geyJqYXZheC53cy5ycyJ9LCBmYWxzZSk7CisgICAgICAgIGZpbmFsIFBhY2thZ2VOYW1lc1NjYW5uZXIgc2Nhbm5lcjIgPSBuZXcgUGFja2FnZU5hbWVzU2Nhbm5lcihuZXcgU3RyaW5nW10geyJqYXZheC53cy5ycy5jb3JlIn0sIGZhbHNlKTsKKyAgICAgICAgZmluYWwgUGFja2FnZU5hbWVzU2Nhbm5lciBzY2FubmVyMyA9IG5ldyBQYWNrYWdlTmFtZXNTY2FubmVyKG5ldyBTdHJpbmdbXSB7ImphdmF4LndzLnJzLmNsaWVudCJ9LCBmYWxzZSk7CisKKyAgICAgICAgc2Nhbm5lcjEucmVzZXQoKTsKKworICAgICAgICBzY2FubmVyMi5yZXNldCgpOworICAgICAgICBzY2FubmVyMi5yZXNldCgpOworCisgICAgICAgIHNjYW5uZXIzLnJlc2V0KCk7CisKKyAgICAgICAgbmV3IFZlcmlmaWNhdGlvbnMoKSB7eworICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICB0aW1lcyA9IDQ7CisgICAgICAgIH19OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJvZHVjZXIgZm9yIE9XTFMtMTk3OTA6IFdoZW4gc2Nhbm5lciBpcyBjbG9zZWQgdGhlIHVuZGVybHlpbmcgSkFSIGlucHV0IHN0cmVhbXMgc2hvdWxkIGJlIGNsb3NlZCBhcyB3ZWxsLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElucHV0U3RyZWFtQ2xvc2VkQWZ0ZXJDbG9zZShATW9ja2VkIGZpbmFsIEphcklucHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFBhY2thZ2VOYW1lc1NjYW5uZXIgc2Nhbm5lcjEgPSBuZXcgUGFja2FnZU5hbWVzU2Nhbm5lcihuZXcgU3RyaW5nW10geyJqYXZheC53cy5ycyJ9LCBmYWxzZSk7CisgICAgICAgIGZpbmFsIFBhY2thZ2VOYW1lc1NjYW5uZXIgc2Nhbm5lcjIgPSBuZXcgUGFja2FnZU5hbWVzU2Nhbm5lcihuZXcgU3RyaW5nW10geyJqYXZheC53cy5ycy5jb3JlIn0sIGZhbHNlKTsKKyAgICAgICAgZmluYWwgUGFja2FnZU5hbWVzU2Nhbm5lciBzY2FubmVyMyA9IG5ldyBQYWNrYWdlTmFtZXNTY2FubmVyKG5ldyBTdHJpbmdbXSB7ImphdmF4LndzLnJzLmNsaWVudCJ9LCBmYWxzZSk7CisKKyAgICAgICAgc2Nhbm5lcjEuY2xvc2UoKTsKKworICAgICAgICBzY2FubmVyMi5jbG9zZSgpOworICAgICAgICBzY2FubmVyMi5jbG9zZSgpOworCisgICAgICAgIHNjYW5uZXIzLmNsb3NlKCk7CisKKyAgICAgICAgbmV3IFZlcmlmaWNhdGlvbnMoKSB7eworICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICB0aW1lcyA9IDM7CisgICAgICAgIH19OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJvZHVjZXIgZm9yIE9XTFMtMTk3OTA6IFdoZW4gd2UgaXRlcmF0ZSB0aHJvdWdoIHRoZSBhbGwgZW50cmllcyBwcm92aWRlZCBieSBhIHNjYW5uZXIgSkFSIGlucHV0IHN0cmVhbSBzaG91bGQgYmUgY2xvc2VkLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElucHV0U3RyZWFtQ2xvc2VkQWZ0ZXJJdGVyYXRpb24oQE1vY2tlZCBmaW5hbCBKYXJJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBuZXcgRXhwZWN0YXRpb25zKCkge3sKKyAgICAgICAgICAgIHN0cmVhbS5nZXROZXh0SmFyRW50cnkoKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IG51bGw7CisgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgfX07CisKKyAgICAgICAgZmluYWwgUGFja2FnZU5hbWVzU2Nhbm5lciBzY2FubmVyID0gbmV3IFBhY2thZ2VOYW1lc1NjYW5uZXIobmV3IFN0cmluZ1tdIHsiamF2YXgud3MucnMifSwgZmFsc2UpOworCisgICAgICAgIHdoaWxlIChzY2FubmVyLmhhc05leHQoKSkgeworICAgICAgICAgICAgc2Nhbm5lci5uZXh0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIENsYXNzTG9hZGVyIGNyZWF0ZVRlc3RDbGFzc0xvYWRlcihmaW5hbCBTdHJpbmcgc2NoZW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFVSTFN0cmVhbUhhbmRsZXIgdXJsU3RyZWFtSGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVzb3VyY2VGaWxlUGF0aCkgeworICAgICAgICByZXR1cm4gbmV3IENsYXNzTG9hZGVyKCkgeworICAgICAgICAgICAgcHVibGljIEVudW1lcmF0aW9uPFVSTD4gZ2V0UmVzb3VyY2VzKGZpbmFsIFN0cmluZyBuYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8VVJMPiBsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICAgICAgbGlzdC5hZGQoKHVybFN0cmVhbUhhbmRsZXIgPT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IFVSTChudWxsLCBzY2hlbWUgKyAiOiIgKyByZXNvdXJjZUZpbGVQYXRoICsgIiEvIiArIG5hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgVVJMKG51bGwsIHNjaGVtZSArICI6IiArIHJlc291cmNlRmlsZVBhdGggKyAiIS8iICsgbmFtZSwgdXJsU3RyZWFtSGFuZGxlcikpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFZlY3Rvcjw+KGxpc3QpLmVsZW1lbnRzKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgLy8gVVJMU3RyZWFtSGFuZGxlciBjcmVhdGlvbiBmb3IgdGhlIHZhcmlvdXMgc2NoZW1lcyB3aXRob3V0IGhhdmluZyB0byBhZGQgdGhlbSBhcyBkZXBlbmRlbmNpZXMKKyAgICBwcml2YXRlIFVSTFN0cmVhbUhhbmRsZXIgY3JlYXRlVGVzdFVSTFN0cmVhbUhhbmRsZXIoZmluYWwgU3RyaW5nIHNjaGVtZSkgeworICAgICAgICByZXR1cm4gbmV3IFVSTFN0cmVhbUhhbmRsZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBVUkxDb25uZWN0aW9uIG9wZW5Db25uZWN0aW9uKGZpbmFsIFVSTCB1KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHBhcnNlVVJMKGZpbmFsIFVSTCB1LCBmaW5hbCBTdHJpbmcgc3BlYywgZmluYWwgaW50IHN0YXJ0LCBmaW5hbCBpbnQgbGltaXQpIHsKKyAgICAgICAgICAgICAgICBzZXRVUkwodSwgc2NoZW1lLCAiIiwgLTEsIG51bGwsIG51bGwsIHNwZWMuc3Vic3RyaW5nKHNjaGVtZS5sZW5ndGgoKSArIDEpLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9zY2FubmluZy9WRlNTY2hlbWVSZXNvdXJjZUZpbmRlclRlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL3NjYW5uaW5nL1ZGU1NjaGVtZVJlc291cmNlRmluZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MWFhMTcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9zY2FubmluZy9WRlNTY2hlbWVSZXNvdXJjZUZpbmRlclRlc3QuamF2YQpAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuc2Nhbm5pbmc7CisKK2ltcG9ydCBqYXZhLmlvLkNsb3NlYWJsZTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuamFyLkphckVudHJ5OworaW1wb3J0IGphdmEudXRpbC5qYXIuSmFyRmlsZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUZpbmRlcjsKKworaW1wb3J0IG9yZy5qYm9zcy52ZnMuVGVtcEZpbGVQcm92aWRlcjsKK2ltcG9ydCBvcmcuamJvc3MudmZzLlZGUzsKK2ltcG9ydCBvcmcuamJvc3MudmZzLlZpcnR1YWxGaWxlOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICogQGF1dGhvciBNYXJ0aW4gU255ZGVyCisgKiBAYXV0aG9yIEphc29uIFQuIEdyZWVuZQorICovCitwdWJsaWMgY2xhc3MgVkZTU2NoZW1lUmVzb3VyY2VGaW5kZXJUZXN0IHsKKworICAgIHByaXZhdGUgU3RyaW5nIGpheFJzQXBpUGF0aDsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgY2xhc3NQYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmNsYXNzLnBhdGgiKTsKKyAgICAgICAgZmluYWwgU3RyaW5nW10gZW50cmllcyA9IGNsYXNzUGF0aC5zcGxpdChTeXN0ZW0uZ2V0UHJvcGVydHkoInBhdGguc2VwYXJhdG9yIikpOworCisgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIGVudHJ5IDogZW50cmllcykgeworICAgICAgICAgICAgaWYgKGVudHJ5LmNvbnRhaW5zKCJqYXZheC53cy5ycy1hcGkiKSkgeworICAgICAgICAgICAgICAgIGpheFJzQXBpUGF0aCA9IGVudHJ5OworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGpheFJzQXBpUGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICBmYWlsKCJDb3VsZCBub3QgZmluZCBqYXZheC53cy5ycy1hcGkuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGNhc2UgZm9yIEpFUlNFWS0yMTk3LCBKRVJTRVktMjE3NS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbGFzc0VudW1lcmF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIENvdW50IGFjdHVhbCBlbnRyaWVzLgorCisgICAgICAgIGludCBhY3R1YWxFbnRyaWVzID0gMDsKKyAgICAgICAgdHJ5IChKYXJGaWxlIGphckZpbGUgPSBuZXcgSmFyRmlsZShqYXhSc0FwaVBhdGgpKSB7CisgICAgICAgICAgICBmaW5hbCBFbnVtZXJhdGlvbjxKYXJFbnRyeT4gZW50cmllcyA9IGphckZpbGUuZW50cmllcygpOworCisgICAgICAgICAgICB3aGlsZSAoZW50cmllcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIEphckVudHJ5IGVudHJ5ID0gZW50cmllcy5uZXh0RWxlbWVudCgpOworCisgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmdldE5hbWUoKS5lbmRzV2l0aCgiLmNsYXNzIikpIHsKKyAgICAgICAgICAgICAgICAgICAgYWN0dWFsRW50cmllcysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFNjYW4gZW50cmllcyB1c2luZyBWRlMgc2Nhbm5lci4KKyAgICAgICAgZmluYWwgVmlydHVhbEZpbGUgbW91bnREaXIgPSBWRlMuZ2V0Q2hpbGQoImNvbnRlbnQiKTsKKyAgICAgICAgU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZFNjaGVkdWxlZEV4ZWN1dG9yKCk7CisgICAgICAgIHRyeSAoVGVtcEZpbGVQcm92aWRlciBwcm92aWRlciA9IFRlbXBGaWxlUHJvdmlkZXIuY3JlYXRlKCJ0ZXN0IiwgZXhlY3V0b3IsIGZhbHNlKTsKKyAgICAgICAgICAgICBDbG9zZWFibGUgbW91bnQgPSBWRlMubW91bnRaaXAoVkZTLmdldENoaWxkKGpheFJzQXBpUGF0aCksIG1vdW50RGlyLCBwcm92aWRlcikpIHsKKworICAgICAgICAgICAgUmVzb3VyY2VGaW5kZXIgZmluZGVyID0gbmV3IFZmc1NjaGVtZVJlc291cmNlRmluZGVyRmFjdG9yeSgpCisgICAgICAgICAgICAgICAgICAgIC5jcmVhdGUobmV3IFVSSShtb3VudERpci50b1VSSSgpLnRvU3RyaW5nKCkgKyAiL2phdmF4L3dzL3JzIiksIHRydWUpOworCisgICAgICAgICAgICBpbnQgc2Nhbm5lZEVudHJ5Q291bnQgPSAwOworICAgICAgICAgICAgd2hpbGUgKGZpbmRlci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBGZXRjaCBuZXh0IGVudHJ5LgorICAgICAgICAgICAgICAgIGZpbmRlci5uZXh0KCk7CisKKyAgICAgICAgICAgICAgICAvLyBUaGlzIHRlc3QgZG9lc24ndCBhY3R1YWxseSBkbyBhbnl0aGluZyB3aXRoIHRoZSBpbnB1dCBzdHJlYW0sIGJ1dCBpdCBpcyBpbXBvcnRhbnQgdGhhdCBpdAorICAgICAgICAgICAgICAgIC8vIG9wZW4vY2xvc2UgdGhlIHN0cmVhbSB0byBzaW11bGF0ZSBhY3R1YWwgdXNhZ2UuICBUaGUgcmVwb3J0ZWQgZGVmZWN0IGlzIG9ubHkgZXhwb3NlZCBpZiB5b3UKKyAgICAgICAgICAgICAgICAvLyBjYWxsIG9wZW4vY2xvc2UgaW4gc29tZSBmYXNoaW9uLgorCisgICAgICAgICAgICAgICAgdHJ5IChJbnB1dFN0cmVhbSBjbGFzc1N0cmVhbSA9IGZpbmRlci5vcGVuKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2Nhbm5lZEVudHJ5Q291bnQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFzc2VydFRoYXQoIkZhaWxlZCB0byBlbnVtZXJhdGUgYWxsIGNvbnRlbnRzIG9mIGphdmF4LndzLnJzLWFwaS4iLCBzY2FubmVkRW50cnlDb3VudCwgZXF1YWxUbyhhY3R1YWxFbnRyaWVzKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBleGVjdXRvci5zaHV0ZG93bk5vdygpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvc29uYXIvU29uYXJKZXJzZXlTZXJ2ZXJUZXN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9zb25hci9Tb25hckplcnNleVNlcnZlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2IyMmEwCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvc29uYXIvU29uYXJKZXJzZXlTZXJ2ZXJUZXN0LmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuc29uYXI7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFNvbmFySmVyc2V5U2VydmVyVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVbml0VGVzdCgpIHsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygic2VydmVyIHVuaXQgdGVzdCIsIG5ldyBTb25hckplcnNleVNlcnZlcigpLnVuaXRUZXN0KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL0FjY2VwdEFubm90YXRlZFJlYWRlcldyaXRlclRlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL0FjY2VwdEFubm90YXRlZFJlYWRlcldyaXRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTBkYWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvQWNjZXB0QW5ub3RhdGVkUmVhZGVyV3JpdGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzM2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbDsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVxdWVzdENvbnRleHRCdWlsZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQWNjZXB0QW5ub3RhdGVkUmVhZGVyV3JpdGVyVGVzdCB7CisKKyAgICBwcml2YXRlIEFwcGxpY2F0aW9uSGFuZGxlciBjcmVhdGVBcHBsaWNhdGlvbihDbGFzczw/Pi4uLiBjbGFzc2VzKSB7CisgICAgICAgIHJldHVybiBuZXcgQXBwbGljYXRpb25IYW5kbGVyKG5ldyBSZXNvdXJjZUNvbmZpZyhjbGFzc2VzKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdHJpbmdXcmFwcGVyIHsKKworICAgICAgICBwdWJsaWMgU3RyaW5nIHM7CisKKyAgICAgICAgcHVibGljIFN0cmluZ1dyYXBwZXIoKSB7CisgICAgICAgICAgICAvLyBETyBOT1QgUkVNT1ZFOiB1c2VkIGJ5IFN0cmluZ1dyYXBwZXJXb3JrZXIucmVhZEZyb20KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmdXcmFwcGVyKFN0cmluZyBzKSB7CisgICAgICAgICAgICB0aGlzLnMgPSBzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3RyaW5nV3JhcHBlckZvbyBleHRlbmRzIFN0cmluZ1dyYXBwZXIgeworCisgICAgICAgIHB1YmxpYyBTdHJpbmdXcmFwcGVyRm9vKCkgeworICAgICAgICAgICAgLy8gRE8gTk9UIFJFTU9WRTogdXNlZCBieSBTdHJpbmdXcmFwcGVyV29ya2VyLnJlYWRGcm9tCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nV3JhcHBlckZvbyhTdHJpbmcgcykgeworICAgICAgICAgICAgc3VwZXIocyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN0cmluZ1dyYXBwZXJCYXIgZXh0ZW5kcyBTdHJpbmdXcmFwcGVyIHsKKworICAgICAgICBwdWJsaWMgU3RyaW5nV3JhcHBlckJhcigpIHsKKyAgICAgICAgICAgIC8vIERPIE5PVCBSRU1PVkU6IHVzZWQgYnkgU3RyaW5nV3JhcHBlcldvcmtlci5yZWFkRnJvbQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZ1dyYXBwZXJCYXIoU3RyaW5nIHMpIHsKKyAgICAgICAgICAgIHN1cGVyKHMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTElDQVRJT05fQkFSID0gImFwcGxpY2F0aW9uL2JhciI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTElDQVRJT05fRk9PID0gImFwcGxpY2F0aW9uL2ZvbyI7CisKKyAgICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIFN0cmluZ1dyYXBwZXJXb3JrZXI8VCBleHRlbmRzIFN0cmluZ1dyYXBwZXI+CisgICAgICAgICAgICBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5UmVhZGVyPFQ+LCBNZXNzYWdlQm9keVdyaXRlcjxUPiB7CisKKyAgICAgICAgQFByb3ZpZGVyCisgICAgICAgIEBQcm9kdWNlcyhBUFBMSUNBVElPTl9CQVIpCisgICAgICAgIEBDb25zdW1lcyhBUFBMSUNBVElPTl9CQVIpCisgICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQmFyU3RyaW5nV29ya2VyPFN0cmluZ1dyYXBwZXI+IGV4dGVuZHMgU3RyaW5nV3JhcHBlcldvcmtlciB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgTWVkaWFUeXBlIGdldE1lZGlhVHlwZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTWVkaWFUeXBlLnZhbHVlT2YoQVBQTElDQVRJT05fQkFSKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBTdHJpbmcgZ2V0UHJlZml4KCkgeworICAgICAgICAgICAgICAgIHJldHVybiAiYmFyOiAiOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQFByb3ZpZGVyCisgICAgICAgIEBQcm9kdWNlcyhBUFBMSUNBVElPTl9CQVIpCisgICAgICAgIEBDb25zdW1lcyhBUFBMSUNBVElPTl9CQVIpCisgICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQmFyQmFyU3RyaW5nV29ya2VyPFN0cmluZ1dyYXBwZXJCYXI+IGV4dGVuZHMgQmFyU3RyaW5nV29ya2VyIHsKKyAgICAgICAgfQorCisgICAgICAgIEBQcm92aWRlcgorICAgICAgICBAUHJvZHVjZXMoQVBQTElDQVRJT05fRk9PKQorICAgICAgICBAQ29uc3VtZXMoQVBQTElDQVRJT05fRk9PKQorICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZvb1N0cmluZ1dvcmtlcjxTdHJpbmdXcmFwcGVyPiBleHRlbmRzIFN0cmluZ1dyYXBwZXJXb3JrZXIgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIE1lZGlhVHlwZSBnZXRNZWRpYVR5cGUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE1lZGlhVHlwZS52YWx1ZU9mKEFQUExJQ0FUSU9OX0ZPTyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgU3RyaW5nIGdldFByZWZpeCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gImZvbzogIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBQcm92aWRlcgorICAgICAgICBAUHJvZHVjZXMoQVBQTElDQVRJT05fRk9PKQorICAgICAgICBAQ29uc3VtZXMoQVBQTElDQVRJT05fRk9PKQorICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZvb0Zvb1N0cmluZ1dvcmtlcjxTdHJpbmdXcmFwcGVyRm9vPiBleHRlbmRzIEZvb1N0cmluZ1dvcmtlciB7CisgICAgICAgIH0KKworICAgICAgICBhYnN0cmFjdCBNZWRpYVR5cGUgZ2V0TWVkaWFUeXBlKCk7CisKKyAgICAgICAgYWJzdHJhY3QgU3RyaW5nIGdldFByZWZpeCgpOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZSgKKyAgICAgICAgICAgICAgICBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBqYXZhQW5kTWVkaWFUeXBlS25vd24odHlwZSwgbWVkaWFUeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBqYXZhQW5kTWVkaWFUeXBlS25vd24oZmluYWwgQ2xhc3M8Pz4gY2xhenosIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIFN0cmluZyB3cmFwcGVyTmFtZSA9IGdldENsYXNzKCkuZ2V0VHlwZVBhcmFtZXRlcnMoKVswXS5nZXROYW1lKCk7CisgICAgICAgICAgICByZXR1cm4gY2xhenouZ2V0U2ltcGxlTmFtZSgpLmVxdWFscyh3cmFwcGVyTmFtZSkgJiYgZ2V0TWVkaWFUeXBlKCkuaXNDb21wYXRpYmxlKG1lZGlhVHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0U2l6ZSgKKyAgICAgICAgICAgICAgICBUIHQsCisgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gdHlwZSwKKyAgICAgICAgICAgICAgICBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbygKKyAgICAgICAgICAgICAgICBUIHQsCisgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gdHlwZSwKKyAgICAgICAgICAgICAgICBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFN0cmluZyBzID0gZ2V0UHJlZml4KCkgKyB0LnM7CisgICAgICAgICAgICBlbnRpdHlTdHJlYW0ud3JpdGUocy5nZXRCeXRlcygpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIGphdmFBbmRNZWRpYVR5cGVLbm93bih0eXBlLCBtZWRpYVR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBUIHJlYWRGcm9tKENsYXNzPFQ+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBUIHJlc3VsdCA9IHR5cGUubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICByZXN1bHQucyA9IHJlYWRTdHJpbmcoZW50aXR5U3RyZWFtKS5zdWJzdHJpbmcoZ2V0UHJlZml4KCkubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUd29HZXRNZXRob2RzUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZ1dyYXBwZXJGb28gZ2V0Rm9vKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdXcmFwcGVyRm9vKCIxc3QiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZ1dyYXBwZXJCYXIgZ2V0QmFyKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdXcmFwcGVyQmFyKCIybmQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFjY2VwdEdldCgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIEFwcGxpY2F0aW9uSGFuZGxlciBhcHAgPSBjcmVhdGVBcHBsaWNhdGlvbihUd29HZXRNZXRob2RzUmVzb3VyY2UuY2xhc3MsIFN0cmluZ1dyYXBwZXJXb3JrZXIuRm9vRm9vU3RyaW5nV29ya2VyLmNsYXNzLAorICAgICAgICAgICAgICAgIFN0cmluZ1dyYXBwZXJXb3JrZXIuQmFyQmFyU3RyaW5nV29ya2VyLmNsYXNzKTsKKworICAgICAgICBfdGVzdChhcHAsICJmb286IDFzdCIsICJHRVQiLCBudWxsLCBudWxsLCAiYXBwbGljYXRpb24vZm9vIik7CisgICAgICAgIF90ZXN0KGFwcCwgImZvbzogMXN0IiwgIkdFVCIsIG51bGwsIG51bGwsICJhcHBsaWNhdGlvbi9iYXI7cT0wLjgiLCAiYXBwbGljYXRpb24vZm9vIik7CisgICAgICAgIF90ZXN0KGFwcCwgImJhcjogMm5kIiwgIkdFVCIsIG51bGwsIG51bGwsICJhcHBsaWNhdGlvbi9iYXI7cT0wLjUiLCAiYXBwbGljYXRpb24vZm9vO3E9MC4yIik7CisgICAgICAgIF90ZXN0KGFwcCwgImZvbzogMXN0IiwgIkdFVCIsIG51bGwsIG51bGwsICJhcHBsY2F0aW9uL2JheiIsICJhcHBsaWNhdGlvbi9mb287cT0wLjgiKTsKKyAgICAgICAgX3Rlc3QoYXBwLCAiYmFyOiAybmQiLCAiR0VUIiwgbnVsbCwgbnVsbCwgImFwcGxpY2F0aW9uL2JhciIpOworICAgICAgICBfdGVzdChhcHAsICJiYXI6IDJuZCIsICJHRVQiLCBudWxsLCBudWxsLCAiYXBwbGljYXRpb24vZm9vO3E9MC44IiwgImFwcGxpY2F0aW9uL2JhciIpOworICAgICAgICBfdGVzdChhcHAsICJiYXI6IDJuZCIsICJHRVQiLCBudWxsLCBudWxsLCAiYXBwbGNhdGlvbi9iYXoiLCAiYXBwbGljYXRpb24vYmFyO3E9MC44Iik7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2luZ2xlR2V0TWV0aG9kUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZ1dyYXBwZXIgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdXcmFwcGVyKCJjb250ZW50Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVNZXRob2RBY2NlcHRHZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBmaW5hbCBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwID0gY3JlYXRlQXBwbGljYXRpb24oU2luZ2xlR2V0TWV0aG9kUmVzb3VyY2UuY2xhc3MsIFN0cmluZ1dyYXBwZXJXb3JrZXIuRm9vU3RyaW5nV29ya2VyLmNsYXNzLAorICAgICAgICAgICAgICAgIFN0cmluZ1dyYXBwZXJXb3JrZXIuQmFyU3RyaW5nV29ya2VyLmNsYXNzKTsKKworICAgICAgICBfdGVzdChhcHAsICJmb286IGNvbnRlbnQiLCAiR0VUIiwgbnVsbCwgbnVsbCwgImFwcGxpY2F0aW9uL2ZvbyIpOworICAgICAgICBfdGVzdChhcHAsICJmb286IGNvbnRlbnQiLCAiR0VUIiwgbnVsbCwgbnVsbCwgImFwcGxpY2F0aW9uL2JhcjtxPTAuNSwgYXBwbGljYXRpb24vZm9vIik7CisgICAgICAgIF90ZXN0KGFwcCwgImZvbzogY29udGVudCIsICJHRVQiLCBudWxsLCBudWxsLCAiYXBwbGNhdGlvbi9iYXosIGFwcGxpY2F0aW9uL2ZvbztxPTAuOCIpOworICAgICAgICBfdGVzdChhcHAsICJiYXI6IGNvbnRlbnQiLCAiR0VUIiwgbnVsbCwgbnVsbCwgImFwcGxpY2F0aW9uL2JhciIpOworICAgICAgICBfdGVzdChhcHAsICJiYXI6IGNvbnRlbnQiLCAiR0VUIiwgbnVsbCwgbnVsbCwgImFwcGxpY2F0aW9uL2ZvbztxPTAuNSwgYXBwbGljYXRpb24vYmFyIik7CisgICAgICAgIF90ZXN0KGFwcCwgImJhcjogY29udGVudCIsICJHRVQiLCBudWxsLCBudWxsLCAiYXBwbGNhdGlvbi9iYXosIGFwcGxpY2F0aW9uL2JhcjtxPTAuOCIpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE11bHRpcGxlUG9zdE1ldGhvZFJlc291cmNlIHsKKworICAgICAgICBAQ29udGV4dAorICAgICAgICBIdHRwSGVhZGVycyBodHRwSGVhZGVyczsKKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nV3JhcHBlckJhciBwb3N0Rm9vMkJhcihTdHJpbmdXcmFwcGVyRm9vIGZvbykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcHBsaWNhdGlvbi9mb28iLCBodHRwSGVhZGVycy5nZXRNZWRpYVR5cGUoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nV3JhcHBlckJhcihmb28ucyk7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nV3JhcHBlckJhciBwb3N0QmFyMkJhcihTdHJpbmdXcmFwcGVyQmFyIGJhcikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcHBsaWNhdGlvbi9iYXIiLCBodHRwSGVhZGVycy5nZXRNZWRpYVR5cGUoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nV3JhcHBlckJhcihiYXIucyk7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nV3JhcHBlckZvbyBwb3N0QmFyMkZvbyhTdHJpbmdXcmFwcGVyQmFyIGJhcikgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcHBsaWNhdGlvbi9iYXIiLCBodHRwSGVhZGVycy5nZXRNZWRpYVR5cGUoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nV3JhcHBlckZvbyhiYXIucyk7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nV3JhcHBlckZvbyBwb3N0Rm9vMkZvbyhTdHJpbmdXcmFwcGVyRm9vIGZvbykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcHBsaWNhdGlvbi9mb28iLCBodHRwSGVhZGVycy5nZXRNZWRpYVR5cGUoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nV3JhcHBlckZvbyhmb28ucyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVNZXRob2RDb25zdW1lc1Byb2R1Y2VzUG9zdCgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uSGFuZGxlciBhcHAgPSBjcmVhdGVBcHBsaWNhdGlvbihNdWx0aXBsZVBvc3RNZXRob2RSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBTdHJpbmdXcmFwcGVyV29ya2VyLkZvb0Zvb1N0cmluZ1dvcmtlci5jbGFzcywgU3RyaW5nV3JhcHBlcldvcmtlci5CYXJCYXJTdHJpbmdXb3JrZXIuY2xhc3MpOworCisgICAgICAgIF90ZXN0KGFwcCwgImZvbzogZm9vIiwgIlBPU1QiLCBuZXcgU3RyaW5nV3JhcHBlckZvbygiZm9vIiksIEFQUExJQ0FUSU9OX0ZPTywgQVBQTElDQVRJT05fRk9PKTsKKyAgICAgICAgX3Rlc3QoYXBwLCAiZm9vOiBiYXIiLCAiUE9TVCIsIG5ldyBTdHJpbmdXcmFwcGVyQmFyKCJiYXIiKSwgQVBQTElDQVRJT05fQkFSLCBBUFBMSUNBVElPTl9GT08pOworICAgICAgICBfdGVzdChhcHAsICJiYXI6IGZvbyIsICJQT1NUIiwgbmV3IFN0cmluZ1dyYXBwZXJGb28oImZvbyIpLCBBUFBMSUNBVElPTl9GT08sIEFQUExJQ0FUSU9OX0JBUik7CisgICAgICAgIF90ZXN0KGFwcCwgImJhcjogYmFyIiwgIlBPU1QiLCBuZXcgU3RyaW5nV3JhcHBlckJhcigiYmFyIiksIEFQUExJQ0FUSU9OX0JBUiwgQVBQTElDQVRJT05fQkFSKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3QoQXBwbGljYXRpb25IYW5kbGVyIGFwcCwgU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgbWV0aG9kLCBPYmplY3QgZW50aXR5LCBTdHJpbmcgbWVkaWFUeXBlLCBTdHJpbmcuLi4gYWNjZXB0KQorICAgICAgICAgICAgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIgcmVxdWVzdENvbnRleHRCdWlsZGVyID0gUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8iLCBtZXRob2QpOworICAgICAgICBpZiAoZW50aXR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0QnVpbGRlci5lbnRpdHkoZW50aXR5KS50eXBlKG1lZGlhVHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgQ29udGFpbmVyUmVxdWVzdCByZXF1ZXN0Q29udGV4dCA9IHJlcXVlc3RDb250ZXh0QnVpbGRlci5hY2NlcHQoYWNjZXB0KS5idWlsZCgpOworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKworICAgICAgICBmaW5hbCBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGFwcC5hcHBseShyZXF1ZXN0Q29udGV4dCwgYmFvcykuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgZXF1YWxUbyhSZXNwb25zZS5TdGF0dXMuT0suZ2V0U3RhdHVzQ29kZSgpKSk7CisgICAgICAgIGFzc2VydFRoYXQoYmFvcy50b1N0cmluZygpLCBlcXVhbFRvKGV4cGVjdGVkKSk7CisgICAgfQorCisgICAgc3RhdGljIFN0cmluZyByZWFkU3RyaW5nKElucHV0U3RyZWFtIGlzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbMjA0OF07CisgICAgICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgaW50IGk7CisgICAgICAgIHdoaWxlICgoaSA9IGlzLnJlYWQoYnVmZmVyKSkgPiAtMSkgeworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChuZXcgU3RyaW5nKGJ1ZmZlciwgMCwgaSkpOworICAgICAgICB9CisgICAgICAgIGlzLmNsb3NlKCk7CisgICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9BY2NlcHRRc1Rlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL0FjY2VwdFFzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZTEwM2MKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9BY2NlcHRRc1Rlc3QuamF2YQpAQCAtMCwwICsxLDUzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWw7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuSW5mbGVjdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXF1ZXN0Q29udGV4dEJ1aWxkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhaworICovCitwdWJsaWMgY2xhc3MgQWNjZXB0UXNUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN0cmluZ1JldHVybmluZ0luZmxlY3RvciBpbXBsZW1lbnRzIEluZmxlY3RvcjxDb250YWluZXJSZXF1ZXN0Q29udGV4dCwgUmVzcG9uc2U+IHsKKworICAgICAgICBTdHJpbmcgZW50aXR5OworCisgICAgICAgIFN0cmluZ1JldHVybmluZ0luZmxlY3RvcihTdHJpbmcgZW50aXR5KSB7CisgICAgICAgICAgICB0aGlzLmVudGl0eSA9IGVudGl0eTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgYXBwbHkoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgZGF0YSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKGVudGl0eSkuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgQXBwbGljYXRpb25IYW5kbGVyIGNyZWF0ZUFwcGxpY2F0aW9uKENsYXNzPD8+Li4uIGNsYXNzZXMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIobmV3IFJlc291cmNlQ29uZmlnKGNsYXNzZXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEluZmxlY3RvcjxDb250YWluZXJSZXF1ZXN0Q29udGV4dCwgUmVzcG9uc2U+IHN0cmluZ1Jlc3BvbnNlKFN0cmluZyBzKSB7CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nUmV0dXJuaW5nSW5mbGVjdG9yKHMpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RSZXNvdXJjZSB7CisKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mb287cXM9MC40IikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0Rm9vKCkgeworICAgICAgICAgICAgcmV0dXJuICJmb28iOworICAgICAgICB9CisKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9iYXI7cXM9MC41IikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0QmFyKCkgeworICAgICAgICAgICAgcmV0dXJuICJiYXIiOworICAgICAgICB9CisKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9iYXoiKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRCYXooKSB7CisgICAgICAgICAgICByZXR1cm4gImJheiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBY2NlcHRHZXREZWNsYXJhdGl2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBydW5UZXN0QWNjZXB0R2V0KGNyZWF0ZUFwcGxpY2F0aW9uKFRlc3RSZXNvdXJjZS5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFjY2VwdEdldFByb2dyYW1tYXRpYygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNvdXJjZS5CdWlsZGVyIHJiID0gUmVzb3VyY2UuYnVpbGRlcigiLyIpOworCisgICAgICAgIHJiLmFkZE1ldGhvZCgiR0VUIikucHJvZHVjZXMoTWVkaWFUeXBlLnZhbHVlT2YoImFwcGxpY2F0aW9uL2Zvbztxcz0wLjQiKSkuaGFuZGxlZEJ5KHN0cmluZ1Jlc3BvbnNlKCJmb28iKSk7CisgICAgICAgIHJiLmFkZE1ldGhvZCgiR0VUIikucHJvZHVjZXMoTWVkaWFUeXBlLnZhbHVlT2YoImFwcGxpY2F0aW9uL2Jhcjtxcz0wLjUiKSkuaGFuZGxlZEJ5KHN0cmluZ1Jlc3BvbnNlKCJiYXIiKSk7CisgICAgICAgIHJiLmFkZE1ldGhvZCgiR0VUIikucHJvZHVjZXMoTWVkaWFUeXBlLnZhbHVlT2YoImFwcGxpY2F0aW9uL2JheiIpKS5oYW5kbGVkQnkoc3RyaW5nUmVzcG9uc2UoImJheiIpKTsKKworICAgICAgICBSZXNvdXJjZUNvbmZpZyByYyA9IG5ldyBSZXNvdXJjZUNvbmZpZygpOworICAgICAgICByYy5yZWdpc3RlclJlc291cmNlcyhyYi5idWlsZCgpKTsKKyAgICAgICAgcnVuVGVzdEFjY2VwdEdldChuZXcgQXBwbGljYXRpb25IYW5kbGVyKHJjKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJ1blRlc3RBY2NlcHRHZXQoQXBwbGljYXRpb25IYW5kbGVyIGFwcCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIHMgPSAoU3RyaW5nKSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8iLCAiR0VUIikuYWNjZXB0KCJhcHBsaWNhdGlvbi9mb28iKS5idWlsZCgpKS5nZXQoKS5nZXRFbnRpdHkoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCBzKTsKKworICAgICAgICBzID0gKFN0cmluZykgYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvIiwgIkdFVCIpLmFjY2VwdCgiYXBwbGljYXRpb24vZm9vO3E9MC4xIikuYnVpbGQoKSkuZ2V0KCkuZ2V0RW50aXR5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwgcyk7CisKKyAgICAgICAgcyA9IChTdHJpbmcpIGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJHRVQiKQorICAgICAgICAgICAgICAgIC5hY2NlcHQoImFwcGxpY2F0aW9uL2ZvbyIsICJhcHBsaWNhdGlvbi9iYXI7cT0wLjQiLCAiYXBwbGljYXRpb24vYmF6O3E9MC4yIikuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuZ2V0KCkuZ2V0RW50aXR5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwgcyk7CisKKyAgICAgICAgcyA9IChTdHJpbmcpIGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJHRVQiKQorICAgICAgICAgICAgICAgIC5hY2NlcHQoImFwcGxpY2F0aW9uL2ZvbztxPTAuNCIsICJhcHBsaWNhdGlvbi9iYXI7cT0wLjQiLCAiYXBwbGljYXRpb24vYmF6O3E9MC4yIikuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuZ2V0KCkuZ2V0RW50aXR5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYmFyIiwgcyk7CisKKyAgICAgICAgcyA9IChTdHJpbmcpIGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJHRVQiKQorICAgICAgICAgICAgICAgIC5hY2NlcHQoImFwcGxpY2F0aW9uL2ZvbyIsICJhcHBsaWNhdGlvbi9iYXIiLCAiYXBwbGljYXRpb24vYmF6O3E9MC42IikuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuZ2V0KCkuZ2V0RW50aXR5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYmFyIiwgcyk7CisKKyAgICAgICAgcyA9IChTdHJpbmcpIGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJHRVQiKQorICAgICAgICAgICAgICAgIC5hY2NlcHQoImFwcGxpY2F0aW9uL2ZvbztxPTAuNCIsICJhcHBsaWNhdGlvbi9iYXIiLCAiYXBwbGljYXRpb24vYmF6O3E9MC4yIikuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuZ2V0KCkuZ2V0RW50aXR5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYmFyIiwgcyk7CisKKyAgICAgICAgcyA9IChTdHJpbmcpIGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJHRVQiKQorICAgICAgICAgICAgICAgIC5hY2NlcHQoImFwcGxpY2F0aW9uL2ZvbztxPTAuNCIsICJhcHBsaWNhdGlvbi9iYXI7cT0wLjIiLCAiYXBwbGljYXRpb24vYmF6IikuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuZ2V0KCkuZ2V0RW50aXR5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYmF6Iiwgcyk7CisKKyAgICAgICAgcyA9IChTdHJpbmcpIGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJHRVQiKQorICAgICAgICAgICAgICAgIC5hY2NlcHQoImFwcGxpY2F0aW9uL2ZvbztxPTAuNCIsICJhcHBsaWNhdGlvbi9iYXI7cT0wLjIiLCAiYXBwbGljYXRpb24vYmF6O3E9MC40IikuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuZ2V0KCkuZ2V0RW50aXR5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYmF6Iiwgcyk7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXVsdGlwbGVSZXNvdXJjZSB7CisKKyAgICAgICAgQFByb2R1Y2VzKHsiYXBwbGljYXRpb24vZm9vO3FzPTAuNSIsICJhcHBsaWNhdGlvbi9iYXIifSkKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiR0VUIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFjY2VwdE11bHRpcGxlRGVjbGFyYXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcnVuVGVzdEFjY2VwdE11bHRpcGxlKGNyZWF0ZUFwcGxpY2F0aW9uKE11bHRpcGxlUmVzb3VyY2UuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBY2NlcHRNdWx0aXBsZVByb2dyYW1tYXRpYygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNvdXJjZS5CdWlsZGVyIHJiID0gUmVzb3VyY2UuYnVpbGRlcigiLyIpOworICAgICAgICByYi5hZGRNZXRob2QoIkdFVCIpLnByb2R1Y2VzKE1lZGlhVHlwZS52YWx1ZU9mKCJhcHBsaWNhdGlvbi9mb287cXM9MC41IiksIE1lZGlhVHlwZS52YWx1ZU9mKCJhcHBsaWNhdGlvbi9iYXIiKSkKKyAgICAgICAgICAgICAgICAuaGFuZGxlZEJ5KHN0cmluZ1Jlc3BvbnNlKCJHRVQiKSk7CisgICAgICAgIFJlc291cmNlQ29uZmlnIHJjID0gbmV3IFJlc291cmNlQ29uZmlnKCk7CisgICAgICAgIHJjLnJlZ2lzdGVyUmVzb3VyY2VzKHJiLmJ1aWxkKCkpOworICAgICAgICBydW5UZXN0QWNjZXB0TXVsdGlwbGUobmV3IEFwcGxpY2F0aW9uSGFuZGxlcihyYykpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBydW5UZXN0QWNjZXB0TXVsdGlwbGUoQXBwbGljYXRpb25IYW5kbGVyIGFwcCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgTWVkaWFUeXBlIGZvbyA9IE1lZGlhVHlwZS52YWx1ZU9mKCJhcHBsaWNhdGlvbi9mb28iKTsKKyAgICAgICAgTWVkaWFUeXBlIGJhciA9IE1lZGlhVHlwZS52YWx1ZU9mKCJhcHBsaWNhdGlvbi9iYXIiKTsKKworICAgICAgICBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJHRVQiKS5hY2NlcHQoZm9vKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU3RhdHVzOiAiICsgcmVzcG9uc2UuZ2V0U3RhdHVzKCksIHJlc3BvbnNlLmdldFN0YXR1cygpIDwgMzAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJHRVQiLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmb28sIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKworICAgICAgICByZXNwb25zZSA9IGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJHRVQiKS5hY2NlcHQoYmFyKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU3RhdHVzOiAiICsgcmVzcG9uc2UuZ2V0U3RhdHVzKCksIHJlc3BvbnNlLmdldFN0YXR1cygpIDwgMzAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJHRVQiLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhiYXIsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKworICAgICAgICByZXNwb25zZSA9IGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJHRVQiKS5hY2NlcHQoIiovKiIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRUcnVlKCJTdGF0dXM6ICIgKyByZXNwb25zZS5nZXRTdGF0dXMoKSwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkgPCAzMDApOworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGJhciwgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkpOworCisgICAgICAgIHJlc3BvbnNlID0gYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvIiwgIkdFVCIpLmFjY2VwdCgiYXBwbGljYXRpb24vKiIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRUcnVlKCJTdGF0dXM6ICIgKyByZXNwb25zZS5nZXRTdGF0dXMoKSwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkgPCAzMDApOworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGJhciwgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkpOworCisgICAgICAgIHJlc3BvbnNlID0gYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvIiwgIkdFVCIpLmFjY2VwdCgiYXBwbGljYXRpb24vZm9vO3E9MC4xIiwgImFwcGxpY2F0aW9uL2JhciIpLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmdldCgpOworICAgICAgICBhc3NlcnRUcnVlKCJTdGF0dXM6ICIgKyByZXNwb25zZS5nZXRTdGF0dXMoKSwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkgPCAzMDApOworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGJhciwgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkpOworCisgICAgICAgIHJlc3BvbnNlID0gYXBwCisgICAgICAgICAgICAgICAgLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvIiwgIkdFVCIpLmFjY2VwdCgiYXBwbGljYXRpb24vZm9vO3E9MC41IiwgImFwcGxpY2F0aW9uL2JhcjtxPTAuMSIpLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmdldCgpOworICAgICAgICBhc3NlcnRUcnVlKCJTdGF0dXM6ICIgKyByZXNwb25zZS5nZXRTdGF0dXMoKSwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkgPCAzMDApOworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZvbywgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN1YlR5cGVSZXNvdXJjZSB7CisKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0Lyo7cXM9MC41IikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFdpbGRjYXJkKCkgeworICAgICAgICAgICAgcmV0dXJuICIqIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbjtxcz0wLjYiKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGxhaW4oKSB7CisgICAgICAgICAgICByZXR1cm4gInBsYWluIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9odG1sO3FzPTAuNyIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRYbWwoKSB7CisgICAgICAgICAgICByZXR1cm4gImh0bWwiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWNjZXB0U3ViVHlwZURlY2xhcmF0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJ1blRlc3RBY2NlcHRTdWJUeXBlKGNyZWF0ZUFwcGxpY2F0aW9uKFN1YlR5cGVSZXNvdXJjZS5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFjY2VwdFN1YlR5cGVQcm9ncmFtbWF0aWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2UuQnVpbGRlciByYiA9IFJlc291cmNlLmJ1aWxkZXIoIi8iKTsKKworICAgICAgICByYi5hZGRNZXRob2QoIkdFVCIpLnByb2R1Y2VzKE1lZGlhVHlwZS52YWx1ZU9mKCJ0ZXh0Lyo7cXM9MC41IikpLmhhbmRsZWRCeShzdHJpbmdSZXNwb25zZSgiKiIpKTsKKyAgICAgICAgcmIuYWRkTWV0aG9kKCJHRVQiKS5wcm9kdWNlcyhNZWRpYVR5cGUudmFsdWVPZigidGV4dC9wbGFpbjtxcz0wLjYiKSkuaGFuZGxlZEJ5KHN0cmluZ1Jlc3BvbnNlKCJwbGFpbiIpKTsKKyAgICAgICAgcmIuYWRkTWV0aG9kKCJHRVQiKS5wcm9kdWNlcyhNZWRpYVR5cGUudmFsdWVPZigidGV4dC9odG1sO3FzPTAuNyIpKS5oYW5kbGVkQnkoc3RyaW5nUmVzcG9uc2UoImh0bWwiKSk7CisKKyAgICAgICAgUmVzb3VyY2VDb25maWcgcmMgPSBuZXcgUmVzb3VyY2VDb25maWcoKTsKKyAgICAgICAgcmMucmVnaXN0ZXJSZXNvdXJjZXMocmIuYnVpbGQoKSk7CisgICAgICAgIHJ1blRlc3RBY2NlcHRTdWJUeXBlKG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIocmMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcnVuVGVzdEFjY2VwdFN1YlR5cGUoQXBwbGljYXRpb25IYW5kbGVyIGFwcCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8iLCAiR0VUIikuYWNjZXB0KCJ0ZXh0L3BsYWluIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRydWUoIlN0YXR1czogIiArIHJlc3BvbnNlLmdldFN0YXR1cygpLCByZXNwb25zZS5nZXRTdGF0dXMoKSA8IDMwMCk7CisgICAgICAgIGFzc2VydEVxdWFscygicGxhaW4iLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8iLCAiR0VUIikuYWNjZXB0KCJpbWFnZS9wbmcsIHRleHQvcGxhaW47cT0wLjQiKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU3RhdHVzOiAiICsgcmVzcG9uc2UuZ2V0U3RhdHVzKCksIHJlc3BvbnNlLmdldFN0YXR1cygpIDwgMzAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwbGFpbiIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKworICAgICAgICByZXNwb25zZSA9IGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJHRVQiKS5hY2NlcHQoInRleHQvcGxhaW47cT0wLjUsIHRleHQvaHRtbCIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRUcnVlKCJTdGF0dXM6ICIgKyByZXNwb25zZS5nZXRTdGF0dXMoKSwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkgPCAzMDApOworICAgICAgICBhc3NlcnRFcXVhbHMoImh0bWwiLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUuVEVYVF9IVE1MX1RZUEUsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKworICAgICAgICByZXNwb25zZSA9IGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJHRVQiKS5hY2NlcHQoInRleHQvcGxhaW4sIHRleHQvaHRtbDtxPTAuNSIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRUcnVlKCJTdGF0dXM6ICIgKyByZXNwb25zZS5nZXRTdGF0dXMoKSwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkgPCAzMDApOworICAgICAgICBhc3NlcnRFcXVhbHMoInBsYWluIiwgcmVzcG9uc2UuZ2V0RW50aXR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSwgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkpOworCisgICAgICAgIHJlc3BvbnNlID0gYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvIiwgIkdFVCIpLmFjY2VwdCgidGV4dC9odG1sO3E9MC41IikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRydWUoIlN0YXR1czogIiArIHJlc3BvbnNlLmdldFN0YXR1cygpLCByZXNwb25zZS5nZXRTdGF0dXMoKSA8IDMwMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiaHRtbCIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS5URVhUX0hUTUxfVFlQRSwgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkpOworCisgICAgICAgIHJlc3BvbnNlID0gYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvIiwgIkdFVCIpLmFjY2VwdCgidGV4dC8qO3E9MC41LCB0ZXh0L3BsYWluO3E9MC42IikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRydWUoIlN0YXR1czogIiArIHJlc3BvbnNlLmdldFN0YXR1cygpLCByZXNwb25zZS5nZXRTdGF0dXMoKSA8IDMwMCk7CisgICAgICAgIGFzc2VydEVxdWFscygicGxhaW4iLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8iLCAiR0VUIikuYWNjZXB0KCJ0ZXh0L3BsYWluO3E9MC41LCB0ZXh0L2dhZ2E7cT0wLjYiKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU3RhdHVzOiAiICsgcmVzcG9uc2UuZ2V0U3RhdHVzKCksIHJlc3BvbnNlLmdldFN0YXR1cygpIDwgMzAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqIiwgcmVzcG9uc2UuZ2V0RW50aXR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFUeXBlLnZhbHVlT2YoInRleHQvZ2FnYSIpLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8iLCAiR0VUIikuYWNjZXB0KCJ0ZXh0L2dhZ2EsIHRleHQvcGxhaW4iKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU3RhdHVzOiAiICsgcmVzcG9uc2UuZ2V0U3RhdHVzKCksIHJlc3BvbnNlLmdldFN0YXR1cygpIDwgMzAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwbGFpbiIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS52YWx1ZU9mKCJ0ZXh0L3BsYWluIiksIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdWJUeXBlUmVzb3VyY2VOb3RJbnR1aXRpdmUgeworCisgICAgICAgIEBQcm9kdWNlcygidGV4dC8qO3FzPTAuOSIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRXaWxkY2FyZCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiKiI7CisgICAgICAgIH0KKworICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW47cXM9MC43IikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFBsYWluKCkgeworICAgICAgICAgICAgcmV0dXJuICJwbGFpbiI7CisgICAgICAgIH0KKworICAgICAgICBAUHJvZHVjZXMoInRleHQvaHRtbDtxcz0wLjUiKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0WG1sKCkgeworICAgICAgICAgICAgcmV0dXJuICJodG1sIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFjY2VwdFN1YlR5cGVOb3RJbnR1aXRpdmVEZWNsYXJhdGl2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBydW5UZXN0QWNjZXB0U3ViVHlwZU5vdEludHVpdGl2ZShjcmVhdGVBcHBsaWNhdGlvbihTdWJUeXBlUmVzb3VyY2VOb3RJbnR1aXRpdmUuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBY2NlcHRTdWJUeXBlTm90SW50dWl0aXZlUHJvZ3JhbW1hdGljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc291cmNlLkJ1aWxkZXIgcmIgPSBSZXNvdXJjZS5idWlsZGVyKCIvIik7CisKKyAgICAgICAgcmIuYWRkTWV0aG9kKCJHRVQiKS5wcm9kdWNlcyhNZWRpYVR5cGUudmFsdWVPZigidGV4dC8qO3FzPTAuOSIpKS5oYW5kbGVkQnkoc3RyaW5nUmVzcG9uc2UoIioiKSk7CisgICAgICAgIHJiLmFkZE1ldGhvZCgiR0VUIikucHJvZHVjZXMoTWVkaWFUeXBlLnZhbHVlT2YoInRleHQvcGxhaW47cXM9MC43IikpLmhhbmRsZWRCeShzdHJpbmdSZXNwb25zZSgicGxhaW4iKSk7CisgICAgICAgIHJiLmFkZE1ldGhvZCgiR0VUIikucHJvZHVjZXMoTWVkaWFUeXBlLnZhbHVlT2YoInRleHQvaHRtbDtxcz0wLjUiKSkuaGFuZGxlZEJ5KHN0cmluZ1Jlc3BvbnNlKCJodG1sIikpOworCisgICAgICAgIFJlc291cmNlQ29uZmlnIHJjID0gbmV3IFJlc291cmNlQ29uZmlnKCk7CisgICAgICAgIHJjLnJlZ2lzdGVyUmVzb3VyY2VzKHJiLmJ1aWxkKCkpOworICAgICAgICBydW5UZXN0QWNjZXB0U3ViVHlwZU5vdEludHVpdGl2ZShuZXcgQXBwbGljYXRpb25IYW5kbGVyKHJjKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJ1blRlc3RBY2NlcHRTdWJUeXBlTm90SW50dWl0aXZlKEFwcGxpY2F0aW9uSGFuZGxlciBhcHApIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvIiwgIkdFVCIpLmFjY2VwdCgidGV4dC9wbGFpbiIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRUcnVlKCJTdGF0dXM6ICIgKyByZXNwb25zZS5nZXRTdGF0dXMoKSwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkgPCAzMDApOworICAgICAgICBhc3NlcnRFcXVhbHMoIioiLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8iLCAiR0VUIikuYWNjZXB0KCJpbWFnZS9wbmcsIHRleHQvcGxhaW4iKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU3RhdHVzOiAiICsgcmVzcG9uc2UuZ2V0U3RhdHVzKCksIHJlc3BvbnNlLmdldFN0YXR1cygpIDwgMzAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqIiwgcmVzcG9uc2UuZ2V0RW50aXR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSwgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkpOworCisgICAgICAgIHJlc3BvbnNlID0gYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvIiwgIkdFVCIpLmFjY2VwdCgidGV4dC9wbGFpbjtxPTAuNSwgdGV4dC9odG1sIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRydWUoIlN0YXR1czogIiArIHJlc3BvbnNlLmdldFN0YXR1cygpLCByZXNwb25zZS5nZXRTdGF0dXMoKSA8IDMwMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiKiIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS5URVhUX0hUTUxfVFlQRSwgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkpOworCisgICAgICAgIHJlc3BvbnNlID0gYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvIiwgIkdFVCIpLmFjY2VwdCgidGV4dC9wbGFpbiwgdGV4dC9odG1sO3E9MC41IikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRydWUoIlN0YXR1czogIiArIHJlc3BvbnNlLmdldFN0YXR1cygpLCByZXNwb25zZS5nZXRTdGF0dXMoKSA8IDMwMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiKiIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKworICAgICAgICByZXNwb25zZSA9IGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJHRVQiKS5hY2NlcHQoInRleHQvaHRtbDtxPTAuNSIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRUcnVlKCJTdGF0dXM6ICIgKyByZXNwb25zZS5nZXRTdGF0dXMoKSwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkgPCAzMDApOworICAgICAgICBhc3NlcnRFcXVhbHMoIioiLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUuVEVYVF9IVE1MX1RZUEUsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKworICAgICAgICByZXNwb25zZSA9IGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJHRVQiKS5hY2NlcHQoInRleHQvKjtxPTAuNSwgdGV4dC9wbGFpbjtxPTAuNiIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRUcnVlKCJTdGF0dXM6ICIgKyByZXNwb25zZS5nZXRTdGF0dXMoKSwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkgPCAzMDApOworICAgICAgICBhc3NlcnRFcXVhbHMoIioiLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8iLCAiR0VUIikuYWNjZXB0KCJ0ZXh0L3BsYWluO3E9MC41LCB0ZXh0L2dhZ2E7cT0wLjYiKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU3RhdHVzOiAiICsgcmVzcG9uc2UuZ2V0U3RhdHVzKCksIHJlc3BvbnNlLmdldFN0YXR1cygpIDwgMzAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqIiwgcmVzcG9uc2UuZ2V0RW50aXR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFUeXBlLnZhbHVlT2YoInRleHQvZ2FnYSIpLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8iLCAiR0VUIikuYWNjZXB0KCJ0ZXh0L2dhZ2EsIHRleHQvcGxhaW4iKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU3RhdHVzOiAiICsgcmVzcG9uc2UuZ2V0U3RhdHVzKCksIHJlc3BvbnNlLmdldFN0YXR1cygpIDwgMzAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqIiwgcmVzcG9uc2UuZ2V0RW50aXR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFUeXBlLnZhbHVlT2YoInRleHQvZ2FnYSIpLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8iLCAiR0VUIikuYWNjZXB0KCJ0ZXh0LyoiKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU3RhdHVzOiAiICsgcmVzcG9uc2UuZ2V0U3RhdHVzKCksIHJlc3BvbnNlLmdldFN0YXR1cygpIDwgMzAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwbGFpbiIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKworICAgICAgICByZXNwb25zZSA9IGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJHRVQiKS5hY2NlcHQoInRleHQvKjtxPTAuNSwgdGV4dC9odG1sO3E9MC4xIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRydWUoIlN0YXR1czogIiArIHJlc3BvbnNlLmdldFN0YXR1cygpLCByZXNwb25zZS5nZXRTdGF0dXMoKSA8IDMwMCk7CisgICAgICAgIGFzc2VydEVxdWFscygicGxhaW4iLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKSk7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTm9Qcm9kdWNlc1Jlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJHRVQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWNjZXB0Tm9Qcm9kdWNlc0RlY2xhcmF0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJ1blRlc3RBY2NlcHROb1Byb2R1Y2VzKGNyZWF0ZUFwcGxpY2F0aW9uKE5vUHJvZHVjZXNSZXNvdXJjZS5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFjY2VwdE5vUHJvZHVjZXNQcm9ncmFtbWF0aWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2UuQnVpbGRlciByYiA9IFJlc291cmNlLmJ1aWxkZXIoIi8iKTsKKyAgICAgICAgcmIuYWRkTWV0aG9kKCJHRVQiKS5oYW5kbGVkQnkoc3RyaW5nUmVzcG9uc2UoIkdFVCIpKTsKKworICAgICAgICBSZXNvdXJjZUNvbmZpZyByYyA9IG5ldyBSZXNvdXJjZUNvbmZpZygpOworICAgICAgICByYy5yZWdpc3RlclJlc291cmNlcyhyYi5idWlsZCgpKTsKKyAgICAgICAgcnVuVGVzdEFjY2VwdE5vUHJvZHVjZXMobmV3IEFwcGxpY2F0aW9uSGFuZGxlcihyYykpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBydW5UZXN0QWNjZXB0Tm9Qcm9kdWNlcyhBcHBsaWNhdGlvbkhhbmRsZXIgYXBwKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBtZWRpYSB0eXBlIG9yZGVyIGluIHRoZSBhY2NlcHQgaGVhZGVyIGRvZXMgbm90IGltcG9zZSBvdXRwdXQgbWVkaWEgdHlwZSEKKyAgICAgICAgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBhcHAKKyAgICAgICAgICAgICAgICAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8iLCAiR0VUIikuYWNjZXB0KCJpbWFnZS9wbmcsIHRleHQvcGxhaW47cT0wLjkiKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU3RhdHVzOiAiICsgcmVzcG9uc2UuZ2V0U3RhdHVzKCksIHJlc3BvbnNlLmdldFN0YXR1cygpIDwgMzAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJHRVQiLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUudmFsdWVPZigiaW1hZ2UvcG5nIiksIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKworICAgICAgICByZXNwb25zZSA9IGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJHRVQiKS5hY2NlcHQoInRleHQvcGxhaW47cT0wLjUsIHRleHQvaHRtbCIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRUcnVlKCJTdGF0dXM6ICIgKyByZXNwb25zZS5nZXRTdGF0dXMoKSwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkgPCAzMDApOworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS5URVhUX0hUTUxfVFlQRSwgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFByb2R1Y2VzT25lTWV0aG9kRm9vQmFyUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKHsiYXBwbGljYXRpb24vZm9vO3FzPTAuMSIsICJhcHBsaWNhdGlvbi9iYXIifSkKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gIkZPT0JBUiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9kdWNlc09uZU1ldGhvZEZvb0JhclJlc291cmNlRGVjbGFyYXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcnVuVGVzdEZvb0JhcihjcmVhdGVBcHBsaWNhdGlvbihQcm9kdWNlc09uZU1ldGhvZEZvb0JhclJlc291cmNlLmNsYXNzKSwgIkZPT0JBUiIsICJGT09CQVIiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9kdWNlc09uZU1ldGhvZEZvb0JhclJlc291cmNlUHJvZ3JhbW1hdGljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc291cmNlLkJ1aWxkZXIgcmIgPSBSZXNvdXJjZS5idWlsZGVyKCIvIik7CisgICAgICAgIHJiLmFkZE1ldGhvZCgiR0VUIikucHJvZHVjZXMoTWVkaWFUeXBlLnZhbHVlT2YoImFwcGxpY2F0aW9uL2Zvbztxcz0wLjEiKSwgTWVkaWFUeXBlLnZhbHVlT2YoImFwcGxpY2F0aW9uL2JhciIpKQorICAgICAgICAgICAgICAgIC5oYW5kbGVkQnkoc3RyaW5nUmVzcG9uc2UoIkZPT0JBUiIpKTsKKyAgICAgICAgUmVzb3VyY2VDb25maWcgcmMgPSBuZXcgUmVzb3VyY2VDb25maWcoKTsKKyAgICAgICAgcmMucmVnaXN0ZXJSZXNvdXJjZXMocmIuYnVpbGQoKSk7CisgICAgICAgIHJ1blRlc3RGb29CYXIobmV3IEFwcGxpY2F0aW9uSGFuZGxlcihyYyksICJGT09CQVIiLCAiRk9PQkFSIik7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHJvZHVjZXNUd29NZXRob2RzRm9vQmFyUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mb287cXM9MC4xIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRGb28oKSB7CisgICAgICAgICAgICByZXR1cm4gIkZPTyI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYmFyIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRCYXIoKSB7CisgICAgICAgICAgICByZXR1cm4gIkJBUiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9kdWNlc1R3b01ldGhvZHNGb29CYXJSZXNvdXJjZVByb2dyYW1tYXRpYygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNvdXJjZS5CdWlsZGVyIHJiID0gUmVzb3VyY2UuYnVpbGRlcigiLyIpOworCisgICAgICAgIHJiLmFkZE1ldGhvZCgiR0VUIikucHJvZHVjZXMoTWVkaWFUeXBlLnZhbHVlT2YoImFwcGxpY2F0aW9uL2Zvbztxcz0wLjEiKSkuaGFuZGxlZEJ5KHN0cmluZ1Jlc3BvbnNlKCJGT08iKSk7CisgICAgICAgIHJiLmFkZE1ldGhvZCgiR0VUIikucHJvZHVjZXMoTWVkaWFUeXBlLnZhbHVlT2YoImFwcGxpY2F0aW9uL2JhciIpKS5oYW5kbGVkQnkoc3RyaW5nUmVzcG9uc2UoIkJBUiIpKTsKKworICAgICAgICBSZXNvdXJjZUNvbmZpZyByYyA9IG5ldyBSZXNvdXJjZUNvbmZpZygpOworICAgICAgICByYy5yZWdpc3RlclJlc291cmNlcyhyYi5idWlsZCgpKTsKKyAgICAgICAgcnVuVGVzdEZvb0JhcihuZXcgQXBwbGljYXRpb25IYW5kbGVyKHJjKSwgIkZPTyIsICJCQVIiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9kdWNlc1R3b01ldGhvZHNGb29CYXJSZXNvdXJjZURlY2xhcmF0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJ1blRlc3RGb29CYXIoY3JlYXRlQXBwbGljYXRpb24oUHJvZHVjZXNUd29NZXRob2RzRm9vQmFyUmVzb3VyY2UuY2xhc3MpLCAiRk9PIiwgIkJBUiIpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFByb2R1Y2VzVHdvTWV0aG9kc0JhckZvb1Jlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYmFyIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRCYXIoKSB7CisgICAgICAgICAgICByZXR1cm4gIkJBUiI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZm9vO3FzPTAuMSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9vKCkgeworICAgICAgICAgICAgcmV0dXJuICJGT08iOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvZHVjZXNUd29NZXRob2RzQmFyRm9vUmVzb3VyY2VQcm9ncmFtbWF0aWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2UuQnVpbGRlciByYiA9IFJlc291cmNlLmJ1aWxkZXIoIi8iKTsKKworICAgICAgICByYi5hZGRNZXRob2QoIkdFVCIpLnByb2R1Y2VzKE1lZGlhVHlwZS52YWx1ZU9mKCJhcHBsaWNhdGlvbi9iYXIiKSkuaGFuZGxlZEJ5KHN0cmluZ1Jlc3BvbnNlKCJCQVIiKSk7CisgICAgICAgIHJiLmFkZE1ldGhvZCgiR0VUIikucHJvZHVjZXMoTWVkaWFUeXBlLnZhbHVlT2YoImFwcGxpY2F0aW9uL2Zvbztxcz0wLjEiKSkuaGFuZGxlZEJ5KHN0cmluZ1Jlc3BvbnNlKCJGT08iKSk7CisKKyAgICAgICAgUmVzb3VyY2VDb25maWcgcmMgPSBuZXcgUmVzb3VyY2VDb25maWcoKTsKKyAgICAgICAgcmMucmVnaXN0ZXJSZXNvdXJjZXMocmIuYnVpbGQoKSk7CisgICAgICAgIHJ1blRlc3RGb29CYXIobmV3IEFwcGxpY2F0aW9uSGFuZGxlcihyYyksICJGT08iLCAiQkFSIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvZHVjZXNUd29NZXRob2RzQmFyRm9vUmVzb3VyY2VEZWNsYXJhdGl2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBydW5UZXN0Rm9vQmFyKGNyZWF0ZUFwcGxpY2F0aW9uKFByb2R1Y2VzVHdvTWV0aG9kc0JhckZvb1Jlc291cmNlLmNsYXNzKSwgIkZPTyIsICJCQVIiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcnVuVGVzdEZvb0JhcihBcHBsaWNhdGlvbkhhbmRsZXIgYXBwLCBTdHJpbmcgZm9vQ29udGVudCwgU3RyaW5nIGJhckNvbnRlbnQpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvIiwgIkdFVCIpLmFjY2VwdCgiYXBwbGljYXRpb24vZm9vIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRydWUoIlN0YXR1czogIiArIHJlc3BvbnNlLmdldFN0YXR1cygpLCByZXNwb25zZS5nZXRTdGF0dXMoKSA8IDMwMCk7CisgICAgICAgIGFzc2VydEVxdWFscyhmb29Db250ZW50LCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUudmFsdWVPZigiYXBwbGljYXRpb24vZm9vIiksIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKworICAgICAgICByZXNwb25zZSA9IGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJHRVQiKS5hY2NlcHQoImFwcGxpY2F0aW9uL2JhciIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRUcnVlKCJTdGF0dXM6ICIgKyByZXNwb25zZS5nZXRTdGF0dXMoKSwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkgPCAzMDApOworICAgICAgICBhc3NlcnRFcXVhbHMoYmFyQ29udGVudCwgcmVzcG9uc2UuZ2V0RW50aXR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFUeXBlLnZhbHVlT2YoImFwcGxpY2F0aW9uL2JhciIpLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8iLCAiR0VUIikuYWNjZXB0KCJhcHBsaWNhdGlvbi9mb28iLCAiYXBwbGljYXRpb24vYmFyO3E9MC41IikuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuZ2V0KCk7CisgICAgICAgIGFzc2VydFRydWUoIlN0YXR1czogIiArIHJlc3BvbnNlLmdldFN0YXR1cygpLCByZXNwb25zZS5nZXRTdGF0dXMoKSA8IDMwMCk7CisgICAgICAgIGFzc2VydEVxdWFscyhmb29Db250ZW50LCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUudmFsdWVPZigiYXBwbGljYXRpb24vZm9vIiksIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKworICAgICAgICByZXNwb25zZSA9IGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJHRVQiKS5hY2NlcHQoImFwcGxpY2F0aW9uL2JhciIsICJhcHBsaWNhdGlvbi9mb287cT0wLjUiKS5idWlsZCgpKQorICAgICAgICAgICAgICAgIC5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU3RhdHVzOiAiICsgcmVzcG9uc2UuZ2V0U3RhdHVzKCksIHJlc3BvbnNlLmdldFN0YXR1cygpIDwgMzAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGJhckNvbnRlbnQsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS52YWx1ZU9mKCJhcHBsaWNhdGlvbi9iYXIiKSwgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL0FjY2VwdFRlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL0FjY2VwdFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2YzNmE4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvQWNjZXB0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMzM4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVxdWVzdENvbnRleHRCdWlsZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIFRha2VuIGZyb20gSmVyc2V5IDE6IGplcnNleS10ZXN0czpjb20uc3VuLmplcnNleS5pbXBsLnJlc291cmNlLkFjY2VwdFRlc3QuamF2YQorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqLworcHVibGljIGNsYXNzIEFjY2VwdFRlc3QgeworCisgICAgQXBwbGljYXRpb25IYW5kbGVyIGFwcGxpY2F0aW9uOworCisgICAgcHJpdmF0ZSBBcHBsaWNhdGlvbkhhbmRsZXIgY3JlYXRlQXBwbGljYXRpb24oQ2xhc3M8Pz4uLi4gY2xhc3NlcykgeworICAgICAgICByZXR1cm4gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihuZXcgUmVzb3VyY2VDb25maWcoY2xhc3NlcykpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2ZvbyIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldEZvbygpIHsKKyAgICAgICAgICAgIHJldHVybiAiZm9vIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYmFyIikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0QmFyKCkgeworICAgICAgICAgICAgcmV0dXJuICJiYXIiOworICAgICAgICB9CisKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9iYXoiKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRCYXooKSB7CisgICAgICAgICAgICByZXR1cm4gImJheiI7CisgICAgICAgIH0KKworICAgICAgICBAUHJvZHVjZXMoIiovKiIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGRvR2V0V2lsZENhcmQoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soIndpbGRjYXJkIiwgImFwcGxpY2F0aW9uL3dpbGRjYXJkIikuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFjY2VwdEdldCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwID0gY3JlYXRlQXBwbGljYXRpb24oUmVzb3VyY2UuY2xhc3MpOworCisgICAgICAgIFN0cmluZyBzID0gKFN0cmluZykgYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvIiwgIkdFVCIpLmFjY2VwdCgiYXBwbGljYXRpb24vZm9vIikuYnVpbGQoKSkuZ2V0KCkuZ2V0RW50aXR5KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwgcyk7CisKKyAgICAgICAgcyA9IChTdHJpbmcpIGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJHRVQiKS5hY2NlcHQoImFwcGxpY2F0aW9uL2ZvbztxPTAuMSIpLmJ1aWxkKCkpLmdldCgpLmdldEVudGl0eSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsIHMpOworCisgICAgICAgIHMgPSAoU3RyaW5nKSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8iLCAiR0VUIikKKyAgICAgICAgICAgICAgICAuYWNjZXB0KCJhcHBsaWNhdGlvbi9mb28iLCAiYXBwbGljYXRpb24vYmFyO3E9MC40IiwgImFwcGxpY2F0aW9uL2JhejtxPTAuMiIpLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmdldCgpLmdldEVudGl0eSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsIHMpOworCisgICAgICAgIHMgPSAoU3RyaW5nKSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8iLCAiR0VUIikKKyAgICAgICAgICAgICAgICAuYWNjZXB0KCJhcHBsaWNhdGlvbi9mb287cT0wLjQiLCAiYXBwbGljYXRpb24vYmFyIiwgImFwcGxpY2F0aW9uL2JhejtxPTAuMiIpLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmdldCgpLmdldEVudGl0eSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImJhciIsIHMpOworCisgICAgICAgIHMgPSAoU3RyaW5nKSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8iLCAiR0VUIikKKyAgICAgICAgICAgICAgICAuYWNjZXB0KCJhcHBsaWNhdGlvbi9mb287cT0wLjQiLCAiYXBwbGljYXRpb24vYmFyO3E9MC4yIiwgImFwcGxpY2F0aW9uL2JheiIpLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmdldCgpLmdldEVudGl0eSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImJheiIsIHMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFjY2VwdEdldFdpbGRDYXJkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEFwcGxpY2F0aW9uSGFuZGxlciBhcHAgPSBjcmVhdGVBcHBsaWNhdGlvbihSZXNvdXJjZS5jbGFzcyk7CisKKyAgICAgICAgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBhcHAKKyAgICAgICAgICAgICAgICAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8iLCAiR0VUIikuYWNjZXB0KCJhcHBsaWNhdGlvbi93aWxkY2FyZCIsICJhcHBsaWNhdGlvbi9mb287cT0wLjYiLAorICAgICAgICAgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL2JhcjtxPTAuNCIsICJhcHBsaWNhdGlvbi9iYXo7cT0wLjIiKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU3RhdHVzOiAiICsgcmVzcG9uc2UuZ2V0U3RhdHVzKCksIHJlc3BvbnNlLmdldFN0YXR1cygpIDwgMzAwKTsKKworICAgICAgICBTdHJpbmcgcyA9IChTdHJpbmcpIHJlc3BvbnNlLmdldEVudGl0eSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIndpbGRjYXJkIiwgcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UXVhbGl0eUVycm9yR3JlYXRlclRoYW5PbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQXBwbGljYXRpb25IYW5kbGVyIGFwcCA9IGNyZWF0ZUFwcGxpY2F0aW9uKFJlc291cmNlLmNsYXNzKTsKKworICAgICAgICBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJHRVQiKS5hY2NlcHQoImFwcGxpY2F0aW9uL2ZvbztxPTEuMSIpLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UXVhbGl0eUVycm9yTW9yZVRoYW5UaHJlZURpZ2l0cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwID0gY3JlYXRlQXBwbGljYXRpb24oUmVzb3VyY2UuY2xhc3MpOworCisgICAgICAgIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvIiwgIkdFVCIpLmFjY2VwdCgiYXBwbGljYXRpb24vZm9vO3E9MC4xMjM0IikuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNdWx0aXBsZVJlc291cmNlIHsKKworICAgICAgICBAUHJvZHVjZXMoeyJhcHBsaWNhdGlvbi9mb28iLCAiYXBwbGljYXRpb24vYmFyIn0pCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gIkdFVCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBY2NlcHRNdWx0aXBsZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwID0gY3JlYXRlQXBwbGljYXRpb24oTXVsdGlwbGVSZXNvdXJjZS5jbGFzcyk7CisKKyAgICAgICAgTWVkaWFUeXBlIGZvbyA9IE1lZGlhVHlwZS52YWx1ZU9mKCJhcHBsaWNhdGlvbi9mb28iKTsKKyAgICAgICAgTWVkaWFUeXBlIGJhciA9IE1lZGlhVHlwZS52YWx1ZU9mKCJhcHBsaWNhdGlvbi9iYXIiKTsKKworICAgICAgICBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJHRVQiKS5hY2NlcHQoZm9vKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU3RhdHVzOiAiICsgcmVzcG9uc2UuZ2V0U3RhdHVzKCksIHJlc3BvbnNlLmdldFN0YXR1cygpIDwgMzAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJHRVQiLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmb28sIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKworICAgICAgICByZXNwb25zZSA9IGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJHRVQiKS5hY2NlcHQoYmFyKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU3RhdHVzOiAiICsgcmVzcG9uc2UuZ2V0U3RhdHVzKCksIHJlc3BvbnNlLmdldFN0YXR1cygpIDwgMzAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJHRVQiLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhiYXIsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKworICAgICAgICByZXNwb25zZSA9IGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJHRVQiKS5hY2NlcHQoIiovKiIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRUcnVlKCJTdGF0dXM6ICIgKyByZXNwb25zZS5nZXRTdGF0dXMoKSwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkgPCAzMDApOworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZvbywgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkpOworCisgICAgICAgIHJlc3BvbnNlID0gYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvIiwgIkdFVCIpLmFjY2VwdCgiYXBwbGljYXRpb24vKiIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRUcnVlKCJTdGF0dXM6ICIgKyByZXNwb25zZS5nZXRTdGF0dXMoKSwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkgPCAzMDApOworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZvbywgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkpOworCisgICAgICAgIHJlc3BvbnNlID0gYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvIiwgIkdFVCIpLmFjY2VwdCgiYXBwbGljYXRpb24vZm9vO3E9MC4xIiwgImFwcGxpY2F0aW9uL2JhciIpLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmdldCgpOworICAgICAgICBhc3NlcnRUcnVlKCJTdGF0dXM6ICIgKyByZXNwb25zZS5nZXRTdGF0dXMoKSwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkgPCAzMDApOworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGJhciwgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkpOworCisgICAgICAgIHJlc3BvbnNlID0gYXBwCisgICAgICAgICAgICAgICAgLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvIiwgIkdFVCIpLmFjY2VwdCgiYXBwbGljYXRpb24vZm9vO3E9MC41IiwgImFwcGxpY2F0aW9uL2JhcjtxPTAuMSIpLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmdldCgpOworICAgICAgICBhc3NlcnRUcnVlKCJTdGF0dXM6ICIgKyByZXNwb25zZS5nZXRTdGF0dXMoKSwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkgPCAzMDApOworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZvbywgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFjY2VwdE11bHRpcGxlMigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwID0gY3JlYXRlQXBwbGljYXRpb24oTXVsdGlwbGVSZXNvdXJjZS5jbGFzcyk7CisKKyAgICAgICAgTWVkaWFUeXBlIGZvbyA9IE1lZGlhVHlwZS52YWx1ZU9mKCJhcHBsaWNhdGlvbi9mb28iKTsKKworICAgICAgICBDb250YWluZXJSZXNwb25zZSByZXNwb25zZTsKKworICAgICAgICByZXNwb25zZSA9IGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJHRVQiKS5hY2NlcHQoIiovKiIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRUcnVlKCJTdGF0dXM6ICIgKyByZXNwb25zZS5nZXRTdGF0dXMoKSwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkgPCAzMDApOworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZvbywgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN1YlR5cGVSZXNvdXJjZSB7CisKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0LyoiKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJHRVQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWNjZXB0U3ViVHlwZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwID0gY3JlYXRlQXBwbGljYXRpb24oU3ViVHlwZVJlc291cmNlLmNsYXNzKTsKKworICAgICAgICBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJHRVQiKS5hY2NlcHQoInRleHQvcGxhaW4iKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU3RhdHVzOiAiICsgcmVzcG9uc2UuZ2V0U3RhdHVzKCksIHJlc3BvbnNlLmdldFN0YXR1cygpIDwgMzAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJHRVQiLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8iLCAiR0VUIikuYWNjZXB0KCJpbWFnZS9wbmcsIHRleHQvcGxhaW4iKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU3RhdHVzOiAiICsgcmVzcG9uc2UuZ2V0U3RhdHVzKCksIHJlc3BvbnNlLmdldFN0YXR1cygpIDwgMzAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJHRVQiLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8iLCAiR0VUIikuYWNjZXB0KCJ0ZXh0L3BsYWluO3E9MC41LCB0ZXh0L2h0bWwiKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU3RhdHVzOiAiICsgcmVzcG9uc2UuZ2V0U3RhdHVzKCksIHJlc3BvbnNlLmdldFN0YXR1cygpIDwgMzAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJHRVQiLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUuVEVYVF9IVE1MX1RZUEUsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKworICAgICAgICByZXNwb25zZSA9IGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJHRVQiKS5hY2NlcHQoInRleHQvcGxhaW47cT0wLjUiKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU3RhdHVzOiAiICsgcmVzcG9uc2UuZ2V0U3RhdHVzKCksIHJlc3BvbnNlLmdldFN0YXR1cygpIDwgMzAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJHRVQiLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKSk7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTm9Qcm9kdWNlc1Jlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJHRVQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWNjZXB0Tm9Qcm9kdWNlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwID0gY3JlYXRlQXBwbGljYXRpb24oTm9Qcm9kdWNlc1Jlc291cmNlLmNsYXNzKTsKKworICAgICAgICAvLyBtZWRpYSB0eXBlIG9yZGVyIGluIHRoZSBhY2NlcHQgaGVhZGVyIGRvZXMgbm90IGltcG9zZSBvdXRwdXQgbWVkaWEgdHlwZSEKKyAgICAgICAgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBhcHAKKyAgICAgICAgICAgICAgICAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8iLCAiR0VUIikuYWNjZXB0KCJpbWFnZS9wbmcsIHRleHQvcGxhaW47cT0wLjkiKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU3RhdHVzOiAiICsgcmVzcG9uc2UuZ2V0U3RhdHVzKCksIHJlc3BvbnNlLmdldFN0YXR1cygpIDwgMzAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJHRVQiLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUudmFsdWVPZigiaW1hZ2UvcG5nIiksIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKworICAgICAgICByZXNwb25zZSA9IGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJHRVQiKS5hY2NlcHQoInRleHQvcGxhaW47cT0wLjUsIHRleHQvaHRtbCIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRUcnVlKCJTdGF0dXM6ICIgKyByZXNwb25zZS5nZXRTdGF0dXMoKSwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkgPCAzMDApOworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS5URVhUX0hUTUxfVFlQRSwgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFByb2R1Y2VzT25lTWV0aG9kRm9vQmFyUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKHsiYXBwbGljYXRpb24vZm9vIiwgImFwcGxpY2F0aW9uL2JhciJ9KQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiR0VUIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByb2R1Y2VzT25lTWV0aG9kRm9vQmFyUmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdChQcm9kdWNlc09uZU1ldGhvZEZvb0JhclJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQcm9kdWNlc1R3b01ldGhvZHNGb29CYXJSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2ZvbyIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9vKCkgeworICAgICAgICAgICAgcmV0dXJuICJHRVQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2JhciIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmFyKCkgeworICAgICAgICAgICAgcmV0dXJuICJHRVQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvZHVjZXNUd29NZXRob2RzRm9vQmFyUmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdChQcm9kdWNlc1R3b01ldGhvZHNGb29CYXJSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHJvZHVjZXNUd29NZXRob2RzQmFyRm9vUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9iYXIiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEJhcigpIHsKKyAgICAgICAgICAgIHJldHVybiAiR0VUIjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mb28iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEZvbygpIHsKKyAgICAgICAgICAgIHJldHVybiAiR0VUIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByb2R1Y2VzVHdvTWV0aG9kc0JhckZvb1Jlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3QoUHJvZHVjZXNUd29NZXRob2RzQmFyRm9vUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0KENsYXNzPD8+IGMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwID0gY3JlYXRlQXBwbGljYXRpb24oYyk7CisKKyAgICAgICAgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8iLCAiR0VUIikuYWNjZXB0KCJhcHBsaWNhdGlvbi9mb28iKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU3RhdHVzOiAiICsgcmVzcG9uc2UuZ2V0U3RhdHVzKCksIHJlc3BvbnNlLmdldFN0YXR1cygpIDwgMzAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJHRVQiLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUudmFsdWVPZigiYXBwbGljYXRpb24vZm9vIiksIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKworICAgICAgICByZXNwb25zZSA9IGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJHRVQiKS5hY2NlcHQoImFwcGxpY2F0aW9uL2JhciIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRUcnVlKCJTdGF0dXM6ICIgKyByZXNwb25zZS5nZXRTdGF0dXMoKSwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkgPCAzMDApOworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS52YWx1ZU9mKCJhcHBsaWNhdGlvbi9iYXIiKSwgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkpOworCisgICAgICAgIHJlc3BvbnNlID0gYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvIiwgIkdFVCIpLmFjY2VwdCgiYXBwbGljYXRpb24vZm9vIiwgImFwcGxpY2F0aW9uL2JhciIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRUcnVlKCJTdGF0dXM6ICIgKyByZXNwb25zZS5nZXRTdGF0dXMoKSwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkgPCAzMDApOworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS52YWx1ZU9mKCJhcHBsaWNhdGlvbi9mb28iKSwgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkpOworCisgICAgICAgIHJlc3BvbnNlID0gYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvIiwgIkdFVCIpLmFjY2VwdCgiYXBwbGljYXRpb24vYmFyIiwgImFwcGxpY2F0aW9uL2ZvbyIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRUcnVlKCJTdGF0dXM6ICIgKyByZXNwb25zZS5nZXRTdGF0dXMoKSwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkgPCAzMDApOworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS52YWx1ZU9mKCJhcHBsaWNhdGlvbi9iYXIiKSwgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL0FjY2VwdFdyaXRlclRlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL0FjY2VwdFdyaXRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2IxOGI5Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvQWNjZXB0V3JpdGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTY2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbDsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlcXVlc3RDb250ZXh0QnVpbGRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGFrZW4gZnJvbSBKZXJzZXkgMTogamVyc2V5LXRlc3RzOmNvbS5zdW4uamVyc2V5LmltcGwucmVzb3VyY2UuQWNjZXB0V3JpdGVyVGVzdC5qYXZhCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitwdWJsaWMgY2xhc3MgQWNjZXB0V3JpdGVyVGVzdCB7CisKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3RyaW5nV3JhcHBlciB7CisgICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgczsKKworICAgICAgICBwdWJsaWMgU3RyaW5nV3JhcHBlcihTdHJpbmcgcykgeworICAgICAgICAgICAgdGhpcy5zID0gczsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZm9vIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZvb1N0cmluZ1dyaXRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5V3JpdGVyPFN0cmluZ1dyYXBwZXI+IHsKKyAgICAgICAgTWVkaWFUeXBlIGZvbyA9IG5ldyBNZWRpYVR5cGUoImFwcGxpY2F0aW9uIiwgImZvbyIpOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZSgKKyAgICAgICAgICAgICAgICBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gU3RyaW5nV3JhcHBlci5jbGFzcyAmJiBmb28uaXNDb21wYXRpYmxlKG1lZGlhVHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0U2l6ZSgKKyAgICAgICAgICAgICAgICBTdHJpbmdXcmFwcGVyIHQsCisgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gdHlwZSwKKyAgICAgICAgICAgICAgICBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbygKKyAgICAgICAgICAgICAgICBTdHJpbmdXcmFwcGVyIHQsCisgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gdHlwZSwKKyAgICAgICAgICAgICAgICBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFN0cmluZyBzID0gImZvbzogIiArIHQuczsKKyAgICAgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZShzLmdldEJ5dGVzKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9iYXIiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQmFyU3RyaW5nV3JpdGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8U3RyaW5nV3JhcHBlcj4geworICAgICAgICBNZWRpYVR5cGUgYmFyID0gbmV3IE1lZGlhVHlwZSgiYXBwbGljYXRpb24iLCAiYmFyIik7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKAorICAgICAgICAgICAgICAgIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICByZXR1cm4gdHlwZSA9PSBTdHJpbmdXcmFwcGVyLmNsYXNzICYmIGJhci5pc0NvbXBhdGlibGUobWVkaWFUeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKAorICAgICAgICAgICAgICAgIFN0cmluZ1dyYXBwZXIgdCwKKyAgICAgICAgICAgICAgICBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKAorICAgICAgICAgICAgICAgIFN0cmluZ1dyYXBwZXIgdCwKKyAgICAgICAgICAgICAgICBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgU3RyaW5nIHMgPSAiYmFyOiAiICsgdC5zOworICAgICAgICAgICAgZW50aXR5U3RyZWFtLndyaXRlKHMuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZ1dyYXBwZXIgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdXcmFwcGVyKCJjb250ZW50Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3QoQXBwbGljYXRpb25IYW5kbGVyIGFwcCwgU3RyaW5nIGV4cGVjdGVkLCBTdHJpbmcgbWV0aG9kLCBPYmplY3QgZW50aXR5LCBTdHJpbmcgbWVkaWFUeXBlLCBTdHJpbmcuLi4gYWNjZXB0KQorICAgICAgICAgICAgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIgcmVxdWVzdENvbnRleHRCdWlsZGVyID0gUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8iLCBtZXRob2QpOworICAgICAgICBpZiAoZW50aXR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0QnVpbGRlci5lbnRpdHkoZW50aXR5KS50eXBlKG1lZGlhVHlwZSk7CisgICAgICAgIH0KKyAgICAgICAgQ29udGFpbmVyUmVxdWVzdCByZXF1ZXN0Q29udGV4dCA9IHJlcXVlc3RDb250ZXh0QnVpbGRlci5hY2NlcHQoYWNjZXB0KS5idWlsZCgpOworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgYXBwLmFwcGx5KHJlcXVlc3RDb250ZXh0LCBiYW9zKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBiYW9zLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFjY2VwdEdldCgpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzLCBGb29TdHJpbmdXcml0ZXIuY2xhc3MsIEJhclN0cmluZ1dyaXRlci5jbGFzcyk7CisgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uSGFuZGxlciBhcHAgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKHJlc291cmNlQ29uZmlnKTsKKworICAgICAgICBfdGVzdChhcHAsICJmb286IGNvbnRlbnQiLCAiR0VUIiwgbnVsbCwgbnVsbCwgImFwcGxpY2F0aW9uL2ZvbyIpOworICAgICAgICBfdGVzdChhcHAsICJmb286IGNvbnRlbnQiLCAiR0VUIiwgbnVsbCwgbnVsbCwgImFwcGxjYXRpb24vYmF6LCBhcHBsaWNhdGlvbi9mb287cT0wLjgiKTsKKyAgICAgICAgX3Rlc3QoYXBwLCAiYmFyOiBjb250ZW50IiwgIkdFVCIsIG51bGwsIG51bGwsICJhcHBsaWNhdGlvbi9iYXIiKTsKKyAgICAgICAgX3Rlc3QoYXBwLCAiYmFyOiBjb250ZW50IiwgIkdFVCIsIG51bGwsIG51bGwsICJhcHBsY2F0aW9uL2JheiwgYXBwbGljYXRpb24vYmFyO3E9MC44Iik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvQW1iaWd1b3VzVGVtcGxhdGVUZXN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9BbWJpZ3VvdXNUZW1wbGF0ZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDUwZTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvQW1iaWd1b3VzVGVtcGxhdGVUZXN0LmphdmEKQEAgLTAsMCArMSwzMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QVVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVxdWVzdENvbnRleHRCdWlsZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaGFzSXRlbXM7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBUZXN0IG1hdGNoaW5nIG9mIHJlc291cmNlcyB3aXRoIGFtYmlndW91cyB0ZW1wbGF0ZXMuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICoKKyAqLworcHVibGljIGNsYXNzIEFtYmlndW91c1RlbXBsYXRlVGVzdCB7CisKKyAgICBAUGF0aCgie2FiY30iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VBQkMgeworCisgICAgICAgIEBQYXRoUGFyYW0oImFiYyIpCisgICAgICAgIFN0cmluZyBwYXJhbTsKKworICAgICAgICBAUGF0aCgiYSIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRTdWIoKSB7CisgICAgICAgICAgICByZXR1cm4gImEtYWJjOiIgKyBwYXJhbTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gImFiYzoiICsgcGFyYW07CisgICAgICAgIH0KKworICAgIH0KKworICAgIEBQYXRoKCJ7eHl6fSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVhZWiB7CisKKyAgICAgICAgQFBhdGhQYXJhbSgieHl6IikKKyAgICAgICAgU3RyaW5nIHBhcmFtOworCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdChTdHJpbmcgcG9zdCkgeworICAgICAgICAgICAgcmV0dXJuICJ4eXo6IiArIHBhcmFtOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoIngiKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJ4LXh5ejoiICsgcGFyYW07CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgie3N1Yi14fSIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoQFBhdGhQYXJhbSgic3ViLXgiKSBTdHJpbmcgc3VieCkgeworICAgICAgICAgICAgcmV0dXJuICJzdWJ4LXh5ejoiICsgcGFyYW0gKyAiOiIgKyBzdWJ4OworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGF0aFBhcmFtT25BbWJpZ3VvdXNUZW1wbGF0ZSgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQXBwbGljYXRpb25IYW5kbGVyIGFwcGxpY2F0aW9uSGFuZGxlciA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIobmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlQUJDLmNsYXNzLAorICAgICAgICAgICAgICAgIFJlc291cmNlWFlaLmNsYXNzKSk7CisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gYXBwbGljYXRpb25IYW5kbGVyLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvdXV1L2EiLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImEtYWJjOnV1dSIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXRoUGFyYW1PbkFtYmlndW91c1RlbXBsYXRlMigpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQXBwbGljYXRpb25IYW5kbGVyIGFwcGxpY2F0aW9uSGFuZGxlciA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIobmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlQUJDLmNsYXNzLAorICAgICAgICAgICAgICAgIFJlc291cmNlWFlaLmNsYXNzKSk7CisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gYXBwbGljYXRpb25IYW5kbGVyLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvdGVzdC94IiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJ4LXh5ejp0ZXN0IiwgcmVzcG9uc2UuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhdGhQYXJhbU9uQW1iaWd1b3VzVGVtcGxhdGUzKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwbGljYXRpb25IYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2VBQkMuY2xhc3MsCisgICAgICAgICAgICAgICAgUmVzb3VyY2VYWVouY2xhc3MpKTsKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBhcHBsaWNhdGlvbkhhbmRsZXIuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi91dXUiLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImFiYzp1dXUiLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGF0aFBhcmFtT25BbWJpZ3VvdXNUZW1wbGF0ZTQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbkhhbmRsZXIgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZUFCQy5jbGFzcywKKyAgICAgICAgICAgICAgICBSZXNvdXJjZVhZWi5jbGFzcykpOworICAgICAgICBmaW5hbCBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGFwcGxpY2F0aW9uSGFuZGxlci5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3Bvc3QiLCAiUE9TVCIpCisgICAgICAgICAgICAgICAgLmVudGl0eSgiZW50aXR5IikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInh5ejpwb3N0IiwgcmVzcG9uc2UuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhdGhQYXJhbU9uQW1iaWd1b3VzVGVtcGxhdGU1KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwbGljYXRpb25IYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2VBQkMuY2xhc3MsCisgICAgICAgICAgICAgICAgUmVzb3VyY2VYWVouY2xhc3MpKTsKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBhcHBsaWNhdGlvbkhhbmRsZXIuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi94eHgvZm9vIiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJzdWJ4LXh5ejp4eHg6Zm9vIiwgcmVzcG9uc2UuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBQYXRoKCJsb2NhdG9yIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNpbXBsZUxvY2F0b3IgeworCisgICAgICAgIEBQYXRoKCJ7cmVzb3VyY2V9IikKKyAgICAgICAgcHVibGljIE9iamVjdCBsb2NhdG9yKEBQYXRoUGFyYW0oInJlc291cmNlIikgU3RyaW5nIHJlc291cmNlKSB7CisgICAgICAgICAgICBpZiAoInh5eiIuZXF1YWxzKHJlc291cmNlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VYWVooKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoImFiYyIuZXF1YWxzKHJlc291cmNlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VBQkMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbig0MDQpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGF0aFBhcmFtT25BbWJpZ3VvdXNUZW1wbGF0ZVRyb3VnaFN1YlJlc291cmNlTG9jYXRvcjEoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbkhhbmRsZXIgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKG5ldyBSZXNvdXJjZUNvbmZpZyhTaW1wbGVMb2NhdG9yLmNsYXNzKSk7CisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gYXBwbGljYXRpb25IYW5kbGVyLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvbG9jYXRvci9hYmMvdXV1L2EiLCAiR0VUIikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDA0LCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGF0aFBhcmFtT25BbWJpZ3VvdXNUZW1wbGF0ZVRyb3VnaFN1YlJlc291cmNlTG9jYXRvcjIoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbkhhbmRsZXIgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKG5ldyBSZXNvdXJjZUNvbmZpZyhTaW1wbGVMb2NhdG9yLmNsYXNzKSk7CisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gYXBwbGljYXRpb25IYW5kbGVyLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvbG9jYXRvci9hYmMvYSIsICJHRVQiKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiYS1hYmM6bnVsbCIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXRoUGFyYW1PbkFtYmlndW91c1RlbXBsYXRlVHJvdWdoU3ViUmVzb3VyY2VMb2NhdG9yMygpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQXBwbGljYXRpb25IYW5kbGVyIGFwcGxpY2F0aW9uSGFuZGxlciA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIobmV3IFJlc291cmNlQ29uZmlnKFNpbXBsZUxvY2F0b3IuY2xhc3MpKTsKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBhcHBsaWNhdGlvbkhhbmRsZXIuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9sb2NhdG9yL3h5ei9zdWJ4Zm9vIiwgIkdFVCIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJzdWJ4LXh5ejpudWxsOnN1Ynhmb28iLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgfQorCisgICAgQFBhdGgoInt4eXp9IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlV2l0aExvY2F0b3IgeworCisgICAgICAgIEBQYXRoUGFyYW0oInh5eiIpCisgICAgICAgIFN0cmluZyBwYXJhbTsKKworICAgICAgICBAUGF0aCgiLyIpCisgICAgICAgIHB1YmxpYyBTdWJSZXNvdXJjZSBsb2NhdG9yKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdWJSZXNvdXJjZShwYXJhbSk7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgie3BhdGh9IikKKyAgICAgICAgcHVibGljIFN1YlJlc291cmNlIHN1YkxvY2F0b3IoQFBhdGhQYXJhbSgicGF0aCIpIFN0cmluZyBwYXRoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN1YlJlc291cmNlKHBhcmFtICsgIjoiICsgcGF0aCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN1YlJlc291cmNlIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBzdHI7CisKKyAgICAgICAgcHVibGljIFN1YlJlc291cmNlKFN0cmluZyBzdHIpIHsKKyAgICAgICAgICAgIHRoaXMuc3RyID0gc3RyOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBzdHI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJSZXNvdXJjZUxvY2F0b3JXaXRoUGF0aFBhcmFtcygpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQXBwbGljYXRpb25IYW5kbGVyIGFwcGxpY2F0aW9uSGFuZGxlciA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIobmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlV2l0aExvY2F0b3IuY2xhc3MpKTsKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBhcHBsaWNhdGlvbkhhbmRsZXIuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi91dXUiLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInV1dSIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJSZXNvdXJjZUxvY2F0b3JXaXRoUGF0aFBhcmFtczIoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbkhhbmRsZXIgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZVdpdGhMb2NhdG9yLmNsYXNzKSk7CisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gYXBwbGljYXRpb25IYW5kbGVyLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvdXV1L3Rlc3QiLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInV1dTp0ZXN0IiwgcmVzcG9uc2UuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBQYXRoKCJ7dGVtcGxhdGVBfSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZUEgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRBKCkgeworICAgICAgICAgICAgcmV0dXJuICJnZXRBIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJ7dGVtcGxhdGVCfSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZUIgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdEIoU3RyaW5nIGVudGl0eSkgeworICAgICAgICAgICAgcmV0dXJuICJwb3N0QiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicmVzcSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVEgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIntwYXRofSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QSgpIHsKKyAgICAgICAgICAgIHJldHVybiAiZ2V0QSI7CisgICAgICAgIH0KKworICAgICAgICBAUFVUCisgICAgICAgIEBQYXRoKCJ7dGVtcH0iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHB1dChTdHJpbmcgc3RyKSB7CisgICAgICAgICAgICByZXR1cm4gImdldEIiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3B0aW9uc09uUm9vdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2VBLmNsYXNzLCBSZXNvdXJjZUIuY2xhc3MsIFJlc291cmNlUS5jbGFzcyk7CisgICAgICAgIEFwcGxpY2F0aW9uSGFuZGxlciBhcHAgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKHJlc291cmNlQ29uZmlnKTsKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgY29udGFpbmVyUmVzcG9uc2UgPSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9hYWEiLCAiT1BUSU9OUyIpCisgICAgICAgICAgICAgICAgLmFjY2VwdChNZWRpYVR5cGUuVEVYVF9QTEFJTikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCBjb250YWluZXJSZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IG1ldGhvZHMgPSBBcnJheXMuYXNMaXN0KGNvbnRhaW5lclJlc3BvbnNlLmdldEVudGl0eSgpLnRvU3RyaW5nKCkuc3BsaXQoIiwgIikpOworICAgICAgICBhc3NlcnRUaGF0KG1ldGhvZHMsIGhhc0l0ZW1zKCJQT1NUIiwgIkdFVCIsICJPUFRJT05TIiwgIkhFQUQiKSk7CisgICAgICAgIGFzc2VydFRoYXQobWV0aG9kcy5zaXplKCksIGlzKDQpKTsKKworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldE9uUm9vdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2VBLmNsYXNzLCBSZXNvdXJjZUIuY2xhc3MsIFJlc291cmNlUS5jbGFzcyk7CisgICAgICAgIEFwcGxpY2F0aW9uSGFuZGxlciBhcHAgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKHJlc291cmNlQ29uZmlnKTsKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgY29udGFpbmVyUmVzcG9uc2UgPSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9hYWEiLCAiR0VUIikKKyAgICAgICAgICAgICAgICAuYWNjZXB0KE1lZGlhVHlwZS5URVhUX1BMQUlOKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIGNvbnRhaW5lclJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiZ2V0QSIsIGNvbnRhaW5lclJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPcHRpb25zT25DaGlsZCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2VBLmNsYXNzLCBSZXNvdXJjZUIuY2xhc3MsIFJlc291cmNlUS5jbGFzcyk7CisgICAgICAgIEFwcGxpY2F0aW9uSGFuZGxlciBhcHAgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKHJlc291cmNlQ29uZmlnKTsKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgY29udGFpbmVyUmVzcG9uc2UgPSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9yZXNxL2MiLCAiT1BUSU9OUyIpCisgICAgICAgICAgICAgICAgLmFjY2VwdChNZWRpYVR5cGUuVEVYVF9QTEFJTikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCBjb250YWluZXJSZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IG1ldGhvZHMgPSBBcnJheXMuYXNMaXN0KGNvbnRhaW5lclJlc3BvbnNlLmdldEVudGl0eSgpLnRvU3RyaW5nKCkuc3BsaXQoIiwgIikpOworICAgICAgICBhc3NlcnRUaGF0KG1ldGhvZHMsIGhhc0l0ZW1zKCJQVVQiLCAiR0VUIiwgIk9QVElPTlMiLCAiSEVBRCIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtZXRob2RzLnNpemUoKSwgaXMoNCkpOworCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0T25DaGlsZCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2VBLmNsYXNzLCBSZXNvdXJjZUIuY2xhc3MsIFJlc291cmNlUS5jbGFzcyk7CisgICAgICAgIEFwcGxpY2F0aW9uSGFuZGxlciBhcHAgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKHJlc291cmNlQ29uZmlnKTsKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgY29udGFpbmVyUmVzcG9uc2UgPSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9yZXNxL2EiLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCBjb250YWluZXJSZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImdldEEiLCBjb250YWluZXJSZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvQW5jZXN0b3JzVGVzdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvQW5jZXN0b3JzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyZDZiNGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9BbmNlc3RvcnNUZXN0LmphdmEKQEAgLTAsMCArMSwyNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlcXVlc3RDb250ZXh0QnVpbGRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGFrZW4gZnJvbSBKZXJzZXktMTogamVyc2V5LXRlc3RzOmNvbS5zdW4uamVyc2V5LmltcGwuc3VicmVzb3VyY2VzLkFuY2VzdG9yc1Rlc3QKKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKi8KK3B1YmxpYyBjbGFzcyBBbmNlc3RvcnNUZXN0IHsKKworICAgIEFwcGxpY2F0aW9uSGFuZGxlciBhcHA7CisKKyAgICBwcml2YXRlIEFwcGxpY2F0aW9uSGFuZGxlciBjcmVhdGVBcHBsaWNhdGlvbihDbGFzczw/Pi4uLiBjbGFzc2VzKSB7CisgICAgICAgIHJldHVybiBuZXcgQXBwbGljYXRpb25IYW5kbGVyKG5ldyBSZXNvdXJjZUNvbmZpZyhjbGFzc2VzKSk7CisgICAgfQorCisgICAgQFBhdGgoIi9ub2RlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5vZGUgeworCisgICAgICAgIGludCBuID0gMDsKKworICAgICAgICBwdWJsaWMgTm9kZSgpIHsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgTm9kZShpbnQgaSkgeworICAgICAgICAgICAgdGhpcy5uID0gaTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJub2RlIikKKyAgICAgICAgcHVibGljIE5vZGUgZ2V0Q2hpbGQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE5vZGUobiArIDEpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldChAQ29udGV4dCBVcmlJbmZvIHVpKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobiArIDEsIHVpLmdldE1hdGNoZWRSZXNvdXJjZXMoKS5zaXplKCkpOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBOb2RlIG5vZGUgPSAoTm9kZSkgdWkuZ2V0TWF0Y2hlZFJlc291cmNlcygpLmdldChpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobiAtIGksIG5vZGUubik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhuICsgMSwgdWkuZ2V0TWF0Y2hlZFVSSXMoKS5zaXplKCkpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHAgPSB1aS5nZXRNYXRjaGVkVVJJcygpLmdldChpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0UGF0aChuIC0gaSksIHApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gSW50ZWdlci50b1N0cmluZyhuKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJsZWFmIikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFN1YihAQ29udGV4dCBVcmlJbmZvIHVpKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobiArIDEsIHVpLmdldE1hdGNoZWRSZXNvdXJjZXMoKS5zaXplKCkpOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBOb2RlIG5vZGUgPSAoTm9kZSkgdWkuZ2V0TWF0Y2hlZFJlc291cmNlcygpLmdldChpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobiAtIGksIG5vZGUubik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhuICsgMSArIDEsIHVpLmdldE1hdGNoZWRVUklzKCkuc2l6ZSgpKTsKKyAgICAgICAgICAgIFN0cmluZyBwID0gdWkuZ2V0TWF0Y2hlZFVSSXMoKS5nZXQoMCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0UGF0aExlYWYobiksIHApOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgcCA9IHVpLmdldE1hdGNoZWRVUklzKCkuZ2V0KGkgKyAxKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0UGF0aChuIC0gaSksIHApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gSW50ZWdlci50b1N0cmluZyhuKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGF0aChpbnQgbikgeworICAgICAgICAgICAgU3RyaW5nIHAgPSAibm9kZSI7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBwICs9ICIvbm9kZSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gcDsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGF0aExlYWYoaW50IG4pIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRQYXRoKG4pICsgIi9sZWFmIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXBwID0gY3JlYXRlQXBwbGljYXRpb24oTm9kZS5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIwIiwgYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvbm9kZSIsICJHRVQiKS5idWlsZCgpKS5nZXQoKS5nZXRFbnRpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMSIsIGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL25vZGUvbm9kZSIsICJHRVQiKS5idWlsZCgpKS5nZXQoKS5nZXRFbnRpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMiIsIGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL25vZGUvbm9kZS9ub2RlIiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIzIiwgYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvbm9kZS9ub2RlL25vZGUvbm9kZSIsICJHRVQiKS5idWlsZCgpKS5nZXQoKS5nZXRFbnRpdHkoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9kZUxlYWYoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXBwID0gY3JlYXRlQXBwbGljYXRpb24oTm9kZS5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIwIiwgYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvbm9kZS9sZWFmIiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvbm9kZS9ub2RlL2xlYWYiLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCkuZ2V0RW50aXR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjIiLCBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9ub2RlL25vZGUvbm9kZS9sZWFmIiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIzIiwgYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvbm9kZS9ub2RlL25vZGUvbm9kZS9sZWFmIiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiL25vZGUvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5vZGVTbGFzaCB7CisKKyAgICAgICAgaW50IG4gPSAwOworCisgICAgICAgIHB1YmxpYyBOb2RlU2xhc2goKSB7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIE5vZGVTbGFzaChpbnQgaSkgeworICAgICAgICAgICAgdGhpcy5uID0gaTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJub2RlLyIpCisgICAgICAgIHB1YmxpYyBOb2RlU2xhc2ggZ2V0Q2hpbGQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE5vZGVTbGFzaChuICsgMSk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KEBDb250ZXh0IFVyaUluZm8gdWkpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhuICsgMSwgdWkuZ2V0TWF0Y2hlZFJlc291cmNlcygpLnNpemUoKSk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8PSBuOyBpKyspIHsKKyAgICAgICAgICAgICAgICBOb2RlU2xhc2ggbm9kZSA9IChOb2RlU2xhc2gpIHVpLmdldE1hdGNoZWRSZXNvdXJjZXMoKS5nZXQoaSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG4gLSBpLCBub2RlLm4pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobiArIDEsIHVpLmdldE1hdGNoZWRVUklzKCkuc2l6ZSgpKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IG47IGkrKykgeworICAgICAgICAgICAgICAgIFN0cmluZyBwID0gdWkuZ2V0TWF0Y2hlZFVSSXMoKS5nZXQoaSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGdldFBhdGgobiAtIGkpLCBwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIEludGVnZXIudG9TdHJpbmcobik7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgibGVhZi8iKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3ViKEBDb250ZXh0IFVyaUluZm8gdWkpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhuICsgMSwgdWkuZ2V0TWF0Y2hlZFJlc291cmNlcygpLnNpemUoKSk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDw9IG47IGkrKykgeworICAgICAgICAgICAgICAgIE5vZGVTbGFzaCBub2RlID0gKE5vZGVTbGFzaCkgdWkuZ2V0TWF0Y2hlZFJlc291cmNlcygpLmdldChpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobiAtIGksIG5vZGUubik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhuICsgMSArIDEsIHVpLmdldE1hdGNoZWRVUklzKCkuc2l6ZSgpKTsKKyAgICAgICAgICAgIFN0cmluZyBwID0gdWkuZ2V0TWF0Y2hlZFVSSXMoKS5nZXQoMCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0UGF0aExlYWYobiksIHApOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgcCA9IHVpLmdldE1hdGNoZWRVUklzKCkuZ2V0KGkgKyAxKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0UGF0aChuIC0gaSksIHApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gSW50ZWdlci50b1N0cmluZyhuKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGF0aChpbnQgbikgeworICAgICAgICAgICAgU3RyaW5nIHAgPSAibm9kZS8iOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgcCArPSAibm9kZS8iOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHAuc3Vic3RyaW5nKDAsIHAubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UGF0aExlYWYoaW50IG4pIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRQYXRoKG4pICsgIi9sZWFmIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vZGVTbGFzaCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhcHAgPSBjcmVhdGVBcHBsaWNhdGlvbihOb2RlU2xhc2guY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscygiMCIsIGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL25vZGUvIiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvbm9kZS9ub2RlLyIsICJHRVQiKS5idWlsZCgpKS5nZXQoKS5nZXRFbnRpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMiIsIGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL25vZGUvbm9kZS9ub2RlLyIsICJHRVQiKS5idWlsZCgpKS5nZXQoKS5nZXRFbnRpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMyIsIGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL25vZGUvbm9kZS9ub2RlL25vZGUvIiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb2RlTGVhZlNsYXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFwcCA9IGNyZWF0ZUFwcGxpY2F0aW9uKE5vZGVTbGFzaC5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIwIiwgYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvbm9kZS9sZWFmLyIsICJHRVQiKS5idWlsZCgpKS5nZXQoKS5nZXRFbnRpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMSIsIGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL25vZGUvbm9kZS9sZWFmLyIsICJHRVQiKS5idWlsZCgpKS5nZXQoKS5nZXRFbnRpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMiIsIGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL25vZGUvbm9kZS9ub2RlL2xlYWYvIiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIzIiwgYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvbm9kZS9ub2RlL25vZGUvbm9kZS9sZWFmLyIsICJHRVQiKS5idWlsZCgpKS5nZXQoKS5nZXRFbnRpdHkoKSk7CisgICAgfQorCisgICAgQFBhdGgoImZvbyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGb29SZXNvdXJjZSB7CisKKyAgICAgICAgQENvbnRleHQKKyAgICAgICAgVXJpSW5mbyB1aTsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9vKCkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHVpLmdldE1hdGNoZWRSZXNvdXJjZXMoKS5zaXplKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHRoaXMsIHVpLmdldE1hdGNoZWRSZXNvdXJjZXMoKS5nZXQoMCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHVpLmdldE1hdGNoZWRVUklzKCkuc2l6ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwgdWkuZ2V0TWF0Y2hlZFVSSXMoKS5nZXQoMCkpOworICAgICAgICAgICAgcmV0dXJuICJmb28iOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImJhciIpCisgICAgICAgIHB1YmxpYyBCYXJSZXNvdXJjZSBnZXRCYXJSZXNvdXJjZSgpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCB1aS5nZXRNYXRjaGVkUmVzb3VyY2VzKCkuc2l6ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0aGlzLCB1aS5nZXRNYXRjaGVkUmVzb3VyY2VzKCkuZ2V0KDApKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCB1aS5nZXRNYXRjaGVkVVJJcygpLnNpemUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImZvby9iYXIiLCB1aS5nZXRNYXRjaGVkVVJJcygpLmdldCgwKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsIHVpLmdldE1hdGNoZWRVUklzKCkuZ2V0KDEpKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQmFyUmVzb3VyY2UodWksIHRoaXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCYXJSZXNvdXJjZSB7CisKKyAgICAgICAgVXJpSW5mbyB1aTsKKyAgICAgICAgRm9vUmVzb3VyY2UgZjsKKworICAgICAgICBCYXJSZXNvdXJjZShVcmlJbmZvIHVpLCBGb29SZXNvdXJjZSBmKSB7CisgICAgICAgICAgICB0aGlzLnVpID0gdWk7CisgICAgICAgICAgICB0aGlzLmYgPSBmOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEJhcigpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCB1aS5nZXRNYXRjaGVkUmVzb3VyY2VzKCkuc2l6ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0aGlzLCB1aS5nZXRNYXRjaGVkUmVzb3VyY2VzKCkuZ2V0KDApKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhmLCB1aS5nZXRNYXRjaGVkUmVzb3VyY2VzKCkuZ2V0KDEpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCB1aS5nZXRNYXRjaGVkVVJJcygpLnNpemUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImZvby9iYXIiLCB1aS5nZXRNYXRjaGVkVVJJcygpLmdldCgwKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsIHVpLmdldE1hdGNoZWRVUklzKCkuZ2V0KDEpKTsKKyAgICAgICAgICAgIHJldHVybiAiYmFyIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZvb0JhcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhcHAgPSBjcmVhdGVBcHBsaWNhdGlvbihGb29SZXNvdXJjZS5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9mb28iLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCkuZ2V0RW50aXR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImJhciIsIGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL2Zvby9iYXIiLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCkuZ2V0RW50aXR5KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL0FzeW5jQ29udGVudEFuZEVudGl0eVR5cGVUZXN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9Bc3luY0NvbnRlbnRBbmRFbnRpdHlUeXBlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1Mjg1MmUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9Bc3luY0NvbnRlbnRBbmRFbnRpdHlUeXBlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkFycmF5QmxvY2tpbmdRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5CbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Bc3luY1Jlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5TdXNwZW5kZWQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXF1ZXN0Q29udGV4dEJ1aWxkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogVGVzdCBvZiBmaXggZm9yIGlzc3VlcyBKRVJTRVktMTA4OCBhbmQgSkVSU0VZLTEwODkuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEFzeW5jQ29udGVudEFuZEVudGl0eVR5cGVUZXN0IHsKKworICAgIHByaXZhdGUgQXBwbGljYXRpb25IYW5kbGVyIGNyZWF0ZUFwcGxpY2F0aW9uKENsYXNzPD8+Li4uIGNsYXNzZXMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIobmV3IFJlc291cmNlQ29uZmlnKGNsYXNzZXMpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBc3luY1Jlc291cmNlIHsKKyAgICAgICAgc3RhdGljIEJsb2NraW5nUXVldWU8QXN5bmNSZXNwb25zZT4gY3R4UXVldWUgPSBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPEFzeW5jUmVzcG9uc2U+KDEpOworCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZm9vIikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgdm9pZCBnZXRGb28oQFN1c3BlbmRlZCBBc3luY1Jlc3BvbnNlIGFyKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICAgICAgQXN5bmNSZXNvdXJjZS5jdHhRdWV1ZS5wdXQoYXIpOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9mb28iKQorICAgICAgICBwdWJsaWMgdm9pZCBwb3N0Rm9vKFN0cmluZyBmb28pIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBBc3luY1Jlc291cmNlLmN0eFF1ZXVlLnRha2UoKS5yZXN1bWUoZm9vKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFzeW5jQ29udGVudFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQXBwbGljYXRpb25IYW5kbGVyIGFwcCA9IGNyZWF0ZUFwcGxpY2F0aW9uKEFzeW5jUmVzb3VyY2UuY2xhc3MpOworCisgICAgICAgIE1lZGlhVHlwZSBmb28gPSBNZWRpYVR5cGUudmFsdWVPZigiYXBwbGljYXRpb24vZm9vIik7CisKKyAgICAgICAgRnV0dXJlPENvbnRhaW5lclJlc3BvbnNlPiByZXNwb25zZUZ1dHVyZSA9CisgICAgICAgICAgICAgICAgRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbCgxKS5zdWJtaXQobmV3IENhbGxhYmxlPENvbnRhaW5lclJlc3BvbnNlPigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBDb250YWluZXJSZXNwb25zZSBjYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvIiwgIkdFVCIpLmFjY2VwdCgiKi8qIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKworCisgICAgICAgIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlOworICAgICAgICAvLyBtYWtpbmcgc3VyZSB0aGUgSlZNIG9wdGltaXphdGlvbiBkb2VzIG5vdCBzd2FwIHRoZSBvcmRlciBvZiB0aGUgY2FsbHMuCisgICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgeworICAgICAgICAgICAgYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvIiwgIlBPU1QiKS5lbnRpdHkoIkZvbyIpLmJ1aWxkKCkpOworICAgICAgICAgICAgcmVzcG9uc2UgPSByZXNwb25zZUZ1dHVyZS5nZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydFRydWUoIlN0YXR1czogIiArIHJlc3BvbnNlLmdldFN0YXR1cygpLCByZXNwb25zZS5nZXRTdGF0dXMoKSA8IDMwMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiRm9vIiwgcmVzcG9uc2UuZ2V0RW50aXR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZm9vLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKSk7CisKKyAgICAgICAgZmluYWwgR2VuZXJpY1R5cGUgc3RyaW5nVHlwZSA9IG5ldyBHZW5lcmljVHlwZShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoc3RyaW5nVHlwZS5nZXRSYXdUeXBlKCksIHJlc3BvbnNlLmdldEVudGl0eUNsYXNzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoc3RyaW5nVHlwZS5nZXRUeXBlKCksIHJlc3BvbnNlLmdldEVudGl0eVR5cGUoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9Db25zdHJhaW5lZFRvU2VydmVyVGVzdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvQ29uc3RyYWluZWRUb1NlcnZlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzZkMDkxCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvQ29uc3RyYWluZWRUb1NlcnZlclRlc3QuamF2YQpAQCAtMCwwICsxLDI3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN0cmFpbmVkVG87CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUnVudGltZVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXNwb25zZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlc3BvbnNlRmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVxdWVzdENvbnRleHRCdWlsZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCisvKioKKyAqIFRlc3RzIHdoZXRoZXIgcHJvdmlkZXJzIGFyZSBjb3JyZWN0bHkgdmFsaWRhdGVkIGluIHRoZSBzZXJ2ZXIgcnVudGltZSAoZm9yIGV4YW1wbGUgaWYgcHJvdmlkZXIgY29uc3RyYWluZWQgdG8KKyAqIGNsaWVudCBydW50aW1lIGlzIHNraXBwZWQgb24gdGhlIHNlcnZlcikuCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKgorICovCitwdWJsaWMgY2xhc3MgQ29uc3RyYWluZWRUb1NlcnZlclRlc3QgeworCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJzQW5ub3RhdGVkKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhNeVNlcnZlckZpbHRlci5jbGFzcywgTXlDbGllbnRGaWx0ZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgTXlTZXJ2ZXJXcm9uZ0ZpbHRlci5jbGFzcywgTXlTZXJ2ZXJGaWx0ZXJXaXRob3V0Q29uc3RyYWludC5jbGFzcywgUmVzb3VyY2UuY2xhc3MpOworICAgICAgICByZXNvdXJjZUNvbmZpZy5yZWdpc3Rlckluc3RhbmNlcyhuZXcgTXlTZXJ2ZXJXcm9uZ0ZpbHRlcjIoKSwgbmV3IE15U2VydmVyRmlsdGVyMigpKTsKKyAgICAgICAgQXBwbGljYXRpb25IYW5kbGVyIGhhbmRsZXIgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKHJlc291cmNlQ29uZmlnKTsKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBoYW5kbGVyLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvcmVzb3VyY2UiLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiY2FsbGVkIiwgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJNeVNlcnZlckZpbHRlciIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjYWxsZWQiLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIk15U2VydmVyRmlsdGVyMiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjYWxsZWQiLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIk15U2VydmVyRmlsdGVyV2l0aG91dENvbnN0cmFpbnQiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXlDbGllbnRVbkNvbnN0cmFpbmVkRmlsdGVyKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhNeUNsaWVudFVuQ29uc3RyYWluZWRGaWx0ZXIuY2xhc3MsIFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgQXBwbGljYXRpb25IYW5kbGVyIGhhbmRsZXIgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKHJlc291cmNlQ29uZmlnKTsKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBoYW5kbGVyLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvcmVzb3VyY2UiLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUFuZFByb3ZpZGVyQ29uc3RyYWluZWRUb0NsaWVudCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2VBbmRQcm92aWRlckNvbnN0cmFpbmVkVG9DbGllbnQuY2xhc3MpOworICAgICAgICBBcHBsaWNhdGlvbkhhbmRsZXIgaGFuZGxlciA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIocmVzb3VyY2VDb25maWcpOworICAgICAgICBmaW5hbCBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGhhbmRsZXIuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9yZXNvdXJjZS1hbmQtcHJvdmlkZXIiLAorICAgICAgICAgICAgICAgICJHRVQiKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlQW5kUHJvdmlkZXJDb25zdHJhaW5lZFRvU2VydmVyKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZUFuZFByb3ZpZGVyQ29uc3RyYWluZWRUb1NlcnZlci5jbGFzcyk7CisgICAgICAgIEFwcGxpY2F0aW9uSGFuZGxlciBoYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihyZXNvdXJjZUNvbmZpZyk7CisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gaGFuZGxlci5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3Jlc291cmNlLWFuZC1wcm92aWRlci1zZXJ2ZXIiLAorICAgICAgICAgICAgICAgICJHRVQiKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNhbGxlZCIsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiUmVzb3VyY2VBbmRQcm92aWRlckNvbnN0cmFpbmVkVG9TZXJ2ZXIiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xpZW50QW5kU2VydmVyUHJvdmlkZXIoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzLCBNeVNlcnZlckFuZENsaWVudEZpbHRlci5jbGFzcyk7CisgICAgICAgIEFwcGxpY2F0aW9uSGFuZGxlciBoYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihyZXNvdXJjZUNvbmZpZyk7CisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gaGFuZGxlci5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3Jlc291cmNlIiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY2FsbGVkIiwgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJNeVNlcnZlckFuZENsaWVudEZpbHRlciIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbGllbnRBbmRTZXJ2ZXJQcm92aWRlcjIoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzLCBNeVNlcnZlckFuZENsaWVudENvbnRyYWluZWRUb0NsaWVudEZpbHRlci5jbGFzcyk7CisgICAgICAgIEFwcGxpY2F0aW9uSGFuZGxlciBoYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihyZXNvdXJjZUNvbmZpZyk7CisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gaGFuZGxlci5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3Jlc291cmNlIiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWNBcHBsaWNhdGlvbigpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgQXBwbGljYXRpb24gYXBwID0gbmV3IEFwcGxpY2F0aW9uKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICAgICAgICAgIGZpbmFsIEhhc2hTZXQ8Q2xhc3M8Pz4+IGNsYXNzZXMgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgICAgICAgICAgY2xhc3Nlcy5hZGQoUmVzb3VyY2UuY2xhc3MpOworICAgICAgICAgICAgICAgIGNsYXNzZXMuYWRkKE15Q2xpZW50RmlsdGVyLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBjbGFzc2VzLmFkZChNeVNlcnZlcldyb25nRmlsdGVyLmNsYXNzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2xhc3NlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgQXBwbGljYXRpb25IYW5kbGVyIGhhbmRsZXIgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKGFwcCk7CisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gaGFuZGxlci5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3Jlc291cmNlIiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQENvbnN0cmFpbmVkVG8oUnVudGltZVR5cGUuU0VSVkVSKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlTZXJ2ZXJGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXNwb25zZUZpbHRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCwgQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJlc3BvbnNlQ29udGV4dC5nZXRIZWFkZXJzKCkuYWRkKCJNeVNlcnZlckZpbHRlciIsICJjYWxsZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlTZXJ2ZXJGaWx0ZXJXaXRob3V0Q29uc3RyYWludCBpbXBsZW1lbnRzIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LCBDb250YWluZXJSZXNwb25zZUNvbnRleHQgcmVzcG9uc2VDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LmdldEhlYWRlcnMoKS5hZGQoIk15U2VydmVyRmlsdGVyV2l0aG91dENvbnN0cmFpbnQiLCAiY2FsbGVkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAQ29uc3RyYWluZWRUbyhSdW50aW1lVHlwZS5TRVJWRVIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVNlcnZlckZpbHRlcjIgaW1wbGVtZW50cyBDb250YWluZXJSZXNwb25zZUZpbHRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCwgQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJlc3BvbnNlQ29udGV4dC5nZXRIZWFkZXJzKCkuYWRkKCJNeVNlcnZlckZpbHRlcjIiLCAiY2FsbGVkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAQ29uc3RyYWluZWRUbyhSdW50aW1lVHlwZS5DTElFTlQpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVNlcnZlcldyb25nRmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsIENvbnRhaW5lclJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBmYWlsKCJUaGlzIGZpbHRlciBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkLiIpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBAQ29uc3RyYWluZWRUbyhSdW50aW1lVHlwZS5TRVJWRVIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVNlcnZlckFuZENsaWVudEZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyLCBDbGllbnRSZXNwb25zZUZpbHRlciB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsIENvbnRhaW5lclJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuZ2V0SGVhZGVycygpLmFkZCgiTXlTZXJ2ZXJBbmRDbGllbnRGaWx0ZXIiLCAiY2FsbGVkIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENsaWVudFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LCBDbGllbnRSZXNwb25zZUNvbnRleHQgcmVzcG9uc2VDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB9CisgICAgfQorCisgICAgQENvbnN0cmFpbmVkVG8oUnVudGltZVR5cGUuQ0xJRU5UKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlTZXJ2ZXJBbmRDbGllbnRDb250cmFpbmVkVG9DbGllbnRGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXNwb25zZUZpbHRlciwgQ2xpZW50UmVzcG9uc2VGaWx0ZXIsCisgICAgICAgICAgICBNZXNzYWdlQm9keVdyaXRlcjxTdHJpbmc+IHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCwgQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZhaWwoIlRoaXMgTXlTZXJ2ZXJBbmRDbGllbnRDb250cmFpbmVkVG9DbGllbnRGaWx0ZXIgZmlsdGVyIHNob3VsZCBuZXZlciBiZSBjYWxsZWQuIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENsaWVudFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LCBDbGllbnRSZXNwb25zZUNvbnRleHQgcmVzcG9uc2VDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldFNpemUoU3RyaW5nIHMsIENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbyhTdHJpbmcgcywgQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBDb25zdHJhaW5lZFRvKFJ1bnRpbWVUeXBlLkNMSUVOVCkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15U2VydmVyV3JvbmdGaWx0ZXIyIGltcGxlbWVudHMgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsIENvbnRhaW5lclJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBmYWlsKCJUaGlzIGZpbHRlciBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgQENvbnN0cmFpbmVkVG8oUnVudGltZVR5cGUuQ0xJRU5UKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlDbGllbnRGaWx0ZXIgaW1wbGVtZW50cyBDbGllbnRSZXF1ZXN0RmlsdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENsaWVudFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgZmFpbCgiVGhpcyBmaWx0ZXIgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZC4iKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUNsaWVudFVuQ29uc3RyYWluZWRGaWx0ZXIgaW1wbGVtZW50cyBDbGllbnRSZXF1ZXN0RmlsdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENsaWVudFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgZmFpbCgiVGhpcyBmaWx0ZXIgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZC4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJyZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiZ2V0IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJyZXNvdXJjZS1hbmQtcHJvdmlkZXIiKQorICAgIEBDb25zdHJhaW5lZFRvKFJ1bnRpbWVUeXBlLkNMSUVOVCkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlQW5kUHJvdmlkZXJDb25zdHJhaW5lZFRvQ2xpZW50IGltcGxlbWVudHMgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXIgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygpLmVudGl0eSgib2siKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCwgQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZhaWwoIlRoaXMgZmlsdGVyIG1ldGhvZCBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInJlc291cmNlLWFuZC1wcm92aWRlci1zZXJ2ZXIiKQorICAgIEBDb25zdHJhaW5lZFRvKFJ1bnRpbWVUeXBlLlNFUlZFUikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlQW5kUHJvdmlkZXJDb25zdHJhaW5lZFRvU2VydmVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXIgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygpLmVudGl0eSgib2siKS5idWlsZCgpOworICAgICAgICB9CisKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LCBDb250YWluZXJSZXNwb25zZUNvbnRleHQgcmVzcG9uc2VDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LmdldEhlYWRlcnMoKS5hZGQoIlJlc291cmNlQW5kUHJvdmlkZXJDb25zdHJhaW5lZFRvU2VydmVyIiwgImNhbGxlZCIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvQ29uc3VtZVByb2R1Y2VTaW1wbGVUZXN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9Db25zdW1lUHJvZHVjZVNpbXBsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDk5MzkyCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvQ29uc3VtZVByb2R1Y2VTaW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSwyMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVzcG9uc2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlcXVlc3RDb250ZXh0QnVpbGRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGFrZW4gZnJvbSBKZXJzZXkgMTogamVyc2V5LXRlc3RzOmNvbS5zdW4uamVyc2V5LmltcGwucmVzb3VyY2UuQ29uc3VtZVByb2R1Y2VTaW1wbGVUZXN0LmphdmEKKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQ29uc3VtZVByb2R1Y2VTaW1wbGVUZXN0IHsKKworICAgIHByaXZhdGUgQXBwbGljYXRpb25IYW5kbGVyIGNyZWF0ZUFwcGxpY2F0aW9uKENsYXNzPD8+Li4uIGNsYXNzZXMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIobmV3IFJlc291cmNlQ29uZmlnKGNsYXNzZXMpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiL3thcmcxfS97YXJnMn0iKQorICAgIEBDb25zdW1lcygidGV4dC9odG1sIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbnN1bWVTaW1wbGVCZWFuIHsKKworICAgICAgICBAQ29udGV4dAorICAgICAgICBIdHRwSGVhZGVycyBodHRwSGVhZGVyczsKKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvUG9zdEh0bWwoU3RyaW5nIGRhdGEpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygidGV4dC9odG1sIiwgaHR0cEhlYWRlcnMuZ2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIikuZ2V0KDApKTsKKyAgICAgICAgICAgIHJldHVybiAiSFRNTCI7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAQ29uc3VtZXMoInRleHQveGh0bWwiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvUG9zdFhIdG1sKFN0cmluZyBkYXRhKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQveGh0bWwiLCBodHRwSGVhZGVycy5nZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiKS5nZXQoMCkpOworICAgICAgICAgICAgcmV0dXJuICJYSFRNTCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL3thcmcxfS97YXJnMn0iKQorICAgIEBQcm9kdWNlcygidGV4dC9odG1sIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFByb2R1Y2VTaW1wbGVCZWFuIHsKKworICAgICAgICBAQ29udGV4dAorICAgICAgICBIdHRwSGVhZGVycyBodHRwSGVhZGVyczsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRIdG1sKCkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0L2h0bWwiLCBodHRwSGVhZGVycy5nZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiKS5nZXQoMCkpOworICAgICAgICAgICAgcmV0dXJuICJIVE1MIjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3hodG1sIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldFhodG1sKCkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0L3hodG1sIiwgaHR0cEhlYWRlcnMuZ2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0IikuZ2V0KDApKTsKKyAgICAgICAgICAgIHJldHVybiAiWEhUTUwiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi97YXJnMX0ve2FyZzJ9IikKKyAgICBAQ29uc3VtZXMoInRleHQvaHRtbCIpCisgICAgQFByb2R1Y2VzKCJ0ZXh0L2h0bWwiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29uc3VtZVByb2R1Y2VTaW1wbGVCZWFuIHsKKworICAgICAgICBAQ29udGV4dAorICAgICAgICBIdHRwSGVhZGVycyBodHRwSGVhZGVyczsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRIdG1sKCkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0L2h0bWwiLCBodHRwSGVhZGVycy5nZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiKS5nZXQoMCkpOworICAgICAgICAgICAgcmV0dXJuICJIVE1MIjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3hodG1sIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldFhodG1sKCkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0L3hodG1sIiwgaHR0cEhlYWRlcnMuZ2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0IikuZ2V0KDApKTsKKyAgICAgICAgICAgIHJldHVybiAiWEhUTUwiOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoIlVudXNlZFBhcmFtZXRlcnMiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvUG9zdEh0bWwoU3RyaW5nIGRhdGEpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygidGV4dC9odG1sIiwgaHR0cEhlYWRlcnMuZ2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIikuZ2V0KDApKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygidGV4dC9odG1sIiwgaHR0cEhlYWRlcnMuZ2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0IikuZ2V0KDApKTsKKyAgICAgICAgICAgIHJldHVybiAiSFRNTCI7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAQ29uc3VtZXMoInRleHQveGh0bWwiKQorICAgICAgICBAUHJvZHVjZXMoInRleHQveGh0bWwiKQorICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygiVW51c2VkUGFyYW1ldGVycyIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9Qb3N0WEh0bWwoU3RyaW5nIGRhdGEpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygidGV4dC94aHRtbCIsIGh0dHBIZWFkZXJzLmdldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIpLmdldCgwKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQveGh0bWwiLCBodHRwSGVhZGVycy5nZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiKS5nZXQoMCkpOworICAgICAgICAgICAgcmV0dXJuICJYSFRNTCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdW1lU2ltcGxlQmVhbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwID0gY3JlYXRlQXBwbGljYXRpb24oQ29uc3VtZVNpbXBsZUJlYW4uY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscygiSFRNTCIsCisgICAgICAgICAgICAgICAgYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvYS9iIiwgIlBPU1QiKS5lbnRpdHkoIiIpLnR5cGUoInRleHQvaHRtbCIpLmJ1aWxkKCkpLmdldCgpLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJYSFRNTCIsCisgICAgICAgICAgICAgICAgYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvYS9iIiwgIlBPU1QiKS5lbnRpdHkoIiIpLnR5cGUoInRleHQveGh0bWwiKS5idWlsZCgpKS5nZXQoKS5nZXRFbnRpdHkoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvZHVjZVNpbXBsZUJlYW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQXBwbGljYXRpb25IYW5kbGVyIGFwcCA9IGNyZWF0ZUFwcGxpY2F0aW9uKFByb2R1Y2VTaW1wbGVCZWFuLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIkhUTUwiLCBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9hL2IiLCAiR0VUIikuYWNjZXB0KCJ0ZXh0L2h0bWwiKS5idWlsZCgpKS5nZXQoKS5nZXRFbnRpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWEhUTUwiLAorICAgICAgICAgICAgICAgIGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL2EvYiIsICJHRVQiKS5hY2NlcHQoInRleHQveGh0bWwiKS5idWlsZCgpKS5nZXQoKS5nZXRFbnRpdHkoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3VtZVByb2R1Y2VTaW1wbGVCZWFuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEFwcGxpY2F0aW9uSGFuZGxlciBhcHAgPSBjcmVhdGVBcHBsaWNhdGlvbihDb25zdW1lUHJvZHVjZVNpbXBsZUJlYW4uY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscygiSFRNTCIsCisgICAgICAgICAgICAgICAgYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvYS9iIiwgIlBPU1QiKS5lbnRpdHkoIiIpLnR5cGUoInRleHQvaHRtbCIpLmFjY2VwdCgidGV4dC9odG1sIikuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoKS5nZXRFbnRpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWEhUTUwiLAorICAgICAgICAgICAgICAgIGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL2EvYiIsICJQT1NUIikuZW50aXR5KCIiKS50eXBlKCJ0ZXh0L3hodG1sIikuYWNjZXB0KCJ0ZXh0L3hodG1sIikuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoKS5nZXRFbnRpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiSFRNTCIsIGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL2EvYiIsICJHRVQiKS5hY2NlcHQoInRleHQvaHRtbCIpLmJ1aWxkKCkpLmdldCgpLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJYSFRNTCIsCisgICAgICAgICAgICAgICAgYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvYS9iIiwgIkdFVCIpLmFjY2VwdCgidGV4dC94aHRtbCIpLmJ1aWxkKCkpLmdldCgpLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgQENvbnN1bWVzKCJ0ZXh0L2h0bWwiKQorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb25zdW1lUHJvZHVjZVdpdGhQYXJhbWV0ZXJzIHsKKworICAgICAgICBAQ29udGV4dAorICAgICAgICBIdHRwSGVhZGVycyBoOworCisgICAgICAgIEBQT1NUCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJVbnVzZWRQYXJhbWV0ZXJzIikKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0KFN0cmluZyBpbikgeworICAgICAgICAgICAgcmV0dXJuIGguZ2V0TWVkaWFUeXBlKCkuZ2V0UGFyYW1ldGVycygpLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9kdWNlV2l0aFBhcmFtZXRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQXBwbGljYXRpb25IYW5kbGVyIGFwcCA9IGNyZWF0ZUFwcGxpY2F0aW9uKENvbnN1bWVQcm9kdWNlV2l0aFBhcmFtZXRlcnMuY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscygie2E9YiwgYz1kfSIsIGFwcC5hcHBseSgKKyAgICAgICAgICAgICAgICBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJQT1NUIikuZW50aXR5KCI8aHRtbD5jb250ZW50PC9odG1sPiIpLnR5cGUoInRleHQvaHRtbDthPWI7Yz1kIikuYnVpbGQoKSkuZ2V0KCkKKyAgICAgICAgICAgICAgICAuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxpY2l0UHJvZHVjZXNSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0UGxhaW4oKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soInRleHQvcGxhaW4iKS5oZWFkZXIoIkhFQUQiLCAidGV4dC1wbGFpbiIpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcyh2YWx1ZSA9ICJ0ZXh0L2h0bWwiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0SHRtbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygiPGh0bWw+PC9odG1sPiIpLmhlYWRlcigiSEVBRCIsICJ0ZXh0LWh0bWwiKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wbGljaXRQcm9kdWNlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwbGljYXRpb24gPSBjcmVhdGVBcHBsaWNhdGlvbihJbXBsaWNpdFByb2R1Y2VzUmVzb3VyY2UuY2xhc3MpOworICAgICAgICBmaW5hbCBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGFwcGxpY2F0aW9uCisgICAgICAgICAgICAgICAgLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvIiwgIkdFVCIpLmFjY2VwdChNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKS5idWlsZCgpKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQvcGxhaW4iLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGV4dC1wbGFpbiIsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiSEVBRCIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9Db25zdW1lUHJvZHVjZVdpbGRjYXJkVGVzdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvQ29uc3VtZVByb2R1Y2VXaWxkY2FyZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWQ5MGU1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvQ29uc3VtZVByb2R1Y2VXaWxkY2FyZFRlc3QuamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbDsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlcXVlc3RDb250ZXh0QnVpbGRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGFrZW4gZnJvbSBKZXJzZXkgMTogamVyc2V5LXRlc3RzOmNvbS5zdW4uamVyc2V5LmltcGwucmVzb3VyY2UuQ29uc3VtZVByb2R1Y2VXaWxkY2FyZFRlc3QuamF2YQorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqLworcHVibGljIGNsYXNzIENvbnN1bWVQcm9kdWNlV2lsZGNhcmRUZXN0IHsKKworICAgIHByaXZhdGUgQXBwbGljYXRpb25IYW5kbGVyIGNyZWF0ZUFwcGxpY2F0aW9uKENsYXNzPD8+Li4uIGNsYXNzZXMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIobmV3IFJlc291cmNlQ29uZmlnKGNsYXNzZXMpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiL3thcmcxfS97YXJnMn0iKQorICAgIEBDb25zdW1lcygidGV4dC8qIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbnN1bWVXaWxkQ2FyZEJlYW4geworCisgICAgICAgIEBDb250ZXh0CisgICAgICAgIEh0dHBIZWFkZXJzIGhlYWRlcnM7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyBkb1Bvc3RIdG1sKCkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0L2h0bWwiLCBoZWFkZXJzLmdldFJlcXVlc3RIZWFkZXJzKCkuZ2V0Rmlyc3QoIkNvbnRlbnQtVHlwZSIpKTsKKyAgICAgICAgICAgIHJldHVybiAiSFRNTCI7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAQ29uc3VtZXMoInRleHQveGh0bWwiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvUG9zdFhIdG1sKCkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0L3hodG1sIiwgaGVhZGVycy5nZXRSZXF1ZXN0SGVhZGVycygpLmdldEZpcnN0KCJDb250ZW50LVR5cGUiKSk7CisgICAgICAgICAgICByZXR1cm4gIlhIVE1MIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbnN1bWVXaWxkQ2FyZEJlYW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQXBwbGljYXRpb25IYW5kbGVyIGFwcCA9IGNyZWF0ZUFwcGxpY2F0aW9uKENvbnN1bWVXaWxkQ2FyZEJlYW4uY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscygiSFRNTCIsCisgICAgICAgICAgICAgICAgYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvYS9iIiwgIlBPU1QiKS5lbnRpdHkoIiIpLnR5cGUoInRleHQvaHRtbCIpLmJ1aWxkKCkpLmdldCgpLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJYSFRNTCIsCisgICAgICAgICAgICAgICAgYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvYS9iIiwgIlBPU1QiKS5lbnRpdHkoIiIpLnR5cGUoInRleHQveGh0bWwiKS5idWlsZCgpKS5nZXQoKS5nZXRFbnRpdHkoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvRHluYW1pY0ZlYXR1cmVUZXN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9EeW5hbWljRmVhdHVyZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjcwYWE3Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvRHluYW1pY0ZlYXR1cmVUZXN0LmphdmEKQEAgLTAsMCArMSwzMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlc3BvbnNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkR5bmFtaWNGZWF0dXJlOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5QcmVNYXRjaGluZzsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuUmVzb3VyY2VJbmZvOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LkNvbnRleHRSZXNvbHZlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuRXhjZXB0aW9uTWFwcGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SZWFkZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0OworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5oazIuSGsySW5qZWN0aW9uTWFuYWdlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVzcG9uc2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlcXVlc3RDb250ZXh0QnVpbGRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzdW1lOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiBUZXN0cyBjYXNlcyBvZiB7QGNvZGUgRHluYW1pY0ZlYXR1cmV9IGltcGxlbWVudGF0aW9uLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgRHluYW1pY0ZlYXR1cmVUZXN0IHsKKworICAgIEBQYXRoKCJyZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiZ2V0IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInBvc3RtYXRjaCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UG9zdE1hdGNoKEBDb250ZXh0IGZpbmFsIEh0dHBIZWFkZXJzIGhlYWRlcnMpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygidHJ1ZSIsIGhlYWRlcnMuZ2V0SGVhZGVyU3RyaW5nKCJwb3N0bWF0Y2giKSk7CisgICAgICAgICAgICByZXR1cm4gImdldCI7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgicHJvdmlkZXJzIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRQcm92aWRlcnMoQENvbnRleHQgZmluYWwgSHR0cEhlYWRlcnMgaGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQENvbnRleHQgZmluYWwgUHJvdmlkZXJzIHByb3ZpZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVudGl0eSkgeworICAgICAgICAgICAgYXNzZXJ0TnVsbChwcm92aWRlcnMuZ2V0Q29udGV4dFJlc29sdmVyKFN0cmluZy5jbGFzcywgTWVkaWFUeXBlLldJTERDQVJEX1RZUEUpKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJQcm92aWRlckJhbGwiLCBoZWFkZXJzLmdldEhlYWRlclN0cmluZygicmVhZGVyIikpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYXIiLCBoZWFkZXJzLmdldEhlYWRlclN0cmluZygiZm9vIikpOworCisgICAgICAgICAgICByZXR1cm4gZW50aXR5OworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgicHJvdmlkZXJzL2Vycm9yIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRQcm92aWRlcnNFcnJvcigpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDdXN0b21FeGNlcHRpb24oImVycm9yIik7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgic3ViIikKKyAgICAgICAgcHVibGljIFN1YlJlc291cmNlIHN1YlJlc291cmNlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdWJSZXNvdXJjZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdWJSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAic3ViLWdldCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEN1c3RvbVJlc3BvbnNlRmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoZmluYWwgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQpCisgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LnNldEVudGl0eSgKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LmdldEVudGl0eSgpICsgIi1maWx0ZXJlZCIsCisgICAgICAgICAgICAgICAgICAgIG5ldyBBbm5vdGF0aW9uWzBdLAorICAgICAgICAgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuZ2V0TWVkaWFUeXBlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFByZU1hdGNoaW5nCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQcmVNYXRjaGluZ1JlcXVlc3RGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKGZpbmFsIENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKHJlcXVlc3RDb250ZXh0LmdldFVyaUluZm8oKS5nZXRNYXRjaGVkVVJJcygpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGZhaWwoIkZpbHRlciBleGVjdXRlZCBpbiBQcmVNYXRjaGluZyBwaGFzZS4iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuZ2V0SGVhZGVycygpLmFkZCgicG9zdG1hdGNoIiwgInRydWUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHJlTWF0Y2hpbmdEeW5hbWljRmVhdHVyZSBpbXBsZW1lbnRzIER5bmFtaWNGZWF0dXJlIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY29uZmlndXJlKGZpbmFsIFJlc291cmNlSW5mbyByZXNvdXJjZUluZm8sIGZpbmFsIEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoUHJlTWF0Y2hpbmdSZXF1ZXN0RmlsdGVyLmNsYXNzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByZU1hdGNoaW5nRmlsdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbiA9IGNyZWF0ZUFwcGxpY2F0aW9uKFByZU1hdGNoaW5nRHluYW1pY0ZlYXR1cmUuY2xhc3MpOworCisgICAgICAgIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlOworCisgICAgICAgIHJlc3BvbnNlID0gYXBwbGljYXRpb24uYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9yZXNvdXJjZS9wb3N0bWF0Y2giLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXQiLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdWJSZXNvdXJjZUR5bmFtaWNGZWF0dXJlIGltcGxlbWVudHMgRHluYW1pY0ZlYXR1cmUgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoZmluYWwgUmVzb3VyY2VJbmZvIHJlc291cmNlSW5mbywgZmluYWwgRmVhdHVyZUNvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgaWYgKHJlc291cmNlSW5mby5nZXRSZXNvdXJjZUNsYXNzKCkuZXF1YWxzKFN1YlJlc291cmNlLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAmJiAiZ2V0Ii5lcXVhbHMocmVzb3VyY2VJbmZvLmdldFJlc291cmNlTWV0aG9kKCkuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIobmV3IEN1c3RvbVJlc3BvbnNlRmlsdGVyKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3ViUmVzb3VyY2VGZWF0dXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbiA9IGNyZWF0ZUFwcGxpY2F0aW9uKFN1YlJlc291cmNlRHluYW1pY0ZlYXR1cmUuY2xhc3MpOworCisgICAgICAgIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlOworCisgICAgICAgIHJlc3BvbnNlID0gYXBwbGljYXRpb24uYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9yZXNvdXJjZS9zdWIiLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzdWItZ2V0LWZpbHRlcmVkIiwgcmVzcG9uc2UuZ2V0RW50aXR5KCkpOworCisgICAgICAgIHJlc3BvbnNlID0gYXBwbGljYXRpb24uYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9yZXNvdXJjZSIsICJHRVQiKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImdldCIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFByb3ZpZGVyQmFsbCBpbXBsZW1lbnRzIFJlYWRlckludGVyY2VwdG9yLCBXcml0ZXJJbnRlcmNlcHRvciwgQ29udGV4dFJlc29sdmVyPFN0cmluZz4sIEV4Y2VwdGlvbk1hcHBlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dChmaW5hbCBDbGFzczw/PiB0eXBlKSB7CisgICAgICAgICAgICByZXR1cm4gIlByb3ZpZGVyQmFsbCI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHRvUmVzcG9uc2UoZmluYWwgVGhyb3dhYmxlIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCkuZW50aXR5KCJQcm92aWRlckJhbGwiKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPYmplY3QgYXJvdW5kUmVhZEZyb20oZmluYWwgUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgY29udGV4dC5nZXRIZWFkZXJzKCkuYWRkKCJyZWFkZXIiLCAiUHJvdmlkZXJCYWxsIik7CisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5wcm9jZWVkKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYXJvdW5kV3JpdGVUbyhmaW5hbCBXcml0ZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBjb250ZXh0LmdldEhlYWRlcnMoKS5hZGQoIndyaXRlciIsICJQcm92aWRlckJhbGwiKTsKKworICAgICAgICAgICAgY29udGV4dC5wcm9jZWVkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN1cHBvcnRlZFByb3ZpZGVyc0R5bmFtaWNGZWF0dXJlIGltcGxlbWVudHMgRHluYW1pY0ZlYXR1cmUgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoZmluYWwgUmVzb3VyY2VJbmZvIHJlc291cmNlSW5mbywgZmluYWwgRmVhdHVyZUNvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihQcm92aWRlckJhbGwuY2xhc3MpOworICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihuZXcgQ29udGFpbmVyUmVxdWVzdEZpbHRlcigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoZmluYWwgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LmdldEhlYWRlcnMoKS5hZGQoImZvbyIsICJiYXIiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIC8vbm9pbnNwZWN0aW9uIHVuY2hlY2tlZAorICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihuZXcgQ3VzdG9tUmVzcG9uc2VGaWx0ZXIoKSwgTWVzc2FnZUJvZHlSZWFkZXIuY2xhc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3VwcG9ydGVkUHJvdmlkZXJzRmVhdHVyZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwbGljYXRpb24gPSBjcmVhdGVBcHBsaWNhdGlvbihTdXBwb3J0ZWRQcm92aWRlcnNEeW5hbWljRmVhdHVyZS5jbGFzcyk7CisKKyAgICAgICAgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2U7CisKKyAgICAgICAgcmVzcG9uc2UgPSBhcHBsaWNhdGlvbi5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3Jlc291cmNlL3Byb3ZpZGVycyIsICJQT1NUIikuZW50aXR5KCJnZXQiKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImdldCIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJQcm92aWRlckJhbGwiLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIndyaXRlciIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEN1c3RvbUV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworCisgICAgICAgIHB1YmxpYyBDdXN0b21FeGNlcHRpb24oZmluYWwgU3RyaW5nIGVycm9yKSB7CisgICAgICAgICAgICBzdXBlcihlcnJvcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROZWdhdGl2ZVN1cHBvcnRlZFByb3ZpZGVyc0ZlYXR1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQXBwbGljYXRpb25IYW5kbGVyIGFwcGxpY2F0aW9uID0gY3JlYXRlQXBwbGljYXRpb24oU3VwcG9ydGVkUHJvdmlkZXJzRHluYW1pY0ZlYXR1cmUuY2xhc3MpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhcHBsaWNhdGlvbi5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3Jlc291cmNlL3Byb3ZpZGVycy9lcnJvciIsICJHRVQiKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHdoaWxlICghKGUgaW5zdGFuY2VvZiBDdXN0b21FeGNlcHRpb24pKSB7CisgICAgICAgICAgICAgICAgZSA9IChFeGNlcHRpb24pIGUuZ2V0Q2F1c2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZXJyb3IiLCBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEluamVjdENvbmZpZ3VyYWJsZVByb3ZpZGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXIgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uOworCisgICAgICAgIEBJbmplY3QKKyAgICAgICAgcHVibGljIEluamVjdENvbmZpZ3VyYWJsZVByb3ZpZGVyKGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgeworICAgICAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoZmluYWwgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQpCisgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChjb25maWd1cmF0aW9uKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiYmFyIiwgY29uZmlndXJhdGlvbi5nZXRQcm9wZXJ0eSgiZm9vIikpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3b3JsZCIsIGNvbmZpZ3VyYXRpb24uZ2V0UHJvcGVydHkoImhlbGxvIikpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbmplY3RDb25maWd1cmFibGVEeW5hbWljRmVhdHVyZSBpbXBsZW1lbnRzIER5bmFtaWNGZWF0dXJlIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY29uZmlndXJlKGZpbmFsIFJlc291cmNlSW5mbyByZXNvdXJjZUluZm8sIGZpbmFsIEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoSW5qZWN0Q29uZmlndXJhYmxlUHJvdmlkZXIuY2xhc3MpOworICAgICAgICAgICAgY29udGV4dC5wcm9wZXJ0eSgiZm9vIiwgImJhciIpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIndvcmxkIiwgY29udGV4dC5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UHJvcGVydHkoImhlbGxvIikpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5qZWN0ZWRDb25maWd1cmFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoSGsySW5qZWN0aW9uTWFuYWdlckZhY3RvcnkuaXNJbW1lZGlhdGVTdHJhdGVneSgpKTsKKworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IGdldFRlc3RSZXNvdXJjZUNvbmZpZyhJbmplY3RDb25maWd1cmFibGVEeW5hbWljRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnByb3BlcnR5KCJoZWxsbyIsICJ3b3JsZCIpOworCisgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbiA9IGNyZWF0ZUFwcGxpY2F0aW9uKHJlc291cmNlQ29uZmlnKTsKKworICAgICAgICBhc3NlcnROdWxsKGFwcGxpY2F0aW9uLmdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0eSgiZm9vIikpOworCisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gYXBwbGljYXRpb24uYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9yZXNvdXJjZSIsICJHRVQiKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImdldCIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKworICAgICAgICBhc3NlcnROdWxsKGFwcGxpY2F0aW9uLmdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0eSgiZm9vIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIndvcmxkIiwgYXBwbGljYXRpb24uZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnR5KCJoZWxsbyIpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEFwcGxpY2F0aW9uSGFuZGxlciBjcmVhdGVBcHBsaWNhdGlvbihmaW5hbCBDbGFzczw/Pi4uLiBkeW5hbWljRmVhdHVyZXMpIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZUFwcGxpY2F0aW9uKGdldFRlc3RSZXNvdXJjZUNvbmZpZyhkeW5hbWljRmVhdHVyZXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlc291cmNlQ29uZmlnIGdldFRlc3RSZXNvdXJjZUNvbmZpZyhmaW5hbCBDbGFzczw/Pi4uLiBkeW5hbWljRmVhdHVyZXMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZygpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyQ2xhc3NlcyhSZXNvdXJjZS5jbGFzcywgU3ViUmVzb3VyY2UuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyQ2xhc3NlcyhkeW5hbWljRmVhdHVyZXMpOworICAgIH0KKworICAgIHByaXZhdGUgQXBwbGljYXRpb25IYW5kbGVyIGNyZWF0ZUFwcGxpY2F0aW9uKGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnKSB7CisgICAgICAgIHJldHVybiBuZXcgQXBwbGljYXRpb25IYW5kbGVyKHJlc291cmNlQ29uZmlnKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9HZW5lcmljTWV0aG9kTGlzdFRlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL0dlbmVyaWNNZXRob2RMaXN0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMjM4OTEKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9HZW5lcmljTWV0aG9kTGlzdFRlc3QuamF2YQpAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGVWYXJpYWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CisKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitwdWJsaWMgY2xhc3MgR2VuZXJpY01ldGhvZExpc3RUZXN0IHsKKworICAgIHB1YmxpYyBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgQUZvbzxULCBWPiB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFQgY3JlYXRlKFQgbmV3T2JqZWN0LCBAQ29udGV4dCBTdHJpbmcgcywgQENvbnRleHQgViB2KTsKKyAgICB9CisKKyAgICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIEFCYXIgZXh0ZW5kcyBBRm9vPFN0cmluZywgSW50ZWdlcj4geworICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBBUmVzb3VyY2UgZXh0ZW5kcyBBQmFyIHsKKworICAgICAgICBwdWJsaWMgU3RyaW5nIGNyZWF0ZShTdHJpbmcgbmV3T2JqZWN0LCBTdHJpbmcgcywgSW50ZWdlciB2KSB7CisgICAgICAgICAgICByZXR1cm4gbmV3T2JqZWN0OworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJpY0Fic3RyYWN0Q2xhc3NlcygpIHsKKyAgICAgICAgTWV0aG9kTGlzdCBtbCA9IG5ldyBNZXRob2RMaXN0KEFSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIEl0ZXJhdG9yPEFubm90YXRlZE1ldGhvZD4gaSA9IG1sLml0ZXJhdG9yKCk7CisgICAgICAgIGFzc2VydFRydWUoaS5oYXNOZXh0KCkpOworCisgICAgICAgIEFubm90YXRlZE1ldGhvZCBhbSA9IGkubmV4dCgpOworICAgICAgICBNZXRob2QgbSA9IGFtLmdldE1ldGhvZCgpOworICAgICAgICBUeXBlW10gdHlwZXMgPSBtLmdldEdlbmVyaWNQYXJhbWV0ZXJUeXBlcygpOworICAgICAgICBhc3NlcnRUcnVlKHR5cGVzWzBdIGluc3RhbmNlb2YgVHlwZVZhcmlhYmxlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0eXBlc1sxXSBpbnN0YW5jZW9mIENsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0eXBlc1syXSBpbnN0YW5jZW9mIFR5cGVWYXJpYWJsZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgSUZvbzxULCBWPiB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFQgY3JlYXRlKFQgbmV3T2JqZWN0LCBAQ29udGV4dCBTdHJpbmcgcywgQENvbnRleHQgViB2KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBJQmFyIGV4dGVuZHMgSUZvbzxTdHJpbmcsIEludGVnZXI+IHsKKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgSVJlc291cmNlIGltcGxlbWVudHMgSUJhciB7CisKKyAgICAgICAgcHVibGljIFN0cmluZyBjcmVhdGUoU3RyaW5nIG5ld09iamVjdCwgU3RyaW5nIHMsIEludGVnZXIgdikgeworICAgICAgICAgICAgcmV0dXJuIG5ld09iamVjdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdlbmVyaUludGVyZmFjZUNsYXNzZXMoKSB7CisgICAgICAgIE1ldGhvZExpc3QgbWwgPSBuZXcgTWV0aG9kTGlzdChJUmVzb3VyY2UuY2xhc3MpOworICAgICAgICBJdGVyYXRvcjxBbm5vdGF0ZWRNZXRob2Q+IGkgPSBtbC5pdGVyYXRvcigpOworICAgICAgICBhc3NlcnRUcnVlKGkuaGFzTmV4dCgpKTsKKworICAgICAgICBBbm5vdGF0ZWRNZXRob2QgYW0gPSBpLm5leHQoKTsKKyAgICAgICAgTWV0aG9kIG0gPSBhbS5nZXRNZXRob2QoKTsKKyAgICAgICAgVHlwZVtdIHR5cGVzID0gbS5nZXRHZW5lcmljUGFyYW1ldGVyVHlwZXMoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0eXBlc1swXSBpbnN0YW5jZW9mIFR5cGVWYXJpYWJsZSk7CisgICAgICAgIGFzc2VydFRydWUodHlwZXNbMV0gaW5zdGFuY2VvZiBDbGFzcyk7CisgICAgICAgIGFzc2VydFRydWUodHlwZXNbMl0gaW5zdGFuY2VvZiBUeXBlVmFyaWFibGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL0hlYWRTdWJSZXNvdXJjZU1ldGhvZFRlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL0hlYWRTdWJSZXNvdXJjZU1ldGhvZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Mjg3N2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvSGVhZFN1YlJlc291cmNlTWV0aG9kVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjE0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5IRUFEOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXF1ZXN0Q29udGV4dEJ1aWxkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworCisvKioKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBIZWFkU3ViUmVzb3VyY2VNZXRob2RUZXN0IHsKKworICAgIHByaXZhdGUgQXBwbGljYXRpb25IYW5kbGVyIGFwcDsKKworICAgIHByaXZhdGUgdm9pZCBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKENsYXNzPD8+Li4uIGNsYXNzZXMpIHsKKyAgICAgICAgYXBwID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihuZXcgUmVzb3VyY2VDb25maWcoY2xhc3NlcykpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlR2V0Tm9IZWFkIHsKKworICAgICAgICBAUGF0aCgic3ViIikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiR0VUIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldE5vSGVhZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlR2V0Tm9IZWFkLmNsYXNzKTsKKworICAgICAgICBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3N1YiIsICJIRUFEIikuYnVpbGQoKSkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSwgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkpOworICAgICAgICBhc3NlcnRGYWxzZShyZXNwb25zZS5oYXNFbnRpdHkoKSk7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VHZXRXaXRoSGVhZCB7CisKKyAgICAgICAgQFBhdGgoInN1YiIpCisgICAgICAgIEBIRUFECisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBoZWFkKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCkuaGVhZGVyKCJYLVRFU1QiLCAiSEVBRCIpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgic3ViIikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCJHRVQiKS5oZWFkZXIoIlgtVEVTVCIsICJHRVQiKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0V2l0aEhlYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZUdldFdpdGhIZWFkLmNsYXNzKTsKKworICAgICAgICBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3N1YiIsICJIRUFEIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocmVzcG9uc2UuaGFzRW50aXR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkhFQUQiLCByZXNwb25zZS5nZXRIZWFkZXJzKCkuZ2V0Rmlyc3QoIlgtVEVTVCIpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZUdldFdpdGhQcm9kdWNlTm9IZWFkIHsKKworICAgICAgICBAUGF0aCgic3ViIikKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2ZvbyIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9vKCkgeworICAgICAgICAgICAgcmV0dXJuICJGT08iOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInN1YiIpCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9iYXIiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEJhcigpIHsKKyAgICAgICAgICAgIHJldHVybiAiQkFSIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFdpdGhQcm9kdWNlTm9IZWFkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VHZXRXaXRoUHJvZHVjZU5vSGVhZC5jbGFzcyk7CisKKyAgICAgICAgTWVkaWFUeXBlIGZvbyA9IE1lZGlhVHlwZS52YWx1ZU9mKCJhcHBsaWNhdGlvbi9mb28iKTsKKyAgICAgICAgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9zdWIiLCAiSEVBRCIpLmFjY2VwdChmb28pLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHJlc3BvbnNlLmhhc0VudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZvbywgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkpOworCisgICAgICAgIE1lZGlhVHlwZSBiYXIgPSBNZWRpYVR5cGUudmFsdWVPZigiYXBwbGljYXRpb24vYmFyIik7CisgICAgICAgIHJlc3BvbnNlID0gYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvc3ViIiwgIkhFQUQiKS5hY2NlcHQoYmFyKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRGYWxzZShyZXNwb25zZS5oYXNFbnRpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhiYXIsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZUdldFdpdGhQcm9kdWNlV2l0aEhlYWQgeworCisgICAgICAgIEBQYXRoKCJzdWIiKQorICAgICAgICBASEVBRAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2ZvbyIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBoZWFkRm9vKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCkuaGVhZGVyKCJYLVRFU1QiLCAiRk9PLUhFQUQiKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInN1YiIpCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mb28iKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0Rm9vKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCJHRVQiLCAiYXBwbGljYXRpb24vZm9vIikuaGVhZGVyKCJYLVRFU1QiLCAiRk9PLUdFVCIpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgic3ViIikKKyAgICAgICAgQEhFQUQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9iYXIiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgaGVhZEJhcigpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygpLmhlYWRlcigiWC1URVNUIiwgIkJBUi1IRUFEIikuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJzdWIiKQorICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYmFyIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldEJhcigpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygiR0VUIikuaGVhZGVyKCJYLVRFU1QiLCAiQkFSLUdFVCIpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRXaXRoUHJvZHVjZVdpdGhIZWFkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VHZXRXaXRoUHJvZHVjZVdpdGhIZWFkLmNsYXNzKTsKKworICAgICAgICBNZWRpYVR5cGUgZm9vID0gTWVkaWFUeXBlLnZhbHVlT2YoImFwcGxpY2F0aW9uL2ZvbyIpOworICAgICAgICBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3N1YiIsICJIRUFEIikuYWNjZXB0KGZvbykuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocmVzcG9uc2UuaGFzRW50aXR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZm9vLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiRk9PLUhFQUQiLCByZXNwb25zZS5nZXRIZWFkZXJzKCkuZ2V0Rmlyc3QoIlgtVEVTVCIpLnRvU3RyaW5nKCkpOworCisgICAgICAgIE1lZGlhVHlwZSBiYXIgPSBNZWRpYVR5cGUudmFsdWVPZigiYXBwbGljYXRpb24vYmFyIik7CisgICAgICAgIHJlc3BvbnNlID0gYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvc3ViIiwgIkhFQUQiKS5hY2NlcHQoYmFyKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRGYWxzZShyZXNwb25zZS5oYXNFbnRpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhiYXIsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJCQVItSEVBRCIsIHJlc3BvbnNlLmdldEhlYWRlcnMoKS5nZXRGaXJzdCgiWC1URVNUIikudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VHZXRXaXRoUHJvZHVjZU5vSGVhZERpZmZlcmVudFN1YiB7CisKKyAgICAgICAgQFBhdGgoInN1YjEiKQorICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZm9vIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRGb28oKSB7CisgICAgICAgICAgICByZXR1cm4gIkZPTyI7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgic3ViMiIpCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9iYXIiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEJhcigpIHsKKyAgICAgICAgICAgIHJldHVybiAiQkFSIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFdpdGhQcm9kdWNlTm9IZWFkRGlmZmVyZW50U3ViKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VHZXRXaXRoUHJvZHVjZU5vSGVhZERpZmZlcmVudFN1Yi5jbGFzcyk7CisKKyAgICAgICAgTWVkaWFUeXBlIGZvbyA9IE1lZGlhVHlwZS52YWx1ZU9mKCJhcHBsaWNhdGlvbi9mb28iKTsKKyAgICAgICAgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9zdWIxIiwgIkhFQUQiKS5hY2NlcHQoZm9vKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRGYWxzZShyZXNwb25zZS5oYXNFbnRpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmb28sIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKworICAgICAgICBNZWRpYVR5cGUgYmFyID0gTWVkaWFUeXBlLnZhbHVlT2YoImFwcGxpY2F0aW9uL2JhciIpOworICAgICAgICByZXNwb25zZSA9IGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3N1YjIiLCAiSEVBRCIpLmFjY2VwdChiYXIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHJlc3BvbnNlLmhhc0VudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGJhciwgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL0hlYWRUZXN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9IZWFkVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNmM3NjUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9IZWFkVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzA0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5IRUFEOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yQ29udGV4dDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXF1ZXN0Q29udGV4dEJ1aWxkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKKworLyoqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSGVhZFRlc3QgeworCisgICAgcHJpdmF0ZSBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwOworCisgICAgcHJpdmF0ZSB2b2lkIGluaXRpYXRlV2ViQXBwbGljYXRpb24oQ2xhc3M8Pz4uLi4gY2xhc3NlcykgeworICAgICAgICBhcHAgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKG5ldyBSZXNvdXJjZUNvbmZpZyhjbGFzc2VzKSk7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VHZXROb0hlYWQgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gIkdFVCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXROb0hlYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZUdldE5vSGVhZC5jbGFzcyk7CisKKyAgICAgICAgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8iLCAiSEVBRCIpLmJ1aWxkKCkpLmdldCgpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgU3RyaW5nIGxlbmd0aCA9IHJlc3BvbnNlLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5DT05URU5UX0xFTkdUSCk7CisgICAgICAgIGFzc2VydE5vdE51bGwobGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIEludGVnZXIucGFyc2VJbnQobGVuZ3RoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHJlc3BvbnNlLmhhc0VudGl0eSgpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZUdldFdpdGhIZWFkIHsKKworICAgICAgICBASEVBRAorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgaGVhZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygpLmhlYWRlcigiWC1URVNUIiwgIkhFQUQiKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCJHRVQiKS5oZWFkZXIoIlgtVEVTVCIsICJHRVQiKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0V2l0aEhlYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZUdldFdpdGhIZWFkLmNsYXNzKTsKKworICAgICAgICBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJIRUFEIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocmVzcG9uc2UuaGFzRW50aXR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkhFQUQiLCByZXNwb25zZS5nZXRIZWFkZXJzKCkuZ2V0Rmlyc3QoIlgtVEVTVCIpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZUdldFdpdGhQcm9kdWNlTm9IZWFkIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZm9vIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRGb28oKSB7CisgICAgICAgICAgICByZXR1cm4gIkZPTyI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYmFyIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRCYXIoKSB7CisgICAgICAgICAgICByZXR1cm4gIkJBUiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRXaXRoUHJvZHVjZU5vSGVhZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlR2V0V2l0aFByb2R1Y2VOb0hlYWQuY2xhc3MpOworCisgICAgICAgIE1lZGlhVHlwZSBmb28gPSBNZWRpYVR5cGUudmFsdWVPZigiYXBwbGljYXRpb24vZm9vIik7CisgICAgICAgIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvIiwgIkhFQUQiKS5hY2NlcHQoZm9vKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRGYWxzZShyZXNwb25zZS5oYXNFbnRpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhmb28sIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKworICAgICAgICBNZWRpYVR5cGUgYmFyID0gTWVkaWFUeXBlLnZhbHVlT2YoImFwcGxpY2F0aW9uL2JhciIpOworICAgICAgICByZXNwb25zZSA9IGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJIRUFEIikuYWNjZXB0KGJhcikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocmVzcG9uc2UuaGFzRW50aXR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoYmFyLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKSk7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VHZXRXaXRoUHJvZHVjZVdpdGhIZWFkIHsKKworICAgICAgICBASEVBRAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2ZvbyIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBoZWFkRm9vKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCkuaGVhZGVyKCJYLVRFU1QiLCAiRk9PLUhFQUQiKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2ZvbyIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXRGb28oKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soIkdFVCIsICJhcHBsaWNhdGlvbi9mb28iKS5oZWFkZXIoIlgtVEVTVCIsICJGT08tR0VUIikuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBIRUFECisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYmFyIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGhlYWRCYXIoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soKS5oZWFkZXIoIlgtVEVTVCIsICJCQVItSEVBRCIpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYmFyIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldEJhcigpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygiR0VUIikuaGVhZGVyKCJYLVRFU1QiLCAiQkFSLUdFVCIpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRXaXRoUHJvZHVjZVdpdGhIZWFkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VHZXRXaXRoUHJvZHVjZVdpdGhIZWFkLmNsYXNzKTsKKworICAgICAgICBNZWRpYVR5cGUgZm9vID0gTWVkaWFUeXBlLnZhbHVlT2YoImFwcGxpY2F0aW9uL2ZvbyIpOworICAgICAgICBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJIRUFEIikuYWNjZXB0KGZvbykuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocmVzcG9uc2UuaGFzRW50aXR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZm9vLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiRk9PLUhFQUQiLCByZXNwb25zZS5nZXRIZWFkZXJzKCkuZ2V0Rmlyc3QoIlgtVEVTVCIpLnRvU3RyaW5nKCkpOworCisgICAgICAgIE1lZGlhVHlwZSBiYXIgPSBNZWRpYVR5cGUudmFsdWVPZigiYXBwbGljYXRpb24vYmFyIik7CisgICAgICAgIHJlc3BvbnNlID0gYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvIiwgIkhFQUQiKS5hY2NlcHQoYmFyKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRGYWxzZShyZXNwb25zZS5oYXNFbnRpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhiYXIsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJCQVItSEVBRCIsIHJlc3BvbnNlLmdldEhlYWRlcnMoKS5nZXRGaXJzdCgiWC1URVNUIikudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VHZXRCeXRlTm9IZWFkIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBieXRlW10gZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJHRVQiLmdldEJ5dGVzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRCeXRlTm9IZWFkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VHZXRCeXRlTm9IZWFkLmNsYXNzKTsKKworICAgICAgICBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJIRUFEIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgU3RyaW5nIGxlbmd0aCA9IHJlc3BvbnNlLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5DT05URU5UX0xFTkdUSCk7CisgICAgICAgIGFzc2VydE5vdE51bGwobGVuZ3RoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIEludGVnZXIucGFyc2VJbnQobGVuZ3RoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUuQVBQTElDQVRJT05fT0NURVRfU1RSRUFNX1RZUEUsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocmVzcG9uc2UuaGFzRW50aXR5KCkpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlR2V0V2l0aE5vUHJvZHVjZXMgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldFBsYWluKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCJ0ZXh0IikuaGVhZGVyKCJ4LXZhbHVlIiwgInRleHQiKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L2h0bWwiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0SHRtbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygiaHRtbCIpLmhlYWRlcigieC12YWx1ZSIsICJodG1sIikKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZVhYWCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlR2V0V2l0aE5vUHJvZHVjZXMuY2xhc3MpOworCisgICAgICAgIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvIiwgIkhFQUQiKS5hY2NlcHQoInRleHQvcGxhaW4iKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQiLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIngtdmFsdWUiKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8iLCAiSEVBRCIpLmFjY2VwdCgidGV4dC9odG1sIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJodG1sIiwgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJ4LXZhbHVlIikpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIElucHV0U3RyZWFtUmVzb3VyY2UgeworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gSU5QVVRfU1RSRUFNX0NMT1NFRCA9IGZhbHNlOworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIElucHV0U3RyZWFtIHRlc3RJbnB1dFN0cmVhbSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSW5wdXRTdHJlYW0oKSB7CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICBJTlBVVF9TVFJFQU1fQ0xPU0VEID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbnB1dFN0cmVhbVdyaXRlckludGVyY2VwdG9yIGltcGxlbWVudHMgV3JpdGVySW50ZXJjZXB0b3IgeworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gSU5QVVRfU1RSRUFNX0NMT1NFRCA9IGZhbHNlOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBhcm91bmRXcml0ZVRvKGZpbmFsIFdyaXRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gKElucHV0U3RyZWFtKSBjb250ZXh0LmdldEVudGl0eSgpOworCisgICAgICAgICAgICBjb250ZXh0LnNldEVudGl0eShuZXcgSW5wdXRTdHJlYW0oKSB7CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXRTdHJlYW0ucmVhZCgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgSU5QVVRfU1RSRUFNX0NMT1NFRCA9IHRydWU7CisKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgY29udGV4dC5wcm9jZWVkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHdoZXRoZXIgYW4gaW5wdXQgc3RyZWFtIHJldHVybmVkIGZyb20gcmVzb3VyY2UgbWV0aG9kIGlzIHByb3Blcmx5IGNsb3NlZCB3aGVuIHRoZSBtZXRob2QgaXMgaW52b2tlZCB0byBoYW5kbGUgSFRUUAorICAgICAqIEhFQUQgcmVxdWVzdC4KKyAgICAgKiA8cC8+CisgICAgICogSkVSU0VZLTE5MjIgcmVwcm9kdWNlci4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIZWFkV2l0aElucHV0U3RyZWFtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oSW5wdXRTdHJlYW1SZXNvdXJjZS5jbGFzcywgSW5wdXRTdHJlYW1Xcml0ZXJJbnRlcmNlcHRvci5jbGFzcyk7CisKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8iLCAiSEVBRCIpLmJ1aWxkKCkpLmdldCgpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQoSW5wdXRTdHJlYW1SZXNvdXJjZS5JTlBVVF9TVFJFQU1fQ0xPU0VELCBpcyh0cnVlKSk7CisgICAgICAgIGFzc2VydFRoYXQoSW5wdXRTdHJlYW1Xcml0ZXJJbnRlcmNlcHRvci5JTlBVVF9TVFJFQU1fQ0xPU0VELCBpcyh0cnVlKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvSW5uZXJDbGFzc1dpdGhHZW5lcmljVHlwZVRlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL0lubmVyQ2xhc3NXaXRoR2VuZXJpY1R5cGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU5NjAxMQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL0lubmVyQ2xhc3NXaXRoR2VuZXJpY1R5cGVUZXN0LmphdmEKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlcXVlc3RDb250ZXh0QnVpbGRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGFrZW4gZnJvbSBKZXJzZXktMTogamVyc2V5LXRlc3RzOmNvbS5zdW4uamVyc2V5LmltcGwuc3VicmVzb3VyY2VzLklubmVyQ2xhc3NXaXRoR2VuZXJpY1R5cGVUZXN0CisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitwdWJsaWMgY2xhc3MgSW5uZXJDbGFzc1dpdGhHZW5lcmljVHlwZVRlc3QgeworCisgICAgQXBwbGljYXRpb25IYW5kbGVyIGFwcDsKKworICAgIHByaXZhdGUgQXBwbGljYXRpb25IYW5kbGVyIGNyZWF0ZUFwcGxpY2F0aW9uKENsYXNzPD8+Li4uIGNsYXNzZXMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIobmV3IFJlc291cmNlQ29uZmlnKGNsYXNzZXMpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSb290UmVzb3VyY2UgeworCisgICAgICAgIEBQYXRoKCJzdWIiKQorICAgICAgICBwdWJsaWMgU3ViUmVzb3VyY2UgZ2V0U3ViKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdWJSZXNvdXJjZShuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSwgbmV3IEhhc2hTZXQ8SW50ZWdlcj4oKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgY2xhc3MgU3ViUmVzb3VyY2UgZXh0ZW5kcyBSb290UmVzb3VyY2UgeworCisgICAgICAgICAgICBwdWJsaWMgU3ViUmVzb3VyY2UoTGlzdDxTdHJpbmc+IGxpc3QsIFNldDxJbnRlZ2VyPiBzKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBHRVQKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgICAgIHJldHVybiAic3ViIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElubmVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXBwID0gY3JlYXRlQXBwbGljYXRpb24oUm9vdFJlc291cmNlLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoInN1YiIsIGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3N1YiIsICJHRVQiKS5idWlsZCgpKS5nZXQoKS5nZXRFbnRpdHkoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvTWV0aG9kTGlzdFRlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL01ldGhvZExpc3RUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzc4ZDQzNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL01ldGhvZExpc3RUZXN0LmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWw7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqLworcHVibGljIGNsYXNzIE1ldGhvZExpc3RUZXN0IHsKKyAgICBwdWJsaWMgY2xhc3MgQ1B1YmxpYyB7CisgICAgICAgIHB1YmxpYyB2b2lkIGEoKSB7fQorICAgICAgICBwdWJsaWMgdm9pZCBiKCkge30KKyAgICAgICAgcHVibGljIHZvaWQgYygpIHt9CisgICAgfQorCisgICAgcHVibGljIGludGVyZmFjZSBJUHVibGljIHsKKyAgICAgICAgcHVibGljIHZvaWQgYSgpOworICAgICAgICBwdWJsaWMgdm9pZCBiKCk7CisgICAgICAgIHB1YmxpYyB2b2lkIGMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgQ1ByaXZhdGUgeworICAgICAgICBwcml2YXRlIHZvaWQgYSgpIHt9CisgICAgICAgIHByaXZhdGUgdm9pZCBiKCkge30KKyAgICAgICAgcHJpdmF0ZSB2b2lkIGMoKSB7fQorICAgIH0KKworICAgIHB1YmxpYyBjbGFzcyBDUHJpdmF0ZUJhc2UgeworICAgICAgICBwcml2YXRlIHZvaWQgYSgpIHt9CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIENQcml2YXRlSW5oZXJpdGVkIGV4dGVuZHMgQ1ByaXZhdGVCYXNlIHsKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGIoKSB7fQorICAgICAgICBwcml2YXRlIHZvaWQgYygpIHt9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NQdWJsaWNNZXRob2RzKCkgeworICAgICAgICB0ZXN0KENQdWJsaWMuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEludGVyZmFjZVB1YmxpY01ldGhvZHMoKSB7CisgICAgICAgIHRlc3QoSVB1YmxpYy5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NQcml2YXRlTWV0aG9kc0luaGVyaXRlZCgpIHsKKyAgICAgICAgdGVzdChDUHJpdmF0ZUluaGVyaXRlZC5jbGFzcywgdHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NQcml2YXRlTWV0aG9kcygpIHsKKyAgICAgICAgdGVzdChDUHJpdmF0ZS5jbGFzcywgdHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3QoQ2xhc3MgYykgeworICAgICAgICB0ZXN0KGMsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdChDbGFzcyBjLCBib29sZWFuIHByaXZhdGVNZXRob2RzKSB7CisgICAgICAgIE1ldGhvZExpc3QgbWwgPSBuZXcgTWV0aG9kTGlzdChDUHVibGljLmNsYXNzLCBwcml2YXRlTWV0aG9kcyk7CisKKyAgICAgICAgU2V0PFN0cmluZz4gcyA9IG5ldyBIYXNoU2V0PFN0cmluZz4oKTsKKyAgICAgICAgZm9yIChBbm5vdGF0ZWRNZXRob2QgYW0gOiBtbCkgeworICAgICAgICAgICAgcy5hZGQoYW0uZ2V0TWV0aG9kKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydFRydWUocy5jb250YWlucygiYSIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzLmNvbnRhaW5zKCJiIikpOworICAgICAgICBhc3NlcnRUcnVlKHMuY29udGFpbnMoImMiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvTWl4ZWRSZXNvdXJjZUNvbmZpZ3VyYXRpb25UZXN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9NaXhlZFJlc291cmNlQ29uZmlndXJhdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzFhNmU1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvTWl4ZWRSZXNvdXJjZUNvbmZpZ3VyYXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWw7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuSW5mbGVjdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXF1ZXN0Q29udGV4dEJ1aWxkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3Qgb2YgbWl4ZWQgKHByb2dyYW1tYXRpYyBhbmQgYW5ub3RhdGlvbi1iYXNlZCkgcmVzb3VyY2UgY29uZmlndXJhdGlvbi4KKyAqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgTWl4ZWRSZXNvdXJjZUNvbmZpZ3VyYXRpb25UZXN0IHsKKworICAgIHN0YXRpYyB2b2xhdGlsZSBTdHJpbmcgbmFtZSA9ICJMYWR5IjsKKworICAgIEBQYXRoKCIvbmFtZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBOYW1lUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRNZXRob2QoKSB7CisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFB1dEdldCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhOYW1lUmVzb3VyY2UuY2xhc3MpOworICAgICAgICBmaW5hbCBSZXNvdXJjZS5CdWlsZGVyIHJlc291cmNlQnVpbGRlciA9IFJlc291cmNlLmJ1aWxkZXIoIi9uYW1lIik7CisgICAgICAgIHJlc291cmNlQnVpbGRlci5hZGRNZXRob2QoIlBVVCIpLmhhbmRsZWRCeShuZXcgSW5mbGVjdG9yPENvbnRhaW5lclJlcXVlc3RDb250ZXh0LCBSZXNwb25zZT4oKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFJlc3BvbnNlIGFwcGx5KENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3QpIHsKKyAgICAgICAgICAgICAgICBuYW1lID0gKChDb250YWluZXJSZXF1ZXN0KSByZXF1ZXN0KS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCkuYnVpbGQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVyUmVzb3VyY2VzKHJlc291cmNlQnVpbGRlci5idWlsZCgpKTsKKyAgICAgICAgZmluYWwgQXBwbGljYXRpb25IYW5kbGVyIGFwcGxpY2F0aW9uID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihyZXNvdXJjZUNvbmZpZyk7CisKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBhcHBsaWNhdGlvbi5hcHBseSgKKyAgICAgICAgICAgICAgICBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL25hbWUiLCAiUFVUIikuZW50aXR5KCJHYWdhIikudHlwZShNZWRpYVR5cGUuVEVYVF9QTEFJTikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIkdhZ2EiLCBhcHBsaWNhdGlvbi5hcHBseSgKKyAgICAgICAgICAgICAgICBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL25hbWUiLCAiR0VUIikuYWNjZXB0KE1lZGlhVHlwZS5URVhUX1BMQUlOKS5idWlsZCgpKS5nZXQoKS5nZXRFbnRpdHkoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvT3B0aW9uc1N1YlJlc291cmNlTWV0aG9kVGVzdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvT3B0aW9uc1N1YlJlc291cmNlTWV0aG9kVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZWRiZTUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9PcHRpb25zU3ViUmVzb3VyY2VNZXRob2RUZXN0LmphdmEKQEAgLTAsMCArMSwyMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5ERUxFVEU7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLkh0dHBNZXRob2Q7CitpbXBvcnQgamF2YXgud3MucnMuT1BUSU9OUzsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBVVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVxdWVzdENvbnRleHRCdWlsZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBPcHRpb25zU3ViUmVzb3VyY2VNZXRob2RUZXN0IHsKKworICAgIEBUYXJnZXQoe0VsZW1lbnRUeXBlLk1FVEhPRH0pCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgICBASHR0cE1ldGhvZCgiUEFUQ0giKQorICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBBVENIIHsKKyAgICB9CisKKyAgICBwcml2YXRlIEFwcGxpY2F0aW9uSGFuZGxlciBhcHA7CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihDbGFzczw/Pi4uLiBjbGFzc2VzKSB7CisgICAgICAgIGFwcCA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIobmV3IFJlc291cmNlQ29uZmlnKGNsYXNzZXMpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZU5vT3B0aW9ucyB7CisKKyAgICAgICAgQFBhdGgoInN1YiIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gIkdFVCI7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgic3ViIikKKyAgICAgICAgQFBVVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHB1dChTdHJpbmcgZSkgeworICAgICAgICAgICAgcmV0dXJuICJQVVQiOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInN1YiIpCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdChTdHJpbmcgZSkgeworICAgICAgICAgICAgcmV0dXJuICJQT1NUIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJzdWIiKQorICAgICAgICBAREVMRVRFCisgICAgICAgIHB1YmxpYyB2b2lkIGRlbGV0ZSgpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJzdWIiKQorICAgICAgICBAUEFUQ0gKKyAgICAgICAgcHVibGljIFN0cmluZyBwYXRjaChTdHJpbmcgZSkgeworICAgICAgICAgICAgcmV0dXJuICJQQVRDSCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb09wdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihSZXNvdXJjZU5vT3B0aW9ucy5jbGFzcyk7CisKKyAgICAgICAgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9zdWIiLCAiT1BUSU9OUyIpLmJ1aWxkKCkpLmdldCgpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgX2NoZWNrQWxsb3dDb250ZW50KHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiQWxsb3ciKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9zdWIiLCAiT1BUSU9OUyIpLmFjY2VwdChNZWRpYVR5cGUuVEVYVF9IVE1MKS5idWlsZCgpKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIF9jaGVja0FsbG93Q29udGVudChyZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIkFsbG93IikpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfY2hlY2tBbGxvd0NvbnRlbnQoZmluYWwgU3RyaW5nIGFsbG93KSB7CisgICAgICAgIGFzc2VydFRydWUoYWxsb3cuY29udGFpbnMoIk9QVElPTlMiKSk7CisgICAgICAgIGFzc2VydFRydWUoYWxsb3cuY29udGFpbnMoIkdFVCIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShhbGxvdy5jb250YWlucygiUFVUIikpOworICAgICAgICBhc3NlcnRUcnVlKGFsbG93LmNvbnRhaW5zKCJQT1NUIikpOworICAgICAgICBhc3NlcnRUcnVlKGFsbG93LmNvbnRhaW5zKCJERUxFVEUiKSk7CisgICAgICAgIGFzc2VydFRydWUoYWxsb3cuY29udGFpbnMoIlBBVENIIikpOworCisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VXaXRoT3B0aW9ucyB7CisKKyAgICAgICAgQFBhdGgoInN1YiIpCisgICAgICAgIEBPUFRJT05TCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBvcHRpb25zKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCJPUFRJT05TIikKKyAgICAgICAgICAgICAgICAgICAgLmhlYWRlcigiQWxsb3ciLCAiT1BUSU9OUywgR0VULCBQVVQsIFBPU1QsIERFTEVURSwgUEFUQ0giKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInN1YiIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gIkdFVCI7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgic3ViIikKKyAgICAgICAgQFBVVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHB1dChTdHJpbmcgZSkgeworICAgICAgICAgICAgcmV0dXJuICJQVVQiOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInN1YiIpCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdChTdHJpbmcgZSkgeworICAgICAgICAgICAgcmV0dXJuICJQT1NUIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJzdWIiKQorICAgICAgICBAREVMRVRFCisgICAgICAgIHB1YmxpYyB2b2lkIGRlbGV0ZSgpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJzdWIiKQorICAgICAgICBAUEFUQ0gKKyAgICAgICAgcHVibGljIFN0cmluZyBwYXRjaChTdHJpbmcgZSkgeworICAgICAgICAgICAgcmV0dXJuICJQQVRDSCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaXRoT3B0aW9ucygpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VXaXRoT3B0aW9ucy5jbGFzcyk7CisKKyAgICAgICAgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9zdWIiLCAiT1BUSU9OUyIpLmJ1aWxkKCkpLmdldCgpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICBTdHJpbmcgYWxsb3cgPSByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIkFsbG93Iik7CisgICAgICAgIGFzc2VydFRydWUoYWxsb3cuY29udGFpbnMoIk9QVElPTlMiKSk7CisgICAgICAgIGFzc2VydFRydWUoYWxsb3cuY29udGFpbnMoIkdFVCIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShhbGxvdy5jb250YWlucygiUFVUIikpOworICAgICAgICBhc3NlcnRUcnVlKGFsbG93LmNvbnRhaW5zKCJQT1NUIikpOworICAgICAgICBhc3NlcnRUcnVlKGFsbG93LmNvbnRhaW5zKCJERUxFVEUiKSk7CisgICAgICAgIGFzc2VydFRydWUoYWxsb3cuY29udGFpbnMoIlBBVENIIikpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlTm9PcHRpb25zRGlmZmVyZW50U3ViIHsKKworICAgICAgICBAUGF0aCgic3ViMSIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRGb28oKSB7CisgICAgICAgICAgICByZXR1cm4gIkZPTyI7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgic3ViMiIpCisgICAgICAgIEBQVVQKKyAgICAgICAgcHVibGljIFN0cmluZyBwdXRCYXIoKSB7CisgICAgICAgICAgICByZXR1cm4gIkJBUiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb09wdGlvbnNEaWZmZXJlbnRTdWIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKFJlc291cmNlTm9PcHRpb25zRGlmZmVyZW50U3ViLmNsYXNzKTsKKworICAgICAgICBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3N1YjEiLCAiT1BUSU9OUyIpLmJ1aWxkKCkpLmdldCgpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICBTdHJpbmcgYWxsb3cgPSByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIkFsbG93Iik7CisgICAgICAgIGFzc2VydFRydWUoYWxsb3cuY29udGFpbnMoIk9QVElPTlMiKSk7CisgICAgICAgIGFzc2VydFRydWUoYWxsb3cuY29udGFpbnMoIkdFVCIpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoYWxsb3cuY29udGFpbnMoIlBVVCIpKTsKKworICAgICAgICByZXNwb25zZSA9IGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3N1YjIiLCAiT1BUSU9OUyIpLmJ1aWxkKCkpLmdldCgpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICBhbGxvdyA9IHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiQWxsb3ciKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShhbGxvdy5jb250YWlucygiT1BUSU9OUyIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShhbGxvdy5jb250YWlucygiUFVUIikpOworICAgICAgICBhc3NlcnRGYWxzZShhbGxvdy5jb250YWlucygiR0VUIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL09wdGlvbnNUZXN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9PcHRpb25zVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNGRhZTkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9PcHRpb25zVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzE3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuREVMRVRFOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5IdHRwTWV0aG9kOworaW1wb3J0IGphdmF4LndzLnJzLk9QVElPTlM7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QVVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlc3BvbnNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5NZWRpYVR5cGVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXF1ZXN0Q29udGV4dEJ1aWxkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5BcHBsaWNhdGlvbjsKKworLyoqCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIE9wdGlvbnNUZXN0IHsKKworICAgIEBUYXJnZXQoe0VsZW1lbnRUeXBlLk1FVEhPRH0pCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgICBASHR0cE1ldGhvZCgicGF0Y2giKQorICAgIHB1YmxpYyBAaW50ZXJmYWNlIFBBVENIIHsKKyAgICB9CisKKyAgICBwcml2YXRlIEFwcGxpY2F0aW9uSGFuZGxlciBhcHA7CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihDbGFzczw/Pi4uLiBjbGFzc2VzKSB7CisgICAgICAgIGFwcCA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIobmV3IFJlc291cmNlQ29uZmlnKGNsYXNzZXMpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZU5vT3B0aW9ucyB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiR0VUIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQVVQKKyAgICAgICAgcHVibGljIFN0cmluZyBwdXQoU3RyaW5nIGUpIHsKKyAgICAgICAgICAgIHJldHVybiAiUFVUIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdChTdHJpbmcgZSkgeworICAgICAgICAgICAgcmV0dXJuICJQT1NUIjsKKyAgICAgICAgfQorCisgICAgICAgIEBERUxFVEUKKyAgICAgICAgcHVibGljIHZvaWQgZGVsZXRlKCkgeworICAgICAgICB9CisKKyAgICAgICAgQFBBVENICisgICAgICAgIHB1YmxpYyBTdHJpbmcgcGF0Y2goU3RyaW5nIGUpIHsKKyAgICAgICAgICAgIHJldHVybiAiUEFUQ0giOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9PcHRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VOb09wdGlvbnMuY2xhc3MpOworCisgICAgICAgIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvIiwgIk9QVElPTlMiKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBfY2hlY2tBbGxvd0NvbnRlbnQocmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJBbGxvdyIpKTsKKworICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlID0gTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTF9UWVBFOworICAgICAgICByZXNwb25zZSA9IGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJPUFRJT05TIikuYWNjZXB0KG1lZGlhVHlwZSkuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1lZGlhVHlwZSwgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcmVzcG9uc2UuZ2V0TGVuZ3RoKCkpOworICAgICAgICBfY2hlY2tBbGxvd0NvbnRlbnQocmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJBbGxvdyIpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX2NoZWNrQWxsb3dDb250ZW50KFN0cmluZyBhbGxvdykgeworICAgICAgICBhc3NlcnRUcnVlKGFsbG93LmNvbnRhaW5zKCJPUFRJT05TIikpOworICAgICAgICBhc3NlcnRUcnVlKGFsbG93LmNvbnRhaW5zKCJHRVQiKSk7CisgICAgICAgIGFzc2VydFRydWUoYWxsb3cuY29udGFpbnMoIlBVVCIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShhbGxvdy5jb250YWlucygiUE9TVCIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShhbGxvdy5jb250YWlucygiREVMRVRFIikpOworICAgICAgICBhc3NlcnRUcnVlKGFsbG93LmNvbnRhaW5zKCJQQVRDSCIpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVdpdGhPcHRpb25zIHsKKworICAgICAgICBAT1BUSU9OUworICAgICAgICBwdWJsaWMgUmVzcG9uc2Ugb3B0aW9ucygpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygiT1BUSU9OUyIpCisgICAgICAgICAgICAgICAgICAgIC5oZWFkZXIoIkFsbG93IiwgIk9QVElPTlMsIEdFVCwgUFVULCBQT1NULCBERUxFVEUsIFBBVENIIikKKyAgICAgICAgICAgICAgICAgICAgLmhlYWRlcigiWC1URVNUIiwgIk9WRVJSSURFIikuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gIkdFVCI7CisgICAgICAgIH0KKworICAgICAgICBAUFVUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcHV0KFN0cmluZyBlKSB7CisgICAgICAgICAgICByZXR1cm4gIlBVVCI7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3QoU3RyaW5nIGUpIHsKKyAgICAgICAgICAgIHJldHVybiAiUE9TVCI7CisgICAgICAgIH0KKworICAgICAgICBAREVMRVRFCisgICAgICAgIHB1YmxpYyB2b2lkIGRlbGV0ZSgpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBQQVRDSAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBhdGNoKFN0cmluZyBlKSB7CisgICAgICAgICAgICByZXR1cm4gIlBBVENIIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdpdGhPcHRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGluaXRpYXRlV2ViQXBwbGljYXRpb24oUmVzb3VyY2VXaXRoT3B0aW9ucy5jbGFzcyk7CisKKyAgICAgICAgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8iLCAiT1BUSU9OUyIpLmJ1aWxkKCkpLmdldCgpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICBTdHJpbmcgYWxsb3cgPSByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIkFsbG93Iik7CisgICAgICAgIGFzc2VydFRydWUoYWxsb3cuY29udGFpbnMoIk9QVElPTlMiKSk7CisgICAgICAgIGFzc2VydFRydWUoYWxsb3cuY29udGFpbnMoIkdFVCIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShhbGxvdy5jb250YWlucygiUFVUIikpOworICAgICAgICBhc3NlcnRUcnVlKGFsbG93LmNvbnRhaW5zKCJQT1NUIikpOworICAgICAgICBhc3NlcnRUcnVlKGFsbG93LmNvbnRhaW5zKCJERUxFVEUiKSk7CisgICAgICAgIGFzc2VydFRydWUoYWxsb3cuY29udGFpbnMoIlBBVENIIikpOworCisgICAgICAgIGFzc2VydEVxdWFscygiT1ZFUlJJREUiLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIlgtVEVTVCIpKTsKKyAgICB9CisKKyAgICBAUGF0aCgicmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgV2FkbFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJnZXQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWVzdE5vVHlwZSgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgQXBwbGljYXRpb25IYW5kbGVyIGFwcGxpY2F0aW9uID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihuZXcgUmVzb3VyY2VDb25maWcoV2FkbFJlc291cmNlLmNsYXNzKSk7CisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlcXVlc3QgcmVxdWVzdCA9IFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvcmVzb3VyY2UiLCAiT1BUSU9OUyIpLmJ1aWxkKCk7CisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gYXBwbGljYXRpb24uYXBwbHkocmVxdWVzdCkuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGZpbmFsIE1lZGlhVHlwZSB0eXBlID0gcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHR5cGUuZXF1YWxzKE1lZGlhVHlwZXMuV0FETF9UWVBFKSB8fCB0eXBlLmVxdWFscyhNZWRpYVR5cGUuVEVYVF9IVE1MX1RZUEUpCisgICAgICAgICAgICAgICAgfHwgdHlwZS5lcXVhbHMoTWVkaWFUeXBlLlRFWFRfUExBSU4pKTsKKworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcXVlc3RUZXh0UGxhaW4oKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbiA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIobmV3IFJlc291cmNlQ29uZmlnKFdhZGxSZXNvdXJjZS5jbGFzcywgUmVzcG9uc2VUZXh0RmlsdGVyLmNsYXNzKSk7CisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gdGVzdE9wdGlvbnMoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSwgYXBwbGljYXRpb24sICIvcmVzb3VyY2UiKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGVudGl0eSA9IChTdHJpbmcpIHJlc3BvbnNlLmdldEVudGl0eSgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShlbnRpdHkuY29udGFpbnMoIkdFVCIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1ZXN0VGV4dEh0bWwoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbiA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIobmV3IFJlc291cmNlQ29uZmlnKFdhZGxSZXNvdXJjZS5jbGFzcywgUmVzcG9uc2VIdG1sRmlsdGVyLmNsYXNzKSk7CisgICAgICAgIGZpbmFsIE1lZGlhVHlwZSByZXF1ZXN0VHlwZSA9IE1lZGlhVHlwZS5URVhUX0hUTUxfVFlQRTsKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSB0ZXN0T3B0aW9ucyhyZXF1ZXN0VHlwZSwgYXBwbGljYXRpb24sICIvcmVzb3VyY2UiKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocmVzcG9uc2UuZ2V0QWxsb3dlZE1ldGhvZHMoKS5jb250YWlucygiR0VUIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcXVlc3RXYWRsKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwbGljYXRpb24gPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKG5ldyBSZXNvdXJjZUNvbmZpZyhXYWRsUmVzb3VyY2UuY2xhc3MsIFJlc3BvbnNlV2FkbEZpbHRlci5jbGFzcykpOworICAgICAgICBmaW5hbCBNZWRpYVR5cGUgcmVxdWVzdFR5cGUgPSBNZWRpYVR5cGVzLldBRExfVFlQRTsKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSB0ZXN0T3B0aW9ucyhyZXF1ZXN0VHlwZSwgYXBwbGljYXRpb24sICIvcmVzb3VyY2UiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSZXNwb25zZVRleHRGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXNwb25zZUZpbHRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCwgQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSB0eXBlID0gcmVzcG9uc2VDb250ZXh0LmdldE1lZGlhVHlwZSgpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFLCB0eXBlKTsKKworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVzcG9uc2VIdG1sRmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsIENvbnRhaW5lclJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgdHlwZSA9IHJlc3BvbnNlQ29udGV4dC5nZXRNZWRpYVR5cGUoKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoTWVkaWFUeXBlLlRFWFRfSFRNTF9UWVBFLCB0eXBlKTsKKworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVzcG9uc2VXYWRsRmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsIENvbnRhaW5lclJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgdHlwZSA9IHJlc3BvbnNlQ29udGV4dC5nZXRNZWRpYVR5cGUoKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoTWVkaWFUeXBlcy5XQURMX1RZUEUsIHR5cGUpOworICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LmdldEVudGl0eSgpLmdldENsYXNzKCkuZXF1YWxzKEFwcGxpY2F0aW9uLmNsYXNzKTsKKworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIm5vLWdldCIpCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVzb3VyY2VXaXRob3V0R2V0TWV0aG9kIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3QoU3RyaW5nIGVudGl0eSkgeworICAgICAgICAgICAgcmV0dXJuIGVudGl0eTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJzdWIiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHN1YlBvc3QoU3RyaW5nIGVudGl0eSkgeworICAgICAgICAgICAgcmV0dXJuIGVudGl0eTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9IZWFkKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwbGljYXRpb24gPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZVdpdGhvdXRHZXRNZXRob2QuY2xhc3MpKTsKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSB0ZXN0T3B0aW9ucyhNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFLCBhcHBsaWNhdGlvbiwgIi9uby1nZXQiKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoKChTdHJpbmcpIHJlc3BvbnNlLmdldEVudGl0eSgpKS5jb250YWlucygiSEVBRCIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb0hlYWRXaWxkY2FyZCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2VXaXRob3V0R2V0TWV0aG9kLmNsYXNzKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5XQURMX0ZFQVRVUkVfRElTQUJMRSwgdHJ1ZSk7CisgICAgICAgIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbiA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIocmVzb3VyY2VDb25maWcpOworCisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlcXVlc3QgcmVxdWVzdCA9IFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvbm8tZ2V0IiwgIk9QVElPTlMiKS5hY2NlcHQoTWVkaWFUeXBlLk1FRElBX1RZUEVfV0lMRENBUkQpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gYXBwbGljYXRpb24uYXBwbHkocmVxdWVzdCkuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHN0cmluZ3MgPSByZXNwb25zZS5nZXRTdHJpbmdIZWFkZXJzKCkuZ2V0KEh0dHBIZWFkZXJzLkFMTE9XKTsKKyAgICAgICAgZm9yIChTdHJpbmcgYWxsb3cgOiBzdHJpbmdzKSB7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoYWxsb3cuY29udGFpbnMoIkhFQUQiKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIENvbnRhaW5lclJlc3BvbnNlIHRlc3RPcHRpb25zKE1lZGlhVHlwZSByZXF1ZXN0VHlwZSwgQXBwbGljYXRpb25IYW5kbGVyIGFwcGxpY2F0aW9uLCBTdHJpbmcgcGF0aCkKKyAgICAgICAgICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVxdWVzdCByZXF1ZXN0ID0gUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20ocGF0aCwgIk9QVElPTlMiKS5hY2NlcHQocmVxdWVzdFR5cGUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gYXBwbGljYXRpb24uYXBwbHkocmVxdWVzdCkuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGZpbmFsIE1lZGlhVHlwZSB0eXBlID0gcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocmVxdWVzdFR5cGUsIHR5cGUpOworICAgICAgICByZXR1cm4gcmVzcG9uc2U7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9IZWFkSW5TdWIoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbiA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIobmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlV2l0aG91dEdldE1ldGhvZC5jbGFzcykpOworICAgICAgICBmaW5hbCBNZWRpYVR5cGUgcmVxdWVzdFR5cGUgPSBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFOworICAgICAgICBmaW5hbCBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IHRlc3RPcHRpb25zKHJlcXVlc3RUeXBlLCBhcHBsaWNhdGlvbiwgIi9uby1nZXQvc3ViIik7CisgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZSgoKFN0cmluZykgcmVzcG9uc2UuZ2V0RW50aXR5KCkpLmNvbnRhaW5zKCJIRUFEIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL1BhcmFtZXRlclRlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL1BhcmFtZXRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGU1MWFkCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvUGFyYW1ldGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTU5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbDsKKworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdEVxdWFsczsKKworLyoqCisgKiBQYXJhbWV0ZXIgbW9kZWwgY3JlYXRpb24gdGVzdC4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgUGFyYW1ldGVyVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnRlcmZhY2UgR2VuZXJpY0NvbnRyYWN0SW50ZXJmYWNlPFQ+IHsKKyAgICAgICAgcHVibGljIGFic3RyYWN0IFQgcHJvY2VzcyhUIHBhcmFtKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBHZW5lcmljQ29udHJhY3RDbGFzczxUPiB7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBUIHByb2Nlc3MoVCBwYXJhbSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50ZXJmYWNlIENvbnRyYWN0SW50ZXJmYWNlIHsKKyAgICAgICAgcHVibGljIFN0cmluZyBwcm9jZXNzKFN0cmluZyBwYXJhbSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgQ29udHJhY3RDbGFzcyB7CisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgcHJvY2VzcyhTdHJpbmcgcGFyYW0pOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN0YW5kYWxvbmVTZXJ2aWNlQ2xhc3MgeworICAgICAgICBwdWJsaWMgU3RyaW5nIHByb2Nlc3MoU3RyaW5nIHBhcmFtKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEdlbmVyaWNDSVNlcnZpY2UgaW1wbGVtZW50cyBHZW5lcmljQ29udHJhY3RJbnRlcmZhY2U8U3RyaW5nPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcHJvY2VzcyhTdHJpbmcgcGFyYW0pIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgR2VuZXJpY0NJR2VuZXJpY1NlcnZpY2UgaW1wbGVtZW50cyBHZW5lcmljQ29udHJhY3RJbnRlcmZhY2U8TGlzdDxTdHJpbmc+PiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gcHJvY2VzcyhMaXN0PFN0cmluZz4gcGFyYW0pIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgR2VuZXJpY0NDU2VydmljZSBleHRlbmRzIEdlbmVyaWNDb250cmFjdENsYXNzPFN0cmluZz4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHByb2Nlc3MoU3RyaW5nIHBhcmFtKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEdlbmVyaWNDQ0dlbmVyaWNTZXJ2aWNlIGV4dGVuZHMgR2VuZXJpY0NvbnRyYWN0Q2xhc3M8TGlzdDxTdHJpbmc+PiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gcHJvY2VzcyhMaXN0PFN0cmluZz4gcGFyYW0pIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ0lTZXJ2aWNlIGltcGxlbWVudHMgQ29udHJhY3RJbnRlcmZhY2UgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHByb2Nlc3MoU3RyaW5nIHBhcmFtKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENDU2VydmljZSBleHRlbmRzIENvbnRyYWN0Q2xhc3MgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHByb2Nlc3MoU3RyaW5nIHBhcmFtKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgR2VuZXJpY0NDR2VuZXJpY0FycmF5U2VydmljZSBleHRlbmRzIEdlbmVyaWNDb250cmFjdENsYXNzPGJ5dGVbXT4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYnl0ZVtdIHByb2Nlc3MoYnl0ZVtdIHBhcmFtKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEdlbmVyaWNDSUdlbmVyaWNBcnJheVNlcnZpY2UgaW1wbGVtZW50cyBHZW5lcmljQ29udHJhY3RJbnRlcmZhY2U8Ynl0ZVtdPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBieXRlW10gcHJvY2VzcyhieXRlW10gcGFyYW0pIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFBhcmFtZXRlckNyZWF0aW9uKCkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7CisgICAgICAgIENsYXNzPD8+IGltcGxlbWVudGluZyA9IFN0YW5kYWxvbmVTZXJ2aWNlQ2xhc3MuY2xhc3M7CisgICAgICAgIENsYXNzPD8+IGRlY2xhcmluZyA9IFN0YW5kYWxvbmVTZXJ2aWNlQ2xhc3MuY2xhc3M7CisgICAgICAgIE1ldGhvZCBtZXRob2QgPSBkZWNsYXJpbmcuZ2V0TWV0aG9kKCJwcm9jZXNzIiwgT2JqZWN0LmNsYXNzKTsKKyAgICAgICAgZmluYWwgTGlzdDxQYXJhbWV0ZXI+IHBhcmFtZXRlcnMgPSBQYXJhbWV0ZXIuY3JlYXRlKGltcGxlbWVudGluZywgZGVjbGFyaW5nLCBtZXRob2QsIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHBhcmFtZXRlcnMuc2l6ZSgpKTsKKyAgICAgICAgUGFyYW1ldGVyIHBhcmFtZXRlciA9IHBhcmFtZXRlcnMuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmNsYXNzLCBwYXJhbWV0ZXIuZ2V0UmF3VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5jbGFzcywgcGFyYW1ldGVyLmdldFR5cGUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSkVSU0VZLTI0MDggRml4IHRlc3QgLSBtaXNzaW5nIGhhc2hDb2RlKCkgYW5kIGVxdWFscygpIGluIHtAbGluayBQYXJhbWV0ZXJ9IGNhdXNlZAorICAgICAqIHRoZSBkZXNjcmlwdG9yQ2FjaGUgaW4ge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5pbmplY3QuRGVsZWdhdGVkSW5qZWN0aW9uVmFsdWVGYWN0b3J5UHJvdmlkZXJ9IG5vdCB0bworICAgICAqIHJldXNlIHRoZSBQYXJhbWV0ZXIgaW5zdGFuY2VzIChQYXJhbWV0ZXIgd2FzIHVzZWQgYXMgYSBrZXkgaW4gYSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5oazIudXRpbGl0aWVzLmNhY2hlLkNhY2hlfSwKKyAgICAgKiB3aGljaCBkZWxlZ2F0ZXMgdG8gYW4gdW5kZXJseWluZyB7QGxpbmsgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXB9LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhcmFtZXRlckhhc2hDb2RlKCkgeworICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMgPSBuZXcgQW5ub3RhdGlvbltde25ldyBBbm5vdGF0aW9uKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGFubm90YXRpb25UeXBlKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBJbmplY3QuY2xhc3M7CisgICAgICAgICAgICB9CisgICAgICAgIH19OworICAgICAgICBQYXJhbWV0ZXIgcGFyYW0xID0gUGFyYW1ldGVyLmNyZWF0ZShTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgZmFsc2UsIFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLCBhbm5vdGF0aW9ucyk7CisgICAgICAgIFBhcmFtZXRlciBwYXJhbTIgPSBQYXJhbWV0ZXIuY3JlYXRlKFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLCBmYWxzZSwgU3RyaW5nLmNsYXNzLCBTdHJpbmcuY2xhc3MsIGFubm90YXRpb25zKTsKKyAgICAgICAgUGFyYW1ldGVyIHBhcmFtMyA9IFBhcmFtZXRlci5jcmVhdGUoSW50ZWdlci5jbGFzcywgSW50ZWdlci5jbGFzcywgZmFsc2UsIEludGVnZXIuY2xhc3MsIEludGVnZXIuY2xhc3MsIGFubm90YXRpb25zKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMocGFyYW0xLCBwYXJhbTIpOworICAgICAgICBhc3NlcnRFcXVhbHMocGFyYW0xLmhhc2hDb2RlKCksIHBhcmFtMi5oYXNoQ29kZSgpKTsKKyAgICAgICAgYXNzZXJ0Tm90RXF1YWxzKHBhcmFtMSwgcGFyYW0zKTsKKyAgICAgICAgYXNzZXJ0Tm90RXF1YWxzKHBhcmFtMS5oYXNoQ29kZSgpLCBwYXJhbTMuaGFzaENvZGUoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9QYXJhbWV0ZXJXaXRoTXVsdGlwbGVBbm5vdGF0aW9uc1Rlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL1BhcmFtZXRlcldpdGhNdWx0aXBsZUFubm90YXRpb25zVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4YjFhZGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9QYXJhbWV0ZXJXaXRoTXVsdGlwbGVBbm5vdGF0aW9uc1Rlc3QuamF2YQpAQCAtMCwwICsxLDg4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbDsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIENoZWNrcyB0aGF0IFBhcmFtZXRlcnMgd29yayBmaW5lIHdpdGggbXVsdGlwbGUgYW5ub3RhdGlvbnMuCisgKi8KK3B1YmxpYyBjbGFzcyBQYXJhbWV0ZXJXaXRoTXVsdGlwbGVBbm5vdGF0aW9uc1Rlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyYW1ldGVyc1dpdGhNdWx0aXBsZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBjaGVja015UmVzb3VyY2VNZXRob2QoInByb2Nlc3NUcmFpbGluZ1Vua25vd24iKTsKKyAgICAgICAgY2hlY2tNeVJlc291cmNlTWV0aG9kKCJwcm9jZXNzTGVhZGluZ1Vua25vd24iKTsKKyAgICAgICAgY2hlY2tNeVJlc291cmNlTWV0aG9kKCJwcm9jZXNzTGVhZGluZ0FuZFRyYWlsaW5nVW5rbm93biIpOworICAgICAgICBjaGVja015UmVzb3VyY2VNZXRob2QoInByb2Nlc3NTaW5nbGVVbmtub3duIik7CisgICAgICAgIGNoZWNrTXlSZXNvdXJjZU1ldGhvZCgicHJvY2Vzc0RvdWJsZVVua25vd24iKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tNeVJlc291cmNlTWV0aG9kKFN0cmluZyBtZXRob2ROYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgTWV0aG9kIG1ldGhvZCA9IE15UmVzb3VyY2UuY2xhc3MuZ2V0TWV0aG9kKG1ldGhvZE5hbWUsIFN0cmluZy5jbGFzcyk7CisgICAgICAgIGZpbmFsIExpc3Q8UGFyYW1ldGVyPiBwYXJhbWV0ZXJzID0gUGFyYW1ldGVyLmNyZWF0ZShNeVJlc291cmNlLmNsYXNzLCBNeVJlc291cmNlLmNsYXNzLCBtZXRob2QsIGZhbHNlKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcGFyYW1ldGVycy5zaXplKCkpOworCisgICAgICAgIGZpbmFsIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBwYXJhbWV0ZXJzLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1ldGhvZE5hbWUsIFN0cmluZy5jbGFzcywgcGFyYW1ldGVyLmdldFJhd1R5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtZXRob2ROYW1lLCBTdHJpbmcuY2xhc3MsIHBhcmFtZXRlci5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobWV0aG9kTmFtZSwgImNvcnJlY3QiLCBwYXJhbWV0ZXIuZ2V0U291cmNlTmFtZSgpKTsKKyAgICB9CisKKyAgICBAVGFyZ2V0KHtqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5QQVJBTUVURVIsIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRCwKKyAgICAgICAgICAgIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEfSkKKyAgICBAUmV0ZW50aW9uKGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FKQorICAgIHB1YmxpYyBAaW50ZXJmYWNlIExlYWRBbm5vdGF0aW9uIHsKKworICAgICAgICBTdHJpbmcgdmFsdWUoKSBkZWZhdWx0ICJsZWFkIjsKKyAgICB9CisKKyAgICBAVGFyZ2V0KHtqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5QQVJBTUVURVIsIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRCwKKyAgICAgICAgICAgIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEfSkKKyAgICBAUmV0ZW50aW9uKGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FKQorICAgIHB1YmxpYyBAaW50ZXJmYWNlIFRyYWlsQW5ub3RhdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIHZhbHVlKCkgZGVmYXVsdCAidHJhaWwiOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE15UmVzb3VyY2UgeworCisgICAgICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NUcmFpbGluZ1Vua25vd24oQFBhdGhQYXJhbSgiY29ycmVjdCIpIEBUcmFpbEFubm90YXRpb24gU3RyaW5nIGlkKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBwcm9jZXNzTGVhZGluZ1Vua25vd24oQExlYWRBbm5vdGF0aW9uIEBQYXRoUGFyYW0oImNvcnJlY3QiKSBTdHJpbmcgaWQpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NMZWFkaW5nQW5kVHJhaWxpbmdVbmtub3duKEBMZWFkQW5ub3RhdGlvbiBAUGF0aFBhcmFtKCJjb3JyZWN0IikgQFRyYWlsQW5ub3RhdGlvbiBTdHJpbmcgaWQpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NTaW5nbGVVbmtub3duKEBMZWFkQW5ub3RhdGlvbigiY29ycmVjdCIpIFN0cmluZyBpZCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcHJvY2Vzc0RvdWJsZVVua25vd24oQExlYWRBbm5vdGF0aW9uIEBUcmFpbEFubm90YXRpb24oImNvcnJlY3QiKSBTdHJpbmcgaWQpIHsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL1BhdGhBbmRSZXNvdXJjZU1ldGhvZEVycm9yc1Rlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL1BhdGhBbmRSZXNvdXJjZU1ldGhvZEVycm9yc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTQyMGYzCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvUGF0aEFuZFJlc291cmNlTWV0aG9kRXJyb3JzVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDA2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUFVUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5TZXZlcml0eTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICogVGFrZW4gZnJvbSBKZXJzZXkgMTogamVyc2V5LXRlc3RzOiBjb20uc3VuLmplcnNleS5pbXBsLmVycm9ycy5QYXRoQW5kUmVzb3VyY2VNZXRob2RFcnJvcnNUZXN0CisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitwdWJsaWMgY2xhc3MgUGF0aEFuZFJlc291cmNlTWV0aG9kRXJyb3JzVGVzdCB7CisKKyAgICBwcml2YXRlIExpc3Q8UmVzb3VyY2VNb2RlbElzc3VlPiBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKENsYXNzPD8+Li4uIHJlc291cmNlQ2xhc3NlcykgeworICAgICAgICByZXR1cm4gaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihuZXcgUmVzb3VyY2VDb25maWcocmVzb3VyY2VDbGFzc2VzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0PFJlc291cmNlTW9kZWxJc3N1ZT4gaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgQXBwbGljYXRpb25IYW5kbGVyIHNlcnZlciA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIocmVzb3VyY2VDb25maWcpOworICAgICAgICAgICAgZmFpbCgiQXBwbGljYXRpb24gYnVpbGQgZXhwZWN0ZWQgdG8gZmFpbDogIiArIHNlcnZlcik7CisgICAgICAgIH0gY2F0Y2ggKE1vZGVsVmFsaWRhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZS5nZXRJc3N1ZXMoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAUGF0aCgiL3siKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGF0aEVycm9yc1Jlc291cmNlIHsKKworICAgICAgICBAUGF0aCgiL3siKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiL3tzdWIiKQorICAgICAgICBwdWJsaWMgT2JqZWN0IHN1YigpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gRklYTUUKKyAgICBASWdub3JlCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGF0aEVycm9ycygpIHsKKyAgICAgICAgTGlzdDxSZXNvdXJjZU1vZGVsSXNzdWU+IGlzc3VlcyA9IGluaXRpYXRlV2ViQXBwbGljYXRpb24oUGF0aEVycm9yc1Jlc291cmNlLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGlzc3Vlcy5zaXplKCkpOworICAgIH0KKworICAgIC8vICAgVE9ETzogdGVzdGluZyBub3QgeWV0IGF2YWlsYWJsZSBmZWF0dXJlIChyZWdpc3RlcmluZyBleHBsaWNpdCByZXNvdXJjZXMpLgorICAgIEBQYXRoKCIve29uZX0iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGF0aEVycm9yc09uZVJlc291cmNlIHsKKyAgICB9CisKKyAgICBAUGF0aCgiL3t0d299IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhdGhFcnJvcnNUd29SZXNvdXJjZSB7CisgICAgfQorCisgICAgQFBhdGgoIi97dGhyZWV9IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhdGhFcnJvcnNUaHJlZVJlc291cmNlIHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBJZ25vcmUKKyAgICAvLyBUT0RPIGFkZCBjcm9zcy1yZXNvdXJjZSB2YWxpZGF0aW9uICYgdW4taWdub3JlIHRoZSB0ZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbmZsaWN0aW5nUm9vdFJlc291cmNlRXJyb3JzKCkgeworICAgICAgICBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZygKKyAgICAgICAgICAgICAgICBQYXRoRXJyb3JzT25lUmVzb3VyY2UuY2xhc3MsIFBhdGhFcnJvcnNUd29SZXNvdXJjZS5jbGFzcywgUGF0aEVycm9yc1RocmVlUmVzb3VyY2UuY2xhc3MpOworCisgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVyUmVzb3VyY2VzKFJlc291cmNlLmJ1aWxkZXIoUGF0aEVycm9yc09uZVJlc291cmNlLmNsYXNzKS5wYXRoKCIve2ZvdXJ9IikuYnVpbGQoKSk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVyUmVzb3VyY2VzKFJlc291cmNlLmJ1aWxkZXIoUGF0aEVycm9yc1RocmVlUmVzb3VyY2UuY2xhc3MpLnBhdGgoIi97Zml2ZX0iKS5idWlsZCgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNCwgaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihyZXNvdXJjZUNvbmZpZykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQElnbm9yZQorICAgIC8vIFRPRE8gYWRkIGNyb3NzLXJlc291cmNlIHZhbGlkYXRpb24gJiB1bi1pZ25vcmUgdGhlIHRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uZmxpY3RpbmdSb290UmVzb3VyY2VFcnJvcnMyKCkgeworICAgICAgICBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZygpOworCisgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVyUmVzb3VyY2VzKFJlc291cmNlLmJ1aWxkZXIoUGF0aEVycm9yc09uZVJlc291cmNlLmNsYXNzKS5wYXRoKCIve29uZX0iKS5idWlsZCgpKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucmVnaXN0ZXJSZXNvdXJjZXMoUmVzb3VyY2UuYnVpbGRlcihQYXRoRXJyb3JzVGhyZWVSZXNvdXJjZS5jbGFzcykucGF0aCgiL3tvbmV9LyIpLmJ1aWxkKCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygxLCBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKHJlc291cmNlQ29uZmlnKSk7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQW1iaWd1b3VzUmVzb3VyY2VNZXRob2RzR0VUIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0MSgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldDIoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQzKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBbWJpZ3VvdXNSZXNvdXJjZU1ldGhvZEdFVCgpIHsKKyAgICAgICAgZmluYWwgTGlzdDxSZXNvdXJjZU1vZGVsSXNzdWU+IGlzc3VlcyA9IGluaXRpYXRlV2ViQXBwbGljYXRpb24oQW1iaWd1b3VzUmVzb3VyY2VNZXRob2RzR0VULmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGlzc3Vlcy5zaXplKCkpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFtYmlndW91c1Jlc291cmNlTWV0aG9kc1Byb2R1Y2VzR0VUIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24veG1sIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRYbWwoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRUZXh0MSgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQyKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcyh7InRleHQvcGxhaW4iLCAiaW1hZ2UvcG5nIn0pCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dDMoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFtYmlndW91c1Jlc291cmNlTWV0aG9kc1Byb2R1Y2VzR0VUKCkgeworICAgICAgICBmaW5hbCBMaXN0PFJlc291cmNlTW9kZWxJc3N1ZT4gaXNzdWVzID0gaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihBbWJpZ3VvdXNSZXNvdXJjZU1ldGhvZHNQcm9kdWNlc0dFVC5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBpc3N1ZXMuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBbWJpZ3VvdXNSZXNvdXJjZU1ldGhvZHNDb25zdW1lc1BVVCB7CisKKyAgICAgICAgQFBVVAorICAgICAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL3htbCIpCisgICAgICAgIHB1YmxpYyB2b2lkIHB1dDEoT2JqZWN0IG8pIHsKKyAgICAgICAgfQorCisgICAgICAgIEBQVVQKKyAgICAgICAgQENvbnN1bWVzKHsidGV4dC9wbGFpbiIsICJpbWFnZS9qcGVnIn0pCisgICAgICAgIHB1YmxpYyB2b2lkIHB1dDIoT2JqZWN0IG8pIHsKKyAgICAgICAgfQorCisgICAgICAgIEBQVVQKKyAgICAgICAgQENvbnN1bWVzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgcHVibGljIHZvaWQgcHV0MyhPYmplY3QgbykgeworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QW1iaWd1b3VzUmVzb3VyY2VNZXRob2RzQ29uc3VtZXNQVVQoKSB7CisgICAgICAgIGZpbmFsIExpc3Q8UmVzb3VyY2VNb2RlbElzc3VlPiBpc3N1ZXMgPSBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKEFtYmlndW91c1Jlc291cmNlTWV0aG9kc0NvbnN1bWVzUFVULmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGlzc3Vlcy5zaXplKCkpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFtYmlndW91c1N1YlJlc291cmNlTWV0aG9kc0dFVCB7CisKKyAgICAgICAgQFBhdGgoIntvbmV9IikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldDEoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJ7c2V2ZW59IikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldDIoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJ7bWlsbGlvbn0iKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0MygpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInttaWxsaW9ufS8iKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0NCgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QW1iaWd1b3VzU3ViUmVzb3VyY2VNZXRob2RzR0VUKCkgeworICAgICAgICBmaW5hbCBMaXN0PFJlc291cmNlTW9kZWxJc3N1ZT4gaXNzdWVzID0gaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihBbWJpZ3VvdXNTdWJSZXNvdXJjZU1ldGhvZHNHRVQuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoNiwgaXNzdWVzLnNpemUoKSk7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQW1iaWd1b3VzU3ViUmVzb3VyY2VNZXRob2RzUHJvZHVjZXNHRVQgeworCisgICAgICAgIEBQYXRoKCJ4IikKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3htbCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0WG1sKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgieCIpCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRUZXh0MSgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoIngiKQorICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dDIoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJ4IikKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoeyJ0ZXh0L3BsYWluIiwgImltYWdlL3BuZyJ9KQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQzKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBbWJpZ3VvdXNDbGFzc1Byb2R1Y2luZ1dhcm5pbmdzKCkgeworCisgICAgICAgIGZpbmFsIExpc3Q8UmVzb3VyY2VNb2RlbElzc3VlPiBpc3N1ZXMgPSBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKEFtYmlndW91c0NsYXNzUHJvZHVjaW5nV2FybmluZ3MuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgaXNzdWVzLnNpemUoKSk7CisgICAgICAgIGFzc2VydE51bWJlck9mSXNzdWVzKGlzc3VlcywgMSwgMSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydE51bWJlck9mSXNzdWVzKGZpbmFsIExpc3Q8UmVzb3VyY2VNb2RlbElzc3VlPiBpc3N1ZXMsIGludCBleHBlY3RlZEZhdGFsQ291bnQsIGludCBleHBlY3RlZFdhcm5pbmdDb3VudCkgeworICAgICAgICBpbnQgZmF0YWxDb3VudCA9IDA7CisgICAgICAgIGludCB3YXJuaW5nQ291bnQgPSAwOworCisgICAgICAgIGZvciAoUmVzb3VyY2VNb2RlbElzc3VlIGlzc3VlIDogaXNzdWVzKSB7CisgICAgICAgICAgICBpZiAoaXNzdWUuZ2V0U2V2ZXJpdHkoKSA9PSBTZXZlcml0eS5GQVRBTCkgeworICAgICAgICAgICAgICAgIGZhdGFsQ291bnQrKzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgd2FybmluZ0NvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkRmF0YWxDb3VudCwgZmF0YWxDb3VudCk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFdhcm5pbmdDb3VudCwgd2FybmluZ0NvdW50KTsKKyAgICB9CisKKyAgICBAUGF0aCgidGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBbWJpZ3VvdXNDbGFzc1Byb2R1Y2luZ1dhcm5pbmdzIHsKKyAgICAgICAgLy8gR0VUIG1ldGhvZHMgdmFsaWRhdGlvbiB3aWxsIHByb2R1Y2UgYSB3YXJuaW5nCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRIdG1sKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWxsUG9zc2libGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFBPU1QgbWV0aG9kcyB2YWxpZGF0aW9uIHdpbGwgZmFpbAorICAgICAgICBAUE9TVAorICAgICAgICBAQ29uc3VtZXMoInRleHQvcGxhaW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3RBKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAQ29uc3VtZXMoInRleHQvcGxhaW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3RCKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBbWJpZ3VvdXNQb3N0Q2xhc3NQcm9kdWNpbmdXYXJuaW5ncygpIHsKKworICAgICAgICBmaW5hbCBMaXN0PFJlc291cmNlTW9kZWxJc3N1ZT4gaXNzdWVzID0gaW5pdGlhdGVXZWJBcHBsaWNhdGlvbihBbWJpZ3VvdXNQb3N0Q2xhc3NQcm9kdWNpbmdXYXJuaW5ncy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBpc3N1ZXMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0TnVtYmVyT2ZJc3N1ZXMoaXNzdWVzLCAxLCAxKTsKKyAgICB9CisKKyAgICBAUGF0aCgidGVzdDIiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQW1iaWd1b3VzUG9zdENsYXNzUHJvZHVjaW5nV2FybmluZ3MgeworICAgICAgICAvLyBHRVQgbWV0aG9kcyB2YWxpZGF0aW9uIHdpbGwgZmFpbAorICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGxhaW4oKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRQbGFpbjIoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8gUE9TVCBtZXRob2RzIHZhbGlkYXRpb24gd2lsbCBwcm9kdWNlIGEgd2FybmluZworICAgICAgICBAUE9TVAorICAgICAgICBAQ29uc3VtZXMoInRleHQvcGxhaW4iKQorICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3RBKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAQ29uc3VtZXMoInRleHQvcGxhaW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3RCKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBbWJpZ3VvdXNTdWJSZXNvdXJjZU1ldGhvZHNQcm9kdWNlc0dFVCgpIHsKKyAgICAgICAgZmluYWwgTGlzdDxSZXNvdXJjZU1vZGVsSXNzdWU+IGlzc3VlcyA9IGluaXRpYXRlV2ViQXBwbGljYXRpb24oQW1iaWd1b3VzU3ViUmVzb3VyY2VNZXRob2RzUHJvZHVjZXNHRVQuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgaXNzdWVzLnNpemUoKSk7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQW1iaWd1b3VzU3ViUmVzb3VyY2VMb2NhdG9yc1Jlc291cmNlIHsKKworICAgICAgICBAUGF0aCgie29uZX0iKQorICAgICAgICBwdWJsaWMgT2JqZWN0IGwxKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgie3R3b30iKQorICAgICAgICBwdWJsaWMgT2JqZWN0IGwyKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBbWJpZ3VvdXNTdWJSZXNvdXJjZUxvY2F0b3JzUmVzb3VyY2UoKSB7CisgICAgICAgIGZpbmFsIExpc3Q8UmVzb3VyY2VNb2RlbElzc3VlPiBpc3N1ZXMgPSBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKEFtYmlndW91c1N1YlJlc291cmNlTG9jYXRvcnNSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBpc3N1ZXMuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBbWJpZ3VvdXNTdWJSZXNvdXJjZUxvY2F0b3JzV2l0aFNsYXNoUmVzb3VyY2UgeworCisgICAgICAgIEBQYXRoKCJ7b25lfSIpCisgICAgICAgIHB1YmxpYyBPYmplY3QgbDEoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJ7dHdvfS8iKQorICAgICAgICBwdWJsaWMgT2JqZWN0IGwyKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBGSVhNRTogdHJhaWxpbmcgc2xhc2hlcyBzaG91bGQgbm90IG1hdHRlcgorICAgIEBJZ25vcmUKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBbWJpZ3VvdXNTdWJSZXNvdXJjZUxvY2F0b3JzV2l0aFNsYXNoUmVzb3VyY2UoKSB7CisgICAgICAgIGZpbmFsIExpc3Q8UmVzb3VyY2VNb2RlbElzc3VlPiBpc3N1ZXMgPSBpbml0aWF0ZVdlYkFwcGxpY2F0aW9uKEFtYmlndW91c1N1YlJlc291cmNlTG9jYXRvcnNXaXRoU2xhc2hSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBpc3N1ZXMuc2l6ZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9Qcm9ncmFtbWF0aWNSZXNvdXJjZU1ldGhvZHNUZXN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9Qcm9ncmFtbWF0aWNSZXNvdXJjZU1ldGhvZHNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZkNjBlNgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL1Byb2dyYW1tYXRpY1Jlc291cmNlTWV0aG9kc1Rlc3QuamF2YQpAQCAtMCwwICsxLDIwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWw7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuSW5mbGVjdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlcXVlc3RDb250ZXh0QnVpbGRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworCisvKioKKyAqIFRlc3Qgb2YgcHJvZ3JhbW1hdGljIHJlc291cmNlIG1ldGhvZCBhZGRpdGlvbnMuCisgKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9ncmFtbWF0aWNSZXNvdXJjZU1ldGhvZHNUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByYyA9IG5ldyBSZXNvdXJjZUNvbmZpZygpOworICAgICAgICBmaW5hbCBSZXNvdXJjZS5CdWlsZGVyIHJlc291cmNlQnVpbGRlciA9IFJlc291cmNlLmJ1aWxkZXIoInRlc3QiKTsKKyAgICAgICAgcmVzb3VyY2VCdWlsZGVyLmFkZE1ldGhvZCgiR0VUIikuaGFuZGxlZEJ5KG5ldyBJbmZsZWN0b3I8Q29udGFpbmVyUmVxdWVzdENvbnRleHQsIFJlc3BvbnNlPigpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgUmVzcG9uc2UgYXBwbHkoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdCkgeworICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygpLmJ1aWxkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICByYy5yZWdpc3RlclJlc291cmNlcyhyZXNvdXJjZUJ1aWxkZXIuYnVpbGQoKSk7CisgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbiA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIocmMpOworCisgICAgICAgIGNoZWNrUmV0dXJuZWRTdGF0dXMoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi90ZXN0IiwgIkdFVCIpLmJ1aWxkKCksIGFwcGxpY2F0aW9uKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIZWFkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJjID0gbmV3IFJlc291cmNlQ29uZmlnKCk7CisgICAgICAgIGZpbmFsIFJlc291cmNlLkJ1aWxkZXIgcmVzb3VyY2VCdWlsZGVyID0gUmVzb3VyY2UuYnVpbGRlcigidGVzdCIpOworICAgICAgICByZXNvdXJjZUJ1aWxkZXIuYWRkTWV0aG9kKCJIRUFEIikuaGFuZGxlZEJ5KG5ldyBJbmZsZWN0b3I8Q29udGFpbmVyUmVxdWVzdENvbnRleHQsIFJlc3BvbnNlPigpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgUmVzcG9uc2UgYXBwbHkoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdCkgeworICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygpLmJ1aWxkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICByYy5yZWdpc3RlclJlc291cmNlcyhyZXNvdXJjZUJ1aWxkZXIuYnVpbGQoKSk7CisgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbiA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIocmMpOworCisgICAgICAgIGNoZWNrUmV0dXJuZWRTdGF0dXMoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi90ZXN0IiwgIkhFQUQiKS5idWlsZCgpLCBhcHBsaWNhdGlvbik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3B0aW9ucygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByYyA9IG5ldyBSZXNvdXJjZUNvbmZpZygpOworICAgICAgICBmaW5hbCBSZXNvdXJjZS5CdWlsZGVyIHJlc291cmNlQnVpbGRlciA9IFJlc291cmNlLmJ1aWxkZXIoInRlc3QiKTsKKyAgICAgICAgcmVzb3VyY2VCdWlsZGVyLmFkZE1ldGhvZCgiT1BUSU9OUyIpLmhhbmRsZWRCeShuZXcgSW5mbGVjdG9yPENvbnRhaW5lclJlcXVlc3RDb250ZXh0LCBSZXNwb25zZT4oKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFJlc3BvbnNlIGFwcGx5KENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3QpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soKS5idWlsZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgcmMucmVnaXN0ZXJSZXNvdXJjZXMocmVzb3VyY2VCdWlsZGVyLmJ1aWxkKCkpOworICAgICAgICBmaW5hbCBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwbGljYXRpb24gPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKHJjKTsKKworICAgICAgICBjaGVja1JldHVybmVkU3RhdHVzKFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvdGVzdCIsICJPUFRJT05TIikuYnVpbGQoKSwgYXBwbGljYXRpb24pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEluZmxlY3RvcjxDb250YWluZXJSZXF1ZXN0Q29udGV4dCwgUmVzcG9uc2U+IGluZmxlY3RvciA9IG5ldyBJbmZsZWN0b3I8Q29udGFpbmVyUmVxdWVzdENvbnRleHQsIFJlc3BvbnNlPigpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgUmVzcG9uc2UgYXBwbHkoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdCkgeworICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygpLmJ1aWxkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmMgPSBuZXcgUmVzb3VyY2VDb25maWcoKTsKKyAgICAgICAgZmluYWwgUmVzb3VyY2UuQnVpbGRlciByZXNvdXJjZUJ1aWxkZXIgPSBSZXNvdXJjZS5idWlsZGVyKCJ0ZXN0Iik7CisKKyAgICAgICAgcmVzb3VyY2VCdWlsZGVyLmFkZE1ldGhvZCgiR0VUIikuaGFuZGxlZEJ5KGluZmxlY3Rvcik7CisgICAgICAgIHJlc291cmNlQnVpbGRlci5hZGRNZXRob2QoIk9QVElPTlMiKS5oYW5kbGVkQnkoaW5mbGVjdG9yKTsKKyAgICAgICAgcmVzb3VyY2VCdWlsZGVyLmFkZE1ldGhvZCgiSEVBRCIpLmhhbmRsZWRCeShpbmZsZWN0b3IpOworCisgICAgICAgIHJjLnJlZ2lzdGVyUmVzb3VyY2VzKHJlc291cmNlQnVpbGRlci5idWlsZCgpKTsKKyAgICAgICAgZmluYWwgQXBwbGljYXRpb25IYW5kbGVyIGFwcGxpY2F0aW9uID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihyYyk7CisKKyAgICAgICAgY2hlY2tSZXR1cm5lZFN0YXR1cyhSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3Rlc3QiLCAiR0VUIikuYnVpbGQoKSwgYXBwbGljYXRpb24pOworICAgICAgICBjaGVja1JldHVybmVkU3RhdHVzKFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvdGVzdCIsICJIRUFEIikuYnVpbGQoKSwgYXBwbGljYXRpb24pOworICAgICAgICBjaGVja1JldHVybmVkU3RhdHVzKFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvdGVzdCIsICJPUFRJT05TIikuYnVpbGQoKSwgYXBwbGljYXRpb24pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFR3b0JpbmRlcnNTYW1lUGF0aCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByYyA9IG5ldyBSZXNvdXJjZUNvbmZpZygpOworICAgICAgICBmaW5hbCBSZXNvdXJjZS5CdWlsZGVyIHJlc291cmNlQnVpbGRlciA9IFJlc291cmNlLmJ1aWxkZXIoIi8iKTsKKyAgICAgICAgZmluYWwgUmVzb3VyY2UuQnVpbGRlciBjaGlsZFRlc3QxQnVpbGRlciA9IHJlc291cmNlQnVpbGRlci5hZGRDaGlsZFJlc291cmNlKCJ0ZXN0MSIpOworICAgICAgICBjaGlsZFRlc3QxQnVpbGRlci5hZGRNZXRob2QoIkdFVCIpLmhhbmRsZWRCeShuZXcgSW5mbGVjdG9yPENvbnRhaW5lclJlcXVlc3RDb250ZXh0LCBSZXNwb25zZT4oKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFJlc3BvbnNlIGFwcGx5KENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3QpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2UuY3JlYXRlZChVUkkuY3JlYXRlKCIvZm9vIikpLmJ1aWxkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBJbmZsZWN0b3I8Q29udGFpbmVyUmVxdWVzdENvbnRleHQsIFJlc3BvbnNlPiBpbmZsZWN0b3IxID0gbmV3IEluZmxlY3RvcjxDb250YWluZXJSZXF1ZXN0Q29udGV4dCwgUmVzcG9uc2U+KCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBSZXNwb25zZSBhcHBseShDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLmFjY2VwdGVkKCkuYnVpbGQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgZmluYWwgUmVzb3VyY2UuQnVpbGRlciBjaGlsZFRlc3QyQnVpbGRlciA9IHJlc291cmNlQnVpbGRlci5hZGRDaGlsZFJlc291cmNlKCJ0ZXN0MiIpOworICAgICAgICBjaGlsZFRlc3QyQnVpbGRlci5hZGRNZXRob2QoIkdFVCIpLmhhbmRsZWRCeShpbmZsZWN0b3IxKTsKKyAgICAgICAgY2hpbGRUZXN0MkJ1aWxkZXIuYWRkTWV0aG9kKCJIRUFEIikuaGFuZGxlZEJ5KGluZmxlY3RvcjEpOworICAgICAgICBJbmZsZWN0b3I8Q29udGFpbmVyUmVxdWVzdENvbnRleHQsIFJlc3BvbnNlPiBpbmZsZWN0b3IyID0gbmV3IEluZmxlY3RvcjxDb250YWluZXJSZXF1ZXN0Q29udGV4dCwgUmVzcG9uc2U+KCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBSZXNwb25zZSBhcHBseShDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cygyMDMpLmJ1aWxkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGNoaWxkVGVzdDFCdWlsZGVyLmFkZE1ldGhvZCgiT1BUSU9OUyIpLmhhbmRsZWRCeShpbmZsZWN0b3IyKTsKKyAgICAgICAgY2hpbGRUZXN0MUJ1aWxkZXIuYWRkTWV0aG9kKCJIRUFEIikuaGFuZGxlZEJ5KGluZmxlY3RvcjIpOworICAgICAgICBmaW5hbCBSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlQnVpbGRlci5idWlsZCgpOworICAgICAgICByYy5yZWdpc3RlclJlc291cmNlcyhyZXNvdXJjZSk7CisgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbiA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIocmMpOworCisgICAgICAgIGNoZWNrUmV0dXJuZWRTdGF0dXNFcXVhbHMoMjAxLCBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3Rlc3QxIiwgIkdFVCIpLmJ1aWxkKCksIGFwcGxpY2F0aW9uKTsKKy8vICAgICAgICBjaGVja1JldHVybmVkU3RhdHVzRXF1YWxzKDIwMywgUmVxdWVzdHMuZnJvbSgiL3Rlc3QxIiwgIkhFQUQiKS5idWlsZCgpLCBhcHBsaWNhdGlvbik7CisvLyAgICAgICAgY2hlY2tSZXR1cm5lZFN0YXR1c0VxdWFscygyMDMsIFJlcXVlc3RzLmZyb20oIi90ZXN0MSIsICJPUFRJT05TIikuYnVpbGQoKSwgYXBwbGljYXRpb24pOworCisvLyAgICAgICAgY2hlY2tSZXR1cm5lZFN0YXR1c0VxdWFscygyMDIsIFJlcXVlc3RzLmZyb20oIi90ZXN0MiIsICJHRVQiKS5idWlsZCgpLCBhcHBsaWNhdGlvbik7CisvLyAgICAgICAgY2hlY2tSZXR1cm5lZFN0YXR1c0VxdWFscygyMDIsIFJlcXVlc3RzLmZyb20oIi90ZXN0MiIsICJIRUFEIikuYnVpbGQoKSwgYXBwbGljYXRpb24pOworLy8gICAgICAgIGNoZWNrUmV0dXJuZWRTdGF0dXNFcXVhbHMoMjAyLCBSZXF1ZXN0cy5mcm9tKCIvdGVzdDIiLCAiT1BUSU9OUyIpLmJ1aWxkKCksIGFwcGxpY2F0aW9uKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdW1lc1Byb2R1Y2VzKCkgeworICAgICAgICBmaW5hbCBSZXNvdXJjZS5CdWlsZGVyIGJ1aWxkZXIgPSBSZXNvdXJjZS5idWlsZGVyKCJyb290Iik7CisgICAgICAgIGJ1aWxkZXIuYWRkTWV0aG9kKCJQT1NUIikuaGFuZGxlZEJ5KG5ldyBJbmZsZWN0b3IKKyAgICAgICAgICAgICAgICA8Q29udGFpbmVyUmVxdWVzdENvbnRleHQsIE9iamVjdD4oKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIE9iamVjdCBhcHBseShDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9KS5jb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MKS5jb25zdW1lcygidGV4dC9odG1sIikuY29uc3VtZXMoInRleHQvcGxhaW4iLAorICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi9qc29uIikucHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfSFRNTF9UWVBFLAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUpOworICAgICAgICBmaW5hbCBSZXNvdXJjZSByZXMgPSBidWlsZGVyLmJ1aWxkKCk7CisgICAgICAgIGZpbmFsIFJlc291cmNlTWV0aG9kIG1ldGhvZCA9IHJlcy5nZXRSZXNvdXJjZU1ldGhvZHMoKS5nZXQoMCk7CisgICAgICAgIGZpbmFsIExpc3Q8TWVkaWFUeXBlPiBjb25zdW1lZFR5cGVzID0gbWV0aG9kLmdldENvbnN1bWVkVHlwZXMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIGNvbnN1bWVkVHlwZXMuc2l6ZSgpKTsKKyAgICAgICAgZmluYWwgTGlzdDxNZWRpYVR5cGU+IHByb2R1Y2VkVHlwZXMgPSBtZXRob2QuZ2V0UHJvZHVjZWRUeXBlcygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcHJvZHVjZWRUeXBlcy5zaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvbnN1bWVkVHlwZXMuY29udGFpbnMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTF9UWVBFKSk7CisgICAgICAgIGFzc2VydFRydWUoY29uc3VtZWRUeXBlcy5jb250YWlucyhNZWRpYVR5cGUuVEVYVF9IVE1MX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb25zdW1lZFR5cGVzLmNvbnRhaW5zKE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb25zdW1lZFR5cGVzLmNvbnRhaW5zKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwcm9kdWNlZFR5cGVzLmNvbnRhaW5zKE1lZGlhVHlwZS5URVhUX0hUTUxfVFlQRSkpOworICAgICAgICBhc3NlcnRUcnVlKHByb2R1Y2VkVHlwZXMuY29udGFpbnMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja1JldHVybmVkU3RhdHVzKENvbnRhaW5lclJlcXVlc3QgcmVxLCBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2tSZXR1cm5lZFN0YXR1c0VxdWFscygyMDAsIHJlcSwgYXBwKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tSZXR1cm5lZFN0YXR1c0VxdWFscyhpbnQgZXhwZWN0ZWRTdGF0dXMsIENvbnRhaW5lclJlcXVlc3QgcmVxLCBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGludCByZXNwb25zZVN0YXR1cyA9IGFwcC5hcHBseShyZXEpLmdldCgpLmdldFN0YXR1cygpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRTdGF0dXMsIHJlc3BvbnNlU3RhdHVzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9STUJ1aWxkZXJUZXN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9STUJ1aWxkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBjOGVlZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL1JNQnVpbGRlclRlc3QuamF2YQpAQCAtMCwwICsxLDkxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5PUFRJT05TOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVxdWVzdENvbnRleHRCdWlsZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBSdW50aW1lIG1vZGVsIGJ1aWxkZXIgdGVzdC4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrCisgKi8KK3B1YmxpYyBjbGFzcyBSTUJ1aWxkZXJUZXN0IHsKKworICAgIEBQYXRoKCIvaGVsbG93b3JsZCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBIZWxsb1dvcmxkUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRIZWxsbygpIHsKKyAgICAgICAgICAgIHJldHVybiAiaGVsbG8iOworICAgICAgICB9CisKKyAgICAgICAgQE9QVElPTlMKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRPcHRpb25zKCkgeworICAgICAgICAgICAgcmV0dXJuICJHRVQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiYW5vdGhlci97Yn0iKQorICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEFub3RoZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gImFub3RoZXIiOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBBcHBsaWNhdGlvbkhhbmRsZXIgY3JlYXRlQXBwbGljYXRpb24oQ2xhc3M8Pz4uLi4gY2xhc3NlcykgeworICAgICAgICByZXR1cm4gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihuZXcgUmVzb3VyY2VDb25maWcoY2xhc3NlcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhlbGxvV29ybGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQXBwbGljYXRpb25IYW5kbGVyIGFwcCA9IGNyZWF0ZUFwcGxpY2F0aW9uKEhlbGxvV29ybGRSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvaGVsbG93b3JsZCIsICJHRVQiKS5idWlsZCgpKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImhlbGxvIiwgcmVzcG9uc2UuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9wdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQXBwbGljYXRpb25IYW5kbGVyIGFwcCA9IGNyZWF0ZUFwcGxpY2F0aW9uKEhlbGxvV29ybGRSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvaGVsbG93b3JsZCIsICJPUFRJT05TIikKKyAgICAgICAgICAgICAgICAuYWNjZXB0KE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpLmJ1aWxkKCkpLmdldCgpOworCisgICAgICAgIGFzc2VydEVxdWFscygiR0VUIiwgcmVzcG9uc2UuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN1YlJlc01ldGhvZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwID0gY3JlYXRlQXBwbGljYXRpb24oSGVsbG9Xb3JsZFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9oZWxsb3dvcmxkL2Fub3RoZXIvYiIsICJHRVQiKS5idWlsZCgpKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImFub3RoZXIiLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvUmVzb3VyY2VJbmZvVGVzdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvUmVzb3VyY2VJbmZvVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NzE2ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9SZXNvdXJjZUluZm9UZXN0LmphdmEKQEAgLTAsMCArMSwyNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlc3BvbnNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlByZU1hdGNoaW5nOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5SZXNvdXJjZUluZm87CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVzcG9uc2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlcXVlc3RDb250ZXh0QnVpbGRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKKworLyoqCisgKiBUZXN0IGNhc2VzIGZvciBpbmplY3RlZCB7QGxpbmsgUmVzb3VyY2VJbmZvfSBpbiBmaWx0ZXJzLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIFJlc291cmNlSW5mb1Rlc3QgeworCisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15UmVxdWVzdEZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIgeworICAgICAgICBAQ29udGV4dAorICAgICAgICBSZXNvdXJjZUluZm8gcmVzb3VyY2VJbmZvOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5nZXRIZWFkZXJzKCkuYWRkKCJNeVJlcXVlc3RGaWx0ZXItY2FsbGVkIiwgImNhbGxlZCIpOworICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuZ2V0SGVhZGVycygpLmFkZCgiTXlSZXF1ZXN0RmlsdGVyLWNsYXNzIiwgcmVzb3VyY2VJbmZvLmdldFJlc291cmNlQ2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOworICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuZ2V0SGVhZGVycygpLmFkZCgiTXlSZXF1ZXN0RmlsdGVyLW1ldGhvZCIsIHJlc291cmNlSW5mby5nZXRSZXNvdXJjZU1ldGhvZCgpLmdldE5hbWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlSZXNwb25zZUZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyIHsKKyAgICAgICAgQENvbnRleHQKKyAgICAgICAgUmVzb3VyY2VJbmZvIHJlc291cmNlSW5mbzsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LCBDb250YWluZXJSZXNwb25zZUNvbnRleHQgcmVzcG9uc2VDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LmdldEhlYWRlcnMoKS5hZGQoIk15UmVzcG9uc2VGaWx0ZXItY2FsbGVkIiwgImNhbGxlZCIpOworICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gcmVzb3VyY2VDbGFzcyA9IHJlc291cmNlSW5mby5nZXRSZXNvdXJjZUNsYXNzKCk7CisgICAgICAgICAgICBmaW5hbCBNZXRob2QgcmVzb3VyY2VNZXRob2QgPSByZXNvdXJjZUluZm8uZ2V0UmVzb3VyY2VNZXRob2QoKTsKKyAgICAgICAgICAgIHJlc3BvbnNlQ29udGV4dC5nZXRIZWFkZXJzKCkuYWRkKCJNeVJlc3BvbnNlRmlsdGVyLWNsYXNzIiwgcmVzb3VyY2VDbGFzcyA9PSBudWxsID8gIjxudWxsPiIKKyAgICAgICAgICAgICAgICAgICAgOiByZXNvdXJjZUNsYXNzLmdldFNpbXBsZU5hbWUoKSk7CisgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuZ2V0SGVhZGVycygpLmFkZCgiTXlSZXNwb25zZUZpbHRlci1tZXRob2QiLCByZXNvdXJjZU1ldGhvZCA9PSBudWxsID8gIjxudWxsPiIKKyAgICAgICAgICAgICAgICAgICAgOiByZXNvdXJjZU1ldGhvZC5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFByZU1hdGNoaW5nCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVByZW1hdGNoaW5nRmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciB7CisgICAgICAgIEBDb250ZXh0CisgICAgICAgIFJlc291cmNlSW5mbyByZXNvdXJjZUluZm87CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGFzc2VydE51bGwocmVzb3VyY2VJbmZvLmdldFJlc291cmNlQ2xhc3MoKSk7CisgICAgICAgICAgICBhc3NlcnROdWxsKHJlc291cmNlSW5mby5nZXRSZXNvdXJjZU1ldGhvZCgpKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgQFBhdGgoInJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15UmVzb3VyY2UgeworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KEBDb250ZXh0IENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3QpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiY2FsbGVkIiwgcmVxdWVzdC5nZXRIZWFkZXJTdHJpbmcoIk15UmVxdWVzdEZpbHRlci1jYWxsZWQiKSk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2xhc3NOYW1lID0gIk15UmVzb3VyY2UiOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1ldGhvZE5hbWUgPSAiZ2V0IjsKKyAgICAgICAgICAgIGFzc2VydFJlcXVlc3RIZWFkZXIocmVxdWVzdCwgY2xhc3NOYW1lLCBtZXRob2ROYW1lKTsKKyAgICAgICAgICAgIHJldHVybiAiZ2V0IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImdldC1jaGlsZCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hpbGQoQENvbnRleHQgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdCkgeworICAgICAgICAgICAgYXNzZXJ0UmVxdWVzdEhlYWRlcihyZXF1ZXN0LCAiTXlSZXNvdXJjZSIsICJnZXRDaGlsZCIpOworICAgICAgICAgICAgcmV0dXJuICJnZXQtY2hpbGQiOworICAgICAgICB9CisKKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3QoQENvbnRleHQgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdCkgeworICAgICAgICAgICAgYXNzZXJ0UmVxdWVzdEhlYWRlcihyZXF1ZXN0LCAiTXlSZXNvdXJjZSIsICJwb3N0Iik7CisgICAgICAgICAgICByZXR1cm4gInBvc3QiOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImxvY2F0b3IiKQorICAgICAgICBwdWJsaWMgQ2xhc3M8U3ViUmVzb3VyY2U+IGdldFN1YlJlc291cmNlKCkgeworICAgICAgICAgICAgcmV0dXJuIFN1YlJlc291cmNlLmNsYXNzOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoImluZm8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VUZXN0aW5nSW5mbyB7CisgICAgICAgIEBDb250ZXh0CisgICAgICAgIFJlc291cmNlSW5mbyByZXNvdXJjZUluZm87CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEluZm8oQENvbnRleHQgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdCkgeworICAgICAgICAgICAgYXNzZXJ0UmVxdWVzdEhlYWRlcihyZXF1ZXN0LCAiUmVzb3VyY2VUZXN0aW5nSW5mbyIsICJnZXRJbmZvIik7CisgICAgICAgICAgICByZXR1cm4gImdldC1pbmZvIjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImNoaWxkIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDaGlsZEluZm8oQENvbnRleHQgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdCkgeworICAgICAgICAgICAgYXNzZXJ0UmVxdWVzdEhlYWRlcihyZXF1ZXN0LCAiUmVzb3VyY2VUZXN0aW5nSW5mbyIsICJnZXRDaGlsZEluZm8iKTsKKyAgICAgICAgICAgIHJldHVybiAiZ2V0LWluZm8tY2hpbGQiOworCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydFJlcXVlc3RIZWFkZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdCwgU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIG1ldGhvZE5hbWUpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjYWxsZWQiLCByZXF1ZXN0LmdldEhlYWRlclN0cmluZygiTXlSZXF1ZXN0RmlsdGVyLWNhbGxlZCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNsYXNzTmFtZSwgcmVxdWVzdC5nZXRIZWFkZXJTdHJpbmcoIk15UmVxdWVzdEZpbHRlci1jbGFzcyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1ldGhvZE5hbWUsIHJlcXVlc3QuZ2V0SGVhZGVyU3RyaW5nKCJNeVJlcXVlc3RGaWx0ZXItbWV0aG9kIikpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3ViUmVzb3VyY2UgeworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RnJvbVN1YlJlc291cmNlKEBDb250ZXh0IENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3QpIHsKKyAgICAgICAgICAgIGFzc2VydFJlcXVlc3RIZWFkZXIocmVxdWVzdCwgIlN1YlJlc291cmNlIiwgImdldEZyb21TdWJSZXNvdXJjZSIpOworICAgICAgICAgICAgcmV0dXJuICJnZXQtc3ViLXJlc291cmNlIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJyZXNvdXJjZS1hbm90aGVyIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15QW5vdGhlclJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW5vdGhlcihAQ29udGV4dCBDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0KSB7CisgICAgICAgICAgICBhc3NlcnRSZXF1ZXN0SGVhZGVyKHJlcXVlc3QsICJNeUFub3RoZXJSZXNvdXJjZSIsICJnZXRBbm90aGVyIik7CisgICAgICAgICAgICByZXR1cm4gImdldC1hbm90aGVyIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgQXBwbGljYXRpb25IYW5kbGVyIGhhbmRsZXIgPSBnZXRBcHBsaWNhdGlvbigpOworICAgICAgICBmaW5hbCBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGhhbmRsZXIuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9yZXNvdXJjZSIsICJHRVQiKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImdldCIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0UmVzcG9uc2VIZWFkZXJzKHJlc3BvbnNlLCAiTXlSZXNvdXJjZSIsICJnZXQiKTsKKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldE11bHRpcGxlKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBBcHBsaWNhdGlvbkhhbmRsZXIgaGFuZGxlciA9IGdldEFwcGxpY2F0aW9uKCk7CisgICAgICAgIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gaGFuZGxlci5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3Jlc291cmNlIiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZ2V0IiwgcmVzcG9uc2UuZ2V0RW50aXR5KCkpOworICAgICAgICBhc3NlcnRSZXNwb25zZUhlYWRlcnMocmVzcG9uc2UsICJNeVJlc291cmNlIiwgImdldCIpOworICAgICAgICByZXNwb25zZSA9IGhhbmRsZXIuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9yZXNvdXJjZS9nZXQtY2hpbGQiLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXQtY2hpbGQiLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgICAgIGFzc2VydFJlc3BvbnNlSGVhZGVycyhyZXNwb25zZSwgIk15UmVzb3VyY2UiLCAiZ2V0Q2hpbGQiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEFwcGxpY2F0aW9uSGFuZGxlciBnZXRBcHBsaWNhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIobmV3IFJlc291cmNlQ29uZmlnKE15UmVzb3VyY2UuY2xhc3MsIE15QW5vdGhlclJlc291cmNlLmNsYXNzLCBNeVJlcXVlc3RGaWx0ZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgTXlSZXNwb25zZUZpbHRlci5jbGFzcywgUmVzb3VyY2VUZXN0aW5nSW5mby5jbGFzcywgTXlQcmVtYXRjaGluZ0ZpbHRlci5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldENoaWxkKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBBcHBsaWNhdGlvbkhhbmRsZXIgaGFuZGxlciA9IGdldEFwcGxpY2F0aW9uKCk7CisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gaGFuZGxlci5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3Jlc291cmNlL2dldC1jaGlsZCIsICJHRVQiKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImdldC1jaGlsZCIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgY2xhc3NOYW1lID0gIk15UmVzb3VyY2UiOworICAgICAgICBmaW5hbCBTdHJpbmcgbWV0aG9kTmFtZSA9ICJnZXRDaGlsZCI7CisgICAgICAgIGFzc2VydFJlc3BvbnNlSGVhZGVycyhyZXNwb25zZSwgY2xhc3NOYW1lLCBtZXRob2ROYW1lKTsKKworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRSZXNwb25zZUhlYWRlcnMoQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UsIFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyBtZXRob2ROYW1lKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiY2FsbGVkIiwgcmVzcG9uc2UuZ2V0SGVhZGVycygpLmdldCgiTXlSZXNwb25zZUZpbHRlci1jYWxsZWQiKS5nZXQoMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoY2xhc3NOYW1lLCByZXNwb25zZS5nZXRIZWFkZXJzKCkuZ2V0KCJNeVJlc3BvbnNlRmlsdGVyLWNsYXNzIikuZ2V0KDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1ldGhvZE5hbWUsIHJlc3BvbnNlLmdldEhlYWRlcnMoKS5nZXQoIk15UmVzcG9uc2VGaWx0ZXItbWV0aG9kIikuZ2V0KDApKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBBcHBsaWNhdGlvbkhhbmRsZXIgaGFuZGxlciA9IGdldEFwcGxpY2F0aW9uKCk7CisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gaGFuZGxlci5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3Jlc291cmNlIiwgIlBPU1QiKS5lbnRpdHkoImVudGl0eSIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygicG9zdCIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0UmVzcG9uc2VIZWFkZXJzKHJlc3BvbnNlLCAiTXlSZXNvdXJjZSIsICJwb3N0Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QW5vdGhlclJlc291cmNlKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBBcHBsaWNhdGlvbkhhbmRsZXIgaGFuZGxlciA9IGdldEFwcGxpY2F0aW9uKCk7CisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gaGFuZGxlci5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3Jlc291cmNlLWFub3RoZXIiLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXQtYW5vdGhlciIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0UmVzcG9uc2VIZWFkZXJzKHJlc3BvbnNlLCAiTXlBbm90aGVyUmVzb3VyY2UiLCAiZ2V0QW5vdGhlciIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFN1YlJlc291cmNlKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBBcHBsaWNhdGlvbkhhbmRsZXIgaGFuZGxlciA9IGdldEFwcGxpY2F0aW9uKCk7CisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gaGFuZGxlci5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3Jlc291cmNlL2xvY2F0b3IiLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXQtc3ViLXJlc291cmNlIiwgcmVzcG9uc2UuZ2V0RW50aXR5KCkpOworICAgICAgICBhc3NlcnRSZXNwb25zZUhlYWRlcnMocmVzcG9uc2UsICJTdWJSZXNvdXJjZSIsICJnZXRGcm9tU3ViUmVzb3VyY2UiKTsKKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluZm9HZXQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIEFwcGxpY2F0aW9uSGFuZGxlciBoYW5kbGVyID0gZ2V0QXBwbGljYXRpb24oKTsKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBoYW5kbGVyLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvaW5mbyIsICJHRVQiKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImdldC1pbmZvIiwgcmVzcG9uc2UuZ2V0RW50aXR5KCkpOworICAgICAgICBhc3NlcnRSZXNwb25zZUhlYWRlcnMocmVzcG9uc2UsICJSZXNvdXJjZVRlc3RpbmdJbmZvIiwgImdldEluZm8iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbmZvR2V0Q2hpbGQoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIEFwcGxpY2F0aW9uSGFuZGxlciBoYW5kbGVyID0gZ2V0QXBwbGljYXRpb24oKTsKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBoYW5kbGVyLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvaW5mby9jaGlsZCIsICJHRVQiKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImdldC1pbmZvLWNoaWxkIiwgcmVzcG9uc2UuZ2V0RW50aXR5KCkpOworICAgICAgICBhc3NlcnRSZXNwb25zZUhlYWRlcnMocmVzcG9uc2UsICJSZXNvdXJjZVRlc3RpbmdJbmZvIiwgImdldENoaWxkSW5mbyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdDQwNCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgQXBwbGljYXRpb25IYW5kbGVyIGhhbmRsZXIgPSBnZXRBcHBsaWNhdGlvbigpOworICAgICAgICBmaW5hbCBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGhhbmRsZXIuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9OT1RfRk9VTkQiLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDQsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0UmVzcG9uc2VIZWFkZXJzKHJlc3BvbnNlLCAiPG51bGw+IiwgIjxudWxsPiIpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvUmVzb3VyY2VNb2RlbFRlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL1Jlc291cmNlTW9kZWxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ3MTNlOAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL1Jlc291cmNlTW9kZWxUZXN0LmphdmEKQEAgLTAsMCArMSwyNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkRFTEVURTsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QVVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnVyaS5pbnRlcm5hbC5VcmlUZW1wbGF0ZVBhcnNlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICogVGVzdCB7QGxpbmsgUmVzb3VyY2VNb2RlbH0gYW5kIHtAbGluayBSdW50aW1lUmVzb3VyY2VNb2RlbH0uCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VNb2RlbFRlc3QgeworCisgICAgQFBhdGgoImEiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2ltcGxlUmVzb3VyY2VBIHsKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiZ2V0IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImNoaWxkIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDaGlsZCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiZ2V0IjsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJ7Y2hpbGQtdGVtcGxhdGUteH0iKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hpbGRUZW1wbGF0ZVgoKSB7CisgICAgICAgICAgICByZXR1cm4gImdldCI7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgie2NoaWxkLXRlbXBsYXRlLXl9IikKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0Q2hpbGRUZW1wbGF0ZVkoU3RyaW5nIGVudGl0eSkgeworICAgICAgICAgICAgcmV0dXJuICJnZXQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoImEiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2ltcGxlUmVzb3VyY2VCIHsKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0KFN0cmluZyBlbnRpdHkpIHsKKyAgICAgICAgICAgIHJldHVybiAicG9zdCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgie2F9IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlVGVtcGxhdGVBIHsKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiZ2V0IjsKKyAgICAgICAgfQorCisgICAgICAgIEBQVVQKKyAgICAgICAgcHVibGljIFN0cmluZyBwdXQoU3RyaW5nIGVudGl0eSkgeworICAgICAgICAgICAgcmV0dXJuICJwdXQiOworICAgICAgICB9CisKKworICAgICAgICBAUGF0aCgie2EtY2hpbGQtdGVtcGxhdGUtcX0iKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hpbGRUZW1wbGF0ZVEoKSB7CisgICAgICAgICAgICByZXR1cm4gImdldCI7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgie2EtY2hpbGQtdGVtcGxhdGUtd30iKQorICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENoaWxkVGVtcGxhdGVXKFN0cmluZyBlbnRpdHkpIHsKKyAgICAgICAgICAgIHJldHVybiAiZ2V0IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJ7Yn0iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VUZW1wbGF0ZUIgeworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3QoKSB7CisgICAgICAgICAgICByZXR1cm4gInBvc3QiOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInthLWNoaWxkLXRlbXBsYXRlLXF9IikKKyAgICAgICAgQERFTEVURQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENoaWxkVGVtcGxhdGVRKFN0cmluZyBlbnRpdHkpIHsKKyAgICAgICAgICAgIHJldHVybiAiZ2V0IjsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJ7Yi1jaGlsZC10ZW1wbGF0ZS16fSIpCisgICAgICAgIEBQVVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDaGlsZFRlbXBsYXRlVyhTdHJpbmcgZW50aXR5KSB7CisgICAgICAgICAgICByZXR1cm4gImdldCI7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiYW5vdGhlci1jaGlsZCIpCisgICAgICAgIEBQVVQKKyAgICAgICAgcHVibGljIFN0cmluZyBwdXRDaGlsZEFub3RoZXIoU3RyaW5nIGVudGl0eSkgeworICAgICAgICAgICAgcmV0dXJuICJwdXQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VNb2RlbCgpIHsKKyAgICAgICAgUmVzb3VyY2VNb2RlbCByZXNvdXJjZU1vZGVsID0gZ2V0UmVzb3VyY2VNb2RlbCgpOworICAgICAgICBmaW5hbCBMaXN0PFJlc291cmNlPiByb290UmVzb3VyY2VzID0gcmVzb3VyY2VNb2RlbC5nZXRSb290UmVzb3VyY2VzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCByb290UmVzb3VyY2VzLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCByZXNvdXJjZU1vZGVsLmdldFJlc291cmNlcygpLnNpemUoKSk7CisgICAgICAgIGZpbmFsIFJlc291cmNlIHJlc291cmNlQSA9IFJlc291cmNlVGVzdFV0aWxzLmdldFJlc291cmNlKGdldFJlc291cmNlTW9kZWwoKS5nZXRSb290UmVzb3VyY2VzKCksICJhIik7CisgICAgICAgIFJlc291cmNlVGVzdFV0aWxzLmNvbnRhaW5zRXhhY3RNZXRob2RzKHJlc291cmNlQSwgZmFsc2UsICJHRVQiLCAiUE9TVCIpOworICAgICAgICBmaW5hbCBMaXN0PFJlc291cmNlPiBjaGlsZFJlc291cmNlcyA9IHJlc291cmNlQS5nZXRDaGlsZFJlc291cmNlcygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgY2hpbGRSZXNvdXJjZXMuc2l6ZSgpKTsKKyAgICAgICAgUmVzb3VyY2VUZXN0VXRpbHMuY29udGFpbnNFeGFjdE1ldGhvZHMoUmVzb3VyY2VUZXN0VXRpbHMuZ2V0UmVzb3VyY2UoY2hpbGRSZXNvdXJjZXMsICJ7Y2hpbGQtdGVtcGxhdGUteH0iKSwgZmFsc2UsICJHRVQiKTsKKyAgICAgICAgUmVzb3VyY2VUZXN0VXRpbHMuY29udGFpbnNFeGFjdE1ldGhvZHMoUmVzb3VyY2VUZXN0VXRpbHMuZ2V0UmVzb3VyY2UoY2hpbGRSZXNvdXJjZXMsICJ7Y2hpbGQtdGVtcGxhdGUteX0iKSwgZmFsc2UsCisgICAgICAgICAgICAgICAgIlBPU1QiKTsKKworICAgICAgICBmaW5hbCBSZXNvdXJjZSB0ZW1wbGF0ZUEgPSBSZXNvdXJjZVRlc3RVdGlscy5nZXRSZXNvdXJjZShnZXRSZXNvdXJjZU1vZGVsKCkuZ2V0Um9vdFJlc291cmNlcygpLCAie2F9Iik7CisgICAgICAgIFJlc291cmNlVGVzdFV0aWxzLmNvbnRhaW5zRXhhY3RNZXRob2RzKHRlbXBsYXRlQSwgZmFsc2UsICJHRVQiLCAiUFVUIik7CisgICAgICAgIGZpbmFsIExpc3Q8UmVzb3VyY2U+IHRlbXBsYXRlQUNoaWxkUmVzb3VyY2VzID0gdGVtcGxhdGVBLmdldENoaWxkUmVzb3VyY2VzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCB0ZW1wbGF0ZUFDaGlsZFJlc291cmNlcy5zaXplKCkpOworICAgICAgICBSZXNvdXJjZVRlc3RVdGlscy5jb250YWluc0V4YWN0TWV0aG9kcyhSZXNvdXJjZVRlc3RVdGlscy5nZXRSZXNvdXJjZSh0ZW1wbGF0ZUFDaGlsZFJlc291cmNlcywKKyAgICAgICAgICAgICAgICAie2EtY2hpbGQtdGVtcGxhdGUtcX0iKSwgZmFsc2UsICJHRVQiKTsKKyAgICAgICAgUmVzb3VyY2VUZXN0VXRpbHMuY29udGFpbnNFeGFjdE1ldGhvZHMoUmVzb3VyY2VUZXN0VXRpbHMuZ2V0UmVzb3VyY2UodGVtcGxhdGVBQ2hpbGRSZXNvdXJjZXMsCisgICAgICAgICAgICAgICAgInthLWNoaWxkLXRlbXBsYXRlLXd9IiksIGZhbHNlLCAiUE9TVCIpOworCisgICAgICAgIGZpbmFsIFJlc291cmNlIHRlbXBsYXRlQiA9IFJlc291cmNlVGVzdFV0aWxzLmdldFJlc291cmNlKGdldFJlc291cmNlTW9kZWwoKS5nZXRSb290UmVzb3VyY2VzKCksICJ7Yn0iKTsKKyAgICAgICAgUmVzb3VyY2VUZXN0VXRpbHMuY29udGFpbnNFeGFjdE1ldGhvZHModGVtcGxhdGVCLCBmYWxzZSwgIlBPU1QiKTsKKyAgICAgICAgZmluYWwgTGlzdDxSZXNvdXJjZT4gdGVtcGxhdGVCQ2hpbGRSZXNvdXJjZXMgPSB0ZW1wbGF0ZUIuZ2V0Q2hpbGRSZXNvdXJjZXMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHRlbXBsYXRlQkNoaWxkUmVzb3VyY2VzLnNpemUoKSk7CisgICAgICAgIFJlc291cmNlVGVzdFV0aWxzLmNvbnRhaW5zRXhhY3RNZXRob2RzKFJlc291cmNlVGVzdFV0aWxzLmdldFJlc291cmNlKHRlbXBsYXRlQkNoaWxkUmVzb3VyY2VzLAorICAgICAgICAgICAgICAgICJ7YS1jaGlsZC10ZW1wbGF0ZS1xfSIpLCBmYWxzZSwgIkRFTEVURSIpOworICAgICAgICBSZXNvdXJjZVRlc3RVdGlscy5jb250YWluc0V4YWN0TWV0aG9kcyhSZXNvdXJjZVRlc3RVdGlscy5nZXRSZXNvdXJjZSh0ZW1wbGF0ZUJDaGlsZFJlc291cmNlcywKKyAgICAgICAgICAgICAgICAie2ItY2hpbGQtdGVtcGxhdGUten0iKSwgZmFsc2UsICJQVVQiKTsKKyAgICAgICAgUmVzb3VyY2VUZXN0VXRpbHMuY29udGFpbnNFeGFjdE1ldGhvZHMoUmVzb3VyY2VUZXN0VXRpbHMuZ2V0UmVzb3VyY2UodGVtcGxhdGVCQ2hpbGRSZXNvdXJjZXMsCisgICAgICAgICAgICAgICAgImFub3RoZXItY2hpbGQiKSwgZmFsc2UsICJQVVQiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByb2R1Y2VyIGZvciBKRVJTRVktMjk0NjogU3RhY2tPdmVyRmxvd0Vycm9yIGluIFJlc291cmNlLnRvU3RyaW5nKCkKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZVdpdGhDaGlsZHJlbkRvZXNOb3RPdmVyZmxvd1RvU3RyaW5nKCkgeworICAgICAgICBmaW5hbCBSZXNvdXJjZS5CdWlsZGVyIHBhcmVudEJ1aWxkZXIgPSBSZXNvdXJjZS5idWlsZGVyKCJwYXJlbnQiKTsKKyAgICAgICAgZmluYWwgUmVzb3VyY2UuQnVpbGRlciBjaGlsZEJ1aWxkZXIgPSBwYXJlbnRCdWlsZGVyLmFkZENoaWxkUmVzb3VyY2UoImNoaWxkIik7CisgICAgICAgIGZpbmFsIFJlc291cmNlLkJ1aWxkZXIgbG9jYXRvckJ1aWxkZXIgPSBwYXJlbnRCdWlsZGVyLmFkZENoaWxkUmVzb3VyY2UoImNoaWxkIik7CisKKyAgICAgICAgLy8gSW4gSmVyc2V5IDIuMjEgdGhpcyB0aHJvd3MgU3RhY2tPdmVyRmxvd0Vycm9yLgorICAgICAgICBhc3NlcnROb3ROdWxsKGNoaWxkQnVpbGRlci50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChwYXJlbnRCdWlsZGVyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJ1bnRpbWVSZXNvdXJjZU1vZGVsKCkgeworICAgICAgICBSZXNvdXJjZU1vZGVsIHJlc291cmNlTW9kZWwgPSBnZXRSZXNvdXJjZU1vZGVsKCk7CisgICAgICAgIGZpbmFsIFJ1bnRpbWVSZXNvdXJjZU1vZGVsIHJ1bnRpbWVSZXNvdXJjZU1vZGVsID0gcmVzb3VyY2VNb2RlbC5nZXRSdW50aW1lUmVzb3VyY2VNb2RlbCgpOworICAgICAgICBmaW5hbCBMaXN0PFJ1bnRpbWVSZXNvdXJjZT4gcnVudGltZVJlc291cmNlcyA9IHJ1bnRpbWVSZXNvdXJjZU1vZGVsLmdldFJ1bnRpbWVSZXNvdXJjZXMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHJ1bnRpbWVSZXNvdXJjZXMuc2l6ZSgpKTsKKyAgICAgICAgZmluYWwgUnVudGltZVJlc291cmNlIGEgPSBSZXNvdXJjZVRlc3RVdGlscy5nZXRSdW50aW1lUmVzb3VyY2UocnVudGltZVJlc291cmNlcywgIi9hIik7CisgICAgICAgIFJlc291cmNlVGVzdFV0aWxzLmNvbnRhaW5zRXhhY3RNZXRob2RzKGEsIGZhbHNlLCAiR0VUIiwgIlBPU1QiKTsKKyAgICAgICAgZmluYWwgTGlzdDxSdW50aW1lUmVzb3VyY2U+IGFDaGlsZFJ1bnRpbWVSZXNvdXJjZXMgPSBhLmdldENoaWxkUnVudGltZVJlc291cmNlcygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgYUNoaWxkUnVudGltZVJlc291cmNlcy5zaXplKCkpOworCisgICAgICAgIGZpbmFsIFJ1bnRpbWVSZXNvdXJjZSBjaGlsZFJlc291cmNlID0gUmVzb3VyY2VUZXN0VXRpbHMuZ2V0UnVudGltZVJlc291cmNlKGFDaGlsZFJ1bnRpbWVSZXNvdXJjZXMsICIvY2hpbGQiKTsKKyAgICAgICAgUmVzb3VyY2VUZXN0VXRpbHMuY29udGFpbnNFeGFjdE1ldGhvZHMoY2hpbGRSZXNvdXJjZSwgZmFsc2UsCisKKyAgICAgICAgICAgICAgICAiR0VUIik7CisKKworICAgICAgICB0ZXN0VGVtcGxhdGUocnVudGltZVJlc291cmNlcyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZSBnZXRQYXJlbnRSZXNvdXJjZShSdW50aW1lUmVzb3VyY2UgcnVudGltZVJlc291cmNlLCBTdHJpbmcgcGF0aCkgeworICAgICAgICBpbnQgaSA9IDA7CisKKyAgICAgICAgZm9yIChSZXNvdXJjZSByZXNvdXJjZSA6IHJ1bnRpbWVSZXNvdXJjZS5nZXRSZXNvdXJjZXMoKSkgeworICAgICAgICAgICAgaWYgKHBhdGguZXF1YWxzKHJlc291cmNlLmdldFBhdGgoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcnVudGltZVJlc291cmNlLmdldFBhcmVudFJlc291cmNlcygpLmdldChpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorICAgICAgICBmYWlsKCJSZXNvdXJjZSAiICsgcGF0aCArICIgbm90IGZvdW5kIik7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0VGVtcGxhdGUoTGlzdDxSdW50aW1lUmVzb3VyY2U+IHJ1bnRpbWVSZXNvdXJjZXMpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlZ2V4VGVtcGxhdGUgPSAiLygiICsgVXJpVGVtcGxhdGVQYXJzZXIuVEVNUExBVEVfVkFMVUVfUEFUVEVSTi5wYXR0ZXJuKCkgKyAiKSI7CisgICAgICAgIGZpbmFsIFJ1bnRpbWVSZXNvdXJjZSB0ZW1wbGF0ZSA9IFJlc291cmNlVGVzdFV0aWxzLmdldFJ1bnRpbWVSZXNvdXJjZShydW50aW1lUmVzb3VyY2VzLCByZWdleFRlbXBsYXRlKTsKKyAgICAgICAgUmVzb3VyY2VUZXN0VXRpbHMuY29udGFpbnNFeGFjdE1ldGhvZHModGVtcGxhdGUsIGZhbHNlLCAiR0VUIiwgIlBVVCIsICJQT1NUIik7CisgICAgICAgIGZpbmFsIExpc3Q8UnVudGltZVJlc291cmNlPiB0ZW1wbGF0ZUNoaWxkUmVzb3VyY2VzID0gdGVtcGxhdGUuZ2V0Q2hpbGRSdW50aW1lUmVzb3VyY2VzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCB0ZW1wbGF0ZUNoaWxkUmVzb3VyY2VzLnNpemUoKSk7CisKKyAgICAgICAgZmluYWwgUnVudGltZVJlc291cmNlIHRlbXBsYXRlQ2hpbGQgPSBSZXNvdXJjZVRlc3RVdGlscy5nZXRSdW50aW1lUmVzb3VyY2UodGVtcGxhdGVDaGlsZFJlc291cmNlcywgcmVnZXhUZW1wbGF0ZSk7CisgICAgICAgIFJlc291cmNlVGVzdFV0aWxzLmNvbnRhaW5zRXhhY3RNZXRob2RzKHRlbXBsYXRlQ2hpbGQsIGZhbHNlLCAiR0VUIiwgIlBPU1QiLCAiUFVUIiwgIkRFTEVURSIpOworCisgICAgICAgIGdldFBhcmVudFJlc291cmNlKHRlbXBsYXRlQ2hpbGQsICJ7YS1jaGlsZC10ZW1wbGF0ZS1xfSIpLmdldFBhdGgoKS5lcXVhbHMoInthfSIpOworICAgICAgICBnZXRQYXJlbnRSZXNvdXJjZSh0ZW1wbGF0ZUNoaWxkLCAie2EtY2hpbGQtdGVtcGxhdGUtd30iKS5nZXRQYXRoKCkuZXF1YWxzKCJ7YX0iKTsKKworICAgICAgICBnZXRQYXJlbnRSZXNvdXJjZSh0ZW1wbGF0ZUNoaWxkLCAie2EtY2hpbGQtdGVtcGxhdGUtcX0iKS5nZXRQYXRoKCkuZXF1YWxzKCJ7Yn0iKTsKKyAgICAgICAgZ2V0UGFyZW50UmVzb3VyY2UodGVtcGxhdGVDaGlsZCwgIntiLWNoaWxkLXRlbXBsYXRlLXp9IikuZ2V0UGF0aCgpLmVxdWFscygie2J9Iik7CisKKworICAgICAgICBmaW5hbCBSdW50aW1lUmVzb3VyY2UgY2hpbGQgPSBSZXNvdXJjZVRlc3RVdGlscy5nZXRSdW50aW1lUmVzb3VyY2UodGVtcGxhdGVDaGlsZFJlc291cmNlcywgIi9hbm90aGVyXFwtY2hpbGQiKTsKKyAgICAgICAgZ2V0UGFyZW50UmVzb3VyY2UoY2hpbGQsICJhbm90aGVyLWNoaWxkIikuZ2V0UGF0aCgpLmVxdWFscygie2J9Iik7CisgICAgICAgIFJlc291cmNlVGVzdFV0aWxzLmNvbnRhaW5zRXhhY3RNZXRob2RzKGNoaWxkLCBmYWxzZSwgIlBVVCIpOworICAgIH0KKworICAgIHByaXZhdGUgUmVzb3VyY2VNb2RlbCBnZXRSZXNvdXJjZU1vZGVsKCkgeworICAgICAgICBmaW5hbCBMaXN0PFJlc291cmNlPiByZXNvdXJjZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgcmVzb3VyY2VzLmFkZChSZXNvdXJjZS5mcm9tKFNpbXBsZVJlc291cmNlQS5jbGFzcykpOworICAgICAgICByZXNvdXJjZXMuYWRkKFJlc291cmNlLmZyb20oU2ltcGxlUmVzb3VyY2VCLmNsYXNzKSk7CisgICAgICAgIHJlc291cmNlcy5hZGQoUmVzb3VyY2UuZnJvbShSZXNvdXJjZVRlbXBsYXRlQS5jbGFzcykpOworICAgICAgICByZXNvdXJjZXMuYWRkKFJlc291cmNlLmZyb20oUmVzb3VyY2VUZW1wbGF0ZUIuY2xhc3MpKTsKKworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlTW9kZWwuQnVpbGRlcihyZXNvdXJjZXMsIGZhbHNlKS5idWlsZCgpOworICAgIH0KKworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBOb25Sb290UmVzb3VyY2VBIHsKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiZ2V0QSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5vblJvb3RSZXNvdXJjZUIgeworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJnZXRCIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlTW9kZWxXaXRoTm9uUm9vdFJlc291cmNlcygpIHsKKyAgICAgICAgUmVzb3VyY2VNb2RlbC5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgUmVzb3VyY2VNb2RlbC5CdWlsZGVyKGZhbHNlKTsKKyAgICAgICAgYnVpbGRlci5hZGRSZXNvdXJjZShSZXNvdXJjZS5mcm9tKE5vblJvb3RSZXNvdXJjZUEuY2xhc3MpKTsKKyAgICAgICAgYnVpbGRlci5hZGRSZXNvdXJjZShSZXNvdXJjZS5mcm9tKE5vblJvb3RSZXNvdXJjZUIuY2xhc3MpKTsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VNb2RlbCBtb2RlbCA9IGJ1aWxkZXIuYnVpbGQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG1vZGVsLmdldFJlc291cmNlcygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtb2RlbC5nZXRSb290UmVzb3VyY2VzKCkuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJSZXNvdXJjZU1vZGVsV2l0aE5vblJvb3RSZXNvdXJjZXMoKSB7CisgICAgICAgIFJlc291cmNlTW9kZWwuQnVpbGRlciBidWlsZGVyID0gbmV3IFJlc291cmNlTW9kZWwuQnVpbGRlcih0cnVlKTsKKyAgICAgICAgYnVpbGRlci5hZGRSZXNvdXJjZShSZXNvdXJjZS5mcm9tKE5vblJvb3RSZXNvdXJjZUEuY2xhc3MpKTsKKyAgICAgICAgYnVpbGRlci5hZGRSZXNvdXJjZShSZXNvdXJjZS5mcm9tKE5vblJvb3RSZXNvdXJjZUIuY2xhc3MpKTsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VNb2RlbCBtb2RlbCA9IGJ1aWxkZXIuYnVpbGQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1vZGVsLmdldFJlc291cmNlcygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtb2RlbC5nZXRSb290UmVzb3VyY2VzKCkuc2l6ZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9SZXNvdXJjZU5vdEZvdW5kVGVzdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvUmVzb3VyY2VOb3RGb3VuZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGMyZGNiCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvUmVzb3VyY2VOb3RGb3VuZFRlc3QuamF2YQpAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuSW5mbGVjdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXF1ZXN0Q29udGV4dEJ1aWxkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIHRlc3QgZm9yIEpFUlNFWS05MzgKKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNvdXJjZU5vdEZvdW5kVGVzdCB7CisKKyAgICBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwbGljYXRpb247CisKKyAgICBwcml2YXRlIEFwcGxpY2F0aW9uSGFuZGxlciBjcmVhdGVBcHBsaWNhdGlvbihDbGFzczw/Pi4uLiBjbGFzc2VzKSB7CisgICAgICAgIHJldHVybiBuZXcgQXBwbGljYXRpb25IYW5kbGVyKG5ldyBSZXNvdXJjZUNvbmZpZyhjbGFzc2VzKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15SW5mbGVjdG9yIGltcGxlbWVudHMgSW5mbGVjdG9yPENvbnRhaW5lclJlcXVlc3RDb250ZXh0LCBSZXNwb25zZT4geworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGFwcGx5KENvbnRhaW5lclJlcXVlc3RDb250ZXh0IGRhdGEpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygiZHluYW1pYyIsIE1lZGlhVHlwZS5URVhUX1BMQUlOKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi9mb28iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRm9vUmVzb3VyY2UgeworICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9vKCkgeworICAgICAgICAgICAgcmV0dXJuICJmb28iOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImJhciIpCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRCYXIoKSB7CisgICAgICAgICAgICByZXR1cm4gImJhciI7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiY29udGVudC10eXBlIikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0U3BlY2lhbENvbnRlbnRUeXBlKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyhSZXNwb25zZS5TdGF0dXMuTk9UX0ZPVU5EKS50eXBlKCJhcHBsaWNhdGlvbi9zb21ldGhpbmciKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeGlzdGluZ0RlY2xhcmF0aXZlUmVzb3VyY2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEFwcGxpY2F0aW9uSGFuZGxlciBhcHAgPSBjcmVhdGVBcHBsaWNhdGlvbihGb29SZXNvdXJjZS5jbGFzcyk7CisKKyAgICAgICAgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2U7CisKKyAgICAgICAgcmVzcG9uc2UgPSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9mb28iLCAiR0VUIikuYWNjZXB0KCJ0ZXh0L3BsYWluIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9mb28vYmFyIiwgIkdFVCIpLmFjY2VwdCgidGV4dC9wbGFpbiIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYmFyIiwgcmVzcG9uc2UuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1pc3NpbmdEZWNsYXJhdGl2ZVJlc291cmNlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwID0gY3JlYXRlQXBwbGljYXRpb24oRm9vUmVzb3VyY2UuY2xhc3MpOworCisgICAgICAgIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlOworCisgICAgICAgIHJlc3BvbnNlID0gYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvZm9lIiwgIkdFVCIpLmFjY2VwdCgidGV4dC9wbGFpbiIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDA0LCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9mb29lIiwgIkdFVCIpLmFjY2VwdCgidGV4dC9wbGFpbiIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDA0LCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9mb28vYmF6IiwgIkdFVCIpLmFjY2VwdCgidGV4dC9wbGFpbiIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDA0LCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9mb28vYmFyL2JheiIsICJHRVQiKS5hY2NlcHQoInRleHQvcGxhaW4iKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwNCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIHByaXZhdGUgQXBwbGljYXRpb25IYW5kbGVyIGNyZWF0ZU1peGVkQXBwKCkgeworICAgICAgICBSZXNvdXJjZUNvbmZpZyByYyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhGb29SZXNvdXJjZS5jbGFzcyk7CisKKyAgICAgICAgUmVzb3VyY2UuQnVpbGRlciByYjsKKworICAgICAgICByYiA9IFJlc291cmNlLmJ1aWxkZXIoIi9keW5hbWljIik7CisgICAgICAgIHJiLmFkZE1ldGhvZCgiR0VUIikuaGFuZGxlZEJ5KG5ldyBNeUluZmxlY3RvcigpKTsKKyAgICAgICAgcmMucmVnaXN0ZXJSZXNvdXJjZXMocmIuYnVpbGQoKSk7CisKKyAgICAgICAgcmIgPSBSZXNvdXJjZS5idWlsZGVyKCIvZm9vL2R5bmFtaWMiKTsKKyAgICAgICAgcmIuYWRkTWV0aG9kKCJHRVQiKS5oYW5kbGVkQnkobmV3IE15SW5mbGVjdG9yKCkpOworICAgICAgICByYy5yZWdpc3RlclJlc291cmNlcyhyYi5idWlsZCgpKTsKKworICAgICAgICByZXR1cm4gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihyYyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhpc3RpbmdNaXhlZFJlc291cmNlcygpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIEFwcGxpY2F0aW9uSGFuZGxlciBhcHAgPSBjcmVhdGVNaXhlZEFwcCgpOworCisgICAgICAgIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlOworCisgICAgICAgIHJlc3BvbnNlID0gYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvZm9vIiwgIkdFVCIpLmFjY2VwdCgidGV4dC9wbGFpbiIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwgcmVzcG9uc2UuZ2V0RW50aXR5KCkpOworCisgICAgICAgIHJlc3BvbnNlID0gYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvZHluYW1pYyIsICJHRVQiKS5hY2NlcHQoInRleHQvcGxhaW4iKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImR5bmFtaWMiLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9mb28vYmFyIiwgIkdFVCIpLmFjY2VwdCgidGV4dC9wbGFpbiIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYmFyIiwgcmVzcG9uc2UuZ2V0RW50aXR5KCkpOworCisgICAgICAgIHJlc3BvbnNlID0gYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvZm9vL2R5bmFtaWMiLCAiR0VUIikuYWNjZXB0KCJ0ZXh0L3BsYWluIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkeW5hbWljIiwgcmVzcG9uc2UuZ2V0RW50aXR5KCkpOworICAgIH0KKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ01peGVkUmVzb3VyY2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgQXBwbGljYXRpb25IYW5kbGVyIGFwcCA9IGNyZWF0ZU1peGVkQXBwKCk7CisKKyAgICAgICAgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2U7CisKKyAgICAgICAgcmVzcG9uc2UgPSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9mb2UiLCAiR0VUIikuYWNjZXB0KCJ0ZXh0L3BsYWluIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDQsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICByZXNwb25zZSA9IGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL2Zvb2UiLCAiR0VUIikuYWNjZXB0KCJ0ZXh0L3BsYWluIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDQsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICByZXNwb25zZSA9IGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL2R5bmFtaWNhbCIsICJHRVQiKS5hY2NlcHQoInRleHQvcGxhaW4iKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwNCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworCisgICAgICAgIHJlc3BvbnNlID0gYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvZm9vL2JheiIsICJHRVQiKS5hY2NlcHQoInRleHQvcGxhaW4iKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwNCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworCisgICAgICAgIHJlc3BvbnNlID0gYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvZm9vL2Jhci9iYXoiLCAiR0VUIikuYWNjZXB0KCJ0ZXh0L3BsYWluIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDQsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICByZXNwb25zZSA9IGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL2Zvby9keW5hbWljL2JheiIsICJHRVQiKS5hY2NlcHQoInRleHQvcGxhaW4iKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwNCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbUNvbnRlbnRUeXBlQW5kTm9FbnRpdHkoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIEFwcGxpY2F0aW9uSGFuZGxlciBhcHAgPSBjcmVhdGVBcHBsaWNhdGlvbihGb29SZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvZm9vL2NvbnRlbnQtdHlwZSIsICJHRVQiKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwNCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFwcGxpY2F0aW9uL3NvbWV0aGluZyIsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpLnRvU3RyaW5nKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL1Jlc291cmNlUGF0aE92ZXJyaWRlVGVzdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvUmVzb3VyY2VQYXRoT3ZlcnJpZGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZkZTYyZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL1Jlc291cmNlUGF0aE92ZXJyaWRlVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5JbmZsZWN0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVzcG9uc2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlcXVlc3RDb250ZXh0QnVpbGRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdCBvZiByZXNvdXJjZSBwYXRoIG92ZXJyaWRpbmcgdmlhIHByb2dyYW1tYXRpYyBBUEkuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFJlc291cmNlUGF0aE92ZXJyaWRlVGVzdCB7CisKKyAgICBwcml2YXRlIEFwcGxpY2F0aW9uSGFuZGxlciBjcmVhdGVBcHBsaWNhdGlvbihSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZykgeworICAgICAgICByZXR1cm4gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihyZXNvdXJjZUNvbmZpZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCByZXNvdXJjZS4KKyAgICAgKi8KKyAgICBAUGF0aCgiaGVsbG8iKQorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBIZWxsb1Jlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgc2F5SGVsbG8oKSB7CisgICAgICAgICAgICByZXR1cm4gIkhlbGxvISI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPdmVycmlkZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhIZWxsb1Jlc291cmNlLmNsYXNzKTsKKworCisgICAgICAgIFJlc291cmNlLkJ1aWxkZXIgcmVzb3VyY2VCdWlsZGVyID0gUmVzb3VyY2UuYnVpbGRlcihIZWxsb1Jlc291cmNlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5wYXRoKCJoZWxsbzIiKTsKKyAgICAgICAgcmVzb3VyY2VCdWlsZGVyLmFkZENoaWxkUmVzb3VyY2UoIndvcmxkIikuYWRkTWV0aG9kKCJHRVQiKS5wcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgICAgICAgICAgICAgLmhhbmRsZWRCeShuZXcgSW5mbGVjdG9yPENvbnRhaW5lclJlcXVlc3RDb250ZXh0LCBTdHJpbmc+KCkgeworCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGFwcGx5KENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiSGVsbG8gV29ybGQhIjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgIGZpbmFsIFJlc291cmNlIHJlc291cmNlID0gcmVzb3VyY2VCdWlsZGVyLmJ1aWxkKCk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVyUmVzb3VyY2VzKHJlc291cmNlKTsKKworICAgICAgICBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwID0gY3JlYXRlQXBwbGljYXRpb24ocmVzb3VyY2VDb25maWcpOworCisgICAgICAgIENvbnRhaW5lclJlcXVlc3QgcmVxdWVzdDsKKyAgICAgICAgcmVxdWVzdCA9IFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvaGVsbG8iLCAiR0VUIikuYnVpbGQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJIZWxsbyEiLCBhcHAuYXBwbHkocmVxdWVzdCkuZ2V0KCkuZ2V0RW50aXR5KCkpOworCisgICAgICAgIHJlcXVlc3QgPSBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL2hlbGxvMiIsICJHRVQiKS5idWlsZCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkhlbGxvISIsIGFwcC5hcHBseShyZXF1ZXN0KS5nZXQoKS5nZXRFbnRpdHkoKSk7CisKKyAgICAgICAgcmVxdWVzdCA9IFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvaGVsbG8yL3dvcmxkIiwgIkdFVCIpLmJ1aWxkKCk7CisgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gYXBwLmFwcGx5KHJlcXVlc3QpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiSGVsbG8gV29ybGQhIiwgcmVzcG9uc2UuZ2V0RW50aXR5KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL1Jlc291cmNlVGVzdFV0aWxzLmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9SZXNvdXJjZVRlc3RVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZTEzMGQKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9SZXNvdXJjZVRlc3RVdGlscy5qYXZhCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiBVdGlscyBmb3Ige0BsaW5rIFJlc291cmNlIHJlc291cmNlfSB0ZXN0aW5nLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNvdXJjZVRlc3RVdGlscyB7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgY29udGFpbnNFeGFjdE1ldGhvZHMoUmVzb3VyY2UgcmVzb3VyY2UsIGJvb2xlYW4gc2hvdWxkQ29udGFpbkxvY2F0b3IsIFN0cmluZy4uLiBodHRwTWV0aG9kcykgeworICAgICAgICBhc3NlcnRFcXVhbHMoc2hvdWxkQ29udGFpbkxvY2F0b3IsIHJlc291cmNlLmdldFJlc291cmNlTG9jYXRvcigpICE9IG51bGwpOworICAgICAgICBmb3IgKFN0cmluZyBodHRwTWV0aG9kIDogaHR0cE1ldGhvZHMpIHsKKyAgICAgICAgICAgIGNvbnRhaW5zTWV0aG9kKHJlc291cmNlLCBodHRwTWV0aG9kKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoaHR0cE1ldGhvZHMubGVuZ3RoLCByZXNvdXJjZS5nZXRSZXNvdXJjZU1ldGhvZHMoKS5zaXplKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjb250YWluc01ldGhvZChSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIGh0dHBNZXRob2QpIHsKKyAgICAgICAgZm9yIChSZXNvdXJjZU1ldGhvZCBtZXRob2QgOiByZXNvdXJjZS5nZXRSZXNvdXJjZU1ldGhvZHMoKSkgeworICAgICAgICAgICAgaWYgKG1ldGhvZC5nZXRIdHRwTWV0aG9kKCkuZXF1YWxzKGh0dHBNZXRob2QpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZhaWwoIlJlc291cmNlICIgKyByZXNvdXJjZSArICIgZG9lcyBub3QgY29udGFpbiByZXNvdXJjZSBtZXRob2QgIiArIGh0dHBNZXRob2QgKyAiISIpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2UgZ2V0UmVzb3VyY2UoTGlzdDxSZXNvdXJjZT4gcmVzb3VyY2VzLCBTdHJpbmcgcGF0aCkgeworICAgICAgICBmb3IgKFJlc291cmNlIHJlc291cmNlIDogcmVzb3VyY2VzKSB7CisgICAgICAgICAgICBpZiAocmVzb3VyY2UuZ2V0UGF0aCgpLmVxdWFscyhwYXRoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXNvdXJjZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmYWlsKCJSZXNvdXJjZSB3aXRoIHBhdGggJyIgKyBwYXRoICsgIicgaXMgbm90IGluIHRoZSBsaXN0IG9mIHJlc291cmNlcyAiICsgcmVzb3VyY2VzICsgIiEiKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisKKyAgICBwdWJsaWMgc3RhdGljIFJ1bnRpbWVSZXNvdXJjZSBnZXRSdW50aW1lUmVzb3VyY2UoTGlzdDxSdW50aW1lUmVzb3VyY2U+IHJlc291cmNlcywgU3RyaW5nIHJlZ2V4KSB7CisgICAgICAgIGZvciAoUnVudGltZVJlc291cmNlIHJlc291cmNlIDogcmVzb3VyY2VzKSB7CisgICAgICAgICAgICBpZiAocmVzb3VyY2UuZ2V0UmVnZXgoKS5lcXVhbHMocmVnZXgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZhaWwoIlJ1bnRpbWVSZXNvdXJjZSB3aXRoIHJlZ2V4ICciICsgcmVnZXggKyAiJyBpcyBub3QgaW4gdGhlIGxpc3Qgb2YgcnVudGltZSByZXNvdXJjZXMgIiArIHJlc291cmNlcyArICIhIik7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjb250YWluc0V4YWN0TWV0aG9kcyhSdW50aW1lUmVzb3VyY2UgcmVzb3VyY2UsIGJvb2xlYW4gc2hvdWxkQ29udGFpbkxvY2F0b3IsIFN0cmluZy4uLiBodHRwTWV0aG9kcykgeworICAgICAgICBhc3NlcnRFcXVhbHMoc2hvdWxkQ29udGFpbkxvY2F0b3IsIHJlc291cmNlLmdldFJlc291cmNlTG9jYXRvcnMoKS5zaXplKCkgPT0gMSk7CisgICAgICAgIGZvciAoU3RyaW5nIGh0dHBNZXRob2QgOiBodHRwTWV0aG9kcykgeworICAgICAgICAgICAgY29udGFpbnNNZXRob2QocmVzb3VyY2UsIGh0dHBNZXRob2QpOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscyhodHRwTWV0aG9kcy5sZW5ndGgsIHJlc291cmNlLmdldFJlc291cmNlTWV0aG9kcygpLnNpemUoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNvbnRhaW5zTWV0aG9kKFJ1bnRpbWVSZXNvdXJjZSByZXNvdXJjZSwgU3RyaW5nIGh0dHBNZXRob2QpIHsKKyAgICAgICAgZm9yIChSZXNvdXJjZU1ldGhvZCBtZXRob2QgOiByZXNvdXJjZS5nZXRSZXNvdXJjZU1ldGhvZHMoKSkgeworICAgICAgICAgICAgaWYgKG1ldGhvZC5nZXRIdHRwTWV0aG9kKCkuZXF1YWxzKGh0dHBNZXRob2QpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZhaWwoIlJ1bnRpbWVSZXNvdXJjZSAiICsgcmVzb3VyY2UgKyAiIGRvZXMgbm90IGNvbnRhaW4gcmVzb3VyY2UgbWV0aG9kICIgKyBodHRwTWV0aG9kICsgIiEiKTsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvU3ViUmVzb3VyY2VDbGFzc0R5bmFtaWNUZXN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9TdWJSZXNvdXJjZUNsYXNzRHluYW1pY1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjhmNGM1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvU3ViUmVzb3VyY2VDbGFzc0R5bmFtaWNUZXN0LmphdmEKQEAgLTAsMCArMSwxNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlcXVlc3RDb250ZXh0QnVpbGRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGFrZW4gZnJvbSBKZXJzZXktMTogamVyc2V5LXRlc3RzOmNvbS5zdW4uamVyc2V5LmltcGwuc3VicmVzb3VyY2VzLlN1YlJlc291cmNlQ2xhc3NEeW5hbWljVGVzdAorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqLworcHVibGljIGNsYXNzIFN1YlJlc291cmNlQ2xhc3NEeW5hbWljVGVzdCB7CisKKyAgICBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwOworCisgICAgcHJpdmF0ZSBBcHBsaWNhdGlvbkhhbmRsZXIgY3JlYXRlQXBwbGljYXRpb24oQ2xhc3M8Pz4uLi4gY2xhc3NlcykgeworICAgICAgICByZXR1cm4gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihuZXcgUmVzb3VyY2VDb25maWcoY2xhc3NlcykpOworICAgIH0KKworICAgIEBQYXRoKCIvcGFyZW50IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhcmVudCB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1lKCkgeworICAgICAgICAgICAgcmV0dXJuICJwYXJlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImNoaWxkIikKKyAgICAgICAgcHVibGljIENsYXNzPENoaWxkPiBnZXRDaGlsZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBDaGlsZC5jbGFzczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2hpbGQgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRNZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAiY2hpbGQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3ViUmVzb3VyY2VEeW5hbWljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFwcCA9IGNyZWF0ZUFwcGxpY2F0aW9uKFBhcmVudC5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXJlbnQiLCBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9wYXJlbnQiLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCkuZ2V0RW50aXR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNoaWxkIiwgYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvcGFyZW50L2NoaWxkIiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiL3twfSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXJlbnRXaXRoVGVtcGxhdGVzIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWUoQFBhdGhQYXJhbSgicCIpIFN0cmluZyBwKSB7CisgICAgICAgICAgICByZXR1cm4gcDsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJjaGlsZC97Y30iKQorICAgICAgICBwdWJsaWMgQ2xhc3M8Q2hpbGRXaXRoVGVtcGxhdGVzPiBnZXRDaGlsZFdpdGhUZW1wbGF0ZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gQ2hpbGRXaXRoVGVtcGxhdGVzLmNsYXNzOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDaGlsZFdpdGhUZW1wbGF0ZXMgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRNZShAUGF0aFBhcmFtKCJjIikgU3RyaW5nIGMpIHsKKyAgICAgICAgICAgIHJldHVybiBjOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3ViUmVzb3VyY2VEeW5hbWljV2l0aFRlbXBsYXRlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhcHAgPSBjcmVhdGVBcHBsaWNhdGlvbihQYXJlbnRXaXRoVGVtcGxhdGVzLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoInBhcmVudCIsIGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3BhcmVudCIsICJHRVQiKS5idWlsZCgpKS5nZXQoKS5nZXRFbnRpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZmlyc3QiLCBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9wYXJlbnQvY2hpbGQvZmlyc3QiLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCkuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBQYXRoKCIve3B9IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhcmVudFdpdGhUZW1wbGF0ZXNMaWZlY3ljbGUgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRNZShAUGF0aFBhcmFtKCJwIikgU3RyaW5nIHApIHsKKyAgICAgICAgICAgIHJldHVybiBwOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImNoaWxkL3tjfSIpCisgICAgICAgIHB1YmxpYyBDbGFzczxDaGlsZFdpdGhUZW1wbGF0ZXNQZXJSZXF1ZXN0PiBnZXRDaGlsZFdpdGhUZW1wbGF0ZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gQ2hpbGRXaXRoVGVtcGxhdGVzUGVyUmVxdWVzdC5jbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJjaGlsZC9zaW5nbGV0b24ve2N9IikKKyAgICAgICAgcHVibGljIENsYXNzPENoaWxkV2l0aFRlbXBsYXRlc1NpbmdsZXRvbj4gZ2V0Q2hpbGRXaXRoVGVtcGxhdGVzU2luZ2xldG9uKCkgeworICAgICAgICAgICAgcmV0dXJuIENoaWxkV2l0aFRlbXBsYXRlc1NpbmdsZXRvbi5jbGFzczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2hpbGRXaXRoVGVtcGxhdGVzUGVyUmVxdWVzdCB7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgaSA9IDA7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIGM7CisKKyAgICAgICAgcHVibGljIENoaWxkV2l0aFRlbXBsYXRlc1BlclJlcXVlc3QoQFBhdGhQYXJhbSgiYyIpIFN0cmluZyBjKSB7CisgICAgICAgICAgICB0aGlzLmMgPSBjOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1lKCkgeworICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgcmV0dXJuIGMgKyBpOworICAgICAgICB9CisgICAgfQorCisgICAgQFNpbmdsZXRvbgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2hpbGRXaXRoVGVtcGxhdGVzU2luZ2xldG9uIHsKKworICAgICAgICBwcml2YXRlIGludCBpID0gMDsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWUoQFBhdGhQYXJhbSgiYyIpIFN0cmluZyBjKSB7CisgICAgICAgICAgICBpKys7CisgICAgICAgICAgICByZXR1cm4gYyArIGk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJSZXNvdXJjZUR5bmFtaWNXaXRoVGVtcGxhdGVzTGlmZWN5Y2xlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFwcCA9IGNyZWF0ZUFwcGxpY2F0aW9uKFBhcmVudFdpdGhUZW1wbGF0ZXNMaWZlY3ljbGUuY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscygicGFyZW50IiwgYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvcGFyZW50IiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4MSIsIGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3BhcmVudC9jaGlsZC94IiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4MSIsIGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3BhcmVudC9jaGlsZC94IiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4MSIsIGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3BhcmVudC9jaGlsZC9zaW5nbGV0b24veCIsICJHRVQiKS5idWlsZCgpKS5nZXQoKS5nZXRFbnRpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygieDIiLCBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9wYXJlbnQvY2hpbGQvc2luZ2xldG9uL3giLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCkuZ2V0RW50aXR5KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL1N1YlJlc291cmNlRHluYW1pY1Rlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL1N1YlJlc291cmNlRHluYW1pY1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTAwMDM1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvU3ViUmVzb3VyY2VEeW5hbWljVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXF1ZXN0Q29udGV4dEJ1aWxkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRha2VuIGZyb20gSmVyc2V5LTE6IGplcnNleS10ZXN0czpjb20uc3VuLmplcnNleS5pbXBsLnN1YnJlc291cmNlcy5TdWJSZXNvdXJjZUR5bmFtaWNUZXN0CisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitwdWJsaWMgY2xhc3MgU3ViUmVzb3VyY2VEeW5hbWljVGVzdCB7CisKKyAgICBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwOworCisgICAgcHJpdmF0ZSBBcHBsaWNhdGlvbkhhbmRsZXIgY3JlYXRlQXBwbGljYXRpb24oQ2xhc3M8Pz4uLi4gY2xhc3NlcykgeworICAgICAgICByZXR1cm4gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihuZXcgUmVzb3VyY2VDb25maWcoY2xhc3NlcykpOworICAgIH0KKworICAgIEBQYXRoKCIvcGFyZW50IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhcmVudCB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1lKCkgeworICAgICAgICAgICAgcmV0dXJuICJwYXJlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImNoaWxkIikKKyAgICAgICAgcHVibGljIENoaWxkIGdldENoaWxkKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDaGlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDaGlsZCB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1lKCkgeworICAgICAgICAgICAgcmV0dXJuICJjaGlsZCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJSZXNvdXJjZUR5bmFtaWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXBwID0gY3JlYXRlQXBwbGljYXRpb24oUGFyZW50LmNsYXNzKTsKKworICAgICAgICBDb250YWluZXJSZXNwb25zZSByZXNwb25zZTsKKworICAgICAgICByZXNwb25zZSA9IGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3BhcmVudCIsICJHRVQiKS5hY2NlcHQoInRleHQvcGxhaW4iKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXJlbnQiLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9wYXJlbnQvY2hpbGQiLCAiR0VUIikuYWNjZXB0KCJ0ZXh0L3BsYWluIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiY2hpbGQiLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgfQorCisgICAgQFBhdGgoIi97cH0iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGFyZW50V2l0aFRlbXBsYXRlcyB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1lKEBQYXRoUGFyYW0oInAiKSBTdHJpbmcgcCkgeworICAgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiY2hpbGQve2N9IikKKyAgICAgICAgcHVibGljIENoaWxkV2l0aFRlbXBsYXRlcyBnZXRDaGlsZFdpdGhUZW1wbGF0ZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENoaWxkV2l0aFRlbXBsYXRlcygpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDaGlsZFdpdGhUZW1wbGF0ZXMgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRNZShAUGF0aFBhcmFtKCJjIikgU3RyaW5nIGMpIHsKKyAgICAgICAgICAgIHJldHVybiBjOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3ViUmVzb3VyY2VEeW5hbWljV2l0aFRlbXBsYXRlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhcHAgPSBjcmVhdGVBcHBsaWNhdGlvbihQYXJlbnRXaXRoVGVtcGxhdGVzLmNsYXNzKTsKKworICAgICAgICBDb250YWluZXJSZXNwb25zZSByZXNwb25zZTsKKworICAgICAgICByZXNwb25zZSA9IGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3BhcmVudCIsICJHRVQiKS5hY2NlcHQoInRleHQvcGxhaW4iKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXJlbnQiLCByZXNwb25zZS5nZXRFbnRpdHkoKSk7CisgICAgICAgIHJlc3BvbnNlID0gYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvcGFyZW50L2NoaWxkL2ZpcnN0IiwgIkdFVCIpLmFjY2VwdCgidGV4dC9wbGFpbiIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZpcnN0IiwgcmVzcG9uc2UuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN1YlJlc291cmNlRXhwbGljaXRSZWdleENhcHR1cmluZ0dyb3VwcyB7CisKKyAgICAgICAgQFBhdGgoInthOiAoXFxkKShcXGQqKX0te2I6IChcXGQpKFxcZCopfS17YzogKFxcZCkoXFxkKil9IikKKyAgICAgICAgcHVibGljIFN1YlJlc291cmNlRXhwbGljaXRSZWdleENhcHR1cmluZ0dyb3Vwc1N1YiBnZXRNdWx0aXBsZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3ViUmVzb3VyY2VFeHBsaWNpdFJlZ2V4Q2FwdHVyaW5nR3JvdXBzU3ViKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN1YlJlc291cmNlRXhwbGljaXRSZWdleENhcHR1cmluZ0dyb3Vwc1N1YiB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgie2R9IikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRNZShAUGF0aFBhcmFtKCJkIikgU3RyaW5nIGQpIHsKKyAgICAgICAgICAgIHJldHVybiBkOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3ViUmVzb3VyY2VDYXB0dXJpbmdHcm91cHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXBwID0gY3JlYXRlQXBwbGljYXRpb24oU3ViUmVzb3VyY2VFeHBsaWNpdFJlZ2V4Q2FwdHVyaW5nR3JvdXBzLmNsYXNzKTsKKworICAgICAgICBDb250YWluZXJSZXNwb25zZSByZXNwb25zZTsKKworICAgICAgICByZXNwb25zZSA9IGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLzEyMy00NTYtNzg5L2QiLCAiR0VUIikuYWNjZXB0KCJ0ZXh0L3BsYWluIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiZCIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9TdWJSZXNvdXJjZUR5bmFtaWNXaXRoRHVwbGljYXRlVGVtcGxhdGVOYW1lc1Rlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL1N1YlJlc291cmNlRHluYW1pY1dpdGhEdXBsaWNhdGVUZW1wbGF0ZU5hbWVzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MmJlNjkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9TdWJSZXNvdXJjZUR5bmFtaWNXaXRoRHVwbGljYXRlVGVtcGxhdGVOYW1lc1Rlc3QuamF2YQpAQCAtMCwwICsxLDEzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlcXVlc3RDb250ZXh0QnVpbGRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGFrZW4gZnJvbSBKZXJzZXktMTogamVyc2V5LXRlc3RzOmNvbS5zdW4uamVyc2V5LmltcGwuc3VicmVzb3VyY2VzLlN1YlJlc291cmNlRHluYW1pY1dpdGhEdXBsaWNhdGVUZW1wbGF0ZU5hbWVzVGVzdAorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqLworcHVibGljIGNsYXNzIFN1YlJlc291cmNlRHluYW1pY1dpdGhEdXBsaWNhdGVUZW1wbGF0ZU5hbWVzVGVzdCB7CisKKyAgICBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwOworCisgICAgcHJpdmF0ZSBBcHBsaWNhdGlvbkhhbmRsZXIgY3JlYXRlQXBwbGljYXRpb24oQ2xhc3M8Pz4uLi4gY2xhc3NlcykgeworICAgICAgICByZXR1cm4gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihuZXcgUmVzb3VyY2VDb25maWcoY2xhc3NlcykpOworICAgIH0KKworICAgIEBQYXRoKCIve3Z9IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhcmVudCB7CisKKyAgICAgICAgQFBhdGgoImNoaWxkLyIpCisgICAgICAgIHB1YmxpYyBDaGlsZCBnZXRDaGlsZChAUGF0aFBhcmFtKCJ2IikgU3RyaW5nIHYpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ2hpbGQodik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENoaWxkIHsKKworICAgICAgICBwcml2YXRlIFN0cmluZ0J1aWxkZXIgYnVmZmVyOworCisgICAgICAgIHB1YmxpYyBDaGlsZChTdHJpbmcgdikgeworICAgICAgICAgICAgdGhpcy5idWZmZXIgPSBuZXcgU3RyaW5nQnVpbGRlcih2KS5hcHBlbmQoIiAtPiAiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWUoQFBhdGhQYXJhbSgidiIpIFN0cmluZyB2KSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5idWZmZXIuYXBwZW5kKCJtZSgpIDogIikuYXBwZW5kKHYpLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJuZXh0L3t2fSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVBbmROZXh0KEBQYXRoUGFyYW0oInYiKSBTdHJpbmcgbmV4dCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuYnVmZmVyLmFwcGVuZCgibmV4dCgpIDogIikuYXBwZW5kKG5leHQpLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJhbGwiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEFsbFBhcmFtcyhAQ29udGV4dCBVcmlJbmZvIHVyaUluZm8pIHsKKyAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbXMgPSB1cmlJbmZvLmdldFBhdGhQYXJhbWV0ZXJzKCk7CisKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgZm9yIChFbnRyeTxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZSA6IHBhcmFtcy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJQYXJhbSAnIikuYXBwZW5kKGUuZ2V0S2V5KCkpLmFwcGVuZCgiJyB2YWx1ZXM6Iik7CisgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgdmFsdWUgOiBlLmdldFZhbHVlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCcgJykuYXBwZW5kKHZhbHVlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInt2fSIpCisgICAgICAgIHB1YmxpYyBDaGlsZCBnZXRDaGlsZChAUGF0aFBhcmFtKCJ2IikgU3RyaW5nIHYpIHsKKyAgICAgICAgICAgIHRoaXMuYnVmZmVyLmFwcGVuZCh2KS5hcHBlbmQoIiAtPiAiKTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJSZXNvdXJjZUR5bmFtaWNXaXRoVGVtcGxhdGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFwcCA9IGNyZWF0ZUFwcGxpY2F0aW9uKFBhcmVudC5jbGFzcyk7CisKKyAgICAgICAgLy8gUGFyZW50LmdldENoaWxkKC4uLikgLT4gQ2hpbGQuZ2V0TWUoLi4uKQorICAgICAgICBhc3NlcnRFcXVhbHMoInBhcmVudCAtPiBtZSgpIDogcGFyZW50IiwKKyAgICAgICAgICAgICAgICBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9wYXJlbnQvY2hpbGQiLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCkuZ2V0RW50aXR5KCkpOworCisgICAgICAgIC8vIFBhcmVudC5nZXRDaGlsZCguLi4pIC0+IENoaWxkLmdldENoaWxkKC4uLikgLT4gQ2hpbGQuZ2V0TWUoLi4uKQorICAgICAgICBhc3NlcnRFcXVhbHMoInBhcmVudCAtPiBmaXJzdCAtPiBtZSgpIDogZmlyc3QiLAorICAgICAgICAgICAgICAgIGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3BhcmVudC9jaGlsZC9maXJzdCIsICJHRVQiKS5idWlsZCgpKS5nZXQoKS5nZXRFbnRpdHkoKSk7CisKKyAgICAgICAgLy8gUGFyZW50LmdldENoaWxkKC4uLikgLT4gQ2hpbGQuZ2V0Q2hpbGQoLi4uKSAtPiBDaGlsZC5nZXRDaGlsZCguLi4pIC0+IENoaWxkLmdldE1lKC4uLikKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXJlbnQgLT4gZmlyc3QgLT4gc2Vjb25kIC0+IG1lKCkgOiBzZWNvbmQiLAorICAgICAgICAgICAgICAgIGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3BhcmVudC9jaGlsZC9maXJzdC9zZWNvbmQiLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCkuZ2V0RW50aXR5KCkpOworCisgICAgICAgIC8vIFBhcmVudC5nZXRDaGlsZCguLi4pIC0+IENoaWxkLmdldENoaWxkKC4uLikgLT4gQ2hpbGQuZ2V0Q2hpbGQoLi4uKSAtPiBDaGlsZC5nZXRDaGlsZCguLi4pIC0+IENoaWxkLmdldE1lKC4uLikKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXJlbnQgLT4gZmlyc3QgLT4gc2Vjb25kIC0+IHRoaXJkIC0+IG1lKCkgOiB0aGlyZCIsCisgICAgICAgICAgICAgICAgYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvcGFyZW50L2NoaWxkL2ZpcnN0L3NlY29uZC90aGlyZCIsICJHRVQiKS5idWlsZCgpKS5nZXQoKS5nZXRFbnRpdHkoKSk7CisKKyAgICAgICAgLy8gUGFyZW50LmdldENoaWxkKC4uLikgLT4gQ2hpbGQuZ2V0Q2hpbGQoLi4uKSAtPiBDaGlsZC5nZXRDaGlsZCguLi4pIC0+IENoaWxkLmdldENoaWxkKC4uLikgLT4gQ2hpbGQuZ2V0TWVBbmROZXh0KC4uLikKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXJlbnQgLT4gZmlyc3QgLT4gc2Vjb25kIC0+IHRoaXJkIC0+IG5leHQoKSA6IGZvdXJ0aCIsCisgICAgICAgICAgICAgICAgYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvcGFyZW50L2NoaWxkL2ZpcnN0L3NlY29uZC90aGlyZC9uZXh0L2ZvdXJ0aCIsICJHRVQiKS5idWlsZCgpKS5nZXQoKQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldEVudGl0eSgpKTsKKworICAgICAgICAvLyBQYXJlbnQuZ2V0Q2hpbGQoLi4uKSAtPiBDaGlsZC5nZXRDaGlsZCguLi4pIC0+IENoaWxkLmdldENoaWxkKC4uLikgLT4gQ2hpbGQuZ2V0Q2hpbGQoLi4uKSAtPiBDaGlsZC5nZXRDaGlsZCguLi4pIC0+CisgICAgICAgIC8vIENoaWxkLmdldEFsbFBhcmFtcyguLi4pCisgICAgICAgIGFzc2VydEVxdWFscygiUGFyYW0gJ3YnIHZhbHVlczogZm91cnRoIHRoaXJkIHNlY29uZCBmaXJzdCBwYXJlbnQiLAorICAgICAgICAgICAgICAgIGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3BhcmVudC9jaGlsZC9maXJzdC9zZWNvbmQvdGhpcmQvZm91cnRoL2FsbCIsICJHRVQiKS5idWlsZCgpKS5nZXQoKQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldEVudGl0eSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9TdWJSZXNvdXJjZUR5bmFtaWNXaXRoUGFyYW1ldGVyc1Rlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL1N1YlJlc291cmNlRHluYW1pY1dpdGhQYXJhbWV0ZXJzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNjhkMzYKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9TdWJSZXNvdXJjZUR5bmFtaWNXaXRoUGFyYW1ldGVyc1Rlc3QuamF2YQpAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWw7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlcXVlc3RDb250ZXh0QnVpbGRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGFrZW4gZnJvbSBKZXJzZXktMTogamVyc2V5LXRlc3RzOmNvbS5zdW4uamVyc2V5LmltcGwuc3VicmVzb3VyY2VzLlN1YlJlc291cmNlRHluYW1pY1dpdGhQYXJhbWV0ZXJzVGVzdAorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqLworcHVibGljIGNsYXNzIFN1YlJlc291cmNlRHluYW1pY1dpdGhQYXJhbWV0ZXJzVGVzdCB7CisKKyAgICBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwOworCisgICAgcHJpdmF0ZSBBcHBsaWNhdGlvbkhhbmRsZXIgY3JlYXRlQXBwbGljYXRpb24oQ2xhc3M8Pz4uLi4gY2xhc3NlcykgeworICAgICAgICByZXR1cm4gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihuZXcgUmVzb3VyY2VDb25maWcoY2xhc3NlcykpOworICAgIH0KKworICAgIEBQYXRoKCIve3B9IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhcmVudFdpdGhUZW1wbGF0ZXMgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRNZShAUGF0aFBhcmFtKCJwIikgU3RyaW5nIHApIHsKKyAgICAgICAgICAgIHJldHVybiBwOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImNoaWxkL3tjfSIpCisgICAgICAgIHB1YmxpYyBDaGlsZFdpdGhUZW1wbGF0ZXMgZ2V0Q2hpbGRXaXRoVGVtcGxhdGVzKAorICAgICAgICAgICAgICAgIEBQYXRoUGFyYW0oInAiKSBTdHJpbmcgcCwgQFBhdGhQYXJhbSgiYyIpIFN0cmluZyBjLAorICAgICAgICAgICAgICAgIEBRdWVyeVBhcmFtKCJhIikgaW50IGEsIEBRdWVyeVBhcmFtKCJiIikgaW50IGIpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygicGFyZW50IiwgcCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImZpcnN0IiwgYyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgYik7CisgICAgICAgICAgICByZXR1cm4gbmV3IENoaWxkV2l0aFRlbXBsYXRlcygpOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgodmFsdWUgPSAidW5tYXRjaGVkUGF0aC97cGF0aDogLip9IikKKyAgICAgICAgcHVibGljIFVubWF0Y2hlZFBhdGhSZXNvdXJjZSBnZXRVbm1hdGNoZWRQYXRoKAorICAgICAgICAgICAgICAgIEBQYXRoUGFyYW0oInAiKSBTdHJpbmcgcCwKKyAgICAgICAgICAgICAgICBAUGF0aFBhcmFtKCJwYXRoIikgU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygicGFyZW50IiwgcCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFVubWF0Y2hlZFBhdGhSZXNvdXJjZShwYXRoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2hpbGRXaXRoVGVtcGxhdGVzIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWUoQFBhdGhQYXJhbSgiYyIpIFN0cmluZyBjKSB7CisgICAgICAgICAgICByZXR1cm4gYzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVW5tYXRjaGVkUGF0aFJlc291cmNlIHsKKworICAgICAgICBTdHJpbmcgcGF0aDsKKworICAgICAgICBVbm1hdGNoZWRQYXRoUmVzb3VyY2UoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgICAgIHRoaXMucGF0aCA9IHBhdGg7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWUoKSB7CisgICAgICAgICAgICBpZiAocGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcGF0aCA9ICIiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHBhdGg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJSZXNvdXJjZUR5bmFtaWNXaXRoVGVtcGxhdGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFwcCA9IGNyZWF0ZUFwcGxpY2F0aW9uKFBhcmVudFdpdGhUZW1wbGF0ZXMuY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscygicGFyZW50IiwgYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvcGFyZW50IiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmaXJzdCIsCisgICAgICAgICAgICAgICAgYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvcGFyZW50L2NoaWxkL2ZpcnN0P2E9MSZiPTIiLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCkuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN1YlJlc291cmNlRHluYW1pY1dpdGhVbm1hdGNoZWRQYXRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFwcCA9IGNyZWF0ZUFwcGxpY2F0aW9uKFBhcmVudFdpdGhUZW1wbGF0ZXMuY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscygiIiwgYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvcGFyZW50L3VubWF0Y2hlZFBhdGgvIiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhL2IvYy9kIiwKKyAgICAgICAgICAgICAgICBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9wYXJlbnQvdW5tYXRjaGVkUGF0aC9hL2IvYy9kIiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpLmdldEVudGl0eSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9TdWJSZXNvdXJjZUh0dHBNZXRob2RzVGVzdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvU3ViUmVzb3VyY2VIdHRwTWV0aG9kc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTljNTNhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvU3ViUmVzb3VyY2VIdHRwTWV0aG9kc1Rlc3QuamF2YQpAQCAtMCwwICsxLDMyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWw7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVxdWVzdENvbnRleHRCdWlsZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUYWtlbiBmcm9tIEplcnNleS0xOiBqZXJzZXktdGVzdHM6Y29tLnN1bi5qZXJzZXkuaW1wbC5zdWJyZXNvdXJjZXMuU3ViUmVzb3VyY2VIdHRwTWV0aG9kc1Rlc3QKKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgU3ViUmVzb3VyY2VIdHRwTWV0aG9kc1Rlc3QgeworCisgICAgQXBwbGljYXRpb25IYW5kbGVyIGFwcDsKKworICAgIHByaXZhdGUgQXBwbGljYXRpb25IYW5kbGVyIGNyZWF0ZUFwcGxpY2F0aW9uKENsYXNzPD8+Li4uIGNsYXNzZXMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIobmV3IFJlc291cmNlQ29uZmlnKGNsYXNzZXMpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdWJSZXNvdXJjZU1ldGhvZHMgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRNZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAiLyI7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgic3ViIikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1lU3ViKCkgeworICAgICAgICAgICAgcmV0dXJuICIvc3ViIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJzdWIvc3ViIikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1lU3ViU3ViKCkgeworICAgICAgICAgICAgcmV0dXJuICIvc3ViL3N1YiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJSZXNvdXJjZU1ldGhvZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXBwID0gY3JlYXRlQXBwbGljYXRpb24oU3ViUmVzb3VyY2VNZXRob2RzLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIi8iLCBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8iLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCkuZ2V0RW50aXR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9zdWIiLCBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9zdWIiLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCkuZ2V0RW50aXR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9zdWIvc3ViIiwgYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvc3ViL3N1YiIsICJHRVQiKS5idWlsZCgpKS5nZXQoKS5nZXRFbnRpdHkoKSk7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3ViUmVzb3VyY2VNZXRob2RzV2l0aFRlbXBsYXRlcyB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1lKCkgeworICAgICAgICAgICAgcmV0dXJuICIvIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJzdWJ7dH0iKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVTdWIoQFBhdGhQYXJhbSgidCIpIFN0cmluZyB0KSB7CisgICAgICAgICAgICByZXR1cm4gdDsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJzdWIve3R9IikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1lU3ViU3ViKEBQYXRoUGFyYW0oInQiKSBTdHJpbmcgdCkgeworICAgICAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgic3VidW5saW1pdGVke3Q6IC4qfSIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRNZVN1YlVubGltaXRlZChAUGF0aFBhcmFtKCJ0IikgU3RyaW5nIHQpIHsKKyAgICAgICAgICAgIHJldHVybiB0OworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInN1YnVubGltaXRlZC97dDogLip9IikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1lU3ViU3ViVW5saW1pdGVkKEBQYXRoUGFyYW0oInQiKSBTdHJpbmcgdCkgeworICAgICAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJSZXNvdXJjZU1ldGhvZHNXaXRoVGVtcGxhdGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFwcCA9IGNyZWF0ZUFwcGxpY2F0aW9uKFN1YlJlc291cmNlTWV0aG9kc1dpdGhUZW1wbGF0ZXMuY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscygiLyIsIGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLyIsICJHRVQiKS5idWlsZCgpKS5nZXQoKS5nZXRFbnRpdHkoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZSIsIGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3N1YnZhbHVlIiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvc3ViL2EiLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCkuZ2V0RW50aXR5KCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygidmFsdWUvYSIsIGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3N1YnVubGltaXRlZHZhbHVlL2EiLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCkuZ2V0RW50aXR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEvYi9jL2QiLCBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9zdWJ1bmxpbWl0ZWQvYS9iL2MvZCIsICJHRVQiKS5idWlsZCgpKS5nZXQoKS5nZXRFbnRpdHkoKSk7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3ViUmVzb3VyY2VNZXRob2RzV2l0aERpZmZlcmVudFRlbXBsYXRlcyB7CisKKyAgICAgICAgQFBhdGgoIntmb299IikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEZvbyhAUGF0aFBhcmFtKCJmb28iKSBTdHJpbmcgZm9vKSB7CisgICAgICAgICAgICByZXR1cm4gZm9vOworICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETzogd2FzIGJhciBpbiB0aGUgQFBhdGggYW5kIEBQYXRoUGFyYW0gYW5ub3RhdGlvbnMgYmVsb3csIHNoYWxsIGl0IHdvcms/CisgICAgICAgIC8vICAgICAgICBAUGF0aCgie2Jhcn0iKQorICAgICAgICBAUGF0aCgie2Zvb30iKQorICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3RCYXIoQFBhdGhQYXJhbSgiZm9vIikgU3RyaW5nIGJhcikgeworICAgICAgICAgICAgcmV0dXJuIGJhcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN1YlJlc291cmNlTWV0aG9kc1dpdGhEaWZmZXJlbnRUZW1wbGF0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXBwID0gY3JlYXRlQXBwbGljYXRpb24oU3ViUmVzb3VyY2VNZXRob2RzV2l0aERpZmZlcmVudFRlbXBsYXRlcy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9mb28iLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCkuZ2V0RW50aXR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImJhciIsIGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL2JhciIsICJQT1NUIikuYnVpbGQoKSkuZ2V0KCkuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBQYXRoKCIve3B9LyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdWJSZXNvdXJjZU1ldGhvZFdpdGhMaW1pdGVkVGVtcGxhdGUgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRNZShAUGF0aFBhcmFtKCJwIikgU3RyaW5nIHAsIEBRdWVyeVBhcmFtKCJpZCIpIFN0cmluZyBpZCkgeworICAgICAgICAgICAgcmV0dXJuIHAgKyBpZDsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIntpZDogLip9IikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRVbm1hdGNoZWRQYXRoKAorICAgICAgICAgICAgICAgIEBQYXRoUGFyYW0oInAiKSBTdHJpbmcgcCwKKyAgICAgICAgICAgICAgICBAUGF0aFBhcmFtKCJpZCIpIFN0cmluZyBwYXRoKSB7CisgICAgICAgICAgICByZXR1cm4gcGF0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN1YlJlc291cmNlTWV0aG9kV2l0aExpbWl0ZWRUZW1wbGF0ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhcHAgPSBjcmVhdGVBcHBsaWNhdGlvbihTdWJSZXNvdXJjZU1ldGhvZFdpdGhMaW1pdGVkVGVtcGxhdGUuY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscygidG9wb25lIiwgYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvdG9wLz9pZD1vbmUiLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCkuZ2V0RW50aXR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEvYi9jL2QiLCBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi90b3AvYS9iL2MvZCIsICJHRVQiKS5idWlsZCgpKS5nZXQoKS5nZXRFbnRpdHkoKSk7CisgICAgfQorCisgICAgQFBhdGgoIi97cH0iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3ViUmVzb3VyY2VOb1NsYXNoTWV0aG9kV2l0aExpbWl0ZWRUZW1wbGF0ZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1lKEBQYXRoUGFyYW0oInAiKSBTdHJpbmcgcCwgQFF1ZXJ5UGFyYW0oImlkIikgU3RyaW5nIGlkKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oaWQpOworICAgICAgICAgICAgcmV0dXJuIHAgKyBpZDsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgodmFsdWUgPSAie2lkOiAuKn0iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFVubWF0Y2hlZFBhdGgoCisgICAgICAgICAgICAgICAgQFBhdGhQYXJhbSgicCIpIFN0cmluZyBwLAorICAgICAgICAgICAgICAgIEBQYXRoUGFyYW0oImlkIikgU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgICAgIHJldHVybiBwYXRoOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3ViUmVzb3VyY2VOb1NsYXNoTWV0aG9kV2l0aExpbWl0ZWRUZW1wbGF0ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhcHAgPSBjcmVhdGVBcHBsaWNhdGlvbihTdWJSZXNvdXJjZU5vU2xhc2hNZXRob2RXaXRoTGltaXRlZFRlbXBsYXRlLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoInRvcG9uZSIsIGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3RvcD9pZD1vbmUiLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCkuZ2V0RW50aXR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEvYi9jL2QiLCBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi90b3AvYS9iL2MvZCIsICJHRVQiKS5idWlsZCgpKS5nZXQoKS5nZXRFbnRpdHkoKSk7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3ViUmVzb3VyY2VXaXRoU2FtZVRlbXBsYXRlIHsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN1YlJlc291cmNlIHsKKworICAgICAgICAgICAgQEdFVAorICAgICAgICAgICAgQFBhdGgoImJhciIpCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIkJBUiI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJmb28iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiRk9PIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJmb28iKQorICAgICAgICBwdWJsaWMgU3ViUmVzb3VyY2UgZ2V0VW5tYXRjaGVkUGF0aCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3ViUmVzb3VyY2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN1YlJlc291cmNlTWV0aG9kV2l0aFNhbWVUZW1wbGF0ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhcHAgPSBjcmVhdGVBcHBsaWNhdGlvbihTdWJSZXNvdXJjZVdpdGhTYW1lVGVtcGxhdGUuY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscygiRk9PIiwgYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvZm9vIiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJCQVIiLCBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9mb28vYmFyIiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdWJSZXNvdXJjZUV4cGxpY2l0UmVnZXggeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIntpZH0iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFNlZ21lbnQoQFBhdGhQYXJhbSgiaWQiKSBTdHJpbmcgaWQpIHsKKyAgICAgICAgICAgIHJldHVybiAic2VnbWVudDogIiArIGlkOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgie2lkOiAuK30iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFNlZ21lbnRzKEBQYXRoUGFyYW0oImlkIikgU3RyaW5nIGlkKSB7CisgICAgICAgICAgICByZXR1cm4gInNlZ21lbnRzOiAiICsgaWQ7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJkaWdpdC97aWQ6IFxcZCt9IikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXREaWdpdChAUGF0aFBhcmFtKCJpZCIpIGludCBpZCkgeworICAgICAgICAgICAgcmV0dXJuICJkaWdpdDogIiArIGlkOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiZGlnaXQve2lkfSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGlnaXRBbnl0aGluZyhAUGF0aFBhcmFtKCJpZCIpIFN0cmluZyBpZCkgeworICAgICAgICAgICAgcmV0dXJuICJhbnl0aGluZzogIiArIGlkOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3ViUmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXBwID0gY3JlYXRlQXBwbGljYXRpb24oU3ViUmVzb3VyY2VFeHBsaWNpdFJlZ2V4LmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoInNlZ21lbnRzOiBmb28iLCBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9mb28iLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCkuZ2V0RW50aXR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInNlZ21lbnRzOiBmb28vYmFyIiwgYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvZm9vL2JhciIsICJHRVQiKS5idWlsZCgpKS5nZXQoKS5nZXRFbnRpdHkoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkaWdpdDogMTIzIiwgYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvZGlnaXQvMTIzIiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhbnl0aGluZzogZm9vIiwgYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvZGlnaXQvZm9vIiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdWJSZXNvdXJjZUV4cGxpY2l0UmVnZXhDYXB0dXJpbmdHcm91cHMgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInthOiAoXFxkKShcXGQqKX0iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFNpbmdsZShAUGF0aFBhcmFtKCJhIikgaW50IGEpIHsKKyAgICAgICAgICAgIHJldHVybiAiIiArIGE7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJ7YTogKFxcZCkoXFxkKil9LXtiOiAoXFxkKShcXGQqKX0te2M6IChcXGQpKFxcZCopfSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TXVsdGlwbGUoCisgICAgICAgICAgICAgICAgQFBhdGhQYXJhbSgiYSIpIGludCBhLAorICAgICAgICAgICAgICAgIEBQYXRoUGFyYW0oImIiKSBpbnQgYiwKKyAgICAgICAgICAgICAgICBAUGF0aFBhcmFtKCJjIikgaW50IGMpIHsKKyAgICAgICAgICAgIHJldHVybiAiIiArIGEgKyAiLSIgKyBiICsgIi0iICsgYzsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN1YlJlc291cmNlQ2FwdHVyaW5nR3JvdXBzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFwcCA9IGNyZWF0ZUFwcGxpY2F0aW9uKFN1YlJlc291cmNlRXhwbGljaXRSZWdleENhcHR1cmluZ0dyb3Vwcy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxMjMiLCBhcHAuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi8xMjMiLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCkuZ2V0RW50aXR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEyMy00NTYtNzg5IiwgYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvMTIzLTQ1Ni03ODkiLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCkuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN1YlJlc291cmNlWFhYIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJ7aWR9L2xpdGVyYWwiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFNlZ21lbnQoQFBhdGhQYXJhbSgiaWQiKSBTdHJpbmcgaWQpIHsKKyAgICAgICAgICAgIHJldHVybiBpZDsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIntpZDF9L3tpZDJ9L3tpZDN9IikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRTZWdtZW50cygKKyAgICAgICAgICAgICAgICBAUGF0aFBhcmFtKCJpZDEiKSBTdHJpbmcgaWQxLAorICAgICAgICAgICAgICAgIEBQYXRoUGFyYW0oImlkMiIpIFN0cmluZyBpZDIsCisgICAgICAgICAgICAgICAgQFBhdGhQYXJhbSgiaWQzIikgU3RyaW5nIGlkMykgeworICAgICAgICAgICAgcmV0dXJuIGlkMSArIGlkMiArIGlkMzsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN1YlJlc291cmNlWFhYKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFwcCA9IGNyZWF0ZUFwcGxpY2F0aW9uKFN1YlJlc291cmNlWFhYLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIjEyMyIsIGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiLzEyMy9saXRlcmFsIiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxMjNsaXRlcmFsNzg5IiwgYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvMTIzL2xpdGVyYWwvNzg5IiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpLmdldEVudGl0eSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9TdWJSZXNvdXJjZU51bGxUZXN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9TdWJSZXNvdXJjZU51bGxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE5MzhkZgotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL1N1YlJlc291cmNlTnVsbFRlc3QuamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlcXVlc3RDb250ZXh0QnVpbGRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGFrZW4gZnJvbSBKZXJzZXktMTogamVyc2V5LXRlc3RzOmNvbS5zdW4uamVyc2V5LmltcGwuc3VicmVzb3VyY2VzLlN1YlJlc291cmNlTnVsbFRlc3QKKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgU3ViUmVzb3VyY2VOdWxsVGVzdCB7CisKKyAgICBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwOworCisgICAgcHJpdmF0ZSBBcHBsaWNhdGlvbkhhbmRsZXIgY3JlYXRlQXBwbGljYXRpb24oQ2xhc3M8Pz4uLi4gY2xhc3NlcykgeworICAgICAgICByZXR1cm4gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihuZXcgUmVzb3VyY2VDb25maWcoY2xhc3NlcykpOworICAgIH0KKworICAgIEBQYXRoKCIvcGFyZW50IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhcmVudCB7CisKKyAgICAgICAgQFBhdGgoIntjaGlsZH0iKQorICAgICAgICBwdWJsaWMgQ2hpbGQgZ2V0Q2hpbGQoQFBhdGhQYXJhbSgiY2hpbGQiKSBib29sZWFuIGNoaWxkKSB7CisgICAgICAgICAgICBpZiAoY2hpbGQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENoaWxkKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDaGlsZCB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1lKCkgeworICAgICAgICAgICAgcmV0dXJuICJjaGlsZCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJSZXNvdXJjZU51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXBwID0gY3JlYXRlQXBwbGljYXRpb24oUGFyZW50LmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImNoaWxkIiwgYXBwLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKCIvcGFyZW50L3RydWUiLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCkuZ2V0RW50aXR5KCkpOworCisgICAgICAgIGFzc2VydEVxdWFscyg0MDQsIGFwcC5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3BhcmVudC9mYWxzZSIsICJHRVQiKS5idWlsZCgpKS5nZXQoKS5nZXRTdGF0dXMoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvU3ViUmVzb3VyY2VQcm9ncmFtbWF0aWNUZXN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9TdWJSZXNvdXJjZVByb2dyYW1tYXRpY1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjZkZmJlCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvU3ViUmVzb3VyY2VQcm9ncmFtbWF0aWNUZXN0LmphdmEKQEAgLTAsMCArMSwyOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuSW5mbGVjdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXF1ZXN0Q29udGV4dEJ1aWxkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICogVGVzdCBzdWIgcmVzb3VyY2UgbG9jYXRvcnMgcmV0dXJuaW5nIHtAbGluayBSZXNvdXJjZSBwcm9ncmFtbWF0aWMgcmVzb3VyY2VzfS4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKgorICovCitwdWJsaWMgY2xhc3MgU3ViUmVzb3VyY2VQcm9ncmFtbWF0aWNUZXN0IHsKKworICAgIEBQYXRoKCJyb290IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJvb3RSZXNvdXJjZSB7CisKKyAgICAgICAgQFBhdGgoImxvY2F0b3IiKQorICAgICAgICBwdWJsaWMgUmVzb3VyY2Ugc3ViUmVzb3VyY2VMb2NhdG9yKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldFJlc291cmNlKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFJlc291cmNlIGdldFJlc291cmNlKCkgeworICAgICAgICAgICAgZmluYWwgUmVzb3VyY2UuQnVpbGRlciBidWlsZGVyID0gUmVzb3VyY2UuYnVpbGRlcigpOworICAgICAgICAgICAgYnVpbGRlci5hZGRNZXRob2QoIkdFVCIpLnByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpLmhhbmRsZWRCeSgKKyAgICAgICAgICAgICAgICAgICAgbmV3IEluZmxlY3RvcjxDb250YWluZXJSZXF1ZXN0Q29udGV4dCwgU3RyaW5nPigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBhcHBseShDb250YWluZXJSZXF1ZXN0Q29udGV4dCBjb250YWluZXJSZXF1ZXN0Q29udGV4dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW5mbGVjdG9yIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInNpbmdsZXRvbiIpCisgICAgICAgIHB1YmxpYyBSZXNvdXJjZSBzdWJSZXNvdXJjZVNpbmdsZXRvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNvdXJjZS5mcm9tKFNpbmdsZXRvblJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJzdGFuZGFyZCIpCisgICAgICAgIHB1YmxpYyBSZXNvdXJjZSBzdWJSZXNvdXJjZVN0YW5kYXJkKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc291cmNlLmZyb20oU3RhbmRhcmRSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgic3RhbmRhcmQtaW5zdGFuY2UiKQorICAgICAgICBwdWJsaWMgU3RhbmRhcmRSZXNvdXJjZSBzdWJSZXNvdXJjZVN0YW5kYXJkSW5zdGFuY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0YW5kYXJkUmVzb3VyY2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJjb21wbGV4IikKKyAgICAgICAgcHVibGljIFJlc291cmNlIGNvbXBsZXhTdWJSZXNvdXJjZSgpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24geworICAgICAgICAgICAgUmVzb3VyY2UuQnVpbGRlciBidWlsZGVyID0gUmVzb3VyY2UuYnVpbGRlcigpOworICAgICAgICAgICAgYnVpbGRlci5hZGRDaGlsZFJlc291cmNlKCJzaW5nbGV0b24tbWV0aG9kIikuYWRkTWV0aG9kKCJHRVQiKS5oYW5kbGVkQnkoU2luZ2xldG9uUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgIFNpbmdsZXRvblJlc291cmNlLmNsYXNzLmdldERlY2xhcmVkTWV0aG9kKCJnZXRDb3VudGVyIikpOworCisgICAgICAgICAgICBidWlsZGVyLmFkZENoaWxkUmVzb3VyY2UoUmVzb3VyY2UuZnJvbShTaW5nbGV0b25DaGlsZC5jbGFzcykpOworICAgICAgICAgICAgYnVpbGRlci5hZGRDaGlsZFJlc291cmNlKFJlc291cmNlLmZyb20oU3RhbmRhcmRDaGlsZC5jbGFzcykpOworICAgICAgICAgICAgYnVpbGRlci5hZGRNZXRob2QoIkdFVCIpLnByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpLmhhbmRsZWRCeSgKKyAgICAgICAgICAgICAgICAgICAgbmV3IEluZmxlY3RvcjxDb250YWluZXJSZXF1ZXN0Q29udGV4dCwgU3RyaW5nPigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBhcHBseShDb250YWluZXJSZXF1ZXN0Q29udGV4dCBjb250YWluZXJSZXF1ZXN0Q29udGV4dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiaW5mbGVjdG9yIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFNpbmdsZXRvbgorICAgIEBQYXRoKCJyb290LXNpbmdsZXRvbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTaW5nbGV0b25SZXNvdXJjZSB7CisKKyAgICAgICAgaW50IGNvdW50ZXIgPSAwOworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb3VudGVyKCkgeworICAgICAgICAgICAgcmV0dXJuICJzaW5nbGV0b246IiArIGNvdW50ZXIrKzsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJpdGVyYXRpb24iKQorICAgICAgICBwdWJsaWMgUmVzb3VyY2Ugc3ViUmVzb3VyY2VTaW5nbGV0b24oKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzb3VyY2UuZnJvbShTaW5nbGV0b25SZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiaXRlcmF0aW9uLWNsYXNzIikKKyAgICAgICAgcHVibGljIENsYXNzPFNpbmdsZXRvblJlc291cmNlPiBzdWJSZXNvdXJjZVNpbmdsZXRvbkNsYXNzKCkgeworICAgICAgICAgICAgcmV0dXJuIFNpbmdsZXRvblJlc291cmNlLmNsYXNzOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoIml0ZXJhdGlvbi1pbnN0YW5jZSIpCisgICAgICAgIHB1YmxpYyBTaW5nbGV0b25SZXNvdXJjZSBzdWJSZXNvdXJjZVNpbmdsZXRvbkluc3RhbmNlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTaW5nbGV0b25SZXNvdXJjZSgpOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoIml0ZXJhdGlvbi1zdGFuZGFyZCIpCisgICAgICAgIHB1YmxpYyBSZXNvdXJjZSBzdWJSZXNvdXJjZVN0YW5kYXJkKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc291cmNlLmZyb20oU3RhbmRhcmRSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicm9vdC1zdGFuZGFyZCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdGFuZGFyZFJlc291cmNlIHsKKworICAgICAgICBpbnQgY291bnRlciA9IDA7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvdW50ZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gInN0YW5kYXJkOiIgKyBjb3VudGVyKys7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiaXRlcmF0aW9uIikKKyAgICAgICAgcHVibGljIFJlc291cmNlIHN1YlJlc291cmNlU3RhbmRhcmQoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzb3VyY2UuZnJvbShTdGFuZGFyZFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJpdGVyYXRpb24tc2luZ2xldG9uIikKKyAgICAgICAgcHVibGljIFJlc291cmNlIHN1YlJlc291cmNlU2luZ2xldG9uKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc291cmNlLmZyb20oU2luZ2xldG9uUmVzb3VyY2UuY2xhc3MpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAUGF0aCgic2luZ2xldG9uIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNpbmdsZXRvbkNoaWxkIHsKKworICAgICAgICBAUGF0aCgiLyIpCisgICAgICAgIHB1YmxpYyBSZXNvdXJjZSBsb2NhdG9yKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc291cmNlLmZyb20oU2luZ2xldG9uUmVzb3VyY2UuY2xhc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInN0YW5kYXJkIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN0YW5kYXJkQ2hpbGQgeworCisgICAgICAgIEBQYXRoKCIvIikKKyAgICAgICAgcHVibGljIFJlc291cmNlIGxvY2F0b3IoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzb3VyY2UuZnJvbShTdGFuZGFyZFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluZmxlY3RvckJhc2VkKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBBcHBsaWNhdGlvbkhhbmRsZXIgaGFuZGxlciA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIobmV3IFJlc291cmNlQ29uZmlnKFJvb3RSZXNvdXJjZS5jbGFzcykpOworICAgICAgICBfdGVzdChoYW5kbGVyLCAiL3Jvb3QvbG9jYXRvciIsICJpbmZsZWN0b3IiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGV0b24oKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIEFwcGxpY2F0aW9uSGFuZGxlciBoYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihuZXcgUmVzb3VyY2VDb25maWcoUm9vdFJlc291cmNlLmNsYXNzKSk7CisgICAgICAgIF90ZXN0KGhhbmRsZXIsICIvcm9vdC9zaW5nbGV0b24iLCAic2luZ2xldG9uOjAiKTsKKyAgICAgICAgX3Rlc3QoaGFuZGxlciwgIi9yb290L3NpbmdsZXRvbiIsICJzaW5nbGV0b246MSIpOworICAgICAgICBfdGVzdChoYW5kbGVyLCAiL3Jvb3Qvc2luZ2xldG9uL2l0ZXJhdGlvbiIsICJzaW5nbGV0b246MiIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZXRvbjIoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIEFwcGxpY2F0aW9uSGFuZGxlciBoYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihuZXcgUmVzb3VyY2VDb25maWcoUm9vdFJlc291cmNlLmNsYXNzLCBTaW5nbGV0b25SZXNvdXJjZS5jbGFzcykpOworICAgICAgICBfdGVzdChoYW5kbGVyLCAiL3Jvb3Qtc2luZ2xldG9uIiwgInNpbmdsZXRvbjowIik7CisgICAgICAgIF90ZXN0KGhhbmRsZXIsICIvcm9vdC9zaW5nbGV0b24iLCAic2luZ2xldG9uOjEiKTsKKyAgICAgICAgX3Rlc3QoaGFuZGxlciwgIi9yb290L3NpbmdsZXRvbi9pdGVyYXRpb24iLCAic2luZ2xldG9uOjIiKTsKKyAgICAgICAgX3Rlc3QoaGFuZGxlciwgIi9yb290LXNpbmdsZXRvbi9pdGVyYXRpb24iLCAic2luZ2xldG9uOjMiKTsKKyAgICAgICAgX3Rlc3QoaGFuZGxlciwgIi9yb290LXNpbmdsZXRvbi9pdGVyYXRpb24tY2xhc3MiLCAic2luZ2xldG9uOjQiKTsKKyAgICAgICAgX3Rlc3QoaGFuZGxlciwgIi9yb290LXNpbmdsZXRvbi9pdGVyYXRpb24taW5zdGFuY2UiLCAic2luZ2xldG9uOjAiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGFuZGFyZCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgQXBwbGljYXRpb25IYW5kbGVyIGhhbmRsZXIgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKG5ldyBSZXNvdXJjZUNvbmZpZyhSb290UmVzb3VyY2UuY2xhc3MsIFN0YW5kYXJkUmVzb3VyY2UuY2xhc3MpKTsKKyAgICAgICAgX3Rlc3QoaGFuZGxlciwgIi9yb290LXN0YW5kYXJkIiwgInN0YW5kYXJkOjAiKTsKKyAgICAgICAgX3Rlc3QoaGFuZGxlciwgIi9yb290L3N0YW5kYXJkIiwgInN0YW5kYXJkOjAiKTsKKyAgICAgICAgX3Rlc3QoaGFuZGxlciwgIi9yb290L3N0YW5kYXJkL2l0ZXJhdGlvbiIsICJzdGFuZGFyZDowIik7CisgICAgICAgIF90ZXN0KGhhbmRsZXIsICIvcm9vdC1zdGFuZGFyZC9pdGVyYXRpb24iLCAic3RhbmRhcmQ6MCIpOworICAgICAgICBfdGVzdChoYW5kbGVyLCAiL3Jvb3Qvc3RhbmRhcmQtaW5zdGFuY2UiLCAic3RhbmRhcmQ6MCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbXBsZXgoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIEFwcGxpY2F0aW9uSGFuZGxlciBoYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihuZXcgUmVzb3VyY2VDb25maWcoUm9vdFJlc291cmNlLmNsYXNzKSk7CisgICAgICAgIGludCBzaW5nbGV0b25Db3VudGVyID0gMDsKKyAgICAgICAgX3Rlc3QoaGFuZGxlciwgIi9yb290L2NvbXBsZXgvIiwgImluZmxlY3RvciIpOworICAgICAgICBfdGVzdChoYW5kbGVyLCAiL3Jvb3QvY29tcGxleC9zaW5nbGV0b24iLCAic2luZ2xldG9uOiIgKyBzaW5nbGV0b25Db3VudGVyKyspOworICAgICAgICBfdGVzdChoYW5kbGVyLCAiL3Jvb3QvY29tcGxleC9zaW5nbGV0b24vaXRlcmF0aW9uIiwgInNpbmdsZXRvbjoiICsgc2luZ2xldG9uQ291bnRlcisrKTsKKyAgICAgICAgX3Rlc3QoaGFuZGxlciwgIi9yb290L2NvbXBsZXgvc2luZ2xldG9uL2l0ZXJhdGlvbi9pdGVyYXRpb24iLCAic2luZ2xldG9uOiIgKyBzaW5nbGV0b25Db3VudGVyKyspOworICAgICAgICBfdGVzdChoYW5kbGVyLCAiL3Jvb3QvY29tcGxleC9zaW5nbGV0b24vaXRlcmF0aW9uLWNsYXNzIiwgInNpbmdsZXRvbjoiICsgc2luZ2xldG9uQ291bnRlcisrKTsKKyAgICAgICAgX3Rlc3QoaGFuZGxlciwgIi9yb290L2NvbXBsZXgvc2luZ2xldG9uL2l0ZXJhdGlvbi1pbnN0YW5jZSIsICJzaW5nbGV0b246MCIpOworICAgICAgICBfdGVzdChoYW5kbGVyLCAiL3Jvb3QvY29tcGxleC9zdGFuZGFyZCIsICJzdGFuZGFyZDowIik7CisgICAgICAgIF90ZXN0KGhhbmRsZXIsICIvcm9vdC9jb21wbGV4L3N0YW5kYXJkL2l0ZXJhdGlvbiIsICJzdGFuZGFyZDowIik7CisgICAgICAgIF90ZXN0KGhhbmRsZXIsICIvcm9vdC9jb21wbGV4L3NpbmdsZXRvbi1tZXRob2QvIiwgInNpbmdsZXRvbjoiICsgc2luZ2xldG9uQ291bnRlcisrKTsKKworICAgICAgICBfdGVzdChoYW5kbGVyLCAiL3Jvb3QvY29tcGxleC9zaW5nbGV0b24vaXRlcmF0aW9uL2l0ZXJhdGlvbi1zdGFuZGFyZCIsICJzdGFuZGFyZDowIik7CisgICAgICAgIF90ZXN0KGhhbmRsZXIsICIvcm9vdC9jb21wbGV4L3N0YW5kYXJkL2l0ZXJhdGlvbi9pdGVyYXRpb24tc2luZ2xldG9uIiwgInNpbmdsZXRvbjoiICsgc2luZ2xldG9uQ291bnRlcisrKTsKKyAgICAgICAgX3Rlc3QoaGFuZGxlciwgIi9yb290L2NvbXBsZXgvc3RhbmRhcmQvaXRlcmF0aW9uL2l0ZXJhdGlvbi1zaW5nbGV0b24vaXRlcmF0aW9uL2l0ZXJhdGlvbi1zdGFuZGFyZCIsICJzdGFuZGFyZDowIik7CisgICAgICAgIF90ZXN0KGhhbmRsZXIsICIvcm9vdC9jb21wbGV4L3N0YW5kYXJkL2l0ZXJhdGlvbi9pdGVyYXRpb24tc2luZ2xldG9uL2l0ZXJhdGlvbi9pdGVyYXRpb24tc3RhbmRhcmQvaXRlcmF0aW9uIiwKKyAgICAgICAgICAgICAgICAic3RhbmRhcmQ6MCIpOworICAgICAgICBfdGVzdChoYW5kbGVyLCAiL3Jvb3QvY29tcGxleC9zdGFuZGFyZC9pdGVyYXRpb24vaXRlcmF0aW9uLXNpbmdsZXRvbi9pdGVyYXRpb24vaXRlcmF0aW9uLXN0YW5kYXJkL2l0ZXJhdGlvbiIKKyAgICAgICAgICAgICAgICArICIvaXRlcmF0aW9uLXNpbmdsZXRvbi9pdGVyYXRpb24tY2xhc3MiLCAic2luZ2xldG9uOiIgKyBzaW5nbGV0b25Db3VudGVyKyspOworICAgICAgICBfdGVzdChoYW5kbGVyLCAiL3Jvb3QvY29tcGxleC9zdGFuZGFyZC9pdGVyYXRpb24vaXRlcmF0aW9uLXNpbmdsZXRvbi9pdGVyYXRpb24vaXRlcmF0aW9uLXN0YW5kYXJkL2l0ZXJhdGlvbiIKKyAgICAgICAgICAgICAgICArICIvaXRlcmF0aW9uLXNpbmdsZXRvbi9pdGVyYXRpb24tY2xhc3MvaXRlcmF0aW9uLWluc3RhbmNlIiwgInNpbmdsZXRvbjowIik7CisgICAgICAgIF90ZXN0KGhhbmRsZXIsICIvcm9vdC9jb21wbGV4L3N0YW5kYXJkL2l0ZXJhdGlvbi9pdGVyYXRpb24tc2luZ2xldG9uIiwgInNpbmdsZXRvbjoiICsgc2luZ2xldG9uQ291bnRlcisrKTsKKworICAgICAgICBfdGVzdChoYW5kbGVyLCAiL3Jvb3QvY29tcGxleC9zaW5nbGV0b24tbWV0aG9kLyIsICJzaW5nbGV0b246IiArIHNpbmdsZXRvbkNvdW50ZXIrKyk7CisgICAgICAgIF90ZXN0KGhhbmRsZXIsICIvcm9vdC9jb21wbGV4L3NpbmdsZXRvbiIsICJzaW5nbGV0b246IiArIHNpbmdsZXRvbkNvdW50ZXIrKyk7CisgICAgICAgIF90ZXN0KGhhbmRsZXIsICIvcm9vdC9jb21wbGV4IiwgImluZmxlY3RvciIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfdGVzdChBcHBsaWNhdGlvbkhhbmRsZXIgaGFuZGxlciwgU3RyaW5nIHJlcXVlc3RVcmksIFN0cmluZyBleHBlY3RlZCkKKyAgICAgICAgICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBoYW5kbGVyLmFwcGx5KFJlcXVlc3RDb250ZXh0QnVpbGRlci5mcm9tKHJlcXVlc3RVcmksICJHRVQiKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkU3ViUmVzb3VyY2UoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIEFwcGxpY2F0aW9uSGFuZGxlciBoYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihuZXcgUmVzb3VyY2VDb25maWcoV3JvbmdSZXNvdXJjZS5jbGFzcykpOworICAgICAgICBfdGVzdChoYW5kbGVyLCAiL3dyb25nIiwgIm9rIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGhhbmRsZXIuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi93cm9uZy9sb2NhdG9yIiwgIkdFVCIpLmJ1aWxkKCkpLmdldCgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDUwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIHRocm93IGV4Y2VwdGlvbiBjYXVzZWQgYnkgdmFsaWRhdGlvbiBlcnJvcnMgb2YgU3ViIFJlc291cmNlLiIpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgLy8gb2sgLSBTaG91bGQgdGhyb3cgZXhjZXB0aW9uIGNhdXNlZCBieSB2YWxpZGF0aW9uIGVycm9ycyBvZiBTdWIgUmVzb3VyY2UuCisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgid3JvbmciKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgV3JvbmdSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJvayI7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgibG9jYXRvciIpCisgICAgICAgIHB1YmxpYyBSZXNvdXJjZSBsb2NhdG9yKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc291cmNlLmZyb20oSW52YWxpZFN1YlJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEludmFsaWQgcmVzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbnZhbGlkU3ViUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldDEoKSB7CisgICAgICAgICAgICByZXR1cm4gImdldDEiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0MigpIHsKKyAgICAgICAgICAgIHJldHVybiAiZ2V0MiI7CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL1ZhbGlkYXRvclRlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsL1ZhbGlkYXRvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWY2ZmNhCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvVmFsaWRhdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTI3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkJlYW5QYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5Db29raWVQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5ERUxFVEU7CitpbXBvcnQgamF2YXgud3MucnMuRm9ybVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5IZWFkZXJQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5NYXRyaXhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBVVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Bc3luY1Jlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuU3VzcGVuZGVkOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5zc2UuU3NlRXZlbnRTaW5rOworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LlNldmVyaXR5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkJvb3RzdHJhcENvbmZpZ3VyYXRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5FcnJvcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LlBlckxvb2t1cDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlByb2R1Y2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuTWVzc2FnZUJvZHlGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXF1ZXN0Q29udGV4dEJ1aWxkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJCb290c3RyYXBCYWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlRlc3RDb25maWdDb25maWd1cmF0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLmluamVjdC5QYXJhbUV4dHJhY3RvckNvbmZpZ3VyYXRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuaW5qZWN0LlZhbHVlUGFyYW1Qcm92aWRlckNvbmZpZ3VyYXRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuaW50ZXJuYWwuTW9kZWxFcnJvcnM7CisKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBUYWtlbiBmcm9tIEplcnNleSAxOiBqZXJzZXktc2VydmVyOmNvbS5zdW4uamVyc2V5LnNlcnZlci5pbXBsLm1vZGVsYXBpLnZhbGlkYXRpb24uUmVzb3VyY2VNb2RlbFZhbGlkYXRvclRlc3QuamF2YQorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBWYWxpZGF0b3JUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFZhbGlkYXRvclRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIEBQYXRoKCJyb290Tm9uQW1iaWdDdG9ycyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0Um9vdFJlc291cmNlTm9uQW1iaWdDdG9ycyB7CisKKyAgICAgICAgLy8gVE9ETzogaG1tbSwgZXZlbiBpZiB0aGlzIGlzIG5vdCBhbWJpZ3VvdXMsIGl0IGlzIHN0cmFuZ2U7IHNoYWxsIHdlIHdhcm4sIHRoZSAxc3QgYW5kIHRoZSAybmQgY3RvciB3b24ndCBiZSB1c2VkPworICAgICAgICBwdWJsaWMgVGVzdFJvb3RSZXNvdXJjZU5vbkFtYmlnQ3RvcnMoQFF1ZXJ5UGFyYW0oInMiKSBTdHJpbmcgcykgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRlc3RSb290UmVzb3VyY2VOb25BbWJpZ0N0b3JzKEBRdWVyeVBhcmFtKCJuIikgaW50IG4pIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUZXN0Um9vdFJlc291cmNlTm9uQW1iaWdDdG9ycyhAUXVlcnlQYXJhbSgicyIpIFN0cmluZyBzLCBAUXVlcnlQYXJhbSgibiIpIGludCBuKSB7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SXQoKSB7CisgICAgICAgICAgICByZXR1cm4gIml0IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJvb3RSZXNvdXJjZU5vbkFtYmlnQ29uc3RydWN0b3JzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIExPR0dFUi5pbmZvKCJObyBpc3N1ZSBzaG91bGQgYmUgcmVwb3J0ZWQgaWYgbW9yZSBwdWJsaWMgY3RvcnMgZXhpc3RzIHdpdGggdGhlIHNhbWUgbnVtYmVyIG9mIHBhcmFtcywgIgorICAgICAgICAgICAgICAgICsgImJ1dCBhbm90aGVyIGp1c3Qgb25lIGlzIHByZXNlbnRlZCB3aXRoIG1vcmUgcGFyYW1zIGF0IGEgcm9vdCByZXNvdXJjZToiKTsKKyAgICAgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNvdXJjZS5idWlsZGVyKFRlc3RSb290UmVzb3VyY2VOb25BbWJpZ0N0b3JzLmNsYXNzKS5idWlsZCgpOworICAgICAgICBTZXJ2ZXJCb290c3RyYXBCYWcgc2VydmVyQmFnID0gaW5pdGlhbGl6ZUFwcGxpY2F0aW9uKCk7CisgICAgICAgIENvbXBvbmVudE1vZGVsVmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBDb21wb25lbnRNb2RlbFZhbGlkYXRvcigKKyAgICAgICAgICAgICAgICBzZXJ2ZXJCYWcuZ2V0VmFsdWVQYXJhbVByb3ZpZGVycygpLCBzZXJ2ZXJCYWcuZ2V0TWVzc2FnZUJvZHlXb3JrZXJzKCkpOworICAgICAgICB2YWxpZGF0b3IudmFsaWRhdGUocmVzb3VyY2UpOworICAgICAgICBhc3NlcnRUcnVlKHZhbGlkYXRvci5nZXRJc3N1ZUxpc3QoKS5pc0VtcHR5KCkpOworICAgIH0KKworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUJlYW5QYXJhbSB7CisgICAgICAgIEBIZWFkZXJQYXJhbSgiaCIpCisgICAgICAgIFN0cmluZyBoUGFyYW07CisgICAgfQorCisKKyAgICBAU2luZ2xldG9uCisgICAgQFBhdGgoInJvb3RTaW5nbGV0b24ve3B9IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RDYW50SW5qZWN0RmllbGRzRm9yU2luZ2xldG9uIHsKKworICAgICAgICBATWF0cml4UGFyYW0oIm0iKQorICAgICAgICBTdHJpbmcgbWF0cml4UGFyYW07CisgICAgICAgIEBRdWVyeVBhcmFtKCJxIikKKyAgICAgICAgU3RyaW5nIHF1ZXJ5UGFyYW07CisgICAgICAgIEBQYXRoUGFyYW0oInAiKQorICAgICAgICBTdHJpbmcgcFBhcmFtOworICAgICAgICBAQ29va2llUGFyYW0oImMiKQorICAgICAgICBTdHJpbmcgY1BhcmFtOworICAgICAgICBASGVhZGVyUGFyYW0oImgiKQorICAgICAgICBTdHJpbmcgaFBhcmFtOworICAgICAgICBAQmVhblBhcmFtCisgICAgICAgIE15QmVhblBhcmFtIGJlYW5QYXJhbTsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SXQoKSB7CisgICAgICAgICAgICByZXR1cm4gIml0IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIENoaWxkT2ZDb250YWluZXJSZXF1ZXN0RmlsdGVyIGV4dGVuZHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciB7CisgICAgfQorCisgICAgQFBhdGgoInJvb3RTaW5nbGV0b24ve3B9IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RDYW50SW5qZWN0RmllbGRzRm9yUHJvdmlkZXIgaW1wbGVtZW50cyBDaGlsZE9mQ29udGFpbmVyUmVxdWVzdEZpbHRlciB7CisKKyAgICAgICAgQE1hdHJpeFBhcmFtKCJtIikKKyAgICAgICAgU3RyaW5nIG1hdHJpeFBhcmFtOworICAgICAgICBAUXVlcnlQYXJhbSgicSIpCisgICAgICAgIFN0cmluZyBxdWVyeVBhcmFtOworICAgICAgICBAUGF0aFBhcmFtKCJwIikKKyAgICAgICAgU3RyaW5nIHBQYXJhbTsKKyAgICAgICAgQENvb2tpZVBhcmFtKCJjIikKKyAgICAgICAgU3RyaW5nIGNQYXJhbTsKKyAgICAgICAgQEhlYWRlclBhcmFtKCJoIikKKyAgICAgICAgU3RyaW5nIGhQYXJhbTsKKyAgICAgICAgQEJlYW5QYXJhbQorICAgICAgICBNeUJlYW5QYXJhbSBiZWFuUGFyYW07CisKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SXQoKSB7CisgICAgICAgICAgICByZXR1cm4gIml0IjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgY29udGFpbmVyUmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIEBTaW5nbGV0b24KKyAgICBAUGF0aCgicm9vdFNpbmdsZXRvbkNvbnN0cnVjdG9yQi97cH0iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdENhbnRJbmplY3RDb25zdHJ1Y3RvclBhcmFtc0ZvclNpbmdsZXRvbiB7CisgICAgICAgIHB1YmxpYyBUZXN0Q2FudEluamVjdENvbnN0cnVjdG9yUGFyYW1zRm9yU2luZ2xldG9uKCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRlc3RDYW50SW5qZWN0Q29uc3RydWN0b3JQYXJhbXNGb3JTaW5nbGV0b24oQFF1ZXJ5UGFyYW0oInEiKSBTdHJpbmcgcXVlcnlQYXJhbSkgeworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEl0KCkgeworICAgICAgICAgICAgcmV0dXJuICJpdCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAU2luZ2xldG9uCisgICAgQFBhdGgoInJvb3RTaW5nbGV0b25Db25zdHJ1Y3RvckIve3B9IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RDYW50SW5qZWN0TWV0aG9kUGFyYW1zRm9yU2luZ2xldG9uIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SXQoQFF1ZXJ5UGFyYW0oInEiKSBTdHJpbmcgcXVlcnlQYXJhbSkgeworICAgICAgICAgICAgcmV0dXJuICJpdCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAU2luZ2xldG9uCisgICAgQFBhdGgoInNzZUV2ZW50U2lua1dpdGhSZXR1cm5UeXBlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RTc2VFdmVudFNpbmtWYWxpZGF0aW9ucyB7CisgICAgICAgIEBQYXRoKCJub3RWb2lkIikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3NlRXZlbnRTaW5rIG5vblZvaWRSZXR1cm5UeXBlKEBDb250ZXh0IFNzZUV2ZW50U2luayBldmVudFNpbmspIHsKKyAgICAgICAgICAgIHJldHVybiBldmVudFNpbms7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgibXVsdGlwbGUiKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyB2b2lkIG11bHRpcGxlSW5qZWN0aW9uKEBDb250ZXh0IFNzZUV2ZW50U2luayBmaXJzdFNpbmssIEBDb250ZXh0IFNzZUV2ZW50U2luayBzZWNvbmRTaW5rKSB7CisgICAgICAgICAgICAvLyBkbyBub3RoaW5nCisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicm9vdFJlbGF4ZWRQYXJzZXIiKQorICAgIEBQcm9kdWNlcygiIGEvYiwgYy9kICIpCisgICAgQENvbnN1bWVzKHsiZS9mLGcvaCIsICIgaS9qIn0pCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0UmVsYXhlZFByb2R1Y2VzQ29uc3VtZXNQYXJzZXJSdWxlcyB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoeyJlL2YsZy9oIiwgIiBpL2oifSkKKyAgICAgICAgQENvbnN1bWVzKCIgYS9iLCBjL2QgIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRJdChAUXVlcnlQYXJhbSgicSIpIFN0cmluZyBxdWVyeVBhcmFtKSB7CisgICAgICAgICAgICByZXR1cm4gIml0IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlbGF4ZWRQcm9kdWNlc0NvbnN1bWVzUGFyc2VyUnVsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTE9HR0VSLmluZm8oIkFuIGlzc3VlIHNob3VsZCBub3QgYmUgcmVwb3J0ZWQgd2l0aCB0aGUgcmVsYXhlZCBQcm9kdWNlcy9Db25zdW1lcyB2YWx1ZXMgcGFyc2VyLiIpOworICAgICAgICBMaXN0PFJlc291cmNlTW9kZWxJc3N1ZT4gaXNzdWVzID0gdGVzdFJlc291cmNlVmFsaWRhdGlvbihUZXN0Q2FudEluamVjdE1ldGhvZFBhcmFtc0ZvclNpbmdsZXRvbi5jbGFzcyk7CisgICAgICAgIGFzc2VydFRydWUoaXNzdWVzLmlzRW1wdHkoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xldG9uRmllbGRzSW5qZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIExPR0dFUi5pbmZvKCJBbiBpc3N1ZSBzaG91bGQgYmUgcmVwb3J0ZWQgaWYgaW5qZWN0aW9uIGlzIHJlcXVpcmVkIGZvciBhIHNpbmdsZXRvbiBsaWZlLWN5Y2xlOiIpOworICAgICAgICBMaXN0PFJlc291cmNlTW9kZWxJc3N1ZT4gaXNzdWVzID0gdGVzdFJlc291cmNlVmFsaWRhdGlvbihUZXN0Q2FudEluamVjdEZpZWxkc0ZvclNpbmdsZXRvbi5jbGFzcyk7CisgICAgICAgIGFzc2VydFRydWUoIWlzc3Vlcy5pc0VtcHR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNiwgaXNzdWVzLnNpemUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FudFJldHVybkZyb21FdmVudFNpbmtJbmplY3RlZE1ldGhvZCgpIHsKKyAgICAgICAgTE9HR0VSLmluZm8oIkFuIGlzc3VlIHNob3VsZCBiZSByZXBvcnRlZCBpZiBtZXRob2Qgd2l0aCBpbmplY3RlZCBTc2VFdmVudFNpbmsgcGFyYW1ldGVyIGRvZXMgbm90IHJldHVybiB2b2lkLiIpOworICAgICAgICBmaW5hbCBMaXN0PFJlc291cmNlTW9kZWxJc3N1ZT4gaXNzdWVzID0gdGVzdFJlc291cmNlVmFsaWRhdGlvbihUZXN0U3NlRXZlbnRTaW5rVmFsaWRhdGlvbnMuY2xhc3MpOworICAgICAgICBhc3NlcnRUcnVlKCFpc3N1ZXMuaXNFbXB0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGlzc3Vlcy5zaXplKCkpOworICAgIH0KKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvdmlkZXJGaWVsZHNJbmplY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTE9HR0VSLmluZm8oIkFuIGlzc3VlIHNob3VsZCBiZSByZXBvcnRlZCBpZiBpbmplY3Rpb24gaXMgcmVxdWlyZWQgZm9yIGEgY2xhc3Mgd2hpY2ggaXMgcHJvdmlkZXIgYW5kICIKKyAgICAgICAgICAgICAgICArICJ0aGVyZWZvcmUgc2luZ2xldG9uOiIpOworICAgICAgICBMaXN0PFJlc291cmNlTW9kZWxJc3N1ZT4gaXNzdWVzID0gdGVzdFJlc291cmNlVmFsaWRhdGlvbihUZXN0Q2FudEluamVjdEZpZWxkc0ZvclByb3ZpZGVyLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghaXNzdWVzLmlzRW1wdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg3LCBpc3N1ZXMuc2l6ZSgpKTsKKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZXRvbkNvbnN0cnVjdG9yUGFyYW1zSW5qZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIExPR0dFUi5pbmZvKCJBbiBpc3N1ZSBzaG91bGQgYmUgcmVwb3J0ZWQgaWYgaW5qZWN0aW9uIGlzIHJlcXVpcmVkIGZvciBhIHNpbmdsZXRvbiBsaWZlLWN5Y2xlOiIpOworICAgICAgICBMaXN0PFJlc291cmNlTW9kZWxJc3N1ZT4gaXNzdWVzID0gdGVzdFJlc291cmNlVmFsaWRhdGlvbihUZXN0Q2FudEluamVjdENvbnN0cnVjdG9yUGFyYW1zRm9yU2luZ2xldG9uLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghaXNzdWVzLmlzRW1wdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBpc3N1ZXMuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGV0b25NZXRob2RQYXJhbXNJbmplY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTE9HR0VSLmluZm8oIkFuIGlzc3VlIHNob3VsZCBub3QgYmUgcmVwb3J0ZWQgYXMgaW5qZWN0aW9ucyBpbnRvIHRoZSBtZXRob2RzIGFyZSBhbGxvd2VkLiIpOworICAgICAgICBMaXN0PFJlc291cmNlTW9kZWxJc3N1ZT4gaXNzdWVzID0gdGVzdFJlc291cmNlVmFsaWRhdGlvbihUZXN0Q2FudEluamVjdE1ldGhvZFBhcmFtc0ZvclNpbmdsZXRvbi5jbGFzcyk7CisgICAgICAgIGFzc2VydFRydWUoaXNzdWVzLmlzRW1wdHkoKSk7CisgICAgfQorCisgICAgQFBhdGgoInJlc291cmNlQXNQcm92aWRlciIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZUFzUHJvdmlkZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiZ2V0IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBTaW5nbGV0b24KKyAgICBAUGVyTG9va3VwCisgICAgQFBhdGgoInJlc291cmNlTXVsdGlwbGVTY29wZXMiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VXaXRoTXVsdGlwbGVTY29wZXMgaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiZ2V0IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlQXNQcm92aWRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMT0dHRVIuaW5mbygiQW4gaXNzdWUgc2hvdWxkIGJlIHJlcG9ydGVkIGFzIHJlc291cmNlIGltcGxlbWVudHMgcHJvdmlkZXIgYnV0IGRvZXMgbm90IGRlZmluZSBzY29wZS4iKTsKKyAgICAgICAgTGlzdDxSZXNvdXJjZU1vZGVsSXNzdWU+IGlzc3VlcyA9IHRlc3RSZXNvdXJjZVZhbGlkYXRpb24oUmVzb3VyY2VBc1Byb3ZpZGVyLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGlzc3Vlcy5zaXplKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlV2l0aE11bHRpcGxlU2NvcGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIExPR0dFUi5pbmZvKCJBbiBpc3N1ZSBzaG91bGQgbm90IGJlIHJlcG9ydGVkIGFzIHJlc291cmNlIGRlZmluZXMgbXVsdGlwbGUgc2NvcGVzLiIpOworICAgICAgICBMaXN0PFJlc291cmNlTW9kZWxJc3N1ZT4gaXNzdWVzID0gdGVzdFJlc291cmNlVmFsaWRhdGlvbihSZXNvdXJjZVdpdGhNdWx0aXBsZVNjb3Blcy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBpc3N1ZXMuc2l6ZSgpKTsKKyAgICB9CisKKworICAgIHByaXZhdGUgTGlzdDxSZXNvdXJjZU1vZGVsSXNzdWU+IHRlc3RSZXNvdXJjZVZhbGlkYXRpb24oZmluYWwgQ2xhc3M8Pz4uLi4gcmVzb3VyY2VDbGFzc2VzKSB7CisgICAgICAgIHJldHVybiBFcnJvcnMucHJvY2VzcyhuZXcgUHJvZHVjZXI8TGlzdDxSZXNvdXJjZU1vZGVsSXNzdWU+PigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIExpc3Q8UmVzb3VyY2VNb2RlbElzc3VlPiBjYWxsKCkgeworICAgICAgICAgICAgICAgIExpc3Q8UmVzb3VyY2U+IHJlc291cmNlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgICAgIGZvciAoQ2xhc3M8Pz4gY2xhenogOiByZXNvdXJjZUNsYXNzZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVzb3VyY2UgcmVzID0gUmVzb3VyY2UuYnVpbGRlcihjbGF6eikuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5nZXRQYXRoKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLmFkZChyZXMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgUmVzb3VyY2VNb2RlbCBtb2RlbCA9IG5ldyBSZXNvdXJjZU1vZGVsLkJ1aWxkZXIocmVzb3VyY2VzLCBmYWxzZSkuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICBTZXJ2ZXJCb290c3RyYXBCYWcgc2VydmVyQmFnID0gaW5pdGlhbGl6ZUFwcGxpY2F0aW9uKCk7CisgICAgICAgICAgICAgICAgQ29tcG9uZW50TW9kZWxWYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IENvbXBvbmVudE1vZGVsVmFsaWRhdG9yKAorICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyQmFnLmdldFZhbHVlUGFyYW1Qcm92aWRlcnMoKSwgc2VydmVyQmFnLmdldE1lc3NhZ2VCb2R5V29ya2VycygpKTsKKyAgICAgICAgICAgICAgICB2YWxpZGF0b3IudmFsaWRhdGUobW9kZWwpOworICAgICAgICAgICAgICAgIHJldHVybiBNb2RlbEVycm9ycy5nZXRFcnJvcnNBc1Jlc291cmNlTW9kZWxJc3N1ZXMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3ROb25QdWJsaWNSTSB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyBwdWJsaWNQb3N0KCkgeworICAgICAgICAgICAgcmV0dXJuICJwdWJsaWMiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBwcml2YXRlIFN0cmluZyBwcml2YXRlR2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJwcml2YXRlIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vblB1YmxpY1JNKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIExPR0dFUi5pbmZvKCJBbiBpc3N1ZSBzaG91bGQgYmUgcmVwb3J0ZWQgaWYgYSByZXNvdXJjZSBtZXRob2QgaXMgbm90IHB1YmxpYzoiKTsKKworICAgICAgICBMaXN0PFJlc291cmNlTW9kZWxJc3N1ZT4gaXNzdWVzID0gdGVzdFJlc291cmNlVmFsaWRhdGlvbihUZXN0Tm9uUHVibGljUk0uY2xhc3MpOworICAgICAgICBhc3NlcnRUcnVlKCFpc3N1ZXMuaXNFbXB0eSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RNb3JlVGhhbk9uZUVudGl0eSB7CisKKyAgICAgICAgQFBVVAorICAgICAgICBwdWJsaWMgdm9pZCBwdXQoU3RyaW5nIG9uZSwgU3RyaW5nIHR3bykgeworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBASWdub3JlKCJNdWx0aXBsZSBlbnRpdHkgdmFsaWRhdGlvbiBub3QgaW1wbGVtZW50ZWQgeWV0LiIpCisgICAgLy8gVE9ETyBpbXBsZW1lbnQgdmFsaWRhdGlvbgorICAgIHB1YmxpYyB2b2lkIHN1c3BlbmRlZFRlc3RNb3JlVGhhbk9uZUVudGl0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMT0dHRVIuaW5mbygiQW4gaXNzdWUgc2hvdWxkIGJlIHJlcG9ydGVkIGlmIGEgcmVzb3VyY2UgbWV0aG9kIHRha2VzIG1vcmUgdGhhbiBvbmUgZW50aXR5IHBhcmFtczoiKTsKKyAgICAgICAgTGlzdDxSZXNvdXJjZU1vZGVsSXNzdWU+IGlzc3VlcyA9IHRlc3RSZXNvdXJjZVZhbGlkYXRpb24oVGVzdE1vcmVUaGFuT25lRW50aXR5LmNsYXNzKTsKKworICAgICAgICBhc3NlcnRUcnVlKCFpc3N1ZXMuaXNFbXB0eSgpKTsKKyAgICB9CisKKyAgICBAUGF0aCgidGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0R2V0Uk1SZXR1cm5pbmdWb2lkIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyB2b2lkIGdldE1ldGhvZCgpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFJNUmV0dXJuaW5nVm9pZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMT0dHRVIuaW5mbygiQW4gaXNzdWUgc2hvdWxkIGJlIHJlcG9ydGVkIGlmIGEgbm9uLWFzeW5jIGdldCBtZXRob2QgcmV0dXJucyB2b2lkOiIpOworICAgICAgICBMaXN0PFJlc291cmNlTW9kZWxJc3N1ZT4gaXNzdWVzID0gdGVzdFJlc291cmNlVmFsaWRhdGlvbihUZXN0R2V0Uk1SZXR1cm5pbmdWb2lkLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoaXNzdWVzLmlzRW1wdHkoKSk7CisgICAgICAgIGFzc2VydE5vdEVxdWFscyhTZXZlcml0eS5GQVRBTCwgaXNzdWVzLmdldCgwKS5nZXRTZXZlcml0eSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RBc3luY0dldFJNUmV0dXJuaW5nVm9pZCB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgdm9pZCBnZXRNZXRob2QoQFN1c3BlbmRlZCBBc3luY1Jlc3BvbnNlIGFyKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luY0dldFJNUmV0dXJuaW5nVm9pZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMT0dHRVIuaW5mbygiQW4gaXNzdWUgc2hvdWxkIE5PVCBiZSByZXBvcnRlZCBpZiBhIGFzeW5jIGdldCBtZXRob2QgcmV0dXJucyB2b2lkOiIpOworICAgICAgICBMaXN0PFJlc291cmNlTW9kZWxJc3N1ZT4gaXNzdWVzID0gdGVzdFJlc291cmNlVmFsaWRhdGlvbihUZXN0QXN5bmNHZXRSTVJldHVybmluZ1ZvaWQuY2xhc3MpOworICAgICAgICBhc3NlcnRUcnVlKGlzc3Vlcy5pc0VtcHR5KCkpOworICAgIH0KKworICAgIEBQYXRoKCJ0ZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RHZXRSTUNvbnN1bWluZ0VudGl0eSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1ldGhvZChPYmplY3QgbykgeworICAgICAgICAgICAgcmV0dXJuICJpdCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRSTUNvbnN1bWluZ0VudGl0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMT0dHRVIuaW5mbygiQW4gaXNzdWUgc2hvdWxkIGJlIHJlcG9ydGVkIGlmIGEgZ2V0IG1ldGhvZCBjb25zdW1lcyBhbiBlbnRpdHk6Iik7CisgICAgICAgIExpc3Q8UmVzb3VyY2VNb2RlbElzc3VlPiBpc3N1ZXMgPSB0ZXN0UmVzb3VyY2VWYWxpZGF0aW9uKFRlc3RHZXRSTUNvbnN1bWluZ0VudGl0eS5jbGFzcyk7CisgICAgICAgIGFzc2VydEZhbHNlKGlzc3Vlcy5pc0VtcHR5KCkpOworICAgICAgICBhc3NlcnROb3RFcXVhbHMoU2V2ZXJpdHkuRkFUQUwsIGlzc3Vlcy5nZXQoMCkuZ2V0U2V2ZXJpdHkoKSk7CisgICAgfQorCisgICAgQFBhdGgoInRlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdEdldFJNQ29uc3VtaW5nRm9ybVBhcmFtIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kKEBGb3JtUGFyYW0oImYiKSBTdHJpbmcgczEsIEBGb3JtUGFyYW0oImciKSBTdHJpbmcgczIpIHsKKyAgICAgICAgICAgIHJldHVybiAiaXQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Uk1Db25zdW1pbmdGb3JtUGFyYW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTE9HR0VSLmluZm8oIkFuIGlzc3VlIHNob3VsZCBiZSByZXBvcnRlZCBpZiBhIGdldCBtZXRob2QgY29uc3VtZXMgYSBmb3JtIHBhcmFtOiIpOworICAgICAgICBMaXN0PFJlc291cmNlTW9kZWxJc3N1ZT4gaXNzdWVzID0gdGVzdFJlc291cmNlVmFsaWRhdGlvbihUZXN0R2V0Uk1Db25zdW1pbmdGb3JtUGFyYW0uY2xhc3MpOworICAgICAgICBhc3NlcnRUcnVlKGlzc3Vlcy5zaXplKCkgPT0gMSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTZXZlcml0eS5GQVRBTCwgaXNzdWVzLmdldCgwKS5nZXRTZXZlcml0eSgpKTsKKyAgICB9CisKKyAgICBAUGF0aCgidGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0U1JMUmV0dXJuaW5nVm9pZCB7CisKKyAgICAgICAgQFBhdGgoInNybCIpCisgICAgICAgIHB1YmxpYyB2b2lkIHNyTG9jYXRvcigpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNSTFJldHVybmluZ1ZvaWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTE9HR0VSLmluZm8oIkFuIGlzc3VlIHNob3VsZCBiZSByZXBvcnRlZCBpZiBhIHN1Yi1yZXNvdXJjZSBsb2NhdG9yIHJldHVybnMgdm9pZDoiKTsKKyAgICAgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNvdXJjZS5idWlsZGVyKFRlc3RTUkxSZXR1cm5pbmdWb2lkLmNsYXNzKS5idWlsZCgpOworICAgICAgICBTZXJ2ZXJCb290c3RyYXBCYWcgc2VydmVyQmFnID0gaW5pdGlhbGl6ZUFwcGxpY2F0aW9uKCk7CisgICAgICAgIENvbXBvbmVudE1vZGVsVmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBDb21wb25lbnRNb2RlbFZhbGlkYXRvcigKKyAgICAgICAgICAgICAgICBzZXJ2ZXJCYWcuZ2V0VmFsdWVQYXJhbVByb3ZpZGVycygpLCBzZXJ2ZXJCYWcuZ2V0TWVzc2FnZUJvZHlXb3JrZXJzKCkpOworICAgICAgICB2YWxpZGF0b3IudmFsaWRhdGUocmVzb3VyY2UpOworICAgICAgICBhc3NlcnRUcnVlKHZhbGlkYXRvci5mYXRhbElzc3Vlc0ZvdW5kKCkpOworICAgIH0KKworICAgIEBQYXRoKCJ0ZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RHZXRTUk1SZXR1cm5pbmdWb2lkIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJzcm0iKQorICAgICAgICBwdWJsaWMgdm9pZCBnZXRTUk1ldGhvZCgpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFNSTVJldHVybmluZ1ZvaWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTE9HR0VSLmluZm8oIkFuIGlzc3VlIHNob3VsZCBiZSByZXBvcnRlZCBpZiBhIGdldCBzdWItcmVzb3VyY2UgbWV0aG9kIHJldHVybnMgdm9pZDoiKTsKKyAgICAgICAgTGlzdDxSZXNvdXJjZU1vZGVsSXNzdWU+IGlzc3VlcyA9IHRlc3RSZXNvdXJjZVZhbGlkYXRpb24oVGVzdEdldFNSTVJldHVybmluZ1ZvaWQuY2xhc3MpOworCisgICAgICAgIGFzc2VydEZhbHNlKGlzc3Vlcy5pc0VtcHR5KCkpOworICAgICAgICBhc3NlcnROb3RFcXVhbHMoU2V2ZXJpdHkuRkFUQUwsIGlzc3Vlcy5nZXQoMCkuZ2V0U2V2ZXJpdHkoKSk7CisgICAgfQorCisgICAgQFBhdGgoInRlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdEdldFNSTUNvbnN1bWluZ0VudGl0eSB7CisKKyAgICAgICAgQFBhdGgoInAiKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kKE9iamVjdCBvKSB7CisgICAgICAgICAgICByZXR1cm4gIml0IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFNSTUNvbnN1bWluZ0VudGl0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMT0dHRVIuaW5mbygiQW4gaXNzdWUgc2hvdWxkIGJlIHJlcG9ydGVkIGlmIGEgZ2V0IG1ldGhvZCBjb25zdW1lcyBhbiBlbnRpdHk6Iik7CisgICAgICAgIExpc3Q8UmVzb3VyY2VNb2RlbElzc3VlPiBpc3N1ZXMgPSB0ZXN0UmVzb3VyY2VWYWxpZGF0aW9uKFRlc3RHZXRTUk1Db25zdW1pbmdFbnRpdHkuY2xhc3MpOworCisgICAgICAgIGFzc2VydEZhbHNlKGlzc3Vlcy5pc0VtcHR5KCkpOworICAgICAgICBhc3NlcnROb3RFcXVhbHMoU2V2ZXJpdHkuRkFUQUwsIGlzc3Vlcy5nZXQoMCkuZ2V0U2V2ZXJpdHkoKSk7CisgICAgfQorCisgICAgQFBhdGgoInJvb3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdEdldFNSTUNvbnN1bWluZ0Zvcm1QYXJhbSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgicCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWV0aG9kKEBGb3JtUGFyYW0oImYiKSBTdHJpbmcgZm9ybVBhcmFtKSB7CisgICAgICAgICAgICByZXR1cm4gIml0IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFNSTUNvbnN1bWluZ0Zvcm1QYXJhbSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMT0dHRVIuaW5mbygiQW4gaXNzdWUgc2hvdWxkIGJlIHJlcG9ydGVkIGlmIGEgZ2V0IG1ldGhvZCBjb25zdW1lcyBhIGZvcm0gcGFyYW06Iik7CisgICAgICAgIExpc3Q8UmVzb3VyY2VNb2RlbElzc3VlPiBpc3N1ZXMgPSB0ZXN0UmVzb3VyY2VWYWxpZGF0aW9uKFRlc3RHZXRTUk1Db25zdW1pbmdGb3JtUGFyYW0uY2xhc3MpOworCisgICAgICAgIGFzc2VydEZhbHNlKGlzc3Vlcy5pc0VtcHR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU2V2ZXJpdHkuRkFUQUwsIGlzc3Vlcy5nZXQoMCkuZ2V0U2V2ZXJpdHkoKSk7CisgICAgfQorCisgICAgQFBhdGgoInJvb3RNdWx0aXBsZUh0dHBNZXRob2REZXNpZ25hdG9yc1JNIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RNdWx0aXBsZUh0dHBNZXRob2REZXNpZ25hdG9yc1JNIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQVVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRQdXRJdCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiaXQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVIdHRwTWV0aG9kRGVzaWduYXRvcnNSTSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMT0dHRVIuaW5mbygiQW4gaXNzdWUgc2hvdWxkIGJlIHJlcG9ydGVkIGlmIG1vcmUgdGhhbiBvbmUgSFRUUCBtZXRob2QgZGVzaWduYXRvciBleGlzdCBvbiBhIHJlc291cmNlICIKKyAgICAgICAgICAgICAgICArICJtZXRob2Q6Iik7CisgICAgICAgIFJlc291cmNlIHJlc291cmNlID0gUmVzb3VyY2UuYnVpbGRlcihUZXN0TXVsdGlwbGVIdHRwTWV0aG9kRGVzaWduYXRvcnNSTS5jbGFzcykuYnVpbGQoKTsKKyAgICAgICAgU2VydmVyQm9vdHN0cmFwQmFnIHNlcnZlckJhZyA9IGluaXRpYWxpemVBcHBsaWNhdGlvbigpOworICAgICAgICBDb21wb25lbnRNb2RlbFZhbGlkYXRvciB2YWxpZGF0b3IgPSBuZXcgQ29tcG9uZW50TW9kZWxWYWxpZGF0b3IoCisgICAgICAgICAgICAgICAgc2VydmVyQmFnLmdldFZhbHVlUGFyYW1Qcm92aWRlcnMoKSwgc2VydmVyQmFnLmdldE1lc3NhZ2VCb2R5V29ya2VycygpKTsKKyAgICAgICAgdmFsaWRhdG9yLnZhbGlkYXRlKHJlc291cmNlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh2YWxpZGF0b3IuZmF0YWxJc3N1ZXNGb3VuZCgpKTsKKyAgICB9CisKKyAgICBAUGF0aCgicm9vdE11bHRpcGxlSHR0cE1ldGhvZERlc2lnbmF0b3JzU1JNIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RNdWx0aXBsZUh0dHBNZXRob2REZXNpZ25hdG9yc1NSTSB7CisKKyAgICAgICAgQFBhdGgoInNybSIpCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQVVQKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0UHV0SXQoKSB7CisgICAgICAgICAgICByZXR1cm4gIml0IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlSHR0cE1ldGhvZERlc2lnbmF0b3JzU1JNKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIExPR0dFUi5pbmZvKCJBbiBpc3N1ZSBzaG91bGQgYmUgcmVwb3J0ZWQgaWYgbW9yZSB0aGFuIG9uZSBIVFRQIG1ldGhvZCBkZXNpZ25hdG9yIGV4aXN0IG9uIGEgc3ViLXJlc291cmNlICIKKyAgICAgICAgICAgICAgICArICJtZXRob2Q6Iik7CisgICAgICAgIFJlc291cmNlIHJlc291cmNlID0gUmVzb3VyY2UuYnVpbGRlcihUZXN0TXVsdGlwbGVIdHRwTWV0aG9kRGVzaWduYXRvcnNTUk0uY2xhc3MpLmJ1aWxkKCk7CisgICAgICAgIFNlcnZlckJvb3RzdHJhcEJhZyBzZXJ2ZXJCYWcgPSBpbml0aWFsaXplQXBwbGljYXRpb24oKTsKKyAgICAgICAgQ29tcG9uZW50TW9kZWxWYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IENvbXBvbmVudE1vZGVsVmFsaWRhdG9yKAorICAgICAgICAgICAgICAgIHNlcnZlckJhZy5nZXRWYWx1ZVBhcmFtUHJvdmlkZXJzKCksIHNlcnZlckJhZy5nZXRNZXNzYWdlQm9keVdvcmtlcnMoKSk7CisgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZShyZXNvdXJjZSk7CisgICAgICAgIGFzc2VydFRydWUodmFsaWRhdG9yLmZhdGFsSXNzdWVzRm91bmQoKSk7CisgICAgfQorCisgICAgQFBhdGgoInJvb3RFbnRpdHlQYXJhbU9uU1JMIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RFbnRpdHlQYXJhbU9uU1JMIHsKKworICAgICAgICBAUGF0aCgic3JsIikKKyAgICAgICAgcHVibGljIFN0cmluZyBsb2NhdG9yKFN0cmluZyBzKSB7CisgICAgICAgICAgICByZXR1cm4gIml0IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVudGl0eVBhcmFtT25TUkwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTE9HR0VSLmluZm8oIkFuIGlzc3VlIHNob3VsZCBiZSByZXBvcnRlZCBpZiBhbiBlbnRpdHkgcGFyYW1ldGVyIGV4aXN0cyBvbiBhIHN1Yi1yZXNvdXJjZSBsb2NhdG9yOiIpOworICAgICAgICBSZXNvdXJjZSByZXNvdXJjZSA9IFJlc291cmNlLmJ1aWxkZXIoVGVzdEVudGl0eVBhcmFtT25TUkwuY2xhc3MpLmJ1aWxkKCk7CisgICAgICAgIFNlcnZlckJvb3RzdHJhcEJhZyBzZXJ2ZXJCYWcgPSBpbml0aWFsaXplQXBwbGljYXRpb24oKTsKKyAgICAgICAgQ29tcG9uZW50TW9kZWxWYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IENvbXBvbmVudE1vZGVsVmFsaWRhdG9yKAorICAgICAgICAgICAgICAgIHNlcnZlckJhZy5nZXRWYWx1ZVBhcmFtUHJvdmlkZXJzKCksIHNlcnZlckJhZy5nZXRNZXNzYWdlQm9keVdvcmtlcnMoKSk7CisgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZShyZXNvdXJjZSk7CisgICAgICAgIGFzc2VydFRydWUodmFsaWRhdG9yLmZhdGFsSXNzdWVzRm91bmQoKSk7CisgICAgfQorCisgICAgQFBhdGgodmFsdWUgPSAiL0RlbGV0ZVRlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdE5vbkNvbmZsaWN0aW5nSHR0cE1ldGhvZERlbGV0ZSB7CisKKyAgICAgICAgc3RhdGljIFN0cmluZyBodG1sX2NvbnRlbnQgPQorICAgICAgICAgICAgICAgICI8aHRtbD4iICsgIjxoZWFkPjx0aXRsZT5EZWxldGUgdGV4dC9odG1sPC90aXRsZT48L2hlYWQ+IgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiPGJvZHk+RGVsZXRlIHRleHQvaHRtbDwvYm9keT48L2h0bWw+IjsKKworICAgICAgICBAREVMRVRFCisgICAgICAgIEBQcm9kdWNlcyh2YWx1ZSA9ICJ0ZXh0L3BsYWluIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRQbGFpbigpIHsKKyAgICAgICAgICAgIHJldHVybiAiRGVsZXRlIHRleHQvcGxhaW4iOworICAgICAgICB9CisKKyAgICAgICAgQERFTEVURQorICAgICAgICBAUHJvZHVjZXModmFsdWUgPSAidGV4dC9odG1sIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRIdG1sKCkgeworICAgICAgICAgICAgcmV0dXJuIGh0bWxfY29udGVudDsKKyAgICAgICAgfQorCisgICAgICAgIEBERUxFVEUKKyAgICAgICAgQFBhdGgodmFsdWUgPSAiL3N1YiIpCisgICAgICAgIEBQcm9kdWNlcyh2YWx1ZSA9ICJ0ZXh0L2h0bWwiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFN1YigpIHsKKyAgICAgICAgICAgIHJldHVybiBodG1sX2NvbnRlbnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb25Db25mbGljdGluZ0h0dHBNZXRob2REZWxldGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTE9HR0VSLmluZm8oIk5vIGlzc3VlIHNob3VsZCBiZSByZXBvcnRlZCBpZiBwcm9kdWNlZCBtaW1lIHR5cGVzIGRpZmZlciIpOworICAgICAgICBMaXN0PFJlc291cmNlTW9kZWxJc3N1ZT4gaXNzdWVzID0gdGVzdFJlc291cmNlVmFsaWRhdGlvbihUZXN0Tm9uQ29uZmxpY3RpbmdIdHRwTWV0aG9kRGVsZXRlLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRUcnVlKGlzc3Vlcy5pc0VtcHR5KCkpOworICAgIH0KKworICAgIEBQYXRoKHZhbHVlID0gIi9BbWJpZ1BhcmFtVGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0QW1iaWd1b3VzUGFyYW1zIHsKKworICAgICAgICBAUXVlcnlQYXJhbSgicSIpCisgICAgICAgIEBIZWFkZXJQYXJhbSgicSIpCisgICAgICAgIHByaXZhdGUgaW50IGE7CisKKyAgICAgICAgQFF1ZXJ5UGFyYW0oImIiKQorICAgICAgICBASGVhZGVyUGFyYW0oImIiKQorICAgICAgICBATWF0cml4UGFyYW0oInEiKQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRCKFN0cmluZyBiKSB7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJhIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoQFBhdGhQYXJhbSgiYSIpIEBRdWVyeVBhcmFtKCJhIikgU3RyaW5nIGEpIHsKKyAgICAgICAgICAgIHJldHVybiAiaGkiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiYiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3ViKEBQYXRoUGFyYW0oImEiKSBAUXVlcnlQYXJhbSgiYiIpIEBNYXRyaXhQYXJhbSgiYyIpIFN0cmluZyBhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBATWF0cml4UGFyYW0oIm0iKSBAUXVlcnlQYXJhbSgibSIpIGludCBpKSB7CisgICAgICAgICAgICByZXR1cm4gImhpIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJjIikKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRTdWJMb2MoQE1hdHJpeFBhcmFtKCJtIikgQENvb2tpZVBhcmFtKCJjIikgU3RyaW5nIGEpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QW1iaWd1b3VzUGFyYW1zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIExPR0dFUi5pbmZvKCJBIHdhcm5pbmcgc2hvdWxkIGJlIHJlcG9ydGVkIGlmIGFtYmlndW91cyBzb3VyY2Ugb2YgYSBwYXJhbWV0ZXIgaXMgc2VlbiIpOworICAgICAgICBFcnJvcnMucHJvY2VzcyhuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBSZXNvdXJjZSByZXNvdXJjZSA9IFJlc291cmNlLmJ1aWxkZXIoVGVzdEFtYmlndW91c1BhcmFtcy5jbGFzcykuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICBTZXJ2ZXJCb290c3RyYXBCYWcgc2VydmVyQmFnID0gaW5pdGlhbGl6ZUFwcGxpY2F0aW9uKCk7CisgICAgICAgICAgICAgICAgQ29tcG9uZW50TW9kZWxWYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IENvbXBvbmVudE1vZGVsVmFsaWRhdG9yKAorICAgICAgICAgICAgICAgICAgICAgICAgc2VydmVyQmFnLmdldFZhbHVlUGFyYW1Qcm92aWRlcnMoKSwgc2VydmVyQmFnLmdldE1lc3NhZ2VCb2R5V29ya2VycygpKTsKKyAgICAgICAgICAgICAgICB2YWxpZGF0b3IudmFsaWRhdGUocmVzb3VyY2UpOworCisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSghdmFsaWRhdG9yLmZhdGFsSXNzdWVzRm91bmQoKSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIHZhbGlkYXRvci5nZXRJc3N1ZUxpc3QoKS5zaXplKCkpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyg2LCBFcnJvcnMuZ2V0RXJyb3JNZXNzYWdlcygpLnNpemUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBQYXRoKHZhbHVlID0gIi9FbXB0eVBhdGhTZWdtZW50VGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0RW1wdHlQYXRoU2VnbWVudCB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiLyIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJoaSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eVBhdGhTZWdtZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIExPR0dFUi5pbmZvKCJBIHdhcm5pbmcgc2hvdWxkIGJlIHJlcG9ydGVkIGlmIEBQYXRoIHdpdGggXCIvXCIgb3IgZW1wdHkgc3RyaW5nIHZhbHVlIGlzIHNlZW4iKTsKKyAgICAgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNvdXJjZS5idWlsZGVyKFRlc3RFbXB0eVBhdGhTZWdtZW50LmNsYXNzKS5idWlsZCgpOworICAgICAgICBTZXJ2ZXJCb290c3RyYXBCYWcgc2VydmVyQmFnID0gaW5pdGlhbGl6ZUFwcGxpY2F0aW9uKCk7CisgICAgICAgIENvbXBvbmVudE1vZGVsVmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBDb21wb25lbnRNb2RlbFZhbGlkYXRvcigKKyAgICAgICAgICAgICAgICBzZXJ2ZXJCYWcuZ2V0VmFsdWVQYXJhbVByb3ZpZGVycygpLCBzZXJ2ZXJCYWcuZ2V0TWVzc2FnZUJvZHlXb3JrZXJzKCkpOworICAgICAgICB2YWxpZGF0b3IudmFsaWRhdGUocmVzb3VyY2UpOworCisgICAgICAgIGFzc2VydFRydWUoIXZhbGlkYXRvci5mYXRhbElzc3Vlc0ZvdW5kKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdmFsaWRhdG9yLmdldElzc3VlTGlzdCgpLnNpemUoKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFR5cGVWYXJpYWJsZVJlc291cmNlPFQsIFY+IHsKKyAgICAgICAgQFF1ZXJ5UGFyYW0oInYiKQorICAgICAgICBWIGZpZWxkVjsKKworICAgICAgICBWIG1ldGhvZFY7CisKKyAgICAgICAgQFF1ZXJ5UGFyYW0oInYiKQorICAgICAgICBwdWJsaWMgdm9pZCBzZXQoViBtZXRob2RWKSB7CisgICAgICAgICAgICB0aGlzLm1ldGhvZFYgPSBtZXRob2RWOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldChAQmVhblBhcmFtKCkgViBnZXRWKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0Vi50b1N0cmluZygpICsgZmllbGRWLnRvU3RyaW5nKCkgKyBtZXRob2RWLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgVCBwb3N0KFQgdCkgeworICAgICAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgic3ViIikKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFQgcG9zdFN1YihUIHQpIHsKKyAgICAgICAgICAgIHJldHVybiB0OworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHlwZVZhcmlhYmxlUmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTE9HR0VSLmluZm8oIiIpOworICAgICAgICBFcnJvcnMucHJvY2VzcyhuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBSZXNvdXJjZSByZXNvdXJjZSA9IFJlc291cmNlLmJ1aWxkZXIoVHlwZVZhcmlhYmxlUmVzb3VyY2UuY2xhc3MpLmJ1aWxkKCk7CisgICAgICAgICAgICAgICAgU2VydmVyQm9vdHN0cmFwQmFnIHNlcnZlckJhZyA9IGluaXRpYWxpemVBcHBsaWNhdGlvbigpOworICAgICAgICAgICAgICAgIENvbXBvbmVudE1vZGVsVmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBDb21wb25lbnRNb2RlbFZhbGlkYXRvcigKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlckJhZy5nZXRWYWx1ZVBhcmFtUHJvdmlkZXJzKCksIHNlcnZlckJhZy5nZXRNZXNzYWdlQm9keVdvcmtlcnMoKSk7CisgICAgICAgICAgICAgICAgdmFsaWRhdG9yLnZhbGlkYXRlKHJlc291cmNlKTsKKworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIXZhbGlkYXRvci5mYXRhbElzc3Vlc0ZvdW5kKCkpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyg1LCB2YWxpZGF0b3IuZ2V0SXNzdWVMaXN0KCkuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoNywgRXJyb3JzLmdldEVycm9yTWVzc2FnZXMoKS5zaXplKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhcmFtZXRlcml6ZWRUeXBlUmVzb3VyY2U8VCwgVj4geworICAgICAgICBAUXVlcnlQYXJhbSgidiIpCisgICAgICAgIENvbGxlY3Rpb248Vj4gZmllbGRWOworCisgICAgICAgIExpc3Q8TGlzdDxWPj4gbWV0aG9kVjsKKworICAgICAgICBAUXVlcnlQYXJhbSgidiIpCisgICAgICAgIHB1YmxpYyB2b2lkIHNldChMaXN0PExpc3Q8Vj4+IG1ldGhvZFYpIHsKKyAgICAgICAgICAgIHRoaXMubWV0aG9kViA9IG1ldGhvZFY7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KEBRdWVyeVBhcmFtKCJ2IikgTGlzdDxWPiBnZXRWKSB7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgQ29sbGVjdGlvbjxUPiBwb3N0KENvbGxlY3Rpb248VD4gdCkgeworICAgICAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgic3ViIikKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIENvbGxlY3Rpb248VD4gcG9zdFN1YihDb2xsZWN0aW9uPFQ+IHQpIHsKKyAgICAgICAgICAgIHJldHVybiB0OworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb25jcmV0ZVBhcmFtZXRlcml6ZWRUeXBlUmVzb3VyY2UgZXh0ZW5kcyBQYXJhbWV0ZXJpemVkVHlwZVJlc291cmNlPFN0cmluZywgU3RyaW5nPiB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyYW1ldGVyaXplZFR5cGVSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMT0dHRVIuaW5mbygiIik7CisgICAgICAgIFJlc291cmNlIHJlc291cmNlID0gUmVzb3VyY2UuYnVpbGRlcihDb25jcmV0ZVBhcmFtZXRlcml6ZWRUeXBlUmVzb3VyY2UuY2xhc3MpLmJ1aWxkKCk7CisgICAgICAgIFNlcnZlckJvb3RzdHJhcEJhZyBzZXJ2ZXJCYWcgPSBpbml0aWFsaXplQXBwbGljYXRpb24oKTsKKyAgICAgICAgQ29tcG9uZW50TW9kZWxWYWxpZGF0b3IgdmFsaWRhdG9yID0gbmV3IENvbXBvbmVudE1vZGVsVmFsaWRhdG9yKAorICAgICAgICAgICAgICAgIHNlcnZlckJhZy5nZXRWYWx1ZVBhcmFtUHJvdmlkZXJzKCksIHNlcnZlckJhZy5nZXRNZXNzYWdlQm9keVdvcmtlcnMoKSk7CisgICAgICAgIHZhbGlkYXRvci52YWxpZGF0ZShyZXNvdXJjZSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSghdmFsaWRhdG9yLmZhdGFsSXNzdWVzRm91bmQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCB2YWxpZGF0b3IuZ2V0SXNzdWVMaXN0KCkuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEdlbmVyaWNBcnJheVJlc291cmNlPFQsIFY+IHsKKyAgICAgICAgQFF1ZXJ5UGFyYW0oInYiKQorICAgICAgICBWW10gZmllbGRWOworCisgICAgICAgIFZbXSBtZXRob2RWOworCisgICAgICAgIEBRdWVyeVBhcmFtKCJ2IikKKyAgICAgICAgcHVibGljIHZvaWQgc2V0KFZbXSBtZXRob2RWKSB7CisgICAgICAgICAgICB0aGlzLm1ldGhvZFYgPSBtZXRob2RWOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFRbXSBwb3N0KFRbXSB0KSB7CisgICAgICAgICAgICByZXR1cm4gdDsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJzdWIiKQorICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgVFtdIHBvc3RTdWIoVFtdIHQpIHsKKyAgICAgICAgICAgIHJldHVybiB0OworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb25jcmV0ZUdlbmVyaWNBcnJheVJlc291cmNlIGV4dGVuZHMgR2VuZXJpY0FycmF5UmVzb3VyY2U8U3RyaW5nLCBTdHJpbmc+IHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmljQXJyYXlSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMT0dHRVIuaW5mbygiIik7CisgICAgICAgIFJlc291cmNlIHJlc291cmNlID0gUmVzb3VyY2UuYnVpbGRlcihDb25jcmV0ZUdlbmVyaWNBcnJheVJlc291cmNlLmNsYXNzKS5idWlsZCgpOworICAgICAgICBTZXJ2ZXJCb290c3RyYXBCYWcgc2VydmVyQmFnID0gaW5pdGlhbGl6ZUFwcGxpY2F0aW9uKCk7CisgICAgICAgIENvbXBvbmVudE1vZGVsVmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBDb21wb25lbnRNb2RlbFZhbGlkYXRvcigKKyAgICAgICAgICAgICAgICBzZXJ2ZXJCYWcuZ2V0VmFsdWVQYXJhbVByb3ZpZGVycygpLCBzZXJ2ZXJCYWcuZ2V0TWVzc2FnZUJvZHlXb3JrZXJzKCkpOworICAgICAgICB2YWxpZGF0b3IudmFsaWRhdGUocmVzb3VyY2UpOworCisgICAgICAgIGFzc2VydFRydWUoIXZhbGlkYXRvci5mYXRhbElzc3Vlc0ZvdW5kKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdmFsaWRhdG9yLmdldElzc3VlTGlzdCgpLnNpemUoKSk7CisgICAgfQorCisgICAgLy8gVE9ETzogdGVzdCBtdWx0aXBsZSByb290IHJlc291cmNlcyB3aXRoIHRoZSBzYW1lIHVyaVRlbXBsYXRlIChpbiBXZWJBcHBsaWNhdGlvbkltcGwucHJvY2Vzc1Jvb3RSZXNvdXJjZXMgPykKKworICAgIEBQYXRoKCJ0ZXN0MSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQZXJjZW50RW5jb2RlZFRlc3QgeworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCIlNUIlNUQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHBlcmNlbnQoKSB7CisgICAgICAgICAgICByZXR1cm4gInBlcmNlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiW10iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIG5vdEVuY29kZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gIm5vdC1lbmNvZGVkIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBlcmNlbnRFbmNvZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIExpc3Q8UmVzb3VyY2VNb2RlbElzc3VlPiBpc3N1ZXMgPSB0ZXN0UmVzb3VyY2VWYWxpZGF0aW9uKFBlcmNlbnRFbmNvZGVkVGVzdC5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBpc3N1ZXMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNldmVyaXR5LkZBVEFMLCBpc3N1ZXMuZ2V0KDApLmdldFNldmVyaXR5KCkpOworICAgIH0KKworCisgICAgQFBhdGgoInRlc3QyIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBlcmNlbnRFbmNvZGVkQ2FzZVNlbnNpdGl2ZVRlc3QgeworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCIlNUIlNUQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHBlcmNlbnQoKSB7CisgICAgICAgICAgICByZXR1cm4gInBlcmNlbnQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiJTViJTVkIikKKyAgICAgICAgcHVibGljIFN0cmluZyBub3RFbmNvZGVkKCkgeworICAgICAgICAgICAgcmV0dXJuICJub3QtZW5jb2RlZCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQZXJjZW50RW5jb2RlZENhc2VTZW5zaXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTGlzdDxSZXNvdXJjZU1vZGVsSXNzdWU+IGlzc3VlcyA9IHRlc3RSZXNvdXJjZVZhbGlkYXRpb24oUGVyY2VudEVuY29kZWRDYXNlU2Vuc2l0aXZlVGVzdC5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBpc3N1ZXMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNldmVyaXR5LkZBVEFMLCBpc3N1ZXMuZ2V0KDApLmdldFNldmVyaXR5KCkpOworICAgIH0KKworICAgIEBQYXRoKCJhbWJpZ3VvdXMtcGFyYW1ldGVyIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFtYmlndW91c1BhcmFtZXRlclJlc291cmNlIHsKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyBtb3JlTm9uQW5ub3RhdGVkUGFyYW1ldGVycyhASGVhZGVyUGFyYW0oInNvbWV0aGluZyIpIFN0cmluZyBoZWFkZXIsIFN0cmluZyBlbnRpdHkxLCBTdHJpbmcgZW50aXR5MikgeworICAgICAgICAgICAgcmV0dXJuICJ4IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vdEFubm90YXRlZFBhcmFtZXRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNvdXJjZS5idWlsZGVyKEFtYmlndW91c1BhcmFtZXRlclJlc291cmNlLmNsYXNzKS5idWlsZCgpOworICAgICAgICBTZXJ2ZXJCb290c3RyYXBCYWcgc2VydmVyQmFnID0gaW5pdGlhbGl6ZUFwcGxpY2F0aW9uKCk7CisgICAgICAgIENvbXBvbmVudE1vZGVsVmFsaWRhdG9yIHZhbGlkYXRvciA9IG5ldyBDb21wb25lbnRNb2RlbFZhbGlkYXRvcigKKyAgICAgICAgICAgICAgICBzZXJ2ZXJCYWcuZ2V0VmFsdWVQYXJhbVByb3ZpZGVycygpLCBzZXJ2ZXJCYWcuZ2V0TWVzc2FnZUJvZHlXb3JrZXJzKCkpOworICAgICAgICB2YWxpZGF0b3IudmFsaWRhdGUocmVzb3VyY2UpOworCisgICAgICAgIGZpbmFsIExpc3Q8UmVzb3VyY2VNb2RlbElzc3VlPiBlcnJvck1lc3NhZ2VzID0gdmFsaWRhdG9yLmdldElzc3VlTGlzdCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgZXJyb3JNZXNzYWdlcy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU2V2ZXJpdHkuRkFUQUwsIGVycm9yTWVzc2FnZXMuZ2V0KDApLmdldFNldmVyaXR5KCkpOworICAgIH0KKworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdWJSZXNvdXJjZSB7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0UgPSAiR290IGl0ISI7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEl0KCkgeworICAgICAgICAgICAgcmV0dXJuIE1FU1NBR0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaG91bGQgcmVwb3J0IHdhcm5pbmcgZHVyaW5nIHZhbGlkYXRpb24gYXMgUmVzb3VyY2UgY2Fubm90IGhhdmUgcmVzb3VyY2UgbWV0aG9kIGFuZCBzdWIgcmVzb3VyY2UgbG9jYXRvcnMgb24gdGhlIHNhbWUgcGF0aC4KKyAgICAgKi8KKyAgICBAUGF0aCgiZmFpbFJvb3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWV0aG9kQW5kTG9jYXRvclJlc291cmNlIHsKKworCisgICAgICAgIEBQYXRoKCIvIikKKyAgICAgICAgcHVibGljIFN1YlJlc291cmNlIGdldFN1YlJlc291cmNlTG9jYXRvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3ViUmVzb3VyY2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gInNob3VsZCBuZXZlciBiZSBjYWxsZWQgLSBmYWlscyBkdXJpbmcgdmFsaWRhdGlvbiI7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvY2F0b3JBbmRNZXRob2RWYWxpZGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIExPR0dFUi5pbmZvKCJTaG91bGQgcmVwb3J0IHdhcm5pbmcgZHVyaW5nIHZhbGlkYXRpb24gYXMgUmVzb3VyY2UgY2Fubm90IGhhdmUgcmVzb3VyY2UgbWV0aG9kIGFuZCBzdWIgIgorICAgICAgICAgICAgICAgICsgInJlc291cmNlIGxvY2F0b3JzIG9uIHRoZSBzYW1lIHBhdGguIik7CisgICAgICAgIExpc3Q8UmVzb3VyY2VNb2RlbElzc3VlPiBpc3N1ZXMgPSB0ZXN0UmVzb3VyY2VWYWxpZGF0aW9uKE1ldGhvZEFuZExvY2F0b3JSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBpc3N1ZXMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0Tm90RXF1YWxzKFNldmVyaXR5LkZBVEFMLCBpc3N1ZXMuZ2V0KDApLmdldFNldmVyaXR5KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNob3VsZCByZXBvcnQgd2FybmluZyBkdXJpbmcgdmFsaWRhdGlvbiBhcyBSZXNvdXJjZSBjYW5ub3QgaGF2ZSByZXNvdXJjZSBtZXRob2QgYW5kIHN1YiByZXNvdXJjZSBsb2NhdG9ycyBvbiB0aGUgc2FtZSBwYXRoLgorICAgICAqLworICAgIEBQYXRoKCJmYWlsUm9vdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNZXRob2RBbmRMb2NhdG9yUmVzb3VyY2UyIHsKKworCisgICAgICAgIEBQYXRoKCJhIikKKyAgICAgICAgcHVibGljIFN1YlJlc291cmNlIGdldFN1YlJlc291cmNlTG9jYXRvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3ViUmVzb3VyY2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImEiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAic2hvdWxkIG5ldmVyIGJlIGNhbGxlZCAtIGZhaWxzIGR1cmluZyB2YWxpZGF0aW9uIjsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jYXRvckFuZE1ldGhvZDJWYWxpZGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIExPR0dFUi5pbmZvKCJTaG91bGQgcmVwb3J0IHdhcm5pbmcgZHVyaW5nIHZhbGlkYXRpb24gYXMgUmVzb3VyY2UgY2Fubm90IGhhdmUgcmVzb3VyY2UgbWV0aG9kIGFuZCBzdWIgIgorICAgICAgICAgICAgICAgICsgInJlc291cmNlIGxvY2F0b3JzIG9uIHRoZSBzYW1lIHBhdGguIik7CisgICAgICAgIExpc3Q8UmVzb3VyY2VNb2RlbElzc3VlPiBpc3N1ZXMgPSB0ZXN0UmVzb3VyY2VWYWxpZGF0aW9uKE1ldGhvZEFuZExvY2F0b3JSZXNvdXJjZTIuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgaXNzdWVzLnNpemUoKSk7CisgICAgICAgIGFzc2VydE5vdEVxdWFscyhTZXZlcml0eS5GQVRBTCwgaXNzdWVzLmdldCgwKS5nZXRTZXZlcml0eSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXYXJuaW5nIHNob3VsZCBiZSByZXBvcnRlZCBpbmZvcm1pbmcgd2ljaCBsb2NhdG9yIHdpbGwgYmUgdXNlZCBpbiBydW50aW1lCisgICAgICovCisgICAgQFBhdGgoImxvY2F0b3IiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVHdvTG9jYXRvcnNSZXNvdXJjZSB7CisgICAgICAgIEBQYXRoKCJhIikKKyAgICAgICAgcHVibGljIFN1YlJlc291cmNlIGxvY2F0b3IoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN1YlJlc291cmNlKCk7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiYSIpCisgICAgICAgIHB1YmxpYyBTdWJSZXNvdXJjZSBsb2NhdG9yMigpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3ViUmVzb3VyY2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvY2F0b3JQYXRoVmFsaWRhdGlvbkZhaWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTE9HR0VSLmluZm8oIlNob3VsZCByZXBvcnQgZXJyb3IgZHVyaW5nIHZhbGlkYXRpb24gYXMgUmVzb3VyY2UgY2Fubm90IGhhdmUgYW1iaWd1b3VzIHN1YiByZXNvdXJjZSBsb2NhdG9ycy4iKTsKKyAgICAgICAgTGlzdDxSZXNvdXJjZU1vZGVsSXNzdWU+IGlzc3VlcyA9IHRlc3RSZXNvdXJjZVZhbGlkYXRpb24oVHdvTG9jYXRvcnNSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBpc3N1ZXMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNldmVyaXR5LkZBVEFMLCBpc3N1ZXMuZ2V0KDApLmdldFNldmVyaXR5KCkpOworICAgIH0KKworICAgIEBQYXRoKCJyb290IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlUm9vdCB7CisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInN1Yi1yb290IikgLy8gaW4gcGF0aCBjb2xsaXNpb24gd2l0aCBSZXNvdXJjZVN1YlJvb3QuZ2V0KCkKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gInNob3VsZCBuZXZlciBiZSBjYWxsZWQgLSBmYWlscyBkdXJpbmcgdmFsaWRhdGlvbiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicm9vdC9zdWItcm9vdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVN1YlBhdGhSb290IHsKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAic2hvdWxkIG5ldmVyIGJlIGNhbGxlZCAtIGZhaWxzIGR1cmluZyB2YWxpZGF0aW9uIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJyb290IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlUm9vdE5vdFVuaXF1ZSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInN1Yi1yb290IikgLy8gaW4gcGF0aCBjb2xsaXNpb24gd2l0aCBSZXNvdXJjZVN1YlJvb3QuZ2V0KCkKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gInNob3VsZCBuZXZlciBiZSBjYWxsZWQgLSBmYWlscyBkdXJpbmcgdmFsaWRhdGlvbiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBJZ25vcmUKKyAgICAvLyBUT0RPOiBuZWVkIHRvIGFkZCB2YWxpZGF0aW9uIHRvIGRldGVjdCBhbWJpZ3VvdXMgcHJvYmxlbXMgb2YgUmVzb3VyY2VTdWJQYXRoUm9vdCBhbmQgdHdvIG90aGVyIHJlc291cmNlcy4KKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHdvT3ZlcmxhcHBpbmdTdWJSZXNvdXJjZVZhbGlkYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTGlzdDxSZXNvdXJjZU1vZGVsSXNzdWU+IGlzc3VlcyA9IHRlc3RSZXNvdXJjZVZhbGlkYXRpb24oUmVzb3VyY2VSb290LmNsYXNzLCBSZXNvdXJjZVN1YlBhdGhSb290LmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGlzc3Vlcy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU2V2ZXJpdHkuRkFUQUwsIGlzc3Vlcy5nZXQoMCkuZ2V0U2V2ZXJpdHkoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBASWdub3JlCisgICAgcHVibGljIHZvaWQgdGVzdFR3b092ZXJsYXBwaW5nUmVzb3VyY2VWYWxpZGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIExpc3Q8UmVzb3VyY2VNb2RlbElzc3VlPiBpc3N1ZXMgPSB0ZXN0UmVzb3VyY2VWYWxpZGF0aW9uKFJlc291cmNlUm9vdC5jbGFzcywgUmVzb3VyY2VSb290Tm90VW5pcXVlLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGlzc3Vlcy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU2V2ZXJpdHkuRkFUQUwsIGlzc3Vlcy5nZXQoMCkuZ2V0U2V2ZXJpdHkoKSk7CisgICAgfQorCisgICAgQFBhdGgoInJvb3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRW1wdHlSZXNvdXJjZSB7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJub3QgYSBnZXQgbWV0aG9kLiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eVJlc291cmNlbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMT0dHRVIuaW5mbygiU2hvdWxkIHJlcG9ydCB3YXJuaW5nIGR1cmluZyB2YWxpZGF0aW9uIGFzIFJlc291cmNlIGNhbm5vdCBoYXZlIHJlc291cmNlIG1ldGhvZCBhbmQgc3ViICIKKyAgICAgICAgICAgICAgICArICJyZXNvdXJjZSBsb2NhdG9ycyBvbiB0aGUgc2FtZSBwYXRoLiIpOworICAgICAgICBMaXN0PFJlc291cmNlTW9kZWxJc3N1ZT4gaXNzdWVzID0gdGVzdFJlc291cmNlVmFsaWRhdGlvbihFbXB0eVJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGlzc3Vlcy5zaXplKCkpOworICAgICAgICBhc3NlcnRGYWxzZShpc3N1ZXMuZ2V0KDApLmdldFNldmVyaXR5KCkgPT0gU2V2ZXJpdHkuRkFUQUwpOworICAgIH0KKworCisgICAgQFBhdGgoInthYmN9IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFtYmlndW91c1Jlc291cmNlMSB7CisgICAgICAgIEBQYXRoKCJ4IikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiZ2V0IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJ7ZGVmfSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBbWJpZ3VvdXNSZXNvdXJjZTIgeworICAgICAgICBAUGF0aCgieCIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gImdldCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgidW5pcXVlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFVuaXF1ZVJlc291cmNlIHsKKyAgICAgICAgQFBhdGgoIngiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiZ2V0IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFtYmlndW91c1Jlc291cmNlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMT0dHRVIuaW5mbygiU2hvdWxkIHJlcG9ydCB3YXJuaW5nIGR1cmluZyB2YWxpZGF0aW9uIGVycm9yIGFzIHJlc291cmNlIHBhdGggcGF0dGVybnMgYXJlIGFtYmlndW91cyAoe2FiY30gYW5kIHtkZWZ9ICIKKyAgICAgICAgICAgICAgICArICJyZXN1bHRzIGludG8gc2FtZSBwYXRoIHBhdHRlcm4pLiIpOworICAgICAgICBMaXN0PFJlc291cmNlTW9kZWxJc3N1ZT4gaXNzdWVzID0gdGVzdFJlc291cmNlVmFsaWRhdGlvbihBbWJpZ3VvdXNSZXNvdXJjZTEuY2xhc3MsIEFtYmlndW91c1Jlc291cmNlMi5jbGFzcywKKyAgICAgICAgICAgICAgICBVbmlxdWVSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBpc3N1ZXMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNldmVyaXR5LkZBVEFMLCBpc3N1ZXMuZ2V0KDApLmdldFNldmVyaXR5KCkpOworICAgIH0KKworCisgICAgQFBhdGgoInthYmN9IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFtYmlndW91c0xvY2F0b3JSZXNvdXJjZTEgeworICAgICAgICBAUGF0aCgieCIpCisgICAgICAgIHB1YmxpYyBTdWJSZXNvdXJjZSBsb2NhdG9yKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdWJSZXNvdXJjZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIntkZWZ9IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFtYmlndW91c0xvY2F0b3JSZXNvdXJjZTIgeworICAgICAgICBAUGF0aCgieCIpCisgICAgICAgIHB1YmxpYyBTdWJSZXNvdXJjZSBsb2NhdG9yMigpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3ViUmVzb3VyY2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFtYmlndW91c1Jlc291cmNlTG9jYXRvcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTE9HR0VSLmluZm8oIlNob3VsZCByZXBvcnQgd2FybmluZyBkdXJpbmcgdmFsaWRhdGlvbiBlcnJvciBhcyByZXNvdXJjZSBwYXRoIHBhdHRlcm5zIGFyZSBhbWJpZ3VvdXMgKHthYmN9IGFuZCB7ZGVmfSAiCisgICAgICAgICAgICAgICAgKyAicmVzdWx0cyBpbnRvIHNhbWUgcGF0aCBwYXR0ZXJuKS4iKTsKKyAgICAgICAgTGlzdDxSZXNvdXJjZU1vZGVsSXNzdWU+IGlzc3VlcyA9IHRlc3RSZXNvdXJjZVZhbGlkYXRpb24oQW1iaWd1b3VzTG9jYXRvclJlc291cmNlMS5jbGFzcywKKyAgICAgICAgICAgICAgICBBbWJpZ3VvdXNMb2NhdG9yUmVzb3VyY2UyLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGlzc3Vlcy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU2V2ZXJpdHkuRkFUQUwsIGlzc3Vlcy5nZXQoMCkuZ2V0U2V2ZXJpdHkoKSk7CisgICAgfQorCisgICAgQFBhdGgoInJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlTWV0aG9kV2l0aFZvaWRSZXR1cm5UeXBlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiZXJyb3IiKQorICAgICAgICBwdWJsaWMgdm9pZCBlcnJvcigpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZvaWRSZXR1cm5UeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIExPR0dFUi5pbmZvKCJTaG91bGQgcmVwb3J0IGhpbnQgZHVyaW5nIHZhbGlkYXRpb24gYXMgQEdFVCByZXNvdXJjZSBtZXRob2QgcmV0dXJucyB2b2lkLiIpOworICAgICAgICBMaXN0PFJlc291cmNlTW9kZWxJc3N1ZT4gaXNzdWVzID0gdGVzdFJlc291cmNlVmFsaWRhdGlvbihSZXNvdXJjZU1ldGhvZFdpdGhWb2lkUmV0dXJuVHlwZS5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGlzc3Vlcy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU2V2ZXJpdHkuSElOVCwgaXNzdWVzLmdldCgwKS5nZXRTZXZlcml0eSgpKTsKKyAgICB9CisKKyAgICBAUGF0aCgicGFyYW1vbnNldHRlciIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVdpdGhQYXJhbU9uU2V0dGVyIHsKKyAgICAgICAgQFF1ZXJ5UGFyYW0oImlkIikKKyAgICAgICAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIGlkKSB7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJnZXQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyYW1PblNldHRlcklzT2soKSB7CisgICAgICAgIExPR0dFUi5pbmZvKCJWYWxpZGF0aW9uIHNob3VsZCByZXBvcnQgbm8gaXNzdWVzLiIpOworICAgICAgICBMaXN0PFJlc291cmNlTW9kZWxJc3N1ZT4gaXNzdWVzID0gdGVzdFJlc291cmNlVmFsaWRhdGlvbihSZXNvdXJjZVdpdGhQYXJhbU9uU2V0dGVyLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgaXNzdWVzLnNpemUoKSk7CisgICAgfQorCisgICAgQFBhdGgoInBhcmFtb25yZXNvdXJjZXBhdGgiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VXaXRoUGFyYW1PblJlc291cmNlUGF0aEFubm90YXRlZE1ldGhvZCB7CisgICAgICAgIEBRdWVyeVBhcmFtKCJpZCIpCisgICAgICAgIEBQYXRoKCJmYWlsIikKKyAgICAgICAgcHVibGljIFN0cmluZyBxdWVyeSgpIHsKKyAgICAgICAgICAgIHJldHVybiAicG9zdCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJhbU9uUmVzb3VyY2VQYXRoQW5ub3RhdGVkTWV0aG9kRmFpbHMoKSB7CisgICAgICAgIExPR0dFUi5pbmZvKCJTaG91bGQgcmVwb3J0IGZhdGFsIGR1cmluZyB2YWxpZGF0aW9uIGFzIEBQYXRoIG1ldGhvZCBzaG91bGQgbm90IGJlIGFubm90YXRlZCB3aXRoIHBhcmFtZXRlciBhbm5vdGF0aW9uIik7CisgICAgICAgIExpc3Q8UmVzb3VyY2VNb2RlbElzc3VlPiBpc3N1ZXMgPSB0ZXN0UmVzb3VyY2VWYWxpZGF0aW9uKFJlc291cmNlV2l0aFBhcmFtT25SZXNvdXJjZVBhdGhBbm5vdGF0ZWRNZXRob2QuY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscygxLCBpc3N1ZXMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNldmVyaXR5LkZBVEFMLCBpc3N1ZXMuZ2V0KDApLmdldFNldmVyaXR5KCkpOworICAgIH0KKworICAgIEBQYXRoKCJwYXJhbW9ucmVzb3VyY2VnZXQiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VHRVRNZXRob2RGYWlscyB7CisgICAgICAgIEBRdWVyeVBhcmFtKCJpZCIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoQFBhdGhQYXJhbSgiYWJjIikgU3RyaW5nIGlkKSB7CisgICAgICAgICAgICByZXR1cm4gImdldCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJhbU9uUmVzb3VyY2VHRVRNZXRob2RGYWlscygpIHsKKyAgICAgICAgTE9HR0VSLmluZm8oIlNob3VsZCByZXBvcnQgZmF0YWwgZHVyaW5nIHZhbGlkYXRpb24gYXMgQEdFVCBtZXRob2Qgc2hvdWxkIG5vdCBiZSBhbm5vdGF0ZWQgd2l0aCBwYXJhbWV0ZXIgYW5ub3RhdGlvbiIpOworICAgICAgICBMaXN0PFJlc291cmNlTW9kZWxJc3N1ZT4gaXNzdWVzID0gdGVzdFJlc291cmNlVmFsaWRhdGlvbihSZXNvdXJjZUdFVE1ldGhvZEZhaWxzLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgaXNzdWVzLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTZXZlcml0eS5GQVRBTCwgaXNzdWVzLmdldCgwKS5nZXRTZXZlcml0eSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IG9mIGRpc2FibGVkIHZhbGlkYXRpb24gZmFpbGluZyBvbiBlcnJvcnMuCisgICAgICovCisgICAgQFBhdGgoInRlc3QtZGlzYWJsZS12YWxpZGF0aW9uLWZhaWwtb24tZXJyb3IiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdERpc2FibGVWYWxpZGF0aW9uRmFpbE9uRXJyb3JSZXNvdXJjZSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gIlBBU1NFRCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhYmxlRmFpbE9uRXJyb3JzKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByYyA9IG5ldyBSZXNvdXJjZUNvbmZpZygKKyAgICAgICAgICAgICAgICBBbWJpZ3VvdXNMb2NhdG9yUmVzb3VyY2UxLmNsYXNzLAorICAgICAgICAgICAgICAgIEFtYmlndW91c0xvY2F0b3JSZXNvdXJjZTIuY2xhc3MsCisgICAgICAgICAgICAgICAgQW1iaWd1b3VzUGFyYW1ldGVyUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgQW1iaWd1b3VzUmVzb3VyY2UxLmNsYXNzLAorICAgICAgICAgICAgICAgIEFtYmlndW91c1Jlc291cmNlMi5jbGFzcywKKyAgICAgICAgICAgICAgICBDb25jcmV0ZUdlbmVyaWNBcnJheVJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIENvbmNyZXRlUGFyYW1ldGVyaXplZFR5cGVSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBFbXB0eVJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIEdlbmVyaWNBcnJheVJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIE1ldGhvZEFuZExvY2F0b3JSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBNZXRob2RBbmRMb2NhdG9yUmVzb3VyY2UyLmNsYXNzLAorICAgICAgICAgICAgICAgIE15QmVhblBhcmFtLmNsYXNzLAorICAgICAgICAgICAgICAgIFBhcmFtZXRlcml6ZWRUeXBlUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgUGVyY2VudEVuY29kZWRDYXNlU2Vuc2l0aXZlVGVzdC5jbGFzcywKKyAgICAgICAgICAgICAgICBQZXJjZW50RW5jb2RlZFRlc3QuY2xhc3MsCisgICAgICAgICAgICAgICAgUmVzb3VyY2VBc1Byb3ZpZGVyLmNsYXNzLAorICAgICAgICAgICAgICAgIFJlc291cmNlR0VUTWV0aG9kRmFpbHMuY2xhc3MsCisgICAgICAgICAgICAgICAgUmVzb3VyY2VNZXRob2RXaXRoVm9pZFJldHVyblR5cGUuY2xhc3MsCisgICAgICAgICAgICAgICAgUmVzb3VyY2VSb290LmNsYXNzLAorICAgICAgICAgICAgICAgIFJlc291cmNlUm9vdE5vdFVuaXF1ZS5jbGFzcywKKyAgICAgICAgICAgICAgICBSZXNvdXJjZVN1YlBhdGhSb290LmNsYXNzLAorICAgICAgICAgICAgICAgIFJlc291cmNlV2l0aE11bHRpcGxlU2NvcGVzLmNsYXNzLAorICAgICAgICAgICAgICAgIFJlc291cmNlV2l0aFBhcmFtT25SZXNvdXJjZVBhdGhBbm5vdGF0ZWRNZXRob2QuY2xhc3MsCisgICAgICAgICAgICAgICAgVGVzdEFtYmlndW91c1BhcmFtcy5jbGFzcywKKyAgICAgICAgICAgICAgICBUZXN0QXN5bmNHZXRSTVJldHVybmluZ1ZvaWQuY2xhc3MsCisgICAgICAgICAgICAgICAgVGVzdEVtcHR5UGF0aFNlZ21lbnQuY2xhc3MsCisgICAgICAgICAgICAgICAgVGVzdEVudGl0eVBhcmFtT25TUkwuY2xhc3MsCisgICAgICAgICAgICAgICAgVGVzdEdldFJNQ29uc3VtaW5nRW50aXR5LmNsYXNzLAorICAgICAgICAgICAgICAgIFRlc3RHZXRSTUNvbnN1bWluZ0Zvcm1QYXJhbS5jbGFzcywKKyAgICAgICAgICAgICAgICBUZXN0R2V0Uk1SZXR1cm5pbmdWb2lkLmNsYXNzLAorICAgICAgICAgICAgICAgIFRlc3RHZXRTUk1Db25zdW1pbmdFbnRpdHkuY2xhc3MsCisgICAgICAgICAgICAgICAgVGVzdEdldFNSTUNvbnN1bWluZ0Zvcm1QYXJhbS5jbGFzcywKKyAgICAgICAgICAgICAgICBUZXN0R2V0U1JNUmV0dXJuaW5nVm9pZC5jbGFzcywKKyAgICAgICAgICAgICAgICBUZXN0TW9yZVRoYW5PbmVFbnRpdHkuY2xhc3MsCisgICAgICAgICAgICAgICAgVGVzdE11bHRpcGxlSHR0cE1ldGhvZERlc2lnbmF0b3JzUk0uY2xhc3MsCisgICAgICAgICAgICAgICAgVGVzdE11bHRpcGxlSHR0cE1ldGhvZERlc2lnbmF0b3JzU1JNLmNsYXNzLAorICAgICAgICAgICAgICAgIFRlc3ROb25Db25mbGljdGluZ0h0dHBNZXRob2REZWxldGUuY2xhc3MsCisgICAgICAgICAgICAgICAgVGVzdE5vblB1YmxpY1JNLmNsYXNzLAorICAgICAgICAgICAgICAgIFRlc3RSZWxheGVkUHJvZHVjZXNDb25zdW1lc1BhcnNlclJ1bGVzLmNsYXNzLAorICAgICAgICAgICAgICAgIFRlc3RSb290UmVzb3VyY2VOb25BbWJpZ0N0b3JzLmNsYXNzLAorICAgICAgICAgICAgICAgIFRlc3RTUkxSZXR1cm5pbmdWb2lkLmNsYXNzLAorICAgICAgICAgICAgICAgIFR3b0xvY2F0b3JzUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgVHlwZVZhcmlhYmxlUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgVW5pcXVlUmVzb3VyY2UuY2xhc3MsCisKKyAgICAgICAgICAgICAgICBUZXN0RGlzYWJsZVZhbGlkYXRpb25GYWlsT25FcnJvclJlc291cmNlLmNsYXNzIC8vIHdlIHNob3VsZCBzdGlsbCBiZSBhYmxlIHRvIGludm9rZSBhIEdFVCBvbiB0aGlzIG9uZS4KKyAgICAgICAgKTsKKyAgICAgICAgcmMucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5SRVNPVVJDRV9WQUxJREFUSU9OX0lHTk9SRV9FUlJPUlMsIHRydWUpOworICAgICAgICBBcHBsaWNhdGlvbkhhbmRsZXIgYWggPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKHJjKTsKKworICAgICAgICBmaW5hbCBDb250YWluZXJSZXF1ZXN0IHJlcXVlc3QgPSBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3Rlc3QtZGlzYWJsZS12YWxpZGF0aW9uLWZhaWwtb24tZXJyb3IiLCAiR0VUIikuYnVpbGQoKTsKKyAgICAgICAgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBhaC5hcHBseShyZXF1ZXN0KS5nZXQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiUEFTU0VEIiwgcmVzcG9uc2UuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIHByaXZhdGUgU2VydmVyQm9vdHN0cmFwQmFnIGluaXRpYWxpemVBcHBsaWNhdGlvbigpIHsKKyAgICAgICAgTGlzdDxCb290c3RyYXBDb25maWd1cmF0b3I+IGJvb3RzdHJhcENvbmZpZ3VyYXRvcnMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QoCisgICAgICAgICAgICAgICAgbmV3IFRlc3RDb25maWdDb25maWd1cmF0b3IoKSwKKyAgICAgICAgICAgICAgICBuZXcgUGFyYW1FeHRyYWN0b3JDb25maWd1cmF0b3IoKSwKKyAgICAgICAgICAgICAgICBuZXcgVmFsdWVQYXJhbVByb3ZpZGVyQ29uZmlndXJhdG9yKCksCisgICAgICAgICAgICAgICAgbmV3IE1lc3NhZ2VCb2R5RmFjdG9yeS5NZXNzYWdlQm9keVdvcmtlcnNDb25maWd1cmF0b3IoKSkpOworCisgICAgICAgIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciA9IEluamVjdGlvbnMuY3JlYXRlSW5qZWN0aW9uTWFuYWdlcigpOworICAgICAgICBTZXJ2ZXJCb290c3RyYXBCYWcgYm9vdHN0cmFwQmFnID0gbmV3IFNlcnZlckJvb3RzdHJhcEJhZygpOworICAgICAgICBib290c3RyYXBDb25maWd1cmF0b3JzLmZvckVhY2goY29uZmlndXJlciAtPiBjb25maWd1cmVyLmluaXQoaW5qZWN0aW9uTWFuYWdlciwgYm9vdHN0cmFwQmFnKSk7CisgICAgICAgIGluamVjdGlvbk1hbmFnZXIuY29tcGxldGVSZWdpc3RyYXRpb24oKTsKKyAgICAgICAgYm9vdHN0cmFwQ29uZmlndXJhdG9ycy5mb3JFYWNoKGNvbmZpZ3VyZXIgLT4gY29uZmlndXJlci5wb3N0SW5pdChpbmplY3Rpb25NYW5hZ2VyLCBib290c3RyYXBCYWcpKTsKKyAgICAgICAgcmV0dXJuIGJvb3RzdHJhcEJhZzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9pbnRlcm5hbC9DaGlsZFJlc291cmNlVGVzdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvaW50ZXJuYWwvQ2hpbGRSZXNvdXJjZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjBhMWRjCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvaW50ZXJuYWwvQ2hpbGRSZXNvdXJjZVRlc3QuamF2YQpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLkluZmxlY3RvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVxdWVzdENvbnRleHRCdWlsZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudXJpLlBhdGhQYXR0ZXJuOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBDaGlsZFJlc291cmNlVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSb290UmVzb3VyY2UoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbkhhbmRsZXIgPSBjcmVhdGVBcHBsaWNhdGlvbigpOworICAgICAgICBmaW5hbCBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IGFwcGxpY2F0aW9uSGFuZGxlci5hcHBseShSZXF1ZXN0Q29udGV4dEJ1aWxkZXIuZnJvbSgiL3Jvb3QiLCAiR0VUIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJyb290LWdldCIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDaGlsZFJlc291cmNlKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwbGljYXRpb25IYW5kbGVyID0gY3JlYXRlQXBwbGljYXRpb24oKTsKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBhcHBsaWNhdGlvbkhhbmRsZXIuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9yb290L2NoaWxkIiwKKyAgICAgICAgICAgICAgICAiR0VUIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzdWItZ2V0IiwgcmVzcG9uc2UuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFub3RoZXJDaGlsZFJlc291cmNlKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwbGljYXRpb25IYW5kbGVyID0gY3JlYXRlQXBwbGljYXRpb24oKTsKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBhcHBsaWNhdGlvbkhhbmRsZXIuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20oIi9yb290L2Fub3RoZXItY2hpbGQiLAorICAgICAgICAgICAgICAgICJHRVQiKS5idWlsZCgpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFub3RoZXItY2hpbGQtZ2V0IiwgcmVzcG9uc2UuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIHByaXZhdGUgQXBwbGljYXRpb25IYW5kbGVyIGNyZWF0ZUFwcGxpY2F0aW9uKCkgeworICAgICAgICBmaW5hbCBSZXNvdXJjZS5CdWlsZGVyIHJvb3RCdWlsZGVyID0gUmVzb3VyY2UuYnVpbGRlcigicm9vdCIpOworCisgICAgICAgIHJvb3RCdWlsZGVyLmFkZE1ldGhvZCgiR0VUIikuaGFuZGxlZEJ5KG5ldyBJbmZsZWN0b3I8Q29udGFpbmVyUmVxdWVzdENvbnRleHQsIFN0cmluZz4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgYXBwbHkoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gInJvb3QtZ2V0IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgcm9vdEJ1aWxkZXIuYWRkQ2hpbGRSZXNvdXJjZSgiY2hpbGQiKS5hZGRNZXRob2QoIkdFVCIpLmhhbmRsZWRCeShuZXcgSW5mbGVjdG9yPENvbnRhaW5lclJlcXVlc3RDb250ZXh0LCBTdHJpbmc+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGFwcGx5KENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJzdWItZ2V0IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSkuYnVpbGQoKTsKKworICAgICAgICBSZXNvdXJjZS5CdWlsZGVyIGFub3RoZXJDaGlsZEJ1aWxkZXIgPSBSZXNvdXJjZS5idWlsZGVyKCJhbm90aGVyLWNoaWxkIik7CisgICAgICAgIGFub3RoZXJDaGlsZEJ1aWxkZXIuYWRkTWV0aG9kKCJHRVQiKS5oYW5kbGVkQnkobmV3IEluZmxlY3RvcjxDb250YWluZXJSZXF1ZXN0Q29udGV4dCwgU3RyaW5nPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBhcHBseShDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgeworICAgICAgICAgICAgICAgIHJldHVybiAiYW5vdGhlci1jaGlsZC1nZXQiOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgcm9vdEJ1aWxkZXIuYWRkQ2hpbGRSZXNvdXJjZShhbm90aGVyQ2hpbGRCdWlsZGVyLmJ1aWxkKCkpOworCisKKworICAgICAgICBSZXNvdXJjZSByZXNvdXJjZSA9IHJvb3RCdWlsZGVyLmJ1aWxkKCk7CisgICAgICAgIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKCkucmVnaXN0ZXJSZXNvdXJjZXMocmVzb3VyY2UpOworCisgICAgICAgIHJldHVybiBuZXcgQXBwbGljYXRpb25IYW5kbGVyKHJlc291cmNlQ29uZmlnKTsKKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdCgpIHsKKyAgICAgICAgcHJvY2VzcygiaHR0cDovL2xvY2FsaG9zdC97YWRhc30vYWEvZiIpOworICAgICAgICBwcm9jZXNzKCJodHRwOi8vbG9jYWxob3N0L3thYWF9L2FhL2YiKTsKKworCisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3MoU3RyaW5nIHN0cikgeworICAgICAgICBQYXRoUGF0dGVybiBwYXR0ZXJuID0gbmV3IFBhdGhQYXR0ZXJuKHN0cik7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0ZW1wbGF0ZTogIiArIHBhdHRlcm4uZ2V0VGVtcGxhdGUoKS50b1N0cmluZygpKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJwYXR0ZXJuOiAiICsgcGF0dGVybi50b1N0cmluZygpKTsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvaW50ZXJuYWwvTW9kZWxIZWxwZXJUZXN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9pbnRlcm5hbC9Nb2RlbEhlbHBlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTcyYWZmCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvaW50ZXJuYWwvTW9kZWxIZWxwZXJUZXN0LmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uSGFuZGxlcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUHJveHk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBAYXV0aG9yIENvbnN0YW50aW5vIENyb25lbWJlcmdlciAoY2Nyb25lbWJlcmdlciBhdCB5YWhvby5jb20uYnIpCisgKi8KK3B1YmxpYyBjbGFzcyBNb2RlbEhlbHBlclRlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xhc3MoKSB7CisgICAgICAgIGZpbmFsIENsYXNzIGNscyA9IE1vZGVsSGVscGVyLmdldEFubm90YXRlZFJlc291cmNlQ2xhc3MoTXlBbm5vdGF0ZWRDbGFzcy5jbGFzcyk7CisgICAgICAgIEFzc2VydC5hc3NlcnRTYW1lKE15QW5ub3RhdGVkQ2xhc3MuY2xhc3MsIGNscyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3ViQ2xhc3MoKSB7CisgICAgICAgIC8vIFNwcmluZyB3aXRoIENHTElCIHByb3hpZXMgY3JlYXRlcyBzdWItY2xhc3NlcworICAgICAgICBmaW5hbCBPYmplY3Qgb2JqID0gbmV3IE15QW5ub3RhdGVkQ2xhc3MoKSB7fTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydE5vdFNhbWUoTXlBbm5vdGF0ZWRDbGFzcy5jbGFzcywgb2JqLmdldENsYXNzKCkpOworICAgICAgICBmaW5hbCBDbGFzcyBjbHMgPSBNb2RlbEhlbHBlci5nZXRBbm5vdGF0ZWRSZXNvdXJjZUNsYXNzKG9iai5nZXRDbGFzcygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFNhbWUoTXlBbm5vdGF0ZWRDbGFzcy5jbGFzcywgY2xzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm94eUNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFNwcmluZyBjYW4gYWxzbyBjcmVhdGUgcHJveGllcyBmb3IgYmVhbnMKKyAgICAgICAgZmluYWwgT2JqZWN0IG9iaiA9IFByb3h5CisgICAgICAgICAgICAgICAgLm5ld1Byb3h5SW5zdGFuY2UoZ2V0Q2xhc3MoKS5nZXRDbGFzc0xvYWRlcigpLCBuZXcgQ2xhc3NbXSB7TXlTZXJ2aWNlSW50ZXJmYWNlLmNsYXNzfSwgbmV3IEludm9jYXRpb25IYW5kbGVyKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBpbnZva2UoZmluYWwgT2JqZWN0IHByb3h5LCBmaW5hbCBNZXRob2QgbWV0aG9kLCBmaW5hbCBPYmplY3RbXSBhcmdzKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGZpbmFsIENsYXNzIGNscyA9IE1vZGVsSGVscGVyLmdldEFubm90YXRlZFJlc291cmNlQ2xhc3Mob2JqLmdldENsYXNzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0U2FtZShNeVNlcnZpY2VJbnRlcmZhY2UuY2xhc3MsIGNscyk7CisgICAgfQorCisgICAgQFBhdGgoInRlc3QiKQorICAgIHB1YmxpYyBpbnRlcmZhY2UgTXlTZXJ2aWNlSW50ZXJmYWNlIHt9CisKKyAgICBAUGF0aCgidGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUFubm90YXRlZENsYXNzIGltcGxlbWVudHMgTXlTZXJ2aWNlSW50ZXJmYWNlIHt9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbC9pbnRlcm5hbC9SZXNvdXJjZU1ldGhvZERpc3BhdGNoZXJGYWN0b3J5VGVzdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvaW50ZXJuYWwvUmVzb3VyY2VNZXRob2REaXNwYXRjaGVyRmFjdG9yeVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjBlZGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbW9kZWwvaW50ZXJuYWwvUmVzb3VyY2VNZXRob2REaXNwYXRjaGVyRmFjdG9yeVRlc3QuamF2YQpAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlcXVlc3Q7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5UZXN0SW5qZWN0aW9uTWFuYWdlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLkludm9jYWJsZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTWV0aG9kOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1vZGVsQ29tcG9uZW50OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuaW50ZXJuYWwuUmVzb3VyY2VNZXRob2REaXNwYXRjaGVyOworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworCisvKioKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsKKyAqLworcHVibGljIGNsYXNzIFJlc291cmNlTWV0aG9kRGlzcGF0Y2hlckZhY3RvcnlUZXN0IHsKKworICAgIHByaXZhdGUgUmVzb3VyY2VNZXRob2REaXNwYXRjaGVyRmFjdG9yeSBybWRmOworICAgIHByaXZhdGUgUmVzb3VyY2VNZXRob2RJbnZvY2F0aW9uSGFuZGxlckZhY3Rvcnkgcm1paGY7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXBBcHBsaWNhdGlvbigpIHsKKyAgICAgICAgVGVzdEluamVjdGlvbk1hbmFnZXJGYWN0b3J5LkJvb3RzdHJhcFJlc3VsdCByZXN1bHQgPSBUZXN0SW5qZWN0aW9uTWFuYWdlckZhY3RvcnkuY3JlYXRlSW5qZWN0aW9uTWFuYWdlcigpOworCisgICAgICAgIExpc3Q8UmVzb3VyY2VNZXRob2REaXNwYXRjaGVyLlByb3ZpZGVyPiBwcm92aWRlcnMgPSBBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgICAgIG5ldyBWb2lkVm9pZERpc3BhdGNoZXJQcm92aWRlcihyZXN1bHQuYm9vdHN0cmFwQmFnLmdldFJlc291cmNlQ29udGV4dCgpKSwKKyAgICAgICAgICAgICAgICBuZXcgSmF2YVJlc291cmNlTWV0aG9kRGlzcGF0Y2hlclByb3ZpZGVyKHJlc3VsdC5ib290c3RyYXBCYWcuZ2V0VmFsdWVQYXJhbVByb3ZpZGVycygpKSk7CisKKyAgICAgICAgcm1kZiA9IG5ldyBSZXNvdXJjZU1ldGhvZERpc3BhdGNoZXJGYWN0b3J5KHByb3ZpZGVycyk7CisgICAgICAgIHJtaWhmID0gbmV3IFJlc291cmNlTWV0aG9kSW52b2NhdGlvbkhhbmRsZXJGYWN0b3J5KHJlc3VsdC5pbmplY3Rpb25NYW5hZ2VyKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCYXNpY0Rpc3BhdGNoZXJzKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNvdXJjZS5CdWlsZGVyIHJiID0gUmVzb3VyY2UuYnVpbGRlcigpOworCisgICAgICAgIGZpbmFsIE1ldGhvZFtdIG1ldGhvZHMgPSB0aGlzLmdldENsYXNzKCkuZ2V0RGVjbGFyZWRNZXRob2RzKCk7CisgICAgICAgIGZvciAoTWV0aG9kIG1ldGhvZCA6IG1ldGhvZHMpIHsKKyAgICAgICAgICAgIGlmIChNb2RpZmllci5pc1ByaXZhdGUobWV0aG9kLmdldE1vZGlmaWVycygpKSkgeworICAgICAgICAgICAgICAgIC8vIGNsYXNzLWJhc2VkCisgICAgICAgICAgICAgICAgcmIuYWRkTWV0aG9kKCJHRVQiKS5oYW5kbGVkQnkodGhpcy5nZXRDbGFzcygpLCBtZXRob2QpOworICAgICAgICAgICAgICAgIC8vIGluc3RhbmNlLWJhc2VkCisgICAgICAgICAgICAgICAgcmIuYWRkTWV0aG9kKCJHRVQiKS5oYW5kbGVkQnkodGhpcywgbWV0aG9kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoUmVzb3VyY2VNb2RlbENvbXBvbmVudCBjb21wb25lbnQgOiByYi5idWlsZCgpLmdldENvbXBvbmVudHMoKSkgeworICAgICAgICAgICAgaWYgKGNvbXBvbmVudCBpbnN0YW5jZW9mIFJlc291cmNlTWV0aG9kKSB7CisgICAgICAgICAgICAgICAgSW52b2NhYmxlIGludm9jYWJsZSA9ICgoUmVzb3VyY2VNZXRob2QpIGNvbXBvbmVudCkuZ2V0SW52b2NhYmxlKCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTm8gZGlzcGF0Y2hlciBmb3VuZCBmb3IgaW52b2NhYmxlICIgKyBpbnZvY2FibGUudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJtZGYuY3JlYXRlKGludm9jYWJsZSwgcm1paGYuY3JlYXRlKGludm9jYWJsZSksIG51bGwpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHZvaWRWb2lkKCkgeworICAgICAgICAvLyBkbyBub3RoaW5nCisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgdm9pZFN0cmluZygpIHsKKyAgICAgICAgLy8gZG8gbm90aGluZworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlc3BvbnNlIHZvaWRSZXNwb25zZSgpIHsKKyAgICAgICAgLy8gZG8gbm90aGluZworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc3RyaW5nVm9pZChTdHJpbmcgcykgeworICAgICAgICAvLyBkbyBub3RoaW5nCisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgc3RyaW5nU3RyaW5nKFN0cmluZyBzKSB7CisgICAgICAgIC8vIGRvIG5vdGhpbmcKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlcXVlc3RWb2lkKFJlcXVlc3QgcykgeworICAgICAgICAvLyBkbyBub3RoaW5nCisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVxdWVzdFN0cmluZyhSZXF1ZXN0IHMpIHsKKyAgICAgICAgLy8gZG8gbm90aGluZworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlc3BvbnNlIHJlcXVlc3RSZXNwb25zZShSZXF1ZXN0IHMpIHsKKyAgICAgICAgLy8gZG8gbm90aGluZworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbGFwaS9hbm5vdGF0aW9uL0ludHJvc3BlY3Rpb25Nb2RlbGxlclRlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vZGVsYXBpL2Fubm90YXRpb24vSW50cm9zcGVjdGlvbk1vZGVsbGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NGVjNzcKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb2RlbGFwaS9hbm5vdGF0aW9uL0ludHJvc3BlY3Rpb25Nb2RlbGxlclRlc3QuamF2YQpAQCAtMCwwICsxLDIwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWxhcGkuYW5ub3RhdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5IZWFkZXJQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUGFyYW1ldGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNZXRob2Q7CisKK2ltcG9ydCBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnM7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEludHJvc3BlY3Rpb25Nb2RlbGxlclRlc3QgeworCisgICAgc3RhdGljIFN0cmluZyBkYXRhOworCisgICAgQFBhdGgoIi9oZWxsb3dvcmxkIikKKyAgICBAUHJvZHVjZXMoIiBhL2IsIGMvZCAiKQorICAgIEBDb25zdW1lcyh7ImUvZixnL2giLCAiIGkvaiJ9KQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSGVsbG9Xb3JsZFJlc291cmNlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBAQ29uc3VtZXMoIiBhL2IsIGMvZCAiKQorICAgICAgICBAUHJvZHVjZXMoeyJlL2YsZy9oIiwgIiBpL2oifSkKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0QShmaW5hbCBTdHJpbmcgZGF0YSkgeworICAgICAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3RCKGZpbmFsIFN0cmluZyBkYXRhKSB7CisgICAgICAgICAgICByZXR1cm4gZGF0YTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvb3RoZXIve3BhdGh9IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE90aGVyUmVzb3VyY2UgeworCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHF1ZXJ5UGFyYW07CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRRdWVyeVBhcmFtKCkgeworICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5UGFyYW07CisgICAgICAgIH0KKworICAgICAgICBAUXVlcnlQYXJhbSgicSIpCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFF1ZXJ5UGFyYW0oZmluYWwgU3RyaW5nIHF1ZXJ5UGFyYW0pIHsKKyAgICAgICAgICAgIHRoaXMucXVlcnlQYXJhbSA9IHF1ZXJ5UGFyYW07CisgICAgICAgIH0KKworICAgICAgICBAUGF0aFBhcmFtKCJwYXRoIikKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcGF0aFBhcmFtOworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aFBhcmFtKCkgeworICAgICAgICAgICAgcmV0dXJuIHBhdGhQYXJhbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFBhdGhQYXJhbShmaW5hbCBTdHJpbmcgcGF0aFBhcmFtKSB7CisgICAgICAgICAgICB0aGlzLnBhdGhQYXJhbSA9IHBhdGhQYXJhbTsKKyAgICAgICAgfQorCisgICAgICAgIEBDb250ZXh0CisgICAgICAgIFVyaUluZm8gdXJpSW5mbzsKKworICAgICAgICBASW5qZWN0CisgICAgICAgIHB1YmxpYyBTdHJpbmcgYW5ub3RhdGVkQnV0Tm90UGFyYW07CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBwdWJsaWMgdm9pZCBzZXRBbm5vdGF0ZWRCdXROb3RQYXJhbShmaW5hbCBTdHJpbmcgYW5ub3RhdGVkQnV0Tm90UGFyYW0pIHsKKyAgICAgICAgICAgIHRoaXMuYW5ub3RhdGVkQnV0Tm90UGFyYW0gPSBhbm5vdGF0ZWRCdXROb3RQYXJhbTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoQEhlYWRlclBhcmFtKCJoIikgU3RyaW5nIGhlYWRlclBhcmFtKSB7CisgICAgICAgICAgICByZXR1cm4gaGVhZGVyUGFyYW0gKyBkYXRhOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0KGZpbmFsIFN0cmluZyBkYXRhKSB7CisgICAgICAgICAgICByZXR1cm4gZGF0YTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBJbnRyb3NwZWN0aW9uTW9kZWxsZXJUZXN0KCkgeworICAgIH0KKworICAgIEBUZXN0CisgICAgLyoqCisgICAgICogVGVzdCBvZiBjcmVhdGVSZXNvdXJjZSBtZXRob2QsIG9mIGNsYXNzIEludHJvc3BlY3Rpb25Nb2RlbGxlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlUmVzb3VyY2UoKSB7CisgICAgICAgIENsYXNzPD8+IHJlc291cmNlQ2xhc3M7CisgICAgICAgIFJlc291cmNlIHJlc3VsdDsKKyAgICAgICAgTGlzdDxSZXNvdXJjZU1ldGhvZD4gcmVzb3VyY2VNZXRob2RzOworICAgICAgICBSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZDsKKworICAgICAgICAvLyBIZWxsb1dvcmxkUmVzb3VyY2UKKyAgICAgICAgcmVzb3VyY2VDbGFzcyA9IEhlbGxvV29ybGRSZXNvdXJjZS5jbGFzczsKKworICAgICAgICByZXN1bHQgPSBSZXNvdXJjZS5idWlsZGVyKHJlc291cmNlQ2xhc3MpLmJ1aWxkKCk7CisgICAgICAgIHJlc291cmNlTWV0aG9kcyA9IHJlc3VsdC5nZXRSZXNvdXJjZU1ldGhvZHMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG51bWJlciBvZiByZXNvdXJjZSBtZXRob2RzIGluIHRoZSByZXNvdXJjZSBtb2RlbC4iLCAyLCByZXNvdXJjZU1ldGhvZHMuc2l6ZSgpKTsKKworICAgICAgICByZXNvdXJjZU1ldGhvZCA9IGZpbmQocmVzb3VyY2VNZXRob2RzLCAicG9zdEEiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG51bWJlciBvZiBwcm9kdWNlZCBtZWRpYSB0eXBlcyBpbiB0aGUgcmVzb3VyY2UgbWV0aG9kIG1vZGVsIiwKKyAgICAgICAgICAgICAgICAzLCByZXNvdXJjZU1ldGhvZC5nZXRQcm9kdWNlZFR5cGVzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG51bWJlciBvZiBjb25zdW1lZCBtZWRpYSB0eXBlcyBpbiB0aGUgcmVzb3VyY2UgbWV0aG9kIG1vZGVsIiwKKyAgICAgICAgICAgICAgICAyLCByZXNvdXJjZU1ldGhvZC5nZXRDb25zdW1lZFR5cGVzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG51bWJlciBvZiBoYW5kbGVyIHBhcmFtZXRlcnMiLAorICAgICAgICAgICAgICAgIDAsIHJlc291cmNlTWV0aG9kLmdldEludm9jYWJsZSgpLmdldEhhbmRsZXIoKS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKworICAgICAgICByZXNvdXJjZU1ldGhvZCA9IGZpbmQocmVzb3VyY2VNZXRob2RzLCAicG9zdEIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG51bWJlciBvZiBpbmhlcml0ZWQgcHJvZHVjZWQgbWVkaWEgdHlwZXMgaW4gdGhlIHJlc291cmNlIG1ldGhvZCBtb2RlbCIsCisgICAgICAgICAgICAgICAgMiwgcmVzb3VyY2VNZXRob2QuZ2V0UHJvZHVjZWRUeXBlcygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBudW1iZXIgb2YgaW5oZXJpdGVkIGNvbnN1bWVkIG1lZGlhIHR5cGVzIGluIHRoZSByZXNvdXJjZSBtZXRob2QgbW9kZWwiLAorICAgICAgICAgICAgICAgIDMsIHJlc291cmNlTWV0aG9kLmdldENvbnN1bWVkVHlwZXMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIGhhbmRsZXIgcGFyYW1ldGVycyIsCisgICAgICAgICAgICAgICAgMCwgcmVzb3VyY2VNZXRob2QuZ2V0SW52b2NhYmxlKCkuZ2V0SGFuZGxlcigpLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworCisgICAgICAgIC8vIE90aGVyUmVzb3VyY2UKKyAgICAgICAgcmVzb3VyY2VDbGFzcyA9IE90aGVyUmVzb3VyY2UuY2xhc3M7CisKKyAgICAgICAgcmVzdWx0ID0gUmVzb3VyY2UuYnVpbGRlcihyZXNvdXJjZUNsYXNzKS5idWlsZCgpOworICAgICAgICByZXNvdXJjZU1ldGhvZHMgPSByZXN1bHQuZ2V0UmVzb3VyY2VNZXRob2RzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBudW1iZXIgb2YgcmVzb3VyY2UgbWV0aG9kcyBpbiB0aGUgcmVzb3VyY2UgbW9kZWwuIiwgMiwgcmVzb3VyY2VNZXRob2RzLnNpemUoKSk7CisKKyAgICAgICAgcmVzb3VyY2VNZXRob2QgPSBmaW5kKHJlc291cmNlTWV0aG9kcywgImdldCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIHByb2R1Y2VkIG1lZGlhIHR5cGVzIGluIHRoZSByZXNvdXJjZSBtZXRob2QgbW9kZWwiLAorICAgICAgICAgICAgICAgIDAsIHJlc291cmNlTWV0aG9kLmdldFByb2R1Y2VkVHlwZXMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIGNvbnN1bWVkIG1lZGlhIHR5cGVzIGluIHRoZSByZXNvdXJjZSBtZXRob2QgbW9kZWwiLAorICAgICAgICAgICAgICAgIDAsIHJlc291cmNlTWV0aG9kLmdldENvbnN1bWVkVHlwZXMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIGhhbmRsZXIgcGFyYW1ldGVycyIsCisgICAgICAgICAgICAgICAgNSwgcmVzb3VyY2VNZXRob2QuZ2V0SW52b2NhYmxlKCkuZ2V0SGFuZGxlcigpLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRTb3VyY2VzKHJlc291cmNlTWV0aG9kLmdldEludm9jYWJsZSgpLmdldEhhbmRsZXIoKS5nZXRQYXJhbWV0ZXJzKCksCisgICAgICAgICAgICAgICAgUGFyYW1ldGVyLlNvdXJjZS5DT05URVhULAorICAgICAgICAgICAgICAgIFBhcmFtZXRlci5Tb3VyY2UuUEFUSCwKKyAgICAgICAgICAgICAgICBQYXJhbWV0ZXIuU291cmNlLlFVRVJZLAorICAgICAgICAgICAgICAgIFBhcmFtZXRlci5Tb3VyY2UuVU5LTk9XTiwgLy8gQEluamVjdCBvbiBmaWVsZAorICAgICAgICAgICAgICAgIFBhcmFtZXRlci5Tb3VyY2UuVU5LTk9XTik7ICAvLyBASW5qZWN0IG9uIHNldHRlcgorCisgICAgICAgIHJlc291cmNlTWV0aG9kID0gZmluZChyZXNvdXJjZU1ldGhvZHMsICJwb3N0Iik7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBudW1iZXIgb2YgaW5oZXJpdGVkIHByb2R1Y2VkIG1lZGlhIHR5cGVzIGluIHRoZSByZXNvdXJjZSBtZXRob2QgbW9kZWwiLAorICAgICAgICAgICAgICAgIDAsIHJlc291cmNlTWV0aG9kLmdldFByb2R1Y2VkVHlwZXMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIGluaGVyaXRlZCBjb25zdW1lZCBtZWRpYSB0eXBlcyBpbiB0aGUgcmVzb3VyY2UgbWV0aG9kIG1vZGVsIiwKKyAgICAgICAgICAgICAgICAwLCByZXNvdXJjZU1ldGhvZC5nZXRDb25zdW1lZFR5cGVzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG51bWJlciBvZiBoYW5kbGVyIHBhcmFtZXRlcnMiLAorICAgICAgICAgICAgICAgIDUsIHJlc291cmNlTWV0aG9kLmdldEludm9jYWJsZSgpLmdldEhhbmRsZXIoKS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0U291cmNlcyhyZXNvdXJjZU1ldGhvZC5nZXRJbnZvY2FibGUoKS5nZXRIYW5kbGVyKCkuZ2V0UGFyYW1ldGVycygpLAorICAgICAgICAgICAgICAgIFBhcmFtZXRlci5Tb3VyY2UuQ09OVEVYVCwKKyAgICAgICAgICAgICAgICBQYXJhbWV0ZXIuU291cmNlLlBBVEgsCisgICAgICAgICAgICAgICAgUGFyYW1ldGVyLlNvdXJjZS5RVUVSWSwKKyAgICAgICAgICAgICAgICBQYXJhbWV0ZXIuU291cmNlLlVOS05PV04sIC8vIEBJbmplY3Qgb24gZmllbGQKKyAgICAgICAgICAgICAgICBQYXJhbWV0ZXIuU291cmNlLlVOS05PV04pOyAgLy8gQEluamVjdCBvbiBzZXR0ZXIKKyAgICB9CisKKyAgICBwcml2YXRlIFJlc291cmNlTWV0aG9kIGZpbmQoTGlzdDxSZXNvdXJjZU1ldGhvZD4gbWV0aG9kcywgU3RyaW5nIGphdmFNZXRob2ROYW1lKSB7CisgICAgICAgIGZvciAoUmVzb3VyY2VNZXRob2QgbWV0aG9kIDogbWV0aG9kcykgeworICAgICAgICAgICAgaWYgKG1ldGhvZC5nZXRJbnZvY2FibGUoKS5nZXRIYW5kbGluZ01ldGhvZCgpLmdldE5hbWUoKS5lcXVhbHMoamF2YU1ldGhvZE5hbWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1ldGhvZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRTb3VyY2VzKENvbGxlY3Rpb248UGFyYW1ldGVyPiBwYXJhbWV0ZXJzLCBQYXJhbWV0ZXIuU291cmNlLi4uIHNvdXJjZXMpIHsKKyAgICAgICAgYXNzZXJ0VGhhdCgiRXhwZWN0ZWQgc291cmNlcyBub3QgZm91bmQgaW4gdGhlIGNvbGxlY3Rpb24iLAorICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMuc3RyZWFtKCkubWFwKFBhcmFtZXRlcjo6Z2V0U291cmNlKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpLAorICAgICAgICAgICAgICAgIE1hdGNoZXJzLmNvbnRhaW5zSW5BbnlPcmRlcihzb3VyY2VzKQorICAgICAgICApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL21vbml0b3JpbmcvTW9uaXRvcmluZ0ZlYXR1cmVUZXN0LmphdmEgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb25pdG9yaW5nL01vbml0b3JpbmdGZWF0dXJlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhMWQ1OGIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tb25pdG9yaW5nL01vbml0b3JpbmdGZWF0dXJlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjY1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLm1vbml0b3JpbmcuQXBwbGljYXRpb25JbmZvTGlzdGVuZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLm1vbml0b3JpbmcuTW9uaXRvcmluZ0V2ZW50TGlzdGVuZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLm1vbml0b3JpbmcuTW9uaXRvcmluZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLm1vbml0b3Jpbmcuam14Lk1CZWFuRXhwb3NlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGVzdCBvZiByZWdpc3RyYXRpb24gb2Yge0BsaW5rIE1vbml0b3JpbmdGZWF0dXJlfS4KKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBNb25pdG9yaW5nRmVhdHVyZVRlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhdGlzdGljc0VuYWJsZWQoKSB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKCk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVyKE1vbml0b3JpbmdGZWF0dXJlLmNsYXNzKTsKKyAgICAgICAgZmluYWwgQXBwbGljYXRpb25IYW5kbGVyIGFwcGxpY2F0aW9uSGFuZGxlciA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIocmVzb3VyY2VDb25maWcpOworCisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIGNvbmZpZyA9IGFwcGxpY2F0aW9uSGFuZGxlci5nZXRDb25maWd1cmF0aW9uKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGNvbmZpZy5pc1JlZ2lzdGVyZWQoQXBwbGljYXRpb25JbmZvTGlzdGVuZXIuY2xhc3MpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoY29uZmlnLmlzUmVnaXN0ZXJlZChNb25pdG9yaW5nRXZlbnRMaXN0ZW5lci5jbGFzcykpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoY29uZmlnLmlzUmVnaXN0ZXJlZChNQmVhbkV4cG9zZXIuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNb25pdG9yaW5nRGlzYWJsZWQoKSB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKCk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVyKE1vbml0b3JpbmdGZWF0dXJlLmNsYXNzKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5NT05JVE9SSU5HX0VOQUJMRUQsIGZhbHNlKTsKKyAgICAgICAgZmluYWwgQXBwbGljYXRpb25IYW5kbGVyIGFwcGxpY2F0aW9uSGFuZGxlciA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIocmVzb3VyY2VDb25maWcpOworCisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIGNvbmZpZyA9IGFwcGxpY2F0aW9uSGFuZGxlci5nZXRDb25maWd1cmF0aW9uKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShjb25maWcuaXNSZWdpc3RlcmVkKEFwcGxpY2F0aW9uSW5mb0xpc3RlbmVyLmNsYXNzKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShjb25maWcuaXNSZWdpc3RlcmVkKE1vbml0b3JpbmdFdmVudExpc3RlbmVyLmNsYXNzKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShjb25maWcuaXNSZWdpc3RlcmVkKE1CZWFuRXhwb3Nlci5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YXRpc3RpY3NEaXNhYmxlZCgpIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucmVnaXN0ZXIoTW9uaXRvcmluZ0ZlYXR1cmUuY2xhc3MpOworICAgICAgICByZXNvdXJjZUNvbmZpZy5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLk1PTklUT1JJTkdfU1RBVElTVElDU19FTkFCTEVELCBmYWxzZSk7CisgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbkhhbmRsZXIgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKHJlc291cmNlQ29uZmlnKTsKKworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyBjb25maWcgPSBhcHBsaWNhdGlvbkhhbmRsZXIuZ2V0Q29uZmlndXJhdGlvbigpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShjb25maWcuaXNSZWdpc3RlcmVkKEFwcGxpY2F0aW9uSW5mb0xpc3RlbmVyLmNsYXNzKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShjb25maWcuaXNSZWdpc3RlcmVkKE1vbml0b3JpbmdFdmVudExpc3RlbmVyLmNsYXNzKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShjb25maWcuaXNSZWdpc3RlcmVkKE1CZWFuRXhwb3Nlci5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1vbml0b3JpbmdFbmFibGVkQnlBdXRvZGlzY292ZXJ5KCkgeworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZygpOworICAgICAgICByZXNvdXJjZUNvbmZpZy5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLk1PTklUT1JJTkdfRU5BQkxFRCwgdHJ1ZSk7CisgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbkhhbmRsZXIgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKHJlc291cmNlQ29uZmlnKTsKKworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyBjb25maWcgPSBhcHBsaWNhdGlvbkhhbmRsZXIuZ2V0Q29uZmlndXJhdGlvbigpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShjb25maWcuaXNSZWdpc3RlcmVkKEFwcGxpY2F0aW9uSW5mb0xpc3RlbmVyLmNsYXNzKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGNvbmZpZy5pc1JlZ2lzdGVyZWQoTW9uaXRvcmluZ0V2ZW50TGlzdGVuZXIuY2xhc3MpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKGNvbmZpZy5pc1JlZ2lzdGVyZWQoTUJlYW5FeHBvc2VyLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TW9uaXRvcmluZ0VuYWJsZWRTdGF0aXN0aWNzRGlzYWJsZWRCeUF1dG9kaXNjb3ZlcnkoKSB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKCk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuTU9OSVRPUklOR19FTkFCTEVELCB0cnVlKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5NT05JVE9SSU5HX1NUQVRJU1RJQ1NfRU5BQkxFRCwgZmFsc2UpOworICAgICAgICBmaW5hbCBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwbGljYXRpb25IYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihyZXNvdXJjZUNvbmZpZyk7CisKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgY29uZmlnID0gYXBwbGljYXRpb25IYW5kbGVyLmdldENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoY29uZmlnLmlzUmVnaXN0ZXJlZChBcHBsaWNhdGlvbkluZm9MaXN0ZW5lci5jbGFzcykpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoY29uZmlnLmlzUmVnaXN0ZXJlZChNb25pdG9yaW5nRXZlbnRMaXN0ZW5lci5jbGFzcykpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoY29uZmlnLmlzUmVnaXN0ZXJlZChNQmVhbkV4cG9zZXIuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGF0aXN0aWNzRW5hYmxlZEJ5QXV0b2Rpc2NvdmVyeSgpIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5NT05JVE9SSU5HX1NUQVRJU1RJQ1NfRU5BQkxFRCwgdHJ1ZSk7CisgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbkhhbmRsZXIgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKHJlc291cmNlQ29uZmlnKTsKKworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyBjb25maWcgPSBhcHBsaWNhdGlvbkhhbmRsZXIuZ2V0Q29uZmlndXJhdGlvbigpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShjb25maWcuaXNSZWdpc3RlcmVkKEFwcGxpY2F0aW9uSW5mb0xpc3RlbmVyLmNsYXNzKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGNvbmZpZy5pc1JlZ2lzdGVyZWQoTW9uaXRvcmluZ0V2ZW50TGlzdGVuZXIuY2xhc3MpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKGNvbmZpZy5pc1JlZ2lzdGVyZWQoTUJlYW5FeHBvc2VyLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RhdGlzdGljc0Rpc2FibGVkQnlBdXRvZGlzY292ZXJ5KCkgeworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZygpOworICAgICAgICByZXNvdXJjZUNvbmZpZy5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLk1PTklUT1JJTkdfU1RBVElTVElDU19FTkFCTEVELCBmYWxzZSk7CisgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbkhhbmRsZXIgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKHJlc291cmNlQ29uZmlnKTsKKworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyBjb25maWcgPSBhcHBsaWNhdGlvbkhhbmRsZXIuZ2V0Q29uZmlndXJhdGlvbigpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoY29uZmlnLmlzUmVnaXN0ZXJlZChBcHBsaWNhdGlvbkluZm9MaXN0ZW5lci5jbGFzcykpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoY29uZmlnLmlzUmVnaXN0ZXJlZChNb25pdG9yaW5nRXZlbnRMaXN0ZW5lci5jbGFzcykpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoY29uZmlnLmlzUmVnaXN0ZXJlZChNQmVhbkV4cG9zZXIuY2xhc3MpKTsKKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YXRpc3RpY3NFbmFibGVkTWJlYW5zRW5hYmxlZEJ5SW5zdGFuY2UoKSB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKCk7CisgICAgICAgIGZpbmFsIE1vbml0b3JpbmdGZWF0dXJlIG1vbml0b3JpbmdGZWF0dXJlID0gbmV3IE1vbml0b3JpbmdGZWF0dXJlKCk7CisgICAgICAgIG1vbml0b3JpbmdGZWF0dXJlLnNldG1CZWFuc0VuYWJsZWQodHJ1ZSk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVyKG1vbml0b3JpbmdGZWF0dXJlKTsKKyAgICAgICAgZmluYWwgQXBwbGljYXRpb25IYW5kbGVyIGFwcGxpY2F0aW9uSGFuZGxlciA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIocmVzb3VyY2VDb25maWcpOworCisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIGNvbmZpZyA9IGFwcGxpY2F0aW9uSGFuZGxlci5nZXRDb25maWd1cmF0aW9uKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGNvbmZpZy5pc1JlZ2lzdGVyZWQoQXBwbGljYXRpb25JbmZvTGlzdGVuZXIuY2xhc3MpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoY29uZmlnLmlzUmVnaXN0ZXJlZChNb25pdG9yaW5nRXZlbnRMaXN0ZW5lci5jbGFzcykpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShjb25maWcuaXNSZWdpc3RlcmVkKE1CZWFuRXhwb3Nlci5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YXRpc3RpY3NFbmFibGVkTWJlYW5zRW5hYmxlZEJ5SW5zdGFuY2UyKCkgeworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZygpOworICAgICAgICBmaW5hbCBNb25pdG9yaW5nRmVhdHVyZSBtb25pdG9yaW5nRmVhdHVyZSA9IG5ldyBNb25pdG9yaW5nRmVhdHVyZSgpOworICAgICAgICBtb25pdG9yaW5nRmVhdHVyZS5zZXRtQmVhbnNFbmFibGVkKHRydWUpOworICAgICAgICByZXNvdXJjZUNvbmZpZy5yZWdpc3Rlcihtb25pdG9yaW5nRmVhdHVyZSk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuTU9OSVRPUklOR19TVEFUSVNUSUNTX01CRUFOU19FTkFCTEVELCBmYWxzZSk7CisgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbkhhbmRsZXIgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKHJlc291cmNlQ29uZmlnKTsKKworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyBjb25maWcgPSBhcHBsaWNhdGlvbkhhbmRsZXIuZ2V0Q29uZmlndXJhdGlvbigpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShjb25maWcuaXNSZWdpc3RlcmVkKEFwcGxpY2F0aW9uSW5mb0xpc3RlbmVyLmNsYXNzKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGNvbmZpZy5pc1JlZ2lzdGVyZWQoTW9uaXRvcmluZ0V2ZW50TGlzdGVuZXIuY2xhc3MpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKGNvbmZpZy5pc1JlZ2lzdGVyZWQoTUJlYW5FeHBvc2VyLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWxsRGlzYWJsZWQoKSB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKCk7CisgICAgICAgIGZpbmFsIE1vbml0b3JpbmdGZWF0dXJlIG1vbml0b3JpbmdGZWF0dXJlID0gbmV3IE1vbml0b3JpbmdGZWF0dXJlKCk7CisgICAgICAgIG1vbml0b3JpbmdGZWF0dXJlLnNldG1CZWFuc0VuYWJsZWQodHJ1ZSk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVyKG1vbml0b3JpbmdGZWF0dXJlKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5NT05JVE9SSU5HX1NUQVRJU1RJQ1NfTUJFQU5TX0VOQUJMRUQsIGZhbHNlKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5NT05JVE9SSU5HX1NUQVRJU1RJQ1NfRU5BQkxFRCwgZmFsc2UpOworICAgICAgICBmaW5hbCBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwbGljYXRpb25IYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihyZXNvdXJjZUNvbmZpZyk7CisKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgY29uZmlnID0gYXBwbGljYXRpb25IYW5kbGVyLmdldENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoY29uZmlnLmlzUmVnaXN0ZXJlZChBcHBsaWNhdGlvbkluZm9MaXN0ZW5lci5jbGFzcykpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoY29uZmlnLmlzUmVnaXN0ZXJlZChNb25pdG9yaW5nRXZlbnRMaXN0ZW5lci5jbGFzcykpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoY29uZmlnLmlzUmVnaXN0ZXJlZChNQmVhbkV4cG9zZXIuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBbGxEaXNhYmxlZDIoKSB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKCk7CisgICAgICAgIGZpbmFsIE1vbml0b3JpbmdGZWF0dXJlIG1vbml0b3JpbmdGZWF0dXJlID0gbmV3IE1vbml0b3JpbmdGZWF0dXJlKCk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVyKG1vbml0b3JpbmdGZWF0dXJlKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5NT05JVE9SSU5HX1NUQVRJU1RJQ1NfTUJFQU5TX0VOQUJMRUQsIGZhbHNlKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5NT05JVE9SSU5HX1NUQVRJU1RJQ1NfRU5BQkxFRCwgZmFsc2UpOworICAgICAgICBmaW5hbCBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwbGljYXRpb25IYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihyZXNvdXJjZUNvbmZpZyk7CisKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgY29uZmlnID0gYXBwbGljYXRpb25IYW5kbGVyLmdldENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoY29uZmlnLmlzUmVnaXN0ZXJlZChBcHBsaWNhdGlvbkluZm9MaXN0ZW5lci5jbGFzcykpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoY29uZmlnLmlzUmVnaXN0ZXJlZChNb25pdG9yaW5nRXZlbnRMaXN0ZW5lci5jbGFzcykpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoY29uZmlnLmlzUmVnaXN0ZXJlZChNQmVhbkV4cG9zZXIuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBbGxEaXNhYmxlZDMoKSB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKCk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuTU9OSVRPUklOR19TVEFUSVNUSUNTX01CRUFOU19FTkFCTEVELCBmYWxzZSk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuTU9OSVRPUklOR19TVEFUSVNUSUNTX0VOQUJMRUQsIGZhbHNlKTsKKyAgICAgICAgZmluYWwgQXBwbGljYXRpb25IYW5kbGVyIGFwcGxpY2F0aW9uSGFuZGxlciA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIocmVzb3VyY2VDb25maWcpOworCisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIGNvbmZpZyA9IGFwcGxpY2F0aW9uSGFuZGxlci5nZXRDb25maWd1cmF0aW9uKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShjb25maWcuaXNSZWdpc3RlcmVkKEFwcGxpY2F0aW9uSW5mb0xpc3RlbmVyLmNsYXNzKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShjb25maWcuaXNSZWdpc3RlcmVkKE1vbml0b3JpbmdFdmVudExpc3RlbmVyLmNsYXNzKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShjb25maWcuaXNSZWdpc3RlcmVkKE1CZWFuRXhwb3Nlci5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFsbEVuYWJsZWQoKSB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKCk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuTU9OSVRPUklOR19TVEFUSVNUSUNTX01CRUFOU19FTkFCTEVELCB0cnVlKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5NT05JVE9SSU5HX1NUQVRJU1RJQ1NfRU5BQkxFRCwgdHJ1ZSk7CisgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbkhhbmRsZXIgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKHJlc291cmNlQ29uZmlnKTsKKworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyBjb25maWcgPSBhcHBsaWNhdGlvbkhhbmRsZXIuZ2V0Q29uZmlndXJhdGlvbigpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShjb25maWcuaXNSZWdpc3RlcmVkKEFwcGxpY2F0aW9uSW5mb0xpc3RlbmVyLmNsYXNzKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGNvbmZpZy5pc1JlZ2lzdGVyZWQoTW9uaXRvcmluZ0V2ZW50TGlzdGVuZXIuY2xhc3MpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoY29uZmlnLmlzUmVnaXN0ZXJlZChNQmVhbkV4cG9zZXIuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBbGxFbmFibGVkMigpIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5NT05JVE9SSU5HX1NUQVRJU1RJQ1NfTUJFQU5TX0VOQUJMRUQsIHRydWUpOworICAgICAgICByZXNvdXJjZUNvbmZpZy5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLk1PTklUT1JJTkdfU1RBVElTVElDU19FTkFCTEVELCB0cnVlKTsKKyAgICAgICAgZmluYWwgTW9uaXRvcmluZ0ZlYXR1cmUgbW9uaXRvcmluZ0ZlYXR1cmUgPSBuZXcgTW9uaXRvcmluZ0ZlYXR1cmUoKTsKKyAgICAgICAgbW9uaXRvcmluZ0ZlYXR1cmUuc2V0bUJlYW5zRW5hYmxlZChmYWxzZSk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVyKG1vbml0b3JpbmdGZWF0dXJlKTsKKyAgICAgICAgZmluYWwgQXBwbGljYXRpb25IYW5kbGVyIGFwcGxpY2F0aW9uSGFuZGxlciA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIocmVzb3VyY2VDb25maWcpOworCisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIGNvbmZpZyA9IGFwcGxpY2F0aW9uSGFuZGxlci5nZXRDb25maWd1cmF0aW9uKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGNvbmZpZy5pc1JlZ2lzdGVyZWQoQXBwbGljYXRpb25JbmZvTGlzdGVuZXIuY2xhc3MpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoY29uZmlnLmlzUmVnaXN0ZXJlZChNb25pdG9yaW5nRXZlbnRMaXN0ZW5lci5jbGFzcykpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShjb25maWcuaXNSZWdpc3RlcmVkKE1CZWFuRXhwb3Nlci5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9ubHlNQmVhbnNFbmFibGVkKCkgeworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZygpOworICAgICAgICByZXNvdXJjZUNvbmZpZy5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLk1PTklUT1JJTkdfU1RBVElTVElDU19NQkVBTlNfRU5BQkxFRCwgdHJ1ZSk7CisgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbkhhbmRsZXIgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKHJlc291cmNlQ29uZmlnKTsKKworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyBjb25maWcgPSBhcHBsaWNhdGlvbkhhbmRsZXIuZ2V0Q29uZmlndXJhdGlvbigpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShjb25maWcuaXNSZWdpc3RlcmVkKEFwcGxpY2F0aW9uSW5mb0xpc3RlbmVyLmNsYXNzKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGNvbmZpZy5pc1JlZ2lzdGVyZWQoTW9uaXRvcmluZ0V2ZW50TGlzdGVuZXIuY2xhc3MpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoY29uZmlnLmlzUmVnaXN0ZXJlZChNQmVhbkV4cG9zZXIuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPbmx5TUJlYW5zRW5hYmxlZDIoKSB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKCk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuTU9OSVRPUklOR19TVEFUSVNUSUNTX01CRUFOU19FTkFCTEVELCB0cnVlKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5NT05JVE9SSU5HX1NUQVRJU1RJQ1NfRU5BQkxFRCwgZmFsc2UpOworICAgICAgICBmaW5hbCBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwbGljYXRpb25IYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihyZXNvdXJjZUNvbmZpZyk7CisKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgY29uZmlnID0gYXBwbGljYXRpb25IYW5kbGVyLmdldENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoY29uZmlnLmlzUmVnaXN0ZXJlZChBcHBsaWNhdGlvbkluZm9MaXN0ZW5lci5jbGFzcykpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShjb25maWcuaXNSZWdpc3RlcmVkKE1vbml0b3JpbmdFdmVudExpc3RlbmVyLmNsYXNzKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGNvbmZpZy5pc1JlZ2lzdGVyZWQoTUJlYW5FeHBvc2VyLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25seU1CZWFuc0VuYWJsZWQzKCkgeworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZygpOworICAgICAgICByZXNvdXJjZUNvbmZpZy5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLk1PTklUT1JJTkdfU1RBVElTVElDU19NQkVBTlNfRU5BQkxFRCwgdHJ1ZSk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuTU9OSVRPUklOR19TVEFUSVNUSUNTX0VOQUJMRUQsIGZhbHNlKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucmVnaXN0ZXIobmV3IE1vbml0b3JpbmdGZWF0dXJlKCkpOworICAgICAgICBmaW5hbCBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwbGljYXRpb25IYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihyZXNvdXJjZUNvbmZpZyk7CisKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgY29uZmlnID0gYXBwbGljYXRpb25IYW5kbGVyLmdldENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoY29uZmlnLmlzUmVnaXN0ZXJlZChBcHBsaWNhdGlvbkluZm9MaXN0ZW5lci5jbGFzcykpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShjb25maWcuaXNSZWdpc3RlcmVkKE1vbml0b3JpbmdFdmVudExpc3RlbmVyLmNsYXNzKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGNvbmZpZy5pc1JlZ2lzdGVyZWQoTUJlYW5FeHBvc2VyLmNsYXNzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9jb25maWcvV2FkbEdlbmVyYXRvckNvbmZpZ1Rlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvY29uZmlnL1dhZGxHZW5lcmF0b3JDb25maWdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFhNTllOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvY29uZmlnL1dhZGxHZW5lcmF0b3JDb25maWdUZXN0LmphdmEKQEAgLTAsMCArMSwyODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKKy8qCisgKiBUbyBjaGFuZ2UgdGhpcyB0ZW1wbGF0ZSwgY2hvb3NlIFRvb2xzIHwgVGVtcGxhdGVzCisgKiBhbmQgb3BlbiB0aGUgdGVtcGxhdGUgaW4gdGhlIGVkaXRvci4KKyAqLworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5jb25maWc7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlRlc3RJbmplY3Rpb25NYW5hZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUGFyYW1ldGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1ldGhvZDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5XYWRsR2VuZXJhdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLmludGVybmFsLkFwcGxpY2F0aW9uRGVzY3JpcHRpb247CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgY29tLnN1bi5yZXNlYXJjaC53cy53YWRsLkFwcGxpY2F0aW9uOworaW1wb3J0IGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5NZXRob2Q7CitpbXBvcnQgY29tLnN1bi5yZXNlYXJjaC53cy53YWRsLlBhcmFtOworaW1wb3J0IGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5SZXByZXNlbnRhdGlvbjsKK2ltcG9ydCBjb20uc3VuLnJlc2VhcmNoLndzLndhZGwuUmVxdWVzdDsKK2ltcG9ydCBjb20uc3VuLnJlc2VhcmNoLndzLndhZGwuUmVzb3VyY2U7CitpbXBvcnQgY29tLnN1bi5yZXNlYXJjaC53cy53YWRsLlJlc291cmNlczsKK2ltcG9ydCBjb20uc3VuLnJlc2VhcmNoLndzLndhZGwuUmVzcG9uc2U7CisKKy8qKgorICogVE9ETzogREVTQ1JJQkUgTUU8YnI+CisgKiBDcmVhdGVkIG9uOiBBdWcgMiwgMjAwODxicj4KKyAqCisgKiBAYXV0aG9yIDxhIGhyZWY9Im1haWx0bzptYXJ0aW4uZ3JvdHprZUBmcmVpaGVpdC5jb20iPk1hcnRpbiBHcm90emtlPC9hPgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorCisgKi8KK3B1YmxpYyBjbGFzcyBXYWRsR2VuZXJhdG9yQ29uZmlnVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCdWlsZFdhZGxHZW5lcmF0b3JGcm9tR2VuZXJhdG9ycygpIHsKKyAgICAgICAgZmluYWwgQ2xhc3M8TXlXYWRsR2VuZXJhdG9yPiBnZW5lcmF0b3IgPSBNeVdhZGxHZW5lcmF0b3IuY2xhc3M7CisgICAgICAgIGZpbmFsIENsYXNzPE15V2FkbEdlbmVyYXRvcjI+IGdlbmVyYXRvcjIgPSBNeVdhZGxHZW5lcmF0b3IyLmNsYXNzOworICAgICAgICBXYWRsR2VuZXJhdG9yQ29uZmlnIGNvbmZpZyA9IFdhZGxHZW5lcmF0b3JDb25maWcKKyAgICAgICAgICAgICAgICAuZ2VuZXJhdG9yKGdlbmVyYXRvcikKKyAgICAgICAgICAgICAgICAuZ2VuZXJhdG9yKGdlbmVyYXRvcjIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAgICAgVGVzdEluamVjdGlvbk1hbmFnZXJGYWN0b3J5LkJvb3RzdHJhcFJlc3VsdCByZXN1bHQgPSBUZXN0SW5qZWN0aW9uTWFuYWdlckZhY3RvcnkuY3JlYXRlSW5qZWN0aW9uTWFuYWdlcigpOworICAgICAgICBXYWRsR2VuZXJhdG9yIHdhZGxHZW5lcmF0b3IgPSBjb25maWcuY3JlYXRlV2FkbEdlbmVyYXRvcihyZXN1bHQuaW5qZWN0aW9uTWFuYWdlcik7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhNeVdhZGxHZW5lcmF0b3IyLmNsYXNzLCB3YWRsR2VuZXJhdG9yLmdldENsYXNzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKE15V2FkbEdlbmVyYXRvci5jbGFzcywgKChNeVdhZGxHZW5lcmF0b3IyKSB3YWRsR2VuZXJhdG9yKS5nZXREZWxlZ2F0ZSgpLmdldENsYXNzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ1aWxkV2FkbEdlbmVyYXRvckZyb21EZXNjcmlwdGlvbnMoKSB7CisgICAgICAgIFRlc3RJbmplY3Rpb25NYW5hZ2VyRmFjdG9yeS5Cb290c3RyYXBSZXN1bHQgcmVzdWx0ID0gVGVzdEluamVjdGlvbk1hbmFnZXJGYWN0b3J5LmNyZWF0ZUluamVjdGlvbk1hbmFnZXIoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHByb3BWYWx1ZSA9ICJiYXIiOworICAgICAgICBXYWRsR2VuZXJhdG9yQ29uZmlnIGNvbmZpZyA9IFdhZGxHZW5lcmF0b3JDb25maWcuZ2VuZXJhdG9yKE15V2FkbEdlbmVyYXRvci5jbGFzcykKKyAgICAgICAgICAgICAgICAucHJvcCgiZm9vIiwgcHJvcFZhbHVlKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICBXYWRsR2VuZXJhdG9yIHdhZGxHZW5lcmF0b3IgPSBjb25maWcuY3JlYXRlV2FkbEdlbmVyYXRvcihyZXN1bHQuaW5qZWN0aW9uTWFuYWdlcik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoTXlXYWRsR2VuZXJhdG9yLmNsYXNzLCB3YWRsR2VuZXJhdG9yLmdldENsYXNzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCgoTXlXYWRsR2VuZXJhdG9yKSB3YWRsR2VuZXJhdG9yKS5nZXRGb28oKSwgcHJvcFZhbHVlKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgcHJvcFZhbHVlMiA9ICJiYXoiOworICAgICAgICBjb25maWcgPSBXYWRsR2VuZXJhdG9yQ29uZmlnLmdlbmVyYXRvcihNeVdhZGxHZW5lcmF0b3IuY2xhc3MpCisgICAgICAgICAgICAgICAgLnByb3AoImZvbyIsIHByb3BWYWx1ZSkuZ2VuZXJhdG9yKE15V2FkbEdlbmVyYXRvcjIuY2xhc3MpCisgICAgICAgICAgICAgICAgLnByb3AoImJhciIsIHByb3BWYWx1ZTIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIHdhZGxHZW5lcmF0b3IgPSBjb25maWcuY3JlYXRlV2FkbEdlbmVyYXRvcihyZXN1bHQuaW5qZWN0aW9uTWFuYWdlcik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoTXlXYWRsR2VuZXJhdG9yMi5jbGFzcywgd2FkbEdlbmVyYXRvci5nZXRDbGFzcygpKTsKKyAgICAgICAgZmluYWwgTXlXYWRsR2VuZXJhdG9yMiB3YWRsR2VuZXJhdG9yMiA9IChNeVdhZGxHZW5lcmF0b3IyKSB3YWRsR2VuZXJhdG9yOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHdhZGxHZW5lcmF0b3IyLmdldEJhcigpLCBwcm9wVmFsdWUyKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKE15V2FkbEdlbmVyYXRvci5jbGFzcywgd2FkbEdlbmVyYXRvcjIuZ2V0RGVsZWdhdGUoKS5nZXRDbGFzcygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygoKE15V2FkbEdlbmVyYXRvcikgd2FkbEdlbmVyYXRvcjIuZ2V0RGVsZWdhdGUoKSkuZ2V0Rm9vKCksIHByb3BWYWx1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tV2FkbEdlbmVyYXRvckNvbmZpZygpIHsKKworICAgICAgICBmaW5hbCBTdHJpbmcgcHJvcFZhbHVlID0gInNvbWVWYWx1ZSI7CisgICAgICAgIGZpbmFsIFN0cmluZyBwcm9wVmFsdWUyID0gImJheiI7CisgICAgICAgIGNsYXNzIE15V2FkbEdlbmVyYXRvckNvbmZpZyBleHRlbmRzIFdhZGxHZW5lcmF0b3JDb25maWcgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBMaXN0PFdhZGxHZW5lcmF0b3JEZXNjcmlwdGlvbj4gY29uZmlndXJlKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0b3IoTXlXYWRsR2VuZXJhdG9yLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgLnByb3AoImZvbyIsIHByb3BWYWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZW5lcmF0b3IoTXlXYWRsR2VuZXJhdG9yMi5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9wKCJiYXIiLCBwcm9wVmFsdWUyKS5kZXNjcmlwdGlvbnMoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFRlc3RJbmplY3Rpb25NYW5hZ2VyRmFjdG9yeS5Cb290c3RyYXBSZXN1bHQgcmVzdWx0ID0gVGVzdEluamVjdGlvbk1hbmFnZXJGYWN0b3J5LmNyZWF0ZUluamVjdGlvbk1hbmFnZXIoKTsKKworICAgICAgICBXYWRsR2VuZXJhdG9yQ29uZmlnIGNvbmZpZyA9IG5ldyBNeVdhZGxHZW5lcmF0b3JDb25maWcoKTsKKyAgICAgICAgV2FkbEdlbmVyYXRvciB3YWRsR2VuZXJhdG9yID0gY29uZmlnLmNyZWF0ZVdhZGxHZW5lcmF0b3IocmVzdWx0LmluamVjdGlvbk1hbmFnZXIpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoTXlXYWRsR2VuZXJhdG9yMi5jbGFzcywgd2FkbEdlbmVyYXRvci5nZXRDbGFzcygpKTsKKyAgICAgICAgZmluYWwgTXlXYWRsR2VuZXJhdG9yMiB3YWRsR2VuZXJhdG9yMiA9IChNeVdhZGxHZW5lcmF0b3IyKSB3YWRsR2VuZXJhdG9yOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHdhZGxHZW5lcmF0b3IyLmdldEJhcigpLCBwcm9wVmFsdWUyKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKE15V2FkbEdlbmVyYXRvci5jbGFzcywgd2FkbEdlbmVyYXRvcjIuZ2V0RGVsZWdhdGUoKS5nZXRDbGFzcygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygoKE15V2FkbEdlbmVyYXRvcikgd2FkbEdlbmVyYXRvcjIuZ2V0RGVsZWdhdGUoKSkuZ2V0Rm9vKCksIHByb3BWYWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBCYXNlV2FkbEdlbmVyYXRvciBpbXBsZW1lbnRzIFdhZGxHZW5lcmF0b3IgeworCisgICAgICAgIHB1YmxpYyBBcHBsaWNhdGlvbiBjcmVhdGVBcHBsaWNhdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE1ldGhvZCBjcmVhdGVNZXRob2Qob3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlIHIsIFJlc291cmNlTWV0aG9kIG0pIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFJlcXVlc3QgY3JlYXRlUmVxdWVzdChvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2UgciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZU1ldGhvZCBtKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBQYXJhbSBjcmVhdGVQYXJhbShvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2UgciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlTWV0aG9kIG0sIFBhcmFtZXRlciBwKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBSZXByZXNlbnRhdGlvbiBjcmVhdGVSZXF1ZXN0UmVwcmVzZW50YXRpb24oCisgICAgICAgICAgICAgICAgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlIHIsIFJlc291cmNlTWV0aG9kIG0sCisgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUmVzb3VyY2UgY3JlYXRlUmVzb3VyY2Uob3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlIHIsIFN0cmluZyBwYXRoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBSZXNvdXJjZXMgY3JlYXRlUmVzb3VyY2VzKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTGlzdDxSZXNwb25zZT4gY3JlYXRlUmVzcG9uc2VzKG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZSByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlTWV0aG9kIG0pIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRSZXF1aXJlZEpheGJDb250ZXh0UGF0aCgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgaW5pdCgpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFdhZGxHZW5lcmF0b3JEZWxlZ2F0ZShXYWRsR2VuZXJhdG9yIGRlbGVnYXRlKSB7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEV4dGVybmFsR3JhbW1hckRlZmluaXRpb24gY3JlYXRlRXh0ZXJuYWxHcmFtbWFyKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbEdyYW1tYXJEZWZpbml0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYXR0YWNoVHlwZXMoQXBwbGljYXRpb25EZXNjcmlwdGlvbiBlZ2QpIHsKKworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVdhZGxHZW5lcmF0b3IgZXh0ZW5kcyBCYXNlV2FkbEdlbmVyYXRvciB7CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgX2ZvbzsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiB0aGUgZm9vCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEZvbygpIHsKKyAgICAgICAgICAgIHJldHVybiBfZm9vOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBwYXJhbSBmb28gdGhlIGZvbyB0byBzZXQKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEZvbyhTdHJpbmcgZm9vKSB7CisgICAgICAgICAgICBfZm9vID0gZm9vOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15V2FkbEdlbmVyYXRvcjIgZXh0ZW5kcyBCYXNlV2FkbEdlbmVyYXRvciB7CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgX2JhcjsKKyAgICAgICAgcHJpdmF0ZSBXYWRsR2VuZXJhdG9yIF9kZWxlZ2F0ZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiB0aGUgZGVsZWdhdGUKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBXYWRsR2VuZXJhdG9yIGdldERlbGVnYXRlKCkgeworICAgICAgICAgICAgcmV0dXJuIF9kZWxlZ2F0ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBmb28KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmFyKCkgeworICAgICAgICAgICAgcmV0dXJuIF9iYXI7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHBhcmFtIGZvbyB0aGUgZm9vIHRvIHNldAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0QmFyKFN0cmluZyBmb28pIHsKKyAgICAgICAgICAgIF9iYXIgPSBmb287CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRXYWRsR2VuZXJhdG9yRGVsZWdhdGUoV2FkbEdlbmVyYXRvciBkZWxlZ2F0ZSkgeworICAgICAgICAgICAgX2RlbGVnYXRlID0gZGVsZWdhdGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZvbyB7CisKKyAgICAgICAgU3RyaW5nIHM7CisKKyAgICAgICAgcHVibGljIEZvbyhTdHJpbmcgcykgeworICAgICAgICAgICAgdGhpcy5zID0gczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQmFyIHsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15V2FkbEdlbmVyYXRvcjMgZXh0ZW5kcyBCYXNlV2FkbEdlbmVyYXRvciB7CisKKyAgICAgICAgRm9vIGZvbzsKKyAgICAgICAgQmFyIGJhcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHBhcmFtIGZvbyB0aGUgZm9vIHRvIHNldAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0Rm9vKEZvbyBmb28pIHsKKyAgICAgICAgICAgIHRoaXMuZm9vID0gZm9vOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0QmFyKEJhciBiYXIpIHsKKyAgICAgICAgICAgIHRoaXMuYmFyID0gYmFyOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnVpbGRXYWRsR2VuZXJhdG9yRnJvbURlc2NyaXB0aW9uc1dpdGhUeXBlcygpIHsKKyAgICAgICAgV2FkbEdlbmVyYXRvckNvbmZpZyBjb25maWcgPSBXYWRsR2VuZXJhdG9yQ29uZmlnCisgICAgICAgICAgICAgICAgLmdlbmVyYXRvcihNeVdhZGxHZW5lcmF0b3IzLmNsYXNzKQorICAgICAgICAgICAgICAgIC5wcm9wKCJmb28iLCAic3RyaW5nIikKKyAgICAgICAgICAgICAgICAucHJvcCgiYmFyIiwgbmV3IEJhcigpKS5idWlsZCgpOworICAgICAgICBUZXN0SW5qZWN0aW9uTWFuYWdlckZhY3RvcnkuQm9vdHN0cmFwUmVzdWx0IHJlc3VsdCA9IFRlc3RJbmplY3Rpb25NYW5hZ2VyRmFjdG9yeS5jcmVhdGVJbmplY3Rpb25NYW5hZ2VyKCk7CisgICAgICAgIFdhZGxHZW5lcmF0b3Igd2FkbEdlbmVyYXRvciA9IGNvbmZpZy5jcmVhdGVXYWRsR2VuZXJhdG9yKHJlc3VsdC5pbmplY3Rpb25NYW5hZ2VyKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKE15V2FkbEdlbmVyYXRvcjMuY2xhc3MsIHdhZGxHZW5lcmF0b3IuZ2V0Q2xhc3MoKSk7CisKKyAgICAgICAgTXlXYWRsR2VuZXJhdG9yMyBnID0gKE15V2FkbEdlbmVyYXRvcjMpIHdhZGxHZW5lcmF0b3I7CisgICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGcuZm9vKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhnLmZvby5zLCAic3RyaW5nIik7CisgICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGcuYmFyKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci93YWRsL2NvbmZpZy9XYWRsR2VuZXJhdG9yQ29uZmlndXJhdGlvbkxvYWRlclRlc3QuamF2YSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvY29uZmlnL1dhZGxHZW5lcmF0b3JDb25maWd1cmF0aW9uTG9hZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4OWRjODkKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci93YWRsL2NvbmZpZy9XYWRsR2VuZXJhdG9yQ29uZmlndXJhdGlvbkxvYWRlclRlc3QuamF2YQpAQCAtMCwwICsxLDE3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5jb25maWc7CisKK2ltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuVGVzdEluamVjdGlvbk1hbmFnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5QYXJhbWV0ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTWV0aG9kOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLldhZGxHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuaW50ZXJuYWwuQXBwbGljYXRpb25EZXNjcmlwdGlvbjsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBjb20uc3VuLnJlc2VhcmNoLndzLndhZGwuQXBwbGljYXRpb247CitpbXBvcnQgY29tLnN1bi5yZXNlYXJjaC53cy53YWRsLk1ldGhvZDsKK2ltcG9ydCBjb20uc3VuLnJlc2VhcmNoLndzLndhZGwuUGFyYW07CitpbXBvcnQgY29tLnN1bi5yZXNlYXJjaC53cy53YWRsLlJlcHJlc2VudGF0aW9uOworaW1wb3J0IGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5SZXF1ZXN0OworaW1wb3J0IGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5SZXNvdXJjZTsKK2ltcG9ydCBjb20uc3VuLnJlc2VhcmNoLndzLndhZGwuUmVzb3VyY2VzOworaW1wb3J0IGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5SZXNwb25zZTsKKworLyoqCisgKiBUT0RPOiBERVNDUklCRSBNRTxicj4KKyAqIENyZWF0ZWQgb246IEF1ZyAyLCAyMDA4PGJyPgorICoKKyAqIEBhdXRob3IgTWFydGluIEdyb3R6a2UgKG1hcnRpbi5ncm90emtlIGF0IGZyZWloZWl0LmNvbSkKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIFdhZGxHZW5lcmF0b3JDb25maWd1cmF0aW9uTG9hZGVyVGVzdCB7CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvYWRDb25maWdDbGFzcygpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZygpOworICAgICAgICByZXNvdXJjZUNvbmZpZy5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLldBRExfR0VORVJBVE9SX0NPTkZJRywKKyAgICAgICAgICAgICAgICBNeVdhZGxHZW5lcmF0b3JDb25maWcuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgICAgICBUZXN0SW5qZWN0aW9uTWFuYWdlckZhY3RvcnkuQm9vdHN0cmFwUmVzdWx0IHJlc3VsdCA9CisgICAgICAgICAgICAgICAgVGVzdEluamVjdGlvbk1hbmFnZXJGYWN0b3J5LmNyZWF0ZUluamVjdGlvbk1hbmFnZXIocmVzb3VyY2VDb25maWcpOworICAgICAgICBmaW5hbCBXYWRsR2VuZXJhdG9yIHdhZGxHZW5lcmF0b3IgPSBXYWRsR2VuZXJhdG9yQ29uZmlnTG9hZGVyLmxvYWRXYWRsR2VuZXJhdG9yc0Zyb21Db25maWcocmVzb3VyY2VDb25maWcuZ2V0UHJvcGVydGllcygpKQorICAgICAgICAgICAgICAgIC5jcmVhdGVXYWRsR2VuZXJhdG9yKHJlc3VsdC5pbmplY3Rpb25NYW5hZ2VyKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhNeVdhZGxHZW5lcmF0b3IuY2xhc3MsIHdhZGxHZW5lcmF0b3IuZ2V0Q2xhc3MoKSk7CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb2FkQ29uZmlnSW5zdGFuY2UoKSB7CisgICAgICAgIGZpbmFsIFdhZGxHZW5lcmF0b3JDb25maWcgY29uZmlnID0gV2FkbEdlbmVyYXRvckNvbmZpZy5nZW5lcmF0b3IoTXlXYWRsR2VuZXJhdG9yLmNsYXNzKS5idWlsZCgpOworCisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKCk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuV0FETF9HRU5FUkFUT1JfQ09ORklHLCBjb25maWcpOworICAgICAgICBUZXN0SW5qZWN0aW9uTWFuYWdlckZhY3RvcnkuQm9vdHN0cmFwUmVzdWx0IHJlc3VsdCA9CisgICAgICAgICAgICAgICAgVGVzdEluamVjdGlvbk1hbmFnZXJGYWN0b3J5LmNyZWF0ZUluamVjdGlvbk1hbmFnZXIocmVzb3VyY2VDb25maWcpOworICAgICAgICBmaW5hbCBXYWRsR2VuZXJhdG9yIHdhZGxHZW5lcmF0b3IgPSBXYWRsR2VuZXJhdG9yQ29uZmlnTG9hZGVyLmxvYWRXYWRsR2VuZXJhdG9yc0Zyb21Db25maWcocmVzb3VyY2VDb25maWcuZ2V0UHJvcGVydGllcygpKQorICAgICAgICAgICAgICAgIC5jcmVhdGVXYWRsR2VuZXJhdG9yKHJlc3VsdC5pbmplY3Rpb25NYW5hZ2VyKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUod2FkbEdlbmVyYXRvciBpbnN0YW5jZW9mIE15V2FkbEdlbmVyYXRvcik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVdhZGxHZW5lcmF0b3IgaW1wbGVtZW50cyBXYWRsR2VuZXJhdG9yIHsKKworICAgICAgICBwcml2YXRlIFN0cmluZyBfZm9vOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcmV0dXJuIHRoZSBmb28KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9vKCkgeworICAgICAgICAgICAgcmV0dXJuIF9mb287CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQHBhcmFtIGZvbyB0aGUgZm9vIHRvIHNldAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0Rm9vKFN0cmluZyBmb28pIHsKKyAgICAgICAgICAgIF9mb28gPSBmb287CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQXBwbGljYXRpb24gY3JlYXRlQXBwbGljYXRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNZXRob2QgY3JlYXRlTWV0aG9kKG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZSByLCBSZXNvdXJjZU1ldGhvZCBtKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBSZXF1ZXN0IGNyZWF0ZVJlcXVlc3Qob3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlIHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VNZXRob2QgbSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUGFyYW0gY3JlYXRlUGFyYW0ob3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlIHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZU1ldGhvZCBtLCBQYXJhbWV0ZXIgcCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUmVwcmVzZW50YXRpb24gY3JlYXRlUmVxdWVzdFJlcHJlc2VudGF0aW9uKAorICAgICAgICAgICAgICAgIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZSByLCBSZXNvdXJjZU1ldGhvZCBtLAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZSByLCBTdHJpbmcgcGF0aCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUmVzb3VyY2VzIGNyZWF0ZVJlc291cmNlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIExpc3Q8UmVzcG9uc2U+IGNyZWF0ZVJlc3BvbnNlcyhvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2UgciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZU1ldGhvZCBtKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWlyZWRKYXhiQ29udGV4dFBhdGgoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGluaXQoKSB7CisKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFdhZGxHZW5lcmF0b3JEZWxlZ2F0ZShXYWRsR2VuZXJhdG9yIGRlbGVnYXRlKSB7CisgICAgICAgIH0KKworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRXh0ZXJuYWxHcmFtbWFyRGVmaW5pdGlvbiBjcmVhdGVFeHRlcm5hbEdyYW1tYXIoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgeWV0LiIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGF0dGFjaFR5cGVzKEFwcGxpY2F0aW9uRGVzY3JpcHRpb24gZWdkKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgeWV0LiIpOworICAgICAgICB9CisKKyAgICB9CisKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlXYWRsR2VuZXJhdG9yQ29uZmlnIGV4dGVuZHMgV2FkbEdlbmVyYXRvckNvbmZpZyB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBMaXN0PFdhZGxHZW5lcmF0b3JEZXNjcmlwdGlvbj4gY29uZmlndXJlKCkgeworICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRvcihNeVdhZGxHZW5lcmF0b3IuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIC5wcm9wKCJmb28iLCAiYmFyIikKKyAgICAgICAgICAgICAgICAgICAgLmRlc2NyaXB0aW9ucygpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci93YWRsL2NvbmZpZy9XYWRsR2VuZXJhdG9yTG9hZGVyVGVzdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9jb25maWcvV2FkbEdlbmVyYXRvckxvYWRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjY3MDU1Ci0tLSAvZGV2L251bGwKKysrIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9jb25maWcvV2FkbEdlbmVyYXRvckxvYWRlclRlc3QuamF2YQpAQCAtMCwwICsxLDI1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoKKyAqIFRvIGNoYW5nZSB0aGlzIHRlbXBsYXRlLCBjaG9vc2UgVG9vbHMgfCBUZW1wbGF0ZXMKKyAqIGFuZCBvcGVuIHRoZSB0ZW1wbGF0ZSBpbiB0aGUgZWRpdG9yLgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLmNvbmZpZzsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlRlc3RJbmplY3Rpb25NYW5hZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUGFyYW1ldGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1ldGhvZDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5XYWRsR2VuZXJhdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLmludGVybmFsLkFwcGxpY2F0aW9uRGVzY3JpcHRpb247CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgY29tLnN1bi5yZXNlYXJjaC53cy53YWRsLkFwcGxpY2F0aW9uOworaW1wb3J0IGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5NZXRob2Q7CitpbXBvcnQgY29tLnN1bi5yZXNlYXJjaC53cy53YWRsLlBhcmFtOworaW1wb3J0IGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5SZXByZXNlbnRhdGlvbjsKK2ltcG9ydCBjb20uc3VuLnJlc2VhcmNoLndzLndhZGwuUmVxdWVzdDsKK2ltcG9ydCBjb20uc3VuLnJlc2VhcmNoLndzLndhZGwuUmVzb3VyY2U7CitpbXBvcnQgY29tLnN1bi5yZXNlYXJjaC53cy53YWRsLlJlc291cmNlczsKK2ltcG9ydCBjb20uc3VuLnJlc2VhcmNoLndzLndhZGwuUmVzcG9uc2U7CisKKy8qKgorICogVGVzdCB0aGUge0BsaW5rIFdhZGxHZW5lcmF0b3JMb2FkZXJ9LgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqIEBhdXRob3IgTWFydGluIEdyb3R6a2UgKG1hcnRpbi5ncm90emtlIGF0IGZyZWloZWl0LmNvbSkKKyAqLworcHVibGljIGNsYXNzIFdhZGxHZW5lcmF0b3JMb2FkZXJUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvYWRGaWxlRnJvbUNsYXNzcGF0aFJlbGF0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFRlc3RJbmplY3Rpb25NYW5hZ2VyRmFjdG9yeS5Cb290c3RyYXBSZXN1bHQgcmVzdWx0ID0KKyAgICAgICAgICAgICAgICBUZXN0SW5qZWN0aW9uTWFuYWdlckZhY3RvcnkuY3JlYXRlSW5qZWN0aW9uTWFuYWdlcigpOworICAgICAgICBmaW5hbCBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgcHJvcHMucHV0KCJ0ZXN0RmlsZSIsICJjbGFzc3BhdGg6dGVzdGZpbGUueG1sIik7CisgICAgICAgIGZpbmFsIFdhZGxHZW5lcmF0b3JEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IG5ldyBXYWRsR2VuZXJhdG9yRGVzY3JpcHRpb24oTXlXYWRsR2VuZXJhdG9yMi5jbGFzcywgcHJvcHMpOworCisgICAgICAgIGZpbmFsIFdhZGxHZW5lcmF0b3Igd2FkbEdlbmVyYXRvciA9CisgICAgICAgICAgICAgICAgV2FkbEdlbmVyYXRvckxvYWRlci5sb2FkV2FkbEdlbmVyYXRvckRlc2NyaXB0aW9ucyhyZXN1bHQuaW5qZWN0aW9uTWFuYWdlciwgZGVzY3JpcHRpb24pOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKE15V2FkbEdlbmVyYXRvcjIuY2xhc3MsIHdhZGxHZW5lcmF0b3IuZ2V0Q2xhc3MoKSk7CisKKyAgICAgICAgZmluYWwgVVJMIHJlc291cmNlID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgidGVzdGZpbGUueG1sIik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEZpbGUocmVzb3VyY2UudG9VUkkoKSkuZ2V0QWJzb2x1dGVQYXRoKCksICgoTXlXYWRsR2VuZXJhdG9yMikgd2FkbEdlbmVyYXRvcikuZ2V0VGVzdEZpbGUoKQorICAgICAgICAgICAgICAgIC5nZXRBYnNvbHV0ZVBhdGgoKSk7CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb2FkRmlsZUZyb21DbGFzc3BhdGhBYnNvbHV0ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBUZXN0SW5qZWN0aW9uTWFuYWdlckZhY3RvcnkuQm9vdHN0cmFwUmVzdWx0IHJlc3VsdCA9IFRlc3RJbmplY3Rpb25NYW5hZ2VyRmFjdG9yeS5jcmVhdGVJbmplY3Rpb25NYW5hZ2VyKCk7CisgICAgICAgIGZpbmFsIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBmaW5hbCBTdHJpbmcgcGF0aCA9ICJjbGFzc3BhdGg6LyIgKyBnZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCkucmVwbGFjZUFsbCgiXFwuIiwgIi8iKSArICIvdGVzdGZpbGUueG1sIjsKKyAgICAgICAgcHJvcHMucHV0KCJ0ZXN0RmlsZSIsIHBhdGgpOworICAgICAgICBmaW5hbCBXYWRsR2VuZXJhdG9yRGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPSBuZXcgV2FkbEdlbmVyYXRvckRlc2NyaXB0aW9uKE15V2FkbEdlbmVyYXRvcjIuY2xhc3MsIHByb3BzKTsKKworICAgICAgICBmaW5hbCBXYWRsR2VuZXJhdG9yIHdhZGxHZW5lcmF0b3IgPQorICAgICAgICAgICAgICAgIFdhZGxHZW5lcmF0b3JMb2FkZXIubG9hZFdhZGxHZW5lcmF0b3JEZXNjcmlwdGlvbnMocmVzdWx0LmluamVjdGlvbk1hbmFnZXIsIGRlc2NyaXB0aW9uKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhNeVdhZGxHZW5lcmF0b3IyLmNsYXNzLCB3YWRsR2VuZXJhdG9yLmdldENsYXNzKCkpOworCisgICAgICAgIGZpbmFsIFVSTCByZXNvdXJjZSA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2UoInRlc3RmaWxlLnhtbCIpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKHJlc291cmNlLnRvVVJJKCkpLmdldEFic29sdXRlUGF0aCgpLCAoKE15V2FkbEdlbmVyYXRvcjIpIHdhZGxHZW5lcmF0b3IpLmdldFRlc3RGaWxlKCkKKyAgICAgICAgICAgICAgICAuZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9hZEZpbGVGcm9tQWJzb2x1dGVQYXRoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFRlc3RJbmplY3Rpb25NYW5hZ2VyRmFjdG9yeS5Cb290c3RyYXBSZXN1bHQgcmVzdWx0ID0gVGVzdEluamVjdGlvbk1hbmFnZXJGYWN0b3J5LmNyZWF0ZUluamVjdGlvbk1hbmFnZXIoKTsKKyAgICAgICAgZmluYWwgVVJMIHJlc291cmNlID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgidGVzdGZpbGUueG1sIik7CisKKyAgICAgICAgZmluYWwgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBwYXRoID0gbmV3IEZpbGUocmVzb3VyY2UudG9VUkkoKSkuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgICAgIHByb3BzLnB1dCgidGVzdEZpbGUiLCBwYXRoKTsKKyAgICAgICAgZmluYWwgV2FkbEdlbmVyYXRvckRlc2NyaXB0aW9uIGRlc2NyaXB0aW9uID0gbmV3IFdhZGxHZW5lcmF0b3JEZXNjcmlwdGlvbihNeVdhZGxHZW5lcmF0b3IyLmNsYXNzLCBwcm9wcyk7CisKKyAgICAgICAgZmluYWwgV2FkbEdlbmVyYXRvciB3YWRsR2VuZXJhdG9yID0KKyAgICAgICAgICAgICAgICBXYWRsR2VuZXJhdG9yTG9hZGVyLmxvYWRXYWRsR2VuZXJhdG9yRGVzY3JpcHRpb25zKHJlc3VsdC5pbmplY3Rpb25NYW5hZ2VyLCBkZXNjcmlwdGlvbik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoTXlXYWRsR2VuZXJhdG9yMi5jbGFzcywgd2FkbEdlbmVyYXRvci5nZXRDbGFzcygpKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG5ldyBGaWxlKHJlc291cmNlLnRvVVJJKCkpLmdldEFic29sdXRlUGF0aCgpLCAoKE15V2FkbEdlbmVyYXRvcjIpIHdhZGxHZW5lcmF0b3IpLmdldFRlc3RGaWxlKCkKKyAgICAgICAgICAgICAgICAuZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvYWRTdHJlYW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgVGVzdEluamVjdGlvbk1hbmFnZXJGYWN0b3J5LkJvb3RzdHJhcFJlc3VsdCByZXN1bHQgPSBUZXN0SW5qZWN0aW9uTWFuYWdlckZhY3RvcnkuY3JlYXRlSW5qZWN0aW9uTWFuYWdlcigpOworICAgICAgICBmaW5hbCBQcm9wZXJ0aWVzIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHBhdGggPSBnZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCkucmVwbGFjZUFsbCgiXFwuIiwgIi8iKSArICIvdGVzdGZpbGUueG1sIjsKKyAgICAgICAgcHJvcHMucHV0KCJ0ZXN0U3RyZWFtIiwgcGF0aCk7CisgICAgICAgIGZpbmFsIFdhZGxHZW5lcmF0b3JEZXNjcmlwdGlvbiBkZXNjcmlwdGlvbiA9IG5ldyBXYWRsR2VuZXJhdG9yRGVzY3JpcHRpb24oTXlXYWRsR2VuZXJhdG9yMi5jbGFzcywgcHJvcHMpOworCisgICAgICAgIGZpbmFsIFdhZGxHZW5lcmF0b3Igd2FkbEdlbmVyYXRvciA9CisgICAgICAgICAgICAgICAgV2FkbEdlbmVyYXRvckxvYWRlci5sb2FkV2FkbEdlbmVyYXRvckRlc2NyaXB0aW9ucyhyZXN1bHQuaW5qZWN0aW9uTWFuYWdlciwgZGVzY3JpcHRpb24pOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKE15V2FkbEdlbmVyYXRvcjIuY2xhc3MsIHdhZGxHZW5lcmF0b3IuZ2V0Q2xhc3MoKSk7CisKKyAgICAgICAgZmluYWwgVVJMIHJlc291cmNlID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgidGVzdGZpbGUueG1sIik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmV3IEZpbGUocmVzb3VyY2UudG9VUkkoKSkubGVuZ3RoKCksICgoTXlXYWRsR2VuZXJhdG9yMikgd2FkbEdlbmVyYXRvcikuZ2V0VGVzdFN0cmVhbUNvbnRlbnQoKQorICAgICAgICAgICAgICAgIC5sZW5ndGgoKSk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15V2FkbEdlbmVyYXRvcjIgaW1wbGVtZW50cyBXYWRsR2VuZXJhdG9yIHsKKworICAgICAgICBwcml2YXRlIEZpbGUgX3Rlc3RGaWxlOworICAgICAgICBwcml2YXRlIElucHV0U3RyZWFtIF90ZXN0U3RyZWFtOworICAgICAgICBwcml2YXRlIEZpbGUgX3Rlc3RTdHJlYW1Db250ZW50OworICAgICAgICBwcml2YXRlIFdhZGxHZW5lcmF0b3IgX2RlbGVnYXRlOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAcGFyYW0gdGVzdEZpbGUgdGhlIHRlc3RGaWxlIHRvIHNldAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHZvaWQgc2V0VGVzdEZpbGUoRmlsZSB0ZXN0RmlsZSkgeworICAgICAgICAgICAgX3Rlc3RGaWxlID0gdGVzdEZpbGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRUZXN0U3RyZWFtKElucHV0U3RyZWFtIHRlc3RTdHJlYW0pIHsKKyAgICAgICAgICAgIF90ZXN0U3RyZWFtID0gdGVzdFN0cmVhbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBGaWxlIGdldFRlc3RGaWxlKCkgeworICAgICAgICAgICAgcmV0dXJuIF90ZXN0RmlsZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBGaWxlIGdldFRlc3RTdHJlYW1Db250ZW50KCkgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCAibGlzdGluZyBmaWxlICIgKyBfdGVzdEZpbGVDb250ZW50LmdldE5hbWUoKSApOworICAgICAgICAgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGluID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKCBuZXcgRmlsZVJlYWRlciggX3Rlc3RGaWxlQ29udGVudCApICk7CisgICAgICAgICAgICAgICAgU3RyaW5nIGxpbmUgPSBudWxsOworICAgICAgICAgICAgICAgIHdoaWxlICggKGxpbmUgPSBpbi5yZWFkTGluZSgpKSAhPSBudWxsICkgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIGxpbmUgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoICggRXhjZXB0aW9uIGUgKSB7CisgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICovCisgICAgICAgICAgICByZXR1cm4gX3Rlc3RTdHJlYW1Db250ZW50OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgaW5pdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoX3Rlc3RTdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIF90ZXN0U3RyZWFtQ29udGVudCA9IEZpbGUuY3JlYXRlVGVtcEZpbGUoInRlc3RmaWxlLSIgKyBnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSwgbnVsbCk7CisgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIHRvID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB0byA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKF90ZXN0U3RyZWFtQ29udGVudCk7CisgICAgICAgICAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs0MDk2XTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGJ5dGVzX3JlYWQ7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICgoYnl0ZXNfcmVhZCA9IF90ZXN0U3RyZWFtLnJlYWQoYnVmZmVyKSkgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvLndyaXRlKGJ1ZmZlciwgMCwgYnl0ZXNfcmVhZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAvLyBBbHdheXMgY2xvc2UgdGhlIHN0cmVhbXMsIGV2ZW4gaWYgZXhjZXB0aW9ucyB3ZXJlIHRocm93bgorICAgICAgICAgICAgICAgICAgICBpZiAodG8gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0by5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0V2FkbEdlbmVyYXRvckRlbGVnYXRlKFdhZGxHZW5lcmF0b3IgZGVsZWdhdGUpIHsKKyAgICAgICAgICAgIF9kZWxlZ2F0ZSA9IGRlbGVnYXRlOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdGhlIGRlbGVnYXRlCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgV2FkbEdlbmVyYXRvciBnZXREZWxlZ2F0ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBfZGVsZWdhdGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQXBwbGljYXRpb24gY3JlYXRlQXBwbGljYXRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNZXRob2QgY3JlYXRlTWV0aG9kKG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZSByLCBSZXNvdXJjZU1ldGhvZCBtKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBSZXF1ZXN0IGNyZWF0ZVJlcXVlc3Qob3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlIHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VNZXRob2QgbSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUGFyYW0gY3JlYXRlUGFyYW0ob3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlIHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZU1ldGhvZCBtLCBQYXJhbWV0ZXIgcCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUmVwcmVzZW50YXRpb24gY3JlYXRlUmVxdWVzdFJlcHJlc2VudGF0aW9uKAorICAgICAgICAgICAgICAgIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZSByLCBSZXNvdXJjZU1ldGhvZCBtLAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFJlc291cmNlIGNyZWF0ZVJlc291cmNlKG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZSByLCBTdHJpbmcgcGF0aCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUmVzb3VyY2VzIGNyZWF0ZVJlc291cmNlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIExpc3Q8UmVzcG9uc2U+IGNyZWF0ZVJlc3BvbnNlcyhvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2UgciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZU1ldGhvZCBtKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWlyZWRKYXhiQ29udGV4dFBhdGgoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRXh0ZXJuYWxHcmFtbWFyRGVmaW5pdGlvbiBjcmVhdGVFeHRlcm5hbEdyYW1tYXIoKSB7CisgICAgICAgICAgICByZXR1cm4gX2RlbGVnYXRlLmNyZWF0ZUV4dGVybmFsR3JhbW1hcigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGF0dGFjaFR5cGVzKEFwcGxpY2F0aW9uRGVzY3JpcHRpb24gZWdkKSB7CisgICAgICAgICAgICBfZGVsZWdhdGUuYXR0YWNoVHlwZXMoZWdkKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvZ2VuZXJhdG9ycy9yZXNvdXJjZWRvYy9XYWRsR2VuZXJhdG9yUmVzb3VyY2VEb2NTdXBwb3J0VGVzdC5qYXZhIGIvY29yZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9nZW5lcmF0b3JzL3Jlc291cmNlZG9jL1dhZGxHZW5lcmF0b3JSZXNvdXJjZURvY1N1cHBvcnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQyYjM5NwotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvZ2VuZXJhdG9ycy9yZXNvdXJjZWRvYy9XYWRsR2VuZXJhdG9yUmVzb3VyY2VEb2NTdXBwb3J0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLmdlbmVyYXRvcnMucmVzb3VyY2Vkb2M7CisKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5NYXJzaGFsbGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLldhZGxHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuaW50ZXJuYWwuQXBwbGljYXRpb25EZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5pbnRlcm5hbC5XYWRsQnVpbGRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5pbnRlcm5hbC5XYWRsR2VuZXJhdG9ySW1wbDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5pbnRlcm5hbC5nZW5lcmF0b3JzLnJlc291cmNlZG9jLldhZGxHZW5lcmF0b3JSZXNvdXJjZURvY1N1cHBvcnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuaW50ZXJuYWwuZ2VuZXJhdG9ycy5yZXNvdXJjZWRvYy5tb2RlbC5Bbm5vdGF0aW9uRG9jVHlwZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5pbnRlcm5hbC5nZW5lcmF0b3JzLnJlc291cmNlZG9jLm1vZGVsLkNsYXNzRG9jVHlwZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5pbnRlcm5hbC5nZW5lcmF0b3JzLnJlc291cmNlZG9jLm1vZGVsLk1ldGhvZERvY1R5cGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuaW50ZXJuYWwuZ2VuZXJhdG9ycy5yZXNvdXJjZWRvYy5tb2RlbC5OYW1lZFZhbHVlVHlwZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5pbnRlcm5hbC5nZW5lcmF0b3JzLnJlc291cmNlZG9jLm1vZGVsLlBhcmFtRG9jVHlwZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5pbnRlcm5hbC5nZW5lcmF0b3JzLnJlc291cmNlZG9jLm1vZGVsLlJlc291cmNlRG9jVHlwZTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgY29tLnN1bi5yZXNlYXJjaC53cy53YWRsLkFwcGxpY2F0aW9uOworCitwdWJsaWMgY2xhc3MgV2FkbEdlbmVyYXRvclJlc291cmNlRG9jU3VwcG9ydFRlc3QgeworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgd2FkbElzR2VuZXJhdGVkV2l0aFVua25vd25DdXN0b21QYXJhbWV0ZXJBbm5vdGF0aW9uKCkgdGhyb3dzIEpBWEJFeGNlcHRpb24geworICAgICAgICAvKiBTZXQgdXAgYSBDbGFzc0RvY1R5cGUgdGhhdCBoYXMgc29tZXRoaW5nIGZvciBhIGN1c3RvbS1hbm5vdGF0ZWQgcGFyYW1ldGVyICovCisgICAgICAgIENsYXNzRG9jVHlwZSBjZHQgPSBuZXcgQ2xhc3NEb2NUeXBlKCk7CisgICAgICAgIGNkdC5zZXRDbGFzc05hbWUoVGVzdFJlc291cmNlLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICAgICAgTWV0aG9kRG9jVHlwZSBtZHQgPSBuZXcgTWV0aG9kRG9jVHlwZSgpOworICAgICAgICBtZHQuc2V0TWV0aG9kTmFtZSgibWV0aG9kIik7CisgICAgICAgIGNkdC5nZXRNZXRob2REb2NzKCkuYWRkKG1kdCk7CisKKyAgICAgICAgUGFyYW1Eb2NUeXBlIHBkdCA9IG5ldyBQYXJhbURvY1R5cGUoIngiLCAiY29tbWVudCBhYm91dCB4Iik7CisgICAgICAgIG1kdC5nZXRQYXJhbURvY3MoKS5hZGQocGR0KTsKKworICAgICAgICBBbm5vdGF0aW9uRG9jVHlwZSBhZHQgPSBuZXcgQW5ub3RhdGlvbkRvY1R5cGUoKTsKKyAgICAgICAgYWR0LnNldEFubm90YXRpb25UeXBlTmFtZShDdXN0b21QYXJhbS5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICBhZHQuZ2V0QXR0cmlidXRlRG9jcygpLmFkZChuZXcgTmFtZWRWYWx1ZVR5cGUoInZhbHVlIiwgIngiKSk7CisKKyAgICAgICAgcGR0LmdldEFubm90YXRpb25Eb2NzKCkuYWRkKGFkdCk7CisKKyAgICAgICAgUmVzb3VyY2VEb2NUeXBlIHJkdCA9IG5ldyBSZXNvdXJjZURvY1R5cGUoKTsKKyAgICAgICAgcmR0LmdldERvY3MoKS5hZGQoY2R0KTsKKworCisgICAgICAgIC8qIEdlbmVyYXRlIFdBREwgZm9yIHRoYXQgY2xhc3MgKi8KKyAgICAgICAgV2FkbEdlbmVyYXRvciB3ZyA9IG5ldyBXYWRsR2VuZXJhdG9yUmVzb3VyY2VEb2NTdXBwb3J0KG5ldyBXYWRsR2VuZXJhdG9ySW1wbCgpLCByZHQpOworCisgICAgICAgIFdhZGxCdWlsZGVyIHdiID0gbmV3IFdhZGxCdWlsZGVyKHdnLCBmYWxzZSwgbnVsbCk7CisgICAgICAgIFJlc291cmNlIHJlc291cmNlID0gUmVzb3VyY2UuZnJvbShUZXN0UmVzb3VyY2UuY2xhc3MpOworICAgICAgICBBcHBsaWNhdGlvbkRlc2NyaXB0aW9uIGFwcCA9IHdiLmdlbmVyYXRlKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QocmVzb3VyY2UpKTsKKworCisgICAgICAgIC8qIENvbmZpcm0gdGhhdCBpdCBjYW4gYmUgbWFyc2hhbGxlZCB3aXRob3V0IGVycm9yICovCisgICAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKworICAgICAgICBKQVhCQ29udGV4dCBjb250ZXh0ID0gSkFYQkNvbnRleHQubmV3SW5zdGFuY2UoQXBwbGljYXRpb24uY2xhc3MpOworICAgICAgICBNYXJzaGFsbGVyIG0gPSBjb250ZXh0LmNyZWF0ZU1hcnNoYWxsZXIoKTsKKyAgICAgICAgbS5zZXRQcm9wZXJ0eShNYXJzaGFsbGVyLkpBWEJfRk9STUFUVEVEX09VVFBVVCwgdHJ1ZSk7CisKKyAgICAgICAgbS5tYXJzaGFsKGFwcC5nZXRBcHBsaWNhdGlvbigpLCBzdyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0UmVzb3VyY2UgeworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIG1ldGhvZChAQ3VzdG9tUGFyYW0oIngiKSBPYmplY3QgcGFyYW0pIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQW4gYW5ub3RhdGlvbiBJbnRyb3NwZWN0aW9uTW9kZWxsZXIgZG9lc24ndCBrbm93IGFib3V0LgorICAgICAqLworICAgIEBUYXJnZXQoRWxlbWVudFR5cGUuUEFSQU1FVEVSKQorICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCisgICAgcHVibGljIEBpbnRlcmZhY2UgQ3VzdG9tUGFyYW0geworICAgICAgICBTdHJpbmcgdmFsdWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuc3BpLkF1dG9EaXNjb3ZlcmFibGUgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuc3BpLkF1dG9EaXNjb3ZlcmFibGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y4MDcwOQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5zcGkuQXV0b0Rpc2NvdmVyYWJsZQpAQCAtMCwwICsxIEBACitvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXV0b0Rpc2NvdmVyYWJsZVNlcnZlclRlc3QkQ29tbW9uQXV0b0Rpc2NvdmVyYWJsZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2NvcmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvY29uZmlnL2pheHJzLWNvbXBvbmVudHMgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2NvbmZpZy9qYXhycy1jb21wb25lbnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MjljMDUKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2NvbmZpZy9qYXhycy1jb21wb25lbnRzCkBAIC0wLDAgKzEgQEAKK29yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5jb25maWcudG9wbGV2ZWwuUHVibGljUm9vdFJlc291cmNlQ2xhc3MKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvY29uZmlnL3Rlc3RmaWxlLnhtbCBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvd2FkbC9jb25maWcvdGVzdGZpbGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YmM5YzMKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3dhZGwvY29uZmlnL3Rlc3RmaWxlLnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHRlc3Q+Zm9vPC9mb28+CmRpZmYgLS1naXQgYS9jb3JlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvc2VydmVyLnBvbGljeSBiL2NvcmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9zZXJ2ZXIucG9saWN5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjOWJkNWIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvc2VydmVyLnBvbGljeQpAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvLyB3ZSBkbyBub3QgY2FyZSBhYm91dCBqYXZhIGxpYiBpdHNlbGYKK2dyYW50IGNvZGViYXNlICJmaWxlOiR7amF2YS5ob21lfS8tIiB7CisgIHBlcm1pc3Npb24gamF2YS5zZWN1cml0eS5BbGxQZXJtaXNzaW9uOworfTsKKworLy8gd2UgZG8gbm90IGNhcmUgYWJvdXQgb3VyIGRlcGVuZGVuY2llcworZ3JhbnQgY29kZWJhc2UgImZpbGU6JHtzZXR0aW5ncy5sb2NhbFJlcG9zaXRvcnl9Ly0iIHsKKyAgcGVybWlzc2lvbiBqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb247Cit9OworCisvLyBpbiBjYXNlIGplcnNleS1tZWRpYS1qYXhiIGphciBpcyByZWZlcmVuY2VkIGRpcmVjdGx5IGZyb20gcmVhY3RvcgorZ3JhbnQgY29kZWJhc2UgImZpbGU6JHtiYXNlZGlyfS8uLi9tZWRpYS9qYXhiLy0iIHsKKyAgcGVybWlzc2lvbiBqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb247Cit9OworCisvLyBpbiBjYXNlIGplcnNleS1oazIgamFyIGlzIHJlZmVyZW5jZWQgZGlyZWN0bHkgZnJvbSByZWFjdG9yCitncmFudCBjb2RlYmFzZSAiZmlsZToke2Jhc2VkaXJ9Ly4uL2luamVjdC9oazIvLSIgeworICBwZXJtaXNzaW9uIGphdmEuc2VjdXJpdHkuQWxsUGVybWlzc2lvbjsKK307CisKKy8vIGluIGNhc2UgamVyc2V5LWNvcmUgamFyIGlzIHJlZmVyZW5jZWQgZGlyZWN0bHkgZnJvbSByZWFjdG9yCitncmFudCBjb2RlYmFzZSAiZmlsZToke2Jhc2VkaXJ9Ly4uL2NvcmUtY29tbW9uLy0iIHsKKyAgcGVybWlzc2lvbiBqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb247Cit9OworCisvLyB0aGlzIGlzIHRvIGJlIGFibGUgdG8gc2V0IHJ1bnRpbWUgZGVsZWdhdGUgaW5zdGFuY2UgaW4gamF4LXJzIGZyb20gdGhlIHRlc3RzCisvLyBhbmQgdG8gcnVuIG11bHRpLXRocmVhZGVkIHRlc3RzCitncmFudCBjb2RlYmFzZSAiZmlsZToke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS90ZXN0LWNsYXNzZXMvLSIgeworICBwZXJtaXNzaW9uIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiAiYWNjZXNzRGVjbGFyZWRNZW1iZXJzIjsKKyAgcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gImNyZWF0ZUNsYXNzTG9hZGVyIjsKKyAgcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gInNldENvbnRleHRDbGFzc0xvYWRlciI7CisgIHBlcm1pc3Npb24gamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uICJnZXRDbGFzc0xvYWRlciI7CisgIHBlcm1pc3Npb24gamF2YS5sYW5nLnJlZmxlY3QuUmVmbGVjdFBlcm1pc3Npb24gInN1cHByZXNzQWNjZXNzQ2hlY2tzIjsKKyAgcGVybWlzc2lvbiBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uICI8PEFMTCBGSUxFUz4+IiwgInJlYWQsd3JpdGUsZGVsZXRlIjsKKyAgcGVybWlzc2lvbiBqYXZhLnV0aWwuUHJvcGVydHlQZXJtaXNzaW9uICIqIiwgInJlYWQiOworICBwZXJtaXNzaW9uIGphdmEubmV0Lk5ldFBlcm1pc3Npb24gInNwZWNpZnlTdHJlYW1IYW5kbGVyIjsKKyAgcGVybWlzc2lvbiBqYXZhLm5ldC5Tb2NrZXRQZXJtaXNzaW9uICJob21lIiwgImNvbm5lY3QscmVzb2x2ZSI7CisKKyAgLy8gTmVlZGVkIGJ5IFZGU1NjaGVtZVJlc291cmNlRmluZGVyVGVzdAorICBwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gImphdmEucHJvdG9jb2wuaGFuZGxlci5wa2dzIiwgInJlYWQsd3JpdGUiOworICBwZXJtaXNzaW9uIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiAibW9kaWZ5VGhyZWFkIjsKKyAgcGVybWlzc2lvbiBvcmcuamJvc3MudmZzLlZpcnR1YWxGaWxlUGVybWlzc2lvbiAiPDxBTEwgRklMRVM+PiIsICJyZWFkIjsKKyAgcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gImFjY2Vzc0NsYXNzSW5QYWNrYWdlLnN1bi5taXNjIjsKKyAgcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gImFjY2Vzc0NsYXNzSW5QYWNrYWdlLnN1bi5taXNjLioiOworfTsKKworZ3JhbnQgY29kZWJhc2UgImZpbGU6JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vY2xhc3Nlcy8tIiB7CisgIHBlcm1pc3Npb24gamF2YS5sYW5nLnJlZmxlY3QuUmVmbGVjdFBlcm1pc3Npb24gInN1cHByZXNzQWNjZXNzQ2hlY2tzIjsKKyAgcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gImFjY2Vzc0RlY2xhcmVkTWVtYmVycyI7CisgIHBlcm1pc3Npb24gamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uICJzZXRDb250ZXh0Q2xhc3NMb2FkZXIiOworICBwZXJtaXNzaW9uIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiAiZ2V0Q2xhc3NMb2FkZXIiOworICBwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gIioiLCAicmVhZCI7CisgIHBlcm1pc3Npb24gamF2YS5pby5GaWxlUGVybWlzc2lvbiAiPDxBTEwgRklMRVM+PiIsICJyZWFkLHdyaXRlIjsKKyAgcGVybWlzc2lvbiBvcmcuamJvc3MudmZzLlZpcnR1YWxGaWxlUGVybWlzc2lvbiAiPDxBTEwgRklMRVM+PiIsICJyZWFkIjsKKyAgcGVybWlzc2lvbiBqYXZhLm5ldC5OZXRQZXJtaXNzaW9uICJzcGVjaWZ5U3RyZWFtSGFuZGxlciI7CisgIHBlcm1pc3Npb24gamF2YS5uZXQuU29ja2V0UGVybWlzc2lvbiAiaG9tZSIsICJjb25uZWN0LHJlc29sdmUiOworICBwZXJtaXNzaW9uIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiAiYWNjZXNzQ2xhc3NJblBhY2thZ2Uuc3VuLm1pc2MiOworICBwZXJtaXNzaW9uIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiAiYWNjZXNzQ2xhc3NJblBhY2thZ2Uuc3VuLm1pc2MuKiI7Cit9OwpkaWZmIC0tZ2l0IGEvZG9jcy9wb20ueG1sIGIvZG9jcy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNjg5OTQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3BvbS54bWwKQEAgLTAsMCArMSwyMDEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorICAgIDxhcnRpZmFjdElkPmplcnNleS1kb2N1bWVudGF0aW9uPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LWRvY3VtZW50YXRpb248L25hbWU+CisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5yZWxlYXNlPC9pZD4KKyAgICAgICAgICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgIDxqYXZhbmV0LnJlcG9zaXRvcnkuaWQ+cmVsZWFzZXM8L2phdmFuZXQucmVwb3NpdG9yeS5pZD4KKyAgICAgICAgICAgICAgICA8amVyc2V5LmRvY3MudmVyc2lvbj4ke2plcnNleS52ZXJzaW9ufTwvamVyc2V5LmRvY3MudmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8amVyc2V5LmFwaWRvY3MudmVyc2lvbj4ke2plcnNleS52ZXJzaW9ufTwvamVyc2V5LmFwaWRvY3MudmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8amVyc2V5LnNyYy5icmFuY2g+JHtqZXJzZXkudmVyc2lvbn08L2plcnNleS5zcmMuYnJhbmNoPgorICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hbnRydW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhc2tzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZWNobyBtZXNzYWdlPSJQcmVwYXJpbmcgY2hhciBlbnRpdGllcyIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1rZGlyIGRpcj0iJHtzcmMuZGlyfSIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9kaXI9IiR7c3JjLmRpcn0iPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSJzcmMvbWFpbi9kb2Nib29rIiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvcHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXBsYWNlIGZpbGU9IiR7c3JjLmRpcn0vamVyc2V5LmVudCIgdG9rZW49IiRhcGlkb2NzLnZlcnNpb24iIHZhbHVlPSIke2plcnNleS5hcGlkb2NzLnZlcnNpb259IiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVwbGFjZSBmaWxlPSIke3NyYy5kaXJ9L2plcnNleS5lbnQiIHRva2VuPSIkZG9jcy52ZXJzaW9uIiB2YWx1ZT0iJHtqZXJzZXkuZG9jcy52ZXJzaW9ufSIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlcGxhY2UgZmlsZT0iJHtzcmMuZGlyfS9qZXJzZXkuZW50IiB0b2tlbj0iJGd1YXZhLXZlcnNpb24iIHZhbHVlPSIke2d1YXZhLnZlcnNpb259IiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVwbGFjZSBmaWxlPSIke3NyYy5kaXJ9L2plcnNleS5lbnQiIHRva2VuPSIkamFja3Nvbi12ZXJzaW9uIiB2YWx1ZT0iJHtqYWNrc29uLnZlcnNpb259IiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVwbGFjZSBmaWxlPSIke3NyYy5kaXJ9L2plcnNleS5lbnQiIHRva2VuPSIkamF2YXgtZWwtaW1wbC12ZXJzaW9uIiB2YWx1ZT0iJHtqYXZheC5lbC5pbXBsLnZlcnNpb259IiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVwbGFjZSBmaWxlPSIke3NyYy5kaXJ9L2plcnNleS5lbnQiIHRva2VuPSIkamF2YXgtZWwtdmVyc2lvbiIgdmFsdWU9IiR7amF2YXguZWwudmVyc2lvbn0iIC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXBsYWNlIGZpbGU9IiR7c3JjLmRpcn0vamVyc2V5LmVudCIgdG9rZW49IiRqYXgtcnMtYXBpLWphci12ZXJzaW9uIiB2YWx1ZT0iJHtqYXhycy5pbXBsLnZlcnNpb259IiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVwbGFjZSBmaWxlPSIke3NyYy5kaXJ9L2plcnNleS5lbnQiIHRva2VuPSIkamF4LXJzLXZlcnNpb24iIHZhbHVlPSIke2pheHJzLnZlcnNpb259IiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVwbGFjZSBmaWxlPSIke3NyYy5kaXJ9L2plcnNleS5lbnQiIHRva2VuPSIkamF4Yi1hcGktamFyLXZlcnNpb24iIHZhbHVlPSIke2pheGIuYXBpLnZlcnNpb259IiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVwbGFjZSBmaWxlPSIke3NyYy5kaXJ9L2plcnNleS5lbnQiIHRva2VuPSIkcmVwb3NpdG9yeSIgdmFsdWU9IiR7amF2YW5ldC5yZXBvc2l0b3J5LmlkfSIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlcGxhY2UgZmlsZT0iJHtzcmMuZGlyfS9qZXJzZXkuZW50IiB0b2tlbj0iJHNyYy5icmFuY2giIHZhbHVlPSIke2plcnNleS5zcmMuYnJhbmNofSIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlcGxhY2UgZmlsZT0iJHtzcmMuZGlyfS9qZXJzZXkuZW50IiB0b2tlbj0iJHZlcnNpb24iIHZhbHVlPSIke2plcnNleS52ZXJzaW9ufSIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Rhc2tzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlkPnByb2Nlc3MtZW50aXRpZXM8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorCisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5hZ2lsZWphdmEuZG9jYmt4PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmRvY2JreC1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4wLjE1PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+bmV0LnNmLmRvY2Jvb2s8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5kb2Nib29rLXhtbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjUuMC1hbGw8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NpZmllcj5yZXNvdXJjZXM8L2NsYXNzaWZpZXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dHlwZT56aXA8L3R5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+CisgICAgICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY2llcz4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGNhbGxvdXRHcmFwaGljcz5mYWxzZTwvY2FsbG91dEdyYXBoaWNzPgorICAgICAgICAgICAgICAgICAgICA8IS0tY2FsbG91dEdyYXBoaWNzRXh0ZW5zaW9uPjE8L2NhbGxvdXRHcmFwaGljc0V4dGVuc2lvbi0tPgorICAgICAgICAgICAgICAgICAgICA8Y2FsbG91dHNFeHRlbnNpb24+dHJ1ZTwvY2FsbG91dHNFeHRlbnNpb24+CisgICAgICAgICAgICAgICAgICAgIDxoaWdobGlnaHREZWZhdWx0TGFuZ3VhZ2UgLz4KKyAgICAgICAgICAgICAgICAgICAgPGhpZ2hsaWdodFNvdXJjZT50cnVlPC9oaWdobGlnaHRTb3VyY2U+CisgICAgICAgICAgICAgICAgICAgIDxodG1sU3R5bGVzaGVldD4vZG9jdW1lbnRhdGlvbi5jc3M8L2h0bWxTdHlsZXNoZWV0PgorICAgICAgICAgICAgICAgICAgICA8IS0tPGh0bWxTdHlsZXNoZWV0Pmh0dHBzOi8vamVyc2V5LmphdmEubmV0L2RvY3VtZW50YXRpb24uY3NzPC9odG1sU3R5bGVzaGVldD4tLT4KKyAgICAgICAgICAgICAgICAgICAgPGxpbmVudW1iZXJpbmdFeHRlbnNpb24+dHJ1ZTwvbGluZW51bWJlcmluZ0V4dGVuc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPGxpbmVudW1iZXJpbmdFdmVyeU50aD4xPC9saW5lbnVtYmVyaW5nRXZlcnlOdGg+CisgICAgICAgICAgICAgICAgICAgIDxwYXJ0QXV0b2xhYmVsPnRydWU8L3BhcnRBdXRvbGFiZWw+CisgICAgICAgICAgICAgICAgICAgIDxwcmVQcm9jZXNzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvcHkgdG9kaXI9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2RvY2Jvb2svaW5kZXgvaW1hZ2VzIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXNldCBkaXI9IiR7c3JjLmRpcn0vaW1hZ2VzLyIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29weT4KKyAgICAgICAgICAgICAgICAgICAgPC9wcmVQcm9jZXNzPgorICAgICAgICAgICAgICAgICAgICA8c2VjdGlvbkF1dG9sYWJlbD50cnVlPC9zZWN0aW9uQXV0b2xhYmVsPgorICAgICAgICAgICAgICAgICAgICA8c2VjdGlvbkxhYmVsSW5jbHVkZXNDb21wb25lbnRMYWJlbD50cnVlPC9zZWN0aW9uTGFiZWxJbmNsdWRlc0NvbXBvbmVudExhYmVsPgorICAgICAgICAgICAgICAgICAgICA8c291cmNlRGlyZWN0b3J5PiR7c3JjLmRpcn08L3NvdXJjZURpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgICAgPHRhYmxlY29sdW1uc0V4dGVuc2lvbj50cnVlPC90YWJsZWNvbHVtbnNFeHRlbnNpb24+CisgICAgICAgICAgICAgICAgICAgIDx1c2VFeHRlbnNpb25zPnRydWU8L3VzZUV4dGVuc2lvbnM+CisgICAgICAgICAgICAgICAgICAgIDx4aW5jbHVkZVN1cHBvcnRlZD50cnVlPC94aW5jbHVkZVN1cHBvcnRlZD4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+U2luZ2xlIHBhZ2UgSFRNTCBhbmQgUERGPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5nZW5lcmF0ZS1odG1sPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmdlbmVyYXRlLXBkZjwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aHRtbEN1c3RvbWl6YXRpb24+JHtzcmMuZGlyfS9jdXN0LXNpbmdsZS54c2w8L2h0bWxDdXN0b21pemF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlcz51c2VyLWd1aWRlLnhtbDwvaW5jbHVkZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhcmdldERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9kb2Nib29rL2luZGV4PC90YXJnZXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlkPk11bHRpcGxlIEhUTUwgcGFnZXM8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmdlbmVyYXRlLWh0bWw8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGh0bWxDdXN0b21pemF0aW9uPiR7c3JjLmRpcn0vY3VzdC1jaHVua2VkLnhzbDwvaHRtbEN1c3RvbWl6YXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGVzPmluZGV4LnhtbDwvaW5jbHVkZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNodW5rZWRPdXRwdXQ+dHJ1ZTwvY2h1bmtlZE91dHB1dD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y2h1bmtTZWN0aW9uRGVwdGg+MDwvY2h1bmtTZWN0aW9uRGVwdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRhcmdldERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9kb2Nib29rL2luZGV4PC90YXJnZXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHVzZUlkQXNGaWxlbmFtZT50cnVlPC91c2VJZEFzRmlsZW5hbWU+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9ycz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yPnNyYy9tYWluL2Fzc2VtYmx5L2RvY2Jvb2sueG1sPC9kZXNjcmlwdG9yPgorICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JzPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5tYWtlLWFzc2VtYmx5PC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hdHRhY2hlZDwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5idWlsZC1oZWxwZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1hcnRpZmFjdHM8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmF0dGFjaC1hcnRpZmFjdDwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3Q+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9kb2Nib29rL2luZGV4L3VzZXItZ3VpZGUucGRmPC9maWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHR5cGU+cGRmPC90eXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+dXNlci1ndWlkZTwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0cz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPiA8IS0tIHJlbW92ZSB0aGUgZ2VuZXJhdGVkIHNyYyBkaXItLT4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jbGVhbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPGFzc2VtYmx5LmRpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9hc3NlbWJseTwvYXNzZW1ibHkuZGlyZWN0b3J5PgorICAgICAgICA8c3JjLmRpcj4ke2Jhc2VkaXJ9L3RhcmdldC9nZW4tc3JjPC9zcmMuZGlyPgorICAgICAgICA8amF2YW5ldC5yZXBvc2l0b3J5LmlkPnNuYXBzaG90czwvamF2YW5ldC5yZXBvc2l0b3J5LmlkPgorICAgICAgICA8amVyc2V5LmRvY3MudmVyc2lvbj5zbmFwc2hvdDwvamVyc2V5LmRvY3MudmVyc2lvbj4KKyAgICAgICAgPGplcnNleS5hcGlkb2NzLnZlcnNpb24+c25hcHNob3Q8L2plcnNleS5hcGlkb2NzLnZlcnNpb24+CisgICAgICAgIDxqZXJzZXkuc3JjLmJyYW5jaD5tYXN0ZXI8L2plcnNleS5zcmMuYnJhbmNoPgorICAgICAgICA8amF4cnMudmVyc2lvbj4ke2pheHJzLmFwaS5zcGVjLnZlcnNpb259PC9qYXhycy52ZXJzaW9uPgorICAgICAgICA8amF4cnMuaW1wbC52ZXJzaW9uPiR7amF4cnMuYXBpLmltcGwudmVyc2lvbn08L2pheHJzLmltcGwudmVyc2lvbj4KKyAgICA8L3Byb3BlcnRpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2RvY3Mvc3JjL21haW4vYXNzZW1ibHkvZG9jYm9vay54bWwgYi9kb2NzL3NyYy9tYWluL2Fzc2VtYmx5L2RvY2Jvb2sueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4Y2FjNjkKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3NyYy9tYWluL2Fzc2VtYmx5L2RvY2Jvb2sueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxhc3NlbWJseT4KKyAgICA8aWQ+ZG9jYm9vazwvaWQ+CisgICAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KKyAgICA8Zm9ybWF0cz4KKyAgICAgICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KKyAgICA8L2Zvcm1hdHM+CisgICAgPGZpbGVTZXRzPgorICAgICAgICA8ZmlsZVNldD4KKyAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vZG9jYm9vay9pbmRleDwvZGlyZWN0b3J5PgorICAgICAgICAgICAgPGV4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDxleGNsdWRlPnVzZXItZ3VpZGUuZm88L2V4Y2x1ZGU+CisgICAgICAgICAgICA8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT48L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgPC9maWxlU2V0PgorICAgIDwvZmlsZVNldHM+Cis8L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvZG9jcy9zcmMvbWFpbi9kb2Nib29rL2FwcGVuZGl4LXByb3BlcnRpZXMueG1sIGIvZG9jcy9zcmMvbWFpbi9kb2Nib29rL2FwcGVuZGl4LXByb3BlcnRpZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZWNmYWYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3NyYy9tYWluL2RvY2Jvb2svYXBwZW5kaXgtcHJvcGVydGllcy54bWwKQEAgLTAsMCArMSw5MTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzwhRE9DVFlQRSBhcHBlbmRpeCBbPCFFTlRJVFkgJSBlbnRzIFNZU1RFTSAiamVyc2V5LmVudCIgPiAlZW50czsgXT4KKzxhcHBlbmRpeCB4bWxucz0iaHR0cDovL2RvY2Jvb2sub3JnL25zL2RvY2Jvb2siCisgICAgICAgICAgdmVyc2lvbj0iNS4wIgorICAgICAgICAgIHhtbDpsYW5nPSJlbiIKKyAgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgorICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2RvY2Jvb2sub3JnL25zL2RvY2Jvb2sgaHR0cDovL2RvY2Jvb2sub3JnL3htbC81LjAveHNkL2RvY2Jvb2sueHNkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsgaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluay54c2QiCisgICAgICAgICAgeG1sOmlkPSJhcHBlbmRpeC1wcm9wZXJ0aWVzIj4KKworICAgIDx0aXRsZT5Db25maWd1cmF0aW9uIFByb3BlcnRpZXM8L3RpdGxlPgorCisgICAgPHNlY3Rpb24geG1sOmlkPSJhcHBlbmRpeC1wcm9wZXJ0aWVzLWNvbW1vbiI+CisgICAgICAgIDx0aXRsZT5Db21tb24gKGNsaWVudC9zZXJ2ZXIpIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllczwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBMaXN0IG9mIGNvbW1vbiBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gJmplcnNleS5jb21tb24uQ29tbW9uUHJvcGVydGllczsgY2xhc3MuIEFsbCBvZiB0aGVzZSBwcm9wZXJ0aWVzCisgICAgICAgICAgICBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGVpciBzZXJ2ZXIvY2xpZW50IGNvdW50ZXJwYXJ0cy4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDx0YWJsZT4KKyAgICAgICAgICAgIDx0aXRsZT5MaXN0IG9mIGNvbW1vbiBjb25maWd1cmF0aW9uIHByb3BlcnRpZXM8L3RpdGxlPgorICAgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+Q29uc3RhbnQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PlZhbHVlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PiZqZXJzZXkuY29tbW9uLkNvbW1vblByb3BlcnRpZXMuRkVBVFVSRV9BVVRPX0RJU0NPVkVSWV9ESVNBQkxFOzwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+amVyc2V5LmNvbmZpZy5kaXNhYmxlQXV0b0Rpc2NvdmVyeTwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNhYmxlcyBmZWF0dXJlIGF1dG8gZGlzY292ZXJ5IGdsb2JhbGx5IG9uIGNsaWVudC9zZXJ2ZXIuIERlZmF1bHQgdmFsdWUgaXMgPGxpdGVyYWw+ZmFsc2U8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PiZqZXJzZXkuY29tbW9uLkNvbW1vblByb3BlcnRpZXMuSlNPTl9QUk9DRVNTSU5HX0ZFQVRVUkVfRElTQUJMRTs8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPmplcnNleS5jb25maWcuZGlzYWJsZUpzb25Qcm9jZXNzaW5nPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc2FibGVzIGNvbmZpZ3VyYXRpb24gb2YgSnNvbiBQcm9jZXNzaW5nIChKU1ItMzUzKSBmZWF0dXJlLiBEZWZhdWx0IHZhbHVlIGlzIDxsaXRlcmFsPmZhbHNlPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4mamVyc2V5LmNvbW1vbi5Db21tb25Qcm9wZXJ0aWVzLk1FVEFJTkZfU0VSVklDRVNfTE9PS1VQX0RJU0FCTEU7PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5qZXJzZXkuY29uZmlnLmRpc2FibGVNZXRhaW5mU2VydmljZXNMb29rdXA8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzYWJsZXMgTUVUQS1JTkYvc2VydmljZXMgbG9va3VwIGdsb2JhbGx5IG9uIGNsaWVudC9zZXJ2ZXIuIERlZmF1bHQgdmFsdWUgaXMgPGxpdGVyYWw+ZmFsc2U8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PiZqZXJzZXkuY29tbW9uLkNvbW1vblByb3BlcnRpZXMuTU9YWV9KU09OX0ZFQVRVUkVfRElTQUJMRTs8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPmplcnNleS5jb25maWcuZGlzYWJsZU1veHlKc29uPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc2FibGVzIGNvbmZpZ3VyYXRpb24gb2YgTU9YeSBKc29uIGZlYXR1cmUuIERlZmF1bHQgdmFsdWUgaXMgPGxpdGVyYWw+ZmFsc2U8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PiZqZXJzZXkuY29tbW9uLkNvbW1vblByb3BlcnRpZXMuT1VUQk9VTkRfQ09OVEVOVF9MRU5HVEhfQlVGRkVSOzwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+amVyc2V5LmNvbmZpZy5jb250ZW50TGVuZ3RoLmJ1ZmZlcjwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbiBpbnRlZ2VyIHZhbHVlIHRoYXQgZGVmaW5lcyB0aGUgYnVmZmVyIHNpemUgdXNlZCB0byBidWZmZXIgdGhlIG91dGJvdW5kIG1lc3NhZ2UgZW50aXR5IGluIG9yZGVyIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGVybWluZSBpdHMgc2l6ZSBhbmQgc2V0IHRoZSB2YWx1ZSBvZiBIVFRQIDxsaXRlcmFsPkNvbnRlbnQtTGVuZ3RoPC9saXRlcmFsPiBoZWFkZXIuIERlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgaXMgPGxpdGVyYWw+ODE5MjwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+JmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlLkxPR0dJTkdfRkVBVFVSRV9MT0dHRVJfTkFNRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+amVyc2V5LmNvbmZpZy5sb2dnaW5nLmxvZ2dlci5uYW1lPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2dnZXIgbmFtZSBvZiB0aGUgbG9nZ2luZyBmaWx0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIDxsaW5rIGxpbmtlbmQ9ImxvZ2dpbmcueG1sIj5sb2dnaW5nPC9saW5rPiBjaGFwdGVyIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxsaXRlcmFsPm9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4mamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmUuTE9HR0lOR19GRUFUVVJFX0xPR0dFUl9MRVZFTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+amVyc2V5LmNvbmZpZy5sb2dnaW5nLmxvZ2dlci5sZXZlbDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGV2ZWwgb2YgbG9nZ2luZyBmaWx0ZXIncyBsb2dnZXIgYXQgd2hpY2ggdGhlIG1lc3NhZ2VzIHdpbGwgYmUgbG9nZ2VkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZSA8bGluayBsaW5rZW5kPSJsb2dnaW5nLnhtbCI+bG9nZ2luZzwvbGluaz4gY2hhcHRlciBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PiZqZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZS5MT0dHSU5HX0ZFQVRVUkVfVkVSQk9TSVRZOworICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5qZXJzZXkuY29uZmlnLmxvZ2dpbmcudmVyYm9zaXR5PC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJib3NpdHkgb2YgbG9nZ2luZyBmaWx0ZXIgZGVzY3JpYmVzIGhvdyB2ZXJib3NlIHRoZSBsb2dnaW5nIGZpbHRlciB3aWxsIGJlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZXJlIGFyZSAzIHBvc3NpYmxlIHZhbHVlcyAmbGl0LmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlLlZlcmJvc2l0eS5IRUFERVJTX09OTFk7LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsaXQuamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmUuVmVyYm9zaXR5LlBBWUxPQURfVEVYVDsgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGl0LmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlLlZlcmJvc2l0eS5QQVlMT0FEX0FOWTsuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIDxsaW5rIGxpbmtlbmQ9ImxvZ2dpbmcueG1sIj5sb2dnaW5nPC9saW5rPiBjaGFwdGVyIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+JmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlLkxPR0dJTkdfRkVBVFVSRV9NQVhfRU5USVRZX1NJWkU7CisgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmplcnNleS5jb25maWcubG9nZ2luZy5lbnRpdHkubWF4U2l6ZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIG9mIHRoZSBlbnRpdHkgd2hpY2ggd2lsbCBiZSBsb2dnZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIDxsaW5rIGxpbmtlbmQ9ImxvZ2dpbmcueG1sIj5sb2dnaW5nPC9saW5rPiBjaGFwdGVyIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICA8L3RhYmxlPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIHhtbDppZD0iYXBwZW5kaXgtcHJvcGVydGllcy1zZXJ2ZXIiPgorICAgICAgICA8dGl0bGU+U2VydmVyIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllczwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBMaXN0IG9mIHNlcnZlciBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gJmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsgY2xhc3MuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8dGFibGU+CisgICAgICAgICAgICA8dGl0bGU+TGlzdCBvZiBzZXJ2ZXIgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzPC90aXRsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PkNvbnN0YW50PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT5WYWx1ZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4mamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzLkFQUExJQ0FUSU9OX05BTUU7PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5qZXJzZXkuY29uZmlnLnNlcnZlci5hcHBsaWNhdGlvbi5uYW1lPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZXMgdGhlIGFwcGxpY2F0aW9uIG5hbWUuIFRoZSBuYW1lIGlzIGFuIGFyYml0cmFyeSB1c2VyIGRlZmluZWQgbmFtZSB3aGljaCBpcyB1c2VkIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3Rpbmd1aXNoIGJldHdlZW4gSmVyc2V5IGFwcGxpY2F0aW9ucyBpbiB0aGUgY2FzZSB0aGF0IG1vcmUgYXBwbGljYXRpb25zIGFyZSBkZXBsb3llZCBvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc2FtZSBydW50aW1lIChjb250YWluZXIpLiBUaGUgbmFtZSBjYW4gYmUgdXNlZCBmb3IgZXhhbXBsZSBmb3IgcHVycG9zZXMgb2YgbW9uaXRvcmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSBKTVggd2hlbiBuYW1lIGlkZW50aWZpZXMgdG8gd2hpY2ggYXBwbGljYXRpb24gZGVwbG95ZWQgTUJlYW5zIGJlbG9uZyB0by4gVGhlIG5hbWUgc2hvdWxkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHVuaXF1ZSBpbiB0aGUgcnVudGltZS4gVGhlIHByb3BlcnR5IGRvZXMgbm90IGhhdmUgYSBkZWZhdWx0IHZhbHVlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PiZqZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMuQlZfRkVBVFVSRV9ESVNBQkxFOzwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+amVyc2V5LmNvbmZpZy5iZWFuVmFsaWRhdGlvbi5kaXNhYmxlLnNlcnZlcjwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNhYmxlcyBCZWFuIFZhbGlkYXRpb24gc3VwcG9ydC4gRGVmYXVsdCB2YWx1ZSBpcyA8bGl0ZXJhbD5mYWxzZTwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3NlcnZlci9TZXJ2ZXJQcm9wZXJ0aWVzLmh0bWwjQlZfRElTQUJMRV9WQUxJREFURV9PTl9FWEVDVVRBQkxFX09WRVJSSURFX0NIRUNLJz5TZXJ2ZXJQcm9wZXJ0aWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkJWX0RJU0FCTEVfVkFMSURBVEVfT05fRVhFQ1VUQUJMRV9PVkVSUklERV9DSEVDSzwvbGluaz48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPmplcnNleS5jb25maWcuYmVhblZhbGlkYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGlzYWJsZS52YWxpZGF0ZU9uRXhlY3V0YWJsZUNoZWNrLnNlcnZlcjwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNhYmxlcyAmbGl0LmJ2LlZhbGlkYXRlT25FeGVjdXRpb247IGNoZWNrLiBEZWZhdWx0IHZhbHVlIGlzIDxsaXRlcmFsPmZhbHNlPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4mamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzLkJWX1NFTkRfRVJST1JfSU5fUkVTUE9OU0U7PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5qZXJzZXkuY29uZmlnLmJlYW5WYWxpZGF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVuYWJsZU91dHB1dFZhbGlkYXRpb25FcnJvckVudGl0eS5zZXJ2ZXI8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5hYmxlcyBzZW5kaW5nIHZhbGlkYXRpb24gZXJyb3IgaW5mb3JtYXRpb24gdG8gdGhlIGNsaWVudC4gRGVmYXVsdCB2YWx1ZSBpcyA8bGl0ZXJhbD5mYWxzZTwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+JmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcy5GRUFUVVJFX0FVVE9fRElTQ09WRVJZX0RJU0FCTEU7PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5qZXJzZXkuY29uZmlnLnNlcnZlci5kaXNhYmxlQXV0b0Rpc2NvdmVyeTwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNhYmxlcyBmZWF0dXJlIGF1dG8gZGlzY292ZXJ5IG9uIHNlcnZlci4gRGVmYXVsdCB2YWx1ZSBpcyA8bGl0ZXJhbD5mYWxzZTwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+JmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcy5IVFRQX01FVEhPRF9PVkVSUklERTs8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPmplcnNleS5jb25maWcuc2VydmVyLmh0dHBNZXRob2RPdmVycmlkZTwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmVzIGNvbmZpZ3VyYXRpb24gb2YgSFRUUCBtZXRob2Qgb3ZlcnJpZGluZy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIGJ5ICZqZXJzZXkuc2VydmVyLkh0dHBNZXRob2RPdmVycmlkZUZpbHRlcjsgdG8gZGV0ZXJtaW5lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZXJlIGl0IHNob3VsZCBsb29rIGZvciBtZXRob2Qgb3ZlcnJpZGUgaW5mb3JtYXRpb24gKGUuZy4gcmVxdWVzdCBoZWFkZXIgb3IgcXVlcnkgcGFyYW1ldGVycykuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+JmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcy5KU09OX1BST0NFU1NJTkdfRkVBVFVSRV9ESVNBQkxFOzwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+amVyc2V5LmNvbmZpZy5zZXJ2ZXIuZGlzYWJsZUpzb25Qcm9jZXNzaW5nPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc2FibGVzIGNvbmZpZ3VyYXRpb24gb2YgSnNvbiBQcm9jZXNzaW5nIChKU1ItMzUzKSBmZWF0dXJlLiBEZWZhdWx0IHZhbHVlIGlzIDxsaXRlcmFsPmZhbHNlPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4mamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzLkxBTkdVQUdFX01BUFBJTkdTOzwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+amVyc2V5LmNvbmZpZy5zZXJ2ZXIubGFuZ3VhZ2VNYXBwaW5nczwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZpbmVzIG1hcHBpbmcgb2YgVVJJIGV4dGVuc2lvbnMgdG8gbGFuZ3VhZ2VzLiBUaGUgcHJvcGVydHkgaXMgdXNlZCBieSAmamVyc2V5LnNlcnZlci5VcmlDb25uZWdGaWx0ZXI7LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PiZqZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMuTUVESUFfVFlQRV9NQVBQSU5HUzs8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPmplcnNleS5jb25maWcuc2VydmVyLm1lZGlhVHlwZU1hcHBpbmdzPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZXMgbWFwcGluZyBvZiBVUkkgZXh0ZW5zaW9ucyB0byBtZWRpYSB0eXBlcy4gVGhlIHByb3BlcnR5IGlzIHVzZWQgYnkgJmplcnNleS5zZXJ2ZXIuVXJpQ29ubmVnRmlsdGVyOy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4mamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzLk1FVEFJTkZfU0VSVklDRVNfTE9PS1VQX0RJU0FCTEU7PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5qZXJzZXkuY29uZmlnLnNlcnZlci5kaXNhYmxlTWV0YWluZlNlcnZpY2VzTG9va3VwPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc2FibGVzIE1FVEEtSU5GL3NlcnZpY2VzIGxvb2t1cCBvbiBzZXJ2ZXIuIERlZmF1bHQgdmFsdWUgaXMgPGxpdGVyYWw+ZmFsc2U8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PiZqZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMuTU9YWV9KU09OX0ZFQVRVUkVfRElTQUJMRTs8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPmplcnNleS5jb25maWcuc2VydmVyLmRpc2FibGVNb3h5SnNvbjwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNhYmxlcyBjb25maWd1cmF0aW9uIG9mIE1PWHkgSnNvbiBmZWF0dXJlLiBEZWZhdWx0IHZhbHVlIGlzIDxsaXRlcmFsPmZhbHNlPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4mamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzLk1PTklUT1JJTkdfRU5BQkxFRDsgKEplcnNleSAyLjEyIG9yIGxhdGVyKTwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+amVyc2V5LmNvbmZpZy5zZXJ2ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAubW9uaXRvcmluZy5zdGF0aXN0aWNzLmVuYWJsZWQ8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgJmxpdC50cnVlOywgdGhlbiBhcHBsaWNhdGlvbiBtb25pdG9yaW5nIHdpbGwgYmUgZW5hYmxlZC4gVGhpcyB3aWxsIGVuYWJsZSB0aGUgcG9zc2liaWxpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgaW5qZWN0aW5nICZqZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuQXBwbGljYXRpb25JbmZvOyBpbnRvIHJlc291cmNlIGFuZCBwcm92aWRlcnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHQgdmFsdWUgaXMgJmxpdC5mYWxzZTsuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+JmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcy5NT05JVE9SSU5HX1NUQVRJU1RJQ1NfRU5BQkxFRDs8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPmplcnNleS5jb25maWcuc2VydmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1vbml0b3JpbmcuZW5hYmxlZDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiAmbGl0LnRydWU7LCB0aGUgY2FsY3VsYXRpb24gb2YgbW9uaXRvcmluZyBzdGF0aXN0aWNzIHdpbGwgYmUgZW5hYmxlZC4gVGhpcyB3aWxsIGVuYWJsZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zc2liaWxpdHkgb2YgaW5qZWN0aW5nICZqZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuTW9uaXRvcmluZ1N0YXRpc3RpY3M7IGludG8gcmVzb3VyY2UgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVycyBhbmQgYWxzbyB0aGUgcmVnaXN0ZXJlZCBsaXN0ZW5lcnMgaW1wbGVtZW50aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZqZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuTW9uaXRvcmluZ1N0YXRpc3RpY3NMaXN0ZW5lcjsgd2lsbCBiZSBjYWxsZWQgd2hlbiBzdGF0aXN0aWNzIGFyZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUgZm9yIHByb2Nlc3NpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vbml0b3Jpbmcgc3RhdGlzdGljcyBleHRlbmRzIGJhc2ljIG1vbml0b3JpbmcgZmVhdHVyZS4gVGhlcmVmb3JlIHdoZW4gZW5hYmxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1vbml0b3JpbmcgZ2V0cyBhdXRvbWF0aWNhbGx5IGVuYWJsZWQgdG9vICh0aGUgc2FtZSByZXN1bHQgYXMgc2V0dGluZyB0aGUgcHJvcGVydHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcy5NT05JVE9SSU5HX0VOQUJMRUQ7IHRvICZsaXQudHJ1ZTspLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgZW5hYmxpbmcgc3RhdGlzdGljcyBtYXkgaGF2ZSBhIG5lZ2F0aXZlIHBlcmZvcm1hbmNlIGltcGFjdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlcmVmb3JlIHNob3VsZCBiZSBlbmFibGVkIG9ubHkgd2hlbiBuZWVkZWQuIERlZmF1bHQgdmFsdWUgaXMgJmxpdC5mYWxzZTsuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+JmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcy5NT05JVE9SSU5HX1NUQVRJU1RJQ1NfTUJFQU5TX0VOQUJMRUQ7PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5qZXJzZXkuY29uZmlnLnNlcnZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tb25pdG9yaW5nLnN0YXRpc3RpY3MubWJlYW5zLmVuYWJsZWQ8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgJmxpdC50cnVlOyB0aGVuIEplcnNleSB3aWxsIGV4cG9zZSBNQmVhbnMgZm9yIHRoZSBjb2xsZWN0ZWQgbW9uaXRvcmluZyBzdGF0aXN0aWNzLiBFeHBvc2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpNWCBNQmVhbnMgYXJlIGJhc2VkIG9uICZqZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuTW9uaXRvcmluZ1N0YXRpc3RpY3M7IGRhdGEgYW5kIHRoZXJlZm9yZSB3aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQsIHRoZSBjYWxjdWxhdGlvbiBvZiBtb25pdG9yaW5nIHN0YXRpc3RpY3MgZ2V0cyBhdXRvbWF0aWNhbGx5IGVuYWJsZWQgdG9vICh0aGUgc2FtZSByZXN1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgc2V0dGluZyB0aGUgcHJvcGVydHkgJmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcy5NT05JVE9SSU5HX1NUQVRJU1RJQ1NfRU5BQkxFRDsgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpdC50cnVlOykuIE5vdGUgdGhhdCBlbmFibGluZyBNQmVhbnMgZm9yIG1vbml0b3Jpbmcgc3RhdGlzdGljcyBtYXkgaGF2ZSBhIG5lZ2F0aXZlIHBlcmZvcm1hbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGFjdCBhbmQgdGhlcmVmb3JlIHNob3VsZCBiZSBlbmFibGVkIG9ubHkgd2hlbiBuZWVkZWQuIERlZmF1bHQgdmFsdWUgaXMgJmxpdC5mYWxzZTsuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+JmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcy5NT05JVE9SSU5HX1NUQVRJU1RJQ1NfUkVGUkVTSF9JTlRFUlZBTDsgKEplcnNleSAyLjEwIG9yIGxhdGVyKTwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+amVyc2V5LmNvbmZpZy5zZXJ2ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAubW9uaXRvcmluZy5zdGF0aXN0aWNzLnJlZnJlc2guaW50ZXJ2YWw8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJ2YWwgKGluIDxsaXRlcmFsPm1zPC9saXRlcmFsPn0pIGluZGljYXRpbmcgaG93IG9mdGVuIHdpbGwgYmUgbW9uaXRvcmluZyBzdGF0aXN0aWNzIHJlZnJlc2hlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoPGxpdGVyYWw+b25TdGF0aXN0aWNzPC9saXRlcmFsPiBtZXRob2QgY2FsbGVkKS4gRGVmYXVsdCB2YWx1ZSBpcyA8bGl0ZXJhbD41MDA8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PiZqZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMuT1VUQk9VTkRfQ09OVEVOVF9MRU5HVEhfQlVGRkVSOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChKZXJzZXkgMi4yIG9yIGxhdGVyKTwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+amVyc2V5LmNvbmZpZy5jb250ZW50TGVuZ3RoLnNlcnZlci5idWZmZXI8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW4gaW50ZWdlciB2YWx1ZSB0aGF0IGRlZmluZXMgdGhlIGJ1ZmZlciBzaXplIHVzZWQgdG8gYnVmZmVyIHRoZSBvdXRib3VuZCBtZXNzYWdlIGVudGl0eSBpbiBvcmRlciB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRlcm1pbmUgaXRzIHNpemUgYW5kIHNldCB0aGUgdmFsdWUgb2YgSFRUUCA8bGl0ZXJhbD5Db250ZW50LUxlbmd0aDwvbGl0ZXJhbD4gaGVhZGVyLiBEZWZhdWx0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGlzIDxsaXRlcmFsPjgxOTI8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PiZqZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMuUFJPVklERVJfQ0xBU1NOQU1FUzs8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPmplcnNleS5jb25maWcuc2VydmVyLnByb3ZpZGVyLmNsYXNzbmFtZXM8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lcyBvbmUgb3IgbW9yZSBjbGFzcyBuYW1lcyB0aGF0IGltcGxlbWVudCBhcHBsaWNhdGlvbi1zcGVjaWZpYyByZXNvdXJjZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHByb3ZpZGVycy4gSWYgdGhlIHByb3BlcnR5IGlzIHNldCwgdGhlIHNwZWNpZmllZCBjbGFzc2VzIHdpbGwgYmUgaW5zdGFudGlhdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCByZWdpc3RlcmVkIGFzIGVpdGhlciBhcHBsaWNhdGlvbiBKQVgtUlMgcm9vdCByZXNvdXJjZXMgb3IgcHJvdmlkZXJzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PiZqZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMuUFJPVklERVJfQ0xBU1NQQVRIOzwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+amVyc2V5LmNvbmZpZy5zZXJ2ZXIucHJvdmlkZXIuY2xhc3NwYXRoPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZXMgY2xhc3MtcGF0aCB0aGF0IGNvbnRhaW5zIGFwcGxpY2F0aW9uLXNwZWNpZmljIHJlc291cmNlcyBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJzLiBJZiB0aGUgcHJvcGVydHkgaXMgc2V0LCB0aGUgc3BlY2lmaWVkIHBhY2thZ2VzIHdpbGwgYmUgc2Nhbm5lZCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYLVJTIHJvb3QgcmVzb3VyY2VzIGFuZCBwcm92aWRlcnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+JmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcy5QUk9WSURFUl9QQUNLQUdFUzs8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPmplcnNleS5jb25maWcuc2VydmVyLnByb3ZpZGVyLnBhY2thZ2VzPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZXMgb25lIG9yIG1vcmUgcGFja2FnZXMgdGhhdCBjb250YWluIGFwcGxpY2F0aW9uLXNwZWNpZmljIHJlc291cmNlcyBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJzLiBJZiB0aGUgcHJvcGVydHkgaXMgc2V0LCB0aGUgc3BlY2lmaWVkIHBhY2thZ2VzIHdpbGwgYmUgc2Nhbm5lZCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYLVJTIHJvb3QgcmVzb3VyY2VzIGFuZCBwcm92aWRlcnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+JmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcy5QUk9WSURFUl9TQ0FOTklOR19SRUNVUlNJVkU7PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5qZXJzZXkuY29uZmlnLnNlcnZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm92aWRlci5zY2FubmluZy5yZWN1cnNpdmU8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0cyB0aGUgcmVjdXJzaW9uIHN0cmF0ZWd5IGZvciBwYWNrYWdlIHNjYW5uaW5nLiBEZWZhdWx0IHZhbHVlIGlzIDxsaXRlcmFsPnRydWU8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PiZqZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMuUkVEVUNFX0NPTlRFWFRfUEFUSF9TTEFTSEVTX0VOQUJMRUQ7PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5qZXJzZXkuY29uZmlnLnNlcnZlci5yZWR1Y2VDb250ZXh0UGF0aFNsYXNoZXMuZW5hYmxlZDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZ25vcmVzIG11bHRpcGxlIHNsYXNoZXMgYmV0d2VlbiBhIHBvcnQgYW5kIGEgY29udGV4dCBwYXRoIGFuZCB3aWxsIHJlc29sdmUgaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXMgVVJJIHdpdGggb25seSBvbmUgc2xhc2guIERlZmF1bHQgdmFsdWUgaXMgPGxpdGVyYWw+ZmFsc2U8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PiZqZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMuUkVTT1VSQ0VfVkFMSURBVElPTl9ESVNBQkxFOzwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+amVyc2V5LmNvbmZpZy5zZXJ2ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVzb3VyY2UudmFsaWRhdGlvbi5kaXNhYmxlPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpc2FibGVzIDxsaXRlcmFsPlJlc291cmNlPC9saXRlcmFsPiB2YWxpZGF0aW9uLiBEZWZhdWx0IHZhbHVlIGlzIDxsaXRlcmFsPmZhbHNlPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4mamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzLlJFU09VUkNFX1ZBTElEQVRJT05fSUdOT1JFX0VSUk9SUzs8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPmplcnNleS5jb25maWcuc2VydmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlc291cmNlLnZhbGlkYXRpb24uaWdub3JlRXJyb3JzPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldGVybWluZXMgd2hldGhlciB2YWxpZGF0aW9uIG9mIGFwcGxpY2F0aW9uIHJlc291cmNlIG1vZGVscyBzaG91bGQgZmFpbCBldmVuIGluIGNhc2Ugb2YgYSBmYXRhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uIGVycm9ycy4gRGVmYXVsdCB2YWx1ZSBpcyA8bGl0ZXJhbD5mYWxzZTwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+JmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcy5XQURMX0ZFQVRVUkVfRElTQUJMRTs8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPmplcnNleS5jb25maWcuc2VydmVyLndhZGwuZGlzYWJsZVdhZGw8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzYWJsZXMgV0FETCBnZW5lcmF0aW9uLiBEZWZhdWx0IHZhbHVlIGlzIDxsaXRlcmFsPmZhbHNlPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4mamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzLldBRExfR0VORVJBVE9SX0NPTkZJRzs8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPmplcnNleS5jb25maWcuc2VydmVyLndhZGwuZ2VuZXJhdG9yQ29uZmlnPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZXMgdGhlIHdhZGwgZ2VuZXJhdG9yIGNvbmZpZ3VyYXRpb24gdGhhdCBwcm92aWRlcyBhICZqZXJzZXkuc2VydmVyLldhZGxHZW5lcmF0b3I7LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PiZqZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMuUkVTUE9OU0VfU0VUX1NUQVRVU19PVkVSX1NFTkRfRVJST1I7PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5qZXJzZXkuY29uZmlnLnNlcnZlci5yZXNwb25zZS5zZXRTdGF0dXNPdmVyU2VuZEVycm9yPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdoZW5ldmVyIHJlc3BvbnNlIHN0YXR1cyBpcyA8bGl0ZXJhbD40eHg8L2xpdGVyYWw+IG9yIDxsaXRlcmFsPjV4eDwvbGl0ZXJhbD4gaXQgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zc2libGUgdG8gY2hvb3NlIGJldHdlZW4gPGxpdGVyYWw+c2VuZEVycm9yPC9saXRlcmFsPiBvciA8bGl0ZXJhbD5zZXRTdGF0dXM8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIGNvbnRhaW5lciBzcGVjaWZpYyA8bGl0ZXJhbD5SZXNwb25zZTwvbGl0ZXJhbD4gaW1wbGVtZW50YXRpb24uIEUuZy4gb24gc2VydmxldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIgSmVyc2V5IGNhbiBjYWxsIDxsaXRlcmFsPkh0dHBTZXJ2bGV0UmVzcG9uc2Uuc2V0U3RhdHVzKC4uLik8L2xpdGVyYWw+IG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPkh0dHBTZXJ2bGV0UmVzcG9uc2Uuc2VuZEVycm9yKC4uLik8L2xpdGVyYWw+LgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxpbmcgPGxpdGVyYWw+c2VuZEVycm9yKC4uLik8L2xpdGVyYWw+IG1ldGhvZCB1c3VhbGx5IHJlc2V0cyBlbnRpdHksIHJlc3BvbnNlIGhlYWRlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHByb3ZpZGUgZXJyb3IgcGFnZSBmb3Igc3BlY2lmaWVkIHN0YXR1cyBjb2RlIChlLmcuIHNlcnZsZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+ZXJyb3ItcGFnZTwvbGl0ZXJhbD4gY29uZmlndXJhdGlvbikuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhvd2V2ZXIgaWYgeW91IHdhbnQgdG8gcG9zdC1wcm9jZXNzIHJlc3BvbnNlIChlLmcuIGJ5IHNlcnZsZXQgZmlsdGVyKSB0aGUgb25seQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXkgdG8gZG8gaXQgaXMgY2FsbGluZyA8bGl0ZXJhbD5zZXRTdGF0dXMoLi4uKTwvbGl0ZXJhbD4gb24gY29udGFpbmVyIFJlc3BvbnNlIG9iamVjdC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBwcm9wZXJ0eSB2YWx1ZSBpcyAmbGl0LnRydWU7IHRoZSBtZXRob2QgPGxpdGVyYWw+UmVzcG9uc2Uuc2V0U3RhdHVzKC4uLik8L2xpdGVyYWw+IGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgb3ZlciBkZWZhdWx0IDxsaXRlcmFsPlJlc3BvbnNlLnNlbmRFcnJvciguLi4pPC9saXRlcmFsPi4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlIG9mIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyA8bGl0ZXJhbD5ib29sZWFuPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgJmxpdC5mYWxzZTsuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+JmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcy5UUkFDSU5HOzwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+amVyc2V5LmNvbmZpZy5zZXJ2ZXIudHJhY2luZy50eXBlPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuYWJsZXMvZGlzYWJsZXMgdHJhY2luZyBzdXBwb3J0LiBQb3NzaWJsZSB2YWx1ZXMgYXJlIDxsaXRlcmFsPk9GRjwvbGl0ZXJhbD4gKGRlZmF1bHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5PTl9ERU1BTkQ8L2xpdGVyYWw+IGFuZCA8bGl0ZXJhbD5BTEw8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWUgPHhyZWYgbGlua2VuZD0idHJhY2luZy5jb25maWd1cmF0aW9uIiAvPiBmb3IgbW9yZSBkZXRhaWwuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+JmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcy5UUkFDSU5HX1RIUkVTSE9MRDs8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPmplcnNleS5jb25maWcuc2VydmVyLnRyYWNpbmcudGhyZXNob2xkPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldHMgdGhlIGFtb3VudCBvZiBkZXRhaWwgcHJvdmlkZWQgYnkgdHJhY2luZy4gUG9zc2libGUgdmFsdWVzIGFyZSA8bGl0ZXJhbD5TVU1NQVJZPC9saXRlcmFsPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+VFJBQ0U8L2xpdGVyYWw+IGFuZCA8bGl0ZXJhbD5WRVJCT1NFPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIDx4cmVmIGxpbmtlbmQ9InRyYWNpbmcuY29uZmlndXJhdGlvbiIgLz4gdG8gbGVhcm4gbW9yZSBhYm91dCB0aGUgbGV2ZWxzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PiZqZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMuUFJPQ0VTU0lOR19SRVNQT05TRV9FUlJPUlNfRU5BQkxFRDs8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPmplcnNleS5jb25maWcuc2VydmVyLmV4Y2VwdGlvbi5wcm9jZXNzUmVzcG9uc2VFcnJvcnM8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgcHJvcGVydHkgdmFsdWUgaXMgPGxpdGVyYWw+dHJ1ZTwvbGl0ZXJhbD4gdGhlbiB0aGUgZXJyb3JzIHJhaXNlZCBkdXJpbmcgcmVzcG9uc2UgcHJvY2Vzc2luZyBhcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZWQgdG8gYmUgaGFuZGxlZCB1c2luZyBhdmFpbGFibGUgcmVzcG9uc2UgZXJyb3IgbWFwcGVycy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4mamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzLlNVQlJFU09VUkNFX0xPQ0FUT1JfQ0FDSEVfU0laRTs8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPmplcnNleS5jb25maWcuc2VydmVyLnN1YnJlc291cmNlLmNhY2hlLnNpemU8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW4gaW50ZWdlciB2YWx1ZSB0aGF0IGRlZmluZXMgdGhlIHNpemUgb2YgY2FjaGUgZm9yIHN1Yi1yZXNvdXJjZSBsb2NhdG9yIG1vZGVscy4gVGhlIGNhY2hlIGlzIHVzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gcHJvdmlkZSBiZXR0ZXIgcGVyZm9ybWFuY2UgZm9yIGFwcGxpY2F0aW9uIHRoYXQgdXNlcyBKQVgtUlMgc3ViLXJlc291cmNlIGxvY2F0b3JzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PiZqZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMuU1VCUkVTT1VSQ0VfTE9DQVRPUl9DQUNIRV9TSVpFOzwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+amVyc2V5LmNvbmZpZy5zZXJ2ZXIuc3VicmVzb3VyY2UuY2FjaGUuc2l6ZTwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbiBpbnRlZ2VyIHZhbHVlIHRoYXQgZGVmaW5lcyB0aGUgbWF4aW11bSBhZ2UgKGluIHNlY29uZHMpIGZvciBjYWNoZWQgZm9yIHN1Yi1yZXNvdXJjZSBsb2NhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGVscy4gVGhlIGFnZSBvZiBhbiBjYWNoZSBlbnRyeSBpcyBkZWZpbmVkIGFzIHRoZSB0aW1lIHNpbmNlIHRoZSBsYXN0IGFjY2VzcyAocmVhZCkgdG8gdGhlIGVudHJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBjYWNoZS4gRW50cnkgYWdpbmcgaXMgbm90IGVuYWJsZWQgYnkgZGVmYXVsdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4mamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzLlNVQlJFU09VUkNFX0xPQ0FUT1JfQ0FDSEVfSkVSU0VZX1JFU09VUkNFX0VOQUJMRUQ7PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5qZXJzZXkuY29uZmlnLnNlcnZlci5zdWJyZXNvdXJjZS5jYWNoZS5qZXJzZXkucmVzb3VyY2UuZW5hYmxlZDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiA8bGl0ZXJhbD50cnVlPC9saXRlcmFsPiB0aGVuIEplcnNleSB3aWxsIGNhY2hlIEplcnNleSByZXNvdXJjZXMgaW4gYWRkaXRpb24gdG8gY2FjaGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWItcmVzb3VyY2UgbG9jYXRvciBjbGFzc2VzIGFuZCBpbnN0YW5jZXMgKHdoaWNoIGFyZSBjYWNoZWQgYnkgZGVmYXVsdCkuIFRvIG1ha2Ugc3VyZSB0aGUgY2FjaGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBlZmZlY3RpdmUgaW4gdGhpcyBjYXNlIHlvdSBuZWVkIHRvIHJldHVybiBzYW1lIEplcnNleSBSZXNvdXJjZSBpbnN0YW5jZXMgZm9yIHNhbWUgaW5wdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyBmcm9tIHJlc291cmNlIG1ldGhvZC4gVGhpcyBtZWFucyB0aGF0IGdlbmVyYXRpbmcgbmV3IEplcnNleSBSZXNvdXJjZSBpbnN0YW5jZXMgZm9yIHNhbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQgcGFyYW1ldGVycyB3b3VsZCBub3QgaGF2ZSBhbnkgcGVyZm9ybWFuY2UgZWZmZWN0IGFuZCBpdCB3b3VsZCBvbmx5IGZpbGwtdXAgdGhlIGNhY2hlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PiZqZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMuTE9DQVRJT05fSEVBREVSX1JFTEFUSVZFX1VSSV9SRVNPTFVUSU9OX0RJU0FCTEVEOzwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+amVyc2V5LmNvbmZpZy5zZXJ2ZXIuaGVhZGVycy5sb2NhdGlvbi5yZWxhdGl2ZS5yZXNvbHV0aW9uLmRpc2FibGVkPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIDxsaXRlcmFsPnRydWU8L2xpdGVyYWw+LCBKZXJzZXkgd2lsbCBub3QgcmVzb2x2ZSByZWxhdGl2ZSBVUklzIGluIHRoZSA8bGl0ZXJhbD5Mb2NhdGlvbjwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cCBoZWFkZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+JmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlLkxPR0dJTkdfRkVBVFVSRV9MT0dHRVJfTkFNRV9TRVJWRVI7CisgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmplcnNleS5jb25maWcuc2VydmVyLmxvZ2dpbmcubG9nZ2VyLm5hbWU8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dlciBuYW1lIG9mIHRoZSBsb2dnaW5nIGZpbHRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWUgPGxpbmsgbGlua2VuZD0ibG9nZ2luZy54bWwiPmxvZ2dpbmc8L2xpbms+IGNoYXB0ZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGxpdGVyYWw+b3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PiZqZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZS5MT0dHSU5HX0ZFQVRVUkVfTE9HR0VSX0xFVkVMX1NFUlZFUjsKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+amVyc2V5LmNvbmZpZy5zZXJ2ZXIubG9nZ2luZy5sb2dnZXIubGV2ZWw8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExldmVsIG9mIGxvZ2dpbmcgZmlsdGVyJ3MgbG9nZ2VyIGF0IHdoaWNoIHRoZSBtZXNzYWdlcyB3aWxsIGJlIGxvZ2dlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWUgPGxpbmsgbGlua2VuZD0ibG9nZ2luZy54bWwiPmxvZ2dpbmc8L2xpbms+IGNoYXB0ZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4mamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmUuTE9HR0lOR19GRUFUVVJFX1ZFUkJPU0lUWV9TRVJWRVI7CisgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmplcnNleS5jb25maWcuc2VydmVyLmxvZ2dpbmcudmVyYm9zaXR5PC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJib3NpdHkgb2YgbG9nZ2luZyBmaWx0ZXIgZGVzY3JpYmVzIGhvdyB2ZXJib3NlIHRoZSBsb2dnaW5nIGZpbHRlciB3aWxsIGJlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZXJlIGFyZSAzIHBvc3NpYmxlIHZhbHVlcyAmbGl0LmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlLlZlcmJvc2l0eS5IRUFERVJTX09OTFk7LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsaXQuamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmUuVmVyYm9zaXR5LlBBWUxPQURfVEVYVDsgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGl0LmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlLlZlcmJvc2l0eS5QQVlMT0FEX0FOWTsuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VlIDxsaW5rIGxpbmtlbmQ9ImxvZ2dpbmcueG1sIj5sb2dnaW5nPC9saW5rPiBjaGFwdGVyIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+JmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlLkxPR0dJTkdfRkVBVFVSRV9NQVhfRU5USVRZX1NJWkVfU0VSVkVSOworICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5qZXJzZXkuY29uZmlnLnNlcnZlci5sb2dnaW5nLmVudGl0eS5tYXhTaXplPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgb2YgdGhlIGVudGl0eSB3aGljaCB3aWxsIGJlIGxvZ2dlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWUgPGxpbmsgbGlua2VuZD0ibG9nZ2luZy54bWwiPmxvZ2dpbmc8L2xpbms+IGNoYXB0ZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgIDwvdGFibGU+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24geG1sOmlkPSJhcHBlbmRpeC1wcm9wZXJ0aWVzLXNlcnZsZXQiPgorICAgICAgICA8dGl0bGU+U2VydmxldCBjb25maWd1cmF0aW9uIHByb3BlcnRpZXM8L3RpdGxlPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgTGlzdCBvZiBzZXJ2bGV0IGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyB0aGF0IGNhbiBiZSBmb3VuZCBpbiAmamVyc2V5LnNlcnZsZXQuU2VydmxldFByb3BlcnRpZXM7IGNsYXNzLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHRhYmxlPgorICAgICAgICAgICAgPHRpdGxlPkxpc3Qgb2Ygc2VydmxldCBjb25maWd1cmF0aW9uIHByb3BlcnRpZXM8L3RpdGxlPgorICAgICAgICAgICAgPHRncm91cCBjb2xzPSIzIj4KKyAgICAgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+Q29uc3RhbnQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PlZhbHVlPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PiZqZXJzZXkuc2VydmxldC5TZXJ2bGV0UHJvcGVydGllcy5GSUxURVJfQ09OVEVYVF9QQVRIOzwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+amVyc2V5LmNvbmZpZy5zZXJ2bGV0LmZpbHRlci5jb250ZXh0UGF0aDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBzZXQsIGluZGljYXRlcyB0aGUgVVJMIHBhdHRlcm4gb2YgdGhlIEplcnNleSBzZXJ2bGV0IGZpbHRlciBjb250ZXh0IHBhdGguCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+JmplcnNleS5zZXJ2bGV0LlNlcnZsZXRQcm9wZXJ0aWVzLkZJTFRFUl9GT1JXQVJEX09OXzQwNDs8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPmplcnNleS5jb25maWcuc2VydmxldC5maWx0ZXIuZm9yd2FyZE9uNDA0PC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHNldCB0byA8bGl0ZXJhbD50cnVlPC9saXRlcmFsPiBhbmQgYSA0MDQgcmVzcG9uc2Ugd2l0aCBubyBlbnRpdHkgYm9keSBpcyByZXR1cm5lZCBmcm9tIGVpdGhlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcnVudGltZSBvciB0aGUgYXBwbGljYXRpb24gdGhlbiB0aGUgcnVudGltZSBmb3J3YXJkcyB0aGUgcmVxdWVzdCB0byB0aGUgbmV4dCBmaWx0ZXIgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlciBjaGFpbi4gVGhpcyBlbmFibGVzIGFub3RoZXIgZmlsdGVyIG9yIHRoZSB1bmRlcmx5aW5nIHNlcnZsZXQgZW5naW5lIHRvIHByb2Nlc3MgdGhlIHJlcXVlc3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJlZm9yZSB0aGUgcmVxdWVzdCBpcyBmb3J3YXJkZWQgdGhlIHJlc3BvbnNlIHN0YXR1cyBpcyBzZXQgdG8gMjAwLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PiZqZXJzZXkuc2VydmxldC5TZXJ2bGV0UHJvcGVydGllcy5GSUxURVJfU1RBVElDX0NPTlRFTlRfUkVHRVg7PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5qZXJzZXkuY29uZmlnLnNlcnZsZXQuZmlsdGVyLnN0YXRpY0NvbnRlbnRSZWdleDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBzZXQgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBpcyB1c2VkIHRvIG1hdGNoIGFuIGluY29taW5nIHNlcnZsZXQgcGF0aCBVUkkgdG8gc29tZSB3ZWIgcGFnZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50IHN1Y2ggYXMgc3RhdGljIHJlc291cmNlcyBvciBKU1BzIHRvIGJlIGhhbmRsZWQgYnkgdGhlIHVuZGVybHlpbmcgc2VydmxldCBlbmdpbmUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+JmplcnNleS5zZXJ2bGV0LlNlcnZsZXRQcm9wZXJ0aWVzLkpBWFJTX0FQUExJQ0FUSU9OX0NMQVNTOzwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+amF2YXgud3MucnMuQXBwbGljYXRpb248L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBwbGljYXRpb24gY29uZmlndXJhdGlvbiBpbml0aWFsaXphdGlvbiBwcm9wZXJ0eSB3aG9zZSB2YWx1ZSBpcyBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIEpBWC1SUyBBcHBsaWNhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4mamVyc2V5LnNlcnZsZXQuU2VydmxldFByb3BlcnRpZXMuUFJPVklERVJfV0VCX0FQUDs8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPmplcnNleS5jb25maWcuc2VydmxldC5wcm92aWRlci53ZWJhcHA8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kaWNhdGVzIHRoYXQgSmVyc2V5IHNob3VsZCBzY2FuIHRoZSB3aG9sZSB3ZWIgYXBwIGZvciBhcHBsaWNhdGlvbi1zcGVjaWZpYyByZXNvdXJjZXMgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVycy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4mamVyc2V5LnNlcnZsZXQuU2VydmxldFByb3BlcnRpZXMuUVVFUllfUEFSQU1TX0FTX0ZPUk1fUEFSQU1TX0RJU0FCTEVEOzwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+amVyc2V5LmNvbmZpZy5zZXJ2bGV0LmZvcm0ucXVlcnlQYXJhbXMuZGlzYWJsZWQ8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgPGxpdGVyYWw+dHJ1ZTwvbGl0ZXJhbD4gdGhlbiBxdWVyeSBwYXJhbWV0ZXJzIHdpbGwgbm90IGJlIHRyZWF0ZWQgYXMgZm9ybSBwYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlLmcuIGluamVjdGFibGUgdXNpbmcgQEZvcm1QYXJhbSkgaW4gY2FzZSBhIEZvcm0gcmVxdWVzdCBpcyBwcm9jZXNzZWQgYnkgc2VydmVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PiZqZXJzZXkuc2VydmxldC5TZXJ2bGV0UHJvcGVydGllcy5TRVJWSUNFX0xPQ0FUT1I7PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5qZXJzZXkuY29uZmlnLnNlcnZsZXQuY29udGV4dC5zZXJ2aWNlTG9jYXRvcjwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZGVudGlmaWVzIHRoZSBvYmplY3QgdGhhdCB3aWxsIGJlIHVzZWQgYXMgYSBwYXJlbnQgU2VydmljZUxvY2F0b3IgaW4gdGhlIEplcnNleSBXZWJDb21wb25lbnQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICA8L3RhYmxlPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIHhtbDppZD0iYXBwZW5kaXgtcHJvcGVydGllcy1jbGllbnQiPgorICAgICAgICA8dGl0bGU+Q2xpZW50IGNvbmZpZ3VyYXRpb24gcHJvcGVydGllczwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBMaXN0IG9mIGNsaWVudCBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgdGhhdCBjYW4gYmUgZm91bmQgaW4gJmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllczsgY2xhc3MuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8dGFibGU+CisgICAgICAgICAgICA8dGl0bGU+TGlzdCBvZiBjbGllbnQgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzPC90aXRsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PkNvbnN0YW50PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT5WYWx1ZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+RGVzY3JpcHRpb248L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4mamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzLkFTWU5DX1RIUkVBRFBPT0xfU0laRTs8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPmplcnNleS5jb25maWcuY2xpZW50LmFzeW5jLnRocmVhZFBvb2xTaXplPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzeW5jaHJvbm91cyB0aHJlYWQgcG9vbCBzaXplLiBEZWZhdWx0IHZhbHVlIGlzIG5vdCBzZXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5TdXBwb3J0ZWQgd2l0aCAmamVyc2V5LmdyaXp6bHkuR3JpenpseUNvbm5lY3RvclByb3ZpZGVyOyBvbmx5LjwvZW1waGFzaXM+LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PiZqZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXMuQ0hVTktFRF9FTkNPRElOR19TSVpFOzwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+amVyc2V5LmNvbmZpZy5jbGllbnQuY2h1bmtlZEVuY29kaW5nU2l6ZTwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaHVua2VkIGVuY29kaW5nIHNpemUuIERlZmF1bHQgdmFsdWUgaXMgbm90IHNldC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4mamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzLkNPTk5FQ1RfVElNRU9VVDs8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPmplcnNleS5jb25maWcuY2xpZW50LmNvbm5lY3RUaW1lb3V0PC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWQgdGltZW91dCBpbnRlcnZhbCwgaW4gbWlsbGlzZWNvbmRzLiBEZWZhdWx0IHZhbHVlIGlzIDxsaXRlcmFsPjA8L2xpdGVyYWw+IChpbmZpbml0eSkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+JmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllcy5GRUFUVVJFX0FVVE9fRElTQ09WRVJZX0RJU0FCTEU7PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5qZXJzZXkuY29uZmlnLmNsaWVudC5kaXNhYmxlQXV0b0Rpc2NvdmVyeTwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNhYmxlcyBmZWF0dXJlIGF1dG8gZGlzY292ZXJ5IG9uIGNsaWVudC4gRGVmYXVsdCB2YWx1ZSBpcyA8bGl0ZXJhbD5mYWxzZTwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+JmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllcy5GT0xMT1dfUkVESVJFQ1RTOzwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+amVyc2V5LmNvbmZpZy5jbGllbnQuZm9sbG93UmVkaXJlY3RzPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY2xhcmVzIHRoYXQgdGhlIGNsaWVudCB3aWxsIGF1dG9tYXRpY2FsbHkgcmVkaXJlY3QgdG8gdGhlIFVSSSBkZWNsYXJlZCBpbiAzeHggcmVzcG9uc2VzLiBEZWZhdWx0IHZhbHVlIGlzIDxsaXRlcmFsPnRydWU8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PiZqZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXMuSlNPTl9QUk9DRVNTSU5HX0ZFQVRVUkVfRElTQUJMRTs8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPmplcnNleS5jb25maWcuY2xpZW50LmRpc2FibGVKc29uUHJvY2Vzc2luZzwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNhYmxlcyBjb25maWd1cmF0aW9uIG9mIEpzb24gUHJvY2Vzc2luZyAoSlNSLTM1MykgZmVhdHVyZS4gRGVmYXVsdCB2YWx1ZSBpcyA8bGl0ZXJhbD5mYWxzZTwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+JmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllcy5NRVRBSU5GX1NFUlZJQ0VTX0xPT0tVUF9ESVNBQkxFOzwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+amVyc2V5LmNvbmZpZy5kaXNhYmxlTWV0YWluZlNlcnZpY2VzTG9va3VwLmNsaWVudDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNhYmxlcyBNRVRBLUlORi9zZXJ2aWNlcyBsb29rdXAgb24gY2xpZW50LiBEZWZhdWx0IHZhbHVlIGlzIDxsaXRlcmFsPmZhbHNlPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4mamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzLk1PWFlfSlNPTl9GRUFUVVJFX0RJU0FCTEU7PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5qZXJzZXkuY29uZmlnLmNsaWVudC5kaXNhYmxlTW94eUpzb248L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzYWJsZXMgY29uZmlndXJhdGlvbiBvZiBNT1h5IEpzb24gZmVhdHVyZS4gRGVmYXVsdCB2YWx1ZSBpcyA8bGl0ZXJhbD5mYWxzZTwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+JmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllcy5PVVRCT1VORF9DT05URU5UX0xFTkdUSF9CVUZGRVI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEplcnNleSAyLjIgb3IgbGF0ZXIpPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5qZXJzZXkuY29uZmlnLmNsaWVudC5jb250ZW50TGVuZ3RoLmJ1ZmZlcjwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbiBpbnRlZ2VyIHZhbHVlIHRoYXQgZGVmaW5lcyB0aGUgYnVmZmVyIHNpemUgdXNlZCB0byBidWZmZXIgdGhlIG91dGJvdW5kIG1lc3NhZ2UgZW50aXR5IGluIG9yZGVyIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGVybWluZSBpdHMgc2l6ZSBhbmQgc2V0IHRoZSB2YWx1ZSBvZiBIVFRQIDxsaXRlcmFsPkNvbnRlbnQtTGVuZ3RoPC9saXRlcmFsPiBoZWFkZXIuIERlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgaXMgPGxpdGVyYWw+ODE5MjwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+JmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllcy5QUk9YWV9VUkk7PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5qZXJzZXkuY29uZmlnLmNsaWVudC5wcm94eS51cmk8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJJIG9mIGEgSFRUUCBwcm94eSB0aGUgY2xpZW50IGNvbm5lY3RvciBzaG91bGQgdXNlLiBEZWZhdWx0IHZhbHVlIGlzIG5vdCBzZXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5DdXJyZW50bHkgc3VwcG9ydGVkIHdpdGggJmplcnNleS5hcGFjaGUuQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXI7IGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmplcnNleS5qZXR0eS5KZXR0eUNvbm5lY3RvclByb3ZpZGVyOyBvbmx5LjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+JmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllcy5QUk9YWV9VU0VSTkFNRTsgKEplcnNleSAyLjUgb3IgbGF0ZXIpPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5qZXJzZXkuY29uZmlnLmNsaWVudC5wcm94eS51c2VybmFtZTwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyIG5hbWUgd2hpY2ggd2lsbCBiZSB1c2VkIGZvciBIVFRQIHByb3h5IGF1dGhlbnRpY2F0aW9uLiBEZWZhdWx0IHZhbHVlIGlzIG5vdCBzZXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5DdXJyZW50bHkgc3VwcG9ydGVkIHdpdGggJmplcnNleS5hcGFjaGUuQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXI7IGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmplcnNleS5qZXR0eS5KZXR0eUNvbm5lY3RvclByb3ZpZGVyOyBvbmx5LjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+JmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllcy5QUk9YWV9QQVNTV09SRDsgKEplcnNleSAyLjUgb3IgbGF0ZXIpPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5qZXJzZXkuY29uZmlnLmNsaWVudC5wcm94eS5wYXNzd29yZDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXNzd29yZCB3aGljaCB3aWxsIGJlIHVzZWQgZm9yIEhUVFAgcHJveHkgYXV0aGVudGljYXRpb24uIERlZmF1bHQgdmFsdWUgaXMgbm90IHNldC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzPkN1cnJlbnRseSBzdXBwb3J0ZWQgd2l0aCAmamVyc2V5LmFwYWNoZS5BcGFjaGVDb25uZWN0b3JQcm92aWRlcjsgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmamVyc2V5LmpldHR5LkpldHR5Q29ubmVjdG9yUHJvdmlkZXI7IG9ubHkuPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4mamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzLlJFQURfVElNRU9VVDsgKEplcnNleSAyLjUgb3IgbGF0ZXIpPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5qZXJzZXkuY29uZmlnLmNsaWVudC5yZWFkVGltZW91dDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFkIHRpbWVvdXQgaW50ZXJ2YWwsIGluIG1pbGxpc2Vjb25kcy4gRGVmYXVsdCB2YWx1ZSBpcyA8bGl0ZXJhbD4wPC9saXRlcmFsPiAoaW5maW5pdHkpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PiZqZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXMuUkVRVUVTVF9FTlRJVFlfUFJPQ0VTU0lORzsgKEplcnNleSAyLjUgb3IgbGF0ZXIpPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5qZXJzZXkuY29uZmlnLmNsaWVudC5yZXF1ZXN0LmVudGl0eS5wcm9jZXNzaW5nPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZXMgd2hldGhlciB0aGUgcmVxdWVzdCBlbnRpdHkgc2hvdWxkIGJlIHNlcmlhbGl6ZWQgdXNpbmcgaW50ZXJuYWwgYnVmZmVyIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2YWx1YXRlIGNvbnRlbnQgbGVuZ3RoIG9yIGNodW5rIGVuY29kaW5nIHNob3VsZCBiZSB1c2VkLiBQb3NzaWJsZSB2YWx1ZXMgYXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPkJVRkZFUkVEPC9saXRlcmFsPiBvciA8bGl0ZXJhbD5DSFVOS0VEPC9saXRlcmFsPi4gRGVmYXVsdCB2YWx1ZSBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5CVUZGRVJFRDwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisKKyAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4mamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzLlNVUFBSRVNTX0hUVFBfQ09NUExJQU5DRV9WQUxJREFUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChKZXJzZXkgMi4yIG9yIGxhdGVyKTwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+amVyc2V5LmNvbmZpZy5jbGllbnQuc3VwcHJlc3NIdHRwQ29tcGxpYW5jZVZhbGlkYXRpb248L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgJmxpdC50cnVlOywgdGhlIHN0cmljdCB2YWxpZGF0aW9uIG9mIEhUVFAgc3BlY2lmaWNhdGlvbiBjb21wbGlhbmNlIGZvciBjbGllbnQtc2lkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0cyB3aWxsIGJlIHN1cHByZXNzZWQuIFdoZW4gY29tcGxpYW5jZSBjaGVja3MgYXJlIHN1cHByZXNzZWQsIGFueSB2aW9sYXRpb25zIHdpbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgbWVyZWx5IGxvZ2dlZCBhcyB3YXJuaW5ncywgcmF0aGVyIHRoYW4gY2F1c2luZyBleGNlcHRpb25zIGJlaW5nIHJhaXNlZCBpbiBKZXJzZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZS4gRGVmYXVsdCB2YWx1ZSBpcyAmbGl0LmZhbHNlOy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4mamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzLlVTRV9FTkNPRElORzs8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPmplcnNleS5jb25maWcuY2xpZW50LnVzZUVuY29kaW5nPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZGljYXRlcyB0aGUgdmFsdWUgb2YgPGxpdGVyYWw+Q29udGVudC1FbmNvZGluZzwvbGl0ZXJhbD4gcHJvcGVydHkgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZqZXJzZXkuY2xpZW50LkVuY29kaW5nRmlsdGVyOyBzaG91bGQgYmUgYWRkaW5nLiBEZWZhdWx0IHZhbHVlIGlzIG5vdCBzZXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+JmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlLkxPR0dJTkdfRkVBVFVSRV9MT0dHRVJfTkFNRV9DTElFTlQ7CisgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmplcnNleS5jb25maWcuY2xpZW50LmxvZ2dpbmcubG9nZ2VyLm5hbWU8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dlciBuYW1lIG9mIHRoZSBsb2dnaW5nIGZpbHRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWUgPGxpbmsgbGlua2VuZD0ibG9nZ2luZy54bWwiPmxvZ2dpbmc8L2xpbms+IGNoYXB0ZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgPGxpdGVyYWw+b3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PiZqZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZS5MT0dHSU5HX0ZFQVRVUkVfTE9HR0VSX0xFVkVMX0NMSUVOVDsKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+amVyc2V5LmNvbmZpZy5jbGllbnQubG9nZ2luZy5sb2dnZXIubGV2ZWw8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExldmVsIG9mIGxvZ2dpbmcgZmlsdGVyJ3MgbG9nZ2VyIGF0IHdoaWNoIHRoZSBtZXNzYWdlcyB3aWxsIGJlIGxvZ2dlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWUgPGxpbmsgbGlua2VuZD0ibG9nZ2luZ19jaGFwdGVyIj5sb2dnaW5nPC9saW5rPiBjaGFwdGVyIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+JmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlLkxPR0dJTkdfRkVBVFVSRV9WRVJCT1NJVFlfQ0xJRU5UOworICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5qZXJzZXkuY29uZmlnLmNsaWVudC5sb2dnaW5nLnZlcmJvc2l0eTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyYm9zaXR5IG9mIGxvZ2dpbmcgZmlsdGVyIGRlc2NyaWJlcyBob3cgdmVyYm9zZSB0aGUgbG9nZ2luZyBmaWx0ZXIgd2lsbCBiZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGVyZSBhcmUgMyBwb3NzaWJsZSB2YWx1ZXMgJmxpdC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZS5WZXJib3NpdHkuSEVBREVSU19PTkxZOywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGl0LmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlLlZlcmJvc2l0eS5QQVlMT0FEX1RFWFQ7IG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpdC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZS5WZXJib3NpdHkuUEFZTE9BRF9BTlk7LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZSA8bGluayBsaW5rZW5kPSJsb2dnaW5nX2NoYXB0ZXIiPmxvZ2dpbmc8L2xpbms+IGNoYXB0ZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4mamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmUuTE9HR0lOR19GRUFUVVJFX01BWF9FTlRJVFlfU0laRV9DTElFTlQ7CisgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmplcnNleS5jb25maWcuY2xpZW50LmxvZ2dpbmcuZW50aXR5Lm1heFNpemU8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyBvZiB0aGUgZW50aXR5IHdoaWNoIHdpbGwgYmUgbG9nZ2VkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZSA8bGluayBsaW5rZW5kPSJsb2dnaW5nX2NoYXB0ZXIiPmxvZ2dpbmc8L2xpbms+IGNoYXB0ZXIgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgIDwvdGFibGU+CisgICAgPC9zZWN0aW9uPgorPC9hcHBlbmRpeD4KZGlmZiAtLWdpdCBhL2RvY3Mvc3JjL21haW4vZG9jYm9vay9hc3luYy54bWwgYi9kb2NzL3NyYy9tYWluL2RvY2Jvb2svYXN5bmMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNGYwOTUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3NyYy9tYWluL2RvY2Jvb2svYXN5bmMueG1sCkBAIC0wLDAgKzEsNTAwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8IURPQ1RZUEUgY2hhcHRlciBbPCFFTlRJVFkgJSBlbnRzIFNZU1RFTSAiamVyc2V5LmVudCIgPiAlZW50cztdPgorPGNoYXB0ZXIgeG1sbnM9Imh0dHA6Ly9kb2Nib29rLm9yZy9ucy9kb2Nib29rIgorICAgICAgICAgdmVyc2lvbj0iNS4wIgorICAgICAgICAgeG1sOmxhbmc9ImVuIgorICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIgorICAgICAgICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9kb2Nib29rLm9yZy9ucy9kb2Nib29rIGh0dHA6Ly9kb2Nib29rLm9yZy94bWwvNS4wL3hzZC9kb2Nib29rLnhzZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIGh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsueHNkIgorICAgICAgICAgeG1sOmlkPSJhc3luYyI+CisgICAgPHRpdGxlPkFzeW5jaHJvbm91cyBTZXJ2aWNlcyBhbmQgQ2xpZW50czwvdGl0bGU+CisgICAgPHBhcmE+CisgICAgICAgIFRoaXMgY2hhcHRlciBkZXNjcmliZXMgdGhlIHVzYWdlIG9mIGFzeW5jaHJvbm91cyBBUEkgb24gdGhlIGNsaWVudCBhbmQgc2VydmVyIHNpZGUuIFRoZSB0ZXJtIDxlbXBoYXNpcz5hc3luYzwvZW1waGFzaXM+CisgICAgICAgIHdpbGwgYmUgc29tZXRpbWVzIHVzZWQgaW50ZXJjaGFuZ2VhYmx5IHdpdGggdGhlIHRlcm0gPGVtcGhhc2lzPmFzeW5jaHJvbm91czwvZW1waGFzaXM+IGluIHRoaXMgY2hhcHRlci4KKyAgICA8L3BhcmE+CisgICAgPHNlY3Rpb24+CisgICAgICAgIDx0aXRsZT5Bc3luY2hyb25vdXMgU2VydmVyIEFQSTwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgUmVxdWVzdCBwcm9jZXNzaW5nIG9uIHRoZSBzZXJ2ZXIgd29ya3MgYnkgZGVmYXVsdCBpbiBhIHN5bmNocm9ub3VzIHByb2Nlc3NpbmcgbW9kZSwgd2hpY2ggbWVhbnMgdGhhdCBhIGNsaWVudAorICAgICAgICAgICAgY29ubmVjdGlvbiBvZiBhIHJlcXVlc3QgaXMgcHJvY2Vzc2VkIGluIGEgc2luZ2xlIEkvTyBjb250YWluZXIgdGhyZWFkLiBPbmNlIHRoZSB0aHJlYWQgcHJvY2Vzc2luZyB0aGUgcmVxdWVzdAorICAgICAgICAgICAgcmV0dXJucyB0byB0aGUgSS9PIGNvbnRhaW5lciwgdGhlIGNvbnRhaW5lciBjYW4gc2FmZWx5IGFzc3VtZSB0aGF0IHRoZSByZXF1ZXN0IHByb2Nlc3NpbmcgaXMgZmluaXNoZWQgYW5kIHRoYXQKKyAgICAgICAgICAgIHRoZSBjbGllbnQgY29ubmVjdGlvbiBjYW4gYmUgc2FmZWx5IHJlbGVhc2VkIGluY2x1ZGluZyBhbGwgdGhlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbm5lY3Rpb24uIFRoaXMgbW9kZWwKKyAgICAgICAgICAgIGlzIHR5cGljYWxseSBzdWZmaWNpZW50IGZvciBwcm9jZXNzaW5nIG9mIHJlcXVlc3RzIGZvciB3aGljaCB0aGUgcHJvY2Vzc2luZyByZXNvdXJjZSBtZXRob2QgZXhlY3V0aW9uIHRha2VzCisgICAgICAgICAgICBhIHJlbGF0aXZlbHkgc2hvcnQgdGltZS4gSG93ZXZlciwgaW4gY2FzZXMgd2hlcmUgYSByZXNvdXJjZSBtZXRob2QgZXhlY3V0aW9uIGlzIGtub3duIHRvIHRha2UgYSBsb25nIHRpbWUgdG8gY29tcHV0ZQorICAgICAgICAgICAgdGhlIHJlc3VsdCwgc2VydmVyLXNpZGUgYXN5bmNocm9ub3VzIHByb2Nlc3NpbmcgbW9kZWwgc2hvdWxkIGJlIHVzZWQuIEluIHRoaXMgbW9kZWwsIHRoZSBhc3NvY2lhdGlvbiBiZXR3ZWVuIGEKKyAgICAgICAgICAgIHJlcXVlc3QgcHJvY2Vzc2luZyB0aHJlYWQgYW5kIGNsaWVudCBjb25uZWN0aW9uIGlzIGJyb2tlbi4gSS9PIGNvbnRhaW5lciB0aGF0IGhhbmRsZXMgaW5jb21pbmcgcmVxdWVzdCBtYXkgbm8gbG9uZ2VyCisgICAgICAgICAgICBhc3N1bWUgdGhhdCBhIGNsaWVudCBjb25uZWN0aW9uIGNhbiBiZSBzYWZlbHkgY2xvc2VkIHdoZW4gYSByZXF1ZXN0IHByb2Nlc3NpbmcgdGhyZWFkIHJldHVybnMuIEluc3RlYWQgYSBmYWNpbGl0eSBmb3IKKyAgICAgICAgICAgIGV4cGxpY2l0bHkgc3VzcGVuZGluZywgcmVzdW1pbmcgYW5kIGNsb3NpbmcgY2xpZW50IGNvbm5lY3Rpb25zIG5lZWRzIHRvIGJlIGV4cG9zZWQuCisgICAgICAgICAgICBOb3RlIHRoYXQgdGhlIHVzZSBvZiBzZXJ2ZXItc2lkZSBhc3luY2hyb25vdXMgcHJvY2Vzc2luZyBtb2RlbCB3aWxsIG5vdCBpbXByb3ZlIHRoZSByZXF1ZXN0IHByb2Nlc3NpbmcgdGltZSBwZXJjZWl2ZWQKKyAgICAgICAgICAgIGJ5IHRoZSBjbGllbnQuIEl0IHdpbGwgaG93ZXZlciBpbmNyZWFzZSB0aGUgdGhyb3VnaHB1dCBvZiB0aGUgc2VydmVyLCBieSByZWxlYXNpbmcgdGhlCisgICAgICAgICAgICBpbml0aWFsIHJlcXVlc3QgcHJvY2Vzc2luZyB0aHJlYWQgYmFjayB0byB0aGUgSS9PIGNvbnRhaW5lciB3aGlsZSB0aGUgcmVxdWVzdCBtYXkgc3RpbGwgYmUgd2FpdGluZyBpbiBhIHF1ZXVlIGZvcgorICAgICAgICAgICAgcHJvY2Vzc2luZyBvciB0aGUgcHJvY2Vzc2luZyBtYXkgc3RpbGwgYmUgcnVubmluZyBvbiBhbm90aGVyIGRlZGljYXRlZCB0aHJlYWQuIFRoZSByZWxlYXNlZCBJL08gY29udGFpbmVyIHRocmVhZAorICAgICAgICAgICAgY2FuIGJlIHVzZWQgdG8gYWNjZXB0IGFuZCBwcm9jZXNzIG5ldyBpbmNvbWluZyByZXF1ZXN0IGNvbm5lY3Rpb25zLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGEgc2ltcGxlIGFzeW5jaHJvbm91cyByZXNvdXJjZSBtZXRob2QgZGVmaW5lZCB1c2luZyB0aGUgbmV3IEpBWC1SUyBhc3luYyBBUEk6CisgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICA8dGl0bGU+U2ltcGxlIGFzeW5jIHJlc291cmNlPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5AUGF0aCgiL3Jlc291cmNlIikKK3B1YmxpYyBjbGFzcyBBc3luY1Jlc291cmNlIHsKKyAgICBAR0VUCisgICAgcHVibGljIHZvaWQgYXN5bmNHZXQoQFN1c3BlbmRlZCBmaW5hbCBBc3luY1Jlc3BvbnNlIGFzeW5jUmVzcG9uc2UpIHsKKworICAgICAgICBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSB2ZXJ5RXhwZW5zaXZlT3BlcmF0aW9uKCk7CisgICAgICAgICAgICAgICAgYXN5bmNSZXNwb25zZS5yZXN1bWUocmVzdWx0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdmVyeUV4cGVuc2l2ZU9wZXJhdGlvbigpIHsKKyAgICAgICAgICAgICAgICAvLyAuLi4gdmVyeSBleHBlbnNpdmUgb3BlcmF0aW9uCisgICAgICAgICAgICB9CisgICAgICAgIH0pLnN0YXJ0KCk7CisgICAgfQorfTwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgICAgICBJbiB0aGUgZXhhbXBsZSBhYm92ZSwgYSByZXNvdXJjZSA8bGl0ZXJhbD5Bc3luY1Jlc291cmNlPC9saXRlcmFsPgorICAgICAgICAgICAgd2l0aCBvbmUgPGxpdGVyYWw+R0VUPC9saXRlcmFsPiBtZXRob2QgPGxpdGVyYWw+YXN5bmNHZXQ8L2xpdGVyYWw+IGlzIGRlZmluZWQuIFRoZSA8bGl0ZXJhbD5hc3luY0dldDwvbGl0ZXJhbD4gbWV0aG9kCisgICAgICAgICAgICBpbmplY3RzIGEgSkFYLVJTICZqYXhycy5jb250YWluZXIuQXN5bmNSZXNwb25zZTsgaW5zdGFuY2UgdXNpbmcgYSBKQVgtUlMgJmpheHJzLmNvbnRhaW5lci5TdXNwZW5kZWQ7IGFubm90YXRpb24uCisgICAgICAgICAgICBQbGVhc2Ugbm90ZSB0aGF0ICZsaXQuamF4cnMuY29udGFpbmVyLkFzeW5jUmVzcG9uc2U7IG11c3QgYmUgaW5qZWN0ZWQgYnkgdGhlICZsaXQuamF4cnMuY29udGFpbmVyLlN1c3BlbmRlZDsKKyAgICAgICAgICAgIGFubm90YXRpb24gYW5kIG5vdCBieSAmamF4cnMuY29yZS5Db250ZXh0OyBhcyAmbGl0LmpheHJzLmNvbnRhaW5lci5TdXNwZW5kZWQ7IGRvZXMgbm90IG9ubHkgaW5qZWN0IHJlc3BvbnNlIGJ1dCBhbHNvCisgICAgICAgICAgICBzYXlzIHRoYXQgdGhlIG1ldGhvZCBpcyBleGVjdXRlZCBpbiB0aGUgYXN5bmNocm9ub3VzIG1vZGUuIEJ5IHRoZSAmbGl0LmpheHJzLmNvbnRhaW5lci5Bc3luY1Jlc3BvbnNlOyBwYXJhbWV0ZXIgaW50bworICAgICAgICAgICAgYSByZXNvdXJjZSBtZXRob2Qgd2UgdGVsbCB0aGUgSmVyc2V5IHJ1bnRpbWUgdGhhdCB0aGUgbWV0aG9kIGlzIHN1cHBvc2VkIHRvIGJlIGludm9rZWQgdXNpbmcgdGhlIGFzeW5jaHJvbm91cworICAgICAgICAgICAgcHJvY2Vzc2luZyBtb2RlLCB0aGF0IGlzIHRoZSBjbGllbnQgY29ubmVjdGlvbiBzaG91bGQgbm90IGJlIGF1dG9tYXRpY2FsbHkgY2xvc2VkIGJ5IHRoZSB1bmRlcmx5aW5nIEkvTyBjb250YWluZXIKKyAgICAgICAgICAgIHdoZW4gdGhlIG1ldGhvZCByZXR1cm5zLiBJbnN0ZWFkLCB0aGUgaW5qZWN0ZWQgJmxpdC5qYXhycy5jb250YWluZXIuQXN5bmNSZXNwb25zZTsgaW5zdGFuY2UgKHRoYXQgcmVwcmVzZW50cyB0aGUKKyAgICAgICAgICAgIHN1c3BlbmRlZCBjbGllbnQgcmVxdWVzdCBjb25uZWN0aW9uKSB3aWxsIGJlIHVzZWQgdG8gZXhwbGljaXRseSBzZW5kIHRoZSByZXNwb25zZSBiYWNrIHRvIHRoZSBjbGllbnQgdXNpbmcgc29tZSBvdGhlcgorICAgICAgICAgICAgdGhyZWFkLiBJbiBvdGhlciB3b3JkcywgSmVyc2V5IHJ1bnRpbWUga25vd3MgdGhhdCB3aGVuIHRoZSA8bGl0ZXJhbD5hc3luY0dldDwvbGl0ZXJhbD4gbWV0aG9kIGNvbXBsZXRlcywgdGhlIHJlc3BvbnNlCisgICAgICAgICAgICB0byB0aGUgY2xpZW50IG1heSBub3QgYmUgcmVhZHkgeWV0IGFuZCB0aGUgcHJvY2Vzc2luZyBtdXN0IGJlIHN1c3BlbmRlZCBhbmQgd2FpdCB0byBiZSBleHBsaWN0bHkgcmVzdW1lZCB3aXRoIGEKKyAgICAgICAgICAgIHJlc3BvbnNlIG9uY2UgaXQgYmVjb21lcyBhdmFpbGFibGUuIE5vdGUgdGhhdCB0aGUgbWV0aG9kIDxsaXRlcmFsPmFzeW5jR2V0PC9saXRlcmFsPiByZXR1cm5zIDxsaXRlcmFsPnZvaWQ8L2xpdGVyYWw+CisgICAgICAgICAgICBpbiBvdXIgZXhhbXBsZS4gVGhpcyBpcyBwZXJmZWN0bHkgdmFsaWQgaW4gY2FzZSBvZiBhbiBhc3luY2hyb25vdXMgSkFYLVJTIHJlc291cmNlIG1ldGhvZCwgZXZlbiBmb3IgYSAmamF4cnMuR0VUOworICAgICAgICAgICAgbWV0aG9kLCBhcyB0aGUgcmVzcG9uc2UgaXMgbmV2ZXIgcmV0dXJuZWQgZGlyZWN0bHkgZnJvbSB0aGUgcmVzb3VyY2UgbWV0aG9kIGFzIGl0cyByZXR1cm4gdmFsdWUuIEluc3RlYWQsIHRoZSByZXNwb25zZQorICAgICAgICAgICAgaXMgbGF0ZXIgcmV0dXJuZWQgdXNpbmcgJmxpdC5qYXhycy5jb250YWluZXIuQXN5bmNSZXNwb25zZTsgaW5zdGFuY2UgYXMgaXQgaXMgZGVtb25zdHJhdGVkIGluIHRoZSBleGFtcGxlLiBUaGUKKyAgICAgICAgICAgIDxsaXRlcmFsPmFzeW5jR2V0PC9saXRlcmFsPiByZXNvdXJjZSBtZXRob2Qgc3RhcnRzIGEgbmV3IHRocmVhZCBhbmQgZXhpdHMgZnJvbSB0aGUgbWV0aG9kLiBJbiB0aGF0IHN0YXRlIHRoZQorICAgICAgICAgICAgcmVxdWVzdCBwcm9jZXNzaW5nIGlzIHN1c3BlbmRlZCBhbmQgdGhlIGNvbnRhaW5lciB0aHJlYWQgKHRoZSBvbmUgd2hpY2ggZW50ZXJlZCB0aGUgcmVzb3VyY2UgbWV0aG9kKSBpcyByZXR1cm5lZCBiYWNrCisgICAgICAgICAgICB0byB0aGUgY29udGFpbmVyJ3MgdGhyZWFkIHBvb2wgYW5kIGl0IGNhbiBwcm9jZXNzIG90aGVyIHJlcXVlc3RzLiBOZXcgdGhyZWFkIHN0YXJ0ZWQgaW4gdGhlIHJlc291cmNlIG1ldGhvZCBtYXkKKyAgICAgICAgICAgIGV4ZWN1dGUgYW4gZXhwZW5zaXZlIG9wZXJhdGlvbiB3aGljaCBtaWdodCB0YWtlIGEgbG9uZyB0aW1lIHRvIGZpbmlzaC4gT25jZSBhIHJlc3VsdCBpcyByZWFkeSBpdCBpcyByZXN1bWVkIHVzaW5nCisgICAgICAgICAgICB0aGUgPGxpdGVyYWw+cmVzdW1lKCk8L2xpdGVyYWw+IG1ldGhvZCBvbiB0aGUgJmxpdC5qYXhycy5jb250YWluZXIuQXN5bmNSZXNwb25zZTsgaW5zdGFuY2UuCisgICAgICAgICAgICBUaGUgcmVzdW1lZCByZXNwb25zZSBpcyB0aGVuIHByb2Nlc3NlZCBpbiB0aGUgbmV3IHRocmVhZCBieSBKZXJzZXkgaW4gYSBzYW1lIHdheSBhcyBhbnkgb3RoZXIgc3luY2hyb25vdXMgcmVzcG9uc2UsCisgICAgICAgICAgICBpbmNsdWRpbmcgZXhlY3V0aW9uIG9mIGZpbHRlcnMgYW5kIGludGVyY2VwdG9ycywgdXNlIG9mIGV4Y2VwdGlvbiBtYXBwZXJzIGFzIG5lY2Vzc2FyeSBhbmQgc2VuZGluZyB0aGUgcmVzcG9uc2UKKyAgICAgICAgICAgIGJhY2sgdG8gdGhlIGNsaWVudC4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgdGhlIGFzeW5jaHJvbm91cyByZXNwb25zZSAoPGxpdGVyYWw+YXN5bmNSZXNwb25zZTwvbGl0ZXJhbD4gaW4gdGhlIGV4YW1wbGUpCisgICAgICAgICAgICBkb2VzIG5vdCBuZWVkIHRvIGJlIHJlc3VtZWQgZnJvbSB0aGUgdGhyZWFkIHN0YXJ0ZWQgZnJvbSB0aGUgcmVzb3VyY2UgbWV0aG9kLiBUaGUgYXN5bmNocm9ub3VzCisgICAgICAgICAgICByZXNwb25zZSBjYW4gYmUgcmVzdW1lZCBldmVuIGZyb20gZGlmZmVyZW50IHJlcXVlc3QgcHJvY2Vzc2luZyB0aHJlYWQgYXMgaXQgaXMgc2hvd24gaW4gdGhlCisgICAgICAgICAgICB0aGUgZXhhbXBsZSBvZiB0aGUgJmpheHJzLmNvbnRhaW5lci5Bc3luY1Jlc3BvbnNlOyBqYXZhZG9jLiBJbiB0aGUgamF2YWRvYyBleGFtcGxlIHRoZQorICAgICAgICAgICAgYXN5bmMgcmVzcG9uc2Ugc3VzcGVuZGVkIGZyb20gdGhlICZsaXQuaHR0cC5HRVQ7IG1ldGhvZCBpcyByZXN1bWVkIGxhdGVyIG9uIGZyb20KKyAgICAgICAgICAgIHRoZSAmbGl0Lmh0dHAuUE9TVDsgbWV0aG9kLiBUaGUgc3VzcGVuZGVkIGFzeW5jIHJlc3BvbnNlIGlzIHBhc3NlZCBiZXR3ZWVuIHJlcXVlc3RzIHVzaW5nCisgICAgICAgICAgICBhIHN0YXRpYyBmaWVsZCBhbmQgaXMgcmVzdW1lZCBmcm9tIHRoZSBvdGhlciByZXNvdXJjZSBtZXRob2QgcnVubmluZyBvbiBhIGRpZmZlcmVudCByZXF1ZXN0IHByb2Nlc3NpbmcgdGhyZWFkLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgSW1hZ2luZSBub3cgYSBzaXR1YXRpb24gd2hlbiB0aGVyZSBpcyBhIGxvbmcgZGVsYXkgYmV0d2VlbiB0d28gcmVxdWVzdHMgYW5kIHlvdSB3b3VsZCBub3QgbGlrZSB0byBsZXQKKyAgICAgICAgICAgIHRoZSBjbGllbnQgd2FpdCBmb3IgdGhlIHJlc3BvbnNlICJmb3JldmVyIiBvciBhdCBsZWFzdCBmb3IgYW4gdW5hY2NlcHRhYmxlIGxvbmcgdGltZS4gSW4gYXN5bmNocm9ub3VzIHByb2Nlc3NpbmcKKyAgICAgICAgICAgIG1vZGVsLCBvY2N1cnJlbmNlcyBvZiBzdWNoIHNpdHVhdGlvbnMgc2hvdWxkIGJlIGNhcmVmdWxseSBjb25zaWRlcmVkIHdpdGggY2xpZW50IGNvbm5lY3Rpb25zIG5vdCBiZWluZyBhdXRvbWF0aWNhbGx5CisgICAgICAgICAgICBjbG9zZWQgd2hlbiB0aGUgcHJvY2Vzc2luZyBtZXRob2QgcmV0dXJucyBhbmQgdGhlIHJlc3BvbnNlIG5lZWRzIHRvIGJlIHJlc3VtZWQgZXhwbGljaXRseSBiYXNlZCBvbiBhbiBldmVudCB0aGF0CisgICAgICAgICAgICBtYXkgYWN0dWFsbHkgZXZlbiBuZXZlciBoYXBwZW4uIFRvIHRhY2tsZSB0aGVzZSBzaXR1YXRpb25zIGFzeW5jaHJvbm91cyA8ZW1waGFzaXM+dGltZW91dHM8L2VtcGhhc2lzPiBjYW4gYmUgdXNlZC4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyB0aGUgdXNhZ2Ugb2YgdGltZW91dHM6CisgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICA8dGl0bGU+U2ltcGxlIGFzeW5jIG1ldGhvZCB3aXRoIHRpbWVvdXQ8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPkBHRVQKK3B1YmxpYyB2b2lkIGFzeW5jR2V0V2l0aFRpbWVvdXQoQFN1c3BlbmRlZCBmaW5hbCBBc3luY1Jlc3BvbnNlIGFzeW5jUmVzcG9uc2UpIHsKKyAgICBhc3luY1Jlc3BvbnNlLnNldFRpbWVvdXRIYW5kbGVyKG5ldyBUaW1lb3V0SGFuZGxlcigpIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlVGltZW91dChBc3luY1Jlc3BvbnNlIGFzeW5jUmVzcG9uc2UpIHsKKyAgICAgICAgICAgIGFzeW5jUmVzcG9uc2UucmVzdW1lKFJlc3BvbnNlLnN0YXR1cyhSZXNwb25zZS5TdGF0dXMuU0VSVklDRV9VTkFWQUlMQUJMRSkKKyAgICAgICAgICAgICAgICAgICAgLmVudGl0eSgiT3BlcmF0aW9uIHRpbWUgb3V0LiIpLmJ1aWxkKCkpOworICAgICAgICB9CisgICAgfSk7CisgICAgYXN5bmNSZXNwb25zZS5zZXRUaW1lb3V0KDIwLCBUaW1lVW5pdC5TRUNPTkRTKTsKKworICAgIG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gdmVyeUV4cGVuc2l2ZU9wZXJhdGlvbigpOworICAgICAgICAgICAgYXN5bmNSZXNwb25zZS5yZXN1bWUocmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHZlcnlFeHBlbnNpdmVPcGVyYXRpb24oKSB7CisgICAgICAgICAgICAvLyAuLi4gdmVyeSBleHBlbnNpdmUgb3BlcmF0aW9uIHRoYXQgdHlwaWNhbGx5IGZpbmlzaGVzIHdpdGhpbiAyMCBzZWNvbmRzCisgICAgICAgIH0KKyAgICB9KS5zdGFydCgpOworfTwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgICAgICBCeSBkZWZhdWx0LCB0aGVyZSBpcyBubyB0aW1lb3V0IGRlZmluZWQgb24gdGhlIHN1c3BlbmRlZCAmbGl0LmpheHJzLmNvbnRhaW5lci5Bc3luY1Jlc3BvbnNlOyBpbnN0YW5jZS4KKyAgICAgICAgICAgIEEgY3VzdG9tIHRpbWVvdXQgYW5kIHRpbWVvdXQgZXZlbnQgaGFuZGxlciBtYXkgYmUgZGVmaW5lZCB1c2luZyA8bGl0ZXJhbD5zZXRUaW1lb3V0SGFuZGxlcihUaW1lb3V0SGFuZGxlcik8L2xpdGVyYWw+CisgICAgICAgICAgICBhbmQgPGxpdGVyYWw+c2V0VGltZW91dChsb25nLCBUaW1lVW5pdCk8L2xpdGVyYWw+IG1ldGhvZHMuIFRoZSA8bGl0ZXJhbD5zZXRUaW1lb3V0SGFuZGxlcihUaW1lb3V0SGFuZGxlcik8L2xpdGVyYWw+CisgICAgICAgICAgICBtZXRob2QgZGVmaW5lcyB0aGUgaGFuZGxlciB0aGF0IHdpbGwgYmUgaW52b2tlZCB3aGVuIHRpbWVvdXQgaXMgcmVhY2hlZC4gVGhlIGhhbmRsZXIgcmVzdW1lcyB0aGUgcmVzcG9uc2Ugd2l0aCB0aGUKKyAgICAgICAgICAgIHJlc3BvbnNlIGNvZGUgNTAzIChmcm9tIFJlc3BvbnNlLlN0YXR1cy48bGl0ZXJhbD5TRVJWSUNFX1VOQVZBSUxBQkxFPC9saXRlcmFsPikuCisgICAgICAgICAgICBBIHRpbWVvdXQgaW50ZXJ2YWwgY2FuIGJlIGFsc28gZGVmaW5lZCB3aXRob3V0IHNwZWNpZnlpbmcgYSBjdXN0b20gdGltZW91dCBoYW5kbGVyICh1c2luZyBqdXN0IHRoZQorICAgICAgICAgICAgPGxpdGVyYWw+c2V0VGltZW91dChsb25nLCBUaW1lVW5pdCk8L2xpdGVyYWw+IG1ldGhvZCkuCisgICAgICAgICAgICBJbiBzdWNoIGNhc2UgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIG9mIEplcnNleSBydW50aW1lIGlzIHRvIHRocm93IGEgPGxpdGVyYWw+U2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uPC9saXRlcmFsPgorICAgICAgICAgICAgdGhhdCBnZXRzIG1hcHBlZCBpbnRvIDUwMywgIlNlcnZpY2UgVW5hdmFpbGFibGUiIEhUVFAgZXJyb3IgcmVzcG9uc2UsIGFzIGRlZmluZWQgYnkgdGhlIEpBWC1SUyBzcGVjaWZpY2F0aW9uLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICA8dGl0bGU+QXN5bmNocm9ub3VzIFNlcnZlci1zaWRlIENhbGxiYWNrczwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBBcyBvcGVyYXRpb25zIGluIGFzeW5jaHJvbm91cyBjYXNlcyBtaWdodCB0YWtlIGxvbmcgdGltZSBhbmQgdGhleSBhcmUgbm90IGFsd2F5cyBmaW5pc2hlZCB3aXRoaW4KKyAgICAgICAgICAgICAgICBhIHNpbmdsZSByZXNvdXJjZSBtZXRob2QgaW52b2NhdGlvbiwgSkFYLVJTIG9mZmVycyBmYWNpbGl0eSB0byByZWdpc3RlciBjYWxsYmFja3MgdG8gYmUgaW52b2tlZAorICAgICAgICAgICAgICAgIGJhc2VkIG9uIHN1c3BlbmRlZCBhc3luYyByZXNwb25zZSBzdGF0ZSBjaGFuZ2VzLiBJbiBKZXJzZXkgeW91IGNhbiByZWdpc3RlciB0d28gSkFYLVJTIGNhbGxiYWNrczoKKyAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHNpbXBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAmamF4cnMuY29udGFpbmVyLkNvbXBsZXRpb25DYWxsYmFjazsgdGhhdCBpcyBleGVjdXRlZCB3aGVuIHJlcXVlc3QgZmluaXNoZXMgb3IgZmFpbHMsIGFuZAorICAgICAgICAgICAgICAgICAgICA8L3NpbXBhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxzaW1wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgJmpheHJzLmNvbnRhaW5lci5Db25uZWN0aW9uQ2FsbGJhY2s7IGV4ZWN1dGVkIHdoZW4gYSBjb25uZWN0aW9uIHRvIGEgY2xpZW50IGlzIGNsb3NlZCBvciBsb3N0LgorICAgICAgICAgICAgICAgICAgICA8L3NpbXBhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgPHRpdGxlPkNvbXBsZXRpb25DYWxsYmFjayBleGFtcGxlPC90aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+QFBhdGgoIi9yZXNvdXJjZSIpCitwdWJsaWMgY2xhc3MgQXN5bmNSZXNvdXJjZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IG51bWJlck9mU3VjY2Vzc1Jlc3BvbnNlcyA9IDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IG51bWJlck9mRmFpbHVyZXMgPSAwOworICAgIHByaXZhdGUgc3RhdGljIFRocm93YWJsZSBsYXN0RXhjZXB0aW9uID0gbnVsbDsKKworICAgIEBHRVQKKyAgICBwdWJsaWMgdm9pZCBhc3luY0dldFdpdGhUaW1lb3V0KEBTdXNwZW5kZWQgZmluYWwgQXN5bmNSZXNwb25zZSBhc3luY1Jlc3BvbnNlKSB7CisgICAgICAgIGFzeW5jUmVzcG9uc2UucmVnaXN0ZXIobmV3IENvbXBsZXRpb25DYWxsYmFjaygpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZShUaHJvd2FibGUgdGhyb3dhYmxlKSB7CisgICAgICAgICAgICAgICAgaWYgKHRocm93YWJsZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5vIHRocm93YWJsZSAtIHRoZSBwcm9jZXNzaW5nIGVuZGVkIHN1Y2Nlc3NmdWxseQorICAgICAgICAgICAgICAgICAgICAvLyAocmVzcG9uc2UgYWxyZWFkeSB3cml0dGVuIHRvIHRoZSBjbGllbnQpCisgICAgICAgICAgICAgICAgICAgIG51bWJlck9mU3VjY2Vzc1Jlc3BvbnNlcysrOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG51bWJlck9mRmFpbHVyZXMrKzsKKyAgICAgICAgICAgICAgICAgICAgbGFzdEV4Y2VwdGlvbiA9IHRocm93YWJsZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHZlcnlFeHBlbnNpdmVPcGVyYXRpb24oKTsKKyAgICAgICAgICAgICAgICBhc3luY1Jlc3BvbnNlLnJlc3VtZShyZXN1bHQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIFN0cmluZyB2ZXJ5RXhwZW5zaXZlT3BlcmF0aW9uKCkgeworICAgICAgICAgICAgICAgIC8vIC4uLiB2ZXJ5IGV4cGVuc2l2ZSBvcGVyYXRpb24KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSkuc3RhcnQoKTsKKyAgICB9Cit9PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgICAgICAgICAgQSBjb21wbGV0aW9uIGNhbGxiYWNrIGlzIHJlZ2lzdGVyZWQgdXNpbmcgPGxpdGVyYWw+cmVnaXN0ZXIoLi4uKTwvbGl0ZXJhbD4gbWV0aG9kCisgICAgICAgICAgICAgICAgb24gdGhlICZsaXQuamF4cnMuY29udGFpbmVyLkFzeW5jUmVzcG9uc2U7IGluc3RhbmNlLiBBIHJlZ2lzdGVyZWQgY29tcGxldGlvbiBjYWxsYmFjayBpcyBib3VuZCBvbmx5CisgICAgICAgICAgICAgICAgdG8gdGhlIHJlc3BvbnNlKHMpIHRvIHdoaWNoIGl0IGhhcyBiZWVuIHJlZ2lzdGVyZWQuIEluIHRoZSBleGFtcGxlIHRoZSAmbGl0LmpheHJzLmNvbnRhaW5lci5Db21wbGV0aW9uQ2FsbGJhY2s7CisgICAgICAgICAgICAgICAgaXMgdXNlZCB0byBjYWxjdWxhdGUgc3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZCByZXNwb25zZXMsIGZhaWx1cmVzIGFuZCB0byBzdG9yZSBsYXN0IGV4Y2VwdGlvbi4gVGhpcyBpcyBvbmx5IGEKKyAgICAgICAgICAgICAgICBzaW1wbGUgY2FzZSBkZW1vbnN0cmF0aW5nIHRoZSB1c2FnZSBvZiB0aGUgY2FsbGJhY2suIFlvdSBjYW4gdXNlIGNvbXBsZXRpb24gY2FsbGJhY2sgdG8gcmVsZWFzZSB0aGUgcmVzb3VyY2VzLAorICAgICAgICAgICAgICAgIGNoYW5nZSBzdGF0ZSBvZiBpbnRlcm5hbCByZXNvdXJjZXMgb3IgcmVwcmVzZW50YXRpb25zIG9yIGhhbmRsZSBmYWlsdXJlcy4gVGhlIG1ldGhvZCBoYXMgYW4gYXJndW1lbnQKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbD5UaHJvd2FibGU8L2xpdGVyYWw+IHdoaWNoIGlzIHNldCBvbmx5IGluIGNhc2Ugb2YgYW4gZXJyb3IuIE90aGVyd2lzZSB0aGUgcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgd2lsbCBiZSA8bGl0ZXJhbD5udWxsPC9saXRlcmFsPiwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgcmVzcG9uc2Ugd2FzIHN1Y2Nlc3NmdWxseSB3cml0dGVuLiBUaGUgY2FsbGJhY2sgaXMgZXhlY3V0ZWQKKyAgICAgICAgICAgICAgICBvbmx5IGFmdGVyIHRoZSByZXNwb25zZSBpcyB3cml0dGVuIHRvIHRoZSBjbGllbnQgKG5vdCBpbW1lZGlhdGVseSBhZnRlciB0aGUgcmVzcG9uc2UgaXMgcmVzdW1lZCkuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgJmxpdC5qYXhycy5jb250YWluZXIuQXN5bmNSZXNwb25zZTsgPGxpdGVyYWw+cmVnaXN0ZXIoLi4uKTwvbGl0ZXJhbD4gbWV0aG9kIGlzIG92ZXJsb2FkZWQgYW5kIG9mZmVycyBvcHRpb25zCisgICAgICAgICAgICAgICAgdG8gcmVnaXN0ZXIgYSBzaW5nbGUgY2FsbGJhY2sgYXMgYW4gPGxpdGVyYWw+T2JqZWN0PC9saXRlcmFsPiAoaW4gdGhlIGV4YW1wbGUpLCBhcyBhIDxsaXRlcmFsPkNsYXNzPC9saXRlcmFsPiBvcgorICAgICAgICAgICAgICAgIG11bHRpcGxlIGNhbGxiYWNrcyB1c2luZyB2YXJhZ3MuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBBcyBzb21lIGFzeW5jIHJlcXVlc3RzIG1heSB0YWtlIGxvbmcgdGltZSB0byBwcm9jZXNzIHRoZSBjbGllbnQgbWF5IGRlY2lkZSB0byB0ZXJtaW5hdGUgaXQncyBjb25uZWN0aW9uIHRvIHRoZQorICAgICAgICAgICAgICAgIHNlcnZlciBiZWZvcmUgdGhlIHJlc3BvbnNlIGhhcyBiZWVuIHJlc3VtZWQgb3IgYmVmb3JlIGl0IGhhcyBiZWVuIGZ1bGx5IHdyaXR0ZW4gdG8gdGhlIGNsaWVudC4gVG8gZGVhbCB3aXRoIHRoZXNlCisgICAgICAgICAgICAgICAgdXNlIGNhc2VzIGEgJmxpdC5qYXhycy5jb250YWluZXIuQ29ubmVjdGlvbkNhbGxiYWNrOyBjYW4gYmUgdXNlZC4gVGhpcyBjYWxsYmFjayB3aWxsIGJlIGV4ZWN1dGVkIG9ubHkgaWYgdGhlCisgICAgICAgICAgICAgICAgY29ubmVjdGlvbiB3YXMgcHJlbWF0dXJlbHkgdGVybWluYXRlZCBvciBsb3N0IHdoaWxlIHRoZSByZXNwb25zZSBpcyBiZWluZyB3cml0dGVuIHRvIHRoZSBiYWNrIGNsaWVudC4gTm90ZSB0aGF0CisgICAgICAgICAgICAgICAgdGhpcyBjYWxsYmFjayB3aWxsIG5vdCBiZSBpbnZva2VkIHdoZW4gYSByZXNwb25zZSBpcyB3cml0dGVuIHN1Y2Nlc3NmdWxseSBhbmQgdGhlIGNsaWVudCBjb25uZWN0aW9uIGlzIGNsb3NlZAorICAgICAgICAgICAgICAgIGFzIGV4cGVjdGVkLiBTZWUgamF2YWRvYyBvZiAmamF4cnMuY29udGFpbmVyLkNvbm5lY3Rpb25DYWxsYmFjazsgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICA8c2VjdGlvbiB4bWw6aWQ9ImNodW5rZWQtb3V0cHV0Ij4KKyAgICAgICAgICAgIDx0aXRsZT5DaHVua2VkIE91dHB1dDwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT5KZXJzZXkgb2ZmZXJzIGEgZmFjaWxpdHkgZm9yIHNlbmRpbmcgcmVzcG9uc2UgdG8gdGhlIGNsaWVudCBpbiBtdWx0aXBsZSBtb3JlLW9yLWxlc3MgaW5kZXBlbmRlbnQgY2h1bmtzIHVzaW5nIGEKKyAgICAgICAgICAgICAgICA8ZW1waGFzaXM+Y2h1bmtlZCBvdXRwdXQ8L2VtcGhhc2lzPi4gRWFjaCByZXNwb25zZSBjaHVuayB1c3VhbGx5IHRha2VzIHNvbWUgKGxvbmdlcikgdGltZSB0byBwcmVwYXJlIGJlZm9yZQorICAgICAgICAgICAgICAgIHNlbmRpbmcgaXQgdG8gdGhlIGNsaWVudC4gVGhlIG1vc3QgaW1wb3J0YW50IGZhY3QgYWJvdXQgcmVzcG9uc2UgY2h1bmtzIGlzIHRoYXQgeW91IHdhbnQKKyAgICAgICAgICAgICAgICB0byBzZW5kIHRoZW0gdG8gdGhlIGNsaWVudCBpbW1lZGlhdGVseSBhcyB0aGV5IGJlY29tZSBhdmFpbGFibGUgd2l0aG91dCB3YWl0aW5nIGZvciB0aGUgcmVtYWluaW5nIGNodW5rcyB0byBiZWNvbWUKKyAgICAgICAgICAgICAgICBhdmFpbGFibGUgdG9vLiBUaGUgZmlyc3QgYnl0ZXMgb2YgZWFjaCBjaHVua2VkIHJlc3BvbnNlIGNvbnNpc3RzIG9mIHRoZSBIVFRQIGhlYWRlcnMgdGhhdCBhcmUgc2VudCB0byB0aGUgY2xpZW50LgorICAgICAgICAgICAgICAgIEFzIG5vdGVkIGFib3ZlLCB0aGUgZW50aXR5IG9mIHRoZSByZXNwb25zZSBpcyB0aGVuIHNlbnQgaW4gY2h1bmtzIGFzIHRoZXkgYmVjb21lIGF2YWlsYWJsZS4KKyAgICAgICAgICAgICAgICBDbGllbnQga25vd3MgdGhhdCB0aGUgcmVzcG9uc2UgaXMgZ29pbmcgdG8gYmUgY2h1bmtlZCwgc28gaXQgcmVhZHMgZWFjaCBjaHVuayBvZiB0aGUgcmVzcG9uc2Ugc2VwYXJhdGVseSwKKyAgICAgICAgICAgICAgICBwcm9jZXNzZXMgaXQsIGFuZCB3YWl0cyBmb3IgbW9yZSBjaHVua3MgdG8gYXJyaXZlIG9uIHRoZSBzYW1lIGNvbm5lY3Rpb24uIEFmdGVyIHNvbWUgdGltZSwgdGhlIHNlcnZlciBnZW5lcmF0ZXMKKyAgICAgICAgICAgICAgICBhbm90aGVyIHJlc3BvbnNlIGNodW5rIGFuZCBzZW5kIGl0IGFnYWluIHRvIHRoZSBjbGllbnQuIFNlcnZlciBrZWVwcyBvbiBzZW5kaW5nIHJlc3BvbnNlIGNodW5rcyB1bnRpbAorICAgICAgICAgICAgICAgIGl0IGNsb3NlcyB0aGUgY29ubmVjdGlvbiBhZnRlciBzZW5kaW5nIHRoZSBsYXN0IGNodW5rIHdoZW4gdGhlIHJlc3BvbnNlIHByb2Nlc3NpbmcgaXMgZmluaXNoZWQuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBJbiBKZXJzZXkgeW91IGNhbiB1c2UgJmplcnNleS5zZXJ2ZXIuQ2h1bmtlZE91dHB1dDsgdG8gc2VuZCByZXNwb25zZSB0byBhIGNsaWVudCBpbiBjaHVua3MuIENodW5rcyBhcmUgc3RyaWN0bHkKKyAgICAgICAgICAgICAgICBkZWZpbmVkIHBpZWNlcyBvZiBhIHJlc3BvbnNlIGJvZHkgY2FuIGJlIG1hcnNoYWxsZWQgYXMgYSBzZXBhcmF0ZSBlbnRpdGllcyB1c2luZyBKZXJzZXkvSkFYLVJTCisgICAgICAgICAgICAgICAgJmpheHJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsgcHJvdmlkZXJzLiBBIGNodW5rIGNhbiBiZSBTdHJpbmcsIExvbmcgb3IgSkFYQiBiZWFuIHNlcmlhbGl6ZWQgdG8gWE1MIG9yIEpTT04gb3IKKyAgICAgICAgICAgICAgICBhbnkgb3RoZXIgZGFjdXN0b20gdHlwZSBmb3Igd2hpY2ggYSAmbGl0LmpheHJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsgaXMgYXZhaWxhYmxlLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhlIHJlc291cmNlIG1ldGhvZAorICAgICAgICAgICAgICAgIHRoYXQgcmV0dXJucyAmbGl0LmplcnNleS5zZXJ2ZXIuQ2h1bmtlZE91dHB1dDsgaW5mb3JtcyB0aGUgSmVyc2V5IHJ1bnRpbWUgdGhhdCB0aGUgcmVzcG9uc2Ugd2lsbCBiZSBjaHVua2VkCisgICAgICAgICAgICAgICAgYW5kIHRoYXQgdGhlIHByb2Nlc3Npbmcgd29ya3MgYXN5bmNocm9ub3VzbHkgYXMgc3VjaC4gWW91IGRvIG5vdCBuZWVkIHRvIGluamVjdAorICAgICAgICAgICAgICAgICZsaXQuamF4cnMuY29udGFpbmVyLkFzeW5jUmVzcG9uc2U7IHRvIHN0YXJ0IHRoZSBhc3luY2hyb25vdXMgcHJvY2Vzc2luZyBtb2RlIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICAgICAgICBSZXR1cm5pbmcgYSAmbGl0LmplcnNleS5zZXJ2ZXIuQ2h1bmtlZE91dHB1dDsgaW5zdGFuY2UgZnJvbSB0aGUgbWV0aG9kIGlzIGVub3VnaCB0byBpbmRpY2F0ZSB0aGUgYXN5bmNocm9ub3VzCisgICAgICAgICAgICAgICAgcHJvY2Vzc2luZy4gUmVzcG9uc2UgaGVhZGVycyB3aWxsIGJlIHNlbnQgdG8gYSBjbGllbnQgd2hlbiB0aGUgcmVzb3VyY2UgbWV0aG9kIHJldHVybnMgYW5kIHRoZSBjbGllbnQgd2lsbCB3YWl0CisgICAgICAgICAgICAgICAgZm9yIHRoZSBzdHJlYW0gb2YgY2h1bmtlZCBkYXRhIHdoaWNoIHlvdSB3aWxsIGJlIGFibGUgdG8gd3JpdGUgZnJvbSBkaWZmZXJlbnQgdGhyZWFkIHVzaW5nIHRoZSBzYW1lCisgICAgICAgICAgICAgICAgJmxpdC5qZXJzZXkuc2VydmVyLkNodW5rZWRPdXRwdXQ7IGluc3RhbmNlIHJldHVybmVkIGZyb20gdGhlIHJlc291cmNlIG1ldGhvZCBlYXJsaWVyLiBUaGUgZm9sbG93aW5nIGV4YW1wbGUKKyAgICAgICAgICAgICAgICBkZW1vbnN0cmF0ZXMgdGhpcyB1c2UgY2FzZToKKyAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgPHRpdGxlPkNodW5rZWRPdXRwdXQgZXhhbXBsZTwvdGl0bGU+CisgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPjwhW0NEQVRBW0BQYXRoKCIvcmVzb3VyY2UiKQorcHVibGljIGNsYXNzIEFzeW5jUmVzb3VyY2UgeworICAgIEBHRVQKKyAgICBwdWJsaWMgQ2h1bmtlZE91dHB1dDxTdHJpbmc+IGdldENodW5rZWRSZXNwb25zZSgpIHsKKyAgICAgICAgZmluYWwgQ2h1bmtlZE91dHB1dDxTdHJpbmc+IG91dHB1dCA9IG5ldyBDaHVua2VkT3V0cHV0PFN0cmluZz4oU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjaHVuazsKKworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKGNodW5rID0gZ2V0TmV4dFN0cmluZygpKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQud3JpdGUoY2h1bmspOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBJT0V4Y2VwdGlvbiB0aHJvd24gd2hlbiB3cml0aW5nIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyBjaHVua3Mgb2YgcmVzcG9uc2U6IHNob3VsZCBiZSBoYW5kbGVkCisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaW1wbGlmaWVkOiBJT0V4Y2VwdGlvbiB0aHJvd24gZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBjbG9zZSgpIHNob3VsZCBiZSBoYW5kbGVkIGhlcmUuLi4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0uc3RhcnQoKTsKKworICAgICAgICAvLyB0aGUgb3V0cHV0IHdpbGwgYmUgcHJvYmFibHkgcmV0dXJuZWQgZXZlbiBiZWZvcmUKKyAgICAgICAgLy8gYSBmaXJzdCBjaHVuayBpcyB3cml0dGVuIGJ5IHRoZSBuZXcgdGhyZWFkCisgICAgICAgIHJldHVybiBvdXRwdXQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TmV4dFN0cmluZygpIHsKKyAgICAgICAgLy8gLi4uIGxvbmcgcnVubmluZyBvcGVyYXRpb24gdGhhdCByZXR1cm5zCisgICAgICAgIC8vICAgICBuZXh0IHN0cmluZyBvciBudWxsIGlmIG5vIG90aGVyIHN0cmluZyBpcyBhY2Nlc3NpYmxlCisgICAgfQorfV1dPjwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICAgICAgICAgIFRoZSBleGFtcGxlIGFib3ZlIGRlZmluZXMgYSAmbGl0Lmh0dHAuR0VUOyBtZXRob2QgdGhhdCByZXR1cm5zIGEgJmxpdC5qZXJzZXkuc2VydmVyLkNodW5rZWRPdXRwdXQ7IGluc3RhbmNlLgorICAgICAgICAgICAgICAgIFRoZSBnZW5lcmljIHR5cGUgb2YgJmxpdC5qZXJzZXkuc2VydmVyLkNodW5rZWRPdXRwdXQ7IGRlZmluZXMgdGhlIGNodW5rIHR5cGVzIChpbiB0aGlzIGNhc2UgY2h1bmtzIGFyZSBTdHJpbmdzKS4KKyAgICAgICAgICAgICAgICBCZWZvcmUgdGhlIGluc3RhbmNlIGlzIHJldHVybmVkIGEgbmV3IHRocmVhZCBpcyBzdGFydGVkIHRoYXQgd3JpdGVzIGluZGl2aWR1YWwgY2h1bmtzIGludG8KKyAgICAgICAgICAgICAgICB0aGUgY2h1bmtlZCBvdXRwdXQgaW5zdGFuY2UgbmFtZWQgPGxpdGVyYWw+b3V0cHV0PC9saXRlcmFsPi4gT25jZSB0aGUgb3JpZ2luYWwKKyAgICAgICAgICAgICAgICB0aHJlYWQgcmV0dXJucyBmcm9tIHRoZSByZXNvdXJjZSBtZXRob2QsIEplcnNleSBydW50aW1lIHdyaXRlcyBoZWFkZXJzIHRvIHRoZSBjb250YWluZXIgcmVzcG9uc2UgYnV0IGRvZXMgbm90CisgICAgICAgICAgICAgICAgY2xvc2UgdGhlIGNsaWVudCBjb25uZWN0aW9uIHlldCBhbmQgd2FpdHMgZm9yIHRoZSByZXNwb25zZSBkYXRhIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIGNodW5rZWQKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbD5vdXRwdXQ8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgIE5ldyB0aHJlYWQgaW4gYSBsb29wIGNhbGxzIHRoZSBtZXRob2QgPGxpdGVyYWw+Z2V0TmV4dFN0cmluZygpPC9saXRlcmFsPiB3aGljaCByZXR1cm5zIGEKKyAgICAgICAgICAgICAgICBuZXh0IFN0cmluZyBvciAmbGl0Lm51bGw7IGlmIG5vIG90aGVyIFN0cmluZyBleGlzdHMgKHRoZSBtZXRob2QgY291bGQgZm9yIGV4YW1wbGUgbG9hZCBsYXRlc3QgZGF0YQorICAgICAgICAgICAgICAgIGZyb20gdGhlIGRhdGFiYXNlKS4gUmV0dXJuZWQgU3RyaW5ncyBhcmUgd3JpdHRlbiB0byB0aGUgY2h1bmtlZCA8bGl0ZXJhbD5vdXRwdXQ8L2xpdGVyYWw+LiBTdWNoIGEgd3JpdHRlbgorICAgICAgICAgICAgICAgIGNodW5rcyBhcmUgaW50ZXJuYWxseSB3cml0dGVuIHRvIHRoZSBjb250YWluZXIgcmVzcG9uc2UgYW5kIGNsaWVudCBjYW4gcmVhZCB0aGVtLiBBdCB0aGUgZW5kIHRoZQorICAgICAgICAgICAgICAgIGNodW5rZWQgb3V0cHV0IGlzIGNsb3NlZCB3aGljaCBkZXRlcm1pbmVzIHRoZSBlbmQgb2YgdGhlIGNodW5rZWQgcmVzcG9uc2UuIFBsZWFzZSBub3RlIHRoYXQgeW91IG11c3QgY2xvc2UKKyAgICAgICAgICAgICAgICB0aGUgb3V0cHV0IGV4cGxpY2l0bHkgaW4gb3JkZXIgdG8gY2xvc2UgdGhlIGNsaWVudCBjb25uZWN0aW9uIGFzIEplcnNleSBkb2VzIG5vdCBpbXBsaWNpdGx5IGtub3cgd2hlbgorICAgICAgICAgICAgICAgIHlvdSBhcmUgZmluaXNoZWQgd2l0aCB3cml0aW5nIHRoZSBjaHVua3MuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBBIGNodW5rZWQgb3V0cHV0IGNhbiBiZSBwcm9jZXNzZWQgYWxzbyBmcm9tIHRocmVhZHMgY3JlYXRlZCBmcm9tIGFub3RoZXIgcmVxdWVzdCBhcyBpdCBpcyBleHBsYWluZWQgaW4gdGhlCisgICAgICAgICAgICAgICAgc2VjdGlvbnMgYWJvdmUuIFRoaXMgbWVhbnMgdGhhdCBvbmUgcmVzb3VyY2UgbWV0aG9kIG1heSBlLmcuIG9ubHkgcmV0dXJuIGEgJmxpdC5qZXJzZXkuc2VydmVyLkNodW5rZWRPdXRwdXQ7CisgICAgICAgICAgICAgICAgaW5zdGFuY2UgYW5kIG90aGVyIHJlc291cmNlIG1ldGhvZChzKSBpbnZva2VkIGZyb20gYW5vdGhlciByZXF1ZXN0IHRocmVhZChzKSBjYW4gd3JpdGUgZGF0YSBpbnRvIHRoZSBjaHVua2VkCisgICAgICAgICAgICAgICAgb3V0cHV0IGFuZC9vciBjbG9zZSB0aGUgY2h1bmtlZCByZXNwb25zZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbj4KKyAgICAgICAgPHRpdGxlPkNsaWVudCBBUEk8L3RpdGxlPgorICAgICAgICA8cGFyYT5UaGUgY2xpZW50IEFQSSBzdXBwb3J0cyBhc3luY2hyb25vdXMgcHJvY2Vzc2luZyB0b28uIFNpbXBsZSB1c2FnZSBvZiBhc3luY2hyb25vdXMgY2xpZW50IEFQSSBpcyBzaG93biBpbiB0aGUKKyAgICAgICAgZm9sbG93aW5nIGV4YW1wbGU6CisgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICA8dGl0bGU+U2ltcGxlIGNsaWVudCBhc3luYyBpbnZvY2F0aW9uPC90aXRsZT4KKzxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPjwhW0NEQVRBW2ZpbmFsIEFzeW5jSW52b2tlciBhc3luY0ludm9rZXIgPSB0YXJnZXQoKS5wYXRoKCJodHRwOi8vZXhhbXBsZS5jb20vcmVzb3VyY2UvIikKKyAgICAgICAgLnJlcXVlc3QoKS5hc3luYygpOworZmluYWwgRnV0dXJlPFJlc3BvbnNlPiByZXNwb25zZUZ1dHVyZSA9IGFzeW5jSW52b2tlci5nZXQoKTsKK1N5c3RlbS5vdXQucHJpbnRsbigiUmVxdWVzdCBpcyBiZWluZyBwcm9jZXNzZWQgYXN5bmNocm9ub3VzbHkuIik7CitmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHJlc3BvbnNlRnV0dXJlLmdldCgpOworICAgIC8vIGdldCgpIHdhaXRzIGZvciB0aGUgcmVzcG9uc2UgdG8gYmUgcmVhZHkKK1N5c3RlbS5vdXQucHJpbnRsbigiUmVzcG9uc2UgcmVjZWl2ZWQuIik7XV0+PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgIFRoZSBkaWZmZXJlbmNlIGFnYWluc3Qgc3luY2hyb25vdXMgaW52b2NhdGlvbiBpcyB0aGF0IHRoZSBodHRwIG1ldGhvZCBjYWxsIDxsaXRlcmFsPmdldCgpPC9saXRlcmFsPgorICAgICAgICAgICAgaXMgbm90IGNhbGxlZCBvbiAmamF4cnMuY2xpZW50LlN5bmNJbnZva2VyOyBidXQgb24gJmpheHJzLmNsaWVudC5Bc3luY0ludm9rZXI7LiBUaGUKKyAgICAgICAgICAgICZsaXQuamF4cnMuY2xpZW50LkFzeW5jSW52b2tlcjsgaXMgcmV0dXJuZWQgZnJvbSB0aGUgY2FsbCBvZiBtZXRob2QKKyAgICAgICAgICAgIDxsaXRlcmFsPkludm9jYXRpb24uQnVpbGRlci5hc3luYygpPC9saXRlcmFsPiBhcyBzaG93biBhYm92ZS4gJmxpdC5qYXhycy5jbGllbnQuQXN5bmNJbnZva2VyOworICAgICAgICAgICAgb2ZmZXJzIG1ldGhvZHMgc2ltaWxhciB0byAmbGl0LmpheHJzLmNsaWVudC5TeW5jSW52b2tlcjsgb25seSB0aGVzZSBtZXRob2RzIGRvIG5vdCByZXR1cm4gYSByZXNwb25zZQorICAgICAgICAgICAgc3luY2hyb25vdXNseS4gSW5zdGVhZCBhIDxsaXRlcmFsPkZ1dHVyZSZsdDsuLi4mZ3Q7PC9saXRlcmFsPiByZXByZXNlbnRpbmcgcmVzcG9uc2UgZGF0YSBpcyByZXR1cm5lZC4KKyAgICAgICAgICAgIFRoZXNlIG1ldGhvZCBjYWxscyBhbHNvIHJldHVybiBpbW1lZGlhdGVseSB3aXRob3V0IHdhaXRpbmcgZm9yIHRoZSBhY3R1YWwgcmVxdWVzdCB0byBjb21wbGV0ZS4KKyAgICAgICAgICAgIEluIG9yZGVyIHRvIGdldCB0aGUgcmVzcG9uc2Ugb2YgdGhlIGludm9rZWQgPGxpdGVyYWw+Z2V0KCk8L2xpdGVyYWw+IG1ldGhvZCwgdGhlCisgICAgICAgICAgICA8bGl0ZXJhbD5yZXNwb25zZUZ1dHVyZS5nZXQoKTwvbGl0ZXJhbD4gaXMgaW52b2tlZCB3aGljaCB3YWl0cyBmb3IgdGhlIHJlc3BvbnNlIHRvIGJlIGZpbmlzaGVkCisgICAgICAgICAgICAodGhpcyBjYWxsIGlzIGJsb2NraW5nIGFzIGRlZmluZWQgYnkgdGhlIEphdmEgU0UgPGxpdGVyYWw+RnV0dXJlPC9saXRlcmFsPiBjb250cmFjdCkuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBBc3luY2hyb25vdXMgQ2xpZW50IEFQSSBpbiBKQVgtUlMgaXMgZnVsbHkgaW50ZWdyYXRlZCBpbiB0aGUgZmx1ZW50IEpBWC1SUyBDbGllbnQgQVBJIGZsb3csIHNvIHRoYXQKKyAgICAgICAgICAgIHRoZSBhc3luYyBjbGllbnQtc2lkZSBpbnZvY2F0aW9ucyBjYW4gYmUgd3JpdHRlbiBmbHVlbnRseSBqdXN0IGxpa2UgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOgorICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgPHRpdGxlPlNpbXBsZSBjbGllbnQgZmx1ZW50IGFzeW5jIGludm9jYXRpb248L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPjwhW0NEQVRBW2ZpbmFsIEZ1dHVyZTxSZXNwb25zZT4gcmVzcG9uc2VGdXR1cmUgPSB0YXJnZXQoKS5wYXRoKCJodHRwOi8vZXhhbXBsZS5jb20vcmVzb3VyY2UvIikKKyAgICAgICAgLnJlcXVlc3QoKS5hc3luYygpLmdldCgpO11dPjwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRvIHdvcmsgd2l0aCBhc3luY2hyb25vdXMgcmVzdWx0cyBvbiB0aGUgY2xpZW50LXNpZGUsIGFsbCBzdGFuZGFyZCA8bGl0ZXJhbD5GdXR1cmU8L2xpdGVyYWw+IEFQSSBmYWNpbGl0aWVzCisgICAgICAgICAgICBjYW4gYmUgdXNlZC4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gdXNlIHRoZSA8bGl0ZXJhbD5pc0RvbmUoKTwvbGl0ZXJhbD4gbWV0aG9kCisgICAgICAgICAgICB0byBkZXRlcm1pbmUgd2hldGhlciBhIHJlc3BvbnNlIGhhcyBmaW5pc2hlZCB0byBhdm9pZCB0aGUgdXNlIG9mIGEgYmxvY2tpbmcgY2FsbCB0byA8bGl0ZXJhbD5GdXR1cmUuZ2V0KCk8L2xpdGVyYWw+LgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICA8dGl0bGU+QXN5bmNocm9ub3VzIENsaWVudCBDYWxsYmFja3M8L3RpdGxlPgorICAgICAgICAgICAgPHBhcmE+U2ltaWxhcmx5IHRvIHRoZSBzZXJ2ZXIgc2lkZSwgaW4gdGhlIGNsaWVudCBBUEkgeW91IGNhbiByZWdpc3RlciBhc3luY2hyb25vdXMgY2FsbGJhY2tzIHRvby4gWW91IGNhbiB1c2UKKyAgICAgICAgICAgICAgICB0aGVzZSBjYWxsYmFja3MgdG8gYmUgbm90aWZpZWQgd2hlbiBhIHJlc3BvbnNlIGFycml2ZXMgaW5zdGVhZCBvZiB3YWl0aW5nIGZvciB0aGUKKyAgICAgICAgICAgICAgICByZXNwb25zZSBvbiA8bGl0ZXJhbD5GdXR1cmUuZ2V0KCk8L2xpdGVyYWw+IG9yIGNoZWNraW5nIHRoZSBzdGF0dXMgYnkgPGxpdGVyYWw+RnV0dXJlLmlzRG9uZSgpPC9saXRlcmFsPiBpbgorICAgICAgICAgICAgICAgIGEgbG9vcC4KKyAgICAgICAgICAgICAgICBBIGNsaWVudC1zaWRlIGFzeW5jaHJvbm91cyBpbnZvY2F0aW9uIGNhbGxiYWNrIGNhbiBiZSByZWdpc3RlcmVkIGFzIHNob3duIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKKyAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgPHRpdGxlPkNsaWVudCBhc3luYyBjYWxsYmFjazwvdGl0bGU+CisgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPjwhW0NEQVRBW2ZpbmFsIEZ1dHVyZTxSZXNwb25zZT4gcmVzcG9uc2VGdXR1cmUgPSB0YXJnZXQoKS5wYXRoKCJodHRwOi8vZXhhbXBsZS5jb20vcmVzb3VyY2UvIikKKyAgICAgICAgLnJlcXVlc3QoKS5hc3luYygpLmdldChuZXcgSW52b2NhdGlvbkNhbGxiYWNrPFJlc3BvbnNlPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgY29tcGxldGVkKFJlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZXNwb25zZSBzdGF0dXMgY29kZSAiCisgICAgICAgICAgICAgICAgICAgICAgICArIHJlc3BvbnNlLmdldFN0YXR1cygpICsgIiByZWNlaXZlZC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBmYWlsZWQoVGhyb3dhYmxlIHRocm93YWJsZSkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSW52b2NhdGlvbiBmYWlsZWQuIik7CisgICAgICAgICAgICAgICAgdGhyb3dhYmxlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTtdXT48L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKworICAgICAgICAgICAgICAgIFRoZSByZWdpc3RlcmVkIGNhbGxiYWNrIGlzIGV4cGVjdGVkIHRvIGltcGxlbWVudCB0aGUgJmpheHJzLmNsaWVudC5JbnZvY2F0aW9uQ2FsbGJhY2s7IGludGVyZmFjZSB0aGF0IGRlZmluZXMKKyAgICAgICAgICAgICAgICB0d28gbWV0aG9kcy4KKyAgICAgICAgICAgICAgICBGaXJzdCBtZXRob2QgPGxpdGVyYWw+Y29tcGxldGVkKFJlc3BvbnNlKTwvbGl0ZXJhbD4gZ2V0cyBpbnZva2VkIHdoZW4gYW4gaW52b2NhdGlvbiBzdWNjZXNzZnVsbHkKKyAgICAgICAgICAgICAgICBmaW5pc2hlcy4gVGhlIHJlc3VsdCByZXNwb25zZSBpcyBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIgdG8gdGhlIGNhbGxiYWNrIG1ldGhvZC4gVGhlIHNlY29uZCBtZXRob2QKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbD5mYWlsZWQoVGhyb3dhYmxlKTwvbGl0ZXJhbD4gaXMgaW52b2tlZCBpbiBjYXNlIHRoZSBpbnZvY2F0aW9uIGZhaWxzIGFuZCB0aGUgZXhjZXB0aW9uIGRlc2NyaWJpbmcKKyAgICAgICAgICAgICAgICB0aGUgZmFpbHVyZSBpcyBwYXNzZWQgdG8gdGhlIG1ldGhvZCBhcyBhIHBhcmFtZXRlci4gSW4gdGhpcyBjYXNlIHNpbmNlIHRoZSBjYWxsYmFjayBnZW5lcmljIHR5cGUgaXMKKyAgICAgICAgICAgICAgICAmbGl0LmpheHJzLmNvcmUuUmVzcG9uc2U7LCB0aGUgPGxpdGVyYWw+ZmFpbGVkKFRocm93YWJsZSk8L2xpdGVyYWw+IG1ldGhvZCB3b3VsZCAgb25seSBpbnZva2VkIGluIGNhc2UKKyAgICAgICAgICAgICAgICB0aGUgaW52b2NhdGlvbiBmYWlscyBiZWNhdXNlIG9mIGFuIGludGVybmFsIGNsaWVudC1zaWRlIHByb2Nlc3NpbmcgZXJyb3IuIEl0IHdvdWxkIG5vdCBiZSBpbnZva2VkCisgICAgICAgICAgICAgICAgaW4gY2FzZSBhIHNlcnZlciByZXNwb25kcyB3aXRoIGFuIEhUVFAgZXJyb3IgY29kZSwgZm9yIGV4YW1wbGUgaWYgdGhlIHJlcXVlc3RlZCByZXNvdXJjZQorICAgICAgICAgICAgICAgIGlzIG5vdCBmb3VuZCBvbiB0aGUgc2VydmVyIGFuZCBIVFRQIDxsaXRlcmFsPjQwNDwvbGl0ZXJhbD4gcmVzcG9uc2UgY29kZSBpcyByZXR1cm5lZC4gSW4gc3VjaCBjYXNlCisgICAgICAgICAgICAgICAgPGxpdGVyYWw+Y29tcGxldGVkKFJlc3BvbnNlKTwvbGl0ZXJhbD4gY2FsbGJhY2sgbWV0aG9kIHdvdWxkIGJlIGludm9rZWQgYW5kIHRoZSByZXNwb25zZSBwYXNzZWQgdG8gdGhlIG1ldGhvZAorICAgICAgICAgICAgICAgIHdvdWxkIGNvbnRhaW4gdGhlIHJldHVybmVkIGVycm9yIHJlc3BvbnNlIHdpdGggSFRUUCA8bGl0ZXJhbD40MDQ8L2xpdGVyYWw+IGVycm9yIGNvZGUuIFRoaXMgaXMgYSBzcGVjaWFsCisgICAgICAgICAgICAgICAgYmVoYXZpb3IgaW4gY2FzZSB0aGUgZ2VuZXJpYyBjYWxsYmFjayByZXR1cm4gdHlwZSBpcyAmbGl0LmpheHJzLmNvcmUuUmVzcG9uc2U7LiBJbiB0aGUgbmV4dCBleGFtcGxlIGFuCisgICAgICAgICAgICAgICAgZXhjZXB0aW9uIGlzIHRocm93biAob3IgPGxpdGVyYWw+ZmFpbGVkKFRocm93YWJsZSk8L2xpdGVyYWw+IG1ldGhvZCBvbiB0aGUgaW52b2NhdGlvbiBjYWxsYmFjayBpcyBpbnZva2VkKQorICAgICAgICAgICAgICAgIGV2ZW4gaW4gY2FzZSBhIG5vbi08bGl0ZXJhbD4yeHg8L2xpdGVyYWw+IEhUVFAgZXJyb3IgY29kZSBpcyByZXR1cm5lZC4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEFzIHdpdGggdGhlIHN5bmNocm9ub3VzIGNsaWVudCBBUEksIHlvdSBjYW4gcmV0cmlldmUgdGhlIHJlc3BvbnNlIGVudGl0eSBhcyBhIEphdmEgdHlwZSBkaXJlY3RseSB3aXRob3V0CisgICAgICAgICAgICAgICAgcmVxdWVzdGluZyBhICZsaXQuamF4cnMuY29yZS5SZXNwb25zZTsgZmlyc3QuIEluIGNhc2Ugb2YgYW4gJmxpdC5qYXhycy5jbGllbnQuSW52b2NhdGlvbkNhbGxiYWNrOywgeW91IG5lZWQKKyAgICAgICAgICAgICAgICB0byBzZXQgaXRzIGdlbmVyaWMgdHlwZSB0byB0aGUgZXhwZWN0ZWQgcmVzcG9uc2UgZW50aXR5IHR5cGUgaW5zdGVhZCBvZiB1c2luZyB0aGUgJmxpdC5qYXhycy5jb3JlLlJlc3BvbnNlOworICAgICAgICAgICAgICAgIHR5cGUgYXMgZGVtb25zdHJhdGVkIGluIHRoZSBleGFtcGxlIGJlbG93OgorICAgICAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgICAgICA8dGl0bGU+Q2xpZW50IGFzeW5jIGNhbGxiYWNrIGZvciBzcGVjaWZpYyBlbnRpdHk8L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj48IVtDREFUQVtmaW5hbCBGdXR1cmU8U3RyaW5nPiBlbnRpdHlGdXR1cmUgPSB0YXJnZXQoKS5wYXRoKCJodHRwOi8vZXhhbXBsZS5jb20vcmVzb3VyY2UvIikKKyAgICAgICAgLnJlcXVlc3QoKS5hc3luYygpLmdldChuZXcgSW52b2NhdGlvbkNhbGxiYWNrPFN0cmluZz4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbXBsZXRlZChTdHJpbmcgcmVzcG9uc2UpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlc3BvbnNlIGVudGl0eSAnIiArIHJlc3BvbnNlICsgIicgcmVjZWl2ZWQuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgZmFpbGVkKFRocm93YWJsZSB0aHJvd2FibGUpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkludm9jYXRpb24gZmFpbGVkLiIpOworICAgICAgICAgICAgICAgIHRocm93YWJsZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CitTeXN0ZW0ub3V0LnByaW50bG4oZW50aXR5RnV0dXJlLmdldCgpKTtdXT48L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgICAgICBIZXJlLCB0aGUgZ2VuZXJpYyB0eXBlIG9mIHRoZSBpbnZvY2F0aW9uIGNhbGxiYWNrIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gdW5tYXJzaGFsbCB0aGUgSFRUUCByZXNwb25zZSBjb250ZW50CisgICAgICAgICAgICAgICAgaW50byBhIGRlc2lyZWQgSmF2YSB0eXBlLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGltcG9ydGFudD4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgUGxlYXNlIG5vdGUgdGhhdCBpbiB0aGlzIGNhc2UgdGhlIG1ldGhvZCA8bGl0ZXJhbD5mYWlsZWQoVGhyb3dhYmxlIHRocm93YWJsZSk8L2xpdGVyYWw+IHdvdWxkIGJlIGludm9rZWQgZXZlbgorICAgICAgICAgICAgICAgICAgICBmb3IgY2FzZXMgd2hlbiBhIHNlcnZlciByZXNwb25kcyB3aXRoIGEgbm9uIEhUVFAtPGxpdGVyYWw+Mnh4PC9saXRlcmFsPiBIVFRQIGVycm9yIGNvZGUuIFRoaXMgaXMgYmVjYXVzZSBpbiB0aGlzCisgICAgICAgICAgICAgICAgICAgIGNhc2UgdGhlIHVzZXIgZG9lcyBub3QgaGF2ZSBhbnkgb3RoZXIgbWVhbnMgb2YgZmluZGluZyBvdXQgdGhhdCB0aGUgc2VydmVyIHJldHVybmVkIGFuIGVycm9yIHJlc3BvbnNlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvaW1wb3J0YW50PgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICA8dGl0bGU+Q2h1bmtlZCBpbnB1dDwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBJbiBhbiA8bGluayBsaW5rZW5kPSJjaHVua2VkLW91dHB1dCI+ZWFybGllciBzZWN0aW9uPC9saW5rPiB0aGUgJmxpdC5qZXJzZXkuc2VydmVyLkNodW5rZWRPdXRwdXQ7IHdhcworICAgICAgICAgICAgICAgIGRlc2NyaWJlZC4gSXQgd2FzIHNob3duIGhvdyB0byB1c2UgYSBjaHVua2VkIG91dHB1dCBvbiB0aGUgc2VydmVyLiBJbiBvcmRlciB0byByZWFkIGNodW5rcyBvbiB0aGUgY2xpZW50IHRoZQorICAgICAgICAgICAgICAgICZqZXJzZXkuY2xpZW50LkNodW5rZWRJbnB1dDsgY2FuIGJlIHVzZWQgdG8gY29tcGxldGUgdGhlIHN0b3J5LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgWW91IGNhbiwgb2YgY291cnNlLCBwcm9jZXNzIGlucHV0IG9uIHRoZSBjbGllbnQgYXMgYSBzdGFuZGFyZCBpbnB1dCBzdHJlYW0gYnV0IGlmIHlvdSB3b3VsZCBsaWtlIHRvCisgICAgICAgICAgICAgICAgbGV2ZXJhZ2UgSmVyc2V5IGluZnJhc3RydWN0dXJlIHRvIHByb3ZpZGUgc3VwcG9ydCBvZiB0cmFuc2xhdGluZyBtZXNzYWdlIGNodW5rIGRhdGEgaW50byBKYXZhIHR5cGVzCisgICAgICAgICAgICAgICAgdXNpbmcgYSAmbGl0LmplcnNleS5jbGllbnQuQ2h1bmtlZElucHV0OyBpcyBtdWNoIG1vcmUgc3RyYWlnaHRmb3J3YXJkLiBTZWUgdGhlIHVzYWdlIG9mIHRoZQorICAgICAgICAgICAgICAgICZsaXQuamVyc2V5LmNsaWVudC5DaHVua2VkSW5wdXQ7IGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKKworICAgICAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgICAgICA8dGl0bGU+Q2h1bmtlZElucHV0IGV4YW1wbGU8L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj48IVtDREFUQVtmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoImh0dHA6Ly9leGFtcGxlLmNvbS9yZXNvdXJjZS8iKQorICAgICAgICAucmVxdWVzdCgpLmdldCgpOworZmluYWwgQ2h1bmtlZElucHV0PFN0cmluZz4gY2h1bmtlZElucHV0ID0KKyAgICAgICAgcmVzcG9uc2UucmVhZEVudGl0eShuZXcgR2VuZXJpY1R5cGU8Q2h1bmtlZElucHV0PFN0cmluZz4+KCkge30pOworU3RyaW5nIGNodW5rOword2hpbGUgKChjaHVuayA9IGNodW5rZWRJbnB1dC5yZWFkKCkpICE9IG51bGwpIHsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk5leHQgY2h1bmsgcmVjZWl2ZWQ6ICIgKyBjaHVuayk7Cit9CitdXT48L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKworICAgICAgICAgICAgICAgIFRoZSByZXNwb25zZSBpcyByZXRyaWV2ZWQgaW4gYSBzdGFuZGFyZCB3YXkgZnJvbSB0aGUgc2VydmVyLiBUaGUgZW50aXR5IGlzIHJlYWQgYXMgYQorICAgICAgICAgICAgICAgICZsaXQuamVyc2V5LmNsaWVudC5DaHVua2VkSW5wdXQ7IGVudGl0eS4gSW4gb3JkZXIgdG8gZG8gdGhhdCB0aGUgJmpheHJzLmNvcmUuR2VuZXJpY0VudGl0eTsgaXMgdXNlZCB0byBwcmVzZXJ2ZQorICAgICAgICAgICAgICAgIGEgZ2VuZXJpYyBpbmZvcm1hdGlvbiBhdCBydW4gdGltZS4gSWYgeW91IHdvdWxkIG5vdCB1c2UgJmxpdC5qYXhycy5jb3JlLkdlbmVyaWNFbnRpdHk7LCBKYXZhIGxhbmd1YWdlIGdlbmVyaWMgdHlwZQorICAgICAgICAgICAgICAgIGVyYXN1cmUgd291bGQgY2F1c2UgdGhhdCB0aGUgZ2VuZXJpYyBpbmZvcm1hdGlvbiB3b3VsZCBnZXQgbG9zdCBhdCBjb21waWxlIHRpbWUgYW5kIGFuIGV4Y2VwdGlvbiB3b3VsZCBiZSB0aHJvd24KKyAgICAgICAgICAgICAgICBhdCBydW4gdGltZSBjb21wbGFpbmluZyBhYm91dCB0aGUgbWlzc2luZyBjaHVuayB0eXBlIGRlZmluaXRpb24uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBJbiB0aGUgbmV4dCBsaW5lcyBpbiB0aGUgZXhhbXBsZSwgaW5kaXZpZHVhbCBjaHVua3MgYXJlIGJlaW5nIHJlYWQgZnJvbSB0aGUgcmVzcG9uc2UuIENodW5rcyBjYW4gY29tZSB3aXRoIHNvbWUKKyAgICAgICAgICAgICAgICBkZWxheSwgc28gdGhleSB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIGNvbnNvbGUgYXMgdGhleSBjb21lIGZyb20gdGhlIHNlcnZlci4gQWZ0ZXIgcmVjZWl2aW5nIGxhc3QgY2h1bmsgdGhlCisgICAgICAgICAgICAgICAgJmxpdC5udWxsOyB3aWxsIGJlIHJldHVybmVkIGZyb20gdGhlIDxsaXRlcmFsPnJlYWQoKTwvbGl0ZXJhbD4gbWV0aG9kLiBUaGlzIHdpbGwgbWVhbiB0aGF0IHRoZSBzZXJ2ZXIgaGFzIHNlbnQKKyAgICAgICAgICAgICAgICB0aGUgbGFzdCBjaHVuayBhbmQgY2xvc2VkIHRoZSBjb25uZWN0aW9uLiBOb3RlIHRoYXQgdGhlIDxsaXRlcmFsPnJlYWQoKTwvbGl0ZXJhbD4gaXMgYSBibG9ja2luZyBvcGVyYXRpb24gYW5kIHRoZQorICAgICAgICAgICAgICAgIGludm9raW5nIHRocmVhZCBpcyBibG9ja2VkIHVudGlsIGEgbmV3IGNodW5rIGNvbWVzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgV3JpdGluZyBjaHVua3Mgd2l0aCAmbGl0LmplcnNleS5zZXJ2ZXIuQ2h1bmtlZE91dHB1dDsgaXMgc2ltcGxlLCB5b3Ugb25seSBjYWxsIG1ldGhvZCA8bGl0ZXJhbD53cml0ZSgpPC9saXRlcmFsPgorICAgICAgICAgICAgICAgIHdoaWNoIHdyaXRlcyBleGFjdGx5IG9uZSBjaHVuayB0byB0aGUgb3V0cHV0LiBXaXRoIHRoZSBpbnB1dCByZWFkaW5nIGl0IGlzIHNsaWdodGx5IG1vcmUgY29tcGxpY2F0ZWQuIFRoZQorICAgICAgICAgICAgICAgICZsaXQuamVyc2V5LmNsaWVudC5DaHVua2VkSW5wdXQ7IGRvZXMgbm90IGtub3cgaG93IHRvIGRpc3Rpbmd1aXNoIGNodW5rcyBpbiB0aGUgYnl0ZSBzdHJlYW0gdW5sZXNzIGJlaW5nIHRvbGQgYnkKKyAgICAgICAgICAgICAgICB0aGUgZGV2ZWxvcGVyLiBJbiBvcmRlciB0byBkZWZpbmUgY3VzdG9tIGNodW5rcyBib3VuZGFyaWVzLAorICAgICAgICAgICAgICAgIHRoZSAmbGl0LmplcnNleS5jbGllbnQuQ2h1bmtlZElucHV0OyBvZmZlcnMgcG9zc2liaWxpdHkgdG8gcmVnaXN0ZXIgYSAmamVyc2V5LmNsaWVudC5DaHVua1BhcnNlcjsgd2hpY2gKKyAgICAgICAgICAgICAgICByZWFkcyBjaHVua3MgZnJvbSB0aGUgaW5wdXQgc3RyZWFtIGFuZCBzZXBhcmF0ZXMgdGhlbS4gSmVyc2V5IHByb3ZpZGVzIHNldmVyYWwgY2h1bmsgcGFyc2VyIGltcGxlbWVudGF0aW9uIGFuZAorICAgICAgICAgICAgICAgIHlvdSBjYW4gaW1wbGVtZW50IHlvdXIgb3duIHBhcnNlciB0byBzZXBhcmF0ZSB5b3VyIGNodW5rcyBpZiB5b3UgbmVlZC4gSW4gb3VyIGV4YW1wbGUgYWJvdmUgdGhlIGRlZmF1bHQgcGFyc2VyCisgICAgICAgICAgICAgICAgcHJvdmlkZWQgYnkgSmVyc2V5IGlzIHVzZWQgdGhhdCBzZXBhcmF0ZXMgY2h1bmtzIGJhc2VkIG9uIHByZXNlbmNlIG9mIGEgPGxpdGVyYWw+XHJcbjwvbGl0ZXJhbD4gZGVsaW1pdGluZworICAgICAgICAgICAgICAgIGNoYXJhY3RlciBzZXF1ZW5jZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEVhY2ggaW5jb21pbmcgaW5wdXQgc3RyZWFtIGlzIGZpcnN0bHkgcGFyc2VkIGJ5IHRoZSAmbGl0LmplcnNleS5jbGllbnQuQ2h1bmtQYXJzZXI7LCB0aGVuIGVhY2ggY2h1bmsgaXMgcHJvY2Vzc2VkCisgICAgICAgICAgICAgICAgYnkgdGhlIHByb3BlciAmamF4cnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyOy4KKyAgICAgICAgICAgICAgICBZb3UgY2FuIGRlZmluZSB0aGUgbWVkaWEgdHlwZSBvZiBjaHVua3MgdG8gYWlkIHRoZSBzZWxlY3Rpb24gb2YgYSBwcm9wZXIgJmxpdC5qYXhycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7IGluCisgICAgICAgICAgICAgICAgb3JkZXIgdG8gcmVhZCBjaHVua3MgY29ycmVjdGx5IGludG8gdGhlIHJlcXVlc3RlZCBlbnRpdHkgdHlwZXMgKGluIG91ciBjYXNlIGludG8gU3RyaW5ncykuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+Cis8L2NoYXB0ZXI+CmRpZmYgLS1naXQgYS9kb2NzL3NyYy9tYWluL2RvY2Jvb2svYmVhbi12YWxpZGF0aW9uLnhtbCBiL2RvY3Mvc3JjL21haW4vZG9jYm9vay9iZWFuLXZhbGlkYXRpb24ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MzZkOTIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3NyYy9tYWluL2RvY2Jvb2svYmVhbi12YWxpZGF0aW9uLnhtbApAQCAtMCwwICsxLDc5OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPCFET0NUWVBFIGNoYXB0ZXIgWzwhRU5USVRZICUgZW50cyBTWVNURU0gImplcnNleS5lbnQiID4gJWVudHM7IF0+Cis8Y2hhcHRlciB4bWxucz0iaHR0cDovL2RvY2Jvb2sub3JnL25zL2RvY2Jvb2siCisgICAgICAgICB2ZXJzaW9uPSI1LjAiCisgICAgICAgICB4bWw6bGFuZz0iZW4iCisgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiCisgICAgICAgICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKKyAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2RvY2Jvb2sub3JnL25zL2RvY2Jvb2sgaHR0cDovL2RvY2Jvb2sub3JnL3htbC81LjAveHNkL2RvY2Jvb2sueHNkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsgaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluay54c2QiCisgICAgICAgICB4bWw6aWQ9ImJlYW4tdmFsaWRhdGlvbiI+CisKKyAgICA8dGl0bGU+QmVhbiBWYWxpZGF0aW9uIFN1cHBvcnQ8L3RpdGxlPgorCisgICAgPHBhcmE+CisgICAgICAgIFZhbGlkYXRpb24gaXMgYSBwcm9jZXNzIG9mIHZlcmlmeWluZyB0aGF0IHNvbWUgZGF0YSBvYmV5cyBvbmUgb3IgbW9yZSBwcmUtZGVmaW5lZCBjb25zdHJhaW50cy4gVGhpcyBjaGFwdGVyIGRlc2NyaWJlcworICAgICAgICBzdXBwb3J0IGZvciAmYnYucHJvamVjdC5saW5rOyBpbiBKZXJzZXkgaW4gdGVybXMgb2YgdGhlIG5lZWRlZCBkZXBlbmRlbmNpZXMsIGNvbmZpZ3VyYXRpb24sIHJlZ2lzdHJhdGlvbiBhbmQgdXNhZ2UuCisgICAgICAgIEZvciBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9uIGhvdyBKQVgtUlMgcHJvdmlkZXMgbmF0aXZlIHN1cHBvcnQgZm9yIHZhbGlkYXRpbmcgcmVzb3VyY2UgY2xhc3NlcyBiYXNlZCBvbiB0aGUKKyAgICAgICAgQmVhbiBWYWxpZGF0aW9uIHJlZmVyIHRvIHRoZSBjaGFwdGVyIGluIHRoZSA8bGluayB4bGluazpocmVmPSJodHRwOi8vamNwLm9yZy9lbi9qc3IvZGV0YWlsP2lkPTMzOSI+SkFYLVJTIHNwZWM8L2xpbms+LgorICAgIDwvcGFyYT4KKworICAgIDxzZWN0aW9uPgorICAgICAgICA8dGl0bGU+QmVhbiBWYWxpZGF0aW9uIERlcGVuZGVuY2llczwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBCZWFuIFZhbGlkYXRpb24gc3VwcG9ydCBpbiBKZXJzZXkgaXMgcHJvdmlkZWQgYXMgYW4gZXh0ZW5zaW9uIG1vZHVsZSBhbmQgbmVlZHMgdG8gYmUgbWVudGlvbmVkIGV4cGxpY2l0bHkgaW4geW91cgorICAgICAgICAgICAgJmxpdC5wb20ueG1sOyBmaWxlIChpbiBjYXNlIG9mIHVzaW5nIE1hdmVuKToKKworICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJ4bWwiIGxpbmVudW1iZXJpbmc9InVubnVtYmVyZWQiPiZsdDtkZXBlbmRlbmN5Jmd0OworICAgICZsdDtncm91cElkJmd0O29yZy5nbGFzc2Zpc2guamVyc2V5LmV4dCZsdDsvZ3JvdXBJZCZndDsKKyAgICAmbHQ7YXJ0aWZhY3RJZCZndDtqZXJzZXktYmVhbi12YWxpZGF0aW9uJmx0Oy9hcnRpZmFjdElkJmd0OworICAgICZsdDt2ZXJzaW9uJmd0OyZ2ZXJzaW9uOyZsdDsvdmVyc2lvbiZndDsKKyZsdDsvZGVwZW5kZW5jeSZndDs8L3Byb2dyYW1saXN0aW5nPgorCisgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgSWYgeW91J3JlIG5vdCB1c2luZyBNYXZlbiBtYWtlIHN1cmUgdG8gaGF2ZSBhbHNvIGFsbCB0aGUgdHJhbnNpdGl2ZSBkZXBlbmRlbmNpZXMgKHNlZSAmamVyc2V5LmV4dC5iZWFuLXZhbGlkYXRpb24uZGVwcy5saW5rOykgb24KKyAgICAgICAgICAgICAgICAgICAgdGhlIGNsYXNzcGF0aC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L25vdGU+CisKKyAgICAgICAgICAgIFRoaXMgbW9kdWxlIGRlcGVuZHMgZGlyZWN0bHkgb24KKyAgICAgICAgICAgIDxsaW5rIHhsaW5rOmhyZWY9Imh0dHA6Ly93d3cuaGliZXJuYXRlLm9yZy9zdWJwcm9qZWN0cy92YWxpZGF0b3IuaHRtbCI+SGliZXJuYXRlIFZhbGlkYXRvcjwvbGluaz4KKyAgICAgICAgICAgIHdoaWNoIHByb3ZpZGVzIGEgbW9zdCBjb21tb25seSB1c2VkIGltcGxlbWVudGF0aW9uIG9mIHRoZSBCZWFuIFZhbGlkYXRpb24gQVBJIHNwZWMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBJZiB5b3Ugd2FudCB0byB1c2UgYSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24gb2YgdGhlIEJlYW4gVmFsaWRhdGlvbiBBUEksIHVzZSBzdGFuZGFyZCBNYXZlbiBtZWNoYW5pc21zIHRvIGV4Y2x1ZGUKKyAgICAgICAgICAgIEhpYmVybmF0ZSBWYWxpZGF0b3IgZnJvbSB0aGUgbW9kdWxlcyBkZXBlbmRlbmNpZXMgYW5kIGFkZCBhIGRlcGVuZGVuY3kgb2YgeW91ciBvd24uCisKKyAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0ieG1sIiBsaW5lbnVtYmVyaW5nPSJ1bm51bWJlcmVkIj4mbHQ7ZGVwZW5kZW5jeSZndDsKKyAgICAmbHQ7Z3JvdXBJZCZndDtvcmcuZ2xhc3NmaXNoLmplcnNleS5leHQmbHQ7L2dyb3VwSWQmZ3Q7CisgICAgJmx0O2FydGlmYWN0SWQmZ3Q7amVyc2V5LWJlYW4tdmFsaWRhdGlvbiZsdDsvYXJ0aWZhY3RJZCZndDsKKyAgICAmbHQ7dmVyc2lvbiZndDsmdmVyc2lvbjsmbHQ7L3ZlcnNpb24mZ3Q7CisgICAgJmx0O2V4Y2x1c2lvbnMmZ3Q7CisgICAgICAgICZsdDtleGNsdXNpb24mZ3Q7CisgICAgICAgICAgICAmbHQ7Z3JvdXBJZCZndDtvcmcuaGliZXJuYXRlJmx0Oy9ncm91cElkJmd0OworICAgICAgICAgICAgJmx0O2FydGlmYWN0SWQmZ3Q7aGliZXJuYXRlLXZhbGlkYXRvciZsdDsvYXJ0aWZhY3RJZCZndDsKKyAgICAgICAgJmx0Oy9leGNsdXNpb24mZ3Q7CisgICAgJmx0Oy9leGNsdXNpb25zJmd0OworJmx0Oy9kZXBlbmRlbmN5Jmd0OzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbj4KKyAgICAgICAgPHRpdGxlPkVuYWJsaW5nIEJlYW4gVmFsaWRhdGlvbiBpbiBKZXJzZXk8L3RpdGxlPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQXMgc3RhdGVkIGluIDx4cmVmIGxpbmtlbmQ9ImRlcGxveW1lbnQuYXV0b2Rpc2NvdmVyYWJsZSIvPiwgSmVyc2V5IEJlYW4gVmFsaWRhdGlvbiBpcyBvbmUgb2YgdGhlIG1vZHVsZXMgd2hlcmUgeW91CisgICAgICAgICAgICBkb24ndCBuZWVkIHRvIGV4cGxpY2l0bHkgcmVnaXN0ZXIgaXQncyAmbGl0LmpheHJzLmNvcmUuRmVhdHVyZTtzICgmamVyc2V5LmV4dC5WYWxpZGF0aW9uRmVhdHVyZTspIG9uIHRoZQorICAgICAgICAgICAgc2VydmVyIGFzIGl0J3MgZmVhdHVyZXMgYXJlIGF1dG9tYXRpY2FsbHkgZGlzY292ZXJlZCBhbmQgcmVnaXN0ZXJlZCB3aGVuIHlvdSBhZGQgdGhlCisgICAgICAgICAgICAmbGl0LmplcnNleS1iZWFuLXZhbGlkYXRpb247IG1vZHVsZSB0byB5b3VyIGNsYXNzcGF0aC4KKyAgICAgICAgICAgIFRoZXJlIGFyZSB0aHJlZSBKZXJzZXkgc3BlY2lmaWMgcHJvcGVydGllcyB0aGF0IGNvdWxkIGRpc2FibGUgYXV0b21hdGljIGRpc2NvdmVyeSBhbmQgcmVnaXN0cmF0aW9uIG9mIEplcnNleSBCZWFuCisgICAgICAgICAgICBWYWxpZGF0aW9uIGludGVncmF0aW9uIG1vZHVsZToKKworICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPiZqZXJzZXkuY29tbW9uLkNvbW1vblByb3BlcnRpZXMuRkVBVFVSRV9BVVRPX0RJU0NPVkVSWV9ESVNBQkxFOzwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+JmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcy5GRUFUVVJFX0FVVE9fRElTQ09WRVJZX0RJU0FCTEU7PC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4mamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzLkJWX0ZFQVRVUkVfRElTQUJMRTs8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorCisgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICA8cGFyYT5KZXJzZXkgZG9lcyBub3Qgc3VwcG9ydCBCZWFuIFZhbGlkYXRpb24gb24gdGhlIGNsaWVudCBhdCB0aGUgbW9tZW50LjwvcGFyYT4KKyAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uPgorICAgICAgICA8dGl0bGU+Q29uZmlndXJpbmcgQmVhbiBWYWxpZGF0aW9uIFN1cHBvcnQ8L3RpdGxlPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBvZiBCZWFuIFZhbGlkYXRpb24gc3VwcG9ydCBpbiBKZXJzZXkgaXMgdHdvZm9sZCAtIHRoZXJlIGFyZSBmZXcgc3BlY2lmaWMgcHJvcGVydGllcyB0aGF0IGFmZmVjdHMgSmVyc2V5CisgICAgICAgICAgICBiZWhhdmlvdXIgKGUuZy4gc2VuZGluZyB2YWxpZGF0aW9uIGVycm9yIGVudGl0aWVzIHRvIHRoZSBjbGllbnQpIGFuZCB0aGVuIHRoZXJlIGlzICZqZXJzZXkuZXh0LlZhbGlkYXRpb25Db25maWc7IGNsYXNzCisgICAgICAgICAgICB0aGF0IGNvbmZpZ3VyZXMgJmJ2LlZhbGlkYXRvcjsgdXNlZCBmb3IgdmFsaWRhdGluZyByZXNvdXJjZXMgaW4gSkFYLVJTIGFwcGxpY2F0aW9uLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUbyBjb25maWd1cmUgSmVyc2V5IHNwZWNpZmljIGJlaGF2aW91ciB5b3UgY2FuIHVzZSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6CisKKyAgICAgICAgICAgIDx2YXJpYWJsZWxpc3Q+CisgICAgICAgICAgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPHRlcm0+JmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcy5CVl9ESVNBQkxFX1ZBTElEQVRFX09OX0VYRUNVVEFCTEVfT1ZFUlJJREVfQ0hFQ0s7PC90ZXJtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXNhYmxlcyAmbGl0LmJ2LlZhbGlkYXRlT25FeGVjdXRpb247IGNoZWNrLiBNb3JlIG9uIHRoaXMgaXMgZGVzY3JpYmVkIGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHhyZWYgbGlua2VuZD0iYnYuVmFsaWRhdGVPbkV4ZWN1dGlvbiIgLz4uCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgICAgICAgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPHRlcm0+JmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcy5CVl9TRU5EX0VSUk9SX0lOX1JFU1BPTlNFOzwvdGVybT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5hYmxlcyBzZW5kaW5nIHZhbGlkYXRpb24gZXJyb3JzIGluIHJlc3BvbnNlIGVudGl0eSB0byB0aGUgY2xpZW50LiBNb3JlIG9uIHRoaXMgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8eHJlZiBsaW5rZW5kPSJidi5WYWxpZGF0aW9uRXJyb3IiIC8+LgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDwvdmFybGlzdGVudHJ5PgorICAgICAgICAgICAgPC92YXJpYWJsZWxpc3Q+CisKKyAgICAgICAgICAgIDxleGFtcGxlIHhtbDppZD0iYnYuZXhhbXBsZS5qZXJzZXkucHJvcGVydGllcyI+CisgICAgICAgICAgICAgICAgPHRpdGxlPkNvbmZpZ3VyaW5nIEplcnNleSBzcGVjaWZpYyBwcm9wZXJ0aWVzIGZvciBCZWFuIFZhbGlkYXRpb24uPC90aXRsZT4KKworICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPm5ldyBSZXNvdXJjZUNvbmZpZygpCisgICAgLy8gTm93IHlvdSBjYW4gZXhwZWN0IHZhbGlkYXRpb24gZXJyb3JzIHRvIGJlIHNlbnQgdG8gdGhlIGNsaWVudC4KKyAgICAucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5CVl9TRU5EX0VSUk9SX0lOX1JFU1BPTlNFLCB0cnVlKQorICAgIC8vIEBWYWxpZGF0ZU9uRXhlY3V0aW9uIGFubm90YXRpb25zIG9uIHN1YmNsYXNzZXMgd29uJ3QgY2F1c2UgZXJyb3JzLgorICAgIC5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLkJWX0RJU0FCTEVfVkFMSURBVEVfT05fRVhFQ1VUQUJMRV9PVkVSUklERV9DSEVDSywgdHJ1ZSkKKyAgICAvLyBGdXJ0aGVyIGNvbmZpZ3VyYXRpb24gb2YgUmVzb3VyY2VDb25maWcuCisgICAgLnJlZ2lzdGVyKCAuLi4gKTs8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorCisgICAgICAgICAgICBDdXN0b21pemF0aW9uIG9mIHRoZSAmbGl0LmJ2LlZhbGlkYXRvcjsgdXNlZCBpbiB2YWxpZGF0aW9uIG9mIHJlc291cmNlIGNsYXNzZXMvbWV0aG9kcyBjYW4gYmUgZG9uZSB1c2luZworICAgICAgICAgICAgJmxpdC5qZXJzZXkuZXh0LlZhbGlkYXRpb25Db25maWc7IGNsYXNzIGFuZCBleHBvc2luZyBpdCB2aWEgJmpheHJzLmV4dC5Db250ZXh0UmVzb2x2ZXI7IG1lY2hhbmlzbSBhcyBzaG93biBpbgorICAgICAgICAgICAgPHhyZWYgbGlua2VuZD0iYnYuZXhhbXBsZS5WYWxpZGF0aW9uQ29uZmlnIi8+LiBZb3UgY2FuIHNldCBjdXN0b20gaW5zdGFuY2VzIGZvciB0aGUgZm9sbG93aW5nIGludGVyZmFjZXMgZnJvbQorICAgICAgICAgICAgdGhlIEJlYW4gVmFsaWRhdGlvbiBBUEk6CisKKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICZidi5NZXNzYWdlSW50ZXJwb2xhdG9yOyAtIGludGVycG9sYXRlcyBhIGdpdmVuIGNvbnN0cmFpbnQgdmlvbGF0aW9uIG1lc3NhZ2UuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAmYnYuVHJhdmVyc2FibGVSZXNvbHZlcjsgLSBkZXRlcm1pbmVzIGlmIGEgcHJvcGVydHkgY2FuIGJlIGFjY2Vzc2VkIGJ5IHRoZSBCZWFuIFZhbGlkYXRpb24gcHJvdmlkZXIuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAmYnYuQ29uc3RyYWludFZhbGlkYXRvckZhY3Rvcnk7IC0gaW5zdGFudGlhdGVzIGEgPGxpdGVyYWw+Q29uc3RyYWludFZhbGlkYXRvcjwvbGl0ZXJhbD4gaW5zdGFuY2UgYmFzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZiBpdHMgY2xhc3MuIE5vdGUgdGhhdCBieSBzZXR0aW5nIGEgY3VzdG9tIDxsaXRlcmFsPkNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5PC9saXRlcmFsPiB5b3UgbWF5IGxvb3NlCisgICAgICAgICAgICAgICAgICAgICAgICBpbmplY3Rpb24gb2YgYXZhaWxhYmxlIHJlc291cmNlcy9wcm92aWRlcnMgYXQgdGhlIG1vbWVudC4gU2VlIDx4cmVmIGxpbmtlbmQ9ImJ2LmluamVjdGluZyIvPiBob3cgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSB0aGlzLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPiZidi5QYXJhbWV0ZXJOYW1lUHJvdmlkZXI7IC0gcHJvdmlkZXMgbmFtZXMgZm9yIG1ldGhvZCBhbmQgY29uc3RydWN0b3IgcGFyYW1ldGVycy48L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorCisgICAgICAgICAgICA8ZXhhbXBsZSB4bWw6aWQ9ImJ2LmV4YW1wbGUuVmFsaWRhdGlvbkNvbmZpZyI+CisgICAgICAgICAgICAgICAgPHRpdGxlPlVzaW5nICZsaXQuamVyc2V5LmV4dC5WYWxpZGF0aW9uQ29uZmlnOyB0byBjb25maWd1cmUgJmxpdC5idi5WYWxpZGF0b3I7LjwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiPi8qKgorICogQ3VzdG9tIGNvbmZpZ3VyYXRpb24gb2YgdmFsaWRhdGlvbi4gVGhpcyBjb25maWd1cmF0aW9uIGRlZmluZXMgY3VzdG9tOgorICogJmx0O3VsJmd0OworICogICAgICZsdDtsaSZndDtDb25zdHJhaW50VmFsaWRhdGlvbkZhY3RvcnkgLSBzbyB0aGF0IHZhbGlkYXRvcnMgYXJlIGFibGUgdG8gaW5qZWN0IEplcnNleSBwcm92aWRlcnMvcmVzb3VyY2VzLiZsdDsvbGkmZ3Q7CisgKiAgICAgJmx0O2xpJmd0O1BhcmFtZXRlck5hbWVQcm92aWRlciAtIGlmIG1ldGhvZCBpbnB1dCBwYXJhbWV0ZXJzIGFyZSBpbnZhbGlkLCB0aGlzIGNsYXNzIHJldHVybnMgYWN0dWFsIHBhcmFtZXRlciBuYW1lcworICogICAgIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgb25lcyAoe0Bjb2RlIGFyZzAsIGFyZzEsIC4ufSkmbHQ7L2xpJmd0OworICogJmx0Oy91bCZndDsKKyAqLworcHVibGljIGNsYXNzIFZhbGlkYXRpb25Db25maWd1cmF0aW9uQ29udGV4dFJlc29sdmVyIGltcGxlbWVudHMgQ29udGV4dFJlc29sdmVyJmx0O1ZhbGlkYXRpb25Db25maWcmZ3Q7IHsKKworICAgIEBDb250ZXh0CisgICAgcHJpdmF0ZSBSZXNvdXJjZUNvbnRleHQgcmVzb3VyY2VDb250ZXh0OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFZhbGlkYXRpb25Db25maWcgZ2V0Q29udGV4dChmaW5hbCBDbGFzcyZsdDs/Jmd0OyB0eXBlKSB7CisgICAgICAgIGZpbmFsIFZhbGlkYXRpb25Db25maWcgY29uZmlnID0gbmV3IFZhbGlkYXRpb25Db25maWcoKTsKKyAgICAgICAgY29uZmlnLnNldENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KHJlc291cmNlQ29udGV4dC5nZXRSZXNvdXJjZShJbmplY3RpbmdDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeS5jbGFzcykpOworICAgICAgICBjb25maWcuc2V0UGFyYW1ldGVyTmFtZVByb3ZpZGVyKG5ldyBDdXN0b21QYXJhbWV0ZXJOYW1lUHJvdmlkZXIoKSk7CisgICAgICAgIHJldHVybiBjb25maWc7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VlIENvbnRhY3RDYXJkVGVzdCN0ZXN0QWRkSW52YWxpZENvbnRhY3QuCisgICAgICovCisgICAgcHJpdmF0ZSBjbGFzcyBDdXN0b21QYXJhbWV0ZXJOYW1lUHJvdmlkZXIgaW1wbGVtZW50cyBQYXJhbWV0ZXJOYW1lUHJvdmlkZXIgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgUGFyYW1ldGVyTmFtZVByb3ZpZGVyIG5hbWVQcm92aWRlcjsKKworICAgICAgICBwdWJsaWMgQ3VzdG9tUGFyYW1ldGVyTmFtZVByb3ZpZGVyKCkgeworICAgICAgICAgICAgbmFtZVByb3ZpZGVyID0gVmFsaWRhdGlvbi5ieURlZmF1bHRQcm92aWRlcigpLmNvbmZpZ3VyZSgpLmdldERlZmF1bHRQYXJhbWV0ZXJOYW1lUHJvdmlkZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTGlzdCZsdDtTdHJpbmcmZ3Q7IGdldFBhcmFtZXRlck5hbWVzKGZpbmFsIENvbnN0cnVjdG9yJmx0Oz8mZ3Q7IGNvbnN0cnVjdG9yKSB7CisgICAgICAgICAgICByZXR1cm4gbmFtZVByb3ZpZGVyLmdldFBhcmFtZXRlck5hbWVzKGNvbnN0cnVjdG9yKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTGlzdCZsdDtTdHJpbmcmZ3Q7IGdldFBhcmFtZXRlck5hbWVzKGZpbmFsIE1ldGhvZCBtZXRob2QpIHsKKyAgICAgICAgICAgIC8vIFNlZSBDb250YWN0Q2FyZFRlc3QjdGVzdEFkZEludmFsaWRDb250YWN0LgorICAgICAgICAgICAgaWYgKCJhZGRDb250YWN0Ii5lcXVhbHMobWV0aG9kLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdCgiY29udGFjdCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5hbWVQcm92aWRlci5nZXRQYXJhbWV0ZXJOYW1lcyhtZXRob2QpOworICAgICAgICB9CisgICAgfQorfTwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgICAgICAgICAgICAgICA8cGFyYT5SZWdpc3RlciB0aGlzIGNsYXNzIGluIHlvdXIgYXBwOjwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSI+ZmluYWwgQXBwbGljYXRpb24gYXBwbGljYXRpb24gPSBuZXcgUmVzb3VyY2VDb25maWcoKQorICAgICAgICAvLyBWYWxpZGF0aW9uLgorICAgICAgICAucmVnaXN0ZXIoVmFsaWRhdGlvbkNvbmZpZ3VyYXRpb25Db250ZXh0UmVzb2x2ZXIuY2xhc3MpCisgICAgICAgIC8vIEZ1cnRoZXIgY29uZmlndXJhdGlvbi4KKyAgICAgICAgLnJlZ2lzdGVyKCAuLi4gKTs8L3Byb2dyYW1saXN0aW5nPgorCisgICAgICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPlRoaXMgY29kZSBzbmlwcGV0IGhhcyBiZWVuIHRha2VuIGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuZ2l0aHViLmV4YW1wbGVzLnVyaTsvYmVhbi12YWxpZGF0aW9uLXdlYmFwcCc+QmVhbiBWYWxpZGF0aW9uIGV4YW1wbGU8L2xpbms+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9ub3RlPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8L3BhcmE+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24+CisgICAgICAgIDx0aXRsZT5WYWxpZGF0aW5nIEpBWC1SUyByZXNvdXJjZXMgYW5kIG1ldGhvZHM8L3RpdGxlPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgSkFYLVJTIHNwZWNpZmljYXRpb24gc3RhdGVzIHRoYXQgY29uc3RyYWludCBhbm5vdGF0aW9ucyBhcmUgYWxsb3dlZCBpbiB0aGUgc2FtZSBsb2NhdGlvbnMgYXMgdGhlIGZvbGxvd2luZworICAgICAgICAgICAgYW5ub3RhdGlvbnM6ICZsaXQuamF4cnMuTWF0cml4UGFyYW07LCAmbGl0LmpheHJzLlF1ZXJ5UGFyYW07LCAmbGl0LmpheHJzLlBhdGhQYXJhbTssICZsaXQuamF4cnMuQ29va2llUGFyYW07LAorICAgICAgICAgICAgJmxpdC5qYXhycy5IZWFkZXJQYXJhbTsgYW5kICZsaXQuamF4cnMuY29yZS5Db250ZXh0OywgPGVtcGhhc2lzPmV4Y2VwdDwvZW1waGFzaXM+IGluIGNsYXNzIGNvbnN0cnVjdG9ycyBhbmQgcHJvcGVydHkKKyAgICAgICAgICAgIHNldHRlcnMuIFNwZWNpZmljYWxseSwgdGhleSBhcmUgYWxsb3dlZCBpbiByZXNvdXJjZSBtZXRob2QgcGFyYW1ldGVycywgZmllbGRzIGFuZCBwcm9wZXJ0eSBnZXR0ZXJzIGFzIHdlbGwgYXMKKyAgICAgICAgICAgIHJlc291cmNlIGNsYXNzZXMsIGVudGl0eSBwYXJhbWV0ZXJzIGFuZCByZXNvdXJjZSBtZXRob2RzIChyZXR1cm4gdmFsdWVzKS4KKyAgICAgICAgICAgIEplcnNleSBwcm92aWRlcyBzdXBwb3J0IGZvciB2YWxpZGF0aW9uIChzZWUgZm9sbG93aW5nIHNlY3Rpb25zKSBhbm5vdGF0ZWQgaW5wdXQgcGFyYW1ldGVycyBhbmQgcmV0dXJuIHZhbHVlIG9mIHRoZQorICAgICAgICAgICAgaW52b2tlZCByZXNvdXJjZSBtZXRob2QgYXMgd2VsbCBhcyB2YWxpZGF0aW9uIG9mIHJlc291cmNlIGNsYXNzIChjbGFzcyBjb25zdHJhaW50cywgZmllbGQgY29uc3RyYWludHMpIHdoZXJlIHRoaXMKKyAgICAgICAgICAgIHJlc291cmNlIG1ldGhvZCBpcyBwbGFjZWQuCisgICAgICAgICAgICBKZXJzZXkgZG9lcyBub3Qgc3VwcG9ydCwgYW5kIGRvZXNuJ3QgdmFsaWRhdGUsIGNvbnN0cmFpbnRzIHBsYWNlZCBvbiBjb25zdHJ1Y3RvcnMgYW5kIEJlYW4gVmFsaWRhdGlvbiBncm91cHMgKG9ubHkKKyAgICAgICAgICAgIDxsaXRlcmFsPkRlZmF1bHQ8L2xpdGVyYWw+IGdyb3VwIGlzIHN1cHBvcnRlZCBhdCB0aGUgbW9tZW50KS4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxzZWN0aW9uPgorICAgICAgICAgICAgPHRpdGxlPkNvbnN0cmFpbnQgQW5ub3RhdGlvbnM8L3RpdGxlPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgSkFYLVJTIFNlcnZlciBBUEkgcHJvdmlkZXMgc3VwcG9ydCBmb3IgZXh0cmFjdGluZyByZXF1ZXN0IHZhbHVlcyBhbmQgbWFwcGluZyB0aGVtIGludG8gSmF2YSBmaWVsZHMsCisgICAgICAgICAgICAgICAgcHJvcGVydGllcyBhbmQgcGFyYW1ldGVycyB1c2luZyBhbm5vdGF0aW9ucyBzdWNoIGFzICZqYXhycy5IZWFkZXJQYXJhbTssICZqYXhycy5RdWVyeVBhcmFtOywgZXRjLiBJdCBhbHNvCisgICAgICAgICAgICAgICAgc3VwcG9ydHMgbWFwcGluZyBvZiB0aGUgcmVxdWVzdCBlbnRpdHkgYm9kaWVzIGludG8gSmF2YSBvYmplY3RzIHZpYSBub24tYW5ub3RhdGVkIHBhcmFtZXRlcnMgKGkuZS4sIHBhcmFtZXRlcnMKKyAgICAgICAgICAgICAgICB3aXRob3V0IGFueSBKQVgtUlMgYW5ub3RhdGlvbnMpLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhlIEJlYW4gVmFsaWRhdGlvbiBzcGVjaWZpY2F0aW9uIHN1cHBvcnRzIHRoZSB1c2Ugb2YgPGVtcGhhc2lzPmNvbnN0cmFpbnQgYW5ub3RhdGlvbnM8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgIGFzIGEgd2F5IG9mIGRlY2xhcmF0aXZlbHkgdmFsaWRhdGluZyBiZWFucywgbWV0aG9kIHBhcmFtZXRlcnMgYW5kIG1ldGhvZCByZXR1cm5lZCB2YWx1ZXMuIEZvciBleGFtcGxlLCBjb25zaWRlcgorICAgICAgICAgICAgICAgIHJlc291cmNlIGNsYXNzIGZyb20gPHhyZWYgbGlua2VuZD0iYnYuZXhhbXBsZS5jb25zdHJhaW50cyIvPiBhdWdtZW50ZWQgd2l0aCBjb25zdHJhaW50IGFubm90YXRpb25zLgorCisgICAgICAgICAgICAgICAgPGV4YW1wbGUgeG1sOmlkPSJidi5leGFtcGxlLmNvbnN0cmFpbnRzIj4KKyAgICAgICAgICAgICAgICAgICAgPHRpdGxlPkNvbnN0cmFpbnQgYW5ub3RhdGlvbnMgb24gaW5wdXQgcGFyYW1ldGVyczwvdGl0bGU+CisgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSI+QFBhdGgoIi8iKQorY2xhc3MgTXlSZXNvdXJjZUNsYXNzIHsKKworICAgIEBQT1NUCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKQorICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyVXNlcigKKyAgICAgICAgICAgIEBOb3ROdWxsIEBGb3JtUGFyYW0oImZpcnN0TmFtZSIpIFN0cmluZyBmaXJzdE5hbWUsCisgICAgICAgICAgICBATm90TnVsbCBARm9ybVBhcmFtKCJsYXN0TmFtZSIpIFN0cmluZyBsYXN0TmFtZSwKKyAgICAgICAgICAgIEBFbWFpbCBARm9ybVBhcmFtKCJlbWFpbCIpIFN0cmluZyBlbWFpbCkgeworICAgICAgICAuLi4KKyAgICB9Cit9PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisKKyAgICAgICAgICAgICAgICBUaGUgYW5ub3RhdGlvbnMgJmxpdC5idi5Ob3ROdWxsOyBhbmQgJmxpdC5idi5FbWFpbDsgaW1wb3NlIGFkZGl0aW9uYWwgY29uc3RyYWludHMgb24gdGhlIGZvcm0gcGFyYW1ldGVycworICAgICAgICAgICAgICAgIDxsaXRlcmFsPmZpcnN0TmFtZTwvbGl0ZXJhbD4sIDxsaXRlcmFsPmxhc3ROYW1lPC9saXRlcmFsPiBhbmQgPGxpdGVyYWw+ZW1haWw8L2xpdGVyYWw+LiBUaGUgJmxpdC5idi5Ob3ROdWxsOworICAgICAgICAgICAgICAgIGNvbnN0cmFpbnQgaXMgYnVpbHQtaW4gdG8gdGhlIEJlYW4gVmFsaWRhdGlvbiBBUEk7IHRoZSAmbGl0LmJ2LkVtYWlsOworICAgICAgICAgICAgICAgIGNvbnN0cmFpbnQgaXMgYXNzdW1lZCB0byBiZSB1c2VyIGRlZmluZWQgaW4gdGhlIGV4YW1wbGUgYWJvdmUuIFRoZXNlIGNvbnN0cmFpbnQgYW5ub3RhdGlvbnMgYXJlIG5vdCByZXN0cmljdGVkIHRvCisgICAgICAgICAgICAgICAgbWV0aG9kIHBhcmFtZXRlcnMsIHRoZXkgY2FuIGJlIHVzZWQgaW4gYW55IGxvY2F0aW9uIGluIHdoaWNoIEpBWC1SUyBiaW5kaW5nIGFubm90YXRpb25zIGFyZSBhbGxvd2VkIHdpdGggdGhlCisgICAgICAgICAgICAgICAgZXhjZXB0aW9uIG9mIGNvbnN0cnVjdG9ycyBhbmQgcHJvcGVydHkgc2V0dGVycy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFJhdGhlciB0aGFuIHVzaW5nIG1ldGhvZCBwYXJhbWV0ZXJzLCB0aGUgPGxpdGVyYWw+TXlSZXNvdXJjZUNsYXNzPC9saXRlcmFsPiBzaG93biBhYm92ZSBjb3VsZCBoYXZlIGJlZW4gd3JpdHRlbgorICAgICAgICAgICAgICAgIGFzIGluIDx4cmVmIGxpbmtlbmQ9ImJ2LmV4YW1wbGUuY29uc3RyYWludHMuZmllbGRzIi8+LgorCisgICAgICAgICAgICAgICAgPGV4YW1wbGUgeG1sOmlkPSJidi5leGFtcGxlLmNvbnN0cmFpbnRzLmZpZWxkcyI+CisgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5Db25zdHJhaW50IGFubm90YXRpb25zIG9uIGZpZWxkczwvdGl0bGU+CisgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSI+QFBhdGgoIi8iKQorY2xhc3MgTXlSZXNvdXJjZUNsYXNzIHsKKworICAgIEBOb3ROdWxsCisgICAgQEZvcm1QYXJhbSgiZmlyc3ROYW1lIikKKyAgICBwcml2YXRlIFN0cmluZyBmaXJzdE5hbWU7CisKKyAgICBATm90TnVsbAorICAgIEBGb3JtUGFyYW0oImxhc3ROYW1lIikKKyAgICBwcml2YXRlIFN0cmluZyBsYXN0TmFtZTsKKworICAgIHByaXZhdGUgU3RyaW5nIGVtYWlsOworCisgICAgQEZvcm1QYXJhbSgiZW1haWwiKQorICAgIHB1YmxpYyB2b2lkIHNldEVtYWlsKFN0cmluZyBlbWFpbCkgeworICAgICAgICB0aGlzLmVtYWlsID0gZW1haWw7CisgICAgfQorCisgICAgQEVtYWlsCisgICAgcHVibGljIFN0cmluZyBnZXRFbWFpbCgpIHsKKyAgICAgICAgcmV0dXJuIGVtYWlsOworICAgIH0KKworICAgIC4uLgorfTwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorCisgICAgICAgICAgICAgICAgTm90ZSB0aGF0IGluIHRoaXMgdmVyc2lvbiwgPGxpdGVyYWw+Zmlyc3ROYW1lPC9saXRlcmFsPiBhbmQgPGxpdGVyYWw+bGFzdE5hbWU8L2xpdGVyYWw+IGFyZSBmaWVsZHMgaW5pdGlhbGl6ZWQKKyAgICAgICAgICAgICAgICB2aWEgaW5qZWN0aW9uIGFuZCA8bGl0ZXJhbD5lbWFpbDwvbGl0ZXJhbD4gaXMgYSByZXNvdXJjZSBjbGFzcyBwcm9wZXJ0eS4gQ29uc3RyYWludCBhbm5vdGF0aW9ucyBvbiBwcm9wZXJ0aWVzIGFyZQorICAgICAgICAgICAgICAgIHNwZWNpZmllZCBpbiB0aGVpciBjb3JyZXNwb25kaW5nIGdldHRlcnMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBDb25zdHJhaW50IGFubm90YXRpb25zIGFyZSBhbHNvIGFsbG93ZWQgb24gcmVzb3VyY2UgY2xhc3Nlcy4gSW4gYWRkaXRpb24gdG8gYW5ub3RhdGluZyBmaWVsZHMgYW5kIHByb3BlcnRpZXMsIGFuCisgICAgICAgICAgICAgICAgYW5ub3RhdGlvbiBjYW4gYmUgZGVmaW5lZCBmb3IgdGhlIGVudGlyZSBjbGFzcy4gTGV0IHVzIGFzc3VtZSB0aGF0IDxsaXRlcmFsPkBOb25FbXB0eU5hbWVzPC9saXRlcmFsPiB2YWxpZGF0ZXMKKyAgICAgICAgICAgICAgICB0aGF0IG9uZSBvZiB0aGUgdHdvIDxlbXBoYXNpcz5uYW1lPC9lbXBoYXNpcz4gZmllbGRzIGluIDxsaXRlcmFsPk15UmVzb3VyY2VDbGFzczwvbGl0ZXJhbD4gaXMgcHJvdmlkZWQuIFVzaW5nCisgICAgICAgICAgICAgICAgc3VjaCBhbiBhbm5vdGF0aW9uLCB0aGUgZXhhbXBsZSBhYm92ZSBjYW4gYmUgZXh0ZW5kZWQgdG8gbG9vayBsaWtlIDx4cmVmIGxpbmtlbmQ9ImJ2LmV4YW1wbGUuY29uc3RyYWludHMuY2xhc3MiLz4KKworICAgICAgICAgICAgICAgIDxleGFtcGxlIHhtbDppZD0iYnYuZXhhbXBsZS5jb25zdHJhaW50cy5jbGFzcyI+CisgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5Db25zdHJhaW50IGFubm90YXRpb25zIG9uIGNsYXNzPC90aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIj5AUGF0aCgiLyIpCitATm9uRW1wdHlOYW1lcworY2xhc3MgTXlSZXNvdXJjZUNsYXNzIHsKKworICAgIEBOb3ROdWxsCisgICAgQEZvcm1QYXJhbSgiZmlyc3ROYW1lIikKKyAgICBwcml2YXRlIFN0cmluZyBmaXJzdE5hbWU7CisKKyAgICBATm90TnVsbAorICAgIEBGb3JtUGFyYW0oImxhc3ROYW1lIikKKyAgICBwcml2YXRlIFN0cmluZyBsYXN0TmFtZTsKKworICAgIHByaXZhdGUgU3RyaW5nIGVtYWlsOworCisgICAgLi4uCit9PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisKKyAgICAgICAgICAgICAgICBDb25zdHJhaW50IGFubm90YXRpb25zIG9uIHJlc291cmNlIGNsYXNzZXMgYXJlIHVzZWZ1bCBmb3IgZGVmaW5pbmcgY3Jvc3MtZmllbGQgYW5kIGNyb3NzLXByb3BlcnR5IGNvbnN0cmFpbnRzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICA8dGl0bGU+QW5ub3RhdGlvbiBjb25zdHJhaW50cyBhbmQgVmFsaWRhdG9yczwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEFubm90YXRpb24gY29uc3RyYWludHMgYW5kIHZhbGlkYXRvcnMgYXJlIGRlZmluZWQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBCZWFuIFZhbGlkYXRpb24gc3BlY2lmaWNhdGlvbi4KKyAgICAgICAgICAgICAgICBUaGUgJmxpdC5idi5FbWFpbDsgYW5ub3RhdGlvbiB1c2VkIGluIDx4cmVmIGxpbmtlbmQ9ImJ2LmV4YW1wbGUuY29uc3RyYWludHMuZmllbGRzIi8+IGlzIGRlZmluZWQgdXNpbmcgdGhlCisgICAgICAgICAgICAgICAgQmVhbiBWYWxpZGF0aW9uICZidi5Db25zdHJhaW50OyBtZXRhLWFubm90YXRpb24sIHNlZSA8eHJlZiBsaW5rZW5kPSJidi5leGFtcGxlLmNvbnN0cmFpbnRzLmRlZmluaXRpb24iLz4uCisKKyAgICAgICAgICAgICAgICA8ZXhhbXBsZSB4bWw6aWQ9ImJ2LmV4YW1wbGUuY29uc3RyYWludHMuZGVmaW5pdGlvbiI+CisgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5EZWZpbml0aW9uIG9mIGEgY29uc3RyYWludCBhbm5vdGF0aW9uPC90aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIj5AVGFyZ2V0KHsgTUVUSE9ELCBGSUVMRCwgUEFSQU1FVEVSIH0pCitAUmV0ZW50aW9uKFJVTlRJTUUpCitAQ29uc3RyYWludCh2YWxpZGF0ZWRCeSA9IEVtYWlsVmFsaWRhdG9yLmNsYXNzKQorcHVibGljIEBpbnRlcmZhY2UgRW1haWwgeworCisgICAgU3RyaW5nIG1lc3NhZ2UoKSBkZWZhdWx0ICJ7Y29tLmV4YW1wbGUudmFsaWRhdGlvbi5jb25zdHJhaW50cy5lbWFpbH0iOworCisgICAgQ2xhc3MmbHQ7PyZndDtbXSBncm91cHMoKSBkZWZhdWx0IHt9OworCisgICAgQ2xhc3MmbHQ7PyBleHRlbmRzIFBheWxvYWQmZ3Q7W10gcGF5bG9hZCgpIGRlZmF1bHQge307Cit9PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisKKyAgICAgICAgICAgICAgICBUaGUgJmxpdC5idi5Db25zdHJhaW50OyBhbm5vdGF0aW9uIG11c3QgaW5jbHVkZSBhIHJlZmVyZW5jZSB0byB0aGUgdmFsaWRhdG9yIGNsYXNzIHRoYXQgd2lsbCBiZSB1c2VkIHRvIHZhbGlkYXRlCisgICAgICAgICAgICAgICAgZGVjb3JhdGVkIHZhbHVlcy4gVGhlIDxsaXRlcmFsPkVtYWlsVmFsaWRhdG9yPC9saXRlcmFsPiBjbGFzcyBtdXN0IGltcGxlbWVudAorICAgICAgICAgICAgICAgIDxsaXRlcmFsPkNvbnN0cmFpbnRWYWxpZGF0b3ImbHQ7RW1haWwsIFQmZ3Q7PC9saXRlcmFsPiB3aGVyZSA8bGl0ZXJhbD5UPC9saXRlcmFsPiBpcyB0aGUgdHlwZSBvZiB2YWx1ZXMgYmVpbmcKKyAgICAgICAgICAgICAgICB2YWxpZGF0ZWQsIGFzIGRlc2NyaWJlZCBpbiA8eHJlZiBsaW5rZW5kPSJidi5leGFtcGxlLnZhbGlkYXRvci5kZWZpbml0aW9uIiAvPi4KKworICAgICAgICAgICAgICAgIDxleGFtcGxlIHhtbDppZD0iYnYuZXhhbXBsZS52YWxpZGF0b3IuZGVmaW5pdGlvbiI+CisgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5WYWxpZGF0b3IgaW1wbGVtZW50YXRpb24uPC90aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIj5wdWJsaWMgY2xhc3MgRW1haWxWYWxpZGF0b3IgaW1wbGVtZW50cyBDb25zdHJhaW50VmFsaWRhdG9yJmx0O0VtYWlsLCBTdHJpbmcmZ3Q7IHsKKworICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoRW1haWwgZW1haWwpIHsKKyAgICAgICAgLi4uCisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZChTdHJpbmcgdmFsdWUsIENvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgLi4uCisgICAgfQorfTwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorCisgICAgICAgICAgICAgICAgVGh1cywgPGxpdGVyYWw+RW1haWxWYWxpZGF0b3I8L2xpdGVyYWw+IGFwcGxpZXMgdG8gdmFsdWVzIGFubm90YXRlZCB3aXRoICZsaXQuYnYuRW1haWw7IHRoYXQgYXJlIG9mIHR5cGUKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbD5TdHJpbmc8L2xpdGVyYWw+LiBWYWxpZGF0b3JzIGZvciBvdGhlciBKYXZhIHR5cGVzIGNhbiBiZSBkZWZpbmVkIGZvciB0aGUgc2FtZSBjb25zdHJhaW50IGFubm90YXRpb24uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICA8c2VjdGlvbj4KKyAgICAgICAgICAgIDx0aXRsZT5FbnRpdHkgVmFsaWRhdGlvbjwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFJlcXVlc3QgZW50aXR5IGJvZGllcyBjYW4gYmUgbWFwcGVkIHRvIHJlc291cmNlIG1ldGhvZCBwYXJhbWV0ZXJzLiBUaGVyZSBhcmUgdHdvIHdheXMgaW4gd2hpY2ggdGhlc2UgZW50aXRpZXMgY2FuCisgICAgICAgICAgICAgICAgYmUgdmFsaWRhdGVkLiBJZiB0aGUgcmVxdWVzdCBlbnRpdHkgaXMgbWFwcGVkIHRvIGEgSmF2YSBiZWFuIHdob3NlIGNsYXNzIGlzIGRlY29yYXRlZCB3aXRoIEJlYW4gVmFsaWRhdGlvbgorICAgICAgICAgICAgICAgIGFubm90YXRpb25zLCB0aGVuIHZhbGlkYXRpb24gY2FuIGJlIGVuYWJsZWQgdXNpbmcgJmJ2LlZhbGlkOyBhcyBpbiA8eHJlZiBsaW5rZW5kPSJidi5leGFtcGxlLmNvbnN0cmFpbnRzLmVudGl0eSIvPi4KKworICAgICAgICAgICAgICAgIDxleGFtcGxlIHhtbDppZD0iYnYuZXhhbXBsZS5jb25zdHJhaW50cy5lbnRpdHkiPgorICAgICAgICAgICAgICAgICAgICA8dGl0bGU+RW50aXR5IHZhbGlkYXRpb248L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiPkBTdGFuZGFyZFVzZXIKK2NsYXNzIFVzZXIgeworCisgICAgQE5vdE51bGwKKyAgICBwcml2YXRlIFN0cmluZyBmaXJzdE5hbWU7CisKKyAgICAuLi4KK30KKworCitAUGF0aCgiLyIpCitjbGFzcyBNeVJlc291cmNlQ2xhc3MgeworCisgICAgQFBPU1QKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL3htbCIpCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJVc2VyKEBWYWxpZCBVc2VyIHVzZXIpIHsKKyAgICAgICAgLi4uCisgICAgfQorfTwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorCisgICAgICAgICAgICAgICAgSW4gdGhpcyBjYXNlLCB0aGUgdmFsaWRhdG9yIGFzc29jaWF0ZWQgd2l0aCA8bGl0ZXJhbD5AU3RhbmRhcmRVc2VyPC9saXRlcmFsPiAoYXMgd2VsbCBhcyB0aG9zZSBmb3Igbm9uLWNsYXNzCisgICAgICAgICAgICAgICAgbGV2ZWwgY29uc3RyYWludHMgbGlrZSAmbGl0LmJ2Lk5vdE51bGw7KSB3aWxsIGJlIGNhbGxlZCB0byB2ZXJpZnkgdGhlIHJlcXVlc3QgZW50aXR5IG1hcHBlZCB0bworICAgICAgICAgICAgICAgIDxsaXRlcmFsPnVzZXI8L2xpdGVyYWw+LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgQWx0ZXJuYXRpdmVseSwgYSBuZXcgYW5ub3RhdGlvbiBjYW4gYmUgZGVmaW5lZCBhbmQgdXNlZCBkaXJlY3RseSBvbiB0aGUgcmVzb3VyY2UKKyAgICAgICAgICAgICAgICBtZXRob2QgcGFyYW1ldGVyICg8eHJlZiBsaW5rZW5kPSJidi5leGFtcGxlLmNvbnN0cmFpbnRzLmVudGl0eTIiLz4pLgorCisgICAgICAgICAgICAgICAgPGV4YW1wbGUgeG1sOmlkPSJidi5leGFtcGxlLmNvbnN0cmFpbnRzLmVudGl0eTIiPgorICAgICAgICAgICAgICAgICAgICA8dGl0bGU+RW50aXR5IHZhbGlkYXRpb24gMjwvdGl0bGU+CisgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSI+QFBhdGgoIi8iKQorY2xhc3MgTXlSZXNvdXJjZUNsYXNzIHsKKworICAgIEBQT1NUCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi94bWwiKQorICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyVXNlcihAUHJlbWl1bVVzZXIgVXNlciB1c2VyKSB7CisgICAgICAgIC4uLgorICAgIH0KK308L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKworICAgICAgICAgICAgICAgIEluIHRoZSBleGFtcGxlIGFib3ZlLCA8bGl0ZXJhbD5AUHJlbWl1bVVzZXI8L2xpdGVyYWw+IHJhdGhlciB0aGFuIDxsaXRlcmFsPkBTdGFuZGFyZFVzZXI8L2xpdGVyYWw+IHdpbGwgYmUgdXNlZAorICAgICAgICAgICAgICAgIHRvIHZhbGlkYXRlIHRoZSByZXF1ZXN0IGVudGl0eS4gVGhlc2UgdHdvIHdheXMgaW4gd2hpY2ggdmFsaWRhdGlvbiBvZiBlbnRpdGllcyBjYW4gYmUgdHJpZ2dlcmVkIGNhbiBhbHNvIGJlCisgICAgICAgICAgICAgICAgY29tYmluZWQgYnkgaW5jbHVkaW5nICZsaXQuYnYuVmFsaWQ7IGluIHRoZSBsaXN0IG9mIGNvbnN0cmFpbnRzLiBUaGUgcHJlc2VuY2Ugb2YgJmxpdC5idi5WYWxpZDsgd2lsbCB0cmlnZ2VyCisgICAgICAgICAgICAgICAgdmFsaWRhdGlvbiBvZiA8ZW1waGFzaXM+YWxsPC9lbXBoYXNpcz4gdGhlIGNvbnN0cmFpbnQgYW5ub3RhdGlvbnMgZGVjb3JhdGluZyBhIEphdmEgYmVhbiBjbGFzcy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFJlc3BvbnNlIGVudGl0eSBib2RpZXMgcmV0dXJuZWQgZnJvbSByZXNvdXJjZSBtZXRob2RzIGNhbiBiZSB2YWxpZGF0ZWQgaW4gYSBzaW1pbGFyIG1hbm5lciBieSBhbm5vdGF0aW5nIHRoZQorICAgICAgICAgICAgICAgIHJlc291cmNlIG1ldGhvZCBpdHNlbGYuIFRvIGV4ZW1wbGlmeSwgYXNzdW1pbmcgYm90aCA8bGl0ZXJhbD5AU3RhbmRhcmRVc2VyPC9saXRlcmFsPiBhbmQKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbD5AUHJlbWl1bVVzZXI8L2xpdGVyYWw+IGFyZSByZXF1aXJlZCB0byBiZSBjaGVja2VkIGJlZm9yZSByZXR1cm5pbmcgYSB1c2VyLCB0aGUKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbD5nZXRVc2VyPC9saXRlcmFsPiBtZXRob2QgY2FuIGJlIGFubm90YXRlZCBhcyBzaG93biBpbgorICAgICAgICAgICAgICAgIDx4cmVmIGxpbmtlbmQ9ImJ2LmV4YW1wbGUuY29uc3RyYWludHMuZW50aXR5LnJlc3BvbnNlIi8+LgorICAgICAgICAgICAgICAgIDxleGFtcGxlIHhtbDppZD0iYnYuZXhhbXBsZS5jb25zdHJhaW50cy5lbnRpdHkucmVzcG9uc2UiPgorICAgICAgICAgICAgICAgICAgICA8dGl0bGU+UmVzcG9uc2UgZW50aXR5IHZhbGlkYXRpb248L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiPkBQYXRoKCIvIikKK2NsYXNzIE15UmVzb3VyY2VDbGFzcyB7CisKKyAgICBAR0VUCisgICAgQFBhdGgoIntpZH0iKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24veG1sIikKKyAgICBAVmFsaWQgQFByZW1pdW1Vc2VyCisgICAgcHVibGljIFVzZXIgZ2V0VXNlcihAUGF0aFBhcmFtKCJpZCIpIFN0cmluZyBpZCkgeworICAgICAgICBVc2VyIHUgPSBmaW5kVXNlcihpZCk7CisgICAgICAgIHJldHVybiB1OworICAgIH0KKworICAgIC4uLgorfTwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorCisgICAgICAgICAgICAgICAgTm90ZSB0aGF0IDxsaXRlcmFsPkBQcmVtaXVtVXNlcjwvbGl0ZXJhbD4gaXMgZXhwbGljaXRseSBsaXN0ZWQgYW5kIDxsaXRlcmFsPkBTdGFuZGFyZFVzZXI8L2xpdGVyYWw+IGlzIHRyaWdnZXJlZAorICAgICAgICAgICAgICAgIGJ5IHRoZSBwcmVzZW5jZSBvZiB0aGUgJmxpdC5idi5WYWxpZDsgYW5ub3RhdGlvbiAtIHNlZSBkZWZpbml0aW9uIG9mIDxsaXRlcmFsPlVzZXI8L2xpdGVyYWw+IGNsYXNzIGVhcmxpZXIgaW4KKyAgICAgICAgICAgICAgICB0aGlzIHNlY3Rpb24uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICA8c2VjdGlvbj4KKyAgICAgICAgICAgIDx0aXRsZT5Bbm5vdGF0aW9uIEluaGVyaXRhbmNlPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhlIHJ1bGVzIGZvciBpbmhlcml0YW5jZSBvZiBjb25zdHJhaW50IGFubm90YXRpb24gYXJlIGRlZmluZWQgaW4gQmVhbiBWYWxpZGF0aW9uIHNwZWNpZmljYXRpb24uIEl0IGlzIHdvcnRoCisgICAgICAgICAgICAgICAgbm90aW5nIHRoYXQgdGhlc2UgcnVsZXMgYXJlIGluY29tcGF0aWJsZSB3aXRoIHRob3NlIGRlZmluZWQgYnkgSkFYLVJTLiBHZW5lcmFsbHkgc3BlYWtpbmcsIGNvbnN0cmFpbnQKKyAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucyBpbiBCZWFuIFZhbGlkYXRpb24gYXJlIGN1bXVsYXRpdmUgKGNhbiBiZSBzdHJlbmd0aGVuKSBhY3Jvc3MgYSBnaXZlbiB0eXBlIGhpZXJhcmNoeSB3aGlsZSBKQVgtUlMKKyAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucyBhcmUgaW5oZXJpdGVkIG9yLCBvdmVycmlkZGVuIGFuZCBpZ25vcmVkLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgRm9yIEJlYW4gVmFsaWRhdGlvbiBhbm5vdGF0aW9ucyBKZXJzZXkgZm9sbG93cyB0aGUgY29uc3RyYWludCBhbm5vdGF0aW9uIHJ1bGVzIGRlZmluZWQgaW4gdGhlIEJlYW4gVmFsaWRhdGlvbgorICAgICAgICAgICAgICAgIHNwZWNpZmljYXRpb24uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiB4bWw6aWQ9ImJ2LlZhbGlkYXRlT25FeGVjdXRpb24iPgorICAgICAgICA8dGl0bGU+QFZhbGlkYXRlT25FeGVjdXRpb248L3RpdGxlPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQWNjb3JkaW5nIHRvIEJlYW4gVmFsaWRhdGlvbiBzcGVjaWZpY2F0aW9uLCB2YWxpZGF0aW9uIGlzIGVuYWJsZWQgYnkgZGVmYXVsdCBvbmx5IGZvciB0aGUgc28gY2FsbGVkCisgICAgICAgICAgICA8ZW1waGFzaXM+Y29uc3RyYWluZWQ8L2VtcGhhc2lzPiBtZXRob2RzLiBHZXR0ZXIKKyAgICAgICAgICAgIG1ldGhvZHMgYXMgZGVmaW5lZCBieSB0aGUgSmF2YSBCZWFucyBzcGVjaWZpY2F0aW9uIGFyZSBub3QgY29uc3RyYWluZWQgbWV0aG9kcywgc28gdGhleSB3aWxsIG5vdCBiZSB2YWxpZGF0ZWQgYnkKKyAgICAgICAgICAgIGRlZmF1bHQuIFRoZSBzcGVjaWFsIGFubm90YXRpb24gJmxpdC5idi5WYWxpZGF0ZU9uRXhlY3V0aW9uOyBjYW4gYmUgdXNlZCB0byBzZWxlY3RpdmVseSBlbmFibGUKKyAgICAgICAgICAgIGFuZCBkaXNhYmxlIHZhbGlkYXRpb24uIEZvciBleGFtcGxlLCB5b3UgY2FuIGVuYWJsZSB2YWxpZGF0aW9uIG9uIG1ldGhvZCA8bGl0ZXJhbD5nZXRFbWFpbDwvbGl0ZXJhbD4gc2hvd24gaW4KKyAgICAgICAgICAgIDx4cmVmIGxpbmtlbmQ9ImJ2LmV4YW1wbGUudmFsaWRhdGVvbmV4ZWN1dGlvbiIvPi4KKyAgICAgICAgICAgIDxleGFtcGxlIHhtbDppZD0iYnYuZXhhbXBsZS52YWxpZGF0ZW9uZXhlY3V0aW9uIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+VmFsaWRhdGUgZ2V0dGVyIG9uIGV4ZWN1dGlvbjwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiPkBQYXRoKCIvIikKK2NsYXNzIE15UmVzb3VyY2VDbGFzcyB7CisKKyAgICBARW1haWwKKyAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbgorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW1haWwoKSB7CisgICAgICAgIHJldHVybiBlbWFpbDsKKyAgICB9CisKKyAgICAuLi4KK308L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorCisgICAgICAgICAgICBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIDxsaXRlcmFsPnR5cGU8L2xpdGVyYWw+IGF0dHJpYnV0ZSBvZiAmbGl0LmJ2LlZhbGlkYXRlT25FeGVjdXRpb247IGlzCisgICAgICAgICAgICA8bGl0ZXJhbD5JTVBMSUNJVDwvbGl0ZXJhbD4gd2hpY2ggcmVzdWx0cyBpbiBtZXRob2QgPGxpdGVyYWw+Z2V0RW1haWw8L2xpdGVyYWw+IGJlaW5nIHZhbGlkYXRlZC4KKyAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBBY2NvcmRpbmcgdG8gQmVhbiBWYWxpZGF0aW9uIHNwZWNpZmljYXRpb24gJmxpdC5idi5WYWxpZGF0ZU9uRXhlY3V0aW9uOyBjYW5ub3QgYmUgb3ZlcnJpZGRlbiBvbmNlIGlzCisgICAgICAgICAgICAgICAgICAgIGRlY2xhcmVkIG9uIGEgbWV0aG9kIChpLmUuIGluIHN1YmNsYXNzL3N1Yi1pbnRlcmZhY2UpIGFuZCBpbiB0aGlzIHNpdHVhdGlvbnMgYQorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5WYWxpZGF0aW9uRXhjZXB0aW9uPC9saXRlcmFsPiBzaG91bGQgYmUgcmFpc2VkLiBUaGlzIGRlZmF1bHQgYmVoYXZpb3VyIGNhbiBiZSBzdXBwcmVzc2VkIGJ5CisgICAgICAgICAgICAgICAgICAgIHNldHRpbmcgJmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcy5CVl9ESVNBQkxFX1ZBTElEQVRFX09OX0VYRUNVVEFCTEVfT1ZFUlJJREVfQ0hFQ0s7CisgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5IChKZXJzZXkgc3BlY2lmaWMpIHRvICZsaXQudHJ1ZTsuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9ub3RlPgorICAgICAgICA8L3BhcmE+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24geG1sOmlkPSJidi5pbmplY3RpbmciPgorICAgICAgICA8dGl0bGU+SW5qZWN0aW5nPC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEplcnNleSBhbGxvd3MgeW91IHRvIGluamVjdCByZWdpc3RlcmVkIHJlc291cmNlcy9wcm92aWRlcnMgaW50byB5b3VyICZidi5Db25zdHJhaW50VmFsaWRhdG9yOyBpbXBsZW1lbnRhdGlvbiBhbmQgeW91CisgICAgICAgICAgICBjYW4gaW5qZWN0ICZidi5Db25maWd1cmF0aW9uOywgJmJ2LlZhbGlkYXRvckZhY3Rvcnk7IGFuZCAmYnYuVmFsaWRhdG9yOyBhcyByZXF1aXJlZCBieSBCZWFuIFZhbGlkYXRpb24gc3BlYy4KKworICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEluamVjdGVkICZidi5Db25maWd1cmF0aW9uOywgJmJ2LlZhbGlkYXRvckZhY3Rvcnk7IGFuZCAmYnYuVmFsaWRhdG9yOyBkbyBub3QgaW5oZXJpdCBjb25maWd1cmF0aW9uIHByb3ZpZGVkCisgICAgICAgICAgICAgICAgICAgIGJ5ICZqZXJzZXkuZXh0LlZhbGlkYXRpb25Db25maWc7IGFuZCBuZWVkIHRvIGJlIGNvbmZpZ3VyZWQgbWFudWFsbHkuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9ub3RlPgorCisgICAgICAgICAgICBJbmplY3Rpb24gb2YgSkFYLVJTIGNvbXBvbmVudHMgaW50byAmbGl0LmJ2LkNvbnN0cmFpbnRWYWxpZGF0b3I7cyBpcyBzdXBwb3J0ZWQgdmlhIGEgY3VzdG9tCisgICAgICAgICAgICAmbGl0LmJ2LkNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5OyBwcm92aWRlZCBieSBKZXJzZXkuIEFuIGV4YW1wbGUgaXMgc2hvd24gaW4KKyAgICAgICAgICAgIDx4cmVmIGxpbmtlbmQ9ImJ2LmV4YW1wbGVzLmluamVjdGluZyIvPi4KKworICAgICAgICAgICAgPGV4YW1wbGUgeG1sOmlkPSJidi5leGFtcGxlcy5pbmplY3RpbmciPgorICAgICAgICAgICAgICAgIDx0aXRsZT5JbmplY3RpbmcgVXJpSW5mbyBpbnRvIGEgQ29uc3RyYWludFZhbGlkYXRvcjwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIj5wdWJsaWMgY2xhc3MgRW1haWxWYWxpZGF0b3IgaW1wbGVtZW50cyBDb25zdHJhaW50VmFsaWRhdG9yJmx0O0VtYWlsLCBTdHJpbmcmZ3Q7IHsKKworICAgIEBDb250ZXh0CisgICAgcHJpdmF0ZSBVcmlJbmZvIHVyaUluZm87CisKKyAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKEVtYWlsIGVtYWlsKSB7CisgICAgICAgIC4uLgorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoU3RyaW5nIHZhbHVlLCBDb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIC8vIFVzZSBVcmlJbmZvLgorCisgICAgICAgIC4uLgorICAgIH0KK308L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVXNpbmcgYSBjdXN0b20gJmJ2LkNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5OyBvZiB5b3VyIG93biBkaXNhYmxlcyByZWdpc3RyYXRpb24gb2YgdGhlIG9uZSBwcm92aWRlZCBieSBKZXJzZXkKKyAgICAgICAgICAgIGFuZCBpbmplY3Rpb24gc3VwcG9ydCBmb3IgcmVzb3VyY2VzL3Byb3ZpZGVycyAoaWYgbmVlZGVkKSBoYXMgdG8gYmUgcHJvdmlkZWQgYnkgdGhpcyBuZXcgaW1wbGVtZW50YXRpb24uCisgICAgICAgICAgICA8eHJlZiBsaW5rZW5kPSJidi5leGFtcGxlcy5pbmplY3RpbmcuZmFjdG9yeSIvPiBzaG93cyBob3cgdGhpcyBjYW4gYmUgYWNoaWV2ZWQuCisKKyAgICAgICAgICAgIDxleGFtcGxlIHhtbDppZD0iYnYuZXhhbXBsZXMuaW5qZWN0aW5nLmZhY3RvcnkiPgorICAgICAgICAgICAgICAgIDx0aXRsZT5TdXBwb3J0IGZvciBpbmplY3RpbmcgSmVyc2V5J3MgcmVzb3VyY2VzL3Byb3ZpZGVycyB2aWEgQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkuPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiPnB1YmxpYyBjbGFzcyBJbmplY3RpbmdDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSBpbXBsZW1lbnRzIENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5IHsKKworICAgIEBDb250ZXh0CisgICAgcHJpdmF0ZSBSZXNvdXJjZUNvbnRleHQgcmVzb3VyY2VDb250ZXh0OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljICZsdDtUIGV4dGVuZHMgQ29uc3RyYWludFZhbGlkYXRvciZsdDs/LCA/Jmd0OyZndDsgVCBnZXRJbnN0YW5jZShmaW5hbCBDbGFzcyZsdDtUJmd0OyBrZXkpIHsKKyAgICAgICAgcmV0dXJuIHJlc291cmNlQ29udGV4dC5nZXRSZXNvdXJjZShrZXkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlbGVhc2VJbnN0YW5jZShmaW5hbCBDb25zdHJhaW50VmFsaWRhdG9yJmx0Oz8sID8mZ3Q7IGluc3RhbmNlKSB7CisgICAgICAgIC8vIE5PT1AKKyAgICB9Cit9PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUaGlzIGJlaGF2aW91ciBtYXkgbGlrZWx5IGNoYW5nZSBpbiBvbmUgb2YgdGhlIG5leHQgdmVyc2lvbiBvZiBKZXJzZXkgdG8gcmVtb3ZlIHRoZSBuZWVkIG9mCisgICAgICAgICAgICAgICAgICAgIG1hbnVhbGx5IHByb3ZpZGluZyBzdXBwb3J0IGZvciBpbmplY3RpbmcgcmVzb3VyY2VzL3Byb3ZpZGVycyBmcm9tIEplcnNleSBpbiB5b3VyIG93bgorICAgICAgICAgICAgICAgICAgICAmbGl0LmJ2LkNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5OyBpbXBsZW1lbnRhdGlvbiBjb2RlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uPgorICAgICAgICA8dGl0bGU+RXJyb3IgUmVwb3J0aW5nPC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEJlYW4gVmFsaWRhdGlvbiBzcGVjaWZpY2F0aW9uIGRlZmluZXMgYSBzbWFsbCBoaWVyYXJjaHkgb2YgZXhjZXB0aW9ucyAodGhleSBhbGwgaW5oZXJpdCBmcm9tCisgICAgICAgICAgICAmYnYuVmFsaWRhdGlvbkV4Y2VwdGlvbjspIHRoYXQgY291bGQgYmUgdGhyb3duIGR1cmluZyBpbml0aWFsaXphdGlvbiBvZiB2YWxpZGF0aW9uIGVuZ2luZSBvciAoZm9yIG91ciBjYXNlIG1vcmUKKyAgICAgICAgICAgIGltcG9ydGFudGx5KSBkdXJpbmcgdmFsaWRhdGlvbiBvZiBpbnB1dC9vdXRwdXQgdmFsdWVzICgmYnYuQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbjspLgorICAgICAgICAgICAgSWYgYSB0aHJvd24gZXhjZXB0aW9uIGlzIGEgc3ViY2xhc3Mgb2YgJmxpdC5idi5WYWxpZGF0aW9uRXhjZXB0aW9uOyA8ZW1waGFzaXM+ZXhjZXB0PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICZsaXQuYnYuQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbjsgdGhlbiB0aGlzIGV4Y2VwdGlvbiBpcyBtYXBwZWQgdG8gYSBIVFRQIHJlc3BvbnNlIHdpdGggc3RhdHVzIGNvZGUgNTAwCisgICAgICAgICAgICAoSW50ZXJuYWwgU2VydmVyIEVycm9yKS4KKyAgICAgICAgICAgIE9uIHRoZSBvdGhlciBoYW5kLCB3aGVuIGEgJmxpdC5idi5Db25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uOyBpcyB0aHJvdyB0d28gZGlmZmVyZW50IHN0YXR1cyBjb2RlIHdvdWxkIGJlIHJldHVybmVkOgorCisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+NTAwIChJbnRlcm5hbCBTZXJ2ZXIgRXJyb3IpPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT5JZiB0aGUgZXhjZXB0aW9uIHdhcyB0aHJvd24gd2hpbGUgdmFsaWRhdGluZyBhIG1ldGhvZCByZXR1cm4gdHlwZS48L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPjQwMCAoQmFkIFJlcXVlc3QpPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT5PdGhlcndpc2UuPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxzZWN0aW9uIHhtbDppZD0iYnYuVmFsaWRhdGlvbkVycm9yIj4KKyAgICAgICAgICAgIDx0aXRsZT5WYWxpZGF0aW9uRXJyb3I8L3RpdGxlPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBCeSBkZWZhdWx0LCAoZHVyaW5nIG1hcHBpbmcgJmxpdC5idi5Db25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uO3MpIEplcnNleSBkb2Vzbid0IHJldHVybiBhbnkgZW50aXRpZXMgdGhhdCB3b3VsZAorICAgICAgICAgICAgICAgIGluY2x1ZGUgdmFsaWRhdGlvbiBlcnJvcnMgdG8gdGhlIGNsaWVudC4gVGhpcyBkZWZhdWx0IGJlaGF2aW91ciBjb3VsZCBiZSBjaGFuZ2VkIGJ5IGVuYWJsaW5nCisgICAgICAgICAgICAgICAgJmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcy5CVl9TRU5EX0VSUk9SX0lOX1JFU1BPTlNFOyBwcm9wZXJ0eSBpbiB5b3VyIGFwcGxpY2F0aW9uCisgICAgICAgICAgICAgICAgKDx4cmVmIGxpbmtlbmQ9ImJ2LmV4YW1wbGUuamVyc2V5LnByb3BlcnRpZXMiLz4pLgorICAgICAgICAgICAgICAgIFdoZW4gdGhpcyBwcm9wZXJ0eSBpcyBlbmFibGVkIHRoZW4gb3VyIGN1c3RvbSAmamF4cnMuZXh0LkV4Y2VwdGlvbk1hcHBlcjsgKHRoYXQgaXMgaGFuZGxpbmcKKyAgICAgICAgICAgICAgICAmbGl0LmJ2LlZhbGlkYXRpb25FeGNlcHRpb247cykgd291bGQgdHJhbnNmb3JtICZsaXQuYnYuQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbjsocykgaW50bworICAgICAgICAgICAgICAgICZqZXJzZXkuZXh0LlZhbGlkYXRpb25FcnJvcjsocykgYW5kIHNldCB0aGlzIG9iamVjdCAoY29sbGVjdGlvbikgYXMgdGhlIG5ldyByZXNwb25zZSBlbnRpdHkgd2hpY2ggSmVyc2V5IGlzCisgICAgICAgICAgICAgICAgYWJsZSB0byBzZW50IHRvIHRoZSBjbGllbnQuCisgICAgICAgICAgICAgICAgRm91ciAmbGl0LmpheHJzLmNvcmUuTWVkaWFUeXBlO3MgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQgd2hlbiBzZW5kaW5nICZsaXQuamVyc2V5LmV4dC5WYWxpZGF0aW9uRXJyb3I7cyB0byB0aGUKKyAgICAgICAgICAgICAgICBjbGllbnQ6CisKKyAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT48bGl0ZXJhbD50ZXh0L3BsYWluPC9saXRlcmFsPjwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+PGxpdGVyYWw+dGV4dC9odG1sPC9saXRlcmFsPjwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+PGxpdGVyYWw+YXBwbGljYXRpb24veG1sPC9saXRlcmFsPjwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+PGxpdGVyYWw+YXBwbGljYXRpb24vanNvbjwvbGl0ZXJhbD48L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogWW91IG5lZWQgdG8gcmVnaXN0ZXIgb25lIG9mIHRoZSBKU09OIChKQVhCKSBwcm92aWRlcnMgKGUuZy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0nanNvbi5tb3h5Jz5NT1h5PC9saW5rPikgdG8gbWFyc2hhbGwgdmFsaWRhdGlvbiBlcnJvcnMgdG8gSlNPTi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L25vdGU+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBMZXQncyB0YWtlIGEgbG9vayBhdCAmamVyc2V5LmV4dC5WYWxpZGF0aW9uRXJyb3I7IGNsYXNzIHRvIHNlZSB3aGljaCBwcm9wZXJ0aWVzIGFyZSBzZW5kIHRvIHRoZSBjbGllbnQ6CisKKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiPkBYbWxSb290RWxlbWVudAorcHVibGljIGZpbmFsIGNsYXNzIFZhbGlkYXRpb25FcnJvciB7CisKKyAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZVRlbXBsYXRlOworCisgICAgcHJpdmF0ZSBTdHJpbmcgcGF0aDsKKworICAgIHByaXZhdGUgU3RyaW5nIGludmFsaWRWYWx1ZTsKKworICAgIC4uLgorfTwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgICAgICAgICAgICAgICBUaGUgPGxpdGVyYWw+bWVzc2FnZTwvbGl0ZXJhbD4gcHJvcGVydHkgaXMgdGhlIGludGVycG9sYXRlZCBlcnJvciBtZXNzYWdlLCA8bGl0ZXJhbD5tZXNzYWdlVGVtcGxhdGU8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgcmVwcmVzZW50cyBhIG5vbi1pbnRlcnBvbGF0ZWQgZXJyb3IgbWVzc2FnZSAob3Iga2V5IGZyb20geW91ciBjb25zdHJhaW50IGRlZmluaXRpb24gZS5nLgorICAgICAgICAgICAgICAgIDxsaXRlcmFsPntqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGwubWVzc2FnZX08L2xpdGVyYWw+KSwgPGxpdGVyYWw+cGF0aDwvbGl0ZXJhbD4gY29udGFpbnMgaW5mb3JtYXRpb24KKyAgICAgICAgICAgICAgICBhYm91dCB0aGUgcGF0aCBpbiB0aGUgdmFsaWRhdGVkIG9iamVjdCBncmFwaCB0byB0aGUgcHJvcGVydHkgaG9sZGluZyBpbnZhbGlkIHZhbHVlIGFuZAorICAgICAgICAgICAgICAgIDxsaXRlcmFsPmludmFsaWRWYWx1ZTwvbGl0ZXJhbD4gaXMgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW52YWxpZCB2YWx1ZSBpdHNlbGYuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBIZXJlIGFyZSBmZXcgZXhhbXBsZXMgb2YgJmxpdC5qZXJzZXkuZXh0LlZhbGlkYXRpb25FcnJvcjsgbWVzc2FnZXMgc2VudCB0byBjbGllbnQ6CisKKyAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgPHRpdGxlPiZsaXQuamVyc2V5LmV4dC5WYWxpZGF0aW9uRXJyb3I7IHRvIDxsaXRlcmFsPnRleHQvcGxhaW48L2xpdGVyYWw+PC90aXRsZT4KKworICAgICAgICAgICAgICAgICAgICA8c2NyZWVuIGxhbmd1YWdlPSJ0ZXh0IiBsaW5lbnVtYmVyaW5nPSJ1bm51bWJlcmVkIj5IVFRQLzEuMSA1MDAgSW50ZXJuYWwgU2VydmVyIEVycm9yCitDb250ZW50LUxlbmd0aDogMTE0CitDb250ZW50LVR5cGU6IHRleHQvcGxhaW4KK1Zhcnk6IEFjY2VwdAorU2VydmVyOiBKZXR0eSg2LjEuMjQpCisKK0NvbnRhY3Qgd2l0aCBnaXZlbiBJRCBkb2VzIG5vdCBleGlzdC4gKHBhdGggPSBDb250YWN0Q2FyZFJlc291cmNlLmdldENvbnRhY3QuJmx0O3JldHVybiB2YWx1ZSZndDssIGludmFsaWRWYWx1ZSA9IG51bGwpPC9zY3JlZW4+CisgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorCisgICAgICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgICAgIDx0aXRsZT4mbGl0LmplcnNleS5leHQuVmFsaWRhdGlvbkVycm9yOyB0byA8bGl0ZXJhbD50ZXh0L2h0bWw8L2xpdGVyYWw+PC90aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgPHNjcmVlbiBsYW5ndWFnZT0ieG1sIiBsaW5lbnVtYmVyaW5nPSJ1bm51bWJlcmVkIj5IVFRQLzEuMSA1MDAgSW50ZXJuYWwgU2VydmVyIEVycm9yCitDb250ZW50LUxlbmd0aDogLi4uCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW4KK1Zhcnk6IEFjY2VwdAorU2VydmVyOiBKZXR0eSg2LjEuMjQpCisKKzwhW0NEQVRBWzxkaXYgY2xhc3M9InZhbGlkYXRpb24tZXJyb3JzIj4KKyAgICA8ZGl2IGNsYXNzPSJ2YWxpZGF0aW9uLWVycm9yIj4KKyAgICAgICAgPHNwYW4gY2xhc3M9Im1lc3NhZ2UiPkNvbnRhY3Qgd2l0aCBnaXZlbiBJRCBkb2VzIG5vdCBleGlzdC48L3NwYW4+CisgICAgICAgICgKKyAgICAgICAgPHNwYW4gY2xhc3M9InBhdGgiPgorICAgICAgICAgICAgPHN0cm9uZz5wYXRoPC9zdHJvbmc+CisgICAgICAgICAgICA9IENvbnRhY3RDYXJkUmVzb3VyY2UuZ2V0Q29udGFjdC48cmV0dXJuIHZhbHVlPgorICAgICAgICA8L3NwYW4+CisgICAgICAgICwKKyAgICAgICAgPHNwYW4gY2xhc3M9ImludmFsaWQtdmFsdWUiPgorICAgICAgICAgICAgPHN0cm9uZz5pbnZhbGlkVmFsdWU8L3N0cm9uZz4KKyAgICAgICAgICAgID0gbnVsbAorICAgICAgICA8L3NwYW4+CisgICAgICAgICkKKyAgICA8L2Rpdj4KKzwvZGl2Pl1dPjwvc2NyZWVuPgorICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKworICAgICAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgICAgICA8dGl0bGU+JmxpdC5qZXJzZXkuZXh0LlZhbGlkYXRpb25FcnJvcjsgdG8gPGxpdGVyYWw+YXBwbGljYXRpb24veG1sPC9saXRlcmFsPjwvdGl0bGU+CisgICAgICAgICAgICAgICAgICAgIDxzY3JlZW4gbGFuZ3VhZ2U9InhtbCIgbGluZW51bWJlcmluZz0idW5udW1iZXJlZCI+SFRUUC8xLjEgNTAwIEludGVybmFsIFNlcnZlciBFcnJvcgorQ29udGVudC1MZW5ndGg6IC4uLgorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluCitWYXJ5OiBBY2NlcHQKK1NlcnZlcjogSmV0dHkoNi4xLjI0KQorCis8IVtDREFUQVs8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPHZhbGlkYXRpb25FcnJvcnM+CisgICAgPHZhbGlkYXRpb25FcnJvcj4KKyAgICAgICAgPG1lc3NhZ2U+Q29udGFjdCB3aXRoIGdpdmVuIElEIGRvZXMgbm90IGV4aXN0LjwvbWVzc2FnZT4KKyAgICAgICAgPG1lc3NhZ2VUZW1wbGF0ZT57Y29udGFjdC5kb2VzLm5vdC5leGlzdH08L21lc3NhZ2VUZW1wbGF0ZT4KKyAgICAgICAgPHBhdGg+Q29udGFjdENhcmRSZXNvdXJjZS5nZXRDb250YWN0LiZsdDtyZXR1cm4gdmFsdWUmZ3Q7PC9wYXRoPgorICAgIDwvdmFsaWRhdGlvbkVycm9yPgorPC92YWxpZGF0aW9uRXJyb3JzPl1dPjwvc2NyZWVuPgorICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKworICAgICAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgICAgICA8dGl0bGU+JmxpdC5qZXJzZXkuZXh0LlZhbGlkYXRpb25FcnJvcjsgdG8gPGxpdGVyYWw+YXBwbGljYXRpb24vanNvbjwvbGl0ZXJhbD48L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICA8c2NyZWVuIGxhbmd1YWdlPSJ4bWwiIGxpbmVudW1iZXJpbmc9InVubnVtYmVyZWQiPkhUVFAvMS4xIDUwMCBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3IKK0NvbnRlbnQtTGVuZ3RoOiAxNzQKK0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbgorVmFyeTogQWNjZXB0CitTZXJ2ZXI6IEpldHR5KDYuMS4yNCkKKworWyB7CisgICAibWVzc2FnZSIgOiAiQ29udGFjdCB3aXRoIGdpdmVuIElEIGRvZXMgbm90IGV4aXN0LiIsCisgICAibWVzc2FnZVRlbXBsYXRlIiA6ICJ7Y29udGFjdC5kb2VzLm5vdC5leGlzdH0iLAorICAgInBhdGgiIDogIkNvbnRhY3RDYXJkUmVzb3VyY2UuZ2V0Q29udGFjdC4mbHQ7cmV0dXJuIHZhbHVlJmd0OyIKK30gXTwvc2NyZWVuPgorICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uPgorICAgICAgICA8dGl0bGU+RXhhbXBsZTwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+VG8gc2VlIGEgY29tcGxldGUgd29ya2luZyBleGFtcGxlIG9mIHVzaW5nIEJlYW4gVmFsaWRhdGlvbiAoSlNSLTM0OSkgd2l0aCBKZXJzZXkgcmVmZXIgdG8gdGhlCisgICAgICAgICAgICA8bGluayB4bGluazpocmVmPScmamVyc2V5LmdpdGh1Yi5leGFtcGxlcy51cmk7L2JlYW4tdmFsaWRhdGlvbi13ZWJhcHAnPkJlYW4gVmFsaWRhdGlvbiBFeGFtcGxlPC9saW5rPi48L3BhcmE+CisgICAgPC9zZWN0aW9uPgorPC9jaGFwdGVyPgpkaWZmIC0tZ2l0IGEvZG9jcy9zcmMvbWFpbi9kb2Nib29rL2NkaS54bWwgYi9kb2NzL3NyYy9tYWluL2RvY2Jvb2svY2RpLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTM4YWQxCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9zcmMvbWFpbi9kb2Nib29rL2NkaS54bWwKQEAgLTAsMCArMSwxMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzwhRE9DVFlQRSBjaGFwdGVyIFs8IUVOVElUWSAlIGVudHMgU1lTVEVNICJqZXJzZXkuZW50IiA+ICVlbnRzOworICAgIDwhRU5USVRZIGplcnNleS5naXRodWIud2VsZC5leGFtcGxlLmxpbmsgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuZ2l0aHViLmV4YW1wbGVzLnVyaTsvaGVsbG93b3JsZC13ZWxkJz5Hcml6emx5IFdFTEQgZXhhbXBsZTwvbGluaz4iPgorICAgIDwhRU5USVRZIGplcnNleS5naXRodWIuY2RpLndlYmFwcC5leGFtcGxlLmxpbmsgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuZ2l0aHViLmV4YW1wbGVzLnVyaTsvY2RpLXdlYmFwcCc+Q0RJIGV4YW1wbGU8L2xpbms+Ij4KK10+Cis8Y2hhcHRlciB4bWxucz0iaHR0cDovL2RvY2Jvb2sub3JnL25zL2RvY2Jvb2siCisgICAgICAgICB2ZXJzaW9uPSI1LjAiCisgICAgICAgICB4bWw6bGFuZz0iZW4iCisgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9kb2Nib29rLm9yZy9ucy9kb2Nib29rIGh0dHA6Ly9kb2Nib29rLm9yZy94bWwvNS4wL3hzZC9kb2Nib29rLnhzZCIKKyAgICAgICAgIHhtbDppZD0iY2RpLnN1cHBvcnQiPgorICAgIDx0aXRsZT5KZXJzZXkgQ0RJIENvbnRhaW5lciBBZ25vc3RpYyBTdXBwb3J0PC90aXRsZT4KKyAgICA8c2VjdGlvbiB4bWw6aWQ9ImNkaS5zdXBwb3J0LmludHJvIj4KKyAgICAgICAgPHRpdGxlPkludHJvZHVjdGlvbjwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZywgSmF2YSBTRSBzdXBwb3J0IGlzIGJlaW5nIGRpc2N1c3NlZCBhcyBvbmUgb2YgaW1wb3J0YW50IGFkZGl0aW9ucyB0byBDREkgMi4wIHNwZWNpZmljYXRpb24uCisgICAgICAgICAgRXhpc3RpbmcgQ0RJIGltcGxlbWVudGF0aW9ucyBicm91Z2h0IHRoaXMgZmVhdHVyZSBhbHJlYWR5LCBvbmx5IGNvbnRhaW5lciBib290c3RyYXBwaW5nIGhhcyBub3QgeWV0IGJlZW4gc3RhbmRhcmRpemVkLgorICAgICAgICAgIEluIEplcnNleSB2ZXJzaW9uIDIuMTUgd2UgaW50cm9kdWNlZCBXZWxkIFNFIHN1cHBvcnQsIHNvIHRoYXQgcGVvcGxlIGNvdWxkIHRha2UgYWR2YW50YWdlIG9mIENESSBmZWF0dXJlcyAKKyAgICAgICAgICBhbHNvIHdoZW4gcnVubmluZyBpbiBKYXZhIFNFIGVudmlyb25tZW50LiBBcyBwYXJ0IG9mIHRoaXMgd29yaywgdGhlIG9sZCBKZXJzZXkgQ0RJIG1vZHVsZSBoYXMgYmVlbiByZWZhY3RvcmVkCisgICAgICAgICAgc28gdGhhdCBpdCBzdXBwb3J0cyBDREkgaW50ZWdyYXRpb24gaW4gYW55IENESS1lbmFibGVkIEhUVFAgY29udGFpbmVyLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxub3RlPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhpcyBjaGFwdGVyIGlzIG1haW5seSBmb2N1c2VkIG9uIHNlcnZlci1zaWRlIEplcnNleSBXZWxkIFNFIHN1cHBvcnQuCisgICAgICAgICAgICAgICAgV2Ugd2lsbCBtZW50aW9uIG90aGVyIGNvbnRhaW5lcnMgdGhhdCBhcmUga25vd24gdG8gYmUgd29ya2luZyB3aXRoIEplcnNleSBDREkgaW50ZWdyYXRpb24gbW9kdWxlcy4KKyAgICAgICAgICAgICAgICBXZSB3aWxsIGFsc28gZGVzY3JpYmUgZmVhdHVyZXMgZGVtb25zdHJhdGVkIGluIEplcnNleSBIZWxsb1dvcmxkIFdlbGQgZXhhbXBsZQorICAgICAgICAgICAgICAgIGFuZCBwcm92aWRlIHNvbWUgaGludHMgb24gaG93IHRvIGVuYWJsZSBKYXZhIFNFIHN1cHBvcnQgZm9yIG90aGVyIChub24gV2VsZCkgQ0RJIGltcGxlbWVudGF0aW9ucy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9ub3RlPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbiB4bWw6aWQ9ImNkaS5zdXBwb3J0LmV4aXN0aW5nLmNvbnRhaW5lcnMiPgorICAgICAgICA8dGl0bGU+Q29udGFpbmVycyBLbm93biB0byBXb3JrIFdpdGggSmVyc2V5IENESSBTdXBwb3J0PC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgVG8gc3RpY2sgd2l0aCBKQVgtUlMgc3BlY2lmaWNhdGlvbiwgSmVyc2V5IGhhcyB0byBzdXBwb3J0IEpBWC1SUy9DREkgaW50ZWdyYXRpb24gaW4gSmF2YSBFRSBlbnZpcm9ubWVudC4KKyAgICAgICAgICBUaGUgdHdvIGNvbnRhaW5lcnMgc3VwcG9ydGluZyBKQVgtUlMvQ0RJIGludGVncmF0aW9uIG91dCBvZiB0aGUgYm94IGFyZSBPcmFjbGUgR2xhc3NGaXNoIGFuZCBPcmFjbGUgV2ViTG9naWMgYXBwbGljYXRpb24gc2VydmVyLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIEFwYWNoZSBUb21jYXQgaXMgYW5vdGhlciBTZXJ2bGV0IGNvbnRhaW5lciB0aGF0IGlzIGtub3duIHRvIHdvcmsgZmluZSB3aXRoIEplcnNleSBDREkgc3VwcG9ydC4KKyAgICAgICAgICBIb3dldmVyLCB0aGluZ3MgZG8gbm90IHdvcmsgdGhlcmUgb3V0IG9mIHRoZSBib3guIFlvdSBuZWVkIHRvIGVuYWJsZSBDREkgc3VwcG9ydCBpbiBUb21jYXQgZS5nLiB1c2luZyBXZWxkLgorICAgICAgICAgIEplcnNleSAmamVyc2V5LmdpdGh1Yi5jZGkud2ViYXBwLmV4YW1wbGUubGluazsgc2hvd3MgaG93IGEgV0FSIGFwcGxpY2F0aW9uIGNvdWxkIGJlIHBhY2thZ2VkCisgICAgICAgICAgKHNlZSA8bGl0ZXJhbD50b21jYXQtcGFja2FnaW5nPC9saXRlcmFsPiBwcm9maWxlIGluIHRoZSBwb20gZmlsZSkgaW4gb3JkZXIgdG8gZW5hYmxlIEpBWC1SUy9DREkgaW50ZWdyYXRpb24KKyAgICAgICAgICBpbiBUb21jYXQgd2l0aCBKZXJzZXkgdXNpbmcgV2VsZC4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICBJZiBub3QgYnVuZGxlZCBhbHJlYWR5IHdpdGggdW5kZXJseWluZyBTZXJ2bGV0IGNvbnRhaW5lciwgdGhlIGZvbGxvd2luZyBKZXJzZXkgbW9kdWxlIG5lZWRzIHRvIGJlIHBhY2thZ2VkIHdpdGggdGhlIGFwcGxpY2F0aW9uCisgICAgICAgICAgb3Igb3RoZXJ3aXNlIGluY2x1ZGVkIGluIHRoZSBjb250YWluZXIgY2xhc3MtcGF0aDoKKyAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0ieG1sIj4mbHQ7ZGVwZW5kZW5jeSZndDsKKyAgICAmbHQ7Z3JvdXBJZCZndDtvcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpJmx0Oy9ncm91cElkJmd0OworICAgICZsdDthcnRpZmFjdElkJmd0O2plcnNleS1jZGkxeCZsdDsvYXJ0aWZhY3RJZCZndDsKKyAgICAmbHQ7dmVyc2lvbiZndDsmdmVyc2lvbjsmbHQ7L3ZlcnNpb24mZ3Q7CismbHQ7L2RlcGVuZGVuY3kmZ3Q7CisgICAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8L3BhcmE+CisgICAgPC9zZWN0aW9uPgorICAgIDxzZWN0aW9uIHhtbDppZD0iY2RpLnN1cHBvcnQucmVxdWVzdC5zY29wZS5iaW5kaW5nIj4KKyAgICAgIDx0aXRsZT5SZXF1ZXN0IFNjb3BlIEJpbmRpbmc8L3RpdGxlPgorICAgICAgPHBhcmE+CisgICAgICAgIFRoZXJlIGlzIGEgY29tbW9uIHBhdHRlcm4gZm9yIGFsbCBhYm92ZSBtZW50aW9uZWQgY29udGFpbmVycy4gSmVyc2V5IENESSBpbnRlZ3JhdGlvbiBidWlsZHMgdXBvbiBleGlzdGluZyBDREkvU2VydmxldCBpbnRlZ3JhdGlvbiB0aGVyZS4KKyAgICAgICAgSW4gb3RoZXIgd29yZHMsIGluIGFsbCBhYm92ZSBjYXNlcywgSmVyc2V5IGFwcGxpY2F0aW9uIG11c3QgYmUgZGVwbG95ZWQgYXMgYSBTZXJ2bGV0LCB3aGVyZSB0aGUgdW5kZXJseWluZyBTZXJ2bGV0IGNvbnRhaW5lcgorICAgICAgICBoYXMgQ0RJIGludGVncmF0ZWQgYWxyZWFkeSBhbmQgQ0RJIGNvbnRhaW5lciBib290c3RyYXBwZWQgcHJvcGVybHkuCisgICAgICA8L3BhcmE+CisgICAgICA8cGFyYT4KKyAgICAgICAgVGhlIGtleSBmZWF0dXJlIGluIENESS9TZXJ2bGV0IGludGVncmF0aW9uIGlzIHByb3BlciByZXF1ZXN0IHNjb3BlIGJpbmRpbmcuIElmIHRoaXMgZmVhdHVyZSB3YXMgbWlzc2luZywKKyAgICAgICAgeW91IHdvdWxkIG5vdCBiZSBhYmxlIHRvIHVzZSBhbnkgcmVxdWVzdCBzY29wZWQgQ0RJIGJlYW5zIGluIHlvdXIgSmVyc2V5IGFwcGxpY2F0aW9uLiBUbyBtYWtlIEplcnNleSB3b3JrIHdpdGggQ0RJCisgICAgICAgIGluIGNvbnRhaW5lcnMgdGhhdCBkbyBub3QgaGF2ZSByZXF1ZXN0IHNjb3BlIGJpbmRpbmcgcmVzb2x2ZWQsIHNvbWUgZXh0cmEgd29yayBpcyByZXF1aXJlZC4KKyAgICAgIDwvcGFyYT4KKyAgICAgIDxwYXJhPgorICAgICAgICBUbyBhbGxvdyBzbW9vdGggaW50ZWdyYXRpb24gd2l0aCBKZXJzZXkgcmVxdWVzdCBzY29wZSBhIG5ldyBTUEksICZqZXJzZXkuc2VydmVyLnNwaS5FeHRlcm5hbFJlcXVlc3RTY29wZTssIHdhcyBpbnRyb2R1Y2VkIGluIEplcnNleSB2ZXJzaW9uIDIuMTUuCisgICAgICAgIEFuIFNQSSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgcmVnaXN0ZXJlZCB2aWEgdGhlIHN0YW5kYXJkIDxsaXRlcmFsPk1FVEEtSU5GL3NlcnZpY2VzPC9saXRlcmFsPiBtZWNoYW5pc20KKyAgICAgICAgYW5kIG5lZWRzIHRvIG1ha2Ugc3VyZSBDREkgaW1wbGVudGF0aW9uIHJlcXVlc3Qgc2NvcGUgaGFzIGJlZW4gcHJvcGVybHkgbWFuYWdlZCBhbmQgcmVxdWVzdCBzY29wZWQgZGF0YSBrZXB0IGluIHRoZSByaWdodCBjb250ZXh0LiAKKyAgICAgICAgRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIGF0IG1vc3QgYSBzaW5nbGUgZXh0ZXJuYWwgcmVxdWVzdCBzY29wZSBwcm92aWRlciBpcyBhbGxvd2VkIGJ5IEplcnNleSBydW50aW1lLgorICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbiB4bWw6aWQ9ImNkaS5zdXBwb3J0LndlbGQuc2UiPgorICAgICAgICA8dGl0bGU+SmVyc2V5IFdlbGQgU0UgU3VwcG9ydDwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhlIGV4dHJhIHdvcmsgdG8gYWxpZ24gSFRUUCByZXF1ZXN0IHdpdGggQ0RJIHJlcXVlc3Qgc2NvcGUgd2FzIGFscmVhZHkgZG9uZSBieSBKZXJzZXkgdGVhbSBmb3IgV2VsZCAyLnggaW1wbGVtZW50YXRpb24uCisgICAgICAgICAgICBJbiBvcmRlciB0byB1dGlsaXplIEplcnNleS9XZWxkIHJlcXVlc3Qgc2NvcGUgYmluZGluZywgeW91IG5lZWQgdG8gdXNlIHRoZSBmb2xsb3dpbmcgbW9kdWxlOgorICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJ4bWwiPiZsdDtkZXBlbmRlbmN5Jmd0OworICAgICZsdDtncm91cElkJmd0O29yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkmbHQ7L2dyb3VwSWQmZ3Q7CisgICAgJmx0O2FydGlmYWN0SWQmZ3Q7amVyc2V5LXdlbGQyLXNlJmx0Oy9hcnRpZmFjdElkJmd0OworICAgICZsdDt2ZXJzaW9uJmd0OyZ2ZXJzaW9uOyZsdDsvdmVyc2lvbiZndDsKKyZsdDsvZGVwZW5kZW5jeSZndDsKKyAgICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICBUaGVuIHlvdSBjb3VsZCB1c2UgeW91ciBDREkgYmFja2VkIEpBWC1SUyBjb21wb25lbnRzIGluIGEgSmVyc2V5IGFwcGxpY2F0aW9uIHJ1bm5pbmcgaW4gR3JpenpseSBIVFRQIGNvbnRhaW5lcgorICAgICAgICAgICAgYm9vdHN0cmFwcGVkIGFzIGZvbGxvd3M6CisgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICA8dGl0bGU+Qm9vdHN0cmFwcGluZyBKZXJzZXkgYXBwbGljYXRpb24gd2l0aCBXZWxkIHN1cHBvcnQgb24gR3JpenpseTwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+ICAgICAgICAgICAgV2VsZCB3ZWxkID0gbmV3IFdlbGQoKTsKKyAgICAgICAgICAgIHdlbGQuaW5pdGlhbGl6ZSgpOworCisgICAgICAgICAgICBmaW5hbCBIdHRwU2VydmVyIHNlcnZlciA9IEdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeS5jcmVhdGVIdHRwU2VydmVyKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC93ZWxkLyIpLCBqZXJzZXlSZXNvdXJjZUNvbmZpZyk7CisKKyAgICAgICAgICAgIC8vIC4uLgorCisgICAgICAgICAgICBzZXJ2ZXIuc2h1dGRvd25Ob3coKTsKKyAgICAgICAgICAgIHdlbGQuc2h1dGRvd24oKTs8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgIFRoZSBhYm92ZSBwYXR0ZXJuIGNvdWxkIGJlIGFwcGxpZWQgYWxzbyBmb3Igb3RoZXIgSmVyc2V5IHN1cHBvcnRlZCBIVFRQIGNvbnRhaW5lcnMgYXMgbG9uZyBhcyB5b3Ugc3RpY2sgd2l0aCBDREkgV2VsZCAyLnggaW1wbGVtZW50YXRpb24uCisgICAgICAgICAgWW91IHNpbXBseSBhZGQgdGhlIGFib3ZlIG1lbnRpb25lZCA8bGl0ZXJhbD5qZXJzZXktd2VsZDItc2U8L2xpdGVyYWw+IG1vZHVsZSBpbnRvIHlvdSBjbGFzcy1wYXRoIGFuZCBib290c3RyYXAgdGhlIFdlbGQgY29udGFpbmVyIG1hbnVhbGx5CisgICAgICAgICAgYmVmb3JlIHN0YXJ0aW5nIHRoZSBIVFRQIGNvbnRhaW5lci4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKzwvY2hhcHRlcj4KZGlmZiAtLWdpdCBhL2RvY3Mvc3JjL21haW4vZG9jYm9vay9jaHVua2VkLnhzbCBiL2RvY3Mvc3JjL21haW4vZG9jYm9vay9jaHVua2VkLnhzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmE4YzI3Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9zcmMvbWFpbi9kb2Nib29rL2NodW5rZWQueHNsCkBAIC0wLDAgKzEsNDYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgorICAgICAgICAgICAgICAgIHhtbG5zOmZvPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9Gb3JtYXQiCisgICAgICAgICAgICAgICAgdmVyc2lvbj0iMS4wIj4KKworICAgIDx4c2w6aW1wb3J0IGhyZWY9InVybjpkb2Nia3g6c3R5bGVzaGVldCIvPgorICAgIDx4c2w6aW1wb3J0IGhyZWY9ImhpZ2hsaWdodC54c2wiLz4KKworICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0idXNlci5oZWFkZXIuY29udGVudCI+CisgICAgPGltZyBzcmM9Ii9pbWFnZXMvamVyc2V5X2xvZ28ucG5nIj4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0idXNlci5oZWFkLmNvbnRlbnQiPgorPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgorCisgIHZhciBfZ2FxID0gX2dhcSB8fCBbXTsKKyAgX2dhcS5wdXNoKFsnX3NldEFjY291bnQnLCAnVUEtMzE2MDMwMy0xJ10pOworICBfZ2FxLnB1c2goWydfdHJhY2tQYWdldmlldyddKTsKKworICAoZnVuY3Rpb24oKSB7CisgICAgdmFyIGdhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7IGdhLnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JzsgZ2EuYXN5bmMgPSB0cnVlOworICAgIGdhLnNyYyA9ICgnaHR0cHM6JyA9PSBkb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbCA/ICdodHRwczovL3NzbCcgOiAnaHR0cDovL3d3dycpICsgJy5nb29nbGUtYW5hbHl0aWNzLmNvbS9nYS5qcyc7CisgICAgdmFyIHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0JylbMF07IHMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZ2EsIHMpOworICB9KSgpOworCis8L3NjcmlwdD4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKzwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS9kb2NzL3NyYy9tYWluL2RvY2Jvb2svY2xpZW50LnhtbCBiL2RvY3Mvc3JjL21haW4vZG9jYm9vay9jbGllbnQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhOGQ2YTgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3NyYy9tYWluL2RvY2Jvb2svY2xpZW50LnhtbApAQCAtMCwwICsxLDEwMDIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzwhRE9DVFlQRSBjaGFwdGVyIFs8IUVOVElUWSAlIGVudHMgU1lTVEVNICJqZXJzZXkuZW50IiA+ICVlbnRzO10+Cis8Y2hhcHRlciB4bWxucz0iaHR0cDovL2RvY2Jvb2sub3JnL25zL2RvY2Jvb2siCisgICAgICAgICB2ZXJzaW9uPSI1LjAiCisgICAgICAgICB4bWw6bGFuZz0iZW4iCisgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9kb2Nib29rLm9yZy9ucy9kb2Nib29rIGh0dHA6Ly9kb2Nib29rLm9yZy94bWwvNS4wL3hzZC9kb2Nib29rLnhzZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIGh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsueHNkIgorICAgICAgICAgeG1sOmlkPSJjbGllbnQiPgorCisgICAgPHRpdGxlPkNsaWVudCBBUEk8L3RpdGxlPgorCisgICAgPHBhcmE+CisgICAgICAgIFRoaXMgc2VjdGlvbiBpbnRyb2R1Y2VzIHRoZSBKQVgtUlMgQ2xpZW50IEFQSSwgd2hpY2ggaXMgYSBmbHVlbnQgSmF2YSBiYXNlZCBBUEkgZm9yIGNvbW11bmljYXRpb24gd2l0aCBSRVNUZnVsIFdlYgorICAgICAgICBzZXJ2aWNlcy4gVGhpcyBzdGFuZGFyZCBBUEkgdGhhdCBpcyBhbHNvIHBhcnQgb2YgSmF2YSBFRSA3IGlzIGRlc2lnbmVkIHRvIG1ha2UgaXQgdmVyeSBlYXN5IHRvIGNvbnN1bWUgYSBXZWIgc2VydmljZQorICAgICAgICBleHBvc2VkIHZpYSBIVFRQIHByb3RvY29sIGFuZCBlbmFibGVzIGRldmVsb3BlcnMgdG8gY29uY2lzZWx5IGFuZCBlZmZpY2llbnRseSBpbXBsZW1lbnQgcG9ydGFibGUgY2xpZW50LXNpZGUgc29sdXRpb25zCisgICAgICAgIHRoYXQgbGV2ZXJhZ2UgZXhpc3RpbmcgYW5kIHdlbGwgZXN0YWJsaXNoZWQgY2xpZW50LXNpZGUgSFRUUCBjb25uZWN0b3IgaW1wbGVtZW50YXRpb25zLgorICAgIDwvcGFyYT4KKyAgICA8cGFyYT4KKyAgICAgICAgVGhlIEpBWC1SUyBjbGllbnQgQVBJIGNhbiBiZSB1dGlsaXplZCB0byBjb25zdW1lIGFueSBXZWIgc2VydmljZSBleHBvc2VkIG9uIHRvcCBvZiBhIEhUVFAgcHJvdG9jb2wgb3IgaXQncworICAgICAgICBleHRlbnNpb24gKGUuZy4gV2ViREFWKSwgYW5kIGlzIG5vdCByZXN0cmljdGVkIHRvIHNlcnZpY2VzIGltcGxlbWVudGVkIHVzaW5nIEpBWC1SUy4gWWV0LCBkZXZlbG9wZXJzIGZhbWlsaWFyIHdpdGggSkFYLVJTCisgICAgICAgIHNob3VsZCBmaW5kIHRoZSBjbGllbnQgQVBJIGNvbXBsZW1lbnRhcnkgdG8gdGhlaXIgc2VydmljZXMsIGVzcGVjaWFsbHkgaWYgdGhlIGNsaWVudCBBUEkgaXMgdXRpbGl6ZWQgYnkgdGhvc2Ugc2VydmljZXMKKyAgICAgICAgdGhlbXNlbHZlcywgb3IgdG8gdGVzdCB0aG9zZSBzZXJ2aWNlcy4KKyAgICAgICAgVGhlIEpBWC1SUyBjbGllbnQgQVBJIGZpbmRzIGluc3BpcmF0aW9uIGluIHRoZSBwcm9wcmlldGFyeSBKZXJzZXkgMS54IENsaWVudCBBUEkgYW5kIGRldmVsb3BlcnMgZmFtaWxpYXIgd2l0aCB0aGUgSmVyc2V5CisgICAgICAgIDEueCBDbGllbnQgQVBJIHNob3VsZCBmaW5kIGl0IGVhc3kgdG8gdW5kZXJzdGFuZCBhbGwgdGhlIGNvbmNlcHRzIGludHJvZHVjZWQgaW4gdGhlIG5ldyBKQVgtUlMgQ2xpZW50IEFQSS4KKyAgICA8L3BhcmE+CisKKyAgICA8cGFyYT4KKyAgICAgICAgVGhlIGdvYWxzIG9mIHRoZSBjbGllbnQgQVBJIGFyZSB0aHJlZWZvbGQ6CisKKyAgICAgICAgPG9yZGVyZWRsaXN0PgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBFbmNhcHN1bGF0ZSBhIGtleSBjb25zdHJhaW50IG9mIHRoZSBSRVNUIGFyY2hpdGVjdHVyYWwgc3R5bGUsIG5hbWVseSB0aGUgVW5pZm9ybSBJbnRlcmZhY2UgQ29uc3RyYWludCBhbmQKKyAgICAgICAgICAgICAgICAgICAgYXNzb2NpYXRlZCBkYXRhIGVsZW1lbnRzLCBhcyBjbGllbnQtc2lkZSBKYXZhIGFydGlmYWN0czsKKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBNYWtlIGl0IGFzIGVhc3kgdG8gY29uc3VtZSBSRVNUZnVsIFdlYiBzZXJ2aWNlcyBleHBvc2VkIG92ZXIgSFRUUCwgc2FtZSBhcyB0aGUgSkFYLVJTIHNlcnZlci1zaWRlIEFQSSBtYWtlcworICAgICAgICAgICAgICAgICAgICBpdCBlYXN5IHRvIGRldmVsb3AgUkVTVGZ1bCBXZWIgc2VydmljZXM7IGFuZAorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFNoYXJlIGNvbW1vbiBjb25jZXB0cyBhbmQgZXh0ZW5zaWJpbGl0eSBwb2ludHMgb2YgdGhlIEpBWC1SUyBBUEkgYmV0d2VlbiB0aGUgc2VydmVyIGFuZCB0aGUgY2xpZW50IHNpZGUKKyAgICAgICAgICAgICAgICAgICAgcHJvZ3JhbW1pbmcgbW9kZWxzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgIDwvb3JkZXJlZGxpc3Q+CisKKyAgICAgICAgQXMgYW4gZXh0ZW5zaW9uIHRvIHRoZSBzdGFuZGFyZCBKQVgtUlMgQ2xpZW50IEFQSSwgdGhlICBKZXJzZXkgQ2xpZW50IEFQSSBzdXBwb3J0cyBhIHBsdWdnYWJsZSBhcmNoaXRlY3R1cmUgdG8gZW5hYmxlIHRoZQorICAgICAgICB1c2Ugb2YgZGlmZmVyZW50IHVuZGVybHlpbmcgSFRUUCBjbGllbnQgJmplcnNleS5jbGllbnQuQ29ubmVjdG9yOyBpbXBsZW1lbnRhdGlvbnMuIFNldmVyYWwgc3VjaCBpbXBsZW1lbnRhdGlvbnMgYXJlCisgICAgICAgIGN1cnJlbnRseSBwcm92aWRlZCB3aXRoIEplcnNleS4gV2UgaGF2ZSBhIGRlZmF1bHQgY2xpZW50IGNvbm5lY3RvciB1c2luZyA8bGl0ZXJhbD5IdHRwKHMpVVJMQ29ubmVjdGlvbjwvbGl0ZXJhbD4gc3VwcGxpZWQKKyAgICAgICAgd2l0aCB0aGUgSkRLIGFzIHdlbGwgYXMgY29ubmVjdG9yIGltcGxlbWVudGF0aW9ucyBiYXNlZCBvbiBBcGFjaGUgSFRUUCBDbGllbnQsIEpldHR5IEhUVFAgY2xpZW50IGFuZCBHcml6emx5IEFzeW5jaHJvbm91cyBDbGllbnQuCisgICAgPC9wYXJhPgorCisgICAgPHNlY3Rpb24+CisgICAgICAgIDx0aXRsZT5Vbmlmb3JtIEludGVyZmFjZSBDb25zdHJhaW50PC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZSB1bmlmb3JtIGludGVyZmFjZSBjb25zdHJhaW50IGJvdW5kcyB0aGUgYXJjaGl0ZWN0dXJlIG9mIFJFU1RmdWwgV2ViIHNlcnZpY2VzIHNvIHRoYXQgYSBjbGllbnQsIHN1Y2gKKyAgICAgICAgICAgIGFzIGEgYnJvd3NlciwgY2FuIHV0aWxpemUgdGhlIHNhbWUgaW50ZXJmYWNlIHRvIGNvbW11bmljYXRlIHdpdGggYW55IHNlcnZpY2UuIFRoaXMgaXMgYSB2ZXJ5IHBvd2VyZnVsIGNvbmNlcHQKKyAgICAgICAgICAgIGluIHNvZnR3YXJlIGVuZ2luZWVyaW5nIHRoYXQgbWFrZXMgV2ViLWJhc2VkIHNlYXJjaCBlbmdpbmVzIGFuZCBzZXJ2aWNlIG1hc2gtdXBzIHBvc3NpYmxlLiBJdCBpbmR1Y2VzIHByb3BlcnRpZXMKKyAgICAgICAgICAgIHN1Y2ggYXM6CisKKyAgICAgICAgICAgIDxvcmRlcmVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPnNpbXBsaWNpdHksIHRoZSBhcmNoaXRlY3R1cmUgaXMgZWFzaWVyIHRvIHVuZGVyc3RhbmQgYW5kIG1haW50YWluOyBhbmQ8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgZXZvbHZhYmlsaXR5IG9yIGxvb3NlIGNvdXBsaW5nLCBjbGllbnRzIGFuZCBzZXJ2aWNlcyBjYW4gZXZvbHZlIG92ZXIgdGltZSBwZXJoYXBzIGluIG5ldyBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuZXhwZWN0ZWQgd2F5cywgd2hpbGUgcmV0YWluaW5nIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvb3JkZXJlZGxpc3Q+CisKKyAgICAgICAgICAgIEZ1cnRoZXIgY29uc3RyYWludHMgYXJlIHJlcXVpcmVkOgorCisgICAgICAgICAgICA8b3JkZXJlZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT5ldmVyeSByZXNvdXJjZSBpcyBpZGVudGlmaWVkIGJ5IGEgVVJJOzwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICBhIGNsaWVudCBpbnRlcmFjdHMgd2l0aCB0aGUgcmVzb3VyY2UgdmlhIEhUVFAgcmVxdWVzdHMgYW5kIHJlc3BvbnNlcyB1c2luZyBhIGZpeGVkIHNldCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgSFRUUCBtZXRob2RzOworICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPm9uZSBvciBtb3JlIHJlcHJlc2VudGF0aW9ucyBjYW4gYmUgcmV0dXJuZWQgYW5kIGFyZSBpZGVudGlmaWVkIGJ5IG1lZGlhIHR5cGVzOyBhbmQ8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPnRoZSBjb250ZW50cyBvZiB3aGljaCBjYW4gbGluayB0byBmdXJ0aGVyIHJlc291cmNlcy48L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvb3JkZXJlZGxpc3Q+CisKKyAgICAgICAgICAgIFRoZSBhYm92ZSBwcm9jZXNzIHJlcGVhdGVkIG92ZXIgYW5kIGFnYWluIHNob3VsZCBiZSBmYW1pbGlhciB0byBhbnlvbmUgd2hvIGhhcyB1c2VkIGEgYnJvd3NlciB0byBmaWxsCisgICAgICAgICAgICBpbiBIVE1MIGZvcm1zIGFuZCBmb2xsb3cgbGlua3MuIFRoYXQgc2FtZSBwcm9jZXNzIGlzIGFwcGxpY2FibGUgdG8gbm9uLWJyb3dzZXIgYmFzZWQgY2xpZW50cy4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgTWFueSBleGlzdGluZyBKYXZhLWJhc2VkIGNsaWVudCBBUElzLCBzdWNoIGFzIHRoZSBBcGFjaGUgSFRUUCBjbGllbnQgQVBJIG9yICZsaXQuamRrNi5IdHRwVXJsQ29ubmVjdGlvbjsKKyAgICAgICAgICAgIHN1cHBsaWVkIHdpdGggdGhlIEpESyBwbGFjZSB0b28gbXVjaCBmb2N1cyBvbiB0aGUgQ2xpZW50LVNlcnZlciBjb25zdHJhaW50IGZvciB0aGUgZXhjaGFuZ2VzIG9mIHJlcXVlc3QgYW5kCisgICAgICAgICAgICByZXNwb25zZXMgcmF0aGVyIHRoYW4gYSByZXNvdXJjZSwgaWRlbnRpZmllZCBieSBhIFVSSSwgYW5kIHRoZSB1c2Ugb2YgYSBmaXhlZCBzZXQgb2YgSFRUUCBtZXRob2RzLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPkEgcmVzb3VyY2UgaW4gdGhlIEpBWC1SUyBjbGllbnQgQVBJIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBKYXZhIGNsYXNzCisgICAgICAgICAgICAmamF4cnMuY2xpZW50LldlYlRhcmdldDsuCisgICAgICAgICAgICBhbmQgZW5jYXBzdWxhdGVzIGFuIFVSSS4gVGhlIGZpeGVkIHNldCBvZiBIVFRQIG1ldGhvZHMgY2FuIGJlIGludm9rZWQgYmFzZWQgb24gdGhlCisgICAgICAgICAgICAmbGl0LmpheHJzLmNsaWVudC5XZWJUYXJnZXQ7LgorICAgICAgICAgICAgVGhlIHJlcHJlc2VudGF0aW9ucyBhcmUgSmF2YSB0eXBlcywgaW5zdGFuY2VzIG9mIHdoaWNoLCBtYXkgY29udGFpbiBsaW5rcyB0aGF0IG5ldyBpbnN0YW5jZXMgb2YKKyAgICAgICAgICAgICZsaXQuamF4cnMuY2xpZW50LldlYlRhcmdldDsgbWF5IGJlIGNyZWF0ZWQgZnJvbS4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uPgorICAgICAgICA8dGl0bGU+RWFzZSBvZiB1c2UgYW5kIHJldXNpbmcgSkFYLVJTIGFydGlmYWN0czwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBTaW5jZSBhIEpBWC1SUyBjb21wb25lbnQgaXMgcmVwcmVzZW50ZWQgYXMgYW4gYW5ub3RhdGVkIEphdmEgdHlwZSwgaXQgbWFrZXMgaXQgZWFzeSB0byBjb25maWd1cmUsIHBhc3MgYXJvdW5kIGFuZAorICAgICAgICAgICAgaW5qZWN0IGluIHdheXMgdGhhdCBhcmUgbm90IHNvIGludHVpdGl2ZSBvciBwb3NzaWJsZSB3aXRoIG90aGVyIGNsaWVudC1zaWRlIEFQSXMuCisgICAgICAgICAgICBUaGUgSmVyc2V5IENsaWVudCBBUEkgcmV1c2VzIG1hbnkgYXNwZWN0cyBvZiB0aGUgSkFYLVJTIGFuZCB0aGUgSmVyc2V5IGltcGxlbWVudGF0aW9uIHN1Y2ggYXM6CisgICAgICAgICAgICA8b3JkZXJlZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIFVSSSBidWlsZGluZyB1c2luZyAmamF4cnMuY29yZS5VcmlCdWlsZGVyOyBhbmQgJmplcnNleS5jb21tb24udXJpLlVyaVRlbXBsYXRlOyB0byBzYWZlbHkgYnVpbGQgVVJJczsKKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT5CdWlsdC1pbiBzdXBwb3J0IGZvciBKYXZhIHR5cGVzIG9mIHJlcHJlc2VudGF0aW9ucyBzdWNoIGFzCisgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5ieXRlW108L2xpdGVyYWw+LAorICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+U3RyaW5nPC9saXRlcmFsPiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPk51bWJlcjwvbGl0ZXJhbD4sCisgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5Cb29sZWFuPC9saXRlcmFsPiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPkNoYXJhY3RlcjwvbGl0ZXJhbD4sCisgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5JbnB1dFN0cmVhbTwvbGl0ZXJhbD4sCisgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5qYXZhLmlvLlJlYWRlcjwvbGl0ZXJhbD4sCisgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5GaWxlPC9saXRlcmFsPiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPkRhdGFTb3VyY2U8L2xpdGVyYWw+LAorICAgICAgICAgICAgICAgICAgICAgICAgSkFYQiBiZWFucyBhcyB3ZWxsIGFzIGFkZGl0aW9uYWwgSmVyc2V5LXNwZWNpZmljIEpTT04gYW5kICZqZXJzZXkubWVkaWEubXVsdGlwYXJ0OyBzdXBwb3J0LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPlVzaW5nIHRoZSBmbHVlbnQgYnVpbGRlci1zdHlsZSBBUEkgcGF0dGVybiB0byBtYWtlIGl0IGVhc2llciB0byBjb25zdHJ1Y3QgcmVxdWVzdHMuPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L29yZGVyZWRsaXN0PgorICAgICAgICAgICAgU29tZSBBUElzLCBsaWtlIHRoZSBBcGFjaGUgSFRUUCBDbGllbnQgb3IgJmpkazYuSHR0cFVybENvbm5lY3Rpb247CisgICAgICAgICAgICBjYW4gYmUgcmF0aGVyIGhhcmQgdG8gdXNlIGFuZC9vciByZXF1aXJlIHRvbyBtdWNoIGNvZGUgdG8gZG8gc29tZXRoaW5nIHJlbGF0aXZlbHkgc2ltcGxlLCBlc3BlY2lhbGx5IHdoZW4KKyAgICAgICAgICAgIHRoZSBjbGllbnQgbmVlZHMgdG8gdW5kZXJzdGFuZCBkaWZmZXJlbnQgcGF5bG9hZCByZXByZXNlbnRhdGlvbnMuCisgICAgICAgICAgICBUaGlzIGlzIHdoeSB0aGUgSmVyc2V5IGltcGxlbWVudGF0aW9uIG9mIEpBWC1SUyBDbGllbnQgQVBJIHByb3ZpZGVzIHN1cHBvcnQgZm9yIHdyYXBwaW5nICZsaXQuamRrNi5IdHRwVXJsQ29ubmVjdGlvbjsKKyAgICAgICAgICAgIGFuZCB0aGUgQXBhY2hlIEhUVFAgY2xpZW50LiBUaHVzIGl0IGlzIHBvc3NpYmxlIHRvIGdldCB0aGUgYmVuZWZpdHMgb2YgdGhlIGVzdGFibGlzaGVkIEpBWC1SUyBpbXBsZW1lbnRhdGlvbnMgYW5kCisgICAgICAgICAgICBmZWF0dXJlcyB3aGlsZSBnZXR0aW5nIHRoZSBlYXNlIG9mIHVzZSBiZW5lZml0IG9mIHRoZSBzaW1wbGUgZGVzaWduIG9mIHRoZSBKQVgtUlMgY2xpZW50IEFQSS4KKyAgICAgICAgICAgIEZvciBleGFtcGxlLCB3aXRoIGEgbG93LWxldmVsIEhUVFAgY2xpZW50IGxpYnJhcnksIHNlbmRpbmcgYSBQT1NUIHJlcXVlc3Qgd2l0aCBhIGJ1bmNoIG9mIHR5cGVkIEhUTUwgZm9ybSBwYXJhbWV0ZXJzCisgICAgICAgICAgICBhbmQgcmVjZWl2aW5nIGEgcmVzcG9uc2UgZGUtc2VyaWFsaXplZCBpbnRvIGEgSkFYQiBiZWFuIGlzIG5vdCBzdHJhaWdodGZvcndhcmQgYXQgYWxsLiBXaXRoIHRoZSBuZXcgSkFYLVJTIENsaWVudCBBUEkKKyAgICAgICAgICAgIHN1cHBvcnRlZCBieSBKZXJzZXkgdGhpcyB0YXNrIGlzIHZlcnkgZWFzeToKKworICAgICAgICAgICAgPGV4YW1wbGUgeG1sOmlkPSJjbGllbnQuZXguZm9ybXBvc3QiPgorICAgICAgICAgICAgICAgIDx0aXRsZT5QT1NUIHJlcXVlc3Qgd2l0aCBmb3JtIHBhcmFtZXRlcnM8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPkNsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpOworV2ViVGFyZ2V0IHRhcmdldCA9IGNsaWVudC50YXJnZXQoImh0dHA6Ly9sb2NhbGhvc3Q6OTk5OCIpLnBhdGgoInJlc291cmNlIik7CisKK0Zvcm0gZm9ybSA9IG5ldyBGb3JtKCk7Citmb3JtLnBhcmFtKCJ4IiwgImZvbyIpOworZm9ybS5wYXJhbSgieSIsICJiYXIiKTsKKworTXlKQVhCQmVhbiBiZWFuID0KK3RhcmdldC5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUpCisgICAgLnBvc3QoRW50aXR5LmVudGl0eShmb3JtLE1lZGlhVHlwZS5BUFBMSUNBVElPTl9GT1JNX1VSTEVOQ09ERURfVFlQRSksCisgICAgICAgIE15SkFYQkJlYW4uY2xhc3MpOzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisKKyAgICAgICAgICAgIEluIHRoZSA8eHJlZiBsaW5rZW5kPSJjbGllbnQuZXguZm9ybXBvc3QiLz4gYSBuZXcgJmxpdC5qYXhycy5jbGllbnQuV2ViVGFyZ2V0OyBpbnN0YW5jZSBpcyBjcmVhdGVkIHVzaW5nIGEgbmV3CisgICAgICAgICAgICAmamF4cnMuY2xpZW50LkNsaWVudDsgaW5zdGFuY2UgZmlyc3QsIG5leHQgYSAmamF4cnMuY29yZS5Gb3JtOyBpbnN0YW5jZSBpcyBjcmVhdGVkIHdpdGggdHdvIGZvcm0gcGFyYW1ldGVycy4KKyAgICAgICAgICAgIE9uY2UgcmVhZHksIHRoZSAmbGl0LmpheHJzLmNvcmUuRm9ybTsgaW5zdGFuY2UgaXMgJmxpdC5odHRwLlBPU1Q7ZWQgdG8gdGhlIHRhcmdldCByZXNvdXJjZS4KKyAgICAgICAgICAgIEZpcnN0LCB0aGUgYWNjZXB0YWJsZSBtZWRpYSB0eXBlIGlzIHNwZWNpZmllZCBpbiB0aGUgPGxpdGVyYWw+cmVxdWVzdCguLi4pPC9saXRlcmFsPiBtZXRob2QuIFRoZW4gaW4gdGhlCisgICAgICAgICAgICA8bGl0ZXJhbD5wb3N0KC4uLik8L2xpdGVyYWw+IG1ldGhvZCwgYSBjYWxsIHRvIGEgc3RhdGljIG1ldGhvZCBvbiBKQVgtUlMgJmpheHJzLmNsaWVudC5FbnRpdHk7IGlzIG1hZGUgdG8gY29uc3RydWN0CisgICAgICAgICAgICB0aGUgcmVxdWVzdCBlbnRpdHkgaW5zdGFuY2UgYW5kIGF0dGFjaCB0aGUgcHJvcGVyIGNvbnRlbnQgbWVkaWEgdHlwZSB0byB0aGUgZm9ybSBlbnRpdHkgdGhhdCBpcyBiZWluZyBzZW50LiBUaGUKKyAgICAgICAgICAgIHNlY29uZCBwYXJhbWV0ZXIgaW4gdGhlIDxsaXRlcmFsPnBvc3QoLi4uKTwvbGl0ZXJhbD4gbWV0aG9kIHNwZWNpZmllcyB0aGUgSmF2YSB0eXBlIG9mIHRoZSByZXNwb25zZSBlbnRpdHkgdGhhdCBzaG91bGQKKyAgICAgICAgICAgIGJlIHJldHVybmVkIGZyb20gdGhlIG1ldGhvZCBpbiBjYXNlIG9mIGEgc3VjY2Vzc2Z1bCByZXNwb25zZS4gSW4gdGhpcyBjYXNlIGFuIGluc3RhbmNlIG9mIEpBWEIgYmVhbiBpcyByZXF1ZXN0ZWQgdG8KKyAgICAgICAgICAgIGJlIHJldHVybmVkIG9uIHN1Y2Nlc3MuIFRoZSBKZXJzZXkgY2xpZW50IEFQSSB0YWtlcyBjYXJlIG9mIHNlbGVjdGluZyB0aGUgcHJvcGVyICZqYXhycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7IGZvcgorICAgICAgICAgICAgdGhlIHNlcmlhbGl6YXRpb24gb2YgdGhlICZsaXQuamF4cnMuY29yZS5Gb3JtOyBpbnN0YW5jZSwgaW52b2tpbmcgdGhlICZsaXQuaHR0cC5QT1NUOyByZXF1ZXN0IGFuZCBwcm9kdWNpbmcgYW5kCisgICAgICAgICAgICBkZS1zZXJpYWxpemF0aW9uIG9mIHRoZSByZXNwb25zZSBtZXNzYWdlIHBheWxvYWQgaW50byBhbiBpbnN0YW5jZSBvZiBhIEpBWEIgYmVhbiB1c2luZyBhIHByb3BlcgorICAgICAgICAgICAgJmpheHJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcjsuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+SWYgdGhlIGNvZGUgYWJvdmUgaGFkIHRvIGJlIHdyaXR0ZW4gdXNpbmcgJmxpdC5qZGs2Lkh0dHBVcmxDb25uZWN0aW9uOywgdGhlIGRldmVsb3BlciB3b3VsZCBoYXZlIHRvIHdyaXRlIGN1c3RvbQorICAgICAgICAgICAgY29kZSB0byBzZXJpYWxpemUgdGhlIGZvcm0gZGF0YSB0aGF0IGFyZSBzZW50IHdpdGhpbiB0aGUgUE9TVCByZXF1ZXN0IGFuZCBkZS1zZXJpYWxpemUgdGhlIHJlc3BvbnNlIGlucHV0IHN0cmVhbQorICAgICAgICAgICAgaW50byBhIEpBWEIgYmVhbi4gQWRkaXRpb25hbGx5LCBtb3JlIGNvZGUgd291bGQgaGF2ZSB0byBiZSB3cml0dGVuIHRvIG1ha2UgaXQgZWFzeSB0byByZXVzZSB0aGUgbG9naWMgd2hlbgorICAgICAgICAgICAgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBzYW1lIHJlc291cmNlIDxsaXRlcmFsPuKAnGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZXNvdXJjZeKAnTwvbGl0ZXJhbD4gdGhhdCBpcyByZXByZXNlbnRlZCBieQorICAgICAgICAgICAgdGhlIEpBWC1SUyAmbGl0LmpheHJzLmNsaWVudC5XZWJUYXJnZXQ7IGluc3RhbmNlIGluIG91ciBleGFtcGxlLgorICAgICAgICA8L3BhcmE+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24+CisgICAgICAgIDx0aXRsZT5PdmVydmlldyBvZiB0aGUgQ2xpZW50IEFQSTwvdGl0bGU+CisKKyAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICA8dGl0bGU+R2V0dGluZyBzdGFydGVkIHdpdGggdGhlIGNsaWVudCBBUEk8L3RpdGxlPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBSZWZlciB0byB0aGUgPGxpbmsgbGlua2VuZD0iZGVwZW5kZW5jaWVzIj5kZXBlbmRlbmNpZXM8L2xpbms+IGZvciBkZXRhaWxzIG9uIHRoZSBkZXBlbmRlbmNpZXMgd2hlbiB1c2luZyB0aGUKKyAgICAgICAgICAgICAgICBKZXJzZXkgSkFYLVJTIENsaWVudCBzdXBwb3J0LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgWW91IG1heSBhbHNvIHdhbnQgdG8gdXNlIGEgY3VzdG9tICZqZXJzZXkuY2xpZW50LkNvbm5lY3RvcjsgaW1wbGVtZW50YXRpb24uIEluIHN1Y2ggY2FzZSB5b3Ugd291bGQgbmVlZCB0byBpbmNsdWRlCisgICAgICAgICAgICAgICAgYWRkaXRpb25hbCBkZXBlbmRlbmNpZXMgb24gdGhlIG1vZHVsZShzKSBjb250YWluaW5nIHRoZSBjdXN0b20gY2xpZW50IGNvbm5lY3RvciB0aGF0IHlvdSB3YW50IHRvIHVzZS4gU2VlIHNlY3Rpb24KKyAgICAgICAgICAgICAgICA8bGluayB4bGluazpocmVmPSIjY29ubmVjdG9ycyI+IkNvbmZpZ3VyaW5nIGN1c3RvbSBDb25uZWN0b3JzIjwvbGluaz4gYWJvdXQgaG93IHRvIHVzZSBhbmQgY29uZmlndXJlIGEgY3VzdG9tCisgICAgICAgICAgICAgICAgSmVyc2V5IGNsaWVudCB0cmFuc3BvcnQgJmxpdC5qZXJzZXkuY2xpZW50LkNvbm5lY3RvcjsuPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgQ3JlYXRpbmcgYW5kIGNvbmZpZ3VyaW5nIGEgQ2xpZW50IGluc3RhbmNlCisgICAgICAgICAgICA8L3RpdGxlPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBKQVgtUlMgQ2xpZW50IEFQSSBpcyBhIGRlc2lnbmVkIHRvIGFsbG93IGZsdWVudCBwcm9ncmFtbWluZyBtb2RlbC4gVGhpcyBtZWFucywgYSBjb25zdHJ1Y3Rpb24gb2YgYQorICAgICAgICAgICAgICAgICZsaXQuamF4cnMuY2xpZW50LkNsaWVudDsgaW5zdGFuY2UsIGZyb20gd2hpY2ggYSAmbGl0LmpheHJzLmNsaWVudC5XZWJUYXJnZXQ7IGlzIGNyZWF0ZWQsIGZyb20gd2hpY2ggYQorICAgICAgICAgICAgICAgIHJlcXVlc3QgJmpheHJzLmNsaWVudC5JbnZvY2F0aW9uOyBpcyBidWlsdCBhbmQgaW52b2tlZCBjYW4gYmUgY2hhaW5lZCBpbiBhIHNpbmdsZSAiZmxvdyIgb2YgaW52b2NhdGlvbnMuCisgICAgICAgICAgICAgICAgVGhlIGluZGl2aWR1YWwgc3RlcHMgb2YgdGhlIGZsb3cgd2lsbCBiZSBzaG93biBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb25zLgorICAgICAgICAgICAgICAgIFRvIHV0aWxpemUgdGhlIGNsaWVudCBBUEkgaXQgaXMgZmlyc3QgbmVjZXNzYXJ5IHRvIGJ1aWxkIGFuIGluc3RhbmNlIG9mIGEKKyAgICAgICAgICAgICAgICAmamF4cnMuY2xpZW50LkNsaWVudDsgdXNpbmcgb25lIG9mIHRoZSBzdGF0aWMgJmpheHJzLmNsaWVudC5DbGllbnRCdWlsZGVyOyBmYWN0b3J5IG1ldGhvZHMuIEhlcmUncyB0aGUgbW9zdAorICAgICAgICAgICAgICAgIHNpbXBsZSBleGFtcGxlOgorCisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIj5DbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKTs8L3Byb2dyYW1saXN0aW5nPgorCisgICAgICAgICAgICAgICAgVGhlICZsaXQuamF4cnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7IGlzIGEgSkFYLVJTIEFQSSB1c2VkIHRvIGNyZWF0ZSBuZXcgaW5zdGFuY2VzIG9mICZsaXQuamF4cnMuY2xpZW50LkNsaWVudDsuCisgICAgICAgICAgICAgICAgSW4gYSBzbGlnaHRseSBtb3JlIGFkdmFuY2VkIHNjZW5hcmlvcywgJmxpdC5qYXhycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIGFkZGl0aW9uYWwKKyAgICAgICAgICAgICAgICBjbGllbnQgaW5zdGFuY2UgcHJvcGVydGllcywgc3VjaCBhcyBhIFNTTCB0cmFuc3BvcnQgc2V0dGluZ3MsIGlmIG5lZWRlZCAoc2VlIDx4cmVmIGxpbmtlbmQ9InNzbCIgLz4KKyAgICAgICAgICAgICAgICBiZWxvdykuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBBICZsaXQuamF4cnMuY2xpZW50LkNsaWVudDsgaW5zdGFuY2UgY2FuIGJlIGNvbmZpZ3VyZWQgZHVyaW5nIGNyZWF0aW9uIGJ5IHBhc3NpbmcgYSAmamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CisgICAgICAgICAgICAgICAgdG8gdGhlIDxsaXRlcmFsPm5ld0NsaWVudChDb25maWd1cmFibGUpPC9saXRlcmFsPiAmbGl0LmpheHJzLmNsaWVudC5DbGllbnRCdWlsZGVyOyBmYWN0b3J5IG1ldGhvZC4KKyAgICAgICAgICAgICAgICAmamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7IGltcGxlbWVudHMgJmpheHJzLmNvcmUuQ29uZmlndXJhYmxlOyBhbmQgdGhlcmVmb3JlIGl0IG9mZmVycyBtZXRob2RzIHRvIHJlZ2lzdGVyCisgICAgICAgICAgICAgICAgcHJvdmlkZXJzIChlLmcuIGZlYXR1cmVzIG9yIGluZGl2aWR1YWwgZW50aXR5IHByb3ZpZGVycywgZmlsdGVycyBvciBpbnRlcmNlcHRvcnMpIGFuZCBzZXR1cCBwcm9wZXJ0aWVzLgorICAgICAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgY29kZSBzaG93cyBhIHJlZ2lzdHJhdGlvbiBvZiBjdXN0b20gY2xpZW50IGZpbHRlcnM6CisKKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5DbGllbnRDb25maWcgY2xpZW50Q29uZmlnID0gbmV3IENsaWVudENvbmZpZygpOworY2xpZW50Q29uZmlnLnJlZ2lzdGVyKE15Q2xpZW50UmVzcG9uc2VGaWx0ZXIuY2xhc3MpOworY2xpZW50Q29uZmlnLnJlZ2lzdGVyKG5ldyBBbm90aGVyQ2xpZW50RmlsdGVyKCkpOworQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KGNsaWVudENvbmZpZyk7PC9wcm9ncmFtbGlzdGluZz4KKworICAgICAgICAgICAgICAgIEluIHRoZSBleGFtcGxlLCBmaWx0ZXJzIGFyZSByZWdpc3RlcmVkIHVzaW5nIHRoZSA8bGl0ZXJhbD5DbGllbnRDb25maWcucmVnaXN0ZXIoLi4uKTwvbGl0ZXJhbD4gbWV0aG9kLiBUaGVyZSBhcmUKKyAgICAgICAgICAgICAgICBtdWx0aXBsZSBvdmVybG9hZGVkIHZlcnNpb25zIG9mIHRoZSBtZXRob2QgdGhhdCBzdXBwb3J0IHJlZ2lzdHJhdGlvbiBvZiBmZWF0dXJlIGFuZCBwcm92aWRlciBjbGFzc2VzIG9yIGluc3RhbmNlcy4KKyAgICAgICAgICAgICAgICBPbmNlIGEgJmxpdC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsgaW5zdGFuY2UgaXMgY29uZmlndXJlZCwgaXQgY2FuIGJlIHBhc3NlZCB0byB0aGUKKyAgICAgICAgICAgICAgICAmbGl0LmpheHJzLmNsaWVudC5DbGllbnRCdWlsZGVyOyB0byBjcmVhdGUgYSBwcmUtY29uZmlndXJlZCAmbGl0LmpheHJzLmNsaWVudC5DbGllbnQ7IGluc3RhbmNlLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgTm90ZSB0aGF0IHRoZSBKZXJzZXkgJmxpdC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsgc3VwcG9ydHMgdGhlIGZsdWVudCBBUEkgbW9kZWwgb2YgJmpheHJzLmNvcmUuQ29uZmlndXJhYmxlOy4KKyAgICAgICAgICAgICAgICBXaXRoIHRoYXQgdGhlIGNvZGUgdGhhdCBjb25maWd1cmVzIGEgbmV3IGNsaWVudCBpbnN0YW5jZSBjYW4gYmUgYWxzbyB3cml0dGVuIHVzaW5nIGEgbW9yZSBjb21wYWN0IHN0eWxlIGFzIHNob3duCisgICAgICAgICAgICAgICAgYmVsb3cuCisKKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj4KK0NsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudChuZXcgQ2xpZW50Q29uZmlnKCkKKyAgICAgICAgLnJlZ2lzdGVyKE15Q2xpZW50UmVzcG9uc2VGaWx0ZXIuY2xhc3MpCisgICAgICAgIC5yZWdpc3RlcihuZXcgQW5vdGhlckNsaWVudEZpbHRlcigpKTs8L3Byb2dyYW1saXN0aW5nPgorCisgICAgICAgICAgICAgICAgVGhlIGFiaWxpdHkgdG8gbGV2ZXJhZ2UgdGhpcyBjb21wYWN0IHBhdHRlcm4gaXMgaW5oZXJlbnQgdG8gYWxsIEpBWC1SUyBhbmQgSmVyc2V5IENsaWVudCBBUEkgY29tcG9uZW50cy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFNpbmNlICZsaXQuamF4cnMuY2xpZW50LkNsaWVudDsgaW1wbGVtZW50cyAmamF4cnMuY29yZS5Db25maWd1cmFibGU7IGludGVyZmFjZSB0b28sIGl0IGNhbiBiZSBjb25maWd1cmVkIGZ1cnRoZXIKKyAgICAgICAgICAgICAgICBldmVuIGFmdGVyIGl0IGhhcyBiZWVuIGNyZWF0ZWQuIEltcG9ydGFudCBpcyB0byBtZW50aW9uIHRoYXQgYW55IGNvbmZpZ3VyYXRpb24gY2hhbmdlIGRvbmUgb24gYQorICAgICAgICAgICAgICAgICZsaXQuamF4cnMuY2xpZW50LkNsaWVudDsgaW5zdGFuY2Ugd2lsbCBub3QgaW5mbHVlbmNlIHRoZSAmamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7IGluc3RhbmNlIHRoYXQgd2FzIHVzZWQgdG8KKyAgICAgICAgICAgICAgICBwcm92aWRlIHRoZSBpbml0aWFsICZsaXQuamF4cnMuY2xpZW50LkNsaWVudDsgaW5zdGFuY2UgY29uZmlndXJhdGlvbiBhdCB0aGUgaW5zdGFuY2UgY3JlYXRpb24gdGltZS4KKyAgICAgICAgICAgICAgICBUaGUgbmV4dCBwaWVjZSBvZiBjb2RlIHNob3dzIGEgY29uZmlndXJhdGlvbiBvZiBhbiBleGlzdGluZyAmbGl0LmpheHJzLmNsaWVudC5DbGllbnQ7IGluc3RhbmNlLgorCisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nCisgICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPmNsaWVudC5yZWdpc3RlcihUaGlyZENsaWVudEZpbHRlci5jbGFzcyk7PC9wcm9ncmFtbGlzdGluZz4KKworICAgICAgICAgICAgICAgIFNpbWlsYXJseSB0byBlYXJsaWVyIGV4YW1wbGVzLCBzaW5jZSA8bGl0ZXJhbD5DbGllbnQucmVnaXN0ZXIoLi4uKTwvbGl0ZXJhbD4gbWV0aG9kIHN1cHBvcnRzIHRoZSBmbHVlbnQgQVBJIHN0eWxlLAorICAgICAgICAgICAgICAgIG11bHRpcGxlIGNsaWVudCBpbnN0YW5jZSBjb25maWd1cmF0aW9uIGNhbGxzIGNhbiBiZSBjaGFpbmVkOgorICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPmNsaWVudC5yZWdpc3RlcihGaWx0ZXJBLmNsYXNzKQorICAgICAgLnJlZ2lzdGVyKG5ldyBGaWx0ZXJCKCkpCisgICAgICAucHJvcGVydHkoIm15LXByb3BlcnR5IiwgdHJ1ZSk7PC9wcm9ncmFtbGlzdGluZz4KKworICAgICAgICAgICAgICAgIFRvIGdldCB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIG9mIHRoZSAmbGl0LmpheHJzLmNsaWVudC5DbGllbnQ7IGluc3RhbmNlIGEgPGxpdGVyYWw+Z2V0Q29uZmlndXJhdGlvbigpPC9saXRlcmFsPgorICAgICAgICAgICAgICAgIG1ldGhvZCBjYW4gYmUgdXNlZC4KKworICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5DbGllbnRDb25maWcgY2xpZW50Q29uZmlnID0gbmV3IENsaWVudENvbmZpZygpOworY2xpZW50Q29uZmlnLnJlZ2lzdGVyKE15Q2xpZW50UmVzcG9uc2VGaWx0ZXIuY2xhc3MpOworY2xpZW50Q29uZmlnLnJlZ2lzdGVyKG5ldyBBbm90aGVyQ2xpZW50RmlsdGVyKCkpOworQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KGNsaWVudENvbmZpZyk7CitjbGllbnQucmVnaXN0ZXIoVGhpcmRDbGllbnRGaWx0ZXIuY2xhc3MpOworQ29uZmlndXJhdGlvbiBuZXdDb25maWd1cmF0aW9uID0gY2xpZW50LmdldENvbmZpZ3VyYXRpb24oKTs8L3Byb2dyYW1saXN0aW5nPgorCisgICAgICAgICAgICAgICAgSW4gdGhlIGNvZGUsIGFuIGFkZGl0aW9uYWwgPGxpdGVyYWw+TXlDbGllbnRSZXNwb25zZUZpbHRlcjwvbGl0ZXJhbD4gY2xhc3MgYW5kCisgICAgICAgICAgICAgICAgPGxpdGVyYWw+QW5vdGhlckNsaWVudEZpbHRlcjwvbGl0ZXJhbD4gaW5zdGFuY2UgYXJlIHJlZ2lzdGVyZWQgaW4gdGhlIDxsaXRlcmFsPmNsaWVudENvbmZpZzwvbGl0ZXJhbD4uIFRoZQorICAgICAgICAgICAgICAgIDxsaXRlcmFsPmNsaWVudENvbmZpZzwvbGl0ZXJhbD4gaXMgdGhlbiB1c2VkIHRvIGNvbnN0cnVjdCBhIG5ldyAmbGl0LmpheHJzLmNsaWVudC5DbGllbnQ7IGluc3RhbmNlLiBUaGUKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbD5UaGlyZENsaWVudEZpbHRlcjwvbGl0ZXJhbD4gaXMgYWRkZWQgc2VwYXJhdGVseSB0byB0aGUgY29uc3RydWN0ZWQgJmxpdC5qYXhycy5jbGllbnQuQ2xpZW50OyBpbnN0YW5jZS4KKyAgICAgICAgICAgICAgICBUaGlzIGRvZXMgbm90IGluZmx1ZW5jZSB0aGUgY29uZmlndXJhdGlvbiByZXByZXNlbnRlZCBieSB0aGUgb3JpZ2luYWwgPGxpdGVyYWw+Y2xpZW50Q29uZmlnPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICBJbiB0aGUgbGFzdCBzdGVwIGEgPGxpdGVyYWw+bmV3Q29uZmlndXJhdGlvbjwvbGl0ZXJhbD4gaXMgcmV0cmlldmVkIGZyb20gdGhlIDxsaXRlcmFsPmNsaWVudDwvbGl0ZXJhbD4uIFRoaXMKKyAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIGNvbnRhaW5zIGFsbCB0aHJlZSByZWdpc3RlcmVkIGZpbHRlcnMgd2hpbGUgdGhlIG9yaWdpbmFsIDxsaXRlcmFsPmNsaWVudENvbmZpZzwvbGl0ZXJhbD4gaW5zdGFuY2UKKyAgICAgICAgICAgICAgICBzdGlsbCBjb250YWlucyBvbmx5IHR3byBmaWx0ZXJzLiBVbmxpa2UgPGxpdGVyYWw+Y2xpZW50Q29uZmlnPC9saXRlcmFsPiBjcmVhdGVkIHNlcGFyYXRlbHksIHRoZQorICAgICAgICAgICAgICAgIDxsaXRlcmFsPm5ld0NvbmZpZ3VyYXRpb248L2xpdGVyYWw+IHJldHJpZXZlZCBmcm9tIHRoZSA8bGl0ZXJhbD5jbGllbnQ8L2xpdGVyYWw+IGluc3RhbmNlIHJlcHJlc2VudHMgYSBsaXZlCisgICAgICAgICAgICAgICAgY2xpZW50IGNvbmZpZ3VyYXRpb24gdmlldy4gQW55IGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiBjaGFuZ2VzIG1hZGUgdG8gdGhlIDxsaXRlcmFsPmNsaWVudDwvbGl0ZXJhbD4gaW5zdGFuY2UKKyAgICAgICAgICAgICAgICBhcmUgYWxzbyByZWZsZWN0ZWQgaW4gdGhlIDxsaXRlcmFsPm5ld0NvbmZpZ3VyYXRpb248L2xpdGVyYWw+LiBTbywgPGxpdGVyYWw+bmV3Q29uZmlndXJhdGlvbjwvbGl0ZXJhbD4gaXMgcmVhbGx5CisgICAgICAgICAgICAgICAgYSB2aWV3IG9mIHRoZSA8bGl0ZXJhbD5jbGllbnQ8L2xpdGVyYWw+IGNvbmZpZ3VyYXRpb24gYW5kIG5vdCBhIGNvbmZpZ3VyYXRpb24gc3RhdGUgY29weS4gVGhlc2UgcHJpbmNpcGxlcyBhcmUKKyAgICAgICAgICAgICAgICBpbXBvcnRhbnQgaW4gdGhlIGNsaWVudCBBUEkgYW5kIHdpbGwgYmUgdXNlZCBpbiB0aGUgZm9sbG93aW5nIHNlY3Rpb25zIHRvby4gRm9yIGV4YW1wbGUsIHlvdSBjYW4gY29uc3RydWN0IGEKKyAgICAgICAgICAgICAgICBjb21tb24gYmFzZSBjb25maWd1cmF0aW9uIGZvciBhbGwgY2xpZW50cyAoaW4gb3VyIGNhc2UgaXQgd291bGQgYmUgPGxpdGVyYWw+Y2xpZW50Q29uZmlnPC9saXRlcmFsPikgYW5kCisgICAgICAgICAgICAgICAgdGhlbiByZXVzZSB0aGlzIGNvbW1vbiBjb25maWd1cmF0aW9uIGluc3RhbmNlIHRvIGNvbmZpZ3VyZSBtdWx0aXBsZSA8bGl0ZXJhbD5jbGllbnQ8L2xpdGVyYWw+IGluc3RhbmNlcyB0aGF0IGNhbgorICAgICAgICAgICAgICAgIGJlIGZ1cnRoZXIgc3BlY2lhbGl6ZWQuIFNpbWlsYXJseSwgeW91IGNhbiB1c2UgYW4gZXhpc3RpbmcgPGxpdGVyYWw+Y2xpZW50PC9saXRlcmFsPiBpbnN0YW5jZSBjb25maWd1cmF0aW9uIHRvCisgICAgICAgICAgICAgICAgY29uZmlndXJlIGFub3RoZXIgY2xpZW50IGluc3RhbmNlIHdpdGhvdXQgaGF2aW5nIHRvIHdvcnJ5IGFib3V0IGFueSBzaWRlIGVmZmVjdHMgaW4gdGhlIG9yaWdpbmFsCisgICAgICAgICAgICAgICAgPGxpdGVyYWw+Y2xpZW50PC9saXRlcmFsPiBpbnN0YW5jZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgIDxzZWN0aW9uPgorICAgICAgICAgICAgPHRpdGxlPlRhcmdldGluZyBhIHdlYiByZXNvdXJjZTwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBPbmNlIHlvdSBoYXZlIGEgJmxpdC5qYXhycy5jbGllbnQuQ2xpZW50OyBpbnN0YW5jZSB5b3UgY2FuIGNyZWF0ZSBhICZsaXQuamF4cnMuY2xpZW50LldlYlRhcmdldDsgZnJvbSBpdC4KKworICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiPldlYlRhcmdldCB3ZWJUYXJnZXQgPSBjbGllbnQudGFyZ2V0KCJodHRwOi8vZXhhbXBsZS5jb20vcmVzdCIpOzwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgICAgICAgICAgICAgICBBICZsaXQuamF4cnMuY2xpZW50LkNsaWVudDsgY29udGFpbnMgc2V2ZXJhbCA8bGl0ZXJhbD50YXJnZXQoLi4uKTwvbGl0ZXJhbD4gbWV0aG9kcyB0aGF0IGFsbG93IGZvciBjcmVhdGlvbiBvZgorICAgICAgICAgICAgICAgICZsaXQuamF4cnMuY2xpZW50LldlYlRhcmdldDsgaW5zdGFuY2UuIEluIHRoaXMgY2FzZSB3ZSdyZSB1c2luZyA8bGl0ZXJhbD50YXJnZXQoU3RyaW5nIHVyaSk8L2xpdGVyYWw+IHZlcnNpb24uCisgICAgICAgICAgICAgICAgVGhlIDxsaXRlcmFsPnVyaTwvbGl0ZXJhbD4gcGFzc2VkIHRvIHRoZSBtZXRob2QgYXMgYSA8bGl0ZXJhbD5TdHJpbmc8L2xpdGVyYWw+IGlzIHRoZSBVUkkgb2YgdGhlIHRhcmdldGVkCisgICAgICAgICAgICAgICAgd2ViIHJlc291cmNlLiBJbiBtb3JlIGNvbXBsZXggc2NlbmFyaW9zIGl0IGNvdWxkIGJlIHRoZSBjb250ZXh0IHJvb3QgVVJJIG9mIHRoZSB3aG9sZSBSRVNUZnVsIGFwcGxpY2F0aW9uLCBmcm9tCisgICAgICAgICAgICAgICAgd2hpY2ggJmxpdC5qYXhycy5jbGllbnQuV2ViVGFyZ2V0OyBpbnN0YW5jZXMgcmVwcmVzZW50aW5nIGluZGl2aWR1YWwgcmVzb3VyY2UgdGFyZ2V0cyBjYW4gYmUgZGVyaXZlZCBhbmQKKyAgICAgICAgICAgICAgICBpbmRpdmlkdWFsbHkgY29uZmlndXJlZC4gVGhpcyBpcyBwb3NzaWJsZSwgYmVjYXVzZSBKQVgtUlMgJmxpdC5qYXhycy5jbGllbnQuV2ViVGFyZ2V0OyBhbHNvIGltcGxlbWVudHMKKyAgICAgICAgICAgICAgICAmbGl0LmpheHJzLmNvcmUuQ29uZmlndXJhYmxlOzoKKworICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZworICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5XZWJUYXJnZXQgd2ViVGFyZ2V0ID0gY2xpZW50LnRhcmdldCgiaHR0cDovL2V4YW1wbGUuY29tL3Jlc3QiKTsKK3dlYlRhcmdldC5yZWdpc3RlcihGaWx0ZXJGb3JFeGFtcGxlQ29tLmNsYXNzKTs8L3Byb2dyYW1saXN0aW5nPgorCisgICAgICAgICAgICAgICAgVGhlIGNvbmZpZ3VyYXRpb24gcHJpbmNpcGxlcyB1c2VkIGluIEpBWC1SUyBjbGllbnQgQVBJIGFwcGx5IHRvICZsaXQuamF4cnMuY2xpZW50LldlYlRhcmdldDsgYXMgd2VsbC4gRWFjaAorICAgICAgICAgICAgICAgICZsaXQuamF4cnMuY2xpZW50LldlYlRhcmdldDsgaW5zdGFuY2UgaW5oZXJpdHMgYSBjb25maWd1cmF0aW9uIGZyb20gaXQncyBwYXJlbnQgKGVpdGhlciBhIGNsaWVudCBvciBhbm90aGVyCisgICAgICAgICAgICAgICAgd2ViIHRhcmdldCkgYW5kIGNhbiBiZSBmdXJ0aGVyIGN1c3RvbS1jb25maWd1cmVkIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBwYXJlbnQgY29tcG9uZW50LgorICAgICAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgdGhlIDxsaXRlcmFsPkZpbHRlckZvckV4YW1wbGVDb208L2xpdGVyYWw+IHdpbGwgYmUgcmVnaXN0ZXJlZCBvbmx5IGluIHRoZQorICAgICAgICAgICAgICAgIDxsaXRlcmFsPndlYlRhcmdldDwvbGl0ZXJhbD4gYW5kIG5vdCBpbiA8bGl0ZXJhbD5jbGllbnQ8L2xpdGVyYWw+LiBTbywgdGhlIDxsaXRlcmFsPmNsaWVudDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICBjYW4gc3RpbGwgYmUgdXNlZCB0byBjcmVhdGUgbmV3ICZsaXQuamF4cnMuY2xpZW50LldlYlRhcmdldDsgaW5zdGFuY2VzIHBvaW50aW5nIGF0IG90aGVyIFVSSXMgdXNpbmcganVzdCB0aGUKKyAgICAgICAgICAgICAgICBjb21tb24gY2xpZW50IGNvbmZpZ3VyYXRpb24sIHdoaWNoIDxsaXRlcmFsPkZpbHRlckZvckV4YW1wbGVDb208L2xpdGVyYWw+IGZpbHRlciBpcyBub3QgcGFydCBvZi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgIDxzZWN0aW9uPgorICAgICAgICAgICAgPHRpdGxlPklkZW50aWZ5aW5nIHJlc291cmNlIG9uIFdlYlRhcmdldDwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBMZXQncyBhc3N1bWUgd2UgaGF2ZSBhIDxsaXRlcmFsPndlYlRhcmdldDwvbGl0ZXJhbD4gcG9pbnRpbmcgYXQgPGxpdGVyYWw+Imh0dHA6Ly9leGFtcGxlLmNvbS9yZXN0IjwvbGl0ZXJhbD4gVVJJCisgICAgICAgICAgICAgICAgdGhhdCByZXByZXNlbnRzIGEgY29udGV4dCByb290IG9mIGEgUkVTVGZ1bCBhcHBsaWNhdGlvbiBhbmQgdGhlcmUgaXMgYSByZXNvdXJjZSBleHBvc2VkIG9uIHRoZSBVUkkKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbD4iaHR0cDovL2V4YW1wbGUuY29tL3Jlc3QvcmVzb3VyY2UiPC9saXRlcmFsPi4gQXMgYWxyZWFkeSBtZW50aW9uZWQsIGEgJmxpdC5qYXhycy5jbGllbnQuV2ViVGFyZ2V0OworICAgICAgICAgICAgICAgIGluc3RhbmNlIGNhbiBiZSB1c2VkIHRvIGRlcml2ZSBvdGhlciB3ZWIgdGFyZ2V0cy4gVXNlIHRoZSBmb2xsb3dpbmcgY29kZSB0byBkZWZpbmUgYSBwYXRoIHRvIHRoZSByZXNvdXJjZS4KKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlPSJqYXZhIj5XZWJUYXJnZXQgcmVzb3VyY2VXZWJUYXJnZXQgPSB3ZWJUYXJnZXQucGF0aCgicmVzb3VyY2UiKTs8L3Byb2dyYW1saXN0aW5nPgorCisgICAgICAgICAgICAgICAgVGhlIDxsaXRlcmFsPnJlc291cmNlV2ViVGFyZ2V0PC9saXRlcmFsPiBub3cgcG9pbnRzIHRvIHRoZSByZXNvdXJjZSBvbiBVUkkKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbD4iaHR0cDovL2V4YW1wbGUuY29tL3Jlc3QvcmVzb3VyY2UiPC9saXRlcmFsPi4gQWdhaW4gaWYgd2UgY29uZmlndXJlIHRoZQorICAgICAgICAgICAgICAgIDxsaXRlcmFsPnJlc291cmNlV2ViVGFyZ2V0PC9saXRlcmFsPiB3aXRoIGEgZmlsdGVyIHNwZWNpZmljIHRvIHRoZSA8bGl0ZXJhbD5yZXNvdXJjZTwvbGl0ZXJhbD4sCisgICAgICAgICAgICAgICAgaXQgd2lsbCBub3QgaW5mbHVlbmNlIHRoZSBvcmlnaW5hbCA8bGl0ZXJhbD53ZWJUYXJnZXQ8L2xpdGVyYWw+IGluc3RhbmNlLiBIb3dldmVyLCB0aGUgZmlsdGVyCisgICAgICAgICAgICAgICAgPGxpdGVyYWw+RmlsdGVyRm9yRXhhbXBsZUNvbTwvbGl0ZXJhbD4gcmVnaXN0cmF0aW9uIHdpbGwgc3RpbGwgYmUgaW5oZXJpdGVkIGJ5IHRoZQorICAgICAgICAgICAgICAgIDxsaXRlcmFsPnJlc291cmNlV2ViVGFyZ2V0PC9saXRlcmFsPiBhcyBpdCBoYXMgYmVlbiBjcmVhdGVkIGZyb20gPGxpdGVyYWw+d2ViVGFyZ2V0PC9saXRlcmFsPi4gVGhpcyBtZWNoYW5pc20KKyAgICAgICAgICAgICAgICBhbGxvd3MgeW91IHRvIHNoYXJlIHRoZSBjb21tb24gY29uZmlndXJhdGlvbiBvZiByZWxhdGVkIHJlc291cmNlcyAodHlwaWNhbGx5IGhvc3RlZCB1bmRlciB0aGUgc2FtZSBVUkkgcm9vdCwKKyAgICAgICAgICAgICAgICBpbiBvdXIgY2FzZSByZXByZXNlbnRlZCBieSB0aGUgPGxpdGVyYWw+d2ViVGFyZ2V0PC9saXRlcmFsPiBpbnN0YW5jZSksIHdoaWxlIGFsbG93aW5nIGZvciBmdXJ0aGVyIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgICAgICBzcGVjaWFsaXphdGlvbiBiYXNlZCBvbiB0aGUgc3BlY2lmaWMgcmVxdWlyZW1lbnRzIG9mIGVhY2ggaW5kaXZpZHVhbCByZXNvdXJjZS4gVGhlIHNhbWUgY29uZmlndXJhdGlvbiBwcmluY2lwbGVzCisgICAgICAgICAgICAgICAgb2YgaW5oZXJpdGFuY2UgKHRvIGFsbG93IGNvbW1vbiBjb25maWcgcHJvcGFnYXRpb24pIGFuZCBkZWNvdXBsaW5nICh0byBhbGxvdyBpbmRpdmlkdWFsIGNvbmZpZyBjdXN0b21pemF0aW9uKQorICAgICAgICAgICAgICAgIGFwcGxpZXMgdG8gYWxsIGNvbXBvbmVudHMgaW4gSkFYLVJTIENsaWVudCBBUEkgZGlzY3Vzc2VkIGJlbG93LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgTGV0J3Mgc2F5IHRoZXJlIGlzIGEgc3ViIHJlc291cmNlIG9uIHRoZSBwYXRoIDxsaXRlcmFsPiJodHRwOi8vZXhhbXBsZS5jb20vcmVzdC9yZXNvdXJjZS9oZWxsb3dvcmxkIjwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgWW91IGNhbiBkZXJpdmUgYSAmbGl0LmpheHJzLmNsaWVudC5XZWJUYXJnZXQ7IGZvciB0aGlzIHJlc291cmNlIHNpbXBseSBieToKKworICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2U9ImphdmEiPldlYlRhcmdldCBoZWxsb3dvcmxkV2ViVGFyZ2V0ID0gcmVzb3VyY2VXZWJUYXJnZXQucGF0aCgiaGVsbG93b3JsZCIpOzwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgICAgICAgICAgICAgICBMZXQncyBhc3N1bWUgdGhhdCB0aGUgPGxpdGVyYWw+aGVsbG93b3JsZDwvbGl0ZXJhbD4gcmVzb3VyY2UgYWNjZXB0cyBhIHF1ZXJ5IHBhcmFtIGZvciA8bGl0ZXJhbD5HRVQ8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgcmVxdWVzdHMgd2hpY2ggZGVmaW5lcyB0aGUgZ3JlZXRpbmcgbWVzc2FnZS4gVGhlIG5leHQgY29kZSBzbmlwcGV0IHNob3dzIGEgY29kZSB0aGF0IGNyZWF0ZXMKKyAgICAgICAgICAgICAgICBhIG5ldyAmbGl0LmpheHJzLmNsaWVudC5XZWJUYXJnZXQ7IHdpdGggdGhlIHF1ZXJ5IHBhcmFtIGRlZmluZWQuCisKKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5XZWJUYXJnZXQgaGVsbG93b3JsZFdlYlRhcmdldFdpdGhRdWVyeVBhcmFtID0KKyAgICAgICAgaGVsbG93b3JsZFdlYlRhcmdldC5xdWVyeVBhcmFtKCJncmVldGluZyIsICJIaSBXb3JsZCEiKTs8L3Byb2dyYW1saXN0aW5nPgorCisgICAgICAgICAgICAgICAgUGxlYXNlIG5vdGUgdGhhdCBhcGFydCBmcm9tIG1ldGhvZHMgdGhhdCBjYW4gZGVyaXZlIG5ldyAmbGl0LmpheHJzLmNsaWVudC5XZWJUYXJnZXQ7IGluc3RhbmNlIGJhc2VkIG9uIGEgVVJJIHBhdGgKKyAgICAgICAgICAgICAgICBvciBxdWVyeSBwYXJhbWV0ZXJzLCB0aGUgSkFYLVJTICZsaXQuamF4cnMuY2xpZW50LldlYlRhcmdldDsgQVBJIGNvbnRhaW5zIGFsc28gbWV0aG9kcyBmb3Igd29ya2luZyB3aXRoIG1hdHJpeAorICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgdG9vLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICA8dGl0bGU+SW52b2tpbmcgYSBIVFRQIHJlcXVlc3Q8L3RpdGxlPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgTGV0J3Mgbm93IGZvY3VzIG9uIGludm9raW5nIGEgJmxpdC5odHRwLkdFVDsgSFRUUCByZXF1ZXN0IG9uIHRoZSBjcmVhdGVkIHdlYiB0YXJnZXRzLiBUbyBzdGFydCBidWlsZGluZyBhIG5ldworICAgICAgICAgICAgICAgIEhUVFAgcmVxdWVzdCBpbnZvY2F0aW9uLCB3ZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyAmamF4cnMuY2xpZW50Lkludm9jYXRpb24uQnVpbGRlcjsuCisKKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5JbnZvY2F0aW9uLkJ1aWxkZXIgaW52b2NhdGlvbkJ1aWxkZXIgPQorICAgICAgICBoZWxsb3dvcmxkV2ViVGFyZ2V0V2l0aFF1ZXJ5UGFyYW0ucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKTsKK2ludm9jYXRpb25CdWlsZGVyLmhlYWRlcigic29tZS1oZWFkZXIiLCAidHJ1ZSIpOzwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgICAgICAgICAgICAgICBBIG5ldyBpbnZvY2F0aW9uIGJ1aWxkZXIgaW5zdGFuY2UgaXMgY3JlYXRlZCB1c2luZyBvbmUgb2YgdGhlIDxsaXRlcmFsPnJlcXVlc3QoLi4uKTwvbGl0ZXJhbD4gbWV0aG9kcyB0aGF0IGFyZQorICAgICAgICAgICAgICAgIGF2YWlsYWJsZSBvbiAmbGl0LmpheHJzLmNsaWVudC5XZWJUYXJnZXQ7LiBBIGNvdXBsZSBvZiB0aGVzZSBtZXRob2RzIGFjY2VwdCBwYXJhbWV0ZXJzIHRoYXQgbGV0IHlvdSBkZWZpbmUKKyAgICAgICAgICAgICAgICB0aGUgbWVkaWEgdHlwZSBvZiB0aGUgcmVwcmVzZW50YXRpb24gcmVxdWVzdGVkIHRvIGJlIHJldHVybmVkIGZyb20gdGhlIHJlc291cmNlLiBIZXJlIHdlIGFyZSBzYXlpbmcgdGhhdCB3ZQorICAgICAgICAgICAgICAgIHJlcXVlc3QgYSA8bGl0ZXJhbD4idGV4dC9wbGFpbiI8L2xpdGVyYWw+IHR5cGUuIFRoaXMgdGVsbHMgSmVyc2V5IHRvIGFkZCBhIDxsaXRlcmFsPkFjY2VwdDogdGV4dC9wbGFpbjwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICBIVFRQIGhlYWRlciB0byBvdXIgcmVxdWVzdC4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoZSA8bGl0ZXJhbD5pbnZvY2F0aW9uQnVpbGRlcjwvbGl0ZXJhbD4gaXMgdXNlZCB0byBzZXR1cCByZXF1ZXN0IHNwZWNpZmljIHBhcmFtZXRlcnMuIEhlcmUgd2UgY2FuIHNldHVwIGhlYWRlcnMKKyAgICAgICAgICAgICAgICBmb3IgdGhlIHJlcXVlc3Qgb3IgZm9yIGV4YW1wbGUgY29va2llIHBhcmFtZXRlcnMuIEluIG91ciBleGFtcGxlIHdlIHNldCB1cCBhIDxsaXRlcmFsPiJzb21lLWhlYWRlciI8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgaGVhZGVyIHRvIHZhbHVlICZsaXQudHJ1ZTsuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBPbmNlIGZpbmlzaGVkIHdpdGggcmVxdWVzdCBjdXN0b21pemF0aW9ucywgaXQncyB0aW1lIHRvIGludm9rZSB0aGUgcmVxdWVzdC4gV2UgaGF2ZSB0d28gb3B0aW9ucyBub3cuCisgICAgICAgICAgICAgICAgV2UgY2FuIHVzZSB0aGUgJmxpdC5qYXhycy5jbGllbnQuSW52b2NhdGlvbi5CdWlsZGVyOyB0byBidWlsZCBhIGdlbmVyaWMgJmpheHJzLmNsaWVudC5JbnZvY2F0aW9uOyBpbnN0YW5jZQorICAgICAgICAgICAgICAgIHRoYXQgd2lsbCBiZSBpbnZva2VkIHNvbWUgdGltZSBsYXRlci4gVXNpbmcgJmxpdC5qYXhycy5jbGllbnQuSW52b2NhdGlvbjsgd2Ugd2lsbCBiZSBhYmxlIHRvIGUuZy4gc2V0IGFkZGl0aW9uYWwKKyAgICAgICAgICAgICAgICByZXF1ZXN0IHByb3BlcnRpZXMgd2hpY2ggYXJlIHByb3BlcnRpZXMgaW4gYSBiYXRjaCBvZiBzZXZlcmFsIHJlcXVlc3RzIGFuZCB1c2UgdGhlIGdlbmVyaWMgSkFYLVJTCisgICAgICAgICAgICAgICAgJmxpdC5qYXhycy5jbGllbnQuSW52b2NhdGlvbjsgQVBJIHRvIGludm9rZSB0aGUgYmF0Y2ggb2YgcmVxdWVzdHMgd2l0aG91dCBhY3R1YWxseSBrbm93aW5nIGFsbCB0aGUgZGV0YWlscworICAgICAgICAgICAgICAgIChzdWNoIGFzIHJlcXVlc3QgSFRUUCBtZXRob2QsIGNvbmZpZ3VyYXRpb24gZXRjLikuIEFueSBwcm9wZXJ0aWVzIHNldCBvbiBhbiBpbnZvY2F0aW9uIGluc3RhbmNlIGNhbiBiZSByZWFkCisgICAgICAgICAgICAgICAgZHVyaW5nIHRoZSByZXF1ZXN0IHByb2Nlc3NpbmcuIEZvciBleGFtcGxlLCBpbiBhIGN1c3RvbSAmamF4cnMuY2xpZW50LkNsaWVudFJlcXVlc3RGaWx0ZXI7IHlvdSBjYW4gY2FsbAorICAgICAgICAgICAgICAgIDxsaXRlcmFsPmdldFByb3BlcnR5KCk8L2xpdGVyYWw+IG1ldGhvZCBvbiB0aGUgc3VwcGxpZWQgJmpheHJzLmNsaWVudC5DbGllbnRSZXF1ZXN0Q29udGV4dDsgdG8gcmVhZCBhIHJlcXVlc3QKKyAgICAgICAgICAgICAgICBwcm9wZXJ0eS4gTm90ZSB0aGF0IHRoZXNlIHJlcXVlc3QgcHJvcGVydGllcyBhcmUgZGlmZmVyZW50IGZyb20gdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBzZXQgb24KKyAgICAgICAgICAgICAgICAmbGl0LmpheHJzLmNvcmUuQ29uZmlndXJhYmxlOy4gQXMgbWVudGlvbmVkIGVhcmxpZXIsIGFuICZsaXQuamF4cnMuY2xpZW50Lkludm9jYXRpb247IGluc3RhbmNlIHByb3ZpZGVzIGdlbmVyaWMKKyAgICAgICAgICAgICAgICBpbnZvY2F0aW9uIEFQSSB0byBpbnZva2UgdGhlIEhUVFAgcmVxdWVzdCBpdCByZXByZXNlbnRzIGVpdGhlciBzeW5jaHJvbm91c2x5IG9yIGFzeW5jaHJvbm91c2x5LiBTZWUKKyAgICAgICAgICAgICAgICB0aGUgPHhyZWYgbGlua2VuZD0iYXN5bmMiIC8+IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGFzeW5jaHJvbm91cyBpbnZvY2F0aW9ucy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEluIGNhc2UgeW91IGRvIG5vdCB3YW50IHRvIGRvIGFueSBiYXRjaCBwcm9jZXNzaW5nIG9uIHlvdXIgSFRUUCByZXF1ZXN0IGludm9jYXRpb25zIHByaW9yIHRvIGludm9raW5nIHRoZW0sIHRoZXJlCisgICAgICAgICAgICAgICAgaXMgYW5vdGhlciwgbW9yZSBjb252ZW5pZW50IGFwcHJvYWNoIHRoYXQgeW91IGNhbiB1c2UgdG8gaW52b2tlIHlvdXIgcmVxdWVzdHMgZGlyZWN0bHkgZnJvbSBhbgorICAgICAgICAgICAgICAgICZsaXQuamF4cnMuY2xpZW50Lkludm9jYXRpb24uQnVpbGRlcjsgaW5zdGFuY2UuIFRoaXMgYXBwcm9hY2ggaXMgZGVtb25zdHJhdGVkIGluIHRoZSBuZXh0IEphdmEgY29kZSBsaXN0aW5nLgorICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPlJlc3BvbnNlIHJlc3BvbnNlID0gaW52b2NhdGlvbkJ1aWxkZXIuZ2V0KCk7PC9wcm9ncmFtbGlzdGluZz4KKworICAgICAgICAgICAgICAgIFdoaWxlIHNob3J0LCB0aGUgY29kZSBpbiB0aGUgZXhhbXBsZSBwZXJmb3JtcyBtdWx0aXBsZSBhY3Rpb25zLiBGaXJzdCwgaXQgd2lsbCBidWlsZCB0aGUgdGhlIHJlcXVlc3QgZnJvbSB0aGUKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbD5pbnZvY2F0aW9uQnVpbGRlcjwvbGl0ZXJhbD4uIFRoZSBVUkkgb2YgcmVxdWVzdCB3aWxsIGJlCisgICAgICAgICAgICAgICAgPGxpdGVyYWw+aHR0cDovL2V4YW1wbGUuY29tL3Jlc3QvcmVzb3VyY2UvaGVsbG93b3JsZD9ncmVldGluZz0iSGklMjBXb3JsZCEiPC9saXRlcmFsPiBhbmQgdGhlIHJlcXVlc3Qgd2lsbCBjb250YWluCisgICAgICAgICAgICAgICAgPGxpdGVyYWw+c29tZS1oZWFkZXI6IHRydWU8L2xpdGVyYWw+IGFuZCA8bGl0ZXJhbD5BY2NlcHQ6IHRleHQvcGxhaW48L2xpdGVyYWw+IGhlYWRlcnMuIFRoZSByZXF1ZXN0IHdpbGwgdGhlbiBwYXNzCisgICAgICAgICAgICAgICAgdHJvdWdoIGFsbCBjb25maWd1cmVkIHJlcXVlc3QgZmlsdGVycyAoIDxsaXRlcmFsPkFub3RoZXJDbGllbnRGaWx0ZXI8L2xpdGVyYWw+LAorICAgICAgICAgICAgICAgIDxsaXRlcmFsPlRoaXJkQ2xpZW50RmlsdGVyPC9saXRlcmFsPiBhbmQKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbD5GaWx0ZXJGb3JFeGFtcGxlQ29tPC9saXRlcmFsPikuIE9uY2UgcHJvY2Vzc2VkIGJ5IHRoZSBmaWx0ZXJzLCB0aGUgcmVxdWVzdCB3aWxsIGJlIHNlbnQgdG8gdGhlIHJlbW90ZQorICAgICAgICAgICAgICAgIHJlc291cmNlLiBMZXQncyBzYXkgdGhlIHJlc291cmNlIHRoZW4gcmV0dXJucyBhbiBIVFRQIDIwMCBtZXNzYWdlIHdpdGggYSBwbGFpbiB0ZXh0IHJlc3BvbnNlIGNvbnRlbnQgdGhhdCBjb250YWlucworICAgICAgICAgICAgICAgIHRoZSB2YWx1ZSBzZW50IGluIHRoZSByZXF1ZXN0IDxsaXRlcmFsPmdyZWV0aW5nPC9saXRlcmFsPiBxdWVyeSBwYXJhbWV0ZXIuIE5vdyB3ZSBjYW4gb2JzZXJ2ZSB0aGUgcmV0dXJuZWQKKyAgICAgICAgICAgICAgICByZXNwb25zZToKKworICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPlN5c3RlbS5vdXQucHJpbnRsbihyZXNwb25zZS5nZXRTdGF0dXMoKSk7CitTeXN0ZW0ub3V0LnByaW50bG4ocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTs8L3Byb2dyYW1saXN0aW5nPgorCisgICAgICAgICAgICAgICAgd2hpY2ggd2lsbCBwcm9kdWNlIHRoZSBmb2xsb3dpbmcgb3V0cHV0IHRvIHRoZSBjb25zb2xlOgorCisgICAgICAgICAgICAgICAgPHNjcmVlbiBsaW5lbnVtYmVyaW5nPSJ1bm51bWJlcmVkIj4yMDAKK0hpIFdvcmxkITwvc2NyZWVuPgorCisgICAgICAgICAgICAgICAgQXMgd2UgY2FuIHNlZSwgdGhlIHJlcXVlc3Qgd2FzIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQgKGNvZGUgMjAwKSBhbmQgcmV0dXJuZWQgYW4gZW50aXR5IChyZXByZXNlbnRhdGlvbikgaXMKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbD4iSGkgV29ybGQhIjwvbGl0ZXJhbD4uIE5vdGUgdGhhdCBzaW5jZSB3ZSBoYXZlIGNvbmZpZ3VyZWQgYSA8bGl0ZXJhbD5NeUNsaWVudFJlc3BvbnNlRmlsdGVyPC9saXRlcmFsPgorICAgICAgICAgICAgICAgIGluIHRoZSByZXNvdXJjZSB0YXJnZXQsIHdoZW4gPGxpdGVyYWw+cmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpPC9saXRlcmFsPiBnZXRzIGNhbGxlZCwgdGhlIHJlc3BvbnNlCisgICAgICAgICAgICAgICAgcmV0dXJuZWQgZnJvbSB0aGUgcmVtb3RlIGVuZHBvaW50IGlzIHBhc3NlZCB0aHJvdWdoIHRoZSByZXNwb25zZSBmaWx0ZXIgY2hhaW4gKGluY2x1ZGluZyB0aGUKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbD5NeUNsaWVudFJlc3BvbnNlRmlsdGVyPC9saXRlcmFsPikgYW5kIGVudGl0eSBpbnRlcmNlcHRvciBjaGFpbiBhbmQgYXQgbGFzdCBhIHByb3BlcgorICAgICAgICAgICAgICAgICZqYXhycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7IGlzIGxvY2F0ZWQgdG8gcmVhZCB0aGUgcmVzcG9uc2UgY29udGVudCBieXRlcyBmcm9tIHRoZSByZXNwb25zZSBzdHJlYW0gaW50byBhCisgICAgICAgICAgICAgICAgSmF2YSA8bGl0ZXJhbD5TdHJpbmc8L2xpdGVyYWw+IGluc3RhbmNlLiBDaGVjayA8eHJlZiBsaW5rZW5kPSJmaWx0ZXJzLWFuZC1pbnRlcmNlcHRvcnMiIC8+IHRvIGxlYXIgbW9yZSBhYm91dAorICAgICAgICAgICAgICAgIHJlcXVlc3QgYW5kIHJlc3BvbnNlIGZpbHRlcnMgYW5kIGVudGl0eSBpbnRlcmNlcHRvcnMuCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEltYWdpbmUgbm93IHRoYXQgeW91IHdvdWxkIGxpa2UgdG8gaW52b2tlIGEgJmxpdC5odHRwLlBPU1Q7IHJlcXVlc3QgYnV0IHdpdGhvdXQgYW55IHF1ZXJ5IHBhcmFtZXRlcnMuIFlvdSB3b3VsZAorICAgICAgICAgICAgICAgIGp1c3QgdXNlIHRoZSA8bGl0ZXJhbD5oZWxsb3dvcmxkV2ViVGFyZ2V0PC9saXRlcmFsPiBpbnN0YW5jZSBjcmVhdGVkIGVhcmxpZXIgYW5kIGNhbGwgdGhlCisgICAgICAgICAgICAgICAgPGxpdGVyYWw+cG9zdCgpPC9saXRlcmFsPiBpbnN0ZWFkIG9mIDxsaXRlcmFsPmdldCgpPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5SZXNwb25zZSBwb3N0UmVzcG9uc2UgPQorICAgICAgICBoZWxsb3dvcmxkV2ViVGFyZ2V0LnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KCJBIHN0cmluZyBlbnRpdHkgdG8gYmUgUE9TVGVkIiwgTWVkaWFUeXBlLlRFWFRfUExBSU4pKTs8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICA8dGl0bGU+RXhhbXBsZSBzdW1tYXJ5PC90aXRsZT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgY29kZSBwdXRzIHRvZ2V0aGVyIHRoZSBwaWVjZXMgdXNlZCBpbiB0aGUgZWFybGllciBleGFtcGxlcy4KKworICAgICAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgICAgICA8dGl0bGU+VXNpbmcgSkFYLVJTIENsaWVudCBBUEk8L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5DbGllbnRDb25maWcgY2xpZW50Q29uZmlnID0gbmV3IENsaWVudENvbmZpZygpOworY2xpZW50Q29uZmlnLnJlZ2lzdGVyKE15Q2xpZW50UmVzcG9uc2VGaWx0ZXIuY2xhc3MpOworY2xpZW50Q29uZmlnLnJlZ2lzdGVyKG5ldyBBbm90aGVyQ2xpZW50RmlsdGVyKCkpOworCitDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoY2xpZW50Q29uZmlnKTsKK2NsaWVudC5yZWdpc3RlcihUaGlyZENsaWVudEZpbHRlci5jbGFzcyk7CisKK1dlYlRhcmdldCB3ZWJUYXJnZXQgPSBjbGllbnQudGFyZ2V0KCJodHRwOi8vZXhhbXBsZS5jb20vcmVzdCIpOword2ViVGFyZ2V0LnJlZ2lzdGVyKEZpbHRlckZvckV4YW1wbGVDb20uY2xhc3MpOworV2ViVGFyZ2V0IHJlc291cmNlV2ViVGFyZ2V0ID0gd2ViVGFyZ2V0LnBhdGgoInJlc291cmNlIik7CitXZWJUYXJnZXQgaGVsbG93b3JsZFdlYlRhcmdldCA9IHJlc291cmNlV2ViVGFyZ2V0LnBhdGgoImhlbGxvd29ybGQiKTsKK1dlYlRhcmdldCBoZWxsb3dvcmxkV2ViVGFyZ2V0V2l0aFF1ZXJ5UGFyYW0gPQorICAgICAgICBoZWxsb3dvcmxkV2ViVGFyZ2V0LnF1ZXJ5UGFyYW0oImdyZWV0aW5nIiwgIkhpIFdvcmxkISIpOworCitJbnZvY2F0aW9uLkJ1aWxkZXIgaW52b2NhdGlvbkJ1aWxkZXIgPQorICAgICAgICBoZWxsb3dvcmxkV2ViVGFyZ2V0V2l0aFF1ZXJ5UGFyYW0ucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKTsKK2ludm9jYXRpb25CdWlsZGVyLmhlYWRlcigic29tZS1oZWFkZXIiLCAidHJ1ZSIpOworCitSZXNwb25zZSByZXNwb25zZSA9IGludm9jYXRpb25CdWlsZGVyLmdldCgpOworU3lzdGVtLm91dC5wcmludGxuKHJlc3BvbnNlLmdldFN0YXR1cygpKTsKK1N5c3RlbS5vdXQucHJpbnRsbihyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorCisgICAgICAgICAgICAgICAgTm93IHdlIGNhbiB0cnkgdG8gbGV2ZXJhZ2UgdGhlIGZsdWVudCBBUEkgc3R5bGUgdG8gd3JpdGUgdGhpcyBjb2RlIGluIGEgbW9yZSBjb21wYWN0IHdheS4KKworICAgICAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgICAgICA8dGl0bGU+VXNpbmcgSkFYLVJTIENsaWVudCBBUEkgZmx1ZW50bHk8L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5DbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQobmV3IENsaWVudENvbmZpZygpCisgICAgICAgICAgICAucmVnaXN0ZXIoTXlDbGllbnRSZXNwb25zZUZpbHRlci5jbGFzcykKKyAgICAgICAgICAgIC5yZWdpc3RlcihuZXcgQW5vdGhlckNsaWVudEZpbHRlcigpKSk7CisKK1N0cmluZyBlbnRpdHkgPSBjbGllbnQudGFyZ2V0KCJodHRwOi8vZXhhbXBsZS5jb20vcmVzdCIpCisgICAgICAgICAgICAucmVnaXN0ZXIoRmlsdGVyRm9yRXhhbXBsZUNvbS5jbGFzcykKKyAgICAgICAgICAgIC5wYXRoKCJyZXNvdXJjZS9oZWxsb3dvcmxkIikKKyAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJncmVldGluZyIsICJIaSBXb3JsZCEiKQorICAgICAgICAgICAgLnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkKKyAgICAgICAgICAgIC5oZWFkZXIoInNvbWUtaGVhZGVyIiwgInRydWUiKQorICAgICAgICAgICAgLmdldChTdHJpbmcuY2xhc3MpOzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorCisgICAgICAgICAgICAgICAgVGhlIGNvZGUgYWJvdmUgZG9lcyB0aGUgc2FtZSB0aGluZyBleGNlcHQgaXQgc2tpcHMgdGhlIGdlbmVyaWMgJmxpdC5qYXhycy5jb3JlLlJlc3BvbnNlOyBwcm9jZXNzaW5nIGFuZCBkaXJlY3RseQorICAgICAgICAgICAgICAgIHJlcXVlc3RzIGFuIGVudGl0eSBpbiB0aGUgbGFzdCA8bGl0ZXJhbD5nZXQoU3RyaW5nLmNsYXNzKTwvbGl0ZXJhbD4gbWV0aG9kIGNhbGwuIFRoaXMgc2hvcnRjdXQgbWV0aG9kIGxldCdzIHlvdQorICAgICAgICAgICAgICAgIHNwZWNpZnkgdGhhdCAoaW4gY2FzZSB0aGUgcmVzcG9uc2Ugd2FzIHJldHVybmVkIHN1Y2Nlc3NmdWxseSB3aXRoIGEgSFRUUCAyeHggc3RhdHVzIGNvZGUpIHRoZSByZXNwb25zZSBlbnRpdHkKKyAgICAgICAgICAgICAgICBzaG91bGQgYmUgcmV0dXJuZWQgYXMgSmF2YSA8bGl0ZXJhbD5TdHJpbmc8L2xpdGVyYWw+IHR5cGUuIFRoaXMgY29tcGFjdCBleGFtcGxlIGRlbW9uc3RyYXRlcyBhbm90aGVyIGFkdmFudGFnZSBvZgorICAgICAgICAgICAgICAgIHRoZSBKQVgtUlMgY2xpZW50IEFQSS4gVGhlIGZsdWVuY3kgb2YgSkFYLVJTIENsaWVudCBBUEkgaXMgY29udmVuaWVudCBlc3BlY2lhbGx5IHdpdGggc2ltcGxlIHVzZSBjYXNlcy4KKyAgICAgICAgICAgICAgICBIZXJlIGlzIGFub3RoZXIgYSB2ZXJ5IHNpbXBsZSBHRVQgcmVxdWVzdCByZXR1cm5pbmcgYSBTdHJpbmcgcmVwcmVzZW50YXRpb24gKGVudGl0eSk6CisKKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5TdHJpbmcgcmVzcG9uc2VFbnRpdHkgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpCisgICAgICAgICAgICAudGFyZ2V0KCJodHRwOi8vZXhhbXBsZS5jb20iKS5wYXRoKCJyZXNvdXJjZS9yZXN0IikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbj4KKyAgICAgICAgICAgIDx0aXRsZT5TZXR0aW5nIEV4ZWN1dG9yU2VydmljZSBhbmQgU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFNvbWUgY2xpZW50IGludm9jYXRpb25zLCBsaWtlIGFzeW5jaHJvbm91cyBvciByZWFjdGl2ZSwgY291bGQgbGVhZCB0byBhIG5lZWQgdG8gc3RhcnQgYSBuZXcgdGhyZWFkLiBUaGlzIGlzCisgICAgICAgICAgICAgICAgYmVpbmcgZG9uZSBvbiBwcm92aWRlZCBFeGVjdXRvclNlcnZpY2Ugb3IgU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlLiAmbGl0LmpheHJzLmNsaWVudC5DbGllbnRCdWlsZGVyOyBoYXMgdHdvCisgICAgICAgICAgICAgICAgbWV0aG9kcywgd2hpY2ggY2FuIGJlIHVzZWQgdG8gZGVmaW5lIHRoZW06IDxsaXRlcmFsPmV4ZWN1dG9yU2VydmljZShFeGVjdXRvclNlcnZpY2UpPC9saXRlcmFsPiBhbmQKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbD5zY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UoU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlKTwvbGl0ZXJhbD4uIFdoZW4gc3BlY2lmaWVkLCBhbGwgaW52b2NhdGlvbnMgd2hpY2gKKyAgICAgICAgICAgICAgICBkbyByZXF1aXJlIHJ1bm5pbmcgb24gYW5vdGhlciB0aHJlYWQsIHNob3VsZCBiZSBleGVjdXRlZCB1c2luZyBwcm92aWRlZCBzZXJ2aWNlcy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIERlZmF1bHQgdmFsdWVzIGRvIGRlcGVuZCBvbiB0aGUgZW52aXJvbm1lbnQgLSBpbiBKYXZhIEVFIGNvbnRhaW5lciwgaXQgaGFzIHRvIGJlICZqZWU2LmphdmF4LmVudGVycHJpc2UuY29uY3VycmVudC5NYW5hZ2VkRXhlY3V0b3JTZXJ2aWNlOworICAgICAgICAgICAgICAgIGFuZCAmamVlNi5qYXZheC5lbnRlcnByaXNlLmNvbmN1cnJlbnQuTWFuYWdlZFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZTssIGZvciBKYXZhIFNFIGl0IHdvdWxkIGJlCisgICAgICAgICAgICAgICAgPGxpdGVyYWw+Rm9ya0pvaW5Qb29sLmNvbW1vblBvb2w8L2xpdGVyYWw+IGZvciBFeGVjdXRvciBzZXJ2aWNlIGFuZCBzb21ldGhpbmcgdW5kZWZpbmVkIGZvciBTY2hlZHVsZWQKKyAgICAgICAgICAgICAgICBleGVjdXRvciBzZXJ2aWNlLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgPHRpdGxlPlNldHRpbmcgSkFYLVJTIENsaWVudCBFeGVjdXRvclNlcnZpY2U8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPkV4ZWN1dG9yU2VydmljZSBteUV4ZWN1dG9yU2VydmljZSA9IEV4ZWN1dG9ycy5uZXdDYWNoZWRUaHJlYWRQb29sKCk7CitDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdCdWlsZGVyKCkuZXhlY3V0b3JTZXJ2aWNlKG15RXhlY3V0b3JTZXJ2aWNlKS5idWlsZCgpOzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDwvc2VjdGlvbj4KKworICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uPgorICAgICAgICA8dGl0bGU+SmF2YSBpbnN0YW5jZXMgYW5kIHR5cGVzIGZvciByZXByZXNlbnRhdGlvbnM8L3RpdGxlPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQWxsIHRoZSBKYXZhIHR5cGVzIGFuZCByZXByZXNlbnRhdGlvbnMgc3VwcG9ydGVkIGJ5IGRlZmF1bHQgb24gdGhlIEplcnNleSBzZXJ2ZXIgc2lkZSBmb3IKKyAgICAgICAgICAgIHJlcXVlc3RzIGFuZCByZXNwb25zZXMgYXJlIGFsc28gc3VwcG9ydGVkIG9uIHRoZSBjbGllbnQgc2lkZS4KKyAgICAgICAgICAgIEZvciBleGFtcGxlLCB0byBwcm9jZXNzIGEgcmVzcG9uc2UgZW50aXR5IChvciByZXByZXNlbnRhdGlvbikgYXMgYSBzdHJlYW0gb2YgYnl0ZXMgdXNlIElucHV0U3RyZWFtIGFzIGZvbGxvd3M6CisKKyAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSI+SW5wdXRTdHJlYW0gaW4gPSByZXNwb25zZS5yZWFkRW50aXR5KElucHV0U3RyZWFtLmNsYXNzKTsKKworLi4uIC8vIFJlYWQgZnJvbSB0aGUgc3RyZWFtCisKK2luLmNsb3NlKCk7CisgICAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorCisgICAgICAgICAgICBOb3RlIHRoYXQgaXQgaXMgaW1wb3J0YW50IHRvIGNsb3NlIHRoZSBzdHJlYW0gYWZ0ZXIgcHJvY2Vzc2luZyBzbyB0aGF0IHJlc291cmNlcyBhcmUgZnJlZWQgdXAuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUbyA8bGl0ZXJhbD5QT1NUPC9saXRlcmFsPiBhIGZpbGUgdXNlIGEgPGxpdGVyYWw+RmlsZTwvbGl0ZXJhbD4gaW5zdGFuY2UgYXMgZm9sbG93czoKKworICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIj5GaWxlIGYgPSAuLi4KKworLi4uCisKK3dlYlRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KGYsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8c2VjdGlvbj4KKyAgICAgICAgICAgIDx0aXRsZT5BZGRpbmcgc3VwcG9ydCBmb3IgbmV3IHJlcHJlc2VudGF0aW9uczwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoZSBzdXBwb3J0IGZvciBuZXcgYXBwbGljYXRpb24tZGVmaW5lZCByZXByZXNlbnRhdGlvbnMgYXMgSmF2YSB0eXBlcyByZXF1aXJlcyB0aGUKKyAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2FtZSBKQVgtUlMgZW50aXR5IHByb3ZpZGVyIGV4dGVuc2lvbiBpbnRlcmZhY2VzIGFzIGZvciB0aGUgc2VydmVyIHNpZGUgSkFYLVJTIEFQSSwgbmFtZWx5CisgICAgICAgICAgICAgICAgJmpheHJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcjsgYW5kICZqYXhycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CisgICAgICAgICAgICAgICAgcmVzcGVjdGl2ZWx5LCBmb3IgcmVxdWVzdCBhbmQgcmVzcG9uc2UgZW50aXRpZXMgKG9yIGluYm91bmQgYW5kIG91dGJvdW5kIHJlcHJlc2VudGF0aW9ucykuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBDbGFzc2VzIG9yIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgcHJvdmlkZXItYmFzZWQgaW50ZXJmYWNlcyBuZWVkIHRvIGJlIHJlZ2lzdGVyZWQgYXMgcHJvdmlkZXJzIHdpdGhpbiB0aGUKKyAgICAgICAgICAgICAgICBKQVgtUlMgb3IgSmVyc2V5IENsaWVudCBBUEkgY29tcG9uZW50cyB0aGF0IGltcGxlbWVudCAmbGl0LmpheHJzLmNvcmUuQ29uZmlndXJhYmxlOyBjb250cmFjdAorICAgICAgICAgICAgICAgICgmbGl0LmpheHJzLmNsaWVudC5DbGllbnRCdWlsZGVyOywgJmxpdC5qYXhycy5jbGllbnQuQ2xpZW50OywgJmxpdC5qYXhycy5jbGllbnQuV2ViVGFyZ2V0OyBvcgorICAgICAgICAgICAgICAgICZsaXQuamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7KSwgYXMgd2FzIHNob3duIGluIHRoZSBlYXJsaWVyIHNlY3Rpb25zLgorICAgICAgICAgICAgICAgIFNvbWUgbWVkaWEgdHlwZXMgYXJlIHByb3ZpZGVkIGluIHRoZSBmb3JtIG9mIEpBWC1SUyAmamF4cnMuY29yZS5GZWF0dXJlOyBhIGNvbmNlcHQgdGhhdCBhbGxvd3MgdGhlIGV4dGVuc2lvbgorICAgICAgICAgICAgICAgIHByb3ZpZGVycyB0byBncm91cCB0b2dldGhlciBtdWx0aXBsZSBkaWZmZXJlbnQgZXh0ZW5zaW9uIHByb3ZpZGVycyBhbmQvb3IgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIGluIG9yZGVyCisgICAgICAgICAgICAgICAgdG8gc2ltcGxpZnkgdGhlIHJlZ2lzdHJhdGlvbiBhbmQgY29uZmlndXJhdGlvbiBvZiB0aGUgcHJvdmlkZWQgZmVhdHVyZSBieSB0aGUgZW5kIHVzZXJzLiBGb3IgZXhhbXBsZSwKKyAgICAgICAgICAgICAgICAmamVyc2V5Lm1lZGlhLk1veHlKc29uRmVhdHVyZTsgY2FuIGJlIHJlZ2lzdGVyIHRvIGVuYWJsZSBhbmQgY29uZmlndXJlIEpTT04gYmluZGluZyBzdXBwb3J0IHZpYSBNT1h5CisgICAgICAgICAgICAgICAgbGlicmFyeS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uPgorICAgICAgICA8dGl0bGU+PGFuY2hvciB4bWw6aWQ9ImNvbm5lY3RvcnMiLz5DbGllbnQgVHJhbnNwb3J0IENvbm5lY3RvcnM8L3RpdGxlPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQnkgZGVmYXVsdCwgdGhlIHRyYW5zcG9ydCBsYXllciBpbiBKZXJzZXkgaXMgcHJvdmlkZWQgYnkgJmxpdC5qZGs2Lkh0dHBVcmxDb25uZWN0aW9uOy4gVGhpcyB0cmFuc3BvcnQgaXMgaW1wbGVtZW50ZWQKKyAgICAgICAgICAgIGluIEplcnNleSB2aWEgJmplcnNleS5jbGllbnQuSHR0cFVybENvbm5lY3RvclByb3ZpZGVyOyB0aGF0IGltcGxlbWVudHMgSmVyc2V5LXNwZWNpZmljICZqZXJzZXkuY2xpZW50LkNvbm5lY3RvcjsgU1BJLgorICAgICAgICAgICAgWW91IGNhbiBpbXBsZW1lbnQgYW5kL29yIHJlZ2lzdGVyIHlvdXIgb3duICZsaXQuamVyc2V5LmNsaWVudC5Db25uZWN0b3I7IGluc3RhbmNlIHRvIHRoZSBKZXJzZXkKKyAgICAgICAgICAgICZsaXQuamF4cnMuY2xpZW50LkNsaWVudDsgaW1wbGVtZW50YXRpb24sIHRoYXQgd2lsbCByZXBsYWNlIHRoZSBkZWZhdWx0ICZsaXQuamRrNi5IdHRwVXJsQ29ubmVjdGlvbjstYmFzZWQKKyAgICAgICAgICAgIHRyYW5zcG9ydCBsYXllci4gSmVyc2V5IHByb3ZpZGVzIHNldmVyYWwgYWx0ZXJuYXRpdmUgY2xpZW50IHRyYW5zcG9ydCBjb25uZWN0b3IgaW1wbGVtZW50YXRpb25zIHRoYXQgYXJlIHJlYWR5LXRvLXVzZS4KKworICAgICAgICAgICAgPHRhYmxlPgorICAgICAgICAgICAgICAgIDx0aXRsZT5MaXN0IG9mIEplcnNleSBDb25uZWN0b3JzPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8dGdyb3VwIGNvbHM9JzMnIGFsaWduPSdsZWZ0JyBjb2xzZXA9JzEnIHJvd3NlcD0nMSc+CisgICAgICAgICAgICAgICAgICAgIDxjb2xzcGVjIGNvbG5hbWU9ImMxIi8+CisgICAgICAgICAgICAgICAgICAgIDxjb2xzcGVjIGNvbG5hbWU9ImMyIi8+CisgICAgICAgICAgICAgICAgICAgIDxjb2xzcGVjIGNvbG5hbWU9ImMzIi8+CisgICAgICAgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PlRyYW5zcG9ydCBmcmFtZXdvcms8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT5KZXJzZXkgQ29ubmVjdG9yIGltcGxlbWVudGF0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+TWF2ZW4gZGVwZW5kZW5jeTwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+R3JpenpseSBOSU8gZnJhbWV3b3JrPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+JmplcnNleS5ncml6emx5LkdyaXp6bHlDb25uZWN0b3JQcm92aWRlcjs8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb25uZWN0b3JzOmplcnNleS1ncml6emx5LWNvbm5lY3RvcjwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT5BcGFjaGUgSFRUUCBjbGllbnQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4mamVyc2V5LmFwYWNoZS5BcGFjaGVDb25uZWN0b3JQcm92aWRlcjs8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb25uZWN0b3JzOmplcnNleS1hcGFjaGUtY29ubmVjdG9yPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PkpldHR5IEhUVFAgY2xpZW50PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+JmplcnNleS5qZXR0eS5KZXR0eUNvbm5lY3RvclByb3ZpZGVyOzwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbm5lY3RvcnM6amVyc2V5LWpldHR5LWNvbm5lY3RvcjwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT5OZXR0eSBOSU8gZnJhbWV3b3JrPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+JmplcnNleS5uZXR0eS5OZXR0eUNvbm5lY3RvclByb3ZpZGVyOzwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbm5lY3RvcnM6amVyc2V5LW5ldHR5LWNvbm5lY3RvcjwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT5KREsgTklPIGNsaWVudDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PiZqZXJzZXkuamRrLkpka0Nvbm5lY3RvclByb3ZpZGVyOzwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbm5lY3RvcnM6amVyc2V5LWpkay1jb25uZWN0b3I8L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICAgICAgPC90YWJsZT4KKworICAgICAgICAgICAgPHdhcm5pbmcgeG1sOmlkPSJjb25uZWN0b3JzLndhcm5pbmciIHhyZWZsYWJlbD0iSGVhZGVyIG1vZGlmaWNhdGlvbiBpc3N1ZSI+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEJlIGF3YXJlIG9mIHVzaW5nIG90aGVyIHRoYW4gZGVmYXVsdCAmbGl0LmplcnNleS5jbGllbnQuQ29ubmVjdG9yOyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgVGhlcmUgaXMgYW4gaXNzdWUgaGFuZGxpbmcgSFRUUCBoZWFkZXJzIGluCisgICAgICAgICAgICAgICAgICAgICZsaXQuamF4cnMuV3JpdGVySW50ZXJjZXB0b3I7IG9yICZsaXQuamF4cnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOy4KKyAgICAgICAgICAgICAgICAgICAgSWYgeW91IG5lZWQgdG8gY2hhbmdlIGhlYWRlciBmaWVsZHMgZG8gbm90IHVzZSBub3IKKyAgICAgICAgICAgICAgICAgICAgJmxpdC5qZXJzZXkuYXBhY2hlLkFwYWNoZUNvbm5lY3RvclByb3ZpZGVyOyBub3IgJmxpdC5qZXJzZXkuZ3JpenpseS5Hcml6emx5Q29ubmVjdG9yUHJvdmlkZXI7CisgICAgICAgICAgICAgICAgICAgIG5vciAmbGl0LmplcnNleS5qZXR0eS5KZXR0eUNvbm5lY3RvclByb3ZpZGVyOyBuZWl0aGVyICZsaXQuamVyc2V5Lm5ldHR5Lk5ldHR5Q29ubmVjdG9yUHJvdmlkZXI7LgorICAgICAgICAgICAgICAgICAgICBUaGUgaXNzdWUgZm9yIGV4YW1wbGUgYXBwbGllcyB0byBKZXJzZXkgPHhyZWYgbGlua2VuZD0ibXVsdGlwYXJ0IiBlbmR0ZXJtPSJtdWx0aXBhcnQuc2hvcnQiLz4KKyAgICAgICAgICAgICAgICAgICAgZmVhdHVyZSB0aGF0IGFsc28gbW9kaWZpZXMgSFRUUCBoZWFkZXJzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgT24gdGhlIG90aGVyIGhhbmQsIGluIHRoZSBkZWZhdWx0IHRyYW5zcG9ydCBjb25uZWN0b3IsIHRoZXJlIGFyZSBzb21lIHJlc3RyaWN0aW9ucyBvbiB0aGUgaGVhZGVycywgdGhhdAorICAgICAgICAgICAgICAgICAgICBjYW4gYmUgc2VudCBpbiB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uLgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5IdHRwVXJsQ29ubmVjdG9yUHJvdmlkZXI8L2xpdGVyYWw+IHVzZXMgJmxpdC5qZGs2Lkh0dHBVcmxDb25uZWN0aW9uOyBhcyBhbiB1bmRlcmx5aW5nIGNvbm5lY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24uIFRoaXMgSkRLIGNsYXNzIGJ5IGRlZmF1bHQgcmVzdHJpY3RzIHRoZSB1c2Ugb2YgZm9sbG93aW5nIGhlYWRlcnM6CisgICAgICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+JmxpdC5odHRwLmhlYWRlci5BY2Nlc3NDb250cm9sUmVxdWVzdEhlYWRlcnM7PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4mbGl0Lmh0dHAuaGVhZGVyLkFjY2Vzc0NvbnRyb2xSZXF1ZXN0TWV0aG9kOzwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+JmxpdC5odHRwLmhlYWRlci5Db25uZWN0aW9uOyAod2l0aCBvbmUgZXhjZXB0aW9uIC0gJmxpdC5odHRwLmhlYWRlci5Db25uZWN0aW9uOyBoZWFkZXIgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIDxsaXRlcmFsPkNsb3NlZDwvbGl0ZXJhbD4gaXMgYWxsb3dlZCBieSBkZWZhdWx0KTwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+JmxpdC5odHRwLmhlYWRlci5Db250ZW50TGVuZ3RoOzwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+JmxpdC5odHRwLmhlYWRlci5Db250ZW50VHJhbnNmZXJFbmNvZGluZzs8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPiZsaXQuaHR0cC5oZWFkZXIuSG9zdDs8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPiZsaXQuaHR0cC5oZWFkZXIuS2VlcC1BbGl2ZTs8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPiZsaXQuaHR0cC5oZWFkZXIuT3JpZ2luOzwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+JmxpdC5odHRwLmhlYWRlci5UcmFpbGVyOzwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+JmxpdC5odHRwLmhlYWRlci5UcmFuc2Zlci1FbmNvZGluZzs8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPiZsaXQuaHR0cC5oZWFkZXIuVXBncmFkZTs8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPiZsaXQuaHR0cC5oZWFkZXIuVmlhOzwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+YWxsIHRoZSBoZWFkZXJzIHN0YXJ0aW5nIHdpdGggJmxpdC5odHRwLmhlYWRlci5TZWMucHJlZml4OzwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICBUaGUgdW5kZXJseWluZyBjb25uZWN0aW9uIGNhbiBiZSBjb25maWd1cmVkIHRvIHBlcm1pdCBhbGwgaGVhZGVycyB0byBiZSBzZW50LAorICAgICAgICAgICAgICAgICAgICBob3dldmVyIHRoaXMgYmVoYXZpb3VyIGNhbiBiZSBjaGFuZ2VkIG9ubHkgYnkgc2V0dGluZyB0aGUgc3lzdGVtIHByb3BlcnR5CisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPnN1bi5uZXQuaHR0cC5hbGxvd1Jlc3RyaWN0ZWRIZWFkZXJzPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGl0bGU+U2VuZGluZyByZXN0cmljdGVkIGhlYWRlcnMgd2l0aCA8bGl0ZXJhbD5IdHRwVXJsQ29ubmVjdG9yPC9saXRlcmFsPjwvdGl0bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoInN1bi5uZXQuaHR0cC5hbGxvd1Jlc3RyaWN0ZWRIZWFkZXJzIiwgInRydWUiKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gY2xpZW50LnRhcmdldCh5b3VyVXJpKS5wYXRoKHlvdXJQYXRoKS5yZXF1ZXN0KCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyKCJPcmlnaW4iLCAiaHR0cDovL2V4YW1wbGUuY29tIikuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyKCJBY2Nlc3MtQ29udHJvbC1SZXF1ZXN0LU1ldGhvZCIsICJQT1NUIikuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBOb3RlLCB0aGF0IGludGVybmFsbHkgdGhlICZsaXQuamRrNi5IdHRwVXJsQ29ubmVjdGlvbjsgaW5zdGFuY2VzIGFyZSBwb29sZWQsIHNvICh1bilzZXR0aW5nIHRoZQorICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSBhZnRlciBhbHJlYWR5IGNyZWF0aW5nIGEgdGFyZ2V0IHR5cGljYWxseSBkb2VzIG5vdCBoYXZlIGFueSBlZmZlY3QuCisgICAgICAgICAgICAgICAgICAgIFRoZSBwcm9wZXJ0eSBpbmZsdWVuY2VzIGFsbCB0aGUgY29ubmVjdGlvbnMgPGVtcGhhc2lzPmNyZWF0ZWQ8L2VtcGhhc2lzPiBhZnRlciB0aGUgcHJvcGVydHkgaGFzIGJlZW4KKyAgICAgICAgICAgICAgICAgICAgKHVuKXNldCwgYnV0IHRoZXJlIGlzIG5vIGd1YXJhbnRlZSwgdGhhdCB5b3VyIHJlcXVlc3Qgd2lsbCB1c2UgYSBjb25uZWN0aW9uCisgICAgICAgICAgICAgICAgICAgIGNyZWF0ZWQgYWZ0ZXIgdGhlIHByb3BlcnR5IGNoYW5nZS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEluIGEgc2ltcGxlIGVudmlyb25tZW50LCBzZXR0aW5nIHRoZSBwcm9wZXJ0eSBiZWZvcmUgY3JlYXRpbmcgdGhlIGZpcnN0IHRhcmdldCBpcyBzdWZmaWNpZW50LCBidXQgaW4gY29tcGxleAorICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudHMgKHN1Y2ggYXMgYXBwbGljYXRpb24gc2VydmVycyksIHdoZXJlIHNvbWUgcG9vbGFibGUgY29ubmVjdGlvbnMgbWlnaHQgZXhpc3QgYmVmb3JlIHlvdXIKKyAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gZXZlbiBib290c3RyYXBzLCB0aGlzIGFwcHJvYWNoIGlzIG5vdCAxMDAlIHJlbGlhYmxlIGFuZCB3ZSByZWNvbW1lbmQgdXNpbmcgYSBkaWZmZXJlbnQgY2xpZW50CisgICAgICAgICAgICAgICAgICAgIHRyYW5zcG9ydCBjb25uZWN0b3IsIHN1Y2ggYXMgQXBhY2hlIENvbm5lY3Rvci4KKyAgICAgICAgICAgICAgICAgICAgVGhlc2UgbGltaXRhdGlvbnMgaGF2ZSB0byBiZSBjb25zaWRlcmVkIGVzcGVjaWFsbHkgd2hlbiBpbnZva2luZyA8ZW1waGFzaXM+Q09SUzwvZW1waGFzaXM+IChDcm9zcyBPcmlnaW4KKyAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2UgU2hhcmluZykgcmVxdWVzdHMuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC93YXJuaW5nPgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQXMgaW5kaWNhdGVkIGVhcmxpZXIsICZqZXJzZXkuY2xpZW50LkNvbm5lY3RvcjsgYW5kICZqZXJzZXkuY2xpZW50LkNvbm5lY3RvclByb3ZpZGVyOyBjb250cmFjdHMgYXJlIEplcnNleS1zcGVjaWZpYworICAgICAgICAgICAgZXh0ZW5zaW9uIEFQSXMgdGhhdCB3b3VsZCBvbmx5IHdvcmsgd2l0aCBKZXJzZXkgYW5kIGFzIHN1Y2ggYXJlIG5vdCBwYXJ0IG9mIEpBWC1SUy4gRm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93IHRvCisgICAgICAgICAgICBzZXR1cCB0aGUgY3VzdG9tIEdyaXp6bHkgQXN5bmNocm9ub3VzIEhUVFAgQ2xpZW50IGJhc2VkICZsaXQuamVyc2V5LmNsaWVudC5Db25uZWN0b3JQcm92aWRlcjsgaW4gYSBKZXJzZXkgY2xpZW50CisgICAgICAgICAgICBpbnN0YW5jZToKKworICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+Q2xpZW50Q29uZmlnIGNsaWVudENvbmZpZyA9IG5ldyBDbGllbnRDb25maWcoKTsKK2NsaWVudENvbmZpZy5jb25uZWN0b3JQcm92aWRlcihuZXcgR3JpenpseUNvbm5lY3RvclByb3ZpZGVyKCkpOworQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KGNsaWVudENvbmZpZyk7PC9wcm9ncmFtbGlzdGluZz4KKworICAgICAgICAgICAgJmxpdC5qYXhycy5jbGllbnQuQ2xpZW50OyBhY2NlcHRzIGFzIGFzIGEgY29uc3RydWN0b3IgYXJndW1lbnQgYSAmbGl0LmpheHJzLmNvcmUuQ29uZmlndXJhYmxlOyBpbnN0YW5jZS4gSmVyc2V5CisgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgJmxpdC5qYXhycy5jb3JlLkNvbmZpZ3VyYWJsZTsgcHJvdmlkZXIgZm9yIHRoZSBjbGllbnQgaXMgJmxpdC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsuCisgICAgICAgICAgICBCeSB1c2luZyB0aGUgSmVyc2V5ICZsaXQuamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7IHlvdSBjYW4gY29uZmlndXJlIHRoZSBjdXN0b20KKyAgICAgICAgICAgICZsaXQuamVyc2V5LmNsaWVudC5Db25uZWN0b3JQcm92aWRlcjsKKyAgICAgICAgICAgIGludG8gdGhlICZsaXQuamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7LiBUaGUgJmxpdC5qZXJzZXkuZ3JpenpseS5Hcml6emx5Q29ubmVjdG9yUHJvdmlkZXI7IGlzIHVzZWQgYXMgYSBjdXN0b20KKyAgICAgICAgICAgIGNvbm5lY3RvciBwcm92aWRlciBpbiB0aGUgZXhhbXBsZSBhYm92ZS4gUGxlYXNlIG5vdGUgdGhhdCB0aGUgY29ubmVjdG9yIHByb3ZpZGVyIGNhbm5vdCBiZSByZWdpc3RlcmVkIGFzIGEgcHJvdmlkZXIKKyAgICAgICAgICAgIHVzaW5nICZsaXQuamF4cnMuY29yZS5Db25maWd1cmFibGU7PGxpdGVyYWw+LnJlZ2lzdGVyKC4uLik8L2xpdGVyYWw+LiBBbHNvLCBwbGVhc2Ugbm90ZSB0aGF0IGluIHRoaXMgQVBJIGhhcyBjaGFuZ2VkCisgICAgICAgICAgICBpbiBKZXJzZXkgMi41LCB3aGVyZSB0aGUgJmxpdC5qZXJzZXkuY2xpZW50LkNvbm5lY3RvclByb3ZpZGVyOyBTUEkgaGFzIGJlZW4gaW50cm9kdWNlZCBpbiBvcmRlciB0byBkZWNvdXBsZSBjbGllbnQKKyAgICAgICAgICAgIGluaXRpYWxpemF0aW9uIGZyb20gdGhlIGNvbm5lY3RvciBpbnN0YW50aWF0aW9uLiBTdGFydGluZyB3aXRoIEplcnNleSAyLjUgaXQgaXMgdGhlcmVmb3JlIG5vdCBwb3NzaWJsZSB0byBkaXJlY3RseQorICAgICAgICAgICAgcmVnaXN0ZXIgJmxpdC5qZXJzZXkuY2xpZW50LkNvbm5lY3RvcjsgaW5zdGFuY2VzIGluIHRoZSBKZXJzZXkgJmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOy4gVGhlIG5ldworICAgICAgICAgICAgJmxpdC5qZXJzZXkuY2xpZW50LkNvbm5lY3RvclByb3ZpZGVyOyBTUEkgbXVzdCBiZSB1c2VkIGluc3RlYWQgdG8gY29uZmlndXJlIGEgY3VzdG9tIGNsaWVudC1zaWRlIHRyYW5zcG9ydCBjb25uZWN0b3IuCisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbj4KKyAgICAgICAgPHRpdGxlPlVzaW5nIGNsaWVudCByZXF1ZXN0IGFuZCByZXNwb25zZSBmaWx0ZXJzPC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEZpbHRlcmluZyByZXF1ZXN0cyBhbmQgcmVzcG9uc2VzIGNhbiBwcm92aWRlIHVzZWZ1bCBsb3dlci1sZXZlbCBjb25jZXB0IGZvY3VzZWQgb24gYSBjZXJ0YWluIGluZGVwZW5kZW50IGFzcGVjdCBvcgorICAgICAgICAgICAgZG9tYWluIHRoYXQgaXMgZGVjb3VwbGVkIGZyb20gdGhlIGFwcGxpY2F0aW9uIGxheWVyIG9mIGJ1aWxkaW5nIGFuZCBzZW5kaW5nIHJlcXVlc3RzLCBhbmQgcHJvY2Vzc2luZyByZXNwb25zZXMuCisgICAgICAgICAgICBGaWx0ZXJzIGNhbiByZWFkL21vZGlmeSB0aGUgcmVxdWVzdCBVUkksIGhlYWRlcnMgYW5kIGVudGl0eSBvciByZWFkL21vZGlmeSB0aGUgcmVzcG9uc2Ugc3RhdHVzLCBoZWFkZXJzIGFuZCBlbnRpdHkuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBKZXJzZXkgY29udGFpbnMgdGhlIGZvbGxvd2luZyB1c2VmdWwgY2xpZW50LXNpZGUgZmlsdGVycyAoYW5kIGZlYXR1cmVzIHJlZ2lzdGVyaW5nIGZpbHRlcnMpCisgICAgICAgICAgICB0aGF0IHlvdSBtYXkgd2FudCB0byB1c2UgaW4geW91ciBhcHBsaWNhdGlvbnM6CisKKyAgICAgICAgICAgIDxzaW1wbGVsaXN0PgorICAgICAgICAgICAgICAgIDxtZW1iZXI+JmplcnNleS5jbGllbnQuQ3NyZlByb3RlY3Rpb25GaWx0ZXI7OiBDcm9zcy1zaXRlIHJlcXVlc3QgZm9yZ2VyeSBwcm90ZWN0aW9uIGZpbHRlciAoYWRkcworICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5YLVJlcXVlc3RlZC1CeTwvbGl0ZXJhbD4gdG8gZWFjaCBzdGF0ZSBjaGFuZ2luZyByZXF1ZXN0KS48L21lbWJlcj4KKyAgICAgICAgICAgICAgICA8bWVtYmVyPiZqZXJzZXkuY2xpZW50LkVuY29kaW5nRmVhdHVyZTs6IEZlYXR1cmUgdGhhdCByZWdpc3RlcnMgZW5jb2RpbmcgZmlsdGVyIHdoaWNoIHVzZSByZWdpc3RlcmVkCisgICAgICAgICAgICAgICAgICAgICZqZXJzZXkuY29tbW9uLnNwaS5Db250ZW50RW5jb2RlcjtzIHRvIGVuY29kZSBhbmQgZGVjb2RlIHRoZSBjb21tdW5pY2F0aW9uLiBUaGUgZW5jb2RpbmcvZGVjb2RpbmcgaXMgcGVyZm9ybWVkCisgICAgICAgICAgICAgICAgICAgIGluIGludGVyY2VwdG9yICh5b3UgZG9uJ3QgbmVlZCB0byByZWdpc3RlciB0aGlzIGludGVyY2VwdG9yKS4gQ2hlY2sgdGhlIGphdmFkb2Mgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgICZqZXJzZXkuY2xpZW50LkVuY29kaW5nRmVhdHVyZTsgaW4gb3JkZXIgdG8gdXNlIGl0LjwvbWVtYmVyPgorICAgICAgICAgICAgICAgIDxtZW1iZXI+JmplcnNleS5jbGllbnQuSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZTs6IEhUVFAgQXV0aGVudGljYXRpb24gRmVhdHVyZQorICAgICAgICAgICAgICAgICAgICAoc2VlIDx4cmVmIGxpbmtlbmQ9InNzbCIgLz4KKyAgICAgICAgICAgICAgICAgICAgYmVsb3cpLjwvbWVtYmVyPgorICAgICAgICAgICAgPC9zaW1wbGVsaXN0PgorCisgICAgICAgICAgICBOb3RlIHRoYXQgdGhlc2UgZmVhdHVyZXMgYXJlIHByb3ZpZGVkIGJ5IEplcnNleSwgYnV0IHNpbmNlIHRoZXkgdXNlIGFuZCBpbXBsZW1lbnQgSkFYLVJTIEFQSSwgdGhlIGZlYXR1cmVzIHNob3VsZAorICAgICAgICAgICAgYmUgcG9ydGFibGUgYW5kIHJ1biBpbiBhbnkgSkFYLVJTIGltcGxlbWVudGF0aW9uLCBub3QganVzdCBKZXJzZXkuIFNlZSA8eHJlZiBsaW5rZW5kPSJmaWx0ZXJzLWFuZC1pbnRlcmNlcHRvcnMiIC8+CisgICAgICAgICAgICBjaGFwdGVyIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGZpbHRlcnMgYW5kIGludGVyY2VwdG9ycy4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uPgorICAgICAgICA8dGl0bGU+Q2xvc2luZyBjb25uZWN0aW9uczwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaGUgdW5kZXJseWluZyBjb25uZWN0aW9ucyBhcmUgb3BlbmVkIGZvciBlYWNoIHJlcXVlc3QKKyAgICAgICAgICAgIGFuZCBjbG9zZWQgYWZ0ZXIgdGhlIHJlc3BvbnNlIGlzIHJlY2VpdmVkIGFuZCBlbnRpdHkgaXMgcHJvY2Vzc2VkIChlbnRpdHkgaXMgcmVhZCkuIFNlZSB0aGUKKyAgICAgICAgICAgIGZvbGxvd2luZyBleGFtcGxlOgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgPHRpdGxlPkNsb3NpbmcgY29ubmVjdGlvbnM8L3RpdGxlPgorICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+ZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IC4uLiBzb21lIHdlYiB0YXJnZXQKK1Jlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnBhdGgoInJlc291cmNlIikucmVxdWVzdCgpLmdldCgpOworU3lzdGVtLm91dC5wcmludGxuKCJDb25uZWN0aW9uIGlzIHN0aWxsIG9wZW4uIik7CitTeXN0ZW0ub3V0LnByaW50bG4oInN0cmluZyByZXNwb25zZTogIiArIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CitTeXN0ZW0ub3V0LnByaW50bG4oIk5vdyB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQuIik7PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBJZiB5b3UgZG9uJ3QgcmVhZCB0aGUgZW50aXR5LCB0aGVuIHlvdSBuZWVkIHRvIGNsb3NlIHRoZSByZXNwb25zZSBtYW51YWxseSBieQorICAgICAgICAgICAgPGxpdGVyYWw+cmVzcG9uc2UuY2xvc2UoKTwvbGl0ZXJhbD4uIEFsc28gaWYgdGhlIGVudGl0eSBpcyByZWFkIGludG8gYW4gJmpkazYuSW5wdXRTdHJlYW07CisgICAgICAgICAgICAoYnkgPGxpdGVyYWw+cmVzcG9uc2UucmVhZEVudGl0eShJbnB1dFN0cmVhbS5jbGFzcyk8L2xpdGVyYWw+KSwgdGhlIGNvbm5lY3Rpb24gc3RheXMgb3BlbiB1bnRpbAorICAgICAgICAgICAgeW91IGZpbmlzaCByZWFkaW5nIGZyb20gdGhlICZsaXQuamRrNi5JbnB1dFN0cmVhbTsuIEluIHRoYXQgY2FzZSwgdGhlIElucHV0U3RyZWFtCisgICAgICAgICAgICBvciB0aGUgUmVzcG9uc2Ugc2hvdWxkIGJlIGNsb3NlZCBtYW51YWxseSBhdCB0aGUgZW5kIG9mIHJlYWRpbmcgZnJvbSBJbnB1dFN0cmVhbS4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uPgorICAgICAgICA8dGl0bGU+SW5qZWN0aW9ucyBpbnRvIGNsaWVudCBwcm92aWRlcnM8L3RpdGxlPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgSW4gc29tZSBjYXNlcyB5b3UgbWlnaHQgbmVlZCB0byBpbmplY3Qgc29tZSBjdXN0b20gdHlwZXMgaW50byB5b3VyIGNsaWVudCBwcm92aWRlciBpbnN0YW5jZS4gSkFYLVJTCisgICAgICAgICAgICB0eXBlcyBkbyBub3QgbmVlZCB0byBiZSBpbmplY3RlZCBhcyB0aGV5IGFyZSBwYXNzZWQgYXMgYXJndW1lbnRzIGludG8gQVBJIG1ldGhvZHMuCisgICAgICAgICAgICBJbmplY3Rpb25zIGludG8gY2xpZW50IHByb3ZpZGVycyAoZmlsdGVycywgaW50ZXJjZXB0b3IpIGFyZSBwb3NzaWJsZSBhcyBsb25nIGFzIHRoZSBwcm92aWRlciBpcworICAgICAgICAgICAgcmVnaXN0ZXJlZCBhcyBhIGNsYXNzLiBJZiB0aGUgcHJvdmlkZXIgaXMgcmVnaXN0ZXJlZCBhcyBhbiBpbnN0YW5jZSB0aGVuIHJ1bnRpbWUgd2lsbCBub3QgaW5qZWN0CisgICAgICAgICAgICB0aGUgcHJvdmlkZXIuIFRoZSByZWFzb24gaXMgdGhhdCB0aGlzIHByb3ZpZGVyIGluc3RhbmNlIG1pZ2h0IGJlIHJlZ2lzdGVyZWQgaW50byBtdWx0aXBsZSBjbGllbnQKKyAgICAgICAgICAgIGNvbmZpZ3VyYXRpb25zLiBGb3IgZXhhbXBsZSBvbmUgaW5zdGFuY2Ugb2YgJmpheHJzLmNsaWVudC5DbGllbnRSZXF1ZXN0RmlsdGVyOyBjYW4gYmUgcmVnaXN0ZXJlZAorICAgICAgICAgICAgdG8gdHdvICZqYXhycy5jbGllbnQuQ2xpZW50O3MuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUbyBzb2x2ZSBpbmplY3Rpb24gb2YgYSBjdXN0b20gdHlwZSBpbnRvIGEgY2xpZW50IHByb3ZpZGVyIGluc3RhbmNlCisgICAgICAgICAgICB1c2UgJmplcnNleS5jbGllbnQuU2VydmljZUxvY2F0b3JDbGllbnRQcm92aWRlcjsgdG8KKyAgICAgICAgICAgIGV4dHJhY3QgJmhrMi5TZXJ2aWNlTG9jYXRvcjsgd2hpY2ggY2FuIHJldHVybiB0aGUgcmVxdWlyZWQgaW5qZWN0aW9uLiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93IHRvIHV0aWxpemUKKyAgICAgICAgICAgICZsaXQuamVyc2V5LmNsaWVudC5TZXJ2aWNlTG9jYXRvckNsaWVudFByb3ZpZGVyOzoKKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgIDx0aXRsZT5TZXJ2aWNlTG9jYXRvckNsaWVudFByb3ZpZGVyIGV4YW1wbGU8L3RpdGxlPgorICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+cHVibGljIHN0YXRpYyBjbGFzcyBNeVJlcXVlc3RGaWx0ZXIgaW1wbGVtZW50cyBDbGllbnRSZXF1ZXN0RmlsdGVyIHsKKyAgICAvLyB0aGlzIGluamVjdGlvbiBkb2VzIG5vdCB3b3JrIGFzIGZpbHRlciBpcyByZWdpc3RlcmVkIGFzIGFuIGluc3RhbmNlOgorICAgIC8vIEBJbmplY3QKKyAgICAvLyBwcml2YXRlIE15SW5qZWN0ZWRTZXJ2aWNlIHNlcnZpY2U7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ2xpZW50UmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIHVzZSBTZXJ2aWNlTG9jYXRvckNsaWVudFByb3ZpZGVyIHRvIGV4dHJhY3QgSEsyIFNlcnZpY2VMb2NhdG9yIGZyb20gcmVxdWVzdAorICAgICAgICBmaW5hbCBTZXJ2aWNlTG9jYXRvciBsb2NhdG9yID0gU2VydmljZUxvY2F0b3JDbGllbnRQcm92aWRlci5nZXRTZXJ2aWNlTG9jYXRvcihyZXF1ZXN0Q29udGV4dCk7CisKKyAgICAgICAgLy8gYW5kIGFzayBmb3IgTXlJbmplY3RlZFNlcnZpY2U6CisgICAgICAgIGZpbmFsIE15SW5qZWN0ZWRTZXJ2aWNlIHNlcnZpY2UgPSBsb2NhdG9yLmdldFNlcnZpY2UoTXlJbmplY3RlZFNlcnZpY2UuY2xhc3MpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gc2VydmljZS5nZXROYW1lKCk7CisgICAgICAgIC4uLgorICAgIH0KK308L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIGphdmFkb2Mgb2YgJmplcnNleS5jbGllbnQuU2VydmljZUxvY2F0b3JDbGllbnRQcm92aWRlcjsKKyAgICAgICAgICAgIChhbmQgamF2YWRvYyBvZiAmamVyc2V5LmNvbW1vbi5TZXJ2aWNlTG9jYXRvclByb3ZpZGVyOyB3aGljaCBzdXBwb3J0cyBjb21tb24gSkFYLVJTIGNvbXBvbmVudHMpLgorICAgICAgICA8L3BhcmE+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24+CisgICAgICAgIDx0aXRsZT5TZWN1cmluZyBhIENsaWVudDwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcyBob3cgdG8gc2V0dXAgU1NMIGNvbmZpZ3VyYXRpb24gb24gSmVyc2V5IGNsaWVudCAodXNpbmcgSkFYLVJTIEFQSSkuIFRoZSBTU0wgY29uZmlndXJhdGlvbiBpcworICAgICAgICAgICAgc2V0dXAgaW4gJmpheHJzLmNsaWVudC5DbGllbnRCdWlsZGVyOy4gVGhlIGNsaWVudCBidWlsZGVyIGNvbnRhaW5zIG1ldGhvZHMgZm9yIGRlZmluaXRpb24gb2YgJmpkazYuS2V5U3RvcmU7LAorICAgICAgICAgICAgJmpkazYuVHJ1c3RTdG9yZTsgb3IgZW50aXJlICZqZGs2LlNzbENvbnRleHQ7LiBTZWUgdGhlIGZvbGxvd2luZyBleGFtcGxlOgorCisgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5TU0xDb250ZXh0IHNzbCA9IC4uLiB5b3VyIGNvbmZpZ3VyZWQgU1NMIGNvbnRleHQ7CitDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdCdWlsZGVyKCkuc3NsQ29udGV4dChzc2wpLmJ1aWxkKCk7CitSZXNwb25zZSByZXNwb25zZSA9IGNsaWVudC50YXJnZXQoImh0dHBzOi8vZXhhbXBsZS5jb20vcmVzb3VyY2UiKS5yZXF1ZXN0KCkuZ2V0KCk7PC9wcm9ncmFtbGlzdGluZz4KKworICAgICAgICAgICAgVGhlIGV4YW1wbGUgYWJvdmUgc2hvd3MgaG93IHRvIHNldHVwIGEgY3VzdG9tICZsaXQuamRrNi5Tc2xDb250ZXh0OyB0byB0aGUgJmxpdC5qYXhycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsuCisgICAgICAgICAgICBDcmVhdGluZyBhICZsaXQuamRrNi5Tc2xDb250ZXh0OyBjYW4gYmUgbW9yZSBkaWZmaWN1bHQgYXMgeW91IG1pZ2h0IG5lZWQgdG8gaW5pdCBpbnN0YW5jZSBwcm9wZXJseSB3aXRoIHRoZSBwcm90b2NvbCwKKyAgICAgICAgICAgICZsaXQuamRrNi5LZXlTdG9yZTssICZsaXQuamRrNi5UcnVzdFN0b3JlOywgZXRjLiBKZXJzZXkgb2ZmZXJzIGEgdXRpbGl0eSAmamVyc2V5LmNvbW1vbi5Tc2xDb25maWd1cmF0b3I7IGNsYXNzIHRoYXQKKyAgICAgICAgICAgIGNhbiBiZSB1c2VkIHRvIHNldHVwIHRoZSAmbGl0LmpkazYuU3NsQ29udGV4dDsuIFRoZSAmbGl0LmplcnNleS5jb21tb24uU3NsQ29uZmlndXJhdG9yOyBjYW4gYmUgY29uZmlndXJlZCBiYXNlZCBvbgorICAgICAgICAgICAgc3RhbmRhcmRpemVkIHN5c3RlbSBwcm9wZXJ0aWVzIGZvciBTU0wgY29uZmlndXJhdGlvbiwgc28gZm9yIGV4YW1wbGUgeW91IGNhbiBjb25maWd1cmUgdGhlICZsaXQuamRrNi5LZXlTdG9yZTsgZmlsZQorICAgICAgICAgICAgbmFtZSB1c2luZyBhIGVudmlyb25tZW50IHZhcmlhYmxlIDxsaXRlcmFsPmphdmF4Lm5ldC5zc2wua2V5U3RvcmU8L2xpdGVyYWw+IGFuZCAmbGl0LmplcnNleS5jb21tb24uU3NsQ29uZmlndXJhdG9yOworICAgICAgICAgICAgd2lsbCB1c2Ugc3VjaCBhIHZhcmlhYmxlIHRvIHNldHVwIHRoZSAmbGl0LmpkazYuU3NsQ29udGV4dDsuIFNlZSBqYXZhZG9jIG9mICZqZXJzZXkuY29tbW9uLlNzbENvbmZpZ3VyYXRvcjsgZm9yIG1vcmUKKyAgICAgICAgICAgIGRldGFpbHMuIFRoZSBmb2xsb3dpbmcgY29kZSBzaG93cyBob3cgYSAmbGl0LmplcnNleS5jb21tb24uU3NsQ29uZmlndXJhdG9yOyBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYSBjdXN0b20gU1NMCisgICAgICAgICAgICBjb250ZXh0LgorCisgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5Tc2xDb25maWd1cmF0b3Igc3NsQ29uZmlnID0gU3NsQ29uZmlndXJhdG9yLm5ld0luc3RhbmNlKCkKKyAgICAgICAgLnRydXN0U3RvcmVGaWxlKCIuL3RydXN0c3RvcmVfY2xpZW50IikKKyAgICAgICAgLnRydXN0U3RvcmVQYXNzd29yZCgic2VjcmV0LXBhc3N3b3JkLWZvci10cnVzdHN0b3JlIikKKyAgICAgICAgLmtleVN0b3JlRmlsZSgiLi9rZXlzdG9yZV9jbGllbnQiKQorICAgICAgICAua2V5UGFzc3dvcmQoInNlY3JldC1wYXNzd29yZC1mb3Ita2V5c3RvcmUiKTsKKworU1NMQ29udGV4dCBzc2xDb250ZXh0ID0gc3NsQ29uZmlnLmNyZWF0ZVNTTENvbnRleHQoKTsKK0NsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0J1aWxkZXIoKS5zc2xDb250ZXh0KHNzbENvbnRleHQpLmJ1aWxkKCk7PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgTm90ZSB0aGF0IHlvdSBjYW4gYWxzbyBzZXR1cCAmbGl0LmpkazYuS2V5U3RvcmU7IGFuZCAmbGl0LmpkazYuVHJ1c3RTdG9yZTsgZGlyZWN0bHkgb24gYQorICAgICAgICAgICAgJmxpdC5qYXhycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsgaW5zdGFuY2Ugd2l0aG91dCB3cmFwcGluZyB0aGVtIGludG8gdGhlICZsaXQuamRrNi5Tc2xDb250ZXh0Oy4gSG93ZXZlciwgaWYgeW91IHNldHVwCisgICAgICAgICAgICBhICZsaXQuamRrNi5Tc2xDb250ZXh0OyBpdCB3aWxsIG92ZXJyaWRlIGFueSBwcmV2aW91c2x5IGRlZmluZWQgJmxpdC5qZGs2LktleVN0b3JlOyBhbmQgJmxpdC5qZGs2LlRydXN0U3RvcmU7CisgICAgICAgICAgICBzZXR0aW5ncy4KKyAgICAgICAgICAgICZsaXQuamF4cnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7IGFsc28gb2ZmZXJzIGEgbWV0aG9kIGZvciBkZWZpbmluZyBhIGN1c3RvbSAmamRrNi5Ib3N0bmFtZVZlcmlmaWVyOyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgICAgICZsaXQuamRrNi5Ib3N0bmFtZVZlcmlmaWVyOyBpbXBsZW1lbnRhdGlvbnMgYXJlIGludm9rZWQgd2hlbiBkZWZhdWx0IGhvc3QgVVJMIHZlcmlmaWNhdGlvbiBmYWlscy4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxpbXBvcnRhbnQ+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBBIGJlaGF2aW91ciBvZiAmamRrNi5Ib3N0bmFtZVZlcmlmaWVyOyBpcyBkZXBlbmRlbnQgb24gYW4gaHR0cCBjbGllbnQgaW1wbGVtZW50YXRpb24uCisgICAgICAgICAgICAgICAgJmxpdC5qZXJzZXkuY2xpZW50Lkh0dHBVcmxDb25uZWN0b3JQcm92aWRlcjsgYW5kICZsaXQuamVyc2V5LmFwYWNoZS5BcGFjaGVDb25uZWN0b3JQcm92aWRlcjsgd29yayBwcm9wZXJseSwgdGhhdCBtZWFucyB0aGF0IGFmdGVyCisgICAgICAgICAgICAgICAgdGhlIHVuc3VjY2Vzc2Z1bCBVUkwgdmVyaWZpY2F0aW9uICZsaXQuamRrNi5Ib3N0bmFtZVZlcmlmaWVyOyBpcyBjYWxsZWQgYW5kIGJ5IG1lYW5zIG9mIGl0IGlzIHBvc3NpYmxlIHRvCisgICAgICAgICAgICAgICAgcmV2YWxpZGF0ZSBVUkwgdXNpbmcgYSBjdXN0b20gaW1wbGVtZW50YXRpb24gb2YgJmxpdC5qZGs2Lkhvc3RuYW1lVmVyaWZpZXI7IGFuZCBnbyBvbiBpbiBhIGhhbmRza2FoZSBwcm9jZXNzaW5nLgorICAgICAgICAgICAgICAgICZsaXQuamVyc2V5LmpldHR5LkpldHR5Q29ubmVjdG9yUHJvdmlkZXI7IGFuZCAmbGl0LmplcnNleS5ncml6emx5LkdyaXp6bHlDb25uZWN0b3JQcm92aWRlcjsgcHJvdmlkZSBvbmx5IGhvc3QgVVJMIHZlcmlmaWNhdGlvbgorICAgICAgICAgICAgICAgIGFuZCB0aHJvdyBhICZsaXQuamRrNi5DZXJ0aWZpY2F0ZUV4Y2VwdGlvbjsgd2l0aG91dCBhbnkgcG9zc2liaWxpdHkgdG8gdXNlIGN1c3RvbSAmbGl0LmpkazYuSG9zdG5hbWVWZXJpZmllcjsuCisgICAgICAgICAgICAgICAgTW9yZW92ZXIsIGluIGNhc2Ugb2YgJmxpdC5qZXJzZXkuamV0dHkuSmV0dHlDb25uZWN0b3JQcm92aWRlcjsgdGhlcmUgaXMgYSBwcm9wZXJ0eQorICAgICAgICAgICAgICAgICZqZXJzZXkuamV0dHkuSmV0dHlDbGllbnRQcm9wZXJ0aWVzLkVOQUJMRV9TU0xfSE9TVE5BTUVfVkVSSUZJQ0FUSU9OOyB0byBkaXNhYmxlIGFuIGVudGlyZSBob3N0IFVSTCB2ZXJpZmljYXRpb24KKyAgICAgICAgICAgICAgICBtZWNoYW5pc20gaW4gYSBoYW5kc2hha2UuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvaW1wb3J0YW50PgorCisgICAgICAgIDxpbXBvcnRhbnQ+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBOb3RlIHRoYXQgdG8gdXRpbGl6ZSBIVFRQIHdpdGggU1NMIGl0IGlzIG5lY2Vzc2FyeSB0byB1dGlsaXplIHRoZSA8bGl0ZXJhbD7igJxodHRwc+KAnTwvbGl0ZXJhbD4gc2NoZW1lLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2ltcG9ydGFudD4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEN1cnJlbnRseSB0aGUgZGVmYXVsdCBjb25uZWN0b3IgcHJvdmlkZXIgJmplcnNleS5jbGllbnQuSHR0cFVybENvbm5lY3RvclByb3ZpZGVyOyBwcm92aWRlcyBjb25uZWN0b3JzIGJhc2VkIG9uCisgICAgICAgICAgICAmbGl0LmpkazYuSHR0cFVybENvbm5lY3Rpb247IHdoaWNoIGltcGxlbWVudCBzdXBwb3J0IGZvciBTU0wgZGVmaW5lZCBieSBKQVgtUlMgY29uZmlndXJhdGlvbiBkaXNjdXNzZWQgaW4gdGhpcworICAgICAgICAgICAgZXhhbXBsZS4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxzZWN0aW9uPgorICAgICAgICAgICAgPHRpdGxlPkh0dHAgQXV0aGVudGljYXRpb24gU3VwcG9ydDwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT5KZXJzZXkgc3VwcG9ydHMgQmFzaWMgYW5kIERpZ2VzdCBIVFRQIEF1dGhlbnRpY2F0aW9uLjwvcGFyYT4KKyAgICAgICAgICAgIDxpbXBvcnRhbnQ+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEluIHZlcnNpb24gcHJpb3IgdG8gSmVyc2V5IDIuNSB0aGUgc3VwcG9ydCB3YXMKKyAgICAgICAgICAgICAgICAgICAgcHJvdmlkZWQgYnkgPGxpdGVyYWw+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LmZpbHRlci5IdHRwQmFzaWNBdXRoRmlsdGVyPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICBhbmQgPGxpdGVyYWw+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LmZpbHRlci5IdHRwRGlnZXN0QXV0aEZpbHRlcjwvbGl0ZXJhbD4uIFNpbmNlIEplcnNleQorICAgICAgICAgICAgICAgICAgICAyLjUgdGhlc2UgZmlsdGVycyBhcmUgZGVwcmVjYXRlZCAoYW5kIHJlbW92ZWQgaW4gMi42KSBhbmQgYm90aCBhdXRoZW50aWNhdGlvbiBtZXRob2RzCisgICAgICAgICAgICAgICAgICAgIGFyZSBwcm92aWRlZCBieSBzaW5nbGUgJmxpdC5qYXhycy5jb3JlLkZlYXR1cmU7CisgICAgICAgICAgICAgICAgICAgICZqZXJzZXkuY2xpZW50Lkh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmU7LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvaW1wb3J0YW50PgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBJbiBvcmRlciB0byBlbmFibGUgaHR0cCBhdXRoZW50aWNhdGlvbiBzdXBwb3J0IGluIEplcnNleSBjbGllbnQgcmVnaXN0ZXIKKyAgICAgICAgICAgICAgICB0aGUgJmplcnNleS5jbGllbnQuSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZTsuIFRoaXMgZmVhdHVyZSBjYW4gcHJvdmlkZSBib3RoIGF1dGhlbnRpY2F0aW9uIG1ldGhvZHMsIGRpZ2VzdAorICAgICAgICAgICAgICAgIGFuZCBiYXNpYy4gRmVhdHVyZSBjYW4gd29yayBpbiB0aGUgZm9sbG93aW5nIG1vZGVzOgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzPkJBU0lDOjwvZW1waGFzaXM+IEJhc2ljIHByZWVtcHRpdmUgYXV0aGVudGljYXRpb24uIEluIHByZWVtcHRpdmUgbW9kZSB0aGUgYXV0aGVudGljYXRpb24gaW5mb3JtYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgc2VuZCBhbHdheXMgd2l0aCBlYWNoIEhUVFAgcmVxdWVzdC4gVGhpcyBtb2RlIGlzIG1vcmUgdXN1YWwgdGhhbiB0aGUgZm9sbG93aW5nIG5vbi1wcmVlbXB0aXZlIG1vZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGlmIHlvdSByZXF1aXJlIEJBU0lDIGF1dGhlbnRpY2F0aW9uIHlvdSB3aWxsIHByb2JhYmx5IHVzZSB0aGlzIHByZWVtcHRpdmUgbW9kZSkuIFRoaXMgbW9kZSBtdXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGNvbWJpbmVkIHdpdGggdXNhZ2Ugb2YgU1NML1RMUyBhcyB0aGUgcGFzc3dvcmQgaXMgc2VuZCBvbmx5IEJBU0U2NCBlbmNvZGVkLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzPkJBU0lDIE5PTi1QUkVFTVBUSVZFOjwvZW1waGFzaXM+QmFzaWMgbm9uLXByZWVtcHRpdmUgYXV0aGVudGljYXRpb24uIEluIG5vbi1wcmVlbXB0aXZlIG1vZGUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9uIGlzIGFkZGVkIG9ubHkgd2hlbiBzZXJ2ZXIgcmVmdXNlcyB0aGUgcmVxdWVzdCB3aXRoIDxsaXRlcmFsPjQwMTwvbGl0ZXJhbD4gc3RhdHVzIGNvZGUgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZW4gdGhlIHJlcXVlc3QgaXMgcmVwZWF0ZWQgd2l0aCBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbi4gVGhpcyBtb2RlIGhhcyBuZWdhdGl2ZSBpbXBhY3Qgb24gdGhlIHBlcmZvcm1hbmNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgYWR2YW50YWdlIGlzIHRoYXQgaXQgZG9lcyBub3Qgc2VuZCBjcmVkZW50aWFscyB3aGVuIHRoZXkgYXJlIG5vdCBuZWVkZWQuIFRoaXMgbW9kZSBtdXN0CisgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGNvbWJpbmVkIHdpdGggdXNhZ2Ugb2YgU1NML1RMUyBhcyB0aGUgcGFzc3dvcmQgaXMgc2VuZCBvbmx5IEJBU0U2NCBlbmNvZGVkLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzPkRJR0VTVDo8L2VtcGhhc2lzPiBIdHRwIGRpZ2VzdCBhdXRoZW50aWNhdGlvbi4gRG9lcyBub3QgcmVxdWlyZSB1c2FnZSBvZiBTU0wvVExTLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzPlVOSVZFUlNBTDo8L2VtcGhhc2lzPiBDb21iaW5hdGlvbiBvZiBiYXNpYyBhbmQgZGlnZXN0IGF1dGhlbnRpY2F0aW9uLiBUaGUgZmVhdHVyZSB3b3JrcyBpbiBub24tcHJlZW1wdGl2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlIHdoaWNoIG1lYW5zIHRoYXQgaXQgc2VuZHMgcmVxdWVzdHMgd2l0aG91dCBhdXRoZW50aWNhdGlvbiBpbmZvcm1hdGlvbi4gSWYgPGxpdGVyYWw+NDAxPC9saXRlcmFsPiBzdGF0dXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZSBpcyByZXR1cm5lZCwgdGhlIHJlcXVlc3QgaXMgcmVwZWF0ZWQgYW5kIGFuIGFwcHJvcHJpYXRlIGF1dGhlbnRpY2F0aW9uIGlzIHVzZWQgYmFzZWQgb24gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhlbnRpY2F0aW9uIHJlcXVlc3RlZCBpbiB0aGUgcmVzcG9uc2UgKGRlZmluZWQgaW4gPGxpdGVyYWw+V1dXLUF1dGhlbnRpY2F0ZTwvbGl0ZXJhbD4gSFRUUCBoZWFkZXIuIFRoZSBmZWF0dXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWVtYmVycyB3aGljaCBhdXRoZW50aWNhdGlvbiByZXF1ZXN0cyB3ZXJlIHN1Y2Nlc3NmdWwgZm9yIGdpdmVuIFVSSSBhbmQgbmV4dCB0aW1lIHRyaWVzIHRvIHByZWVtcHRpdmVseQorICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGUgYWdhaW5zdCB0aGlzIFVSSSB3aXRoIGxhdGVzdCBzdWNjZXNzZnVsIGF1dGhlbnRpY2F0aW9uIG1ldGhvZC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKworCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUbyBpbml0aWFsaXplIHRoZSBmZWF0dXJlIHVzZSBzdGF0aWMgbWV0aG9kcyBhbmQgYnVpbGRlciBvZiB0aGlzIGZlYXR1cmUuIEV4YW1wbGUgb2YgYnVpbGRpbmcgdGhlIGZlYXR1cmUgaW4KKyAgICAgICAgICAgICAgICAgQmFzaWMgYXV0aGVudGljYXRpb24gbW9kZToKKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5IdHRwQXV0aGVudGljYXRpb25GZWF0dXJlIGZlYXR1cmUgPSBIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLmJhc2ljKCJ1c2VyIiwgInN1cGVyU2VjcmV0UGFzc3dvcmQiKTs8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgRXhhbXBsZSBvZiBidWlsZGluZyB0aGUgZmVhdHVyZSBpbiBiYXNpYyBub24tcHJlZW1wdGl2ZSBtb2RlOgorICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPkh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUgZmVhdHVyZSA9IEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUuYmFzaWNCdWlsZGVyKCkKKyAgICAubm9uUHJlZW1wdGl2ZSgpLmNyZWRlbnRpYWxzKCJ1c2VyIiwgInN1cGVyU2VjcmV0UGFzc3dvcmQiKS5idWlsZCgpOzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBZb3UgY2FuIGFsc28gYnVpbGQgdGhlIGZlYXR1cmUgd2l0aG91dCBhbnkgZGVmYXVsdCBjcmVkZW50aWFsczoKKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5IdHRwQXV0aGVudGljYXRpb25GZWF0dXJlIGZlYXR1cmUgPSBIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLmJhc2ljQnVpbGRlcigpLmJ1aWxkKCk7PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICBJbiB0aGlzIGNhc2UgeW91IG5lZWQgdG8gc3VwcGx5IHVzZXJuYW1lIGFuZCBwYXNzd29yZCBmb3IgZWFjaCByZXF1ZXN0IHVzaW5nIHJlcXVlc3QgcHJvcGVydGllczoKKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5SZXNwb25zZSByZXNwb25zZSA9IGNsaWVudC50YXJnZXQoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZXN0L2hvbWVyL2NvbnRhY3QiKS5yZXF1ZXN0KCkKKyAgICAucHJvcGVydHkoSFRUUF9BVVRIRU5USUNBVElPTl9CQVNJQ19VU0VSTkFNRSwgImhvbWVyIikKKyAgICAucHJvcGVydHkoSFRUUF9BVVRIRU5USUNBVElPTl9CQVNJQ19QQVNTV09SRCwgInAxc3dkNzQ1IikuZ2V0KCk7PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICBUaGlzIGFsbG93cyB5b3UgdG8gcmV1c2UgdGhlIHNhbWUgY2xpZW50IGZvciBhdXRoZW50aWNhdGluZyB3aXRoIG1hbnkgZGlmZmVyZW50IGNyZWRlbnRpYWxzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgU2VlIGphdmFkb2Mgb2YgdGhlICZqZXJzZXkuY2xpZW50Lkh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmU7IGZvciBtb3JlIGRldGFpbHMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgPC9zZWN0aW9uPgorCisKKyAgICA8L3NlY3Rpb24+Cis8L2NoYXB0ZXI+CmRpZmYgLS1naXQgYS9kb2NzL3NyYy9tYWluL2RvY2Jvb2svY3VzdC1jaHVua2VkLnhzbCBiL2RvY3Mvc3JjL21haW4vZG9jYm9vay9jdXN0LWNodW5rZWQueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NTIwYjMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3NyYy9tYWluL2RvY2Jvb2svY3VzdC1jaHVua2VkLnhzbApAQCAtMCwwICsxLDcxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKKyAgICAgICAgICAgICAgICB2ZXJzaW9uPSIxLjAiPgorCisgICAgPHhzbDppbXBvcnQgaHJlZj0idXJuOmRvY2JreDpzdHlsZXNoZWV0L2NodW5rLWNvbW1vbi54c2wiLz4KKyAgICA8eHNsOmluY2x1ZGUgaHJlZj0iY3VzdG9taXphdGlvbnMueHNsIi8+CisKKzx4c2w6dGVtcGxhdGUgbmFtZT0iY2h1bmstZWxlbWVudC1jb250ZW50Ij4KKyAgPHhzbDpwYXJhbSBuYW1lPSJwcmV2Ii8+CisgIDx4c2w6cGFyYW0gbmFtZT0ibmV4dCIvPgorICA8eHNsOnBhcmFtIG5hbWU9Im5hdi5jb250ZXh0Ii8+CisgIDx4c2w6cGFyYW0gbmFtZT0iY29udGVudCI+CisgICAgPHhzbDphcHBseS1pbXBvcnRzLz4KKyAgPC94c2w6cGFyYW0+CisKKyAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InVzZXIucHJlcm9vdCIvPgorCisgIDxodG1sPgorICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJodG1sLmhlYWQiPgorICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InByZXYiIHNlbGVjdD0iJHByZXYiLz4KKyAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJuZXh0IiBzZWxlY3Q9IiRuZXh0Ii8+CisgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKworICAgIDxib2R5IGNsYXNzPSJjb250ZW50cyI+CisgICAgPGRpdiBjbGFzcz0iY29udGVudHMiPgorICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImJvZHkuYXR0cmlidXRlcyIvPgorICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InVzZXIuaGVhZGVyLm5hdmlnYXRpb24iLz4KKworICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImhlYWRlci5uYXZpZ2F0aW9uIj4KKyAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InByZXYiIHNlbGVjdD0iJHByZXYiLz4KKyAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5leHQiIHNlbGVjdD0iJG5leHQiLz4KKyAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5hdi5jb250ZXh0IiBzZWxlY3Q9IiRuYXYuY29udGV4dCIvPgorICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKworICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InVzZXIuaGVhZGVyLmNvbnRlbnQiLz4KKworICAgICAgPHhzbDpjb3B5LW9mIHNlbGVjdD0iJGNvbnRlbnQiLz4KKworICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InVzZXIuZm9vdGVyLmNvbnRlbnQiLz4KKworICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImZvb3Rlci5uYXZpZ2F0aW9uIj4KKyAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9InByZXYiIHNlbGVjdD0iJHByZXYiLz4KKyAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5leHQiIHNlbGVjdD0iJG5leHQiLz4KKyAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5hdi5jb250ZXh0IiBzZWxlY3Q9IiRuYXYuY29udGV4dCIvPgorICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKworICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InVzZXIuZm9vdGVyLm5hdmlnYXRpb24iLz4KKyAgICA8L2Rpdj4KKyAgICA8L2JvZHk+CisgIDwvaHRtbD4KKyAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRjaHVuay5hcHBlbmQiLz4KKzwveHNsOnRlbXBsYXRlPgorPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL2RvY3Mvc3JjL21haW4vZG9jYm9vay9jdXN0LXNpbmdsZS54c2wgYi9kb2NzL3NyYy9tYWluL2RvY2Jvb2svY3VzdC1zaW5nbGUueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMDY1NDgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3NyYy9tYWluL2RvY2Jvb2svY3VzdC1zaW5nbGUueHNsCkBAIC0wLDAgKzEsNjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgorICAgICAgICAgICAgICAgIHZlcnNpb249IjEuMCI+CisKKyAgICA8eHNsOmltcG9ydCBocmVmPSJ1cm46ZG9jYmt4OnN0eWxlc2hlZXQvZG9jYm9vay54c2wiLz4KKyAgICA8eHNsOmluY2x1ZGUgaHJlZj0iY3VzdG9taXphdGlvbnMueHNsIi8+CisKKzx4c2w6dGVtcGxhdGUgbWF0Y2g9IioiIG1vZGU9InByb2Nlc3Mucm9vdCI+CisgIDx4c2w6dmFyaWFibGUgbmFtZT0iZG9jIiBzZWxlY3Q9InNlbGY6OioiLz4KKworICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idXNlci5wcmVyb290Ii8+CisgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJyb290Lm1lc3NhZ2VzIi8+CisKKyAgPGh0bWw+CisgICAgPGhlYWQ+CisgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0ic3lzdGVtLmhlYWQuY29udGVudCI+CisgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJub2RlIiBzZWxlY3Q9IiRkb2MiLz4KKyAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iaGVhZC5jb250ZW50Ij4KKyAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9Im5vZGUiIHNlbGVjdD0iJGRvYyIvPgorICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KKyAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJ1c2VyLmhlYWQuY29udGVudCI+CisgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJub2RlIiBzZWxlY3Q9IiRkb2MiLz4KKyAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgPC9oZWFkPgorICAgIDxib2R5IGNsYXNzPSJjb250ZW50cyI+CisgICAgPGRpdiBjbGFzcz0iY29udGVudHMiPgorICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImJvZHkuYXR0cmlidXRlcyIvPgorICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9InVzZXIuaGVhZGVyLmNvbnRlbnQiPgorICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0ibm9kZSIgc2VsZWN0PSIkZG9jIi8+CisgICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgorICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIi8+CisgICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0idXNlci5mb290ZXIuY29udGVudCI+CisgICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJub2RlIiBzZWxlY3Q9IiRkb2MiLz4KKyAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+CisgICAgPC9kaXY+CisgICAgPC9ib2R5PgorICA8L2h0bWw+CisgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkaHRtbC5hcHBlbmQiLz4KKzwveHNsOnRlbXBsYXRlPgorCis8L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvZG9jcy9zcmMvbWFpbi9kb2Nib29rL2N1c3RvbS1kaS54bWwgYi9kb2NzL3NyYy9tYWluL2RvY2Jvb2svY3VzdG9tLWRpLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmUyNzk0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9zcmMvbWFpbi9kb2Nib29rL2N1c3RvbS1kaS54bWwKQEAgLTAsMCArMSw1MzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPCFET0NUWVBFIGNoYXB0ZXIgWzwhRU5USVRZICUgZW50cyBTWVNURU0gImplcnNleS5lbnQiID4gJWVudHM7XT4KKzxjaGFwdGVyIHhtbG5zPSJodHRwOi8vZG9jYm9vay5vcmcvbnMvZG9jYm9vayIKKyAgICAgICAgIHZlcnNpb249IjUuMCIKKyAgICAgICAgIHhtbDpsYW5nPSJlbiIKKyAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIKKyAgICAgICAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vZG9jYm9vay5vcmcvbnMvZG9jYm9vayBodHRwOi8vZG9jYm9vay5vcmcveG1sLzUuMC94c2QvZG9jYm9vay54c2QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayBodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rLnhzZCIKKyAgICAgICAgIHhtbDppZD0iaW9jIj4KKyAgICA8dGl0bGU+Q3VzdG9tIEluamVjdGlvbiBhbmQgTGlmZWN5Y2xlIE1hbmFnZW1lbnQ8L3RpdGxlPgorCisgICAgPHBhcmE+CisgICAgICAgIFNpbmNlIHZlcnNpb24gMi4wLCBKZXJzZXkgdXNlcyAmaGsyLmxpbms7IGxpYnJhcnkgZm9yIGNvbXBvbmVudCBsaWZlIGN5Y2xlIG1hbmFnZW1lbnQgYW5kIGRlcGVuZGVuY3kgaW5qZWN0aW9uLgorICAgICAgICBSYXRoZXIgdGhhbiBzcGVuZGluZyBhIGxvdCBvZiBlZmZvcnQgaW4gbWFpbnRhaW5pbmcgSmVyc2V5IHNwZWNpZmljIEFQSSAoYXMgaXQgdXNlZCB0byBiZSBiZWZvcmUgSmVyc2V5IDIuMCB2ZXJzaW9uKSwKKyAgICAgICAgSmVyc2V5IGRlZmluZXMgc2V2ZXJhbCBleHRlbnNpb24gcG9pbnRzIHdoZXJlIGVuZC11c2VyIGFwcGxpY2F0aW9uIGNhbiBkaXJlY3RseSBtYW5pcHVsYXRlIEplcnNleSBISzIgYmluZGluZ3MKKyAgICAgICAgdXNpbmcgdGhlIEhLMiBwdWJsaWMgQVBJIHRvIGN1c3RvbWl6ZSBsaWZlIGN5Y2xlIG1hbmFnZW1lbnQgYW5kIGRlcGVuZGVuY3kgaW5qZWN0aW9uIG9mIGFwcGxpY2F0aW9uIGNvbXBvbmVudHMuCisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+CisgICAgICAgIEplcnNleSB1c2VyIGd1aWRlIGNhbiBieSBubyBtZWFucyBzdXBwbHkgYW4gZXhoYXVzdGl2ZSBkb2N1bWVudGF0aW9uIG9mIEhLMiBBUEkgaW4gaXQncyBlbnRpcmUgc2NvcGUuCisgICAgICAgIFRoaXMgY2hhcHRlciBvbmx5IHBvaW50cyBvdXQgdGhlIG1vc3QgY29tbW9uIHNjZW5hcmlvcyByZWxhdGVkCisgICAgICAgIHRvIGRlcGVuZGVuY3kgaW5qZWN0aW9uIGluIEplcnNleSBhbmQgc3VnZ2VzdHMgcG9zc2libGUgb3B0aW9ucyB0byBpbXBsZW1lbnQgdGhlc2Ugc2NlbmFyaW9zLgorICAgICAgICBJdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdG8gY2hlY2sgb3V0IHRoZSAmaGsyLmxpbms7IHdlYnNpdGUgYW5kIHJlYWQgSEsyIGRvY3VtZW50YXRpb24gaW4gb3JkZXIgdG8gZ2V0CisgICAgICAgIGJldHRlciB1bmRlcnN0YW5kaW5nIG9mIHN1Z2dlc3RlZCBhcHByb2FjaGVzLiBISzIgZG9jdW1lbnRhdGlvbiBzaG91bGQgYWxzbyBoZWxwIGluIHJlc29sdmluZyB1c2UgY2FzZXMKKyAgICAgICAgdGhhdCBhcmUgbm90IGRpc2N1c3NlZCBpbiB0aGlzIHdyaXRpbmcuCisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+CisgICAgICAgIFRoZXJlIGFyZSB0eXBpY2FsbHkgdGhyZWUgbWFpbiB1c2UgY2FzZXMsIHdoZXJlIHlvdXIgYXBwbGljYXRpb24gbWF5IGNvbnNpZGVyIGRlYWxpbmcgd2l0aAorICAgICAgICBISzIgQVBJcyBleHBvc2VkIGluIEplcnNleToKKworICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPGxpc3RpdGVtPjxzaW1wYXJhPkltcGxlbWVudGluZyBhIGN1c3RvbSBpbmplY3Rpb24gcHJvdmlkZXIgdGhhdCBhbGxvd3MgYW4gYXBwbGljYXRpb24gdG8gZGVmaW5lCisgICAgICAgICAgICAgICAgYWRkaXRpb25hbCB0eXBlcyB0byBiZSBpbmplY3RhYmxlIGludG8gSmVyc2V5LW1hbmFnZWQgSkFYLVJTIGNvbXBvbmVudHMuPC9zaW1wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+PHNpbXBhcmE+RGVmaW5pbmcgYSBjdXN0b20gaW5qZWN0aW9uIGFubm90YXRpb24gKG90aGVyIHRoYW4gJmplZTYuamF2YXguaW5qZWN0LkluamVjdDsKKyAgICAgICAgICAgICAgICBvciAmamF4cnMuY29yZS5Db250ZXh0OykgdG8gbWFyayBhcHBsaWNhdGlvbiBpbmplY3Rpb24gcG9pbnRzLjwvc2ltcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPjxzaW1wYXJhPlNwZWNpZnlpbmcgYSBjdXN0b20gY29tcG9uZW50IGxpZmUgY3ljbGUgbWFuYWdlbWVudCBmb3IgeW91ciBhcHBsaWNhdGlvbgorICAgICAgICAgICAgICAgIGNvbXBvbmVudHMuPC9zaW1wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgIDwvcGFyYT4KKworICAgIDxwYXJhPgorICAgICAgICBSZWx5aW5nIG9uIFNlcnZsZXQgSFRUUCBzZXNzaW9uIGNvbmNlcHQgaXMgbm90IHZlcnkgUkVTVGZ1bC4gSXQgdHVybnMgdGhlIG9yaWdpbmFsbHkgc3RhdGUtbGVzcyBIVFRQCisgICAgICAgIGNvbW11bmljYXRpb24gc2NoZW1hIGludG8gYSBzdGF0ZS1mdWxsIG1hbm5lci4gSG93ZXZlciwgaXQgY291bGQgc2VydmUKKyAgICAgICAgYXMgYSBnb29kIGV4YW1wbGUgdGhhdCB3aWxsIGhlbHAgbWUgZGVtb25zdHJhdGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHVzZSBjYXNlcyBkZXNjcmliZWQgYWJvdmUuCisgICAgICAgIFRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgc2hvdWxkIHdvcmsgb24gdG9wIG9mIEplcnNleSBTZXJ2bGV0IGludGVncmF0aW9uIG1vZHVsZS4gVGhlIGFwcHJvYWNoIHRoYXQgd2lsbCBiZQorICAgICAgICBkZW1vbnN0cmF0ZWQgY291bGQgYmUgZnVydGhlciBnZW5lcmFsaXplZC4KKyAgICAgICAgQmVsbG93IGkgd2lsbCBzaG93IGhvdyB0byBtYWtlIGFjdHVhbCBTZXJ2bGV0ICZqZWU2LnNlcnZsZXQuSHR0cFNlc3Npb247IGluamVjdGFibGUgaW50byBKQVgtUlMgY29tcG9uZW50cworICAgICAgICBhbmQgaG93IHRvIG1ha2UgdGhpcyBpbmplY3Rpb24gd29yayB3aXRoIGEgY3VzdG9tIGluamVjdCBhbm5vdGF0aW9uIHR5cGUuIEZpbmFsbHksIGkgd2lsbCBkZW1vbnN0cmF0ZQorICAgICAgICBob3cgeW91IGNhbiB3cml0ZSAmbGl0LmplZTYuc2VydmxldC5IdHRwU2Vzc2lvbjstc2NvcGVkIEpBWC1SUyByZXNvdXJjZXMuCisgICAgPC9wYXJhPgorCisgICAgPHNlY3Rpb24+CisgICAgICAgIDx0aXRsZT5JbXBsZW1lbnRpbmcgQ3VzdG9tIEluamVjdGlvbiBQcm92aWRlcjwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBKZXJzZXkgaW1wbGVtZW50YXRpb24gYWxsb3dzIHlvdSB0byBkaXJlY3RseSBpbmplY3QgJmplZTYuc2VydmxldC5IdHRwU2VydmxldFJlcXVlc3Q7IGluc3RhbmNlIGludG8KKyAgICAgICAgICAgIHlvdXIgSkFYLVJTIGNvbXBvbmVudHMuCisgICAgICAgICAgICBJdCBpcyBxdWl0ZSBzdHJhaWdodCBmb3J3YXJkIHRvIGdldCB0aGUgYXBwcm9wcmlhdGUgJmxpdC5qZWU2LnNlcnZsZXQuSHR0cFNlc3Npb247IGluc3RhbmNlIG91dCBvZiB0aGUKKyAgICAgICAgICAgIGluamVjdGVkIHJlcXVlc3QgaW5zdGFuY2UuCisgICAgICAgICAgICBMZXQgc2F5LCB5b3Ugd2FudCB0byBnZXQgJmxpdC5qZWU2LnNlcnZsZXQuSHR0cFNlc3Npb247IGluc3RhbmNlIGRpcmVjdGx5IGluamVjdGVkIGludG8geW91ciBKQVgtUlMKKyAgICAgICAgICAgIHR5cGVzIGxpa2UgaW4gdGhlIGNvZGUgc25pcHBldCBiZWxvdy4KKworICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIj5AUGF0aCgiZGktcmVzb3VyY2UiKQorcHVibGljIGNsYXNzIE15RGlSZXNvdXJjZSB7CisKKyAgICBASW5qZWN0IEh0dHBTZXNzaW9uIGh0dHBTZXNzaW9uOworCisgICAgLi4uCisKK308L3Byb2dyYW1saXN0aW5nPgorCisgICAgICAgICAgICBUbyBtYWtlIHRoZSBhYm92ZSBpbmplY3Rpb24gd29yaywgeW91IHdpbGwgbmVlZCB0byBkZWZpbmUgYW4gYWRkaXRpb25hbCBISzIgYmluZGluZyBpbiB5b3VyCisgICAgICAgICAgICBhcHBsaWNhdGlvbiAmamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsuCisgICAgICAgICAgICBMZXQncyBzdGFydCB3aXRoIGEgY3VzdG9tIEhLMiAmaGsyLkZhY3Rvcnk7IGltcGxlbWVudGF0aW9uIHRoYXQga25vd3MgaG93IHRvIGV4dHJhY3QKKyAgICAgICAgICAgICZsaXQuamVlNi5zZXJ2bGV0Lkh0dHBTZXNzaW9uOyBvdXQgb2YgZ2l2ZW4gJmxpdC5qZWU2LnNlcnZsZXQuSHR0cFNlcnZsZXRSZXF1ZXN0Oy4KKworICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIj5pbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIuYXBpLkZhY3Rvcnk7CisgICAgLi4uCisKKyAgICBwdWJsaWMgY2xhc3MgSHR0cFNlc3Npb25GYWN0b3J5IGltcGxlbWVudHMgRmFjdG9yeSZsdDtIdHRwU2Vzc2lvbiZndDsgeworCisgICAgcHJpdmF0ZSBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdDsKKworICAgIEBJbmplY3QKKyAgICBwdWJsaWMgSHR0cFNlc3Npb25GYWN0b3J5KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEh0dHBTZXNzaW9uIHByb3ZpZGUoKSB7CisgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0U2Vzc2lvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoSHR0cFNlc3Npb24gdCkgeworICAgIH0KK308L3Byb2dyYW1saXN0aW5nPgorCisgICAgICAgICAgICBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBmYWN0b3J5IGltcGxlbWVudGF0aW9uIGl0c2VsZiByZWxpZXMgb24gaGF2aW5nIHRoZSBhY3R1YWwKKyAgICAgICAgICAgICZsaXQuamVlNi5zZXJ2bGV0Lkh0dHBTZXJ2bGV0UmVxdWVzdDsgaW5zdGFuY2UgaW5qZWN0ZWQuCisgICAgICAgICAgICBJbiB5b3VyIGltcGxlbWVudGF0aW9uLCB5b3UgY2FuIG9mIGNvdXJzZSBkZXBlbmQgb24gb3RoZXIgdHlwZXMgKGFuZCBpbmplY3QgdGhlbSBjb252ZW5pZW50bHkpCisgICAgICAgICAgICBhcyBsb25nIGFzIHRoZXNlIG90aGVyIHR5cGVzIGFyZSBib3VuZCB0byB0aGUgYWN0dWFsIEhLMiBzZXJ2aWNlIGxvY2F0b3IgYnkgSmVyc2V5IG9yIGJ5IHlvdXIKKyAgICAgICAgICAgIGFwcGxpY2F0aW9uLiBUaGUga2V5IG5vdGlvbiB0byByZW1lbWJlciBoZXJlIGlzIHRoYXQgeW91ciBISzIgJmxpdC5oazIuRmFjdG9yeTsgaW1wbGVtZW50YXRpb24KKyAgICAgICAgICAgIGlzIHJlc3BvbnNpYmxlIGZvciBpbXBsZW1lbnRpbmcgdGhlIDxsaXRlcmFsPnByb3ZpZGUoKTwvbGl0ZXJhbD4gbWV0aG9kIHRoYXQgaXMgdXNlZCBieSBISzIKKyAgICAgICAgICAgIHJ1bnRpbWUgdG8gcmV0cmlldmUgdGhlIGluamVjdGVkIGluc3RhbmNlLiBUaG9zZSBvZiB5b3Ugd2hvIHdvcmtlZCB3aXRoIEd1aWNlIGJpbmRpbmcgQVBJIGluIHRoZQorICAgICAgICAgICAgcGFzdCB3aWxsIG1vc3QgbGlrZWx5IGZpbmQgdGhpcyBjb25jZXB0IHZlcnkgZmFtaWxpYXIuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIE9uY2UgaW1wbGVtZW50ZWQsIHRoZSBmYWN0b3J5IGNhbiBiZSB1c2VkIGluIGEgY3VzdG9tIEhLMiAmbGl0LmhrMi5CaW5kZXI7IHRvIGRlZmluZSB0aGUKKyAgICAgICAgICAgIG5ldyBpbmplY3Rpb24gYmluZGluZyBmb3IgJmxpdC5qZWU2LnNlcnZsZXQuSHR0cFNlc3Npb247LiBGaW5hbGx5LCB0aGUgaW1wbGVtZW50ZWQgYmluZGVyCisgICAgICAgICAgICBjYW4gYmUgcmVnaXN0ZXJlZCBpbiB5b3VyICZqZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOzoKKworICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIj5pbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIudXRpbGl0aWVzLmJpbmRpbmcuQWJzdHJhY3RCaW5kZXI7CisuLi4KKworcHVibGljIGNsYXNzIE15QXBwbGljYXRpb24gZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisKKyAgICBwdWJsaWMgTXlBcHBsaWNhdGlvbigpIHsKKworICAgICAgICAuLi4KKworICAgICAgICByZWdpc3RlcihuZXcgQWJzdHJhY3RCaW5kZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgICAgICBiaW5kRmFjdG9yeShIdHRwU2Vzc2lvbkZhY3RvcnkuY2xhc3MpLnRvKEh0dHBTZXNzaW9uLmNsYXNzKQorICAgICAgICAgICAgICAgIC5wcm94eSh0cnVlKS5wcm94eUZvclNhbWVTY29wZShmYWxzZSkuaW4oUmVxdWVzdFNjb3BlZC5jbGFzcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KK308L3Byb2dyYW1saXN0aW5nPgorCisgICAgICAgICAgICBOb3RlIHRoYXQgd2UgZGlkIG5vdCBkZWZpbmUgYW55IGV4cGxpY2l0IGluamVjdGlvbiBzY29wZSBmb3IgdGhlIG5ldyBpbmplY3Rpb24gYmluZGluZy4KKyAgICAgICAgICAgIEJ5IGRlZmF1bHQsIEhLMiBmYWN0b3JpZXMgYXJlIGJvdW5kIGluIGEgSEsyICZoazIuUGVyTG9va3VwOyBzY29wZSwgd2hpY2ggaXMgaW4gbW9zdAorICAgICAgICAgICAgY2FzZXMgYSBnb29kIGNob2ljZSBhbmQgaXQgaXMgc3VpdGFibGUgYWxzbyBpbiBvdXIgZXhhbXBsZS4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVG8gc3VtbWFyaXplIHRoZSBhcHByb2FjaCBkZXNjcmliZWQgYWJvdmUsIGhlcmUgaXMgYSBsaXN0IG9mIHN0ZXBzIHRvIGZvbGxvdworICAgICAgICAgICAgd2hlbiBpbXBsZW1lbnRpbmcgY3VzdG9tIGluamVjdGlvbiBwcm92aWRlciBpbiB5b3VyIEplcnNleSBhcHBsaWNhdGlvbiA6CisKKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxzaW1wYXJhPkltcGxlbWVudCB5b3VyIG93biBISzIgJmxpdC5oazIuRmFjdG9yeTsgdG8gcHJvdmlkZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgaW5qZWN0YWJsZSBpbnN0YW5jZXMuPC9zaW1wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxzaW1wYXJhPlVzZSB0aGUgSEsyICZsaXQuaGsyLkZhY3Rvcnk7IHRvIGRlZmluZSBhbiBpbmplY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgYmluZGluZyBmb3IgdGhlIGluamVjdGVkIGluc3RhbmNlIHZpYSBjdXN0b20gSEsyICZsaXQuaGsyLkJpbmRlcjsuPC9zaW1wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxzaW1wYXJhPlJlZ2lzdGVyIHRoZSBjdXN0b20gSEsyICZsaXQuaGsyLkJpbmRlcjsgaW4geW91ciBhcHBsaWNhdGlvbgorICAgICAgICAgICAgICAgICAgICAmbGl0LmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7Ljwvc2ltcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFdoaWxlIHRoZSAmbGl0LmhrMi5GYWN0b3J5Oy1iYXNlZCBhcHByb2FjaCBpcyBxdWl0ZSBzdHJhaWdodC1mb3J3YXJkIGFuZCBzaG91bGQgaGVscCB5b3UgdG8KKyAgICAgICAgICAgIHF1aWNrbHkgcHJvdG90eXBlIG9yIGV2ZW4gaW1wbGVtZW50IGZpbmFsIHNvbHV0aW9ucywgeW91IHNob3VsZCBiZWFyIGluIG1pbmQsIHRoYXQgeW91cgorICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgbmVlZCB0byBiZSBiYXNlZCBvbiBmYWN0b3JpZXMuIFlvdSBjYW4gZm9yIGluc3RhbmNlIGJpbmQgeW91ciBvd24KKyAgICAgICAgICAgIHR5cGVzIGRpcmVjdGx5LCB3aGlsZSBzdGlsbCB0YWtpbmcgYWR2YW50YWdlIG9mIEhLMiBwcm92aWRlZCBkZXBlbmRlbmN5IGluamVjdGlvbi4KKyAgICAgICAgICAgIEFsc28sIGluIHlvdXIgaW1wbGVtZW50YXRpb24geW91IG1heSB3YW50IHRvIHBheSBtb3JlIGF0dGVudGlvbiB0byBkZWZpbmluZyBvciBtYW5hZ2luZworICAgICAgICAgICAgaW5qZWN0aW9uIGJpbmRpbmcgc2NvcGVzIGZvciB0aGUgc2FrZSBvZiBwZXJmb3JtYW5jZSBvciBjb3JyZWN0bmVzcyBvZiB5b3VyIGN1c3RvbSBpbmplY3Rpb24KKyAgICAgICAgICAgIGV4dGVuc2lvbi4KKworICAgICAgICAgICAgPGltcG9ydGFudD4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgV2hpbGUgdGhlIGluZGl2aWR1YWwgaW5qZWN0aW9uIGJpbmRpbmcgaW1wbGVtZW50YXRpb25zIHZhcnkgYW5kIGRlcGVuZCBvbiB5b3VyIHVzZSBjYXNlLAorICAgICAgICAgICAgICAgICAgICB0byBlbmFibGUgeW91ciBjdXN0b20gaW5qZWN0aW9uIGV4dGVuc2lvbiBpbiBKZXJzZXksIHlvdSBtdXN0IHJlZ2lzdGVyIHlvdXIgY3VzdG9tIEhLMiAmaGsyLkJpbmRlcjsKKyAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gaW4geW91ciBhcHBsaWNhdGlvbiAmamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzshCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9pbXBvcnRhbnQ+CisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbj4KKyAgICAgICAgPHRpdGxlPkRlZmluaW5nIEN1c3RvbSBJbmplY3Rpb24gQW5ub3RhdGlvbjwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBKYXZhIGFubm90YXRpb25zIGFyZSBhIGNvbnZlbmllbnQgd2F5IGZvciBhdHRhY2hpbmcgbWV0YWRhdGEgdG8gdmFyaW91cyBlbGVtZW50cyBvZiBKYXZhIGNvZGUuCisgICAgICAgICAgICBTb21ldGltZXMgeW91IG1heSBldmVuIGRlY2lkZSB0byBjb21iaW5lIHRoZSBtZXRhZGF0YSB3aXRoIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eSwgc3VjaCBhcworICAgICAgICAgICAgYWJpbGl0eSB0byBhdXRvbWF0aWNhbGx5IGluamVjdCB0aGUgaW5zdGFuY2VzIGJhc2VkIG9uIHRoZSBhbm5vdGF0aW9uLXByb3ZpZGVkIG1ldGFkYXRhLgorICAgICAgICAgICAgVGhlIGRlc2NyaWJlZCBzY2VuYXJpbyBpcyBvbmUgb2YgdGhlIHVzZSBjYXNlcyB3aGVyZSBoYXZpbmcgbWVhbnMgb2YgZGVmaW5pbmcgYSBjdXN0b20gaW5qZWN0aW9uCisgICAgICAgICAgICBhbm5vdGF0aW9uIGluIHlvdXIgSmVyc2V5IGFwcGxpY2F0aW9uIG1heSBwcm92ZSB0byBiZSB1c2VmdWwuIE9idmlvdXNseSwgdGhpcyB1c2UgY2FzZSBhcHBsaWVzIGFsc28KKyAgICAgICAgICAgIHRvIHJlLXVzZWQgZXhpc3RpbmcsIDNyZC1wYXJ0eSBhbm5vdGF0aW9uIHR5cGVzLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUsIHdlIHdpbGwgZGVzY3JpYmUgaG93IGEgY3VzdG9tIGluamVjdGlvbiBhbm5vdGF0aW9uIGNhbiBiZSBzdXBwb3J0ZWQuCisgICAgICAgICAgICBMZXQncyBzdGFydCB3aXRoIGRlZmluaW5nIGEgbmV3IGN1c3RvbSA8bGl0ZXJhbD5TZXNzaW9uSW5qZWN0PC9saXRlcmFsPiBpbmplY3Rpb24gYW5ub3RhdGlvbgorICAgICAgICAgICAgdGhhdCB3ZSB3aWxsIHNwZWNpZmljYWxseSB1c2UgdG8gaW5qZWN0IGluc3RhbmNlcyBvZiAmamVlNi5zZXJ2bGV0Lkh0dHBTZXNzaW9uOworICAgICAgICAgICAgKHNpbWlsYXJseSB0byB0aGUgcHJldmlvdXMgZXhhbXBsZSk6CisKKyAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSI+QFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BUYXJnZXQoRWxlbWVudFR5cGUuRklFTEQpCitwdWJsaWMgQGludGVyZmFjZSBTZXNzaW9uSW5qZWN0IHsgfTwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgICAgICAgICAgIFRoZSBhYm92ZSA8bGl0ZXJhbD5AU2Vzc2lvbkluamVjdDwvbGl0ZXJhbD4gYW5ub3RhdGlvbiBzaG91bGQgYmUgdGhlbiB1c2VkIGFzIGZvbGxvd3M6CisKKyAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSI+QFBhdGgoImRpLXJlc291cmNlIikKK3B1YmxpYyBjbGFzcyBNeURpUmVzb3VyY2UgeworCisgICAgQFNlc3Npb25JbmplY3QgSHR0cFNlc3Npb24gaHR0cFNlc3Npb247CisKKyAgICAuLi4KKworfTwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgICAgICAgICAgIEFnYWluLCB0aGUgc2VtYW50aWNzIHJlbWFpbnMgdGhlIHNhbWUgYXMgaW4gdGhlIGV4YW1wbGUgZGVzY3JpYmVkIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uLgorICAgICAgICAgICAgWW91IHdhbnQgdG8gaGF2ZSB0aGUgYWN0dWFsIEhUVFAgU2VydmxldCBzZXNzaW9uIGluc3RhbmNlIGluamVjdGVkIGludG8geW91cgorICAgICAgICAgICAgPGxpdGVyYWw+TXlEaVJlc291cmNlPC9saXRlcmFsPiBpbnN0YW5jZS4gVGhpcyB0aW1lIGhvd2V2ZXIsIHlvdSBleHBlY3QgdGhhdCB0aGUKKyAgICAgICAgICAgIDxsaXRlcmFsPmh0dHBTZXNzaW9uPC9saXRlcmFsPiBmaWVsZCB0byBiZSBpbmplY3RlZCBtdXN0IGJlIGFubm90YXRlZCB3aXRoCisgICAgICAgICAgICBhIGN1c3RvbSA8bGl0ZXJhbD5AU2Vzc2lvbkluamVjdDwvbGl0ZXJhbD4gYW5ub3RhdGlvbi4gT2J2aW91c2x5LCBpbiB0aGlzIHNpbXBsaXN0aWMgY2FzZQorICAgICAgICAgICAgdGhlIHVzZSBvZiBhIGN1c3RvbSBpbmplY3Rpb24gYW5ub3RhdGlvbiBpcyBhbiBvdmVya2lsbCwgaG93ZXZlciwgdGhlIHNpbXBsaWNpdHkgb2YgdGhlCisgICAgICAgICAgICB1c2UgY2FzZSB3aWxsIGhlbHAgdXMgdG8gYXZvaWQgdXNlIGNhc2Ugc3BlY2lmaWMgZGlzdHJhY3Rpb25zIGFuZCBhbGxvdyB1cyBiZXR0ZXIgZm9jdXMgb24KKyAgICAgICAgICAgIHRoZSBpbXBvcnRhbnQgYXNwZWN0cyBvZiB0aGUgam9iIG9mIGRlZmluaW5nIGEgY3VzdG9tIGluamVjdGlvbiBhbm5vdGF0aW9uLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBJZiB5b3UgcmVtZW1iZXIgZnJvbSB0aGUgcHJldmlvdXMgc2VjdGlvbiwgdG8gbWFrZSB0aGUgaW5qZWN0aW9uIGluIHRoZSBjb2RlIHNuaXBwZXQgYWJvdmUgd29yaywKKyAgICAgICAgICAgIHlvdSBmaXJzdCBuZWVkIHRvIGltcGxlbWVudCB0aGUgaW5qZWN0aW9uIHByb3ZpZGVyIChISzIgJmhrMi5GYWN0b3J5OykgYXMgd2VsbCBhcyBkZWZpbmUgdGhlCisgICAgICAgICAgICBpbmplY3Rpb24gYmluZGluZyBmb3IgdGhlICZsaXQuamVlNi5zZXJ2bGV0Lkh0dHBTZXNzaW9uOyB0eXBlLiBUaGF0IHBhcnQgd2UgaGF2ZSBhbHJlYWR5CisgICAgICAgICAgICBkb25lIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uLgorICAgICAgICAgICAgV2Ugd2lsbCBub3cgZm9jdXMgb24gd2hhdCBuZWVkcyB0byBiZSBkb25lIHRvIGluZm9ybSB0aGUgSEsyIHJ1bnRpbWUgYWJvdXQgb3VyIDxsaXRlcmFsPkBTZXNzaW9uSW5qZWN0PC9saXRlcmFsPgorICAgICAgICAgICAgYW5ub3RhdGlvbiB0eXBlIHRoYXQgd2Ugd2FudCB0byBzdXBwb3J0IGFzIGEgbmV3IGluamVjdGlvbiBwb2ludCBtYXJrZXIgYW5ub3RhdGlvbi4gVG8gZG8gdGhhdCwKKyAgICAgICAgICAgIHdlIG5lZWQgdG8gaW1wbGVtZW50IG91ciBvd24gSEsyICZoazIuSW5qZWN0aW9uUmVzb2x2ZXI7IGZvciB0aGUgYW5ub3RhdGlvbiBhcyBkZW1vbnN0cmF0ZWQKKyAgICAgICAgICAgIGluIHRoZSBmb2xsb3dpbmcgbGlzdGluZzoKKworICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIj5pbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuTmFtZWQ7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi5hcGkuSW5qZWN0aW9uUmVzb2x2ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIuYXBpLlNlcnZpY2VIYW5kbGU7CisKKy4uLgorCitwdWJsaWMgY2xhc3MgU2Vzc2lvbkluamVjdFJlc29sdmVyIGltcGxlbWVudHMgSW5qZWN0aW9uUmVzb2x2ZXImbHQ7U2Vzc2lvbkluamVjdCZndDsgeworCisgICAgQEluamVjdAorICAgIEBOYW1lZChJbmplY3Rpb25SZXNvbHZlci5TWVNURU1fUkVTT0xWRVJfTkFNRSkKKyAgICBJbmplY3Rpb25SZXNvbHZlciZsdDtJbmplY3QmZ3Q7IHN5c3RlbUluamVjdGlvblJlc29sdmVyOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdCByZXNvbHZlKEluamVjdGVlIGluamVjdGVlLCBTZXJ2aWNlSGFuZGxlJmx0Oz8mZ3Q7IGhhbmRsZSkgeworICAgICAgICBpZiAoSHR0cFNlc3Npb24uY2xhc3MgPT0gaW5qZWN0ZWUuZ2V0UmVxdWlyZWRUeXBlKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBzeXN0ZW1JbmplY3Rpb25SZXNvbHZlci5yZXNvbHZlKGluamVjdGVlLCBoYW5kbGUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNDb25zdHJ1Y3RvclBhcmFtZXRlckluZGljYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzTWV0aG9kUGFyYW1ldGVySW5kaWNhdG9yKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfTwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgICAgICAgICAgIFRoZSA8bGl0ZXJhbD5TZXNzaW9uSW5qZWN0UmVzb2x2ZXI8L2xpdGVyYWw+IGFib3ZlIGp1c3QgZGVsZWdhdGVzIHRvIHRoZSBkZWZhdWx0CisgICAgICAgICAgICBISzIgc3lzdGVtIGluamVjdGlvbiByZXNvbHZlciB0byBkbyB0aGUgYWN0dWFsIHdvcmsuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFlvdSBhZ2FpbiBuZWVkIHRvIHJlZ2lzdGVyIHlvdXIgaW5qZWN0aW9uIHJlc29sdmVyIHdpdGggeW91ciBKZXJzZXkgYXBwbGljYXRpb24sCisgICAgICAgICAgICBhbmQgeW91IGNhbiBkbyBpdCB0aGUgc2FtZSB3YXMgYXMgaW4gdGhlIHByZXZpb3VzIGNhc2UuIEZvbGxvd2luZyBsaXN0aW5nIGluY2x1ZGVzCisgICAgICAgICAgICBISzIgYmluZGVyIHRoYXQgcmVnaXN0ZXJzIGJvdGgsIHRoZSBpbmplY3Rpb24gcHJvdmlkZXIgZnJvbSB0aGUgcHJldmlvdXMgc3RlcAorICAgICAgICAgICAgYXMgd2VsbCBhcyB0aGUgbmV3IEhLMiBpbmplY3QgcmVzb2x2ZXIgd2l0aCBKZXJzZXkgYXBwbGljYXRpb24gJmxpdC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOy4KKyAgICAgICAgICAgIE5vdGUgdGhhdCBpbiB0aGlzIGNhc2Ugd2UncmUgZXhwbGljaXRseSBiaW5kaW5nIHRoZSA8bGl0ZXJhbD5TZXNzaW9uSW5qZWN0UmVzb2x2ZXI8L2xpdGVyYWw+CisgICAgICAgICAgICB0byBhICZqZWU2LmluamVjdC5TaW5nbGV0b247IHNjb3BlIHRvIGF2b2lkIHRoZSB1bm5lY2Vzc2FyeSBwcm9saWZlcmF0aW9uIG9mCisgICAgICAgICAgICA8bGl0ZXJhbD5TZXNzaW9uSW5qZWN0UmVzb2x2ZXI8L2xpdGVyYWw+IGluc3RhbmNlcyBpbiB0aGUgYXBwbGljYXRpb246CisKKyAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSI+aW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLmFwaS5UeXBlTGl0ZXJhbDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi51dGlsaXRpZXMuYmluZGluZy5BYnN0cmFjdEJpbmRlcjsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKKy4uLgorCitwdWJsaWMgY2xhc3MgTXlBcHBsaWNhdGlvbiBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKworICAgIHB1YmxpYyBNeUFwcGxpY2F0aW9uKCkgeworCisgICAgICAgIC4uLgorCisgICAgICAgIHJlZ2lzdGVyKG5ldyBBYnN0cmFjdEJpbmRlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICAgICAgICAgIGJpbmRGYWN0b3J5KEh0dHBTZXNzaW9uRmFjdG9yeS5jbGFzcykudG8oSHR0cFNlc3Npb24uY2xhc3MpOworCisgICAgICAgICAgICAgICAgYmluZChTZXNzaW9uSW5qZWN0UmVzb2x2ZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIC50byhuZXcgVHlwZUxpdGVyYWwmbHQ7SW5qZWN0aW9uUmVzb2x2ZXImbHQ7U2Vzc2lvbkluamVjdCZndDsmZ3Q7KCl7fSkKKyAgICAgICAgICAgICAgICAgICAgLmluKFNpbmdsZXRvbi5jbGFzcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KK308L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8L3BhcmE+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24+CisgICAgICAgIDx0aXRsZT5DdXN0b20gTGlmZSBDeWNsZSBNYW5hZ2VtZW50PC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZSBsYXN0IHVzZSBjYXNlIGRpc2N1c3NlZCBpbiB0aGlzIGNoYXB0ZXIgd2lsbCBjb3ZlciBtYW5hZ2luZyBjdXN0b20tc2NvcGVkIGNvbXBvbmVudHMKKyAgICAgICAgICAgIHdpdGhpbiBhIEplcnNleSBhcHBsaWNhdGlvbi4KKyAgICAgICAgICAgIElmIG5vdCBjb25maWd1cmVkIG90aGVyd2lzZSwgdGhlbiBhbGwgSkFYLVJTIHJlc291cmNlcyBhcmUgYnkgZGVmYXVsdCBtYW5hZ2VkIG9uIGEgcGVyLXJlcXVlc3QgYmFzaXMuIEEgbmV3IGluc3RhbmNlCisgICAgICAgICAgICBvZiBnaXZlbiByZXNvdXJjZSBjbGFzcyB3aWxsIGJlIGNyZWF0ZWQgZm9yIGVhY2ggaW5jb21pbmcgcmVxdWVzdCB0aGF0IHNob3VsZCBiZSBoYW5kbGVkIGJ5IHRoYXQgcmVzb3VyY2UgY2xhc3MuCisgICAgICAgICAgICBMZXQgc2F5IHlvdSB3YW50IHRvIGhhdmUgeW91ciByZXNvdXJjZSBjbGFzcyBtYW5hZ2VkIGluIGEgcGVyLXNlc3Npb24gbWFubmVyLiBJdCBtZWFucyBhIG5ldyBpbnN0YW5jZSBvZiB5b3VyCisgICAgICAgICAgICByZXNvdXJjZSBjbGFzcyBzaG91bGQgYmUgY3JlYXRlZCBvbmx5IHdoZW4gYSBuZXcgU2VydmxldCAmamVlNi5zZXJ2bGV0Lkh0dHBTZXNzaW9uOyBpcyBlc3RhYmxpc2hlZC4KKyAgICAgICAgICAgIChBcyB3aXRoIHByZXZpb3VzIGV4YW1wbGVzIGluIHRoZSBjaGFwdGVyLCB0aGlzIGV4YW1wbGUgYXNzdW1lcyB0aGUgZGVwbG95bWVudCBvZiB5b3VyIGFwcGxpY2F0aW9uCisgICAgICAgICAgICB0byBhIFNlcnZsZXQgY29udGFpbmVyLikKKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgRm9sbG93aW5nIGlzIGFuIGV4YW1wbGUgb2Ygc3VjaCBhIHJlc291cmNlIGNsYXNzIHRoYXQgYnVpbGRzIG9uIHRoZSBzdXBwb3J0IGZvcgorICAgICAgICAgICAgJmxpdC5qZWU2LnNlcnZsZXQuSHR0cFNlc3Npb247IGluamVjdGlvbiBmcm9tIHRoZSBlYXJsaWVyIGV4YW1wbGVzIGRlc2NyaWJlZCBpbiB0aGlzIGNoYXB0ZXIuCisgICAgICAgICAgICBUaGUgPGxpdGVyYWw+UGVyU2Vzc2lvblJlc291cmNlPC9saXRlcmFsPiBjbGFzcyBhbGxvd3MgeW91IHRvIGNvdW50IHRoZSBudW1iZXIgb2YgcmVxdWVzdHMgbWFkZSB3aXRoaW4KKyAgICAgICAgICAgIGEgc2luZ2xlIGNsaWVudCBzZXNzaW9uIGFuZCBwcm92aWRlcyB5b3UgYSBoYW5keSBzdWItcmVzb3VyY2UgbWV0aG9kIHRvIG9idGFpbiB0aGUgbnVtYmVyIHZpYQorICAgICAgICAgICAgYSBIVFRQICZsaXQuaHR0cC5HRVQ7IG1ldGhvZCBjYWxsOgorCisgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiPkBQYXRoKCJzZXNzaW9uIikKK3B1YmxpYyBjbGFzcyBQZXJTZXNzaW9uUmVzb3VyY2UgeworCisgICAgQFNlc3Npb25JbmplY3QgSHR0cFNlc3Npb24gaHR0cFNlc3Npb247CisKKyAgICBBdG9taWNJbnRlZ2VyIGNvdW50ZXIgPSBuZXcgQXRvbWljSW50ZWdlcigpOworCisgICAgQEdFVAorICAgIEBQYXRoKCJpZCIpCisgICAgcHVibGljIFN0cmluZyBnZXRTZXNzaW9uKCkgeworICAgICAgICBjb3VudGVyLmluY3JlbWVudEFuZEdldCgpOworICAgICAgICByZXR1cm4gaHR0cFNlc3Npb24uZ2V0SWQoKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImNvdW50IikKKyAgICBwdWJsaWMgaW50IGdldFNlc3Npb25SZXF1ZXN0Q291bnQoKSB7CisgICAgICAgIHJldHVybiBjb3VudGVyLmluY3JlbWVudEFuZEdldCgpOworICAgIH0KK308L3Byb2dyYW1saXN0aW5nPgorCisgICAgICAgICAgICBTaG91bGQgdGhlIGFib3ZlIHJlc291cmNlIGJlIHBlci1yZXF1ZXN0IHNjb3BlZCAoZGVmYXVsdCBvcHRpb24pLCB5b3Ugd291bGQgbmV2ZXIgYmUgYWJsZSB0byBvYnRhaW4KKyAgICAgICAgICAgIGFueSBvdGhlciBudW1iZXIgYnV0IDEgZnJvbSBpdCdzIGdldFJlcXMgc3ViLXJlc291cmNlIG1ldGhvZCwgYmVjYXVzZSB0aGVuIGZvciBlYWNoIHJlcXVlc3QKKyAgICAgICAgICAgIGEgbmV3IGluc3RhbmNlIG9mIG91ciA8bGl0ZXJhbD5QZXJTZXNzaW9uUmVzb3VyY2U8L2xpdGVyYWw+IGNsYXNzIHdvdWxkIGdldCBjcmVhdGVkIHdpdGggYSBmcmVzaAorICAgICAgICAgICAgaW5zdGFuY2UgPGxpdGVyYWw+Y291bnRlcjwvbGl0ZXJhbD4gZmllbGQgc2V0IHRvIDAuCisgICAgICAgICAgICBUaGUgdmFsdWUgb2YgdGhpcyBmaWVsZCB3b3VsZCBnZXQgaW5jcmVtZW50ZWQgdG8gMSBpbiB0aGUgdGhlIDxsaXRlcmFsPmdldFNlc3Npb25SZXF1ZXN0Q291bnQ8L2xpdGVyYWw+CisgICAgICAgICAgICBtZXRob2QgYmVmb3JlIHRoaXMgdmFsdWUgaXMgcmV0dXJuZWQuCisgICAgICAgICAgICBJbiBvcmRlciB0byBhY2hpZXZlIHdoYXQgd2Ugd2FudCwgd2UgaGF2ZSB0byBmaW5kIGEgd2F5IGhvdyB0byBiaW5kIHRoZSBpbnN0YW5jZXMgb2YKKyAgICAgICAgICAgIG91ciA8bGl0ZXJhbD5QZXJTZXNzaW9uUmVzb3VyY2U8L2xpdGVyYWw+IGNsYXNzIHRvICZsaXQuamVlNi5zZXJ2bGV0Lkh0dHBTZXNzaW9uOyBpbnN0YW5jZXMgYW5kCisgICAgICAgICAgICB0aGVuIHJldXNlIHRob3NlIGJvdW5kIGluc3RhbmNlcyB3aGVuZXZlciBuZXcgcmVxdWVzdCBib3VuZCB0byB0aGUgc2FtZSBIVFRQIGNsaWVudCBzZXNzaW9uIGFycml2ZXMuCisgICAgICAgICAgICBMZXQncyBzZWUgaG93IHRvIGFjaGlldmUgdGhpcy4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVG8gZ2V0IGJldHRlciBjb250cm9sIG92ZXIgeW91ciBKZXJzZXkgY29tcG9uZW50IGluc3RhbnRpYXRpb24gYW5kIGxpZmUgY3ljbGUsCisgICAgICAgICAgICB5b3UgbmVlZCB0byBpbXBsZW1lbnQgYSBjdXN0b20gSmVyc2V5ICZqZXJzZXkuc2VydmVyLnNwaS5Db21wb25lbnRQcm92aWRlcjsgU1BJLAorICAgICAgICAgICAgdGhhdCB3b3VsZCBtYW5hZ2UgeW91ciBjdXN0b20gY29tcG9uZW50cy4KKyAgICAgICAgICAgIEFsdGhvdWdoIGl0IG1pZ2h0IHNlZW0gcXVpdGUgY29tcGxleCB0byBpbXBsZW1lbnQgc3VjaCBhIHRoaW5nLAorICAgICAgICAgICAgdGhlIGNvbXBvbmVudCBwcm92aWRlciBjb25jZXB0IGluIEplcnNleSBpcyBpbiBmYWN0IHZlcnkgc2ltcGxlLiBJdCBhbGxvd3MgeW91IHRvIGRlZmluZQorICAgICAgICAgICAgeW91ciBvd24gSEsyIGluamVjdGlvbiBiaW5kaW5ncyBmb3IgdGhlIHR5cGVzIHRoYXQgeW91IGFyZSBpbnRlcmVzdGVkIGluLAorICAgICAgICAgICAgd2hpbGUgaW5mb3JtaW5nIHRoZSBKZXJzZXkgcnVudGltZSBhdCB0aGUgc2FtZSB0aW1lIHRoYXQgaXQgc2hvdWxkIGJhY2sgb3V0IGFuZCBsZWF2ZQorICAgICAgICAgICAgdGhlIGNvbXBvbmVudCBtYW5hZ2VtZW50IHRvIHlvdXIgcHJvdmlkZXIgaW4gc3VjaCBhIGNhc2UuCisgICAgICAgICAgICBCeSBkZWZhdWx0LCBpZiB0aGVyZSBpcyBubyBjdXN0b20gY29tcG9uZW50IHByb3ZpZGVyIGZvdW5kIGZvciBhbnkgZ2l2ZW4gY29tcG9uZW50IHR5cGUsIEplcnNleQorICAgICAgICAgICAgcnVudGltZSBhc3N1bWVzIHRoZSByb2xlIG9mIHRoZSBkZWZhdWx0IGNvbXBvbmVudCBwcm92aWRlciBhbmQgYXV0b21hdGljYWxseSBkZWZpbmVzIHRoZSBkZWZhdWx0CisgICAgICAgICAgICBISzIgYmluZGluZyBmb3IgdGhlIGNvbXBvbmVudCB0eXBlLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBGb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBhIHNpbXBsZSAmbGl0LmplcnNleS5zZXJ2ZXIuc3BpLkNvbXBvbmVudFByb3ZpZGVyOyBpbXBsZW1lbnRhdGlvbiwKKyAgICAgICAgICAgIGZvciBvdXIgdXNlIGNhc2UuIFNvbWUgY29tbWVudHMgb24gdGhlIGNvZGUgZm9sbG93LgorCisgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiPmltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LmluamVjdC5Qcm92aWRlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKKy4uLgoraW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLmFwaS5EeW5hbWljQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi5hcGkuRHluYW1pY0NvbmZpZ3VyYXRpb25TZXJ2aWNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLmFwaS5GYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLmFwaS5QZXJMb29rdXA7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIuYXBpLlNlcnZpY2VMb2NhdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLnV0aWxpdGllcy5iaW5kaW5nLkJpbmRpbmdCdWlsZGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbXBvbmVudFByb3ZpZGVyOworCitAamF2YXgud3MucnMuZXh0LlByb3ZpZGVyCitwdWJsaWMgY2xhc3MgUGVyU2Vzc2lvbkNvbXBvbmVudFByb3ZpZGVyIGltcGxlbWVudHMgQ29tcG9uZW50UHJvdmlkZXIgeworCisgICAgcHJpdmF0ZSBTZXJ2aWNlTG9jYXRvciBsb2NhdG9yOworCisgICAgc3RhdGljIGNsYXNzIFBlclNlc3Npb25GYWN0b3J5IGltcGxlbWVudHMgRmFjdG9yeSZsdDtQZXJTZXNzaW9uUmVzb3VyY2UmZ3Q7eworICAgICAgICBzdGF0aWMgQ29uY3VycmVudEhhc2hNYXAmbHQ7U3RyaW5nLCBQZXJTZXNzaW9uUmVzb3VyY2UmZ3Q7IHBlclNlc3Npb25NYXAKKyAgICAgICAgICAgICAgICA9IG5ldyBDb25jdXJyZW50SGFzaE1hcCZsdDtTdHJpbmcsIFBlclNlc3Npb25SZXNvdXJjZSZndDsoKTsKKworCisgICAgICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXImbHQ7SHR0cFNlcnZsZXRSZXF1ZXN0Jmd0OyByZXF1ZXN0UHJvdmlkZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgU2VydmljZUxvY2F0b3IgbG9jYXRvcjsKKworICAgICAgICBASW5qZWN0CisgICAgICAgIHB1YmxpYyBQZXJTZXNzaW9uRmFjdG9yeSgKKyAgICAgICAgICAgICAgICBQcm92aWRlciZsdDtIdHRwU2VydmxldFJlcXVlc3QmZ3Q7IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgU2VydmljZUxvY2F0b3IgbG9jYXRvcikgeworCisgICAgICAgICAgICB0aGlzLnJlcXVlc3RQcm92aWRlciA9IHJlcXVlc3Q7CisgICAgICAgICAgICB0aGlzLmxvY2F0b3IgPSBsb2NhdG9yOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIEBQZXJMb29rdXAKKyAgICAgICAgcHVibGljIFBlclNlc3Npb25SZXNvdXJjZSBwcm92aWRlKCkgeworICAgICAgICAgICAgZmluYWwgSHR0cFNlc3Npb24gc2Vzc2lvbiA9IHJlcXVlc3RQcm92aWRlci5nZXQoKS5nZXRTZXNzaW9uKCk7CisKKyAgICAgICAgICAgIGlmIChzZXNzaW9uLmlzTmV3KCkpIHsKKyAgICAgICAgICAgICAgICBQZXJTZXNzaW9uUmVzb3VyY2UgbmV3SW5zdGFuY2UgPSBjcmVhdGVOZXdQZXJTZXNzaW9uUmVzb3VyY2UoKTsKKyAgICAgICAgICAgICAgICBwZXJTZXNzaW9uTWFwLnB1dChzZXNzaW9uLmdldElkKCksIG5ld0luc3RhbmNlKTsKKworICAgICAgICAgICAgICAgIHJldHVybiBuZXdJbnN0YW5jZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBlclNlc3Npb25NYXAuZ2V0KHNlc3Npb24uZ2V0SWQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZShQZXJTZXNzaW9uUmVzb3VyY2UgcikgeworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBQZXJTZXNzaW9uUmVzb3VyY2UgY3JlYXRlTmV3UGVyU2Vzc2lvblJlc291cmNlKCkgeworICAgICAgICAgICAgZmluYWwgUGVyU2Vzc2lvblJlc291cmNlIHBlclNlc3Npb25SZXNvdXJjZSA9IG5ldyBQZXJTZXNzaW9uUmVzb3VyY2UoKTsKKyAgICAgICAgICAgIGxvY2F0b3IuaW5qZWN0KHBlclNlc3Npb25SZXNvdXJjZSk7CisgICAgICAgICAgICByZXR1cm4gcGVyU2Vzc2lvblJlc291cmNlOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShTZXJ2aWNlTG9jYXRvciBsb2NhdG9yKSB7CisgICAgICAgIHRoaXMubG9jYXRvciA9IGxvY2F0b3I7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gYmluZChDbGFzcyZsdDs/Jmd0OyBjb21wb25lbnQsIFNldCZsdDtDbGFzcyZsdDs/Jmd0OyZndDsgcHJvdmlkZXJDb250cmFjdHMpIHsKKyAgICAgICAgaWYgKGNvbXBvbmVudCA9PSBQZXJTZXNzaW9uUmVzb3VyY2UuY2xhc3MpIHsKKworICAgICAgICAgICAgZmluYWwgRHluYW1pY0NvbmZpZ3VyYXRpb25TZXJ2aWNlIGR5bmFtaWNDb25maWdTZXJ2aWNlID0KKyAgICAgICAgICAgICAgICBsb2NhdG9yLmdldFNlcnZpY2UoRHluYW1pY0NvbmZpZ3VyYXRpb25TZXJ2aWNlLmNsYXNzKTsKKyAgICAgICAgICAgIGZpbmFsIER5bmFtaWNDb25maWd1cmF0aW9uIGR5bmFtaWNDb25maWd1cmF0aW9uID0KKyAgICAgICAgICAgICAgICBkeW5hbWljQ29uZmlnU2VydmljZS5jcmVhdGVEeW5hbWljQ29uZmlndXJhdGlvbigpOworCisgICAgICAgICAgICBCaW5kaW5nQnVpbGRlckZhY3RvcnkKKyAgICAgICAgICAgICAgICAuYWRkQmluZGluZyhCaW5kaW5nQnVpbGRlckZhY3RvcnkubmV3RmFjdG9yeUJpbmRlcihQZXJTZXNzaW9uRmFjdG9yeS5jbGFzcykKKyAgICAgICAgICAgICAgICAudG8oUGVyU2Vzc2lvblJlc291cmNlLmNsYXNzKSwgZHluYW1pY0NvbmZpZ3VyYXRpb24pOworCisgICAgICAgICAgICBkeW5hbWljQ29uZmlndXJhdGlvbi5jb21taXQoKTsKKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRvbmUoKSB7CisgICAgfQorfTwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZSBmaXJzdCBhbmQgdmVyeSBpbXBvcnRhbnQgYXNwZWN0IG9mIHdyaXRpbmcgeW91ciBvd24gJmxpdC5qZXJzZXkuc2VydmVyLnNwaS5Db21wb25lbnRQcm92aWRlcjsKKyAgICAgICAgICAgIGluIEplcnNleSBpcyB0byBzdG9yZSB0aGUgYWN0dWFsIEhLMiAmaGsyLlNlcnZpY2VMb2NhdG9yOyBpbnN0YW5jZSB0aGF0IHdpbGwgYmUgcGFzc2VkIHRvIHlvdSBhcworICAgICAgICAgICAgdGhlIG9ubHkgYXJndW1lbnQgb2YgdGhlIHByb3ZpZGVyIDxsaXRlcmFsPmluaXRpYWxpemU8L2xpdGVyYWw+IG1ldGhvZC4KKyAgICAgICAgICAgIFlvdXIgY29tcG9uZW50IHByb3ZpZGVyIGluc3RhbmNlIHdpbGwgbm90IGdldCBpbmplY3RlZCBhdCBhbGwgc28gdGhpcyBpcyBtb3JlIGxlc3MgeW91ciBvbmx5IGNoYW5jZQorICAgICAgICAgICAgdG8gZ2V0IGFjY2VzcyB0byB0aGUgSEsyIHJ1bnRpbWUgb2YgeW91ciBhcHBsaWNhdGlvbi4gUGxlYXNlIGJlYXIgaW4gbWluZCwgdGhhdCBhdCB0aGUgdGltZSB3aGVuCisgICAgICAgICAgICB5b3VyIGNvbXBvbmVudCBwcm92aWRlciBtZXRob2RzIGdldCBpbnZva2VkLCB0aGUgJmxpdC5oazIuU2VydmljZUxvY2F0b3I7IGlzIG5vdCBmdWxseSBjb25maWd1cmVkIHlldC4KKyAgICAgICAgICAgIFRoaXMgbGltaXRhdGlvbiBhcHBsaWVzIHRvIGFsbCBjb21wb25lbnQgcHJvdmlkZXIgbWV0aG9kcywgYXMgdGhlIG1haW4gZ29hbCBvZiBhbnkgY29tcG9uZW50IHByb3ZpZGVyCisgICAgICAgICAgICBpcyB0byB0YWtlIHBhcnQgaW4gY29uZmlndXJpbmcgdGhlIGFwcGxpY2F0aW9uJ3MgJmxpdC5oazIuU2VydmljZUxvY2F0b3I7LgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBOb3cgbGV0J3MgZXhhbWluZSB0aGUgPGxpdGVyYWw+YmluZDwvbGl0ZXJhbD4gbWV0aG9kLCB3aGljaCBpcyB3aGVyZSB5b3VyIHByb3ZpZGVyIHRlbGxzIHRoZSBISzIKKyAgICAgICAgICAgIGhvdyB0byBiaW5kIHlvdXIgY29tcG9uZW50LgorICAgICAgICAgICAgSmVyc2V5IHdpbGwgaW52b2tlIHRoaXMgbWV0aG9kIG11bHRpcGxlIHRpbWVzLCBvbmNlIGZvciBlYWNoIHR5cGUgdGhhdCBpcyByZWdpc3RlcmVkIHdpdGggdGhlCisgICAgICAgICAgICBhY3R1YWwgYXBwbGljYXRpb24uCisgICAgICAgICAgICBFdmVyeSB0aW1lIHRoZSA8bGl0ZXJhbD5iaW5kPC9saXRlcmFsPiBtZXRob2QgaXMgaW52b2tlZCwgeW91ciBjb21wb25lbnQgcHJvdmlkZXIgbmVlZHMgdG8gZGVjaWRlCisgICAgICAgICAgICBpZiBpdCBpcyB0YWtpbmcgY29udHJvbCBvdmVyIHRoZSBjb21wb25lbnQgb3Igbm90LiBJbiBvdXIgY2FzZSB3ZSBrbm93IGV4YWN0bHkgd2hpY2ggSmF2YSB0eXBlCisgICAgICAgICAgICB3ZSBhcmUgaW50ZXJlc3RlZCBpbiAoPGxpdGVyYWw+UGVyU2Vzc2lvblJlc291cmNlPC9saXRlcmFsPiBjbGFzcyksCisgICAgICAgICAgICBzbyB0aGUgbG9naWMgaW4gb3VyIDxsaXRlcmFsPmJpbmQ8L2xpdGVyYWw+IG1ldGhvZCBpcyBxdWl0ZSBzdHJhaWdodGZvcndhcmQuIElmIHdlIHNlZSBvdXIKKyAgICAgICAgICAgIDxsaXRlcmFsPlBlclNlc3Npb25SZXNvdXJjZTwvbGl0ZXJhbD4gY2xhc3MgaXQgaXMgb3VyIHR1cm4gdG8gcHJvdmlkZSBvdXIgY3VzdG9tIGJpbmRpbmcgZm9yIHRoZSBjbGFzcywKKyAgICAgICAgICAgIG90aGVyd2lzZSB3ZSBqdXN0IHJldHVybiBmYWxzZSB0byBtYWtlIEplcnNleSBwb2xsIG90aGVyIHByb3ZpZGVycyBhbmQsIGlmIG5vIHByb3ZpZGVyIGtpY2tzIGluLAorICAgICAgICAgICAgZXZlbnR1YWxseSBwcm92aWRlIHRoZSBkZWZhdWx0IEhLMiBiaW5kaW5nIGZvciB0aGUgY29tcG9uZW50LgorICAgICAgICAgICAgUGxlYXNlLCByZWZlciB0byB0aGUgJmhrMi5saW5rOyBkb2N1bWVudGF0aW9uIGZvciB0aGUgZGV0YWlscyBvZiB0aGUgY29uY3JldGUgSEsyIEFQSXMgdXNlZCBpbgorICAgICAgICAgICAgdGhlIDxsaXRlcmFsPmJpbmQ8L2xpdGVyYWw+IG1ldGhvZCBpbXBsZW1lbnRhdGlvbiBhYm92ZS4gVGhlIG1haW4gaWRlYSBiZWhpbmQgdGhlIGNvZGUgaXMgdGhhdAorICAgICAgICAgICAgd2UgcmVnaXN0ZXIgYSBuZXcgSEsyICZoazIuRmFjdG9yeTsgKDxsaXRlcmFsPlBlclNlc3Npb25GYWN0b3J5PC9saXRlcmFsPiksIHRvIHByb3ZpZGUKKyAgICAgICAgICAgIHRoZSA8bGl0ZXJhbD5QZXJTZXNzaW9uUmVzb3VyY2U8L2xpdGVyYWw+IGluc3RhbmNlcyB0byBISzIuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgPGxpdGVyYWw+UGVyU2Vzc2lvbkZhY3Rvcnk8L2xpdGVyYWw+IGlzIGlzIGFsc28gaW5jbHVkZWQgYWJvdmUuCisgICAgICAgICAgICBQbGVhc2Ugbm90ZSB0aGF0IGFzIG9wcG9zZWQgdG8gYSBjb21wb25lbnQgcHJvdmlkZXIgaW1wbGVtZW50YXRpb24gdGhhdCBzaG91bGQgbmV2ZXIgaXRzZWxmIHJlbHkKKyAgICAgICAgICAgIG9uIGFuIGluamVjdGlvbiBzdXBwb3J0LCB0aGUgZmFjdG9yeSBib3VuZCBieSBvdXIgY29tcG9uZW50IHByb3ZpZGVyIHdvdWxkIGdldCBpbmplY3RlZCBqdXN0IGZpbmUsCisgICAgICAgICAgICBzaW5jZSBpdCBpcyBvbmx5IGluc3RhbnRpYXRlZCBsYXRlciwgb25jZSB0aGUgSmVyc2V5IHJ1bnRpbWUgZm9yIHRoZSBhcHBsaWNhdGlvbiBpcyBmdWxseQorICAgICAgICAgICAgaW5pdGlhbGl6ZWQgaW5jbHVkaW5nIHRoZSBmdWxseSBjb25maWd1cmVkIEhLMiBydW50aW1lLgorICAgICAgICAgICAgV2hlbmV2ZXIgYSBuZXcgc2Vzc2lvbiBpcyBzZWVuLCB0aGUgZmFjdG9yeSBpbnN0YW50aWF0ZXMgYW5kIGluamVjdHMKKyAgICAgICAgICAgIGEgbmV3IFBlclNlc3Npb25SZXNvdXJjZSBpbnN0YW5jZS4gVGhlIGluc3RhbmNlIGlzIHRoZW4gc3RvcmVkIGluIHRoZSBwZXJTZXNzaW9uTWFwIGZvciBsYXRlciB1c2UKKyAgICAgICAgICAgIChmb3IgZnV0dXJlIGNhbGxzKS4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgSW4gYSByZWFsIGxpZmUgc2NlbmFyaW8sIHlvdSB3b3VsZCB3YW50IHRvIHBheSBtb3JlIGF0dGVudGlvbiB0byBwb3NzaWJsZSBzeW5jaHJvbml6YXRpb24gaXNzdWVzLgorICAgICAgICAgICAgQWxzbywgd2UgZG8gbm90IGNvbnNpZGVyIGEgbWVjaGFuaXNtIHRoYXQgd291bGQgY2xlYW4tdXAgYW55IG9ic29sZXRlIHJlc291cmNlcyBmb3IgY2xvc2VkLCBleHBpcmVkIG9yCisgICAgICAgICAgICBvdGhlcndpc2UgaW52YWxpZGF0ZWQgSFRUUCBjbGllbnQgc2Vzc2lvbnMuCisgICAgICAgICAgICBXZSBoYXZlIG9taXR0ZWQgdGhvc2UgY29uc2lkZXJhdGlvbnMgaGVyZSBmb3IgdGhlIHNha2Ugb2YgYnJldml0eSBvZiBvdXIgZXhhbXBsZS4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKzwvY2hhcHRlcj4KZGlmZiAtLWdpdCBhL2RvY3Mvc3JjL21haW4vZG9jYm9vay9jdXN0b21pemF0aW9ucy54c2wgYi9kb2NzL3NyYy9tYWluL2RvY2Jvb2svY3VzdG9taXphdGlvbnMueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZGVlZTQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3NyYy9tYWluL2RvY2Jvb2svY3VzdG9taXphdGlvbnMueHNsCkBAIC0wLDAgKzEsMTM1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKKyAgICAgICAgICAgICAgICB4bWxuczpkPSJodHRwOi8vZG9jYm9vay5vcmcvbnMvZG9jYm9vayIKKyAgICAgICAgICAgICAgICBleGNsdWRlLXJlc3VsdC1wcmVmaXhlcz0iZCIKKyAgICAgICAgICAgICAgICB2ZXJzaW9uPSIxLjAiPgorCisgICAgPHhzbDppbXBvcnQgaHJlZj0idXJuOmRvY2JreDpzdHlsZXNoZWV0Ii8+CisgICAgPCEtLXhzbDppbXBvcnQgaHJlZj0idXJuOmRvY2JreDpzdHlsZXNoZWV0L2hpZ2hsaWdodC54c2wiLy0tPgorCisgICAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJ1c2VyLmhlYWRlci5jb250ZW50Ij4KKyAgICAgICAgPHhzbDplbGVtZW50IG5hbWU9ImRpdiI+CisgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJzdHlsZSI+ZmxvYXQ6cmlnaHQ8L3hzbDphdHRyaWJ1dGU+CisgICAgICAgICAgICA8eHNsOmVsZW1lbnQgbmFtZT0iYSI+CisgICAgICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0iaHJlZiI+aHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvPC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJpbWciPgorICAgICAgICAgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJzcmMiPmh0dHBzOi8vamVyc2V5LmdpdGh1Yi5pby9pbWFnZXMvamVyc2V5X2xvZ28ucG5nPC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgICAgIDwveHNsOmVsZW1lbnQ+CisgICAgICAgICAgICA8L3hzbDplbGVtZW50PgorICAgICAgICA8L3hzbDplbGVtZW50PgorICAgICAgICA8eHNsOmVsZW1lbnQgbmFtZT0ic21hbGwiPkxpbmtzOgorICAgICAgICAgICAgPHhzbDplbGVtZW50IG5hbWU9ImEiPgorICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPmluZGV4Lmh0bWw8L3hzbDphdHRyaWJ1dGU+CisgICAgICAgICAgICAgICAgVGFibGUgb2YgQ29udGVudHMKKyAgICAgICAgICAgIDwveHNsOmVsZW1lbnQ+IHwgPHhzbDplbGVtZW50IG5hbWU9ImEiPgorICAgICAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPnVzZXItZ3VpZGUuaHRtbDwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgICAgICBTaW5nbGUgSFRNTAorICAgICAgICAgICAgPC94c2w6ZWxlbWVudD4KKyAgICAgICAgPC94c2w6ZWxlbWVudD4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0idXNlci5mb290ZXIuY29udGVudCI+CisgICAgICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJsaW5rIj4KKyAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPmh0dHBzOi8vamVyc2V5LmdpdGh1Yi5pby9zaC9zaENvcmUuY3NzPC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0icmVsIj5zdHlsZXNoZWV0PC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idHlwZSI+dGV4dC9jc3M8L3hzbDphdHRyaWJ1dGU+CisgICAgICAgIDwveHNsOmVsZW1lbnQ+CisgICAgICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJsaW5rIj4KKyAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9ImhyZWYiPmh0dHBzOi8vamVyc2V5LmdpdGh1Yi5pby9zaC9zaFRoZW1lRGVmYXVsdC5jc3M8L3hzbDphdHRyaWJ1dGU+CisgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJyZWwiPnN0eWxlc2hlZXQ8L3hzbDphdHRyaWJ1dGU+CisgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIj50ZXh0L2NzczwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgPC94c2w6ZWxlbWVudD4KKyAgICAgICAgPHhzbDplbGVtZW50IG5hbWU9InNjcmlwdCI+CisgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJzcmMiPmh0dHBzOi8vamVyc2V5LmdpdGh1Yi5pby9zaC9zaENvcmUuanM8L3hzbDphdHRyaWJ1dGU+CisgICAgICAgICAgICA8eHNsOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIj50ZXh0L2phdmFzY3JpcHQ8L3hzbDphdHRyaWJ1dGU+CisgICAgICAgIDwveHNsOmVsZW1lbnQ+CisgICAgICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJzY3JpcHQiPgorICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ic3JjIj5odHRwczovL2plcnNleS5naXRodWIuaW8vc2gvc2hBdXRvbG9hZGVyLmpzPC94c2w6YXR0cmlidXRlPgorICAgICAgICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idHlwZSI+dGV4dC9qYXZhc2NyaXB0PC94c2w6YXR0cmlidXRlPgorICAgICAgICA8L3hzbDplbGVtZW50PgorICAgICAgICA8eHNsOmVsZW1lbnQgbmFtZT0ic2NyaXB0Ij4KKyAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InR5cGUiPnRleHQvamF2YXNjcmlwdDwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgIGZ1bmN0aW9uIHBhdGgoKSB7CisgICAgICAgICAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzLAorICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gW10KKyAgICAgICAgICAgICAgICAgIDsKKworICAgICAgICAgICAgICBmb3IodmFyIGkgPSAwOyBpICZsdDsgYXJncy5sZW5ndGg7IGkrKykKKyAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGFyZ3NbaV0ucmVwbGFjZSgnQCcsICdodHRwczovL2plcnNleS5naXRodWIuaW8vc2gvJykpOworCisgICAgICAgICAgICAgIHJldHVybiByZXN1bHQKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIFN5bnRheEhpZ2hsaWdodGVyLmF1dG9sb2FkZXIuYXBwbHkobnVsbCwgcGF0aCgKKyAgICAgICAgICAgICAgJ2FwcGxlc2NyaXB0ICAgICAgICAgICAgQHNoQnJ1c2hBcHBsZVNjcmlwdC5qcycsCisgICAgICAgICAgICAgICdhY3Rpb25zY3JpcHQzIGFzMyAgICAgIEBzaEJydXNoQVMzLmpzJywKKyAgICAgICAgICAgICAgJ2Jhc2ggc2hlbGwgICAgICAgICAgICAgQHNoQnJ1c2hCYXNoLmpzJywKKyAgICAgICAgICAgICAgJ2NvbGRmdXNpb24gY2YgICAgICAgICAgQHNoQnJ1c2hDb2xkRnVzaW9uLmpzJywKKyAgICAgICAgICAgICAgJ2NwcCBjICAgICAgICAgICAgICAgICAgQHNoQnJ1c2hDcHAuanMnLAorICAgICAgICAgICAgICAnYyMgYy1zaGFycCBjc2hhcnAgICAgICBAc2hCcnVzaENTaGFycC5qcycsCisgICAgICAgICAgICAgICdjc3MgICAgICAgICAgICAgICAgICAgIEBzaEJydXNoQ3NzLmpzJywKKyAgICAgICAgICAgICAgJ2RlbHBoaSBwYXNjYWwgICAgICAgICAgQHNoQnJ1c2hEZWxwaGkuanMnLAorICAgICAgICAgICAgICAnZGlmZiBwYXRjaCBwYXMgICAgICAgICBAc2hCcnVzaERpZmYuanMnLAorICAgICAgICAgICAgICAnZXJsIGVybGFuZyAgICAgICAgICAgICBAc2hCcnVzaEVybGFuZy5qcycsCisgICAgICAgICAgICAgICdncm9vdnkgICAgICAgICAgICAgICAgIEBzaEJydXNoR3Jvb3Z5LmpzJywKKyAgICAgICAgICAgICAgJ2phdmEgICAgICAgICAgICAgICAgICAgQHNoQnJ1c2hKYXZhLmpzJywKKyAgICAgICAgICAgICAgJ2pmeCBqYXZhZnggICAgICAgICAgICAgQHNoQnJ1c2hKYXZhRlguanMnLAorICAgICAgICAgICAgICAnanMganNjcmlwdCBqYXZhc2NyaXB0ICBAc2hCcnVzaEpTY3JpcHQuanMnLAorICAgICAgICAgICAgICAncGVybCBwbCAgICAgICAgICAgICAgICBAc2hCcnVzaFBlcmwuanMnLAorICAgICAgICAgICAgICAncGhwICAgICAgICAgICAgICAgICAgICBAc2hCcnVzaFBocC5qcycsCisgICAgICAgICAgICAgICd0ZXh0IHBsYWluICAgICAgICAgICAgIEBzaEJydXNoUGxhaW4uanMnLAorICAgICAgICAgICAgICAncHkgcHl0aG9uICAgICAgICAgICAgICBAc2hCcnVzaFB5dGhvbi5qcycsCisgICAgICAgICAgICAgICdydWJ5IHJhaWxzIHJvciByYiAgICAgIEBzaEJydXNoUnVieS5qcycsCisgICAgICAgICAgICAgICdzYXNzIHNjc3MgICAgICAgICAgICAgIEBzaEJydXNoU2Fzcy5qcycsCisgICAgICAgICAgICAgICdzY2FsYSAgICAgICAgICAgICAgICAgIEBzaEJydXNoU2NhbGEuanMnLAorICAgICAgICAgICAgICAnc3FsICAgICAgICAgICAgICAgICAgICBAc2hCcnVzaFNxbC5qcycsCisgICAgICAgICAgICAgICd2YiB2Ym5ldCAgICAgICAgICAgICAgIEBzaEJydXNoVmIuanMnLAorICAgICAgICAgICAgICAneG1sIHhodG1sIHhzbHQgaHRtbCAgICBAc2hCcnVzaFhtbC5qcycKKyAgICAgICAgICAgICkpOworCisgICAgICAgICAgICBTeW50YXhIaWdobGlnaHRlci5hbGwoKTsKKyAgICAgICAgPC94c2w6ZWxlbWVudD4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDx4c2w6dGVtcGxhdGUgbmFtZT0idXNlci5oZWFkLmNvbnRlbnQiPgorICAgICAgICA8eHNsOmVsZW1lbnQgbmFtZT0ic2NyaXB0Ij4KKyAgICAgICAgICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InR5cGUiPnRleHQvamF2YXNjcmlwdDwveHNsOmF0dHJpYnV0ZT4KKyAgICAgICAgICAgIHZhciBfZ2FxID0gX2dhcSB8fCBbXTsKKyAgICAgICAgICAgIF9nYXEucHVzaChbJ19zZXRBY2NvdW50JywgJ1VBLTMxNjAzMDMtMSddKTsKKyAgICAgICAgICAgIF9nYXEucHVzaChbJ190cmFja1BhZ2V2aWV3J10pOworCisgICAgICAgICAgICAoZnVuY3Rpb24oKSB7CisgICAgICAgICAgICAgICAgdmFyIGdhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7IGdhLnR5cGUgPSAndGV4dC9qYXZhc2NyaXB0JzsgZ2EuYXN5bmMgPSB0cnVlOworICAgICAgICAgICAgICAgIGdhLnNyYyA9ICgnaHR0cHM6JyA9PSBkb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbCA/ICdodHRwczovL3NzbCcgOiAnaHR0cDovL3d3dycpICsgJy5nb29nbGUtYW5hbHl0aWNzLmNvbS9nYS5qcyc7CisgICAgICAgICAgICAgICAgdmFyIHMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0JylbMF07IHMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZ2EsIHMpOworICAgICAgICAgICAgfSkoKTsKKyAgICAgICAgPC94c2w6ZWxlbWVudD4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImQ6cHJvZ3JhbWxpc3RpbmciPgorPHhzbDplbGVtZW50IG5hbWU9InByZSI+PHhzbDphdHRyaWJ1dGUgbmFtZT0iY2xhc3MiPgorICAgIHRvb2xiYXI6IGZhbHNlOworICAgIGJydXNoOiA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iQGxhbmd1YWdlIi8+OworICAgIDx4c2w6aWYgdGVzdD0iQGxpbmVudW1iZXJpbmcgPSAndW5udW1iZXJlZCciPmd1dHRlcjogZmFsc2U7PC94c2w6aWY+CisgICAgPHhzbDppZiB0ZXN0PSJAc3RhcnRpbmdsaW5lbnVtYmVyICZndDsgMSI+Zmlyc3QtbGluZTogPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkBzdGFydGluZ2xpbmVudW1iZXIiLz47PC94c2w6aWY+Cis8L3hzbDphdHRyaWJ1dGU+PHhzbDphcHBseS10ZW1wbGF0ZXMvPjwveHNsOmVsZW1lbnQ+CisgICAgPC94c2w6dGVtcGxhdGU+Cis8L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvZG9jcy9zcmMvbWFpbi9kb2Nib29rL2RlY2xhcmF0aXZlLWxpbmtpbmcueG1sIGIvZG9jcy9zcmMvbWFpbi9kb2Nib29rL2RlY2xhcmF0aXZlLWxpbmtpbmcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNDI4NmMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3NyYy9tYWluL2RvY2Jvb2svZGVjbGFyYXRpdmUtbGlua2luZy54bWwKQEAgLTAsMCArMSwzNzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPCFET0NUWVBFIGNoYXB0ZXIgWzwhRU5USVRZICUgZW50cyBTWVNURU0gImplcnNleS5lbnQiID4gJWVudHM7IF0+Cis8Y2hhcHRlciB4bWxucz0iaHR0cDovL2RvY2Jvb2sub3JnL25zL2RvY2Jvb2siCisgICAgICAgICB2ZXJzaW9uPSI1LjAiCisgICAgICAgICB4bWw6bGFuZz0iZW4iCisgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiCisgICAgICAgICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKKyAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2RvY2Jvb2sub3JnL25zL2RvY2Jvb2sgaHR0cDovL2RvY2Jvb2sub3JnL3htbC81LjAveHNkL2RvY2Jvb2sueHNkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsgaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluay54c2QiCisgICAgICAgICB4bWw6aWQ9ImRlY2xhcmF0aXZlLWxpbmtpbmciPgorCisgICAgPHRpdGxlPkRlY2xhcmF0aXZlIEh5cGVybGlua2luZzwvdGl0bGU+CisKKyAgICA8cGFyYT4KKyAgICAgICAgPGxpbmsgeGxpbms6aHJlZj0iaHR0cDovL3JveS5nYml2LmNvbS91bnRhbmdsZWQvMjAwOC9yZXN0LWFwaXMtbXVzdC1iZS1oeXBlcnRleHQtZHJpdmVuIj5SRVNUZnVsIEFQSXMgbXVzdCBiZQorICAgICAgICAgICAgaHlwZXJ0ZXh0LWRyaXZlbjwvbGluaz4uIEpBWC1SUyBjdXJyZW50bHkgb2ZmZXJzICZqYXhycy5jb3JlLlVyaUJ1aWxkZXI7IHRvIHNpbXBsaWZ5IFVSSQorICAgICAgICBjcmVhdGlvbiBidXQgSmVyc2V5IGFkZHMgYW4gYWRkaXRpb25hbCBhbm5vdGF0aW9uLWJhc2VkIGFsdGVybmF0aXZlIHRoYXQgaXMgZGVzY3JpYmVkIGhlcmUuCisgICAgPC9wYXJhPgorICAgIDxpbXBvcnRhbnQ+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhpcyBBUEkgaXMgY3VycmVudGx5IHVuZGVyIGRldmVsb3BtZW50IGFuZCBleHBlcmltZW50YWwgc28gaXQgaXMgc3ViamVjdCB0byBjaGFuZ2UgYXQgYW55IHRpbWUuCisgICAgICAgIDwvcGFyYT4KKyAgICA8L2ltcG9ydGFudD4KKworICAgIDxzZWN0aW9uPgorICAgICAgICA8dGl0bGU+RGVwZW5kZW5jeTwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUbyB1c2UgRGVjbGFyYXRpdmUgTGlua2luZyB5b3UgbmVlZCB0byBhZGQgJmxpdC5qZXJzZXktZGVjbGFyYXRpdmUtbGlua2luZzsgbW9kdWxlIHRvIHlvdXIgJmxpdC5wb20ueG1sOyBmaWxlOgorCisgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9InhtbCIgbGluZW51bWJlcmluZz0idW5udW1iZXJlZCI+Jmx0O2RlcGVuZGVuY3kmZ3Q7CisgICAgJmx0O2dyb3VwSWQmZ3Q7b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0Jmx0Oy9ncm91cElkJmd0OworICAgICZsdDthcnRpZmFjdElkJmd0O2plcnNleS1kZWNsYXJhdGl2ZS1saW5raW5nJmx0Oy9hcnRpZmFjdElkJmd0OworICAgICZsdDt2ZXJzaW9uJmd0OyZ2ZXJzaW9uOyZsdDsvdmVyc2lvbiZndDsKKyZsdDsvZGVwZW5kZW5jeSZndDs8L3Byb2dyYW1saXN0aW5nPgorCisgICAgICAgICAgICBBZGRpdGlvbmFsbHkgeW91IHdpbGwgbmVlZCB0byBhZGQgdGhlIGZvbGxvd2luZyBkZXBlbmRlbmNpZXMsIGlmIHlvdSBhcmUgbm90IGRlcGxveWluZworICAgICAgICAgICAgaW50byBhIGNvbnRhaW5lciB0aGF0IGlzIGFscmVhZHkgaW5jbHVkaW5nIHRoZW06CisKKyAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0ieG1sIiBsaW5lbnVtYmVyaW5nPSJ1bm51bWJlcmVkIj4mbHQ7ZGVwZW5kZW5jeSZndDsKKyAgICAmbHQ7Z3JvdXBJZCZndDtqYXZheC5lbCZsdDsvZ3JvdXBJZCZndDsKKyAgICAmbHQ7YXJ0aWZhY3RJZCZndDtqYXZheC5lbC1hcGkmbHQ7L2FydGlmYWN0SWQmZ3Q7CisgICAgJmx0O3ZlcnNpb24mZ3Q7JmphdmF4LWVsLnZlcnNpb247Jmx0Oy92ZXJzaW9uJmd0OworJmx0Oy9kZXBlbmRlbmN5Jmd0OzwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0ieG1sIiBsaW5lbnVtYmVyaW5nPSJ1bm51bWJlcmVkIj4mbHQ7ZGVwZW5kZW5jeSZndDsKKyAgICAmbHQ7Z3JvdXBJZCZndDtvcmcuZ2xhc3NmaXNoLndlYiZsdDsvZ3JvdXBJZCZndDsKKyAgICAmbHQ7YXJ0aWZhY3RJZCZndDtqYXZheC5lbCZsdDsvYXJ0aWZhY3RJZCZndDsKKyAgICAmbHQ7dmVyc2lvbiZndDsmamF2YXgtZWwtaW1wbC52ZXJzaW9uOyZsdDsvdmVyc2lvbiZndDsKKyZsdDsvZGVwZW5kZW5jeSZndDs8L3Byb2dyYW1saXN0aW5nPgorCisgICAgICAgICAgICBJZiB5b3UncmUgbm90IHVzaW5nIE1hdmVuIG1ha2Ugc3VyZSB0byBoYXZlIGFsbCBuZWVkZWQgZGVwZW5kZW5jaWVzIChzZWUgJmplcnNleS5leHQuZGVjbGFyYXRpdmUtbGlua2luZy5kZXBzLmxpbms7KSBvbgorICAgICAgICAgICAgdGhlIGNsYXNzcGF0aC4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKworCisgICAgPHNlY3Rpb24+CisgICAgICAgIDx0aXRsZT5MaW5rcyBpbiBSZXByZXNlbnRhdGlvbnM8L3RpdGxlPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgTGlua3MgYXJlIGFkZGVkIHRvIHJlcHJlc2VudGF0aW9ucyB1c2luZyB0aGUgPGxpdGVyYWw+QEluamVjdExpbms8L2xpdGVyYWw+IGFubm90YXRpb24gb24KKyAgICAgICAgICAgIGVudGl0eSBjbGFzcyBmaWVsZHMuIFRoZSBKZXJzZXkgcnVudGltZSBpcyByZXNwb25zaWJsZSBmb3IgaW5qZWN0aW5nIHRoZSBhcHByb3ByaWF0ZSBVUkkKKyAgICAgICAgICAgIGludG8gdGhlIGZpZWxkIHByaW9yIHRvIHNlcmlhbGl6YXRpb24gYnkgYSBtZXNzYWdlIGJvZHkgd3JpdGVyLiBFLmcuIGNvbnNpZGVyIHRoZQorICAgICAgICAgICAgZm9sbG93aW5nIHJlc291cmNlIGFuZCBlbnRpdHkgY2xhc3NlczoKKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSI+QFBhdGgoIndpZGdldHMiKQorcHVibGljIGNsYXNzIFdpZGdldHNSZXNvdXJjZSB7CisgICAgQEdFVAorICAgIHB1YmxpYyBXaWRnZXRzIGdldCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBXaWRnZXRzKCk7CisgICAgfQorfQorCitwdWJsaWMgY2xhc3MgV2lkZ2V0cyB7CisgICAgQEluamVjdExpbmsocmVzb3VyY2U9V2lkZ2V0c1Jlc291cmNlLmNsYXNzKQorICAgIFVSSSB1OworfTwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBBZnRlciBhIGNhbGwgdG88bGl0ZXJhbD5XaWRnZXRzUmVzb3VyY2UjZ2V0PC9saXRlcmFsPiwgdGhlIEplcnNleSBydW50aW1lIHdpbGwgaW5qZWN0IHRoZSB2YWx1ZQorICAgICAgICAgICAgPGxpdGVyYWw+Ii9jb250ZXh0L3dpZGdldHMiPC9saXRlcmFsPgorICAgICAgICAgICAgPGZvb3Rub3RlPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBXaGVyZSA8bGl0ZXJhbD4vY29udGV4dDwvbGl0ZXJhbD4gaXMgdGhlIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgY29udGV4dC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2Zvb3Rub3RlPgorICAgICAgICAgICAgaW50byB0aGUgcmV0dXJuZWQgPGxpdGVyYWw+V2lkZ2V0czwvbGl0ZXJhbD4gaW5zdGFuY2UuIElmIGFuIGFic29sdXRlIFVSSSBpcworICAgICAgICAgICAgZGVzaXJlZCBpbnN0ZWFkIG9mIGFuIGFic29sdXRlIHBhdGggdGhlbiB0aGUgYW5ub3RhdGlvbiBjYW4gYmUgY2hhbmdlZCB0bworICAgICAgICAgICAgPGxpdGVyYWw+QEluamVjdExpbmsocmVzb3VyY2U9V2lkZ2V0c1Jlc291cmNlLmNsYXNzLCBzdHlsZT1BQlNPTFVURSk8L2xpdGVyYWw+LgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhlIGFib3ZlIHVzYWdlIHdvcmtzIG5pY2VseSB3aGVuIHRoZXJlJ3MgYWxyZWFkeSBhIFVSSSB0ZW1wbGF0ZSBvbiBhIGNsYXNzIHRoYXQgeW91CisgICAgICAgICAgICB3YW50IHRvIHJldXNlLiBJZiB0aGVyZSdzIG5vIHN1Y2ggdGVtcGxhdGUgYXZhaWxhYmxlIHRoZW4geW91IGNhbiB1c2UgYSBsaXRlcmFsIHZhbHVlCisgICAgICAgICAgICBpbnN0ZWFkIG9mIGEgcmVmZXJlbmNlLiBFLmcuIHRoZSBmb2xsb3dpbmcgaXMgZXF1aXZhbGVudCB0byB0aGUgZWFybGllciBleGFtcGxlOgorICAgICAgICAgICAgPGxpdGVyYWw+QEluamVjdExpbmsodmFsdWU9IndpZGdldHMiLCBzdHlsZT1BQlNPTFVURSk8L2xpdGVyYWw+LgorICAgICAgICA8L3BhcmE+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24+CisgICAgICAgIDx0aXRsZT5MaXN0IG9mIExpbmsgSW5qZWN0aW9uPC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBZb3UgY2FuIGluamVjdCBtdWx0aXBsZSBsaW5rcyBpbnRvIGFuIGFycmF5IG9yIGEgTGlzdCBjb2xsZWN0aW9uIHR5cGUuIEUuZy46CisgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiPkBJbmplY3RMaW5rcyh7QEluamVjdExpbmsocmVzb3VyY2U9V2lkZ2V0c1Jlc291cmNlLmNsYXNzLCByZWwgPSAic2VsZiIpfSkKK0xpc3QmbHQ7TGluayZndDsgbGlua3M8L3Byb2dyYW1saXN0aW5nPgorCisgICAgICAgICAgICBUaGUgZmllbGQgZG9lc24ndCBuZWVkIHRvIGJlIGluaXRpYWxpemVkLiBIb3dldmVyLCBpZiBpdCBhbHJlYWR5IGNvbnRhaW5zIGEgY29sbGVjdGlvbiB3aXRoIG1hbnVhbGx5IGNyZWF0ZWQgbGlua3MsCisgICAgICAgICAgICB0aGVuIGl0IHdpbGwgbWVyZ2UgdGhvc2Ugd2l0aCB0aGUgZ2VuZXJhdGVkIGxpbmtzIGludG8gYSBuZXcgY29sbGVjdGlvbiB3aGljaCB0aGVuIHJlcGxhY2VzIHRoZSBmaWVsZCB2YWx1ZS4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uPgorICAgICAgICA8dGl0bGU+TGlua3MgZnJvbSBSZXNvdXJjZXM8L3RpdGxlPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQXMgYW4gYWx0ZXJuYXRpdmUgdG8gZGVmaW5pbmcgdGhlIGxpbmtzIGluIHRoZSBlbnRpdHkgY2xhc3MsIHRoZXkgY2FuIGFsc28gYmUgZGVmaW5lZCBpbiB0aGUgcmVzb3VyY2UgY2xhc3NlcyBieQorICAgICAgICAgICAgYW5ub3RhdGluZyB0aGUgcmVzb3VyY2UgbWV0aG9kcyB3aXRoIDxsaXRlcmFsPkBQcm92aWRlTGluazwvbGl0ZXJhbD4uIFRoaXMgaGFzIHRoZSBiZW5lZml0LCB0aGF0IHRoZSB0YXJnZXQKKyAgICAgICAgICAgIG1ldGhvZCBpcyBhbHJlYWR5IGtub3duIGFuZCBkb2Vzbid0IG5lZWQgdG8gYmUgcmVmZXJlbmNlZC4gT3RoZXIgdGhhbiB0aGF0IGl0IGhhcyB0aGUgc2FtZSBwYXJhbWV0ZXJzIGFuZCBiZWhhdmlvcnMKKyAgICAgICAgICAgIGFzIDxsaXRlcmFsPkBJbmplY3RMaW5rPC9saXRlcmFsPi4gVGhlIGVudGl0eSBjbGFzc2VzIG5lZWQgdG8gaGF2ZSBhIGZpZWxkIGFubm90YXRlZCB3aXRoCisgICAgICAgICAgICA8bGl0ZXJhbD5ASW5qZWN0TGlua3M8L2xpdGVyYWw+LCB3aGljaCBjYW4gYmUgZW1wdHkuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZSA8bGl0ZXJhbD5AUHJvdmlkZUxpbms8L2xpdGVyYWw+IGFubm90YXRpb24gY2FuIGJlIHJlcGVhdGVkIHRvIGFkZCBsaW5rcyB0byBkaWZmZXJlbnQgZW50aXRpZXMgdXNpbmcgZGlmZmVyZW50CisgICAgICAgICAgICBvcHRpb25zLiBFbnRpdGllcyBhcmUgZGVmaW5lZCB2aWEgdGhlIDxsaXRlcmFsPnZhbHVlPC9saXRlcmFsPiBwcm9wZXJ0eS4gSWYgdGhlIGVudGl0aWVzIGFyZSBzaW1pbGFyIGluIHN0cnVjdHVyZSB0aGV5CisgICAgICAgICAgICBjYW4gYWxzbyBkZWNsYXJlZCBhcyBhbiBhcnJheS4gPGxpdGVyYWw+QFByb3ZpZGVMaW5rPC9saXRlcmFsPiBhbHNvIHdvcmtzIHdpdGggY2xhc3MgaGllcmFyY2hpZXMsIGUuZy4sIGNvbnRyaWJ1dGlvbnMKKyAgICAgICAgICAgIGRlZmluZWQgZm9yIGEgc3VwZXJjbGFzcyB3aWxsIGFsc28gYmUgaW5qZWN0ZWQgaW50byB0aGUgZGVyaXZlZCBjbGFzc2VzIChpbnRlcmZhY2VzIGFyZSBub3Qgc3VwcG9ydGVkKS4KKworICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIj5AUHJvdmlkZUxpbmsodmFsdWUgPSBPcmRlci5jbGFzcyxyZWwgPSAic2VsZiIsCisgICAgIGJpbmRpbmdzID0gQEJpbmRpbmcobmFtZSA9ICJvcmRlcklkIiwgdmFsdWUgPSAiJHtpbnN0YW5jZS5pZH0iKSkKK0BQcm92aWRlTGluayh2YWx1ZSA9IFBheW1lbnRDb25maXJtYXRpb24uY2xhc3MsIHJlbCA9ICJvcmRlciIsCisgICAgIGJpbmRpbmdzID0gQEJpbmRpbmcobmFtZSA9ICJvcmRlcklkIiwgdmFsdWUgPSAiJHtpbnN0YW5jZS5vcmRlcklkfSIpKQorQEdFVAorQFBhdGgoIi97b3JkZXJJZH0iKQorcHVibGljIFJlc3BvbnNlIGdldChAUGF0aFBhcmFtKCJvcmRlcklkIikgU3RyaW5nIG9yZGVySWQpPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uPgorICAgICAgICA8dGl0bGU+QmluZGluZyBUZW1wbGF0ZSBQYXJhbWV0ZXJzPC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFJlZmVyZW5jZWQgb3IgbGl0ZXJhbCB0ZW1wbGF0ZXMgbWF5IGNvbnRhaW4gcGFyYW1ldGVycy4gVHdvIGZvcm1zIG9mIHBhcmFtZXRlcnMgYXJlCisgICAgICAgICAgICBzdXBwb3J0ZWQ6CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgVVJJIHRlbXBsYXRlIHBhcmFtZXRlcnMsIGUuZy4gPGxpdGVyYWw+d2lkZ2V0cy97aWR9PC9saXRlcmFsPiB3aGVyZSA8bGl0ZXJhbD57aWR9PC9saXRlcmFsPiByZXByZXNlbnRzCisgICAgICAgICAgICAgICAgICAgIGEgdmFyaWFibGUgcGFydCBvZiB0aGUgVVJJLgorICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgRUwgZXhwcmVzc2lvbnMsIGUuZy4gPGxpdGVyYWw+d2lkZ2V0cy8ke2luc3RhbmNlLmlkfTwvbGl0ZXJhbD4gd2hlcmUgPGxpdGVyYWw+JHtpbnN0YW5jZS5pZH08L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgIGlzIGFuIEVMIGV4cHJlc3Npb24uCisgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgUGFyYW1ldGVyIHZhbHVlcyBjYW4gYmUgZXh0cmFjdGVkIGZyb20gdGhyZWUgaW1wbGljaXQgYmVhbnM6CisgICAgICAgICAgICA8dmFyaWFibGVsaXN0PgorICAgICAgICAgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDx0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+aW5zdGFuY2U8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgIDwvdGVybT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+UmVwcmVzZW50cyB0aGUgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIHRoYXQgY29udGFpbnMgdGhlIGFubm90YXRlZCBmaWVsZC48L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgICAgICAgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPHRlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5lbnRpdHk8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgIDwvdGVybT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+UmVwcmVzZW50cyB0aGUgZW50aXR5IGNsYXNzIGluc3RhbmNlIHJldHVybmVkIGJ5IHRoZSByZXNvdXJjZSBtZXRob2QuPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDwvdmFybGlzdGVudHJ5PgorICAgICAgICAgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDx0ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+cmVzb3VyY2U8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgIDwvdGVybT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+UmVwcmVzZW50cyB0aGUgcmVzb3VyY2UgY2xhc3MgaW5zdGFuY2UgdGhhdCByZXR1cm5lZCB0aGUgZW50aXR5LjwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKyAgICAgICAgICAgIDwvdmFyaWFibGVsaXN0PgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBCeSBkZWZhdWx0IFVSSSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgdmFsdWVzIGFyZSBleHRyYWN0ZWQgZnJvbSB0aGUgaW1wbGljaXQgPGxpdGVyYWw+aW5zdGFuY2U8L2xpdGVyYWw+IGJlYW4sCisgICAgICAgICAgICBpLmUuIHRoZSBmb2xsb3dpbmcgdHdvIGFubm90YXRpb25zIGFyZSBlcXVpdmFsZW50OgorCisgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiPkBJbmplY3RMaW5rKCJ3aWRnZXRzL3tpZH0iKQorCitASW5qZWN0TGluaygid2lkZ2V0cy8ke2luc3RhbmNlLmlkfSIpPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhlIHNvdXJjZSBmb3IgVVJJIHRlbXBsYXRlIHBhcmFtZXRlciB2YWx1ZXMgY2FuIGJlIGNoYW5nZWQgdXNpbmcgdGhlIDxsaXRlcmFsPkBCaW5kaW5nPC9saXRlcmFsPgorICAgICAgICAgICAgYW5ub3RhdGlvbiwgRS5nLiB0aGUgZm9sbG93aW5nIHRocmVlIGFubm90YXRpb25zIGFyZSBlcXVpdmFsZW50OgorICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIj5ASW5qZWN0TGluayh2YWx1ZT0id2lkZ2V0cy97aWR9IiwgYmluZGluZ3M9eworICAgIEBCaW5kaW5nKG5hbWU9ImlkIiB2YWx1ZT0iJHtyZXNvdXJjZS5pZH0ifQorKQorCitASW5qZWN0TGluayh2YWx1ZT0id2lkZ2V0cy97dmFsdWV9IiwgYmluZGluZ3M9eworICAgIEBCaW5kaW5nKCIke3Jlc291cmNlLmlkfSIpfSkKK0BJbmplY3RMaW5rKCJ3aWRnZXRzLyR7cmVzb3VyY2UuaWR9Iik8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8L3BhcmE+CisKKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbj4KKyAgICAgICAgPHRpdGxlPkNvbmRpdGlvbmFsIExpbmsgSW5qZWN0aW9uPC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBMaW5rIHZhbHVlIGluamVjdGlvbiBjYW4gYmUgbWFkZSBjb25kaXRpb25hbCBieSB1c2Ugb2YgdGhlIDxsaXRlcmFsPmNvbmRpdGlvbjwvbGl0ZXJhbD4gcHJvcGVydHkuCisgICAgICAgICAgICBUaGUgdmFsdWUgb2YgdGhpcyBwcm9wZXJ0eSBpcyBhIGJvb2xlYW4gRUwgZXhwcmVzc2lvbiBhbmQgYSBsaW5rIHdpbGwgb25seSBiZSBpbmplY3RlZCBpZiB0aGUgY29uZGl0aW9uCisgICAgICAgICAgICBleHByZXNzaW9uIGV2YWx1YXRlcyB0byB0cnVlLiBFLmcuOgorCisgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiPkBJbmplY3RMaW5rKHZhbHVlPSJ3aWRnZXRzLyR7aW5zdGFuY2UuaWR9L29mZmVycyIsCisgICAgY29uZGl0aW9uPSIke2luc3RhbmNlLm9mZmVyc30iKQorVVJJIG9mZmVyczs8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBJbiB0aGUgYWJvdmUsIGEgVVJJIHdpbGwgb25seSBiZSBpbmplY3RlZCBpbnRvIHRoZSA8bGl0ZXJhbD5vZmZlcnM8L2xpdGVyYWw+IGZpZWxkIGlmIHRoZQorICAgICAgICAgICAgPGxpdGVyYWw+b2ZmZXJzPC9saXRlcmFsPiBwcm9wZXJ0eSBvZiB0aGUgaW5zdGFuY2UgaXMgPGxpdGVyYWw+dHJ1ZTwvbGl0ZXJhbD4uCisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbj4KKyAgICAgICAgPHRpdGxlPkxpbmsgSGVhZGVyczwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgPGxpbmsgeGxpbms6aHJlZj0iaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNTk4OCNzZWN0aW9uLTUiPkhUVFAgTGluayBoZWFkZXJzPC9saW5rPiBjYW4gYWxzbyBiZSBhZGRlZAorICAgICAgICAgICAgdG8gcmVzcG9uc2VzIHVzaW5nIGFubm90YXRpb25zLiBJbnN0ZWFkIG9mIGFubm90YXRpbmcgdGhlIGZpZWxkcyBvZiBhbiBlbnRpdHkgY2xhc3Mgd2l0aAorICAgICAgICAgICAgPGxpdGVyYWw+QEluamVjdExpbms8L2xpdGVyYWw+LCB5b3UgaW5zdGVhZCBhbm5vdGF0ZSB0aGUgZW50aXR5IGNsYXNzIGl0c2VsZiB3aXRoCisgICAgICAgICAgICA8bGl0ZXJhbD5ASW5qZWN0TGlua3M8L2xpdGVyYWw+LiBFLmcuOgorICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIj5ASW5qZWN0TGlua3MoCisgICAgQEluamVjdExpbmsodmFsdWU9IndpZGdldHMvJHtyZXNvdXJjZS5uZXh0SWR9IiwgcmVsPSJuZXh0IikKKyk8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaGUgYWJvdmUgd291bGQgaW5zZXJ0IGEgSFRUUCBMaW5rIGhlYWRlciBpbnRvIGFueSByZXNwb25zZSB3aG9zZSBlbnRpdHkgd2FzIHRodXMgYW5ub3RhdGVkLgorICAgICAgICAgICAgVGhlIDxsaXRlcmFsPkBJbmplY3RMaW5rPC9saXRlcmFsPiBhbm5vdGF0aW9uIGNvbnRhaW5zIHByb3BlcnRpZXMgdGhhdCBtYXAgdG8gdGhlIHBhcmFtZXRlcnMKKyAgICAgICAgICAgIG9mIHRoZSBIVFRQIExpbmsgaGVhZGVyLiBUaGUgYWJvdmUgc3BlY2lmaWVzIHRoZSBsaW5rIHJlbGF0aW9uIGFzIDxsaXRlcmFsPm5leHQ8L2xpdGVyYWw+LgorICAgICAgICAgICAgQWxsIHByb3BlcnRpZXMgb2YgdGhlIDxsaXRlcmFsPkBJbmplY3RMaW5rPC9saXRlcmFsPiBhbm5vdGF0aW9uIG1heSBiZSB1c2VkIGFzIGRlc2NyaWJlZCBhYm92ZS4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgTXVsdGlwbGUgbGluayBoZWFkZXJzIGNhbiBiZSBhZGRlZCBieSB1c2Ugb2YgdGhlIDxsaXRlcmFsPkBJbmplY3RMaW5rczwvbGl0ZXJhbD4gYW5ub3RhdGlvbgorICAgICAgICAgICAgd2hpY2ggY2FuIGNvbnRhaW4gbXVsdGlwbGUgPGxpdGVyYWw+QEluamVjdExpbms8L2xpdGVyYWw+IGFubm90YXRpb25zLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBSZXNvdXJjZSBsaW5rcyB2aWEgPGxpdGVyYWw+QFByb3ZpZGVMaW5rPC9saXRlcmFsPiBhcmUgY3VycmVudGx5IG5vdCBzdXBwb3J0ZWQgZm9yIGxpbmsgaGVhZGVycy4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uPgorICAgICAgICA8dGl0bGU+UHJldmVudCBSZWN1cnNpdmUgSW5qZWN0aW9uPC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBCeSBkZWZhdWx0LCBKZXJzZXkgd2lsbCB0cnkgdG8gcmVjdXJzaXZlbHkgZmluZCBhbGwgPGxpdGVyYWw+QEluamVjdGlvbkxpbms8L2xpdGVyYWw+IGFubm90YXRpb25zIGluCisgICAgICAgICAgICB0aGUgbWVtYmVycyBvZiB5b3VyIG9iamVjdCB1bmxlc3MgdGhpcyBtZW1iZXIgaXMgYW5ub3RhdGVkIHdpdGggPGxpdGVyYWw+QFhtbFRyYW5zaWVudDwvbGl0ZXJhbD4uCisKKyAgICAgICAgICAgIEJ1dCBpbiBzb21lIGNhc2VzLCB5b3UgbWlnaHQgd2FudCB0byBjb250cm9sIHdoaWNoIG1lbWJlciB3aWxsIGJlIGludHJvc3BlY3RlZCByZWdhcmRsZXNzIG9mIHRoZQorICAgICAgICAgICAgPGxpdGVyYWw+QFhtbFRyYW5zaWVudDwvbGl0ZXJhbD4gYW5ub3RhdGlvbi4KKworICAgICAgICAgICAgWW91IGNhbiBwcmV2ZW50IEplcnNleSB0byBsb29rIGludG8gYW4gb2JqZWN0IGJ5IGFkZGluZyA8bGl0ZXJhbD5ASW5qZWN0TGlua05vRm9sbG93PC9saXRlcmFsPiB0byBhIGZpZWxkLgorCisgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiPkBJbmplY3RMaW5rTm9Gb2xsb3cKK0NvbnRleHQgY29udGV4dDs8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8L3BhcmE+CisgICAgPC9zZWN0aW9uPgorCisKKyAgICA8c2VjdGlvbj4KKyAgICAgICAgPHRpdGxlPk1ldGEtYW5ub3RhdGlvbiBzdXBwb3J0PC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaGUgPGxpdGVyYWw+QFByb3ZpZGVMaW5rPC9saXRlcmFsPiBhbm5vdGF0aW9uIGNhbiBiZSB1c2VkIGFzIGEgbWV0YS1hbm5vdGF0aW9uLCBpLmUuLCBhbm5vdGF0aW5nIHlvdXIgb3duIGFubm90YXRpb24uCisgICAgICAgICAgICBUaGlzIGVuYWJsZXMgeW91IHRvIGNyZWF0ZSBjdXN0b20gYW5ub3RhdGlvbnMgdG8gcmV1c2UgPGxpdGVyYWw+QFByb3ZpZGVMaW5rPC9saXRlcmFsPiBjb25maWd1cmF0aW9ucyBpbnN0ZWFkIG9mCisgICAgICAgICAgICBjb3B5IHBhc3RpbmcgdGhlbSBvbiBlYWNoIG1ldGhvZC4gVGhlcmUgaXMgYSBzcGVjaWFsIG1hcmtlciBjbGFzcyA8bGl0ZXJhbD5Qcm92aWRlTGluay5Jbmhlcml0RnJvbUFubm90YXRpb248L2xpdGVyYWw+CisgICAgICAgICAgICB0aGF0IGNhbiBiZSB1c2VkIGluIHBsYWNlIG9mIHRoZSBhY3R1YWwgZW50aXR5IGNsYXNzLCB0aGlzIGluZGljYXRlcyB0aGF0IHRoZSA8bGl0ZXJhbD5DbGFzcyZsdDs/PiB2YWx1ZSgpPC9saXRlcmFsPgorICAgICAgICAgICAgZnJvbSB0aGUgY3VzdG9tIGFubm90YXRpb24gc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4KKworICAgICAgICAgICAgUmVwZWF0ZWQgYW5ub3RhdGlvbnMgYXJlIGN1cnJlbnRseSB1bnN1cHBvcnRlZCBmb3IgdGhpcyBmZWF0dXJlLiBBbHNvIHRoZSAgPGxpdGVyYWw+Q2xhc3MmbHQ7Pz4gdmFsdWUoKTwvbGl0ZXJhbD4KKyAgICAgICAgICAgIG1ldGhvZCBtdXN0IHJldHVybiBhIHNpbmdsZSBjbGFzcyBhbmQgbm90IGFuIGFycmF5IG9mIGNsYXNzZXMuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKworICAgICAgICAgICAgSGVyZSBpcyBhbiBleGFtcGxlIChnZXR0ZXIvc2V0dGVyIG9taXR0ZWQgZm9yIGJyZXZpdHkpIG9mIGhvdyBhIG1ldGEgYW5ub3RhdGlvbiBjYW4gYmUgdXNlZC4KKyAgICAgICAgICAgIFRoZSBleGFtcGxlIGFwcCB1c2VzIGEgPGxpdGVyYWw+UGFnZTwvbGl0ZXJhbD4gY2xhc3MgYXMgYSBiYXNlIGNsYXNzIGZvciBhbGwgZW50aXRpZXMgdGhhdCBjb250YWluIHBhZ2VkIGRhdGEuCisKKyAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSI+cHVibGljIGNsYXNzIFBhZ2UgeworICAgIHByaXZhdGUgaW50IG51bWJlcjsKKworICAgIHByaXZhdGUgaW50IHNpemU7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNQcmV2aW91c1BhZ2VBdmFpbGFibGU7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNOZXh0UGFnZUF2YWlsYWJsZTsKKworICAgIEBJbmplY3RMaW5rcworICAgIHByaXZhdGUgTGlzdCZsdDtMaW5rPiBsaW5rczsKK308L3Byb2dyYW1saXN0aW5nPgorCisgICAgICAgICAgICBJbnN0ZWFkIG9mIGR1cGxpY2F0aW5nIHRoZSA8bGl0ZXJhbD5AUHJvdmlkZUxpbms8L2xpdGVyYWw+IGFubm90YXRpb25zIGZvciB0aGUgIG5leHQgYW5kIHByZXZpb3VzIGxpbmtzIG9uIGV2ZXJ5CisgICAgICAgICAgICBtZXRob2QsIHdlIGNyZWF0ZSB0aGUgZm9sbG93aW5nIDxsaXRlcmFsPkBQYWdlTGlua3M8L2xpdGVyYWw+IGFubm90YXRpb24uCisKKyAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSI+QFByb3ZpZGVMaW5rKHZhbHVlID0gUHJvdmlkZUxpbmsuSW5oZXJpdEZyb21Bbm5vdGF0aW9uLmNsYXNzLCByZWwgPSAibmV4dCIsCisgICAgYmluZGluZ3MgPSB7CisgICAgICAgIEBCaW5kaW5nKG5hbWUgPSAicGFnZSIsIHZhbHVlID0gIiR7aW5zdGFuY2UubnVtYmVyICsgMX0iKSwKKyAgICAgICAgQEJpbmRpbmcobmFtZSA9ICJzaXplIiwgdmFsdWUgPSAiJHtpbnN0YW5jZS5zaXplfSIpLAorICAgIH0sIGNvbmRpdGlvbiA9ICIke2luc3RhbmNlLm5leHRQYWdlQXZhaWxhYmxlfSIpCitAUHJvdmlkZUxpbmsodmFsdWUgPSBQcm92aWRlTGluay5Jbmhlcml0RnJvbUFubm90YXRpb24uY2xhc3MsIHJlbCA9ICJwcmV2IiwKKyAgICBiaW5kaW5ncyA9IHsKKyAgICAgICAgQEJpbmRpbmcobmFtZSA9ICJwYWdlIiwgdmFsdWUgPSAiJHtpbnN0YW5jZS5udW1iZXIgLSAxfSIpLAorICAgICAgICBAQmluZGluZyhuYW1lID0gInNpemUiLCB2YWx1ZSA9ICIke2luc3RhbmNlLnNpemV9IiksCisgICAgfSwgY29uZGl0aW9uID0gIiR7aW5zdGFuY2UucHJldmlvdXNQYWdlQXZhaWxhYmxlfSIpCitAVGFyZ2V0KHtFbGVtZW50VHlwZS5NRVRIT0R9KQorQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BEb2N1bWVudGVkCitwdWJsaWMgQGludGVyZmFjZSBQYWdlTGlua3MgeworICBDbGFzcyZsdDs/PiB2YWx1ZSgpOworfTwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgICAgICAgICAgIFRoZSBhbm5vdGF0aW9uIGNhbiB0aGUgdGhlbiBiZSB1c2VkIG9uIHRoZSByZXNvdXJjZSBtZXRob2RzIHdpdGggdGhlIGFjdHVhbCBlbnRpdHkgY2xhc3MgYXMgPGxpdGVyYWw+dmFsdWU8L2xpdGVyYWw+LgorCisgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiPkBQYWdlTGlua3MoT3JkZXJQYWdlLmNsYXNzKQorQEdFVAorcHVibGljIFJlc3BvbnNlIGxpc3QoQFF1ZXJ5UGFyYW0oInBhZ2UiKSBARGVmYXVsdFZhbHVlKCIwIikgaW50IHBhZ2UsCisgICAgICAgICAgICAgICAgICAgICBAUXVlcnlQYXJhbSgic2l6ZSIpIEBEZWZhdWx0VmFsdWUoIjIwIikgaW50IHNpemUpPC9wcm9ncmFtbGlzdGluZz4KKworICAgICAgICAgICAgVGhlIGVudGl0eSBqdXN0IGV4dGVuZHMgZnJvbSA8bGl0ZXJhbD5QYWdlPC9saXRlcmFsPiBhbmQgZGVjbGFyZXMgaXRzIGNvbnRlbnQuIEl0IGlzIG5lY2Vzc2FyeSB0byB1c2UgZGlzdGluY3QgY2xhc3NlcworICAgICAgICAgICAgaW5zdGVhZCBvZiBqdXN0IGEgZ2VuZXJpYyBwYWdlIHRvIGhhdmUgYSB1bmlxdWUgdGFyZ2V0IGZvciA8bGl0ZXJhbD5AUHJvdmlkZUxpbms8L2xpdGVyYWw+LCBvdGhlcndpc2UgZXZlcnkgbWV0aG9kCisgICAgICAgICAgICBhbm5vdGF0ZWQgd2l0aCA8bGl0ZXJhbD5AUHJvdmlkZUxpbmsodmFsdWU9UGFnZS5jbGFzcyk8L2xpdGVyYWw+IHdvdWxkIGNvbnRyaWJ1dGUgdG8gdGhlIGVudGl0eS4KKworICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIj5wdWJsaWMgY2xhc3MgT3JkZXJQYWdlIGV4dGVuZHMgUGFnZSB7CisgICAgcHJpdmF0ZSBMaXN0Jmx0O09yZGVyPiBvcmRlcnM7Cit9PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uPgorICAgICAgICA8dGl0bGU+Q29uZmlndXJlIGFuZCByZWdpc3RlcjwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBJbiBvcmRlciB0byBhZGQgdGhlIERlY2xhcmF0aXZlIExpbmtpbmcgZmVhdHVyZSByZWdpc3RlciAmamVyc2V5LmxpbmtpbmcuRGVjbGFyYXRpdmVMaW5raW5nRmVhdHVyZTsKKworICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgPHRpdGxlPkNyZWF0aW5nIEpBWC1SUyBhcHBsaWNhdGlvbiB3aXRoIERlY2xhcmF0aXZlIExpbmtpbmcgZmVhdHVyZSBlbmFibGVkLjwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiPi8vIENyZWF0ZSBKQVgtUlMgYXBwbGljYXRpb24uCitmaW5hbCBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiA9IG5ldyBSZXNvdXJjZUNvbmZpZygpCisgICAgICAgIC5wYWNrYWdlcygib3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMubGlua2luZyIpCisgICAgICAgIC5yZWdpc3RlcihEZWNsYXJhdGl2ZUxpbmtpbmdGZWF0dXJlLmNsYXNzKTs8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8L3BhcmE+CisgICAgPC9zZWN0aW9uPgorPC9jaGFwdGVyPgpkaWZmIC0tZ2l0IGEvZG9jcy9zcmMvbWFpbi9kb2Nib29rL2RlcGVuZGVuY2llcy54bWwgYi9kb2NzL3NyYy9tYWluL2RvY2Jvb2svZGVwZW5kZW5jaWVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDYwZDNmCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9zcmMvbWFpbi9kb2Nib29rL2RlcGVuZGVuY2llcy54bWwKQEAgLTAsMCArMSwyMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPCFET0NUWVBFIGNoYXB0ZXIgWzwhRU5USVRZICUgZW50cyBTWVNURU0gImplcnNleS5lbnQiPiAlZW50cztdPgorPGNoYXB0ZXIgeG1sbnM9Imh0dHA6Ly9kb2Nib29rLm9yZy9ucy9kb2Nib29rIgorICAgICAgICAgdmVyc2lvbj0iNS4wIgorICAgICAgICAgeG1sOmxhbmc9ImVuIgorICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIgorICAgICAgICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9kb2Nib29rLm9yZy9ucy9kb2Nib29rIGh0dHA6Ly9kb2Nib29rLm9yZy94bWwvNS4wL3hzZC9kb2Nib29rLnhzZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIGh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsueHNkIgorICAgICAgICAgeG1sOmlkPSJtb2R1bGVzLWFuZC1kZXBlbmRlbmNpZXMiPgorICAgIDx0aXRsZT5Nb2R1bGVzIGFuZCBkZXBlbmRlbmNpZXM8L3RpdGxlPgorCisgICAgPHNlY3Rpb24+CisgICAgICAgIDx0aXRsZT5KYXZhIFNFIENvbXBhdGliaWxpdHk8L3RpdGxlPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgPGVtcGhhc2lzPjIueCBicmFuY2g6IDwvZW1waGFzaXM+CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+VW50aWwgdmVyc2lvbiAyLjYsIEplcnNleSB3YXMgY29tcGlsZWQgd2l0aCBKYXZhIFNFIDYuIFRoaXMgaGFzIGNoYW5nZWQgaW4gSmVyc2V5IDIuNy48L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPlVwIHRvIHZlcnNpb24gMi4yNS54IGFsbW9zdCBhbGwgSmVyc2V5IGNvbXBvbmVudHMgYXJlIGNvbXBpbGVkIHdpdGggSmF2YSBTRSA3IHRhcmdldC4KKyAgICAgICAgICAgICAgICAgICAgSXQgbWVhbnMsIHRoYXQgeW91IHdpbGwgbmVlZCBhdCBsZWFzdCBKYXZhCisgICAgICAgICAgICAgICAgICAgIFNFIDcgdG8gYmUgYWJsZSB0byBjb21waWxlIGFuZCBydW4geW91ciBhcHBsaWNhdGlvbiB0aGF0IGlzIHVzaW5nIGxhdGVzdCBKZXJzZXkuCisgICAgICAgICAgICAgICAgICAgIE9ubHkgPGxpdGVyYWw+Y29yZS1jb21tb248L2xpdGVyYWw+IGFuZCA8bGl0ZXJhbD5jb3JlLWNsaWVudDwvbGl0ZXJhbD4gbW9kdWxlcyBhcmUgc3RpbGwgY29tcGlsZWQgd2l0aCBKYXZhIGNsYXNzCisgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gcnVubmFibGUgd2l0aCBKYXZhIFNFIDYuPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT5TaW5jZSBKZXJzZXkgMi4yNiwgYWxsIG1vZHVsZXMgYXJlIGJ1aWxkIHVzaW5nIEphdmEgU0UgOCBhbmQgdGhlcmUgaXMgbm8gc3VwcG9ydCBmb3IgcnVubmluZyBpdAorICAgICAgICAgICAgICAgICAgICBvbiBvbGRlciBKYXZhIFNFIGRpc3RyaWJ1dGlvbnMuPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbj4KKyAgICAgICAgPHRpdGxlPkludHJvZHVjdGlvbiB0byBKZXJzZXkgZGVwZW5kZW5jaWVzPC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEplcnNleSBpcyBidWlsdCwgYXNzZW1ibGVkIGFuZCBpbnN0YWxsZWQgdXNpbmcgPGxpbmsgeGxpbms6aHJlZj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvIj5BcGFjaGUgTWF2ZW48L2xpbms+LgorICAgICAgICAgICAgTm9uLXNuYXBzaG90IEplcnNleSByZWxlYXNlcyBhcmUgZGVwbG95ZWQgdG8gdGhlCisgICAgICAgICAgICA8bGluayB4bGluazpocmVmPSJodHRwOi8vc2VhcmNoLm1hdmVuLm9yZy8iPkNlbnRyYWwgTWF2ZW4gUmVwb3NpdG9yeTwvbGluaz4uIEplcnNleSBpcyBhbHNvIGJlaW5nIGRlcGxveWVkIHRvCisgICAgICAgICAgICA8bGluayB4bGluazpocmVmPSJodHRwOi8vbWF2ZW4uamF2YS5uZXQvIj5KYXZhLk5ldCBNYXZlbiByZXBvc2l0b3JpZXM8L2xpbms+LCB3aGljaCBjb250YWluIGFsc28gSmVyc2V5IFNOQVBTSE9UCisgICAgICAgICAgICB2ZXJzaW9ucy4gSW4gY2FzZSB5b3Ugd291bGQgd2FudCB0byB0ZXN0IHRoZSBsYXRlc3QgZGV2ZWxvcG1lbnQgYnVpbGRzIGNoZWNrIG91dCB0aGUKKyAgICAgICAgICAgIDxsaW5rIHhsaW5rOmhyZWY9Imh0dHBzOi8vbWF2ZW4uamF2YS5uZXQvY29udGVudC9yZXBvc2l0b3JpZXMvc25hcHNob3RzL29yZy9nbGFzc2Zpc2gvamVyc2V5Ij4KKyAgICAgICAgICAgICAgICBKYXZhLk5ldCBTbmFwc2hvdHMgTWF2ZW4gcmVwb3NpdG9yeTwvbGluaz4uCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEFuIGFwcGxpY2F0aW9uIHRoYXQgdXNlcyBKZXJzZXkgYW5kIGRlcGVuZHMgb24gSmVyc2V5IG1vZHVsZXMgaXMgaW4gdHVybiByZXF1aXJlZCB0byBhbHNvIGluY2x1ZGUgaW4gdGhlIGFwcGxpY2F0aW9uCisgICAgICAgICAgICBkZXBlbmRlbmNpZXMgdGhlIHNldCBvZiAzcmQgcGFydHkgbW9kdWxlcyB0aGF0IEplcnNleSBtb2R1bGVzIGRlcGVuZCBvbi4gSmVyc2V5IGlzIGRlc2lnbmVkIGFzIGEgcGx1Z2dhYmxlIGNvbXBvbmVudAorICAgICAgICAgICAgYXJjaGl0ZWN0dXJlIGFuZCBkaWZmZXJlbnQgYXBwbGljYXRpb25zIGNhbiB0aGVyZWZvcmUgcmVxdWlyZSBkaWZmZXJlbnQgc2V0cyBvZiBKZXJzZXkgbW9kdWxlcy4gVGhpcyBhbHNvIG1lYW5zIHRoYXQKKyAgICAgICAgICAgIHRoZSBzZXQgb2YgZXh0ZXJuYWwgSmVyc2V5IGRlcGVuZGVuY2llcyByZXF1aXJlZCB0byBiZSBpbmNsdWRlZCBpbiB0aGUgYXBwbGljYXRpb24gZGVwZW5kZW5jaWVzIG1heSB2YXJ5IGluIGVhY2gKKyAgICAgICAgICAgIGFwcGxpY2F0aW9uIGJhc2VkIG9uIHRoZSBKZXJzZXkgbW9kdWxlcyB0aGF0IGFyZSBiZWluZyB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbi4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgRGV2ZWxvcGVycyB1c2luZyBNYXZlbiBvciBhIE1hdmVuLWF3YXJlIGJ1aWxkIHN5c3RlbSBpbiB0aGVpciBwcm9qZWN0cyBhcmUgbGlrZWx5IHRvIGZpbmQgaXQgZWFzaWVyIHRvIGluY2x1ZGUgYW5kCisgICAgICAgICAgICBtYW5hZ2UgZGVwZW5kZW5jaWVzIG9mIHRoZWlyIGFwcGxpY2F0aW9ucyBjb21wYXJlZCB0byBkZXZlbG9wZXJzIHVzaW5nIGFudCBvciBvdGhlciBidWlsZCBzeXN0ZW1zIHRoYXQgYXJlIG5vdAorICAgICAgICAgICAgY29tcGF0aWJsZSB3aXRoIE1hdmVuLiBUaGlzIGRvY3VtZW50IHdpbGwgZXhwbGFpbiB0byBib3RoIG1hdmVuIGFuZCBub24tbWF2ZW4gZGV2ZWxvcGVycyBob3cgdG8gZGVwZW5kIG9uCisgICAgICAgICAgICBKZXJzZXkgbW9kdWxlcyBpbiB0aGVpciBhcHBsaWNhdGlvbi4gQW50IGRldmVsb3BlcnMgYXJlIGxpa2VseSB0byBmaW5kIHRoZQorICAgICAgICAgICAgPGxpbmsgeGxpbms6aHJlZj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvYW50LXRhc2tzL2luZGV4Lmh0bWwiPkFudCBUYXNrcyBmb3IgTWF2ZW48L2xpbms+IHZlcnkgdXNlZnVsLgorICAgICAgICA8L3BhcmE+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24geG1sOmlkPSJkZXBlbmRlbmNpZXMiPgorICAgICAgICA8dGl0bGU+Q29tbW9uIEplcnNleSBVc2UgQ2FzZXM8L3RpdGxlPgorCisgICAgICAgIDxzZWN0aW9uIHhtbDppZD0ic2VydmxldC1hcHAtZ2xhc3NmaXNoIj4KKyAgICAgICAgICAgIDx0aXRsZT5TZXJ2bGV0IGJhc2VkIGFwcGxpY2F0aW9uIG9uIEdsYXNzZmlzaDwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT5JZiB5b3UgYXJlIHVzaW5nIEdsYXNzZmlzaCBhcHBsaWNhdGlvbiBzZXJ2ZXIsIHlvdSBkb24ndCBuZWVkIHRvIHBhY2thZ2UKKyAgICAgICAgICAgICAgICBhbnl0aGluZyB3aXRoIHlvdXIgYXBwbGljYXRpb24sIGV2ZXJ5dGhpbmcgaXMgYWxyZWFkeSBpbmNsdWRlZC4gWW91IGp1c3QgbmVlZCB0byBkZWNsYXJlCisgICAgICAgICAgICAgICAgKHByb3ZpZGVkKSBkZXBlbmRlbmN5IG9uIEpBWC1SUyBBUEkgdG8gYmUgYWJsZSB0byBjb21waWxlIHlvdXIgYXBwbGljYXRpb24uCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0ieG1sIj4mbHQ7ZGVwZW5kZW5jeSZndDsKKyAgICAmbHQ7Z3JvdXBJZD5qYXZheC53cy5ycyZsdDsvZ3JvdXBJZCZndDsKKyAgICAmbHQ7YXJ0aWZhY3RJZD5qYXZheC53cy5ycy1hcGkmbHQ7L2FydGlmYWN0SWQmZ3Q7CisgICAgJmx0O3ZlcnNpb24mZ3Q7JmpheC1ycy1hcGktamFyLnZlcnNpb247Jmx0Oy92ZXJzaW9uJmd0OworICAgICZsdDtzY29wZSZndDtwcm92aWRlZCZsdDsvc2NvcGUmZ3Q7CismbHQ7L2RlcGVuZGVuY3kmZ3Q7PC9wcm9ncmFtbGlzdGluZz4KKworICAgICAgICAgICAgPHBhcmE+SWYgeW91IGFyZSB1c2luZyBhbnkgSmVyc2V5IHNwZWNpZmljIGZlYXR1cmUsIHlvdSB3aWxsIG5lZWQgdG8gZGVwZW5kIG9uIEplcnNleSBkaXJlY3RseS48L3BhcmE+CisKKyAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0ieG1sIj4mbHQ7ZGVwZW5kZW5jeSZndDsKKyAgICAmbHQ7Z3JvdXBJZCZndDtvcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzJmx0Oy9ncm91cElkJmd0OworICAgICZsdDthcnRpZmFjdElkJmd0O2plcnNleS1jb250YWluZXItc2VydmxldCZsdDsvYXJ0aWZhY3RJZCZndDsKKyAgICAmbHQ7dmVyc2lvbiZndDsmdmVyc2lvbjsmbHQ7L3ZlcnNpb24mZ3Q7CisgICAgJmx0O3Njb3BlJmd0O3Byb3ZpZGVkJmx0Oy9zY29wZSZndDsKKyZsdDsvZGVwZW5kZW5jeSZndDsKKyZsdDshLS0gaWYgeW91IGFyZSB1c2luZyBKZXJzZXkgY2xpZW50IHNwZWNpZmljIGZlYXR1cmVzIHdpdGhvdXQgdGhlIHNlcnZlciBzaWRlIC0tJmd0OworJmx0O2RlcGVuZGVuY3kmZ3Q7CisgICAgJmx0O2dyb3VwSWQmZ3Q7b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZSZsdDsvZ3JvdXBJZCZndDsKKyAgICAmbHQ7YXJ0aWZhY3RJZCZndDtqZXJzZXktY2xpZW50Jmx0Oy9hcnRpZmFjdElkJmd0OworICAgICZsdDt2ZXJzaW9uJmd0OyZ2ZXJzaW9uOyZsdDsvdmVyc2lvbiZndDsKKyAgICAmbHQ7c2NvcGUmZ3Q7cHJvdmlkZWQmbHQ7L3Njb3BlJmd0OworJmx0Oy9kZXBlbmRlbmN5Jmd0OworICAgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgIDxzZWN0aW9uIHhtbDppZD0ic2VydmxldC1hcHAtZ2VuZXJhbCI+CisgICAgICAgICAgICA8dGl0bGU+U2VydmxldCBiYXNlZCBzZXJ2ZXItc2lkZSBhcHBsaWNhdGlvbjwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT5Gb2xsb3dpbmcgZGVwZW5kZW5jaWVzIGFwcGx5IHRvIGFwcGxpY2F0aW9uIHNlcnZlciAoc2VydmxldCBjb250YWluZXJzKSB3aXRob3V0IGFueQorICAgICAgICAgICAgICAgIGludGVncmF0ZWQgSkFYLVJTIGltcGxlbWVudGF0aW9uLiBUaGVuIGFwcGxpY2F0aW9uIG5lZWRzIHRvIGluY2x1ZGUgSkFYLVJTIEFQSSBhbmQgSmVyc2V5CisgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gaW4gZGVwbG95ZWQgYXBwbGljYXRpb24uPC9wYXJhPgorCisgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9InhtbCI+Jmx0O2RlcGVuZGVuY3kmZ3Q7CisgICAgJmx0O2dyb3VwSWQmZ3Q7b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVycyZsdDsvZ3JvdXBJZCZndDsKKyAgICAmbHQ7IS0tIGlmIHlvdXIgY29udGFpbmVyIGltcGxlbWVudHMgU2VydmxldCBBUEkgb2xkZXIgdGhhbiAzLjAsIHVzZSAiamVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmUiICAtLSZndDsKKyAgICAmbHQ7YXJ0aWZhY3RJZCZndDtqZXJzZXktY29udGFpbmVyLXNlcnZsZXQmbHQ7L2FydGlmYWN0SWQmZ3Q7CisgICAgJmx0O3ZlcnNpb24mZ3Q7JnZlcnNpb247Jmx0Oy92ZXJzaW9uJmd0OworJmx0Oy9kZXBlbmRlbmN5Jmd0OworJmx0OyEtLSBSZXF1aXJlZCBvbmx5IHdoZW4geW91IGFyZSB1c2luZyBKQVgtUlMgQ2xpZW50IC0tJmd0OworJmx0O2RlcGVuZGVuY3kmZ3Q7CisgICAgJmx0O2dyb3VwSWQmZ3Q7b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZSZsdDsvZ3JvdXBJZCZndDsKKyAgICAmbHQ7YXJ0aWZhY3RJZCZndDtqZXJzZXktY2xpZW50Jmx0Oy9hcnRpZmFjdElkJmd0OworICAgICZsdDt2ZXJzaW9uJmd0OyZ2ZXJzaW9uOyZsdDsvdmVyc2lvbiZndDsKKyZsdDsvZGVwZW5kZW5jeSZndDs8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24geG1sOmlkPSJjbGllbnQtamRrIj4KKyAgICAgICAgICAgIDx0aXRsZT5DbGllbnQgYXBwbGljYXRpb24gb24gSkRLPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXJhPkFwcGxpY2F0aW9ucyBydW5uaW5nIG9uIHBsYWluIEpESyB1c2luZyBvbmx5IGNsaWVudCBwYXJ0IG9mIEpBWC1SUyBzcGVjaWZpY2F0aW9uIG5lZWQKKyAgICAgICAgICAgICAgICB0byBkZXBlbmQgb25seSBvbiBjbGllbnQuIFRoZXJlIGFyZSB2YXJpb3VzIGFkZGl0aW9uYWwgbW9kdWxlcyB3aGljaCBjYW4gYmUgYWRkZWQsIGxpa2UKKyAgICAgICAgICAgICAgICBmb3IgZXhhbXBsZSBncml6emx5IG9yIGFwYWNoZSBvciBqZXR0eSBjb25uZWN0b3IgKHNlZSBkZXBlbmRlbmNpZXMgc25pcHBlZCBiZWxvdykuIEplcnNleSBjbGllbnQKKyAgICAgICAgICAgICAgICBydW5zIGJ5IGRlZmF1bHQgd2l0aCBwbGFpbiBKREsgKHVzaW5nIEh0dHBVcmxDb25uZWN0aW9uKS4gU2VlIDx4cmVmIGxpbmtlbmQ9ImNsaWVudCIvPi4KKyAgICAgICAgICAgICAgICBmb3IgbW9yZSBkZXRhaWxzLgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9InhtbCI+Jmx0O2RlcGVuZGVuY3kmZ3Q7CisgICAgJmx0O2dyb3VwSWQmZ3Q7b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZSZsdDsvZ3JvdXBJZCZndDsKKyAgICAmbHQ7YXJ0aWZhY3RJZCZndDtqZXJzZXktY2xpZW50Jmx0Oy9hcnRpZmFjdElkJmd0OworICAgICZsdDt2ZXJzaW9uJmd0OyZ2ZXJzaW9uOyZsdDsvdmVyc2lvbiZndDsKKyZsdDsvZGVwZW5kZW5jeSZndDsKKyAgICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgICAgICAgICAgIDxwYXJhPkN1cnJlbnRseSBhdmFpbGFibGUgY29ubmVjdG9yczo8L3BhcmE+CisKKyAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0ieG1sIj4mbHQ7ZGVwZW5kZW5jeSZndDsKKyAgICAmbHQ7Z3JvdXBJZCZndDtvcmcuZ2xhc3NmaXNoLmplcnNleS5jb25uZWN0b3JzJmx0Oy9ncm91cElkJmd0OworICAgICZsdDthcnRpZmFjdElkJmd0O2plcnNleS1ncml6emx5LWNvbm5lY3RvciZsdDsvYXJ0aWZhY3RJZCZndDsKKyAgICAmbHQ7dmVyc2lvbiZndDsmdmVyc2lvbjsmbHQ7L3ZlcnNpb24mZ3Q7CismbHQ7L2RlcGVuZGVuY3kmZ3Q7CisKKyZsdDtkZXBlbmRlbmN5Jmd0OworICAgICZsdDtncm91cElkJmd0O29yZy5nbGFzc2Zpc2guamVyc2V5LmNvbm5lY3RvcnMmbHQ7L2dyb3VwSWQmZ3Q7CisgICAgJmx0O2FydGlmYWN0SWQmZ3Q7amVyc2V5LWFwYWNoZS1jb25uZWN0b3ImbHQ7L2FydGlmYWN0SWQmZ3Q7CisgICAgJmx0O3ZlcnNpb24mZ3Q7JnZlcnNpb247Jmx0Oy92ZXJzaW9uJmd0OworJmx0Oy9kZXBlbmRlbmN5Jmd0OworCismbHQ7ZGVwZW5kZW5jeSZndDsKKyAgICAmbHQ7Z3JvdXBJZCZndDtvcmcuZ2xhc3NmaXNoLmplcnNleS5jb25uZWN0b3JzJmx0Oy9ncm91cElkJmd0OworICAgICZsdDthcnRpZmFjdElkJmd0O2plcnNleS1qZXR0eS1jb25uZWN0b3ImbHQ7L2FydGlmYWN0SWQmZ3Q7CisgICAgJmx0O3ZlcnNpb24mZ3Q7JnZlcnNpb247Jmx0Oy92ZXJzaW9uJmd0OworJmx0Oy9kZXBlbmRlbmN5Jmd0OzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICA8c2VjdGlvbiB4bWw6aWQ9InNlcnZlci1qZGsiPgorICAgICAgICAgICAgPHRpdGxlPlNlcnZlci1zaWRlIGFwcGxpY2F0aW9uIG9uIHN1cHBvcnRlZCBjb250YWluZXJzPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXJhPkFwYXJ0IGZvciBhIHN0YW5kYXJkIEpBWC1SUyBTZXJ2bGV0LWJhc2VkIGRlcGxveW1lbnQgdGhhdCB3b3JrcyB3aXRoIGFueSBTZXJ2bGV0IGNvbnRhaW5lciB0aGF0CisgICAgICAgICAgICAgICAgc3VwcG9ydHMgU2VydmxldCAyLjUgYW5kIGhpZ2hlciwKKyAgICAgICAgICAgICAgICBKZXJzZXkgcHJvdmlkZXMgc3VwcG9ydCBmb3IgcHJvZ3JhbW1hdGljIGRlcGxveW1lbnQgdG8gdGhlIGZvbGxvd2luZyBjb250YWluZXJzOiBHcml6emx5IDIgKEhUVFAgYW5kIFNlcnZsZXQpLAorICAgICAgICAgICAgICAgIEpESyBIdHRwIHNlcnZlciwgU2ltcGxlIEh0dHAgc2VydmVyIGFuZCBKZXR0eSBIdHRwIHNlcnZlci4gVGhpcyBjaGFwdGVyIHByZXNlbnRzIG9ubHkgcmVxdWlyZWQgbWF2ZW4gZGVwZW5kZW5jaWVzLAorICAgICAgICAgICAgICAgIG1vcmUgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIDx4cmVmIGxpbmtlbmQ9ImRlcGxveW1lbnQiLz4uCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0ieG1sIj4mbHQ7ZGVwZW5kZW5jeSZndDsKKyAgICAmbHQ7Z3JvdXBJZCZndDtvcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzJmx0Oy9ncm91cElkJmd0OworICAgICZsdDthcnRpZmFjdElkJmd0O2plcnNleS1jb250YWluZXItZ3JpenpseTItaHR0cCZsdDsvYXJ0aWZhY3RJZCZndDsKKyAgICAmbHQ7dmVyc2lvbiZndDsmdmVyc2lvbjsmbHQ7L3ZlcnNpb24mZ3Q7CismbHQ7L2RlcGVuZGVuY3kmZ3Q7CisKKyZsdDtkZXBlbmRlbmN5Jmd0OworICAgICZsdDtncm91cElkJmd0O29yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnMmbHQ7L2dyb3VwSWQmZ3Q7CisgICAgJmx0O2FydGlmYWN0SWQmZ3Q7amVyc2V5LWNvbnRhaW5lci1ncml6emx5Mi1zZXJ2bGV0Jmx0Oy9hcnRpZmFjdElkJmd0OworICAgICZsdDt2ZXJzaW9uJmd0OyZ2ZXJzaW9uOyZsdDsvdmVyc2lvbiZndDsKKyZsdDsvZGVwZW5kZW5jeSZndDsKKworJmx0O2RlcGVuZGVuY3kmZ3Q7CisgICAgJmx0O2dyb3VwSWQmZ3Q7b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVycyZsdDsvZ3JvdXBJZCZndDsKKyAgICAmbHQ7YXJ0aWZhY3RJZCZndDtqZXJzZXktY29udGFpbmVyLWpkay1odHRwJmx0Oy9hcnRpZmFjdElkJmd0OworICAgICZsdDt2ZXJzaW9uJmd0OyZ2ZXJzaW9uOyZsdDsvdmVyc2lvbiZndDsKKyZsdDsvZGVwZW5kZW5jeSZndDsKKworJmx0O2RlcGVuZGVuY3kmZ3Q7CisgICAgJmx0O2dyb3VwSWQmZ3Q7b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVycyZsdDsvZ3JvdXBJZCZndDsKKyAgICAmbHQ7YXJ0aWZhY3RJZCZndDtqZXJzZXktY29udGFpbmVyLXNpbXBsZS1odHRwJmx0Oy9hcnRpZmFjdElkJmd0OworICAgICZsdDt2ZXJzaW9uJmd0OyZ2ZXJzaW9uOyZsdDsvdmVyc2lvbiZndDsKKyZsdDsvZGVwZW5kZW5jeSZndDsKKworJmx0O2RlcGVuZGVuY3kmZ3Q7CisgICAgJmx0O2dyb3VwSWQmZ3Q7b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVycyZsdDsvZ3JvdXBJZCZndDsKKyAgICAmbHQ7YXJ0aWZhY3RJZCZndDtqZXJzZXktY29udGFpbmVyLWpldHR5LWh0dHAmbHQ7L2FydGlmYWN0SWQmZ3Q7CisgICAgJmx0O3ZlcnNpb24mZ3Q7JnZlcnNpb247Jmx0Oy92ZXJzaW9uJmd0OworJmx0Oy9kZXBlbmRlbmN5Jmd0OworCismbHQ7ZGVwZW5kZW5jeSZndDsKKyAgICAmbHQ7Z3JvdXBJZCZndDtvcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzJmx0Oy9ncm91cElkJmd0OworICAgICZsdDthcnRpZmFjdElkJmd0O2plcnNleS1jb250YWluZXItamV0dHktc2VydmxldCZsdDsvYXJ0aWZhY3RJZCZndDsKKyAgICAmbHQ7dmVyc2lvbiZndDsmdmVyc2lvbjsmbHQ7L3ZlcnNpb24mZ3Q7CismbHQ7L2RlcGVuZGVuY3kmZ3Q7PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKworICAgIDx4aTppbmNsdWRlIGhyZWY9Im1vZHVsZXMueG1sIiAvPgorPC9jaGFwdGVyPgpkaWZmIC0tZ2l0IGEvZG9jcy9zcmMvbWFpbi9kb2Nib29rL2RlcGxveW1lbnQueG1sIGIvZG9jcy9zcmMvbWFpbi9kb2Nib29rL2RlcGxveW1lbnQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MTg1NGUKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3NyYy9tYWluL2RvY2Jvb2svZGVwbG95bWVudC54bWwKQEAgLTAsMCArMSwxMzg0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8IURPQ1RZUEUgY2hhcHRlciBbPCFFTlRJVFkgJSBlbnRzIFNZU1RFTSAiamVyc2V5LmVudCIgPiAlZW50czsKKyAgICA8IUVOVElUWSBqZXJzZXkuZ2l0aHViLm9zZ2kud2ViYXBwLmV4YW1wbGUubGluayAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5naXRodWIuZXhhbXBsZXMudXJpOy9vc2dpLWhlbGxvd29ybGQtd2ViYXBwJz5XQUIgRXhhbXBsZTwvbGluaz4iPgorICAgIDwhRU5USVRZIGplcnNleS5naXRodWIub3NnaS5odHRwc2VydmljZS5leGFtcGxlLmxpbmsgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuZ2l0aHViLmV4YW1wbGVzLnVyaTsvb3NnaS1odHRwLXNlcnZpY2UnPkhUVFAgU2VydmljZSBleGFtcGxlPC9saW5rPiI+CitdPgorPGNoYXB0ZXIgeG1sbnM9Imh0dHA6Ly9kb2Nib29rLm9yZy9ucy9kb2Nib29rIgorICAgICAgICAgdmVyc2lvbj0iNS4wIgorICAgICAgICAgeG1sOmxhbmc9ImVuIgorICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vZG9jYm9vay5vcmcvbnMvZG9jYm9vayBodHRwOi8vZG9jYm9vay5vcmcveG1sLzUuMC94c2QvZG9jYm9vay54c2QiCisgICAgICAgICB4bWw6aWQ9ImRlcGxveW1lbnQiPgorICAgIDx0aXRsZT5BcHBsaWNhdGlvbiBEZXBsb3ltZW50IGFuZCBSdW50aW1lIEVudmlyb25tZW50czwvdGl0bGU+CisgICAgPHNlY3Rpb24geG1sOmlkPSJkZXBsb3ltZW50LmludHJvIj4KKyAgICAgICAgPHRpdGxlPkludHJvZHVjdGlvbjwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhpcyBjaGFwdGVyIGlzIGFuIG92ZXJ2aWV3IG9mIHZhcmlvdXMgc2VydmVyLXNpZGUgZW52aXJvbm1lbnRzIGN1cnJlbnRseSBjYXBhYmxlIG9mIHJ1bm5pbmcgSkFYLVJTIGFwcGxpY2F0aW9ucworICAgICAgICAgICAgb24gdG9wIG9mIEplcnNleSBzZXJ2ZXIgcnVudGltZS4gSmVyc2V5IHN1cHBvcnRzIHdpZGUgcmFuZ2Ugb2Ygc2VydmVyIGVudmlyb25tZW50cyBmcm9tIGxpZ2h0d2VpZ2h0IGh0dHAgY29udGFpbmVycworICAgICAgICAgICAgdXAgdG8gZnVsbC1mbGVkZ2VkIEphdmEgRUUgc2VydmVycy4gSmVyc2V5IGFwcGxpY2F0aW9ucyBjYW4gYWxzbyBydW4gaW4gYW4gT1NHaSBydW50aW1lLgorICAgICAgICAgICAgVGhlIHdheSBob3cgdGhlIGFwcGxpY2F0aW9uIGlzIHB1Ymxpc2hlZCBkZXBlbmRzIG9uIHdoZXRoZXIgdGhlIGFwcGxpY2F0aW9uIHNoYWxsIHJ1biBpbiBhIEphdmEgU0UgZW52aXJvbm1lbnQgb3IKKyAgICAgICAgICAgIHdpdGhpbiBhIGNvbnRhaW5lci4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoaXMgY2hhcHRlciBpcyBmb2N1c2VkIG9uIHNlcnZlci1zaWRlIEplcnNleSBkZXBsb3ltZW50IG1vZGVscy4gVGhlCisgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0iY2xpZW50Ij5KZXJzZXkgY2xpZW50IHJ1bnRpbWU8L2xpbms+IGRvZXMKKyAgICAgICAgICAgICAgICBub3QgaGF2ZSBhbnkgc3BlY2lmaWMgY29udGFpbmVyIHJlcXVpcmVtZW50cyBhbmQgcnVucyBpbiBwbGFpbiBKYXZhIFNFIDYgb3IgaGlnaGVyIHJ1bnRpbWUuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbm90ZT4KKyAgICA8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24geG1sOmlkPSJlbnZpcm9ubWVubXQuYXBwbW9kZWwiPgorICAgICAgICA8dGl0bGU+SkFYLVJTIEFwcGxpY2F0aW9uIE1vZGVsPC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBKQVgtUlMgcHJvdmlkZXMgYSBkZXBsb3ltZW50IGFnbm9zdGljIGFic3RyYWN0IGNsYXNzICZqYXhycy5jb3JlLkFwcGxpY2F0aW9uOworICAgICAgICAgICAgZm9yIGRlY2xhcmluZyByb290IHJlc291cmNlIGFuZCBwcm92aWRlciBjbGFzc2VzLCBhbmQgcm9vdCByZXNvdXJjZSBhbmQgcHJvdmlkZXIgc2luZ2xldG9uIGluc3RhbmNlcy4KKyAgICAgICAgICAgIEEgV2ViIHNlcnZpY2UgbWF5IGV4dGVuZCB0aGlzIGNsYXNzIHRvIGRlY2xhcmUgcm9vdCByZXNvdXJjZSBhbmQgcHJvdmlkZXIgY2xhc3Nlcy4gRm9yIGV4YW1wbGUsCisgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICA8dGl0bGU+RGVwbG95bWVudCBhZ25vc3RpYyBhcHBsaWNhdGlvbiBtb2RlbDwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+cHVibGljIGNsYXNzIE15QXBwbGljYXRpb24gZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldCZsdDtDbGFzcyZsdDs/Jmd0OyZndDsgZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgU2V0Jmx0O0NsYXNzJmx0Oz8mZ3Q7Jmd0OyBzID0gbmV3IEhhc2hTZXQmbHQ7Q2xhc3MmbHQ7PyZndDsmZ3Q7KCk7CisgICAgICAgIHMuYWRkKEhlbGxvV29ybGRSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJldHVybiBzOworICAgIH0KK308L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQWx0ZXJuYXRpdmVseSBpdCBpcyBwb3NzaWJsZSB0byByZXVzZSAmamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsgLSBKZXJzZXkncyBvd24gaW1wbGVtZW50YXRpb25zCisgICAgICAgICAgICBvZiAmbGl0LmpheHJzLmNvcmUuQXBwbGljYXRpb247IGNsYXNzLiBUaGlzIGNsYXNzIGNhbiBlaXRoZXIgYmUgZGlyZWN0bHkgaW5zdGFudGlhdGVkIGFuZCB0aGVuIGNvbmZpZ3VyZWQKKyAgICAgICAgICAgIG9yIGl0IGNhbiBiZSBleHRlbmRlZCBhbmQgdGhlIGNvbmZpZ3VyYXRpb24gY29kZSBwbGFjZWQgaW50byB0aGUgY29uc3RydWN0b3Igb2YgdGhlIGV4dGVuZGluZyBjbGFzcy4gVGhlCisgICAgICAgICAgICBhcHByb2FjaCB0eXBpY2FsbHkgZGVwZW5kcyBvbiB0aGUgY2hvc2VuIGRlcGxveW1lbnQgcnVudGltZS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIENvbXBhcmVkIHRvICZsaXQuamF4cnMuY29yZS5BcHBsaWNhdGlvbjssIHRoZSAmbGl0LmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7IHByb3ZpZGVzIGFkdmFuY2VkIGNhcGFiaWxpdGllcworICAgICAgICAgICAgdG8gc2ltcGxpZnkgcmVnaXN0cmF0aW9uIG9mIEpBWC1SUyBjb21wb25lbnRzLCBzdWNoIGFzIHNjYW5uaW5nIGZvciByb290IHJlc291cmNlIGFuZCBwcm92aWRlciBjbGFzc2VzIGluIGEgcHJvdmlkZWQKKyAgICAgICAgICAgIGNsYXNzcGF0aCBvciBhIGluIGEgc2V0IG9mIHBhY2thZ2UgbmFtZXMgZXRjLiBBbGwgSkFYLVJTIGNvbXBvbmVudCBjbGFzc2VzIHRoYXQgYXJlIGVpdGhlciBtYW51YWxseSByZWdpc3RlcmVkIG9yCisgICAgICAgICAgICBmb3VuZCBkdXJpbmcgc2Nhbm5pbmcgYXJlIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gdGhlIHNldCBvZiBjbGFzc2VzIHRoYXQgYXJlIHJldHVybmVkIGJ5CisgICAgICAgICAgICA8bGl0ZXJhbD5nZXRDbGFzc2VzPC9saXRlcmFsPi4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgYXBwbGljYXRpb24gY2xhc3MgdGhhdCBleHRlbmRzIGZyb20KKyAgICAgICAgICAgICZsaXQuamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsgc2NhbnMgZHVyaW5nIGRlcGxveW1lbnQgZm9yIEpBWC1SUyBjb21wb25lbnRzIGluIHBhY2thZ2VzCisgICAgICAgICAgICA8bGl0ZXJhbD5vcmcuZm9vLnJlc3Q8L2xpdGVyYWw+IGFuZCA8bGl0ZXJhbD5vcmcuYmFyLnJlc3Q8L2xpdGVyYWw+OgorICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5QYWNrYWdlIHNjYW5uaW5nPC9lbXBoYXNpcz4gaWdub3JlcyBhbiBpbmhlcml0YW5jZSBhbmQgdGhlcmVmb3JlICZsaXQuamF4cnMuUGF0aDsgYW5ub3RhdGlvbgorICAgICAgICAgICAgICAgICAgICBvbiBwYXJlbnQgY2xhc3NlcyBhbmQgaW50ZXJmYWNlcyB3aWxsIGJlIGlnbm9yZWQuIFRoZXNlIGNsYXNzZXMgd29uJ3QgYmUgcmVnaXN0ZXJlZCBhcyB0aGUgSkFYLVJTIGNvbXBvbmVudAorICAgICAgICAgICAgICAgICAgICBjbGFzc2VzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgIDx0aXRsZT5SZXVzaW5nIEplcnNleSBpbXBsZW1lbnRhdGlvbiBpbiB5b3VyIGN1c3RvbSBhcHBsaWNhdGlvbiBtb2RlbDwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+cHVibGljIGNsYXNzIE15QXBwbGljYXRpb24gZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisgICAgcHVibGljIE15QXBwbGljYXRpb24oKSB7CisgICAgICAgIHBhY2thZ2VzKCJvcmcuZm9vLnJlc3Q7b3JnLmJhci5yZXN0Iik7CisgICAgfQorfTwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPG5vdGU+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBMYXRlciBpbiB0aGlzIGNoYXB0ZXIsIHRoZSB0ZXJtIDxlbXBoYXNpcz4mbGl0LmpheHJzLmNvcmUuQXBwbGljYXRpb247IHN1YmNsYXNzPC9lbXBoYXNpcz4gaXMgZnJlcXVlbnRseSB1c2VkLgorICAgICAgICAgICAgICAgIFdoZW5ldmVyIHVzZWQsIHRoaXMgdGVybSByZWZlcnMgdG8gdGhlIEpBWC1SUyBBcHBsaWNhdGlvbiBNb2RlbCBleHBsYWluZWQgYWJvdmUuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbm90ZT4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiB4bWw6aWQ9ImRlcGxveW1lbnQuYXV0b2Rpc2NvdmVyYWJsZSI+CisgICAgICAgIDx0aXRsZT5BdXRvLURpc2NvdmVyYWJsZSBGZWF0dXJlczwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBCeSBkZWZhdWx0IEplcnNleSAyLnggZG9lcyBub3QgaW1wbGljaXRseSByZWdpc3RlciBhbnkgZXh0ZW5zaW9uIGZlYXR1cmVzIGZyb20gdGhlIG1vZHVsZXMgYXZhaWxhYmxlIG9uIHRoZQorICAgICAgICAgICAgY2xhc3NwYXRoLCB1bmxlc3MgZXhwbGljaXRseSBzdGF0ZWQgb3RoZXJ3aXNlIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIGVhY2ggcGFydGljdWxhciBleHRlbnNpb24uCisgICAgICAgICAgICBVc2VycyBhcmUgZXhwZWN0ZWQgdG8gZXhwbGljaXRseSByZWdpc3RlciB0aGUgZXh0ZW5zaW9uICZqYXhycy5jb3JlLkZlYXR1cmU7cyB1c2luZyB0aGVpcgorICAgICAgICAgICAgJmxpdC5qYXhycy5jb3JlLkFwcGxpY2F0aW9uOyBzdWJjbGFzcy4KKyAgICAgICAgICAgIEZvciBhIGZldyBKZXJzZXkgcHJvdmlkZWQgbW9kdWxlcyBob3dldmVyIHRoZXJlIGlzIG5vIG5lZWQgdG8gZXhwbGljaXRseSByZWdpc3RlciB0aGVpciBleHRlbnNpb24KKyAgICAgICAgICAgICZsaXQuamF4cnMuY29yZS5GZWF0dXJlO3MgYXMgdGhlc2UgYXJlIGRpc2NvdmVyZWQgYW5kIHJlZ2lzdGVyZWQgaW4gdGhlICZqYXhycy5jb3JlLkNvbmZpZ3VyYXRpb247IChvbiBjbGllbnQvc2VydmVyKQorICAgICAgICAgICAgYXV0b21hdGljYWxseSBieSBKZXJzZXkgcnVudGltZSB3aGVuZXZlciB0aGUgbW9kdWxlcyBpbXBsZW1lbnRpbmcgdGhlc2UgZmVhdHVyZXMgYXJlIHByZXNlbnQgb24gdGhlIGNsYXNzcGF0aAorICAgICAgICAgICAgb2YgdGhlIGRlcGxveWVkIEpBWC1SUyBhcHBsaWNhdGlvbi4gVGhlIG1vZHVsZXMgdGhhdCBhcmUgYXV0b21hdGljYWxseSBkaXNjb3ZlcmVkIGluY2x1ZGU6CisKKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT5KU09OIGJpbmRpbmcgZmVhdHVyZSBmcm9tIDxsaXRlcmFsPmplcnNleS1tZWRpYS1tb3h5PC9saXRlcmFsPjwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+PGxpdGVyYWw+amVyc2V5LW1lZGlhLWpzb24tcHJvY2Vzc2luZzwvbGl0ZXJhbD48L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPjxsaXRlcmFsPmplcnNleS1iZWFuLXZhbGlkYXRpb248L2xpdGVyYWw+PC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEJlc2lkZXMgdGhlc2UgbW9kdWxlcyB0aGVyZSBhcmUgYWxzbyBmZXcgZmVhdHVyZXMvcHJvdmlkZXJzIHByZXNlbnQgaW4gPGxpdGVyYWw+amVyc2V5LXNlcnZlcjwvbGl0ZXJhbD4gbW9kdWxlIHRoYXQKKyAgICAgICAgICAgIGFyZSBkaXNjb3ZlcmVkIGJ5IHRoaXMgbWVjaGFuaXNtIGFuZCB0aGVpciBhdmFpbGFiaWxpdHkgaXMgYWZmZWN0ZWQgYnkgSmVyc2V5IGF1dG8tZGlzY292ZXJ5IHN1cHBvcnQgY29uZmlndXJhdGlvbgorICAgICAgICAgICAgKHNlZSA8eHJlZiBsaW5rZW5kPSJkZXBsb3ltZW50LmF1dG9kaXNjb3ZlcnkuY29uZmlnIiAvPiksIG5hbWVseToKKworICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPiZqZXJzZXkuc2VydmVyLldhZGxGZWF0dXJlOyAtIGVuYWJsZXMgV0FETCBwcm9jZXNzaW5nLjwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+JmplcnNleS5zZXJ2ZXIuVXJpQ29ubmVnRmlsdGVyOyAtIGEgVVJJLWJhc2VkIGNvbnRlbnQgbmVnb3RpYXRpb24gZmlsdGVyLjwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisKKyAgICAgICAgICAgIEFsbW9zdCBhbGwgSmVyc2V5IGF1dG8tZGlzY292ZXJ5IGltcGxlbWVudGF0aW9ucyBoYXZlIDxjb2RlPkF1dG9EaXNjb3ZlcmFibGUuREVGQVVMVF9QUklPUklUWTwvY29kZT4KKyAgICAgICAgICAgIDxsaXRlcmFsPkBQcmlvcml0eTwvbGl0ZXJhbD4gc2V0LgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPG5vdGU+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBBdXRvIGRpc2NvdmVyeSBmdW5jdGlvbmFsaXR5IGlzIGluIEplcnNleSBzdXBwb3J0ZWQgYnkgaW1wbGVtZW50aW5nIGFuIGludGVybmFsCisgICAgICAgICAgICAgICAgPGxpdGVyYWw+QXV0b0Rpc2NvdmVyYWJsZTwvbGl0ZXJhbD4gSmVyc2V5IFNQSS4gVGhpcyBpbnRlcmZhY2UgaXMgbm90IHB1YmxpYyBhdCB0aGUgbW9tZW50LAorICAgICAgICAgICAgICAgIGFuZCBpcyBzdWJqZWN0IHRvIGNoYW5nZSBpbiB0aGUgZnV0dXJlLCBzbyBiZSBjYXJlZnVsIHdoZW4gdHJ5aW5nIHRvIHVzZSBpdC4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9ub3RlPgorCisgICAgICAgIDxzZWN0aW9uIHhtbDppZD0iZGVwbG95bWVudC5hdXRvZGlzY292ZXJ5LmNvbmZpZyI+CisgICAgICAgICAgICA8dGl0bGU+Q29uZmlndXJpbmcgRmVhdHVyZSBBdXRvLWRpc2NvdmVyeSBNZWNoYW5pc208L3RpdGxlPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgbWVjaGFuaXNtIG9mIGZlYXR1cmUgYXV0by1kaXNjb3ZlcnkgaW4gSmVyc2V5IHRoYXQgZGVzY3JpYmVkIGFib3ZlIGlzIGVuYWJsZWQgYnkgZGVmYXVsdC4gSXQgY2FuIGJlCisgICAgICAgICAgICAgICAgZGlzYWJsZWQgYnkgdXNpbmcgc3BlY2lhbCAoY29tbW9uL3NlcnZlci9jbGllbnQpIHByb3BlcnRpZXM6CisKKyAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8dGl0bGU+Q29tbW9uIGF1dG8gZGlzY292ZXJ5IHByb3BlcnRpZXM8L3RpdGxlPgorCisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPiZqZXJzZXkuY29tbW9uLkNvbW1vblByb3BlcnRpZXMuRkVBVFVSRV9BVVRPX0RJU0NPVkVSWV9ESVNBQkxFOzwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPldoZW4gc2V0LCBkaXNhYmxlcyBhdXRvIGRpc2NvdmVyeSBnbG9iYWxseSBvbiBjbGllbnQvc2VydmVyLjwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+JmplcnNleS5jb21tb24uQ29tbW9uUHJvcGVydGllcy5KU09OX1BST0NFU1NJTkdfRkVBVFVSRV9ESVNBQkxFOzwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPldoZW4gc2V0LCBkaXNhYmxlcyBjb25maWd1cmF0aW9uIG9mIEpzb24gUHJvY2Vzc2luZyAoSlNSLTM1MykgZmVhdHVyZS48L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPiZqZXJzZXkuY29tbW9uLkNvbW1vblByb3BlcnRpZXMuTU9YWV9KU09OX0ZFQVRVUkVfRElTQUJMRTs8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT5XaGVuIHNldCwgZGlzYWJsZXMgY29uZmlndXJhdGlvbiBvZiBNT1h5IEpzb24gZmVhdHVyZS48L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisKKyAgICAgICAgICAgICAgICBGb3IgZWFjaCBvZiB0aGVzZSBwcm9wZXJ0aWVzIHRoZXJlIGlzIGEgY2xpZW50L3NlcnZlciBjb3VudGVyLXBhcnQgdGhhdCBpcyBvbmx5IGhvbm9yZWQgYnkgdGhlIEplcnNleQorICAgICAgICAgICAgICAgIGNsaWVudCBvciBzZXJ2ZXIgcnVudGltZSByZXNwZWN0aXZlbHkgKHNlZSAmamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzOy8mamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzOykuCisgICAgICAgICAgICAgICAgV2hlbiBzZXQsIGVhY2ggb2YgdGhlc2UgY2xpZW50L3NlcnZlciBzcGVjaWZpYyBhdXRvLWRpc2NvdmVyeSByZWxhdGVkIHByb3BlcnRpZXMgb3ZlcnJpZGVzIHRoZSB2YWx1ZSBvZiB0aGUKKyAgICAgICAgICAgICAgICByZWxhdGVkIGNvbW1vbiBwcm9wZXJ0eS4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEluIGNhc2UgYW4gYXV0by1kaXNjb3ZlcmFibGUgbWVjaGFuaXNtIChpbiBnZW5lcmFsIG9yIGZvciBhIHNwZWNpZmljIGZlYXR1cmUpIGlzIGRpc2FibGVkLCB0aGVuIGFsbCB0aGUKKyAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXMsIGNvbXBvbmVudHMgYW5kL29yIHByb3BlcnRpZXMsIHJlZ2lzdGVyZWQgYnkgZGVmYXVsdCB1c2luZyB0aGUgYXV0by1kaXNjb3ZlcnkgbWVjaGFuaXNtIGhhdmUKKyAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVnaXN0ZXJlZCBtYW51YWxseS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L25vdGU+CisgICAgICAgIDwvc2VjdGlvbj4KKworICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIHhtbDppZD0iZGVwbG95bWVudC5jbGFzc3BhdGgtc2Nhbm5pbmciPgorICAgICAgICA8dGl0bGU+Q29uZmlndXJpbmcgdGhlIENsYXNzcGF0aCBTY2FubmluZzwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBKZXJzZXkgdXNlcyBhIGNvbW1vbiBKYXZhIFNlcnZpY2UgUHJvdmlkZXIgbWVjaGFuaXNtIHRvIG9idGFpbiBhbGwgc2VydmljZSBpbXBsZW1lbnRhdGlvbnMuIEl0IG1lYW5zIHRoYXQgSmVyc2V5CisgICAgICAgICAgICBzY2FucyB0aGUgd2hvbGUgY2xhc3MgcGF0aCB0byBmaW5kIGFwcHJvcHJpYXRlIDxsaXRlcmFsPk1FVEEtSU5GL3NlcnZpY2VzLzwvbGl0ZXJhbD4gZmlsZXMuIFRoZSBjbGFzcyBwYXRoIHNjYW5uaW5nCisgICAgICAgICAgICBtYXkgYmUgdGltZSBjb25zdW1pbmcuIFRoZSBtb3JlIGphciBvciB3YXIgZmlsZXMgb24gdGhlIGNsYXNzcGF0aCB0aGUgbG9uZ2VyIHRoZSBzY2FubmluZyB0aW1lLgorICAgICAgICAgICAgSW4gdXNlIGNhc2VzIHdoZXJlIHlvdSBuZWVkIHRvIHNhdmUgZXZlcnkgbWlsbGlzZWNvbmQgb2YgYXBwbGljYXRpb24gYm9vdHN0cmFwIHRpbWUsCisgICAgICAgICAgICB5b3UgbWF5IHR5cGljYWxseSB3YW50IHRvIGRpc2FibGUgdGhlIHNlcnZpY2VzIHByb3ZpZGVyIGxvb2t1cCBpbiBKZXJzZXkuCisKKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPHRpdGxlPkxpc3Qgb2YgU1BJcyByZWNvZ25pemVkIGJ5IEplcnNleTwvdGl0bGU+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT48bGl0ZXJhbD5BdXRvRGlzY292ZXJhYmxlPC9saXRlcmFsPiAoc2VydmVyLCBjbGllbnQpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIGl0IG1lYW5zIGlmIHlvdSBkaXNhYmxlIHNlcnZpY2UgbG9hZGluZyB0aGUgQXV0b0Rpc2NvdmVyYWJsZSBmZWF0dXJlIGlzIGF1dG9tYXRpY2FsbHkgZGlzYWJsZWQgdG9vPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT48bGl0ZXJhbD5Gb3JjZWRBdXRvRGlzY292ZXJhYmxlPC9saXRlcmFsPiAoc2VydmVyLCBjbGllbnQpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgIEplcnNleSBhbHdheXMgbG9va3MgZm9yIHRoZXNlIGF1dG8gZGlzY292ZXJhYmxlIGZlYXR1cmVzIGV2ZW4gaWYgdGhlIHNlcnZpY2UgbG9hZGluZyBpcyBkaXNhYmxlZDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+PGxpdGVyYWw+SGVhZGVyRGVsZWdhdGVQcm92aWRlcjwvbGl0ZXJhbD4gKHNlcnZlciwgY2xpZW50KTwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+PGxpdGVyYWw+Q29tcG9uZW50UHJvdmlkZXI8L2xpdGVyYWw+IChzZXJ2ZXIpPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT48bGl0ZXJhbD5Db250YWluZXJQcm92aWRlcjwvbGl0ZXJhbD4gKHNlcnZlcik8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPjxsaXRlcmFsPkFzeW5jQ29udGV4dERlbGVnYXRlUHJvdmlkZXI8L2xpdGVyYWw+IChzZXJ2ZXIvU2VydmxldCk8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorCisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDx0aXRsZT5MaXN0IG9mIGFkZGl0aW9uYWwgU1BJcyByZWNvZ25pemVkIGJ5IEplcnNleSBpbiBjYXNlIHRoZSA8bGl0ZXJhbD5tZXRhaW5mLXNlcnZpY2VzPC9saXRlcmFsPiBtb2R1bGUgaXMgb24gdGhlIGNsYXNzcGF0aDwvdGl0bGU+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT48bGl0ZXJhbD5NZXNzYWdlQm9keVJlYWRlcjwvbGl0ZXJhbD4gKHNlcnZlciwgY2xpZW50KTwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+PGxpdGVyYWw+TWVzc2FnZUJvZHlXcml0ZXI8L2xpdGVyYWw+IChzZXJ2ZXIsIGNsaWVudCk8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPjxsaXRlcmFsPkV4Y2VwdGlvbk1hcHBlcjwvbGl0ZXJhbD4gKHNlcnZlciwgY2xpZW50KTwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisKKyAgICAgICAgICAgIFNpbmNlIGl0IGlzIHBvc3NpYmxlIHRvIGNvbmZpZ3VyZSBhbGwgU1BJIGltcGxlbWVudGF0aW9uIGNsYXNzZXMgb3IgaW5zdGFuY2VzIG1hbnVhbGx5IGluIHlvdXIKKyAgICAgICAgICAgICZsaXQuamF4cnMuY29yZS5BcHBsaWNhdGlvbjsgc3ViY2xhc3MsIGRpc2FibGluZyBzZXJ2aWNlcyBsb29rdXAgaW4gSmVyc2V5IGRvZXMgbm90IGFmZmVjdCBhbnkKKyAgICAgICAgICAgIGZ1bmN0aW9uYWxpdHkgb2YgSmVyc2V5IGNvcmUgbW9kdWxlcyBhbmQgZXh0ZW5zaW9ucyBhbmQgY2FuIHNhdmUgZG96ZW5zIG9mIG1zIGR1cmluZyBhcHBsaWNhdGlvbgorICAgICAgICAgICAgaW5pdGlhbGl6YXRpb24gaW4gZXhjaGFuZ2UgZm9yIGEgbW9yZSB2ZXJib3NlIGFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24gY29kZS4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhlIHNlcnZpY2VzIGxvb2t1cCBpbiBKZXJzZXkgKGVuYWJsZWQgYnkgZGVmYXVsdCkgY2FuIGJlIGRpc2FibGVkIHZpYSBhIGRlZGljYXRlZAorICAgICAgICAgICAgJmplcnNleS5jb21tb24uQ29tbW9uUHJvcGVydGllcy5NRVRBSU5GX1NFUlZJQ0VTX0xPT0tVUF9ESVNBQkxFOyBwcm9wZXJ0eS4KKyAgICAgICAgICAgIFRoZXJlIGlzIGEgY2xpZW50L3NlcnZlciBjb3VudGVyLXBhcnQgdGhhdCBvbmx5IGRpc2FibGVzIHRoZSBmZWF0dXJlIG9uIHRoZSBjbGllbnQgb3Igc2VydmVyIHJlc3BlY3RpdmVseToKKyAgICAgICAgICAgICZqZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXMuTUVUQUlORl9TRVJWSUNFU19MT09LVVBfRElTQUJMRTsvJmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcy5NRVRBSU5GX1NFUlZJQ0VTX0xPT0tVUF9ESVNBQkxFOy4KKyAgICAgICAgICAgIEFzIGluIGFsbCBvdGhlciBjYXNlcywgdGhlIGNsaWVudC9zZXJ2ZXIgc3BlY2lmaWMgcHJvcGVydGllcyBvdmVycmlkZXMgdGhlIHZhbHVlIG9mIHRoZSByZWxhdGVkIGNvbW1vbiBwcm9wZXJ0eSwKKyAgICAgICAgICAgIHdoZW4gc2V0LgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBGb3IgZXhhbXBsZSwgZm9sbG93aW5nIGNvZGUgc25pcHBldCBkaXNhYmxlcyBzZXJ2aWNlIHByb3ZpZGVyIGxvb2t1cCBhbmQgbWFudWFsbHkgcmVnaXN0ZXJzIGltcGxlbWVudGF0aW9ucworICAgICAgICAgICAgb2YgZGlmZmVyZW50IEpBWC1SUyBhbmQgSmVyc2V5IHByb3ZpZGVyIHR5cGVzCisgICAgICAgICAgICAoJmpheHJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0RmlsdGVyOywgJmpheHJzLmNvcmUuRmVhdHVyZTssICZqZXJzZXkuc2VydmVyLnNwaS5Db21wb25lbnRQcm92aWRlcjsKKyAgICAgICAgICAgIGFuZCAmamVyc2V5LnNlcnZlci5zcGkuQ29udGFpbmVyUHJvdmlkZXI7KToKKyAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgIDx0aXRsZT5SZWdpc3RlcmluZyBTUEkgaW1wbGVtZW50YXRpb25zIHVzaW5nIFJlc291cmNlQ29uZmlnPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5SZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhNeVJlc291cmNlLmNsYXNzKTsKK3Jlc291cmNlQ29uZmlnLnJlZ2lzdGVyKG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5maWx0ZXIuVXJpQ29ubmVnRmlsdGVyLmNsYXNzKTsKK3Jlc291cmNlQ29uZmlnLnJlZ2lzdGVyKG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci52YWxpZGF0aW9uLlZhbGlkYXRpb25GZWF0dXJlLmNsYXNzKTsKK3Jlc291cmNlQ29uZmlnLnJlZ2lzdGVyKG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmcuU3ByaW5nQ29tcG9uZW50UHJvdmlkZXIuY2xhc3MpOworcmVzb3VyY2VDb25maWcucmVnaXN0ZXIob3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseTIuaHR0cHNlcnZlci5Hcml6emx5SHR0cENvbnRhaW5lclByb3ZpZGVyLmNsYXNzKTsKK3Jlc291cmNlQ29uZmlnLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuTUVUQUlORl9TRVJWSUNFU19MT09LVVBfRElTQUJMRSwgdHJ1ZSk7PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKworICAgICAgICAgICAgU2ltaWxhcmx5LCBpbiBzY2VuYXJpb3Mgd2hlcmUgdGhlIGRlcGxveW1lbnQgbW9kZWwgcmVxdWlyZXMgZXh0ZW5kaW5nIHRoZSAmbGl0LmpheHJzLmNvcmUuQXBwbGljYXRpb247IHN1YmNsYXNzCisgICAgICAgICAgICAoZS5nLiBpbiBhbGwgU2VydmxldCBjb250YWluZXIgZGVwbG95bWVudHMpLCB0aGUgZm9sbG93aW5nIGNvZGUgY291bGQgYmUgdXNlZCB0byBhY2hpZXZlIHRoZSBzYW1lIGFwcGxpY2F0aW9uCisgICAgICAgICAgICBjb25maWd1cmF0aW9uOgorCisgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICA8dGl0bGU+UmVnaXN0ZXJpbmcgU1BJIGltcGxlbWVudGF0aW9ucyB1c2luZyAmbGl0LmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7IHN1YmNsYXNzPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5wdWJsaWMgY2xhc3MgTXlBcHBsaWNhdGlvbiBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKyAgICBwdWJsaWMgTXlBcHBsaWNhdGlvbigpIHsKKyAgICAgICAgcmVnaXN0ZXIob3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmZpbHRlci5VcmlDb25uZWdGaWx0ZXIuY2xhc3MpOworICAgICAgICByZWdpc3RlcihvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIudmFsaWRhdGlvbi5WYWxpZGF0aW9uRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIHJlZ2lzdGVyKG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmcuU3ByaW5nQ29tcG9uZW50UHJvdmlkZXIuY2xhc3MpOworICAgICAgICByZWdpc3RlcihvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5Mi5odHRwc2VydmVyLkdyaXp6bHlIdHRwQ29udGFpbmVyUHJvdmlkZXIuY2xhc3MpOworICAgICAgICBwcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLk1FVEFJTkZfU0VSVklDRVNfTE9PS1VQX0RJU0FCTEUsIHRydWUpOworICAgIH0KK308L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8L3BhcmE+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24geG1sOmlkPSJkZXBsb3ltZW50LmphdmFzZSI+CisgICAgICAgIDx0aXRsZT5KYXZhIFNFIERlcGxveW1lbnQgRW52aXJvbm1lbnRzPC90aXRsZT4KKworICAgICAgICA8c2VjdGlvbiB4bWw6aWQ9ImRlcGxveW1lbnQuaHR0cCI+CisgICAgICAgICAgICA8dGl0bGU+SFRUUCBzZXJ2ZXJzPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEphdmEgYmFzZWQgSFRUUCBzZXJ2ZXJzIHJlcHJlc2VudCBhIG1pbmltYWxpc3RpYyBhbmQgZmxleGlibGUgd2F5IG9mIGRlcGxveWluZyBKZXJzZXkgYXBwbGljYXRpb24uCisgICAgICAgICAgICAgICAgVGhlIEhUVFAgc2VydmVycyBhcmUgdXN1YWxseSBlbWJlZGRlZCBpbiB0aGUgYXBwbGljYXRpb24gYW5kIGNvbmZpZ3VyZWQgYW5kIHN0YXJ0ZWQgcHJvZ3JhbW1hdGljYWxseS4KKyAgICAgICAgICAgICAgICBJbiBnZW5lcmFsLCBKZXJzZXkgY29udGFpbmVyIGZvciBhIHNwZWNpZmljIEhUVFAgc2VydmVyIHByb3ZpZGVzIGEgY3VzdG9tIGZhY3RvcnkgbWV0aG9kIHRoYXQgcmV0dXJucworICAgICAgICAgICAgICAgIGEgY29ycmVjdGx5IGluaXRpYWxpemVkIEhUVFAgc2VydmVyIGluc3RhbmNlLgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8c2VjdGlvbiB4bWw6aWQ9ImRlcGxveW1lbnQuaHR0cC5qZGsiPgorICAgICAgICAgICAgICAgIDx0aXRsZT5KREsgSHR0cCBTZXJ2ZXI8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBTdGFydGluZyB3aXRoIEphdmEgU0UgNiwgSmF2YSBydW50aW1lIHNoaXBzIHdpdGggYSBidWlsdC1pbiBsaWdodHdlaWdodCBIVFRQIHNlcnZlci4gSmVyc2V5IG9mZmVycworICAgICAgICAgICAgICAgICAgICBpbnRlZ3JhdGlvbiB3aXRoIHRoaXMgSmF2YSBTRSBIVFRQIHNlcnZlciB0aHJvdWdoIHRoZSA8bGl0ZXJhbD5qZXJzZXktY29udGFpbmVyLWpkay1odHRwPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICBjb250YWluZXIgZXh0ZW5zaW9uIG1vZHVsZS4KKyAgICAgICAgICAgICAgICAgICAgSW5zdGVhZCBvZiBjcmVhdGluZyB0aGUgPGxpdGVyYWw+JmpkazYuSHR0cFNlcnZlcjs8L2xpdGVyYWw+IGluc3RhbmNlIGRpcmVjdGx5LCB1c2UgdGhlCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmNyZWF0ZUh0dHBTZXJ2ZXIoKTwvbGl0ZXJhbD4gbWV0aG9kIG9mIDxsaXRlcmFsPiZqZXJzZXkuamRraHR0cC5KZGtIdHRwU2VydmVyRmFjdG9yeTs8L2xpdGVyYWw+LAorICAgICAgICAgICAgICAgICAgICB3aGljaCBjcmVhdGVzIHRoZSA8bGl0ZXJhbD5IdHRwU2VydmVyPC9saXRlcmFsPiBpbnN0YW5jZSBjb25maWd1cmVkIGFzIGEgSmVyc2V5IGNvbnRhaW5lciBhbmQKKyAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgc3VwcGxpZWQgJmxpdC5qYXhycy5jb3JlLkFwcGxpY2F0aW9uOyBzdWJjbGFzcy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIENyZWF0aW5nIG5ldyBKZXJzZXktZW5hYmxlZCBqZGsgaHR0cCBzZXJ2ZXIgaXMgYXMgZWFzeSBhczoKKworICAgICAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5Vc2luZyBKZXJzZXkgd2l0aCBKREsgSFRUUCBTZXJ2ZXI8L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+IFVSSSBiYXNlVXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0LyIpLnBvcnQoOTk5OCkuYnVpbGQoKTsKK1Jlc291cmNlQ29uZmlnIGNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhNeVJlc291cmNlLmNsYXNzKTsKK0h0dHBTZXJ2ZXIgc2VydmVyID0gSmRrSHR0cFNlcnZlckZhY3RvcnkuY3JlYXRlSHR0cFNlcnZlcihiYXNlVXJpLCBjb25maWcpOzwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIEEgSkRLIEhUVFAgQ29udGFpbmVyIGRlcGVuZGVuY3kgbmVlZHMgdG8gYmUgYWRkZWQ6CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0ieG1sIj4mbHQ7ZGVwZW5kZW5jeSZndDsKKyAgICAmbHQ7Z3JvdXBJZCZndDtvcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzJmx0Oy9ncm91cElkJmd0OworICAgICZsdDthcnRpZmFjdElkJmd0O2plcnNleS1jb250YWluZXItamRrLWh0dHAmbHQ7L2FydGlmYWN0SWQmZ3Q7CisgICAgJmx0O3ZlcnNpb24mZ3Q7JnZlcnNpb247Jmx0Oy92ZXJzaW9uJmd0OworJmx0Oy9kZXBlbmRlbmN5Jmd0OzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgICAgIDxzZWN0aW9uIHhtbDppZD0iZGVwbG95bWVudC5odHRwLmdyaXp6bHkiPgorICAgICAgICAgICAgICAgIDx0aXRsZT5Hcml6emx5IEhUVFAgU2VydmVyPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4mZ3JpenpseS5saW5rOyBpcyBhIG11bHRpLXByb3RvY29sIGZyYW1ld29yayBidWlsdCBvbiB0b3Agb2YgSmF2YSAmamRrNi5OSU87LiBHcml6emx5IGFpbXMgdG8gc2ltcGxpZnkKKyAgICAgICAgICAgICAgICAgICAgZGV2ZWxvcG1lbnQgb2Ygcm9idXN0IGFuZCBzY2FsYWJsZSBzZXJ2ZXJzLgorICAgICAgICAgICAgICAgICAgICBKZXJzZXkgcHJvdmlkZXMgYSBjb250YWluZXIgZXh0ZW5zaW9uIG1vZHVsZSB0aGF0IGVuYWJsZXMgc3VwcG9ydCBmb3IgdXNpbmcgR3JpenpseSBhcyBhIHBsYWluIHZhbmlsbGEKKyAgICAgICAgICAgICAgICAgICAgSFRUUCBjb250YWluZXIgdGhhdCBydW5zIEpBWC1SUyBhcHBsaWNhdGlvbnMuIFN0YXJ0aW5nIGEgR3JpenpseSBzZXJ2ZXIgdG8gcnVuCisgICAgICAgICAgICAgICAgICAgIGEgSkFYLVJTIG9yIEplcnNleSBhcHBsaWNhdGlvbiBpcyBvbmUgb2YgdGhlIG1vc3QgbGlnaHR3ZWlnaHQgYW5kIGVhc3kgd2F5cyBob3cgdG8gZXhwb3NlIGEgZnVuY3Rpb25hbAorICAgICAgICAgICAgICAgICAgICBSRVNUZnVsIHNlcnZpY2VzIGFwcGxpY2F0aW9uLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgR3JpenpseSBIVFRQIGNvbnRhaW5lciBzdXBwb3J0cyBpbmplY3Rpb24gb2YgR3JpenpseS1zcGVjaWZpYworICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5vcmcuZ2xhc3NmaXNoLmdyaXp6bHkuaHR0cC5zZXJ2ZXIuUmVxdWVzdDwvbGl0ZXJhbD4gYW5kCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPm9yZy5nbGFzc2Zpc2guZ3JpenpseS5odHRwLnNlcnZlci5SZXNwb25zZTwvbGl0ZXJhbD4gaW5zdGFuY2VzIGludG8gSkFYLVJTIGFuZCBKZXJzZXkKKyAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gcmVzb3VyY2VzIGFuZCBwcm92aWRlcnMuIEhvd2V2ZXIsIHNpbmNlIEdyaXp6bHkgPGxpdGVyYWw+UmVxdWVzdDwvbGl0ZXJhbD4gaXMgbm90IHByb3hpYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgdGhlIGluamVjdGlvbiBvZiBHcml6emx5IDxsaXRlcmFsPlJlcXVlc3Q8L2xpdGVyYWw+IGludG8gc2luZ2xldG9uIChieSBkZWZhdWx0KSBKQVgtUlMgLyBKZXJzZXkgcHJvdmlkZXJzCisgICAgICAgICAgICAgICAgICAgIGlzIG9ubHkgcG9zc2libGUgdmlhIDxsaXRlcmFsPmphdmF4LmluamVjdC5Qcm92aWRlcjwvbGl0ZXJhbD4gaW5zdGFuY2UuIChHcml6emx5IDxsaXRlcmFsPlJlc3BvbnNlPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICBkb2VzIG5vdCBzdWZmZXIgdGhlIHNhbWUgcmVzdHJpY3Rpb24uKQorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgICAgICA8dGl0bGU+VXNpbmcgSmVyc2V5IHdpdGggR3JpenpseSBIVFRQIFNlcnZlcjwvdGl0bGU+CisgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPlVSSSBiYXNlVXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0LyIpLnBvcnQoOTk5OCkuYnVpbGQoKTsKKyAgICBSZXNvdXJjZUNvbmZpZyBjb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoTXlSZXNvdXJjZS5jbGFzcyk7CisgICAgSHR0cFNlcnZlciBzZXJ2ZXIgPSBHcml6emx5SHR0cFNlcnZlckZhY3RvcnkuY3JlYXRlSHR0cFNlcnZlcihiYXNlVXJpLCBjb25maWcpOzwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgICAgICAgICAgICAgICAgICAgVGhlIGNvbnRhaW5lciBleHRlbnNpb24gbW9kdWxlIGRlcGVuZGVuY3kgdG8gYmUgYWRkZWQgaXM6CisKKyAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJ4bWwiPiZsdDtkZXBlbmRlbmN5Jmd0OworICAgICZsdDtncm91cElkJmd0O29yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnMmbHQ7L2dyb3VwSWQmZ3Q7CisgICAgJmx0O2FydGlmYWN0SWQmZ3Q7amVyc2V5LWNvbnRhaW5lci1ncml6emx5Mi1odHRwJmx0Oy9hcnRpZmFjdElkJmd0OworICAgICZsdDt2ZXJzaW9uJmd0OyZ2ZXJzaW9uOyZsdDsvdmVyc2lvbiZndDsKKyZsdDsvZGVwZW5kZW5jeSZndDs8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICBKZXJzZXkgdXNlcyBHcml6emx5IGV4dGVuc2l2ZWx5IGluIHRoZSBwcm9qZWN0IHVuaXQgYW5kIGVuZC10by1lbmQgdGVzdHMgdmlhCisgICAgICAgICAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSJ0ZXN0LWZyYW1ld29yayI+dGVzdCBmcmFtZXdvcms8L2xpbms+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9ub3RlPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgICAgICA8c2VjdGlvbiB4bWw6aWQ9ImRlcGxveW1lbnQuaHR0cC5zaW1wbGUiPgorICAgICAgICAgICAgICAgIDx0aXRsZT5TaW1wbGUgc2VydmVyPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGxpbmsgeGxpbms6aHJlZj0naHR0cDovL3d3dy5zaW1wbGVmcmFtZXdvcmsub3JnLyc+U2ltcGxlPC9saW5rPiBpcyBhIGZyYW1ld29yayB3aGljaCBhbGxvd3MgZGV2ZWxvcGVycworICAgICAgICAgICAgICAgICAgICB0byBjcmVhdGUgYSBIVFRQIHNlcnZlciBpbnN0YW5jZSBhbmQgZW1iZWQgaXQgd2l0aGluCisgICAgICAgICAgICAgICAgICAgIGFuIGFwcGxpY2F0aW9uLiBBZ2FpbiwgY3JlYXRpbmcgdGhlIHNlcnZlciBpbnN0YW5jZSBpcyBhY2hpZXZlZCBieSBjYWxsaW5nIGEgZmFjdG9yeSBtZXRob2QgZnJvbSB0aGUKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+amVyc2V5LWNvbnRhaW5lci1zaW1wbGUtaHR0cDwvbGl0ZXJhbD4gY29udGFpbmVyIGV4dGVuc2lvbiBtb2R1bGUuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBTaW1wbGUgZnJhbWV3b3JrIEhUVFAgY29udGFpbmVyIHN1cHBvcnRzIGluamVjdGlvbiBvZiBTaW1wbGUgZnJhbWV3b3JrLXNwZWNpZmljCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPm9yZy5zaW1wbGVmcmFtZXdvcmsuaHR0cC5SZXF1ZXN0PC9saXRlcmFsPiBhbmQKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+b3JnLnNpbXBsZWZyYW1ld29yay5odHRwLlJlc3BvbnNlPC9saXRlcmFsPiBpbnN0YW5jZXMgaW50byBKQVgtUlMgYW5kIEplcnNleQorICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiByZXNvdXJjZXMgYW5kIHByb3ZpZGVycy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgPHRpdGxlPlVzaW5nIEplcnNleSB3aXRoIHRoZSBTaW1wbGUgZnJhbWV3b3JrPC90aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+VVJJIGJhc2VVcmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3QvIikucG9ydCg5OTk4KS5idWlsZCgpOworICAgIFJlc291cmNlQ29uZmlnIGNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhNeVJlc291cmNlLmNsYXNzKTsKKyAgICBTaW1wbGVDb250YWluZXIgc2VydmVyID0gU2ltcGxlQ29udGFpbmVyRmFjdG9yeS5jcmVhdGUoYmFzZVVyaSwgY29uZmlnKTs8L3Byb2dyYW1saXN0aW5nPgorCisgICAgICAgICAgICAgICAgICAgIFRoZSBuZWNlc3NhcnkgY29udGFpbmVyIGV4dGVuc2lvbiBtb2R1bGUgZGVwZW5kZW5jeSBpbiB0aGlzIGNhc2UgaXM6CisKKyAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJ4bWwiPiZsdDtkZXBlbmRlbmN5Jmd0OworICAgICZsdDtncm91cElkJmd0O29yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnMmbHQ7L2dyb3VwSWQmZ3Q7CisgICAgJmx0O2FydGlmYWN0SWQmZ3Q7amVyc2V5LWNvbnRhaW5lci1zaW1wbGUtaHR0cCZsdDsvYXJ0aWZhY3RJZCZndDsKKyAgICAmbHQ7dmVyc2lvbiZndDsmdmVyc2lvbjsmbHQ7L3ZlcnNpb24mZ3Q7CismbHQ7L2RlcGVuZGVuY3kmZ3Q7PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgU2ltcGxlIGZyYW1ld29yayBIVFRQIGNvbnRhaW5lciBkb2VzIG5vdCBzdXBwb3J0IGRlcGxveW1lbnQgb24gY29udGV4dCBwYXRocyBvdGhlciB0aGFuCisgICAgICAgICAgICAgICAgICAgICAgICByb290IHBhdGggKCI8bGl0ZXJhbD4vPC9saXRlcmFsPiIpLiBOb24tcm9vdCBjb250ZXh0IHBhdGggaXMgaWdub3JlZCBkdXJpbmcgZGVwbG95bWVudC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICAgICAgPHNlY3Rpb24geG1sOmlkPSJkZXBsb3ltZW50Lmh0dHAuamV0dHkiPgorICAgICAgICAgICAgICAgIDx0aXRsZT5KZXR0eSBIVFRQIFNlcnZlcjwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEpldHR5IGlzIGEgcG9wdWxhciBTZXJ2bGV0IGNvbnRhaW5lciBhbmQgSFRUUCBzZXJ2ZXIuIFdlIHdpbGwgbm90IGxvb2sgaW50byBKZXR0eSdzIGNhcGFiaWxpdGllcyBhcyBhCisgICAgICAgICAgICAgICAgICAgIFNlcnZsZXQgY29udGFpbmVyIChhbHRob3VnaCB3ZSBhcmUgdXNpbmcgaXQgaW4gb3VyIHRlc3RzIGFuZCBleGFtcGxlcyksIGJlY2F1c2UgdGhlcmUgaXMgbm90aGluZyBzcGVjaWZpYworICAgICAgICAgICAgICAgICAgICB0byBKZXR0eSB3aGVuIHVzaW5nIGEgU2VydmxldC1iYXNlZCBkZXBsb3ltZW50IG1vZGVsLCB3aGljaCBpcyBleHRlbnNpdmVseSBkZXNjcmliZWQgbGF0ZXIgaW4gb3VyCisgICAgICAgICAgICAgICAgICAgIDx4cmVmIGxpbmtlbmQ9ImRlcGxveW1lbnQuc2VydmxldCIvPiBzZWN0aW9uLiBXZSB3aWxsIGhlcmUgb25seSBmb2N1cyBvbiBkZXNjcmliaW5nIGhvdyB0byB1c2UKKyAgICAgICAgICAgICAgICAgICAgSmV0dHkncyBIVFRQIHNlcnZlci4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEpldHR5IEhUVFAgY29udGFpbmVyIHN1cHBvcnRzIGluamVjdGlvbiBvZiBKZXR0eS1zcGVjaWZpYworICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5vcmcuZWNsaXBzZS5qZXR0eS5zZXJ2ZXIuUmVxdWVzdDwvbGl0ZXJhbD4gYW5kCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPm9yZy5lY2xpcHNlLmpldHR5LnNlcnZlci5SZXNwb25zZTwvbGl0ZXJhbD4gaW5zdGFuY2VzIGludG8gSkFYLVJTIGFuZCBKZXJzZXkKKyAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gcmVzb3VyY2VzIGFuZCBwcm92aWRlcnMuIEhvd2V2ZXIsIHNpbmNlIEpldHR5IEhUVFAgPGxpdGVyYWw+UmVxdWVzdDwvbGl0ZXJhbD4gaXMgbm90IHByb3hpYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgdGhlIGluamVjdGlvbiBvZiBKZXR0eSA8bGl0ZXJhbD5SZXF1ZXN0PC9saXRlcmFsPiBpbnRvIHNpbmdsZXRvbiAoYnkgZGVmYXVsdCkgSkFYLVJTIC8gSmVyc2V5IHByb3ZpZGVycworICAgICAgICAgICAgICAgICAgICBpcyBvbmx5IHBvc3NpYmxlIHZpYSA8bGl0ZXJhbD5qYXZheC5pbmplY3QuUHJvdmlkZXI8L2xpdGVyYWw+IGluc3RhbmNlLiAoSmV0dHkgPGxpdGVyYWw+UmVzcG9uc2U8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgIGRvZXMgbm90IHN1ZmZlciB0aGUgc2FtZSByZXN0cmljdGlvbi4pCisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5Vc2luZyBKZXJzZXkgd2l0aCBKZXR0eSBIVFRQIFNlcnZlcjwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+VVJJIGJhc2VVcmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3QvIikucG9ydCg5OTk4KS5idWlsZCgpOworUmVzb3VyY2VDb25maWcgY29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKE15UmVzb3VyY2UuY2xhc3MpOworU2VydmVyIHNlcnZlciA9IEpldHR5SHR0cENvbnRhaW5lckZhY3RvcnkuY3JlYXRlU2VydmVyKGJhc2VVcmksIGNvbmZpZyk7PC9wcm9ncmFtbGlzdGluZz4KKworICAgICAgICAgICAgICAgICAgICBBbmQsIG9mIGNvdXJzZSwgd2UgYWRkIHRoZSBuZWNlc3NhcnkgY29udGFpbmVyIGV4dGVuc2lvbiBtb2R1bGUgZGVwZW5kZW5jeToKKworICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9InhtbCIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPiZsdDtkZXBlbmRlbmN5Jmd0OworICAgICZsdDtncm91cElkJmd0O29yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnMmbHQ7L2dyb3VwSWQmZ3Q7CisgICAgJmx0O2FydGlmYWN0SWQmZ3Q7amVyc2V5LWNvbnRhaW5lci1qZXR0eS1odHRwJmx0Oy9hcnRpZmFjdElkJmd0OworICAgICZsdDt2ZXJzaW9uJmd0OyZ2ZXJzaW9uOyZsdDsvdmVyc2lvbiZndDsKKyZsdDsvZGVwZW5kZW5jeSZndDs8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICBKZXR0eSBIVFRQIGNvbnRhaW5lciBkb2VzIG5vdCBzdXBwb3J0IGRlcGxveW1lbnQgb24gY29udGV4dCBwYXRocyBvdGhlciB0aGFuCisgICAgICAgICAgICAgICAgICAgICAgICByb290IHBhdGggKCI8bGl0ZXJhbD4vPC9saXRlcmFsPiIpLiBOb24tcm9vdCBjb250ZXh0IHBhdGggaXMgaWdub3JlZCBkdXJpbmcgZGVwbG95bWVudC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICAgICAgPHNlY3Rpb24geG1sOmlkPSJkZXBsb3ltZW50Lmh0dHAubmV0dHkiPgorICAgICAgICAgICAgICAgIDx0aXRsZT5OZXR0eSBIVFRQIFNlcnZlcjwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIE5ldHR5IGlzIGEgTklPIGNsaWVudCBzZXJ2ZXIgZnJhbWV3b3JrIHdoaWNoIGVuYWJsZXMgcXVpY2sgYW5kIGVhc3kgZGV2ZWxvcG1lbnQgb2YgbmV0d29yaworICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbnMgc3VjaCBhcyBwcm90b2NvbCBzZXJ2ZXJzIGFuZCBjbGllbnRzLiBKZXJzZXkgc3VwcG9ydHMgTmV0dHkgYXMgYSBjb250YWluZXIgYW5kCisgICAgICAgICAgICAgICAgICAgIGFzIGEgY2xpZW50IGNvbm5lY3RvciAtIHRoaXMgY2hhcHRlciB3aWxsIHByZXNlbnQgaG93IHRvIHVzZSB0aGUgY29udGFpbmVyLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgICAgICA8dGl0bGU+VXNpbmcgSmVyc2V5IHdpdGggTmV0dHkgSFRUUCBTZXJ2ZXI8L3RpdGxlPgorCisgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPlVSSSBiYXNlVXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0LyIpLnBvcnQoOTk5OCkuYnVpbGQoKTsKK1Jlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKEhlbGxvV29ybGRSZXNvdXJjZS5jbGFzcyk7CitDaGFubmVsIHNlcnZlciA9IE5ldHR5SHR0cENvbnRhaW5lclByb3ZpZGVyLmNyZWF0ZVNlcnZlcihiYXNlVXJpLCByZXNvdXJjZUNvbmZpZywgZmFsc2UpOzwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgICAgICAgICAgICAgICAgICAgQW5kLCBvZiBjb3Vyc2UsIHdlIGFkZCB0aGUgbmVjZXNzYXJ5IGNvbnRhaW5lciBleHRlbnNpb24gbW9kdWxlIGRlcGVuZGVuY3k6CisKKyAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJ4bWwiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj4mbHQ7ZGVwZW5kZW5jeSZndDsKKyAgICAmbHQ7Z3JvdXBJZCZndDtvcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzJmx0Oy9ncm91cElkJmd0OworICAgICZsdDthcnRpZmFjdElkJmd0O2plcnNleS1jb250YWluZXItbmV0dHktaHR0cCZsdDsvYXJ0aWZhY3RJZCZndDsKKyAgICAmbHQ7dmVyc2lvbiZndDsmdmVyc2lvbjsmbHQ7L3ZlcnNpb24mZ3Q7CismbHQ7L2RlcGVuZGVuY3kmZ3Q7PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgTmV0dHkgSFRUUCBjb250YWluZXIgZG9lcyBub3Qgc3VwcG9ydCBkZXBsb3ltZW50IG9uIGNvbnRleHQgcGF0aHMgb3RoZXIgdGhhbgorICAgICAgICAgICAgICAgICAgICAgICAgcm9vdCBwYXRoICgiPGxpdGVyYWw+LzwvbGl0ZXJhbD4iKS4gTm9uLXJvb3QgY29udGV4dCBwYXRoIGlzIGlnbm9yZWQgZHVyaW5nIGRlcGxveW1lbnQuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L25vdGU+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiB4bWw6aWQ9ImRlcGxveW1lbnQuamF4cnMuZW5kcG9pbnQiPgorICAgICAgICA8dGl0bGU+Q3JlYXRpbmcgcHJvZ3JhbW1hdGljIEpBWC1SUyBlbmRwb2ludDwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgSkFYLVJTIHNwZWNpZmljYXRpb24gYWxzbyBkZWZpbmVzIHRoZSBhYmlsaXR5IHRvIHByb2dyYW1tYXRpY2FsbHkgY3JlYXRlIGEgSkFYLVJTIGFwcGxpY2F0aW9uIGVuZHBvaW50CisgICAgICAgICAgICAoaS5lLiBjb250YWluZXIpIGZvciBhbnkgaW5zdGFuY2Ugb2YgYSAmbGl0LmpheHJzLmNvcmUuQXBwbGljYXRpb247IHN1YmNsYXNzLiBGb3IgZXhhbXBsZSwgSmVyc2V5IHN1cHBvcnRzCisgICAgICAgICAgICBjcmVhdGlvbiBvZiA8bGluayB4bGluazpocmVmPSJodHRwOi8vZ3JpenpseS5qYXZhLm5ldC8iPkdyaXp6bHk8L2xpbms+IDxsaXRlcmFsPkh0dHBIYW5kbGVyPC9saXRlcmFsPiBpbnN0YW5jZQorICAgICAgICAgICAgYXMgZm9sbG93czoKKworICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIj5IdHRwSGFuZGxlciBlbmRwb2ludCA9IFJ1bnRpbWVEZWxlZ2F0ZS5nZXRJbnN0YW5jZSgpCisgICAgICAgIC5jcmVhdGVFbmRwb2ludChuZXcgTXlBcHBsaWNhdGlvbigpLCBIdHRwSGFuZGxlci5jbGFzcyk7PC9wcm9ncmFtbGlzdGluZz4KKworICAgICAgICAgICAgT25jZSB0aGUgR3JpenpseSA8bGl0ZXJhbD5IdHRwSGFuZGxlcjwvbGl0ZXJhbD4gZW5kcG9pbnQgaXMgY3JlYXRlZCwgaXQgY2FuIGJlIHVzZWQgZm9yIGluLXByb2Nlc3MgZGVwbG95bWVudAorICAgICAgICAgICAgdG8gYSBzcGVjaWZpYyBiYXNlIFVSTC4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIHhtbDppZD0iZGVwbG95bWVudC5zZXJ2bGV0Ij4KKyAgICAgICAgPHRpdGxlPlNlcnZsZXQtYmFzZWQgRGVwbG95bWVudDwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBJbiBhIFNlcnZsZXQgY29udGFpbmVyLCBKQVgtUlMgZGVmaW5lcyBtdWx0aXBsZSBkZXBsb3ltZW50IG9wdGlvbnMgZGVwZW5kaW5nIG9uIHRoZSBTZXJ2bGV0IEFQSSB2ZXJzaW9uIHN1cHBvcnRlZCBieQorICAgICAgICAgICAgdGhlIFNlcnZsZXQgY29udGFpbmVyLiBGb2xsb3dpbmcgc2VjdGlvbnMgZGVzY3JpYmUgdGhlc2Ugb3B0aW9ucyBpbiBkZXRhaWwuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8c2VjdGlvbiB4bWw6aWQ9ImRlcGxveW1lbnQuc2VydmxldC4yIj4KKyAgICAgICAgICAgIDx0aXRsZT5TZXJ2bGV0IDIueCBDb250YWluZXI8L3RpdGxlPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgSmVyc2V5IGludGVncmF0ZXMgd2l0aCBhbnkgU2VydmxldCBjb250YWluZXJzIHN1cHBvcnRpbmcgYXQgbGVhc3QgU2VydmxldCAyLjUgc3BlY2lmaWNhdGlvbi4gUnVubmluZyBvbiBhCisgICAgICAgICAgICAgICAgU2VydmxldCBjb250YWluZXIgdGhhdCBzdXBwb3J0cyBTZXJ2bGV0IEFQSSAzLjAgb3IgbGF0ZXIgZ2l2ZXMgeW91IHRoZSBhZHZhbnRhZ2Ugb2Ygd2lkZXIgZmVhdHVyZSBzZXQKKyAgICAgICAgICAgICAgICAoZXNwZWNpYWxseSBhc3luY2hyb25vdXMgcmVxdWVzdCBwcm9jZXNzaW5nIHN1cHBvcnQpIGFuZCBlYXNpZXIgYW5kIG1vcmUgZmxleGlibGUgZGVwbG95bWVudCBvcHRpb25zLgorICAgICAgICAgICAgICAgIEluIHRoaXMgc2VjdGlvbiB3ZSB3aWxsIGZvY3VzIG9uIHRoZSBiYXNpYyBkZXBsb3ltZW50IG1vZGVscyBhdmFpbGFibGUgaW4gYW55IFNlcnZsZXQgMi41IG9yIGhpZ2hlciBjb250YWluZXIuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBJbiBTZXJ2bGV0IDIuNSBlbnZpcm9ubWVudCwgeW91IGhhdmUgdG8gZXhwbGljaXRseSBkZWNsYXJlIHRoZSBKZXJzZXkgY29udGFpbmVyIFNlcnZsZXQgaW4geW91ciBXZWIgYXBwbGljYXRpb24ncworICAgICAgICAgICAgICAgIDxsaXRlcmFsPndlYi54bWw8L2xpdGVyYWw+IGRlcGxveW1lbnQgZGVzY3JpcHRvciBmaWxlLgorCisgICAgICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5Ib29raW5nIHVwIEplcnNleSBhcyBhIFNlcnZsZXQ8L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9InhtbCIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPiZsdDt3ZWItYXBwJmd0OworICAgICZsdDtzZXJ2bGV0Jmd0OworICAgICAgICAmbHQ7c2VydmxldC1uYW1lJmd0O015QXBwbGljYXRpb24mbHQ7L3NlcnZsZXQtbmFtZSZndDsKKyAgICAgICAgJmx0O3NlcnZsZXQtY2xhc3MmZ3Q7b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyJmx0Oy9zZXJ2bGV0LWNsYXNzJmd0OworICAgICAgICAmbHQ7aW5pdC1wYXJhbSZndDsKKyAgICAgICAgICAgIC4uLgorICAgICAgICAmbHQ7L2luaXQtcGFyYW0mZ3Q7CisgICAgJmx0Oy9zZXJ2bGV0Jmd0OworICAgIC4uLgorICAgICZsdDtzZXJ2bGV0LW1hcHBpbmcmZ3Q7CisgICAgICAgICZsdDtzZXJ2bGV0LW5hbWUmZ3Q7TXlBcHBsaWNhdGlvbiZsdDsvc2VydmxldC1uYW1lJmd0OworICAgICAgICAmbHQ7dXJsLXBhdHRlcm4mZ3Q7L215QXBwLyombHQ7L3VybC1wYXR0ZXJuJmd0OworICAgICZsdDsvc2VydmxldC1tYXBwaW5nJmd0OworICAgIC4uLgorJmx0Oy93ZWItYXBwJmd0OzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorCisgICAgICAgICAgICAgICAgQWx0ZXJuYXRpdmVseSwgeW91IGNhbiByZWdpc3RlciBKZXJzZXkgY29udGFpbmVyIGFzIGEgPGVtcGhhc2lzPmZpbHRlcjwvZW1waGFzaXM+OgorCisgICAgICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5Ib29raW5nIHVwIEplcnNleSBhcyBhIFNlcnZsZXQgRmlsdGVyPC90aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJ4bWwiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj4mbHQ7d2ViLWFwcCZndDsKKyAgICAmbHQ7ZmlsdGVyJmd0OworICAgICAgICAmbHQ7ZmlsdGVyLW5hbWUmZ3Q7TXlBcHBsaWNhdGlvbiZsdDsvZmlsdGVyLW5hbWUmZ3Q7CisgICAgICAgICZsdDtmaWx0ZXItY2xhc3MmZ3Q7b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyJmx0Oy9maWx0ZXItY2xhc3MmZ3Q7CisgICAgICAgICZsdDtpbml0LXBhcmFtJmd0OworICAgICAgICAgICAgLi4uCisgICAgICAgICZsdDsvaW5pdC1wYXJhbSZndDsKKyAgICAmbHQ7L2ZpbHRlciZndDsKKyAgICAuLi4KKyAgICAmbHQ7ZmlsdGVyLW1hcHBpbmcmZ3Q7CisgICAgICAgICZsdDtmaWx0ZXItbmFtZSZndDtNeUFwcGxpY2F0aW9uJmx0Oy9maWx0ZXItbmFtZSZndDsKKyAgICAgICAgJmx0O3VybC1wYXR0ZXJuJmd0Oy9teUFwcC8qJmx0Oy91cmwtcGF0dGVybiZndDsKKyAgICAmbHQ7L2ZpbHRlci1tYXBwaW5nJmd0OworICAgIC4uLgorJmx0Oy93ZWItYXBwJmd0OzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8aW1wb3J0YW50PgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBTZXJ2bGV0IDIueCBBUEkgZG9lcyBub3QgcHJvdmlkZSBhIHdheSBob3cgdG8gcHJvZ3JhbW1hdGljYWxseSByZWFkIHRoZSBmaWx0ZXIgbWFwcGluZ3MuIFRvIG1ha2UgYXBwbGljYXRpb24KKyAgICAgICAgICAgICAgICAgICAgZGVwbG95ZWQgdXNpbmcgZmlsdGVyIHdvcmsgY29ycmVjdGx5LCBlaXRoZXIgU2VydmxldCAzLnggY29udGFpbmVyIG11c3QgYmUgdXNlZAorICAgICAgICAgICAgICAgICAgICAoPGxpdGVyYWw+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0PC9saXRlcmFsPiBpbnN0ZWFkIG9mIDxsaXRlcmFsPmplcnNleS1jb250YWluZXItc2VydmxldC1jb3JlPC9saXRlcmFsPiksIG9yCisgICAgICAgICAgICAgICAgICAgIHRoZSBjb250ZXh0IHBhdGggb2YgdGhlIGFwcCBuZWVkcyB0byBiZSBkZWZpbmVkIHVzaW5nIGluaXQgcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmplcnNleS5jb25maWcuc2VydmxldC5maWx0ZXIuY29udGV4dFBhdGg8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvaW1wb3J0YW50PgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgY29udGVudCBvZiB0aGUgPGxpdGVyYWw+Jmx0O2luaXQtcGFyYW0mZ3Q7PC9saXRlcmFsPiBlbGVtZW50IHdpbGwgdmFyeSBkZXBlbmRpbmcgb24gdGhlIHdheSB5b3UgZGVjaWRlIHRvCisgICAgICAgICAgICAgICAgY29uZmlndXJlIEplcnNleSByZXNvdXJjZXMuCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxzZWN0aW9uIHhtbDppZD0iZGVwbG95bWVudC5zZXJ2bGV0LjIuYXBwbGljYXRpb24iPgorICAgICAgICAgICAgICAgIDx0aXRsZT5DdXN0b20gJmxpdC5qYXhycy5jb3JlLkFwcGxpY2F0aW9uOyBzdWJjbGFzczwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIElmIHlvdSBleHRlbmQgdGhlICZqYXhycy5jb3JlLkFwcGxpY2F0aW9uOyBjbGFzcyB0byBwcm92aWRlIHRoZSBsaXN0IG9mIHJlbGV2YW50IHJvb3QgcmVzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgY2xhc3NlcyAoPGxpdGVyYWw+Z2V0Q2xhc3NlcygpPC9saXRlcmFsPikgYW5kIHNpbmdsZXRvbnMgKDxsaXRlcmFsPmdldFNpbmdsZXRvbnMoKTwvbGl0ZXJhbD4pLAorICAgICAgICAgICAgICAgICAgICBpLmUuIHlvdXIgSkFYLVJTIGFwcGxpY2F0aW9uIG1vZGVsLCB5b3UgdGhlbiBuZWVkIHRvIHJlZ2lzdGVyIGl0IGluIHlvdXIgd2ViIGFwcGxpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPndlYi54bWw8L2xpdGVyYWw+IGRlcGxveW1lbnQgZGVzY3JpcHRvciB1c2luZyBhIFNlcnZsZXQgb3IgU2VydmxldCBmaWx0ZXIgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIHdpdGggYSBuYW1lIG9mICA8bGl0ZXJhbD5qYXZheC53cy5ycy5BcHBsaWNhdGlvbjwvbGl0ZXJhbD4gWzxlbXBoYXNpcz5zaWM8L2VtcGhhc2lzPl0gYXMgZm9sbG93czoKKworICAgICAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmluZyBKZXJzZXkgY29udGFpbmVyIFNlcnZsZXQgb3IgRmlsdGVyIHRvIHVzZSBjdXN0b20gJmxpdC5qYXhycy5jb3JlLkFwcGxpY2F0aW9uOyBzdWJjbGFzcworICAgICAgICAgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0ieG1sIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+Jmx0O2luaXQtcGFyYW0mZ3Q7CisgICAgJmx0O3BhcmFtLW5hbWUmZ3Q7amF2YXgud3MucnMuQXBwbGljYXRpb24mbHQ7L3BhcmFtLW5hbWUmZ3Q7CisgICAgJmx0O3BhcmFtLXZhbHVlJmd0O29yZy5mb28uTXlBcHBsaWNhdGlvbiZsdDsvcGFyYW0tdmFsdWUmZ3Q7CismbHQ7L2luaXQtcGFyYW0mZ3Q7PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorCisgICAgICAgICAgICAgICAgICAgIEplcnNleSB3aWxsIGNvbnNpZGVyIGFsbCB0aGUgY2xhc3NlcyByZXR1cm5lZCBieSA8bGl0ZXJhbD5nZXRDbGFzc2VzKCk8L2xpdGVyYWw+IGFuZAorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5nZXRTaW5nbGV0b25zKCk8L2xpdGVyYWw+IG1ldGhvZHMgb2YgeW91ciAmbGl0LmpheHJzLmNvcmUuQXBwbGljYXRpb247IGltcGxlbWVudGF0aW9uLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGFzIGRlZmluZWQgYnkgSkFYLVJTIHNwZWNpZmljYXRpb24gaXMgaW5kZWVkCisgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5qYXZheC53cy5ycy5BcHBsaWNhdGlvbjwvbGl0ZXJhbD4gYW5kIG5vdCA8bGl0ZXJhbD5qYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgYXMgb25lIG1pZ2h0IGV4cGVjdC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICAgICAgPHNlY3Rpb24geG1sOmlkPSJkZXBsb3ltZW50LnNlcnZsZXQuMi5wYWNrYWdlIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+SmVyc2V5IHBhY2thZ2Ugc2Nhbm5pbmc8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBJZiB0aGVyZSBpcyBubyBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgdG8gYmUgc2V0IGFuZCBkZXBsb3llZCBhcHBsaWNhdGlvbiBjb25zaXN0cyBvbmx5IGZyb20gcmVzb3VyY2VzCisgICAgICAgICAgICAgICAgICAgIGFuZCBwcm92aWRlcnMgc3RvcmVkIGluIHBhcnRpY3VsYXIgcGFja2FnZXMsIHlvdSBjYW4gaW5zdHJ1Y3QgSmVyc2V5IHRvIHNjYW4gdGhlc2UgcGFja2FnZXMKKyAgICAgICAgICAgICAgICAgICAgYW5kIHJlZ2lzdGVyIGFueSBmb3VuZCByZXNvdXJjZXMgYW5kIHByb3ZpZGVycyBhdXRvbWF0aWNhbGx5OgorCisgICAgICAgICAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRpdGxlPkNvbmZpZ3VyaW5nIEplcnNleSBjb250YWluZXIgU2VydmxldCBvciBGaWx0ZXIgdG8gdXNlIHBhY2thZ2Ugc2Nhbm5pbmc8L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJ4bWwiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj4mbHQ7aW5pdC1wYXJhbSZndDsKKyAgICAmbHQ7cGFyYW0tbmFtZSZndDtqZXJzZXkuY29uZmlnLnNlcnZlci5wcm92aWRlci5wYWNrYWdlcyZsdDsvcGFyYW0tbmFtZSZndDsKKyAgICAmbHQ7cGFyYW0tdmFsdWUmZ3Q7CisgICAgICAgIG9yZy5mb28ubXlyZXNvdXJjZXMsb3JnLmJhci5vdGhlcnJlc291cmNlcworICAgICZsdDsvcGFyYW0tdmFsdWUmZ3Q7CismbHQ7L2luaXQtcGFyYW0mZ3Q7CismbHQ7aW5pdC1wYXJhbSZndDsKKyAgICAmbHQ7cGFyYW0tbmFtZSZndDtqZXJzZXkuY29uZmlnLnNlcnZlci5wcm92aWRlci5zY2FubmluZy5yZWN1cnNpdmUmbHQ7L3BhcmFtLW5hbWUmZ3Q7CisgICAgJmx0O3BhcmFtLXZhbHVlJmd0O2ZhbHNlJmx0Oy9wYXJhbS12YWx1ZSZndDsKKyZsdDsvaW5pdC1wYXJhbSZndDs8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisKKyAgICAgICAgICAgICAgICAgICAgSmVyc2V5IHdpbGwgYXV0b21hdGljYWxseSBkaXNjb3ZlciB0aGUgcmVzb3VyY2VzIGFuZCBwcm92aWRlcnMgaW4gdGhlIHNlbGVjdGVkIHBhY2thZ2VzLgorICAgICAgICAgICAgICAgICAgICBZb3UgY2FuIGFsc28gZGVjaWRlIHdoZXRoZXIgSmVyc2V5IHNob3VsZCByZWN1cnNpdmVseSBzY2FuIGFsc28gc3ViLXBhY2thZ2VzIGJ5IHNldHRpbmcgdGhlCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmplcnNleS5jb25maWcuc2VydmVyLnByb3ZpZGVyLnNjYW5uaW5nLnJlY3Vyc2l2ZTwvbGl0ZXJhbD4gcHJvcGVydHkuCisgICAgICAgICAgICAgICAgICAgIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDxsaXRlcmFsPnRydWU8L2xpdGVyYWw+LCBpLmUuIHRoZSByZWN1cnNpdmUgc2Nhbm5pbmcgb2Ygc3ViLXBhY2thZ2VzIGlzIGVuYWJsZWQuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgICAgICA8c2VjdGlvbiB4bWw6aWQ9ImRlcGxveW1lbnQuc2VydmV0LjIuY2xhc3NlcyI+CisgICAgICAgICAgICAgICAgPHRpdGxlPlNlbGVjdGluZyBjb25jcmV0ZSByZXNvdXJjZSBhbmQgcHJvdmlkZXIgY2xhc3NlczwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgV2hpbGUgdGhlIGFib3ZlLW1lbnRpb25lZCBwYWNrYWdlIHNjYW5uaW5nIGlzIHVzZWZ1bCBlc3AuIGZvciBkZXZlbG9wbWVudCBhbmQgdGVzdGluZywgeW91IG1heSB3YW50IHRvCisgICAgICAgICAgICAgICAgICAgIGhhdmUgYSBsaXR0bGUgYml0IG1vcmUgY29udHJvbCB3aGVuIGl0IGNvbWVzIHRvIHByb2R1Y3Rpb24gZGVwbG95bWVudCBpbiB0ZXJtcyBvZiBiZWluZyBhYmxlIHRvIGVudW1lcmF0ZQorICAgICAgICAgICAgICAgICAgICBzcGVjaWZpYyByZXNvdXJjZSBhbmQgcHJvdmlkZXIgY2xhc3Nlcy4gSW4gSmVyc2V5IGl0IGlzIHBvc3NpYmxlIHRvIGFjaGlldmUgdGhpcyBldmVuIHdpdGhvdXQgYSBuZWVkIHRvCisgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudCBhIGN1c3RvbSAmbGl0LmpheHJzLmNvcmUuQXBwbGljYXRpb247IHN1YmNsYXNzLiBUaGUgc3BlY2lmaWMgcmVzb3VyY2UgYW5kIHByb3ZpZGVyCisgICAgICAgICAgICAgICAgICAgIGZ1bGx5LXF1YWxpZmllZCBjbGFzcyBuYW1lcyBjYW4gYmUgcHJvdmlkZWQgaW4gYSBjb21tYS1zZXBhcmF0ZWQgdmFsdWUgb2YKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+amVyc2V5LmNvbmZpZy5zZXJ2ZXIucHJvdmlkZXIuY2xhc3NuYW1lczwvbGl0ZXJhbD4gaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgPHRpdGxlPkNvbmZpZ3VyaW5nIEplcnNleSBjb250YWluZXIgU2VydmxldCBvciBGaWx0ZXIgdG8gdXNlIGEgbGlzdCBvZiBjbGFzc2VzPC90aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJ4bWwiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj4mbHQ7aW5pdC1wYXJhbSZndDsKKyAgICAmbHQ7cGFyYW0tbmFtZSZndDtqZXJzZXkuY29uZmlnLnNlcnZlci5wcm92aWRlci5jbGFzc25hbWVzJmx0Oy9wYXJhbS1uYW1lJmd0OworICAgICZsdDtwYXJhbS12YWx1ZSZndDsKKyAgICAgICAgb3JnLmZvby5teXJlc291cmNlcy5NeURvZ1Jlc291cmNlLAorICAgICAgICBvcmcuYmFyLm90aGVycmVzb3VyY2VzLk15Q2F0UmVzb3VyY2UKKyAgICAmbHQ7L3BhcmFtLXZhbHVlJmd0OworJmx0Oy9pbml0LXBhcmFtJmd0OzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgQWxsIG9mIHRoZSB0ZWNobmlxdWVzIHRoYXQgaGF2ZSBiZWVuIGRlc2NyaWJlZCBpbiB0aGlzIHNlY3Rpb24gYWxzbyBhcHBseSB0byBTZXJ2bGV0IGNvbnRhaW5lcnMgdGhhdAorICAgICAgICAgICAgICAgICAgICBzdXBwb3J0IFNlcnZsZXQgQVBJIDMuMCBhbmQgbGF0ZXIgc3BlY2lmaWNhdGlvbi4gTmV3ZXIgU2VydmxldCBzcGVjaWZpY2F0aW9ucyBvbmx5IGdpdmUgeW91IGFkZGl0aW9uYWwKKyAgICAgICAgICAgICAgICAgICAgZmVhdHVyZXMsIGRlcGxveW1lbnQgb3B0aW9ucyBhbmQgbW9yZSBmbGV4aWJpbGl0eS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L25vdGU+CisgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICA8c2VjdGlvbiB4bWw6aWQ9ImRlcGxveW1lbnQuc2VydmxldC4zIj4KKyAgICAgICAgICAgIDx0aXRsZT5TZXJ2bGV0IDMueCBDb250YWluZXI8L3RpdGxlPgorCisgICAgICAgICAgICA8c2VjdGlvbiB4bWw6aWQ9ImRlcGxveW1lbnQuc2VydmxldC4zLm5vLmRlc2NyaXB0b3IiPgorICAgICAgICAgICAgICAgIDx0aXRsZT5EZXNjcmlwdG9yLWxlc3MgZGVwbG95bWVudDwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFRoZXJlIGFyZSBtdWx0aXBsZSBkZXBsb3ltZW50IG9wdGlvbnMgaW4gdGhlIFNlcnZsZXQgMy4wIGNvbnRhaW5lciBmb3IgYSBKQVgtUlMgYXBwbGljYXRpb24gZGVmaW5lZAorICAgICAgICAgICAgICAgICAgICBieSBpbXBsZW1lbnRpbmcgYSBjdXN0b20gJmpheHJzLmNvcmUuQXBwbGljYXRpb247IHN1YmNsYXNzLiBGb3Igc2ltcGxlIGRlcGxveW1lbnRzLCBubworICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD53ZWIueG1sPC9saXRlcmFsPiBpcyBuZWNlc3NhcnkgYXQgYWxsLiBJbnN0ZWFkLCBhbiAmamF4cnMuQXBwbGljYXRpb25QYXRoOyBhbm5vdGF0aW9uIGNhbiBiZSB1c2VkCisgICAgICAgICAgICAgICAgICAgIHRvIGFubm90YXRlIHRoZSBjdXN0b20gJmpheHJzLmNvcmUuQXBwbGljYXRpb247IHN1YmNsYXNzIGFuZCBkZWZpbmUgdGhlIGJhc2UgYXBwbGljYXRpb24gVVJJIGZvciBhbGwKKyAgICAgICAgICAgICAgICAgICAgSkFYLVJTIHJlc291cmNlcyBjb25maWd1cmVkIGluIHRoZSBhcHBsaWNhdGlvbjoKKworICAgICAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5EZXBsb3ltZW50IG9mIGEgSkFYLVJTIGFwcGxpY2F0aW9uIHVzaW5nICZsaXQuamF4cnMuQXBwbGljYXRpb25QYXRoOyB3aXRoIFNlcnZsZXQgMy4wPC90aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPkBBcHBsaWNhdGlvblBhdGgoInJlc291cmNlcyIpCitwdWJsaWMgY2xhc3MgTXlBcHBsaWNhdGlvbiBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKyAgICBwdWJsaWMgTXlBcHBsaWNhdGlvbigpIHsKKyAgICAgICAgcGFja2FnZXMoIm9yZy5mb28ucmVzdDtvcmcuYmFyLnJlc3QiKTsKKyAgICB9Cit9PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoZXJlIGFyZSBtYW55IG90aGVyIGNvbnZlbmllbmNlIG1ldGhvZHMgaW4gdGhlICZsaXQuamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsgdGhhdCBjYW4gYmUgdXNlZAorICAgICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIGNvbnN0cnVjdG9yIG9mIHlvdXIgY3VzdG9tIHN1YmNsYXNzIHRvIGNvbmZpZ3VyZSB5b3VyIEpBWC1SUyBhcHBsaWNhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlZSAmamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsgQVBJIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgZGV0YWlscy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbm90ZT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBJbiBjYXNlIHlvdSBhcmUgbm90IHByb3ZpZGluZyA8bGl0ZXJhbD53ZWIueG1sPC9saXRlcmFsPiBkZXBsb3ltZW50IGRlc2NyaXB0b3IgZm9yIHlvdXIgbWF2ZW4tYmFzZWQgd2ViCisgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHByb2plY3QsIHlvdSBuZWVkIHRvIGNvbmZpZ3VyZSB5b3VyIDxsaXRlcmFsPm1hdmVuLXdhci1wbHVnaW48L2xpdGVyYWw+IHRvIGlnbm9yZSB0aGUgbWlzc2luZworICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD53ZWIueG1sPC9saXRlcmFsPiBmaWxlIGJ5IHNldHRpbmcKKyAgICAgICAgICAgICAgICAgICAgPGxpbmsgeGxpbms6aHJlZj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi13YXItcGx1Z2luL3dhci1tb2pvLmh0bWwjZmFpbE9uTWlzc2luZ1dlYlhtbCI+ZmFpbE9uTWlzc2luZ1dlYlhtbDwvbGluaz4KKyAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSB0byAmbGl0LmZhbHNlOyBpbiB5b3VyIHByb2plY3QgPGxpdGVyYWw+cG9tLnhtbDwvbGl0ZXJhbD4gZmlsZToKKworICAgICAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5Db25maWd1cmF0aW9uIG9mIG1hdmVuLXdhci1wbHVnaW4gdG8gaWdub3JlIG1pc3NpbmcgPGxpdGVyYWw+d2ViLnhtbDwvbGl0ZXJhbD48L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJ4bWwiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj4mbHQ7cGx1Z2lucyZndDsKKyAgICAuLi4KKyAgICAmbHQ7cGx1Z2luJmd0OworICAgICAgICAmbHQ7Z3JvdXBJZCZndDtvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMmbHQ7L2dyb3VwSWQmZ3Q7CisgICAgICAgICZsdDthcnRpZmFjdElkJmd0O21hdmVuLXdhci1wbHVnaW4mbHQ7L2FydGlmYWN0SWQmZ3Q7CisgICAgICAgICZsdDt2ZXJzaW9uJmd0OzIuMyZsdDsvdmVyc2lvbiZndDsKKyAgICAgICAgJmx0O2NvbmZpZ3VyYXRpb24mZ3Q7CisgICAgICAgICAgICAmbHQ7ZmFpbE9uTWlzc2luZ1dlYlhtbCZndDtmYWxzZSZsdDsvZmFpbE9uTWlzc2luZ1dlYlhtbCZndDsKKyAgICAgICAgJmx0Oy9jb25maWd1cmF0aW9uJmd0OworICAgICZsdDsvcGx1Z2luJmd0OworICAgIC4uLgorJmx0Oy9wbHVnaW5zJmd0OzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgICAgICA8c2VjdGlvbiB4bWw6aWQ9ImRlcGxveW1lbnQuc2VydmxldC4zLmRlc2NyaXB0b3IiPgorICAgICAgICAgICAgICAgIDx0aXRsZT5EZXBsb3ltZW50IHVzaW5nIDxsaXRlcmFsPndlYi54bWw8L2xpdGVyYWw+IGRlc2NyaXB0b3I8L3RpdGxlPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEFub3RoZXIgU2VydmxldCAzLnggY29udGFpbmVyIGRlcGxveW1lbnQgbW9kZWwgaXMgdG8gZGVjbGFyZSB0aGUgSkFYLVJTIGFwcGxpY2F0aW9uIGRldGFpbHMgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPndlYi54bWw8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICBUaGlzIGlzIHR5cGljYWxseSBzdWl0YWJsZSBmb3IgbW9yZSBjb21wbGV4IGRlcGxveW1lbnRzLCBlLmcuIHdoZW4gc2VjdXJpdHkgbW9kZWwgbmVlZHMgdG8gYmUKKyAgICAgICAgICAgICAgICAgICAgcHJvcGVybHkgZGVmaW5lZCBvciB3aGVuIGFkZGl0aW9uYWwgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycyBoYXZlIHRvIGJlIHBhc3NlZCB0byBKZXJzZXkgcnVudGltZS4KKyAgICAgICAgICAgICAgICAgICAgSkFYLVJTIDEuMSBhbmQgbGF0ZXIgc3BlY2lmaWVzIHRoYXQgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgY2xhc3MgdGhhdCBpbXBsZW1lbnRzCisgICAgICAgICAgICAgICAgICAgICZqYXhycy5jb3JlLkFwcGxpY2F0aW9uOyBtYXkgYmUgdXNlZCBpbiB0aGUgZGVmaW5pdGlvbiBvZiBhIDxsaXRlcmFsPiZsdDtzZXJ2bGV0LW5hbWUmZ3Q7PC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICBlbGVtZW50IGFzIHBhcnQgb2YgeW91ciBhcHBsaWNhdGlvbidzIDxsaXRlcmFsPndlYi54bWw8L2xpdGVyYWw+IGRlcGxveW1lbnQgZGVzY3JpcHRvci4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgRm9sbG93aW5nIGV4YW1wbGUgaWxsdXN0cmF0ZXMgdGhpcyBhcHByb2FjaDoKKworICAgICAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5EZXBsb3ltZW50IG9mIGEgSkFYLVJTIGFwcGxpY2F0aW9uIHVzaW5nIDxsaXRlcmFsPndlYi54bWw8L2xpdGVyYWw+IHdpdGggU2VydmxldCAzLjAKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9InhtbCIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPiZsdDt3ZWItYXBwJmd0OworICAgICZsdDtzZXJ2bGV0Jmd0OworICAgICAgICAmbHQ7c2VydmxldC1uYW1lJmd0O29yZy5mb28ucmVzdC5NeUFwcGxpY2F0aW9uJmx0Oy9zZXJ2bGV0LW5hbWUmZ3Q7CisgICAgJmx0Oy9zZXJ2bGV0Jmd0OworICAgIC4uLgorICAgICZsdDtzZXJ2bGV0LW1hcHBpbmcmZ3Q7CisgICAgICAgICZsdDtzZXJ2bGV0LW5hbWUmZ3Q7b3JnLmZvby5yZXN0Lk15QXBwbGljYXRpb24mbHQ7L3NlcnZsZXQtbmFtZSZndDsKKyAgICAgICAgJmx0O3VybC1wYXR0ZXJuJmd0Oy9yZXNvdXJjZXMmbHQ7L3VybC1wYXR0ZXJuJmd0OworICAgICZsdDsvc2VydmxldC1tYXBwaW5nJmd0OworICAgIC4uLgorJmx0Oy93ZWItYXBwJmd0OzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKworICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgdGhlIDxsaXRlcmFsPiZsdDtzZXJ2bGV0LWNsYXNzJmd0OzwvbGl0ZXJhbD4gZWxlbWVudCBpcyBvbWl0dGVkIGZyb20gdGhlIFNlcnZsZXQgZGVjbGFyYXRpb24uCisgICAgICAgICAgICAgICAgICAgIFRoaXMgaXMgYSBjb3JyZWN0IGRlY2xhcmF0aW9uIHV0aWxpemluZyB0aGUgU2VydmxldCAzLjAgZXh0ZW5zaW9uIG1lY2hhbmlzbSBkZXNjcmliZWQgaW4gZGV0YWlsIGluIHRoZQorICAgICAgICAgICAgICAgICAgICA8eHJlZiBsaW5rZW5kPSJkZXBsb3ltZW50LnNlcnZsZXQuMy5wbHVnZ2FiaWxpdHkiLz4gc2VjdGlvbi4gQWxzbyBub3RlIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+Jmx0O3NlcnZsZXQtbWFwcGluZyZndDs8L2xpdGVyYWw+IGlzIHVzZWQgaW4gdGhlIGV4YW1wbGUgdG8gZGVmaW5lIHRoZSBiYXNlIHJlc291cmNlIFVSSS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8dGlwPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIFdoZW4gcnVubmluZyBpbiBhIFNlcnZsZXQgMi54IGl0IHdvdWxkIGluc3RlYWQgYmUgbmVjZXNzYXJ5IHRvIGRlY2xhcmUgdGhlIEplcnNleSBjb250YWluZXIgU2VydmxldAorICAgICAgICAgICAgICAgICAgICAgICAgb3IgRmlsdGVyIGFuZCBwYXNzIHRoZSAmbGl0LmpheHJzLmNvcmUuQXBwbGljYXRpb247IGltcGxlbWVudGF0aW9uIGNsYXNzIG5hbWUgYXMgb25lIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+aW5pdC1wYXJhbTwvbGl0ZXJhbD4gZW50cmllcywgYXMgZGVzY3JpYmVkIGluIDx4cmVmIGxpbmtlbmQ9ImRlcGxveW1lbnQuc2VydmxldC4yIi8+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC90aXA+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgICAgIDxzZWN0aW9uIHhtbDppZD0iZGVwbG95bWVudC5zZXJ2bGV0LjMucGx1Z2dhYmlsaXR5Ij4KKyAgICAgICAgICAgICAgICA8dGl0bGU+U2VydmxldCBQbHVnZ2FiaWxpdHkgTWVjaGFuaXNtPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgU2VydmxldCBmcmFtZXdvcmsgcGx1Z2dhYmlsaXR5IG1lY2hhbmlzbSBpcyBhIGZlYXR1cmUgaW50cm9kdWNlZCB3aXRoIFNlcnZsZXQgMy4wIHNwZWNpZmljYXRpb24uIEl0CisgICAgICAgICAgICAgICAgICAgIHNpbXBsaWZpZXMgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdmFyaW91cyBmcmFtZXdvcmtzIGJ1aWx0IG9uIHRvcCBvZiBTZXJ2bGV0cy4gSW5zdGVhZCBvZiBoYXZpbmcgb25lCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPndlYi54bWw8L2xpdGVyYWw+IGZpbGUgd29ya2luZyBhcyBhIGNlbnRyYWwgcG9pbnQgZm9yIGFsbCB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zLCBpdCBpcyBwb3NzaWJsZQorICAgICAgICAgICAgICAgICAgICB0byBtb2R1bGFyaXplIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgYnkgdXNpbmcgdGhlIGNvbmNlcHQgb2Ygc28tY2FsbGVkIHdlYiBmcmFnbWVudHMgLSBzZXZlcmFsIHNwZWNpZmljCisgICAgICAgICAgICAgICAgICAgIGFuZCBmb2N1c2VkIDxsaXRlcmFsPndlYi54bWw8L2xpdGVyYWw+IGZpbGVzLiBBIHNldCBvZiB3ZWIgZnJhZ21lbnRzIGJhc2ljYWxseSBidWlsZHMgdXAgdGhlIGZpbmFsCisgICAgICAgICAgICAgICAgICAgIGRlcGxveW1lbnQgZGVzY3JpcHRvci4gVGhpcyBtZWNoYW5pc20gYWxzbyBwcm92aWRlcyBTUEkgaG9va3MgdGhhdCBlbmFibGUgd2ViIGZyYW1ld29ya3MgdG8gcmVnaXN0ZXIKKyAgICAgICAgICAgICAgICAgICAgdGhlbXNlbHZlcyBpbiB0aGUgU2VydmxldCBjb250YWluZXIgb3IgY3VzdG9taXplIHRoZSBTZXJ2bGV0IGNvbnRhaW5lciBkZXBsb3ltZW50IHByb2Nlc3MgaW4gc29tZSBvdGhlciB3YXkuCisgICAgICAgICAgICAgICAgICAgIFRoaXMgc2VjdGlvbiBkZXNjcmliZXMgaG93IEpBWC1SUyBhbmQgSmVyc2V5IGxldmVyYWdlIHRoZSBTZXJ2bGV0IHBsdWdnYWJpbGl0eSBtZWNoYW5pc20uCisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPHNlY3Rpb24geG1sOmlkPSJkZXBsb3ltZW50LnNlcnZsZXQuMy5wbHVnZ2FiaWxpdHkubm9hcHAiPgorICAgICAgICAgICAgICAgICAgICA8dGl0bGU+SkFYLVJTIGFwcGxpY2F0aW9uIHdpdGhvdXQgYW4gJmxpdC5qYXhycy5jb3JlLkFwcGxpY2F0aW9uOyBzdWJjbGFzczwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICAgICAgSWYgbm8gJmxpdC5qYXhycy5jb3JlLkFwcGxpY2F0aW9uOyAob3IgJmxpdC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOykgc3ViY2xhc3MgaXMgcHJlc2VudCwKKyAgICAgICAgICAgICAgICAgICAgSmVyc2V5IHdpbGwgZHluYW1pY2FsbHkgYWRkIGEgSmVyc2V5IGNvbnRhaW5lciBTZXJ2bGV0IGFuZCBzZXQgaXRzIG5hbWUgdG8KKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+amF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjwvbGl0ZXJhbD4uIFRoZSB3ZWIgYXBwbGljYXRpb24gcGF0aCB3aWxsIGJlIHNjYW5uZWQgYW5kIGFsbCB0aGUKKyAgICAgICAgICAgICAgICAgICAgcm9vdCByZXNvdXJjZSBjbGFzc2VzICh0aGUgY2xhc3NlcyBhbm5vdGF0ZWQgd2l0aCAmamF4cnMuUGF0aDsgYW5ub3RhdGlvbikgYXMgd2VsbCBhcyBhbnkgcHJvdmlkZXJzIHRoYXQgYXJlCisgICAgICAgICAgICAgICAgICAgIGFubm90YXRlZCB3aXRoICZqYXhycy5leHQuUHJvdmlkZXI7IGFubm90YXRpb24gcGFja2FnZWQgd2l0aCB0aGUgYXBwbGljYXRpb24gd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlZ2lzdGVyZWQKKyAgICAgICAgICAgICAgICAgICAgaW4gdGhlIEpBWC1SUyBhcHBsaWNhdGlvbi4gVGhlIHdlYiBhcHBsaWNhdGlvbiBoYXMgdG8gYmUgcGFja2FnZWQgd2l0aCBhIGRlcGxveW1lbnQgZGVzY3JpcHRvciBzcGVjaWZ5aW5nCisgICAgICAgICAgICAgICAgICAgIGF0IGxlYXN0IHRoZSBtYXBwaW5nIGZvciB0aGUgYWRkZWQgPGxpdGVyYWw+amF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjwvbGl0ZXJhbD4gU2VydmxldDoKKworICAgICAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD53ZWIueG1sPC9saXRlcmFsPiBvZiBhIEpBWC1SUyBhcHBsaWNhdGlvbiB3aXRob3V0IGFuICZsaXQuamF4cnMuY29yZS5BcHBsaWNhdGlvbjsgc3ViY2xhc3MKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9InhtbCIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPiZsdDt3ZWItYXBwIHZlcnNpb249IjMuMCIKKyAgICB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgorICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiJmd0OworCisgICAgJmx0OyEtLSBTZXJ2bGV0IGRlY2xhcmF0aW9uIGNhbiBiZSBvbWl0dGVkIGluIHdoaWNoIGNhc2UKKyAgICAgICAgIGl0IHdvdWxkIGJlIGF1dG9tYXRpY2FsbHkgYWRkZWQgYnkgSmVyc2V5IC0tJmd0OworICAgICZsdDtzZXJ2bGV0Jmd0OworICAgICAgICAmbHQ7c2VydmxldC1uYW1lJmd0O2phdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb24mbHQ7L3NlcnZsZXQtbmFtZSZndDsKKyAgICAmbHQ7L3NlcnZsZXQmZ3Q7CisKKyAgICAmbHQ7c2VydmxldC1tYXBwaW5nJmd0OworICAgICAgICAmbHQ7c2VydmxldC1uYW1lJmd0O2phdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb24mbHQ7L3NlcnZsZXQtbmFtZSZndDsKKyAgICAgICAgJmx0O3VybC1wYXR0ZXJuJmd0Oy9teXJlc291cmNlcy8qJmx0Oy91cmwtcGF0dGVybiZndDsKKyAgICAmbHQ7L3NlcnZsZXQtbWFwcGluZyZndDsKKyZsdDsvd2ViLWFwcCZndDs8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgICAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgICAgICAgICAgPHNlY3Rpb24geG1sOmlkPSJkZXBsb3ltZW50LnNlcnZsZXQuMy5wbHVnZ2FiaWxpdHkuYXBwIj4KKyAgICAgICAgICAgICAgICAgICAgPHRpdGxlPkpBWC1SUyBhcHBsaWNhdGlvbiB3aXRoIGEgY3VzdG9tICZsaXQuamF4cnMuY29yZS5BcHBsaWNhdGlvbjsgc3ViY2xhc3M8L3RpdGxlPgorCisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgV2hlbiBhIGN1c3RvbSAmbGl0LmpheHJzLmNvcmUuQXBwbGljYXRpb247IHN1YmNsYXNzIGlzIHByb3ZpZGVkLCBpbiBzdWNoIGNhc2UgdGhlIEplcnNleSBzZXJ2ZXIgcnVudGltZQorICAgICAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3IgZGVwZW5kcyBvZCB3aGV0aGVyIG9yIG5vdCB0aGVyZSBpcyBhIFNlcnZsZXQgZGVmaW5lZCB0byBoYW5kbGUgdGhlIGFwcGxpY2F0aW9uIHN1YmNsYXNzLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGUgPGxpdGVyYWw+d2ViLnhtbDwvbGl0ZXJhbD4gY29udGFpbnMgYSBTZXJ2bGV0IGRlZmluaXRpb24sIHRoYXQgaGFzIGFuIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+amF2YXgud3MucnMuQXBwbGljYXRpb248L2xpdGVyYWw+IHdob3NlIHZhbHVlIGlzIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICZsaXQuamF4cnMuY29yZS5BcHBsaWNhdGlvbjsgc3ViY2xhc3MsIEplcnNleSBkb2VzIG5vdCBwZXJmb3JtIGFueSBhZGRpdGlvbmFsIHN0ZXBzIGluIHN1Y2ggY2FzZS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgSWYgbm8gc3VjaCBTZXJ2bGV0IGlzIGRlZmluZWQgdG8gaGFuZGxlIHRoZSBjdXN0b20gJmxpdC5qYXhycy5jb3JlLkFwcGxpY2F0aW9uOyBzdWJjbGFzcywgSmVyc2V5CisgICAgICAgICAgICAgICAgICAgICAgICBkeW5hbWljYWxseSBhZGRzIGEgU2VydmxldCB3aXRoIGEgZnVsbHkgcXVhbGlmaWVkIG5hbWUgZXF1YWwgdG8gdGhlIG5hbWUgb2YgdGhlIHByb3ZpZGVkCisgICAgICAgICAgICAgICAgICAgICAgICAmbGl0LmpheHJzLmNvcmUuQXBwbGljYXRpb247IHN1YmNsYXNzLiBUbyBkZWZpbmUgdGhlIG1hcHBpbmcgZm9yIHRoZSBhZGRlZCBTZXJ2bGV0LCB5b3UgY2FuIGVpdGhlcgorICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGUgdGhlIGN1c3RvbSAmbGl0LmpheHJzLmNvcmUuQXBwbGljYXRpb247IHN1YmNsYXNzIHdpdGggYW4gJmpheHJzLkFwcGxpY2F0aW9uUGF0aDsgYW5ub3RhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgKEplcnNleSB3aWxsIHVzZSB0aGUgYW5ub3RhdGlvbiB2YWx1ZSBhcHBlbmRlZCB3aXRoIDxsaXRlcmFsPi8qPC9saXRlcmFsPiB0byBhdXRvbWF0aWNhbGx5IGRlZmluZQorICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1hcHBpbmcgZm9yIHRoZSBTZXJ2bGV0KSwgb3Igc3BlY2lmeSB0aGUgbWFwcGluZyBmb3IgdGhlIFNlcnZsZXQgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD53ZWIueG1sPC9saXRlcmFsPiBkZXNjcmlwdG9yIGRpcmVjdGx5LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUsIGxldCdzIGFzc3VtZSB0aGF0IHRoZSBKQVgtUlMgYXBwbGljYXRpb24gaXMgZGVmaW5lZCB1c2luZyBhIGN1c3RvbQorICAgICAgICAgICAgICAgICAgICAgICAgJmxpdC5qYXhycy5jb3JlLkFwcGxpY2F0aW9uOyBzdWJjbGFzcyBuYW1lZCA8bGl0ZXJhbD5vcmcuZXhhbXBsZS5NeUFwcGxpY2F0aW9uPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoZW4gdGhlIDxsaXRlcmFsPndlYi54bWw8L2xpdGVyYWw+IGZpbGUgY291bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0ieG1sIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+Jmx0O3dlYi1hcHAgdmVyc2lvbj0iMy4wIgorICAgIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCisgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSImZ3Q7CisKKyAgICAmbHQ7IS0tIFNlcnZsZXQgZGVjbGFyYXRpb24gY2FuIGJlIG9taXR0ZWQgaW4gd2hpY2ggY2FzZQorICAgICAgICAgaXQgd291bGQgYmUgYXV0b21hdGljYWxseSBhZGRlZCBieSBKZXJzZXkgLS0mZ3Q7CisgICAgJmx0O3NlcnZsZXQmZ3Q7CisgICAgICAgICZsdDtzZXJ2bGV0LW5hbWUmZ3Q7b3JnLmV4YW1wbGUuTXlBcHBsaWNhdGlvbiZsdDsvc2VydmxldC1uYW1lJmd0OworICAgICZsdDsvc2VydmxldCZndDsKKworICAgICZsdDshLS0gU2VydmxldCBtYXBwaW5nIGNhbiBiZSBvbWl0dGVkIGluIGNhc2UgdGhlIEFwcGxpY2F0aW9uIHN1YmNsYXNzCisgICAgICAgICBpcyBhbm5vdGF0ZWQgd2l0aCBAQXBwbGljYXRpb25QYXRoIGFubm90YXRpb247IGluIHN1Y2ggY2FzZQorICAgICAgICAgdGhlIG1hcHBpbmcgd291bGQgYmUgYXV0b21hdGljYWxseSBhZGRlZCBieSBKZXJzZXkgLS0mZ3Q7CisgICAgJmx0O3NlcnZsZXQtbWFwcGluZyZndDsKKyAgICAgICAgJmx0O3NlcnZsZXQtbmFtZSZndDtvcmcuZXhhbXBsZS5NeUFwcGxpY2F0aW9uJmx0Oy9zZXJ2bGV0LW5hbWUmZ3Q7CisgICAgICAgICZsdDt1cmwtcGF0dGVybiZndDsvbXlyZXNvdXJjZXMvKiZsdDsvdXJsLXBhdHRlcm4mZ3Q7CisgICAgJmx0Oy9zZXJ2bGV0LW1hcHBpbmcmZ3Q7CismbHQ7L3dlYi1hcHAmZ3Q7PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgeW91ciBjdXN0b20gJmxpdC5qYXhycy5jb3JlLkFwcGxpY2F0aW9uOyBzdWJjbGFzcyBpcyBwYWNrYWdlZCBpbiB0aGUgPGxpdGVyYWw+d2FyPC9saXRlcmFsPiwgaXQgZGVmaW5lcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHJlc291cmNlcyB3aWxsIGJlIHRha2VuIGludG8gYWNjb3VudC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiBib3RoIDxsaXRlcmFsPmdldENsYXNzZXMoKTwvbGl0ZXJhbD4gYW5kIDxsaXRlcmFsPmdldFNpbmdsZXRvbnMoKTwvbGl0ZXJhbD4gbWV0aG9kcyByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuIGVtcHR5IGNvbGxlY3Rpb24sIHRoZW4gQUxMIHRoZSByb290IHJlc291cmNlIGNsYXNzZXMgYW5kIHByb3ZpZGVycyBwYWNrYWdlZCBpbiB0aGUgd2ViCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBhcmNoaXZlIHdpbGwgYmUgdXNlZCwgSmVyc2V5IHdpbGwgYXV0b21hdGljYWxseSBkaXNjb3ZlciB0aGVtIGJ5IHNjYW5uaW5nIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+LndhcjwvbGl0ZXJhbD4gZmlsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSWYgYW55IG9mIHRoZSB0d28gbWVudGlvbmVkIG1ldGhvZHMgLSA8bGl0ZXJhbD5nZXRDbGFzc2VzKCk8L2xpdGVyYWw+IG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5nZXRTaW5nbGV0b25zKCk8L2xpdGVyYWw+IHJldHVybnMgYSBub24tZW1wdHkgY29sbGVjdGlvbiwgb25seSB0aG9zZSBjbGFzc2VzIGFuZC9vcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xldG9ucyB3aWxsIGJlIHB1Ymxpc2hlZCBpbiB0aGUgSkFYLVJTIGFwcGxpY2F0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L25vdGU+CisKKyAgICAgICAgICAgICAgICAgICAgPHRhYmxlIHBnd2lkZT0iMSIgZnJhbWU9J2FsbCcgeG1sOmlkPSJlbnZpcm9ubWVudC10YWJsZS1wbHVnZ2FiaWxpdHkiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRpdGxlPlNlcnZsZXQgMyBQbHVnZ2FiaWxpdHkgT3ZlcnZpZXc8L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRncm91cCBjb2xzPSc0JyBhbGlnbj0nbGVmdCcgY29sc2VwPScxJyByb3dzZXA9JzEnPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT5Db25kaXRpb248L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PkplcnNleSBhY3Rpb248L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PlNlcnZsZXQgTmFtZTwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+d2ViLnhtbDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT5ObyAmbGl0LmpheHJzLmNvcmUuQXBwbGljYXRpb247IHN1YmNsYXNzPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT5BZGRzIFNlcnZsZXQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPmphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb248L2xpdGVyYWw+PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT5TZXJ2bGV0IG1hcHBpbmcgaXMgcmVxdWlyZWQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4mbGl0LmpheHJzLmNvcmUuQXBwbGljYXRpb247IHN1YmNsYXNzIGhhbmRsZWQgYnkgZXhpc3RpbmcgU2VydmxldDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+Tm8gYWN0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT5BbHJlYWR5IGRlZmluZWQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5Pk5vdCByZXF1aXJlZDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PiZsaXQuamF4cnMuY29yZS5BcHBsaWNhdGlvbjsgc3ViY2xhc3MgTk9UIGhhbmRsZWQgYnkgZXhpc3RpbmcgU2VydmxldDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+QWRkcyBTZXJ2bGV0PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT5GUU4gb2YgdGhlICZsaXQuamF4cnMuY29yZS5BcHBsaWNhdGlvbjsgc3ViY2xhc3M8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG5vICZsaXQuamF4cnMuQXBwbGljYXRpb25QYXRoOyBvbiB0aGUgJmxpdC5qYXhycy5jb3JlLkFwcGxpY2F0aW9uOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmNsYXNzLCB0aGVuIFNlcnZsZXQgbWFwcGluZyBpcyByZXF1aXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgIDxzZWN0aW9uIHhtbDppZD0iZGVwbG95bWVudC5zZXJ2bGV0LmNvbnRhaW5lcnMiPgorICAgICAgICAgICAgPHRpdGxlPkplcnNleSBTZXJ2bGV0IGNvbnRhaW5lciBtb2R1bGVzPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgSmVyc2V5IHVzZXMgaXRzIG93biA8bGl0ZXJhbD4mamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjs8L2xpdGVyYWw+IGltcGxlbWVudGF0aW9uIG9mIFNlcnZsZXQgYW5kCisgICAgICAgICAgICAgICAgU2VydmxldCBGaWx0ZXIgQVBJIHRvIGludGVncmF0ZSB3aXRoIFNlcnZsZXQgY29udGFpbmVycy4gQXMgYW55IEpBWC1SUyBydW50aW1lLCBKZXJzZXkgcHJvdmlkZXMgc3VwcG9ydAorICAgICAgICAgICAgICAgIGZvciBTZXJ2bGV0IGNvbnRhaW5lcnMgdGhhdCBzdXBwb3J0IFNlcnZsZXQgc3BlY2lmaWNhdGlvbiB2ZXJzaW9uIDIuNSBhbmQgaGlnaGVyLiBUbyBzdXBwb3J0IEpBWC1SUyAyLjAKKyAgICAgICAgICAgICAgICBhc3luY2hyb25vdXMgcmVzb3VyY2VzIG9uIHRvcCBvZiBhIFNlcnZsZXQgY29udGFpbmVyLCBzdXBwb3J0IGZvciBTZXJ2bGV0IHNwZWNpZmljYXRpb24gdmVyc2lvbiAzLjAgb3IgaGlnaGVyCisgICAgICAgICAgICAgICAgaXMgcmVxdWlyZWQuCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFdoZW4gZGVwbG95aW5nIHRvIGEgU2VydmxldCBjb250YWluZXIsIEplcnNleSBhcHBsaWNhdGlvbiBpcyB0eXBpY2FsbHkgcGFja2FnZWQgYXMgYSA8bGl0ZXJhbD4ud2FyPC9saXRlcmFsPiBmaWxlLgorICAgICAgICAgICAgICAgIEFzIHdpdGggYW55IG90aGVyIFNlcnZsZXQgYXBwbGljYXRpb24sIEpBWC1SUyBhcHBsaWNhdGlvbiBjbGFzc2VzIGFyZSBwYWNrYWdlZCBpbgorICAgICAgICAgICAgICAgIDxsaXRlcmFsPldFQi1JTkYvY2xhc3NlczwvbGl0ZXJhbD4gb3IgPGxpdGVyYWw+V0VCLUlORi9saWI8L2xpdGVyYWw+IGFuZCByZXF1aXJlZCBhcHBsaWNhdGlvbiBsaWJyYXJpZXMgYXJlCisgICAgICAgICAgICAgICAgbG9jYXRlZCBpbiA8bGl0ZXJhbD5XRUItSU5GL2xpYjwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgRm9yIG1vcmUgZGV0YWlscywgcGxlYXNlIHJlZmVyIHRvIHRoZSBTZXJ2bGV0IFNwZWNpZmljYXRpb24gKCZqc3IzMTUubGluazspLgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBKZXJzZXkgcHJvdmlkZXMgdHdvIFNlcnZsZXQgbW9kdWxlcy4gVGhlIGZpcnN0IG1vZHVsZSBpcyB0aGUgSmVyc2V5IGNvcmUgU2VydmxldCBtb2R1bGUgdGhhdCBwcm92aWRlcworICAgICAgICAgICAgICAgIHRoZSBjb3JlIFNlcnZsZXQgaW50ZWdyYXRpb24gc3VwcG9ydCBhbmQgaXMgcmVxdWlyZWQgaW4gYW55IFNlcnZsZXQgMi41IG9yIGhpZ2hlciBjb250YWluZXI6CisKKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9InhtbCI+Jmx0O2RlcGVuZGVuY3kmZ3Q7CisgICAgJmx0O2dyb3VwSWQmZ3Q7b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVycyZsdDsvZ3JvdXBJZCZndDsKKyAgICAmbHQ7YXJ0aWZhY3RJZCZndDtqZXJzZXktY29udGFpbmVyLXNlcnZsZXQtY29yZSZsdDsvYXJ0aWZhY3RJZCZndDsKKyZsdDsvZGVwZW5kZW5jeSZndDs8L3Byb2dyYW1saXN0aW5nPgorCisgICAgICAgICAgICAgICAgVG8gc3VwcG9ydCBhZGRpdGlvbmFsIFNlcnZsZXQgMy54IGRlcGxveW1lbnQgbW9kZXMgYW5kIGFzeW5jaHJvbm91cyBKQVgtUlMgcmVzb3VyY2UgcHJvZ3JhbW1pbmcgbW9kZWwsCisgICAgICAgICAgICAgICAgYW4gYWRkaXRpb25hbCBKZXJzZXkgbW9kdWxlIGlzIHJlcXVpcmVkOgorCisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJ4bWwiPiZsdDtkZXBlbmRlbmN5Jmd0OworICAgICZsdDtncm91cElkJmd0O29yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnMmbHQ7L2dyb3VwSWQmZ3Q7CisgICAgJmx0O2FydGlmYWN0SWQmZ3Q7amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0Jmx0Oy9hcnRpZmFjdElkJmd0OworJmx0Oy9kZXBlbmRlbmN5Jmd0OzwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgICAgICAgICAgICAgICBUaGUgPGxpdGVyYWw+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0PC9saXRlcmFsPiBtb2R1bGUgZGVwZW5kcyBvbgorICAgICAgICAgICAgICAgIDxsaXRlcmFsPmplcnNleS1jb250YWluZXItc2VydmxldC1jb3JlPC9saXRlcmFsPiBtb2R1bGUsIHRoZXJlZm9yZSB3aGVuIGl0IGlzIHVzZWQsIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG8KKyAgICAgICAgICAgICAgICBleHBsaWNpdGx5IGRlY2xhcmUgdGhlIDxsaXRlcmFsPmplcnNleS1jb250YWluZXItc2VydmxldC1jb3JlPC9saXRlcmFsPiBkZXBlbmRlbmN5LgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBOb3RlIHRoYXQgaW4gc2ltcGxlIGNhc2VzLCB5b3UgZG9uJ3QgbmVlZCB0byBwcm92aWRlIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3IgKDxsaXRlcmFsPndlYi54bWw8L2xpdGVyYWw+KQorICAgICAgICAgICAgICAgIGFuZCBjYW4gdXNlIHRoZSA8bGl0ZXJhbD5AQXBwbGljYXRpb25QYXRoPC9saXRlcmFsPiBhbm5vdGF0aW9uLCBhcyBkZXNjcmliZWQgaW4KKyAgICAgICAgICAgICAgICA8eHJlZiBsaW5rZW5kPSJkZXBsb3ltZW50LnNlcnZsZXQuMy5wbHVnZ2FiaWxpdHkubm9hcHAiLz4gc2VjdGlvbi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIHhtbDppZD0iZGVwbG95bWVudC5qYXZhZWUiPgorICAgICAgICA8dGl0bGU+SmF2YSBFRSBQbGF0Zm9ybTwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhpcyBzZWN0aW9uIGRlc2NyaWJlcywgaG93IHlvdSBjYW4gcHVibGlzaCBKZXJzZXkgSkFYLVJTIHJlc291cmNlcyBhcyB2YXJpb3VzIEphdmEgRUUgcGxhdGZvcm0gZWxlbWVudHMuCisgICAgICAgICAgICBKQVgtUlMgYW5kIEplcnNleSBnaXZlIHlvdSB3aWRlIGNob2ljZSBvZiBwb3NzaWJpbGl0aWVzIGFuZCBpdCBpcyB1cCB0byB5b3VyIHRhc3RlIChhbmQgZGVzaWduIG9mIHlvdXIgYXBwbGljYXRpb24pLAorICAgICAgICAgICAgd2hhdCBKYXZhIEVFIHRlY2hub2xvZ3kgeW91IGRlY2lkZSB0byB1c2UgZm9yIHRoZSBtYW5hZ2VtZW50IG9mIHlvdXIgcmVzb3VyY2VzLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHNlY3Rpb24geG1sOmlkPSJkZXBsb3ltZW50LmphdmFlZS5tYW5hZ2VkIj4KKyAgICAgICAgICAgIDx0aXRsZT5NYW5hZ2VkIEJlYW5zPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgSmVyc2V5IHN1cHBvcnRzIHRoZSB1c2Ugb2YgSmF2YSBFRSBNYW5hZ2VkIGJlYW5zIGFzIHJvb3QgcmVzb3VyY2UgY2xhc3NlcywgcHJvdmlkZXJzIGFzIHdlbGwgYXMKKyAgICAgICAgICAgICAgICAmbGl0LmpheHJzLmNvcmUuQXBwbGljYXRpb247IHN1YmNsYXNzZXMuCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEluIHRoZSBjb2RlIGJlbG93LCB5b3UgY2FuIGZpbmQgYW4gZXhhbXBsZSBvZiBhIGJlYW4sIHRoYXQgdXNlcyBhIG1hbmFnZWQtYmVhbiBpbnRlcmNlcHRvciBkZWZpbmVkIGFzIGEgSkFYLVJTCisgICAgICAgICAgICAgICAgYmVhbi4gVGhlIGJlYW4gaXMgdXNlZCB0byBpbnRlcmNlcHQgY2FsbHMgdG8gdGhlIHJlc291cmNlIG1ldGhvZCA8bGl0ZXJhbD5nZXRJdCgpPC9saXRlcmFsPjoKKworICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPkBNYW5hZ2VkQmVhbgorQFBhdGgoIi9tYW5hZ2VkYmVhbiIpCitwdWJsaWMgY2xhc3MgTWFuYWdlZEJlYW5SZXNvdXJjZSB7CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15SW50ZXJjZXB0b3IgeworICAgICAgICBAQXJvdW5kSW52b2tlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgYXJvdW5kKEludm9jYXRpb25Db250ZXh0IGN0eCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImFyb3VuZCgpIGNhbGxlZCIpOworICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIGN0eC5wcm9jZWVkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBASW50ZXJjZXB0b3JzKE15SW50ZXJjZXB0b3IuY2xhc3MpCisgICAgcHVibGljIFN0cmluZyBnZXRJdCgpIHsKKyAgICAgICAgcmV0dXJuICJIaSBtYW5hZ2VkIGJlYW4hIjsKKyAgICB9Cit9PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgIDxzZWN0aW9uIHhtbDppZD0iZGVwbG95bWVudC5qYXZhZWUuY2RpIj4KKyAgICAgICAgICAgIDx0aXRsZT5Db250ZXh0IGFuZCBEZXBlbmRlbmN5IEluamVjdGlvbiAoQ0RJKTwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIENESSBiZWFucyBjYW4gYmUgdXNlZCBhcyBKZXJzZXkgcm9vdCByZXNvdXJjZSBjbGFzc2VzLCBwcm92aWRlcnMgYXMgd2VsbCBhcyAmbGl0LmpheHJzLmNvcmUuQXBwbGljYXRpb247CisgICAgICAgICAgICAgICAgc3ViY2xhc3Nlcy4gUHJvdmlkZXJzIGFuZCAmbGl0LmpheHJzLmNvcmUuQXBwbGljYXRpb247IHN1YmNsYXNzZXMgaGF2ZSB0byBiZSBzaW5nbGV0b24gb3IgYXBwbGljYXRpb24gc2NvcGVkLgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgbmV4dCBleGFtcGxlIHNob3dzIGEgdXNhZ2Ugb2YgYSBDREkgYmVhbiBhcyBhIEpBWC1SUyByb290IHJlc291cmNlIGNsYXNzLiBXZSBhc3N1bWUsIHRoYXQgQ0RJIGhhcyBiZWVuCisgICAgICAgICAgICAgICAgZW5hYmxlZC4gVGhlIGNvZGUgc25pcHBlZCB1c2VzIHRoZSB0eXBlLXNhZmUgZGVwZW5kZW5jeSBpbmplY3Rpb24gcHJvdmlkZWQgaW4gQ0RJIGJ5IHVzaW5nIGFub3RoZXIgYmVhbgorICAgICAgICAgICAgICAgICg8bGl0ZXJhbD5NeU90aGVyQ2RpQmVhbjwvbGl0ZXJhbD4pOgorCisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+QFBhdGgoIi9jZGliZWFuIikKK3B1YmxpYyBjbGFzcyBDZGlCZWFuUmVzb3VyY2UgeworICAgIEBJbmplY3QgTXlPdGhlckNkaUJlYW4gYmVhbjsgIC8vIENESSBpbmplY3RlZCBiZWFuCisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldEl0KCkgeworICAgICAgICByZXR1cm4gYmVhbi5nZXRJdCgpOworICAgIH0KK308L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgIFRoZSBhYm92ZSB3b3JrcyBuYXR1cmFsbHkgaW5zaWRlIGFueSBKYXZhIEVFIGNvbXBsaWFudCBBUyBjb250YWluZXIuIEluIEplcnNleSB2ZXJzaW9uIDIuMTUsIGNvbnRhaW5lciBhZ25vc3RpYyBDREkgc3VwcG9ydCB3YXMgaW50cm9kdWNlZC4KKyAgICAgICAgICAgICAgVGhpcyBmZWF0dXJlIGFsbG93cyB5b3UgdG8gcHVibGlzaCBDREkgYmFzZWQgSkFYLVJTIHJlc291cmNlcyBhbHNvIGluIG90aGVyIGNvbnRhaW5lcnMuIEplcnNleSBjZGktd2ViYXBwIGV4YW1wbGUgc2hvd3MgSmVyc2V5L0NESSBpbnRlZ3JhdGlvbgorICAgICAgICAgICAgICBpbiBHcml6emx5IEhUVFAgYW5kIEFwYWNoZSBUb21jYXQgc2VydmVyLiBEZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiBKZXJzZXkgQ0RJIHN1cHBvcnQgb3V0c2lkZSBvZiBhIGZ1bGx5IGZsZWRnZWQgSmF2YSBFRSBhcHBsaWNhdGlvbiBjb250YWluZXIKKyAgICAgICAgICAgICAgY291bGQgYmUgZm91bmQgaW4gPHhyZWYgbGlua2VuZD0iY2RpLnN1cHBvcnQiLz4uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICA8c2VjdGlvbiB4bWw6aWQ9ImRlcGxveW1lbnQuamF2YWVlLmVqYiI+CisgICAgICAgICAgICA8dGl0bGU+RW50ZXJwcmlzZSBKYXZhIEJlYW5zIChFSkIpPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFN0YXRlbGVzcyBhbmQgU2luZ2xldG9uIFNlc3Npb24gYmVhbnMgY2FuIGJlIHVzZWQgYXMgSmVyc2V5IHJvb3QgcmVzb3VyY2UgY2xhc3NlcywgcHJvdmlkZXJzIGFuZC9vcgorICAgICAgICAgICAgICAgICZsaXQuamF4cnMuY29yZS5BcHBsaWNhdGlvbjsgc3ViY2xhc3Nlcy4gWW91IGNhbiBjaG9vc2UgZnJvbSBhbm5vdGF0aW5nIHRoZSBtZXRob2RzIGluIHRoZSBFSkIncyBsb2NhbAorICAgICAgICAgICAgICAgIGludGVyZmFjZSBvciBkaXJlY3RseSB0aGUgbWV0aG9kIGluIGFuIGludGVyZmFjZS1sZXNzIEVKQiBQT0pPLiBKQVgtUlMgc3BlY2lmaWNhdGlvbnMgcmVxdWlyZXMgaXRzCisgICAgICAgICAgICAgICAgaW1wbGVtZW50b3JzIHRvIGRpc2NvdmVyIEVKQnMgYnkgaW5zcGVjdGluZyBhbm5vdGF0aW9ucyBvbiBjbGFzc2VzIChvciBsb2NhbCBpbnRlcmZhY2VzKSwKKyAgICAgICAgICAgICAgICBidXQgbm90IGluIHRoZSBkZXBsb3ltZW50IGRlc2NyaXB0b3JzICg8bGl0ZXJhbD5lamItamFyLnhtbDwvbGl0ZXJhbD4pLiBBcyBzdWNoLCB0byBrZWVwIHlvdXIgSkFYLVJTCisgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gcG9ydGFibGUsIGRvIG5vdCBvdmVycmlkZSBFSkIgYW5ub3RhdGlvbnMgb3IgcHJvdmlkZSBhbnkgYWRkaXRpb25hbCBtZXRhLWRhdGEgaW4gdGhlIGRlcGxveW1lbnQKKyAgICAgICAgICAgICAgICBkZXNjcmlwdG9yIGZpbGUuCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEZvbGxvd2luZyBleGFtcGxlIGNvbnNpc3RzIG9mIGEgc3RhdGVsZXNzIEVKQiBhbmQgYSBsb2NhbCBpbnRlcmZhY2UgdXNlZCBpbiBKZXJzZXk6CisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+QExvY2FsCitwdWJsaWMgaW50ZXJmYWNlIExvY2FsRWpiIHsKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgIHB1YmxpYyBTdHJpbmcgZ2V0SXQoKTsKK30KKworQFN0YXRlbGVzcworQFBhdGgoIi9zdGF0ZWxlc3MiKQorcHVibGljIGNsYXNzIFN0YXRlbGVzc0VqYlJlc291cmNlIGltcGxlbWVudHMgTG9jYWxFamIgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0SXQoKSB7CisgICAgICAgIHJldHVybiAiSGkgU3RhdGVsZXNzISI7CisgICAgfQorfTwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBQbGVhc2Ugbm90ZSB0aGF0IEplcnNleSBjdXJyZW50bHkgZG9lcyBub3Qgc3VwcG9ydCBkZXBsb3ltZW50IG9mIEpBWC1SUyBhcHBsaWNhdGlvbnMgcGFja2FnZWQgYXMgc3RhbmRhbG9uZQorICAgICAgICAgICAgICAgICAgICBFSkIgbW9kdWxlcyAoZWpiLWphcnMpLiBUbyB1c2UgRUpCcyBhcyBKQVgtUlMgcmVzb3VyY2VzLCB0aGUgRUpCcyBuZWVkIHRvIGJlIHBhY2thZ2VkIGVpdGhlciBkaXJlY3RseSBpbiBhCisgICAgICAgICAgICAgICAgICAgIFdBUiBvciBpbiBhbiBFQVIgdGhhdCBjb250YWlucyBhdCBsZWFzdCBvbmUgV0FSLiBUaGlzIGlzIHRvIGVuc3VyZSBTZXJ2bGV0IGNvbnRhaW5lciBpbml0aWFsaXphdGlvbiB0aGF0IGlzCisgICAgICAgICAgICAgICAgICAgIG5lY2Vzc2FyeSBmb3IgYm9vdHN0cmFwcGluZyBvZiB0aGUgSmVyc2V5IHJ1bnRpbWUuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9ub3RlPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24geG1sOmlkPSJkZXBsb3ltZW50LmFwcHNlcnZlcnMiPgorICAgICAgICAgICAgPHRpdGxlPkphdmEgRUUgU2VydmVyczwvdGl0bGU+CisKKyAgICAgICAgICAgIDxzZWN0aW9uIHhtbDppZD0iZGVwbG95bWVudC5hcHBzZXJ2ZXJzLmdsYXNzZmlzaCI+CisgICAgICAgICAgICAgICAgPHRpdGxlPkdsYXNzRmlzaCBBcHBsaWNhdGlvbiBTZXJ2ZXI8L3RpdGxlPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEFzIGV4cGxhaW5lZCBpbiA8bGluayBsaW5rZW5kPSJzZXJ2bGV0LWFwcC1nbGFzc2Zpc2giPjIuMy4xPC9saW5rPiAsIHlvdSBkb24ndCBuZWVkIHRvIGFkZCBhbnkgc3BlY2lmaWMKKyAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzIG9uIEdsYXNzRmlzaCwgSmVyc2V5IGlzIGFscmVhZHkgcGFja2FnZWQgd2l0aGluIEdsYXNzRmlzaC4gWW91IG9ubHkgbmVlZCB0byBhZGQgdGhlCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPnByb3ZpZGVkPC9saXRlcmFsPi1zY29wZWQgZGVwZW5kZW5jaWVzIHRvIHlvdSBwcm9qZWN0IHRvIGJlIGFibGUgdG8gY29tcGlsZSBpdC4gQXQgcnVudGltZSwKKyAgICAgICAgICAgICAgICAgICAgR2xhc3NGaXNoIHdpbGwgbWFrZSBzdXJlIHRoYXQgeW91ciBhcHBsaWNhdGlvbiBoYXMgYWNjZXNzIHRvIHRoZSBKZXJzZXkgbGlicmFyaWVzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgU3RhcnRlZCB3aXRoIHZlcnNpb24gMi43LCBKZXJzZXkgYWxsb3dzIGluamVjdGluZyBKZXJzZXkgc3BlY2lmaWMgdHlwZXMgaW50byBDREkgZW5hYmxlZCBKQVgtUlMgY29tcG9uZW50cworICAgICAgICAgICAgICAgICAgdXNpbmcgdGhlIDxsaXRlcmFsPkBqYXZheC5pbmplY3QuSW5qZWN0PC9saXRlcmFsPiBhbm5vdGF0aW9uLiBUaGlzIGNvdmVycyBhbHNvIGN1c3RvbSBISzIgYmluZGluZ3MsIHRoYXQgYXJlIGNvbmZpZ3VyZWQKKyAgICAgICAgICAgICAgICAgIGFzIHBhcnQgb2YgSmVyc2V5IGFwcGxpY2F0aW9uLiBUaGUgZmVhdHVyZSBzcGVjaWZpY2FsbHkgZW5hYmxlcyB1c2FnZSBvZiBKZXJzZXkgbW9uaXRvcmluZyBzdGF0aXN0aWNzIChwcm92aWRlZCB0aGF0IHRoZSBzdGF0aXN0aWMgZmVhdHVyZSBpcyB0dXJuZWQgb24pCisgICAgICAgICAgICAgICAgICBpbiBDREkgZW52aXJvbm1lbnQsIHdoZXJlIGluamVjdGlvbiBpcyB0aGUgb25seSBtZWFuIHRvIGdldCBhY2Nlc3MgdG8gbW9uaXRvcmluZyBkYXRhLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgIFNpbmNlIGJvdGggQ0RJIGFuZCBISzIgdXNlIHRoZSBzYW1lIGluamVjdGlvbiBhbm5vdGF0aW9uLCBKZXJzZXkgY291bGQgZ2V0IGNvbmZ1c2VkIGluIGNlcnRhaW4KKyAgICAgICAgICAgICAgICAgIGNhc2VzLCB3aGljaCBjb3VsZCBsZWFkIHRvIG5hc3R5IHJ1bnRpbWUgaXNzdWVzLiBUaGUgZ2V0IGJldHRlciBjb250cm9sIG92ZXIgd2hhdCBKZXJzZXkgZXZhbHVhdGVzCisgICAgICAgICAgICAgICAgICBhcyBISzIgaW5qZWN0aW9uLCBlbmQtdXNlcnMgY291bGQgdGFrZSBhZHZhbnRhZ2Ugb2YgbmV3bHkgaW50cm9kdWNlZCwgJmplcnNleS5leHQuY2RpMXguc3BpLkhrMkN1c3RvbUJvdW5kVHlwZXNQcm92aWRlcjssIFNQSS4KKyAgICAgICAgICAgICAgICAgIFBsZWFzZSBzZWUgdGhlIGxpbmtlZCBqYXZhZG9jIHRvIGdldCBkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiBob3cgdG8gdXNlIHRoZSBTUEkgaW4geW91ciBhcHBsaWNhdGlvbi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgICAgIDxzZWN0aW9uIHhtbDppZD0iZGVwbG95bWVudC5hcHBzZXJ2ZXJzLndlYmxvZ2ljIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+T3JhY2xlIFdlYkxvZ2ljIFNlcnZlcjwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgV2ViTG9naWMgMTIuMS4yIGFuZCBlYXJsaWVyIHN1cHBvcnRzIG9ubHkgSkFYLVJTIDEuMSAoJmpzcjMxMS5saW5rOykgb3V0IG9mIHRoZSBib3ggd2l0aCBKZXJzZXkgMS54CisgICAgICAgICAgICAgICAgICAgIChXZWJMb2dpYyAxMi4xLjIgc2hpcHMgd2l0aCBKZXJzZXkgMS4xMykuIFRvIHVwZGF0ZSB0aGUgdmVyc2lvbiBvZiBKZXJzZXkgMS54IGluIHRoZXNlIGVhcmxpZXIgV2ViTG9naWMKKyAgICAgICAgICAgICAgICAgICAgcmVsZWFzZXMsIHBsZWFzZSByZWFkIHRoZQorICAgICAgICAgICAgICAgICAgICA8bGluayB4bGluazpocmVmPSdodHRwOi8vZG9jcy5vcmFjbGUuY29tL21pZGRsZXdhcmUvMTIxMi93bHMvUkVTVEYvdmVyc2lvbi1yZXN0ZnVsLXNlcnZpY2UuaHRtJz4KKyAgICAgICAgICAgICAgICAgICAgICAgIFVwZGF0aW5nIHRoZSBWZXJzaW9uIG9mIEplcnNleSBKQVgtUlMgUkkKKyAgICAgICAgICAgICAgICAgICAgPC9saW5rPiBjaGFwdGVyIGluIHRoZSBXZWJMb2dpYyBSRVNUZnVsIFdlYiBTZXJ2aWNlcyBEZXZlbG9wbWVudCBHdWlkZS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEluIFdlYkxvZ2ljIDEyLjEuMywgSmVyc2V5IDEuMTggaXMgc2hpcHBlZCBhcyBhIGRlZmF1bHQgSkFYLVJTIDEuMSBwcm92aWRlci4gSW4gdGhpcyB2ZXJzaW9uIG9mIFdlYkxvZ2ljLAorICAgICAgICAgICAgICAgICAgICBKQVgtUlMgMi4wICh1c2luZyBKZXJzZXkgMi41LjEpIGlzIHN1cHBvcnRlZCBhcyBhbiBvcHRpb25hbGx5IGluc3RhbGxhYmxlIHNoYXJlZCBsaWJyYXJ5LiBQbGVhc2UgcmVhZCB0aHJvdWdoCisgICAgICAgICAgICAgICAgICAgIHRoZSA8bGluayB4bGluazpocmVmPSJodHRwOi8vZG9jcy5vcmFjbGUuY29tL21pZGRsZXdhcmUvMTIxMy93bHMvUkVTVEYvdXNlLWplcnNleTIwLXJpLmh0bSNSRVNURjI5MCI+V2ViTG9naWMKKyAgICAgICAgICAgICAgICAgICAgMTIuMS4zIFJFU1RmdWwgV2ViIFNlcnZpY2VzIERldmVsb3BtZW50IEd1aWRlPC9saW5rPiBmb3IgZGV0YWlscyBob3cgdG8gZW5hYmxlIEpBWC1SUyAyLjAgc3VwcG9ydCBvbgorICAgICAgICAgICAgICAgICAgICBXZWJMb2dpYyAxMi4xLjMuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgICAgICA8c2VjdGlvbiB4bWw6aWQ9ImRlcGxveW1lbnQuYXBwc2VydmVycy5vdGhlciI+CisgICAgICAgICAgICAgICAgPHRpdGxlPk90aGVyIEFwcGxpY2F0aW9uIFNlcnZlcnM8L3RpdGxlPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFRoaXJkIHBhcnR5IEphdmEgRUUgYXBwbGljYXRpb24gc2VydmVycyB1c3VhbGx5IHNoaXAgd2l0aCBhIEpBWC1SUyBpbXBsZW1lbnRhdGlvbi4gSWYgeW91IHdhbnQgdG8KKyAgICAgICAgICAgICAgICAgICAgdXNlIEplcnNleSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IEpBWC1SUyBwcm92aWRlciwgeW91IG5lZWQgdG8gYWRkIEplcnNleSBsaWJyYXJpZXMgdG8geW91ciBjbGFzc3BhdGggYW5kCisgICAgICAgICAgICAgICAgICAgIGRpc2FibGUgdGhlIGRlZmF1bHQgSkFYLVJTIHByb3ZpZGVyIGluIHRoZSBjb250YWluZXIuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBJbiBnZW5lcmFsLCBKZXJzZXkgd2lsbCBiZSBkZXBsb3llZCBhcyBhIFNlcnZsZXQgYW5kIHRoZSByZXNvdXJjZXMgY2FuIGJlIGRlcGxveWVkIGluIHZhcmlvdXMgd2F5cywKKyAgICAgICAgICAgICAgICAgICAgYXMgZGVzY3JpYmVkIGluIHRoaXMgc2VjdGlvbi4gSG93ZXZlciwgdGhlIGV4YWN0IHN0ZXBzIHdpbGwgdmFyeSBmcm9tIHZlbmRvciB0byB2ZW5kb3IuPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24geG1sOmlkPSJkZXBsb3ltZW50Lm9zZ2kiPgorICAgICAgICA8dGl0bGU+T1NHaTwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgT1NHaSBzdXBwb3J0IGhhcyBiZWVuIGFkZGVkIHRvIHRoZSBKZXJzZXkgdmVyc2lvbiAxLjIuIFNpbmNlIHRoZW4sIHlvdSBzaG91bGQgYmUgYWJsZSB0byB1dGlsaXplIHN0YW5kYXJkIE9TR2kKKyAgICAgICAgICAgIG1lYW5zIHRvIHJ1biBKZXJzZXkgYmFzZWQgd2ViIGFwcGxpY2F0aW9ucyBpbiBPU0dpIHJ1bnRpbWUgYXMgZGVzY3JpYmVkIGluIHRoZSBPU0dpIFNlcnZpY2UgUGxhdGZvcm0gRW50ZXJwcmlzZQorICAgICAgICAgICAgU3BlY2lmaWNhdGlvbi4gSmVyc2V5IGlzIGN1cnJlbnRseSBjb21wYXRpYmxlIHdpdGggT1NHaSA0LjIuMCwgdGhlIHNwZWNpZmljYXRpb24gY291bGQgYmUgZG93bmxvYWRlZCBmcm9tIHRoZQorICAgICAgICAgICAgPGxpbmsgeGxpbms6aHJlZj0naHR0cDovL3d3dy5vc2dpLm9yZy9Eb3dubG9hZC9SZWxlYXNlNFY0Mic+T1NHaSA0LjIuMCBEb3dubG9hZCBTaXRlPC9saW5rPi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZSB0d28gc3VwcG9ydGVkIHdheXMgb2YgcnVubmluZyBhbiBPU0dpIHdlYiBhcHBsaWNhdGlvbiBhcmU6CisKKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPldBQiAoV2ViIEFwcGxpY2F0aW9uIEJ1bmRsZSk8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT5IVFRQIFNlcnZpY2U8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisKKyAgICAgICAgICAgIFdBQiBpcyBpbiBmYWN0IGp1c3QgYW4gT1NHaWZpZWQgV0FSIGFyY2hpdmUuIEhUVFAgU2VydmljZSBmZWF0dXJlIGFsbG93cyB5b3UgdG8gcHVibGlzaCBKYXZhIEVFIFNlcnZsZXRzIGluCisgICAgICAgICAgICB0aGUgT1NHaSBydW50aW1lLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVHdvIGV4YW1wbGVzIHdlcmUgYWRkZWQgdG8gdGhlIEplcnNleSBkaXN0cmlidXRpb24gdG8gZGVwaWN0IHRoZSBhYm92ZSBtZW50aW9uZWQgZmVhdHVyZXMgYW5kIHNob3cgaG93IHRvIHVzZQorICAgICAgICAgICAgdGhlbSB3aXRoIEplcnNleToKKworICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+JmplcnNleS5naXRodWIub3NnaS53ZWJhcHAuZXhhbXBsZS5saW5rOzwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPiZqZXJzZXkuZ2l0aHViLm9zZ2kuaHR0cHNlcnZpY2UuZXhhbXBsZS5saW5rOzwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKworICAgICAgICAgICAgQm90aCBleGFtcGxlcyBhcmUgbXVsdGktbW9kdWxlIG1hdmVuIHByb2plY3RzIGFuZCBib3RoIGNvbnNpc3Qgb2YgYW4gYXBwbGljYXRpb24gT1NHaSBidW5kbGUgbW9kdWxlIGFuZCBhIHRlc3QgbW9kdWxlLgorICAgICAgICAgICAgVGhlIHRlc3RzIGFyZSBiYXNlZCBvbiB0aGUgPGxpbmsgeGxpbms6aHJlZj0naHR0cDovL29wczRqMS5qaXJhLmNvbS93aWtpL2Rpc3BsYXkvUEFYRVhBTTMvUGF4K0V4YW0nPlBBWCBFeGFtPC9saW5rPgorICAgICAgICAgICAgZnJhbWV3b3JrLiBCb3RoIE9TR2kgZXhhbXBsZXMgYWxzbyBpbmNsdWRlIGEgcmVhZG1lIGZpbGUgY29udGFpbmluZyBpbnN0cnVjdGlvbnMKKyAgICAgICAgICAgIGhvdyB0byBtYW51YWxseSBydW4gdGhlIGV4YW1wbGUgYXBwbGljYXRpb25zIHVzaW5nICZmZWxpeC5saW5rOyBmcmFtZXdvcmsuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZSByZXN0IG9mIHRoZSBjaGFwdGVyIGRlc2NyaWJlcyBob3cgdG8gcnVuIHRoZSBhYm92ZSBtZW50aW9uZWQgZXhhbXBsZXMgb24gR2xhc3NGaXNoIDQgYXBwbGljYXRpb24gc2VydmVyLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHNlY3Rpb24geG1sOmlkPSJvc2dpLnNoZWxsIj4KKyAgICAgICAgICAgIDx0aXRsZT5FbmFibGluZyB0aGUgT1NHaSBzaGVsbCBpbiBHbGFzc2Zpc2g8L3RpdGxlPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgU2luY2UgR2xhc3NGaXNoIHV0aWxpemVzIEFwYWNoZSBGZWxpeCwgYW4gT1NHaSBydW50aW1lIGNvbWVzIG91dCBvZiB0aGUgYm94IHdpdGggR2xhc3NGaXNoLgorICAgICAgICAgICAgICAgIEhvd2V2ZXIsIGZvciBzZWN1cml0eSByZWFzb25zLCB0aGUgT1NHaSBzaGVsbCBoYXMgYmVlbiB0dXJuZWQgb2ZmLiBZb3UgY2FuIGhvd2V2ZXIgZXhwbGljaXRseSBlbmFibGUgaXQKKyAgICAgICAgICAgICAgICBlaXRoZXIgYnkgc3RhcnRpbmcgR2xhc3NGaXNoIHRoZSA8bGl0ZXJhbD5hc2FkbWluPC9saXRlcmFsPiBjb25zb2xlIGFuZCBjcmVhdGluZyBhIEphdmEgc3lzdGVtIHByb3BlcnR5CisgICAgICAgICAgICAgICAgPGxpdGVyYWw+Z2xhc3NmaXNoLm9zZ2kuc3RhcnQubGV2ZWwuZmluYWw8L2xpdGVyYWw+IGFuZCBzZXR0aW5nIGl0cyB2YWx1ZSB0byA8bGl0ZXJhbD4zPC9saXRlcmFsPjoKKworICAgICAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgICAgICBTdGFydCB0aGUgYWRtaW4gY29uc29sZToKKworICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImJhc2ggc2hlbGwiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIiBjb250aW51YXRpb249InJlc3RhcnRzIj4KK34vZ2xhc3NmaXNoL2JpbiQgLi9hc2FkbWluCitVc2UgImV4aXQiIHRvIGV4aXQgYW5kICJoZWxwIiBmb3Igb25saW5lIGhlbHAuCithc2FkbWluPjwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgICAgICAgICAgICAgICAgICAgWW91IGNhbiBjaGVjayB0aGUgYWN0dWFsIHZhbHVlIG9mIHRoZSBqYXZhIHByb3BlcnR5IChsb2FkZWQgZnJvbSB0aGUgY29uZmlndXJhdGlvbiBmaWxlKToKKworICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImJhc2ggc2hlbGwiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIiBjb250aW51YXRpb249ImNvbnRpbnVlcyI+Cithc2FkbWluPiAgbGlzdC1qdm0tb3B0aW9ucworLi4uCistRGdsYXNzZmlzaC5vc2dpLnN0YXJ0LmxldmVsLmZpbmFsPTIKKy4uLjwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgICAgICAgICAgICAgICAgICAgQW5kIGNoYW5nZSB0aGUgdmFsdWUgYnkgdHlwaW5nOgorCisgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iYmFzaCBzaGVsbCIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiIGNvbnRpbnVhdGlvbj0iY29udGludWVzIj4KK2FzYWRtaW4+ICBjcmVhdGUtanZtLW9wdGlvbnMgLS10YXJnZXQgc2VydmVyIC1EZ2xhc3NmaXNoLm9zZ2kuc3RhcnQubGV2ZWwuZmluYWw9MzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgc2Vjb25kIG9wdGlvbiBpcyB0byBjaGFuZ2UgdGhlIHZhbHVlIGluIHRoZSA8bGl0ZXJhbD5vc2dpLnByb3BlcnRpZXM8L2xpdGVyYWw+IGNvbmZpZ3VyYXRpb24gZmlsZToKKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImJhc2ggc2hlbGwiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj4KKyMgRmluYWwgc3RhcnQgbGV2ZWwgb2YgT1NHaSBmcmFtZXdvcmsuIFRoaXMgaXMgdXNlZCBieSBHbGFzc0Zpc2ggbGF1bmNoZXIgY29kZQorIyB0byBzZXQgdGhlIHN0YXJ0IGxldmVsIG9mIHRoZSBPU0dpIGZyYW1ld29yayBvbmNlIHNlcnZlciBpcyB1cCBhbmQgcnVubmluZyBzbyB0aGF0CisjIG9wdGlvbmFsIHNlcnZpY2VzIGNhbiBzdGFydC4gVGhlIGluaXRpYWwgc3RhcnQgbGV2ZWwgb2YgZnJhbWV3b3JrIGlzIGNvbnRyb2xsZWQgdXNpbmcKKyMgdGhlIHN0YW5kYXJkIGZyYW1ld29yayBwcm9wZXJ0eSBjYWxsZWQgb3JnLm9zZ2kuZnJhbWV3b3JrLnN0YXJ0bGV2ZWwuYmVnaW5uaW5nCitnbGFzc2Zpc2gub3NnaS5zdGFydC5sZXZlbC5maW5hbD0zPC9wcm9ncmFtbGlzdGluZz4KKworICAgICAgICAgICAgICAgIFlvdSBjYW4gdGhlbiBleGVjdXRlIHRoZSBGZWxpeCBzaGVsbCBjb21tYW5kcyBieSB0eXBpbmcgPGxpdGVyYWw+b3NnaSAmbHQ7ZmVsaXhfY29tbWFuZCZndDs8L2xpdGVyYWw+IGluCisgICAgICAgICAgICAgICAgdGhlIDxsaXRlcmFsPmFzYWRtaW48L2xpdGVyYWw+IGNvbnNvbGUuIEZvciBleGFtcGxlOgorCisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJiYXNoIHNoZWxsIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+Cithc2FkbWluPiBvc2dpIGxiCisuLi4gbGlzdCBvZiBidW5kbGVzIC4uLjwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgICAgICAgICAgICAgICBvciBsYXVuY2hpbmcgdGhlIHNoZWxsIHVzaW5nIDxsaXRlcmFsPm9zZ2ktc2hlbGw8L2xpdGVyYWw+IGNvbW1hbmQgaW4gdGhlIGFkbWluIGNvbnNvbGUgKHRoZSBkb21haW4gbXVzdCBiZQorICAgICAgICAgICAgICAgIHN0YXJ0ZWQsIG90aGVyd2lzZSB0aGUgb3NnaSBzaGVsbCB3b24ndCBsYXVuY2gpOgorCisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJiYXNoIHNoZWxsIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+Cithc2FkbWluPiBvc2dpLXNoZWxsCitVc2UgImV4aXQiIHRvIGV4aXQgYW5kICJoZWxwIiBmb3Igb25saW5lIGhlbHAuCitnb2dvJDwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgICAgICAgICAgICAgICBhbmQgZXhlY3V0ZSB0aGUgb3NnaSBjb21tYW5kcyBkaXJlY3RseSAod2l0aG91dCB0aGUgIjxsaXRlcmFsPm9zZ2k8L2xpdGVyYWw+IiBwcmVmaXgpOgorCis8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImJhc2ggc2hlbGwiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj4KK2dvZ28kIGxiCisuLi4gbGlzdCBvZiBidW5kbGVzIC4uLjwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICA8c2VjdGlvbiB4bWw6aWQ9Im9zZ2kud2FiIj4KKyAgICAgICAgICAgIDx0aXRsZT5XQUIgRXhhbXBsZTwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEFzIG1lbnRpb25lZCBhYm92ZSwgV0FCIGlzIGp1c3QgYW4gT1NHaS1maWVkIFdBUiBhcmNoaXZlLiBCZXNpZGVzIHRoZSB1c3VhbCBPU0dpIGhlYWRlcnMgaXQgbXVzdAorICAgICAgICAgICAgICAgIGluIGFkZGl0aW9uIGNvbnRhaW4gYSBzcGVjaWFsIGhlYWRlciwgV2ViLUNvbnRleHRQYXRoLCBzcGVjaWZ5aW5nIHRoZSB3ZWIgYXBwbGljYXRpb24gY29udGV4dCBwYXRoLgorICAgICAgICAgICAgICAgIE91ciBXQUIgaGFzIChiZXNpZGUgc29tZSBvdGhlcikgdGhlIGZvbGxvd2luZyBoZWFkZXJzIHByZXNlbnQgaW4gdGhlIG1hbmlmZXN0OgorCisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJ0ZXh0IiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+V2ViLUNvbnRleHRQYXRoOiBoZWxsb3dvcmxkCitXZWJhcHAtQ29udGV4dDogaGVsbG93b3JsZAorQnVuZGxlLUNsYXNzUGF0aDogV0VCLUlORi9jbGFzc2VzZTwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgICAgICAgICAgICAgICBIZXJlLCB0aGUgc2Vjb25kIGhlYWRlciBpcyBpZ25vcmVkIGJ5IEdsYXNzRmlzaCwgYnV0IG1heSBiZSByZXF1aXJlZCBieSBvdGhlciBjb250YWluZXJzIG5vdCBmdWxseQorICAgICAgICAgICAgICAgIGNvbXBsaWFudCB3aXRoIHRoZSBPU0dpIEVudGVycHJpc2UgU3BlY2lmaWNhdGlvbiBtZW50aW9uZWQgYWJvdmUuIFRoZSB0aGlyZCBtYW5pZmVzdCBoZWFkZXIKKyAgICAgICAgICAgICAgICB3b3J0aCBtZW50aW9uaW5nIGlzIHRoZSBCdW5kbGUtQ2xhc3NQYXRoIHNwZWNpZnlpbmcgd2hlcmUgdG8gZmluZCB0aGUgYXBwbGljYXRpb24KKyAgICAgICAgICAgICAgICBKYXZhIGNsYXNzZXMgd2l0aGluIHRoZSBidW5kbGUgYXJjaGl2ZS4KKyAgICAgICAgICAgICAgICBNb3JlIGFib3V0IG1hbmlmZXN0IGhlYWRlcnMgaW4gT1NHaSBjYW4gYmUgZm91bmQgaW4gdGhlCisgICAgICAgICAgICAgICAgPGxpbmsgeGxpbms6aHJlZj0naHR0cDovL3dpa2kub3NnaS5vcmcvd2lraS9DYXRlZ29yeTpNYW5pZmVzdF9IZWFkZXInPk9TR2kgV2lraTwvbGluaz4uCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEZvciBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIHRoZSBleGFtcGxlIHBsZWFzZSBzZWUgdGhlICZqZXJzZXkuZ2l0aHViLm9zZ2kud2ViYXBwLmV4YW1wbGUubGluazsgc291cmNlIGNvZGUuIFRoaXMKKyAgICAgICAgICAgICAgICBleGFtcGxlIGRvZXMgbm90IHBhY2thZ2UgaW50byBhIHNpbmdsZSA8bGl0ZXJhbD53YXI8L2xpdGVyYWw+IGZpbGUuIEluc3RlYWQgYSA8bGl0ZXJhbD53YXI8L2xpdGVyYWw+IGFuZCBhCisgICAgICAgICAgICAgICAgc2V0IG9mIGFkZGl0aW9uYWwgPGxpdGVyYWw+amFyPC9saXRlcmFsPnMgaXMgcHJvZHVjZWQgZHVyaW5nIHRoZSBidWlsZC4gU2VlIHRoZSBuZXh0IGV4YW1wbGUgdG8gc2VlIGhvdyB0byBkZXBsb3kgT1NHaQorICAgICAgICAgICAgICAgIGJhc2VkIEplcnNleSBhcHBsaWNhdGlvbiB0byBHbGFzc0Zpc2guCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICA8c2VjdGlvbiB4bWw6aWQ9Im9zZ2kuaHR0cHNlcnZpY2UiPgorICAgICAgICAgICAgPHRpdGxlPkhUVFAgU2VydmljZSBFeGFtcGxlPC90aXRsZT4KKworICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFdoZW4gZGVwbG95aW5nIGFuIE9TR2kgSFRUUCBTZXJ2aWNlIGV4YW1wbGUgdG8gR2xhc3NGaXNoLCBwbGVhc2UgbWFrZSBzdXJlIHRoZSBPU0dpIEhUVFAgU2VydmljZSBidW5kbGUgaXMKKyAgICAgICAgICAgICAgICAgICAgaW5zdGFsbGVkIG9uIHlvdXIgR2xhc3NGaXNoIGluc3RhbmNlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbm90ZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgWW91IGNhbiBkaXJlY3RseSBpbnN0YWxsIGFuZCBhY3RpdmF0ZSB0aGUgSmVyc2V5IGFwcGxpY2F0aW9uIGJ1bmRsZS4gSW4gY2FzZSBvZiBvdXIgZXhhbXBsZSwgeW91IGNhbiBlaXRoZXIKKyAgICAgICAgICAgICAgICBpbnN0YWxsIHRoZSBleGFtcGxlIGJ1bmRsZSBzdG9yZWQgbG9jYWxseSAoYW5kIGFsdGVybmF0aXZlbHkgYnVpbGQgZnJvbSBKZXJzZXkgc291cmNlcyk6CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAxKSBCdWlsZCAob3B0aW9uYWwpCisKKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImJhc2giIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj4KK2V4YW1wbGVzJCBjZCBvc2dpLWh0dHAtc2VydmljZS9idW5kbGUKK2J1bmRsZSQgbXZuIGNsZWFuIHBhY2thZ2U8L3Byb2dyYW1saXN0aW5nPgorCisgICAgICAgICAgICAgICAgWW91IGNhbiBhbHNvIGdldCB0aGUgYmluYXJ5IHJlYWRpbHkgY29tcGlsZWQgZnJvbQorICAgICAgICAgICAgICAgIDxsaW5rIHhsaW5rOmhyZWY9JyZtYXZlbi5qYXZhLm5ldC5yZWxlYXNlcy5saW5rO29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL29zZ2ktaHR0cC1zZXJ2aWNlL2J1bmRsZS8mdmVyc2lvbjsnPkphdmEubmV0IE1hdmVuIFJlcG9zaXRvcnk8L2xpbms+LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgMikgSW5zdGFsbCBpbnRvIE9TR2kgcnVudGltZToKKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImJhc2ggc2hlbGwiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj4KK2dvZ28kIGluc3RhbGwgZmlsZTovLy9wYXRoL3RvL2ZpbGUvYnVuZGxlLmphcgorQnVuZGxlIElEOiAzMDM8L3Byb2dyYW1saXN0aW5nPgorCisgICAgICAgICAgICAgICAgb3IgaW5zdGFsbCBpdCBkaXJlY3RseSBmcm9tIHRoZSBtYXZlbiByZXBvc2l0b3J5OgorCisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJiYXNoIHNoZWxsIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+Citnb2dvJCBpbnN0YWxsIGh0dHA6Ly9tYXZlbi5qYXZhLm5ldC9jb250ZW50L3JlcG9zaXRvcmllcy9yZWxlYXNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9vc2dpLWh0dHAtc2VydmljZS9idW5kbGUvJmx0O3ZlcnNpb24mZ3Q7L2J1bmRsZS0mbHQ7dmVyc2lvbiZndDsuamFyCitCdW5kbGUgSUQ6IDMwMzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIE1ha2Ugc3VyZSB0byByZXBsYWNlIDxsaXRlcmFsPiZsdDt2ZXJzaW9uJmd0OzwvbGl0ZXJhbD4gd2l0aCBhbiBhcHByb3ByaWF0ZSB2ZXJzaW9uIG51bWJlci4gV2hpY2ggb25lIGlzCisgICAgICAgICAgICAgICAgYXBwcm9wcmlhdGUgZGVwZW5kcyBvbiB0aGUgc3BlY2lmaWMgR2xhc3NGaXNoIDQueCB2ZXJzaW9uIHlvdSBhcmUgdXNpbmcuIFRoZSB2ZXJzaW9uIG9mIHRoZSBidW5kbGUgY2Fubm90CisgICAgICAgICAgICAgICAgYmUgaGlnaGVyIHRoYW4gdGhlIHZlcnNpb24gb2YgSmVyc2V5IGludGVncmF0ZWQgaW4geW91ciBHbGFzc0Zpc2ggNC54IHNlcnZlci4gSmVyc2V5IGJ1bmRsZXMgZGVjbGFyZQorICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llcyBvbiBvdGhlciBidW5kbGVzIGF0IHRoZSBPU0dpIGxldmVsIGFuZCB0aG9zZSBkZXBlbmRlbmNpZXMgYXJlIHZlcnNpb24tc2Vuc2l0aXZlLiBJZiB5b3UgdXNlCisgICAgICAgICAgICAgICAgZXhhbXBsZSBidW5kbGUgZnJvbSBsZXQncyBzYXkgdmVyc2lvbiAyLjUsIGJ1dCBHbGFzc2Zpc2ggaGFzIEplcnNleSAyLjMuMSwgZGVwZW5kZW5jaWVzIHdpbGwgbm90IGJlIHNhdGlzZmllZAorICAgICAgICAgICAgICAgIGFuZCBidW5kbGUgd2lsbCBub3Qgc3RhcnQuIElmIHRoaXMgaGFwcGVucywgdGhlIGVycm9yIHdpbGwgbG9vayBzb21ldGhpbmcgbGlrZSB0aGlzOgorCisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJiYXNoIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+Z29nbyQgbGIKKy4uLgorMzAzIHwgSW5zdGFsbGVkICB8ICAgIDF8IGplcnNleS1leGFtcGxlcy1vc2dpLWh0dHAtc2VydmljZS1idW5kbGUgKDIuNS4wLlNOQVBTSE9UKQorZ29nbyQgc3RhcnQgMzAzCisKK29yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb246IFVucmVzb2x2ZWQgY29uc3RyYWludCBpbiBidW5kbGUKK29yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLm9zZ2ktaHR0cC1zZXJ2aWNlLmJ1bmRsZSBbMzAzXTogVW5hYmxlIHRvIHJlc29sdmUgMzA4LjA6IG1pc3NpbmcgcmVxdWlyZW1lbnQKK1szMDMuMF0gb3NnaS53aXJpbmcucGFja2FnZTsgKCZhbXA7KG9zZ2kud2lyaW5nLnBhY2thZ2U9b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldCkKKyh2ZXJzaW9uPj0yLjUuMCkoISh2ZXJzaW9uPj0zLjAuMCkpKQorCitnb2dvJDwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgICAgICAgICAgICAgICBJbiB0aGUgb3Bwb3NpdGUgc2NlbmFyaW8gKGV4YW1wbGUgYnVuZGxlIHZlcnNpb24gMi4zLjEgYW5kIEdsYXNzZmlzaCBKZXJzZXkgdmVyc2lvbiBoaWdoZXIpLCBldmVyeXRoaW5nIHNob3VsZAorICAgICAgICAgICAgICAgIHdvcmsgZmluZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgQWxzbywgaWYgeW91IGJ1aWxkIEdsYXNzRmlzaCBmcm9tIHRoZSBtYWluIHRydW5rIHNvdXJjZXMgYW5kIHVzZSB0aGUgZXhhbXBsZSBmcm9tIG1vc3QgcmVjZW50CisgICAgICAgICAgICAgICAgSmVyc2V5IHJlbGVhc2UsIHlvdSB3aWxsIG1vc3QgbGlrZWx5IGJlIGFibGUgdG8gcnVuIHRoZSBleGFtcGxlcyBmcm9tIHRoZSBsYXRlc3QgSmVyc2V5IHJlbGVhc2UsIGFzIEplcnNleQorICAgICAgICAgICAgICAgIHRlYW0gdHlwaWNhbGx5IGludGVncmF0ZXMgYWxsIG5ld2x5IHJlbGVhc2VkIHZlcnNpb25zIG9mIEplcnNleSBpbW1lZGlhdGVseSBpbnRvIEdsYXNzRmlzaC4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgQXMgYSBmaW5hbCBzdGVwLCBzdGFydCB0aGUgYnVuZGxlOgorCisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJiYXNoIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+Z29nbyQgc3RhcnQgMzAzPC9wcm9ncmFtbGlzdGluZz4KKworICAgICAgICAgICAgICAgIEFnYWluLCB0aGUgQnVuZGxlIElEIChpbiBvdXIgY2FzZSAzMDMpIGhhcyB0byBiZSByZXBsYWNlZCBieSB0aGUgY29ycmVjdCBvbmUgcmV0dXJuZWQgZnJvbSB0aGUKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbD5pbnN0YWxsPC9saXRlcmFsPiBjb21tYW5kLgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgZXhhbXBsZSBhcHAgc2hvdWxkIG5vdyBiZSB1cCBhbmQgcnVubmluZy4gWW91IGNhbiBhY2Nlc3MgaXQgb24KKyAgICAgICAgICAgICAgICA8bGluayB4bGluazpocmVmPSdodHRwOi8vbG9jYWxob3N0OjgwODAvb3NnaS9qZXJzZXktaHR0cC1zZXJ2aWNlL3N0YXR1cyc+CisgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9vc2dpL2plcnNleS1odHRwLXNlcnZpY2Uvc3RhdHVzCisgICAgICAgICAgICAgICAgPC9saW5rPi4gUGxlYXNlIHNlZSAmamVyc2V5LmdpdGh1Yi5vc2dpLmh0dHBzZXJ2aWNlLmV4YW1wbGUubGluazsgc291cmNlIGNvZGUgZm9yIG1vcmUgZGV0YWlscyBvbiB0aGUgZXhhbXBsZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIHhtbDppZD0iZGVwbG95bWVudC5vdGhlciI+CisgICAgICAgIDx0aXRsZT5PdGhlciBFbnZpcm9ubWVudHM8L3RpdGxlPgorCisgICAgICAgIDxzZWN0aW9uIHhtbDppZD0iZGVwbG95bWVudC5vdGhlci5jbG91ZCI+CisgICAgICAgICAgICA8dGl0bGU+T3JhY2xlIEphdmEgQ2xvdWQgU2VydmljZTwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEFzIE9yYWNsZSBQdWJsaWMgQ2xvdWQgaXMgYmFzZWQgb24gV2ViTG9naWMgc2VydmVyLCB0aGUgc2FtZSBhcHBsaWVzIGFzIGluIHRoZSBwYXJhZ3JhcGggYWJvdXQgV2ViTG9naWMKKyAgICAgICAgICAgICAgICBkZXBsb3ltZW50IChzZWUgPHhyZWYgbGlua2VuZD0iZGVwbG95bWVudC5hcHBzZXJ2ZXJzLndlYmxvZ2ljIiAvPikuIE1vcmUgb24gZGV2ZWxvcGluZyBhcHBsaWNhdGlvbnMgZm9yCisgICAgICAgICAgICAgICAgT3JhY2xlIEphdmEgQ2xvdWQgU2VydmljZSBjYW4gYmUgZm91bmQgaW4gdGhpcyAmY2xvdWQuZ3VpZGU7LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorPC9jaGFwdGVyPgpkaWZmIC0tZ2l0IGEvZG9jcy9zcmMvbWFpbi9kb2Nib29rL2VudGl0eS1maWx0ZXJpbmcueG1sIGIvZG9jcy9zcmMvbWFpbi9kb2Nib29rL2VudGl0eS1maWx0ZXJpbmcueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhY2M1ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3NyYy9tYWluL2RvY2Jvb2svZW50aXR5LWZpbHRlcmluZy54bWwKQEAgLTAsMCArMSw5MTQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzwhRE9DVFlQRSBjaGFwdGVyIFsKKyAgICA8IUVOVElUWSAlIGVudHMgU1lTVEVNICJqZXJzZXkuZW50IiA+ICVlbnRzOworICAgIDwhRU5USVRZIGplcnNleS5naXRodWIuZWYuZXhhbXBsZS5saW5rICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmdpdGh1Yi5leGFtcGxlcy51cmk7L2VudGl0eS1maWx0ZXJpbmcnPkVudGl0eSBGaWx0ZXJpbmcgZXhhbXBsZTwvbGluaz4iPgorICAgIDwhRU5USVRZIGplcnNleS5naXRodWIuZWYuc2VjdXJpdHkuZXhhbXBsZS5saW5rICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmdpdGh1Yi5leGFtcGxlcy51cmk7L2VudGl0eS1maWx0ZXJpbmctc2VjdXJpdHknPkVudGl0eSBGaWx0ZXJpbmcgZXhhbXBsZSAod2l0aCBzZWN1cml0eSBhbm5vdGF0aW9ucyk8L2xpbms+Ij4KKyAgICA8IUVOVElUWSBqZXJzZXkuZ2l0aHViLmVmLnNlbGVjdGFibGUuZXhhbXBsZS5saW5rICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmdpdGh1Yi5leGFtcGxlcy51cmk7L2VudGl0eS1maWx0ZXJpbmctc2VsZWN0YWJsZSc+RW50aXR5IEZpbHRlcmluZyBleGFtcGxlIChiYXNlZCBvbiBkeW5hbWljIGFuZCBjb25maWd1cmFibGUgcXVlcnkgcGFyYW1ldGVycyk8L2xpbms+Ij4KK10+CisKKzxjaGFwdGVyIHhtbG5zPSJodHRwOi8vZG9jYm9vay5vcmcvbnMvZG9jYm9vayIKKyAgICAgICAgIHZlcnNpb249IjUuMCIKKyAgICAgICAgIHhtbDpsYW5nPSJlbiIKKyAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIKKyAgICAgICAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vZG9jYm9vay5vcmcvbnMvZG9jYm9vayBodHRwOi8vZG9jYm9vay5vcmcveG1sLzUuMC94c2QvZG9jYm9vay54c2QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayBodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rLnhzZCIKKyAgICAgICAgIHhtbDppZD0iZW50aXR5LWZpbHRlcmluZyI+CisKKyAgICA8dGl0bGU+RW50aXR5IERhdGEgRmlsdGVyaW5nPC90aXRsZT4KKworICAgIDxwYXJhPgorICAgICAgICBTdXBwb3J0IGZvciBFbnRpdHkgRmlsdGVyaW5nIGluIEplcnNleSBpbnRyb2R1Y2VzIGEgY29udmVuaWVudCBmYWNpbGl0eSBmb3IgcmVkdWNpbmcgdGhlIGFtb3VudCBvZiBkYXRhIGV4Y2hhbmdlZCBvdmVyCisgICAgICAgIHRoZSB3aXJlIGJldHdlZW4gY2xpZW50IGFuZCBzZXJ2ZXIgd2l0aG91dCBhIG5lZWQgdG8gY3JlYXRlIHNwZWNpYWxpemVkIGRhdGEgdmlldyBjb21wb25lbnRzLiBUaGUgbWFpbiBpZGVhIGJlaGluZCB0aGlzCisgICAgICAgIGZlYXR1cmUgaXMgdG8gZ2l2ZSB5b3UgQVBJcyB0aGF0IHdpbGwgbGV0IHlvdSB0byBzZWxlY3RpdmVseSBmaWx0ZXIgb3V0IGFueSBub24tcmVsZXZhbnQgZGF0YSBmcm9tIHRoZSBtYXJzaGFsbGVkIG9iamVjdAorICAgICAgICBtb2RlbCBiZWZvcmUgc2VuZGluZyB0aGUgZGF0YSB0byB0aGUgb3RoZXIgcGFydHkgYmFzZWQgb24gdGhlIGNvbnRleHQgb2YgdGhlIHBhcnRpY3VsYXIgbWVzc2FnZSBleGNoYW5nZS4KKyAgICAgICAgVGhpcyB3YXksIG9ubHkgdGhlIG5lY2Vzc2FyeSBvciByZWxldmFudCBwb3J0aW9uIG9mIHRoZSBkYXRhIGlzIHRyYW5zZmVycmVkIG92ZXIgdGhlIG5ldHdvcmsgd2l0aCBlYWNoIGNsaWVudCByZXF1ZXN0CisgICAgICAgIG9yIHNlcnZlciByZXNwb25zZSwgd2l0aG91dCBhIG5lZWQgdG8gY3JlYXRlIHNwZWNpYWwgZmFjYWRlIG1vZGVscyBmb3IgdHJhbnNmZXJyaW5nIHRoZXNlIGxpbWl0ZWQgc3Vic2V0cyBvZiB0aGUgbW9kZWwKKyAgICAgICAgZGF0YS4KKyAgICA8L3BhcmE+CisgICAgPHBhcmE+CisgICAgICAgIEVudGl0eSBmaWx0ZXJpbmcgZmVhdHVyZSBhbGxvd3MgeW91IHRvIGRlZmluZSB5b3VyIG93biBlbnRpdHktZmlsdGVyaW5nIHJ1bGVzIGZvciB5b3VyIGVudGl0eSBjbGFzc2VzIGJhc2VkIG9uIHRoZQorICAgICAgICBjdXJyZW50IGNvbnRleHQgKGUuZy4gbWF0Y2hlZCByZXNvdXJjZSBtZXRob2QpIGFuZCBrZWVwIHRoZXNlIHJ1bGVzIGluIG9uZSBwbGFjZSAoZGlyZWN0bHkgaW4geW91ciBkb21haW4gbW9kZWwpLgorICAgICAgICBXaXRoIEplcnNleSBlbnRpdHkgZmlsdGVyaW5nIGZhY2lsaXR5IGl0IGlzIGFsc28gcG9zc2libGUgdG8gYXNzaWduIHNlY3VyaXR5IGFjY2VzcyBydWxlcyB0byBlbnRpdHkgY2xhc3NlcyBwcm9wZXJ0aWVzCisgICAgICAgIGFuZCBwcm9wZXJ0eSBhY2Nlc3NvcnMuCisgICAgPC9wYXJhPgorICAgIDxwYXJhPgorICAgICAgICBXZSB3aWxsIGZpcnN0IGV4cGxhaW4gdGhlIG1haW4gY29uY2VwdHMgYW5kIHRoZW4gd2Ugd2lsbCBleHBsb3JlIHRoZSBlbnRpdHkgZmlsdGVyaW5nIGZlYXR1cmUgdG9waWNzIGZyb20gYSBwZXJzcGVjdGl2ZQorICAgICAgICBvZiBiYXNpYyB1c2UtY2FzZXMsCisKKyAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT48eHJlZiBsaW5rZW5kPSJlZi5hbm5vdGF0aW9ucyIvPjwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+PHhyZWYgbGlua2VuZD0iZWYuc2VjdXJpdHkuYW5ub3RhdGlvbnMiLz48L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPjx4cmVmIGxpbmtlbmQ9ImVmLnNlbGVjdGFibGUuYW5ub3RhdGlvbnMiLz48L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKworICAgICAgICBhcyB3ZWxsIGFzIHNvbWUgbW9yZSBjb21wbGV4IG9uZXMuCisKKyAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT48eHJlZiBsaW5rZW5kPSJlZi5jdXN0b20uYW5ub3RhdGlvbnMiLz48L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICA8L3BhcmE+CisgICAgPG5vdGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgSmVyc2V5IGVudGl0eSBmaWx0ZXJpbmcgZmVhdHVyZSBpcyBzdXBwb3J0ZWQgdmlhIEplcnNleSBleHRlbnNpb24gbW9kdWxlcyBsaXN0ZWQgaW4gPHhyZWYgbGlua2VuZD0iZWYubW9kdWxlcyIvPi4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvbm90ZT4KKworICAgIDxzZWN0aW9uPgorICAgICAgICA8dGl0bGU+RW5hYmxpbmcgYW5kIGNvbmZpZ3VyaW5nIEVudGl0eSBGaWx0ZXJpbmcgaW4geW91ciBhcHBsaWNhdGlvbjwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBFbnRpdHkgRmlsdGVyaW5nIHN1cHBvcnQgaW4gSmVyc2V5IGlzIHByb3ZpZGVkIGFzIGFuIGV4dGVuc2lvbiBtb2R1bGUgYW5kIG5lZWRzIHRvIGJlIG1lbnRpb25lZCBleHBsaWNpdGx5IGluIHlvdXIKKyAgICAgICAgICAgICZsaXQucG9tLnhtbDsgZmlsZSAoaW4gY2FzZSBvZiB1c2luZyBNYXZlbik6CisKKyAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0ieG1sIiBsaW5lbnVtYmVyaW5nPSJ1bm51bWJlcmVkIj4mbHQ7ZGVwZW5kZW5jeSZndDsKKyAgICAmbHQ7Z3JvdXBJZCZndDtvcmcuZ2xhc3NmaXNoLmplcnNleS5leHQmbHQ7L2dyb3VwSWQmZ3Q7CisgICAgJmx0O2FydGlmYWN0SWQmZ3Q7amVyc2V5LWVudGl0eS1maWx0ZXJpbmcmbHQ7L2FydGlmYWN0SWQmZ3Q7CisgICAgJmx0O3ZlcnNpb24mZ3Q7JnZlcnNpb247Jmx0Oy92ZXJzaW9uJmd0OworJmx0Oy9kZXBlbmRlbmN5Jmd0OzwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBJZiB5b3UncmUgbm90IHVzaW5nIE1hdmVuIG1ha2Ugc3VyZSB0byBoYXZlIGFsc28gYWxsIHRoZSB0cmFuc2l0aXZlIGRlcGVuZGVuY2llcworICAgICAgICAgICAgICAgICAgICAoc2VlICZqZXJzZXkuZXh0LmVudGl0eS1maWx0ZXJpbmcuZGVwcy5saW5rOykgb24gdGhlIGNsYXNzcGF0aC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L25vdGU+CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaGUgZW50aXR5LWZpbHRlcmluZyBleHRlbnNpb24gbW9kdWxlIHByb3ZpZGVzIHRocmVlICZsaXQuamF4cnMuY29yZS5GZWF0dXJlO3Mgd2hpY2ggeW91IGNhbiByZWdpc3RlciBpbnRvIHNlcnZlci9jbGllbnQKKyAgICAgICAgICAgIHJ1bnRpbWUgaW4gcHJpb3IgdG8gdXNlIEVudGl0eSBGaWx0ZXJpbmcgaW4gYW4gYXBwbGljYXRpb246CisKKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4mamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLkVudGl0eUZpbHRlcmluZ0ZlYXR1cmU7PC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlcmluZyBiYXNlZCBvbiBlbnRpdHktZmlsdGVyaW5nIGFubm90YXRpb25zIChvciBpLmUuIGV4dGVybmFsIGNvbmZpZ3VyYXRpb24gZmlsZSkgY3JlYXRlZCB1c2luZworICAgICAgICAgICAgICAgICAgICAgICAgJmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5FbnRpdHlGaWx0ZXJpbmc7IG1ldGEtYW5ub3RhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4mamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLlNlY3VyaXR5RW50aXR5RmlsdGVyaW5nRmVhdHVyZTs8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPkZpbHRlcmluZyBiYXNlZCBvbiBzZWN1cml0eSAoPGxpdGVyYWw+amF2YXguYW5ub3RhdGlvbi5zZWN1cml0eTwvbGl0ZXJhbD4pIGFuZCBlbnRpdHktZmlsdGVyaW5nCisgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucy48L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPiZqZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuU2VsZWN0YWJsZUVudGl0eUZpbHRlcmluZ0ZlYXR1cmU7PC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT5GaWx0ZXJpbmcgYmFzZWQgb24gZHluYW1pYyBhbmQgY29uZmlndXJhYmxlIHF1ZXJ5IHBhcmFtZXRlcnMuPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKworICAgICAgICAgICAgSWYgeW91IHdhbnQgdG8gdXNlIGJvdGggZW50aXR5LWZpbHRlcmluZyBhbm5vdGF0aW9ucyBhbmQgc2VjdXJpdHkgYW5ub3RhdGlvbnMgZm9yIGVudGl0eSBkYXRhIGZpbHRlcmluZyBpdCBpcyBlbm91Z2gKKyAgICAgICAgICAgIHRvIHJlZ2lzdGVyICZsaXQuamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLlNlY3VyaXR5RW50aXR5RmlsdGVyaW5nRmVhdHVyZTsgYXMgdGhpcyBmZWF0dXJlIHJlZ2lzdGVycyBhbHNvCisgICAgICAgICAgICAmbGl0LmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5FbnRpdHlGaWx0ZXJpbmdGZWF0dXJlOy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEVudGl0eS1maWx0ZXJpbmcgY3VycmVudGx5IHJlY29nbml6ZXMgb25lIHByb3BlcnR5IHRoYXQgY2FuIGJlIHBhc3NlZCBpbnRvIHRoZSAmamF4cnMuY29yZS5Db25maWd1cmF0aW9uOyBpbnN0YW5jZQorICAgICAgICAgICAgKGNsaWVudC9zZXJ2ZXIpOgorCisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+JmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5FbnRpdHlGaWx0ZXJpbmdGZWF0dXJlLkVOVElUWV9GSUxURVJJTkdfU0NPUEU7IC0gIjxsaXRlcmFsPmplcnNleS5jb25maWcuZW50aXR5RmlsdGVyaW5nLnNjb3BlPC9saXRlcmFsPiI8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgRGVmaW5lcyBvbmUgb3IgbW9yZSBhbm5vdGF0aW9ucyB0aGF0IHNob3VsZCBiZSB1c2VkIGFzIGVudGl0eS1maWx0ZXJpbmcgc2NvcGUgd2hlbiByZWFkaW5nL3dyaXRpbmcgYW4KKyAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKworICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFByb2Nlc3Npbmcgb2YgZW50aXR5LWZpbHRlcmluZyBhbm5vdGF0aW9ucyB0byBjcmVhdGUgYW4gZW50aXR5LWZpbHRlcmluZyBzY29wZSBpcyBkZWZpbmVkIGJ5CisgICAgICAgICAgICAgICAgICAgIGZvbGxvd2luZzogIjxsaXRlcmFsPlJlcXVlc3QvUmVzb3VyY2UgZW50aXR5IGFubm90YXRpb25zPC9saXRlcmFsPiIgJmd0OworICAgICAgICAgICAgICAgICAgICAiPGxpdGVyYWw+Q29uZmlndXJhdGlvbjwvbGl0ZXJhbD4iICZndDsgIjxsaXRlcmFsPlJlc291cmNlIG1ldGhvZC9jbGFzcyBhbm5vdGF0aW9uczwvbGl0ZXJhbD4iCisgICAgICAgICAgICAgICAgICAgIChvbiBzZXJ2ZXIpLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFlvdSBjYW4gY29uZmlndXJlIGVudGl0eS1maWx0ZXJpbmcgb24gc2VydmVyIChiYXNpYyArIHNlY3VyaXR5IGV4YW1wbGVzKSBhcyBmb2xsb3dzOgorCisgICAgICAgICAgICA8ZXhhbXBsZSB4bWw6aWQ9ImVmLmV4YW1wbGUuc2VydmVyLnJlZ2lzdHJhdGlvbiI+CisgICAgICAgICAgICAgICAgPHRpdGxlPlJlZ2lzdGVyaW5nIGFuZCBjb25maWd1cmluZyBlbnRpdHktZmlsdGVyaW5nIGZlYXR1cmUgb24gc2VydmVyLjwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5uZXcgUmVzb3VyY2VDb25maWcoKQorICAgIC8vIFNldCBlbnRpdHktZmlsdGVyaW5nIHNjb3BlIHZpYSBjb25maWd1cmF0aW9uLgorICAgIC5wcm9wZXJ0eShFbnRpdHlGaWx0ZXJpbmdGZWF0dXJlLkVOVElUWV9GSUxURVJJTkdfU0NPUEUsIG5ldyBBbm5vdGF0aW9uW10ge1Byb2plY3REZXRhaWxlZFZpZXcuRmFjdG9yeS5nZXQoKX0pCisgICAgLy8gUmVnaXN0ZXIgdGhlIEVudGl0eUZpbHRlcmluZ0ZlYXR1cmUuCisgICAgLnJlZ2lzdGVyKEVudGl0eUZpbHRlcmluZ0ZlYXR1cmUuY2xhc3MpCisgICAgLy8gRnVydGhlciBjb25maWd1cmF0aW9uIG9mIFJlc291cmNlQ29uZmlnLgorICAgIC5yZWdpc3RlciggLi4uICk7PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKworICAgICAgICAgICAgPGV4YW1wbGUgeG1sOmlkPSJlZi5leGFtcGxlLnNlcnZlci5zZWN1cml0eS5yZWdpc3RyYXRpb24iPgorICAgICAgICAgICAgICAgIDx0aXRsZT5SZWdpc3RlcmluZyBhbmQgY29uZmlndXJpbmcgZW50aXR5LWZpbHRlcmluZyBmZWF0dXJlIHdpdGggc2VjdXJpdHkgYW5ub3RhdGlvbnMgb24gc2VydmVyLjwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5uZXcgUmVzb3VyY2VDb25maWcoKQorICAgIC8vIFNldCBlbnRpdHktZmlsdGVyaW5nIHNjb3BlIHZpYSBjb25maWd1cmF0aW9uLgorICAgIC5wcm9wZXJ0eShFbnRpdHlGaWx0ZXJpbmdGZWF0dXJlLkVOVElUWV9GSUxURVJJTkdfU0NPUEUsIG5ldyBBbm5vdGF0aW9uW10ge1NlY3VyaXR5QW5ub3RhdGlvbnMucm9sZXNBbGxvd2VkKCJtYW5hZ2VyIil9KQorICAgIC8vIFJlZ2lzdGVyIHRoZSBTZWN1cml0eUVudGl0eUZpbHRlcmluZ0ZlYXR1cmUuCisgICAgLnJlZ2lzdGVyKFNlY3VyaXR5RW50aXR5RmlsdGVyaW5nRmVhdHVyZS5jbGFzcykKKyAgICAvLyBGdXJ0aGVyIGNvbmZpZ3VyYXRpb24gb2YgUmVzb3VyY2VDb25maWcuCisgICAgLnJlZ2lzdGVyKCAuLi4gKTs8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorCisgICAgICAgICAgICA8ZXhhbXBsZSB4bWw6aWQ9ImVmLmV4YW1wbGUuc2VydmVyLnNlbGVjdGFibGUucmVnaXN0cmF0aW9uIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+UmVnaXN0ZXJpbmcgYW5kIGNvbmZpZ3VyaW5nIGVudGl0eS1maWx0ZXJpbmcgZmVhdHVyZSBiYXNlZCBvbiBkeW5hbWljIGFuZCBjb25maWd1cmFibGUgcXVlcnkgcGFyYW1ldGVycy48L3RpdGxlPgorCisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+bmV3IFJlc291cmNlQ29uZmlnKCkKKyAgICAvLyBTZXQgcXVlcnkgcGFyYW1ldGVyIG5hbWUgZm9yIGR5bmFtaWMgZmlsdGVyaW5nCisgICAgLnByb3BlcnR5KFNlbGVjdGFibGVFbnRpdHlGaWx0ZXJpbmdGZWF0dXJlLlFVRVJZX1BBUkFNX05BTUUsICJzZWxlY3QiKQorICAgIC8vIFJlZ2lzdGVyIHRoZSBTZWxlY3RhYmxlRW50aXR5RmlsdGVyaW5nRmVhdHVyZS4KKyAgICAucmVnaXN0ZXIoU2VsZWN0YWJsZUVudGl0eUZpbHRlcmluZ0ZlYXR1cmUuY2xhc3MpCisgICAgLy8gRnVydGhlciBjb25maWd1cmF0aW9uIG9mIFJlc291cmNlQ29uZmlnLgorICAgIC5yZWdpc3RlciggLi4uICk7PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFVzZSBzaW1pbGFyIHN0ZXBzIHRvIHJlZ2lzdGVyIGVudGl0eS1maWx0ZXJpbmcgb24gY2xpZW50OgorCisgICAgICAgICAgICA8ZXhhbXBsZSB4bWw6aWQ9ImVmLmV4YW1wbGUuY2xpZW50LnJlZ2lzdHJhdGlvbiI+CisgICAgICAgICAgICAgICAgPHRpdGxlPlJlZ2lzdGVyaW5nIGFuZCBjb25maWd1cmluZyBlbnRpdHktZmlsdGVyaW5nIGZlYXR1cmUgb24gY2xpZW50LjwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5maW5hbCBDbGllbnRDb25maWcgY29uZmlnID0gbmV3IENsaWVudENvbmZpZygpCisgICAgLy8gU2V0IGVudGl0eS1maWx0ZXJpbmcgc2NvcGUgdmlhIGNvbmZpZ3VyYXRpb24uCisgICAgLnByb3BlcnR5KEVudGl0eUZpbHRlcmluZ0ZlYXR1cmUuRU5USVRZX0ZJTFRFUklOR19TQ09QRSwgbmV3IEFubm90YXRpb25bXSB7UHJvamVjdERldGFpbGVkVmlldy5GYWN0b3J5LmdldCgpfSkKKyAgICAvLyBSZWdpc3RlciB0aGUgRW50aXR5RmlsdGVyaW5nRmVhdHVyZS4KKyAgICAucmVnaXN0ZXIoRW50aXR5RmlsdGVyaW5nRmVhdHVyZS5jbGFzcykKKyAgICAvLyBGdXJ0aGVyIGNvbmZpZ3VyYXRpb24gb2YgQ2xpZW50Q29uZmlnLgorICAgIC5yZWdpc3RlciggLi4uICk7CisKKy8vIENyZWF0ZSBuZXcgY2xpZW50LgorZmluYWwgQ2xpZW50IGNsaWVudCA9IENsaWVudENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KGNvbmZpZyk7CisKKy8vIFVzZSB0aGUgY2xpZW50LjwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbj4KKyAgICAgICAgPHRpdGxlPkNvbXBvbmVudHMgdXNlZCB0byBkZXNjcmliZSBFbnRpdHkgRmlsdGVyaW5nIGNvbmNlcHRzPC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEluIHRoZSBuZXh0IHNlY3Rpb24gdGhlIGVudGl0eS1maWx0ZXJpbmcgZmVhdHVyZXMgd2lsbCBiZSBpbGx1c3RyYXRlZCBvbiBhIHByb2plY3QtdHJhY2tpbmcgYXBwbGljYXRpb24gdGhhdAorICAgICAgICAgICAgY29udGFpbnMgdGhyZWUgY2xhc3NlcyBpbiBpdCdzIGRvbWFpbiBtb2RlbCBhbmQgZmV3IHJlc291cmNlcyAob25seSA8bGl0ZXJhbD5Qcm9qZWN0PC9saXRlcmFsPiByZXNvdXJjZSB3aWxsIGJlCisgICAgICAgICAgICBzaG93biBpbiB0aGlzIGNoYXB0ZXIpLiBUaGUgZnVsbCBzb3VyY2UgY29kZSBmb3IgdGhlIGV4YW1wbGUgYXBwbGljYXRpb24gY2FuIGJlIGZvdW5kIGluIEplcnNleQorICAgICAgICAgICAgJmplcnNleS5naXRodWIuZWYuZXhhbXBsZS5saW5rOy4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgU3VwcG9zZSB0aGVyZSBhcmUgdGhyZWUgZG9tYWluIG1vZGVsIGNsYXNzZXMgKG9yIGVudGl0aWVzKSBpbiBvdXIgbW9kZWw6CisgICAgICAgICAgICA8bGl0ZXJhbD5Qcm9qZWN0PC9saXRlcmFsPiwgPGxpdGVyYWw+VXNlcjwvbGl0ZXJhbD4gYW5kIDxsaXRlcmFsPlRhc2s8L2xpdGVyYWw+IChnZXR0ZXJzL3NldHRlciBhcmUgb21pdHRlZCBmb3IKKyAgICAgICAgICAgIGJyZXZpdHkpLgorCisgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICA8dGl0bGU+UHJvamVjdDwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5wdWJsaWMgY2xhc3MgUHJvamVjdCB7CisKKyAgICBwcml2YXRlIExvbmcgaWQ7CisKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworCisgICAgcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247CisKKyAgICBwcml2YXRlIExpc3QmbHQ7VGFzayZndDsgdGFza3M7CisKKyAgICBwcml2YXRlIExpc3QmbHQ7VXNlciZndDsgdXNlcnM7CisKKyAgICAvLyBnZXR0ZXJzIGFuZCBzZXR0ZXJzCit9PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKworICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgPHRpdGxlPlVzZXI8L3RpdGxlPgorCisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+cHVibGljIGNsYXNzIFVzZXIgeworCisgICAgcHJpdmF0ZSBMb25nIGlkOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgIHByaXZhdGUgU3RyaW5nIGVtYWlsOworCisgICAgcHJpdmF0ZSBMaXN0Jmx0O1Byb2plY3QmZ3Q7IHByb2plY3RzOworCisgICAgcHJpdmF0ZSBMaXN0Jmx0O1Rhc2smZ3Q7IHRhc2tzOworCisgICAgLy8gZ2V0dGVycyBhbmQgc2V0dGVycworfTwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisKKyAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgIDx0aXRsZT5UYXNrPC90aXRsZT4KKworICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPnB1YmxpYyBjbGFzcyBUYXNrIHsKKworICAgIHByaXZhdGUgTG9uZyBpZDsKKworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKKworICAgIHByaXZhdGUgUHJvamVjdCBwcm9qZWN0OworCisgICAgcHJpdmF0ZSBVc2VyIHVzZXI7CisKKyAgICAvLyBnZXR0ZXJzIGFuZCBzZXR0ZXJzCit9PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVG8gcmV0cmlldmUgdGhlIGVudGl0aWVzIGZyb20gc2VydmVyIHRvIGNsaWVudCwgd2UgaGF2ZSBjcmVhdGVkIGFsc28gYSBjb3VwbGUgb2YgSkFYLVJTIHJlc291cmNlcyBmcm9tIHdob3NlIHRoZQorICAgICAgICAgICAgPGxpdGVyYWw+UHJvamVjdHNSZXNvdXJjZTwvbGl0ZXJhbD4gaXMgc2hvd24gYXMgZXhhbXBsZS4KKworICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgPHRpdGxlPlByb2plY3RzUmVzb3VyY2U8L3RpdGxlPgorCisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+QFBhdGgoInByb2plY3RzIikKK0BQcm9kdWNlcygiYXBwbGljYXRpb24vanNvbiIpCitwdWJsaWMgY2xhc3MgUHJvamVjdHNSZXNvdXJjZSB7CisKKyAgICBAR0VUCisgICAgQFBhdGgoIntpZH0iKQorICAgIHB1YmxpYyBQcm9qZWN0IGdldFByb2plY3QoQFBhdGhQYXJhbSgiaWQiKSBmaW5hbCBMb25nIGlkKSB7CisgICAgICAgIHJldHVybiBnZXREZXRhaWxlZFByb2plY3QoaWQpOworICAgIH0KKworICAgIEBHRVQKKyAgICBwdWJsaWMgTGlzdCZsdDtQcm9qZWN0Jmd0OyBnZXRQcm9qZWN0cygpIHsKKyAgICAgICAgcmV0dXJuIGdldERldGFpbGVkUHJvamVjdHMoKTsKKyAgICB9Cit9PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIHhtbDppZD0iZWYuYW5ub3RhdGlvbnMiPgorICAgICAgICA8dGl0bGU+VXNpbmcgY3VzdG9tIGFubm90YXRpb25zIHRvIGZpbHRlciBlbnRpdGllczwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBFbnRpdHkgZmlsdGVyaW5nIHZpYSBhbm5vdGF0aW9ucyBpcyBiYXNlZCBvbiBhbiAmamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLkVudGl0eUZpbHRlcmluZzsgbWV0YS1hbm5vdGF0aW9uLgorICAgICAgICAgICAgVGhpcyBtZXRhLWFubm90YXRpb24gaXMgdXNlZCB0byBpZGVudGlmeSBlbnRpdHktZmlsdGVyaW5nIGFubm90YXRpb25zIHRoYXQgY2FuIGJlIHRoZW4gYXR0YWNoZWQgdG8KKworICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPmRvbWFpbiBtb2RlbCBjbGFzc2VzIChzdXBwb3J0ZWQgb24gYm90aCwgc2VydmVyIGFuZCBjbGllbnQgc2lkZXMpLCBhbmQ8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPnJlc291cmNlIG1ldGhvZHMgLyByZXNvdXJjZSBjbGFzc2VzIChvbmx5IG9uIHNlcnZlciBzaWRlKTwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisKKyAgICAgICAgICAgIEFuIGV4YW1wbGUgb2YgZW50aXR5LWZpbHRlcmluZyBhbm5vdGF0aW9uIGFwcGxpY2FibGUgdG8gYSBjbGFzcywgZmllbGQgb3IgbWV0aG9kIGNhbiBiZSBzZWVuIGluCisgICAgICAgICAgICA8eHJlZiBsaW5rZW5kPSJlZi5hbm5vdGF0aW9ucy5zYW1wbGUuYW5ub3RhdGlvbiIvPiBiZWxvdy4KKworICAgICAgICAgICAgPGV4YW1wbGUgeG1sOmlkPSJlZi5hbm5vdGF0aW9ucy5zYW1wbGUuYW5ub3RhdGlvbiI+CisgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5Qcm9qZWN0RGV0YWlsZWRWaWV3PC90aXRsZT4KKworICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5AVGFyZ2V0KHtFbGVtZW50VHlwZS5UWVBFLCBFbGVtZW50VHlwZS5NRVRIT0QsIEVsZW1lbnRUeXBlLkZJRUxEfSkKK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitARG9jdW1lbnRlZAorQEVudGl0eUZpbHRlcmluZworcHVibGljIEBpbnRlcmZhY2UgUHJvamVjdERldGFpbGVkVmlldyB7CisKKyAgICAvKioKKyAgICAgKiBGYWN0b3J5IGNsYXNzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMgb2Yge0Bjb2RlIFByb2plY3REZXRhaWxlZFZpZXd9IGFubm90YXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5CisgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRzIEFubm90YXRpb25MaXRlcmFsJmx0O1Byb2plY3REZXRhaWxlZFZpZXcmZ3Q7CisgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIFByb2plY3REZXRhaWxlZFZpZXcgeworCisgICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgUHJvamVjdERldGFpbGVkVmlldyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEZhY3RvcnkoKTsKKyAgICAgICAgfQorICAgIH0KK308L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKworICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgU2luY2UgY3JlYXRpbmcgYW5ub3RhdGlvbiBpbnN0YW5jZXMgZGlyZWN0bHkgaW4gSmF2YSBjb2RlIGlzIG5vdCB0cml2aWFsLCBpdCBpcyBhIGdvb2QgcHJhY3RpY2UgdG8gcHJvdmlkZSBhbiBpbm5lcgorICAgICAgICAgICAgYW5ub3RhdGlvbiA8bGl0ZXJhbD5GYWN0b3J5PC9saXRlcmFsPiBjbGFzcyBpbiBlYWNoIGN1c3RvbSBmaWx0ZXJpbmcgYW5ub3RhdGlvbiwgdGhyb3VnaCB3aGljaCBuZXcgaW5zdGFuY2VzIG9mCisgICAgICAgICAgICB0aGUgYW5ub3RhdGlvbiBjYW4gYmUgZGlyZWN0bHkgY3JlYXRlZC4gVGhlIGFubm90YXRpb24gZmFjdG9yeSBjbGFzcyBjYW4gYmUgY3JlYXRlZCBieSBleHRlbmRpbmcgdGhlIEhLMgorICAgICAgICAgICAgPGxpdGVyYWw+QW5ub3RhdGlvbkxpdGVyYWw8L2xpdGVyYWw+IGNsYXNzIGFuZCBpbXBsZW1lbnRpbmcgdGhlIGFubm90YXRpb24gaW50ZXJmYWNlIGl0c2VsZi4gSXQgc2hvdWxkIGFsc28gcHJvdmlkZQorICAgICAgICAgICAgYSBzdGF0aWMgZmFjdG9yeSBtZXRob2QgdGhhdCB3aWxsIGNyZWF0ZSBhbmQgcmV0dXJuIGEgbmV3IGluc3RhbmNlIG9mIHRoZSA8bGl0ZXJhbD5GYWN0b3J5PC9saXRlcmFsPiBjbGFzcyB3aGVuCisgICAgICAgICAgICBpbnZva2VkLiBTdWNoIGFubm90YXRpb24gaW5zdGFuY2VzIGNhbiBiZSB0aGVuIHBhc3NlZCB0byB0aGUgY2xpZW50IGFuZCBzZXJ2ZXIgcnVuLXRpbWVzIHRvIGRlZmluZSBvciBvdmVycmlkZQorICAgICAgICAgICAgZW50aXR5LWZpbHRlcmluZyBzY29wZXMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBCeSBwbGFjaW5nIGFuIGVudGl0eS1maWx0ZXJpbmcgYW5ub3RhdGlvbiBvbiBhbiBlbnRpdHkgKGNsYXNzLCBmaWVsZHMsIGdldHRlcnMgb3Igc2V0dGVycykgd2UgZGVmaW5lIGEgc28tY2FsbGVkCisgICAgICAgICAgICA8ZW1waGFzaXM+ZW50aXR5LWZpbHRlcmluZyBzY29wZTwvZW1waGFzaXM+IGZvciB0aGUgZW50aXR5LiBUaGUgcHVycG9zZSBvZiBlbnRpdHktZmlsdGVyaW5nIHNjb3BlIGlzIHRvIGlkZW50aWZ5CisgICAgICAgICAgICBwYXJ0cyBvZiB0aGUgZG9tYWluIG1vZGVsIHRoYXQgc2hvdWxkIGJlIHByb2Nlc3NlZCB3aGVuIHRoZSBtb2RlbCBpcyB0byBiZSBzZW50IG92ZXIgdGhlIHdpcmUgaW4gYSBwYXJ0aWN1bGFyCisgICAgICAgICAgICBlbnRpdHktZmlsdGVyaW5nIHNjb3BlLiBXZSBkaXN0aW5ndWlzaCBiZXR3ZWVuOgorCisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWwgZW50aXR5LWZpbHRlcmluZyBzY29wZSAoZGVmaW5lZCBieSBwbGFjaW5nIGZpbHRlcmluZyBhbm5vdGF0aW9uIG9uIGEgY2xhc3MgaXRzZWxmKSwgYW5kCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbCBlbnRpdHktZmlsdGVyaW5nIHNjb3BlIChkZWZpbmVkIGJ5IHBsYWNpbmcgZmlsdGVyaW5nIGFubm90YXRpb24gb24gYSBmaWVsZCwgZ2V0dGVyIG9yIHNldHRlcikKKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKworICAgICAgICAgICAgVW5hbm5vdGF0ZWQgbWVtYmVycyBvZiBhIGRvbWFpbiBtb2RlbCBjbGFzcyBhcmUgYXV0b21hdGljYWxseSBhZGRlZCB0byBhbGwgZXhpc3RpbmcgZ2xvYmFsIGVudGl0eS1maWx0ZXJpbmcgc2NvcGVzLgorICAgICAgICAgICAgSWYgdGhlcmUgaXMgbm8gZXhwbGljaXQgZ2xvYmFsIGVudGl0eS1maWx0ZXJpbmcgc2NvcGUgZGVmaW5lZCBvbiBhIGNsYXNzIGEgZGVmYXVsdCBzY29wZSBpcyBjcmVhdGVkIGZvciB0aGlzIGNsYXNzCisgICAgICAgICAgICB0byBncm91cCB0aGVzZSBtZW1iZXJzLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQ3JlYXRpbmcgZW50aXR5LWZpbHRlcmluZyBzY29wZXMgdXNpbmcgY3VzdG9tIGVudGl0eS1maWx0ZXJpbmcgYW5ub3RhdGlvbnMgaW4gZG9tYWluIG1vZGVsIGNsYXNzZXMgaXMgaWxsdXN0cmF0ZWQKKyAgICAgICAgICAgIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZXMuCisKKyAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgICAgICA8dGl0bGU+QW5ub3RhdGVkIFByb2plY3Q8L3RpdGxlPgorCisgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPnB1YmxpYyBjbGFzcyBQcm9qZWN0IHsKKworICAgIHByaXZhdGUgTG9uZyBpZDsKKworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKKworICAgIEBQcm9qZWN0RGV0YWlsZWRWaWV3CisgICAgcHJpdmF0ZSBMaXN0Jmx0O1Rhc2smZ3Q7IHRhc2tzOworCisgICAgQFByb2plY3REZXRhaWxlZFZpZXcKKyAgICBwcml2YXRlIExpc3QmbHQ7VXNlciZndDsgdXNlcnM7CisKKyAgICAvLyBnZXR0ZXJzIGFuZCBzZXR0ZXJzCit9PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisKKyAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgPHRpdGxlPkFubm90YXRlZCBVc2VyPC90aXRsZT4KKworICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5wdWJsaWMgY2xhc3MgVXNlciB7CisKKyAgICBwcml2YXRlIExvbmcgaWQ7CisKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworCisgICAgcHJpdmF0ZSBTdHJpbmcgZW1haWw7CisKKyAgICBAVXNlckRldGFpbGVkVmlldworICAgIHByaXZhdGUgTGlzdCZsdDtQcm9qZWN0Jmd0OyBwcm9qZWN0czsKKworICAgIEBVc2VyRGV0YWlsZWRWaWV3CisgICAgcHJpdmF0ZSBMaXN0Jmx0O1Rhc2smZ3Q7IHRhc2tzOworCisgICAgLy8gZ2V0dGVycyBhbmQgc2V0dGVycworfTwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorCisgICAgICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5Bbm5vdGF0ZWQgVGFzazwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+cHVibGljIGNsYXNzIFRhc2sgeworCisgICAgcHJpdmF0ZSBMb25nIGlkOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOworCisgICAgQFRhc2tEZXRhaWxlZFZpZXcKKyAgICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKKworICAgIEBUYXNrRGV0YWlsZWRWaWV3CisgICAgcHJpdmF0ZSBVc2VyIHVzZXI7CisKKyAgICAvLyBnZXR0ZXJzIGFuZCBzZXR0ZXJzCit9PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisKKyAgICAgICAgICAgIEFzIHlvdSBjYW4gc2VlIGluIHRoZSBleGFtcGxlcyBhYm92ZSwgd2UgaGF2ZSBkZWZpbmVkIDMgc2VwYXJhdGUgc2NvcGVzIHVzaW5nIDxsaXRlcmFsPkBQcm9qZWN0RGV0YWlsZWRWaWV3PC9saXRlcmFsPiwKKyAgICAgICAgICAgIDxsaXRlcmFsPkBVc2VyRGV0YWlsZWRWaWV3PC9saXRlcmFsPiBhbmQgPGxpdGVyYWw+QFRhc2tEZXRhaWxlZFZpZXc8L2xpdGVyYWw+IGFubm90YXRpb25zIGFuZCB3ZSBoYXZlIGFwcGxpZWQKKyAgICAgICAgICAgIHRoZXNlIHNjb3BlcyBzZWxlY3RpdmVseSB0byBjZXJ0YWluIGZpZWxkcyBpbiB0aGUgZG9tYWluIG1vZGVsIGNsYXNzZXMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBPbmNlIHRoZSBlbnRpdHktZmlsdGVyaW5nIHNjb3BlcyBhcmUgYXBwbGllZCB0byB0aGUgcGFydHMgb2YgYSBkb21haW4gbW9kZWwsIHRoZSBlbnRpdHkgZmlsdGVyaW5nIGZhY2lsaXR5ICh3aGVuCisgICAgICAgICAgICBlbmFibGVkKSB3aWxsIGNoZWNrIHRoZSBhY3RpdmUgc2NvcGVzIHdoZW4gdGhlIG1vZGVsIGlzIGJlaW5nIHNlbnQgb3ZlciB0aGUgd2lyZSwgYW5kIGZpbHRlciBvdXQgYWxsIHBhcnRzIGZyb20KKyAgICAgICAgICAgIHRoZSBtb2RlbCBmb3Igd2hpY2ggdGhlcmUgaXMgbm8gYWN0aXZlIHNjb3BlIHNldCBpbiB0aGUgZ2l2ZW4gY29udGV4dC4gVGhlcmVmb3JlLCB3ZSBuZWVkIGEgd2F5IGhvdyB0byBjb250cm9sCisgICAgICAgICAgICB0aGUgc2NvcGVzIGFjdGl2ZSBpbiBhbnkgZ2l2ZW4gY29udGV4dCBpbiBvcmRlciB0byBwcm9jZXNzIHRoZSBtb2RlbCBkYXRhIGluIGEgY2VydGFpbiB3YXkgKGUuZy4gZXhwb3NlIHRoZSBkZXRhaWxlZAorICAgICAgICAgICAgdmlldykuIFdlIG5lZWQgdG8gdGVsbCB0aGUgc2VydmVyL2NsaWVudCBydW50aW1lIHdoaWNoIGVudGl0eS1maWx0ZXJpbmcgc2NvcGVzIHdlIHdhbnQgdG8gYXBwbHkuIFRoZXJlIGFyZSAyIHdheXMKKyAgICAgICAgICAgIGhvdyB0byBkbyB0aGlzIGZvciBjbGllbnQtc2lkZSBhbmQgMyB3YXlzIGZvciBzZXJ2ZXItc2lkZToKKworICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPk91dC1ib3VuZCBjbGllbnQgcmVxdWVzdCBvciBzZXJ2ZXIgcmVzcG9uc2UgcHJvZ3JhbW1hdGljYWxseSBjcmVhdGVkIHdpdGggZW50aXR5LWZpbHRlcmluZyBhbm5vdGF0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBpZGVudGlmeSB0aGUgc2NvcGVzIHRvIGJlIGFwcGxpZWQgKGF2YWlsYWJsZSBvbiBib3RoLCBjbGllbnQgYW5kIHNlcnZlcik8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPlByb3BlcnR5IGlkZW50aWZ5aW5nIHRoZSBhcHBsaWVkIHNjb3BlcyBwYXNzZWQgdGhyb3VnaCAmamF4cnMuY29yZS5Db25maWd1cmF0aW9uOworICAgICAgICAgICAgICAgICAgICAgICAgKGF2YWlsYWJsZSBvbiBib3RoLCBjbGllbnQgYW5kIHNlcnZlcik8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPkVudGl0eS1maWx0ZXJpbmcgYW5ub3RhdGlvbnMgaWRlbnRpZnlpbmcgdGhlIGFwcGxpZWQgc2NvcGVzIGF0dGFjaGVkIHRvIGEgcmVzb3VyY2UgbWV0aG9kIG9yIGNsYXNzCisgICAgICAgICAgICAgICAgICAgICAgICAoc2VydmVyLXNpZGUgb25seSk8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorCisgICAgICAgICAgICBXaGVuIHRoZSBtdWx0aXBsZSBhcHByb2FjaGVzIGFyZSBjb21iaW5lZCwgdGhlIHByaW9yaXRpZXMgb2YgY2FsY3VsYXRpbmcgdGhlIGFwcGxpZWQgc2NvcGVzIGFyZSBhcyBmb2xsb3dzOgorICAgICAgICAgICAgPGxpdGVyYWw+RW50aXR5IGFubm90YXRpb25zIGluIHJlcXVlc3Qgb3IgcmVzcG9uc2U8L2xpdGVyYWw+ICZndDsKKyAgICAgICAgICAgIDxsaXRlcmFsPlByb3BlcnR5IHBhc3NlZCB0aHJvdWdoIENvbmZpZ3VyYXRpb248L2xpdGVyYWw+ICZndDsKKyAgICAgICAgICAgIDxsaXRlcmFsPkFubm90YXRpb25zIGFwcGxpZWQgdG8gYSByZXNvdXJjZSBtZXRob2Qgb3IgY2xhc3M8L2xpdGVyYWw+LgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgSW4gYSBncmFwaCBvZiBkb21haW4gbW9kZWwgb2JqZWN0cywgdGhlIGVudGl0eS1maWx0ZXJpbmcgc2NvcGVzIGFyZSBhcHBsaWVkIHRvIHRoZSByb290IG5vZGUgYXMgd2VsbCBhcyB0cmFuc2l0aXZlbHkKKyAgICAgICAgICAgIHRvIGFsbCB0aGUgY2hpbGQgbm9kZXMuIEZpZWxkcyBhbmQgY2hpbGQgbm9kZXMgdGhhdCBkbyBub3QgbWF0Y2ggYXQgbGVhc3QgYSBzaW5nbGUgYWN0aXZlIHNjb3BlIGFyZSBmaWx0ZXJlZCBvdXQuCisgICAgICAgICAgICBXaGVuIHRoZSBzY29wZSBtYXRjaGluZyBpcyBwZXJmb3JtZWQsIGFubm90YXRpb25zIGFwcGxpZWQgdG8gdGhlIGRvbWFpbiBtb2RlbCBjbGFzc2VzIGFuZCBmaWVsZHMKKyAgICAgICAgICAgIGFyZSB1c2VkIHRvIGNvbXB1dGUgdGhlIHNjb3BlIGZvciBlYWNoIHBhcnRpY3VsYXIgY29tcG9uZW50IG9mIHRoZSBtb2RlbC4gSWYgdGhlcmUgYXJlIG5vIGFubm90YXRpb25zIG9uIHRoZSBjbGFzcworICAgICAgICAgICAgb3IgaXQncyBmaWVsZHMsIHRoZSBkZWZhdWx0IHNjb3BlIGlzIGFzc3VtZWQuIER1cmluZyB0aGUgZmlsdGVyaW5nLCBmaXJzdCwgdGhlIGFubm90YXRpb25zIG9uIHJvb3QgbW9kZWwgY2xhc3MKKyAgICAgICAgICAgIGFuZCBpdCdzIGZpZWxkcyBhcmUgY29uc2lkZXJlZC4gRm9yIGFsbCBjb21wb3NpdGUgZmllbGRzIHRoYXQgaGF2ZSBub3QgYmVlbiBmaWx0ZXJlZCBvdXQsIHRoZSBhbm5vdGF0aW9ucyBvbiB0aGUKKyAgICAgICAgICAgIHJlZmVyZW5jZWQgY2hpbGQgY2xhc3MgYW5kIGl0J3MgZmllbGRzIGFyZSBjb25zaWRlcmVkIG5leHQsIGFuZCBzbyBvbi4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxzZWN0aW9uPgorICAgICAgICAgICAgPHRpdGxlPlNlcnZlci1zaWRlIEVudGl0eSBGaWx0ZXJpbmc8L3RpdGxlPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUbyBwYXNzIGVudGl0eS1maWx0ZXJpbmcgYW5ub3RhdGlvbnMgdmlhICZqYXhycy5jb3JlLlJlc3BvbnNlOyByZXR1cm5lZCBmcm9tIGEgcmVzb3VyY2UgbWV0aG9kIHlvdSBjYW4gbGV2ZXJhZ2UgdGhlCisgICAgICAgICAgICAgICAgPGxpbmsgeGxpbms6aHJlZj0nJmpheHJzLmphdmFkb2MudXJpOy9jb3JlL1Jlc3BvbnNlLlJlc3BvbnNlQnVpbGRlci5odG1sI2VudGl0eShqYXZhLmxhbmcuT2JqZWN0LCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uW10pJz5SZXNwb25zZS5SZXNwb25zZUJ1aWxkZXIjZW50aXR5KE9iamVjdCwgQW5ub3RhdGlvbltdKTwvbGluaz4KKyAgICAgICAgICAgICAgICBtZXRob2QuIFRoZSBuZXh0IGV4YW1wbGUgaWxsdXN0cmF0ZXMgdGhpcyBhcHByb2FjaC4gWW91IHdpbGwgYWxzbyBzZWUgd2h5IGV2ZXJ5IGN1c3RvbSBlbnRpdHktZmlsdGVyaW5nCisgICAgICAgICAgICAgICAgYW5ub3RhdGlvbiBzaG91bGQgY29udGFpbiBhIGZhY3RvcnkgZm9yIGNyZWF0aW5nIGluc3RhbmNlcyBvZiB0aGUgYW5ub3RhdGlvbi4KKworICAgICAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgICAgICA8dGl0bGU+UHJvamVjdHNSZXNvdXJjZSAtIFJlc3BvbnNlIGVudGl0eS1maWx0ZXJpbmcgYW5ub3RhdGlvbnM8L3RpdGxlPgorCisgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPkBQYXRoKCJwcm9qZWN0cyIpCitAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2pzb24iKQorcHVibGljIGNsYXNzIFByb2plY3RzUmVzb3VyY2UgeworCisgICAgQEdFVAorICAgIHB1YmxpYyBSZXNwb25zZSBnZXRQcm9qZWN0cyhAUXVlcnlQYXJhbSgiZGV0YWlsZWQiKSBmaW5hbCBib29sZWFuIGlzRGV0YWlsZWQpIHsKKyAgICAgICAgcmV0dXJuIFJlc3BvbnNlCisgICAgICAgICAgICAgICAgLm9rKCkKKyAgICAgICAgICAgICAgICAuZW50aXR5KG5ldyBHZW5lcmljRW50aXR5Jmx0O0xpc3QmbHQ7UHJvamVjdCZndDsmZ3Q7KEVudGl0eVN0b3JlLmdldFByb2plY3RzKCkpIHt9LAorICAgICAgICAgICAgICAgICAgICAgICAgaXNEZXRhaWxlZCA/IG5ldyBBbm5vdGF0aW9uW117UHJvamVjdERldGFpbGVkVmlldy5GYWN0b3J5LmdldCgpfSA6IG5ldyBBbm5vdGF0aW9uWzBdKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgIH0KK308L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKworICAgICAgICAgICAgICAgIEFubm90YXRpbmcgYSByZXNvdXJjZSBtZXRob2QgLyBjbGFzcyBpcyB0eXBpY2FsbHkgZWFzaWVyIGFsdGhvdWdoIGl0IGlzIGxlc3MgZmxleGlibGUgYW5kIG1heSByZXF1aXJlIG1vcmUKKyAgICAgICAgICAgICAgICByZXNvdXJjZSBtZXRob2RzIHRvIGJlIGNyZWF0ZWQgdG8gY292ZXIgYWxsIHRoZSBhbHRlcm5hdGl2ZSB1c2UgY2FzZSBzY2VuYXJpb3MuIEZvciBleGFtcGxlOgorCisgICAgICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5Qcm9qZWN0c1Jlc291cmNlIC0gRW50aXR5LWZpbHRlcmluZyBhbm5vdGF0aW9ucyBvbiBtZXRob2RzPC90aXRsZT4KKworICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5AUGF0aCgicHJvamVjdHMiKQorQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9qc29uIikKK3B1YmxpYyBjbGFzcyBQcm9qZWN0c1Jlc291cmNlIHsKKworICAgIEBHRVQKKyAgICBwdWJsaWMgTGlzdCZsdDtQcm9qZWN0Jmd0OyBnZXRQcm9qZWN0cygpIHsKKyAgICAgICAgcmV0dXJuIGdldERldGFpbGVkUHJvamVjdHMoKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImRldGFpbGVkIikKKyAgICBAUHJvamVjdERldGFpbGVkVmlldworICAgIHB1YmxpYyBMaXN0Jmx0O1Byb2plY3QmZ3Q7IGdldERldGFpbGVkUHJvamVjdHMoKSB7CisgICAgICAgIHJldHVybiBFbnRpdHlTdG9yZS5nZXRQcm9qZWN0cygpOworICAgIH0KK308L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKworICAgICAgICAgICAgICAgIFRvIHNlZSBob3cgZW50aXR5LWZpbHRlcmluZyBzY29wZXMgY2FuIGJlIGFwcGxpZWQgdXNpbmcgYSAmbGl0LmpheHJzLmNvcmUuQ29uZmlndXJhdGlvbjsgcHJvcGVydHksCisgICAgICAgICAgICAgICAgc2VlIHRoZSA8eHJlZiBsaW5rZW5kPSJlZi5leGFtcGxlLnNlcnZlci5yZWdpc3RyYXRpb24iLz4gZXhhbXBsZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFdoZW4gYSA8bGl0ZXJhbD5Qcm9qZWN0PC9saXRlcmFsPiBtb2RlbCBmcm9tIHRoZSBleGFtcGxlIGFib3ZlIGlzIHJlcXVlc3RlZCBpbiBhIHNjb3BlIHJlcHJlc2VudGVkIGJ5CisgICAgICAgICAgICAgICAgPGxpdGVyYWw+QFByb2plY3REZXRhaWxlZFZpZXc8L2xpdGVyYWw+IGVudGl0eS1maWx0ZXJpbmcgYW5ub3RhdGlvbiwgdGhlIDxsaXRlcmFsPlByb2plY3Q8L2xpdGVyYWw+IG1vZGVsCisgICAgICAgICAgICAgICAgZGF0YSBzZW50IG92ZXIgdGhlIHdpcmUgd291bGQgY29udGFpbjoKKworICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPlByb2plY3Q8L2xpdGVyYWw+IC0gPGxpdGVyYWw+aWQ8L2xpdGVyYWw+LCA8bGl0ZXJhbD5uYW1lPC9saXRlcmFsPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5kZXNjcmlwdGlvbjwvbGl0ZXJhbD4sIDxsaXRlcmFsPnRhc2tzPC9saXRlcmFsPiwgPGxpdGVyYWw+dXNlcnM8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPlRhc2s8L2xpdGVyYWw+IC0gPGxpdGVyYWw+aWQ8L2xpdGVyYWw+LCA8bGl0ZXJhbD5uYW1lPC9saXRlcmFsPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5kZXNjcmlwdGlvbjwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+VXNlcjwvbGl0ZXJhbD4gLSA8bGl0ZXJhbD5pZDwvbGl0ZXJhbD4sIDxsaXRlcmFsPm5hbWU8L2xpdGVyYWw+LCA8bGl0ZXJhbD5lbWFpbDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKworICAgICAgICAgICAgICAgIE9yLCB0byBpbGx1c3RyYXRlIHRoaXMgaW4gSlNPTiBmb3JtYXQ6CisKKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9InhtbCIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPnsKKyAgICJkZXNjcmlwdGlvbiIgOiAiSmVyc2V5IGlzIHRoZSBvcGVuIHNvdXJjZSAodW5kZXIgZHVhbCBFUEwrR1BMIGxpY2Vuc2UpIEpBWC1SUyAyLjEgKEpTUiAzNzApIHByb2R1Y3Rpb24gcXVhbGl0eSBSZWZlcmVuY2UgSW1wbGVtZW50YXRpb24gZm9yIGJ1aWxkaW5nIFJFU1RmdWwgV2ViIHNlcnZpY2VzLiIsCisgICAiaWQiIDogMSwKKyAgICJuYW1lIiA6ICJKZXJzZXkiLAorICAgInRhc2tzIiA6IFsgeworICAgICAgImRlc2NyaXB0aW9uIiA6ICJFbnRpdHkgRGF0YSBGaWx0ZXJpbmciLAorICAgICAgImlkIiA6IDEsCisgICAgICAibmFtZSIgOiAiRU5UX0ZMVCIKKyAgIH0sIHsKKyAgICAgICJkZXNjcmlwdGlvbiIgOiAiT0F1dGggMSArIDIiLAorICAgICAgImlkIiA6IDIsCisgICAgICAibmFtZSIgOiAiT0FVVEgiCisgICB9IF0sCisgICAidXNlcnMiIDogWyB7CisgICAgICAiZW1haWwiIDogInZlcnlAc2VjcmV0LmNvbSIsCisgICAgICAiaWQiIDogMSwKKyAgICAgICJuYW1lIiA6ICJKZXJzZXkgUm9ib3QiCisgICB9IF0KK308L3Byb2dyYW1saXN0aW5nPgorCisgICAgICAgICAgICAgICAgRm9yIHRoZSA8ZW1waGFzaXM+ZGVmYXVsdCBlbnRpdHktZmlsdGVyaW5nIHNjb3BlPC9lbXBoYXNpcz4gdGhlIGZpbHRlcmVkIG1vZGVsIHdvdWxkIGxvb2sgbGlrZToKKworICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPlByb2plY3Q8L2xpdGVyYWw+IC0gPGxpdGVyYWw+aWQ8L2xpdGVyYWw+LCA8bGl0ZXJhbD5uYW1lPC9saXRlcmFsPiwgPGxpdGVyYWw+ZGVzY3JpcHRpb248L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisKKyAgICAgICAgICAgICAgICBPciBpbiBKU09OIGZvcm1hdDoKKworICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0ieG1sIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+eworICAgImRlc2NyaXB0aW9uIiA6ICJKZXJzZXkgaXMgdGhlIG9wZW4gc291cmNlICh1bmRlciBkdWFsIEVQTCtHUEwgbGljZW5zZSkgSkFYLVJTIDIuMSAoSlNSIDM3MCkgcHJvZHVjdGlvbiBxdWFsaXR5IFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiBmb3IgYnVpbGRpbmcgUkVTVGZ1bCBXZWIgc2VydmljZXMuIiwKKyAgICJpZCIgOiAxLAorICAgIm5hbWUiIDogIkplcnNleSIKK308L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICA8dGl0bGU+Q2xpZW50LXNpZGUgRW50aXR5IEZpbHRlcmluZzwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEFzIG1lbnRpb25lZCBhYm92ZSB5b3UgY2FuIGRlZmluZSBhcHBsaWVkIGVudGl0eS1maWx0ZXJpbmcgc2NvcGVzIHVzaW5nIGEgcHJvcGVydHkgc2V0IGVpdGhlciBpbiB0aGUgY2xpZW50CisgICAgICAgICAgICAgICAgcnVuLXRpbWUgJmxpdC5qYXhycy5jb3JlLkNvbmZpZ3VyYXRpb247IChzZWUgPHhyZWYgbGlua2VuZD0iZWYuZXhhbXBsZS5jbGllbnQucmVnaXN0cmF0aW9uIi8+KSBvciBieQorICAgICAgICAgICAgICAgIHBhc3NpbmcgdGhlIGVudGl0eS1maWx0ZXJpbmcgYW5ub3RhdGlvbnMgZHVyaW5nIGEgY3JlYXRpb24gb2YgYW4gaW5kaXZpZHVhbCByZXF1ZXN0IHRvIGJlIHNlbnQgdG8gc2VydmVyLgorCisgICAgICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5DbGllbnQgLSBSZXF1ZXN0IGVudGl0eS1maWx0ZXJpbmcgYW5ub3RhdGlvbnM8L3RpdGxlPgorCisgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPkNsaWVudEJ1aWxkZXIubmV3Q2xpZW50KGNvbmZpZykKKyAgICAudGFyZ2V0KHVyaSkKKyAgICAucmVxdWVzdCgpCisgICAgLnBvc3QoRW50aXR5LmVudGl0eShwcm9qZWN0LCBuZXcgQW5ub3RhdGlvbltdIHtQcm9qZWN0RGV0YWlsZWRWaWV3LkZhY3RvcnkuZ2V0KCl9KSk7PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisKKyAgICAgICAgICAgICAgICBZb3UgY2FuIHVzZSB0aGUgbWVudGlvbmVkIG1ldGhvZCB3aXRoIGNsaWVudCBpbmplY3RlZCBpbnRvIGEgcmVzb3VyY2UgYXMgd2VsbC4KKworICAgICAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgICAgICA8dGl0bGU+Q2xpZW50IC0gUmVxdWVzdCBlbnRpdHktZmlsdGVyaW5nIGFubm90YXRpb25zPC90aXRsZT4KKworICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5AUGF0aCgiY2xpZW50cyIpCitAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2pzb24iKQorcHVibGljIGNsYXNzIENsaWVudHNSZXNvdXJjZSB7CisKKyAgICBAVXJpKCJwcm9qZWN0cyIpCisgICAgcHJpdmF0ZSBXZWJUYXJnZXQgdGFyZ2V0OworCisgICAgQEdFVAorICAgIHB1YmxpYyBMaXN0Jmx0O1Byb2plY3QmZ3Q7IGdldFByb2plY3RzKCkgeworICAgICAgICByZXR1cm4gdGFyZ2V0LnJlcXVlc3QoKQorICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eShwcm9qZWN0LCBuZXcgQW5ub3RhdGlvbltdIHtQcm9qZWN0RGV0YWlsZWRWaWV3LkZhY3RvcnkuZ2V0KCl9KSk7CisgICAgfQorfTwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24geG1sOmlkPSJlZi5zZWN1cml0eS5hbm5vdGF0aW9ucyI+CisgICAgICAgIDx0aXRsZT5Sb2xlLWJhc2VkIEVudGl0eSBGaWx0ZXJpbmcgdXNpbmcgKDxsaXRlcmFsPmphdmF4LmFubm90YXRpb24uc2VjdXJpdHk8L2xpdGVyYWw+KSBhbm5vdGF0aW9uczwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBGaWx0ZXJpbmcgdGhlIGNvbnRlbnQgc2VudCB0byB0aGUgY2xpZW50IChvciBzZXJ2ZXIpIGJhc2VkIG9uIHRoZSBhdXRob3JpemVkIHNlY3VyaXR5IHJvbGVzIGlzIGEgY29tbW9ubHkKKyAgICAgICAgICAgIHJlcXVpcmVkIHVzZSBjYXNlLiBCeSByZWdpc3RlcmluZyAmamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLlNlY3VyaXR5RW50aXR5RmlsdGVyaW5nRmVhdHVyZTsgeW91IGNhbgorICAgICAgICAgICAgbGV2ZXJhZ2UgdGhlIEplcnNleSBFbnRpdHkgRmlsdGVyaW5nIGZhY2lsaXR5IGluIGNvbm5lY3Rpb24gd2l0aCBzdGFuZGFyZAorICAgICAgICAgICAgPGxpdGVyYWw+amF2YXguYW5ub3RhdGlvbi5zZWN1cml0eTwvbGl0ZXJhbD4gYW5ub3RhdGlvbnMgZXhhY3RseSB0aGUgc2FtZSB3YXkgYXMgeW91IHdvdWxkIHdpdGggY3VzdG9tCisgICAgICAgICAgICBlbnRpdHktZmlsdGVyaW5nIGFubm90YXRpb25zIGRlc2NyaWJlZCBpbiBwcmV2aW91cyBjaGFwdGVycy4gU3VwcG9ydGVkIHNlY3VyaXR5IGFubm90YXRpb25zIGFyZToKKworICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPiZqZWU2LmFubm90YXRpb25zLlBlcm1pdEFsbDssPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4mamVlNi5hbm5vdGF0aW9ucy5Sb2xlc0FsbG93ZWQ7LCBhbmQ8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPiZqZWU2LmFubm90YXRpb25zLkRlbnlBbGw7PC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEFsdGhvdWdoIHRoZSBtZWNoYW5pY3Mgb2YgdGhlIEVudGl0eSBEYXRhIEZpbHRlcmluZyBmZWF0dXJlIHVzZWQgZm9yIHRoZSBzZWN1cml0eSBhbm5vdGF0aW9uLWJhc2VkIGZpbHRlcmluZyBpcworICAgICAgICAgICAgdGhlIHNhbWUgYXMgd2l0aCB0aGUgZW50aXR5LWZpbHRlcmluZyBhbm5vdGF0aW9ucywgdGhlIHByb2Nlc3Npbmcgb2Ygc2VjdXJpdHkgYW5ub3RhdGlvbnMgZGlmZmVycyBpbiBhIGZldyBpbXBvcnRhbnQKKyAgICAgICAgICAgIGFzcGVjdHM6CisKKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbSAmamF4cnMuY29yZS5TZWN1cml0eUNvbnRleHQ7IHNob3VsZCBiZSBzZXQgYnkgYSBjb250YWluZXIgcmVxdWVzdCBmaWx0ZXIgaW4gb3JkZXIgdG8gdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAmbGl0LmplZTYuYW5ub3RhdGlvbnMuUm9sZXNBbGxvd2VkOyBmb3Igcm9sZS1iYXNlZCBmaWx0ZXJpbmcgb2YgZG9tYWluIG1vZGVsIGRhdGEgKHNlcnZlci1zaWRlKQorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgVGhlcmUgaXMgbm8gbmVlZCB0byBwcm92aWRlIGVudGl0eS1maWx0ZXJpbmcgKG9yIHNlY3VyaXR5KSBhbm5vdGF0aW9ucyBvbiByZXNvdXJjZSBtZXRob2RzIGluIG9yZGVyIHRvCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmUgZW50aXR5LWZpbHRlcmluZyBzY29wZXMgZm9yICZsaXQuamVlNi5hbm5vdGF0aW9ucy5Sb2xlc0FsbG93ZWQ7IHRoYXQgaXMgYXBwbGllZCB0byB0aGUgZG9tYWluIG1vZGVsCisgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzLCBhcyBhbGwgdGhlIGF2YWlsYWJsZSByb2xlcyBmb3IgdGhlIGN1cnJlbnQgdXNlciBhcmUgYXV0b21hdGljYWxseSBkZXRlcm1pbmVkIHVzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgcHJvdmlkZWQgJmxpdC5qYXhycy5jb3JlLlNlY3VyaXR5Q29udGV4dDsgKHNlcnZlci1zaWRlIG9ubHkpLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorCisgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgSW5zdGFuY2VzIG9mIHNlY3VyaXR5IGFubm90YXRpb25zICh0byBiZSB1c2VkIGZvciBwcm9ncmFtbWF0aWNhbGx5IGRlZmluZWQgc2NvcGVzIGVpdGhlciBvbiBjbGllbnQgb3Igc2VydmVyKQorICAgICAgICAgICAgICAgICAgICBjYW4gYmUgY3JlYXRlZCB1c2luZyBvbmUgb2YgdGhlIG1ldGhvZHMgaW4gdGhlICZqZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuU2VjdXJpdHlBbm5vdGF0aW9uczsgZmFjdG9yeSBjbGFzcworICAgICAgICAgICAgICAgICAgICB0aGF0IGlzIHBhcnQgb2YgdGhlIEplcnNleSBFbnRpdHkgRmlsdGVyaW5nIEFQSS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L25vdGU+CisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiB4bWw6aWQ9ImVmLnNlbGVjdGFibGUuYW5ub3RhdGlvbnMiPgorICAgICAgICA8dGl0bGU+RW50aXR5IEZpbHRlcmluZyBiYXNlZCBvbiBkeW5hbWljIGFuZCBjb25maWd1cmFibGUgcXVlcnkgcGFyYW1ldGVyczwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgRmlsdGVyaW5nIHRoZSBjb250ZW50IHNlbnQgdG8gdGhlIGNsaWVudCAob3Igc2VydmVyKSBkeW5hbWljYWxseSBiYXNlZCBvbiBxdWVyeSBwYXJhbWV0ZXJzIGlzIGFub3RoZXIgY29tbW9ubHkKKyAgICAgICAgICAgIHJlcXVpcmVkIHVzZSBjYXNlLiBCeSByZWdpc3RlcmluZyAmamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLlNlbGVjdGFibGVFbnRpdHlGaWx0ZXJpbmdGZWF0dXJlOyB5b3UgY2FuCisgICAgICAgICAgICBsZXZlcmFnZSB0aGUgSmVyc2V5IEVudGl0eSBGaWx0ZXJpbmcgZmFjaWxpdHkgaW4gY29ubmVjdGlvbiB3aXRoIHF1ZXJ5IHBhcmFtZXRlcnMgZXhhY3RseSB0aGUgc2FtZSB3YXkgYXMgeW91IHdvdWxkIHdpdGggY3VzdG9tCisgICAgICAgICAgICBlbnRpdHktZmlsdGVyaW5nIGFubm90YXRpb25zIGRlc2NyaWJlZCBpbiBwcmV2aW91cyBjaGFwdGVycy4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5TZXZlciAtIFF1ZXJ5IFBhcmFtZXRlciBkcml2ZW4gZW50aXR5LWZpbHRlcmluZzwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+QFhtbFJvb3RFbGVtZW50CitwdWJsaWMgY2xhc3MgQWRkcmVzcyB7CisKKyAgICBwcml2YXRlIFN0cmluZyBzdHJlZXRBZGRyZXNzOworCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVnaW9uOworCisgICAgcHJpdmF0ZSBQaG9uZU51bWJlciBwaG9uZU51bWJlcjsKK308L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFF1ZXJ5IHBhcmFtZXRlcnMgYXJlIHN1cHBvcnRlZCBpbiBjb21tYSBkZWxpbWl0ZWQgImRvdCBub3RhdGlvbiIgc3R5bGUgc2ltaWxhciB0byA8bGl0ZXJhbD5CZWFuSW5mbzwvbGl0ZXJhbD4gb2JqZWN0cworICAgICAgICAgICAgYW5kIFNwcmluZyBwYXRoIGV4cHJlc3Npb25zLiBBcyBhbiBleGFtcGxlLCB0aGUgZm9sbG93aW5nIFVSTDoKKyAgICAgICAgICAgIDxsaXRlcmFsPmh0dHA6Ly9qZXJzZXkuZXhhbXBsZS5jb20vYWRkcmVzc2VzLzUxMjM0P3NlbGVjdD1yZWdpb24sc3RyZWV0QWRkcmVzczwvbGl0ZXJhbD4gbWF5IHJlbmRlciBvbmx5IHRoZSBhZGRyZXNzJ3MKKyAgICAgICAgICAgIHJlZ2lvbiBhbmQgc3RyZWV0IGFkZHJlc3MgcHJvcGVydGllcyBhcyBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0ieG1sIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+eworICAgInJlZ2lvbiIgOiAiQ0EiLAorICAgInN0cmVldEFkZHJlc3MiIDogIjEyMzQgRmFrZSBTdC4iCit9PC9wcm9ncmFtbGlzdGluZz4KKyAgICA8L2V4YW1wbGU+CisKKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiB4bWw6aWQ9ImVmLmN1c3RvbS5hbm5vdGF0aW9ucyI+CisgICAgICAgIDx0aXRsZT5EZWZpbmluZyBjdXN0b20gaGFuZGxpbmcgZm9yIGVudGl0eS1maWx0ZXJpbmcgYW5ub3RhdGlvbnM8L3RpdGxlPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVG8gY3JlYXRlIGEgY3VzdG9tIGVudGl0eS1maWx0ZXJpbmcgYW5ub3RhdGlvbiB3aXRoIHNwZWNpYWwgaGFuZGxpbmcsIGkuZS4gYW4gZmllbGQgYWdncmVnYXRvciBhbm5vdGF0aW9uIHVzZWQKKyAgICAgICAgICAgIHRvIGFubm90YXRlIGNsYXNzZXMgbGlrZSB0aGUgb25lIGluIDx4cmVmIGxpbmtlbmQ9ImVmLmN1c3RvbS5hbm5vdGF0aW9ucy5hbm5vdGF0aW9uIi8+IGl0IGlzLCBpbiBtb3N0IGNhc2VzLAorICAgICAgICAgICAgc3VmZmljaWVudCB0byBpbXBsZW1lbnQgYW5kIHJlZ2lzdGVyIHRoZSBmb2xsb3dpbmcgU1BJIGNvbnRyYWN0czoKKworICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPiZqZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuRW50aXR5UHJvY2Vzc29yOzwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+SW1wbGVtZW50YXRpb25zIG9mIHRoaXMgU1BJIGFyZSBpbnZva2VkIHRvIHByb2Nlc3MgZW50aXR5IGNsYXNzIGFuZCBpdCdzIG1lbWJlcnMuIEN1c3RvbQorICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb25zIGNhbiBleHRlbmQgZnJvbSAmamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLkFic3RyYWN0RW50aXR5UHJvY2Vzc29yOy48L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPiZqZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuU2NvcGVSZXNvbHZlcjs8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPkltcGxlbWVudGF0aW9ucyBvZiB0aGlzIFNQSSBhcmUgaW52b2tlZCB0byByZXRyaWV2ZSBlbnRpdHktZmlsdGVyaW5nIHNjb3BlcyBmcm9tIGFuIGFycmF5IG9mCisgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlZCBhbm5vdGF0aW9ucy48L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorCisgICAgICAgICAgICA8ZXhhbXBsZSB4bWw6aWQ9ImVmLmN1c3RvbS5hbm5vdGF0aW9ucy5hbm5vdGF0aW9uIj4KKyAgICAgICAgICAgICAgICAgICAgPHRpdGxlPkVudGl0eS1maWx0ZXJpbmcgYW5ub3RhdGlvbiB3aXRoIGN1c3RvbSBtZWFuaW5nPC90aXRsZT4KKworICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5AVGFyZ2V0KHtFbGVtZW50VHlwZS5UWVBFfSkKK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitARW50aXR5RmlsdGVyaW5nCitwdWJsaWMgQGludGVyZmFjZSBGaWx0ZXJpbmdBZ2dyZWdhdG9yIHsKKworICAgIC8qKgorICAgICAqIEVudGl0eS1maWx0ZXJpbmcgc2NvcGUgdG8gYWRkIGdpdmVuIGZpZWxkcyB0by4KKyAgICAgKi8KKyAgICBBbm5vdGF0aW9uIGZpbHRlcmluZ1Njb3BlKCk7CisKKyAgICAvKioKKyAgICAgKiBGaWVsZHMgdG8gYmUgYSBwYXJ0IG9mIHRoZSBlbnRpdHktZmlsdGVyaW5nIHNjb3BlLgorICAgICAqLworICAgIFN0cmluZ1tdIGZpZWxkcygpOworfTwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8L3BhcmE+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24geG1sOmlkPSJlZi5jdXN0b20ucHJvdmlkZXJzIj4KKyAgICAgICAgPHRpdGxlPlN1cHBvcnRpbmcgRW50aXR5IERhdGEgRmlsdGVyaW5nIGluIGN1c3RvbSBlbnRpdHkgcHJvdmlkZXJzIG9yIGZyYW1ld29ya3M8L3RpdGxlPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVG8gc3VwcG9ydCBFbnRpdHkgRGF0YSBGaWx0ZXJpbmcgaW4gY3VzdG9tIGVudGl0eSBwcm92aWRlcnMgKGUuZy4gYXMgaW4gPHhyZWYgbGlua2VuZD0iZWYubW9kdWxlcy5jdXN0b20iLz4pLAorICAgICAgICAgICAgaXQgaXMgc3VmZmljaWVudCBpbiBtb3N0IG9mIHRoZSBjYXNlcyB0byBpbXBsZW1lbnQgYW5kIHJlZ2lzdGVyIHRoZSBmb2xsb3dpbmcgU1BJIGNvbnRyYWN0czoKKworICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPiZqZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuT2JqZWN0UHJvdmlkZXI7PC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRvIGJlIGFibGUgdG8gb2J0YWluIGFuIGluc3RhbmNlIG9mIGEgZmlsdGVyaW5nIG9iamVjdCBtb2RlbCB5b3VyIHByb3ZpZGVyIHVuZGVyc3RhbmRzIGFuZCBjYW4gYWN0IG9uLgorICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGltcGxlbWVudGF0aW9ucyBjYW4gZXh0ZW5kICZqZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuQWJzdHJhY3RPYmplY3RQcm92aWRlcjsuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+JmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5PYmplY3RHcmFwaFRyYW5zZm9ybWVyOzwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICBUbyB0cmFuc2Zvcm0gYSByZWFkLW9ubHkgZ2VuZXJpYyByZXByZXNlbnRhdGlvbiBvZiBhIGRvbWFpbiBvYmplY3QgbW9kZWwgZ3JhcGggdG8gYmUgcHJvY2Vzc2VkIGludG8KKyAgICAgICAgICAgICAgICAgICAgICAgIGFuIGVudGl0eS1maWx0ZXJpbmcgb2JqZWN0IG1vZGVsIHlvdXIgcHJvdmlkZXIgdW5kZXJzdGFuZHMgYW5kIGNhbiBhY3Qgb24uIFRoZSBpbXBsZW1lbnRhdGlvbnMgY2FuCisgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmQgJmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5BYnN0cmFjdE9iamVjdFByb3ZpZGVyOy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKworICAgICAgICAgICAgPGV4YW1wbGUgeG1sOmlkPSJlZi5tb2R1bGVzLmN1c3RvbSI+CisgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5FbnRpdHkgRGF0YSBGaWx0ZXJpbmcgc3VwcG9ydCBpbiBNT1h5IEpTT04gYmluZGluZyBwcm92aWRlcjwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+QFNpbmdsZXRvbgorcHVibGljIGNsYXNzIEZpbHRlcmluZ01veHlKc29uUHJvdmlkZXIgZXh0ZW5kcyBDb25maWd1cmFibGVNb3h5SnNvblByb3ZpZGVyIHsKKworICAgIEBJbmplY3QKKyAgICBwcml2YXRlIFByb3ZpZGVyJmx0O09iamVjdFByb3ZpZGVyJmx0O09iamVjdEdyYXBoJmd0OyZndDsgcHJvdmlkZXI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBwcmVXcml0ZVRvKGZpbmFsIE9iamVjdCBvYmplY3QsIGZpbmFsIENsYXNzJmx0Oz8mZ3Q7IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUsIGZpbmFsIE11bHRpdmFsdWVkTWFwJmx0O1N0cmluZywgT2JqZWN0Jmd0OyBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1hcnNoYWxsZXIgbWFyc2hhbGxlcikgdGhyb3dzIEpBWEJFeGNlcHRpb24geworICAgICAgICBzdXBlci5wcmVXcml0ZVRvKG9iamVjdCwgdHlwZSwgZ2VuZXJpY1R5cGUsIGFubm90YXRpb25zLCBtZWRpYVR5cGUsIGh0dHBIZWFkZXJzLCBtYXJzaGFsbGVyKTsKKworICAgICAgICAvLyBFbnRpdHkgRmlsdGVyaW5nLgorICAgICAgICBpZiAobWFyc2hhbGxlci5nZXRQcm9wZXJ0eShNYXJzaGFsbGVyUHJvcGVydGllcy5PQkpFQ1RfR1JBUEgpID09IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIE9iamVjdCBvYmplY3RHcmFwaCA9IHByb3ZpZGVyLmdldCgpLmdldEZpbHRlcmluZ09iamVjdChnZW5lcmljVHlwZSwgdHJ1ZSwgYW5ub3RhdGlvbnMpOworCisgICAgICAgICAgICBpZiAob2JqZWN0R3JhcGggIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG1hcnNoYWxsZXIuc2V0UHJvcGVydHkoTWFyc2hhbGxlclByb3BlcnRpZXMuT0JKRUNUX0dSQVBILCBvYmplY3RHcmFwaCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBwcmVSZWFkRnJvbShmaW5hbCBDbGFzcyZsdDtPYmplY3QmZ3Q7IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLCBmaW5hbCBNdWx0aXZhbHVlZE1hcCZsdDtTdHJpbmcsIFN0cmluZyZndDsgaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVW5tYXJzaGFsbGVyIHVubWFyc2hhbGxlcikgdGhyb3dzIEpBWEJFeGNlcHRpb24geworICAgICAgICBzdXBlci5wcmVSZWFkRnJvbSh0eXBlLCBnZW5lcmljVHlwZSwgYW5ub3RhdGlvbnMsIG1lZGlhVHlwZSwgaHR0cEhlYWRlcnMsIHVubWFyc2hhbGxlcik7CisKKyAgICAgICAgLy8gRW50aXR5IEZpbHRlcmluZy4KKyAgICAgICAgaWYgKHVubWFyc2hhbGxlci5nZXRQcm9wZXJ0eShNYXJzaGFsbGVyUHJvcGVydGllcy5PQkpFQ1RfR1JBUEgpID09IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIE9iamVjdCBvYmplY3RHcmFwaCA9IHByb3ZpZGVyLmdldCgpLmdldEZpbHRlcmluZ09iamVjdChnZW5lcmljVHlwZSwgZmFsc2UsIGFubm90YXRpb25zKTsKKworICAgICAgICAgICAgaWYgKG9iamVjdEdyYXBoICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB1bm1hcnNoYWxsZXIuc2V0UHJvcGVydHkoTWFyc2hhbGxlclByb3BlcnRpZXMuT0JKRUNUX0dSQVBILCBvYmplY3RHcmFwaCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiB4bWw6aWQ9ImVmLm1vZHVsZXMiPgorICAgICAgICA8dGl0bGU+TW9kdWxlcyB3aXRoIHN1cHBvcnQgZm9yIEVudGl0eSBEYXRhIEZpbHRlcmluZzwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBMaXN0IG9mIG1vZHVsZXMgZnJvbSBKZXJzZXkgd29ya3NwYWNlIHRoYXQgc3VwcG9ydCBFbnRpdHkgRmlsdGVyaW5nOgorCisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSdqc29uLm1veHknPk1PWHk8L2xpbms+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSdqc29uLmphY2tzb24nPkphY2tzb24gKDIueCk8L2xpbms+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBJbiBvcmRlciB0byB1c2UgRW50aXR5IEZpbHRlcmluZyBpbiBtZW50aW9uZWQgbW9kdWxlcyB5b3UgbmVlZCB0byBleHBsaWNpdGx5IHJlZ2lzdGVyIGVpdGhlcgorICAgICAgICAgICAgJmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5FbnRpdHlGaWx0ZXJpbmdGZWF0dXJlOywgJmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5TZWN1cml0eUVudGl0eUZpbHRlcmluZ0ZlYXR1cmU7CisgICAgICAgICAgICBvciAmamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLlNlbGVjdGFibGVFbnRpdHlGaWx0ZXJpbmdGZWF0dXJlOyB0byBhY3RpdmF0ZSBFbnRpdHkgRmlsdGVyaW5nIGZvciBwYXJ0aWN1bGFyIG1vZHVsZS4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uPgorICAgICAgICA8dGl0bGU+RXhhbXBsZXM8L3RpdGxlPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVG8gc2VlIGEgY29tcGxldGUgd29ya2luZyBleGFtcGxlcyBvZiBlbnRpdHktZmlsdGVyaW5nIGZlYXR1cmUgcmVmZXIgdG8gdGhlOgorCisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+JmplcnNleS5naXRodWIuZWYuZXhhbXBsZS5saW5rOzwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+JmplcnNleS5naXRodWIuZWYuc2VjdXJpdHkuZXhhbXBsZS5saW5rOzwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+JmplcnNleS5naXRodWIuZWYuc2VsZWN0YWJsZS5leGFtcGxlLmxpbms7PC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKzwvY2hhcHRlcj4KZGlmZiAtLWdpdCBhL2RvY3Mvc3JjL21haW4vZG9jYm9vay9maWx0ZXJzLnhtbCBiL2RvY3Mvc3JjL21haW4vZG9jYm9vay9maWx0ZXJzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzFkNTFiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9zcmMvbWFpbi9kb2Nib29rL2ZpbHRlcnMueG1sCkBAIC0wLDAgKzEsNjc0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8IURPQ1RZUEUgY2hhcHRlciBbPCFFTlRJVFkgJSBlbnRzIFNZU1RFTSAiamVyc2V5LmVudCIgPiAlZW50czsgXT4KKzxjaGFwdGVyIHhtbG5zPSJodHRwOi8vZG9jYm9vay5vcmcvbnMvZG9jYm9vayIKKyAgICAgICAgIHZlcnNpb249IjUuMCIKKyAgICAgICAgIHhtbDpsYW5nPSJlbiIKKyAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKKyAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2RvY2Jvb2sub3JnL25zL2RvY2Jvb2sgaHR0cDovL2RvY2Jvb2sub3JnL3htbC81LjAveHNkL2RvY2Jvb2sueHNkIgorICAgICAgICAgeG1sOmlkPSJmaWx0ZXJzLWFuZC1pbnRlcmNlcHRvcnMiPgorICAgIDx0aXRsZT5GaWx0ZXJzIGFuZCBJbnRlcmNlcHRvcnM8L3RpdGxlPgorICAgIDxzZWN0aW9uPgorICAgICAgICA8dGl0bGU+SW50cm9kdWN0aW9uPC90aXRsZT4KKyAgICAgICAgPHBhcmE+VGhpcyBjaGFwdGVyIGRlc2NyaWJlcyBmaWx0ZXJzLCBpbnRlcmNlcHRvcnMgYW5kIHRoZWlyIGNvbmZpZ3VyYXRpb24uIEZpbHRlcnMgYW5kIGludGVyY2VwdG9ycworICAgICAgICAgICAgY2FuIGJlIHVzZWQgb24gYm90aCBzaWRlcywgb24gdGhlIGNsaWVudCBhbmQgdGhlIHNlcnZlciBzaWRlLiBGaWx0ZXJzIGNhbiBtb2RpZnkgaW5ib3VuZCBhbmQgb3V0Ym91bmQgcmVxdWVzdHMKKyAgICAgICAgICAgIGFuZCByZXNwb25zZXMgaW5jbHVkaW5nIG1vZGlmaWNhdGlvbiBvZiBoZWFkZXJzLCBlbnRpdHkgYW5kIG90aGVyIHJlcXVlc3QvcmVzcG9uc2UgcGFyYW1ldGVycy4gSW50ZXJjZXB0b3JzCisgICAgICAgICAgICBhcmUgdXNlZCBwcmltYXJpbHkgZm9yIG1vZGlmaWNhdGlvbiBvZiBlbnRpdHkgaW5wdXQgYW5kIG91dHB1dCBzdHJlYW1zLiBZb3UgY2FuIHVzZSBpbnRlcmNlcHRvcnMgZm9yIGV4YW1wbGUKKyAgICAgICAgICAgIHRvIHppcCBhbmQgdW56aXAgb3V0cHV0IGFuZCBpbnB1dCBlbnRpdHkgc3RyZWFtcy4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKworCisgICAgPHNlY3Rpb24+CisgICAgICAgIDx0aXRsZT5GaWx0ZXJzPC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBGaWx0ZXJzIGNhbiBiZSB1c2VkIHdoZW4geW91IHdhbnQgdG8gbW9kaWZ5IGFueSByZXF1ZXN0IG9yIHJlc3BvbnNlIHBhcmFtZXRlcnMgbGlrZSBoZWFkZXJzLiBGb3IgZXhhbXBsZQorICAgICAgICAgICAgeW91IHdvdWxkIGxpa2UgdG8gYWRkIGEgcmVzcG9uc2UgaGVhZGVyICJYLVBvd2VyZWQtQnkiIHRvIGVhY2ggZ2VuZXJhdGVkIHJlc3BvbnNlLiBJbnN0ZWFkIG9mIGFkZGluZyB0aGlzIGhlYWRlcgorICAgICAgICAgICAgaW4gZWFjaCByZXNvdXJjZSBtZXRob2QgeW91IHdvdWxkIHVzZSBhIHJlc3BvbnNlIGZpbHRlciB0byBhZGQgdGhpcyBoZWFkZXIuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaGVyZSBhcmUgZmlsdGVycyBvbiB0aGUgc2VydmVyIHNpZGUgYW5kIHRoZSBjbGllbnQgc2lkZS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFNlcnZlciBmaWx0ZXJzOgorICAgICAgICAgICAgPHNpbXBsZWxpc3Q+CisgICAgICAgICAgICAgICAgPG1lbWJlcj4mamF4cnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RGaWx0ZXI7CisgICAgICAgICAgICAgICAgPC9tZW1iZXI+CisgICAgICAgICAgICAgICAgPG1lbWJlcj4mamF4cnMuY29udGFpbmVyLkNvbnRhaW5lclJlc3BvbnNlRmlsdGVyOworICAgICAgICAgICAgICAgIDwvbWVtYmVyPgorICAgICAgICAgICAgPC9zaW1wbGVsaXN0PgorICAgICAgICAgICAgQ2xpZW50IGZpbHRlcnM6CisgICAgICAgICAgICA8c2ltcGxlbGlzdD4KKyAgICAgICAgICAgICAgICA8bWVtYmVyPiZqYXhycy5jbGllbnQuQ2xpZW50UmVxdWVzdEZpbHRlcjsKKyAgICAgICAgICAgICAgICA8L21lbWJlcj4KKyAgICAgICAgICAgICAgICA8bWVtYmVyPiZqYXhycy5jbGllbnQuQ2xpZW50UmVzcG9uc2VGaWx0ZXI7CisgICAgICAgICAgICAgICAgPC9tZW1iZXI+CisgICAgICAgICAgICA8L3NpbXBsZWxpc3Q+CisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8c2VjdGlvbj4KKyAgICAgICAgICAgIDx0aXRsZT5TZXJ2ZXIgZmlsdGVyczwvdGl0bGU+CisgICAgICAgICAgICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgYSBzaW1wbGUgY29udGFpbmVyIHJlc3BvbnNlIGZpbHRlciBhZGRpbmcgYSBoZWFkZXIgdG8gZWFjaCByZXNwb25zZS4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5Db250YWluZXIgcmVzcG9uc2UgZmlsdGVyPC90aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+aW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlc3BvbnNlRmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK3B1YmxpYyBjbGFzcyBQb3dlcmVkQnlSZXNwb25zZUZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCwgQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LmdldEhlYWRlcnMoKS5hZGQoIlgtUG93ZXJlZC1CeSIsICJKZXJzZXkgOi0pIik7CisgICAgfQorfTwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICAgICAgPC9wYXJhPgorCisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEluIHRoZSBleGFtcGxlIGFib3ZlIHRoZSA8bGl0ZXJhbD5Qb3dlcmVkQnlSZXNwb25zZUZpbHRlcjwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICBhbHdheXMgYWRkcyBhIGhlYWRlciAiWC1Qb3dlcmVkLUJ5IiB0byB0aGUKKyAgICAgICAgICAgICAgICByZXNwb25zZS4gVGhlIGZpbHRlciBtdXN0IGluaGVyaXQgZnJvbSB0aGUgJmpheHJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUZpbHRlcjsgYW5kIG11c3QgYmUgcmVnaXN0ZXJlZAorICAgICAgICAgICAgICAgIGFzIGEgcHJvdmlkZXIuIFRoZSBmaWx0ZXIgd2lsbCBiZSBleGVjdXRlZCBmb3IgZXZlcnkgcmVzcG9uc2Ugd2hpY2ggaXMgaW4gbW9zdCBjYXNlcyBhZnRlciB0aGUgcmVzb3VyY2UgbWV0aG9kCisgICAgICAgICAgICAgICAgaXMgZXhlY3V0ZWQuIFJlc3BvbnNlIGZpbHRlcnMgYXJlIGV4ZWN1dGVkIGV2ZW4gaWYgdGhlIHJlc291cmNlIG1ldGhvZCBpcyBub3QgcnVuLCBmb3IgZXhhbXBsZSB3aGVuCisgICAgICAgICAgICAgICAgdGhlIHJlc291cmNlIG1ldGhvZCBpcyBub3QgZm91bmQgYW5kIDQwNCAiTm90IGZvdW5kIiByZXNwb25zZSBjb2RlIGlzIHJldHVybmVkIGJ5IHRoZSBKZXJzZXkgcnVudGltZS4gSW4gdGhpcyBjYXNlCisgICAgICAgICAgICAgICAgdGhlIGZpbHRlciB3aWxsIGJlIGV4ZWN1dGVkIGFuZCB3aWxsIHByb2Nlc3MgdGhlIDQwNCByZXNwb25zZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoZSA8bGl0ZXJhbD5maWx0ZXIoKTwvbGl0ZXJhbD4gbWV0aG9kIGhhcyB0d28gYXJndW1lbnRzLCB0aGUgY29udGFpbmVyIHJlcXVlc3QgYW5kIGNvbnRhaW5lciByZXNwb25zZS4gVGhlCisgICAgICAgICAgICAgICAgJmpheHJzLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OyBpcyBhY2Nlc3NpYmxlIG9ubHkgZm9yIHJlYWQgb25seSBwdXJwb3NlcyBhcyB0aGUgZmlsdGVyIGlzIGV4ZWN1dGVkIGFscmVhZHkKKyAgICAgICAgICAgICAgICBpbiByZXNwb25zZSBwaGFzZS4gVGhlIG1vZGlmaWNhdGlvbnMgY2FuIGJlIGRvbmUgaW4gdGhlICZqYXhycy5Db250YWluZXJSZXNwb25zZUNvbnRleHQ7LgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgdGhlIHVzYWdlIG9mIGEgcmVxdWVzdCBmaWx0ZXIuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICA8dGl0bGU+Q29udGFpbmVyIHJlcXVlc3QgZmlsdGVyPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlNlY3VyaXR5Q29udGV4dDsKKworcHVibGljIGNsYXNzIEF1dGhvcml6YXRpb25SZXF1ZXN0RmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpCisgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgZmluYWwgU2VjdXJpdHlDb250ZXh0IHNlY3VyaXR5Q29udGV4dCA9CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LmdldFNlY3VyaXR5Q29udGV4dCgpOworICAgICAgICBpZiAoc2VjdXJpdHlDb250ZXh0ID09IG51bGwgfHwKKyAgICAgICAgICAgICAgICAgICAgIXNlY3VyaXR5Q29udGV4dC5pc1VzZXJJblJvbGUoInByaXZpbGVnZWQiKSkgeworCisgICAgICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuYWJvcnRXaXRoKFJlc3BvbnNlCisgICAgICAgICAgICAgICAgICAgIC5zdGF0dXMoUmVzcG9uc2UuU3RhdHVzLlVOQVVUSE9SSVpFRCkKKyAgICAgICAgICAgICAgICAgICAgLmVudGl0eSgiVXNlciBjYW5ub3QgYWNjZXNzIHRoZSByZXNvdXJjZS4iKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgIH0KKyAgICB9Cit9PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKworCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgcmVxdWVzdCBmaWx0ZXIgaXMgc2ltaWxhciB0byB0aGUgcmVzcG9uc2UgZmlsdGVyIGJ1dCBkb2VzIG5vdCBoYXZlIGFjY2VzcyB0byB0aGUgQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0CisgICAgICAgICAgICAgICAgYXMgbm8gcmVzcG9uc2UgaXMgYWNjZXNzaWJsZSB5ZXQuIFJlc3BvbnNlIGZpbHRlciBpbmhlcml0cyBmcm9tICZqYXhycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXI7LgorICAgICAgICAgICAgICAgIFJlcXVlc3QgZmlsdGVyIGlzIGV4ZWN1dGVkIGJlZm9yZSB0aGUgcmVzb3VyY2UgbWV0aG9kIGlzIHJ1biBhbmQgYmVmb3JlIHRoZQorICAgICAgICAgICAgICAgIHJlc3BvbnNlIGlzIGNyZWF0ZWQuIFRoZSBmaWx0ZXIgaGFzIHBvc3NpYmlsaXR5IHRvIG1hbmlwdWxhdGUgdGhlIHJlcXVlc3QgcGFyYW1ldGVycyBpbmNsdWRpbmcgcmVxdWVzdAorICAgICAgICAgICAgICAgIGhlYWRlcnMgb3IgZW50aXR5LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhlIDxsaXRlcmFsPkF1dGhvcml6YXRpb25SZXF1ZXN0RmlsdGVyPC9saXRlcmFsPiBpbiB0aGUgZXhhbXBsZSBjaGVja3Mgd2hldGhlciB0aGUKKyAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGVkIHVzZXIgaXMgaW4gdGhlIHByaXZpbGVnZWQgcm9sZS4gSWYgaXQgaXMgbm90IHRoZW4gdGhlIHJlcXVlc3QgaXMgPGVtcGhhc2lzPmFib3J0ZWQ8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgIGJ5IGNhbGxpbmcgPGxpdGVyYWw+Q29udGFpbmVyUmVxdWVzdENvbnRleHQuYWJvcnRXaXRoKFJlc3BvbnNlIHJlc3BvbnNlKTwvbGl0ZXJhbD4gbWV0aG9kLiBUaGUgbWV0aG9kCisgICAgICAgICAgICAgICAgaXMgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIGZyb20gdGhlIHJlcXVlc3QgZmlsdGVyIGluIHNpdHVhdGlvbiB3aGVuIHRoZSByZXF1ZXN0IHNob3VsZCBub3QgYmUgcHJvY2Vzc2VkIGZ1cnRoZXIgaW4gdGhlIHN0YW5kYXJkIHByb2Nlc3NpbmcgY2hhaW4uCisgICAgICAgICAgICAgICAgV2hlbiB0aGUgPGxpdGVyYWw+ZmlsdGVyPC9saXRlcmFsPiBtZXRob2QgaXMgZmluaXNoZWQgdGhlIHJlc3BvbnNlIHBhc3NlZCBhcyBhIHBhcmFtZXRlciB0byB0aGUKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbD5hYm9ydFdpdGg8L2xpdGVyYWw+IG1ldGhvZCBpcyB1c2VkIHRvIHJlc3BvbmQgdG8gdGhlIHJlcXVlc3QuIFJlc3BvbnNlIGZpbHRlcnMsIGlmIGFueSBhcmUgcmVnaXN0ZXJlZCwKKyAgICAgICAgICAgICAgICB3aWxsIGJlIGV4ZWN1dGVkIGFuZCB3aWxsIGhhdmUgcG9zc2liaWxpdHkgdG8gcHJvY2VzcyB0aGUgYWJvcnRlZCByZXNwb25zZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICAgICAgPHRpdGxlPlByZS1tYXRjaGluZyBhbmQgcG9zdC1tYXRjaGluZyBmaWx0ZXJzPC90aXRsZT4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEFsbCB0aGUgcmVxdWVzdCBmaWx0ZXJzIHNob3duIGFib3ZlIHdhcyBpbXBsZW1lbnRlZCBhcyBwb3N0LW1hdGNoaW5nIGZpbHRlcnMuIEl0IG1lYW5zIHRoYXQgdGhlIGZpbHRlcnMKKyAgICAgICAgICAgICAgICB3b3VsZCBiZSBhcHBsaWVkIG9ubHkgYWZ0ZXIgYSBzdWl0YWJsZSByZXNvdXJjZSBtZXRob2QgaGFzIGJlZW4gc2VsZWN0ZWQgdG8gcHJvY2VzcyB0aGUgYWN0dWFsIHJlcXVlc3QKKyAgICAgICAgICAgICAgICBpLmUuIGFmdGVyIHJlcXVlc3QgbWF0Y2hpbmcgaGFwcGVucy4gUmVxdWVzdCBtYXRjaGluZyBpcyB0aGUgcHJvY2VzcyBvZiBmaW5kaW5nIGEgcmVzb3VyY2UgbWV0aG9kIHRoYXQKKyAgICAgICAgICAgICAgICBzaG91bGQgYmUgZXhlY3V0ZWQgYmFzZWQgb24gdGhlIHJlcXVlc3QgcGF0aCBhbmQgb3RoZXIgcmVxdWVzdCBwYXJhbWV0ZXJzLiBTaW5jZSBwb3N0LW1hdGNoaW5nIHJlcXVlc3QKKyAgICAgICAgICAgICAgICBmaWx0ZXJzIGFyZSBpbnZva2VkIHdoZW4gYSBwYXJ0aWN1bGFyIHJlc291cmNlIG1ldGhvZCBoYXMgYWxyZWFkeSBiZWVuIHNlbGVjdGVkLCBzdWNoIGZpbHRlcnMgY2FuIG5vdAorICAgICAgICAgICAgICAgIGluZmx1ZW5jZSB0aGUgcmVzb3VyY2UgbWV0aG9kIG1hdGNoaW5nIHByb2Nlc3MuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUbyBvdmVyY29tZSB0aGUgYWJvdmUgZGVzY3JpYmVkIGxpbWl0YXRpb24sIHRoZXJlIGlzIGEgcG9zc2liaWxpdHkgdG8gbWFyaworICAgICAgICAgICAgICAgIGEgc2VydmVyIHJlcXVlc3QgZmlsdGVyIGFzIGEgPGVtcGhhc2lzPnByZS1tYXRjaGluZzwvZW1waGFzaXM+IGZpbHRlciwKKyAgICAgICAgICAgICAgICBpLmUuIHRvIGFubm90YXRlIHRoZSBmaWx0ZXIgY2xhc3Mgd2l0aCB0aGUgJmpheHJzLlByZW1hdGNoaW5nOyBhbm5vdGF0aW9uLgorICAgICAgICAgICAgICAgIFByZS1tYXRjaGluZyBmaWx0ZXJzIGFyZSByZXF1ZXN0IGZpbHRlcnMgdGhhdCBhcmUgZXhlY3V0ZWQgYmVmb3JlCisgICAgICAgICAgICAgICAgdGhlIHJlcXVlc3QgbWF0Y2hpbmcgaXMgc3RhcnRlZC4gVGhhbmtzIHRvIHRoaXMsIHByZS1tYXRjaGluZyByZXF1ZXN0IGZpbHRlcnMgaGF2ZQorICAgICAgICAgICAgICAgIHRoZSBwb3NzaWJpbGl0eSB0byBpbmZsdWVuY2Ugd2hpY2ggbWV0aG9kIHdpbGwgYmUgbWF0Y2hlZC4gU3VjaCBhIHByZS1tYXRjaGluZyByZXF1ZXN0IGZpbHRlciBleGFtcGxlIGlzIHNob3duCisgICAgICAgICAgICAgICAgaGVyZToKKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgICAgICA8dGl0bGU+UHJlLW1hdGNoaW5nIHJlcXVlc3QgZmlsdGVyPC90aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+Li4uCitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5QcmVNYXRjaGluZzsKKy4uLgorCitAUHJlTWF0Y2hpbmcKK3B1YmxpYyBjbGFzcyBQcmVNYXRjaGluZ0ZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KQorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gY2hhbmdlIGFsbCBQVVQgbWV0aG9kcyB0byBQT1NUCisgICAgICAgIGlmIChyZXF1ZXN0Q29udGV4dC5nZXRNZXRob2QoKS5lcXVhbHMoIlBVVCIpKSB7CisgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5zZXRNZXRob2QoIlBPU1QiKTsKKyAgICAgICAgfQorICAgIH0KK308L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoZSA8bGl0ZXJhbD5QcmVNYXRjaGluZ0ZpbHRlcjwvbGl0ZXJhbD4gaXMgYSBzaW1wbGUgcHJlLW1hdGNoaW5nIGZpbHRlciB3aGljaCBjaGFuZ2VzIGFsbCBQVVQgSFRUUAorICAgICAgICAgICAgICAgIG1ldGhvZHMgdG8gUE9TVC4gVGhpcyBtaWdodCBiZSB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byBhbHdheXMgaGFuZGxlIHRoZXNlIFBVVCBhbmQgUE9TVCBIVFRQIG1ldGhvZHMKKyAgICAgICAgICAgICAgICB3aXRoIHRoZSBzYW1lIEphdmEgY29kZS4gQWZ0ZXIgdGhlIDxsaXRlcmFsPlByZU1hdGNoaW5nRmlsdGVyPC9saXRlcmFsPiBoYXMgYmVlbiBpbnZva2VkLCB0aGUgcmVzdAorICAgICAgICAgICAgICAgIG9mIHRoZSByZXF1ZXN0IHByb2Nlc3Npbmcgd2lsbCBiZWhhdmUgYXMgaWYgdGhlIFBPU1QgSFRUUCBtZXRob2Qgd2FzIG9yaWdpbmFsbHkgdXNlZC4KKyAgICAgICAgICAgICAgICBZb3UgY2Fubm90IGRvIHRoaXMgaW4gcG9zdC1tYXRjaGluZyBmaWx0ZXJzCisgICAgICAgICAgICAgICAgKHN0YW5kYXJkIGZpbHRlcnMgd2l0aG91dCAmbGl0LmpheHJzLlByZW1hdGNoaW5nOyBhbm5vdGF0aW9uKQorICAgICAgICAgICAgICAgIGFzIHRoZSByZXNvdXJjZSBtZXRob2QgaXMgYWxyZWFkeSBtYXRjaGVkIChzZWxlY3RlZCkuIEFuIGF0dGVtcHQgdG8gdHdlYWsgdGhlIG9yaWdpbmFsIEhUVFAgbWV0aG9kIGluCisgICAgICAgICAgICAgICAgYSBwb3N0LW1hdGNoaW5nIGZpbHRlciB3b3VsZCBjYXVzZSBhbiA8bGl0ZXJhbD5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb248L2xpdGVyYWw+LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgQXMgd3JpdHRlbiBhYm92ZSwgcHJlLW1hdGNoaW5nIGZpbHRlcnMgY2FuIGZ1bGx5IGluZmx1ZW5jZSB0aGUgcmVxdWVzdCBtYXRjaGluZyBwcm9jZXNzLCB3aGljaCBtZWFucworICAgICAgICAgICAgICAgIHlvdSBjYW4gZXZlbiBtb2RpZnkgcmVxdWVzdCBVUkkgaW4gYSBwcmUtbWF0Y2hpbmcgZmlsdGVyIGJ5IGludm9raW5nCisgICAgICAgICAgICAgICAgdGhlIDxsaXRlcmFsPnNldFJlcXVlc3RVcmkoVVJJKTwvbGl0ZXJhbD4gbWV0aG9kIG9mICZsaXQuamF4cnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RGaWx0ZXI7CisgICAgICAgICAgICAgICAgc28gdGhhdCBhIGRpZmZlcmVudCByZXNvdXJjZSB3b3VsZCBiZSBtYXRjaGVkLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgTGlrZSBpbiBwb3N0LW1hdGNoaW5nIGZpbHRlcnMgeW91IGNhbiBhYm9ydCBhIHJlc3BvbnNlIGluIHByZS1tYXRjaGluZyBmaWx0ZXJzIHRvby4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24+CisgICAgICAgIDx0aXRsZT5DbGllbnQgZmlsdGVyczwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBDbGllbnQgZmlsdGVycyBhcmUgc2ltaWxhciB0byBjb250YWluZXIgZmlsdGVycy4gVGhlIHJlc3BvbnNlIGNhbiBhbHNvIGJlIGFib3J0ZWQKKyAgICAgICAgICAgICAgICBpbiB0aGUgJmpheHJzLmNsaWVudC5DbGllbnRSZXF1ZXN0RmlsdGVyOyB3aGljaCB3b3VsZCBjYXVzZSB0aGF0IG5vIHJlcXVlc3Qgd2lsbCBhY3R1YWxseSBiZSBzZW50IHRvIHRoZSBzZXJ2ZXIgYXQgYWxsLgorICAgICAgICAgICAgICAgIEEgbmV3IHJlc3BvbnNlIGlzIHBhc3NlZCB0byB0aGUgPGxpdGVyYWw+YWJvcnQ8L2xpdGVyYWw+IG1ldGhvZC4gVGhpcyByZXNwb25zZSB3aWxsIGJlIHVzZWQgYW5kIGRlbGl2ZXJlZAorICAgICAgICAgICAgICAgIGFzIGEgcmVzdWx0IG9mIHRoZSByZXF1ZXN0IGludm9jYXRpb24uIFN1Y2ggYSByZXNwb25zZSBnb2VzIHRocm91Z2ggdGhlIGNsaWVudCByZXNwb25zZSBmaWx0ZXJzLgorICAgICAgICAgICAgICAgIFRoaXMgaXMgc2ltaWxhciB0byB3aGF0IGhhcHBlbnMgb24gdGhlIHNlcnZlciBzaWRlLiBUaGUgcHJvY2VzcyBpcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgPHRpdGxlPkNsaWVudCByZXF1ZXN0IGZpbHRlcjwvdGl0bGU+CisgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPnB1YmxpYyBjbGFzcyBDaGVja1JlcXVlc3RGaWx0ZXIgaW1wbGVtZW50cyBDbGllbnRSZXF1ZXN0RmlsdGVyIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDbGllbnRSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChyZXF1ZXN0Q29udGV4dC5nZXRIZWFkZXJzKAorICAgICAgICAgICAgICAgICAgICAgICAgKS5nZXQoIkNsaWVudC1OYW1lIikgPT0gbnVsbCkgeworICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuYWJvcnRXaXRoKAorICAgICAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2Uuc3RhdHVzKFJlc3BvbnNlLlN0YXR1cy5CQURfUkVRVUVTVCkKKyAgICAgICAgICAgICAgICAuZW50aXR5KCJDbGllbnQtTmFtZSBoZWFkZXIgbXVzdCBiZSBkZWZpbmVkLiIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgICB9CisgICAgfQorfTwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhlIDxsaXRlcmFsPkNoZWNrUmVxdWVzdEZpbHRlcjwvbGl0ZXJhbD4gdmFsaWRhdGVzIHRoZSBvdXRnb2luZyByZXF1ZXN0LiBJdCBpcyBjaGVja2VkIGZvciBwcmVzZW5jZSBvZgorICAgICAgICAgICAgICAgIGEgPGxpdGVyYWw+Q2xpZW50LU5hbWU8L2xpdGVyYWw+IGhlYWRlci4gSWYgdGhlIGhlYWRlciBpcyBub3QgcHJlc2VudCB0aGUgcmVxdWVzdCB3aWxsIGJlIGFib3J0ZWQKKyAgICAgICAgICAgICAgICB3aXRoIGEgbWFkZSB1cCByZXNwb25zZSB3aXRoIGFuIGFwcHJvcHJpYXRlIGNvZGUgYW5kIG1lc3NhZ2UgaW4gdGhlIGVudGl0eSBib2R5LiBUaGlzIHdpbGwgY2F1c2UgdGhhdAorICAgICAgICAgICAgICAgIHRoZSBvcmlnaW5hbCByZXF1ZXN0IHdpbGwgbm90IGJlIGVmZmVjdGl2ZWx5IHNlbnQgdG8gdGhlIHNlcnZlciBidXQgdGhlIGFjdHVhbCBpbnZvY2F0aW9uCisgICAgICAgICAgICAgICAgd2lsbCBzdGlsbCBlbmQgdXAgd2l0aCBhIHJlc3BvbnNlIGFzIGlmIGl0IHdvdWxkIGJlIGdlbmVyYXRlZCBieSB0aGUKKyAgICAgICAgICAgICAgICBzZXJ2ZXIgc2lkZS4gSWYgdGhlcmUgd291bGQgYmUgYW55IGNsaWVudCByZXNwb25zZSBmaWx0ZXIgaXQgd291bGQgYmUgZXhlY3V0ZWQgb24gdGhpcyByZXNwb25zZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRvIHN1bW1hcml6ZSB0aGUgd29ya2Zsb3csIGZvciBhbnkgY2xpZW50IHJlcXVlc3QgaW52b2tlZCBmcm9tIHRoZSBjbGllbnQgQVBJCisgICAgICAgICAgICAgICAgdGhlIGNsaWVudCByZXF1ZXN0IGZpbHRlcnMgKCZqYXhycy5jbGllbnQuQ2xpZW50UmVxdWVzdEZpbHRlcjspCisgICAgICAgICAgICAgICAgYXJlIGV4ZWN1dGVkIHRoYXQgY291bGQgbWFuaXB1bGF0ZSB0aGUgcmVxdWVzdC4KKyAgICAgICAgICAgICAgICBJZiBub3QgYWJvcnRlZCwgdGhlIG91dGNvbWluZyByZXF1ZXN0IGlzIHRoZW4gcGh5c2ljYWxseSBzZW50IG92ZXIgdG8gdGhlIHNlcnZlciBzaWRlCisgICAgICAgICAgICAgICAgYW5kIG9uY2UgYSByZXNwb25zZSBpcyByZWNlaXZlZCBiYWNrIGZyb20gdGhlIHNlcnZlciB0aGUgY2xpZW50IHJlc3BvbnNlCisgICAgICAgICAgICAgICAgZmlsdGVycyAoJmpheHJzLmNsaWVudC5DbGllbnRSZXNwb25zZUZpbHRlcjspCisgICAgICAgICAgICAgICAgYXJlIGV4ZWN1dGVkIHRoYXQgbWlnaHQgYWdhaW4gbWFuaXB1bGF0ZSB0aGUgcmV0dXJuZWQgcmVzcG9uc2UuCisgICAgICAgICAgICAgICAgRmluYWxseSB0aGUgcmVzcG9uc2UgaXMgcGFzc2VkIGJhY2sgdG8gdGhlIGNvZGUgdGhhdCBpbnZva2VkIHRoZSByZXF1ZXN0LgorICAgICAgICAgICAgICAgIElmIHRoZSByZXF1ZXN0IHdhcyBhYm9ydGVkIGluIGFueSBjbGllbnQgcmVxdWVzdCBmaWx0ZXIgdGhlbiB0aGUKKyAgICAgICAgICAgICAgICBjbGllbnQvc2VydmVyIGNvbW11bmljYXRpb24gaXMgc2tpcHBlZCBhbmQgdGhlIGFib3J0ZWQgcmVzcG9uc2UKKyAgICAgICAgICAgICAgICBpcyB1c2VkIGluIHRoZSByZXNwb25zZSBmaWx0ZXJzLgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbj4KKyAgICAgICAgPHRpdGxlPkludGVyY2VwdG9yczwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgSW50ZXJjZXB0b3JzIHNoYXJlIGEgY29tbW9uIEFQSSBmb3IgdGhlIHNlcnZlciBhbmQgdGhlIGNsaWVudCBzaWRlLiBXaGVyZWFzIGZpbHRlcnMgYXJlIHByaW1hcmlseSBpbnRlbmRlZCB0byBtYW5pcHVsYXRlCisgICAgICAgICAgICByZXF1ZXN0IGFuZCByZXNwb25zZSBwYXJhbWV0ZXJzIGxpa2UgSFRUUCBoZWFkZXJzLCBVUklzIGFuZC9vciBIVFRQIG1ldGhvZHMsIGludGVyY2VwdG9ycyBhcmUgaW50ZW5kZWQgdG8gbWFuaXB1bGF0ZSBlbnRpdGllcywgdmlhIG1hbmlwdWxhdGluZworICAgICAgICAgICAgZW50aXR5IGlucHV0L291dHB1dCBzdHJlYW1zLiBJZiB5b3UgZm9yIGV4YW1wbGUgbmVlZCB0byBlbmNvZGUgZW50aXR5IGJvZHkgb2YgYSBjbGllbnQgcmVxdWVzdCB0aGVuIHlvdSBjb3VsZAorICAgICAgICAgICAgaW1wbGVtZW50IGFuIGludGVyY2VwdG9yIHRvIGRvIHRoZSB3b3JrIGZvciB5b3UuCisgICAgICAgICA8L3BhcmE+CisgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZXJlIGFyZSB0d28ga2luZHMgb2YgaW50ZXJjZXB0b3JzLCAmamF4cnMuUmVhZGVySW50ZXJjZXB0b3I7IGFuZCAmamF4cnMuV3JpdGVySW50ZXJjZXB0b3I7LgorICAgICAgICAgICAgUmVhZGVyIGludGVyY2VwdG9ycyBhcmUgdXNlZCB0byBtYW5pcHVsYXRlIGluYm91bmQgZW50aXR5IHN0cmVhbXMuIFRoZXNlIGFyZSB0aGUgc3RyZWFtcyBjb21pbmcgZnJvbQorICAgICAgICAgICAgdGhlICJ3aXJlIi4gU28sIHVzaW5nIGEgcmVhZGVyIGludGVyY2VwdG9yIHlvdQorICAgICAgICAgICAgY2FuIG1hbmlwdWxhdGUgcmVxdWVzdCBlbnRpdHkgc3RyZWFtIG9uIHRoZSBzZXJ2ZXIgc2lkZSAod2hlcmUKKyAgICAgICAgICAgIGFuIGVudGl0eSBpcyByZWFkIGZyb20gdGhlIGNsaWVudCByZXF1ZXN0KSBhbmQgcmVzcG9uc2UgZW50aXR5IHN0cmVhbSBvbiB0aGUgY2xpZW50IHNpZGUgKHdoZXJlIGFuIGVudGl0eQorICAgICAgICAgICAgaXMgcmVhZCBmcm9tIHRoZSBzZXJ2ZXIgcmVzcG9uc2UpLiBXcml0ZXIgaW50ZXJjZXB0b3JzIGFyZSB1c2VkIGZvciBjYXNlcyB3aGVyZSBlbnRpdHkgaXMgd3JpdHRlbiB0byB0aGUKKyAgICAgICAgICAgICJ3aXJlIiB3aGljaCBvbiB0aGUgc2VydmVyIG1lYW5zIHdoZW4gd3JpdGluZyBvdXQgYSByZXNwb25zZSBlbnRpdHkgYW5kIG9uIHRoZSBjbGllbnQgc2lkZSB3aGVuIHdyaXRpbmcKKyAgICAgICAgICAgIHJlcXVlc3QgZW50aXR5IGZvciBhIHJlcXVlc3QgdG8gYmUgc2VudCBvdXQgdG8gdGhlIHNlcnZlci4gV3JpdGVyIGFuZCByZWFkZXIgaW50ZXJjZXB0b3JzIGFyZSBleGVjdXRlZCBiZWZvcmUgbWVzc2FnZSBib2R5CisgICAgICAgICAgICByZWFkZXJzIG9yIHdyaXRlcnMgYXJlIGV4ZWN1dGVkIGFuZCB0aGVpciBwcmltYXJ5IGludGVudGlvbiBpcyB0byB3cmFwIHRoZSBlbnRpdHkgc3RyZWFtcyB0aGF0IHdpbGwgYmUgdXNlZCBpbiBtZXNzYWdlIGJvZHkKKyAgICAgICAgICAgIHJlYWRlciBhbmQgd3JpdGVycy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBhIHdyaXRlciBpbnRlcmNlcHRvciB0aGF0IGVuYWJsZXMgR1pJUCBjb21wcmVzc2lvbiBvZiB0aGUgd2hvbGUgZW50aXR5IGJvZHkuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICA8dGl0bGU+R1pJUCB3cml0ZXIgaW50ZXJjZXB0b3I8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPnB1YmxpYyBjbGFzcyBHWklQV3JpdGVySW50ZXJjZXB0b3IgaW1wbGVtZW50cyBXcml0ZXJJbnRlcmNlcHRvciB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhcm91bmRXcml0ZVRvKFdyaXRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KQorICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IGNvbnRleHQuZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIGNvbnRleHQuc2V0T3V0cHV0U3RyZWFtKG5ldyBHWklQT3V0cHV0U3RyZWFtKG91dHB1dFN0cmVhbSkpOworICAgICAgICBjb250ZXh0LnByb2NlZWQoKTsKKyAgICB9Cit9PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZSBpbnRlcmNlcHRvciBnZXRzIGEgb3V0cHV0IHN0cmVhbSBmcm9tIHRoZSAmamF4cnMuV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0OyBhbmQgc2V0cworICAgICAgICAgICAgYSBuZXcgb25lIHdoaWNoIGlzIGEgR1pJUCB3cmFwcGVyIG9mIHRoZSBvcmlnaW5hbCBvdXRwdXQgc3RyZWFtLiBBZnRlciBhbGwgaW50ZXJjZXB0b3JzIGFyZSBleGVjdXRlZCB0aGUKKyAgICAgICAgICAgIG91dHB1dCBzdHJlYW0gbGFzdGx5IHNldCB0byB0aGUgJmxpdC5qYXhycy5Xcml0ZXJJbnRlcmNlcHRvckNvbnRleHQ7IHdpbGwgYmUgdXNlZCBmb3Igc2VyaWFsaXphdGlvbiBvZiB0aGUgZW50aXR5LiBJbiB0aGUKKyAgICAgICAgICAgIGV4YW1wbGUgYWJvdmUgdGhlIGVudGl0eSBieXRlcyB3aWxsIGJlIHdyaXR0ZW4gdG8gdGhlIEdaSVBPdXRwdXRTdHJlYW0gd2hpY2ggd2lsbCBjb21wcmVzcyB0aGUgc3RyZWFtIGRhdGEKKyAgICAgICAgICAgIGFuZCB3cml0ZSB0aGVtIHRvIHRoZSBvcmlnaW5hbCBvdXRwdXQgc3RyZWFtLiBUaGUgb3JpZ2luYWwgc3RyZWFtIGlzIGFsd2F5cyB0aGUgc3RyZWFtIHdoaWNoIHdyaXRlcyB0aGUgZGF0YSB0bworICAgICAgICAgICAgdGhlICJ3aXJlIi4gV2hlbiB0aGUgaW50ZXJjZXB0b3IgaXMgdXNlZCBvbiB0aGUgc2VydmVyLCB0aGUgb3JpZ2luYWwgb3V0cHV0IHN0cmVhbSBpcyB0aGUgc3RyZWFtIGludG8gd2hpY2ggd3JpdGVzCisgICAgICAgICAgICBkYXRhIHRvIHRoZSB1bmRlcmx5aW5nIHNlcnZlciBjb250YWluZXIgc3RyZWFtIHRoYXQgc2VuZHMgdGhlIHJlc3BvbnNlIHRvIHRoZSBjbGllbnQuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaGUgaW50ZXJjZXB0b3JzIHdyYXAgdGhlIHN0cmVhbXMgYW5kIHRoZXkgaXRzZWxmIHdvcmsgYXMgd3JhcHBlcnMuIFRoaXMgbWVhbnMgdGhhdCBlYWNoIGludGVyY2VwdG9yIGlzIGEgd3JhcHBlcgorICAgICAgICAgICAgb2YgYW5vdGhlciBpbnRlcmNlcHRvciBhbmQgaXQgaXMgcmVzcG9uc2liaWxpdHkgb2YgZWFjaCBpbnRlcmNlcHRvciBpbXBsZW1lbnRhdGlvbiB0byBjYWxsIHRoZSB3cmFwcGVkIGludGVyY2VwdG9yLgorICAgICAgICAgICAgVGhpcyBpcyBhY2hpZXZlZCBieSBjYWxsaW5nIHRoZSA8bGl0ZXJhbD5wcm9jZWVkKCk8L2xpdGVyYWw+IG1ldGhvZCBvbiB0aGUgJmxpdC5qYXhycy5Xcml0ZXJJbnRlcmNlcHRvckNvbnRleHQ7LgorICAgICAgICAgICAgVGhpcyBtZXRob2Qgd2lsbCBjYWxsIHRoZSBuZXh0IHJlZ2lzdGVyZWQgaW50ZXJjZXB0b3IgaW4gdGhlIGNoYWluLCBzbyBlZmZlY3RpdmVsbHkgdGhpcyB3aWxsIGNhbGwgYWxsIHJlbWFpbmluZyByZWdpc3RlcmVkIGludGVyY2VwdG9ycy4gQ2FsbGluZyA8bGl0ZXJhbD5wcm9jZWVkKCk8L2xpdGVyYWw+IGZyb20gdGhlIGxhc3QKKyAgICAgICAgICAgIGludGVyY2VwdG9yIGluIHRoZSBjaGFpbiB3aWxsIGNhbGwgdGhlIGFwcHJvcHJpYXRlIG1lc3NhZ2UgYm9keSByZWFkZXIuIFRoZXJlZm9yZSBldmVyeSBpbnRlcmNlcHRvciBtdXN0IGNhbGwgdGhlCisgICAgICAgICAgICA8bGl0ZXJhbD5wcm9jZWVkKCk8L2xpdGVyYWw+IG1ldGhvZCBvdGhlcndpc2UgdGhlIGVudGl0eSB3b3VsZCBub3QgYmUgd3JpdHRlbi4gVGhlIHdyYXBwaW5nIHByaW5jaXBsZSBpcyByZWZsZWN0ZWQKKyAgICAgICAgICAgIGFsc28gaW4gdGhlIG1ldGhvZCBuYW1lLCBhcm91bmRXcml0ZVRvLCB3aGljaCBzYXlzIHRoYXQgdGhlIG1ldGhvZCBpcyB3cmFwcGluZyB0aGUgd3JpdGluZyBvZiB0aGUgZW50aXR5LgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhlIG1ldGhvZCBhcm91bmRXcml0ZVRvKCkgZ2V0cyAmbGl0LmpheHJzLldyaXRlckludGVyY2VwdG9yQ29udGV4dDsgYXMgYSBwYXJhbWV0ZXIuIFRoaXMgY29udGV4dCBjb250YWlucyBnZXR0ZXJzCisgICAgICAgICAgICBhbmQgc2V0dGVycyBmb3IgaGVhZGVyIHBhcmFtZXRlcnMsIHJlcXVlc3QgcHJvcGVydGllcywgZW50aXR5LCBlbnRpdHkgc3RyZWFtIGFuZCBvdGhlciBwcm9wZXJ0aWVzLiBUaGVzZSBhcmUgdGhlCisgICAgICAgICAgICBwcm9wZXJ0aWVzIHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBmaW5hbCAmbGl0LmpheHJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsuIEludGVyY2VwdG9ycyBhcmUgYWxsb3dlZCB0byBtb2RpZnkKKyAgICAgICAgICAgIGFsbCB0aGVzZSBwcm9wZXJ0aWVzLiBUaGlzIGNvdWxkIGluZmx1ZW5jZSB3cml0aW5nIG9mIGFuIGVudGl0eSBieSAmbGl0LmpheHJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsgYW5kIGV2ZW4KKyAgICAgICAgICAgIHNlbGVjdGlvbiBvZiBzdWNoIGEgd3JpdGVyLiBCeSBjaGFuZ2luZyBtZWRpYSB0eXBlICgmbGl0LmpheHJzLldyaXRlckludGVyY2VwdG9yQ29udGV4dDsuc2V0TWVkaWFUeXBlKCkpCisgICAgICAgICAgICB0aGUgaW50ZXJjZXB0b3IgY2FuIGNhdXNlIHRoYXQgZGlmZmVyZW50IG1lc3NhZ2UgYm9keSB3cml0ZXIgd2lsbCBiZSBjaG9zZW4uIFRoZSBpbnRlcmNlcHRvciBjYW4gYWxzbworICAgICAgICAgICAgY29tcGxldGVseSByZXBsYWNlIHRoZSBlbnRpdHkgaWYgaXQgaXMgbmVlZGVkLiBIb3dldmVyLCBmb3IgbW9kaWZpY2F0aW9uIG9mIGhlYWRlcnMsIHJlcXVlc3QKKyAgICAgICAgICAgIHByb3BlcnRpZXMgYW5kIHN1Y2gsIHRoZSBmaWx0ZXJzIGFyZSB1c3VhbGx5IG1vcmUgcHJlZmVyYWJsZSBjaG9pY2UuIEludGVyY2VwdG9ycyBhcmUgZXhlY3V0ZWQKKyAgICAgICAgICAgIG9ubHkgd2hlbiB0aGVyZSBpcyBhbnkgZW50aXR5IGFuZCB3aGVuIHRoZSBlbnRpdHkgaXMgdG8gYmUgd3JpdHRlbi4gU28sIHdoZW4geW91IGFsd2F5cyB3YW50IHRvIGFkZCBhIG5ldworICAgICAgICAgICAgaGVhZGVyIHRvIGEgcmVzcG9uc2Ugbm8gbWF0dGVyIHdoYXQsIHVzZSBmaWx0ZXJzIGFzIGludGVyY2VwdG9ycyBtaWdodCBub3QgYmUgZXhlY3V0ZWQgd2hlbiBubyBlbnRpdHkgaXMKKyAgICAgICAgICAgIHByZXNlbnQuIEludGVyY2VwdG9ycyBzaG91bGQgbW9kaWZ5IHByb3BlcnRpZXMgb25seSBmb3IgZW50aXR5IHNlcmlhbGl6YXRpb24KKyAgICAgICAgICAgIGFuZCBkZXNlcmlhbGl6YXRpb24gcHVycG9zZXMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBMZXQncyBub3cgbG9vayBhdCBhbiBleGFtcGxlIG9mIGEgJmxpdC5qYXhycy5SZWFkZXJJbnRlcmNlcHRvcjsKKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgIDx0aXRsZT5HWklQIHJlYWRlciBpbnRlcmNlcHRvcjwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+cHVibGljIGNsYXNzIEdaSVBSZWFkZXJJbnRlcmNlcHRvciBpbXBsZW1lbnRzIFJlYWRlckludGVyY2VwdG9yIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgYXJvdW5kUmVhZEZyb20oUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpCisgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBvcmlnaW5hbElucHV0U3RyZWFtID0gY29udGV4dC5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICBjb250ZXh0LnNldElucHV0U3RyZWFtKG5ldyBHWklQSW5wdXRTdHJlYW0ob3JpZ2luYWxJbnB1dFN0cmVhbSkpOworICAgICAgICByZXR1cm4gY29udGV4dC5wcm9jZWVkKCk7CisgICAgfQorfTwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaGUgPGxpdGVyYWw+R1pJUFJlYWRlckludGVyY2VwdG9yPC9saXRlcmFsPiB3cmFwcyB0aGUgb3JpZ2luYWwgaW5wdXQgc3RyZWFtIHdpdGggdGhlCisgICAgICAgICAgICA8bGl0ZXJhbD5HWklQSW5wdXRTdHJlYW08L2xpdGVyYWw+LiBBbGwgZnVydGhlciByZWFkcyBmcm9tIHRoZSBlbnRpdHkgc3RyZWFtIHdpbGwgY2F1c2UgdGhhdCBkYXRhIHdpbGwgYmUgZGVjb21wcmVzc2VkCisgICAgICAgICAgICBieSB0aGlzIHN0cmVhbS4gVGhlIGludGVyY2VwdG9yIG1ldGhvZCA8bGl0ZXJhbD5hcm91bmRSZWFkRnJvbSgpPC9saXRlcmFsPiBtdXN0IHJldHVybiBhbiBlbnRpdHkuIFRoZSBlbnRpdHkKKyAgICAgICAgICAgIGlzIHJldHVybmVkIGZyb20gdGhlIDxsaXRlcmFsPnByb2NlZWQ8L2xpdGVyYWw+IG1ldGhvZCBvZiB0aGUgJmpheHJzLlJlYWRlckludGVyY2VwdG9yQ29udGV4dDsuIFRoZQorICAgICAgICAgICAgPGxpdGVyYWw+cHJvY2VlZDwvbGl0ZXJhbD4gbWV0aG9kIGludGVybmFsbHkgY2FsbHMgdGhlIHdyYXBwZWQgaW50ZXJjZXB0b3Igd2hpY2ggbXVzdCBhbHNvIHJldHVybiBhbiBlbnRpdHkuCisgICAgICAgICAgICBUaGUgPGxpdGVyYWw+cHJvY2VlZDwvbGl0ZXJhbD4gbWV0aG9kIGludm9rZWQgZnJvbSB0aGUgbGFzdCBpbnRlcmNlcHRvciBpbiB0aGUgY2hhaW4gY2FsbHMgbWVzc2FnZSBib2R5IHJlYWRlciB3aGljaCBkZXNlcmlhbGl6ZXMKKyAgICAgICAgICAgIHRoZSBlbnRpdHkgZW5kIHJldHVybnMgaXQuIEV2ZXJ5IGludGVyY2VwdG9yIGNhbiBjaGFuZ2UgdGhpcyBlbnRpdHkgaWYgdGhlcmUgaXMgYSBuZWVkIGJ1dCBpbiB0aGUgbW9zdCBjYXNlcworICAgICAgICAgICAgaW50ZXJjZXB0b3JzIHdpbGwganVzdCByZXR1cm4gdGhlIGVudGl0eSBhcyByZXR1cm5lZCBmcm9tIHRoZSA8bGl0ZXJhbD5wcm9jZWVkPC9saXRlcmFsPiBtZXRob2QuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBBcyBhbHJlYWR5IG1lbnRpb25lZCBhYm92ZSwgaW50ZXJjZXB0b3JzIHNob3VsZCBiZSBwcmltYXJpbHkgdXNlZCB0byBtYW5pcHVsYXRlIGVudGl0eSBib2R5LgorICAgICAgICAgICAgU2ltaWxhciB0byBtZXRob2RzIGV4cG9zZWQgYnkgJmxpdC5qYXhycy5Xcml0ZXJJbnRlcmNlcHRvckNvbnRleHQ7IHRoZSAmbGl0LmpheHJzLlJlYWRlckludGVyY2VwdG9yQ29udGV4dDsKKyAgICAgICAgICAgIGludHJvZHVjZXMgYSBzZXQgb2YgbWV0aG9kcyBmb3IgbW9kaWZpY2F0aW9uIG9mIHJlcXVlc3QvcmVzcG9uc2UgcHJvcGVydGllcyBsaWtlIEhUVFAgaGVhZGVycywKKyAgICAgICAgICAgIFVSSXMgYW5kL29yIEhUVFAgbWV0aG9kcyAoZXhjbHVkaW5nIGdldHRlcnMgYW5kIHNldHRlcnMgZm9yIGVudGl0eSBhcyBlbnRpdHkgaGFzIG5vdCBiZWVuIHJlYWQgeWV0KS4KKyAgICAgICAgICAgIEFnYWluIHRoZSBzYW1lIHJ1bGVzIGFzIGZvciAmbGl0LmpheHJzLldyaXRlckludGVyY2VwdG9yOyBhcHBsaWVzIGZvciBjaGFuZ2luZyB0aGVzZSBwcm9wZXJ0aWVzIChjaGFuZ2Ugb25seQorICAgICAgICAgICAgcHJvcGVydGllcyBpbiBvcmRlciB0byBpbmZsdWVuY2UgcmVhZGluZyBvZiBhbiBlbnRpdHkpLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbj4KKyAgICAgICAgICAgIDx0aXRsZT5GaWx0ZXIgYW5kIGludGVyY2VwdG9yIGV4ZWN1dGlvbiBvcmRlcjwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgTGV0J3MgbG9vayBjbG9zZXIgYXQgdGhlIGNvbnRleHQgb2YgZXhlY3V0aW9uIG9mIGZpbHRlcnMgYW5kIGludGVyY2VwdG9ycy4gVGhlIGZvbGxvd2luZyBzdGVwcyBkZXNjcmliZXMgc2NlbmFyaW8KKyAgICAgICAgICAgIHdoZXJlIGEgSkFYLVJTIGNsaWVudCBtYWtlcyBhIFBPU1QgcmVxdWVzdCB0byB0aGUgc2VydmVyLiBUaGUgc2VydmVyIHJlY2VpdmVzIGFuIGVudGl0eSBhbmQgc2VuZHMgYSByZXNwb25zZSBiYWNrCisgICAgICAgICAgICB3aXRoIHRoZSBzYW1lIGVudGl0eS4gR1pJUCByZWFkZXIgYW5kIHdyaXRlciBpbnRlcmNlcHRvcnMgYXJlIHJlZ2lzdGVyZWQgb24gdGhlCisgICAgICAgICAgICBjbGllbnQgYW5kIHRoZSBzZXJ2ZXIuIEFsc28gZmlsdGVycyBhcmUgcmVnaXN0ZXJlZCBvbiBjbGllbnQgYW5kIHNlcnZlciB3aGljaCBjaGFuZ2UgdGhlIGhlYWRlcnMgb2YgcmVxdWVzdAorICAgICAgICAgICAgYW5kIHJlc3BvbnNlLgorICAgICAgICAgICAgPG9yZGVyZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT5DbGllbnQgcmVxdWVzdCBpbnZva2VkOiBUaGUgUE9TVCByZXF1ZXN0IHdpdGggYXR0YWNoZWQgZW50aXR5IGlzIGJ1aWx0IG9uIHRoZSBjbGllbnQgYW5kIGludm9rZWQuPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+Q2xpZW50UmVxdWVzdEZpbHRlcnM6IGNsaWVudCByZXF1ZXN0IGZpbHRlcnMgYXJlIGV4ZWN1dGVkIG9uIHRoZSBjbGllbnQgYW5kIHRoZXkKKyAgICAgICAgICAgICAgICAgICAgbWFuaXB1bGF0ZSB0aGUgcmVxdWVzdCBoZWFkZXJzLjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPkNsaWVudCAmbGl0LmpheHJzLldyaXRlckludGVyY2VwdG9yOzogQXMgdGhlIHJlcXVlc3QgY29udGFpbnMgYW4gZW50aXR5LCB3cml0ZXIgaW50ZXJjZXB0b3IgcmVnaXN0ZXJlZCBvbiB0aGUgY2xpZW50IGlzIGV4ZWN1dGVkIGJlZm9yZQorICAgICAgICAgICAgICAgICAgICBhIE1lc3NhZ2VCb2R5V3JpdGVyIGlzIGV4ZWN1dGVkLiBJdCB3cmFwcyB0aGUgZW50aXR5IG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgR1ppcE91dHB1dFN0cmVhbS48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT5DbGllbnQgTWVzc2FnZUJvZHlXcml0ZXI6IG1lc3NhZ2UgYm9keSB3cml0ZXIgaXMgZXhlY3V0ZWQgb24gdGhlIGNsaWVudCB3aGljaCBzZXJpYWxpemVzIHRoZSBlbnRpdHkKKyAgICAgICAgICAgICAgICAgICAgaW50byB0aGUgbmV3IEdaaXBPdXRwdXQgc3RyZWFtLiBUaGlzIHN0cmVhbSB6aXBzIHRoZSBkYXRhIGFuZCBzZW5kcyBpdCB0byB0aGUgIndpcmUiLjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPlNlcnZlcjogc2VydmVyIHJlY2VpdmVzIGEgcmVxdWVzdC4gRGF0YSBvZiBlbnRpdHkgaXMgY29tcHJlc3NlZCB3aGljaCBtZWFucyB0aGF0IHB1cmUgcmVhZCBmcm9tCisgICAgICAgICAgICAgICAgICAgIHRoZSBlbnRpdHkgaW5wdXQgc3RyZWFtIHdvdWxkIHJldHVybiBjb21wcmVzc2VkIGRhdGEuPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+U2VydmVyIHByZS1tYXRjaGluZyBDb250YWluZXJSZXF1ZXN0RmlsdGVyczogQ29udGFpbmVyUmVxdWVzdEZpbHRlcnMgYXJlIGV4ZWN1dGVkIHRoYXQgY2FuIG1hbmlwdWxhdGUKKyAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UgbWV0aG9kIG1hdGNoaW5nIHByb2Nlc3MuPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+U2VydmVyOiBtYXRjaGluZzogcmVzb3VyY2UgbWV0aG9kIG1hdGNoaW5nIGlzIGRvbmUuPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+U2VydmVyOiBwb3N0LW1hdGNoaW5nIENvbnRhaW5lclJlcXVlc3RGaWx0ZXJzOiBDb250YWluZXJSZXF1ZXN0RmlsdGVycyBwb3N0IG1hdGNoaW5nIGZpbHRlcnMgYXJlIGV4ZWN1dGVkLgorICAgICAgICAgICAgICAgICAgICBUaGlzIGluY2x1ZGUgZXhlY3V0aW9uIG9mIGFsbCBnbG9iYWwgZmlsdGVycyAod2l0aG91dCBuYW1lIGJpbmRpbmcpIGFuZCBmaWx0ZXJzIG5hbWUtYm91bmQgdG8gdGhlIG1hdGNoZWQKKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kLjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPlNlcnZlciAmbGl0LmpheHJzLlJlYWRlckludGVyY2VwdG9yOzogcmVhZGVyIGludGVyY2VwdG9ycyBhcmUgZXhlY3V0ZWQgb24gdGhlIHNlcnZlci4gVGhlIEdaSVBSZWFkZXJJbnRlcmNlcHRvcgorICAgICAgICAgICAgICAgICAgICB3cmFwcyB0aGUgaW5wdXQgc3RyZWFtICh0aGUgc3RyZWFtIGZyb20gdGhlICJ3aXJlIikgaW50byB0aGUgR1ppcElucHV0U3RyZWFtIGFuZCBzZXQgaXQgdG8gY29udGV4dC48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT5TZXJ2ZXIgTWVzc2FnZUJvZHlSZWFkZXI6IHNlcnZlciBtZXNzYWdlIGJvZHkgcmVhZGVyIGlzIGV4ZWN1dGVkIGFuZCBpdCBkZXNlcmlhbGl6ZXMgdGhlIGVudGl0eQorICAgICAgICAgICAgICAgICAgICBmcm9tIG5ldyBHWmlwSW5wdXRTdHJlYW0gKGdldCBmcm9tIHRoZSBjb250ZXh0KS4gVGhpcyBtZWFucyB0aGUgcmVhZGVyIHdpbGwgcmVhZCB1bnppcHBlZCBkYXRhIGFuZCBub3QKKyAgICAgICAgICAgICAgICAgICAgdGhlIGNvbXByZXNzZWQgZGF0YSBmcm9tIHRoZSAid2lyZSIuPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+U2VydmVyIHJlc291cmNlIG1ldGhvZCBpcyBleGVjdXRlZDogdGhlIGRlc2VyaWFsaXplZCBlbnRpdHkgb2JqZWN0IGlzIHBhc3NlZCB0byB0aGUgbWF0Y2hlZCByZXNvdXJjZQorICAgICAgICAgICAgICAgICAgICBtZXRob2QgYXMgYSBwYXJhbWV0ZXIuIFRoZSBtZXRob2QgcmV0dXJucyB0aGlzIGVudGl0eSBhcyBhIHJlc3BvbnNlIGVudGl0eS48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT5TZXJ2ZXIgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXJzIGFyZSBleGVjdXRlZDogcmVzcG9uc2UgZmlsdGVycyBhcmUgZXhlY3V0ZWQgb24gdGhlIHNlcnZlciBhbmQKKyAgICAgICAgICAgICAgICAgICAgdGhleSBtYW5pcHVsYXRlIHRoZSByZXNwb25zZSBoZWFkZXJzLiBUaGlzIGluY2x1ZGUgYWxsIGdsb2JhbCBib3VuZCBmaWx0ZXJzICh3aXRob3V0IG5hbWUgYmluZGluZykgYW5kIGFsbCBmaWx0ZXJzIG5hbWUtYm91bmQgdG8gdGhlIHJlc291cmNlIG1ldGhvZC48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT5TZXJ2ZXIgJmxpdC5qYXhycy5Xcml0ZXJJbnRlcmNlcHRvcjs6IGlzIGV4ZWN1dGVkIG9uIHRoZSBzZXJ2ZXIuIEl0IHdyYXBzIHRoZSBvcmlnaW5hbAorICAgICAgICAgICAgICAgICAgICBvdXRwdXQgc3RyZWFtIHdpdGggYSBuZXcgR1pJUE91cHR1dFN0cmVhbS4gVGhlIG9yaWdpbmFsIHN0cmVhbSBpcyB0aGUgc3RyZWFtIHRoYXQgImdvZXMgdG8gdGhlIHdpcmUiIChvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtIGZvciByZXNwb25zZSBmcm9tIHRoZSB1bmRlcmx5aW5nIHNlcnZlciBjb250YWluZXIpLgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPlNlcnZlciBNZXNzYWdlQm9keVdyaXRlcjogbWVzc2FnZSBib2R5IHdyaXRlciBpcyBleGVjdXRlZCBvbiB0aGUgc2VydmVyIHdoaWNoIHNlcmlhbGl6ZXMgdGhlIGVudGl0eQorICAgICAgICAgICAgICAgICAgICBpbnRvIHRoZSBHWklQT3V0cHV0U3RyZWFtLiBUaGlzIHN0cmVhbSBjb21wcmVzc2VzIHRoZSBkYXRhIGFuZCB3cml0ZXMgaXQgdG8gdGhlIG9yaWdpbmFsIHN0cmVhbSB3aGljaCBzZW5kcworICAgICAgICAgICAgICAgICAgICB0aGlzIGNvbXByZXNzZWQgZGF0YSBiYWNrIHRvIHRoZSBjbGllbnQuCisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+Q2xpZW50IHJlY2VpdmVzIHRoZSByZXNwb25zZTogdGhlIHJlc3BvbnNlIGNvbnRhaW5zIGNvbXByZXNzZWQgZW50aXR5IGRhdGEuPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+Q2xpZW50IENsaWVudFJlc3BvbnNlRmlsdGVyczogY2xpZW50IHJlc3BvbnNlIGZpbHRlcnMgYXJlIGV4ZWN1dGVkIGFuZCB0aGV5IG1hbmlwdWxhdGUgdGhlIHJlc3BvbnNlIGhlYWRlcnMuPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+Q2xpZW50IHJlc3BvbnNlIGlzIHJldHVybmVkOiB0aGUgamF2YXgud3MucnMuY29yZS5SZXNwb25zZSBpcyByZXR1cm5lZCBmcm9tIHRoZSByZXF1ZXN0IGludm9jYXRpb24uPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+Q2xpZW50IGNvZGUgY2FsbHMgcmVzcG9uc2UucmVhZEVudGl0eSgpOiByZWFkIGVudGl0eSBpcyBleGVjdXRlZCBvbiB0aGUgY2xpZW50IHRvIGV4dHJhY3QgdGhlIGVudGl0eSBmcm9tIHRoZSByZXNwb25zZS48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT5DbGllbnQgJmxpdC5qYXhycy5SZWFkZXJJbnRlcmNlcHRvcjs6IHRoZSBjbGllbnQgcmVhZGVyIGludGVyY2VwdG9yIGlzIGV4ZWN1dGVkIHdoZW4gcmVhZEVudGl0eShDbGFzcykgaXMgY2FsbGVkLiBUaGUgaW50ZXJjZXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBzIHRoZSBlbnRpdHkgaW5wdXQgc3RyZWFtIHdpdGggR1pJUElucHV0U3RyZWFtLiBUaGlzIHdpbGwgZGVjb21wcmVzcyB0aGUgZGF0YSBmcm9tIHRoZSBvcmlnaW5hbCBpbnB1dCBzdHJlYW0uCisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+Q2xpZW50IE1lc3NhZ2VCb2R5UmVhZGVyczogY2xpZW50IG1lc3NhZ2UgYm9keSByZWFkZXIgaXMgaW52b2tlZCB3aGljaCByZWFkcyBkZWNvbXByZXNzZWQgZGF0YSBmcm9tCisgICAgICAgICAgICAgICAgICAgIEdaSVBJbnB1dFN0cmVhbSBhbmQgZGVzZXJpYWxpemVzIHRoZSBlbnRpdHkuPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+Q2xpZW50OiBUaGUgZW50aXR5IGlzIHJldHVybmVkIGZyb20gdGhlIHJlYWRFbnRpdHkoKS48L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9vcmRlcmVkbGlzdD4KKyAgICAgICAgICAgIEl0IGlzIHdvcnRoIHRvIG1lbnRpb24gdGhhdCBpbiB0aGUgc2NlbmFyaW8gYWJvdmUgdGhlIHJlYWRlciBhbmQgd3JpdGVyIGludGVyY2VwdG9ycyBhcmUgaW52b2tlZCBvbmx5IGlmIHRoZQorICAgICAgICAgICAgZW50aXR5IGlzIHByZXNlbnQgKGl0IGRvZXMgbm90IG1ha2Ugc2Vuc2UgdG8gd3JhcCBlbnRpdHkgc3RyZWFtIHdoZW4gbm8gZW50aXR5IHdpbGwgYmUgd3JpdHRlbikuIFRoZSBzYW1lIGJlaGF2aW91cgorICAgICAgICAgICAgaXMgdGhlcmUgZm9yIG1lc3NhZ2UgYm9keSByZWFkZXJzIGFuZCB3cml0ZXJzLiBBcyBtZW50aW9uZWQgYWJvdmUsIGludGVyY2VwdG9ycyBhcmUgZXhlY3V0ZWQgYmVmb3JlCisgICAgICAgICAgICB0aGUgbWVzc2FnZSBib2R5IHJlYWRlci93cml0ZXIgYXMgYSBwYXJ0IG9mIHRoZWlyIGV4ZWN1dGlvbiBhbmQgdGhleSBjYW4gd3JhcCB0aGUgaW5wdXQvb3V0cHV0IHN0cmVhbQorICAgICAgICAgICAgYmVmb3JlIHRoZSBlbnRpdHkgaXMgcmVhZC93cml0dGVuLiBUaGVyZSBhcmUgZXhjZXB0aW9ucyB3aGVuIGludGVyY2VwdG9ycyBhcmUgbm90IHJ1biBiZWZvcmUgbWVzc2FnZSBib2R5CisgICAgICAgICAgICByZWFkZXIvd3JpdGVycyBidXQgdGhpcyBpcyBub3QgdGhlIGNhc2Ugb2Ygc2ltcGxlIHNjZW5hcmlvIGFib3ZlLiBUaGlzIGhhcHBlbnMgZm9yIGV4YW1wbGUgd2hlbiB0aGUgZW50aXR5IGlzCisgICAgICAgICAgICByZWFkIG1hbnkgdGltZXMgZnJvbSBjbGllbnQgcmVzcG9uc2UgdXNpbmcgaW50ZXJuYWwgYnVmZmVyaW5nLiBUaGVuIHRoZSBkYXRhIGFyZSBpbnRlcmNlcHRlZCBvbmx5IG9uY2UgYW5kIGtlcHQKKyAgICAgICAgICAgICdkZWNvZGVkJyBpbiB0aGUgYnVmZmVyLgorICAgICAgICA8L3BhcmE+CisKKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbj4KKyAgICAgICAgPHRpdGxlPk5hbWUgYmluZGluZzwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBGaWx0ZXJzIGFuZCBpbnRlcmNlcHRvcnMgY2FuIGJlIDxlbXBoYXNpcz5uYW1lLWJvdW5kPC9lbXBoYXNpcz4uIE5hbWUgYmluZGluZyBpcyBhIGNvbmNlcHQgdGhhdCBhbGxvd3MgdG8gc2F5IHRvIGEgSkFYLVJTCisgICAgICAgICAgICBydW50aW1lIHRoYXQgYSBzcGVjaWZpYyBmaWx0ZXIgb3IgaW50ZXJjZXB0b3Igd2lsbCBiZSBleGVjdXRlZCBvbmx5IGZvciBhIHNwZWNpZmljIHJlc291cmNlIG1ldGhvZC4gV2hlbiBhIGZpbHRlciBvcgorICAgICAgICAgICAgYW4gaW50ZXJjZXB0b3IgaXMgbGltaXRlZCBvbmx5IHRvIGEgc3BlY2lmaWMgcmVzb3VyY2UgbWV0aG9kIHdlIHNheSB0aGF0IGl0IGlzIDxlbXBoYXNpcz5uYW1lLWJvdW5kPC9lbXBoYXNpcz4uCisgICAgICAgICAgICBGaWx0ZXJzIGFuZCBpbnRlcmNlcHRvcnMgdGhhdCBkbyBub3QgaGF2ZSBzdWNoIGEgbGltaXRhdGlvbiBhcmUgY2FsbGVkIDxlbXBoYXNpcz5nbG9iYWw8L2VtcGhhc2lzPi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEZpbHRlciBvciBpbnRlcmNlcHRvciBjYW4gYmUgYXNzaWduZWQgdG8gYSByZXNvdXJjZSBtZXRob2QgdXNpbmcgdGhlICZqYXhycy5OYW1lQmluZGluZzsgYW5ub3RhdGlvbi4gVGhlIGFubm90YXRpb24KKyAgICAgICAgICAgIGlzIHVzZWQgYXMgbWV0YSBhbm5vdGF0aW9uIGZvciBvdGhlciB1c2VyIGltcGxlbWVudGVkIGFubm90YXRpb25zIHRoYXQgYXJlIGFwcGxpZWQgdG8gYSBwcm92aWRlcnMgYW5kIHJlc291cmNlCisgICAgICAgICAgICBtZXRob2RzLiBTZWUgdGhlIGZvbGxvd2luZyBleGFtcGxlOgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgPHRpdGxlPiZsaXQuamF4cnMuTmFtZUJpbmRpbmc7IGV4YW1wbGU8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPi4uLgoraW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS51dGlsLnppcC5HWklQSW5wdXRTdHJlYW07CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuTmFtZUJpbmRpbmc7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKKy4uLgorCisKKy8vIEBDb21wcmVzcyBhbm5vdGF0aW9uIGlzIHRoZSBuYW1lIGJpbmRpbmcgYW5ub3RhdGlvbgorQE5hbWVCaW5kaW5nCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorcHVibGljIEBpbnRlcmZhY2UgQ29tcHJlc3Mge30KKworCitAUGF0aCgiaGVsbG93b3JsZCIpCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZFJlc291cmNlIHsKKworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0SGVsbG8oKSB7CisgICAgICAgIHJldHVybiAiSGVsbG8gV29ybGQhIjsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInRvby1tdWNoLWRhdGEiKQorICAgIEBDb21wcmVzcworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyeUxvbmdTdHJpbmcoKSB7CisgICAgICAgIFN0cmluZyBzdHIgPSAuLi4gLy8gdmVyeSBsb25nIHN0cmluZworICAgICAgICByZXR1cm4gc3RyOworICAgIH0KK30KKworLy8gaW50ZXJjZXB0b3Igd2lsbCBiZSBleGVjdXRlZCBvbmx5IHdoZW4gcmVzb3VyY2UgbWV0aG9kcworLy8gYW5ub3RhdGVkIHdpdGggQENvbXByZXNzIGFubm90YXRpb24gd2lsbCBiZSBleGVjdXRlZAorQENvbXByZXNzCitwdWJsaWMgY2xhc3MgR1pJUFdyaXRlckludGVyY2VwdG9yIGltcGxlbWVudHMgV3JpdGVySW50ZXJjZXB0b3IgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFyb3VuZFdyaXRlVG8oV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpCisgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gY29udGV4dC5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgY29udGV4dC5zZXRPdXRwdXRTdHJlYW0obmV3IEdaSVBPdXRwdXRTdHJlYW0ob3V0cHV0U3RyZWFtKSk7CisgICAgICAgIGNvbnRleHQucHJvY2VlZCgpOworICAgIH0KK308L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhlIGV4YW1wbGUgYWJvdmUgZGVmaW5lcyBhIG5ldyA8bGl0ZXJhbD5AQ29tcHJlc3M8L2xpdGVyYWw+IGFubm90YXRpb24gd2hpY2ggaXMgYSBuYW1lIGJpbmRpbmcgYW5ub3RhdGlvbiBhcworICAgICAgICAgICAgaXQgaXMgYW5ub3RhdGVkIHdpdGggJmxpdC5qYXhycy5OYW1lQmluZGluZzsuIFRoZSA8bGl0ZXJhbD5AQ29tcHJlc3M8L2xpdGVyYWw+IGlzIGFwcGxpZWQgb24gdGhlCisgICAgICAgICAgICByZXNvdXJjZSBtZXRob2QgPGxpdGVyYWw+Z2V0VmVyeUxvbmdTdHJpbmcoKTwvbGl0ZXJhbD4gYW5kIG9uIHRoZSBpbnRlcmNlcHRvcgorICAgICAgICAgICAgPGxpdGVyYWw+R1pJUFdyaXRlckludGVyY2VwdG9yPC9saXRlcmFsPi4gVGhlIGludGVyY2VwdG9yIHdpbGwgYmUgZXhlY3V0ZWQgb25seSBpZiBhbnkgcmVzb3VyY2UgbWV0aG9kCisgICAgICAgICAgICB3aXRoIHN1Y2ggYSBhbm5vdGF0aW9uIHdpbGwgYmUgZXhlY3V0ZWQuIEluIG91ciBleGFtcGxlIGNhc2UgdGhlIGludGVyY2VwdG9yIHdpbGwgYmUgZXhlY3V0ZWQgb25seSBmb3IKKyAgICAgICAgICAgIHRoZSA8bGl0ZXJhbD5nZXRWZXJ5TG9uZ1N0cmluZygpPC9saXRlcmFsPiBtZXRob2QuIFRoZSBpbnRlcmNlcHRvciB3aWxsIG5vdCBiZSBleGVjdXRlZCBmb3IgbWV0aG9kCisgICAgICAgICAgICA8bGl0ZXJhbD5nZXRIZWxsbygpPC9saXRlcmFsPi4gSW4gdGhpcyBleGFtcGxlIHRoZSByZWFzb24gaXMgcHJvYmFibHkgY2xlYXIuIFdlIHdvdWxkIGxpa2UgdG8gY29tcHJlc3MKKyAgICAgICAgICAgIG9ubHkgbG9uZyBkYXRhIGFuZCB3ZSBkbyBub3QgbmVlZCB0byBjb21wcmVzcyB0aGUgc2hvcnQgcmVzcG9uc2Ugb2YgIkhlbGxvIFdvcmxkISIuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBOYW1lIGJpbmRpbmcgY2FuIGJlIGFwcGxpZWQgb24gYSByZXNvdXJjZSBjbGFzcy4gSW4gdGhlIGV4YW1wbGUgPGxpdGVyYWw+SGVsbG9Xb3JsZFJlc291cmNlPC9saXRlcmFsPgorICAgICAgICAgICAgd291bGQgYmUgYW5ub3RhdGVkIHdpdGggPGxpdGVyYWw+QENvbXByZXNzPC9saXRlcmFsPi4gVGhpcyB3b3VsZCBtZWFuIHRoYXQgYWxsIHJlc291cmNlCisgICAgICAgICAgICBtZXRob2RzIHdpbGwgdXNlIGNvbXByZXNzaW9uIGluIHRoaXMgY2FzZS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZXJlIG1pZ2h0IGJlIG1hbnkgbmFtZSBiaW5kaW5nIGFubm90YXRpb25zIGRlZmluZWQgaW4gYW4gYXBwbGljYXRpb24uIFdoZW4gYW55IHByb3ZpZGVyIChmaWx0ZXIKKyAgICAgICAgICAgIG9yIGludGVyY2VwdG9yKSBpcyBhbm5vdGF0ZWQgd2l0aCBtb3JlIHRoYW4gb25lIG5hbWUgYmluZGluZyBhbm5vdGF0aW9uLCB0aGVuIGl0IHdpbGwgYmUgZXhlY3V0ZWQgZm9yCisgICAgICAgICAgICByZXNvdXJjZSBtZXRob2RzIHdoaWNoIGNvbnRhaW4gQUxMIHRoZXNlIGFubm90YXRpb25zLiBTbywgZm9yIGV4YW1wbGUgaWYgb3VyIGludGVyY2VwdG9yIHdvdWxkIGJlCisgICAgICAgICAgICBhbm5vdGF0ZWQgd2l0aCBhbm90aGVyIG5hbWUgYmluZGluZyBhbm5vdGF0aW9uIEBHWklQIHRoZW4gdGhlIHJlc291cmNlIG1ldGhvZCB3b3VsZCBuZWVkIHRvIGhhdmUgYm90aCBhbm5vdGF0aW9ucyBhdHRhY2hlZCwKKyAgICAgICAgICAgIEBDb21wcmVzcyBhbmQgQEdaSVAsIG90aGVyd2lzZSB0aGUgaW50ZXJjZXB0b3Igd291bGQgbm90IGJlIGV4ZWN1dGVkLiBCYXNlZCBvbiB0aGUgcHJldmlvdXMgcGFyYWdyYXBoIHdlIGNhbgorICAgICAgICAgICAgZXZlbiB1c2UgdGhlIGNvbWJpbmF0aW9uIHdoZW4gdGhlCisgICAgICAgICAgICByZXNvdXJjZSBtZXRob2QgPGxpdGVyYWw+Z2V0VmVyeUxvbmdTdHJpbmcoKTwvbGl0ZXJhbD4gd291bGQgYmUgYW5ub3RhdGVkIHdpdGggQENvbXByZXNzIGFuZCByZXNvdXJjZSBjbGFzcworICAgICAgICAgICAgPGxpdGVyYWw+SGVsbG9Xb3JsZFJlc291cmNlPC9saXRlcmFsPiB3b3VsZCBiZSBhbm5vdGF0ZWQgZnJvbSB3aXRoIEBHWklQLiBUaGlzIHdvdWxkIGFsc28gdHJpZ2dlciB0aGUgaW50ZXJjZXB0b3IgYXMKKyAgICAgICAgICAgIGFubm90YXRpb25zIG9mIHJlc291cmNlIG1ldGhvZHMgYXJlIGFnZ3JlZ2F0ZWQgZnJvbSByZXNvdXJjZSBtZXRob2QgYW5kIGZyb20gcmVzb3VyY2UgY2xhc3MuIEJ1dCB0aGlzIGlzIHByb2JhYmx5CisgICAgICAgICAgICBqdXN0IGFuIGVkZ2UgY2FzZSB3aGljaCB3aWxsIG5vdCBiZSB1c2VkIHNvIG9mdGVuLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgTm90ZSB0aGF0IDxlbXBoYXNpcz5nbG9iYWwgZmlsdGVycyBhcmUgZXhlY3V0ZWQgYWx3YXlzPC9lbXBoYXNpcz4sIHNvIGV2ZW4gZm9yIHJlc291cmNlIG1ldGhvZHMKKyAgICAgICAgICAgIHdoaWNoIGhhdmUgYW55IG5hbWUgYmluZGluZyBhbm5vdGF0aW9ucy4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbj4KKyAgICAgICAgPHRpdGxlPkR5bmFtaWMgYmluZGluZzwvdGl0bGU+CisgICAgICAgIDxwYXJhPkR5bmFtaWMgYmluZGluZyBpcyBhIHdheSBob3cgdG8gYXNzaWduIGZpbHRlcnMgYW5kIGludGVyY2VwdG9ycyB0byB0aGUgcmVzb3VyY2UgbWV0aG9kcyBpbiBhIGR5bmFtaWMKKyAgICAgICAgbWFubmVyLiBOYW1lIGJpbmRpbmcgZnJvbSB0aGUgcHJldmlvdXMgY2hhcHRlciB1c2VzIGEgc3RhdGljIGFwcHJvYWNoIGFuZCBjaGFuZ2VzIHRvIGJpbmRpbmcgcmVxdWlyZSBzb3VyY2UKKyAgICAgICAgY29kZSBjaGFuZ2UgYW5kIHJlY29tcGlsYXRpb24uIFdpdGggZHluYW1pYyBiaW5kaW5nIHlvdSBjYW4gaW1wbGVtZW50IGNvZGUgd2hpY2ggZGVmaW5lcyBiaW5kaW5ncyBkdXJpbmcgdGhlIGFwcGxpY2F0aW9uCisgICAgICAgIGluaXRpYWxpemF0aW9uIHRpbWUuIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdG8gaW1wbGVtZW50IGR5bmFtaWMgYmluZGluZy48L3BhcmE+CisKKworCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgPHRpdGxlPkR5bmFtaWMgYmluZGluZyBleGFtcGxlPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj4uLi4KK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmVDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5EeW5hbWljRmVhdHVyZTsKKy4uLgorCitAUGF0aCgiaGVsbG93b3JsZCIpCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZFJlc291cmNlIHsKKworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0SGVsbG8oKSB7CisgICAgICAgIHJldHVybiAiSGVsbG8gV29ybGQhIjsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInRvby1tdWNoLWRhdGEiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyeUxvbmdTdHJpbmcoKSB7CisgICAgICAgIFN0cmluZyBzdHIgPSAuLi4gLy8gdmVyeSBsb25nIHN0cmluZworICAgICAgICByZXR1cm4gc3RyOworICAgIH0KK30KKworLy8gVGhpcyBkeW5hbWljIGJpbmRpbmcgcHJvdmlkZXIgcmVnaXN0ZXJzIEdaSVBXcml0ZXJJbnRlcmNlcHRvcgorLy8gb25seSBmb3IgSGVsbG9Xb3JsZFJlc291cmNlIGFuZCBtZXRob2RzIHRoYXQgY29udGFpbgorLy8gIlZlcnlMb25nU3RyaW5nIiBpbiB0aGVpciBuYW1lLiBJdCB3aWxsIGJlIGV4ZWN1dGVkIGR1cmluZworLy8gYXBwbGljYXRpb24gaW5pdGlhbGl6YXRpb24gcGhhc2UuCitwdWJsaWMgY2xhc3MgQ29tcHJlc3Npb25EeW5hbWljQmluZGluZyBpbXBsZW1lbnRzIER5bmFtaWNGZWF0dXJlIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShSZXNvdXJjZUluZm8gcmVzb3VyY2VJbmZvLCBGZWF0dXJlQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGlmIChIZWxsb1dvcmxkUmVzb3VyY2UuY2xhc3MuZXF1YWxzKHJlc291cmNlSW5mby5nZXRSZXNvdXJjZUNsYXNzKCkpCisgICAgICAgICAgICAgICAgJmFtcDsmYW1wOyByZXNvdXJjZUluZm8uZ2V0UmVzb3VyY2VNZXRob2QoKQorICAgICAgICAgICAgICAgICAgICAuZ2V0TmFtZSgpLmNvbnRhaW5zKCJWZXJ5TG9uZ1N0cmluZyIpKSB7CisgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKEdaSVBXcml0ZXJJbnRlcmNlcHRvci5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9Cit9PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhlIGV4YW1wbGUgY29udGFpbnMgb25lIDxsaXRlcmFsPkhlbGxvV29ybGRSZXNvdXJjZTwvbGl0ZXJhbD4gd2hpY2ggaXMga25vd24gZnJvbSB0aGUgcHJldmlvdXMgbmFtZSBiaW5kaW5nIGV4YW1wbGUuCisgICAgICAgICAgICBUaGUgZGlmZmVyZW5jZSBpcyBpbiB0aGUgPGxpdGVyYWw+Z2V0VmVyeUxvbmdTdHJpbmc8L2xpdGVyYWw+IG1ldGhvZCwgd2hpY2ggbm93IGRvZXMgbm90IGRlZmluZQorICAgICAgICAgICAgdGhlIDxsaXRlcmFsPkBDb21wcmVzczwvbGl0ZXJhbD4gbmFtZSBiaW5kaW5nIGFubm90YXRpb25zLiBUaGUgYmluZGluZyBpcyBkb25lCisgICAgICAgICAgICB1c2luZyB0aGUgcHJvdmlkZXIgd2hpY2ggaW1wbGVtZW50cyAmamF4cnMuY29udGFpbmVyLkR5bmFtaWNGZWF0dXJlOyBpbnRlcmZhY2UuIFRoZSBpbnRlcmZhY2UgZGVmaW5lcworICAgICAgICAgICAgb25lIDxsaXRlcmFsPmNvbmZpZ3VyZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgIG1ldGhvZCB3aXRoIHR3byBhcmd1bWVudHMsIDxsaXRlcmFsPlJlc291cmNlSW5mbzwvbGl0ZXJhbD4gYW5kIDxsaXRlcmFsPkZlYXR1cmVDb250ZXh0PC9saXRlcmFsPi4KKyAgICAgICAgICAgIDxsaXRlcmFsPlJlc291cmNlSW5mbzwvbGl0ZXJhbD4gY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlc291cmNlIGFuZCBtZXRob2QgdG8gd2hpY2ggdGhlIGJpbmRpbmcgY2FuIGJlIGRvbmUuCisgICAgICAgICAgICBUaGUgPGxpdGVyYWw+Y29uZmlndXJlPC9saXRlcmFsPiBtZXRob2Qgd2lsbCBiZSBleGVjdXRlZCBvbmNlIGZvciBlYWNoIHJlc291cmNlIG1ldGhvZCB0aGF0IGlzIGRlZmluZWQgaW4gdGhlIGFwcGxpY2F0aW9uLgorICAgICAgICAgICAgSW4gdGhlIGV4YW1wbGUgYWJvdmUgdGhlIHByb3ZpZGVyIHdpbGwgYmUgZXhlY3V0ZWQgdHdpY2UsIG9uY2UgZm9yIHRoZSA8bGl0ZXJhbD5nZXRIZWxsbygpPC9saXRlcmFsPiBtZXRob2QKKyAgICAgICAgICAgIGFuZCBvbmNlIGZvciA8bGl0ZXJhbD5nZXRWZXJ5TG9uZ1N0cmluZygpPC9saXRlcmFsPiAoCisgICAgICAgICAgICBvbmNlIHRoZSByZXNvdXJjZUluZm8gd2lsbCBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IGdldEhlbGxvKCkgbWV0aG9kIGFuZCBvbmNlIGl0IHdpbGwgcG9pbnQgdG8KKyAgICAgICAgICAgIGdldFZlcnlMb25nU3RyaW5nKCkpLiBJZiBhIGR5bmFtaWMgYmluZGluZyBwcm92aWRlciB3YW50cyB0byByZWdpc3RlciBhbnkgcHJvdmlkZXIgZm9yIHRoZSBhY3R1YWwgcmVzb3VyY2UgbWV0aG9kCisgICAgICAgICAgICBpdCB3aWxsIGRvIHRoYXQgdXNpbmcgcHJvdmlkZWQgPGxpdGVyYWw+RmVhdHVyZUNvbnRleHQ8L2xpdGVyYWw+IHdoaWNoIGV4dGVuZHMKKyAgICAgICAgICAgIEpBWC1SUyA8bGl0ZXJhbD5Db25maWd1cmFibGU8L2xpdGVyYWw+IEFQSS4gQWxsIG1ldGhvZHMgZm9yIHJlZ2lzdHJhdGlvbiBvZiBmaWx0ZXIgb3IgaW50ZXJjZXB0b3IgY2xhc3NlcyBvciBpbnN0YW5jZXMgY2FuIGJlIHVzZWQuCisgICAgICAgICAgICBTdWNoIGR5bmFtaWNhbGx5IHJlZ2lzdGVyZWQgZmlsdGVycyBvciBpbnRlcmNlcHRvcnMgd2lsbCBiZSBib3VuZCBvbmx5IHRvIHRoZSBhY3R1YWwgcmVzb3VyY2UgbWV0aG9kLiBJbiB0aGUgZXhhbXBsZSBhYm92ZSB0aGUKKyAgICAgICAgICAgIDxsaXRlcmFsPkdaSVBXcml0ZXJJbnRlcmNlcHRvcjwvbGl0ZXJhbD4gd2lsbCBiZSBib3VuZCBvbmx5IHRvIHRoZSBtZXRob2QgPGxpdGVyYWw+Z2V0VmVyeUxvbmdTdHJpbmcoKTwvbGl0ZXJhbD4KKyAgICAgICAgICAgIHdoaWNoIHdpbGwgY2F1c2UgdGhhdCBkYXRhIHdpbGwgYmUgY29tcHJlc3NlZCBvbmx5IGZvciB0aGlzIG1ldGhvZCBhbmQgbm90IGZvciB0aGUgbWV0aG9kCisgICAgICAgICAgICA8bGl0ZXJhbD5nZXRIZWxsbygpPC9saXRlcmFsPi4gVGhlIGNvZGUgb2YgPGxpdGVyYWw+R1pJUFdyaXRlckludGVyY2VwdG9yPC9saXRlcmFsPiBpcyBpbiB0aGUgZXhhbXBsZXMgYWJvdmUuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBOb3RlIHRoYXQgZmlsdGVycyBhbmQgaW50ZXJjZXB0b3JzIHJlZ2lzdGVyZWQgdXNpbmcgZHluYW1pYyBiaW5kaW5nIGFyZSBvbmx5IGFkZGl0aW9uYWwgZmlsdGVycyBydW4gZm9yIHRoZQorICAgICAgICAgICAgcmVzb3VyY2UgbWV0aG9kLiBJZiB0aGVyZSBhcmUgYW55IG5hbWUgYm91bmQgcHJvdmlkZXJzIG9yIGdsb2JhbCBwcm92aWRlcnMgdGhleSB3aWxsIHN0aWxsIGJlIGV4ZWN1dGVkLgorICAgICAgICA8L3BhcmE+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24+CisgICAgICAgIDx0aXRsZT5Qcmlvcml0aWVzPC90aXRsZT4KKworICAgICAgICA8cGFyYT5JbiBjYXNlIHlvdSByZWdpc3RlciBtb3JlIGZpbHRlcnMgYW5kIGludGVyY2VwdG9ycyB5b3UgbWlnaHQgd2FudCB0byBkZWZpbmUgYW4gZXhhY3Qgb3JkZXIgaW4gd2hpY2gKKyAgICAgICAgICAgIHRoZXkgc2hvdWxkIGJlIGludm9rZWQuIFRoZSBvcmRlciBjYW4gYmUgY29udHJvbGxlZCBieSB0aGUgPGxpdGVyYWw+QFByaW9yaXR5PC9saXRlcmFsPiBhbm5vdGF0aW9uIGRlZmluZWQKKyAgICAgICAgICAgIGJ5IHRoZSA8bGl0ZXJhbD5qYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5PC9saXRlcmFsPiBjbGFzcy4gVGhlIGFubm90YXRpb24gYWNjZXB0cyBhbiBpbnRlZ2VyIHBhcmFtZXRlciBvZiBwcmlvcml0eS4KKyAgICAgICAgICAgIFByb3ZpZGVycyB1c2VkIGluIHJlcXVlc3QgcHJvY2Vzc2luZyAoJmxpdC5qYXhycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjssCisgICAgICAgICAgICAmbGl0LmpheHJzLmNsaWVudC5DbGllbnRSZXF1ZXN0RmlsdGVyOykgYXMgd2VsbCBhcyBlbnRpdHkgaW50ZXJjZXB0b3JzICgmbGl0LmpheHJzLlJlYWRlckludGVyY2VwdG9yOywKKyAgICAgICAgICAgICZsaXQuamF4cnMuV3JpdGVySW50ZXJjZXB0b3I7KSBhcmUgc29ydGVkIGJhc2VkIG9uIHRoZSBwcmlvcml0eSBpbiBhbiBhc2NlbmRpbmcgbWFubmVyLiBTbywgYSByZXF1ZXN0IGZpbHRlciB3aXRoCisgICAgICAgICAgICBwcmlvcml0eSBkZWZpbmVkIHdpdGggPGxpdGVyYWw+QFByaW9yaXR5KDEwMDApPC9saXRlcmFsPgorICAgICAgICAgICAgd2lsbCBiZSBleGVjdXRlZCBiZWZvcmUgYW5vdGhlciByZXF1ZXN0IGZpbHRlciB3aXRoIHByaW9yaXR5ICBkZWZpbmVkIGFzIDxsaXRlcmFsPkBQcmlvcml0eSgyMDAwKTwvbGl0ZXJhbD4uIFByb3ZpZGVycworICAgICAgICAgICAgdXNlZCBkdXJpbmcgcmVzcG9uc2UgcHJvY2Vzc2luZyAoJmxpdC5qYXhycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXI7LAorICAgICAgICAgICAgJmxpdC5qYXhycy5jbGllbnQuQ2xpZW50UmVzcG9uc2VGaWx0ZXI7KSBhcmUgZXhlY3V0ZWQKKyAgICAgICAgICAgIGluIHRoZSByZXZlcnNlIG9yZGVyICh1c2luZyBkZXNjZW5kaW5nIG1hbm5lciksIHNvIGEgcHJvdmlkZXIgd2l0aCB0aGUgcHJpb3JpdHkgZGVmaW5lZCB3aXRoCisgICAgICAgICAgICA8bGl0ZXJhbD5AUHJpb3JpdHkoMjAwMCk8L2xpdGVyYWw+IHdpbGwgYmUgZXhlY3V0ZWQgYmVmb3JlIGFub3RoZXIgcHJvdmlkZXIgd2l0aAorICAgICAgICAgICAgIHByaW9yaXR5IGRlZmluZWQgd2l0aCA8bGl0ZXJhbD5AUHJpb3JpdHkoMTAwMCk8L2xpdGVyYWw+LgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgSXQncyBhIGdvb2QgcHJhY3RpY2UgdG8gYXNzaWduIGEgcHJpb3JpdHkgdG8gZmlsdGVycyBhbmQgaW50ZXJjZXB0b3JzLiBVc2UgJmpheHJzLlByaW9yaXRpZXM7IGNsYXNzIHdoaWNoCisgICAgICAgICAgICBkZWZpbmVzIHN0YW5kYXJkaXplZCBwcmlvcml0aWVzIGluIEpBWC1SUyBmb3IgZGlmZmVyZW50IHVzYWdlcywgcmF0aGVyIHRoYW4gaW52ZW50aW5nIHlvdXIKKyAgICAgICAgICAgIG93biBwcmlvcml0aWVzLiBTbywgd2hlbiB5b3UgZm9yIGV4YW1wbGUgd3JpdGUgYW4gYXV0aGVudGljYXRpb24gZmlsdGVyIHlvdSB3b3VsZCBhc3NpZ24gYSBwcmlvcml0eSAxMDAwIHdoaWNoCisgICAgICAgICAgICBpcyB0aGUgdmFsdWUgb2YgJmxpdC5qYXhycy5Qcmlvcml0aWVzOzxsaXRlcmFsPi5BVVRIRU5USUNBVElPTjwvbGl0ZXJhbD4uIFRoZSBmb2xsb3dpbmcgZXhhbXBsZQorICAgICAgICAgICAgc2hvd3MgdGhlIGZpbHRlciBmcm9tIHRoZSBiZWdpbm5pbmcKKyAgICAgICAgICAgIG9mIHRoaXMgY2hhcHRlciB3aXRoIGEgcHJpb3JpdHkgYXNzaWduZWQuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgIDx0aXRsZT5Qcmlvcml0aWVzIGV4YW1wbGU8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPi4uLgoraW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJpb3JpdHk7CitpbXBvcnQgamF2YXgud3MucnMuUHJpb3JpdGllczsKKy4uLgorCitAUHJpb3JpdHkoUHJpb3JpdGllcy5IRUFERVJfREVDT1JBVE9SKQorcHVibGljIGNsYXNzIFJlc3BvbnNlRmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXIgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICBDb250YWluZXJSZXNwb25zZUNvbnRleHQgcmVzcG9uc2VDb250ZXh0KQorICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIHJlc3BvbnNlQ29udGV4dC5nZXRIZWFkZXJzKCkuYWRkKCJYLVBvd2VyZWQtQnkiLCAiSmVyc2V5IDotKSIpOworICAgIH0KK308L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQXMgdGhpcyBpcyBhIHJlc3BvbnNlIGZpbHRlciBhbmQgcmVzcG9uc2UgZmlsdGVycyBhcmUgZXhlY3V0ZWQgaW4gdGhlIHJldmVyc2Ugb3JkZXIsCisgICAgICAgICAgICBhbnkgb3RoZXIgZmlsdGVyIHdpdGggcHJpb3JpdHkgbG93ZXIgdGhhbiAzMDAwICg8bGl0ZXJhbD5Qcmlvcml0aWVzLkhFQURFUl9ERUNPUkFUT1I8L2xpdGVyYWw+IGlzIDMwMDApIHdpbGwgYmUgZXhlY3V0ZWQgYWZ0ZXIKKyAgICAgICAgICAgIHRoaXMgZmlsdGVyLiBTbywgZm9yIGV4YW1wbGUgPGxpdGVyYWw+QVVUSEVOVElDQVRJT048L2xpdGVyYWw+IGZpbHRlciAocHJpb3JpdHkgMTAwMCkgd291bGQgYmUgcnVuIGFmdGVyIHRoaXMgZmlsdGVyLgorICAgICAgICA8L3BhcmE+CisgICAgPC9zZWN0aW9uPgorPC9jaGFwdGVyPgpkaWZmIC0tZ2l0IGEvZG9jcy9zcmMvbWFpbi9kb2Nib29rL2dldHRpbmctc3RhcnRlZC54bWwgYi9kb2NzL3NyYy9tYWluL2RvY2Jvb2svZ2V0dGluZy1zdGFydGVkLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDYzMzZhCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9zcmMvbWFpbi9kb2Nib29rL2dldHRpbmctc3RhcnRlZC54bWwKQEAgLTAsMCArMSw2NTIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzwhRE9DVFlQRSBjaGFwdGVyIFs8IUVOVElUWSAlIGVudHMgU1lTVEVNICJqZXJzZXkuZW50IiA+ICVlbnRzOyBdPgorPGNoYXB0ZXIgeG1sbnM9Imh0dHA6Ly9kb2Nib29rLm9yZy9ucy9kb2Nib29rIgorICAgICAgICAgdmVyc2lvbj0iNS4wIgorICAgICAgICAgeG1sOmxhbmc9ImVuIgorICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIgorICAgICAgICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9kb2Nib29rLm9yZy9ucy9kb2Nib29rIGh0dHA6Ly9kb2Nib29rLm9yZy94bWwvNS4wL3hzZC9kb2Nib29rLnhzZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIGh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsueHNkIgorICAgICAgICAgeG1sOmlkPSJnZXR0aW5nLXN0YXJ0ZWQiPgorICAgIDx0aXRsZT5HZXR0aW5nIFN0YXJ0ZWQ8L3RpdGxlPgorCisgICAgPHBhcmE+CisgICAgICAgIFRoaXMgY2hhcHRlciBwcm92aWRlcyBhIHF1aWNrIGludHJvZHVjdGlvbiBvbiBob3cgdG8gZ2V0IHN0YXJ0ZWQgYnVpbGRpbmcgUkVTVGZ1bCBzZXJ2aWNlcyB1c2luZyBKZXJzZXkuCisgICAgICAgIFRoZSBleGFtcGxlIGRlc2NyaWJlZCBoZXJlIHVzZXMgdGhlIGxpZ2h0d2VpZ2h0IEdyaXp6bHkgSFRUUCBzZXJ2ZXIuIEF0IHRoZSBlbmQgb2YgdGhpcyBjaGFwdGVyIHlvdSB3aWxsCisgICAgICAgIHNlZSBob3cgdG8gaW1wbGVtZW50IGVxdWl2YWxlbnQgZnVuY3Rpb25hbGl0eSBhcyBhIEphdmFFRSB3ZWIgYXBwbGljYXRpb24geW91IGNhbiBkZXBsb3kgb24gYW55IHNlcnZsZXQKKyAgICAgICAgY29udGFpbmVyIHN1cHBvcnRpbmcgU2VydmxldCAyLjUgYW5kIGhpZ2hlci4KKyAgICA8L3BhcmE+CisKKyAgICA8c2VjdGlvbiB4bWw6aWQ9Im5ldy1mcm9tLWFyY2hldHlwZSI+CisgICAgICAgIDx0aXRsZT5DcmVhdGluZyBhIE5ldyBQcm9qZWN0IGZyb20gTWF2ZW4gQXJjaGV0eXBlPC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEplcnNleSBwcm9qZWN0IGlzIGJ1aWx0IHVzaW5nICZtYXZlbi5saW5rOyBzb2Z0d2FyZSBwcm9qZWN0IGJ1aWxkIGFuZCBtYW5hZ2VtZW50IHRvb2wuIEFsbCBtb2R1bGVzIHByb2R1Y2VkIGFzCisgICAgICAgICAgICBwYXJ0IG9mIEplcnNleSBwcm9qZWN0IGJ1aWxkIGFyZSBwdXNoZWQgdG8gdGhlICZtYXZlbi5jZW50cmFsLnJlcG8ubGluazsuIFRoZXJlZm9yZSBpdCBpcyB2ZXJ5IGNvbnZlbmllbnQgdG8gd29yaworICAgICAgICAgICAgd2l0aCBKZXJzZXkgZm9yIGFueSBNYXZlbi1iYXNlZCBwcm9qZWN0IGFzIGFsbCB0aGUgcmVsZWFzZWQgKG5vbi1TTkFQU0hPVCkgSmVyc2V5IGRlcGVuZGVuY2llcyBhcmUgcmVhZGlseQorICAgICAgICAgICAgYXZhaWxhYmxlIHdpdGhvdXQgYSBuZWVkIHRvIGNvbmZpZ3VyZSBhIHNwZWNpYWwgbWF2ZW4gcmVwb3NpdG9yeSB0byBjb25zdW1lIHRoZSBKZXJzZXkgbW9kdWxlcy4KKworICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEluIGNhc2UgeW91IHdhbnQgdG8gZGVwZW5kIG9uIHRoZSBsYXRlc3QgU05BUFNIT1QgdmVyc2lvbnMgb2YgSmVyc2V5IG1vZHVsZXMsIHRoZSBmb2xsb3dpbmcgcmVwb3NpdG9yeQorICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIG5lZWRzIHRvIGJlIGFkZGVkIHRvIHlvdXIgTWF2ZW4gcHJvamVjdCBwb206CisKKyAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJ4bWwiIGxpbmVudW1iZXJpbmc9InVubnVtYmVyZWQiPiZsdDtyZXBvc2l0b3J5Jmd0OworICAgICZsdDtpZCZndDtzbmFwc2hvdC1yZXBvc2l0b3J5LmphdmEubmV0Jmx0Oy9pZCZndDsKKyAgICAmbHQ7bmFtZSZndDtKYXZhLm5ldCBTbmFwc2hvdCBSZXBvc2l0b3J5IGZvciBNYXZlbiZsdDsvbmFtZSZndDsKKyAgICAmbHQ7dXJsJmd0O2h0dHBzOi8vbWF2ZW4uamF2YS5uZXQvY29udGVudC9yZXBvc2l0b3JpZXMvc25hcHNob3RzLyZsdDsvdXJsJmd0OworICAgICZsdDtsYXlvdXQmZ3Q7ZGVmYXVsdCZsdDsvbGF5b3V0Jmd0OworJmx0Oy9yZXBvc2l0b3J5Jmd0OzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9ub3RlPgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgU2luY2Ugc3RhcnRpbmcgZnJvbSBhIE1hdmVuIHByb2plY3QgaXMgdGhlIG1vc3QgY29udmVuaWVudCB3YXkgZm9yIHdvcmtpbmcgd2l0aCBKZXJzZXksIGxldCdzIG5vdyBoYXZlIGEgbG9vaworICAgICAgICAgICAgYXQgdGhpcyBhcHByb2FjaC4gV2Ugd2lsbCBub3cgY3JlYXRlIGEgbmV3IEplcnNleSBwcm9qZWN0IHRoYXQgcnVucyBvbiB0b3Agb2YgYSAmZ3JpenpseS5saW5rOyBjb250YWluZXIuIFdlIHdpbGwKKyAgICAgICAgICAgIHVzZSBhIEplcnNleS1wcm92aWRlZCBtYXZlbiBhcmNoZXR5cGUuIFRvIGNyZWF0ZSB0aGUgcHJvamVjdCwgZXhlY3V0ZSB0aGUgZm9sbG93aW5nIE1hdmVuIGNvbW1hbmQgaW4gdGhlIGRpcmVjdG9yeQorICAgICAgICAgICAgd2hlcmUgdGhlIG5ldyBwcm9qZWN0IHNob3VsZCByZXNpZGU6CisKKyAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iYmFzaCIgbGluZW51bWJlcmluZz0idW5udW1iZXJlZCI+bXZuIGFyY2hldHlwZTpnZW5lcmF0ZSAtRGFyY2hldHlwZUFydGlmYWN0SWQ9amVyc2V5LXF1aWNrc3RhcnQtZ3JpenpseTIgXAorLURhcmNoZXR5cGVHcm91cElkPW9yZy5nbGFzc2Zpc2guamVyc2V5LmFyY2hldHlwZXMgLURpbnRlcmFjdGl2ZU1vZGU9ZmFsc2UgXAorLURncm91cElkPWNvbS5leGFtcGxlIC1EYXJ0aWZhY3RJZD1zaW1wbGUtc2VydmljZSAtRHBhY2thZ2U9Y29tLmV4YW1wbGUgXAorLURhcmNoZXR5cGVWZXJzaW9uPSZ2ZXJzaW9uOzwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgICAgICAgICAgIEZlZWwgZnJlZSB0byBhZGp1c3QgdGhlIDxsaXRlcmFsPmdyb3VwSWQ8L2xpdGVyYWw+LCA8bGl0ZXJhbD5wYWNrYWdlPC9saXRlcmFsPiBhbmQvb3IgPGxpdGVyYWw+YXJ0aWZhY3RJZDwvbGl0ZXJhbD4KKyAgICAgICAgICAgIG9mIHlvdXIgbmV3IHByb2plY3QuIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gY2hhbmdlIGl0IGJ5IHVwZGF0aW5nIHRoZSBuZXcgcHJvamVjdCBwb20ueG1sIG9uY2UgaXQgZ2V0cyBnZW5lcmF0ZWQuCisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24geG1sOmlkPSJuZXctcHJvamVjdC1zdHJ1Y3R1cmUiPgorICAgICAgICA8dGl0bGU+RXhwbG9yaW5nIHRoZSBOZXdseSBDcmVhdGVkIFByb2plY3Q8L3RpdGxlPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgT25jZSB0aGUgcHJvamVjdCBnZW5lcmF0aW9uIGZyb20gYSBKZXJzZXkgbWF2ZW4gYXJjaGV0eXBlIGlzIHN1Y2Nlc3NmdWxseSBmaW5pc2hlZCwgeW91IHNob3VsZCBzZWUgdGhlIG5ldworICAgICAgICAgICAgPGxpdGVyYWw+c2ltcGxlLXNlcnZpY2U8L2xpdGVyYWw+IHByb2plY3QgZGlyZWN0b3J5IGNyZWF0ZWQgaW4geW91ciBjdXJyZW50IGxvY2F0aW9uLiBUaGUgZGlyZWN0b3J5IGNvbnRhaW5zCisgICAgICAgICAgICBhIHN0YW5kYXJkIE1hdmVuIHByb2plY3Qgc3RydWN0dXJlOgorCisgICAgICAgICAgICA8c2ltcGxlbGlzdD4KKyAgICAgICAgICAgICAgICA8bWVtYmVyPgorICAgICAgICAgICAgICAgICAgICBQcm9qZWN0IGJ1aWxkIGFuZCBtYW5hZ2VtZW50IGNvbmZpZ3VyYXRpb24gaXMgZGVzY3JpYmVkIGluIHRoZSA8bGl0ZXJhbD5wb20ueG1sPC9saXRlcmFsPiBsb2NhdGVkCisgICAgICAgICAgICAgICAgICAgIGluIHRoZSBwcm9qZWN0IHJvb3QgZGlyZWN0b3J5LgorICAgICAgICAgICAgICAgIDwvbWVtYmVyPgorICAgICAgICAgICAgICAgIDxtZW1iZXI+UHJvamVjdCBzb3VyY2VzIGFyZSBsb2NhdGVkIHVuZGVyIDxsaXRlcmFsPnNyYy9tYWluL2phdmE8L2xpdGVyYWw+LjwvbWVtYmVyPgorICAgICAgICAgICAgICAgIDxtZW1iZXI+UHJvamVjdCB0ZXN0IHNvdXJjZXMgYXJlIGxvY2F0ZWQgdW5kZXIgPGxpdGVyYWw+c3JjL3Rlc3QvamF2YTwvbGl0ZXJhbD4uPC9tZW1iZXI+CisgICAgICAgICAgICA8L3NpbXBsZWxpc3Q+CisKKyAgICAgICAgICAgIFRoZXJlIGFyZSAyIGNsYXNzZXMgaW4gdGhlIHByb2plY3Qgc291cmNlIGRpcmVjdG9yeSBpbiB0aGUgPGxpdGVyYWw+Y29tLmV4YW1wbGU8L2xpdGVyYWw+IHBhY2thZ2UuCisgICAgICAgICAgICBUaGUgPGxpdGVyYWw+TWFpbjwvbGl0ZXJhbD4gY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIGJvb3RzdHJhcHBpbmcgdGhlIEdyaXp6bHkgY29udGFpbmVyIGFzIHdlbGwgYXMgY29uZmlndXJpbmcKKyAgICAgICAgICAgIGFuZCBkZXBsb3lpbmcgdGhlIHByb2plY3QncyBKQVgtUlMgYXBwbGljYXRpb24gdG8gdGhlIGNvbnRhaW5lci4gQW5vdGhlciBjbGFzcyBpbiB0aGUgc2FtZSBwYWNrYWdlCisgICAgICAgICAgICBpcyA8bGl0ZXJhbD5NeVJlc291cmNlPC9saXRlcmFsPiBjbGFzcywgdGhhdCBjb250YWlucyBpbXBsZW1lbnRhdGlvbiBvZiBhIHNpbXBsZSBKQVgtUlMgcmVzb3VyY2UuCisgICAgICAgICAgICBJdCBsb29rcyBsaWtlIHRoaXM6CisKKyAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPnBhY2thZ2UgY29tLmV4YW1wbGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworLyoqCisgKiBSb290IHJlc291cmNlIChleHBvc2VkIGF0ICJteXJlc291cmNlIiBwYXRoKQorICovCitAUGF0aCgibXlyZXNvdXJjZSIpCitwdWJsaWMgY2xhc3MgTXlSZXNvdXJjZSB7CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgaGFuZGxpbmcgSFRUUCBHRVQgcmVxdWVzdHMuIFRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBiZSBzZW50CisgICAgICogdG8gdGhlIGNsaWVudCBhcyAidGV4dC9wbGFpbiIgbWVkaWEgdHlwZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gU3RyaW5nIHRoYXQgd2lsbCBiZSByZXR1cm5lZCBhcyBhIHRleHQvcGxhaW4gcmVzcG9uc2UuCisgICAgICovCisgICAgQEdFVAorICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICBwdWJsaWMgU3RyaW5nIGdldEl0KCkgeworICAgICAgICByZXR1cm4gIkdvdCBpdCEiOworICAgIH0KK308L3Byb2dyYW1saXN0aW5nPgorCisgICAgICAgICAgICBBIEpBWC1SUyByZXNvdXJjZSBpcyBhbiBhbm5vdGF0ZWQgUE9KTyB0aGF0IHByb3ZpZGVzIHNvLWNhbGxlZCA8ZW1waGFzaXM+cmVzb3VyY2UgbWV0aG9kczwvZW1waGFzaXM+IHRoYXQKKyAgICAgICAgICAgIGFyZSBhYmxlIHRvIGhhbmRsZSBIVFRQIHJlcXVlc3RzIGZvciBVUkkgcGF0aHMgdGhhdCB0aGUgcmVzb3VyY2UgaXMgYm91bmQgdG8uIFNlZQorICAgICAgICAgICAgPHhyZWYgbGlua2VuZD0iamF4cnMtcmVzb3VyY2VzIiAvPiBmb3IgYSBjb21wbGV0ZSBndWlkZSB0byBKQVgtUlMgcmVzb3VyY2VzLiBJbiBvdXIgY2FzZSwgdGhlIHJlc291cmNlCisgICAgICAgICAgICBleHBvc2VzIGEgc2luZ2xlIHJlc291cmNlIG1ldGhvZCB0aGF0IGlzIGFibGUgdG8gaGFuZGxlIEhUVFAgJmxpdC5odHRwLkdFVDsgcmVxdWVzdHMsIGlzIGJvdW5kIHRvCisgICAgICAgICAgICA8bGl0ZXJhbD4vbXlyZXNvdXJjZTwvbGl0ZXJhbD4gVVJJIHBhdGggYW5kIGNhbiBwcm9kdWNlIHJlc3BvbnNlcyB3aXRoIHJlc3BvbnNlIG1lc3NhZ2UgY29udGVudCByZXByZXNlbnRlZAorICAgICAgICAgICAgaW4gPGxpdGVyYWw+InRleHQvcGxhaW4iPC9saXRlcmFsPiBtZWRpYSB0eXBlLiBJbiB0aGlzIHZlcnNpb24sIHRoZSByZXNvdXJjZSByZXR1cm5zIHRoZSBzYW1lCisgICAgICAgICAgICA8bGl0ZXJhbD4iR290IGl0ISI8L2xpdGVyYWw+IHJlc3BvbnNlIHRvIGFsbCBjbGllbnQgcmVxdWVzdHMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaGUgbGFzdCBwaWVjZSBvZiBjb2RlIHRoYXQgaGFzIGJlZW4gZ2VuZXJhdGVkIGluIHRoaXMgc2tlbGV0b24gcHJvamVjdCBpcyBhIDxsaXRlcmFsPk15UmVzb3VyY2VUZXN0PC9saXRlcmFsPgorICAgICAgICAgICAgdW5pdCB0ZXN0IGNsYXNzIHRoYXQgaXMgbG9jYXRlZCBpbiB0aGUgc2FtZSA8bGl0ZXJhbD5jb20uZXhhbXBsZTwvbGl0ZXJhbD4gcGFja2FnZSBhcyB0aGUKKyAgICAgICAgICAgIDxsaXRlcmFsPk15UmVzb3VyY2U8L2xpdGVyYWw+IGNsYXNzLCBob3dldmVyLCB0aGlzIHVuaXQgdGVzdCBjbGFzcyBpcyBwbGFjZWQgaW50byB0aGUgbWF2ZW4gcHJvamVjdCB0ZXN0IHNvdXJjZQorICAgICAgICAgICAgZGlyZWN0b3J5IDxsaXRlcmFsPnNyYy90ZXN0L2phdmE8L2xpdGVyYWw+IChjZXJ0YWluIGNvZGUgY29tbWVudHMgYW5kIEpVbml0IGltcG9ydHMgaGF2ZSBiZWVuIGV4Y2x1ZGVkIGZvciBicmV2aXR5KToKKworICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+cGFja2FnZSBjb20uZXhhbXBsZTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guZ3JpenpseS5odHRwLnNlcnZlci5IdHRwU2VydmVyOworCisuLi4KKworcHVibGljIGNsYXNzIE15UmVzb3VyY2VUZXN0IHsKKworICAgIHByaXZhdGUgSHR0cFNlcnZlciBzZXJ2ZXI7CisgICAgcHJpdmF0ZSBXZWJUYXJnZXQgdGFyZ2V0OworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHNlcnZlciA9IE1haW4uc3RhcnRTZXJ2ZXIoKTsKKworICAgICAgICBDbGllbnQgYyA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KCk7CisgICAgICAgIHRhcmdldCA9IGMudGFyZ2V0KE1haW4uQkFTRV9VUkkpOworICAgIH0KKworICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHNlcnZlci5zdG9wKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0byBzZWUgdGhhdCB0aGUgbWVzc2FnZSAiR290IGl0ISIgaXMgc2VudCBpbiB0aGUgcmVzcG9uc2UuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SXQoKSB7CisgICAgICAgIFN0cmluZyByZXNwb25zZU1zZyA9IHRhcmdldC5wYXRoKCJteXJlc291cmNlIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkdvdCBpdCEiLCByZXNwb25zZU1zZyk7CisgICAgfQorfTwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgICAgICAgICAgIEluIHRoaXMgdW5pdCB0ZXN0LCBhIEdyaXp6bHkgY29udGFpbmVyIGlzIGZpcnN0IHN0YXJ0ZWQgYW5kIHNlcnZlciBhcHBsaWNhdGlvbiBpcyBkZXBsb3llZCBpbiB0aGUKKyAgICAgICAgICAgIHRlc3QgPGxpdGVyYWw+c2V0VXAoKTwvbGl0ZXJhbD4gbWV0aG9kIGJ5IGEgc3RhdGljIGNhbGwgdG8gPGxpdGVyYWw+TWFpbi5zdGFydFNlcnZlcigpPC9saXRlcmFsPi4KKyAgICAgICAgICAgIE5leHQsIGEgSkFYLVJTIGNsaWVudCBjb21wb25lbnRzIGFyZSBjcmVhdGVkIGluIHRoZSBzYW1lIHRlc3Qgc2V0LXVwIG1ldGhvZC4gRmlyc3QgYSBuZXcgSkFYLVJTIGNsaWVudAorICAgICAgICAgICAgaW5zdGFuY2UgPGxpdGVyYWw+YzwvbGl0ZXJhbD4gaXMgYnVpbHQgYW5kIHRoZW4gYSBKQVgtUlMgd2ViIHRhcmdldCBjb21wb25lbnQgcG9pbnRpbmcgdG8gdGhlIGNvbnRleHQgcm9vdCBvZiBvdXIKKyAgICAgICAgICAgIGFwcGxpY2F0aW9uIGRlcGxveWVkIGF0IDxsaXRlcmFsPmh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9teWFwcC88L2xpdGVyYWw+IChhIHZhbHVlIG9mCisgICAgICAgICAgICA8bGl0ZXJhbD5NYWluLkJBU0VfVVJJPC9saXRlcmFsPiBjb25zdGFudCkgaXMgc3RvcmVkIGludG8gYSA8bGl0ZXJhbD50YXJnZXQ8L2xpdGVyYWw+IGZpZWxkIG9mIHRoZSB1bml0IHRlc3QgY2xhc3MuCisgICAgICAgICAgICBUaGlzIGZpZWxkIGlzIHRoZW4gdXNlZCBpbiB0aGUgYWN0dWFsIHVuaXQgdGVzdCBtZXRob2QgKDxsaXRlcmFsPnRlc3RHZXRJdCgpPC9saXRlcmFsPikuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBJbiB0aGUgPGxpdGVyYWw+dGVzdEdldEl0KCk8L2xpdGVyYWw+IG1ldGhvZCBhIGZsdWVudCBKQVgtUlMgQ2xpZW50IEFQSSBpcyB1c2VkIHRvIGNvbm5lY3QgdG8gYW5kIHNlbmQKKyAgICAgICAgICAgIGEgSFRUUCAmbGl0Lmh0dHAuR0VUOyByZXF1ZXN0IHRvIHRoZSA8bGl0ZXJhbD5NeVJlc291cmNlPC9saXRlcmFsPiBKQVgtUlMgcmVzb3VyY2UgY2xhc3MgbGlzdGVuaW5nIG9uCisgICAgICAgICAgICA8bGl0ZXJhbD4vbXlyZXNvdXJjZTwvbGl0ZXJhbD4gVVJJLiBBcyBwYXJ0IG9mIHRoZSBzYW1lIGZsdWVudCBKQVgtUlMgQVBJIG1ldGhvZCBpbnZvY2F0aW9uIGNoYWluLCBhIHJlc3BvbnNlIGlzCisgICAgICAgICAgICByZWFkIGFzIGEgSmF2YSA8bGl0ZXJhbD5TdHJpbmc8L2xpdGVyYWw+IHR5cGUuIE9uIHRoZSBzZWNvbmQgbGluZSBpbiB0aGUgdGVzdCBtZXRob2QsIHRoZSByZXNwb25zZSBjb250ZW50IHN0cmluZworICAgICAgICAgICAgcmV0dXJuZWQgZnJvbSB0aGUgc2VydmVyIGlzIGNvbXBhcmVkIHdpdGggdGhlIGV4cGVjdGVkIHBocmFzZSBpbiB0aGUgdGVzdCBhc3NlcnRpb24uIFRvIGxlYXJuIG1vcmUgYWJvdXQgdXNpbmcKKyAgICAgICAgICAgIEpBWC1SUyBDbGllbnQgQVBJLCBwbGVhc2Ugc2VlIHRoZSA8eHJlZiBsaW5rZW5kPSJjbGllbnQiIC8+IGNoYXB0ZXIuCisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiB4bWw6aWQ9InJ1bm5pbmctcHJvamVjdCI+CisgICAgICAgIDx0aXRsZT5SdW5uaW5nIHRoZSBQcm9qZWN0PC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBOb3cgdGhhdCB3ZSBoYXZlIHNlZW4gdGhlIGNvbnRlbnQgb2YgdGhlIHByb2plY3QsIGxldCdzIHRyeSB0byB0ZXN0LXJ1biBpdC4gVG8gZG8gdGhpcywgd2UgbmVlZCB0byBpbnZva2UgZm9sbG93aW5nCisgICAgICAgICAgICBjb21tYW5kIG9uIHRoZSBjb21tYW5kIGxpbmU6CisKKyAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iYmFzaCIgbGluZW51bWJlcmluZz0idW5udW1iZXJlZCI+bXZuIGNsZWFuIHRlc3Q8L3Byb2dyYW1saXN0aW5nPgorCisgICAgICAgICAgICBUaGlzIHdpbGwgY29tcGlsZSB0aGUgcHJvamVjdCBhbmQgcnVuIHRoZSBwcm9qZWN0IHVuaXQgdGVzdHMuIFdlIHNob3VsZCBzZWUgYSBzaW1pbGFyIG91dHB1dCB0aGF0IGluZm9ybXMgYWJvdXQgYQorICAgICAgICAgICAgc3VjY2Vzc2Z1bCBidWlsZCBvbmNlIHRoZSBidWlsZCBpcyBmaW5pc2hlZDoKKworICAgICAgICAgICAgPHNjcmVlbiBsaW5lbnVtYmVyaW5nPSJ1bm51bWJlcmVkIj5SZXN1bHRzIDoKKworVGVzdHMgcnVuOiAxLCBGYWlsdXJlczogMCwgRXJyb3JzOiAwLCBTa2lwcGVkOiAwCisKK1tJTkZPXSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1tJTkZPXSBCVUlMRCBTVUNDRVNTCitbSU5GT10gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitbSU5GT10gVG90YWwgdGltZTogMzQuNTI3cworW0lORk9dIEZpbmlzaGVkIGF0OiBTdW4gTWF5IDI2IDE5OjI2OjI0IENFU1QgMjAxMworW0lORk9dIEZpbmFsIE1lbW9yeTogMTdNLzQ5ME0KK1tJTkZPXSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS08L3NjcmVlbj4KKworICAgICAgICAgICAgTm93IHRoYXQgd2UgaGF2ZSB2ZXJpZmllZCB0aGF0IHRoZSBwcm9qZWN0IGNvbXBpbGVzIGFuZCB0aGF0IHRoZSB1bml0IHRlc3QgcGFzc2VzLCB3ZSBjYW4gZXhlY3V0ZSB0aGUgYXBwbGljYXRpb24KKyAgICAgICAgICAgIGluIGEgc3RhbmRhbG9uZSBtb2RlLiBUbyBkbyB0aGlzLCBydW4gdGhlIGZvbGxvd2luZyBtYXZlbiBjb21tYW5kOgorCisgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImJhc2giIGxpbmVudW1iZXJpbmc9InVubnVtYmVyZWQiPm12biBleGVjOmphdmE8L3Byb2dyYW1saXN0aW5nPgorCisgICAgICAgICAgICBUaGUgYXBwbGljYXRpb24gc3RhcnRzIGFuZCB5b3Ugc2hvdWxkIHNvb24gc2VlIHRoZSBmb2xsb3dpbmcgbm90aWZpY2F0aW9uIGluIHlvdXIgY29uc29sZToKKworICAgICAgICAgICAgPHNjcmVlbiBsaW5lbnVtYmVyaW5nPSJ1bm51bWJlcmVkIj5NYXkgMjYsIDIwMTMgODowODo0NSBQTSBvcmcuZ2xhc3NmaXNoLmdyaXp6bHkuaHR0cC5zZXJ2ZXIuTmV0d29ya0xpc3RlbmVyIHN0YXJ0CitJTkZPOiBTdGFydGVkIGxpc3RlbmVyIGJvdW5kIHRvIFtsb2NhbGhvc3Q6ODA4MF0KK01heSAyNiwgMjAxMyA4OjA4OjQ1IFBNIG9yZy5nbGFzc2Zpc2guZ3JpenpseS5odHRwLnNlcnZlci5IdHRwU2VydmVyIHN0YXJ0CitJTkZPOiBbSHR0cFNlcnZlcl0gU3RhcnRlZC4KK0plcnNleSBhcHAgc3RhcnRlZCB3aXRoIFdBREwgYXZhaWxhYmxlIGF0IGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9teWFwcC9hcHBsaWNhdGlvbi53YWRsCitIaXQgZW50ZXIgdG8gc3RvcCBpdC4uLjwvc2NyZWVuPgorCisgICAgICAgICAgICBUaGlzIGluZm9ybXMgeW91IHRoYXQgdGhlIGFwcGxpY2F0aW9uIGhhcyBiZWVuIHN0YXJ0ZWQgYW5kIGl0J3MgV0FETCBkZXNjcmlwdG9yIGlzIGF2YWlsYWJsZSBhdAorICAgICAgICAgICAgPGxpdGVyYWw+aHR0cDovL2xvY2FsaG9zdDo4MDgwL215YXBwL2FwcGxpY2F0aW9uLndhZGw8L2xpdGVyYWw+IFVSTC4gWW91IGNhbiByZXRyaWV2ZSB0aGUgV0FETCBjb250ZW50IGJ5CisgICAgICAgICAgICBleGVjdXRpbmcgYSA8bGl0ZXJhbD5jdXJsIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9teWFwcC9hcHBsaWNhdGlvbi53YWRsPC9saXRlcmFsPiBjb21tYW5kIGluIHlvdXIgY29uc29sZQorICAgICAgICAgICAgb3IgYnkgdHlwaW5nIHRoZSBXQURMIFVSTCBpbnRvIHlvdXIgZmF2b3JpdGUgYnJvd3Nlci4gWW91IHNob3VsZCBnZXQgYmFjayBhbiBYTUwgZG9jdW1lbnQgaW4gZGVzY3JpYmluZworICAgICAgICAgICAgeW91ciBkZXBsb3llZCBSRVNUZnVsIGFwcGxpY2F0aW9uIGluIGEgV0FETCBmb3JtYXQuIFRvIGxlYXJuIG1vcmUgYWJvdXQgd29ya2luZyB3aXRoIFdBREwsIGNoZWNrIHRoZQorICAgICAgICAgICAgPHhyZWYgbGlua2VuZD0id2FkbCIgLz4gY2hhcHRlci4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZSBsYXN0IHRoaW5nIHdlIHNob3VsZCB0cnkgYmVmb3JlIGNvbmNsdWRpbmcgdGhpcyBzZWN0aW9uIGlzIHRvIHNlZSBpZiB3ZSBjYW4gY29tbXVuaWNhdGUgd2l0aCBvdXIKKyAgICAgICAgICAgIHJlc291cmNlIGRlcGxveWVkIGF0IDxsaXRlcmFsPi9teXJlc291cmNlPC9saXRlcmFsPiBwYXRoLiBXZSBjYW4gYWdhaW4gZWl0aGVyIHR5cGUgdGhlIHJlc291cmNlIFVSTAorICAgICAgICAgICAgaW4gdGhlIGJyb3dzZXIgb3Igd2UgY2FuIHVzZSA8bGl0ZXJhbD5jdXJsPC9saXRlcmFsPjoKKworICAgICAgICAgICAgPHNjcmVlbiBsYW5ndWFnZT0iYmFzaCIgbGluZW51bWJlcmluZz0idW5udW1iZXJlZCI+JCBjdXJsIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9teWFwcC9teXJlc291cmNlCitHb3QgaXQhPC9zY3JlZW4+CisKKyAgICAgICAgICAgIEFzIHdlIGNhbiBzZWUsIHRoZSA8bGl0ZXJhbD5jdXJsPC9saXRlcmFsPiBjb21tYW5kIHJldHVybmVkIHdpdGggdGhlIDxsaXRlcmFsPkdvdCBpdCE8L2xpdGVyYWw+IG1lc3NhZ2UgdGhhdAorICAgICAgICAgICAgd2FzIHNlbnQgYnkgb3VyIHJlc291cmNlLiBXZSBjYW4gYWxzbyBhc2sgPGxpdGVyYWw+Y3VybDwvbGl0ZXJhbD4gdG8gcHJvdmlkZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZXNwb25zZSwKKyAgICAgICAgICAgIGZvciBleGFtcGxlIHdlIGNhbiBsZXQgaXQgZGlzcGxheSBhbGwgcmVzcG9uc2UgaGVhZGVycyBieSB1c2luZyB0aGUgPGxpdGVyYWw+LWk8L2xpdGVyYWw+IHN3aXRjaDoKKworICAgICAgICAgICAgPHNjcmVlbiBsYW5ndWFnZT0iYmFzaCIgbGluZW51bWJlcmluZz0idW5udW1iZXJlZCI+Y3VybCAtaSBodHRwOi8vbG9jYWxob3N0OjgwODAvbXlhcHAvbXlyZXNvdXJjZQorSFRUUC8xLjEgMjAwIE9LCitDb250ZW50LVR5cGU6IHRleHQvcGxhaW4KK0RhdGU6IFN1biwgMjYgTWF5IDIwMTMgMTg6Mjc6MTkgR01UCitDb250ZW50LUxlbmd0aDogNworCitHb3QgaXQhPC9zY3JlZW4+CisKKyAgICAgICAgICAgIEhlcmUgd2Ugc2VlIHRoZSB3aG9sZSBjb250ZW50IG9mIHRoZSByZXNwb25zZSBtZXNzYWdlIHRoYXQgb3VyIEplcnNleS9KQVgtUlMgYXBwbGljYXRpb24gcmV0dXJuZWQsIGluY2x1ZGluZyBhbGwKKyAgICAgICAgICAgIHRoZSBIVFRQIGhlYWRlcnMuIE5vdGljZSB0aGUgPGxpdGVyYWw+Q29udGVudC1UeXBlOiB0ZXh0L3BsYWluPC9saXRlcmFsPiBoZWFkZXIgdGhhdCB3YXMgZGVyaXZlZCBmcm9tIHRoZQorICAgICAgICAgICAgdmFsdWUgb2YgJmpheHJzLlByb2R1Y2VzOyBhbm5vdGF0aW9uIGF0dGFjaGVkIHRvIHRoZSA8bGl0ZXJhbD5NeVJlc291cmNlPC9saXRlcmFsPiBjbGFzcy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEluIGNhc2UgeW91IHdhbnQgdG8gc2VlIGV2ZW4gbW9yZSBkZXRhaWxzIGFib3V0IHRoZSBjb21tdW5pY2F0aW9uIGJldHdlZW4gb3VyIDxsaXRlcmFsPmN1cmw8L2xpdGVyYWw+IGNsaWVudAorICAgICAgICAgICAgYW5kIG91ciByZXNvdXJjZSBydW5uaW5nIG9uIEplcnNleSBpbiBhIEdyaXp6bHkgSS9PIGNvbnRhaW5lciwgZmVlbCBmcmVlIHRvIHRyeSBvdGhlciB2YXJpb3VzIG9wdGlvbnMgYW5kIHN3aXRjaGVzCisgICAgICAgICAgICB0aGF0IDxsaXRlcmFsPmN1cmw8L2xpdGVyYWw+IHByb3ZpZGVzLiBGb3IgZXhhbXBsZSwgdGhpcyBsYXN0IGNvbW1hbmQgd2lsbCBtYWtlIDxsaXRlcmFsPmN1cmw8L2xpdGVyYWw+IG91dHB1dAorICAgICAgICAgICAgYSBsb3Qgb2YgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgd2hvbGUgY29tbXVuaWNhdGlvbjoKKworICAgICAgICAgICAgPHNjcmVlbiBsYW5ndWFnZT0iYmFzaCIgbGluZW51bWJlcmluZz0idW5udW1iZXJlZCI+PCFbQ0RBVEFbJCBjdXJsIC12IGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9teWFwcC9teXJlc291cmNlCisqIEFib3V0IHRvIGNvbm5lY3QoKSB0byBsb2NhbGhvc3QgcG9ydCA4MDgwICgjMCkKKyogICBUcnlpbmcgOjoxLi4uCisqIENvbm5lY3Rpb24gcmVmdXNlZAorKiAgIFRyeWluZyAxMjcuMC4wLjEuLi4KKyogY29ubmVjdGVkCisqIENvbm5lY3RlZCB0byBsb2NhbGhvc3QgKDEyNy4wLjAuMSkgcG9ydCA4MDgwICgjMCkKKz4gR0VUIC9teWFwcC9teXJlc291cmNlIEhUVFAvMS4xCis+IFVzZXItQWdlbnQ6IGN1cmwvNy4yNS4wICh4ODZfNjQtYXBwbGUtZGFyd2luMTEuMy4wKSBsaWJjdXJsLzcuMjUuMCBPcGVuU1NMLzEuMC4xZSB6bGliLzEuMi43IGxpYmlkbi8xLjIyCis+IEhvc3Q6IGxvY2FsaG9zdDo4MDgwCis+IEFjY2VwdDogKi8qCis+Cis8IEhUVFAvMS4xIDIwMCBPSworPCBDb250ZW50LVR5cGU6IHRleHQvcGxhaW4KKzwgRGF0ZTogU3VuLCAyNiBNYXkgMjAxMyAxODoyOToxOCBHTVQKKzwgQ29udGVudC1MZW5ndGg6IDcKKzwKKyogQ29ubmVjdGlvbiAjMCB0byBob3N0IGxvY2FsaG9zdCBsZWZ0IGludGFjdAorR290IGl0ISogQ2xvc2luZyBjb25uZWN0aW9uICMwXV0+PC9zY3JlZW4+CisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiB4bWw6aWQ9Im5ldy13ZWJhcHAiPgorICAgICAgICA8dGl0bGU+Q3JlYXRpbmcgYSBKYXZhRUUgV2ViIEFwcGxpY2F0aW9uPC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUbyBjcmVhdGUgYSBXZWIgQXBwbGljYXRpb24gdGhhdCBjYW4gYmUgcGFja2FnZWQgYXMgV0FSIGFuZCBkZXBsb3llZCBpbiBhIFNlcnZsZXQgY29udGFpbmVyIGZvbGxvdyBhIHNpbWlsYXIgcHJvY2VzcworICAgICAgICAgICAgdG8gdGhlIG9uZSBkZXNjcmliZWQgaW4gPHhyZWYgbGlua2VuZD0ibmV3LWZyb20tYXJjaGV0eXBlIiAvPi4KKyAgICAgICAgICAgIEluIGFkZGl0aW9uIHRvIHRoZSBHcml6emx5LWJhc2VkIGFyY2hldHlwZSwgSmVyc2V5IHByb3ZpZGVzIGFsc28gYSBNYXZlbiBhcmNoZXR5cGUgZm9yIGNyZWF0aW5nIHdlYiBhcHBsaWNhdGlvbgorICAgICAgICAgICAgc2tlbGV0b25zLiBUbyBjcmVhdGUgdGhlIG5ldyB3ZWIgYXBwbGljYXRpb24gc2tlbGV0b24gcHJvamVjdCwgZXhlY3V0ZSB0aGUgZm9sbG93aW5nIE1hdmVuIGNvbW1hbmQgaW4gdGhlIGRpcmVjdG9yeQorICAgICAgICAgICAgd2hlcmUgdGhlIG5ldyBwcm9qZWN0IHNob3VsZCByZXNpZGU6CisKKyAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iYmFzaCIgbGluZW51bWJlcmluZz0idW5udW1iZXJlZCI+bXZuIGFyY2hldHlwZTpnZW5lcmF0ZSAtRGFyY2hldHlwZUFydGlmYWN0SWQ9amVyc2V5LXF1aWNrc3RhcnQtd2ViYXBwIFwKKyAgICAgICAgICAgICAgICAtRGFyY2hldHlwZUdyb3VwSWQ9b3JnLmdsYXNzZmlzaC5qZXJzZXkuYXJjaGV0eXBlcyAtRGludGVyYWN0aXZlTW9kZT1mYWxzZSBcCisgICAgICAgICAgICAgICAgLURncm91cElkPWNvbS5leGFtcGxlIC1EYXJ0aWZhY3RJZD1zaW1wbGUtc2VydmljZS13ZWJhcHAgLURwYWNrYWdlPWNvbS5leGFtcGxlIFwKKyAgICAgICAgICAgICAgICAtRGFyY2hldHlwZVZlcnNpb249JnZlcnNpb247PC9wcm9ncmFtbGlzdGluZz4KKworICAgICAgICAgICAgQXMgd2l0aCB0aGUgR3JpenpseSBiYXNlZCBwcm9qZWN0LCBmZWVsIGZyZWUgdG8gYWRqdXN0IHRoZSA8bGl0ZXJhbD5ncm91cElkPC9saXRlcmFsPiwgPGxpdGVyYWw+cGFja2FnZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgIGFuZC9vciA8bGl0ZXJhbD5hcnRpZmFjdElkPC9saXRlcmFsPiBvZiB5b3VyIG5ldyB3ZWIgYXBwbGljYXRpb24gcHJvamVjdC4gQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBjaGFuZ2UgaXQgYnkgdXBkYXRpbmcKKyAgICAgICAgICAgIHRoZSBuZXcgcHJvamVjdCAmbGl0LnBvbS54bWw7IG9uY2UgaXQgZ2V0cyBnZW5lcmF0ZWQuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBPbmNlIHRoZSBwcm9qZWN0IGdlbmVyYXRpb24gZnJvbSBhIEplcnNleSBtYXZlbiBhcmNoZXR5cGUgaXMgc3VjY2Vzc2Z1bGx5IGZpbmlzaGVkLCB5b3Ugc2hvdWxkIHNlZSB0aGUgbmV3CisgICAgICAgICAgICA8bGl0ZXJhbD5zaW1wbGUtc2VydmljZS13ZWJhcHA8L2xpdGVyYWw+IHByb2plY3QgZGlyZWN0b3J5IGNyZWF0ZWQgaW4geW91ciBjdXJyZW50IGxvY2F0aW9uLiBUaGUgZGlyZWN0b3J5IGNvbnRhaW5zCisgICAgICAgICAgICBhIHN0YW5kYXJkIE1hdmVuIHByb2plY3Qgc3RydWN0dXJlLCBzaW1pbGFyIHRvIHRoZSA8bGl0ZXJhbD5zaW1wbGUtc2VydmljZTwvbGl0ZXJhbD4gcHJvamVjdCBjb250ZW50IHdlIGhhdmUgc2VlbgorICAgICAgICAgICAgZWFybGllciwgZXhjZXB0IGl0IGlzIGV4dGVuZGVkIHdpdGggYW4gYWRkaXRpb25hbCB3ZWIgYXBwbGljYXRpb24gc3BlY2lmaWMgY29udGVudDoKKworICAgICAgICAgICAgPHNpbXBsZWxpc3Q+CisgICAgICAgICAgICAgICAgPG1lbWJlcj4KKyAgICAgICAgICAgICAgICAgICAgUHJvamVjdCBidWlsZCBhbmQgbWFuYWdlbWVudCBjb25maWd1cmF0aW9uIGlzIGRlc2NyaWJlZCBpbiB0aGUgPGxpdGVyYWw+cG9tLnhtbDwvbGl0ZXJhbD4gbG9jYXRlZAorICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcHJvamVjdCByb290IGRpcmVjdG9yeS4KKyAgICAgICAgICAgICAgICA8L21lbWJlcj4KKyAgICAgICAgICAgICAgICA8bWVtYmVyPlByb2plY3Qgc291cmNlcyBhcmUgbG9jYXRlZCB1bmRlciA8bGl0ZXJhbD5zcmMvbWFpbi9qYXZhPC9saXRlcmFsPi48L21lbWJlcj4KKyAgICAgICAgICAgICAgICA8bWVtYmVyPlByb2plY3QgcmVzb3VyY2VzIGFyZSBsb2NhdGVkIHVuZGVyIDxsaXRlcmFsPnNyYy9tYWluL3Jlc291cmNlczwvbGl0ZXJhbD4uPC9tZW1iZXI+CisgICAgICAgICAgICAgICAgPG1lbWJlcj5Qcm9qZWN0IHdlYiBhcHBsaWNhdGlvbiBmaWxlcyBhcmUgbG9jYXRlZCB1bmRlciA8bGl0ZXJhbD5zcmMvbWFpbi93ZWJhcHA8L2xpdGVyYWw+LjwvbWVtYmVyPgorICAgICAgICAgICAgPC9zaW1wbGVsaXN0PgorCisgICAgICAgICAgICBUaGUgcHJvamVjdCBjb250YWlucyB0aGUgc2FtZSA8bGl0ZXJhbD5NeVJlc291Y2U8L2xpdGVyYWw+IEpBWC1SUyByZXNvdXJjZSBjbGFzcy4gSXQgZG9lcyBub3QgY29udGFpbiBhbnkgdW5pdCB0ZXN0cworICAgICAgICAgICAgYXMgd2VsbCBhcyBpdCBkb2VzIG5vdCBjb250YWluIGEgPGxpdGVyYWw+TWFpbjwvbGl0ZXJhbD4gY2xhc3MgdGhhdCB3YXMgdXNlZCB0byBzZXR1cCBHcml6emx5IGNvbnRhaW5lciBpbiB0aGUKKyAgICAgICAgICAgIHByZXZpb3VzIHByb2plY3QuIEluc3RlYWQsIGl0IGNvbnRhaW5zIHRoZSBzdGFuZGFyZCBKYXZhIEVFIHdlYiBhcHBsaWNhdGlvbiA8bGl0ZXJhbD53ZWIueG1sPC9saXRlcmFsPiBkZXBsb3ltZW50CisgICAgICAgICAgICBkZXNjcmlwdG9yIHVuZGVyIDxsaXRlcmFsPnNyYy9tYWluL3dlYmFwcC9XRUItSU5GPC9saXRlcmFsPi4KKyAgICAgICAgICAgIFRoZSBsYXN0IGNvbXBvbmVudCBpbiB0aGUgcHJvamVjdCBpcyBhbiA8bGl0ZXJhbD5pbmRleC5qc3A8L2xpdGVyYWw+IHBhZ2UgdGhhdCBzZXJ2ZXMgYXMgYSBjbGllbnQgZm9yIHRoZQorICAgICAgICAgICAgPGxpdGVyYWw+TXlSZXNvdXJjZTwvbGl0ZXJhbD4gcmVzb3VyY2UgY2xhc3MgdGhhdCBpcyBwYWNrYWdlZCBhbmQgZGVwbG95ZWQgd2l0aCB0aGUgYXBwbGljYXRpb24uCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUbyBjb21waWxlIGFuZCBwYWNrYWdlIHRoZSBhcHBsaWNhdGlvbiBpbnRvIGEgV0FSLCBpbnZva2UgdGhlIGZvbGxvd2luZyBtYXZlbiBjb21tYW5kIGluIHlvdXIgY29uc29sZToKKworICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJiYXNoIiBsaW5lbnVtYmVyaW5nPSJ1bm51bWJlcmVkIj5tdm4gY2xlYW4gcGFja2FnZTwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgICAgICAgICAgIEEgc3VjY2Vzc2Z1bCBidWlsZCBvdXRwdXQgd2lsbCBwcm9kdWNlIGFuIG91dHB1dCBzaW1pbGFyIHRvIHRoZSBvbmUgYmVsb3c6CisKKyAgICAgICAgICAgIDxzY3JlZW4gbGluZW51bWJlcmluZz0idW5udW1iZXJlZCI+UmVzdWx0cyA6CisKK1Rlc3RzIHJ1bjogMCwgRmFpbHVyZXM6IDAsIEVycm9yczogMCwgU2tpcHBlZDogMAorCitbSU5GT10KK1tJTkZPXSAtLS0gbWF2ZW4td2FyLXBsdWdpbjoyLjEuMTp3YXIgKGRlZmF1bHQtd2FyKSBAIHNpbXBsZS1zZXJ2aWNlLXdlYmFwcCAtLS0KK1tJTkZPXSBQYWNrYWdpbmcgd2ViYXBwCitbSU5GT10gQXNzZW1ibGluZyB3ZWJhcHAgW3NpbXBsZS1zZXJ2aWNlLXdlYmFwcF0gaW4gWy4uLi9zaW1wbGUtc2VydmljZS13ZWJhcHAvdGFyZ2V0L3NpbXBsZS1zZXJ2aWNlLXdlYmFwcF0KK1tJTkZPXSBQcm9jZXNzaW5nIHdhciBwcm9qZWN0CitbSU5GT10gQ29weWluZyB3ZWJhcHAgcmVzb3VyY2VzIFsuLi4vc2ltcGxlLXNlcnZpY2Utd2ViYXBwL3NyYy9tYWluL3dlYmFwcF0KK1tJTkZPXSBXZWJhcHAgYXNzZW1ibGVkIGluIFs3NSBtc2Vjc10KK1tJTkZPXSBCdWlsZGluZyB3YXI6IC4uLi9zaW1wbGUtc2VydmljZS13ZWJhcHAvdGFyZ2V0L3NpbXBsZS1zZXJ2aWNlLXdlYmFwcC53YXIKK1tJTkZPXSBXRUItSU5GL3dlYi54bWwgYWxyZWFkeSBhZGRlZCwgc2tpcHBpbmcKK1tJTkZPXSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1tJTkZPXSBCVUlMRCBTVUNDRVNTCitbSU5GT10gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitbSU5GT10gVG90YWwgdGltZTogOS4wNjdzCitbSU5GT10gRmluaXNoZWQgYXQ6IFN1biBNYXkgMjYgMjE6MDc6NDQgQ0VTVCAyMDEzCitbSU5GT10gRmluYWwgTWVtb3J5OiAxN00vNDkwTQorW0lORk9dIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvc2NyZWVuPgorCisgICAgICAgICAgICBOb3cgeW91IGFyZSByZWFkeSB0byB0YWtlIHRoZSBwYWNrYWdlZCBXQVIgKGxvY2F0ZWQgdW5kZXIgPGxpdGVyYWw+Li90YXJnZXQvc2ltcGxlLXNlcnZpY2Utd2ViYXBwLndhcjwvbGl0ZXJhbD4pCisgICAgICAgICAgICBhbmQgZGVwbG95IGl0IHRvIGEgU2VydmxldCBjb250YWluZXIgb2YgeW91ciBjaG9pY2UuCisgICAgICAgICAgICA8aW1wb3J0YW50PgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUbyBkZXBsb3kgYSBKZXJzZXkgYXBwbGljYXRpb24sIHlvdSB3aWxsIG5lZWQgYSBTZXJ2bGV0IGNvbnRhaW5lciB0aGF0IHN1cHBvcnRzIFNlcnZsZXQgMi41IG9yIGxhdGVyLgorICAgICAgICAgICAgICAgICAgICBGb3IgZnVsbCBzZXQgb2YgYWR2YW5jZWQgZmVhdHVyZXMgKHN1Y2ggYXMgSkFYLVJTIDIuMCBBc3luYyBTdXBwb3J0KSB5b3Ugd2lsbCBuZWVkIGEgU2VydmxldCAzLjAgb3IgbGF0ZXIKKyAgICAgICAgICAgICAgICAgICAgY29tcGxpYW50IGNvbnRhaW5lci4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2ltcG9ydGFudD4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKworICAgICA8c2VjdGlvbiB4bWw6aWQ9Imhlcm9rdS13ZWJhcHAiPgorICAgICAgICA8dGl0bGU+Q3JlYXRpbmcgYSBXZWIgQXBwbGljYXRpb24gdGhhdCBjYW4gYmUgZGVwbG95ZWQgb24gSGVyb2t1PC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUbyBjcmVhdGUgYSBXZWIgQXBwbGljYXRpb24gdGhhdCBjYW4gYmUgZWl0aGVyIHBhY2thZ2VkIGFzIFdBUiBhbmQgZGVwbG95ZWQgaW4gYSBTZXJ2bGV0IGNvbnRhaW5lciBvciB0aGF0IGNhbiBiZQorICAgICAgICAgICAgcHVzaGVkIGFuZCBkZXBsb3llZCBvbiAmaGVyb2t1Lmxpbms7IHRoZSBwcm9jZXNzIGlzIHZlcnkgc2ltaWxhciB0byB0aGUgb25lIGRlc2NyaWJlZCBpbiA8eHJlZiBsaW5rZW5kPSJuZXctd2ViYXBwIiAvPi4KKyAgICAgICAgICAgIFRvIGNyZWF0ZSB0aGUgbmV3IHdlYiBhcHBsaWNhdGlvbiBza2VsZXRvbiBwcm9qZWN0LCBleGVjdXRlIHRoZSBmb2xsb3dpbmcgTWF2ZW4gY29tbWFuZCBpbiB0aGUgZGlyZWN0b3J5CisgICAgICAgICAgICB3aGVyZSB0aGUgbmV3IHByb2plY3Qgc2hvdWxkIHJlc2lkZToKKworICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJiYXNoIiBsaW5lbnVtYmVyaW5nPSJ1bm51bWJlcmVkIj5tdm4gYXJjaGV0eXBlOmdlbmVyYXRlIC1EYXJjaGV0eXBlQXJ0aWZhY3RJZD1qZXJzZXktaGVyb2t1LXdlYmFwcCBcCisgICAgICAgICAgICAgICAgLURhcmNoZXR5cGVHcm91cElkPW9yZy5nbGFzc2Zpc2guamVyc2V5LmFyY2hldHlwZXMgLURpbnRlcmFjdGl2ZU1vZGU9ZmFsc2UgXAorICAgICAgICAgICAgICAgIC1EZ3JvdXBJZD1jb20uZXhhbXBsZSAtRGFydGlmYWN0SWQ9c2ltcGxlLWhlcm9rdS13ZWJhcHAgLURwYWNrYWdlPWNvbS5leGFtcGxlIFwKKyAgICAgICAgICAgICAgICAtRGFyY2hldHlwZVZlcnNpb249JnZlcnNpb247PC9wcm9ncmFtbGlzdGluZz4KKworICAgICAgICAgICAgQWRqdXN0IHRoZSA8bGl0ZXJhbD5ncm91cElkPC9saXRlcmFsPiwgPGxpdGVyYWw+cGFja2FnZTwvbGl0ZXJhbD4gYW5kL29yIDxsaXRlcmFsPmFydGlmYWN0SWQ8L2xpdGVyYWw+IG9mIHlvdXIgbmV3IHdlYgorICAgICAgICAgICAgYXBwbGljYXRpb24gcHJvamVjdCB0byB5b3VyIG5lZWRzIG9yLCBhbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGNoYW5nZSBpdCBieSB1cGRhdGluZyB0aGUgbmV3IHByb2plY3QgJmxpdC5wb20ueG1sOyBvbmNlIGl0CisgICAgICAgICAgICBnZXRzIGdlbmVyYXRlZC4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIE9uY2UgdGhlIHByb2plY3QgZ2VuZXJhdGlvbiBmcm9tIGEgSmVyc2V5IG1hdmVuIGFyY2hldHlwZSBpcyBzdWNjZXNzZnVsbHkgZmluaXNoZWQsIHlvdSBzaG91bGQgc2VlIHRoZSBuZXcKKyAgICAgICAgICAgIDxsaXRlcmFsPnNpbXBsZS1oZXJva3Utd2ViYXBwPC9saXRlcmFsPiBwcm9qZWN0IGRpcmVjdG9yeSBjcmVhdGVkIGluIHlvdXIgY3VycmVudCBsb2NhdGlvbi4gVGhlIGRpcmVjdG9yeSBjb250YWlucworICAgICAgICAgICAgYSBzdGFuZGFyZCBNYXZlbiBwcm9qZWN0IHN0cnVjdHVyZToKKworICAgICAgICAgICAgPHNpbXBsZWxpc3Q+CisgICAgICAgICAgICAgICAgPG1lbWJlcj4KKyAgICAgICAgICAgICAgICAgICAgUHJvamVjdCBidWlsZCBhbmQgbWFuYWdlbWVudCBjb25maWd1cmF0aW9uIGlzIGRlc2NyaWJlZCBpbiB0aGUgJmxpdC5wb20ueG1sOyBsb2NhdGVkCisgICAgICAgICAgICAgICAgICAgIGluIHRoZSBwcm9qZWN0IHJvb3QgZGlyZWN0b3J5LgorICAgICAgICAgICAgICAgIDwvbWVtYmVyPgorICAgICAgICAgICAgICAgIDxtZW1iZXI+UHJvamVjdCBzb3VyY2VzIGFyZSBsb2NhdGVkIHVuZGVyIDxsaXRlcmFsPnNyYy9tYWluL2phdmE8L2xpdGVyYWw+LjwvbWVtYmVyPgorICAgICAgICAgICAgICAgIDxtZW1iZXI+UHJvamVjdCByZXNvdXJjZXMgYXJlIGxvY2F0ZWQgdW5kZXIgPGxpdGVyYWw+c3JjL21haW4vcmVzb3VyY2VzPC9saXRlcmFsPi48L21lbWJlcj4KKyAgICAgICAgICAgICAgICA8bWVtYmVyPlByb2plY3Qgd2ViIGFwcGxpY2F0aW9uIGZpbGVzIGFyZSBsb2NhdGVkIHVuZGVyIDxsaXRlcmFsPnNyYy9tYWluL3dlYmFwcDwvbGl0ZXJhbD4uPC9tZW1iZXI+CisgICAgICAgICAgICAgICAgPG1lbWJlcj5Qcm9qZWN0IHRlc3Qtc291cmNlcyAoYmFzZWQgb24gJmplcnNleS50ZXN0LkplcnNleVRlc3Q7KSBhcmUgbG9jYXRlZCB1bmRlciA8bGl0ZXJhbD5zcmMvdGVzdC9qYXZhPC9saXRlcmFsPi48L21lbWJlcj4KKyAgICAgICAgICAgICAgICA8bWVtYmVyPkhlcm9rdSBzeXN0ZW0gcHJvcGVydGllcyAoT3BlbkpESyB2ZXJzaW9uKSBhcmUgZGVmaW5lZCBpbiA8bGl0ZXJhbD5zeXN0ZW0ucHJvcGVydGllczwvbGl0ZXJhbD4uPC9tZW1iZXI+CisgICAgICAgICAgICAgICAgPG1lbWJlcj5MaXN0cyBvZiB0aGUgcHJvY2VzcyB0eXBlcyBpbiBhbiBhcHBsaWNhdGlvbiBmb3IgSGVyb2t1IGlzIGluIDxsaXRlcmFsPlByb2NmaWxlPC9saXRlcmFsPi48L21lbWJlcj4KKyAgICAgICAgICAgIDwvc2ltcGxlbGlzdD4KKworICAgICAgICAgICAgVGhlIHByb2plY3QgY29udGFpbnMgb25lIEpBWC1SUyByZXNvdXJjZSBjbGFzcywgPGxpdGVyYWw+TXlSZXNvdWNlPC9saXRlcmFsPiwgYW5kIG9uZSByZXNvdXJjZSBtZXRob2Qgd2hpY2ggcmV0dXJucworICAgICAgICAgICAgc2ltcGxlIHRleHQgbWVzc2FnZS4gVG8gbWFrZSBzdXJlIHRoZSByZXNvdXJjZSBpcyBwcm9wZXJseSB0ZXN0ZWQgdGhlcmUgaXMgYWxzbyBhIGVuZC10by1lbmQgdGVzdC1jYXNlCisgICAgICAgICAgICBpbiA8bGl0ZXJhbD5NeVJlc291cmNlVGVzdDwvbGl0ZXJhbD4gKHRoZSB0ZXN0IGlzIGJhc2VkIG9uICZqZXJzZXkudGVzdC5KZXJzZXlUZXN0OyBmcm9tIG91ciA8eHJlZiBsaW5rZW5kPSJ0ZXN0LWZyYW1ld29yayIgLz4pLgorICAgICAgICAgICAgU2ltaWxhcmx5IHRvIDxsaXRlcmFsPnNpbXBsZS1zZXJ2aWNlLXdlYmFwcDwvbGl0ZXJhbD4sIHRoZSBwcm9qZWN0IGNvbnRhaW5zIHRoZSBzdGFuZGFyZCBKYXZhIEVFIHdlYiBhcHBsaWNhdGlvbgorICAgICAgICAgICAgPGxpdGVyYWw+d2ViLnhtbDwvbGl0ZXJhbD4gZGVwbG95bWVudCBkZXNjcmlwdG9yIHVuZGVyIDxsaXRlcmFsPnNyYy9tYWluL3dlYmFwcC9XRUItSU5GPC9saXRlcmFsPiBzaW5jZSB0aGUgZ29hbCBpcyB0bworICAgICAgICAgICAgZGVwbG95IHRoZSBhcHBsaWNhdGlvbiBpbiBhIFNlcnZsZXQgY29udGFpbmVyICh0aGUgYXBwbGljYXRpb24gd2lsbCBydW4gaW4gSmV0dHkgb24gSGVyb2t1KS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRvIGNvbXBpbGUgYW5kIHBhY2thZ2UgdGhlIGFwcGxpY2F0aW9uIGludG8gYSBXQVIsIGludm9rZSB0aGUgZm9sbG93aW5nIG1hdmVuIGNvbW1hbmQgaW4geW91ciBjb25zb2xlOgorCisgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImJhc2giIGxpbmVudW1iZXJpbmc9InVubnVtYmVyZWQiPm12biBjbGVhbiBwYWNrYWdlPC9wcm9ncmFtbGlzdGluZz4KKworICAgICAgICAgICAgQSBzdWNjZXNzZnVsIGJ1aWxkIG91dHB1dCB3aWxsIHByb2R1Y2UgYW4gb3V0cHV0IHNpbWlsYXIgdG8gdGhlIG9uZSBiZWxvdzoKKworICAgICAgICAgICAgPHNjcmVlbiBsaW5lbnVtYmVyaW5nPSJ1bm51bWJlcmVkIj4gICAgUmVzdWx0cyA6CisKKyAgICBUZXN0cyBydW46IDEsIEZhaWx1cmVzOiAwLCBFcnJvcnM6IDAsIFNraXBwZWQ6IDAKKworICAgIFtJTkZPXQorICAgIFtJTkZPXSAtLS0gbWF2ZW4td2FyLXBsdWdpbjoyLjI6d2FyIChkZWZhdWx0LXdhcikgQCBzaW1wbGUtaGVyb2t1LXdlYmFwcCAtLS0KKyAgICBbSU5GT10gUGFja2FnaW5nIHdlYmFwcAorICAgIFtJTkZPXSBBc3NlbWJsaW5nIHdlYmFwcCBbc2ltcGxlLWhlcm9rdS13ZWJhcHBdIGluIFsuLi4vc2ltcGxlLWhlcm9rdS13ZWJhcHAvdGFyZ2V0L3NpbXBsZS1oZXJva3Utd2ViYXBwXQorICAgIFtJTkZPXSBQcm9jZXNzaW5nIHdhciBwcm9qZWN0CisgICAgW0lORk9dIENvcHlpbmcgd2ViYXBwIHJlc291cmNlcyBbLi4uL3NpbXBsZS1oZXJva3Utd2ViYXBwL3NyYy9tYWluL3dlYmFwcF0KKyAgICBbSU5GT10gV2ViYXBwIGFzc2VtYmxlZCBpbiBbNTcgbXNlY3NdCisgICAgW0lORk9dIEJ1aWxkaW5nIHdhcjogLi4uL3NpbXBsZS1oZXJva3Utd2ViYXBwL3RhcmdldC9zaW1wbGUtaGVyb2t1LXdlYmFwcC53YXIKKyAgICBbSU5GT10gV0VCLUlORi93ZWIueG1sIGFscmVhZHkgYWRkZWQsIHNraXBwaW5nCisgICAgW0lORk9dCisgICAgW0lORk9dIC0tLSBtYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjoyLjg6Y29weS1kZXBlbmRlbmNpZXMgKGNvcHktZGVwZW5kZW5jaWVzKSBAIHNpbXBsZS1oZXJva3Utd2ViYXBwIC0tLQorICAgIFtJTkZPXSBDb3B5aW5nIGhrMi1sb2NhdG9yLTIuMi4wLWIyMS5qYXIgdG8gLi4uL3NpbXBsZS1oZXJva3Utd2ViYXBwL3RhcmdldC9kZXBlbmRlbmN5L2hrMi1sb2NhdG9yLTIuMi4wLWIyMS5qYXIKKyAgICBbSU5GT10gQ29weWluZyBqZXR0eS1zZWN1cml0eS05LjAuNi52MjAxMzA5MzAuamFyIHRvIC4uLi9zaW1wbGUtaGVyb2t1LXdlYmFwcC90YXJnZXQvZGVwZW5kZW5jeS9qZXR0eS1zZWN1cml0eS05LjAuNi52MjAxMzA5MzAuamFyCisgICAgW0lORk9dIENvcHlpbmcgYXNtLWFsbC1yZXBhY2thZ2VkLTIuMi4wLWIyMS5qYXIgdG8gLi4uL3NpbXBsZS1oZXJva3Utd2ViYXBwL3RhcmdldC9kZXBlbmRlbmN5L2FzbS1hbGwtcmVwYWNrYWdlZC0yLjIuMC1iMjEuamFyCisgICAgW0lORk9dIENvcHlpbmcgamVyc2V5LWNvbW1vbi0yLjUuamFyIHRvIC4uLi9zaW1wbGUtaGVyb2t1LXdlYmFwcC90YXJnZXQvZGVwZW5kZW5jeS9qZXJzZXktY29tbW9uLTIuNS5qYXIKKyAgICBbSU5GT10gQ29weWluZyB2YWxpZGF0aW9uLWFwaS0xLjEuMC5GaW5hbC5qYXIgdG8gLi4uL3NpbXBsZS1oZXJva3Utd2ViYXBwL3RhcmdldC9kZXBlbmRlbmN5L3ZhbGlkYXRpb24tYXBpLTEuMS4wLkZpbmFsLmphcgorICAgIFtJTkZPXSBDb3B5aW5nIGpldHR5LXdlYmFwcC05LjAuNi52MjAxMzA5MzAuamFyIHRvIC4uLi9zaW1wbGUtaGVyb2t1LXdlYmFwcC90YXJnZXQvZGVwZW5kZW5jeS9qZXR0eS13ZWJhcHAtOS4wLjYudjIwMTMwOTMwLmphcgorICAgIFtJTkZPXSBDb3B5aW5nIGplcnNleS1jb250YWluZXItc2VydmxldC0yLjUuamFyIHRvIC4uLi9zaW1wbGUtaGVyb2t1LXdlYmFwcC90YXJnZXQvZGVwZW5kZW5jeS9qZXJzZXktY29udGFpbmVyLXNlcnZsZXQtMi41LmphcgorICAgIFtJTkZPXSBDb3B5aW5nIGNnbGliLTIuMi4wLWIyMS5qYXIgdG8gLi4uL3NpbXBsZS1oZXJva3Utd2ViYXBwL3RhcmdldC9kZXBlbmRlbmN5L2NnbGliLTIuMi4wLWIyMS5qYXIKKyAgICBbSU5GT10gQ29weWluZyBvc2dpLXJlc291cmNlLWxvY2F0b3ItMS4wLjEuamFyIHRvIC4uLi9zaW1wbGUtaGVyb2t1LXdlYmFwcC90YXJnZXQvZGVwZW5kZW5jeS9vc2dpLXJlc291cmNlLWxvY2F0b3ItMS4wLjEuamFyCisgICAgW0lORk9dIENvcHlpbmcgaGsyLXV0aWxzLTIuMi4wLWIyMS5qYXIgdG8gLi4uL3NpbXBsZS1oZXJva3Utd2ViYXBwL3RhcmdldC9kZXBlbmRlbmN5L2hrMi11dGlscy0yLjIuMC1iMjEuamFyCisgICAgW0lORk9dIENvcHlpbmcgaGsyLWFwaS0yLjIuMC1iMjEuamFyIHRvIC4uLi9zaW1wbGUtaGVyb2t1LXdlYmFwcC90YXJnZXQvZGVwZW5kZW5jeS9oazItYXBpLTIuMi4wLWIyMS5qYXIKKyAgICBbSU5GT10gQ29weWluZyBqZXR0eS1pby05LjAuNi52MjAxMzA5MzAuamFyIHRvIC4uLi9zaW1wbGUtaGVyb2t1LXdlYmFwcC90YXJnZXQvZGVwZW5kZW5jeS9qZXR0eS1pby05LjAuNi52MjAxMzA5MzAuamFyCisgICAgW0lORk9dIENvcHlpbmcgamV0dHktc2VydmVyLTkuMC42LnYyMDEzMDkzMC5qYXIgdG8gLi4uL3NpbXBsZS1oZXJva3Utd2ViYXBwL3RhcmdldC9kZXBlbmRlbmN5L2pldHR5LXNlcnZlci05LjAuNi52MjAxMzA5MzAuamFyCisgICAgW0lORk9dIENvcHlpbmcgamV0dHktdXRpbC05LjAuNi52MjAxMzA5MzAuamFyIHRvIC4uLi9zaW1wbGUtaGVyb2t1LXdlYmFwcC90YXJnZXQvZGVwZW5kZW5jeS9qZXR0eS11dGlsLTkuMC42LnYyMDEzMDkzMC5qYXIKKyAgICBbSU5GT10gQ29weWluZyBqZXJzZXktY2xpZW50LTIuNS5qYXIgdG8gLi4uL3NpbXBsZS1oZXJva3Utd2ViYXBwL3RhcmdldC9kZXBlbmRlbmN5L2plcnNleS1jbGllbnQtMi41LmphcgorICAgIFtJTkZPXSBDb3B5aW5nIGpldHR5LWh0dHAtOS4wLjYudjIwMTMwOTMwLmphciB0byAuLi4vc2ltcGxlLWhlcm9rdS13ZWJhcHAvdGFyZ2V0L2RlcGVuZGVuY3kvamV0dHktaHR0cC05LjAuNi52MjAxMzA5MzAuamFyCisgICAgW0lORk9dIENvcHlpbmcgZ3VhdmEtMTQuMC4xLmphciB0byAuLi4vc2ltcGxlLWhlcm9rdS13ZWJhcHAvdGFyZ2V0L2RlcGVuZGVuY3kvZ3VhdmEtMTQuMC4xLmphcgorICAgIFtJTkZPXSBDb3B5aW5nIGpldHR5LXhtbC05LjAuNi52MjAxMzA5MzAuamFyIHRvIC4uLi9zaW1wbGUtaGVyb2t1LXdlYmFwcC90YXJnZXQvZGVwZW5kZW5jeS9qZXR0eS14bWwtOS4wLjYudjIwMTMwOTMwLmphcgorICAgIFtJTkZPXSBDb3B5aW5nIGplcnNleS1zZXJ2ZXItMi41LmphciB0byAuLi4vc2ltcGxlLWhlcm9rdS13ZWJhcHAvdGFyZ2V0L2RlcGVuZGVuY3kvamVyc2V5LXNlcnZlci0yLjUuamFyCisgICAgW0lORk9dIENvcHlpbmcgamVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmUtMi41LmphciB0byAuLi4vc2ltcGxlLWhlcm9rdS13ZWJhcHAvdGFyZ2V0L2RlcGVuZGVuY3kvamVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmUtMi41LmphcgorICAgIFtJTkZPXSBDb3B5aW5nIGphdmF4LndzLnJzLWFwaS0yLjAuamFyIHRvIC4uLi9zaW1wbGUtaGVyb2t1LXdlYmFwcC90YXJnZXQvZGVwZW5kZW5jeS9qYXZheC53cy5ycy1hcGktMi4wLmphcgorICAgIFtJTkZPXSBDb3B5aW5nIGpldHR5LXNlcnZsZXQtOS4wLjYudjIwMTMwOTMwLmphciB0byAuLi4vc2ltcGxlLWhlcm9rdS13ZWJhcHAvdGFyZ2V0L2RlcGVuZGVuY3kvamV0dHktc2VydmxldC05LjAuNi52MjAxMzA5MzAuamFyCisgICAgW0lORk9dIENvcHlpbmcgamF2YXguaW5qZWN0LTIuMi4wLWIyMS5qYXIgdG8gLi4uL3NpbXBsZS1oZXJva3Utd2ViYXBwL3RhcmdldC9kZXBlbmRlbmN5L2phdmF4LmluamVjdC0yLjIuMC1iMjEuamFyCisgICAgW0lORk9dIENvcHlpbmcgamF2YXguc2VydmxldC0zLjAuMC52MjAxMTEyMDExMDE2LmphciB0byAuLi4vc2ltcGxlLWhlcm9rdS13ZWJhcHAvdGFyZ2V0L2RlcGVuZGVuY3kvamF2YXguc2VydmxldC0zLjAuMC52MjAxMTEyMDExMDE2LmphcgorICAgIFtJTkZPXSBDb3B5aW5nIGphdmF4LmFubm90YXRpb24tYXBpLTEuMi5qYXIgdG8gLi4uL3NpbXBsZS1oZXJva3Utd2ViYXBwL3RhcmdldC9kZXBlbmRlbmN5L2phdmF4LmFubm90YXRpb24tYXBpLTEuMi5qYXIKKyAgICBbSU5GT10gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgW0lORk9dIEJVSUxEIFNVQ0NFU1MKKyAgICBbSU5GT10gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgW0lORk9dIFRvdGFsIHRpbWU6IDQuNDAxcworICAgIFtJTkZPXSBGaW5pc2hlZCBhdDogTW9uIERlYyAwOSAyMDoxOTowNiBDRVQgMjAxMworICAgIFtJTkZPXSBGaW5hbCBNZW1vcnk6IDIwTS8yNDZNCisgICAgW0lORk9dIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTwvc2NyZWVuPgorCisgICAgICAgICAgICBOb3cgdGhhdCB5b3Uga25vdyBldmVyeXRoaW5nIHdlbnQgYXMgZXhwZWN0ZWQgeW91IGFyZSByZWFkeSB0bzoKKworICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHNpbXBhcmE+CisgICAgICAgICAgICAgICAgICAgIG1ha2Ugc29tZSBjaGFuZ2VzIGluIHlvdXIgcHJvamVjdCwKKyAgICAgICAgICAgICAgICA8L3NpbXBhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHNpbXBhcmE+CisgICAgICAgICAgICAgICAgICAgIHRha2UgdGhlIHBhY2thZ2VkIFdBUiAobG9jYXRlZCB1bmRlciA8bGl0ZXJhbD4uL3RhcmdldC9zaW1wbGUtc2VydmljZS13ZWJhcHAud2FyPC9saXRlcmFsPikgYW5kIGRlcGxveSBpdCB0byBhCisgICAgICAgICAgICAgICAgICAgIFNlcnZsZXQgY29udGFpbmVyIG9mIHlvdXIgY2hvaWNlLCBvcgorICAgICAgICAgICAgICAgIDwvc2ltcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48c2ltcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPHhyZWYgbGlua2VuZD0iZGVwbG95LWl0LW9uLWhlcm9rdSIgLz4KKyAgICAgICAgICAgICAgICA8L3NpbXBhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorCisgICAgICAgICAgICA8dGlwPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBJZiB5b3Ugd2FudCB0byBtYWtlIHNvbWUgY2hhbmdlcyB0byB5b3VyIGFwcGxpY2F0aW9uIHlvdSBjYW4gcnVuIHRoZSBhcHBsaWNhdGlvbiBsb2NhbGx5IGJ5IHNpbXBseSBydW5uaW5nCisgICAgICAgICAgICAgICAgICAgIDxjb2RlPm12biBjbGVhbiBwYWNrYWdlIGpldHR5OnJ1bjwvY29kZT4gKHdoaWNoIHN0YXJ0cyB0aGUgZW1iZWRkZWQgSmV0dHkgc2VydmVyKSBvciBieQorICAgICAgICAgICAgICAgICAgICA8Y29kZT5qYXZhIC1jcCB0YXJnZXQvY2xhc3Nlczp0YXJnZXQvZGVwZW5kZW5jeS8qIGNvbS5leGFtcGxlLmhlcm9rdS5NYWluPC9jb2RlPiAodGhpcyBpcyBob3cgSmV0dHkgaXMKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRlZCBvbiBIZXJva3UpLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvdGlwPgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxzZWN0aW9uIHhtbDppZD0iZGVwbG95LWl0LW9uLWhlcm9rdSI+CisgICAgICAgICAgICA8dGl0bGU+RGVwbG95IGl0IG9uIEhlcm9rdTwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBXZSB3b24ndCBnbyBpbnRvIGRldGFpbHMgaG93IHRvIGNyZWF0ZSBhbiBhY2NvdW50IG9uICZoZXJva3UubGluazsgYW5kIHNldHVwIHRoZSA8bGl0ZXJhbD5IZXJva3U8L2xpdGVyYWw+IHRvb2xzCisgICAgICAgICAgICAgICAgb24geW91ciBtYWNoaW5lLiBZb3UgY2FuIGZpbmQgYSBsb3Qgb2YgaW5mb3JtYXRpb24gaW4gdGhpcyBhcnRpY2xlOiA8bGluayB4bGluazpocmVmPSdodHRwczovL2RldmNlbnRlci5oZXJva3UuY29tL2FydGljbGVzL2dldHRpbmctc3RhcnRlZC13aXRoLWphdmEnPkdldHRpbmcgU3RhcnRlZCB3aXRoIEphdmEgb24gSGVyb2t1PC9saW5rPi4KKyAgICAgICAgICAgICAgICBJbnN0ZWFkLCB3ZSdsbCB0YWtlIGEgbG9vayBhdCB0aGUgc3RlcHMgbmVlZGVkIGFmdGVyIHlvdXIgZW52aXJvbm1lbnQgaXMgcmVhZHkuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgZmlyc3Qgc3RlcCBpcyB0byBjcmVhdGUgYSBHaXQgcmVwb3NpdG9yeSBmcm9tIHlvdXIgcHJvamVjdDoKKyAgICAgICAgICAgICAgICA8c2NyZWVuIGxpbmVudW1iZXJpbmc9InVubnVtYmVyZWQiPiAgICAkIGdpdCBpbml0CisgICAgSW5pdGlhbGl6ZWQgZW1wdHkgR2l0IHJlcG9zaXRvcnkgaW4gLy4uLi9zaW1wbGUtaGVyb2t1LXdlYmFwcC8uZ2l0Lzwvc2NyZWVuPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhlbiwgY3JlYXRlIGEgJmhlcm9rdS5saW5rOyBpbnN0YW5jZSBhbmQgYWRkIGEgcmVtb3RlIHJlZmVyZW5jZSB0byB5b3VyIEdpdCByZXBvc2l0b3J5OgorICAgICAgICAgICAgICAgIDxzY3JlZW4gbGluZW51bWJlcmluZz0idW5udW1iZXJlZCI+ICAgICQgaGVyb2t1IGNyZWF0ZQorICAgIENyZWF0aW5nIHNpbXBsZS1oZXJva3Utd2ViYXBwLi4uIGRvbmUsIHN0YWNrIGlzIGNlZGFyCisgICAgaHR0cDovL3NpbXBsZS1oZXJva3Utd2ViYXBwLmhlcm9rdWFwcC5jb20vIHwgZ2l0QGhlcm9rdS5jb206c2ltcGxlLWhlcm9rdS13ZWJhcHAuZ2l0CisgICAgR2l0IHJlbW90ZSBoZXJva3UgYWRkZWQ8L3NjcmVlbj4KKworICAgICAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBuYW1lIG9mIHRoZSBpbnN0YW5jZSBpcyBjaGFuZ2VkIGluIHRoZSBvdXRwdXQgdG8gPGxpdGVyYWw+c2ltcGxlLWhlcm9rdS13ZWJhcHA8L2xpdGVyYWw+LiBZb3VyIHdpbGwgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVkIG1vcmUgbGlrZSA8bGl0ZXJhbD50cmFucXVpbC1iYXNpbi00NzQ0PC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEFkZCBhbmQgY29tbWl0IGZpbGVzIHRvIHlvdXIgR2l0IHJlcG9zaXRvcnk6CisgICAgICAgICAgICAgICAgPHNjcmVlbiBsaW5lbnVtYmVyaW5nPSJ1bm51bWJlcmVkIj4gICAgJCBnaXQgYWRkIHNyYy8gcG9tLnhtbCBQcm9jZmlsZSBzeXN0ZW0ucHJvcGVydGllczwvc2NyZWVuPgorICAgICAgICAgICAgICAgIDxzY3JlZW4gbGluZW51bWJlcmluZz0idW5udW1iZXJlZCI+ICAgICQgZ2l0IGNvbW1pdCAtYSAtbSAiaW5pdGlhbCBjb21taXQiCisgICAgW21hc3RlciAocm9vdC1jb21taXQpIGUyYjU4ZTNdIGluaXRpYWwgY29tbWl0CisgICAgIDcgZmlsZXMgY2hhbmdlZCwgMjIxIGluc2VydGlvbnMoKykKKyAgICAgY3JlYXRlIG1vZGUgMTAwNjQ0IFByb2NmaWxlCisgICAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBwb20ueG1sCisgICAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvbWFpbi9qYXZhL2NvbS9leGFtcGxlL015UmVzb3VyY2UuamF2YQorICAgICBjcmVhdGUgbW9kZSAxMDA2NDQgc3JjL21haW4vamF2YS9jb20vZXhhbXBsZS9oZXJva3UvTWFpbi5qYXZhCisgICAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCisgICAgIGNyZWF0ZSBtb2RlIDEwMDY0NCBzcmMvdGVzdC9qYXZhL2NvbS9leGFtcGxlL015UmVzb3VyY2VUZXN0LmphdmEKKyAgICAgY3JlYXRlIG1vZGUgMTAwNjQ0IHN5c3RlbS5wcm9wZXJ0aWVzPC9zY3JlZW4+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBQdXNoIGNoYW5nZXMgdG8gSGVyb2t1OgorICAgICAgICAgICAgICAgIDxzY3JlZW4gbGluZW51bWJlcmluZz0idW5udW1iZXJlZCI+ICAgICQgZ2l0IHB1c2ggaGVyb2t1IG1hc3RlcgorICAgIENvdW50aW5nIG9iamVjdHM6IDIxLCBkb25lLgorICAgIERlbHRhIGNvbXByZXNzaW9uIHVzaW5nIHVwIHRvIDggdGhyZWFkcy4KKyAgICBDb21wcmVzc2luZyBvYmplY3RzOiAxMDAlICgxMS8xMSksIGRvbmUuCisgICAgV3JpdGluZyBvYmplY3RzOiAxMDAlICgyMS8yMSksIDMuNzMgS2lCIHwgMCBieXRlcy9zLCBkb25lLgorICAgIFRvdGFsIDIxIChkZWx0YSAwKSwgcmV1c2VkIDAgKGRlbHRhIDApCisKKyAgICAtLS0tLT4gSmF2YSBhcHAgZGV0ZWN0ZWQKKyAgICAtLS0tLT4gSW5zdGFsbGluZyBPcGVuSkRLIDEuNy4uLiBkb25lCisgICAgLS0tLS0+IEluc3RhbGxpbmcgTWF2ZW4gMy4wLjMuLi4gZG9uZQorICAgIC0tLS0tPiBJbnN0YWxsaW5nIHNldHRpbmdzLnhtbC4uLiBkb25lCisgICAgLS0tLS0+IGV4ZWN1dGluZyAvYXBwL3RtcC9jYWNoZS8ubWF2ZW4vYmluL212biAtQiAtRHVzZXIuaG9tZT0vdG1wL2J1aWxkXzk5MmNjNzQ3LTI2ZDYtNDgwMC1iZGIxLWFkZDQ3Yjk1ODNjZCAtRG1hdmVuLnJlcG8ubG9jYWw9L2FwcC90bXAvY2FjaGUvLm0yL3JlcG9zaXRvcnkgLXMgL2FwcC90bXAvY2FjaGUvLm0yL3NldHRpbmdzLnhtbCAtRHNraXBUZXN0cz10cnVlIGNsZWFuIGluc3RhbGwKKyAgICAgICAgICAgW0lORk9dIFNjYW5uaW5nIGZvciBwcm9qZWN0cy4uLgorICAgICAgICAgICBbSU5GT10KKyAgICAgICAgICAgW0lORk9dIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICBbSU5GT10gQnVpbGRpbmcgc2ltcGxlLWhlcm9rdS13ZWJhcHAgMS4wLVNOQVBTSE9UCisgICAgICAgICAgIFtJTkZPXSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgW0lORk9dCisgICAgICAgICAgIFtJTkZPXSAtLS0gbWF2ZW4tY2xlYW4tcGx1Z2luOjIuNC4xOmNsZWFuIChkZWZhdWx0LWNsZWFuKSBAIHNpbXBsZS1oZXJva3Utd2ViYXBwIC0tLQorICAgICAgICAgICBbSU5GT10KKyAgICAgICAgICAgW0lORk9dIC0tLSBtYXZlbi1yZXNvdXJjZXMtcGx1Z2luOjIuNC4zOnJlc291cmNlcyAoZGVmYXVsdC1yZXNvdXJjZXMpIEAgc2ltcGxlLWhlcm9rdS13ZWJhcHAgLS0tCisgICAgICAgICAgIFtJTkZPXSBVc2luZyAnVVRGLTgnIGVuY29kaW5nIHRvIGNvcHkgZmlsdGVyZWQgcmVzb3VyY2VzLgorICAgICAgICAgICBbSU5GT10gc2tpcCBub24gZXhpc3RpbmcgcmVzb3VyY2VEaXJlY3RvcnkgL3RtcC9idWlsZF85OTJjYzc0Ny0yNmQ2LTQ4MDAtYmRiMS1hZGQ0N2I5NTgzY2Qvc3JjL21haW4vcmVzb3VyY2VzCisgICAgICAgICAgIFtJTkZPXQorICAgICAgICAgICBbSU5GT10gLS0tIG1hdmVuLWNvbXBpbGVyLXBsdWdpbjoyLjUuMTpjb21waWxlIChkZWZhdWx0LWNvbXBpbGUpIEAgc2ltcGxlLWhlcm9rdS13ZWJhcHAgLS0tCisgICAgICAgICAgIFtJTkZPXSBDb21waWxpbmcgMiBzb3VyY2UgZmlsZXMgdG8gL3RtcC9idWlsZF85OTJjYzc0Ny0yNmQ2LTQ4MDAtYmRiMS1hZGQ0N2I5NTgzY2QvdGFyZ2V0L2NsYXNzZXMKKyAgICAgICAgICAgW0lORk9dCisgICAgICAgICAgIFtJTkZPXSAtLS0gbWF2ZW4tcmVzb3VyY2VzLXBsdWdpbjoyLjQuMzp0ZXN0UmVzb3VyY2VzIChkZWZhdWx0LXRlc3RSZXNvdXJjZXMpIEAgc2ltcGxlLWhlcm9rdS13ZWJhcHAgLS0tCisgICAgICAgICAgIFtJTkZPXSBVc2luZyAnVVRGLTgnIGVuY29kaW5nIHRvIGNvcHkgZmlsdGVyZWQgcmVzb3VyY2VzLgorICAgICAgICAgICBbSU5GT10gc2tpcCBub24gZXhpc3RpbmcgcmVzb3VyY2VEaXJlY3RvcnkgL3RtcC9idWlsZF85OTJjYzc0Ny0yNmQ2LTQ4MDAtYmRiMS1hZGQ0N2I5NTgzY2Qvc3JjL3Rlc3QvcmVzb3VyY2VzCisgICAgICAgICAgIFtJTkZPXQorICAgICAgICAgICBbSU5GT10gLS0tIG1hdmVuLWNvbXBpbGVyLXBsdWdpbjoyLjUuMTp0ZXN0Q29tcGlsZSAoZGVmYXVsdC10ZXN0Q29tcGlsZSkgQCBzaW1wbGUtaGVyb2t1LXdlYmFwcCAtLS0KKyAgICAgICAgICAgW0lORk9dIENvbXBpbGluZyAxIHNvdXJjZSBmaWxlIHRvIC90bXAvYnVpbGRfOTkyY2M3NDctMjZkNi00ODAwLWJkYjEtYWRkNDdiOTU4M2NkL3RhcmdldC90ZXN0LWNsYXNzZXMKKyAgICAgICAgICAgW0lORk9dCisgICAgICAgICAgIFtJTkZPXSAtLS0gbWF2ZW4tc3VyZWZpcmUtcGx1Z2luOjIuNy4yOnRlc3QgKGRlZmF1bHQtdGVzdCkgQCBzaW1wbGUtaGVyb2t1LXdlYmFwcCAtLS0KKyAgICAgICAgICAgW0lORk9dIFRlc3RzIGFyZSBza2lwcGVkLgorICAgICAgICAgICBbSU5GT10KKyAgICAgICAgICAgW0lORk9dIC0tLSBtYXZlbi13YXItcGx1Z2luOjIuMS4xOndhciAoZGVmYXVsdC13YXIpIEAgc2ltcGxlLWhlcm9rdS13ZWJhcHAgLS0tCisgICAgICAgICAgIFtJTkZPXSBQYWNrYWdpbmcgd2ViYXBwCisgICAgICAgICAgIFtJTkZPXSBBc3NlbWJsaW5nIHdlYmFwcCBbc2ltcGxlLWhlcm9rdS13ZWJhcHBdIGluIFsvdG1wL2J1aWxkXzk5MmNjNzQ3LTI2ZDYtNDgwMC1iZGIxLWFkZDQ3Yjk1ODNjZC90YXJnZXQvc2ltcGxlLWhlcm9rdS13ZWJhcHBdCisgICAgICAgICAgIFtJTkZPXSBQcm9jZXNzaW5nIHdhciBwcm9qZWN0CisgICAgICAgICAgIFtJTkZPXSBDb3B5aW5nIHdlYmFwcCByZXNvdXJjZXMgWy90bXAvYnVpbGRfOTkyY2M3NDctMjZkNi00ODAwLWJkYjEtYWRkNDdiOTU4M2NkL3NyYy9tYWluL3dlYmFwcF0KKyAgICAgICAgICAgW0lORk9dIFdlYmFwcCBhc3NlbWJsZWQgaW4gWzg4IG1zZWNzXQorICAgICAgICAgICBbSU5GT10gQnVpbGRpbmcgd2FyOiAvdG1wL2J1aWxkXzk5MmNjNzQ3LTI2ZDYtNDgwMC1iZGIxLWFkZDQ3Yjk1ODNjZC90YXJnZXQvc2ltcGxlLWhlcm9rdS13ZWJhcHAud2FyCisgICAgICAgICAgIFtJTkZPXSBXRUItSU5GL3dlYi54bWwgYWxyZWFkeSBhZGRlZCwgc2tpcHBpbmcKKyAgICAgICAgICAgW0lORk9dCisgICAgICAgICAgIFtJTkZPXSAtLS0gbWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW46Mi4xOmNvcHktZGVwZW5kZW5jaWVzIChjb3B5LWRlcGVuZGVuY2llcykgQCBzaW1wbGUtaGVyb2t1LXdlYmFwcCAtLS0KKyAgICAgICAgICAgW0lORk9dIENvcHlpbmcgZ3VhdmEtMTQuMC4xLmphciB0byAvdG1wL2J1aWxkXzk5MmNjNzQ3LTI2ZDYtNDgwMC1iZGIxLWFkZDQ3Yjk1ODNjZC90YXJnZXQvZGVwZW5kZW5jeS9ndWF2YS0xNC4wLjEuamFyCisgICAgICAgICAgIFtJTkZPXSBDb3B5aW5nIGphdmF4LmFubm90YXRpb24tYXBpLTEuMi5qYXIgdG8gL3RtcC9idWlsZF85OTJjYzc0Ny0yNmQ2LTQ4MDAtYmRiMS1hZGQ0N2I5NTgzY2QvdGFyZ2V0L2RlcGVuZGVuY3kvamF2YXguYW5ub3RhdGlvbi1hcGktMS4yLmphcgorICAgICAgICAgICBbSU5GT10gQ29weWluZyB2YWxpZGF0aW9uLWFwaS0xLjEuMC5GaW5hbC5qYXIgdG8gL3RtcC9idWlsZF85OTJjYzc0Ny0yNmQ2LTQ4MDAtYmRiMS1hZGQ0N2I5NTgzY2QvdGFyZ2V0L2RlcGVuZGVuY3kvdmFsaWRhdGlvbi1hcGktMS4xLjAuRmluYWwuamFyCisgICAgICAgICAgIFtJTkZPXSBDb3B5aW5nIGphdmF4LndzLnJzLWFwaS0yLjAuamFyIHRvIC90bXAvYnVpbGRfOTkyY2M3NDctMjZkNi00ODAwLWJkYjEtYWRkNDdiOTU4M2NkL3RhcmdldC9kZXBlbmRlbmN5L2phdmF4LndzLnJzLWFwaS0yLjAuamFyCisgICAgICAgICAgIFtJTkZPXSBDb3B5aW5nIGpldHR5LWh0dHAtOS4wLjYudjIwMTMwOTMwLmphciB0byAvdG1wL2J1aWxkXzk5MmNjNzQ3LTI2ZDYtNDgwMC1iZGIxLWFkZDQ3Yjk1ODNjZC90YXJnZXQvZGVwZW5kZW5jeS9qZXR0eS1odHRwLTkuMC42LnYyMDEzMDkzMC5qYXIKKyAgICAgICAgICAgW0lORk9dIENvcHlpbmcgamV0dHktaW8tOS4wLjYudjIwMTMwOTMwLmphciB0byAvdG1wL2J1aWxkXzk5MmNjNzQ3LTI2ZDYtNDgwMC1iZGIxLWFkZDQ3Yjk1ODNjZC90YXJnZXQvZGVwZW5kZW5jeS9qZXR0eS1pby05LjAuNi52MjAxMzA5MzAuamFyCisgICAgICAgICAgIFtJTkZPXSBDb3B5aW5nIGpldHR5LXNlY3VyaXR5LTkuMC42LnYyMDEzMDkzMC5qYXIgdG8gL3RtcC9idWlsZF85OTJjYzc0Ny0yNmQ2LTQ4MDAtYmRiMS1hZGQ0N2I5NTgzY2QvdGFyZ2V0L2RlcGVuZGVuY3kvamV0dHktc2VjdXJpdHktOS4wLjYudjIwMTMwOTMwLmphcgorICAgICAgICAgICBbSU5GT10gQ29weWluZyBqZXR0eS1zZXJ2ZXItOS4wLjYudjIwMTMwOTMwLmphciB0byAvdG1wL2J1aWxkXzk5MmNjNzQ3LTI2ZDYtNDgwMC1iZGIxLWFkZDQ3Yjk1ODNjZC90YXJnZXQvZGVwZW5kZW5jeS9qZXR0eS1zZXJ2ZXItOS4wLjYudjIwMTMwOTMwLmphcgorICAgICAgICAgICBbSU5GT10gQ29weWluZyBqZXR0eS1zZXJ2bGV0LTkuMC42LnYyMDEzMDkzMC5qYXIgdG8gL3RtcC9idWlsZF85OTJjYzc0Ny0yNmQ2LTQ4MDAtYmRiMS1hZGQ0N2I5NTgzY2QvdGFyZ2V0L2RlcGVuZGVuY3kvamV0dHktc2VydmxldC05LjAuNi52MjAxMzA5MzAuamFyCisgICAgICAgICAgIFtJTkZPXSBDb3B5aW5nIGpldHR5LXV0aWwtOS4wLjYudjIwMTMwOTMwLmphciB0byAvdG1wL2J1aWxkXzk5MmNjNzQ3LTI2ZDYtNDgwMC1iZGIxLWFkZDQ3Yjk1ODNjZC90YXJnZXQvZGVwZW5kZW5jeS9qZXR0eS11dGlsLTkuMC42LnYyMDEzMDkzMC5qYXIKKyAgICAgICAgICAgW0lORk9dIENvcHlpbmcgamV0dHktd2ViYXBwLTkuMC42LnYyMDEzMDkzMC5qYXIgdG8gL3RtcC9idWlsZF85OTJjYzc0Ny0yNmQ2LTQ4MDAtYmRiMS1hZGQ0N2I5NTgzY2QvdGFyZ2V0L2RlcGVuZGVuY3kvamV0dHktd2ViYXBwLTkuMC42LnYyMDEzMDkzMC5qYXIKKyAgICAgICAgICAgW0lORk9dIENvcHlpbmcgamV0dHkteG1sLTkuMC42LnYyMDEzMDkzMC5qYXIgdG8gL3RtcC9idWlsZF85OTJjYzc0Ny0yNmQ2LTQ4MDAtYmRiMS1hZGQ0N2I5NTgzY2QvdGFyZ2V0L2RlcGVuZGVuY3kvamV0dHkteG1sLTkuMC42LnYyMDEzMDkzMC5qYXIKKyAgICAgICAgICAgW0lORk9dIENvcHlpbmcgamF2YXguc2VydmxldC0zLjAuMC52MjAxMTEyMDExMDE2LmphciB0byAvdG1wL2J1aWxkXzk5MmNjNzQ3LTI2ZDYtNDgwMC1iZGIxLWFkZDQ3Yjk1ODNjZC90YXJnZXQvZGVwZW5kZW5jeS9qYXZheC5zZXJ2bGV0LTMuMC4wLnYyMDExMTIwMTEwMTYuamFyCisgICAgICAgICAgIFtJTkZPXSBDb3B5aW5nIGhrMi1hcGktMi4yLjAtYjIxLmphciB0byAvdG1wL2J1aWxkXzk5MmNjNzQ3LTI2ZDYtNDgwMC1iZGIxLWFkZDQ3Yjk1ODNjZC90YXJnZXQvZGVwZW5kZW5jeS9oazItYXBpLTIuMi4wLWIyMS5qYXIKKyAgICAgICAgICAgW0lORk9dIENvcHlpbmcgaGsyLWxvY2F0b3ItMi4yLjAtYjIxLmphciB0byAvdG1wL2J1aWxkXzk5MmNjNzQ3LTI2ZDYtNDgwMC1iZGIxLWFkZDQ3Yjk1ODNjZC90YXJnZXQvZGVwZW5kZW5jeS9oazItbG9jYXRvci0yLjIuMC1iMjEuamFyCisgICAgICAgICAgIFtJTkZPXSBDb3B5aW5nIGhrMi11dGlscy0yLjIuMC1iMjEuamFyIHRvIC90bXAvYnVpbGRfOTkyY2M3NDctMjZkNi00ODAwLWJkYjEtYWRkNDdiOTU4M2NkL3RhcmdldC9kZXBlbmRlbmN5L2hrMi11dGlscy0yLjIuMC1iMjEuamFyCisgICAgICAgICAgIFtJTkZPXSBDb3B5aW5nIG9zZ2ktcmVzb3VyY2UtbG9jYXRvci0xLjAuMS5qYXIgdG8gL3RtcC9idWlsZF85OTJjYzc0Ny0yNmQ2LTQ4MDAtYmRiMS1hZGQ0N2I5NTgzY2QvdGFyZ2V0L2RlcGVuZGVuY3kvb3NnaS1yZXNvdXJjZS1sb2NhdG9yLTEuMC4xLmphcgorICAgICAgICAgICBbSU5GT10gQ29weWluZyBhc20tYWxsLXJlcGFja2FnZWQtMi4yLjAtYjIxLmphciB0byAvdG1wL2J1aWxkXzk5MmNjNzQ3LTI2ZDYtNDgwMC1iZGIxLWFkZDQ3Yjk1ODNjZC90YXJnZXQvZGVwZW5kZW5jeS9hc20tYWxsLXJlcGFja2FnZWQtMi4yLjAtYjIxLmphcgorICAgICAgICAgICBbSU5GT10gQ29weWluZyBjZ2xpYi0yLjIuMC1iMjEuamFyIHRvIC90bXAvYnVpbGRfOTkyY2M3NDctMjZkNi00ODAwLWJkYjEtYWRkNDdiOTU4M2NkL3RhcmdldC9kZXBlbmRlbmN5L2NnbGliLTIuMi4wLWIyMS5qYXIKKyAgICAgICAgICAgW0lORk9dIENvcHlpbmcgamF2YXguaW5qZWN0LTIuMi4wLWIyMS5qYXIgdG8gL3RtcC9idWlsZF85OTJjYzc0Ny0yNmQ2LTQ4MDAtYmRiMS1hZGQ0N2I5NTgzY2QvdGFyZ2V0L2RlcGVuZGVuY3kvamF2YXguaW5qZWN0LTIuMi4wLWIyMS5qYXIKKyAgICAgICAgICAgW0lORk9dIENvcHlpbmcgamVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LTIuNS5qYXIgdG8gL3RtcC9idWlsZF85OTJjYzc0Ny0yNmQ2LTQ4MDAtYmRiMS1hZGQ0N2I5NTgzY2QvdGFyZ2V0L2RlcGVuZGVuY3kvamVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LTIuNS5qYXIKKyAgICAgICAgICAgW0lORk9dIENvcHlpbmcgamVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmUtMi41LmphciB0byAvdG1wL2J1aWxkXzk5MmNjNzQ3LTI2ZDYtNDgwMC1iZGIxLWFkZDQ3Yjk1ODNjZC90YXJnZXQvZGVwZW5kZW5jeS9qZXJzZXktY29udGFpbmVyLXNlcnZsZXQtY29yZS0yLjUuamFyCisgICAgICAgICAgIFtJTkZPXSBDb3B5aW5nIGplcnNleS1jbGllbnQtMi41LmphciB0byAvdG1wL2J1aWxkXzk5MmNjNzQ3LTI2ZDYtNDgwMC1iZGIxLWFkZDQ3Yjk1ODNjZC90YXJnZXQvZGVwZW5kZW5jeS9qZXJzZXktY2xpZW50LTIuNS5qYXIKKyAgICAgICAgICAgW0lORk9dIENvcHlpbmcgamVyc2V5LWNvbW1vbi0yLjUuamFyIHRvIC90bXAvYnVpbGRfOTkyY2M3NDctMjZkNi00ODAwLWJkYjEtYWRkNDdiOTU4M2NkL3RhcmdldC9kZXBlbmRlbmN5L2plcnNleS1jb21tb24tMi41LmphcgorICAgICAgICAgICBbSU5GT10gQ29weWluZyBqZXJzZXktc2VydmVyLTIuNS5qYXIgdG8gL3RtcC9idWlsZF85OTJjYzc0Ny0yNmQ2LTQ4MDAtYmRiMS1hZGQ0N2I5NTgzY2QvdGFyZ2V0L2RlcGVuZGVuY3kvamVyc2V5LXNlcnZlci0yLjUuamFyCisgICAgICAgICAgIFtJTkZPXQorICAgICAgICAgICBbSU5GT10gLS0tIG1hdmVuLWluc3RhbGwtcGx1Z2luOjIuMy4xOmluc3RhbGwgKGRlZmF1bHQtaW5zdGFsbCkgQCBzaW1wbGUtaGVyb2t1LXdlYmFwcCAtLS0KKyAgICAgICAgICAgW0lORk9dIEluc3RhbGxpbmcgL3RtcC9idWlsZF85OTJjYzc0Ny0yNmQ2LTQ4MDAtYmRiMS1hZGQ0N2I5NTgzY2QvdGFyZ2V0L3NpbXBsZS1oZXJva3Utd2ViYXBwLndhciB0byAvYXBwL3RtcC9jYWNoZS8ubTIvcmVwb3NpdG9yeS9jb20vZXhhbXBsZS9zaW1wbGUtaGVyb2t1LXdlYmFwcC8xLjAtU05BUFNIT1Qvc2ltcGxlLWhlcm9rdS13ZWJhcHAtMS4wLVNOQVBTSE9ULndhcgorICAgICAgICAgICBbSU5GT10gSW5zdGFsbGluZyAvdG1wL2J1aWxkXzk5MmNjNzQ3LTI2ZDYtNDgwMC1iZGIxLWFkZDQ3Yjk1ODNjZC9wb20ueG1sIHRvIC9hcHAvdG1wL2NhY2hlLy5tMi9yZXBvc2l0b3J5L2NvbS9leGFtcGxlL3NpbXBsZS1oZXJva3Utd2ViYXBwLzEuMC1TTkFQU0hPVC9zaW1wbGUtaGVyb2t1LXdlYmFwcC0xLjAtU05BUFNIT1QucG9tCisgICAgICAgICAgIFtJTkZPXSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgW0lORk9dIEJVSUxEIFNVQ0NFU1MKKyAgICAgICAgICAgW0lORk9dIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICBbSU5GT10gVG90YWwgdGltZTogNDUuODYxcworICAgICAgICAgICBbSU5GT10gRmluaXNoZWQgYXQ6IE1vbiBEZWMgMDkgMTk6NTE6MzQgVVRDIDIwMTMKKyAgICAgICAgICAgW0lORk9dIEZpbmFsIE1lbW9yeTogMTdNLzUxNE0KKyAgICAgICAgICAgW0lORk9dIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC0tLS0tPiBEaXNjb3ZlcmluZyBwcm9jZXNzIHR5cGVzCisgICAgICAgICAgIFByb2NmaWxlIGRlY2xhcmVzIHR5cGVzIC0+IHdlYgorCisgICAgLS0tLS0+IENvbXBpbGVkIHNsdWcgc2l6ZTogNzUuOU1CCisgICAgLS0tLS0+IExhdW5jaGluZy4uLiBkb25lLCB2NgorICAgICAgICAgICBodHRwOi8vc2ltcGxlLWhlcm9rdS13ZWJhcHAuaGVyb2t1YXBwLmNvbSBkZXBsb3llZCB0byBIZXJva3UKKworICAgIFRvIGdpdEBoZXJva3UuY29tOnNpbXBsZS1oZXJva3Utd2ViYXBwLmdpdAorICAgICAqIFtuZXcgYnJhbmNoXSAgICAgIG1hc3RlciAtPiBtYXN0ZXI8L3NjcmVlbj4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIE5vdyB5b3UgY2FuIGFjY2VzcyB5b3VyIGFwcGxpY2F0aW9uIGF0LCBmb3IgZXhhbXBsZTogPGxpbmsgeGxpbms6aHJlZj0naHR0cDovL3NpbXBsZS1oZXJva3Utd2ViYXBwLmhlcm9rdWFwcC5jb20vbXlyZXNvdXJjZSc+aHR0cDovL3NpbXBsZS1oZXJva3Utd2ViYXBwLmhlcm9rdWFwcC5jb20vbXlyZXNvdXJjZTwvbGluaz4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIHhtbDppZD0iZXhwbG9yaW5nLWplcnNleS1leGFtcGxlcyI+CisgICAgICAgIDx0aXRsZT5FeHBsb3JpbmcgT3RoZXIgSmVyc2V5IEV4YW1wbGVzPC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBJbiB0aGUgc2VjdGlvbnMgYWJvdmUsIHdlIGhhdmUgY292ZXJlZCBhbiBhcHByb2FjaCBob3cgdG8gZ2V0IGRpcnR5IHdpdGggSmVyc2V5IHF1aWNrbHkuIFBsZWFzZSBjb25zdWx0IHRoZSBvdGhlcgorICAgICAgICAgICAgc2VjdGlvbnMgb2YgdGhlIEplcnNleSBVc2VyIEd1aWRlIHRvIGxlYXJuIG1vcmUgYWJvdXQgSmVyc2V5IGFuZCBKQVgtUlMuCisgICAgICAgICAgICBFdmVuIHRob3VnaCB3ZSB0cnkgb3VyIGJlc3QgdG8gY292ZXIgYXMgbXVjaCBhcyBwb3NzaWJsZSBpbiB0aGUgVXNlciBHdWlkZSwgdGhlcmUgaXMgYWx3YXlzIGEgY2hhbmNlIHRoYXQgeW91IHdvdWxkCisgICAgICAgICAgICBub3QgYmUgYWJsZSB0byBnZXQgYSBmdWxsIGFuc3dlciB0byB0aGUgcHJvYmxlbSB5b3UgYXJlIHNvbHZpbmcuIEluIHRoYXQgY2FzZSwgY29uc2lkZXIgZGl2aW5nIGluIG91ciBleGFtcGxlcyB0aGF0CisgICAgICAgICAgICBwcm92aWRlIGFkZGl0aW9uYWwgdGlwcyBhbmQgaGludHMgdG8gdGhlIGZlYXR1cmVzIHlvdSBtYXkgd2FudCB0byB1c2UgaW4geW91ciBwcm9qZWN0cy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEplcnNleSBjb2RlYmFzZSBjb250YWlucyBhIG51bWJlciBvZiB1c2VmdWwgZXhhbXBsZXMgb24gaG93IHRvIHVzZSB2YXJpb3VzIEpBWC1SUyBhbmQgSmVyc2V5IGZlYXR1cmVzLgorICAgICAgICAgICAgRmVlbCBmcmVlIHRvIGJyb3dzZSB0aHJvdWdoIHRoZSBjb2RlIG9mIGluZGl2aWR1YWwKKyAgICAgICAgICAgIDxsaW5rIHhsaW5rOmhyZWY9IiZqZXJzZXkuZ2l0aHViLmV4YW1wbGVzLnVyaTsiPkplcnNleSBFeGFtcGxlczwvbGluaz4gaW4gdGhlIEplcnNleSBzb3VyY2UgcmVwb3NpdG9yeS4KKyAgICAgICAgICAgIEZvciBvZmYtbGluZSBicm93c2luZywgeW91IGNhbiBhbHNvIGRvd25sb2FkIGEgYnVuZGxlIHdpdGggYWxsIHRoZSBleGFtcGxlcyBmcm9tCisgICAgICAgICAgICA8bGluayB4bGluazpocmVmPSJodHRwczovL21hdmVuLmphdmEubmV0L2NvbnRlbnQvcmVwb3NpdG9yaWVzLyZyZXBvc2l0b3J5Oy9vcmcvZ2xhc3NmaXNoL2plcnNleS9idW5kbGVzL2plcnNleS1leGFtcGxlcy8mdmVyc2lvbjsvIj5oZXJlPC9saW5rPi4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKzwvY2hhcHRlcj4KZGlmZiAtLWdpdCBhL2RvY3Mvc3JjL21haW4vZG9jYm9vay9oaWdobGlnaHQueHNsIGIvZG9jcy9zcmMvbWFpbi9kb2Nib29rL2hpZ2hsaWdodC54c2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRjMGVjYQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3Mvc3JjL21haW4vZG9jYm9vay9oaWdobGlnaHQueHNsCkBAIC0wLDAgKzEsNTcgQEAKKzw/eG1sIHZlcnNpb249JzEuMCc/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKKyAgICAgICAgICAgICAgICB4bWxuczp4c2x0aGw9Imh0dHA6Ly94c2x0aGwuc2YubmV0IgorICAgICAgICAgICAgICAgIGV4Y2x1ZGUtcmVzdWx0LXByZWZpeGVzPSJ4c2x0aGwiCisgICAgICAgICAgICAgICAgdmVyc2lvbj0nMS4wJz4KKworICA8eHNsOnRlbXBsYXRlIG1hdGNoPSd4c2x0aGw6a2V5d29yZCc+CisgICAgPHNwYW4gY2xhc3M9IlJlc2VydmVkV29yZCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Jy4nLz48L3NwYW4+CisgIDwveHNsOnRlbXBsYXRlPgorCisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9J3hzbHRobDpjb21tZW50Jz4KKyAgICA8c3BhbiBjbGFzcz0iQ29tbWVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Jy4nLz48L3NwYW4+CisgIDwveHNsOnRlbXBsYXRlPgorCisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9J3hzbHRobDpvbmVsaW5lLWNvbW1lbnQnPgorICAgIDxzcGFuIGNsYXNzPSJDb21tZW50Ij48eHNsOnZhbHVlLW9mIHNlbGVjdD0nLicvPjwvc3Bhbj4KKyAgPC94c2w6dGVtcGxhdGU+CisKKyAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0neHNsdGhsOm11bHRpbGluZS1jb21tZW50Jz4KKyAgICA8c3BhbiBjbGFzcz0iRG9jQ29tbWVudCI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Jy4nLz48L3NwYW4+CisgIDwveHNsOnRlbXBsYXRlPgorCisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9J3hzbHRobDp0YWcnPgorICAgIDxzcGFuIGNsYXNzPSJSZXNlcnZlZFdvcmQiPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PScuJy8+PC9zcGFuPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworICA8eHNsOnRlbXBsYXRlIG1hdGNoPSd4c2x0aGw6YXR0cmlidXRlJz4KKyAgICA8c3BhbiBjbGFzcz0iSWRlbnRpZmllciI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Jy4nLz48L3NwYW4+CisgIDwveHNsOnRlbXBsYXRlPgorCisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9J3hzbHRobDp2YWx1ZSc+CisgICAgPHNwYW4gY2xhc3M9IlN0cmluZyI+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Jy4nLz48L3NwYW4+CisgIDwveHNsOnRlbXBsYXRlPgorCisgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9J3hzbHRobDpzdHJpbmcnPgorICAgIDxzcGFuIGNsYXNzPSJTdHJpbmciPjx4c2w6dmFsdWUtb2Ygc2VsZWN0PScuJy8+PC9zcGFuPgorICA8L3hzbDp0ZW1wbGF0ZT4KKworPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL2RvY3Mvc3JjL21haW4vZG9jYm9vay9ob3ctdG8tYnVpbGQueG1sIGIvZG9jcy9zcmMvbWFpbi9kb2Nib29rL2hvdy10by1idWlsZC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJmMjNmYgotLS0gL2Rldi9udWxsCisrKyBiL2RvY3Mvc3JjL21haW4vZG9jYm9vay9ob3ctdG8tYnVpbGQueG1sCkBAIC0wLDAgKzEsMTA4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8IURPQ1RZUEUgY2hhcHRlciBbPCFFTlRJVFkgJSBlbnRzIFNZU1RFTSAiamVyc2V5LmVudCIgPiAlZW50czsgXT4KKzxjaGFwdGVyIHhtbG5zPSJodHRwOi8vZG9jYm9vay5vcmcvbnMvZG9jYm9vayIKKyAgICAgICAgIHZlcnNpb249IjUuMCIKKyAgICAgICAgIHhtbDpsYW5nPSJlbiIKKyAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIKKyAgICAgICAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vZG9jYm9vay5vcmcvbnMvZG9jYm9vayBodHRwOi8vZG9jYm9vay5vcmcveG1sLzUuMC94c2QvZG9jYm9vay54c2QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayBodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rLnhzZCIKKyAgICAgICAgIHhtbDppZD0iaG93LXRvLWJ1aWxkIj4KKyAgICA8dGl0bGU+QnVpbGRpbmcgYW5kIFRlc3RpbmcgSmVyc2V5PC90aXRsZT4KKworICAgIDxzZWN0aW9uIHhtbDppZD0iY2hlY2tvdXQiPgorICAgICAgICA8dGl0bGU+Q2hlY2tpbmcgT3V0IHRoZSBTb3VyY2U8L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEplcnNleSBzb3VyY2UgY29kZSBpcyBhdmFpbGFibGUgb24gR2l0SHViLiBZb3UgY2FuIGJyb3dzZSB0aGUgc291cmNlcyBhdAorICAgICAgICAgICAgPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2plcnNleS9qZXJzZXkiPmh0dHBzOi8vZ2l0aHViLmNvbS9qZXJzZXkvamVyc2V5PC9saW5rPi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEluIGNhc2UgeW91IGFyZSBub3QgZmFtaWxpYXIgd2l0aCBHaXQsIHdlIHJlY29tbWVuZCByZWFkaW5nIHNvbWUgb2YgdGhlIG1hbnkgIkdldHRpbmcgU3RhcnRlZCB3aXRoIEdpdCIgYXJ0aWNsZXMKKyAgICAgICAgICAgIHlvdSBjYW4gZmluZCBvbiB0aGUgd2ViLiBGb3IgZXhhbXBsZSB0aGlzCisgICAgICAgICAgICA8bGluayB4bGluazpocmVmPSJodHRwOi8vcmVmY2FyZHouZHpvbmUuY29tL3JlZmNhcmR6L2dldHRpbmctc3RhcnRlZC1naXQiPkRab25lIFJlZkNhcmQ8L2xpbms+LgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDwhLS08cGFyYT4tLT4KKyAgICAgICAgICAgIDwhLS1CZWZvcmUgeW91IGNhbiBjbG9uZSBKZXJzZXkgcmVwb3NpdG9yeSB5b3UgaGF2ZSB0byBzaWduIHVwIGZvciBhLS0+CisgICAgICAgICAgICA8IS0tPGxpbmsgeGxpbms6aHJlZj0iaHR0cDovL2phdmEubmV0Ij5qYXZhLm5ldDwvbGluaz4tLT4KKyAgICAgICAgICAgIDwhLS1hY2NvdW50LiBPbmNlIHlvdSBhcmUgcmVnaXN0ZXJlZCwgeW91IGhhdmUgdG8gYWRkIGFuIFNTSCBrZXkgdG8geW91ciBqYXZhLm5ldCBwcm9maWxlIC0gc2VlIHRoaXMgYXJ0aWNsZSBvbiBob3ctLT4KKyAgICAgICAgICAgIDwhLS10byBkbyB0aGF0Oi0tPgorICAgICAgICAgICAgPCEtLTxsaW5rIHhsaW5rOmhyZWY9Imh0dHA6Ly9qYXZhLm5ldC9wcm9qZWN0cy9oZWxwL3BhZ2VzL1Byb2ZpbGVTZXR0aW5ncyNTU0hfS2V5c19UYWIiPmh0dHA6Ly9qYXZhLm5ldC9wcm9qZWN0cy9oZWxwL3BhZ2VzL1Byb2ZpbGVTZXR0aW5ncyNTU0hfS2V5c19UYWI8L2xpbms+LS0+CisgICAgICAgIDwhLS08L3BhcmE+LS0+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVG8gY2xvbmUgdGhlIEplcnNleSByZXBvc2l0b3J5IHlvdSBjYW4gZXhlY3V0ZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQgb24gdGhlIGNvbW1hbmQtbGluZQorICAgICAgICAgICAgKHByb3ZpZGVkIHlvdSBoYXZlIGEgY29tbWFuZC1saW5lIEdpdCBjbGllbnQgaW5zdGFsbGVkIG9uIHlvdXIgbWFjaGluZSk6CisgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImJhc2giIGxpbmVudW1iZXJpbmc9InVubnVtYmVyZWQiPmdpdCBjbG9uZSBnaXQ6Ly9naXRodWIuY29tL2plcnNleS9qZXJzZXkuZ2l0PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIFRoaXMgY3JlYXRlcyByZWFkLW9ubHkgY29weSBvZiBKZXJzZXkgd29ya3NwYWNlLiBJZiB5b3Ugd2FudCB0byBjb250cmlidXRlLCBwbGVhc2UgdXNlICJwdWxsIHJlcXVlc3QiOgorICAgICAgICAgICAgPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9oZWxwLmdpdGh1Yi5jb20vYXJ0aWNsZXMvY3JlYXRpbmctYS1wdWxsLXJlcXVlc3QiPmh0dHBzOi8vaGVscC5naXRodWIuY29tL2FydGljbGVzL2NyZWF0aW5nLWEtcHVsbC1yZXF1ZXN0PC9saW5rPi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIE1pbGVzdG9uZXMgYW5kIHJlbGVhc2VzIG9mIEplcnNleSBhcmUgdGFnZ2VkLiBZb3UgY2FuIGxpc3QgdGhlIHRhZ3MgYnkgZXhlY3V0aW5nIHRoZSBzdGFuZGFyZCBHaXQgY29tbWFuZCBpbiB0aGUgcmVwb3NpdG9yeSBkaXJlY3Rvcnk6CisgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImJhc2giIGxpbmVudW1iZXJpbmc9InVubnVtYmVyZWQiPmdpdCB0YWcgLWw8L3Byb2dyYW1saXN0aW5nPiBvciBieSB2aXNpdGluZworICAgICAgICAgICAgPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2plcnNleS9qZXJzZXkvdGFncyI+aHR0cHM6Ly9naXRodWIuY29tL2plcnNleS9qZXJzZXkvdGFnczwvbGluaz4uCisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiB4bWw6aWQ9ImJ1aWxkaW5nIj4KKyAgICAgICAgPHRpdGxlPkJ1aWxkaW5nIHRoZSBTb3VyY2U8L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEplcnNleSBzb3VyY2UgY29kZSByZXF1aXJlcyBKYXZhIFNFIDcgb3IgaGlnaGVyLiBUaGUgYnVpbGQgaXMgYmFzZWQgb24gTWF2ZW4uCisgICAgICAgICAgICBNYXZlbiAzLjEgb3IgaGlnaGVyIGlzIGhpZ2hseSByZWNvbW1lbmRlZC4gQWxzbyBpdCBpcyByZWNvbW1lbmRlZCB5b3UgdXNlIHRoZSBmb2xsb3dpbmcKKyAgICAgICAgICAgIE1hdmVuIG9wdGlvbnMgd2hlbiBidWlsZGluZyB0aGUgd29ya3NwYWNlIChjYW4gYmUgc2V0IGluIDxsaXRlcmFsPk1BVkVOX09QVFM8L2xpdGVyYWw+IGVudmlyb25tZW50CisgICAgICAgICAgICB2YXJpYWJsZSk6CisgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImJhc2giIGxpbmVudW1iZXJpbmc9InVubnVtYmVyZWQiPi1YbXgxMDQ4bSAtWFg6UGVybVNpemU9NjRNIC1YWDpNYXhQZXJtU2l6ZT0xMjhNPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEl0IGlzIHJlY29tbWVuZGVkIHRvIGJ1aWxkIGFsbCBvZiBKZXJzZXkgYWZ0ZXIgeW91IGNsb25lZCB0aGUgc291cmNlIGNvZGUgcmVwb3NpdG9yeS4KKyAgICAgICAgICAgIFRvIGRvIHRoYXQgZXhlY3V0ZSB0aGUgZm9sbG93aW5nIGNvbW1hbmRzIGluIHRoZSBkaXJlY3Rvcnkgd2hlcmUgamVyc2V5IHNvdXJjZSByZXBvc2l0b3J5CisgICAgICAgICAgICB3YXMgY2xvbmVkICh0eXBpY2FsbHkgdGhlIGRpcmVjdG9yeSBuYW1lZCAiamVyc2V5Iik6CisgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImJhc2giIGxpbmVudW1iZXJpbmc9InVubnVtYmVyZWQiPm12biAtRG1hdmVuLnRlc3Quc2tpcD10cnVlIGNsZWFuIGluc3RhbGw8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgVGhpcyBjb21tYW5kIHdpbGwgYnVpbGQgSmVyc2V5LCBidXQgc2tpcCB0aGUgdGVzdCBleGVjdXRpb24uCisgICAgICAgICAgICBJZiB5b3UgZG9uJ3Qgd2FudCB0byBza2lwIHRoZSB0ZXN0cywgZXhlY3V0ZSB0aGUgZm9sbG93aW5nIGluc3RlYWQ6CisgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImJhc2giIGxpbmVudW1iZXJpbmc9InVubnVtYmVyZWQiPm12biBjbGVhbiBpbnN0YWxsPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIEJ1aWxkaW5nIHRoZSB3aG9sZSBKZXJzZXkgcHJvamVjdCBpbmNsdWRpbmcgdGVzdHMgY291bGQgdGFrZSBzaWduaWZpY2FudCBhbW91bnQgb2YgdGltZS4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIHhtbDppZD0idGVzdGluZyI+CisgICAgICAgIDx0aXRsZT5UZXN0aW5nPC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBKZXJzZXkgY29udGFpbnMgbWFueSB0ZXN0cy4gVW5pdCB0ZXN0cyBhcmUgaW4gdGhlIGluZGl2aWR1YWwgSmVyc2V5IG1vZHVsZXMsCisgICAgICAgICAgICBpbnRlZ3JhdGlvbiBhbmQgZW5kLXRvLWVuZCB0ZXN0cyBhcmUgaW4gPGxpdGVyYWw+amVyc2V5L3Rlc3RzL2UyZTwvbGl0ZXJhbD4gZGlyZWN0b3J5LgorICAgICAgICAgICAgWW91IGNhbiBydW4gdGVzdHMgcmVsYXRlZCB0byBhIHBhcnRpY3VsYXIgYXJlYSB1c2luZyB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CisgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImJhc2giIGxpbmVudW1iZXJpbmc9InVubnVtYmVyZWQiPm12biAtRHRlc3Q9Jmx0O3BhdHRlcm4mZ3Q7IHRlc3Q8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgd2hlcmUKKyAgICAgICAgICAgIDxsaXRlcmFsPnBhdHRlcm48L2xpdGVyYWw+CisgICAgICAgICAgICBtYXkgYmUgYSBjb21tYSBzZXBhcmF0ZWQgc2V0IG9mIG5hbWVzIG1hdGNoaW5nIHRlc3RzIGNsYXNzZXMgb3IgaW5kaXZpZHVhbCBtZXRob2RzIChsaWtlCisgICAgICAgICAgICA8bGl0ZXJhbD5MaW5rVGVzdCN0ZXN0RGVsaW1pdGVyczwvbGl0ZXJhbD4pLgorICAgICAgICA8L3BhcmE+CisgICAgPC9zZWN0aW9uPgorICAgIDxzZWN0aW9uIHhtbDppZD0ibmV0YmVhbnMtYnVpbGQiPgorICAgICAgICA8dGl0bGU+VXNpbmcgTmV0QmVhbnM8L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIDxsaW5rIHhsaW5rOmhyZWY9Imh0dHA6Ly9uZXRiZWFucy5vcmciPk5ldEJlYW5zIElERTwvbGluaz4KKyAgICAgICAgICAgIGhhcyBleGNlbGxlbnQgbWF2ZW4gc3VwcG9ydC4gVGhlIEplcnNleSBtYXZlbgorICAgICAgICAgICAgbW9kdWxlcyBjYW4gYmUgbG9hZGVkLCBidWlsdCBhbmQgdGVzdGVkIGluIE5ldEJlYW5zIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwKKyAgICAgICAgICAgIE5ldEJlYW5zLXNwZWNpZmljIHByb2plY3QgZmlsZXMuCisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+CisKKzwvY2hhcHRlcj4KZGlmZiAtLWdpdCBhL2RvY3Mvc3JjL21haW4vZG9jYm9vay9pbWFnZXMvbW9uaXRvcmluZy1qc2NvbnNvbGUucG5nIGIvZG9jcy9zcmMvbWFpbi9kb2Nib29rL2ltYWdlcy9tb25pdG9yaW5nLWpzY29uc29sZS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWEwMDk3MQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3Mvc3JjL21haW4vZG9jYm9vay9pbWFnZXMvbW9uaXRvcmluZy1qc2NvbnNvbGUucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvc3JjL21haW4vZG9jYm9vay9pbWFnZXMvb2F1dGgtcGFydGllcy5wbmcgYi9kb2NzL3NyYy9tYWluL2RvY2Jvb2svaW1hZ2VzL29hdXRoLXBhcnRpZXMucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMjEzZjMKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3NyYy9tYWluL2RvY2Jvb2svaW1hZ2VzL29hdXRoLXBhcnRpZXMucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvc3JjL21haW4vZG9jYm9vay9pbWFnZXMvcngtY2xpZW50LWFzeW5jLWFwcHJvYWNoLnBuZyBiL2RvY3Mvc3JjL21haW4vZG9jYm9vay9pbWFnZXMvcngtY2xpZW50LWFzeW5jLWFwcHJvYWNoLnBuZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmJiZjgwCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9zcmMvbWFpbi9kb2Nib29rL2ltYWdlcy9yeC1jbGllbnQtYXN5bmMtYXBwcm9hY2gucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvc3JjL21haW4vZG9jYm9vay9pbWFnZXMvcngtY2xpZW50LXByb2JsZW0ucG5nIGIvZG9jcy9zcmMvbWFpbi9kb2Nib29rL2ltYWdlcy9yeC1jbGllbnQtcHJvYmxlbS5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk1NmVhOQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3Mvc3JjL21haW4vZG9jYm9vay9pbWFnZXMvcngtY2xpZW50LXByb2JsZW0ucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvc3JjL21haW4vZG9jYm9vay9pbWFnZXMvcngtY2xpZW50LXN5bmMtYXBwcm9hY2gucG5nIGIvZG9jcy9zcmMvbWFpbi9kb2Nib29rL2ltYWdlcy9yeC1jbGllbnQtc3luYy1hcHByb2FjaC5wbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNkOWJjMQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3Mvc3JjL21haW4vZG9jYm9vay9pbWFnZXMvcngtY2xpZW50LXN5bmMtYXBwcm9hY2gucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2RvY3Mvc3JjL21haW4vZG9jYm9vay9pbmMvbW9kdWxlcy5zcmMgYi9kb2NzL3NyYy9tYWluL2RvY2Jvb2svaW5jL21vZHVsZXMuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzZTYxNzgKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3NyYy9tYWluL2RvY2Jvb2svaW5jL21vZHVsZXMuc3JjCkBAIC0wLDAgKzEsMzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPCFET0NUWVBFIHNlY3Rpb24gWzwhRU5USVRZICUgZW50cyBTWVNURU0gImplcnNleS5lbnQiPiAlZW50cztdPgorPHNlY3Rpb24geG1sbnM9Imh0dHA6Ly9kb2Nib29rLm9yZy9ucy9kb2Nib29rIgorICAgICAgICAgdmVyc2lvbj0iNS4wIgorICAgICAgICAgeG1sOmxhbmc9ImVuIgorICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIgorICAgICAgICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9kb2Nib29rLm9yZy9ucy9kb2Nib29rIGh0dHA6Ly9kb2Nib29rLm9yZy94bWwvNS4wL3hzZC9kb2Nib29rLnhzZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIGh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsueHNkIgorICAgICAgICAgeG1sOmlkPSJtb2R1bGVzIj4KKyAgICA8dGl0bGU+TGlzdCBvZiBtb2R1bGVzPC90aXRsZT4KKworICAgIDxwYXJhPlRoZSBmb2xsb3dpbmcgY2hhcHRlcnMgcHJvdmlkZSBhbiBvdmVydmlldyBvZiBhbGwgSmVyc2V5IG1vZHVsZXMKKyAgICAgICAgYW5kIHRoZWlyIGRlcGVuZGVuY2llcyB3aXRoIGxpbmtzIHRvIHRoZSByZXNwZWN0aXZlIGJpbmFyaWVzIChmb2xsb3cgYSBsaW5rCisgICAgICAgIG9uIGEgbW9kdWxlIG5hbWUgdG8gZ2V0IGNvbXBsZXRlIHNldCBvZiBkb3dubG9hZGFibGUgZGVwZW5kZW5jaWVzKS4KKyAgICA8L3BhcmE+CisgICAgJUNPTlRFTlQKKzwvc2VjdGlvbj4KZGlmZiAtLWdpdCBhL2RvY3Mvc3JjL21haW4vZG9jYm9vay9pbmMvbW9kdWxlc190YWJsZV9mb290ZXIuc3JjIGIvZG9jcy9zcmMvbWFpbi9kb2Nib29rL2luYy9tb2R1bGVzX3RhYmxlX2Zvb3Rlci5zcmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdjMjA4ZQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3Mvc3JjL21haW4vZG9jYm9vay9pbmMvbW9kdWxlc190YWJsZV9mb290ZXIuc3JjCkBAIC0wLDAgKzEsMyBAQAorICAgICAgICA8L3Rib2R5PgorICAgIDwvdGdyb3VwPgorPC90YWJsZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kb2NzL3NyYy9tYWluL2RvY2Jvb2svaW5jL21vZHVsZXNfdGFibGVfaGVhZGVyLnNyYyBiL2RvY3Mvc3JjL21haW4vZG9jYm9vay9pbmMvbW9kdWxlc190YWJsZV9oZWFkZXIuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NTQ3N2MKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3NyYy9tYWluL2RvY2Jvb2svaW5jL21vZHVsZXNfdGFibGVfaGVhZGVyLnNyYwpAQCAtMCwwICsxLDExIEBACis8dGFibGUgcGd3aWRlPSIxIiBmcmFtZT0nYWxsJyB4bWw6aWQ9ImRlcGVuZGVuY2llcy10YWJsZS0lR1JPVVBfSUQiPgorICAgIDx0aXRsZT4lQ0FQVElPTjwvdGl0bGU+CisgICAgPHRncm91cCBjb2xzPScyJyBhbGlnbj0nbGVmdCcgY29sc2VwPScxJyByb3dzZXA9JzEnPgorICAgICAgICA8Y29sc3BlYyBjb2xuYW1lPSdjMScgY29sd2lkdGg9IjIqIi8+CisgICAgICAgIDxjb2xzcGVjIGNvbG5hbWU9J2MzJyBjb2x3aWR0aD0iNyoiLz4KKyAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnkgbmFtZXN0PSJjMSIgbmFtZWVuZD0iYzMiIGFsaWduPSJjZW50ZXIiPiVDQVBUSU9OPC9lbnRyeT4KKyAgICAgICAgICAgIDwvcm93PgorICAgICAgICA8L3RoZWFkPgorICAgICAgICA8dGJvZHk+CmRpZmYgLS1naXQgYS9kb2NzL3NyYy9tYWluL2RvY2Jvb2svaW5jL21vZHVsZXNfdGFibGVfcm93LnNyYyBiL2RvY3Mvc3JjL21haW4vZG9jYm9vay9pbmMvbW9kdWxlc190YWJsZV9yb3cuc3JjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNzAwNzAKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3NyYy9tYWluL2RvY2Jvb2svaW5jL21vZHVsZXNfdGFibGVfcm93LnNyYwpAQCAtMCwwICsxLDggQEAKKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvJUxJTktfUEFUSC9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAgJU5BTUUKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+JURFU0NSSVBUSU9OPC9lbnRyeT4KKzwvcm93PgpkaWZmIC0tZ2l0IGEvZG9jcy9zcmMvbWFpbi9kb2Nib29rL2luZGV4LnhtbCBiL2RvY3Mvc3JjL21haW4vZG9jYm9vay9pbmRleC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRjZWQxZQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3Mvc3JjL21haW4vZG9jYm9vay9pbmRleC54bWwKQEAgLTAsMCArMSwyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHhpOmluY2x1ZGUgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiIGhyZWY9InVzZXItZ3VpZGUueG1sIiAvPgpkaWZmIC0tZ2l0IGEvZG9jcy9zcmMvbWFpbi9kb2Nib29rL2pheHJzLXJlc291cmNlcy54bWwgYi9kb2NzL3NyYy9tYWluL2RvY2Jvb2svamF4cnMtcmVzb3VyY2VzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzkzODZjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9zcmMvbWFpbi9kb2Nib29rL2pheHJzLXJlc291cmNlcy54bWwKQEAgLTAsMCArMSwxMDk2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8IURPQ1RZUEUgY2hhcHRlciBbPCFFTlRJVFkgJSBlbnRzIFNZU1RFTSAiamVyc2V5LmVudCIgPiAlZW50czsgXT4KKzxjaGFwdGVyIHhtbG5zPSJodHRwOi8vZG9jYm9vay5vcmcvbnMvZG9jYm9vayIKKyAgICAgICAgIHZlcnNpb249IjUuMCIKKyAgICAgICAgIHhtbDpsYW5nPSJlbiIKKyAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIKKyAgICAgICAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vZG9jYm9vay5vcmcvbnMvZG9jYm9vayBodHRwOi8vZG9jYm9vay5vcmcveG1sLzUuMC94c2QvZG9jYm9vay54c2QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayBodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rLnhzZCIKKyAgICAgICAgIHhtbDppZD0iamF4cnMtcmVzb3VyY2VzIj4KKyAgICA8dGl0bGU+SkFYLVJTIEFwcGxpY2F0aW9uLCBSZXNvdXJjZXMgYW5kIFN1Yi1SZXNvdXJjZXM8L3RpdGxlPgorCisgICAgPHBhcmE+VGhpcyBjaGFwdGVyIHByZXNlbnRzIGFuIG92ZXJ2aWV3IG9mIHRoZSBjb3JlIEpBWC1SUyBjb25jZXB0cyAtIHJlc291cmNlcyBhbmQgc3ViLXJlc291cmNlcy48L3BhcmE+CisKKyAgICA8cGFyYT5UaGUgSkFYLVJTICZqYXgtcnMudmVyc2lvbjsgSmF2YURvYyBjYW4gYmUgZm91bmQgb25saW5lIDxsaW5rIHhsaW5rOmhyZWY9IiZqYXhycy5yZWxlYXNlLnVyaTsvYXBpZG9jcy9pbmRleC5odG1sIj5oZXJlPC9saW5rPi4KKyAgICA8L3BhcmE+CisKKyAgICA8cGFyYT5UaGUgSkFYLVJTICZqYXgtcnMudmVyc2lvbjsgc3BlY2lmaWNhdGlvbiBkcmFmdCBjYW4gYmUgZm91bmQgb25saW5lIDxsaW5rCisgICAgICAgICAgICB4bGluazpocmVmPSJodHRwOi8vamNwLm9yZy9lbi9qc3Ivc3VtbWFyeT9pZD0zMzkiPmhlcmU8L2xpbms+LgorICAgIDwvcGFyYT4KKworICAgIDxzZWN0aW9uPgorICAgICAgICA8dGl0bGU+Um9vdCBSZXNvdXJjZSBDbGFzc2VzPC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIDxlbXBoYXNpcz5Sb290IHJlc291cmNlIGNsYXNzZXM8L2VtcGhhc2lzPgorICAgICAgICAgICAgYXJlIFBPSk9zIChQbGFpbiBPbGQgSmF2YSBPYmplY3RzKSB0aGF0IGFyZSBhbm5vdGF0ZWQgd2l0aCAmamF4cnMuUGF0aDsKKyAgICAgICAgICAgIGhhdmUgYXQgbGVhc3Qgb25lIG1ldGhvZCBhbm5vdGF0ZWQgd2l0aCAmamF4cnMuUGF0aDsgb3IgYSByZXNvdXJjZSBtZXRob2QgZGVzaWduYXRvciBhbm5vdGF0aW9uIHN1Y2ggYXMgJmpheHJzLkdFVDssCisgICAgICAgICAgICAmamF4cnMuUFVUOywgJmpheHJzLlBPU1Q7LCAmamF4cnMuREVMRVRFOy4gUmVzb3VyY2UgbWV0aG9kcyBhcmUgbWV0aG9kcyBvZiBhIHJlc291cmNlIGNsYXNzIGFubm90YXRlZCB3aXRoIGEgcmVzb3VyY2UKKyAgICAgICAgICAgIG1ldGhvZCBkZXNpZ25hdG9yLiBUaGlzIHNlY3Rpb24gc2hvd3MgaG93IHRvIHVzZSBKZXJzZXkgdG8gYW5ub3RhdGUgSmF2YSBvYmplY3RzIHRvIGNyZWF0ZSBSRVNUZnVsIHdlYiBzZXJ2aWNlcy4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPlRoZSBmb2xsb3dpbmcgY29kZSBleGFtcGxlIGlzIGEgdmVyeSBzaW1wbGUgZXhhbXBsZSBvZiBhIHJvb3QKKyAgICAgICAgICAgIHJlc291cmNlIGNsYXNzIHVzaW5nIEpBWC1SUyBhbm5vdGF0aW9ucy4gVGhlIGV4YW1wbGUgY29kZSBzaG93biBoZXJlIGlzCisgICAgICAgICAgICBmcm9tIG9uZSBvZiB0aGUgc2FtcGxlcyB0aGF0IHNoaXBzIHdpdGggSmVyc2V5LCB0aGUgemlwIGZpbGUgb2Ygd2hpY2ggY2FuCisgICAgICAgICAgICBiZSBmb3VuZCBpbiB0aGUgbWF2ZW4gcmVwb3NpdG9yeQorICAgICAgICAgICAgPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9tYXZlbi5qYXZhLm5ldC9jb250ZW50L3JlcG9zaXRvcmllcy8mcmVwb3NpdG9yeTsvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC8mdmVyc2lvbjsvIj5oZXJlPC9saW5rPi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgIDx0aXRsZT5TaW1wbGUgaGVsbG8gd29ybGQgcm9vdCByZXNvdXJjZSBjbGFzczwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+cGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5oZWxsb3dvcmxkOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CisKK0BQYXRoKCJoZWxsb3dvcmxkIikKK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkUmVzb3VyY2UgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMSUNIRURfTUVTU0FHRSA9ICJIZWxsbyBXb3JsZCEiOworCitAR0VUCitAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0SGVsbG8oKSB7CisgICAgICAgIHJldHVybiBDTElDSEVEX01FU1NBR0U7CisgICAgfQorfTwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgICAgICBMZXQncyBsb29rIGF0IHNvbWUgb2YgdGhlIEpBWC1SUyBhbm5vdGF0aW9ucyB1c2VkIGluIHRoaXMgZXhhbXBsZS4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxzZWN0aW9uPgorICAgICAgICAgICAgPHRpdGxlPkBQYXRoPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+VGhlICZqYXhycy5QYXRoOyBhbm5vdGF0aW9uJ3MgdmFsdWUgaXMgYSByZWxhdGl2ZSBVUkkgcGF0aC4gSW4gdGhlIGV4YW1wbGUgYWJvdmUsIHRoZSBKYXZhIGNsYXNzIHdpbGwgYmUgaG9zdGVkIGF0IHRoZSBVUkkgcGF0aAorICAgICAgICAgICAgICAgIDxsaXRlcmFsPi9oZWxsb3dvcmxkPC9saXRlcmFsPi4gVGhpcyBpcyBhbiBleHRyZW1lbHkgc2ltcGxlIHVzZSBvZiB0aGUgJmpheHJzLlBhdGg7IGFubm90YXRpb24uIFdoYXQgbWFrZXMgSkFYLVJTIHNvIHVzZWZ1bCBpcyB0aGF0IHlvdSBjYW4gZW1iZWQgdmFyaWFibGVzIGluIHRoZSBVUklzLgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICA8ZW1waGFzaXM+VVJJIHBhdGggdGVtcGxhdGVzPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICBhcmUgVVJJcyB3aXRoIHZhcmlhYmxlcyBlbWJlZGRlZCB3aXRoaW4gdGhlIFVSSSBzeW50YXguIFRoZXNlIHZhcmlhYmxlcyBhcmUgc3Vic3RpdHV0ZWQgYXQgcnVudGltZSBpbiBvcmRlciBmb3IgYSByZXNvdXJjZSB0byByZXNwb25kIHRvIGEgcmVxdWVzdCBiYXNlZCBvbiB0aGUgc3Vic3RpdHV0ZWQgVVJJLiBWYXJpYWJsZXMgYXJlIGRlbm90ZWQgYnkgY3VybHkgYnJhY2VzLiBGb3IgZXhhbXBsZSwgbG9vayBhdCB0aGUgZm9sbG93aW5nICZqYXhycy5QYXRoOyBhbm5vdGF0aW9uOgorCisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJ1bm51bWJlcmVkIj5AUGF0aCgiL3VzZXJzL3t1c2VybmFtZX0iKTwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgICAgICAgICAgICAgICBJbiB0aGlzIHR5cGUgb2YgZXhhbXBsZSwgYSB1c2VyIHdpbGwgYmUgcHJvbXB0ZWQgdG8gZW50ZXIgdGhlaXIgbmFtZSwgYW5kIHRoZW4gYSBKZXJzZXkgd2ViIHNlcnZpY2UgY29uZmlndXJlZCB0byByZXNwb25kIHRvIHJlcXVlc3RzIHRvIHRoaXMgVVJJIHBhdGggdGVtcGxhdGUgd2lsbCByZXNwb25kLiBGb3IgZXhhbXBsZSwgaWYgdGhlIHVzZXIgZW50ZXJlZCB0aGVpciB1c2VybmFtZSBhcyAiR2FsaWxlbyIsIHRoZSB3ZWIgc2VydmljZSB3aWxsIHJlc3BvbmQgdG8gdGhlIGZvbGxvd2luZyBVUkw6CisgICAgICAgICAgICAgICAgPGxpdGVyYWw+aHR0cDovL2V4YW1wbGUuY29tL3VzZXJzL0dhbGlsZW88L2xpdGVyYWw+CisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPlRvIG9idGFpbiB0aGUgdmFsdWUgb2YgdGhlIHVzZXJuYW1lIHZhcmlhYmxlIHRoZSAmamF4cnMuUGF0aFBhcmFtOyBtYXkgYmUgdXNlZCBvbiBtZXRob2QgcGFyYW1ldGVyIG9mIGEgcmVxdWVzdCBtZXRob2QsIGZvciBleGFtcGxlOgorICAgICAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgICAgICA8dGl0bGU+U3BlY2lmeWluZyBVUkkgcGF0aCBwYXJhbWV0ZXI8L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5AUGF0aCgiL3VzZXJzL3t1c2VybmFtZX0iKQorcHVibGljIGNsYXNzIFVzZXJSZXNvdXJjZSB7CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3htbCIpCisgICAgcHVibGljIFN0cmluZyBnZXRVc2VyKEBQYXRoUGFyYW0oInVzZXJuYW1lIikgU3RyaW5nIHVzZXJOYW1lKSB7CisgICAgICAgIC4uLgorICAgIH0KK308L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgICAgICBJZiBpdCBpcyByZXF1aXJlZCB0aGF0IGEgdXNlciBuYW1lIG11c3Qgb25seSBjb25zaXN0IG9mCisgICAgICAgICAgICAgICAgbG93ZXIgYW5kIHVwcGVyIGNhc2UgbnVtZXJpYyBjaGFyYWN0ZXJzIHRoZW4gaXQgaXMgcG9zc2libGUgdG8gZGVjbGFyZSBhCisgICAgICAgICAgICAgICAgcGFydGljdWxhciByZWd1bGFyIGV4cHJlc3Npb24sIHdoaWNoIG92ZXJyaWRlcyB0aGUgZGVmYXVsdCByZWd1bGFyCisgICAgICAgICAgICAgICAgZXhwcmVzc2lvbiwgIlteL10rIiwgZm9yIGV4YW1wbGU6CisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIj5AUGF0aCgidXNlcnMve3VzZXJuYW1lOiBbYS16QS1aXVthLXpBLVpfMC05XSp9Iik8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIEluIHRoaXMgdHlwZSBvZiBleGFtcGxlIHRoZSB1c2VybmFtZSB2YXJpYWJsZSB3aWxsIG9ubHkgbWF0Y2ggdXNlciBuYW1lcyB0aGF0IGJlZ2luIHdpdGggb25lIHVwcGVyIG9yIGxvd2VyIGNhc2UgbGV0dGVyIGFuZCB6ZXJvIG9yIG1vcmUgYWxwaGEgbnVtZXJpYyBjaGFyYWN0ZXJzIGFuZCB0aGUgdW5kZXJzY29yZSBjaGFyYWN0ZXIuIElmIGEgdXNlciBuYW1lIGRvZXMgbm90IG1hdGNoIHRoYXQgYSA0MDQgKE5vdCBGb3VuZCkgcmVzcG9uc2Ugd2lsbCBvY2N1ci4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPHBhcmE+QSAmamF4cnMuUGF0aDsgdmFsdWUgbWF5IG9yIG1heSBub3QgYmVnaW4gd2l0aCBhICcvJywgaXQgbWFrZXMgbm8gZGlmZmVyZW5jZS4gTGlrZXdpc2UsIGJ5IGRlZmF1bHQsIGEgJmpheHJzLlBhdGg7IHZhbHVlIG1heSBvciBtYXkgbm90IGVuZCBpbiBhICcvJywgaXQgbWFrZXMgbm8gZGlmZmVyZW5jZSwgYW5kIHRodXMgcmVxdWVzdCBVUkxzIHRoYXQgZW5kIG9yIGRvIG5vdCBlbmQgaW4gYSAnLycgd2lsbCBib3RoCisgICAgICAgICAgICAgICAgYmUgbWF0Y2hlZC4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgIDxzZWN0aW9uPgorICAgICAgICAgICAgPHRpdGxlPkBHRVQsIEBQVVQsIEBQT1NULCBAREVMRVRFLCAuLi4gKEhUVFAgTWV0aG9kcyk8L3RpdGxlPgorCisgICAgICAgICAgICA8cGFyYT4mamF4cnMuR0VUOywgJmpheHJzLlBVVDssICZqYXhycy5QT1NUOywgJmpheHJzLkRFTEVURTsgYW5kICZqYXhycy5IRUFEOworICAgICAgICAgICAgICAgIGFyZQorICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5yZXNvdXJjZSBtZXRob2QgZGVzaWduYXRvcjwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMgZGVmaW5lZAorICAgICAgICAgICAgICAgIGJ5IEpBWC1SUyBhbmQgd2hpY2ggY29ycmVzcG9uZCB0byB0aGUgc2ltaWxhcmx5IG5hbWVkIEhUVFAgbWV0aG9kcy4gSW4KKyAgICAgICAgICAgICAgICB0aGUgZXhhbXBsZSBhYm92ZSwgdGhlIGFubm90YXRlZCBKYXZhIG1ldGhvZCB3aWxsIHByb2Nlc3MgSFRUUCBHRVQKKyAgICAgICAgICAgICAgICByZXF1ZXN0cy4gVGhlIGJlaGF2aW9yIG9mIGEgcmVzb3VyY2UgaXMgZGV0ZXJtaW5lZCBieSB3aGljaCBvZiB0aGUgSFRUUAorICAgICAgICAgICAgICAgIG1ldGhvZHMgdGhlIHJlc291cmNlIGlzIHJlc3BvbmRpbmcgdG8uCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPlRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpcyBhbiBleHRyYWN0IGZyb20gdGhlIHN0b3JhZ2Ugc2VydmljZQorICAgICAgICAgICAgICAgIHNhbXBsZSB0aGF0IHNob3dzIHRoZSB1c2Ugb2YgdGhlIFBVVCBtZXRob2QgdG8gY3JlYXRlIG9yIHVwZGF0ZSBhCisgICAgICAgICAgICAgICAgc3RvcmFnZSBjb250YWluZXI6CisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgICAgICA8dGl0bGU+UFVUIG1ldGhvZDwvdGl0bGU+CisgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPkBQVVQKK3B1YmxpYyBSZXNwb25zZSBwdXRDb250YWluZXIoKSB7CisgICAgU3lzdGVtLm91dC5wcmludGxuKCJQVVQgQ09OVEFJTkVSICIgKyBjb250YWluZXIpOworCisgICAgVVJJIHVyaSA9IHVyaUluZm8uZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgQ29udGFpbmVyIGMgPSBuZXcgQ29udGFpbmVyKGNvbnRhaW5lciwgdXJpLnRvU3RyaW5nKCkpOworCisgICAgUmVzcG9uc2UgcjsKKyAgICBpZiAoIU1lbW9yeVN0b3JlLk1TLmhhc0NvbnRhaW5lcihjKSkgeworICAgICAgICByID0gUmVzcG9uc2UuY3JlYXRlZCh1cmkpLmJ1aWxkKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgciA9IFJlc3BvbnNlLm5vQ29udGVudCgpLmJ1aWxkKCk7CisgICAgfQorCisgICAgTWVtb3J5U3RvcmUuTVMuY3JlYXRlQ29udGFpbmVyKGMpOworICAgIHJldHVybiByOworfTwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICAgICAgICAgIEJ5IGRlZmF1bHQgdGhlIEpBWC1SUyBydW50aW1lIHdpbGwgYXV0b21hdGljYWxseSBzdXBwb3J0IHRoZSBtZXRob2RzIEhFQUQgYW5kIE9QVElPTlMsIGlmIG5vdCBleHBsaWNpdGx5CisgICAgICAgICAgICAgICAgaW1wbGVtZW50ZWQuIEZvciBIRUFEIHRoZSBydW50aW1lIHdpbGwgaW52b2tlIHRoZSBpbXBsZW1lbnRlZCBHRVQgbWV0aG9kIChpZiBwcmVzZW50KSBhbmQgaWdub3JlIHRoZQorICAgICAgICAgICAgICAgIHJlc3BvbnNlIGVudGl0eSAoaWYgc2V0KS4gQSByZXNwb25zZSByZXR1cm5lZCBmb3IgdGhlIE9QVElPTlMgbWV0aG9kIGRlcGVuZHMgb24gdGhlIHJlcXVlc3RlZCBtZWRpYSB0eXBlCisgICAgICAgICAgICAgICAgZGVmaW5lZCBpbiB0aGUgJ0FjY2VwdCcgaGVhZGVyLiBUaGUgT1BUSU9OUyBtZXRob2QgY2FuIHJldHVybiBhIHJlc3BvbnNlIHdpdGggYSBzZXQgb2Ygc3VwcG9ydGVkCisgICAgICAgICAgICAgICAgcmVzb3VyY2UgbWV0aG9kcyBpbiB0aGUgJ0FsbG93JyBoZWFkZXIgb3IgcmV0dXJuCisgICAgICAgICAgICAgICAgYSA8bGluayB4bGluazpocmVmPSJodHRwOi8vd2FkbC5qYXZhLm5ldC8iPldBREw8L2xpbms+IGRvY3VtZW50LgorICAgICAgICAgICAgICAgIFNlZSA8bGluayBsaW5rZW5kPSJ3YWRsIj53YWRsIHNlY3Rpb248L2xpbms+IGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICA8dGl0bGU+QFByb2R1Y2VzPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhlICZqYXhycy5Qcm9kdWNlczsgYW5ub3RhdGlvbiBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIE1JTUUgbWVkaWEgdHlwZXMgb2YgcmVwcmVzZW50YXRpb25zIGEgcmVzb3VyY2UgY2FuCisgICAgICAgICAgICAgICAgcHJvZHVjZSBhbmQgc2VuZCBiYWNrIHRvIHRoZSBjbGllbnQuIEluIHRoaXMgZXhhbXBsZSwgdGhlIEphdmEgbWV0aG9kIHdpbGwgcHJvZHVjZSByZXByZXNlbnRhdGlvbnMgaWRlbnRpZmllZAorICAgICAgICAgICAgICAgIGJ5IHRoZSBNSU1FIG1lZGlhIHR5cGUgInRleHQvcGxhaW4iLiAmamF4cnMuUHJvZHVjZXM7IGNhbiBiZSBhcHBsaWVkIGF0IGJvdGggdGhlIGNsYXNzIGFuZCBtZXRob2QgbGV2ZWxzLgorICAgICAgICAgICAgICAgIEhlcmUncyBhbiBleGFtcGxlOgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgPHRpdGxlPlNwZWNpZnlpbmcgb3V0cHV0IE1JTUUgdHlwZTwvdGl0bGU+CisgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPkBQYXRoKCIvbXlSZXNvdXJjZSIpCitAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorcHVibGljIGNsYXNzIFNvbWVSZXNvdXJjZSB7CisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRBc1BsYWluVGV4dCgpIHsKKyAgICAgICAgLi4uCisgICAgfQorCisgICAgQEdFVAorICAgIEBQcm9kdWNlcygidGV4dC9odG1sIikKKyAgICBwdWJsaWMgU3RyaW5nIGRvR2V0QXNIdG1sKCkgeworICAgICAgICAuLi4KKyAgICB9Cit9PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgICAgICAgICAgVGhlCisgICAgICAgICAgICAgICAgPGxpdGVyYWw+ZG9HZXRBc1BsYWluVGV4dDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICBtZXRob2QgZGVmYXVsdHMgdG8gdGhlIE1JTUUgdHlwZSBvZiB0aGUgJmpheHJzLlByb2R1Y2VzOyBhbm5vdGF0aW9uIGF0IHRoZSBjbGFzcyBsZXZlbC4gVGhlCisgICAgICAgICAgICAgICAgPGxpdGVyYWw+ZG9HZXRBc0h0bWw8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgbWV0aG9kJ3MgJmpheHJzLlByb2R1Y2VzOyBhbm5vdGF0aW9uIG92ZXJyaWRlcyB0aGUgY2xhc3MtbGV2ZWwgJmpheHJzLlByb2R1Y2VzOyBzZXR0aW5nLCBhbmQgc3BlY2lmaWVzIHRoYXQgdGhlCisgICAgICAgICAgICAgICAgbWV0aG9kIGNhbiBwcm9kdWNlIEhUTUwgcmF0aGVyIHRoYW4gcGxhaW4gdGV4dC4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPHBhcmE+SWYgYSByZXNvdXJjZSBjbGFzcyBpcyBjYXBhYmxlIG9mIHByb2R1Y2luZyBtb3JlIHRoYXQgb25lIE1JTUUKKyAgICAgICAgICAgICAgICBtZWRpYSB0eXBlIHRoZW4gdGhlIHJlc291cmNlIG1ldGhvZCBjaG9zZW4gd2lsbCBjb3JyZXNwb25kIHRvIHRoZSBtb3N0CisgICAgICAgICAgICAgICAgYWNjZXB0YWJsZSBtZWRpYSB0eXBlIGFzIGRlY2xhcmVkIGJ5IHRoZSBjbGllbnQuIE1vcmUgc3BlY2lmaWNhbGx5IHRoZQorICAgICAgICAgICAgICAgIEFjY2VwdCBoZWFkZXIgb2YgdGhlIEhUVFAgcmVxdWVzdCBkZWNsYXJlcyB3aGF0IGlzIG1vc3QgYWNjZXB0YWJsZS4gRm9yCisgICAgICAgICAgICAgICAgZXhhbXBsZSBpZiB0aGUgQWNjZXB0IGhlYWRlciBpcyAiPGxpdGVyYWw+QWNjZXB0OiB0ZXh0L3BsYWluPC9saXRlcmFsPiIgdGhlbiB0aGUKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbD5kb0dldEFzUGxhaW5UZXh0PC9saXRlcmFsPgorICAgICAgICAgICAgICAgIG1ldGhvZCB3aWxsIGJlIGludm9rZWQuCisgICAgICAgICAgICAgICAgQWx0ZXJuYXRpdmVseSBpZiB0aGUgQWNjZXB0IGhlYWRlciBpcyAiCisgICAgICAgICAgICAgICAgPGxpdGVyYWw+QWNjZXB0OiB0ZXh0L3BsYWluO3E9MC45LCB0ZXh0L2h0bWw8L2xpdGVyYWw+Iiwgd2hpY2ggZGVjbGFyZXMgdGhhdCB0aGUgY2xpZW50IGNhbiBhY2NlcHQgbWVkaWEgdHlwZXMgb2YKKyAgICAgICAgICAgICAgICAidGV4dC9wbGFpbiIgYW5kICJ0ZXh0L2h0bWwiIGJ1dCBwcmVmZXJzIHRoZSBsYXR0ZXIsIHRoZW4gdGhlCisgICAgICAgICAgICAgICAgPGxpdGVyYWw+ZG9HZXRBc0h0bWw8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgbWV0aG9kIHdpbGwgYmUgaW52b2tlZC4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPHBhcmE+TW9yZSB0aGFuIG9uZSBtZWRpYSB0eXBlIG1heSBiZSBkZWNsYXJlZCBpbiB0aGUgc2FtZSAmamF4cnMuUHJvZHVjZXM7IGRlY2xhcmF0aW9uLCBmb3IgZXhhbXBsZToKKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5Vc2luZyBtdWx0aXBsZSBvdXRwdXQgTUlNRSB0eXBlczwvdGl0bGU+CisgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPkBHRVQKK0BQcm9kdWNlcyh7ImFwcGxpY2F0aW9uL3htbCIsICJhcHBsaWNhdGlvbi9qc29uIn0pCitwdWJsaWMgU3RyaW5nIGRvR2V0QXNYbWxPckpzb24oKSB7CisgICAgLi4uCit9PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgICAgICAgICAgVGhlCisgICAgICAgICAgICAgICAgPGxpdGVyYWw+ZG9HZXRBc1htbE9ySnNvbjwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICBtZXRob2Qgd2lsbCBnZXQKKyAgICAgICAgICAgICAgICBpbnZva2VkIGlmIGVpdGhlciBvZiB0aGUgbWVkaWEgdHlwZXMgImFwcGxpY2F0aW9uL3htbCIgYW5kCisgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL2pzb24iIGFyZSBhY2NlcHRhYmxlLiBJZiBib3RoIGFyZSBlcXVhbGx5IGFjY2VwdGFibGUgdGhlbgorICAgICAgICAgICAgICAgIHRoZSBmb3JtZXIgd2lsbCBiZSBjaG9zZW4gYmVjYXVzZSBpdCBvY2N1cnMgZmlyc3QuCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPk9wdGlvbmFsbHksIHNlcnZlciBjYW4gYWxzbyBzcGVjaWZ5IHRoZSBxdWFsaXR5IGZhY3RvciBmb3IgaW5kaXZpZHVhbCBtZWRpYSB0eXBlcy4gVGhlc2UgYXJlCisgICAgICAgICAgICAgICAgY29uc2lkZXJlZCBpZiBzZXZlcmFsIGFyZSBlcXVhbGx5IGFjY2VwdGFibGUgYnkgdGhlIGNsaWVudC4gRm9yIGV4YW1wbGU6PC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgPHRpdGxlPlNlcnZlci1zaWRlIGNvbnRlbnQgbmVnb3RpYXRpb248L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5AR0VUCitAUHJvZHVjZXMoeyJhcHBsaWNhdGlvbi94bWw7IHFzPTAuOSIsICJhcHBsaWNhdGlvbi9qc29uIn0pCitwdWJsaWMgU3RyaW5nIGRvR2V0QXNYbWxPckpzb24oKSB7CisgICAgLi4uCit9PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgICAgICAgICAgSW4gdGhlIGFib3ZlIHNhbXBsZSwgaWYgY2xpZW50IGFjY2VwdHMgYm90aCAiYXBwbGljYXRpb24veG1sIiBhbmQgImFwcGxpY2F0aW9uL2pzb24iIChlcXVhbGx5KSwKKyAgICAgICAgICAgICAgICB0aGVuIGEgc2VydmVyIGFsd2F5cyBzZW5kcyAiYXBwbGljYXRpb24vanNvbiIsIHNpbmNlICJhcHBsaWNhdGlvbi94bWwiIGhhcyBhIGxvd2VyIHF1YWxpdHkgZmFjdG9yLgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT5UaGUgZXhhbXBsZXMgYWJvdmUgcmVmZXJzIGV4cGxpY2l0bHkgdG8gTUlNRSBtZWRpYSB0eXBlcyBmb3IKKyAgICAgICAgICAgICAgICBjbGFyaXR5LiBJdCBpcyBwb3NzaWJsZSB0byByZWZlciB0byBjb25zdGFudCB2YWx1ZXMsIHdoaWNoIG1heSByZWR1Y2UKKyAgICAgICAgICAgICAgICB0eXBvZ3JhcGhpY2FsIGVycm9ycywgc2VlIHRoZSBjb25zdGFudCBmaWVsZCB2YWx1ZXMgb2YgJmpheHJzLmNvcmUuTWVkaWFUeXBlOy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgIDxzZWN0aW9uPgorICAgICAgICAgICAgPHRpdGxlPkBDb25zdW1lczwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT5UaGUgJmpheHJzLkNvbnN1bWVzOyBhbm5vdGF0aW9uIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgTUlNRSBtZWRpYSB0eXBlcyBvZiByZXByZXNlbnRhdGlvbnMKKyAgICAgICAgICAgICAgICB0aGF0IGNhbiBiZSBjb25zdW1lZCBieSBhIHJlc291cmNlLiBUaGUgYWJvdmUgZXhhbXBsZSBjYW4gYmUgbW9kaWZpZWQgdG8gc2V0IHRoZSBjbGljaGVkCisgICAgICAgICAgICAgICAgbWVzc2FnZSBhcyBmb2xsb3dzOgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgPHRpdGxlPlNwZWNpZnlpbmcgaW5wdXQgTUlNRSB0eXBlPC90aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+QFBPU1QKK0BDb25zdW1lcygidGV4dC9wbGFpbiIpCitwdWJsaWMgdm9pZCBwb3N0Q2xpY2hlZE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAvLyBTdG9yZSB0aGUgbWVzc2FnZQorfTwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT5JbiB0aGlzIGV4YW1wbGUsIHRoZSBKYXZhIG1ldGhvZCB3aWxsIGNvbnN1bWUgcmVwcmVzZW50YXRpb25zCisgICAgICAgICAgICAgICAgaWRlbnRpZmllZCBieSB0aGUgTUlNRSBtZWRpYSB0eXBlICJ0ZXh0L3BsYWluIi4gTm90aWNlIHRoYXQgdGhlIHJlc291cmNlCisgICAgICAgICAgICAgICAgbWV0aG9kIHJldHVybnMgdm9pZC4gVGhpcyBtZWFucyBubyByZXByZXNlbnRhdGlvbiBpcyByZXR1cm5lZCBhbmQKKyAgICAgICAgICAgICAgICByZXNwb25zZSB3aXRoIGEgc3RhdHVzIGNvZGUgb2YgMjA0IChObyBDb250ZW50KSB3aWxsIGJlIHJldHVybmVkIHRvIHRoZSBjbGllbnQuCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPiZqYXhycy5Db25zdW1lczsgY2FuIGJlIGFwcGxpZWQgYXQgYm90aCB0aGUgY2xhc3MgYW5kIHRoZSBtZXRob2QgbGV2ZWxzIGFuZCBtb3JlIHRoYW4gb25lIG1lZGlhIHR5cGUKKyAgICAgICAgICAgICAgICBtYXkgYmUgZGVjbGFyZWQgaW4gdGhlIHNhbWUgJmpheHJzLkNvbnN1bWVzOyBkZWNsYXJhdGlvbi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uPgorICAgICAgICA8dGl0bGU+UGFyYW1ldGVyIEFubm90YXRpb25zIChAKlBhcmFtKTwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+UGFyYW1ldGVycyBvZiBhIHJlc291cmNlIG1ldGhvZCBtYXkgYmUgYW5ub3RhdGVkIHdpdGggcGFyYW1ldGVyLWJhc2VkIGFubm90YXRpb25zIHRvIGV4dHJhY3QgaW5mb3JtYXRpb24KKyAgICAgICAgICAgIGZyb20gYSByZXF1ZXN0LiBPbmUgb2YgdGhlIHByZXZpb3VzIGV4YW1wbGVzIHByZXNlbnRlZCB0aGUgdXNlIG9mICZqYXhycy5QYXRoUGFyYW07IHRvIGV4dHJhY3QgYSBwYXRoCisgICAgICAgICAgICBwYXJhbWV0ZXIgZnJvbSB0aGUgcGF0aCBjb21wb25lbnQgb2YgdGhlIHJlcXVlc3QgVVJMIHRoYXQgbWF0Y2hlZCB0aGUgcGF0aCBkZWNsYXJlZCBpbiAmamF4cnMuUGF0aDsuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4mamF4cnMuUXVlcnlQYXJhbTsgaXMgdXNlZCB0byBleHRyYWN0IHF1ZXJ5IHBhcmFtZXRlcnMgZnJvbSB0aGUgUXVlcnkgY29tcG9uZW50IG9mIHRoZSByZXF1ZXN0IFVSTC4KKyAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpcyBhbiBleHRyYWN0IGZyb20gdGhlIHNwYXJrbGluZXMgc2FtcGxlOgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICA8dGl0bGU+UXVlcnkgcGFyYW1ldGVyczwvdGl0bGU+CisgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5AUGF0aCgic21vb3RoIikKK0BHRVQKK3B1YmxpYyBSZXNwb25zZSBzbW9vdGgoCisgICAgQERlZmF1bHRWYWx1ZSgiMiIpIEBRdWVyeVBhcmFtKCJzdGVwIikgaW50IHN0ZXAsCisgICAgQERlZmF1bHRWYWx1ZSgidHJ1ZSIpIEBRdWVyeVBhcmFtKCJtaW4tbSIpIGJvb2xlYW4gaGFzTWluLAorICAgIEBEZWZhdWx0VmFsdWUoInRydWUiKSBAUXVlcnlQYXJhbSgibWF4LW0iKSBib29sZWFuIGhhc01heCwKKyAgICBARGVmYXVsdFZhbHVlKCJ0cnVlIikgQFF1ZXJ5UGFyYW0oImxhc3QtbSIpIGJvb2xlYW4gaGFzTGFzdCwKKyAgICBARGVmYXVsdFZhbHVlKCJibHVlIikgQFF1ZXJ5UGFyYW0oIm1pbi1jb2xvciIpIENvbG9yUGFyYW0gbWluQ29sb3IsCisgICAgQERlZmF1bHRWYWx1ZSgiZ3JlZW4iKSBAUXVlcnlQYXJhbSgibWF4LWNvbG9yIikgQ29sb3JQYXJhbSBtYXhDb2xvciwKKyAgICBARGVmYXVsdFZhbHVlKCJyZWQiKSBAUXVlcnlQYXJhbSgibGFzdC1jb2xvciIpIENvbG9yUGFyYW0gbGFzdENvbG9yKSB7CisgICAgLi4uCit9PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPC9leGFtcGxlPgorCisgICAgICAgIDxwYXJhPklmIGEgcXVlcnkgcGFyYW1ldGVyICJzdGVwIiBleGlzdHMgaW4gdGhlIHF1ZXJ5IGNvbXBvbmVudCBvZiB0aGUKKyAgICAgICAgICAgIHJlcXVlc3QgVVJJIHRoZW4gdGhlICJzdGVwIiB2YWx1ZSB3aWxsIGJlIGV4dHJhY3RlZCBhbmQgcGFyc2VkIGFzIGEKKyAgICAgICAgICAgIDMyIGJpdCBzaWduZWQgaW50ZWdlciBhbmQgYXNzaWduZWQgdG8gdGhlIHN0ZXAgbWV0aG9kIHBhcmFtZXRlci4gSWYgInN0ZXAiCisgICAgICAgICAgICBkb2VzIG5vdCBleGlzdCB0aGVuIGEgZGVmYXVsdCB2YWx1ZSBvZiAyLCBhcyBkZWNsYXJlZCBpbiB0aGUgJmpheHJzLkRlZmF1bHRWYWx1ZTsKKyAgICAgICAgICAgIGFubm90YXRpb24sIHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIHN0ZXAgbWV0aG9kIHBhcmFtZXRlci4gSWYgdGhlICJzdGVwIgorICAgICAgICAgICAgdmFsdWUgY2Fubm90IGJlIHBhcnNlZCBhcyBhIDMyIGJpdCBzaWduZWQgaW50ZWdlciB0aGVuIGEgSFRUUCA0MDQgKE5vdAorICAgICAgICAgICAgRm91bmQpIHJlc3BvbnNlIGlzIHJldHVybmVkLiBVc2VyIGRlZmluZWQgSmF2YSB0eXBlcyBzdWNoIGFzCisgICAgICAgICAgICA8bGl0ZXJhbD5Db2xvclBhcmFtPC9saXRlcmFsPgorICAgICAgICAgICAgbWF5IGJlIHVzZWQsIHdoaWNoIGFzIGltcGxlbWVudGVkIGFzCisgICAgICAgICAgICBmb2xsb3dzOgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICA8dGl0bGU+Q3VzdG9tIEphdmEgdHlwZSBmb3IgY29uc3VtaW5nIHJlcXVlc3QgcGFyYW1ldGVyczwvdGl0bGU+CisgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5wdWJsaWMgY2xhc3MgQ29sb3JQYXJhbSBleHRlbmRzIENvbG9yIHsKKworICAgIHB1YmxpYyBDb2xvclBhcmFtKFN0cmluZyBzKSB7CisgICAgICAgIHN1cGVyKGdldFJHQihzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldFJHQihTdHJpbmcgcykgeworICAgICAgICBpZiAocy5jaGFyQXQoMCkgPT0gJyMnKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIENvbG9yIGMgPSBDb2xvci5kZWNvZGUoIjB4IiArIHMuc3Vic3RyaW5nKDEpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYy5nZXRSR0IoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKDQwMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEZpZWxkIGYgPSBDb2xvci5jbGFzcy5nZXRGaWVsZChzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKChDb2xvcilmLmdldChudWxsKSkuZ2V0UkdCKCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbig0MDApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfTwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDwvZXhhbXBsZT4KKworICAgICAgICA8cGFyYT5JbiBnZW5lcmFsIHRoZSBKYXZhIHR5cGUgb2YgdGhlIG1ldGhvZCBwYXJhbWV0ZXIgbWF5OjwvcGFyYT4KKworICAgICAgICA8b3JkZXJlZGxpc3Q+CisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+QmUgYSBwcmltaXRpdmUgdHlwZTs8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+SGF2ZSBhIGNvbnN0cnVjdG9yIHRoYXQgYWNjZXB0cyBhIHNpbmdsZQorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5TdHJpbmc8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50OworICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8cGFyYT5IYXZlIGEgc3RhdGljIG1ldGhvZCBuYW1lZAorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD52YWx1ZU9mPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICBvcgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5mcm9tU3RyaW5nPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICB0aGF0IGFjY2VwdHMgYSBzaW5nbGUKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+U3RyaW5nPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICBhcmd1bWVudCAoc2VlLCBmb3IgZXhhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+SW50ZWdlci52YWx1ZU9mKFN0cmluZyk8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgIGFuZCA8bGl0ZXJhbD5qYXZhLnV0aWwuVVVJRC5mcm9tU3RyaW5nKFN0cmluZyk8L2xpdGVyYWw+KTsKKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxwYXJhPkhhdmUgYSByZWdpc3RlcmVkIGltcGxlbWVudGF0aW9uIG9mIDxsaXRlcmFsPmphdmF4LndzLnJzLmV4dC5QYXJhbUNvbnZlcnRlclByb3ZpZGVyPC9saXRlcmFsPiBKQVgtUlMKKyAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uIFNQSSB0aGF0IHJldHVybnMgYSA8bGl0ZXJhbD5qYXZheC53cy5ycy5leHQuUGFyYW1Db252ZXJ0ZXI8L2xpdGVyYWw+IGluc3RhbmNlIGNhcGFibGUgb2YKKyAgICAgICAgICAgICAgICAgICAgYSAiZnJvbSBzdHJpbmciIGNvbnZlcnNpb24gZm9yIHRoZSB0eXBlLgorICAgICAgICAgICAgICAgICAgICAgb3IKKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPHBhcmE+QmUgPGxpdGVyYWw+TGlzdCZsdDtUJmd0OzwvbGl0ZXJhbD4sCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPlNldCZsdDtUJmd0OzwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgb3IKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+U29ydGVkU2V0Jmx0O1QmZ3Q7PC9saXRlcmFsPiwgd2hlcmUKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+VDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgc2F0aXNmaWVzIDIgb3IgMyBhYm92ZS4gVGhlIHJlc3VsdGluZyBjb2xsZWN0aW9uIGlzIHJlYWQtb25seS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICA8L29yZGVyZWRsaXN0PgorCisgICAgICAgIDxwYXJhPlNvbWV0aW1lcyBwYXJhbWV0ZXJzIG1heSBjb250YWluIG1vcmUgdGhhbiBvbmUgdmFsdWUgZm9yIHRoZSBzYW1lCisgICAgICAgICAgICBuYW1lLiBJZiB0aGlzIGlzIHRoZSBjYXNlIHRoZW4gdHlwZXMgaW4gNSkgbWF5IGJlIHVzZWQgdG8gb2J0YWluIGFsbAorICAgICAgICAgICAgdmFsdWVzLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+SWYgdGhlICZqYXhycy5EZWZhdWx0VmFsdWU7IGlzIG5vdCB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggJmpheHJzLlF1ZXJ5UGFyYW07CisgICAgICAgICAgICBhbmQgdGhlIHF1ZXJ5IHBhcmFtZXRlciBpcyBub3QgcHJlc2VudCBpbiB0aGUgcmVxdWVzdCB0aGVuIHZhbHVlIHdpbGwgYmUKKyAgICAgICAgICAgIGFuIGVtcHR5IGNvbGxlY3Rpb24gZm9yPGxpdGVyYWw+TGlzdDwvbGl0ZXJhbD4sIDxsaXRlcmFsPlNldDwvbGl0ZXJhbD4gb3IgPGxpdGVyYWw+U29ydGVkU2V0PC9saXRlcmFsPiwKKyAgICAgICAgICAgICZsaXQubnVsbDsgZm9yIG90aGVyIG9iamVjdCB0eXBlcywgYW5kIHRoZSBKYXZhLWRlZmluZWQgZGVmYXVsdCBmb3IgcHJpbWl0aXZlIHR5cGVzLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+VGhlICZqYXhycy5QYXRoUGFyYW07IGFuZCB0aGUgb3RoZXIgcGFyYW1ldGVyLWJhc2VkIGFubm90YXRpb25zLCAmamF4cnMuTWF0cml4UGFyYW07LAorICAgICAgICAgICAgJmpheHJzLkhlYWRlclBhcmFtOywgJmpheHJzLkNvb2tpZVBhcmFtOywgJmpheHJzLkZvcm1QYXJhbTsgb2JleSB0aGUgc2FtZSBydWxlcyBhcyAmamF4cnMuUXVlcnlQYXJhbTsuCisgICAgICAgICAgICAmamF4cnMuTWF0cml4UGFyYW07IGV4dHJhY3RzIGluZm9ybWF0aW9uIGZyb20gVVJMIHBhdGggc2VnbWVudHMuICZqYXhycy5IZWFkZXJQYXJhbTsgZXh0cmFjdHMgaW5mb3JtYXRpb24KKyAgICAgICAgICAgIGZyb20gdGhlIEhUVFAgaGVhZGVycy4gJmpheHJzLkNvb2tpZVBhcmFtOyBleHRyYWN0cyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBjb29raWVzIGRlY2xhcmVkIGluIGNvb2tpZSByZWxhdGVkIEhUVFAKKyAgICAgICAgICAgIGhlYWRlcnMuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4mamF4cnMuRm9ybVBhcmFtOyBpcyBzbGlnaHRseSBzcGVjaWFsIGJlY2F1c2UgaXQgZXh0cmFjdHMgaW5mb3JtYXRpb24gZnJvbSBhIHJlcXVlc3QgcmVwcmVzZW50YXRpb24gdGhhdAorICAgICAgICAgICAgaXMgb2YgdGhlIE1JTUUgbWVkaWEgdHlwZQorICAgICAgICAgICAgPGxpdGVyYWw+ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCI8L2xpdGVyYWw+CisgICAgICAgICAgICBhbmQgY29uZm9ybXMgdG8gdGhlIGVuY29kaW5nCisgICAgICAgICAgICBzcGVjaWZpZWQgYnkgSFRNTCBmb3JtcywgYXMgZGVzY3JpYmVkIGhlcmUuIFRoaXMgcGFyYW1ldGVyIGlzIHZlcnkgdXNlZnVsIGZvciBleHRyYWN0aW5nIGluZm9ybWF0aW9uIHRoYXQgaXMKKyAgICAgICAgICAgIFBPU1RlZCBieSBIVE1MIGZvcm1zLCBmb3IgZXhhbXBsZSB0aGUgZm9sbG93aW5nIGV4dHJhY3RzIHRoZSBmb3JtIHBhcmFtZXRlciBuYW1lZCAibmFtZSIgZnJvbSB0aGUgUE9TVGVkIGZvcm0KKyAgICAgICAgICAgIGRhdGE6CisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgIDx0aXRsZT5Qcm9jZXNzaW5nIFBPU1RlZCBIVE1MIGZvcm08L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPkBQT1NUCitAQ29uc3VtZXMoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpCitwdWJsaWMgdm9pZCBwb3N0KEBGb3JtUGFyYW0oIm5hbWUiKSBTdHJpbmcgbmFtZSkgeworICAgIC8vIFN0b3JlIHRoZSBtZXNzYWdlCit9PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPklmIGl0IGlzIG5lY2Vzc2FyeSB0byBvYnRhaW4gYSBnZW5lcmFsIG1hcCBvZiBwYXJhbWV0ZXIgbmFtZSB0bworICAgICAgICAgICAgdmFsdWVzIHRoZW4sIGZvciBxdWVyeSBhbmQgcGF0aCBwYXJhbWV0ZXJzIGl0IGlzIHBvc3NpYmxlIHRvIGRvIHRoZQorICAgICAgICAgICAgZm9sbG93aW5nOgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICA8dGl0bGU+T2J0YWluaW5nIGdlbmVyYWwgbWFwIG9mIFVSSSBwYXRoIGFuZC9vciBxdWVyeSBwYXJhbWV0ZXJzPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5AR0VUCitwdWJsaWMgU3RyaW5nIGdldChAQ29udGV4dCBVcmlJbmZvIHVpKSB7CisgICAgTXVsdGl2YWx1ZWRNYXAmbHQ7U3RyaW5nLCBTdHJpbmcmZ3Q7IHF1ZXJ5UGFyYW1zID0gdWkuZ2V0UXVlcnlQYXJhbWV0ZXJzKCk7CisgICAgTXVsdGl2YWx1ZWRNYXAmbHQ7U3RyaW5nLCBTdHJpbmcmZ3Q7IHBhdGhQYXJhbXMgPSB1aS5nZXRQYXRoUGFyYW1ldGVycygpOworfTwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT5Gb3IgaGVhZGVyIGFuZCBjb29raWUgcGFyYW1ldGVycyB0aGUgZm9sbG93aW5nOjwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgIDx0aXRsZT5PYnRhaW5pbmcgZ2VuZXJhbCBtYXAgb2YgaGVhZGVyIHBhcmFtZXRlcnM8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPkBHRVQKK3B1YmxpYyBTdHJpbmcgZ2V0KEBDb250ZXh0IEh0dHBIZWFkZXJzIGhoKSB7CisgICAgTXVsdGl2YWx1ZWRNYXAmbHQ7U3RyaW5nLCBTdHJpbmcmZ3Q7IGhlYWRlclBhcmFtcyA9IGhoLmdldFJlcXVlc3RIZWFkZXJzKCk7CisgICAgTWFwJmx0O1N0cmluZywgQ29va2llJmd0OyBwYXRoUGFyYW1zID0gaGguZ2V0Q29va2llcygpOworfTwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT5JbiBnZW5lcmFsICZqYXhycy5jb3JlLkNvbnRleHQ7IGNhbiBiZSB1c2VkIHRvIG9idGFpbiBjb250ZXh0dWFsIEphdmEgdHlwZXMgcmVsYXRlZCB0byB0aGUgcmVxdWVzdCBvciByZXNwb25zZS4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPkJlY2F1c2UgZm9ybSBwYXJhbWV0ZXJzICh1bmxpa2Ugb3RoZXJzKSBhcmUgcGFydCBvZiB0aGUgbWVzc2FnZSBlbnRpdHksIGl0IGlzIHBvc3NpYmxlIHRvIGRvIHRoZSBmb2xsb3dpbmc6PC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgPHRpdGxlPk9idGFpbmluZyBnZW5lcmFsIG1hcCBvZiBmb3JtIHBhcmFtZXRlcnM8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPkBQT1NUCitAQ29uc3VtZXMoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpCitwdWJsaWMgdm9pZCBwb3N0KE11bHRpdmFsdWVkTWFwJmx0O1N0cmluZywgU3RyaW5nJmd0OyBmb3JtUGFyYW1zKSB7CisgICAgLy8gU3RvcmUgdGhlIG1lc3NhZ2UKK308L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorCisgICAgICAgICAgICBJLmUuIHlvdSBkb24ndCBuZWVkIHRvIHVzZSB0aGUgJmpheHJzLmNvcmUuQ29udGV4dDsgYW5ub3RhdGlvbi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT5Bbm90aGVyIGtpbmQgb2YgaW5qZWN0aW9uIGlzIHRoZSAmamF4cnMuQmVhblBhcmFtOyB3aGljaCBhbGxvd3MgdG8gaW5qZWN0IHRoZSBwYXJhbWV0ZXJzIGRlc2NyaWJlZCBhYm92ZSBpbnRvIGEKKyAgICAgICAgICAgIHNpbmdsZSBiZWFuLiBBIGJlYW4gYW5ub3RhdGVkIHdpdGggJmpheHJzLkJlYW5QYXJhbTsgY29udGFpbmluZyBhbnkgZmllbGRzIGFuZCBhcHByb3ByaWF0ZQorICAgICAgICAgICAgPGxpdGVyYWw+KnBhcmFtPC9saXRlcmFsPgorICAgICAgICAgICAgYW5ub3RhdGlvbihsaWtlICZqYXhycy5QYXRoUGFyYW07KSB3aWxsIGJlIGluaXRpYWxpemVkIHdpdGggY29ycmVzcG9uZGluZyByZXF1ZXN0IHZhbHVlcyBpbiBleHBlY3RlZCB3YXkgYXMgaWYgdGhlc2UKKyAgICAgICAgICAgIGZpZWxkcyB3ZXJlIGluIHRoZSByZXNvdXJjZSBjbGFzcy4gVGhlbiBpbnN0ZWFkIG9mIGluamVjdGluZyByZXF1ZXN0IHZhbHVlcyBsaWtlIHBhdGggcGFyYW0gaW50byBhIGNvbnN0cnVjdG9yIHBhcmFtZXRlcnMKKyAgICAgICAgICAgIG9yIGNsYXNzIGZpZWxkcyB0aGUgJmpheHJzLkJlYW5QYXJhbTsgY2FuIGJlIHVzZWQgdG8gaW5qZWN0IHN1Y2ggYSBiZWFuIGludG8gYSByZXNvdXJjZSBvciByZXNvdXJjZSBtZXRob2QuIFRoZQorICAgICAgICAgICAgJmpheHJzLkJlYW5QYXJhbTsgaXMgdXNlZCB0aGlzIHdheSB0byBhZ2dyZWdhdGUgbW9yZSByZXF1ZXN0IHBhcmFtZXRlcnMgaW50byBhIHNpbmdsZSBiZWFuLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgPHRpdGxlPkV4YW1wbGUgb2YgdGhlIGJlYW4gd2hpY2ggd2lsbCBiZSB1c2VkIGFzICZqYXhycy5CZWFuUGFyYW07CisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+cHVibGljIGNsYXNzIE15QmVhblBhcmFtIHsKKyAgICBAUGF0aFBhcmFtKCJwIikKKyAgICBwcml2YXRlIFN0cmluZyBwYXRoUGFyYW07CisKKyAgICBATWF0cml4UGFyYW0oIm0iKQorICAgIEBFbmNvZGVkCisgICAgQERlZmF1bHRWYWx1ZSgiZGVmYXVsdCIpCisgICAgcHJpdmF0ZSBTdHJpbmcgbWF0cml4UGFyYW07CisKKyAgICBASGVhZGVyUGFyYW0oImhlYWRlciIpCisgICAgcHJpdmF0ZSBTdHJpbmcgaGVhZGVyUGFyYW07CisKKyAgICBwcml2YXRlIFN0cmluZyBxdWVyeVBhcmFtOworCisgICAgcHVibGljIE15QmVhblBhcmFtKEBRdWVyeVBhcmFtKCJxIikgU3RyaW5nIHF1ZXJ5UGFyYW0pIHsKKyAgICAgICAgdGhpcy5xdWVyeVBhcmFtID0gcXVlcnlQYXJhbTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGhQYXJhbSgpIHsKKyAgICAgICAgcmV0dXJuIHBhdGhQYXJhbTsKKyAgICB9CisgICAgLi4uCit9PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgIDx0aXRsZT5JbmplY3Rpb24gb2YgTXlCZWFuUGFyYW0gYXMgYSBtZXRob2QgcGFyYW1ldGVyOjwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPkBQT1NUCitwdWJsaWMgdm9pZCBwb3N0KEBCZWFuUGFyYW0gTXlCZWFuUGFyYW0gYmVhblBhcmFtLCBTdHJpbmcgZW50aXR5KSB7CisgICAgZmluYWwgU3RyaW5nIHBhdGhQYXJhbSA9IGJlYW5QYXJhbS5nZXRQYXRoUGFyYW0oKTsgLy8gY29udGFpbnMgaW5qZWN0ZWQgcGF0aCBwYXJhbWV0ZXIgInAiCisgICAgLi4uCit9PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8cGFyYT5UaGUgZXhhbXBsZSBzaG93cyBhZ2dyZWdhdGlvbiBvZiBpbmplY3Rpb25zICZqYXhycy5QYXRoUGFyYW07LCAmamF4cnMuUXVlcnlQYXJhbTsgJmpheHJzLk1hdHJpeFBhcmFtOworICAgICAgICAgICAgYW5kICZqYXhycy5IZWFkZXJQYXJhbTsgaW50byBvbmUgc2luZ2xlIGJlYW4uIFRoZSBydWxlcyBmb3IgaW5qZWN0aW9ucyBpbnNpZGUgdGhlIGJlYW4gYXJlIHRoZSBzYW1lIGFzIGRlc2NyaWJlZCBhYm92ZQorICAgICAgICAgICAgZm9yIHRoZXNlIGluamVjdGlvbnMuIFRoZSAmamF4cnMuRGVmYXVsdFZhbHVlOyBpcyB1c2VkIHRvIGRlZmluZSB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgbWF0cml4IHBhcmFtZXRlciBtYXRyaXhQYXJhbS4KKyAgICAgICAgICAgIEFsc28gdGhlICZqYXhycy5FbmNvZGVkOyBhbm5vdGF0aW9uIGhhcyB0aGUgc2FtZSBiZWhhdmlvdXIgYXMgaWYgaXQgd2VyZSB1c2VkIGZvciBpbmplY3Rpb24gaW4gdGhlIHJlc291cmNlIG1ldGhvZAorICAgICAgICAgICAgZGlyZWN0bHkuIEluamVjdGluZyB0aGUgYmVhbiBwYXJhbWV0ZXIgaW50byBAU2luZ2xldG9uIHJlc291cmNlIGNsYXNzIGZpZWxkcyBpcyBub3QgYWxsb3dlZCAoaW5qZWN0aW9ucyBpbnRvIG1ldGhvZAorICAgICAgICAgICAgcGFyYW1ldGVyIG11c3QgYmUgdXNlZCBpbnN0ZWFkKS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4mamF4cnMuQmVhblBhcmFtOyBjYW4gY29udGFpbiBhbGwgcGFyYW1ldGVycyBpbmplY3Rpb25zCisgICAgICAgICAgICAoJmpheHJzLlBhdGhQYXJhbTssICZqYXhycy5RdWVyeVBhcmFtOywgJmpheHJzLk1hdHJpeFBhcmFtOywgJmpheHJzLkhlYWRlclBhcmFtOywKKyAgICAgICAgICAgICZqYXhycy5Db29raWVQYXJhbTssICZqYXhycy5Gb3JtUGFyYW07KS4gTW9yZQorICAgICAgICAgICAgYmVhbnMgY2FuIGJlIGluamVjdGVkIGludG8gb25lIHJlc291cmNlIG9yIG1ldGhvZCBwYXJhbWV0ZXJzIGV2ZW4gaWYgdGhleSBpbmplY3QgdGhlIHNhbWUgcmVxdWVzdCB2YWx1ZXMuIEZvciBleGFtcGxlCisgICAgICAgICAgICB0aGUgZm9sbG93aW5nIGlzIHBvc3NpYmxlOgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgPHRpdGxlPkluamVjdGlvbiBvZiBtb3JlIGJlYW5zIGludG8gb25lIHJlc291cmNlIG1ldGhvZHM6PC90aXRsZT4KKworICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+QFBPU1QKK3B1YmxpYyB2b2lkIHBvc3QoQEJlYW5QYXJhbSBNeUJlYW5QYXJhbSBiZWFuUGFyYW0sIEBCZWFuUGFyYW0gQW5vdGhlckJlYW4gYW5vdGhlckJlYW4sIEBQYXRoUGFyYW0oInAiKSBwYXRoUGFyYW0sCitTdHJpbmcgZW50aXR5KSB7CisgICAgLy8gYmVhblBhcmFtLmdldFBhdGhQYXJhbSgpID09IHBhdGhQYXJhbQorICAgIC4uLgorfTwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDwvZXhhbXBsZT4KKworICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uPgorICAgICAgICA8dGl0bGU+U3ViLXJlc291cmNlczwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+JmpheHJzLlBhdGg7IG1heSBiZSB1c2VkIG9uIGNsYXNzZXMgYW5kIHN1Y2ggY2xhc3NlcyBhcmUgcmVmZXJyZWQgdG8gYXMgcm9vdCByZXNvdXJjZSBjbGFzc2VzLiAmamF4cnMuUGF0aDsKKyAgICAgICAgICAgIG1heSBhbHNvIGJlIHVzZWQgb24gbWV0aG9kcyBvZiByb290IHJlc291cmNlIGNsYXNzZXMuIFRoaXMgZW5hYmxlcyBjb21tb24gZnVuY3Rpb25hbGl0eSBmb3IgYSBudW1iZXIgb2YgcmVzb3VyY2VzCisgICAgICAgICAgICB0byBiZSBncm91cGVkIHRvZ2V0aGVyIGFuZCBwb3RlbnRpYWxseSByZXVzZWQuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT5UaGUgZmlyc3Qgd2F5ICZqYXhycy5QYXRoOyBtYXkgYmUgdXNlZCBpcyBvbiByZXNvdXJjZSBtZXRob2RzIGFuZCBzdWNoIG1ldGhvZHMgYXJlIHJlZmVycmVkIHRvIGFzCisgICAgICAgICAgICA8ZW1waGFzaXM+c3ViLXJlc291cmNlIG1ldGhvZHM8L2VtcGhhc2lzPi4gVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIHRoZSBtZXRob2Qgc2lnbmF0dXJlcyBmb3IgYSByb290CisgICAgICAgICAgICByZXNvdXJjZSBjbGFzcyBmcm9tIHRoZSBqbWFraS1iYWNrZW5kIHNhbXBsZToKKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgPHRpdGxlPlN1Yi1yZXNvdXJjZSBtZXRob2RzPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5AU2luZ2xldG9uCitAUGF0aCgiL3ByaW50ZXJzIikKK3B1YmxpYyBjbGFzcyBQcmludGVyc1Jlc291cmNlIHsKKworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoeyJhcHBsaWNhdGlvbi9qc29uIiwgImFwcGxpY2F0aW9uL3htbCJ9KQorICAgIHB1YmxpYyBXZWJSZXNvdXJjZUxpc3QgZ2V0TXlSZXNvdXJjZXMoKSB7IC4uLiB9CisKKyAgICBAR0VUIEBQYXRoKCIvbGlzdCIpCisgICAgQFByb2R1Y2VzKHsiYXBwbGljYXRpb24vanNvbiIsICJhcHBsaWNhdGlvbi94bWwifSkKKyAgICBwdWJsaWMgV2ViUmVzb3VyY2VMaXN0IGdldExpc3RPZlByaW50ZXJzKCkgeyAuLi4gfQorCisgICAgQEdFVCBAUGF0aCgiL2pNYWtpVGFibGUiKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgcHVibGljIFByaW50ZXJUYWJsZU1vZGVsIGdldFRhYmxlKCkgeyAuLi4gfQorCisgICAgQEdFVCBAUGF0aCgiL2pNYWtpVHJlZSIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9qc29uIikKKyAgICBwdWJsaWMgVHJlZU1vZGVsIGdldFRyZWUoKSB7IC4uLiB9CisKKyAgICBAR0VUIEBQYXRoKCIvaWRzL3twcmludGVyaWR9IikKKyAgICBAUHJvZHVjZXMoeyJhcHBsaWNhdGlvbi9qc29uIiwgImFwcGxpY2F0aW9uL3htbCJ9KQorICAgIHB1YmxpYyBQcmludGVyIGdldFByaW50ZXIoQFBhdGhQYXJhbSgicHJpbnRlcmlkIikgU3RyaW5nIHByaW50ZXJJZCkgeyAuLi4gfQorCisgICAgQFBVVCBAUGF0aCgiL2lkcy97cHJpbnRlcmlkfSIpCisgICAgQENvbnN1bWVzKHsiYXBwbGljYXRpb24vanNvbiIsICJhcHBsaWNhdGlvbi94bWwifSkKKyAgICBwdWJsaWMgdm9pZCBwdXRQcmludGVyKEBQYXRoUGFyYW0oInByaW50ZXJpZCIpIFN0cmluZyBwcmludGVySWQsIFByaW50ZXIgcHJpbnRlcikgeyAuLi4gfQorCisgICAgQERFTEVURSBAUGF0aCgiL2lkcy97cHJpbnRlcmlkfSIpCisgICAgcHVibGljIHZvaWQgZGVsZXRlUHJpbnRlcihAUGF0aFBhcmFtKCJwcmludGVyaWQiKSBTdHJpbmcgcHJpbnRlcklkKSB7IC4uLiB9Cit9PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPklmIHRoZSBwYXRoIG9mIHRoZSByZXF1ZXN0IFVSTCBpcyAicHJpbnRlcnMiIHRoZW4gdGhlIHJlc291cmNlIG1ldGhvZHMgbm90IGFubm90YXRlZCB3aXRoICZqYXhycy5QYXRoOworICAgICAgICAgICAgd2lsbCBiZSBzZWxlY3RlZC4gSWYgdGhlIHJlcXVlc3QgcGF0aCBvZiB0aGUgcmVxdWVzdCBVUkwgaXMgInByaW50ZXJzL2xpc3QiIHRoZW4gZmlyc3QgdGhlIHJvb3QgcmVzb3VyY2UgY2xhc3MKKyAgICAgICAgICAgIHdpbGwgYmUgbWF0Y2hlZCBhbmQgdGhlbiB0aGUgc3ViLXJlc291cmNlIG1ldGhvZHMgdGhhdCBtYXRjaCAibGlzdCIgd2lsbCBiZSBzZWxlY3RlZCwgd2hpY2ggaW4gdGhpcyBjYXNlCisgICAgICAgICAgICBpcyB0aGUgc3ViLXJlc291cmNlIG1ldGhvZDxsaXRlcmFsPmdldExpc3RPZlByaW50ZXJzPC9saXRlcmFsPi4gU28sIGluIHRoaXMgZXhhbXBsZSBoaWVyYXJjaGljYWwgbWF0Y2hpbmcKKyAgICAgICAgICAgIG9uIHRoZSBwYXRoIG9mIHRoZSByZXF1ZXN0IFVSTCBpcyBwZXJmb3JtZWQuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT5UaGUgc2Vjb25kIHdheSAmamF4cnMuUGF0aDsgbWF5IGJlIHVzZWQgaXMgb24gbWV0aG9kcworICAgICAgICAgICAgPGVtcGhhc2lzIHJvbGU9ImJvbGQiPm5vdDwvZW1waGFzaXM+CisgICAgICAgICAgICBhbm5vdGF0ZWQKKyAgICAgICAgICAgIHdpdGggcmVzb3VyY2UgbWV0aG9kIGRlc2lnbmF0b3JzIHN1Y2ggYXMgJmpheHJzLkdFVDsgb3IgJmpheHJzLlBPU1Q7LiBTdWNoIG1ldGhvZHMgYXJlIHJlZmVycmVkIHRvIGFzCisgICAgICAgICAgICA8ZW1waGFzaXM+c3ViLXJlc291cmNlIGxvY2F0b3JzPC9lbXBoYXNpcz4uIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyB0aGUgbWV0aG9kIHNpZ25hdHVyZXMgZm9yCisgICAgICAgICAgICBhIHJvb3QgcmVzb3VyY2UgY2xhc3MgYW5kIGEgcmVzb3VyY2UgY2xhc3MgZnJvbSB0aGUgb3B0aW1pc3RpYy1jb25jdXJyZW5jeSBzYW1wbGU6CisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgIDx0aXRsZT5TdWItcmVzb3VyY2UgbG9jYXRvcnM8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPkBQYXRoKCIvaXRlbSIpCitwdWJsaWMgY2xhc3MgSXRlbVJlc291cmNlIHsKKyAgICBAQ29udGV4dCBVcmlJbmZvIHVyaUluZm87CisKKyAgICBAUGF0aCgiY29udGVudCIpCisgICAgcHVibGljIEl0ZW1Db250ZW50UmVzb3VyY2UgZ2V0SXRlbUNvbnRlbnRSZXNvdXJjZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJdGVtQ29udGVudFJlc291cmNlKCk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24veG1sIikKKyAgICAgICAgcHVibGljIEl0ZW0gZ2V0KCkgeyAuLi4gfQorICAgIH0KK30KKworcHVibGljIGNsYXNzIEl0ZW1Db250ZW50UmVzb3VyY2UgeworCisgICAgQEdFVAorICAgIHB1YmxpYyBSZXNwb25zZSBnZXQoKSB7IC4uLiB9CisKKyAgICBAUFVUCisgICAgQFBhdGgoInt2ZXJzaW9ufSIpCisgICAgcHVibGljIHZvaWQgcHV0KEBQYXRoUGFyYW0oInZlcnNpb24iKSBpbnQgdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgQENvbnRleHQgSHR0cEhlYWRlcnMgaGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGluKSB7CisgICAgICAgIC4uLgorICAgIH0KK308L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+VGhlIHJvb3QgcmVzb3VyY2UgY2xhc3MKKyAgICAgICAgICAgIDxsaXRlcmFsPkl0ZW1SZXNvdXJjZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgIGNvbnRhaW5zIHRoZQorICAgICAgICAgICAgc3ViLXJlc291cmNlIGxvY2F0b3IgbWV0aG9kCisgICAgICAgICAgICA8bGl0ZXJhbD5nZXRJdGVtQ29udGVudFJlc291cmNlPC9saXRlcmFsPgorICAgICAgICAgICAgdGhhdAorICAgICAgICAgICAgcmV0dXJucyBhIG5ldyByZXNvdXJjZSBjbGFzcy4gSWYgdGhlIHBhdGggb2YgdGhlIHJlcXVlc3QgVVJMIGlzCisgICAgICAgICAgICAiaXRlbS9jb250ZW50IiB0aGVuIGZpcnN0IG9mIGFsbCB0aGUgcm9vdCByZXNvdXJjZSB3aWxsIGJlIG1hdGNoZWQsIHRoZW4KKyAgICAgICAgICAgIHRoZSBzdWItcmVzb3VyY2UgbG9jYXRvciB3aWxsIGJlIG1hdGNoZWQgYW5kIGludm9rZWQsIHdoaWNoIHJldHVybnMgYW4KKyAgICAgICAgICAgIGluc3RhbmNlIG9mIHRoZQorICAgICAgICAgICAgPGxpdGVyYWw+SXRlbUNvbnRlbnRSZXNvdXJjZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgIHJlc291cmNlIGNsYXNzLgorICAgICAgICAgICAgU3ViLXJlc291cmNlIGxvY2F0b3JzIGVuYWJsZSByZXVzZSBvZiByZXNvdXJjZSBjbGFzc2VzLiBBIG1ldGhvZCBjYW4gYmUgYW5ub3RhdGVkIHdpdGggdGhlCisgICAgICAgICAgICAmamF4cnMuUGF0aDsgYW5ub3RhdGlvbiB3aXRoIGVtcHR5IHBhdGggKDxsaXRlcmFsPkBQYXRoKCIvIik8L2xpdGVyYWw+IG9yIDxsaXRlcmFsPkBQYXRoKCIiKTwvbGl0ZXJhbD4pIHdoaWNoCisgICAgICAgICAgICBtZWFucyB0aGF0IHRoZSBzdWIgcmVzb3VyY2UgbG9jYXRvciBpcyBtYXRjaGVkIGZvciB0aGUgcGF0aCBvZiB0aGUgZW5jbG9zaW5nIHJlc291cmNlICh3aXRob3V0IHN1Yi1yZXNvdXJjZSBwYXRoKS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgIDx0aXRsZT5TdWItcmVzb3VyY2UgbG9jYXRvcnMgd2l0aCBlbXB0eSBwYXRoPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5AUGF0aCgiL2l0ZW0iKQorcHVibGljIGNsYXNzIEl0ZW1SZXNvdXJjZSB7CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIEl0ZW1Db250ZW50UmVzb3VyY2UgZ2V0SXRlbUNvbnRlbnRSZXNvdXJjZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJdGVtQ29udGVudFJlc291cmNlKCk7CisgICAgfQorfTwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT5JbiB0aGUgZXhhbXBsZSBhYm92ZSB0aGUgc3ViLXJlc291cmNlIGxvY2F0b3IgbWV0aG9kIDxsaXRlcmFsPmdldEl0ZW1Db250ZW50UmVzb3VyY2U8L2xpdGVyYWw+CisgICAgICAgICAgICBpcyBtYXRjaGVkIGZvciBleGFtcGxlIGZvciByZXF1ZXN0IHBhdGggIi9pdGVtL2xvY2F0b3IiIG9yIGV2ZW4gZm9yIG9ubHkgIi9pdGVtIi4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPkluIGFkZGl0aW9uIHRoZSBwcm9jZXNzaW5nIG9mIHJlc291cmNlIGNsYXNzZXMgcmV0dXJuZWQgYnkKKyAgICAgICAgICAgIHN1Yi1yZXNvdXJjZSBsb2NhdG9ycyBpcyBwZXJmb3JtZWQgYXQgcnVudGltZSB0aHVzIGl0IGlzIHBvc3NpYmxlIHRvCisgICAgICAgICAgICBzdXBwb3J0IHBvbHltb3JwaGlzbS4gQSBzdWItcmVzb3VyY2UgbG9jYXRvciBtYXkgcmV0dXJuIGRpZmZlcmVudAorICAgICAgICAgICAgc3ViLXR5cGVzIGRlcGVuZGluZyBvbiB0aGUgcmVxdWVzdCAoZm9yIGV4YW1wbGUgYSBzdWItcmVzb3VyY2UgbG9jYXRvcgorICAgICAgICAgICAgY291bGQgcmV0dXJuIGRpZmZlcmVudCBzdWItdHlwZXMgZGVwZW5kZW50IG9uIHRoZSByb2xlIG9mIHRoZSBwcmluY2lwbGUKKyAgICAgICAgICAgIHRoYXQgaXMgYXV0aGVudGljYXRlZCkuIFNvIGZvciBleGFtcGxlIHRoZSBmb2xsb3dpbmcgc3ViIHJlc291cmNlIGxvY2F0b3IgaXMgdmFsaWQ6CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICA8dGl0bGU+U3ViLXJlc291cmNlIGxvY2F0b3JzIHJldHVybmluZyBzdWItdHlwZTwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+QFBhdGgoIi9pdGVtIikKK3B1YmxpYyBjbGFzcyBJdGVtUmVzb3VyY2UgeworCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBPYmplY3QgZ2V0SXRlbUNvbnRlbnRSZXNvdXJjZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBbnlSZXNvdXJjZSgpOworICAgIH0KK308L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8L3BhcmE+CisKKworICAgICAgICA8cGFyYT5Ob3RlIHRoYXQgdGhlIHJ1bnRpbWUgd2lsbCBub3QgbWFuYWdlIHRoZSBsaWZlLWN5Y2xlIG9yIHBlcmZvcm0gYW55CisgICAgICAgICAgICBmaWVsZCBpbmplY3Rpb24gb250byBpbnN0YW5jZXMgcmV0dXJuZWQgZnJvbSBzdWItcmVzb3VyY2UgbG9jYXRvciBtZXRob2RzLgorICAgICAgICAgICAgVGhpcyBpcyBiZWNhdXNlIHRoZSBydW50aW1lIGRvZXMgbm90IGtub3cgd2hhdCB0aGUgbGlmZS1jeWNsZSBvZiB0aGUKKyAgICAgICAgICAgIGluc3RhbmNlIGlzLiBJZiBpdCBpcyByZXF1aXJlZCB0aGF0IHRoZSBydW50aW1lIG1hbmFnZXMgdGhlIHN1Yi1yZXNvdXJjZXMKKyAgICAgICAgICAgIGFzIHN0YW5kYXJkIHJlc291cmNlcyB0aGUgPGxpdGVyYWw+Q2xhc3M8L2xpdGVyYWw+IHNob3VsZCBiZSByZXR1cm5lZAorICAgICAgICAgICAgYXMgc2hvd24gaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgPHRpdGxlPlN1Yi1yZXNvdXJjZSBsb2NhdG9ycyBjcmVhdGVkIGZyb20gY2xhc3NlczwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+aW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK0BQYXRoKCIvaXRlbSIpCitwdWJsaWMgY2xhc3MgSXRlbVJlc291cmNlIHsKKyAgICBAUGF0aCgiY29udGVudCIpCisgICAgcHVibGljIENsYXNzJmx0O0l0ZW1Db250ZW50U2luZ2xldG9uUmVzb3VyY2UmZ3Q7IGdldEl0ZW1Db250ZW50UmVzb3VyY2UoKSB7CisgICAgICAgIHJldHVybiBJdGVtQ29udGVudFNpbmdsZXRvblJlc291cmNlLmNsYXNzOworICAgIH0KK30KKworQFNpbmdsZXRvbgorcHVibGljIGNsYXNzIEl0ZW1Db250ZW50U2luZ2xldG9uUmVzb3VyY2UgeworICAgIC8vIHRoaXMgY2xhc3MgaXMgbWFuYWdlZCBpbiB0aGUgc2luZ2xldG9uIGxpZmUgY3ljbGUKK308L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8L3BhcmE+CisKKworCisgICAgICAgIDxwYXJhPkpBWC1SUyByZXNvdXJjZXMgYXJlIG1hbmFnZWQgaW4gcGVyLXJlcXVlc3Qgc2NvcGUgYnkgZGVmYXVsdCB3aGljaCBtZWFucyB0aGF0CisgICAgICAgICAgICBuZXcgcmVzb3VyY2UgaXMgY3JlYXRlZCBmb3IgZWFjaCByZXF1ZXN0LgorICAgICAgICAgICAgSW4gdGhpcyBleGFtcGxlIHRoZSA8bGl0ZXJhbD5qYXZheC5pbmplY3QuU2luZ2xldG9uPC9saXRlcmFsPiBhbm5vdGF0aW9uIHNheXMKKyAgICAgICAgICAgIHRoYXQgdGhlIHJlc291cmNlIHdpbGwgYmUgbWFuYWdlZCBhcyBzaW5nbGV0b24gYW5kIG5vdCBpbiByZXF1ZXN0IHNjb3BlLgorICAgICAgICAgICAgVGhlIHN1Yi1yZXNvdXJjZSBsb2NhdG9yIG1ldGhvZCByZXR1cm5zIGEgY2xhc3Mgd2hpY2ggbWVhbnMgdGhhdCB0aGUgcnVudGltZQorICAgICAgICAgICAgd2lsbCBtYW5hZ2VkIHRoZSByZXNvdXJjZSBpbnN0YW5jZSBhbmQgaXRzIGxpZmUtY3ljbGUuIElmIHRoZSBtZXRob2Qgd291bGQgcmV0dXJuIGluc3RhbmNlIGluc3RlYWQsCisgICAgICAgICAgICB0aGUgPGxpdGVyYWw+U2luZ2xldG9uPC9saXRlcmFsPiBhbm5vdGF0aW9uIHdvdWxkIGhhdmUgbm8gZWZmZWN0IGFuZCB0aGUgcmV0dXJuZWQgaW5zdGFuY2UKKyAgICAgICAgICAgIHdvdWxkIGJlIHVzZWQuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT5UaGUgc3ViIHJlc291cmNlIGxvY2F0b3IgY2FuIGFsc28gcmV0dXJuIGEgPGVtcGhhc2lzPnByb2dyYW1tYXRpYyByZXNvdXJjZSBtb2RlbDwvZW1waGFzaXM+LiBTZWUgPGxpbmsKKyAgICAgICAgICAgICAgICBsaW5rZW5kPSJyZXNvdXJjZS1idWlsZGVyIj5yZXNvdXJjZSBidWlsZGVyIHNlY3Rpb248L2xpbms+IGZvciBpbmZvcm1hdGlvbiBvZiBob3cgdGhlIHByb2dyYW1tYXRpYyByZXNvdXJjZQorICAgICAgICAgICAgbW9kZWwgaXMgY29uc3RydWN0ZWQuIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyB2ZXJ5IHNpbXBsZSByZXNvdXJjZSByZXR1cm5lZCBmcm9tIHRoZSBzdWItcmVzb3VyY2UgbG9jYXRvciBtZXRob2QuCisgICAgICAgIDwvcGFyYT4KKworCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgPHRpdGxlPlN1Yi1yZXNvdXJjZSBsb2NhdG9ycyByZXR1cm5pbmcgcmVzb3VyY2UgbW9kZWw8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPmltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2U7CisKK0BQYXRoKCIvaXRlbSIpCitwdWJsaWMgY2xhc3MgSXRlbVJlc291cmNlIHsKKworICAgIEBQYXRoKCJjb250ZW50IikKKyAgICBwdWJsaWMgUmVzb3VyY2UgZ2V0SXRlbUNvbnRlbnRSZXNvdXJjZSgpIHsKKyAgICAgICAgcmV0dXJuIFJlc291cmNlLmZyb20oSXRlbUNvbnRlbnRTaW5nbGV0b25SZXNvdXJjZS5jbGFzcyk7CisgICAgfQorfTwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+VGhlIGNvZGUgYWJvdmUgaGFzIGV4YWN0bHkgdGhlIHNhbWUgZWZmZWN0IGFzIHByZXZpb3VzIGV4YW1wbGUuIDxsaXRlcmFsPlJlc291cmNlPC9saXRlcmFsPiBpcyBhIHJlc291cmNlCisgICAgICAgICAgICBzaW1wbGUgcmVzb3VyY2UgY29uc3RydWN0ZWQgZnJvbSA8bGl0ZXJhbD5JdGVtQ29udGVudFNpbmdsZXRvblJlc291cmNlPC9saXRlcmFsPi4gTW9yZSBjb21wbGV4IHByb2dyYW1tYXRpYworICAgICAgICAgICAgcmVzb3VyY2UgY2FuIGJlIHJldHVybmVkIGFzIGxvbmcgdGhleSBhcmUgdmFsaWQgcmVzb3VyY2VzLgorICAgICAgICA8L3BhcmE+CisKKyAgICA8L3NlY3Rpb24+CisKKworICAgIDxzZWN0aW9uPgorICAgICAgICA8dGl0bGU+TGlmZS1jeWNsZSBvZiBSb290IFJlc291cmNlIENsYXNzZXM8L3RpdGxlPgorCisgICAgICAgIDxwYXJhPkJ5IGRlZmF1bHQgdGhlIGxpZmUtY3ljbGUgb2Ygcm9vdCByZXNvdXJjZSBjbGFzc2VzIGlzIHBlci1yZXF1ZXN0IHdoaWNoLAorICAgICAgICAgICAgbmFtZWx5IHRoYXQgYSBuZXcgaW5zdGFuY2Ugb2YgYSByb290IHJlc291cmNlIGNsYXNzIGlzIGNyZWF0ZWQgZXZlcnkgdGltZQorICAgICAgICAgICAgdGhlIHJlcXVlc3QgVVJJIHBhdGggbWF0Y2hlcyB0aGUgcm9vdCByZXNvdXJjZS4gVGhpcyBtYWtlcyBmb3IgYSB2ZXJ5CisgICAgICAgICAgICBuYXR1cmFsIHByb2dyYW1taW5nIG1vZGVsIHdoZXJlIGNvbnN0cnVjdG9ycyBhbmQgZmllbGRzIGNhbiBiZSB1dGlsaXplZAorICAgICAgICAgICAgKGFzIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uIHNob3dpbmcgdGhlIGNvbnN0cnVjdG9yIG9mIHRoZQorICAgICAgICAgICAgPGxpdGVyYWw+U3BhcmtsaW5lc1Jlc291cmNlPC9saXRlcmFsPgorICAgICAgICAgICAgY2xhc3MpIHdpdGhvdXQgY29uY2VybiBmb3IgbXVsdGlwbGUKKyAgICAgICAgICAgIGNvbmN1cnJlbnQgcmVxdWVzdHMgdG8gdGhlIHNhbWUgcmVzb3VyY2UuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT5JbiBnZW5lcmFsIHRoaXMgaXMgdW5saWtlbHkgdG8gYmUgYSBjYXVzZSBvZiBwZXJmb3JtYW5jZSBpc3N1ZXMuCisgICAgICAgICAgICBDbGFzcyBjb25zdHJ1Y3Rpb24gYW5kIGdhcmJhZ2UgY29sbGVjdGlvbiBvZiBKVk1zIGhhcyB2YXN0bHkgaW1wcm92ZWQgb3ZlcgorICAgICAgICAgICAgdGhlIHllYXJzIGFuZCBtYW55IG9iamVjdHMgd2lsbCBiZSBjcmVhdGVkIGFuZCBkaXNjYXJkZWQgdG8gc2VydmUgYW5kCisgICAgICAgICAgICBwcm9jZXNzIHRoZSBIVFRQIHJlcXVlc3QgYW5kIHJldHVybiB0aGUgSFRUUCByZXNwb25zZS4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPkluc3RhbmNlcyBvZiBzaW5nbGV0b24gcm9vdCByZXNvdXJjZSBjbGFzc2VzIGNhbiBiZSBkZWNsYXJlZCBieSBhbiBpbnN0YW5jZSBvZiAmamF4cnMuY29yZS5BcHBsaWNhdGlvbjsuCisgICAgICAgIDwvcGFyYT4KKworCisKKyAgICAgICAgPHBhcmE+SmVyc2V5IHN1cHBvcnRzIHR3byBmdXJ0aGVyIGxpZmUtY3ljbGVzIHVzaW5nIEplcnNleSBzcGVjaWZpYyBhbm5vdGF0aW9ucy48L3BhcmE+CisKKyAgICAgICAgPHRhYmxlIGZyYW1lPSJhbGwiPgorICAgICAgICAgICAgPHRpdGxlPlJlc291cmNlIHNjb3BlczwvdGl0bGU+CisgICAgICAgICAgICA8dGdyb3VwIGNvbHM9IjQiPgorICAgICAgICAgICAgICAgIDxjb2xzcGVjIGNvbHdpZHRoPSIxKiIgLz4KKyAgICAgICAgICAgICAgICA8Y29sc3BlYyBjb2x3aWR0aD0iMSoiIC8+CisgICAgICAgICAgICAgICAgPGNvbHNwZWMgY29sd2lkdGg9IjIqIiAvPgorICAgICAgICAgICAgICAgIDxjb2xzcGVjIGNvbHdpZHRoPSI1KiIgLz4KKyAgICAgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+U2NvcGU8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PkFubm90YXRpb248L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PkFubm90YXRpb24gZnVsbCBjbGFzcyBuYW1lPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT5EZXNjcmlwdGlvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDwvdGhlYWQ+CisgICAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgICAgICA8cm93PjxlbnRyeT5SZXF1ZXN0IHNjb3BlPC9lbnRyeT48ZW50cnk+QFJlcXVlc3RTY29wZWQgKG9yIG5vbmUpPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT5vcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLmludGVybmFsLlJlcXVlc3RTY29wZWQ8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PjxlbXBoYXNpcz5EZWZhdWx0IGxpZmVjeWNsZSA8L2VtcGhhc2lzPiAoYXBwbGllZCB3aGVuIG5vIGFubm90YXRpb24gaXMgcHJlc2VudCkuIEluIHRoaXMgc2NvcGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgcmVzb3VyY2UgaW5zdGFuY2UgaXMgY3JlYXRlZCBmb3IgZWFjaCBuZXcgcmVxdWVzdCBhbmQgdXNlZCBmb3IgcHJvY2Vzc2luZyBvZiB0aGlzIHJlcXVlc3QuIElmIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlIGlzIHVzZWQgbW9yZSB0aGFuIG9uZSB0aW1lIGluIHRoZSByZXF1ZXN0IHByb2Nlc3NpbmcsIGFsd2F5cyB0aGUgc2FtZSBpbnN0YW5jZSB3aWxsIGJlIHVzZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBjYW4gaGFwcGVuIHdoZW4gYSByZXNvdXJjZSBpcyBhIHN1YiByZXNvdXJjZSBhbmQgaXMgcmV0dXJuZWQgbW9yZSB0aW1lcyBkdXJpbmcgdGhlIG1hdGNoaW5nLiBJbiB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l0dWF0aW9uIG9ubHkgb25lIGluc3RhbmNlIHdpbGwgc2VydmUgdGhlIHJlcXVlc3RzLjwvZW50cnk+PC9yb3c+CisgICAgICAgICAgICAgICAgICAgIDxyb3c+PGVudHJ5PlBlci1sb29rdXAgc2NvcGU8L2VudHJ5PjxlbnRyeT5AUGVyTG9va3VwPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT5vcmcuZ2xhc3NmaXNoLmhrMi5hcGkuUGVyTG9va3VwPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT5JbiB0aGlzIHNjb3BlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJlc291cmNlIGluc3RhbmNlIGlzIGNyZWF0ZWQgZXZlcnkgdGltZSBpdCBpcyBuZWVkZWQgZm9yIHRoZSBwcm9jZXNzaW5nIGV2ZW4gaXQgaGFuZGxlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzYW1lIHJlcXVlc3QuPC9lbnRyeT48L3Jvdz4KKyAgICAgICAgICAgICAgICAgICAgPHJvdz48ZW50cnk+U2luZ2xldG9uPC9lbnRyeT48ZW50cnk+QFNpbmdsZXRvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+amF2YXguaW5qZWN0LlNpbmdsZXRvbjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+SW4gdGhpcyBzY29wZSB0aGVyZSBpcyBvbmx5IG9uZSBpbnN0YW5jZSBwZXIgamF4LXJzIGFwcGxpY2F0aW9uLiBTaW5nbGV0b24gcmVzb3VyY2UgY2FuIGJlIGVpdGhlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRlZCB3aXRoIEBTaW5nbGV0b24gYW5kIGl0cyBjbGFzcyBjYW4gYmUgcmVnaXN0ZXJlZCB1c2luZyB0aGUgaW5zdGFuY2Ugb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmamF4cnMuY29yZS5BcHBsaWNhdGlvbjsuIFlvdSBjYW4gYWxzbyBjcmVhdGUgc2luZ2xldG9ucyBieSByZWdpc3RlcmluZyBzaW5nbGV0b24gaW5zdGFuY2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50byAmamF4cnMuY29yZS5BcHBsaWNhdGlvbjsuPC9lbnRyeT48L3Jvdz4KKyAgICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgIDwvdGFibGU+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24+CisgICAgICAgIDx0aXRsZT5SdWxlcyBvZiBJbmplY3Rpb248L3RpdGxlPgorCisgICAgICAgIDxwYXJhPlByZXZpb3VzIHNlY3Rpb25zIGhhdmUgcHJlc2VudGVkIGV4YW1wbGVzIG9mIGFubm90YXRlZCB0eXBlcywgbW9zdGx5CisgICAgICAgICAgICBhbm5vdGF0ZWQgbWV0aG9kIHBhcmFtZXRlcnMgYnV0IGFsc28gYW5ub3RhdGVkIGZpZWxkcyBvZiBhIGNsYXNzLCBmb3IgdGhlCisgICAgICAgICAgICBpbmplY3Rpb24gb2YgdmFsdWVzIG9udG8gdGhvc2UgdHlwZXMuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT5UaGlzIHNlY3Rpb24gcHJlc2VudHMgdGhlIHJ1bGVzIG9mIGluamVjdGlvbiBvZiB2YWx1ZXMgb24gYW5ub3RhdGVkCisgICAgICAgICAgICB0eXBlcy4gSW5qZWN0aW9uIGNhbiBiZSBwZXJmb3JtZWQgb24gZmllbGRzLCBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzLAorICAgICAgICAgICAgcmVzb3VyY2Uvc3ViLXJlc291cmNlL3N1Yi1yZXNvdXJjZSBsb2NhdG9yIG1ldGhvZCBwYXJhbWV0ZXJzIGFuZCBiZWFuCisgICAgICAgICAgICBzZXR0ZXIgbWV0aG9kcy4gVGhlIGZvbGxvd2luZyBwcmVzZW50cyBhbiBleGFtcGxlIG9mIGFsbCBzdWNoIGluamVjdGlvbgorICAgICAgICAgICAgY2FzZXM6CisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgIDx0aXRsZT5JbmplY3Rpb248L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPkBQYXRoKCJ7aWQ6XFxkK30iKQorcHVibGljIGNsYXNzIEluamVjdGVkUmVzb3VyY2UgeworICAgIC8vIEluamVjdGlvbiBvbnRvIGZpZWxkCisgICAgQERlZmF1bHRWYWx1ZSgicSIpIEBRdWVyeVBhcmFtKCJwIikKKyAgICBwcml2YXRlIFN0cmluZyBwOworCisgICAgLy8gSW5qZWN0aW9uIG9udG8gY29uc3RydWN0b3IgcGFyYW1ldGVyCisgICAgcHVibGljIEluamVjdGVkUmVzb3VyY2UoQFBhdGhQYXJhbSgiaWQiKSBpbnQgaWQpIHsgLi4uIH0KKworICAgIC8vIEluamVjdGlvbiBvbnRvIHJlc291cmNlIG1ldGhvZCBwYXJhbWV0ZXIKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBnZXQoQENvbnRleHQgVXJpSW5mbyB1aSkgeyAuLi4gfQorCisgICAgLy8gSW5qZWN0aW9uIG9udG8gc3ViLXJlc291cmNlIHJlc291cmNlIG1ldGhvZCBwYXJhbWV0ZXIKKyAgICBAUGF0aCgic3ViLWlkIikKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBnZXQoQFBhdGhQYXJhbSgic3ViLWlkIikgU3RyaW5nIGlkKSB7IC4uLiB9CisKKyAgICAvLyBJbmplY3Rpb24gb250byBzdWItcmVzb3VyY2UgbG9jYXRvciBtZXRob2QgcGFyYW1ldGVyCisgICAgQFBhdGgoInN1Yi1pZCIpCisgICAgcHVibGljIFN1YlJlc291cmNlIGdldFN1YlJlc291cmNlKEBQYXRoUGFyYW0oInN1Yi1pZCIpIFN0cmluZyBpZCkgeyAuLi4gfQorCisgICAgLy8gSW5qZWN0aW9uIHVzaW5nIGJlYW4gc2V0dGVyIG1ldGhvZAorICAgIEBIZWFkZXJQYXJhbSgiWC1oZWFkZXIiKQorICAgIHB1YmxpYyB2b2lkIHNldEhlYWRlcihTdHJpbmcgaGVhZGVyKSB7IC4uLiB9Cit9PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPlRoZXJlIGFyZSBzb21lIHJlc3RyaWN0aW9ucyB3aGVuIGluamVjdGluZyBvbiB0byByZXNvdXJjZSBjbGFzc2VzCisgICAgICAgICAgICB3aXRoIGEgbGlmZS1jeWNsZSBvZiBzaW5nbGV0b24gc2NvcGUuIEluIHN1Y2ggY2FzZXMgdGhlIGNsYXNzIGZpZWxkcyBvcgorICAgICAgICAgICAgY29uc3RydWN0b3IgcGFyYW1ldGVycyBjYW5ub3QgYmUgaW5qZWN0ZWQgd2l0aCByZXF1ZXN0IHNwZWNpZmljIHBhcmFtZXRlcnMuIFNvLCBmb3IgZXhhbXBsZQorICAgICAgICAgICAgdGhlIGZvbGxvd2luZyBpcyBub3QgYWxsb3dlZC48L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICA8dGl0bGU+V3JvbmcgaW5qZWN0aW9uIGludG8gYSBzaW5nbGV0b24gc2NvcGU8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPkBQYXRoKCJyZXNvdXJjZSIpCitAU2luZ2xldG9uCitwdWJsaWMgc3RhdGljIGNsYXNzIE15U2luZ2xldG9uUmVzb3VyY2UgeworCisgICAgQFF1ZXJ5UGFyYW0oInF1ZXJ5IikKKyAgICBTdHJpbmcgcGFyYW07IC8vIFdST05HOiBpbml0aWFsaXphdGlvbiBvZiBhcHBsaWNhdGlvbiB3aWxsIGZhaWwgYXMgeW91IGNhbm5vdAorICAgICAgICAgICAgICAgICAgLy8gaW5qZWN0IHJlcXVlc3Qgc3BlY2lmaWMgcGFyYW1ldGVycyBpbnRvIGEgc2luZ2xldG9uIHJlc291cmNlLgorCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICByZXR1cm4gInF1ZXJ5IHBhcmFtOiAiICsgcGFyYW07CisgICAgfQorfTwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaGUgZXhhbXBsZSBhYm92ZSB3aWxsIGNhdXNlIHZhbGlkYXRpb24gZmFpbHVyZSBkdXJpbmcgYXBwbGljYXRpb24gaW5pdGlhbGl6YXRpb24gYXMgc2luZ2xldG9uCisgICAgICAgICAgICByZXNvdXJjZXMgY2Fubm90IGluamVjdCByZXF1ZXN0IHNwZWNpZmljIHBhcmFtZXRlcnMuIFRoZSBzYW1lIGV4YW1wbGUgd291bGQgZmFpbCBpZiB0aGUgcXVlcnkKKyAgICAgICAgICAgIHBhcmFtZXRlciB3b3VsZCBiZSBpbmplY3RlZCBpbnRvIGNvbnN0cnVjdG9yIHBhcmFtZXRlciBvZiBzdWNoIGEgc2luZ2xldG9uLiBJbiBvdGhlciB3b3JkcywgaWYgeW91CisgICAgICAgICAgICB3aXNoIG9uZSByZXNvdXJjZSBpbnN0YW5jZSB0byBzZXJ2ZXIgbW9yZSByZXF1ZXN0cyAoaW4gdGhlIHNhbWUgdGltZSkgaXQgY2Fubm90IGJlIGJvdW5kCisgICAgICAgICAgICB0byBhIHNwZWNpZmljIHJlcXVlc3QgcGFyYW1ldGVyLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhlIGV4Y2VwdGlvbiBleGlzdHMgZm9yIHNwZWNpZmljIHJlcXVlc3Qgb2JqZWN0cyB3aGljaCBjYW4gaW5qZWN0ZWQgZXZlbiBpbnRvCisgICAgICAgICAgICBjb25zdHJ1Y3RvciBvciBjbGFzcyBmaWVsZHMuIEZvciB0aGVzZSBvYmplY3RzIHRoZSBydW50aW1lIHdpbGwgaW5qZWN0IHByb3hpZXMKKyAgICAgICAgICAgIHdoaWNoIGFyZSBhYmxlIHRvIHNpbXVsdGFuZW91c2x5IHNlcnZlciBtb3JlIHJlcXVlc3QuIFRoZXNlIHJlcXVlc3Qgb2JqZWN0cyBhcmUKKyAgICAgICAgICAgIDxsaXRlcmFsPkh0dHBIZWFkZXJzPC9saXRlcmFsPiwgPGxpdGVyYWw+UmVxdWVzdDwvbGl0ZXJhbD4sIDxsaXRlcmFsPlVyaUluZm88L2xpdGVyYWw+LAorICAgICAgICAgICAgPGxpdGVyYWw+U2VjdXJpdHlDb250ZXh0PC9saXRlcmFsPi4gVGhlc2UgcHJveGllcyBjYW4gYmUgaW5qZWN0ZWQgdXNpbmcgdGhlICZqYXhycy5jb3JlLkNvbnRleHQ7CisgICAgICAgICAgICBhbm5vdGF0aW9uLiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaW5qZWN0aW9uIG9mIHByb3hpZXMgaW50byB0aGUgc2luZ2xldG9uIHJlc291cmNlIGNsYXNzLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICA8dGl0bGU+SW5qZWN0aW9uIG9mIHByb3hpZXMgaW50byBzaW5nbGV0b248L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPkBQYXRoKCJyZXNvdXJjZSIpCitAU2luZ2xldG9uCitwdWJsaWMgc3RhdGljIGNsYXNzIE15U2luZ2xldG9uUmVzb3VyY2UgeworICAgIEBDb250ZXh0CisgICAgUmVxdWVzdCByZXF1ZXN0OyAvLyB0aGlzIGlzIG9rOiB0aGUgcHJveHkgb2YgUmVxdWVzdCB3aWxsIGJlIGluamVjdGVkIGludG8gdGhpcyBzaW5nbGV0b24KKworICAgIHB1YmxpYyBNeVNpbmdsZXRvblJlc291cmNlKEBDb250ZXh0IFNlY3VyaXR5Q29udGV4dCBzZWN1cml0eUNvbnRleHQpIHsKKyAgICAgICAgLy8gdGhpcyBpcyBvayB0b286IHRoZSBwcm94eSBvZiBTZWN1cml0eUNvbnRleHQgd2lsbCBiZSBpbmplY3RlZAorICAgIH0KKworICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgcmV0dXJuICJxdWVyeSBwYXJhbTogIiArIHBhcmFtOworICAgIH0KK308L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUbyBzdW1tYXJpemUgdGhlIGluamVjdGlvbiBjYW4gYmUgZG9uZSBpbnRvIHRoZSBmb2xsb3dpbmcgY29uc3RydWN0czoKKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8dGFibGUgZnJhbWU9ImFsbCI+CisgICAgICAgICAgICA8dGl0bGU+T3ZlcnZpZXcgb2YgaW5qZWN0aW9uIHR5cGVzPC90aXRsZT4KKyAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMiI+CisgICAgICAgICAgICAgICAgPGNvbHNwZWMgY29sd2lkdGg9IjEqIiAvPgorICAgICAgICAgICAgICAgIDxjb2xzcGVjIGNvbHdpZHRoPSI1KiIgLz4KKyAgICAgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+SmF2YSBjb25zdHJ1Y3Q8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PkRlc2NyaXB0aW9uPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+Q2xhc3MgZmllbGRzPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmplY3QgdmFsdWUgZGlyZWN0bHkgaW50byB0aGUgZmllbGQgb2YgdGhlIGNsYXNzLiBUaGUgZmllbGQgY2FuIGJlIHByaXZhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgbXVzdCBub3QgYmUgZmluYWwuIENhbm5vdCBiZSB1c2VkIGluIFNpbmdsZXRvbiBzY29wZSBleGNlcHQgcHJveGlhYmxlIHR5cGVzIG1lbnRpb25lZCBhYm92ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PkNvbnN0cnVjdG9yIHBhcmFtZXRlcnM8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBjb25zdHJ1Y3RvciB3aWxsIGJlIGludm9rZWQgd2l0aCBpbmplY3RlZCB2YWx1ZXMuIElmIG1vcmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcnMgZXhpc3RzIHRoZSBvbmUgd2l0aCB0aGUgbW9zdCBpbmplY3RhYmxlIHBhcmFtZXRlcnMgd2lsbCBiZSBpbnZva2VkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbm5vdCBiZSB1c2VkIGluIFNpbmdsZXRvbiBzY29wZSBleGNlcHQgcHJveGlhYmxlIHR5cGVzIG1lbnRpb25lZCBhYm92ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PlJlc291cmNlIG1ldGhvZHM8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSByZXNvdXJjZSBtZXRob2RzICh0aGVzZSBhbm5vdGF0ZWQgd2l0aCBAR0VULCBAUE9TVCwgLi4uKSBjYW4gY29udGFpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgaW5qZWN0ZWQgd2hlbiB0aGUgcmVzb3VyY2UgbWV0aG9kIGlzIGV4ZWN1dGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbiBiZSB1c2VkIGluIGFueSBzY29wZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PlN1YiByZXNvdXJjZSBsb2NhdG9yczwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHN1YiByZXNvdXJjZSBsb2NhdG9ycyAobWV0aG9kcyBhbm5vdGF0ZWQgd2l0aCBAUGF0aCBidXQgbm90IEBHRVQsIEBQT1NULCAuLi4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuIGNvbnRhaW4gcGFyYW1ldGVycyB0aGF0IGNhbiBiZSBpbmplY3RlZCB3aGVuIHRoZSByZXNvdXJjZSBtZXRob2QgaXMgZXhlY3V0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FuIGJlIHVzZWQgaW4gYW55IHNjb3BlLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+U2V0dGVyIG1ldGhvZHM8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RlYWQgb2YgaW5qZWN0aW5nIHZhbHVlcyBkaXJlY3RseSBpbnRvIGZpZWxkIHRoZSB2YWx1ZSBjYW4gYmUgaW5qZWN0ZWQgaW50byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0ZXIgbWV0aG9kIHdoaWNoIHdpbGwgaW5pdGlhbGl6ZSB0aGUgZmllbGQuIFRoaXMgaW5qZWN0aW9uIGNhbiBiZSB1c2VkIG9ubHkgd2l0aCAmamF4cnMuY29yZS5Db250ZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb24uIFRoaXMgbWVhbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCBjYW5ub3QgYmUgdXNlZCBmb3IgZXhhbXBsZSBmb3IgaW5qZWN0aW5nIG9mIHF1ZXJ5IHBhcmFtcyBidXQgaXQgY2FuIGJlIHVzZWQgZm9yIGluamVjdGlvbnMgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LiBUaGUgc2V0dGVycyB3aWxsIGJlIGNhbGxlZCBhZnRlciB0aGUgb2JqZWN0IGNyZWF0aW9uIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9ubHkgb25jZS4gVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBkb2VzIG5vdCBuZWNlc3NhcnkgaGF2ZSBhIHNldHRlciBwYXR0ZXJuLiBDYW5ub3QgYmUgdXNlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluIFNpbmdsZXRvbiBzY29wZSBleGNlcHQgcHJveGlhYmxlIHR5cGVzIG1lbnRpb25lZCBhYm92ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgPC90YWJsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBhbGwgcG9zc2libGUgamF2YSBjb25zdHJ1Y3RzIGludG8gd2hpY2ggdGhlIHZhbHVlcyBjYW4gYmUgaW5qZWN0ZWQuCisKKyAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgIDx0aXRsZT5FeGFtcGxlIG9mIHBvc3NpYmxlIGluamVjdGlvbnM8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPkBQYXRoKCJyZXNvdXJjZSIpCitwdWJsaWMgc3RhdGljIGNsYXNzIFN1bW1hcnlPZkluamVjdGlvbnNSZXNvdXJjZSB7CisgICAgQFF1ZXJ5UGFyYW0oInF1ZXJ5IikKKyAgICBTdHJpbmcgcGFyYW07IC8vIGluamVjdGlvbiBpbnRvIGEgY2xhc3MgZmllbGQKKworCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KEBRdWVyeVBhcmFtKCJxdWVyeSIpIFN0cmluZyBtZXRob2RRdWVyeVBhcmFtKSB7CisgICAgICAgIC8vIGluamVjdGlvbiBpbnRvIGEgcmVzb3VyY2UgbWV0aG9kIHBhcmFtZXRlcgorICAgICAgICByZXR1cm4gInF1ZXJ5IHBhcmFtOiAiICsgcGFyYW07CisgICAgfQorCisgICAgQFBhdGgoInN1Yi1yZXNvdXJjZS1sb2NhdG9yIikKKyAgICBwdWJsaWMgQ2xhc3MmbHQ7U3ViUmVzb3VyY2UmZ3Q7IHN1YlJlc291cmNlTG9jYXRvcihAUXVlcnlQYXJhbSgicXVlcnkiKSBTdHJpbmcgc3ViUmVzb3VyY2VRdWVyeVBhcmFtKSB7CisgICAgICAgIC8vIGluamVjdGlvbiBpbnRvIGEgc3ViIHJlc291cmNlIGxvY2F0b3IgcGFyYW1ldGVyCisgICAgICAgIHJldHVybiBTdWJSZXNvdXJjZS5jbGFzczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3VtbWFyeU9mSW5qZWN0aW9uc1Jlc291cmNlKEBRdWVyeVBhcmFtKCJxdWVyeSIpIFN0cmluZyBjb25zdHJ1Y3RvclF1ZXJ5UGFyYW0pIHsKKyAgICAgICAgLy8gaW5qZWN0aW9uIGludG8gYSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIKKyAgICB9CisKKworICAgIEBDb250ZXh0CisgICAgcHVibGljIHZvaWQgc2V0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgLy8gaW5qZWN0aW9uIGludG8gYSBzZXR0ZXIgbWV0aG9kCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZXF1ZXN0ICE9IG51bGwpOworICAgIH0KK30KKworcHVibGljIHN0YXRpYyBjbGFzcyBTdWJSZXNvdXJjZSB7CisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICByZXR1cm4gInN1YiByZXNvdXJjZSI7CisgICAgfQorfTwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDwvcGFyYT4KKworCisgICAgICAgIDxwYXJhPlRoZSAmamF4cnMuRm9ybVBhcmFtOyBhbm5vdGF0aW9uIGlzIHNwZWNpYWwgYW5kIG1heSBvbmx5IGJlIHV0aWxpemVkIG9uIHJlc291cmNlIGFuZCBzdWItcmVzb3VyY2UgbWV0aG9kcy4KKyAgICAgICAgICAgIFRoaXMgaXMgYmVjYXVzZSBpdCBleHRyYWN0cyBpbmZvcm1hdGlvbiBmcm9tIGEgcmVxdWVzdCBlbnRpdHkuCisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbj4KKyAgICAgICAgPHRpdGxlPlVzZSBvZiBAQ29udGV4dDwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+UHJldmlvdXMgc2VjdGlvbnMgaGF2ZSBpbnRyb2R1Y2VkIHRoZSB1c2Ugb2YgJmpheHJzLmNvcmUuQ29udGV4dDsuIENoYXB0ZXIgIkNvbnRleHQiIGluIHRoZSBKQVgtUlMKKyAgICAgICAgICAgIHNwZWNpZmljYXRpb24gcHJlc2VudHMgYWxsIHRoZSBzdGFuZGFyZCBKQVgtUlMgSmF2YSB0eXBlcyB0aGF0IG1heSBiZSB1c2VkIHdpdGggJmpheHJzLmNvcmUuQ29udGV4dDsuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT5XaGVuIGRlcGxveWluZyBhIEpBWC1SUyBhcHBsaWNhdGlvbiB1c2luZyBzZXJ2bGV0IHRoZW4KKyAgICAgICAgICAgIDxsaW5rIHhsaW5rOmhyZWY9Imh0dHA6Ly9kb2NzLm9yYWNsZS5jb20vamF2YWVlLzUvYXBpL2phdmF4L3NlcnZsZXQvU2VydmxldENvbmZpZy5odG1sIj5TZXJ2bGV0Q29uZmlnPC9saW5rPiwKKyAgICAgICAgICAgIDxsaW5rIHhsaW5rOmhyZWY9Imh0dHA6Ly9kb2NzLm9yYWNsZS5jb20vamF2YWVlLzUvYXBpL2phdmF4L3NlcnZsZXQvU2VydmxldENvbnRleHQuaHRtbCI+U2VydmxldENvbnRleHQ8L2xpbms+LAorICAgICAgICAgICAgPGxpbmsgeGxpbms6aHJlZj0iaHR0cDovL2RvY3Mub3JhY2xlLmNvbS9qYXZhZWUvNS9hcGkvamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVxdWVzdC5odG1sIj5IdHRwU2VydmxldFJlcXVlc3Q8L2xpbms+CisgICAgICAgICAgICBhbmQKKyAgICAgICAgICAgIDxsaW5rIHhsaW5rOmhyZWY9Imh0dHA6Ly9kb2NzLm9yYWNsZS5jb20vamF2YWVlLzUvYXBpL2phdmF4L3NlcnZsZXQvaHR0cC9IdHRwU2VydmxldFJlc3BvbnNlLmh0bWwiPkh0dHBTZXJ2bGV0UmVzcG9uc2U8L2xpbms+CisgICAgICAgICAgICBhcmUgYXZhaWxhYmxlIHVzaW5nICZqYXhycy5jb3JlLkNvbnRleHQ7LgorICAgICAgICA8L3BhcmE+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24+CisgICAgICAgIDx0aXRsZT5Qcm9ncmFtbWF0aWMgcmVzb3VyY2UgbW9kZWw8L3RpdGxlPgorCisgICAgICAgIDxwYXJhPlJlc291cmNlcyBjYW4gYmUgY29uc3RydWN0ZWQgZnJvbSBjbGFzc2VzIG9yIGluc3RhbmNlcyBidXQgYWxzbyBjYW4gYmUgY29uc3RydWN0ZWQgZnJvbSBhIHByb2dyYW1tYXRpYyByZXNvdXJjZQorICAgICAgICAgICAgbW9kZWwuIEV2ZXJ5IHJlc291cmNlIGNyZWF0ZWQgZnJvbSByZXNvdXJjZSBjbGFzc2VzIGNhbiBhbHNvCisgICAgICAgICAgICBiZSBjb25zdHJ1Y3RlZCB1c2luZyB0aGUgcHJvZ3JhbW1hdGljIHJlc291cmNlIGJ1aWxkZXIgYXBpLiBTZWUgPGxpbmsKKyAgICAgICAgICAgICAgICAgICAgbGlua2VuZD0icmVzb3VyY2UtYnVpbGRlciI+cmVzb3VyY2UgYnVpbGRlciBzZWN0aW9uPC9saW5rPiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKworPC9jaGFwdGVyPgpkaWZmIC0tZ2l0IGEvZG9jcy9zcmMvbWFpbi9kb2Nib29rL2plcnNleS5lbnQgYi9kb2NzL3NyYy9tYWluL2RvY2Jvb2svamVyc2V5LmVudApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2ZkZWFiCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9zcmMvbWFpbi9kb2Nib29rL2plcnNleS5lbnQKQEAgLTAsMCArMSwxMDM1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJpc28tODg1OS0xIiA/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzwhLS0gU3BlY2lhbCBjaGFyYWN0ZXJzIC0tPgorPCFFTlRJVFkgbmJzcCAiJiMxNjA7Ij4KKworPCEtLSBWZXJzaW9uICYgRXh0ZXJuYWxseSBjb25maWd1cmVkIGVudGl0aWVzIC0tPgorPCFFTlRJVFkgYXBpZG9jcy52ZXJzaW9uICIkYXBpZG9jcy52ZXJzaW9uIj4KKzwhRU5USVRZIGRvY3MudmVyc2lvbiAiJGRvY3MudmVyc2lvbiI+Cis8IUVOVElUWSBleHBlcmltZW50YWxyZXBvc2l0b3J5ICJzbmFwc2hvdHMiPgorPCFFTlRJVFkgZ3VhdmEudmVyc2lvbiAiJGd1YXZhLXZlcnNpb24iPgorPCFFTlRJVFkgamF4Yi1hcGktamFyLnZlcnNpb24gIiRqYXhiLWFwaS1qYXItdmVyc2lvbiI+Cis8IUVOVElUWSBqYXgtcnMudmVyc2lvbiAiJGpheC1ycy1hcGktamFyLXZlcnNpb24iPgorPCFFTlRJVFkgamF2YXgtZWwudmVyc2lvbiAiJGphdmF4LWVsLXZlcnNpb24iPgorPCFFTlRJVFkgamF2YXgtZWwtaW1wbC52ZXJzaW9uICIkamF2YXgtZWwtaW1wbC12ZXJzaW9uIj4KKzwhRU5USVRZIGpheC1ycy1hcGktamFyLnZlcnNpb24gIiRqYXgtcnMtYXBpLWphci12ZXJzaW9uIj4KKzwhRU5USVRZIGphY2tzb24uamF2YWRvYy52ZXJzaW9uICIkamFja3Nvbi12ZXJzaW9uIj4KKzwhLS0gdGVtcG9yYXJ5IGhhcmRjb2RlZCBqYXZhZG9jIHZlcnNpb24gLSB0aGUgY29ycmVjdCBvbmUgaXMgbWlzc2luZyBhdCB0aGUgcHJvdmlkZXIncyB3ZWIgLS0+Cis8IUVOVElUWSBqYWNrc29uLmphdmFkb2MudGVtcC52ZXJzaW9uICIyLjMuMCI+Cis8IUVOVElUWSByZXBvc2l0b3J5ICIkcmVwb3NpdG9yeSI+Cis8IUVOVElUWSBzcmMuYnJhbmNoICIkc3JjLmJyYW5jaCI+Cis8IUVOVElUWSB2ZXJzaW9uICIkdmVyc2lvbiI+CisKKzwhLS0gRXh0ZXJuYWwgUGF0aCBhbmQgTGluayBCYXNlIEVudGl0aWVzIC0tPgorCis8IUVOVElUWSBidi5wcm9qZWN0LmxpbmsgIjxsaW5rIHhsaW5rOmhyZWY9J2h0dHA6Ly9iZWFudmFsaWRhdGlvbi5vcmcvJz5CZWFuIFZhbGlkYXRpb248L2xpbms+Ij4KKzwhRU5USVRZIGJ2MTEuamF2YWRvYy51cmkgImh0dHA6Ly9kb2NzLmpib3NzLm9yZy9oaWJlcm5hdGUvYmVhbnZhbGlkYXRpb24vc3BlYy8xLjEvYXBpIj4KKzwhRU5USVRZIGNsb3VkLmd1aWRlICI8bGluayB4bGluazpocmVmPSdodHRwOi8vZG9jcy5vcmFjbGUuY29tL2Nsb3VkLzEzMS9kZXZlbG9wZXJfc2VydmljZXMvQ1NKU1UvamF2YS1kZXZlbG9wLmh0bSNCQUJIREFKSCc+Z3VpZGU8L2xpbms+Ij4KKzwhRU5USVRZIGZlbGl4LmxpbmsgIjxsaW5rIHhsaW5rOmhyZWY9J2h0dHA6Ly9mZWxpeC5hcGFjaGUub3JnL3NpdGUvaW5kZXguaHRtbCc+QXBhY2hlIEZlbGl4PC9saW5rPiI+Cis8IUVOVElUWSBncml6emx5LmxpbmsgIjxsaW5rIHhsaW5rOmhyZWY9J2h0dHA6Ly9ncml6emx5LmphdmEubmV0Lyc+R3JpenpseTwvbGluaz4iPgorPCFFTlRJVFkgZ3VhdmEuamF2YWRvYy51cmkgImh0dHA6Ly9kb2NzLmd1YXZhLWxpYnJhcmllcy5nb29nbGVjb2RlLmNvbS9naXQtaGlzdG9yeS92Jmd1YXZhLnZlcnNpb247L2phdmFkb2MvIj4KKzwhRU5USVRZIGd1YXZhLmxpbmsgIjxsaW5rIHhsaW5rOmhyZWY9J2h0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ3VhdmEtbGlicmFyaWVzLyc+R3VhdmE8L2xpbms+Ij4KKzwhRU5USVRZIGhlcm9rdS51cmkgImh0dHBzOi8vd3d3Lmhlcm9rdS5jb20iPgorPCFFTlRJVFkgaGVyb2t1LmxpbmsgIjxsaW5rIHhsaW5rOmhyZWY9JyZoZXJva3UudXJpOyc+SGVyb2t1PC9saW5rPiI+Cis8IUVOVElUWSBoazIuamF2YWRvYy51cmkgImh0dHBzOi8vaGsyLmphdmEubmV0L2FwaWRvY3MiPgorPCFFTlRJVFkgaGsyLmxpbmsgIjxsaW5rIHhsaW5rOmhyZWY9J2h0dHA6Ly9oazIuamF2YS5uZXQvJz5ISzI8L2xpbms+Ij4KKzwhRU5USVRZIGhrMi5zcHJpbmctYnJpZGdlLmxpbmsgIjxsaW5rIHhsaW5rOmhyZWY9J2h0dHBzOi8vaGsyLmphdmEubmV0L3NwcmluZy1icmlkZ2UvJz5UaGUgU3ByaW5nL0hLMiBCcmlkZ2U8L2xpbms+Ij4KKzwhRU5USVRZIGpheGIucmVsZWFzZS51cmkgImh0dHA6Ly9qYXhiLmphdmEubmV0L25vbmF2LyZqYXhiLWFwaS1qYXIudmVyc2lvbjsiPgorPCFFTlRJVFkgamF4Yi5qYXZhZG9jLnVyaSAiJmpheGIucmVsZWFzZS51cmk7L2RvY3MvYXBpL2phdmF4L3htbC9iaW5kIj4KKzwhRU5USVRZIGpheHJzLnJlbGVhc2UudXJpICJodHRwOi8vamF4LXJzLXNwZWMuamF2YS5uZXQvbm9uYXYvJmpheC1ycy52ZXJzaW9uOyI+Cis8IUVOVElUWSBqYXhycy5qYXZhZG9jLnVyaSAiaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL2FwaWRvY3MtamF2YXguamF4LXJzLyZqYXgtcnMudmVyc2lvbjsvamF2YXgvd3MvcnMiPgorPCFFTlRJVFkgamF4cnMyMS5qYXZhZG9jLnVyaSAiIy9qYXZheC93cy9ycyI+ICAgPCEtLSBUT0RPIC0gb25jZSB3ZSBoYXZlIHB1Ymxpc2hlZCBqYXZhZG9jcyB0byBsaW5rIGhlcmUgLS0+CisKKzwhRU5USVRZIGplcnNleS5leHQuYmVhbi12YWxpZGF0aW9uLmRlcHMubGluayAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5wcm9qZWN0LWluZm8udXJpLnByZWZpeDsvamVyc2V5LWJlYW4tdmFsaWRhdGlvbi9kZXBlbmRlbmNpZXMuaHRtbCc+amVyc2V5LWJlYW4tdmFsaWRhdGlvbjwvbGluaz4iID4KKzwhRU5USVRZIGplcnNleS5leHQuZGVjbGFyYXRpdmUtbGlua2luZy5kZXBzLmxpbmsgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkucHJvamVjdC1pbmZvLnVyaS5wcmVmaXg7L2plcnNleS1kZWNsYXJhdGl2ZS1saW5raW5nL2RlcGVuZGVuY2llcy5odG1sJz5qZXJzZXktZGVjbGFyYXRpdmUtbGlua2luZzwvbGluaz4iID4KKzwhRU5USVRZIGplcnNleS5leHQuZW50aXR5LWZpbHRlcmluZy5kZXBzLmxpbmsgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkucHJvamVjdC1pbmZvLnVyaS5wcmVmaXg7L2plcnNleS1lbnRpdHktZmlsdGVyaW5nL2RlcGVuZGVuY2llcy5odG1sJz5qZXJzZXktZW50aXR5LWZpbHRlcmluZzwvbGluaz4iID4KKzwhRU5USVRZIGplcnNleS5leHQucngtY2xpZW50Lmd1YXZhLmRlcHMubGluayAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5wcm9qZWN0LWluZm8udXJpLnByZWZpeDsvcHJvamVjdC9qZXJzZXktcngtY2xpZW50LWd1YXZhL2RlcGVuZGVuY2llcy5odG1sJz5qZXJzZXktcngtY2xpZW50LWd1YXZhPC9saW5rPiIgPgorPCFFTlRJVFkgamVyc2V5LmV4dC5yeC1jbGllbnQucnhqYXZhLmRlcHMubGluayAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5wcm9qZWN0LWluZm8udXJpLnByZWZpeDsvcHJvamVjdC9qZXJzZXktcngtY2xpZW50LXJ4amF2YS9kZXBlbmRlbmNpZXMuaHRtbCc+amVyc2V5LXJ4LWNsaWVudC1yeGphdmE8L2xpbms+IiA+Cis8IUVOVElUWSBqZXJzZXkuZXh0LnJ4LWNsaWVudC5yeGphdmEyLmRlcHMubGluayAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5wcm9qZWN0LWluZm8udXJpLnByZWZpeDsvcHJvamVjdC9qZXJzZXktcngtY2xpZW50LXJ4amF2YTIvZGVwZW5kZW5jaWVzLmh0bWwnPmplcnNleS1yeC1jbGllbnQtcnhqYXZhMjwvbGluaz4iID4KKzwhRU5USVRZIGplcnNleS5tZWRpYS5qc29uLXByb2Nlc3NpbmcuZGVwcy5saW5rICI8bGluayB4bGluazpocmVmPScmamVyc2V5LnByb2plY3QtaW5mby51cmkucHJlZml4Oy9qZXJzZXktbWVkaWEtanNvbi1wcm9jZXNzaW5nL2RlcGVuZGVuY2llcy5odG1sJz5qZXJzZXktbWVkaWEtanNvbi1wcm9jZXNzaW5nPC9saW5rPiIgPgorPCFFTlRJVFkgamVyc2V5Lm1lZGlhLmpzb24tamV0dGlzb24uZGVwcy5saW5rICI8bGluayB4bGluazpocmVmPScmamVyc2V5LnByb2plY3QtaW5mby51cmkucHJlZml4Oy9qZXJzZXktbWVkaWEtanNvbi1qZXR0aXNvbi9kZXBlbmRlbmNpZXMuaHRtbCc+amVyc2V5LW1lZGlhLWpzb24tamV0dGlzb248L2xpbms+IiA+Cis8IUVOVElUWSBqZXJzZXkubWVkaWEuanNvbi1qYWNrc29uLmRlcHMubGluayAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5wcm9qZWN0LWluZm8udXJpLnByZWZpeDsvamVyc2V5LW1lZGlhLWpzb24tamFja3Nvbi9kZXBlbmRlbmNpZXMuaHRtbCc+amVyc2V5LW1lZGlhLWpzb24tamFja3NvbjwvbGluaz4iID4KKzwhRU5USVRZIGplcnNleS5tZWRpYS5qc29uLWphY2tzb24xLmRlcHMubGluayAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5wcm9qZWN0LWluZm8udXJpLnByZWZpeDsvamVyc2V5LW1lZGlhLWpzb24tamFja3NvbjEvZGVwZW5kZW5jaWVzLmh0bWwnPmplcnNleS1tZWRpYS1qc29uLWphY2tzb24xPC9saW5rPiIgPgorPCFFTlRJVFkgamVyc2V5Lm1lZGlhLm1veHkuZGVwcy5saW5rICI8bGluayB4bGluazpocmVmPScmamVyc2V5LnByb2plY3QtaW5mby51cmkucHJlZml4Oy9qZXJzZXktbWVkaWEtbW94eS9kZXBlbmRlbmNpZXMuaHRtbCc+amVyc2V5LW1lZGlhLW1veHk8L2xpbms+IiA+Cis8IUVOVElUWSBqZXJzZXkubWVkaWEubXVsdGlwYXJ0LmRlcHMubGluayAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5wcm9qZWN0LWluZm8udXJpLnByZWZpeDsvamVyc2V5LW1lZGlhLW11bHRpcGFydC9kZXBlbmRlbmNpZXMuaHRtbCc+amVyc2V5LW1lZGlhLW11bHRpcGFydDwvbGluaz4iID4KKzwhRU5USVRZIGplcnNleS5leHQubXZjLmRlcHMubGluayAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5wcm9qZWN0LWluZm8udXJpLnByZWZpeDsvamVyc2V5LW12Yy9kZXBlbmRlbmNpZXMuaHRtbCc+amVyc2V5LW12YzwvbGluaz4iID4KKzwhRU5USVRZIGplcnNleS5leHQubXZjLWJlYW4tdmFsaWRhdGlvbi5kZXBzLmxpbmsgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkucHJvamVjdC1pbmZvLnVyaS5wcmVmaXg7L2plcnNleS1tdmMtYmVhbi12YWxpZGF0aW9uL2RlcGVuZGVuY2llcy5odG1sJz5qZXJzZXktbXZjLWJlYW4tdmFsaWRhdGlvbjwvbGluaz4iID4KKzwhRU5USVRZIGplcnNleS5leHQubXZjLWZyZWVtYXJrZXIuZGVwcy5saW5rICI8bGluayB4bGluazpocmVmPScmamVyc2V5LnByb2plY3QtaW5mby51cmkucHJlZml4Oy9qZXJzZXktbXZjLWZyZWVtYXJrZXIvZGVwZW5kZW5jaWVzLmh0bWwnPmplcnNleS1tdmMtZnJlZW1hcmtlcjwvbGluaz4iID4KKzwhRU5USVRZIGplcnNleS5leHQubXZjLWpzcC5kZXBzLmxpbmsgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkucHJvamVjdC1pbmZvLnVyaS5wcmVmaXg7L2plcnNleS1tdmMtanNwL2RlcGVuZGVuY2llcy5odG1sJz5qZXJzZXktbXZjLWpzcDwvbGluaz4iID4KKzwhRU5USVRZIGplcnNleS5leHQubXZjLW11c3RhY2hlLmRlcHMubGluayAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5wcm9qZWN0LWluZm8udXJpLnByZWZpeDsvamVyc2V5LW12Yy1tdXN0YWNoZS9kZXBlbmRlbmNpZXMuaHRtbCc+amVyc2V5LW12Yy1tdXN0YWNoZTwvbGluaz4iID4KKzwhRU5USVRZIGplcnNleS5leHQuc3ByaW5nNC5kZXBzLmxpbmsgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkucHJvamVjdC1pbmZvLnVyaS5wcmVmaXg7L2plcnNleS1zcHJpbmc0L2RlcGVuZGVuY2llcy5odG1sJz5qZXJzZXktc3ByaW5nNDwvbGluaz4iID4KKzwhRU5USVRZIGplcnNleS5kb2NzLnJvb3QudXJpICJodHRwczovL2plcnNleS5naXRodWIuaW8vZG9jdW1lbnRhdGlvbi8mZG9jcy52ZXJzaW9uOyI+Cis8IUVOVElUWSBqZXJzZXkuZG9jcy5pbmRleC51cmkgIiZqZXJzZXkuZG9jcy5yb290LnVyaTsvaW5kZXguaHRtbCI+Cis8IUVOVElUWSBqZXJzZXkuZ2l0aHViLmV4YW1wbGVzLnVyaSAiJmplcnNleS5naXRodWIucmVsZWFzZS51cmk7L2V4YW1wbGVzIj4KKzwhRU5USVRZIGplcnNleS5naXRodWIuYmFzZS51cmkgImh0dHBzOi8vZ2l0aHViLmNvbS9qZXJzZXkvamVyc2V5L3RyZWUiPgorPCFFTlRJVFkgamVyc2V5LmdpdGh1Yi5yZWxlYXNlLnVyaSAiJmplcnNleS5naXRodWIuYmFzZS51cmk7LyZzcmMuYnJhbmNoOyI+Cis8IUVOVElUWSBqZXJzZXkuamF2YWRvYy5yb290LnVyaSAiaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL2FwaWRvY3MvJmFwaWRvY3MudmVyc2lvbjsvamVyc2V5Ij4KKzwhRU5USVRZIGplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXggIiZqZXJzZXkuamF2YWRvYy5yb290LnVyaTsvb3JnL2dsYXNzZmlzaC9qZXJzZXkiPgorPCFFTlRJVFkgamVyc2V5LnByb2plY3QtaW5mby51cmkucHJlZml4ICJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdCI+Cis8IUVOVElUWSBqZWUuamF2YWRvYy51cmkgImh0dHA6Ly9kb2NzLm9yYWNsZS5jb20vamF2YWVlLzcvYXBpIj4KKzwhRU5USVRZIGpkazYuamF2YWRvYy51cmkgImh0dHA6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzYvZG9jcy9hcGkiPgorPCFFTlRJVFkgamRrNy5qYXZhZG9jLnVyaSAiaHR0cDovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvNy9kb2NzL2FwaSI+Cis8IUVOVElUWSBqZGs4LmphdmFkb2MudXJpICJodHRwOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS84L2RvY3MvYXBpIj4KKzwhRU5USVRZIGpzci51cmkucHJlZml4ICJodHRwOi8vamNwLm9yZy9lbi9qc3IvZGV0YWlsP2lkPSI+Cis8IUVOVElUWSBqc3IxNjYubGluayAiPGxpbmsgeGxpbms6aHJlZj0naHR0cDovL2cub3N3ZWdvLmVkdS9kbC9jb25jdXJyZW5jeS1pbnRlcmVzdC8nPkpTUiAxNjY8L2xpbms+Ij4KKzwhRU5USVRZIGpzcjE2Ni5qYXZhZG9jLnVyaSAiaHR0cDovL2dlZS5jcy5vc3dlZ28uZWR1L2RsL2pzcjE2Ni9kaXN0L2pzcjE2NmVkb2NzLyI+Cis8IUVOVElUWSBqc3IzMTEubGluayAiPGxpbmsgeGxpbms6aHJlZj0nJmpzci51cmkucHJlZml4OzMxMSc+SlNSIDMxMTwvbGluaz4iPgorPCFFTlRJVFkganNyMzE1LmxpbmsgIjxsaW5rIHhsaW5rOmhyZWY9JyZqc3IudXJpLnByZWZpeDszMTUnPkpTUiAzMTU8L2xpbms+Ij4KKzwhRU5USVRZIG1hdmVuLmNlbnRyYWwucmVwby5saW5rICI8bGluayB4bGluazpocmVmPSdodHRwOi8vc2VhcmNoLm1hdmVuLm9yZy8nPkNlbnRyYWwgTWF2ZW4gUmVwb3NpdG9yeTwvbGluaz4iPgorPCFFTlRJVFkgbWF2ZW4ubGluayAiPGxpbmsgeGxpbms6aHJlZj0naHR0cDovL21hdmVuLmFwYWNoZS5vcmcvJz5BcGFjaGUgTWF2ZW48L2xpbms+Ij4KKzwhRU5USVRZIG1hdmVuLmphdmEubmV0LnJlbGVhc2VzLmxpbmsgImh0dHBzOi8vbWF2ZW4uamF2YS5uZXQvY29udGVudC9yZXBvc2l0b3JpZXMvcmVsZWFzZXMvIj4KKzwhRU5USVRZIHJ4amF2YS5qYXZhZG9jLnVyaSAiaHR0cDovL3JlYWN0aXZleC5pby9SeEphdmEvamF2YWRvYy8iPgorPCFFTlRJVFkgcnhqYXZhLmxpbmsgIjxsaW5rIHhsaW5rOmhyZWY9JyZyeGphdmEudXJpOyc+UnhKYXZhPC9saW5rPiI+Cis8IUVOVElUWSByeGphdmEudXJpICJodHRwczovL2dpdGh1Yi5jb20vUmVhY3RpdmVYL1J4SmF2YSI+Cis8IUVOVElUWSB3aWtpcGVkaWEudXJpICJodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpLyI+Cis8IUVOVElUWSBqaXJhLnVyaS5wcmVmaXggImh0dHBzOi8vamF2YS5uZXQvamlyYS9icm93c2UiPgorCis8IS0tIEFQSSBEb2NzIGxpbmtzIC0tPgorPCFFTlRJVFkgYnYuQ29uZmlndXJhdGlvbiAiPGxpbmsgeGxpbms6aHJlZj0nJmJ2MTEuamF2YWRvYy51cmk7L2phdmF4L3ZhbGlkYXRpb24vQ29uZmlndXJhdGlvbi5odG1sJz5Db25maWd1cmF0aW9uPC9saW5rPiI+Cis8IUVOVElUWSBidi5Db25zdHJhaW50ICI8bGluayB4bGluazpocmVmPScmYnYxMS5qYXZhZG9jLnVyaTsvamF2YXgvdmFsaWRhdGlvbi9Db25zdHJhaW50Lmh0bWwnPkBDb25zdHJhaW50PC9saW5rPiI+Cis8IUVOVElUWSBidi5Db25zdHJhaW50VmFsaWRhdG9yICI8bGluayB4bGluazpocmVmPScmYnYxMS5qYXZhZG9jLnVyaTsvamF2YXgvdmFsaWRhdGlvbi9Db25zdHJhaW50VmFsaWRhdG9yLmh0bWwnPkNvbnN0cmFpbnRWYWxpZGF0b3I8L2xpbms+Ij4KKzwhRU5USVRZIGJ2LkNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5ICI8bGluayB4bGluazpocmVmPScmYnYxMS5qYXZhZG9jLnVyaTsvamF2YXgvdmFsaWRhdGlvbi9Db25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeS5odG1sJz5Db25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeTwvbGluaz4iPgorPCFFTlRJVFkgYnYuQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbiAiPGxpbmsgeGxpbms6aHJlZj0nJmJ2MTEuamF2YWRvYy51cmk7L2phdmF4L3ZhbGlkYXRpb24vQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbi5odG1sJz5Db25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uPC9saW5rPiI+Cis8IUVOVElUWSBidi5NZXNzYWdlSW50ZXJwb2xhdG9yICI8bGluayB4bGluazpocmVmPScmYnYxMS5qYXZhZG9jLnVyaTsvamF2YXgvdmFsaWRhdGlvbi9NZXNzYWdlSW50ZXJwb2xhdG9yLmh0bWwnPk1lc3NhZ2VJbnRlcnBvbGF0b3I8L2xpbms+Ij4KKzwhRU5USVRZIGJ2LlBhcmFtZXRlck5hbWVQcm92aWRlciAiPGxpbmsgeGxpbms6aHJlZj0nJmJ2MTEuamF2YWRvYy51cmk7L2phdmF4L3ZhbGlkYXRpb24vUGFyYW1ldGVyTmFtZVByb3ZpZGVyLmh0bWwnPlBhcmFtZXRlck5hbWVQcm92aWRlcjwvbGluaz4iPgorPCFFTlRJVFkgYnYuVHJhdmVyc2FibGVSZXNvbHZlciAiPGxpbmsgeGxpbms6aHJlZj0nJmJ2MTEuamF2YWRvYy51cmk7L2phdmF4L3ZhbGlkYXRpb24vVHJhdmVyc2FibGVSZXNvbHZlci5odG1sJz5UcmF2ZXJzYWJsZVJlc29sdmVyPC9saW5rPiI+Cis8IUVOVElUWSBidi5WYWxpZCAiPGxpbmsgeGxpbms6aHJlZj0nJmJ2MTEuamF2YWRvYy51cmk7L2phdmF4L3ZhbGlkYXRpb24vVmFsaWQuaHRtbCc+QFZhbGlkPC9saW5rPiI+Cis8IUVOVElUWSBidi5WYWxpZGF0aW9uRXhjZXB0aW9uICI8bGluayB4bGluazpocmVmPScmYnYxMS5qYXZhZG9jLnVyaTsvamF2YXgvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRXhjZXB0aW9uLmh0bWwnPlZhbGlkYXRpb25FeGNlcHRpb248L2xpbms+Ij4KKzwhRU5USVRZIGJ2LlZhbGlkYXRvciAiPGxpbmsgeGxpbms6aHJlZj0nJmJ2MTEuamF2YWRvYy51cmk7L2phdmF4L3ZhbGlkYXRpb24vVmFsaWRhdG9yLmh0bWwnPlZhbGlkYXRvcjwvbGluaz4iPgorPCFFTlRJVFkgYnYuVmFsaWRhdG9yRmFjdG9yeSAiPGxpbmsgeGxpbms6aHJlZj0nJmJ2MTEuamF2YWRvYy51cmk7L2phdmF4L3ZhbGlkYXRpb24vVmFsaWRhdG9yRmFjdG9yeS5odG1sJz5WYWxpZGF0b3JGYWN0b3J5PC9saW5rPiI+CisKKzwhRU5USVRZIGd1YXZhLkZ1dHVyZXMgIjxsaW5rIHhsaW5rOmhyZWY9JyZndWF2YS5qYXZhZG9jLnVyaTtjb20vZ29vZ2xlL2NvbW1vbi91dGlsL2NvbmN1cnJlbnQvRnV0dXJlcy5odG1sJz5GdXR1cmVzPC9saW5rPiI+Cis8IUVOVElUWSBndWF2YS5MaXN0ZW5hYmxlRnV0dXJlICI8bGluayB4bGluazpocmVmPScmZ3VhdmEuamF2YWRvYy51cmk7Y29tL2dvb2dsZS9jb21tb24vdXRpbC9jb25jdXJyZW50L0xpc3RlbmFibGVGdXR1cmUuaHRtbCc+TGlzdGVuYWJsZUZ1dHVyZTwvbGluaz4iPgorCis8IUVOVElUWSBoazIuQmluZGVyICI8bGluayB4bGluazpocmVmPScmaGsyLmphdmFkb2MudXJpOy9vcmcvZ2xhc3NmaXNoL2hrMi91dGlsaXRpZXMvQmluZGVyLmh0bWwnPkJpbmRlcjwvbGluaz4iPgorPCFFTlRJVFkgaGsyLkZhY3RvcnkgIjxsaW5rIHhsaW5rOmhyZWY9JyZoazIuamF2YWRvYy51cmk7L29yZy9nbGFzc2Zpc2gvaGsyL2FwaS9GYWN0b3J5Lmh0bWwnPkZhY3Rvcnk8L2xpbms+Ij4KKzwhRU5USVRZIGhrMi5JbmplY3Rpb25SZXNvbHZlciAiPGxpbmsgeGxpbms6aHJlZj0nJmhrMi5qYXZhZG9jLnVyaTsvb3JnL2dsYXNzZmlzaC9oazIvYXBpL0luamVjdGlvblJlc29sdmVyLmh0bWwnPkluamVjdGlvblJlc29sdmVyPC9saW5rPiI+Cis8IUVOVElUWSBoazIuUGVyTG9va3VwICI8bGluayB4bGluazpocmVmPScmaGsyLmphdmFkb2MudXJpOy9vcmcvZ2xhc3NmaXNoL2hrMi9hcGkvUGVyTG9va3VwLmh0bWwnPlBlckxvb2t1cDwvbGluaz4iPgorPCFFTlRJVFkgaGsyLlNlcnZpY2VMb2NhdG9yICI8bGluayB4bGluazpocmVmPScmaGsyLmphdmFkb2MudXJpOy9vcmcvZ2xhc3NmaXNoL2hrMi9hcGkvU2VydmljZUxvY2F0b3IuaHRtbCc+U2VydmljZUxvY2F0b3I8L2xpbms+Ij4KKworPCEtLSBSeEphdmEgLS0+Cis8IUVOVElUWSByeGphdmEuT2JzZXJ2YWJsZSAiPGxpbmsgeGxpbms6aHJlZj0nJnJ4amF2YS5qYXZhZG9jLnVyaTsvcngvT2JzZXJ2YWJsZS5odG1sJz5PYnNlcnZhYmxlPC9saW5rPiI+Cis8IUVOVElUWSByeGphdmEuT2JzZXJ2YWJsZS5vbnNlcnZlT24gIjxsaW5rIHhsaW5rOmhyZWY9JyZyeGphdmEuamF2YWRvYy51cmk7L3J4L09ic2VydmFibGUuaHRtbCNvYnNlcnZlT24ocnguU2NoZWR1bGVyKSc+T2JzZXJ2YWJsZSNvYnNlcnZlT24ocnguU2NoZWR1bGVyKTwvbGluaz4iPgorPCFFTlRJVFkgcnhqYXZhLk9ic2VydmFibGUuc3Vic2NyaWJlT24gIjxsaW5rIHhsaW5rOmhyZWY9JyZyeGphdmEuamF2YWRvYy51cmk7L3J4L09ic2VydmFibGUuaHRtbCNzdWJzY3JpYmVPbihyeC5TY2hlZHVsZXIpJz5PYnNlcnZhYmxlI3N1YnNjcmliZU9uKHJ4LlNjaGVkdWxlcik8L2xpbms+Ij4KKzwhRU5USVRZIHJ4amF2YS5TY2hlZHVsZXIgIjxsaW5rIHhsaW5rOmhyZWY9JyZyeGphdmEuamF2YWRvYy51cmk7L3J4L1NjaGVkdWxlci5odG1sJz5TY2hlZHVsZXI8L2xpbms+Ij4KKworPCFFTlRJVFkgcnhqYXZhMi5GbG93YWJsZSAiPGxpbmsgeGxpbms6aHJlZj0nJnJ4amF2YS5qYXZhZG9jLnVyaTsvcngvRmxvd2FibGUuaHRtbCc+Rmxvd2FibGU8L2xpbms+Ij4KKworPCFFTlRJVFkganNyMTY2ZS5Db21wbGV0YWJsZUZ1dHVyZSAiPGxpbmsgeGxpbms6aHJlZj0nJmpzcjE2Ni5qYXZhZG9jLnVyaTsvanNyMTY2ZS9Db21wbGV0YWJsZUZ1dHVyZS5odG1sJz5Db21wbGV0YWJsZUZ1dHVyZTwvbGluaz4iPgorPCFFTlRJVFkganNyMTY2ZS5Gb3JrSm9pblBvb2wuY29tbW9uUG9vbCAiPGxpbmsgeGxpbms6aHJlZj0nJmpzcjE2Ni5qYXZhZG9jLnVyaTsvanNyMTY2ZS9Gb3JrSm9pblBvb2wuaHRtbCNjb21tb25Qb29sKCknPkZvcmtKb2luUG9vbC5odG1sI2NvbW1vblBvb2woKTwvbGluaz4iPgorCis8IUVOVElUWSBqYXhiLkpBWEJDb250ZXh0ICI8bGluayB4bGluazpocmVmPScmamF4Yi5qYXZhZG9jLnVyaTsvSkFYQkNvbnRleHQuaHRtbCc+SkFYQkNvbnRleHQ8L2xpbms+Ij4KKzwhRU5USVRZIGpheGIuSkFYQkVsZW1lbnQgIjxsaW5rIHhsaW5rOmhyZWY9JyZqYXhiLmphdmFkb2MudXJpOy9KQVhCRWxlbWVudC5odG1sJz5KQVhCRWxlbWVudDwvbGluaz4iPgorPCFFTlRJVFkgamF4Yi5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50ICI8bGluayB4bGluazpocmVmPScmamF4Yi5qYXZhZG9jLnVyaTsvYW5ub3RhdGlvbi9YbWxSb290RWxlbWVudC5odG1sJz5AWG1sUm9vdEVsZW1lbnQ8L2xpbms+Ij4KKworPCFFTlRJVFkgamF4cnMuQXBwbGljYXRpb25QYXRoICI8bGluayB4bGluazpocmVmPScmamF4cnMuamF2YWRvYy51cmk7L0FwcGxpY2F0aW9uUGF0aC5odG1sJz5AQXBwbGljYXRpb25QYXRoPC9saW5rPiI+Cis8IUVOVElUWSBqYXhycy5CZWFuUGFyYW0gIjxsaW5rIHhsaW5rOmhyZWY9JyZqYXhycy5qYXZhZG9jLnVyaTsvQmVhblBhcmFtLmh0bWwnPkBCZWFuUGFyYW08L2xpbms+Ij4KKzwhRU5USVRZIGpheHJzLkNvbnN1bWVzICI8bGluayB4bGluazpocmVmPScmamF4cnMuamF2YWRvYy51cmk7L0NvbnN1bWVzLmh0bWwnPkBDb25zdW1lczwvbGluaz4iPgorPCFFTlRJVFkgamF4cnMuQ29udGFpbmVyUmVxdWVzdENvbnRleHQgIjxsaW5rIHhsaW5rOmhyZWY9JyZqYXhycy5qYXZhZG9jLnVyaTsvY29udGFpbmVyL0NvbnRhaW5lclJlcXVlc3RDb250ZXh0Lmh0bWwnPkNvbnRhaW5lclJlcXVlc3RDb250ZXh0PC9saW5rPiI+Cis8IUVOVElUWSBqYXhycy5Db250YWluZXJSZXNwb25zZUNvbnRleHQgIjxsaW5rIHhsaW5rOmhyZWY9JyZqYXhycy5qYXZhZG9jLnVyaTsvY29udGFpbmVyL0NvbnRhaW5lclJlc3BvbnNlQ29udGV4dC5odG1sJz5Db250YWluZXJSZXNwb25zZUNvbnRleHQ8L2xpbms+Ij4KKzwhRU5USVRZIGpheHJzLkNvb2tpZVBhcmFtICI8bGluayB4bGluazpocmVmPScmamF4cnMuamF2YWRvYy51cmk7L0Nvb2tpZVBhcmFtLmh0bWwnPkBDb29raWVQYXJhbTwvbGluaz4iPgorPCFFTlRJVFkgamF4cnMuREVMRVRFICI8bGluayB4bGluazpocmVmPScmamF4cnMuamF2YWRvYy51cmk7L0RFTEVURS5odG1sJz5AREVMRVRFPC9saW5rPiI+Cis8IUVOVElUWSBqYXhycy5EZWZhdWx0VmFsdWUgIjxsaW5rIHhsaW5rOmhyZWY9JyZqYXhycy5qYXZhZG9jLnVyaTsvRGVmYXVsdFZhbHVlLmh0bWwnPkBEZWZhdWx0VmFsdWU8L2xpbms+Ij4KKzwhRU5USVRZIGpheHJzLkVuY29kZWQgIjxsaW5rIHhsaW5rOmhyZWY9JyZqYXhycy5qYXZhZG9jLnVyaTsvRW5jb2RlZC5odG1sJz5ARW5jb2RlZDwvbGluaz4iPgorPCFFTlRJVFkgamF4cnMuRm9ybVBhcmFtICI8bGluayB4bGluazpocmVmPScmamF4cnMuamF2YWRvYy51cmk7L0Zvcm1QYXJhbS5odG1sJz5ARm9ybVBhcmFtPC9saW5rPiI+Cis8IUVOVElUWSBqYXhycy5HRVQgIjxsaW5rIHhsaW5rOmhyZWY9JyZqYXhycy5qYXZhZG9jLnVyaTsvR0VULmh0bWwnPkBHRVQ8L2xpbms+Ij4KKzwhRU5USVRZIGpheHJzLkhFQUQgIjxsaW5rIHhsaW5rOmhyZWY9JyZqYXhycy5qYXZhZG9jLnVyaTsvSEVBRC5odG1sJz5ASEVBRDwvbGluaz4iPgorPCFFTlRJVFkgamF4cnMuSGVhZGVyUGFyYW0gIjxsaW5rIHhsaW5rOmhyZWY9JyZqYXhycy5qYXZhZG9jLnVyaTsvSGVhZGVyUGFyYW0uaHRtbCc+QEhlYWRlclBhcmFtPC9saW5rPiI+Cis8IUVOVElUWSBqYXhycy5IdHRwTWV0aG9kICI8bGluayB4bGluazpocmVmPScmamF4cnMuamF2YWRvYy51cmk7L0h0dHBNZXRob2QuaHRtbCc+QEh0dHBNZXRob2Q8L2xpbms+Ij4KKzwhRU5USVRZIGpheHJzLk1hdHJpeFBhcmFtICI8bGluayB4bGluazpocmVmPScmamF4cnMuamF2YWRvYy51cmk7L01hdHJpeFBhcmFtLmh0bWwnPkBNYXRyaXhQYXJhbTwvbGluaz4iPgorPCFFTlRJVFkgamF4cnMuTmFtZUJpbmRpbmcgIjxsaW5rIHhsaW5rOmhyZWY9JyZqYXhycy5qYXZhZG9jLnVyaTsvTmFtZUJpbmRpbmcuaHRtbCc+QE5hbWVCaW5kaW5nPC9saW5rPiI+Cis8IUVOVElUWSBqYXhycy5PUFRJT05TICI8bGluayB4bGluazpocmVmPScmamF4cnMuamF2YWRvYy51cmk7L09QVElPTlMuaHRtbCc+QE9QVElPTlM8L2xpbms+Ij4KKzwhRU5USVRZIGpheHJzLlBPU1QgIjxsaW5rIHhsaW5rOmhyZWY9JyZqYXhycy5qYXZhZG9jLnVyaTsvUE9TVC5odG1sJz5AUE9TVDwvbGluaz4iPgorPCFFTlRJVFkgamF4cnMuUFVUICI8bGluayB4bGluazpocmVmPScmamF4cnMuamF2YWRvYy51cmk7L1BVVC5odG1sJz5AUFVUPC9saW5rPiI+Cis8IUVOVElUWSBqYXhycy5QYXRoICI8bGluayB4bGluazpocmVmPScmamF4cnMuamF2YWRvYy51cmk7L1BhdGguaHRtbCc+QFBhdGg8L2xpbms+Ij4KKzwhRU5USVRZIGpheHJzLlBhdGhQYXJhbSAiPGxpbmsgeGxpbms6aHJlZj0nJmpheHJzLmphdmFkb2MudXJpOy9QYXRoUGFyYW0uaHRtbCc+QFBhdGhQYXJhbTwvbGluaz4iPgorPCFFTlRJVFkgamF4cnMuUHJlbWF0Y2hpbmcgIjxsaW5rIHhsaW5rOmhyZWY9JyZqYXhycy5qYXZhZG9jLnVyaTsvY29udGFpbmVyL1ByZU1hdGNoaW5nLmh0bWwnPkBQcmVNYXRjaGluZzwvbGluaz4iPgorPCFFTlRJVFkgamF4cnMuUHJpb3JpdGllcyAiPGxpbmsgeGxpbms6aHJlZj0nJmpheHJzLmphdmFkb2MudXJpOy9Qcmlvcml0aWVzLmh0bWwnPlByaW9yaXRpZXM8L2xpbms+Ij4KKzwhRU5USVRZIGpheHJzLlByb2Nlc3NpbmdFeGNlcHRpb24gIjxsaW5rIHhsaW5rOmhyZWY9JyZqYXhycy5qYXZhZG9jLnVyaTsvUHJvY2Vzc2luZ0V4Y2VwdGlvbi5odG1sJz5Qcm9jZXNzaW5nRXhjZXB0aW9uPC9saW5rPiI+Cis8IUVOVElUWSBqYXhycy5Qcm9kdWNlcyAiPGxpbmsgeGxpbms6aHJlZj0nJmpheHJzLmphdmFkb2MudXJpOy9Qcm9kdWNlcy5odG1sJz5AUHJvZHVjZXM8L2xpbms+Ij4KKzwhRU5USVRZIGpheHJzLlF1ZXJ5UGFyYW0gIjxsaW5rIHhsaW5rOmhyZWY9JyZqYXhycy5qYXZhZG9jLnVyaTsvUXVlcnlQYXJhbS5odG1sJz5AUXVlcnlQYXJhbTwvbGluaz4iPgorPCFFTlRJVFkgamF4cnMuUmVhZGVySW50ZXJjZXB0b3IgIjxsaW5rIHhsaW5rOmhyZWY9JyZqYXhycy5qYXZhZG9jLnVyaTsvZXh0L1JlYWRlckludGVyY2VwdG9yLmh0bWwnPlJlYWRlckludGVyY2VwdG9yPC9saW5rPiI+Cis8IUVOVElUWSBqYXhycy5SZWFkZXJJbnRlcmNlcHRvckNvbnRleHQgIjxsaW5rIHhsaW5rOmhyZWY9JyZqYXhycy5qYXZhZG9jLnVyaTsvZXh0L1JlYWRlckludGVyY2VwdG9yQ29udGV4dC5odG1sJz5SZWFkZXJJbnRlcmNlcHRvckNvbnRleHQ8L2xpbms+Ij4KKzwhRU5USVRZIGpheHJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uICI8bGluayB4bGluazpocmVmPScmamF4cnMuamF2YWRvYy51cmk7L1dlYkFwcGxpY2F0aW9uRXhjZXB0aW9uLmh0bWwnPldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uPC9saW5rPiI+Cis8IUVOVElUWSBqYXhycy5Xcml0ZXJJbnRlcmNlcHRvciAiPGxpbmsgeGxpbms6aHJlZj0nJmpheHJzLmphdmFkb2MudXJpOy9leHQvV3JpdGVySW50ZXJjZXB0b3IuaHRtbCc+V3JpdGVySW50ZXJjZXB0b3I8L2xpbms+Ij4KKzwhRU5USVRZIGpheHJzLldyaXRlckludGVyY2VwdG9yQ29udGV4dCAiPGxpbmsgeGxpbms6aHJlZj0nJmpheHJzLmphdmFkb2MudXJpOy9leHQvV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0Lmh0bWwnPldyaXRlckludGVyY2VwdG9yQ29udGV4dDwvbGluaz4iPgorPCFFTlRJVFkgamF4cnMuY2xpZW50LkFzeW5jSW52b2tlciAiPGxpbmsgeGxpbms6aHJlZj0nJmpheHJzLmphdmFkb2MudXJpOy9jbGllbnQvQXN5bmNJbnZva2VyLmh0bWwnPkFzeW5jSW52b2tlcjwvbGluaz4iPgorPCFFTlRJVFkgamF4cnMuY2xpZW50LkNsaWVudCAiPGxpbmsgeGxpbms6aHJlZj0nJmpheHJzLmphdmFkb2MudXJpOy9jbGllbnQvQ2xpZW50Lmh0bWwnPkNsaWVudDwvbGluaz4iPgorPCFFTlRJVFkgamF4cnMuY2xpZW50LkNsaWVudEJ1aWxkZXIgIjxsaW5rIHhsaW5rOmhyZWY9JyZqYXhycy5qYXZhZG9jLnVyaTsvY2xpZW50L0NsaWVudEJ1aWxkZXIuaHRtbCc+Q2xpZW50QnVpbGRlcjwvbGluaz4iPgorPCFFTlRJVFkgamF4cnMuY2xpZW50LkNsaWVudFJlcXVlc3RDb250ZXh0ICI8bGluayB4bGluazpocmVmPScmamF4cnMuamF2YWRvYy51cmk7L2NsaWVudC9DbGllbnRSZXF1ZXN0Q29udGV4dC5odG1sJz5DbGllbnRSZXF1ZXN0Q29udGV4dDwvbGluaz4iPgorPCFFTlRJVFkgamF4cnMuY2xpZW50LkNsaWVudFJlcXVlc3RGaWx0ZXIgIjxsaW5rIHhsaW5rOmhyZWY9JyZqYXhycy5qYXZhZG9jLnVyaTsvY2xpZW50L0NsaWVudFJlcXVlc3RGaWx0ZXIuaHRtbCc+Q2xpZW50UmVxdWVzdEZpbHRlcjwvbGluaz4iPgorPCFFTlRJVFkgamF4cnMuY2xpZW50LkNsaWVudFJlc3BvbnNlRmlsdGVyICI8bGluayB4bGluazpocmVmPScmamF4cnMuamF2YWRvYy51cmk7L2NsaWVudC9DbGllbnRSZXNwb25zZUZpbHRlci5odG1sJz5DbGllbnRSZXNwb25zZUZpbHRlcjwvbGluaz4iPgorPCFFTlRJVFkgamF4cnMuY2xpZW50LkNvbXBsZXRpb25TdGFnZVJ4SW52b2tlciAiPGxpbmsgeGxpbms6aHJlZj0nJmpheHJzLmphdmFkb2MudXJpOy9jbGllbnQvQ29tcGxldGlvblN0YWdlUnhJbnZva2VyLmh0bWwnPkNvbXBsZXRpb25TdGFnZVJ4SW52b2tlcjwvbGluaz4iPgorPCFFTlRJVFkgamF4cnMuY2xpZW50LkVudGl0eSAiPGxpbmsgeGxpbms6aHJlZj0nJmpheHJzLmphdmFkb2MudXJpOy9jbGllbnQvRW50aXR5Lmh0bWwnPkVudGl0eTwvbGluaz4iPgorPCFFTlRJVFkgamF4cnMuY2xpZW50Lkludm9jYXRpb24gIjxsaW5rIHhsaW5rOmhyZWY9JyZqYXhycy5qYXZhZG9jLnVyaTsvY2xpZW50L0ludm9jYXRpb24uaHRtbCc+SW52b2NhdGlvbjwvbGluaz4iPgorPCFFTlRJVFkgamF4cnMuY2xpZW50Lkludm9jYXRpb24uQnVpbGRlciAiPGxpbmsgeGxpbms6aHJlZj0nJmpheHJzLmphdmFkb2MudXJpOy9jbGllbnQvSW52b2NhdGlvbi5CdWlsZGVyLmh0bWwnPkludm9jYXRpb24uQnVpbGRlcjwvbGluaz4iPgorPCFFTlRJVFkgamF4cnMuY2xpZW50Lkludm9jYXRpb25DYWxsYmFjayAiPGxpbmsgeGxpbms6aHJlZj0nJmpheHJzLmphdmFkb2MudXJpOy9jbGllbnQvSW52b2NhdGlvbkNhbGxiYWNrLmh0bWwnPkludm9jYXRpb25DYWxsYmFjazwvbGluaz4iPgorPCFFTlRJVFkgamF4cnMuY2xpZW50LlJ4SW52b2tlciAiPGxpbmsgeGxpbms6aHJlZj0nJmpheHJzLmphdmFkb2MudXJpOy9jbGllbnQvUnhJbnZva2VyLmh0bWwnPlJ4SW52b2tlcjwvbGluaz4iPgorPCFFTlRJVFkgamF4cnMuY2xpZW50LlJ4SW52b2tlclByb3ZpZGVyICI8bGluayB4bGluazpocmVmPScmamF4cnMuamF2YWRvYy51cmk7L2NsaWVudC9SeEludm9rZXJQcm92aWRlci5odG1sJz5SeEludm9rZXJQcm92aWRlcjwvbGluaz4iPgorPCFFTlRJVFkgamF4cnMuY2xpZW50LlN5bmNJbnZva2VyICI8bGluayB4bGluazpocmVmPScmamF4cnMuamF2YWRvYy51cmk7L2NsaWVudC9TeW5jSW52b2tlci5odG1sJz5TeW5jSW52b2tlcjwvbGluaz4iPgorPCFFTlRJVFkgamF4cnMuY2xpZW50LldlYlRhcmdldCAiPGxpbmsgeGxpbms6aHJlZj0nJmpheHJzLmphdmFkb2MudXJpOy9jbGllbnQvV2ViVGFyZ2V0Lmh0bWwnPldlYlRhcmdldDwvbGluaz4iPgorPCFFTlRJVFkgamF4cnMuY2xpZW50LldlYlRhcmdldCAiPGxpbmsgeGxpbms6aHJlZj0nJmpheHJzLmphdmFkb2MudXJpOy9jbGllbnQvV2ViVGFyZ2V0Lmh0bWwnPldlYlRhcmdldDwvbGluaz4iPgorPCFFTlRJVFkgamF4cnMuY29udGFpbmVyLkFzeW5jUmVzcG9uc2UgIjxsaW5rIHhsaW5rOmhyZWY9JyZqYXhycy5qYXZhZG9jLnVyaTsvY29udGFpbmVyL0FzeW5jUmVzcG9uc2UuaHRtbCc+QXN5bmNSZXNwb25zZTwvbGluaz4iPgorPCFFTlRJVFkgamF4cnMuY29udGFpbmVyLkNvbXBsZXRpb25DYWxsYmFjayAiPGxpbmsgeGxpbms6aHJlZj0nJmpheHJzLmphdmFkb2MudXJpOy9jb250YWluZXIvQ29tcGxldGlvbkNhbGxiYWNrLmh0bWwnPkNvbXBsZXRpb25DYWxsYmFjazwvbGluaz4iPgorPCFFTlRJVFkgamF4cnMuY29udGFpbmVyLkNvbm5lY3Rpb25DYWxsYmFjayAiPGxpbmsgeGxpbms6aHJlZj0nJmpheHJzLmphdmFkb2MudXJpOy9jb250YWluZXIvQ29ubmVjdGlvbkNhbGxiYWNrLmh0bWwnPkNvbm5lY3Rpb25DYWxsYmFjazwvbGluaz4iPgorPCFFTlRJVFkgamF4cnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RGaWx0ZXIgICI8bGluayB4bGluazpocmVmPScmamF4cnMuamF2YWRvYy51cmk7L2NvbnRhaW5lci9Db250YWluZXJSZXF1ZXN0RmlsdGVyLmh0bWwnPkNvbnRhaW5lclJlcXVlc3RGaWx0ZXI8L2xpbms+Ij4KKzwhRU5USVRZIGpheHJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUZpbHRlciAiPGxpbmsgeGxpbms6aHJlZj0nJmpheHJzLmphdmFkb2MudXJpOy9jb250YWluZXIvQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXIuaHRtbCc+Q29udGFpbmVyUmVzcG9uc2VGaWx0ZXI8L2xpbms+Ij4KKzwhRU5USVRZIGpheHJzLmNvbnRhaW5lci5EeW5hbWljRmVhdHVyZSAiPGxpbmsgeGxpbms6aHJlZj0nJmpheHJzLmphdmFkb2MudXJpOy9jb250YWluZXIvRHluYW1pY0ZlYXR1cmUuaHRtbCc+RHluYW1pY0ZlYXR1cmU8L2xpbms+Ij4KKzwhRU5USVRZIGpheHJzLmNvbnRhaW5lci5SZXNvdXJjZUluZm8gIjxsaW5rIHhsaW5rOmhyZWY9JyZqYXhycy5qYXZhZG9jLnVyaTsvY29udGFpbmVyL1Jlc291cmNlSW5mby5odG1sJz5SZXNvdXJjZUluZm88L2xpbms+Ij4KKzwhRU5USVRZIGpheHJzLmNvbnRhaW5lci5TdXNwZW5kZWQgIjxsaW5rIHhsaW5rOmhyZWY9JyZqYXhycy5qYXZhZG9jLnVyaTsvY29udGFpbmVyL1N1c3BlbmRlZC5odG1sJz5AU3VzcGVuZGVkPC9saW5rPiI+Cis8IUVOVElUWSBqYXhycy5jb3JlLkFwcGxpY2F0aW9uICI8bGluayB4bGluazpocmVmPScmamF4cnMuamF2YWRvYy51cmk7L2NvcmUvQXBwbGljYXRpb24uaHRtbCc+QXBwbGljYXRpb248L2xpbms+Ij4KKzwhRU5USVRZIGpheHJzLmNvcmUuQ2FjaGVDb250cm9sICI8bGluayB4bGluazpocmVmPScmamF4cnMuamF2YWRvYy51cmk7L2NvcmUvQ2FjaGVDb250cm9sLmh0bWwnPkNhY2hlQ29udHJvbDwvbGluaz4iPgorPCFFTlRJVFkgamF4cnMuY29yZS5Db25maWd1cmFibGUgIjxsaW5rIHhsaW5rOmhyZWY9JyZqYXhycy5qYXZhZG9jLnVyaTsvY29yZS9Db25maWd1cmFibGUuaHRtbCc+Q29uZmlndXJhYmxlPC9saW5rPiI+Cis8IUVOVElUWSBqYXhycy5jb3JlLkNvbmZpZ3VyYWJsZSAiPGxpbmsgeGxpbms6aHJlZj0nJmpheHJzLmphdmFkb2MudXJpOy9jb3JlL0NvbmZpZ3VyYWJsZS5odG1sJz5Db25maWd1cmFibGU8L2xpbms+Ij4KKzwhRU5USVRZIGpheHJzLmNvcmUuQ29uZmlndXJhdGlvbiAiPGxpbmsgeGxpbms6aHJlZj0nJmpheHJzLmphdmFkb2MudXJpOy9jb3JlL0NvbmZpZ3VyYXRpb24uaHRtbCc+Q29uZmlndXJhdGlvbjwvbGluaz4iPgorPCFFTlRJVFkgamF4cnMuY29yZS5Db250ZXh0ICI8bGluayB4bGluazpocmVmPScmamF4cnMuamF2YWRvYy51cmk7L2NvcmUvQ29udGV4dC5odG1sJz5AQ29udGV4dDwvbGluaz4iPgorPCFFTlRJVFkgamF4cnMuY29yZS5Db29raWUgIjxsaW5rIHhsaW5rOmhyZWY9JyZqYXhycy5qYXZhZG9jLnVyaTsvY29yZS9Db29raWUuaHRtbCc+Q29va2llPC9saW5rPiI+Cis8IUVOVElUWSBqYXhycy5jb3JlLkVudGl0eVRhZyAiPGxpbmsgeGxpbms6aHJlZj0nJmpheHJzLmphdmFkb2MudXJpOy9jb3JlL0VudGl0eVRhZy5odG1sJz5FbnRpdHlUYWc8L2xpbms+Ij4KKzwhRU5USVRZIGpheHJzLmNvcmUuRmVhdHVyZSAiPGxpbmsgeGxpbms6aHJlZj0nJmpheHJzLmphdmFkb2MudXJpOy9jb3JlL0ZlYXR1cmUuaHRtbCc+RmVhdHVyZTwvbGluaz4iPgorPCFFTlRJVFkgamF4cnMuY29yZS5Gb3JtICI8bGluayB4bGluazpocmVmPScmamF4cnMuamF2YWRvYy51cmk7L2NvcmUvRm9ybS5odG1sJz5Gb3JtPC9saW5rPiI+Cis8IUVOVElUWSBqYXhycy5jb3JlLkdlbmVyaWNFbnRpdHkgIjxsaW5rIHhsaW5rOmhyZWY9JyZqYXhycy5qYXZhZG9jLnVyaTsvY29yZS9HZW5lcmljRW50aXR5Lmh0bWwnPkdlbmVyaWNFbnRpdHkmbHQ7VCZndDs8L2xpbms+Ij4KKzwhRU5USVRZIGpheHJzLmNvcmUuR2VuZXJpY1R5cGUgIjxsaW5rIHhsaW5rOmhyZWY9JyZqYXhycy5qYXZhZG9jLnVyaTsvY29yZS9HZW5lcmljVHlwZS5odG1sJz5HZW5lcmljVHlwZSZsdDtUJmd0OzwvbGluaz4iPgorPCFFTlRJVFkgamF4cnMuY29yZS5IdHRwSGVhZGVycyAiPGxpbmsgeGxpbms6aHJlZj0nJmpheHJzLmphdmFkb2MudXJpOy9jb3JlL0h0dHBIZWFkZXJzLmh0bWwnPkh0dHBIZWFkZXJzPC9saW5rPiI+Cis8IUVOVElUWSBqYXhycy5jb3JlLkxpbmsgIjxsaW5rIHhsaW5rOmhyZWY9JyZqYXhycy5qYXZhZG9jLnVyaTsvY29yZS9MaW5rLmh0bWwnPkxpbms8L2xpbms+Ij4KKzwhRU5USVRZIGpheHJzLmNvcmUuTGluay5CdWlsZGVyICI8bGluayB4bGluazpocmVmPScmamF4cnMuamF2YWRvYy51cmk7L2NvcmUvTGluay5CdWlsZGVyLmh0bWwnPkxpbmsuQnVpbGRlcjwvbGluaz4iPgorPCFFTlRJVFkgamF4cnMuY29yZS5NZWRpYVR5cGUgIjxsaW5rIHhsaW5rOmhyZWY9JyZqYXhycy5qYXZhZG9jLnVyaTsvY29yZS9NZWRpYVR5cGUuaHRtbCc+TWVkaWFUeXBlPC9saW5rPiI+Cis8IUVOVElUWSBqYXhycy5jb3JlLk11bHRpdmFsdWVkTWFwICI8bGluayB4bGluazpocmVmPScmamF4cnMuamF2YWRvYy51cmk7L2NvcmUvTXVsdGl2YWx1ZWRNYXAuaHRtbCc+TXVsdGl2YWx1ZWRNYXAmbHQ7SyxWJmd0OzwvbGluaz4iPgorPCFFTlRJVFkgamF4cnMuY29yZS5OZXdDb29raWUgIjxsaW5rIHhsaW5rOmhyZWY9JyZqYXhycy5qYXZhZG9jLnVyaTsvY29yZS9OZXdDb29raWUuaHRtbCc+TmV3Q29va2llPC9saW5rPiI+Cis8IUVOVElUWSBqYXhycy5jb3JlLlBhdGhTZWdtZW50ICI8bGluayB4bGluazpocmVmPScmamF4cnMuamF2YWRvYy51cmk7L2NvcmUvUGF0aFNlZ21lbnQuaHRtbCc+UGF0aFNlZ21lbnQ8L2xpbms+Ij4KKzwhRU5USVRZIGpheHJzLmNvcmUuUmVxdWVzdCAiPGxpbmsgeGxpbms6aHJlZj0nJmpheHJzLmphdmFkb2MudXJpOy9jb3JlL1JlcXVlc3QuaHRtbCc+UmVxdWVzdDwvbGluaz4iPgorPCFFTlRJVFkgamF4cnMuY29yZS5SZXNwb25zZSAiPGxpbmsgeGxpbms6aHJlZj0nJmpheHJzLmphdmFkb2MudXJpOy9jb3JlL1Jlc3BvbnNlLmh0bWwnPlJlc3BvbnNlPC9saW5rPiI+Cis8IUVOVElUWSBqYXhycy5jb3JlLlJlc3BvbnNlLlJlc3BvbnNlQnVpbGRlciAiPGxpbmsgeGxpbms6aHJlZj0nJmpheHJzLmphdmFkb2MudXJpOy9jb3JlL1Jlc3BvbnNlLlJlc3BvbnNlQnVpbGRlci5odG1sJz5SZXNwb25zZS5SZXNwb25zZUJ1aWxkZXI8L2xpbms+Ij4KKzwhRU5USVRZIGpheHJzLmNvcmUuUmVzcG9uc2UuU3RhdHVzICI8bGluayB4bGluazpocmVmPScmamF4cnMuamF2YWRvYy51cmk7L2NvcmUvUmVzcG9uc2UuU3RhdHVzLmh0bWwnPlJlc3BvbnNlLlN0YXR1czwvbGluaz4iPgorPCFFTlRJVFkgamF4cnMuY29yZS5SZXNwb25zZS5TdGF0dXMuRmFtaWx5ICI8bGluayB4bGluazpocmVmPScmamF4cnMuamF2YWRvYy51cmk7L2NvcmUvUmVzcG9uc2UuU3RhdHVzLkZhbWlseS5odG1sJz5SZXNwb25zZS5TdGF0dXMuRmFtaWx5PC9saW5rPiI+Cis8IUVOVElUWSBqYXhycy5jb3JlLlJlc3BvbnNlLlN0YXR1c1R5cGUgIjxsaW5rIHhsaW5rOmhyZWY9JyZqYXhycy5qYXZhZG9jLnVyaTsvY29yZS9SZXNwb25zZS5TdGF0dXNUeXBlLmh0bWwnPlJlc3BvbnNlLlN0YXR1c1R5cGU8L2xpbms+Ij4KKzwhRU5USVRZIGpheHJzLmNvcmUuU2VjdXJpdHlDb250ZXh0ICI8bGluayB4bGluazpocmVmPScmamF4cnMuamF2YWRvYy51cmk7L2NvcmUvU2VjdXJpdHlDb250ZXh0Lmh0bWwnPlNlY3VyaXR5Q29udGV4dDwvbGluaz4iPgorPCFFTlRJVFkgamF4cnMuY29yZS5TdHJlYW1pbmdPdXRwdXQgIjxsaW5rIHhsaW5rOmhyZWY9JyZqYXhycy5qYXZhZG9jLnVyaTsvY29yZS9TdHJlYW1pbmdPdXRwdXQuaHRtbCc+U3RyZWFtaW5nT3V0cHV0PC9saW5rPiI+Cis8IUVOVElUWSBqYXhycy5jb3JlLlVyaUJ1aWxkZXIgIjxsaW5rIHhsaW5rOmhyZWY9JyZqYXhycy5qYXZhZG9jLnVyaTsvY29yZS9VcmlCdWlsZGVyLmh0bWwnPlVyaUJ1aWxkZXI8L2xpbms+Ij4KKzwhRU5USVRZIGpheHJzLmNvcmUuVXJpQnVpbGRlckV4Y2VwdGlvbiAiPGxpbmsgeGxpbms6aHJlZj0nJmpheHJzLmphdmFkb2MudXJpOy9jb3JlL1VyaUJ1aWxkZXJFeGNlcHRpb24uaHRtbCc+VXJpQnVpbGRlckV4Y2VwdGlvbjwvbGluaz4iPgorPCFFTlRJVFkgamF4cnMuY29yZS5VcmlJbmZvICI8bGluayB4bGluazpocmVmPScmamF4cnMuamF2YWRvYy51cmk7L2NvcmUvVXJpSW5mby5odG1sJz5VcmlJbmZvPC9saW5rPiI+Cis8IUVOVElUWSBqYXhycy5jb3JlLlZhcmlhbnQgIjxsaW5rIHhsaW5rOmhyZWY9JyZqYXhycy5qYXZhZG9jLnVyaTsvY29yZS9WYXJpYW50Lmh0bWwnPlZhcmlhbnQ8L2xpbms+Ij4KKzwhRU5USVRZIGpheHJzLmNvcmUuVmFyaWFudC5WYXJpYW50TGlzdEJ1aWxkZXIgIjxsaW5rIHhsaW5rOmhyZWY9JyZqYXhycy5qYXZhZG9jLnVyaTsvY29yZS9WYXJpYW50LlZhcmlhbnRMaXN0QnVpbGRlci5odG1sJz5WYXJpYW50LlZhcmlhbnRMaXN0QnVpbGRlcjwvbGluaz4iPgorPCFFTlRJVFkgamF4cnMuZXh0LkNvbnRleHRSZXNvbHZlciAiPGxpbmsgeGxpbms6aHJlZj0nJmpheHJzLmphdmFkb2MudXJpOy9leHQvQ29udGV4dFJlc29sdmVyLmh0bWwnPkNvbnRleHRSZXNvbHZlciZsdDtUJmd0OzwvbGluaz4iPgorPCFFTlRJVFkgamF4cnMuZXh0LkV4Y2VwdGlvbk1hcHBlciAiPGxpbmsgeGxpbms6aHJlZj0nJmpheHJzLmphdmFkb2MudXJpOy9leHQvRXhjZXB0aW9uTWFwcGVyLmh0bWwnPkV4Y2VwdGlvbk1hcHBlciZsdDtFIGV4dGVuZHMgVGhyb3dhYmxlJmd0OzwvbGluaz4iPgorPCFFTlRJVFkgamF4cnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyICI8bGluayB4bGluazpocmVmPScmamF4cnMuamF2YWRvYy51cmk7L2V4dC9NZXNzYWdlQm9keVJlYWRlci5odG1sJz5NZXNzYWdlQm9keVJlYWRlciZsdDtUJmd0OzwvbGluaz4iPgorPCFFTlRJVFkgamF4cnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyICI8bGluayB4bGluazpocmVmPScmamF4cnMuamF2YWRvYy51cmk7L2V4dC9NZXNzYWdlQm9keVdyaXRlci5odG1sJz5NZXNzYWdlQm9keVdyaXRlciZsdDtUJmd0OzwvbGluaz4iPgorPCFFTlRJVFkgamF4cnMuZXh0LlByb3ZpZGVyICI8bGluayB4bGluazpocmVmPScmamF4cnMuamF2YWRvYy51cmk7L2V4dC9Qcm92aWRlci5odG1sJz5AUHJvdmlkZXI8L2xpbms+Ij4KKzwhRU5USVRZIGpheHJzLmV4dC5Qcm92aWRlcnMgIjxsaW5rIHhsaW5rOmhyZWY9JyZqYXhycy5qYXZhZG9jLnVyaTsvZXh0L1Byb3ZpZGVycy5odG1sJz5Qcm92aWRlcnM8L2xpbms+Ij4KKzwhRU5USVRZIGpheHJzLmV4dC5SdW50aW1lRGVsZWdhdGUgIjxsaW5rIHhsaW5rOmhyZWY9JyZqYXhycy5qYXZhZG9jLnVyaTsvZXh0L1J1bnRpbWVEZWxlZ2F0ZS5odG1sJz5SdW50aW1lRGVsZWdhdGU8L2xpbms+Ij4KKzwhRU5USVRZIGpheHJzLmV4dC5SdW50aW1lRGVsZWdhdGUuSGVhZGVyRGVsZWdhdGUgIjxsaW5rIHhsaW5rOmhyZWY9JyZqYXhycy5qYXZhZG9jLnVyaTsvZXh0L1J1bnRpbWVEZWxlZ2F0ZS5IZWFkZXJEZWxlZ2F0ZS5odG1sJz5SdW50aW1lRGVsZWdhdGUuSGVhZGVyRGVsZWdhdGUmbHQ7VCZndDs8L2xpbms+Ij4KKzwhRU5USVRZIGpheHJzMjEuc3NlLlNzZUV2ZW50U2luayAiPGxpbmsgeGxpbms6aHJlZj0nJmpheHJzMjEuamF2YWRvYy51cmk7L3NzZS9Tc2VFdmVudFNpbmsuaHRtbCc+U3NlRXZlbnRTaW5rPC9saW5rPiI+Cis8IUVOVElUWSBqYXhyczIxLnNzZS5Tc2UgIjxsaW5rIHhsaW5rOmhyZWY9JyZqYXhyczIxLmphdmFkb2MudXJpOy9zc2UvU3NlLmh0bWwnPlNzZTwvbGluaz4iPgorCis8IUVOVElUWSBqZGs2LkJvb2xlYW4gIjxsaW5rIHhsaW5rOmhyZWY9JyZqZGs2LmphdmFkb2MudXJpOy9qYXZhL2xhbmcvQm9vbGVhbi5odG1sJz5Cb29sZWFuPC9saW5rPiI+Cis8IUVOVElUWSBqZGs2LkNvdW50RG93bkxhdGNoICI8bGluayB4bGluazpocmVmPScmamRrNi5qYXZhZG9jLnVyaTsvamF2YS91dGlsL2NvbmN1cnJlbnQvQ291bnREb3duTGF0Y2guaHRtbCc+Q291bnREb3duTGF0Y2g8L2xpbms+Ij4KKzwhRU5USVRZIGpkazYuQ2hhcmFjdGVyICI8bGluayB4bGluazpocmVmPScmamRrNi5qYXZhZG9jLnVyaTsvamF2YS9sYW5nL0NoYXJhY3Rlci5odG1sJz5DaGFyYWN0ZXI8L2xpbms+Ij4KKzwhRU5USVRZIGpkazYuRGF0YVNvdXJjZSAiPGxpbmsgeGxpbms6aHJlZj0nJmpkazYuamF2YWRvYy51cmk7L2phdmF4L2FjdGl2YXRpb24vRGF0YVNvdXJjZS5odG1sJz5EYXRhU291cmNlPC9saW5rPiI+Cis8IUVOVElUWSBqZGs2LkR5bmFtaWNNQmVhbiAiPGxpbmsgeGxpbms6aHJlZj0nJmpkazYuamF2YWRvYy51cmk7L2phdmF4L21hbmFnZW1lbnQvRHluYW1pY01CZWFuLmh0bWwnPkR5bmFtaWNNQmVhbjwvbGluaz4iPgorPCFFTlRJVFkgamRrNi5FeGVjdXRvclNlcnZpY2UgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZGs2LmphdmFkb2MudXJpOy9qYXZhL3V0aWwvY29uY3VycmVudC9FeGVjdXRvclNlcnZpY2UuaHRtbCc+RXhlY3V0b3JTZXJ2aWNlPC9saW5rPiI+Cis8IUVOVElUWSBqZGs2LkZpbGUgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZGs2LmphdmFkb2MudXJpOy9qYXZhL2lvL0ZpbGUuaHRtbCc+RmlsZTwvbGluaz4iPgorPCFFTlRJVFkgamRrNi5Ib3N0bmFtZVZlcmlmaWVyICI8bGluayB4bGluazpocmVmPScmamRrNi5qYXZhZG9jLnVyaTsvamF2YXgvbmV0L3NzbC9Ib3N0bmFtZVZlcmlmaWVyLmh0bWwnPkhvc3RuYW1lVmVyaWZpZXI8L2xpbms+Ij4KKzwhRU5USVRZIGpkazYuSHR0cFNlcnZlciAiPGxpbmsgeGxpbms6aHJlZj0naHR0cDovL2RvY3Mub3JhY2xlLmNvbS9qYXZhc2UvNi9kb2NzL2pyZS9hcGkvbmV0L2h0dHBzZXJ2ZXIvc3BlYy9jb20vc3VuL25ldC9odHRwc2VydmVyL0h0dHBTZXJ2ZXIuaHRtbCc+SHR0cFNlcnZlcjwvbGluaz4iPgorPCFFTlRJVFkgamRrNi5IdHRwVXJsQ29ubmVjdGlvbiAiPGxpbmsgeGxpbms6aHJlZj0nJmpkazYuamF2YWRvYy51cmk7L2phdmEvbmV0L0h0dHBVUkxDb25uZWN0aW9uLmh0bWwnPkh0dHBVUkxDb25uZWN0aW9uPC9saW5rPiI+Cis8IUVOVElUWSBqZGs2LklucHV0U3RyZWFtICI8bGluayB4bGluazpocmVmPScmamRrNi5qYXZhZG9jLnVyaTsvamF2YS9pby9JbnB1dFN0cmVhbS5odG1sJz5JbnB1dFN0cmVhbTwvbGluaz4iPgorPCFFTlRJVFkgamRrNi5KQVhCRWxlbWVudCAiPGxpbmsgeGxpbms6aHJlZj0nJmpkazYuamF2YWRvYy51cmk7L2phdmF4L3htbC9iaW5kL0pBWEJFbGVtZW50Lmh0bWwnPkpBWEJFbGVtZW50PC9saW5rPiI+Cis8IUVOVElUWSBqZGs2LktleVN0b3JlICI8bGluayB4bGluazpocmVmPScmamRrNi5qYXZhZG9jLnVyaTsvamF2YS9zZWN1cml0eS9LZXlTdG9yZS5odG1sJz5LZXlTdG9yZTwvbGluaz4iPgorPCFFTlRJVFkgamRrNi5OSU8gIjxsaW5rIHhsaW5rOmhyZWY9JyZqZGs2LmphdmFkb2MudXJpOy9qYXZhL25pby9wYWNrYWdlLXN1bW1hcnkuaHRtbCc+TklPPC9saW5rPiI+Cis8IUVOVElUWSBqZGs2Lk51bWJlciAiPGxpbmsgeGxpbms6aHJlZj0nJmpkazYuamF2YWRvYy51cmk7L2phdmEvbGFuZy9OdW1iZXIuaHRtbCc+TnVtYmVyPC9saW5rPiI+Cis8IUVOVElUWSBqZGs2Lk9iamVjdE5hbWUgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZGs2LmphdmFkb2MudXJpOy9qYXZheC9tYW5hZ2VtZW50L09iamVjdE5hbWUuaHRtbCc+T2JqZWN0TmFtZTwvbGluaz4iPgorPCFFTlRJVFkgamRrNi5QYXJhbWV0ZXJpemVkVHlwZSAiPGxpbmsgeGxpbms6aHJlZj0nJmpkazYuamF2YWRvYy51cmk7L2phdmEvbGFuZy9yZWZsZWN0L1BhcmFtZXRlcml6ZWRUeXBlLmh0bWwnPlBhcmFtZXRlcml6ZWRUeXBlPC9saW5rPiI+Cis8IUVOVElUWSBqZGs2LlJlYWRlciAiPGxpbmsgeGxpbms6aHJlZj0nJmpkazYuamF2YWRvYy51cmk7L2phdmEvaW8vUmVhZGVyLmh0bWwnPlJlYWRlcjwvbGluaz4iPgorPCFFTlRJVFkgamRrNi5Tb3VyY2UgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZGs2LmphdmFkb2MudXJpOy9qYXZheC94bWwvdHJhbnNmb3JtL1NvdXJjZS5odG1sJz5Tb3VyY2U8L2xpbms+Ij4KKzwhRU5USVRZIGpkazYuU3NsQ29udGV4dCAiPGxpbmsgeGxpbms6aHJlZj0nJmpkazYuamF2YWRvYy51cmk7L2phdmF4L25ldC9zc2wvU3NsQ29udGV4dC5odG1sJz5Tc2xDb250ZXh0PC9saW5rPiI+Cis8IUVOVElUWSBqZGs2LlN0cmluZyAiPGxpbmsgeGxpbms6aHJlZj0nJmpkazYuamF2YWRvYy51cmk7L2phdmEvaW8vU3RyaW5nLmh0bWwnPlN0cmluZzwvbGluaz4iPgorPCFFTlRJVFkgamRrNi5UcnVzdFN0b3JlICI8bGluayB4bGluazpocmVmPScmamRrNi5qYXZhZG9jLnVyaTsvamF2YS9zZWN1cml0eS9UcnVzdFN0b3JlLmh0bWwnPlRydXN0U3RvcmU8L2xpbms+Ij4KKzwhRU5USVRZIGpkazYuVVJJICI8bGluayB4bGluazpocmVmPScmamRrNi5qYXZhZG9jLnVyaTsvamF2YS9uZXQvVVJJLmh0bWwnPlVSSTwvbGluaz4iPgorCis8IUVOVElUWSBqZGs3LkRPTVNvdXJjZSAiPGxpbmsgeGxpbms6aHJlZj0nJmpkazcuamF2YWRvYy51cmk7L2phdmF4L3htbC90cmFuc2Zvcm0vZG9tL0RPTVNvdXJjZS5odG1sJz5ET01Tb3VyY2U8L2xpbms+Ij4KKzwhRU5USVRZIGpkazcuU0FYU291cmNlICI8bGluayB4bGluazpocmVmPScmamRrNy5qYXZhZG9jLnVyaTsvamF2YXgveG1sL3RyYW5zZm9ybS9zYXgvU0FYU291cmNlLmh0bWwnPlNBWFNvdXJjZTwvbGluaz4iPgorPCFFTlRJVFkgamRrNy5TdHJlYW1Tb3VyY2UgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZGs3LmphdmFkb2MudXJpOy9qYXZheC94bWwvdHJhbnNmb3JtL3N0cmVhbS9TdHJlYW1Tb3VyY2UuaHRtbCc+U3RyZWFtU291cmNlPC9saW5rPiI+Cis8IUVOVElUWSBqZGs3Lm9yZy53M2MuZG9tLkRvY3VtZW50ICI8bGluayB4bGluazpocmVmPScmamRrNy5qYXZhZG9jLnVyaTsvb3JnL3czYy9kb20vRG9jdW1lbnQuaHRtbCc+RG9jdW1lbnQ8L2xpbms+Ij4KKworPCFFTlRJVFkgamRrOC5Db21wbGV0YWJsZUZ1dHVyZSAiPGxpbmsgeGxpbms6aHJlZj0nJmpkazguamF2YWRvYy51cmk7L2phdmEvdXRpbC9jb25jdXJyZW50L0NvbXBsZXRhYmxlRnV0dXJlLmh0bWwnPkNvbXBsZXRhYmxlRnV0dXJlPC9saW5rPiI+Cis8IUVOVElUWSBqZGs4LkNvbXBsZXRpb25TdGFnZSAiPGxpbmsgeGxpbms6aHJlZj0nJmpkazguamF2YWRvYy51cmk7L2phdmEvdXRpbC9jb25jdXJyZW50L0NvbXBsZXRpb25TdGFnZS5odG1sJz5Db21wbGV0aW9uU3RhZ2U8L2xpbms+Ij4KKzwhRU5USVRZIGpkazguRXhlY3V0b3JzICI8bGluayB4bGluazpocmVmPScmamRrOC5qYXZhZG9jLnVyaTsvamF2YS91dGlsL2NvbmN1cnJlbnQvRXhlY3V0b3JzLmh0bWwnPkV4ZWN1dG9yczwvbGluaz4iPgorPCFFTlRJVFkgamRrOC5FeGVjdXRvcnMubmV3Q2FjaGVkVGhyZWFkUG9vbCAiPGxpbmsgeGxpbms6aHJlZj0nJmpkazguamF2YWRvYy51cmk7L2phdmEvdXRpbC9jb25jdXJyZW50L0V4ZWN1dG9ycy5odG1sI25ld0NhY2hlZFRocmVhZFBvb2wtLSc+RXhlY3V0b3JzI25ld0NhY2hlZFRocmVhZFBvb2woKTwvbGluaz4iPgorPCFFTlRJVFkgamRrOC5Gb3JrSm9pblBvb2wuY29tbW9uUG9vbCAiPGxpbmsgeGxpbms6aHJlZj0nJmpkazguamF2YWRvYy51cmk7L2phdmEvdXRpbC9jb25jdXJyZW50L0ZvcmtKb2luUG9vbC5odG1sI2NvbW1vblBvb2wtLSc+Rm9ya0pvaW5Qb29sI2NvbW1vblBvb2woKTwvbGluaz4iPgorPCFFTlRJVFkgamRrOC5TdHJlYW0gIjxsaW5rIHhsaW5rOmhyZWY9JyZqZGs4LmphdmFkb2MudXJpOy9qYXZhL3V0aWwvc3RyZWFtL1N0cmVhbS5odG1sJz5TdHJlYW08L2xpbms+Ij4KKworPCFFTlRJVFkgamVlNi5hbm5vdGF0aW9ucy5EZW55QWxsICI8bGluayB4bGluazpocmVmPScmamVlLmphdmFkb2MudXJpOy9qYXZheC9hbm5vdGF0aW9uL3NlY3VyaXR5L0RlbnlBbGwuaHRtbCc+QERlbnlBbGw8L2xpbms+Ij4KKzwhRU5USVRZIGplZTYuYW5ub3RhdGlvbnMuUGVybWl0QWxsICI8bGluayB4bGluazpocmVmPScmamVlLmphdmFkb2MudXJpOy9qYXZheC9hbm5vdGF0aW9uL3NlY3VyaXR5L1Blcm1pdEFsbC5odG1sJz5AUGVybWl0QWxsPC9saW5rPiI+Cis8IUVOVElUWSBqZWU2LmFubm90YXRpb25zLlJvbGVzQWxsb3dlZCAiPGxpbmsgeGxpbms6aHJlZj0nJmplZS5qYXZhZG9jLnVyaTsvamF2YXgvYW5ub3RhdGlvbi9zZWN1cml0eS9Sb2xlc0FsbG93ZWQuaHRtbCc+QFJvbGVzQWxsb3dlZDwvbGluaz4iPgorPCFFTlRJVFkgamVlNi5pbmplY3QuU2luZ2xldG9uICI8bGluayB4bGluazpocmVmPScmamVlLmphdmFkb2MudXJpOy9qYXZheC9pbmplY3QvU2luZ2xldG9uLmh0bWwnPkBTaW5nbGV0b248L2xpbms+Ij4KKzwhRU5USVRZIGplZTYuamF2YXguaW5qZWN0LkluamVjdCAiPGxpbmsgeGxpbms6aHJlZj0nJmplZS5qYXZhZG9jLnVyaTsvamF2YXgvaW5qZWN0L0luamVjdC5odG1sJz5ASW5qZWN0PC9saW5rPiI+Cis8IUVOVElUWSBqZWU2LmphdmF4LmluamVjdC5Qcm92aWRlciAiPGxpbmsgeGxpbms6aHJlZj0nJmplZS5qYXZhZG9jLnVyaTsvamF2YXgvaW5qZWN0L1Byb3ZpZGVyLmh0bWwnPlByb3ZpZGVyPC9saW5rPiI+Cis8IUVOVElUWSBqZWU2LmphdmF4LmluamVjdC5TaW5nbGV0b24gIjxsaW5rIHhsaW5rOmhyZWY9JyZqZWUuamF2YWRvYy51cmk7L2phdmF4L2luamVjdC9TaW5nbGV0b24uaHRtbCc+QFNpbmdsZXRvbjwvbGluaz4iPgorPCFFTlRJVFkgamVlNi5zZXJ2bGV0Lkh0dHBTZXJ2bGV0UmVxdWVzdCAiPGxpbmsgeGxpbms6aHJlZj0nJmplZS5qYXZhZG9jLnVyaTsvamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXJ2bGV0UmVxdWVzdC5odG1sJz5IdHRwU2VydmxldFJlcXVlc3Q8L2xpbms+Ij4KKzwhRU5USVRZIGplZTYuc2VydmxldC5IdHRwU2Vzc2lvbiAiPGxpbmsgeGxpbms6aHJlZj0nJmplZS5qYXZhZG9jLnVyaTsvamF2YXgvc2VydmxldC9odHRwL0h0dHBTZXNzaW9uLmh0bWwnPkh0dHBTZXNzaW9uPC9saW5rPiI+CisKKzwhRU5USVRZIGplZTYuamF2YXguZW50ZXJwcmlzZS5jb25jdXJyZW50Lk1hbmFnZWRFeGVjdXRvclNlcnZpY2UgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZWUuamF2YWRvYy51cmk7L2phdmF4L2VudGVycHJpc2UvY29uY3VycmVudC9NYW5hZ2VkRXhlY3V0b3JTZXJ2aWNlLmh0bWwnPk1hbmFnZWRFeGVjdXRvclNlcnZpY2U8L2xpbms+Ij4KKzwhRU5USVRZIGplZTYuamF2YXguZW50ZXJwcmlzZS5jb25jdXJyZW50Lk1hbmFnZWRTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZWUuamF2YWRvYy51cmk7L2phdmF4L2VudGVycHJpc2UvY29uY3VycmVudC9NYW5hZ2VkU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlLmh0bWwnPk1hbmFnZWRTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2U8L2xpbms+Ij4KKworPCFFTlRJVFkgamVyc2V5LmFwYWNoZS5BcGFjaGVDb25uZWN0b3JQcm92aWRlciAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L2FwYWNoZS9jb25uZWN0b3IvQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXIuaHRtbCc+QXBhY2hlQ29ubmVjdG9yUHJvdmlkZXI8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5jbGllbnQuQ2h1bmtQYXJzZXIgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9jbGllbnQvQ2h1bmtQYXJzZXIuaHRtbCc+Q2h1bmtQYXJzZXI8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5jbGllbnQuQ2h1bmtlZElucHV0ICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvY2xpZW50L0NodW5rZWRJbnB1dC5odG1sJz5DaHVua2VkSW5wdXQ8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5jbGllbnQuQ2xpZW50QXN5bmNFeGVjdXRvciAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L2NsaWVudC9DbGllbnRBc3luY0V4ZWN1dG9yLmh0bWwnPkBDbGllbnRBc3luY0V4ZWN1dG9yPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuY2xpZW50LkNsaWVudEFzeW5jRXhlY3V0b3JMaXRlcmFsICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvY2xpZW50L0NsaWVudEFzeW5jRXhlY3V0b3JMaXRlcmFsLmh0bWwnPkNsaWVudEFzeW5jRXhlY3V0b3JMaXRlcmFsPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZyAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L2NsaWVudC9DbGllbnRDb25maWcuaHRtbCc+Q2xpZW50Q29uZmlnPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXMgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9jbGllbnQvQ2xpZW50UHJvcGVydGllcy5odG1sJz5DbGllbnRQcm9wZXJ0aWVzPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXMuQVNZTkNfVEhSRUFEUE9PTF9TSVpFICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvY2xpZW50L0NsaWVudFByb3BlcnRpZXMuaHRtbCNBU1lOQ19USFJFQURQT09MX1NJWkUnPkNsaWVudFByb3BlcnRpZXMuQVNZTkNfVEhSRUFEUE9PTF9TSVpFPC9saW5rPiIgPgorPCFFTlRJVFkgamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzLkJVRkZFUl9SRVNQT05TRV9FTlRJVFlfT05fRVhDRVBUSU9OICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvY2xpZW50L0NsaWVudFByb3BlcnRpZXMuaHRtbCNCVUZGRVJfUkVTUE9OU0VfRU5USVRZX09OX0VYQ0VQVElPTic+Q2xpZW50UHJvcGVydGllcy5CVUZGRVJfUkVTUE9OU0VfRU5USVRZX09OX0VYQ0VQVElPTjwvbGluaz4iID4KKzwhRU5USVRZIGplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllcy5DSFVOS0VEX0VOQ09ESU5HX1NJWkUgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9jbGllbnQvQ2xpZW50UHJvcGVydGllcy5odG1sI0NIVU5LRURfRU5DT0RJTkdfU0laRSc+Q2xpZW50UHJvcGVydGllcy5DSFVOS0VEX0VOQ09ESU5HX1NJWkU8L2xpbms+IiA+Cis8IUVOVElUWSBqZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXMuQ09OTkVDVF9USU1FT1VUICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvY2xpZW50L0NsaWVudFByb3BlcnRpZXMuaHRtbCNDT05ORUNUX1RJTUVPVVQnPkNsaWVudFByb3BlcnRpZXMuQ09OTkVDVF9USU1FT1VUPC9saW5rPiIgPgorPCFFTlRJVFkgamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzLkRFRkFVTFRfQ0hVTktfU0laRSAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L2NsaWVudC9DbGllbnRQcm9wZXJ0aWVzLmh0bWwjREVGQVVMVF9DSFVOS19TSVpFJz5DbGllbnRQcm9wZXJ0aWVzLkRFRkFVTFRfQ0hVTktfU0laRTwvbGluaz4iID4KKzwhRU5USVRZIGplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllcy5GRUFUVVJFX0FVVE9fRElTQ09WRVJZX0RJU0FCTEUgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9jbGllbnQvQ2xpZW50UHJvcGVydGllcy5odG1sI0ZFQVRVUkVfQVVUT19ESVNDT1ZFUllfRElTQUJMRSc+Q2xpZW50UHJvcGVydGllcy5GRUFUVVJFX0FVVE9fRElTQ09WRVJZX0RJU0FCTEU8L2xpbms+IiA+Cis8IUVOVElUWSBqZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXMuRk9MTE9XX1JFRElSRUNUUyAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L2NsaWVudC9DbGllbnRQcm9wZXJ0aWVzLmh0bWwjRk9MTE9XX1JFRElSRUNUUyc+Q2xpZW50UHJvcGVydGllcy5GT0xMT1dfUkVESVJFQ1RTPC9saW5rPiIgPgorPCFFTlRJVFkgamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzLkpTT05fUFJPQ0VTU0lOR19GRUFUVVJFX0RJU0FCTEUgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9jbGllbnQvQ2xpZW50UHJvcGVydGllcy5odG1sI0pTT05fUFJPQ0VTU0lOR19GRUFUVVJFX0RJU0FCTEUnPkNsaWVudFByb3BlcnRpZXMuSlNPTl9QUk9DRVNTSU5HX0ZFQVRVUkVfRElTQUJMRTwvbGluaz4iID4KKzwhRU5USVRZIGplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllcy5NRVRBSU5GX1NFUlZJQ0VTX0xPT0tVUF9ESVNBQkxFICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvY2xpZW50L0NsaWVudFByb3BlcnRpZXMuaHRtbCNNRVRBSU5GX1NFUlZJQ0VTX0xPT0tVUF9ESVNBQkxFJz5DbGllbnRQcm9wZXJ0aWVzLk1FVEFJTkZfU0VSVklDRVNfTE9PS1VQX0RJU0FCTEU8L2xpbms+IiA+Cis8IUVOVElUWSBqZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXMuTU9YWV9KU09OX0ZFQVRVUkVfRElTQUJMRSAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L2NsaWVudC9DbGllbnRQcm9wZXJ0aWVzLmh0bWwjTU9YWV9KU09OX0ZFQVRVUkVfRElTQUJMRSc+Q2xpZW50UHJvcGVydGllcy5NT1hZX0pTT05fRkVBVFVSRV9ESVNBQkxFPC9saW5rPiIgPgorPCFFTlRJVFkgamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzLk9VVEJPVU5EX0NPTlRFTlRfTEVOR1RIX0JVRkZFUiAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L2NsaWVudC9DbGllbnRQcm9wZXJ0aWVzLmh0bWwjT1VUQk9VTkRfQ09OVEVOVF9MRU5HVEhfQlVGRkVSJz5DbGllbnRQcm9wZXJ0aWVzLk9VVEJPVU5EX0NPTlRFTlRfTEVOR1RIX0JVRkZFUjwvbGluaz4iID4KKzwhRU5USVRZIGplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllcy5QUk9YWV9QQVNTV09SRCAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L2NsaWVudC9DbGllbnRQcm9wZXJ0aWVzLmh0bWwjUFJPWFlfUEFTU1dPUkQnPkNsaWVudFByb3BlcnRpZXMuUFJPWFlfUEFTU1dPUkQ8L2xpbms+IiA+Cis8IUVOVElUWSBqZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXMuUFJPWFlfVVJJICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvY2xpZW50L0NsaWVudFByb3BlcnRpZXMuaHRtbCNQUk9YWV9VUkknPkNsaWVudFByb3BlcnRpZXMuUFJPWFlfVVJJPC9saW5rPiIgPgorPCFFTlRJVFkgamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzLlBST1hZX1VTRVJOQU1FICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvY2xpZW50L0NsaWVudFByb3BlcnRpZXMuaHRtbCNQUk9YWV9VU0VSTkFNRSc+Q2xpZW50UHJvcGVydGllcy5QUk9YWV9VU0VSTkFNRTwvbGluaz4iID4KKzwhRU5USVRZIGplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllcy5SRUFEX1RJTUVPVVQgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9jbGllbnQvQ2xpZW50UHJvcGVydGllcy5odG1sI1JFQURfVElNRU9VVCc+Q2xpZW50UHJvcGVydGllcy5SRUFEX1RJTUVPVVQ8L2xpbms+IiA+Cis8IUVOVElUWSBqZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXMuUkVRVUVTVF9FTlRJVFlfUFJPQ0VTU0lORyAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L2NsaWVudC9DbGllbnRQcm9wZXJ0aWVzLmh0bWwjUkVRVUVTVF9FTlRJVFlfUFJPQ0VTU0lORyc+Q2xpZW50UHJvcGVydGllcy5SRVFVRVNUX0VOVElUWV9QUk9DRVNTSU5HPC9saW5rPiIgPgorPCFFTlRJVFkgamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzLlNVUFBSRVNTX0hUVFBfQ09NUExJQU5DRV9WQUxJREFUSU9OICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvY2xpZW50L0NsaWVudFByb3BlcnRpZXMuaHRtbCNTVVBQUkVTU19IVFRQX0NPTVBMSUFOQ0VfVkFMSURBVElPTic+Q2xpZW50UHJvcGVydGllcy5TVVBQUkVTU19IVFRQX0NPTVBMSUFOQ0VfVkFMSURBVElPTjwvbGluaz4iID4KKzwhRU5USVRZIGplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllcy5VU0VfRU5DT0RJTkcgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9jbGllbnQvQ2xpZW50UHJvcGVydGllcy5odG1sI1VTRV9FTkNPRElORyc+Q2xpZW50UHJvcGVydGllcy5VU0VfRU5DT0RJTkc8L2xpbms+IiA+Cis8IUVOVElUWSBqZXJzZXkuY2xpZW50LkNsaWVudExpZmVjeWNsZUxpc3RlbmVyICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvY2xpZW50L0NsaWVudExpZmVjeWNsZUxpc3RlbmVyLmh0bWwnPkNsaWVudExpZmVjeWNsZUxpc3RlbmVyPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuY2xpZW50LkNvbm5lY3RvciAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L2NsaWVudC9zcGkvQ29ubmVjdG9yLmh0bWwnPkNvbm5lY3RvcjwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LmNsaWVudC5Db25uZWN0b3JQcm92aWRlciAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L2NsaWVudC9zcGkvQ29ubmVjdG9yUHJvdmlkZXIuaHRtbCc+Q29ubmVjdG9yUHJvdmlkZXI8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5jbGllbnQuQ3NyZlByb3RlY3Rpb25GaWx0ZXIgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9jbGllbnQvZmlsdGVyL0NzcmZQcm90ZWN0aW9uRmlsdGVyLmh0bWwnPkNzcmZQcm90ZWN0aW9uRmlsdGVyPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuY2xpZW50LkVuY29kaW5nRmVhdHVyZSAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L2NsaWVudC9maWx0ZXIvRW5jb2RpbmdGZWF0dXJlLmh0bWwnPkVuY29kaW5nRmVhdHVyZTwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LmNsaWVudC5FbmNvZGluZ0ZpbHRlciAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L2NsaWVudC9maWx0ZXIvRW5jb2RpbmdGaWx0ZXIuaHRtbCc+RW5jb2RpbmdGaWx0ZXI8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5jbGllbnQuSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZSAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L2NsaWVudC9hdXRoZW50aWNhdGlvbi9IdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLmh0bWwnPkh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmU8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5jbGllbnQuSHR0cFVybENvbm5lY3RvclByb3ZpZGVyICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvY2xpZW50L0h0dHBVcmxDb25uZWN0b3IuaHRtbCc+SHR0cFVybENvbm5lY3RvclByb3ZpZGVyPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuY2xpZW50Lkh0dHBVcmxDb25uZWN0b3JQcm92aWRlci5TRVRfTUVUSE9EX1dPUktBUk9VTkQgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9jbGllbnQvSHR0cFVybENvbm5lY3RvclByb3ZpZGVyLmh0bWwjU0VUX01FVEhPRF9XT1JLQVJPVU5EJz5IdHRwVXJsQ29ubmVjdG9yLlNFVF9NRVRIT0RfV09SS0FST1VORDwvbGluaz4iID4KKzwhRU5USVRZIGplcnNleS5jbGllbnQuSHR0cFVybENvbm5lY3RvclByb3ZpZGVyLlVTRV9GSVhFRF9MRU5HVEhfU1RSRUFNSU5HICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvY2xpZW50L0h0dHBVcmxDb25uZWN0b3JQcm92aWRlci5odG1sI1VTRV9GSVhFRF9MRU5HVEhfU1RSRUFNSU5HJz5IdHRwVXJsQ29ubmVjdG9yUHJvdmlkZXIuVVNFX0ZJWEVEX0xFTkdUSF9TVFJFQU1JTkc8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5jbGllbnQuU2VydmljZUxvY2F0b3JDbGllbnRQcm92aWRlciAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L2NsaWVudC9TZXJ2aWNlTG9jYXRvckNsaWVudFByb3ZpZGVyLmh0bWwnPlNlcnZpY2VMb2NhdG9yQ2xpZW50UHJvdmlkZXI8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5jbGllbnQub2F1dGgxLkFjY2Vzc1Rva2VuICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvY2xpZW50L29hdXRoMS9BY2Nlc3NUb2tlbi5odG1sJz5BY2Nlc3NUb2tlbjwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LmNsaWVudC5vYXV0aDEuQ29uc3VtZXJDcmVkZW50aWFscyAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L2NsaWVudC9vYXV0aDEvQ29uc3VtZXJDcmVkZW50aWFscy5odG1sJz5Db25zdW1lckNyZWRlbnRpYWxzPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuY2xpZW50Lm9hdXRoMS5PQXV0aDFBdXRob3JpemF0aW9uRmxvdyAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L2NsaWVudC9vYXV0aDEvT0F1dGgxQXV0aG9yaXphdGlvbkZsb3cuaHRtbCc+T0F1dGgxQXV0aG9yaXphdGlvbkZsb3c8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5jbGllbnQub2F1dGgxLk9BdXRoMUJ1aWxkZXIgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9jbGllbnQvb2F1dGgxL09BdXRoMUJ1aWxkZXIuaHRtbCc+T0F1dGgxQnVpbGRlcjwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LmNsaWVudC5vYXV0aDEuT0F1dGgxQ2xpZW50U3VwcG9ydCAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L2NsaWVudC9vYXV0aDEvT0F1dGgxQ2xpZW50U3VwcG9ydC5odG1sJz5PQXV0aDFDbGllbnRTdXBwb3J0PC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuY2xpZW50Lm9hdXRoMi5DbGllbnRJZGVudGlmaWVyICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvY2xpZW50L29hdXRoMi9DbGllbnRJZGVudGlmaWVyLmh0bWwnPkNsaWVudElkZW50aWZpZXI8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5jbGllbnQub2F1dGgyLk9BdXRoMkNsaWVudFN1cHBvcnQgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9jbGllbnQvb2F1dGgyL09BdXRoMkNsaWVudFN1cHBvcnQuaHRtbCc+T0F1dGgyQ2xpZW50U3VwcG9ydDwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LmNsaWVudC5vYXV0aDIuT0F1dGgyQ29kZUdyYW50RmxvdyAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L2NsaWVudC9vYXV0aDIvT0F1dGgyQ29kZUdyYW50Rmxvdy5odG1sJz5PQXV0aDJDb2RlR3JhbnRGbG93PC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuY2xpZW50Lm9hdXRoMi5PQXV0aDJGbG93R29vZ2xlQnVpbGRlciAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L2NsaWVudC9vYXV0aDIvT0F1dGgyRmxvd0dvb2dsZUJ1aWxkZXIuaHRtbCc+T0F1dGgyRmxvd0dvb2dsZUJ1aWxkZXI8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5jbGllbnQub2F1dGgyLk9BdXRoMlBhcmFtZXRlcnMgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9jbGllbnQvb2F1dGgyL09BdXRoMlBhcmFtZXRlcnMuaHRtbCc+T0F1dGgyUGFyYW1ldGVyczwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LmNsaWVudC5vYXV0aDIuVG9rZW5SZXN1bHQgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9jbGllbnQvb2F1dGgyL1Rva2VuUmVzdWx0Lmh0bWwnPlRva2VuUmVzdWx0PC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuY29tbW9uLkJldGEgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9CZXRhLmh0bWwnPkJldGE8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5jb21tb24uQ29tbW9uUHJvcGVydGllcyAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L0NvbW1vblByb3BlcnRpZXMuaHRtbCc+Q29tbW9uUHJvcGVydGllczwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LmNvbW1vbi5Db21tb25Qcm9wZXJ0aWVzLkZFQVRVUkVfQVVUT19ESVNDT1ZFUllfRElTQUJMRSAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L0NvbW1vblByb3BlcnRpZXMuaHRtbCNGRUFUVVJFX0FVVE9fRElTQ09WRVJZX0RJU0FCTEUnPkNvbW1vblByb3BlcnRpZXMuRkVBVFVSRV9BVVRPX0RJU0NPVkVSWV9ESVNBQkxFPC9saW5rPiIgPgorPCFFTlRJVFkgamVyc2V5LmNvbW1vbi5Db21tb25Qcm9wZXJ0aWVzLkpTT05fUFJPQ0VTU0lOR19GRUFUVVJFX0RJU0FCTEUgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9Db21tb25Qcm9wZXJ0aWVzLmh0bWwjSlNPTl9QUk9DRVNTSU5HX0ZFQVRVUkVfRElTQUJMRSc+Q29tbW9uUHJvcGVydGllcy5KU09OX1BST0NFU1NJTkdfRkVBVFVSRV9ESVNBQkxFPC9saW5rPiIgPgorPCFFTlRJVFkgamVyc2V5LmNvbW1vbi5Db21tb25Qcm9wZXJ0aWVzLk1FVEFJTkZfU0VSVklDRVNfTE9PS1VQX0RJU0FCTEUgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9Db21tb25Qcm9wZXJ0aWVzLmh0bWwjTUVUQUlORl9TRVJWSUNFU19MT09LVVBfRElTQUJMRSc+Q29tbW9uUHJvcGVydGllcy5NRVRBSU5GX1NFUlZJQ0VTX0xPT0tVUF9ESVNBQkxFPC9saW5rPiIgPgorPCFFTlRJVFkgamVyc2V5LmNvbW1vbi5Db21tb25Qcm9wZXJ0aWVzLk1PWFlfSlNPTl9GRUFUVVJFX0RJU0FCTEUgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9Db21tb25Qcm9wZXJ0aWVzLmh0bWwjTU9YWV9KU09OX0ZFQVRVUkVfRElTQUJMRSc+Q29tbW9uUHJvcGVydGllcy5NT1hZX0pTT05fRkVBVFVSRV9ESVNBQkxFPC9saW5rPiIgPgorPCFFTlRJVFkgamVyc2V5LmNvbW1vbi5Db21tb25Qcm9wZXJ0aWVzLk9VVEJPVU5EX0NPTlRFTlRfTEVOR1RIX0JVRkZFUiAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L0NvbW1vblByb3BlcnRpZXMuaHRtbCNPVVRCT1VORF9DT05URU5UX0xFTkdUSF9CVUZGRVInPkNvbW1vblByb3BlcnRpZXMuT1VUQk9VTkRfQ09OVEVOVF9MRU5HVEhfQlVGRkVSPC9saW5rPiIgPgorPCFFTlRJVFkgamVyc2V5LmNvbW1vbi5pbnRlcm5hbC5pbmplY3QuRGlzcG9zYWJsZVN1cHBsaWVyICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvaW50ZXJuYWwvaW5qZWN0L0Rpc3Bvc2FibGVTdXBwbGllci5odG1sJz5EaXNwb3NhYmxlU3VwcGxpZXI8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5jb21tb24uaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXIgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9pbnRlcm5hbC9pbmplY3QvSW5qZWN0aW9uTWFuYWdlci5odG1sJz5JbmplY3Rpb25NYW5hZ2VyPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuY29tbW9uLmludGVybmFsLmluamVjdC5BYnN0cmFjdEJpbmRlciAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L2ludGVybmFsL2luamVjdC9BYnN0cmFjdEJpbmRlci5odG1sJz5BYnN0cmFjdEJpbmRlcjwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LmNvbW1vbi5pbnRlcm5hbC5pbmplY3QuQmluZGVyICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvaW50ZXJuYWwvaW5qZWN0L0JpbmRlci5odG1sJz5CaW5kZXI8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5jb21tb24uU2VydmljZUxvY2F0b3JQcm92aWRlciAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L1NlcnZpY2VMb2NhdG9yUHJvdmlkZXIuaHRtbCc+U2VydmljZUxvY2F0b3JQcm92aWRlcjwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LmNvbW1vbi5Tc2xDb25maWd1cmF0b3IgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9Tc2xDb25maWd1cmF0b3IuaHRtbCc+U3NsQ29uZmlndXJhdG9yPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuY29tbW9uLnNwaS5BYnN0cmFjdFRocmVhZFBvb2xQcm92aWRlciAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3NwaS9BYnN0cmFjdFRocmVhZFBvb2xQcm92aWRlci5odG1sPkFic3RyYWN0VGhyZWFkUG9vbFByb3ZpZGVyPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuY29tbW9uLnNwaS5Db250ZW50RW5jb2RlciAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3NwaS9Db250ZW50RW5jb2Rlci5odG1sJz5Db250ZW50RW5jb2RlcjwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LmNvbW1vbi5zcGkuRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXIgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zcGkvRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXIuaHRtbCc+RXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXI8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5jb21tb24uc3BpLlNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvc3BpL1NjaGVkdWxlZEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyLmh0bWwnPlNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuY29tbW9uLnNwaS5TY2hlZHVsZWRUaHJlYWRQb29sUHJvdmlkZXIgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zcGkvU2NoZWR1bGVkVGhyZWFkUG9vbFByb3ZpZGVyLmh0bWw+U2NoZWR1bGVkVGhyZWFkUG9vbFByb3ZpZGVyPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuY29tbW9uLnNwaS5UaHJlYWRQb29sUHJvdmlkZXIgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zcGkvVGhyZWFkUG9vbFByb3ZpZGVyLmh0bWwnPlRocmVhZFBvb2xQcm92aWRlcjwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LmNvbW1vbi51cmkuVXJpVGVtcGxhdGUgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy91cmkvVXJpVGVtcGxhdGUuaHRtbCc+VXJpVGVtcGxhdGU8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5jb21tb24uSmVyc2V5UHJpb3JpdGllcy5KRVJTRVlfQVVUT19ESVNDT1ZFUkFCTEUgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9jb21tb24vSmVyc2V5UHJpb3JpdGllcy5odG1sI0pFUlNFWV9BVVRPX0RJU0NPVkVSQUJMRSc+SmVyc2V5UHJpb3JpdGllcy5KRVJTRVlfQVVUT19ESVNDT1ZFUkFCTEU8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5leHQuVmFsaWRhdGlvbkNvbmZpZyAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3NlcnZlci92YWxpZGF0aW9uL1ZhbGlkYXRpb25Db25maWcuaHRtbCc+VmFsaWRhdGlvbkNvbmZpZzwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LmV4dC5WYWxpZGF0aW9uRXJyb3IgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zZXJ2ZXIvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRXJyb3IuaHRtbCc+VmFsaWRhdGlvbkVycm9yPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuZXh0LlZhbGlkYXRpb25GZWF0dXJlICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvc2VydmVyL3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZlYXR1cmUuaHRtbCc+VmFsaWRhdGlvbkZlYXR1cmU8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5leHQucnguY2xpZW50LkFic3RyYWN0UnhJbnZva2VyICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvY2xpZW50L3J4L3NwaS9BYnN0cmFjdFJ4SW52b2tlci5odG1sJz5BYnN0cmFjdFJ4SW52b2tlcjwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LmV4dC5yeC5jbGllbnQuUnggIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9jbGllbnQvcngvUnguaHRtbCc+Ung8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5leHQucnguY2xpZW50LlJ4LmZyb21DbGllbnQgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9jbGllbnQvcngvUnguaHRtbCNmcm9tKGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQsIGphdmEubGFuZy5DbGFzcyknPlJ4LmZyb20oQ2xpZW50LENsYXNzKTwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LmV4dC5yeC5jbGllbnQuUnguZnJvbUNsaWVudEV4ZWN1dG9yICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvY2xpZW50L3J4L1J4Lmh0bWwjZnJvbShqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50LCBqYXZhLmxhbmcuQ2xhc3MsIGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZSknPlJ4LmZyb20oQ2xpZW50LENsYXNzLEV4ZWN1dG9yU2VydmljZSk8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5leHQucnguY2xpZW50LlJ4LmZyb21XZWJUYXJnZXQgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9jbGllbnQvcngvUnguaHRtbCNmcm9tKGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQsIGphdmEubGFuZy5DbGFzcyknPlJ4LmZyb20oV2ViVGFyZ2V0LENsYXNzKTwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LmV4dC5yeC5jbGllbnQuUnguZnJvbVdlYlRhcmdldEV4ZWN1dG9yICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvY2xpZW50L3J4L1J4Lmh0bWwjZnJvbShqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0LCBqYXZhLmxhbmcuQ2xhc3MsIGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZSknPlJ4LmZyb20oV2ViVGFyZ2V0LENsYXNzLEV4ZWN1dG9yU2VydmljZSk8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5leHQucnguY2xpZW50LlJ4Lm5ld0NsaWVudCAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L2NsaWVudC9yeC9SeC5odG1sI25ld0NsaWVudChqYXZhLmxhbmcuQ2xhc3MpJz5SeC5uZXdDbGllbnQoQ2xhc3MpPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuZXh0LnJ4LmNsaWVudC5SeC5uZXdDbGllbnRFeGVjdXRvciAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L2NsaWVudC9yeC9SeC5odG1sI25ld0NsaWVudChqYXZhLmxhbmcuQ2xhc3MsIGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZSknPlJ4Lm5ld0NsaWVudChDbGFzcyxFeGVjdXRvclNlcnZpY2UpPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuZXh0LnJ4LmNsaWVudC5SeENsaWVudCAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L2NsaWVudC9yeC9SeENsaWVudC5odG1sJz5SeENsaWVudDwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LmV4dC5yeC5jbGllbnQuUnhJbnZvY2F0aW9uQnVpbGRlciAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L2NsaWVudC9yeC9SeEludm9jYXRpb25CdWlsZGVyLmh0bWwnPlJ4SW52b2NhdGlvbkJ1aWxkZXI8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5leHQucnguY2xpZW50LlJ4SW52b2tlciAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L2NsaWVudC9yeC9SeEludm9rZXIuaHRtbCc+UnhJbnZva2VyPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuZXh0LnJ4LmNsaWVudC5SeEludm9rZXJQcm92aWRlciAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L2NsaWVudC9yeC9zcGkvUnhJbnZva2VyUHJvdmlkZXIuaHRtbCc+UnhJbnZva2VyUHJvdmlkZXI8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5leHQucnguY2xpZW50LlJ4V2ViVGFyZ2V0ICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvY2xpZW50L3J4L1J4V2ViVGFyZ2V0Lmh0bWwnPlJ4V2ViVGFyZ2V0PC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuZXh0LnJ4LmNsaWVudC5ndWF2YS5SeExpc3RlbmFibGVGdXR1cmUgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9jbGllbnQvcngvZ3VhdmEvUnhMaXN0ZW5hYmxlRnV0dXJlLmh0bWwnPlJ4TGlzdGVuYWJsZUZ1dHVyZTwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LmV4dC5yeC5jbGllbnQuZ3VhdmEuUnhMaXN0ZW5hYmxlRnV0dXJlSW52b2tlciAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L2NsaWVudC9yeC9ndWF2YS9SeExpc3RlbmFibGVGdXR1cmVJbnZva2VyLmh0bWwnPlJ4TGlzdGVuYWJsZUZ1dHVyZUludm9rZXI8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5leHQucnguY2xpZW50LmphdmE4LlJ4Q29tcGxldGlvblN0YWdlICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvY2xpZW50L3J4L2phdmE4L1J4Q29tcGxldGlvblN0YWdlLmh0bWwnPlJ4Q29tcGxldGlvblN0YWdlPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuZXh0LnJ4LmNsaWVudC5qYXZhOC5SeENvbXBsZXRpb25TdGFnZUludm9rZXIgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9jbGllbnQvcngvamF2YTgvUnhDb21wbGV0aW9uU3RhZ2VJbnZva2VyLmh0bWwnPlJ4Q29tcGxldGlvblN0YWdlSW52b2tlcjwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LmV4dC5yeC5jbGllbnQuanNyMTY2ZS5SeENvbXBsZXRhYmxlRnV0dXJlICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvY2xpZW50L3J4L2pzcjE2NmUvUnhDb21wbGV0YWJsZUZ1dHVyZS5odG1sJz5SeENvbXBsZXRhYmxlRnV0dXJlPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuZXh0LnJ4LmNsaWVudC5qc3IxNjZlLlJ4Q29tcGxldGFibGVGdXR1cmVJbnZva2VyICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvY2xpZW50L3J4L2pzcjE2NmUvUnhDb21wbGV0YWJsZUZ1dHVyZUludm9rZXIuaHRtbCc+UnhDb21wbGV0YWJsZUZ1dHVyZUludm9rZXI8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5leHQucnguY2xpZW50LnJ4amF2YS5SeE9ic2VydmFibGVJbnZva2VyICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvY2xpZW50L3J4L3J4amF2YS9SeE9ic2VydmFibGVJbnZva2VyLmh0bWwnPlJ4T2JzZXJ2YWJsZUludm9rZXI8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5leHQucnguY2xpZW50LnJ4amF2YTIuUnhGbG93YWJsZUludm9rZXIgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9jbGllbnQvcngvcnhqYXZhMi9SeEZsb3dhYmxlSW52b2tlci5odG1sJz5SeEZsb3dhYmxlSW52b2tlcjwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LmV4dC5jZGkxeC5zcGkuSGsyQ3VzdG9tQm91bmRUeXBlc1Byb3ZpZGVyICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvZXh0L2NkaTF4L3NwaS9IazJDdXN0b21Cb3VuZFR5cGVzUHJvdmlkZXIuaHRtbCc+SGsyQ3VzdG9tQm91bmRUeXBlc1Byb3ZpZGVyPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuZ3JpenpseS5Hcml6emx5Q29ubmVjdG9yUHJvdmlkZXIgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9ncml6emx5L2Nvbm5lY3Rvci9Hcml6emx5Q29ubmVjdG9yUHJvdmlkZXIuaHRtbCc+R3JpenpseUNvbm5lY3RvclByb3ZpZGVyPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuZ3JpenpseS5Hcml6emx5SHR0cENvbnRhaW5lciAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L2dyaXp6bHkyL2h0dHBzZXJ2ZXIvR3JpenpseUh0dHBDb250YWluZXIuaHRtbCc+R3JpenpseUh0dHBDb250YWluZXI8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5ncml6emx5LkdyaXp6bHlIdHRwQ29udGFpbmVyUHJvdmlkZXIgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9ncml6emx5Mi9odHRwc2VydmVyL0dyaXp6bHlIdHRwQ29udGFpbmVyUHJvdmlkZXIuaHRtbCc+R3JpenpseUh0dHBDb250YWluZXJQcm92aWRlcjwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LmdyaXp6bHkuR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5ICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvZ3JpenpseTIvaHR0cHNlcnZlci9Hcml6emx5SHR0cFNlcnZlckZhY3RvcnkuaHRtbCc+R3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5PC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuZ3JpenpseS5Hcml6emx5V2ViQ29udGFpbmVyRmFjdG9yeSAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L2dyaXp6bHkyL3NlcnZsZXQvR3JpenpseVdlYkNvbnRhaW5lckZhY3RvcnkuaHRtbCc+R3JpenpseVdlYkNvbnRhaW5lckZhY3Rvcnk8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5qZGtodHRwLkpka0h0dHBIYW5kbGVyQ29udGFpbmVyICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvamRraHR0cC9KZGtIdHRwSGFuZGxlckNvbnRhaW5lci5odG1sJz5KZGtIdHRwSGFuZGxlckNvbnRhaW5lcjwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5Lmpka2h0dHAuSmRrSHR0cEhhbmRsZXJDb250YWluZXJQcm92aWRlciAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L2pka2h0dHAvSmRrSHR0cEhhbmRsZXJDb250YWluZXJQcm92aWRlci5odG1sJz5KZGtIdHRwSGFuZGxlckNvbnRhaW5lclByb3ZpZGVyPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuamRraHR0cC5KZGtIdHRwU2VydmVyRmFjdG9yeSAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L2pka2h0dHAvSmRrSHR0cFNlcnZlckZhY3RvcnkuaHRtbCc+SmRrSHR0cFNlcnZlckZhY3Rvcnk8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5qZXR0eS5KZXR0eUNvbm5lY3RvclByb3ZpZGVyICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvamV0dHkvY29ubmVjdG9yL0pldHR5Q29ubmVjdG9yUHJvdmlkZXIuaHRtbCc+SmV0dHlDb25uZWN0b3JQcm92aWRlcjwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LmpldHR5LkpldHR5SHR0cENvbnRhaW5lciAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L2pldHR5L0pldHR5SHR0cENvbnRhaW5lci5odG1sJz5KZXR0eUh0dHBDb250YWluZXI8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5qZXR0eS5KZXR0eUh0dHBDb250YWluZXJGYWN0b3J5ICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvamV0dHkvSmV0dHlIdHRwQ29udGFpbmVyRmFjdG9yeS5odG1sJz5KZXR0eUh0dHBDb250YWluZXJGYWN0b3J5PC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuamV0dHkuSmV0dHlIdHRwQ29udGFpbmVyUHJvdmlkZXIgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9qZXR0eS9KZXR0eUh0dHBDb250YWluZXJQcm92aWRlci5odG1sJz5KZXR0eUh0dHBDb250YWluZXJQcm92aWRlcjwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LmpldHR5LkpldHR5V2ViQ29udGFpbmVyRmFjdG9yeSAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L2pldHR5L3NlcnZsZXQvSmV0dHlXZWJDb250YWluZXJGYWN0b3J5Lmh0bWwnPkpldHR5V2ViQ29udGFpbmVyRmFjdG9yeTwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LmpldHR5LkpldHR5Q2xpZW50UHJvcGVydGllcy5FTkFCTEVfU1NMX0hPU1ROQU1FX1ZFUklGSUNBVElPTiAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L2NsaWVudC9KZXR0eUNsaWVudFByb3BlcnRpZXMuaHRtbCNFTkFCTEVfU1NMX0hPU1ROQU1FX1ZFUklGSUNBVElPTic+SmV0dHlDbGllbnRQcm9wZXJ0aWVzLkVOQUJMRV9TU0xfSE9TVE5BTUVfVkVSSUZJQ0FUSU9OPC9saW5rPiIgPgorPCFFTlRJVFkgamVyc2V5LmxpbmtpbmcuRGVjbGFyYXRpdmVMaW5raW5nRmVhdHVyZSAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L2xpbmtpbmcvRGVjbGFyYXRpdmVMaW5raW5nRmVhdHVyZS5odG1sJz5EZWNsYXJhdGl2ZUxpbmtpbmdGZWF0dXJlPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZSAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L2xvZ2dpbmcvTG9nZ2luZ0ZlYXR1cmUuaHRtbCc+TG9nZ2luZ0ZlYXR1cmU8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlLkRFRkFVTFRfTE9HR0VSX05BTUUgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9sb2dnaW5nL0xvZ2dpbmdGZWF0dXJlLmh0bWwjREVGQVVMVF9MT0dHRVJfTkFNRSc+TG9nZ2luZ0ZlYXR1cmUuREVGQVVMVF9MT0dHRVJfTkFNRTwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmUuREVGQVVMVF9MT0dHRVJfTEVWRUwgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9sb2dnaW5nL0xvZ2dpbmdGZWF0dXJlLmh0bWwjREVGQVVMVF9MT0dHRVJfTEVWRUwnPkxvZ2dpbmdGZWF0dXJlLkRFRkFVTFRfTE9HR0VSX0xFVkVMPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZS5ERUZBVUxUX1ZFUkJPU0lUWSAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L2xvZ2dpbmcvTG9nZ2luZ0ZlYXR1cmUuaHRtbCNERUZBVUxUX1ZFUkJPU0lUWSc+TG9nZ2luZ0ZlYXR1cmUuREVGQVVMVF9WRVJCT1NJVFk8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlLkRFRkFVTFRfTUFYX0VOVElUWV9TSVpFICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvbG9nZ2luZy9Mb2dnaW5nRmVhdHVyZS5odG1sI0RFRkFVTFRfTUFYX0VOVElUWV9TSVpFJz5Mb2dnaW5nRmVhdHVyZS5ERUZBVUxUX01BWF9FTlRJVFlfU0laRTwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmUuTE9HR0lOR19GRUFUVVJFX0xPR0dFUl9OQU1FICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvbG9nZ2luZy9Mb2dnaW5nRmVhdHVyZS5odG1sI0xPR0dJTkdfRkVBVFVSRV9MT0dHRVJfTkFNRSc+TG9nZ2luZ0ZlYXR1cmUuTE9HR0lOR19GRUFUVVJFX0xPR0dFUl9OQU1FPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZS5MT0dHSU5HX0ZFQVRVUkVfTE9HR0VSX0xFVkVMICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvbG9nZ2luZy9Mb2dnaW5nRmVhdHVyZS5odG1sI0xPR0dJTkdfRkVBVFVSRV9MT0dHRVJfTEVWRUwnPkxvZ2dpbmdGZWF0dXJlLkxPR0dJTkdfRkVBVFVSRV9MT0dHRVJfTEVWRUw8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlLkxPR0dJTkdfRkVBVFVSRV9WRVJCT1NJVFkgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9sb2dnaW5nL0xvZ2dpbmdGZWF0dXJlLmh0bWwjTE9HR0lOR19GRUFUVVJFX1ZFUkJPU0lUWSc+TG9nZ2luZ0ZlYXR1cmUuTE9HR0lOR19GRUFUVVJFX1ZFUkJPU0lUWTwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmUuTE9HR0lOR19GRUFUVVJFX01BWF9FTlRJVFlfU0laRSAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L2xvZ2dpbmcvTG9nZ2luZ0ZlYXR1cmUuaHRtbCNMT0dHSU5HX0ZFQVRVUkVfTUFYX0VOVElUWV9TSVpFJz5Mb2dnaW5nRmVhdHVyZS5MT0dHSU5HX0ZFQVRVUkVfTUFYX0VOVElUWV9TSVpFPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZS5MT0dHSU5HX0ZFQVRVUkVfTE9HR0VSX05BTUVfQ0xJRU5UICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvbG9nZ2luZy9Mb2dnaW5nRmVhdHVyZS5odG1sI0xPR0dJTkdfRkVBVFVSRV9MT0dHRVJfTkFNRV9DTElFTlQnPkxvZ2dpbmdGZWF0dXJlLkxPR0dJTkdfRkVBVFVSRV9MT0dHRVJfTkFNRV9DTElFTlQ8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlLkxPR0dJTkdfRkVBVFVSRV9MT0dHRVJfTEVWRUxfQ0xJRU5UICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvbG9nZ2luZy9Mb2dnaW5nRmVhdHVyZS5odG1sI0xPR0dJTkdfRkVBVFVSRV9MT0dHRVJfTEVWRUxfQ0xJRU5UJz5Mb2dnaW5nRmVhdHVyZS5MT0dHSU5HX0ZFQVRVUkVfTE9HR0VSX0xFVkVMX0NMSUVOVDwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmUuTE9HR0lOR19GRUFUVVJFX1ZFUkJPU0lUWV9DTElFTlQgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9sb2dnaW5nL0xvZ2dpbmdGZWF0dXJlLmh0bWwjTE9HR0lOR19GRUFUVVJFX1ZFUkJPU0lUWV9DTElFTlQnPkxvZ2dpbmdGZWF0dXJlLkxPR0dJTkdfRkVBVFVSRV9WRVJCT1NJVFlfQ0xJRU5UPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZS5MT0dHSU5HX0ZFQVRVUkVfTUFYX0VOVElUWV9TSVpFX0NMSUVOVCAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L2xvZ2dpbmcvTG9nZ2luZ0ZlYXR1cmUuaHRtbCNMT0dHSU5HX0ZFQVRVUkVfTUFYX0VOVElUWV9TSVpFX0NMSUVOVCc+TG9nZ2luZ0ZlYXR1cmUuTE9HR0lOR19GRUFUVVJFX01BWF9FTlRJVFlfU0laRV9DTElFTlQ8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlLkxPR0dJTkdfRkVBVFVSRV9MT0dHRVJfTkFNRV9TRVJWRVIgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9sb2dnaW5nL0xvZ2dpbmdGZWF0dXJlLmh0bWwjTE9HR0lOR19GRUFUVVJFX0xPR0dFUl9OQU1FX1NFUlZFUic+TG9nZ2luZ0ZlYXR1cmUuTE9HR0lOR19GRUFUVVJFX0xPR0dFUl9OQU1FX1NFUlZFUjwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmUuTE9HR0lOR19GRUFUVVJFX0xPR0dFUl9MRVZFTF9TRVJWRVIgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9sb2dnaW5nL0xvZ2dpbmdGZWF0dXJlLmh0bWwjTE9HR0lOR19GRUFUVVJFX0xPR0dFUl9MRVZFTF9TRVJWRVInPkxvZ2dpbmdGZWF0dXJlLkxPR0dJTkdfRkVBVFVSRV9MT0dHRVJfTEVWRUxfU0VSVkVSPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZS5MT0dHSU5HX0ZFQVRVUkVfVkVSQk9TSVRZX1NFUlZFUiAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L2xvZ2dpbmcvTG9nZ2luZ0ZlYXR1cmUuaHRtbCNMT0dHSU5HX0ZFQVRVUkVfVkVSQk9TSVRZX1NFUlZFUic+TG9nZ2luZ0ZlYXR1cmUuTE9HR0lOR19GRUFUVVJFX1ZFUkJPU0lUWV9TRVJWRVI8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlLkxPR0dJTkdfRkVBVFVSRV9NQVhfRU5USVRZX1NJWkVfU0VSVkVSICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvbG9nZ2luZy9Mb2dnaW5nRmVhdHVyZS5odG1sI0xPR0dJTkdfRkVBVFVSRV9NQVhfRU5USVRZX1NJWkVfU0VSVkVSJz5Mb2dnaW5nRmVhdHVyZS5MT0dHSU5HX0ZFQVRVUkVfTUFYX0VOVElUWV9TSVpFX1NFUlZFUjwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmUuVmVyYm9zaXR5ICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvbG9nZ2luZy9Mb2dnaW5nRmVhdHVyZS5WZXJib3NpdHkuaHRtbCc+TG9nZ2luZ0ZlYXR1cmUuVmVyYm9zaXR5PC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZS5WZXJib3NpdHkuSEVBREVSU19PTkxZICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvbG9nZ2luZy9Mb2dnaW5nRmVhdHVyZS5WZXJib3NpdHkuaHRtbCNIRUFERVJTX09OTFknPkxvZ2dpbmdGZWF0dXJlLlZlcmJvc2l0eS5IRUFERVJTX09OTFk8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlLlZlcmJvc2l0eS5QQVlMT0FEX0FOWSAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L2xvZ2dpbmcvTG9nZ2luZ0ZlYXR1cmUuVmVyYm9zaXR5Lmh0bWwjUEFZTE9BRF9BTlknPkxvZ2dpbmdGZWF0dXJlLlZlcmJvc2l0eS5QQVlMT0FEX0FOWTwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmUuVmVyYm9zaXR5LlBBWUxPQURfVEVYVCAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L2xvZ2dpbmcvTG9nZ2luZ0ZlYXR1cmUuVmVyYm9zaXR5Lmh0bWwjUEFZTE9BRF9URVhUJz5Mb2dnaW5nRmVhdHVyZS5WZXJib3NpdHkuUEFZTE9BRF9URVhUPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkubWVkaWEuSmFja3NvbjFGZWF0dXJlICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvamFja3NvbjEvSmFja3NvbjFGZWF0dXJlLmh0bWwnPkphY2tzb24xRmVhdHVyZTwvbGluaz4iID4KKzwhRU5USVRZIGplcnNleS5tZWRpYS5KYWNrc29uRmVhdHVyZSAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L2phY2tzb24vSmFja3NvbkZlYXR1cmUuaHRtbCc+SmFja3NvbkZlYXR1cmU8L2xpbms+IiA+Cis8IUVOVElUWSBqZXJzZXkubWVkaWEuSmV0dGlzb25Db25maWcgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9qZXR0aXNvbi9KZXR0aXNvbkNvbmZpZy5odG1sJz5KZXR0aXNvbkNvbmZpZzwvbGluaz4iID4KKzwhRU5USVRZIGplcnNleS5tZWRpYS5KZXR0aXNvbkZlYXR1cmUgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9qZXR0aXNvbi9KZXR0aXNvbkZlYXR1cmUuaHRtbCc+SmV0dGlzb25GZWF0dXJlPC9saW5rPiIgPgorPCFFTlRJVFkgamVyc2V5Lm1lZGlhLkpldHRpc29uSmF4YkNvbnRleHQgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9qZXR0aXNvbi9KZXR0aXNvbkpheGJDb250ZXh0Lmh0bWwnPkpldHRpc29uSmF4YkNvbnRleHQ8L2xpbms+IiA+Cis8IUVOVElUWSBqZXJzZXkubWVkaWEuTW94eUpzb25Db25maWcgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9tb3h5L2pzb24vTW94eUpzb25Db25maWcuaHRtbCc+TW94eUpzb25Db25maWc8L2xpbms+IiA+Cis8IUVOVElUWSBqZXJzZXkubWVkaWEuTW94eUpzb25Db25maWcubWFyc2hhbGxlclByb3BlcnR5ICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvbW94eS9qc29uL01veHlKc29uQ29uZmlnLmh0bWwjbWFyc2hhbGxlclByb3BlcnR5KGphdmEubGFuZy5TdHJpbmcsIGphdmEubGFuZy5PYmplY3QpJz5Nb3h5SnNvbkNvbmZpZyNtYXJzaGFsbGVyUHJvcGVydHkoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCk8L2xpbms+IiA+Cis8IUVOVElUWSBqZXJzZXkubWVkaWEuTW94eUpzb25Db25maWcucHJvcGVydHkgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9tb3h5L2pzb24vTW94eUpzb25Db25maWcuaHRtbCNwcm9wZXJ0eShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KSc+TW94eUpzb25Db25maWcjcHJvcGVydHkoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCk8L2xpbms+IiA+Cis8IUVOVElUWSBqZXJzZXkubWVkaWEuTW94eUpzb25Db25maWcudW5tYXJzaGFsbGVyUHJvcGVydHkgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9tb3h5L2pzb24vTW94eUpzb25Db25maWcuaHRtbCN1bm1hcnNoYWxsZXJQcm9wZXJ0eShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KSc+TW94eUpzb25Db25maWcjdW5tYXJzaGFsbGVyUHJvcGVydHkoamF2YS5sYW5nLlN0cmluZywgamF2YS5sYW5nLk9iamVjdCk8L2xpbms+IiA+Cis8IUVOVElUWSBqZXJzZXkubWVkaWEuTW94eUpzb25GZWF0dXJlICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvbW94eS9qc29uL01veHlKc29uRmVhdHVyZS5odG1sJz5Nb3h5SnNvbkZlYXR1cmU8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5tZWRpYS5Nb3h5SnNvbkZlYXR1cmUgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9tb3h5L2pzb24vTW94eUpzb25GZWF0dXJlLmh0bWwnPk1veHlKc29uRmVhdHVyZTwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5Lm1lZGlhLk9iamVjdE1hcHBlciAiPGxpbmsgeGxpbms6aHJlZj0naHR0cDovL2Zhc3RlcnhtbC5naXRodWIuaW8vamFja3Nvbi1kYXRhYmluZC9qYXZhZG9jLyZqYWNrc29uLmphdmFkb2MudGVtcC52ZXJzaW9uOy9jb20vZmFzdGVyeG1sL2phY2tzb24vZGF0YWJpbmQvT2JqZWN0TWFwcGVyLmh0bWwnPk9iamVjdE1hcHBlcjwvbGluaz4iID4KKzwhRU5USVRZIGplcnNleS5tZWRpYS5PYmplY3RNYXBwZXIxICI8bGluayB4bGluazpocmVmPSdodHRwOi8vamFja3Nvbi5jb2RlaGF1cy5vcmcvMS45LjkvamF2YWRvYy9vcmcvY29kZWhhdXMvamFja3Nvbi9tYXAvT2JqZWN0TWFwcGVyLmh0bWwnPk9iamVjdE1hcHBlcjwvbGluaz4iID4gPCEtLSBvbGQgamFja3NvbiB2ZXJzaW9uIC0tPgorPCFFTlRJVFkgamVyc2V5Lm1lZGlhLm11bHRpcGFydCAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L21lZGlhL211bHRpcGFydC9wYWNrYWdlLXN1bW1hcnkuaHRtbCc+TXVsdGkgUGFydDwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5Lm1lZGlhLm11bHRpcGFydC5Cb2R5UGFydCAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L21lZGlhL211bHRpcGFydC9Cb2R5UGFydC5odG1sJz5Cb2R5UGFydDwvbGluaz4iID4KKzwhRU5USVRZIGplcnNleS5tZWRpYS5tdWx0aXBhcnQuRmlsZURhdGFCb2R5UGFydCAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L21lZGlhL211bHRpcGFydC9maWxlL0ZpbGVEYXRhQm9keVBhcnQuaHRtbCc+RmlsZURhdGFCb2R5UGFydDwvbGluaz4iID4KKzwhRU5USVRZIGplcnNleS5tZWRpYS5tdWx0aXBhcnQuRm9ybURhdGFNdWx0aVBhcnQgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9tZWRpYS9tdWx0aXBhcnQvRm9ybURhdGFNdWx0aVBhcnQuaHRtbCc+Rm9ybURhdGFNdWx0aVBhcnQ8L2xpbms+IiA+Cis8IUVOVElUWSBqZXJzZXkubWVkaWEubXVsdGlwYXJ0LkZvcm1EYXRhUGFyYW0gIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9tZWRpYS9tdWx0aXBhcnQvRm9ybURhdGFQYXJhbS5odG1sJz5ARm9ybURhdGFQYXJhbTwvbGluaz4iID4KKzwhRU5USVRZIGplcnNleS5tZWRpYS5tdWx0aXBhcnQuTXVsdGlQYXJ0ICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvbWVkaWEvbXVsdGlwYXJ0L011bHRpUGFydC5odG1sJz5NdWx0aVBhcnQ8L2xpbms+IiA+Cis8IUVOVElUWSBqZXJzZXkubWVkaWEubXVsdGlwYXJ0Lk11bHRpUGFydEZlYXR1cmUgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9tZWRpYS9tdWx0aXBhcnQvTXVsdGlQYXJ0RmVhdHVyZS5odG1sJz5NdWx0aVBhcnRGZWF0dXJlPC9saW5rPiIgPgorPCFFTlRJVFkgamVyc2V5Lm1lZGlhLm11bHRpcGFydC5TdHJlYW1EYXRhQm9keVBhcnQgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9tZWRpYS9tdWx0aXBhcnQvZmlsZS9TdHJlYW1EYXRhQm9keVBhcnQuaHRtbCc+U3RyZWFtRGF0YUJvZHlQYXJ0PC9saW5rPiIgPgorPCFFTlRJVFkgamVyc2V5Lm1lc3NhZ2UuTWVzc2FnZUJvZHlXb3JrZXJzICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvbWVzc2FnZS9NZXNzYWdlQm9keVdvcmtlcnMuaHRtbCc+TWVzc2FnZUJvZHlXb3JrZXJzPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkubWVzc2FnZS5NZXNzYWdlUHJvcGVydGllcyAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L21lc3NhZ2UvTWVzc2FnZVByb3BlcnRpZXMuaHRtbCc+TWVzc2FnZVByb3BlcnRpZXM8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5BYnN0cmFjdEVudGl0eVByb2Nlc3NvciAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L21lc3NhZ2UvZmlsdGVyaW5nL3NwaS9BYnN0cmFjdEVudGl0eVByb2Nlc3Nvci5odG1sJz5BYnN0cmFjdEVudGl0eVByb2Nlc3NvcjwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLkFic3RyYWN0T2JqZWN0UHJvdmlkZXIgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9tZXNzYWdlL2ZpbHRlcmluZy9zcGkvQWJzdHJhY3RPYmplY3RQcm92aWRlci5odG1sJz5BYnN0cmFjdE9iamVjdFByb3ZpZGVyPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuRW50aXR5RmlsdGVyaW5nICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvbWVzc2FnZS9maWx0ZXJpbmcvRW50aXR5RmlsdGVyaW5nLmh0bWwnPkBFbnRpdHlGaWx0ZXJpbmc8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5FbnRpdHlGaWx0ZXJpbmdGZWF0dXJlICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvbWVzc2FnZS9maWx0ZXJpbmcvRW50aXR5RmlsdGVyaW5nRmVhdHVyZS5odG1sJz5FbnRpdHlGaWx0ZXJpbmdGZWF0dXJlPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuRW50aXR5RmlsdGVyaW5nRmVhdHVyZS5FTlRJVFlfRklMVEVSSU5HX1NDT1BFICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvbWVzc2FnZS9maWx0ZXJpbmcvRW50aXR5RmlsdGVyaW5nRmVhdHVyZS5odG1sI0VOVElUWV9GSUxURVJJTkdfU0NPUEUnPkVudGl0eUZpbHRlcmluZ0ZlYXR1cmUuRU5USVRZX0ZJTFRFUklOR19TQ09QRTwvbGluaz4iID4KKzwhRU5USVRZIGplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5FbnRpdHlQcm9jZXNzb3IgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9tZXNzYWdlL2ZpbHRlcmluZy9zcGkvRW50aXR5UHJvY2Vzc29yLmh0bWwnPkVudGl0eVByb2Nlc3NvcjwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLk9iamVjdEdyYXBoVHJhbnNmb3JtZXIgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9tZXNzYWdlL2ZpbHRlcmluZy9zcGkvT2JqZWN0R3JhcGhUcmFuc2Zvcm1lci5odG1sJz5PYmplY3RHcmFwaFRyYW5zZm9ybWVyPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuT2JqZWN0UHJvdmlkZXIgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9tZXNzYWdlL2ZpbHRlcmluZy9zcGkvT2JqZWN0UHJvdmlkZXIuaHRtbCc+T2JqZWN0UHJvdmlkZXI8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5TY29wZVJlc29sdmVyICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvbWVzc2FnZS9maWx0ZXJpbmcvc3BpL1Njb3BlUmVzb2x2ZXIuaHRtbCc+U2NvcGVSZXNvbHZlcjwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLlNlY3VyaXR5QW5ub3RhdGlvbnMgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9tZXNzYWdlL2ZpbHRlcmluZy9TZWN1cml0eUFubm90YXRpb25zLmh0bWwnPlNlY3VyaXR5QW5ub3RhdGlvbnM8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5TZWN1cml0eUVudGl0eUZpbHRlcmluZ0ZlYXR1cmUgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9tZXNzYWdlL2ZpbHRlcmluZy9TZWN1cml0eUVudGl0eUZpbHRlcmluZ0ZlYXR1cmUuaHRtbCc+U2VjdXJpdHlFbnRpdHlGaWx0ZXJpbmdGZWF0dXJlPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuU2VsZWN0YWJsZUVudGl0eUZpbHRlcmluZ0ZlYXR1cmUgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9tZXNzYWdlL2ZpbHRlcmluZy9TZWxlY3RhYmxlRW50aXR5RmlsdGVyaW5nRmVhdHVyZS5odG1sJz5TZWxlY3RhYmxlRW50aXR5RmlsdGVyaW5nRmVhdHVyZTwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5Lm5ldHR5Lk5ldHR5Q29ubmVjdG9yUHJvdmlkZXIgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9uZXR0eS9jb25uZWN0b3IvTmV0dHlDb25uZWN0b3JQcm92aWRlci5odG1sJz5OZXR0eUNvbm5lY3RvclByb3ZpZGVyPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuamRrLkpka0Nvbm5lY3RvclByb3ZpZGVyCisgICAgICAgICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvamRrL2Nvbm5lY3Rvci9KZGtDb25uZWN0b3JQcm92aWRlci5odG1sJz5KZGtDb25uZWN0b3JQcm92aWRlcjwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXIgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zZXJ2ZXIvQXBwbGljYXRpb25IYW5kbGVyLmh0bWwnPkFwcGxpY2F0aW9uSGFuZGxlcjwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LnNlcnZlci5CYWNrZ3JvdW5kU2NoZWR1bGVyICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvc2VydmVyL0JhY2tncm91bmRTY2hlZHVsZXIuaHRtbCc+QEJhY2tncm91bmRTY2hlZHVsZXI8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5zZXJ2ZXIuQmFja2dyb3VuZFNjaGVkdWxlckxpdGVyYWwgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zZXJ2ZXIvQmFja2dyb3VuZFNjaGVkdWxlckxpdGVyYWwuaHRtbCc+QmFja2dyb3VuZFNjaGVkdWxlckxpdGVyYWw8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5zZXJ2ZXIuQnJvYWRjYXN0ZXIgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zZXJ2ZXIvQnJvYWRjYXN0ZXIuaHRtbCc+QnJvYWRjYXN0ZXI8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5zZXJ2ZXIuQnJvYWRjYXN0ZXJMaXN0ZW5lciAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3NlcnZlci9Ccm9hZGNhc3Rlckxpc3RlbmVyLmh0bWwnPkJyb2FkY2FzdGVyTGlzdGVuZXI8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5zZXJ2ZXIuQ2h1bmtlZE91dHB1dCAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3NlcnZlci9DaHVua2VkT3V0cHV0Lmh0bWwnPkNodW5rZWRPdXRwdXQ8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5zZXJ2ZXIuQ29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXIgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zZXJ2ZXIvc3BpL0NvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyLmh0bWwnPkNvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3QgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zZXJ2ZXIvQ29udGFpbmVyUmVxdWVzdC5odG1sJz5Db250YWluZXJSZXF1ZXN0PC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlc3BvbnNlICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvc2VydmVyL0NvbnRhaW5lclJlc3BvbnNlLmh0bWwnPkNvbnRhaW5lclJlc3BvbnNlPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuc2VydmVyLkV4dGVuZGVkUmVzb3VyY2UgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zZXJ2ZXIvbW9kZWwvRXh0ZW5kZWRSZXNvdXJjZS5odG1sJz5ARXh0ZW5kZWRSZXNvdXJjZTwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LnNlcnZlci5IdHRwTWV0aG9kT3ZlcnJpZGVGaWx0ZXIgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zZXJ2ZXIvZmlsdGVyL0h0dHBNZXRob2RPdmVycmlkZUZpbHRlci5odG1sJz5IdHRwTWV0aG9kT3ZlcnJpZGVGaWx0ZXI8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5zZXJ2ZXIuSlNPTlAgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zZXJ2ZXIvSlNPTlAuaHRtbCc+QEpTT05QPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuc2VydmVyLk1hbmFnZWRBc3luY0V4ZWN1dG9yICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvc2VydmVyL01hbmFnZWRBc3luY0V4ZWN1dG9yLmh0bWwnPkBNYW5hZ2VkQXN5bmNFeGVjdXRvcjwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LnNlcnZlci5NYW5hZ2VkQXN5bmNFeGVjdXRvckxpdGVyYWwgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zZXJ2ZXIvTWFuYWdlZEFzeW5jRXhlY3V0b3JMaXRlcmFsLmh0bWwnPk1hbmFnZWRBc3luY0V4ZWN1dG9yTGl0ZXJhbDwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LnNlcnZlci5Nb2RlbFByb2Nlc3NvciAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3NlcnZlci9tb2RlbC9Nb2RlbFByb2Nlc3Nvci5odG1sJz5Nb2RlbFByb2Nlc3NvcjwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LnNlcnZlci5SZXNvdXJjZSAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3NlcnZlci9tb2RlbC9SZXNvdXJjZS5odG1sJz5SZXNvdXJjZTwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LnNlcnZlci5SZXNvdXJjZS5nZXRQYXJlbnQgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zZXJ2ZXIvbW9kZWwvUmVzb3VyY2UuaHRtbCNnZXRQYXJlbnQoKSc+UmVzb3VyY2UuZ2V0UGFyZW50KCk8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWcgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zZXJ2ZXIvUmVzb3VyY2VDb25maWcuaHRtbCc+UmVzb3VyY2VDb25maWc8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5zZXJ2ZXIuUmVzb3VyY2VGaW5kZXIgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zZXJ2ZXIvUmVzb3VyY2VGaW5kZXIuaHRtbCc+UmVzb3VyY2VGaW5kZXI8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5zZXJ2ZXIuUmVzcG9uc2VFcnJvck1hcHBlciAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3NlcnZlci9zcGkvUmVzcG9uc2VFcnJvck1hcHBlci5odG1sJz5SZXNwb25zZUVycm9yTWFwcGVyPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuc2VydmVyLlJvbGVzQWxsb3dlZER5bmFtaWNGZWF0dXJlICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvc2VydmVyL2ZpbHRlci9Sb2xlc0FsbG93ZWREeW5hbWljRmVhdHVyZS5odG1sJz5Sb2xlc0FsbG93ZWREeW5hbWljRmVhdHVyZTwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvc2VydmVyL1NlcnZlclByb3BlcnRpZXMuaHRtbCc+U2VydmVyUHJvcGVydGllczwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzLkFQUExJQ0FUSU9OX05BTUUgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zZXJ2ZXIvU2VydmVyUHJvcGVydGllcy5odG1sI0FQUExJQ0FUSU9OX05BTUUnPlNlcnZlclByb3BlcnRpZXMuQVBQTElDQVRJT05fTkFNRTwvbGluaz4iID4KKzwhRU5USVRZIGplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcy5CVl9ESVNBQkxFX1ZBTElEQVRFX09OX0VYRUNVVEFCTEVfT1ZFUlJJREVfQ0hFQ0sgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zZXJ2ZXIvU2VydmVyUHJvcGVydGllcy5odG1sI0JWX0RJU0FCTEVfVkFMSURBVEVfT05fRVhFQ1VUQUJMRV9PVkVSUklERV9DSEVDSyc+U2VydmVyUHJvcGVydGllcy5CVl9ESVNBQkxFX1ZBTElEQVRFX09OX0VYRUNVVEFCTEVfT1ZFUlJJREVfQ0hFQ0s8L2xpbms+IiA+Cis8IUVOVElUWSBqZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMuQlZfRkVBVFVSRV9ESVNBQkxFICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvc2VydmVyL1NlcnZlclByb3BlcnRpZXMuaHRtbCNCVl9GRUFUVVJFX0RJU0FCTEUnPlNlcnZlclByb3BlcnRpZXMuQlZfRkVBVFVSRV9ESVNBQkxFPC9saW5rPiIgPgorPCFFTlRJVFkgamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzLkJWX1NFTkRfRVJST1JfSU5fUkVTUE9OU0UgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zZXJ2ZXIvU2VydmVyUHJvcGVydGllcy5odG1sI0JWX1NFTkRfRVJST1JfSU5fUkVTUE9OU0UnPlNlcnZlclByb3BlcnRpZXMuQlZfU0VORF9FUlJPUl9JTl9SRVNQT05TRTwvbGluaz4iID4KKzwhRU5USVRZIGplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcy5GRUFUVVJFX0FVVE9fRElTQ09WRVJZX0RJU0FCTEUgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zZXJ2ZXIvU2VydmVyUHJvcGVydGllcy5odG1sI0ZFQVRVUkVfQVVUT19ESVNDT1ZFUllfRElTQUJMRSc+U2VydmVyUHJvcGVydGllcy5GRUFUVVJFX0FVVE9fRElTQ09WRVJZX0RJU0FCTEU8L2xpbms+IiA+Cis8IUVOVElUWSBqZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMuSFRUUF9NRVRIT0RfT1ZFUlJJREUgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zZXJ2ZXIvU2VydmVyUHJvcGVydGllcy5odG1sI0hUVFBfTUVUSE9EX09WRVJSSURFJz5TZXJ2ZXJQcm9wZXJ0aWVzLkhUVFBfTUVUSE9EX09WRVJSSURFPC9saW5rPiIgPgorPCFFTlRJVFkgamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzLkpTT05fUFJPQ0VTU0lOR19GRUFUVVJFX0RJU0FCTEUgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zZXJ2ZXIvU2VydmVyUHJvcGVydGllcy5odG1sI0pTT05fUFJPQ0VTU0lOR19GRUFUVVJFX0RJU0FCTEUnPlNlcnZlclByb3BlcnRpZXMuSlNPTl9QUk9DRVNTSU5HX0ZFQVRVUkVfRElTQUJMRTwvbGluaz4iID4KKzwhRU5USVRZIGplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcy5MQU5HVUFHRV9NQVBQSU5HUyAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3NlcnZlci9TZXJ2ZXJQcm9wZXJ0aWVzLmh0bWwjTEFOR1VBR0VfTUFQUElOR1MnPlNlcnZlclByb3BlcnRpZXMuTEFOR1VBR0VfTUFQUElOR1M8L2xpbms+IiA+Cis8IUVOVElUWSBqZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMuTUVESUFfVFlQRV9NQVBQSU5HUyAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3NlcnZlci9TZXJ2ZXJQcm9wZXJ0aWVzLmh0bWwjTUVESUFfVFlQRV9NQVBQSU5HUyc+U2VydmVyUHJvcGVydGllcy5NRURJQV9UWVBFX01BUFBJTkdTPC9saW5rPiIgPgorPCFFTlRJVFkgamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzLk1FVEFJTkZfU0VSVklDRVNfTE9PS1VQX0RJU0FCTEUgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zZXJ2ZXIvU2VydmVyUHJvcGVydGllcy5odG1sI01FVEFJTkZfU0VSVklDRVNfTE9PS1VQX0RJU0FCTEUnPlNlcnZlclByb3BlcnRpZXMuTUVUQUlORl9TRVJWSUNFU19MT09LVVBfRElTQUJMRTwvbGluaz4iID4KKzwhRU5USVRZIGplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcy5NT05JVE9SSU5HX0VOQUJMRUQgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zZXJ2ZXIvU2VydmVyUHJvcGVydGllcy5odG1sI01PTklUT1JJTkdfRU5BQkxFRCc+U2VydmVyUHJvcGVydGllcy5NT05JVE9SSU5HX0VOQUJMRUQ8L2xpbms+IiA+Cis8IUVOVElUWSBqZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMuTU9OSVRPUklOR19TVEFUSVNUSUNTX0VOQUJMRUQgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zZXJ2ZXIvU2VydmVyUHJvcGVydGllcy5odG1sI01PTklUT1JJTkdfU1RBVElTVElDU19FTkFCTEVEJz5TZXJ2ZXJQcm9wZXJ0aWVzLk1PTklUT1JJTkdfU1RBVElTVElDU19FTkFCTEVEPC9saW5rPiIgPgorPCFFTlRJVFkgamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzLk1PTklUT1JJTkdfU1RBVElTVElDU19NQkVBTlNfRU5BQkxFRCAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3NlcnZlci9TZXJ2ZXJQcm9wZXJ0aWVzLmh0bWwjTU9OSVRPUklOR19TVEFUSVNUSUNTX01CRUFOU19FTkFCTEVEJz5TZXJ2ZXJQcm9wZXJ0aWVzLk1PTklUT1JJTkdfU1RBVElTVElDU19NQkVBTlNfRU5BQkxFRDwvbGluaz4iID4KKzwhRU5USVRZIGplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcy5NT05JVE9SSU5HX1NUQVRJU1RJQ1NfUkVGUkVTSF9JTlRFUlZBTCAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3NlcnZlci9TZXJ2ZXJQcm9wZXJ0aWVzLmh0bWwjTU9OSVRPUklOR19TVEFUSVNUSUNTX1JFRlJFU0hfSU5URVJWQUwnPlNlcnZlclByb3BlcnRpZXMuTU9OSVRPUklOR19TVEFUSVNUSUNTX1JFRlJFU0hfSU5URVJWQUw8L2xpbms+IiA+Cis8IUVOVElUWSBqZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMuTU9YWV9KU09OX0ZFQVRVUkVfRElTQUJMRSAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3NlcnZlci9TZXJ2ZXJQcm9wZXJ0aWVzLmh0bWwjTU9YWV9KU09OX0ZFQVRVUkVfRElTQUJMRSc+U2VydmVyUHJvcGVydGllcy5NT1hZX0pTT05fRkVBVFVSRV9ESVNBQkxFPC9saW5rPiIgPgorPCFFTlRJVFkgamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzLk9VVEJPVU5EX0NPTlRFTlRfTEVOR1RIX0JVRkZFUiAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3NlcnZlci9TZXJ2ZXJQcm9wZXJ0aWVzLmh0bWwjT1VUQk9VTkRfQ09OVEVOVF9MRU5HVEhfQlVGRkVSJz5TZXJ2ZXJQcm9wZXJ0aWVzLk9VVEJPVU5EX0NPTlRFTlRfTEVOR1RIX0JVRkZFUjwvbGluaz4iID4KKzwhRU5USVRZIGplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcy5QUk9DRVNTSU5HX1JFU1BPTlNFX0VSUk9SU19FTkFCTEVEICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvc2VydmVyL1NlcnZlclByb3BlcnRpZXMuaHRtbCNQUk9DRVNTSU5HX1JFU1BPTlNFX0VSUk9SU19FTkFCTEVEJz5TZXJ2ZXJQcm9wZXJ0aWVzLlBST0NFU1NJTkdfUkVTUE9OU0VfRVJST1JTX0VOQUJMRUQ8L2xpbms+IiA+Cis8IUVOVElUWSBqZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMuUFJPVklERVJfQ0xBU1NOQU1FUyAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3NlcnZlci9TZXJ2ZXJQcm9wZXJ0aWVzLmh0bWwjUFJPVklERVJfQ0xBU1NOQU1FUyc+U2VydmVyUHJvcGVydGllcy5QUk9WSURFUl9DTEFTU05BTUVTPC9saW5rPiIgPgorPCFFTlRJVFkgamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzLlBST1ZJREVSX0NMQVNTUEFUSCAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3NlcnZlci9TZXJ2ZXJQcm9wZXJ0aWVzLmh0bWwjUFJPVklERVJfQ0xBU1NQQVRIJz5TZXJ2ZXJQcm9wZXJ0aWVzLlBST1ZJREVSX0NMQVNTUEFUSDwvbGluaz4iID4KKzwhRU5USVRZIGplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcy5QUk9WSURFUl9QQUNLQUdFUyAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3NlcnZlci9TZXJ2ZXJQcm9wZXJ0aWVzLmh0bWwjUFJPVklERVJfUEFDS0FHRVMnPlNlcnZlclByb3BlcnRpZXMuUFJPVklERVJfUEFDS0FHRVM8L2xpbms+IiA+Cis8IUVOVElUWSBqZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMuUFJPVklERVJfU0NBTk5JTkdfUkVDVVJTSVZFICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvc2VydmVyL1NlcnZlclByb3BlcnRpZXMuaHRtbCNQUk9WSURFUl9TQ0FOTklOR19SRUNVUlNJVkUnPlNlcnZlclByb3BlcnRpZXMuUFJPVklERVJfU0NBTk5JTkdfUkVDVVJTSVZFPC9saW5rPiIgPgorPCFFTlRJVFkgamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzLlJFRFVDRV9DT05URVhUX1BBVEhfU0xBU0hFU19FTkFCTEVEICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvc2VydmVyL1NlcnZlclByb3BlcnRpZXMuaHRtbCNSRURVQ0VfQ09OVEVYVF9QQVRIX1NMQVNIRVNfRU5BQkxFRCc+U2VydmVyUHJvcGVydGllcy5SRURVQ0VfQ09OVEVYVF9QQVRIX1NMQVNIRVNfRU5BQkxFRDwvbGluaz4iID4KKzwhRU5USVRZIGplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcy5SRVNPVVJDRV9WQUxJREFUSU9OX0RJU0FCTEUgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zZXJ2ZXIvU2VydmVyUHJvcGVydGllcy5odG1sI1JFU09VUkNFX1ZBTElEQVRJT05fRElTQUJMRSc+U2VydmVyUHJvcGVydGllcy5SRVNPVVJDRV9WQUxJREFUSU9OX0RJU0FCTEU8L2xpbms+IiA+Cis8IUVOVElUWSBqZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMuUkVTT1VSQ0VfVkFMSURBVElPTl9JR05PUkVfRVJST1JTICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvc2VydmVyL1NlcnZlclByb3BlcnRpZXMuaHRtbCNSRVNPVVJDRV9WQUxJREFUSU9OX0lHTk9SRV9FUlJPUlMnPlNlcnZlclByb3BlcnRpZXMuUkVTT1VSQ0VfVkFMSURBVElPTl9JR05PUkVfRVJST1JTPC9saW5rPiIgPgorPCFFTlRJVFkgamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzLlJFU1BPTlNFX1NFVF9TVEFUVVNfT1ZFUl9TRU5EX0VSUk9SICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvc2VydmVyL1NlcnZlclByb3BlcnRpZXMuaHRtbCNSRVNQT05TRV9TRVRfU1RBVFVTX09WRVJfU0VORF9FUlJPUic+U2VydmVyUHJvcGVydGllcy5SRVNQT05TRV9TRVRfU1RBVFVTX09WRVJfU0VORF9FUlJPUjwvbGluaz4iID4KKzwhRU5USVRZIGplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcy5TVUJSRVNPVVJDRV9MT0NBVE9SX0NBQ0hFX1NJWkUgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zZXJ2ZXIvU2VydmVyUHJvcGVydGllcy5odG1sI1NVQlJFU09VUkNFX0xPQ0FUT1JfQ0FDSEVfU0laRSc+U2VydmVyUHJvcGVydGllcy5TVUJSRVNPVVJDRV9MT0NBVE9SX0NBQ0hFX1NJWkU8L2xpbms+IiA+Cis8IUVOVElUWSBqZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMuU1VCUkVTT1VSQ0VfTE9DQVRPUl9DQUNIRV9BR0UgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zZXJ2ZXIvU2VydmVyUHJvcGVydGllcy5odG1sI1NVQlJFU09VUkNFX0xPQ0FUT1JfQ0FDSEVfQUdFJz5TZXJ2ZXJQcm9wZXJ0aWVzLlNVQlJFU09VUkNFX0xPQ0FUT1JfQ0FDSEVfQUdFPC9saW5rPiIgPgorPCFFTlRJVFkgamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzLlNVQlJFU09VUkNFX0xPQ0FUT1JfQ0FDSEVfSkVSU0VZX1JFU09VUkNFX0VOQUJMRUQgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zZXJ2ZXIvU2VydmVyUHJvcGVydGllcy5odG1sI1NVQlJFU09VUkNFX0xPQ0FUT1JfQ0FDSEVfSkVSU0VZX1JFU09VUkNFX0VOQUJMRUQnPlNlcnZlclByb3BlcnRpZXMuU1VCUkVTT1VSQ0VfTE9DQVRPUl9DQUNIRV9KRVJTRVlfUkVTT1VSQ0VfRU5BQkxFRDwvbGluaz4iID4KKzwhRU5USVRZIGplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcy5UUkFDSU5HICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvc2VydmVyL1NlcnZlclByb3BlcnRpZXMuaHRtbCNUUkFDSU5HJz5TZXJ2ZXJQcm9wZXJ0aWVzLlRSQUNJTkc8L2xpbms+IiA+Cis8IUVOVElUWSBqZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMuVFJBQ0lOR19USFJFU0hPTEQgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zZXJ2ZXIvU2VydmVyUHJvcGVydGllcy5odG1sI1RSQUNJTkdfVEhSRVNIT0xEJz5TZXJ2ZXJQcm9wZXJ0aWVzLlRSQUNJTkdfVEhSRVNIT0xEPC9saW5rPiIgPgorPCFFTlRJVFkgamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzLldBRExfRkVBVFVSRV9ESVNBQkxFICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvc2VydmVyL1NlcnZlclByb3BlcnRpZXMuaHRtbCNXQURMX0ZFQVRVUkVfRElTQUJMRSc+U2VydmVyUHJvcGVydGllcy5XQURMX0ZFQVRVUkVfRElTQUJMRTwvbGluaz4iID4KKzwhRU5USVRZIGplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcy5XQURMX0dFTkVSQVRPUl9DT05GSUcgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zZXJ2ZXIvU2VydmVyUHJvcGVydGllcy5odG1sI1dBRExfR0VORVJBVE9SX0NPTkZJRyc+U2VydmVyUHJvcGVydGllcy5XQURMX0dFTkVSQVRPUl9DT05GSUc8L2xpbms+IiA+Cis8IUVOVElUWSBqZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMuTE9DQVRJT05fSEVBREVSX1JFTEFUSVZFX1VSSV9SRVNPTFVUSU9OX0RJU0FCTEVEICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvc2VydmVyL1NlcnZlclByb3BlcnRpZXMuaHRtbCNMT0NBVElPTl9IRUFERVJfUkVMQVRJVkVfVVJJX1JFU09MVVRJT05fRElTQUJMRUQnPlNlcnZlclByb3BlcnRpZXMuTE9DQVRJT05fSEVBREVSX1JFTEFUSVZFX1VSSV9SRVNPTFVUSU9OX0RJU0FCTEVEPC9saW5rPiIgPgorPCFFTlRJVFkgamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzLkxPQ0FUSU9OX0hFQURFUl9SRUxBVElWRV9VUklfUkVTT0xVVElPTl9SRkM3MjMxICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvc2VydmVyL1NlcnZlclByb3BlcnRpZXMuaHRtbCNMT0NBVElPTl9IRUFERVJfUkVMQVRJVkVfVVJJX1JFU09MVVRJT05fUkZDNzIzMSc+U2VydmVyUHJvcGVydGllcy5MT0NBVElPTl9IRUFERVJfUkVMQVRJVkVfVVJJX1JFU09MVVRJT05fUkZDNzIzMTwvbGluaz4iID4KKzwhRU5USVRZIGplcnNleS5zZXJ2ZXIuVXJpICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvc2VydmVyL1VyaS5odG1sJz5Vcmk8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5zZXJ2ZXIuVXJpQ29ubmVnRmlsdGVyICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvc2VydmVyL2ZpbHRlci9VcmlDb25uZWdGaWx0ZXIuaHRtbCc+VXJpQ29ubmVnRmlsdGVyPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuc2VydmVyLldhZGxGZWF0dXJlICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvc2VydmVyL3dhZGwvV2FkbEZlYXR1cmUuaHRtbCc+V2FkbEZlYXR1cmU8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5zZXJ2ZXIuV2FkbEdlbmVyYXRvciAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3NlcnZlci93YWRsL1dhZGxHZW5lcmF0b3IuaHRtbCc+V2FkbEdlbmVyYXRvcjwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LnNlcnZlci5XYWRsR2VuZXJhdG9yQ29uZmlnICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvc2VydmVyL3dhZGwvY29uZmlnL1dhZGxHZW5lcmF0b3JDb25maWcuaHRtbCc+V2FkbEdlbmVyYXRvckNvbmZpZzwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LnNlcnZlci5tb2RlbC5NZXRob2RIYW5kbGVyICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvc2VydmVyL21vZGVsL01ldGhvZEhhbmRsZXIuaHRtbCc+TWV0aG9kSGFuZGxlcjwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LnNlcnZlci5tb2RlbC5Db21wb25lbnRNb2RlbFZhbGlkYXRvciAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3NlcnZlci9tb2RlbC9Db21wb25lbnRNb2RlbFZhbGlkYXRvci5odG1sJz5Db21wb25lbnRNb2RlbFZhbGlkYXRvcjwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLkFwcGxpY2F0aW9uRXZlbnQgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zZXJ2ZXIvbW9uaXRvcmluZy9BcHBsaWNhdGlvbkV2ZW50Lmh0bWwnPkFwcGxpY2F0aW9uRXZlbnQ8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5BcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXIgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zZXJ2ZXIvbW9uaXRvcmluZy9BcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXIuaHRtbCc+QXBwbGljYXRpb25FdmVudExpc3RlbmVyPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuQXBwbGljYXRpb25NWEJlYW4gIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zZXJ2ZXIvbW9uaXRvcmluZy9BcHBsaWNhdGlvbk1YQmVhbi5odG1sJz5BcHBsaWNhdGlvbk1YQmVhbjwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLkV4Y2VwdGlvbk1hcHBlck1YQmVhbiAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3NlcnZlci9tb25pdG9yaW5nL0V4Y2VwdGlvbk1hcHBlck1YQmVhbi5odG1sJz5FeGNlcHRpb25NYXBwZXJNWEJlYW48L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5FeGNlcHRpb25NYXBwZXJTdGF0aXN0aWNzICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvc2VydmVyL21vbml0b3JpbmcvRXhjZXB0aW9uTWFwcGVyU3RhdGlzdGljcy5odG1sJz5FeGNlcHRpb25NYXBwZXJTdGF0aXN0aWNzPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuRXhlY3V0aW9uU3RhdGlzdGljcyAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3NlcnZlci9tb25pdG9yaW5nL0V4ZWN1dGlvblN0YXRpc3RpY3MuaHRtbCc+RXhlY3V0aW9uU3RhdGlzdGljczwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLkFwcGxpY2F0aW9uSW5mbyAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3NlcnZlci9tb25pdG9yaW5nL0FwcGxpY2F0aW9uSW5mby5odG1sJz5BcHBsaWNhdGlvbkluZm88L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5Nb25pdG9yaW5nU3RhdGlzdGljcyAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3NlcnZlci9tb25pdG9yaW5nL01vbml0b3JpbmdTdGF0aXN0aWNzLmh0bWwnPk1vbml0b3JpbmdTdGF0aXN0aWNzPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuTW9uaXRvcmluZ1N0YXRpc3RpY3NMaXN0ZW5lciAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3NlcnZlci9tb25pdG9yaW5nL01vbml0b3JpbmdTdGF0aXN0aWNzTGlzdGVuZXIuaHRtbCc+TW9uaXRvcmluZ1N0YXRpc3RpY3NMaXN0ZW5lcjwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLkRlc3Ryb3lMaXN0ZW5lciAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3NlcnZlci9tb25pdG9yaW5nL0Rlc3Ryb3lMaXN0ZW5lci5odG1sJz5EZXN0cm95TGlzdGVuZXI8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5SZXF1ZXN0RXZlbnQgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zZXJ2ZXIvbW9uaXRvcmluZy9SZXF1ZXN0RXZlbnQuaHRtbCc+UmVxdWVzdEV2ZW50PC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuUmVxdWVzdEV2ZW50TGlzdGVuZXIgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zZXJ2ZXIvbW9uaXRvcmluZy9SZXF1ZXN0RXZlbnRMaXN0ZW5lci5odG1sJz5SZXF1ZXN0RXZlbnRMaXN0ZW5lcjwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLlJlc291cmNlTVhCZWFuICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvc2VydmVyL21vbml0b3JpbmcvUmVzb3VyY2VNWEJlYW4uaHRtbCc+UmVzb3VyY2VNWEJlYW48L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5SZXNvdXJjZU1ldGhvZE1YQmVhbiAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3NlcnZlci9tb25pdG9yaW5nL1Jlc291cmNlTWV0aG9kTVhCZWFuLmh0bWwnPlJlc291cmNlTWV0aG9kTVhCZWFuPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuUmVzb3VyY2VNZXRob2RTdGF0aXN0aWNzICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvc2VydmVyL21vbml0b3JpbmcvUmVzb3VyY2VNZXRob2RTdGF0aXN0aWNzLmh0bWwnPlJlc291cmNlTWV0aG9kU3RhdGlzdGljczwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLlJlc291cmNlU3RhdGlzdGljcyAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3NlcnZlci9tb25pdG9yaW5nL1Jlc291cmNlU3RhdGlzdGljcy5odG1sJz5SZXNvdXJjZVN0YXRpc3RpY3M8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5SZXNwb25zZU1YQmVhbiAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3NlcnZlci9tb25pdG9yaW5nL1Jlc3BvbnNlTVhCZWFuLmh0bWwnPlJlc3BvbnNlTVhCZWFuPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuUmVzcG9uc2VTdGF0aXN0aWNzICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvc2VydmVyL21vbml0b3JpbmcvUmVzcG9uc2VTdGF0aXN0aWNzLmh0bWwnPlJlc3BvbnNlU3RhdGlzdGljczwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLlRpbWVXaW5kb3dTdGF0aXN0aWNzICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvc2VydmVyL21vbml0b3JpbmcvVGltZVdpbmRvd1N0YXRpc3RpY3MuaHRtbCc+VGltZVdpbmRvd1N0YXRpc3RpY3M8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5zZXJ2ZXIubXZjLkVycm9yVGVtcGxhdGUgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zZXJ2ZXIvbXZjL0Vycm9yVGVtcGxhdGUuaHRtbCc+QEVycm9yVGVtcGxhdGU8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5zZXJ2ZXIubXZjLkZyZWVtYXJrZXJNdmNGZWF0dXJlICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvc2VydmVyL212Yy9mcmVlbWFya2VyL0ZyZWVtYXJrZXJNdmNGZWF0dXJlLmh0bWwnPkZyZWVtYXJrZXJNdmNGZWF0dXJlPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuc2VydmVyLm12Yy5Kc3BNdmNGZWF0dXJlICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvc2VydmVyL212Yy9qc3AvSnNwTXZjRmVhdHVyZS5odG1sJz5Kc3BNdmNGZWF0dXJlPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuc2VydmVyLm12Yy5NdXN0YWNoZU12Y0ZlYXR1cmUgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zZXJ2ZXIvbXZjL211c3RhY2hlL011c3RhY2hlTXZjRmVhdHVyZS5odG1sJz5NdXN0YWNoZU12Y0ZlYXR1cmU8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5zZXJ2ZXIubXZjLk12Y0ZlYXR1cmUgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zZXJ2ZXIvbXZjL012Y0ZlYXR1cmUuaHRtbCc+TXZjRmVhdHVyZTwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LnNlcnZlci5tdmMuc3BpLkFic3RyYWN0VGVtcGxhdGVQcm9jZXNzb3IgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zZXJ2ZXIvbXZjL3NwaS9BYnN0cmFjdFRlbXBsYXRlUHJvY2Vzc29yLmh0bWwnPkFic3RyYWN0VGVtcGxhdGVQcm9jZXNzb3I8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5zZXJ2ZXIubXZjLlRlbXBsYXRlICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvc2VydmVyL212Yy9UZW1wbGF0ZS5odG1sJz5AVGVtcGxhdGU8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5zZXJ2ZXIubXZjLlRlbXBsYXRlUHJvY2Vzc29yICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvc2VydmVyL212Yy9zcGkvVGVtcGxhdGVQcm9jZXNzb3IuaHRtbCc+VGVtcGxhdGVQcm9jZXNzb3I8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5zZXJ2ZXIubXZjLlZpZXdhYmxlICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvc2VydmVyL212Yy9WaWV3YWJsZS5odG1sJz5WaWV3YWJsZTwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LnNlcnZlci5vYXV0aDEuRGVmYXVsdE9BdXRoMVByb3ZpZGVyICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvc2VydmVyL29hdXRoMS9EZWZhdWx0T0F1dGgxUHJvdmlkZXIuaHRtbCc+RGVmYXVsdE9BdXRoMVByb3ZpZGVyPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuc2VydmVyLm9hdXRoMS5PQXV0aDFDb25zdW1lciAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3NlcnZlci9vYXV0aDEvT0F1dGgxQ29uc3VtZXIuaHRtbCc+T0F1dGgxQ29uc3VtZXI8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5zZXJ2ZXIub2F1dGgxLk9BdXRoMUV4Y2VwdGlvbiAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3NlcnZlci9vYXV0aDEvT0F1dGgxRXhjZXB0aW9uLmh0bWwnPk9BdXRoMUV4Y2VwdGlvbjwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LnNlcnZlci5vYXV0aDEuT0F1dGgxUHJvdmlkZXIgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zZXJ2ZXIvb2F1dGgxL09BdXRoMVByb3ZpZGVyLmh0bWwnPk9BdXRoMVByb3ZpZGVyPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuc2VydmVyLm9hdXRoMS5PQXV0aDFTZXJ2ZXJGZWF0dXJlICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvc2VydmVyL29hdXRoMS9PQXV0aDFTZXJ2ZXJGZWF0dXJlLmh0bWwnPk9BdXRoMVNlcnZlckZlYXR1cmU8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5zZXJ2ZXIub2F1dGgxLk9BdXRoMVNlcnZlclByb3BlcnRpZXMgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zZXJ2ZXIvb2F1dGgxL09BdXRoMVNlcnZlclByb3BlcnRpZXMuaHRtbCc+T0F1dGgxU2VydmVyUHJvcGVydGllczwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LnNlcnZlci5vYXV0aDEuT0F1dGgxVG9rZW4gIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zZXJ2ZXIvb2F1dGgxL09BdXRoMVRva2VuLmh0bWwnPk9BdXRoMVRva2VuPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuc2VydmVyLm9hdXRoMS5Ub2tlblJlc291cmNlICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvc2VydmVyL29hdXRoMS9Ub2tlblJlc291cmNlLmh0bWwnPlRva2VuUmVzb3VyY2U8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5zZXJ2ZXIuc3BpLkNvbXBvbmVudFByb3ZpZGVyICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvc2VydmVyL3NwaS9Db21wb25lbnRQcm92aWRlci5odG1sJz5Db21wb25lbnRQcm92aWRlcjwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LnNlcnZlci5zcGkuQ29udGFpbmVyUHJvdmlkZXIgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zZXJ2ZXIvc3BpL0NvbnRhaW5lclByb3ZpZGVyLmh0bWwnPkNvbnRhaW5lclByb3ZpZGVyPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuc2VydmVyLnNwaS5FeHRlcm5hbFJlcXVlc3RTY29wZSAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3NlcnZlci9zcGkvRXh0ZXJuYWxSZXF1ZXN0U2NvcGUuaHRtbCc+RXh0ZXJuYWxSZXF1ZXN0U2NvcGU8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5zZXJ2ZXIuc3BpLlJlcXVlc3RTY29wZWRJbml0aWFsaXplciAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3NlcnZlci9zcGkvUmVxdWVzdFNjb3BlZEluaXRpYWxpemVyLmh0bWwnPlJlcXVlc3RTY29wZWRJbml0aWFsaXplcjwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lciAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3NlcnZsZXQvU2VydmxldENvbnRhaW5lci5odG1sJz5TZXJ2bGV0Q29udGFpbmVyPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuc2VydmxldC5TZXJ2bGV0UHJvcGVydGllcyAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3NlcnZsZXQvU2VydmxldFByb3BlcnRpZXMuaHRtbCc+U2VydmxldFByb3BlcnRpZXM8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5zZXJ2bGV0LlNlcnZsZXRQcm9wZXJ0aWVzLkZJTFRFUl9DT05URVhUX1BBVEggIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zZXJ2bGV0L1NlcnZsZXRQcm9wZXJ0aWVzLmh0bWwjRklMVEVSX0NPTlRFWFRfUEFUSCc+U2VydmxldFByb3BlcnRpZXMuRklMVEVSX0NPTlRFWFRfUEFUSDwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LnNlcnZsZXQuU2VydmxldFByb3BlcnRpZXMuRklMVEVSX0ZPUldBUkRfT05fNDA0ICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvc2VydmxldC9TZXJ2bGV0UHJvcGVydGllcy5odG1sI0ZJTFRFUl9GT1JXQVJEX09OXzQwNCc+U2VydmxldFByb3BlcnRpZXMuRklMVEVSX0ZPUldBUkRfT05fNDA0PC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuc2VydmxldC5TZXJ2bGV0UHJvcGVydGllcy5GSUxURVJfU1RBVElDX0NPTlRFTlRfUkVHRVggIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zZXJ2bGV0L1NlcnZsZXRQcm9wZXJ0aWVzLmh0bWwjRklMVEVSX1NUQVRJQ19DT05URU5UX1JFR0VYJz5TZXJ2bGV0UHJvcGVydGllcy5GSUxURVJfU1RBVElDX0NPTlRFTlRfUkVHRVg8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5zZXJ2bGV0LlNlcnZsZXRQcm9wZXJ0aWVzLkpBWFJTX0FQUExJQ0FUSU9OX0NMQVNTICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvc2VydmxldC9TZXJ2bGV0UHJvcGVydGllcy5odG1sI0pBWFJTX0FQUExJQ0FUSU9OX0NMQVNTJz5TZXJ2bGV0UHJvcGVydGllcy5KQVhSU19BUFBMSUNBVElPTl9DTEFTUzwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LnNlcnZsZXQuU2VydmxldFByb3BlcnRpZXMuUFJPVklERVJfV0VCX0FQUCAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3NlcnZsZXQvU2VydmxldFByb3BlcnRpZXMuaHRtbCNQUk9WSURFUl9XRUJfQVBQJz5TZXJ2bGV0UHJvcGVydGllcy5QUk9WSURFUl9XRUJfQVBQPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuc2VydmxldC5TZXJ2bGV0UHJvcGVydGllcy5RVUVSWV9QQVJBTVNfQVNfRk9STV9QQVJBTVNfRElTQUJMRUQgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zZXJ2bGV0L1NlcnZsZXRQcm9wZXJ0aWVzLmh0bWwjUVVFUllfUEFSQU1TX0FTX0ZPUk1fUEFSQU1TX0RJU0FCTEVEJz5TZXJ2bGV0UHJvcGVydGllcy5RVUVSWV9QQVJBTVNfQVNfRk9STV9QQVJBTVNfRElTQUJMRUQ8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5zZXJ2bGV0LlNlcnZsZXRQcm9wZXJ0aWVzLlNFUlZJQ0VfTE9DQVRPUiAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3NlcnZsZXQvU2VydmxldFByb3BlcnRpZXMuaHRtbCNTRVJWSUNFX0xPQ0FUT1InPlNlcnZsZXRQcm9wZXJ0aWVzLlNFUlZJQ0VfTE9DQVRPUjwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LnNpbXBsZS5TaW1wbGVDb250YWluZXIgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9zaW1wbGUvU2ltcGxlQ29udGFpbmVyLmh0bWwnPlNpbXBsZUNvbnRhaW5lcjwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LnNpbXBsZS5TaW1wbGVDb250YWluZXJGYWN0b3J5ICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvc2ltcGxlL1NpbXBsZUNvbnRhaW5lckZhY3RvcnkuaHRtbCc+U2ltcGxlQ29udGFpbmVyRmFjdG9yeTwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LnNpbXBsZS5TaW1wbGVDb250YWluZXJQcm92aWRlciAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3NpbXBsZS9TaW1wbGVDb250YWluZXJQcm92aWRlci5odG1sJz5TaW1wbGVDb250YWluZXJQcm92aWRlcjwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LnNzZS5FdmVudElucHV0ICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvbWVkaWEvc3NlL0V2ZW50SW5wdXQuaHRtbCc+RXZlbnRJbnB1dDwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LnNzZS5FdmVudElucHV0UmVhZGVyICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvbWVkaWEvc3NlL0V2ZW50SW5wdXRSZWFkZXIuaHRtbCc+RXZlbnRJbnB1dFJlYWRlcjwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LnNzZS5FdmVudExpc3RlbmVyICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvbWVkaWEvc3NlL0V2ZW50TGlzdGVuZXIuaHRtbCc+RXZlbnRMaXN0ZW5lcjwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LnNzZS5FdmVudE91dHB1dCAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L21lZGlhL3NzZS9FdmVudE91dHB1dC5odG1sJz5FdmVudE91dHB1dDwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LnNzZS5FdmVudFNvdXJjZSAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L21lZGlhL3NzZS9FdmVudFNvdXJjZS5odG1sJz5FdmVudFNvdXJjZTwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LnNzZS5FdmVudFNvdXJjZS5CdWlsZGVyICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvbWVkaWEvc3NlL0V2ZW50U291cmNlLkJ1aWxkZXIuaHRtbCc+RXZlbnRTb3VyY2UuQnVpbGRlcjwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LnNzZS5JbmJvdW5kRXZlbnQgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9tZWRpYS9zc2UvSW5ib3VuZEV2ZW50Lmh0bWwnPkluYm91bmRFdmVudDwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LnNzZS5PdXRib3VuZEV2ZW50ICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvbWVkaWEvc3NlL091dGJvdW5kRXZlbnQuaHRtbCc+T3V0Ym91bmRFdmVudDwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LnNzZS5Tc2VCcm9hZGNhc3RlciAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L21lZGlhL3NzZS9Tc2VCcm9hZGNhc3Rlci5odG1sJz5Tc2VCcm9hZGNhc3RlcjwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LnNzZS5Tc2VGZWF0dXJlICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvbWVkaWEvc3NlL1NzZUZlYXR1cmUuaHRtbCc+U3NlRmVhdHVyZTwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LnNzZS5Tc2VGZWF0dXJlLkRJU0FCTEVfU1NFICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvbWVkaWEvc3NlL1NzZUZlYXR1cmUuaHRtbCNESVNBQkxFX1NTRSc+RElTQUJMRV9TU0U8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS5zc2UuU3NlRmVhdHVyZS5ESVNBQkxFX1NTRV9DTElFTlQgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy9tZWRpYS9zc2UvU3NlRmVhdHVyZS5odG1sI0RJU0FCTEVfU1NFX0NMSUVOVCc+RElTQUJMRV9TU0VfQ0xJRU5UPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkuc3NlLlNzZUZlYXR1cmUuRElTQUJMRV9TU0VfU0VSVkVSICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvbWVkaWEvc3NlL1NzZUZlYXR1cmUuaHRtbCNESVNBQkxFX1NTRV9TRVJWRVInPkRJU0FCTEVfU1NFX1NFUlZFUjwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LnRlc3QuSmVyc2V5VGVzdCAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3Rlc3QvSmVyc2V5VGVzdC5odG1sJz5KZXJzZXlUZXN0PC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkudGVzdC5KZXJzZXlUZXN0TmcgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy90ZXN0L0plcnNleVRlc3ROZy5odG1sJz5KZXJzZXlUZXN0Tmc8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS50ZXN0LkplcnNleVRlc3ROZy5Db250YWluZXJQZXJDbGFzc1Rlc3QgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy90ZXN0L0plcnNleVRlc3ROZy5Db250YWluZXJQZXJDbGFzc1Rlc3QuaHRtbCc+SmVyc2V5VGVzdE5nLkNvbnRhaW5lclBlckNsYXNzVGVzdDwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LnRlc3QuSmVyc2V5VGVzdE5nLkNvbnRhaW5lclBlck1ldGhvZFRlc3QgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy90ZXN0L0plcnNleVRlc3ROZy5Db250YWluZXJQZXJNZXRob2RUZXN0Lmh0bWwnPkplcnNleVRlc3ROZy5Db250YWluZXJQZXJNZXRob2RUZXN0PC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkudGVzdC5UZXN0UHJvcGVydGllcyAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3Rlc3QvVGVzdFByb3BlcnRpZXMuaHRtbCc+VGVzdFByb3BlcnRpZXM8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvdGVzdC9zcGkvVGVzdENvbnRhaW5lci5odG1sJz5UZXN0Q29udGFpbmVyPC9saW5rPiI+Cis8IUVOVElUWSBqZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3RvcnkgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy90ZXN0L3NwaS9UZXN0Q29udGFpbmVyRmFjdG9yeS5odG1sJz5UZXN0Q29udGFpbmVyRmFjdG9yeTwvbGluaz4iPgorPCFFTlRJVFkgamVyc2V5LnRlc3QudXRpbC5Db250YWluZXJSZXF1ZXN0QnVpbGRlciAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3Rlc3QvdXRpbC9zZXJ2ZXIvQ29udGFpbmVyUmVxdWVzdEJ1aWxkZXIuaHRtbCc+Q29udGFpbmVyUmVxdWVzdEJ1aWxkZXI8L2xpbms+Ij4KKzwhRU5USVRZIGplcnNleS50ZXN0LnV0aWwuTG9vcEJhY2tDb25uZWN0b3JQcm92aWRlciAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3Rlc3QvdXRpbC9jbGllbnQvTG9vcEJhY2tDb25uZWN0b3JQcm92aWRlci5odG1sJz5Mb29wQmFja0Nvbm5lY3RvclByb3ZpZGVyPC9saW5rPiI+Cis8IUVOVElUWSBqYXZheC53cy5ycy5zc2UuU3NlRXZlbnRTb3VyY2UuQnVpbGRlciAiPGxpbmsgeGxpbms6aHJlZj0nJmpheHJzMjEuamF2YWRvYy51cmk7L3NzZS9Tc2VFdmVudFNvdXJjZS5CdWlsZGVyLmh0bWwnPlNzZUV2ZW50U291cmNlLkJ1aWxkZXI8L2xpbms+Ij4KKzwhRU5USVRZIGphdmF4LndzLnJzLnNzZS5Tc2VFdmVudFNvdXJjZSAiPGxpbmsgeGxpbms6aHJlZj0nJmpheHJzMjEuamF2YWRvYy51cmk7L3NzZS9Tc2VFdmVudFNvdXJjZS5odG1sJz5Tc2VFdmVudFNvdXJjZTwvbGluaz4iPgorPCFFTlRJVFkgamF2YXgud3MucnMuc3NlLkluYm91bmRTc2VFdmVudCAiPGxpbmsgeGxpbms6aHJlZj0nJmpheHJzMjEuamF2YWRvYy51cmk7L3NzZS9JbmJvdW5kU3NlRXZlbnQuaHRtbCc+SW5ib3VuZFNzZUV2ZW50PC9saW5rPiI+CisKKzwhLS0gTGlua3MgdG8gc3BlY2lmaWMgSklSQSBpc3N1ZXMgLS0+Cis8IUVOVElUWSBqZXJzZXkuamlyYS4yODgzICI8bGluayB4bGluazpocmVmPScmamlyYS51cmkucHJlZml4Oy8yODM4Jz5KRVJTRVktMjgzODwvbGluaz4iPgorCis8IS0tIENvbW1vbiBMaXRlcmFscyAtLT4KKzwhRU5USVRZIGxpdC5udWxsICI8bGl0ZXJhbD5udWxsPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQudHJ1ZSAiPGxpdGVyYWw+dHJ1ZTwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmZhbHNlICI8bGl0ZXJhbD5mYWxzZTwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LnBvbS54bWwgIjxsaXRlcmFsPnBvbS54bWw8L2xpdGVyYWw+Ij4KKworPCEtLSBIVFRQIGxpdGVyYWxzIC0tPgorPCFFTlRJVFkgbGl0Lmh0dHAuR0VUICI8bGl0ZXJhbD5HRVQ8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5odHRwLlBVVCAiPGxpdGVyYWw+UFVUPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuaHR0cC5QT1NUICI8bGl0ZXJhbD5QT1NUPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuaHR0cC5ERUxFVEUgIjxsaXRlcmFsPkRFTEVURTwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0Lmh0dHAuSEVBRCAiPGxpdGVyYWw+SEVBRDwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0Lmh0dHAuT1BUSU9OUyAiPGxpdGVyYWw+T1BUSU9OUzwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0Lmh0dHAuVFJBQ0UgIjxsaXRlcmFsPlRSQUNFPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuaHR0cC5oZWFkZXIuQWNjZXB0ICI8bGl0ZXJhbD5BY2NlcHQ8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5odHRwLmhlYWRlci5BY2Nlc3NDb250cm9sUmVxdWVzdEhlYWRlcnMgIjxsaXRlcmFsPkFjY2Vzcy1Db250cm9sLVJlcXVlc3QtSGVhZGVyczwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0Lmh0dHAuaGVhZGVyLkFjY2Vzc0NvbnRyb2xSZXF1ZXN0TWV0aG9kICI8bGl0ZXJhbD5BY2Nlc3MtQ29udHJvbC1SZXF1ZXN0LU1ldGhvZDwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0Lmh0dHAuaGVhZGVyLkNvbm5lY3Rpb24gIjxsaXRlcmFsPkNvbm5lY3Rpb248L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5odHRwLmhlYWRlci5Db250ZW50TGVuZ3RoICI8bGl0ZXJhbD5Db250ZW50LUxlbmd0aDwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0Lmh0dHAuaGVhZGVyLkNvbnRlbnRUcmFuc2ZlckVuY29kaW5nICI8bGl0ZXJhbD5Db250ZW50LVRyYW5zZmVyLUVuY29kaW5nPC9saXRlcmFsPi0iPgorPCFFTlRJVFkgbGl0Lmh0dHAuaGVhZGVyLkhvc3QgIjxsaXRlcmFsPkhvc3Q8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5odHRwLmhlYWRlci5LZWVwLUFsaXZlICI8bGl0ZXJhbD5LZWVwLUFsaXZlPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuaHR0cC5oZWFkZXIuT3JpZ2luICI8bGl0ZXJhbD5PcmlnaW48L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5odHRwLmhlYWRlci5TZWMucHJlZml4ICI8bGl0ZXJhbD5TZWMtPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuaHR0cC5oZWFkZXIuVHJhaWxlciAiPGxpdGVyYWw+VHJhaWxlcjwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0Lmh0dHAuaGVhZGVyLlRyYW5zZmVyLUVuY29kaW5nICI8bGl0ZXJhbD5UcmFuc2Zlci1FbmNvZGluZzwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0Lmh0dHAuaGVhZGVyLlVwZ3JhZGUgIjxsaXRlcmFsPlVwZ3JhZGU8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5odHRwLmhlYWRlci5WaWEgIjxsaXRlcmFsPlZpYTwvbGl0ZXJhbD4iPgorCis8IS0tIEplcnNleSBNb2R1bGUgTGl0ZXJhbHMgLS0+Cis8IUVOVElUWSBsaXQuamVyc2V5LWJlYW4tdmFsaWRhdGlvbiAiPGxpdGVyYWw+amVyc2V5LWJlYW4tdmFsaWRhdGlvbjwvbGl0ZXJhbD4iID4KKzwhRU5USVRZIGxpdC5qZXJzZXktZGVjbGFyYXRpdmUtbGlua2luZyAiPGxpdGVyYWw+amVyc2V5LWRlY2xhcmF0aXZlLWxpbmtpbmc8L2xpdGVyYWw+IiA+Cis8IUVOVElUWSBsaXQuamVyc2V5LW1lZGlhLWpzb24tcHJvY2Vzc2luZyAiPGxpdGVyYWw+amVyc2V5LW1lZGlhLWpzb24tcHJvY2Vzc2luZzwvbGl0ZXJhbD4iID4KKzwhRU5USVRZIGxpdC5qZXJzZXktbWVkaWEtanNvbi1qZXR0aXNvbiAiPGxpdGVyYWw+amVyc2V5LW1lZGlhLWpzb24tamV0dGlzb248L2xpdGVyYWw+IiA+Cis8IUVOVElUWSBsaXQuamVyc2V5LW1lZGlhLWpzb24tamFja3NvbiAiPGxpdGVyYWw+amVyc2V5LW1lZGlhLWpzb24tamFja3NvbjwvbGl0ZXJhbD4iID4KKzwhRU5USVRZIGxpdC5qZXJzZXktbWVkaWEtanNvbi1qYWNrc29uMSAiPGxpdGVyYWw+amVyc2V5LW1lZGlhLWpzb24tamFja3NvbjE8L2xpdGVyYWw+IiA+Cis8IUVOVElUWSBsaXQuamVyc2V5LW1lZGlhLW1veHkgIjxsaXRlcmFsPmplcnNleS1tZWRpYS1tb3h5PC9saXRlcmFsPiIgPgorPCFFTlRJVFkgbGl0LmplcnNleS1tZWRpYS1tdWx0aXBhcnQgIjxsaXRlcmFsPmplcnNleS1tZWRpYS1tdWx0aXBhcnQ8L2xpdGVyYWw+IiA+Cis8IUVOVElUWSBsaXQuamVyc2V5LXJ4LWNsaWVudCAiPGxpdGVyYWw+amVyc2V5LXJ4LWNsaWVudDwvbGl0ZXJhbD4iID4KKworPCEtLSBBUEkgRG9jIExpdGVyYWxzIC0tPgorPCFFTlRJVFkgbGl0LmJ2LkNvbnN0cmFpbnQgIjxsaXRlcmFsPkBDb25zdHJhaW50PC9saXRlcmFsPiIgPgorPCFFTlRJVFkgbGl0LmJ2LkNvbnN0cmFpbnRWYWxpZGF0b3IgIjxsaXRlcmFsPkNvbnN0cmFpbnRWYWxpZGF0b3I8L2xpdGVyYWw+IiA+Cis8IUVOVElUWSBsaXQuYnYuQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkgIjxsaXRlcmFsPkNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5PC9saXRlcmFsPiIgPgorPCFFTlRJVFkgbGl0LmJ2LkNvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24gIjxsaXRlcmFsPkNvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb248L2xpdGVyYWw+IiA+Cis8IUVOVElUWSBsaXQuYnYuRW1haWwgIjxsaXRlcmFsPkBFbWFpbDwvbGl0ZXJhbD4iID4KKzwhRU5USVRZIGxpdC5idi5Ob3ROdWxsICI8bGl0ZXJhbD5ATm90TnVsbDwvbGl0ZXJhbD4iID4KKzwhRU5USVRZIGxpdC5idi5WYWxpZCAiPGxpdGVyYWw+QFZhbGlkPC9saXRlcmFsPiIgPgorPCFFTlRJVFkgbGl0LmJ2LlZhbGlkYXRlT25FeGVjdXRpb24gIjxsaXRlcmFsPkBWYWxpZGF0ZU9uRXhlY3V0aW9uPC9saXRlcmFsPiIgPgorPCFFTlRJVFkgbGl0LmJ2LlZhbGlkYXRpb25FeGNlcHRpb24gIjxsaXRlcmFsPlZhbGlkYXRpb25FeGNlcHRpb248L2xpdGVyYWw+IiA+Cis8IUVOVElUWSBsaXQuYnYuVmFsaWRhdG9yICI8bGl0ZXJhbD5WYWxpZGF0b3I8L2xpdGVyYWw+IiA+CisKKzwhRU5USVRZIGxpdC5oazIuQmluZGVyICI8bGl0ZXJhbD5CaW5kZXI8L2xpdGVyYWw+IiA+Cis8IUVOVElUWSBsaXQuaGsyLkZhY3RvcnkgIjxsaXRlcmFsPkZhY3Rvcnk8L2xpdGVyYWw+IiA+Cis8IUVOVElUWSBsaXQuaGsyLkluamVjdGlvblJlc29sdmVyICI8bGl0ZXJhbD5JbmplY3Rpb25SZXNvbHZlcjwvbGl0ZXJhbD4iID4KKzwhRU5USVRZIGxpdC5oazIuUGVyTG9va3VwICI8bGl0ZXJhbD5QZXJMb29rdXA8L2xpdGVyYWw+IiA+Cis8IUVOVElUWSBsaXQuaGsyLlNlcnZpY2VMb2NhdG9yICI8bGl0ZXJhbD5TZXJ2aWNlTG9jYXRvcjwvbGl0ZXJhbD4iID4KKworPCFFTlRJVFkgbGl0Lmd1YXZhLkZ1dHVyZXMgIjxsaXRlcmFsPkZ1dHVyZXM8L2xpdGVyYWw+IiA+Cis8IUVOVElUWSBsaXQuZ3VhdmEuTGlzdGVuYWJsZUZ1dHVyZSAiPGxpdGVyYWw+TGlzdGVuYWJsZUZ1dHVyZTwvbGl0ZXJhbD4iID4KKworPCEtLSBSeEphdmEgLS0+Cis8IUVOVElUWSBsaXQucnhqYXZhLk9ic2VydmFibGUgIjxsaXRlcmFsPk9ic2VydmFibGU8L2xpdGVyYWw+IiA+Cis8IUVOVElUWSBsaXQucnhqYXZhMi5GbG93YWJsZSAiPGxpdGVyYWw+Rmxvd2FibGU8L2xpdGVyYWw+IiA+CisKKzwhRU5USVRZIGxpdC5qYXhiLkpBWEJDb250ZXh0ICI8bGl0ZXJhbD5KQVhCQ29udGV4dDwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmpheGIuSkFYQkVsZW1lbnQgIjxsaXRlcmFsPkpBWEJFbGVtZW50PC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamF4cnMuQXBwbGljYXRpb25QYXRoICI8bGl0ZXJhbD5AQXBwbGljYXRpb25QYXRoPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamF4cnMuQmVhblBhcmFtICI8bGl0ZXJhbD5AQmVhblBhcmFtPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamF4cnMuQ29uc3VtZXMgIjxsaXRlcmFsPkBDb25zdW1lczwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmpheHJzLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0ICI8bGl0ZXJhbD5Db250YWluZXJSZXF1ZXN0Q29udGV4dDwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmpheHJzLkNvbnRhaW5lclJlc3BvbnNlQ29udGV4dCAiPGxpdGVyYWw+Q29udGFpbmVyUmVzcG9uc2VDb250ZXh0PC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamF4cnMuQ29va2llUGFyYW0gIjxsaXRlcmFsPkBDb29raWVQYXJhbTwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmpheHJzLkRFTEVURSAiPGxpdGVyYWw+QERFTEVURTwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmpheHJzLkRlZmF1bHRWYWx1ZSAiPGxpdGVyYWw+QERlZmF1bHRWYWx1ZTwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmpheHJzLkVuY29kZWQgIjxsaXRlcmFsPkBFbmNvZGVkPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamF4cnMuRm9ybVBhcmFtICI8bGl0ZXJhbD5ARm9ybVBhcmFtPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamF4cnMuR0VUICI8bGl0ZXJhbD5AR0VUPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamF4cnMuSEVBRCAiPGxpdGVyYWw+QEhFQUQ8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qYXhycy5IZWFkZXJQYXJhbSAiPGxpdGVyYWw+QEhlYWRlclBhcmFtPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamF4cnMuSHR0cE1ldGhvZCAiPGxpdGVyYWw+QEh0dHBNZXRob2Q8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qYXhycy5NYXRyaXhQYXJhbSAiPGxpdGVyYWw+QE1hdHJpeFBhcmFtPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamF4cnMuTmFtZUJpbmRpbmcgIjxsaXRlcmFsPkBOYW1lQmluZGluZzwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmpheHJzLk9QVElPTlMgIjxsaXRlcmFsPkBPUFRJT05TPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamF4cnMuUE9TVCAiPGxpdGVyYWw+QFBPU1Q8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qYXhycy5QVVQgIjxsaXRlcmFsPkBQVVQ8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qYXhycy5QYXRoICI8bGl0ZXJhbD5AUGF0aDwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmpheHJzLlBhdGhQYXJhbSAiPGxpdGVyYWw+QFBhdGhQYXJhbTwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmpheHJzLlByZW1hdGNoaW5nICI8bGl0ZXJhbD5AUHJlTWF0Y2hpbmc8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qYXhycy5Qcmlvcml0aWVzICI8bGl0ZXJhbD5Qcmlvcml0aWVzPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamF4cnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbiAiPGxpdGVyYWw+UHJvY2Vzc2luZ0V4Y2VwdGlvbjwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmpheHJzLlByb2R1Y2VzICI8bGl0ZXJhbD5AUHJvZHVjZXM8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qYXhycy5RdWVyeVBhcmFtICI8bGl0ZXJhbD5AUXVlcnlQYXJhbTwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmpheHJzLlJlYWRlckludGVyY2VwdG9yICI8bGl0ZXJhbD5SZWFkZXJJbnRlcmNlcHRvcjwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmpheHJzLlJlYWRlckludGVyY2VwdG9yQ29udGV4dCAiPGxpdGVyYWw+UmVhZGVySW50ZXJjZXB0b3JDb250ZXh0PC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamF4cnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb24gIjxsaXRlcmFsPldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamF4cnMuV3JpdGVySW50ZXJjZXB0b3IgIjxsaXRlcmFsPldyaXRlckludGVyY2VwdG9yPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamF4cnMuV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0ICI8bGl0ZXJhbD5Xcml0ZXJJbnRlcmNlcHRvckNvbnRleHQ8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qYXhycy5jbGllbnQuQXN5bmNJbnZva2VyICI8bGl0ZXJhbD5Bc3luY0ludm9rZXI8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qYXhycy5jbGllbnQuQ2xpZW50ICI8bGl0ZXJhbD5DbGllbnQ8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qYXhycy5jbGllbnQuQ2xpZW50QnVpbGRlciAiPGxpdGVyYWw+Q2xpZW50QnVpbGRlcjwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmpheHJzLmNsaWVudC5DbGllbnRSZXF1ZXN0Q29udGV4dCAiPGxpdGVyYWw+Q2xpZW50UmVxdWVzdENvbnRleHQ8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qYXhycy5jbGllbnQuQ2xpZW50UmVxdWVzdEZpbHRlciAiPGxpdGVyYWw+Q2xpZW50UmVxdWVzdEZpbHRlcjwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmpheHJzLmNsaWVudC5DbGllbnRSZXNwb25zZUZpbHRlciAiPGxpdGVyYWw+Q2xpZW50UmVzcG9uc2VGaWx0ZXI8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qYXhycy5jbGllbnQuRW50aXR5ICI8bGl0ZXJhbD5FbnRpdHk8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qYXhycy5jbGllbnQuSW52b2NhdGlvbiAiPGxpdGVyYWw+SW52b2NhdGlvbjwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmpheHJzLmNsaWVudC5JbnZvY2F0aW9uLkJ1aWxkZXIgIjxsaXRlcmFsPkludm9jYXRpb24uQnVpbGRlcjwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmpheHJzLmNsaWVudC5JbnZvY2F0aW9uQ2FsbGJhY2sgIjxsaXRlcmFsPkludm9jYXRpb25DYWxsYmFjazwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmpheHJzLmNsaWVudC5SeEludm9rZXIgIjxsaXRlcmFsPlJ4SW52b2tlcjwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmpheHJzLmNsaWVudC5SeEludm9rZXJQcm92aWRlciAiPGxpdGVyYWw+UnhJbnZva2VyUHJvdmlkZXI8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qYXhycy5jbGllbnQuU3luY0ludm9rZXIgIjxsaXRlcmFsPlN5bmNJbnZva2VyPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamF4cnMuY2xpZW50LldlYlRhcmdldCAiPGxpdGVyYWw+V2ViVGFyZ2V0PC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamF4cnMuY2xpZW50LldlYlRhcmdldCAiPGxpdGVyYWw+V2ViVGFyZ2V0PC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamF4cnMuY29udGFpbmVyLkFzeW5jUmVzcG9uc2UgIjxsaXRlcmFsPkFzeW5jUmVzcG9uc2U8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qYXhycy5jb250YWluZXIuQ29tcGxldGlvbkNhbGxiYWNrICI8bGl0ZXJhbD5Db21wbGV0aW9uQ2FsbGJhY2s8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qYXhycy5jb250YWluZXIuQ29ubmVjdGlvbkNhbGxiYWNrICI8bGl0ZXJhbD5Db25uZWN0aW9uQ2FsbGJhY2s8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qYXhycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlciAgIjxsaXRlcmFsPkNvbnRhaW5lclJlcXVlc3RGaWx0ZXI8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qYXhycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXIgIjxsaXRlcmFsPkNvbnRhaW5lclJlc3BvbnNlRmlsdGVyPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamF4cnMuY29udGFpbmVyLkR5bmFtaWNGZWF0dXJlICI8bGl0ZXJhbD5EeW5hbWljRmVhdHVyZTwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmpheHJzLmNvbnRhaW5lci5SZXNvdXJjZUluZm8gIjxsaXRlcmFsPlJlc291cmNlSW5mbzwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmpheHJzLmNvbnRhaW5lci5TdXNwZW5kZWQgIjxsaXRlcmFsPkBTdXNwZW5kZWQ8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qYXhycy5jb3JlLkFwcGxpY2F0aW9uICI8bGl0ZXJhbD5BcHBsaWNhdGlvbjwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmpheHJzLmNvcmUuQ2FjaGVDb250cm9sICI8bGl0ZXJhbD5DYWNoZUNvbnRyb2w8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qYXhycy5jb3JlLkNvbmZpZ3VyYWJsZSAiPGxpdGVyYWw+Q29uZmlndXJhYmxlPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamF4cnMuY29yZS5Db25maWd1cmF0aW9uICI8bGl0ZXJhbD5Db25maWd1cmF0aW9uPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamF4cnMuY29yZS5Db250ZXh0ICI8bGl0ZXJhbD5AQ29udGV4dDwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmpheHJzLmNvcmUuQ29va2llICI8bGl0ZXJhbD5Db29raWU8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qYXhycy5jb3JlLkVudGl0eVRhZyAiPGxpdGVyYWw+RW50aXR5VGFnPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamF4cnMuY29yZS5GZWF0dXJlICI8bGl0ZXJhbD5GZWF0dXJlPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamF4cnMuY29yZS5Gb3JtICI8bGl0ZXJhbD5Gb3JtPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamF4cnMuY29yZS5HZW5lcmljRW50aXR5ICI8bGl0ZXJhbD5HZW5lcmljRW50aXR5Jmx0O1QmZ3Q7PC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamF4cnMuY29yZS5HZW5lcmljVHlwZSAiPGxpdGVyYWw+R2VuZXJpY1R5cGUmbHQ7VCZndDs8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qYXhycy5jb3JlLkh0dHBIZWFkZXJzICI8bGl0ZXJhbD5IdHRwSGVhZGVyczwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmpheHJzLmNvcmUuTGluayAiPGxpdGVyYWw+TGluazwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmpheHJzLmNvcmUuTGluay5CdWlsZGVyICI8bGl0ZXJhbD5MaW5rLkJ1aWxkZXI8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qYXhycy5jb3JlLk1lZGlhVHlwZSAiPGxpdGVyYWw+TWVkaWFUeXBlPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamF4cnMuY29yZS5NdWx0aXZhbHVlZE1hcCAiPGxpdGVyYWw+TXVsdGl2YWx1ZWRNYXAmbHQ7SyxWJmd0OzwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmpheHJzLmNvcmUuTmV3Q29va2llICI8bGl0ZXJhbD5OZXdDb29raWU8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qYXhycy5jb3JlLlBhdGhTZWdtZW50ICI8bGl0ZXJhbD5QYXRoU2VnbWVudDwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmpheHJzLmNvcmUuUmVxdWVzdCAiPGxpdGVyYWw+UmVxdWVzdDwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmpheHJzLmNvcmUuUmVzcG9uc2UgIjxsaXRlcmFsPlJlc3BvbnNlPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamF4cnMuY29yZS5SZXNwb25zZS5SZXNwb25zZUJ1aWxkZXIgIjxsaXRlcmFsPlJlc3BvbnNlLlJlc3BvbnNlQnVpbGRlcjwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmpheHJzLmNvcmUuUmVzcG9uc2UuU3RhdHVzICI8bGl0ZXJhbD5SZXNwb25zZS5TdGF0dXM8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qYXhycy5jb3JlLlJlc3BvbnNlLlN0YXR1cy5GYW1pbHkgIjxsaXRlcmFsPlJlc3BvbnNlLlN0YXR1cy5GYW1pbHk8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qYXhycy5jb3JlLlJlc3BvbnNlLlN0YXR1c1R5cGUgIjxsaXRlcmFsPlJlc3BvbnNlLlN0YXR1c1R5cGU8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qYXhycy5jb3JlLlNlY3VyaXR5Q29udGV4dCAiPGxpdGVyYWw+U2VjdXJpdHlDb250ZXh0PC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamF4cnMuY29yZS5TdHJlYW1pbmdPdXRwdXQgIjxsaXRlcmFsPlN0cmVhbWluZ091dHB1dDwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmpheHJzLmNvcmUuVXJpQnVpbGRlciAiPGxpdGVyYWw+VXJpQnVpbGRlcjwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmpheHJzLmNvcmUuVXJpQnVpbGRlckV4Y2VwdGlvbiAiPGxpdGVyYWw+VXJpQnVpbGRlckV4Y2VwdGlvbjwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmpheHJzLmNvcmUuVXJpSW5mbyAiPGxpdGVyYWw+VXJpSW5mbzwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmpheHJzLmNvcmUuVmFyaWFudCAiPGxpdGVyYWw+VmFyaWFudDwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmpheHJzLmNvcmUuVmFyaWFudC5WYXJpYW50TGlzdEJ1aWxkZXIgIjxsaXRlcmFsPlZhcmlhbnQuVmFyaWFudExpc3RCdWlsZGVyPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamF4cnMuZXh0LkNvbnRleHRSZXNvbHZlciAiPGxpdGVyYWw+Q29udGV4dFJlc29sdmVyJmx0O1QmZ3Q7PC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamF4cnMuZXh0LkV4Y2VwdGlvbk1hcHBlciAiPGxpdGVyYWw+RXhjZXB0aW9uTWFwcGVyJmx0O0UgZXh0ZW5kcyBUaHJvd2FibGUmZ3Q7PC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamF4cnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyICI8bGl0ZXJhbD5NZXNzYWdlQm9keVJlYWRlciZsdDtUJmd0OzwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmpheHJzLmV4dC5NZXNzYWdlQm9keVdyaXRlciAiPGxpdGVyYWw+TWVzc2FnZUJvZHlXcml0ZXImbHQ7VCZndDs8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qYXhycy5leHQuUHJvdmlkZXIgIjxsaXRlcmFsPkBQcm92aWRlcjwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmpheHJzLmV4dC5Qcm92aWRlcnMgIjxsaXRlcmFsPlByb3ZpZGVyczwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmpheHJzLmV4dC5SdW50aW1lRGVsZWdhdGUgIjxsaXRlcmFsPlJ1bnRpbWVEZWxlZ2F0ZTwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmpheHJzLmV4dC5SdW50aW1lRGVsZWdhdGUuSGVhZGVyRGVsZWdhdGUgIjxsaXRlcmFsPlJ1bnRpbWVEZWxlZ2F0ZS5IZWFkZXJEZWxlZ2F0ZSZsdDtUJmd0OzwvbGl0ZXJhbD4iPgorCis8IUVOVElUWSBsaXQuamRrNi5Cb29sZWFuICI8bGl0ZXJhbD5Cb29sZWFuPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamRrNi5DZXJ0aWZpY2F0ZUV4Y2VwdGlvbiAiPGxpdGVyYWw+Q2VydGlmaWNhdGVFeGNlcHRpb248L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZGs2LkNoYXJhY3RlciAiPGxpdGVyYWw+Q2hhcmFjdGVyPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamRrNi5EYXRhU291cmNlICI8bGl0ZXJhbD5EYXRhU291cmNlPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamRrNi5EeW5hbWljTUJlYW4gIjxsaXRlcmFsPkR5bmFtaWNNQmVhbjwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmpkazYuRmlsZSAiPGxpdGVyYWw+RmlsZTwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmpkazYuRXhlY3V0b3JTZXJ2aWNlICI8bGl0ZXJhbD5FeGVjdXRvclNlcnZpY2U8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZGs2Lkhvc3RuYW1lVmVyaWZpZXIgIjxsaXRlcmFsPkhvc3RuYW1lVmVyaWZpZXI8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZGs2Lkh0dHBVcmxDb25uZWN0aW9uICI8bGl0ZXJhbD5IdHRwVXJsQ29ubmVjdGlvbjwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmpkazYuSW5wdXRTdHJlYW0gIjxsaXRlcmFsPklucHV0U3RyZWFtPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamRrNi5KQVhCRWxlbWVudCAiPGxpdGVyYWw+SkFYQkVsZW1lbnQ8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZGs2LktleVN0b3JlICI8bGl0ZXJhbD5LZXlTdG9yZTwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmpkazYuTnVtYmVyICI8bGl0ZXJhbD5OdW1iZXI8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZGs2Lk9iamVjdE5hbWUgIjxsaXRlcmFsPk9iamVjdE5hbWU8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZGs2LlBhcmFtZXRlcml6ZWRUeXBlICI8bGl0ZXJhbD5QYXJhbWV0ZXJpemVkVHlwZTwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmpkazYuUmVhZGVyICI8bGl0ZXJhbD5SZWFkZXI8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZGs2LlNvdXJjZSAiPGxpdGVyYWw+U291cmNlPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamRrNi5Tc2xDb250ZXh0ICI8bGl0ZXJhbD5Tc2xDb250ZXh0PC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamRrNi5TdHJpbmcgIjxsaXRlcmFsPlN0cmluZzwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmpkazYuVHJ1c3RTdG9yZSAiPGxpdGVyYWw+VHJ1c3RTdG9yZTwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmpkazYuVVJJICI8bGl0ZXJhbD5VUkk8L2xpdGVyYWw+Ij4KKworPCFFTlRJVFkgbGl0LmpkazguQ29tcGxldGFibGVGdXR1cmUgIjxsaXRlcmFsPkNvbXBsZXRhYmxlRnV0dXJlPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamRrOC5Db21wbGV0aW9uU3RhZ2UgIjxsaXRlcmFsPkNvbXBsZXRpb25TdGFnZTwvbGl0ZXJhbD4iPgorCis8IUVOVElUWSBsaXQuamVlNi5hbm5vdGF0aW9ucy5QZXJtaXRBbGwgIjxsaXRlcmFsPkBQZXJtaXRBbGw8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZWU2LmFubm90YXRpb25zLlJvbGVzQWxsb3dlZCAiPGxpdGVyYWw+QFJvbGVzQWxsb3dlZDwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplZTYuaW5qZWN0LlNpbmdsZXRvbiAiPGxpdGVyYWw+QFNpbmdsZXRvbjwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplZTYuamF2YXguaW5qZWN0LkluamVjdCAiPGxpdGVyYWw+QEluamVjdDwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplZTYuamF2YXguaW5qZWN0LlByb3ZpZGVyICI8bGl0ZXJhbD5Qcm92aWRlcjwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplZTYuamF2YXguaW5qZWN0LlNpbmdsZXRvbiAiPGxpdGVyYWw+QFNpbmdsZXRvbjwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplZTYuc2VydmxldC5IdHRwU2VydmxldFJlcXVlc3QgIjxsaXRlcmFsPkh0dHBTZXJ2bGV0UmVxdWVzdDwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplZTYuc2VydmxldC5IdHRwU2Vzc2lvbiAiPGxpdGVyYWw+SHR0cFNlc3Npb248L2xpdGVyYWw+Ij4KKworPCFFTlRJVFkgbGl0LmplcnNleS5hcGFjaGUuQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXIgIjxsaXRlcmFsPkFwYWNoZUNvbm5lY3RvclByb3ZpZGVyPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LmNsaWVudC5DaHVua1BhcnNlciAiPGxpdGVyYWw+Q2h1bmtQYXJzZXI8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuY2xpZW50LkNodW5rUGFyc2VyICI8bGl0ZXJhbD5DaHVua1BhcnNlcjwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5jbGllbnQuQ2h1bmtlZElucHV0ICI8bGl0ZXJhbD5DaHVua2VkSW5wdXQ8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuY2xpZW50LkNsaWVudEFzeW5jRXhlY3V0b3IgIjxsaXRlcmFsPkBDbGllbnRBc3luY0V4ZWN1dG9yPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LmNsaWVudC5DbGllbnRBc3luY0V4ZWN1dG9yTGl0ZXJhbCAiPGxpdGVyYWw+Q2xpZW50QXN5bmNFeGVjdXRvckxpdGVyYWw8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZyAiPGxpdGVyYWw+Q2xpZW50Q29uZmlnPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzICI8bGl0ZXJhbD5DbGllbnRQcm9wZXJ0aWVzPC9saXRlcmFsPiIgPgorPCFFTlRJVFkgbGl0LmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllcy5BU1lOQ19USFJFQURQT09MX1NJWkUgIjxsaXRlcmFsPkNsaWVudFByb3BlcnRpZXMuQVNZTkNfVEhSRUFEUE9PTF9TSVpFPC9saXRlcmFsPiIgPgorPCFFTlRJVFkgbGl0LmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllcy5CVUZGRVJfUkVTUE9OU0VfRU5USVRZX09OX0VYQ0VQVElPTiAiPGxpdGVyYWw+Q2xpZW50UHJvcGVydGllcy5CVUZGRVJfUkVTUE9OU0VfRU5USVRZX09OX0VYQ0VQVElPTjwvbGl0ZXJhbD4iID4KKzwhRU5USVRZIGxpdC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXMuQ0hVTktFRF9FTkNPRElOR19TSVpFICI8bGl0ZXJhbD5DbGllbnRQcm9wZXJ0aWVzLkNIVU5LRURfRU5DT0RJTkdfU0laRTwvbGl0ZXJhbD4iID4KKzwhRU5USVRZIGxpdC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXMuQ09OTkVDVF9USU1FT1VUICI8bGl0ZXJhbD5DbGllbnRQcm9wZXJ0aWVzLkNPTk5FQ1RfVElNRU9VVDwvbGl0ZXJhbD4iID4KKzwhRU5USVRZIGxpdC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXMuREVGQVVMVF9DSFVOS19TSVpFICI8bGl0ZXJhbD5DbGllbnRQcm9wZXJ0aWVzLkRFRkFVTFRfQ0hVTktfU0laRTwvbGl0ZXJhbD4iID4KKzwhRU5USVRZIGxpdC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXMuRkVBVFVSRV9BVVRPX0RJU0NPVkVSWV9ESVNBQkxFICI8bGl0ZXJhbD5DbGllbnRQcm9wZXJ0aWVzLkZFQVRVUkVfQVVUT19ESVNDT1ZFUllfRElTQUJMRTwvbGl0ZXJhbD4iID4KKzwhRU5USVRZIGxpdC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXMuRk9MTE9XX1JFRElSRUNUUyAiPGxpdGVyYWw+Q2xpZW50UHJvcGVydGllcy5GT0xMT1dfUkVESVJFQ1RTPC9saXRlcmFsPiIgPgorPCFFTlRJVFkgbGl0LmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllcy5KU09OX1BST0NFU1NJTkdfRkVBVFVSRV9ESVNBQkxFICI8bGl0ZXJhbD5DbGllbnRQcm9wZXJ0aWVzLkpTT05fUFJPQ0VTU0lOR19GRUFUVVJFX0RJU0FCTEU8L2xpdGVyYWw+IiA+Cis8IUVOVElUWSBsaXQuamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzLk1FVEFJTkZfU0VSVklDRVNfTE9PS1VQX0RJU0FCTEUgIjxsaXRlcmFsPkNsaWVudFByb3BlcnRpZXMuTUVUQUlORl9TRVJWSUNFU19MT09LVVBfRElTQUJMRTwvbGl0ZXJhbD4iID4KKzwhRU5USVRZIGxpdC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXMuTU9YWV9KU09OX0ZFQVRVUkVfRElTQUJMRSAiPGxpdGVyYWw+Q2xpZW50UHJvcGVydGllcy5NT1hZX0pTT05fRkVBVFVSRV9ESVNBQkxFPC9saXRlcmFsPiIgPgorPCFFTlRJVFkgbGl0LmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllcy5PVVRCT1VORF9DT05URU5UX0xFTkdUSF9CVUZGRVIgIjxsaXRlcmFsPkNsaWVudFByb3BlcnRpZXMuT1VUQk9VTkRfQ09OVEVOVF9MRU5HVEhfQlVGRkVSPC9saXRlcmFsPiIgPgorPCFFTlRJVFkgbGl0LmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllcy5QUk9YWV9QQVNTV09SRCAiPGxpdGVyYWw+Q2xpZW50UHJvcGVydGllcy5QUk9YWV9QQVNTV09SRDwvbGl0ZXJhbD4iID4KKzwhRU5USVRZIGxpdC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXMuUFJPWFlfVVJJICI8bGl0ZXJhbD5DbGllbnRQcm9wZXJ0aWVzLlBST1hZX1VSSTwvbGl0ZXJhbD4iID4KKzwhRU5USVRZIGxpdC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXMuUFJPWFlfVVNFUk5BTUUgIjxsaXRlcmFsPkNsaWVudFByb3BlcnRpZXMuUFJPWFlfVVNFUk5BTUU8L2xpdGVyYWw+IiA+Cis8IUVOVElUWSBsaXQuamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzLlJFQURfVElNRU9VVCAiPGxpdGVyYWw+Q2xpZW50UHJvcGVydGllcy5SRUFEX1RJTUVPVVQ8L2xpdGVyYWw+IiA+Cis8IUVOVElUWSBsaXQuamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzLlJFUVVFU1RfRU5USVRZX1BST0NFU1NJTkcgIjxsaXRlcmFsPkNsaWVudFByb3BlcnRpZXMuUkVRVUVTVF9FTlRJVFlfUFJPQ0VTU0lORzwvbGl0ZXJhbD4iID4KKzwhRU5USVRZIGxpdC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXMuU1VQUFJFU1NfSFRUUF9DT01QTElBTkNFX1ZBTElEQVRJT04gIjxsaXRlcmFsPkNsaWVudFByb3BlcnRpZXMuU1VQUFJFU1NfSFRUUF9DT01QTElBTkNFX1ZBTElEQVRJT048L2xpdGVyYWw+IiA+Cis8IUVOVElUWSBsaXQuamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzLlVTRV9FTkNPRElORyAiPGxpdGVyYWw+Q2xpZW50UHJvcGVydGllcy5VU0VfRU5DT0RJTkc8L2xpdGVyYWw+IiA+Cis8IUVOVElUWSBsaXQuamVyc2V5LmNsaWVudC5DbGllbnRMaWZlY3ljbGVMaXN0ZW5lciAiPGxpdGVyYWw+Q2xpZW50TGlmZWN5Y2xlTGlzdGVuZXI8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuY2xpZW50LkNvbm5lY3RvciAiPGxpdGVyYWw+Q29ubmVjdG9yPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LmNsaWVudC5Db25uZWN0b3JQcm92aWRlciAiPGxpdGVyYWw+Q29ubmVjdG9yUHJvdmlkZXI8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuY2xpZW50LkNzcmZQcm90ZWN0aW9uRmlsdGVyICI8bGl0ZXJhbD5Dc3JmUHJvdGVjdGlvbkZpbHRlcjwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5jbGllbnQuRW5jb2RpbmdGZWF0dXJlICI8bGl0ZXJhbD5FbmNvZGluZ0ZlYXR1cmU8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuY2xpZW50Lkh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUgIjxsaXRlcmFsPkh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmU8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuY2xpZW50Lkh0dHBVcmxDb25uZWN0b3JQcm92aWRlciAiPGxpdGVyYWw+SHR0cFVybENvbm5lY3RvclByb3ZpZGVyPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LmNsaWVudC5TZXJ2aWNlTG9jYXRvckNsaWVudFByb3ZpZGVyICI8bGl0ZXJhbD5TZXJ2aWNlTG9jYXRvckNsaWVudFByb3ZpZGVyPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LmNsaWVudC5vYXV0aDEuQWNjZXNzVG9rZW4gIjxsaXRlcmFsPkFjY2Vzc1Rva2VuPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LmNsaWVudC5vYXV0aDEuQ29uc3VtZXJDcmVkZW50aWFscyAiPGxpdGVyYWw+Q29uc3VtZXJDcmVkZW50aWFsczwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5jbGllbnQub2F1dGgxLk9BdXRoMUF1dGhvcml6YXRpb25GbG93ICI8bGl0ZXJhbD5PQXV0aDFBdXRob3JpemF0aW9uRmxvdzwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5jbGllbnQub2F1dGgxLk9BdXRoMUJ1aWxkZXIgIjxsaXRlcmFsPk9BdXRoMUJ1aWxkZXI8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuY2xpZW50Lm9hdXRoMS5PQXV0aDFDbGllbnRTdXBwb3J0ICI8bGl0ZXJhbD5PQXV0aDFDbGllbnRTdXBwb3J0PC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LmNsaWVudC5vYXV0aDIuQ2xpZW50SWRlbnRpZmllciAiPGxpdGVyYWw+Q2xpZW50SWRlbnRpZmllcjwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5jbGllbnQub2F1dGgyLk9BdXRoMkNsaWVudFN1cHBvcnQgIjxsaXRlcmFsPk9BdXRoMkNsaWVudFN1cHBvcnQ8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuY2xpZW50Lm9hdXRoMi5PQXV0aDJDb2RlR3JhbnRGbG93ICI8bGl0ZXJhbD5PQXV0aDJDb2RlR3JhbnRGbG93PC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LmNsaWVudC5vYXV0aDIuT0F1dGgyRmxvd0dvb2dsZUJ1aWxkZXIgIjxsaXRlcmFsPk9BdXRoMkZsb3dHb29nbGVCdWlsZGVyPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LmNsaWVudC5vYXV0aDIuT0F1dGgyUGFyYW1ldGVycyAiPGxpdGVyYWw+T0F1dGgyUGFyYW1ldGVyczwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5jbGllbnQub2F1dGgyLlRva2VuUmVzdWx0ICI8bGl0ZXJhbD5Ub2tlblJlc3VsdDwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5jb21tb24uQmV0YSAiPGxpdGVyYWw+QmV0YTwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5jb21tb24uQ29tbW9uUHJvcGVydGllcyAiPGxpdGVyYWw+Q29tbW9uUHJvcGVydGllczwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5jb21tb24uQ29tbW9uUHJvcGVydGllcy5GRUFUVVJFX0FVVE9fRElTQ09WRVJZX0RJU0FCTEUgIjxsaXRlcmFsPkNvbW1vblByb3BlcnRpZXMuRkVBVFVSRV9BVVRPX0RJU0NPVkVSWV9ESVNBQkxFPC9saXRlcmFsPiIgPgorPCFFTlRJVFkgbGl0LmplcnNleS5jb21tb24uQ29tbW9uUHJvcGVydGllcy5KU09OX1BST0NFU1NJTkdfRkVBVFVSRV9ESVNBQkxFICI8bGl0ZXJhbD5Db21tb25Qcm9wZXJ0aWVzLkpTT05fUFJPQ0VTU0lOR19GRUFUVVJFX0RJU0FCTEU8L2xpdGVyYWw+IiA+Cis8IUVOVElUWSBsaXQuamVyc2V5LmNvbW1vbi5Db21tb25Qcm9wZXJ0aWVzLk1FVEFJTkZfU0VSVklDRVNfTE9PS1VQX0RJU0FCTEUgIjxsaXRlcmFsPkNvbW1vblByb3BlcnRpZXMuTUVUQUlORl9TRVJWSUNFU19MT09LVVBfRElTQUJMRTwvbGl0ZXJhbD4iID4KKzwhRU5USVRZIGxpdC5qZXJzZXkuY29tbW9uLkNvbW1vblByb3BlcnRpZXMuTU9YWV9KU09OX0ZFQVRVUkVfRElTQUJMRSAiPGxpdGVyYWw+Q29tbW9uUHJvcGVydGllcy5NT1hZX0pTT05fRkVBVFVSRV9ESVNBQkxFPC9saXRlcmFsPiIgPgorPCFFTlRJVFkgbGl0LmplcnNleS5jb21tb24uQ29tbW9uUHJvcGVydGllcy5PVVRCT1VORF9DT05URU5UX0xFTkdUSF9CVUZGRVIgIjxsaXRlcmFsPkNvbW1vblByb3BlcnRpZXMuT1VUQk9VTkRfQ09OVEVOVF9MRU5HVEhfQlVGRkVSPC9saXRlcmFsPiIgPgorPCFFTlRJVFkgbGl0LmplcnNleS5jb21tb24uaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXIgIjxsaXRlcmFsPkluamVjdGlvbk1hbmFnZXI8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuY29tbW9uLlNlcnZpY2VMb2NhdG9yUHJvdmlkZXIgIjxsaXRlcmFsPlNlcnZpY2VMb2NhdG9yUHJvdmlkZXI8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuY29tbW9uLlNzbENvbmZpZ3VyYXRvciAiPGxpdGVyYWw+U3NsQ29uZmlndXJhdG9yPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LmNvbW1vbi5zcGkuQWJzdHJhY3RUaHJlYWRQb29sUHJvdmlkZXIgIjxsaXRlcmFsPkFic3RyYWN0VGhyZWFkUG9vbFByb3ZpZGVyPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LmNvbW1vbi5zcGkuQ29udGVudEVuY29kZXIgIjxsaXRlcmFsPkNvbnRlbnRFbmNvZGVyPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LmNvbW1vbi5zcGkuRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXIgIjxsaXRlcmFsPkV4ZWN1dG9yU2VydmljZVByb3ZpZGVyPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LmNvbW1vbi5zcGkuU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXIgIjxsaXRlcmFsPlNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LmNvbW1vbi5zcGkuU2NoZWR1bGVkVGhyZWFkUG9vbFByb3ZpZGVyICI8bGl0ZXJhbD5TY2hlZHVsZWRUaHJlYWRQb29sUHJvdmlkZXI8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuY29tbW9uLnNwaS5UaHJlYWRQb29sUHJvdmlkZXIgIjxsaXRlcmFsPlRocmVhZFBvb2xQcm92aWRlcjwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5jb21tb24udXJpLlVyaVRlbXBsYXRlICI8bGl0ZXJhbD5VcmlUZW1wbGF0ZTwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5leHQuVmFsaWRhdGlvbkNvbmZpZyAiPGxpdGVyYWw+VmFsaWRhdGlvbkNvbmZpZzwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5leHQuVmFsaWRhdGlvbkVycm9yICI8bGl0ZXJhbD5WYWxpZGF0aW9uRXJyb3I8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuZXh0LnJ4LmNsaWVudC5ndWF2YS5SeExpc3RlbmFibGVGdXR1cmUgIjxsaXRlcmFsPlJ4TGlzdGVuYWJsZUZ1dHVyZTwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5leHQucnguY2xpZW50Lmd1YXZhLlJ4TGlzdGVuYWJsZUZ1dHVyZUludm9rZXIgIjxsaXRlcmFsPlJ4TGlzdGVuYWJsZUZ1dHVyZUludm9rZXI8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuZXh0LnJ4LmNsaWVudC5yeGphdmEuUnhPYnNlcnZhYmxlSW52b2tlciAiPGxpdGVyYWw+UnhPYnNlcnZhYmxlSW52b2tlcjwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5leHQucnguY2xpZW50LnJ4amF2YTIuUnhGbG93YWJsZUludm9rZXIgIjxsaXRlcmFsPlJ4Rmxvd2FibGVJbnZva2VyPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LmdyaXp6bHkuR3JpenpseUNvbm5lY3RvclByb3ZpZGVyICI8bGl0ZXJhbD5Hcml6emx5Q29ubmVjdG9yUHJvdmlkZXI8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuZ3JpenpseS5Hcml6emx5SHR0cENvbnRhaW5lciAiPGxpdGVyYWw+R3JpenpseUh0dHBDb250YWluZXI8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuZ3JpenpseS5Hcml6emx5SHR0cENvbnRhaW5lclByb3ZpZGVyICI8bGl0ZXJhbD5Hcml6emx5SHR0cENvbnRhaW5lclByb3ZpZGVyPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LmdyaXp6bHkuR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5ICI8bGl0ZXJhbD5Hcml6emx5SHR0cFNlcnZlckZhY3Rvcnk8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuZ3JpenpseS5Hcml6emx5V2ViQ29udGFpbmVyRmFjdG9yeSAiPGxpdGVyYWw+R3JpenpseVdlYkNvbnRhaW5lckZhY3Rvcnk8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuamRraHR0cC5KZGtIdHRwSGFuZGxlckNvbnRhaW5lciAiPGxpdGVyYWw+SmRrSHR0cEhhbmRsZXJDb250YWluZXI8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuamRraHR0cC5KZGtIdHRwSGFuZGxlckNvbnRhaW5lclByb3ZpZGVyICI8bGl0ZXJhbD5KZGtIdHRwSGFuZGxlckNvbnRhaW5lclByb3ZpZGVyPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5Lmpka2h0dHAuSmRrSHR0cFNlcnZlckZhY3RvcnkgIjxsaXRlcmFsPkpka0h0dHBTZXJ2ZXJGYWN0b3J5PC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LmpldHR5LkpldHR5Q29ubmVjdG9yUHJvdmlkZXIgIjxsaXRlcmFsPkpldHR5Q29ubmVjdG9yUHJvdmlkZXI8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuamV0dHkuSmV0dHlIdHRwQ29udGFpbmVyICI8bGl0ZXJhbD5KZXR0eUh0dHBDb250YWluZXI8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuamV0dHkuSmV0dHlIdHRwQ29udGFpbmVyRmFjdG9yeSAiPGxpdGVyYWw+SmV0dHlIdHRwQ29udGFpbmVyRmFjdG9yeTwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5qZXR0eS5KZXR0eUh0dHBDb250YWluZXJQcm92aWRlciAiPGxpdGVyYWw+SmV0dHlIdHRwQ29udGFpbmVyUHJvdmlkZXI8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuamV0dHkuSmV0dHlXZWJDb250YWluZXJGYWN0b3J5ICI8bGl0ZXJhbD5KZXR0eVdlYkNvbnRhaW5lckZhY3Rvcnk8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkubGlua2luZy5EZWNsYXJhdGl2ZUxpbmtpbmdGZWF0dXJlICI8bGl0ZXJhbD5EZWNsYXJhdGl2ZUxpbmtpbmdGZWF0dXJlPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmUgIjxsaXRlcmFsPkxvZ2dpbmdGZWF0dXJlPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmUuREVGQVVMVF9MT0dHRVJfTkFNRSAiPGxpdGVyYWw+TG9nZ2luZ0ZlYXR1cmUuREVGQVVMVF9MT0dHRVJfTkFNRTwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlLkRFRkFVTFRfTE9HR0VSX0xFVkVMICI8bGl0ZXJhbD5Mb2dnaW5nRmVhdHVyZS5ERUZBVUxUX0xPR0dFUl9MRVZFTDwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlLkRFRkFVTFRfVkVSQk9TSVRZICI8bGl0ZXJhbD5Mb2dnaW5nRmVhdHVyZS5ERUZBVUxUX1ZFUkJPU0lUWTwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlLkRFRkFVTFRfTUFYX0VOVElUWV9TSVpFICI8bGl0ZXJhbD5Mb2dnaW5nRmVhdHVyZS5ERUZBVUxUX01BWF9FTlRJVFlfU0laRTwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlLkxPR0dJTkdfRkVBVFVSRV9MT0dHRVJfTkFNRSAiPGxpdGVyYWw+TG9nZ2luZ0ZlYXR1cmUuTE9HR0lOR19GRUFUVVJFX0xPR0dFUl9OQU1FPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmUuTE9HR0lOR19GRUFUVVJFX0xPR0dFUl9MRVZFTCAiPGxpdGVyYWw+TG9nZ2luZ0ZlYXR1cmUuTE9HR0lOR19GRUFUVVJFX0xPR0dFUl9MRVZFTDwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlLkxPR0dJTkdfRkVBVFVSRV9WRVJCT1NJVFkgIjxsaXRlcmFsPkxvZ2dpbmdGZWF0dXJlLkxPR0dJTkdfRkVBVFVSRV9WRVJCT1NJVFk8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZS5MT0dHSU5HX0ZFQVRVUkVfTUFYX0VOVElUWV9TSVpFICI8bGl0ZXJhbD5Mb2dnaW5nRmVhdHVyZS5MT0dHSU5HX0ZFQVRVUkVfTUFYX0VOVElUWV9TSVpFPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmUuTE9HR0lOR19GRUFUVVJFX0xPR0dFUl9OQU1FX0NMSUVOVCAiPGxpdGVyYWw+TG9nZ2luZ0ZlYXR1cmUuTE9HR0lOR19GRUFUVVJFX0xPR0dFUl9OQU1FX0NMSUVOVDwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlLkxPR0dJTkdfRkVBVFVSRV9MT0dHRVJfTEVWRUxfQ0xJRU5UICI8bGl0ZXJhbD5Mb2dnaW5nRmVhdHVyZS5MT0dHSU5HX0ZFQVRVUkVfTE9HR0VSX0xFVkVMX0NMSUVOVDwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlLkxPR0dJTkdfRkVBVFVSRV9WRVJCT1NJVFlfQ0xJRU5UICI8bGl0ZXJhbD5Mb2dnaW5nRmVhdHVyZS5MT0dHSU5HX0ZFQVRVUkVfVkVSQk9TSVRZX0NMSUVOVDwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlLkxPR0dJTkdfRkVBVFVSRV9NQVhfRU5USVRZX1NJWkVfQ0xJRU5UICI8bGl0ZXJhbD5Mb2dnaW5nRmVhdHVyZS5MT0dHSU5HX0ZFQVRVUkVfTUFYX0VOVElUWV9TSVpFX0NMSUVOVDwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlLkxPR0dJTkdfRkVBVFVSRV9MT0dHRVJfTkFNRV9TRVJWRVIgIjxsaXRlcmFsPkxvZ2dpbmdGZWF0dXJlLkxPR0dJTkdfRkVBVFVSRV9MT0dHRVJfTkFNRV9TRVJWRVI8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZS5MT0dHSU5HX0ZFQVRVUkVfTE9HR0VSX0xFVkVMX1NFUlZFUiAiPGxpdGVyYWw+TG9nZ2luZ0ZlYXR1cmUuTE9HR0lOR19GRUFUVVJFX0xPR0dFUl9MRVZFTF9TRVJWRVI8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZS5MT0dHSU5HX0ZFQVRVUkVfVkVSQk9TSVRZX1NFUlZFUiAiPGxpdGVyYWw+TG9nZ2luZ0ZlYXR1cmUuTE9HR0lOR19GRUFUVVJFX1ZFUkJPU0lUWV9TRVJWRVI8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZS5MT0dHSU5HX0ZFQVRVUkVfTUFYX0VOVElUWV9TSVpFX1NFUlZFUiAiPGxpdGVyYWw+TG9nZ2luZ0ZlYXR1cmUuTE9HR0lOR19GRUFUVVJFX01BWF9FTlRJVFlfU0laRV9TRVJWRVI8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZS5WZXJib3NpdHkgIjxsaXRlcmFsPkxvZ2dpbmdGZWF0dXJlLlZlcmJvc2l0eTwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlLlZlcmJvc2l0eS5IRUFERVJTX09OTFkgIjxsaXRlcmFsPkxvZ2dpbmdGZWF0dXJlLlZlcmJvc2l0eS5IRUFERVJTX09OTFk8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZS5WZXJib3NpdHkuUEFZTE9BRF9BTlkgIjxsaXRlcmFsPkxvZ2dpbmdGZWF0dXJlLlZlcmJvc2l0eS5QQVlMT0FEX0FOWTwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlLlZlcmJvc2l0eS5QQVlMT0FEX1RFWFQgIjxsaXRlcmFsPkxvZ2dpbmdGZWF0dXJlLlZlcmJvc2l0eS5QQVlMT0FEX1RFWFQ8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmlsdGVyICI8bGl0ZXJhbD5Mb2dnaW5nRmlsdGVyPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5Lm1lZGlhLkphY2tzb25GZWF0dXJlICI8bGl0ZXJhbD5KYWNrc29uRmVhdHVyZTwvbGl0ZXJhbD4iID4KKzwhRU5USVRZIGxpdC5qZXJzZXkubWVkaWEuSmV0dGlzb25Db25maWcgIjxsaXRlcmFsPkpldHRpc29uQ29uZmlnPC9saXRlcmFsPiIgPgorPCFFTlRJVFkgbGl0LmplcnNleS5tZWRpYS5KZXR0aXNvbkpheGJDb250ZXh0ICI8bGl0ZXJhbD5KZXR0aXNvbkpheGJDb250ZXh0PC9saXRlcmFsPiIgPgorPCFFTlRJVFkgbGl0LmplcnNleS5tZWRpYS5Kc29uUHJvY2Vzc2luZ0ZlYXR1cmUgIjxsaXRlcmFsPkpzb25Qcm9jZXNzaW5nRmVhdHVyZTwvbGl0ZXJhbD4iID4KKzwhRU5USVRZIGxpdC5qZXJzZXkubWVkaWEuTW94eUpzb25Db25maWcgIjxsaXRlcmFsPk1veHlKc29uQ29uZmlnPC9saXRlcmFsPiIgPgorPCFFTlRJVFkgbGl0LmplcnNleS5tZWRpYS5Nb3h5SnNvbkZlYXR1cmUgIjxsaXRlcmFsPk1veHlKc29uRmVhdHVyZTwvbGl0ZXJhbD4iID4KKzwhRU5USVRZIGxpdC5qZXJzZXkubWVkaWEuT2JqZWN0TWFwcGVyICI8bGl0ZXJhbD5PYmplY3RNYXBwZXI8L2xpdGVyYWw+IiA+Cis8IUVOVElUWSBsaXQuamVyc2V5Lm1lZGlhLm11bHRpcGFydC5Cb2R5UGFydCAiPGxpdGVyYWw+Qm9keVBhcnQ8L2xpdGVyYWw+IiA+Cis8IUVOVElUWSBsaXQuamVyc2V5Lm1lZGlhLm11bHRpcGFydC5Gb3JtRGF0YUJvZHlQYXJ0ICI8bGl0ZXJhbD5Gb3JtRGF0YUJvZHlQYXJ0PC9saXRlcmFsPiIgPgorPCFFTlRJVFkgbGl0LmplcnNleS5tZWRpYS5tdWx0aXBhcnQuRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24gIjxsaXRlcmFsPkZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uPC9saXRlcmFsPiIgPgorPCFFTlRJVFkgbGl0LmplcnNleS5tZWRpYS5tdWx0aXBhcnQuRm9ybURhdGFNdWx0aVBhcnQgIjxsaXRlcmFsPkZvcm1EYXRhTXVsdGlQYXJ0PC9saXRlcmFsPiIgPgorPCFFTlRJVFkgbGl0LmplcnNleS5tZWRpYS5tdWx0aXBhcnQuRm9ybURhdGFQYXJhbSAiPGxpdGVyYWw+QEZvcm1EYXRhUGFyYW08L2xpdGVyYWw+IiA+Cis8IUVOVElUWSBsaXQuamVyc2V5Lm1lZGlhLm11bHRpcGFydC5NdWx0aVBhcnQgIjxsaXRlcmFsPk11bHRpUGFydDwvbGl0ZXJhbD4iID4KKzwhRU5USVRZIGxpdC5qZXJzZXkubWVzc2FnZS5NZXNzYWdlQm9keVdvcmtlcnMgIjxsaXRlcmFsPk1lc3NhZ2VCb2R5V29ya2VyczwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5tZXNzYWdlLk1lc3NhZ2VQcm9wZXJ0aWVzICI8bGl0ZXJhbD5NZXNzYWdlUHJvcGVydGllczwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5FbnRpdHlGaWx0ZXJpbmdGZWF0dXJlICI8bGl0ZXJhbD5FbnRpdHlGaWx0ZXJpbmdGZWF0dXJlPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLlNlY3VyaXR5RW50aXR5RmlsdGVyaW5nRmVhdHVyZSAiPGxpdGVyYWw+U2VjdXJpdHlFbnRpdHlGaWx0ZXJpbmdGZWF0dXJlPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5Lm5ldHR5Lk5ldHR5Q29ubmVjdG9yUHJvdmlkZXIgIjxsaXRlcmFsPk5ldHR5Q29ubmVjdG9yUHJvdmlkZXI8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlciAiPGxpdGVyYWw+QXBwbGljYXRpb25IYW5kbGVyPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LnNlcnZlci5CYWNrZ3JvdW5kU2NoZWR1bGVyICI8bGl0ZXJhbD5AQmFja2dyb3VuZFNjaGVkdWxlcjwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5zZXJ2ZXIuQmFja2dyb3VuZFNjaGVkdWxlckxpdGVyYWwgIjxsaXRlcmFsPkJhY2tncm91bmRTY2hlZHVsZXJMaXRlcmFsPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LnNlcnZlci5Ccm9hZGNhc3RlciAiPGxpdGVyYWw+QnJvYWRjYXN0ZXI8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuc2VydmVyLkJyb2FkY2FzdGVyTGlzdGVuZXIgIjxsaXRlcmFsPkJyb2FkY2FzdGVyTGlzdGVuZXI8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuc2VydmVyLkNodW5rZWRPdXRwdXQgIjxsaXRlcmFsPkNodW5rZWRPdXRwdXQ8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyICI8bGl0ZXJhbD5Db250YWluZXJMaWZlY3ljbGVMaXN0ZW5lcjwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdCAiPGxpdGVyYWw+Q29udGFpbmVyUmVxdWVzdDwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVzcG9uc2UgIjxsaXRlcmFsPkNvbnRhaW5lclJlc3BvbnNlPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LnNlcnZlci5FeHRlbmRlZFJlc291cmNlICI8bGl0ZXJhbD5ARXh0ZW5kZWRSZXNvdXJjZTwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5zZXJ2ZXIuSlNPTlAgIjxsaXRlcmFsPkBKU09OUDwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5zZXJ2ZXIuTWFuYWdlZEFzeW5jRXhlY3V0b3IgIjxsaXRlcmFsPkBNYW5hZ2VkQXN5bmNFeGVjdXRvcjwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5zZXJ2ZXIuTWFuYWdlZEFzeW5jRXhlY3V0b3JMaXRlcmFsICI8bGl0ZXJhbD5NYW5hZ2VkQXN5bmNFeGVjdXRvckxpdGVyYWw8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuc2VydmVyLk1vZGVsUHJvY2Vzc29yICI8bGl0ZXJhbD5Nb2RlbFByb2Nlc3NvcjwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWcgIjxsaXRlcmFsPlJlc291cmNlQ29uZmlnPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LnNlcnZlci5SZXNvdXJjZUZpbmRlciAiPGxpdGVyYWw+UmVzb3VyY2VGaW5kZXI8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuc2VydmVyLlJlc3BvbnNlRXJyb3JNYXBwZXIgIjxsaXRlcmFsPlJlc3BvbnNlRXJyb3JNYXBwZXI8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuc2VydmVyLlJvbGVzQWxsb3dlZER5bmFtaWNGZWF0dXJlICI8bGl0ZXJhbD5Sb2xlc0FsbG93ZWREeW5hbWljRmVhdHVyZTwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcyAiPGxpdGVyYWw+U2VydmVyUHJvcGVydGllczwvbGl0ZXJhbD4iID4KKzwhRU5USVRZIGxpdC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMuQVBQTElDQVRJT05fTkFNRSAiPGxpdGVyYWw+U2VydmVyUHJvcGVydGllcy5BUFBMSUNBVElPTl9OQU1FPC9saXRlcmFsPiIgPgorPCFFTlRJVFkgbGl0LmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcy5CVl9ESVNBQkxFX1ZBTElEQVRFX09OX0VYRUNVVEFCTEVfT1ZFUlJJREVfQ0hFQ0sgIjxsaXRlcmFsPlNlcnZlclByb3BlcnRpZXMuQlZfRElTQUJMRV9WQUxJREFURV9PTl9FWEVDVVRBQkxFX09WRVJSSURFX0NIRUNLPC9saXRlcmFsPiIgPgorPCFFTlRJVFkgbGl0LmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcy5CVl9GRUFUVVJFX0RJU0FCTEUgIjxsaXRlcmFsPlNlcnZlclByb3BlcnRpZXMuQlZfRkVBVFVSRV9ESVNBQkxFPC9saXRlcmFsPiIgPgorPCFFTlRJVFkgbGl0LmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcy5CVl9TRU5EX0VSUk9SX0lOX1JFU1BPTlNFICI8bGl0ZXJhbD5TZXJ2ZXJQcm9wZXJ0aWVzLkJWX1NFTkRfRVJST1JfSU5fUkVTUE9OU0U8L2xpdGVyYWw+IiA+Cis8IUVOVElUWSBsaXQuamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzLkZFQVRVUkVfQVVUT19ESVNDT1ZFUllfRElTQUJMRSAiPGxpdGVyYWw+U2VydmVyUHJvcGVydGllcy5GRUFUVVJFX0FVVE9fRElTQ09WRVJZX0RJU0FCTEU8L2xpdGVyYWw+IiA+Cis8IUVOVElUWSBsaXQuamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzLkhUVFBfTUVUSE9EX09WRVJSSURFICI8bGl0ZXJhbD5TZXJ2ZXJQcm9wZXJ0aWVzLkhUVFBfTUVUSE9EX09WRVJSSURFPC9saXRlcmFsPiIgPgorPCFFTlRJVFkgbGl0LmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcy5KU09OX1BST0NFU1NJTkdfRkVBVFVSRV9ESVNBQkxFICI8bGl0ZXJhbD5TZXJ2ZXJQcm9wZXJ0aWVzLkpTT05fUFJPQ0VTU0lOR19GRUFUVVJFX0RJU0FCTEU8L2xpdGVyYWw+IiA+Cis8IUVOVElUWSBsaXQuamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzLkxBTkdVQUdFX01BUFBJTkdTICI8bGl0ZXJhbD5TZXJ2ZXJQcm9wZXJ0aWVzLkxBTkdVQUdFX01BUFBJTkdTPC9saXRlcmFsPiIgPgorPCFFTlRJVFkgbGl0LmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcy5NRURJQV9UWVBFX01BUFBJTkdTICI8bGl0ZXJhbD5TZXJ2ZXJQcm9wZXJ0aWVzLk1FRElBX1RZUEVfTUFQUElOR1M8L2xpdGVyYWw+IiA+Cis8IUVOVElUWSBsaXQuamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzLk1FVEFJTkZfU0VSVklDRVNfTE9PS1VQX0RJU0FCTEUgIjxsaXRlcmFsPlNlcnZlclByb3BlcnRpZXMuTUVUQUlORl9TRVJWSUNFU19MT09LVVBfRElTQUJMRTwvbGl0ZXJhbD4iID4KKzwhRU5USVRZIGxpdC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMuTU9OSVRPUklOR19FTkFCTEVEICI8bGl0ZXJhbD5TZXJ2ZXJQcm9wZXJ0aWVzLk1PTklUT1JJTkdfRU5BQkxFRDwvbGl0ZXJhbD4iID4KKzwhRU5USVRZIGxpdC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMuTU9OSVRPUklOR19TVEFUSVNUSUNTX0VOQUJMRUQgIjxsaXRlcmFsPlNlcnZlclByb3BlcnRpZXMuTU9OSVRPUklOR19TVEFUSVNUSUNTX0VOQUJMRUQ8L2xpdGVyYWw+IiA+Cis8IUVOVElUWSBsaXQuamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzLk1PTklUT1JJTkdfU1RBVElTVElDU19NQkVBTlNfRU5BQkxFRCAiPGxpdGVyYWw+U2VydmVyUHJvcGVydGllcy5NT05JVE9SSU5HX1NUQVRJU1RJQ1NfTUJFQU5TX0VOQUJMRUQ8L2xpdGVyYWw+IiA+Cis8IUVOVElUWSBsaXQuamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzLk1PTklUT1JJTkdfU1RBVElTVElDU19SRUZSRVNIX0lOVEVSVkFMICI8bGl0ZXJhbD5TZXJ2ZXJQcm9wZXJ0aWVzLk1PTklUT1JJTkdfU1RBVElTVElDU19SRUZSRVNIX0lOVEVSVkFMPC9saXRlcmFsPiIgPgorPCFFTlRJVFkgbGl0LmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcy5NT1hZX0pTT05fRkVBVFVSRV9ESVNBQkxFICI8bGl0ZXJhbD5TZXJ2ZXJQcm9wZXJ0aWVzLk1PWFlfSlNPTl9GRUFUVVJFX0RJU0FCTEU8L2xpdGVyYWw+IiA+Cis8IUVOVElUWSBsaXQuamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzLk9VVEJPVU5EX0NPTlRFTlRfTEVOR1RIX0JVRkZFUiAiPGxpdGVyYWw+U2VydmVyUHJvcGVydGllcy5PVVRCT1VORF9DT05URU5UX0xFTkdUSF9CVUZGRVI8L2xpdGVyYWw+IiA+Cis8IUVOVElUWSBsaXQuamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzLlBST0NFU1NJTkdfUkVTUE9OU0VfRVJST1JTX0VOQUJMRUQgIjxsaXRlcmFsPlNlcnZlclByb3BlcnRpZXMuUFJPQ0VTU0lOR19SRVNQT05TRV9FUlJPUlNfRU5BQkxFRDwvbGl0ZXJhbD4iID4KKzwhRU5USVRZIGxpdC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMuUFJPVklERVJfQ0xBU1NOQU1FUyAiPGxpdGVyYWw+U2VydmVyUHJvcGVydGllcy5QUk9WSURFUl9DTEFTU05BTUVTPC9saXRlcmFsPiIgPgorPCFFTlRJVFkgbGl0LmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcy5QUk9WSURFUl9DTEFTU1BBVEggIjxsaXRlcmFsPlNlcnZlclByb3BlcnRpZXMuUFJPVklERVJfQ0xBU1NQQVRIPC9saXRlcmFsPiIgPgorPCFFTlRJVFkgbGl0LmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcy5QUk9WSURFUl9QQUNLQUdFUyAiPGxpdGVyYWw+U2VydmVyUHJvcGVydGllcy5QUk9WSURFUl9QQUNLQUdFUzwvbGl0ZXJhbD4iID4KKzwhRU5USVRZIGxpdC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMuUFJPVklERVJfU0NBTk5JTkdfUkVDVVJTSVZFICI8bGl0ZXJhbD5TZXJ2ZXJQcm9wZXJ0aWVzLlBST1ZJREVSX1NDQU5OSU5HX1JFQ1VSU0lWRTwvbGl0ZXJhbD4iID4KKzwhRU5USVRZIGxpdC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMuUkVTT1VSQ0VfVkFMSURBVElPTl9ESVNBQkxFICI8bGl0ZXJhbD5TZXJ2ZXJQcm9wZXJ0aWVzLlJFU09VUkNFX1ZBTElEQVRJT05fRElTQUJMRTwvbGl0ZXJhbD4iID4KKzwhRU5USVRZIGxpdC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMuUkVTT1VSQ0VfVkFMSURBVElPTl9JR05PUkVfRVJST1JTICI8bGl0ZXJhbD5TZXJ2ZXJQcm9wZXJ0aWVzLlJFU09VUkNFX1ZBTElEQVRJT05fSUdOT1JFX0VSUk9SUzwvbGl0ZXJhbD4iID4KKzwhRU5USVRZIGxpdC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMuUkVTUE9OU0VfU0VUX1NUQVRVU19PVkVSX1NFTkRfRVJST1IgIjxsaXRlcmFsPlNlcnZlclByb3BlcnRpZXMuUkVTUE9OU0VfU0VUX1NUQVRVU19PVkVSX1NFTkRfRVJST1I8L2xpdGVyYWw+IiA+Cis8IUVOVElUWSBsaXQuamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzLlNVQlJFU09VUkNFX0xPQ0FUT1JfQ0FDSEVfU0laRSAiPGxpdGVyYWw+U2VydmVyUHJvcGVydGllcy5TVUJSRVNPVVJDRV9MT0NBVE9SX0NBQ0hFX1NJWkU8L2xpdGVyYWw+IiA+Cis8IUVOVElUWSBsaXQuamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzLlNVQlJFU09VUkNFX0xPQ0FUT1JfQ0FDSEVfQUdFICI8bGl0ZXJhbD5TZXJ2ZXJQcm9wZXJ0aWVzLlNVQlJFU09VUkNFX0xPQ0FUT1JfQ0FDSEVfQUdFPC9saXRlcmFsPiIgPgorPCFFTlRJVFkgbGl0LmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcy5TVUJSRVNPVVJDRV9MT0NBVE9SX0NBQ0hFX0pFUlNFWV9SRVNPVVJDRV9FTkFCTEVEICI8bGl0ZXJhbD5TZXJ2ZXJQcm9wZXJ0aWVzLlNVQlJFU09VUkNFX0xPQ0FUT1JfQ0FDSEVfSkVSU0VZX1JFU09VUkNFX0VOQUJMRUQ8L2xpdGVyYWw+IiA+Cis8IUVOVElUWSBsaXQuamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzLlRSQUNJTkcgIjxsaXRlcmFsPlNlcnZlclByb3BlcnRpZXMuVFJBQ0lORzwvbGl0ZXJhbD4iID4KKzwhRU5USVRZIGxpdC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMuVFJBQ0lOR19USFJFU0hPTEQgIjxsaXRlcmFsPlNlcnZlclByb3BlcnRpZXMuVFJBQ0lOR19USFJFU0hPTEQ8L2xpdGVyYWw+IiA+Cis8IUVOVElUWSBsaXQuamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzLldBRExfRkVBVFVSRV9ESVNBQkxFICI8bGl0ZXJhbD5TZXJ2ZXJQcm9wZXJ0aWVzLldBRExfRkVBVFVSRV9ESVNBQkxFPC9saXRlcmFsPiIgPgorPCFFTlRJVFkgbGl0LmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcy5XQURMX0dFTkVSQVRPUl9DT05GSUcgIjxsaXRlcmFsPlNlcnZlclByb3BlcnRpZXMuV0FETF9HRU5FUkFUT1JfQ09ORklHPC9saXRlcmFsPiIgPgorPCFFTlRJVFkgbGl0LmplcnNleS5zZXJ2ZXIuVXJpICI8bGl0ZXJhbD5Vcmk8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuc2VydmVyLldhZGxHZW5lcmF0b3IgIjxsaXRlcmFsPldhZGxHZW5lcmF0b3I8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuc2VydmVyLldhZGxHZW5lcmF0b3JDb25maWcgIjxsaXRlcmFsPldhZGxHZW5lcmF0b3JDb25maWc8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuQXBwbGljYXRpb25FdmVudCAiPGxpdGVyYWw+QXBwbGljYXRpb25FdmVudDwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5BcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXIgIjxsaXRlcmFsPkFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lcjwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5BcHBsaWNhdGlvbk1YQmVhbiAiPGxpdGVyYWw+QXBwbGljYXRpb25NWEJlYW48L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuRXhjZXB0aW9uTWFwcGVyTVhCZWFuICI8bGl0ZXJhbD5FeGNlcHRpb25NYXBwZXJNWEJlYW48L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuRXhjZXB0aW9uTWFwcGVyU3RhdGlzdGljcyAiPGxpdGVyYWw+RXhjZXB0aW9uTWFwcGVyU3RhdGlzdGljczwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5FeGVjdXRpb25TdGF0aXN0aWNzICI8bGl0ZXJhbD5FeGVjdXRpb25TdGF0aXN0aWNzPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLkFwcGxpY2F0aW9uSW5mbyAiPGxpdGVyYWw+QXBwbGljYXRpb25JbmZvPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLk1vbml0b3JpbmdTdGF0aXN0aWNzICI8bGl0ZXJhbD5Nb25pdG9yaW5nU3RhdGlzdGljczwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5Nb25pdG9yaW5nU3RhdGlzdGljc0xpc3RlbmVyICI8bGl0ZXJhbD5Nb25pdG9yaW5nU3RhdGlzdGljc0xpc3RlbmVyPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLkRlc3Ryb3lMaXN0ZW5lciAiPGxpdGVyYWw+RGVzdHJveUxpc3RlbmVyPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLlJlcXVlc3RFdmVudCAiPGxpdGVyYWw+UmVxdWVzdEV2ZW50PC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLlJlcXVlc3RFdmVudExpc3RlbmVyICI8bGl0ZXJhbD5SZXF1ZXN0RXZlbnRMaXN0ZW5lcjwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5SZXNvdXJjZU1YQmVhbiAiPGxpdGVyYWw+UmVzb3VyY2VNWEJlYW48L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuUmVzb3VyY2VNZXRob2RNWEJlYW4gIjxsaXRlcmFsPlJlc291cmNlTWV0aG9kTVhCZWFuPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLlJlc291cmNlTWV0aG9kU3RhdGlzdGljcyAiPGxpdGVyYWw+UmVzb3VyY2VNZXRob2RTdGF0aXN0aWNzPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLlJlc291cmNlU3RhdGlzdGljcyAiPGxpdGVyYWw+UmVzb3VyY2VTdGF0aXN0aWNzPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLlJlc3BvbnNlTVhCZWFuICI8bGl0ZXJhbD5SZXNwb25zZU1YQmVhbjwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5SZXNwb25zZVN0YXRpc3RpY3MgIjxsaXRlcmFsPlJlc3BvbnNlU3RhdGlzdGljczwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5UaW1lV2luZG93U3RhdGlzdGljcyAiPGxpdGVyYWw+VGltZVdpbmRvd1N0YXRpc3RpY3M8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuc2VydmVyLm12Yy5FcnJvclRlbXBsYXRlICI8bGl0ZXJhbD5ARXJyb3JUZW1wbGF0ZTwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5zZXJ2ZXIubXZjLkZyZWVtYXJrZXJNdmNGZWF0dXJlICI8bGl0ZXJhbD5GcmVlbWFya2VyTXZjRmVhdHVyZTwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5zZXJ2ZXIubXZjLkpzcE12Y0ZlYXR1cmUgIjxsaXRlcmFsPkpzcE12Y0ZlYXR1cmU8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuc2VydmVyLm12Yy5NdmNGZWF0dXJlICI8bGl0ZXJhbD5NdmNGZWF0dXJlPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LnNlcnZlci5tdmMuVGVtcGxhdGUgIjxsaXRlcmFsPkBUZW1wbGF0ZTwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5zZXJ2ZXIubXZjLlRlbXBsYXRlUHJvY2Vzc29yICI8bGl0ZXJhbD5UZW1wbGF0ZVByb2Nlc3NvcjwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5zZXJ2ZXIubXZjLlZpZXdhYmxlICI8bGl0ZXJhbD5WaWV3YWJsZTwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5zZXJ2ZXIub2F1dGgxLkRlZmF1bHRPQXV0aDFQcm92aWRlciAiPGxpdGVyYWw+RGVmYXVsdE9BdXRoMVByb3ZpZGVyPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LnNlcnZlci5vYXV0aDEuT0F1dGgxQ29uc3VtZXIgIjxsaXRlcmFsPk9BdXRoMUNvbnN1bWVyPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LnNlcnZlci5vYXV0aDEuT0F1dGgxRXhjZXB0aW9uICI8bGl0ZXJhbD5PQXV0aDFFeGNlcHRpb248L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuc2VydmVyLm9hdXRoMS5PQXV0aDFQcm92aWRlciAiPGxpdGVyYWw+T0F1dGgxUHJvdmlkZXI8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuc2VydmVyLm9hdXRoMS5PQXV0aDFTZXJ2ZXJGZWF0dXJlICI8bGl0ZXJhbD5PQXV0aDFTZXJ2ZXJGZWF0dXJlPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LnNlcnZlci5vYXV0aDEuT0F1dGgxU2VydmVyUHJvcGVydGllcyAiPGxpdGVyYWw+T0F1dGgxU2VydmVyUHJvcGVydGllczwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5zZXJ2ZXIub2F1dGgxLk9BdXRoMVRva2VuICI8bGl0ZXJhbD5PQXV0aDFUb2tlbjwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5zZXJ2ZXIub2F1dGgxLlRva2VuUmVzb3VyY2UgIjxsaXRlcmFsPlRva2VuUmVzb3VyY2U8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuc2VydmVyLnNwaS5Db21wb25lbnRQcm92aWRlciAiPGxpdGVyYWw+Q29tcG9uZW50UHJvdmlkZXI8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuc2VydmVyLnNwaS5Db250YWluZXJQcm92aWRlciAiPGxpdGVyYWw+Q29udGFpbmVyUHJvdmlkZXI8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyICI8bGl0ZXJhbD5TZXJ2bGV0Q29udGFpbmVyPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LnNlcnZsZXQuU2VydmxldFByb3BlcnRpZXMgIjxsaXRlcmFsPlNlcnZsZXRQcm9wZXJ0aWVzPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LnNlcnZsZXQuU2VydmxldFByb3BlcnRpZXMuRklMVEVSX0NPTlRFWFRfUEFUSCAiPGxpdGVyYWw+U2VydmxldFByb3BlcnRpZXMuRklMVEVSX0NPTlRFWFRfUEFUSDwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5zZXJ2bGV0LlNlcnZsZXRQcm9wZXJ0aWVzLkZJTFRFUl9GT1JXQVJEX09OXzQwNCAiPGxpdGVyYWw+U2VydmxldFByb3BlcnRpZXMuRklMVEVSX0ZPUldBUkRfT05fNDA0PC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LnNlcnZsZXQuU2VydmxldFByb3BlcnRpZXMuRklMVEVSX1NUQVRJQ19DT05URU5UX1JFR0VYICI8bGl0ZXJhbD5TZXJ2bGV0UHJvcGVydGllcy5GSUxURVJfU1RBVElDX0NPTlRFTlRfUkVHRVg8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0UHJvcGVydGllcy5KQVhSU19BUFBMSUNBVElPTl9DTEFTUyAiPGxpdGVyYWw+U2VydmxldFByb3BlcnRpZXMuSkFYUlNfQVBQTElDQVRJT05fQ0xBU1M8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0UHJvcGVydGllcy5QUk9WSURFUl9XRUJfQVBQICI8bGl0ZXJhbD5TZXJ2bGV0UHJvcGVydGllcy5QUk9WSURFUl9XRUJfQVBQPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LnNlcnZsZXQuU2VydmxldFByb3BlcnRpZXMuUVVFUllfUEFSQU1TX0FTX0ZPUk1fUEFSQU1TX0RJU0FCTEVEICI8bGl0ZXJhbD5TZXJ2bGV0UHJvcGVydGllcy5RVUVSWV9QQVJBTVNfQVNfRk9STV9QQVJBTVNfRElTQUJMRUQ8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0UHJvcGVydGllcy5TRVJWSUNFX0xPQ0FUT1IgIjxsaXRlcmFsPlNlcnZsZXRQcm9wZXJ0aWVzLlNFUlZJQ0VfTE9DQVRPUjwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5zaW1wbGUuU2ltcGxlQ29udGFpbmVyICI8bGl0ZXJhbD5TaW1wbGVDb250YWluZXI8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuc2ltcGxlLlNpbXBsZUNvbnRhaW5lckZhY3RvcnkgIjxsaXRlcmFsPlNpbXBsZUNvbnRhaW5lckZhY3Rvcnk8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuc2ltcGxlLlNpbXBsZUNvbnRhaW5lclByb3ZpZGVyICI8bGl0ZXJhbD5TaW1wbGVDb250YWluZXJQcm92aWRlcjwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5zc2UuRXZlbnRJbnB1dCAiPGxpdGVyYWw+RXZlbnRJbnB1dDwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5zc2UuRXZlbnRJbnB1dFJlYWRlciAiPGxpdGVyYWw+RXZlbnRJbnB1dFJlYWRlcjwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5zc2UuRXZlbnRMaXN0ZW5lciAiPGxpdGVyYWw+RXZlbnRMaXN0ZW5lcjwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5zc2UuRXZlbnRPdXRwdXQgIjxsaXRlcmFsPkV2ZW50T3V0cHV0PC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LnNzZS5FdmVudFNvdXJjZSAiPGxpdGVyYWw+RXZlbnRTb3VyY2U8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuc3NlLkV2ZW50U291cmNlLkJ1aWxkZXIgIjxsaXRlcmFsPkV2ZW50U291cmNlLkJ1aWxkZXI8L2xpdGVyYWw+Ij4KKzwhRU5USVRZIGxpdC5qZXJzZXkuc3NlLkluYm91bmRFdmVudCAiPGxpdGVyYWw+SW5ib3VuZEV2ZW50PC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LnNzZS5JbmJvdW5kRXZlbnRSZWFkZXIgIjxsaXRlcmFsPkluYm91bmRFdmVudFJlYWRlcjwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5zc2UuT3V0Ym91bmRFdmVudCAiPGxpdGVyYWw+T3V0Ym91bmRFdmVudDwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5zc2UuT3V0Ym91bmRFdmVudFdyaXRlciAiPGxpdGVyYWw+T3V0Ym91bmRFdmVudFdyaXRlcjwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS5zc2UuU3NlQnJvYWRjYXN0ZXIgIjxsaXRlcmFsPlNzZUJyb2FkY2FzdGVyPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LnNzZS5Tc2VGZWF0dXJlICI8bGl0ZXJhbD5Tc2VGZWF0dXJlPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LnRlc3QuSmVyc2V5VGVzdCAiPGxpdGVyYWw+SmVyc2V5VGVzdDwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzICI8bGl0ZXJhbD5UZXN0UHJvcGVydGllczwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyICI8bGl0ZXJhbD5UZXN0Q29udGFpbmVyPC9saXRlcmFsPiI+Cis8IUVOVElUWSBsaXQuamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5ICI8bGl0ZXJhbD5UZXN0Q29udGFpbmVyRmFjdG9yeTwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS50ZXN0LnV0aWwuTG9vcEJhY2tDb25uZWN0b3JQcm92aWRlciAiPGxpdGVyYWw+TG9vcEJhY2tDb25uZWN0b3JQcm92aWRlcjwvbGl0ZXJhbD4iPgorPCFFTlRJVFkgbGl0LmplcnNleS50ZXN0LnV0aWwuQ29udGFpbmVyUmVxdWVzdEJ1aWxkZXIgIjxsaXRlcmFsPkNvbnRhaW5lclJlcXVlc3RCdWlsZGVyPC9saXRlcmFsPiI+CmRpZmYgLS1naXQgYS9kb2NzL3NyYy9tYWluL2RvY2Jvb2svbG9nZ2luZy54bWwgYi9kb2NzL3NyYy9tYWluL2RvY2Jvb2svbG9nZ2luZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNiZjU5ZQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3Mvc3JjL21haW4vZG9jYm9vay9sb2dnaW5nLnhtbApAQCAtMCwwICsxLDIyNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTYsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPCFET0NUWVBFIGNoYXB0ZXIgWzwhRU5USVRZICUgZW50cyBTWVNURU0gImplcnNleS5lbnQiID4gJWVudHM7XT4KKzxjaGFwdGVyIHhtbG5zPSJodHRwOi8vZG9jYm9vay5vcmcvbnMvZG9jYm9vayIKKyAgICAgICAgdmVyc2lvbj0iNS4wIgorICAgICAgICB4bWw6bGFuZz0iZW4iCisgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIgorICAgICAgICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKKyAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vZG9jYm9vay5vcmcvbnMvZG9jYm9vayBodHRwOi8vZG9jYm9vay5vcmcveG1sLzUuMC94c2QvZG9jYm9vay54c2QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayBodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rLnhzZCIKKyAgICAgICAgeG1sOmlkPSJsb2dnaW5nX2NoYXB0ZXIiPgorICAgIDx0aXRsZT5Mb2dnaW5nPC90aXRsZT4KKyAgICA8c2VjdGlvbiB4bWw6aWQ9ImxvZ2dpbmciPgorICAgICAgICA8dGl0bGU+TG9nZ2luZyB0cmFmZmljPC90aXRsZT4KKyAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICA8dGl0bGU+SW50cm9kdWN0aW9uPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEplcnNleSBMb2dnaW5nIHN1cHBvcnRzIHRoZSBsb2dnaW5nIHJlcXVlc3QgYW5kIHJlc3BvbnNlIHZpYSBpbnRlcm5hbCBjbGllbnQgYW5kIHNlcnZlciBmaWx0ZXJzLCB3aGljaCBhcmUKKyAgICAgICAgICAgICAgICBjb25maWd1cmVkIGFuZCByZWdpc3RlcmVkIGJ5ICZqZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsgJ3MgcHJvcGVydGllcy4gJmxpdC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKKyAgICAgICAgICAgICAgICBoYXMgYmVlbiBpbnRyb2R1Y2VkIGluIEplcnNleSAyLjIzIHZlcnNpb24gYW5kIGRlcHJlY2F0ZXMgYW4gb2xkZXIgJmxpdC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmlsdGVyOy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICZsaXQuamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7IG1pZ2h0IGJlIGRpc2NvdmVyZWQgYnkKKyAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSJkZXBsb3ltZW50LmF1dG9kaXNjb3ZlcmFibGUiPmF1dG8tZGlzY292ZXJhYmxlIG1lY2hhbmlzbTwvbGluaz4KKyAgICAgICAgICAgICAgICBvciBpbml0aWFsaXplZCBieSByZWdpc3RlcmluZyBvbiBjbGllbnQgb3Igc2VydmVyIGNvbXBvbmVudHMuIENsaWVudCBvciBzZXJ2ZXIgbG9nZ2luZyBmaWx0ZXIgaXMgaW5pdGlhbGl6ZWQKKyAgICAgICAgICAgICAgICBkZXBlbmRpbmcgb24gd2hpY2ggY29udGV4dCBpcyAmbGl0LmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOyByZWdpc3RlcmVkIHdpdGguCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICA8dGl0bGU+Q29uZmlndXJhdGlvbiBhbmQgcmVnaXN0ZXJpbmc8L3RpdGxlPgorICAgICAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICAgICAgPHRpdGxlPkNvbmZpZ3VyYXRpb24gb3B0aW9uczwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGl0bGU+Q29uZmlndXJhYmxlIG9wdGlvbnM8L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5Mb2dnZXIgbmFtZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZXMgYSBsb2dnZXIgdXNlZCB0byBsb2cgcmVxdWVzdCBhbmQgcmVzcG9uc2UgbWVzc2FnZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPkRlZmF1bHQgdmFsdWUgaXMgJmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlLkRFRkFVTFRfTE9HR0VSX05BTUU7LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPkxvZ2dlciBsZXZlbDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmluZXMgbGV2ZWwgdGhhdCB3aWxsIGJlIHVzZWQgdG8gbG9nIG1lc3NhZ2VzIGJ5IGxvZ2dpbmcgZmlsdGVycy4gTWVzc2FnZXMgd2lsbCBiZSBsb2dnZWQgb25seQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiB0aGUgZWZmZWN0aXZlIGxldmVsIG9mIHRoZSBsb2dnZXIgYWxsb3dzIGl0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT5EZWZhdWx0IHZhbHVlIGlzICZqZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZS5ERUZBVUxUX0xPR0dFUl9MRVZFTDsuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+VmVyYm9zaXR5PC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyYm9zaXR5IGRldGVybWluZXMgaG93IGRldGFpbGVkIG1lc3NhZ2Ugd2lsbCBiZSBsb2dnZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZSAmamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmUuVmVyYm9zaXR5OyBqYXZhZG9jLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgbG93ZXN0IHZlcmJvc2l0eSAmamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmUuVmVyYm9zaXR5LkhFQURFUlNfT05MWTsgd2lsbCBsb2cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25seSByZXF1ZXN0L3Jlc3BvbnNlIGhlYWRlcnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG1lZGl1bSB2ZXJib3NpdHkgKCZqZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZS5WZXJib3NpdHkuUEFZTE9BRF9URVhUOykgd2lsbCBsb2cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC9yZXNwb25zZSBoZWFkZXJzLCBhcyB3ZWxsIGFzIGFuIGVudGl0eSBpZiBjb25zaWRlcmVkIGEgcmVhZGFibGUgdGV4dC4gVGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eSBpcyBjb25zaWRlcmVkIGEgcmVhZGFibGUgdGV4dCwgaWYgJmpheHJzLmNvcmUuTWVkaWFUeXBlOyBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD50ZXh0Lyo8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGlzIG9uZSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5hcHBsaWNhdGlvbi9hdG9tK3htbDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5hcHBsaWNhdGlvbi9qc29uPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmFwcGxpY2F0aW9uL3N2Zyt4bWw8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+YXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmFwcGxpY2F0aW9uL3hodG1sK3htbDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5hcHBsaWNhdGlvbi94bWw8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGhpZ2hlc3QgdmVyYm9zaXR5ICZqZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZS5WZXJib3NpdHkuUEFZTE9BRF9BTlk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgbG9nIGFsbCB0eXBlcyBvZiBhbiBlbnRpdHkgKGJlc2lkZXMgdGhlIHJlcXVlc3QvcmVzcG9uc2UgaGVhZGVycy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IHRoZSBlbnRpdHkgaXMgbG9nZ2VkIHVwIHRvIHRoZSBzcGVjaWZpZWQgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlZSAmamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmUuTE9HR0lOR19GRUFUVVJFX01BWF9FTlRJVFlfU0laRTspLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCB2YWx1ZSBpcyAmamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmUuREVGQVVMVF9WRVJCT1NJVFk7LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPk1heGltdW0gZW50aXR5IHNpemU8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhpbXVtIG51bWJlciBvZiBlbnRpdHkgYnl0ZXMgdG8gYmUgbG9nZ2VkIChhbmQgYnVmZmVyZWQpIC0gaWYgdGhlIGVudGl0eSBpcyBsYXJnZXIsIGxvZ2dpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyIHdpbGwgcHJpbnQgKGFuZCBidWZmZXIgaW4gbWVtb3J5KSBvbmx5IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzIGFuZCBwcmludCAiLi4ubW9yZS4uLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGF0IHRoZSBlbmQuIE5lZ2F0aXZlIHZhbHVlcyBhcmUgaW50ZXJwcmV0ZWQgYXMgemVyby4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+RGVmYXVsdCB2YWx1ZSAmamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmUuREVGQVVMVF9NQVhfRU5USVRZX1NJWkU7LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgICAgIDxzZWN0aW9uPgorICAgICAgICAgICAgICAgIDx0aXRsZT5Db25maWd1cmF0aW9uIHByb3BlcnRpZXM8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUaGUgZmVhdHVyZSBpcyBlbmFibGVkIG9uIHdoZW4gYXV0by1kaXNjb3ZlcmFibGUgbWVjaGFuaXNtIGlzIG5vdCBkaXNhYmxlZCBhbmQgYXQgbGVhc3Qgb25lIG9mIHRoZSBmZWF0dXJlJ3MKKyAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkgaXMgc2V0LiBGb3IgZW5hYmxpbmcgY2xpZW50IG9yIHNlcnZlciBsb2dnaW5nIGZpbHRlciBvbmUgb2YgdGhlCisgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9ImFwcGVuZGl4LXByb3BlcnRpZXMtY29tbW9uIj5jb21tb24gcHJvcGVydGllczwvbGluaz4gb3IKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+X0NMSUVOVDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgc3VmZml4ZWQgPGxpbmsgbGlua2VuZD0iYXBwZW5kaXgtcHJvcGVydGllcy1jbGllbnQiPnByb3BlcnRpZXM8L2xpbms+LCBvcgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5fU0VSVkVSPC9saXRlcmFsPiA8bGluayBsaW5rZW5kPSJhcHBlbmRpeC1wcm9wZXJ0aWVzLXNlcnZlciI+cHJvcGVydGllczwvbGluaz4KKyAgICAgICAgICAgICAgICAgICAgcmVzcGVjdGl2ZWx5LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgQW4gZXhhbXBsZSBvZiBpbml0aWFsaXppbmcgc2VydmVyLXNpZGUgbG9nZ2luZyB3aXRoIHRoZSBoaWdoZXN0IHZlcmJvc2l0eS4KKyAgICAgICAgICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGl0bGU+TG9nZ2luZyBvbiB0aGUgY2xpZW50IHNpZGU8L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+PCFbQ0RBVEFbICAgIENsaWVudENvbmZpZyBjbGllbnRDb25maWcgPSBuZXcgQ2xpZW50Q29uZmlnKCk7CisgICAgY2xpZW50Q29uZmlnLnByb3BlcnR5KExvZ2dpbmdGZWF0dXJlLkxPR0dJTkdfRkVBVFVSRV9WRVJCT1NJVFlfQ0xJRU5ULCBMb2dnaW5nRmVhdHVyZS5WZXJib3NpdHkuUEFZTE9BRF9BTlkpOworICAgIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudChjbGllbnRDb25maWcpO11dPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgVGhlICZsaXQuamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7IG1pZ2h0IGJlIHJlZ2lzdGVyZWQgZXhwbGljaXRseSBvbiAmamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsgZm9yCisgICAgICAgICAgICAgICAgICAgIHNlcnZlci1zaWRlIGxvZ2dpbmcgb3Igb24gJmpheHJzLmNsaWVudC5DbGllbnQ7IGZvciBjbGllbnQtc2lkZSBsb2dnaW5nLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgPHRpdGxlPlJlZ2lzdGVyICZsaXQuamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7IHZpYSBjb25zdHJ1Y3RvcgorICAgICAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj48IVtDREFUQVsgICAgICAgIFJlc291cmNlQ29uZmlnIGNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhIZWxsb1dvcmxkUmVzb3VyY2UuY2xhc3MpOworICAgICAgICBjb25maWcucmVnaXN0ZXIobmV3IExvZ2dpbmdGZWF0dXJlKExPR0dFUiwgTG9nZ2luZ0ZlYXR1cmUuVmVyYm9zaXR5LlBBWUxPQURfQU5ZKSk7CitdXT48L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgICAgIDxzZWN0aW9uPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBGb2xsb3dpbmcgZXhhbXBsZXMgZGVtb25zdHJhdGUgcmVnaXN0ZXJpbmcgJmxpdC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsgb24gc2VydmVyLXNpZGUgd2l0aCBkZWZhdWx0CisgICAgICAgICAgICAgICAgICAgIHZhbHVlcyBhbmQgdmFsdWVzIGRlZmluZWQgYnkgb25lIG9mIHRoZSBwdWJsaWMgY29uc3RydWN0b3JzIChzZWUgJmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOykuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgICAgICA8dGl0bGU+UmVnaXN0ZXIgJmxpdC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsgY2xhc3MKKyAgICAgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+PCFbQ0RBVEFbICAgICAgICBSZXNvdXJjZUNvbmZpZyBjb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoSGVsbG9Xb3JsZFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKExvZ2dpbmdGZWF0dXJlLmNsYXNzKTsKK11dPjwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICAgICAgICAgIDxwYXJhPkFuIGV4YW1wbGUgb2Ygc2VydmVyLXNpZGUgbG9nZ2luZyB3aXRoIGVudGl0eQorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5IZWxsbyBXb3JsZCE8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxzY3JlZW4gbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPjwhW0NEQVRBW01heSAwOSwgMjAxNiAyOjU1OjMzIFBNIG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ludGVyY2VwdG9yIGxvZworSU5GTzogMSAqIFNlcnZlciBoYXMgcmVjZWl2ZWQgYSByZXF1ZXN0IG9uIHRocmVhZCBncml6emx5LWh0dHAtc2VydmVyLTAKKzEgPiBHRVQgaHR0cDovL2xvY2FsaG9zdDo5OTk4L2hlbGxvd29ybGQKKzEgPiBhY2NlcHQ6IHRleHQvcGxhaW4KKzEgPiBhY2NlcHQtZW5jb2Rpbmc6IGd6aXAsZGVmbGF0ZQorMSA+IGNvbm5lY3Rpb246IEtlZXAtQWxpdmUKKzEgPiBob3N0OiBsb2NhbGhvc3Q6OTk5OAorMSA+IHVzZXItYWdlbnQ6IEplcnNleS8zLjAtU05BUFNIT1QgKEFwYWNoZSBIdHRwQ2xpZW50IDQuNSkKKworTWF5IDA5LCAyMDE2IDI6NTU6MzMgUE0gb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nSW50ZXJjZXB0b3IgbG9nCitJTkZPOiAxICogU2VydmVyIHJlc3BvbmRlZCB3aXRoIGEgcmVzcG9uc2Ugb24gdGhyZWFkIGdyaXp6bHktaHR0cC1zZXJ2ZXItMAorMSA8IDIwMAorMSA8IENvbnRlbnQtVHlwZTogdGV4dC9wbGFpbgorSGVsbG8gV29ybGQhXV0+PC9zY3JlZW4+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+Cis8L2NoYXB0ZXI+CmRpZmYgLS1naXQgYS9kb2NzL3NyYy9tYWluL2RvY2Jvb2svbWJ3LnhtbCBiL2RvY3Mvc3JjL21haW4vZG9jYm9vay9tYncueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmZjA1YzQKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3NyYy9tYWluL2RvY2Jvb2svbWJ3LnhtbApAQCAtMCwwICsxLDg2OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPCFET0NUWVBFIGNoYXB0ZXIgWzwhRU5USVRZICUgZW50cyBTWVNURU0gImplcnNleS5lbnQiID4gJWVudHM7XT4KKzxjaGFwdGVyIHhtbG5zPSJodHRwOi8vZG9jYm9vay5vcmcvbnMvZG9jYm9vayIKKyAgICAgICAgIHZlcnNpb249IjUuMCIKKyAgICAgICAgIHhtbDpsYW5nPSJlbiIKKyAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIKKyAgICAgICAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vZG9jYm9vay5vcmcvbnMvZG9jYm9vayBodHRwOi8vZG9jYm9vay5vcmcveG1sLzUuMC94c2QvZG9jYm9vay54c2QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayBodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rLnhzZCIKKyAgICAgICAgIHhtbDppZD0ibWVzc2FnZS1ib2R5LXdvcmtlcnMiPgorICAgIDx0aXRsZT5KQVgtUlMgRW50aXR5IFByb3ZpZGVyczwvdGl0bGU+CisgICAgPHNlY3Rpb24+CisgICAgICAgIDx0aXRsZT5JbnRyb2R1Y3Rpb248L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEVudGl0eSBwYXlsb2FkLCBpZiBwcmVzZW50IGluIGFuIHJlY2VpdmVkIEhUVFAgbWVzc2FnZSwgaXMgcGFzc2VkIHRvIEplcnNleSBmcm9tIGFuIEkvTyBjb250YWluZXIgYXMgYW4gaW5wdXQgc3RyZWFtLgorICAgICAgICAgICAgVGhlIHN0cmVhbSBtYXksIGZvciBleGFtcGxlLCBjb250YWluIGRhdGEgcmVwcmVzZW50ZWQgYXMgYSBwbGFpbiB0ZXh0LCBYTUwgb3IgSlNPTiBkb2N1bWVudC4gSG93ZXZlciwgaW4gbWFueSBKQVgtUlMKKyAgICAgICAgICAgIGNvbXBvbmVudHMgdGhhdCBwcm9jZXNzIHRoZXNlIGluYm91bmQgZGF0YSwgc3VjaCBhcyByZXNvdXJjZSBtZXRob2RzIG9yIGNsaWVudCByZXNwb25zZXMsIHRoZSBKQVgtUlMgQVBJIHVzZXIgY2FuCisgICAgICAgICAgICBhY2Nlc3MgdGhlIGluYm91bmQgZW50aXR5IGFzIGFuIGFyYml0cmFyeSBKYXZhIG9iamVjdCB0aGF0IGlzIGNyZWF0ZWQgZnJvbSB0aGUgY29udGVudCBvZiB0aGUgaW5wdXQgc3RyZWFtIGJhc2VkIG9uCisgICAgICAgICAgICB0aGUgcmVwcmVzZW50YXRpb24gdHlwZSBpbmZvcm1hdGlvbi4gRm9yIGV4YW1wbGUsIGFuIGVudGl0eSBjcmVhdGVkIGZyb20gYW4gaW5wdXQgc3RyZWFtIHRoYXQgY29udGFpbnMgZGF0YQorICAgICAgICAgICAgcmVwcmVzZW50ZWQgYXMgYSBYTUwgZG9jdW1lbnQsIGNhbiBiZSBjb252ZXJ0ZWQgdG8gYSBjdXN0b20gSkFYQiBiZWFuLgorICAgICAgICAgICAgU2ltaWxhciBjb25jZXB0IGlzIHN1cHBvcnRlZCBmb3IgdGhlIG91dGJvdW5kIGVudGl0aWVzLiBBbiBlbnRpdHkgcmV0dXJuZWQgZnJvbSB0aGUgcmVzb3VyY2UgbWV0aG9kIGluIHRoZSBmb3JtCisgICAgICAgICAgICBvZiBhbiBhcmJpdHJhcnkgSmF2YSBvYmplY3QgY2FuIGJlIHNlcmlhbGl6ZWQgYnkgSmVyc2V5IGludG8gYSBjb250YWluZXIgb3V0cHV0IHN0cmVhbSBhcyBhIHNwZWNpZmllZCByZXByZXNlbnRhdGlvbi4KKyAgICAgICAgICAgIE9mIGNvdXJzZSwgd2hpbGUgSkFYLVJTIGltcGxlbWVudGF0aW9ucyBkbyBwcm92aWRlIGRlZmF1bHQgc3VwcG9ydCBmb3IgbW9zdCBjb21tb24gY29tYmluYXRpb25zIG9mIEphdmEgdHlwZSBhbmQgaXQncworICAgICAgICAgICAgcmVzcGVjdGl2ZSBvbi10aGUtd2lyZSByZXByZXNlbnRhdGlvbiBmb3JtYXRzLCBKQVgtUlMgaW1wbGVtZW50YXRpb25zIGRvIG5vdCBzdXBwb3J0IHRoZSBjb252ZXJzaW9uIGRlc2NyaWJlZCBhYm92ZQorICAgICAgICAgICAgZm9yIGFueSBhcmJpdHJhcnkgSmF2YSB0eXBlIGFuZCBhbnkgYXJiaXRyYXJ5IHJlcHJlc2VudGF0aW9uIGZvcm1hdCBieSBkZWZhdWx0LiBJbnN0ZWFkLCBhIGdlbmVyaWMgZXh0ZW5zaW9uIGNvbmNlcHQKKyAgICAgICAgICAgIGlzIGV4cG9zZWQgaW4gSkFYLVJTIEFQSSB0byBhbGxvdyBhcHBsaWNhdGlvbi1sZXZlbCBjdXN0b21pemF0aW9ucyBvZiB0aGlzIEpBWC1SUyBydW50aW1lIHRvIHN1cHBvcnQgZm9yIGVudGl0eQorICAgICAgICAgICAgY29udmVyc2lvbnMuIFRoZSBKQVgtUlMgZXh0ZW5zaW9uIEFQSSBjb21wb25lbnRzIHRoYXQgcHJvdmlkZSB0aGUgdXNlci1sZXZlbCBleHRlbnNpYmlsaXR5IGFyZSB0eXBpY2FsbHkgcmVmZXJyZWQgdG8KKyAgICAgICAgICAgIGJ5IHNldmVyYWwgdGVybXMgd2l0aCB0aGUgc2FtZSBtZWFuaW5nLCBzdWNoIGFzIDxlbXBoYXNpcz5lbnRpdHkgcHJvdmlkZXJzPC9lbXBoYXNpcz4sCisgICAgICAgICAgICA8ZW1waGFzaXM+bWVzc2FnZSBib2R5IHByb3ZpZGVyczwvZW1waGFzaXM+LCA8ZW1waGFzaXM+bWVzc2FnZSBib2R5IHdvcmtlcnM8L2VtcGhhc2lzPiBvcgorICAgICAgICAgICAgPGVtcGhhc2lzPm1lc3NhZ2UgYm9keSByZWFkZXJzIGFuZCB3cml0ZXJzPC9lbXBoYXNpcz4uIFlvdSBtYXkgZmluZCBhbGwgdGhlc2UgdGVybXMgdXNlZCBpbnRlcmNoYW5nZWFibHkgdGhyb3VnaG91dAorICAgICAgICAgICAgdGhlIHVzZXIgZ3VpZGUgYW5kIHRoZXkgYWxsIHJlZmVyIHRvIHRoZSBzYW1lIGNvbmNlcHQuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBJbiBKQVgtUlMgZXh0ZW5zaW9uIEFQSSAob3IgU1BJIC0gc2VydmljZSBwcm92aWRlciBpbnRlcmZhY2UsIGlmIHlvdSBsaWtlKSB0aGUgY29uY2VwdCBpcyBjYXB0dXJlZCBpbiAyIGludGVyZmFjZXMuCisgICAgICAgICAgICBPbmUgZm9yIGhhbmRsaW5nIGluYm91bmQgZW50aXR5IHJlcHJlc2VudGF0aW9uLXRvLUphdmEgZGUtc2VyaWFsaXphdGlvbiAtICZqYXhycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7IGFuZCB0aGUgb3RoZXIKKyAgICAgICAgICAgIG9uZSBmb3IgaGFuZGxpbmcgdGhlIG91dGJvdW5kIGVudGl0eSBKYXZhLXRvLXJlcHJlc2VudGF0aW9uIHNlcmlhbGl6YXRpb24gLSAmamF4cnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOy4KKyAgICAgICAgICAgIEEgJmxpdC5qYXhycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7LCBhcyB0aGUgbmFtZSBzdWdnZXN0cywgaXMgYW4gZXh0ZW5zaW9uIHRoYXQgc3VwcG9ydHMgcmVhZGluZyB0aGUgbWVzc2FnZSBib2R5CisgICAgICAgICAgICByZXByZXNlbnRhdGlvbiBmcm9tIGFuIGlucHV0IHN0cmVhbSBhbmQgY29udmVydGluZyB0aGUgZGF0YSBpbnRvIGFuIGluc3RhbmNlIG9mIGEgc3BlY2lmaWMgSmF2YSB0eXBlLgorICAgICAgICAgICAgQSAmbGl0LmpheHJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsgaXMgdGhlbiByZXNwb25zaWJsZSBmb3IgY29udmVydGluZyBhIG1lc3NhZ2UgcGF5bG9hZCBmcm9tIGFuIGluc3RhbmNlIG9mIGEKKyAgICAgICAgICAgIHNwZWNpZmljIEphdmEgdHlwZSBpbnRvIGEgc3BlY2lmaWMgcmVwcmVzZW50YXRpb24gZm9ybWF0IHRoYXQgaXMgc2VudCBvdmVyIHRoZSB3aXJlIHRvIHRoZSBvdGhlciBwYXJ0eSBhcyBwYXJ0IG9mIGFuCisgICAgICAgICAgICBIVFRQIG1lc3NhZ2UgZXhjaGFuZ2UuCisgICAgICAgICAgICBCb3RoIG9mIHRoZXNlIHByb3ZpZGVycyBjYW4gYmUgdXNlZCB0byBwcm92aWRlIG1lc3NhZ2UgcGF5bG9hZCBzZXJpYWxpemF0aW9uIGFuZCBkZS1zZXJpYWxpemF0aW9uIHN1cHBvcnQgb24gdGhlCisgICAgICAgICAgICBzZXJ2ZXIgYXMgd2VsbCBhcyB0aGUgY2xpZW50IHNpZGUuIEEgbWVzc2FnZSBib2R5IHJlYWRlciBvciB3cml0ZXIgaXMgYWx3YXlzIHVzZWQgd2hlbmV2ZXIgYSBIVFRQIHJlcXVlc3Qgb3IKKyAgICAgICAgICAgIHJlc3BvbnNlIGNvbnRhaW5zIGFuIGVudGl0eSBhbmQgdGhlIGVudGl0eSBpcyBlaXRoZXIgcmVxdWVzdGVkIGJ5IHRoZSBhcHBsaWNhdGlvbiBjb2RlIChlLmcuIGluamVjdGVkIGFzIGEgcGFyYW1ldGVyCisgICAgICAgICAgICBvZiBKQVgtUlMgcmVzb3VyY2UgbWV0aG9kIG9yIGEgcmVzcG9uc2UgZW50aXR5IHJlYWQgb24gdGhlIGNsaWVudCBmcm9tIGEgJmpheHJzLmNvcmUuUmVzcG9uc2U7KSBvciBoYXMgdG8gYmUKKyAgICAgICAgICAgIHNlcmlhbGl6ZWQgYW5kIHNlbnQgdG8gdGhlIG90aGVyIHBhcnR5IChlLmcuIGFuIGluc3RhbmNlIHJldHVybmVkIGZyb20gYSBKQVgtUlMgcmVzb3VyY2UgbWV0aG9kIG9yIGEgcmVxdWVzdAorICAgICAgICAgICAgZW50aXR5IHNlbnQgYnkgYSBKQVgtUlMgY2xpZW50KS4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbj4KKyAgICAgICAgPHRpdGxlPkhvdyB0byBXcml0ZSBDdXN0b20gRW50aXR5IFByb3ZpZGVyczwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQSBiZXN0IHdheSBob3cgdG8gbGVhcm4gYWJvdXQgZW50aXR5IHByb3ZpZGVycyBpcyB0byB3YWxrIHRocm91Z2ggYW4gZXhhbXBsZSBvZiB3cml0aW5nIG9uZS4gVGhlcmVmb3JlIHdlIHdpbGwKKyAgICAgICAgICAgIGRlc2NyaWJlIGhlcmUgdGhlIHByb2Nlc3Mgb2YgaW1wbGVtZW50aW5nIGEgY3VzdG9tICZqYXhycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7IGFuZAorICAgICAgICAgICAgJmpheHJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcjsgdXNpbmcgYSBwcmFjdGljYWwgZXhhbXBsZS4gTGV0J3MgZmlyc3Qgc2V0dXAgdGhlIHN0YWdlIGJ5IGRlZmluaW5nIGEgSkFYLVJTCisgICAgICAgICAgICByZXNvdXJjZSBjbGFzcyBmb3IgdGhlIHNlcnZlciBzaWRlIHN0b3J5IG9mIG91ciBhcHBsaWNhdGlvbi4KKworICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgPHRpdGxlPkV4YW1wbGUgcmVzb3VyY2UgY2xhc3M8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPkBQYXRoKCJyZXNvdXJjZSIpCitwdWJsaWMgY2xhc3MgTXlSZXNvdXJjZSB7CisgICAgQEdFVAorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24veG1sIikKKyAgICBwdWJsaWMgTXlCZWFuIGdldE15QmVhbigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNeUJlYW4oIkhlbGxvIFdvcmxkISIsIDQyKTsKKyAgICB9CisKKyAgICBAUE9TVAorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24veG1sIikKKyAgICBwdWJsaWMgU3RyaW5nIHBvc3RNeUJlYW4oTXlCZWFuIG15QmVhbikgeworICAgICAgICByZXR1cm4gbXlCZWFuLmFueVN0cmluZzsKKyAgICB9Cit9PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKworICAgICAgICAgICAgVGhlIHJlc291cmNlIGNsYXNzIGRlZmluZXMgJmxpdC5odHRwLkdFVDsgYW5kICZsaXQuaHR0cC5QT1NUOyByZXNvdXJjZSBtZXRob2RzLiBCb3RoIG1ldGhvZHMgd29yayB3aXRoIGFuIGVudGl0eQorICAgICAgICAgICAgdGhhdCBpcyBhbiBpbnN0YW5jZSBvZiA8bGl0ZXJhbD5NeUJlYW48L2xpdGVyYWw+LgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhlIDxsaXRlcmFsPk15QmVhbjwvbGl0ZXJhbD4gY2xhc3MgaXMgZGVmaW5lZCBpbiB0aGUgbmV4dCBleGFtcGxlOgorCisgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICA8dGl0bGU+TXlCZWFuIGVudGl0eSBjbGFzczwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+QFhtbFJvb3RFbGVtZW50CitwdWJsaWMgY2xhc3MgTXlCZWFuIHsKKyAgICBAWG1sRWxlbWVudAorICAgIHB1YmxpYyBTdHJpbmcgYW55U3RyaW5nOworICAgIEBYbWxFbGVtZW50CisgICAgcHVibGljIGludCBhbnlOdW1iZXI7CisKKyAgICBwdWJsaWMgTXlCZWFuKFN0cmluZyBhbnlTdHJpbmcsIGludCBhbnlOdW1iZXIpIHsKKyAgICAgICAgdGhpcy5hbnlTdHJpbmcgPSBhbnlTdHJpbmc7CisgICAgICAgIHRoaXMuYW55TnVtYmVyID0gYW55TnVtYmVyOworICAgIH0KKworICAgIC8vIGVtcHR5IGNvbnN0cnVjdG9yIG5lZWRlZCBmb3IgZGVzZXJpYWxpemF0aW9uIGJ5IEpBWEIKKyAgICBwdWJsaWMgTXlCZWFuKCkgeworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiTXlCZWFueyIgKworICAgICAgICAgICAgImFueVN0cmluZz0nIiArIGFueVN0cmluZyArICdcJycgKworICAgICAgICAgICAgIiwgYW55TnVtYmVyPSIgKyBhbnlOdW1iZXIgKworICAgICAgICAgICAgJ30nOworICAgIH0KK308L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxzZWN0aW9uPgorICAgICAgICAgICAgPHRpdGxlPk1lc3NhZ2VCb2R5V3JpdGVyPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoZSA8bGl0ZXJhbD5NeUJlYW48L2xpdGVyYWw+IGlzIGEgSkFYQi1hbm5vdGF0ZWQgUE9KTy4gSW4gJmxpdC5odHRwLkdFVDsgcmVzb3VyY2UgbWV0aG9kIHdlIHJldHVybgorICAgICAgICAgICAgICAgIHRoZSBpbnN0YW5jZSBvZiBNeUJlYW4gYW5kIHdlIHdvdWxkIGxpa2UgSmVyc2V5IHJ1bnRpbWUgdG8gc2VyaWFsaXplIGl0IGludG8gWE1MIGFuZCB3cml0ZQorICAgICAgICAgICAgICAgIGl0IGFzIGFuIGVudGl0eSBib2R5IHRvIHRoZSByZXNwb25zZSBvdXRwdXQgc3RyZWFtLiBXZSBkZXNpZ24gYSBjdXN0b20gJmxpdC5qYXhycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CisgICAgICAgICAgICAgICAgdGhhdCBjYW4gc2VyaWFsaXplIHRoaXMgUE9KTyBpbnRvIFhNTC4gU2VlIHRoZSBmb2xsb3dpbmcgY29kZSBzYW1wbGU6CisKKyAgICAgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICBQbGVhc2Ugbm90ZSwgdGhhdCB0aGlzIGlzIG9ubHkgYSBkZW1vbnN0cmF0aW9uIG9mIGhvdyB0byB3cml0ZSBhIGN1c3RvbSBlbnRpdHkgcHJvdmlkZXIuCisgICAgICAgICAgICAgICAgICAgICAgICBKZXJzZXkgYWxyZWFkeSBjb250YWlucyBkZWZhdWx0IHN1cHBvcnQgZm9yIGVudGl0eSBwcm92aWRlcnMgdGhhdCBjYW4gc2VyaWFsaXplIEpBWEIgYmVhbnMKKyAgICAgICAgICAgICAgICAgICAgICAgIGludG8gWE1MLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9ub3RlPgorCisgICAgICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5NZXNzYWdlQm9keVdyaXRlciBleGFtcGxlPC90aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+PCFbQ0RBVEFbQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi94bWwiKQorcHVibGljIGNsYXNzIE15QmVhbk1lc3NhZ2VCb2R5V3JpdGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8TXlCZWFuPiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICByZXR1cm4gdHlwZSA9PSBNeUJlYW4uY2xhc3M7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShNeUJlYW4gbXlCZWFuLCBDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIC8vIGRlcHJlY2F0ZWQgYnkgSkFYLVJTIDIuMCBhbmQgaWdub3JlZCBieSBKZXJzZXkgcnVudGltZQorICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGVUbyhNeUJlYW4gbXlCZWFuLAorICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBKQVhCQ29udGV4dCBqYXhiQ29udGV4dCA9IEpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKE15QmVhbi5jbGFzcyk7CisKKyAgICAgICAgICAgIC8vIHNlcmlhbGl6ZSB0aGUgZW50aXR5IG15QmVhbiB0byB0aGUgZW50aXR5IG91dHB1dCBzdHJlYW0KKyAgICAgICAgICAgIGpheGJDb250ZXh0LmNyZWF0ZU1hcnNoYWxsZXIoKS5tYXJzaGFsKG15QmVhbiwgZW50aXR5U3RyZWFtKTsKKyAgICAgICAgfSBjYXRjaCAoSkFYQkV4Y2VwdGlvbiBqYXhiRXhjZXB0aW9uKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiRXJyb3Igc2VyaWFsaXppbmcgYSBNeUJlYW4gdG8gdGhlIG91dHB1dCBzdHJlYW0iLCBqYXhiRXhjZXB0aW9uKTsKKyAgICAgICAgfQorICAgIH0KK31dXT48L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoZSA8bGl0ZXJhbD5NeUJlYW5NZXNzYWdlQm9keVdyaXRlcjwvbGl0ZXJhbD4gaW1wbGVtZW50cyB0aGUgJmxpdC5qYXhycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CisgICAgICAgICAgICAgICAgaW50ZXJmYWNlIHRoYXQgY29udGFpbnMgdGhyZWUgbWV0aG9kcy4gSW4gdGhlIG5leHQgc2VjdGlvbnMgd2UnbGwgZXhwbG9yZSB0aGVzZSBtZXRob2RzIG1vcmUgY2xvc2VseS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxzZWN0aW9uPgorICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+TWVzc2FnZUJvZHlXcml0ZXIuaXNXcml0ZWFibGU8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgQSBtZXRob2QgPGxpdGVyYWw+aXNXcml0ZWFibGU8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgIHNob3VsZCByZXR1cm4gdHJ1ZSBpZiB0aGUgJmxpdC5qYXhycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7IGlzIGFibGUgdG8gd3JpdGUgdGhlIGdpdmVuIHR5cGUuIE1ldGhvZAorICAgICAgICAgICAgICAgICAgICBkb2VzIG5vdCBkZWNpZGUgb25seSBiYXNlZCBvbiB0aGUgSmF2YSB0eXBlIG9mIHRoZSBlbnRpdHkgYnV0IGFsc28gb24gYW5ub3RhdGlvbnMgYXR0YWNoZWQgdG8gdGhlIGVudGl0eQorICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIHJlcXVlc3RlZCByZXByZXNlbnRhdGlvbiBtZWRpYSB0eXBlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgUGFyYW1ldGVycyA8bGl0ZXJhbD50eXBlPC9saXRlcmFsPiBhbmQgPGxpdGVyYWw+Z2VuZXJpY1R5cGU8L2xpdGVyYWw+IGJvdGggZGVmaW5lIHRoZSBlbnRpdHksCisgICAgICAgICAgICAgICAgICAgIHdoZXJlIDxsaXRlcmFsPnR5cGU8L2xpdGVyYWw+IGlzIGEgcmF3IEphdmEgdHlwZQorICAgICAgICAgICAgICAgICAgICAoZm9yIGV4YW1wbGUsIGEgPGxpdGVyYWw+amF2YS51dGlsLkxpc3Q8L2xpdGVyYWw+IGNsYXNzKSBhbmQgPGxpdGVyYWw+Z2VuZXJpY1R5cGU8L2xpdGVyYWw+IGlzIGEKKyAgICAgICAgICAgICAgICAgICAgJmpkazYuUGFyYW1ldGVyaXplZFR5cGU7IGluY2x1ZGluZyBnZW5lcmljIGluZm9ybWF0aW9uIChmb3IgZXhhbXBsZSA8bGl0ZXJhbD5MaXN0Jmx0O1N0cmluZyZndDs8L2xpdGVyYWw+KS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlciA8bGl0ZXJhbD5hbm5vdGF0aW9uczwvbGl0ZXJhbD4gY29udGFpbnMgYW5ub3RhdGlvbnMgdGhhdCBhcmUgZWl0aGVyIGF0dGFjaGVkIHRvIHRoZSByZXNvdXJjZQorICAgICAgICAgICAgICAgICAgICBtZXRob2QgYW5kL29yIGFubm90YXRpb25zIHRoYXQgYXJlIGF0dGFjaGVkIHRvIHRoZSBlbnRpdHkgYnkgYnVpbGRpbmcgcmVzcG9uc2UgbGlrZSBpbiB0aGUgZm9sbG93aW5nIHBpZWNlCisgICAgICAgICAgICAgICAgICAgIG9mIGNvZGU6CisKKyAgICAgICAgICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGl0bGU+RXhhbXBsZSBvZiBhc3NpZ25tZW50IG9mIGFubm90YXRpb25zIHRvIGEgcmVzcG9uc2UgZW50aXR5PC90aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPkBQYXRoKCJyZXNvdXJjZSIpCitwdWJsaWMgc3RhdGljIGNsYXNzIEFubm90YXRlZFJlc291cmNlIHsKKworICAgIEBHRVQKKyAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0KCkgeworICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb24gPSBBbm5vdGF0ZWRSZXNvdXJjZS5jbGFzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRBbm5vdGF0aW9uKFBhdGguY2xhc3MpOworICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soKQorICAgICAgICAgICAgICAgIC5lbnRpdHkoIkVudGl0eSIsIG5ldyBBbm5vdGF0aW9uW10ge2Fubm90YXRpb259KS5idWlsZCgpOworICAgIH0KK308L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisKKyAgICAgICAgICAgICAgICAgICAgSW4gdGhlIGV4YW1wbGUgYWJvdmUsIHRoZSAmbGl0LmpheHJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsgd291bGQgZ2V0CisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmFubm90YXRpb25zPC9saXRlcmFsPiBwYXJhbWV0ZXIgY29udGFpbmluZyBhIEpBWC1SUyA8bGl0ZXJhbD5AR0VUPC9saXRlcmFsPiBhbm5vdGF0aW9uCisgICAgICAgICAgICAgICAgICAgIGFzIGl0IGFubm90YXRlcyB0aGUgcmVzb3VyY2UgbWV0aG9kIGFuZCBhbHNvIGEgPGxpdGVyYWw+QFBhdGg8L2xpdGVyYWw+IGFubm90YXRpb24gYXMgaXQKKyAgICAgICAgICAgICAgICAgICAgaXMgcGFzc2VkIGluIHRoZSByZXNwb25zZSAoYnV0IG5vdCBiZWNhdXNlIGl0IGFubm90YXRlcyB0aGUgcmVzb3VyY2U7IG9ubHkgcmVzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kIGFubm90YXRpb25zIGFyZSBpbmNsdWRlZCkuIEluIHRoZSBjYXNlIG9mIDxsaXRlcmFsPk15UmVzb3VyY2U8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgIGFuZCBtZXRob2QgPGxpdGVyYWw+Z2V0TXlCZWFuPC9saXRlcmFsPiB0aGUgYW5ub3RhdGlvbnMgd291bGQgY29udGFpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgJmpheHJzLkdFVDsgYW5kIHRoZSAmamF4cnMuUHJvZHVjZXM7IGFubm90YXRpb24uCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUaGUgbGFzdCBwYXJhbWV0ZXIgb2YgdGhlIDxsaXRlcmFsPmlzV3JpdGVhYmxlPC9saXRlcmFsPiBtZXRob2QgaXMgdGhlIDxsaXRlcmFsPm1lZGlhVHlwZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgd2hpY2ggaXMgdGhlIG1lZGlhIHR5cGUgYXR0YWNoZWQgdG8gdGhlIHJlc3BvbnNlIGVudGl0eSBieSBhbm5vdGF0aW5nIHRoZSByZXNvdXJjZSBtZXRob2Qgd2l0aCBhCisgICAgICAgICAgICAgICAgICAgICZsaXQuamF4cnMuUHJvZHVjZXM7IGFubm90YXRpb24gb3IgdGhlIHJlcXVlc3QgbWVkaWEgdHlwZSBzcGVjaWZpZWQgaW4gdGhlIEpBWC1SUyBDbGllbnQgQVBJLgorICAgICAgICAgICAgICAgICAgICBJbiBvdXIgZXhhbXBsZSwgdGhlIG1lZGlhIHR5cGUgcGFzc2VkIHRvIHByb3ZpZGVycyBmb3IgdGhlIHJlc291cmNlIDxsaXRlcmFsPk15UmVzb3VyY2U8L2xpdGVyYWw+IGFuZCBtZXRob2QKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+Z2V0TXlCZWFuPC9saXRlcmFsPiB3b3VsZCBiZSA8bGl0ZXJhbD4iYXBwbGljYXRpb24veG1sIjwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBJbiBvdXIgaW1wbGVtZW50YXRpb24gb2YgdGhlIDxsaXRlcmFsPmlzV3JpdGVhYmxlPC9saXRlcmFsPiBtZXRob2QsIHdlCisgICAgICAgICAgICAgICAgICAgIGp1c3QgY2hlY2sgdGhhdCB0aGUgdHlwZSBpcyA8bGl0ZXJhbD5NeUJlYW48L2xpdGVyYWw+LiBQbGVhc2Ugbm90ZSwgdGhhdAorICAgICAgICAgICAgICAgICAgICB0aGlzIG1ldGhvZCBtaWdodCBiZSBleGVjdXRlZCBtdWx0aXBsZSB0aW1lcyBieSBKZXJzZXkgcnVudGltZSBhcyBKZXJzZXkgbmVlZHMgdG8gY2hlY2sKKyAgICAgICAgICAgICAgICAgICAgd2hldGhlciB0aGlzIHByb3ZpZGVyIGNhbiBiZSB1c2VkIGZvciBhIHBhcnRpY3VsYXIgY29tYmluYXRpb24gb2YgZW50aXR5IEphdmEgdHlwZSwgbWVkaWEgdHlwZSwgYW5kIGF0dGFjaGVkCisgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25zLCB3aGljaCBtYXkgYmUgcG90ZW50aWFsbHkgYSBwZXJmb3JtYW5jZSBob2cuIFlvdSBjYW4gbGltaXQgdGhlIG51bWJlciBvZiBleGVjdXRpb24gYnkKKyAgICAgICAgICAgICAgICAgICAgcHJvcGVybHkgZGVmaW5pbmcgdGhlICZsaXQuamF4cnMuUHJvZHVjZXM7IGFubm90YXRpb24gb24gdGhlICZsaXQuamF4cnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOy4KKyAgICAgICAgICAgICAgICAgICAgSW4gb3VyIGNhc2UgdGhhbmtzIHRvICZsaXQuamF4cnMuUHJvZHVjZXM7IGFubm90YXRpb24sIHRoZSBwcm92aWRlciB3aWxsIGJlIGNvbnNpZGVyZWQKKyAgICAgICAgICAgICAgICAgICAgYXMgd3JpdGVhYmxlIChhbmQgdGhlIG1ldGhvZCA8bGl0ZXJhbD5pc1dyaXRlYWJsZTwvbGl0ZXJhbD4gbWlnaHQgYmUgZXhlY3V0ZWQpIG9ubHkgaWYgdGhlCisgICAgICAgICAgICAgICAgICAgIG1lZGlhIHR5cGUgb2YgdGhlIG91dGJvdW5kIG1lc3NhZ2UgaXMgPGxpdGVyYWw+ImFwcGxpY2F0aW9uL3htbCI8L2xpdGVyYWw+LiBBZGRpdGlvbmFsbHksIHRoZSBwcm92aWRlcgorICAgICAgICAgICAgICAgICAgICB3aWxsIG9ubHkgYmUgY29uc2lkZXJlZCBhcyBwb3NzaWJsZSBjYW5kaWRhdGUgYW5kIGl0cyA8bGl0ZXJhbD5pc1dyaXRlYWJsZTwvbGl0ZXJhbD4gbWV0aG9kIHdpbGwKKyAgICAgICAgICAgICAgICAgICAgYmUgZXhlY3V0ZWQsIGlmIHRoZSBnZW5lcmljIHR5cGUgb2YgdGhlIHByb3ZpZGVyIGlzIGVpdGhlciBhIHN1YiBjbGFzcyBvciBzdXBlciBjbGFzcyBvZgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD50eXBlPC9saXRlcmFsPiBwYXJhbWV0ZXIuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbj4KKyAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICA8bGl0ZXJhbD5NZXNzYWdlQm9keVdyaXRlci53cml0ZVRvPC9saXRlcmFsPgorICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIE9uY2UgYSBtZXNzYWdlIGJvZHkgd3JpdGVyIGlzIHNlbGVjdGVkIGFzIHRoZSBtb3N0IGFwcHJvcHJpYXRlIChzZWUgdGhlIDx4cmVmIGxpbmtlbmQ9InByb3ZpZGVycy1zZWxlY3Rpb24iIC8+CisgICAgICAgICAgICAgICAgZm9yIG1vcmUgZGV0YWlscyBvbiBlbnRpdHkgcHJvdmlkZXIgc2VsZWN0aW9uKSwgaXRzIDxsaXRlcmFsPndyaXRlVG88L2xpdGVyYWw+IG1ldGhvZCBpcyBpbnZva2VkLiBUaGlzIG1ldGhvZAorICAgICAgICAgICAgICAgIHJlY2VpdmVzIHBhcmFtZXRlcnMgd2l0aCB0aGUgc2FtZSBtZWFuaW5nIGFzIGluIDxsaXRlcmFsPmlzV3JpdGVhYmxlPC9saXRlcmFsPiBhcyB3ZWxsIGFzIGEgZmV3IGFkZGl0aW9uYWwgb25lcy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEluIGFkZGl0aW9uIHRvIHRoZSBwYXJhbWV0ZXJzIGFscmVhZHkgaW50cm9kdWNlZCwgdGhlIDxsaXRlcmFsPndyaXRlVG88L2xpdGVyYWw+IG1ldGhvZCBkZWZpZXMgYWxzbworICAgICAgICAgICAgICAgIDxsaXRlcmFsPmh0dHBIZWFkZXJzPC9saXRlcmFsPiBwYXJhbWV0ZXIsIHRoYXQgY29udGFpbnMgSFRUUCBoZWFkZXJzIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAgICAgICAgICAgICAgICBvdXRib3VuZCBtZXNzYWdlLgorCisgICAgICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgV2hlbiBhICZsaXQuamF4cnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOyBpcyBpbnZva2VkLCB0aGUgaGVhZGVycyBzdGlsbCBjYW4gYmUgbW9kaWZpZWQgaW4gdGhpcyBwb2ludAorICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGFueSBtb2RpZmljYXRpb24gd2lsbCBiZSByZWZsZWN0ZWQgaW4gdGhlIG91dGJvdW5kIEhUVFAgbWVzc2FnZSBiZWluZyBzZW50LiBUaGUgbW9kaWZpY2F0aW9uIG9mCisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzIG11c3QgaG93ZXZlciBoYXBwZW4gYmVmb3JlIGEgZmlyc3QgYnl0ZSBpcyB3cml0dGVuIHRvIHRoZSBzdXBwbGllZCBvdXRwdXQgc3RyZWFtLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9ub3RlPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgQW5vdGhlciBuZXcgcGFyYW1ldGVyLCA8bGl0ZXJhbD5teUJlYW48L2xpdGVyYWw+LCBjb250YWlucyB0aGUgZW50aXR5IGluc3RhbmNlIHRvIGJlIHNlcmlhbGl6ZWQgKHRoZSB0eXBlIG9mCisgICAgICAgICAgICAgICAgZW50aXR5IGNvcnJlc3BvbmRzIHRvIGdlbmVyaWMgdHlwZSBvZiAmbGl0LmpheHJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjspLiBSZWxhdGVkIHBhcmFtZXRlcgorICAgICAgICAgICAgICAgIDxsaXRlcmFsPmVudGl0eVN0cmVhbTwvbGl0ZXJhbD4gY29udGFpbnMgdGhlIGVudGl0eSBvdXRwdXQgc3RyZWFtIHRvIHdoaWNoIHRoZSBtZXRob2Qgc2hvdWxkIHNlcmlhbGl6ZSB0aGUgZW50aXR5LgorICAgICAgICAgICAgICAgIEluIG91ciBjYXNlIHdlIHVzZSBKQVhCIHRvIG1hcnNoYWxsIHRoZSBlbnRpdHkgaW50byB0aGUgPGxpdGVyYWw+ZW50aXR5U3RyZWFtPC9saXRlcmFsPi4gTm90ZSwgdGhhdCB0aGUKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbD5lbnRpdHlTdHJlYW08L2xpdGVyYWw+IGlzIG5vdCBjbG9zZWQgYXQgdGhlIGVuZCBvZiBtZXRob2Q7IHRoZSBzdHJlYW0gd2lsbCBiZSBjbG9zZWQgYnkgSmVyc2V5LgorICAgICAgICAgICAgICAgIDxpbXBvcnRhbnQ+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgRG8gbm90IGNsb3NlIHRoZSBlbnRpdHkgb3V0cHV0IHN0cmVhbSBpbiB0aGUgPGxpdGVyYWw+d3JpdGVUbzwvbGl0ZXJhbD4gbWV0aG9kIG9mIHlvdXIKKyAgICAgICAgICAgICAgICAgICAgICAgICZsaXQuamF4cnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvaW1wb3J0YW50PgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICA8dGl0bGU+CisgICAgICAgICAgICAgICAgPGxpdGVyYWw+TWVzc2FnZUJvZHlXcml0ZXIuZ2V0U2l6ZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgbWV0aG9kIGlzIGRlcHJlY2F0ZWQgc2luY2UgSkFYLVJTIDIuMCBhbmQgSmVyc2V5IDIgaWdub3JlcyB0aGUgcmV0dXJuIHZhbHVlLiBJbiBKQVgtUlMgMS4wIHRoZQorICAgICAgICAgICAgICAgIG1ldGhvZCBjb3VsZCByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGVudGl0eSB0aGF0IHdvdWxkIGJlIHRoZW4gdXNlZCBmb3IgIkNvbnRlbnQtTGVuZ3RoIiByZXNwb25zZQorICAgICAgICAgICAgICAgIGhlYWRlci4gSW4gSmVyc2V5IDIuMCB0aGUgIkNvbnRlbnQtTGVuZ3RoIiBwYXJhbWV0ZXIgaXMgY29tcHV0ZWQgYXV0b21hdGljYWxseSB1c2luZyBhbiBpbnRlcm5hbAorICAgICAgICAgICAgICAgIG91dGJvdW5kIGVudGl0eSBidWZmZXJpbmcuIEZvciBkZXRhaWxzIGFib3V0IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBvZiBvdXRib3VuZCBlbnRpdHkgYnVmZmVyaW5nIHNlZSB0aGUgamF2YWRvYworICAgICAgICAgICAgICAgIG9mICZqZXJzZXkubWVzc2FnZS5NZXNzYWdlUHJvcGVydGllczssIHByb3BlcnR5IDxsaXRlcmFsPk9VVEJPVU5EX0NPTlRFTlRfTEVOR1RIX0JVRkZFUjwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICB3aGljaCBjb25maWd1cmVzIHRoZSBzaXplIG9mIHRoZSBidWZmZXIuCisgICAgICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgWW91IGNhbiBkaXNhYmxlIHRoZSBKZXJzZXkgb3V0Ym91bmQgZW50aXR5IGJ1ZmZlcmluZyBieSBzZXR0aW5nIHRoZSBidWZmZXIgc2l6ZSB0byAwLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9ub3RlPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uPgorICAgICAgICAgICAgPHRpdGxlPlRlc3RpbmcgYSAmbGl0LmpheHJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjs8L3RpdGxlPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgQmVmb3JlIHRlc3RpbmcgdGhlIDxsaXRlcmFsPk15QmVhbk1lc3NhZ2VCb2R5V3JpdGVyPC9saXRlcmFsPiwgdGhlIHdyaXRlciBtdXN0CisgICAgICAgICAgICAgICAgYmUgcmVnaXN0ZXJlZCBhcyBhIGN1c3RvbSBKQVgtUlMgZXh0ZW5zaW9uIHByb3ZpZGVyLiBJdCBzaG91bGQgZWl0aGVyIGJlIGFkZGVkIHRvIHlvdXIgYXBwbGljYXRpb24KKyAgICAgICAgICAgICAgICAmamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzssIG9yIHJldHVybmVkIGZyb20geW91ciBjdXN0b20gJmpheHJzLmNvcmUuQXBwbGljYXRpb247IHN1Yi1jbGFzcywgb3IKKyAgICAgICAgICAgICAgICBhbm5vdGF0ZWQgd2l0aCAmamF4cnMuZXh0LlByb3ZpZGVyOyBhbm5vdGF0aW9uIHRvIGxldmVyYWdlIEpBWC1SUyBwcm92aWRlciBhdXRvLWRpc2NvdmVyeSBmZWF0dXJlLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgQWZ0ZXIgcmVnaXN0ZXJpbmcgdGhlIDxsaXRlcmFsPk15QmVhbk1lc3NhZ2VCb2R5V3JpdGVyPC9saXRlcmFsPiBhbmQgPGxpdGVyYWw+TXlSZXNvdXJjZTwvbGl0ZXJhbD4gY2xhc3MKKyAgICAgICAgICAgICAgICBpbiBvdXIgYXBwbGljYXRpb24sIHRoZSByZXF1ZXN0IGNhbiBiZSBpbml0aWF0ZWQgKGluIHRoaXMgZXhhbXBsZSBmcm9tIENsaWVudCBBUEkpLgorCisgICAgICAgICAgICAgICAgPGV4YW1wbGUgeG1sOmlkPSJjbGllbnQtZ2V0LWNhbGwiPgorICAgICAgICAgICAgICAgICAgICA8dGl0bGU+Q2xpZW50IGNvZGUgdGVzdGluZyBNeUJlYW5NZXNzYWdlQm9keVdyaXRlcjwvdGl0bGU+CisgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiID5XZWJUYXJnZXQgd2ViVGFyZ2V0ID0gLy8gaW5pdGlhbGl6ZSB3ZWIgdGFyZ2V0IHRvIHRoZSBjb250ZXh0IHJvb3QKKyAgICAgICAgICAgIC8vIG9mIGV4YW1wbGUgYXBwbGljYXRpb24KK1Jlc3BvbnNlIHJlc3BvbnNlID0gd2ViVGFyZ2V0LnBhdGgoInJlc291cmNlIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUwpLmdldCgpOworU3lzdGVtLm91dC5wcmludGxuKHJlc3BvbnNlLmdldFN0YXR1cygpKTsKK1N0cmluZyBteUJlYW5YbWwgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CitTeXN0ZW0ub3V0LnByaW50bG4obXlCZWFuWG1sKTs8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKworICAgICAgICAgICAgICAgIFRoZSBjbGllbnQgY29kZSBpbml0aWF0ZXMgdGhlICZsaXQuaHR0cC5HRVQ7IHdoaWNoIHdpbGwgYmUgbWF0Y2hlZCB0byB0aGUgcmVzb3VyY2UgbWV0aG9kCisgICAgICAgICAgICAgICAgPGxpdGVyYWw+TXlSZXNvdXJjZS5nZXRNeUJlYW4oKTwvbGl0ZXJhbD4uIFRoZSByZXNwb25zZSBlbnRpdHkgaXMgZGUtc2VyaWFsaXplZCBhcyBhIDxsaXRlcmFsPlN0cmluZzwvbGl0ZXJhbD4uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgcmVzdWx0IG9mIGNvbnNvbGUgb3V0cHV0IGlzOgorCisgICAgICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5SZXN1bHQgb2YgTXlCZWFuTWVzc2FnZUJvZHlXcml0ZXIgdGVzdDwvdGl0bGU+CisgICAgICAgICAgICAgICAgICAgIDxzY3JlZW4gbGFuZ3VhZ2U9InRleHQiIGxpbmVudW1iZXJpbmc9InVubnVtYmVyZWQiPjwhW0NEQVRBWzIwMAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PjxteUJlYW4+Cis8YW55U3RyaW5nPkhlbGxvIFdvcmxkITwvYW55U3RyaW5nPjxhbnlOdW1iZXI+NDI8L2FueU51bWJlcj48L215QmVhbj5dXT48L3NjcmVlbj4KKyAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisKKyAgICAgICAgICAgICAgICBUaGUgcmV0dXJuZWQgc3RhdHVzIGlzIDIwMCBhbmQgdGhlIGVudGl0eSBpcyBzdG9yZWQgaW4gdGhlIHJlc3BvbnNlIGluIGEgPGxpdGVyYWw+WE1MPC9saXRlcmFsPiBmb3JtYXQuCisgICAgICAgICAgICAgICAgTmV4dCwgd2Ugd2lsbCBsb29rIGF0IGhvdyB0aGUgSmVyc2V5IGRlLXNlcmlhbGl6ZXMgdGhpcyBYTUwgZG9jdW1lbnQgaW50byBhIDxsaXRlcmFsPk15QmVhbjwvbGl0ZXJhbD4gY29uc3VtZWQgYnkKKyAgICAgICAgICAgICAgICBvdXIgJmxpdC5odHRwLlBPU1Q7IHJlc291cmNlIG1ldGhvZC4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICA8dGl0bGU+TWVzc2FnZUJvZHlSZWFkZXI8L3RpdGxlPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgSW4gb3JkZXIgdG8gZGUtc2VyaWFsaXplIHRoZSBlbnRpdHkgb2YgPGxpdGVyYWw+TXlCZWFuPC9saXRlcmFsPiBvbiB0aGUgc2VydmVyIG9yIHRoZSBjbGllbnQsIHdlIG5lZWQgdG8gaW1wbGVtZW50CisgICAgICAgICAgICAgICAgYSBjdXN0b20gJmpheHJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcjsuCisgICAgICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgUGxlYXNlIG5vdGUsIHRoYXQgdGhpcyBpcyBvbmx5IGEgZGVtb25zdHJhdGlvbiBvZiBob3cgdG8gd3JpdGUgYSBjdXN0b20gZW50aXR5IHByb3ZpZGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgSmVyc2V5IGFscmVhZHkgY29udGFpbnMgZGVmYXVsdCBzdXBwb3J0IGZvciBlbnRpdHkgcHJvdmlkZXJzIHRoYXQgY2FuIHNlcmlhbGl6ZSBKQVhCIGJlYW5zCisgICAgICAgICAgICAgICAgICAgICAgICBpbnRvIFhNTC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIE91ciAmbGl0LmpheHJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcjsgaW1wbGVtZW50YXRpb24gaXMgbGlzdGVkIGluIDx4cmVmIGxpbmtlbmQ9Im1idy5leC5tYnIiIC8+LgorCisgICAgICAgICAgICAgICAgPGV4YW1wbGUgeG1sOmlkPSJtYncuZXgubWJyIj4KKyAgICAgICAgICAgICAgICAgICAgPHRpdGxlPk1lc3NhZ2VCb2R5UmVhZGVyIGV4YW1wbGU8L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj48IVtDREFUQVtwdWJsaWMgc3RhdGljIGNsYXNzIE15QmVhbk1lc3NhZ2VCb2R5UmVhZGVyCisgICAgICAgIGltcGxlbWVudHMgTWVzc2FnZUJvZHlSZWFkZXI8TXlCZWFuPiB7CisKK0BPdmVycmlkZQorcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLAorICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgIHJldHVybiB0eXBlID09IE15QmVhbi5jbGFzczsKK30KKworQE92ZXJyaWRlCitwdWJsaWMgTXlCZWFuIHJlYWRGcm9tKENsYXNzPE15QmVhbj4gdHlwZSwKKyAgICBUeXBlIGdlbmVyaWNUeXBlLAorICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaHR0cEhlYWRlcnMsCisgICAgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKworICAgIHRyeSB7CisgICAgICAgIEpBWEJDb250ZXh0IGpheGJDb250ZXh0ID0gSkFYQkNvbnRleHQubmV3SW5zdGFuY2UoTXlCZWFuLmNsYXNzKTsKKyAgICAgICAgTXlCZWFuIG15QmVhbiA9IChNeUJlYW4pIGpheGJDb250ZXh0LmNyZWF0ZVVubWFyc2hhbGxlcigpCisgICAgICAgICAgICAudW5tYXJzaGFsKGVudGl0eVN0cmVhbSk7CisgICAgICAgIHJldHVybiBteUJlYW47CisgICAgfSBjYXRjaCAoSkFYQkV4Y2VwdGlvbiBqYXhiRXhjZXB0aW9uKSB7CisgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKCJFcnJvciBkZXNlcmlhbGl6aW5nIGEgTXlCZWFuLiIsCisgICAgICAgICAgICBqYXhiRXhjZXB0aW9uKTsKKyAgICB9Cit9Cit9XV0+PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisKKyAgICAgICAgICAgICAgICBJdCBpcyBvYnZpb3VzIHRoYXQgdGhlICZsaXQuamF4cnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyOyBpbnRlcmZhY2UgaXMgc2ltaWxhciB0byAmbGl0LmpheHJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsuCisgICAgICAgICAgICAgICAgSW4gdGhlIG5leHQgY291cGxlIG9mIHNlY3Rpb25zIHdlIHdpbGwgZXhwbG9yZSBpdCdzIEFQSSBtZXRob2RzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICAgICAgPHRpdGxlPjxsaXRlcmFsPk1lc3NhZ2VCb2R5UmVhZGVyLmlzUmVhZGFibGU8L2xpdGVyYWw+PC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgSXQgZGVmaW5lcyB0aGUgbWV0aG9kIDxsaXRlcmFsPmlzUmVhZGFibGUoKTwvbGl0ZXJhbD4gd2hpY2ggaGFzIGEgdmVyeSBzaW1saWFyIG1lYW5pbmcgYXMgbWV0aG9kCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmlzV3JpdGVhYmxlKCk8L2xpdGVyYWw+IGluICZsaXQuamF4cnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOy4gVGhlIG1ldGhvZCByZXR1cm5zICZsaXQudHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgaXQgaXMgYWJsZSB0byBkZS1zZXJpYWxpemUgdGhlIGdpdmVuIHR5cGUuIFRoZSA8bGl0ZXJhbD5hbm5vdGF0aW9uczwvbGl0ZXJhbD4gcGFyYW1ldGVyIGNvbnRhaW5zIGFubm90YXRpb25zCisgICAgICAgICAgICAgICAgICAgIHRoYXQgYXJlIGF0dGFjaGVkIHRvIHRoZSBlbnRpdHkgcGFyYW1ldGVyIGluIHRoZSByZXNvdXJjZSBtZXRob2QuIEluIG91ciAmbGl0Lmh0dHAuUE9TVDsgcmVzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kIDxsaXRlcmFsPnBvc3RNeUJlYW48L2xpdGVyYWw+IHRoZSBlbnRpdHkgcGFyYW1ldGVyIDxsaXRlcmFsPm15QmVhbjwvbGl0ZXJhbD4gaXMgbm90CisgICAgICAgICAgICAgICAgICAgIGFubm90YXRlZCwgdGhlcmVmb3JlIG5vIGFubm90YXRpb24gd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGlzUmVhZGFibGUuIFRoZSA8bGl0ZXJhbD5tZWRpYVR5cGU8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlciBjb250YWlucyB0aGUgZW50aXR5IG1lZGlhIHR5cGUuIFRoZSBtZWRpYSB0eXBlLCBpbiBvdXIgY2FzZSwgbXVzdCBiZSBjb25zdW1hYmxlIGJ5IHRoZSAmbGl0Lmh0dHAuUE9TVDsKKyAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UgbWV0aG9kLCB3aGljaCBpcyBzcGVjaWZpZWQgYnkgcGxhY2luZyBhIEpBWC1SUyAmamF4cnMuQ29uc3VtZXM7IGFubm90YXRpb24gdG8gdGhlIG1ldGhvZC4KKyAgICAgICAgICAgICAgICAgICAgVGhlIHJlc291cmNlIG1ldGhvZCA8bGl0ZXJhbD5wb3N0TXlCZWFuKCk8L2xpdGVyYWw+IGlzIGFubm90YXRlZCB3aXRoCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPkBDb25zdW1lcygiYXBwbGljYXRpb24veG1sIik8L2xpdGVyYWw+LAorICAgICAgICAgICAgICAgICAgICB0aGVyZWZvcmUgZm9yIHB1cnBvc2Ugb2YgZGUtc2VyaWFsaXphdGlvbiBvZiBlbnRpdHkgZm9yIHRoZSA8bGl0ZXJhbD5wb3N0TXlCZWFuKCk8L2xpdGVyYWw+IG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgb25seSByZXF1ZXN0cyB3aXRoIGVudGl0aWVzIHJlcHJlc2VudGVkIGFzIDxsaXRlcmFsPiJhcHBsaWNhdGlvbi94bWwiPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICBtZWRpYSB0eXBlIHdpbGwgbWF0Y2ggdGhlIG1ldGhvZC4gSG93ZXZlciwgdGhpcyBtZXRob2QgbWlnaHQgYmUgZXhlY3V0ZWQgZm9yIGZvciBlbnRpdHkgdHlwZXMgdGhhdCBhcmUgc3ViIGNsYXNzZXMKKyAgICAgICAgICAgICAgICAgICAgb3Igc3VwZXIgY2xhc3NlcyBvZiB0aGUgZGVjbGFyZWQgZ2VuZXJpYyB0eXBlIG9uIHRoZSAmbGl0LmpheHJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcjsgd2lsbCBiZSBhbHNvIGNvbnNpZGVyZWQuCisgICAgICAgICAgICAgICAgICAgIEl0IGlzIGEgcmVzcG9uc2liaWxpdHkgb2YgdGhlIDxsaXRlcmFsPmlzUmVhZGFibGU8L2xpdGVyYWw+IG1ldGhvZCB0byBkZWNpZGUgd2hldGhlciBpdCBpcyBhYmxlCisgICAgICAgICAgICAgICAgICAgIHRvIGRlLXNlcmlhbGl6ZSB0aGUgZW50aXR5IGFuZCB0eXBlIGNvbXBhcmlzb24gaXMgb25lIG9mIHRoZSBiYXNpYyBkZWNpc2lvbiBzdGVwcy4KKyAgICAgICAgICAgICAgICAgICAgPHRpcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluIG9yZGVyIHRvIHJlZHVjZSBudW1iZXIgb2YgPGxpdGVyYWw+aXNSZWFkYWJsZTwvbGl0ZXJhbD4gZXhlY3V0aW9ucywgYWx3YXlzIGRlZmluZSBjb3JyZWN0bHkgdGhlIGNvbnN1bWFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYSB0eXBlKHMpIHdpdGggdGhlICZsaXQuamF4cnMuQ29uc3VtZXM7IGFubm90YXRpb24gb24geW91ciBjdXN0b20gJmxpdC5qYXhycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7LgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L3RpcD4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgICAgICA8c2VjdGlvbj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+PGxpdGVyYWw+TWVzc2FnZUJvZHlSZWFkZXIucmVhZEZyb208L2xpdGVyYWw+PC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgVGhlIDxsaXRlcmFsPnJlYWRGb3JtKCk8L2xpdGVyYWw+IG1ldGhvZCBnZXRzIHRoZSBwYXJhbWV0ZXJzIHdpdGggdGhlIHNhbWUgbWVhbmluZyBhcyBpbgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5pc1JlYWRhYmxlKCk8L2xpdGVyYWw+LiBUaGUgYWRkaXRpb25hbCA8bGl0ZXJhbD5lbnRpdHlTdHJlYW08L2xpdGVyYWw+IHBhcmFtZXRlciBwcm92aWRlcyBhIGhhbmRsZQorICAgICAgICAgICAgICAgICAgICB0byB0aGUgZW50aXR5IGlucHV0IHN0cmVhbSBmcm9tIHdoaWNoIHRoZSBlbnRpdHkgYnl0ZXMgc2hvdWxkIGJlIHJlYWQgYW5kIGRlLXNlcmlhbGl6ZWQgaW50byBhIEphdmEgZW50aXR5IHdoaWNoCisgICAgICAgICAgICAgICAgICAgIGlzIHRoZW4gcmV0dXJuZWQgZnJvbSB0aGUgbWV0aG9kLiBPdXIgPGxpdGVyYWw+TXlCZWFuTWVzc2FnZUJvZHlSZWFkZXI8L2xpdGVyYWw+IGRlLXNlcmlhbGl6ZXMgdGhlIGluY29taW5nCisgICAgICAgICAgICAgICAgICAgIFhNTCBkYXRhIGludG8gYW4gaW5zdGFuY2Ugb2YgPGxpdGVyYWw+TXlCZWFuPC9saXRlcmFsPiB1c2luZyBKQVhCLgorCisgICAgICAgICAgICAgICAgICAgIDxpbXBvcnRhbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEbyBub3QgY2xvc2UgdGhlIGVudGl0eSBpbnB1dCBzdHJlYW0gaW4geW91ciAmbGl0LmpheHJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcjsgaW1wbGVtZW50YXRpb24uIFRoZSBzdHJlYW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgY2xvc2VkIGJ5IEplcnNleSBydW50aW1lLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2ltcG9ydGFudD4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgICAgICA8c2VjdGlvbj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+VGVzdGluZyBhICZsaXQuamF4cnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOzwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgTm93IGxldCdzIHNlbmQgYSB0ZXN0IHJlcXVlc3QgdXNpbmcgdGhlIEpBWC1SUyBDbGllbnQgQVBJLgorCisgICAgICAgICAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRpdGxlPlRlc3RpbmcgTXlCZWFuTWVzc2FnZUJvZHlSZWFkZXI8L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+PCFbQ0RBVEFbZmluYWwgTXlCZWFuIG15QmVhbiA9IG5ldyBNeUJlYW4oInBvc3RlZCBNeUJlYW4iLCAxMSk7CitSZXNwb25zZSByZXNwb25zZSA9IHdlYlRhcmdldC5wYXRoKCJyZXNvdXJjZSIpLnJlcXVlc3QoImFwcGxpY2F0aW9uL3htbCIpCisgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkobXlCZWFuLCAiYXBwbGljYXRpb24veG1sIikpOworCitTeXN0ZW0ub3V0LnByaW50bG4ocmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworZmluYWwgU3RyaW5nIHJlc3BvbnNlRW50aXR5ID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworU3lzdGVtLm91dC5wcmludGxuKHJlc3BvbnNlRW50aXR5KTsKK11dPjwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFRoZSBjb25zb2xlIG91dHB1dCBpczoKKworICAgICAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5SZXN1bHQgb2YgdGVzdGluZyBNeUJlYW5NZXNzYWdlQm9keVJlYWRlcjwvdGl0bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2NyZWVuIGxhbmd1YWdlPSJ0ZXh0IiBsaW5lbnVtYmVyaW5nPSJ1bm51bWJlcmVkIj48IVtDREFUQVsyMDAKK3Bvc3RlZCBNeUJlYW5dXT48L3NjcmVlbj4KKyAgICAgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgICAgIDxzZWN0aW9uPgorICAgICAgICAgICAgICAgIDx0aXRsZT5Vc2luZyBFbnRpdHkgUHJvdmlkZXJzIHdpdGggSkFYLVJTIENsaWVudCBBUEk8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBCb3RoLCAmbGl0LmpheHJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcjsgYW5kICZsaXQuamF4cnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOyBjYW4gYmUgcmVnaXN0ZXJlZCBpbiBhCisgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gb2YgSkFYLVJTIENsaWVudCBBUEkgY29tcG9uZW50cyB0eXBpY2FsbHkgd2l0aG91dCBhbnkgbmVlZCB0byBjaGFuZ2UgdGhlaXIgY29kZS4gVGhlIGV4YW1wbGUKKyAgICAgICAgICAgICAgICAgICAgPHhyZWYgbGlua2VuZD0ibWJ3LmV4LmNsaWVudC5tYnIucmVnIiAvPiBpcyBhIHZhcmlhdGlvbiBvbiB0aGUgPHhyZWYgbGlua2VuZD0iY2xpZW50LWdldC1jYWxsIiAvPgorICAgICAgICAgICAgICAgICAgICBsaXN0ZWQgaW4gb25lIG9mIHRoZSBwcmV2aW91cyBzZWN0aW9ucy4KKworICAgICAgICAgICAgICAgICAgICA8ZXhhbXBsZSB4bWw6aWQ9Im1idy5leC5jbGllbnQubWJyLnJlZyI+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGl0bGU+TWVzc2FnZUJvZHlSZWFkZXIgcmVnaXN0ZXJlZCBvbiBhIEpBWC1SUyBjbGllbnQ8L3RpdGxlPgorCisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj48IVtDREFUQVtDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdCdWlsZGVyKCkKKyAgICAucmVnaXN0ZXIoTXlCZWFuTWVzc2FnZUJvZHlSZWFkZXIuY2xhc3MpLmJ1aWxkKCk7CisKK1Jlc3BvbnNlIHJlc3BvbnNlID0gY2xpZW50LnRhcmdldCgiaHR0cDovL2V4YW1wbGUvY29tbS9yZXNvdXJjZSIpCisgICAgLnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTCkuZ2V0KCk7CitTeXN0ZW0ub3V0LnByaW50bG4ocmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworTXlCZWFuIG15QmVhbiA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoTXlCZWFuLmNsYXNzKTsKK1N5c3RlbS5vdXQucHJpbnRsbihteUJlYW4pO11dPjwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFRoZSBjb2RlIGFib3ZlIHJlZ2lzdGVycyA8bGl0ZXJhbD5NeUJlYW5NZXNzYWdlQm9keVJlYWRlcjwvbGl0ZXJhbD4gdG8gdGhlICZqYXhycy5jbGllbnQuQ2xpZW50OyBjb25maWd1cmF0aW9uCisgICAgICAgICAgICAgICAgICAgIHVzaW5nIGEgJmpheHJzLmNsaWVudC5DbGllbnRCdWlsZGVyOyB3aGljaCBtZWFucyB0aGF0IHRoZSBwcm92aWRlciB3aWxsIGJlIHVzZWQgZm9yIGFueSAmamF4cnMuY2xpZW50LldlYlRhcmdldDsKKyAgICAgICAgICAgICAgICAgICAgcHJvZHVjZWQgYnkgdGhlIDxsaXRlcmFsPmNsaWVudDwvbGl0ZXJhbD4gaW5zdGFuY2UuCisgICAgICAgICAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWW91IGNvdWxkIGFsc28gcmVnaXN0ZXIgdGhlIEpBWC1SUyBlbnRpdHkgKGFuZCBhbnkgb3RoZXIpIHByb3ZpZGVycyB0byBpbmRpdmlkdWFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpdC5qYXhycy5jbGllbnQuV2ViVGFyZ2V0OyBpbnN0YW5jZXMgcHJvZHVjZWQgYnkgdGhlIGNsaWVudC4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9ub3RlPgorCisgICAgICAgICAgICAgICAgICAgIFRoZW4sIHVzaW5nIHRoZSBmbHVlbnQgY2hhaW4gb2YgbWV0aG9kIGludm9jYXRpb25zLCBhIHJlc291cmNlIHRhcmdldCBwb2ludGluZyB0byBvdXIKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+TXlSZXNvdXJjZTwvbGl0ZXJhbD4gaXMgZGVmaW5lZCwgYSBIVFRQICZsaXQuaHR0cC5HRVQ7IHJlcXVlc3QgaXMgaW52b2tlZC4KKyAgICAgICAgICAgICAgICAgICAgVGhlIHJlc3BvbnNlIGVudGl0eSBpcyB0aGVuIHJlYWQgYXMgYW4gaW5zdGFuY2Ugb2YgYSA8bGl0ZXJhbD5NeUJlYW48L2xpdGVyYWw+IHR5cGUgYnkgaW52b2tpbmcgdGhlCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPnJlc3BvbnNlLnJlYWRFbnRpdHk8L2xpdGVyYWw+IG1ldGhvZCwgdGhhdCBpbnRlcm5hbGx5IGxvY2F0ZXMgdGhlIHJlZ2lzdGVyZWQKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+TXlCZWFuTWVzc2FnZUJvZHlSZWFkZXI8L2xpdGVyYWw+IGFuZCB1c2VzIGl0IGZvciBlbnRpdHkgZGUtc2VyaWFsaXphdGlvbi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFRoZSBjb25zb2xlIG91dHB1dCBmb3IgdGhlIGV4YW1wbGUgaXM6CisgICAgICAgICAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRpdGxlPlJlc3VsdCBvZiBjbGllbnQgY29kZSBleGVjdXRpb248L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNjcmVlbiBsYW5ndWFnZT0idGV4dCIgbGluZW51bWJlcmluZz0idW5udW1iZXJlZCI+PCFbQ0RBVEFbMjAwCitNeUJlYW57YW55U3RyaW5nPSdIZWxsbyBXb3JsZCEnLCBhbnlOdW1iZXI9NDJ9XV0+PC9zY3JlZW4+CisgICAgICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiB4bWw6aWQ9InByb3ZpZGVycy1zZWxlY3Rpb24iPgorICAgICAgICA8dGl0bGU+RW50aXR5IFByb3ZpZGVyIFNlbGVjdGlvbjwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBVc3VhbGx5IHRoZXJlIGFyZSBtYW55IGVudGl0eSBwcm92aWRlcnMgcmVnaXN0ZXJlZCBvbiB0aGUgc2VydmVyIG9yIGNsaWVudCBzaWRlIChiZSBkZWZhdWx0IHRoZXJlIG11c3QgYmUKKyAgICAgICAgICAgIGF0IGxlYXN0IHByb3ZpZGVycyBtYW5kYXRlZCBieSB0aGUgSkFYLVJTIHNwZWNpZmljYXRpb24sIHN1Y2ggYXMgcHJvdmlkZXJzIGZvciBwcmltaXRpdmUgdHlwZXMsIGJ5dGUgYXJyYXksCisgICAgICAgICAgICBKQVhCIGJlYW5zLCBldGMuKS4KKyAgICAgICAgICAgIEpBWC1SUyBkZWZpbmVzIGFuIGFsZ29yaXRobSBmb3Igc2VsZWN0aW5nIHRoZSBtb3N0IHN1aXRhYmxlIHByb3ZpZGVyIGZvciBlbnRpdHkgcHJvY2Vzc2luZy4gVGhpcyBhbGdvcml0aG0KKyAgICAgICAgICAgIHdvcmtzIHdpdGggaW5mb3JtYXRpb24gc3VjaCBhcyBlbnRpdHkgSmF2YSB0eXBlIGFuZCBvbi10aGUtd2lyZSBtZWRpYSB0eXBlIHJlcHJlc2VudGF0aW9uIG9mIGVudGl0eSwgYW5kIHNlYXJjaGVzCisgICAgICAgICAgICBmb3IgdGhlIG1vc3Qgc3VpdGFibGUgZW50aXR5IHByb3ZpZGVyIGZyb20gdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIHByb3ZpZGVycyBiYXNlZCBvbiB0aGUgc3VwcG9ydGVkIG1lZGlhIHR5cGUKKyAgICAgICAgICAgIGRlY2xhcmVkIG9uIGVhY2ggcHJvdmlkZXIgKGRlZmluZWQgYnkgJmxpdC5qYXhycy5Qcm9kdWNlczsgb3IgJmxpdC5qYXhycy5Db25zdW1lczsgb24gdGhlIHByb3ZpZGVyIGNsYXNzKQorICAgICAgICAgICAgYXMgd2VsbCBhcyBiYXNlZCBvbiB0aGUgZ2VuZXJpYyB0eXBlIGRlY2xhcmF0aW9uIG9mIHRoZSBhdmFpbGFibGUgcHJvdmlkZXJzLiBXaGVuIGEgbGlzdCBvZiBzdWl0YWJsZSBjYW5kaWRhdGUKKyAgICAgICAgICAgIGVudGl0eSBwcm92aWRlcnMgaXMgc2VsZWN0ZWQgYW5kIHNvcnRlZCBiYXNlZCBvbiB0aGUgcnVsZXMgZGVmaW5lZCBpbiBKQVgtUlMgc3BlY2lmaWNhdGlvbiwgYSBKQVgtUlMgcnVudGltZQorICAgICAgICAgICAgdGhlbiBpdCBpbnZva2VzIDxsaXRlcmFsPmlzUmVhZGFibGU8L2xpdGVyYWw+IG9yIDxsaXRlcmFsPmlzV3JpdGVhYmxlPC9saXRlcmFsPiBtZXRob2QgcmVzcGVjdGl2ZWx5IG9uIGVhY2gKKyAgICAgICAgICAgIHByb3ZpZGVyIGluIHRoZSBsaXN0IHVudGlsIGEgZmlyc3QgcHJvdmlkZXIgaXMgZm91bmQgdGhhdCByZXR1cm5zICZsaXQudHJ1ZTsuIFRoaXMgcHJvdmlkZXIgaXMgdGhlbiB1c2VkIHRvCisgICAgICAgICAgICBwcm9jZXNzIHRoZSBlbnRpdHkuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaGUgZm9sbG93aW5nIHN0ZXBzIGRlc2NyaWJlIHRoZSBhbGdvcml0aG0gZm9yIHNlbGVjdGluZyBhICZsaXQuamF4cnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOyAoZXh0cmFjdGVkCisgICAgICAgICAgICBmcm9tIEpBWC1SUyB3aXRoIGxpdHRsZSBtb2RpZmljYXRpb25zKS4gVGhlIHN0ZXBzIHJlZmVyIHRvIHRoZSBwcmV2aW91c2x5IGRpc2N1c3NlZCBleGFtcGxlIGFwcGxpY2F0aW9uLgorICAgICAgICAgICAgVGhlICZsaXQuamF4cnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOyBpcyBzZWFyY2hlZCBmb3IgcHVycG9zZSBvZiBkZXNlcmlhbGl6YXRpb24gb2YgPGxpdGVyYWw+TXlCZWFuPC9saXRlcmFsPgorICAgICAgICAgICAgZW50aXR5IHJldHVybmVkIGZyb20gdGhlIG1ldGhvZCA8bGl0ZXJhbD5nZXRNeUJlYW48L2xpdGVyYWw+LiBTbywgPGVtcGhhc2lzPnR5cGUgaXMgPGxpdGVyYWw+TXlCZWFuPC9saXRlcmFsPgorICAgICAgICAgICAgYW5kIG1lZGlhIHR5cGUgPGxpdGVyYWw+ImFwcGxpY2F0aW9uL3htbCI8L2xpdGVyYWw+PC9lbXBoYXNpcz4uIExldCdzIGFzc3VtZSB0aGUgcnVudGltZSBjb250YWlucyBhbHNvCisgICAgICAgICAgICByZWdpc3RlcmVkIHByb3ZpZGVycywgbmFtZWx5OgorCisgICAgICAgICAgICA8c2ltcGxlbGlzdD4KKyAgICAgICAgICAgICAgICA8bWVtYmVyPgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5BPC9saXRlcmFsPjogPGxpdGVyYWw+QFByb2R1Y2VzKCJhcHBsaWNhdGlvbi8qIik8L2xpdGVyYWw+IHdpdGggZ2VuZXJpYyB0eXBlCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPiZsdDtPYmplY3QmZ3Q7PC9saXRlcmFsPgorICAgICAgICAgICAgICAgIDwvbWVtYmVyPgorICAgICAgICAgICAgICAgIDxtZW1iZXI+CisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPkI8L2xpdGVyYWw+OiA8bGl0ZXJhbD5AUHJvZHVjZXMoIiovKiIpPC9saXRlcmFsPiB3aXRoIGdlbmVyaWMgdHlwZSA8bGl0ZXJhbD4mbHQ7TXlCZWFuJmd0OzwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICA8L21lbWJlcj4KKyAgICAgICAgICAgICAgICA8bWVtYmVyPgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5DPC9saXRlcmFsPjogPGxpdGVyYWw+QFByb2R1Y2VzKCJ0ZXh0L3BsYWluIik8L2xpdGVyYWw+IHdpdGggZ2VuZXJpYyB0eXBlCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPiZsdDtNeUJlYW4mZ3Q7PC9saXRlcmFsPgorICAgICAgICAgICAgICAgIDwvbWVtYmVyPgorICAgICAgICAgICAgICAgIDxtZW1iZXI+CisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPkQ8L2xpdGVyYWw+OiA8bGl0ZXJhbD5AUHJvZHVjZXMoImFwcGxpY2F0aW9uL3htbCIpPC9saXRlcmFsPiB3aXRoIGdlbmVyaWMgdHlwZQorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD4mbHQ7T2JqZWN0Jmd0OzwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICA8L21lbWJlcj4KKyAgICAgICAgICAgICAgICA8bWVtYmVyPgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5NeUJlYW5NZXNzYWdlQm9keVdyaXRlcjwvbGl0ZXJhbD46IDxsaXRlcmFsPkBQcm9kdWNlcygiYXBwbGljYXRpb24veG1sIik8L2xpdGVyYWw+IHdpdGggZ2VuZXJpYworICAgICAgICAgICAgICAgICAgICB0eXBlIDxsaXRlcmFsPiZsdDtNeUJlYW4mZ3Q7PC9saXRlcmFsPgorICAgICAgICAgICAgICAgIDwvbWVtYmVyPgorICAgICAgICAgICAgPC9zaW1wbGVsaXN0PgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhlIGFsZ29yaXRobSBleGVjdXRlZCBieSBhIEpBWC1SUyBydW50aW1lIHRvIHNlbGVjdCBhIHByb3BlciAmbGl0LmpheHJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsgaW1wbGVtZW50YXRpb24KKyAgICAgICAgICAgIGlzIGlsbHVzdHJhdGVkIGluIDx4cmVmIGxpbmtlbmQ9Im1idy53cml0ZXIuc2VsZWN0aW9uLmFsZ29yaXRobSIgLz4uCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHByb2NlZHVyZSB4bWw6aWQ9Im1idy53cml0ZXIuc2VsZWN0aW9uLmFsZ29yaXRobSI+CisgICAgICAgICAgICA8dGl0bGU+JmxpdC5qYXhycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7IFNlbGVjdGlvbiBBbGdvcml0aG08L3RpdGxlPgorICAgICAgICAgICAgPHN0ZXA+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIE9idGFpbiB0aGUgb2JqZWN0IHRoYXQgd2lsbCBiZSBtYXBwZWQgdG8gdGhlIG1lc3NhZ2UgZW50aXR5IGJvZHkuIEZvciBhIHJldHVybiB0eXBlIG9mIFJlc3BvbnNlCisgICAgICAgICAgICAgICAgICAgIG9yIHN1YmNsYXNzZXMsIHRoZSBvYmplY3QgaXMgdGhlIHZhbHVlIG9mIHRoZSBlbnRpdHkgcHJvcGVydHksIGZvciBvdGhlciByZXR1cm4gdHlwZXMgaXQgaXMgdGhlIHJldHVybmVkCisgICAgICAgICAgICAgICAgICAgIG9iamVjdC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFNvIGluIG91ciBjYXNlLCBmb3IgdGhlIHJlc291cmNlIG1ldGhvZCA8bGl0ZXJhbD5nZXRNeUJlYW48L2xpdGVyYWw+IHRoZSB0eXBlIHdpbGwKKyAgICAgICAgICAgICAgICAgICAgYmUgPGxpdGVyYWw+TXlCZWFuPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3N0ZXA+CisgICAgICAgICAgICA8c3RlcD4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgRGV0ZXJtaW5lIHRoZSBtZWRpYSB0eXBlIG9mIHRoZSByZXNwb25zZS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEluIG91ciBjYXNlLiBmb3IgcmVzb3VyY2UgbWV0aG9kIDxsaXRlcmFsPmdldE15QmVhbjwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGVkIHdpdGggPGxpdGVyYWw+QFByb2R1Y2VzKCJhcHBsaWNhdGlvbi94bWwiKTwvbGl0ZXJhbD4sIHRoZSBtZWRpYSB0eXBlIHdpbGwgYmUKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+ImFwcGxpY2F0aW9uL3htbCI8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvc3RlcD4KKyAgICAgICAgICAgIDxzdGVwPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBTZWxlY3QgdGhlIHNldCBvZiBNZXNzYWdlQm9keVdyaXRlciBwcm92aWRlcnMgdGhhdCBzdXBwb3J0IHRoZSBvYmplY3QgYW5kIG1lZGlhCisgICAgICAgICAgICAgICAgICAgIHR5cGUgb2YgdGhlIG1lc3NhZ2UgZW50aXR5IGJvZHkuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBJbiBvdXIgY2FzZSwgZm9yIGVudGl0eSBtZWRpYSB0eXBlIDxsaXRlcmFsPiJhcHBsaWNhdGlvbi94bWwiPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICBhbmQgdHlwZSA8bGl0ZXJhbD5NeUJlYW48L2xpdGVyYWw+LCB0aGUgYXBwcm9wcmlhdGUgJmxpdC5qYXhycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7IHdpbGwKKyAgICAgICAgICAgICAgICAgICAgYmUgdGhlIDxsaXRlcmFsPkE8L2xpdGVyYWw+LCA8bGl0ZXJhbD5CPC9saXRlcmFsPiwgPGxpdGVyYWw+RDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgYW5kIDxsaXRlcmFsPk15QmVhbk1lc3NhZ2VCb2R5V3JpdGVyPC9saXRlcmFsPi4gVGhlIHByb3ZpZGVyIDxsaXRlcmFsPkM8L2xpdGVyYWw+IGRvZXMKKyAgICAgICAgICAgICAgICAgICAgbm90IGRlZmluZSB0aGUgYXBwcm9wcmlhdGUKKyAgICAgICAgICAgICAgICAgICAgbWVkaWEgdHlwZS4gPGxpdGVyYWw+QTwvbGl0ZXJhbD4gYW5kIDxsaXRlcmFsPkI8L2xpdGVyYWw+IGFyZSBmaW5lIGFzCisgICAgICAgICAgICAgICAgICAgIHRoZWlyIHR5cGUgaXMgbW9yZSBnZW5lcmljIGFuZCBjb21wYXRpYmxlIHdpdGggPGxpdGVyYWw+ImFwcGxpY2F0aW9uL3htbCI8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvc3RlcD4KKyAgICAgICAgICAgIDxzdGVwIHhtbDppZD0ibWJ3LndyaXRlci5zZWxlY3Rpb24uYWxnb3JpdGhtLnNvcnRTdGVwIj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgU29ydCB0aGUgc2VsZWN0ZWQgTWVzc2FnZUJvZHlXcml0ZXIgcHJvdmlkZXJzIHdpdGggYSBwcmltYXJ5IGtleSBvZiBnZW5lcmljIHR5cGUgd2hlcmUgcHJvdmlkZXJzCisgICAgICAgICAgICAgICAgICAgIHdob3NlIGdlbmVyaWMgdHlwZSBpcyB0aGUgbmVhcmVzdCBzdXBlcmNsYXNzIG9mIHRoZSBvYmplY3QgY2xhc3MgYXJlIHNvcnRlZCBmaXJzdCBhbmQgYSBzZWNvbmRhcnkga2V5IG9mCisgICAgICAgICAgICAgICAgICAgIG1lZGlhIHR5cGUuIEFkZGl0aW9uYWxseSwgSkFYLVJTIHNwZWNpZmljYXRpb24gbWFuZGF0ZXMgdGhhdCBjdXN0b20sIHVzZXIgcmVnaXN0ZXJlZCBwcm92aWRlcnMgaGF2ZSB0bworICAgICAgICAgICAgICAgICAgICBiZSBzb3J0ZWQgYWhlYWQgb2YgZGVmYXVsdCBwcm92aWRlcnMgcHJvdmlkZWQgYnkgSkFYLVJTIGltcGxlbWVudGF0aW9uLiBUaGlzIGlzIHVzZWQgYXMgYSB0ZXJ0aWFyeQorICAgICAgICAgICAgICAgICAgICBjb21wYXJpc29uIGtleS4gVXNlciBwcm92aWRlcnMgYXJlIHBsYWNlcyBwcmlvciB0byBKZXJzZXkgaW50ZXJuYWwgcHJvdmlkZXJzIGluIHRvIHRoZSBmaW5hbCBvcmRlcmVkIGxpc3QuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUaGUgc29ydGVkIHByb3ZpZGVycyB3aWxsIGJlOiA8bGl0ZXJhbD5NeUJlYW5NZXNzYWdlQm9keVdyaXRlcjwvbGl0ZXJhbD4sCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPkI8L2xpdGVyYWw+LiA8bGl0ZXJhbD5EPC9saXRlcmFsPiwgPGxpdGVyYWw+QTwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zdGVwPgorICAgICAgICAgICAgPHN0ZXA+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEl0ZXJhdGUgdGhyb3VnaCB0aGUgc29ydGVkICZsaXQuamF4cnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOyBwcm92aWRlcnMgYW5kLCB1dGlsaXppbmcgdGhlCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmlzV3JpdGVhYmxlPC9saXRlcmFsPiBtZXRob2Qgb2YgZWFjaCB1bnRpbCB5b3UgZmluZCBhICZsaXQuamF4cnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOyB0aGF0CisgICAgICAgICAgICAgICAgICAgIHJldHVybnMgJmxpdC50cnVlOy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFRoZSBmaXJzdCBwcm92aWRlciBpbiB0aGUgbGlzdCAtIG91ciA8bGl0ZXJhbD5NeUJlYW5NZXNzYWdlQm9keVdyaXRlcjwvbGl0ZXJhbD4gcmV0dXJucyAmbGl0LnRydWU7IGFzCisgICAgICAgICAgICAgICAgICAgIGl0IGNvbXBhcmVzIHR5cGVzIGFuZCB0aGUgdHlwZXMgbWF0Y2hlcy4gSWYgaXQgd291bGQgcmV0dXJuICZsaXQuZmFsc2U7LCB0aGUgbmV4dCBwcm92aWRlcgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5CPC9saXRlcmFsPiB3b3VsZCBieSBjaGVjayBieSBpbnZva2luZyBpdHMgPGxpdGVyYWw+aXNXcml0ZWFibGU8L2xpdGVyYWw+IG1ldGhvZC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3N0ZXA+CisgICAgICAgICAgICA8c3RlcD4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgSWYgc3RlcCA1IGxvY2F0ZXMgYSBzdWl0YWJsZSAmbGl0LmpheHJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsgdGhlbiB1c2UgaXRzIHdyaXRlVG8gbWV0aG9kIHRvIG1hcCB0aGUKKyAgICAgICAgICAgICAgICAgICAgb2JqZWN0IHRvIHRoZSBlbnRpdHkgYm9keS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPk15QmVhbk1lc3NhZ2VCb2R5V3JpdGVyLndyaXRlVG88L2xpdGVyYWw+IHdpbGwgYmUgZXhlY3V0ZWQgYW5kIGl0IHdpbGwgc2VyaWFsaXplIHRoZQorICAgICAgICAgICAgICAgICAgICBlbnRpdHkuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxzdGVwYWx0ZXJuYXRpdmVzPgorICAgICAgICAgICAgICAgICAgICA8c3RlcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE90aGVyd2lzZSwgdGhlIHNlcnZlciBydW50aW1lIE1VU1QgZ2VuZXJhdGUgYSBnZW5lcmF0ZSBhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPkludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb248L2xpdGVyYWw+LCBhIHN1YmNsYXNzIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+V2ViQXBwbGljYXRpb25FeGNlcHRpb248L2xpdGVyYWw+IHdpdGggaXRzIHN0YXR1cyBzZXQgdG8gNTAwLCBhbmQgbm8gZW50aXR5IGFuZCB0aGUgY2xpZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZSBNVVNUIGdlbmVyYXRlIGEgPGxpdGVyYWw+UHJvY2Vzc2luZ0V4Y2VwdGlvbjwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXZSBoYXZlIHN1Y2Nlc3NmdWxseSBmb3VuZCBhIHByb3ZpZGVyLCB0aHVzIG5vIGV4Y2VwdGlvbiBpcyBnZW5lcmF0ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvc3RlcD4KKyAgICAgICAgICAgICAgICA8L3N0ZXBhbHRlcm5hdGl2ZXM+CisgICAgICAgICAgICA8L3N0ZXA+CisgICAgICAgIDwvcHJvY2VkdXJlPgorICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEpBWC1SUyAyLjAgaXMgaW5jb21wYXRpYmxlIHdpdGggSkFYLVJTIDEueCBpbiBvbmUgc3RlcCBvZiB0aGUgZW50aXR5IHByb3ZpZGVyIHNlbGVjdGlvbiBhbGdvcml0aG0uCisgICAgICAgICAgICAgICAgSkFYLVJTIDEueCBkZWZpbmVzIHNvcnRpbmcga2V5cyBwcmlvcml0aWVzIGluIHRoZSA8eHJlZiBsaW5rZW5kPSJtYncud3JpdGVyLnNlbGVjdGlvbi5hbGdvcml0aG0uc29ydFN0ZXAiIC8+CisgICAgICAgICAgICAgICAgaW4gZXhhY3RseSBvcHBvc2l0ZSBvcmRlci4gU28sIGluIEpBWC1SUyAxLnggdGhlIGtleXMgYXJlIGRlZmluZWQgaW4gdGhlIG9yZGVyOiBwcmltYXJ5IG1lZGlhIHR5cGUsCisgICAgICAgICAgICAgICAgc2Vjb25kYXJ5IHR5cGUgZGVjbGFyYXRpb24gZGlzdGFuY2Ugd2hlcmUgY3VzdG9tIHByb3ZpZGVycyBoYXZlIGFsd2F5cyBwcmVjZWRlbmNlIHRvIGludGVybmFsIHByb3ZpZGVycy4KKyAgICAgICAgICAgICAgICBJZiB5b3Ugd2FudCB0byBmb3JjZSBKZXJzZXkgdG8gdXNlIHRoZSBhbGdvcml0aG0gY29tcGF0aWJsZSB3aXRoIEpBWC1SUyAxLngsIHNldHVwIHRoZSBwcm9wZXJ0eQorICAgICAgICAgICAgICAgICh0byAmamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsgb3IgcmV0dXJuIGZyb20gJmpheHJzLmNvcmUuQXBwbGljYXRpb247IGZyb20gaXRzCisgICAgICAgICAgICAgICAgPGxpdGVyYWw+Z2V0UHJvcGVydGllczwvbGl0ZXJhbD4gbWV0aG9kKToKKworICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0idW5udW1iZXJlZCI+PCFbQ0RBVEFbamVyc2V5LmNvbmZpZy53b3JrZXJzLmxlZ2FjeU9yZGVyaW5nPXRydWVdXT48L3Byb2dyYW1saXN0aW5nPgorCisgICAgICAgICAgICAgICAgRG9jdW1lbnRhdGlvbiBvZiB0aGlzIHByb3BlcnR5IGNhbiBiZSBmb3VuZCBpbiB0aGUgamF2YWRvYyBvZiAmamVyc2V5Lm1lc3NhZ2UuTWVzc2FnZVByb3BlcnRpZXM7LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L25vdGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaGUgYWxnb3JpdGhtIGZvciBzZWxlY3Rpb24gb2YgJmxpdC5qYXhycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7IGlzIHNpbWlsYXIsIGluY2x1ZGluZyB0aGUgaW5jb21wYXRpYmlsaXR5CisgICAgICAgICAgICBiZXR3ZWVuIEpBWC1SUyAyLjAgYW5kIEpBWC1SUyAxLnggYW5kIHRoZSBwcm9wZXJ0eSB0byB3b3JrYXJvdW5kIGl0LiBUaGUgYWxnb3JpdGhtIGlzIGRlZmluZWQgYXMgZm9sbG93czoKKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cHJvY2VkdXJlIHhtbDppZD0ibWJ3LnJlYWRlci5zZWxlY3Rpb24uYWxnb3JpdGhtIj4KKyAgICAgICAgICAgIDx0aXRsZT4mbGl0LmpheHJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcjsgU2VsZWN0aW9uIEFsZ29yaXRobTwvdGl0bGU+CisgICAgICAgICAgICA8c3RlcD4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgT2J0YWluIHRoZSBtZWRpYSB0eXBlIG9mIHRoZSByZXF1ZXN0LiBJZiB0aGUgcmVxdWVzdCBkb2VzIG5vdCBjb250YWluIGEgPGxpdGVyYWw+Q29udGVudC1UeXBlPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICBoZWFkZXIgdGhlbiB1c2UgPGxpdGVyYWw+YXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtPC9saXRlcmFsPiBtZWRpYSB0eXBlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvc3RlcD4KKyAgICAgICAgICAgIDxzdGVwPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBJZGVudGlmeSB0aGUgSmF2YSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIgd2hvc2UgdmFsdWUgd2lsbCBiZSBtYXBwZWQgZnJvbSB0aGUgZW50aXR5IGJvZHkuIFRoZQorICAgICAgICAgICAgICAgICAgICBKYXZhIHR5cGUgb24gdGhlIHNlcnZlciBpcyB0aGUgdHlwZSBvZiB0aGUgZW50aXR5IHBhcmFtZXRlciBvZiB0aGUgcmVzb3VyY2UgbWV0aG9kLiBPbiB0aGUgY2xpZW50CisgICAgICAgICAgICAgICAgICAgIGl0IGlzIHRoZSA8bGl0ZXJhbD5DbGFzczwvbGl0ZXJhbD4gcGFzc2VkIHRvIDxsaXRlcmFsPnJlYWRGcm9tPC9saXRlcmFsPiBtZXRob2QuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zdGVwPgorICAgICAgICAgICAgPHN0ZXA+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFNlbGVjdCB0aGUgc2V0IG9mIGF2YWlsYWJsZSAmbGl0LmpheHJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcjsgcHJvdmlkZXJzIHRoYXQgc3VwcG9ydCB0aGUgbWVkaWEgdHlwZQorICAgICAgICAgICAgICAgICAgICBvZiB0aGUgcmVxdWVzdC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3N0ZXA+CisgICAgICAgICAgICA8c3RlcCB4bWw6aWQ9Im1idy5yZWFkZXIuc2VsZWN0aW9uLmFsZ29yaXRobS5zZWxlY3RTdGVwIj4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgSXRlcmF0ZSB0aHJvdWdoIHRoZSBzZWxlY3RlZCAmbGl0LmpheHJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcjsgY2xhc3NlcyBhbmQsIHV0aWxpemluZyB0aGVpcgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5pc1JlYWRhYmxlPC9saXRlcmFsPiBtZXRob2QsIGNob29zZSB0aGUgZmlyc3QgJmxpdC5qYXhycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7IHByb3ZpZGVyIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHMgdGhlIGRlc2lyZWQgY29tYmluYXRpb24gb2YgSmF2YSB0eXBlL21lZGlhIHR5cGUvYW5ub3RhdGlvbnMgcGFyYW1ldGVycy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3N0ZXA+CisgICAgICAgICAgICA8c3RlcD4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgSWYgPHhyZWYgbGlua2VuZD0ibWJ3LnJlYWRlci5zZWxlY3Rpb24uYWxnb3JpdGhtLnNlbGVjdFN0ZXAiIC8+IGxvY2F0ZXMgYSBzdWl0YWJsZQorICAgICAgICAgICAgICAgICAgICAmbGl0LmpheHJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcjssIHRoZW4gdXNlIGl0cyA8bGl0ZXJhbD5yZWFkRnJvbTwvbGl0ZXJhbD4gbWV0aG9kIHRvIG1hcCB0aGUgZW50aXR5CisgICAgICAgICAgICAgICAgICAgIGJvZHkgdG8gdGhlIGRlc2lyZWQgSmF2YSB0eXBlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8c3RlcGFsdGVybmF0aXZlcz4KKyAgICAgICAgICAgICAgICAgICAgPHN0ZXA+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdGhlcndpc2UsIHRoZSBzZXJ2ZXIgcnVudGltZSBNVVNUIGdlbmVyYXRlIGEgPGxpdGVyYWw+Tm90U3VwcG9ydGVkRXhjZXB0aW9uPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChIVFRQIDQxNSBzdGF0dXMgY29kZSkgYW5kIG5vIGVudGl0eSBhbmQgdGhlIGNsaWVudCBydW50aW1lIE1VU1QgZ2VuZXJhdGUgYW4gaW5zdGFuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiA8bGl0ZXJhbD5Qcm9jZXNzaW5nRXhjZXB0aW9uPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9zdGVwPgorICAgICAgICAgICAgICAgIDwvc3RlcGFsdGVybmF0aXZlcz4KKyAgICAgICAgICAgIDwvc3RlcD4KKyAgICAgICAgPC9wcm9jZWR1cmU+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24+CisgICAgICAgIDx0aXRsZT5KZXJzZXkgJmxpdC5qZXJzZXkubWVzc2FnZS5NZXNzYWdlQm9keVdvcmtlcnM7IEFQSTwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgSW4gY2FzZSB5b3UgbmVlZCB0byBkaXJlY3RseSB3b3JrIHdpdGggSkFYLVJTIGVudGl0eSBwcm92aWRlcnMsIGZvciBleGFtcGxlIHRvIHNlcmlhbGl6ZSBhbiBlbnRpdHkgaW4geW91ciByZXNvdXJjZQorICAgICAgICAgICAgbWV0aG9kLCBmaWx0ZXIgb3IgaW4gYSBjb21wb3NpdGUgZW50aXR5IHByb3ZpZGVyLCB5b3Ugd291bGQgbmVlZCB0byBwZXJmb3JtIHF1aXRlIGEgbG90IG9mIHN0ZXBzLgorICAgICAgICAgICAgWW91IHdvdWxkIG5lZWQgdG8gY2hvb3NlIHRoZSBhcHByb3ByaWF0ZSAmbGl0LmpheHJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsgYmFzZWQgb24gdGhlIHR5cGUsIG1lZGlhIHR5cGUgYW5kCisgICAgICAgICAgICBvdGhlciBwYXJhbWV0ZXJzLiBUaGVuIHlvdSB3b3VsZCBuZWVkIHRvIGluc3RhbnRpYXRlIGl0LCBjaGVjayBpdCBieSA8bGl0ZXJhbD5pc1dyaXRlYWJsZTwvbGl0ZXJhbD4gbWV0aG9kIGFuZAorICAgICAgICAgICAgYmFzaWNhbGx5IHBlcmZvcm0gYWxsIHRoZSBzdGVwcyB0aGF0IGFyZSBub3JtYWxseSBwZXJmb3JtZWQgYnkgSmVyc2V5CisgICAgICAgICAgICAoc2VlIDx4cmVmIGxpbmtlbmQ9Im1idy5yZWFkZXIuc2VsZWN0aW9uLmFsZ29yaXRobSIgLz4pLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVG8gcmVtb3ZlIHRoaXMgYnVyZGVuIGZyb20gZGV2ZWxvcGVycywgSmVyc2V5IGV4cG9zZXMgYSBwcm9wcmlldGFyeSBwdWJsaWMgQVBJIHRoYXQgc2ltcGxpZmllcyB0aGUgbWFuaXB1bGF0aW9uCisgICAgICAgICAgICBvZiBlbnRpdHkgcHJvdmlkZXJzLiBUaGUgQVBJIGlzIGRlZmluZWQgYnkgJmplcnNleS5tZXNzYWdlLk1lc3NhZ2VCb2R5V29ya2VyczsgaW50ZXJmYWNlIGFuZCBKZXJzZXkgcHJvdmlkZXMgYW4KKyAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIHRoYXQgY2FuIGJlIGluamVjdGVkIHVzaW5nIHRoZSAmamF4cnMuY29yZS5Db250ZXh0OyBpbmplY3Rpb24gYW5ub3RhdGlvbi4gVGhlIGludGVyZmFjZSBkZWNsYXJlcworICAgICAgICAgICAgbWV0aG9kcyBmb3Igc2VsZWN0aW9uIG9mIG1vc3QgYXBwcm9wcmlhdGUgJmxpdC5qYXhycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7IGFuZCAmbGl0LmpheHJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsKKyAgICAgICAgICAgIGJhc2VkIG9uIHRoZSBydWxlcyBkZWZpbmVkIGluIEpBWC1SUyBzcGVjLCBtZXRob2RzIGZvciB3cml0aW5nIGFuZCByZWFkaW5nIGVudGl0eSB0aGF0IGVuc3VyZSBwcm9wZXIgYW5kIHRpbWVseQorICAgICAgICAgICAgaW52b2NhdGlvbiBvZiBpbnRlcmNlcHRvcnMgYW5kIG90aGVyIHVzZWZ1bCBtZXRob2RzLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgU2VlIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBvZiB1c2FnZSBvZiAmbGl0LmplcnNleS5tZXNzYWdlLk1lc3NhZ2VCb2R5V29ya2VyczsuCisKKyAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgIDx0aXRsZT5Vc2FnZSBvZiBNZXNzYWdlQm9keVdvcmtlcnMgaW50ZXJmYWNlPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj48IVtDREFUQVtAUGF0aCgid29ya2VycyIpCitwdWJsaWMgc3RhdGljIGNsYXNzIFdvcmtlcnNSZXNvdXJjZSB7CisKKyAgICBAQ29udGV4dAorICAgIHByaXZhdGUgTWVzc2FnZUJvZHlXb3JrZXJzIHdvcmtlcnM7CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi94bWwiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TXlCZWFuQXNTdHJpbmcoKSB7CisKKyAgICAgICAgZmluYWwgTXlCZWFuIG15QmVhbiA9IG5ldyBNeUJlYW4oIkhlbGxvIFdvcmxkISIsIDQyKTsKKworICAgICAgICAvLyBidWZmZXIgaW50byB3aGljaCBteUJlYW4gd2lsbCBiZSBzZXJpYWxpemVkCisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCisgICAgICAgIC8vIGdldCBtb3N0IGFwcHJvcHJpYXRlIE1CVworICAgICAgICBmaW5hbCBNZXNzYWdlQm9keVdyaXRlcjxNeUJlYW4+IG1lc3NhZ2VCb2R5V3JpdGVyID0KKyAgICAgICAgICAgICAgICB3b3JrZXJzLmdldE1lc3NhZ2VCb2R5V3JpdGVyKE15QmVhbi5jbGFzcywgTXlCZWFuLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFubm90YXRpb25bXXt9LCBNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MX1RZUEUpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyB1c2UgdGhlIE1CVyB0byBzZXJpYWxpemUgbXlCZWFuIGludG8gYmFvcworICAgICAgICAgICAgbWVzc2FnZUJvZHlXcml0ZXIud3JpdGVUbyhteUJlYW4sCisgICAgICAgICAgICAgICAgTXlCZWFuLmNsYXNzLCBNeUJlYW4uY2xhc3MsIG5ldyBBbm5vdGF0aW9uW10ge30sCisgICAgICAgICAgICAgICAgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTF9UWVBFLCBuZXcgTXVsdGl2YWx1ZWRIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpLAorICAgICAgICAgICAgICAgIGJhb3MpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiRXJyb3Igd2hpbGUgc2VyaWFsaXppbmcgTXlCZWFuLiIsIGUpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHN0cmluZ1htbE91dHB1dCA9IGJhb3MudG9TdHJpbmcoKTsKKyAgICAgICAgLy8gc3RyaW5nWG1sT3V0cHV0IG5vdyBjb250YWlucyBYTUwgcmVwcmVzZW50YXRpb246CisgICAgICAgIC8vICI8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+CisgICAgICAgIC8vIDxteUJlYW4+PGFueVN0cmluZz5IZWxsbyBXb3JsZCE8L2FueVN0cmluZz4KKyAgICAgICAgLy8gPGFueU51bWJlcj40MjwvYW55TnVtYmVyPjwvbXlCZWFuPiIKKworICAgICAgICByZXR1cm4gc3RyaW5nWG1sT3V0cHV0OworICAgIH0KK31dXT48L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgSW4gdGhlIGV4YW1wbGUgYSByZXNvdXJjZSBpbmplY3RzICZsaXQuamVyc2V5Lm1lc3NhZ2UuTWVzc2FnZUJvZHlXb3JrZXJzOyBhbmQgdXNlcyBpdCBmb3Igc2VsZWN0aW9uCisgICAgICAgICAgICBvZiB0aGUgbW9zdCBhcHByb3ByaWF0ZSAmbGl0LmpheHJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsuIFRoZW4gdGhlIHdyaXRlciBpcyB1dGlsaXplZCB0byBzZXJpYWxpemUgdGhlIGVudGl0eQorICAgICAgICAgICAgaW50byB0aGUgYnVmZmVyIGFzIFhNTCBkb2N1bWVudC4gVGhlIDxsaXRlcmFsPlN0cmluZzwvbGl0ZXJhbD4gY29udGVudCBvZiB0aGUgYnVmZmVyIGlzIHRoZW4gcmV0dXJuZWQuCisgICAgICAgICAgICBUaGlzIHdpbGwgY2F1c2UgdGhhdCBKZXJzZXkgd2lsbCBub3QgdXNlIDxsaXRlcmFsPk15QmVhbk1lc3NhZ2VCb2R5V3JpdGVyPC9saXRlcmFsPgorICAgICAgICAgICAgdG8gc2VyaWFsaXplIHRoZSBlbnRpdHkgYXMgaXQgaXMgYWxyZWFkeSBpbiB0aGUgPGxpdGVyYWw+U3RyaW5nPC9saXRlcmFsPiB0eXBlCisgICAgICAgICAgICAoPGxpdGVyYWw+TXlCZWFuTWVzc2FnZUJvZHlXcml0ZXI8L2xpdGVyYWw+IGRvZXMgbm90IHN1cHBvcnQgPGxpdGVyYWw+U3RyaW5nPC9saXRlcmFsPikuIEluc3RlYWQsIGEgc2ltcGxlCisgICAgICAgICAgICA8bGl0ZXJhbD5TdHJpbmc8L2xpdGVyYWw+LWJhc2VkICAmbGl0LmpheHJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsgd2lsbCBiZSBjaG9zZW4gYW5kIGl0IHdpbGwgb25seSBzZXJpYWxpemUgdGhlCisgICAgICAgICAgICA8bGl0ZXJhbD5TdHJpbmc8L2xpdGVyYWw+IHdpdGggWE1MIHRvIHRoZSBvdXRwdXQgZW50aXR5IHN0cmVhbSBieSB3cml0aW5nIG91dCB0aGUgYnl0ZXMgb2YgdGhlCisgICAgICAgICAgICA8bGl0ZXJhbD5TdHJpbmc8L2xpdGVyYWw+LgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgT2YgY291cnNlLCB0aGUgY29kZSBpbiB0aGUgZXhhbXBsZSBkb2VzIG5vdCBicmluZyBhbnkgYmVuZWZpdCBhcyB0aGUgZW50aXR5IGNvdWxkCisgICAgICAgICAgICBoYXZlIGJlZW4gc2VyaWFsaXplZCBieSA8bGl0ZXJhbD5NeUJlYW5NZXNzYWdlQm9keVdyaXRlcjwvbGl0ZXJhbD4gYnkgSmVyc2V5IGFzIGluIHByZXZpb3VzIGV4YW1wbGVzOworICAgICAgICAgICAgdGhlIHB1cnBvc2Ugb2YgdGhlIGV4YW1wbGUgd2FzIHRvIHNob3cgaG93IHRvIHVzZSAmbGl0LmplcnNleS5tZXNzYWdlLk1lc3NhZ2VCb2R5V29ya2VyczsgaW4gYSByZXNvdXJjZSBtZXRob2QuCisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbj4KKyAgICAgICAgPHRpdGxlPkRlZmF1bHQgSmVyc2V5IEVudGl0eSBQcm92aWRlcnM8L3RpdGxlPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgSmVyc2V5IGludGVybmFsbHkgY29udGFpbnMgZW50aXR5IHByb3ZpZGVycyBmb3IgdGhlc2UgdHlwZXMgd2l0aCBjb21iaW5hdGlvbiBvZiBtZWRpYSB0eXBlcyAoaW4gYnJhY2tldHMpOgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxzaW1wbGVsaXN0PgorICAgICAgICAgICAgPG1lbWJlcj4KKyAgICAgICAgICAgICAgICA8bGl0ZXJhbD5ieXRlW108L2xpdGVyYWw+ICg8bGl0ZXJhbD4qLyo8L2xpdGVyYWw+KQorICAgICAgICAgICAgPC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPgorICAgICAgICAgICAgICAgICZqZGs2LlN0cmluZzsgKDxsaXRlcmFsPiovKjwvbGl0ZXJhbD4pCisgICAgICAgICAgICA8L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+CisgICAgICAgICAgICAgICAgJmpkazYuSW5wdXRTdHJlYW07ICg8bGl0ZXJhbD4qLyo8L2xpdGVyYWw+KQorICAgICAgICAgICAgPC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPgorICAgICAgICAgICAgICAgICZqZGs2LlJlYWRlcjsgKDxsaXRlcmFsPiovKjwvbGl0ZXJhbD4pCisgICAgICAgICAgICA8L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+CisgICAgICAgICAgICAgICAgJmpkazYuRmlsZTsgKDxsaXRlcmFsPiovKjwvbGl0ZXJhbD4pCisgICAgICAgICAgICA8L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+CisgICAgICAgICAgICAgICAgJmpkazYuRGF0YVNvdXJjZTsgKDxsaXRlcmFsPiovKjwvbGl0ZXJhbD4pCisgICAgICAgICAgICA8L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+CisgICAgICAgICAgICAgICAgJmpkazYuU291cmNlOyAoPGxpdGVyYWw+dGV4dC94bWw8L2xpdGVyYWw+LCA8bGl0ZXJhbD5hcHBsaWNhdGlvbi94bWw8L2xpdGVyYWw+IGFuZCBtZWRpYSB0eXBlcyBvZiB0aGUgZm9ybQorICAgICAgICAgICAgICAgIDxsaXRlcmFsPmFwcGxpY2F0aW9uLyoreG1sPC9saXRlcmFsPikKKyAgICAgICAgICAgIDwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj4KKyAgICAgICAgICAgICAgICAmamRrNi5KQVhCRWxlbWVudDsgKDxsaXRlcmFsPnRleHQveG1sPC9saXRlcmFsPiwgPGxpdGVyYWw+YXBwbGljYXRpb24veG1sPC9saXRlcmFsPiBhbmQgbWVkaWEgdHlwZXMgb2YgdGhlIGZvcm0KKyAgICAgICAgICAgICAgICA8bGl0ZXJhbD5hcHBsaWNhdGlvbi8qK3htbDwvbGl0ZXJhbD4pCisgICAgICAgICAgICA8L21lbWJlcj4KKyAgICAgICAgICAgIDxtZW1iZXI+CisgICAgICAgICAgICAgICAgJmpheHJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7ICg8bGl0ZXJhbD5hcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ8L2xpdGVyYWw+KQorICAgICAgICAgICAgPC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPgorICAgICAgICAgICAgICAgICZqYXhycy5jb3JlLkZvcm07ICg8bGl0ZXJhbD5hcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ8L2xpdGVyYWw+KQorICAgICAgICAgICAgPC9tZW1iZXI+CisgICAgICAgICAgICA8bWVtYmVyPgorICAgICAgICAgICAgICAgICZqYXhycy5jb3JlLlN0cmVhbWluZ091dHB1dDsgKCg8bGl0ZXJhbD4qLyo8L2xpdGVyYWw+KSkgLSB0aGlzIGNsYXNzIGNhbiBiZSB1c2VkIGFzIGFuIGxpZ2h0d2VpZ2h0CisgICAgICAgICAgICAgICAgJmxpdC5qYXhycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7IHRoYXQgY2FuIGJlIHJldHVybmVkIGZyb20gYSByZXNvdXJjZSBtZXRob2QKKyAgICAgICAgICAgIDwvbWVtYmVyPgorICAgICAgICAgICAgPG1lbWJlcj4KKyAgICAgICAgICAgICAgICAmamRrNi5Cb29sZWFuOywgJmpkazYuQ2hhcmFjdGVyOyBhbmQgJmpkazYuTnVtYmVyOyAoPGxpdGVyYWw+dGV4dC9wbGFpbjwvbGl0ZXJhbD4pIC0gY29ycmVzcG9uZGluZworICAgICAgICAgICAgICAgIHByaW1pdGl2ZSB0eXBlcyBzdXBwb3J0ZWQgdmlhIGJveGluZy91bmJveGluZyBjb252ZXJzaW9uCisgICAgICAgICAgICA8L21lbWJlcj4KKyAgICAgICAgPC9zaW1wbGVsaXN0PgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEZvciBvdGhlciBtZWRpYSB0eXBlIHN1cHBvcnRlZCBpbiBqZXJzZXkgcGxlYXNlIHNlZSB0aGUgPHhyZWYgbGlua2VuZD0ibWVkaWEiIC8+IHdoaWNoIGRlc2NyaWJlcworICAgICAgICAgICAgYWRkaXRpb25hbCBKZXJzZXkgZW50aXR5IHByb3ZpZGVyIGV4dGVuc2lvbnMgZm9yIHNlcmlhbGl6YXRpb24gdG8gSlNPTiwgWE1MLCBzZXJpYWxpemF0aW9uIG9mIGNvbGxlY3Rpb25zLAorICAgICAgICAgICAgJmplcnNleS5tZWRpYS5tdWx0aXBhcnQ7IGFuZCBvdGhlcnMuCisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+Cis8L2NoYXB0ZXI+CmRpZmYgLS1naXQgYS9kb2NzL3NyYy9tYWluL2RvY2Jvb2svbWVkaWEueG1sIGIvZG9jcy9zcmMvbWFpbi9kb2Nib29rL21lZGlhLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTg0YjkyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9zcmMvbWFpbi9kb2Nib29rL21lZGlhLnhtbApAQCAtMCwwICsxLDE3ODggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgc3RhbmRhbG9uZT0ibm8iPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8IURPQ1RZUEUgY2hhcHRlciBbCisgICAgICAgIDwhRU5USVRZIGxpbmsubW94eSAiPGxpbmsgbGlua2VuZD0nanNvbi5tb3h5Jz5NT1h5PC9saW5rPiIgPgorICAgICAgICA8IUVOVElUWSBsaW5rLmpzb24tcCAiPGxpbmsgbGlua2VuZD0nanNvbi5qc29uLXAnPkphdmEgQVBJIGZvciBKU09OIFByb2Nlc3NpbmcgKEpTT04tUCk8L2xpbms+IiA+CisgICAgICAgIDwhRU5USVRZIGxpbmsuamFja3NvbiAiPGxpbmsgbGlua2VuZD0nanNvbi5qYWNrc29uJz5KYWNrc29uPC9saW5rPiIgPgorICAgICAgICA8IUVOVElUWSBsaW5rLmpldHRpc29uICI8bGluayBsaW5rZW5kPSdqc29uLmpldHRpc29uJz5KZXR0aXNvbjwvbGluaz4iID4KKworICAgICAgICA8IUVOVElUWSAlIGVudHMgU1lTVEVNICJqZXJzZXkuZW50IiA+ICVlbnRzOworXT4KKzxjaGFwdGVyIHhtbG5zPSJodHRwOi8vZG9jYm9vay5vcmcvbnMvZG9jYm9vayIKKyAgICAgICAgIHZlcnNpb249IjUuMCIKKyAgICAgICAgIHhtbDpsYW5nPSJlbiIKKyAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKKyAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2RvY2Jvb2sub3JnL25zL2RvY2Jvb2sgaHR0cDovL2RvY2Jvb2sub3JnL3htbC81LjAveHNkL2RvY2Jvb2sueHNkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsgaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluay54c2QiCisgICAgICAgICB4bWw6aWQ9Im1lZGlhIj4KKworICAgIDx0aXRsZT5TdXBwb3J0IGZvciBDb21tb24gTWVkaWEgVHlwZSBSZXByZXNlbnRhdGlvbnM8L3RpdGxlPgorCisgICAgPHNlY3Rpb24geG1sOmlkPSJqc29uIj4KKyAgICAgICAgPHRpdGxlPkpTT048L3RpdGxlPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgSmVyc2V5IEpTT04gc3VwcG9ydCBjb21lcyBhcyBhIHNldCBvZiBleHRlbnNpb24gbW9kdWxlcyB3aGVyZSBlYWNoIG9mIHRoZXNlIG1vZHVsZXMgY29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gb2YKKyAgICAgICAgICAgIGEgJmpheHJzLmNvcmUuRmVhdHVyZTsgdGhhdCBuZWVkcyB0byBiZSByZWdpc3RlcmVkIGludG8geW91ciAmamF4cnMuY29yZS5Db25maWd1cmFibGU7IGluc3RhbmNlIChjbGllbnQvc2VydmVyKS4KKyAgICAgICAgICAgIFRoZXJlIGFyZSBtdWx0aXBsZSBmcmFtZXdvcmtzIHRoYXQgcHJvdmlkZSBzdXBwb3J0IGZvciBKU09OIHByb2Nlc3NpbmcgYW5kL29yIEpTT04tdG8tSmF2YSBiaW5kaW5nLgorICAgICAgICAgICAgVGhlIG1vZHVsZXMgbGlzdGVkIGJlbG93IHByb3ZpZGUgc3VwcG9ydCBmb3IgSlNPTiByZXByZXNlbnRhdGlvbnMgYnkgaW50ZWdyYXRpbmcgdGhlIGluZGl2aWR1YWwgSlNPTiBmcmFtZXdvcmtzIGludG8KKyAgICAgICAgICAgIEplcnNleS4gQXQgcHJlc2VudCwgSmVyc2V5IGludGVncmF0ZXMgd2l0aCB0aGUgZm9sbG93aW5nIG1vZHVsZXMgdG8gcHJvdmlkZSBKU09OIHN1cHBvcnQ6CisKKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICZsaW5rLm1veHk7IC0gSlNPTiBiaW5kaW5nIHN1cHBvcnQgdmlhIE1PWHkgaXMgYSBkZWZhdWx0IGFuZCBwcmVmZXJyZWQgd2F5IG9mIHN1cHBvcnRpbmcgSlNPTiBiaW5kaW5nCisgICAgICAgICAgICAgICAgICAgICAgICBpbiB5b3VyIEplcnNleSBhcHBsaWNhdGlvbnMgc2luY2UgSmVyc2V5IDIuMC4gV2hlbiBKU09OIE1PWHkgbW9kdWxlIGlzIG9uIHRoZSBjbGFzcy1wYXRoLCBKZXJzZXkgd2lsbAorICAgICAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSBkaXNjb3ZlciB0aGUgbW9kdWxlIGFuZCBzZWFtbGVzc2x5IGVuYWJsZSBKU09OIGJpbmRpbmcgc3VwcG9ydCB2aWEgTU9YeSBpbiB5b3VyCisgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbnMuIChTZWUgPHhyZWYgbGlua2VuZD0iZGVwbG95bWVudC5hdXRvZGlzY292ZXJhYmxlIiAvPi4pCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+JmxpbmsuanNvbi1wOzwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+JmxpbmsuamFja3Nvbjs8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPiZsaW5rLmpldHRpc29uOzwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8c2VjdGlvbj4KKyAgICAgICAgICAgIDx0aXRsZT5BcHByb2FjaGVzIHRvIEpTT04gU3VwcG9ydDwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEVhY2ggb2YgdGhlIGFmb3JlbWVudGlvbmVkIGV4dGVuc2lvbiBtb2R1bGVzIHVzZXMgb25lIG9yIG1vcmUgb2YgdGhlIHRocmVlIGJhc2ljIGFwcHJvYWNoZXMgYXZhaWxhYmxlIHdoZW4KKyAgICAgICAgICAgICAgICB3b3JraW5nIHdpdGggSlNPTiByZXByZXNlbnRhdGlvbnM6CisKKyAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT5QT0pPIGJhc2VkIEpTT04gYmluZGluZyBzdXBwb3J0PC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT5KQVhCIGJhc2VkIEpTT04gYmluZGluZyBzdXBwb3J0PC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT5Mb3ctbGV2ZWwgSlNPTiBwYXJzaW5nICZhbXA7IHByb2Nlc3Npbmcgc3VwcG9ydDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKworICAgICAgICAgICAgICAgIFRoZSBmaXJzdCBtZXRob2QgaXMgcHJldHR5IGdlbmVyaWMgYW5kIGFsbG93cyB5b3UgdG8gbWFwIGFueSBKYXZhIE9iamVjdCB0byBKU09OIGFuZCB2aWNlIHZlcnNhLgorICAgICAgICAgICAgICAgIFRoZSBvdGhlciB0d28gYXBwcm9hY2hlcyBsaW1pdCB5b3UgaW4gSmF2YSB0eXBlcyB5b3VyIHJlc291cmNlIG1ldGhvZHMgY291bGQgcHJvZHVjZSBhbmQvb3IgY29uc3VtZS4KKyAgICAgICAgICAgICAgICBKQVhCIGJhc2VkIGFwcHJvYWNoIGlzIHVzZWZ1bCBpZiB5b3UgcGxhbiB0byB1dGlsaXplIGNlcnRhaW4gSkFYQiBmZWF0dXJlcyBhbmQgc3VwcG9ydCBib3RoIFhNTCBhbmQgSlNPTgorICAgICAgICAgICAgICAgIHJlcHJlc2VudGF0aW9ucy4gVGhlIGxhc3QsIGxvdy1sZXZlbCwgYXBwcm9hY2ggZ2l2ZXMgeW91IHRoZSBiZXN0IGZpbmUtZ3JhaW5lZCBjb250cm9sIG92ZXIgdGhlIG91dC1jb21pbmcKKyAgICAgICAgICAgICAgICBKU09OIGRhdGEgZm9ybWF0LgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8c2VjdGlvbiB4bWw6aWQ9Impzb24tcG9qbyI+CisgICAgICAgICAgICAgICAgPHRpdGxlPlBPSk8gc3VwcG9ydDwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICA8cGFyYT5QT0pPIHN1cHBvcnQgcmVwcmVzZW50cyB0aGUgZWFzaWVzdCB3YXkgdG8gY29udmVydCB5b3VyIEphdmEgT2JqZWN0cyB0byBKU09OIGFuZCBiYWNrLjwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT5NZWRpYSBtb2R1bGVzIHRoYXQgc3VwcG9ydCB0aGlzIGFwcHJvYWNoIGFyZSAmbGluay5tb3h5OyBhbmQgJmxpbmsuamFja3Nvbjs8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgICAgIDxzZWN0aW9uIHhtbDppZD0ianNvbi1qYXhiIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+SkFYQiBiYXNlZCBKU09OIHN1cHBvcnQ8L3RpdGxlPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFRha2luZyB0aGlzIGFwcHJvYWNoIHdpbGwgc2F2ZSB5b3UgYSBsb3Qgb2YgdGltZSwgaWYgeW91IHdhbnQgdG8gZWFzaWx5IHByb2R1Y2UvY29uc3VtZSBib3RoIEpTT04gYW5kIFhNTAorICAgICAgICAgICAgICAgICAgICBkYXRhIGZvcm1hdC4gV2l0aCBKQVhCIGJlYW5zIHlvdSB3aWxsIGJlIGFibGUgdG8gdXNlIHRoZSBzYW1lIEphdmEgbW9kZWwgdG8gZ2VuZXJhdGUgSlNPTiBhcyB3ZWxsIGFzIFhNTAorICAgICAgICAgICAgICAgICAgICByZXByZXNlbnRhdGlvbnMuCisgICAgICAgICAgICAgICAgICAgIEFub3RoZXIgYWR2YW50YWdlIGlzIHNpbXBsaWNpdHkgb2Ygd29ya2luZyB3aXRoIHN1Y2ggYSBtb2RlbCBhbmQgYXZhaWxhYmlsaXR5IG9mIHRoZSBBUEkgaW4gSmF2YSBTRSBQbGF0Zm9ybS4KKyAgICAgICAgICAgICAgICAgICAgSkFYQiBsZXZlcmFnZXMgYW5ub3RhdGVkIFBPSk9zIGFuZCB0aGVzZSBjb3VsZCBiZSBoYW5kbGVkIGFzIHNpbXBsZSBKYXZhIGJlYW5zLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgQSBkaXNhZHZhbnRhZ2Ugb2YgSkFYQiBiYXNlZCBhcHByb2FjaCBjb3VsZCBiZSBpZiB5b3UgbmVlZCB0byB3b3JrIHdpdGggYSB2ZXJ5IHNwZWNpZmljIEpTT04gZm9ybWF0LiBUaGVuIGl0CisgICAgICAgICAgICAgICAgICAgIG1pZ2h0IGJlIGRpZmZpY3VsdCB0byBmaW5kIGEgcHJvcGVyIHdheSB0byBnZXQgc3VjaCBhIGZvcm1hdCBwcm9kdWNlZCBhbmQgY29uc3VtZWQuIFRoaXMgaXMgYSByZWFzb24gd2h5IGEKKyAgICAgICAgICAgICAgICAgICAgbG90IG9mIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgcHJvdmlkZWQsIHNvIHRoYXQgeW91IGNhbiBjb250cm9sIGhvdyBKQVhCIGJlYW5zIGdldCBzZXJpYWxpemVkIGFuZAorICAgICAgICAgICAgICAgICAgICBkZS1zZXJpYWxpemVkLiBUaGUgZXh0cmEgY29uZmlndXJhdGlvbiBvcHRpb25zIGhvd2V2ZXIgcmVxdWlyZXMgeW91IHRvIGxlYXJuIG1vcmUgZGV0YWlscyBhYm91dCB0aGUgZnJhbWV3b3JrCisgICAgICAgICAgICAgICAgICAgIHlvdSBhcmUgdXNpbmcuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEZvbGxvd2luZyBpcyBhIHZlcnkgc2ltcGxlIGV4YW1wbGUgb2YgaG93IGEgSkFYQiBiZWFuIGNvdWxkIGxvb2sgbGlrZS4KKworICAgICAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5TaW1wbGUgSkFYQiBiZWFuIGltcGxlbWVudGF0aW9uPC90aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPkBYbWxSb290RWxlbWVudAorcHVibGljIGNsYXNzIE15SmF4YkJlYW4geworICAgIHB1YmxpYyBTdHJpbmcgbmFtZTsKKyAgICBwdWJsaWMgaW50IGFnZTsKKworICAgIHB1YmxpYyBNeUpheGJCZWFuKCkge30gLy8gSkFYQiBuZWVkcyB0aGlzCisKKyAgICBwdWJsaWMgTXlKYXhiQmVhbihTdHJpbmcgbmFtZSwgaW50IGFnZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLmFnZSA9IGFnZTsKKyAgICB9Cit9PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorCisgICAgICAgICAgICAgICAgICAgIFVzaW5nIHRoZSBhYm92ZSBKQVhCIGJlYW4gZm9yIHByb2R1Y2luZyBKU09OIGRhdGEgZm9ybWF0IGZyb20geW91IHJlc291cmNlIG1ldGhvZCwgaXMgdGhlbiBhcyBzaW1wbGUgYXM6CisKKyAgICAgICAgICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGl0bGU+SkFYQiBiZWFuIHVzZWQgdG8gZ2VuZXJhdGUgSlNPTiByZXByZXNlbnRhdGlvbjwvdGl0bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5AR0VUCitAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2pzb24iKQorcHVibGljIE15SmF4YkJlYW4gZ2V0TXlCZWFuKCkgeworICAgIHJldHVybiBuZXcgTXlKYXhiQmVhbigiQWdhbWVtbm9uIiwgMzIpOworfTwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKworICAgICAgICAgICAgICAgICAgICBOb3RpY2UsIHRoYXQgSlNPTiBzcGVjaWZpYyBtaW1lIHR5cGUgaXMgc3BlY2lmaWVkIGluICZsaXQuamF4cnMuUHJvZHVjZXM7IGFubm90YXRpb24sIGFuZCB0aGUgbWV0aG9kIHJldHVybnMKKyAgICAgICAgICAgICAgICAgICAgYW4gaW5zdGFuY2Ugb2YgPGxpdGVyYWw+TXlKYXhiQmVhbjwvbGl0ZXJhbD4sIHdoaWNoIEpBWEIgaXMgYWJsZSB0byBwcm9jZXNzLiBSZXN1bHRpbmcgSlNPTiBpbiB0aGlzIGNhc2UKKyAgICAgICAgICAgICAgICAgICAgd291bGQgbG9vayBsaWtlOgorCisgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0idGV4dCIgbGluZW51bWJlcmluZz0idW5udW1iZXJlZCI+eyJuYW1lIjoiQWdhbWVtbm9uIiwgImFnZSI6IjMyIn08L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgQSBwcm9wZXIgdXNlIG9mIEpBWEIgYW5ub3RhdGlvbnMgaXRzZWxmIGVuYWJsZXMgeW91IHRvIGNvbnRyb2wgb3V0cHV0IEpTT04gZm9ybWF0IHRvIGNlcnRhaW4gZXh0ZW50LgorICAgICAgICAgICAgICAgICAgICBTcGVjaWZpY2FsbHksIHJlbmFtaW5nIGFuZCBvbWl0dGluZyBpdGVtcyBpcyBlYXN5IHRvIGRvIGRpcmVjdGx5IGp1c3QgYnkgdXNpbmcgSkFYQiBhbm5vdGF0aW9ucy4KKyAgICAgICAgICAgICAgICAgICAgRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZXBpY3RzIGNoYW5nZXMgaW4gdGhlIGFib3ZlIG1lbnRpb25lZCBNeUpheGJCZWFuIHRoYXQgd2lsbCByZXN1bHQgaW4KKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+eyJraW5nIjoiQWdhbWVtbm9uIn08L2xpdGVyYWw+IEpTT04gb3V0cHV0LgorCisgICAgICAgICAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRpdGxlPlR3ZWFraW5nIEpTT04gZm9ybWF0IHVzaW5nIEpBWEI8L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+QFhtbFJvb3RFbGVtZW50CitwdWJsaWMgY2xhc3MgTXlKYXhiQmVhbiB7CisKKyAgICBAWG1sRWxlbWVudChuYW1lPSJraW5nIikKKyAgICBwdWJsaWMgU3RyaW5nIG5hbWU7CisKKyAgICBAWG1sVHJhbnNpZW50CisgICAgcHVibGljIGludCBhZ2U7CisKKyAgICAvLyBzZXZlcmFsIGxpbmVzIHJlbW92ZWQKK308L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPHBhcmE+TWVkaWEgbW9kdWxlcyB0aGF0IHN1cHBvcnQgdGhpcyBhcHByb2FjaCBhcmUgJmxpbmsubW94eTssICZsaW5rLmphY2tzb247LCAmbGluay5qZXR0aXNvbjs8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgICAgIDxzZWN0aW9uIHhtbDppZD0ianNvbi1sb3dsZXZlbCI+CisgICAgICAgICAgICAgICAgPHRpdGxlPkxvdy1sZXZlbCBiYXNlZCBKU09OIHN1cHBvcnQ8L3RpdGxlPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEpTT04gUHJvY2Vzc2luZyBBUEkgaXMgYSBuZXcgc3RhbmRhcmQgQVBJIGZvciBwYXJzaW5nIGFuZCBwcm9jZXNzaW5nIEpTT04gc3RydWN0dXJlcyBpbiBzaW1pbGFyIHdheSB0byB3aGF0CisgICAgICAgICAgICAgICAgICAgIFNBWCBhbmQgU3RBWCBwYXJzZXJzIHByb3ZpZGUgZm9yIFhNTC4gVGhlIEFQSSBpcyBwYXJ0IG9mIEphdmEgRUUgNyBhbmQgbGF0ZXIuIEFub3RoZXIgc3VjaCBKU09OCisgICAgICAgICAgICAgICAgICAgIHBhcnNpbmcvcHJvY2Vzc2luZyBBUEkgaXMgcHJvdmlkZWQgYnkgSmV0dGlzb24gZnJhbWV3b3JrLiBCb3RoIEFQSXMgcHJvdmlkZSBhIGxvdy1sZXZlbCBhY2Nlc3MgdG8gcHJvZHVjaW5nCisgICAgICAgICAgICAgICAgICAgIGFuZCBjb25zdW1pbmcgSlNPTiBkYXRhIHN0cnVjdHVyZXMuIEJ5IGFkb3B0aW5nIHRoaXMgbG93LWxldmVsIGFwcHJvYWNoIHlvdSB3b3VsZCBiZSB3b3JraW5nIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+SnNvbk9iamVjdDwvbGl0ZXJhbD4gKG9yIDxsaXRlcmFsPkpTT05PYmplY3Q8L2xpdGVyYWw+IHJlc3BlY3RpdmVseSkgYW5kL29yCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPkpzb25BcnJheTwvbGl0ZXJhbD4gKG9yIDxsaXRlcmFsPkpTT05BcnJheTwvbGl0ZXJhbD4gcmVzcGVjdGl2ZWx5KSBjbGFzc2VzIHdoZW4gcHJvY2Vzc2luZyB5b3VyCisgICAgICAgICAgICAgICAgICAgIEpTT04gZGF0YSByZXByZXNlbnRhdGlvbnMuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFRoZSBiaWdnZXN0IGFkdmFudGFnZSBvZiB0aGVzZSBsb3ctbGV2ZWwgQVBJcyBpcyB0aGF0IHlvdSB3aWxsIGdhaW4gZnVsbCBjb250cm9sIG92ZXIgdGhlIEpTT04gZm9ybWF0CisgICAgICAgICAgICAgICAgICAgIHByb2R1Y2VkIGFuZCBjb25zdW1lZC4gWW91IHdpbGwgYWxzbyBiZSBhYmxlIHRvIHByb2R1Y2UgYW5kIGNvbnN1bWUgdmVyeSBsYXJnZSBKU09OIHN0cnVjdHVyZXMgdXNpbmcKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtaW5nIEpTT04gcGFyc2VyL2dlbmVyYXRvciBBUElzLgorICAgICAgICAgICAgICAgICAgICBPbiB0aGUgb3RoZXIgaGFuZCwgZGVhbGluZyB3aXRoIHlvdXIgZGF0YSBtb2RlbCBvYmplY3RzIHdpbGwgcHJvYmFibHkgYmUgYSBsb3QgbW9yZSBjb21wbGV4LCBjb21wYXJlZAorICAgICAgICAgICAgICAgICAgICB0byB0aGUgUE9KTyBvciBKQVhCIGJhc2VkIGJpbmRpbmcgYXBwcm9hY2guIERpZmZlcmVuY2VzIGFyZSBkZXBpY3RlZCBhdCB0aGUgZm9sbG93aW5nIGNvZGUgc25pcHBldHMuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIExldCdzIHN0YXJ0IHdpdGggSkFYQi1iYXNlZCBhcHByb2FjaC4KKworICAgICAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5KQVhCIGJlYW4gY3JlYXRpb248L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+TXlKYXhiQmVhbiBteUJlYW4gPSBuZXcgTXlKYXhiQmVhbigiQWdhbWVtbm9uIiwgMzIpOzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKworICAgICAgICAgICAgICAgICAgICBBYm92ZSB5b3UgY29uc3RydWN0IGEgc2ltcGxlIEpBWEIgYmVhbiwgd2hpY2ggY291bGQgYmUgd3JpdHRlbiBpbiBKU09OIGFzCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPnsibmFtZSI6IkFnYW1lbW5vbiIsICJhZ2UiOjMyfTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgTm93IHRvIGJ1aWxkIGFuIGVxdWl2YWxlbnQgPGxpdGVyYWw+SnNvbk9iamVjdDwvbGl0ZXJhbD4vPGxpdGVyYWw+SlNPTk9iamVjdDwvbGl0ZXJhbD4gKGluIHRlcm1zIG9mCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdGluZyBKU09OIGV4cHJlc3Npb24pLCB5b3Ugd291bGQgbmVlZCBzZXZlcmFsIG1vcmUgbGluZXMgb2YgY29kZS4gVGhlIGZvbGxvd2luZyBleGFtcGxlIGlsbHVzdHJhdGVzCisgICAgICAgICAgICAgICAgICAgIGhvdyB0byBjb25zdHJ1Y3QgdGhlIHNhbWUgSlNPTiBkYXRhIHVzaW5nIHRoZSBzdGFuZGFyZCBKYXZhIEVFIDcgSlNPTi1Qcm9jZXNzaW5nIEFQSS4KKyAgICAgICAgICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGl0bGU+Q29uc3RydWN0aW5nIGEgPGxpdGVyYWw+SnNvbk9iamVjdDwvbGl0ZXJhbD4gKEpTT04tUHJvY2Vzc2luZyk8L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+SnNvbk9iamVjdCBteU9iamVjdCA9IEpzb24uY3JlYXRlT2JqZWN0QnVpbGRlcigpCisgICAgICAgIC5hZGQoIm5hbWUiLCAiQWdhbWVtbm9uIikKKyAgICAgICAgLmFkZCgiYWdlIiwgMzIpCisgICAgICAgIC5idWlsZCgpOzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKworICAgICAgICAgICAgICAgICAgICBBbmQgYXQgbGFzdCwgaGVyZSdzIGhvdyB0aGUgc2FtZSB3b3JrIGNhbiBiZSBkb25lIHdpdGggSmV0dGlzb24gQVBJLgorICAgICAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5Db25zdHJ1Y3RpbmcgYSA8bGl0ZXJhbD5KU09OT2JqZWN0PC9saXRlcmFsPiAoSmV0dGlzb24pPC90aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPkpTT05PYmplY3QgbXlPYmplY3QgPSBuZXcgSlNPTk9iamVjdCgpOwordHJ5IHsKKyAgICBteU9iamVjdC5wdXQoIm5hbWUiLCAiQWdhbWVtbm9uIik7CisgICAgbXlPYmplY3QucHV0KCJhZ2UiLCAzMik7Cit9IGNhdGNoIChKU09ORXhjZXB0aW9uIGV4KSB7CisgICAgTE9HR0VSLmxvZyhMZXZlbC5TRVZFUkUsICJFcnJvciAuLi4iLCBleCk7Cit9PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgTWVkaWEgbW9kdWxlcyB0aGF0IHN1cHBvcnQgdGhlIGxvdy1sZXZlbCBKU09OIHBhcnNpbmcgYW5kIGdlbmVyYXRpbmcgYXBwcm9hY2ggYXJlICZsaW5rLmpzb24tcDsKKyAgICAgICAgICAgICAgICAgICAgYW5kICZsaW5rLmpldHRpc29uOy4gVW5sZXNzIHlvdSBoYXZlIGEgc3Ryb25nIHJlYXNvbiBmb3IgdXNpbmcgdGhlIG5vbi1zdGFuZGFyZCAmbGluay5qZXR0aXNvbjsgQVBJLAorICAgICAgICAgICAgICAgICAgICB3ZSByZWNvbW1lbmQgeW91IHRvIHVzZSB0aGUgbmV3IHN0YW5kYXJkICZsaW5rLmpzb24tcDsgQVBJIGluc3RlYWQuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24geG1sOmlkPSJqc29uLm1veHkiPgorICAgICAgICAgICAgPHRpdGxlPk1PWHk8L3RpdGxlPgorCisgICAgICAgICAgICA8c2VjdGlvbj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+RGVwZW5kZW5jeTwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgVG8gdXNlIE1PWHkgYXMgeW91ciBKU09OIHByb3ZpZGVyIHlvdSBuZWVkIHRvIGFkZCAmbGl0LmplcnNleS1tZWRpYS1tb3h5OyBtb2R1bGUgdG8geW91ciAmbGl0LnBvbS54bWw7IGZpbGU6CisKKyAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJ4bWwiIGxpbmVudW1iZXJpbmc9InVubnVtYmVyZWQiPiZsdDtkZXBlbmRlbmN5Jmd0OworICAgICZsdDtncm91cElkJmd0O29yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhJmx0Oy9ncm91cElkJmd0OworICAgICZsdDthcnRpZmFjdElkJmd0O2plcnNleS1tZWRpYS1tb3h5Jmx0Oy9hcnRpZmFjdElkJmd0OworICAgICZsdDt2ZXJzaW9uJmd0OyZ2ZXJzaW9uOyZsdDsvdmVyc2lvbiZndDsKKyZsdDsvZGVwZW5kZW5jeSZndDs8L3Byb2dyYW1saXN0aW5nPgorCisgICAgICAgICAgICAgICAgICAgIElmIHlvdSdyZSBub3QgdXNpbmcgTWF2ZW4gbWFrZSBzdXJlIHRvIGhhdmUgYWxsIG5lZWRlZCBkZXBlbmRlbmNpZXMgKHNlZSAmamVyc2V5Lm1lZGlhLm1veHkuZGVwcy5saW5rOykgb24gdGhlIGNsYXNzcGF0aC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgICAgICA8c2VjdGlvbiB4bWw6aWQ9Im1veHktcmVnaXN0cmF0aW9uIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+Q29uZmlndXJlIGFuZCByZWdpc3RlcjwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgQXMgc3RhdGVkIGluIHRoZSA8eHJlZiBsaW5rZW5kPSJkZXBsb3ltZW50LmF1dG9kaXNjb3ZlcmFibGUiLz4gYXMgd2VsbCBhcyBlYXJsaWVyIGluIHRoaXMgY2hhcHRlciwgTU9YeSBtZWRpYQorICAgICAgICAgICAgICAgICAgICBtb2R1bGUgaXMgb25lIG9mIHRoZSBtb2R1bGVzIHdoZXJlIHlvdSBkb24ndCBuZWVkIHRvIGV4cGxpY2l0bHkgcmVnaXN0ZXIgaXQncyAmbGl0LmpheHJzLmNvcmUuRmVhdHVyZTtzCisgICAgICAgICAgICAgICAgICAgICgmbGl0LmplcnNleS5tZWRpYS5Nb3h5SnNvbkZlYXR1cmU7KSBpbiB5b3VyIGNsaWVudC9zZXJ2ZXIgJmpheHJzLmNvcmUuQ29uZmlndXJhYmxlOyBhcyB0aGlzIGZlYXR1cmUgaXMKKyAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSBkaXNjb3ZlcmVkIGFuZCByZWdpc3RlcmVkIHdoZW4geW91IGFkZCAmbGl0LmplcnNleS1tZWRpYS1tb3h5OyBtb2R1bGUgdG8geW91ciBjbGFzcy1wYXRoLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgVGhlIGF1dG8tZGlzY292ZXJhYmxlICZsaXQuamVyc2V5LW1lZGlhLW1veHk7IG1vZHVsZSBkZWZpbmVzIGEgZmV3IHByb3BlcnRpZXMgdGhhdCBjYW4gYmUgdXNlZCB0byBjb250cm9sIHRoZQorICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWMgcmVnaXN0cmF0aW9uIG9mICZsaXQuamVyc2V5Lm1lZGlhLk1veHlKc29uRmVhdHVyZTsgKGJlc2lkZXMgdGhlIGdlbmVyaWMKKyAgICAgICAgICAgICAgICAgICAgJmplcnNleS5jb21tb24uQ29tbW9uUHJvcGVydGllcy5GRUFUVVJFX0FVVE9fRElTQ09WRVJZX0RJU0FCTEU7IGFuIHRoZSBpdHMgY2xpZW50L3NlcnZlciB2YXJpYW50cyk6CisKKyAgICAgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4mamVyc2V5LmNvbW1vbi5Db21tb25Qcm9wZXJ0aWVzLk1PWFlfSlNPTl9GRUFUVVJFX0RJU0FCTEU7PC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4mamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzLk1PWFlfSlNPTl9GRUFUVVJFX0RJU0FCTEU7PC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4mamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzLk1PWFlfSlNPTl9GRUFUVVJFX0RJU0FCTEU7PC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIEEgbWFudWFsIHJlZ2lzdHJhdGlvbiBvZiBhbnkgb3RoZXIgSmVyc2V5IEpTT04gcHJvdmlkZXIgZmVhdHVyZSAoZXhjZXB0IGZvciAmbGluay5qc29uLXA7KQorICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZXMgdGhlIGF1dG9tYXRlZCBlbmFibGluZyBhbmQgY29uZmlndXJhdGlvbiBvZiAmbGl0LmplcnNleS5tZWRpYS5Nb3h5SnNvbkZlYXR1cmU7LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9ub3RlPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUbyBjb25maWd1cmUgJmpheHJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcjtzIC8gJmpheHJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjtzIHByb3ZpZGVkIGJ5IE1PWHkgeW91IGNhbiBzaW1wbHkKKyAgICAgICAgICAgICAgICAgICAgY3JlYXRlIGFuIGluc3RhbmNlIG9mICZqZXJzZXkubWVkaWEuTW94eUpzb25Db25maWc7IGFuZCBzZXQgdmFsdWVzIG9mIG5lZWRlZCBwcm9wZXJ0aWVzLiBGb3IgbW9zdCBjb21tb24KKyAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyB5b3UgY2FuIHVzZSBhIHBhcnRpY3VsYXIgbWV0aG9kIHRvIHNldCB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IG9yIHlvdSBjYW4gdXNlIG1vcmUgZ2VuZXJpYworICAgICAgICAgICAgICAgICAgICBtZXRob2RzIHRvIHNldCB0aGUgcHJvcGVydHk6CisKKyAgICAgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmplcnNleS5tZWRpYS5Nb3h5SnNvbkNvbmZpZy5wcm9wZXJ0eTsgLSBzZXRzIGEgcHJvcGVydHkgdmFsdWUgZm9yIGJvdGggTWFyc2hhbGxlciBhbmQgVW5tYXJzaGFsbGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZqZXJzZXkubWVkaWEuTW94eUpzb25Db25maWcubWFyc2hhbGxlclByb3BlcnR5OyAtIHNldHMgYSBwcm9wZXJ0eSB2YWx1ZSBmb3IgTWFyc2hhbGxlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmamVyc2V5Lm1lZGlhLk1veHlKc29uQ29uZmlnLnVubWFyc2hhbGxlclByb3BlcnR5OyAtIHNldHMgYSBwcm9wZXJ0eSB2YWx1ZSBmb3IgVW5tYXJzaGFsbGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorCisgICAgICAgICAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRpdGxlPiZqZXJzZXkubWVkaWEuTW94eUpzb25Db25maWc7IC0gU2V0dGluZyBwcm9wZXJ0aWVzLjwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSI+ZmluYWwgTWFwJmx0O1N0cmluZywgU3RyaW5nJmd0OyBuYW1lc3BhY2VQcmVmaXhNYXBwZXIgPSBuZXcgSGFzaE1hcCZsdDtTdHJpbmcsIFN0cmluZyZndDsoKTsKK25hbWVzcGFjZVByZWZpeE1hcHBlci5wdXQoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwgInhzaSIpOworCitmaW5hbCBNb3h5SnNvbkNvbmZpZyBjb25maWd1cmF0aW9uID0gbmV3IE1veHlKc29uQ29uZmlnKCkKKyAgICAgICAgLnNldE5hbWVzcGFjZVByZWZpeE1hcHBlcihuYW1lc3BhY2VQcmVmaXhNYXBwZXIpCisgICAgICAgIC5zZXROYW1lc3BhY2VTZXBhcmF0b3IoJzonKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKworICAgICAgICAgICAgICAgICAgICBJbiBvcmRlciB0byBtYWtlICZsaXQuamVyc2V5Lm1lZGlhLk1veHlKc29uQ29uZmlnOyB2aXNpYmxlIGZvciBNT1h5IHlvdSBuZWVkIHRvIGNyZWF0ZSBhbmQgcmVnaXN0ZXIKKyAgICAgICAgICAgICAgICAgICAgJmxpdC5qYXhycy5leHQuQ29udGV4dFJlc29sdmVyOyBpbiB5b3VyIGNsaWVudC9zZXJ2ZXIgY29kZS4KKworICAgICAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5DcmVhdGluZyA8bGl0ZXJhbD5Db250ZXh0UmVzb2x2ZXImbHQ7TW94eUpzb25Db25maWcmZ3Q7PC9saXRlcmFsPjwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSI+ZmluYWwgTWFwJmx0O1N0cmluZywgU3RyaW5nJmd0OyBuYW1lc3BhY2VQcmVmaXhNYXBwZXIgPSBuZXcgSGFzaE1hcCZsdDtTdHJpbmcsIFN0cmluZyZndDsoKTsKK25hbWVzcGFjZVByZWZpeE1hcHBlci5wdXQoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwgInhzaSIpOworCitmaW5hbCBNb3h5SnNvbkNvbmZpZyBtb3h5SnNvbkNvbmZpZyA9IE1veHlKc29uQ29uZmlnKCkKKyAgICAgICAgICAgIC5zZXROYW1lc3BhY2VQcmVmaXhNYXBwZXIobmFtZXNwYWNlUHJlZml4TWFwcGVyKQorICAgICAgICAgICAgLnNldE5hbWVzcGFjZVNlcGFyYXRvcignOicpOworCitmaW5hbCBDb250ZXh0UmVzb2x2ZXImbHQ7TW94eUpzb25Db25maWcmZ3Q7IGpzb25Db25maWdSZXNvbHZlciA9IG1veHlKc29uQ29uZmlnLnJlc29sdmVyKCk7Cis8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEFub3RoZXIgd2F5IHRvIHBhc3MgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIHRvIHRoZSB1bmRlcmx5aW5nIDxsaXRlcmFsPk1PWHlKc29uUHJvdmlkZXI8L2xpdGVyYWw+IGlzIHRvIHNldAorICAgICAgICAgICAgICAgICAgICB0aGVtIGRpcmVjdGx5IGludG8geW91ciAmamF4cnMuY29yZS5Db25maWd1cmFibGU7IGluc3RhbmNlIChzZWUgYW4gZXhhbXBsZSBiZWxvdykuIFRoZXNlIGFyZSBvdmVyd3JpdHRlbiBieQorICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzIHNldCBpbnRvIHRoZSAmamVyc2V5Lm1lZGlhLk1veHlKc29uQ29uZmlnOy4KKworICAgICAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5TZXR0aW5nIHByb3BlcnRpZXMgZm9yIE1PWHkgcHJvdmlkZXJzIGludG8gJmpheHJzLmNvcmUuQ29uZmlndXJhYmxlOzwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSI+bmV3IFJlc291cmNlQ29uZmlnKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHJvcGVydHkoTWFyc2hhbGxlclByb3BlcnRpZXMuSlNPTl9OQU1FU1BBQ0VfU0VQQVJBVE9SLCAiLiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnVydGhlciBjb25maWd1cmF0aW9uPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUaGVyZSBhcmUgc29tZSBwcm9wZXJ0aWVzIGZvciB3aGljaCBKZXJzZXkgc2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSB3aGVuCisgICAgICAgICAgICAgICAgICAgICZqYXhycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7IC8gJmpheHJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsgZnJvbSBNT1h5IGlzIHVzZWQgYW5kIHRoZXkgYXJlOgorCisgICAgICAgICAgICAgICAgICAgIDx0YWJsZSBmcmFtZT0iYWxsIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5EZWZhdWx0IHByb3BlcnR5IHZhbHVlcyBmb3IgTU9YeSAmamF4cnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyOyAvICZqYXhycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7PC90aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMiIgYWxpZ249ImxlZnQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0Ym9keT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5qYXZheC54bWwuYmluZC5NYXJzaGFsbGVyI0pBWEJfRk9STUFUVEVEX09VVFBVVDwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPmZhbHNlPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpheGIuSkFYQkNvbnRleHRQcm9wZXJ0aWVzI0pTT05fSU5DTFVERV9ST09UPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT48bGl0ZXJhbD5mYWxzZTwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qYXhiLk1hcnNoYWxsZXJQcm9wZXJ0aWVzI0pTT05fTUFSU0hBTF9FTVBUWV9DT0xMRUNUSU9OUzwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+PGxpdGVyYWw+dHJ1ZTwvbGl0ZXJhbD48L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qYXhiLkpBWEJDb250ZXh0UHJvcGVydGllcyNKU09OX05BTUVTUEFDRV9TRVBBUkFUT1I8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PjxsaXRlcmFsPm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm94bS5YTUxDb25zdGFudHMjRE9UPC9saXRlcmFsPjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGJvZHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3Rncm91cD4KKyAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8ZXhhbXBsZSB4bWw6aWQ9ImV4LW1veHktY2xpZW50Ij4KKyAgICAgICAgICAgICAgICAgICAgPHRpdGxlPkJ1aWxkaW5nIGNsaWVudCB3aXRoIE1PWHkgSlNPTiBmZWF0dXJlIGVuYWJsZWQuPC90aXRsZT4KKworICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiPmZpbmFsIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0J1aWxkZXIoKQorICAgICAgICAvLyBUaGUgbGluZSBiZWxvdyB0aGF0IHJlZ2lzdGVycyBNT1h5IGZlYXR1cmUgY2FuIGJlCisgICAgICAgIC8vIG9taXR0ZWQgaWYgRkVBVFVSRV9BVVRPX0RJU0NPVkVSWV9ESVNBQkxFIGlzCisgICAgICAgIC8vIG5vdCBkaXNhYmxlZC4KKyAgICAgICAgLnJlZ2lzdGVyKE1veHlKc29uRmVhdHVyZS5jbGFzcykKKyAgICAgICAgLnJlZ2lzdGVyKGpzb25Db25maWdSZXNvbHZlcikKKyAgICAgICAgLmJ1aWxkKCk7PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisKKyAgICAgICAgICAgICAgICA8ZXhhbXBsZSB4bWw6aWQ9ImV4LW1veHktc2VydmVyIj4KKyAgICAgICAgICAgICAgICAgICAgPHRpdGxlPkNyZWF0aW5nIEpBWC1SUyBhcHBsaWNhdGlvbiB3aXRoIE1PWHkgSlNPTiBmZWF0dXJlIGVuYWJsZWQuPC90aXRsZT4KKworICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiPi8vIENyZWF0ZSBKQVgtUlMgYXBwbGljYXRpb24uCitmaW5hbCBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiA9IG5ldyBSZXNvdXJjZUNvbmZpZygpCisgICAgICAgIC5wYWNrYWdlcygib3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuanNvbm1veHkiKQorICAgICAgICAvLyBUaGUgbGluZSBiZWxvdyB0aGF0IHJlZ2lzdGVycyBNT1h5IGZlYXR1cmUgY2FuIGJlCisgICAgICAgIC8vIG9taXR0ZWQgaWYgRkVBVFVSRV9BVVRPX0RJU0NPVkVSWV9ESVNBQkxFIGlzCisgICAgICAgIC8vIG5vdCBkaXNhYmxlZC4KKyAgICAgICAgLnJlZ2lzdGVyKE1veHlKc29uRmVhdHVyZS5jbGFzcykKKyAgICAgICAgLnJlZ2lzdGVyKGpzb25Db25maWdSZXNvbHZlcik7PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgICAgIDxzZWN0aW9uPgorICAgICAgICAgICAgICAgIDx0aXRsZT5FeGFtcGxlczwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgSmVyc2V5IHByb3ZpZGVzIGEgPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5naXRodWIuZXhhbXBsZXMudXJpOy9qc29uLW1veHknPkpTT04gTU9YeSBleGFtcGxlPC9saW5rPgorICAgICAgICAgICAgICAgICAgICBvbiBob3cgdG8gdXNlIE1PWHkgdG8gY29uc3VtZS9wcm9kdWNlIEpTT04uCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24geG1sOmlkPSJqc29uLmpzb24tcCI+CisgICAgICAgICAgICA8dGl0bGU+SmF2YSBBUEkgZm9yIEpTT04gUHJvY2Vzc2luZyAoSlNPTi1QKTwvdGl0bGU+CisKKyAgICAgICAgICAgIDxzZWN0aW9uPgorICAgICAgICAgICAgICAgIDx0aXRsZT5EZXBlbmRlbmN5PC90aXRsZT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUbyB1c2UgSlNPTi1QIGFzIHlvdXIgSlNPTiBwcm92aWRlciB5b3UgbmVlZCB0byBhZGQgJmxpdC5qZXJzZXktbWVkaWEtanNvbi1wcm9jZXNzaW5nOyBtb2R1bGUgdG8geW91cgorICAgICAgICAgICAgICAgICAgICAmbGl0LnBvbS54bWw7IGZpbGU6CisKKyAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJ4bWwiIGxpbmVudW1iZXJpbmc9InVubnVtYmVyZWQiPiZsdDtkZXBlbmRlbmN5Jmd0OworICAgICZsdDtncm91cElkJmd0O29yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhJmx0Oy9ncm91cElkJmd0OworICAgICZsdDthcnRpZmFjdElkJmd0O2plcnNleS1tZWRpYS1qc29uLXByb2Nlc3NpbmcmbHQ7L2FydGlmYWN0SWQmZ3Q7CisgICAgJmx0O3ZlcnNpb24mZ3Q7JnZlcnNpb247Jmx0Oy92ZXJzaW9uJmd0OworJmx0Oy9kZXBlbmRlbmN5Jmd0OzwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgICAgICAgICAgICAgICAgICAgSWYgeW91J3JlIG5vdCB1c2luZyBNYXZlbiBtYWtlIHN1cmUgdG8gaGF2ZSBhbGwgbmVlZGVkIGRlcGVuZGVuY2llcyAoc2VlICZqZXJzZXkubWVkaWEuanNvbi1wcm9jZXNzaW5nLmRlcHMubGluazspCisgICAgICAgICAgICAgICAgICAgIG9uIHRoZSBjbGFzcy1wYXRoLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgICAgIDxzZWN0aW9uIHhtbDppZD0ianNvbnAtcmVnaXN0cmF0aW9uIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+Q29uZmlndXJlIGFuZCByZWdpc3RlcjwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgQXMgc3RhdGVkIGluIDx4cmVmIGxpbmtlbmQ9ImRlcGxveW1lbnQuYXV0b2Rpc2NvdmVyYWJsZSIvPiBKU09OLVByb2Nlc3NpbmcgbWVkaWEgbW9kdWxlIGlzIG9uZSBvZiB0aGUKKyAgICAgICAgICAgICAgICAgICAgbW9kdWxlcyB3aGVyZSB5b3UgZG9uJ3QgbmVlZCB0byBleHBsaWNpdGx5IHJlZ2lzdGVyIGl0J3MKKyAgICAgICAgICAgICAgICAgICAgJmxpdC5qYXhycy5jb3JlLkZlYXR1cmU7cyAoJmxpdC5qZXJzZXkubWVkaWEuSnNvblByb2Nlc3NpbmdGZWF0dXJlOykgaW4geW91ciBjbGllbnQvc2VydmVyCisgICAgICAgICAgICAgICAgICAgICZqYXhycy5jb3JlLkNvbmZpZ3VyYWJsZTsgYXMgdGhpcyBmZWF0dXJlIGlzIGF1dG9tYXRpY2FsbHkgZGlzY292ZXJlZCBhbmQgcmVnaXN0ZXJlZCB3aGVuIHlvdSBhZGQKKyAgICAgICAgICAgICAgICAgICAgJmxpdC5qZXJzZXktbWVkaWEtanNvbi1wcm9jZXNzaW5nOyBtb2R1bGUgdG8geW91ciBjbGFzc3BhdGguCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBBcyBmb3IgdGhlIG90aGVyIG1vZHVsZXMsICZsaXQuamVyc2V5LW1lZGlhLWpzb24tcHJvY2Vzc2luZzsgaGFzIGFsc28gZmV3IHByb3BlcnRpZXMgdGhhdCBjYW4gYWZmZWN0IHRoZQorICAgICAgICAgICAgICAgICAgICByZWdpc3RyYXRpb24gb2YgJmxpdC5qZXJzZXkubWVkaWEuSnNvblByb2Nlc3NpbmdGZWF0dXJlOworICAgICAgICAgICAgICAgICAgICAoYmVzaWRlcyAmamVyc2V5LmNvbW1vbi5Db21tb25Qcm9wZXJ0aWVzLkZFQVRVUkVfQVVUT19ESVNDT1ZFUllfRElTQUJMRTsgYW5kIHRoZSBsaWtlKToKKworICAgICAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPiZqZXJzZXkuY29tbW9uLkNvbW1vblByb3BlcnRpZXMuSlNPTl9QUk9DRVNTSU5HX0ZFQVRVUkVfRElTQUJMRTs8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPiZqZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMuSlNPTl9QUk9DRVNTSU5HX0ZFQVRVUkVfRElTQUJMRTs8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPiZqZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXMuSlNPTl9QUk9DRVNTSU5HX0ZFQVRVUkVfRElTQUJMRTs8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFRvIGNvbmZpZ3VyZSAmamF4cnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyO3MgLyAmamF4cnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyO3MgcHJvdmlkZWQgYnkgSlNPTi1QIHlvdSBjYW4gc2ltcGx5CisgICAgICAgICAgICAgICAgICAgIGFkZCB2YWx1ZXMgZm9yIHN1cHBvcnRlZCBwcm9wZXJ0aWVzIGludG8gdGhlICZqYXhycy5jb3JlLkNvbmZpZ3VyYXRpb247IGluc3RhbmNlIChjbGllbnQvc2VydmVyKS4gQ3VycmVudGx5CisgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZCBhcmUgdGhlc2UgcHJvcGVydGllczoKKworICAgICAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5Kc29uR2VuZXJhdG9yLlBSRVRUWV9QUklOVElORzwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCI8bGl0ZXJhbD5qYXZheC5qc29uLnN0cmVhbS5Kc29uR2VuZXJhdG9yLnByZXR0eVByaW50aW5nPC9saXRlcmFsPiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5CdWlsZGluZyBjbGllbnQgd2l0aCBKU09OLVByb2Nlc3NpbmcgSlNPTiBmZWF0dXJlIGVuYWJsZWQuPC90aXRsZT4KKworICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiPkNsaWVudEJ1aWxkZXIubmV3Q2xpZW50KG5ldyBDbGllbnRDb25maWcoKQorICAgICAgICAvLyBUaGUgbGluZSBiZWxvdyB0aGF0IHJlZ2lzdGVycyBKU09OLVByb2Nlc3NpbmcgZmVhdHVyZSBjYW4gYmUKKyAgICAgICAgLy8gb21pdHRlZCBpZiBGRUFUVVJFX0FVVE9fRElTQ09WRVJZX0RJU0FCTEUgaXMgbm90IGRpc2FibGVkLgorICAgICAgICAucmVnaXN0ZXIoSnNvblByb2Nlc3NpbmdGZWF0dXJlLmNsYXNzKQorICAgICAgICAucHJvcGVydHkoSnNvbkdlbmVyYXRvci5QUkVUVFlfUFJJTlRJTkcsIHRydWUpCispOzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorCisgICAgICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5DcmVhdGluZyBKQVgtUlMgYXBwbGljYXRpb24gd2l0aCBKU09OLVByb2Nlc3NpbmcgSlNPTiBmZWF0dXJlIGVuYWJsZWQuPC90aXRsZT4KKworICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiPi8vIENyZWF0ZSBKQVgtUlMgYXBwbGljYXRpb24uCitmaW5hbCBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiA9IG5ldyBSZXNvdXJjZUNvbmZpZygpCisgICAgICAgIC8vIFRoZSBsaW5lIGJlbG93IHRoYXQgcmVnaXN0ZXJzIEpTT04tUHJvY2Vzc2luZyBmZWF0dXJlIGNhbiBiZQorICAgICAgICAvLyBvbWl0dGVkIGlmIEZFQVRVUkVfQVVUT19ESVNDT1ZFUllfRElTQUJMRSBpcyBub3QgZGlzYWJsZWQuCisgICAgICAgIC5yZWdpc3RlcihKc29uUHJvY2Vzc2luZ0ZlYXR1cmUuY2xhc3MpCisgICAgICAgIC5wYWNrYWdlcygib3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuanNvbnAiKQorICAgICAgICAucHJvcGVydHkoSnNvbkdlbmVyYXRvci5QUkVUVFlfUFJJTlRJTkcsIHRydWUpOzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgICAgICA8c2VjdGlvbj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+RXhhbXBsZXM8L3RpdGxlPgorCisgICAgICAgICAgICAgICAgPHBhcmE+SmVyc2V5IHByb3ZpZGVzIGEKKyAgICAgICAgICAgICAgICAgICAgPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5naXRodWIuZXhhbXBsZXMudXJpOy9qc29uLXByb2Nlc3Npbmctd2ViYXBwJz5KU09OIFByb2Nlc3NpbmcgZXhhbXBsZTwvbGluaz4KKyAgICAgICAgICAgICAgICAgICAgb24gaG93IHRvIHVzZSBKU09OLVByb2Nlc3NpbmcgdG8gY29uc3VtZS9wcm9kdWNlIEpTT04uPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIHhtbDppZD0ianNvbi5qYWNrc29uIj4KKyAgICAgICAgICAgIDx0aXRsZT5KYWNrc29uICgxLnggYW5kIDIueCk8L3RpdGxlPgorCisgICAgICAgICAgICA8c2VjdGlvbj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+RGVwZW5kZW5jeTwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgVG8gdXNlIEphY2tzb24gMi54IGFzIHlvdXIgSlNPTiBwcm92aWRlciB5b3UgbmVlZCB0byBhZGQgJmxpdC5qZXJzZXktbWVkaWEtanNvbi1qYWNrc29uOyBtb2R1bGUgdG8geW91cgorICAgICAgICAgICAgICAgICAgICAmbGl0LnBvbS54bWw7IGZpbGU6CisKKyAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJ4bWwiIGxpbmVudW1iZXJpbmc9InVubnVtYmVyZWQiPiZsdDtkZXBlbmRlbmN5Jmd0OworICAgICZsdDtncm91cElkJmd0O29yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhJmx0Oy9ncm91cElkJmd0OworICAgICZsdDthcnRpZmFjdElkJmd0O2plcnNleS1tZWRpYS1qc29uLWphY2tzb24mbHQ7L2FydGlmYWN0SWQmZ3Q7CisgICAgJmx0O3ZlcnNpb24mZ3Q7JnZlcnNpb247Jmx0Oy92ZXJzaW9uJmd0OworJmx0Oy9kZXBlbmRlbmN5Jmd0OzwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgICAgICAgICAgICAgICAgICAgVG8gdXNlIEphY2tzb24gMS54IGl0J2xsIGxvb2sgbGlrZToKKworICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9InhtbCIgbGluZW51bWJlcmluZz0idW5udW1iZXJlZCI+Jmx0O2RlcGVuZGVuY3kmZ3Q7CisgICAgJmx0O2dyb3VwSWQmZ3Q7b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEmbHQ7L2dyb3VwSWQmZ3Q7CisgICAgJmx0O2FydGlmYWN0SWQmZ3Q7amVyc2V5LW1lZGlhLWpzb24tamFja3NvbjEmbHQ7L2FydGlmYWN0SWQmZ3Q7CisgICAgJmx0O3ZlcnNpb24mZ3Q7JnZlcnNpb247Jmx0Oy92ZXJzaW9uJmd0OworJmx0Oy9kZXBlbmRlbmN5Jmd0OzwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgICAgICAgICAgICAgICAgICAgSWYgeW91J3JlIG5vdCB1c2luZyBNYXZlbiBtYWtlIHN1cmUgdG8gaGF2ZSBhbGwgbmVlZGVkIGRlcGVuZGVuY2llcyAoc2VlICZqZXJzZXkubWVkaWEuanNvbi1qYWNrc29uLmRlcHMubGluazsgb3IKKyAgICAgICAgICAgICAgICAgICAgJmplcnNleS5tZWRpYS5qc29uLWphY2tzb24xLmRlcHMubGluazspIG9uIHRoZSBjbGFzc3BhdGguCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICAgICAgPHNlY3Rpb24geG1sOmlkPSJqYWNrc29uLXJlZ2lzdHJhdGlvbiI+CisgICAgICAgICAgICAgICAgPHRpdGxlPkNvbmZpZ3VyZSBhbmQgcmVnaXN0ZXI8L3RpdGxlPgorCisgICAgICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IHRoZXJlIGlzIGEgZGlmZmVyZW5jZSBpbiBuYW1lc3BhY2VzIGJldHdlZW4gSmFja3NvbiAxLnggKDxsaXRlcmFsPm9yZy5jb2RlaGF1cy5qYWNrc29uPC9saXRlcmFsPikKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBKYWNrc29uIDIueCAoPGxpdGVyYWw+Y29tLmZhc3RlcnhtbC5qYWNrc29uPC9saXRlcmFsPikuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L25vdGU+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgSmFja3NvbiBKU09OIHByb2Nlc3NvciBjb3VsZCBiZSBjb250cm9sbGVkIHZpYSBwcm92aWRpbmcgYSBjdXN0b20gSmFja3NvbiAyICZqZXJzZXkubWVkaWEuT2JqZWN0TWFwcGVyOyAob3IKKyAgICAgICAgICAgICAgICAgICAgJmplcnNleS5tZWRpYS5PYmplY3RNYXBwZXIxOyBmb3IgSmFja3NvbiAxKSBpbnN0YW5jZS4KKyAgICAgICAgICAgICAgICAgICAgVGhpcyBjb3VsZCBiZSBoYW5keSBpZiB5b3UgbmVlZCB0byByZWRlZmluZSB0aGUgZGVmYXVsdCBKYWNrc29uIGJlaGF2aW91ciBhbmQgdG8gZmluZS10dW5lIGhvdyB5b3VyIEpTT04gZGF0YQorICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmVzIGxvb2sgbGlrZS4gRGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgYWxsIEphY2tzb24gZmVhdHVyZXMgaXMgb3V0IG9mIHNjb3BlIG9mIHRoaXMgZ3VpZGUuIFRoZSBleGFtcGxlCisgICAgICAgICAgICAgICAgICAgIGJlbG93IGdpdmVzIHlvdSBhIGhpbnQgb24gaG93IHRvIHdpcmUgeW91ciAmbGl0LmplcnNleS5tZWRpYS5PYmplY3RNYXBwZXI7ICgmamVyc2V5Lm1lZGlhLk9iamVjdE1hcHBlcjE7KQorICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSBpbnRvIHlvdXIgSmVyc2V5IGFwcGxpY2F0aW9uLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBJbiBvcmRlciB0byB1c2UgSmFja3NvbiBhcyB5b3VyIEpTT04gKEpBWEIvUE9KTykgcHJvdmlkZXIgeW91IG5lZWQgdG8gcmVnaXN0ZXIgJmplcnNleS5tZWRpYS5KYWNrc29uRmVhdHVyZTsKKyAgICAgICAgICAgICAgICAgICAgKCZqZXJzZXkubWVkaWEuSmFja3NvbjFGZWF0dXJlOykgYW5kIGEgJmxpdC5qYXhycy5leHQuQ29udGV4dFJlc29sdmVyOyBmb3IgJmxpdC5qZXJzZXkubWVkaWEuT2JqZWN0TWFwcGVyOywKKyAgICAgICAgICAgICAgICAgICAgaWYgbmVlZGVkLCBpbiB5b3VyICZqYXhycy5jb3JlLkNvbmZpZ3VyYWJsZTsgKGNsaWVudC9zZXJ2ZXIpLgorCisgICAgICAgICAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRpdGxlPjxsaXRlcmFsPkNvbnRleHRSZXNvbHZlciZsdDtPYmplY3RNYXBwZXImZ3Q7PC9saXRlcmFsPjwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPkBQcm92aWRlcgorcHVibGljIGNsYXNzIE15T2JqZWN0TWFwcGVyUHJvdmlkZXIgaW1wbGVtZW50cyBDb250ZXh0UmVzb2x2ZXImbHQ7T2JqZWN0TWFwcGVyJmd0OyB7CisKKyAgICBmaW5hbCBPYmplY3RNYXBwZXIgZGVmYXVsdE9iamVjdE1hcHBlcjsKKworICAgIHB1YmxpYyBNeU9iamVjdE1hcHBlclByb3ZpZGVyKCkgeworICAgICAgICBkZWZhdWx0T2JqZWN0TWFwcGVyID0gY3JlYXRlRGVmYXVsdE1hcHBlcigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3RNYXBwZXIgZ2V0Q29udGV4dChDbGFzcyZsdDs/Jmd0OyB0eXBlKSB7CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdE9iamVjdE1hcHBlcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE9iamVjdE1hcHBlciBjcmVhdGVEZWZhdWx0TWFwcGVyKCkgeworICAgICAgICBmaW5hbCBPYmplY3RNYXBwZXIgcmVzdWx0ID0gbmV3IE9iamVjdE1hcHBlcigpOworICAgICAgICByZXN1bHQuY29uZmlndXJlKEZlYXR1cmUuSU5ERU5UX09VVFBVVCwgdHJ1ZSk7CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvLyAuLi4KK308L3Byb2dyYW1saXN0aW5nPgorPHBhcmE+VG8gdmlldyB0aGUgY29tcGxldGUgZXhhbXBsZSBzb3VyY2UgY29kZSwgc2VlCisgICAgPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5naXRodWIuZXhhbXBsZXMudXJpOy9qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qYWNrc29uL015T2JqZWN0TWFwcGVyUHJvdmlkZXIuamF2YSc+CisgICAgTXlPYmplY3RNYXBwZXJQcm92aWRlcjwvbGluaz4gY2xhc3MgZnJvbSB0aGUKKyAgICA8bGluayB4bGluazpocmVmPScmamVyc2V5LmdpdGh1Yi5leGFtcGxlcy51cmk7L2pzb24tamFja3Nvbic+SlNPTi1KYWNrc29uPC9saW5rPiBleGFtcGxlLjwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorCisgICAgICAgICAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRpdGxlPkJ1aWxkaW5nIGNsaWVudCB3aXRoIEphY2tzb24gSlNPTiBmZWF0dXJlIGVuYWJsZWQuPC90aXRsZT4KKworICAgICAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+ZmluYWwgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3QnVpbGRlcigpCisgICAgICAgIC5yZWdpc3RlcihNeU9iamVjdE1hcHBlclByb3ZpZGVyLmNsYXNzKSAgLy8gTm8gbmVlZCB0byByZWdpc3RlciB0aGlzIHByb3ZpZGVyIGlmIG5vIHNwZWNpYWwgY29uZmlndXJhdGlvbiBpcyByZXF1aXJlZC4KKyAgICAgICAgLnJlZ2lzdGVyKEphY2tzb25GZWF0dXJlLmNsYXNzKQorICAgICAgICAuYnVpbGQoKTs8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisKKyAgICAgICAgICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGl0bGU+Q3JlYXRpbmcgSkFYLVJTIGFwcGxpY2F0aW9uIHdpdGggSmFja3NvbiBKU09OIGZlYXR1cmUgZW5hYmxlZC48L3RpdGxlPgorCisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj4vLyBDcmVhdGUgSkFYLVJTIGFwcGxpY2F0aW9uLgorZmluYWwgQXBwbGljYXRpb24gYXBwbGljYXRpb24gPSBuZXcgUmVzb3VyY2VDb25maWcoKQorICAgICAgICAucGFja2FnZXMoIm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmphY2tzb24iKQorICAgICAgICAucmVnaXN0ZXIoTXlPYmplY3RNYXBwZXJQcm92aWRlci5jbGFzcykgIC8vIE5vIG5lZWQgdG8gcmVnaXN0ZXIgdGhpcyBwcm92aWRlciBpZiBubyBzcGVjaWFsIGNvbmZpZ3VyYXRpb24gaXMgcmVxdWlyZWQuCisgICAgICAgIC5yZWdpc3RlcihKYWNrc29uRmVhdHVyZS5jbGFzcyk7PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICAgICAgPHRpdGxlPkV4YW1wbGVzPC90aXRsZT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBKZXJzZXkgcHJvdmlkZXMgPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5naXRodWIuZXhhbXBsZXMudXJpOy9qc29uLWphY2tzb24nPkpTT04gSmFja3NvbiAoMi54KSBleGFtcGxlPC9saW5rPgorICAgICAgICAgICAgICAgICAgICBhbmQgPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5naXRodWIuZXhhbXBsZXMudXJpOy9qc29uLWphY2tzb24xJz5KU09OIEphY2tzb24gKDEueCkgZXhhbXBsZTwvbGluaz4gc2hvd2luZworICAgICAgICAgICAgICAgICAgICBob3cgdG8gdXNlIEphY2tzb24gdG8gY29uc3VtZS9wcm9kdWNlIEpTT04uCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24geG1sOmlkPSJqc29uLmpldHRpc29uIj4KKyAgICAgICAgICAgIDx0aXRsZT5KZXR0aXNvbjwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEpBWEIgYXBwcm9hY2ggZm9yIChkZSlzZXJpYWxpemluZyBKU09OIGluIEpldHRpc29uIG1vZHVsZSBwcm92aWRlcywgaW4gYWRkaXRpb24gdG8gdXNpbmcgcHVyZSBKQVhCLAorICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB0aGF0IGNvdWxkIGJlIHNldCBvbiBhbiAmamVyc2V5Lm1lZGlhLkpldHRpc29uQ29uZmlnOyBpbnN0YW5jZS4gVGhlIGluc3RhbmNlIGNvdWxkIGJlIHRoZW4KKyAgICAgICAgICAgICAgICBmdXJ0aGVyIHVzZWQgdG8gY3JlYXRlIGEgJmplcnNleS5tZWRpYS5KZXR0aXNvbkpheGJDb250ZXh0Oywgd2hpY2ggc2VydmVzIGFzIGEgbWFpbiBjb25maWd1cmF0aW9uIHBvaW50IGluIHRoaXMKKyAgICAgICAgICAgICAgICBhcmVhLgorICAgICAgICAgICAgICAgIFRvIHBhc3MgeW91ciBzcGVjaWFsaXplZCAmbGl0LmplcnNleS5tZWRpYS5KZXR0aXNvbkpheGJDb250ZXh0OyB0byBKZXJzZXksIHlvdSB3aWxsIGZpbmFsbHkgbmVlZCB0byBpbXBsZW1lbnQKKyAgICAgICAgICAgICAgICBhIEpBWEJDb250ZXh0ICZqYXhycy5leHQuQ29udGV4dFJlc29sdmVyOyAoc2VlIGJlbG93KS4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICAgICAgPHRpdGxlPkRlcGVuZGVuY3k8L3RpdGxlPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFRvIHVzZSBKZXR0aXNvbiBhcyB5b3VyIEpTT04gcHJvdmlkZXIgeW91IG5lZWQgdG8gYWRkICZsaXQuamVyc2V5LW1lZGlhLWpzb24tamV0dGlzb247IG1vZHVsZSB0byB5b3VyCisgICAgICAgICAgICAgICAgICAgICZsaXQucG9tLnhtbDsgZmlsZToKKworICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9InhtbCIgbGluZW51bWJlcmluZz0idW5udW1iZXJlZCI+Jmx0O2RlcGVuZGVuY3kmZ3Q7CisgICAgJmx0O2dyb3VwSWQmZ3Q7b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEmbHQ7L2dyb3VwSWQmZ3Q7CisgICAgJmx0O2FydGlmYWN0SWQmZ3Q7amVyc2V5LW1lZGlhLWpzb24tamV0dGlzb24mbHQ7L2FydGlmYWN0SWQmZ3Q7CisgICAgJmx0O3ZlcnNpb24mZ3Q7JnZlcnNpb247Jmx0Oy92ZXJzaW9uJmd0OworJmx0Oy9kZXBlbmRlbmN5Jmd0OzwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgICAgICAgICAgICAgICAgICAgSWYgeW91J3JlIG5vdCB1c2luZyBNYXZlbiBtYWtlIHN1cmUgdG8gaGF2ZSBhbGwgbmVlZGVkIGRlcGVuZGVuY2llcyAoc2VlICZqZXJzZXkubWVkaWEuanNvbi1qZXR0aXNvbi5kZXBzLmxpbms7KSBvbgorICAgICAgICAgICAgICAgICAgICB0aGUgY2xhc3NwYXRoLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgICAgIDxzZWN0aW9uPgorICAgICAgICAgICAgICAgIDx0aXRsZT5KU09OIE5vdGF0aW9uczwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgJmxpdC5qZXJzZXkubWVkaWEuSmV0dGlzb25Db25maWc7IGFsbG93cyB5b3UgdG8gdXNlIHR3byBKU09OIG5vdGF0aW9ucy4gRWFjaCBvZiB0aGVzZSBub3RhdGlvbnMgc2VyaWFsaXplcworICAgICAgICAgICAgICAgICAgICBKU09OIGluIGEgZGlmZmVyZW50IHdheS4gRm9sbG93aW5nIGlzIGEgbGlzdCBvZiBzdXBwb3J0ZWQgbm90YXRpb25zOgorCisgICAgICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+SkVUVElTT05fTUFQUEVEIChkZWZhdWx0IG5vdGF0aW9uKTwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+QkFER0VSRklTSDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorCisgICAgICAgICAgICAgICAgICAgIFlvdSBtaWdodCB3YW50IHRvIHVzZSBvbmUgb2YgdGhlc2Ugbm90YXRpb25zLCB3aGVuIHdvcmtpbmcgd2l0aCBtb3JlIGNvbXBsZXggWE1MIGRvY3VtZW50cy4gTmFtZWx5IHdoZW4geW91CisgICAgICAgICAgICAgICAgICAgIGRlYWwgd2l0aCBtdWx0aXBsZSBYTUwgbmFtZXNwYWNlcyBpbiB5b3VyIEpBWEIgYmVhbnMuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEluZGl2aWR1YWwgbm90YXRpb25zIGFuZCB0aGVpciBmdXJ0aGVyIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgZGVzY3JpYmVkIGJlbG93LiBSYXRoZXIgdGhlbiBleHBsYWluaW5nCisgICAgICAgICAgICAgICAgICAgIHJ1bGVzIGZvciBtYXBwaW5nIFhNTCBjb25zdHJ1Y3RzIGludG8gSlNPTiwgdGhlIG5vdGF0aW9ucyB3aWxsIGJlIGRlc2NyaWJlZCB1c2luZyBhIHNpbXBsZSBleGFtcGxlLiBGb2xsb3dpbmcKKyAgICAgICAgICAgICAgICAgICAgYXJlIEpBWEIgYmVhbnMsIHdoaWNoIHdpbGwgYmUgdXNlZC4KKworICAgICAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5KQVhCIGJlYW5zIGZvciBKU09OIHN1cHBvcnRlZCBub3RhdGlvbnMgZGVzY3JpcHRpb24sIHNpbXBsZSBhZGRyZXNzIGJlYW48L3RpdGxlPgorCisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5AWG1sUm9vdEVsZW1lbnQKK3B1YmxpYyBjbGFzcyBBZGRyZXNzIHsKKyAgICBwdWJsaWMgU3RyaW5nIHN0cmVldDsKKyAgICBwdWJsaWMgU3RyaW5nIHRvd247CisKKyAgICBwdWJsaWMgQWRkcmVzcygpe30KKworICAgIHB1YmxpYyBBZGRyZXNzKFN0cmluZyBzdHJlZXQsIFN0cmluZyB0b3duKSB7CisgICAgICAgIHRoaXMuc3RyZWV0ID0gc3RyZWV0OworICAgICAgICB0aGlzLnRvd24gPSB0b3duOworICAgIH0KK308L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisKKyAgICAgICAgICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGl0bGU+SkFYQiBiZWFucyBmb3IgSlNPTiBzdXBwb3J0ZWQgbm90YXRpb25zIGRlc2NyaXB0aW9uLCBjb250YWN0IGJlYW48L3RpdGxlPgorCisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5AWG1sUm9vdEVsZW1lbnQKK3B1YmxpYyBjbGFzcyBDb250YWN0IHsKKworICAgIHB1YmxpYyBpbnQgaWQ7CisgICAgcHVibGljIFN0cmluZyBuYW1lOworICAgIHB1YmxpYyBMaXN0Jmx0O0FkZHJlc3MmZ3Q7IGFkZHJlc3NlczsKKworICAgIHB1YmxpYyBDb250YWN0KCkge307CisKKyAgICBwdWJsaWMgQ29udGFjdChpbnQgaWQsIFN0cmluZyBuYW1lLCBMaXN0Jmx0O0FkZHJlc3MmZ3Q7IGFkZHJlc3NlcykgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgICAgIHRoaXMuYWRkcmVzc2VzID0KKyAgICAgICAgICAgIChhZGRyZXNzZXMgIT0gbnVsbCkgPyBuZXcgTGlua2VkTGlzdCZsdDtBZGRyZXNzJmd0OyhhZGRyZXNzZXMpIDogbnVsbDsKKyAgICB9Cit9PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBGb2xsb3dpbmcgdGV4dCB3aWxsIGJlIG1haW5seSB3b3JraW5nIHdpdGggYSBjb250YWN0IGJlYW4gaW5pdGlhbGl6ZWQgd2l0aDoKKworICAgICAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5KQVhCIGJlYW5zIGZvciBKU09OIHN1cHBvcnRlZCBub3RhdGlvbnMgZGVzY3JpcHRpb24sIGluaXRpYWxpemF0aW9uPC90aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5BZGRyZXNzW10gYWRkcmVzc2VzID0ge25ldyBBZGRyZXNzKCJMb25nIFN0cmVldCAxIiwgIlNob3J0IFZpbGxhZ2UiKX07CitDb250YWN0IGNvbnRhY3QgPSBuZXcgQ29udGFjdCgyLCAiQm9iIiwgQXJyYXlzLmFzTGlzdChhZGRyZXNzZXMpKTs8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisKKyAgICAgICAgICAgICAgICAgICAgSS5lLiBjb250YWN0IGJlYW4gd2l0aCA8bGl0ZXJhbD5pZD0yPC9saXRlcmFsPiwgPGxpdGVyYWw+bmFtZT0iQm9iIjwvbGl0ZXJhbD4gY29udGFpbmluZworICAgICAgICAgICAgICAgICAgICBhIHNpbmdsZSBhZGRyZXNzICg8bGl0ZXJhbD5zdHJlZXQ9IkxvbmcgU3RyZWV0IDEiPC9saXRlcmFsPiwgPGxpdGVyYWw+dG93bj0iU2hvcnQgVmlsbGFnZSI8L2xpdGVyYWw+KS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgQWxsIGJlbG93IGRlc2NyaWJlZCBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXJlIGRvY3VtZW50ZWQgYWxzbyBpbiBhcGktZG9jcyBhdCAmamVyc2V5Lm1lZGlhLkpldHRpc29uQ29uZmlnOy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8c2VjdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHRpdGxlPkpldHRpc29uIG1hcHBlZCBub3RhdGlvbjwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICBJZiB5b3UgbmVlZCB0byBkZWFsIHdpdGggdmFyaW91cyBYTUwgbmFtZXNwYWNlcywgeW91IHdpbGwgZmluZCBKZXR0aXNvbiA8bGl0ZXJhbD5tYXBwZWQ8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICBub3RhdGlvbiBwcmV0dHkgdXNlZnVsLiBMZXRzIGRlZmluZSBhIHBhcnRpY3VsYXIgbmFtZXNwYWNlIGZvciA8Y29kZT5pZDwvY29kZT4gaXRlbToKKworICAgICAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+Li4uCitAWG1sRWxlbWVudChuYW1lc3BhY2U9Imh0dHA6Ly9leGFtcGxlLmNvbSIpCitwdWJsaWMgaW50IGlkOworLi4uPC9wcm9ncmFtbGlzdGluZz4KKworICAgICAgICAgICAgICAgICAgICAgICAgVGhlbiB5b3Ugc2ltcGx5IGNvbmZpZ3VyZSBhIG1hcHBpbmcgZnJvbSBYTUwgbmFtZXNwYWNlIGludG8gSlNPTiBwcmVmaXggYXMgZm9sbG93czoKKworICAgICAgICAgICAgICAgICAgICAgICAgPGV4YW1wbGUgeG1sOmlkPSJqc29uLmpheGIuamV0dGlzb24ubWFwcGVkLm5zLmRlZiI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYTUwgbmFtZXNwYWNlIHRvIEpTT04gbWFwcGluZyBjb25maWd1cmF0aW9uIGZvciBKZXR0aXNvbiBiYXNlZCA8bGl0ZXJhbD5tYXBwZWQ8L2xpdGVyYWw+IG5vdGF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aXRsZT4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPk1hcCZsdDtTdHJpbmcsU3RyaW5nJmd0OyBuczJqc29uID0gbmV3IEhhc2hNYXAmbHQ7U3RyaW5nLCBTdHJpbmcmZ3Q7KCk7CituczJqc29uLnB1dCgiaHR0cDovL2V4YW1wbGUuY29tIiwgImV4YW1wbGUiKTsKK2NvbnRleHQgPSBuZXcgSmV0dGlzb25KYXhiQ29udGV4dCgKKyAgICBKZXR0aXNvbkNvbmZpZy5tYXBwZWRKZXR0aXNvbigpLnhtbDJKc29uTnMobnMyanNvbikuYnVpbGQoKSwKKyAgICB0eXBlcyk7PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKworICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0aW5nIEpTT04gd2lsbCBsb29rIGxpa2UgaW4gdGhlIGV4YW1wbGUgYmVsb3cuCisKKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5KU09OIGV4cHJlc3Npb24gd2l0aCBYTUwgbmFtZXNwYWNlcyBtYXBwZWQgaW50byBKU09OPC90aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9InhtbCIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPnsKKyAgICJjb250YWN0Ijp7CisgICAgICAiZXhhbXBsZS5pZCI6MiwKKyAgICAgICJuYW1lIjoiQm9iIiwKKyAgICAgICJhZGRyZXNzZXMiOnsKKyAgICAgICAgICJzdHJlZXQiOiJMb25nIFN0cmVldCAxIiwKKyAgICAgICAgICJ0b3duIjoiU2hvcnQgVmlsbGFnZSIKKyAgICAgIH0KKyAgIH0KK308L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorCisgICAgICAgICAgICAgICAgICAgICAgICBQbGVhc2Ugbm90ZSwgdGhhdCA8Y29kZT5pZDwvY29kZT4gaXRlbSBiZWNhbWUgPGNvZGU+ZXhhbXBsZS5pZDwvY29kZT4gYmFzZWQgb24gdGhlIFhNTCBuYW1lc3BhY2UgbWFwcGluZy4KKyAgICAgICAgICAgICAgICAgICAgICAgIElmIHlvdSBoYXZlIG1vcmUgWE1MIG5hbWVzcGFjZXMgaW4geW91ciBYTUwsIHlvdSB3aWxsIG5lZWQgdG8gY29uZmlndXJlIGFwcHJvcHJpYXRlIG1hcHBpbmcgZm9yIGFsbCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgdGhlbS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIEFub3RoZXIgY29uZmlndXJhYmxlIG9wdGlvbiBpbnRyb2R1Y2VkIGluIEplcnNleSB2ZXJzaW9uIDIuMiBpcyByZWxhdGVkIHRvIHNlcmlhbGl6YXRpb24gb2YgSlNPTiBhcnJheXMgd2l0aCBKZXR0aXNvbidzCisgICAgICAgICAgICAgICAgICAgICAgICBtYXBwZWQgbm90YXRpb24uIFdoZW4gc2VyaWFsaXppbmcgZWxlbWVudHMgcmVwcmVzZW50aW5nIHNpbmdsZSBpdGVtIGxpc3RzL2FycmF5cywgeW91IG1pZ2h0IHdhbnQgdG8gdXRpbGlzZQorICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGZvbGxvd2luZyBKZXJzZXkgY29uZmlndXJhdGlvbiBtZXRob2QgdG8gZXhwbGljaXRseSBuYW1lIHdoaWNoIGVsZW1lbnRzIHRvIHRyZWF0IGFzIGFycmF5cyBubyBtYXR0ZXIgd2hhdCB0aGUgYWN0dWFsIGNvbnRlbnQgaXMuCisKKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGFtcGxlIHhtbDppZD0ianNvbi5qYXhiLmpldHRpc29uLm1hcHBlZC5hcnJheS5kZWYiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPTiBBcnJheSBjb25maWd1cmF0aW9uIGZvciBKZXR0aXNvbiBiYXNlZCA8bGl0ZXJhbD5tYXBwZWQ8L2xpdGVyYWw+IG5vdGF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aXRsZT4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPmNvbnRleHQgPSBuZXcgSmV0dGlzb25KYXhiQ29udGV4dCgKKyAgICBKZXR0aXNvbkNvbmZpZy5tYXBwZWRKZXR0aXNvbigpLnNlcmlhbGl6ZUFzQXJyYXkoIm5hbWUiKS5idWlsZCgpLAorICAgIHR5cGVzKTs8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorCisgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHRpbmcgSlNPTiB3aWxsIGxvb2sgbGlrZSBpbiB0aGUgZXhhbXBsZSBiZWxvdywgdW5pbXBvcnRhbnQgbGluZXMgcmVtb3ZlZCBmb3Igc2FuaXR5LgorCisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGl0bGU+SlNPTiBleHByZXNzaW9uIHdpdGggSlNPTiBhcnJheXMgZXhwbGljaXRseSBjb25maWd1cmVkIHZpYSBKZXJzZXk8L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0ieG1sIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+eworICAgImNvbnRhY3QiOnsKKyAgICAgIC4uLgorICAgICAgIm5hbWUiOlsiQm9iIl0sCisgICAgICAuLi4KKyAgIH0KK308L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgICAgICAgICA8c2VjdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHRpdGxlPkJhZGdlcmZpc2ggbm90YXRpb248L3RpdGxlPgorCisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgRnJvbSBKU09OIGFuZCBKYXZhU2NyaXB0IHBlcnNwZWN0aXZlLCB0aGlzIG5vdGF0aW9uIGlzIGRlZmluaXRlbHkgdGhlIHdvcnN0IHJlYWRhYmxlIG9uZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIFlvdSB3aWxsIHByb2JhYmx5IG5vdCB3YW50IHRvIHVzZSBpdCwgdW5sZXNzIHlvdSBuZWVkIHRvIG1ha2Ugc3VyZSB5b3VyIEpBWEIgYmVhbnMgY291bGQgYmUgZmxhd2xlc3NseQorICAgICAgICAgICAgICAgICAgICAgICAgd3JpdHRlbiBhbmQgcmVhZCBiYWNrIHRvIGFuZCBmcm9tIEpTT04sIHdpdGhvdXQgYm90aGVyaW5nIHdpdGggYW55IGZvcm1hdHRpbmcgY29uZmlndXJhdGlvbiwgbmFtZXNwYWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGV0Yy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgJmxpdC5qZXJzZXkubWVkaWEuSmV0dGlzb25Db25maWc7IGluc3RhbmNlIHVzaW5nIDxsaXRlcmFsPmJhZGdlcmZpc2g8L2xpdGVyYWw+IG5vdGF0aW9uIGNvdWxkIGJlIGJ1aWx0CisgICAgICAgICAgICAgICAgICAgICAgICB3aXRoCisKKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSI+SmV0dGlzb25Db25maWcuYmFkZ2VyRmlzaCgpLmJ1aWxkKCk8L3Byb2dyYW1saXN0aW5nPgorCisgICAgICAgICAgICAgICAgICAgICAgICBhbmQgdGhlIEpTT04gb3V0cHV0IEpTT04gd2lsbCBiZSBhcyBmb2xsb3dzLgorCisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGl0bGU+SlNPTiBleHByZXNzaW9uIHByb2R1Y2VkIHVzaW5nIDxsaXRlcmFsPmJhZGdlcmZpc2g8L2xpdGVyYWw+IG5vdGF0aW9uPC90aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9InhtbCIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPnsKKyAgICJjb250YWN0Ijp7CisgICAgICAiaWQiOnsKKyAgICAgICAgICIkIjoiMiIKKyAgICAgIH0sCisgICAgICAibmFtZSI6eworICAgICAgICAgIiQiOiJCb2IiCisgICAgICB9LAorICAgICAgImFkZHJlc3NlcyI6eworICAgICAgICAgInN0cmVldCI6eworICAgICAgICAgICAgIiQiOiJMb25nIFN0cmVldCAxIgorICAgICAgICAgfSwKKyAgICAgICAgICJ0b3duIjp7CisgICAgICAgICAgICAiJCI6IlNob3J0IFZpbGxhZ2UiCisgICAgICAgICB9CisgICAgICB9CisgICB9Cit9PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICAgICAgPHNlY3Rpb24geG1sOmlkPSJqZXR0aXNvbi1yZWdpc3RyYXRpb24iPgorICAgICAgICAgICAgICAgIDx0aXRsZT5Db25maWd1cmUgYW5kIHJlZ2lzdGVyPC90aXRsZT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBJbiBvcmRlciB0byB1c2UgSmV0dGlzb24gYXMgeW91ciBKU09OIChKQVhCL1BPSk8pIHByb3ZpZGVyIHlvdSBuZWVkIHRvIHJlZ2lzdGVyICZqZXJzZXkubWVkaWEuSmV0dGlzb25GZWF0dXJlOworICAgICAgICAgICAgICAgICAgICBhbmQgYSAmbGl0LmpheHJzLmV4dC5Db250ZXh0UmVzb2x2ZXI7IGZvciAmbGl0LmpheGIuSkFYQkNvbnRleHQ7IChpZiBuZWVkZWQpIGluIHlvdXIgJmpheHJzLmNvcmUuQ29uZmlndXJhYmxlOworICAgICAgICAgICAgICAgICAgICAoY2xpZW50L3NlcnZlcikuCisKKyAgICAgICAgICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGl0bGU+PGxpdGVyYWw+Q29udGV4dFJlc29sdmVyJmx0O09iamVjdE1hcHBlciZndDs8L2xpdGVyYWw+PC90aXRsZT4KKworICAgICAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIj5AUHJvdmlkZXIKK3B1YmxpYyBjbGFzcyBKYXhiQ29udGV4dFJlc29sdmVyIGltcGxlbWVudHMgQ29udGV4dFJlc29sdmVyJmx0O0pBWEJDb250ZXh0Jmd0OyB7CisKKyAgICBwcml2YXRlIGZpbmFsIEpBWEJDb250ZXh0IGNvbnRleHQ7CisgICAgcHJpdmF0ZSBmaW5hbCBTZXQmbHQ7Q2xhc3MmbHQ7PyZndDsmZ3Q7IHR5cGVzOworICAgIHByaXZhdGUgZmluYWwgQ2xhc3MmbHQ7PyZndDtbXSBjVHlwZXMgPSB7RmxpZ2h0cy5jbGFzcywgRmxpZ2h0VHlwZS5jbGFzcywgQWlyY3JhZnRUeXBlLmNsYXNzfTsKKworICAgIHB1YmxpYyBKYXhiQ29udGV4dFJlc29sdmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMudHlwZXMgPSBuZXcgSGFzaFNldCZsdDtDbGFzcyZsdDs/Jmd0OyZndDsoQXJyYXlzLmFzTGlzdChjVHlwZXMpKTsKKyAgICAgICAgdGhpcy5jb250ZXh0ID0gbmV3IEpldHRpc29uSmF4YkNvbnRleHQoSmV0dGlzb25Db25maWcuREVGQVVMVCwgY1R5cGVzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSkFYQkNvbnRleHQgZ2V0Q29udGV4dChDbGFzcyZsdDs/Jmd0OyBvYmplY3RUeXBlKSB7CisgICAgICAgIHJldHVybiAodHlwZXMuY29udGFpbnMob2JqZWN0VHlwZSkpID8gY29udGV4dCA6IG51bGw7CisgICAgfQorfTwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKworICAgICAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5CdWlsZGluZyBjbGllbnQgd2l0aCBKZXR0aXNvbiBKU09OIGZlYXR1cmUgZW5hYmxlZC48L3RpdGxlPgorCisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiPmZpbmFsIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0J1aWxkZXIoKQorICAgICAgICAucmVnaXN0ZXIoSmF4YkNvbnRleHRSZXNvbHZlci5jbGFzcykgIC8vIE5vIG5lZWQgdG8gcmVnaXN0ZXIgdGhpcyBwcm92aWRlciBpZiBubyBzcGVjaWFsIGNvbmZpZ3VyYXRpb24gaXMgcmVxdWlyZWQuCisgICAgICAgIC5yZWdpc3RlcihKZXR0aXNvbkZlYXR1cmUuY2xhc3MpCisgICAgICAgIC5idWlsZCgpOzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKworICAgICAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5DcmVhdGluZyBKQVgtUlMgYXBwbGljYXRpb24gd2l0aCBKZXR0aXNvbiBKU09OIGZlYXR1cmUgZW5hYmxlZC48L3RpdGxlPgorCisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiPi8vIENyZWF0ZSBKQVgtUlMgYXBwbGljYXRpb24uCitmaW5hbCBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiA9IG5ldyBSZXNvdXJjZUNvbmZpZygpCisgICAgICAgIC5wYWNrYWdlcygib3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuamV0dGlzb24iKQorICAgICAgICAucmVnaXN0ZXIoSmF4YkNvbnRleHRSZXNvbHZlci5jbGFzcykgIC8vIE5vIG5lZWQgdG8gcmVnaXN0ZXIgdGhpcyBwcm92aWRlciBpZiBubyBzcGVjaWFsIGNvbmZpZ3VyYXRpb24gaXMgcmVxdWlyZWQuCisgICAgICAgIC5yZWdpc3RlcihKZXR0aXNvbkZlYXR1cmUuY2xhc3MpOzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgICAgIDxzZWN0aW9uPgorICAgICAgICAgICAgICAgIDx0aXRsZT5FeGFtcGxlczwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgSmVyc2V5IHByb3ZpZGVzIGFuIDxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuZ2l0aHViLmV4YW1wbGVzLnVyaTsvanNvbi1qZXR0aXNvbic+SlNPTiBKZXR0aXNvbiBleGFtcGxlPC9saW5rPgorICAgICAgICAgICAgICAgICAgICBvbiBob3cgdG8gdXNlIEpldHRpc29uIHRvIGNvbnN1bWUvcHJvZHVjZSBKU09OLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgIDxzZWN0aW9uPgorICAgICAgICAgICAgPHRpdGxlPjxsaXRlcmFsPkBKU09OUDwvbGl0ZXJhbD4gLSBKU09OIHdpdGggUGFkZGluZyBTdXBwb3J0PC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgSmVyc2V5IHByb3ZpZGVzIG91dC1vZi10aGUtYm94IHN1cHBvcnQgZm9yIDxsaW5rIHhsaW5rOmhyZWY9JyZ3aWtpcGVkaWEudXJpO0pTT05QJz5KU09OUDwvbGluaz4KKyAgICAgICAgICAgICAgICAtIEpTT04gd2l0aCBwYWRkaW5nLiBUaGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgaGFzIHRvIGJlIG1ldCB0byB0YWtlIGFkdmFudGFnZSBvZiB0aGlzIGNhcGFiaWxpdHk6CisKKyAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZSBtZXRob2QsIHdoaWNoIHNob3VsZCByZXR1cm4gd3JhcHBlZCBKU09OLCBuZWVkcyB0byBiZSBhbm5vdGF0ZWQgd2l0aCAmamVyc2V5LnNlcnZlci5KU09OUDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmamF4cnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOyBmb3IgPGxpdGVyYWw+YXBwbGljYXRpb24vanNvbjwvbGl0ZXJhbD4gbWVkaWEgdHlwZSwgd2hpY2ggYWxzbyBhY2NlcHRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJldHVybiB0eXBlIG9mIHRoZSByZXNvdXJjZSBtZXRob2QsIG5lZWRzIHRvIGJlIHJlZ2lzdGVyZWQgKHNlZSA8bGluayBsaW5rZW5kPSJqc29uIj5KU09OPC9saW5rPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24gb2YgdGhpcyBjaGFwdGVyKS4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcidzIHJlcXVlc3QgaGFzIHRvIGNvbnRhaW4gJmxpdC5odHRwLmhlYWRlci5BY2NlcHQ7IGhlYWRlciB3aXRoIG9uZSBvZiB0aGUgSmF2YVNjcmlwdCBtZWRpYSB0eXBlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmluZWQgKHNlZSBiZWxvdykuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisKKyAgICAgICAgICAgICAgICBBY2NlcHRhYmxlIG1lZGlhIHR5cGVzIGNvbXBhdGlibGUgd2l0aCAmbGl0LmplcnNleS5zZXJ2ZXIuSlNPTlA7IGFyZTogPGxpdGVyYWw+YXBwbGljYXRpb24vamF2YXNjcmlwdDwvbGl0ZXJhbD4sCisgICAgICAgICAgICAgICAgPGxpdGVyYWw+YXBwbGljYXRpb24veC1qYXZhc2NyaXB0PC9saXRlcmFsPiwgPGxpdGVyYWw+YXBwbGljYXRpb24vZWNtYXNjcmlwdDwvbGl0ZXJhbD4sCisgICAgICAgICAgICAgICAgPGxpdGVyYWw+dGV4dC9qYXZhc2NyaXB0PC9saXRlcmFsPiwgPGxpdGVyYWw+dGV4dC94LWphdmFzY3JpcHQ8L2xpdGVyYWw+LCA8bGl0ZXJhbD50ZXh0L2VjbWFzY3JpcHQ8L2xpdGVyYWw+LAorICAgICAgICAgICAgICAgIDxsaXRlcmFsPnRleHQvanNjcmlwdDwvbGl0ZXJhbD4uCisKKyAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgPHRpdGxlPlNpbXBsZXN0IGNhc2Ugb2YgdXNpbmcgJmxpdC5qZXJzZXkuc2VydmVyLkpTT05QOzwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIj5AR0VUCitASlNPTlAKK0BQcm9kdWNlcyh7ImFwcGxpY2F0aW9uL2pzb24iLCAiYXBwbGljYXRpb24vamF2YXNjcmlwdCJ9KQorcHVibGljIEpheGJCZWFuIGdldFNpbXBsZUpTT05QKCkgeworICAgIHJldHVybiBuZXcgSmF4YkJlYW4oImpzb25wIik7Cit9PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisKKyAgICAgICAgICAgICAgICBBc3N1bWUgdGhhdCB3ZSBoYXZlIHJlZ2lzdGVyZWQgYSBKU09OIHByb3ZpZGVycyBhbmQgdGhhdCB0aGUgPGxpdGVyYWw+SmF4YkJlYW48L2xpdGVyYWw+IGxvb2tzIGxpa2U6CisKKyAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgPHRpdGxlPkpheGJCZWFuIGZvciBASlNPTlAgZXhhbXBsZTwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIj5AWG1sUm9vdEVsZW1lbnQKK3B1YmxpYyBjbGFzcyBKYXhiQmVhbiB7CisKKyAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworICAgIHB1YmxpYyBKYXhiQmVhbigpIHt9CisKKyAgICBwdWJsaWMgSmF4YkJlYW4oZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICB9Cit9PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisKKyAgICAgICAgICAgICAgICBXaGVuIHlvdSBzZW5kIGEgJmxpdC5odHRwLkdFVDsgcmVxdWVzdCB3aXRoICZsaXQuaHR0cC5oZWFkZXIuQWNjZXB0OyBoZWFkZXIgc2V0IHRvCisgICAgICAgICAgICAgICAgPGxpdGVyYWw+YXBwbGljYXRpb24vamF2YXNjcmlwdDwvbGl0ZXJhbD4geW91J2xsIGdldCBhIHJlc3VsdCBlbnRpdHkgdGhhdCBsb29rIGxpa2U6CisKKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9InhtbCI+Y2FsbGJhY2soeworICAgICJ2YWx1ZSIgOiAianNvbnAiLAorfSk8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGVyZSBhcmUsIG9mIGNvdXJzZSwgd2F5cyB0byBjb25maWd1cmUgd3JhcHBpbmcgbWV0aG9kIG9mIHRoZSByZXR1cm5lZCBlbnRpdHkgd2hpY2ggZGVmYXVsdHMgdG8KKyAgICAgICAgICAgICAgICA8bGl0ZXJhbD5jYWxsYmFjazwvbGl0ZXJhbD4gYXMgeW91IGNhbiBzZWUgaW4gdGhlIHByZXZpb3VzIGV4YW1wbGUuCisgICAgICAgICAgICAgICAgJmxpdC5qZXJzZXkuc2VydmVyLkpTT05QOyBoYXMgdHdvIHBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgY29uZmlndXJlZDogPGxpdGVyYWw+Y2FsbGJhY2s8L2xpdGVyYWw+IGFuZAorICAgICAgICAgICAgICAgIDxsaXRlcmFsPnF1ZXJ5UGFyYW08L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgIDxsaXRlcmFsPmNhbGxiYWNrPC9saXRlcmFsPiBzdGFuZHMgZm9yIHRoZSBuYW1lIG9mIHRoZSBKYXZhU2NyaXB0IGNhbGxiYWNrIGZ1bmN0aW9uIGRlZmluZWQgYnkgdGhlIGFwcGxpY2F0aW9uLgorICAgICAgICAgICAgICAgIFRoZSBzZWNvbmQgcGFyYW1ldGVyLCA8bGl0ZXJhbD5xdWVyeVBhcmFtPC9saXRlcmFsPiwgZGVmaW5lcyB0aGUgbmFtZSBvZiB0aGUgcXVlcnkgcGFyYW1ldGVyIGhvbGRpbmcgdGhlIG5hbWUgb2YKKyAgICAgICAgICAgICAgICB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgdXNlZCAoaWYgcHJlc2VudCBpbiB0aGUgcmVxdWVzdCkuIFZhbHVlIG9mIDxsaXRlcmFsPnF1ZXJ5UGFyYW08L2xpdGVyYWw+IGRlZmF1bHRzIHRvCisgICAgICAgICAgICAgICAgPGxpdGVyYWw+X19jYWxsYmFjazwvbGl0ZXJhbD4gc28gZXZlbiBpZiB5b3UgZG8gbm90IHNldCB0aGUgbmFtZSBvZiB0aGUgcXVlcnkgcGFyYW1ldGVyIHlvdXJzZWxmLCBjbGllbnQgY2FuCisgICAgICAgICAgICAgICAgYWx3YXlzIGFmZmVjdCB0aGUgcmVzdWx0IG5hbWUgb2YgdGhlIHdyYXBwaW5nIEphdmFTY3JpcHQgY2FsbGJhY2sgbWV0aG9kLgorCisgICAgICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+cXVlcnlQYXJhbTwvbGl0ZXJhbD4gdmFsdWUgKGlmIHNldCkgYWx3YXlzIHRha2VzIHByZWNlZGVuY2Ugb3ZlciA8bGl0ZXJhbD5jYWxsYmFjazwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9ub3RlPgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBMZXRzIG1vZGlmeSBvdXIgZXhhbXBsZSBhIGxpdHRsZSBiaXQ6CisKKyAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgPHRpdGxlPkV4YW1wbGUgb2YgJmxpdC5qZXJzZXkuc2VydmVyLkpTT05QOyB3aXRoIGNvbmZpZ3VyZWQgcGFyYW1ldGVycy48L3RpdGxlPgorCisgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSI+QEdFVAorQFByb2R1Y2VzKHsiYXBwbGljYXRpb24vanNvbiIsICJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0In0pCitASlNPTlAoY2FsbGJhY2sgPSAiZXZhbCIsIHF1ZXJ5UGFyYW0gPSAianNvbnBDYWxsYmFjayIpCitwdWJsaWMgSmF4YkJlYW4gZ2V0U2ltcGxlSlNPTlAoKSB7CisgICAgcmV0dXJuIG5ldyBKYXhiQmVhbigianNvbnAiKTsKK308L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKworICAgICAgICAgICAgICAgIEFuZCBtYWtlIHR3byByZXF1ZXN0czoKKworICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz5jdXJsIC1YIEdFVCBodHRwOi8vbG9jYWxob3N0OjgwODAvanNvbnA8L3Byb2dyYW1saXN0aW5nPgorCisgICAgICAgICAgICAgICAgd2lsbCByZXR1cm4KKworICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0ieG1sIj5ldmFsKHsKKyAgICAidmFsdWUiIDogImpzb25wIiwKK30pPC9wcm9ncmFtbGlzdGluZz4KKworICAgICAgICAgICAgICAgIGFuZCB0aGUKKworICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZz5jdXJsIC1YIEdFVCBodHRwOi8vbG9jYWxob3N0OjgwODAvanNvbnA/anNvbnBDYWxsYmFjaz1hbGVydDwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgICAgICAgICAgICAgICB3aWxsIHJldHVybgorCisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJ4bWwiPmFsZXJ0KHsKKyAgICAidmFsdWUiIDogImpzb25wIiwKK30pPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPGZvcm1hbHBhcmE+CisgICAgICAgICAgICAgICAgPHRpdGxlPkV4YW1wbGU8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBZb3UgY2FuIHRha2UgYSBsb29rIGF0IGEgcHJvdmlkZWQKKyAgICAgICAgICAgICAgICAgICAgPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5naXRodWIuZXhhbXBsZXMudXJpOy9qc29uLXdpdGgtcGFkZGluZyc+SlNPTiB3aXRoIFBhZGRpbmcgZXhhbXBsZTwvbGluaz4uCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9mb3JtYWxwYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24geG1sOmlkPSJ4bWwiPgorICAgICAgICA8dGl0bGU+WE1MPC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEFzIHlvdSBwcm9iYWJseSBhbHJlYWR5IGtub3csIEplcnNleSB1c2VzICZsaXQuamF4cnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyO3MgYW5kICZsaXQuamF4cnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyO3MgdG8KKyAgICAgICAgICAgIHBhcnNlIGluY29taW5nIHJlcXVlc3RzIGFuZCBjcmVhdGUgb3V0Z29pbmcgcmVzcG9uc2VzLiBFdmVyeSB1c2VyIGNhbiBjcmVhdGUgaXRzIG93biByZXByZXNlbnRhdGlvbiBidXQuLi4gdGhpcyBpcyBub3QKKyAgICAgICAgICAgIHJlY29tbWVuZGVkIHdheSBob3cgdG8gZG8gdGhpbmdzLiBYTUwgaXMgcHJvdmVuIHN0YW5kYXJkIGZvciBpbnRlcmNoYW5naW5nIGluZm9ybWF0aW9uLCBlc3BlY2lhbGx5IGluIHdlYiBzZXJ2aWNlcy4KKyAgICAgICAgICAgIEplcnNleXMgc3VwcG9ydHMgbG93IGxldmVsIGRhdGEgdHlwZXMgdXNlZCBmb3IgZGlyZWN0IG1hbmlwdWxhdGlvbiBhbmQgSkFYQiBYTUwgZW50aXRpZXMuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8c2VjdGlvbj4KKyAgICAgICAgICAgIDx0aXRsZSB4bWw6aWQ9InhtbC5sb3dsZXZlbCI+TG93IGxldmVsIFhNTCBzdXBwb3J0PC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgSmVyc2V5IGN1cnJlbnRseSBzdXBwb3J0IHNldmVyYWwgbG93IGxldmVsIGRhdGEgdHlwZXM6ICZqZGs3LlN0cmVhbVNvdXJjZTssICZqZGs3LlNBWFNvdXJjZTssICZqZGs3LkRPTVNvdXJjZTsKKyAgICAgICAgICAgICAgICBhbmQgJmpkazcub3JnLnczYy5kb20uRG9jdW1lbnQ7LiBZb3UgY2FuIHVzZSB0aGVzZSB0eXBlcyBhcyB0aGUgcmV0dXJuIHR5cGUgb3IgYXMgYSBtZXRob2QgKHJlc291cmNlKSBwYXJhbWV0ZXIuCisgICAgICAgICAgICAgICAgTGV0cyBzYXkgd2Ugd2FudCB0byB0ZXN0IHRoaXMgZmVhdHVyZSBhbmQgd2UgaGF2ZQorICAgICAgICAgICAgICAgIDxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuZ2l0aHViLmV4YW1wbGVzLnVyaTsvaGVsbG93b3JsZCc+aGVsbG93b3JsZCBleGFtcGxlPC9saW5rPiBhcyBhIHN0YXJ0aW5nIHBvaW50LgorICAgICAgICAgICAgICAgIEFsbCB3ZSBuZWVkIHRvIGRvIGlzIGFkZCBtZXRob2RzIChyZXNvdXJjZXMpIHdoaWNoIGNvbnN1bWVzIGFuZCBwcm9kdWNlcyBYTUwgYW5kIHR5cGVzIG1lbnRpb25lZCBhYm92ZSB3aWxsIGJlCisgICAgICAgICAgICAgICAgdXNlZC4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgPHRpdGxlPkxvdyBsZXZlbCBYTUwgdGVzdCAtIG1ldGhvZHMgYWRkZWQgdG8gPGxpdGVyYWw+SGVsbG9Xb3JsZFJlc291cmNlLmphdmE8L2xpdGVyYWw+PC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5AUE9TVAorQFBhdGgoIlN0cmVhbVNvdXJjZSIpCitwdWJsaWMgU3RyZWFtU291cmNlIGdldFN0cmVhbVNvdXJjZShTdHJlYW1Tb3VyY2Ugc3RyZWFtU291cmNlKSB7CisgICAgcmV0dXJuIHN0cmVhbVNvdXJjZTsKK30KKworQFBPU1QKK0BQYXRoKCJTQVhTb3VyY2UiKQorcHVibGljIFNBWFNvdXJjZSBnZXRTQVhTb3VyY2UoU0FYU291cmNlIHNheFNvdXJjZSkgeworICAgIHJldHVybiBzYXhTb3VyY2U7Cit9CisKK0BQT1NUCitAUGF0aCgiRE9NU291cmNlIikKK3B1YmxpYyBET01Tb3VyY2UgZ2V0RE9NU291cmNlKERPTVNvdXJjZSBkb21Tb3VyY2UpIHsKKyAgICByZXR1cm4gZG9tU291cmNlOworfQorCitAUE9TVAorQFBhdGgoIkRvY3VtZW50IikKK3B1YmxpYyBEb2N1bWVudCBnZXREb2N1bWVudChEb2N1bWVudCBkb2N1bWVudCkgeworICAgIHJldHVybiBkb2N1bWVudDsKK308L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBCb3RoICZsaXQuamF4cnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOyBhbmQgJmxpdC5qYXhycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7IGFyZSB1c2VkIGluIHRoaXMgY2FzZSwgYWxsIHdlIG5lZWQgaXMKKyAgICAgICAgICAgICAgICBhICZsaXQuaHR0cC5QT1NUOyByZXF1ZXN0IHdpdGggc29tZSBYTUwgZG9jdW1lbnQgYXMgYSByZXF1ZXN0IGVudGl0eS4gVG8ga2VlcCB0aGlzIGFzIHNpbXBsZSBhcyBwb3NzaWJsZSBvbmx5IHJvb3QKKyAgICAgICAgICAgICAgICBlbGVtZW50IHdpdGggbm8gY29udGVudCB3aWxsIGJlIHNlbnQ6IDxsaXRlcmFsPiImbHQ7dGVzdCAvJmd0OyI8L2xpdGVyYWw+LiBZb3UgY2FuIGNyZWF0ZSBKQVgtUlMgY2xpZW50IHRvIGRvIHRoYXQKKyAgICAgICAgICAgICAgICBvciB1c2Ugc29tZSBvdGhlciB0b29sLCBmb3IgZXhhbXBsZSA8bGl0ZXJhbD5jdXJsPC9saXRlcmFsPjoKKyAgICAgICAgICAgICAgICA8aW5mb3JtYWxleGFtcGxlPgorICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+Y3VybCAtdiBodHRwOi8vbG9jYWxob3N0OjgwODAvYmFzZS9oZWxsb3dvcmxkL1N0cmVhbVNvdXJjZSAtZCAiJmx0O3Rlc3QvJmd0OyI8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvaW5mb3JtYWxleGFtcGxlPgorICAgICAgICAgICAgICAgIFlvdSBzaG91bGQgZ2V0IGV4YWN0bHkgdGhlIHNhbWUgWE1MIGZyb20gb3VyIHNlcnZpY2UgYXMgaXMgcHJlc2VudCBpbiB0aGUgcmVxdWVzdDsgaW4gdGhpcyBjYXNlLCBYTUwgaGVhZGVycyBhcmUKKyAgICAgICAgICAgICAgICBhZGRlZCB0byByZXNwb25zZSBidXQgY29udGVudCBzdGF5cy4gRmVlbCBmcmVlIHRvIGl0ZXJhdGUgdGhyb3VnaCBhbGwgcmVzb3VyY2VzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICA8dGl0bGUgeG1sOmlkPSJ4bWwuamF4Yi54bWxSb290RWxlbWVudCI+R2V0dGluZyBzdGFydGVkIHdpdGggSkFYQjwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEdvb2Qgc3RhcnQgZm9yIHBlb3BsZSB3aGljaCBhbHJlYWR5IGhhdmUgc29tZSBleHBlcmllbmNlIHdpdGggSkFYQiBhbm5vdGF0aW9ucworICAgICAgICAgICAgICAgIGlzIDxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuZ2l0aHViLmV4YW1wbGVzLnVyaTsvamF4Yic+SkFYQiBleGFtcGxlPC9saW5rPi4gWW91IGNhbiBzZWUgdmFyaW91cyB1c2UtY2FzZXMgdGhlcmUuCisgICAgICAgICAgICAgICAgVGhpcyB0ZXh0IGlzIG1haW5seSBtZWFudCBmb3IgdGhvc2Ugd2hvIGRvbid0IGhhdmUgcHJpb3IgZXhwZXJpZW5jZSB3aXRoIEpBWEIuIERvbid0IGV4cGVjdCB0aGF0IGFsbCBwb3NzaWJsZQorICAgICAgICAgICAgICAgIGFubm90YXRpb25zIGFuZCB0aGVpciBjb21iaW5hdGlvbnMgd2lsbCBiZSBjb3ZlcmVkIGluIHRoaXMgY2hhcHRlciwKKyAgICAgICAgICAgICAgICA8bGluayB4bGluazpocmVmPSdodHRwOi8vamF4Yi5qYXZhLm5ldCc+SkFYQiAoSlNSIDIyMiBpbXBsZW1lbnRhdGlvbik8L2xpbms+CisgICAgICAgICAgICAgICAgaXMgcHJldHR5IGNvbXBsZXggYW5kIGNvbXByZWhlbnNpdmUuIEJ1dCBpZiB5b3UganVzdCB3YW50IHRvIGtub3cgaG93IHlvdSBjYW4gaW50ZXJjaGFuZ2UgWE1MIG1lc3NhZ2VzIHdpdGggeW91cgorICAgICAgICAgICAgICAgIFJFU1Qgc2VydmljZSwgeW91IGFyZSBsb29raW5nIGF0IHRoZSByaWdodCBjaGFwdGVyLgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBMZXRzIHN0YXJ0IHdpdGggc2ltcGxlIGV4YW1wbGUuIExldHMgc2F5IHdlIGhhdmUgY2xhc3MgPGxpdGVyYWw+UGxhbmV0PC9saXRlcmFsPiBhbmQgc2VydmljZSB3aGljaCBwcm9kdWNlcworICAgICAgICAgICAgICAgICJQbGFuZXRzIi4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgPHRpdGxlPlBsYW5ldCBjbGFzczwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+QFhtbFJvb3RFbGVtZW50CitwdWJsaWMgY2xhc3MgUGxhbmV0IHsKKyAgICBwdWJsaWMgaW50IGlkOworICAgIHB1YmxpYyBTdHJpbmcgbmFtZTsKKyAgICBwdWJsaWMgZG91YmxlIHJhZGl1czsKK308L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorCisgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICA8dGl0bGU+UmVzb3VyY2UgY2xhc3M8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPkBQYXRoKCJwbGFuZXQiKQorcHVibGljIGNsYXNzIFJlc291cmNlIHsKKworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTCkKKyAgICBwdWJsaWMgUGxhbmV0IGdldFBsYW5ldCgpIHsKKyAgICAgICAgZmluYWwgUGxhbmV0IHBsYW5ldCA9IG5ldyBQbGFuZXQoKTsKKworICAgICAgICBwbGFuZXQuaWQgPSAxOworICAgICAgICBwbGFuZXQubmFtZSA9ICJFYXJ0aCI7CisgICAgICAgIHBsYW5ldC5yYWRpdXMgPSAxLjA7CisKKyAgICAgICAgcmV0dXJuIHBsYW5ldDsKKyAgICB9Cit9PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgWW91IGNhbiBzZWUgdGhlcmUgaXMgc29tZSBleHRyYSBhbm5vdGF0aW9uIGRlY2xhcmVkIG9uIDxsaXRlcmFsPlBsYW5ldDwvbGl0ZXJhbD4gY2xhc3MsIHBhcnRpY3VsYXJseQorICAgICAgICAgICAgICAgICZqYXhiLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7LiBUaGlzIGlzIGFuIEpBWEIgYW5ub3RhdGlvbiB3aGljaCBtYXBzIGphdmEgY2xhc3NlcworICAgICAgICAgICAgICAgIHRvIFhNTCBlbGVtZW50cy4gV2UgZG9uJ3QgbmVlZCB0byBzcGVjaWZ5IGFueXRoaW5nIGVsc2UsIGJlY2F1c2UgPGxpdGVyYWw+UGxhbmV0PC9saXRlcmFsPiBpcyB2ZXJ5IHNpbXBsZSBjbGFzcworICAgICAgICAgICAgICAgIGFuZCBhbGwgZmllbGRzIGFyZSBwdWJsaWMuIEluIHRoaXMgY2FzZSwgWE1MIGVsZW1lbnQgbmFtZSB3aWxsIGJlIGRlcml2ZWQgZnJvbSB0aGUgY2xhc3MgbmFtZSBvcgorICAgICAgICAgICAgICAgIHlvdSBjYW4gc2V0IHRoZSBuYW1lIHByb3BlcnR5OiA8bGl0ZXJhbD5AWG1sUm9vdEVsZW1lbnQobmFtZT0ieW91ck5hbWUiKTwvbGl0ZXJhbD4uCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIE91ciByZXNvdXJjZSBjbGFzcyB3aWxsIHJlc3BvbmQgdG8gPGxpdGVyYWw+R0VUIC9wbGFuZXQ8L2xpdGVyYWw+IHdpdGgKKworICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0ieG1sIj4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8mZ3Q7CismbHQ7cGxhbmV0Jmd0OworICAgICZsdDtpZCZndDsxJmx0Oy9pZCZndDsKKyAgICAmbHQ7bmFtZSZndDtFYXJ0aCZsdDsvbmFtZSZndDsKKyAgICAmbHQ7cmFkaXVzJmd0OzEuMCZsdDsvcmFkaXVzJmd0OworJmx0Oy9wbGFuZXQmZ3Q7PC9wcm9ncmFtbGlzdGluZz4KKworICAgICAgICAgICAgICAgIHdoaWNoIG1pZ2h0IGJlIGV4YWN0bHkgd2hhdCB3ZSB3YW50Li4uIG9yIG5vdC4gT3Igd2UgbWlnaHQgbm90IHJlYWxseSBjYXJlLCBiZWNhdXNlIHdlCisgICAgICAgICAgICAgICAgY2FuIHVzZSBKQVgtUlMgY2xpZW50IGZvciBtYWtpbmcgcmVxdWVzdHMgdG8gdGhpcyByZXNvdXJjZSBhbmQgdGhpcyBpcyBlYXN5IGFzOgorICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0idW5udW1iZXJlZCI+CisgICAgICAgICAgICAgICAgICAgIFBsYW5ldCBwbGFuZXQgPSB3ZWJUYXJnZXQucGF0aCgicGxhbmV0IikucmVxdWVzdChNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MX1RZUEUpLmdldChQbGFuZXQuY2xhc3MpOworICAgICAgICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgVGhlcmUgaXMgcHJlLWNyZWF0ZWQgJmxpdC5qYXhycy5jbGllbnQuV2ViVGFyZ2V0OyBvYmplY3Qgd2hpY2ggcG9pbnRzIHRvIG91ciBhcHBsaWNhdGlvbnMgY29udGV4dCByb290IGFuZAorICAgICAgICAgICAgICAgIHdlIHNpbXBseSBhZGQgcGF0aCAoaW4gb3VyIGNhc2UgaXRzIDxsaXRlcmFsPnBsYW5ldDwvbGl0ZXJhbD4pLCBhY2NlcHQgaGVhZGVyIChub3QgbWFuZGF0b3J5LCBidXQgc2VydmljZSBjb3VsZAorICAgICAgICAgICAgICAgIHByb3ZpZGUgZGlmZmVyZW50IGNvbnRlbnQgYmFzZWQgb24gdGhpcyBoZWFkZXI7IGZvciBleGFtcGxlIDxsaXRlcmFsPnRleHQvaHRtbDwvbGl0ZXJhbD4gY2FuIGJlIHNlcnZlZCBmb3Igd2ViCisgICAgICAgICAgICAgICAgYnJvd3NlcnMpIGFuZCBhdCB0aGUgZW5kIHdlIHNwZWNpZnkgdGhhdCB3ZSBhcmUgZXhwZWN0aW5nIDxsaXRlcmFsPlBsYW5ldDwvbGl0ZXJhbD4gY2xhc3MgdmlhICZsaXQuaHR0cC5HRVQ7CisgICAgICAgICAgICAgICAgcmVxdWVzdC4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhlcmUgbWF5IGJlIG5lZWQgZm9yIG5vdCBqdXN0IHByb2R1Y2luZyBYTUwsIHdlIG1pZ2h0IHdhbnQgdG8gY29uc3VtZSBpdCBhcyB3ZWxsLgorCisgICAgICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5NZXRob2QgZm9yIGNvbnN1bWluZyBQbGFuZXQ8L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5AUE9TVAorQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUwpCitwdWJsaWMgdm9pZCBzZXRQbGFuZXQoUGxhbmV0IHBsYW5ldCkgeworICAgIFN5c3RlbS5vdXQucHJpbnRsbigic2V0UGxhbmV0ICIgKyBwbGFuZXQpOworfTwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorCisgICAgICAgICAgICAgICAgQWZ0ZXIgdmFsaWQgcmVxdWVzdCBpcyBtYWRlLCBzZXJ2aWNlIHdpbGwgcHJpbnQgb3V0IHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiA8bGl0ZXJhbD5QbGFuZXQ8L2xpdGVyYWw+LCB3aGljaCBjYW4KKyAgICAgICAgICAgICAgICBsb29rIGxpa2UgPGxpdGVyYWw+UGxhbmV0e2lkPTIsIG5hbWU9J01hcnMnLCByYWRpdXM9MS41MX08L2xpdGVyYWw+LiBXaXRoIEpBWC1SUyBjbGllbnQgeW91IGNhbiBkbzoKKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9InVubnVtYmVyZWQiPgorICAgICAgICAgICAgICAgICAgICB3ZWJUYXJnZXQucGF0aCgicGxhbmV0IikucmVxdWVzdCgpLnBvc3QoRW50aXR5LnhtbChwbGFuZXQpKTsKKyAgICAgICAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBJZiB0aGVyZSBpcyBhIG5lZWQgZm9yIHNvbWUgb3RoZXIgKG5vbiBkZWZhdWx0KSBYTUwgcmVwcmVzZW50YXRpb24sIG90aGVyIEpBWEIgYW5ub3RhdGlvbnMgd291bGQKKyAgICAgICAgICAgICAgICBuZWVkIHRvIGJlIHVzZWQuIFRoaXMgcHJvY2VzcyBpcyB1c3VhbGx5IHNpbXBsaWZpZWQgYnkgZ2VuZXJhdGluZyBqYXZhIHNvdXJjZSBmcm9tIFhNTCBTY2hlbWEgd2hpY2ggaXMKKyAgICAgICAgICAgICAgICBkb25lIGJ5IDxsaXRlcmFsPnhqYzwvbGl0ZXJhbD4gd2hpY2ggaXMgWE1MIHRvIGphdmEgY29tcGlsZXIgYW5kIGl0IGlzIHBhcnQgb2YgSkFYQi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgIDxzZWN0aW9uPgorICAgICAgICAgICAgPHRpdGxlIHhtbDppZD0ieG1sLmphYnguSkFYQkVsZW1lbnQiPlBPSk9zPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgU29tZXRpbWVzIHlvdSBjYW4ndCAvIGRvbid0IHdhbnQgdG8gYWRkIEpBWEIgYW5ub3RhdGlvbnMgdG8gc291cmNlIGNvZGUgYW5kIHlvdSBzdGlsbCB3YW50IHRvIGhhdmUgcmVzb3VyY2VzCisgICAgICAgICAgICAgICAgY29uc3VtaW5nIGFuZCBwcm9kdWNpbmcgWE1MIHJlcHJlc2VudGF0aW9uIG9mIHlvdXIgY2xhc3Nlcy4gSW4gdGhpcyBjYXNlLCAmamF4Yi5KQVhCRWxlbWVudDsgY2xhc3Mgc2hvdWxkIGhlbHAKKyAgICAgICAgICAgICAgICB5b3UuIExldCdzIHJlZG8gcGxhbmV0IHJlc291cmNlIGJ1dCB0aGlzIHRpbWUgd2Ugd29uJ3QgaGF2ZSBhbiAmamF4Yi5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OyBhbm5vdGF0aW9uIG9uCisgICAgICAgICAgICAgICAgPGxpdGVyYWw+UGxhbmV0PC9saXRlcmFsPiBjbGFzcy4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgPHRpdGxlPlJlc291cmNlIGNsYXNzIC0gSkFYQkVsZW1lbnQ8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPkBQYXRoKCJwbGFuZXQiKQorcHVibGljIGNsYXNzIFJlc291cmNlIHsKKworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTCkKKyAgICBwdWJsaWMgSkFYQkVsZW1lbnQmbHQ7UGxhbmV0Jmd0OyBnZXRQbGFuZXQoKSB7CisgICAgICAgIFBsYW5ldCBwbGFuZXQgPSBuZXcgUGxhbmV0KCk7CisKKyAgICAgICAgcGxhbmV0LmlkID0gMTsKKyAgICAgICAgcGxhbmV0Lm5hbWUgPSAiRWFydGgiOworICAgICAgICBwbGFuZXQucmFkaXVzID0gMS4wOworCisgICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQmbHQ7UGxhbmV0Jmd0OyhuZXcgUU5hbWUoInBsYW5ldCIpLCBQbGFuZXQuY2xhc3MsIHBsYW5ldCk7CisgICAgfQorCisgICAgQFBPU1QKKyAgICBAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTCkKKyAgICBwdWJsaWMgdm9pZCBzZXRQbGFuZXQoSkFYQkVsZW1lbnQmbHQ7UGxhbmV0Jmd0OyBwbGFuZXQpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJzZXRQbGFuZXQgIiArIHBsYW5ldC5nZXRWYWx1ZSgpKTsKKyAgICB9Cit9PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgQXMgeW91IGNhbiBzZWUsIGV2ZXJ5dGhpbmcgaXMgbGl0dGxlIG1vcmUgY29tcGxpY2F0ZWQgd2l0aCAmbGl0LmpheGIuSkFYQkVsZW1lbnQ7LiBUaGlzIGlzIGJlY2F1c2Ugbm93IHlvdSBuZWVkCisgICAgICAgICAgICAgICAgdG8gZXhwbGljaXRseSBzZXQgZWxlbWVudCBuYW1lIGZvciA8bGl0ZXJhbD5QbGFuZXQ8L2xpdGVyYWw+IGNsYXNzIFhNTCByZXByZXNlbnRhdGlvbi4gQ2xpZW50IHNpZGUgaXMgZXZlbiBtb3JlCisgICAgICAgICAgICAgICAgY29tcGxpY2F0ZWQgdGhhbiBzZXJ2ZXIgc2lkZSBiZWNhdXNlIHlvdSBjYW4ndCBkbyA8bGl0ZXJhbD5KQVhCRWxlbWVudCZsdDtQbGFuZXQmZ3Q7PC9saXRlcmFsPiBzbyBKQVgtUlMgY2xpZW50CisgICAgICAgICAgICAgICAgQVBJIHByb3ZpZGVzIHdheSBob3cgdG8gd29ya2Fyb3VuZCBpdCBieSBkZWNsYXJpbmcgc3ViY2xhc3Mgb2YgJmxpdC5qYXhycy5jb3JlLkdlbmVyaWNUeXBlOy4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgPHRpdGxlPkNsaWVudCBzaWRlIC0gSkFYQkVsZW1lbnQ8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPi8vIEdFVAorR2VuZXJpY1R5cGUmbHQ7SkFYQkVsZW1lbnQmbHQ7UGxhbmV0Jmd0OyZndDsgcGxhbmV0VHlwZSA9IG5ldyBHZW5lcmljVHlwZSZsdDtKQVhCRWxlbWVudCZsdDtQbGFuZXQmZ3Q7Jmd0OygpIHt9OworCitQbGFuZXQgcGxhbmV0ID0gKFBsYW5ldCkgd2ViVGFyZ2V0LnBhdGgoInBsYW5ldCIpLnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTF9UWVBFKS5nZXQocGxhbmV0VHlwZSkuZ2V0VmFsdWUoKTsKK1N5c3RlbS5vdXQucHJpbnRsbigiIyMjICIgKyBwbGFuZXQpOworCisvLyBQT1NUCitwbGFuZXQgPSBuZXcgUGxhbmV0KCk7CisKKy8vIC4uLgorCit3ZWJUYXJnZXQucGF0aCgicGxhbmV0IikucG9zdChuZXcgSkFYQkVsZW1lbnQmbHQ7UGxhbmV0Jmd0OyhuZXcgUU5hbWUoInBsYW5ldCIpLCBQbGFuZXQuY2xhc3MsIHBsYW5ldCkpOzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICA8c2VjdGlvbj4KKyAgICAgICAgICAgIDx0aXRsZSB4bWw6aWQ9InhtbC5qYXhiLkpBWEJDb250ZXh0Ij5Vc2luZyBjdXN0b20gSkFYQkNvbnRleHQ8L3RpdGxlPgorCisgICAgICAgICAgICA8cGFyYT5JbiBzb21lIHNjZW5hcmlvcyB5b3UgY2FuIHRha2UgYWR2YW50YWdlIG9mIHVzaW5nIGN1c3RvbSAmamF4Yi5KQVhCQ29udGV4dDsuIENyZWF0aW5nCisgICAgICAgICAgICAgICAgJmxpdC5qYXhiLkpBWEJDb250ZXh0OyBpcyBhbiBleHBlbnNpdmUgb3BlcmF0aW9uIGFuZCBpZiB5b3UgYWxyZWFkeSBoYXZlIG9uZSBjcmVhdGVkLCBzYW1lIGluc3RhbmNlCisgICAgICAgICAgICAgICAgY2FuIGJlIHVzZWQgYnkgSmVyc2V5LiBPdGhlciBwb3NzaWJsZSB1c2UtY2FzZSBmb3IgdGhpcyBpcyB3aGVuIHlvdSBuZWVkIHRvIHNldCBzb21lIHNwZWNpZmljIHRoaW5ncworICAgICAgICAgICAgICAgIHRvICZsaXQuamF4Yi5KQVhCQ29udGV4dDssIGZvciBleGFtcGxlIHRvIHNldCBhIGRpZmZlcmVudCBjbGFzcyBsb2FkZXIuCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgIDx0aXRsZT5QbGFuZXRKQVhCQ29udGV4dFByb3ZpZGVyPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5AUHJvdmlkZXIKK3B1YmxpYyBjbGFzcyBQbGFuZXRKQVhCQ29udGV4dFByb3ZpZGVyIGltcGxlbWVudHMgQ29udGV4dFJlc29sdmVyJmx0O0pBWEJDb250ZXh0Jmd0OyB7CisgICAgcHJpdmF0ZSBKQVhCQ29udGV4dCBjb250ZXh0ID0gbnVsbDsKKworICAgIHB1YmxpYyBKQVhCQ29udGV4dCBnZXRDb250ZXh0KENsYXNzJmx0Oz8mZ3Q7IHR5cGUpIHsKKyAgICAgICAgaWYgKHR5cGUgIT0gUGxhbmV0LmNsYXNzKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gd2UgZG9uJ3Qgc3VwcG9ydCBub3RoaW5nIGVsc2UgdGhhbiBQbGFuZXQKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29udGV4dCA9IEpBWEJDb250ZXh0Lm5ld0luc3RhbmNlKFBsYW5ldC5jbGFzcyk7CisgICAgICAgICAgICB9IGNhdGNoIChKQVhCRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBsb2cgd2FybmluZy9lcnJvcjsgbnVsbCB3aWxsIGJlIHJldHVybmVkIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoaXMKKyAgICAgICAgICAgICAgICAvLyBwcm92aWRlciB3b24ndC9jYW4ndCBiZSB1c2VkLgorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNvbnRleHQ7CisgICAgfQorfTwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFNhbXBsZSBhYm92ZSBzaG93cyBzaW1wbGUgJmxpdC5qYXhiLkpBWEJDb250ZXh0OyBjcmVhdGlvbiwgYWxsIHlvdSBuZWVkIHRvIGRvIGlzIHB1dAorICAgICAgICAgICAgICAgIHRoaXMgJmxpdC5qYXhycy5leHQuUHJvdmlkZXI7IGFubm90YXRlZCBjbGFzcyBzb21ld2hlcmUgd2hlcmUgSmVyc2V5IGNhbiBmaW5kIGl0LiBVc2VycyBzb21ldGltZXMKKyAgICAgICAgICAgICAgICBoYXZlIHByb2JsZW1zIHdpdGggdXNpbmcgcHJvdmlkZXIgY2xhc3NlcyBvbiBjbGllbnQgc2lkZSwgc28ganVzdCB0byByZW1pbmRlciAtIHlvdSBoYXZlIHRvCisgICAgICAgICAgICAgICAgZGVjbGFyZSB0aGVtIGluIHRoZSBjbGllbnQgY29uZmlnIChjbGllbnQgZG9lcyBub3QgZG8gYW55dGhpbmcgbGlrZSBwYWNrYWdlIHNjYW5uaW5nIGRvbmUgYnkgc2VydmVyKS4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgPHRpdGxlPlVzaW5nIFByb3ZpZGVyIHdpdGggSkFYLVJTIGNsaWVudDwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+CitDbGllbnRDb25maWcgY29uZmlnID0gbmV3IENsaWVudENvbmZpZygpOworY29uZmlnLnJlZ2lzdGVyKFBsYW5ldEpBWEJDb250ZXh0UHJvdmlkZXIuY2xhc3MpOworCitDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoY29uZmlnKTsKKyAgICAgICAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICA8dGl0bGU+TU9YeTwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBJZiB5b3Ugd2FudCB0byB1c2UgPGxpbmsgeGxpbms6aHJlZj0naHR0cDovL3d3dy5lY2xpcHNlLm9yZy9lY2xpcHNlbGluay9tb3h5LnBocCc+TU9YeTwvbGluaz4gYXMgeW91ciBKQVhCCisgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gaW5zdGVhZCBvZiBKQVhCIFJJIHlvdSBoYXZlIHR3byBvcHRpb25zLiBZb3UgY2FuIGVpdGhlciB1c2UgdGhlIHN0YW5kYXJkIEpBWEIgbWVjaGFuaXNtcyB0byBkZWZpbmUKKyAgICAgICAgICAgICAgICB0aGUgPGxpdGVyYWw+SkFYQkNvbnRleHRGYWN0b3J5PC9saXRlcmFsPiBmcm9tIHdoaWNoIGEgJmxpdC5qYXhiLkpBWEJDb250ZXh0OyBpbnN0YW5jZSB3b3VsZCBiZSBvYnRhaW5lZCAoZm9yIG1vcmUKKyAgICAgICAgICAgICAgICBvbiB0aGlzIHRvcGljLCByZWFkIEphdmFEb2Mgb24gJmpheGIuSkFYQkNvbnRleHQ7KSBvciB5b3UgY2FuIGFkZCA8bGl0ZXJhbD5qZXJzZXktbWVkaWEtbW94eTwvbGl0ZXJhbD4gbW9kdWxlIHRvCisgICAgICAgICAgICAgICAgeW91ciBwcm9qZWN0IGFuZCByZWdpc3Rlci9jb25maWd1cmUKKyAgICAgICAgICAgICAgICA8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvbW94eS94bWwvTW94eVhtbEZlYXR1cmUuaHRtbCc+TW94eVhtbEZlYXR1cmU8L2xpbms+IGNsYXNzL2luc3RhbmNlIGluCisgICAgICAgICAgICAgICAgdGhlICZqYXhycy5jb3JlLkNvbmZpZ3VyYWJsZTsuCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgIDx0aXRsZT5BZGQgPGxpdGVyYWw+amVyc2V5LW1lZGlhLW1veHk8L2xpdGVyYWw+IGRlcGVuZGVuY3kuPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9InhtbCI+Jmx0O2RlcGVuZGVuY3kmZ3Q7CisgICAgJmx0O2dyb3VwSWQmZ3Q7b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEmbHQ7L2dyb3VwSWQmZ3Q7CisgICAgJmx0O2FydGlmYWN0SWQmZ3Q7amVyc2V5LW1lZGlhLW1veHkmbHQ7L2FydGlmYWN0SWQmZ3Q7CisgICAgJmx0O3ZlcnNpb24mZ3Q7JnZlcnNpb247Jmx0Oy92ZXJzaW9uJmd0OworJmx0Oy9kZXBlbmRlbmN5Jmd0OzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisKKyAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgIDx0aXRsZT5SZWdpc3RlciB0aGUgPGxpdGVyYWw+TW94eVhtbEZlYXR1cmU8L2xpdGVyYWw+IGNsYXNzLjwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+ZmluYWwgUmVzb3VyY2VDb25maWcgY29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKCkKKyAgICAucGFja2FnZXMoIm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnhtbG1veHkiKQorICAgIC5yZWdpc3RlcihNb3h5WG1sRmVhdHVyZS5jbGFzcyk7PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKworICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgPHRpdGxlPkNvbmZpZ3VyZSBhbmQgcmVnaXN0ZXIgYW4gPGxpdGVyYWw+TW94eVhtbEZlYXR1cmU8L2xpdGVyYWw+IGluc3RhbmNlLjwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+Ly8gQ29uZmlndXJlIFByb3BlcnRpZXMuCitmaW5hbCBNYXAmbHQ7U3RyaW5nLCBPYmplY3QmZ3Q7IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcCZsdDtTdHJpbmcsIE9iamVjdCZndDsoKTsKKy8vIC4uLgorCisvLyBPYnRhaW4gYSBDbGFzc0xvYWRlciB5b3Ugd2FudCB0byB1c2UuCitmaW5hbCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCk7CisKK2ZpbmFsIFJlc291cmNlQ29uZmlnIGNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZygpCisgICAgLnBhY2thZ2VzKCJvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy54bWxtb3h5IikKKyAgICAucmVnaXN0ZXIobmV3IE1veHlYbWxGZWF0dXJlKAorICAgICAgICBwcm9wZXJ0aWVzLAorICAgICAgICBjbGFzc0xvYWRlciwKKyAgICAgICAgdHJ1ZSwgLy8gRmxhZyB0byBkZXRlcm1pbmUgd2hldGhlciBlY2xpcHNlbGluay1veG0ueG1sIGZpbGUgc2hvdWxkIGJlIHVzZWQgZm9yIGxvb2t1cC4KKyAgICAgICAgQ3VzdG9tQ2xhc3NBLmNsYXNzLCBDdXN0b21DbGFzc0IuY2xhc3MgIC8vIENsYXNzZXMgdG8gYmUgYm91bmQuCisgICAgKSk7PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIHhtbDppZD0ibXVsdGlwYXJ0Ij4KKyAgICAgICAgPHRpdGxlPk11bHRpcGFydDwvdGl0bGU+CisgICAgICAgIDx0aXRsZWFiYnJldiBpZD0ibXVsdGlwYXJ0LnNob3J0Ij5NdWx0aXBhcnQ8L3RpdGxlYWJicmV2PgorCisgICAgICAgIDxzZWN0aW9uPgorICAgICAgICAgICAgPHRpdGxlPk92ZXJ2aWV3PC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhlIGNsYXNzZXMgaW4gdGhpcyBtb2R1bGUgcHJvdmlkZSBhbiBpbnRlZ3JhdGlvbiBvZiA8bGl0ZXJhbD5tdWx0aXBhcnQvKjwvbGl0ZXJhbD4gcmVxdWVzdCBhbmQgcmVzcG9uc2UgYm9kaWVzCisgICAgICAgICAgICAgICAgaW4gYSBKQVgtUlMgcnVudGltZSBlbnZpcm9ubWVudC4gVGhlIHNldCBvZiByZWdpc3RlcmVkIHByb3ZpZGVycyBpcyBsZXZlcmFnZWQsIGluIHRoYXQgdGhlIGNvbnRlbnQgdHlwZSBmb3IgYSBib2R5CisgICAgICAgICAgICAgICAgcGFydCBvZiBzdWNoIGEgbWVzc2FnZSByZXVzZXMgdGhlIHNhbWUgJmxpdC5qYXhycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7LyZsaXQuamF4cnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9ucyBhcyB3b3VsZCBiZSB1c2VkIGZvciB0aGF0IGNvbnRlbnQgdHlwZSBhcyBhIHN0YW5kYWxvbmUgZW50aXR5LgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgZm9sbG93aW5nIGxpc3Qgb2YgZ2VuZXJhbCBNSU1FIE11bHRpUGFydCBmZWF0dXJlcyBpcyBjdXJyZW50bHkgc3VwcG9ydGVkOgorCisgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIDxsaXRlcmFsPk1JTUUtVmVyc2lvbjogMS4wPC9saXRlcmFsPiBIVFRQIGhlYWRlciBpcyBpbmNsdWRlZCBvbiBnZW5lcmF0ZWQgcmVzcG9uc2VzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0IGlzIGFjY2VwdGVkLCBidXQgbm90IHJlcXVpcmVkLCBvbiBwcm9jZXNzZWQgcmVxdWVzdHMuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEgJmpheHJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcjsgaW1wbGVtZW50YXRpb24gZm9yIGNvbnN1bWluZyBNSU1FIE11bHRpUGFydCBlbnRpdGllcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQSAmbGl0LmpheHJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsgaW1wbGVtZW50YXRpb24gZm9yIHByb2R1Y2luZyBNSU1FIE11bHRpUGFydCBlbnRpdGllcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgYXBwcm9wcmlhdGUgJmxpdC5qYXhycy5leHQuUHJvdmlkZXI7IGlzIHVzZWQgdG8gc2VyaWFsaXplIGVhY2ggYm9keSBwYXJ0LCBiYXNlZCBvbiBpdHMgbWVkaWEgdHlwZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgY3JlYXRpb24gb2YgYW4gYXBwcm9wcmlhdGUgPGxpdGVyYWw+Ym91bmRhcnk8L2xpdGVyYWw+IHBhcmFtZXRlciBvbiBhIGdlbmVyYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPkNvbnRlbnQtVHlwZTwvbGl0ZXJhbD4gaGVhZGVyLCBpZiBub3QgYWxyZWFkeSBwcmVzZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiByZWZlciB0byAmamVyc2V5Lm1lZGlhLm11bHRpcGFydDsuCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxzZWN0aW9uPgorICAgICAgICAgICAgICAgIDx0aXRsZT5EZXBlbmRlbmN5PC90aXRsZT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUbyB1c2UgbXVsdGlwYXJ0IGZlYXR1cmVzIHlvdSBuZWVkIHRvIGFkZCAmbGl0LmplcnNleS1tZWRpYS1tdWx0aXBhcnQ7IG1vZHVsZSB0byB5b3VyICZsaXQucG9tLnhtbDsgZmlsZToKKworICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9InhtbCI+Jmx0O2RlcGVuZGVuY3kmZ3Q7CisgICAgJmx0O2dyb3VwSWQmZ3Q7b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEmbHQ7L2dyb3VwSWQmZ3Q7CisgICAgJmx0O2FydGlmYWN0SWQmZ3Q7amVyc2V5LW1lZGlhLW11bHRpcGFydCZsdDsvYXJ0aWZhY3RJZCZndDsKKyAgICAmbHQ7dmVyc2lvbiZndDsmdmVyc2lvbjsmbHQ7L3ZlcnNpb24mZ3Q7CismbHQ7L2RlcGVuZGVuY3kmZ3Q7PC9wcm9ncmFtbGlzdGluZz4KKworICAgICAgICAgICAgICAgICAgICBJZiB5b3UncmUgbm90IHVzaW5nIE1hdmVuIG1ha2Ugc3VyZSB0byBoYXZlIGFsbCBuZWVkZWQgZGVwZW5kZW5jaWVzIChzZWUgJmplcnNleS5tZWRpYS5tdWx0aXBhcnQuZGVwcy5saW5rOykgb24gdGhlCisgICAgICAgICAgICAgICAgICAgIGNsYXNzLXBhdGguCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgICAgICA8c2VjdGlvbj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+UmVnaXN0cmF0aW9uPC90aXRsZT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBCZWZvcmUgeW91IGNhbiB1c2UgY2FwYWJpbGl0aWVzIG9mIHRoZSAmbGl0LmplcnNleS1tZWRpYS1tdWx0aXBhcnQ7IG1vZHVsZSBpbiB5b3VyIGNsaWVudC9zZXJ2ZXIgY29kZSwgeW91CisgICAgICAgICAgICAgICAgICAgIG5lZWQgdG8gcmVnaXN0ZXIgJmplcnNleS5tZWRpYS5tdWx0aXBhcnQuTXVsdGlQYXJ0RmVhdHVyZTsuCisKKyAgICAgICAgICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGl0bGU+QnVpbGRpbmcgY2xpZW50IHdpdGggTXVsdGlQYXJ0IGZlYXR1cmUgZW5hYmxlZC48L3RpdGxlPgorCisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiPmZpbmFsIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0J1aWxkZXIoKQorICAgIC5yZWdpc3RlcihNdWx0aVBhcnRGZWF0dXJlLmNsYXNzKQorICAgIC5idWlsZCgpOzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKworICAgICAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5DcmVhdGluZyBKQVgtUlMgYXBwbGljYXRpb24gd2l0aCBNdWx0aVBhcnQgZmVhdHVyZSBlbmFibGVkLjwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSI+Ly8gQ3JlYXRlIEpBWC1SUyBhcHBsaWNhdGlvbi4KK2ZpbmFsIEFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uID0gbmV3IFJlc291cmNlQ29uZmlnKCkKKyAgICAucGFja2FnZXMoIm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLm11bHRpcGFydCIpCisgICAgLnJlZ2lzdGVyKE11bHRpUGFydEZlYXR1cmUuY2xhc3MpPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICAgICAgPHRpdGxlPkV4YW1wbGVzPC90aXRsZT4KKworICAgICAgICAgICAgICAgIDxwYXJhPkplcnNleSBwcm92aWRlcyBhCisgICAgICAgICAgICAgICAgICAgIDxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuZ2l0aHViLmV4YW1wbGVzLnVyaTsvbXVsdGlwYXJ0LXdlYmFwcCc+TXVsdGlwYXJ0IFdlYiBBcHBsaWNhdGlvbiBFeGFtcGxlPC9saW5rPgorICAgICAgICAgICAgICAgICAgICBvbiBob3cgdG8gdXNlIG11bHRpcGFydCBmZWF0dXJlcy48L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICA8c2VjdGlvbj4KKyAgICAgICAgICAgIDx0aXRsZT5DbGllbnQ8L3RpdGxlPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAmamVyc2V5Lm1lZGlhLm11bHRpcGFydC5NdWx0aVBhcnQ7IGNsYXNzIChvciBpdCdzIHN1YmNsYXNzZXMpIGNhbiBiZSB1c2VkIGFzIGFuIGVudHJ5IHBvaW50IHRvIHVzaW5nCisgICAgICAgICAgICAgICAgJmxpdC5qZXJzZXktbWVkaWEtbXVsdGlwYXJ0OyBtb2R1bGUgb24gdGhlIGNsaWVudCBzaWRlLiBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYQorICAgICAgICAgICAgICAgIDxsaW5rIHhsaW5rOmhyZWY9JyZ3aWtpcGVkaWEudXJpO01JTUUjTXVsdGlwYXJ0X21lc3NhZ2VzJz5NSU1FIG11bHRpcGFydCBtZXNzYWdlPC9saW5rPiBhbmQgaXMgYWJsZQorICAgICAgICAgICAgICAgIHRvIGhvbGQgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiAmamVyc2V5Lm1lZGlhLm11bHRpcGFydC5Cb2R5UGFydDtzLiBEZWZhdWx0IG1lZGlhIHR5cGUgaXMKKyAgICAgICAgICAgICAgICA8bGluayB4bGluazpocmVmPScmd2lraXBlZGlhLnVyaTtNSU1FI01peGVkJz5tdWx0aXBhcnQvbWl4ZWQ8L2xpbms+CisgICAgICAgICAgICAgICAgZm9yICZsaXQuamVyc2V5Lm1lZGlhLm11bHRpcGFydC5NdWx0aVBhcnQ7IGVudGl0eSBhbmQgPGxpdGVyYWw+dGV4dC9wbGFpbjwvbGl0ZXJhbD4gZm9yCisgICAgICAgICAgICAgICAgJmxpdC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LkJvZHlQYXJ0Oy4KKworICAgICAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgICAgICA8dGl0bGU+JmxpdC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0Lk11bHRpUGFydDsgZW50aXR5PC90aXRsZT4KKworICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiPmZpbmFsIE11bHRpUGFydCBtdWx0aVBhcnRFbnRpdHkgPSBuZXcgTXVsdGlQYXJ0KCkKKyAgICAgICAgLmJvZHlQYXJ0KG5ldyBCb2R5UGFydCgpLmVudGl0eSgiaGVsbG8iKSkKKyAgICAgICAgLmJvZHlQYXJ0KG5ldyBCb2R5UGFydChuZXcgSmF4YkJlYW4oInhtbCIpLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MX1RZUEUpKQorICAgICAgICAuYm9keVBhcnQobmV3IEJvZHlQYXJ0KG5ldyBKYXhiQmVhbigianNvbiIpLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFKSk7CisKK2ZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSAvLyBDcmVhdGUgV2ViVGFyZ2V0LgorZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQKKyAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KG11bHRpUGFydEVudGl0eSwgbXVsdGlQYXJ0RW50aXR5LmdldE1lZGlhVHlwZSgpKSk7PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisKKyAgICAgICAgICAgICAgICBJZiB5b3Ugc2VuZCBhIDxsaXRlcmFsPm11bHRpUGFydEVudGl0eTwvbGl0ZXJhbD4gdG8gdGhlIHNlcnZlciB0aGUgZW50aXR5IHdpdGggPGxpdGVyYWw+Q29udGVudC1UeXBlPC9saXRlcmFsPgorICAgICAgICAgICAgICAgIGhlYWRlciBpbiBIVFRQIG1lc3NhZ2Ugd291bGQgbG9vayBsaWtlIChkb24ndCBmb3JnZXQgdG8gcmVnaXN0ZXIgYSBKU09OIHByb3ZpZGVyKToKKworICAgICAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgICAgICA8dGl0bGU+JmxpdC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0Lk11bHRpUGFydDsgZW50aXR5IGluIEhUVFAgbWVzc2FnZS48L3RpdGxlPgorCisgICAgICAgICAgICAgICAgICAgIDxzY3JlZW4gbGFuZ3VhZ2U9InRleHQiIGxpbmVudW1iZXJpbmc9InVubnVtYmVyZWQiPjxlbXBoYXNpcz5Db250ZW50LVR5cGU6IG11bHRpcGFydC9taXhlZDsgYm91bmRhcnk9Qm91bmRhcnlfMV84MjkwNzc3NzZfMTM2OTEyODExOTg3ODwvZW1waGFzaXM+CisKKy0tQm91bmRhcnlfMV84MjkwNzc3NzZfMTM2OTEyODExOTg3OAorQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluCisKK2hlbGxvCistLUJvdW5kYXJ5XzFfODI5MDc3Nzc2XzEzNjkxMjgxMTk4NzgKK0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veG1sCisKKyZsdDs/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPyZndDsmbHQ7amF4YkJlYW4mZ3Q7Jmx0O3ZhbHVlJmd0O3htbCZsdDsvdmFsdWUmZ3Q7Jmx0Oy9qYXhiQmVhbiZndDsKKy0tQm91bmRhcnlfMV84MjkwNzc3NzZfMTM2OTEyODExOTg3OAorQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uCisKK3sidmFsdWUiOiJqc29uIn0KKy0tQm91bmRhcnlfMV84MjkwNzc3NzZfMTM2OTEyODExOTg3OC0tPC9zY3JlZW4+CisgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgV2hlbiB3b3JraW5nIHdpdGggZm9ybXMgKGUuZy4gbWVkaWEgdHlwZSA8bGl0ZXJhbD5tdWx0aXBhcnQvZm9ybS1kYXRhPC9saXRlcmFsPikgYW5kIHZhcmlvdXMgZmllbGRzIGluIHRoZW0sCisgICAgICAgICAgICAgICAgdGhlcmUgaXMgYSBtb3JlIGNvbnZlbmllbnQgY2xhc3MgdG8gYmUgdXNlZCAtICZqZXJzZXkubWVkaWEubXVsdGlwYXJ0LkZvcm1EYXRhTXVsdGlQYXJ0Oy4gSXQgYXV0b21hdGljYWxseSBzZXRzCisgICAgICAgICAgICAgICAgdGhlIG1lZGlhIHR5cGUgZm9yIHRoZSAmbGl0LmplcnNleS5tZWRpYS5tdWx0aXBhcnQuRm9ybURhdGFNdWx0aVBhcnQ7IGVudGl0eSB0bworICAgICAgICAgICAgICAgIDxsaXRlcmFsPm11bHRpcGFydC9mb3JtLWRhdGE8L2xpdGVyYWw+IGFuZCA8bGl0ZXJhbD5Db250ZW50LURpc3Bvc2l0aW9uPC9saXRlcmFsPiBoZWFkZXIgdG8KKyAgICAgICAgICAgICAgICAmbGl0LmplcnNleS5tZWRpYS5tdWx0aXBhcnQuRm9ybURhdGFCb2R5UGFydDsgYm9keSBwYXJ0cy4KKworICAgICAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgICAgICA8dGl0bGU+JmxpdC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LkZvcm1EYXRhTXVsdGlQYXJ0OyBlbnRpdHk8L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiPmZpbmFsIEZvcm1EYXRhTXVsdGlQYXJ0IG11bHRpcGFydCA9IG5ldyBGb3JtRGF0YU11bHRpUGFydCgpCisgICAgLmZpZWxkKCJoZWxsbyIsICJoZWxsbyIpCisgICAgLmZpZWxkKCJ4bWwiLCBuZXcgSmF4YkJlYW4oInhtbCIpKQorICAgIC5maWVsZCgianNvbiIsIG5ldyBKYXhiQmVhbigianNvbiIpLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFKTsKKworZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IC8vIENyZWF0ZSBXZWJUYXJnZXQuCitmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG11bHRpcGFydCwgbXVsdGlwYXJ0LmdldE1lZGlhVHlwZSgpKSk7PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisKKyAgICAgICAgICAgICAgICBUbyBpbGx1c3RyYXRlIHRoZSBkaWZmZXJlbmNlIHdoZW4gdXNpbmcgJmxpdC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LkZvcm1EYXRhTXVsdGlQYXJ0OyBpbnN0ZWFkIG9mCisgICAgICAgICAgICAgICAgJmxpdC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LkZvcm1EYXRhQm9keVBhcnQ7IHlvdSBjYW4gdGFrZSBhIGxvb2sgYXQgdGhlCisgICAgICAgICAgICAgICAgJmxpdC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LkZvcm1EYXRhTXVsdGlQYXJ0OyBlbnRpdHkgZnJvbSBIVE1MIG1lc3NhZ2U6CisKKyAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgPHRpdGxlPiZsaXQuamVyc2V5Lm1lZGlhLm11bHRpcGFydC5Gb3JtRGF0YU11bHRpUGFydDsgZW50aXR5IGluIEhUVFAgbWVzc2FnZS48L3RpdGxlPgorCisgICAgICAgICAgICAgICAgICAgIDxzY3JlZW4gbGFuZ3VhZ2U9InRleHQiIGxpbmVudW1iZXJpbmc9InVubnVtYmVyZWQiPjxlbXBoYXNpcz5Db250ZW50LVR5cGU6IG11bHRpcGFydC9mb3JtLWRhdGE7IGJvdW5kYXJ5PUJvdW5kYXJ5XzFfNTExMjYyMjYxXzEzNjkxNDM0MzM2MDg8L2VtcGhhc2lzPgorCistLUJvdW5kYXJ5XzFfNTExMjYyMjYxXzEzNjkxNDM0MzM2MDgKK0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbgorQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPSJoZWxsbyIKKworaGVsbG8KKy0tQm91bmRhcnlfMV81MTEyNjIyNjFfMTM2OTE0MzQzMzYwOAorQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94bWwKK0NvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0ieG1sIgorCismbHQ7P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8mZ3Q7Jmx0O2pheGJCZWFuJmd0OyZsdDt2YWx1ZSZndDt4bWwmbHQ7L3ZhbHVlJmd0OyZsdDsvamF4YkJlYW4mZ3Q7CistLUJvdW5kYXJ5XzFfNTExMjYyMjYxXzEzNjkxNDM0MzM2MDgKK0NvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvbgorQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPSJqc29uIgorCit7InZhbHVlIjoianNvbiJ9CistLUJvdW5kYXJ5XzFfNTExMjYyMjYxXzEzNjkxNDM0MzM2MDgtLTwvc2NyZWVuPgorICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEEgY29tbW9uIHVzZS1jYXNlIGZvciBtYW55IHVzZXJzIGlzIHNlbmRpbmcgZmlsZXMgZnJvbSBjbGllbnQgdG8gc2VydmVyLiBGb3IgdGhpcyBwdXJwb3NlIHlvdSBjYW4gdXNlIGNsYXNzZXMgZnJvbQorICAgICAgICAgICAgICAgIDxsaXRlcmFsPm9yZy5nbGFzc2Zpc2guamVyc2V5LmplcnNleS5tZWRpYS5tdWx0aXBhcnQ8L2xpdGVyYWw+IHBhY2thZ2UsIHN1Y2ggYXMKKyAgICAgICAgICAgICAgICAmamVyc2V5Lm1lZGlhLm11bHRpcGFydC5GaWxlRGF0YUJvZHlQYXJ0OyBvciAmamVyc2V5Lm1lZGlhLm11bHRpcGFydC5TdHJlYW1EYXRhQm9keVBhcnQ7LgorCisgICAgICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5NdWx0aXBhcnQgLSBzZW5kaW5nIGZpbGVzLjwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIj4vLyBNZWRpYVR5cGUgb2YgdGhlIGJvZHkgcGFydCB3aWxsIGJlIGRlcml2ZWQgZnJvbSB0aGUgZmlsZS4KK2ZpbmFsIEZpbGVEYXRhQm9keVBhcnQgZmlsZVBhcnQgPSBuZXcgRmlsZURhdGFCb2R5UGFydCgibXlfcG9tIiwgbmV3IEZpbGUoInBvbS54bWwiKSk7CisKK2ZpbmFsIEZvcm1EYXRhTXVsdGlQYXJ0IG11bHRpcGFydCA9IG5ldyBGb3JtRGF0YU11bHRpUGFydCgpCisgICAgLmZpZWxkKCJmb28iLCAiYmFyIikKKyAgICAuYm9keVBhcnQoZmlsZVBhcnQpOworCitmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gLy8gQ3JlYXRlIFdlYlRhcmdldC4KK2ZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKQorICAgIC5wb3N0KEVudGl0eS5lbnRpdHkobXVsdGlwYXJ0LCBtdWx0aXBhcnQuZ2V0TWVkaWFUeXBlKCkpKTs8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDx3YXJuaW5nPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBEbyBub3QgdXNlICZsaXQuamVyc2V5LmFwYWNoZS5BcGFjaGVDb25uZWN0b3JQcm92aWRlcjsgbm9yICZsaXQuamVyc2V5LmdyaXp6bHkuR3JpenpseUNvbm5lY3RvclByb3ZpZGVyOworICAgICAgICAgICAgICAgICAgICBuZWl0aGVyICZsaXQuamVyc2V5LmpldHR5LkpldHR5Q29ubmVjdG9yUHJvdmlkZXI7IGNvbm5lY3RvciBpbXBsZW1lbnRhdGlvbnMgd2l0aCBKZXJzZXkgTXVsdGlwYXJ0CisgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzLiBTZWUgPHhyZWYgbGlua2VuZD0iY29ubmVjdG9ycy53YXJuaW5nIi8+IHdhcm5pbmcgZm9yIG1vcmUgZGV0YWlscy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3dhcm5pbmc+CisgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICA8c2VjdGlvbj4KKyAgICAgICAgICAgIDx0aXRsZT5TZXJ2ZXI8L3RpdGxlPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBSZXR1cm5pbmcgYSBtdWx0aXBhcnQgcmVzcG9uc2UgZnJvbSBzZXJ2ZXIgdG8gY2xpZW50IGlzIG5vdCBtdWNoIGRpZmZlcmVudCBmcm9tIHRoZSBwYXJ0cyBkZXNjcmliZWQgaW4gdGhlIGNsaWVudAorICAgICAgICAgICAgICAgIHNlY3Rpb24gYWJvdmUuIFRvIG9idGFpbiBhIG11bHRpcGFydCBlbnRpdHksIHNlbnQgYnkgYSBjbGllbnQsIGluIHRoZSBhcHBsaWNhdGlvbiB5b3UgY2FuIHVzZSB0d28gYXBwcm9hY2hlczoKKworICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPkluamVjdGluZyB0aGUgd2hvbGUgJmplcnNleS5tZWRpYS5tdWx0aXBhcnQuTXVsdGlQYXJ0OyBlbnRpdHkuPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmplY3RpbmcgcGFydGljdWxhciBwYXJ0cyBvZiBhIDxsaXRlcmFsPmZvcm0tZGF0YTwvbGl0ZXJhbD4gbXVsdGlwYXJ0IHJlcXVlc3QgdmlhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmplcnNleS5tZWRpYS5tdWx0aXBhcnQuRm9ybURhdGFQYXJhbTsgYW5ub3RhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICAgICAgPHRpdGxlPkluamVjdGluZyBhbmQgcmV0dXJuaW5nIHRoZSAmbGl0LmplcnNleS5tZWRpYS5tdWx0aXBhcnQuTXVsdGlQYXJ0OyBlbnRpdHk8L3RpdGxlPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFdvcmtpbmcgd2l0aCAmbGl0LmplcnNleS5tZWRpYS5tdWx0aXBhcnQuTXVsdGlQYXJ0OyB0eXBlcyBpcyBubyBkaWZmZXJlbnQgZnJvbSBpbmplY3RpbmcvcmV0dXJuaW5nIG90aGVyCisgICAgICAgICAgICAgICAgICAgIGVudGl0eSB0eXBlcy4KKyAgICAgICAgICAgICAgICAgICAgSmVyc2V5IHByb3ZpZGVzICZsaXQuamF4cnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyOyBmb3IgcmVhZGluZyB0aGUgcmVxdWVzdCBlbnRpdHkgYW5kIGluamVjdGluZyB0aGlzIGVudGl0eQorICAgICAgICAgICAgICAgICAgICBpbnRvIGEgbWV0aG9kIHBhcmFtZXRlciBvZiBhIHJlc291cmNlIG1ldGhvZCBhbmQgJmxpdC5qYXhycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7IGZvciB3cml0aW5nIG91dHB1dCBlbnRpdGllcy4KKyAgICAgICAgICAgICAgICAgICAgWW91IGNhbiBleHBlY3QgdGhhdCBlaXRoZXIgJmxpdC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0Lk11bHRpUGFydDsgb3IKKyAgICAgICAgICAgICAgICAgICAgJmxpdC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LkZvcm1EYXRhTXVsdGlQYXJ0OyAoPGxpdGVyYWw+bXVsdGlwYXJ0L2Zvcm0tZGF0YTwvbGl0ZXJhbD4gbWVkaWEgdHlwZSkgb2JqZWN0CisgICAgICAgICAgICAgICAgICAgIHRvIGJlIGluamVjdGVkIGludG8gYSByZXNvdXJjZSBtZXRob2QuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5SZXNvdXJjZSBtZXRob2QgdXNpbmcgJmxpdC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0Lk11bHRpUGFydDsgYXMgaW5wdXQgcGFyYW1ldGVyIC8gcmV0dXJuIHZhbHVlLjwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIj5AUE9TVAorQFByb2R1Y2VzKCJtdWx0aXBhcnQvbWl4ZWQiKQorcHVibGljIE11bHRpUGFydCBwb3N0KGZpbmFsIEZvcm1EYXRhTXVsdGlQYXJ0IG11bHRpUGFydCkgeworICAgIHJldHVybiBtdWx0aVBhcnQ7Cit9PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgICAgIDxzZWN0aW9uPgorICAgICAgICAgICAgICAgIDx0aXRsZT5JbmplY3Rpbmcgd2l0aCAmbGl0LmplcnNleS5tZWRpYS5tdWx0aXBhcnQuRm9ybURhdGFQYXJhbTs8L3RpdGxlPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIElmIHlvdSBqdXN0IG5lZWQgdG8gYmluIHRoZSBuYW1lZCBib2R5IHBhcnQocykgb2YgYSA8bGl0ZXJhbD5tdWx0aXBhcnQvZm9ybS1kYXRhPC9saXRlcmFsPiByZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgIGVudGl0eSBib2R5IHRvIGEgcmVzb3VyY2UgbWV0aG9kIHBhcmFtZXRlciB5b3UgY2FuIHVzZSAmamVyc2V5Lm1lZGlhLm11bHRpcGFydC5Gb3JtRGF0YVBhcmFtOyBhbm5vdGF0aW9uLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgVGhpcyBhbm5vdGF0aW9uIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIG1lZGlhIHR5cGUgPGxpdGVyYWw+bXVsdGlwYXJ0L2Zvcm0tZGF0YTwvbGl0ZXJhbD4gc2hvdWxkIGJlIHVzZWQgZm9yCisgICAgICAgICAgICAgICAgICAgIHN1Ym1pdHRpbmcgYW5kIGNvbnN1bWluZyBmb3JtcyB0aGF0IGNvbnRhaW4gZmlsZXMsIG5vbi1BU0NJSSBkYXRhLCBhbmQgYmluYXJ5IGRhdGEuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUaGUgdHlwZSBvZiB0aGUgYW5ub3RhdGVkIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgKGZvciBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIHNlZQorICAgICAgICAgICAgICAgICAgICBqYXZhZG9jIHRvICZqZXJzZXkubWVkaWEubXVsdGlwYXJ0LkZvcm1EYXRhUGFyYW07KToKKworICAgICAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGl0LmplcnNleS5tZWRpYS5tdWx0aXBhcnQuRm9ybURhdGFCb2R5UGFydDsgLSBUaGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlciB3aWxsIGJlIHRoZSBmaXJzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lZCBib2R5IHBhcnQgb3IgJmxpdC5udWxsOyBpZiBzdWNoIGEgbmFtZWQgYm9keSBwYXJ0IGlzIG5vdCBwcmVzZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEgPGxpdGVyYWw+TGlzdDwvbGl0ZXJhbD4gb3IgPGxpdGVyYWw+Q29sbGVjdGlvbjwvbGl0ZXJhbD4gb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpdC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LkZvcm1EYXRhQm9keVBhcnQ7LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlciB3aWxsIG9uZSBvciBtb3JlIG5hbWVkIGJvZHkgcGFydHMgd2l0aCB0aGUgc2FtZSBuYW1lIG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsaXQubnVsbDsgaWYgc3VjaCBhIG5hbWVkIGJvZHkgcGFydCBpcyBub3QgcHJlc2VudC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGl0LmplcnNleS5tZWRpYS5tdWx0aXBhcnQuRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb247IC0gVGhlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIgd2lsbCBiZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudCBkaXNwb3NpdGlvbiBvZiB0aGUgZmlyc3QgbmFtZWQgYm9keSBwYXJ0IHBhcnQgb3IgJmxpdC5udWxsOyBpZiBzdWNoIGEgbmFtZWQgYm9keSBwYXJ0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCBwcmVzZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEgPGxpdGVyYWw+TGlzdDwvbGl0ZXJhbD4gb3IgPGxpdGVyYWw+Q29sbGVjdGlvbjwvbGl0ZXJhbD4gb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpdC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LkZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uOy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIgd2lsbCBvbmUgb3IgbW9yZSBjb250ZW50IGRpc3Bvc2l0aW9ucyBvZiB0aGUgbmFtZWQgYm9keSBwYXJ0cyB3aXRoIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1lIG5hbWUgb3IgJmxpdC5udWxsOyBpZiBzdWNoIGEgbmFtZWQgYm9keSBwYXJ0IGlzIG5vdCBwcmVzZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEEgdHlwZSBmb3Igd2hpY2ggYSBtZXNzYWdlIGJvZHkgcmVhZGVyIGlzIGF2YWlsYWJsZSBnaXZlbiB0aGUgbWVkaWEgdHlwZSBvZiB0aGUgZmlyc3QgbmFtZWQgYm9keQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0LiBUaGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlciB3aWxsIGJlIHRoZSByZXN1bHQgb2YgcmVhZGluZyB1c2luZyB0aGUgbWVzc2FnZSBib2R5IHJlYWRlciBnaXZlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdHlwZSA8bGl0ZXJhbD5UPC9saXRlcmFsPiwgdGhlIG1lZGlhIHR5cGUgb2YgdGhlIG5hbWVkIHBhcnQsIGFuZCB0aGUgYnl0ZXMgb2YgdGhlIG5hbWVkIGJvZHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydCBhcyBpbnB1dC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHRoZXJlIGlzIG5vIG5hbWVkIHBhcnQgcHJlc2VudCBhbmQgdGhlcmUgaXMgYSBkZWZhdWx0IHZhbHVlIHByZXNlbnQgYXMgZGVjbGFyZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmpheHJzLkRlZmF1bHRWYWx1ZTsgdGhlbiB0aGUgbWVkaWEgdHlwZSB3aWxsIGJlIHNldCB0byA8bGl0ZXJhbD50ZXh0L3BsYWluPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIgd2lsbCBiZSB0aGUgcmVzdWx0IG9mIHJlYWRpbmcgdXNpbmcgdGhlIG1lc3NhZ2UgYm9keSByZWFkZXIgZ2l2ZW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPGxpdGVyYWw+VDwvbGl0ZXJhbD4sIHRoZSBtZWRpYSB0eXBlIDxsaXRlcmFsPnRleHQvcGxhaW48L2xpdGVyYWw+LCBhbmQgdGhlIFVURi04IGVuY29kZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXMgb2YgdGhlIGRlZmF1bHQgdmFsdWUgYXMgaW5wdXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJZiB0aGVyZSBpcyBubyBtZXNzYWdlIGJvZHkgcmVhZGVyIGF2YWlsYWJsZSBhbmQgdGhlIHR5cGUgPGxpdGVyYWw+VDwvbGl0ZXJhbD4gY29uZm9ybXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gYSB0eXBlIHNwZWNpZmllZCBieSAmamF4cnMuRm9ybVBhcmFtOyB0aGVuIHByb2Nlc3NpbmcgaXMgcGVyZm9ybWVkIGFzIHNwZWNpZmllZCBieQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGl0LmpheHJzLkZvcm1QYXJhbTssIHdoZXJlIHRoZSB2YWx1ZXMgb2YgdGhlIGZvcm0gcGFyYW1ldGVyIGFyZSA8bGl0ZXJhbD5TdHJpbmc8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlcyBwcm9kdWNlZCBieSByZWFkaW5nIHRoZSBieXRlcyBvZiB0aGUgbmFtZWQgYm9keSBwYXJ0cyB1dGlsaXppbmcgYSBtZXNzYWdlIGJvZHkgcmVhZGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0aGUgPGxpdGVyYWw+U3RyaW5nPC9saXRlcmFsPiB0eXBlIGFuZCB0aGUgbWVkaWEgdHlwZSA8bGl0ZXJhbD50ZXh0L3BsYWluPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHRoZXJlIGlzIG5vIG5hbWVkIHBhcnQgcHJlc2VudCB0aGVuIHByb2Nlc3NpbmcgaXMgcGVyZm9ybWVkIGFzIHNwZWNpZmllZCBieQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGl0LmpheHJzLkZvcm1QYXJhbTsuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5Vc2Ugb2YgJmxpdC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LkZvcm1EYXRhUGFyYW07IGFubm90YXRpb248L3RpdGxlPgorCisgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSI+QFBPU1QKK0BDb25zdW1lcyhNZWRpYVR5cGUuTVVMVElQQVJUX0ZPUk1fREFUQSkKK3B1YmxpYyBTdHJpbmcgcG9zdEZvcm0oCisgICAgQERlZmF1bHRWYWx1ZSgidHJ1ZSIpIEBGb3JtRGF0YVBhcmFtKCJlbmFibGVkIikgYm9vbGVhbiBlbmFibGVkLAorICAgIEBGb3JtRGF0YVBhcmFtKCJkYXRhIikgRmlsZURhdGEgYmVhbiwKKyAgICBARm9ybURhdGFQYXJhbSgiZmlsZSIpIElucHV0U3RyZWFtIGZpbGUsCisgICAgQEZvcm1EYXRhUGFyYW0oImZpbGUiKSBGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbiBmaWxlRGlzcG9zaXRpb24pIHsKKworICAgIC8vIC4uLgorfTwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEluIHRoZSBleGFtcGxlIGFib3ZlIHRoZSBzZXJ2ZXIgY29uc3VtZXMgYSA8bGl0ZXJhbD5tdWx0aXBhcnQvZm9ybS1kYXRhPC9saXRlcmFsPiByZXF1ZXN0IGVudGl0eSBib2R5IHRoYXQKKyAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgb25lIG9wdGlvbmFsIG5hbWVkIGJvZHkgcGFydCA8bGl0ZXJhbD5lbmFibGVkPC9saXRlcmFsPiBhbmQgdHdvIHJlcXVpcmVkIG5hbWVkIGJvZHkgcGFydHMKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+ZGF0YTwvbGl0ZXJhbD4gYW5kIDxsaXRlcmFsPmZpbGU8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgVGhlIG9wdGlvbmFsIHBhcnQgPGxpdGVyYWw+ZW5hYmxlZDwvbGl0ZXJhbD4gaXMgcHJvY2Vzc2VkCisgICAgICAgICAgICAgICAgICAgIGFzIGEgPGxpdGVyYWw+Ym9vbGVhbjwvbGl0ZXJhbD4gdmFsdWUsIGlmIHRoZSBwYXJ0IGlzIGFic2VudCB0aGVuIHRoZSB2YWx1ZSB3aWxsIGJlIDxsaXRlcmFsPnRydWU8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgVGhlIHBhcnQgPGxpdGVyYWw+ZGF0YTwvbGl0ZXJhbD4gaXMgcHJvY2Vzc2VkIGFzIGEgSkFYQiBiZWFuIGFuZCBjb250YWlucyBzb21lIG1ldGEtZGF0YSBhYm91dCB0aGUgZm9sbG93aW5nCisgICAgICAgICAgICAgICAgICAgIHBhcnQuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUaGUgcGFydCA8bGl0ZXJhbD5maWxlPC9saXRlcmFsPiBpcyBhIGZpbGUgdGhhdCBpcyB1cGxvYWRlZCwgdGhpcyBpcyBwcm9jZXNzZWQgYXMgYW4KKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+SW5wdXRTdHJlYW08L2xpdGVyYWw+LiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmaWxlIGZyb20gdGhlCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPkNvbnRlbnQtRGlzcG9zaXRpb248L2xpdGVyYWw+IGhlYWRlciBjYW4gYmUgYWNjZXNzZWQgYnkgdGhlIHBhcmFtZXRlcgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5maWxlRGlzcG9zaXRpb248L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDx0aXA+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPiZsaXQuamVyc2V5Lm1lZGlhLm11bHRpcGFydC5Gb3JtRGF0YVBhcmFtOyBhbm5vdGF0aW9uIGNhbiBiZSBhbHNvIHVzZWQgb24gZmllbGRzLjwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L3RpcD4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKzwvY2hhcHRlcj4KZGlmZiAtLWdpdCBhL2RvY3Mvc3JjL21haW4vZG9jYm9vay9taWdyYXRpb24ueG1sIGIvZG9jcy9zcmMvbWFpbi9kb2Nib29rL21pZ3JhdGlvbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUwMmNlNwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3Mvc3JjL21haW4vZG9jYm9vay9taWdyYXRpb24ueG1sCkBAIC0wLDAgKzEsMjI1MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPCFET0NUWVBFIGNoYXB0ZXIgWzwhRU5USVRZICUgZW50cyBTWVNURU0gImplcnNleS5lbnQiID4gJWVudHM7XT4KKzxjaGFwdGVyIHhtbG5zPSJodHRwOi8vZG9jYm9vay5vcmcvbnMvZG9jYm9vayIKKyAgICAgICAgIHZlcnNpb249IjUuMCIKKyAgICAgICAgIHhtbDpsYW5nPSJlbiIKKyAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKKyAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2RvY2Jvb2sub3JnL25zL2RvY2Jvb2sgaHR0cDovL2RvY2Jvb2sub3JnL3htbC81LjAveHNkL2RvY2Jvb2sueHNkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsgaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluay54c2QiCisgICAgICAgICB4bWw6aWQ9Im1pZ3JhdGlvbiI+CisgICAgPHRpdGxlPk1pZ3JhdGlvbiBHdWlkZTwvdGl0bGU+CisKKyAgICA8c2VjdGlvbiB4bWw6aWQ9Im1pZy0yLjI3Ij4KKyAgICAgICAgPHRpdGxlPk1pZ3JhdGluZyBmcm9tIEplcnNleSAyLjIzIHRvIDIuMjc8L3RpdGxlPgorICAgICAgICA8c2VjdGlvbiB4bWw6aWQ9Im1pZy0yLjI3LWJyZWFraW5nLWNoYW5nZXMiPgorICAgICAgICAgICAgPHRpdGxlPkJyZWFraW5nIENoYW5nZXM8L3RpdGxlPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG1vc3QgZnVuZGFtZW50YWwgY2hhbmdlIGluIEplcnNleSAyLjI2IGFuZCBsYXRlciBpcyB0aGF0IGFsbCB0aGUgbW9kdWxlcyAoaW5jbHVkaW5nIHRoZSBjbGllbnQgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlKSBhcmUgbm93IGJlaW5nIGJ1aWx0IHdpdGggSmF2YSBTRSA4IGFuZCB3aXRoIDEuOCBsYW5ndWFnZSBsZXZlbC4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzIGEgY29uc2VxdWVudGlhbCBjaGFuZ2UsIG9uZSBvZiB0aGUgbW9kdWxlcyB3YXMgZHJvcHBlZCwgdGhlPGxpdGVyYWw+cngtY2xpZW50LWpzcjE2NmU8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgaW1wbGVtZW50YXRpb24gcmVsaWVkIG9uIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPkNvbmN1cnJlbnRIYXNoTWFwVjg8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIHdhcyBtYWRlIHJlZHVuZGFudCBieSB0aGUgSkRLIHVwZ3JhZGUuIFBsZWFzZSB1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5yeC1jbGllbnQtamF2YTg8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGVhZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwcmluZyB2ZXJzaW9uIHVzZWQgaW4gdGhlIGV4dGVuc2lvbiBtb2R1bGUgd2FzIHVwZ3JhZGVkIHRvIDQuMi4xLlJFTEVBU0UuIFRoZSByZWFzb24gZm9yIHRoYXQgaXMgbGFjaworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIEphdmEgOCBzdXBwb3J0IHdpdGggU3ByaW5nIDMueCB2ZXJzaW9ucy4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEplcnNleSBwcm9wcmlldGFyeSByZWFjdGl2ZSBjbGllbnQgQVBJIGhhcyBiZWVkIGRyb3BwZWQgYW5kIHJlcGxhY2VkIGJ5IEpBWC1SUyAyLjEgUmVhY3RpdmUgQ2xpZW50IEFQSS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgcnVsZSBjb3VsZG4ndCBiZSByZXNwZWN0ZWQgaW4gdGhpcyBjYXNlLCBzaW5jZSB0aGUgSkFYLVJTIEFQSSBhcmUgYmFzZWQgb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGF0IHdhcyBkb25lIGluIEplcnNleSBhbmQgdGhlcmUgd2VyZSB1bnJlc29sdmFibGUgY29kZSBpbmNvbXBhdGliaWxpdGllcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiB4bWw6aWQ9Im1pZy0yLjI3LWluamVjdGlvbi1tYW5hZ2VyIj4KKyAgICAgICAgICAgIDx0aXRsZT5CcmVha2luZyBDaGFuZ2VzIC0gSW5qZWN0aW9uIE1hbmFnZXI8L3RpdGxlPgorICAgICAgICAgICAgPHBhcmE+Rm9sbG93aW5nIGJyZWFraW5nIGNoYW5nZXMgYXJlIGNhdXNlZCBieSByZW1vdmluZyBhbmQgcmVwbGFjaW5nIEhLMiAoPGxpdGVyYWw+U2VydmljZUxvY2F0b3I8L2xpdGVyYWw+KSBieQorICAgICAgICAgICAgJmplcnNleS5jb21tb24uaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7LiBKZXJzZXkgaW5qZWN0aW9uIEFQSSBpcyBjb25zaWRlcmVkIGFzIGFuIGludGVybmFsIEFQSSAoZXhjZXB0CisgICAgICAgICAgICAmbGl0LmplcnNleS5jb21tb24uaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7KSA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc2VzIGluIHdoaWNoIDxsaXRlcmFsPkhLMiBTZXJ2aWNlTG9jYXRvcjwvbGl0ZXJhbD4gd2FzIHNpbXBseSByZXBsYWNlZCBieQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZqZXJzZXkuY29tbW9uLmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOyBhbmQgdGhlIHJlcGxhY2luZyBpbmZsdWVuY2VkIHRoZWlyIHB1YmxpYyBtZXRob2RzOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaW1wbGVsaXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWVtYmVyPiZqZXJzZXkuc2VydmVyLm1vZGVsLk1ldGhvZEhhbmRsZXI7PC9tZW1iZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtZW1iZXI+JmplcnNleS5zZXJ2ZXIuc3BpLkNvbXBvbmVudFByb3ZpZGVyOzwvbWVtYmVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWVtYmVyPiZqZXJzZXkuc2VydmVyLnNwaS5FeHRlcm5hbFJlcXVlc3RTY29wZTs8L21lbWJlcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1lbWJlcj4mamVyc2V5LnNlcnZlci5XYWRsR2VuZXJhdG9yQ29uZmlnOzwvbWVtYmVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWVtYmVyPiZqZXJzZXkuc2VydmVyLnNwaS5SZXF1ZXN0U2NvcGVkSW5pdGlhbGl6ZXI7PC9tZW1iZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaW1wbGVsaXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VwcG9ydCBmb3IgPGxpdGVyYWw+SEsyIEJpbmRlcjwvbGl0ZXJhbD4gaW4gdGhlIGNhc2Ugb2YgdXNpbmcgSEsyIEluamVjdGlvbiBNb2R1bGUgd2FzIGltcGxlbWVudGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnV0IEplcnNleSBuZXdseSBzdXBwb3J0cyBhIHJlZ2lzdHJhdGlvbiBpdHMgb3duICZqZXJzZXkuY29tbW9uLmludGVybmFsLmluamVjdC5BYnN0cmFjdEJpbmRlcjsgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmplcnNleS5jb21tb24uaW50ZXJuYWwuaW5qZWN0LkJpbmRlcjsgaW4gJmpheHJzLmNvcmUuQXBwbGljYXRpb247IHRvIGVhc2lseSBzd2l0Y2ggZnJvbSBISzIgY2xhc3NlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIEplcnNleSBvbmVzIGp1c3QgYnkgYWRqdXN0aW5nIHRoZSBpbXBvcnRzLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpdC5qZXJzZXkuY29tbW9uLmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOyBjb250YWlucyBhIG1lY2hhbmlzbSBmb3IgcmVnaXN0ZXJpbmcgREkgc3BlY2lmaWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmplY3Rpb24gYmluZGluZ3MsIGluIGNhc2UgdGhlIGFwcGxpY2F0aW9uIHVzZXMgQ0RJLCBkZXZlbG9wZXJzIHNob3VsZCB1c2UgQ0RJIG1lY2hhbmlzbSwgaW4gY2FzZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiB1c2VzIEhLMiwgZGV2ZWxvcGVycyBzaG91bGQgY29uZmlndXJlIEhLMiAtIGlkZWFsbHkgdmlhIGNvbmZpZ3VyaW5nIGEgcGFyZW50IGxvY2F0b3IgdGhhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHRoZW4gcGFzc2VkIHRvIEplcnNleS4gVGhlIGN1c3RvbSBiaW5kaW5ncyBjYW4gYmUgYWxzbyByZWdpc3RlcmVkIHRocm91Z2ggJmpheHJzLmNvcmUuQXBwbGljYXRpb247CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgJmxpdC5qZXJzZXkuY29tbW9uLmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOyBzdXBwb3J0cyB0aGUgYmluZGluZ3MgdHlwZSB0aGF0IG1lYW5zIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5JbmplY3Rpb25NYW5hZ2VyI2lzUmVnaXN0cmFibGU8L2xpdGVyYWw+IHJldHVybnMgPGxpdGVyYWw+dHJ1ZTwvbGl0ZXJhbD47CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbiAmamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsgYW5kICZqZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsgY29uZmlndXJhdGlvbiBtZXRob2RzIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8tZGlzY292ZXJhYmxlIGNvbXBvbmVudHMgYW5kIG1ldGEtY29tcG9uZW50cyAoZS5nLiAmbGl0LmpheHJzLmNvcmUuRmVhdHVyZTspIGFjY2VwdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsaXQuamVyc2V5LmNvbW1vbi5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsgYW5kIG1vcmVvdmVyIHRoZSBtZXRhLWNvbXBvbmVudHMgYWNjZXB0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+TWFuYWdlZE9iamVjdEZpbmFsaXplcjwvbGl0ZXJhbD4gd2hpY2ggZW5zdXJlcyBhIHByZS1kZXN0cm95IG1ldGhvZCBpbnZvY2F0aW9uIG9uIHJlZ2lzdGVyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kIDxsaXRlcmFsPmdldFRlbXBsYXRlT2JqZWN0RmFjdG9yeTwvbGl0ZXJhbD4gaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmamVyc2V5LnNlcnZlci5tdmMuc3BpLkFic3RyYWN0VGVtcGxhdGVQcm9jZXNzb3I7IGFjY2VwdHMgYSBmdW5jdGlvbiB0aGF0IGluaXRpYWxpemVzIGEgcmV0cmlldmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgZmFjdG9yeSBmcm9tIGEgY29uZmlndXJhdGlvbiwgdXN1YWxseSB0aGlzIGZ1bmN0aW9uIGlzIGp1c3QgYSB3cmFwcGVyIHdpdGggdW5kZXJseWluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsaXQuamVyc2V5LmNvbW1vbi5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsgaW52b2NhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5ISzIgRmFjdG9yeTwvbGl0ZXJhbD4gc3VwcG9ydCBpcyByZXBsYWNlZCBieSA8bGl0ZXJhbD5qYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIEplcnNleS1zcGVjaWZpYyAmamVyc2V5LmNvbW1vbi5pbnRlcm5hbC5pbmplY3QuRGlzcG9zYWJsZVN1cHBsaWVyOy4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhLMi1zcGVjaWZpYyBhbm5vdGF0aW9ucyA8bGl0ZXJhbD5AT3B0aW9uYWw8L2xpdGVyYWw+LCA8bGl0ZXJhbD5ASW1tZWRpYXRlPC9saXRlcmFsPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5AVW5xdWFsaWZpZWQ8L2xpdGVyYWw+IGFyZSBubyBsb25nZXIgc3VwcG9ydGVkIGRpcmVjdGx5IGluIEplcnNleSBidXQgY2FuIGJlIHVzZWQgaWYgSEsyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5qZWN0aW9uIE1vZHVsZSBpcyB1c2VkLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEsyLXNwZWNpZmljIGFubm90YXRpb25zIDxsaXRlcmFsPkBQZXJMb29rdXA8L2xpdGVyYWw+IGFuZCA8bGl0ZXJhbD5AUGVyVGhyZWFkPC9saXRlcmFsPiBhcmUgbWlncmF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBKZXJzZXkgd2l0aCBhbiBhZGp1c3RlZCBwYWNrYWdlLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIHhtbDppZD0ibWlnLTIuMjYtcmVtb3ZlZC1kZXByZWNhdGVkIj4KKyAgICAgICAgICAgIDx0aXRsZT5SZW1vdmVkIGRlcHJlY2F0ZWQgQVBJczwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT5Gb2xsb3dpbmcsIGFscmVhZHkgZGVwcmVjYXRlZCwgQVBJcyB3ZXJlIHJlbW92ZWQ6PC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpdC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmlsdGVyOyBoYXMgYmVlbiByZW1vdmVkLiBVc2UgJmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOyBpbnN0ZWFkLiBTZWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSJsb2dnaW5nIj5Mb2dnaW5nIGNoYXB0ZXI8L2xpbms+LgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24+CisgICAgICAgIDx0aXRsZT5NaWdyYXRpbmcgZnJvbSBKZXJzZXkgMi4yMi4xIHRvIDIuMjM8L3RpdGxlPgorICAgICAgICA8c2VjdGlvbiB4bWw6aWQ9Im1pZy0yLjIzLWhpZ2hsaWdodHMiPgorICAgICAgICAgICAgPHRpdGxlPlJlbGVhc2UgMi4yMyBIaWdobGlnaHRzPC90aXRsZT4KKworICAgICAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICAgICAgPHRpdGxlPkludHJvZHVjaW5nIExvZ2dpbmdGZWF0dXJlPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgRnJvbSB2ZXJzaW9uIDIuMjMgb253YXJkcywgJmxpdC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmlsdGVyOyBoYXMgYmVlbiByZXBsYWNlZAorICAgICAgICAgICAgICAgICAgICB3aXRoICZqZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uIHhtbDppZD0ibWlnLTIuMjMtbmV3LWRlcHJlY2F0ZWQiPgorICAgICAgICAgICAgPHRpdGxlPkRlcHJlY2F0ZWQgQVBJczwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT5Gb2xsb3dpbmcgQVBJcyB3ZXJlIGRlcHJlY2F0ZWQ6PC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxpdC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmlsdGVyOyBoYXMgYmVlbiBtYXJrZWQgYXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgc3Vic2VxdWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2UuIFVzZSAmamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7IGluc3RlYWQuIFNlZSBjaGFwdGVyPGxpbmsgbGlua2VuZD0ibG9nZ2luZyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2luZzwvbGluaz4uCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiB4bWw6aWQ9Im1pZy0yLjIzLWJyZWFraW5nLWNoYW5nZXMiPgorICAgICAgICA8dGl0bGU+QnJlYWtpbmcgQ2hhbmdlczwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgTGFzdCB2ZXJzaW9uIGNvbnRhaW5lZCBhIGNoYW5nZSBpbiByZWxhdGl2ZSBVUkkgcmVzb2x1dGlvbiBpbiB0aGUgbG9jYXRpb24gaGVhZGVyLiBFdmVuIHRob3VnaCB0aGUgY2hhbmdlCisgICAgICAgICAgICB3YXMgZml4aW5nIHRoZSBkaXNjcmVwYW5jeSBiZXR3ZWVuIHRoZSByZWFsIGJlaGF2aW91ciBhbmQgUkZDNzIzMSwgaXQgYWxzbyBjYXVzZWQgSkFYLVJTIHNwZWMKKyAgICAgICAgICAgIGluY29tcGF0aWJpbGl0eQorICAgICAgICAgICAgaW4gc29tZSBjYXNlcy4gRnVydGhlcm1vcmUsIHRoZXJlIHdhcyBubyB3YXkgdG8gcHJlc2VydmUgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaGVyZWZvcmUsIHRoZSBkZWZhdWx0IGJlaGF2aW91ciB3YXMgcm9sbGJhY2tlZCBhbmQgYSBuZXcgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSB3YXMgaW50cm9kdWNlZCB0byBzd2l0Y2gKKyAgICAgICAgICAgIHRvIHRoZSBSRkM3MjMxIGNvbXBsaWFudAorICAgICAgICAgICAgYmVoYXZpb3VyOiAmamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzLkxPQ0FUSU9OX0hFQURFUl9SRUxBVElWRV9VUklfUkVTT0xVVElPTl9SRkM3MjMxOy4gQWxzbywKKyAgICAgICAgICAgIHRoZSBwb3NzaWJpbGl0eSB0byBzd2l0Y2ggdGhlIFVSSSByZXNvbHV0aW9uIGNvbXBsZXRlbHkgb2ZmIHJlbWFpbnMgd2l0aCB0aGUKKyAgICAgICAgICAgICZqZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMuTE9DQVRJT05fSEVBREVSX1JFTEFUSVZFX1VSSV9SRVNPTFVUSU9OX0RJU0FCTEVEOyBkaXNhYmxlZCBzd2l0Y2guIEJvdGgKKyAgICAgICAgICAgIHByb3BlcnRpZXMgYXJlIGZhbHNlIGJ5IGRlZmF1bHQuCisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiB4bWw6aWQ9Im1pZy0yLjIyLjEiPgorICAgICAgICA8dGl0bGU+TWlncmF0aW5nIGZyb20gSmVyc2V5IDIuMjIgdG8gMi4yMi4xPC90aXRsZT4KKyAgICAgICAgPHNlY3Rpb24geG1sOmlkPSJtaWctMi4yMi4xLWJyZWFraW5nLWNoYW5nZXMiPgorICAgICAgICAgICAgPHRpdGxlPkJyZWFraW5nIENoYW5nZXM8L3RpdGxlPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgTGFzdCB2ZXJzaW9uIGNvbnRhaW5lZCBhIGNoYW5nZSBpbiByZWxhdGl2ZSBVUkkgcmVzb2x1dGlvbiBpbiB0aGUgbG9jYXRpb24gaGVhZGVyLiBFdmVuIHRob3VnaCB0aGUgY2hhbmdlIHdhcworICAgICAgICAgICAgICAgIGZpeGluZyB0aGUgZGlzY3JlcGFuY3kgYmV0d2VlbiB0aGUgcmVhbCBiZWhhdmlvdXIgYW5kIFJGQzcyMzEsIGl0IGFsc28gY2F1c2VkIEpBWC1SUyBzcGVjIGluY29tcGF0aWJpbGl0eSBpbiBzb21lCisgICAgICAgICAgICAgICAgY2FzZXMuIEZ1cnRoZXJtb3JlLCB0aGVyZSB3YXMgbm8gd2F5IHRvIHByZXNlcnZlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhlcmVmb3JlLCB0aGUgZGVmYXVsdCBiZWhhdmlvdXIgd2FzIHJvbGxiYWNrZWQgYW5kIGEgbmV3IGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgd2FzIGludHJvZHVjZWQgdG8gc3dpdGNoIHRvIHRoZQorICAgICAgICAgICAgICAgIFJGQzcyMzEgY29tcGxpYW50IGJlaGF2aW91cjogJmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcy5MT0NBVElPTl9IRUFERVJfUkVMQVRJVkVfVVJJX1JFU09MVVRJT05fUkZDNzIzMTsuCisgICAgICAgICAgICAgICAgQWxzbywgdGhlIHBvc3NpYmlsaXR5IHRvIHN3aXRjaCB0aGUgVVJJIHJlc29sdXRpb24gY29tcGxldGVseSBvZmYgcmVtYWlucyB3aXRoCisgICAgICAgICAgICAgICAgdGhlICZqZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMuTE9DQVRJT05fSEVBREVSX1JFTEFUSVZFX1VSSV9SRVNPTFVUSU9OX0RJU0FCTEVEOyBkaXNhYmxlZCBzd2l0Y2guIEJvdGgKKyAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzIGFyZSBmYWxzZSBieSBkZWZhdWx0LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24geG1sOmlkPSJtaWctMi4yMiI+CisgICAgICAgIDx0aXRsZT5NaWdyYXRpbmcgZnJvbSBKZXJzZXkgMi4yMSB0byAyLjIyPC90aXRsZT4KKyAgICAgICAgPHNlY3Rpb24geG1sOmlkPSJtaWctMi4yMi1icmVha2luZy1jaGFuZ2VzIj4KKyAgICAgICAgICAgIDx0aXRsZT5CcmVha2luZyBDaGFuZ2VzPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluIHByZXZpb3VzIEplcnNleSB2ZXJzaW9ucywgaWYgdGhlIHJlc291cmNlIG1ldGhvZCBjcmVhdGVkIGEgcmVzcG9uc2UgY29udGFpbmluZyByZWxhdGl2ZSBVUkkgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+TG9jYXRpb248L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cCBoZWFkZXIsIHRoZSBVUkkgd2FzIHJlc29sdmVkIGFnYWluc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXM+YmFzZSB1cmk8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZSBhcHBsaWNhdGlvbi4gVGhpcyBiZWhhdmlvdXIgd2FzIG5vdCBjb3JyZWN0LCBhcyBwb2ludGVkIG91dCBieSAmamVyc2V5LmppcmEuMjg4MzsuIFdpdGggdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZSwgdGhlIFVSSSBpcywgYnkgZGVmYXVsdCwgcmVzb2x2ZWQgYWdhaW5zdDxlbXBoYXNpcz5yZXF1ZXN0IGJhc2UgdXJpPC9lbXBoYXNpcz4uCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwgaGF2aW5nIGEgcmVzb3VyY2UgYXQ8bGl0ZXJhbD5odHRwOi8vc2VydmVyLmNvbS9hcGkvbWFuYWdlbWVudC91c2VyPC9saXRlcmFsPiwgdGhhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybnMgcmVzcG9uc2Ugd2l0aDxsaXRlcmFsPkxvY2F0aW9uOiBmb288L2xpdGVyYWw+LCB3aGlsZSB0aGUgcm9vdCBvZiB0aGUgYXBwIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+aHR0cDovL3NlcnZlci5jb20vYXBpPC9saXRlcmFsPiwgdGhlIHJlc3VsdGluZyBVUkkgd2lsbCBiZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2ltcGxlbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1lbWJlcj53aXRoIEplcnNleSAyLjIxIGFuZCBlYXJsaWVyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+aHR0cDovL3NlcnZlci5jb20vYXBpL2ZvbzwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tZW1iZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtZW1iZXI+d2l0aCBKZXJzZXkgMi4yMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmh0dHA6Ly9zZXJ2ZXIuY29tL2FwaS9tYW5hZ2VtZW50L2ZvbzwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tZW1iZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zaW1wbGVsaXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxlYXNlIG5vdGUsIHRoYXQgdGhlIHRyYWlsaW5nIHNsYXNoIGlzIHNpZ25pZmljYW50LCBzbyB0aGF0IGlmIHRoZSBVUkkgZW5kcyB3aXRoIGEgc2xhc2ggKDxsaXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly9zZXJ2ZXIuY29tL2FwaS9tYW5hZ2VtZW50L3VzZXIvPC9saXRlcmFsPiksIHRoZSBvdXRwdXQgd2lsbCBiZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2ltcGxlbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1lbWJlcj53aXRoIEplcnNleSAyLjIxIGFuZCBlYXJsaWVyOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+aHR0cDovL3NlcnZlci5jb20vYXBpL2ZvbzwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9tZW1iZXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtZW1iZXI+d2l0aCBKZXJzZXkgMi4yMjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmh0dHA6Ly9zZXJ2ZXIuY29tL2FwaS9tYW5hZ2VtZW50L3VzZXIvZm9vPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L21lbWJlcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NpbXBsZWxpc3Q+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbHRlcm5hdGl2ZWx5LCB0aGUgZW50aXJlIFVSSSByZXNvbHZpbmcgbG9naWMgY2FuIGJlIHN3aXRjaGVkIG9mZiBieSBuZXdseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludHJvZHVjZWQgJmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcy5MT0NBVElPTl9IRUFERVJfUkVMQVRJVkVfVVJJX1JFU09MVVRJT05fRElTQUJMRUQ7IHByb3BlcnR5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSB2YWx1ZSBpczxsaXRlcmFsPnRydWU8L2xpdGVyYWw+LCBKZXJzZXkgd2lsbCBub3QgY2hhbmdlIHRoZSBVUkkgY29udGFpbmVkIGluIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPkxvY2F0aW9uPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlciBhdCBhbGwgKGV2ZW4gaWYgdGhpcyBiZWhhdmlvdXIgbWF5IG5vdCBtYXRjaCB3aXRoIGJlaGF2aW91ciBkZXNjcmliZWQgaW4gSmF2YURvYykuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiB4bWw6aWQ9Im1pZy0yLjIwIj4KKyAgICAgICAgPHRpdGxlPk1pZ3JhdGluZyBmcm9tIEplcnNleSAyLjE5IHRvIDIuMjA8L3RpdGxlPgorCisgICAgICAgIDxzZWN0aW9uIHhtbDppZD0ibWlnLTIuMjAtYnJlYWtpbmctY2hhbmdlcyI+CisgICAgICAgICAgICA8dGl0bGU+QnJlYWtpbmcgQ2hhbmdlczwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXcgcGFyYW1ldGVyLDxsaXRlcmFsPm9yZy5nbGFzc2Zpc2guaGsyLmFwaS5TZXJ2aWNlTG9jYXRvcjwvbGl0ZXJhbD4sIGhhcyBiZWVuIGFkZGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gJmplcnNleS5zZXJ2ZXIuc3BpLkV4dGVybmFsUmVxdWVzdFNjb3BlOyBtZXRob2RzLiBUaGlzIGlzIHRvIGFsbG93IDNyZCBwYXJ0eSBjb21wb25lbnQgcHJvdmlkZXJzIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9vayB1cCB3aXRoIHRoZSBhY3R1YWwgSEsyIGxvY2F0b3IgaW4gY2FzZSBvZiBtdWx0aXBsZSBKZXJzZXkgYXBwbGljYXRpb25zIGFyZSBydW5uaW5nIGluIHBhcmFsZWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aGluIGEgc2luZ2xlIDNyZCBwYXJ0eSBjb21wb25lbnQgY29udGFpbmVyLiBUaGUgY2hhbmdlIHdhcyBkcml2ZW4gYnkgQ0RJL1NlcnZsZXQgcmVxdWlyZW1lbnRzLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24geG1sOmlkPSJtaWctMi4xOSI+CisgICAgICAgIDx0aXRsZT5NaWdyYXRpbmcgZnJvbSBKZXJzZXkgMi4xOCB0byAyLjE5PC90aXRsZT4KKworICAgICAgICA8c2VjdGlvbiB4bWw6aWQ9Im1pZy0yLjE5LWJyZWFraW5nLWNoYW5nZXMiPgorICAgICAgICAgICAgPHRpdGxlPkJyZWFraW5nIENoYW5nZXM8L3RpdGxlPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV3IG1ldGhvZCw8bGl0ZXJhbD5jbG9zZTwvbGl0ZXJhbD4sIGhhcyBiZWVuIGFkZGVkIHRvICZqZXJzZXkuc2VydmVyLlJlc291cmNlRmluZGVyOy4gSXQncyBpbnRlbnRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB0byByZWxlYXNlIGFsbG9jYXRlZC9vcGVuZWQgcmVzb3VyY2VzIChzdWNoIGFzIHN0cmVhbXMpIHdpdGhvdXQgYSBuZWVkIHRvIGl0ZXJhdGUgdGhyb3VnaCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aG9sZSAmbGl0LmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VGaW5kZXI7LgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24geG1sOmlkPSJtaWctMi4xOCI+CisgICAgICAgIDx0aXRsZT5NaWdyYXRpbmcgZnJvbSBKZXJzZXkgMi4xNyB0byAyLjE4PC90aXRsZT4KKworICAgICAgICA8c2VjdGlvbiB4bWw6aWQ9Im1pZy0yLjE4LWhpZ2hsaWdodHMiPgorICAgICAgICAgICAgPHRpdGxlPlJlbGVhc2UgMi4xOCBIaWdobGlnaHRzPC90aXRsZT4KKworICAgICAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICAgICAgPHRpdGxlPlVwZGF0ZWQgdG8gTU9YeSAyLjY8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBKZXJzZXkgaGFzIHVwZGF0ZWQgdmVyc2lvbiBvZiBNT1h5IChYTUwvSlNPTiBwcm92aWRlcikgdG8gdmVyc2lvbiAyLjYuIEFtb25nIHNvbWUgYnVnIGZpeGVzIHRoZXJlIGFyZSBvdGhlcgorICAgICAgICAgICAgICAgICAgICBub3RhYmxlIGNoYW5nZXMgKHNvbWUgb2YgdGhlbSBicmVha2luZykgdGhhdCB5b3Ugc2hvdWxkIGJlIGF3YXJlIG9mOgorCisgICAgICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaW5rIHhsaW5rOmhyZWY9J2h0dHBzOi8vd2lraS5lY2xpcHNlLm9yZy9FY2xpcHNlTGluay9EZXNpZ25Eb2NzLzQ1OTQ2NCc+UmVkZXNpZ24gb2YgdHlwZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkgaW4gSlNPTiBwcm9jZXNzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGluaz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBTcGVjaWFsIGhhbmRsaW5nIG9mIEpTT04KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+dHlwZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkgaXMgZGVwcmVjYXRlZC4gSWYgdGhlcmUgaXMgbmVlZCB0byBpZGVudGlmeSB0eXBlIG9mIEpTT04gb2JqZWN0IC0gZHVlIHRvIG1pc3Npbmcgcm9vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50IG9yIHNvbWUgc3BlY2lhbCBpbmhlcml0YW5jZSByZXF1aXJlbWVudHMsIGl0IGlzIG5lY2Vzc2FyeSB0byBzcGVjaWZ5IGZ1bGx5IHF1YWxpZmllZCB0eXBlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5IHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2U8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGluayB4bGluazpocmVmPSdodHRwczovL2J1Z3MuZWNsaXBzZS5vcmcvYnVncy9hdHRhY2htZW50LmNnaT9pZD0yNDE1MDYnPkJlYW4gVmFsaWRhdGlvbiBpbiBNT1h5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGluaz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGluayB4bGluazpocmVmPSdodHRwczovL3dpa2kuZWNsaXBzZS5vcmcvRWNsaXBzZUxpbmsvRGVzaWduRG9jcy80MDUxNjEnPk1PWHkgc3VwcG9ydCBmb3IgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKYXZhIEFQSSBmb3IgSlNPTiBQcm9jZXNzaW5nIChKU1ItMzUzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpbms+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICAgICAgPHRpdGxlPlByb21vdGVkIFB1YmxpYyBCZXRhIEFQSXM8L3RpdGxlPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFNldmVyYWwgZXhwZXJpbWVudGFsIEplcnNleSBBUElzIGhhdmUgbWF0dXJlZCBlbm91Z2ggYW5kIGFzIHN1Y2ggd2UgaGF2ZSBkZWNpZGVkIHRvIHByb21vdGUgdGhlbQorICAgICAgICAgICAgICAgICAgICBmcm9tICZqZXJzZXkuY29tbW9uLkJldGE7IHN0YXR1cywgbmFtZWx5OgorCisgICAgICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEplcnNleSBSZWFjdGl2ZSBDbGllbnQgQVBJLiBBbHNvIFJlYWN0aXZlIENsaWVudCBtb3ZlZCBmcm9tIGluY3ViYXRvciB0byBleHRlbnNpb24gKHVtYnJlbGxhKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmVyc2V5IGNsaWVudC1zaWRlICZqZXJzZXkuY2xpZW50LkNsaWVudExpZmVjeWNsZUxpc3RlbmVyOyBTUEkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmVyc2V5IHNlcnZlci1zaWRlICZqZXJzZXkuc2VydmVyLkNvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyOyBTUEkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmVyc2V5IHNlcnZlci1zaWRlIChNVkMpICZqZXJzZXkuc2VydmVyLm12Yy5FcnJvclRlbXBsYXRlOyBhbm5vdGF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEplcnNleSB0ZXN0IGZyYW1ld29yayAoY2xpZW50LXNpZGUpICZqZXJzZXkudGVzdC51dGlsLkxvb3BCYWNrQ29ubmVjdG9yUHJvdmlkZXI7IGNvbm5lY3Rvci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKZXJzZXkgdGVzdCBmcmFtZXdvcmsgKHNlcnZlci1zaWRlKSAmamVyc2V5LnRlc3QudXRpbC5Db250YWluZXJSZXF1ZXN0QnVpbGRlcjsgY2xhc3MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisKKyAgICAgICAgICAgICAgICAgICAgVGhlc2UgQVBJcyBhcmUgbm93IHBhcnQgb2YgdGhlIG9mZmljaWFsIHB1YmxpYyBKZXJzZXkgMi54IEFQSS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICA8c2VjdGlvbiB4bWw6aWQ9Im1pZy0yLjE4LXJlbW92ZWQtZGVwcmVjYXRlZCI+CisgICAgICAgICAgICA8dGl0bGU+UmVtb3ZlZCBkZXByZWNhdGVkIEFQSXM8L3RpdGxlPgorICAgICAgICAgICAgPHBhcmE+Rm9sbG93aW5nLCBhbHJlYWR5IGRlcHJlY2F0ZWQsIEFQSXMgd2VyZSByZW1vdmVkOjwvcGFyYT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+b3JnLmdsYXNzZmlzaC5qZXJzZXkuYXBhY2hlLmNvbm5lY3Rvci5BcGFjaGVDbGllbnRQcm9wZXJ0aWVzPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gY29uc3RhbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5TU0xfQ09ORklHPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAmamF4cnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7IG1ldGhvZHMgdG8gY29uZmlndXJlIFNTTCBpbiBhICZqYXhycy5jbGllbnQuQ2xpZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5vcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0eS5jb25uZWN0b3IuSmV0dHlDbGllbnRQcm9wZXJ0aWVzPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gY29uc3RhbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5TU0xfQ09ORklHPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAmamF4cnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7IG1ldGhvZHMgdG8gY29uZmlndXJlIFNTTCBpbiBhICZqYXhycy5jbGllbnQuQ2xpZW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5GcmVlbWFya2VyTXZjRmVhdHVyZS5URU1QTEFURVNfQkFTRV9QQVRIPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gY29uc3RhbnQgaGFzIGJlZW4gdW5pZmllZCBhY3Jvc3MgTVZDIG1vZHVsZXMgYW5kIHRoZSBkZXByZWNhdGVkIG9uZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5GcmVlbWFya2VyTXZjRmVhdHVyZS5URU1QTEFURV9CQVNFX1BBVEg8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgcHJvcGVydHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5qZXJzZXkuY29uZmlnLnNlcnZlci5tdmMudGVtcGxhdGVCYXNlUGF0aC5mcmVlbWFya2VyPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RlYWQuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPkpzcE12Y0ZlYXR1cmUuVEVNUExBVEVTX0JBU0VfUEFUSDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGNvbnN0YW50IGhhcyBiZWVuIHVuaWZpZWQgYWNyb3NzIE1WQyBtb2R1bGVzIGFuZCB0aGUgZGVwcmVjYXRlZCBvbmUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+SnNwTXZjRmVhdHVyZS5URU1QTEFURV9CQVNFX1BBVEg8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgcHJvcGVydHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5qZXJzZXkuY29uZmlnLnNlcnZlci5tdmMudGVtcGxhdGVCYXNlUGF0aC5qc3A8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGVhZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgIDxzZWN0aW9uIHhtbDppZD0ibWlnLTIuMTgtYnJlYWtpbmctY2hhbmdlcyI+CisgICAgICAgICAgICA8dGl0bGU+QnJlYWtpbmcgQ2hhbmdlczwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ3JhdGlvbiBvZiBleGVjdXRvciBwcm92aWRlcnMgZm9yIEplcnNleSBydW50aW1lIGhhcyBiZWVuIHVuaWZpZWQgYW5kIHJlZmFjdG9yZWQuIEFzIGEgcmVzdWx0LCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5vcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuUmVxdWVzdEV4ZWN1dG9yUHJvdmlkZXI8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLlJ1bnRpbWVUaHJlYWRQcm92aWRlcjwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTUElzIGhhdmUgYmVlbiByZW1vdmVkIGZyb20gSmVyc2V5LiBBIG5ldywgY29tbW9uICZhbXA7IGdlbmVyaWMgZXhlY3V0b3Igc2VydmljZSBwcm92aWRlcnMgaGF2ZSBiZWVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50cm9kdWNlZCBpbnN0ZWFkOiAmamVyc2V5LmNvbW1vbi5zcGkuRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kICZqZXJzZXkuY29tbW9uLnNwaS5TY2hlZHVsZWRFeGVjdXRvclNlcnZpY2VQcm92aWRlcjsuIFRoZXNlIG5ldyBwcm92aWRlcnMgYXJlIHVzZWQgdG8gc3VwcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbSBxdWFsaWZpZWQgZXhlY3V0b3Igc2VydmljZSBpbmplY3Rpb24sIGluY2x1ZGluZyB0aGUgcmVmYWN0b3JlZCB1c2UgY2FzZXMgb2YgY2xpZW50IGFzeW5jaHJvbm91cworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgZXhlY3V0aW9uLCBzZXJ2ZXItc2lkZSBtYW5hZ2VkIGFzeW5jaHJvbm91cyByZXF1ZXN0IHByb2Nlc3NpbmcgYXMgd2VsbCBhcyBzZXJ2ZXItc2lkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tncm91bmQgdGFzayBzY2hlZHVsZXIuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiB4bWw6aWQ9Im1pZy0yLjE3Ij4KKyAgICAgICAgPHRpdGxlPk1pZ3JhdGluZyBmcm9tIEplcnNleSAyLjE2IHRvIDIuMTc8L3RpdGxlPgorICAgICAgICA8c2VjdGlvbiB4bWw6aWQ9Im1pZy0yLjE3LWhpZ2hsaWdodHMiPgorICAgICAgICAgICAgPHRpdGxlPlJlbGVhc2UgMi4xNyBIaWdobGlnaHRzPC90aXRsZT4KKworICAgICAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICAgICAgPHRpdGxlPkNESSBpbnRlZ3JhdGlvbiBpbiBFQVIgcGFja2FnZWQgV0FSczwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEZyb20gdmVyc2lvbiAyLjE3IG9ud2FyZHMsIGl0J3MgcG9zc2libGUgdG8gdXNlIENESSB3aXRoIEpBWC1SUyB3ZWItYXBwbGljYXRpb25zIHBhY2thZ2VkIGluIEVBUi4gQWxsCisgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZCBISzIvQ0RJIGluamVjdGlvbnMgbm93IHdvcmsgYXMgZXhwZWN0ZWQgZm9yIEpBWC1SUyBhcHBsaWNhdGlvbiBkZXBsb3llZCBpbiB0aGUgbWVudGlvbmVkIGZhc2hpb24uCisgICAgICAgICAgICAgICAgICAgIE9uZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IG1vZHVsZXMKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+amVyc2V5LWNkaTF4PC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICBhbmQKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+amVyc2V5LWNkaTF4LXNlcnZsZXQ8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgIGFyZSBwcmVzZW50IGluIFNlcnZsZXQgY29udGFpbmVyICh0aGF0IHN1cHBvcnRzIEVBUnMpLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIHhtbDppZD0ibWlnLTIuMTYiPgorICAgICAgICA8dGl0bGU+TWlncmF0aW5nIGZyb20gSmVyc2V5IDIuMTUgdG8gMi4xNjwvdGl0bGU+CisgICAgICAgIDxzZWN0aW9uIHhtbDppZD0ibWlnLTIuMTYtaGlnaGxpZ2h0cyI+CisgICAgICAgICAgICA8dGl0bGU+UmVsZWFzZSAyLjE2IEhpZ2hsaWdodHM8L3RpdGxlPgorCisgICAgICAgICAgICA8c2VjdGlvbj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+SkFYLUIgcHJvdmlkZXJzIHNlcGFyYXRlZCBmcm9tIHRoZSBjb3JlPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgRnJvbSB2ZXJzaW9uIDIuMTYgb253YXJkcywgYWxsIEpBWC1CIHByb3ZpZGVycyBhcmUgYmVpbmcgYnVuZGxlZCBpbiBhIHNlcGFyYXRlIG1vZHVsZS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgICAgICA8c2VjdGlvbj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+UGVyZm9ybWFuY2UgZ2FpbiB3aGVuIHVzaW5nIFN1Yi1SZXNvdXJjZSBMb2NhdG9yczwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFdlIGltcHJvdmVkIHRoZSBwZXJmb3JtYW5jZSBmb3IgdXNpbmcgc3ViLXJlc291cmNlIGxvY2F0b3JzIGluIGFuIEplcnNleSBhcHBsaWNhdGlvbi4gVGhlIHBlcmZvcm1hbmNlIGdhaW5zCisgICAgICAgICAgICAgICAgICAgIGFyZSBhdmFpbGFibGUgZm9yIGNhc2VzIHdoZW4gdGhlIHN1Yi1yZXNvdXJjZSBsb2NhdG9yIG1ldGhvZCByZXR1cm5zIGVpdGhlciBhIHJlc291cmNlIGNsYXNzIChyZXR1cm4gdmFsdWUgaXMKKyAgICAgICAgICAgICAgICAgICAgZS5nLgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5DbGFzcyZsdDs/Jmd0OzwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgb3I8bGl0ZXJhbD5DbGFzcyZsdDtNeVN1YlJlc291cmNlJmd0OzwvbGl0ZXJhbD4pIG9yIGEgKG5vbi1wcm94aWVkKSByZXNvdXJjZSBpbnN0YW5jZSAod2hlbiByZXR1cm4gdmFsdWUgaXMgYW4KKyAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2Ugb2YKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+TXlTdWJSZXNvdXJjZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgY2xhc3MpLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgICAgIDxzZWN0aW9uPgorICAgICAgICAgICAgICAgIDx0aXRsZT5Nb3JlIHVuaWZpZWQgY29ubmVjdG9yIGNvbmZpZ3VyYXRpb24gb3B0aW9uczwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEpldHR5IGNvbm5lY3RvciBhbmQgQXBhY2hlIGNvbm5lY3RvciBoYXZlIGJlZW4gcHJldmlvdXNseSB1c2luZyB0aGVpciBvd24gY3VzdG9tIHByb3BlcnRpZXMgdG8gc2V0IFNTTCBjb250ZXh0CisgICAgICAgICAgICAgICAgICAgIG9uIGEgY29ubmVjdG9yLiBUaGVzZSBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBkZXByZWNhdGVkIGFuZCB0aGUgY29kZSBoYXMgYmVlbiB1cGRhdGVkIHRvIHJlYWQgdGhlIFNTTCBjb250ZXh0CisgICAgICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uIGZyb20gdGhlIEpBWC1SUyBjbGllbnQgY29uZmlndXJhdGlvbi4gVGhpcyBtZWFucyB0aGF0IGFsbCBKZXJzZXkgY29ubmVjdG9ycyBub3cgcHJvcGVybHkgYWNjZXB0CisgICAgICAgICAgICAgICAgICAgIFNTTCBjb25maWd1cmF0aW9uIGFzIGNvbmZpZ3VyZWQgdmlhIHN0YW5kYXJkIEpBWC1SUyAmamF4cnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7IG1ldGhvZHMuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBQcmV2aW91c2x5LCBhbGwgSmVyc2V5IGNvbm5lY3RvcnMgaGF2ZSBiZWVuIHVzaW5nIHRoZWlyIG93biBkZWZhdWx0IGNodW5rIHNpemUgd2hlbiBIVFRQIGNodW5rZWQgY29kaW5nIHdhcworICAgICAgICAgICAgICAgICAgICB1c2VkLiBTaW5jZSBKZXJzZXkgMi4xNiwgdGhlcmUgaXMgYSBuZXcgZGVmYXVsdCBjaHVuayBzaXplIHZhbHVlIHVzZWQgYnkgYWxsIGNvbm5lY3RvcnMsIGlmIGEgY3VzdG9tIGNodW5rCisgICAgICAgICAgICAgICAgICAgIHNpemUgaXMgbm90IHNldC4gVGhlIG5ldyBkZWZhdWx0IHZhbHVlIGlzIHN0b3JlZCB1bmRlciAmamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzLkRFRkFVTFRfQ0hVTktfU0laRTsKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50IHByb3BlcnR5LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiB4bWw6aWQ9Im1pZy0yLjE2LW5ldy1kZXByZWNhdGVkIj4KKyAgICAgICAgICAgIDx0aXRsZT5EZXByZWNhdGVkIEFQSXM8L3RpdGxlPgorICAgICAgICAgICAgPHBhcmE+Rm9sbG93aW5nIEFQSXMgd2VyZSBkZXByZWNhdGVkOjwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPm9yZy5nbGFzc2Zpc2guamVyc2V5LmFwYWNoZS5jb25uZWN0b3IuQXBhY2hlQ2xpZW50UHJvcGVydGllczwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGNvbnN0YW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+U1NMX0NPTkZJRzwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXMgYmVlbiBtYXJrZWQgYXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgc3Vic2VxdWVudCByZWxlYXNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZSAmamF4cnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7IG1ldGhvZHMgdG8gY29uZmlndXJlIFNTTCBpbiBhICZqYXhycy5jbGllbnQuQ2xpZW50OyBpbnN0YW5jZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+b3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dHkuY29ubmVjdG9yLkpldHR5Q2xpZW50UHJvcGVydGllczwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGNvbnN0YW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+U1NMX0NPTkZJRzwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXMgYmVlbiBtYXJrZWQgYXMgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgc3Vic2VxdWVudCByZWxlYXNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZSAmamF4cnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7IG1ldGhvZHMgdG8gY29uZmlndXJlIFNTTCBpbiBhICZqYXhycy5jbGllbnQuQ2xpZW50OyBpbnN0YW5jZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiB4bWw6aWQ9Im1pZy0yLjE2LWJyZWFraW5nLWNoYW5nZXMiPgorICAgICAgICAgICAgPHRpdGxlPkJyZWFraW5nIENoYW5nZXM8L3RpdGxlPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSkFYLUIgc3VwcG9ydCBtb2R1bGFyaXphdGlvbiBtaWdodCBjYXVzZSBicmVha2luZyBjaGFuZ2VzIGZvciB0aG9zZSB1c2VycyByZWx5aW5nIG9uIEpBWC1CIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGx5IHJlZmVycmluZyB0byB0aGUgSmVyc2V5IGNvcmUtY29tbW9uIG1vZHVsZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9InhtbCIgbGluZW51bWJlcmluZz0idW5udW1iZXJlZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsdDtkZXBlbmRlbmN5Jmd0OyAmbHQ7Z3JvdXBJZCZndDtvcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlJmx0Oy9ncm91cElkJmd0OyAmbHQ7YXJ0aWZhY3RJZCZndDtqZXJzZXktY29tbW9uJmx0Oy9hcnRpZmFjdElkJmd0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbHQ7dmVyc2lvbiZndDske3ByZS0yLjE2LXZlcnNpb259Jmx0Oy92ZXJzaW9uJmd0OyAmbHQ7L2RlcGVuZGVuY3kmZ3Q7PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZm9sbG93aW5nIG5lZWRzIHRvIGJlIGluY2x1ZGVkIGluIGFkZGl0aW9uIGZyb20gdmVyc2lvbiAyLjE2IG9uOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0ieG1sIiBsaW5lbnVtYmVyaW5nPSJ1bm51bWJlcmVkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmx0O2RlcGVuZGVuY3kmZ3Q7ICZsdDtncm91cElkJmd0O29yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhJmx0Oy9ncm91cElkJmd0OyAmbHQ7YXJ0aWZhY3RJZCZndDtqZXJzZXktbWVkaWEtamF4YiZsdDsvYXJ0aWZhY3RJZCZndDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmx0O3ZlcnNpb24mZ3Q7JnZlcnNpb247Jmx0Oy92ZXJzaW9uJmd0OyAmbHQ7L2RlcGVuZGVuY3kmZ3Q7PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+TWVkaWFUeXBlPC9saXRlcmFsPidzIHF1YWxpdHkgc291cmNlIHBhcmFtZXRlcnMgKDxsaXRlcmFsPnFzPC9saXRlcmFsPikgcmV1c2UgdGhlIHNhbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzaW5nIGFzIHF1YWxpdHkgcGFyYW1ldGVycy4gVGhpcyBtZWFucyB0aGF0IHZhbHVlcyBoaWdoZXIgdGhhbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPjEuMDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBQYXJzZUV4Y2VwdGlvbi4gSS5lLiBmb2xsb3dpbmcgZXhhbXBsZSBpcyBub3QgYWxsb3dlZCBhbnkgbW9yZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9InVubnVtYmVyZWQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAUGF0aCgiLyIpIEBQcm9kdWNlcygidGV4dC9odG1sO3FzPTUiKSAvLyB3cm9uZyAncXMnIHZhbHVlIHB1YmxpYyBjbGFzcyBCb29rc3RvcmUgeyAuLi4gfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiB4bWw6aWQ9Im1pZy0yLjE1Ij4KKyAgICAgICAgPHRpdGxlPk1pZ3JhdGluZyB0byAyLjE1PC90aXRsZT4KKyAgICAgICAgPHNlY3Rpb24geG1sOmlkPSJtaWctMi4xNS1oaWdobGlnaHRzIj4KKyAgICAgICAgICAgIDx0aXRsZT5SZWxlYXNlIDIuMTUgSGlnaGxpZ2h0czwvdGl0bGU+CisKKyAgICAgICAgICAgIDxzZWN0aW9uPgorICAgICAgICAgICAgICAgIDx0aXRsZT5Db250YWluZXIgYWdub3N0aWMgQ0RJIHN1cHBvcnQ8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBCZWZvcmUgMi4xNSwgQ0RJIGludGVncmF0aW9uIHdhcyBzdXBwb3J0ZWQgcHJpbWFyaWx5IGluIEphdmEgRUUgY29udGFpbmVycyB3aXRoIGJ1aWx0LWluIENESSBzdXBwb3J0LiBGcm9tCisgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gMi4xNSBvbndhcmRzLCBpdCBpcyBwb3NzaWJsZSB0byBsZXZlcmFnZSBDREkgaW50ZWdyYXRpb24gYWxzbyBvdXRzaWRlIG9mIEphdmEgRUUgZW52aXJvbm1lbnQuIEEgbmV3CisgICAgICAgICAgICAgICAgICAgIGV4YW1wbGUsPGxpbmsgeGxpbms6aHJlZj0naHR0cHM6Ly9naXRodWIuY29tL2plcnNleS9qZXJzZXkvdHJlZS9tYXN0ZXIvZXhhbXBsZXMvaGVsbG93b3JsZC13ZWxkJz4KKyAgICAgICAgICAgICAgICAgICAgaGVsbG93b3JsZC13ZWxkPC9saW5rPiwgaGFzIGJlZW4gaW50cm9kdWNlZCB0byBkZW1vbnN0cmF0ZSB0aGUgbmV3IGZlYXR1cmUgdXNpbmcgR3JpenpseSBIVFRQIHNlcnZlci4gQW5vdGhlcgorICAgICAgICAgICAgICAgICAgICBleGFtcGxlIGFwcGxpY2F0aW9uLDxsaW5rIHhsaW5rOmhyZWY9J2h0dHBzOi8vZ2l0aHViLmNvbS9qZXJzZXkvamVyc2V5L3RyZWUvbWFzdGVyL2V4YW1wbGVzL2NkaS13ZWJhcHAnPgorICAgICAgICAgICAgICAgICAgICBjZGktd2ViYXBwPC9saW5rPiwgaGFzIGJlZW4gdXBkYXRlZCBzbyB0aGF0IGl0IGVuYWJsZXMgQXBhY2hlIFRvbWNhdCBTZXJ2ZXIgZGVwbG95bWVudC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgIDxzZWN0aW9uIHhtbDppZD0ibWlnLTIuMTUtYnJlYWtpbmctY2hhbmdlcyI+CisgICAgICAgICAgICA8dGl0bGU+QnJlYWtpbmcgQ2hhbmdlczwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDREkgc3VwcG9ydCBpbXByb3ZlbWVudCBjYXVzZWQgYnJlYWtpbmcgY2hhbmdlcyBmb3IgdGhvc2UgdXNlcnMgZGlyZWN0bHkgcmVmZXJyaW5nIHRvIHRoZSBmb2xsb3dpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDREkgc3VwcG9ydGluZyBKZXJzZXkgbW9kdWxlIGluIG1hdmVuOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0ieG1sIiBsaW5lbnVtYmVyaW5nPSJ1bm51bWJlcmVkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmx0O2RlcGVuZGVuY3kmZ3Q7ICZsdDtncm91cElkJmd0O29yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnMuZ2xhc3NmaXNoJmx0Oy9ncm91cElkJmd0OyAmbHQ7YXJ0aWZhY3RJZCZndDtqZXJzZXktZ2YtY2RpJmx0Oy9hcnRpZmFjdElkJmd0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbHQ7dmVyc2lvbiZndDske3ByZS0yLjE1LXZlcnNpb259Jmx0Oy92ZXJzaW9uJmd0OyAmbHQ7L2RlcGVuZGVuY3kmZ3Q7PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgYWJvdmUgZGVwZW5kZW5jeSBuZWVkcyB0byBiZSByZXBsYWNlZCB3aXRoOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0ieG1sIiBsaW5lbnVtYmVyaW5nPSJ1bm51bWJlcmVkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmx0O2RlcGVuZGVuY3kmZ3Q7ICZsdDtncm91cElkJmd0O29yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkmbHQ7L2dyb3VwSWQmZ3Q7ICZsdDthcnRpZmFjdElkJmd0O2plcnNleS1jZGkxeCZsdDsvYXJ0aWZhY3RJZCZndDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmx0O3ZlcnNpb24mZ3Q7JnZlcnNpb247Jmx0Oy92ZXJzaW9uJmd0OyAmbHQ7L2RlcGVuZGVuY3kmZ3Q7PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgZm9sbG93aW5nIG5lZWRzIHRvIGJlIGluY2x1ZGVkIGluIGFkZGl0aW9uIGlmIHlvdSB3YW50IHRvIGxldmVyYWdlIENESSBKVEEgc3VwcG9ydDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9InhtbCIgbGluZW51bWJlcmluZz0idW5udW1iZXJlZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsdDtkZXBlbmRlbmN5Jmd0OyAmbHQ7Z3JvdXBJZCZndDtvcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpJmx0Oy9ncm91cElkJmd0OyAmbHQ7YXJ0aWZhY3RJZCZndDtqZXJzZXktY2RpMXgtdHJhbnNhY3Rpb24mbHQ7L2FydGlmYWN0SWQmZ3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsdDt2ZXJzaW9uJmd0OyZ2ZXJzaW9uOyZsdDsvdmVyc2lvbiZndDsgJmx0Oy9kZXBlbmRlbmN5Jmd0OzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+CisKKworICAgIDxzZWN0aW9uIHhtbDppZD0ibWlnLTIuMTIiPgorICAgICAgICA8dGl0bGU+TWlncmF0aW5nIGZyb20gSmVyc2V5IDIuMTEgdG8gMi4xMjwvdGl0bGU+CisgICAgICAgIDxzZWN0aW9uIHhtbDppZD0ibWlnLTIuMTItaGlnaGxpZ2h0cyI+CisgICAgICAgICAgICA8dGl0bGU+UmVsZWFzZSAyLjEyIEhpZ2hsaWdodHM8L3RpdGxlPgorICAgICAgICAgICAgPHBhcmE+Rm9sbG93aW5nIGV4cGVyaW1lbnRhbCBBUElzIGhhdmUgYmVlbiBwcm9tb3RlZCB0byBiZWNvbWUgcGFydCBvZiBwdWJsaWMgSmVyc2V5IEFQSToKKyAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBKZXJzZXkgY2xpZW50LXNpZGUgJmplcnNleS5jbGllbnQuSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZTsgQVBJLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBKZXJzZXkgc2VydmVyLXNpZGUgJmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5EZXN0cm95TGlzdGVuZXI7IChmb3JtZXJseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPkV4dGVuZGVkTW9uaXRvcmluZ1N0YXRpc3RpY3NMaXN0ZW5lcjwvbGl0ZXJhbD4pLCB3aGljaCBoYXMgYmVlbiBzbGlnaHRseSByZWZhY3RvcmVkIGFuZCBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdyBhIHNlcGFyYXRlIGludGVyZmFjZSAoZS5nLiBub3QgZXh0ZW5kaW5nPGxpdGVyYWw+TW9uaXRvcmluZ1N0YXRpc3RpY3NMaXN0ZW5lcjwvbGl0ZXJhbD4pLCBoZW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGluZyBiZXR0ZXIgY29tcGF0aWJpbGl0eSB3aXRoIGxhbWJkYXMuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgVGhlc2UgQVBJcyBhcmUgbm93IHBhcnQgb2YgdGhlIG9mZmljaWFsIHB1YmxpYyBKZXJzZXkgMi54IEFQSS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiB4bWw6aWQ9Im1pZy0yLjEyLWJyZWFraW5nLWNoYW5nZXMiPgorICAgICAgICAgICAgPHRpdGxlPkJyZWFraW5nIENoYW5nZXM8L3RpdGxlPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmVjYXVzZSBvZiBhIGJ1ZyBmaXggZm9yIGlzc3VlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpbmsgeGxpbms6aHJlZj0naHR0cHM6Ly9qYXZhLm5ldC9qaXJhL2Jyb3dzZS9KRVJTRVktMjYwMic+SkVSU0VZLTI2MDI8L2xpbms+LCB3ZSByZS1nZW5lcmF0ZSBXQURMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NlcyBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+d2FkbC54c2Q8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gbWFrZSBzdXJlIHRoZSBnZXR0ZXJzIGZvciBib29sZWFuIHByb3BlcnRpZXMgc3RhcnRzIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5pczwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0ZWFkIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+Z2V0PC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzIGluIEplcnNleSAxIGFuZCBKZXJzZXkgJmx0Oz0gMi42LgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3IgcGVyZm9ybWFuY2UgcHVycG9zZXMgYSBuZXcgc2VydmVyIHByb3BlcnR5ICZqZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMuTU9OSVRPUklOR19FTkFCTEVEOyBoYXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWVuIGludHJvZHVjZWQuIEl0IGlzIHBvc3NpYmxlIHRvIGVuYWJsZSBqdXN0IGJhc2ljIGFsbW9zdCBzdGF0aWMgbW9uaXRvcmluZyBpbmZvcm1hdGlvbiB1c2luZyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS4gSXQgYWxsb3dzIHRvIGluamVjdCAmamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLkFwcGxpY2F0aW9uSW5mbzsgb2JqZWN0LCByZW5hbWVkIG9yaWdpbmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M8bGl0ZXJhbD5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5BcHBsaWNhdGlvblN0YXRpc3RpY3M8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFuZCAmamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLk1vbml0b3JpbmdTdGF0aXN0aWNzOyBubyBtb3JlIGhhdmUgYSByZWZlcmVuY2UgdG88bGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcHBsaWNhdGlvblN0YXRpc3RpY3M8L2xpdGVyYWw+LCBtZXRob2QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5nZXRBcHBsaWNhdGlvblN0YXRpc3RpY3MoKTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXMgYmVlbiByZW1vdmVkLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgZ2l0YworICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24geG1sOmlkPSJtaWctMi4xMSI+CisgICAgICAgIDx0aXRsZT5NaWdyYXRpbmcgZnJvbSBKZXJzZXkgMi4xMCB0byAyLjExPC90aXRsZT4KKworICAgICAgICA8c2VjdGlvbiB4bWw6aWQ9Im1pZy0yLjExLWhpZ2hsaWdodHMiPgorICAgICAgICAgICAgPHRpdGxlPlJlbGVhc2UgMi4xMSBIaWdobGlnaHRzPC90aXRsZT4KKworICAgICAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICAgICAgPHRpdGxlPlByb21vdGVkIFB1YmxpYyBCZXRhIEFQSXM8L3RpdGxlPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFNldmVyYWwgZXhwZXJpbWVudGFsIEplcnNleSBBUElzIGhhdmUgbWF0dXJlZCBlbm91Z2ggYW5kIGFzIHN1Y2ggd2UgaGF2ZSBkZWNpZGVkIHRvIHByb21vdGUgdGhlbQorICAgICAgICAgICAgICAgICAgICBmcm9tICZqZXJzZXkuY29tbW9uLkJldGE7IHN0YXR1cywgbmFtZWx5OgorCisgICAgICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEplcnNleSBjbGllbnQtc2lkZSAmamVyc2V5LmNsaWVudC5Db25uZWN0b3JQcm92aWRlcjsgU1BJLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEplcnNleSBzZXJ2ZXItc2lkZSAmamVyc2V5LnNlcnZlci5SZXNwb25zZUVycm9yTWFwcGVyOyBTUEkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisKKyAgICAgICAgICAgICAgICAgICAgVGhlc2UgQVBJcyBhcmUgbm93IHBhcnQgb2YgdGhlIG9mZmljaWFsIHB1YmxpYyBKZXJzZXkgMi54IEFQSS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgICAgICA8c2VjdGlvbj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+Tm90IGNsb3NpbmcgcHJvdmlkZWQgc3RyZWFtcyBpbiBtZXNzYWdlIGJvZHkgcHJvdmlkZXJzPC90aXRsZT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBKZXJzZXkgaXMgbm93IHByZXZlbnRpbmcgbWVzc2FnZSBib2R5IHByb3ZpZGVycyAoTUJSLCBNQlcpIGZyb20gY2xvc2luZyBnaXZlbiBpbnB1dC9vdXRwdXQgc3RyZWFtLiBXaXRoIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgY2hhbmdlIEplcnNleSBpcyBlbmZvcmNpbmcgdGhlIEphdmFEb2Mgc3RhdGVtZW50cyBwcmVzZW50IGluIG1lc3NhZ2UgYm9keSBwcm92aWRlcnMuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICAgICAgPHRpdGxlPkphY2tzb24gMTwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgV2UgaGF2ZSByZWludHJvZHVjZWQgc3VwcG9ydCBmb3IgSlNPTiBwcm9jZXNzaW5nIHZpYSBKYWNrc29uIDEueCBKU09OIHByb3ZpZGVyICgxLjkuMTEpLiBJbiBvcmRlciB0byB1c2UKKyAgICAgICAgICAgICAgICAgICAgSmFja3NvbiAxIGluIHlvdXIgYXBwbGljYXRpb24geW91IG5lZWQgdG8gYWRkCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmplcnNleS1tZWRpYS1qc29uLWphY2tzb24xPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICBtb2R1bGUgKCsgaXQncyBkZXBlbmRlbmNpZXMpIHRvIHlvdXIgY2xhc3MtcGF0aCBhbmQgcmVnaXN0ZXIKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+SmFja3NvbjFGZWF0dXJlPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICBpbiB5b3VyIGFwcGxpY2F0aW9uIChzZXJ2ZXIgb3IgY2xpZW50KS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgICAgICA8c2VjdGlvbj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+Q2xpZW50TGlmZWN5Y2xlTGlzdGVuZXI8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBDbGllbnQtc2lkZSBwcm92aWRlcnMgKHN1Y2ggYXM8bGl0ZXJhbD5DbGllbnRSZXF1ZXN0RmlsdGVyPC9saXRlcmFsPnMpIGltcGxlbWVudGluZyB0aGUgbmV3CisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRMaWZlY3ljbGVMaXN0ZW5lcjwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlIHdpbGwgYmUgbm90aWZpZWQgd2hlbiB2YXJpb3VzIGxpZmVjeWNsZSBldmVudHMgb2NjdXIuIEN1cnJlbnRseSBjbGllbnQgcnVudGltZSBpbml0aWFsaXphdGlvbgorICAgICAgICAgICAgICAgICAgICB0cmlnZ2VycyB0aGUKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+b25Jbml0KCk8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgIG1ldGhvZCBhbmQgY2xpZW50IGNsb3NpbmcgdHJpZ2dlcnMKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+b25DbG9zZSgpPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICBtZXRob2QuIFN1Y2ggcHJvdmlkZXJzIGltcGxlbWVudGluZyB0aGUKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+Q2xpZW50TGlmZWN5Y2xlTGlzdGVuZXI8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgIGNhbiBiZSByZWdpc3RlcmVkIGluIGEgY29tbW9uIHdheSwgZS5nLiBpbnRvIGEKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+SmVyc2V5Q2xpZW50PC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICBvcgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5KZXJzZXlXZWJUYXJnZXQ8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLCBvciBpbnRvIGEgKHBvdGVudGlhbGx5KSBhdXRvIGRpc2NvdmVyYWJsZSBmZWF0dXJlIGNvbnRleHQuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24geG1sOmlkPSJtaWctMi4xMCI+CisgICAgICAgIDx0aXRsZT5NaWdyYXRpbmcgZnJvbSBKZXJzZXkgMi45IHRvIDIuMTA8L3RpdGxlPgorCisgICAgICAgIDxzZWN0aW9uIHhtbDppZD0ibWlnLTIuMTAtcmVtb3ZlZC1kZXByZWNhdGVkIj4KKyAgICAgICAgICAgIDx0aXRsZT5SZW1vdmVkIGRlcHJlY2F0ZWQgQVBJczwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT5Gb2xsb3dpbmcsIGFscmVhZHkgZGVwcmVjYXRlZCwgQVBJcyB3ZXJlIHJlbW92ZWQ6PC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTW9kZWxDb250ZXh0PC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChub3QgdXNlZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTW9kZWxMaXN0ZW5lcjwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobm90IHVzZWQpCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiB4bWw6aWQ9Im1pZy0yLjkiPgorICAgICAgICA8dGl0bGU+TWlncmF0aW5nIGZyb20gSmVyc2V5IDIuOCB0byAyLjk8L3RpdGxlPgorCisgICAgICAgIDxzZWN0aW9uIHhtbDppZD0ibWlnLTIuOS1oaWdobGlnaHRzIj4KKyAgICAgICAgICAgIDx0aXRsZT5SZWxlYXNlIDIuOSBIaWdobGlnaHRzPC90aXRsZT4KKworICAgICAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICAgICAgPHRpdGxlPkRlY2xhcmF0aXZlIExpbmtpbmc8L3RpdGxlPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEdlcmFyZCB1cGRhdGVkIHRoZSBEZWNsYXJhdGl2ZSBMaW5raW5nIGV4dGVuc2lvbiBtb2R1bGUgd2hpY2ggaGFzIGJlZW4gcG9ydGVkIHRvIEplcnNleSAyIGluIHZlcnNpb24gMi42LiBZb3UKKyAgICAgICAgICAgICAgICAgICAgY2FuIHJlYWQgbW9yZSBhYm91dCB3aGF0IERlY2xhcmF0aXZlIExpbmtpbmcgZG9lcyBhbmQgd2hhdCBpdCdzIGNhcGFibGUgb2YgaW4gdGhlIGZvbGxvd2luZyBibG9nIHBvc3RzOgorCisgICAgICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaW5rIHhsaW5rOmhyZWY9J2h0dHA6Ly9raW5nc2ZsZWV0LmJsb2dzcG90LmNvLnVrLzIwMTQvMDUvZGVjbGFyYXRpdmUtbGlua2luZy1pbi1qZXJzZXktMjkuaHRtbCc+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNsYXJhdGl2ZSBMaW5raW5nIGluIEplcnNleSAyLjkgYW5kIHVwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGluaz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGluayB4bGluazpocmVmPSdodHRwOi8va2luZ3NmbGVldC5ibG9nc3BvdC5jby51ay8yMDE0LzA1L3JlYWRpbmctYW5kLXdyaXRpbmctamF4LXJzLWxpbmstb2JqZWN0cy5odG1sJz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlYWRpbmcgYW5kIHdyaXRpbmcgSkFYLVJTIExpbmsgb2JqZWN0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpbms+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICAgICAgPHRpdGxlPkphY2tzb24gMjwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgT3VyIG1lZGlhIG1vZHVsZSB0aGF0IHN1cHBvcnRzIHdvcmtpbmcgd2l0aCBKU09OIHZpYSBKYWNrc29uIGxpYnJhcnkgaGFzIGJlZW4gdXBkYXRlZCB0byB1c2UgSmFja3NvbiAyLngKKyAgICAgICAgICAgICAgICAgICAgKDIuMy4yKS4gQWxsIHNhbXBsZXMgYW5kIHRlc3RzIGhhdmUgYmVlbiByZXdyaXR0ZW4gdG8gdXNlIEphY2tzb24gMiBhcyB3ZWxsLiBJbiBvcmRlciB0byB1c2UgSmFja3NvbiAyIGluIHlvdXIKKyAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24geW91IG5lZWQgdG8gYWRkIGplcnNleS1tZWRpYS1qc29uLWphY2tzb24gKCsgaXQncyBKYWNrc29uIGRlcGVuZGVuY2llcykgdG8geW91ciBjbGFzcy1wYXRoIGFuZAorICAgICAgICAgICAgICAgICAgICByZWdpc3RlcgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5KYWNrc29uRmVhdHVyZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgaW4geW91ciBhcHBsaWNhdGlvbi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgICAgICA8c2VjdGlvbj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+TUVUQS1JTkYvc2VydmljZXM8L3RpdGxlPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFdlIGRyb3BwZWQgYXV0b21hdGljIHJlZ2lzdHJhdGlvbiBvZiBtZXNzYWdlIGJvZHkgcHJvdmlkZXJzIChNZXNzYWdlQm9keVdyaXRlciwgTWVzc2FnZUJvZHlSZWFkZXIpIGFuZAorICAgICAgICAgICAgICAgICAgICBleGNlcHRpb24gbWFwcGVycyB2aWEgTUVUQS1JTkYvc2VydmljZXMgbWVjaGFuaXNtLiBUaGlzIGZ1bmN0aW9uYWxpdHkgY2FuIGJlIHJlc3RvcmVkIGJ5IGFkZGluZworICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5qZXJzZXktbWV0YWluZi1zZXJ2aWNlczwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgbW9kdWxlIHRvIHRoZSBjbGFzcy1wYXRoIG9mIHlvdXIgYXBwbGljYXRpb24uCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBOb3RlOiBUaGlzIGNoYW5nZSBtYXkgYWZmZWN0IDNyZCBwYXJ0eSBsaWJyYXJpZXMgKGUuZy4gSmFja3NvbiAyLngpIGluIGEgd2F5IHRoZWlyIHByb3ZpZGVyIHdvdWxkIG5vdCBiZQorICAgICAgICAgICAgICAgICAgICByZWdpc3RlcmVkIGluIGFuIEpBWC1SUyBhcHAuIFlvdSBuZWVkIHRvIGVpdGhlciByZWdpc3RlciB0aGVtIG1hbnVhbGx5IG9yIHVzZSBtZW50aW9uZWQKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+amVyc2V5LW1ldGFpbmYtc2VydmljZXM8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgIG1vZHVsZS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgICAgICA8c2VjdGlvbj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+SmVyc2V5IFRlc3QgRnJhbWV3b3JrPC90aXRsZT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBKZXJzZXkgVGVzdCBGcmFtZXdvcmsgbm93IHN1cHBvcnRzIFRlc3RORyB0byBydW4gdGhlIHRlc3RzIChpbiBhZGRpdGlvbiB0byB0aGUgSlVuaXQsIHdoaWNoIGlzIHN1cHBvcnRlZCBieQorICAgICAgICAgICAgICAgICAgICBkZWZhdWx0KS4gWW91IGNhbiBub3cgcnVuIHRoZSB0ZXN0cyBpbiBwYXJhbGxlbCB1c2luZyBlaXRoZXIgSlVuaXQgb3IgVGVzdE5HLiBTZWUgY2hhcHRlcnMgZGVkaWNhdGVkIHRvIFRlc3RORworICAgICAgICAgICAgICAgICAgICBhbmQgcGFyYWxsZWwgdGVzdGluZyBmb3IgbW9yZSBpbmZvcm1hdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgPHhyZWYgbGlua2VuZD0idGVzdG5nIi8+CisgICAgICAgICAgICAgICAgICAgIGFuZDx4cmVmIGxpbmtlbmQ9InBhcmFsbGVsIi8+LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgIDxzZWN0aW9uIHhtbDppZD0ibWlnLTIuOS1icmVha2luZy1jaGFuZ2VzIj4KKyAgICAgICAgICAgIDx0aXRsZT5DaGFuZ2VzPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvbWUgb2YgdGhlIGZlYXR1cmUgc3BlY2lmaWMgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIChkaXNhYmxlIFdBREwsIGRpc2FibGUgQlYsIGRpc2FibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU09OLVByb2Nlc3NpbmcsIGVuYWJsZSBNb25pdG9yaW5nKSwgYW5kIHRoZWlyIHNlcnZlci9jbGllbnQgY291bnRlcnBhcnRzLCBhcmUgbm8gbG9uZ2VyIGFmZmVjdGVkIGJ5IGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSBvZiBwcm9wZXJ0aWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+Q29tbW9uUHJvcGVydGllcy5GRUFUVVJFX0FVVE9fRElTQ09WRVJZX0RJU0FCTEU8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5Db21tb25Qcm9wZXJ0aWVzLk1FVEFJTkZfU0VSVklDRVNfTE9PS1VQX0RJU0FCTEU8L2xpdGVyYWw+LiBUaGUgc3BlY2lmaWMgcHJvcGVydGllcyBoYXZlIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgdXNlZCB0byBjaGFuZ2UgZGVmYXVsdCBiZWhhdmlvdXIgb2YgbWVudGlvbmVkIGZlYXR1cmVzIChlLmcuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+U2VydmVyUHJvcGVydGllcy5XQURMX0ZFQVRVUkVfRElTQUJMRTwvbGl0ZXJhbD4pLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdXRvbWF0aWMgcmVnaXN0cmF0aW9uIG9mPGxpdGVyYWw+TWVzc2FnZUJvZHlXcml0ZXI8L2xpdGVyYWw+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPk1lc3NhZ2VCb2R5UmVhZGVyczwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5FeGNlcHRpb25NYXBwZXJzPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPk1FVEEtSU5GL3NlcnZpY2VzPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lY2hhbmlzbSBoYXMgYmVlbiByZW1vdmVkLiBEaXNhYmxpbmcgdGhlIGF1dG9tYXRpYyByZWdpc3RyYXRpb24gb2YgcHJvdmlkZXJzIHZpYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPk1FVEEtSU5GL3NlcnZpY2VzPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heSBhZmZlY3QgM3JkIHBhcnR5IGxpYnJhcmllcyAoaS5lLiBKYWNrc29uIDIueCkgdGhhdCBhcmUgdXNpbmcgdGhpcyBtZWNoYW5pc20gdG8gcmVnaXN0ZXIgaXQncworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVycy4gSW4gb3JkZXIgdG8gcmVzdG9yZSB0aGlzIGZ1bmN0aW9uYWxpdHkgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0OmplcnNleS1tZXRhaW5mLXNlcnZpY2VzPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcyB0byBiZSBhZGRlZCBvbiB0aGUgY2xhc3NwYXRoLiBPdGhlcndpc2Ugc3VjaCBwcm92aWRlcnMgaGFzIHRvIGJlIHJlZ2lzdGVyZWQgbWFudWFsbHkuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBKYWNrc29uIEpTT04gSmVyc2V5IG1vZHVsZSBoYXMgYmVlbiB1cGRhdGVkIHRvIHVzZSBKYWNrc29uIDIueCBpbnN0ZWFkIG9mIEphY2tzb24gMS54LiBUaGlzIG1lYW5zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBhbGwgdGhlIGNvZGUgdGhhdCBoYXMgYmVlbiB1c2luZyBKYWNrc29uIDEueCBmb3IgSlNPTiAoZGUpc2VyaWFsaXphdGlvbiBoYXMgdG8gYmUgbWlncmF0ZWQgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBKYWNrc29uIDIueC4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbiB4bWw6aWQ9Im1pZy0yLjgiPgorICAgICAgICA8dGl0bGU+TWlncmF0aW5nIGZyb20gSmVyc2V5IDIuNyB0byAyLjg8L3RpdGxlPgorCisgICAgICAgIDxzZWN0aW9uIHhtbDppZD0ibWlnLTIuOC1icmVha2luZy1jaGFuZ2VzIj4KKyAgICAgICAgICAgIDx0aXRsZT5DaGFuZ2VzPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJlY2F1c2Ugb2YgYSBidWcgZml4IGZvciBpc3N1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaW5rIHhsaW5rOmhyZWY9J2h0dHBzOi8vamF2YS5uZXQvamlyYS9icm93c2UvSkVSU0VZLTI0NTgnPkpFUlNFWS0yNDU4PC9saW5rPiwgdGhlcmUgaGFzIGJlZW4gYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsaWdodCBjaGFuZ2UgaW4gdGhlIGJlaGF2aW9yIG9mICZqYXhycy5jb3JlLlVyaUluZm87CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+Z2V0UGF0aDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5nZXRQYXRoU2VnbWVudHM8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kcy4gVGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+Z2V0UGF0aDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RzIG5vIGxvbmdlciByZXR1cm4gYSBwYXRoIHByZWZpeGVkIHdpdGggYSBzbGFzaCAoPGxpdGVyYWw+Jy8nPC9saXRlcmFsPiksIGluc3RlYWQgdGhleSBub3cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3JyZWN0bHkgcmV0dXJuIGEgcmVxdWVzdCBwYXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzPnJlbGF0aXZlPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB0aGUgYmFzZSByZXF1ZXN0IFVSSS4gQWxzbywgdGhlICZsaXQuamF4cnMuY29yZS5VcmlJbmZvOyBub3cgY29ycmVjdGx5IGhhbmRsZXMgcmVxdWVzdHMgd2hpY2ggVVJJCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgZW1wdHkgcGF0aCBzZWdtZW50cyAoZS5nLjxsaXRlcmFsPmh0dHA6Ly9sb2NhbGhvc3QvLy9hL2IvL2M8L2xpdGVyYWw+KS4gVGhlc2UgZW1wdHkgcGF0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnRzIGFyZSBub3cgY29ycmVjdGx5IGluY2x1ZGVkIGluIHRoZSBsaXN0cyByZXR1cm5lZCBieSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5VcmlJbmZvLmdldFBhdGhTZWdtZW50czwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RzLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmamVyc2V5LnNzZS5Tc2VGZWF0dXJlOyBub3cgZ2V0cyBhdXRvbWF0aWNhbGx5IGRpc2NvdmVyZWQgYW5kIGVuYWJsZWQgaWYgdGhlIFNTRSBtb2R1bGUgaXMgcHJlc2VudCBvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjbGFzcyBwYXRoLiBUaGlzIGJlaGF2aW9yIGNhbiBiZSBzdXBwcmVzc2VkIGJ5IHNldHRpbmcgJmplcnNleS5zc2UuU3NlRmVhdHVyZS5ESVNBQkxFX1NTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSB0bzxsaXRlcmFsPnRydWU8L2xpdGVyYWw+LiBUaGUgYmVoYXZpb3IgY2FuIGFsc28gYmUgc2VsZWN0aXZlbHkgc3VwcHJlc3NlZCBpbiBlaXRoZXIgY2xpZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Igc2VydmVyIHJ1bnRpbWUgYnkgc2V0dGluZyB0aGUgJmplcnNleS5zc2UuU3NlRmVhdHVyZS5ESVNBQkxFX1NTRV9DTElFTlQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgJmplcnNleS5zc2UuU3NlRmVhdHVyZS5ESVNBQkxFX1NTRV9TRVJWRVI7IHByb3BlcnR5IHJlc3BlY3RpdmVseS4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVwcmVjYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmdldERlc3Ryb3lUaW1lPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCBoYXMgYmVlbiByZW1vdmVkIGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5BcHBsaWNhdGlvblN0YXRpc3RpY3M8L2xpdGVyYWw+LiBUbyBnZXQgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gc2h1dGRvd24gaW5mb3JtYXRpb24sIGEgJmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXI7IHNob3VsZCBiZSByZWdpc3RlcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGl0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPm9uU2h1dGRvd248L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kIGltcGxlbWVudGVkIHRvIGxpc3RlbiB0byBhbmQgcHJvY2VzcyB0aGUgYXBwbGljYXRpb24gc2h1dGRvd24gZXZlbnQuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPnRyaWdnZXJFdmVudChSZXF1ZXN0RXZlbnQuVHlwZSk8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBwdWJsaWMgJmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdDsgQVBJLiBUaGlzIG1ldGhvZCBoYXMgbmV2ZXIgYmVlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVuZGVkIGZvciBwdWJsaWMsIGFwcGxpY2F0aW9uLWxldmVsIHVzZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW4gSmVyc2V5IDIuNyBhbmQgZWFybGllciBpdCB3YXMgKHVuZGVyIGNlcnRhaW4gY29uZGl0aW9ucykgcG9zc2libGUgdG8gc3VwcGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tICZqZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7IGFzIHBhcnQgb2YgdGhlIHRlc3RlZCBKQVgtUlMgLyBKZXJzZXkgYXBwbGljYXRpb24uIFRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3J5IHdvdWxkIGJlIHBpY2tlZCBhbmQgdXNlZCBieSAmamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW50aWF0ZSAmamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXI7IHRoYXQgd2lsbCBob3N0IHRoZSB0ZXN0ZWQgYXBwbGljYXRpb24uIFRoaXMgZmVhdHVyZSB3YXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnJlbGlhYmxlIGFuZCByZWR1bmRhbnQuIEFzIHN1Y2gsIHN1cHBvcnQgZm9yIHRoZSBmZWF0dXJlIGhhcyBiZWVuIHJlbW92ZWQuIFRvIHNwZWNpZnkgYQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbSAmbGl0LmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsgdG8gYmUgdXNlZCBieSB5b3VyICZsaXQuamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJjbGFzcywgcGxlYXNlIG92ZXJyaWRlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPkplcnNleVRlc3QuZ2V0VGVzdENvbnRhaW5lckZhY3Rvcnk8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kIGluc3RlYWQuIE92ZXJyaWRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5nZXRUZXN0Q29udGFpbmVyRmFjdG9yeTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3cgcmVtYWlucyB0aGUgb25seSByZWxpYWJsZSB3YXkgb2Ygc3BlY2lmeWluZyBjdXN0b20gJmxpdC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gdG8gYmUgdXNlZCBpbiB5b3VyIHRlc3RzLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90ZWN0ZWQgbWV0aG9kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+c2V0VGVzdENvbnRhaW5lckZhY3Rvcnk8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSAmbGl0LmplcnNleS50ZXN0LkplcnNleVRlc3Q7IEFQSSBhcyBjYWxsaW5nIHRoZSBtZXRob2QgaGFkIG5vIGVmZmVjdCBvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSAmbGl0LmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsgaW5zdGFuY2UgdXNlZCBieSB0aGUgJmxpdC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YmNsYXNzLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm90ZWN0ZWQgbWV0aG9kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+Z2V0Q2xpZW50PC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgJmxpdC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OyBBUEkuIFRvIGNvbmZpZ3VyZSB0ZXN0IGNsaWVudCBpbnN0YW5jZXMsIHBsZWFzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmNvbmZpZ3VyZUNsaWVudDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgaW5zdGVhZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXRpbGl0eSBtZXRob2RzICZsaXQuamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsgdGhhdCBwcm92aWRlIGFjY2VzcyB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZS1jb25maWd1cmVkICZqYXhycy5jbGllbnQuQ2xpZW50OyBhbmQgJmpheHJzLmNsaWVudC5XZWJUYXJnZXQ7IGluc3RhbmNlcyAoPGxpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50KCk8L2xpdGVyYWw+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPnRhcmdldCguLi4pPC9saXRlcmFsPikgaGF2ZSBiZWVuIG1hZGUgZmluYWwgdG8gcHJldmVudCBvdmVycmlkaW5nIGluIHN1YmNsYXNzZXMgYW5kIHRodXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnN1cmUgY29uc2lzdGVuY3kgb2YgdGhlIGplcnNleSB0ZXN0IGZyYW1ld29yayBmdW5jdGlvbmFsaXR5LgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbGl0LmplcnNleS50ZXN0LkplcnNleVRlc3Q7IGNvbnN0cnVjdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+SmVyc2V5VGVzdChDbGFzcyZsdDs/IGV4dGVuZHMgQXBwbGljYXRpb24mZ3Q7KTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXMgYmVlbiBtYWRlIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgc3Vic2VxdWVudCBKZXJzZXkgcmVsZWFzZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXQgd2FzIHByZXZpb3VzbHkgcG9zc2libGUgdG8gcGFzcyBpbiBhIGN1c3RvbSAmamVyc2V5LnNlcnZlci5zcGkuQ29udGFpbmVyUHJvdmlkZXI7IHRoYXQgd2FzIHN1cHBvc2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gZGVwbG95IGFuZCBydW4gdGhlIGFwcGxpY2F0aW9uIGFzIG9uZSBvZiB0aGUgSkFYLVJTIC8gSmVyc2V5IGFwcGxpY2F0aW9uIHByb3ZpZGVycy4gVGhpcyBhYmlsaXR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzIGJlZW4gcmVtb3ZlZCB3aXRob3V0IGFueSBzdWJzdGl0dXRlIGFzIHRoZSBjb25jZXB0IHdhcyBmdW5kYW1lbnRhbGx5IGZsYXdlZC4gVHlwaWNhbCB1c2UgY2FzZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgbm90IGJlIGFmZmVjdGVkIGJ5IHRoaXMgY2hhbmdlLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWN0b3J5IG1ldGhvZHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5jcmVhdGVIdHRwU2VydmVyPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHRha2UgSmVyc2V5ICZqZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlcjsgYXMgb25lIG9mIHRoZSBpbnB1dCBwYXJhbWV0ZXJzIGhhdmUgYmVlbiByZW1vdmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSB0aGUgSmVyc2V5IGNvbnRhaW5lciBmYWN0b3J5IEFQSSBhcyBpbmhlcmVudGx5IGJyb2tlbi4gVGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGFjdHMgJmplcnNleS5ncml6emx5LkdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeTssICZqZXJzZXkuamRraHR0cC5KZGtIdHRwU2VydmVyRmFjdG9yeTssICZqZXJzZXkuamV0dHkuSmV0dHlIdHRwQ29udGFpbmVyRmFjdG9yeTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQgJmplcnNleS5zaW1wbGUuU2ltcGxlQ29udGFpbmVyRmFjdG9yeTsgaW1wbGVtZW50YXRpb25zLiBUaGUgbWV0aG9kcyB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFrZSAmamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsgYXMgaW5wdXQgcGFyYW1ldGVyIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuIFR5cGljYWwgdXNlIGNhc2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIG5vdCBiZSBhZmZlY3RlZCBieSB0aGlzIGNoYW5nZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+cmVnaXN0ZXJBZGRpdGlvbmFsQmluZGVyczwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiAmamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXI7IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgcHVibGljIEFQSS4gUGxlYXNlIHVzZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjaWZpYyAmbGl0LmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyOyBjb25zdHJ1Y3RvciB0aGF0IGFjY2VwdHMgY3VzdG9tIEhLMiBiaW5kZXJzIGluc3RlYWQuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldmVyYWwgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzIHdlcmUgcmVuYW1lZCwgZXNwZWNpYWxseSB0aG9zZSBoYXZpbmcgY2xpZW50IGFuZCBzZXJ2ZXIgdmVyc2lvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbG9uZyB3aXRoIHRoZSBjb21tb24gdmVyc2lvbiBpbiAmbGl0LmplcnNleS5jb21tb24uQ29tbW9uUHJvcGVydGllczsuIFBsZWFzZSBzZWUgZm9sbG93aW5nIHRhYmxlIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlIHJlZmVyZW5jZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFibGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5MaXN0IG9mIGNoYW5nZWQgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzOjwvdGl0bGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PkNvbnN0YW50PC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5Pk9sZCB2YWx1ZSAoSmVyc2V5IDIuNyBhbmQgYmVmb3JlKTwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT5OZXcgdmFsdWUgKEplcnNleSAyLjgrKTwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRib2R5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4mamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzLkZFQVRVUkVfQVVUT19ESVNDT1ZFUllfRElTQUJMRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+amVyc2V5LmNvbmZpZy5kaXNhYmxlQXV0b0Rpc2NvdmVyeS5jbGllbnQ8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmplcnNleS5jb25maWcuY2xpZW50LmRpc2FibGVBdXRvRGlzY292ZXJ5PC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4mamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzLkZFQVRVUkVfQVVUT19ESVNDT1ZFUllfRElTQUJMRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+amVyc2V5LmNvbmZpZy5kaXNhYmxlQXV0b0Rpc2NvdmVyeS5zZXJ2ZXI8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmplcnNleS5jb25maWcuc2VydmVyLmRpc2FibGVBdXRvRGlzY292ZXJ5PC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcm93PgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PiZqZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXMuSlNPTl9QUk9DRVNTSU5HX0ZFQVRVUkVfRElTQUJMRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+amVyc2V5LmNvbmZpZy5kaXNhYmxlSnNvblByb2Nlc3NpbmcuY2xpZW50PC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5qZXJzZXkuY29uZmlnLmNsaWVudC5kaXNhYmxlSnNvblByb2Nlc3Npbmc8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PiZqZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMuSlNPTl9QUk9DRVNTSU5HX0ZFQVRVUkVfRElTQUJMRTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+amVyc2V5LmNvbmZpZy5kaXNhYmxlSnNvblByb2Nlc3Npbmcuc2VydmVyPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5qZXJzZXkuY29uZmlnLnNlcnZlci5kaXNhYmxlSnNvblByb2Nlc3Npbmc8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+JmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllcy5NRVRBSU5GX1NFUlZJQ0VTX0xPT0tVUF9ESVNBQkxFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5qZXJzZXkuY29uZmlnLmRpc2FibGVNZXRhaW5mU2VydmljZXNMb29rdXAuY2xpZW50PC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5qZXJzZXkuY29uZmlnLmNsaWVudC5kaXNhYmxlTWV0YWluZlNlcnZpY2VzTG9va3VwPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4mamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzLk1FVEFJTkZfU0VSVklDRVNfTE9PS1VQX0RJU0FCTEU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmplcnNleS5jb25maWcuZGlzYWJsZU1ldGFpbmZTZXJ2aWNlc0xvb2t1cC5zZXJ2ZXI8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmplcnNleS5jb25maWcuc2VydmVyLmRpc2FibGVNZXRhaW5mU2VydmljZXNMb29rdXA8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+JmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllcy5NT1hZX0pTT05fRkVBVFVSRV9ESVNBQkxFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5qZXJzZXkuY29uZmlnLmRpc2FibGVNb3h5SnNvbi5jbGllbnQ8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmplcnNleS5jb25maWcuY2xpZW50LmRpc2FibGVNb3h5SnNvbjwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+JmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcy5NT1hZX0pTT05fRkVBVFVSRV9ESVNBQkxFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5qZXJzZXkuY29uZmlnLmRpc2FibGVNb3h5SnNvbi5zZXJ2ZXI8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmplcnNleS5jb25maWcuc2VydmVyLmRpc2FibGVNb3h5SnNvbjwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4mamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzLk9VVEJPVU5EX0NPTlRFTlRfTEVOR1RIX0JVRkZFUjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+amVyc2V5LmNvbmZpZy5jb250ZW50TGVuZ3RoLmJ1ZmZlci5jbGllbnQ8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmplcnNleS5jb25maWcuY2xpZW50LmNvbnRlbnRMZW5ndGguYnVmZmVyPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4mamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzLk9VVEJPVU5EX0NPTlRFTlRfTEVOR1RIX0JVRkZFUjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+amVyc2V5LmNvbmZpZy5jb250ZW50TGVuZ3RoLmJ1ZmZlci5zZXJ2ZXI8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmplcnNleS5jb25maWcuc2VydmVyLmNvbnRlbnRMZW5ndGguYnVmZmVyPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcm93PgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PiZqZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMuVFJBQ0lORzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+amVyc2V5LmNvbmZpZy5zZXJ2ZXIudHJhY2luZzwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+amVyc2V5LmNvbmZpZy5zZXJ2ZXIudHJhY2luZy50eXBlPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90Z3JvdXA+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YWJsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgb2xkIG5hbWVzIGFyZSBzdGlsbCB3b3JraW5nIGZvciBub3csIGJ1dCBhcmUgZGVwcmVjYXRlZC4gVGhlcmUgaXMgYSBmYWxsYmFjayBtZWNoYW5pc20gaW1wbGVtZW50ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSByZWFkaW5nIHRoZSBwcm9wZXJ0eSBhbmQgZWFjaCBnZXQsIHRoYXQgcmVzb2x2ZXMgdGhlIHZhbHVlIGZyb20gdGhlIG9sZC1uYW1lZCBwcm9wZXJ0eSwgd2lsbCBsb2cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+Q09ORklHPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsIHdhcm5pbmcuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKyAgICA8c2VjdGlvbiB4bWw6aWQ9Im1pZy0yLjciPgorICAgICAgICA8dGl0bGU+TWlncmF0aW5nIGZyb20gSmVyc2V5IDIuNiB0byAyLjc8L3RpdGxlPgorCisgICAgICAgIDxzZWN0aW9uIHhtbDppZD0ibWlnLTIuNy1icmVha2luZy1jaGFuZ2VzIj4KKyAgICAgICAgICAgIDx0aXRsZT5DaGFuZ2VzPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVudGlsIHZlcnNpb24gMi42LCBKZXJzZXkgd2FzIGNvbXBpbGVkIHdpdGggSmF2YSBTRSA2LiBUaGlzIGhhcyBjaGFuZ2VzIGluIEplcnNleSAyLjcuIE5vdyBhbG1vc3QgYWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmVyc2V5IGNvbXBvbmVudHMgYXJlIGNvbXBpbGVkIHdpdGggSmF2YSBTRSA3IHRhcmdldC4gSXQgbWVhbnMsIHRoYXQgeW91IHdpbGwgbmVlZCBhdCBsZWFzdCBKYXZhIFNFIDcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBiZSBhYmxlIHRvIGNvbXBpbGUgYW5kIHJ1biB5b3VyIGFwcGxpY2F0aW9uIHRoYXQgaXMgdXNpbmcgbGF0ZXN0IEplcnNleS4gT25seQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmNvcmUtY29tbW9uPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmNvcmUtY2xpZW50PC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZXMgYXJlIHN0aWxsIGNvbXBpbGVkIHdpdGggSmF2YSBjbGFzcyB2ZXJzaW9uIHJ1bm5hYmxlIHdpdGggSmF2YSBTRSA2LgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVkMgc3VwcG9ydDogbWV0aG9kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+d3JpdGVUbzwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiAmamVyc2V5LnNlcnZlci5tdmMuVGVtcGxhdGVQcm9jZXNzb3I7IHdhcyBtb2RpZmllZCBieSBhZGRpbmcgYW4gYXJndW1lbnQ8bGl0ZXJhbD5NdWx0aXZhbHVlZE1hcCZsdDtTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0Jmd0OyBodHRwSGVhZGVyczwvbGl0ZXJhbD4uIFRoaXMgaXMgYW4gaW5jb21wYXRpYmxlIGNoYW5nZSAodGhlIG1ldGhvZCB3YXMgbW9kaWZpZWQgZGlyZWN0bHkgaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgaW50ZXJmYWNlKS4gQWxsIEplcnNleSBwcm92aWRlZCBNVkMgaW1wbGVtZW50YXRpb24gd2VyZSBhZGp1c3RlZCBidXQgaWYgeW91IGhhdmUgeW91ciBvd24gTVZDCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gdGhlbiB5b3UgbmVlZCB0byBtb2RpZnkgdGhlIG1ldGhvZCBzaWduYXR1cmUgb2YgdGhlIGltcGxlbWVudGF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBIG1pbm9yIEpBWC1SUyBpbmNvbXBhdGliaWxpdHkgaXNzdWUgaGFzIGJlZW4gcmVjZW50bHkgZGlzY292ZXJlZCBhbmQgcmVwb3J0ZWQgKHNlZTxsaW5rCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhsaW5rOmhyZWY9Imh0dHBzOi8vamF2YS5uZXQvamlyYS9icm93c2UvSkVSU0VZLTIzODciPkpFUlNFWS0yMzg3PC9saW5rPikuIEFzIHBhcnQgb2YgdGhlIGZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5vciBicmVha2luZyBjaGFuZ2VzIHJlbGF0ZWQgdG8gVVJJIHJlc29sdmluZyBhbmQgY3JlYXRpb24gaGF2ZSBiZWVuIGludHJvZHVjZWQgaW4gdGhlIGJlaGF2aW9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2YgJmpheHJzLmNvcmUuVXJpQnVpbGRlcjssICZqYXhycy5jb3JlLkxpbmsuQnVpbGRlcjsgYW5kICZqYXhycy5jbGllbnQuV2ViVGFyZ2V0OyBjbGFzc2VzLiBJdCBpcyBubworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmdlciBwb3NzaWJsZSB0byBzdWNjZXNzZnVsbHkgYnVpbGQgYSBuZXcgJmxpdC5qZGs2LlVSSTsgaW5zdGFuY2UgZnJvbSBhICZsaXQuamF4cnMuY29yZS5VcmlCdWlsZGVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgY29udGFpbnMgdW5yZXNvbHZlZCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLiBBbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHRocm93biBpbiBzdWNoIGNhc2UsIGFzIG1hbmRhdGVkIGJ5IEpBWC1SUyBBUEkgamF2YWRvYy4gU2ltaWxhcmx5LCBpdCBpcyBub3QgcG9zc2libGUgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzZnVsbHkgY3JlYXRlIGEgJmpheHJzLmNvcmUuTGluazsgaW5zdGFuY2UgZnJvbSBhIFVSSSB0ZW1wbGF0ZSB3aXRoIHVucmVzb2x2ZWQgdGVtcGxhdGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzLiBBbHNvLCBpdCBpcyBub3QgcG9zc2libGUgdG8gc3VjY2Vzc2Z1bGx5IHNlbmQgYSByZXF1ZXN0IG9uIGEgJmxpdC5qYXhycy5jbGllbnQuV2ViVGFyZ2V0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgcmVwcmVzZW50cyBhIFVSSSB0ZW1wbGF0ZSB0aGF0IGRvZXMgbm90IGhhdmUgYWxsIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIHByb3Blcmx5IHJlc29sdmVkLiBBbnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRlbXB0IHRvIGRvIHNvIHdpbGwgZmFpbCB3aXRoIGFuIGV4Y2VwdGlvbi4gTm90ZSB0aGF0IHRoaXMgYWxzbyBhcHBsaWVzIHRvIGFueSBtYW5hZ2VkIGNsaWVudHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmplY3RlZCBpbnRvIEpBWC1SUyBzZXJ2ZXItc2lkZSBjb21wb25lbnRzIHVzaW5nICZqZXJzZXkuc2VydmVyLlVyaTsgYW5ub3RhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluIEplcnNleSAyLjYgYW5kIGVhcmxpZXIsIHByb2R1Y2luZyBhIFVSSSBmcm9tIGFuIGluY29tcGxldGVseSByZXNvbHZlZCBVUkkgdGVtcGxhdGUgd291bGQgc3VjY2VlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZCBhbGwgdW5yZXNvbHZlZCB0ZW1wbGF0ZSBwYXJhbWV0ZXIgbG9jYXRpb25zIHdvdWxkIGJlIGVuY29kZWQgd2l0aG91dCBjaGFuZ2UgaW50byB0aGUgcmVzdWx0aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJJLCBmb3IgZXhhbXBsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPiIvcGF0aC97cGFyYW19IjwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3VsZCBiZSBpbXBsaWNpdGx5IGVuY29kZWQgYXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD4iL3BhdGgvJTdCcGFyYW0lN0QiPC9saXRlcmFsPi4gV2hpbGUgd2UgZG8gbm90IGV4cGVjdCBvdXIgdXNlcnMgdG8gZGVwZW5kIG9uIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbmFsaXR5LCBpZiB0aGUgZm9ybWVyIGJlaGF2aW9yIGlzIGRlc2lyZWQgZm9yIHNvbWUgcmVhc29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPlVyaUNvbXBvbmVudC5lbmNvZGVUZW1wbGF0ZU5hbWVzPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCBjYW4gYmUgdXNlZCBpbnN0ZWFkOgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJ1bm51bWJlcmVkIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJJLmNyZWF0ZShVcmlDb21wb25lbnQuZW5jb2RlVGVtcGxhdGVOYW1lcyhVcmlCdWlsZGVyLmZyb21VcmkoIi9wYXRoL3twYXJhbX0iKS50b1RlbXBsYXRlKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Igc2ltcGx5CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9InVubnVtYmVyZWQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkkuY3JlYXRlKFVyaUNvbXBvbmVudC5lbmNvZGVUZW1wbGF0ZU5hbWVzKCIvcGF0aC97cGFyYW19IikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24geG1sOmlkPSJtaWctMi42Ij4KKyAgICAgICAgPHRpdGxlPk1pZ3JhdGluZyBmcm9tIEplcnNleSAyLjUuMSB0byAyLjY8L3RpdGxlPgorCisgICAgICAgIDxzZWN0aW9uIHhtbDppZD0ibWlnLTIuNi1yZXBhY2thZ2VkIj4KKyAgICAgICAgICAgIDx0aXRsZT5HdWF2YSBhbmQgQVNNIGhhdmUgYmVlbiBlbWJlZGRlZDwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBKZXJzZXkgbm8gbG9uZ2VyIGRlcGVuZCBkaXJlY3RseSBvbiBHdWF2YSBhbmQgQVNNIGFydGlmYWN0cyB3aGljaCBtZWFucyB0aGF0IHVzZXJzIGFyZSBmcmVlIHRvIHVzZSB0aGVpciBvd24KKyAgICAgICAgICAgICAgICB2ZXJzaW9ucyBvZiBtZW50aW9uZWQgbGlicmFyaWVzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgTmV3IGJ1bmRsZSBoYXMgYmVlbiBjcmVhdGVkIGZvciBHdWF2YSAoPGxpdGVyYWw+YnVuZGxlcy9yZXBhY2thZ2VkL2plcnNleS1ndWF2YTwvbGl0ZXJhbD4pLCB3aXRoIE1hdmVuCisgICAgICAgICAgICAgICAgY29vcmRpbmF0ZXM6CisgICAgICAgICAgICAgICAgPGxpdGVyYWw+b3JnLmdsYXNzZmlzaC5qZXJzZXkuYnVuZGxlcy5yZXBhY2thZ2VkOmplcnNleS1ndWF2YTwvbGl0ZXJhbD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIChSZXBhY2thZ2VkKSBBU00gaXMgbm93IHBhcnQgb2YgSmVyc2V5IFNlcnZlci4gSmVyc2V5IGN1cnJlbnRseSB1c2VzIEFTTSA1IGZvciBwYWNrYWdlLXNjYW5uaW5nIGNhcGFiaWxpdGllcy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiB4bWw6aWQ9Im1pZy0yLjYtbmV3LWRlcHJlY2F0ZWQiPgorICAgICAgICAgICAgPHRpdGxlPkRlcHJlY2F0ZWQgQVBJczwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT5Gb2xsb3dpbmcgQVBJcyB3ZXJlIGRlcHJlY2F0ZWQ6PC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5IdHRwRGF0ZUZvcm1hdDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG1ldGhvZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmdldFByZWZlcmVkRGF0ZUZvcm1hdCgpPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcyBiZWVuIG1hcmtlZCBhcyBkZXByZWNhdGVkIGR1ZSB0byB0eXBvIGluIHRoZSBuYW1lLiBOZXcgbWV0aG9kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+Z2V0UHJlZmVycmVkRGF0ZUZvcm1hdCgpPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24geG1sOmlkPSJtaWctMi42LXJlbW92ZWQtZGVwcmVjYXRlZCI+CisgICAgICAgICAgICA8dGl0bGU+UmVtb3ZlZCBkZXByZWNhdGVkIEFQSXM8L3RpdGxlPgorICAgICAgICAgICAgPHBhcmE+Rm9sbG93aW5nLCBhbHJlYWR5IGRlcHJlY2F0ZWQsIEFQSXMgd2VyZSByZW1vdmVkOjwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5maWx0ZXIuSHR0cEJhc2ljQXV0aEZpbHRlcjwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuZmlsdGVyLkh0dHBEaWdlc3RBdXRoRmlsdGVyPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2UgJmplcnNleS5jbGllbnQuSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZTsgaW5zdGVhZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+b3JnLmdsYXNzZmlzaC5qZXJzZXkuYXBhY2hlLmNvbm5lY3Rvci5BcGFjaGVDbGllbnRQcm9wZXJ0aWVzLkhUVFBfUEFSQU1TPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5vcmcuZ2xhc3NmaXNoLmplcnNleS5hcGFjaGUuY29ubmVjdG9yLkFwYWNoZUNsaWVudFByb3BlcnRpZXMjUkVRVUVTVF9DT05GSUc8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGVhZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+b3JnLmdsYXNzZmlzaC5qZXJzZXkuYXBhY2hlLmNvbm5lY3Rvci5BcGFjaGVDbGllbnRQcm9wZXJ0aWVzLlBST1hZX1VSSTwvbGl0ZXJhbD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+b3JnLmdsYXNzZmlzaC5qZXJzZXkuYXBhY2hlLmNvbm5lY3Rvci5BcGFjaGVDbGllbnRQcm9wZXJ0aWVzLlBST1hZX1VTRVJOQU1FPC9saXRlcmFsPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5vcmcuZ2xhc3NmaXNoLmplcnNleS5hcGFjaGUuY29ubmVjdG9yLkFwYWNoZUNsaWVudFByb3BlcnRpZXMuUFJPWFlfUEFTU1dPUkQ8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzZSBjb3JyZXNwb25kaW5nICZqZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXM7IGluc3RlYWQuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci52YWxpZGF0aW9uLlZhbGlkYXRpb25Db25maWcuc2V0TWVzc2FnZUludGVycG9sYXRvcjwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIudmFsaWRhdGlvbi5WYWxpZGF0aW9uQ29uZmlnLnNldFRyYXZlcnNhYmxlUmVzb2x2ZXI8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnZhbGlkYXRpb24uVmFsaWRhdGlvbkNvbmZpZy5zZXRDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIudmFsaWRhdGlvbi5WYWxpZGF0aW9uQ29uZmlnLnNldFBhcmFtZXRlck5hbWVQcm92aWRlcjwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXNlIGNvcnJlc3BvbmRpbmcgbWV0aG9kcyBvZiB0aGUgc2FtZSBjbGFzcyB3aXRob3V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+InNldCI8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4IGluIHRoZSBtZXRob2QgbmFtZXMpLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLk12Y1Byb3BlcnRpZXM8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzZSBwcm9wZXJ0aWVzIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5NdmNGZWF0dXJlPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RlYWQpLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVkMgZG9lcyBub3QgYWxsb3cgdG8gc3BlY2lmeSB0aGUgcmVzb2x2aW5nIGNsYXNzLiBSZXNvbHZpbmcgY2xhc3MgaXMgdXNlZCB0byBjcmVhdGUgYSBwYXRoIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLiBDaGFuZ2VzIGFyZToKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb24gYXR0cmlidXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+Q2xhc3MmbHQ7PyZndDsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5UZW1wbGF0ZS5yZXNvbHZpbmdDbGFzcygpPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGUgYXR0cmlidXRlIHdhcyBvYnNvbGV0ZSBhbmQgdGhlcmVmb3JlIHJlbW92ZWQuIFJlc29sdmluZyBjbGFzcyBub3cgYWx3YXlzIHRoZSByZXNvdXJjZSBjbGFzcyBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHRoZSBNVkMgcmVzb3VyY2UgbWV0aG9kIGlzIGRlZmluZWQpLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+cmVzb2x2aW5nQ2xhc3M8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FzIHJlbW92ZWQgZnJvbSAmamVyc2V5LnNlcnZlci5tdmMuVmlld2FibGU7LiBUaGUgY29uc3RydWN0b3Igbm8gbG9uZ2VyIGFjY2VwdHMgdGhpcyBhcmd1bWVudCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVyZSBpcyBubyBnZXR0ZXIgZm9yIHRoaXMgZmllbGQuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuZnJlZW1hcmtlci5GcmVlbWFya2VyUHJvcGVydGllczwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodXNlICZqZXJzZXkuc2VydmVyLm12Yy5GcmVlbWFya2VyTXZjRmVhdHVyZTsgaW5zdGVhZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKworICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLmpzcC5Kc3BQcm9wZXJ0aWVzPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1c2UgJmplcnNleS5zZXJ2ZXIubXZjLkpzcE12Y0ZlYXR1cmU7IGluc3RlYWQpCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJ1bnRpbWVSZXNvdXJjZS5nZXRGaXJzdFBhcmVudFJlc291cmNlKCk8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVzZSAmamVyc2V5LnNlcnZlci5SZXNvdXJjZS5nZXRQYXJlbnQ7IGluc3RlYWQpLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICBXQURMIGlzIGJ5IGRlZmF1bHQgZGlzcGxheWVkIGluIHRoZSBzaW1wbGlmaWVkIGZvcm0uIEl0IGRvZXMgbm90IGNvbnRhaW4gc3VwcG9ydGluZyByZXNvdXJjZXMgbGlrZSBPUFRJT05TCisgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RzIG9yCisgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD4vYXBwbGljYXRpb24ud2FkbDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIGl0c2VsZi4gSW4gb3JkZXIgdG8gZ2V0IHRoZSBmdWxsIFdBREwgdXNlIHF1ZXJ5IHBhcmFtPGxpdGVyYWw+ZGV0YWlsPXRydWU8L2xpdGVyYWw+LiBGb3IgZXhhbXBsZSBtYWtlIGEKKyAgICAgICAgICAgICAgICAgICAgICAgIEdFVCByZXF1ZXN0IHRvPGxpdGVyYWw+aHR0cDovL2xvY2FsaG9zdDo4MDgwL2FwcGxpY2F0aW9uLndhZGw/ZGV0YWlsPXRydWU8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8L3BhcmE+CisgICAgPC9zZWN0aW9uPgorCisKKyAgICA8c2VjdGlvbiB4bWw6aWQ9Im1pZy0yLjUuMSI+CisgICAgICAgIDx0aXRsZT5NaWdyYXRpbmcgZnJvbSBKZXJzZXkgMi41IHRvIDIuNS4xPC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIFdBREwgaXMgYnkgZGVmYXVsdCBkaXNwbGF5ZWQgaW4gdGhlIHNpbXBsaWZpZWQgZm9ybS4gSXQgZG9lcyBub3QgY29udGFpbiBzdXBwb3J0aW5nIHJlc291cmNlcyBsaWtlIE9QVElPTlMKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZHMgb3IKKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPi9hcHBsaWNhdGlvbi53YWRsPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgaXRzZWxmLiBJbiBvcmRlciB0byBnZXQgdGhlIGZ1bGwgV0FETCB1c2UgcXVlcnkgcGFyYW08bGl0ZXJhbD5kZXRhaWw9dHJ1ZTwvbGl0ZXJhbD4uIEZvciBleGFtcGxlIG1ha2UgYQorICAgICAgICAgICAgICAgICAgICAgICAgR0VUIHJlcXVlc3QgdG88bGl0ZXJhbD5odHRwOi8vbG9jYWxob3N0OjgwODAvYXBwbGljYXRpb24ud2FkbD9kZXRhaWw9dHJ1ZTwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiB4bWw6aWQ9Im1pZy0yLjUiPgorICAgICAgICA8dGl0bGU+TWlncmF0aW5nIGZyb20gSmVyc2V5IDIuNC4xIHRvIDIuNTwvdGl0bGU+CisKKyAgICAgICAgPHNlY3Rpb24geG1sOmlkPSJtaWctMi41LWNsaWVudCI+CisgICAgICAgICAgICA8dGl0bGU+Q2xpZW50LXNpZGUgQVBJIGFuZCBTUEkgY2hhbmdlczwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXM+Q2xpZW50IGNodW5rZWQgZW5jb2RpbmcgY29uZmlndXJhdGlvbiBiZWhhdmlvdXIgaGFzIGNoYW5nZWQ6PC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEplcnNleSBjbGllbnQgdXNlcyBjaHVua2VkIGVuY29kaW5nIChzdHJlYW1pbmcpIGZvciBzZXJpYWxpemF0aW9uIG9mIHRoZSBlbnRpdHkgYXMgYSBkZWZhdWx0IG9wdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCZWZvcmUgSmVyc2V5IDIuNSByZWxlYXNlIGVudGl0eSBidWZmZXJpbmcgaGFzIGJlZW4gdXNlZCBieSBkZWZhdWx0LiBUaGUgc2l6ZSBvZiB0aGUgY2h1bmsgY2FuIHN0aWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmUgY29udHJvbGxlZCBieSAmamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzLkNIVU5LRURfRU5DT0RJTkdfU0laRTsgcHJvcGVydHksIHRoaXMgcHJvcGVydHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3dldmVyIG5vIGxvbmdlciBlbmZvcmNlcyB0aGUgdXNlIG9mIGNodW5rZWQgZW5jb2RpbmcuIFRvIGNvbnRyb2wgcmVxdWVzdCBlbnRpdHkgYnVmZmVyaW5nIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rZWQgdHJhbnNmZXIgY29kaW5nIHNlbGVjdGlvbiwgcGxlYXNlIHV0aWxpemUgdXNlIHRoZSBuZXcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzLlJFUVVFU1RfRU5USVRZX1BST0NFU1NJTkc7IHByb3BlcnR5LiBUaGUgYmVoYXZpb3VyIG9mIHRoZSBwcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGhvd2V2ZXIgbm90IHVuaWZpZWQgYWNyb3NzIHRoZSBhdmFpbGFibGUgJmplcnNleS5jbGllbnQuQ29ubmVjdG9yOyBpbXBsZW1lbnRhdGlvbnMgYW5kIGRlcGVuZHMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiB0aGUgY29ubmVjdG9yIGltcGxlbWVudGF0aW9uIGNvbmZpZ3VyZWQgZm9yIHRoZSAmamF4cnMuY2xpZW50LkNsaWVudDsgaW5zdGFuY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCBjb25uZWN0b3IgcHJvZHVjZWQgYnkgJmplcnNleS5jbGllbnQuSHR0cFVybENvbm5lY3RvclByb3ZpZGVyOyBzdGlsbCB1c2VzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyaW5nIGFzIGRlZmF1bHQgb3B0aW9ucyBkdWUgdG8gYnVncyBpbiA8bGl0ZXJhbD5IdHRwVVJMQ29ubmVjdGlvbjwvbGl0ZXJhbD4uIE9uIHRoZSBvdGhlciBoYW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpldHR5IEhUVFAgQ2xpZW50IGJhc2VkIGNvbm5lY3RvcnMgcHJvZHVjZWQgYnkgJmplcnNleS5qZXR0eS5KZXR0eUNvbm5lY3RvclByb3ZpZGVyOyBkbyBub3Qgc3VwcG9ydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rZWQgZW5jb2RpbmcgYXQgYWxsLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBpcyBub3QgYSBuZXdseSBpbnRyb2R1Y2VkIGxpbWl0YXRpb24gLSBpdCdzIG1lcmVseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuIG9mZmljaWFsIGFja25vd2xlZGdlbWVudCBvZiB0aGUgZmFjdCB0aGF0IGRpZmZlcmVudCBjb25uZWN0b3JzIGhhdmUgZGlmZmVyZW50IGNhcGFiaWxpdGllcyBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdGF0aW9ucyAtIHNvbWV0aGluZyB0aGF0IGhhcyBhbHdheXMgYmVlbiBwYXJ0IG9mIHRoZSBpbmRpdmlkdWFsIGNvbm5lY3RvciBpbXBsZW1lbnRhdGlvbnMsIGl0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAganVzdCB3YXMgbm90IHB1YmxpY2x5IGFja25vd2xlZGdlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICBOZXcgJmplcnNleS5jbGllbnQuQ29ubmVjdG9yUHJvdmlkZXI7IFNQSSBoYXMgYmVlbiBpbnRyb2R1Y2VkIHRvIGRlY291cGxlICZqZXJzZXkuY2xpZW50LkNvbm5lY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbnRpYXRpb24gZnJvbSAmamF4cnMuY2xpZW50LkNsaWVudDsgaW5zdGFuY2UgYm9vdC1zdHJhcHBpbmcuIEFzIHN1Y2gsIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+Y29ubmVjdG9yKENvbm5lY3Rvcik8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tICZqZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFQSS4gSXQgaGFzIGJlZW4gcmVwbGFjZWQgd2l0aCBhIG5ld2x5IGludHJvZHVjZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmNvbm5lY3RvclByb3ZpZGVyKENvbm5lY3RvclByb3ZpZGVyKTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5IdHRwVXJsQ29ubmVjdG9yPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBwdWJsaWMgQVBJLgorICAgICAgICAgICAgICAgICAgICAgICAgJmplcnNleS5jbGllbnQuSHR0cFVybENvbm5lY3RvclByb3ZpZGVyOyBzaG91bGQgYmUgdXNlZCB0byBwcm9kdWNlICZqZGs2Lkh0dHBVcmxDb25uZWN0aW9uOworICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdG9yIGluc3RhbmNlcyBpbnN0ZWFkLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+Q2xpZW50UHJvcGVydGllcy5IVFRQX1VSTF9DT05ORUNUSU9OX1NFVF9NRVRIT0RfV09SS0FST1VORDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5IGhhcyBiZWVuIG1vdmVkIHRvIHRoZSBuZXcgJmplcnNleS5jbGllbnQuSHR0cFVybENvbm5lY3RvclByb3ZpZGVyOworICAgICAgICAgICAgICAgICAgICAgICAgaGFzIGJlZW4gaW50cm9kdWNlZCBpbiBKZXJzZXkgMi40KSBoYXMgYmVlbiBtb3ZlZCB0byB0aGUgbmV3ICZqZXJzZXkuY2xpZW50Lkh0dHBVcmxDb25uZWN0b3JQcm92aWRlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzIGFzIHRoaXMgcHJvcGVydHkgaXMgc3BlY2lmaWMgdG8gdGhlIGNvbm5lY3RvciBpbnN0YW5jZXMgY3JlYXRlZCBieQorICAgICAgICAgICAgICAgICAgICAgICAgJmxpdC5qZXJzZXkuY2xpZW50Lkh0dHBVcmxDb25uZWN0b3JQcm92aWRlcjsgb25seS4gVGhlIHByb3BlcnR5IGhhcyBiZWVuIGFsc28gcmVuYW1lZCB0bworICAgICAgICAgICAgICAgICAgICAgICAgJmplcnNleS5jbGllbnQuSHR0cFVybENvbm5lY3RvclByb3ZpZGVyLlNFVF9NRVRIT0RfV09SS0FST1VORDsuIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWlucyB0aGUgc2FtZSAtIDxsaXRlcmFsPmplcnNleS5jb25maWcuY2xpZW50Lmh0dHBVcmxDb25uZWN0aW9uLnNldE1ldGhvZFdvcmthcm91bmQ8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+Q2xpZW50UHJvcGVydGllcy5IVFRQX1VSTF9DT05ORUNUT1JfRklYX0xFTkdUSF9TVFJFQU1JTkc8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSAodGhhdAorICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MgYXMgdGhpcyBwcm9wZXJ0eSBpcyBzcGVjaWZpYyB0byB0aGUgY29ubmVjdG9yIGluc3RhbmNlcyBjcmVhdGVkIGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAmbGl0LmplcnNleS5jbGllbnQuSHR0cFVybENvbm5lY3RvclByb3ZpZGVyOyBvbmx5LiBUaGUgcHJvcGVydHkgaGFzIGJlZW4gYWxzbyByZW5hbWVkIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAmamVyc2V5LmNsaWVudC5IdHRwVXJsQ29ubmVjdG9yUHJvdmlkZXIuVVNFX0ZJWEVEX0xFTkdUSF9TVFJFQU1JTkc7IGFuZCB0aGUgbmV3IHByb3BlcnR5IG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzIDxsaXRlcmFsPmplcnNleS5jb25maWcuY2xpZW50Lmh0dHBVcmxDb25uZWN0b3IudXNlRml4ZWRMZW5ndGhTdHJlYW1pbmc8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseS5jb25uZWN0b3IuR3JpenpseUNvbm5lY3RvcjwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgcHVibGljCisgICAgICAgICAgICAgICAgICAgICAgICBBUEkuICZqZXJzZXkuZ3JpenpseS5Hcml6emx5Q29ubmVjdG9yUHJvdmlkZXI7IHNob3VsZCBiZSB1c2VkIHRvIHByb2R1Y2UgR3JpenpseSBBc3luY2hyb25vdXMgSFRUUCBDbGllbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RvciBpbnN0YW5jZXMgaW5zdGVhZC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIFB1YmxpYyBjb25zdHJ1Y3RvciBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIDxsaXRlcmFsPm9yZy5nbGFzc2Zpc2guamVyc2V5LmFwYWNoZS5jb25uZWN0b3IuQXBhY2hlQ29ubmVjdG9yPC9saXRlcmFsPjsgQVBJLgorICAgICAgICAgICAgICAgICAgICAgICAgJmplcnNleS5hcGFjaGUuQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXI7IHNob3VsZCBiZSB1c2VkIHRvIHByb3ZpZGUgQXBhY2hlIEhUVFAgQ2xpZW50CisgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0b3IgaW5zdGFuY2VzIGluc3RlYWQuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICBQdWJsaWMgY29uc3RydWN0b3IgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSA8bGl0ZXJhbD5vcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0eS5jb25uZWN0b3IuSmV0dHlDb25uZWN0b3I8L2xpdGVyYWw+OyBBUEkuCisgICAgICAgICAgICAgICAgICAgICAgICAmamVyc2V5LmpldHR5LkpldHR5Q29ubmVjdG9yUHJvdmlkZXI7IHNob3VsZCBiZSB1c2VkIHRvIHByb3ZpZGUgSmV0dHkgSFRUUCBDbGllbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RvciBpbnN0YW5jZXMgaW5zdGVhZC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIFJlbmFtZWQgcHJvcGVydHkgPGxpdGVyYWw+Q0FDSElOR19URU1QTEFURVNfRU5BQkxFRDwvbGl0ZXJhbD4gaW4gJmplcnNleS5zZXJ2ZXIubXZjLk11c3RhY2hlTXZjRmVhdHVyZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gPGxpdGVyYWw+amVyc2V5LmNvbmZpZy5zZXJ2ZXIubXZjLmNhY2hpbmcubXVzdGFjaGUuZW5hYmxlZDwvbGl0ZXJhbD4gdG8KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmplcnNleS5jb25maWcuc2VydmVyLm12Yy5jYWNoaW5nLm11c3RhY2hlPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhlbnRpY2F0aW9uIGZpbHRlcnMgPGxpdGVyYWw+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LmZpbHRlci5IdHRwQmFzaWNBdXRoRmlsdGVyPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgYW5kIDxsaXRlcmFsPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5maWx0ZXIuSHR0cERpZ2VzdEF1dGhGaWx0ZXI8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICB3ZXJlIGRlcHJlY2F0ZWQgYW5kIHJlcGxhY2VkIGJ5ICZqZXJzZXkuY2xpZW50Lkh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmU7LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbiB4bWw6aWQ9Im1pZy0yLjUtb3RoZXIiPgorICAgICAgICAgICAgPHRpdGxlPk90aGVyIGNoYW5nZXM8L3RpdGxlPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlICZqZXJzZXkuc2VydmVyLkNvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyOyBpbnZva2VzIGV2ZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+b25TdGFydHVwPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPm9uU2h1dGRvd248L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxzbyB3aGVuIGFwcGxpY2F0aW9uIGlzIGJlaW5nIHN0YXJ0ZWQgb3Igc3RvcHBlZCBiZWNhdXNlIG9mIGFwcGxpY2F0aW9uIHJlZGVwbG95LiBUaGUgaW50ZXJmYWNlIHdhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlZCBhcyBhIEJldGEgbm93LgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgbW9uaXRvcmluZyBzdGF0aXN0aWNzIG1ldGhvZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPkFwcGxpY2F0aW9uU3RhdGlzdGljcy5nZXREZXN0cm95VGltZSgpPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIGRlcHJlY2F0ZWQgYW5kIHJldHVybnMgYWx3YXlzIG51bGwuIFVzZSAmamVyc2V5LnNlcnZlci5Db250YWluZXJMaWZlY3ljbGVMaXN0ZW5lcjsgdG8gbGlzdGVuIG9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24gZGVzdHJveSBhbmQgZ2V0IHRoZSBkZXN0cm95IHRpbWUuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5SZXNwb25zZUV4ZWN1dG9yc1Byb3ZpZGVyPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyYWN0IGhhcyBiZWVuIGNvbXBsZXRlbHkgcmVtb3ZlZCBmcm9tIHRoZSBKZXJzZXkgU1BJIGFzIGl0IHdhcyBpbmNvbnNpc3RlbnRseSB1c2VkIGJ5IEplcnNleQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWUgYW5kIHdlIGRpZCBub3QgZmluZCBhIHN1aXRhYmxlIHVzZSBjYXNlIHdoZXJlIGEgY3VzdG9tIHJlc3BvbnNlIGV4ZWN1dG9yIHdvdWxkIG1ha2Ugc2Vuc2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2hpbGUgd2UgaGF2ZSBubyBpbmRpY2F0aW9uIHRoYXQgdGhlIHJlbW92ZWQgU1BJIGlzIHVzZWQgaW4gdGhlIEplcnNleSBjb21tdW5pdHksIHBsZWFzZSBkbyBub3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZXNpdGF0ZSB0byBjb250YWN0IHVzIGluIGNhc2UgeW91IHRoaW5rIHRoYXQgeW91IGhhdmUgYSB2YWxpZCB1c2UgY2FzZSB3aGVyZSB0aGUgdXNlIG9mIGEgY3VzdG9tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UgZXhlY3V0b3IgbWFrZXMgc2Vuc2UuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5SZXF1ZXN0c0V4ZWN1dG9yc1Byb3ZpZGVyPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyYWN0IGhhcyBiZWVuIHJlbmFtZWQgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5vcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuUmVxdWVzdHNFeGVjdXRvcnNQcm92aWRlcjwvbGl0ZXJhbD4uIEl0IGhhcyBiZWVuIGFsc28gZXh0ZW5kZWQgd2l0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuIGFkZGl0aW9uYWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5yZWxlYXNlUmVxdWVzdGluZ0V4ZWN1dG9yPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCB0byBhZGRyZXNzIGV4ZWN1dG9yIHNodXRkb3duIGhhbmRsaW5nIGlzc3VlcyByZXBvcnRlZCBpbjxsaW5rCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhsaW5rOmhyZWY9J2h0dHBzOi8vamF2YS5uZXQvamlyYS9icm93c2UvSkVSU0VZLTIyMDUnPkpFUlNFWS0yMjA1PC9saW5rPi4gQXMgc3VjaCwgYW55IGN1c3RvbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIG9mIHRoZSBTUEkgaXMgbm93IHJlcXVpcmVkIHRvIGltcGxlbWVudCB0aGUgbmV3IG1ldGhvZC4gKE5vdGUgdGhhdCB0aGUgU1BJIGhhcyBiZWVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZCBpbiBKZXJzZXkgMi4xOCAtIHNlZSB0aGUgSmVyc2V5IDIuMTggcmVsZWFzZSBtaWdyYXRpb24gZ3VpZGUgc2VjdGlvbiBmb3IgbW9yZSBkZXRhaWxzLikKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorCisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24geG1sOmlkPSJtaWctMi40LjEiPgorICAgICAgICA8dGl0bGU+TWlncmF0aW5nIGZyb20gSmVyc2V5IDIuNCB0byAyLjQuMTwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICBUaGUgdW5zdXBwb3J0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPkNsaWVudFByb3BlcnRpZXMuQlVGRkVSX1JFU1BPTlNFX0VOVElUWV9PTl9FWENFUFRJT048L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSwgd2l0aCB2YWx1ZSBvZjxsaXRlcmFsPmplcnNleS5jb25maWcuY2xpZW50LmJ1ZmZlclJlc3BvbnNlRW50aXR5T25FeGNlcHRpb248L2xpdGVyYWw+LCBoYXMgYmVlbgorICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZCBmcm9tIHRoZSBBUEkuIFNpbmNlIEplcnNleSAyLjQgd2hlcmUKKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaW5rIHhsaW5rOmhyZWY9J2h0dHBzOi8vamF2YS5uZXQvamlyYS9icm93c2UvamVyc2V5LTIxNTcnPkpFUlNFWS0yMTU3PC9saW5rPgorICAgICAgICAgICAgICAgICAgICAgICAgaXNzdWUgaGFzIGJlZW4gZml4ZWQsIEplcnNleSBjbGllbnQgcnVudGltZSBhdXRvbWF0aWNhbGx5IGJ1ZmZlcnMgZXJyb3IgcmVzcG9uc2UgZW50aXRpZXMuIFRoaXMgYmVoYXZpb3IKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzIGF1dG9tYXRpYyBhbmQgdGhlcmUgaXMgbm8gbmVlZCB0byBzZXQgYW55IHByb3BlcnR5LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8L3BhcmE+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24geG1sOmlkPSJtaWctMi40Ij4KKyAgICAgICAgPHRpdGxlPk1pZ3JhdGluZyBmcm9tIEplcnNleSAyLjMgdG8gMi40PC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIEFsbCBkZXByZWNhdGVkIFNTRSAmamVyc2V5LnNzZS5JbmJvdW5kRXZlbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5nZXREYXRhKC4uLik8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RzIGhhdmUgYmVlbiByZW1vdmVkIGZyb20gdGhlIEFQSS4gVXNlIHRoZSBuZXcKKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPnJlYWREYXRhKC4uLik8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RzIGhhdmUgYmVlbiBpbnRyb2R1Y2VkIGluc3RlYWQgaW4gSmVyc2V5IDIuMyBmb3IgY29uc2lzdGVuY3kgd2l0aCBvdGhlciBwYXJ0cyBvZiBjbGllbnQtc2lkZSBKQVgtUlMKKyAgICAgICAgICAgICAgICAgICAgICAgIEFQSS4gQWNjZXNzIHRvIHRoZSByYXcgU1NFIGV2ZW50IGRhdGEgY29udGVudCBpcyBwcm92aWRlZCB2aWEgYSAmbGl0LmplcnNleS5zc2UuSW5ib3VuZEV2ZW50OydzCisgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5ieXRlW10gZ2V0UmF3RGF0YSgpPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kIHRoYXQgaGFzIGJlZW4gdG9vIGludHJvZHVjZWQgaW4gSmVyc2V5IDIuMy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIEFsbCBFSkIgYW5kIENESSBpbnRlZ3JhdGlvbiBjbGFzc2VzIGhhdmUgYmVlbiBtb3ZlZCBpbnRvIGludGVybmFsIEplcnNleSBwYWNrYWdlcywgdG8gY2xlYXJseSBzdGF0ZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVncmF0aW9uIGNvZGUgc2hvdWxkIG5vdCBiZSB1c2VkIGFzIGEgcHVibGljIEFQSS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIHhtbDppZD0ibWlnLTIuMyI+CisgICAgICAgIDx0aXRsZT5NaWdyYXRpbmcgZnJvbSBKZXJzZXkgMi4wLCAyLjEgb3IgMi4yIHRvIDIuMzwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICBBbGwgZXhpc3RpbmcgU1NFICZqZXJzZXkuc3NlLkluYm91bmRFdmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmdldERhdGEoLi4uKTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZHMgaGF2ZSBiZWVuIG1hZGUgZGVwcmVjYXRlZCBhbmQgbmV3CisgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5yZWFkRGF0YSguLi4pPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kcyBoYXZlIGJlZW4gaW50cm9kdWNlZCBpbnN0ZWFkIGZvciBjb25zaXN0ZW5jeSB3aXRoIG90aGVyIHBhcnRzIG9mIGNsaWVudC1zaWRlIEpBWC1SUyBBUEkuIFRoZQorICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+Z2V0RGF0YSguLi4pPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kcyB3aWxsIGJlIHJlbW92ZWQgaW4gSmVyc2V5IDIuNC4gQSBuZXcgU1NFICZqZXJzZXkuc3NlLkluYm91bmRFdmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmJ5dGVbXSBnZXRSYXdEYXRhKCk8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QgaGFzIGJlZW4gaW50cm9kdWNlZCB0byBwcm92aWRlIGFjY2VzcyB0byB0aGUgcmF3IFNTRSBldmVudCBkYXRhIGNvbnRlbnQuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmljICZqZXJzZXkuc2VydmVyLkJyb2FkY2FzdGVyOyBtZXRob2RzIGZvciBhZGRpbmcvcmVtb3ZpbmcgJmplcnNleS5zZXJ2ZXIuQnJvYWRjYXN0ZXJMaXN0ZW5lcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdHJhdGlvbnMgaGF2ZSBiZWVuIHJlbmFtZWQgZnJvbQorICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+YWRkQnJvYWRjYXN0ZXJMaXN0ZW5lci9yZW1vdmVCcm9hZGNhc3Rlckxpc3RlbmVyPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgdG8gc2ltcGx5PGxpdGVyYWw+YWRkL3JlbW92ZTwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmljICZqZXJzZXkuc2VydmVyLkJyb2FkY2FzdGVyOyAoYW5kIHRyYW5zaXRpdmVseSwgJmplcnNleS5zc2UuU3NlQnJvYWRjYXN0ZXI7KQorICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+YWRkL3JlbW92ZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZHMgLSB0aGF0IGFyZSByZXNwb25zaWJsZSBmb3IgYWRkaW5nL3JlbW92aW5nICZqZXJzZXkuc2VydmVyLkJyb2FkY2FzdGVyTGlzdGVuZXI7CisgICAgICAgICAgICAgICAgICAgICAgICBhbmQgJmplcnNleS5zZXJ2ZXIuQ2h1bmtlZE91dHB1dDsgKG9yICZqZXJzZXkuc3NlLkV2ZW50T3V0cHV0OykgcmVnaXN0cmF0aW9ucyAtIG5vIGxvbmdlciB0cnkgdG8gYXZvaWQKKyAgICAgICAgICAgICAgICAgICAgICAgIGR1cGxpY2F0ZSByZWdpc3RyYXRpb25zIGJ5IGNvbXBhcmluZyBoYXNoIGNvZGUgb2YgdGhlIGFkZGVkL3JlbW92ZWQgaW5zdGFuY2Ugd2l0aCB0aGUgaGFzaCBjb2RlcyBvZgorICAgICAgICAgICAgICAgICAgICAgICAgYWxyZWFkeSByZWdpc3RlcmVkIGluc3RhbmNlcy4gVGhpcyBiZWhhdmlvciBoYXMgYmVlbiBpZGVudGlmaWVkIGFzIGEgcG90ZW50aWFsIHNvdXJjZSBvZiBoYXJkIHRvIGRpc2NvdmVyCisgICAgICAgICAgICAgICAgICAgICAgICBidWdzIGFuZCB3YXMgcmVtb3ZlZCBhcyBzdWNoLiBUaGUgaXNzdWUgd2l0aCB0aGUgZm9ybWVyIGJlaGF2aW9yIHdhcyB0aGF0IGhhc2ggY29kZXMgYXMgaW50ZWdlciB2YWx1ZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGUgb25seSBhIHZlcnkgbGltaXRlZCB2YWx1ZSBzcGFjZSB0aGF0IGNvdWxkIGxlYWQgdG8gZmFsc2UtcG9zaXRpdmUgZHVwbGljYXRlIHJlZ2lzdHJhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0aW9ucywgZXNwZWNpYWxseSB3aXRoIGxhcmdlciBudW1iZXIgb2Ygc2ltdWx0YW5lb3VzbHkgY29ubmVjdGVkIFNTRSBjbGllbnRzIChyZXByZXNlbnRlZAorICAgICAgICAgICAgICAgICAgICAgICAgYnkgJmxpdC5qZXJzZXkuc2VydmVyLkNodW5rZWRPdXRwdXQ7IG9yICZsaXQuamVyc2V5LnNzZS5FdmVudE91dHB1dDsgYnJvYWRjYXN0ZXIgcmVnaXN0cmF0aW9ucykuCisgICAgICAgICAgICAgICAgICAgICAgICBDb25zZXF1ZW50bHksIHVzZXJzIHdobyByZWx5IG9uIHRoZSBvbGQgcmVnaXN0cmF0aW9uIGJlaGF2aW9yIGluIHRoZWlyIGFwcGxpY2F0aW9uIGNvZGUgbmVlZCB0byBhZGFwdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUgdG8gdGhlIHJldmlzZWQgYmVoYXZpb3Igb2YgJmxpdC5qZXJzZXkuc2VydmVyLkJyb2FkY2FzdGVyOworICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+YWRkL3JlbW92ZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZHMuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDwvcGFyYT4KKworICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIHhtbDppZD0ibWlnLTEueCI+CisgICAgICAgIDx0aXRsZT5NaWdyYXRpbmcgZnJvbSBKZXJzZXkgMS54IHRvIDIuMDwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhpcyBjaGFwdGVyIGlzIGEgbWlncmF0aW9uIGd1aWRlIGZvciBwZW9wbGUgc3dpdGNoaW5nIGZyb20gSmVyc2V5IDEueC4gU2luY2UgbWFueSBvZiB0aGUgSmVyc2V5IDEueCBmZWF0dXJlcyBiZWNhbWUKKyAgICAgICAgICAgIHBhcnQgb2YgSkFYLVJTIDIuMCBzdGFuZGFyZCB3aGljaCBjYXVzZWQgY2hhbmdlcyBpbiB0aGUgcGFja2FnZSBuYW1lcywgd2UgZGVjaWRlZCBpdCBpcyBhIGdvb2QgdGltZSB0byBkbyBhIG1vcmUKKyAgICAgICAgICAgIHNpZ25pZmljYW50IGluY29tcGF0aWJsZSByZWZhY3RvcmluZywgd2hpY2ggd2lsbCBhbGxvdyB1cyB0byBpbnRyb2R1Y2Ugc29tZSBtb3JlIGludGVyZXN0aW5nIG5ldyBmZWF0dXJlcyBpbiB0aGUKKyAgICAgICAgICAgIGZ1dHVyZS4gQXMgdGhlIHJlc3VsdCwgdGhlcmUgYXJlIG1hbnkgaW5jb21wYXRpYmlsaXRpZXMgYmV0d2VlbiBKZXJzZXkgMS54IGFuZCBKZXJzZXkgMi4wLiBUaGlzIGNoYXB0ZXIgc3VtbWFyaXplcyBob3cKKyAgICAgICAgICAgIHRvIG1pZ3JhdGUgdGhlIGNvbmNlcHRzIGZvdW5kIGluIEplcnNleSAxLnggdG8gSmVyc2V5L0pBWC1SUyAyLjAgY29uY2VwdHMuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8c2VjdGlvbiB4bWw6aWQ9Im1pZy1zZXJ2ZXItYXBpIj4KKyAgICAgICAgICAgIDx0aXRsZT5TZXJ2ZXIgQVBJPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEplcnNleSAxLnggY29udGFpbnMgbnVtYmVyIG9mIHByb3ByaWV0YXJ5IHNlcnZlciBBUElzLiBUaGlzIHNlY3Rpb24gY292ZXJzIG1pZ3JhdGlvbiBvZiBhcHBsaWNhdGlvbiBjb2RlIHJlbHlpbmcKKyAgICAgICAgICAgICAgICBvbiB0aG9zZSBBUElzLgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8c2VjdGlvbiB4bWw6aWQ9Im1pZy1zZXJ2ZXItaW5qZWN0LWN1c3RvbS1vYmplY3RzIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+SW5qZWN0aW5nIGN1c3RvbSBvYmplY3RzPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cGFyYT5KZXJzZXkgMS54IGhhdmUgaXRzIG93biBpbnRlcm5hbCBkZXBlbmRlbmN5IGluamVjdGlvbiBmcmFtZXdvcmsgd2hpY2ggaGFuZGxlcyBpbmplY3RpbmcgdmFyaW91cyBwYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgICAgIGludG8gZmllbGQgb3IgbWV0aG9kcy4gSXQgYWxzbyBwcm92aWRlcyBhIHdheSBob3cgdG8gcmVnaXN0ZXIgY3VzdG9tIGluamVjdGlvbiBwcm92aWRlciBpbiBTaW5nbGV0b24gb3IKKyAgICAgICAgICAgICAgICAgICAgUGVyUmVxdWVzdCBzY29wZXMuIEplcnNleSAyLnggdXNlcyBISzIgYXMgZGVwZW5kZW5jeSBpbmplY3Rpb24gZnJhbWV3b3JrIGFuZCB1c2VycyBhcmUgYWxzbyBhYmxlIHRvIHJlZ2lzdGVyCisgICAgICAgICAgICAgICAgICAgIGN1c3RvbSBjbGFzc2VzIG9yIGluc3RhbmNlcyB0byBiZSBpbmplY3RlZCBpbiB2YXJpb3VzIHNjb3Blcy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8cGFyYT5NYWluIGRpZmZlcmVuY2UgaW4gSmVyc2V5IDIueCBpcyB0aGF0IHlvdSBkb24ndCBuZWVkIHRvIGNyZWF0ZSBzcGVjaWFsIGNsYXNzZXMgb3IgcHJvdmlkZXJzIGZvciB0aGlzIHRhc2s7CisgICAgICAgICAgICAgICAgICAgIGV2ZXJ5dGhpbmcgc2hvdWxkIGJlIGFjaGlldmFibGUgdXNpbmcgSEsyIEFQSS4gQ3VzdG9tIGluamVjdGFibGVzIGNhbiBiZSByZWdpc3RlcmVkIGF0IFJlc291cmNlQ29uZmlnIGxldmVsIGJ5CisgICAgICAgICAgICAgICAgICAgIGFkZGluZyBuZXcgSEsyIE1vZHVsZSBvciBieSBkeW5hbWljYWxseSBhZGRpbmcgYmluZGluZyBhbG1vc3QgYW55d2hlcmUgdXNpbmcgaW5qZWN0ZWQgSEsyIFNlcnZpY2VzIGluc3RhbmNlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPkplcnNleSAxLnggU2luZ2xldG9uOgorICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9InVubnVtYmVyZWQiPlJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3CisgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0UmVzb3VyY2VDb25maWcoKTsgcmVzb3VyY2VDb25maWcuZ2V0U2luZ2xldG9ucygpLmFkZCggbmV3IFNpbmdsZXRvblR5cGVJbmplY3RhYmxlUHJvdmlkZXImbHQ7Q29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNpbmdsZXRvblR5cGUmZ3Q7KCBTaW5nbGV0b25UeXBlLmNsYXNzLCBuZXcgU2luZ2xldG9uVHlwZSgpKSB7fSk7CisgICAgICAgICAgICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPHBhcmE+SmVyc2V5IDEueCBQZXJSZXF1ZXN0OgorICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9InVubnVtYmVyZWQiPlJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3CisgICAgICAgICAgICAgICAgICAgICAgICBEZWZhdWx0UmVzb3VyY2VDb25maWcoKTsgcmVzb3VyY2VDb25maWcuZ2V0U2luZ2xldG9ucygpLmFkZCggbmV3IFBlclJlcXVlc3RUeXBlSW5qZWN0YWJsZVByb3ZpZGVyJmx0O0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICBQZXJSZXF1ZXN0VHlwZSZndDsoKSB7IEBPdmVycmlkZSBwdWJsaWMgSW5qZWN0YWJsZSZsdDtQZXJSZXF1ZXN0VHlwZSZndDsgZ2V0SW5qZWN0YWJsZShDb21wb25lbnRDb250ZXh0CisgICAgICAgICAgICAgICAgICAgICAgICBpYywgQ29udGV4dCBjb250ZXh0KSB7IC8vLi4uIH0gfSk7CisgICAgICAgICAgICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPHBhcmE+SmVyc2V5IDIuMCBISzIgTW9kdWxlOgorICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9InVubnVtYmVyZWQiPnB1YmxpYyBzdGF0aWMgY2xhc3MgTXlCaW5kZXIgZXh0ZW5kcyBBYnN0cmFjdEJpbmRlcgorICAgICAgICAgICAgICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeyAvLyByZXF1ZXN0IHNjb3BlIGJpbmRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoTXlJbmplY3RhYmxlUGVyUmVxdWVzdC5jbGFzcykudG8oTXlJbmplY3RhYmxlUGVyUmVxdWVzdC5jbGFzcykuaW4oUmVxdWVzdFNjb3BlZC5jbGFzcyk7IC8vIHNpbmdsZXRvbgorICAgICAgICAgICAgICAgICAgICAgICAgYmluZGluZyBiaW5kKE15SW5qZWN0YWJsZVNpbmdsZXRvbi5jbGFzcykuaW4oU2luZ2xldG9uLmNsYXNzKTsgLy8gc2luZ2xldG9uIGluc3RhbmNlIGJpbmRpbmcgYmluZChuZXcKKyAgICAgICAgICAgICAgICAgICAgICAgIE15SW5qZWN0YWJsZVNpbmdsZXRvbigpKS50byhNeUluamVjdGFibGVTaW5nbGV0b24uY2xhc3MpOyB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnaXN0ZXIgbW9kdWxlIHRvIFJlc291cmNlQ29uZmlnIChjYW4gYmUgZG9uZSBhbHNvIGluIGNvbnN0cnVjdG9yKSBSZXNvdXJjZUNvbmZpZyByYyA9IG5ldworICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VDb25maWcoKTsgcmMuYWRkQ2xhc3NlcygvKiAuLi4gKi8pOyByYy5hZGRCaW5kZXJzKG5ldyBNeUJpbmRlcigpKTsKKyAgICAgICAgICAgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8cGFyYT5KZXJzZXkgMi4wIGR5bmFtaWMgYmluZGluZzoKKyAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJ1bm51bWJlcmVkIj5wdWJsaWMgc3RhdGljIGNsYXNzIE15QXBwbGljYXRpb24gZXh0ZW5kcworICAgICAgICAgICAgICAgICAgICAgICAgQXBwbGljYXRpb24geworCisgICAgICAgICAgICAgICAgICAgICAgICBASW5qZWN0IHB1YmxpYyBNeUFwcGxpY2F0aW9uKFNlcnZpY2VMb2NhdG9yIHNlcnZpY2VMb2NhdG9yKSB7IFN5c3RlbS5vdXQucHJpbnRsbigiUmVnaXN0ZXJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGFibGVzLi4uIik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNDb25maWd1cmF0aW9uIGRjID0gSW5qZWN0aW9ucy5nZXRDb25maWd1cmF0aW9uKHNlcnZpY2VMb2NhdG9yKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWVzdCBzY29wZSBiaW5kaW5nIEluamVjdGlvbnMuYWRkQmluZGluZygKKyAgICAgICAgICAgICAgICAgICAgICAgIEluamVjdGlvbnMubmV3QmluZGVyKE15SW5qZWN0YWJsZVBlclJlcXVlc3QuY2xhc3MpLnRvKE15SW5qZWN0YWJsZVBlclJlcXVlc3QuY2xhc3MpLmluKFJlcXVlc3RTY29wZWQuY2xhc3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgZGMpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaW5nbGV0b24gYmluZGluZyBJbmplY3Rpb25zLmFkZEJpbmRpbmcoIEluamVjdGlvbnMubmV3QmluZGVyKE15SW5qZWN0YWJsZVNpbmdsZXRvbi5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgIC50byhNeUluamVjdGFibGVTaW5nbGV0b24uY2xhc3MpIC5pbihTaW5nbGV0b24uY2xhc3MpLCBkYyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpbmdsZXRvbiBpbnN0YW5jZSBiaW5kaW5nIEluamVjdGlvbnMuYWRkQmluZGluZyggSW5qZWN0aW9ucy5uZXdCaW5kZXIobmV3IE15SW5qZWN0YWJsZVNpbmdsZXRvbigpKQorICAgICAgICAgICAgICAgICAgICAgICAgLnRvKE15SW5qZWN0YWJsZVNpbmdsZXRvbi5jbGFzcyksIGRjKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWVzdCBzY29wZSBiaW5kaW5nIHdpdGggc3BlY2lmaWVkIGN1c3RvbSBhbm5vdGF0aW9uIEluamVjdGlvbnMuYWRkQmluZGluZygKKyAgICAgICAgICAgICAgICAgICAgICAgIEluamVjdGlvbnMubmV3QmluZGVyKE15SW5qZWN0YWJsZVBlclJlcXVlc3QuY2xhc3MpIC50byhNeUluamVjdGFibGVQZXJSZXF1ZXN0LmNsYXNzKSAucXVhbGlmaWVkQnkobmV3CisgICAgICAgICAgICAgICAgICAgICAgICBNeUFubm90YXRpb25JbXBsKCkpIC5pbihSZXF1ZXN0U2NvcGVkLmNsYXNzKSwgZGMpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21taXRzIGNoYW5nZXMgZGMuY29tbWl0KCk7IH0KKworICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyBTZXQmbHQ7Q2xhc3MmbHQ7PyZndDsmZ3Q7IGdldENsYXNzZXMoKSB7IHJldHVybiAuLi4gfX0KKyAgICAgICAgICAgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgICAgIDxzZWN0aW9uIHhtbDppZD0ibWlnLXNlcnZlci1yZWxvYWQiPgorCisgICAgICAgICAgICAgICAgPHRpdGxlPlJlc291cmNlQ29uZmlnIFJlbG9hZDwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgSW4gSmVyc2V5IDEsIHRoZSByZWxvYWQgZnVuY3Rpb25hbGl0eSBpcyBiYXNlZCBvbiB0d28gaW50ZXJmYWNlczoKKyAgICAgICAgICAgICAgICAgICAgPG9yZGVyZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaW1wYXJhPmNvbS5zdW4uamVyc2V5LnNwaS5jb250YWluZXIuQ29udGFpbmVyTGlzdGVuZXI8L3NpbXBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaW1wYXJhPmNvbS5zdW4uamVyc2V5LnNwaS5jb250YWluZXIuQ29udGFpbmVyTm90aWZpZXI8L3NpbXBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8L29yZGVyZWRsaXN0PgorCisgICAgICAgICAgICAgICAgICAgIENvbnRhaW5lcnMsIHdoaWNoIHN1cHBvcnQgdGhlIHJlbG9hZCBmdW5jdGlvbmFsaXR5IGltcGxlbWVudCB0aGUKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+Q29udGFpbmVyTGlzdGVuZXI8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZSwgc28gdGhhdCBvbmNlIHlvdSBnZXQgYWNjZXNzIHRvIHRoZSBhY3R1YWwgY29udGFpbmVyIGluc3RhbmNlLCB5b3UgY291bGQgY2FsbCBpdCdzCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPm9uUmVsb2FkPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICBtZXRob2QgYW5kIGdldCB0aGUgY29udGFpbmVyIHJlLWxvYWQgdGhlIGNvbmZpZy4gVGhlIHNlY29uZCBpbnRlcmZhY2UgaGVscHMgeW91IHRvIG9idGFpbiB0aGUgYWN0dWFsIGNvbnRhaW5lcgorICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZSByZWZlcmVuY2UuIEFuIGV4YW1wbGUgb24gaG93IHRoaW5ncyBhcmUgd2lyZWQgdG9nZXRoZXIgZm9sbG93cy4KKworICAgICAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5KZXJzZXkgMSByZWxvYWRlciBpbXBsZW1lbnRhdGlvbjwvdGl0bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5wdWJsaWMgY2xhc3MgUmVsb2FkZXIgaW1wbGVtZW50cworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRhaW5lck5vdGlmaWVyIHsgTGlzdCZsdDtDb250YWluZXJMaXN0ZW5lciZndDsgbHM7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgUmVsb2FkZXIoKSB7IGxzID0gbmV3IEFycmF5TGlzdCZsdDtDb250YWluZXJMaXN0ZW5lciZndDsoKTsgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWRkTGlzdGVuZXIoQ29udGFpbmVyTGlzdGVuZXIgbCkgeyBscy5hZGQobCk7IH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbG9hZCgpIHsgZm9yIChDb250YWluZXJMaXN0ZW5lciBsIDogbHMpIHsgbC5vblJlbG9hZCgpOyB9IH0gfQorICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorCisgICAgICAgICAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRpdGxlPkplcnNleSAxIHJlbG9hZGVyIHJlZ2lzdHJhdGlvbjwvdGl0bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5SZWxvYWRlciByZWxvYWRlciA9IG5ldyBSZWxvYWRlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlQ29uZmlnLmdldFByb3BlcnRpZXMoKS5wdXQoUmVzb3VyY2VDb25maWcuUFJPUEVSVFlfQ09OVEFJTkVSX05PVElGSUVSLCByZWxvYWRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisKKyAgICAgICAgICAgICAgICAgICAgSW4gSmVyc2V5IDIsIHR3byBpbnRlcmZhY2VzIGFyZSBpbnZvbHZlZCBhZ2FpbiwgYnV0IHRoZXNlIGhhdmUgYmVlbiByZS1kZXNpZ25lZC4KKworICAgICAgICAgICAgICAgICAgICA8b3JkZXJlZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNpbXBhcmE+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5Db250YWluZXI8L3NpbXBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzaW1wYXJhPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXI8L3NpbXBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8L29yZGVyZWRsaXN0PgorCisgICAgICAgICAgICAgICAgICAgIFRoZQorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5Db250YWluZXI8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZSBpbnRyb2R1Y2VzIHR3bworICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5yZWxvYWQ8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgIG1ldGhvZHMsIHdoaWNoIHlvdSBjYW4gY2FsbCB0byBnZXQgdGhlIGFwcGxpY2F0aW9uIHJlLWxvYWRlZC4gT25lIG9mIHRoZXNlIG1ldGhvZHMgYWxsb3dzIHRvIHBhc3MgaW4gYQorICAgICAgICAgICAgICAgICAgICBuZXcgJmxpdC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOyBpbnN0YW5jZS4KKworICAgICAgICAgICAgICAgICAgICBZb3UgY2FuIHJlZ2lzdGVyIHlvdXIgaW1wbGVtZW50YXRpb24gb2YKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+Q29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXI8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgIHRoZSBzYW1lIHdheSBhcyBhbnkgb3RoZXIgcHJvdmlkZXIgKGkuZS4gZWl0aGVyIGJ5IGFubm90YXRpbmcgaXQgYnkgJmpheHJzLmV4dC5Qcm92aWRlcjsgYW5ub3RhdGlvbiBvciBhZGRpbmcKKyAgICAgICAgICAgICAgICAgICAgaXQgdG8gdGhlIEplcnNleSAmamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsgZGlyZWN0bHkgZWl0aGVyIHVzaW5nIHRoZSBjbGFzcyAodXNpbmcKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+UmVzb3VyY2VDb25maWcuYWRkQ2xhc3NlcygpPC9saXRlcmFsPikgb3IgcmVnaXN0ZXJpbmcgYSBwYXJ0aWN1bGFyIGluc3RhbmNlIHVzaW5nCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPlJlc291cmNlQ29uZmlnLmFkZFNpbmdsZXRvbnMoKTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBBbiBleGFtcGxlIG9uIGhvdyB0aGluZ3Mgd29yayBpbiBKZXJzZXkgMiBmb2xsb3dzLgorCisgICAgICAgICAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRpdGxlPkplcnNleSAyIHJlbG9hZGVyIGltcGxlbWVudGF0aW9uPC90aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPnB1YmxpYyBjbGFzcyBSZWxvYWRlciBpbXBsZW1lbnRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXIgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGFpbmVyIGNvbnRhaW5lcjsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbG9hZChSZXNvdXJjZUNvbmZpZyBuZXdDb25maWcpIHsgY29udGFpbmVyLnJlbG9hZChuZXdDb25maWcpOyB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCByZWxvYWQoKSB7IGNvbnRhaW5lci5yZWxvYWQoKTsgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlIHB1YmxpYyB2b2lkIG9uU3RhcnR1cChDb250YWluZXIgY29udGFpbmVyKSB7IHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyOyB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgb25SZWxvYWQoQ29udGFpbmVyIGNvbnRhaW5lcikgeyAvLyBpZ25vcmUgb3IgZG8gd2hhdGV2ZXIgeW91IHdhbnQgYWZ0ZXIgcmVsb2FkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzIGJlZW4gZG9uZSB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUgcHVibGljIHZvaWQgb25TaHV0ZG93bihDb250YWluZXIgY29udGFpbmVyKSB7IC8vIGlnbm9yZSBvciBkbyBzb21ldGhpbmcgYWZ0ZXIgdGhlIGNvbnRhaW5lcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcyBiZWVuIHNodXRkb3duIH0gfQorICAgICAgICAgICAgICAgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5KZXJzZXkgMiByZWxvYWRlciByZWdpc3RyYXRpb248L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+UmVsb2FkZXIgcmVsb2FkZXIgPSBuZXcgUmVsb2FkZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZUNvbmZpZy5hZGRTaW5nbGV0b25zKHJlbG9hZGVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgICAgIDxzZWN0aW9uIHhtbDppZD0ibWlnLXNlcnZlci1wcm92aWRlci1vcmRlcmluZyI+CisgICAgICAgICAgICAgICAgPHRpdGxlPk1lc3NhZ2VCb2R5UmVhZGVycyBhbmQgTWVzc2FnZUJvZHlXcml0ZXJzIG9yZGVyaW5nPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cGFyYT5KQVgtUlMgMi4wIGRlZmluZXMgbmV3IG9yZGVyIG9mIE1lc3NhZ2VCb2R5V29ya2VycyAtIHdob2xlIHNldCBpcyBzb3J0ZWQgYnkgZGVjbGFyYXRpb24gZGlzdGFuY2UsIG1lZGlhIHR5cGUKKyAgICAgICAgICAgICAgICAgICAgYW5kIHNvdXJjZSAoY3VzdG9tIHByb3ZpZGVycyBoYXZpbmcgaGlnaGVyIHByaW9yaXR5IHRoYW4gZGVmYXVsdCBvbmVzIHByb3ZpZGVkIGJ5IEplcnNleSkuIEpBWC1SUyAxLnggb3JkZXJpbmcKKyAgICAgICAgICAgICAgICAgICAgY2FuIHN0aWxsIGJlIGZvcmNlZCBieSBzZXR0aW5nIHBhcmFtZXRlcgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5NZXNzYWdlUHJvcGVydGllcy5MRUdBQ1lfV09SS0VSU19PUkRFUklORzwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgKDxsaXRlcmFsPiJqZXJzZXkuY29uZmlnLndvcmtlcnMubGVnYWN5T3JkZXJpbmciPC9saXRlcmFsPikgdG8gJmxpdC50cnVlOworICAgICAgICAgICAgICAgICAgICBpbiAmbGl0LmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7IG9yICZsaXQuamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7IHByb3BlcnRpZXMuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24geG1sOmlkPSJtaWctY2xpZW50LWFwaSI+CisgICAgICAgICAgICA8dGl0bGU+TWlncmF0aW5nIEplcnNleSBDbGllbnQgQVBJPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgSkFYLVJTIDIuMCBwcm92aWRlcyBmdW5jdGlvbmFsaXR5IHRoYXQgaXMgZXF1aXZhbGVudCB0byB0aGUgSmVyc2V5IDEueCBwcm9wcmlldGFyeSBjbGllbnQgQVBJLiBIZXJlIGlzIGEgcm91Z2gKKyAgICAgICAgICAgICAgICBtYXBwaW5nIGJldHdlZW4gdGhlIEplcnNleSAxLnggYW5kIEpBWC1SUyAyLjAgQ2xpZW50IEFQSSBjbGFzc2VzOgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHRhYmxlIGZyYW1lPSdhbGwnPgorICAgICAgICAgICAgICAgIDx0aXRsZT5NYXBwaW5nIG9mIEplcnNleSAxLnggdG8gSkFYLVJTIDIuMCBjbGllbnQgY2xhc3NlczwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHRncm91cCBjb2xzPSczJyBhbGlnbj0nbGVmdCcgY29sc2VwPScxJyByb3dzZXA9JzEnPgorICAgICAgICAgICAgICAgICAgICA8Y29sc3BlYyBjb2xuYW1lPSdjMScgY29sd2lkdGg9IjAqIi8+CisgICAgICAgICAgICAgICAgICAgIDxjb2xzcGVjIGNvbG5hbWU9J2MyJyBjb2x3aWR0aD0iMCoiLz4KKyAgICAgICAgICAgICAgICAgICAgPGNvbHNwZWMgY29sbmFtZT0nYzMnIGNvbHdpZHRoPSIxKiIvPgorICAgICAgICAgICAgICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT5KZXJzZXkgMS54IENsYXNzPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+SkFYLVJTIDIuMCBDbGFzczwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5Pk5vdGVzPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICA8L3RoZWFkPgorICAgICAgICAgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpbmsgeGxpbms6aHJlZj0iaHR0cDovL2plcnNleS5qYXZhLm5ldC9ub25hdi9hcGlkb2NzLzEuMTcvamVyc2V5L2NvbS9zdW4vamVyc2V5L2FwaS9jbGllbnQvQ2xpZW50Lmh0bWwiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tLnN1bi5qZXJzZXkuYXBpLmNsaWVudC5DbGllbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saW5rPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmamF4cnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+Rm9yIHRoZSBzdGF0aWMgZmFjdG9yeSBtZXRob2RzIGFuZCBjb25zdHJ1Y3RvcnMuPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnkvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmpheHJzLmNsaWVudC5DbGllbnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+Rm9yIHRoZSBpbnN0YW5jZSBtZXRob2RzLjwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGluayB4bGluazpocmVmPSJodHRwOi8vamVyc2V5LmphdmEubmV0L25vbmF2L2FwaWRvY3MvMS4xNy9qZXJzZXkvY29tL3N1bi9qZXJzZXkvYXBpL2NsaWVudC9XZWJSZXNvdXJjZS5odG1sIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5zdW4uamVyc2V5LmFwaS5jbGllbnQuV2ViUmVzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saW5rPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmamF4cnMuY2xpZW50LldlYlRhcmdldDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeS8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGluayB4bGluazpocmVmPSJodHRwOi8vamVyc2V5LmphdmEubmV0L25vbmF2L2FwaWRvY3MvMS4xNy9qZXJzZXkvY29tL3N1bi9qZXJzZXkvYXBpL2NsaWVudC9Bc3luY1dlYlJlc291cmNlLmh0bWwiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tLnN1bi5qZXJzZXkuYXBpLmNsaWVudC5Bc3luY1dlYlJlc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGluaz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmpheHJzLmNsaWVudC5XZWJUYXJnZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+WW91IGNhbiBhY2Nlc3MgYXN5bmMgdmVyc2lvbnMgb2YgdGhlIGFzeW5jIG1ldGhvZHMgYnkgY2FsbGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5XZWJUYXJnZXQucmVxdWVzdCgpLmFzeW5jKCk8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICA8L3Rib2R5PgorICAgICAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICAgICAgPC90YWJsZT4KKworICAgICAgICAgICAgPHBhcmE+VGhlIGZvbGxvd2luZyBzdWItc2VjdGlvbnMgc2hvdyBjb2RlIGV4YW1wbGVzLjwvcGFyYT4KKworICAgICAgICAgICAgPHNlY3Rpb24geG1sOmlkPSJtaWctY2xpZW50LXNpbXBsZS1yZXF1ZXN0Ij4KKyAgICAgICAgICAgICAgICA8dGl0bGU+TWFraW5nIGEgc2ltcGxlIGNsaWVudCByZXF1ZXN0PC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgSmVyc2V5IDEueCB3YXk6CisKKyAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJ1bm51bWJlcmVkIj5DbGllbnQgY2xpZW50ID0gQ2xpZW50LmNyZWF0ZSgpOyBXZWJSZXNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgd2ViUmVzb3VyY2UgPSBjbGllbnQucmVzb3VyY2UocmVzdFVSTCkucGF0aCgibXlyZXNvdXJjZS97cGFyYW19Iik7IFN0cmluZyByZXN1bHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgd2ViUmVzb3VyY2UucGF0aFBhcmFtKCJwYXJhbSIsICJ2YWx1ZSIpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBKQVgtUlMgMi4wIHdheToKKworICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9InVubnVtYmVyZWQiPkNsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IGNsaWVudC50YXJnZXQocmVzdFVSTCkucGF0aCgibXlyZXNvdXJjZS97cGFyYW19Iik7IFN0cmluZyByZXN1bHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnBhdGhQYXJhbSgicGFyYW0iLCAidmFsdWUiKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgICAgIDxzZWN0aW9uIHhtbDppZD0ibWlnLWNsaWVudC1maWx0ZXItcmVnaXN0ZXIiPgorICAgICAgICAgICAgICAgIDx0aXRsZT5SZWdpc3RlcmluZyBmaWx0ZXJzPC90aXRsZT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBKZXJzZXkgMS54IHdheToKKworICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9InVubnVtYmVyZWQiPkNsaWVudCBjbGllbnQgPSBDbGllbnQuY3JlYXRlKCk7IFdlYlJlc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICB3ZWJSZXNvdXJjZSA9IGNsaWVudC5yZXNvdXJjZShyZXN0VVJMKTsgd2ViUmVzb3VyY2UuYWRkRmlsdGVyKG5ldyBIVFRQQmFzaWNBdXRoRmlsdGVyKHVzZXJuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgcGFzc3dvcmQpKTsKKyAgICAgICAgICAgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgSkFYLVJTIDIuMCB3YXk6CisKKyAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJ1bm51bWJlcmVkIj5DbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSBjbGllbnQudGFyZ2V0KHJlc3RVUkwpOyB0YXJnZXQucmVnaXN0ZXIobmV3IEh0dHBCYXNpY0F1dGhGaWx0ZXIodXNlcm5hbWUsIHBhc3N3b3JkKSk7CisgICAgICAgICAgICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgICAgICA8c2VjdGlvbiB4bWw6aWQ9Im1pZy1jbGllbnQtYWNjZXB0LWhlYWRlciI+CisgICAgICAgICAgICAgICAgPHRpdGxlPlNldHRpbmcgIkFjY2VwdCIgaGVhZGVyPC90aXRsZT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBKZXJzZXkgMS54IHdheToKKworICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9InVubnVtYmVyZWQiPkNsaWVudCBjbGllbnQgPSBDbGllbnQuY3JlYXRlKCk7IFdlYlJlc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICB3ZWJSZXNvdXJjZSA9IGNsaWVudC5yZXNvdXJjZShyZXN0VVJMKS5hY2NlcHQoInRleHQvcGxhaW4iKTsgQ2xpZW50UmVzcG9uc2UgcmVzcG9uc2UgPQorICAgICAgICAgICAgICAgICAgICAgICAgd2ViUmVzb3VyY2UuZ2V0KENsaWVudFJlc3BvbnNlLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgSkFYLVJTIDIuMCB3YXk6CisKKyAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJ1bm51bWJlcmVkIj5DbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSBjbGllbnQudGFyZ2V0KHJlc3RVUkwpOyBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikuZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgICAgICA8c2VjdGlvbiB4bWw6aWQ9Im1pZy1jbGllbnQtYWRkLWVudGl0eSI+CisgICAgICAgICAgICAgICAgPHRpdGxlPkF0dGFjaGluZyBlbnRpdHkgdG8gcmVxdWVzdDwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEplcnNleSAxLnggd2F5OgorCisgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0idW5udW1iZXJlZCI+Q2xpZW50IGNsaWVudCA9IENsaWVudC5jcmVhdGUoKTsgV2ViUmVzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHdlYlJlc291cmNlID0gY2xpZW50LnJlc291cmNlKHJlc3RVUkwpOyBDbGllbnRSZXNwb25zZSByZXNwb25zZSA9IHdlYlJlc291cmNlLnBvc3QoQ2xpZW50UmVzcG9uc2UuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAicGF5bG9hZCIpOworICAgICAgICAgICAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBKQVgtUlMgMi4wIHdheToKKworICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9InVubnVtYmVyZWQiPkNsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IGNsaWVudC50YXJnZXQocmVzdFVSTCk7IFJlc3BvbnNlIHJlc3BvbnNlID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkudGV4dCgicGF5bG9hZCIpKTsKKyAgICAgICAgICAgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgICAgIDxzZWN0aW9uIHhtbDppZD0ibWlnLWNsaWVudC1zc2wiPgorICAgICAgICAgICAgICAgIDx0aXRsZT5TZXR0aW5nIFNTTENvbnRleHQgYW5kL29yIEhvc3RuYW1lVmVyaWZpZXI8L3RpdGxlPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEplcnNleSAxLnggd2F5OgorCisgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0idW5udW1iZXJlZCI+SFRUUFNQcm9wZXJ0aWVzIHByb3AgPSBuZXcKKyAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBTUHJvcGVydGllcyhob3N0bmFtZVZlcmlmaWVyLCBzc2xDb250ZXh0KTsgRGVmYXVsdENsaWVudENvbmZpZyBkY2MgPSBuZXcgRGVmYXVsdENsaWVudENvbmZpZygpOworICAgICAgICAgICAgICAgICAgICAgICAgZGNjLmdldFByb3BlcnRpZXMoKS5wdXQoSFRUUFNQcm9wZXJ0aWVzLlBST1BFUlRZX0hUVFBTX1BST1BFUlRJRVMsIHByb3ApOyBDbGllbnQgY2xpZW50ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudC5jcmVhdGUoZGNjKTsKKyAgICAgICAgICAgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgSmVyc2V5IDIuMCB3YXk6CisKKyAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJ1bm51bWJlcmVkIj5DbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zc2xDb250ZXh0KHNzbENvbnRleHQpIC5ob3N0bmFtZVZlcmlmaWVyKGhvc3RuYW1lVmVyaWZpZXIpIC5idWlsZCgpOworICAgICAgICAgICAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgIDxzZWN0aW9uIHhtbDppZD0ibWlnLTEteC1qc29uIj4KKyAgICAgICAgICAgIDx0aXRsZT5KU09OIHN1cHBvcnQgY2hhbmdlczwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT5KU09OIFN1cHBvcnQgaGFzIHVuZGVyZ29uZSBjZXJ0YWluIGNoYW5nZXMgaW4gSmVyc2V5Jm5ic3A7Mi54LiBUaGUgbW9zdCB2aXNpYmxlIGRpZmZlcmVuY2UgZm9yIHRoZSBkZXZlbG9wZXIgaXMKKyAgICAgICAgICAgICAgICBpbiB0aGUgaW5pdGlhbGl6YXRpb24gYW5kIGNvbmZpZ3VyYXRpb24uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBJbiBKZXJzZXkmbmJzcDsxLngsIHRoZSBKQVhCL0pTT04gU3VwcG9ydCB3YXMgaW1wbGVtZW50ZWQgYXMgYSBzZXQgb2YKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbD5NZXNzYWdlQm9keVJlYWRlcnM8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgYW5kCisgICAgICAgICAgICAgICAgPGxpdGVyYWw+TWVzc2FnZVdyaXRlcnM8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgaW4gdGhlCisgICAgICAgICAgICAgICAgPGxpdGVyYWw+amVyc2V5LWpzb248L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgbW9kdWxlLiBJbnRlcm5hbGx5LCB0aGVyZSB3ZXJlIHNldmVyYWwgaW1wbGVtZW50YXRpb25zIG9mIEpTT04gdG8gT2JqZWN0IG1hcHBpbmcgcmFuZ2luZyBmcm9tIEplcnNleSdzIG93biBjdXN0b20KKyAgICAgICAgICAgICAgICBzb2x1dGlvbiB0byB0aGlyZCBwYXJ0eSBwcm92aWRlcnMsIHN1Y2ggYXMKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbD5KYWNrc29uPC9saXRlcmFsPgorICAgICAgICAgICAgICAgIG9yPGxpdGVyYWw+SmV0dGlzb248L2xpdGVyYWw+LiBUaGUgY29uZmlndXJhdGlvbiBvZiB0aGUgSlNPTiBzdXBwb3J0IHdhcyBjZW50cmFsaXplZCBpbiB0aGUKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbD5KU09OQ29uZmlndXJhdGlvbjwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICBhbmQKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbD5KU09OSkFYQkNvbnRleHQ8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgY2xhc3Nlcy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxzZWN0aW9uIHhtbDppZD0ibWlnLTEteC1qc29uLWluaXQiPgorICAgICAgICAgICAgICAgIDx0aXRsZT5Jbml0aWFsaXphdGlvbjwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFRoZXJlIGFyZSB0aHJlZSBtYWluIEpTT04tbWFwcGluZyBoYW5kbGluZyBhcHByb2FjaGVzLCB3aGljaCBhcmUgcHJlc2VydmVkIGluIEplcnNleSZuYnNwOzI6CisgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9Impzb24tamF4YiI+SkFYQi1iYXNlZDwvbGluaz4sCisgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9Impzb24tcG9qbyI+UE9KTyBtYXBwaW5nPC9saW5rPgorICAgICAgICAgICAgICAgICAgICBhbmQKKyAgICAgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0ianNvbi1sb3dsZXZlbCI+TG93LWxldmVsIHBhcnNpbmc8L2xpbms+CisKKyAgICAgICAgICAgICAgICAgICAgVGhlIGZvbGxvd2luZyB0YWJsZSBzaG93cyBob3cgdG8gZW5hYmxlIGVhY2ggb2YgdGhlbSBpbiBib3RoIEplcnNleSZuYnNwOzIgY29tcGFyZWQgdG8gSmVyc2V5Jm5ic3A7MToKKyAgICAgICAgICAgICAgICAgICAgPHRhYmxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRpdGxlPkpTT04gYXBwcm9hY2hlcyBhbmQgdXNhZ2UgaW4gSmVyc2V5Jm5ic3A7MSB2cyBKZXJzZXkmbmJzcDsyPC90aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0Z3JvdXAgY29scz0iMyI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PkFwcHJvYWNoPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT5KZXJzZXkmbmJzcDsxPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT5KZXJzZXkmbmJzcDsyPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90aGVhZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGJvZHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+UE9KTzwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+cmVnaXN0ZXI8bGl0ZXJhbD5QT0pPTWFwcGluZ0ZlYXR1cmU8L2xpdGVyYWw+LCB1c2UgJmplcnNleS5tZWRpYS5PYmplY3RNYXBwZXIxOyBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPkphY2tzb248L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXI6IChhZGQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5qZXJzZXktbWVkaWEtanNvbi1qYWNrc29uPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3kgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0iamFja3Nvbi1yZWdpc3RyYXRpb24iPnJlZ2lzdGVyPC9saW5rPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZTxsaXRlcmFsPkphY2tzb25GZWF0dXJlPC9saXRlcmFsPiksIGNvbmZpZ3VyZSB3aXRoIGN1c3RvbSAmamVyc2V5Lm1lZGlhLk9iamVjdE1hcHBlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PkpBWEI8L2VudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5PkRlZmF1bHQ7IHVzZTxsaXRlcmFsPkpTT05Db25maWd1cmF0aW9uPC9saXRlcmFsPi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5KU09OSkFYQkNvbnRleHQ8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+dXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+TU9YeTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWRkIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmplcnNleS1tZWRpYS1tb3h5PC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3k7IHRoZSBmZWF0dXJlIHdpbGwgYmUgcmVnaXN0ZXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9ImRlcGxveW1lbnQuYXV0b2Rpc2NvdmVyYWJsZSI+YXV0b21hdGljYWxseTwvbGluaz4pLCBjb25maWd1cmUgdXNpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5Nb3h5SnNvbkNvbmZpZzwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcm93PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVudHJ5Pkxvdy1sZXZlbDwvZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW50cnk+RGlyZWN0IHVzYWdlIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+SlNPTk9iamVjdDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQvb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5KU09OQXJyYXk8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbnRyeT51c2UgSlNPTi1QIChzdGFuZGFyZCkgb3IgSmV0dGlzb24gKG5vbi1zdGFuZGFyZCkgQVBJcyAoYWRkIHRoZSByZWxldmFudCBkZXBlbmRlbmN5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9lbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yb3c+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90Ym9keT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdGdyb3VwPgorICAgICAgICAgICAgICAgICAgICA8L3RhYmxlPgorICAgICAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5Jbml0aWFsaXppbmcgSkFYQi1iYXNlZCBzdXBwb3J0IHdpdGggTU9YeTwvdGl0bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9InhtbCIgbGluZW51bWJlcmluZz0idW5udW1iZXJlZCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmx0O2RlcGVuZGVuY3kmZ3Q7ICZsdDtncm91cElkJmd0O29yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhJmx0Oy9ncm91cElkJmd0OyAmbHQ7YXJ0aWZhY3RJZCZndDtqZXJzZXktbWVkaWEtbW94eSZsdDsvYXJ0aWZhY3RJZCZndDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbHQ7dmVyc2lvbiZndDsmdmVyc2lvbjsmbHQ7L3ZlcnNpb24mZ3Q7ICZsdDsvZGVwZW5kZW5jeSZndDs8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgICAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIEpBWEItYmFzZWQgc3VwcG9ydCwgTU9YeSBpcyB0aGUgZGVmYXVsdCB3YXkgaW4gSmVyc2V5Jm5ic3A7Mi4gSG93ZXZlciwgb3RoZXIgcHJvdmlkZXJzICg8bGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBKYWNrc29uPC9saXRlcmFsPiw8bGl0ZXJhbD5KZXR0aXNvbjwvbGl0ZXJhbD4pIGNhbiBiZSB1c2VkIGFzIHdlbGwuIFRoZSByZWxldmFudCBmZWF0dXJlIGhhcyB0byBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyZWQgKGFuZCBkZXBlbmRlbmN5IGFkZGVkKSBhbmQgY3VzdG9tIGltcGxlbWVudGF0aW9uIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+Q29udGV4dFJlc29sdmVyPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcyB0byBiZSBwcm92aWRlZC4gU2VlIHRoZSBjb2RlIHNuaXBwZXRzIGluIHRoZTxsaW5rIGxpbmtlbmQ9Impzb24uamFja3NvbiI+cmVsYXRlZCBjaGFwdGVyPC9saW5rPi4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvciBtb3JlIG9uIHBhcnRpY3VsYXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5GZWF0dXJlPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdHJhdGlvbiwgc2VlIGFsc286CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpbmsgbGlua2VuZD0iamFja3Nvbi1yZWdpc3RyYXRpb24iPkphY2tzb24mbmJzcDtyZWdpc3RyYXRpb248L2xpbms+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9ImpldHRpc29uLXJlZ2lzdHJhdGlvbiI+SmV0dGlzb24mbmJzcDtyZWdpc3RyYXRpb248L2xpbms+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9Im1veHktcmVnaXN0cmF0aW9uIj5NT1h5Jm5ic3A7cmVnaXN0cmF0aW9uPC9saW5rPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSJqc29ucC1yZWdpc3RyYXRpb24iPkpTT04tUCZuYnNwO3JlZ2lzdHJhdGlvbjwvbGluaz4uCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCBpcyBpbXBvcnRhbnQgdG8gcG9pbnQgb3V0LCB0aGF0IHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPkZlYXR1cmU8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0cmF0aW9uIGhhcyB0byBiZSBkb25lIHNlcGFyYXRlbHkgZm9yIGNsaWVudCBhbmQgc2VydmVyLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L25vdGU+CisgICAgICAgICAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2l0aCBKZXJzZXkgMi45LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPkphY2tzb248L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzIGJlZW4gdXBkYXRlZCB0byB2ZXJzaW9uJm5ic3A7Mi4zLjIuIFRoZSBmZWF0dXJlIGlzIHN0aWxsIGNvbmZpZ3VyZWQgdmlhIG1lbnRpb25lZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPk9iamVjdE1hcHBlcjwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcywgYnV0IHRoZSBwYWNrYWdlIGhhcyBjaGFuZ2VkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT5Gb3I8bGl0ZXJhbD5qYWNrc29uJm5ic3A7MS54PC9saXRlcmFsPiwgdXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5vcmcuY29kZWhhdXMuamFja3Nvbi5tYXAuT2JqZWN0TWFwcGVyPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+Rm9yPGxpdGVyYWw+amFja3NvbiZuYnNwOzIueDwvbGl0ZXJhbD4sIHVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+Y29tLmZhc3RlcnhtbC5qYWNrc29uLmNvcmUuT2JqZWN0TWFwcGVyPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L25vdGU+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICAgICAgPHNlY3Rpb24geG1sOmlkPSJtaWctMS14LWpzb24tbm90YXRpb24iPgorICAgICAgICAgICAgICAgIDx0aXRsZT5KU09OIE5vdGF0aW9uPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgSmVyc2V5Jm5ic3A7MSB3YXMgc2VsZWN0aW5nIHRoZSBwcm92aWRlciBhdXRvbWF0aWNhbGx5IGJhc2VkIG9uIHRoZSBkZXNpcmVkIEpTT04gTm90YXRpb24uIFRoaXMgY29uY2VwdCB3YXMKKyAgICAgICAgICAgICAgICAgICAgcmVwbGFjZWQgaW4gSmVyc2V5Jm5ic3A7MiBieSBkaXJlY3QgY2hvaWNlIG9mIHByb3ZpZGVyIChhcyBzaG93biBhYm92ZSkuIFRvIHByb3ZpZGUgc29tZSBndWlkZSBob3cgdG8gYWNoaWV2ZQorICAgICAgICAgICAgICAgICAgICB0aGUgc2FtZSByZXN1bHRzIGFzIGluIHRoZSBwcmV2aW91cyBKZXJzZXkgdmVyc2lvbiwgc2VlIHRoZSBmb2xsb3dpbmcgbGlzdDoKKyAgICAgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+TUFQUEVEPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3Qgc3VwcG9ydGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+TkFUVVJBTDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCBNT1h5IG91dHB1dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPkpFVFRJU09OX01BUFBFRDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkIGJ5IEpldHRpc29uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+QkFER0VSRklTSDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkIGJ5IEpldHRpc29uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICAgICAgPHNlY3Rpb24geG1sOmlkPSJtaWctMS14LWpzb24tY29uZmlnIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+Q29uZmlndXJhdGlvbjwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEFzIG1lbnRpb25lZCwgdGhlIGNlbnRyYWxpemVkIGNvbmZpZ3VyYXRpb24gb2YgSmVyc2V5Jm5ic3A7MSdzCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPkpTT05Db25maWd1cmF0aW9uPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICBkb2VzIG5vdCBoYXZlIGEgZGlyZWN0IGVxdWl2YWxlbnQgaW4gSmVyc2V5Jm5ic3A7Mi4gRWFjaCBwcm92aWRlciBoYXMgaXQncyBvd24gd2F5IHRvIGJlIGNvbmZpZ3VyZWQuIERldGFpbGVkCisgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uIG9mIGVhY2ggbWV0aG9kIGFuZCBwcm9wZXJ0eSBpcyBvdXQgb2Ygc2NvcGUgb2YgdGhpcyBtaWdyYXRpb24gZ3VpZGUgYW5kIGNhbiBiZSBmb3VuZCBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQgQVBJcyBvZiB0aGUgcmVsZXZhbnQgcHJvdmlkZXJzIGFuZC9vciB0aGUgcmVsZXZhbnQgSmVyc2V5IG1vZHVsZSBBUEkuIEJlbGxvdyBhcmUgc2V2ZXJhbAorICAgICAgICAgICAgICAgICAgICBiYXNpYyBleGFtcGxlcyBob3cgdG8gY29uZmlndXJlIGNlcnRhaW4gb3B0aW9ucyB3aGVuIHVzaW5nIE1PWHkgd2l0aCBKZXJzZXkncworICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5Nb3h5SnNvbkNvbmZpZzwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgY2xhc3MuCisKKyAgICAgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzPkZvcm1hdGVkIG91dHB1dDwvZW1waGFzaXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPkplcnNleSZuYnNwOzE6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPkpTT05Db25maWd1cmF0aW9uLmNyZWF0ZUpTT05Db25maWd1cmF0aW9uV2l0aEZvcm1hdHRlZCgpPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT5KZXJzZXkmbmJzcDsyL01PWHk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPk1veHlKc29uQ29uZmlnLnNldEZvcm1hdHRlZE91dHB1dCgpPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5OYW1lc3BhY2VzIG1hcHBpbmc8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT5KZXJzZXkmbmJzcDsxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5KU09OQ29uZmlndXJhdGlvbi5uYXR1cmFsKCkueG1sMkpzb25OcygpPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT5KZXJzZXkmbmJzcDsyL01PWHk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPk1veHlKc29uQ29uZmlnLnNldE5hbWVzcGFjZVByZWZpeE1hcHBlcigpPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5OYW1lc3BhY2Ugc2VwYXJhdG9yPC9lbXBoYXNpcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+SmVyc2V5Jm5ic3A7MToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+SlNPTkNvbmZpZ3VyYXRpb24ubmF0dXJhbCgpLm5zU2VwYXJhdG9yKCk8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPkplcnNleSZuYnNwOzIvTU9YeToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+TW94eUpzb25Db25maWcuc2V0TmFtZXNwYWNlU2VwYXJhdG9yKCk8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisKKyAgICAgICAgICAgICAgICAgICAgUHJvcGVydGllcyBjYW4gYmUgYWxzbyBwYXNzZWQgZGlyZWN0bHkgdG8KKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+TWFyc2hhbGxlcjwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgYW5kL29yCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPlVubWFyc2hhbGxlcjwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgdXNpbmc6PGxpdGVyYWw+TW94eUpzb25Db25maWc8L2xpdGVyYWw+J3M8bGl0ZXJhbD5wcm9wZXJ0eSgpPC9saXRlcmFsPiwKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+bWFyc2hhbGxlclByb3BlcnR5KCk8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgIGFuZAorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD51bm1hcnNoYWxsZXJQcm9wZXJ0eSgpPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICBtZXRob2RzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIE1vcmUgb24gdGhlIEpTT04gU3VwcG9ydCB0b3BpYyBjYW4gYmUgZm91bmQgaW48eHJlZiBsaW5rZW5kPSJqc29uIi8+LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorPC9jaGFwdGVyPgpkaWZmIC0tZ2l0IGEvZG9jcy9zcmMvbWFpbi9kb2Nib29rL21vZHVsZXMueG1sIGIvZG9jcy9zcmMvbWFpbi9kb2Nib29rL21vZHVsZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZTk3MDYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3NyYy9tYWluL2RvY2Jvb2svbW9kdWxlcy54bWwKQEAgLTAsMCArMSwxNDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzwhRE9DVFlQRSBzZWN0aW9uIFs8IUVOVElUWSAlIGVudHMgU1lTVEVNICJqZXJzZXkuZW50Ij4gJWVudHM7XT4KKzxzZWN0aW9uIHhtbG5zPSJodHRwOi8vZG9jYm9vay5vcmcvbnMvZG9jYm9vayIKKyAgICAgICAgIHZlcnNpb249IjUuMCIKKyAgICAgICAgIHhtbDpsYW5nPSJlbiIKKyAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIKKyAgICAgICAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vZG9jYm9vay5vcmcvbnMvZG9jYm9vayBodHRwOi8vZG9jYm9vay5vcmcveG1sLzUuMC94c2QvZG9jYm9vay54c2QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayBodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rLnhzZCIKKyAgICAgICAgIHhtbDppZD0ibW9kdWxlcyI+CisgICAgPHRpdGxlPkxpc3Qgb2YgbW9kdWxlczwvdGl0bGU+CisKKyAgICA8cGFyYT5UaGUgZm9sbG93aW5nIGNoYXB0ZXJzIHByb3ZpZGUgYW4gb3ZlcnZpZXcgb2YgYWxsIEplcnNleSBtb2R1bGVzCisgICAgICAgIGFuZCB0aGVpciBkZXBlbmRlbmNpZXMgd2l0aCBsaW5rcyB0byB0aGUgcmVzcGVjdGl2ZSBiaW5hcmllcyAoZm9sbG93IGEgbGluaworICAgICAgICBvbiBhIG1vZHVsZSBuYW1lIHRvIGdldCBjb21wbGV0ZSBzZXQgb2YgZG93bmxvYWRhYmxlIGRlcGVuZGVuY2llcykuCisgICAgPC9wYXJhPgorICAgIDx0YWJsZSBwZ3dpZGU9IjEiIGZyYW1lPSdhbGwnIHhtbDppZD0iZGVwZW5kZW5jaWVzLXRhYmxlLW9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmUiPgorICAgIDx0aXRsZT5KZXJzZXkgQ29yZTwvdGl0bGU+CisgICAgPHRncm91cCBjb2xzPScyJyBhbGlnbj0nbGVmdCcgY29sc2VwPScxJyByb3dzZXA9JzEnPgorICAgICAgICA8Y29sc3BlYyBjb2xuYW1lPSdjMScgY29sd2lkdGg9IjIqIi8+CisgICAgICAgIDxjb2xzcGVjIGNvbG5hbWU9J2MzJyBjb2x3aWR0aD0iNyoiLz4KKyAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnkgbmFtZXN0PSJjMSIgbmFtZWVuZD0iYzMiIGFsaWduPSJjZW50ZXIiPkplcnNleSBDb3JlPC9lbnRyeT4KKyAgICAgICAgICAgIDwvcm93PgorICAgICAgICA8L3RoZWFkPgorICAgICAgICA8dGJvZHk+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L2plcnNleS1jbGllbnQvZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIGplcnNleS1jbGllbnQKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmVyc2V5IGNvcmUgY2xpZW50IGltcGxlbWVudGF0aW9uPC9lbnRyeT4KKzwvcm93PgorPHJvdz4KKzxlbnRyeT4KKzxsaW5rIHhsaW5rOmhyZWY9Imh0dHBzOi8vamVyc2V5LmdpdGh1Yi5pby9wcm9qZWN0LWluZm8vJnZlcnNpb247L2plcnNleS9qZXJzZXktY29tbW9uL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBqZXJzZXktY29tbW9uCis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5PkplcnNleSBjb3JlIGNvbW1vbiBwYWNrYWdlczwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvamVyc2V5LXNlcnZlci9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAgamVyc2V5LXNlcnZlcgorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5KZXJzZXkgY29yZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb248L2VudHJ5PgorPC9yb3c+CisgICAgICAgIDwvdGJvZHk+CisgICAgPC90Z3JvdXA+Cis8L3RhYmxlPgorPHRhYmxlIHBnd2lkZT0iMSIgZnJhbWU9J2FsbCcgeG1sOmlkPSJkZXBlbmRlbmNpZXMtdGFibGUtb3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVycyI+CisgICAgPHRpdGxlPkplcnNleSBDb250YWluZXJzPC90aXRsZT4KKyAgICA8dGdyb3VwIGNvbHM9JzInIGFsaWduPSdsZWZ0JyBjb2xzZXA9JzEnIHJvd3NlcD0nMSc+CisgICAgICAgIDxjb2xzcGVjIGNvbG5hbWU9J2MxJyBjb2x3aWR0aD0iMioiLz4KKyAgICAgICAgPGNvbHNwZWMgY29sbmFtZT0nYzMnIGNvbHdpZHRoPSI3KiIvPgorICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeSBuYW1lc3Q9ImMxIiBuYW1lZW5kPSJjMyIgYWxpZ249ImNlbnRlciI+SmVyc2V5IENvbnRhaW5lcnM8L2VudHJ5PgorICAgICAgICAgICAgPC9yb3c+CisgICAgICAgIDwvdGhlYWQ+CisgICAgICAgIDx0Ym9keT4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC9qZXJzZXktY29udGFpbmVyLWdyaXp6bHkyLWh0dHAvZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIGplcnNleS1jb250YWluZXItZ3JpenpseTItaHR0cAorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5Hcml6emx5IDIgSHR0cCBDb250YWluZXIuPC9lbnRyeT4KKzwvcm93PgorPHJvdz4KKzxlbnRyeT4KKzxsaW5rIHhsaW5rOmhyZWY9Imh0dHBzOi8vamVyc2V5LmdpdGh1Yi5pby9wcm9qZWN0LWluZm8vJnZlcnNpb247L2plcnNleS9wcm9qZWN0L2plcnNleS1jb250YWluZXItZ3JpenpseTItc2VydmxldC9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAgamVyc2V5LWNvbnRhaW5lci1ncml6emx5Mi1zZXJ2bGV0Cis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5PkdyaXp6bHkgMiBTZXJ2bGV0IENvbnRhaW5lci48L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3QvamVyc2V5LWNvbnRhaW5lci1qZGstaHR0cC9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAgamVyc2V5LWNvbnRhaW5lci1qZGstaHR0cAorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5KREsgSHR0cCBDb250YWluZXI8L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3QvamVyc2V5LWNvbnRhaW5lci1qZXR0eS1odHRwL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBqZXJzZXktY29udGFpbmVyLWpldHR5LWh0dHAKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmV0dHkgSHR0cCBDb250YWluZXI8L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3QvamVyc2V5LWNvbnRhaW5lci1qZXR0eS1zZXJ2bGV0L2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBqZXJzZXktY29udGFpbmVyLWpldHR5LXNlcnZsZXQKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmV0dHkgU2VydmxldCBDb250YWluZXI8L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3QvamVyc2V5LWNvbnRhaW5lci1uZXR0eS1odHRwL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBqZXJzZXktY29udGFpbmVyLW5ldHR5LWh0dHAKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+TmV0dHkgSHR0cCBDb250YWluZXIuPC9lbnRyeT4KKzwvcm93PgorPHJvdz4KKzxlbnRyeT4KKzxsaW5rIHhsaW5rOmhyZWY9Imh0dHBzOi8vamVyc2V5LmdpdGh1Yi5pby9wcm9qZWN0LWluZm8vJnZlcnNpb247L2plcnNleS9wcm9qZWN0L2plcnNleS1jb250YWluZXItc2VydmxldC9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAgamVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0Cis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5PkplcnNleSBjb3JlIFNlcnZsZXQgMy54IGltcGxlbWVudGF0aW9uPC9lbnRyeT4KKzwvcm93PgorPHJvdz4KKzxlbnRyeT4KKzxsaW5rIHhsaW5rOmhyZWY9Imh0dHBzOi8vamVyc2V5LmdpdGh1Yi5pby9wcm9qZWN0LWluZm8vJnZlcnNpb247L2plcnNleS9wcm9qZWN0L2plcnNleS1jb250YWluZXItc2VydmxldC1jb3JlL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBqZXJzZXktY29udGFpbmVyLXNlcnZsZXQtY29yZQorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5KZXJzZXkgY29yZSBTZXJ2bGV0IDIueCBpbXBsZW1lbnRhdGlvbjwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC9qZXJzZXktY29udGFpbmVyLXNpbXBsZS1odHRwL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBqZXJzZXktY29udGFpbmVyLXNpbXBsZS1odHRwCis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5PlNpbXBsZSBIdHRwIENvbnRhaW5lcjwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC9wcm9qZWN0L2plcnNleS1nZi1lamIvZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIGplcnNleS1nZi1lamIKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmVyc2V5IEVKQiBmb3IgR2xhc3NGaXNoIGludGVncmF0aW9uPC9lbnRyeT4KKzwvcm93PgorICAgICAgICA8L3Rib2R5PgorICAgIDwvdGdyb3VwPgorPC90YWJsZT4KKzx0YWJsZSBwZ3dpZGU9IjEiIGZyYW1lPSdhbGwnIHhtbDppZD0iZGVwZW5kZW5jaWVzLXRhYmxlLW9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbm5lY3RvcnMiPgorICAgIDx0aXRsZT5KZXJzZXkgQ29ubmVjdG9yczwvdGl0bGU+CisgICAgPHRncm91cCBjb2xzPScyJyBhbGlnbj0nbGVmdCcgY29sc2VwPScxJyByb3dzZXA9JzEnPgorICAgICAgICA8Y29sc3BlYyBjb2xuYW1lPSdjMScgY29sd2lkdGg9IjIqIi8+CisgICAgICAgIDxjb2xzcGVjIGNvbG5hbWU9J2MzJyBjb2x3aWR0aD0iNyoiLz4KKyAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnkgbmFtZXN0PSJjMSIgbmFtZWVuZD0iYzMiIGFsaWduPSJjZW50ZXIiPkplcnNleSBDb25uZWN0b3JzPC9lbnRyeT4KKyAgICAgICAgICAgIDwvcm93PgorICAgICAgICA8L3RoZWFkPgorICAgICAgICA8dGJvZHk+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3QvamVyc2V5LWFwYWNoZS1jb25uZWN0b3IvZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIGplcnNleS1hcGFjaGUtY29ubmVjdG9yCis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5PkplcnNleSBDbGllbnQgVHJhbnNwb3J0IHZpYSBBcGFjaGU8L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3QvamVyc2V5LWdyaXp6bHktY29ubmVjdG9yL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBqZXJzZXktZ3JpenpseS1jb25uZWN0b3IKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmVyc2V5IENsaWVudCBUcmFuc3BvcnQgdmlhIEdyaXp6bHk8L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3QvamVyc2V5LWpkay1jb25uZWN0b3IvZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIGplcnNleS1qZGstY29ubmVjdG9yCis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5PkplcnNleSBDbGllbnQgVHJhbnNwb3J0IHZpYSBKREsgY29ubmVjdG9yPC9lbnRyeT4KKzwvcm93PgorPHJvdz4KKzxlbnRyeT4KKzxsaW5rIHhsaW5rOmhyZWY9Imh0dHBzOi8vamVyc2V5LmdpdGh1Yi5pby9wcm9qZWN0LWluZm8vJnZlcnNpb247L2plcnNleS9wcm9qZWN0L2plcnNleS1qZXR0eS1jb25uZWN0b3IvZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIGplcnNleS1qZXR0eS1jb25uZWN0b3IKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmVyc2V5IENsaWVudCBUcmFuc3BvcnQgdmlhIEpldHR5PC9lbnRyeT4KKzwvcm93PgorPHJvdz4KKzxlbnRyeT4KKzxsaW5rIHhsaW5rOmhyZWY9Imh0dHBzOi8vamVyc2V5LmdpdGh1Yi5pby9wcm9qZWN0LWluZm8vJnZlcnNpb247L2plcnNleS9wcm9qZWN0L2plcnNleS1uZXR0eS1jb25uZWN0b3IvZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIGplcnNleS1uZXR0eS1jb25uZWN0b3IKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmVyc2V5IENsaWVudCBUcmFuc3BvcnQgdmlhIE5ldHR5PC9lbnRyeT4KKzwvcm93PgorICAgICAgICA8L3Rib2R5PgorICAgIDwvdGdyb3VwPgorPC90YWJsZT4KKzx0YWJsZSBwZ3dpZGU9IjEiIGZyYW1lPSdhbGwnIHhtbDppZD0iZGVwZW5kZW5jaWVzLXRhYmxlLW9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhIj4KKyAgICA8dGl0bGU+SmVyc2V5IE1lZGlhPC90aXRsZT4KKyAgICA8dGdyb3VwIGNvbHM9JzInIGFsaWduPSdsZWZ0JyBjb2xzZXA9JzEnIHJvd3NlcD0nMSc+CisgICAgICAgIDxjb2xzcGVjIGNvbG5hbWU9J2MxJyBjb2x3aWR0aD0iMioiLz4KKyAgICAgICAgPGNvbHNwZWMgY29sbmFtZT0nYzMnIGNvbHdpZHRoPSI3KiIvPgorICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeSBuYW1lc3Q9ImMxIiBuYW1lZW5kPSJjMyIgYWxpZ249ImNlbnRlciI+SmVyc2V5IE1lZGlhPC9lbnRyeT4KKyAgICAgICAgICAgIDwvcm93PgorICAgICAgICA8L3RoZWFkPgorICAgICAgICA8dGJvZHk+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3QvamVyc2V5LW1lZGlhLWpheGIvZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIGplcnNleS1tZWRpYS1qYXhiCis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5PkpBWC1SUyBmZWF0dXJlcyBiYXNlZCB1cG9uIEpBWC1CLjwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC9qZXJzZXktbWVkaWEtanNvbi1iaW5kaW5nL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBqZXJzZXktbWVkaWEtanNvbi1iaW5kaW5nCis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5PkplcnNleSBKU09OLUIgc3VwcG9ydCBtb2R1bGUuPC9lbnRyeT4KKzwvcm93PgorPHJvdz4KKzxlbnRyeT4KKzxsaW5rIHhsaW5rOmhyZWY9Imh0dHBzOi8vamVyc2V5LmdpdGh1Yi5pby9wcm9qZWN0LWluZm8vJnZlcnNpb247L2plcnNleS9wcm9qZWN0L2plcnNleS1tZWRpYS1qc29uLWphY2tzb24vZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIGplcnNleS1tZWRpYS1qc29uLWphY2tzb24KKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmVyc2V5IEpTT04gSmFja3NvbiAoMi54KSBlbnRpdHkgcHJvdmlkZXJzIHN1cHBvcnQgbW9kdWxlLjwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC9qZXJzZXktbWVkaWEtanNvbi1qYWNrc29uMS9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAgamVyc2V5LW1lZGlhLWpzb24tamFja3NvbjEKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmVyc2V5IEpTT04gSmFja3NvbiAoMS54KSBlbnRpdHkgcHJvdmlkZXJzIHN1cHBvcnQgbW9kdWxlLjwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC9qZXJzZXktbWVkaWEtanNvbi1qZXR0aXNvbi9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAgamVyc2V5LW1lZGlhLWpzb24tamV0dGlzb24KKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmVyc2V5IEpTT04gSmV0dGlzb24gZW50aXR5IHByb3ZpZGVycyBzdXBwb3J0IG1vZHVsZS48L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3QvamVyc2V5LW1lZGlhLWpzb24tcHJvY2Vzc2luZy9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAgamVyc2V5LW1lZGlhLWpzb24tcHJvY2Vzc2luZworPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5KZXJzZXkgSlNPTi1QIChKU1IgMzUzKSBlbnRpdHkgcHJvdmlkZXJzIHN1cHBvcnQgcHJveHkgbW9kdWxlLjwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC9qZXJzZXktbWVkaWEta3J5by9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAgamVyc2V5LW1lZGlhLWtyeW8KKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmVyc2V5L0pBWC1SUyBNZXNzYWdlIEJvZHkgV3JpdGVyIGFuZCBSZWFkZXIgdXNpbmcgS3J5byBzZXJpYWxpemF0aW9uIGZyYW1ld29yazwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC9qZXJzZXktbWVkaWEtbW94eS9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAgamVyc2V5LW1lZGlhLW1veHkKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmVyc2V5IEpTT04gZW50aXR5IHByb3ZpZGVycyBzdXBwb3J0IG1vZHVsZSBiYXNlZCBvbiBFY2xpcHNlTGluayBNT1h5LjwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC9qZXJzZXktbWVkaWEtbXVsdGlwYXJ0L2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBqZXJzZXktbWVkaWEtbXVsdGlwYXJ0Cis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5PkplcnNleSBNdWx0aXBhcnQgZW50aXR5IHByb3ZpZGVycyBzdXBwb3J0IG1vZHVsZS48L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3QvamVyc2V5LW1lZGlhLXNzZS9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAgamVyc2V5LW1lZGlhLXNzZQorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5KZXJzZXkgU2VydmVyIFNlbnQgRXZlbnRzIGVudGl0eSBwcm92aWRlcnMgc3VwcG9ydCBtb2R1bGUuPC9lbnRyeT4KKzwvcm93PgorICAgICAgICA8L3Rib2R5PgorICAgIDwvdGdyb3VwPgorPC90YWJsZT4KKzx0YWJsZSBwZ3dpZGU9IjEiIGZyYW1lPSdhbGwnIHhtbDppZD0iZGVwZW5kZW5jaWVzLXRhYmxlLW9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dCI+CisgICAgPHRpdGxlPkplcnNleSBFeHRlbnNpb25zPC90aXRsZT4KKyAgICA8dGdyb3VwIGNvbHM9JzInIGFsaWduPSdsZWZ0JyBjb2xzZXA9JzEnIHJvd3NlcD0nMSc+CisgICAgICAgIDxjb2xzcGVjIGNvbG5hbWU9J2MxJyBjb2x3aWR0aD0iMioiLz4KKyAgICAgICAgPGNvbHNwZWMgY29sbmFtZT0nYzMnIGNvbHdpZHRoPSI3KiIvPgorICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeSBuYW1lc3Q9ImMxIiBuYW1lZW5kPSJjMyIgYWxpZ249ImNlbnRlciI+SmVyc2V5IEV4dGVuc2lvbnM8L2VudHJ5PgorICAgICAgICAgICAgPC9yb3c+CisgICAgICAgIDwvdGhlYWQ+CisgICAgICAgIDx0Ym9keT4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC9qZXJzZXktYmVhbi12YWxpZGF0aW9uL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBqZXJzZXktYmVhbi12YWxpZGF0aW9uCis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5PkplcnNleSBleHRlbnNpb24gbW9kdWxlIHByb3ZpZGluZyBzdXBwb3J0IGZvciBCZWFuIFZhbGlkYXRpb24gKEpTUi0zNDkpIEFQSS48L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3QvcHJvamVjdC9qZXJzZXktY2RpMXgvZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIGplcnNleS1jZGkxeAorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5KZXJzZXkgQ0RJIDEuMSBpbnRlZ3JhdGlvbjwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC9wcm9qZWN0L2plcnNleS1jZGkxeC1iYW4tY3VzdG9tLWhrMi1iaW5kaW5nL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBqZXJzZXktY2RpMXgtYmFuLWN1c3RvbS1oazItYmluZGluZworPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5KZXJzZXkgQ0RJIGludGVncmF0aW9uIC0gdGhpcyBtb2R1bGUgZGlzYWJsZXMgY3VzdG9tIEhLMiBiaW5kaW5nczwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC9wcm9qZWN0L2plcnNleS1jZGkxeC1zZXJ2bGV0L2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBqZXJzZXktY2RpMXgtc2VydmxldAorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5KZXJzZXkgQ0RJIDEueCBTZXJ2bGV0IFN1cHBvcnQ8L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3QvcHJvamVjdC9qZXJzZXktY2RpMXgtdHJhbnNhY3Rpb24vZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIGplcnNleS1jZGkxeC10cmFuc2FjdGlvbgorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5KZXJzZXkgQ0RJIDEueCBUcmFuc2FjdGlvbmFsIFN1cHBvcnQ8L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3QvcHJvamVjdC9qZXJzZXktY2RpMXgtdmFsaWRhdGlvbi9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAgamVyc2V5LWNkaTF4LXZhbGlkYXRpb24KKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmVyc2V5IENESSAxLnggQmVhbiBWYWxpZGF0aW9uIFN1cHBvcnQ8L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3QvamVyc2V5LWRlY2xhcmF0aXZlLWxpbmtpbmcvZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIGplcnNleS1kZWNsYXJhdGl2ZS1saW5raW5nCis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5PkplcnNleSBzdXBwb3J0IGZvciBkZWNsYXJhdGl2ZSBoeXBlcmxpbmtpbmcuPC9lbnRyeT4KKzwvcm93PgorPHJvdz4KKzxlbnRyeT4KKzxsaW5rIHhsaW5rOmhyZWY9Imh0dHBzOi8vamVyc2V5LmdpdGh1Yi5pby9wcm9qZWN0LWluZm8vJnZlcnNpb247L2plcnNleS9wcm9qZWN0L2plcnNleS1lbnRpdHktZmlsdGVyaW5nL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBqZXJzZXktZW50aXR5LWZpbHRlcmluZworPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5KZXJzZXkgZXh0ZW5zaW9uIG1vZHVsZSBwcm92aWRpbmcgc3VwcG9ydCBmb3IgRW50aXR5IERhdGEgRmlsdGVyaW5nLjwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC9qZXJzZXktbWV0YWluZi1zZXJ2aWNlcy9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAgamVyc2V5LW1ldGFpbmYtc2VydmljZXMKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmVyc2V5IGV4dGVuc2lvbiBtb2R1bGUgZW5hYmxpbmcgYXV0b21hdGljIHJlZ2lzdHJhdGlvbiBvZiBKQVgtUlMgcHJvdmlkZXJzIChNQlcvTUJSL0VNKSB2aWEgTUVUQS1JTkYvc2VydmljZXMgbWVjaGFuaXNtLjwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC9qZXJzZXktbXZjL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBqZXJzZXktbXZjCis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5PkplcnNleSBleHRlbnNpb24gbW9kdWxlIHByb3ZpZGluZyBzdXBwb3J0IGZvciBNVkMuPC9lbnRyeT4KKzwvcm93PgorPHJvdz4KKzxlbnRyeT4KKzxsaW5rIHhsaW5rOmhyZWY9Imh0dHBzOi8vamVyc2V5LmdpdGh1Yi5pby9wcm9qZWN0LWluZm8vJnZlcnNpb247L2plcnNleS9wcm9qZWN0L2plcnNleS1tdmMtYmVhbi12YWxpZGF0aW9uL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBqZXJzZXktbXZjLWJlYW4tdmFsaWRhdGlvbgorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5KZXJzZXkgZXh0ZW5zaW9uIG1vZHVsZSBwcm92aWRpbmcgc3VwcG9ydCBmb3IgQmVhbiBWYWxpZGF0aW9uIGluIE1WQy48L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3QvamVyc2V5LW12Yy1mcmVlbWFya2VyL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBqZXJzZXktbXZjLWZyZWVtYXJrZXIKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmVyc2V5IGV4dGVuc2lvbiBtb2R1bGUgcHJvdmlkaW5nIHN1cHBvcnQgZm9yIEZyZWVtYXJrZXIgdGVtcGxhdGVzLjwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC9qZXJzZXktbXZjLWpzcC9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAgamVyc2V5LW12Yy1qc3AKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmVyc2V5IGV4dGVuc2lvbiBtb2R1bGUgcHJvdmlkaW5nIHN1cHBvcnQgZm9yIEpTUCB0ZW1wbGF0ZXMuPC9lbnRyeT4KKzwvcm93PgorPHJvdz4KKzxlbnRyeT4KKzxsaW5rIHhsaW5rOmhyZWY9Imh0dHBzOi8vamVyc2V5LmdpdGh1Yi5pby9wcm9qZWN0LWluZm8vJnZlcnNpb247L2plcnNleS9wcm9qZWN0L2plcnNleS1tdmMtbXVzdGFjaGUvZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIGplcnNleS1tdmMtbXVzdGFjaGUKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmVyc2V5IGV4dGVuc2lvbiBtb2R1bGUgcHJvdmlkaW5nIHN1cHBvcnQgZm9yIE11c3RhY2hlIHRlbXBsYXRlcy48L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3QvamVyc2V5LXByb3h5LWNsaWVudC9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAgamVyc2V5LXByb3h5LWNsaWVudAorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5KZXJzZXkgZXh0ZW5zaW9uIG1vZHVsZSBwcm92aWRpbmcgc3VwcG9ydCBmb3IgKHByb3h5LWJhc2VkKSBoaWdoLWxldmVsIGNsaWVudCBBUEkuPC9lbnRyeT4KKzwvcm93PgorPHJvdz4KKzxlbnRyeT4KKzxsaW5rIHhsaW5rOmhyZWY9Imh0dHBzOi8vamVyc2V5LmdpdGh1Yi5pby9wcm9qZWN0LWluZm8vJnZlcnNpb247L2plcnNleS9wcm9qZWN0L3Byb2plY3QvamVyc2V5LXJ4LWNsaWVudC1ndWF2YS9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAgamVyc2V5LXJ4LWNsaWVudC1ndWF2YQorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5KZXJzZXkgUmVhY3RpdmUgQ2xpZW50IC0gR3VhdmEgKExpc3RlbmFibGVGdXR1cmUpIHByb3ZpZGVyLjwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC9wcm9qZWN0L2plcnNleS1yeC1jbGllbnQtcnhqYXZhL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBqZXJzZXktcngtY2xpZW50LXJ4amF2YQorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5KZXJzZXkgUmVhY3RpdmUgQ2xpZW50IC0gUnhKYXZhIChPYnNlcnZhYmxlKSBwcm92aWRlci48L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3QvcHJvamVjdC9qZXJzZXktcngtY2xpZW50LXJ4amF2YTIvZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIGplcnNleS1yeC1jbGllbnQtcnhqYXZhMgorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5KZXJzZXkgUmVhY3RpdmUgQ2xpZW50IC0gUnhKYXZhMiAoRmxvd2FibGUpIHByb3ZpZGVyLjwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC9qZXJzZXktc2VydmxldC1wb3J0YWJpbGl0eS9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAgamVyc2V5LXNlcnZsZXQtcG9ydGFiaWxpdHkKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+TGlicmFyeSB0aGF0IGVuYWJsZXMgd3JpdGluZyB3ZWIgYXBwbGljYXRpb25zIHRoYXQgcnVuIHdpdGggYm90aCBKZXJzZXkgMS54IGFuZCBKZXJzZXkgMi54IHNlcnZsZXQgY29udGFpbmVycy48L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3QvamVyc2V5LXNwcmluZzQvZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIGplcnNleS1zcHJpbmc0Cis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5PkplcnNleSBleHRlbnNpb24gbW9kdWxlIHByb3ZpZGluZyBzdXBwb3J0IGZvciBTcHJpbmcgNCBpbnRlZ3JhdGlvbi48L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3QvamVyc2V5LXdhZGwtZG9jbGV0L2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBqZXJzZXktd2FkbC1kb2NsZXQKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+QSBkb2NsZXQgdGhhdCBnZW5lcmF0ZXMgYSByZXNvdXJjZWRvYyB4bWwgZmlsZTogdGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBqYXZhZG9jIGRvY3VtZW50YXRpb24KKyAgICAgICAgb2YgcmVzb3VyY2UgY2xhc3Nlcywgc28gdGhhdCB0aGlzIGNhbiBiZSB1c2VkIGZvciBleHRlbmRpbmcgZ2VuZXJhdGVkIHdhZGwgd2l0aCB1c2VmdWwKKyAgICAgICAgZG9jdW1lbnRhdGlvbi48L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3QvcHJvamVjdC9qZXJzZXktd2VsZDItc2UvZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIGplcnNleS13ZWxkMi1zZQorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5XRUxEIDIueCBTRSBzdXBwb3J0PC9lbnRyeT4KKzwvcm93PgorICAgICAgICA8L3Rib2R5PgorICAgIDwvdGdyb3VwPgorPC90YWJsZT4KKzx0YWJsZSBwZ3dpZGU9IjEiIGZyYW1lPSdhbGwnIHhtbDppZD0iZGVwZW5kZW5jaWVzLXRhYmxlLW9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrIj4KKyAgICA8dGl0bGU+SmVyc2V5IFRlc3QgRnJhbWV3b3JrPC90aXRsZT4KKyAgICA8dGdyb3VwIGNvbHM9JzInIGFsaWduPSdsZWZ0JyBjb2xzZXA9JzEnIHJvd3NlcD0nMSc+CisgICAgICAgIDxjb2xzcGVjIGNvbG5hbWU9J2MxJyBjb2x3aWR0aD0iMioiLz4KKyAgICAgICAgPGNvbHNwZWMgY29sbmFtZT0nYzMnIGNvbHdpZHRoPSI3KiIvPgorICAgICAgICA8dGhlYWQ+CisgICAgICAgICAgICA8cm93PgorICAgICAgICAgICAgICAgIDxlbnRyeSBuYW1lc3Q9ImMxIiBuYW1lZW5kPSJjMyIgYWxpZ249ImNlbnRlciI+SmVyc2V5IFRlc3QgRnJhbWV3b3JrPC9lbnRyeT4KKyAgICAgICAgICAgIDwvcm93PgorICAgICAgICA8L3RoZWFkPgorICAgICAgICA8dGJvZHk+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3QvcHJvamVjdC9jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbi9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAgY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4KKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+VGhlIGNvbnRhaW5lciBydW5uZXIgbWF2ZW4gcGx1Z2luIHByb3ZpZGVzIG1lYW5zIHRvIHN0YXJ0IGFuZCBzdG9wIGEgY29udGFpbmVyIChjdXJyZW50bHksIFdlYmxvZ2ljLCBUb21jYXQgYW5kIEdsYXNzZmlzaDQKKyAgICAgICAgYXJlIHN1cHBvcnRlZCkuIFRvIGRlcGxveSBhbiBhcHBsaWNhdGlvbiB0byB0aGlzIGNvbnRhaW5lciBvciB0byByZXBldGl0aXZlbHkgcmVkZXBsb3kgYW5kIHRlc3QgYW4gYXBwbGljYXRpb24gaW4gdGhlIGNvbnRhaW5lci48L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3QvcHJvamVjdC9jdXN0b20tZW5mb3JjZXItcnVsZXMvZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIGN1c3RvbS1lbmZvcmNlci1ydWxlcworPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5KZXJzZXkgdGVzdCBmcmFtZXdvcmsgTWF2ZW4gcHJvamVjdHM8L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3QvamVyc2V5LXRlc3QtZnJhbWV3b3JrLWNvcmUvZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIGplcnNleS10ZXN0LWZyYW1ld29yay1jb3JlCis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5PkplcnNleSBUZXN0IEZyYW1ld29yayBDb3JlPC9lbnRyeT4KKzwvcm93PgorPHJvdz4KKzxlbnRyeT4KKzxsaW5rIHhsaW5rOmhyZWY9Imh0dHBzOi8vamVyc2V5LmdpdGh1Yi5pby9wcm9qZWN0LWluZm8vJnZlcnNpb247L2plcnNleS9wcm9qZWN0L3Byb2plY3QvamVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZS9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAgamVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZQorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5KZXJzZXkgVGVzdCBGcmFtZXdvcmsgUHJvdmlkZXJzIEJ1bmRsZTwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC9wcm9qZWN0L2plcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbC9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAgamVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsCis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5PkplcnNleSBUZXN0IEZyYW1ld29yayAtIEV4dGVybmFsIGNvbnRhaW5lcjwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC9wcm9qZWN0L2plcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1ncml6emx5Mi9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAgamVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWdyaXp6bHkyCis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5PkplcnNleSBUZXN0IEZyYW1ld29yayAtIEdyaXp6bHkyIGNvbnRhaW5lcjwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC9wcm9qZWN0L2plcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1pbm1lbW9yeS9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAgamVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWlubWVtb3J5Cis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5PkplcnNleSBUZXN0IEZyYW1ld29yayAtIEluTWVtb3J5IGNvbnRhaW5lcjwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC9wcm9qZWN0L2plcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1qZGstaHR0cC9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAgamVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWpkay1odHRwCis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5PkplcnNleSBUZXN0IEZyYW1ld29yayAtIEpESyBIVFRQIGNvbnRhaW5lcjwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC9wcm9qZWN0L2plcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1qZXR0eS9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAgamVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWpldHR5Cis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5PkplcnNleSBUZXN0IEZyYW1ld29yayAtIEpldHR5IEhUVFAgY29udGFpbmVyPC9lbnRyeT4KKzwvcm93PgorPHJvdz4KKzxlbnRyeT4KKzxsaW5rIHhsaW5rOmhyZWY9Imh0dHBzOi8vamVyc2V5LmdpdGh1Yi5pby9wcm9qZWN0LWluZm8vJnZlcnNpb247L2plcnNleS9wcm9qZWN0L3Byb2plY3QvamVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLW5ldHR5L2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBqZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItbmV0dHkKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmVyc2V5IFRlc3QgRnJhbWV3b3JrIC0gTmV0dHkgY29udGFpbmVyPC9lbnRyeT4KKzwvcm93PgorPHJvdz4KKzxlbnRyeT4KKzxsaW5rIHhsaW5rOmhyZWY9Imh0dHBzOi8vamVyc2V5LmdpdGh1Yi5pby9wcm9qZWN0LWluZm8vJnZlcnNpb247L2plcnNleS9wcm9qZWN0L3Byb2plY3QvamVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLXNpbXBsZS9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAgamVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLXNpbXBsZQorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5KZXJzZXkgVGVzdCBGcmFtZXdvcmsgLSBTaW1wbGUgSFRUUCBjb250YWluZXI8L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3QvamVyc2V5LXRlc3QtZnJhbWV3b3JrLXV0aWwvZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIGplcnNleS10ZXN0LWZyYW1ld29yay11dGlsCis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5PkplcnNleSBUZXN0IEZyYW1ld29yayBVdGlsczwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC9tZW1sZWFrLXRlc3QtY29tbW9uL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBtZW1sZWFrLXRlc3QtY29tbW9uCis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5PkplcnNleSB0ZXN0IGZyYW1ld29yayB1bWJyZWxsYSBwcm9qZWN0PC9lbnRyeT4KKzwvcm93PgorICAgICAgICA8L3Rib2R5PgorICAgIDwvdGdyb3VwPgorPC90YWJsZT4KKzx0YWJsZSBwZ3dpZGU9IjEiIGZyYW1lPSdhbGwnIHhtbDppZD0iZGVwZW5kZW5jaWVzLXRhYmxlLW9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVycyI+CisgICAgPHRpdGxlPkplcnNleSBUZXN0IEZyYW1ld29yayBQcm92aWRlcnM8L3RpdGxlPgorICAgIDx0Z3JvdXAgY29scz0nMicgYWxpZ249J2xlZnQnIGNvbHNlcD0nMScgcm93c2VwPScxJz4KKyAgICAgICAgPGNvbHNwZWMgY29sbmFtZT0nYzEnIGNvbHdpZHRoPSIyKiIvPgorICAgICAgICA8Y29sc3BlYyBjb2xuYW1lPSdjMycgY29sd2lkdGg9IjcqIi8+CisgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5IG5hbWVzdD0iYzEiIG5hbWVlbmQ9ImMzIiBhbGlnbj0iY2VudGVyIj5KZXJzZXkgVGVzdCBGcmFtZXdvcmsgUHJvdmlkZXJzPC9lbnRyeT4KKyAgICAgICAgICAgIDwvcm93PgorICAgICAgICA8L3RoZWFkPgorICAgICAgICA8dGJvZHk+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3QvcHJvamVjdC9qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItYnVuZGxlL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBqZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItYnVuZGxlCis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5PkplcnNleSBUZXN0IEZyYW1ld29yayBQcm92aWRlcnMgQnVuZGxlPC9lbnRyeT4KKzwvcm93PgorPHJvdz4KKzxlbnRyeT4KKzxsaW5rIHhsaW5rOmhyZWY9Imh0dHBzOi8vamVyc2V5LmdpdGh1Yi5pby9wcm9qZWN0LWluZm8vJnZlcnNpb247L2plcnNleS9wcm9qZWN0L3Byb2plY3QvamVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBqZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWwKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmVyc2V5IFRlc3QgRnJhbWV3b3JrIC0gRXh0ZXJuYWwgY29udGFpbmVyPC9lbnRyeT4KKzwvcm93PgorPHJvdz4KKzxlbnRyeT4KKzxsaW5rIHhsaW5rOmhyZWY9Imh0dHBzOi8vamVyc2V5LmdpdGh1Yi5pby9wcm9qZWN0LWluZm8vJnZlcnNpb247L2plcnNleS9wcm9qZWN0L3Byb2plY3QvamVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWdyaXp6bHkyL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBqZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZ3JpenpseTIKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmVyc2V5IFRlc3QgRnJhbWV3b3JrIC0gR3JpenpseTIgY29udGFpbmVyPC9lbnRyeT4KKzwvcm93PgorPHJvdz4KKzxlbnRyeT4KKzxsaW5rIHhsaW5rOmhyZWY9Imh0dHBzOi8vamVyc2V5LmdpdGh1Yi5pby9wcm9qZWN0LWluZm8vJnZlcnNpb247L2plcnNleS9wcm9qZWN0L3Byb2plY3QvamVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWlubWVtb3J5L2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBqZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItaW5tZW1vcnkKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmVyc2V5IFRlc3QgRnJhbWV3b3JrIC0gSW5NZW1vcnkgY29udGFpbmVyPC9lbnRyeT4KKzwvcm93PgorPHJvdz4KKzxlbnRyeT4KKzxsaW5rIHhsaW5rOmhyZWY9Imh0dHBzOi8vamVyc2V5LmdpdGh1Yi5pby9wcm9qZWN0LWluZm8vJnZlcnNpb247L2plcnNleS9wcm9qZWN0L3Byb2plY3QvamVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWpkay1odHRwL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBqZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItamRrLWh0dHAKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmVyc2V5IFRlc3QgRnJhbWV3b3JrIC0gSkRLIEhUVFAgY29udGFpbmVyPC9lbnRyeT4KKzwvcm93PgorPHJvdz4KKzxlbnRyeT4KKzxsaW5rIHhsaW5rOmhyZWY9Imh0dHBzOi8vamVyc2V5LmdpdGh1Yi5pby9wcm9qZWN0LWluZm8vJnZlcnNpb247L2plcnNleS9wcm9qZWN0L3Byb2plY3QvamVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWpldHR5L2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBqZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItamV0dHkKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmVyc2V5IFRlc3QgRnJhbWV3b3JrIC0gSmV0dHkgSFRUUCBjb250YWluZXI8L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3QvcHJvamVjdC9qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItbmV0dHkvZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIGplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1uZXR0eQorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5KZXJzZXkgVGVzdCBGcmFtZXdvcmsgLSBOZXR0eSBjb250YWluZXI8L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3QvcHJvamVjdC9qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItc2ltcGxlL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBqZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItc2ltcGxlCis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5PkplcnNleSBUZXN0IEZyYW1ld29yayAtIFNpbXBsZSBIVFRQIGNvbnRhaW5lcjwvZW50cnk+Cis8L3Jvdz4KKyAgICAgICAgPC90Ym9keT4KKyAgICA8L3Rncm91cD4KKzwvdGFibGU+Cis8dGFibGUgcGd3aWRlPSIxIiBmcmFtZT0nYWxsJyB4bWw6aWQ9ImRlcGVuZGVuY2llcy10YWJsZS1vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzLmdsYXNzZmlzaCI+CisgICAgPHRpdGxlPkplcnNleSBHbGFzc2Zpc2ggQnVuZGxlczwvdGl0bGU+CisgICAgPHRncm91cCBjb2xzPScyJyBhbGlnbj0nbGVmdCcgY29sc2VwPScxJyByb3dzZXA9JzEnPgorICAgICAgICA8Y29sc3BlYyBjb2xuYW1lPSdjMScgY29sd2lkdGg9IjIqIi8+CisgICAgICAgIDxjb2xzcGVjIGNvbG5hbWU9J2MzJyBjb2x3aWR0aD0iNyoiLz4KKyAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnkgbmFtZXN0PSJjMSIgbmFtZWVuZD0iYzMiIGFsaWduPSJjZW50ZXIiPkplcnNleSBHbGFzc2Zpc2ggQnVuZGxlczwvZW50cnk+CisgICAgICAgICAgICA8L3Jvdz4KKyAgICAgICAgPC90aGVhZD4KKyAgICAgICAgPHRib2R5PgorPHJvdz4KKzxlbnRyeT4KKzxsaW5rIHhsaW5rOmhyZWY9Imh0dHBzOi8vamVyc2V5LmdpdGh1Yi5pby9wcm9qZWN0LWluZm8vJnZlcnNpb247L2plcnNleS9wcm9qZWN0L3Byb2plY3QvamVyc2V5LWdmLWVqYi9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAgamVyc2V5LWdmLWVqYgorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5KZXJzZXkgRUpCIGZvciBHbGFzc0Zpc2ggaW50ZWdyYXRpb248L2VudHJ5PgorPC9yb3c+CisgICAgICAgIDwvdGJvZHk+CisgICAgPC90Z3JvdXA+Cis8L3RhYmxlPgorPHRhYmxlIHBnd2lkZT0iMSIgZnJhbWU9J2FsbCcgeG1sOmlkPSJkZXBlbmRlbmNpZXMtdGFibGUtb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VjdXJpdHkiPgorICAgIDx0aXRsZT5TZWN1cml0eTwvdGl0bGU+CisgICAgPHRncm91cCBjb2xzPScyJyBhbGlnbj0nbGVmdCcgY29sc2VwPScxJyByb3dzZXA9JzEnPgorICAgICAgICA8Y29sc3BlYyBjb2xuYW1lPSdjMScgY29sd2lkdGg9IjIqIi8+CisgICAgICAgIDxjb2xzcGVjIGNvbG5hbWU9J2MzJyBjb2x3aWR0aD0iNyoiLz4KKyAgICAgICAgPHRoZWFkPgorICAgICAgICAgICAgPHJvdz4KKyAgICAgICAgICAgICAgICA8ZW50cnkgbmFtZXN0PSJjMSIgbmFtZWVuZD0iYzMiIGFsaWduPSJjZW50ZXIiPlNlY3VyaXR5PC9lbnRyeT4KKyAgICAgICAgICAgIDwvcm93PgorICAgICAgICA8L3RoZWFkPgorICAgICAgICA8dGJvZHk+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3Qvb2F1dGgxLWNsaWVudC9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAgb2F1dGgxLWNsaWVudAorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5Nb2R1bGUgdGhhdCBhZGRzIGFuIE9BdXRoIDEgc3VwcG9ydCB0byBKZXJzZXkgY2xpZW50LjwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC9vYXV0aDEtc2VydmVyL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBvYXV0aDEtc2VydmVyCis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5Pk1vZHVsZSB0aGF0IGFkZHMgYW4gT0F1dGggMSBzdXBwb3J0IHRvIEplcnNleSBzZXJ2ZXI8L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3Qvb2F1dGgxLXNpZ25hdHVyZS9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAgb2F1dGgxLXNpZ25hdHVyZQorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5PQXV0aDEgc2lnbmF0dXJlIG1vZHVsZTwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC9vYXV0aDItY2xpZW50L2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBvYXV0aDItY2xpZW50Cis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5Pk1vZHVsZSB0aGF0IGFkZHMgYW4gT0F1dGggMiBzdXBwb3J0IHRvIEplcnNleSBjbGllbnQ8L2VudHJ5PgorPC9yb3c+CisgICAgICAgIDwvdGJvZHk+CisgICAgPC90Z3JvdXA+Cis8L3RhYmxlPgorPHRhYmxlIHBnd2lkZT0iMSIgZnJhbWU9J2FsbCcgeG1sOmlkPSJkZXBlbmRlbmNpZXMtdGFibGUtb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMiPgorICAgIDx0aXRsZT5KZXJzZXkgRXhhbXBsZXM8L3RpdGxlPgorICAgIDx0Z3JvdXAgY29scz0nMicgYWxpZ249J2xlZnQnIGNvbHNlcD0nMScgcm93c2VwPScxJz4KKyAgICAgICAgPGNvbHNwZWMgY29sbmFtZT0nYzEnIGNvbHdpZHRoPSIyKiIvPgorICAgICAgICA8Y29sc3BlYyBjb2xuYW1lPSdjMycgY29sd2lkdGg9IjcqIi8+CisgICAgICAgIDx0aGVhZD4KKyAgICAgICAgICAgIDxyb3c+CisgICAgICAgICAgICAgICAgPGVudHJ5IG5hbWVzdD0iYzEiIG5hbWVlbmQ9ImMzIiBhbGlnbj0iY2VudGVyIj5KZXJzZXkgRXhhbXBsZXM8L2VudHJ5PgorICAgICAgICAgICAgPC9yb3c+CisgICAgICAgIDwvdGhlYWQ+CisgICAgICAgIDx0Ym9keT4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC9vc2dpLWhlbGxvd29ybGQtd2ViYXBwL2FkZGl0aW9uYWwtYnVuZGxlL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBhZGRpdGlvbmFsLWJ1bmRsZQorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5PU0dpIEhlbGxvd29ybGQgV2ViYXBwIC0gYWRkaXRpb25hbCBidW5kbGU8L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3Qvb3NnaS1oZWxsb3dvcmxkLXdlYmFwcC9hbHRlcm5hdGUtdmVyc2lvbi1idW5kbGUvZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIGFsdGVybmF0ZS12ZXJzaW9uLWJ1bmRsZQorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5PU0dpIEhlbGxvd29ybGQgV2ViYXBwIC0gYWx0ZXJuYXRlIHZlcnNpb24gYnVuZGxlPC9lbnRyeT4KKzwvcm93PgorPHJvdz4KKzxlbnRyeT4KKzxsaW5rIHhsaW5rOmhyZWY9Imh0dHBzOi8vamVyc2V5LmdpdGh1Yi5pby9wcm9qZWN0LWluZm8vJnZlcnNpb247L2plcnNleS9wcm9qZWN0L2Fzc2VtYmxpZXMvZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIGFzc2VtYmxpZXMKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmVyc2V5IGV4YW1wbGVzIHNoYXJlZCBhc3NlbWJseSB0eXBlcy48L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3Qvd2ViYXBwLWV4YW1wbGUtcGFyZW50L2JlYW4tdmFsaWRhdGlvbi13ZWJhcHAvZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIGJlYW4tdmFsaWRhdGlvbi13ZWJhcHAKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmVyc2V5IEJlYW4gVmFsaWRhdGlvbiAoSlNSLTM0OSkgZXhhbXBsZS48L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3Qvd2ViYXBwLWV4YW1wbGUtcGFyZW50L2Jvb2ttYXJrL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBib29rbWFyaworPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5KZXJzZXkgQm9va21hcmsgZXhhbXBsZS48L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3Qvd2ViYXBwLWV4YW1wbGUtcGFyZW50L2Jvb2ttYXJrLWVtL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBib29rbWFyay1lbQorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5KZXJzZXkgQm9va21hcmsgZXhhbXBsZSB1c2luZyBFbnRpdHlNYW5hZ2VyLjwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC93ZWJhcHAtZXhhbXBsZS1wYXJlbnQvYm9va3N0b3JlLXdlYmFwcC9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAgYm9va3N0b3JlLXdlYmFwcAorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5KZXJzZXkgTVZDIEJvb2tzdG9yZSBleGFtcGxlLjwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC9vc2dpLWh0dHAtc2VydmljZS9idW5kbGUvZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIGJ1bmRsZQorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5PU0dpIEh0dHBTZXJ2aWNlIGV4YW1wbGUgYnVuZGxlPC9lbnRyeT4KKzwvcm93PgorPHJvdz4KKzxlbnRyeT4KKzxsaW5rIHhsaW5rOmhyZWY9Imh0dHBzOi8vamVyc2V5LmdpdGh1Yi5pby9wcm9qZWN0LWluZm8vJnZlcnNpb247L2plcnNleS9wcm9qZWN0L3dlYmFwcC1leGFtcGxlLXBhcmVudC9jZGktd2ViYXBwL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBjZGktd2ViYXBwCis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5PkplcnNleSBDREkgZXhhbXBsZS48L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3QvY2xpcGJvYXJkL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBjbGlwYm9hcmQKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmVyc2V5IGNsaXBib2FyZCBleGFtcGxlLjwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC9jbGlwYm9hcmQtcHJvZ3JhbW1hdGljL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBjbGlwYm9hcmQtcHJvZ3JhbW1hdGljCis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5PkplcnNleSBwcm9ncmFtbWF0aWMgcmVzb3VyY2UgQVBJIGNsaXBib2FyZCBleGFtcGxlLjwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC9kZWNsYXJhdGl2ZS1saW5raW5nL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBkZWNsYXJhdGl2ZS1saW5raW5nCis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5PkRlY2xhcmF0aXZlIEh5cGVybGlua2luZyAtIEplcnNleSBTYW1wbGU8L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3QvZW50aXR5LWZpbHRlcmluZy9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAgZW50aXR5LWZpbHRlcmluZworPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5KZXJzZXkgRW50aXR5IERhdGEgRmlsdGVyaW5nIEV4YW1wbGUuPC9lbnRyeT4KKzwvcm93PgorPHJvdz4KKzxlbnRyeT4KKzxsaW5rIHhsaW5rOmhyZWY9Imh0dHBzOi8vamVyc2V5LmdpdGh1Yi5pby9wcm9qZWN0LWluZm8vJnZlcnNpb247L2plcnNleS9wcm9qZWN0L2VudGl0eS1maWx0ZXJpbmctc2VjdXJpdHkvZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIGVudGl0eS1maWx0ZXJpbmctc2VjdXJpdHkKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmVyc2V5IEVudGl0eSBEYXRhIEZpbHRlcmluZyBTZWN1cml0eSBFeGFtcGxlLjwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC9lbnRpdHktZmlsdGVyaW5nLXNlbGVjdGFibGUvZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIGVudGl0eS1maWx0ZXJpbmctc2VsZWN0YWJsZQorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5KZXJzZXkgRW50aXR5IERhdGEgRmlsdGVyaW5nIFNlbGVjdGFibGUgRXhhbXBsZS48L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3QvZXhjZXB0aW9uLW1hcHBpbmcvZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIGV4Y2VwdGlvbi1tYXBwaW5nCis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5PkplcnNleSBleGFtcGxlIHNob3dpbmcgZXhjZXB0aW9uIG1hcHBlcnMgaW4gYWN0aW9uLjwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC93ZWJhcHAtZXhhbXBsZS1wYXJlbnQvZXh0ZW5kZWQtd2FkbC13ZWJhcHAvZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIGV4dGVuZGVkLXdhZGwtd2ViYXBwCis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5PkV4dGVuZGVkIFdBREwgZXhhbXBsZS48L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3Qvd2ViYXBwLWV4YW1wbGUtcGFyZW50L2ZlZWQtY29tYmluZXItamF2YTgtd2ViYXBwL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBmZWVkLWNvbWJpbmVyLWphdmE4LXdlYmFwcAorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5KZXJzZXkgV2ViIEFwcGxpY2F0aW9uIChTZXJ2bGV0KSBleGFtcGxlcyBwYXJlbnQgUE9NLjwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC93ZWJhcHAtZXhhbXBsZS1wYXJlbnQvZmxpZ2h0LW1hbmFnZW1lbnQtd2ViYXBwL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBmbGlnaHQtbWFuYWdlbWVudC13ZWJhcHAKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmVyc2V5IEZsaWdodCBNYW5hZ2VtZW50IERlbW8gV2ViIEFwcGxpY2F0aW9uIEV4YW1wbGU8L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3Qvd2ViYXBwLWV4YW1wbGUtcGFyZW50L2ZyZWVtYXJrZXItd2ViYXBwL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBmcmVlbWFya2VyLXdlYmFwcAorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5KZXJzZXkgRnJlZW1hcmtlciBleGFtcGxlLjwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC9vc2dpLWhlbGxvd29ybGQtd2ViYXBwL2Z1bmN0aW9uYWwtdGVzdC9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAgZnVuY3Rpb25hbC10ZXN0Cis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5PkplcnNleSBleGFtcGxlczwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC9vc2dpLWh0dHAtc2VydmljZS9mdW5jdGlvbmFsLXRlc3QvZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIGZ1bmN0aW9uYWwtdGVzdAorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5PU0dpIEh0dHBTZXJ2aWNlIGV4YW1wbGU8L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3QvZ3Jvb3Z5L2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBncm9vdnkKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+R3Jvb3Z5IEplcnNleTwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC9oZWxsb3dvcmxkL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBoZWxsb3dvcmxkCis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5PkplcnNleSBhbm5vdGF0ZWQgcmVzb3VyY2UgY2xhc3MgIkhlbGxvIHdvcmxkIiBleGFtcGxlLjwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC9oZWxsb3dvcmxkLWJlbmNobWFyay9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAgaGVsbG93b3JsZC1iZW5jaG1hcmsKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmVyc2V5ICJIZWxsbyBXb3JsZCIgYmVuY2htYXJrIGV4YW1wbGUuPC9lbnRyeT4KKzwvcm93PgorPHJvdz4KKzxlbnRyeT4KKzxsaW5rIHhsaW5rOmhyZWY9Imh0dHBzOi8vamVyc2V5LmdpdGh1Yi5pby9wcm9qZWN0LWluZm8vJnZlcnNpb247L2plcnNleS9wcm9qZWN0L2hlbGxvd29ybGQtY2RpMi1zZS9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAgaGVsbG93b3JsZC1jZGkyLXNlCis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5PkplcnNleSAiSGVsbG8gd29ybGQiIGV4YW1wbGUgd2l0aCBDREkgMiBTRS48L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3QvaGVsbG93b3JsZC1uZXR0eS9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAgaGVsbG93b3JsZC1uZXR0eQorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5KZXJzZXkgIkhlbGxvIHdvcmxkIiBleGFtcGxlIG9uIE5ldHR5IGNvbnRhaW5lci48L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3QvaGVsbG93b3JsZC1wcm9ncmFtbWF0aWMvZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIGhlbGxvd29ybGQtcHJvZ3JhbW1hdGljCis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5PkplcnNleSBwcm9ncmFtbWF0aWMgcmVzb3VyY2UgQVBJICJIZWxsbyB3b3JsZCIgZXhhbXBsZS48L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3QvaGVsbG93b3JsZC1wdXJlLWpheC1ycy9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAgaGVsbG93b3JsZC1wdXJlLWpheC1ycworPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5FeGFtcGxlIHVzaW5nIG9ubHkgdGhlIHN0YW5kYXJkIEpBWC1SUyBBUEkncyBhbmQgdGhlIGxpZ2h0d2VpZ2h0IEhUVFAgc2VydmVyIGJ1bmRsZWQgaW4gSkRLLjwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC9oZWxsb3dvcmxkLXNwcmluZy1hbm5vdGF0aW9ucy9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAgaGVsbG93b3JsZC1zcHJpbmctYW5ub3RhdGlvbnMKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+U3ByaW5nIDQgSW50ZWdyYXRpb24gSmVyc2V5IEV4YW1wbGU8L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3QvaGVsbG93b3JsZC1zcHJpbmctd2ViYXBwL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBoZWxsb3dvcmxkLXNwcmluZy13ZWJhcHAKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+U3ByaW5nIDQgSW50ZWdyYXRpb24gSmVyc2V5IEV4YW1wbGU8L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3Qvd2ViYXBwLWV4YW1wbGUtcGFyZW50L2hlbGxvd29ybGQtd2ViYXBwL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBoZWxsb3dvcmxkLXdlYmFwcAorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5KZXJzZXkgYW5ub3RhdGVkIHJlc291cmNlIGNsYXNzICJIZWxsbyB3b3JsZCIgZXhhbXBsZS48L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3QvaGVsbG93b3JsZC13ZWxkL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBoZWxsb3dvcmxkLXdlbGQKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmVyc2V5IGFubm90YXRlZCByZXNvdXJjZSBjbGFzcyAiSGVsbG8gd29ybGQiIGV4YW1wbGUgd2l0aCBXZWxkIHN1cHBvcnQuPC9lbnRyeT4KKzwvcm93PgorPHJvdz4KKzxlbnRyeT4KKzxsaW5rIHhsaW5rOmhyZWY9Imh0dHBzOi8vamVyc2V5LmdpdGh1Yi5pby9wcm9qZWN0LWluZm8vJnZlcnNpb247L2plcnNleS9wcm9qZWN0L2h0dHAtcGF0Y2gvZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIGh0dHAtcGF0Y2gKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmVyc2V5IGV4YW1wbGUgZm9yIGltcGxlbWVudGluZyBnZW5lcmljIFBBVENIIHN1cHBvcnQgdmlhIEpBWC1SUyByZWFkZXIgaW50ZXJjZXB0b3IuCisgICAgICAgIFRha2VuIGZyb20gR2VyYXJkIERhdmlzb24ncyBibG9nIGVudHJ5OgorICAgICAgICBodHRwOi8va2luZ3NmbGVldC5ibG9nc3BvdC5jby51ay8yMDE0LzAyL3RyYW5zcGFyZW50LXBhdGNoLXN1cHBvcnQtaW4tamF4LXJzLTIwLmh0bWw8L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3QvaHR0cC10cmFjZS9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAgaHR0cC10cmFjZQorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5KZXJzZXkgSFRUUCBUUkFDRSBzdXBwb3J0IGV4YW1wbGUuPC9lbnRyeT4KKzwvcm93PgorPHJvdz4KKzxlbnRyeT4KKzxsaW5rIHhsaW5rOmhyZWY9Imh0dHBzOi8vamVyc2V5LmdpdGh1Yi5pby9wcm9qZWN0LWluZm8vJnZlcnNpb247L2plcnNleS9wcm9qZWN0L2h0dHBzLWNsaWVudHNlcnZlci1ncml6emx5L2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBodHRwcy1jbGllbnRzZXJ2ZXItZ3JpenpseQorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5KZXJzZXkgSFRUUFMgQ2xpZW50L1NlcnZlciBleGFtcGxlIG9uIEdyaXp6bHkuPC9lbnRyeT4KKzwvcm93PgorPHJvdz4KKzxlbnRyeT4KKzxsaW5rIHhsaW5rOmhyZWY9Imh0dHBzOi8vamVyc2V5LmdpdGh1Yi5pby9wcm9qZWN0LWluZm8vJnZlcnNpb247L2plcnNleS9wcm9qZWN0L3dlYmFwcC1leGFtcGxlLXBhcmVudC9odHRwcy1zZXJ2ZXItZ2xhc3NmaXNoL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBodHRwcy1zZXJ2ZXItZ2xhc3NmaXNoCis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5PkplcnNleSBIVFRQUyBzZXJ2ZXIgb24gR2xhc3NGaXNoIGV4YW1wbGUuPC9lbnRyeT4KKzwvcm93PgorPHJvdz4KKzxlbnRyeT4KKzxsaW5rIHhsaW5rOmhyZWY9Imh0dHBzOi8vamVyc2V5LmdpdGh1Yi5pby9wcm9qZWN0LWluZm8vJnZlcnNpb247L2plcnNleS9wcm9qZWN0L3dlYmFwcC1leGFtcGxlLXBhcmVudC9qYXZhOC13ZWJhcHAvZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIGphdmE4LXdlYmFwcAorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5KYXZhIDggVHlwZXMgV2ViQXBwIEV4YW1wbGUuPC9lbnRyeT4KKzwvcm93PgorPHJvdz4KKzxlbnRyeT4KKzxsaW5rIHhsaW5rOmhyZWY9Imh0dHBzOi8vamVyc2V5LmdpdGh1Yi5pby9wcm9qZWN0LWluZm8vJnZlcnNpb247L2plcnNleS9wcm9qZWN0L2pheGIvZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIGpheGIKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmVyc2V5IEpBWEIgZXhhbXBsZS48L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3QvamF4cnMtdHlwZXMtaW5qZWN0aW9uL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBqYXhycy10eXBlcy1pbmplY3Rpb24KKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmVyc2V5IEpBWC1SUyB0eXBlcyBpbmplY3Rpb24gZXhhbXBsZS48L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3Qvd2ViYXBwLWV4YW1wbGUtcGFyZW50L2plcnNleS1lamIvZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIGplcnNleS1lamIKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmVyc2V5IFdlYiBBcHBsaWNhdGlvbiAoU2VydmxldCkgZXhhbXBsZXMgcGFyZW50IFBPTS48L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3QvanNvbi1iaW5kaW5nLXdlYmFwcC9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAganNvbi1iaW5kaW5nLXdlYmFwcAorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5KZXJzZXkgSlNPTiBCaW5kaW5nIGV4YW1wbGUuPC9lbnRyeT4KKzwvcm93PgorPHJvdz4KKzxlbnRyeT4KKzxsaW5rIHhsaW5rOmhyZWY9Imh0dHBzOi8vamVyc2V5LmdpdGh1Yi5pby9wcm9qZWN0LWluZm8vJnZlcnNpb247L2plcnNleS9wcm9qZWN0L2pzb24tamFja3Nvbi9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAganNvbi1qYWNrc29uCis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5PkplcnNleSBKU09OIHdpdGggSmFja3NvbiBleGFtcGxlLjwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC9qc29uLWphY2tzb24xL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBqc29uLWphY2tzb24xCis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5PkplcnNleSBKU09OIHdpdGggSmFja3NvbiAxLnggZXhhbXBsZS48L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3QvanNvbi1qZXR0aXNvbi9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAganNvbi1qZXR0aXNvbgorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5KZXJzZXkgSlNPTiB3aXRoIEpldHRpc29uIEpBWEIgZXhhbXBsZS48L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3QvanNvbi1tb3h5L2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBqc29uLW1veHkKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmVyc2V5IEpTT04gd2l0aCBNT1h5IGV4YW1wbGUuPC9lbnRyeT4KKzwvcm93PgorPHJvdz4KKzxlbnRyeT4KKzxsaW5rIHhsaW5rOmhyZWY9Imh0dHBzOi8vamVyc2V5LmdpdGh1Yi5pby9wcm9qZWN0LWluZm8vJnZlcnNpb247L2plcnNleS9wcm9qZWN0L3dlYmFwcC1leGFtcGxlLXBhcmVudC9qc29uLXByb2Nlc3Npbmctd2ViYXBwL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBqc29uLXByb2Nlc3Npbmctd2ViYXBwCis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5PkplcnNleSBKU09OLVAgKEpTUiAzNTMpIGV4YW1wbGUuPC9lbnRyeT4KKzwvcm93PgorPHJvdz4KKzxlbnRyeT4KKzxsaW5rIHhsaW5rOmhyZWY9Imh0dHBzOi8vamVyc2V5LmdpdGh1Yi5pby9wcm9qZWN0LWluZm8vJnZlcnNpb247L2plcnNleS9wcm9qZWN0L2pzb24td2l0aC1wYWRkaW5nL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBqc29uLXdpdGgtcGFkZGluZworPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5KZXJzZXkgSlNPTiB3aXRoIFBhZGRpbmcgZXhhbXBsZS48L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3Qvb3NnaS1oZWxsb3dvcmxkLXdlYmFwcC9saWItYnVuZGxlL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBsaWItYnVuZGxlCis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5Pk9TR2kgSGVsbG93b3JsZCBXZWJhcHAgLSBsaWIgYnVuZGxlPC9lbnRyeT4KKzwvcm93PgorPHJvdz4KKzxlbnRyeT4KKzxsaW5rIHhsaW5rOmhyZWY9Imh0dHBzOi8vamVyc2V5LmdpdGh1Yi5pby9wcm9qZWN0LWluZm8vJnZlcnNpb247L2plcnNleS9wcm9qZWN0L3dlYmFwcC1leGFtcGxlLXBhcmVudC9tYW5hZ2VkLWJlYW5zLXdlYmFwcC9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAgbWFuYWdlZC1iZWFucy13ZWJhcHAKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmVyc2V5IE1hbmFnZWQgQmVhbnMgV2ViIEFwcGxpY2F0aW9uIEV4YW1wbGUuPC9lbnRyeT4KKzwvcm93PgorPHJvdz4KKzxlbnRyeT4KKzxsaW5rIHhsaW5rOmhyZWY9Imh0dHBzOi8vamVyc2V5LmdpdGh1Yi5pby9wcm9qZWN0LWluZm8vJnZlcnNpb247L2plcnNleS9wcm9qZWN0L21hbmFnZWQtY2xpZW50L2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBtYW5hZ2VkLWNsaWVudAorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5KZXJzZXkgbWFuYWdlZCBjbGllbnQgZXhhbXBsZS48L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3Qvd2ViYXBwLWV4YW1wbGUtcGFyZW50L21hbmFnZWQtY2xpZW50LXNpbXBsZS13ZWJhcHAvZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIG1hbmFnZWQtY2xpZW50LXNpbXBsZS13ZWJhcHAKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmVyc2V5IFdlYiBBcHBsaWNhdGlvbiAoU2VydmxldCkgZXhhbXBsZXMgcGFyZW50IFBPTS48L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3Qvd2ViYXBwLWV4YW1wbGUtcGFyZW50L21hbmFnZWQtY2xpZW50LXdlYmFwcC9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAgbWFuYWdlZC1jbGllbnQtd2ViYXBwCis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5PkplcnNleSBtYW5hZ2VkIGNsaWVudCB3ZWIgYXBwbGljYXRpb24gZXhhbXBsZS48L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3Qvd2ViYXBwLWV4YW1wbGUtcGFyZW50L21vbml0b3Jpbmctd2ViYXBwL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBtb25pdG9yaW5nLXdlYmFwcAorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5KZXJzZXkgV2ViIEFwcGxpY2F0aW9uIChTZXJ2bGV0KSBleGFtcGxlcyBwYXJlbnQgUE9NLjwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC93ZWJhcHAtZXhhbXBsZS1wYXJlbnQvbXVsdGlwYXJ0LXdlYmFwcC9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAgbXVsdGlwYXJ0LXdlYmFwcAorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5KZXJzZXkgTXVsdGlwYXJ0IGV4YW1wbGUuPC9lbnRyeT4KKzwvcm93PgorPHJvdz4KKzxlbnRyeT4KKzxsaW5rIHhsaW5rOmhyZWY9Imh0dHBzOi8vamVyc2V5LmdpdGh1Yi5pby9wcm9qZWN0LWluZm8vJnZlcnNpb247L2plcnNleS9wcm9qZWN0L29hdXRoLWNsaWVudC10d2l0dGVyL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBvYXV0aC1jbGllbnQtdHdpdHRlcgorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5Ud2l0dGVyIGNsaWVudCB1c2luZyBPQXV0aCAxIHN1cHBvcnQgZm9yIEplcnNleSB0aGF0IHJldHJpZXZlcyBUd2VldHMgZnJvbSB0aGUgaG9tZSB0aW1lbGluZSBvZiBhCisgICAgICAgIHJlZ2lzdGVyZWQgVHdpdHRlciBhY2NvdW50LjwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC9vYXV0aDItY2xpZW50LWdvb2dsZS13ZWJhcHAvZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIG9hdXRoMi1jbGllbnQtZ29vZ2xlLXdlYmFwcAorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5Hb29nbGUgQVBJIGRhdGEgcmV0cmlldmluZyBleGFtcGxlIHVzaW5nIE9BdXRoMiBmb3IgYXV0aGVudGljYXRpb24gYW5kIGF1dGhvcml6YXRpb248L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3Qvb3Blbi10cmFjaW5nL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBvcGVuLXRyYWNpbmcKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmVyc2V5IE9wZW5UcmFjaW5nIGV4YW1wbGU8L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3Qvb3NnaS1oZWxsb3dvcmxkLXdlYmFwcC9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAgb3NnaS1oZWxsb3dvcmxkLXdlYmFwcAorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5KZXJzZXkgZXhhbXBsZXM8L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3Qvb3NnaS1odHRwLXNlcnZpY2UvZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIG9zZ2ktaHR0cC1zZXJ2aWNlCis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5Pk9TR2kgSHR0cFNlcnZpY2UgZXhhbXBsZTwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC9yZWxvYWQvZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIHJlbG9hZAorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5KZXJzZXkgcmVzb3VyY2UgY29uZmlndXJhdGlvbiByZWxvYWQgZXhhbXBsZS48L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3Qvd2ViYXBwLWV4YW1wbGUtcGFyZW50L3J4LWNsaWVudC13ZWJhcHAvZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIHJ4LWNsaWVudC13ZWJhcHAKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmVyc2V5IFJlYWN0aXZlIENsaWVudCBXZWJBcHAgRXhhbXBsZS48L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3Qvc2VydmVyLWFzeW5jL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBzZXJ2ZXItYXN5bmMKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmVyc2V5IEpBWC1SUyBhc3luY2hyb25vdXMgc2VydmVyLXNpZGUgZXhhbXBsZS48L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3Qvc2VydmVyLWFzeW5jLW1hbmFnZWQvZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIHNlcnZlci1hc3luYy1tYW5hZ2VkCis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5PkplcnNleSBKQVgtUlMgYXN5bmNocm9ub3VzIHNlcnZlci1zaWRlIGV4YW1wbGUgd2l0aCBjdXN0b20gSmVyc2V5IGV4ZWN1dG9yIHByb3ZpZGVycy48L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3Qvc2VydmVyLWFzeW5jLXN0YW5kYWxvbmUvZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIHNlcnZlci1hc3luYy1zdGFuZGFsb25lCis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5PlN0YW5kYWxvbmUgSmVyc2V5IEpBWC1SUyBhc3luY2hyb25vdXMgc2VydmVyLXNpZGUgcHJvY2Vzc2luZyBleGFtcGxlLjwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC9zZXJ2ZXItYXN5bmMtc3RhbmRhbG9uZS9zZXJ2ZXItYXN5bmMtc3RhbmRhbG9uZS1jbGllbnQvZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIHNlcnZlci1hc3luYy1zdGFuZGFsb25lLWNsaWVudAorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5TdGFuZGFsb25lIEplcnNleSBKQVgtUlMgYXN5bmNocm9ub3VzIHNlcnZlci1zaWRlIHByb2Nlc3NpbmcgZXhhbXBsZSBjbGllbnQuPC9lbnRyeT4KKzwvcm93PgorPHJvdz4KKzxlbnRyeT4KKzxsaW5rIHhsaW5rOmhyZWY9Imh0dHBzOi8vamVyc2V5LmdpdGh1Yi5pby9wcm9qZWN0LWluZm8vJnZlcnNpb247L2plcnNleS9wcm9qZWN0L3NlcnZlci1hc3luYy1zdGFuZGFsb25lL3NlcnZlci1hc3luYy1zdGFuZGFsb25lLXdlYmFwcC9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAgc2VydmVyLWFzeW5jLXN0YW5kYWxvbmUtd2ViYXBwCis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5PlN0YW5kYWxvbmUgSmVyc2V5IEpBWC1SUyBhc3luY2hyb25vdXMgc2VydmVyLXNpZGUgcHJvY2Vzc2luZyBleGFtcGxlIHdlYiBhcHBsaWNhdGlvbi48L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3Qvc2VydmVyLXNlbnQtZXZlbnRzLWpheHJzL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBzZXJ2ZXItc2VudC1ldmVudHMtamF4cnMKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmVyc2V5IEpBWC1SUyAyLjEgU2VydmVyLVNlbnQgRXZlbnRzIGV4YW1wbGUuPC9lbnRyeT4KKzwvcm93PgorPHJvdz4KKzxlbnRyeT4KKzxsaW5rIHhsaW5rOmhyZWY9Imh0dHBzOi8vamVyc2V5LmdpdGh1Yi5pby9wcm9qZWN0LWluZm8vJnZlcnNpb247L2plcnNleS9wcm9qZWN0L3NlcnZlci1zZW50LWV2ZW50cy1qZXJzZXkvZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIHNlcnZlci1zZW50LWV2ZW50cy1qZXJzZXkKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmVyc2V5IFNlcnZlci1TZW50IEV2ZW50cyBleGFtcGxlLjwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC93ZWJhcHAtZXhhbXBsZS1wYXJlbnQvc2VydmxldDMtd2ViYXBwL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBzZXJ2bGV0My13ZWJhcHAKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmVyc2V5IFNlcnZsZXQgMyBleGFtcGxlIHdpdGggbWlzc2luZyBzZXJ2bGV0LWNsYXNzIGluIHRoZSB3ZWIueG1sIGZpbGU8L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3Qvd2ViYXBwLWV4YW1wbGUtcGFyZW50L3Nob3J0ZW5lci13ZWJhcHAvZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIHNob3J0ZW5lci13ZWJhcHAKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmVyc2V5IFNob3J0ZW5lciBXZWJhcHAgKE1WQyArIEJlYW4gVmFsaWRhdGlvbikuPC9lbnRyeT4KKzwvcm93PgorPHJvdz4KKzxlbnRyeT4KKzxsaW5rIHhsaW5rOmhyZWY9Imh0dHBzOi8vamVyc2V5LmdpdGh1Yi5pby9wcm9qZWN0LWluZm8vJnZlcnNpb247L2plcnNleS9wcm9qZWN0L3NpbXBsZS1jb25zb2xlL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBzaW1wbGUtY29uc29sZQorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5KZXJzZXkgU2ltcGxlIENvbnNvbGUgZXhhbXBsZTwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC9zcGFya2xpbmVzL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBzcGFya2xpbmVzCis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5PkplcnNleSBleGFtcGxlczwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC93ZWJhcHAtZXhhbXBsZS1wYXJlbnQvc3NlLWl0ZW0tc3RvcmUtamF4cnMtd2ViYXBwL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBzc2UtaXRlbS1zdG9yZS1qYXhycy13ZWJhcHAKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmVyc2V5IEpBWC1SUyAyLjEgU1NFIEFQSS1iYXNlZCBpdGVtIHN0b3JlIGV4YW1wbGUuPC9lbnRyeT4KKzwvcm93PgorPHJvdz4KKzxlbnRyeT4KKzxsaW5rIHhsaW5rOmhyZWY9Imh0dHBzOi8vamVyc2V5LmdpdGh1Yi5pby9wcm9qZWN0LWluZm8vJnZlcnNpb247L2plcnNleS9wcm9qZWN0L3dlYmFwcC1leGFtcGxlLXBhcmVudC9zc2UtaXRlbS1zdG9yZS1qZXJzZXktd2ViYXBwL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICBzc2UtaXRlbS1zdG9yZS1qZXJzZXktd2ViYXBwCis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5PkplcnNleSBTU0UgQVBJLWJhc2VkIGl0ZW0gc3RvcmUgZXhhbXBsZS48L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3Qvc3NlLXR3aXR0ZXItYWdncmVnYXRvci9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAgc3NlLXR3aXR0ZXItYWdncmVnYXRvcgorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5KZXJzZXkgU1NFIFR3aXR0ZXIgTWVzc2FnZSBBZ2dyZWdhdG9yIEV4YW1wbGUuPC9lbnRyeT4KKzwvcm93PgorPHJvdz4KKzxlbnRyeT4KKzxsaW5rIHhsaW5rOmhyZWY9Imh0dHBzOi8vamVyc2V5LmdpdGh1Yi5pby9wcm9qZWN0LWluZm8vJnZlcnNpb247L2plcnNleS9wcm9qZWN0L3N5c3RlbS1wcm9wZXJ0aWVzLWV4YW1wbGUvZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIHN5c3RlbS1wcm9wZXJ0aWVzLWV4YW1wbGUKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmVyc2V5IHN5c3RlbSBwcm9wZXJ0aWVzIGV4YW1wbGUuPC9lbnRyeT4KKzwvcm93PgorPHJvdz4KKzxlbnRyeT4KKzxsaW5rIHhsaW5rOmhyZWY9Imh0dHBzOi8vamVyc2V5LmdpdGh1Yi5pby9wcm9qZWN0LWluZm8vJnZlcnNpb247L2plcnNleS9wcm9qZWN0L3RvbmUtZ2VuZXJhdG9yL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICB0b25lLWdlbmVyYXRvcgorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5KZXJzZXkgZXhhbXBsZXM8L2VudHJ5PgorPC9yb3c+Cis8cm93PgorPGVudHJ5PgorPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly9qZXJzZXkuZ2l0aHViLmlvL3Byb2plY3QtaW5mby8mdmVyc2lvbjsvamVyc2V5L3Byb2plY3Qvb3NnaS1oZWxsb3dvcmxkLXdlYmFwcC93YXItYnVuZGxlL2RlcGVuZGVuY2llcy5odG1sIj4KKyAgICB3YXItYnVuZGxlCis8L2xpbms+Cis8L2VudHJ5PgorPGVudHJ5Pk9TR2kgSGVsbG93b3JsZCBXZWJhcHAgV0FSIGJ1bmRsZTwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC93ZWJhcHAtZXhhbXBsZS1wYXJlbnQvZGVwZW5kZW5jaWVzLmh0bWwiPgorICAgIHdlYmFwcC1leGFtcGxlLXBhcmVudAorPC9saW5rPgorPC9lbnRyeT4KKzxlbnRyeT5KZXJzZXkgV2ViIEFwcGxpY2F0aW9uIChTZXJ2bGV0KSBleGFtcGxlcyBwYXJlbnQgUE9NLjwvZW50cnk+Cis8L3Jvdz4KKzxyb3c+Cis8ZW50cnk+Cis8bGluayB4bGluazpocmVmPSJodHRwczovL2plcnNleS5naXRodWIuaW8vcHJvamVjdC1pbmZvLyZ2ZXJzaW9uOy9qZXJzZXkvcHJvamVjdC94bWwtbW94eS9kZXBlbmRlbmNpZXMuaHRtbCI+CisgICAgeG1sLW1veHkKKzwvbGluaz4KKzwvZW50cnk+Cis8ZW50cnk+SmVyc2V5IFhNTCBNT1h5IGV4YW1wbGUuPC9lbnRyeT4KKzwvcm93PgorICAgICAgICA8L3Rib2R5PgorICAgIDwvdGdyb3VwPgorPC90YWJsZT4KKworPC9zZWN0aW9uPgorCmRpZmYgLS1naXQgYS9kb2NzL3NyYy9tYWluL2RvY2Jvb2svbW9uaXRvcmluZy54bWwgYi9kb2NzL3NyYy9tYWluL2RvY2Jvb2svbW9uaXRvcmluZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU4MjQ1MQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3Mvc3JjL21haW4vZG9jYm9vay9tb25pdG9yaW5nLnhtbApAQCAtMCwwICsxLDg5OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPCFET0NUWVBFIGNoYXB0ZXIgWzwhRU5USVRZICUgZW50cyBTWVNURU0gImplcnNleS5lbnQiID4gJWVudHM7XT4KKzxjaGFwdGVyIHhtbG5zPSJodHRwOi8vZG9jYm9vay5vcmcvbnMvZG9jYm9vayIKKyAgICAgICAgIHZlcnNpb249IjUuMCIKKyAgICAgICAgIHhtbDpsYW5nPSJlbiIKKyAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIKKyAgICAgICAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vZG9jYm9vay5vcmcvbnMvZG9jYm9vayBodHRwOi8vZG9jYm9vay5vcmcveG1sLzUuMC94c2QvZG9jYm9vay54c2QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayBodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rLnhzZCIKKyAgICAgICAgIHhtbDppZD0ibW9uaXRvcmluZ190cmFjaW5nIj4KKyAgICA8dGl0bGU+TW9uaXRvcmluZyBhbmQgRGlhZ25vc3RpY3M8L3RpdGxlPgorICAgIDxzZWN0aW9uIHhtbDppZD0ibW9uaXRvcmluZyI+CisgICAgICAgIDx0aXRsZT5Nb25pdG9yaW5nIEplcnNleSBBcHBsaWNhdGlvbnM8L3RpdGxlPgorICAgICAgICA8c2VjdGlvbj4KKyAgICAgICAgICAgIDx0aXRsZT5JbnRyb2R1Y3Rpb248L3RpdGxlPgorICAgICAgICAgICAgPGltcG9ydGFudD4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgSmVyc2V5IG1vbml0b3Jpbmcgc3VwcG9ydCBoYXMgYmVlbiByZWxlYXNlZCBhcyBhIDxlbXBoYXNpcz5iZXRhIHJlbGVhc2U8L2VtcGhhc2lzPiBpbiBKZXJzZXkgMi4xIHZlcnNpb24uCisgICAgICAgICAgICAgICAgICAgIEFzIHN1Y2gsIHRoZSBleHBvc2VkIG1vbml0b3JpbmcgcHVibGljIEFQSXMgYW5kIGZ1bmN0aW9uYWxpdHkgZGVzY3JpYmVkIGluIHRoaXMgc2VjdGlvbiBtYXkgY2hhbmdlIGluIHRoZQorICAgICAgICAgICAgICAgICAgICBmdXR1cmUgSmVyc2V5IHJlbGVhc2VzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvaW1wb3J0YW50PgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgSmVyc2V5IHByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgZm9yIG1vbml0b3JpbmcgSkFYLVJTL0plcnNleSBhcHBsaWNhdGlvbnMuIEFwcGxpY2F0aW9uIG1vbml0b3JpbmcgaXMgdXNlZnVsIGluIGNhc2VzCisgICAgICAgICAgICAgICAgd2hlbiB5b3UgbmVlZCB0byBpZGVudGlmeSB0aGUgcGVyZm9ybWFuY2UgaG90LXNwb3RzIGluIHlvdXIgSkFYLVJTIGFwcGxpY2F0aW9uLCBvYnNlcnZlCisgICAgICAgICAgICAgICAgZXhlY3V0aW9uIHN0YXRpc3RpY3Mgb2YgcGFydGljdWxhciByZXNvdXJjZXMgb3IgbGlzdGVuIHRvIGFwcGxpY2F0aW9uCisgICAgICAgICAgICAgICAgb3IgcmVxdWVzdCBsaWZlY3ljbGUgZXZlbnRzLiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbmFsaXR5IGlzIEplcnNleS1zcGVjaWZpYyBleHRlbnNpb24gdG8gSkFYLVJTIEFQSS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEplcnNleSBtb25pdG9yaW5nIHN1cHBvcnQgaXMgZGl2aWRlZCBpbnRvIHRocmVlIGZ1bmN0aW9uYWwgYXJlYXM6CisKKyAgICAgICAgICAgICAgICA8dmFyaWFibGVsaXN0PgorICAgICAgICAgICAgICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHRlcm0+RXZlbnQgTGlzdGVuZXJzPC90ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudCBsaXN0ZW5lcnMgYWxsb3cgdXNlcnMgdG8gcmVjZWl2ZSBhbmQgcHJvY2VzcyBhIHByZWRlZmluZWQgc2V0IG9mIGV2ZW50cyB0aGF0IG9jY3VyIGR1cmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhIGFwcGxpY2F0aW9uIGxpZmVjeWNsZSAoc3VjaCBhcyBhcHBsaWNhdGlvbiBpbml0aWFsaXphdGlvbiwgYXBwbGljYXRpb24gZGVzdHJveSkgYXMgd2VsbCBhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0IHByb2Nlc3NpbmcgbGlmZWN5Y2xlIGV2ZW50cyAocmVxdWVzdCBzdGFydGVkLCByZXNvdXJjZSBtZXRob2QgZmluaXNoZWQsIGV4Y2VwdGlvbiB0aHJvd24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV0Yy4pLiBUaGlzIGZlYXR1cmUgaXMgYWx3YXlzIGVuYWJsZWQgaW4gSmVyc2V5IHNlcnZlciBydW50aW1lIGFuZCBpcyBsZXZlcmFnZWQgYnkgdGhlIG90aGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbml0b3JpbmcgZmVhdHVyZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGVybT5Nb25pdG9yaW5nIFN0YXRpc3RpY3M8L3Rlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEplcnNleSBjYW4gYmUgY29uZmlndXJlZCB0byBwcm9jZXNzIGxpZmVjeWNsZSBldmVudHMgaW4gb3JkZXIgdG8gZXhwb3NlIGEgd2lkZSByYW5nZSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lIG1vbml0b3Jpbmcgc3RhdGlzdGljcyB0byB0aGUgZW5kIHVzZXIuIFRoZSBzdGF0aXN0aWNzIGFyZSBhY2Nlc3NpYmxlIHRyb3VnaCBhbiBpbmplY3RhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZqZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuTW9uaXRvcmluZ1N0YXRpc3RpY3M7IGludGVyZmFjZS4gVGhlIHN0YXRpc3RpY3MgcHJvdmlkZSBnZW5lcmFsIGluZm9ybWF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFib3V0IHRoZSBhcHBsaWNhdGlvbiBhcyB3ZWxsIGFzIGZpbmUtZ3JhaW5lZCBleGVjdXRpb24gc3RhdGlzdGljcyBvbiBwYXJ0aWN1bGFyIHJlc291cmNlcyBhbmQgc3ViCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlcyBhbmQgZXhwb3NlZCBVUklzLiBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgdGhpcyBmdW5jdGlvbmFsaXR5IG11c3QgYmUgZXhwbGljaXRseSBlbmFibGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yIHVzaW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDwvdmFybGlzdGVudHJ5PgorICAgICAgICAgICAgICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHRlcm0+Sk1YIE1CZWFucyB3aXRoIHN0YXRpc3RpY3M8L3Rlcm0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluIGFkZGl0aW9uIHRvIHRoZSBpbmplY3RhYmxlICZsaXQuamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLk1vbml0b3JpbmdTdGF0aXN0aWNzOyBkYXRhLCBKZXJzZXkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgYWJsZSB0byBleHBvc2UgdGhlIHN0YXRpc3RpY3MgYXMgSk1YIE1CZWFucyAoZm9yIGV4YW1wbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5BcHBsaWNhdGlvbk1YQmVhbjspLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKZXJzZXkgbW9uaXRvcmluZyBNWEJlYW5zIGNhbiBiZSBhY2Nlc3NlZCBwcm9ncmFtbWF0aWNhbGx5IHVzaW5nIEpNWCBBUElzIG9yIGJyb3dzZWQgdmlhIEpNWC1lbmFibGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvb2wgKDxsaXRlcmFsPkpDb25zb2xlPC9saXRlcmFsPiBmb3IgZXhhbXBsZSkuIFRoaXMgZnVuY3Rpb25hbGl0eSBpcywgdG9vLCAgYnkgZGVmYXVsdCBkaXNhYmxlZCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWFuY2UgcmVhc29ucyBhbmQgbXVzdCBiZSBlbmFibGVkIGlmIG5lZWRlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKyAgICAgICAgICAgICAgICA8L3ZhcmlhYmxlbGlzdD4KKworICAgICAgICAgICAgICAgIEFsbCBtb25pdG9yaW5nIHJlbGF0ZWQgQVBJcyAoYmV0YSEpIGNhbiBiZSBmb3VuZCBpbiB0aGUgPGxpdGVyYWw+amVyc2V5LXNlcnZlcjwvbGl0ZXJhbD4gbW9kdWxlIGluCisgICAgICAgICAgICAgICAgPGxpdGVyYWw+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3Jpbmc8L2xpdGVyYWw+IHBhY2thZ2UuIE1vbml0b3JpbmcgaW4gSmVyc2V5IGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQgb24KKyAgICAgICAgICAgICAgICB0aGUgc2VydmVyIHNpZGUuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICA8dGl0bGU+RXZlbnQgTGlzdGVuZXJzPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEplcnNleSBkZWZpbmVzIHR3byB0eXBlcyBvZiBldmVudCBsaXN0ZW5lcnMgdGhhdCB5b3UgY2FuIGltcGxlbWVudCBhbmQgcmVnaXN0ZXIgd2l0aCB5b3VyIGFwcGxpY2F0aW9uOgorCisgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+JmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5BcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXI7IGZvciBsaXN0ZW5pbmcgdG8gYXBwbGljYXRpb24gZXZlbnRzLCBhbmQ8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPiZqZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuUmVxdWVzdEV2ZW50TGlzdGVuZXI7IGZvciBsaXN0ZW5pbmcgdG8gZXZlbnRzIG9mIHJlcXVlc3QgcHJvY2Vzc2luZy48L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisKKyAgICAgICAgICAgICAgICBPbmx5IHRoZSBmaXJzdCB0eXBlLCAmbGl0LmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5BcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXI7CisgICAgICAgICAgICAgICAgY2FuIGJlIGRpcmVjdGx5IHJlZ2lzdGVyZWQgYXMgYW4gYXBwbGljYXRpb24td2lkZSBwcm92aWRlci4gVGhlICZsaXQuamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLlJlcXVlc3RFdmVudExpc3RlbmVyOworICAgICAgICAgICAgICAgIGlzIGRlc2lnbmVkIHRvIGJlIHNwZWNpZmljIHRvIGV2ZXJ5IHJlcXVlc3QgYW5kIGNhbiBiZSBvbmx5IHJldHVybmVkIGZyb20gdGhlCisgICAgICAgICAgICAgICAgJmxpdC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuQXBwbGljYXRpb25FdmVudExpc3RlbmVyOyBhcyBzdWNoLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgTGV0J3Mgc3RhcnQgd2l0aCBhbiBleGFtcGxlLiBUaGUgZm9sbG93aW5nIGV4YW1wbGVzIHNob3cgc2ltcGxlIGltcGxlbWVudGF0aW9ucyBvZiBKZXJzZXkgZXZlbnQgbGlzdGVuZXJzIGFzIHdlbGwKKyAgICAgICAgICAgICAgICBhcyBhIHRlc3QgSkFYLVJTIHJlc291cmNlIHRoYXQgd2lsbCBiZSBtb25pdG9yZWQuCisKKyAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgPHRpdGxlPkFwcGxpY2F0aW9uIGV2ZW50IGxpc3RlbmVyPC90aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+PCFbQ0RBVEFbcHVibGljIGNsYXNzIE15QXBwbGljYXRpb25FdmVudExpc3RlbmVyCisgICAgICAgICAgICBpbXBsZW1lbnRzIEFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lciB7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBpbnQgcmVxdWVzdENudCA9IDA7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkV2ZW50KEFwcGxpY2F0aW9uRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgc3dpdGNoIChldmVudC5nZXRUeXBlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgSU5JVElBTElaQVRJT05fRklOSVNIRUQ6CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBcHBsaWNhdGlvbiAiCisgICAgICAgICAgICAgICAgICAgICAgICArIGV2ZW50LmdldFJlc291cmNlQ29uZmlnKCkuZ2V0QXBwbGljYXRpb25OYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiB3YXMgaW5pdGlhbGl6ZWQuIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIERFU1RST1lfRklOSVNIRUQ6CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBcHBsaWNhdGlvbiAiCisgICAgICAgICAgICAgICAgICAgICsgZXZlbnQuZ2V0UmVzb3VyY2VDb25maWcoKS5nZXRBcHBsaWNhdGlvbk5hbWUoKSBkZXN0cm95ZWQuIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVxdWVzdEV2ZW50TGlzdGVuZXIgb25SZXF1ZXN0KFJlcXVlc3RFdmVudCByZXF1ZXN0RXZlbnQpIHsKKyAgICAgICAgcmVxdWVzdENudCsrOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlcXVlc3QgIiArIHJlcXVlc3RDbnQgKyAiIHN0YXJ0ZWQuIik7CisgICAgICAgIC8vIHJldHVybiB0aGUgbGlzdGVuZXIgaW5zdGFuY2UgdGhhdCB3aWxsIGhhbmRsZSB0aGlzIHJlcXVlc3QuCisgICAgICAgIHJldHVybiBuZXcgTXlSZXF1ZXN0RXZlbnRMaXN0ZW5lcihyZXF1ZXN0Q250KTsKKyAgICB9Cit9XV0+PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisKKyAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgPHRpdGxlPlJlcXVlc3QgZXZlbnQgbGlzdGVuZXI8L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj48IVtDREFUQVtwdWJsaWMgY2xhc3MgTXlSZXF1ZXN0RXZlbnRMaXN0ZW5lciBpbXBsZW1lbnRzIFJlcXVlc3RFdmVudExpc3RlbmVyIHsKKyAgICBwcml2YXRlIGZpbmFsIGludCByZXF1ZXN0TnVtYmVyOworICAgIHByaXZhdGUgZmluYWwgbG9uZyBzdGFydFRpbWU7CisKKyAgICBwdWJsaWMgTXlSZXF1ZXN0RXZlbnRMaXN0ZW5lcihpbnQgcmVxdWVzdE51bWJlcikgeworICAgICAgICB0aGlzLnJlcXVlc3ROdW1iZXIgPSByZXF1ZXN0TnVtYmVyOworICAgICAgICBzdGFydFRpbWUgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkV2ZW50KFJlcXVlc3RFdmVudCBldmVudCkgeworICAgICAgICBzd2l0Y2ggKGV2ZW50LmdldFR5cGUoKSkgeworICAgICAgICAgICAgY2FzZSBSRVNPVVJDRV9NRVRIT0RfU1RBUlQ6CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSZXNvdXJjZSBtZXRob2QgIgorICAgICAgICAgICAgICAgICAgICArIGV2ZW50LmdldFVyaUluZm8oKS5nZXRNYXRjaGVkUmVzb3VyY2VNZXRob2QoKQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldEh0dHBNZXRob2QoKQorICAgICAgICAgICAgICAgICAgICArICIgc3RhcnRlZCBmb3IgcmVxdWVzdCAiICsgcmVxdWVzdE51bWJlcik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEZJTklTSEVEOgorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVxdWVzdCAiICsgcmVxdWVzdE51bWJlcgorICAgICAgICAgICAgICAgICAgICArICIgZmluaXNoZWQuIFByb2Nlc3NpbmcgdGltZSAiCisgICAgICAgICAgICAgICAgICAgICsgKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gc3RhcnRUaW1lKSArICIgbXMuIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9XV0+PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisKKyAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgPHRpdGxlPkV2ZW50IGxpc3RlbmVyIHRlc3QgcmVzb3VyY2U8L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj48IVtDREFUQVtAUGF0aCgicmVzb3VyY2UiKQorcHVibGljIGNsYXNzIFRlc3RSZXNvdXJjZSB7CisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0U29tZXRoaW5nKCkgeworICAgICAgICByZXR1cm4gImdldCI7CisgICAgfQorCisgICAgQFBPU1QKKyAgICBwdWJsaWMgU3RyaW5nIHBvc3RTb21ldGhpbmcoU3RyaW5nIGVudGl0eSkgeworICAgICAgICByZXR1cm4gInBvc3QiOworICAgIH0KK31dXT48L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgT25jZSB0aGUgbGlzdGVuZXJzIGFuZCB0aGUgbW9uaXRvcmVkIHJlc291cmNlIGlzIGRlZmluZWQsIGl0J3MgdGltZSB0byBpbml0aWFsaXplIG91ciBhcHBsaWNhdGlvbi4gVGhlIGZvbGxvd2luZworICAgICAgICAgICAgICAgIHBpZWNlIG9mIGNvZGUgc2hvd3MgYSAmamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsgdGhhdCBpcyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIGFwcGxpY2F0aW9uIChwbGVhc2UKKyAgICAgICAgICAgICAgICBub3RlIHRoYXQgb25seSAmbGl0LmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5BcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXI7IGlzIHJlZ2lzdGVyZWQgYXMgcHJvdmlkZXIpLgorCisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+PCFbQ0RBVEFbUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPQorICAgICAgICAgICAgbmV3IFJlc291cmNlQ29uZmlnKFRlc3RSZXNvdXJjZS5jbGFzcywgTXlBcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXIuY2xhc3MpCisgICAgICAgICAgICAuc2V0QXBwbGljYXRpb25OYW1lKCJteS1tb25pdG9yZWQtYXBwbGljYXRpb24iKTtdXT48L3Byb2dyYW1saXN0aW5nPgorCisgICAgICAgICAgICAgICAgT3VyIGV4YW1wbGUgYXBwbGljYXRpb24gbm93IGNvbnRhaW5zIGEgc2ltcGxlIHJlc291cmNlIDxsaXRlcmFsPlRlc3RSZXNvdXJjZTwvbGl0ZXJhbD4gdGhhdCBkZWZpbmVzIHJlc291cmNlIG1ldGhvZHMKKyAgICAgICAgICAgICAgICBmb3IgJmxpdC5odHRwLkdFVDsgYW5kICZsaXQuaHR0cC5QT1NUOyBhbmQgYSBjdXN0b20gPGxpdGVyYWw+TXlBcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXI8L2xpdGVyYWw+IGV2ZW50IGxpc3RlbmVyLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhlIHJlZ2lzdGVyZWQgPGxpdGVyYWw+TXlBcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXI8L2xpdGVyYWw+IGltcGxlbWVudHMgdHdvIG1ldGhvZHMgZGVmaW5lZCBieSB0aGUKKyAgICAgICAgICAgICAgICAmbGl0LmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5BcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXI7IGludGVyZmFjZS4gQSBtZXRob2QgPGxpdGVyYWw+b25FdmVudCgpPC9saXRlcmFsPiBoYW5kbGVzCisgICAgICAgICAgICAgICAgYWxsIGFwcGxpY2F0aW9uIGxpZmVjeWNsZSBldmVudHMuIEluIG91ciBjYXNlIHRoZSBtZXRob2QgaGFuZGxlcyBvbmx5IDIgYXBwbGljYXRpb24gZXZlbnRzIC0gaW5pdGlhbGl6YXRpb24KKyAgICAgICAgICAgICAgICBhbmQgZGVzdHJveS4gT3RoZXIgZXZlbnQgdHlwZXMgYXJlIGlnbm9yZWQuIEFsbCBhcHBsaWNhdGlvbiBldmVudCB0eXBlcyBhcmUgZGVmaW5lZAorICAgICAgICAgICAgICAgIGluICZqZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuQXBwbGljYXRpb25FdmVudDs8bGl0ZXJhbD4uVHlwZTwvbGl0ZXJhbD4uIFRoZSBzZWNvbmQgbWV0aG9kIDxsaXRlcmFsPm9uUmVxdWVzdDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICBpcyBpbnZva2VkIGJ5IEplcnNleSBydW50aW1lIGV2ZXJ5IHRpbWUgYSBuZXcgcmVxdWVzdCBpcyByZWNlaXZlZC4gVGhlIHJlcXVlc3QgZXZlbnQgdHlwZSBwYXNzZWQgdG8gdGhlIG1ldGhvZAorICAgICAgICAgICAgICAgIGlzIGFsd2F5cyA8bGl0ZXJhbD5TVEFSVDwvbGl0ZXJhbD4uIElmIHlvdSB3YW50IHRvIGxpc3RlbiB0byBhbnkgb3RoZXIgcmVxdWVzdCBsaWZlY3ljbGUgZXZlbnRzIGZvciB0aGUgbmV3IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgeW91IGFyZSBleHBlY3RlZCB0byByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgJmxpdC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuUmVxdWVzdEV2ZW50TGlzdGVuZXI7IHRoYXQgd2lsbCBoYW5kbGUgdGhlCisgICAgICAgICAgICAgICAgcmVxdWVzdC4gSXQgaXMgaW1wb3J0YW50IHRvIHVuZGVyc3RhbmQsIHRoYXQgdGhlIGluc3RhbmNlIHdpbGwgaGFuZGxlIG9ubHkgdGhlIHJlcXVlc3QgZm9yIHdoaWNoIGl0IGhhcyBiZWVuIHJldHVybmVkCisgICAgICAgICAgICAgICAgZnJvbSBhbiA8bGl0ZXJhbD5BcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXIub25SZXF1ZXN0PC9saXRlcmFsPiBtZXRob2QgYW5kIG5vdCBhbnkgb3RoZXIgcmVxdWVzdHMuIEluIG91ciBjYXNlIHRoZQorICAgICAgICAgICAgICAgIHJldHVybmVkIHJlcXVlc3QgZXZlbnQgbGlzdGVuZXIga2VlcHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlcXVlc3QgbnVtYmVyIG9mIHRoZSBjdXJyZW50IHJlcXVlc3QgYW5kIGEgc3RhcnQgdGltZSBvZgorICAgICAgICAgICAgICAgIHRoZSByZXF1ZXN0IHdoaWNoIGlzIGxhdGVyIHVzZWQgdG8gcHJpbnQgb3V0IHRoZSByZXF1ZXN0IHByb2Nlc3NpbmcgdGltZXMgc3RhdGlzdGljcy4gVGhpcyBkZW1vbnN0cmF0ZXMgdGhlIHByaW5jaXBsZQorICAgICAgICAgICAgICAgIG9mIGxpc3RlbmluZyB0byByZXF1ZXN0IGV2ZW50czogZm9yIG9uZSByZXF1ZXN0IHRoZXJlIGlzIGEgb25lIGluc3RhbmNlIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGhvbGQgYWxsIHRoZSBpbmZvcm1hdGlvbgorICAgICAgICAgICAgICAgIGFib3V0IHRoZSBwYXJ0aWN1bGFyIHJlcXVlc3QuIEluIG90aGVyIHdvcmRzLCAmbGl0LmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5SZXF1ZXN0RXZlbnRMaXN0ZW5lcjsgaXMgZGVzaWduZWQgdG8gYmUKKyAgICAgICAgICAgICAgICBpbXBsaWNpdGx5IHJlcXVlc3Qtc2NvcGVkLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgSmVyc2V5IHJlcHJlc2VudHMgbGlmZWN5Y2xlIGV2ZW50cyB2aWEgJmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5SZXF1ZXN0RXZlbnQ7IGFuZAorICAgICAgICAgICAgICAgICZqZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuQXBwbGljYXRpb25FdmVudDsgdHlwZXMuIEluc3RhbmNlcyBvZiB0aGVzZSBjbGFzc2VzIGNvbnRhaW4gaW5mb3JtYXRpb24KKyAgICAgICAgICAgICAgICBhYm91dCByZXNwZWN0aXZlIGV2ZW50cy4gVGhlIG1vc3QgaW1wb3J0YW50IGluZm9ybWF0aW9uIGlzIHRoZSBldmVudCB0eXBlIDxsaXRlcmFsPlR5cGU8L2xpdGVyYWw+IHJldHJpZXZhYmxlIHZpYQorICAgICAgICAgICAgICAgIDxsaXRlcmFsPmdldFR5cGUoKTwvbGl0ZXJhbD4gbWV0aG9kLAorICAgICAgICAgICAgICAgIHdoaWNoIGlkZW50aWZpZXMgdGhlIHR5cGUgb2YgdGhlIGV2ZW50LiBFdmVudHMgY29udGFpbiBhbHNvIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdGhhdCBpcyBkZXBlbmRlbnQgb24gYSBwYXJ0aWN1bGFyCisgICAgICAgICAgICAgICAgZXZlbnQgdHlwZS4gVGhpcyBpbmZvcm1hdGlvbiBjYW4gYmUgcmV0cmlldmVkIHZpYSBldmVudCBnZXR0ZXJzLiBBZ2Fpbiwgc29tZSBnZXR0ZXJzIHJldHVybiB2YWxpZCBpbmZvcm1hdGlvbiBmb3IgYWxsCisgICAgICAgICAgICAgICAgZXZlbnQgdHlwZXMsIHNvbWUgYXJlIHNwZWNpZmljIHRvIGEgc3ViLXNldCBvZiBldmVudCB0eXBlcy4gRm9yIGV4YW1wbGUsIGluIHRoZQorICAgICAgICAgICAgICAgICZsaXQuamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLlJlcXVlc3RFdmVudDssIHRoZSA8bGl0ZXJhbD5nZXRFeGNlcHRpb25DYXVzZSgpPC9saXRlcmFsPiBtZXRob2QgcmV0dXJucyB2YWxpZAorICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uIG9ubHkgd2hlbiBldmVudCB0eXBlIGlzIDxsaXRlcmFsPk9OX0VYQ0VQVElPTjwvbGl0ZXJhbD4uIE9uIHRoZSBvdGhlciBoYW5kLAorICAgICAgICAgICAgICAgIGEgPGxpdGVyYWw+Z2V0Q29udGFpbmVyUmVxdWVzdCgpPC9saXRlcmFsPiBjYW4gYmUgdXNlZCB0byByZXR1cm4gY3VycmVudCByZXF1ZXN0IGNvbnRleHQgZm9yIGFueSByZXF1ZXN0IGV2ZW50IHR5cGUuCisgICAgICAgICAgICAgICAgU2VlIGphdmFkb2Mgb2YgZXZlbnRzIGFuZCBldmVudCB0eXBlcyB0byBnZXQgZmFtaWxpYXIgd2l0aCBldmVudCB0eXBlcyBhbmQgaW5mb3JtYXRpb24gdmFsaWQgZm9yIGVhY2ggZXZlbnQgdHlwZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIE91ciA8bGl0ZXJhbD5NeVJlcXVlc3RFdmVudExpc3RlbmVyPC9saXRlcmFsPiBpbXBsZW1lbnRhdGlvbiBpcyBmb2N1c2VkIG9uIHByb2Nlc3NpbmcgMiByZXF1ZXN0IGV2ZW50cy4gRmlyc3QsCisgICAgICAgICAgICAgICAgaXQgbGlzdGVucyBmb3IgYW4gZXZlbnQgdGhhdCBpcyB0cmlnZ2VyZWQgYmVmb3JlIGEgcmVzb3VyY2UgbWV0aG9kIGlzIGV4ZWN1dGVkLiBBbHNvLCBpdCBob29rcyB0byBhICJyZXF1ZXN0IGZpbmlzaGVkIgorICAgICAgICAgICAgICAgIGV2ZW50LiBBcyBtZW50aW9uZWQgZWFybGllciwgdGhlIHJlcXVlc3QgZXZlbnQgPGxpdGVyYWw+U1RBUlQ8L2xpdGVyYWw+IGlzIGhhbmRsZWQgb25seSBpbiB0aGUKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbD5NeUFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lcjwvbGl0ZXJhbD4uIFRoZSA8bGl0ZXJhbD5TVEFSVDwvbGl0ZXJhbD4gZXZlbnQgdHlwZSB3aWxsIG5ldmVyIGJlIGludm9rZWQgb24KKyAgICAgICAgICAgICAgICA8bGl0ZXJhbD5SZXF1ZXN0RXZlbnRMaXN0ZW5lcjwvbGl0ZXJhbD4uIFRoZXJlZm9yZSB0aGUgbG9naWMgZm9yIG1lYXN1cmluZyB0aGUgPGxpdGVyYWw+c3RhcnRUaW1lPC9saXRlcmFsPiBpcyBpbiB0aGUKKyAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvciB3aGljaCBpcyBpbnZva2VkIGZyb20gPGxpdGVyYWw+TXlBcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXIub25SZXF1ZXN0KCk8L2xpdGVyYWw+LiBBbiBhdHRlbXB0IHRvIGhhbmRsaW5nCisgICAgICAgICAgICAgICAgdGhlIHJlcXVlc3QgPGxpdGVyYWw+U1RBUlQ8L2xpdGVyYWw+IGV2ZW50IGluIGEgPGxpdGVyYWw+UmVxdWVzdEV2ZW50TGlzdGVuZXIub25FdmVudCgpPC9saXRlcmFsPiBtZXRob2Qgd291bGQgYmUgYQorICAgICAgICAgICAgICAgIG1pc3Rha2UuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBMZXQncyBkZXBsb3kgdGhlIGFwcGxpY2F0aW9uIGFuZCB1c2UgYSBzaW1wbGUgdGVzdCBjbGllbnQgY29kZSB0byBwcm9kdWNlIHNvbWUgYWN0aXZpdHkgaW4gb3JkZXIgdG8gc3Bhd24gbmV3IGV2ZW50czoKKworICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPjwhW0NEQVRBW3RhcmdldC5wYXRoKCJyZXNvdXJjZSIpLnJlcXVlc3QoKQorICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KCJwb3N0IiwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgIHRhcmdldC5wYXRoKCJyZXNvdXJjZSIpLnJlcXVlc3QoKS5nZXQoKTtdXT48L3Byb2dyYW1saXN0aW5nPgorCisgICAgICAgICAgICAgICAgSW4gdGhlIGNvZGUgYWJvdmUsIHRoZSA8bGl0ZXJhbD50YXJnZXQ8L2xpdGVyYWw+IGlzIGEgJmpheHJzLmNsaWVudC5XZWJUYXJnZXQ7IGluc3RhbmNlIHBvaW50aW5nIHRvIHRoZSBhcHBsaWNhdGlvbgorICAgICAgICAgICAgICAgIGNvbnRleHQgcm9vdCBwYXRoLiBVc2luZyB0aGUgPHhyZWYgbGlua2VuZD0iY2xpZW50IiAvPiwgd2UgaW52b2tlICZsaXQuaHR0cC5HRVQ7IGFuZCAmbGl0Lmh0dHAuUE9TVDsgbWV0aG9kcworICAgICAgICAgICAgICAgIG9uIHRoZSA8bGl0ZXJhbD5NeVJlc291cmNlPC9saXRlcmFsPiBKQVgtUlMgcmVzb3VyY2UgY2xhc3MgdGhhdCB3ZSBpbXBsZW1lbnRlZCBlYXJsaWVyLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgV2hlbiB3ZSBzdGFydCB0aGUgYXBwbGljYXRpb24sIHJ1biB0aGUgdGVzdCBjbGllbnQgYW5kIHRoZW4gc3RvcCB0aGUgYXBwbGljYXRpb24sIHRoZSBjb25zb2xlIG91dHB1dCBmb3IgdGhlCisgICAgICAgICAgICAgICAgZGVwbG95ZWQgc2VydmVyLXNpZGUgYXBwbGljYXRpb24gd291bGQgY29udGFpbiB0aGUgZm9sbG93aW5nIG91dHB1dDoKKworICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0idGV4dCIgbGluZW51bWJlcmluZz0idW5udW1iZXJlZCI+QXBwbGljYXRpb24gbXktbW9uaXRvcmVkLWFwcGxpY2F0aW9uIHdhcyBpbml0aWFsaXplZC4KK1JlcXVlc3QgMSBzdGFydGVkLgorUmVzb3VyY2UgbWV0aG9kIFBPU1Qgc3RhcnRlZCBmb3IgcmVxdWVzdCAxCitSZXF1ZXN0IDEgZmluaXNoZWQuIFByb2Nlc3NpbmcgdGltZSAzMzAgbXMuCitSZXF1ZXN0IDIgc3RhcnRlZC4KK1Jlc291cmNlIG1ldGhvZCBHRVQgc3RhcnRlZCBmb3IgcmVxdWVzdCAyCitSZXF1ZXN0IDIgZmluaXNoZWQuIFByb2Nlc3NpbmcgdGltZSA0IG1zLgorQXBwbGljYXRpb24gbXktbW9uaXRvcmVkLWFwcGxpY2F0aW9uIGRlc3Ryb3llZC48L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICAgICAgPHRpdGxlPkd1aWRlbGluZXMgZm9yIGltcGxlbWVudGluZyBKZXJzZXkgZXZlbnQgbGlzdGVuZXJzPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICBJbXBsZW1lbnQgZXZlbnQgbGlzdGVuZXJzIGFzIHRocmVhZCBzYWZlLiBXaGlsZSBpbmRpdmlkdWFsIGV2ZW50cyB3aWxsIGJlIGFycml2aW5nIHNlcmlhbGx5LAorICAgICAgICAgICAgICAgICAgICAgICAgaW5kaXZpZHVhbCBsaXN0ZW5lciBpbnZvY2F0aW9ucyBtYXkgb2NjdXIgZnJvbSBkaWZmZXJlbnQgdGhyZWFkcy4gVGh1cyBtYWtlIHN1cmUgdGhhdCB5b3VyIGxpc3RlbmVycworICAgICAgICAgICAgICAgICAgICAgICAgYXJlIHByb2Nlc3NpbmcgZGF0YSBzYWZlbHkgd2l0aCByZXNwZWN0IHRvIHRoZWlyCisgICAgICAgICAgICAgICAgICAgICAgICA8bGluayB4bGluazpocmVmPScmd2lraXBlZGlhLnVyaTtKYXZhX01lbW9yeV9Nb2RlbCc+SmF2YSBNZW1vcnkgTW9kZWw8L2xpbms+IHZpc2liaWxpdHkgKGluIHRoZSBleGFtcGxlCisgICAgICAgICAgICAgICAgICAgICAgICBhYm92ZSB0aGUgZmllbGRzIDxsaXRlcmFsPnJlcXVlc3ROdW1iZXI8L2xpdGVyYWw+LCA8bGl0ZXJhbD5zdGFydFRpbWU8L2xpdGVyYWw+IG9mCisgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5NeVJlcXVlc3RFdmVudExpc3RlbmVyPC9saXRlcmFsPiBhcmUgZmluYWwgYW5kIHRoZXJlZm9yZSB0aGUgc2FtZSB2YWx1ZSBpcworICAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJsZSBmb3IgYWxsIHRocmVhZHMgZXhlY3V0aW5nIHRoZSA8bGl0ZXJhbD5vbkV2ZW50KCk8L2xpdGVyYWw+IG1ldGhvZCkuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICBEbyBub3QgYmxvY2sgdGhlIHRocmVhZCBleGVjdXRpbmcgdGhlIGV2ZW50IGxpc3RlbmVycyBieSBwZXJmb3JtaW5nIGxvbmctcnVubmluZyB0YXNrcy4gRXhlY3V0aW9uIG9mIGV2ZW50CisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMgaXMgYSBwYXJ0IG9mIHRoZSBzdGFuZGFyZCBhcHBsaWNhdGlvbiBhbmQgcmVxdWVzdCBwcm9jZXNzaW5nIGFuZCBhcyBzdWNoIG5lZWRzIHRvIGZpbmlzaCBhcyBxdWlja2x5CisgICAgICAgICAgICAgICAgICAgICAgICBhcyBwb3NzaWJsZSB0byBhdm9pZCBuZWdhdGl2ZSBpbXBhY3Qgb24gb3ZlcmFsbCBhcHBsaWNhdGlvbiBwZXJmb3JtYW5jZS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIERvIG5vdCB0cnkgdG8gbW9kaWZ5IG11dGFibGUgb2JqZWN0cyByZXR1cm5lZCBmcm9tICZsaXQuamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLkFwcGxpY2F0aW9uRXZlbnQ7IGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgJmxpdC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuUmVxdWVzdEV2ZW50OyBnZXR0ZXJzIHRvIGF2b2lkIGV4cGVyaWVuY2luZyB1bmRlZmluZWQgYmVoYXZpb3IuCisgICAgICAgICAgICAgICAgICAgICAgICBFdmVudHMgbGlzdGVuZXJzIHNob3VsZCB1c2UgdGhlIGluZm9ybWF0aW9uIGZvciByZWFkIG9ubHkgcHVycG9zZXMgb25seS4gVXNlIGRpZmZlcmVudCB0ZWNobmlxdWVzIGxpa2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcnMsIGludGVyY2VwdG9ycyBvciBvdGhlciBwcm92aWRlcnMgdG8gbW9kaWZ5IHRoZSBwcm9jZXNzaW5nIG9mIHJlcXVlc3RzIGFuZCBhcHBsaWNhdGlvbnMuIEV2ZW4gdGhvdWdoCisgICAgICAgICAgICAgICAgICAgICAgICBtb2RpZmljYXRpb24gbWlnaHQgYmUgcG9zc2libGUgYW5kIG1pZ2h0IHdvcmsgYXMgZGVzaXJlZCBub3csIHlvdXIgY29kZSBpcyBpbiByaXNrIG9mIHByb2R1Y2luZyBpbnRlcm1pdHRlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmVzIG9yIHVuZXhwZWN0ZWQgYmVoYXZpb3VyIChmb3IgZXhhbXBsZSBhZnRlciBtaWdyYXRpbmcgdG8gbmV3IEplcnNleSB2ZXJzaW9uKS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIElmIHlvdSBkbyBub3Qgd2FudCB0byBsaXN0ZW4gdG8gcmVxdWVzdCBldmVudHMsIGRvIG5vdCByZXR1cm4gYW4gZW1wdHkgbGlzdGVuZXIgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5vblJlcXVlc3QoKTwvbGl0ZXJhbD4gbWV0aG9kLiBSZXR1cm4gPGxpdGVyYWw+bnVsbDwvbGl0ZXJhbD4gaW5zdGVhZC4gUmV0dXJuaW5nIGVtcHR5IGxpc3RlbmVyCisgICAgICAgICAgICAgICAgICAgICAgICBtaWdodCBoYXZlIGEgbmVnYXRpdmUgcGVyZm9ybWFuY2UgaW1wYWN0LiBEbyBub3QgcmVseSBvbiBKSVQgb3B0aW1pemluZyBvdXQgdGhlIGVtcHR5IGxpc3RlbmVyIGludm9jYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGUuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICBJZiB5b3UgbWlzcyBhbnkgZXZlbnQgdHlwZSBvciBhbnkgZGV0YWlsIGluIHRoZSBldmVudHMsIGxldCB1cyBrbm93IHZpYSBKZXJzZXkgdXNlciBtYWlsaW5nIGxpc3QuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICAgICAgPHRpdGxlPk1vbml0b3JpbmcgU3RhdGlzdGljczwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEV2ZW50IGxpc3RlbmVycyBkZXNjcmliZWQgaW4gdGhlIHByZXZpb3VzIHNlY3Rpb24gYXJlIGFsbC1wdXJwb3NlIGZhY2lsaXR5LiBGb3IgZXhhbXBsZSwgeW91IG1heSBkZWNpZGUgdG8KKyAgICAgICAgICAgICAgICAgICAgdXNlIHRoZW0gdG8gbWVhc3VyZSB2YXJpb3VzIGV4ZWN1dGlvbiBzdGF0aXN0aWNzIG9mIHlvdXIgYXBwbGljYXRpb24uIFdoaWxlIHRoaXMgbWlnaHQgYmUgYW4gZWFzeSB0YXNrIGZvciBzaW1wbGUKKyAgICAgICAgICAgICAgICAgICAgc3RhdGlzdGljcyBsaWtlICJob3cgbXVjaCB0aW1lIHdhcyBzcGVudCBvbiBleGVjdXRpb24gb2YgZWFjaCBKYXZhIG1ldGhvZD8iLCBuZXZlcnRoZWxlc3MsIGlmIHlvdSB3YW50IHRvIG1lYXN1cmUKKyAgICAgICAgICAgICAgICAgICAgc3RhdGlzdGljcyBiYXNlZCBvbiBVUklzIGFuZCBpbmRpdmlkdWFsIHJlc291cmNlcywgdGhlIGltcGxlbWVudGF0aW9uIG1pZ2h0IGdldCByYXRoZXIgY29tcGxleCBzb29uLCBlc3BlY2lhbGx5CisgICAgICAgICAgICAgICAgICAgIHdoZW4gY29uc2lkZXJpbmcgc3ViLXJlc291cmNlcyBhbmQgc3ViLXJlc291cmNlIGxvY2F0b3JzLiBUbyBzYXZlIHlvdSB0aGUgdHJvdWJsZSwgSmVyc2V5IHByb3ZpZGVzIGZlYXR1cmUgZm9yCisgICAgICAgICAgICAgICAgICAgIGNvbGxlY3RpbmcgZXZlbnRzIGFuZCBjYWxjdWxhdGluZyBhIHByZS1kZWZpbmVkIHNldCBvZiBtb25pdG9yaW5nIGFuZCBleGVjdXRpb24gc3RhdGlzdGljcywgaW5jbHVkaW5nCisgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24sIGV4Y2VwdGlvbiBtYXBwZXJzIGV4ZWN1dGlvbiwgbWluaW11bS9tYXhpbXVtL2F2ZXJhZ2UgZXhlY3V0aW9uIHRpbWVzIGZvciBpbmRpdmlkdWFsCisgICAgICAgICAgICAgICAgICAgIHJlc291cmNlIG1ldGhvZHMgYXMgd2VsbCBhcyBlbnRpcmUgcmVxdWVzdCBwcm9jZXNzaW5nIGV0Yy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIENhbGN1bGF0aW5nIHRoZSBtb25pdG9yaW5nIHN0YXRpc3RpY3MgaGFzIG9idmlvdXNseSBhIHBlcmZvcm1hbmNlIGltcGFjdCwgdGhlcmVmb3JlIHRoaXMgZmVhdHVyZSBpcworICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZCBieSBkZWZhdWx0LiBUbyBlbmFibGUgdGhlIGZlYXR1cmUsIHNldCB0aGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgdG8gJmxpdC50cnVlOzoKKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJ1bm51bWJlcmVkIj5qZXJzZXkuY29uZmlnLnNlcnZlci5tb25pdG9yaW5nLnN0YXRpc3RpY3MuZW5hYmxlZD10cnVlPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgVGhlIHByb3BlcnR5IGRlc2NyaXB0aW9uIGNhbiBiZSBmb3VuZCBpbiAmamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzLk1PTklUT1JJTkdfU1RBVElTVElDU19FTkFCTEVEOworICAgICAgICAgICAgICAgICAgICBUaGlzIHdpbGwgY2FsY3VsYXRlIHRoZSBzdGF0aXN0aWNzLiBUaGUgZWFzaWVzdCB3YXkgaG93IHRvIGdldCBzdGF0aXN0aWNzIGlzIHRvIGxldCBKZXJzZXkKKyAgICAgICAgICAgICAgICAgICAgdG8gaW5qZWN0IHRoZW0uIFNlZSB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgICAgICA8dGl0bGU+SW5qZWN0aW5nIE1vbml0b3JpbmdTdGF0aXN0aWNzPC90aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+PCFbQ0RBVEFbQFBhdGgoInJlc291cmNlIikKK3B1YmxpYyBzdGF0aWMgY2xhc3MgU3RhdGlzdGljc1Jlc291cmNlIHsKKyAgICBASW5qZWN0CisgICAgUHJvdmlkZXI8TW9uaXRvcmluZ1N0YXRpc3RpY3M+IG1vbml0b3JpbmdTdGF0aXN0aWNzUHJvdmlkZXI7CisKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBnZXRTb21ldGhpbmcoKSB7CisgICAgICAgIGZpbmFsIE1vbml0b3JpbmdTdGF0aXN0aWNzIHNuYXBzaG90CisgICAgICAgICAgICA9IG1vbml0b3JpbmdTdGF0aXN0aWNzUHJvdmlkZXIuZ2V0KCkuc25hcHNob3QoKTsKKworICAgICAgICBmaW5hbCBUaW1lV2luZG93U3RhdGlzdGljcyB0aW1lV2luZG93U3RhdGlzdGljcworICAgICAgICAgICAgPSBzbmFwc2hvdC5nZXRSZXF1ZXN0U3RhdGlzdGljcygpCisgICAgICAgICAgICAgIC5nZXRUaW1lV2luZG93U3RhdGlzdGljcygpLmdldCgwbCk7CisKKyAgICAgICAgcmV0dXJuICJyZXF1ZXN0IGNvdW50OiAiICsgdGltZVdpbmRvd1N0YXRpc3RpY3MuZ2V0UmVxdWVzdENvdW50KCkKKyAgICAgICAgICAgICsgIiwgYXZlcmFnZSByZXF1ZXN0IHByb2Nlc3NpbmcgW21zXTogIgorICAgICAgICAgICAgKyB0aW1lV2luZG93U3RhdGlzdGljcy5nZXRBdmVyYWdlRHVyYXRpb24oKTsKKyAgICB9Cit9fV1dPjwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAmamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLk1vbml0b3JpbmdTdGF0aXN0aWNzOyBhcmUKKyAgICAgICAgICAgICAgICAgICAgaW5qZWN0ZWQgaW50byB0aGUgcmVzb3VyY2UgdXNpbmcgYW4gJmplZTYuamF2YXguaW5qZWN0LkluamVjdDsgYW5ub3RhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgUGxlYXNlIG5vdGUgdGhlIHVzYWdlIG9mIHRoZSAmamVlNi5qYXZheC5pbmplY3QuUHJvdmlkZXI7IGZvciBpbmplY3Rpb24gKGl0IHdpbGwgYmUgZGlzY3Vzc2VkIGxhdGVyKS4KKyAgICAgICAgICAgICAgICAgICAgRmlyc3RseSwgdGhlIHNuYXBzaG90IG9mIHN0YXRpc3RpY3MgaXMgcmV0cmlldmVkIGJ5IHRoZSA8bGl0ZXJhbD5zbmFwc2hvdCgpPC9saXRlcmFsPiBtZXRob2QuCisgICAgICAgICAgICAgICAgICAgIFRoZSBzbmFwc2hvdCBvZiBzdGF0aXN0aWNzIGlzIGFuIGltbXV0YWJsZSBjb3B5IG9mIHN0YXRpc3RpY3Mgd2hpY2ggZG9lcyBub3QgY2hhbmdlIG92ZXIgdGhlIHRpbWUuCisgICAgICAgICAgICAgICAgICAgIEFkZGl0aW9uYWxseSwgZGF0YSBpbiBhIHNuYXBzaG90IGFyZSBjb25zaXN0ZW50LiBJdCdzIHJlY29tbWVuZGVkIHRvIGNyZWF0ZSBzbmFwc2hvdHMgYmVmb3JlIHdvcmtpbmcgd2l0aAorICAgICAgICAgICAgICAgICAgICB0aGUgc3RhdGlzdGljcyBkYXRhIGFuZCB0aGVuIHByb2Nlc3MgdGhlIHNuYXBzaG90IGRhdGEuCisgICAgICAgICAgICAgICAgICAgIFdvcmtpbmcgd2l0aCBvcmlnaW5hbCBub24tc25hcHNob3QgZGF0YSBtYWtlcyBzZW5zZSB3aGVuIGRhdGEgY29uc2lzdGVuY3kgaXMgbm90IGltcG9ydGFudCBhbmQKKyAgICAgICAgICAgICAgICAgICAgcGVyZm9ybWFuY2UgaXMgb2YgaGlnaGVzdCBjb25jZXJuLiBXaGlsZSBpdCBpcyBjdXJyZW50bHkgbm90IHRoZSBjYXNlLCB0aGUgaW5qZWN0ZWQgbm9uLXNuYXBzaG90IGRhdGEgbWF5CisgICAgICAgICAgICAgICAgICAgIGJlIGltcGxlbWVudGVkIGFzIG11dGFibGUgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgaW4gYSBmdXR1cmUgcmVsZWFzZSBvZiBKZXJzZXkuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUaGUgaW5qZWN0ZWQgbW9uaXRvcmluZyBzdGF0aXN0aWNzIHJlcHJlc2VudCB0aGUgcm9vdCBvZiB0aGUgY29sbGVjdGVkIHN0YXRpc3RpY3MgaGllcmFyY2h5LiBUaGUgaGllcmFyY2h5CisgICAgICAgICAgICAgICAgICAgIGNhbiBiZSB0cmF2ZXJzZWQgdG8gcmV0cmlldmUgYW55IHBhcnRpYWwgc3RhdGlzdGljcyBkYXRhLiBJbiB0aGUgZXhhbXBsZSwgd2UgcmV0cmlldmUgY2VydGFpbiByZXF1ZXN0CisgICAgICAgICAgICAgICAgICAgICZqZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuVGltZVdpbmRvd1N0YXRpc3RpY3M7IGRhdGEuIEluIG91ciBjYXNlLCB0aG9zZSBhcmUgdGhlIHJlcXVlc3QgZXhlY3V0aW9uIHN0YXRpc3RpY3MKKyAgICAgICAgICAgICAgICAgICAgZm9yIGEgdGltZSB3aW5kb3cgZGVmaW5lZCBieSBsb25nIHZhbHVlIDAgd2hpY2ggbWVhbnMgdW5saW1pdGVkIHRpbWUgd2luZG93LiBUaGlzIG1lYW5zIHdlIGFyZSByZXRyaWV2aW5nCisgICAgICAgICAgICAgICAgICAgIHRoZSBnbG9iYWwgcmVxdWVzdCBleGVjdXRpb24gc3RhdGlzdGljcyBtZWFzdXJlZCBzaW5jZSBhIHN0YXJ0IG9mIHRoZSBhcHBsaWNhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgRmluYWxseSwgcmVxdWVzdCBjb3VudCBhbmQgYXZlcmFnZSBkdXJhdGlvbiBmcm9tIHRoZSBzdGF0aXN0aWNzIGFyZSB1c2VkIHRvIHByb2R1Y2UgdGhlIFN0cmluZyByZXNwb25zZS4KKyAgICAgICAgICAgICAgICAgICAgV2hlbiB3ZSBpbnZva2UgZmV3ICZsaXQuaHR0cC5HRVQ7IHJlcXVlc3RzIG9uIHRoZSA8bGl0ZXJhbD5TdGF0aXN0aWNzUmVzb3VyY2U8L2xpdGVyYWw+LCB3ZSBnZXQgdGhlCisgICAgICAgICAgICAgICAgICAgIGZvbGxvd2luZyBjb25zb2xlIG91dHB1dDoKKyAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJ0ZXh0IiBsaW5lbnVtYmVyaW5nPSJ1bm51bWJlcmVkIj5yZXF1ZXN0IGNvdW50OiAxLCBhdmVyYWdlIHJlcXVlc3QgcHJvY2Vzc2luZyBbbXNdOiAyNjAKK3JlcXVlc3QgY291bnQ6IDIsIGF2ZXJhZ2UgcmVxdWVzdCBwcm9jZXNzaW5nIFttc106IDEzNQorcmVxdWVzdCBjb3VudDogMywgYXZlcmFnZSByZXF1ZXN0IHByb2Nlc3NpbmcgW21zXTogOTMKK3JlcXVlc3QgY291bnQ6IDQsIGF2ZXJhZ2UgcmVxdWVzdCBwcm9jZXNzaW5nIFttc106IDczPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIExldCdzIGxvb2sgY2xvc2VyIGF0ICZqZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuTW9uaXRvcmluZ1N0YXRpc3RpY3M7IGludGVyZmFjZS4KKyAgICAgICAgICAgICAgICAgICAgJmxpdC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuTW9uaXRvcmluZ1N0YXRpc3RpY3M7IGludGVyZmFjZSBkZWZpbmVzIGdldHRlcnMgYnkgd2hpY2ggb3RoZXIgbmVzdGVkCisgICAgICAgICAgICAgICAgICAgIHN0YXRpc3RpY3MgY2FuIGJlIHJldHJpZXZlZC4gQWxsIHN0YXRpc3RpY3MgYXJlIGluIHRoZSBzYW1lIHBhY2thZ2UgYW5kIGVuZHMgd2l0aAorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5TdGF0aXN0aWNzPC9saXRlcmFsPiBwb3N0Zml4LiBTdGF0aXN0aWNzIGludGVyZmFjZXMgYXJlIHRoZSBmb2xsb3dpbmc6CisgICAgICAgICAgICAgICAgICAgIDx2YXJpYWJsZWxpc3Q+CisgICAgICAgICAgICAgICAgICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXJtPiZqZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuTW9uaXRvcmluZ1N0YXRpc3RpY3M7PC90ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+bWFpbiB0b3AgbGV2ZWwgc3RhdGlzdGljczwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXJtPiZqZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuUmVzcG9uc2VTdGF0aXN0aWNzOzwvdGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPnJlc3BvbnNlIHN0YXRpc3RpY3MgKGVnLiByZXNwb25zZSBzdGF0dXMgY29kZXMgYW5kIHRoZWlyIGNvdW50KTwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXJtPiZqZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuUmVzb3VyY2VTdGF0aXN0aWNzOzwvdGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPnN0YXRpc3RpY3Mgb2YgZXhlY3V0aW9uIG9mIHJlc291cmNlcyAocmVzb3VyY2UgY2xhc3NlcyBvciByZXNvdXJjZSBVUklzKTwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXJtPiZqZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuUmVzb3VyY2VNZXRob2RTdGF0aXN0aWNzOzwvdGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPnN0YXRpc3RpY3Mgb2YgZXhlY3V0aW9uIG9mIHJlc291cmNlIG1ldGhvZHM8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdmFybGlzdGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVybT4mamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLkV4ZWN1dGlvblN0YXRpc3RpY3M7PC90ZXJtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+c3RhdGlzdGljIG9mIGV4ZWN1dGlvbiBvZiBhIHRhcmdldCAocmVzb3VyY2UsIHJlcXVlc3QsIHJlc291cmNlIG1ldGhvZCk8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvdmFybGlzdGVudHJ5PgorICAgICAgICAgICAgICAgICAgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGVybT4mamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLlRpbWVXaW5kb3dTdGF0aXN0aWNzOzwvdGVybT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPnN0YXRpc3RpY3Mgb2YgZXhlY3V0aW9uIHRpbWUgaW4gc3BlY2lmaWMgaW50ZXJ2YWwgKGVnLiBleGVjdXRpb25zIGluIGxhc3QgNSBtaW51dGVzKTwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDwvdmFyaWFibGVsaXN0PgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBFYWNoIHRpbWUtbW9uaXRvcmVkIHRhcmdldCBjb250YWlucyAmbGl0LmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5FeGVjdXRpb25TdGF0aXN0aWNzOy4gU28sIGZvciBleGFtcGxlCisgICAgICAgICAgICAgICAgICAgIHJlc291cmNlIG1ldGhvZCBjb250YWlucyBleGVjdXRpb24gc3RhdGlzdGljcyBvZiBpdHMgZXhlY3V0aW9uLiBFYWNoCisgICAgICAgICAgICAgICAgICAgICZsaXQuamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLkV4ZWN1dGlvblN0YXRpc3RpY3M7IGNvbnRhaW5zIG11bHRpcGxlCisgICAgICAgICAgICAgICAgICAgICZsaXQuamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLlRpbWVXaW5kb3dTdGF0aXN0aWNzOy4gQ3VycmVudGx5LCBlYWNoCisgICAgICAgICAgICAgICAgICAgICZsaXQuamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLkV4ZWN1dGlvblN0YXRpc3RpY3M7IGNvbnRhaW5zCisgICAgICAgICAgICAgICAgICAgICZsaXQuamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLlRpbWVXaW5kb3dTdGF0aXN0aWNzOyBmb3IgdGhlc2UgdGltZSB3aW5kb3dzOgorCisgICAgICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+MDogdW5saW1pdGVkPT4gYWxsIGV4ZWN1dGlvbiBzaW5jZSBzdGFydCBvZiB0aGUgYXBwbGljYXRpb248L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4xMDAwOiAxcyA9PiBzdGF0cyBtZWFzdXJlZCBpbiBsYXN0IDEgc2Vjb25kPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+MTUwMDA6IDE1cyA9PiBzdGF0cyBtZWFzdXJlZCBpbiBsYXN0IDE1IHNlY29uZHM8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT42MDAwMDogMW1pbiA9PiBzdGF0cyBtZWFzdXJlZCBpbiBsYXN0IDEgbWludXRlPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+OTAwMDAwOiAxNW1pbiA9PiBzdGF0cyBtZWFzdXJlZCBpbiBsYXN0IDE1IG1pbnV0ZXM8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4zNjAwMDAwOiAxaG91ciA9PiBzdGF0cyBtZWFzdXJlZCBpbiBsYXN0IGhvdXIgbWludXRlczwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKworICAgICAgICAgICAgICAgICAgICBBbGwgdGhlIHRpbWUgd2luZG93IHN0YXRpc3RpY3MgY2FuIGJlIHJldHJpZXZlZCBmcm9tIGEgPGxpdGVyYWw+TWFwJmx0O0xvbmcsIFRpbWVXaW5kb3dTdGF0aXN0aWNzJmd0OzwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgbWFwIHJldHVybmVkIGZyb20gPGxpdGVyYWw+RXhlY3V0aW9uU3RhdGlzdGljcy5nZXRUaW1lV2luZG93U3RhdGlzdGljcygpPC9saXRlcmFsPi4gS2V5IG9mIHRoZSBtYXAKKyAgICAgICAgICAgICAgICAgICAgaXMgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgb2YgaW50ZXJ2YWwgKHNvLCBmb3IgZXhhbXBsZSBrZXkgNjAwMDAgcG9pbnRzCisgICAgICAgICAgICAgICAgICAgIHRvIHN0YXRpc3RpY3MgZm9yIGxhc3Qgb25lIG1pbnV0ZSkuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBOb3RlLCB0aGF0IDxsaXRlcmFsPnNuYXBzaG90KCk8L2xpdGVyYWw+IG1ldGhvZCB3YXMgY2FsbGVkIGluIHRoZSBleGFtcGxlIG9ubHkgb24gdGhlIHRvcCBsZXZlbAorICAgICAgICAgICAgICAgICAgICAmbGl0LmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5Nb25pdG9yaW5nU3RhdGlzdGljczsuIFRoaXMgcHJvZHVjZWQgYSBzbmFwc2hvdCBvZiB0aGUgZW50aXJlCisgICAgICAgICAgICAgICAgICAgIHRyZWUgb2Ygc3RhdGlzdGljcyBhbmQgdGhlcmVmb3JlIHdlIGRvIG5vdCBuZWVkIHRvIGNhbGwgPGxpdGVyYWw+c25hcHNob3QoKTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgb24gJmxpdC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuVGltZVdpbmRvd1N0YXRpc3RpY3M7IGFnYWluLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgU3RhdGlzdGljcyBhcmUgaW5qZWN0ZWQgdXNpbmcgdGhlICZqZWU2LmphdmF4LmluamVjdC5Qcm92aWRlcjsuIFRoaXMgaXMgcHJlZmVycmVkIHdheSBvZgorICAgICAgICAgICAgICAgICAgICBpbmplY3Rpbmcgc3RhdGlzdGljcy4gVGhlIHJlYXNvbiBpcyBzaW1wbGUuIFN0YXRpc3RpY3MgbWlnaHQgY2hhbmdlIG92ZXIgdGltZSBhbmQgY29udHJhY3QKKyAgICAgICAgICAgICAgICAgICAgb2YgJmxpdC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuTW9uaXRvcmluZ1N0YXRpc3RpY3M7IGRvZXMgbm90IG1ha2UgYW55IGFzc3VtcHRpb25zIGFib3V0IG11dGFiaWxpdHkgb2YKKyAgICAgICAgICAgICAgICAgICAgbW9uaXRvcmluZyBzdGF0aXN0aWNzIGluc3RhbmNlcyAodG8gYWxsb3cgZnV0dXJlIG9wdGltaXphdGlvbnMgYW5kIGNoYW5nZXMgaW4gaW1wbGVtZW50YXRpb24gc3RyYXRlZ3kpLiBJbgorICAgICAgICAgICAgICAgICAgICBvcmRlciB0byBnZXQgYWx3YXlzIGxhdGVzdCBzdGF0aXN0aWNzLCB3ZSByZWNvbW1lbmQgaW5qZWN0aW5nIGEgJmplZTYuamF2YXguaW5qZWN0LlByb3ZpZGVyOyByYXRoZXIgdGhhbiBhCisgICAgICAgICAgICAgICAgICAgIGRpcmVjdCByZWZlcmVuY2UgYW5kIHVzZSBpdCdzIDxsaXRlcmFsPmdldCgpPC9saXRlcmFsPiBtZXRob2QgdG8gcmV0cmlldmUgdGhlIGxhdGVzdCBzdGF0aXN0aWNzLiBGb3IgZXhhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgaW4gc2luZ2xldG9uIHJlc291cmNlcyB0aGUgdXNlIG9mIHRoZSB0ZWNobmlxdWUgaXMgdmVyeSBpbXBvcnRhbnQgb3RoZXJ3aXNlIHN0YXRpc3RpY3MgbWlnaHQgY29ycmVzcG9uZAorICAgICAgICAgICAgICAgICAgICB0byB0aGUgdGltZSB3aGVuIHNpbmdsZXRvbiB3YXMgZmlyc3RseSBjcmVhdGVkIGFuZCBtaWdodCBub3QgdXBkYXRlIHNpbmNlIHRoYXQgdGltZS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5MaXN0ZW5pbmcgdG8gc3RhdGlzdGljcyBjaGFuZ2VzPC90aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICBTdGF0aXN0aWNzIGFyZSBub3QgY2FsY3VsYXRlZCBmb3IgZWFjaCByZXF1ZXN0IG9yIGVhY2ggY2hhbmdlLiBTdGF0aXN0aWNzIGFyZSBjYWxjdWxhdGVkIG9ubHkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gdGhlIGNvbGxlY3RlZCBkYXRhIGluIHJlZ3VsYXIgaW50ZXJ2YWxzIGZvciBwZXJmb3JtYW5jZSByZWFzb25zIChmb3IgZXhhbXBsZSBvbmNlIHBlciBzZWNvbmQpLgorICAgICAgICAgICAgICAgICAgICAgICAgSWYgeW91IHdhbnQgdG8gYmUgbm90aWZpZWQgYWJvdXQgbmV3IHN0YXRpc3RpY3MsIHJlZ2lzdGVyIGFuIGltcGxlbWVudGF0aW9uIG9mCisgICAgICAgICAgICAgICAgICAgICAgICAmamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLk1vbml0b3JpbmdTdGF0aXN0aWNzTGlzdGVuZXI7IGFzIG9uZSBvZiB5b3VyIGN1c3RvbSBhcHBsaWNhdGlvbiBwcm92aWRlcnMuCisgICAgICAgICAgICAgICAgICAgICAgICBZb3VyIGxpc3RlbmVyIHdpbGwgYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgdGhlIG5ldyBzdGF0aXN0aWNzIGFyZSBjYWxjdWxhdGVkIGFuZCB0aGUgdXBkYXRlZCBzdGF0aXN0aWNzCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBsaXN0ZW5lciBtZXRob2QuIFRoaXMgaXMgYW5vdGhlciB3YXkgb2YgcmVjZWl2aW5nIHN0YXRpc3RpY3MuCisgICAgICAgICAgICAgICAgICAgICAgICBTZWUgdGhlIGxpbmtlZCBsaXN0ZW5lciBBUEkgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgICAgIDxzZWN0aW9uPgorICAgICAgICAgICAgICAgIDx0aXRsZT5Nb25pdG9yaW5nIFN0YXRpc3RpY3MgYXMgTUJlYW5zPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICBKZXJzZXkgZXhhbXBsZXMgY29udGFpbnMgYQorICAgICAgICAgICAgICAgICAgICAgICAgPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5naXRodWIuZXhhbXBsZXMudXJpOy9tb25pdG9yaW5nLXdlYmFwcCc+TW9uaXRvcmluZyBXZWIgQXBwbGljYXRpb24gRXhhbXBsZTwvbGluaz4KKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIGRlbW9uc3RyYXRlcyB1c2FnZSBvZiBNQmVhbiBzdGF0aXN0aWNzLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9ub3RlPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEplcnNleSBwcm92aWRlcyBmZWF0dXJlIHRvIGV4cG9zZSBtb25pdG9yaW5nIHN0YXRpc3RpY3MgYXMgSk1YIE1YQmVhbnMuCisgICAgICAgICAgICAgICAgICAgIEluIG9yZGVyIHRvIGVuYWJsZSBtb25pdG9yaW5nIHN0YXRpc3RpY3MgTVhCZWFucyBleHBvc3VyZSwgdGhlCisgICAgICAgICAgICAgICAgICAgICZqZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMuTU9OSVRPUklOR19TVEFUSVNUSUNTX01CRUFOU19FTkFCTEVEOyBtdXN0IGJlIHNldCB0byAmbGl0LnRydWU7LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9InVubnVtYmVyZWQiPmplcnNleS5jb25maWcuc2VydmVyLm1vbml0b3Jpbmcuc3RhdGlzdGljcy5tYmVhbnMuZW5hYmxlZD10cnVlPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IGVuYWJsaW5nIGV4cG9zdXJlIG9mIG1vbml0b3JpbmcgTVhCZWFucyBjYXVzZXMgdGhhdCBhbHNvIHRoZSBjYWxjdWxhdGlvbiBvZgorICAgICAgICAgICAgICAgICAgICAmbGl0LmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5Nb25pdG9yaW5nU3RhdGlzdGljczsgaXMgYXV0b21hdGljYWxseSBlbmFibGVkIGFzIHRoZSBleHBvc2VkCisgICAgICAgICAgICAgICAgICAgIE1YQmVhbiBzdGF0aXN0aWNzIGFyZSBleHRyYWN0ZWQgZnJvbSAmbGl0LmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5Nb25pdG9yaW5nU3RhdGlzdGljczsuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUaGUgZWFzaWVzdCB3YXkgaXMgdG8gYnJvd3NlIHRoZSBNWEJlYW5zIGluIHRoZSBKQ29uc29sZS4gT3BlbiB0aGUgSkNvbnNvbGUKKyAgICAgICAgICAgICAgICAgICAgKDxsaXRlcmFsPiRKQVZBX0hPTUUvYmluL2pjb25zb2xlPC9saXRlcmFsPikuIFRoZW4gY29ubmVjdCB0byB0aGUgcHJvY2VzcyB3aGVyZSBKQVgtUlMgYXBwbGljYXRpb24gaXMgcnVubmluZworICAgICAgICAgICAgICAgICAgICAoc2VydmVyIG9uIHdoaWNoIHRoZSBhcHBsaWNhdGlvbiBpcyBydW5uaW5nKS4gU3dpdGNoIHRvIGEgTUJlYW4gdGFiIGFuZCBpbiB0aGUgTUJlYW4gdHJlZSBvbiB0aGUgbGVmdCBzaWRlCisgICAgICAgICAgICAgICAgICAgIGZpbmQgYSBncm91cCA8bGl0ZXJhbD5vcmcuZ2xhc3NmaXNoLmplcnNleTwvbGl0ZXJhbD4uIEFsbCBkZXBsb3llZCBKZXJzZXkgYXBwbGljYXRpb25zIGFyZSBsb2NhdGVkIHVuZGVyIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgZ3JvdXAuIElmIHlvdSBkb24ndCBzZWUgc3VjaCB0aGlzIGdyb3VwLCB0aGVuIE1CZWFucyBhcmUgbm90IGV4cG9zZWQgKGNoZWNrIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGFuZAorICAgICAgICAgICAgICAgICAgICBsb2dzIGlmIHRoZXkgbm90IGNvbnRhaW4gYW55IGV4Y2VwdGlvbnMgb3IgZXJyb3JzKS4gVGhlIGZvbGxvd2luZyBmaWd1cmUgaXMgYW4gZXhhbXBsZSBvZiBhbiBvdXRwdXQgZnJvbSB0aGUKKyAgICAgICAgICAgICAgICAgICAgSkNvbnNvbGU6CisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPG1lZGlhb2JqZWN0PgorICAgICAgICAgICAgICAgICAgICA8aW1hZ2VvYmplY3Q+CisgICAgICAgICAgICAgICAgICAgICAgICA8aW1hZ2VkYXRhIGZpbGVyZWY9ImltYWdlcy9tb25pdG9yaW5nLWpzY29uc29sZS5wbmciIGZvcm1hdD0iUE5HIiB3aWR0aD0iMTAwJSIgc2NhbGVmaXQ9IjEiIGFsaWduPSJjZW50ZXIiLz4KKyAgICAgICAgICAgICAgICAgICAgPC9pbWFnZW9iamVjdD4KKyAgICAgICAgICAgICAgICA8L21lZGlhb2JqZWN0PgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFVuZGVyIHRoZSByb290IDxsaXRlcmFsPm9yZy5nbGFzc2Zpc2guamVyc2V5PC9saXRlcmFsPiBKZXJzZXkgTUJlYW4gZ3JvdXAgeW91IGNhbiBmaW5kIHlvdXIgYXBwbGljYXRpb24uCisgICAgICAgICAgICAgICAgICAgIElmIHRoZSBzZXJ2ZXIgY29udGFpbnMgbW9yZSBKZXJzZXkgYXBwbGljYXRpb24sIGFsbCB3aWxsIGJlIHByZXNlbnQgdW5kZXIgdGhlIHJvb3QgSmVyc2V5IHRoZSBncm91cC4gSW4gdGhlCisgICAgICAgICAgICAgICAgICAgIHNjcmVlbi1zaG90LCB0aGUgZGVwbG95ZWQgSkFYLVJTIGFwcGxpY2F0aW9uIGlzIG5hbWVkIDxsaXRlcmFsPm15QXBwbGljYXRpb248L2xpdGVyYWw+ICh0aGUgbmFtZSBjYW4gYmUgZGVmaW5lZAorICAgICAgICAgICAgICAgICAgICB2aWEgJmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7IGRpcmVjdGx5IG9yIGJ5IHNldHRpbmcgdGhlICZqZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMuQVBQTElDQVRJT05fTkFNRTsKKyAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkpLgorICAgICAgICAgICAgICAgICAgICBFYWNoIGFwcGxpY2F0aW9uIGNvbnRhaW5zIDxsaXRlcmFsPkdsb2JhbDwvbGl0ZXJhbD4sIDxsaXRlcmFsPlJlc291cmNlPC9saXRlcmFsPiBhbmQKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+VXJpczwvbGl0ZXJhbD4gc3ViLWdyb3Vwcy4gVGhlIDxsaXRlcmFsPkdsb2JhbDwvbGl0ZXJhbD4gZ3JvdXAgY29udGFpbnMgYWxsIGdsb2JhbAorICAgICAgICAgICAgICAgICAgICBzdGF0aXN0aWNzIGxpa2Ugb3ZlcmFsbCByZXF1ZXN0cyBzdGF0aXN0aWNzIG9mIHRoZSBlbnRpcmUgYXBwbGljYXRpb24gKDxsaXRlcmFsPkFsbFJlcXVlc3RUaW1lczwvbGl0ZXJhbD4pLAorICAgICAgICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIG9mIHRoZSBKQVgtUlMgYXBwbGljYXRpb24gKDxsaXRlcmFsPkNvbmZpZ3VyYXRpb248L2xpdGVyYWw+KSwgc3RhdGlzdGljcyBhYm91dAorICAgICAgICAgICAgICAgICAgICAmamF4cnMuZXh0LkV4Y2VwdGlvbk1hcHBlcjsgZXhlY3V0aW9uICg8bGl0ZXJhbD5FeGNlcHRpb25NYXBwZXI8L2xpdGVyYWw+KSBhbmQgc3RhdGlzdGljcyBhYm91dAorICAgICAgICAgICAgICAgICAgICBwcm9kdWNlZCByZXNwb25zZXMgKDxsaXRlcmFsPlJlc3BvbnNlczwvbGl0ZXJhbD4pLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+UmVzb3VyY2VzPC9saXRlcmFsPiBhbmQgPGxpdGVyYWw+VXJpczwvbGl0ZXJhbD4gZ3JvdXBzIGNvbnRhaW5zIG1vbml0b3Jpbmcgc3RhdGlzdGljcyBzcGVjaWZpYyB0bworICAgICAgICAgICAgICAgICAgICBpbmRpdmlkdWFsIHJlc291cmNlcy4KKyAgICAgICAgICAgICAgICAgICAgU3RhdGlzdGljcyBpbiA8bGl0ZXJhbD5SZXNvdXJjZXM8L2xpdGVyYWw+IGFyZSBib3VuZCB0byB0aGUgSkFYLVJTIHJlc291cmNlIEphdmEgY2xhc3NlcyBsb2FkZWQgYnkgdGhlCisgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uLiA8bGl0ZXJhbD5VcmlzPC9saXRlcmFsPiBjb250YWlucyBzdGF0aXN0aWNzIG9mIHJlc291cmNlcyBiYXNlZCBvbiB0aGUgbWF0Y2hlZCBhcHBsaWNhdGlvbiBVcmlzCisgICAgICAgICAgICAgICAgICAgIChvbmUgVVJJIGVudHJ5IHJlcHJlc2VudHMgYWxsIG1ldGhvZHMgYm91bmQgdG8gdGhlIHBhcnRpY3VsYXIgVVJJLCBlLmcuIDxsaXRlcmFsPi9yZXNvdXJjZS9leGNlcHRpb248L2xpdGVyYWw+KS4KKyAgICAgICAgICAgICAgICAgICAgQXMgSmVyc2V5IHByb3ZpZGVzIHByb2dyYW1tYXRpYyByZXNvdXJjZSBidWlsZGVycyAoZGVzY3JpYmVkIGluIHRoZSBjaGFwdGVyCisgICAgICAgICAgICAgICAgICAgIDxsaW5rIGxpbmtlbmQ9InJlc291cmNlLWJ1aWxkZXIiPiJQcm9ncmFtbWF0aWMgQVBJIGZvciBCdWlsZGluZyBSZXNvdXJjZXMiPC9saW5rPiksIG9uZSBKYXZhIHJlc291cmNlIGNsYXNzCisgICAgICAgICAgICAgICAgICAgIGNhbiBiZSBhbiBlbmRwb2ludCBmb3IgcmVzb3VyY2UgbWV0aG9kcyBvbiBtYW55IGRpZmZlcmVudCBVUklzLiBBbmQgYWxzbyBvbmUgVVJJIGNhbiBiZSBzZXJ2ZWQgYnkgbWV0aG9kIGZyb20KKyAgICAgICAgICAgICAgICAgICAgbWFueSBkaWZmZXJlbnQgSmF2YSBjbGFzc2VzLiBUaGVyZWZvcmUgYm90aCB2aWV3cyBhcmUgbm90IHRvIGJlIGNvbXBhcmVkIDE6MS4gSW5zdGVhZCB0aGV5IHByb3ZpZGUKKyAgICAgICAgICAgICAgICAgICAgZGlmZmVyZW50IGxvZ2dpY2FsIHZpZXdzIG9uIHlvdXIgSkFYLVJTIGFwcGxpY2F0aW9uLiBUaGlzIG1vbml0b3JpbmcgZmVhdHVyZSBjYW4gYWxzbyBoZWxwIHdoZW4gZGVzaWduaW5nCisgICAgICAgICAgICAgICAgICAgIHRoZSBKQVgtUlMgQVBJcyBhcyBpdCBwcm92aWRlcyBuaWNlIHZpZXcgb24gYXZhaWxhYmxlIHJvb3QgYXBwbGljYXRpb24gVVJJcy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEJvdGggbG9naWNhbCB2aWV3cyBvbiB0aGUgcmVzb3VyY2VzIGV4cG9zZWQgYnkgYXBwbGljYXRpb24gc2hhcmUgZmV3IGNvbW1vbiBwcmluY2lwbGVzLiBBIHNpbmdsZSByZXNvdXJjZSBlbnRyeQorICAgICAgICAgICAgICAgICAgICBpcyBhbHdheXMgYSBzZXQgb2YgcmVzb3VyY2UgbWV0aG9kcyB3aGljaCBhcmUgYXZhaWxhYmxlIHVuZGVyIHRoZSA8bGl0ZXJhbD5tZXRob2RzPC9saXRlcmFsPiBzdWItZ3JvdXAuIFN0YXRpc3RpY3MKKyAgICAgICAgICAgICAgICAgICAgY2FuIGJlIGZvdW5kIGluIE1CZWFucyA8bGl0ZXJhbD5NZXRob2RUaW1lczwvbGl0ZXJhbD4gYW5kIDxsaXRlcmFsPlJlcXVlc3RUaW1lczwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPk1ldGhvZFRpbWVzPC9saXRlcmFsPiBjb250YWlucyBzdGF0aXN0aWNzIG1lYXN1cmVkIG9uIG9uIHJlc291cmNlIG1ldGhvZHMgKGR1cmF0aW9uIG9mIGV4ZWN1dGlvbiBvZiBhCisgICAgICAgICAgICAgICAgICAgIGNvZGUgb2YgdGhlIGEgcmVzb3VyY2UgbWV0aG9kKSwgd2hlcmVhcyA8bGl0ZXJhbD5SZXF1ZXN0VGltZXM8L2xpdGVyYWw+IGNvbnRhaW5zIHN0YXRpc3RpY3Mgb2YgYW4gZW50aXJlIHJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgZXhlY3V0aW9uIChub3Qgb25seSBhIHRpbWUgb2YgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgcmVzb3VyY2UgbWV0aG9kIGJ1dCB0aGUgb3ZlcmFsbCB0aW1lIG9mIHRoZSBleGVjdXRpb24gb2Ygd2hvbGUKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCBieSBKZXJzZXkgcnVudGltZSkuIEFub3RoZXIgdXNlZnVsIGluZm9ybWF0aW9uIGlzIHRoYXQgc3RhdGlzdGljcyBkaXJlY3RseSB1bmRlciByZXNvdXJjZSAobm90IHVuZGVyCisgICAgICAgICAgICAgICAgICAgIHRoZSA8bGl0ZXJhbD5tZXRob2RzPC9saXRlcmFsPiBzdWItZ3JvdXApIGNvbnRhaW5zIHN1bW1hcnkgb2Ygc3RhdGlzdGljcyBmb3IgYWxsIHJlc291cmNlIG1ldGhvZHMgZ3JvdXBlZCBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UgZW50cnkuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPkFkZGl0aW9uYWwgdXNlZnVsIGRldGFpbHMgdGhhdCBhYm91dCBzdGF0aXN0aWNzPC9wYXJhPgorICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48bGl0ZXJhbD5HbG9iYWwtPkNvbmZpZ3VyYXRpb24tPlJlZ2lzdGVyZWQoQ2xhc3Nlcy9JbnN0YW5jZXMpPC9saXRlcmFsPjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyZWQgcmVzb3VyY2UgY2xhc3NlcyBhbmQgaW5zdGFuY2VzIGJ5IHRoZSB1c2VyIChpLmUuLCBub3QgYWRkZWQgYnkgJmplcnNleS5zZXJ2ZXIuTW9kZWxQcm9jZXNzb3I7CisgICAgICAgICAgICAgICAgICAgICAgICBkdXJpbmcgZGVwbG95bWVudCBmb3IgZXhhbXBsZSkuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGxpdGVyYWw+R2xvYmFsLT5FeGNlcHRpb25NYXBwZXItPkV4Y2VwdGlvbk1hcHBlckNvdW50PC9saXRlcmFsPjoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hcCB0aGF0IGNvbnRhaW5zIGV4Y2VwdGlvbiBtYXBwZXIgY2xhc3NlcyBhcyBrZXlzIGFuZCBudW1iZXIgb2YgdGhlaXIgZXhlY3V0aW9uIGFzIHZhbHVlcy4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPkdsb2JhbC0+UmVzcG9uc2VzLT5SZXNwb25zZUNvZGVzVG9Db3VudE1hcDwvbGl0ZXJhbD46CisgICAgICAgICAgICAgICAgICAgICAgICBtYXAgdGhhdCBjb250YWlucyByZXNwb25zZSBjb2RlcyBhcyBrZXlzIGFuZCB0aGVpciB0b3RhbCBvY2N1cnJlbmNlIGluIHJlc3BvbnNlcyBhcyB2YWx1ZXMuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZSBncm91cHMgY29udGFpbiBhbHNvIGVudHJpZXMgZm9yIHJlc291cmNlcyB0aGF0IHdlcmUgYWRkZWQgYnkgSmVyc2V5IGF0IGRlcGxveW1lbnQgdGltZSB1c2luZworICAgICAgICAgICAgICAgICAgICAgICAgJmxpdC5qZXJzZXkuc2VydmVyLk1vZGVsUHJvY2Vzc29yOyAoZm9yIGV4YW1wbGUgYWxsICZsaXQuaHR0cC5PUFRJT05TOyBtZXRob2RzLCA8bGl0ZXJhbD5XQURMPC9saXRlcmFsPikuCisgICAgICAgICAgICAgICAgICAgICAgICAmbGl0Lmh0dHAuSEVBRDsgbWV0aG9kcyBhcmUgbm90IHByZXNlbnQgaW4gdGhlIE1YQmVhbnMgdmlldyAoZXZlbiBIRUFEIG1ldGhvZHMgYXJlIGluIHJlc291cmNlcykuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICBFeGVjdXRpb24gc3RhdGlzdGljcyBmb3IgZGlmZmVyZW50IHRpbWUgd2luZG93cyBoYXZlIGRpZmZlcmVudCB1cGRhdGUgaW50ZXJ2YWxzLiBUaGUgc2hvcnRlciB0aGUgdGltZSB3aW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc2hvcnRlciB0aGUgdXBkYXRlIGludGVydmFsLiBUaGlzIGNhdXNlcyB0aGF0IGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBhcHBsaWNhdGlvbiBzdGFydCwgdGhlIHNob3J0ZXIgdGltZQorICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93cyAoc3VjaCBhcyAxNSBzZWNvbmRzKSBtYXkgY29udGFpbiBoaWdoZXIgdmFsdWVzIHRoYW4gbG9uZ2VyIG9uZXMgKGUuZy4gMSBob3VyIHRpbWUgd2luZG93KS4gVGhlIHJlYXNvbgorICAgICAgICAgICAgICAgICAgICAgICAgaXMgdGhhdCAxIGhvdXIgaW50ZXJ2YWwgd2lsbCBzaG93IGluZm9ybWF0aW9uIHRoYXQgaXMgbm90IHVwIHRvIGRhdGUgYW5kIHRoZXJlZm9yZSBoYXMgc21hbGxlciB2YWx1ZS4gVGhpcworICAgICAgICAgICAgICAgICAgICAgICAgaW5jb25zaXN0ZW5jeSBpcyBub3Qgc28gbXVjaCBzaWduaWZpY2FudCB3aGVuIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcgbG9uZ2VyIHRpbWUuIFRvdGFsIHVubGltaXRlZCB0aW1lIHdpbmRvd3MKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIGFsd2F5cyB1cC10by1kYXRlIGRhdGEuIFRoaXMgaW5jb25zaXN0ZW5jeSB3aWxsIGdldCBmaXhlZCBpbiBhIGZ1dHVyZSBKZXJzZXkgcmVsZWFzZS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIE1YQmVhbnMgY2FuIGJlIGFsc28gYWNjZXNzZWQgdXNpbmcgSk1YLiBUbyBkbyBzbywgeW91IHdvdWxkIG5lZWQgdG8gdXNlIHRoZSBpbnRlcmZhY2VzIG9mIE1YQmVhbnMuCisgICAgICAgICAgICAgICAgICAgIFRoZXNlIGludGVyZmFjZXMgYXJlIGV2ZW4gdXNlZnVsIHdoZW4gd29ya2luZyB3aXRoIE1YQmVhbnMgb25seSB0cm91Z2ggPGxpdGVyYWw+SkNvbnNvbGU8L2xpdGVyYWw+IGFzCisgICAgICAgICAgICAgICAgICAgIHRoZXkgY29udGFpbiBKYXZhZG9jcyBmb3IgZWFjaCBNWEJlYW4gYW5kIGF0dHJpYnV0ZS4gTW9uaXRvcmluZyBNQmVhbnMgYXJlIGRlZmluZWQgYnkgZm9sbG93aW5nIGludGVyZmFjZXM6CisKKyAgICAgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLkFwcGxpY2F0aW9uTVhCZWFuOzogY29udGFpbnMgY29uZmlndXJhdGlvbiBzdGF0aXN0aWNzCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLkV4Y2VwdGlvbk1hcHBlck1YQmVhbjs6IGNvbnRhaW5zIHN0YXRpc3RpY3Mgb2YgZXhjZXB0aW9uIG1hcHBlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZqZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuUmVzb3VyY2VNZXRob2RNWEJlYW47OiBjb250YWlucyBzdGF0aXN0aWNzIG9mIHJlc291cmNlIG1ldGhvZAorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5SZXNvdXJjZU1YQmVhbjs6IGNvbnRhaW5zIHN0YXRpc3RpY3Mgb2YgcmVzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZqZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuUmVzcG9uc2VNWEJlYW47OiBjb250YWlucyBzdGF0aXN0aWNzIG9mIHJlc3BvbnNlcworICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorCisgICAgICAgICAgICAgICAgICAgIFRoZSBsaXN0IGRvZXMgbm90IGNvbnRhaW4gTVhCZWFuIGZvciB0aGUgZXhlY3V0aW9uIGFuZCB0aW1lIHdpbmRvdyBzdGF0aXN0aWNzLiBUaGUgcmVhc29uIGlzIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgdGhpcyBiZWFuIGlzIGRlZmluZWQgYXMgYSAmamRrNi5EeW5hbWljTUJlYW47LiBBdHRyaWJ1dGVzIG9mIHRoaXMgZHluYW1pYyBNQmVhbiBjb250YWlucworICAgICAgICAgICAgICAgICAgICBzdGF0aXN0aWNzIGZvciBhbGwgdGltZSB3aW5kb3dzIGF2YWlsYWJsZS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIE1YQmVhbnMgZG8gbm90IHJlZmVyZW5jZSBlYWNoIG90aGVyIGJ1dCBjYW4gYmUgcmV0cmlldmVkIGJ5IHRoZWlyICZqZGs2Lk9iamVjdE5hbWU7cyB3aGljaAorICAgICAgICAgICAgICAgICAgICBhcmUgZGVzaWduZWQgaW4gdGhlIHdheSwgdGhhdCBmaW5hbCBNQmVhbiB0cmVlIGxvb2tzIG5pY2VseSBvcmdhbml6ZWQgaW4gPGVtcGhhc2lzPkpDb25zb2xlPC9lbXBoYXNpcz4uCisgICAgICAgICAgICAgICAgICAgIEVhY2ggTVhCZWFuIGlzIHVuaXF1ZWx5IGlkZW50aWZpZWQgYnkgaXRzICZsaXQuamRrNi5PYmplY3ROYW1lOyBhbmQgcHJvcGVydGllcyBvZgorICAgICAgICAgICAgICAgICAgICAmbGl0LmpkazYuT2JqZWN0TmFtZTsgYXJlIHN0cnVjdHVyZWQgaGllcmFyY2hpY2FsbHksIHNvIHRoYXQgZWFjaCBNWEJlYW4gY2FuIGJlIGlkZW50aWZpZWQgdG8gd2hpY2gKKyAgICAgICAgICAgICAgICAgICAgcGFyZW50IGl0IGJlbG9uZyB0byAoZS5nLiBleGVjdXRpb24gc3RhdGlzdGljcyBkeW5hbWljIE1YQmVhbiBiZWxvbmdzIHRvIHJlc291cmNlIG1ldGhvZCBNWEJlYW4sIHdoaWNoCisgICAgICAgICAgICAgICAgICAgIGJlbG9uZ3MgdG8gcmVzb3VyY2UgYW5kIHdoaWNoIGJlbG9uZ3MgdG8gYXBwbGljYXRpb24pLiBDaGVjayB0aGUgJmxpdC5qZGs2Lk9iamVjdE5hbWU7cyBvZgorICAgICAgICAgICAgICAgICAgICBleHBvc2VkIE1YQmVhbnMgdG8gaW52ZXN0aWdhdGUgdGhlIHN0cnVjdHVyZSAoZm9yIGV4YW1wbGUgdGhyb3VnaCBKQ29uc29sZSkuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUbyByZWl0ZXJhdGUsIGV4cG9zaW5nIEplcnNleSBNWEJlYW5zIGFuZCB0aGUgY2FsY3VsYXRpbmcgbW9uaXRvcmluZyBzdGF0aXN0aWNzIG1heSBoYXZlIGFuIHBlcmZvcm1hbmNlIGltcGFjdAorICAgICAgICAgICAgICAgICAgICBvbiB5b3VyIGFwcGxpY2F0aW9uIGFuZCB0aGVyZWZvcmUgc2hvdWxkIGJlIGVuYWJsZWQgb25seSB3aGVuIG5lZWRlZC4gQWxzbywgcGxlYXNlIG5vdGUsIHRoYXQgaXQgSmVyc2V5CisgICAgICAgICAgICAgICAgICAgIG1vbml0b3JpbmcgaXMgZXhwb3NpbmcgcXVpdGUgYSBsb3Qgb2YgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1vbml0b3JlZCBhcHBsaWNhdGlvbiB3aGljaCBtaWdodCBiZSB2aWV3ZWQgYXMKKyAgICAgICAgICAgICAgICAgICAgcHJvYmxlbWF0aWMgaW4gc29tZSBjYXNlcyAoZS5nLiBpbiBwcm9kdWN0aW9uIHNlcnZlciBkZXBsb3ltZW50cykuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorICAgIDxzZWN0aW9uIHhtbDppZD0idHJhY2luZyI+CisgICAgICAgIDx0aXRsZT5UcmFjaW5nIFN1cHBvcnQ8L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEFwYXJ0IGZyb20gbW9uaXRvcmluZyBhbmQgY29sbGVjdGluZyBhcHBsaWNhdGlvbiBzdGF0aXN0aWNzIGRlc2NyaWJlZCBpbiA8eHJlZiBsaW5rZW5kPSJtb25pdG9yaW5nIi8+LCBKZXJzZXkKKyAgICAgICAgICAgIGNhbiBhbHNvIHByb3ZpZGUgdHJhY2luZyBvciBkaWFnbm9zdGljIGluZm9ybWF0aW9uIGFib3V0IHNlcnZlci1zaWRlIHByb2Nlc3Npbmcgb2YgaW5kaXZpZHVhbCByZXF1ZXN0cy4KKyAgICAgICAgICAgIFRoaXMgZmFjaWxpdHkgbWF5IHByb3ZpZGUgdml0YWwgaW5mb3JtYXRpb24gd2hlbiB0cm91Ymxlc2hvb3RpbmcgeW91ciBtaXNiZWhhdmluZyBKZXJzZXkgb3IgSkFYLVJTIGFwcGxpY2F0aW9uLgorICAgICAgICAgICAgV2hlbiBlbmFibGVkLCBKZXJzZXkgdHJhY2luZyBmYWNpbGl0eSBjb2xsZWN0cyB1c2VmdWwgaW5mb3JtYXRpb24gZnJvbSBhbGwgcGFydHMgb2YgSkFYLVJTIHNlcnZlci1zaWRlIHJlcXVlc3QKKyAgICAgICAgICAgIHByb2Nlc3NpbmcgcGlwZWxpbmU6CisgICAgICAgICAgICA8bGl0ZXJhbD5QcmVNYXRjaFJlcXVlc3RGaWx0ZXI8L2xpdGVyYWw+LCA8bGl0ZXJhbD5SZXNvdXJjZU1hdGNoaW5nPC9saXRlcmFsPiwgPGxpdGVyYWw+UmVxdWVzdEZpbHRlcjwvbGl0ZXJhbD4sCisgICAgICAgICAgICA8bGl0ZXJhbD5SZWFkSW50ZXJjZXB0PC9saXRlcmFsPiwgPGxpdGVyYWw+TUJSPC9saXRlcmFsPiwgPGxpdGVyYWw+SW52b2tlPC9saXRlcmFsPiwKKyAgICAgICAgICAgIDxsaXRlcmFsPlJlc3BvbnNlRmlsdGVyPC9saXRlcmFsPiwgPGxpdGVyYWw+V3JpdGVJbnRlcmNlcHQ8L2xpdGVyYWw+LCA8bGl0ZXJhbD5NQlc8L2xpdGVyYWw+LCBhcyB3ZWxsIGFzCisgICAgICAgICAgICA8bGl0ZXJhbD5FeGNlcHRpb25IYW5kbGluZzwvbGl0ZXJhbD4uCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaGUgY29sbGVjdGVkIHRyYWNpbmcgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBhIHNpbmdsZSByZXF1ZXN0IGlzIHJldHVybmVkIHRvIHRoZSByZXF1ZXN0aW5nIGNsaWVudCBpbiB0aGUgSFRUUAorICAgICAgICAgICAgaGVhZGVycyBvZiBhIHJlc3BvbnNlIGZvciB0aGUgcmVxdWVzdC4gVGhlIGluZm9ybWF0aW9uIGlzIGFsc28gbG9nZ2VkIG9uIHRoZSBzZXJ2ZXIgc2lkZSB1c2luZyBhIGRlZGljYXRlZCBKYXZhCisgICAgICAgICAgICBMb2dnZXIgaW5zdGFuY2UuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHNlY3Rpb24geG1sOmlkPSJ0cmFjaW5nLmNvbmZpZ3VyYXRpb24iPgorICAgICAgICAgICAgPHRpdGxlPkNvbmZpZ3VyYXRpb24gb3B0aW9uczwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUcmFjaW5nIHN1cHBvcnQgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4gWW91IGNhbiBlbmFibGUgaXQgZWl0aGVyICJnbG9iYWxseSIgZm9yIGFsbCBhcHBsaWNhdGlvbiByZXF1ZXN0cworICAgICAgICAgICAgICAgIG9yIHNlbGVjdGl2ZWx5IHBlciByZXF1ZXN0LiBUaGUgdHJhY2luZyBzdXBwb3J0IGFjdGl2YXRpb24gaXMgY29udHJvbGxlZCBieSBzZXR0aW5nIHRoZQorICAgICAgICAgICAgICAgIDxsaXRlcmFsPmplcnNleS5jb25maWcuc2VydmVyLnRyYWNpbmcudHlwZTwvbGl0ZXJhbD4gYXBwbGljYXRpb24gY29uZmlndXJhdGlvbiBwcm9wZXJ0eS4gVGhlIHByb3BlcnR5IHZhbHVlCisgICAgICAgICAgICAgICAgaXMgZXhwZWN0ZWQgdG8gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6CisKKyAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5PRkY8L2xpdGVyYWw+IC0gdHJhY2luZyBzdXBwb3J0IGlzIGRpc2FibGVkIChkZWZhdWx0IHZhbHVlKS4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+T05fREVNQU5EPC9saXRlcmFsPiAtIHRyYWNpbmcgc3VwcG9ydCBpcyBpbiBhIHN0YW5kLWJ5IG1vZGU7IGl0IGlzIGVuYWJsZWQgc2VsZWN0aXZlbHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXIgcmVxdWVzdCwgdmlhIGEgc3BlY2lhbCA8bGl0ZXJhbD5YLUplcnNleS1UcmFjaW5nLUFjY2VwdDwvbGl0ZXJhbD4gSFRUUCByZXF1ZXN0IGhlYWRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+QUxMPC9saXRlcmFsPiAtIHRyYWNpbmcgc3VwcG9ydCBpcyBlbmFibGVkIGZvciBhbGwgcmVxdWVzdC4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoZSBsZXZlbCBvZiBkZXRhaWwgb2YgdGhlIGluZm9ybWF0aW9uIHByb3ZpZGVkIGJ5IEplcnNleSB0cmFjaW5nIGZhY2lsaXR5IC0gdGhlIHRyYWNpbmcgdGhyZXNob2xkIC0gY2FuIGJlCisgICAgICAgICAgICAgICAgY3VzdG9taXplZC4gVGhlIHRyYWNpbmcgdGhyZXNob2xkIGNhbiBiZSBzZXQgYXQgdGhlIGFwcGxpY2F0aW9uIGxldmVsIHZpYQorICAgICAgICAgICAgICAgIDxsaXRlcmFsPmplcnNleS5jb25maWcuc2VydmVyLnRyYWNpbmcudGhyZXNob2xkPC9saXRlcmFsPiBhcHBsaWNhdGlvbiBjb25maWd1cmF0aW9uIHByb3BlcnR5LAorICAgICAgICAgICAgICAgIG9yIGF0IGEgcmVxdWVzdCBsZXZlbCwgdmlhIDxsaXRlcmFsPlgtSmVyc2V5LVRyYWNpbmctVGhyZXNob2xkPC9saXRlcmFsPiBIVFRQIHJlcXVlc3QgaGVhZGVyLiBUaGUgcmVxdWVzdCBsZXZlbAorICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gb3ZlcnJpZGVzIGFueSBhcHBsaWNhdGlvbiBsZXZlbCBzZXR0aW5nLiBUaGVyZSBhcmUgMyBzdXBwb3J0ZWQgbGV2ZWxzIG9mIGRldGFpbCBmb3IgSmVyc2V5IHRyYWNpbmc6CisgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+U1VNTUFSWTwvbGl0ZXJhbD4gLSB2ZXJ5IGJhc2ljIHN1bW1hcnkgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1haW4gcmVxdWVzdCBwcm9jZXNzaW5nIHN0YWdlcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+VFJBQ0U8L2xpdGVyYWw+IC0gZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgYWN0aXZpdGllcyBpbiBhbGwgdGhlIG1haW4gcmVxdWVzdCBwcm9jZXNzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhZ2VzIChkZWZhdWx0IHRocmVzaG9sZCB2YWx1ZSkuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPlZFUkJPU0U8L2xpdGVyYWw+IC0gbW9zdCB2ZXJib3NlIG1vZGUgdGhhdCBwcm92aWRlcyBleHRlbmRlZCBpbmZvcm1hdGlvbiBzaW1pbGFyIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+VFJBQ0U8L2xpdGVyYWw+IGxldmVsLCBob3dldmVyIHdpdGggZGV0YWlscyBvbiBlbnRpdHkgcHJvdmlkZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDxsaXRlcmFsPk1CUjwvbGl0ZXJhbD4vPGxpdGVyYWw+TUJXPC9saXRlcmFsPikgdGhhdCB3ZXJlIHNraXBwZWQgZHVyaW5nIHRoZSBwcm92aWRlciBzZWxlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaGFzZSBmb3IgYW55IHJlYXNvbiAobG93ZXIgcHJpb3JpdHksIHBhdHRlcm4gbWF0Y2hpbmcsIGV0YykuIEFkZGl0aW9uYWxseSwgaW4gdGhpcyBtb2RlIGFsbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkIHJlcXVlc3QgaGVhZGVycyBhcmUgZWNob2VkIGFzIHBhcnQgb2YgdGhlIHRyYWNpbmcgaW5mb3JtYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICA8dGl0bGU+VHJhY2luZyBMb2c8L3RpdGxlPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgQXMgbWVudGlvbmVkIGVhcmxpZXIsIGFsbCB0cmFjaW5nIGluZm9ybWF0aW9uIGlzIGFsc28gbG9nZ2VkIHVzaW5nIGEgZGVkaWNhdGVkIEphdmEgTG9nZ2VyLiBUaGUgaW5kaXZpZHVhbAorICAgICAgICAgICAgICAgIHRyYWNpbmcgbWVzc2FnZXMgYXJlIGxvZ2dlZCBpbW1lZGlhdGVseSBhcyB0aGUgdHJhY2luZyBldmVudHMgb2NjdXIuIFRoZSBkZWZhdWx0IG5hbWUgb2YgdGhlIHRyYWNpbmcgbG9nZ2VyCisgICAgICAgICAgICAgICAgaXMgcHJlZml4ZWQgPGxpdGVyYWw+b3JnLmdsYXNzZmlzaC5qZXJzZXkudHJhY2luZy48L2xpdGVyYWw+IHdpdGggYSBkZWZhdWx0IHN1ZmZpeCA8bGl0ZXJhbD5nZW5lcmFsPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICBUaGlzIGxvZ2dlciBuYW1lIGNhbiBiZSBjdXN0b21pemVkIHBlciByZXF1ZXN0IGJ5IGluY2x1ZGluZyBhIDxsaXRlcmFsPlgtSmVyc2V5LVRyYWNpbmctTG9nZ2VyPC9saXRlcmFsPgorICAgICAgICAgICAgICAgIEhUVFAgcmVxdWVzdCBoZWFkZXIgYXMgd2lsbCBiZSBzaG93biBsYXRlci4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8c2VjdGlvbj4KKyAgICAgICAgICAgIDx0aXRsZT5Db25maWd1cmluZyB0cmFjaW5nIHN1cHBvcnQgdmlhIEhUVFAgcmVxdWVzdCBoZWFkZXJzPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFdoZW5ldmVyIHRoZSB0cmFjaW5nIHN1cHBvcnQgaXMgYWN0aXZlICg8bGl0ZXJhbD5PTl9ERU1BTkQ8L2xpdGVyYWw+IG9yIDxsaXRlcmFsPkFMTDwvbGl0ZXJhbD4pIHlvdQorICAgICAgICAgICAgICAgIGNhbiBjdXN0b21pemUgdGhlIHRyYWNpbmcgYmVoYXZpb3VyIGJ5IGluY2x1ZGluZyBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHJlcXVlc3QgSFRUUCBoZWFkZXJzIGluIHlvdXIKKyAgICAgICAgICAgICAgICBpbmRpdmlkdWFsIHJlcXVlc3RzOgorICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPlgtSmVyc2V5LVRyYWNpbmctQWNjZXB0PC9saXRlcmFsPiAtIHVzZWQgdG8gZW5hYmxlIHRoZSB0cmFjaW5nIHN1cHBvcnQgZm9yIHRoZSBwYXJ0aWN1bGFyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC4gSXQgaXMgYXBwbGllZCBvbmx5IHdoZW4gdGhlIGFwcGxpY2F0aW9uLWxldmVsIHRyYWNpbmcgc3VwcG9ydCBpcyBjb25maWd1cmVkIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+T05fREVNQU5EPC9saXRlcmFsPiBtb2RlLiBUaGUgdmFsdWUgb2YgdGhlIGhlYWRlciBpcyBub3QgdXNlZCBieSB0aGUgSmVyc2V5IHRyYWNpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWNpbGl0eSBhbmQgYXMgc3VjaCBpdCBjYW4gYmUgYW55IGFyYml0cmFyeSAoZXZlbiBlbXB0eSkgc3RyaW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5YLUplcnNleS1UcmFjaW5nLVRocmVzaG9sZDwvbGl0ZXJhbD4gLSB1c2VkIHRvIG92ZXJyaWRlIHRoZSB0cmFjaW5nIGxldmVsIG9mIGRldGFpbC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvd2VkIHZhbHVlcyBhcmU6IDxsaXRlcmFsPlNVTU1BUlk8L2xpdGVyYWw+LCA8bGl0ZXJhbD5UUkFDRTwvbGl0ZXJhbD4sIDxsaXRlcmFsPlZFUkJPU0U8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5YLUplcnNleS1UcmFjaW5nLUxvZ2dlcjwvbGl0ZXJhbD4gLSB1c2VkIHRvIG92ZXJyaWRlIHRoZSB0cmFjaW5nIEphdmEgbG9nZ2VyIG5hbWUgc3VmZml4LgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDxzZWN0aW9uPgorICAgICAgICAgICAgPHRpdGxlPkZvcm1hdCBvZiB0aGUgSFRUUCByZXNwb25zZSBoZWFkZXJzPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEF0IHRoZSBlbmQgb2YgcmVxdWVzdCBwcm9jZXNzaW5nIGFsbCB0cmFjaW5nIG1lc3NhZ2VzIGFyZSBhcHBlbmRlZCB0byB0aGUgSFRUUCByZXNwb25zZSBhcyBpbmRpdmlkdWFsCisgICAgICAgICAgICAgICAgaGVhZGVycyBuYW1lZCA8bGl0ZXJhbD5YLUplcnNleS1UcmFjaW5nLTwvbGl0ZXJhbD48ZW1waGFzaXM+PGxpdGVyYWw+bm5uPC9saXRlcmFsPjwvZW1waGFzaXM+IHdoZXJlCisgICAgICAgICAgICAgICAgPGVtcGhhc2lzPjxsaXRlcmFsPm5ubjwvbGl0ZXJhbD48L2VtcGhhc2lzPiBpcyBpbmRleCBudW1iZXIgb2YgbWVzc2FnZSBzdGFydGluZyBhdCA8bGl0ZXJhbD4wPC9saXRlcmFsPi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEVhY2ggdHJhY2luZyBtZXNzYWdlIGlzIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0OiA8bGl0ZXJhbD5DQVRFR09SWSBbVElNRV0gVEVYVDwvbGl0ZXJhbD4sIGUuZy4KKyAgICAgICAgICAgICAgICA8c2NyZWVuPlgtSmVyc2V5LVRyYWNpbmctMDA3OiBXSSAgICAgICAgICBbODUuOTUgLyAxODMuNjkgbXMgfCA0Ni43NyAlXSBXcml0ZVRvIHN1bW1hcnk6IDQgaW50ZXJjZXB0b3JzPC9zY3JlZW4+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgPGxpdGVyYWw+Q0FURUdPUlk8L2xpdGVyYWw+IGlzIHVzZWQgdG8gY2F0ZWdvcml6ZSB0cmFjaW5nIGV2ZW50cyBhY2NvcmRpbmcgdG8gdGhlIGZvbGxvd2luZworICAgICAgICAgICAgICAgIGV2ZW50IHR5cGVzOgorICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPlNUQVJUPC9saXRlcmFsPiAtIHN0YXJ0IG9mIHJlcXVlc3QgcHJvY2Vzc2luZyBpbmZvcm1hdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5QUkUtTUFUQ0g8L2xpdGVyYWw+IC0gcHJlLW1hdGNoaW5nIHJlcXVlc3QgZmlsdGVyIHByb2Nlc3NpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+TUFUQ0g8L2xpdGVyYWw+IC0gbWF0Y2hpbmcgcmVxdWVzdCBVUkkgdG8gYSByZXNvdXJjZSBtZXRob2QKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+UkVRLUZJTFRFUjwvbGl0ZXJhbD4gLSByZXF1ZXN0IGZpbHRlciBwcm9jZXNzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPlJJPC9saXRlcmFsPiAtIGVudGl0eSByZWFkZXIgaW50ZXJjZXB0b3IgcHJvY2Vzc2luZworICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5NQlI8L2xpdGVyYWw+IC0gbWVzc2FnZSBib2R5IHJlYWRlciBzZWxlY3Rpb24gYW5kIGludm9jYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+SU5WT0tFPC9saXRlcmFsPiAtIHJlc291cmNlIG1ldGhvZCBpbnZvY2F0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPlJFU1AtRklMVEVSPC9saXRlcmFsPiAtIHJlc3BvbnNlIGZpbHRlciBwcm9jZXNzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPldJPC9saXRlcmFsPiAtIHdyaXRlIGludGVyY2VwdG9yIHByb2Nlc3NpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+TUJXPC9saXRlcmFsPiAtIG1lc3NhZ2UgYm9keSB3cml0ZXIgc2VsZWN0aW9uIGFuZCBpbnZvY2F0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPk1WQzwvbGl0ZXJhbD4gLSB0ZW1wbGF0ZSBlbmdpbmUgaW50ZWdyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+RVhDRVBUSU9OPC9saXRlcmFsPiAtIGV4Y2VwdGlvbiBtYXBwaW5nCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPkZJTklTSEVEPC9saXRlcmFsPiAtIHByb2Nlc3NpbmcgZmluaXNoIHN1bW1hcnkKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoZSA8bGl0ZXJhbD5USU1FPC9saXRlcmFsPiwgaWYgcHJlc2VudCwgaXMgYSBjb21wb3NpdGUgdmFsdWUgdGhhdCBjb25zaXN0cyBvZiAzIHBhcnRzCisgICAgICAgICAgICAgICAgPGxpdGVyYWw+WyBkdXJhdGlvbiAvIHRpbWVfZnJvbV9zdGFydCB8IHRvdGFsX3JlcV9yYXRpbyBdPC9saXRlcmFsPjoKKyAgICAgICAgICAgICAgICA8b3JkZXJlZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmR1cmF0aW9uPC9saXRlcmFsPiAtIHRoZSBkdXJhdGlvbiBvZiB0aGUgY3VycmVudCB0cmFjZSBldmVudCBbbWlsbGlzZWNvbmRzXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmcuIGR1cmF0aW9uIG9mIGZpbHRlciBwcm9jZXNzaW5nCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPnRpbWVfZnJvbV9zdGFydDwvbGl0ZXJhbD4gLSB0aGUgZW5kIHRpbWUgb2YgdGhlIGN1cnJlbnQgZXZlbnQgd2l0aCByZXNwZWN0IHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHJlcXVlc3QgcHJvY2Vzc2luZyBzdGFydCB0aW1lIFttaWxsaXNlY29uZHNdCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPnRvdGFsX3JlcV9yYXRpbzwvbGl0ZXJhbD4gLSB0aGUgZHVyYXRpb24gb2YgdGhlIGN1cnJlbnQgZXZlbnQgd2l0aCByZXNwZWN0IHRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRvdGFsIHJlcXVlc3QgcHJvY2Vzc2luZyB0aW1lIFtwZXJjZW50YWdlXTsgdGhpcyB2YWx1ZSB0ZWxscyB5b3UgaG93IHNpZ25pZmljYW50IHBhcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiB0aGUgd2hvbGUgcmVxdWVzdCBwcm9jZXNzaW5nIHRpbWUgaGFzIGJlZW4gc3BlbnQgaW4gdGhlIHByb2Nlc3NpbmcgcGhhc2UgZGVzY3JpYmVkIGJ5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGN1cnJlbnQgZXZlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L29yZGVyZWRsaXN0PgorICAgICAgICAgICAgICAgIFRoZXJlIGFyZSBjZXJ0YWluIHRyYWNpbmcgZXZlbnRzIHRoYXQgZG8gbm90IGhhdmUgYW55IGR1cmF0aW9uLiBJbiBzdWNoIGNhc2UsIGR1cmF0aW9uIHZhbHVlcyBhcmUgbm90IHNldAorICAgICAgICAgICAgICAgICg8bGl0ZXJhbD4tLS0tPC9saXRlcmFsPiBsaXRlcmFsKS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoZSB0cmFjaW5nIGV2ZW50IDxsaXRlcmFsPlRFWFQ8L2xpdGVyYWw+IGlzIGEgZnJlZS1mb3JtIGRldGFpbGVkIHRleHQgaW5mb3JtYXRpb24gYWJvdXQgdGhlCisgICAgICAgICAgICAgICAgY3VycmVudCBkaWFnbm9zdGljIGV2ZW50LgorICAgICAgICAgICAgICAgIDx0aXA+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgRm9yIGJldHRlciBpZGVudGlmaWNhdGlvbiwgaW5zdGFuY2VzIG9mIEpBWC1SUyBjb21wb25lbnRzIGFyZSByZXByZXNlbnRlZCBieSBjbGFzcyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpdHkgaGFzaCBjb2RlIGFuZCA8bGl0ZXJhbD5AUHJpb3JpdHk8L2xpdGVyYWw+IHZhbHVlIGlmIHNldCwgZS5nLgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+W29yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnRyYWNpbmcuQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXI1MDAxIEA0OTRhODIyNyAjNTAwMV08L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC90aXA+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICA8dGl0bGU+VHJhY2luZyBFeGFtcGxlczwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBFeGFtcGxlIG9mIDxsaXRlcmFsPlNVTU1BUlk8L2xpdGVyYWw+IGxldmVsIG1lc3NhZ2VzCisgICAgICAgICAgICAgICAgZnJvbSA8bGl0ZXJhbD50ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQ8L2xpdGVyYWw+IG1vZHVsZToKKyAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgPHRpdGxlPlN1bW1hcnkgbGV2ZWwgbWVzc2FnZXM8L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICA8c2NyZWVuIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj48IVtDREFUQVskIGN1cmwgLWkgaHR0cDovL2xvY2FsaG9zdDo5OTk4L0FMTC9yb290L3N1Yi1yZXNvdXJjZS1sb2NhdG9yL3N1Yi1yZXNvdXJjZS1tZXRob2QgLUggY29udGVudC10eXBlOmFwcGxpY2F0aW9uL3gtamVyc2V5LXRlc3QgLS1kYXRhICctPSNbTEtSXSM9LScgLUggWC1KZXJzZXktVHJhY2luZy1UaHJlc2hvbGQ6U1VNTUFSWSAtSCBhY2NlcHQ6YXBwbGljYXRpb24veC1qZXJzZXktdGVzdCAtWCBQT1NUCisKK1gtSmVyc2V5LVRyYWNpbmctMDAwOiBTVEFSVCAgICAgICBbIC0tLS0gLyAgLS0tLSBtcyB8ICAtLS0tICVdIGJhc2VVcmk9W2h0dHA6Ly9sb2NhbGhvc3Q6OTk5OC9BTEwvXSByZXF1ZXN0VXJpPVtodHRwOi8vbG9jYWxob3N0Ojk5OTgvQUxML3Jvb3Qvc3ViLXJlc291cmNlLWxvY2F0b3Ivc3ViLXJlc291cmNlLW1ldGhvZF0gbWV0aG9kPVtQT1NUXSBhdXRoU2NoZW1lPVtuL2FdIGFjY2VwdD1bYXBwbGljYXRpb24veC1qZXJzZXktdGVzdF0gYWNjZXB0LWVuY29kaW5nPW4vYSBhY2NlcHQtY2hhcnNldD1uL2EgYWNjZXB0LWxhbmd1YWdlPW4vYSBjb250ZW50LXR5cGU9W2FwcGxpY2F0aW9uL3gtamVyc2V5LXRlc3RdIGNvbnRlbnQtbGVuZ3RoPVsxMV0KK1gtSmVyc2V5LVRyYWNpbmctMDAxOiBQUkUtTUFUQ0ggICBbIDAuMDEgLyAgMC42OCBtcyB8ICAwLjAxICVdIFByZU1hdGNoUmVxdWVzdCBzdW1tYXJ5OiAyIGZpbHRlcnMKK1gtSmVyc2V5LVRyYWNpbmctMDAyOiBNQVRDSCAgICAgICBbIDguNDQgLyAgOS4xNSBtcyB8ICA0LjU5ICVdIFJlcXVlc3RNYXRjaGluZyBzdW1tYXJ5CitYLUplcnNleS1UcmFjaW5nLTAwMzogUkVRLUZJTFRFUiAgWyAwLjAxIC8gIDkuMjAgbXMgfCAgMC4wMCAlXSBSZXF1ZXN0IHN1bW1hcnk6IDIgZmlsdGVycworWC1KZXJzZXktVHJhY2luZy0wMDQ6IFJJICAgICAgICAgIFs4Ni4xNCAvIDk1LjQ5IG1zIHwgNDYuODcgJV0gUmVhZEZyb20gc3VtbWFyeTogMyBpbnRlcmNlcHRvcnMKK1gtSmVyc2V5LVRyYWNpbmctMDA1OiBJTlZPS0UgICAgICBbIDAuMDQgLyA5NS43MCBtcyB8ICAwLjAyICVdIFJlc291cmNlIFtvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi50cmFjaW5nLlN1YlJlc291cmNlIEA5MDFhNGYzXSBtZXRob2Q9W3B1YmxpYyBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi50cmFjaW5nLk1lc3NhZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24udHJhY2luZy5TdWJSZXNvdXJjZS5wb3N0U3ViKG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnRyYWNpbmcuTWVzc2FnZSldCitYLUplcnNleS1UcmFjaW5nLTAwNjogUkVTUC1GSUxURVIgWyAwLjAxIC8gOTYuNTUgbXMgfCAgMC4wMCAlXSBSZXNwb25zZSBzdW1tYXJ5OiAyIGZpbHRlcnMKK1gtSmVyc2V5LVRyYWNpbmctMDA3OiBXSSAgICAgICAgICBbODUuOTUgLyAxODMuNjkgbXMgfCA0Ni43NyAlXSBXcml0ZVRvIHN1bW1hcnk6IDQgaW50ZXJjZXB0b3JzCitYLUplcnNleS1UcmFjaW5nLTAwODogRklOSVNIRUQgICAgWyAtLS0tIC8gMTgzLjc5IG1zIHwgIC0tLS0gJV0gUmVzcG9uc2Ugc3RhdHVzOiAyMDAvU1VDQ0VTU0ZVTHxPS11dPjwvc2NyZWVuPgorICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEV4YW1wbGUgPGxpdGVyYWw+VFJBQ0U8L2xpdGVyYWw+IGxldmVsIG1lc3NhZ2VzIG9mIDxsaXRlcmFsPmplcnNleS1tdmMtanNwPC9saXRlcmFsPiBpbnRlZ3JhdGlvbiwKKyAgICAgICAgICAgICAgICBmcm9tIDxsaXRlcmFsPmV4YW1wbGVzL2Jvb2tzdG9yZS13ZWJhcHA8L2xpdGVyYWw+IG1vZHVsZToKKyAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgPHRpdGxlPk9uIGRlbWFuZCByZXF1ZXN0LCBzbmlwcGV0IG9mIE1WQyBKU1AgZm9yd2FyZGluZzwvdGl0bGU+CisgICAgICAgICAgICAgICAgICAgIDxzY3JlZW4gbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPjwhW0NEQVRBWyQgY3VybCAtaSBodHRwOi8vbG9jYWxob3N0Ojk5OTgvaXRlbXMvMy90cmFja3MvMCAtSCBYLUplcnNleS1UcmFjaW5nLUFjY2VwdDp3aGF0ZXZlcgorCisuLi4KK1gtSmVyc2V5LVRyYWNpbmctMDMzOiBXSSAgICAgICAgICBbIDAuMDAgLyAyMy4zOSBtcyB8ICAwLjAyICVdIFtvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLmludGVybmFsLlRlbXBsYXRlTWV0aG9kSW50ZXJjZXB0b3IgQDE0MWJjZDQ5ICM0MDAwXSBCRUZPUkUgY29udGV4dC5wcm9jZWVkKCkKK1gtSmVyc2V5LVRyYWNpbmctMDM0OiBXSSAgICAgICAgICBbIDAuMDEgLyAyMy40MiBtcyB8ICAwLjAyICVdIFtvcmcuZ2xhc3NmaXNoLmplcnNleS5maWx0ZXIuTG9nZ2luZ0ZpbHRlciBAMmQ0MjdkZWYgIy0yMTQ3NDgzNjQ4XSBCRUZPUkUgY29udGV4dC5wcm9jZWVkKCkKK1gtSmVyc2V5LVRyYWNpbmctMDM1OiBNQlcgICAgICAgICBbIC0tLS0gLyAyMy40NSBtcyB8ICAtLS0tICVdIEZpbmQgTUJXIGZvciB0eXBlPVtvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLmludGVybmFsLkltcGxpY2l0Vmlld2FibGVdIGdlbmVyaWNUeXBlPVtvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLmludGVybmFsLkltcGxpY2l0Vmlld2FibGVdIG1lZGlhVHlwZT1bW2phdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlIEA3YmZiZmVhZV1dIGFubm90YXRpb25zPVtdCitYLUplcnNleS1UcmFjaW5nLTAzNjogTUJXICAgICAgICAgWyAtLS0tIC8gMjMuNTIgbXMgfCAgLS0tLSAlXSBbb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5pbnRlcm5hbC5WaWV3YWJsZU1lc3NhZ2VCb2R5V3JpdGVyIEA3OGIzNTNkNF0gSVMgd3JpdGVhYmxlCitYLUplcnNleS1UcmFjaW5nLTAzNzogTVZDICAgICAgICAgWyAtLS0tIC8gMjQuMDUgbXMgfCAgLS0tLSAlXSBGb3J3YXJkaW5nIHZpZXcgdG8gSlNQIHBhZ2UgWy9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9ib29rc3RvcmUvd2ViYXBwL3Jlc291cmNlL1RyYWNrL2luZGV4LmpzcF0sIG1vZGVsIFtvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5ib29rc3RvcmUud2ViYXBwLnJlc291cmNlLlRyYWNrIEAzOTM3ZjU5NF0KK1gtSmVyc2V5LVRyYWNpbmctMDM4OiBNQlcgICAgICAgICBbIDEuMDkgLyAyNC42MyBtcyB8ICA0LjM5ICVdIFdyaXRlVG8gYnkgW29yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuaW50ZXJuYWwuVmlld2FibGVNZXNzYWdlQm9keVdyaXRlciBANzhiMzUzZDRdCitYLUplcnNleS1UcmFjaW5nLTAzOTogV0kgICAgICAgICAgWyAwLjAwIC8gMjQuNjcgbXMgfCAgMC4wMSAlXSBbb3JnLmdsYXNzZmlzaC5qZXJzZXkuZmlsdGVyLkxvZ2dpbmdGaWx0ZXIgQDJkNDI3ZGVmICMtMjE0NzQ4MzY0OF0gQUZURVIgY29udGV4dC5wcm9jZWVkKCkKK1gtSmVyc2V5LVRyYWNpbmctMDQwOiBXSSAgICAgICAgICBbIDAuMDAgLyAyNC43MCBtcyB8ICAwLjAxICVdIFtvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLmludGVybmFsLlRlbXBsYXRlTWV0aG9kSW50ZXJjZXB0b3IgQDE0MWJjZDQ5ICM0MDAwXSBBRlRFUiBjb250ZXh0LnByb2NlZWQoKQorLi4uXV0+PC9zY3JlZW4+CisgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorPC9jaGFwdGVyPgpkaWZmIC0tZ2l0IGEvZG9jcy9zcmMvbWFpbi9kb2Nib29rL212Yy54bWwgYi9kb2NzL3NyYy9tYWluL2RvY2Jvb2svbXZjLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmJlMjJjCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9zcmMvbWFpbi9kb2Nib29rL212Yy54bWwKQEAgLTAsMCArMSw3OTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzwhRE9DVFlQRSBjaGFwdGVyIFs8IUVOVElUWSAlIGVudHMgU1lTVEVNICJqZXJzZXkuZW50IiA+ICVlbnRzO10+Cis8Y2hhcHRlciB4bWxucz0iaHR0cDovL2RvY2Jvb2sub3JnL25zL2RvY2Jvb2siCisgICAgICAgICB2ZXJzaW9uPSI1LjAiCisgICAgICAgICB4bWw6bGFuZz0iZW4iCisgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiCisgICAgICAgICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKKyAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2RvY2Jvb2sub3JnL25zL2RvY2Jvb2sgaHR0cDovL2RvY2Jvb2sub3JnL3htbC81LjAveHNkL2RvY2Jvb2sueHNkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsgaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluay54c2QiCisgICAgICAgICB4bWw6aWQ9Im12YyI+CisgICAgPHRpdGxlPk1WQyBUZW1wbGF0ZXM8L3RpdGxlPgorCisgICAgPHBhcmE+CisgICAgICAgIEplcnNleSBwcm92aWRlcyBhbiBleHRlbnNpb24gdG8gc3VwcG9ydCB0aGUgTW9kZWwtVmlldy1Db250cm9sbGVyIChNVkMpIGRlc2lnbiBwYXR0ZXJuLgorICAgICAgICBJbiB0aGUgY29udGV4dCBvZiBKZXJzZXkgY29tcG9uZW50cywgdGhlIENvbnRyb2xsZXIgZnJvbSB0aGUgTVZDIHBhdHRlcm4gY29ycmVzcG9uZHMgdG8gYSByZXNvdXJjZSBjbGFzcyBvciBtZXRob2QsCisgICAgICAgIHRoZSBWaWV3IHRvIGEgdGVtcGxhdGUgYm91bmQgdG8gdGhlIHJlc291cmNlIGNsYXNzIG9yIG1ldGhvZCwgYW5kIHRoZSBtb2RlbCB0byBhIEphdmEgb2JqZWN0IChvciBhIEphdmEgYmVhbikgcmV0dXJuZWQKKyAgICAgICAgZnJvbSBhIHJlc291cmNlIG1ldGhvZCAoQ29udHJvbGxlcikuCisgICAgPC9wYXJhPgorCisgICAgPG5vdGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgU29tZSBvZiB0aGUgcGFzc2FnZXMvZXhhbXBsZXMgZnJvbSB0aGlzIGNoYXB0ZXIgaGF2ZSBiZWVuIHRha2VuIGZyb20KKyAgICAgICAgICAgIDxsaW5rIHhsaW5rOmhyZWY9Imh0dHBzOi8vYmxvZ3Mub3JhY2xlLmNvbS9zYW5kb3ovZW50cnkvbXZjaiI+TVZDSjwvbGluaz4gYmxvZyBhcnRpY2xlIHdyaXR0ZW4gYnkgUGF1bCBTYW5kb3ouCisgICAgICAgIDwvcGFyYT4KKyAgICA8L25vdGU+CisKKyAgICA8cGFyYT4KKyAgICAgICAgSW4gSmVyc2V5IDIsIHRoZSBiYXNlIE1WQyBBUEkgY29uc2lzdHMgb2YgdHdvIGNsYXNzZXMgKDxsaXRlcmFsPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmM8L2xpdGVyYWw+IHBhY2thZ2UpCisgICAgICAgIHRoYXQgY2FuIGJlIHVzZWQgdG8gYmluZCBtb2RlbCB0byB2aWV3ICh0ZW1wbGF0ZSksIG5hbWVseSAmamVyc2V5LnNlcnZlci5tdmMuVmlld2FibGU7IGFuZCAmamVyc2V5LnNlcnZlci5tdmMuVGVtcGxhdGU7LgorICAgICAgICBUaGVzZSBjbGFzc2VzIGRldGVybWluZSB3aGljaCBhcHByb2FjaCAoZXhwbGljaXQvaW1wbGljaXQpIHlvdSB3b3VsZCBiZSB0YWtpbmcgd2hlbiB3b3JraW5nIHdpdGggSmVyc2V5IE1WQworICAgICAgICB0ZW1wbGF0aW5nIHN1cHBvcnQuCisgICAgPC9wYXJhPgorCisgICAgPHNlY3Rpb24+CisgICAgICAgIDx0aXRsZT5WaWV3YWJsZTwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBJbiB0aGlzIGFwcHJvYWNoIGEgcmVzb3VyY2UgbWV0aG9kIGV4cGxpY2l0bHkgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBhIHZpZXcgdGVtcGxhdGUgYW5kIHRoZSBkYXRhIG1vZGVsIHRvIGJlCisgICAgICAgICAgICB1c2VkLiBGb3IgdGhpcyBwdXJwb3NlIHRoZSAmamVyc2V5LnNlcnZlci5tdmMuVmlld2FibGU7IGNsYXNzIGhhcyBiZWVuIGludHJvZHVjZWQgaW4gSmVyc2V5IDEgYW5kIGlzIGFsc28KKyAgICAgICAgICAgIHByZXNlbnQgKHVuZGVyIGEgZGlmZmVyZW50IHBhY2thZ2UpIGluIEplcnNleSAyLiBBIHNpbXBsZSBleGFtcGxlIG9mIHVzYWdlIGNhbiBiZSBzZWVuIGluCisgICAgICAgICAgICA8eHJlZiBsaW5rZW5kPSJtdmMuZXhhbXBsZS52aWV3YWJsZS5zaW1wbGUiLz4uCisKKyAgICAgICAgICAgIDxleGFtcGxlIHhtbDppZD0ibXZjLmV4YW1wbGUudmlld2FibGUuc2ltcGxlIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+VXNpbmcgJmxpdC5qZXJzZXkuc2VydmVyLm12Yy5WaWV3YWJsZTsgaW4gYSByZXNvdXJjZSBjbGFzczwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiPnBhY2thZ2UgY29tLmV4YW1wbGU7CisKK0BQYXRoKCJmb28iKQorcHVibGljIGNsYXNzIEZvbyB7CisKKyAgICBAR0VUCisgICAgcHVibGljIFZpZXdhYmxlIGdldCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBWaWV3YWJsZSgiaW5kZXguZm9vIiwgIkZPTyIpOworICAgIH0KK308L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgSW4gdGhpcyBleGFtcGxlLCB0aGUgPGxpdGVyYWw+Rm9vPC9saXRlcmFsPiBKQVgtUlMgcmVzb3VyY2UgY2xhc3MgaXMgdGhlIGNvbnRyb2xsZXIgYW5kIHRoZQorICAgICAgICAgICAgJmxpdC5qZXJzZXkuc2VydmVyLm12Yy5WaWV3YWJsZTsgaW5zdGFuY2UgZW5jYXBzdWxhdGVzIHRoZSBwcm92aWRlZCBkYXRhIG1vZGVsICg8bGl0ZXJhbD5GT088L2xpdGVyYWw+IHN0cmluZykKKyAgICAgICAgICAgIGFuZCBhIG5hbWVkIHJlZmVyZW5jZSB0byB0aGUgYXNzb2NpYXRlZCB2aWV3IHRlbXBsYXRlICg8bGl0ZXJhbD5pbmRleC5mb288L2xpdGVyYWw+KS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8dGlwPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgQWxsIEhUVFAgbWV0aG9kcyBtYXkgcmV0dXJuICZsaXQuamVyc2V5LnNlcnZlci5tdmMuVmlld2FibGU7IGluc3RhbmNlcy4gVGh1cyBhICZsaXQuaHR0cC5QT1NUOyBtZXRob2QgbWF5CisgICAgICAgICAgICAgICAgcmV0dXJuIGEgdGVtcGxhdGUgcmVmZXJlbmNlIHRvIGEgdGVtcGxhdGUgdGhhdCBwcm9kdWNlcyBhIHZpZXcgYXMgYSByZXN1bHQgb2YgcHJvY2Vzc2luZyBhbgorICAgICAgICAgICAgICAgIEhUTUwgJmpheHJzLmNvcmUuRm9ybTsuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvdGlwPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uPgorICAgICAgICA8dGl0bGU+QFRlbXBsYXRlPC90aXRsZT4KKworICAgICAgICA8c2VjdGlvbj4KKyAgICAgICAgICAgIDx0aXRsZT5Bbm5vdGF0aW5nIFJlc291cmNlIG1ldGhvZHM8L3RpdGxlPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGVyZSBpcyBubyBuZWVkIHRvIHVzZSAmbGl0LmplcnNleS5zZXJ2ZXIubXZjLlZpZXdhYmxlOyBldmVyeSB0aW1lIHlvdSB3YW50IHRvIGJpbmQgYSBtb2RlbCB0byBhIHRlbXBsYXRlLiBUbworICAgICAgICAgICAgICAgIG1ha2UgdGhlIHJlc291cmNlIG1ldGhvZCBtb3JlIHJlYWRhYmxlIChhbmQgdG8gYXZvaWQgdmVyYm9zZSB3cmFwcGluZyBvZiBhIHRlbXBsYXRlIHJlZmVyZW5jZSBhbmQgbW9kZWwgaW50bworICAgICAgICAgICAgICAgICZsaXQuamVyc2V5LnNlcnZlci5tdmMuVmlld2FibGU7KSB5b3UgY2FuIHNpbXBseSBhbm5vdGF0ZSBhIHJlc291cmNlIG1ldGhvZCB3aXRoICZqZXJzZXkuc2VydmVyLm12Yy5UZW1wbGF0ZTsKKyAgICAgICAgICAgICAgICBhbm5vdGF0aW9uLiBBbiB1cGRhdGVkIGV4YW1wbGUsIHVzaW5nICZsaXQuamVyc2V5LnNlcnZlci5tdmMuVGVtcGxhdGU7LCBmcm9tIHByZXZpb3VzIHNlY3Rpb24gaXMgc2hvd24gaW4KKyAgICAgICAgICAgICAgICA8eHJlZiBsaW5rZW5kPSJtdmMuZXhhbXBsZS50ZW1wbGF0ZS5zaW1wbGUiLz4gZXhhbXBsZS4KKworICAgICAgICAgICAgICAgIDxleGFtcGxlIHhtbDppZD0ibXZjLmV4YW1wbGUudGVtcGxhdGUuc2ltcGxlIj4KKyAgICAgICAgICAgICAgICAgICAgPHRpdGxlPlVzaW5nICZsaXQuamVyc2V5LnNlcnZlci5tdmMuVGVtcGxhdGU7IG9uIGEgcmVzb3VyY2UgbWV0aG9kPC90aXRsZT4KKworICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiPnBhY2thZ2UgY29tLmV4YW1wbGU7CisKK0BQYXRoKCJmb28iKQorcHVibGljIGNsYXNzIEZvbyB7CisKKyAgICBAR0VUCisgICAgQFRlbXBsYXRlKG5hbWUgPSAiaW5kZXguZm9vIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgcmV0dXJuICJGT08iOworICAgIH0KK308L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEluIHRoaXMgZXhhbXBsZSwgdGhlIDxsaXRlcmFsPkZvbzwvbGl0ZXJhbD4gSkFYLVJTIHJlc291cmNlIGNsYXNzIGlzIHN0aWxsIHRoZSBjb250cm9sbGVyIGFzIGluIHByZXZpb3VzCisgICAgICAgICAgICAgICAgc2VjdGlvbiBidXQgdGhlIE1WQyBtb2RlbCBpcyBub3cgcmVwcmVzZW50ZWQgYnkgdGhlIHJldHVybiB2YWx1ZSBvZiBhbm5vdGF0ZWQgcmVzb3VyY2UgbWV0aG9kLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhlIHByb2Nlc3Npbmcgb2Ygc3VjaCBhIG1ldGhvZCBpcyB0aGVuIGVzc2VudGlhbGx5IHRoZSBzYW1lIGFzIGlmIHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgbWV0aG9kIHdhcyBhbgorICAgICAgICAgICAgICAgIGluc3RhbmNlIG9mIHRoZSAmamVyc2V5LnNlcnZlci5tdmMuVmlld2FibGU7IGNsYXNzLiBJZiBhIG1ldGhvZCBpcyBhbm5vdGF0ZWQgd2l0aAorICAgICAgICAgICAgICAgICZsaXQuamVyc2V5LnNlcnZlci5tdmMuVGVtcGxhdGU7IGFuZCBpcyBhbHNvIHJldHVybmluZyBhCisgICAgICAgICAgICAgICAgJmxpdC5qZXJzZXkuc2VydmVyLm12Yy5WaWV3YWJsZTsgaW5zdGFuY2UgdGhlbiB0aGUgdmFsdWVzIGZyb20gdGhlCisgICAgICAgICAgICAgICAgJmxpdC5qZXJzZXkuc2VydmVyLm12Yy5WaWV3YWJsZTsgaW5zdGFuY2UgdGFrZSBwcmVjZWRlbmNlIG92ZXIgdGhvc2UgZGVmaW5lZCBpbiB0aGUgYW5ub3RhdGlvbi4gUHJvZHVjaWJsZQorICAgICAgICAgICAgICAgIG1lZGlhIHR5cGVzIGFyZSBmb3IgYm90aCBjYXNlcywgJmxpdC5qZXJzZXkuc2VydmVyLm12Yy5WaWV3YWJsZTsgYW5kICZsaXQuamVyc2V5LnNlcnZlci5tdmMuVGVtcGxhdGU7LAorICAgICAgICAgICAgICAgIGRldGVybWluZWQgYnkgdGhlIG1ldGhvZCBvciBjbGFzcyBsZXZlbCAmbGl0LmpheHJzLlByb2R1Y2VzOyBhbm5vdGF0aW9uLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICA8dGl0bGU+QW5ub3RhdGluZyBSZXNvdXJjZSBjbGFzc2VzPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgQSByZXNvdXJjZSBjbGFzcyBjYW4gaGF2ZSB0ZW1wbGF0ZXMgaW1wbGljaXRseSBhc3NvY2lhdGVkIHdpdGggaXQgdmlhICZqZXJzZXkuc2VydmVyLm12Yy5UZW1wbGF0ZTsgYW5ub3RhdGlvbi4KKyAgICAgICAgICAgICAgICBGb3IgZXhhbXBsZSwgdGFrZSBhIGxvb2sgYXQgdGhlIHJlc291cmNlIGNsYXNzIGxpc3RpbmcgaW4gPHhyZWYgbGlua2VuZD0ibXZjLmV4YW1wbGUuaW1wbGljaXQuY2xhc3MiLz4uCisKKyAgICAgICAgICAgICAgICA8ZXhhbXBsZSB4bWw6aWQ9Im12Yy5leGFtcGxlLmltcGxpY2l0LmNsYXNzIj4KKyAgICAgICAgICAgICAgICAgICAgPHRpdGxlPlVzaW5nICZsaXQuamVyc2V5LnNlcnZlci5tdmMuVGVtcGxhdGU7IG9uIGEgcmVzb3VyY2UgY2xhc3M8L3RpdGxlPgorCisgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSI+QFBhdGgoImZvbyIpCitAVGVtcGxhdGUKK3B1YmxpYyBjbGFzcyBGb28geworCisgICAgcHVibGljIFN0cmluZyBnZXRGb28oKSB7CisgICAgICAgIHJldHVybiAiRk9PIjsKKyAgICB9Cit9PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgZXhhbXBsZSByZWxpZXMgb24gSmVyc2V5IE1WQyBjb252ZW50aW9ucyBhIGxvdCBhbmQgcmVxdWlyZXMgbW9yZSBleHBsYW5hdGlvbiBhcyBzdWNoLiBGaXJzdCBvZiBhbGwsIHlvdSBtYXkKKyAgICAgICAgICAgICAgICBoYXZlIG5vdGljZWQgdGhhdCB0aGVyZSBpcyBubyByZXNvdXJjZSBtZXRob2QgZGVmaW5lZCBpbiB0aGlzIEpBWC1SUyByZXNvdXJjZS4gQWxzbywgdGhlcmUgaXMgbm8gdGVtcGxhdGUKKyAgICAgICAgICAgICAgICByZWZlcmVuY2UgZGVmaW5lZC4KKyAgICAgICAgICAgICAgICBJbiB0aGlzIGNhc2UsIHNpbmNlIHRoZSAmbGl0LmplcnNleS5zZXJ2ZXIubXZjLlRlbXBsYXRlOyBhbm5vdGF0aW9uIHBsYWNlZCBvbiB0aGUgcmVzb3VyY2UgY2xhc3MgZG9lcyBub3QKKyAgICAgICAgICAgICAgICBjb250YWluIGFueSBpbmZvcm1hdGlvbiwgdGhlIGRlZmF1bHQgcmVsYXRpdmUgdGVtcGxhdGUgcmVmZXJlbmNlIDxsaXRlcmFsPmluZGV4PC9saXRlcmFsPiB3aWxsIGJlIHVzZWQgKGZvciBtb3JlCisgICAgICAgICAgICAgICAgb24gdGhpcyB0b3BpYyBzZWUgPHhyZWYgbGlua2VuZD0ibXZjLnJlZmVyZW5jZXMiLz4pLgorICAgICAgICAgICAgICAgIEFzIGZvciB0aGUgbWlzc2luZyByZXNvdXJjZSBtZXRob2RzLCBhIGRlZmF1bHQgJmxpdC5qYXhycy5HRVQ7IG1ldGhvZCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IEplcnNleQorICAgICAgICAgICAgICAgIGZvciB0aGUgPGxpdGVyYWw+Rm9vPC9saXRlcmFsPiByZXNvdXJjZSAod2hpY2ggaXMgdGhlIE1WQyBDb250cm9sbGVyIG5vdykuIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZ2VuZXJhdGVkCisgICAgICAgICAgICAgICAgcmVzb3VyY2UgbWV0aG9kIHBlcmZvcm1zIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBmb2xsb3dpbmcgZXhwbGljaXQgcmVzb3VyY2UgbWV0aG9kOgorCisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIj5AR0VUCitwdWJsaWMgVmlld2FibGUgZ2V0KCkgeworICAgIHJldHVybiBuZXcgVmlld2FibGUoImluZGV4IiwgdGhpcyk7Cit9PC9wcm9ncmFtbGlzdGluZz4KKworICAgICAgICAgICAgICAgIFlvdSBjYW4gc2VlIHRoYXQgdGhlIHJlc291cmNlIGNsYXNzIHNlcnZlcyBpbiB0aGlzIGNhc2UgYWxzbyBhcyB0aGUgbW9kZWwuIFByb2R1Y2libGUgbWVkaWEgdHlwZXMgYXJlIGRldGVybWluZWQKKyAgICAgICAgICAgICAgICBiYXNlZCBvbiB0aGUgJmxpdC5qYXhycy5Qcm9kdWNlczsgYW5ub3RhdGlvbiBkZWNsYXJlZCBvbiB0aGUgcmVzb3VyY2UgY2xhc3MsIGlmIGFueS4KKworICAgICAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIEluIGNhc2Ugb2YgInJlc291cmNlIGNsYXNzIi1iYXNlZCBpbXBsaWNpdCBNVkMgdmlldyB0ZW1wbGF0ZXMsIHRoZSBjb250cm9sbGVyIGlzIGFsc28gdGhlIG1vZGVsLiBJbiBzdWNoCisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIHRoZSB0ZW1wbGF0ZSByZWZlcmVuY2UgPGxpdGVyYWw+aW5kZXg8L2xpdGVyYWw+IGlzIHNwZWNpYWwsIGl0IGlzIHRoZSB0ZW1wbGF0ZSByZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29udHJvbGxlciBpbnN0YW5jZSBpdHNlbGYuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L25vdGU+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUsIHRoZSBNVkMgY29udHJvbGxlciByZXByZXNlbnRlZCBieSBhIEpBWC1SUyAmbGl0LmpheHJzLkdFVDsgc3ViLXJlc291cmNlIG1ldGhvZCwKKyAgICAgICAgICAgICAgICBpcyBhbHNvIGdlbmVyYXRlZCBpbiB0aGUgcmVzb3VyY2UgY2xhc3MgYW5ub3RhdGVkIHdpdGggJmxpdC5qZXJzZXkuc2VydmVyLm12Yy5UZW1wbGF0ZTs6CisKKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiPkBHRVQKK0BQYXRoKCJ7aW1wbGljaXQtdmlldy1wYXRoLXBhcmFtZXRlcn0iKQorcHVibGljIFZpZXdhYmxlIGdldChAUGF0aFBhcmFtZXRlcigie2ltcGxpY2l0LXZpZXctcGF0aC1wYXJhbWV0ZXJ9IikgU3RyaW5nIHRlbXBsYXRlKSB7CisgICAgcmV0dXJuIG5ldyBWaWV3YWJsZSh0ZW1wbGF0ZSwgdGhpcyk7Cit9PC9wcm9ncmFtbGlzdGluZz4KKworICAgICAgICAgICAgICAgIFRoaXMgYWxsb3dzIEplcnNleSB0byBzdXBwb3J0IGFsc28gaW1wbGljaXQgc3ViLXJlc291cmNlIHRlbXBsYXRlcy4gRm9yIGV4YW1wbGUsIGEgSkFYLVJTIHJlc291cmNlIGF0IHBhdGgKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbD5mb28vYmFyPC9saXRlcmFsPiB3aWxsIHRyeSB0byB1c2UgcmVsYXRpdmUgdGVtcGxhdGUgcmVmZXJlbmNlIDxsaXRlcmFsPmJhcjwvbGl0ZXJhbD4gdGhhdCByZXNvbHZlcyB0byBhbgorICAgICAgICAgICAgICAgIGFic29sdXRlIHRlbXBsYXRlIHJlZmVyZW5jZSA8bGl0ZXJhbD4vY29tL2Zvby9Gb28vYmFyPC9saXRlcmFsPi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEluIG90aGVyIHdvcmRzLCBhIEhUVFAgJmxpdC5odHRwLkdFVDsgcmVxdWVzdCB0byBhIDxsaXRlcmFsPi9mb28vYmFyPC9saXRlcmFsPiB3b3VsZCBiZSBoYW5kbGVkIGJ5IHRoaXMKKyAgICAgICAgICAgICAgICBhdXRvLWdlbmVyYXRlZCBtZXRob2QgaW4gdGhlIDxsaXRlcmFsPkZvbzwvbGl0ZXJhbD4gcmVzb3VyY2UgYW5kIHdvdWxkIGRlbGVnYXRlIHRoZSByZXF1ZXN0IHRvIGEgcmVnaXN0ZXJlZAorICAgICAgICAgICAgICAgIHRlbXBsYXRlIHByb2Nlc3NvciBzdXBwb3J0cyBwcm9jZXNzaW5nIG9mIHRoZSBhYnNvbHV0ZSB0ZW1wbGF0ZSByZWZlcmVuY2UKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbD4vY29tL2Zvby9Gb28vYmFyPC9saXRlcmFsPiwgd2hlcmUgdGhlIG1vZGVsIGlzIHN0aWxsIGFuIGluc3RhbmNlIG9mIHRoZSBzYW1lIEpBWC1SUyByZXNvdXJjZSBjbGFzcworICAgICAgICAgICAgICAgIDxsaXRlcmFsPkZvbzwvbGl0ZXJhbD4uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiB4bWw6aWQ9Im12Yy5yZWZlcmVuY2VzIj4KKyAgICAgICAgPHRpdGxlPkFic29sdXRlIHZzLiBSZWxhdGl2ZSB0ZW1wbGF0ZSByZWZlcmVuY2U8L3RpdGxlPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQXMgZGlzY3Vzc2VkIGluIHRoZSBwcmV2aW91cyBzZWN0aW9uLCBib3RoICZqZXJzZXkuc2VydmVyLm12Yy5UZW1wbGF0ZTsgYW5kICZqZXJzZXkuc2VydmVyLm12Yy5WaWV3YWJsZTsgcHJvdmlkZSBtZWFucworICAgICAgICAgICAgdG8gZGVmaW5lIGEgcmVmZXJlbmNlIHRvIGEgdGVtcGxhdGUuIFdlIHdpbGwgbm93IGRpc2N1c3MgaG93IHRoZXNlIHZhbHVlcyBhcmUgaW50ZXJwcmV0ZWQgYW5kIGhvdyB0aGUgY29uY3JldGUKKyAgICAgICAgICAgIHRlbXBsYXRlIGlzIGZvdW5kLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICA8dGl0bGU+UmVsYXRpdmUgdGVtcGxhdGUgcmVmZXJlbmNlPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgUmVsYXRpdmUgcmVmZXJlbmNlIGlzIGFueSBwYXRoIHRoYXQgZG9lcyBub3Qgc3RhcnQgd2l0aCBhIGxlYWRpbmcgJzxsaXRlcmFsPi88L2xpdGVyYWw+JyAoc2xhc2gpIGNoYXJhY3RlciAoaS5lLgorICAgICAgICAgICAgICAgIDxsaXRlcmFsPmluZGV4LmZvbzwvbGl0ZXJhbD4pLiBUaGlzIGtpbmQgb2YgcmVmZXJlbmNlcyBpcyByZXNvbHZlZCBpbnRvIGFic29sdXRlIG9uZXMgYnkgcHJlLXBlbmRpbmcgYSBnaXZlbiB2YWx1ZQorICAgICAgICAgICAgICAgIHdpdGggYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgbGFzdCBtYXRjaGVkIHJlc291cmNlLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgQ29uc2lkZXIgdGhlIDx4cmVmIGxpbmtlbmQ9Im12Yy5leGFtcGxlLmltcGxpY2l0LmNsYXNzIj5leGFtcGxlPC94cmVmPiBmcm9tIHRoZSBwcmV2aW91cyBzZWN0aW9uLAorICAgICAgICAgICAgICAgIHRoZSB0ZW1wbGF0ZSBuYW1lIHJlZmVyZW5jZSA8bGl0ZXJhbD5pbmRleDwvbGl0ZXJhbD4gaXMgYSByZWxhdGl2ZSB2YWx1ZSB0aGF0IEplcnNleSB3aWxsIHJlc29sdmUgdG8gaXRzCisgICAgICAgICAgICAgICAgYWJzb2x1dGUgdGVtcGxhdGUgcmVmZXJlbmNlIHVzaW5nIGEgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgPGxpdGVyYWw+Rm9vPC9saXRlcmFsPiAobW9yZSBvbiByZXNvbHZpbmcKKyAgICAgICAgICAgICAgICByZWxhdGl2ZSB0ZW1wbGF0ZSBuYW1lIHRvIHRoZSBhYnNvbHV0ZSBvbmUgY2FuIGJlIGZvdW5kIGluIHRoZSBKYXZhRG9jIG9mICZqZXJzZXkuc2VydmVyLm12Yy5WaWV3YWJsZTsgY2xhc3MpLAorICAgICAgICAgICAgICAgIHdoaWNoLCBpbiBvdXIgY2FzZSwgaXM6CisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJ1bm51bWJlcmVkIj4iL2NvbS9mb28vRm9vL2luZGV4IjwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBKZXJzZXkgd2lsbCB0aGVuIHNlYXJjaCBhbGwgdGhlIHJlZ2lzdGVyZWQgdGVtcGxhdGUgcHJvY2Vzc29ycyAoc2VlIDx4cmVmIGxpbmtlbmQ9Im12Yy5zcGkiLz4pIHRvIGZpbmQgYSB0ZW1wbGF0ZQorICAgICAgICAgICAgICAgIHByb2Nlc3NvciB0aGF0IGNhbiByZXNvbHZlIHRoZSBhYnNvbHV0ZSB0ZW1wbGF0ZSByZWZlcmVuY2UgZnVydGhlciB0byBhICJwcm9jZXNzYWJsZSIgdGVtcGxhdGUgcmVmZXJlbmNlLiBJZgorICAgICAgICAgICAgICAgIGEgdGVtcGxhdGUgcHJvY2Vzc29yIGlzIGZvdW5kIHRoZW4gdGhlICJwcm9jZXNzYWJsZSIgdGVtcGxhdGUgaXMgcHJvY2Vzc2VkIHVzaW5nIHRoZSBzdXBwbGllZCBkYXRhIG1vZGVsLgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgSWYgbm9uZSBvciBlbXB0eSB0ZW1wbGF0ZSByZWZlcmVuY2UgaXMgcHJvdmlkZWQgKGVpdGhlciBpbiAmbGl0LmplcnNleS5zZXJ2ZXIubXZjLlZpZXdhYmxlOyBvciB2aWEKKyAgICAgICAgICAgICAgICAgICAgJmxpdC5qZXJzZXkuc2VydmVyLm12Yy5UZW1wbGF0ZTspIHRoZW4gdGhlIDxsaXRlcmFsPmluZGV4PC9saXRlcmFsPiByZWZlcmVuY2UgaXMgYXNzdW1lZCBhbmQgYWxsIGZ1cnRoZXIKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2luZyBpcyBkb25lIGZvciB0aGlzIHZhbHVlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgIDxzZWN0aW9uPgorICAgICAgICAgICAgPHRpdGxlPkFic29sdXRlIHRlbXBsYXRlIHJlZmVyZW5jZTwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIExldCdzIGNoYW5nZSB0aGUgcmVzb3VyY2UgJmxpdC5odHRwLkdFVDsgbWV0aG9kIGluIG91ciA8bGl0ZXJhbD5Gb288L2xpdGVyYWw+IHJlc291cmNlIGEgbGl0dGxlOgorCisgICAgICAgICAgICAgICAgPGV4YW1wbGUgeG1sOmlkPSJtdmMuZXhhbXBsZS52aWV3YWJsZS5hYnNvbHV0ZVBhdGgiPgorICAgICAgICAgICAgICAgICAgICA8dGl0bGU+VXNpbmcgYWJzb2x1dGUgcGF0aCB0byB0ZW1wbGF0ZSBpbiAmbGl0LmplcnNleS5zZXJ2ZXIubXZjLlZpZXdhYmxlOzwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIj5AR0VUCitwdWJsaWMgVmlld2FibGUgZ2V0KCkgeworICAgIHJldHVybiBuZXcgVmlld2FibGUoIi9pbmRleCIsICJGT08iKTsKK308L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKworICAgICAgICAgICAgICAgIEluIHRoaXMgY2FzZSwgc2luY2UgdGhlIHRlbXBsYXRlIHJlZmVyZW5jZSBiZWdpbnMgd2l0aCA8bGl0ZXJhbD4iLyI8L2xpdGVyYWw+LCBKZXJzZXkgd2lsbCBjb25zaWRlciB0aGUgcmVmZXJlbmNlCisgICAgICAgICAgICAgICAgdG8gYmUgYWJzb2x1dGUgYWxyZWFkeSBhbmQgd2lsbCBub3QgYXR0ZW1wdCB0byBhYnNvbHV0aXplIGl0IGFnYWluLiBUaGUgcmVmZXJlbmNlIHdpbGwgYmUgdXNlZCAiYXMgaXMiIHdoZW4KKyAgICAgICAgICAgICAgICByZXNvbHZpbmcgaXQgdG8gYSAicHJvY2Vzc2FibGUiIHRlbXBsYXRlIHJlZmVyZW5jZSBhcyBkZXNjcmliZWQgZWFybGllci4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEFic29sdXRlIHRlbXBsYXRlIHJlZmVyZW5jZXMgc3RhcnQgd2l0aCBsZWFkaW5nICc8bGl0ZXJhbD4vPC9saXRlcmFsPicgKGkuZS4gPGxpdGVyYWw+L2NvbS9leGFtcGxlL2luZGV4LmZvbzwvbGl0ZXJhbD4pCisgICAgICAgICAgICAgICAgY2hhcmFjdGVyIGFuZCBhcmUgbm90IGZ1cnRoZXIgcmVzb2x2ZWQgKHdpdGggcmVzcGVjdCB0byB0aGUgcmVzb2x2aW5nIHJlc291cmNlIGNsYXNzKSB3aGljaCBtZWFucyB0aGF0IHRoZQorICAgICAgICAgICAgICAgIHRlbXBsYXRlIGlzIGxvb2tlZCBmb3IgYXQgdGhlIHByb3ZpZGVkIHBhdGggZGlyZWN0bHkuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBOb3RlLCBob3dldmVyLCB0aGF0IHRlbXBsYXRlIHByb2Nlc3NvcnMgZm9yIGN1c3RvbSB0ZW1wbGF0aW5nIGVuZ2luZXMgbWF5IG1vZGlmeSAoYW5kIHRoZSBzdXBwb3J0ZWQgb25lcyBkbykKKyAgICAgICAgICAgICAgICBhYnNvbHV0ZSB0ZW1wbGF0ZSByZWZlcmVuY2UgYnkgcHJlLXBlbmRpbmcgJ2Jhc2UgdGVtcGxhdGUgcGF0aCcgKGlmIGRlZmluZWQpIGFuZCBhcHBlbmRpbmcgdGVtcGxhdGUgc3VmZml4IChpLmUuCisgICAgICAgICAgICAgICAgPGxpdGVyYWw+Zm9vPC9saXRlcmFsPikgaWYgdGhlIHN1ZmZpeCBpcyBub3QgcHJvdmlkZWQgaW4gdGhlIHJlZmVyZW5jZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEZvciBleGFtcGxlIGFzc3VtZSB0aGF0IHdlIHdhbnQgdG8gdXNlIE11c3RhY2hlIHRlbXBsYXRlcyBmb3Igb3VyIHZpZXdzIGFuZCB3ZSBoYXZlIGRlZmluZWQgJ2Jhc2UgdGVtcGxhdGUgcGF0aCcKKyAgICAgICAgICAgICAgICBhcyA8bGl0ZXJhbD5wYWdlczwvbGl0ZXJhbD4uIEZvciB0aGUgYWJzb2x1dGUgdGVtcGxhdGUgcmVmZXJlbmNlIDxsaXRlcmFsPi9jb20vZXhhbXBsZS9Gb28vaW5kZXg8L2xpdGVyYWw+IHRoZSB0ZW1wbGF0ZQorICAgICAgICAgICAgICAgIHByb2Nlc3NvciB3aWxsIHRyYW5zZm9ybSB0aGUgcmVmZXJlbmNlIGludG8gdGhlIGZvbGxvd2luZyBwYXRoOiA8bGl0ZXJhbD4vcGFnZXMvY29tL2V4YW1wbGUvRm9vL2luZGV4Lm11c3RhY2hlPC9saXRlcmFsPi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uPgorICAgICAgICA8dGl0bGU+SGFuZGxpbmcgZXJyb3JzIHdpdGggTVZDPC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEluIGFkZGl0aW9uIHRvICZqZXJzZXkuc2VydmVyLm12Yy5UZW1wbGF0ZTsgYSAmamVyc2V5LnNlcnZlci5tdmMuRXJyb3JUZW1wbGF0ZTsgYW5ub3RhdGlvbiBoYXMgYmVlbiBpbnRyb2R1Y2VkIGluCisgICAgICAgICAgICBKZXJzZXkgMi4zLiBUaGUgcHVycG9zZSBvZiB0aGlzIGFubm90YXRpb24gaXMgdG8gYmluZCB0aGUgbW9kZWwgdG8gYW4gZXJyb3IgdmlldyBpbiBjYXNlIGFuIGV4Y2VwdGlvbiBoYXMgYmVlbiByYWlzZWQgZHVyaW5nCisgICAgICAgICAgICBwcm9jZXNzaW5nIG9mIGEgcmVxdWVzdC4gVGhpcyBpcyB0cnVlIGZvciBhbnkgZXhjZXB0aW9uIHRocm93biBhZnRlciB0aGUgcmVzb3VyY2UgbWF0Y2hpbmcgcGhhc2UgKGkuZS4gdGhpcyBub3Qgb25seQorICAgICAgICAgICAgYXBwbGllcyB0byBKQVgtUlMgcmVzb3VyY2VzIGJ1dCBwcm92aWRlcnMgYW5kIGV2ZW4gSmVyc2V5IHJ1bnRpbWUgYXMgd2VsbCkuIFRoZSBtb2RlbCBpbiB0aGlzIGNhc2UgaXMgdGhlIHRocm93biBleGNlcHRpb24KKyAgICAgICAgICAgIGl0c2VsZi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIDx4cmVmIGxpbmtlbmQ9Im12Yy5leGFtcGxlLmVycm9yLnNpbXBsZSIvPiBzaG93cyBob3cgdG8gdXNlICZsaXQuamVyc2V5LnNlcnZlci5tdmMuRXJyb3JUZW1wbGF0ZTsgb24gYSByZXNvdXJjZSBtZXRob2QuCisgICAgICAgICAgICBJZiBhbGwgZ29lcyB3ZWxsIHdpdGggdGhlIG1ldGhvZCBwcm9jZXNzaW5nLCB0aGVuIHRoZSA8bGl0ZXJhbD4vc2hvcnQtbGluazwvbGl0ZXJhbD4gdGVtcGxhdGUgaXMgdXNlZCB0byBhcyBwYWdlIHNlbnQKKyAgICAgICAgICAgIHRvIHRoZSB1c2VyLiBPdGhlcndpc2UgaWYgYW4gZXhjZXB0aW9uIGlzIHJhaXNlZCB0aGVuIHRoZSA8bGl0ZXJhbD4vZXJyb3ItZm9ybTwvbGl0ZXJhbD4gdGVtcGxhdGUgaXMgc2hvd24gdG8gdGhlIHVzZXIuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPGV4YW1wbGUgeG1sOmlkPSJtdmMuZXhhbXBsZS5lcnJvci5zaW1wbGUiPgorICAgICAgICAgICAgICAgICAgICA8dGl0bGU+VXNpbmcgJmxpdC5qZXJzZXkuc2VydmVyLm12Yy5FcnJvclRlbXBsYXRlOyBvbiBhIHJlc291cmNlIG1ldGhvZDwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIj5AUE9TVAorQFByb2R1Y2VzKHsidGV4dC9odG1s4oCdfSkKK0BDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fRk9STV9VUkxFTkNPREVEKQorQFRlbXBsYXRlKG5hbWUgPSAiL3Nob3J0LWxpbmsiKQorQEVycm9yVGVtcGxhdGUobmFtZSA9ICIvZXJyb3ItZm9ybSIpCitwdWJsaWMgU2hvcnRlbmVkTGluayBjcmVhdGVMaW5rKEBGb3JtUGFyYW0oImxpbmsiKSBmaW5hbCBTdHJpbmcgbGluaykgeworICAgIC8vIC4uLgorfTwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBOb3RlIHRoYXQgJmplcnNleS5zZXJ2ZXIubXZjLkVycm9yVGVtcGxhdGU7IGNhbiBiZSB1c2VkIG9uIGEgcmVzb3VyY2UgY2xhc3Mgb3IgYSByZXNvdXJjZSBtZXRob2QgdG8gbWVyZWx5IGhhbmRsZQorICAgICAgICAgICAgZXJyb3Igc3RhdGVzLiBUaGVyZSBpcyBubyBuZWVkIHRvIHVzZSAmamVyc2V5LnNlcnZlci5tdmMuVGVtcGxhdGU7IG9yICZqZXJzZXkuc2VydmVyLm12Yy5WaWV3YWJsZTsgd2l0aCBpdC4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZSBhbm5vdGF0aW9uIGlzIGhhbmRsZWQgYnkgY3VzdG9tICZqYXhycy5leHQuRXhjZXB0aW9uTWFwcGVyOyB3aGljaCBjcmVhdGVzIGFuIGluc3RhbmNlIG9mCisgICAgICAgICAgICAmbGl0LmplcnNleS5zZXJ2ZXIubXZjLlZpZXdhYmxlOyB0aGF0IGlzIGZ1cnRoZXIgcHJvY2Vzc2VkIGJ5IEplcnNleS4gVGhpcyBleGNlcHRpb24gbWFwcGVyIGlzIHJlZ2lzdGVyZWQgYXV0b21hdGljYWxseQorICAgICAgICAgICAgd2l0aCBhICZsaXQuamVyc2V5LnNlcnZlci5tdmMuTXZjRmVhdHVyZTsuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8c2VjdGlvbj4KKyAgICAgICAgICAgIDx0aXRsZT5NVkMgJmFtcDsgQmVhbiBWYWxpZGF0aW9uPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgJmxpdC5qZXJzZXkuc2VydmVyLm12Yy5FcnJvclRlbXBsYXRlOyBjYW4gYmUgdXNlZCBpbiBhbHNvIHdpdGggQmVhbiBWYWxpZGF0aW9uIHRvIGRpc3BsYXkgc3BlY2lmaWMgZXJyb3IgcGFnZXMgaW4KKyAgICAgICAgICAgICAgICBjYXNlIHRoZSB2YWxpZGF0aW9uIG9mIGlucHV0L291dHB1dCB2YWx1ZXMgZmFpbHMgZm9yIHNvbWUgcmVhc29uLiBFdmVyeXRoaW5nIHdvcmtzIGFzIGRlc2NyaWJlZCBhYm92ZSBleGNlcHQgdGhlCisgICAgICAgICAgICAgICAgbW9kZWwgaXMgbm90IHRoZSB0aHJvd24gZXhjZXB0aW9uIGJ1dCByYXRoZXIgYSBsaXN0IG9mICZqZXJzZXkuZXh0LlZhbGlkYXRpb25FcnJvcjtzLiBUaGlzIGxpc3QgY2FuIGJlIGl0ZXJhdGVkIGluCisgICAgICAgICAgICAgICAgdGhlIHRlbXBsYXRlIGFuZCBhbGwgdGhlIHZhbGlkYXRpb24gZXJyb3JzIGNhbiBiZSBzaG93biB0byB0aGUgdXNlciBpbiBhIGRlc2lyYWJsZSB3YXkuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8ZXhhbXBsZSB4bWw6aWQ9Im12Yy5leGFtcGxlLmVycm9yLmJ2Ij4KKyAgICAgICAgICAgICAgICAgICAgPHRpdGxlPlVzaW5nICZsaXQuamVyc2V5LnNlcnZlci5tdmMuRXJyb3JUZW1wbGF0ZTsgd2l0aCBCZWFuIFZhbGlkYXRpb248L3RpdGxlPgorCisgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSI+QFBPU1QKK0BQcm9kdWNlcyh7InRleHQvaHRtbOKAnX0pCitAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0ZPUk1fVVJMRU5DT0RFRCkKK0BUZW1wbGF0ZShuYW1lID0gIi9zaG9ydC1saW5r4oCdKSBARXJyb3JUZW1wbGF0ZShuYW1lID0gIi9lcnJvci1mb3JtIikKK0BWYWxpZAorcHVibGljIFNob3J0ZW5lZExpbmsgY3JlYXRlTGluayhATm90RW1wdHkgQEZvcm1QYXJhbSgibGluayIpIGZpbmFsIFN0cmluZyBsaW5rKSB7CisgICAgLy8gLi4uCit9PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgIDxleGFtcGxlIHhtbDppZD0ibXZjLmV4YW1wbGUuZXJyb3IuYnYuanNwIj4KKyAgICAgICAgICAgICAgICAgICAgPHRpdGxlPkl0ZXJhdGluZyB0aHJvdWdoICZsaXQuamVyc2V5LmV4dC5WYWxpZGF0aW9uRXJyb3I7IGluIEpTUDwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJ4bWwiPjwhW0NEQVRBWzxjOmZvckVhY2ggaXRlbXM9IiR7bW9kZWx9IiB2YXI9ImVycm9yIj4KKyAgICAke2Vycm9yLm1lc3NhZ2V9ICI8c3Ryb25nPiR7ZXJyb3IuaW52YWxpZFZhbHVlfTwvc3Ryb25nPiI8YnIvPgorPC9jOmZvckVhY2g+XV0+PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFN1cHBvcnQgZm9yIEJlYW4gVmFsaWRhdGlvbiBpbiBKZXJzZXkgTVZDIFRlbXBsYXRlcyBpcyBwcm92aWRlZCBieSBhIDxsaXRlcmFsPmplcnNleS1tdmMtYmVhbi12YWxpZGF0aW9uPC9saXRlcmFsPgorICAgICAgICAgICAgICAgIGV4dGVuc2lvbiBtb2R1bGUuIFRoZSBKQVgtUlMgJmpheHJzLmNvcmUuRmVhdHVyZTsgcHJvdmlkZWQgYnkgdGhpcyBtb2R1bGUKKyAgICAgICAgICAgICAgICAoPGxpdGVyYWw+TXZjQmVhblZhbGlkYXRpb25GZWF0dXJlPC9saXRlcmFsPikgaGFzIHRvIGJlIHJlZ2lzdGVyZWQgaW4gb3JkZXIgdG8gdXNlIHRoaXMKKyAgICAgICAgICAgICAgICBmdW5jdGlvbmFsaXR5IChzZWUgPHhyZWYgbGlua2VuZD0ibXZjLnJlZ2lzdHJhdGlvbiIvPikuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBNYXZlbiB1c2VycyBjYW4gZmluZCB0aGlzIG1vZHVsZSBhdCBjb29yZGluYXRlcworCisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJ4bWwiPiZsdDtkZXBlbmRlbmN5Jmd0OworICAgICZsdDtncm91cElkJmd0O29yZy5nbGFzc2Zpc2guamVyc2V5LmV4dCZsdDsvZ3JvdXBJZCZndDsKKyAgICAmbHQ7YXJ0aWZhY3RJZCZndDtqZXJzZXktbXZjLWJlYW4tdmFsaWRhdGlvbiZsdDsvYXJ0aWZhY3RJZCZndDsKKyAgICAmbHQ7dmVyc2lvbiZndDsmdmVyc2lvbjsmbHQ7L3ZlcnNpb24mZ3Q7CismbHQ7L2RlcGVuZGVuY3kmZ3Q7PC9wcm9ncmFtbGlzdGluZz4KKworICAgICAgICAgICAgICAgIGFuZCBmb3Igbm9uLU1hdmVuIHVzZXJzIHRoZSBsaXN0IG9mIGRlcGVuZGVuY2llcyBpcyBhdmFpbGFibGUgYXQgJmplcnNleS5leHQubXZjLWJlYW4tdmFsaWRhdGlvbi5kZXBzLmxpbms7LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24geG1sOmlkPSJtdmMucmVnaXN0cmF0aW9uIj4KKyAgICAgICAgPHRpdGxlPlJlZ2lzdHJhdGlvbiBhbmQgQ29uZmlndXJhdGlvbjwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUbyB1c2UgdGhlIGNhcGFiaWxpdGllcyBvZiBKZXJzZXkgTVZDIHRlbXBsYXRpbmcgc3VwcG9ydCBpbiB5b3VyIEpBWC1SUy9KZXJzZXkgYXBwbGljYXRpb24geW91IG5lZWQgdG8gcmVnaXN0ZXIKKyAgICAgICAgICAgIHNwZWNpZmljIEpBWC1SUyAmamF4cnMuY29yZS5GZWF0dXJlO3MgcHJvdmlkZWQgYnkgdGhlIE1WQyBtb2R1bGVzLiBGb3IgPGxpdGVyYWw+amVyc2V5LW12YzwvbGl0ZXJhbD4gbW9kdWxlIGl0IGlzCisgICAgICAgICAgICAmamVyc2V5LnNlcnZlci5tdmMuTXZjRmVhdHVyZTsgZm9yIG90aGVycyBpdCBjb3VsZCBiZSwgZm9yIGV4YW1wbGUsICZqZXJzZXkuc2VydmVyLm12Yy5GcmVlbWFya2VyTXZjRmVhdHVyZTsKKyAgICAgICAgICAgICg8bGl0ZXJhbD5qZXJzZXktbXZjLWZyZWVtYXJrZXI8L2xpdGVyYWw+KS4KKworICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgPHRpdGxlPlJlZ2lzdGVyaW5nICZsaXQuamVyc2V5LnNlcnZlci5tdmMuTXZjRmVhdHVyZTs8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSI+bmV3IFJlc291cmNlQ29uZmlnKCkKKyAgICAucmVnaXN0ZXIob3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5NdmNGZWF0dXJlLmNsYXNzKQorICAgIC8vIEZ1cnRoZXIgY29uZmlndXJhdGlvbiBvZiBSZXNvdXJjZUNvbmZpZy4KKyAgICAucmVnaXN0ZXIoIC4uLiApOzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisKKyAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgIDx0aXRsZT5SZWdpc3RlcmluZyAmbGl0LmplcnNleS5zZXJ2ZXIubXZjLkZyZWVtYXJrZXJNdmNGZWF0dXJlOzwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIj5uZXcgUmVzb3VyY2VDb25maWcoKQorICAgIC5yZWdpc3RlcihvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLmZyZWVtYXJrZXIuRnJlZW1hcmtlck12Y0ZlYXR1cmUuY2xhc3MpCisgICAgLy8gRnVydGhlciBjb25maWd1cmF0aW9uIG9mIFJlc291cmNlQ29uZmlnLgorICAgIC5yZWdpc3RlciggLi4uICk7PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKworICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIE1vZHVsZXMgdGhhdCB1c2VzIGNhcGFiaWxpdGllcyBvZiB0aGUgYmFzZSBKZXJzZXkgTVZDIG1vZHVsZSByZWdpc3RlciAmbGl0LmplcnNleS5zZXJ2ZXIubXZjLk12Y0ZlYXR1cmU7CisgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHksIHNvIHlvdSBkb24ndCBuZWVkIHRvIHJlZ2lzdGVyIHRoaXMgZmVhdHVyZSBleHBsaWNpdGx5IGluIHlvdXIgY29kZS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L25vdGU+CisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEFsbW9zdCBhbGwgb2YgdGhlIE1WQyBtb2R1bGVzIGFyZSBmdXJ0aGVyIGNvbmZpZ3VyYWJsZSBhbmQgZWl0aGVyIGNvbnRhaW4gYSA8bGl0ZXJhbD4qUHJvcGVydGllczwvbGl0ZXJhbD4KKyAgICAgICAgICAgIChlLmcuIDxsaXRlcmFsPkZyZWVtYXJrZXJNdmNQcm9wZXJ0aWVzPC9saXRlcmFsPikgY2xhc3MgZGVzY3JpYmluZyBhbGwgdGhlIGF2YWlsYWJsZSBwcm9wZXJ0aWVzIHdoaWNoIGNvdWxkIGJlCisgICAgICAgICAgICBzZXQgaW4gYSBKQVgtUlMgJmxpdC5qYXhycy5jb3JlLkFwcGxpY2F0aW9uOyAvICZsaXQuamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsuIEFsdGVybmF0aXZlbHksIHRoZSBwcm9wZXJ0aWVzCisgICAgICAgICAgICBhcmUgbGlzdGVkIGRpcmVjdGx5IGluIHRoZSBtb2R1bGUgPGxpdGVyYWw+KkZlYXR1cmU8L2xpdGVyYWw+IGNsYXNzLgorCisgICAgICAgICAgICA8ZXhhbXBsZSB4bWw6aWQ9Im12Yy5leC5yYy5wcm9wZXJ0aWVzIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+U2V0dGluZyA8bGl0ZXJhbD5NdmNGZWF0dXJlLlRFTVBMQVRFX0JBU0VfUEFUSDwvbGl0ZXJhbD4gdmFsdWUgaW4gJmxpdC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOzwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiPm5ldyBSZXNvdXJjZUNvbmZpZygpCisgICAgLnByb3BlcnR5KE12Y0ZlYXR1cmUuVEVNUExBVEVfQkFTRV9QQVRILCAidGVtcGxhdGVzIikKKyAgICAucmVnaXN0ZXIoTXZjRmVhdHVyZS5jbGFzcykKKyAgICAvLyBGdXJ0aGVyIGNvbmZpZ3VyYXRpb24gb2YgUmVzb3VyY2VDb25maWcuCisgICAgLnJlZ2lzdGVyKCAuLi4gKTs8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorCisgICAgICAgICAgICA8ZXhhbXBsZSB4bWw6aWQ9Im12Yy5leC53ZWIueG1sLnByb3BlcnRpZXMiPgorICAgICAgICAgICAgICAgIDx0aXRsZT5TZXR0aW5nIDxsaXRlcmFsPkZyZWVtYXJrZXJNdmNQcm9wZXJ0aWVzLlRFTVBMQVRFX0JBU0VfUEFUSDwvbGl0ZXJhbD4gdmFsdWUgaW4gPGxpdGVyYWw+d2ViLnhtbDwvbGl0ZXJhbD48L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0ieG1sIj48IVtDREFUQVs8c2VydmxldD4KKyAgICA8c2VydmxldC1uYW1lPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmZyZWVtYXJrZXIuTXlBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5mcmVlbWFya2VyLk15QXBwbGljYXRpb248L3BhcmFtLXZhbHVlPgorICAgIDwvaW5pdC1wYXJhbT4KKyAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgPHBhcmFtLW5hbWU+amVyc2V5LmNvbmZpZy5zZXJ2ZXIubXZjLnRlbXBsYXRlQmFzZVBhdGguZnJlZW1hcmtlcjwvcGFyYW0tbmFtZT4KKyAgICAgICAgPHBhcmFtLXZhbHVlPmZyZWVtYXJrZXI8L3BhcmFtLXZhbHVlPgorICAgIDwvaW5pdC1wYXJhbT4KKyAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKzwvc2VydmxldD5dXT48L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8L3BhcmE+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24+CisgICAgICAgIDx0aXRsZT5TdXBwb3J0ZWQgdGVtcGxhdGluZyBlbmdpbmVzPC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEplcnNleSBwcm92aWRlcyBleHRlbnNpb24gbW9kdWxlcyB0aGF0IGVuYWJsZSBzdXBwb3J0IGZvciBzZXZlcmFsIHRlbXBsYXRpbmcgZW5naW5lcy4gVGhpcyBzZWN0aW9uIGxpc3RzIGFsbCB0aGUKKyAgICAgICAgICAgIHN1cHBvcnRlZCBlbmdpbmVzIGFuZCB0aGVpciBtb2R1bGVzIGFzIHdlbGwgYXMgZGlzY3Vzc2VzIGFueSBtb2R1bGUtc3BlY2lmaWMgZGV0YWlscy4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxzZWN0aW9uPgorICAgICAgICAgICAgPHRpdGxlPk11c3RhY2hlPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgQW4gaW50ZWdyYXRpb24gbW9kdWxlIGZvciA8bGluayB4bGluazpocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc3B1bGxhcmEvbXVzdGFjaGUuamF2YSI+TXVzdGFjaGU8L2xpbms+LWJhc2VkCisgICAgICAgICAgICAgICAgdGVtcGxhdGluZyBlbmdpbmUuCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIE11c3RhY2hlIHRlbXBsYXRlIHByb2Nlc3NvciByZXNvbHZlcyBhYnNvbHV0ZSB0ZW1wbGF0ZSByZWZlcmVuY2VzIHRvIHByb2Nlc3NhYmxlIHRlbXBsYXRlIHJlZmVyZW5jZXMgcmVwcmVzZW50ZWQKKyAgICAgICAgICAgICAgICBhcyBNdXN0YWNoZSB0ZW1wbGF0ZXMgYXMgZm9sbG93czoKKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPHByb2NlZHVyZT4KKyAgICAgICAgICAgICAgICA8dGl0bGU+UmVzb2x2aW5nIE11c3RhY2hlIHRlbXBsYXRlIHJlZmVyZW5jZTwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHN0ZXA+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGhlIGFic29sdXRlIHRlbXBsYXRlIHJlZmVyZW5jZSBkb2VzIG5vdCBlbmQgaW4gPGxpdGVyYWw+Lm11c3RhY2hlPC9saXRlcmFsPiBhcHBlbmQgdGhpcyBzdWZmaXggdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2U7IGFuZAorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9zdGVwPgorICAgICAgICAgICAgICAgIDxzdGVwPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIDxsaXRlcmFsPlNlcnZsZXRDb250ZXh0LmdldFJlc291cmNlPC9saXRlcmFsPiwgPGxpdGVyYWw+Q2xhc3MuZ2V0UmVzb3VyY2U8L2xpdGVyYWw+IG9yCisgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5GaWxlLmV4aXN0czwvbGl0ZXJhbD5yZXR1cm5zIGEgbm9uLSZsaXQubnVsbDsgdmFsdWUgZm9yIHRoZSByZWZlcmVuY2UgdGhlbgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoZSByZWZlcmVuY2UgYXMgdGhlIHByb2Nlc3NhYmxlIHRlbXBsYXRlIHJlZmVyZW5jZSBvdGhlcndpc2UgcmV0dXJuICZsaXQubnVsbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICh0byBpbmRpY2F0ZSB0aGUgYWJzb2x1dGUgcmVmZXJlbmNlIGhhcyBub3QgYmVlbiByZXNvbHZlZCBieSB0aGUgTXVzdGFjaGUgdGVtcGxhdGUgcHJvY2Vzc29yKS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvc3RlcD4KKyAgICAgICAgICAgIDwvcHJvY2VkdXJlPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGh1cyB0aGUgYWJzb2x1dGUgdGVtcGxhdGUgcmVmZXJlbmNlIDxsaXRlcmFsPi9jb20vZm9vL0Zvby9pbmRleDwvbGl0ZXJhbD4gd291bGQgYmUgcmVzb2x2ZWQgYXMKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbD4vY29tL2Zvby9Gb28vaW5kZXgubXVzdGFjaGU8L2xpdGVyYWw+LCBwcm92aWRlZCB0aGVyZSBleGlzdHMgYQorICAgICAgICAgICAgICAgIDxsaXRlcmFsPi9jb20vZm9vL0Zvby9pbmRleC5tdXN0YWNoZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICBNdXN0YWNoZSB0ZW1wbGF0ZSBpbiB0aGUgYXBwbGljYXRpb24uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBBdmFpbGFibGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzOgorCisgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+PGxpdGVyYWw+TXVzdGFjaGVNdmNGZWF0dXJlLlRFTVBMQVRFX0JBU0VfUEFUSDwvbGl0ZXJhbD4gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmplcnNleS5jb25maWcuc2VydmVyLm12Yy50ZW1wbGF0ZUJhc2VQYXRoLm11c3RhY2hlPC9saXRlcmFsPjwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPlRoZSBiYXNlIHBhdGggd2hlcmUgTXVzdGFjaGUgdGVtcGxhdGVzIGFyZSBsb2NhdGVkLjwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+PGxpdGVyYWw+TXVzdGFjaGVNdmNGZWF0dXJlLkNBQ0hFX1RFTVBMQVRFUzwvbGl0ZXJhbD4gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmplcnNleS5jb25maWcuc2VydmVyLm12Yy5jYWNoaW5nLm11c3RhY2hlPC9saXRlcmFsPjwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPkVuYWJsZXMgY2FjaGluZyBvZiBNdXN0YWNoZSB0ZW1wbGF0ZXMgdG8gYXZvaWQgbXVsdGlwbGUgY29tcGlsYXRpb24uPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT48bGl0ZXJhbD5NdXN0YWNoZU12Y0ZlYXR1cmUuVEVNUExBVEVfT0JKRUNUX0ZBQ1RPUlk8L2xpdGVyYWw+IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5qZXJzZXkuY29uZmlnLnNlcnZlci5tdmMuZmFjdG9yeS5tdXN0YWNoZTwvbGl0ZXJhbD48L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT5Qcm9wZXJ0eSB1c2VkIHRvIHBhc3MgdXNlci1jb25maWd1cmVkIDxsaXRlcmFsPk11c3RhY2hlRmFjdG9yeTwvbGl0ZXJhbD4uPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT48bGl0ZXJhbD5NdXN0YWNoZU12Y0ZlYXR1cmUuRU5DT0RJTkc8L2xpdGVyYWw+IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5qZXJzZXkuY29uZmlnLnNlcnZlci5tdmMuZW5jb2RpbmcubXVzdGFjaGU8L2xpdGVyYWw+PC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+UHJvcGVydHkgdXNlZCB0byBjb25maWd1cmUgYSBkZWZhdWx0IGVuY29kaW5nIHRoYXQgd2lsbCBiZSB1c2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm9uZSBpcyBzcGVjaWZpZWQgaW4gJmpheHJzLlByb2R1Y2VzOyBhbm5vdGF0aW9uLiBJZiBwcm9wZXJ0eSBpcyBub3QgZGVmaW5lZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBVVEYtOCBlbmNvZGluZyB3aWxsIGJlIHVzZWQgYXMgYSBkZWZhdWx0IHZhbHVlLjwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIE1hdmVuIHVzZXJzIGNhbiBmaW5kIHRoaXMgbW9kdWxlIGF0IGNvb3JkaW5hdGVzCisKKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9InhtbCI+Jmx0O2RlcGVuZGVuY3kmZ3Q7CisgICAgJmx0O2dyb3VwSWQmZ3Q7b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0Jmx0Oy9ncm91cElkJmd0OworICAgICZsdDthcnRpZmFjdElkJmd0O2plcnNleS1tdmMtbXVzdGFjaGUmbHQ7L2FydGlmYWN0SWQmZ3Q7CisgICAgJmx0O3ZlcnNpb24mZ3Q7JnZlcnNpb247Jmx0Oy92ZXJzaW9uJmd0OworJmx0Oy9kZXBlbmRlbmN5Jmd0OzwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgICAgICAgICAgICAgICBhbmQgZm9yIG5vbi1NYXZlbiB1c2VycyB0aGUgbGlzdCBvZiBkZXBlbmRlbmNpZXMgaXMgYXZhaWxhYmxlIGF0ICZqZXJzZXkuZXh0Lm12Yy1tdXN0YWNoZS5kZXBzLmxpbms7LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICA8dGl0bGU+RnJlZW1hcmtlcjwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEFuIGludGVncmF0aW9uIG1vZHVsZSBmb3IgPGxpbmsgeGxpbms6aHJlZj0iaHR0cDovL2ZyZWVtYXJrZXIub3JnLyI+RnJlZW1hcmtlcjwvbGluaz4tYmFzZWQgdGVtcGxhdGluZyBlbmdpbmUuCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEZyZWVtYXJrZXIgdGVtcGxhdGUgcHJvY2Vzc29yIHJlc29sdmVzIGFic29sdXRlIHRlbXBsYXRlIHJlZmVyZW5jZXMgdG8gcHJvY2Vzc2FibGUgdGVtcGxhdGUgcmVmZXJlbmNlcyByZXByZXNlbnRlZAorICAgICAgICAgICAgICAgIGFzIEZyZWVtYXJrZXIgdGVtcGxhdGVzIGFzIGZvbGxvd3M6CisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwcm9jZWR1cmU+CisgICAgICAgICAgICAgICAgPHRpdGxlPlJlc29sdmluZyBGcmVlbWFya2VyIHRlbXBsYXRlIHJlZmVyZW5jZTwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHN0ZXA+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgdGhlIGFic29sdXRlIHRlbXBsYXRlIHJlZmVyZW5jZSBkb2VzIG5vdCBlbmQgaW4gPGxpdGVyYWw+LmZ0bDwvbGl0ZXJhbD4gYXBwZW5kIHRoaXMgc3VmZml4IHRvIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgcmVmZXJlbmNlOyBhbmQKKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvc3RlcD4KKyAgICAgICAgICAgICAgICA8c3RlcD4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICBpZiA8bGl0ZXJhbD5TZXJ2bGV0Q29udGV4dC5nZXRSZXNvdXJjZTwvbGl0ZXJhbD4sIDxsaXRlcmFsPkNsYXNzLmdldFJlc291cmNlPC9saXRlcmFsPiBvcgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+RmlsZS5leGlzdHM8L2xpdGVyYWw+cmV0dXJucyBhIG5vbi0mbGl0Lm51bGw7IHZhbHVlIGZvciB0aGUgcmVmZXJlbmNlIHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGUgcmVmZXJlbmNlIGFzIHRoZSBwcm9jZXNzYWJsZSB0ZW1wbGF0ZSByZWZlcmVuY2Ugb3RoZXJ3aXNlIHJldHVybiAmbGl0Lm51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICAodG8gaW5kaWNhdGUgdGhlIGFic29sdXRlIHJlZmVyZW5jZSBoYXMgbm90IGJlZW4gcmVzb2x2ZWQgYnkgdGhlIEZyZWVtYXJrZXIgdGVtcGxhdGUgcHJvY2Vzc29yKS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvc3RlcD4KKyAgICAgICAgICAgIDwvcHJvY2VkdXJlPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGh1cyB0aGUgYWJzb2x1dGUgdGVtcGxhdGUgcmVmZXJlbmNlIDxsaXRlcmFsPi9jb20vZm9vL0Zvby9pbmRleDwvbGl0ZXJhbD4gd291bGQgYmUgcmVzb2x2ZWQgdG8KKyAgICAgICAgICAgICAgICA8bGl0ZXJhbD4vY29tL2Zvby9Gb28vaW5kZXguZnRsPC9saXRlcmFsPiwgcHJvdmlkZWQgdGhlcmUgZXhpc3RzIGEgPGxpdGVyYWw+L2NvbS9mb28vRm9vL2luZGV4LmZ0bDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICBGcmVlbWFya2VyIHRlbXBsYXRlIGluIHRoZSBhcHBsaWNhdGlvbi4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEplcnNleSB3aWxsIGFzc2lnbiB0aGUgbW9kZWwgaW5zdGFuY2UgdG8gYW4gYXR0cmlidXRlIG5hbWVkIDxsaXRlcmFsPm1vZGVsPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICBTbyBpdCBpcyBwb3NzaWJsZSB0byByZWZlcmVuY2UgdGhlIDxsaXRlcmFsPmZvbzwvbGl0ZXJhbD4ga2V5IGZyb20gdGhlIHByb3ZpZGVkIDxsaXRlcmFsPk1hcDwvbGl0ZXJhbD4gKE1WQyBNb2RlbCkKKyAgICAgICAgICAgICAgICByZXNvdXJjZSBmcm9tIHRoZSBGcmVlbWFya2VyIHRlbXBsYXRlIGFzIGZvbGxvd3M6CisKKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9InhtbCIgbGluZW51bWJlcmluZz0idW5udW1iZXJlZCI+PCFbQ0RBVEFbPGgxPiR7bW9kZWwuZm9vfTwvaDE+XV0+PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEF2YWlsYWJsZSBjb25maWd1cmF0aW9uIHByb3BlcnRpZXM6CisKKyAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT48bGl0ZXJhbD5GcmVlbWFya2VyTXZjRmVhdHVyZS5URU1QTEFURV9CQVNFX1BBVEg8L2xpdGVyYWw+IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5qZXJzZXkuY29uZmlnLnNlcnZlci5tdmMudGVtcGxhdGVCYXNlUGF0aC5mcmVlbWFya2VyPC9saXRlcmFsPjwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPlRoZSBiYXNlIHBhdGggd2hlcmUgRnJlZW1hcmtlciB0ZW1wbGF0ZXMgYXJlIGxvY2F0ZWQuPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT48bGl0ZXJhbD5GcmVlbWFya2VyTXZjRmVhdHVyZS5DQUNIRV9URU1QTEFURVM8L2xpdGVyYWw+IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5qZXJzZXkuY29uZmlnLnNlcnZlci5tdmMuY2FjaGluZy5mcmVlbWFya2VyPC9saXRlcmFsPjwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPkVuYWJsZXMgY2FjaGluZyBvZiBGcmVlbWFya2VyIHRlbXBsYXRlcyB0byBhdm9pZCBtdWx0aXBsZSBjb21waWxhdGlvbi48L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPjxsaXRlcmFsPkZyZWVtYXJrZXJNdmNGZWF0dXJlLlRFTVBMQVRFX09CSkVDVF9GQUNUT1JZPC9saXRlcmFsPiAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+amVyc2V5LmNvbmZpZy5zZXJ2ZXIubXZjLmZhY3RvcnkuZnJlZW1hcmtlcjwvbGl0ZXJhbD48L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT5Qcm9wZXJ0eSB1c2VkIHRvIHBhc3MgdXNlci1jb25maWd1cmVkIDxsaXRlcmFsPkZyZWVtYXJrZXJGYWN0b3J5PC9saXRlcmFsPi48L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPjxsaXRlcmFsPkZyZWVtYXJrZXJNdmNGZWF0dXJlLkVOQ09ESU5HPC9saXRlcmFsPiAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+amVyc2V5LmNvbmZpZy5zZXJ2ZXIubXZjLmVuY29kaW5nLmZyZWVtYXJrZXI8L2xpdGVyYWw+PC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+UHJvcGVydHkgdXNlZCB0byBjb25maWd1cmUgYSBkZWZhdWx0IGVuY29kaW5nIHRoYXQgd2lsbCBiZSB1c2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbm9uZSBpcyBzcGVjaWZpZWQgaW4gJmpheHJzLlByb2R1Y2VzOyBhbm5vdGF0aW9uLiBJZiBwcm9wZXJ0eSBpcyBub3QgZGVmaW5lZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBVVEYtOCBlbmNvZGluZyB3aWxsIGJlIHVzZWQgYXMgYSBkZWZhdWx0IHZhbHVlLjwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKworICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgTWF2ZW4gdXNlcnMgY2FuIGZpbmQgdGhpcyBtb2R1bGUgYXQgY29vcmRpbmF0ZXMKKworICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0ieG1sIj4mbHQ7ZGVwZW5kZW5jeSZndDsKKyAgICAmbHQ7Z3JvdXBJZCZndDtvcmcuZ2xhc3NmaXNoLmplcnNleS5leHQmbHQ7L2dyb3VwSWQmZ3Q7CisgICAgJmx0O2FydGlmYWN0SWQmZ3Q7amVyc2V5LW12Yy1mcmVlbWFya2VyJmx0Oy9hcnRpZmFjdElkJmd0OworICAgICZsdDt2ZXJzaW9uJmd0OyZ2ZXJzaW9uOyZsdDsvdmVyc2lvbiZndDsKKyZsdDsvZGVwZW5kZW5jeSZndDs8L3Byb2dyYW1saXN0aW5nPgorCisgICAgICAgICAgICAgICAgYW5kIGZvciBub24tTWF2ZW4gdXNlcnMgdGhlIGxpc3Qgb2YgZGVwZW5kZW5jaWVzIGlzIGF2YWlsYWJsZSBhdCAmamVyc2V5LmV4dC5tdmMtZnJlZW1hcmtlci5kZXBzLmxpbms7LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICA8dGl0bGU+SlNQPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgQW4gaW50ZWdyYXRpb24gbW9kdWxlIGZvciBKU1AtYmFzZWQgdGVtcGxhdGluZyBlbmdpbmUuCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxpbXBvcnRhbnQ+CisgICAgICAgICAgICAgICAgPHRpdGxlPkxpbWl0YXRpb25zIG9mIEplcnNleSBKU1AgTVZDIFRlbXBsYXRlczwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEplcnNleSB3ZWIgYXBwbGljYXRpb25zIHRoYXQgd2FudCB0byB1c2UgSlNQIHRlbXBsYXRpbmcgc3VwcG9ydCBzaG91bGQgYmUgcmVnaXN0ZXJlZCBhcyBTZXJ2bGV0CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcnMgcmF0aGVyIHRoYW4gU2VydmxldHMgaW4gdGhlIGFwcGxpY2F0aW9uJ3MgPGxpdGVyYWw+d2ViLnhtbDwvbGl0ZXJhbD4uIFRoZQorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD53ZWIueG1sPC9saXRlcmFsPi1sZXNzIGRlcGxveW1lbnQgc3R5bGUgaW50cm9kdWNlZCBpbiBTZXJ2bGV0IDMuMCBpcyBub3Qgc3VwcG9ydGVkIGF0IHRoZSBtb21lbnQKKyAgICAgICAgICAgICAgICAgICAgZm9yIHdlYiBhcHBsaWNhdGlvbnMgdGhhdCByZXF1aXJlIHVzZSBvZiBKZXJzZXkgTVZDIHRlbXBsYXRpbmcgc3VwcG9ydC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L2ltcG9ydGFudD4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgSlNQIHRlbXBsYXRlIHByb2Nlc3NvciByZXNvbHZlcyBhYnNvbHV0ZSB0ZW1wbGF0ZSByZWZlcmVuY2VzIHRvIHByb2Nlc3NhYmxlIHRlbXBsYXRlIHJlZmVyZW5jZXMgcmVwcmVzZW50ZWQgYXMgSlNQCisgICAgICAgICAgICAgICAgcGFnZXMgYXMgZm9sbG93czoKKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPHByb2NlZHVyZT4KKyAgICAgICAgICAgICAgICA8dGl0bGU+UmVzb2x2aW5nIEpTUCB0ZW1wbGF0ZSByZWZlcmVuY2U8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxzdGVwPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIHRoZSBhYnNvbHV0ZSB0ZW1wbGF0ZSByZWZlcmVuY2UgZG9lcyBub3QgZW5kIGluIDxsaXRlcmFsPi5qc3A8L2xpdGVyYWw+IGFwcGVuZCB0aGlzIHN1ZmZpeCB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZmVyZW5jZTsgYW5kCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L3N0ZXA+CisgICAgICAgICAgICAgICAgPHN0ZXA+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgPGxpdGVyYWw+U2VydmxldENvbnRleHQuZ2V0UmVzb3VyY2U8L2xpdGVyYWw+IHJldHVybnMgYSBub24tJmxpdC5udWxsOyB2YWx1ZSBmb3IgdGhlIHJlZmVyZW5jZSB0aGVuCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhlIHJlZmVyZW5jZSBhcyB0aGUgcHJvY2Vzc2FibGUgdGVtcGxhdGUgcmVmZXJlbmNlIG90aGVyd2lzZSByZXR1cm4gJmxpdC5udWxsOworICAgICAgICAgICAgICAgICAgICAgICAgKHRvIGluZGljYXRlIHRoZSBhYnNvbHV0ZSByZWZlcmVuY2UgaGFzIG5vdCBiZWVuIHJlc29sdmVkIGJ5IHRoZSBKU1AgdGVtcGxhdGUgcHJvY2Vzc29yKS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvc3RlcD4KKyAgICAgICAgICAgIDwvcHJvY2VkdXJlPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGh1cyB0aGUgYWJzb2x1dGUgdGVtcGxhdGUgcmVmZXJlbmNlIDxsaXRlcmFsPi9jb20vZm9vL0Zvby9pbmRleDwvbGl0ZXJhbD4gd291bGQgYmUgcmVzb2x2ZWQgdG8KKyAgICAgICAgICAgICAgICA8bGl0ZXJhbD4vY29tL2Zvby9Gb28vaW5kZXguanNwPC9saXRlcmFsPiwgcHJvdmlkZWQgdGhlcmUgZXhpc3RzIGEgPGxpdGVyYWw+L2NvbS9mb28vRm9vL2luZGV4LmpzcDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICBKU1AgcGFnZSBpbiB0aGUgd2ViIGFwcGxpY2F0aW9uLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgSmVyc2V5IHdpbGwgYXNzaWduIHRoZSBtb2RlbCBpbnN0YW5jZSB0byB0aGUgYXR0cmlidXRlIG5hbWVkIDxsaXRlcmFsPm1vZGVsPC9saXRlcmFsPiBvciA8bGl0ZXJhbD5pdDwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgU28gaXQgaXMgcG9zc2libGUgdG8gcmVmZXJlbmNlIHRoZSA8bGl0ZXJhbD5mb288L2xpdGVyYWw+IHByb3BlcnR5IG9uIHRoZSA8bGl0ZXJhbD5Gb288L2xpdGVyYWw+IHJlc291cmNlCisgICAgICAgICAgICAgICAgZnJvbSB0aGUgSlNQIHRlbXBsYXRlIGFzIGZvbGxvd3M6CisKKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9InhtbCIgbGluZW51bWJlcmluZz0idW5udW1iZXJlZCI+PCFbQ0RBVEFbPGgxPiR7bW9kZWwuZm9vfTwvaDE+XV0+PC9wcm9ncmFtbGlzdGluZz4KKworICAgICAgICAgICAgICAgIG9yCisKKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9InhtbCIgbGluZW51bWJlcmluZz0idW5udW1iZXJlZCI+PCFbQ0RBVEFbPGgxPiR7aXQuZm9vfTwvaDE+XV0+PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRvIGluY2x1ZGUgYW5vdGhlciBKU1AgcGFnZSBpbiB0aGUgY3VycmVudGx5IHByb2Nlc3NlZCBvbmUgYSBjdXN0b20gPGxpdGVyYWw+aW5jbHVkZTwvbGl0ZXJhbD4gdGFnIGNhbiBiZSB1c2VkLgorICAgICAgICAgICAgICAgIE1hbmRhdG9yeSBwYXJhbWV0ZXIgPGxpdGVyYWw+cGFnZTwvbGl0ZXJhbD4gcmVwcmVzZW50cyBhIHJlbGF0aXZlIHRlbXBsYXRlIG5hbWUgd2hpY2ggd291bGQgYmUgYWJzb2x1dGl6ZWQgdXNpbmcKKyAgICAgICAgICAgICAgICB0aGUgc2FtZSByZXNvbHZpbmcgcmVzb3VyY2UgY2xhc3MgYXMgdGhlIHBhcmVudCBKU1AgcGFnZSB0ZW1wbGF0ZS4KKworICAgICAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgICAgICA8dGl0bGU+SW5jbHVkaW5nIEpTUCBwYWdlIGludG8gSlNQIHBhZ2U8L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9InhtbCI+PCFbQ0RBVEFbPCVAcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sIiU+Cis8JUBwYWdlIHBhZ2VFbmNvZGluZz0iVVRGLTgiJT4KKworPCVAdGFnbGliIHByZWZpeD0icmJ0IiB1cmk9InVybjpvcmc6Z2xhc3NmaXNoOmplcnNleTpzZXJ2bGV0Om12YyIgJT4KKworPGh0bWw+CisgICAgPGJvZHk+CisKKyAgICA8cmJ0OmluY2x1ZGUgcGFnZT0iaW5jbHVkZS5qc3AiLz4KKworICAgIDwvYm9keT4KKzwvaHRtbD5dXT48L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEF2YWlsYWJsZSBjb25maWd1cmF0aW9uIHByb3BlcnRpZXM6CisKKyAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT48bGl0ZXJhbD5Kc3BNdmNGZWF0dXJlLlRFTVBMQVRFX0JBU0VfUEFUSDwvbGl0ZXJhbD4gLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmplcnNleS5jb25maWcuc2VydmVyLm12Yy50ZW1wbGF0ZUJhc2VQYXRoLmpzcDwvbGl0ZXJhbD48L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT5UaGUgYmFzZSBwYXRoIHdoZXJlIEpTUCB0ZW1wbGF0ZXMgYXJlIGxvY2F0ZWQuPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgTWF2ZW4gdXNlcnMgY2FuIGZpbmQgdGhpcyBtb2R1bGUgYXQgY29vcmRpbmF0ZXMKKworICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0ieG1sIj4mbHQ7ZGVwZW5kZW5jeSZndDsKKyAgICAmbHQ7Z3JvdXBJZCZndDtvcmcuZ2xhc3NmaXNoLmplcnNleS5leHQmbHQ7L2dyb3VwSWQmZ3Q7CisgICAgJmx0O2FydGlmYWN0SWQmZ3Q7amVyc2V5LW12Yy1qc3AmbHQ7L2FydGlmYWN0SWQmZ3Q7CisgICAgJmx0O3ZlcnNpb24mZ3Q7JnZlcnNpb247Jmx0Oy92ZXJzaW9uJmd0OworJmx0Oy9kZXBlbmRlbmN5Jmd0OzwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgICAgICAgICAgICAgICBhbmQgZm9yIG5vbi1NYXZlbiB1c2VycyB0aGUgbGlzdCBvZiBkZXBlbmRlbmNpZXMgaXMgYXZhaWxhYmxlIGF0ICZqZXJzZXkuZXh0Lm12Yy1qc3AuZGVwcy5saW5rOy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIHhtbDppZD0ibXZjLnNwaSI+CisgICAgICAgIDx0aXRsZT5Xcml0aW5nIEN1c3RvbSBUZW1wbGF0aW5nIEVuZ2luZXM8L3RpdGxlPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVG8gYWRkIHN1cHBvcnQgZm9yIG90aGVyIChjdXN0b20pIHRlbXBsYXRpbmcgZW5naW5lcyBpbnRvIEplcnNleSBNVkMgVGVtcGxhdGluZyBmYWNpbGl0eSwgeW91IG5lZWQgdG8gaW1wbGVtZW50IHRoZQorICAgICAgICAgICAgJmplcnNleS5zZXJ2ZXIubXZjLlRlbXBsYXRlUHJvY2Vzc29yOyBhbmQgcmVnaXN0ZXIgdGhpcyBjbGFzcyBpbnRvIHlvdXIgYXBwbGljYXRpb24uCisKKyAgICAgICAgICAgIDx0aXA+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFdoZW4gd3JpdGluZyB0ZW1wbGF0ZSBwcm9jZXNzb3JzIGl0IGlzIHJlY29tbWVuZCB0aGF0IHlvdSB1c2UgYW4gYXBwcm9wcmlhdGUgdW5pcXVlIHN1ZmZpeCBmb3IgdGhlCisgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NhYmxlIHRlbXBsYXRlIHJlZmVyZW5jZXMsIGluIHdoaWNoIGNhc2UgaXQgaXMgdGhlbiBwb3NzaWJsZSB0byBlYXNpbHkgc3VwcG9ydCBtaXhpbmcgb2YgbXVsdGlwbGUKKyAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGluZyBlbmdpbmVzIGluIGEgc2luZ2xlIGFwcGxpY2F0aW9uIHdpdGhvdXQgY29uZmxpY3RzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvdGlwPgorCisgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICA8dGl0bGU+Q3VzdG9tICZqZXJzZXkuc2VydmVyLm12Yy5UZW1wbGF0ZVByb2Nlc3Nvcjs8L3RpdGxlPgorCisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIj48IVtDREFUQVtAUHJvdmlkZXIKK2NsYXNzIE15VGVtcGxhdGVQcm9jZXNzb3IgaW1wbGVtZW50cyBUZW1wbGF0ZVByb2Nlc3NvcjxTdHJpbmc+IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgcmVzb2x2ZShTdHJpbmcgcGF0aCwgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICBmaW5hbCBTdHJpbmcgZXh0ZW5zaW9uID0gIi50ZXN0cCI7CisKKyAgICAgICAgaWYgKCFwYXRoLmVuZHNXaXRoKGV4dGVuc2lvbikpIHsKKyAgICAgICAgICAgIHBhdGggPSBwYXRoICsgZXh0ZW5zaW9uOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgVVJMIHUgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2UocGF0aCk7CisgICAgICAgIHJldHVybiB1ID09IG51bGwgPyBudWxsIDogcGF0aDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKFN0cmluZyB0ZW1wbGF0ZVJlZmVyZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZpZXdhYmxlIHZpZXdhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFByaW50U3RyZWFtIHBzID0gbmV3IFByaW50U3RyZWFtKG91dCk7CisgICAgICAgIHBzLnByaW50KCJwYXRoPSIpOworICAgICAgICBwcy5wcmludCh0ZW1wbGF0ZVJlZmVyZW5jZSk7CisgICAgICAgIHBzLnByaW50bG4oKTsKKyAgICAgICAgcHMucHJpbnQoIm1vZGVsPSIpOworICAgICAgICBwcy5wcmludCh2aWV3YWJsZS5nZXRNb2RlbCgpLnRvU3RyaW5nKCkpOworICAgICAgICBwcy5wcmludGxuKCk7CisgICAgfQorCit9XV0+PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKworICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgPHRpdGxlPlJlZ2lzdGVyaW5nIGN1c3RvbSAmamVyc2V5LnNlcnZlci5tdmMuVGVtcGxhdGVQcm9jZXNzb3I7PC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiPm5ldyBSZXNvdXJjZUNvbmZpZygpCisgICAgLnJlZ2lzdGVyKE15VGVtcGxhdGVQcm9jZXNzb3IuY2xhc3MpCisgICAgLy8gRnVydGhlciBjb25maWd1cmF0aW9uIG9mIFJlc291cmNlQ29uZmlnLgorICAgIC5yZWdpc3RlciggLi4uICk7PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxub3RlPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgSW4gYSB0eXBpY2FsIHNldC11cCBwcm9qZWN0cyB1c2luZyB0aGUgSmVyc2V5IE1WQyB0ZW1wbGF0aW5nIHN1cHBvcnQgd291bGQgZGVwZW5kIG9uIHRoZSBiYXNlIG1vZHVsZSB0aGF0CisgICAgICAgICAgICAgICAgcHJvdmlkZXMgdGhlIEFQSSBhbmQgU1BJIGFuZCBhIHNpbmdsZSB0ZW1wbGF0aW5nIGVuZ2luZSBtb2R1bGUgZm9yIHRoZSB0ZW1wbGF0aW5nIGVuZ2luZSBvZiB5b3VyIGNob2ljZS4KKyAgICAgICAgICAgICAgICBUaGVzZSBtb2R1bGVzIG5lZWQgdG8gYmUgbWVudGlvbmVkIGV4cGxpY2l0bHkgaW4geW91ciAmbGl0LnBvbS54bWw7IGZpbGUuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvbm90ZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIElmIHlvdSB3YW50IHRvIHVzZSBqdXN0IHRlbXBsYXRpbmcgQVBJIGluZnJhc3RydWN0dXJlIHByb3ZpZGVkIGJ5IEplcnNleSBmb3IgdGhlIE1WQyB0ZW1wbGF0aW5nIHN1cHBvcnQgaW4gb3JkZXIgdG8KKyAgICAgICAgICAgIGltcGxlbWVudCB5b3VyIGN1c3RvbSBzdXBwb3J0IGZvciBhIHRlbXBsYXRpbmcgZW5naW5lIG90aGVyIHRoYW4gdGhlIG9uZXMgcHJvdmlkZWQgYnkgSmVyc2V5LAorICAgICAgICAgICAgeW91IHdpbGwgbmVlZCB0byBhZGQgdGhlIGJhc2UgJmplcnNleS5leHQubXZjLmRlcHMubGluazsgbW9kdWxlIGludG8gdGhlIGxpc3Qgb2YgeW91ciBkZXBlbmRlbmNpZXM6CisKKyAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0ieG1sIj4mbHQ7ZGVwZW5kZW5jeSZndDsKKyAgICAmbHQ7Z3JvdXBJZCZndDtvcmcuZ2xhc3NmaXNoLmplcnNleS5leHQmbHQ7L2dyb3VwSWQmZ3Q7CisgICAgJmx0O2FydGlmYWN0SWQmZ3Q7amVyc2V5LW12YyZsdDsvYXJ0aWZhY3RJZCZndDsKKyAgICAmbHQ7dmVyc2lvbiZndDsmdmVyc2lvbjsmbHQ7L3ZlcnNpb24mZ3Q7CismbHQ7L2RlcGVuZGVuY3kmZ3Q7PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uPgorICAgICAgICA8dGl0bGU+T3RoZXIgRXhhbXBsZXM8L3RpdGxlPgorCisgICAgICAgIDxwYXJhPlRvIHNlZSBhbiBleGFtcGxlIG9mIE1WQyAoSlNQKSB0ZW1wbGF0aW5nIHN1cHBvcnQgaW4gSmVyc2V5IHJlZmVyIHRvIHRoZQorICAgICAgICAgICAgPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5naXRodWIuZXhhbXBsZXMudXJpOy9ib29rc3RvcmUtd2ViYXBwJz5NVkMgKEJvb2tzdG9yZSkgRXhhbXBsZTwvbGluaz4uPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKzwvY2hhcHRlcj4KZGlmZiAtLWdpdCBhL2RvY3Mvc3JjL21haW4vZG9jYm9vay9yZXByZXNlbnRhdGlvbnMueG1sIGIvZG9jcy9zcmMvbWFpbi9kb2Nib29rL3JlcHJlc2VudGF0aW9ucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhhODYwYwotLS0gL2Rldi9udWxsCisrKyBiL2RvY3Mvc3JjL21haW4vZG9jYm9vay9yZXByZXNlbnRhdGlvbnMueG1sCkBAIC0wLDAgKzEsMzc2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8IURPQ1RZUEUgY2hhcHRlciBbPCFFTlRJVFkgJSBlbnRzIFNZU1RFTSAiamVyc2V5LmVudCIgPiAlZW50czsgXT4KKzxjaGFwdGVyIHhtbG5zPSJodHRwOi8vZG9jYm9vay5vcmcvbnMvZG9jYm9vayIKKyAgICAgICAgIHZlcnNpb249IjUuMCIKKyAgICAgICAgIHhtbDpsYW5nPSJlbiIKKyAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIKKyAgICAgICAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vZG9jYm9vay5vcmcvbnMvZG9jYm9vayBodHRwOi8vZG9jYm9vay5vcmcveG1sLzUuMC94c2QvZG9jYm9vay54c2QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayBodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rLnhzZCIKKyAgICAgICAgIHhtbDppZD0icmVwcmVzZW50YXRpb25zIj4KKyAgICA8dGl0bGU+UmVwcmVzZW50YXRpb25zIGFuZCBSZXNwb25zZXM8L3RpdGxlPgorCisgICAgPHNlY3Rpb24geG1sOmlkPSJyZXBzLWFuZC10eXBlcyI+CisgICAgICAgIDx0aXRsZT5SZXByZXNlbnRhdGlvbnMgYW5kIEphdmEgVHlwZXM8L3RpdGxlPgorICAgICAgICA8cGFyYT5QcmV2aW91cyBzZWN0aW9ucyBvbiAmamF4cnMuUHJvZHVjZXM7IGFuZCAmamF4cnMuQ29uc3VtZXM7IGFubm90YXRpb25zCisgICAgICAgICAgICByZWZlcnJlZCB0byBtZWRpYSB0eXBlIG9mIGFuIGVudGl0eSByZXByZXNlbnRhdGlvbi4gRXhhbXBsZXMgYWJvdmUgZGVwaWN0ZWQgcmVzb3VyY2UKKyAgICAgICAgICAgIG1ldGhvZHMgdGhhdCBjb3VsZCBjb25zdW1lIGFuZC9vciBwcm9kdWNlIFN0cmluZyBKYXZhIHR5cGUgZm9yIGEgbnVtYmVyIG9mCisJICAgIGRpZmZlcmVudCBtZWRpYSB0eXBlcy4gVGhpcyBhcHByb2FjaCBpcyBlYXN5IHRvIHVuZGVyc3RhbmQgYW5kIHJlbGF0aXZlbHkKKwkgICAgc3RyYWlnaHRmb3J3YXJkIHdoZW4gYXBwbGllZCB0byBzaW1wbGUgdXNlIGNhc2VzLgorCSAgICA8L3BhcmE+CisKKwkgICAgPHBhcmE+VG8gY292ZXIgYWxzbyBvdGhlciBjYXNlcywgaGFuZGxpbmcgbm9uLXRleHR1YWwgZGF0YSBmb3IgZXhhbXBsZSBvciBoYW5kbGluZyBkYXRhIHN0b3JlZCBpbiB0aGUgZmlsZSBzeXN0ZW0sIGV0Yy4sCisgICAgICAgICAgICBKQVgtUlMgaW1wbGVtZW50YXRpb25zIGFyZSByZXF1aXJlZCB0byBzdXBwb3J0IGFsc28gb3RoZXIga2luZHMgb2YgbWVkaWEgdHlwZQorICAgICAgICAgICAgY29udmVyc2lvbnMgd2hlcmUgYWRkaXRpb25hbCwgbm9uLVN0cmluZywgSmF2YSB0eXBlcyBhcmUgYmVpbmcgdXRpbGl6ZWQuIEZvbGxvd2luZyBpcyBhIHNob3J0IGxpc3Rpbmcgb2YgdGhlIEphdmEgdHlwZXMKKyAgICAgICAgICAgIHRoYXQgYXJlIHN1cHBvcnRlZCBvdXQgb2YgdGhlIGJveCB3aXRoIHJlc3BlY3QgdG8gc3VwcG9ydGVkIG1lZGlhIHR5cGU6CisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgCTxsaXN0aXRlbT5BbGwgbWVkaWEgdHlwZXMgKDxsaXRlcmFsPiovKjwvbGl0ZXJhbD4pCisgICAgICAgICAgICAJCTxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAJCQk8bGlzdGl0ZW0+PGxpdGVyYWw+Ynl0ZVtdPC9saXRlcmFsPjwvbGlzdGl0ZW0+CisJCQkJPGxpc3RpdGVtPjxsaXRlcmFsPmphdmEubGFuZy5TdHJpbmc8L2xpdGVyYWw+PC9saXN0aXRlbT4KKwkJCQk8bGlzdGl0ZW0+PGxpdGVyYWw+amF2YS5pby5SZWFkZXI8L2xpdGVyYWw+IChpbmJvdW5kIG9ubHkpPC9saXN0aXRlbT4KKwkJCQk8bGlzdGl0ZW0+PGxpdGVyYWw+amF2YS5pby5GaWxlPC9saXRlcmFsPjwvbGlzdGl0ZW0+CisJCQkJPGxpc3RpdGVtPjxsaXRlcmFsPmphdmF4LmFjdGl2YXRpb24uRGF0YVNvdXJjZTwvbGl0ZXJhbD48L2xpc3RpdGVtPgorCQkJCTxsaXN0aXRlbT48bGl0ZXJhbD5qYXZheC53cy5ycy5jb3JlLlN0cmVhbWluZ091dHB1dDwvbGl0ZXJhbD4gKG91dGJvdW5kIG9ubHkpPC9saXN0aXRlbT4KKyAgICAgICAgICAgIAkJPC9pdGVtaXplZGxpc3Q+CisJCTwvbGlzdGl0ZW0+CisgICAgICAgICAgICAJPGxpc3RpdGVtPlhNTCBtZWRpYSB0eXBlcyAoPGxpdGVyYWw+dGV4dC94bWw8L2xpdGVyYWw+LCA8bGl0ZXJhbD5hcHBsaWNhdGlvbi94bWw8L2xpdGVyYWw+IGFuZCA8bGl0ZXJhbD5hcHBsaWNhdGlvbi8uLi4reG1sPC9saXRlcmFsPikKKyAgICAgICAgICAgIAkJPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIAkJCTxsaXN0aXRlbT48bGl0ZXJhbD5qYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTwvbGl0ZXJhbD48L2xpc3RpdGVtPgorICAgICAgICAgICAgCQkJPGxpc3RpdGVtPjxsaXRlcmFsPmphdmF4LnhtbC5iaW5kLkpBWEJFbGVtZW50PC9saXRlcmFsPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAJCQk8bGlzdGl0ZW0+QXBwbGljYXRpb24gc3VwcGxpZWQgSkFYQiBjbGFzc2VzICh0eXBlcyBhbm5vdGF0ZWQgd2l0aAorCSAgICA8bGluayB4bGluazpocmVmPSJodHRwOi8vZG9jcy5vcmFjbGUuY29tL2phdmFzZS82L2RvY3MvYXBpL2phdmF4L3htbC9iaW5kL2Fubm90YXRpb24vWG1sUm9vdEVsZW1lbnQuaHRtbCI+QFhtbFJvb3RFbGVtZW50PC9saW5rPgorCSAgICBvcjxsaW5rIHhsaW5rOmhyZWY9Imh0dHA6Ly9kb2NzLm9yYWNsZS5jb20vamF2YXNlLzYvZG9jcy9hcGkvamF2YXgveG1sL2JpbmQvYW5ub3RhdGlvbi9YbWxUeXBlLmh0bWwiPkBYbWxUeXBlPC9saW5rPik8L2xpc3RpdGVtPgorICAgICAgICAgICAgIAkJPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAJPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+Rm9ybSBjb250ZW50ICg8bGl0ZXJhbD5hcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ8L2xpdGVyYWw+KQorICAgICAgICAgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxsaXRlcmFsPk11bHRpdmFsdWVkTWFwJmx0O1N0cmluZyxTdHJpbmcmZ3Q7PC9saXRlcmFsPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPlBsYWluIHRleHQgKDxsaXRlcmFsPnRleHQvcGxhaW48L2xpdGVyYWw+KQorICAgICAgICAgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxsaXRlcmFsPmphdmEubGFuZy5Cb29sZWFuPC9saXRlcmFsPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48bGl0ZXJhbD5qYXZhLmxhbmcuQ2hhcmFjdGVyPC9saXRlcmFsPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48bGl0ZXJhbD5qYXZhLmxhbmcuTnVtYmVyPC9saXRlcmFsPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT5Vbmxpa2UgbWV0aG9kIHBhcmFtZXRlcnMgdGhhdCBhcmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBleHRyYWN0aW9uIG9mCisgICAgICAgICAgICByZXF1ZXN0IHBhcmFtZXRlcnMsIHRoZSBtZXRob2QgcGFyYW1ldGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAgICAgICAgICAgIHJlcHJlc2VudGF0aW9uIGJlaW5nIGNvbnN1bWVkIGRvZXMgbm90IHJlcXVpcmUgYW5ub3RhdGluZy4gSW4gb3RoZXIgd29yZHMgdGhlCisgICAgICAgICAgICByZXByZXNlbnRhdGlvbiAoZW50aXR5KSBwYXJhbWV0ZXIgZG9lcyBub3QgcmVxdWlyZSBhIHNwZWNpZmljICdlbnRpdHknIGFubm90YXRpb24uIEEgbWV0aG9kIHBhcmFtZXRlcgorICAgICAgICAgICAgd2l0aG91dCBhIGFubm90YXRpb24gaXMgYW4gZW50aXR5LiBBIG1heGltdW0gb2YKKyAgICAgICAgICAgIG9uZSBzdWNoIHVuYW5ub3RhdGVkIG1ldGhvZCBwYXJhbWV0ZXIgbWF5IGV4aXN0IHNpbmNlIHRoZXJlIG1heSBvbmx5IGJlIGEKKyAgICAgICAgICAgIG1heGltdW0gb2Ygb25lIHN1Y2ggcmVwcmVzZW50YXRpb24gc2VudCBpbiBhIHJlcXVlc3QuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT5UaGUgcmVwcmVzZW50YXRpb24gYmVpbmcgcHJvZHVjZWQgY29ycmVzcG9uZHMgdG8gd2hhdCBpcyByZXR1cm5lZCBieQorICAgICAgICAgICAgdGhlIHJlc291cmNlIG1ldGhvZC4gRm9yIGV4YW1wbGUgSkFYLVJTIG1ha2VzIGl0IHNpbXBsZSB0byBwcm9kdWNlIGltYWdlcworICAgICAgICAgICAgdGhhdCBhcmUgaW5zdGFuY2Ugb2YKKyAgICAgICAgICAgIDxsaXRlcmFsPkZpbGU8L2xpdGVyYWw+CisgICAgICAgICAgICBhcyBmb2xsb3dzOgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICA8dGl0bGU+VXNpbmcKKyAgICAgICAgICAgICAgICAgICAgPGNvZGU+RmlsZTwvY29kZT4KKyAgICAgICAgICAgICAgICAgICAgd2l0aCBhIHNwZWNpZmljIG1lZGlhIHR5cGUgdG8gcHJvZHVjZSBhIHJlc3BvbnNlCisgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5AR0VUCitAUGF0aCgiL2ltYWdlcy97aW1hZ2V9IikKK0BQcm9kdWNlcygiaW1hZ2UvKiIpCitwdWJsaWMgUmVzcG9uc2UgZ2V0SW1hZ2UoQFBhdGhQYXJhbSgiaW1hZ2UiKSBTdHJpbmcgaW1hZ2UpIHsKKyAgRmlsZSBmID0gbmV3IEZpbGUoaW1hZ2UpOworCisgIGlmICghZi5leGlzdHMoKSkgeworICAgIHRocm93IG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbig0MDQpOworICB9CisKKyAgU3RyaW5nIG10ID0gbmV3IE1pbWV0eXBlc0ZpbGVUeXBlTWFwKCkuZ2V0Q29udGVudFR5cGUoZik7CisgIHJldHVybiBSZXNwb25zZS5vayhmLCBtdCkuYnVpbGQoKTsKK308L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+VGhlCisgICAgICAgICAgICA8bGl0ZXJhbD5GaWxlPC9saXRlcmFsPiB0eXBlIGNhbiBhbHNvIGJlIHVzZWQgd2hlbiBjb25zdW1pbmcgYSByZXByZXNlbnRhdGlvbiAocmVxdWVzdCBlbnRpdHkpLgorICAgICAgICAgICAgSW4gdGhhdCBjYXNlIGEgdGVtcG9yYXJ5IGZpbGUgd2lsbCBiZSBjcmVhdGVkIGZyb20gdGhlIGluY29taW5nIHJlcXVlc3QgZW50aXR5IGFuZCBwYXNzZWQgYXMgYQorICAgICAgICAgICAgcGFyYW1ldGVyIHRvIHRoZSByZXNvdXJjZSBtZXRob2QuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZSA8bGl0ZXJhbD5Db250ZW50LVR5cGU8L2xpdGVyYWw+IHJlc3BvbnNlIGhlYWRlcgorICAgICAgICAgICAgKGlmIG5vdCBzZXQgcHJvZ3JhbW1hdGljYWxseSBhcyBkZXNjcmliZWQgaW4gdGhlIG5leHQgc2VjdGlvbikKKyAgICAgICAgICAgIHdpbGwgYmUgYXV0b21hdGljYWxseSBzZXQgYmFzZWQgb24gdGhlIG1lZGlhIHR5cGVzIGRlY2xhcmVkIGJ5ICZqYXhycy5Qcm9kdWNlczsgYW5ub3RhdGlvbi4KKyBHaXZlbiB0aGUgZm9sbG93aW5nIG1ldGhvZCwgdGhlIG1vc3QgYWNjZXB0YWJsZSBtZWRpYSB0eXBlIGlzIHVzZWQgd2hlbiBtdWx0aXBsZSBvdXRwdXQgbWVkaWEgdHlwZXMgYXJlIGFsbG93ZWQ6CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5AR0VUCitAUHJvZHVjZXMoeyJhcHBsaWNhdGlvbi94bWwiLCAiYXBwbGljYXRpb24vanNvbiJ9KQorcHVibGljIFN0cmluZyBkb0dldEFzWG1sT3JKc29uKCkgeworICAuLi4KK308L3Byb2dyYW1saXN0aW5nPgorCisgICAgICAgICAgICBJZiA8bGl0ZXJhbD5hcHBsaWNhdGlvbi94bWw8L2xpdGVyYWw+IGlzIHRoZSBtb3N0IGFjY2VwdGFibGUgbWVkaWEgdHlwZSBkZWZpbmVkCisgICAgICAgICAgICBieSB0aGUgcmVxdWVzdCAoZS5nLiBieSBoZWFkZXIgPGxpdGVyYWw+QWNjZXB0OiBhcHBsaWNhdGlvbi94bWw8L2xpdGVyYWw+KSwgdGhlbiB0aGUKKyAgICAgICAgICAgIDxsaXRlcmFsPkNvbnRlbnQtVHlwZTwvbGl0ZXJhbD4gcmVzcG9uc2UgaGVhZGVyCisgICAgICAgICAgICB3aWxsIGJlIHNldCB0byA8bGl0ZXJhbD5hcHBsaWNhdGlvbi94bWw8L2xpdGVyYWw+LgorICAgICAgICA8L3BhcmE+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24+CisgICAgICAgIDx0aXRsZT5CdWlsZGluZyBSZXNwb25zZXM8L3RpdGxlPgorCisgICAgICAgIDxwYXJhPlNvbWV0aW1lcyBpdCBpcyBuZWNlc3NhcnkgdG8gcmV0dXJuIGFkZGl0aW9uYWwKKyAgICAgICAgICAgIGluZm9ybWF0aW9uIGluIHJlc3BvbnNlIHRvIGEgSFRUUCByZXF1ZXN0LiBTdWNoIGluZm9ybWF0aW9uIG1heSBiZSBidWlsdAorICAgICAgICAgICAgYW5kIHJldHVybmVkIHVzaW5nICZqYXhycy5jb3JlLlJlc3BvbnNlOyBhbmQgJmpheHJzLmNvcmUuUmVzcG9uc2UuUmVzcG9uc2VCdWlsZGVyOy4KKyAgICAgICAgICAgIEZvciBleGFtcGxlLCBhIGNvbW1vbiBSRVNUZnVsIHBhdHRlcm4gZm9yIHRoZSBjcmVhdGlvbiBvZiBhIG5ldyByZXNvdXJjZQorICAgICAgICAgICAgaXMgdG8gc3VwcG9ydCBhIFBPU1QgcmVxdWVzdCB0aGF0IHJldHVybnMgYSAyMDEgKENyZWF0ZWQpIHN0YXR1cyBjb2RlIGFuZAorICAgICAgICAgICAgYQorICAgICAgICAgICAgPGxpdGVyYWw+TG9jYXRpb248L2xpdGVyYWw+CisgICAgICAgICAgICBoZWFkZXIgd2hvc2UgdmFsdWUgaXMgdGhlIFVSSSB0byB0aGUgbmV3bHkKKyAgICAgICAgICAgIGNyZWF0ZWQgcmVzb3VyY2UuIFRoaXMgbWF5IGJlIGFjaGlldmVkIGFzIGZvbGxvd3M6CisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgIDx0aXRsZT5SZXR1cm5pbmcgMjAxIHN0YXR1cyBjb2RlIGFuZCBhZGRpbmcKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+TG9jYXRpb248L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgIGhlYWRlciBpbiByZXNwb25zZSB0byBQT1NUIHJlcXVlc3QKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPkBQT1NUCitAQ29uc3VtZXMoImFwcGxpY2F0aW9uL3htbCIpCitwdWJsaWMgUmVzcG9uc2UgcG9zdChTdHJpbmcgY29udGVudCkgeworICBVUkkgY3JlYXRlZFVyaSA9IC4uLgorICBjcmVhdGUoY29udGVudCk7CisgIHJldHVybiBSZXNwb25zZS5jcmVhdGVkKGNyZWF0ZWRVcmkpLmJ1aWxkKCk7Cit9PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPkluIHRoZSBhYm92ZSBubyByZXByZXNlbnRhdGlvbiBwcm9kdWNlZCBpcyByZXR1cm5lZCwgdGhpcyBjYW4gYmUKKyAgICAgICAgICAgIGFjaGlldmVkIGJ5IGJ1aWxkaW5nIGFuIGVudGl0eSBhcyBwYXJ0IG9mIHRoZSByZXNwb25zZSBhcyBmb2xsb3dzOgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICA8dGl0bGU+QWRkaW5nIGFuIGVudGl0eSBib2R5IHRvIGEgY3VzdG9tIHJlc3BvbnNlPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5AUE9TVAorQENvbnN1bWVzKCJhcHBsaWNhdGlvbi94bWwiKQorcHVibGljIFJlc3BvbnNlIHBvc3QoU3RyaW5nIGNvbnRlbnQpIHsKKyAgVVJJIGNyZWF0ZWRVcmkgPSAuLi4KKyAgU3RyaW5nIGNyZWF0ZWRDb250ZW50ID0gY3JlYXRlKGNvbnRlbnQpOworICByZXR1cm4gUmVzcG9uc2UuY3JlYXRlZChjcmVhdGVkVXJpKS5lbnRpdHkoRW50aXR5LnRleHQoY3JlYXRlZENvbnRlbnQpKS5idWlsZCgpOworfTwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT5SZXNwb25zZSBidWlsZGluZyBwcm92aWRlcyBvdGhlciBmdW5jdGlvbmFsaXR5IHN1Y2ggYXMgc2V0dGluZyB0aGUKKyAgICAgICAgICAgIGVudGl0eSB0YWcgYW5kIGxhc3QgbW9kaWZpZWQgZGF0ZSBvZiB0aGUgcmVwcmVzZW50YXRpb24uCisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbj4KKyAgICAgICAgPHRpdGxlPldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIGFuZCBNYXBwaW5nIEV4Y2VwdGlvbnMgdG8gUmVzcG9uc2VzPC90aXRsZT4KKworICAgICAgICA8cGFyYT5QcmV2aW91cyBzZWN0aW9uIHNob3dzIGhvdyB0byByZXR1cm4gSFRUUCByZXNwb25zZXMsCisgICAgICAgICAgICAgIHRoYXQgYXJlIGJ1aWx0IHVwIHByb2dyYW1tYXRpY2FsbHkuCisgICAgICAgICAgICBJdCBpcyBwb3NzaWJsZSB0byB1c2UgdGhlIHZlcnkgc2FtZSBtZWNoYW5pc20KKyAgICAgICAgICAgIHRvIHJldHVybiBIVFRQIGVycm9ycyBkaXJlY3RseSwKKyAgICAgICAgICAgIGUuZy4gd2hlbiBoYW5kbGluZyBleGNlcHRpb25zIGluIGEgdHJ5LWNhdGNoIGJsb2NrLgorICAgICAgICAgICAgSG93ZXZlciwgdG8gYmV0dGVyIGFsaWduIHdpdGggdGhlIEphdmEgcHJvZ3JhbW1pbmcgbW9kZWwsCisgICAgICAgICAgICBKQVgtUlMgYWxsb3dzIHRvIGRlZmluZSBkaXJlY3QgbWFwcGluZyBvZiBKYXZhIGV4Y2VwdGlvbnMgdG8gSFRUUCBlcnJvciByZXNwb25zZXMuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT5UaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgdGhyb3dpbmcKKyAgICAgICAgICAgIDxsaXRlcmFsPkN1c3RvbU5vdEZvdW5kRXhjZXB0aW9uPC9saXRlcmFsPgorICAgICAgICAgICAgZnJvbSBhIHJlc291cmNlIG1ldGhvZCBpbiBvcmRlciB0byByZXR1cm4gYW4gZXJyb3IgSFRUUCByZXNwb25zZSB0byB0aGUgY2xpZW50OgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICA8dGl0bGU+VGhyb3dpbmcgZXhjZXB0aW9ucyB0byBjb250cm9sIHJlc3BvbnNlPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5AUGF0aCgiaXRlbXMve2l0ZW1pZH0vIikKK3B1YmxpYyBJdGVtIGdldEl0ZW0oQFBhdGhQYXJhbSgiaXRlbWlkIikgU3RyaW5nIGl0ZW1pZCkgeworICBJdGVtIGkgPSBnZXRJdGVtcygpLmdldChpdGVtaWQpOworICBpZiAoaSA9PSBudWxsKSB7CisgICAgdGhyb3cgbmV3IEN1c3RvbU5vdEZvdW5kRXhjZXB0aW9uKCJJdGVtLCAiICsgaXRlbWlkICsgIiwgaXMgbm90IGZvdW5kIik7CisgIH0KKworICByZXR1cm4gaTsKK308L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+VGhpcyBleGNlcHRpb24gaXMgYW4gYXBwbGljYXRpb24gc3BlY2lmaWMgZXhjZXB0aW9uIHRoYXQgZXh0ZW5kcyAmamF4cnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CisgICAgICAgICAgICBhbmQgYnVpbGRzIGEgSFRUUCByZXNwb25zZSB3aXRoIHRoZSA0MDQgc3RhdHVzIGNvZGUgYW5kIGFuIG9wdGlvbmFsCisgICAgICAgICAgICBtZXNzYWdlIGFzIHRoZSBib2R5IG9mIHRoZSByZXNwb25zZToKKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgPHRpdGxlPkFwcGxpY2F0aW9uIHNwZWNpZmljIGV4Y2VwdGlvbiBpbXBsZW1lbnRhdGlvbjwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+cHVibGljIGNsYXNzIEN1c3RvbU5vdEZvdW5kRXhjZXB0aW9uIGV4dGVuZHMgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworCisgIC8qKgorICAqIENyZWF0ZSBhIEhUVFAgNDA0IChOb3QgRm91bmQpIGV4Y2VwdGlvbi4KKyAgKi8KKyAgcHVibGljIEN1c3RvbU5vdEZvdW5kRXhjZXB0aW9uKCkgeworICAgIHN1cGVyKFJlc3BvbnNlcy5ub3RGb3VuZCgpLmJ1aWxkKCkpOworICB9CisKKyAgLyoqCisgICogQ3JlYXRlIGEgSFRUUCA0MDQgKE5vdCBGb3VuZCkgZXhjZXB0aW9uLgorICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBTdHJpbmcgdGhhdCBpcyB0aGUgZW50aXR5IG9mIHRoZSA0MDQgcmVzcG9uc2UuCisgICovCisgIHB1YmxpYyBDdXN0b21Ob3RGb3VuZEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworICAgIHN1cGVyKFJlc3BvbnNlLnN0YXR1cyhSZXNwb25zZXMuTk9UX0ZPVU5EKS4KKyAgICBlbnRpdHkobWVzc2FnZSkudHlwZSgidGV4dC9wbGFpbiIpLmJ1aWxkKCkpOworICB9Cit9PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPkluIG90aGVyIGNhc2VzIGl0IG1heSBub3QgYmUgYXBwcm9wcmlhdGUgdG8gdGhyb3cgaW5zdGFuY2VzIG9mICZqYXhycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjssCisgICAgICAgICAgICBvciBjbGFzc2VzIHRoYXQgZXh0ZW5kICZqYXhycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjssIGFuZCBpbnN0ZWFkIGl0IG1heSBiZSBwcmVmZXJhYmxlIHRvIG1hcCBhbiBleGlzdGluZyBleGNlcHRpb24gdG8gYQorICAgICAgICAgICAgcmVzcG9uc2UuIEZvciBzdWNoIGNhc2VzIGl0IGlzIHBvc3NpYmxlIHRvIHVzZSBhIGN1c3RvbSBleGNlcHRpb24gbWFwcGluZyBwcm92aWRlci4gVGhlIHByb3ZpZGVyIG11c3QgaW1wbGVtZW50CisgICAgICAgICAgICB0aGUgJmpheHJzLmV4dC5FeGNlcHRpb25NYXBwZXI7IGludGVyZmFjZS4gRm9yIGV4YW1wbGUsIHRoZSBmb2xsb3dpbmcKKyAgICAgICAgICAgIG1hcHMgdGhlCisgICAgICAgICAgICA8bGluayB4bGluazpocmVmPSJodHRwOi8vZG9jcy5vcmFjbGUuY29tL2phdmFlZS81L2FwaS9qYXZheC9wZXJzaXN0ZW5jZS9FbnRpdHlOb3RGb3VuZEV4Y2VwdGlvbi5odG1sIj5FbnRpdHlOb3RGb3VuZEV4Y2VwdGlvbjwvbGluaz4KKyAgICAgICAgICAgIHRvIGEgSFRUUCA0MDQgKE5vdCBGb3VuZCkgcmVzcG9uc2U6CisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgIDx0aXRsZT5NYXBwaW5nIGdlbmVyaWMgZXhjZXB0aW9ucyB0byByZXNwb25zZXM8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPkBQcm92aWRlcgorcHVibGljIGNsYXNzIEVudGl0eU5vdEZvdW5kTWFwcGVyIGltcGxlbWVudHMgRXhjZXB0aW9uTWFwcGVyJmx0O2phdmF4LnBlcnNpc3RlbmNlLkVudGl0eU5vdEZvdW5kRXhjZXB0aW9uJmd0OyB7CisgIHB1YmxpYyBSZXNwb25zZSB0b1Jlc3BvbnNlKGphdmF4LnBlcnNpc3RlbmNlLkVudGl0eU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7CisgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyg0MDQpLgorICAgICAgZW50aXR5KGV4LmdldE1lc3NhZ2UoKSkuCisgICAgICB0eXBlKCJ0ZXh0L3BsYWluIikuCisgICAgICBidWlsZCgpOworICB9Cit9PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPlRoZSBhYm92ZSBjbGFzcyBpcyBhbm5vdGF0ZWQgd2l0aCAmamF4cnMuZXh0LlByb3ZpZGVyOywgdGhpcyBkZWNsYXJlcyB0aGF0IHRoZSBjbGFzcyBpcyBvZiBpbnRlcmVzdCB0byB0aGUgSkFYLVJTIHJ1bnRpbWUuIFN1Y2ggYQorICAgICAgICAgICAgY2xhc3MgbWF5IGJlIGFkZGVkIHRvIHRoZSBzZXQgb2YgY2xhc3NlcyBvZiB0aGUgJmpheHJzLmNvcmUuQXBwbGljYXRpb247IGluc3RhbmNlIHRoYXQgaXMgY29uZmlndXJlZC4gV2hlbiBhbiBhcHBsaWNhdGlvbiB0aHJvd3MgYW4KKyAgICAgICAgICAgIDxsaW5rIHhsaW5rOmhyZWY9Imh0dHA6Ly9kb2NzLm9yYWNsZS5jb20vamF2YWVlLzYvYXBpL2phdmF4L3BlcnNpc3RlbmNlL0VudGl0eU5vdEZvdW5kRXhjZXB0aW9uLmh0bWwiPkVudGl0eU5vdEZvdW5kRXhjZXB0aW9uPC9saW5rPgorICAgICAgICAgICAgdGhlCisgICAgICAgICAgICA8bGl0ZXJhbD50b1Jlc3BvbnNlPC9saXRlcmFsPgorICAgICAgICAgICAgbWV0aG9kIG9mIHRoZQorICAgICAgICAgICAgPGxpdGVyYWw+RW50aXR5Tm90Rm91bmRNYXBwZXI8L2xpdGVyYWw+CisgICAgICAgICAgICBpbnN0YW5jZSB3aWxsIGJlIGludm9rZWQuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEplcnNleSBzdXBwb3J0cyBleHRlbnNpb24gb2YgdGhlIGV4Y2VwdGlvbiBtYXBwZXJzLiBUaGVzZSBleHRlbmRlZCBtYXBwZXJzIG11c3QgaW1wbGVtZW50CisgICAgICAgICAgICB0aGUgPGxpdGVyYWw+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLkV4dGVuZGVkRXhjZXB0aW9uTWFwcGVyPC9saXRlcmFsPiBpbnRlcmZhY2UuIFRoaXMgaW50ZXJmYWNlIGFkZGl0aW9uYWxseQorICAgICAgICAgICAgZGVmaW5lcyBtZXRob2QgPGxpdGVyYWw+aXNNYXBwYWJsZShUaHJvd2FibGUpPC9saXRlcmFsPiB3aGljaCB3aWxsIGJlIGludm9rZWQgYnkgdGhlIEplcnNleSBydW50aW1lCisgICAgICAgICAgICB3aGVuIGV4Y2VwdGlvbiBpcyB0aHJvd24gYW5kIHRoaXMgcHJvdmlkZXIgaXMgY29uc2lkZXJlZCBhcyBtYXBwYWJsZSBiYXNlZCBvbiB0aGUgZXhjZXB0aW9uIHR5cGUuIFVzaW5nIHRoaXMKKyAgICAgICAgICAgIG1ldGhvZCB0aGUgcHJvdmlkZXIgY2FuIHJlamVjdCBtYXBwaW5nIG9mIHRoZSBleGNlcHRpb24gYmVmb3JlIHRoZSBtZXRob2QgPGxpdGVyYWw+dG9SZXNwb25zZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgIGlzIGludm9rZWQuIFRoZSBwcm92aWRlciBjYW4gZm9yIGV4YW1wbGUgY2hlY2sgdGhlIGV4Y2VwdGlvbiBwYXJhbWV0ZXJzIGFuZCBiYXNlZCBvbiB0aGVtIHJldHVybiBmYWxzZQorICAgICAgICAgICAgYW5kIGxldCBvdGhlciBwcm92aWRlciB0byBiZSBjaG9zZW4gZm9yIHRoZSBleGNlcHRpb24gbWFwcGluZy4KKyAgICAgICAgPC9wYXJhPgorCisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24+CisgICAgICAgIDx0aXRsZT5Db25kaXRpb25hbCBHRVRzIGFuZCBSZXR1cm5pbmcgMzA0IChOb3QgTW9kaWZpZWQpIFJlc3BvbnNlczwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+Q29uZGl0aW9uYWwgR0VUcyBhcmUgYSBncmVhdCB3YXkgdG8gcmVkdWNlIGJhbmR3aWR0aCwgYW5kCisgICAgICAgICAgICBwb3RlbnRpYWxseSBpbXByb3ZlIG9uIHRoZSBzZXJ2ZXItc2lkZSBwZXJmb3JtYW5jZSwgZGVwZW5kaW5nIG9uIGhvdyB0aGUgaW5mb3JtYXRpb24gdXNlZAorICAgICAgICAgICAgdG8gZGV0ZXJtaW5lIGNvbmRpdGlvbnMgaXMgY2FsY3VsYXRlZC4gQSB3ZWxsLWRlc2lnbmVkIHdlYiBzaXRlIG1heSBmb3IgZXhhbXBsZSByZXR1cm4KKyAgICAgICAgICAgIDMwNCAoTm90IE1vZGlmaWVkKSByZXNwb25zZXMgZm9yIG1hbnkgb2Ygc3RhdGljIGltYWdlcyBpdCBzZXJ2ZXMuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT5KQVgtUlMgcHJvdmlkZXMgc3VwcG9ydCBmb3IgY29uZGl0aW9uYWwgR0VUcyB1c2luZyB0aGUgY29udGV4dHVhbCBpbnRlcmZhY2UgJmpheHJzLmNvcmUuUmVxdWVzdDsuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT5UaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgY29uZGl0aW9uYWwgR0VUIHN1cHBvcnQ6PC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgPHRpdGxlPkNvbmRpdGlvbmFsIEdFVCBzdXBwb3J0PC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5wdWJsaWMgU3BhcmtsaW5lc1Jlc291cmNlKAorICBAUXVlcnlQYXJhbSgiZCIpIEludGVnZXJMaXN0IGRhdGEsCisgIEBEZWZhdWx0VmFsdWUoIjAsMTAwIikgQFF1ZXJ5UGFyYW0oImxpbWl0cyIpIEludGVydmFsIGxpbWl0cywKKyAgQENvbnRleHQgUmVxdWVzdCByZXF1ZXN0LAorICBAQ29udGV4dCBVcmlJbmZvIHVpKSB7CisgIGlmIChkYXRhID09IG51bGwpIHsKKyAgICB0aHJvdyBuZXcgV2ViQXBwbGljYXRpb25FeGNlcHRpb24oNDAwKTsKKyAgfQorCisgIHRoaXMuZGF0YSA9IGRhdGE7CisgIHRoaXMubGltaXRzID0gbGltaXRzOworCisgIGlmICghbGltaXRzLmNvbnRhaW5zKGRhdGEpKSB7CisgICAgdGhyb3cgbmV3IFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKDQwMCk7CisgIH0KKworICB0aGlzLnRhZyA9IGNvbXB1dGVFbnRpdHlUYWcodWkuZ2V0UmVxdWVzdFVyaSgpKTsKKworICBpZiAocmVxdWVzdC5nZXRNZXRob2QoKS5lcXVhbHMoIkdFVCIpKSB7CisgICAgUmVzcG9uc2UuUmVzcG9uc2VCdWlsZGVyIHJiID0gcmVxdWVzdC5ldmFsdWF0ZVByZWNvbmRpdGlvbnModGFnKTsKKyAgICBpZiAocmIgIT0gbnVsbCkgeworICAgICAgdGhyb3cgbmV3IFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKHJiLmJ1aWxkKCkpOworICAgIH0KKyAgfQorfTwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT5UaGUgY29uc3RydWN0b3Igb2YgdGhlCisgICAgICAgICAgICA8bGl0ZXJhbD5TcGFya2xpbmVzUmVzb3VjZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgIHJvb3QKKyAgICAgICAgICAgIHJlc291cmNlIGNsYXNzIGNvbXB1dGVzIGFuIGVudGl0eSB0YWcgZnJvbSB0aGUgcmVxdWVzdCBVUkkgYW5kIHRoZW4gY2FsbHMKKyAgICAgICAgICAgIHRoZQorICAgICAgICAgICAgPGxpbmsgeGxpbms6aHJlZj0iJmpheHJzLmphdmFkb2MudXJpOy9jb3JlL1JlcXVlc3QuaHRtbCNldmFsdWF0ZVByZWNvbmRpdGlvbnMoamF2YXgud3MucnMuY29yZS5FbnRpdHlUYWcpIj5yZXF1ZXN0LmV2YWx1YXRlUHJlY29uZGl0aW9uczwvbGluaz4KKyAgICAgICAgICAgIHdpdGggdGhhdCBlbnRpdHkgdGFnLiBJZiBhIGNsaWVudCByZXF1ZXN0IGNvbnRhaW5zIGFuCisgICAgICAgICAgICA8bGl0ZXJhbD5JZi1Ob25lLU1hdGNoPC9saXRlcmFsPgorICAgICAgICAgICAgaGVhZGVyIHdpdGggYSB2YWx1ZSB0aGF0IGNvbnRhaW5zIHRoZQorICAgICAgICAgICAgc2FtZSBlbnRpdHkgdGFnIHRoYXQgd2FzIGNhbGN1bGF0ZWQgdGhlbiB0aGUKKyAgICAgICAgICAgIDxsaW5rIHhsaW5rOmhyZWY9IiZqYXhycy5qYXZhZG9jLnVyaTsvY29yZS9SZXF1ZXN0Lmh0bWwjZXZhbHVhdGVQcmVjb25kaXRpb25zKGphdmF4LndzLnJzLmNvcmUuRW50aXR5VGFnKSI+ZXZhbHVhdGVQcmVjb25kaXRpb25zPC9saW5rPgorICAgICAgICAgICAgcmV0dXJucyBhIHByZS1maWxsZWQgb3V0IHJlc3BvbnNlLCB3aXRoIHRoZSAzMDQgc3RhdHVzIGNvZGUgYW5kIGVudGl0eSB0YWcKKyAgICAgICAgICAgIHNldCwgdGhhdCBtYXkgYmUgYnVpbHQgYW5kIHJldHVybmVkLiBPdGhlcndpc2UsCisgICAgICAgICAgICA8bGluayB4bGluazpocmVmPSImamF4cnMuamF2YWRvYy51cmk7L2NvcmUvUmVxdWVzdC5odG1sI2V2YWx1YXRlUHJlY29uZGl0aW9ucyhqYXZheC53cy5ycy5jb3JlLkVudGl0eVRhZykiPmV2YWx1YXRlUHJlY29uZGl0aW9uczwvbGluaz4KKyAgICAgICAgICAgIHJldHVybnMKKyAgICAgICAgICAgIDxsaXRlcmFsPm51bGw8L2xpdGVyYWw+CisgICAgICAgICAgICBhbmQgdGhlIG5vcm1hbCByZXNwb25zZSBjYW4gYmUKKyAgICAgICAgICAgIHJldHVybmVkLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+Tm90aWNlIHRoYXQgaW4gdGhpcyBleGFtcGxlIHRoZSBjb25zdHJ1Y3RvciBvZiBhIHJlc291cmNlIGNsYXNzIGlzIHVzZWQKKyAgICAgICAgICAgIHRvIHBlcmZvcm0gYWN0aW9ucyB0aGF0IG1heSBvdGhlcndpc2UgaGF2ZSB0byBiZSBkdXBsaWNhdGVkIHRvCisgICAgICAgICAgICBpbnZva2VkIGZvciBlYWNoIHJlc291cmNlIG1ldGhvZC4gVGhlIGxpZmUgY3ljbGUgb2YgcmVzb3VyY2UgY2xhc3NlcyBpcyBwZXItcmVxdWVzdAorICAgICAgICAgICAgd2hpY2ggbWVhbnMgdGhhdCB0aGUgcmVzb3VyY2UgaW5zdGFuY2UgaXMgY3JlYXRlZCBmb3IgZWFjaCByZXF1ZXN0IGFuZCB0aGVyZWZvcmUKKyAgICAgICAgICAgIGNhbiB3b3JrIHdpdGggcmVxdWVzdCBwYXJhbWV0ZXJzIGFuZCBmb3IgZXhhbXBsZSBtYWtlIGNoYW5nZXMgdG8gdGhlIHJlcXVlc3QgcHJvY2Vzc2luZyBieQorICAgICAgICAgICAgdGhyb3dpbmcgYW4gZXhjZXB0aW9uIGFzIGl0IGlzIHNob3duIGluIHRoaXMgZXhhbXBsZS4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKzwvY2hhcHRlcj4KZGlmZiAtLWdpdCBhL2RvY3Mvc3JjL21haW4vZG9jYm9vay9yZXNvdXJjZS1idWlsZGVyLnhtbCBiL2RvY3Mvc3JjL21haW4vZG9jYm9vay9yZXNvdXJjZS1idWlsZGVyLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGQ4MDgyCi0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9zcmMvbWFpbi9kb2Nib29rL3Jlc291cmNlLWJ1aWxkZXIueG1sCkBAIC0wLDAgKzEsMzc3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8IURPQ1RZUEUgY2hhcHRlciBbPCFFTlRJVFkgJSBlbnRzIFNZU1RFTSAiamVyc2V5LmVudCIgPiAlZW50czsgXT4KKzxjaGFwdGVyIHhtbG5zPSJodHRwOi8vZG9jYm9vay5vcmcvbnMvZG9jYm9vayIKKyAgICAgICAgIHZlcnNpb249IjUuMCIKKyAgICAgICAgIHhtbDpsYW5nPSJlbiIKKyAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIKKyAgICAgICAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vZG9jYm9vay5vcmcvbnMvZG9jYm9vayBodHRwOi8vZG9jYm9vay5vcmcveG1sLzUuMC94c2QvZG9jYm9vay54c2QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayBodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rLnhzZCIKKyAgICAgICAgIHhtbDppZD0icmVzb3VyY2UtYnVpbGRlciI+CisKKyAgICA8dGl0bGU+UHJvZ3JhbW1hdGljIEFQSSBmb3IgQnVpbGRpbmcgUmVzb3VyY2VzPC90aXRsZT4KKworICAgIDxzZWN0aW9uPgorICAgICAgICA8dGl0bGU+SW50cm9kdWN0aW9uPC90aXRsZT4KKyAgICAgICAgPHBhcmE+QSBzdGFuZGFyZCBhcHByb2FjaCBvZiBkZXZlbG9waW5nIEpBWC1SUyBhcHBsaWNhdGlvbiBpcyB0byBpbXBsZW1lbnQgcmVzb3VyY2UgY2xhc3NlcyBhbm5vdGF0ZWQgd2l0aCAmamF4cnMuUGF0aDsKKyAgICAgICAgICAgIHdpdGggcmVzb3VyY2UgbWV0aG9kcyBhbm5vdGF0ZWQgd2l0aCBIVFRQIG1ldGhvZCBhbm5vdGF0aW9ucyBsaWtlICZqYXhycy5HRVQ7IG9yICZqYXhycy5QT1NUOyBhbmQKKyAgICAgICAgICAgIGltcGxlbWVudCBuZWVkZWQgZnVuY3Rpb25hbGl0eS4gVGhpcyBhcHByb2FjaCBpcyBkZXNjcmliZWQgaW4gdGhlIGNoYXB0ZXIKKyAgICAgICAgICAgIDxsaW5rIHhsaW5rOmhyZWY9ImpheHJzLXJlc291cmNlcy5odG1sIj5KQVgtUlMgQXBwbGljYXRpb24sIFJlc291cmNlcyBhbmQgU3ViLVJlc291cmNlczwvbGluaz4uIEJlc2lkZXMgdGhpcyBzdGFuZGFyZAorICAgICAgICAgICAgSkFYLVJTIGFwcHJvYWNoLCBKZXJzZXkgb2ZmZXJzIGFuIEFQSSBmb3IgY29uc3RydWN0aW5nIHJlc291cmNlcyBwcm9ncmFtbWF0aWNhbGx5LgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgSW1hZ2luZSBhIHNpdHVhdGlvbiB3aGVyZSBhIGRlcGxveWVkIEpBWC1SUyBhcHBsaWNhdGlvbiBjb25zaXN0cyBvZiBtYW55IHJlc291cmNlIGNsYXNzZXMuIFRoZXNlIHJlc291cmNlcyBpbXBsZW1lbnQKKyAgICAgICAgICAgIHN0YW5kYXJkIEhUVFAgbWV0aG9kcyBsaWtlICAmamF4cnMuR0VUOywgJmpheHJzLlBPU1Q7LCAmamF4cnMuREVMRVRFOy4gSW4gc29tZSBzaXR1YXRpb25zIGl0IHdvdWxkIGJlIHVzZWZ1bCB0byBhZGQKKyAgICAgICAgICAgIGFuICZqYXhycy5PUFRJT05TOyBtZXRob2Qgd2hpY2ggd291bGQgcmV0dXJuIHNvbWUga2luZCBvZiBtZXRhIGRhdGEgYWJvdXQgdGhlIGRlcGxveWVkIHJlc291cmNlLiBJZGVhbGx5LCB5b3Ugd291bGQKKyAgICAgICAgICAgIHdhbnQgdG8gZXhwb3NlIHRoZSBmdW5jdGlvbmFsaXR5IGFzIGFuIGFkZGl0aW9uYWwgZmVhdHVyZSBhbmQgeW91IHdhbnQgdG8gZGVjaWRlIGF0IHRoZSBkZXBsb3kgdGltZSB3aGV0aGVyIHlvdSB3YW50CisgICAgICAgICAgICB0byBhZGQgeW91ciBjdXN0b20gJmxpdC5odHRwLk9QVElPTlM7IG1ldGhvZC4gSG93ZXZlciwgd2hlbiBjdXN0b20gJmxpdC5odHRwLk9QVElPTlM7IG1ldGhvZCBhcmUgbm90CisgICAgICAgICAgICBlbmFibGVkIHlvdSB3b3VsZCBsaWtlIHRvIGJlICZsaXQuaHR0cC5PUFRJT05TOyByZXF1ZXN0cyBoYW5kbGVkIGluIHRoZSBzdGFuZGFyZCB3YXkgYnkgSkFYLVJTIHJ1bnRpbWUuIFRvCisgICAgICAgICAgICBhY2hpZXZlIHRoaXMgeW91IHdvdWxkIG5lZWQgdG8gbW9kaWZ5IHRoZSBjb2RlIHRvIGFkZCBvciByZW1vdmUgY3VzdG9tICZsaXQuaHR0cC5PUFRJT05TOyBtZXRob2RzIGJlZm9yZQorICAgICAgICAgICAgZGVwbG95bWVudC4gQW5vdGhlciB3YXkgd291bGQgYmUgdG8gdXNlIHByb2dyYW1tYXRpYyBBUEkgdG8gYnVpbGQgcmVzb3VyY2UgYWNjb3JkaW5nIHRvIHlvdXIgbmVlZHMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBBbm90aGVyIHVzZSBjYXNlIG9mIHByb2dyYW1tYXRpYyByZXNvdXJjZSBidWlsZGVyIEFQSSBpcyB3aGVuIHlvdSBidWlsZCBhbnkgZ2VuZXJpYyBSRVNUZnVsIGludGVyZmFjZSB3aGljaAorICAgICAgICAgICAgZGVwZW5kcyBvbiBsb3Qgb2YgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIG9yIGZvciBleGFtcGxlIGRhdGFiYXNlIHN0cnVjdHVyZS4gWW91ciByZXNvdXJjZSBjbGFzc2VzIHdvdWxkCisgICAgICAgICAgICBuZWVkIHRvIGhhdmUgZGlmZmVyZW50IG1ldGhvZHMsIGRpZmZlcmVudCBzdHJ1Y3R1cmUgZm9yIGV2ZXJ5IG5ldyBhcHBsaWNhdGlvbiBkZXBsb3kuIFlvdSBjb3VsZCB1c2UgbW9yZSBzb2x1dGlvbnMKKyAgICAgICAgICAgIGluY2x1ZGluZyBhcHByb2FjaGVzIHdoZXJlIHlvdXIgcmVzb3VyY2UgY2xhc3NlcyB3b3VsZCBiZSBidWlsdCB1c2luZyBKYXZhIGJ5dGUgY29kZSBtYW5pcHVsYXRpb24uCisgICAgICAgICAgICBIb3dldmVyLCB0aGlzIGlzIGV4YWN0bHkgdGhlIGNhc2Ugd2hlbiB5b3UgY2FuIHNvbHZlIHRoZSBwcm9ibGVtIGNsZWFubHkgd2l0aCB0aGUgcHJvZ3JhbW1hdGljIHJlc291cmNlIGJ1aWxkZXIgQVBJLgorICAgICAgICAgICAgTGV0J3MgaGF2ZSBhIGNsb3NlciBsb29rIGF0IGhvdyB0aGUgQVBJIGNhbiBiZSB1dGlsaXplZC4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uPgorICAgICAgICA8dGl0bGU+UHJvZ3JhbW1hdGljIEhlbGxvIFdvcmxkIGV4YW1wbGU8L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEplcnNleSBQcm9ncmFtbWF0aWMgQVBJIHdhcyBkZXNpZ25lZCB0byBmdWxseSBzdXBwb3J0IEpBWC1SUyByZXNvdXJjZSBtb2RlbC4gSW4gb3RoZXIgd29yZHMsIGV2ZXJ5IHJlc291cmNlIHRoYXQgY2FuCisgICAgICAgICAgICBiZSBkZXNpZ25lZCB1c2luZyBzdGFuZGFyZCBKQVgtUlMgYXBwcm9hY2ggdmlhIGFubm90YXRlZCByZXNvdXJjZSBjbGFzc2VzIGNhbiBiZSBhbHNvIG1vZGVsbGVkIHVzaW5nIEplcnNleQorICAgICAgICAgICAgcHJvZ3JhbW1hdGljIEFQSS4gTGV0J3MgdHJ5IHRvIGJ1aWxkIHNpbXBsZSBoZWxsbyB3b3JsZCByZXNvdXJjZSB1c2luZyBzdGFuZGFyZCBhcHByb2FjaCBmaXJzdCBhbmQKKyAgICAgICAgICAgIHRoZW4gdXNpbmcgdGhlIEplcnNleSBwcm9ncmFtbWF0aWMgcmVzb3VyY2UgYnVpbGRlciBBUEkuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3Mgc3RhbmRhcmQgSkFYLVJTICJIZWxsbyB3b3JsZCEiIHJlc291cmNlIGNsYXNzLgorICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgPHRpdGxlPkEgc3RhbmRhcmQgcmVzb3VyY2UgY2xhc3M8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPgorICAgICAgICAgICAgICAgICAgICBAUGF0aCgiaGVsbG93b3JsZCIpCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBjbGFzcyBIZWxsb1dvcmxkUmVzb3VyY2UgeworCisgICAgICAgICAgICAgICAgICAgICAgICBAR0VUCisgICAgICAgICAgICAgICAgICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRIZWxsbygpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkhlbGxvIFdvcmxkISI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICAgICAgVGhpcyBpcyBqdXN0IGEgc2ltcGxlIHJlc291cmNlIGNsYXNzIHdpdGggb25lIEdFVCBtZXRob2QgcmV0dXJuaW5nICJIZWxsbyBXb3JsZCEiIHN0cmluZyB0aGF0IHdpbGwgYmUgc2VyaWFsaXplZAorICAgICAgICAgICAgYXMgdGV4dC9wbGFpbiBtZWRpYSB0eXBlLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBOb3cgd2Ugd2lsbCBkZXNpZ24gdGhpcyBzaW1wbGUgcmVzb3VyY2UgdXNpbmcgcHJvZ3JhbW1hdGljIEFQSS4KKyAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgIDx0aXRsZT5BIHByb2dyYW1tYXRpYyByZXNvdXJjZTwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+CisgICAgICAgICAgICAgICAgICAgIHBhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuaGVsbG93b3JsZDsKKworICAgICAgICAgICAgICAgICAgICBpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworICAgICAgICAgICAgICAgICAgICBpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisgICAgICAgICAgICAgICAgICAgIGltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLkluZmxlY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKyAgICAgICAgICAgICAgICAgICAgaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZTsKKyAgICAgICAgICAgICAgICAgICAgaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1ldGhvZDsKKworCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlSZXNvdXJjZUNvbmZpZyBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE15UmVzb3VyY2VDb25maWcoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVzb3VyY2UuQnVpbGRlciByZXNvdXJjZUJ1aWxkZXIgPSBSZXNvdXJjZS5idWlsZGVyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VCdWlsZGVyLnBhdGgoImhlbGxvd29ybGQiKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlc291cmNlTWV0aG9kLkJ1aWxkZXIgbWV0aG9kQnVpbGRlciA9IHJlc291cmNlQnVpbGRlci5hZGRNZXRob2QoIkdFVCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZEJ1aWxkZXIucHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5oYW5kbGVkQnkobmV3IEluZmxlY3RvciZsdDtDb250YWluZXJSZXF1ZXN0Q29udGV4dCwgU3RyaW5nPigpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBhcHBseShDb250YWluZXJSZXF1ZXN0Q29udGV4dCBjb250YWluZXJSZXF1ZXN0Q29udGV4dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJIZWxsbyBXb3JsZCEiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlQnVpbGRlci5idWlsZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyUmVzb3VyY2VzKHJlc291cmNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgICAgICBGaXJzdCwgZm9jdXMgb24gdGhlIGNvbnRlbnQgb2YgdGhlIDxsaXRlcmFsPk15UmVzb3VyY2VDb25maWc8L2xpdGVyYWw+IGNvbnN0cnVjdG9yIGluIHRoZSBleGFtcGxlLgorICAgICAgICAgICAgVGhlIEplcnNleSBwcm9ncmFtbWF0aWMgcmVzb3VyY2UgbW9kZWwgaXMgY29uc3RydWN0ZWQgZnJvbSA8bGl0ZXJhbD5SZXNvdXJjZTwvbGl0ZXJhbD5zIHRoYXQgY29udGFpbgorICAgICAgICAgICAgPGxpdGVyYWw+UmVzb3VyY2VNZXRob2Q8L2xpdGVyYWw+cy4gSW4gdGhlIGV4YW1wbGUsIGEgc2luZ2xlIHJlc291cmNlIHdvdWxkIGJlIGNvbnN0cnVjdGVkIGZyb20gYQorICAgICAgICAgICAgPGxpdGVyYWw+UmVzb3VyY2U8L2xpdGVyYWw+IGNvbnRhaW5pbmcgb25lICZsaXQuaHR0cC5HRVQ7IHJlc291cmNlIG1ldGhvZCB0aGF0IHJldHVybnMgIkhlbGxvIFdvcmxkISIuCisgICAgICAgICAgICBUaGUgbWFpbiBlbnRyeSBwb2ludCBmb3IgYnVpbGRpbmcgcHJvZ3JhbW1hdGljIHJlc291cmNlcyBpbiBKZXJzZXkgaXMgdGhlCisgICAgICAgICAgICA8ZW1waGFzaXM+PGxpdGVyYWw+UmVzb3VyY2UuQnVpbGRlcjwvbGl0ZXJhbD48L2VtcGhhc2lzPiBjbGFzcy4gPGxpdGVyYWw+UmVzb3VyY2UuQnVpbGRlcjwvbGl0ZXJhbD4gY29udGFpbnMganVzdAorICAgICAgICAgICAgYSBmZXcgbWV0aG9kcyBsaWtlIHRoZSA8bGl0ZXJhbD5wYXRoPC9saXRlcmFsPiBtZXRob2QgdXNlZCBpbiB0aGUgZXhhbXBsZSwgd2hpY2ggc2V0cyB0aGUgbmFtZSBvZiB0aGUgcGF0aC4gQW5vdGhlcgorICAgICAgICAgICAgdXNlZnVsIG1ldGhvZCBpcyBhIDxsaXRlcmFsPmFkZE1ldGhvZChTdHJpbmcgcGF0aCk8L2xpdGVyYWw+IHdoaWNoIGFkZHMgYSBuZXcgbWV0aG9kIHRvIHRoZSByZXNvdXJjZSBidWlsZGVyIGFuZAorICAgICAgICAgICAgcmV0dXJucyBhIHJlc291cmNlIG1ldGhvZCBidWlsZGVyIGZvciB0aGUgbmV3IG1ldGhvZC4gUmVzb3VyY2UgbWV0aG9kIGJ1aWxkZXIgY29udGFpbnMgbWV0aG9kcyB3aGljaAorICAgICAgICAgICAgc2V0IGNvbnN1bWVkIGFuZCBwcm9kdWNlZCBtZWRpYSB0eXBlLCBkZWZpbmUgbmFtZSBiaW5kaW5ncywgdGltZW91dCBmb3IgYXN5bmNocm9ub3VzIGV4ZWN1dGlvbnMsIGV0Yy4gSXQgaXMgYWx3YXlzCisgICAgICAgICAgICBuZWNlc3NhcnkgdG8gZGVmaW5lIGEgcmVzb3VyY2UgbWV0aG9kIGhhbmRsZXIgKGkuZS4gdGhlIGNvZGUgb2YgdGhlIHJlc291cmNlIG1ldGhvZCB0aGF0IHdpbGwgcmV0dXJuICJIZWxsbyBXb3JsZCEiKS4KKyAgICAgICAgICAgIFRoZXJlIGFyZSBtb3JlIG9wdGlvbnMgaG93IGEgcmVzb3VyY2UgbWV0aG9kIGNhbiBiZSBoYW5kbGVkLiBJbiB0aGUgZXhhbXBsZSB0aGUgaW1wbGVtZW50YXRpb24gb2YKKyAgICAgICAgICAgIDxsaXRlcmFsPkluZmxlY3RvcjwvbGl0ZXJhbD4gaXMgdXNlZC4gVGhlIEplcnNleSA8bGl0ZXJhbD5JbmZsZWN0b3I8L2xpdGVyYWw+IGludGVyZmFjZSBkZWZpbmVzIGEgc2ltcGxlIGNvbnRyYWN0IGZvcgorICAgICAgICAgICAgdHJhbnNmb3JtYXRpb24gb2YgYSByZXF1ZXN0IGludG8gYSByZXNwb25zZS4gQW4gaW5mbGVjdG9yIGNhbiBlaXRoZXIgcmV0dXJuIGEgJmpheHJzLmNvcmUuUmVzcG9uc2U7IG9yIGRpcmVjdGx5CisgICAgICAgICAgICBhbiBlbnRpdHkgb2JqZWN0LCB0aGUgd2F5IGl0IGlzIHNob3duIGluIHRoZSBleGFtcGxlLiBBbm90aGVyIG9wdGlvbiBpcyB0byBzZXR1cCBhIEphdmEgbWV0aG9kIGhhbmRsZXIgdXNpbmcKKyAgICAgICAgICAgIDxsaXRlcmFsPmhhbmRsZWRCeShDbGFzcyZsdDs/Jmd0OyBoYW5kbGVyQ2xhc3MsIE1ldGhvZCBtZXRob2QpPC9saXRlcmFsPiBhbmQgcGFzcyBpdCB0aGUgY2hvc2VuCisgICAgICAgICAgICA8bGl0ZXJhbD5qYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q8L2xpdGVyYWw+IGluc3RhbmNlIHRvZ2V0aGVyIHdpdGggdGhlIGVuY2xvc2luZyBjbGFzcy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEEgcmVzb3VyY2UgbWV0aG9kIG1vZGVsIGNvbnN0cnVjdGlvbiBjYW4gYmUgZXhwbGljaXRseSBjb21wbGV0ZWQgYnkgaW52b2tpbmcgPGxpdGVyYWw+YnVpbGQoKTwvbGl0ZXJhbD4gb24gdGhlCisgICAgICAgICAgICByZXNvdXJjZSBtZXRob2QgYnVpbGRlci4gSXQgaXMgaG93ZXZlciBub3QgbmVjZXNzYXJ5IHRvIGRvIHNvIGFzIHRoZSBuZXcgcmVzb3VyY2UgbWV0aG9kIG1vZGVsIHdpbGwgYmUgYnVpbHQKKyAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgb25jZSB0aGUgcGFyZW50IHJlc291cmNlIGlzIGJ1aWx0LiBPbmNlIGEgcmVzb3VyY2UgbW9kZWwgaXMgYnVpbHQsIGl0IGlzIHJlZ2lzdGVyZWQKKyAgICAgICAgICAgIGludG8gdGhlIHJlc291cmNlIGNvbmZpZyBhdCB0aGUgbGFzdCBsaW5lIG9mIHRoZSA8bGl0ZXJhbD5NeVJlc291cmNlQ29uZmlnPC9saXRlcmFsPiBjb25zdHJ1Y3RvciBpbiB0aGUgZXhhbXBsZS4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxzZWN0aW9uPgorICAgICAgICAgICAgPHRpdGxlPkRlcGxveW1lbnQgb2YgcHJvZ3JhbW1hdGljIHJlc291cmNlczwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIExldCdzIG5vdyBsb29rIGF0IGhvdyBhIHByb2dyYW1tYXRpYyByZXNvdXJjZXMgYXJlIGRlcGxveWVkLgorICAgICAgICAgICAgICAgIFRoZSBlYXNpZXN0IHdheSB0byBzZXR1cCB5b3VyIGFwcGxpY2F0aW9uIGFzIHdlbGwgYXMgcmVnaXN0ZXIgYW55IHByb2dyYW1tYXRpYyByZXNvdXJjZXMgaW4gSmVyc2V5CisgICAgICAgICAgICAgICAgaXMgdG8gdXNlIGEgSmVyc2V5ICZsaXQuamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsgdXRpbGl0eSBjbGFzcywgYW4gZXh0ZW5zaW9uIG9mICZqYXhycy5jb3JlLkFwcGxpY2F0aW9uOworICAgICAgICAgICAgICAgIGNsYXNzLgorICAgICAgICAgICAgICAgIElmIHlvdSBkZXBsb3kgeW91ciBKZXJzZXkgYXBwbGljYXRpb24gaW50byBhIFNlcnZsZXQgY29udGFpbmVyIHlvdSB3aWxsIG5lZWQgdG8gcHJvdmlkZSBhICZqYXhycy5jb3JlLkFwcGxpY2F0aW9uOworICAgICAgICAgICAgICAgIHN1YmNsYXNzIHRoYXQgd2lsbCBiZSB1c2VkIGZvciBjb25maWd1cmF0aW9uLiBZb3UgbWF5IHVzZSBhIDxsaXRlcmFsPndlYi54bWw8L2xpdGVyYWw+IHdoZXJlIHlvdSB3b3VsZCBkZWZpbmUgYQorICAgICAgICAgICAgICAgIDxsaXRlcmFsPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvbGl0ZXJhbD4gU2VydmxldCBlbnRyeSB0aGVyZSBhbmQgc3BlY2lmeSBpbml0aWFsIHBhcmFtZXRlcgorICAgICAgICAgICAgICAgIDxsaXRlcmFsPmphdmF4LndzLnJzLkFwcGxpY2F0aW9uPC9saXRlcmFsPiB3aXRoIHRoZSBjbGFzcyBuYW1lIG9mIHlvdXIgSkFYLVJTIEFwcGxpY2F0aW9uIHRoYXQgeW91CisgICAgICAgICAgICAgICAgd2lzaCB0byBkZXBsb3kuIEluIHRoZSBleGFtcGxlIGFib3ZlLCB0aGlzIGFwcGxpY2F0aW9uIHdpbGwgYmUgPGxpdGVyYWw+TXlSZXNvdXJjZUNvbmZpZzwvbGl0ZXJhbD4gY2xhc3MuIFRoaXMgaXMKKyAgICAgICAgICAgICAgICB0aGUgcmVhc29uIHdoeSA8bGl0ZXJhbD5NeVJlc291cmNlQ29uZmlnPC9saXRlcmFsPiBleHRlbmRzIHRoZSAmbGl0LmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7ICh3aGljaCwgaWYgeW91CisgICAgICAgICAgICAgICAgcmVtZW1iZXIgZXh0ZW5kcyB0aGUgPGxpdGVyYWw+amF2YXgud3MucnMuQXBwbGljYXRpb248L2xpdGVyYWw+KS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBhIGZyYWdtZW50IG9mIDxsaXRlcmFsPndlYi54bWw8L2xpdGVyYWw+IHRoYXQgY2FuIGJlIHVzZWQgdG8gZGVwbG95IHRoZQorICAgICAgICAgICAgICAgICZsaXQuamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsgSkFYLVJTIGFwcGxpY2F0aW9uLgorICAgICAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgICAgICA8dGl0bGU+QSBwcm9ncmFtbWF0aWMgcmVzb3VyY2U8L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9InhtbCIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPgorICAgICAgICAgICAgICAgICAgICAgICAgLi4uCisgICAgICAgICAgICAgICAgICAgICAgICAmbHQ7c2VydmxldCZndDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbHQ7c2VydmxldC1uYW1lJmd0O29yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmhlbGxvd29ybGQuTXlBcHBsaWNhdGlvbiZsdDsvc2VydmxldC1uYW1lJmd0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsdDtzZXJ2bGV0LWNsYXNzJmd0O29yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lciZsdDsvc2VydmxldC1jbGFzcyZndDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbHQ7aW5pdC1wYXJhbSZndDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmx0O3BhcmFtLW5hbWUmZ3Q7amF2YXgud3MucnMuQXBwbGljYXRpb24mbHQ7L3BhcmFtLW5hbWUmZ3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsdDtwYXJhbS12YWx1ZSZndDtvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5oZWxsb3dvcmxkLk15UmVzb3VyY2VDb25maWcmbHQ7L3BhcmFtLXZhbHVlJmd0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsdDsvaW5pdC1wYXJhbSZndDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbHQ7bG9hZC1vbi1zdGFydHVwJmd0OzEmbHQ7L2xvYWQtb24tc3RhcnR1cCZndDsKKyAgICAgICAgICAgICAgICAgICAgICAgICZsdDsvc2VydmxldCZndDsKKyAgICAgICAgICAgICAgICAgICAgICAgICZsdDtzZXJ2bGV0LW1hcHBpbmcmZ3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmx0O3NlcnZsZXQtbmFtZSZndDtvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5oZWxsb3dvcmxkLk15QXBwbGljYXRpb24mbHQ7L3NlcnZsZXQtbmFtZSZndDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbHQ7dXJsLXBhdHRlcm4mZ3Q7LyombHQ7L3VybC1wYXR0ZXJuJmd0OworICAgICAgICAgICAgICAgICAgICAgICAgJmx0Oy9zZXJ2bGV0LW1hcHBpbmcmZ3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAuLi4KKyAgICAgICAgICAgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBJZiB5b3UgdXNlIGFub3RoZXIgZGVwbG95bWVudCBvcHRpb25zIGFuZCB5b3UgaGF2ZSBhY2Nlc3NpYmxlIGluc3RhbmNlIG9mIFJlc291cmNlQ29uZmlnIHdoaWNoIHlvdSB1c2UKKyAgICAgICAgICAgICAgICBmb3IgY29uZmlndXJhdGlvbiwgeW91IGNhbiByZWdpc3RlciBwcm9ncmFtbWF0aWMgcmVzb3VyY2VzIGRpcmVjdGx5IGJ5IDxsaXRlcmFsPnJlZ2lzdGVyUmVzb3VyY2VzKCk8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgbWV0aG9kIGNhbGxlZCBvbiB0aGUgUmVzb3VyY2VDb25maWcuIFBsZWFzZSBub3RlIHRoYXQgdGhlIG1ldGhvZCByZWdpc3RlclJlc291cmNlcygpIHJlcGxhY2VzIGFsbCB0aGUgcHJldmlvdXNseQorICAgICAgICAgICAgICAgIHJlZ2lzdGVyZWQgcmVzb3VyY2VzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgQmVjYXVzZSBKZXJzZXkgcHJvZ3JhbW1hdGljIEFQSSBpcyBub3QgYSBzdGFuZGFyZCBKQVgtUlMgZmVhdHVyZSB0aGUgJmxpdC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOyBtdXN0IGJlCisgICAgICAgICAgICAgICAgdXNlZCB0byByZWdpc3RlciBwcm9ncmFtbWF0aWMgcmVzb3VyY2VzIGFzIHNob3duIGFib3ZlLiBTZWUgPGxpbmsgbGlua2VuZD0iZGVwbG95bWVudCI+ZGVwbG95bWVudCBjaGFwdGVyPC9saW5rPgorICAgICAgICAgICAgICAgIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24+CisgICAgICAgIDx0aXRsZT5BZGRpdGlvbmFsIGV4YW1wbGVzPC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICA8dGl0bGU+QSBwcm9ncmFtbWF0aWMgcmVzb3VyY2U8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPgorICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZS5CdWlsZGVyIHJlc291cmNlQnVpbGRlciA9IFJlc291cmNlLmJ1aWxkZXIoSGVsbG9Xb3JsZFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VCdWlsZGVyLmFkZE1ldGhvZCgiT1BUSU9OUyIpCisgICAgICAgICAgICAgICAgICAgICAgICAuaGFuZGxlZEJ5KG5ldyBJbmZsZWN0b3ImbHQ7Q29udGFpbmVyUmVxdWVzdENvbnRleHQsIFJlc3BvbnNlJmd0OygpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgUmVzcG9uc2UgYXBwbHkoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgY29udGFpbmVyUmVxdWVzdENvbnRleHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCJUaGlzIGlzIGEgcmVzcG9uc2UgdG8gYW4gT1BUSU9OUyBtZXRob2QuIikuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZUJ1aWxkZXIuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgSW4gdGhlIGV4YW1wbGUgYWJvdmUgdGhlIDxsaXRlcmFsPlJlc291cmNlPC9saXRlcmFsPiBpcyBidWlsdCBmcm9tCisgICAgICAgICAgICBhIDxsaXRlcmFsPkhlbGxvV29ybGRSZXNvdXJjZTwvbGl0ZXJhbD4gcmVzb3VyY2UgY2xhc3MuIFRoZSByZXNvdXJjZSBtb2RlbCBidWlsdCB0aGlzIHdheQorICAgICAgICAgICAgY29udGFpbnMgYSAmbGl0Lmh0dHAuR0VUOyBtZXRob2QgcHJvZHVjaW5nIDxsaXRlcmFsPid0ZXh0L3BsYWluJzwvbGl0ZXJhbD4gcmVzcG9uc2VzIHdpdGggIkhlbGxvIFdvcmxkISIgZW50aXR5LgorICAgICAgICAgICAgVGhpcyBpcyBxdWl0ZSBpbXBvcnRhbnQgYXMgaXQgYWxsb3dzIHlvdSB0byB3aGF0ZXZlciBSZXNvdXJjZSBvYmplY3RzIGJhc2VkIG9uIGludHJvc3BlY3RpbmcKKyAgICAgICAgICAgIGV4aXN0aW5nIEpBWC1SUyByZXNvdXJjZXMgYW5kIHVzZSBidWlsZGVyIEFQSSB0byBlbmhhbmNlIHN1Y2ggdGhlc2Ugc3RhbmRhcmQgcmVzb3VyY2VzLgorICAgICAgICAgICAgSW4gdGhlIGV4YW1wbGUgd2UgdXNlZCBhbHJlYWR5IGltcGxlbWVudGVkIDxsaXRlcmFsPkhlbGxvV29ybGRSZXNvdXJjZTwvbGl0ZXJhbD4gcmVzb3VyY2UgY2xhc3MKKyAgICAgICAgICAgIGFuZCBlbmhhbmNlZCBpdCBieSAmbGl0Lmh0dHAuT1BUSU9OUzsgbWV0aG9kLiBUaGUgJmxpdC5odHRwLk9QVElPTlM7IG1ldGhvZCBpcyBoYW5kbGVkIGJ5IGFuIEluZmxlY3RvciB3aGljaAorICAgICAgICAgICAgcmV0dXJucyAmamF4cnMuY29yZS5SZXNwb25zZTsuCisgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaGUgZm9sbG93aW5nIHNhbXBsZSBzaG93cyBob3cgdG8gZGVmaW5lIHN1Yi1yZXNvdXJjZSBtZXRob2RzIChtZXRob2RzIHRoYXQgY29udGFpbnMgc3ViLXBhdGgpLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgPHRpdGxlPkEgcHJvZ3JhbW1hdGljIHJlc291cmNlPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj4KKyAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVzb3VyY2UuQnVpbGRlciByZXNvdXJjZUJ1aWxkZXIgPSBSZXNvdXJjZS5idWlsZGVyKCJoZWxsb3dvcmxkIik7CisKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVzb3VyY2UuQnVpbGRlciBjaGlsZFJlc291cmNlID0gcmVzb3VyY2VCdWlsZGVyLmFkZENoaWxkUmVzb3VyY2UoInN1YnJlc291cmNlIik7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkUmVzb3VyY2UuYWRkTWV0aG9kKCJHRVQiKS5oYW5kbGVkQnkobmV3IEdldEluZmxlY3RvcigpKTsKKworICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZSByZXNvdXJjZSA9IHJlc291cmNlQnVpbGRlci5idWlsZCgpOworICAgICAgICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBTdWItcmVzb3VyY2UgbWV0aG9kcyBhcmUgZGVmaW5lZCB1c2luZyBzbyBjYWxsZWQgPGVtcGhhc2lzPmNoaWxkIHJlc291cmNlIG1vZGVsczwvZW1waGFzaXM+LiBDaGlsZAorICAgICAgICAgICAgcmVzb3VyY2UgbW9kZWxzIChvciBjaGlsZCByZXNvdXJjZXMpIGFyZSBwcm9ncmFtbWF0aWMgcmVzb3VyY2VzIGJ1aWxkIGluIHRoZSBzYW1lIHdheSBhcyBhbnkgb3RoZXIKKyAgICAgICAgICAgIHByb2dyYW1tYXRpYyByZXNvdXJjZSBidXQgdGhleSBhcmUgcmVnaXN0ZXJlZCBhcyBhIGNoaWxkIHJlc291cmNlIG9mIGEgcGFyZW50IHJlc291cmNlLiBUaGUgY2hpbGQgcmVzb3VyY2UKKyAgICAgICAgICAgIGluIHRoZSBleGFtcGxlIGlzIGJ1aWxkIGRpcmVjdGx5IGZyb20gdGhlIHBhcmVudCBidWlsZGVyIHVzaW5nIG1ldGhvZAorICAgICAgICAgICAgPGxpdGVyYWw+YWRkQ2hpbGRSZXNvdXJjZShTdHJpbmcgcGF0aCk8L2xpdGVyYWw+LgorICAgICAgICAgICAgSG93ZXZlciwgdGhlcmUgaXMgYWxzbyBhbiBvcHRpb24gdG8gYnVpbGQgYSBjaGlsZCByZXNvdXJjZSBtb2RlbCBzZXBhcmF0ZWx5IGFzIGEgc3RhbmRhcmQgcmVzb3VyY2UgYW5kIHRoZW4KKyAgICAgICAgICAgIGFkZCBpdCBhcyBhIGNoaWxkIHJlc291cmNlIHRvIGEgc2VsZWN0ZWQgcGFyZW50IHJlc291cmNlLiBUaGlzIG1lYW5zIHRoYXQgY2hpbGQgcmVzb3VyY2Ugb2JqZWN0cworICAgICAgICAgICAgY2FuIGJlIHJldXNlZCB0byBkZWZpbmUgY2hpbGQgcmVzb3VyY2VzIGluIGRpZmZlcmVudCBwYXJlbnQgcmVzb3VyY2VzICh5b3UganVzdCBidWlsZCBhIHNpbmdsZSBjaGlsZCByZXNvdXJjZQorICAgICAgICAgICAgYW5kIHRoZW4gcmVnaXN0ZXIgaXQgaW4gbXVsdGlwbGUgcGFyZW50IHJlc291cmNlcykuIEVhY2ggY2hpbGQgcmVzb3VyY2UgZ3JvdXBzIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBzdWItcmVzb3VyY2UKKyAgICAgICAgICAgIHBhdGguIE5vdGUgdGhhdCBhIGNoaWxkIHJlc291cmNlIGNhbm5vdCBoYXZlIGFueSBjaGlsZCByZXNvdXJjZXMgYXMgdGhlcmUgaXMgbm90aGluZyBsaWtlIHN1Yi1zdWItcmVzb3VyY2UKKyAgICAgICAgICAgIG1ldGhvZCBjb25jZXB0IGluIEpBWC1SUy4gRm9yIGV4YW1wbGUgaWYgYSBzdWIgcmVzb3VyY2UgbWV0aG9kIGNvbnRhaW5zIG1vcmUgcGF0aCBzZWdtZW50cyBpbiBpdHMgcGF0aAorICAgICAgICAgICAgKGUuZy4gIi9yb290L3N1Yi9yZXNvdXJjZS9tZXRob2QiIHdoZXJlICJyb290IiBpcyBhIHBhdGggb2YgdGhlIHJlc291cmNlIGFuZCAic3ViL3Jlc291cmNlL21ldGhvZCIgaXMgdGhlIHN1YgorICAgICAgICAgICAgcmVzb3VyY2UgbWV0aG9kIHBhdGgpIHRoZW4gcGFyZW50IHJlc291cmNlIHdpbGwgaGF2ZSBwYXRoICJyb290IiBhbmQgY2hpbGQgcmVzb3VyY2Ugd2lsbCBoYXZlIHBhdGgKKyAgICAgICAgICAgICJzdWIvcmVzb3VyY2UvbWV0aG9kIiAoc28sIHRoZXJlIHdpbGwgbm90IGJlIGFueSBzZXBhcmF0ZSBuZXN0ZWQgc3ViLXJlc291cmNlcyBmb3IgInN1YiIsICJyZXNvdXJjZSIgYW5kICJtZXRob2QiKS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFNlZSB0aGUgamF2YWRvY3Mgb2YgdGhlIHJlc291cmNlIGJ1aWxkZXIgQVBJIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAgICAgICAgICAgPCEtLVRPRE8gamF2YWRvYyBsaW5rLS0+CisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24+CisgICAgICAgIDx0aXRsZT5Nb2RlbCBwcm9jZXNzb3JzPC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBKZXJzZXkgZ2l2ZXMgeW91IGFuIG9wdGlvbiB0byByZWdpc3RlciBzbyBjYWxsZWQgPGVtcGhhc2lzPm1vZGVsIHByb2Nlc3NvciBwcm92aWRlcnM8L2VtcGhhc2lzPi4gVGhlc2UgcHJvdmlkZXJzCisgICAgICAgICAgICBhcmUgYWJsZSB0byBtb2RpZnkgb3IgZW5oYW5jZSB0aGUgYXBwbGljYXRpb24gcmVzb3VyY2UgbW9kZWwgZHVyaW5nIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQuIFRoaXMgaXMgYW4gYWR2YW5jZWQKKyAgICAgICAgICAgIGZlYXR1cmUgYW5kIHdpbGwgbm90IGJlIG5lZWRlZCBpbiBtb3N0IHVzZSBjYXNlcy4gSG93ZXZlciwgaW1hZ2luZSB5b3Ugd291bGQgbGlrZSB0byBhZGQgJmxpdC5odHRwLk9QVElPTlM7IHJlc291cmNlCisgICAgICAgICAgICBtZXRob2QgdG8gZWFjaCBkZXBsb3llZCByZXNvdXJjZSBhcyBpdCBpcyBkZXNjcmliZWQgYXQgdGhlIHRvcCBvZiB0aGlzIGNoYXB0ZXIuIFlvdSB3b3VsZCB3YW50IHRvIGRvIGl0IGZvciBldmVyeQorICAgICAgICAgICAgcHJvZ3JhbW1hdGljIHJlc291cmNlIHRoYXQgaXMgcmVnaXN0ZXJlZCBhcyB3ZWxsIGFzIGZvciBhbGwgc3RhbmRhcmQgSkFYLVJTIHJlc291cmNlcy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRvIGRvIHRoYXQsIHlvdSBmaXJzdCBuZWVkIHRvIHJlZ2lzdGVyIGEgbW9kZWwgcHJvY2Vzc29yIHByb3ZpZGVyIGluIHlvdXIgYXBwbGljYXRpb24sIHdoaWNoIGltcGxlbWVudHMKKyAgICAgICAgICAgIDxsaXRlcmFsPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5Nb2RlbFByb2Nlc3NvcjwvbGl0ZXJhbD4gZXh0ZW5zaW9uIGNvbnRyYWN0LiBBbiBleGFtcGxlIG9mCisgICAgICAgICAgICBhIG1vZGVsIHByb2Nlc3NvciBpbXBsZW1lbnRhdGlvbiBpcyBzaG93biBoZXJlOgorICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgPHRpdGxlPkEgcHJvZ3JhbW1hdGljIHJlc291cmNlPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj4KKyAgICAgICAgICAgICAgICAgICAgaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKKyAgICAgICAgICAgICAgICAgICAgaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CisgICAgICAgICAgICAgICAgICAgIGltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKKyAgICAgICAgICAgICAgICAgICAgaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKKyAgICAgICAgICAgICAgICAgICAgaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisgICAgICAgICAgICAgICAgICAgIGltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CisgICAgICAgICAgICAgICAgICAgIGltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKyAgICAgICAgICAgICAgICAgICAgaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisgICAgICAgICAgICAgICAgICAgIGltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKKyAgICAgICAgICAgICAgICAgICAgaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuSW5mbGVjdG9yOworICAgICAgICAgICAgICAgICAgICBpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLk1vZGVsUHJvY2Vzc29yOworICAgICAgICAgICAgICAgICAgICBpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlOworICAgICAgICAgICAgICAgICAgICBpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTWV0aG9kOworICAgICAgICAgICAgICAgICAgICBpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTW9kZWw7CisKKyAgICAgICAgICAgICAgICAgICAgQFByb3ZpZGVyCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlPcHRpb25zTW9kZWxQcm9jZXNzb3IgaW1wbGVtZW50cyBNb2RlbFByb2Nlc3NvciB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFJlc291cmNlTW9kZWwgcHJvY2Vzc1Jlc291cmNlTW9kZWwoUmVzb3VyY2VNb2RlbCByZXNvdXJjZU1vZGVsLCBDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBnZXQgdGhlIHJlc291cmNlIG1vZGVsIGFuZCB3ZSB3YW50IHRvIGVuaGFuY2UgZWFjaCByZXNvdXJjZSBieSBPUFRJT05TIG1ldGhvZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc291cmNlTW9kZWwuQnVpbGRlciBuZXdSZXNvdXJjZU1vZGVsQnVpbGRlciA9IG5ldyBSZXNvdXJjZU1vZGVsLkJ1aWxkZXIoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoZmluYWwgUmVzb3VyY2UgcmVzb3VyY2UgOiByZXNvdXJjZU1vZGVsLmdldFJlc291cmNlcygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBlYWNoIHJlc291cmNlIGluIHRoZSByZXNvdXJjZSBtb2RlbCB3ZSBjcmVhdGUgYSBuZXcgYnVpbGRlciB3aGljaCBpcyBiYXNlZCBvbiB0aGUgb2xkIHJlc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlc291cmNlLkJ1aWxkZXIgcmVzb3VyY2VCdWlsZGVyID0gUmVzb3VyY2UuYnVpbGRlcihyZXNvdXJjZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgYWRkIGEgbmV3IE9QVElPTlMgbWV0aG9kIHRvIGVhY2ggcmVzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90ZSB0aGF0IHdlIHNob3VsZCBjaGVjayB3aGV0aGVyIHRoZSBtZXRob2QgZG9lcyBub3QgeWV0IGV4aXN0IHRvIGF2b2lkIGZhaWx1cmVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlQnVpbGRlci5hZGRNZXRob2QoIk9QVElPTlMiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmhhbmRsZWRCeShuZXcgSW5mbGVjdG9yJmx0O0NvbnRhaW5lclJlcXVlc3RDb250ZXh0LCBTdHJpbmcmZ3Q7KCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgYXBwbHkoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgY29udGFpbmVyUmVxdWVzdENvbnRleHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJPbiB0aGlzIHBhdGggdGhlIHJlc291cmNlIHdpdGggIiArIHJlc291cmNlLmdldFJlc291cmNlTWV0aG9kcygpLnNpemUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG1ldGhvZHMgaXMgZGVwbG95ZWQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkucHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXh0ZW5kZWQodHJ1ZSk7IC8vIGV4dGVuZGVkIG1lYW5zOiBub3QgcGFydCBvZiBjb3JlIFJFU1RmdWwgQVBJCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgYWRkIHRvIHRoZSBtb2RlbCBuZXcgcmVzb3VyY2Ugd2hpY2ggaXMgYSBjb21iaW5hdGlvbiBvZiB0aGUgb2xkIHJlc291cmNlIGVuaGFuY2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5IHRoZSBPUFRJT05TIG1ldGhvZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdSZXNvdXJjZU1vZGVsQnVpbGRlci5hZGRSZXNvdXJjZShyZXNvdXJjZUJ1aWxkZXIuYnVpbGQoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VNb2RlbCBuZXdSZXNvdXJjZU1vZGVsID0gbmV3UmVzb3VyY2VNb2RlbEJ1aWxkZXIuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgd2UgcmV0dXJuIG5ldyBtb2RlbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdSZXNvdXJjZU1vZGVsOworICAgICAgICAgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgUmVzb3VyY2VNb2RlbCBwcm9jZXNzU3ViUmVzb3VyY2UoUmVzb3VyY2VNb2RlbCBzdWJSZXNvdXJjZU1vZGVsLCBDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBqdXN0IHJldHVybiB0aGUgb3JpZ2luYWwgc3ViUmVzb3VyY2VNb2RlbCB3aGljaCBtZWFucyB3ZSBkbyBub3Qgd2FudCB0byBkbyBhbnkgbW9kaWZpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1YlJlc291cmNlTW9kZWw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICAgICAgVGhlIDxsaXRlcmFsPk15T3B0aW9uc01vZGVsUHJvY2Vzc29yPC9saXRlcmFsPiBmcm9tIHRoZSBleGFtcGxlIGlzIGEgcmVsYXRpdmVseSBzaW1wbGUgbW9kZWwgcHJvY2Vzc29yIHdoaWNoCisgICAgICAgICAgICBpdGVyYXRlcyBvdmVyIGFsbCByZWdpc3RlcmVkIHJlc291cmNlcyBhbmQgZm9yIGFsbCBvZiB0aGVtIGJ1aWxkcyBhIG5ldyByZXNvdXJjZSB0aGF0IGlzIGVxdWFsIHRvIHRoZSBvbGQgcmVzb3VyY2UKKyAgICAgICAgICAgIGV4Y2VwdCBpdCBpcyBlbmhhbmNlZCB3aXRoIGEgbmV3ICZsaXQuaHR0cC5PUFRJT05TOyBtZXRob2QuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBOb3RlIHRoYXQgeW91IG9ubHkgbmVlZCB0byByZWdpc3RlciBzdWNoIGEgTW9kZWxQcm9jZXNzb3IgYXMgeW91ciBjdXN0b20gZXh0ZW5zaW9uIHByb3ZpZGVyIGluIHRoZSBzYW1lIHdheSBhcyB5b3UKKyAgICAgICAgICAgIHdvdWxkIHJlZ2lzdGVyIGFueSBzdGFuZGFyZCBKQVgtUlMgZXh0ZW5zaW9uIHByb3ZpZGVyLiBEdXJpbmcgYW4gYXBwbGljYXRpb24gZGVwbG95bWVudCwgSmVyc2V5IHdpbGwgbG9vayBmb3IgYW55CisgICAgICAgICAgICByZWdpc3RlcmVkIG1vZGVsIHByb2Nlc3NvciBhbmQgZXhlY3V0ZSB0aGVtLiBBcyB5b3UgY2FuIHNlZW0sIG1vZGVsIHByb2Nlc3NvcnMgYXJlIHZlcnkgcG93ZXJmdWwgYXMgdGhleSBjYW4gZG8KKyAgICAgICAgICAgIHdoYXRldmVyIG1hbmlwdWxhdGlvbiB3aXRoIHRoZSByZXNvdXJjZSBtb2RlbCB0aGV5IGxpa2UuIEEgbW9kZWwgcHJvY2Vzc29yIGNhbiBldmVuLCBmb3IgZXhhbXBsZSwgY29tcGxldGVseSBpZ25vcmUKKyAgICAgICAgICAgIHRoZSBvbGQgcmVzb3VyY2UgbW9kZWwgYW5kIHJldHVybiBhIG5ldyBjdXN0b20gcmVzb3VyY2UgbW9kZWwgd2l0aCBhIHNpbmdsZSAiSGVsbG8gd29ybGQhIiByZXNvdXJjZSwgd2hpY2ggd291bGQKKyAgICAgICAgICAgIHJlc3VsdCBpbiBvbmx5IHRoZSAiSGVsbG8gd29ybGQhIiByZXNvdXJjZSBiZWluZyBkZXBsb3llZCBpbiB5b3VyIGFwcGxpY2F0aW9uLiBPZiBjb3Vyc2UsIGl0IHdvdWxkIG5vdCBub3QgbWFrZQorICAgICAgICAgICAgbXVjaCBzZW5zZSB0byBpbXBsZW1lbnQgc3VjaCBtb2RlbCBwcm9jZXNzb3IsIGJ1dCB0aGUgc2NlbmFyaW8gZGVtb25zdHJhdGVzIGhvdyBwb3dlcmZ1bCB0aGUgbW9kZWwgcHJvY2Vzc29yIGNvbmNlcHQKKyAgICAgICAgICAgIGlzLiBBIGJldHRlciwgcmVhbC1saWZlIHVzZSBjYXNlIHNjZW5hcmlvIHdvdWxkLCBmb3IgZXhhbXBsZSwgYmUgdG8gYWx3YXlzIGFkZCBzb21lIGN1c3RvbSBuZXcgcmVzb3VyY2UgdG8gZWFjaAorICAgICAgICAgICAgYXBwbGljYXRpb24gdGhhdCBtaWdodCByZXR1cm4gYWRkaXRpb25hbCBtZXRhZGF0YSBhYm91dCB0aGUgZGVwbG95ZWQgYXBwbGljYXRpb24uIE9yLCB5b3UgbWlnaHQgd2FudCB0bworICAgICAgICAgICAgZmlsdGVyIG91dCBwYXJ0aWN1bGFyIHJlc291cmNlcyBvciByZXNvdXJjZSBtZXRob2RzLCB3aGljaCBpcyBhbm90aGVyIHNpdHVhdGlvbiB3aGVyZSBhIG1vZGVsIHByb2Nlc3NvciBjb3VsZAorICAgICAgICAgICAgYmUgdXNlZCBzdWNjZXNzZnVsbHkuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBBbHNvIG5vdGUgdGhhdCA8bGl0ZXJhbD5wcm9jZXNzU3ViUmVzb3VyY2UoUmVzb3VyY2VNb2RlbCBzdWJSZXNvdXJjZU1vZGVsLCBDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pPC9saXRlcmFsPgorICAgICAgICAgICAgbWV0aG9kIGlzIGV4ZWN1dGVkIGZvciBlYWNoIHN1YiByZXNvdXJjZSByZXR1cm5lZCBmcm9tIHRoZSBzdWIgcmVzb3VyY2UgbG9jYXRvci4gVGhlIGV4YW1wbGUgaXMgc2ltcGxpZmllZCBhbmQgZG9lcworICAgICAgICAgICAgbm90IGRvIGFueSBtYW5pcHVsYXRpb24gYnV0IHByb2JhYmx5IGluIHN1Y2ggYSBjYXNlIHlvdSB3b3VsZCB3YW50IHRvIGVuaGFuY2UgYWxsIHN1YiByZXNvdXJjZXMgd2l0aAorICAgICAgICAgICAgYSBuZXcgJmxpdC5odHRwLk9QVElPTlM7IG1ldGhvZCBoYW5kbGVycyB0b28uCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBJdCBpcyBpbXBvcnRhbnQgdG8gcmVtZW1iZXIgdGhhdCBhbnkgbW9kZWwgcHJvY2Vzc29yIG11c3QgYWx3YXlzIHJldHVybiB2YWxpZCByZXNvdXJjZSBtb2RlbC4gQXMgeW91IG1pZ2h0IGhhdmUKKyAgICAgICAgICAgIGFscmVhZHkgbm90aWNlZCwgaW4gdGhlIGV4YW1wbGUgYWJvdmUgdGhpcyBpbXBvcnRhbnQgcnVsZSBpcyBub3QgZm9sbG93ZWQuIElmIGFueSBvZiB0aGUgcmVzb3VyY2VzIGluIHRoZSBvcmlnaW5hbAorICAgICAgICAgICAgcmVzb3VyY2UgbW9kZWwgd291bGQgYWxyZWFkeSBoYXZlIGFuICZsaXQuaHR0cC5PUFRJT05TOyBtZXRob2QgaGFuZGxlciBkZWZpbmVkLCBhZGRpbmcgYW5vdGhlciBoYW5kbGVyIHdvdWxkIGNhdXNlCisgICAgICAgICAgICB0aGUgYXBwbGljYXRpb24gZmFpbCBkdXJpbmcgdGhlIGRlcGxveW1lbnQgaW4gdGhlIHJlc291cmNlIG1vZGVsIHZhbGlkYXRpb24gcGhhc2UuIEluIG9yZGVyIHRvIHJldGFpbiB0aGUgY29uc2lzdGVuY3kKKyAgICAgICAgICAgIG9mIHRoZSBmaW5hbCBtb2RlbCwgYSBtb2RlbCBwcm9jZXNzb3IgaW1wbGVtZW50YXRpb24gd291bGQgaGF2ZSB0byBiZSBtb3JlIHJvYnVzdCB0aGFuIHdoYXQgaXMgc2hvd24gaW4gdGhlIGV4YW1wbGUuCisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+Cis8L2NoYXB0ZXI+CmRpZmYgLS1naXQgYS9kb2NzL3NyYy9tYWluL2RvY2Jvb2svcngtY2xpZW50LnhtbCBiL2RvY3Mvc3JjL21haW4vZG9jYm9vay9yeC1jbGllbnQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNDZjYWIKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3NyYy9tYWluL2RvY2Jvb2svcngtY2xpZW50LnhtbApAQCAtMCwwICsxLDgzOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPCFET0NUWVBFIGNoYXB0ZXIgWworICAgICAgICA8IUVOVElUWSAlIGVudHMgU1lTVEVNICJqZXJzZXkuZW50IiA+ICVlbnRzOworICAgICAgICA8IUVOVElUWSBqZXJzZXkuZ2l0aHViLnJ4LmV4YW1wbGUubGluayAiPGxpbmsgeGxpbms6aHJlZj0nJmplcnNleS5naXRodWIuZXhhbXBsZXMudXJpOy9yeC1jbGllbnQtd2ViYXBwJz5UcmF2ZWwgQWdlbmN5IChPcmNoZXN0cmF0aW9uIExheWVyKSBFeGFtcGxlIHVzaW5nIFJlYWN0aXZlIEplcnNleSBDbGllbnQgQVBJPC9saW5rPiI+CisgICAgICAgIDwhRU5USVRZIGplcnNleS5naXRodWIucnguamF2YTguZXhhbXBsZS5saW5rICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmdpdGh1Yi5leGFtcGxlcy51cmk7L3J4LWNsaWVudC1qYXZhOC13ZWJhcHAnPlRyYXZlbCBBZ2VuY3kgKE9yY2hlc3RyYXRpb24gTGF5ZXIpIEV4YW1wbGUgdXNpbmcgUmVhY3RpdmUgSmVyc2V5IENsaWVudCBBUEkgKEphdmEgOCk8L2xpbms+Ij4KK10+CisKKzxjaGFwdGVyIHhtbG5zPSJodHRwOi8vZG9jYm9vay5vcmcvbnMvZG9jYm9vayIKKyAgICAgICAgIHZlcnNpb249IjUuMCIKKyAgICAgICAgIHhtbDpsYW5nPSJlbiIKKyAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIKKyAgICAgICAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vZG9jYm9vay5vcmcvbnMvZG9jYm9vayBodHRwOi8vZG9jYm9vay5vcmcveG1sLzUuMC94c2QvZG9jYm9vay54c2QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayBodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rLnhzZCIKKyAgICAgICAgIHhtbDppZD0icngtY2xpZW50Ij4KKworICAgIDx0aXRsZT5SZWFjdGl2ZSBKQVgtUlMgQ2xpZW50IEFQSTwvdGl0bGU+CisKKyAgICA8d2FybmluZz4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBKZXJzZXkgMi4yNiAoSkFYLVJTIDIuMSBpbXBsZW1lbnRhdGlvbikgZHJvcHBlZCBKZXJzZXktcHJvcHJpZXRhcnkgQVBJIGluIGZhdm9yIG9mIEpBWC1SUyAyLjEgUmVhY3RpdmUgQ2xpZW50IEFQSS4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvd2FybmluZz4KKworICAgIDxwYXJhPgorICAgICAgICBSZWFjdGl2ZSBjbGllbnQgZXh0ZW5zaW9uIGlzIHF1aXRlIGEgZ2VuZXJpYyBBUEkgYWxsb3dpbmcgZW5kIHVzZXJzIHRvIHV0aWxpemUgdGhlIHBvcHVsYXIgcmVhY3RpdmUgcHJvZ3JhbW1pbmcgbW9kZWwKKyAgICAgICAgd2hlbiB1c2luZyBKQVgtUlMgQ2xpZW50LiBUaGUgQVBJIGlzIGRlc2lnbmVkIHRvIGJlIGV4dGVuc2libGUsIHNvIGFueSBleGlzdGluZyByZWFjdGl2ZSBmcmFtZXdvcmsgY2FuIGludGVncmF0ZSB3aXRoCisgICAgICAgIGl0IGFuZCB0aGVyZSBpcyBidWlsZCBpbiBzdXBwb3J0IGZvciBDb21wbGV0aW9uU3RhZ2UuIEFsb25nIHdpdGggZGVzY3JpYmluZyB0aGUgQVBJIGl0c2VsZiwgdGhpcyBzZWN0aW9uIGFsc28gY292ZXJzCisgICAgICAgIGV4aXN0aW5nIGV4dGVuc2lvbiBtb2R1bGVzIGFuZCBwcm92aWRlcyBoaW50cyB0byBpbXBsZW1lbnQgYSBjdXN0b20gZXh0ZW5zaW9uIGlmIG5lZWRlZC4KKyAgICA8L3BhcmE+CisKKyAgICA8cGFyYT4KKyAgICAgICAgSWYgeW91IGFyZSBub3QgZmFtaWxpYXIgd2l0aCB0aGUgSkFYLVJTIENsaWVudCBBUEksIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91IHNlZSA8eHJlZiBsaW5rZW5kPSJjbGllbnQiLz4KKyAgICAgICAgd2hlcmUgdGhlIGJhc2ljcyBvZiBKQVgtUlMgQ2xpZW50IEFQSSBhbG9uZyB3aXRoIHNvbWUgYWR2YW5jZWQgdGVjaG5pcXVlcyBhcmUgZGVzY3JpYmVkLgorICAgIDwvcGFyYT4KKworCisKKyAgICA8c2VjdGlvbj4KKyAgICAgICAgPHRpdGxlPk1vdGl2YXRpb24gZm9yIFJlYWN0aXZlIENsaWVudCBFeHRlbnNpb248L3RpdGxlPgorCisgICAgICAgIDxzaW1wbGVzZWN0PgorICAgICAgICAgICAgPHRpdGxlPlRoZSBQcm9ibGVtPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgSW1hZ2luZSBhIHRyYXZlbCBhZ2VuY3kgd2hvc2UgaW5mb3JtYXRpb24gc3lzdGVtIGNvbnNpc3RzIG9mIG11bHRpcGxlIGJhc2ljIHNlcnZpY2VzLiBUaGVzZSBzZXJ2aWNlcyBtaWdodCBiZSBidWlsdAorICAgICAgICAgICAgICAgIHVzaW5nIGRpZmZlcmVudCB0ZWNobm9sb2dpZXMgKEpNUywgRUpCLCBXUywgLi4uKS4gRm9yIHNpbXBsaWNpdHkgd2UgcHJlc3VtZSB0aGF0IHRoZSBzZXJ2aWNlcyBjYW4gYmUKKyAgICAgICAgICAgICAgICBjb25zdW1lZCB1c2luZyBSRVNUIGludGVyZmFjZSB2aWEgSFRUUCBtZXRob2QgY2FsbHMgKGUuZy4gdXNpbmcgYSBKQVgtUlMgQ2xpZW50KS4gV2UgYWxzbyBwcmVzdW1lIHRoYXQgdGhlIGJhc2ljCisgICAgICAgICAgICAgICAgc2VydmljZXMgd2UgbmVlZCB0byB3b3JrIHdpdGggYXJlOgorCisgICAgICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzPkN1c3RvbWVycyBzZXJ2aWNlPC9lbXBoYXNpcz4g4oCTIHByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IGN1c3RvbWVycyBvZiB0aGUgdHJhdmVsIGFnZW5jeS4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzPkRlc3RpbmF0aW9ucyBzZXJ2aWNlPC9lbXBoYXNpcz4g4oCTIHByb3ZpZGVzIGEgbGlzdCBvZiB2aXNpdGVkIGFuZCByZWNvbW1lbmRlZCBkZXN0aW5hdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYW4gYXV0aGVudGljYXRlZCBjdXN0b21lci4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGVtcGhhc2lzPldlYXRoZXIgc2VydmljZTwvZW1waGFzaXM+IOKAkyBwcm92aWRlcyB3ZWF0aGVyIGZvcmVjYXN0IGZvciBhIGdpdmVuIGRlc3RpbmF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZW1waGFzaXM+UXVvdGluZyBzZXJ2aWNlPC9lbXBoYXNpcz4g4oCTIHByb3ZpZGVzIHByaWNlIGNhbGN1bGF0aW9uIGZvciBhIGN1c3RvbWVyIHRvIHRyYXZlbCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEgcmVjb21tZW5kZWQgZGVzdGluYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgdGFzayBpcyB0byBjcmVhdGUgYSBwdWJsaWNseSBhdmFpbGFibGUgZmVhdHVyZSB0aGF0IHdvdWxkLCBmb3IgYW4gYXV0aGVudGljYXRlZCB1c2VyLCBkaXNwbGF5IGEgbGlzdCBvZiAxMCBsYXN0IHZpc2l0ZWQgcGxhY2VzIGFuZAorICAgICAgICAgICAgICAgIGFsc28gZGlzcGxheSBhIGxpc3Qgb2YgMTAgbmV3IHJlY29tbWVuZGVkIGRlc3RpbmF0aW9ucyBpbmNsdWRpbmcgd2VhdGhlciBmb3JlY2FzdCBhbmQgcHJpY2UgY2FsY3VsYXRpb25zIGZvciB0aGUKKyAgICAgICAgICAgICAgICB1c2VyLiBOb3RpY2UgdGhhdCBzb21lIG9mIHRoZSByZXF1ZXN0cyAodG8gcmV0cmlldmUgZGF0YSkgZGVwZW5kIG9uIHJlc3VsdHMgb2YgcHJldmlvdXMgcmVxdWVzdHMuIEUuZy4gZ2V0dGluZworICAgICAgICAgICAgICAgIHJlY29tbWVuZGVkIGRlc3RpbmF0aW9ucyBkZXBlbmRzIG9uIG9idGFpbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYXV0aGVudGljYXRlZCB1c2VyIGZpcnN0LiBPYnRhaW5pbmcgd2VhdGhlcgorICAgICAgICAgICAgICAgIGZvcmVjYXN0IGRlcGVuZHMgb24gZGVzdGluYXRpb24gaW5mb3JtYXRpb24sIGV0Yy4gVGhpcyByZWxhdGlvbnNoaXAgYmV0d2VlbiBzb21lIG9mIHRoZSByZXF1ZXN0cyBpcyBhbiBpbXBvcnRhbnQgcGFydCBvZiB0aGUKKyAgICAgICAgICAgICAgICBwcm9ibGVtIGFuZCBhbiBhcmVhIHdoZXJlIHlvdSBjYW4gdGFrZSBhIHJlYWwgYWR2YW50YWdlIG9mIHRoZSByZWFjdGl2ZSBwcm9ncmFtbWluZyBtb2RlbC4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIE9uZSB3YXkgaG93IHRvIG9idGFpbiBkYXRhIGlzIHRvIG1ha2UgbXVsdGlwbGUgSFRUUCBtZXRob2QgY2FsbHMgZnJvbSB0aGUgY2xpZW50IChlLmcuIG1vYmlsZSBkZXZpY2UpIHRvIGFsbAorICAgICAgICAgICAgICAgIHNlcnZpY2VzIGludm9sdmVkIGFuZCBjb21iaW5lIHRoZSByZXRyaWV2ZWQgZGF0YSBvbiB0aGUgY2xpZW50LiBIb3dldmVyLCBzaW5jZSB0aGUgYmFzaWMgc2VydmljZXMgYXJlIGF2YWlsYWJsZQorICAgICAgICAgICAgICAgIGluIHRoZSBpbnRlcm5hbCBuZXR3b3JrIG9ubHkgd2UnZCByYXRoZXIgY3JlYXRlIGEgcHVibGljIG9yY2hlc3RyYXRpb24gbGF5ZXIgaW5zdGVhZCBvZiBleHBvc2luZyBhbGwgaW50ZXJuYWwgc2VydmljZXMgdG8gdGhlIG91dHNpZGUgd29ybGQuCisgICAgICAgICAgICAgICAgVGhlIG9yY2hlc3RyYXRpb24gbGF5ZXIgd291bGQgZXhwb3NlIG9ubHkgdGhlIGRlc2lyZWQgb3BlcmF0aW9ucyBvZiB0aGUgYmFzaWMgc2VydmljZXMKKyAgICAgICAgICAgICAgICB0byB0aGUgcHVibGljLiBUbyBsaW1pdCB0cmFmZmljIGFuZCBhY2hpZXZlIGxvd2VyIGxhdGVuY3kgd2UnZCBsaWtlIHRvIHJldHVybiBhbGwgdGhlIG5lY2Vzc2FyeQorICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uIHRvIHRoZSBjbGllbnQgaW4gYSBzaW5nbGUgcmVzcG9uc2UuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgb3JjaGVzdHJhdGlvbiBsYXllciBpcyBpbGx1c3RyYXRlZCBpbiB0aGUgPHhyZWYgbGlua2VuZD0icnguY2xpZW50Lm1vdGl2YXRpb24ucHJvYmxlbSIgeHJlZnN0eWxlPSJzZWxlY3Q6IGxhYmVsIiAvPi4KKyAgICAgICAgICAgICAgICBUaGUgbGF5ZXIgYWNjZXB0cyByZXF1ZXN0cyBmcm9tIHRoZSBvdXRzaWRlIGFuZCBpcyByZXNwb25zaWJsZSBvZiBpbnZva2luZyBtdWx0aXBsZSByZXF1ZXN0cyB0byB0aGUgaW50ZXJuYWwgc2VydmljZXMuCisgICAgICAgICAgICAgICAgV2hlbiByZXNwb25zZXMgZnJvbSB0aGUgaW50ZXJuYWwgc2VydmljZXMgYXJlIGF2YWlsYWJsZSBpbiB0aGUgb3JjaGVzdHJhdGlvbiBsYXllciB0aGV5J3JlIGNvbWJpbmVkIGludG8KKyAgICAgICAgICAgICAgICBhIHNpbmdsZSByZXNwb25zZSB0aGF0IGlzIHNlbnQgYmFjayB0byB0aGUgY2xpZW50LgorCisgICAgICAgICAgICAgICAgPGZpZ3VyZSB4bWw6aWQ9InJ4LmNsaWVudC5tb3RpdmF0aW9uLnByb2JsZW0iPgorICAgICAgICAgICAgICAgICAgICA8dGl0bGU+VHJhdmVsIEFnZW5jeSBPcmNoZXN0cmF0aW9uIFNlcnZpY2U8L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICA8bWVkaWFvYmplY3Q+CisgICAgICAgICAgICAgICAgICAgICAgICA8aW1hZ2VvYmplY3Q+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltYWdlZGF0YSBmaWxlcmVmPSJpbWFnZXMvcngtY2xpZW50LXByb2JsZW0ucG5nIiBmb3JtYXQ9IlBORyIgd2lkdGg9IjgwJSIgc2NhbGVmaXQ9IjEiIGFsaWduPSJjZW50ZXIiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvaW1hZ2VvYmplY3Q+CisgICAgICAgICAgICAgICAgICAgIDwvbWVkaWFvYmplY3Q+CisgICAgICAgICAgICAgICAgPC9maWd1cmU+CisKKyAgICAgICAgICAgICAgICBUaGUgbmV4dCBzZWN0aW9ucyBkZXNjcmliZSB2YXJpb3VzIGFwcHJvYWNoZXMgKHVzaW5nIEpBWC1SUyBDbGllbnQpIGhvdyB0aGUgb3JjaGVzdHJhdGlvbiBsYXllciBjYW4gYmUgaW1wbGVtZW50ZWQuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2ltcGxlc2VjdD4KKworICAgICAgICA8c2ltcGxlc2VjdD4KKyAgICAgICAgICAgIDx0aXRsZT5BIE5haXZlIEFwcHJvYWNoPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhlIHNpbXBsZXN0IHdheSB0byBpbXBsZW1lbnQgdGhlIG9yY2hlc3RyYXRpb24gbGF5ZXIgaXMgdG8gdXNlIHN5bmNocm9ub3VzIGFwcHJvYWNoLiBGb3IgdGhpcyBwdXJwb3NlIHdlIGNhbiB1c2UKKyAgICAgICAgICAgICAgICBKQVgtUlMgQ2xpZW50IFN5bmMgQVBJIChzZWUgPHhyZWYgbGlua2VuZD0icnguY2xpZW50Lm1vdGl2YXRpb24ubmFpdmUiIC8+KS4gVGhlIGltcGxlbWVudGF0aW9uIGlzIHNpbXBsZSB0byBkbywKKyAgICAgICAgICAgICAgICBlYXN5IHRvIHJlYWQgYW5kIHN0cmFpZ2h0Zm9yd2FyZCB0byBkZWJ1Zy4KKworICAgICAgICAgICAgICAgIDxleGFtcGxlIHhtbDppZD0icnguY2xpZW50Lm1vdGl2YXRpb24ubmFpdmUiPgorICAgICAgICAgICAgICAgICAgICA8dGl0bGU+RXhjZXJwdCBmcm9tIGEgc3luY2hyb25vdXMgYXBwcm9hY2ggd2hpbGUgaW1wbGVtZW50aW5nIHRoZSBvcmNoZXN0cmF0aW9uIGxheWVyPC90aXRsZT4KKworICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5maW5hbCBXZWJUYXJnZXQgZGVzdGluYXRpb24gPSAuLi47CitmaW5hbCBXZWJUYXJnZXQgZm9yZWNhc3QgPSAuLi47CisKKy8vIE9idGFpbiByZWNvbW1lbmRlZCBkZXN0aW5hdGlvbnMuCitMaXN0Jmx0O0Rlc3RpbmF0aW9uJmd0OyByZWNvbW1lbmRlZCA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwordHJ5IHsKKyAgICByZWNvbW1lbmRlZCA9IGRlc3RpbmF0aW9uLnBhdGgoInJlY29tbWVuZGVkIikucmVxdWVzdCgpCisgICAgICAgICAgICAvLyBJZGVudGlmeSB0aGUgdXNlci4KKyAgICAgICAgICAgIC5oZWFkZXIoIlJ4LVVzZXIiLCAiU3luYyIpCisgICAgICAgICAgICAvLyBSZXR1cm4gYSBsaXN0IG9mIGRlc3RpbmF0aW9ucy4KKyAgICAgICAgICAgIC5nZXQobmV3IEdlbmVyaWNUeXBlJmx0O0xpc3QmbHQ7RGVzdGluYXRpb24mZ3Q7Jmd0OygpIHt9KTsKK30gY2F0Y2ggKGZpbmFsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKKyAgICBlcnJvcnMub2ZmZXIoIlJlY29tbWVuZGVkOiAiICsgdGhyb3dhYmxlLmdldE1lc3NhZ2UoKSk7Cit9CisKKy8vIEZvcmVjYXN0cy4gKGRlcGVuZCBvbiByZWNvbW1lbmRlZCBkZXN0aW5hdGlvbnMpCitmaW5hbCBNYXAmbHQ7U3RyaW5nLCBGb3JlY2FzdCZndDsgZm9yZWNhc3RzID0gbmV3IEhhc2hNYXAmbHQ7Jmd0OygpOworZm9yIChmaW5hbCBEZXN0aW5hdGlvbiBkZXN0IDogcmVjb21tZW5kZWQpIHsKKyAgICB0cnkgeworICAgICAgICBmb3JlY2FzdHMucHV0KGRlc3QuZ2V0RGVzdGluYXRpb24oKSwKKyAgICAgICAgICAgICAgICBmb3JlY2FzdC5yZXNvbHZlVGVtcGxhdGUoImRlc3RpbmF0aW9uIiwgZGVzdC5nZXREZXN0aW5hdGlvbigpKS5yZXF1ZXN0KCkuZ2V0KEZvcmVjYXN0LmNsYXNzKSk7CisgICAgfSBjYXRjaCAoZmluYWwgVGhyb3dhYmxlIHRocm93YWJsZSkgeworICAgICAgICBlcnJvcnMub2ZmZXIoIkZvcmVjYXN0OiAiICsgdGhyb3dhYmxlLmdldE1lc3NhZ2UoKSk7CisgICAgfQorfTwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorCisgICAgICAgICAgICAgICAgVGhlIGRvd25zaWRlIG9mIHRoaXMgYXBwcm9hY2ggaXMgaXQncyBzbG93bmVzcy4gWW91IG5lZWQgdG8gc2VxdWVudGlhbGx5IHByb2Nlc3MgYWxsIHRoZSBpbmRlcGVuZGVudCByZXF1ZXN0cyB3aGljaAorICAgICAgICAgICAgICAgIG1lYW5zIHRoYXQgeW91J3JlIHdhc3RpbmcgcmVzb3VyY2VzLiBZb3UgYXJlIG5lZWRsZXNzbHkgYmxvY2tpbmcgdGhyZWFkcywgdGhhdCBjb3VsZCBiZSBvdGhlcndpc2UgdXNlZCBmb3Igc29tZSByZWFsIHdvcmsuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBJZiB5b3UgdGFrZSBhIGNsb3NlciBsb29rIGF0IHRoZSBleGFtcGxlIHlvdSBjYW4gbm90aWNlIHRoYXQgYXQgdGhlIG1vbWVudCB3aGVuIGFsbCB0aGUgcmVjb21tZW5kZWQgZGVzdGluYXRpb25zIGFyZQorICAgICAgICAgICAgICAgIGF2YWlsYWJsZSBmb3IgZnVydGhlciBwcm9jZXNzaW5nIHdlIHRyeSB0byBvYnRhaW4gZm9yZWNhc3RzIGZvciB0aGVzZSBkZXN0aW5hdGlvbnMuIE9idGFpbmluZyBhIHdlYXRoZXIgZm9yZWNhc3QKKyAgICAgICAgICAgICAgICBjYW4gYmUgZG9uZSBvbmx5IGZvciBhIHNpbmdsZSBkZXN0aW5hdGlvbiB3aXRoIGEgc2luZ2xlIHJlcXVlc3QsIHNvIHdlIG5lZWQgdG8gbWFrZSAxMCByZXF1ZXN0cyB0bworICAgICAgICAgICAgICAgIHRoZSA8ZW1waGFzaXM+Rm9yZWNhc3Qgc2VydmljZTwvZW1waGFzaXM+IHRvIGdldCBhbGwgdGhlIGRlc3RpbmF0aW9ucyBjb3ZlcmVkLiBJbiBhIHN5bmNocm9ub3VzIHdheSB0aGlzIG1lYW5zIGdldHRpbmcgdGhlIGZvcmVjYXN0cworICAgICAgICAgICAgICAgIG9uZS1ieS1vbmUuIFdoZW4gb25lIHJlc3BvbnNlIHdpdGggYSBmb3JlY2FzdCBhcnJpdmVzIHdlIGNhbiBzZW5kIGFub3RoZXIgcmVxdWVzdCB0byBvYnRhaW4gYW5vdGhlciBvbmUuIFRoaXMgdGFrZXMKKyAgICAgICAgICAgICAgICB0aW1lLiBUaGUgd2hvbGUgcHJvY2VzcyBvZiBjb25zdHJ1Y3RpbmcgYSByZXNwb25zZSBmb3IgdGhlIGNsaWVudCBjYW4gYmUgc2VlbiBpbgorICAgICAgICAgICAgICAgIDx4cmVmIGxpbmtlbmQ9InJ4LmNsaWVudC5tb3RpdmF0aW9uLmdyYXBoLnN5bmMiIHhyZWZzdHlsZT0ic2VsZWN0OiBsYWJlbCIgLz4uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBMZXQncyB0cnkgdG8gcXVhbnRpZnkgdGhpcyB3aXRoIGFzc2lnbmluZyBhbiBhcHByb3hpbWF0ZSB0aW1lIHRvIGV2ZXJ5IHJlcXVlc3Qgd2UgbWFrZSB0byB0aGUgaW50ZXJuYWwgc2VydmljZXMuCisgICAgICAgICAgICAgICAgVGhpcyB3YXkgd2UgY2FuIGVhc2lseSBjb21wdXRlIHRoZSB0aW1lIG5lZWRlZCB0byBjb21wbGV0ZSBhIHJlc3BvbnNlIGZvciB0aGUgY2xpZW50LiBGb3IgZXhhbXBsZSwgb2J0YWluaW5nCisKKyAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT48ZW1waGFzaXM+Q3VzdG9tZXIgZGV0YWlsczwvZW1waGFzaXM+IHRha2VzIDE1MCBtczwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+PGVtcGhhc2lzPlJlY29tbWVuZGVkIGRlc3RpbmF0aW9uczwvZW1waGFzaXM+IHRha2VzIDI1MCBtczwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+PGVtcGhhc2lzPlByaWNlIGNhbGN1bGF0aW9uIGZvciBhIGN1c3RvbWVyIGFuZCBkZXN0aW5hdGlvbjwvZW1waGFzaXM+IHRha2VzIDE3MCBtcyAoZWFjaCk8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPjxlbXBoYXNpcz5XZWF0aGVyIGZvcmVjYXN0IGZvciBhIGRlc3RpbmF0aW9uPC9lbXBoYXNpcz4gdGFrZXMgMzMwIG1zIChlYWNoKTwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKworICAgICAgICAgICAgICAgIFdoZW4gc3VtbWVkIHVwLCA1NDAwIG1zIGlzIGFwcHJveGltYXRlbHkgbmVlZGVkIHRvIGNvbnN0cnVjdCBhIHJlc3BvbnNlIGZvciB0aGUgY2xpZW50LgorCisgICAgICAgICAgICAgICAgPGZpZ3VyZSB4bWw6aWQ9InJ4LmNsaWVudC5tb3RpdmF0aW9uLmdyYXBoLnN5bmMiPgorICAgICAgICAgICAgICAgICAgICA8dGl0bGU+VGltZSBjb25zdW1lZCB0byBjcmVhdGUgYSByZXNwb25zZSBmb3IgdGhlIGNsaWVudCDigJMgc3luY2hyb25vdXMgd2F5PC90aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgPG1lZGlhb2JqZWN0PgorICAgICAgICAgICAgICAgICAgICAgICAgPGltYWdlb2JqZWN0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWFnZWRhdGEgZmlsZXJlZj0iaW1hZ2VzL3J4LWNsaWVudC1zeW5jLWFwcHJvYWNoLnBuZyIgZm9ybWF0PSJQTkciIHdpZHRoPSI4MCUiIHNjYWxlZml0PSIxIiBhbGlnbj0iY2VudGVyIi8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2ltYWdlb2JqZWN0PgorICAgICAgICAgICAgICAgICAgICA8L21lZGlhb2JqZWN0PgorICAgICAgICAgICAgICAgIDwvZmlndXJlPgorCisgICAgICAgICAgICAgICAgU3luY2hyb25vdXMgYXBwcm9hY2ggaXMgYmV0dGVyIHRvIHVzZSBmb3IgbG93ZXIgbnVtYmVyIG9mIHJlcXVlc3RzICh3aGVyZSB0aGUgYWNjdW11bGF0ZWQgdGltZSBkb2Vzbid0IG1hdHRlciB0aGF0CisgICAgICAgICAgICAgICAgbXVjaCkgb3IgZm9yIGEgc2luZ2xlIHJlcXVlc3QgdGhhdCBkZXBlbmRzIG9uIHRoZSByZXN1bHQgb2YgcHJldmlvdXMgb3BlcmF0aW9ucy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zaW1wbGVzZWN0PgorCisgICAgICAgIDxzaW1wbGVzZWN0PgorICAgICAgICAgICAgPHRpdGxlPk9wdGltaXplZCBBcHByb2FjaDwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoZSBhbW91bnQgb2YgdGltZSBuZWVkZWQgYnkgdGhlIHN5bmNocm9ub3VzIGFwcHJvYWNoIGNhbiBiZSBsb3dlcmVkIGJ5IGludm9raW5nIGluZGVwZW5kZW50IHJlcXVlc3RzIGluIHBhcmFsbGVsLgorICAgICAgICAgICAgICAgIFdlJ3JlIGdvaW5nIHRvIHVzZSBKQVgtUlMgQ2xpZW50IEFzeW5jIEFQSSB0byBpbGx1c3RyYXRlIHRoaXMgYXBwcm9hY2guIFRoZSBpbXBsZW1lbnRhdGlvbiBpbiB0aGlzIGNhc2UgaXMgc2xpZ2h0bHkKKyAgICAgICAgICAgICAgICBtb3JlIGRpZmZpY3VsdCB0byBnZXQgcmlnaHQgYmVjYXVzZSBvZiB0aGUgbmVzdGVkIGNhbGxiYWNrcyBhbmQgdGhlIG5lZWQgdG8gd2FpdCBhdCBzb21lIHBvaW50cyBmb3IgdGhlIG1vbWVudAorICAgICAgICAgICAgICAgIHdoZW4gYWxsIHBhcnRpYWwgcmVzcG9uc2VzIGFyZSByZWFkeSB0byBiZSBwcm9jZXNzZWQuIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBhbHNvIGEgbGl0dGxlIGJpdCBoYXJkZXIgdG8gZGVidWcgYW5kIG1haW50YWluLgorICAgICAgICAgICAgICAgIFRoZSBuZXN0ZWQgY2FsbHMgYXJlIGNhdXNpbmcgYSBsb3Qgb2YgY29tcGxleGl0eSBoZXJlLiBBbiBleGFtcGxlIG9mIGNvbmNyZXRlIEphdmEgY29kZSBmb2xsb3dpbmcgdGhlIGFzeW5jaHJvbm91cyBhcHByb2FjaAorICAgICAgICAgICAgICAgIGNhbiBiZSBzZWVuIGluIDx4cmVmIGxpbmtlbmQ9InJ4LmNsaWVudC5tb3RpdmF0aW9uLm9wdGltaXplZCIgLz4uCisKKyAgICAgICAgICAgICAgICA8ZXhhbXBsZSB4bWw6aWQ9InJ4LmNsaWVudC5tb3RpdmF0aW9uLm9wdGltaXplZCI+CisgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5FeGNlcnB0IGZyb20gYW4gYXN5bmNocm9ub3VzIGFwcHJvYWNoIHdoaWxlIGltcGxlbWVudGluZyB0aGUgb3JjaGVzdHJhdGlvbiBsYXllcjwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+ZmluYWwgV2ViVGFyZ2V0IGRlc3RpbmF0aW9uID0gLi4uOworZmluYWwgV2ViVGFyZ2V0IGZvcmVjYXN0ID0gLi4uOworCisvLyBPYnRhaW4gcmVjb21tZW5kZWQgZGVzdGluYXRpb25zLiAoZG9lcyBub3QgZGVwZW5kIG9uIHZpc2l0ZWQgb25lcykKK2Rlc3RpbmF0aW9uLnBhdGgoInJlY29tbWVuZGVkIikucmVxdWVzdCgpCisgICAgICAgIC8vIElkZW50aWZ5IHRoZSB1c2VyLgorICAgICAgICAuaGVhZGVyKCJSeC1Vc2VyIiwgIkFzeW5jIikKKyAgICAgICAgLy8gQXN5bmMgaW52b2tlci4KKyAgICAgICAgLmFzeW5jKCkKKyAgICAgICAgLy8gUmV0dXJuIGEgbGlzdCBvZiBkZXN0aW5hdGlvbnMuCisgICAgICAgIC5nZXQobmV3IEludm9jYXRpb25DYWxsYmFjayZsdDtMaXN0Jmx0O0Rlc3RpbmF0aW9uJmd0OyZndDsoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbXBsZXRlZChmaW5hbCBMaXN0Jmx0O0Rlc3RpbmF0aW9uJmd0OyByZWNvbW1lbmRlZCkgeworICAgICAgICAgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGlubmVyTGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2gocmVjb21tZW5kZWQuc2l6ZSgpKTsKKworICAgICAgICAgICAgICAgIC8vIEZvcmVjYXN0cy4gKGRlcGVuZCBvbiByZWNvbW1lbmRlZCBkZXN0aW5hdGlvbnMpCisgICAgICAgICAgICAgICAgZmluYWwgTWFwJmx0O1N0cmluZywgRm9yZWNhc3QmZ3Q7IGZvcmVjYXN0cyA9IENvbGxlY3Rpb25zLnN5bmNocm9uaXplZE1hcChuZXcgSGFzaE1hcCZsdDsmZ3Q7KCkpOworICAgICAgICAgICAgICAgIGZvciAoZmluYWwgRGVzdGluYXRpb24gZGVzdCA6IHJlY29tbWVuZGVkKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcmVjYXN0LnJlc29sdmVUZW1wbGF0ZSgiZGVzdGluYXRpb24iLCBkZXN0LmdldERlc3RpbmF0aW9uKCkpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hc3luYygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldChuZXcgSW52b2NhdGlvbkNhbGxiYWNrJmx0O0ZvcmVjYXN0Jmd0OygpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbXBsZXRlZChmaW5hbCBGb3JlY2FzdCBmb3JlY2FzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWNhc3RzLnB1dChkZXN0LmdldERlc3RpbmF0aW9uKCksIGZvcmVjYXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyTGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZmFpbGVkKGZpbmFsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5vZmZlcigiRm9yZWNhc3Q6ICIgKyB0aHJvd2FibGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyTGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBIYXZlIHRvIHdhaXQgaGVyZSBmb3IgZGVwZW5kZW50IHJlcXVlc3RzIC4uLgorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghaW5uZXJMYXRjaC5hd2FpdCgxMCwgVGltZVVuaXQuU0VDT05EUykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5vZmZlcigiSW5uZXI6IFdhaXRpbmcgZm9yIHJlcXVlc3RzIHRvIGNvbXBsZXRlIGhhcyB0aW1lZCBvdXQuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGVycm9ycy5vZmZlcigiSW5uZXI6IFdhaXRpbmcgZm9yIHJlcXVlc3RzIHRvIGNvbXBsZXRlIGhhcyBiZWVuIGludGVycnVwdGVkLiIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIENvbnRpbnVlIHdpdGggcHJvY2Vzc2luZy4KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBmYWlsZWQoZmluYWwgVGhyb3dhYmxlIHRocm93YWJsZSkgeworICAgICAgICAgICAgICAgIGVycm9ycy5vZmZlcigiUmVjb21tZW5kZWQ6ICIgKyB0aHJvd2FibGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBUaGUgZXhhbXBsZSBpcyBhIGJpdCBtb3JlIGNvbXBsaWNhdGVkIGZyb20gdGhlIGZpcnN0IGdsYW5jZS4gV2UgcHJvdmlkZWQgYW4gJmpheHJzLmNsaWVudC5JbnZvY2F0aW9uQ2FsbGJhY2s7IHRvIGFzeW5jCisgICAgICAgICAgICAgICAgPGxpdGVyYWw+Z2V0PC9saXRlcmFsPiBtZXRob2QuIE9uZSBvZiB0aGUgY2FsbGJhY2sgbWV0aG9kcyAoPGxpdGVyYWw+Y29tcGxldGVkPC9saXRlcmFsPiBvciA8bGl0ZXJhbD5mYWlsZWQ8L2xpdGVyYWw+KQorICAgICAgICAgICAgICAgIGlzIGNhbGxlZCB3aGVuIHRoZSByZXF1ZXN0IGZpbmlzaGVzLiBUaGlzIGlzIGEgcHJldHR5IGNvbnZlbmllbnQgd2F5IHRvIGhhbmRsZSBhc3luYyBpbnZvY2F0aW9ucyB3aGVuIG5vIG5lc3RlZAorICAgICAgICAgICAgICAgIGNhbGxzIGFyZSBwcmVzZW50LiBTaW5jZSB3ZSBoYXZlIHNvbWUgbmVzdGVkIGNhbGxzIChvYnRhaW5pbmcgd2VhdGhlciBmb3JlY2FzdHMpIHdlIG5lZWRlZCB0byBpbnRyb2R1Y2UKKyAgICAgICAgICAgICAgICBhICZqZGs2LkNvdW50RG93bkxhdGNoOyBzeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlIGFzIHdlIHVzZSBhc3luY2hyb25vdXMgYXBwcm9hY2ggaW4gb2J0YWluaW5nIHRoZSB3ZWF0aGVyCisgICAgICAgICAgICAgICAgZm9yZWNhc3RzIGFzIHdlbGwuIFRoZSBsYXRjaCBpcyBkZWNyZWFzZWQgZXZlcnkgdGltZSBhIHJlcXVlc3QsIHRvIHRoZSA8ZW1waGFzaXM+Rm9yZWNhc3RzIHNlcnZpY2U8L2VtcGhhc2lzPiwKKyAgICAgICAgICAgICAgICBjb21wbGV0ZXMgc3VjY2Vzc2Z1bGx5IG9yIGZhaWxzLiBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSByZXF1ZXN0IGFjdHVhbGx5IGZpbmlzaGVkIGFuZCBpdCBpcyBhIHNpZ25hbCBmb3IgdXMgdGhhdAorICAgICAgICAgICAgICAgIHdlIGNhbiBjb250aW51ZSB3aXRoIHByb2Nlc3NpbmcgKG90aGVyd2lzZSB3ZSB3b3VsZG4ndCBoYXZlIGFsbCByZXF1aXJlZCBkYXRhIHRvIGNvbnN0cnVjdCB0aGUgcmVzcG9uc2UgZm9yIHRoZQorICAgICAgICAgICAgICAgIGNsaWVudCkuIFRoaXMgYWRkaXRpb25hbCBzeW5jaHJvbml6YXRpb24gaXMgc29tZXRoaW5nIHRoYXQgd2FzIG5vdCBwcmVzZW50IHdoZW4gdGFraW5nIHRoZSBzeW5jaHJvbm91cyBhcHByb2FjaCwKKyAgICAgICAgICAgICAgICBidXQgaXQgaXMgbmVlZGVkIGhlcmUuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBBbHNvIHRoZSBlcnJvciBwcm9jZXNzaW5nIGNhbiBub3QgYmUgd3JpdHRlbiBhcyBpdCBjb3VsZCBiZSBpbiBhbiBpZGVhbCBjYXNlLiBUaGUgZXJyb3IgaGFuZGxpbmcgaXMgc2NhdHRlcmVkIGluCisgICAgICAgICAgICAgICAgdG9vIG1hbnkgcGxhY2VzIHdpdGhpbiB0aGUgY29kZSwgdGhhdCBpdCBpcyBxdWl0ZSBkaWZmaWN1bHQgdG8gY3JlYXRlIGEgY29tcHJlaGVuc2l2ZSByZXNwb25zZSBmb3IgdGhlIGNsaWVudC4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIE9uIHRoZSBvdGhlciBoYW5kIHRha2luZyBhc3luY2hyb25vdXMgYXBwcm9hY2ggbGVhZHMgdG8gY29kZSB0aGF0IGlzIGFzIGZhc3QgYXMgaXQgZ2V0cy4KKyAgICAgICAgICAgICAgICBUaGUgcmVzb3VyY2VzIGFyZSB1c2VkIG9wdGltYWxseSAobm8gd2FpdGluZyB0aHJlYWRzKSB0byBhY2hpZXZlCisgICAgICAgICAgICAgICAgcXVpY2sgcmVzcG9uc2UgdGltZS4gVGhlIHdob2xlIHByb2Nlc3Mgb2YgY29uc3RydWN0aW5nIHRoZSByZXNwb25zZSBmb3IgdGhlIGNsaWVudCBjYW4gYmUgc2VlbiBpbgorICAgICAgICAgICAgICAgIDx4cmVmIGxpbmtlbmQ9InJ4LmNsaWVudC5tb3RpdmF0aW9uLmdyYXBoLmFzeW5jIiB4cmVmc3R5bGU9InNlbGVjdDogbGFiZWwiIC8+LiBJdCBvbmx5IHRvb2sgNzMwIG1zIGluc3RlYWQgb2YKKyAgICAgICAgICAgICAgICA1NDAwIG1zIHdoaWNoIHdlIGVuY291bnRlcmVkIGluIHRoZSBwcmV2aW91cyBhcHByb2FjaC4KKworICAgICAgICAgICAgICAgIDxmaWd1cmUgeG1sOmlkPSJyeC5jbGllbnQubW90aXZhdGlvbi5ncmFwaC5hc3luYyI+CisgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5UaW1lIGNvbnN1bWVkIHRvIGNyZWF0ZSBhIHJlc3BvbnNlIGZvciB0aGUgY2xpZW50IOKAkyBhc3luY2hyb25vdXMgd2F5PC90aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgPG1lZGlhb2JqZWN0PgorICAgICAgICAgICAgICAgICAgICAgICAgPGltYWdlb2JqZWN0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbWFnZWRhdGEgZmlsZXJlZj0iaW1hZ2VzL3J4LWNsaWVudC1hc3luYy1hcHByb2FjaC5wbmciIGZvcm1hdD0iUE5HIiB3aWR0aD0iODAlIiBzY2FsZWZpdD0iMSIgYWxpZ249ImNlbnRlciIvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9pbWFnZW9iamVjdD4KKyAgICAgICAgICAgICAgICAgICAgPC9tZWRpYW9iamVjdD4KKyAgICAgICAgICAgICAgICA8L2ZpZ3VyZT4KKworICAgICAgICAgICAgICAgIEFzIHlvdSBjYW4gZ3Vlc3MsIHRoaXMgYXBwcm9hY2gsIGV2ZW4gd2l0aCBhbGwgaXQncyBiZW5lZml0cywgaXMgdGhlIG9uZSB0aGF0IGlzIHJlYWxseSBoYXJkIHRvIGltcGxlbWVudCwgZGVidWcKKyAgICAgICAgICAgICAgICBhbmQgbWFpbnRhaW4uIEl0J3MgYSBzYWZlIGJldCB3aGVuIHlvdSBoYXZlIG1hbnkgaW5kZXBlbmRlbnQgY2FsbHMgdG8gbWFrZSBidXQgaXQgZ2V0cyB1Z2xpZXIgd2l0aCBhbiBpbmNyZWFzaW5nCisgICAgICAgICAgICAgICAgbnVtYmVyIG9mIG5lc3RlZCBjYWxscy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zaW1wbGVzZWN0PgorCisgICAgICAgIDxzaW1wbGVzZWN0PgorICAgICAgICAgICAgPHRpdGxlPlJlYWN0aXZlIEFwcHJvYWNoPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgUmVhY3RpdmUgYXBwcm9hY2ggaXMgYSB3YXkgb3V0IG9mIHRoZSBzby1jYWxsZWQgPGVtcGhhc2lzPkNhbGxiYWNrIEhlbGw8L2VtcGhhc2lzPiB3aGljaCB5b3UgY2FuIGVuY291bnRlciB3aGVuCisgICAgICAgICAgICAgICAgZGVhbGluZyB3aXRoIEphdmEncyA8bGl0ZXJhbD5GdXR1cmU8L2xpdGVyYWw+cyBvciBpbnZvY2F0aW9uIGNhbGxiYWNrcy4gUmVhY3RpdmUgYXBwcm9hY2ggaXMgYmFzZWQgb24gYSBkYXRhLWZsb3cKKyAgICAgICAgICAgICAgICBjb25jZXB0IGFuZCB0aGUgZXhlY3V0aW9uIG1vZGVsIHByb3BhZ2F0ZSBjaGFuZ2VzIHRocm91Z2ggdGhlIGZsb3cuIEFuIGV4YW1wbGUgb2YgYSBzaW5nbGUgaXRlbSBpbiB0aGUgZGF0YS1mbG93CisgICAgICAgICAgICAgICAgY2hhaW4gY2FuIGJlIGEgSkFYLVJTIENsaWVudCBIVFRQIG1ldGhvZCBjYWxsLiBXaGVuIHRoZSBKQVgtUlMgcmVxdWVzdCBmaW5pc2hlcyB0aGVuIHRoZSBuZXh0IGl0ZW0gKG9yIHRoZSB1c2VyIGNvZGUpCisgICAgICAgICAgICAgICAgaW4gdGhlIGRhdGEtZmxvdyBjaGFpbiBpcyBub3RpZmllZCBhYm91dCB0aGUgY29udGludWF0aW9uLCBjb21wbGV0aW9uIG9yIGVycm9yIGluIHRoZSBjaGFpbi4gWW91J3JlIG1vcmUgZGVzY3JpYmluZworICAgICAgICAgICAgICAgIHdoYXQgc2hvdWxkIGJlIGRvbmUgbmV4dCB0aGFuIGhvdyB0aGUgbmV4dCBhY3Rpb24gaW4gdGhlIGNoYWluIHNob3VsZCBiZSB0cmlnZ2VyZWQuIFRoZSBvdGhlciBpbXBvcnRhbnQgcGFydCBoZXJlCisgICAgICAgICAgICAgICAgaXMgdGhhdCB0aGUgZGF0YS1mbG93cyBhcmUgY29tcG9zYWJsZS4gWW91IGNhbiBjb21wb3NlL3RyYW5zZm9ybSBtdWx0aXBsZSBmbG93cyBpbnRvIHRoZSByZXN1bHRpbmcgb25lIGFuZCBhcHBseQorICAgICAgICAgICAgICAgIG1vcmUgb3BlcmF0aW9ucyBvbiB0aGUgcmVzdWx0LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgQW4gZXhhbXBsZSBvZiB0aGlzIGFwcHJvYWNoIGNhbiBiZSBzZWVuIGluIDx4cmVmIGxpbmtlbmQ9InJ4LmNsaWVudC5tb3RpdmF0aW9uLnJlYWN0aXZlIiAvPi4gVGhlIEFQSXMgd291bGQgYmUKKyAgICAgICAgICAgICAgICBkZXNjcmliZWQgaW4gbW9yZSBkZXRhaWwgaW4gdGhlIG5leHQgc2VjdGlvbnMuCisKKyAgICAgICAgICAgICAgICA8ZXhhbXBsZSB4bWw6aWQ9InJ4LmNsaWVudC5tb3RpdmF0aW9uLnJlYWN0aXZlIj4KKyAgICAgICAgICAgICAgICAgICAgPHRpdGxlPkV4Y2VycHQgZnJvbSBhIHJlYWN0aXZlIGFwcHJvYWNoIHdoaWxlIGltcGxlbWVudGluZyB0aGUgb3JjaGVzdHJhdGlvbiBsYXllcjwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+ZmluYWwgV2ViVGFyZ2V0IGRlc3RpbmF0aW9uID0gLi4uOworZmluYWwgV2ViVGFyZ2V0IGZvcmVjYXN0ID0gLi4uOworCisvLyBSZWNvbW1lbmRlZCBwbGFjZXMuCitDb21wbGV0aW9uU3RhZ2UmbHQ7TGlzdCZsdDtEZXN0aW5hdGlvbiZndDsmZ3Q7IHJlY29tbWVuZGVkID0KKyAgICAgICAgZGVzdGluYXRpb24ucGF0aCgicmVjb21tZW5kZWQiKQorICAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAgICAvLyBJZGVudGlmeSB0aGUgdXNlci4KKyAgICAgICAgICAgICAgICAgICAuaGVhZGVyKCJSeC1Vc2VyIiwgIkNvbXBsZXRpb25TdGFnZSIpCisgICAgICAgICAgICAgICAgICAgLy8gUmVhY3RpdmUgaW52b2tlci4KKyAgICAgICAgICAgICAgICAgICAucngoKQorICAgICAgICAgICAgICAgICAgIC8vIFJldHVybiBhIGxpc3Qgb2YgZGVzdGluYXRpb25zLgorICAgICAgICAgICAgICAgICAgIC5nZXQobmV3IEdlbmVyaWNUeXBlJmx0O0xpc3QmbHQ7RGVzdGluYXRpb24mZ3Q7Jmd0OygpIHt9KQorICAgICAgICAgICAgICAgICAgIC5leGNlcHRpb25hbGx5KHRocm93YWJsZSAtJmd0OyB7CisgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5vZmZlcigiUmVjb21tZW5kZWQ6ICIgKyB0aHJvd2FibGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgICAgICAgICAgICAgICAgIH0pOworCisvLyBnZXQgRm9yZWNhc3QgZm9yIHJlY29tbWVuZGVkIGRlc3RpbmF0aW9ucy4KK3JldHVybiByZWNvbW1lbmRlZC50aGVuQ29tcG9zZShkZXN0aW5hdGlvbnMgLSZndDsgeworCisgICAgTGlzdCZsdDtDb21wbGV0aW9uU3RhZ2UmbHQ7UmVjb21tZW5kYXRpb24mZ3Q7Jmd0OyByZWNvbW1lbmRhdGlvbnMgPSBkZXN0aW5hdGlvbnMuc3RyZWFtKCkubWFwKGRlc3RpbmF0aW9uIC0mZ3Q7IHsKKyAgICAvLyBGb3IgZWFjaCBkZXN0aW5hdGlvbiwgb2J0YWluIGEgd2VhdGhlciBmb3JlY2FzdCAuLi4KKyAgICBmaW5hbCBDb21wbGV0aW9uU3RhZ2UmbHQ7Rm9yZWNhc3QmZ3Q7IGZvcmVjYXN0UmVzdWx0ID0KKyAgICAgICAgICAgIGZvcmVjYXN0LnJlc29sdmVUZW1wbGF0ZSgiZGVzdGluYXRpb24iLCBkZXN0aW5hdGlvbi5nZXREZXN0aW5hdGlvbigpKQorICAgICAgICAgICAgICAgICAgICAucmVxdWVzdCgpLnJ4KCkuZ2V0KEZvcmVjYXN0LmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAuZXhjZXB0aW9uYWxseSh0aHJvd2FibGUgLSZndDsgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLm9mZmVyKCJGb3JlY2FzdDogIiArIHRocm93YWJsZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGb3JlY2FzdChkZXN0aW5hdGlvbi5nZXREZXN0aW5hdGlvbigpLCAiTi9BIik7CisgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICAgICAgICAgIC8vbm9pbnNwZWN0aW9uIHVuY2hlY2tlZAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29tcGxldGFibGVGdXR1cmUuY29tcGxldGVkRnV0dXJlKG5ldyBSZWNvbW1lbmRhdGlvbihkZXN0aW5hdGlvbikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCBmb3JlY2FzdCBmb3IgcmVjb21tZW5kZWQgZGVzdGluYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuQ29tYmluZShmb3JlY2FzdFJlc3VsdCwgUmVjb21tZW5kYXRpb246OmZvcmVjYXN0KQorICAgICAgICAgICAgICAgICAgICB9KS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCisgICAgICAgICAgICAgICAgICAgIC8vIFRyYW5zZm9ybSBMaXN0Jmx0O0NvbXBsZXRpb25TdGFnZSZsdDtSZWNvbW1lbmRhdGlvbiZndDsmZ3Q7IHRvIENvbXBsZXRpb25TdGFnZSZsdDtMaXN0Jmx0O1JlY29tbWVuZGF0aW9uJmd0OyZndDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcXVlbmNlKHJlY29tbWVuZGF0aW9ucyk7CisgICAgfSk7PC9wcm9ncmFtbGlzdGluZz4KKworICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEFzIHlvdSBjYW4gc2VlIHRoZSBjb2RlIGFjaGlldmVzIHRoZSBzYW1lIHdvcmsgYXMgdGhlIHByZXZpb3VzIHR3byBleGFtcGxlcy4gSXQncyBtb3JlIHJlYWRhYmxlIHRoYW4gdGhlIHB1cmUKKyAgICAgICAgICAgICAgICBhc3luY2hyb25vdXMgYXBwcm9hY2ggZXZlbiB0aG91Z2ggaXQncyBlcXVhbGx5IGZhc3QuIEl0J3MgYXMgZWFzeSB0byByZWFkIGFuZCBpbXBsZW1lbnQgYXMgdGhlIHN5bmNocm9ub3VzIGFwcHJvYWNoLgorICAgICAgICAgICAgICAgIFRoZSBlcnJvciBwcm9jZXNzaW5nIGlzIGFsc28gYmV0dGVyIGhhbmRsZWQgaW4gdGhpcyB3YXkgdGhhbiBpbiB0aGUgYXN5bmNocm9ub3VzIGFwcHJvYWNoLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgV2hlbiBkZWFsaW5nIHdpdGggYSBsYXJnZSBhbW91bnQgb2YgcmVxdWVzdHMgKHRoYXQgZGVwZW5kIG9uIGVhY2ggb3RoZXIpIGFuZCB3aGVuIHlvdSBuZWVkIHRvIGNvbXBvc2UvY29tYmluZSB0aGUKKyAgICAgICAgICAgICAgICByZXN1bHRzIG9mIHRoZXNlIHJlcXVlc3RzLCB0aGUgcmVhY3RpdmUgcHJvZ3JhbW1pbmcgbW9kZWwgaXMgdGhlIHJpZ2h0IHRlY2huaXF1ZSB0byB1c2UuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2ltcGxlc2VjdD4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbj4KKyAgICAgICAgPHRpdGxlPlVzYWdlIGFuZCBFeHRlbnNpb24gTW9kdWxlczwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBSZWFjdGl2ZSBDbGllbnQgQVBJIGlzIHBhcnQgb2YgdGhlIEpBWC1SUyBzcGVjaWZpY2F0aW9uIHNpbmNlIHZlcnNpb24gMi4xLiAKKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgV2hlbiB5b3UgY29tcGFyZSBzeW5jaHJvbm91cyBpbnZvY2F0aW9uIG9mIEhUVFAgY2FsbHMgKAorICAgICAgICAgICAgPHhyZWYgbGlua2VuZD0icnguY2xpZW50LnN5bmMiIC8+KQorCisgICAgICAgICAgICA8ZXhhbXBsZSB4bWw6aWQ9InJ4LmNsaWVudC5zeW5jIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+U3luY2hyb25vdXMgaW52b2NhdGlvbiBvZiBIVFRQIHJlcXVlc3RzPC90aXRsZT4KKworICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPlJlc3BvbnNlIHJlc3BvbnNlID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKQorICAgICAgICAudGFyZ2V0KCJodHRwOi8vZXhhbXBsZS5jb20vcmVzb3VyY2UiKQorICAgICAgICAucmVxdWVzdCgpCisgICAgICAgIC5nZXQoKTs8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorCisgICAgICAgICAgICB3aXRoIGFzeW5jaHJvbm91cyBpbnZvY2F0aW9uICg8eHJlZiBsaW5rZW5kPSJyeC5jbGllbnQuYXN5bmMiIC8+KQorCisgICAgICAgICAgICA8ZXhhbXBsZSB4bWw6aWQ9InJ4LmNsaWVudC5hc3luYyI+CisgICAgICAgICAgICAgICAgPHRpdGxlPkFzeW5jaHJvbm91cyBpbnZvY2F0aW9uIG9mIEhUVFAgcmVxdWVzdHM8L3RpdGxlPgorCisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+RnV0dXJlJmx0O1Jlc3BvbnNlJmd0OyByZXNwb25zZSA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KCkKKyAgICAgICAgLnRhcmdldCgiaHR0cDovL2V4YW1wbGUuY29tL3Jlc291cmNlIikKKyAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAuYXN5bmMoKQorICAgICAgICAuZ2V0KCk7PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKworICAgICAgICAgICAgaXQgaXMgYXBwYXJlbnQgaG93IHRvIHByZXR0eSBjb252ZW5pZW50bHkgbW9kaWZ5IHRoZSB3YXkgaG93IGEgcmVxdWVzdCBpcyBpbnZva2VkIChmcm9tIHN5bmMgdG8gYXN5bmMpIG9ubHkgYnkgY2FsbGluZworICAgICAgICAgICAgPGxpdGVyYWw+YXN5bmM8L2xpdGVyYWw+IG1ldGhvZCBvbiBhbiAmamF4cnMuY2xpZW50Lkludm9jYXRpb24uQnVpbGRlcjsuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBOYXR1cmFsbHksIGl0J2QgYmUgbmljZSB0byBjb3B5IHRoZSBzYW1lIHBhdHRlcm4gdG8gYWxsb3cgaW52b2tpbmcgcmVxdWVzdHMgaW4gYSByZWFjdGl2ZSB3YXkuIEp1c3QgaW5zdGVhZCBvZgorICAgICAgICAgICAgPGxpdGVyYWw+YXN5bmM8L2xpdGVyYWw+IHlvdSdkIGNhbGwgPGxpdGVyYWw+cng8L2xpdGVyYWw+IG9uIGFuIGV4dGVuc2lvbiBvZiAmbGl0LmpheHJzLmNsaWVudC5JbnZvY2F0aW9uLkJ1aWxkZXI7LAorICAgICAgICAgICAgbGlrZSBpbiA8eHJlZiBsaW5rZW5kPSJyeC5jbGllbnQucmVhY3RpdmUiIC8+LgorCisgICAgICAgICAgICA8ZXhhbXBsZSB4bWw6aWQ9InJ4LmNsaWVudC5yZWFjdGl2ZSI+CisgICAgICAgICAgICAgICAgPHRpdGxlPlJlYWN0aXZlIGludm9jYXRpb24gb2YgSFRUUCByZXF1ZXN0czwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5Db21wbGV0aW9uU3RhZ2UmbHQ7UmVzcG9uc2UmZ3Q7IHJlc3BvbnNlID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKQorICAgICAgICAudGFyZ2V0KCJodHRwOi8vZXhhbXBsZS5jb20vcmVzb3VyY2UiKQorICAgICAgICAucmVxdWVzdCgpCisgICAgICAgIC5yeCgpCisgICAgICAgIC5nZXQoKTs8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhlIGZpcnN0IHJlYWN0aXZlIGludGVyZmFjZSBpbiB0aGUgaW52b2NhdGlvbiBjaGFpbiBpcyAmamF4cnMuY2xpZW50LlJ4SW52b2tlcjsgd2hpY2ggaXMgdmVyeSBzaW1pbGFyIHRvCisgICAgICAgICAgICAmamF4cnMuY2xpZW50LlN5bmNJbnZva2VyOyBhbmQgJmpheHJzLmNsaWVudC5Bc3luY0ludm9rZXI7LiBJdCBjb250YWlucyBhbGwgbWV0aG9kcyBwcmVzZW50IGluIHRoZSB0d28gbGF0dGVyCisgICAgICAgICAgICBKQVgtUlMgaW50ZXJmYWNlcyBidXQgdGhlICZsaXQuamF4cnMuY2xpZW50LlJ4SW52b2tlcjsgaW50ZXJmYWNlIGlzIG1vcmUgZ2VuZXJpYywgc28gdGhhdCBpdCBjYW4gYmUgZXh0ZW5kZWQKKyAgICAgICAgICAgIGFuZCB1c2VkIGluIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb25zIHRha2luZyBhZHZhbnRhZ2Ugb2YgdmFyaW91cyByZWFjdGl2ZSBsaWJyYXJpZXMuIEV4dGVuZGluZyB0aGlzIG5ldyBpbnRlcmZhY2UKKyAgICAgICAgICAgIGluIGEgcGFydGljdWxhciBpbXBsZW1lbnRhdGlvbiBhbHNvIHByZXNlcnZlcyB0eXBlIHNhZmV0eSB3aGljaCBtZWFucyB0aGF0IHlvdSdyZSBub3QgbG9vc2luZyB0eXBlIGluZm9ybWF0aW9uIHdoZW4gYSBIVFRQCisgICAgICAgICAgICBtZXRob2QgY2FsbCByZXR1cm5zIGFuIG9iamVjdCB0aGF0IHlvdSB3YW50IHRvIHByb2Nlc3MgZnVydGhlci4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZSBtZXRob2QgInJ4KCkiIGluIHRoZSBleGFtcGxlIGFib3ZlIGlzIHBlcmZlY3QgZXhhbXBsZSBvZiB0aGF0IHByaW5jaXBsZS4gSXQgcmV0dXJucyAmamF4cnMuY2xpZW50LkNvbXBsZXRpb25TdGFnZVJ4SW52b2tlcjssCisgICAgICAgICAgICB3aGljaCBleHRlbmRzICZqYXhycy5jbGllbnQuUnhJbnZva2VyOy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEFzIGEgdXNlciBvZiB0aGUgUmVhY3RpdmUgQ2xpZW50IEFQSSB5b3Ugb25seSBuZWVkIHRvIGtlZXAgaW4gbWluZCB0aGF0IHlvdSB3b24ndCBiZSB3b3JraW5nIHdpdGgKKyAgICAgICAgICAgICZsaXQuamF4cnMuY2xpZW50LlJ4SW52b2tlcjsgZGlyZWN0bHkuIFlvdSdkIHJhdGhlciBiZSB3b3JraW5nIHdpdGggYW4gZXh0ZW5zaW9uIG9mIHRoaXMgaW50ZXJmYWNlIGNyZWF0ZWQgZm9yCisgICAgICAgICAgICBhIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24gYW5kIHlvdSBkb24ndCBuZWVkIHRvIGJlIGJvdGhlcmVkIG11Y2ggd2l0aCB3aHkgYXJlIHRoaW5ncyBkZXNpZ25lZCB0aGUgd2F5IHRoZXkgYXJlLgorCisgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgVG8gc2VlIGhvdyB0aGUgJmxpdC5qYXhycy5jbGllbnQuUnhJbnZva2VyOyBzaG91bGQgYmUgZXh0ZW5kZWQsIHJlZmVyIHRvCisgICAgICAgICAgICAgICAgICAgIDx4cmVmIGxpbmtlbmQ9InJ4LmNsaWVudC5zcGkiIC8+LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvbm90ZT4KKworICAgICAgICAgICAgVGhlIGltcG9ydGFudCB0aGluZyB0byBub3RpY2UgaGVyZSBpcyB0aGF0IGFuIGV4dGVuc2lvbiBvZiAmbGl0LmpheHJzLmNsaWVudC5SeEludm9rZXI7IGhvbGRzIHRoZSB0eXBlCisgICAgICAgICAgICBpbmZvcm1hdGlvbiBhbmQgdGhlIFJlYWN0aXZlIENsaWVudCBuZWVkcyB0byBrbm93IGFib3V0IHRoaXMgdHlwZSB0byBwcm9wZXJseSBwcm9wYWdhdGUgaXQgYW1vbmcgdGhlIG1ldGhvZAorICAgICAgICAgICAgY2FsbHMgeW91J2xsIGJlIG1ha2luZy4gVGhpcyBpcyB0aGUgcmVhc29uIHdoeSBvdGhlciBpbnRlcmZhY2VzIChkZXNjcmliZWQgYmVsbG93KSBhcmUgcGFyYW1ldHJpemVkIHdpdGggdGhpcyB0eXBlLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgSW4gb3JkZXIgdG8gZXh0ZW5kIHRoZSBBUEkgdG8gYmUgdXNlZCB3aXRoIG90aGVyIHJlYWN0aXZlIGZyYW1ld29ya3MsICZqYXhycy5jbGllbnQuUnhJbnZva2VyUHJvdmlkZXI7IG5lZWRzIHRvIGJlCisgICAgICAgICAgICByZWdpc3RlcmVkIGludG8gdGhlIENsaWVudCBydW50aW1lOgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPkNsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpOworY2xpZW50LnJlZ2lzdGVyKFJ4Rmxvd2FibGVJbnZva2VyUHJvdmlkZXIuY2xhc3MpOworCitGbG93YWJsZSZsdDtTdHJpbmcmZ3Q7IHJlc3BvbnNlRmxvd2FibGUgPQorICAgICAgICBjbGllbnQudGFyZ2V0KCJodHRwOi8vamVyc2V5LmphdmEubmV0IikKKyAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAucngoUnhGbG93YWJsZUludm9rZXIuY2xhc3MpCisgICAgICAgICAgICAgIC5nZXQoU3RyaW5nLmNsYXNzKTsKKworU3RyaW5nIHJlc3BvbnNlU3RyaW5nID0gcmVzcG9uc2VGbG93YWJsZS5ibG9ja2luZ0ZpcnN0KCk7PC9wcm9ncmFtbGlzdGluZz4gICAgICAgIAorCisgICAgICAgIDxzaW1wbGVzZWN0PgorICAgICAgICAgICAgICAgIDx0aXRsZT5EZXBlbmRlbmNpZXM8L3RpdGxlPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEpBWC1SUyBtYW5kYXRlcyBzdXBwb3J0IGZvciBDb21wbGV0aW9uU3RhZ2UsIHdoaWNoIGRvZXNuJ3QgcmVxdWlyZWQgYW55IG90aGVyIGRlcGVuZGVuY3kgYW5kIGNhbiBiZQorICAgICAgICAgICAgICAgICAgICB1c2VkIG91dCBvZiB0aGUgYm94LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgVG8gYWRkIHN1cHBvcnQgZm9yIGEgcGFydGljdWxhciBsaWJyYXJ5LCBzZWUgdGhlIDx4cmVmIGxpbmtlbmQ9InJ4LmNsaWVudC5zdXBwb3J0ZWQiIC8+LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIElmIHlvdSdyZSBub3QgdXNpbmcgTWF2ZW4gKG9yIG90aGVyIGRlcGVuZGVuY3kgbWFuYWdlbWVudCB0b29sKSBtYWtlIHN1cmUgdG8gYWRkIGFsc28gYWxsIHRoZSB0cmFuc2l0aXZlCisgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXMgb2YgSmVyc2V5IGNsaWVudCBtb2R1bGUgYW5kIGFueSBvdGhlciBleHRlbnNpb25zICh3aGVuIHVzZWQpIG9uIHRoZSBjbGFzcy1wYXRoLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9ub3RlPgorICAgICAgICAgICAgPC9zaW1wbGVzZWN0PgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIHhtbDppZD0icnguY2xpZW50LnN1cHBvcnRlZCI+CisgICAgICAgIDx0aXRsZT5TdXBwb3J0ZWQgUmVhY3RpdmUgTGlicmFyaWVzPC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZXJlIGFyZSBhbHJlYWR5IHNvbWUgYXZhaWxhYmxlIHJlYWN0aXZlIChvciByZWFjdGl2ZS1saWtlKSBsaWJyYXJpZXMgb3V0IHRoZXJlIGFuZCBKZXJzZXkgYnJpbmdzIHN1cHBvcnQgZm9yIHNvbWUgb2YKKyAgICAgICAgICAgIHRoZW0gb3V0IG9mIHRoZSBib3guIEplcnNleSBjdXJyZW50bHkgc3VwcG9ydHM6CisKKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT48eHJlZiBsaW5rZW5kPSJyeC1jbGllbnQucnhqYXZhIiBlbmR0ZXJtPSJyeC1jbGllbnQucnhqYXZhLnRpdGxlIiAvPjwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+PHhyZWYgbGlua2VuZD0icngtY2xpZW50LnJ4amF2YTIiIGVuZHRlcm09InJ4LWNsaWVudC5yeGphdmEyLnRpdGxlIiAvPjwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+PHhyZWYgbGlua2VuZD0icngtY2xpZW50Lmd1YXZhIiBlbmR0ZXJtPSJyeC1jbGllbnQuZ3VhdmEudGl0bGUiIC8+PC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxzZWN0aW9uIHhtbDppZD0icngtY2xpZW50LnJ4amF2YSI+CisgICAgICAgICAgICA8dGl0bGU+UnhKYXZhIOKAkyBPYnNlcnZhYmxlPC90aXRsZT4KKyAgICAgICAgICAgIDx0aXRsZWFiYnJldiB4bWw6aWQ9InJ4LWNsaWVudC5yeGphdmEudGl0bGUiPlJ4SmF2YSAoT2JzZXJ2YWJsZSk8L3RpdGxlYWJicmV2PgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAmcnhqYXZhLmxpbms7LCBjb250cmlidXRlZCBieSBOZXRmbGl4LCBpcyBwcm9iYWJseSB0aGUgbW9zdCBhZHZhbmNlZCByZWFjdGl2ZSBsaWJyYXJ5IGZvciBKYXZhIGF0IHRoZSBtb21lbnQuIEl0J3MKKyAgICAgICAgICAgICAgICB1c2VkIGZvciBjb21wb3NpbmcgYXN5bmNocm9ub3VzIGFuZCBldmVudC1iYXNlZCBwcm9ncmFtcyBieSB1c2luZyBvYnNlcnZhYmxlIHNlcXVlbmNlcy4gSXQgdXNlcyB0aGUKKyAgICAgICAgICAgICAgICA8bGluayB4bGluazpocmVmPSImd2lraXBlZGlhLnVyaTtPYnNlcnZlcl9wYXR0ZXJuIj5vYnNlcnZlciBwYXR0ZXJuPC9saW5rPiB0byBzdXBwb3J0IHRoZXNlIHNlcXVlbmNlcyBvZiBkYXRhL2V2ZW50cworICAgICAgICAgICAgICAgIHZpYSBpdCdzICZyeGphdmEuT2JzZXJ2YWJsZTsgZW50cnkgcG9pbnQgY2xhc3Mgd2hpY2ggaW1wbGVtZW50cyB0aGUgUmVhY3RpdmUgUGF0dGVybi4gJmxpdC5yeGphdmEuT2JzZXJ2YWJsZTsgaXMKKyAgICAgICAgICAgICAgICBhY3R1YWxseSB0aGUgcGFyYW1ldGVyIHR5cGUgaW4gdGhlIFJ4SmF2YSdzIGV4dGVuc2lvbiBvZiAmamF4cnMuY2xpZW50LlJ4SW52b2tlcjssIGNhbGxlZAorICAgICAgICAgICAgICAgICZqZXJzZXkuZXh0LnJ4LmNsaWVudC5yeGphdmEuUnhPYnNlcnZhYmxlSW52b2tlcjsuIFRoaXMgbWVhbnMgdGhhdCB0aGUgcmV0dXJuIHR5cGUgb2YgSFRUUCBtZXRob2QgY2FsbHMgaXMKKyAgICAgICAgICAgICAgICAmbGl0LnJ4amF2YS5PYnNlcnZhYmxlOyBpbiB0aGlzIGNhc2UgKGFjY29yZGluZ2x5IHBhcmFtZXRyaXplZCkuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBSZXF1ZXN0cyBhcmUgYnkgZGVmYXVsdCBpbnZva2VkIGF0IHRoZSBtb21lbnQgd2hlbiBhIHN1YnNjcmliZXIgaXMgc3Vic2NyaWJlZCB0byBhbiBvYnNlcnZhYmxlIChpdCdzIGEgY29sZAorICAgICAgICAgICAgICAgICZsaXQucnhqYXZhLk9ic2VydmFibGU7KS4gSWYgbm90IHNhaWQgb3RoZXJ3aXNlIGEgc2VwYXJhdGUgdGhyZWFkIChKQVgtUlMgQXN5bmMgQ2xpZW50IHJlcXVlc3RzKSBpcyB1c2VkIHRvCisgICAgICAgICAgICAgICAgb2J0YWluIGRhdGEuIFRoaXMgYmVoYXZpb3IgY2FuIGJlIG92ZXJyaWRkZW4gYnkgcHJvdmlkaW5nIGFuICZqZGs2LkV4ZWN1dG9yU2VydmljZTsgd2hlbiBhIHJlYWN0aXZlCisgICAgICAgICAgICAgICAgJmxpdC5qYXhycy5jbGllbnQuQ2xpZW50OyBpcyBjcmVhdGVkLgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8c2ltcGxlc2VjdD4KKyAgICAgICAgICAgICAgICA8dGl0bGU+VXNhZ2U8L3RpdGxlPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFRoZSBleHRlbnNpYmlsaXR5IGlzIGJ1aWx0LWluIEpBWC1SUyBDbGllbnQgQVBJLCBzbyB0aGVyZSBhcmUgbm8gc3BlY2lhbCBkZXBlbmRlbmNpZXMgb24gSmVyc2V5IENsaWVudAorICAgICAgICAgICAgICAgICAgICBBUEkgb3RoZXIgdGhhbiB0aGUgZXh0ZW5zaW9uIGl0c2VsZi4KKworICAgICAgICAgICAgICAgICAgICA8ZXhhbXBsZSB4bWw6aWQ9InJ4LmNsaWVudC5yeGphdmEucngiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRpdGxlPkNyZWF0aW5nIEpBWC1SUyBDbGllbnQgd2l0aCBSeEphdmEgcmVhY3RpdmUgZXh0ZW5zaW9uPC90aXRsZT4KKworICAgICAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+Ly8gTmV3IENsaWVudAorQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KCk7CitjbGllbnQucmVnaXN0ZXIoUnhPYnNlcnZhYmxlSW52b2tlclByb3ZpZGVyLmNsYXNzKTs8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBBbiBleGFtcGxlIG9mIG9idGFpbmluZyAmbGl0LnJ4amF2YS5PYnNlcnZhYmxlOyB3aXRoIEpBWC1SUyAmbGl0LmpheHJzLmNvcmUuUmVzcG9uc2U7IGZyb20gYSByZW1vdGUgc2VydmljZQorICAgICAgICAgICAgICAgICAgICBjYW4gYmUgc2VlbiBpbiA8eHJlZiBsaW5rZW5kPSJyeC5jbGllbnQucnhqYXZhLnVzYWdlIiAvPi4KKworICAgICAgICAgICAgICAgICAgICA8ZXhhbXBsZSB4bWw6aWQ9InJ4LmNsaWVudC5yeGphdmEudXNhZ2UiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRpdGxlPk9idGFpbmluZyBPYnNlcnZhYmxlJmx0O1Jlc3BvbnNlJmd0OyBmcm9tIEplcnNleS9SeEphdmEgQ2xpZW50PC90aXRsZT4KKworICAgICAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+T2JzZXJ2YWJsZSZsdDtSZXNwb25zZSZndDsgb2JzZXJ2YWJsZSA9IFJ4T2JzZXJ2YWJsZS5uZXdDbGllbnQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50YXJnZXQoImh0dHA6Ly9leGFtcGxlLmNvbS9yZXNvdXJjZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yeChSeE9ic2VydmFibGVJbnZva2VyLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoKTs8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zaW1wbGVzZWN0PgorCisgICAgICAgICAgICA8c2ltcGxlc2VjdD4KKyAgICAgICAgICAgICAgICA8dGl0bGU+RGVwZW5kZW5jaWVzPC90aXRsZT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUaGUgUnhKYXZhIHN1cHBvcnQgaXMgYXZhaWxhYmxlIGFzIGFuIGV4dGVuc2lvbiBtb2R1bGUgaW4gSmVyc2V5LiBGb3IgTWF2ZW4gdXNlcnMsCisgICAgICAgICAgICAgICAgICAgIHNpbXBseSBhZGQgdGhlIGZvbGxvd2luZyBkZXBlbmRlbmN5IHRvIHlvdXIgJmxpdC5wb20ueG1sOzoKKworICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9InhtbCIgbGluZW51bWJlcmluZz0idW5udW1iZXJlZCI+Jmx0O2RlcGVuZGVuY3kmZ3Q7CisgICAgJmx0O2dyb3VwSWQmZ3Q7b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LnJ4Jmx0Oy9ncm91cElkJmd0OworICAgICZsdDthcnRpZmFjdElkJmd0O2plcnNleS1yeC1jbGllbnQtcnhqYXZhJmx0Oy9hcnRpZmFjdElkJmd0OworICAgICZsdDt2ZXJzaW9uJmd0OyZ2ZXJzaW9uOyZsdDsvdmVyc2lvbiZndDsKKyZsdDsvZGVwZW5kZW5jeSZndDs8L3Byb2dyYW1saXN0aW5nPgorCisgICAgICAgICAgICAgICAgICAgIEFmdGVyIHRoaXMgc3RlcCB5b3UgY2FuIHVzZSB0aGUgZXh0ZW5kZWQgY2xpZW50IHJpZ2h0IGF3YXkuIFRoZSBkZXBlbmRlbmN5IHRyYW5zaXRpdmVseSBhZGRzIHRoZSBmb2xsb3dpbmcKKyAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzIHRvIHlvdXIgY2xhc3MtcGF0aCBhcyB3ZWxsOiA8bGl0ZXJhbD5pby5yZWFjdGl2ZXg6cnhqYXZhPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICBJZiB5b3UncmUgbm90IHVzaW5nIE1hdmVuIChvciBvdGhlciBkZXBlbmRlbmN5IG1hbmFnZW1lbnQgdG9vbCkgbWFrZSBzdXJlIHRvIGFkZCBhbHNvIGFsbCB0aGUgdHJhbnNpdGl2ZQorICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzIG9mIHRoaXMgZXh0ZW5zaW9uIG1vZHVsZSAoc2VlICZqZXJzZXkuZXh0LnJ4LWNsaWVudC5yeGphdmEuZGVwcy5saW5rOykgb24gdGhlIGNsYXNzLXBhdGguCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L25vdGU+CisgICAgICAgICAgICA8L3NpbXBsZXNlY3Q+CisgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICA8c2VjdGlvbiB4bWw6aWQ9InJ4LWNsaWVudC5yeGphdmEyIj4KKyAgICAgICAgICAgIDx0aXRsZT5SeEphdmEg4oCTIEZsb3dhYmxlPC90aXRsZT4KKyAgICAgICAgICAgIDx0aXRsZWFiYnJldiB4bWw6aWQ9InJ4LWNsaWVudC5yeGphdmEyLnRpdGxlIj5SeEphdmEgKEZsb3dhYmxlKTwvdGl0bGVhYmJyZXY+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICZyeGphdmEubGluazssIGNvbnRyaWJ1dGVkIGJ5IE5ldGZsaXgsIGlzIHByb2JhYmx5IHRoZSBtb3N0IGFkdmFuY2VkIHJlYWN0aXZlIGxpYnJhcnkgZm9yIEphdmEgYXQgdGhlIG1vbWVudC4gSXQncworICAgICAgICAgICAgICAgIHVzZWQgZm9yIGNvbXBvc2luZyBhc3luY2hyb25vdXMgYW5kIGV2ZW50LWJhc2VkIHByb2dyYW1zIGJ5IHVzaW5nIG9ic2VydmFibGUgc2VxdWVuY2VzLiBJdCB1c2VzIHRoZQorICAgICAgICAgICAgICAgIDxsaW5rIHhsaW5rOmhyZWY9IiZ3aWtpcGVkaWEudXJpO09ic2VydmVyX3BhdHRlcm4iPm9ic2VydmVyIHBhdHRlcm48L2xpbms+IHRvIHN1cHBvcnQgdGhlc2Ugc2VxdWVuY2VzIG9mIGRhdGEvZXZlbnRzCisgICAgICAgICAgICAgICAgdmlhIGl0J3MgJnJ4amF2YTIuRmxvd2FibGU7IGVudHJ5IHBvaW50IGNsYXNzIHdoaWNoIGltcGxlbWVudHMgdGhlIFJlYWN0aXZlIFBhdHRlcm4uICZsaXQucnhqYXZhMi5GbG93YWJsZTsgaXMKKyAgICAgICAgICAgICAgICBhY3R1YWxseSB0aGUgcGFyYW1ldGVyIHR5cGUgaW4gdGhlIFJ4SmF2YSdzIGV4dGVuc2lvbiBvZiAmamF4cnMuY2xpZW50LlJ4SW52b2tlcjssIGNhbGxlZAorICAgICAgICAgICAgICAgICZqZXJzZXkuZXh0LnJ4LmNsaWVudC5yeGphdmEyLlJ4Rmxvd2FibGVJbnZva2VyOy4gVGhpcyBtZWFucyB0aGF0IHRoZSByZXR1cm4gdHlwZSBvZiBIVFRQIG1ldGhvZCBjYWxscyBpcworICAgICAgICAgICAgICAgICZsaXQucnhqYXZhMi5GbG93YWJsZTsgaW4gdGhpcyBjYXNlIChhY2NvcmRpbmdseSBwYXJhbWV0cml6ZWQpLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgUmVxdWVzdHMgYXJlIGJ5IGRlZmF1bHQgaW52b2tlZCBhdCB0aGUgbW9tZW50IHdoZW4gYSBzdWJzY3JpYmVyIGlzIHN1YnNjcmliZWQgdG8gYSBmbG93YWJsZSAoaXQncyBhIGNvbGQKKyAgICAgICAgICAgICAgICAmbGl0LnJ4amF2YTIuRmxvd2FibGU7KS4gSWYgbm90IHNhaWQgb3RoZXJ3aXNlIGEgc2VwYXJhdGUgdGhyZWFkIChKQVgtUlMgQXN5bmMgQ2xpZW50IHJlcXVlc3RzKSBpcyB1c2VkIHRvCisgICAgICAgICAgICAgICAgb2J0YWluIGRhdGEuIFRoaXMgYmVoYXZpb3IgY2FuIGJlIG92ZXJyaWRkZW4gYnkgcHJvdmlkaW5nIGFuICZqZGs2LkV4ZWN1dG9yU2VydmljZTsgd2hlbiBhIHJlYWN0aXZlCisgICAgICAgICAgICAgICAgJmxpdC5qYXhycy5jbGllbnQuQ2xpZW50OyBpcyBjcmVhdGVkLgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8c2ltcGxlc2VjdD4KKyAgICAgICAgICAgICAgICA8dGl0bGU+VXNhZ2U8L3RpdGxlPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFRoZSBleHRlbnNpYmlsaXR5IGlzIGJ1aWx0LWluIEpBWC1SUyBDbGllbnQgQVBJLCBzbyB0aGVyZSBhcmUgbm8gc3BlY2lhbCBkZXBlbmRlbmNpZXMgb24gSmVyc2V5IENsaWVudAorICAgICAgICAgICAgICAgICAgICBBUEkgb3RoZXIgdGhhbiB0aGUgZXh0ZW5zaW9uIGl0c2VsZi4KKworICAgICAgICAgICAgICAgICAgICA8ZXhhbXBsZSB4bWw6aWQ9InJ4LmNsaWVudC5yeGphdmEyLnJ4Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5DcmVhdGluZyBKQVgtUlMgQ2xpZW50IHdpdGggUnhKYXZhMiByZWFjdGl2ZSBleHRlbnNpb248L3RpdGxlPgorCisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj4vLyBOZXcgQ2xpZW50CitDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKTsKK2NsaWVudC5yZWdpc3RlcihSeEZsb3dhYmxlSW52b2tlclByb3ZpZGVyLmNsYXNzKTs8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBBbiBleGFtcGxlIG9mIG9idGFpbmluZyAmbGl0LnJ4amF2YTIuRmxvd2FibGU7IHdpdGggSkFYLVJTICZsaXQuamF4cnMuY29yZS5SZXNwb25zZTsgZnJvbSBhIHJlbW90ZSBzZXJ2aWNlCisgICAgICAgICAgICAgICAgICAgIGNhbiBiZSBzZWVuIGluIDx4cmVmIGxpbmtlbmQ9InJ4LmNsaWVudC5yeGphdmEudXNhZ2UiIC8+LgorCisgICAgICAgICAgICAgICAgICAgIDxleGFtcGxlIHhtbDppZD0icnguY2xpZW50LnJ4amF2YTIudXNhZ2UiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRpdGxlPk9idGFpbmluZyBGbG93YWJsZSZsdDtSZXNwb25zZSZndDsgZnJvbSBKZXJzZXkvUnhKYXZhIENsaWVudDwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPkZsb3dhYmxlJmx0O1Jlc3BvbnNlJmd0OyBvYnNlcnZhYmxlID0gUnhPYnNlcnZhYmxlLm5ld0NsaWVudCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRhcmdldCgiaHR0cDovL2V4YW1wbGUuY29tL3Jlc291cmNlIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJ4KFJ4Rmxvd2FibGVJbnZva2VyLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NpbXBsZXNlY3Q+CisKKyAgICAgICAgICAgIDxzaW1wbGVzZWN0PgorICAgICAgICAgICAgICAgIDx0aXRsZT5EZXBlbmRlbmNpZXM8L3RpdGxlPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFRoZSBSeEphdmEgc3VwcG9ydCBpcyBhdmFpbGFibGUgYXMgYW4gZXh0ZW5zaW9uIG1vZHVsZSBpbiBKZXJzZXkuIEZvciBNYXZlbiB1c2VycywKKyAgICAgICAgICAgICAgICAgICAgc2ltcGx5IGFkZCB0aGUgZm9sbG93aW5nIGRlcGVuZGVuY3kgdG8geW91ciAmbGl0LnBvbS54bWw7OgorCisgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0ieG1sIiBsaW5lbnVtYmVyaW5nPSJ1bm51bWJlcmVkIj4mbHQ7ZGVwZW5kZW5jeSZndDsKKyAgICAmbHQ7Z3JvdXBJZCZndDtvcmcuZ2xhc3NmaXNoLmplcnNleS5leHQucngmbHQ7L2dyb3VwSWQmZ3Q7CisgICAgJmx0O2FydGlmYWN0SWQmZ3Q7amVyc2V5LXJ4LWNsaWVudC1yeGphdmEyJmx0Oy9hcnRpZmFjdElkJmd0OworICAgICZsdDt2ZXJzaW9uJmd0OyZ2ZXJzaW9uOyZsdDsvdmVyc2lvbiZndDsKKyZsdDsvZGVwZW5kZW5jeSZndDs8L3Byb2dyYW1saXN0aW5nPgorCisgICAgICAgICAgICAgICAgICAgIEFmdGVyIHRoaXMgc3RlcCB5b3UgY2FuIHVzZSB0aGUgZXh0ZW5kZWQgY2xpZW50IHJpZ2h0IGF3YXkuIFRoZSBkZXBlbmRlbmN5IHRyYW5zaXRpdmVseSBhZGRzIHRoZSBmb2xsb3dpbmcKKyAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzIHRvIHlvdXIgY2xhc3MtcGF0aCBhcyB3ZWxsOiA8bGl0ZXJhbD5pby5yZWFjdGl2ZXg6cnhqYXZhMjwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgSWYgeW91J3JlIG5vdCB1c2luZyBNYXZlbiAob3Igb3RoZXIgZGVwZW5kZW5jeSBtYW5hZ2VtZW50IHRvb2wpIG1ha2Ugc3VyZSB0byBhZGQgYWxzbyBhbGwgdGhlIHRyYW5zaXRpdmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llcyBvZiB0aGlzIGV4dGVuc2lvbiBtb2R1bGUgKHNlZSAmamVyc2V5LmV4dC5yeC1jbGllbnQucnhqYXZhMi5kZXBzLmxpbms7KSBvbiB0aGUgY2xhc3MtcGF0aC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgICAgIDwvc2ltcGxlc2VjdD4KKyAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgIDxzZWN0aW9uIHhtbDppZD0icngtY2xpZW50Lmd1YXZhIj4KKyAgICAgICAgICAgIDx0aXRsZT5HdWF2YSDigJMgTGlzdGVuYWJsZUZ1dHVyZSBhbmQgRnV0dXJlczwvdGl0bGU+CisgICAgICAgICAgICA8dGl0bGVhYmJyZXYgeG1sOmlkPSJyeC1jbGllbnQuZ3VhdmEudGl0bGUiPkd1YXZhIChMaXN0ZW5hYmxlRnV0dXJlIGFuZCBGdXR1cmVzKTwvdGl0bGVhYmJyZXY+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICZndWF2YS5saW5rOywgY29udHJpYnV0ZWQgYnkgR29vZ2xlLCBhbHNvIGNvbnRhaW5zIGEgdHlwZSwgJmd1YXZhLkxpc3RlbmFibGVGdXR1cmU7LCB3aGljaCBjYW4gYmUgZGVjb3JhdGVkIHdpdGgKKyAgICAgICAgICAgICAgICBsaXN0ZW5lcnMgdGhhdCBhcmUgbm90aWZpZWQgd2hlbiB0aGUgZnV0dXJlIGNvbXBsZXRlcy4gVGhlICZsaXQuZ3VhdmEuTGlzdGVuYWJsZUZ1dHVyZTsgY2FuIGJlIGNvbWJpbmVkIHdpdGgKKyAgICAgICAgICAgICAgICAmZ3VhdmEuRnV0dXJlczsgdG8gYWNoaWV2ZSBhc3luY2hyb25vdXMvZXZlbnQtYmFzZWQgY29tcGxldGlvbiBhd2FyZSBwcm9jZXNzaW5nLiAmbGl0Lmd1YXZhLkxpc3RlbmFibGVGdXR1cmU7CisgICAgICAgICAgICAgICAgaXMgdGhlIHBhcmFtZXRlciB0eXBlIGluIHRoZSBHdWF2YSdzIGV4dGVuc2lvbiBvZiAmbGl0LmpheHJzLmNsaWVudC5SeEludm9rZXI7LCBjYWxsZWQKKyAgICAgICAgICAgICAgICAmamVyc2V5LmV4dC5yeC5jbGllbnQuZ3VhdmEuUnhMaXN0ZW5hYmxlRnV0dXJlSW52b2tlcjsuIFRoaXMgbWVhbnMgdGhhdCB0aGUgcmV0dXJuIHR5cGUgb2YgSFRUUCBtZXRob2QgY2FsbHMgaXMKKyAgICAgICAgICAgICAgICAmbGl0Lmd1YXZhLkxpc3RlbmFibGVGdXR1cmU7IGluIHRoaXMgY2FzZSAoYWNjb3JkaW5nbHkgcGFyYW1ldHJpemVkKS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFJlcXVlc3RzIGFyZSBieSBkZWZhdWx0IGludm9rZWQgaW1tZWRpYXRlbHkuIElmIG5vdCBzYWlkIG90aGVyd2lzZSB0aGUgJmpkazguRXhlY3V0b3JzLm5ld0NhY2hlZFRocmVhZFBvb2w7IHBvb2wKKyAgICAgICAgICAgICAgICBpcyB1c2VkIHRvIG9idGFpbiBhIHRocmVhZCB3aGljaCBwcm9jZXNzZWQgdGhlIHJlcXVlc3QuIFRoaXMgYmVoYXZpb3IgY2FuIGJlIG92ZXJyaWRkZW4gYnkgcHJvdmlkaW5nIGEKKyAgICAgICAgICAgICAgICAmamRrNi5FeGVjdXRvclNlcnZpY2U7IHdoZW4gYSAmbGl0LmpheHJzLmNsaWVudC5DbGllbnQ7IGlzIGNyZWF0ZWQuCisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxzaW1wbGVzZWN0PgorICAgICAgICAgICAgICAgIDx0aXRsZT5Vc2FnZTwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgVGhlIGV4dGVuc2liaWxpdHkgaXMgYnVpbHQtaW4gSkFYLVJTIENsaWVudCBBUEksIHNvIHRoZXJlIGFyZSBubyBzcGVjaWFsIGRlcGVuZGVuY2llcyBvbiBKZXJzZXkgQ2xpZW50CisgICAgICAgICAgICAgICAgICAgIEFQSSBvdGhlciB0aGFuIHRoZSBleHRlbnNpb24gaXRzZWxmLgorCisgICAgICAgICAgICAgICAgICAgIDxleGFtcGxlIHhtbDppZD0icnguY2xpZW50Lmd1YXZhLnJ4Ij4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5DcmVhdGluZyBKZXJzZXkvR3VhdmEgQ2xpZW50PC90aXRsZT4KKworICAgICAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+Ly8gTmV3IENsaWVudAorQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KCk7CitjbGllbnQucmVnaXN0ZXIoUnhMaXN0ZW5hYmxlRnV0dXJlSW52b2tlclByb3ZpZGVyLmNsYXNzKTs8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBBbiBleGFtcGxlIG9mIG9idGFpbmluZyAmbGl0Lmd1YXZhLkxpc3RlbmFibGVGdXR1cmU7IHdpdGggSkFYLVJTICZsaXQuamF4cnMuY29yZS5SZXNwb25zZTsgZnJvbSBhIHJlbW90ZQorICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlIGNhbiBiZSBzZWVuIGluIDx4cmVmIGxpbmtlbmQ9InJ4LmNsaWVudC5ndWF2YS51c2FnZSIgLz4uCisKKyAgICAgICAgICAgICAgICAgICAgPGV4YW1wbGUgeG1sOmlkPSJyeC5jbGllbnQuZ3VhdmEudXNhZ2UiPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRpdGxlPk9idGFpbmluZyBMaXN0ZW5hYmxlRnV0dXJlJmx0O1Jlc3BvbnNlJmd0OyBmcm9tIEplcnNleS9HdWF2YSBDbGllbnQ8L3RpdGxlPgorCisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj4KK0xpc3RlbmFibGVGdXR1cmUmbHQ7UmVzcG9uc2UmZ3Q7IHJlc3BvbnNlID0gY2xpZW50LnRhcmdldCgiaHR0cDovL2plcnNleS5qYXZhLm5ldCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJ4KFJ4TGlzdGVuYWJsZUZ1dHVyZUludm9rZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoKTsKKzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NpbXBsZXNlY3Q+CisKKyAgICAgICAgICAgIDxzaW1wbGVzZWN0PgorICAgICAgICAgICAgICAgIDx0aXRsZT5EZXBlbmRlbmNpZXM8L3RpdGxlPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFRoZSBSZWFjdGl2ZSBKZXJzZXkgQ2xpZW50IHdpdGggR3VhdmEgc3VwcG9ydCBpcyBhdmFpbGFibGUgYXMgYW4gZXh0ZW5zaW9uIG1vZHVsZSBpbiBKZXJzZXkuIEZvciBNYXZlbiB1c2VycywKKyAgICAgICAgICAgICAgICAgICAgc2ltcGx5IGFkZCB0aGUgZm9sbG93aW5nIGRlcGVuZGVuY3kgdG8geW91ciAmbGl0LnBvbS54bWw7OgorCisgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0ieG1sIiBsaW5lbnVtYmVyaW5nPSJ1bm51bWJlcmVkIj4mbHQ7ZGVwZW5kZW5jeSZndDsKKyAgICAmbHQ7Z3JvdXBJZCZndDtvcmcuZ2xhc3NmaXNoLmplcnNleS5leHQucngmbHQ7L2dyb3VwSWQmZ3Q7CisgICAgJmx0O2FydGlmYWN0SWQmZ3Q7amVyc2V5LXJ4LWNsaWVudC1ndWF2YSZsdDsvYXJ0aWZhY3RJZCZndDsKKyAgICAmbHQ7dmVyc2lvbiZndDsmdmVyc2lvbjsmbHQ7L3ZlcnNpb24mZ3Q7CismbHQ7L2RlcGVuZGVuY3kmZ3Q7PC9wcm9ncmFtbGlzdGluZz4KKworICAgICAgICAgICAgICAgICAgICBBZnRlciB0aGlzIHN0ZXAgeW91IGNhbiB1c2UgdGhlIGV4dGVuZGVkIGNsaWVudCByaWdodCBhd2F5LiBUaGUgZGVwZW5kZW5jeSB0cmFuc2l0aXZlbHkgYWRkcyB0aGUgZm9sbG93aW5nCisgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llcyB0byB5b3VyIGNsYXNzLXBhdGggYXMgd2VsbDogPGxpdGVyYWw+Y29tLmdvb2dsZS5ndWF2YTpndWF2YTwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgSWYgeW91J3JlIG5vdCB1c2luZyBNYXZlbiAob3Igb3RoZXIgZGVwZW5kZW5jeSBtYW5hZ2VtZW50IHRvb2wpIG1ha2Ugc3VyZSB0byBhZGQgYWxzbyBhbGwgdGhlIHRyYW5zaXRpdmUKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llcyBvZiB0aGlzIGV4dGVuc2lvbiBtb2R1bGUgKHNlZSAmamVyc2V5LmV4dC5yeC1jbGllbnQuZ3VhdmEuZGVwcy5saW5rOykgb24gdGhlIGNsYXNzLXBhdGguCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L25vdGU+CisgICAgICAgICAgICA8L3NpbXBsZXNlY3Q+CisgICAgICAgIDwvc2VjdGlvbj4KKworICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uIHhtbDppZD0icnguY2xpZW50LnNwaSI+CisgICAgICAgIDx0aXRsZT5JbXBsZW1lbnRpbmcgU3VwcG9ydCBmb3IgQ3VzdG9tIFJlYWN0aXZlIExpYnJhcmllcyAoU1BJKTwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBJbiBjYXNlIHlvdSB3YW50IHRvIGJyaW5nIHN1cHBvcnQgZm9yIHNvbWUgb3RoZXIgbGlicmFyeSBwcm92aWRpbmcgUmVhY3RpdmUgUHJvZ3JhbW1pbmcgTW9kZWwgaW50byB5b3VyIGFwcGxpY2F0aW9uCisgICAgICAgICAgICB5b3UgY2FuIGV4dGVuZCBmdW5jdGlvbmFsaXR5IG9mIFJlYWN0aXZlIEpBWC1SUyBDbGllbnQgYnkgaW1wbGVtZW50aW5nICZqYXhycy5jbGllbnQuUnhJbnZva2VyUHJvdmlkZXI7LCByZWdpc3RlcmluZworICAgICAgICAgICAgdGhhdCBpbXBsZW1lbnRhdGlvbiBpbnRvIHRoZSBjbGllbnQgcnVudGltZSBhbmQgdGhlbiB1c2luZyByeChDbGFzcyZsdDtUJmd0OykgaW4geW91ciBjb2RlLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHNpbXBsZXNlY3Q+CisgICAgICAgICAgICA8dGl0bGU+SW1wbGVtZW50IFJ4SW52b2tlciBhbmQgUnhJbnZva2VyUHJvdmlkZXIgaW50ZXJmYWNlczwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoZSBmaXJzdCBzdGVwIHdoZW4gaW1wbGVtZW50aW5nIHN1cHBvcnQgZm9yIGFub3RoZXIgcmVhY3RpdmUgbGlicmFyeSBpcyB0byBpbXBsZW1lbnQgJmpheHJzLmNsaWVudC5SeEludm9rZXI7LgorICAgICAgICAgICAgICAgIEpBWC1SUyBBUEkgaXRzZWxmIGNvbnRhaW5zIG9uZSBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggd2lsbCBiZSB1c2VkIGFzIGFuIGV4YW1wbGU6ICZqYXhycy5jbGllbnQuQ29tcGxldGlvblN0YWdlUnhJbnZva2VyOy4KKworICAgICAgICAgICAgICAgIDxleGFtcGxlIHhtbDppZD0icnguY2xpZW50LnJ4aW52b2tlciI+CisgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5FeHRlbmRpbmcgUnhJdm9rZXI8L3RpdGxlPgorCisgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPnB1YmxpYyBpbnRlcmZhY2UgQ29tcGxldGlvblN0YWdlUnhJbnZva2VyIGV4dGVuZHMgUnhJbnZva2VyJmx0O0NvbXBsZXRpb25TdGFnZSZndDsgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb21wbGV0aW9uU3RhZ2UmbHQ7UmVzcG9uc2UmZ3Q7IGdldCgpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljICZsdDtUJmd0OyBDb21wbGV0aW9uU3RhZ2UmbHQ7VCZndDsgZ2V0KENsYXNzJmx0O1QmZ3Q7IHJlc3BvbnNlVHlwZSk7CisKKyAgICAvLyAuLi4KK308L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoZSBpbXBvcnRhbnQgZmFjdCB0byBub3RpY2UgaXMgdGhhdCB0aGUgZ2VuZXJpYyBwYXJhbWV0ZXIgb2YgJmpheHJzLmNsaWVudC5SeEludm9rZXI7IGlzICZqZGs4LkNvbXBsZXRpb25TdGFnZTsKKyAgICAgICAgICAgICAgICBhbmQgYWxzbyB0aGF0IHRoZSByZXR1cm4gdHlwZSBpcyBvdmVycmlkZW4gdG8gYmUgYWx3YXlzICZqZGs4LkNvbXBsZXRpb25TdGFnZTsgd2l0aCBzb21lIGdlbmVyaWMgcGFyYW0gKCZqYXhycy5jb3JlLlJlc3BvbnNlOzsKKyAgICAgICAgICAgICAgICBvciBUKS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEFmdGVyIGhhdmluZyB0aGUgZXh0ZW5kZWQgUnhJbnZva2VyIGludGVyZmFjZSwgdGhlIGltcGxlbWVudG9yIGhhcyB0byBwcm92aWRlICZqYXhycy5jbGllbnQuUnhJbnZva2VyUHJvdmlkZXI7LAorICAgICAgICAgICAgICAgIHdoaWNoIHdpbGwgYmUgcmVnaXN0ZXJlZCBhcyBhbiBwcm92aWRlciB0byBhIGNsaWVudCBpbnN0YW5jZS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxleGFtcGxlIHhtbDppZD0icnguY2xpZW50LmV4dGVuZC5yeGludm9rZXIiPgorICAgICAgICAgICAgPHRpdGxlPkV4dGVuZGluZyBSeEludm9rZXJQcm92aWRlcjwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPnB1YmxpYyBzdGF0aWMgY2xhc3MgQ29tcGxldGlvblN0YWdlUnhJbnZva2VyUHJvdmlkZXIgaW1wbGVtZW50cyBSeEludm9rZXJQcm92aWRlciZsdDtDb21wbGV0aW9uU3RhZ2VSeEludm9rZXImZ3Q7IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Byb3ZpZGVyRm9yKENsYXNzJmx0Oz8lZ3Q7IGNsYXp6KSB7CisgICAgICAgIHJldHVybiBDb21wbGV0aW9uU3RhZ2UuY2xhc3MuZXF1YWxzKGNsYXp6KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29tcGxldGlvblN0YWdlUnhJbnZva2VyIGdldFJ4SW52b2tlcihTeW5jSW52b2tlciBzeW5jSW52b2tlciwgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yU2VydmljZSkgeworICAgICAgICByZXR1cm4gbmV3IENvbXBsZXRpb25TdGFnZVJ4SW52b2tlcigpIHsKKyAgICAgICAgICAgIC8vIC4uLgorICAgICAgICB9OworICAgIH0KK308L3Byb2dyYW1saXN0aW5nPjwvZXhhbXBsZT4KKyAgICAgICAgPC9zaW1wbGVzZWN0PgorICAgICAgICA8c2ltcGxlc2VjdD4KKyAgICAgICAgICAgIDx0aXRsZT5FeGFtcGxlIG9mIHVzaW5nIGN1c3RvbSBSeEludm9rZXJQcm92aWRlcjwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIENvbnNpZGVyaW5nIHRoZSB3b3JrIGFib3ZlIHdhcyBkb25lIGFuZCB0aGUgaW1wbGVtZW50YXRpb24gb2YgY3VzdG9tICZsaXQuamF4cnMuY2xpZW50LlJ4SW52b2tlcjsgYW5kCisgICAgICAgICAgICAgICAgJmxpdC5qYXhycy5jbGllbnQuUnhJbnZva2VyUHJvdmlkZXI7IGlzIGF2YWlsYWJsZSwgdGhlIGNsaWVudCBjb2RlIHVzaW5nIHRob3NlIGV4dGVuc2lvbnMgd2lsbCBiZToKKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPkNsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpOworLy8gcmVnaXN0ZXIgY3VzdG9tIFJ4SW52b2tlclByb3ZpZGVyCitjbGllbnQucmVnaXN0ZXIoQ29tcGxldGlvblN0YWdlUnhJbnZva2VyUHJvdmlkZXIuY2xhc3MpOworCitDb21wbGV0aW9uU3RhZ2UmbHQ7UmVzcG9uc2UmZ3Q7IHJlc3BvbnNlID0KKyAgICAgICAgY2xpZW50LnRhcmdldCgiaHR0cDovL2plcnNleS5qYXZhLm5ldCIpCisgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgLnJ4KENvbXBsZXRpb25TdGFnZVJ4SW52b2tlci5jbGFzcykKKyAgICAgICAgICAgICAgLy8gTm93IHdlIGhhdmUgYW4gaW5zdGFuY2Ugb2YgQ29tcGxldGlvblN0YWdlUnhJbnZva2VyIHJldHVybmVkIGZyb20gb3VyIHJlZ2lzdGVyZWQgUnhJbnZva2VyUHJvdmlkZXIsCisgICAgICAgICAgICAgIC8vIHdoaWNoIGlzIENvbXBsZXRpb25TdGFnZVJ4SW52b2tlclByb3ZpZGVyIGluIHRoaXMgcGFydGljdWxhciBzY2VuYXJpby4KKyAgICAgICAgICAgICAgLmdldCgpOzwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgICAgICAgPC9zaW1wbGVzZWN0PgorICAgIDwvc2VjdGlvbj4KKzwvY2hhcHRlcj4KZGlmZiAtLWdpdCBhL2RvY3Mvc3JjL21haW4vZG9jYm9vay9zZWN1cml0eS54bWwgYi9kb2NzL3NyYy9tYWluL2RvY2Jvb2svc2VjdXJpdHkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5MmZkY2IKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3NyYy9tYWluL2RvY2Jvb2svc2VjdXJpdHkueG1sCkBAIC0wLDAgKzEsODUwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8IURPQ1RZUEUgY2hhcHRlciBbPCFFTlRJVFkgJSBlbnRzIFNZU1RFTSAiamVyc2V5LmVudCIgPiAlZW50czsKKyAgICA8IUVOVElUWSBqZXJzZXkuZ2l0aHViLm9hdXRoMS50d2l0dGVyLmNsaWVudC5leGFtcGxlLmxpbmsgIjxsaW5rIHhsaW5rOmhyZWY9JyZqZXJzZXkuZ2l0aHViLmV4YW1wbGVzLnVyaTsvb2F1dGgtY2xpZW50LXR3aXR0ZXInPk9BdXRoIDEgVHdpdHRlciBDbGllbnQgRXhhbXBsZTwvbGluaz4iPgorICAgIDwhRU5USVRZIGplcnNleS5naXRodWIub2F1dGgyLmdvb2dsZS5jbGllbnQuZXhhbXBsZS5saW5rICI8bGluayB4bGluazpocmVmPScmamVyc2V5LmdpdGh1Yi5leGFtcGxlcy51cmk7L29hdXRoMi1jbGllbnQtZ29vZ2xlLXdlYmFwcCc+T0F1dGggMiBHb29nbGUgQ2xpZW50IFdlYiBBcHBsaWNhdGlvbiBFeGFtcGxlPC9saW5rPiI+CisgICAgPCFFTlRJVFkgb2F1dGgxLnNwZWMubGluayAiPGxpbmsgeGxpbms6aHJlZj0naHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNTg0OSc+T0F1dGggMS4wIHNwZWNpZmljYXRpb248L2xpbms+Ij4KKyAgICA8IUVOVElUWSBvYXV0aDIuc3BlYy5saW5rICI8bGluayB4bGluazpocmVmPSdodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2NzQ5Jz5PQXV0aCAyLjAgc3BlY2lmaWNhdGlvbjwvbGluaz4iPgorXT4KKzxjaGFwdGVyIHhtbG5zPSJodHRwOi8vZG9jYm9vay5vcmcvbnMvZG9jYm9vayIKKyAgICAgICAgIHZlcnNpb249IjUuMCIKKyAgICAgICAgIHhtbDpsYW5nPSJlbiIKKyAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKKyAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2RvY2Jvb2sub3JnL25zL2RvY2Jvb2sgaHR0cDovL2RvY2Jvb2sub3JnL3htbC81LjAveHNkL2RvY2Jvb2sueHNkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsgaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluay54c2QiCisgICAgICAgICB4bWw6aWQ9InNlY3VyaXR5Ij4KKyAgICA8dGl0bGU+U2VjdXJpdHk8L3RpdGxlPgorCisgICAgPHNlY3Rpb24+CisgICAgICAgIDx0aXRsZT5TZWN1cmluZyBzZXJ2ZXI8L3RpdGxlPgorICAgICAgICA8c2VjdGlvbj4KKyAgICAgICAgICAgIDx0aXRsZT5TZWN1cml0eUNvbnRleHQ8L3RpdGxlPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgU2VjdXJpdHkgaW5mb3JtYXRpb24gb2YgYSByZXF1ZXN0IGlzIGF2YWlsYWJsZSBieSBpbmplY3RpbmcgYSBKQVgtUlMgJmpheHJzLmNvcmUuU2VjdXJpdHlDb250ZXh0OyBpbnN0YW5jZQorICAgICAgICAgICAgICAgIHVzaW5nICZqYXhycy5jb3JlLkNvbnRleHQ7CisgICAgICAgICAgICAgICAgYW5ub3RhdGlvbi4gVGhlIGluamVjdGVkIHNlY3VyaXR5IGNvbnRleHQgaW5zdGFuY2UgcHJvdmlkZXMgdGhlIGVxdWl2YWxlbnQgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgYXZhaWxhYmxlIG9uCisgICAgICAgICAgICAgICAgJmplZTYuc2VydmxldC5IdHRwU2VydmxldFJlcXVlc3Q7IEFQSS4KKyAgICAgICAgICAgICAgICBUaGUgaW5qZWN0ZWQgc2VjdXJpdHkgY29udGV4dCBkZXBlbmRzIG9uIHRoZSBhY3R1YWwgSmVyc2V5IGFwcGxpY2F0aW9uIGRlcGxveW1lbnQuIEZvciBleGFtcGxlLCBmb3IgYQorICAgICAgICAgICAgICAgIEplcnNleSBhcHBsaWNhdGlvbiBkZXBsb3llZCBpbiBhIFNlcnZsZXQgY29udGFpbmVyLCB0aGUgSmVyc2V5ICZsaXQuamF4cnMuY29yZS5TZWN1cml0eUNvbnRleHQ7IHdpbGwKKyAgICAgICAgICAgICAgICBlbmNhcHN1bGF0ZSBpbmZvcm1hdGlvbiBmcm9tIGEgc2VjdXJpdHkgY29udGV4dCByZXRyaWV2ZWQgZnJvbSB0aGUgU2VydmxldCByZXF1ZXN0LgorICAgICAgICAgICAgICAgIEluIGNhc2Ugb2YgYSBKZXJzZXkgYXBwbGljYXRpb24gZGVwbG95ZWQgb24gYSBHcml6emx5IHNlcnZlciwKKyAgICAgICAgICAgICAgICB0aGUgJmxpdC5qYXhycy5jb3JlLlNlY3VyaXR5Q29udGV4dDsgd2lsbCByZXR1cm4gaW5mb3JtYXRpb24gcmV0cmlldmVkIGZyb20gdGhlIEdyaXp6bHkgcmVxdWVzdC4KKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgJmxpdC5qYXhycy5jb3JlLlNlY3VyaXR5Q29udGV4dDsgY2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBzdWItcmVzb3VyY2UgbG9jYXRvcnMgdG8gcmV0dXJuIGRpZmZlcmVudAorICAgICAgICAgICAgICAgIHJlc291cmNlcyBiYXNlZCBvbiB0aGUgc3BlY2lmaWMgcm9sZXMgYSB1c2VyIHByaW5jaXBhbCBpcyBpbmNsdWRlZCBpbi4gRm9yIGV4YW1wbGUsIGEgc3ViLXJlc291cmNlIGxvY2F0b3IgY291bGQKKyAgICAgICAgICAgICAgICByZXR1cm4gYSBkaWZmZXJlbnQgcmVzb3VyY2UgaWYgYSB1c2VyIGlzIGEgcHJlZmVycmVkIGN1c3RvbWVyOgorCisgICAgICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5Vc2luZyAmbGl0LmpheHJzLmNvcmUuU2VjdXJpdHlDb250ZXh0OyBmb3IgYSBSZXNvdXJjZSBTZWxlY3Rpb248L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj48IVtDREFUQVtAUGF0aCgiYmFza2V0IikKK3B1YmxpYyBTaG9wcGluZ0Jhc2tldFJlc291cmNlIGdldChAQ29udGV4dCBTZWN1cml0eUNvbnRleHQgc2MpIHsKKyAgICBpZiAoc2MuaXNVc2VySW5Sb2xlKCJQcmVmZXJyZWRDdXN0b21lciIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQcmVmZXJyZWRDdXN0b21lclNob3BwaW5nQmFza2V0UmVzb3VyY2UoKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbmV3IFNob3BwaW5nQmFza2V0UmVzb3VyY2UoKTsKKyAgICB9Cit9XV0+PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICZsaXQuamF4cnMuY29yZS5TZWN1cml0eUNvbnRleHQ7IGlzIGluaGVyZW50bHkgcmVxdWVzdC1zY29wZWQsIHlldCBjYW4gYmUgYWxzbyBpbmplY3RlZCBpbnRvIGZpZWxkcyBvZiBzaW5nbGV0b24KKyAgICAgICAgICAgICAgICByZXNvdXJjZXMgYW5kIEpBWC1SUyBwcm92aWRlcnMuIEluIHN1Y2ggY2FzZSB0aGUgcHJveHkgb2YgdGhlIHJlcXVlc3Qtc2NvcGVkICZsaXQuamF4cnMuY29yZS5TZWN1cml0eUNvbnRleHQ7CisgICAgICAgICAgICAgICAgd2lsbCBiZSBpbmplY3RlZC4KKworICAgICAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgICAgICA8dGl0bGU+SW5qZWN0aW5nICZsaXQuamF4cnMuY29yZS5TZWN1cml0eUNvbnRleHQ7IGludG8gYSBzaW5nbGV0b24gcmVzb3VyY2U8L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj48IVtDREFUQVtAUGF0aCgicmVzb3VyY2UiKQorQFNpbmdsZXRvbgorcHVibGljIHN0YXRpYyBjbGFzcyBNeVJlc291cmNlIHsKKyAgICAvLyBKZXJzZXkgd2lsbCBpbmplY3QgcHJveHkgb2YgU2VjdXJpdHkgQ29udGV4dAorICAgIEBDb250ZXh0CisgICAgU2VjdXJpdHlDb250ZXh0IHNlY3VyaXR5Q29udGV4dDsKKworICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJQcmluY2lwYWwoKSB7CisgICAgICAgIHJldHVybiBzZWN1cml0eUNvbnRleHQuZ2V0VXNlclByaW5jaXBhbCgpLmdldE5hbWUoKTsKKyAgICB9Cit9XV0+PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgIDxzZWN0aW9uPgorICAgICAgICAgICAgICAgIDx0aXRsZT5Jbml0aWFsaXppbmcgU2VjdXJpdHkgQ29udGV4dCB3aXRoIFNlcnZsZXRzPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgQXMgZGVzY3JpYmVkIGFib3ZlLCB0aGUgJmxpdC5qYXhycy5jb3JlLlNlY3VyaXR5Q29udGV4dDsgYnkgZGVmYXVsdCAoaWYgbm90IG92ZXJ3cml0dGVuIGJ5CisgICAgICAgICAgICAgICAgICAgIGEgcmVxdWVzdCBmaWx0ZXIpIG9ubHkgZXhwb3NlcyBzZWN1cml0eSBpbmZvcm1hdGlvbiBmcm9tIHRoZSB1bmRlcmx5aW5nIGNvbnRhaW5lci4KKyAgICAgICAgICAgICAgICAgICAgSW4gdGhlIGNhc2UgeW91IGRlcGxveSBhIEplcnNleSBhcHBsaWNhdGlvbiBpbiBhIFNlcnZsZXQgY29udGFpbmVyLCB5b3UgbmVlZCB0byBjb25maWd1cmUgdGhlCisgICAgICAgICAgICAgICAgICAgIFNlcnZsZXQgY29udGFpbmVyIHNlY3VyaXR5IGFzcGVjdHMgKDxsaXRlcmFsPiZsdDtzZWN1cml0eS1jb25zdHJhaW50Jmd0OzwvbGl0ZXJhbD4sCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPiZsdDthdXRoLWNvbnN0cmFpbnQmZ3Q7PC9saXRlcmFsPiBhbmQgdXNlciB0byByb2xlcyBtYXBwaW5ncykKKyAgICAgICAgICAgICAgICAgICAgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBzZWN1cmUgcmVxdWVzdHMgdmlhIGNhbGxzIHRvIHRvIHRoZSBKQVgtUlMgJmxpdC5qYXhycy5jb3JlLlNlY3VyaXR5Q29udGV4dDsuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgICAgICA8c2VjdGlvbj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+VXNpbmcgU2VjdXJpdHkgQ29udGV4dCBpbiBDb250YWluZXIgUmVxdWVzdCBGaWx0ZXJzPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgVGhlICZsaXQuamF4cnMuY29yZS5TZWN1cml0eUNvbnRleHQ7IGNhbiBiZSBkaXJlY3RseSByZXRyaWV2ZWQgZnJvbSAmamF4cnMuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7IHZpYQorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5nZXRTZWN1cml0eUNvbnRleHQoKTwvbGl0ZXJhbD4gbWV0aG9kLiBZb3UgY2FuIGFsc28gcmVwbGFjZSB0aGUgZGVmYXVsdAorICAgICAgICAgICAgICAgICAgICAmbGl0LmpheHJzLmNvcmUuU2VjdXJpdHlDb250ZXh0OyBpbiBhIHJlcXVlc3QgY29udGV4dCB3aXRoIGEgY3VzdG9tIG9uZSB1c2luZyB0aGUKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+c2V0U2VjdXJpdHlDb250ZXh0KFNlY3VyaXR5Q29udGV4dCk8L2xpdGVyYWw+IG1ldGhvZC4gSWYgeW91IHNldCBhIGN1c3RvbQorICAgICAgICAgICAgICAgICAgICAmbGl0LmpheHJzLmNvcmUuU2VjdXJpdHlDb250ZXh0OyBpbnN0YW5jZSBpbiB5b3VyICZqYXhycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjssCisgICAgICAgICAgICAgICAgICAgIHRoaXMgc2VjdXJpdHkgY29udGV4dCBpbnN0YW5jZSB3aWxsIGJlIHVzZWQgZm9yIGluamVjdGlvbiBpbnRvIEpBWC1SUyByZXNvdXJjZSBjbGFzcyBmaWVsZHMuCisgICAgICAgICAgICAgICAgICAgIFRoaXMgd2F5IHlvdSBjYW4gaW1wbGVtZW50IGEgY3VzdG9tIGF1dGhlbnRpY2F0aW9uIGZpbHRlciB0aGF0IG1heSBzZXR1cCB5b3VyIG93bgorICAgICAgICAgICAgICAgICAgICAmbGl0LmpheHJzLmNvcmUuU2VjdXJpdHlDb250ZXh0OyB0byBiZSB1c2VkLiBUbyBlbnN1cmUgdGhlIGVhcmx5IGV4ZWN1dGlvbiBvZiB5b3VyIGN1c3RvbQorICAgICAgICAgICAgICAgICAgICBhdXRoZW50aWNhdGlvbiByZXF1ZXN0IGZpbHRlciwgc2V0IHRoZSBmaWx0ZXIgcHJpb3JpdHkgdG8gPGxpdGVyYWw+QVVUSEVOVElDQVRJT048L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgIHVzaW5nIGNvbnN0YW50cyBmcm9tICZqYXhycy5Qcmlvcml0aWVzOy4gQW4gZWFybHkgZXhlY3V0aW9uIG9mIHlvdSBhdXRoZW50aWNhdGlvbiBmaWx0ZXIgd2lsbCBlbnN1cmUgdGhhdAorICAgICAgICAgICAgICAgICAgICBhbGwgb3RoZXIgZmlsdGVycywgcmVzb3VyY2VzLCByZXNvdXJjZSBtZXRob2RzIGFuZCBzdWItcmVzb3VyY2UgbG9jYXRvcnMgd2lsbCBleGVjdXRlIHdpdGggeW91ciBjdXN0b20KKyAgICAgICAgICAgICAgICAgICAgJmxpdC5qYXhycy5jb3JlLlNlY3VyaXR5Q29udGV4dDsgaW5zdGFuY2UuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICA8dGl0bGU+QXV0aG9yaXphdGlvbiAtIHNlY3VyaW5nIHJlc291cmNlczwvdGl0bGU+CisgICAgICAgICAgICA8c2VjdGlvbj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+U2VjdXJpdHkgcmVzb3VyY2VzIHdpdGggPGxpdGVyYWw+d2ViLnhtbDwvbGl0ZXJhbD48L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBJbiBjYXNlcyB3aGVyZSBhIEplcnNleSBhcHBsaWNhdGlvbiBpcyBkZXBsb3llZCBpbiBhIFNlcnZsZXQgY29udGFpbmVyIHlvdSBjYW4gcmVseSBvbmx5IG9uCisgICAgICAgICAgICAgICAgICAgIHRoZSBzdGFuZGFyZCBKYXZhIEVFIFdlYiBhcHBsaWNhdGlvbiBzZWN1cml0eSBtZWNoYW5pc21zIG9mZmVyZWQgYnkgdGhlIFNlcnZsZXQgY29udGFpbmVyIGFuZAorICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGUgdmlhIGFwcGxpY2F0aW9uJ3MgPGxpdGVyYWw+d2ViLnhtbDwvbGl0ZXJhbD4gZGVzY3JpcHRvci4KKyAgICAgICAgICAgICAgICAgICAgWW91IG5lZWQgdG8gZGVmaW5lIHRoZSA8bGl0ZXJhbD4mbHQ7c2VjdXJpdHktY29uc3RyYWludCZndDs8L2xpdGVyYWw+IGVsZW1lbnRzIGluIHRoZQorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD53ZWIueG1sPC9saXRlcmFsPiBhbmQgYXNzaWduIHJvbGVzIHdoaWNoIGFyZSBhYmxlIHRvIGFjY2VzcyB0aGVzZSByZXNvdXJjZXMuIFlvdSBjYW4gYWxzbworICAgICAgICAgICAgICAgICAgICBkZWZpbmUgSFRUUCBtZXRob2RzIHRoYXQgYXJlIGFsbG93ZWQgdG8gYmUgZXhlY3V0ZWQuIFNlZSB0aGUgZm9sbG93aW5nIGV4YW1wbGUuCisKKyAgICAgICAgICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGl0bGU+U2VjdXJpbmcgcmVzb3VyY2VzIHVzaW5nIDxsaXRlcmFsPndlYi54bWw8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJ4bWwiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj48IVtDREFUQVs8c2VjdXJpdHktY29uc3RyYWludD4KKyAgICA8d2ViLXJlc291cmNlLWNvbGxlY3Rpb24+CisgICAgICAgIDx1cmwtcGF0dGVybj4vcmVzdC9hZG1pbi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgorICAgIDxhdXRoLWNvbnN0cmFpbnQ+CisgICAgICAgIDxyb2xlLW5hbWU+YWRtaW48L3JvbGUtbmFtZT4KKyAgICA8L2F1dGgtY29uc3RyYWludD4KKzwvc2VjdXJpdHktY29uc3RyYWludD4KKzxzZWN1cml0eS1jb25zdHJhaW50PgorICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9yZXN0L29yZGVycy8qPC91cmwtcGF0dGVybj4KKyAgICA8L3dlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgorICAgIDxhdXRoLWNvbnN0cmFpbnQ+CisgICAgICAgIDxyb2xlLW5hbWU+Y3VzdG9tZXI8L3JvbGUtbmFtZT4KKyAgICA8L2F1dGgtY29uc3RyYWludD4KKzwvc2VjdXJpdHktY29uc3RyYWludD4KKzxsb2dpbi1jb25maWc+CisgICAgPGF1dGgtbWV0aG9kPkJBU0lDPC9hdXRoLW1ldGhvZD4KKyAgICA8cmVhbG0tbmFtZT5teS1kZWZhdWx0LXJlYWxtPC9yZWFsbS1uYW1lPgorPC9sb2dpbi1jb25maWc+XV0+PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorCisgICAgICAgICAgICAgICAgICAgIFRoZSBleGFtcGxlIHNlY3VyZXMgdHdvIGtpbmRzIG9mIFVSSSBuYW1lc3BhY2VzIHVzaW5nIHRoZSBIVFRQIEJhc2ljIEF1dGhlbnRpY2F0aW9uLgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5yZXN0L2FkbWluLyo8L2xpdGVyYWw+IHdpbGwgYmUgYWNjZXNzaWJsZSBvbmx5IGZvciB1c2VyIGdyb3VwICJhZG1pbiIgYW5kCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPnJlc3Qvb3JkZXJzLyo8L2xpdGVyYWw+IHdpbGwgYmUgYWNjZXNzaWJsZSBmb3IgImN1c3RvbWVyIiB1c2VyIGdyb3VwLiBUaGlzIHNlY3VyaXR5IGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgZG9lcyBub3QgdXNlIEpBWC1SUyBvciBKZXJzZXkgZmVhdHVyZXMgYXQgYWxsIGFzIGl0IGlzIGVuZm9yY2VkIGJ5IHRoZSBTZXJ2bGV0IGNvbnRhaW5lciBldmVuIGJlZm9yZQorICAgICAgICAgICAgICAgICAgICBhIHJlcXVlc3QgcmVhY2hlcyB0aGUgSmVyc2V5IGFwcGxpY2F0aW9uLiBLZWVwaW5nIHRoZXNlIHNlY3VyaXR5IGNvbnN0cmFpbnMgdXAgdG8gZGF0ZSB3aXRoIHlvdXIKKyAgICAgICAgICAgICAgICAgICAgSkFYLVJTIGFwcGxpY2F0aW9uIG1pZ2h0IG5vdCBiZSBlYXN5IGFzIHdoZW5ldmVyIHlvdSBjaGFuZ2UgdGhlICZqYXhycy5QYXRoOyBhbm5vdGF0aW9ucyBvbiB5b3VyIHJlc291cmNlCisgICAgICAgICAgICAgICAgICAgIGNsYXNzZXMgeW91IG1heSBuZWVkIHRvIHVwZGF0ZSBhbHNvIHRoZSA8bGl0ZXJhbD53ZWIueG1sPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICBzZWN1cml0eSBjb25maWd1cmF0aW9ucyB0byByZWZsZWN0IHRoZSBjaGFuZ2VkIEpBWC1SUyByZXNvdXJjZSBwYXRocy4gVGhlcmVmb3JlIEplcnNleSBvZmZlcnMgYQorICAgICAgICAgICAgICAgICAgICA8bGluayBsaW5rZW5kPSJhbm5vdGF0aW9uLWJhc2VkLXNlY3VyaXR5Ij5tb3JlIGZsZXhpYmxlIHNvbHV0aW9uPC9saW5rPgorICAgICAgICAgICAgICAgICAgICBiYXNlZCBvbiBwbGFjaW5nIHN0YW5kYXJkIEphdmEgRUUgc2VjdXJpdHkgYW5ub3RhdGlvbnMgZGlyZWN0bHkgb24gSkFYLVJTIHJlc291cmNlIGNsYXNzZXMgYW5kIG1ldGhvZHMuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgICAgICA8c2VjdGlvbiB4bWw6aWQ9ImFubm90YXRpb24tYmFzZWQtc2VjdXJpdHkiPgorICAgICAgICAgICAgICAgIDx0aXRsZT5TZWN1cmluZyBKQVgtUlMgcmVzb3VyY2VzIHdpdGggc3RhbmRhcmQgPGxpdGVyYWw+amF2YXguYW5ub3RhdGlvbi5zZWN1cml0eTwvbGl0ZXJhbD4gYW5ub3RhdGlvbnM8L3RpdGxlPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFdpdGggSmVyc2V5IHlvdSBjYW4gZGVmaW5lIHRoZSBhY2Nlc3MgdG8gcmVzb3VyY2VzIGJhc2VkIG9uIHRoZSB1c2VyIGdyb3VwIHVzaW5nIGFubm90YXRpb25zLiBZb3UKKyAgICAgICAgICAgICAgICAgICAgY2FuLCBmb3IgZXhhbXBsZSwgZGVmaW5lIHRoYXQgb25seSBhIHVzZXIgZ3JvdXAgImFkbWluIiBjYW4gZXhlY3V0ZSBzcGVjaWZpYyByZXNvdXJjZSBtZXRob2QuIFRvIGRvIHRoYXQgeW91CisgICAgICAgICAgICAgICAgICAgIGZpcnN0bHkgbmVlZCB0byByZWdpc3RlciAmamVyc2V5LnNlcnZlci5Sb2xlc0FsbG93ZWREeW5hbWljRmVhdHVyZTsgYXMgYSBwcm92aWRlci4gVGhlIGZvbGxvd2luZyBleGFtcGxlCisgICAgICAgICAgICAgICAgICAgIHNob3dzIGhvdyB0byByZWdpc3RlciB0aGUgZmVhdHVyZSBpZiB5b3VyIGRlcGxveW1lbnQgaXMgYmFzZWQgb24gYSAmamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsuCisKKyAgICAgICAgICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGl0bGU+UmVnaXN0ZXJpbmcgUm9sZXNBbGxvd2VkRHluYW1pY0ZlYXR1cmUgdXNpbmcgUmVzb3VyY2VDb25maWc8L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+ZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoTXlSZXNvdXJjZS5jbGFzcyk7CityZXNvdXJjZUNvbmZpZy5yZWdpc3RlcihSb2xlc0FsbG93ZWREeW5hbWljRmVhdHVyZS5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisKKyAgICAgICAgICAgICAgICAgICAgQWx0ZXJuYXRpdmVseSwgdHlwaWNhbGx5IHdoZW4gZGVwbG95aW5nIHlvdXIgYXBwbGljYXRpb24gdG8gYSBTZXJ2bGV0IGNvbnRhaW5lciwgeW91IGNhbiBpbXBsZW1lbnQgeW91ciBKQVgtUlMKKyAgICAgICAgICAgICAgICAgICAgJmpheHJzLmNvcmUuQXBwbGljYXRpb247IHN1YmNsYXNzIGJ5IGV4dGVuZGluZyBmcm9tIHRoZSBKZXJzZXkgJmxpdC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOyBhbmQKKyAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJpbmcgdGhlICZsaXQuamVyc2V5LnNlcnZlci5Sb2xlc0FsbG93ZWREeW5hbWljRmVhdHVyZTsgaW4gdGhlIGNvbnN0cnVjdG9yOgorCisgICAgICAgICAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRpdGxlPlJlZ2lzdGVyaW5nIFJvbGVzQWxsb3dlZER5bmFtaWNGZWF0dXJlIGJ5IGV4dGVuZGluZyBSZXNvdXJjZUNvbmZpZzwvdGl0bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5wdWJsaWMgY2xhc3MgTXlBcHBsaWNhdGlvbiBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKyAgICBwdWJsaWMgTXlBcHBsaWNhdGlvbigpIHsKKyAgICAgICAgc3VwZXIoTXlSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJlZ2lzdGVyKFJvbGVzQWxsb3dlZER5bmFtaWNGZWF0dXJlLmNsYXNzKTsKKyAgICB9Cit9PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgT25jZSB0aGUgZmVhdHVyZSBpcyByZWdpc3RlcmVkLCB5b3UgY2FuIHVzZSBhbm5vdGF0aW9ucyBmcm9tIHBhY2thZ2UKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+amF2YXguYW5ub3RhdGlvbi5zZWN1cml0eTwvbGl0ZXJhbD4gZGVmaW5lZCBieSBKU1ItMjUwLiBTZWUgdGhlIGZvbGxvd2luZyBleGFtcGxlLgorCisgICAgICAgICAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRpdGxlPkFwcGx5aW5nIDxsaXRlcmFsPmphdmF4LmFubm90YXRpb24uc2VjdXJpdHk8L2xpdGVyYWw+IHRvIEpBWC1SUyByZXNvdXJjZSBtZXRob2RzLjwvdGl0bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj48IVtDREFUQVtAUGF0aCgiLyIpCitAUGVybWl0QWxsCitwdWJsaWMgY2xhc3MgUmVzb3VyY2UgeworICAgIEBSb2xlc0FsbG93ZWQoInVzZXIiKQorICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsgcmV0dXJuICJHRVQiOyB9CisKKyAgICBAUm9sZXNBbGxvd2VkKCJhZG1pbiIpCisgICAgQFBPU1QKKyAgICBwdWJsaWMgU3RyaW5nIHBvc3QoU3RyaW5nIGNvbnRlbnQpIHsgcmV0dXJuIGNvbnRlbnQ7IH0KKworICAgIEBQYXRoKCJzdWIiKQorICAgIHB1YmxpYyBTdWJSZXNvdXJjZSBnZXRTdWJSZXNvdXJjZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdWJSZXNvdXJjZSgpOworICAgIH0KK31dXT48L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisKKyAgICAgICAgICAgICAgICAgICAgVGhlIHJlc291cmNlIGNsYXNzIDxsaXRlcmFsPlJlc291cmNlPC9saXRlcmFsPiBkZWZpbmVkIGluIHRoZSBleGFtcGxlIGlzIGFubm90YXRlZCB3aXRoIGEKKyAgICAgICAgICAgICAgICAgICAgJmplZTYuYW5ub3RhdGlvbnMuUGVybWl0QWxsOyBhbm5vdGF0aW9uLiBUaGlzIG1lYW5zIHRoYXQgYWxsIG1ldGhvZHMgaW4gdGhlIGNsYXNzIHdoaWNoIGRvIG5vdAorICAgICAgICAgICAgICAgICAgICBvdmVycmlkZSB0aGlzCisgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb24gd2lsbCBiZSBwZXJtaXR0ZWQgZm9yIGFsbCB1c2VyIGdyb3VwcyAobm8gcmVzdHJpY3Rpb25zIGFyZSBkZWZpbmVkKS4gSW4gb3VyIGV4YW1wbGUsIHRoZQorICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uIHdpbGwgb25seSBhcHBseSB0byB0aGUgPGxpdGVyYWw+Z2V0U3ViUmVzb3VyY2UoKTwvbGl0ZXJhbD4gbWV0aG9kIGFzIGl0IGlzIHRoZSBvbmx5IG1ldGhvZAorICAgICAgICAgICAgICAgICAgICB0aGF0IGRvZXMgbm90IG92ZXJyaWRlIHRoZSBhbm5vdGF0aW9uIGJ5IGRlZmluaW5nIGN1c3RvbSByb2xlLWJhc2VkIHNlY3VyaXR5IHNldHRpbmdzIHVzaW5nIHRoZQorICAgICAgICAgICAgICAgICAgICAmamVlNi5hbm5vdGF0aW9ucy5Sb2xlc0FsbG93ZWQ7IGFubm90YXRpb24uCisgICAgICAgICAgICAgICAgICAgICZsaXQuamVlNi5hbm5vdGF0aW9ucy5Sb2xlc0FsbG93ZWQ7IGFubm90YXRpb25zIHByZXNlbnQgb24gdGhlIG90aGVyIG1ldGhvZHMgZGVmaW5lIGEgcm9sZSBvciBhIHNldCBvZgorICAgICAgICAgICAgICAgICAgICByb2xlcyB0aGF0IGFyZSBhbGxvd2VkIHRvIGV4ZWN1dGUgYSBwYXJ0aWN1bGFyIG1ldGhvZC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFRoZXNlIEphdmEgRUUgc2VjdXJpdHkgYW5ub3RhdGlvbnMgYXJlIHByb2Nlc3NlZCBpbnRlcm5hbGx5IGluIHRoZSByZXF1ZXN0IGZpbHRlciByZWdpc3RlcmVkIHVzaW5nCisgICAgICAgICAgICAgICAgICAgIHRoZSBKZXJzZXkgJmxpdC5qZXJzZXkuc2VydmVyLlJvbGVzQWxsb3dlZER5bmFtaWNGZWF0dXJlOy4gVGhlIHJvbGVzIGRlZmluZWQgaW4gdGhlIGFubm90YXRpb25zIGFyZQorICAgICAgICAgICAgICAgICAgICB0ZXN0ZWQgYWdhaW5zdCBjdXJyZW50IHJvbGVzIHNldCBpbiB0aGUgJmxpdC5qYXhycy5jb3JlLlNlY3VyaXR5Q29udGV4dDsgdXNpbmcKKyAgICAgICAgICAgICAgICAgICAgdGhlICZsaXQuamF4cnMuY29yZS5TZWN1cml0eUNvbnRleHQ7PGxpdGVyYWw+LmlzVXNlckluUm9sZShTdHJpbmcgcm9sZSk8L2xpdGVyYWw+IG1ldGhvZC4gSW4gY2FzZSB0aGUgY2FsbGVyCisgICAgICAgICAgICAgICAgICAgIGlzIG5vdCBpbiB0aGUgcm9sZSBzcGVjaWZpZWQgYnkgdGhlIGFubm90YXRpb24sIHRoZSBIVFRQIDxsaXRlcmFsPjQwMyAoRm9yYmlkZGVuKTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgZXJyb3IgcmVzcG9uc2UgaXMgcmV0dXJuZWQuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24+CisgICAgICAgIDx0aXRsZT5DbGllbnQgU2VjdXJpdHk8L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEZvciBkZXRhaWxzIGFib3V0IGNsaWVudCBzZWN1cml0eSBwbGVhc2Ugc2VlIHRoZSA8bGluayBsaW5rZW5kPSJjbGllbnQiPkNsaWVudCBjaGFwdGVyPC9saW5rPi4gSmVyc2V5CisgICAgICAgICAgICBjbGllbnQgYWxsb3dzIHRvIGRlZmluZSBwYXJhbWV0ZXJzIG9mIFNTTCBjb21tdW5pY2F0aW9uIHVzaW5nIDxsaXRlcmFsPkhUVFBTPC9saXRlcmFsPiBwcm90b2NvbC4KKyAgICAgICAgICAgIFlvdSBjYW4gYWxzbyB1c2UgamVyc2V5IGJ1aWx0LWluIGF1dGhlbnRpY2F0aW9uIGZpbHRlcnMgd2hpY2ggcGVyZm9ybSA8ZW1waGFzaXM+SFRUUCBCYXNpYyBBdXRoZW50aWNhdGlvbjwvZW1waGFzaXM+CisgICAgICAgICAgICBvciA8ZW1waGFzaXM+SFRUUCBEaWdlc3QgQXV0aGVudGljYXRpb248L2VtcGhhc2lzPi4gU2VlIHRoZSBjbGllbnQgY2hhcHRlciBmb3IgbW9yZSBkZXRhaWxzLgorICAgICAgICA8L3BhcmE+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24+CisgICAgICAgIDx0aXRsZT5PQXV0aCBTdXBwb3J0PC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBPQXV0aCBpcyBhIHNwZWNpZmljYXRpb24gdGhhdCBkZWZpbmVzIHNlY3VyZSBhdXRoZW50aWNhdGlvbiBtb2RlbCBvbiBiZWhhbGYgb2YgYW5vdGhlciB1c2VyLgorICAgICAgICAgICAgVHdvIHZlcnNpb25zIG9mIE9BdXRoIGV4aXN0cyBhdCB0aGUgbW9tZW50IC0gPGVtcGhhc2lzPk9BdXRoIDE8L2VtcGhhc2lzPiBkZWZpbmVkIGJ5ICZvYXV0aDEuc3BlYy5saW5rOyBhbmQKKyAgICAgICAgICAgIDxlbXBoYXNpcz5PQXV0aCAyPC9lbXBoYXNpcz4gZGVmaW5lZCBieSAmb2F1dGgyLnNwZWMubGluazsuCisgICAgICAgICAgICBPQXV0aCAyIGlzIHRoZSBsYXRlc3QgdmVyc2lvbiBhbmQgaXQgaXMgbm90IGJhY2t3YXJkIGNvbXBhdGlibGUgd2l0aAorICAgICAgICAgICAgT0F1dGggMSBzcGVjaWZpY2F0aW9uLiBPQXV0aCBpbiBnZW5lcmFsIGlzIHdpZGVseSB1c2VkIGluIHBvcHVsYXIgc29jaWFsIFdlYiBzaXRlcyBpbiBvcmRlciB0byBncmFudCBhY2Nlc3MKKyAgICAgICAgICAgIHRvIGEgdXNlciBhY2NvdW50IGFuZCBhc3NvY2lhdGVkIHJlc291cmNlcyBmb3IgYSB0aGlyZCBwYXJ0eSBjb25zdW1lciAoYXBwbGljYXRpb24pLiBUaGUgY29uc3VtZXIgdGhlbiB1c3VhbGx5CisgICAgICAgICAgICB1c2VzIFJFU1RmdWwgV2ViIFNlcnZpY2VzIHRvIGFjY2VzcyB0aGUgdXNlciBkYXRhLgorICAgICAgICAgICAgVGhlIGZvbGxvd2luZyBleGFtcGxlIGRlc2NyaWJlcyBhIHVzZSBjYXNlIG9mIHRoZSBPQXV0aCAoc2ltaWxhciBmb3IgT0F1dGggMSBhbmQgT0F1dGggMikuIFRoZSBleGFtcGxlIGlzIHNpbXBsZQorICAgICAgICAgICAgYW5kIHByb2JhYmx5IG9idmlvdXMgZm9yIG1hbnkgZGV2ZWxvcGVycyBidXQgaW50cm9kdWNlcyB0ZXJtcyB0aGF0IGFyZSB1c2VkIGluIHRoaXMKKyAgICAgICAgICAgIGRvY3VtZW50YXRpb24gYXMgd2VsbCBhcyBpbiBKZXJzZXkgT0F1dGggQVBJIGRvY3VtZW50YXRpb24uCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaHJlZSBwYXJ0aWVzIGFjdCBpbiBhbiBPQXV0aCBzY2VuYXJpby4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8bWVkaWFvYmplY3Q+CisgICAgICAgICAgICA8aW1hZ2VvYmplY3Q+CisgICAgICAgICAgICAgICAgPGltYWdlZGF0YSBmaWxlcmVmPSJpbWFnZXMvb2F1dGgtcGFydGllcy5wbmciIGZvcm1hdD0iUE5HIiB3aWR0aD0iODAlIiBzY2FsZWZpdD0iMSIgYWxpZ249ImNlbnRlciIvPgorICAgICAgICAgICAgPC9pbWFnZW9iamVjdD4KKyAgICAgICAgPC9tZWRpYW9iamVjdD4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZSBmaXJzdCBwYXJ0eSByZXByZXNlbnRzIGEgdXNlciwgaW4gb3VyIGNhc2UgQWRhbSwKKyAgICAgICAgICAgIHdobyBpcyBjYWxsZWQgaW4gdGhlIE9BdXRoIHRlcm1pbm9sb2d5IGEgPGVtcGhhc2lzPlJlc291cmNlIE93bmVyPC9lbXBoYXNpcz4uIEFkYW0gaGFzIGFuIGFjY291bnQgb24KKyAgICAgICAgICAgIFR3aXR0ZXIuIFR3aXR0ZXIgcmVwcmVzZW50cyB0aGUgc2Vjb25kIHBhcnR5LiBUaGlzIHBhcnR5IGlzIGNhbGxlZCBhCisgICAgICAgICAgICA8ZW1waGFzaXM+U2VydmljZSBQcm92aWRlcjwvZW1waGFzaXM+LiBUd2l0dGVyIG9mZmVycyBhIHdlYiBpbnRlcmZhY2UKKyAgICAgICAgICAgIHRoYXQgQWRhbSB1c2VzIHRvIGNyZWF0ZSBuZXcgdHdlZXRzLCByZWFkIHR3ZWV0cyBvZiBvdGhlcnMgZXRjLiBOb3csIEFkYW0gdXNlcyBvdXIgbmV3IHdlYiBzaXRlLAorICAgICAgICAgICAgSGVsbG9Xb3JsZFdlYiwgd2hpY2ggaXMgYSB2ZXJ5IHNpbXBsZSB3ZWIgc2l0ZSB0aGF0IHNheXMgPGxpdGVyYWw+SGVsbG8gV29ybGQ8L2xpdGVyYWw+IGJ1dCBpdCBhZGRpdGlvbmFsbHkKKyAgICAgICAgICAgIGRpc3BsYXlzIHRoZSBsYXN0IHR3ZWV0IG9mIHRoZSBsb2dnZWQgaW4gdXNlci4KKyAgICAgICAgICAgIFRvIGRvIHNvLCBvdXIgd2ViIHNpdGUgbmVlZHMgdG8gaGF2ZSBhY2Nlc3MgdG8gdGhlIFR3aXR0ZXIgYWNjb3VudCBvZiBBZGFtLiBPdXIgd2ViIHNpdGUgaXMgYSAzcmQgcGFydHkKKyAgICAgICAgICAgIGFwcGxpY2F0aW9uIHRoYXQgd2FudHMgdG8gY29ubmVjdCB0byBUd2l0dGVyIGFuZCBnZXQgQWRhbSdzIHR3ZWV0cy4gSW4gT0F1dGgsIHN1Y2ggcGFydHkgaXMgY2FsbGVkCisgICAgICAgICAgICA8ZW1waGFzaXM+Q29uc3VtZXI8L2VtcGhhc2lzPi4KKyAgICAgICAgICAgIE91ciBDb25zdW1lciB3b3VsZCBsaWtlIHRvIHVzZSBUd2l0dGVyJ3MgUkVTVGZ1bCBBUElzIHRvIGdldCBzb21lIGRhdGEgYXNzb2NpYXRlZCB3aXRoIEFkYW0ncyBUd2l0dGVyIGFjY291bnQuCisgICAgICAgICAgICBJbiBvcmRlciB0byBzb2x2ZSB0aGlzIHNpdHVhdGlvbiBBZGFtIGNvdWxkIGRpcmVjdGx5IGdpdmUgaGlzIFR3aXR0ZXIgcGFzc3dvcmQgdG8gdGhlIEhlbGxvV29ybGRXZWIuCisgICAgICAgICAgICBUaGlzIHdvdWxkIGhvd2V2ZXIgYmUgcmF0aGVyIHVuc2FmZSwgZXNwZWNpYWxseSBpZiB3ZSBkbyBub3Qga25vdyBtdWNoIGFib3V0IHRoZSBhdXRob3JzIG9mIHRoZSBhcHBsaWNhdGlvbi4KKyAgICAgICAgICAgIElmIEFkYW0gd291bGQgZ2l2ZSBoaXMgcGFzc3dvcmQgdG8gSGVsbG9Xb3JsZFdlYiwgaGUgd291bGQgaGF2ZSB0byBkZWFsIHdpdGggdGhlIGFzc29jaWF0ZWQgc2VjdXJpdHkgcmlza3MuCisgICAgICAgICAgICBGaXJzdCBvZiBhbGwsIEFkYW0gd291bGQgaGF2ZSB0byBmdWxseSB0cnVzdCBIZWxsb1dvcmxkV2ViCisgICAgICAgICAgICB0aGF0IGl0IHdpbGwgbm90IG1pc3VzZSB0aGUgZnVsbCBhY2Nlc3MgdG8gaGlzIFR3aXR0ZXIgYWNjb3VudC4gTmV4dCwgaWYgQWRhbSB3b3VsZCBjaGFuZ2UgaGlzIHBhc3N3b3JkLAorICAgICAgICAgICAgaGUgd291bGQgbmVlZCB0byByZW1lbWJlciB0byBnaXZlIHRoZSBuZXcgcGFzc3dvcmQgYWxzbyB0byB0aGUgSGVsbG9Xb3JsZFdlYiBhcHBsaWNhdGlvbi4KKyAgICAgICAgICAgIEFuZCBhdCBsYXN0LCBpZiBBZGFtIHdvdWxkIGxpa2UgdG8gcmV2b2tlIHRoZSBIZWxsb1dvcmxkV2ViJ3MgYWNjZXNzIHRvIGhpcyBUd2l0dGVyIGFjY291bnQsCisgICAgICAgICAgICBoZSB3b3VsZCBuZWVkIHRvIGNoYW5nZSBoaXMgcGFzc3dvcmQgYWdhaW4uIFRoZSBPQXV0aCBwcm90b2NvbCBoYXMgYmVlbiBkZXZpc2VkIHRvIGFkZHJlc3MgYWxsIHRoZXNlIGNoYWxsZW5nZXMuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFdpdGggT0F1dGgsIGEgcmVzb3VyY2Ugb3duZXIgKEFkYW0pIGdyYW50cyBhbiBhY2Nlc3MgdG8gYSBjb25zdW1lciAoSGVsbG9Xb3JsZFdlYikgd2l0aG91dCBnaXZpbmcgaXQKKyAgICAgICAgICAgIGhpcyBwYXNzd29yZC4gVGhpcyBhY2Nlc3MgZ3JhbnQgaXMgYWNoaWV2ZWQgYnkgYSBwcm9jZWR1cmUgY2FsbGVkCisgICAgICAgICAgICA8ZW1waGFzaXM+YXV0aG9yaXphdGlvbiBmbG93PC9lbXBoYXNpcz4uIEF1dGhvcml6YXRpb24gZmxvdyBpcyBvdXQgb2YgdGhlIHNjb3BlIG9mIHRoaXMKKyAgICAgICAgICAgIGRvY3VtZW50YXRpb24gYW5kIGl0cyBkZXNjcmlwdGlvbiBjYW4gYmUgZm91bmQgaW4gdGhlIE9BdXRoIHNwZWNpZmljYXRpb24gbGlua2VkIGFib3ZlLgorICAgICAgICAgICAgVGhlIHJlc3VsdCBvZiB0aGUgYXV0aG9yaXphdGlvbiBmbG93IGlzIGFuIDxlbXBoYXNpcz5BY2Nlc3MgVG9rZW48L2VtcGhhc2lzPiB3aGljaCBpcyBsYXRlcgorICAgICAgICAgICAgdXNlZCBieSB0aGUgY29uc3VtZXIgdG8gYXV0aGVudGljYXRlIGFnYWluc3QgdGhlIHNlcnZpY2UgcHJvdmlkZXIuCisgICAgICAgICAgICBXaGlsZSB0aGlzIGJyaWVmIGRlc2NyaXB0aW9uIGFwcGxpZXMgdG8gYm90aCBPQXV0aCAxIGFuZCAyLCBub3RlIHRoYXQgdGhlcmUgYXJlIHNvbWUgZGlmZmVyZW5jZXMgaW4gZGV0YWlscworICAgICAgICAgICAgYmV0d2VlbiB0aGVzZSB0d28gc3BlY2lmaWNhdGlvbnMuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEplcnNleSBPQXV0aCBpcyBjdXJyZW50bHkgc3VwcG9ydGVkIGZvciB0aGUgZm9sbG93aW5nIHVzZSBjYXNlcyBhbmQgT0F1dGggdmVyc2lvbnM6CisKKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIE9BdXRoIDE6IENsaWVudCAoY29uc3VtZXIpIGFuZCBzZXJ2ZXIgKHNlcnZpY2UgcHJvdmlkZXIpCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICBPQXV0aCAyOiBDbGllbnQgKGNvbnN1bWVyKQorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorCisgICAgICAgICAgICBXaXRoIGNsaWVudCBhbmQgc2VydmVyIHN1cHBvcnQgdGhlcmUgYXJlIHR3byBzdXBwb3J0ZWQgc2NlbmFyaW9zOgorCisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uIGZsb3cKKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIEF1dGhlbnRpY2F0aW9uIHdpdGggQWNjZXNzIFRva2VuIChzdXBwb3J0IGZvciBhdXRoZW50aWNhdGVkIHJlcXVlc3RzKQorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICA8dGl0bGU+T0F1dGggMTwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBPQXV0aCAxIHByb3RvY29sIGlzIGJhc2VkIG9uIG1lc3NhZ2Ugc2lnbmF0dXJlcyB0aGF0IGFyZSBjYWxjdWxhdGVkIHVzaW5nIHNwZWNpZmljCisgICAgICAgICAgICAgICAgc2lnbmF0dXJlIG1ldGhvZHMuIFNpZ25hdHVyZXMgYXJlIHF1aXRlIGNvbXBsZXggYW5kIHRoZXJlZm9yZSBhcmUgaW1wbGVtZW50ZWQgaW4gYSBzZXBhcmF0ZQorICAgICAgICAgICAgICAgIG1vZHVsZS4gVGhlIE9BdXRoIDEgSmVyc2V5IG1vZHVsZXMgYXJlICg8bGl0ZXJhbD5ncm91cElkOmFydGlmYWN0SWQ6ZGVzY3JpcHRpb248L2xpdGVyYWw+KToKKyAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZWN1cml0eTpvYXV0aDEtY2xpZW50PC9saXRlcmFsPjogcHJvdmlkZXMgY2xpZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0F1dGggMSBzdXBwb3J0IGZvciBhdXRob3JpemF0aW9uIGZsb3cgYW5kIGF1dGhlbnRpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlY3VyaXR5Om9hdXRoMS1zZXJ2ZXI8L2xpdGVyYWw+OiBwcm92aWRlcyBzZXJ2ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQXV0aCAxIHN1cHBvcnQgZm9yIGF1dGhvcml6YXRpb24gZmxvdywgU1BJIGZvciB0b2tlbiBtYW5hZ2VtZW50IGluY2x1ZGluZyBhdXRoZW50aWNhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlci4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VjdXJpdHk6b2F1dGgxLXNpZ25hdHVyZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHByb3ZpZGVzIHN1cHBvcnQgZm9yIE9BdXRoMSByZXF1ZXN0IHNpZ25hdHVyZXMuIFRoaXMgbW9kdWxlIGlzIGEgZGVwZW5kZW5jeSBvZiBwcmV2aW91cyB0d28KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVzIGFuZCBhcyBzdWNoIGl0IHdpbGwgYmUgaW1wbGljaXRseSBpbmNsdWRlZCBpbiB5b3VyIG1hdmVuIHByb2plY3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG1vZHVsZSBjYW4gYmUgdXNlZCBhcyBhIHN0YW5kYWxvbmUgbW9kdWxlIGJ1dCB0aGlzIHdpbGwgbm90IGJlIG5lZWRlZCBpbiBtb3N0IG9mIHRoZSB1c2UgY2FzZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgWW91IHdvdWxkIGRvIHRoYXQgaWYgeW91IHdhbnRlZCB0byBpbXBsZW1lbnQgeW91ciBvd24gT0F1dGggc3VwcG9ydCBhbmQgd291bGQgbm90IHdhbnQgdG8gZGVhbCB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50aW5nIHRoZSBjb21wbGV4IHNpZ25hdHVyZSBhbGdvcml0aG1zLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8c2VjdGlvbj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+U2VydmVyPC90aXRsZT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUbyBhZGQgc3VwcG9ydCBmb3IgT0F1dGggaW50byB5b3VyIHNlcnZlci1zaWRlIGFwcGxpY2F0aW9uLCBhZGQgdGhlIGZvbGxvd2luZyBkZXBlbmRlbmN5IHRvIHlvdXI8bGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgcG9tLnhtbDwvbGl0ZXJhbD46CisgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0ieG1sIj4mbHQ7ZGVwZW5kZW5jeSZndDsKKyAgICAmbHQ7Z3JvdXBJZCZndDtvcmcuZ2xhc3NmaXNoLmplcnNleS5zZWN1cml0eSZsdDsvZ3JvdXBJZCZndDsKKyAgICAmbHQ7YXJ0aWZhY3RJZCZndDtvYXV0aDEtc2VydmVyJmx0Oy9hcnRpZmFjdElkJmd0OworICAgICZsdDt2ZXJzaW9uJmd0OyZ2ZXJzaW9uOyZsdDsvdmVyc2lvbiZndDsKKyZsdDsvZGVwZW5kZW5jeSZndDs8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgICAgICBBZ2FpbiwgdGhlcmUgaXMgbm8gbmVlZCB0byBhZGQgYSBkaXJlY3QgZGVwZW5kZW5jeSB0byB0aGUgc2lnbmF0dXJlIG1vZHVsZSwgaXQgd2lsbCBiZSB0cmFuc2l0aXZlbHkgaW5jbHVkZWQuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBMZXQncyBub3cgYnJpZWZseSBnbyBvdmVyIHRoZSBtb3N0IGltcG9ydGFudCBzZXJ2ZXIgSmVyc2V5IE9BdXRoIEFQSXMgYW5kIFNQSXM6CisgICAgICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+JmplcnNleS5zZXJ2ZXIub2F1dGgxLk9BdXRoMVNlcnZlckZlYXR1cmU7OiBUaGUgZmVhdHVyZSB3aGljaCBlbmFibGVzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPQXV0aCAxIHN1cHBvcnQgb24gdGhlIHNlcnZlciBhbmQgcmVnaXN0ZXJzICZsaXQuamVyc2V5LnNlcnZlci5vYXV0aDEuT0F1dGgxUHJvdmlkZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGxhaW5lZCBpbiB0aGUgZm9sbG93aW5nIHBvaW50LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZqZXJzZXkuc2VydmVyLm9hdXRoMS5PQXV0aDFQcm92aWRlcjs6IEltcGxlbWVudGF0aW9uIG9mIHRoaXMgU1BJIG11c3QgYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJlZCB0byB0aGUgc2VydmVyIHJ1bnRpbWUgYXMgYSBzdGFuZGFyZCBwcm92aWRlci4gVGhlIGltcGxlbWVudGF0aW9uIHdpbGwgYmUgdXNlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBjcmVhdGUgcmVxdWVzdCBhbmQgYWNjZXNzIHRva2VuLCBnZXQgY29uc3VtZXIgYnkgY29uc3VtZXIga2V5LCBldGMuIFlvdSBjYW4gZWl0aGVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudCB5b3VyIHByb3ZpZGVyIG9yIHVzZSB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBwcm92aWRlZCBieSBKZXJzZXkgYnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmplcnNleS5zZXJ2ZXIub2F1dGgxLkRlZmF1bHRPQXV0aDFQcm92aWRlcjsuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmplcnNleS5zZXJ2ZXIub2F1dGgxLk9BdXRoMVNlcnZlclByb3BlcnRpZXM7OiBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIHVzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gY29uZmlndXJlIHRoZSBPQXV0aCAxIHN1cHBvcnQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmplcnNleS5zZXJ2ZXIub2F1dGgxLk9BdXRoMUNvbnN1bWVyOywgJmplcnNleS5zZXJ2ZXIub2F1dGgxLk9BdXRoMVRva2VuOzogY2xhc3NlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGNvbnRhaW4gY29uc3VtZXIga2V5LCByZXF1ZXN0IGFuZCBhY2Nlc3MgdG9rZW5zLiBZb3UgbmVlZCB0bworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnQgdGhlbSBvbmx5IGlmIHlvdSBhbHNvIGltcGxlbWVudCB0aGUgaW50ZXJmYWNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsaXQuamVyc2V5LnNlcnZlci5vYXV0aDEuT0F1dGgxUHJvdmlkZXI7LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBGaXJzdCBzdGVwIGluIGVuYWJsaW5nIEplcnNleSBPQXV0aCAxIHN1cHBvcnQgaXMgdG8gcmVnaXN0ZXIgYQorICAgICAgICAgICAgICAgICAgICAmbGl0LmplcnNleS5zZXJ2ZXIub2F1dGgxLk9BdXRoMVNlcnZlckZlYXR1cmU7IGluc3RhbmNlCisgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVkIHdpdGggYW4gaW5zdGFuY2Ugb2YgJmxpdC5qZXJzZXkuc2VydmVyLm9hdXRoMS5PQXV0aDFQcm92aWRlcjsuIEFkZGl0aW9uYWxseSwgeW91IG1heQorICAgICAgICAgICAgICAgICAgICBjb25maWd1cmUgdGhlIDxlbXBoYXNpcz5SZXF1ZXN0IFRva2VuIFVSSTwvZW1waGFzaXM+IGFuZCA8ZW1waGFzaXM+QWNjZXNzIFRva2VuIFVSSTwvZW1waGFzaXM+IC0KKyAgICAgICAgICAgICAgICAgICAgdGhlIGVuZHBvaW50cyBhY2Nlc3NpYmxlIG9uIHRoZSBPQXV0aCBzZXJ2ZXIgdGhhdCBpc3N1ZSBSZXF1ZXN0IGFuZCBBY2Nlc3MgVG9rZW5zLiBUaGVzZSBlbmRwb2ludHMKKyAgICAgICAgICAgICAgICAgICAgYXJlIGRlZmluZWQgaW4gdGhlIE9BdXRoIDEgc3BlY2lmaWNhdGlvbiBhbmQgYXJlIGNvbnRhY3RlZCBhcyBwYXJ0IG9mIHRoZSBPQXV0aCBhdXRob3JpemF0aW9uIGZsb3cuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBOZXh0LCB3aGVuIGEgY2xpZW50IGluaXRpYXRlcyB0aGUgT0F1dGggYXV0aG9yaXphdGlvbiBmbG93LCB0aGUgcHJvdmlkZWQgaW1wbGVtZW50YXRpb24gb2YKKyAgICAgICAgICAgICAgICAgICAgJmxpdC5qZXJzZXkuc2VydmVyLm9hdXRoMS5PQXV0aDFQcm92aWRlcjsgd2lsbCBiZSBpbnZva2VkIGFzIHRvIGNyZWF0ZSBuZXcgdG9rZW5zLAorICAgICAgICAgICAgICAgICAgICBnZXQgdG9rZW5zIGFuZCBmaW5hbGx5IHRvIHN0b3JlIHRoZSBpc3N1ZWQgQWNjZXNzIFRva2VuLiBJZiBhIGNvbnN1bWVyIGFscmVhZHkgaGFzIGEgdmFsaWQgQWNjZXNzIFRva2VuCisgICAgICAgICAgICAgICAgICAgIGFuZCBtYWtlcyBBdXRoZW50aWNhdGVkIFJlcXVlc3RzICh3aXRoIE9BdXRoIDEgQXV0aG9yaXphdGlvbiBpbmZvcm1hdGlvbiBpbiB0aGUgSFRUUCBoZWFkZXIpLAorICAgICAgICAgICAgICAgICAgICB0aGUgcHJvdmlkZXIgd2lsbCBiZSBpbnZva2VkIHRvIHByb3ZpZGUgdGhlICZsaXQuamVyc2V5LnNlcnZlci5vYXV0aDEuT0F1dGgxVG9rZW47IGZvciB0aGUKKyAgICAgICAgICAgICAgICAgICAgQWNjZXNzIFRva2VuIGluZm9ybWF0aW9uIGluIHRoZSBoZWFkZXIuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgICAgICA8c2VjdGlvbiB4bWw6aWQ9Im9hdXRoMS1jbGllbnQiPgorICAgICAgICAgICAgICAgIDx0aXRsZT5DbGllbnQ8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIE9BdXRoIGNsaWVudCBzdXBwb3J0IGluIEplcnNleSBpcyBhbG1vc3QgaWRlbnRpY2FsIGZvciBPQXV0aCAxIGFuZCBPQXV0aCAyLiBBcyBzdWNoLCB0aGlzIGNoYXB0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVzIHVzZWZ1bCBpbmZvcm1hdGlvbiBldmVuIGZvciB1c2VycyB0aGF0IHVzZSBPQXV0aCAyIGNsaWVudCBzdXBwb3J0LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9ub3RlPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUbyBhZGQgc3VwcG9ydCBmb3IgT0F1dGggaW50byB5b3VyIEplcnNleSBjbGllbnQgYXBwbGljYXRpb24sIGFkZCB0aGUgZm9sbG93aW5nIGRlcGVuZGVuY3kgdG8geW91cgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5wb20ueG1sPC9saXRlcmFsPjoKKworICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9InhtbCI+Jmx0O2RlcGVuZGVuY3kmZ3Q7CisgICAgJmx0O2dyb3VwSWQmZ3Q7b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VjdXJpdHkmbHQ7L2dyb3VwSWQmZ3Q7CisgICAgJmx0O2FydGlmYWN0SWQmZ3Q7b2F1dGgxLWNsaWVudCZsdDsvYXJ0aWZhY3RJZCZndDsKKyAgICAmbHQ7dmVyc2lvbiZndDsmdmVyc2lvbjsmbHQ7L3ZlcnNpb24mZ3Q7CismbHQ7L2RlcGVuZGVuY3kmZ3Q7PC9wcm9ncmFtbGlzdGluZz4KKworICAgICAgICAgICAgICAgICAgICBBcyBtZW50aW9uZWQgZWFybGllciwgdGhlcmUgaXMgbm8gbmVlZCB0byBhZGQgYSBkaXJlY3QgZGVwZW5kZW5jeSB0byB0aGUgc2lnbmF0dXJlIG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgaXQgd2lsbCBiZSB0cmFuc2l0aXZlbHkgaW5jbHVkZWQuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIE9BdXRoIDEgY2xpZW50IHN1cHBvcnQgaW5pdGlhbGx5IHN0YXJ0ZWQgYXMgYSBjb2RlIG1pZ3JhdGlvbiBmcm9tIEplcnNleSAxLnguCisgICAgICAgICAgICAgICAgICAgIER1cmluZyB0aGUgbWlncmF0aW9uIGhvd2V2ZXIgdGhlIEFQSSBvZiB3YXMgc2lnbmlmaWNhbnRseSByZXZpc2VkLgorICAgICAgICAgICAgICAgICAgICBUaGUgaGlnaCBsZXZlbCBkaWZmZXJlbmNlIGNvbXBhcmVkIHRvIEplcnNleSAxLnggT0F1dGggY2xpZW50IEFQSSBpcyB0aGF0IHRoZSBhdXRob3JpemF0aW9uIGZsb3cKKyAgICAgICAgICAgICAgICAgICAgaXMgbm8gbG9uZ2VyIHBhcnQgb2YgYSBjbGllbnQgT0F1dGggZmlsdGVyLiBBdXRob3JpemF0aW9uIGZsb3cgaXMgbm93IGEgc3RhbmRhbG9uZSB1dGlsaXR5CisgICAgICAgICAgICAgICAgICAgIGFuZCBjYW4gYmUgdXNlZCB3aXRob3V0IGEgc3VwcG9ydCBmb3Igc3Vic2VxdWVudCBhdXRoZW50aWNhdGVkIHJlcXVlc3RzLgorICAgICAgICAgICAgICAgICAgICBUaGUgc3VwcG9ydCBmb3IgYXV0aGVudGljYXRlZCByZXF1ZXN0cyBzdGF5cyBpbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgJmxpdC5qYXhycy5jbGllbnQuQ2xpZW50UmVxdWVzdEZpbHRlcjsgYnV0IGlzIG5vdCBwYXJ0IG9mIGEgcHVibGljIEFQSQorICAgICAgICAgICAgICAgICAgICBhbnltb3JlIGFuZCBpcyByZWdpc3RlcmVkIGJ5IGEgSmVyc2V5IE9BdXRoICZqYXhycy5jb3JlLkZlYXR1cmU7LgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUaGUgbW9zdCBpbXBvcnRhbnQgcGFydHMgb2YgdGhlIEplcnNleSBjbGllbnQgT0F1dGggQVBJIGFuZCBTUEkgYXJlIGV4cGxhaW5lZCBoZXJlOgorCisgICAgICAgICAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZqZXJzZXkuY2xpZW50Lm9hdXRoMS5PQXV0aDFDbGllbnRTdXBwb3J0OzogVGhlIG1haW4gY2xhc3Mgd2hpY2ggY29udGFpbnMgYnVpbGRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RzIHRvIGJ1aWxkIGZlYXR1cmVzIHRoYXQgZW5hYmxlIHRoZSBPQXV0aCAxIHN1cHBvcnQuIFN0YXJ0IHdpdGggdGhpcyBjbGFzcyBldmVyeSB0aW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlvdSBuZWVkIHRvIGFkZCBhbnkgT0F1dGggMSBzdXBwb3J0IHRvIHRoZSBKZXJzZXkgQ2xpZW50IChidWlsZCBhbiBBdXRob3JpemF0aW9uIGZsb3cKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3IgaW5pdGlhbGl6ZSBjbGllbnQgdG8gcGVyZm9ybSBhdXRoZW50aWNhdGVkIHJlcXVlc3RzKS4gVGhlIGNsYXNzIGNvbnRhaW5zIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljIG1ldGhvZCB0aGF0IHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgJmplcnNleS5jbGllbnQub2F1dGgxLk9BdXRoMUJ1aWxkZXI7IGFuZCBhbHNvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBjbGFzcyBkZWZpbmVzIHJlcXVlc3QgcHJvcGVydGllcyB0byBpbmZsdWVuY2UgYmVoYXZpb3VyIG9mIHRoZSBhdXRoZW50aWNhdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3Qgc3VwcG9ydC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZqZXJzZXkuY2xpZW50Lm9hdXRoMS5PQXV0aDFBdXRob3JpemF0aW9uRmxvdzs6IEFQSSB0aGF0IGFsbG93cyB0byBwZXJmb3JtIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uIGZsb3cgYWdhaW5zdCBzZXJ2aWNlIHByb3ZpZGVyLiBJbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVyZmFjZSBpcyBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzIHRoYXQgaXMgdXNlZCBhcyBhIHN0YW5kYWxvbmUgdXRpbGl0eSBhbmQgaXMgbm90IHBhcnQgb2YgdGhlIEpBWC1SUyBjbGllbnQuIEluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyIHdvcmRzLCB0aGlzIGlzIG5vdCBhIGZlYXR1cmUgdGhhdCBzaG91bGQgYmUgcmVnaXN0ZXJlZCBpbnRvIHRoZSBjbGllbnQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKworICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmamVyc2V5LmNsaWVudC5vYXV0aDEuQWNjZXNzVG9rZW47LCAmamVyc2V5LmNsaWVudC5vYXV0aDEuQ29uc3VtZXJDcmVkZW50aWFsczs6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVyZmFjZXMgdGhhdCBkZWZpbmUgQWNjZXNzIFRva2VuIGNsYXNzZXMgYW5kIENvbnN1bWVyIENyZWRlbnRpYWxzLiBJbnRlcmZhY2VzIGNvbnRhaW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0dGVycyBmb3IgcHVibGljIGtleXMgYW5kIHNlY3JldCBrZXlzIG9mIHRva2VuIGFuZCBjcmVkZW50aWFscy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKworICAgICAgICAgICAgICAgICAgICBBbiBleGFtcGxlIG9mIGhvdyBKZXJzZXkgT0F1dGggMSBjbGllbnQgQVBJIGlzIHVzZWQgY2FuIGJlIGZvdW5kIGluCisgICAgICAgICAgICAgICAgICAgIHRoZSAmamVyc2V5LmdpdGh1Yi5vYXV0aDEudHdpdHRlci5jbGllbnQuZXhhbXBsZS5saW5rOy4gVGhlIGZvbGxvd2luZyBjb2RlIHNuaXBwZXRzIGFyZSBleHRyYWN0ZWQgZnJvbSB0aGUKKyAgICAgICAgICAgICAgICAgICAgZXhhbXBsZSBhbmQgZXhwbGFpbiBob3cgdG8gdXNlIHRoZSBKZXJzZXkgT0F1dGggY2xpZW50IEFQSS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEJlZm9yZSB3ZSBzdGFydCB3aXRoIGFueSBpbnRlcmFjdGlvbiB3aXRoIFR3aXR0ZXIsIHdlIG5lZWQgdG8gcmVnaXN0ZXIgb3VyIGFwcGxpY2F0aW9uCisgICAgICAgICAgICAgICAgICAgIG9uIFR3aXR0ZXIuIFNlZSB0aGUgZXhhbXBsZSA8bGl0ZXJhbD5SRUFETUUuVFhUPC9saXRlcmFsPiBmaWxlIGZvciB0aGUgaW5zdHJ1Y3Rpb25zLgorICAgICAgICAgICAgICAgICAgICBBcyBhIHJlc3VsdCBvZiB0aGUgcmVnaXN0cmF0aW9uLCB3ZSBnZXQgdGhlIGNvbnN1bWVyIGNyZWRlbnRpYWxzIHRoYXQgaWRlbnRpZnkgb3VyIGFwcGxpY2F0aW9uLgorICAgICAgICAgICAgICAgICAgICBDb25zdW1lciBjcmVkZW50aWFscyBjb25zaXN0IG9mIDxsaXRlcmFsPmNvbnN1bWVyIGtleTwvbGl0ZXJhbD4gYW5kIDxsaXRlcmFsPmNvbnN1bWVyIHNlY3JldDwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBBcyBhIGZpcnN0IHN0ZXAgaW4gb3VyIGNvZGUsIHdlIG5lZWQgdG8gcGVyZm9ybSB0aGUgYXV0aG9yaXphdGlvbiBmbG93LCB3aGVyZSB0aGUgdXNlciBncmFudHMgdXMgYW4gYWNjZXNzIHRvCisgICAgICAgICAgICAgICAgICAgIGhpcy9oZXIgVHdpdHRlciBjbGllbnQuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5CdWlsZCB0aGUgYXV0aG9yaXphdGlvbiBmbG93IHV0aWxpdHk8L3RpdGxlPgorCisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj48IVtDREFUQVtDb25zdW1lckNyZWRlbnRpYWxzIGNvbnN1bWVyQ3JlZGVudGlhbHMgPSBuZXcgQ29uc3VtZXJDcmVkZW50aWFscygKKyAgICAgICAgICAgICAgICAiYTg0NmQ4NGU2ODQyMWIzMjFhMzJkLCAiZjEzYWVkODQxOTBiYyIpOworT0F1dGgxQXV0aG9yaXphdGlvbkZsb3cgYXV0aEZsb3cgPSBPQXV0aDFDbGllbnRTdXBwb3J0LmJ1aWxkZXIoY29uc3VtZXJDcmVkZW50aWFscykKKyAgICAuYXV0aG9yaXphdGlvbkZsb3coCisgICAgICAgICJodHRwOi8vYXBpLnR3aXR0ZXIuY29tL29hdXRoL3JlcXVlc3RfdG9rZW4iLAorICAgICAgICAiaHR0cDovL2FwaS50d2l0dGVyLmNvbS9vYXV0aC9hY2Nlc3NfdG9rZW4iLAorICAgICAgICAiaHR0cDovL2FwaS50d2l0dGVyLmNvbS9vYXV0aC9hdXRob3JpemUiKQorICAgIC5idWlsZCgpO11dPjwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEhlcmUgd2UgaGF2ZSBidWlsdCBhICZsaXQuamVyc2V5LmNsaWVudC5vYXV0aDEuT0F1dGgxQXV0aG9yaXphdGlvbkZsb3c7IHV0aWxpdHkgY29tcG9uZW50IHJlcHJlc2VudGluZyB0aGUKKyAgICAgICAgICAgICAgICAgICAgT0F1dGggMSBhdXRob3JpemF0aW9uIGZsb3csIHVzaW5nICZsaXQuamVyc2V5LmNsaWVudC5vYXV0aDEuT0F1dGgxQ2xpZW50U3VwcG9ydDsgYW5kCisgICAgICAgICAgICAgICAgICAgICZsaXQuamVyc2V5LmNsaWVudC5vYXV0aDEuT0F1dGgxQnVpbGRlcjsgQVBJLiBUaGUgc3RhdGljIDxsaXRlcmFsPmJ1aWxkZXI8L2xpdGVyYWw+IG1ldGhvZCBhY2NlcHRzCisgICAgICAgICAgICAgICAgICAgIG1hbmRhdG9yeSBwYXJhbWV0ZXIgd2l0aCAmbGl0LmplcnNleS5jbGllbnQub2F1dGgxLkNvbnN1bWVyQ3JlZGVudGlhbHM7LiBUaGVzZQorICAgICAgICAgICAgICAgICAgICBhcmUgY3JlZGVudGlhbHMgZWFybGllciBpc3N1ZWQgYnkgVHdpdHRlciBmb3Igb3VyIGFwcGxpY2F0aW9uLgorICAgICAgICAgICAgICAgICAgICBXZSBoYXZlIHNwZWNpZmllZCB0aGUgVHdpdHRlciBPQXV0aCBlbmRwb2ludHMgd2hlcmUgUmVxdWVzdCBUb2tlbiwgQWNjZXNzIFRva2VuIHdpbGwgYmUgcmV0cmlldmVkIGFuZAorICAgICAgICAgICAgICAgICAgICBBdXRob3JpemF0aW9uIFVSSSB0byB3aGljaCB3ZSB3aWxsIHJlZGlyZWN0IHRoZSB1c2VyIGluIG9yZGVyIHRvIGdyYW50IHVzZXIncyBjb25zZW50LgorICAgICAgICAgICAgICAgICAgICBUd2l0dGVyIHdpbGwgcHJlc2VudCBhbiBIVE1MIHBhZ2Ugb24gdGhpcyBVUkkgYW5kIGl0IHdpbGwgYXNrIHRoZSB1c2VyIHdoZXRoZXIgaGUvc2hlIHdvdWxkIGxpa2UgdXMKKyAgICAgICAgICAgICAgICAgICAgdG8gYWNjZXNzIGhpcy9oZXIgYWNjb3VudC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIE5vdyB3ZSBjYW4gcHJvY2VlZCB3aXRoIHRoZSBPQXV0aCBhdXRob3JpemF0aW9uIGZsb3cuCisKKyAgICAgICAgICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGl0bGU+UGVyZm9ybSB0aGUgT0F1dGggQXV0aG9yaXphdGlvbiBGbG93PC90aXRsZT4KKworICAgICAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+PCFbQ0RBVEFbU3RyaW5nIGF1dGhvcml6YXRpb25VcmkgPSBhdXRoRmxvdy5zdGFydCgpOworLy8gaGVyZSB3ZSBtdXN0IGRpcmVjdCB0aGUgdXNlciB0byBhdXRob3JpemF0aW9uIHVyaSB0byBhcHByb3ZlCisvLyBvdXIgYXBwbGljYXRpb24uIFRoZSByZXN1bHQgd2lsbCBiZSB2ZXJpZmllciBjb2RlIChTdHJpbmcpLgorQWNjZXNzVG9rZW4gYWNjZXNzVG9rZW4gPSBhdXRoRmxvdy5maW5pc2godmVyaWZpZXIpO11dPjwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKworICAgICAgICAgICAgICAgICAgICBJbiB0aGUgZmlyc3QgbGluZSwgd2Ugc3RhcnQgdGhlIGF1dGhvcml6YXRpb24gZmxvdy4gVGhlIG1ldGhvZCBpbnRlcm5hbGx5IG1ha2VzIGEgcmVxdWVzdCB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+aHR0cDovL2FwaS50d2l0dGVyLmNvbS9vYXV0aC9yZXF1ZXN0X3Rva2VuPC9saXRlcmFsPiBVUkwKKyAgICAgICAgICAgICAgICAgICAgYW5kIHJldHJpZXZlcyBhIFJlcXVlc3QgVG9rZW4uIERldGFpbHMgb2YgdGhpcyByZXF1ZXN0IGNhbiBiZSBmb3VuZCBpbiB0aGUgT0F1dGggMSBzcGVjaWZpY2F0aW9uLgorICAgICAgICAgICAgICAgICAgICBJdCB0aGVuIGNvbnN0cnVjdHMgYSBVUkkgdG8gd2hpY2ggd2UgbXVzdCByZWRpcmVjdCB0aGUgdXNlci4gVGhlIFVSSSBpcyBiYXNlZCBvbiBUd2l0dGVyJ3MKKyAgICAgICAgICAgICAgICAgICAgYXV0aG9yaXphdGlvbiBVUkkgKDxsaXRlcmFsPmh0dHA6Ly9hcGkudHdpdHRlci5jb20vb2F1dGgvYXV0aG9yaXplPC9saXRlcmFsPikgYW5kIGNvbnRhaW5zCisgICAgICAgICAgICAgICAgICAgIGEgUmVxdWVzdCBUb2tlbiBhcyBhIHF1ZXJ5IHBhcmFtZXRlci4gSW4gdGhlIFR3aXR0ZXIgZXhhbXBsZSwgd2UgaGF2ZSBhIHNpbXBsZSBjb25zb2xlIGFwcGxpY2F0aW9uIHRoZXJlZm9yZQorICAgICAgICAgICAgICAgICAgICB3ZSBwcmludCB0aGUgVVJMIHRvIHRoZSBjb25zb2xlIGFuZCBhc2sgdGhlIHVzZXIgdG8gb3BlbiB0aGUgVVJMIGluIGEgYnJvd3NlciB0byBhcHByb3ZlIHRoZSBhdXRob3JpemF0aW9uCisgICAgICAgICAgICAgICAgICAgIG9mIG91ciBhcHBsaWNhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgVGhlbiB0aGUgdXNlciBnZXRzIGEgdmVyaWZpZXIgYW5kIGVudGVycyBpdCBiYWNrIHRvIHRoZSBjb25zb2xlLiBIb3dldmVyLCBpZiBvdXIgYXBwbGljYXRpb24gd291bGQgYmUgYQorICAgICAgICAgICAgICAgICAgICB3ZWIgYXBwbGljYXRpb24sIHdlIHdvdWxkIG5lZWQgdG8gcmV0dXJuIGEgcmVkaXJlY3Rpb24gcmVzcG9uc2UgdG8gdGhlIHVzZXIgaW4gb3JkZXIgdG8gcmVkaXJlY3QgdGhlIHVzZXIKKyAgICAgICAgICAgICAgICAgICAgYXV0b21hdGljYWxseSB0byB0aGUgPGxpdGVyYWw+YXV0aG9yaXphdGlvblVyaTwvbGl0ZXJhbD4uIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHNlcnZlciBkZXBsb3ltZW50LAorICAgICAgICAgICAgICAgICAgICBjaGVjayBvdXIgJmplcnNleS5naXRodWIub2F1dGgyLmdvb2dsZS5jbGllbnQuZXhhbXBsZS5saW5rOywgd2hlcmUgdGhlIGNsaWVudCBpcyBwYXJ0IG9mIHRoZQorICAgICAgICAgICAgICAgICAgICB3ZWIgYXBwbGljYXRpb24gKHRoZSBjbGllbnQgQVBJIGZvciBPQXV0aCAyIGlzIHNpbWlsYXIgdG8gT0F1dGggMSkuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIE9uY2Ugd2UgaGF2ZSBhIHZlcmlmaWVyLCB3ZSBpbnZva2UgdGhlIG1ldGhvZCA8bGl0ZXJhbD5maW5pc2goKTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgb24gb3VyICZsaXQuamVyc2V5LmNsaWVudC5vYXV0aDEuT0F1dGgxQXV0aG9yaXphdGlvbkZsb3c7IGluc3RhbmNlLCB3aGljaCBpbnRlcm5hbGx5CisgICAgICAgICAgICAgICAgICAgIHNlbmRzIGEgcmVxdWVzdCB0byBhbiBhY2Nlc3MgdG9rZW4gc2VydmljZSBVUkkgKDxsaXRlcmFsPmh0dHA6Ly9hcGkudHdpdHRlci5jb20vb2F1dGgvYWNjZXNzX3Rva2VuPC9saXRlcmFsPikKKyAgICAgICAgICAgICAgICAgICAgYW5kIGV4Y2hhbmdlcyB0aGUgc3VwcGxpZWQgdmVyaWZpZXIgZm9yIGEgbmV3IHZhbGlkIEFjY2VzcyBUb2tlbi4KKyAgICAgICAgICAgICAgICAgICAgQXQgdGhpcyBwb2ludCB0aGUgYXV0aG9yaXphdGlvbiBmbG93IGlzIGZpbmlzaGVkIGFuZCB3ZSBjYW4gc3RhcnQgdXNpbmcgdGhlIHJldHJpZXZlZAorICAgICAgICAgICAgICAgICAgICAmbGl0LmplcnNleS5jbGllbnQub2F1dGgxLkFjY2Vzc1Rva2VuOyB0byBtYWtlIGF1dGhlbnRpY2F0ZWQgcmVxdWVzdHMuCisgICAgICAgICAgICAgICAgICAgIFdlIGNhbiBub3cgY3JlYXRlIGFuIGluc3RhbmNlIG9mIGFuIE9BdXRoIDEgY2xpZW50ICZqYXhycy5jb3JlLkZlYXR1cmU7IHVzaW5nCisgICAgICAgICAgICAgICAgICAgICZsaXQuamVyc2V5LmNsaWVudC5vYXV0aDEuT0F1dGgxQ2xpZW50U3VwcG9ydDsgYW5kIHBhc3MgaXQgb3VyIDxsaXRlcmFsPmFjY2Vzc1Rva2VuPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgQW5vdGhlciB3YXkgaXMgdG8gdXNlIDxsaXRlcmFsPmF1dGhGbG93PC9saXRlcmFsPiB0aGF0IGFscmVhZHkgY29udGFpbnMgdGhlIGluZm9ybWF0aW9uIGFib3V0IGFjY2VzcyB0b2tlbgorICAgICAgICAgICAgICAgICAgICB0byBjcmVhdGUgdGhlIGZlYXR1cmUgaW5zdGFuY2UgZm9yIHVzOgorCisgICAgICAgICAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRpdGxlPkF1dGhlbnRpY2F0ZWQgcmVxdWVzdHM8L3RpdGxlPgorCisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj48IVtDREFUQVtGZWF0dXJlIGZlYXR1cmUgPSBhdXRoRmxvdy5nZXRPQXV0aDFGZWF0dXJlKCk7CitDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdCdWlsZGVyKCkKKyAgICAucmVnaXN0ZXIoZmVhdHVyZSkKKyAgICAuYnVpbGQoKTtdXT48L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisKKyAgICAgICAgICAgICAgICAgICAgT25jZSB0aGUgZmVhdHVyZSBpcyBjb25maWd1cmVkIGluIHRoZSBKQVgtUlMgJmpheHJzLmNsaWVudC5DbGllbnQ7IChvciAmamF4cnMuY2xpZW50LldlYlRhcmdldDspLAorICAgICAgICAgICAgICAgICAgICBhbGwgcmVxdWVzdHMgaW52b2tlZCBmcm9tIHN1Y2ggJmxpdC5qYXhycy5jbGllbnQuQ2xpZW50OyAob3IgJmxpdC5qYXhycy5jbGllbnQuV2ViVGFyZ2V0OykgaW5zdGFuY2UKKyAgICAgICAgICAgICAgICAgICAgd2lsbCBhdXRvbWF0aWNhbGx5IGluY2x1ZGUgYW4gT0F1dGggQXV0aG9yaXphdGlvbiBIVFRQIGhlYWRlciAodGhhdCBjb250YWlucyBhbHNvIHRoZSBPQXV0aCBzaWduYXR1cmUpLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgaWYgeW91IGFscmVhZHkgaGF2ZSBhIHZhbGlkIEFjY2VzcyBUb2tlbiAoZm9yIGV4YW1wbGUgc3RvcmVkIGluIHRoZSBkYXRhYmFzZSBmb3IgZWFjaCBvZiB5b3VyIHVzZXJzKSwKKyAgICAgICAgICAgICAgICAgICAgdGhlbiB5b3UgY2FuIHNraXAgdGhlIGF1dGhvcml6YXRpb24gZmxvdyBzdGVwcyBhbmQgZGlyZWN0bHkgY3JlYXRlIHRoZSBPQXV0aCAmbGl0LmpheHJzLmNvcmUuRmVhdHVyZTsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlndXJlZCB0byB1c2UgeW91ciBBY2Nlc3MgVG9rZW4uCisKKyAgICAgICAgICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGl0bGU+QnVpbGQgZmVhdHVyZSBmcm9tIEFjY2VzcyBUb2tlbjwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPjwhW0NEQVRBW0FjY2Vzc1Rva2VuIHN0b3JlZFRva2VuID0gLi4uOworRmVhdHVyZSBmaWx0ZXJGZWF0dXJlID0gT0F1dGgxQ2xpZW50U3VwcG9ydC5idWlsZGVyKGNvbnN1bWVyQ3JlZGVudGlhbHMpCisgICAgLmZlYXR1cmUoKQorICAgIC5hY2Nlc3NUb2tlbihzdG9yZWRUb2tlbikKKyAgICAuYnVpbGQoKTtdXT48L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisKKyAgICAgICAgICAgICAgICAgICAgSGVyZSwgdGhlIDxsaXRlcmFsPnN0b3JlZFRva2VuPC9saXRlcmFsPiByZXByZXNlbnRzIGFuICZqZXJzZXkuY2xpZW50Lm9hdXRoMS5BY2Nlc3NUb2tlbjsgdGhhdCB5b3VyIGNsaWVudAorICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbiBrZWVwcyBzdG9yZWQgZS5nLiBpbiBhIGRhdGFiYXNlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBOb3RlIHRoYXQgdGhlIE9BdXRoIGZlYXR1cmUgYnVpbGRlciBBUEkgZG9lcyBub3QgcmVxdWlyZSB0aGUgYWNjZXNzIHRva2VuIHRvIGJlIHNldC4KKyAgICAgICAgICAgICAgICAgICAgVGhlIHJlYXNvbiBmb3IgaXQgaXMgdGhhdCB5b3UgbWlnaHQgd2FudCB0byBidWlsZCBhIGZlYXR1cmUgd2hpY2ggd291bGQgcmVnaXN0ZXIgdGhlIGludGVybmFsIEplcnNleQorICAgICAgICAgICAgICAgICAgICBPQXV0aCAmbGl0LmpheHJzLmNsaWVudC5DbGllbnRSZXF1ZXN0RmlsdGVyOyBhbmQgb3RoZXIgcmVsYXRlZCBwcm92aWRlcnMgYnV0IHdoaWNoIHdvdWxkIG5vdAorICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplIHRoZSBPQXV0aCBwcm92aWRlcnMgd2l0aCBhIHNpbmdsZSBmaXhlZCAmamVyc2V5LmNsaWVudC5vYXV0aDEuQWNjZXNzVG9rZW47IGluc3RhbmNlLgorICAgICAgICAgICAgICAgICAgICBJbiBzdWNoIGNhc2UgeW91IHdvdWxkIG5lZWQgdG8gc3BlY2lmeSBhIHRva2VuIGZvciBldmVyeSBzaW5nbGUgcmVxdWVzdCBpbiB0aGUgcmVxdWVzdCBwcm9wZXJ0aWVzLgorICAgICAgICAgICAgICAgICAgICBLZXkgbmFtZXMgYW5kIEFQSSBkb2N1bWVudGF0aW9uIG9mIHRoZXNlIHByb3BlcnRpZXMgY2FuIGJlIGZvdW5kIGluCisgICAgICAgICAgICAgICAgICAgICZsaXQuamVyc2V5LmNsaWVudC5vYXV0aDEuT0F1dGgxQ2xpZW50U3VwcG9ydDsuCisgICAgICAgICAgICAgICAgICAgIFVzaW5nIHRoaXMgYXBwcm9hY2gsIHlvdSBjYW4gaGF2ZSBhIHNpbmdsZSwgT0F1dGggZW5hYmxlZCBpbnN0YW5jZSBvZiBhIEpBWC1SUyAmbGl0LmpheHJzLmNsaWVudC5DbGllbnQ7CisgICAgICAgICAgICAgICAgICAgIChvciAmamF4cnMuY2xpZW50LldlYlRhcmdldDspIGFuZCB1c2UgaXQgdG8gbWFrZSBhdXRoZW50aWNhdGVkIHJlcXVlc3RzIG9uIGJlaGFsZiBvZiBtdWx0aXBsZSB1c2Vycy4KKyAgICAgICAgICAgICAgICAgICAgTm90ZSB0aGF0IHlvdSBjYW4gdXNlIHRoZSBhZm9yZW1lbnRpb25lZCByZXF1ZXN0IHByb3BlcnRpZXMgZXZlbiBpZiB0aGUgZmVhdHVyZSBoYXMgYmVlbiBpbml0aWFsaXplZAorICAgICAgICAgICAgICAgICAgICB3aXRoIGFuICZsaXQuamVyc2V5LmNsaWVudC5vYXV0aDEuQWNjZXNzVG9rZW47IHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGFjY2VzcyB0b2tlbiBpbmZvcm1hdGlvbiBmb3IKKyAgICAgICAgICAgICAgICAgICAgcGFydGljdWxhciByZXF1ZXN0cywgZXZlbiB0aG91Z2ggaXQgaXMgcHJvYmFibHkgbm90IGEgY29tbW9uIHVzZSBjYXNlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUaGUgZm9sbG93aW5nIGNvZGUgc2hvd3MgaG93IHRvIHNldCBhbiBhY2Nlc3MgdG9rZW4gb24gYSBzaW5nbGUgcmVxdWVzdCB1c2luZyB0aGUgSmVyc2V5IE9BdXRoIHByb3BlcnRpZXMuCisKKyAgICAgICAgICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGl0bGU+U3BlY2lmeWluZyBBY2Nlc3MgVG9rZW4gb24gYSBSZXF1ZXN0LjwvdGl0bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj48IVtDREFUQVtSZXNwb25zZSByZXNwID0KKyAgICBjbGllbnQudGFyZ2V0KCJodHRwOi8vbXktc2VydmljZXByb3ZpZGVyLm9yZy9yZXN0L2Zvby9iYXIiKQorICAgICAgICAucmVxdWVzdCgpCisgICAgICAgIC5wcm9wZXJ0eShPQXV0aDFDbGllbnRTdXBwb3J0Lk9BVVRIX1BST1BFUlRZX0FDQ0VTU19UT0tFTiwgc3RvcmVkVG9rZW4pCisgICAgICAgIC5nZXQoKTtdXT48L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisKKyAgICAgICAgICAgICAgICAgICAgJmxpdC5qZXJzZXkuY2xpZW50Lm9hdXRoMS5PQXV0aDFBdXRob3JpemF0aW9uRmxvdzsgaW50ZXJuYWxseSB1c2VzCisgICAgICAgICAgICAgICAgICAgIGEgJmxpdC5qYXhycy5jbGllbnQuQ2xpZW50OyBpbnN0YW5jZSB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBPQXV0aCBzZXJ2ZXIuIEZvciB0aGlzIGEKKyAgICAgICAgICAgICAgICAgICAgbmV3IGNsaWVudCBpbnN0YW5jZSBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgYnkgZGVmYXVsdC4gWW91IGNhbiBzdXBwbHkgeW91ciBpbnN0YW5jZSBvZgorICAgICAgICAgICAgICAgICAgICBhICZsaXQuamF4cnMuY2xpZW50LkNsaWVudDsgdG8gYmUgdXNlZCBmb3IgdGhlIGF1dGhvcml6YXRpb24gZmxvdyByZXF1ZXN0cyAoZm9yIHBlcmZvcm1hbmNlCisgICAgICAgICAgICAgICAgICAgIGFuZC9vciByZXNvdXJjZSBtYW5hZ2VtZW50IHJlYXNvbnMpIHVzaW5nICZqZXJzZXkuY2xpZW50Lm9hdXRoMS5PQXV0aDFCdWlsZGVyOyBtZXRob2RzLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxzZWN0aW9uIHhtbDppZD0ib2F1dGgxLWNsaWVudC1zaWduYXR1cmVzIj4KKyAgICAgICAgICAgICAgICAgICAgPHRpdGxlPlB1YmxpYy9Qcml2YXRlIEtleXMgZm9yIFJTQS1TSEExIHNpZ25hdHVyZSBtZXRob2Q8L3RpdGxlPgorCisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgRm9sbG93IHRoZSBzdGVwcyBiZWxvdyBpbiBjYXNlIHRoZSBvdXRnb2luZyByZXF1ZXN0cyBzZW50IGZyb20gY2xpZW50IHRvIHNlcnZlciBoYXZlIHRvIGJlIHNpZ25lZCB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICBSU0EtU0hBMSBzaWduYXR1cmUgbWV0aG9kIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgb25lIChITUFDLVNIQTEpLgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGl0bGU+Q3JlYXRpbmcgUHVibGljL1ByaXZhdGUgUlNBLVNIQTEga2V5czwvdGl0bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImJhc2giIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj48IVtDREFUQVskICMgQ3JlYXRlIHRoZSBwcml2YXRlIGtleS4KKyQgb3BlbnNzbCBnZW5yc2EgLW91dCBwcml2YXRlLmtleSAyMDQ4CiskICMgQ29udmVydCB0aGUga2V5IGludG8gUEtDUzggZm9ybWF0LgorJCBvcGVuc3NsIHBrY3M4IC10b3BrOCAtaW4gcHJpdmF0ZS5rZXkgLW5vY3J5cHQKKyQgIyBFeHRyYWN0IHRoZSBwdWJsaWMga2V5LgorJCBvcGVuc3NsIHJzYSAtaW4gcHJpdmF0ZS5rZXkgLXB1Ym91dF1dPjwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKworICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBvdXRwdXQgb2YgdGhlIHNlY29uZCBjb21tYW5kIGNhbiBiZSB1c2VkIGFzIGEgY29uc3VtZXIgc2VjcmV0IHRvIHNpZ24gdGhlIG91dGdvaW5nIHJlcXVlc3Q6CisgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5uZXcgQ29uc3VtZXJDcmVkZW50aWFscygiY29uc3VtZXIta2V5IiwgQ09OU1VNRVJfUFJJVkFURV9LRVkpPC9saXRlcmFsPi4gUHVibGljIGtleSBvYnRhaW5lZCBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdGhpcmQgY29tbWFuZCBjYW4gYmUgdGhlbiB1c2VkIG9uIHRoZSBzZXJ2aWNlIHByb3ZpZGVyIHRvIHZlcmlmeSB0aGUgc2lnbmVkIGRhdGEuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICBGb3IgbW9yZSBhZHZhbmNlZCBjYXNlcyAoaS5lLiBvdGhlciBmb3JtYXRzIG9mIGtleXMpIGEgY3VzdG9tIDxsaXRlcmFsPk9BdXRoMVNpZ25hdHVyZU1ldGhvZDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBhbmQgdXNlZC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgIDxzZWN0aW9uPgorICAgICAgICAgICAgPHRpdGxlPk9BdXRoIDIgU3VwcG9ydDwvdGl0bGU+CisgICAgICAgICAgICA8cGFyYT5BdCB0aGUgbW9tZW50IEplcnNleSBzdXBwb3J0cyBPQXV0aCAyIG9ubHkgb24gdGhlIGNsaWVudCBzaWRlLjwvcGFyYT4KKworICAgICAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICAgICAgPHRpdGxlPkNsaWVudDwvdGl0bGU+CisgICAgICAgICAgICAgICAgPG5vdGU+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgTm90ZTogSXQgaXMgc3VnZ2VzdGVkIHRvIHJlYWQgdGhlIHNlY3Rpb24gPHhyZWYgbGlua2VuZD0ib2F1dGgxLWNsaWVudCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlIHRoaXMgc2VjdGlvbi4gU3VwcG9ydCBmb3IgT0F1dGggb24gdGhlIGNsaWVudCBpcyB2ZXJ5IHNpbWlsYXIgZm9yIGJvdGgKKyAgICAgICAgICAgICAgICAgICAgICAgIE9BdXRoIDEgYW5kIE9BdXRoIDIgYW5kIGdlbmVyYWwgcHJpbmNpcGxlcyBhcmUgdmFsaWQgZm9yIGJvdGggT0F1dGggdmVyc2lvbnMgYXMgc3VjaC4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICBPQXV0aCAyIHN1cHBvcnQgaXMgaW4gYSAmamVyc2V5LmNvbW1vbi5CZXRhOyBzdGF0ZSBhbmQgYXMgc3VjaCB0aGUgQVBJIGlzIHN1YmplY3QKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvIGNoYW5nZS4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbm90ZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgVG8gYWRkIHN1cHBvcnQgZm9yIEplcnNleSBPQXV0aCAyIENsaWVudCBBUEkgaW50byB5b3VyIGFwcGxpY2F0aW9uLCBhZGQgdGhlIGZvbGxvd2luZyBkZXBlbmRlbmN5CisgICAgICAgICAgICAgICAgICAgIHRvIHlvdXIgPGxpdGVyYWw+cG9tLnhtbDwvbGl0ZXJhbD46CisKKyAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJ4bWwiPiZsdDtkZXBlbmRlbmN5Jmd0OworICAgICZsdDtncm91cElkJmd0O29yZy5nbGFzc2Zpc2guamVyc2V5LnNlY3VyaXR5Jmx0Oy9ncm91cElkJmd0OworICAgICZsdDthcnRpZmFjdElkJmd0O29hdXRoMi1jbGllbnQmbHQ7L2FydGlmYWN0SWQmZ3Q7CisgICAgJmx0O3ZlcnNpb24mZ3Q7JnZlcnNpb247Jmx0Oy92ZXJzaW9uJmd0OworJmx0Oy9kZXBlbmRlbmN5Jmd0OzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIE9BdXRoIDIsIGluIGNvbnRyYXN0IHdpdGggT0F1dGggMSwgaXMgbm90IGEgc3RyaWN0bHkgZGVmaW5lZCBwcm90b2NvbCwgcmF0aGVyIGEgZnJhbWV3b3JrLgorICAgICAgICAgICAgICAgICAgICBPQXV0aCAyIHNwZWNpZmljYXRpb24gZGVmaW5lcyBtYW55IGV4dGVuc2lvbiBwb2ludHMgYW5kIGl0IGlzIHVwIHRvIHNlcnZpY2UgcHJvdmlkZXJzIHRvCisgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudCB0aGVzZSBkZXRhaWxzIGFuZCBkb2N1bWVudCB0aGVzZSBpbXBsZW1lbnRhdGlvbnMgZm9yIHRoZSBzZXJ2aWNlIGNvbnN1bWVycy4KKyAgICAgICAgICAgICAgICAgICAgQWRkaXRpb25hbGx5LCBPQXV0aCAyIGRlZmluZXMgbW9yZSB0aGFuIG9uZSBhdXRob3JpemF0aW9uIGZsb3cuCisgICAgICAgICAgICAgICAgICAgIFRoZSBhdXRob3JpemF0aW9uIGZsb3cgc2ltaWxhciB0byB0aGUgZmxvdyBmcm9tIE9BdXRoIDEgaXMgY2FsbGVkCisgICAgICAgICAgICAgICAgICAgIHRoZSA8ZW1waGFzaXM+QXV0aG9yaXphdGlvbiBDb2RlIEdyYW50IEZsb3c8L2VtcGhhc2lzPi4KKyAgICAgICAgICAgICAgICAgICAgVGhpcyBpcyB0aGUgZmxvdyBjdXJyZW50bHkgc3VwcG9ydGVkIGJ5IEplcnNleSAoSmVyc2V5IGN1cnJlbnRseSBkb2VzIG5vdCBzdXBwb3J0IG90aGVyIGZsb3dzKS4KKyAgICAgICAgICAgICAgICAgICAgUGxlYXNlIHJlZmVyIHRvIHRoZSAmb2F1dGgyLnNwZWMubGluazsgZm9yIG1vcmUgZGV0YWlscyBhYm91dCBhdXRob3JpemF0aW9uIGZsb3dzLgorICAgICAgICAgICAgICAgICAgICBBbm90aGVyIHNpZ25pZmljYW50IGNoYW5nZSBjb21wYXJlZCB0byBPQXV0aCAxIGlzIHRoYXQgT0F1dGggMiBpcyBub3QgYmFzZWQgb24gc2lnbmF0dXJlcyBhbmQKKyAgICAgICAgICAgICAgICAgICAgc2VjcmV0IGtleXMgYW5kIHRoZXJlZm9yZSBmb3IgbW9zdCBvZiB0aGUgY29tbXVuaWNhdGlvbiBTU0wgbmVlZHMgdG8gYmUgdXNlZAorICAgICAgICAgICAgICAgICAgICAoaS5lLiB0aGUgcmVxdWVzdHMgbXVzdCBiZSBtYWRlIHRocm91Z2ggSFRUUFMpLiBUaGlzIG1lYW5zIHRoYXQgYWxsIE9BdXRoIDIgZW5kcG9pbnQgVVJJcyBtdXN0IHVzZQorICAgICAgICAgICAgICAgICAgICB0aGUgPGxpdGVyYWw+aHR0cHM8L2xpdGVyYWw+IHNjaGVtZS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgRHVlIHRvIHRoZSBmYWN0IHRoYXQgT0F1dGggMiBkb2VzIG5vdCBkZWZpbmUgYSBzdHJpY3QgcHJvdG9jb2wsIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBwcm92aWRlIGEKKyAgICAgICAgICAgICAgICAgICAgc2luZ2xlLCB1bml2ZXJzYWwgcHJlLWNvbmZpZ3VyZWQgdG9vbCBpbnRlcm9wZXJhYmxlIHdpdGggYWxsIHByb3ZpZGVycy4KKyAgICAgICAgICAgICAgICAgICAgSmVyc2V5IE9BdXRoIDIgQVBJcyBhbGxvd3MgYSBsb3Qgb2YgZXh0ZW5zaWJpbGl0eSB2aWEgcGFyYW1ldGVycyBzZW50IGluIGVhY2ggcmVxdWVzdHMuIEplcnNleQorICAgICAgICAgICAgICAgICAgICBjdXJyZW50bHkgcHJvdmlkZXMgdHdvIHByZS1jb25maWd1cmVkIGF1dGhvcml6YXRpb24gZmxvdyBwcm92aWRlcnMgLSBmb3IgR29vZ2xlIGFuZCBGYWNlYm9vay4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgVGhlIG1vc3QgaW1wb3J0YW50IGVudHJ5IHBvaW50cyBvZiBKZXJzZXkgY2xpZW50IE9BdXRoIDIgQVBJIGFuZCBTUEkgYXJlIGV4cGxhaW5lZCBiZWxvdzoKKworICAgICAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmamVyc2V5LmNsaWVudC5vYXV0aDIuT0F1dGgyQ2xpZW50U3VwcG9ydDs6IFRoZSBtYWluIGNsYXNzIHdoaWNoIGNvbnRhaW5zIGJ1aWxkZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kcyB0byBidWlsZCBmZWF0dXJlcyB0aGF0IGVuYWJsZSB0aGUgT0F1dGggMiBzdXBwb3J0LiBTdGFydCB3aXRoIHRoaXMgY2xhc3MgZXZlcnkgdGltZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5b3UgbmVlZCB0byBhZGQgYW55IE9BdXRoIDIgc3VwcG9ydCB0byB0aGUgSmVyc2V5IENsaWVudCAoYnVpbGQgYW4gQXV0aG9yaXphdGlvbiBmbG93CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGluaXRpYWxpemUgY2xpZW50IHRvIHBlcmZvcm0gYXV0aGVudGljYXRlZCByZXF1ZXN0cykuIFRoZSBjbGFzcyBjb250YWlucyBhbHNvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZHMgdG8gZ2V0IGF1dGhvcml6YXRpb24gZmxvdyB1dGlsaXRpZXMgYWRqdXN0ZWQgZm9yIEZhY2Vib29rIG9yIEdvb2dsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZqZXJzZXkuY2xpZW50Lm9hdXRoMi5PQXV0aDJDb2RlR3JhbnRGbG93OzogQVBJIHRoYXQgYWxsb3dzIHRvIHBlcmZvcm0gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhvcml6YXRpb24gZmxvdyBkZWZpbmVkIGFzIEF1dGhvcml6YXRpb24gQ29kZSBHcmFudCBGbG93IGluIHRoZSBPQXV0aCAyIHNwZWNpZmljYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltcGxlbWVudGF0aW9uIG9mIHRoaXMgaW50ZXJmYWNlIGlzIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3MgdGhhdCBpcyB1c2VkIGFzIGEgc3RhbmRhbG9uZSB1dGlsaXR5IGFuZCBpcyBub3QgcGFydCBvZiB0aGUgSkFYLVJTIGNsaWVudC4gSW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIgd29yZHMsIHRoaXMgaXMgbm90IGEgZmVhdHVyZSB0aGF0IHNob3VsZCBiZSByZWdpc3RlcmVkIGludG8gdGhlIGNsaWVudC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZqZXJzZXkuY2xpZW50Lm9hdXRoMi5DbGllbnRJZGVudGlmaWVyOzogSWRlbnRpZmllciBvZiB0aGUgY2xpZW50IGlzc3VlZCBieSB0aGUgU2VydmljZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm92aWRlciBmb3IgdGhlIGNsaWVudC4gU2ltaWxhciB0byAmamVyc2V5LmNsaWVudC5vYXV0aDEuQ29uc3VtZXJDcmVkZW50aWFsczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBPQXV0aCAxIGNsaWVudCBzdXBwb3J0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmplcnNleS5jbGllbnQub2F1dGgyLk9BdXRoMlBhcmFtZXRlcnM7OiBEZWZpbmVzIHBhcmFtZXRlcnMgdGhhdCBhcmUgdXNlZCBpbiByZXF1ZXN0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJpbmcgdGhlIGF1dGhvcml6YXRpb24gZmxvdy4gVGhlc2UgcGFyYW1ldGVycyBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSBzb21lIG9mIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIHVzZWQgaW4gZGlmZmVyZW50IGF1dGhvcml6YXRpb24gcGhhc2VzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmplcnNleS5jbGllbnQub2F1dGgyLlRva2VuUmVzdWx0OzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGFpbnMgcmVzdWx0IG9mIHRoZSBhdXRob3JpemF0aW9uIGZsb3cuIE9uZSBvZiB0aGUgcmVzdWx0IHZhbHVlcyBpcyB0aGUgQWNjZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRva2VuLiBJdCBjYW4gYWRkaXRpb25hbGx5IGNvbnRhaW4gdGhlIGV4cGlyYXRpb24gdGltZSBvZiB0aGUgQWNjZXNzIFRva2VuIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZyZXNoIFRva2VuIHRoYXQgY2FuIGJlIHVzZWQgdG8gZ2V0IG5ldyBBY2Nlc3MgVG9rZW4uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFRoZSBwcmluY2lwbGUgb2YgcGVyZm9ybWluZyB0aGUgYXV0aG9yaXphdGlvbiBmbG93IHdpdGggSmVyc2V5IGlzIHNpbWlsYXIgdG8gT0F1dGggMS4KKyAgICAgICAgICAgICAgICAgICAgQ2hlY2sgdGhlICZqZXJzZXkuZ2l0aHViLm9hdXRoMS50d2l0dGVyLmNsaWVudC5leGFtcGxlLmxpbms7IHdoaWNoIHV0aWxpemVzIEplcnNleSBjbGllbnQKKyAgICAgICAgICAgICAgICAgICAgc3VwcG9ydCBmb3IgT0F1dGggMiB0byBnZXQgR29vZ2xlIFRhc2tzIG9mIHRoZSB1c2VyLiBUaGUgYXBwbGljYXRpb24gaXMgYSB3ZWIgYXBwbGljYXRpb24KKyAgICAgICAgICAgICAgICAgICAgdGhhdCB1c2VzIHJlZGlyZWN0aW9uIHRvIGZvcndhcmQgdGhlIHVzZXIgdG8gdGhlIGF1dGhvcml6YXRpb24gVVJJLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUaGUgZm9sbG93aW5nIGNvZGUgaXMgYW4gZXhhbXBsZSBvZiBob3cgdG8gYnVpbGQgYW5kIHVzZSBPQXV0aCAyIGF1dGhvcml6YXRpb24gZmxvdy4KKworICAgICAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5CdWlsZGluZyBPQXV0aCAyIEF1dGhvcml6YXRpb24gRmxvdy48L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+PCFbQ0RBVEFbT0F1dGgyQ29kZUdyYW50Rmxvdy5CdWlsZGVyIGJ1aWxkZXIgPQorICAgIE9BdXRoMkNsaWVudFN1cHBvcnQuYXV0aG9yaXphdGlvbkNvZGVHcmFudEZsb3dCdWlsZGVyKGNsaWVudElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwczovL2V4YW1wbGUuY29tL29hdXRoL2F1dGhvcml6YXRpb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwczovL2V4YW1wbGUuY29tL29hdXRoL3Rva2VuIik7CitPQXV0aDJDb2RlR3JhbnRGbG93IGZsb3cgPSBidWlsZGVyCisgICAgLnByb3BlcnR5KE9BdXRoMkNvZGVHcmFudEZsb3cuUGhhc2UuQVVUSE9SSVpBVElPTiwgInJlYWRPbmx5IiwgInRydWUiKQorICAgIC5zY29wZSgiY29udGFjdCIpCisgICAgLmJ1aWxkKCk7CitTdHJpbmcgYXV0aG9yaXphdGlvblVyaSA9IGZsb3cuc3RhcnQoKTsKKworLy8gSGVyZSB3ZSBtdXN0IHJlZGlyZWN0IHRoZSB1c2VyIHRvIHRoZSBhdXRob3JpemF0aW9uVXJpCisvLyBhbmQgbGV0IHRoZSB1c2VyIGFwcHJvdmUgYW4gYWNjZXNzIGZvciBvdXIgYXBwLgorCisuLi4KKworLy8gV2UgbXVzdCBoYW5kbGUgcmVkaXJlY3Rpb24gYmFjayB0byBvdXIgd2ViIHJlc291cmNlCisvLyBhbmQgZXh0cmFjdCBjb2RlIGFuZCBzdGF0ZSBmcm9tIHRoZSByZXF1ZXN0CitmaW5hbCBUb2tlblJlc3VsdCByZXN1bHQgPSBmbG93LmZpbmlzaChjb2RlLCBzdGF0ZSk7CitTeXN0ZW0ub3V0LnByaW50bG4oIkFjY2VzcyBUb2tlbjogIiArIHJlc3VsdC5nZXQpO11dPjwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgICAgIDwvZXhhbXBsZT4KKworICAgICAgICAgICAgICAgICAgICBJbiB0aGUgY29kZSBhYm92ZSB3ZSBjcmVhdGUgYW4gJmxpdC5qZXJzZXkuY2xpZW50Lm9hdXRoMi5PQXV0aDJDb2RlR3JhbnRGbG93OyBmcm9tIGFuCisgICAgICAgICAgICAgICAgICAgIGF1dGhvcml6YXRpb24gVVJJIGFuZCBhbiBhY2Nlc3MgdG9rZW4gVVJJLiBXZSBoYXZlIGFkZGl0aW9uYWxseSBzZXQgYQorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5yZWFkT25seTwvbGl0ZXJhbD4gcGFyYW1ldGVyIHRvIDxsaXRlcmFsPnRydWU8L2xpdGVyYWw+IGFuZCBhc3NpZ25lZCB0aGUgcGFyYW1ldGVyCisgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBhdXRob3JpemF0aW9uIHBoYXNlLiBUaGlzIGlzIHRoZSB3YXksIGhvdyB5b3UgY2FuIGV4dGVuZCB0aGUgc3RhbmRhcmQgZmxvdyB3aXRoCisgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWwgc2VydmljZSBwcm92aWRlci1zcGVjaWZpYyBwYXJhbWV0ZXJzLiBJbiB0aGlzIGNhc2UsIHRoZSA8bGl0ZXJhbD5yZWFkT25seT10cnVlPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgd2lsbCBiZSBhZGRlZCBhcyBhIHF1ZXJ5IHBhcmFtZXRlciB0byB0aGUgYXV0aG9yaXphdGlvbiB1cmkgcmV0dXJuZWQgZnJvbSB0aGUgbWV0aG9kCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmZsb3cuc3RhcnQoKTwvbGl0ZXJhbD4uCisgICAgICAgICAgICAgICAgICAgIElmIHdlIHdvdWxkIHNwZWNpZnkgPGxpdGVyYWw+QUNDRVNTX1RPS0VOX1JFUVVFU1Q8L2xpdGVyYWw+IGFzIGEgcGhhc2UsIHRoZW4gdGhlIHBhcmFtZXRlcgorICAgICAgICAgICAgICAgICAgICB3b3VsZCBoYXZlIGJlZW4gYWRkZWQgdG8gdGhlIHJlcXVlc3Qgd2hlbiA8bGl0ZXJhbD5mbG93LmZpbmlzaCgpPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICBpcyBpbnZva2VkLiBTZWUgamF2YWRvY3MgZm9yIG1vcmUgaW5mb3JtYXRpb24uIFRoZSBwYXJhbWV0ZXIgPGxpdGVyYWw+cmVhZE9ubHk8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgIGlzIG5vdCBwYXJ0IG9mIHRoZSBPQXV0aCAyIHNwZWNpZmljYXRpb24gYW5kIGlzIHVzZWQgaW4gdGhlIGV4YW1wbGUKKyAgICAgICAgICAgICAgICAgICAgZm9yIGRlbW9uc3RyYXRpb24gb2YgaG93IHRvIGNvbmZpZ3VyZSB0aGUgZmxvdyBmb3IgbmVlZHMgb2Ygc3BlY2lmaWMgc2VydmljZSBwcm92aWRlcnMgKGluIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgY2FzZSwgdGhlIDxsaXRlcmFsPnJlYWRPbmx5PC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICBwYXJhbSB3b3VsZCBiZSBkZXNjcmliZWQgaW4gdGhlIHNlcnZpY2UgcHJvdmlkZXIncyBkb2N1bWVudGF0aW9uKS4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEJldHdlZW4gdGhlIGNhbGxzIHRvIDxsaXRlcmFsPmZsb3cuc3RhcnQoKTwvbGl0ZXJhbD4gYW5kIDxsaXRlcmFsPmZsb3cuZmluaXNoKCk8L2xpdGVyYWw+LCBhIHVzZXIKKyAgICAgICAgICAgICAgICAgICAgbXVzdCBiZSByZWRpcmVjdGVkIHRvIHRoZSBhdXRob3JpemF0aW9uIFVSSS4gVGhpcyBtZWFucyB0aGF0IHRoZSBjb2RlIHdpbGwgbm90IGJlIGV4ZWN1dGVkIGluCisgICAgICAgICAgICAgICAgICAgIGEgc2luZ2xlIG1ldGhvZCBhbmQgdGhlIGZpbmlzaCBwYXJ0IHdpbGwgYmUgaW52b2tlZCBhcyBhIGhhbmRsZXIgb2YgcmVkaXJlY3QgcmVxdWVzdCBiYWNrIHRvIG91ciB3ZWIgZnJvbQorICAgICAgICAgICAgICAgICAgICBhdXRob3JpemF0aW9uIFVSSS4gQ2hlY2sgdGhlICZqZXJzZXkuZ2l0aHViLm9hdXRoMi5nb29nbGUuY2xpZW50LmV4YW1wbGUubGluazsgZm9yIG1vcmUgZGV0YWlscyBvbgorICAgICAgICAgICAgICAgICAgICB0aGlzIGFwcHJvYWNoLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPC9zZWN0aW9uPgorICAgIDwvc2VjdGlvbj4KKzwvY2hhcHRlcj4KZGlmZiAtLWdpdCBhL2RvY3Mvc3JjL21haW4vZG9jYm9vay9zcHJpbmcueG1sIGIvZG9jcy9zcmMvbWFpbi9kb2Nib29rL3NwcmluZy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI3NTY4ZQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3Mvc3JjL21haW4vZG9jYm9vay9zcHJpbmcueG1sCkBAIC0wLDAgKzEsMTE1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzwhRE9DVFlQRSBjaGFwdGVyIFs8IUVOVElUWSAlIGVudHMgU1lTVEVNICJqZXJzZXkuZW50IiA+ICVlbnRzO10+Cis8Y2hhcHRlciB4bWxucz0iaHR0cDovL2RvY2Jvb2sub3JnL25zL2RvY2Jvb2siCisgICAgICAgICB2ZXJzaW9uPSI1LjAiCisgICAgICAgICB4bWw6bGFuZz0iZW4iCisgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiCisgICAgICAgICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKKyAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2RvY2Jvb2sub3JnL25zL2RvY2Jvb2sgaHR0cDovL2RvY2Jvb2sub3JnL3htbC81LjAveHNkL2RvY2Jvb2sueHNkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsgaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluay54c2QiCisgICAgICAgICB4bWw6aWQ9InNwcmluZyI+CisgICAgPHRpdGxlPlNwcmluZyBESTwvdGl0bGU+CisKKyAgICA8cGFyYT4KKyAgICAgICAgSmVyc2V5IHByb3ZpZGVzIGFuIGV4dGVuc2lvbiB0byBzdXBwb3J0IFNwcmluZyBESS4KKyAgICAgICAgVGhpcyBlbmFibGVzIEplcnNleSB0byB1c2UgU3ByaW5nIGJlYW5zIGFzIEpBWC1SUyBjb21wb25lbnRzIChlLmcuIHJlc291cmNlcyBhbmQgcHJvdmlkZXJzKSBhbmQgYWxzbyBhbGxvd3MKKyAgICAgICAgU3ByaW5nIHRvIGluamVjdCBpbnRvIEplcnNleSBtYW5hZ2VkIGNvbXBvbmVudHMuCisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+CisgICAgICAgIFRoZSBTcHJpbmcgZXh0ZW5zaW9uIG1vZHVsZSBjb25maWd1cmF0aW9uIGlzIGJhc2VkIG9uIGFubm90YXRpb25zLgorICAgICAgICBTcHJpbmcgYmVhbnMgYXJlIGluamVjdGVkIGFuZCBKQVgtUlMgY2xhc3NlcyBhcmUgbWFkZSBTcHJpbmcgbWFuYWdlZCB1c2luZyBhbm5vdGF0aW9ucy4KKyAgICAgICAgSW5qZWN0ZWQgU3ByaW5nIGJlYW5zIGNhbiBoYXZlIGZ1cnRoZXIgZGVwZW5kZW5jaWVzIGluamVjdGVkIHVzaW5nIFNwcmluZyBYTUwgY29uZmlndXJhdGlvbi4KKyAgICAgICAgU3ByaW5nIHNpbmdsZXRvbiBhbmQgcmVxdWVzdCBzY29wZXMgYXJlIHN1cHBvcnRlZC4KKyAgICA8L3BhcmE+CisKKyAgICA8cGFyYT4KKyAgICAgICAgVG8gZW5hYmxlIEpBWC1SUyByZXNvdXJjZXMgdG8gd29yayBTcHJpbmcgZnVuY3Rpb25hbGl0eSB0aGF0IHJlcXVpcmVzIHByb3h5aW5nLCBzdWNoIGFzIFNwcmluZyB0cmFuc2FjdGlvbiBtYW5hZ2VtZW50CisgICAgICAgICh3aXRoIDxsaXRlcmFsPkBUcmFuc2FjdGlvbmFsPC9saXRlcmFsPiksIFNwcmluZyBTZWN1cml0eSBhbmQgYXNwZWN0IG9yaWVudGVkIHByb2dyYW1taW5nIChzdWNoIGFzIDxsaXRlcmFsPkBBc3BlY3Q8L2xpdGVyYWw+KSwgdGhlIHJlc291cmNlcworICAgICAgICBtdXN0IHRoZW1zZWx2ZXMgYmUgbWFuYWdlZCBieSBTcHJpbmcsIGJ5IGFubm90YXRpbmcgd2l0aCA8bGl0ZXJhbD5AQ29tcG9uZW50PC9saXRlcmFsPiwgPGxpdGVyYWw+QFNlcnZpY2U8L2xpdGVyYWw+LAorICAgICAgICA8bGl0ZXJhbD5AQ29udHJvbGxlcjwvbGl0ZXJhbD4gb3IgPGxpdGVyYWw+QFJlcG9zaXRvcnk8L2xpdGVyYWw+OgorCisgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPmltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OworCitAQ29tcG9uZW50CitAUGF0aCgiLyIpCitwdWJsaWMgY2xhc3MgU29tZVJlc291cmNlIHsKKworICAgIEBUcmFuc2FjdGlvbmFsCisgICAgQEdFVAorICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVJlc291cmNlKCkgeworICAgICAgICAvLyAuLi4KKyAgICB9Cit9CisgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgPC9wYXJhPgorCisgICAgPHBhcmE+CisgICAgICAgIExpbWl0YXRpb25zOgorCisgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+U3ByaW5nIGJlYW5zIGNhbid0IGJlIGluamVjdGVkIGRpcmVjdGx5IGludG8gSkFYLVJTIGNsYXNzZXMgYnkgdXNpbmcgU3ByaW5nIFhNTCBjb25maWd1cmF0aW9uPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgIDwvaXRlbWl6ZWRsaXN0PgorICAgIDwvcGFyYT4KKworICAgIDxzZWN0aW9uPgorICAgICAgICA8dGl0bGU+RGVwZW5kZW5jaWVzPC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIElmIHlvdSB3YW50IHRvIHVzZSBKZXJzZXkgU3ByaW5nIERJIHN1cHBvcnQKKyAgICAgICAgICAgIHlvdSB3aWxsIG5lZWQgdG8gYWRkIHRoZSA8bGl0ZXJhbD5qZXJzZXktc3ByaW5nNDwvbGl0ZXJhbD4gbW9kdWxlIGludG8gdGhlIGxpc3Qgb2YgeW91ciBkZXBlbmRlbmNpZXM6CisKKyAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0ieG1sIj4mbHQ7ZGVwZW5kZW5jeSZndDsKKyAgICAmbHQ7Z3JvdXBJZCZndDtvcmcuZ2xhc3NmaXNoLmplcnNleS5leHQmbHQ7L2dyb3VwSWQmZ3Q7CisgICAgJmx0O2FydGlmYWN0SWQmZ3Q7amVyc2V5LXNwcmluZzQmbHQ7L2FydGlmYWN0SWQmZ3Q7CisgICAgJmx0O3ZlcnNpb24mZ3Q7JnZlcnNpb247Jmx0Oy92ZXJzaW9uJmd0OworJmx0Oy9kZXBlbmRlbmN5Jmd0OzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZSBhYm92ZSBtb2R1bGUgYWRkcyB0cmFuc2l0aXZlIGRlcGVuZGVuY2llcyBvbiBTcHJpbmcgbW9kdWxlcy4KKyAgICAgICAgICAgIFNlZSAmamVyc2V5LmV4dC5zcHJpbmc0LmRlcHMubGluazsgbW9kdWxlIGRlcGVuZGVuY2llcyBmb3IgbW9yZSBkZXRhaWxzIGFib3V0IGxpc3QgYW5kIHNjb3BlIG9mIGRlcGVuZGVuY2llcy4KKyAgICAgICAgICAgIFBsZWFzZSBub3RlIHRoZSBtb2R1bGUgZGVwZW5kcyBvbiAmaGsyLnNwcmluZy1icmlkZ2UubGluazsgdGhhdCBpcyB1c2VkIHRvIGluamVjdCBTcHJpbmcgc2VydmljZXMgaW50byBISzIgc2VydmljZXMKKyAgICAgICAgICAgIG9yIGluamVjdCBISzIgc2VydmljZXMgaW50byBTcHJpbmcgc2VydmljZXMuCisgICAgICAgIDwvcGFyYT4KKworICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uPgorICAgICAgICA8dGl0bGU+UmVnaXN0cmF0aW9uIGFuZCBDb25maWd1cmF0aW9uPC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRvIHVzZSBjYXBhYmlsaXRpZXMgb2YgSmVyc2V5IFNwcmluZyAzIERJIHN1cHBvcnQgaW4geW91ciBKQVgtUlMvSmVyc2V5IGFwcGxpY2F0aW9uIHlvdSBuZWVkIHRvIGhhdmUKKyAgICAgICAgICAgIHRoZSBhYm92ZSBtZW50aW9uZWQgbW9kdWxlIG9uIHlvdXIgY2xhc3MtcGF0aC4KKyAgICAgICAgPC9wYXJhPgorCisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24+CisgICAgICAgIDx0aXRsZT5FeGFtcGxlPC90aXRsZT4KKworICAgICAgICA8cGFyYT5UbyBzZWUgYW4gZXhhbXBsZSBvZiBTcHJpbmcgREkgc3VwcG9ydCBpbiBKZXJzZXkgcmVmZXIgdG8gdGhlCisgICAgICAgICAgICA8bGluayB4bGluazpocmVmPScmamVyc2V5LmdpdGh1Yi5leGFtcGxlcy51cmk7L2hlbGxvd29ybGQtc3ByaW5nLXdlYmFwcCc+U3ByaW5nIERJIEV4YW1wbGU8L2xpbms+LjwvcGFyYT4KKyAgICA8L3NlY3Rpb24+Cis8L2NoYXB0ZXI+CmRpZmYgLS1naXQgYS9kb2NzL3NyYy9tYWluL2RvY2Jvb2svc3NlLnhtbCBiL2RvY3Mvc3JjL21haW4vZG9jYm9vay9zc2UueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNDUyZmEKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3NyYy9tYWluL2RvY2Jvb2svc3NlLnhtbApAQCAtMCwwICsxLDEwODAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzwhRE9DVFlQRSBjaGFwdGVyIFs8IUVOVElUWSAlIGVudHMgU1lTVEVNICJqZXJzZXkuZW50IiA+ICVlbnRzOyBdPgorPGNoYXB0ZXIgeG1sbnM9Imh0dHA6Ly9kb2Nib29rLm9yZy9ucy9kb2Nib29rIgorICAgICAgICAgdmVyc2lvbj0iNS4wIgorICAgICAgICAgeG1sOmxhbmc9ImVuIgorICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIgorICAgICAgICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9kb2Nib29rLm9yZy9ucy9kb2Nib29rIGh0dHA6Ly9kb2Nib29rLm9yZy94bWwvNS4wL3hzZC9kb2Nib29rLnhzZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIGh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsueHNkIgorICAgICAgICAgeG1sOmlkPSJzc2UiPgorCisgICAgPHRpdGxlPlNlcnZlci1TZW50IEV2ZW50cyAoU1NFKSBTdXBwb3J0PC90aXRsZT4KKworICAgIDxzZWN0aW9uPgorICAgICAgICA8dGl0bGU+V2hhdCBhcmUgU2VydmVyLVNlbnQgRXZlbnRzPC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEluIGEgc3RhbmRhcmQgSFRUUCByZXF1ZXN0LXJlc3BvbnNlIHNjZW5hcmlvIGEgY2xpZW50IG9wZW5zIGEgY29ubmVjdGlvbiwgc2VuZHMgYSBIVFRQIHJlcXVlc3QgdG8gdGhlIHNlcnZlciAoZm9yCisgICAgICAgICAgICBleGFtcGxlIGEgSFRUUCAmbGl0Lmh0dHAuR0VUOyByZXF1ZXN0KSwgdGhlbiByZWNlaXZlcyBhIEhUVFAgcmVzcG9uc2UgYmFjayBhbmQgdGhlIHNlcnZlciBjbG9zZXMgdGhlIGNvbm5lY3Rpb24gb25jZQorICAgICAgICAgICAgdGhlIHJlc3BvbnNlIGlzIGZ1bGx5IHNlbnQvcmVjZWl2ZWQuIFRoZSBpbml0aWF0aXZlIDxlbXBoYXNpcz5hbHdheXM8L2VtcGhhc2lzPiBjb21lcyBmcm9tIGEgY2xpZW50IHdoZW4gdGhlIGNsaWVudAorICAgICAgICAgICAgcmVxdWVzdHMgYWxsIHRoZSBkYXRhLiBJbiBjb250cmFzdCwgPGVtcGhhc2lzPlNlcnZlci1TZW50IEV2ZW50cyAoU1NFKTwvZW1waGFzaXM+IGlzIGEgbWVjaGFuaXNtIHRoYXQgYWxsb3dzIHNlcnZlcgorICAgICAgICAgICAgdG8gYXN5bmNocm9ub3VzbHkgcHVzaCB0aGUgZGF0YSBmcm9tIHRoZSBzZXJ2ZXIgdG8gdGhlIGNsaWVudCBvbmNlIHRoZSBjbGllbnQtc2VydmVyIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQgYnkgdGhlCisgICAgICAgICAgICBjbGllbnQuIE9uY2UgdGhlIGNvbm5lY3Rpb24gaXMgZXN0YWJsaXNoZWQgYnkgdGhlIGNsaWVudCwgaXQgaXMgdGhlIHNlcnZlciB3aG8gcHJvdmlkZXMgdGhlIGRhdGEgYW5kIGRlY2lkZXMKKyAgICAgICAgICAgIHRvIHNlbmQgaXQgdG8gdGhlIGNsaWVudCB3aGVuZXZlciBuZXcgImNodW5rIiBvZiBkYXRhIGlzIGF2YWlsYWJsZS4gV2hlbiBhIG5ldyBkYXRhIGV2ZW50IG9jY3VycyBvbiB0aGUgc2VydmVyLAorICAgICAgICAgICAgdGhlIGRhdGEgZXZlbnQgaXMgc2VudCBieSB0aGUgc2VydmVyIHRvIHRoZSBjbGllbnQuIFRodXMgdGhlIG5hbWUgU2VydmVyLVNlbnQgRXZlbnRzLiBOb3RlIHRoYXQgYXQgaGlnaCBsZXZlbCB0aGVyZQorICAgICAgICAgICAgYXJlIG1vcmUgdGVjaG5vbG9naWVzIHdvcmtpbmcgb24gdGhpcyBwcmluY2lwbGUsIGEgc2hvcnQgb3ZlcnZpZXcgb2YgdGhlIHRlY2hub2xvZ2llcyBzdXBwb3J0aW5nIHNlcnZlci10by1jbGllbnQKKyAgICAgICAgICAgIGNvbW11bmljYXRpb24gaXMgaW4gdGhpcyBsaXN0OgorCisgICAgICAgICAgICA8dmFyaWFibGVsaXN0PgorICAgICAgICAgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDx0ZXJtPlBvbGxpbmc8L3Rlcm0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpdGggcG9sbGluZyBhIGNsaWVudCByZXBlYXRlZGx5IHNlbmRzIG5ldyByZXF1ZXN0cyB0byBhIHNlcnZlci4gSWYgdGhlIHNlcnZlciBoYXMgbm8gbmV3IGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbiBpdCBzZW5kIGFwcHJvcHJpYXRlIGluZGljYXRpb24gYW5kIGNsb3NlcyB0aGUgY29ubmVjdGlvbi4gVGhlIGNsaWVudCB0aGVuIHdhaXRzIGEgYml0IGFuZCBzZW5kcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFub3RoZXIgcmVxdWVzdCBhZnRlciBzb21lIHRpbWUgKGFmdGVyIG9uZSBzZWNvbmQsIGZvciBleGFtcGxlKS4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKyAgICAgICAgICAgICAgICA8dmFybGlzdGVudHJ5PgorICAgICAgICAgICAgICAgICAgICA8dGVybT5Mb25nLXBvbGxpbmc8L3Rlcm0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpdGggbG9uZy1wb2xsaW5nIGEgY2xpZW50IHNlbmRzIGEgcmVxdWVzdCB0byBhIHNlcnZlci4gSWYgdGhlIHNlcnZlciBoYXMgbm8gbmV3IGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQganVzdCBob2xkcyB0aGUgY29ubmVjdGlvbiBvcGVuIGFuZCB3YWl0cyB1bnRpbCBkYXRhIGlzIGF2YWlsYWJsZS4gT25jZSB0aGUgc2VydmVyIGhhcyBkYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1lc3NhZ2UpIGZvciB0aGUgY2xpZW50LCBpdCB1c2VzIHRoZSBjb25uZWN0aW9uIGFuZCBzZW5kcyBpdCBiYWNrIHRvIHRoZSBjbGllbnQuIFRoZW4gdGhlIGNvbm5lY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBjbG9zZWQuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPC92YXJsaXN0ZW50cnk+CisgICAgICAgICAgICAgICAgPHZhcmxpc3RlbnRyeT4KKyAgICAgICAgICAgICAgICAgICAgPHRlcm0+U2VydmVyLVNlbnQgZXZlbnRzPC90ZXJtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTU0UgaXMgc2ltaWxhciB0byB0aGUgbG9uZy1wb2xsaW5nIG1lY2hhbmlzbSwgZXhjZXB0IGl0IGRvZXMgbm90IHNlbmQgb25seSBvbmUgbWVzc2FnZSBwZXIgY29ubmVjdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgY2xpZW50IHNlbmRzIGEgcmVxdWVzdCBhbmQgc2VydmVyIGhvbGRzIGEgY29ubmVjdGlvbiB1bnRpbCBhIG5ldyBtZXNzYWdlIGlzIHJlYWR5LCB0aGVuIGl0IHNlbmRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIG1lc3NhZ2UgYmFjayB0byB0aGUgY2xpZW50IHdoaWxlIHN0aWxsIGtlZXBpbmcgdGhlIGNvbm5lY3Rpb24gb3BlbiBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGFub3RoZXIgbWVzc2FnZSBvbmNlIGl0IGJlY29tZXMgYXZhaWxhYmxlLiBPbmNlIGEgbmV3IG1lc3NhZ2UgaXMgcmVhZHksIGl0IGlzIHNlbnQgYmFjayB0byB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQgb24gdGhlIHNhbWUgaW5pdGlhbCBjb25uZWN0aW9uLiBDbGllbnQgcHJvY2Vzc2VzIHRoZSBtZXNzYWdlcyBzZW50IGJhY2sgZnJvbSB0aGUgc2VydmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kaXZpZHVhbGx5IHdpdGhvdXQgY2xvc2luZyB0aGUgY29ubmVjdGlvbiBhZnRlciBwcm9jZXNzaW5nIGVhY2ggbWVzc2FnZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbywgU1NFIHR5cGljYWxseSByZXVzZXMgb25lIGNvbm5lY3Rpb24gZm9yIG1vcmUgbWVzc2FnZXMgKGNhbGxlZCBldmVudHMpLiBTU0UgYWxzbyBkZWZpbmVzIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWRpY2F0ZWQgbWVkaWEgdHlwZSB0aGF0IGRlc2NyaWJlcyBhIHNpbXBsZSBmb3JtYXQgb2YgaW5kaXZpZHVhbCBldmVudHMgc2VudCBmcm9tIHRoZSBzZXJ2ZXIgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LiBTU0UgYWxzbyBvZmZlcnMgc3RhbmRhcmQgamF2YXNjcmlwdCBjbGllbnQgQVBJIGltcGxlbWVudGVkIG1vc3QgbW9kZXJuIGJyb3dzZXJzLiBGb3IgbW9yZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWF0aW9uIGFib3V0IFNTRSwgc2VlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaW5rIHhsaW5rOmhyZWY9J2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDkvV0QtZXZlbnRzb3VyY2UtMjAwOTEwMjkvJz5TU0UgQVBJIHNwZWNpZmljYXRpb248L2xpbms+LgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDwvdmFybGlzdGVudHJ5PgorICAgICAgICAgICAgICAgIDx2YXJsaXN0ZW50cnk+CisgICAgICAgICAgICAgICAgICAgIDx0ZXJtPldlYlNvY2tldDwvdGVybT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViU29ja2V0IHRlY2hub2xvZ3kgaXMgZGlmZmVyZW50IGZyb20gcHJldmlvdXMgdGVjaG5vbG9naWVzIGFzIGl0IHByb3ZpZGVzIGEgcmVhbCBmdWxsIGR1cGxleAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uIFRoZSBpbml0aWF0b3IgaXMgYWdhaW4gYSBjbGllbnQgd2hpY2ggc2VuZHMgYSByZXF1ZXN0IHRvIGEgc2VydmVyIHdpdGggYSBzcGVjaWFsIEhUVFAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXIgdGhhdCBpbmZvcm1zIHRoZSBzZXJ2ZXIgdGhhdCB0aGUgSFRUUCBjb25uZWN0aW9uIG1heSBiZSAidXBncmFkZWQiIHRvIGEgZnVsbCBkdXBsZXggVENQL0lQCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViU29ja2V0IGNvbm5lY3Rpb24uIElmIHNlcnZlciBzdXBwb3J0cyBXZWJTb2NrZXQsIGl0IG1heSBjaG9vc2UgdG8gZG8gc28uIE9uY2UgYSBXZWJTb2NrZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uIGlzIGVzdGFibGlzaGVkLCBpdCBjYW4gYmUgdXNlZCBmb3IgYmktZGlyZWN0aW9uYWwgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlci4gQm90aCBjbGllbnQgYW5kIHNlcnZlciBjYW4gdGhlbiBzZW5kIGRhdGEgdG8gdGhlIG90aGVyIHBhcnR5IGF0IHdpbGwgd2hlbmV2ZXIgaXQgaXMgbmVlZGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBjb21tdW5pY2F0aW9uIG9uIHRoZSBuZXcgV2ViU29ja2V0IGNvbm5lY3Rpb24gaXMgbm8gbG9uZ2VyIGJhc2VkIG9uIEhUVFAgcHJvdG9jb2wgYW5kIGNhbiBiZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZWQgZm9yIGV4YW1wbGUgZm9yIGZvciBvbmxpbmUgZ2FtaW5nIG9yIGFueSBvdGhlciBhcHBsaWNhdGlvbnMgdGhhdCByZXF1aXJlIGZhc3QgZXhjaGFuZ2Ugb2Ygc21hbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaHVua3Mgb2YgZGF0YSBpbiBmbG93aW5nIGluIGJvdGggZGlyZWN0aW9ucy4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8L3Zhcmxpc3RlbnRyeT4KKyAgICAgICAgICAgIDwvdmFyaWFibGVsaXN0PgorICAgICAgICA8L3BhcmE+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24+CisgICAgICAgIDx0aXRsZT5XaGVuIHRvIHVzZSBTZXJ2ZXItU2VudCBFdmVudHM8L3RpdGxlPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQXMgZXhwbGFpbmVkIGFib3ZlLCBTU0UgaXMgYSB0ZWNobm9sb2d5IHRoYXQgYWxsb3dzIGNsaWVudHMgdG8gc3Vic2NyaWJlIHRvIGV2ZW50IG5vdGlmaWNhdGlvbnMgdGhhdCBvcmlnaW5hdGUgb24KKyAgICAgICAgICAgIGEgc2VydmVyLiBTZXJ2ZXIgZ2VuZXJhdGVzIG5ldyBldmVudHMgYW5kIHNlbmRzIHRoZXNlIGV2ZW50cyBiYWNrIHRvIHRoZSBjbGllbnRzIHN1YnNjcmliZWQgdG8gcmVjZWl2ZSB0aGUKKyAgICAgICAgICAgIG5vdGlmaWNhdGlvbnMuIEluIG90aGVyIHdvcmRzLCBTU0Ugb2ZmZXJzIGEgc29sdXRpb24gZm9yIGEgb25lLXdheSBwdWJsaXNoLXN1YnNjcmliZSBtb2RlbC4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEEgZ29vZCBleGFtcGxlIG9mIHRoZSB1c2UgY2FzZSB3aGVyZSBTU0UgY2FuIGJlIHVzZWQgaXMgYSBzaW1wbGUgbWVzc2FnZSBleGNoYW5nZSBSRVNUZnVsIHNlcnZpY2UuIENsaWVudHMKKyAgICAgICAgICAgICZsaXQuaHR0cC5QT1NUOyBuZXcgbWVzc2FnZXMgdG8gdGhlIHNlcnZpY2UgYW5kIHN1YnNjcmliZSB0byByZWNlaXZlIG1lc3NhZ2VzIGZyb20gb3RoZXIgY2xpZW50cy4KKyAgICAgICAgICAgIExldCdzIGNhbGwgdGhlIHJlc291cmNlIDxsaXRlcmFsPm1lc3NhZ2VzPC9saXRlcmFsPi4gV2hpbGUgJmxpdC5odHRwLlBPU1Q7aW5nIGEgbmV3IG1lc3NhZ2UgdG8gdGhpcyByZXNvdXJjZSBpbnZvbHZlcworICAgICAgICAgICAgYSB0eXBpY2FsIEhUVFAgcmVxdWVzdC1yZXNwb25zZSBjb21tdW5pY2F0aW9uIGJldHdlZW4gYSBjbGllbnQgYW5kIHRoZSA8bGl0ZXJhbD5tZXNzYWdlczwvbGl0ZXJhbD4gcmVzb3VyY2UsCisgICAgICAgICAgICBzdWJzY3JpYmluZyB0byByZWNlaXZlIGFsbCBuZXcgbWVzc2FnZSBub3RpZmljYXRpb25zIHdvdWxkIGJlIGhhcmQgYW5kIGltcHJhY3RpY2FsIHRvIG1vZGVsIHdpdGggYSBzZXF1ZW5jZSBvZgorICAgICAgICAgICAgc3RhbmRhcmQgcmVxdWVzdC1yZXNwb25zZSBtZXNzYWdlIGV4Y2hhbmdlcy4gVXNpbmcgU2VydmVyLXNlbnQgZXZlbnRzIHByb3ZpZGVzIGEgbXVjaCBtb3JlIHByYWN0aWNhbCBhcHByb2FjaCBoZXJlLgorICAgICAgICAgICAgWW91IGNhbiB1c2UgU1NFIHRvIGxldCBjbGllbnRzIHN1YnNjcmliZSB0byB0aGUgPGxpdGVyYWw+bWVzc2FnZXM8L2xpdGVyYWw+IHJlc291cmNlIHZpYSBzdGFuZGFyZCAmbGl0Lmh0dHAuR0VUOworICAgICAgICAgICAgcmVxdWVzdCAodXNlIGEgU1NFIGNsaWVudCBBUEksIGZvciBleGFtcGxlIGphdmFzY3JpcHQgQVBJIG9yIEplcnNleSBDbGllbnQgU1NFIEFQSSkgYW5kIGxldCB0aGUgc2VydmVyIGJyb2FkY2FzdAorICAgICAgICAgICAgbmV3IG1lc3NhZ2VzIHRvIGFsbCBjb25uZWN0ZWQgY2xpZW50cyBpbiB0aGUgZm9ybSBvZiBpbmRpdmlkdWFsIGV2ZW50cyAoaW4gb3VyIGNhc2UgdXNpbmcgSmVyc2V5IFNlcnZlciBTU0UgQVBJKS4KKyAgICAgICAgICAgIE5vdGUgdGhhdCB3aXRoIEplcnNleSBhIFNTRSBzdXBwb3J0IGlzIGltcGxlbWVudGVkIGFzIGFuIHVzdWFsIEpBWC1SUyByZXNvdXJjZSBtZXRob2QuIFRoZXJlJ3Mgbm8gbmVlZCB0byBkbyBhbnl0aGluZworICAgICAgICAgICAgc3BlY2lhbCB0byBwcm92aWRlIGEgU1NFIHN1cHBvcnQgaW4geW91ciBKZXJzZXkvSkFYLVJTIGFwcGxpY2F0aW9ucywgeW91ciBTU0UtZW5hYmxlZCByZXNvdXJjZXMgYXJlIGEgc3RhbmRhcmQgcGFydCBvZgorICAgICAgICAgICAgeW91ciBSRVNUZnVsIFdlYiBhcHBsaWNhdGlvbiB0aGF0IGRlZmluZXMgdGhlIFJFU1QgQVBJIG9mIHlvdXIgYXBwbGljYXRpb24uIFRoZSBmb2xsb3dpbmcgY2hhcHRlcnMgZGVzY3JpYmVzIFNTRQorICAgICAgICAgICAgc3VwcG9ydCBpbiBKZXJzZXkgaW4gbW9yZSBkZXRhaWxzLgorICAgICAgICA8L3BhcmE+CisKKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiB4bWw6aWQ9ImpheHJzLXNzZS1hcGktb3ZlcnZpZXciPgorICAgICAgICA8dGl0bGU+U2VydmVyLVNlbnQgRXZlbnRzIEFQSTwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgSW4gcHJldmlvdXMgSkFYLVJTIHZlcnNpb25zLCBubyBzdGFuZGFyZCBBUEkgZm9yIHNlcnZlci1zZW50IGV2ZW50cyB3YXMgZGVmaW5lZC4gVGhlIFNTRSBzdXBwb3J0IGJ1bmRsZWQgd2l0aAorICAgICAgICAgICAgSmVyc2V5IHdhcyBKZXJzZXktc3BlY2lmaWMuIFdpdGggSkFYLVJTIDIuMSwgc2l0dWF0aW9uIGNoYW5nZWQgYW5kIFNTRSBBUEkgaXMgd2VsbCBkZWZpbmVkIGluIHRoZQorICAgICAgICAgICAgPGxpdGVyYWw+amF2YXgud3MucnMuc3NlPC9saXRlcmFsPgorICAgICAgICAgICAgcGFja2FnZS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT5Gb2xsb3dpbmcgY2hhcHRlcnMgd2lsbCBkZXNjcmliZSB0aGUgbmV3IFNTRSBBUEkuIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSByZWFzb25zLCB0aGUgb3JpZ2luYWwKKyAgICAgICAgICAgIEplcnNleS1zcGVjaWZpYyBBUEkgcmVtYWlucyB2YWxpZCBhbmQgd2lsbCBiZSBkZXNjcmliZWQgaW4KKyAgICAgICAgICAgIDx4cmVmIGxpbmtlbmQ9Im92ZXJ2aWV3LWplcnNleS1zcGVjaWZpYyIvPgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgSmVyc2V5IGNvbnRhaW5zIHN1cHBvcnQgZm9yIFNTRSBmb3IgYm90aCAtIHNlcnZlciBhbmQgY2xpZW50LiBTU0UgaW4gSmVyc2V5IGlzIGltcGxlbWVudGVkIGFzIGFuIGV4dGVuc2lvbgorICAgICAgICAgICAgc3VwcG9ydGluZyBhIG5ldyBtZWRpYSB0eXBlIHVzaW5nIGV4aXN0aW5nICJjaHVua2VkIiBtZXNzYWdlcyBzdXBwb3J0LiBIb3dldmVyLCBpbiBjb250cmFzdCB0byB0aGUgb3JpZ2luYWwgQVBJLAorICAgICAgICAgICAgdGhlIGluc3RhbmNlcyBvZiBTU0UgcmVsYXRlZCBjbGFzc2VzIGFyZSBub3QgdG8gYmUgb2J0YWluZWQgbWFudWFsbHkgYnkgaW52b2tpbmcgY29uc3RydWN0b3JzLCBub3IgdG8gYmUgZGlyZWN0bHkKKyAgICAgICAgICAgIHJldHVybmVkIGZyb20gdGhlIHJlc291cmNlIG1ldGhvZHMuCisgICAgICAgICAgICBBY3R1YWxseSwgdGhlIGltcGxlbWVudGluZyBjbGFzc2VzIGluIHRoZSA8bGl0ZXJhbD5qZXJzZXkubWVkaWEuc3NlLmludGVybmFsPC9saXRlcmFsPiBwYWNrYWdlIHNob3VsZCBuZXZlciBiZSBuZWVkZWQKKyAgICAgICAgICAgIHRvIGJlIGltcG9ydGVkLiBUaGUgb25seSBBUEkgdG8gYmUgdXNlZCBpcyBkaXJlY3RseSBpbiB0aGUgSkFYLVJTIHBhY2thZ2UgKDxsaXRlcmFsPmphdmF4LndzLnJzLnNzZTwvbGl0ZXJhbD4pLgorICAgICAgICAgICAgT25seSBidWlsZGVycyBpbiB0aGUgQVBJIGFsb25nIHdpdGggZGVwZW5kZW5jeSBpbmplY3Rpb24gc2hvdWxkIGJlIHVzZWQgYW5kIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgZW50aXJlCisgICAgICAgICAgICBmdW5jdGlvbmFsaXR5LgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgSW4gb3JkZXIgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIFNTRSBzdXBwb3J0LCB0aGUgPGxpdGVyYWw+amVyc2V5LW1lZGlhLXNzZTwvbGl0ZXJhbD4gbW9kdWxlIGhhcyB0byBiZSBvbiBjbGFzc3BhdGguCisgICAgICAgICAgICBJbiBtYXZlbiwgdGhpcyBjYW4gYmUgYWNoaWV2ZWQgYnkgYWRkaW5nIHRoZSBkZXBlbmRlbmN5IHRvIHRoZSA8ZW1waGFzaXM+U1NFIG1lZGlhIHR5cGUgbW9kdWxlPC9lbXBoYXNpcz46CisgICAgICAgICAgICA8ZXhhbXBsZSB4bWw6aWQ9InNzZS1kZXBlbmRlbmN5LWpheHJzIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+QWRkaW5nIHRoZSBTU0UgZGVwZW5kZW5jeTwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJ4bWwiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj48IVtDREFUQVs8ZGVwZW5kZW5jeT4KKyAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtc3NlPC9hcnRpZmFjdElkPgorPC9kZXBlbmRlbmN5Pl1dPjwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgICAgICBUaGUgJmxpdC5qYXhycy5jb3JlLkZlYXR1cmU7IGRlZmluZWQgaW4gdGhlIG1vZHVsZSBpcyAoZm9yY2VkKSBhdXRvLWRpc2NvdmVyYWJsZSwgd2hpY2ggbWVhbnMgaGF2aW5nIHRoZSBtb2R1bGUgb24KKyAgICAgICAgICAgIGNsYXNzcGF0aCBpcyBzdWZmaWNpZW50LCBubyBuZWVkIHRvIGZ1cnRoZXIgcmVnaXN0ZXIgaXQgaW4gdGhlIGNvZGUuCisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+CisgICAgPHNlY3Rpb24+CisgICAgICAgIDx0aXRsZT5JbXBsZW1lbnRpbmcgU1NFIHN1cHBvcnQgaW4gYSBKQVgtUlMgcmVzb3VyY2UgKHdpdGggSkFYLVJTIFNTRSBBUEkpPC90aXRsZT4KKyAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICA8dGl0bGU+U2ltcGxlIFNTRSByZXNvdXJjZSBtZXRob2Q8L3RpdGxlPgorICAgICAgICAgICAgPGV4YW1wbGUgeG1sOmlkPSJleGFtcGxlLXNpbXBsZS1zc2UtamF4cnMiPgorICAgICAgICAgICAgICAgIDx0aXRsZT5TaW1wbGUgU1NFIHJlc291cmNlIG1ldGhvZDwvdGl0bGU+CisgICAgICAgICAgICAgICAgQXMgbWVudGlvbmVkIGFib3ZlLCB0aGUgU1NFIHJlbGF0ZWQgYXJlIG5vdCBpbnN0YW50aWF0ZWQgZGlyZWN0bHkuIEluIHRoaXMgY2FzZSwgSmVyc2V5IHRha2VzIGNhcmUgb2YgdGhlCisgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzIGFuZCBpbmplY3RzIHRoZSAmamF4cnMyMS5zc2UuU3NlRXZlbnRTaW5rOyAocmVwcmVzZW50cyB0aGUgb3V0cHV0KSBhbmQgJmpheHJzMjEuc3NlLlNzZTsgKHByb3ZpZGVzCisgICAgICAgICAgICAgICAgZmFjdG9yeSBtZXRob2RzIGZvciBvdGhlciBTU0UgcmVsYXRlZCB0eXBlcywgaW4gdGhpcyBjYXNlIGl0IGlzIHVzZWQgdG8gcmV0cmlldmUgdGhlIGV2ZW50IGJ1aWxkZXIpLgorICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPi4uLgoraW1wb3J0IGphdmF4LndzLnJzLnNzZS5Tc2U7CitpbXBvcnQgamF2YXgud3MucnMuc3NlLlNzZUV2ZW50U2luazsKK2ltcG9ydCBqYXZheC53cy5ycy5zc2UuT3V0Ym91bmRTc2VFdmVudDsKKy4uLgorCitAUGF0aCgiZXZlbnRzIikKK3B1YmxpYyBzdGF0aWMgY2xhc3MgU3NlUmVzb3VyY2UgeworCisgICAgQEdFVAorICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuU0VSVkVSX1NFTlRfRVZFTlRTKQorICAgIHB1YmxpYyB2b2lkIGdldFNlcnZlclNlbnRFdmVudHMoQENvbnRleHQgU3NlRXZlbnRTaW5rIGV2ZW50U2luaywgQENvbnRleHQgU3NlIHNzZSkgeworICAgICAgICBuZXcgVGhyZWFkKCgpIC0mZ3Q7IHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpICZsdDsgMTA7IGkrKykgeworICAgICAgICAgICAgICAgIC8vIC4uLiBjb2RlIHRoYXQgd2FpdHMgMSBzZWNvbmQKKyAgICAgICAgICAgICAgICBmaW5hbCBPdXRib3VuZFNzZUV2ZW50IGV2ZW50ID0gc3NlLm5ld0V2ZW50QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgIC5uYW1lKCJtZXNzYWdlLXRvLWNsaWVudCIpCisgICAgICAgICAgICAgICAgICAgIC5kYXRhKFN0cmluZy5jbGFzcywgIkhlbGxvIHdvcmxkICIgKyBpICsgIiEiKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICBldmVudFNpbmsub25OZXh0KGV2ZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSkuc3RhcnQoKTsKKyAgICB9Cit9CisgICAgICAgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFRoZSBjb2RlIGFib3ZlIGRlZmluZXMgdGhlIHJlc291cmNlIGRlcGxveWVkIG9uIFVSSSAiL2V2ZW50cyIuIFRoaXMgcmVzb3VyY2UgaGFzIGEgc2luZ2xlCisgICAgICAgICAgICAgICAgPGxpdGVyYWw+QEdFVDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICByZXNvdXJjZSBtZXRob2Qgd2hpY2ggPGVtcGhhc2lzPnJldHVybnMgdm9pZDwvZW1waGFzaXM+LiBUaGlzIGlzIGFuIGltcG9ydGVkIGRpZmZlcmVuY2UKKyAgICAgICAgICAgICAgICBhZ2FpbnN0IHRoZSBvcmlnaW5hbCBBUEkuIEl0IGlzIEplcnNleSdzIHJlc3BvbnNpYmlsaXR5IHRvIGJpbmQgdGhlIGluamVjdGVkIDxsaXRlcmFsPlNzZUV2ZW50U2luazwvbGl0ZXJhbD4gdG8KKyAgICAgICAgICAgICAgICB0aGUgb3V0cHV0IGNoYWluLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgQWZ0ZXIgdGhlIDxsaXRlcmFsPlNzZUV2ZW50SW5wdXQ8L2xpdGVyYWw+IGlzICJyZXR1cm5lZCIgZnJvbSB0aGUgbWV0aG9kLCB0aGUgSmVyc2V5IHJ1bnRpbWUgcmVjb2duaXplcyB0aGF0IHRoaXMKKyAgICAgICAgICAgICAgICBpcyBhICZsaXQuamVyc2V5LnNlcnZlci5DaHVua2VkT3V0cHV0OyBleHRlbnNpb24gYW5kIGRvZXMgbm90IGNsb3NlIHRoZSBjbGllbnQgY29ubmVjdGlvbiBpbW1lZGlhdGVseS4gSW5zdGVhZCwgaXQKKyAgICAgICAgICAgICAgICB3cml0ZXMgdGhlIEhUVFAgaGVhZGVycyB0byB0aGUgcmVzcG9uc2Ugc3RyZWFtIGFuZCB3YWl0cyBmb3IgbW9yZSBjaHVua3MgKFNTRSBldmVudHMpIHRvIGJlIHNlbnQuIEF0IHRoaXMgcG9pbnQKKyAgICAgICAgICAgICAgICB0aGUgY2xpZW50IGNhbiByZWFkIGhlYWRlcnMgYW5kIHN0YXJ0cyBsaXN0ZW5pbmcgZm9yIGluZGl2aWR1YWwgZXZlbnRzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgSW4gdGhlPHhyZWYgbGlua2VuZD0iZXhhbXBsZS1zaW1wbGUtc3NlLWpheHJzIi8+LCB0aGUgcmVzb3VyY2UgbWV0aG9kIGNyZWF0ZXMgYSBuZXcgdGhyZWFkIHRoYXQgc2VuZHMgYQorICAgICAgICAgICAgICAgIHNlcXVlbmNlIG9mIDEwIGV2ZW50cy4gVGhlcmUgaXMgYSAxIHNlY29uZCBkZWxheSBiZXR3ZWVuIHR3byBzdWJzZXF1ZW50IGV2ZW50cyBhcyBpbmRpY2F0ZWQgaW4gYSBjb21tZW50LiBFYWNoCisgICAgICAgICAgICAgICAgZXZlbnQgaXMgcmVwcmVzZW50ZWQgYnkgPGxpdGVyYWw+amF2YXgud3MucnMuc3NlLk91dGJvdW5kU3NlRXZlbnQ8L2xpdGVyYWw+IHR5cGUgYW5kIGlzIGJ1aWx0IHdpdGggYSBoZWxwIG9mIGEKKyAgICAgICAgICAgICAgICBwcm92aWRlZCA8bGl0ZXJhbD5CdWlsZGVyPC9saXRlcmFsPi4gVGhlIDxsaXRlcmFsPkJ1aWxkZXI8L2xpdGVyYWw+IGlzIG9idGFpbiB2aWEgdGhlIGluamVjdGVkIGluc3RhbmNlCisgICAgICAgICAgICAgICAgKGFjdHVhbGx5LCBpdCBpcyBhIHNpbmdsZXRvbikgb2YgPGxpdGVyYWw+amF2YXgud3MucnMuc3NlLlNzZTwvbGl0ZXJhbD4gKHRoZQorICAgICAgICAgICAgICAgIDxsaXRlcmFsPm5ld0V2ZW50QnVpbGRlcigpPC9saXRlcmFsPgorICAgICAgICAgICAgICAgIG1ldGhvZC4gVGhlIDxsaXRlcmFsPk91dGJvdW5kU3NlRXZlbnQ8L2xpdGVyYWw+IGltcGxlbWVudGF0aW9uIHJlZmxlY3RzIHRoZSBzdGFuZGFyZGl6ZWQgZm9ybWF0IG9mCisgICAgICAgICAgICAgICAgU1NFIG1lc3NhZ2VzIGFuZCBjb250YWlucyBwcm9wZXJ0aWVzIHRoYXQgcmVwcmVzZW50IDxsaXRlcmFsPm5hbWU8L2xpdGVyYWw+IChmb3IgbmFtZWQgZXZlbnRzKSwKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbD5jb21tZW50PC9saXRlcmFsPiwgPGxpdGVyYWw+ZGF0YTwvbGl0ZXJhbD4gb3IgPGxpdGVyYWw+aWQ8L2xpdGVyYWw+LiBUaGUgY29kZSBhbHNvIHNldHMgdGhlCisgICAgICAgICAgICAgICAgZXZlbnQgZGF0YSBtZWRpYSB0eXBlIHVzaW5nIHRoZSA8bGl0ZXJhbD5tZWRpYVR5cGUoTWVkaWFUeXBlKTwvbGl0ZXJhbD4gbWV0aG9kIG9uIHRoZQorICAgICAgICAgICAgICAgIDxsaXRlcmFsPmV2ZW50QnVpbGRlcjwvbGl0ZXJhbD4uIFRoZSBtZWRpYSB0eXBlLCB0b2dldGhlciB3aXRoIHRoZSBkYXRhIHR5cGUgc2V0IGJ5IHRoZQorICAgICAgICAgICAgICAgIDxsaXRlcmFsPmRhdGEoQ2xhc3MsIE9iamVjdD48L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgbWV0aG9kIChpbiBvdXIgY2FzZSA8bGl0ZXJhbD5TdHJpbmcuY2xhc3M8L2xpdGVyYWw+KSwgaXMgdXNlZAorICAgICAgICAgICAgICAgIGZvciBzZXJpYWxpemF0aW9uIG9mIHRoZSBldmVudCBkYXRhLiBOb3RlIHRoYXQgdGhlIGV2ZW50IGRhdGEgbWVkaWEgdHlwZSB3aWxsIG5vdCBiZSB3cml0dGVuIHRvIGFueSBoZWFkZXJzIGFzCisgICAgICAgICAgICAgICAgdGhlIHJlc3BvbnNlIDxsaXRlcmFsPkNvbnRlbnQtdHlwZTwvbGl0ZXJhbD4gaGVhZGVyIGlzIGFscmVhZHkgZGVmaW5lZCBieSB0aGUgJmxpdC5qYXhycy5Qcm9kdWNlczsgYW5kIHNldCB0bworICAgICAgICAgICAgICAgIDxsaXRlcmFsPiJ0ZXh0L2V2ZW50LXN0cmVhbSI8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgdXNpbmcgY29uc3RhbnQgZnJvbSB0aGUgJmxpdC5qYXhycy5jb3JlLk1lZGlhVHlwZTsuCisgICAgICAgICAgICAgICAgVGhlIGV2ZW50IG1lZGlhIHR5cGUgaXMgdXNlZCBmb3Igc2VyaWFsaXphdGlvbiBvZiBldmVudCA8bGl0ZXJhbD5kYXRhPC9saXRlcmFsPi4gRXZlbnQgZGF0YSBtZWRpYSB0eXBlIGFuZCBKYXZhCisgICAgICAgICAgICAgICAgdHlwZSBhcmUgdXNlZCB0byBzZWxlY3QgdGhlIHByb3BlciAmamF4cnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOyBmb3IgZXZlbnQgZGF0YSBzZXJpYWxpemF0aW9uIGFuZCBhcmUgcGFzc2VkCisgICAgICAgICAgICAgICAgdG8gdGhlIHNlbGVjdGVkIHdyaXRlciB0aGF0IHNlcmlhbGl6ZXMgdGhlIGV2ZW50IDxsaXRlcmFsPmRhdGE8L2xpdGVyYWw+IGNvbnRlbnQuIEluIG91ciBjYXNlIHRoZSBzdHJpbmcKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbD4iSGVsbG8gd29ybGQgIiArIGkgKyAiISI8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgaXMgc2VyaWFsaXplZCBhcyA8bGl0ZXJhbD4idGV4dC9wbGFpbiI8L2xpdGVyYWw+LiBJbiBldmVudAorICAgICAgICAgICAgICAgIDxsaXRlcmFsPmRhdGE8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgeW91IGNhbiBzZW5kIGFueSBKYXZhIGVudGl0eSBhbmQgYXNzb2NpYXRlIGl0IHdpdGggYW55IG1lZGlhIHR5cGUgdGhhdCB5b3Ugd291bGQgYmUgYWJsZQorICAgICAgICAgICAgICAgIHRvIHNlcmlhbGl6ZSB3aXRoIGFuIGF2YWlsYWJsZSAmbGl0LmpheHJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsuIFR5cGljYWxseSwgeW91IG1heSB3YW50IHRvIHNlbmQgZS5nLiBKU09OIGRhdGEsCisgICAgICAgICAgICAgICAgc28geW91IHdvdWxkIGZpbGwgdGhlIDxsaXRlcmFsPmRhdGE8L2xpdGVyYWw+IHdpdGggYSBKQVhCIGFubm90YXRlZCBiZWFuIGluc3RhbmNlIGFuZCBkZWZpbmUgbWVkaWEgdHlwZSB0byBKU09OLgorICAgICAgICAgICAgICAgIDxub3RlPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSBldmVudCBtZWRpYSB0eXBlIGlzIG5vdCBzZXQgZXhwbGljaXRseSwgdGhlIDxsaXRlcmFsPiJ0ZXh0L3BsYWluIjwvbGl0ZXJhbD4gbWVkaWEgdHlwZSBpcyB1c2VkCisgICAgICAgICAgICAgICAgICAgICAgICBieSBkZWZhdWx0LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9ub3RlPgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgT25jZSBhbiBvdXRib3VuZCBldmVudCBpcyByZWFkeSwgaXQgY2FuIGJlIHdyaXR0ZW4gdG8gdGhlIDxsaXRlcmFsPkV2ZW50U2luazwvbGl0ZXJhbD4uIEF0IHRoYXQgcG9pbnQgdGhlIGV2ZW50CisgICAgICAgICAgICAgICAgaXMgc2VyaWFsaXplZCBieSBpbnRlcm5hbCAmbGl0LmplcnNleS5zc2UuT3V0Ym91bmRFdmVudFdyaXRlcjsgd2hpY2ggdXNlcyBhbiBhcHByb3ByaWF0ZQorICAgICAgICAgICAgICAgICZsaXQuamF4cnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOyB0byBzZXJpYWxpemUgdGhlIDxsaXRlcmFsPiJIZWxsbyB3b3JsZCAiICsgaSArICIhIjwvbGl0ZXJhbD4gc3RyaW5nLiBZb3UgY2FuCisgICAgICAgICAgICAgICAgc2VuZCBhcyBtYW55IG1lc3NhZ2VzIGFzIHlvdSBsaWtlLiBBdCB0aGUgZW5kIG9mIHRoZSB0aHJlYWQgZXhlY3V0aW9uIHRoZSByZXNwb25zZSBpcyBjbG9zZWQgd2hpY2ggYWxzbyBjbG9zZXMKKyAgICAgICAgICAgICAgICB0aGUgY29ubmVjdGlvbiB0byB0aGUgY2xpZW50LiBBZnRlciB0aGF0LCBubyBtb3JlIG1lc3NhZ2VzIGNhbiBiZSBzZW50IHRvIHRoZSBjbGllbnQgb24gdGhpcyBjb25uZWN0aW9uLiBJZiB0aGUKKyAgICAgICAgICAgICAgICBjbGllbnQgd291bGQgbGlrZSB0byByZWNlaXZlIG1vcmUgbWVzc2FnZXMsIGl0IHdvdWxkIGhhdmUgdG8gc2VuZCBhIG5ldyByZXF1ZXN0IHRvIHRoZSBzZXJ2ZXIgdG8gaW5pdGlhdGUgYQorICAgICAgICAgICAgICAgIG5ldyBTU0Ugc3RyZWFtaW5nIGNvbm5lY3Rpb24uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBBIGNsaWVudCBjb25uZWN0aW5nIHRvIG91ciBTU0UtZW5hYmxlZCByZXNvdXJjZSB3aWxsIHJlY2VpdmUgdGhlIGZvbGxvd2luZyBkYXRhIGZyb20gdGhlIGVudGl0eSBzdHJlYW06CisKKyAgICAgICAgICAgICAgICA8c2NyZWVuIGxhbmd1YWdlPSJ0ZXh0IiBsaW5lbnVtYmVyaW5nPSJ1bm51bWJlcmVkIj5ldmVudDogbWVzc2FnZS10by1jbGllbnQKK2RhdGE6IEhlbGxvIHdvcmxkIDAhCisKK2V2ZW50OiBtZXNzYWdlLXRvLWNsaWVudAorZGF0YTogSGVsbG8gd29ybGQgMSEKKworZXZlbnQ6IG1lc3NhZ2UtdG8tY2xpZW50CitkYXRhOiBIZWxsbyB3b3JsZCAyIQorCitldmVudDogbWVzc2FnZS10by1jbGllbnQKK2RhdGE6IEhlbGxvIHdvcmxkIDMhCisKK2V2ZW50OiBtZXNzYWdlLXRvLWNsaWVudAorZGF0YTogSGVsbG8gd29ybGQgNCEKKworZXZlbnQ6IG1lc3NhZ2UtdG8tY2xpZW50CitkYXRhOiBIZWxsbyB3b3JsZCA1IQorCitldmVudDogbWVzc2FnZS10by1jbGllbnQKK2RhdGE6IEhlbGxvIHdvcmxkIDYhCisKK2V2ZW50OiBtZXNzYWdlLXRvLWNsaWVudAorZGF0YTogSGVsbG8gd29ybGQgNyEKKworZXZlbnQ6IG1lc3NhZ2UtdG8tY2xpZW50CitkYXRhOiBIZWxsbyB3b3JsZCA4IQorCitldmVudDogbWVzc2FnZS10by1jbGllbnQKK2RhdGE6IEhlbGxvIHdvcmxkIDkhCisgICAgICAgICAgICAgICAgPC9zY3JlZW4+CisKKyAgICAgICAgICAgICAgICBFYWNoIG1lc3NhZ2UgaXMgcmVjZWl2ZWQgd2l0aCBhIGRlbGF5IG9mIG9uZSBzZWNvbmQuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgSWYgeW91IGhhdmUgd29ya2VkIHdpdGggc3RyZWFtcyBpbiBKQVgtUlMsIHlvdSBtYXkgd29uZGVyIHdoYXQgaXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgorICAgICAgICAgICAgICAgICAgICAmamVyc2V5LnNlcnZlci5DaHVua2VkT3V0cHV0OyBhbmQgJmpheHJzLmNvcmUuU3RyZWFtaW5nT3V0cHV0Oy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICZsaXQuamVyc2V5LnNlcnZlci5DaHVua2VkT3V0cHV0OyBpcyBKZXJzZXktc3BlY2lmaWMgQVBJLiBJdCBsZXRzIHlvdSBzZW5kICJjaHVua3MiIG9mIGRhdGEgd2l0aG91dCBjbG9zaW5nCisgICAgICAgICAgICAgICAgICAgIHRoZSBjbGllbnQgY29ubmVjdGlvbiB1c2luZyBzZXJpZXMgb2YgY29udmVuaWVudCBjYWxscyB0byA8bGl0ZXJhbD5DaHVua2VkT3V0cHV0LndyaXRlPC9saXRlcmFsPiBtZXRob2RzCisgICAgICAgICAgICAgICAgICAgIHRoYXQgdGFrZSBQT0pPICsgY2h1bmsgbWVkaWEgdHlwZSBhcyBhbiBpbnB1dCBhbmQgdGhlbiB1c2UgdGhlIGNvbmZpZ3VyZWQgSkFYLVJTCisgICAgICAgICAgICAgICAgICAgICZsaXQuamF4cnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOyBwcm92aWRlcnMgdG8gZmlndXJlIG91dCB0aGUgcHJvcGVyIHdheSBvZiBzZXJpYWxpemluZyBlYWNoIGNodW5rIFBPSk8KKyAgICAgICAgICAgICAgICAgICAgdG8gYnl0ZXMuIEFkZGl0aW9uYWxseSwgJmxpdC5qZXJzZXkuc2VydmVyLkNodW5rZWRPdXRwdXQ7IHdyaXRlcyBjYW4gYmUgaW52b2tlZCBtdWx0aXBsZSB0aW1lcyBvbiB0aGUgc2FtZQorICAgICAgICAgICAgICAgICAgICBvdXRib3VuZCByZXNwb25zZSBjb25uZWN0aW9uLCBpLmUuIGluZGl2aWR1YWwgY2h1bmtzIGFyZSB3cml0dGVuIGluIGVhY2ggd3JpdGUsIG5vdCB0aGUgZnVsbCByZXNwb25zZSBlbnRpdHkuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAmbGl0LmpheHJzLmNvcmUuU3RyZWFtaW5nT3V0cHV0OyBpcywgb24gdGhlIG90aGVyIGhhbmQsIGEgbG93IGxldmVsIEpBWC1SUyBBUEkgdGhhdCB3b3JrcyB3aXRoIGJ5dGVzCisgICAgICAgICAgICAgICAgICAgIGRpcmVjdGx5LiBZb3UgaGF2ZSB0byBpbXBsZW1lbnQgJmxpdC5qYXhycy5jb3JlLlN0cmVhbWluZ091dHB1dDsgaW50ZXJmYWNlIHlvdXJzZWxmLiBBbHNvLCBpdHMKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+d3JpdGUoT3V0cHV0U3RyZWFtKTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kIHdpbGwgYmUgaW52b2tlZCBieSBKQVgtUlMgcnVudGltZSBvbmx5IG9uY2UgcGVyIHJlc3BvbnNlCisgICAgICAgICAgICAgICAgICAgIGFuZCB0aGUgY2FsbCB0byB0aGlzIG1ldGhvZCBpcyBibG9ja2luZywgaS5lLiB0aGUgbWV0aG9kIGlzIGV4cGVjdGVkIHRvIHdyaXRlIHRoZSBlbnRpcmUgZW50aXR5IGJvZHkKKyAgICAgICAgICAgICAgICAgICAgYmVmb3JlIHJldHVybmluZy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L25vdGU+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICA8dGl0bGU+QnJvYWRjYXN0aW5nIHdpdGggSmVyc2V5IFNTRTwvdGl0bGU+CisKKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEpBWC1SUyBTU0UgQVBJIGRlZmluZXMgJmplcnNleS5zc2UuU3NlQnJvYWRjYXN0ZXI7IHdoaWNoIGFsbG93cyB0byBicm9hZGNhc3QgaW5kaXZpZHVhbCBldmVudHMgdG8gbXVsdGlwbGUKKyAgICAgICAgICAgICAgICBjbGllbnRzLiBBIHNpbXBsZSBicm9hZGNhc3RpbmcgaW1wbGVtZW50YXRpb24gaXMgc2hvd24gaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOgorCisgICAgICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5Ccm9hZGNhc3RpbmcgU1NFIG1lc3NhZ2VzICh3aXRoIEpBWC1SUyAyLjEgQVBJKTwvdGl0bGU+CisgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPi4uLgoraW1wb3J0IGphdmF4LndzLnJzLnNzZS5Tc2U7CitpbXBvcnQgamF2YXgud3MucnMuc3NlLlNzZUV2ZW50U2luazsKK2ltcG9ydCBqYXZheC53cy5ycy5zc2UuU3NlQnJvYWRjYXN0ZXI7CisuLi4KKworQFNpbmdsZXRvbgorQFBhdGgoImJyb2FkY2FzdCIpCitwdWJsaWMgc3RhdGljIGNsYXNzIEJyb2FkY2FzdGVyUmVzb3VyY2UgeworICAgIHByaXZhdGUgU3NlIHNzZTsKKyAgICBwcml2YXRlIFNzZUJyb2FkY2FzdGVyIGJyb2FkY2FzdGVyOworCisgICAgcHVibGljIEJyb2FkY2FzdGVyUmVzb3VyY2UoQENvbnRleHQgZmluYWwgU3NlIHNzZSkgeworICAgICAgICB0aGlzLnNzZSA9IHNzZTsKKyAgICAgICAgdGhpcy5icm9hZGNhc3RlciA9IHNzZS5uZXdCcm9hZGNhc3RlcigpOworICAgIH0KKworICAgIEBQT1NUCisgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgIEBDb25zdW1lcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICBwdWJsaWMgU3RyaW5nIGJyb2FkY2FzdE1lc3NhZ2UoU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgZmluYWwgT3V0Ym91bmRTc2VFdmVudCBldmVudCA9IHNzZS5uZXdFdmVudEJ1aWxkZXIoKQorICAgICAgICAgICAgLm5hbWUoIm1lc3NhZ2UiKQorICAgICAgICAgICAgLm1lZGlhVHlwZShNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKQorICAgICAgICAgICAgLmRhdGEoU3RyaW5nLmNsYXNzLCBtZXNzYWdlKQorICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAgICAgYnJvYWRjYXN0ZXIuYnJvYWRjYXN0KGV2ZW50KTsKKworICAgICAgICByZXR1cm4gIk1lc3NhZ2UgJyIgKyBtZXNzYWdlICsgIicgaGFzIGJlZW4gYnJvYWRjYXN0LiI7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuU0VSVkVSX1NFTlRfRVZFTlRTKQorICAgIHB1YmxpYyB2b2lkIGxpc3RlblRvQnJvYWRjYXN0KEBDb250ZXh0IFNzZUV2ZW50U2luayBldmVudFNpbmspIHsKKyAgICAgICAgdGhpcy5icm9hZGNhc3Rlci5zdWJzY3JpYmUoZXZlbnRTaW5rKTsKKyAgICB9Cit9CisgICAgICAgICAgICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICAgICAgICAgIExldCdzIGV4cGxvcmUgdGhlIGV4YW1wbGUgdG9nZXRoZXIuIFRoZSA8bGl0ZXJhbD5Ccm9hZGNhc3RlclJlc291cmNlPC9saXRlcmFsPiByZXNvdXJjZSBjbGFzcyBpcyBhbm5vdGF0ZWQgd2l0aAorICAgICAgICAgICAgICAgICZqZWU2LmluamVjdC5TaW5nbGV0b247IGFubm90YXRpb24gd2hpY2ggdGVsbHMgSmVyc2V5IHJ1bnRpbWUgdGhhdCBvbmx5IGEgc2luZ2xlIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZQorICAgICAgICAgICAgICAgIGNsYXNzIHNob3VsZCBiZSB1c2VkIHRvIHNlcnZlIGFsbCB0aGUgaW5jb21pbmcgcmVxdWVzdHMgdG8gPGxpdGVyYWw+L2Jyb2FkY2FzdDwvbGl0ZXJhbD4gcGF0aC4gVGhpcyBpcyBuZWVkZWQgYXMKKyAgICAgICAgICAgICAgICB3ZSB3YW50IHRvIGtlZXAgYW4gYXBwbGljYXRpb24td2lkZSBzaW5nbGUgcmVmZXJlbmNlIHRvIHRoZSBwcml2YXRlIDxsaXRlcmFsPmJyb2FkY2FzdGVyPC9saXRlcmFsPiBmaWVsZCBzbyB0aGF0CisgICAgICAgICAgICAgICAgd2UgY2FuIHVzZSB0aGUgc2FtZSBpbnN0YW5jZSBmb3IgYWxsIHJlcXVlc3RzLiBDbGllbnRzIHRoYXQgd2FudCB0byBsaXN0ZW4gdG8gU1NFIGV2ZW50cyBmaXJzdCBzZW5kIGEKKyAgICAgICAgICAgICAgICAmbGl0Lmh0dHAuR0VUOyByZXF1ZXN0IHRvIHRoZSA8bGl0ZXJhbD5Ccm9hZGNhc3RlclJlc291cmNlPC9saXRlcmFsPiwgdGhhdCBpcyBoYW5kbGVkIGJ5IHRoZQorICAgICAgICAgICAgICAgIDxsaXRlcmFsPmxpc3RlblRvQnJvYWRjYXN0KCk8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgcmVzb3VyY2UgbWV0aG9kLgorICAgICAgICAgICAgICAgIFRoZSBtZXRob2QgaXMgaW5qZWN0ZWQgd2l0aCBhIG5ldyA8bGl0ZXJhbD5Tc2VFdmVudFNpbms8L2xpdGVyYWw+IHJlcHJlc2VudGluZyB0aGUgY29ubmVjdGlvbiB0byB0aGUKKyAgICAgICAgICAgICAgICByZXF1ZXN0aW5nIGNsaWVudCBhbmQgcmVnaXN0ZXJzIHRoaXMgPGxpdGVyYWw+ZXZlbnRTaW5rPC9saXRlcmFsPiBpbnN0YW5jZSB3aXRoIHRoZSBzaW5nbGV0b24KKyAgICAgICAgICAgICAgICA8bGl0ZXJhbD5icm9hZGNhc3RlcjwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICBieSBjYWxsaW5nIGl0cyA8bGl0ZXJhbD5zdWJzY3JpYmUoKTwvbGl0ZXJhbD4gbWV0aG9kLgorICAgICAgICAgICAgICAgIFRoZSBtZXRob2QgdGhlbiwgYXMgYWxyZWFkeSBleHBsYWluZWQgcmV0dXJucyA8bGl0ZXJhbD52b2lkPC9saXRlcmFsPiBhbmQgSmVyc2V5IHJ1bnRpbWUgaXMgcmVzcG9uc2libGUgZm9yCisgICAgICAgICAgICAgICAgYmluZGluZyB0aGUgaW5qZWN0ZWQgPGxpdGVyYWw+RXZlbnRTaW5rPC9saXRlcmFsPiBpbnN0YW5jZSBzbyBhcyBpdCB3b3VsZCBoYXZlIGJlZW4gcmV0dXJuZWQgZnJvbSB0aGUgcmVzb3VyY2UKKyAgICAgICAgICAgICAgICBtZXRob2QgKG5vdGUgdGhhdCByZWFsbHkgcmV0dXJuaW5nIHRoZSA8bGl0ZXJhbD5FdmVudFNpbms8L2xpdGVyYWw+IGZyb20gdGhlIHJlc291cmNlIG1ldGhvZCB3aWxsIGNhdXNlCisgICAgICAgICAgICAgICAgZmFpbHVyZSkgYW5kIHRvIGJpbmQgdGhlIDxsaXRlcmFsPmV2ZW50U2luazwvbGl0ZXJhbD4gaW5zdGFuY2Ugd2l0aCB0aGUgcmVxdWVzdGluZyBjbGllbnQgYW5kIHNlbmQgdGhlCisgICAgICAgICAgICAgICAgcmVzcG9uc2UgSFRUUCBoZWFkZXJzIHRvIHRoZSBjbGllbnQuIFRoZSBjbGllbnQgY29ubmVjdGlvbiByZW1haW5zIG9wZW4gYW5kIHRoZSBjbGllbnQgaXMgbm93IHdhaXRpbmcgcmVhZHkgdG8KKyAgICAgICAgICAgICAgICByZWNlaXZlIG5ldyBTU0UgZXZlbnRzLiBBbGwgdGhlIGV2ZW50cyBhcmUgd3JpdHRlbiB0byB0aGUgPGxpdGVyYWw+ZXZlbnRTaW5rPC9saXRlcmFsPiBieQorICAgICAgICAgICAgICAgIDxsaXRlcmFsPmJyb2FkY2FzdGVyPC9saXRlcmFsPgorICAgICAgICAgICAgICAgIGxhdGVyIG9uLiBUaGlzIHdheSBkZXZlbG9wZXJzIGNhbiBjb252ZW5pZW50bHkgaGFuZGxlIHNlbmRpbmcgbmV3IGV2ZW50cyB0bworICAgICAgICAgICAgICAgIGFsbCB0aGUgY2xpZW50cyB0aGF0IHN1YnNjcmliZSB0byB0aGVtLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgV2hlbiBhIGNsaWVudCB3YW50cyB0byBicm9hZGNhc3QgbmV3IG1lc3NhZ2UgdG8gYWxsIHRoZSBjbGllbnRzIGxpc3RlbmluZyBvbiB0aGVpciBTU0UgY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgaXQgc2VuZHMgYSAmbGl0Lmh0dHAuUE9TVDsgcmVxdWVzdCB0byA8bGl0ZXJhbD5Ccm9hZGNhc3RlclJlc291cmNlPC9saXRlcmFsPiByZXNvdXJjZSB3aXRoIHRoZSBtZXNzYWdlIGNvbnRlbnQuCisgICAgICAgICAgICAgICAgVGhlIG1ldGhvZCA8bGl0ZXJhbD5icm9hZGNhc3RNZXNzYWdlKFN0cmluZyk8L2xpdGVyYWw+IGlzIGludm9rZWQgb24KKyAgICAgICAgICAgICAgICA8bGl0ZXJhbD5Ccm9hZGNhc3RlclJlc291cmNlPC9saXRlcmFsPgorICAgICAgICAgICAgICAgIHJlc291cmNlIHdpdGggdGhlIG1lc3NhZ2UgY29udGVudCBhcyBhbiBpbnB1dCBwYXJhbWV0ZXIuIEEgbmV3IFNTRSBvdXRib3VuZCBldmVudCBpcyBidWlsdCBpbiB0aGUgc3RhbmRhcmQgd2F5CisgICAgICAgICAgICAgICAgYW5kIHBhc3NlZCB0byB0aGUgYnJvYWRjYXN0ZXIuIFRoZSBicm9hZGNhc3RlciBpbnRlcm5hbGx5IGludm9rZXMgPGxpdGVyYWw+d3JpdGUoT3V0Ym91bmRFdmVudCk8L2xpdGVyYWw+IG9uIGFsbAorICAgICAgICAgICAgICAgIHJlZ2lzdGVyZWQgPGxpdGVyYWw+RXZlbnRTaW5rPC9saXRlcmFsPnMuIEFmdGVyIHRoYXQgdGhlIG1ldGhvZCBqdXN0IHJldHVybnMgYSBzdGFuZGFyZCB0ZXh0IHJlc3BvbnNlCisgICAgICAgICAgICAgICAgdG8gdGhlICZsaXQuaHR0cC5QT1NUO2luZyBjbGllbnQgdG8gaW5mb3JtIHRoZSBjbGllbnQgdGhhdCB0aGUgbWVzc2FnZSB3YXMgc3VjY2Vzc2Z1bGx5IGJyb2FkY2FzdC4gQXMgeW91IGNhbiBzZWUsCisgICAgICAgICAgICAgICAgdGhlIDxsaXRlcmFsPmJyb2FkY2FzdE1lc3NhZ2UoU3RyaW5nKTwvbGl0ZXJhbD4gcmVzb3VyY2UgbWV0aG9kIGlzIGp1c3QgYSBzaW1wbGUgSkFYLVJTIHJlc291cmNlIG1ldGhvZC4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDwhLS0gVE9ETyBjb250aW51ZSBoZXJlIC0tPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgSW4gb3JkZXIgdG8gaW1wbGVtZW50IHN1Y2ggYSBzY2VuYXJpbywgeW91IG1heSBoYXZlIG5vdGljZWQsIHRoYXQgdGhlCisgICAgICAgICAgICAgICAgPGxpdGVyYWw+U3NlQnJvYWRjYXN0ZXI8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgaXMgbm90IG1hbmRhdG9yeSB0byBjb21wbGV0ZSB0aGUgdXNlIGNhc2UuIEluZGl2aWR1YWwgPGxpdGVyYWw+RXZlbnRTaW5rPC9saXRlcmFsPnMgY2FuIGJlIGp1c3Qgc3RvcmVkIGluCisgICAgICAgICAgICAgICAgYSBjb2xsZWN0aW9uIGFuZCBpdGVyYXRlZCBvdmVyIGluIHRoZSA8bGl0ZXJhbD5icm9hZGNhc3RNZXNzYWdlPC9saXRlcmFsPiBtZXRob2QuIEhvd2V2ZXIsIHRoZQorICAgICAgICAgICAgICAgIDxsaXRlcmFsPlNzZUJyb2FkY2FzdGVyPC9saXRlcmFsPgorICAgICAgICAgICAgICAgIGludGVybmFsbHkgaWRlbnRpZmllcyBhbmQgaGFuZGxlcyBhbHNvIGNsaWVudCBkaXNjb25uZWN0cy4gV2hlbiBhIGNsaWVudAorICAgICAgICAgICAgICAgIGNsb3NlcyB0aGUgY29ubmVjdGlvbiwgdGhlIGJyb2FkY2FzdGVyIGRldGVjdHMgdGhpcyBhbmQgcmVtb3ZlcyB0aGUgc3RhbGUgY29ubmVjdGlvbiBmcm9tIHRoZSBpbnRlcm5hbCBjb2xsZWN0aW9uCisgICAgICAgICAgICAgICAgb2YgdGhlIHJlZ2lzdGVyZWQgPGxpdGVyYWw+RXZlbnRTaW5rPC9saXRlcmFsPnMgYXMgd2VsbCBhcyBpdCBmcmVlcyBhbGwgdGhlIHNlcnZlci1zaWRlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGgKKyAgICAgICAgICAgICAgICB0aGUgc3RhbGUgY29ubmVjdGlvbi4KKyAgICAgICAgICAgICAgICBBZGRpdGlvbmFsbHksIHRoZSA8bGl0ZXJhbD5Tc2VCcm9hZGNhc3RlcjwvbGl0ZXJhbD4gaXMgaW1wbGVtZW50ZWQgdG8gYmUgdGhyZWFkLXNhZmUsIHNvIHRoYXQgY2xpZW50cyBjYW4gY29ubmVjdAorICAgICAgICAgICAgICAgIGFuZCBkaXNjb25uZWN0IGluIGFueSB0aW1lIGFuZCA8bGl0ZXJhbD5Tc2VCcm9hZGNhc3RlcjwvbGl0ZXJhbD4gd2lsbCBhbHdheXMgYnJvYWRjYXN0IG1lc3NhZ2VzIHRvIHRoZSBtb3N0IHJlY2VudAorICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24gb2YgcmVnaXN0ZXJlZCBhbmQgYWN0aXZlIHNldCBvZiBjbGllbnRzLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorICAgIDxzZWN0aW9uIHhtbDppZD0ic3NlLWNsaWVudC1qYXhycyI+CisgICAgICAgIDx0aXRsZT5Db25zdW1pbmcgU1NFIGV2ZW50cyB3aXRoaW4gSmVyc2V5IGNsaWVudHM8L3RpdGxlPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIE9uIHRoZSBjbGllbnQgc2lkZSwgcHVzaCBwcm9ncmFtbWluZyBtb2RlbCBpcyB1c2VkIChldmVudCBjb25zdW1lciAvIGNsaWVudCkgZ2V0cyBhc3luY2hyb25vdXNseSBub3RpZmllZCBhYm91dAorICAgICAgICAgICAgaW5jb21pbmcgZXZlbnRzIGJ5IHN1YnNjcmliaW5nIGN1c3RvbSBsaXN0ZW5lciB0byA8bGl0ZXJhbD5qYXZheC53cy5ycy5zc2UuU3NlRXZlbnRTb3VyY2U8L2xpdGVyYWw+LiBUaGlzIGhhcHBlbnMgYnkKKyAgICAgICAgICAgIGludm9raW5nIG9uZSBvZiBpdHMgPGxpdGVyYWw+c3Vic2NyaWJlKCk8L2xpdGVyYWw+IG1ldGhvZHMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaGUgdXNhZ2Ugb2YgPGxpdGVyYWw+U3NlRXZlbnRTb3VyY2U8L2xpdGVyYWw+IGlzIHNob3duIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZS4KKyAgICAgICAgICAgIDxleGFtcGxlIHhtbDppZD0ic3NlLWV2ZW50LXNvdXJjZS1leGFtcGxlIj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+Q29uc3VtaW5nIFNTRSBldmVudHMgd2l0aCBTc2VFdmVudFNvdXJjZTwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+aW1wb3J0IGphdmF4LndzLnJzLnNzZS5Tc2VFdmVudFNvdXJjZTsKKy4uLgorQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3QnVpbGRlcigpLmJ1aWxkKCk7CitXZWJUYXJnZXQgdGFyZ2V0ID0gY2xpZW50LnRhcmdldCgiaHR0cDovL2V4YW1wbGUuY29tL2V2ZW50cyIpOworU3NlRXZlbnRTb3VyY2Ugc3NlRXZlbnRTb3VyY2UgPSBTc2VFdmVudFNvdXJjZS50YXJnZXQodGFyZ2V0KS5idWlsZCgpOworc3NlRXZlbnRTb3VyY2Uuc3Vic2NyaWJlKChldmVudCkgLT4gU3lzdGVtLm91dC5wcmludGxuKGV2ZW50LmdldE5hbWUoKSArICI7ICIKKyAgICArIGV2ZW50LnJlYWREYXRhKFN0cmluZy5jbGFzcykpKTsKK3NzZUV2ZW50U291cmNlLm9wZW4oKTsKKworLy8gZG8gb3RoZXIgc3R1ZmYsIGJsb2NrIGhlcmUgYW5kIGNvbnRpbnVlIHdoZW4gZG9uZQorCitzc2VFdmVudFNvdXJjZS5jbG9zZSgpOworICAgICAgICAgICAgICAgIDwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgICAgICBJbiB0aGlzIGV4YW1wbGUsIHRoZSBjbGllbnQgY29kZSBjb25uZWN0cyB0byB0aGUgc2VydmVyIHdoZXJlIHRoZSA8bGl0ZXJhbD5Tc2VSZXNvdXJjZTwvbGl0ZXJhbD4gZnJvbSB0aGUKKyAgICAgICAgICAgIDx4cmVmIGxpbmtlbmQ9ImV4YW1wbGUtc2ltcGxlLXNzZS1qYXhycyIvPgorICAgICAgICAgICAgaXMgZGVwbG95ZWQuIFRoZSAmamF4cnMuY2xpZW50LkNsaWVudDsgaW5zdGFuY2UKKyAgICAgICAgICAgIGlzIGNyZWF0ZWQgKGFuZCBpbml0aWFsaXplZCB3aXRoICZqZXJzZXkuc3NlLlNzZUZlYXR1cmU7IGF1dG9tYXRpY2FsbHkpLiBUaGVuIHRoZSAmamF4cnMuY2xpZW50LldlYlRhcmdldDsgaXMgYnVpbHQuCisgICAgICAgICAgICBJbiB0aGlzIGNhc2UgYSByZXF1ZXN0IHRvIHRoZSB3ZWIgdGFyZ2V0IGlzIG5vdCBtYWRlIGRpcmVjdGx5IGluIHRoZSBjb2RlLCBpbnN0ZWFkLCB0aGUgd2ViIHRhcmdldCBpbnN0YW5jZQorICAgICAgICAgICAgaXMgdXNlZCB0byBpbml0aWFsaXplIGEgbmV3ICZqYXZheC53cy5ycy5zc2UuU3NlRXZlbnRTb3VyY2UuQnVpbGRlcjsgaW5zdGFuY2UgdGhhdCBpcyB1c2VkIHRvIGJ1aWxkIGEgbmV3CisgICAgICAgICAgICAmamF2YXgud3MucnMuc3NlLlNzZUV2ZW50U291cmNlOy4gVGhlIGNob2ljZSBvZiA8bGl0ZXJhbD5idWlsZCgpPC9saXRlcmFsPiBtZXRob2QgaXMgaW1wb3J0YW50LCBhcyBpdCB0ZWxscworICAgICAgICAgICAgdGhlIDxsaXRlcmFsPlNzZUV2ZW50U291cmNlLkJ1aWxkZXI8L2xpdGVyYWw+IHRvIGNyZWF0ZSBhIG5ldyA8bGl0ZXJhbD5Tc2VFdmVudFNvdXJjZTwvbGl0ZXJhbD4gdGhhdCBpcyBub3QKKyAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkgY29ubmVjdGVkIHRvIHRoZSA8bGl0ZXJhbD50YXJnZXQ8L2xpdGVyYWw+LiBUaGUgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCBvbmx5IGxhdGVyIGJ5IG1hbnVhbGx5CisgICAgICAgICAgICBpbnZva2luZyB0aGUgPGxpdGVyYWw+c3NlRXZlbnRTb3VyY2Uub3BlbigpPC9saXRlcmFsPiBtZXRob2QuIEEgY3VzdG9tCisgICAgICAgICAgICA8bGl0ZXJhbD5qYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXImbHQ7SW5ib3VuZFNzZUV2ZW50Jmd0OzwvbGl0ZXJhbD4KKyAgICAgICAgICAgIGltcGxlbWVudGF0aW9uIGlzIHVzZWQgdG8gbGlzdGVuIHRvIGFuZAorICAgICAgICAgICAgcHJvY2VzcyBpbmNvbWluZyBTU0UgZXZlbnRzLiBUaGUgbWV0aG9kIHJlYWREYXRhKENsYXNzKSBzYXlzIHRoYXQgdGhlCisgICAgICAgICAgICBldmVudCBkYXRhIHNob3VsZCBiZSBkZS1zZXJpYWxpemVkIGZyb20gYSByZWNlaXZlZCAmamF2YXgud3MucnMuc3NlLkluYm91bmRTc2VFdmVudDsgaW5zdGFuY2UgaW50byBhCisgICAgICAgICAgICA8bGl0ZXJhbD5TdHJpbmc8L2xpdGVyYWw+CisgICAgICAgICAgICBKYXZhIHR5cGUuIFRoaXMgbWV0aG9kIGNhbGwgaW50ZXJuYWxseSBleGVjdXRlcyAmamF4cnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyOyB3aGljaAorICAgICAgICAgICAgZGUtc2VyaWFsaXplcyB0aGUgZXZlbnQgZGF0YS4gVGhpcyBpcyBzaW1pbGFyIHRvIHJlYWRpbmcgYW4gZW50aXR5IGZyb20gdGhlICZqYXhycy5jb3JlLlJlc3BvbnNlOyBieQorICAgICAgICAgICAgPGxpdGVyYWw+cmVhZEVudGl0eShDbGFzcyk8L2xpdGVyYWw+LiBUaGUgbWV0aG9kIDxsaXRlcmFsPnJlYWREYXRhPC9saXRlcmFsPiBjYW4gdGhyb3cgYQorICAgICAgICAgICAgJmpheHJzLlByb2Nlc3NpbmdFeGNlcHRpb247LgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQWZ0ZXIgYSBjb25uZWN0aW9uIHRvIHRoZSBzZXJ2ZXIgaXMgb3BlbmVkIGJ5IGNhbGxpbmcgdGhlIDxsaXRlcmFsPm9wZW4oKTwvbGl0ZXJhbD4gbWV0aG9kIG9uIHRoZSBldmVudCBzb3VyY2UsCisgICAgICAgICAgICB0aGUgPGxpdGVyYWw+ZXZlbnRTb3VyY2U8L2xpdGVyYWw+IHN0YXJ0cyBsaXN0ZW5pbmcgdG8gZXZlbnRzLiBXaGVuIGFuIGV2ZW50IGNvbWVzLCB0aGUgbGlzdGVuZXIgd2lsbCBiZSBleGVjdXRlZAorICAgICAgICAgICAgYnkgdGhlIGV2ZW50IHNvdXJjZS4gT25jZSB0aGUgY2xpZW50IGlzIGRvbmUgd2l0aCBwcm9jZXNzaW5nIGFuZCBkb2VzIG5vdCB3YW50IHRvIHJlY2VpdmUgZXZlbnRzIHRoZSBjb25uZWN0aW9uIGJ5CisgICAgICAgICAgICBjYWxsaW5nIHRoZSA8bGl0ZXJhbD5jbG9zZSgpPC9saXRlcmFsPiBtZXRob2Qgb24gdGhlIGV2ZW50IHNvdXJjZS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZSBsaXN0ZW5lciBmcm9tIHRoZSBleGFtcGxlIGFib3ZlIHdpbGwgcHJpbnQgdGhlIGZvbGxvd2luZyBvdXRwdXQ6CisgICAgICAgICAgICA8c2NyZWVuIGxhbmd1YWdlPSJ0ZXh0IiBsaW5lbnVtYmVyaW5nPSJ1bm51bWJlcmVkIj5tZXNzYWdlLXRvLWNsaWVudDsgSGVsbG8gd29ybGQgMCEKK21lc3NhZ2UtdG8tY2xpZW50OyBIZWxsbyB3b3JsZCAxIQorbWVzc2FnZS10by1jbGllbnQ7IEhlbGxvIHdvcmxkIDIhCittZXNzYWdlLXRvLWNsaWVudDsgSGVsbG8gd29ybGQgMyEKK21lc3NhZ2UtdG8tY2xpZW50OyBIZWxsbyB3b3JsZCA0IQorbWVzc2FnZS10by1jbGllbnQ7IEhlbGxvIHdvcmxkIDUhCittZXNzYWdlLXRvLWNsaWVudDsgSGVsbG8gd29ybGQgNiEKK21lc3NhZ2UtdG8tY2xpZW50OyBIZWxsbyB3b3JsZCA3IQorbWVzc2FnZS10by1jbGllbnQ7IEhlbGxvIHdvcmxkIDghCittZXNzYWdlLXRvLWNsaWVudDsgSGVsbG8gd29ybGQgOSEKKyAgICAgICAgICAgIDwvc2NyZWVuPgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhlcmUgYXJlIG90aGVyIGV2ZW50cyB0aGFuIHRoZSBpbmNvbWluZyBkYXRhIHRoYXQgYWxzbyBtYXkgb2NjdXIuIFRoZSA8bGl0ZXJhbD5Tc2VFdmVudFNvdXJjZTwvbGl0ZXJhbD4gZm9yCisgICAgICAgICAgICBpbnN0YW5jZSBhbHdheXMgc2lnbmFscywgdGhhdCBpdCBoYXMgZmluaXNoZWQgcHJvY2Vzc2luZyBldmVudHMsIG9yIHRoZXJlIG1pZ2h0IGFsc28gYmUgYW4gZXJyb3Igd2hpbGUgcHJvY2Vzc2luZyB0aGUKKyAgICAgICAgICAgIG1lc3NhZ2VzLiA8bGl0ZXJhbD5Tc2VFdmVudFNvdXJjZTwvbGl0ZXJhbD4uIFRoZXJlIGFyZSB0b3RhbCBvZiBmb3VyIG92ZXJsb2FkZWQKKyAgICAgICAgICAgIDxsaXRlcmFsPnN1YnNjcmliZSgpPC9saXRlcmFsPgorICAgICAgICAgICAgbWV0aG9kcyBkZWZpbmVkIGluIHRoZSBBUEkuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICA8ZXhhbXBsZSB4bWw6aWQ9InNzZS1ldmVudC1zb3VyY2Utc3Vic2NyaWJlLW1ldGhvZHMiPgorICAgICAgICAgICAgICAgIDx0aXRsZT5Tc2VFdmVudFNvdXJjZSBzdWJzY3JpYmUoKSBtZXRob2RzPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj4vLyAxLiBiYXNpYyBvbmUgLSB0aGUgb25lIHdlIHVzZWQgaW4gdGhlIGV4YW1wbGUKK3ZvaWQgc3Vic2NyaWJlKENvbnN1bWVyJmx0O0luYm91bmRTc2VFdmVudCZndDsgb25FdmVudCk7CisKKy8vIDIuIHdpdGggYW4gZXJyb3IgY2FsbGJhY2sKK3ZvaWQgc3Vic2NyaWJlKENvbnN1bWVyJmx0O0luYm91bmRTc2VFdmVudCZndDsgb25FdmVudCwgQ29uc3VtZXImbHQ7VGhyb3dhYmxlJmd0OyBvbkVycm9yKTsKKworLy8gMy4gd2l0aCBhbiBlcnJvciBjYWxsYmFjayBhbmQgY29tcGxldGlvbiBjYWxsYmFjawordm9pZCBzdWJzY3JpYmUoQ29uc3VtZXImbHQ7SW5ib3VuZFNzZUV2ZW50Jmd0OyBvbkV2ZW50LCBDb25zdW1lciZsdDtUaHJvd2FibGUmZ3Q7IG9uRXJyb3IsIFJ1bm5hYmxlIG9uQ29tcGxldGUpCisKKy8vIDQuIGNvbXBsZXRlIG9uZSAtIHdpdGggZXJyb3IgY2FsbGJhY2ssIGNvbXBsZXRpb24gY2FsbGJhY2sgYW4gb25TdWJzY3JpYmUgY2FsbGJhY2sKK3ZvaWQgc3Vic2NyaWJlKENvbnN1bWVyJmx0O1NzZVN1YnNjcmlwdGlvbiZndDsgb25TdWJzY3JpYmUsIENvbnN1bWVyJmx0O0luYm91bmRTc2VFdmVudCZndDsgb25FdmVudCwgQ29uc3VtZXImbHQ7VGhyb3dhYmxlJmd0Oworb25FcnJvciwKK1J1bm5hYmxlCitvbkNvbXBsZXRlKTsKKyAgICAgICAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgRmV3IG5vdGVzIHRvIHRoZSA8bGl0ZXJhbD5zdWJzY3JpYmUoKTwvbGl0ZXJhbD4gbWV0aG9kczoKKyAgICAgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGwgdGhlIG92ZXJsb2FkZWQgbWV0aG9kcyBoYXZlIHRoZSA8bGl0ZXJhbD5vbkV2ZW50PC9saXRlcmFsPiBoYW5kbGVyLiBBcyBzaG93biBpbiB0aGUgZXhhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHBhcmFtZXRlciBpcyB1c2VkIHRvIGNvbnN1bWUgdGhlIFNTRSBldmVudHMgd2l0aCBkYXRhLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGNlcHQgdGhlIGJhc2ljIG9uZS1hcmcgbWV0aG9kLCBhbGwgdGhlIG90aGVycyBjb250YWluIGFuIDxsaXRlcmFsPm9uRXJyb3I8L2xpdGVyYWw+IGhhbmRsZXIuIEluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBvZiBlcnJvciwgdGhlIDxsaXRlcmFsPlNzZUV2ZW50U291cmNlPC9saXRlcmFsPiBpbnZva2VzIHRoZSA8bGl0ZXJhbD5vbkVycm9yPC9saXRlcmFsPiBtZXRob2QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZiBhbGwgaXRzIHN1YnNjcmliZXJzLCB0aGF0IHJlZ2lzdGVyZWQgdGhlIGhhbmRsZXIuIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gcmVhY3QgdG8gdGhlIGVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9ucyBpbiBhIGN1c3RvbSBtYW5uZXIuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFub3RoZXIgcG9zc2libGUgYXJndW1lbnQgaXMgdGhlIDxsaXRlcmFsPm9uQ29tcGxldGU8L2xpdGVyYWw+IGhhbmRsZXIuIElmIHJlZ2lzdGVyZWQgKHVzZWQgYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcHByb3ByaWF0ZSA8bGl0ZXJhbD5zdWJzY3JpYmUoKTwvbGl0ZXJhbD4gbWV0aG9kLCB0aGF0IGhhcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5vbkNvbXBsZXRlPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50KSwgaXQgaXMgaW52b2tlZCAoZm9yIGFsbCB0aGUgc3Vic2NyaWJlcnMpIGV2ZXJ5IHRpbWUgd2hlbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5Tc2VFdmVudFNvdXJjZTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXJtaW5hdGVzIG5vcm1hbGx5LiBFaXRoZXIgPGxpdGVyYWw+b25Db21wbGV0ZTwvbGl0ZXJhbD4gb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5vbkVycm9yPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBjYWxsZWQgZXZlcnkgdGltZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIGNvbXBsZXRlIDxsaXRlcmFsPnN1YnNjcmliZSgpPC9saXRlcmFsPiBtZXRob2QgYWRkcyB0aGUgPGxpdGVyYWw+b25TdWJzY3JpYmUoKTwvbGl0ZXJhbD4gY2FsbGJhY2suCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBnaXZlcyB0aGUgc3Vic2NyaWJlciBhIHRvb2wgdG8gbWFuYWdlIHRoZSBsb2FkIGFuZCBkbyBhIGJhY2stcHJlc3N1cmUgYnkgaW5jcmVtZW50YWx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGluZyBvbmx5IGNlcnRhaW4gYW1vdW50IG9mIGl0ZW1zLiBXaGVuIDxsaXRlcmFsPlNzZUV2ZW50U291cmNlPC9saXRlcmFsPiByZWdpc3RlcnMgYSBuZXcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLCBpdCBjYWxscyBpdHMgPGxpdGVyYWw+b25TdWJzY3JpYmU8L2xpdGVyYWw+IGhhbmRsZXIgYW5kIGhhbmRzIG92ZXIgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+amF2YXgud3MucnMuc3NlLlNzZVN1YnNjcmlwdGlvbjwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS4gVGhpcyBjbGFzcyBvbmx5IGhhcyB0d28gbWV0aG9kcyAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+cmVxdWVzdChsb25nKTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgYXNraW5nIGZvciBhIGNlcnRhaW4gYW1vdW50IG9mIGV2ZW50cyAob2Z0ZW4gdXNlZCBhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPnJlcXVlc3QoTG9uZy5NQVhfVkFMVUUpPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gbm8gYmFjay1wcmVzc3VyZSBpcyBuZWVkZWQpIGFuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmNhbmNlbCgpPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHN0b3AgcmVjZWl2aW5nIGZ1cnRoZXIgZXZlbnRzLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaGVuIHVzaW5nIHRoZSBmdWxsLWFyZyB2ZXJzaW9uIG9mIDxsaXRlcmFsPnN1YnNjcmliZSgpPC9saXRlcmFsPiwgaXQgaXMgdGhlIGNhbGxlcidzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2liaWxpdHkgdG8gbWFuYWdlIHRoZSBhbW91bnQgb2YgZGF0YSBpdCBjYW4gaGFuZGxlLiBUaGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5zc2VTdWJzY3JpcHRpb24ucmVxdWVzdCgpPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA8ZW1waGFzaXM+TVVTVDwvZW1waGFzaXM+IGJlIGNhbGxlZCwgb3RoZXJ3aXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHN1YnNjcmliZXIgd2lsbCBub3QgcmVjZWl2ZSBBTlkgZGF0YS4gRnVydGhlcm1vcmUsIGluIHRoZSBjdXJyZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+U3NlRXZlbnRTb3VyY2U8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24sIHN1Y2ggYSBzdWJzY3JpYmVyIHdpbGwgYmxvY2sgYSB0aHJlYWRtIGFuZCB3aWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2NjYXNpb25hbGx5IGxlYWQgdG8gb3ZlcmZsb3cgb2YgYW4gaW50ZXJuYWwgYnVmZmVyIGluIDxsaXRlcmFsPlNzZUV2ZW50U291cmNlPC9saXRlcmFsPi4gQXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW50aW9uZWQsIGNhbGxpbmcgPGxpdGVyYWw+c3Vic2NyaXB0aW9uLnJlcXVlc3QoTG9uZy5NQVhfVkFMVUUpPC9saXRlcmFsPiwgZS5nLiBpbiB0aGUgcmVnaXN0ZXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPm9uU3Vic2NyaWJlPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIgaXMgc3VmZmljaWVudCAoYW5kIGlzIGFsc28gYSBkZWZhdWx0IGJlaGF2aW91ciBmb3IgYWxsIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyIG92ZXJsb2FkZWQgbWV0aG9kcykuCisgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisKKyAgICAgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8L3BhcmE+CisgICAgICAgIDxzZWN0aW9uIHhtbDppZD0ic3NlLWV2ZW50LXNvdXJjZS1yZWNvbm5lY3QiPgorICAgICAgICAgICAgPHRpdGxlPgorICAgICAgICAgICAgICAgIDxsaXRlcmFsPlNzZUV2ZW50U291cmNlPC9saXRlcmFsPgorICAgICAgICAgICAgICAgIHJlY29ubmVjdCBzdXBwb3J0CisgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGhlICZqYXZheC53cy5ycy5zc2UuU3NlRXZlbnRTb3VyY2U7IGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIGF1dG9tYXRlZCByZWN1cGVyYXRpb24KKyAgICAgICAgICAgICAgICBmcm9tIGEgY29ubmVjdGlvbiBsb3NzLCBpbmNsdWRpbmcgbmVnb3RpYXRpb24gb2YgZGVsaXZlcnkgb2YgYW55IG1pc3NlZCBldmVudHMgYmFzZWQgb24gdGhlIGxhc3QgcmVjZWl2ZWQKKyAgICAgICAgICAgICAgICBTU0UgZXZlbnQgPGxpdGVyYWw+aWQ8L2xpdGVyYWw+IGZpZWxkIHZhbHVlLCBwcm92aWRlZCB0aGlzIGZpZWxkIGlzIHNldCBieSB0aGUgc2VydmVyIGFuZCB0aGUgbmVnb3RpYXRpb24KKyAgICAgICAgICAgICAgICBmYWNpbGl0eSBpcyBzdXBwb3J0ZWQgYnkgdGhlIHNlcnZlci4gSW4gY2FzZSBvZiBhIGNvbm5lY3Rpb24gbG9zcywgdGhlIGxhc3QgcmVjZWl2ZWQgU1NFIGV2ZW50CisgICAgICAgICAgICAgICAgPGxpdGVyYWw+aWQ8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgZmllbGQgdmFsdWUgaXMgc2VudCBpbiB0aGUgPGxpdGVyYWw+TGFzdC1FdmVudC1JRDwvbGl0ZXJhbD4gSFRUUCByZXF1ZXN0CisgICAgICAgICAgICAgICAgaGVhZGVyIGFzIHBhcnQgb2YgYSBuZXcgY29ubmVjdGlvbiByZXF1ZXN0IHNlbnQgdG8gdGhlIFNTRSBlbmRwb2ludC4gVXBvbiBhIHJlY2VpcHQgb2Ygc3VjaCByZWNvbm5lY3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICB0aGUgU1NFIGVuZHBvaW50IHRoYXQgc3VwcG9ydHMgdGhpcyBuZWdvdGlhdGlvbiBmYWNpbGl0eSBpcyBleHBlY3RlZCB0byByZXBsYXkgYWxsIG1pc3NlZCBldmVudHMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgTm90ZSwgdGhhdCBTU0UgbG9zdCBldmVudCBuZWdvdGlhdGlvbiBmYWNpbGl0eSBpcyBhIGJlc3QtZWZmb3J0IG1lY2hhbmlzbSB3aGljaCBkb2VzIG5vdCBwcm92aWRlCisgICAgICAgICAgICAgICAgICAgIGFueSBndWFyYW50ZWUgdGhhdCBhbGwgZXZlbnRzIHdvdWxkIGJlIGRlbGl2ZXJlZCB3aXRob3V0IGEgbG9zcy4gWW91IHNob3VsZCB0aGVyZWZvcmUgbm90CisgICAgICAgICAgICAgICAgICAgIHJlbHkgb24gcmVjZWl2aW5nIGV2ZXJ5IHNpbmdsZSBldmVudCBhbmQgZGVzaWduIHlvdXIgY2xpZW50IGFwcGxpY2F0aW9uIGNvZGUgYWNjb3JkaW5nbHkuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9ub3RlPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgQnkgZGVmYXVsdCwgd2hlbiBhIGNvbm5lY3Rpb24gdGhlIHRoZSBTU0UgZW5kcG9pbnQgaXMgbG9zdCwgdGhlIGV2ZW50IHNvdXJjZSB3aWxsIHVzZSBhIGRlZmF1bHQgZGVsYXkKKyAgICAgICAgICAgICAgICBiZWZvcmUgYXR0ZW1wdGluZyB0byByZWNvbm5lY3QgdG8gdGhlIFNTRSBlbmRwb2ludC4gVGhlIFNTRSBlbmRwb2ludCBjYW4gaG93ZXZlciBjb250cm9sIHRoZSBjbGllbnQtc2lkZQorICAgICAgICAgICAgICAgIHJldHJ5IGRlbGF5IGJ5IGluY2x1ZGluZyBhIHNwZWNpYWwgPGxpdGVyYWw+cmV0cnk8L2xpdGVyYWw+IGZpZWxkIHZhbHVlIGluIGFueSBldmVudCBzZW50IHRvIHRoZSBjbGllbnQuCisgICAgICAgICAgICAgICAgSmVyc2V5ICZqYXZheC53cy5ycy5zc2UuU3NlRXZlbnRTb3VyY2U7IGltcGxlbWVudGF0aW9uIGF1dG9tYXRpY2FsbHkgdHJhY2tzIGFueSByZWNlaXZlZCBTU0UgZXZlbnQKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbD5yZXRyeTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICBmaWVsZCB2YWx1ZXMgc2V0IGJ5IHRoZSBlbmRwb2ludCBhbmQgYWRqdXN0cyB0aGUgcmVjb25uZWN0IGRlbGF5IGFjY29yZGluZ2x5LAorICAgICAgICAgICAgICAgIHVzaW5nIHRoZSBsYXN0IHJlY2VpdmVkIDxsaXRlcmFsPnJldHJ5PC9saXRlcmFsPiBmaWVsZCB2YWx1ZSBhcyB0aGUgbmV3IHJlY29ubmVjdCBkZWxheS4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEluIGFkZGl0aW9uIHRvIGhhbmRsaW5nIHRoZSBzdGFuZGFyZCBjb25uZWN0aW9uIGxvc3NlcywgSmVyc2V5ICZqYXZheC53cy5ycy5zc2UuU3NlRXZlbnRTb3VyY2U7IGF1dG9tYXRpY2FsbHkKKyAgICAgICAgICAgICAgICBkZWFscyB3aXRoIGFueSA8bGl0ZXJhbD5IVFRQIDUwMyBTZXJ2aWNlIFVuYXZhaWxhYmxlPC9saXRlcmFsPiByZXNwb25zZXMgcmVjZWl2ZWQgZnJvbSB0aGUgU1NFIGVuZHBvaW50LAorICAgICAgICAgICAgICAgIHRoYXQgaW5jbHVkZSBhIDxsaXRlcmFsPlJldHJ5LUFmdGVyPC9saXRlcmFsPiBIVFRQIGhlYWRlciB3aXRoIGEgdmFsaWQgdmFsdWUuIFRoZQorICAgICAgICAgICAgICAgIDxsaXRlcmFsPkhUVFAgNTAzICsgUmV0cnktQWZ0ZXI8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgdGVjaG5pcXVlIGlzIG9mdGVuIHVzZWQgYnkgSFRUUCBlbmRwb2ludHMgYXMgYSBtZWFucyBvZgorICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24gYW5kIHRyYWZmaWMgdGhyb3R0bGluZy4gSW4gY2FzZSBhIDxsaXRlcmFsPkhUVFAgNTAzICsgUmV0cnktQWZ0ZXI8L2xpdGVyYWw+IHJlc3BvbnNlIGlzIHJlY2VpdmVkCisgICAgICAgICAgICAgICAgaW4gcmV0dXJuIHRvIGEgY29ubmVjdGlvbiByZXF1ZXN0IGZyb20gU1NFIGVuZHBvaW50LCBKZXJzZXkgPGxpdGVyYWw+U3NlRXZlbnRTb3VyY2U8L2xpdGVyYWw+IHdpbGwgYXV0b21hdGljYWxseQorICAgICAgICAgICAgICAgIHNjaGVkdWxlIGEgcmVjb25uZWN0IGF0dGVtcHQgYW5kIHVzZSB0aGUgcmVjZWl2ZWQgPGxpdGVyYWw+UmV0cnktQWZ0ZXI8L2xpdGVyYWw+IEhUVFAgaGVhZGVyIHZhbHVlIGFzIGEKKyAgICAgICAgICAgICAgICBvbmUtdGltZSBvdmVycmlkZSBvZiB0aGUgcmVjb25uZWN0IGRlbGF5LgorICAgICAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDwvc2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8IS0tVE9ETyAtIGRlc2NyaWJlcyB0aGUgSmVyc2V5LXNwZWNpZmljIGxlZ2FjeSBBUEksIGNoYW5nZSBhbmQgb25seSBtZW50aW9uIHRoZSBkaWZmZXJlbmNlcyAtLT4KKworCisgICAgPHNlY3Rpb24geG1sOmlkPSJvdmVydmlldy1qZXJzZXktc3BlY2lmaWMiPgorICAgICAgICA8dGl0bGU+SmVyc2V5LXNwZWNpZmljIFNlcnZlci1TZW50IEV2ZW50cyBBUEk8L3RpdGxlPgorICAgICAgICA8aW1wb3J0YW50PgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgUHJpb3IgdG8gSkFYLVJTIDIuMSwgc2VydmVyLXNlbnQgZXZlbnRzIHdhcyBub3Qgc3RhbmRhcmRpemVkIGFuZCB3YXMgb3B0aW9uYWwgYW5kIGltcGxlbWVudGF0aW9uLXNwZWNpZmljLgorICAgICAgICAgICAgICAgIEplcnNleSBwcm92aWRlZCBpdHMgb3duLCBzcGVjaWZpYyB2ZXJzaW9uIG9mIFNTRSBpbXBsZW1lbnRhdGlvbiwgdGhhdCByZW1haW5zIHZhbGlkIGFuZCBmdW5jdGlvbmFsIHRvIGFjaGlldmUKKyAgICAgICAgICAgICAgICBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4gVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBhIEplcnNleS1zcGVjaWZpYyBleHRlbnNpb24gb2YgSkFYLVJTICgyLjApIHN0YW5kYXJkLiBJdCB3b3JrcworICAgICAgICAgICAgICAgIHdpdGggY29tbW9uIEpBWC1SUyByZXNvdXJjZXMgdGhlIHNhbWUgd2F5IGFzIHRoZSBKQVgtUlMgMi4xIGJhc2VkIGltcGxlbWVudGF0aW9uIGRvZXMuCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBCb3RoIGltcGxlbWVudGF0aW9ucyBhcmUgY29tcGF0aWJsZSwgd2hpY2ggbWVhbnMgY2xpZW50IGJhc2VkIG9uIEplcnNleS1zcGVjaWZpYyBTU0UgaW1wbGVtZW50YXRpb24gY2FuICJ0YWxrIgorICAgICAgICAgICAgICAgIHRvIHNlcnZlciByZXNvdXJjZSBpbXBsZW1ldG5lZCB1c2luZyBKQVgtUlMgMi4xIGJhc2VkIGltcGxlbWVudGF0aW9uIGFuZCB2aWNlIHZlcnNhLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2ltcG9ydGFudD4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaGlzIGNoYXB0ZXIgYnJpZWZseSBkZXNjcmliZXMgdGhlIEplcnNleS1zcGVjaWZpYyBzdXBwb3J0IGZvciBTU0UsIGZvY3VzaW5nIG9uIHRoZSBkaWZmZXJlbmNlcyBhZ2FpbnN0IHRoZSBuZXcgU1NFCisgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBkZXNjcmliZWQgaW4KKyAgICAgICAgICAgIDx4cmVmIGxpbmtlbmQ9Im92ZXJ2aWV3LWpheHJzIi8+CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaGUgQVBJIGNvbnRhaW5zIHN1cHBvcnQgU1NFIHN1cHBvcnQgZm9yIGJvdGggLSBzZXJ2ZXIgYW5kIGNsaWVudC4gVG8gdXNlIHRoZSBKZXJzZXktc3BlY2lmaWMgU1NFIEFQSSwgeW91IG5lZWQgdG8KKyAgICAgICAgICAgIGFkZCB0aGUgZGVwZW5kZW5jeSB0byB0aGUKKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEluIG9yZGVyIHRvIGFkZCBzdXBwb3J0IGZvciB0aGlzIFNTRSBpbXBsZW1lbnRhdGlvbiwgeW91IGFsc28gbmVlZCB0byBpbmNsdWRlIHRoZSBkZXBlbmRlbmN5IHRvIHRoZQorICAgICAgICAgICAgPGVtcGhhc2lzPlNTRSBtZWRpYSB0eXBlIG1vZHVsZTwvZW1waGFzaXM+CisgICAgICAgICAgICB0aGUgc2FtZSB3YXkgYXMgZm9yIHRoZSBKQVgtUlMgU1NFIGltcGxlbWVudGF0aW9uLgorICAgICAgICAgICAgPGV4YW1wbGUgeG1sOmlkPSJzc2UuZGVwZW5kZW5jeSI+CisgICAgICAgICAgICAgICAgPHRpdGxlPkFkZCA8bGl0ZXJhbD5qZXJzZXktbWVkaWEtc3NlPC9saXRlcmFsPiBkZXBlbmRlbmN5LgorICAgICAgICAgICAgICAgIDwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJ4bWwiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj48IVtDREFUQVs8ZGVwZW5kZW5jeT4KKyAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtc3NlPC9hcnRpZmFjdElkPgorPC9kZXBlbmRlbmN5Pl1dPjwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgUHJpb3IgdG8gSmVyc2V5IDIuOCwgeW91IGhhZCB0byBtYW51YWxseSByZWdpc3RlciAmamVyc2V5LnNzZS5Tc2VGZWF0dXJlOyBpbiB5b3VyIGFwcGxpY2F0aW9uLgorICAgICAgICAgICAgICAgICAgICAoVGhlICZsaXQuamVyc2V5LnNzZS5Tc2VGZWF0dXJlOyBpcyBhIGZlYXR1cmUgdGhhdCBjYW4gYmUgcmVnaXN0ZXJlZCBmb3IgYm90aCwgdGhlIGNsaWVudCBhbmQgdGhlIHNlcnZlci4pCisgICAgICAgICAgICAgICAgICAgIFNpbmNlIEplcnNleSAyLjgsIHRoZSBmZWF0dXJlIGdldHMgYXV0b21hdGljYWxseSBkaXNjb3ZlcmVkIGFuZCByZWdpc3RlcmVkIHdoZW4gSmVyc2V5IFNTRSBtb2R1bGUgaXMKKyAgICAgICAgICAgICAgICAgICAgcHV0IG9uIHRoZSBhcHBsaWNhdGlvbidzIGNsYXNzcGF0aC4gVGhlIGF1dG9tYXRpYyBkaXNjb3ZlcnkgYW5kIHJlZ2lzdHJhdGlvbiBvZiBTU0UgZmVhdHVyZSBjYW4gYmUgc3VwcHJlc3NlZAorICAgICAgICAgICAgICAgICAgICBieSBzZXR0aW5nICZqZXJzZXkuc3NlLlNzZUZlYXR1cmUuRElTQUJMRV9TU0U7IHByb3BlcnR5IHRvIDxsaXRlcmFsPnRydWU8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICBUaGUgYmVoYXZpb3IgY2FuIGFsc28gYmUgc2VsZWN0aXZlbHkgc3VwcHJlc3NlZCBpbiBlaXRoZXIgY2xpZW50IG9yIHNlcnZlciBydW50aW1lIGJ5IHNldHRpbmcKKyAgICAgICAgICAgICAgICAgICAgJmplcnNleS5zc2UuU3NlRmVhdHVyZS5ESVNBQkxFX1NTRV9DTElFTlQ7IG9yICZqZXJzZXkuc3NlLlNzZUZlYXR1cmUuRElTQUJMRV9TU0VfU0VSVkVSOyBwcm9wZXJ0eQorICAgICAgICAgICAgICAgICAgICByZXNwZWN0aXZlbHkuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9ub3RlPgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHNlY3Rpb24+CisgICAgICAgICAgICA8dGl0bGU+SW1wbGVtZW50aW5nIFNTRSBzdXBwb3J0IGluIGEgSkFYLVJTIHJlc291cmNlPC90aXRsZT4KKyAgICAgICAgICAgIDxzZWN0aW9uPgorICAgICAgICAgICAgICAgIDx0aXRsZT5TaW1wbGUgU1NFIHJlc291cmNlIG1ldGhvZDwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIDxleGFtcGxlIHhtbDppZD0iZXhhbXBsZS1zaW1wbGUtc3NlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5TaW1wbGUgU1NFIHJlc291cmNlIG1ldGhvZDwvdGl0bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj4uLi4KK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5zc2UuRXZlbnRPdXRwdXQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLk91dGJvdW5kRXZlbnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLlNzZUZlYXR1cmU7CisuLi4KKworQFBhdGgoImV2ZW50cyIpCitwdWJsaWMgc3RhdGljIGNsYXNzIFNzZVJlc291cmNlIHsKKworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoU3NlRmVhdHVyZS5TRVJWRVJfU0VOVF9FVkVOVFMpCisgICAgcHVibGljIEV2ZW50T3V0cHV0IGdldFNlcnZlclNlbnRFdmVudHMoKSB7CisgICAgICAgIGZpbmFsIEV2ZW50T3V0cHV0IGV2ZW50T3V0cHV0ID0gbmV3IEV2ZW50T3V0cHV0KCk7CisgICAgICAgIG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgJmx0OyAxMDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi4gY29kZSB0aGF0IHdhaXRzIDEgc2Vjb25kCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPdXRib3VuZEV2ZW50LkJ1aWxkZXIgZXZlbnRCdWlsZGVyID0gbmV3IE91dGJvdW5kRXZlbnQuQnVpbGRlcigpOworICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRCdWlsZGVyLm5hbWUoIm1lc3NhZ2UtdG8tY2xpZW50Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBldmVudEJ1aWxkZXIuZGF0YShTdHJpbmcuY2xhc3MsICJIZWxsbyB3b3JsZCAiICsgaSArICIhIik7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPdXRib3VuZEV2ZW50IGV2ZW50ID0gZXZlbnRCdWlsZGVyLmJ1aWxkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBldmVudE91dHB1dC53cml0ZShldmVudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFcnJvciB3aGVuIHdyaXRpbmcgdGhlIGV2ZW50LiIsIGUpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBldmVudE91dHB1dC5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb0Nsb3NlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXJyb3Igd2hlbiBjbG9zaW5nIHRoZSBldmVudCBvdXRwdXQuIiwgaW9DbG9zZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pLnN0YXJ0KCk7CisgICAgICAgIHJldHVybiBldmVudE91dHB1dDsKKyAgICB9Cit9CisgICAgICAgICAgICAgICAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisKKyAgICAgICAgICAgICAgICAgICAgVGhlIGNvZGUgYWJvdmUgZGVmaW5lcyB0aGUgcmVzb3VyY2UgZGVwbG95ZWQgb24gVVJJIDxsaXRlcmFsPiIvZXZlbnRzIjwvbGl0ZXJhbD4uIFRoaXMgcmVzb3VyY2UgaGFzIGEgc2luZ2xlCisgICAgICAgICAgICAgICAgICAgICZqYXhycy5HRVQ7IHJlc291cmNlIG1ldGhvZCB3aGljaCByZXR1cm5zIGFzIGFuIGVudGl0eSAmamVyc2V5LnNzZS5FdmVudE91dHB1dDsgLSBhbiBleHRlbnNpb24gb2YgZ2VuZXJpYworICAgICAgICAgICAgICAgICAgICBKZXJzZXkKKyAgICAgICAgICAgICAgICAgICAgJmplcnNleS5zZXJ2ZXIuQ2h1bmtlZE91dHB1dDsgQVBJIGZvciBvdXRwdXQgY2h1bmtlZCBtZXNzYWdlIHByb2Nlc3NpbmcuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBJbiB0aGU8eHJlZiBsaW5rZW5kPSJleGFtcGxlLXNpbXBsZS1zc2UiLz4sIHRoZSByZXNvdXJjZSBtZXRob2QgY3JlYXRlcyBhIG5ldyB0aHJlYWQgdGhhdCBzZW5kcyBhIHNlcXVlbmNlIG9mCisgICAgICAgICAgICAgICAgICAgIDEwIGV2ZW50cy4gVGhlcmUgaXMgYSAxIHNlY29uZCBkZWxheSBiZXR3ZWVuIHR3byBzdWJzZXF1ZW50IGV2ZW50cyBhcyBpbmRpY2F0ZWQgaW4gYSBjb21tZW50LiBFYWNoIGV2ZW50IGlzCisgICAgICAgICAgICAgICAgICAgIHJlcHJlc2VudGVkIGJ5ICZsaXQuamVyc2V5LnNzZS5PdXRib3VuZEV2ZW50OyB0eXBlIGFuZCBpcyBidWlsdCB3aXRoIGEgaGVscCBvZiBhbiBvdXRib3VuZCBldmVudAorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5CdWlsZGVyPC9saXRlcmFsPi4gVGhlICZsaXQuamVyc2V5LnNzZS5PdXRib3VuZEV2ZW50OyByZWZsZWN0cyB0aGUgc3RhbmRhcmRpemVkIGZvcm1hdCBvZiBTU0UKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXMKKyAgICAgICAgICAgICAgICAgICAgYW5kIGNvbnRhaW5zIHByb3BlcnRpZXMgdGhhdCByZXByZXNlbnQgPGxpdGVyYWw+bmFtZTwvbGl0ZXJhbD4gKGZvciBuYW1lZAorICAgICAgICAgICAgICAgICAgICBldmVudHMpLCA8bGl0ZXJhbD5jb21tZW50PC9saXRlcmFsPiwgPGxpdGVyYWw+ZGF0YTwvbGl0ZXJhbD4gb3IgPGxpdGVyYWw+aWQ8L2xpdGVyYWw+LiBUaGUgY29kZSBhbHNvIHNldHMgdGhlCisgICAgICAgICAgICAgICAgICAgIGV2ZW50IGRhdGEgbWVkaWEgdHlwZSB1c2luZyB0aGUgPGxpdGVyYWw+bWVkaWFUeXBlKE1lZGlhVHlwZSk8L2xpdGVyYWw+IG1ldGhvZCBvbiB0aGUKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+ZXZlbnRCdWlsZGVyPC9saXRlcmFsPi4gVGhlIG1lZGlhIHR5cGUsIHRvZ2V0aGVyIHdpdGggdGhlIGRhdGEgdHlwZSBzZXQgYnkgdGhlCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmRhdGEoQ2xhc3MsIE9iamVjdD48L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgIG1ldGhvZCAoaW4gb3VyIGNhc2UgPGxpdGVyYWw+U3RyaW5nLmNsYXNzPC9saXRlcmFsPiksIGlzIHVzZWQKKyAgICAgICAgICAgICAgICAgICAgZm9yIHNlcmlhbGl6YXRpb24gb2YgdGhlIGV2ZW50IGRhdGEuIE5vdGUgdGhhdCB0aGUgZXZlbnQgZGF0YSBtZWRpYSB0eXBlIHdpbGwgbm90IGJlIHdyaXR0ZW4gdG8gYW55IGhlYWRlcnMgYXMKKyAgICAgICAgICAgICAgICAgICAgdGhlIHJlc3BvbnNlIDxsaXRlcmFsPkNvbnRlbnQtdHlwZTwvbGl0ZXJhbD4gaGVhZGVyIGlzIGFscmVhZHkgZGVmaW5lZCBieSB0aGUgJmxpdC5qYXhycy5Qcm9kdWNlczsgYW5kIHNldCB0bworICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD4idGV4dC9ldmVudC1zdHJlYW0iPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICB1c2luZyBjb25zdGFudCBmcm9tIHRoZSAmbGl0LmplcnNleS5zc2UuU3NlRmVhdHVyZTsuCisgICAgICAgICAgICAgICAgICAgIFRoZSBldmVudCBtZWRpYSB0eXBlIGlzIHVzZWQgZm9yIHNlcmlhbGl6YXRpb24gb2YgZXZlbnQgPGxpdGVyYWw+ZGF0YTwvbGl0ZXJhbD4uIEV2ZW50IGRhdGEgbWVkaWEgdHlwZSBhbmQKKyAgICAgICAgICAgICAgICAgICAgSmF2YQorICAgICAgICAgICAgICAgICAgICB0eXBlIGFyZSB1c2VkIHRvIHNlbGVjdCB0aGUgcHJvcGVyICZqYXhycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7IGZvciBldmVudCBkYXRhIHNlcmlhbGl6YXRpb24gYW5kIGFyZSBwYXNzZWQKKyAgICAgICAgICAgICAgICAgICAgdG8gdGhlIHNlbGVjdGVkIHdyaXRlciB0aGF0IHNlcmlhbGl6ZXMgdGhlIGV2ZW50IDxsaXRlcmFsPmRhdGE8L2xpdGVyYWw+IGNvbnRlbnQuIEluIG91ciBjYXNlIHRoZSBzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+IkhlbGxvIHdvcmxkICIgKyBpICsgIiEiPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICBpcyBzZXJpYWxpemVkIGFzIDxsaXRlcmFsPiJ0ZXh0L3BsYWluIjwvbGl0ZXJhbD4uIEluIGV2ZW50CisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmRhdGE8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgIHlvdSBjYW4gc2VuZCBhbnkgSmF2YSBlbnRpdHkgYW5kIGFzc29jaWF0ZSBpdCB3aXRoIGFueSBtZWRpYSB0eXBlIHRoYXQgeW91IHdvdWxkIGJlIGFibGUKKyAgICAgICAgICAgICAgICAgICAgdG8gc2VyaWFsaXplIHdpdGggYW4gYXZhaWxhYmxlICZsaXQuamF4cnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOy4gVHlwaWNhbGx5LCB5b3UgbWF5IHdhbnQgdG8gc2VuZCBlLmcuIEpTT04KKyAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgc28geW91IHdvdWxkIGZpbGwgdGhlIDxsaXRlcmFsPmRhdGE8L2xpdGVyYWw+IHdpdGggYSBKQVhCIGFubm90YXRlZCBiZWFuIGluc3RhbmNlIGFuZCBkZWZpbmUgbWVkaWEgdHlwZSB0bworICAgICAgICAgICAgICAgICAgICBKU09OLgorICAgICAgICAgICAgICAgICAgICA8bm90ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHRoZSBldmVudCBtZWRpYSB0eXBlIGlzIG5vdCBzZXQgZXhwbGljaXRseSwgdGhlIDxsaXRlcmFsPiJ0ZXh0L3BsYWluIjwvbGl0ZXJhbD4gbWVkaWEgdHlwZSBpcyB1c2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgZGVmYXVsdC4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICAgICAgPC9ub3RlPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgT25jZSBhbiBvdXRib3VuZCBldmVudCBpcyByZWFkeSwgaXQgY2FuIGJlIHdyaXR0ZW4gdG8gdGhlIDxsaXRlcmFsPmV2ZW50T3V0cHV0PC9saXRlcmFsPi4gQXQgdGhhdCBwb2ludCB0aGUKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQKKyAgICAgICAgICAgICAgICAgICAgaXMgc2VyaWFsaXplZCBieSBpbnRlcm5hbCAmbGl0LmplcnNleS5zc2UuT3V0Ym91bmRFdmVudFdyaXRlcjsgd2hpY2ggdXNlcyBhbiBhcHByb3ByaWF0ZQorICAgICAgICAgICAgICAgICAgICAmbGl0LmpheHJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsgdG8gc2VyaWFsaXplIHRoZSA8bGl0ZXJhbD4iSGVsbG8gd29ybGQgIiArIGkgKyAiISI8L2xpdGVyYWw+IHN0cmluZy4gWW91IGNhbgorICAgICAgICAgICAgICAgICAgICBzZW5kIGFzIG1hbnkgbWVzc2FnZXMgYXMgeW91IGxpa2UuIEF0IHRoZSBlbmQgb2YgdGhlIHRocmVhZCBleGVjdXRpb24gdGhlIHJlc3BvbnNlIGlzIGNsb3NlZCB3aGljaCBhbHNvIGNsb3NlcworICAgICAgICAgICAgICAgICAgICB0aGUgY29ubmVjdGlvbiB0byB0aGUgY2xpZW50LiBBZnRlciB0aGF0LCBubyBtb3JlIG1lc3NhZ2VzIGNhbiBiZSBzZW50IHRvIHRoZSBjbGllbnQgb24gdGhpcyBjb25uZWN0aW9uLiBJZgorICAgICAgICAgICAgICAgICAgICB0aGUKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50IHdvdWxkIGxpa2UgdG8gcmVjZWl2ZSBtb3JlIG1lc3NhZ2VzLCBpdCB3b3VsZCBoYXZlIHRvIHNlbmQgYSBuZXcgcmVxdWVzdCB0byB0aGUgc2VydmVyIHRvIGluaXRpYXRlIGEKKyAgICAgICAgICAgICAgICAgICAgbmV3IFNTRSBzdHJlYW1pbmcgY29ubmVjdGlvbi4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEEgY2xpZW50IGNvbm5lY3RpbmcgdG8gb3VyIFNTRS1lbmFibGVkIHJlc291cmNlIHdpbGwgcmVjZWl2ZSB0aGUgZXhhY3Qgc2FtZSBvdXRwdXQgYXMgaW4gdGhlIGNvcnJlc3BvbmRpbmcKKyAgICAgICAgICAgICAgICAgICAgZXhhbXBsZQorICAgICAgICAgICAgICAgICAgICBpbiB0aGUgSkFYLVJTIGltcGxlbWVudGF0aW9uIGV4YW1wbGUuCisKKyAgICAgICAgICAgICAgICAgICAgPHNjcmVlbiBsYW5ndWFnZT0idGV4dCIgbGluZW51bWJlcmluZz0idW5udW1iZXJlZCI+ZXZlbnQ6IG1lc3NhZ2UtdG8tY2xpZW50CitkYXRhOiBIZWxsbyB3b3JsZCAwIQorCitldmVudDogbWVzc2FnZS10by1jbGllbnQKK2RhdGE6IEhlbGxvIHdvcmxkIDEhCisKKy4uLgorICAgICAgICAgICAgICAgICAgICA8L3NjcmVlbj4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisKKyAgICAgICAgICAgIDxzZWN0aW9uPgorICAgICAgICAgICAgICAgIDx0aXRsZT5Ccm9hZGNhc3Rpbmc8L3RpdGxlPgorCisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIEplcnNleSBTU0Ugc2VydmVyIEFQSSBkZWZpbmVzICZqZXJzZXkuc3NlLlNzZUJyb2FkY2FzdGVyOyB3aGljaCBhbGxvd3MgdG8gYnJvYWRjYXN0IGluZGl2aWR1YWwgZXZlbnRzIHRvCisgICAgICAgICAgICAgICAgICAgIG11bHRpcGxlCisgICAgICAgICAgICAgICAgICAgIGNsaWVudHMuIEEgc2ltcGxlIGJyb2FkY2FzdGluZyBpbXBsZW1lbnRhdGlvbiBpcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CisKKyAgICAgICAgICAgICAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGl0bGU+QnJvYWRjYXN0aW5nIFNTRSBtZXNzYWdlczwvdGl0bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj4uLi4KK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5zc2UuU3NlQnJvYWRjYXN0ZXI7CisuLi4KKworQFNpbmdsZXRvbgorQFBhdGgoImJyb2FkY2FzdCIpCitwdWJsaWMgc3RhdGljIGNsYXNzIEJyb2FkY2FzdGVyUmVzb3VyY2UgeworCisgICAgcHJpdmF0ZSBTc2VCcm9hZGNhc3RlciBicm9hZGNhc3RlciA9IG5ldyBTc2VCcm9hZGNhc3RlcigpOworCisgICAgQFBPU1QKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgQENvbnN1bWVzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgIHB1YmxpYyBTdHJpbmcgYnJvYWRjYXN0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICBPdXRib3VuZEV2ZW50LkJ1aWxkZXIgZXZlbnRCdWlsZGVyID0gbmV3IE91dGJvdW5kRXZlbnQuQnVpbGRlcigpOworICAgICAgICBPdXRib3VuZEV2ZW50IGV2ZW50ID0gZXZlbnRCdWlsZGVyLm5hbWUoIm1lc3NhZ2UiKQorICAgICAgICAgICAgLm1lZGlhVHlwZShNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKQorICAgICAgICAgICAgLmRhdGEoU3RyaW5nLmNsYXNzLCBtZXNzYWdlKQorICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAgICAgYnJvYWRjYXN0ZXIuYnJvYWRjYXN0KGV2ZW50KTsKKyAgICAgICAgcmV0dXJuICJNZXNzYWdlICciICsgbWVzc2FnZSArICInIGhhcyBiZWVuIGJyb2FkY2FzdC4iOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoU3NlRmVhdHVyZS5TRVJWRVJfU0VOVF9FVkVOVFMpCisgICAgcHVibGljIEV2ZW50T3V0cHV0IGxpc3RlblRvQnJvYWRjYXN0KCkgeworICAgICAgICBmaW5hbCBFdmVudE91dHB1dCBldmVudE91dHB1dCA9IG5ldyBFdmVudE91dHB1dCgpOworICAgICAgICB0aGlzLmJyb2FkY2FzdGVyLmFkZChldmVudE91dHB1dCk7CisgICAgICAgIHJldHVybiBldmVudE91dHB1dDsKKyAgICB9Cit9CisgICAgICAgICAgICAgICAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgICAgICAgICAgICAgIFRoZSBleGFtcGxlIGlzIHNpbWlsYXIgdG8gaXRzIHJlbGV2YW50IEpBWC1SUyBjb3VudGVycGFydC4gVGhlIDxsaXRlcmFsPmxpc3RlblRvQnJvYWRjYXN0KCk8L2xpdGVyYWw+IHJlc291cmNlCisgICAgICAgICAgICAgICAgICAgIG1ldGhvZCBjcmVhdGVzIGEgbmV3ICZsaXQuamVyc2V5LnNzZS5FdmVudE91dHB1dDsgcmVwcmVzZW50aW5nIHRoZSBjb25uZWN0aW9uIHRvIHRoZSByZXF1ZXN0aW5nIGNsaWVudAorICAgICAgICAgICAgICAgICAgICBhbmQgcmVnaXN0ZXJzIHRoaXMgPGxpdGVyYWw+ZXZlbnRPdXRwdXQ8L2xpdGVyYWw+IGluc3RhbmNlIHdpdGggdGhlIHNpbmdsZXRvbiA8bGl0ZXJhbD5icm9hZGNhc3RlcjwvbGl0ZXJhbD4sCisgICAgICAgICAgICAgICAgICAgIHVzaW5nIGl0cyA8bGl0ZXJhbD5hZGQoRXZlbnRPdXRwdXQpPC9saXRlcmFsPiBtZXRob2QuIFRoZSBtZXRob2QgdGhlbiByZXR1cm5zIHRoZQorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5ldmVudE91dHB1dDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgd2hpY2ggY2F1c2VzIEplcnNleSB0byBiaW5kIHRoZSA8bGl0ZXJhbD5ldmVudE91dHB1dDwvbGl0ZXJhbD4gaW5zdGFuY2Ugd2l0aCB0aGUgcmVxdWVzdGluZyBjbGllbnQgYW5kIHNlbmQKKyAgICAgICAgICAgICAgICAgICAgdGhlCisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlIEhUVFAgaGVhZGVycyB0byB0aGUgY2xpZW50LiBUaGUgY2xpZW50IGNvbm5lY3Rpb24gcmVtYWlucyBvcGVuIGFuZCB0aGUgY2xpZW50IGlzIG5vdyB3YWl0aW5nIHJlYWR5IHRvCisgICAgICAgICAgICAgICAgICAgIHJlY2VpdmUgbmV3IFNTRSBldmVudHMuIEFsbCB0aGUgZXZlbnRzIGFyZSB3cml0dGVuIHRvIHRoZSA8bGl0ZXJhbD5ldmVudE91dHB1dDwvbGl0ZXJhbD4gYnkKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+YnJvYWRjYXN0ZXI8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgIGxhdGVyIG9uLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgV2hlbiBhIGNsaWVudCB3YW50cyB0byBicm9hZGNhc3QgbmV3IG1lc3NhZ2UgdG8gYWxsIHRoZSBjbGllbnRzIGxpc3RlbmluZyBvbiB0aGVpciBTU0UgY29ubmVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgIGl0IHNlbmRzIGEgJmxpdC5odHRwLlBPU1Q7IHJlcXVlc3QgdG8gPGxpdGVyYWw+QnJvYWRjYXN0ZXJSZXNvdXJjZTwvbGl0ZXJhbD4gcmVzb3VyY2Ugd2l0aCB0aGUgbWVzc2FnZQorICAgICAgICAgICAgICAgICAgICBjb250ZW50LgorICAgICAgICAgICAgICAgICAgICBUaGUgbWV0aG9kIDxsaXRlcmFsPmJyb2FkY2FzdE1lc3NhZ2UoU3RyaW5nKTwvbGl0ZXJhbD4gaXMgaW52b2tlZCBvbgorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5Ccm9hZGNhc3RlclJlc291cmNlPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICByZXNvdXJjZSB3aXRoIHRoZSBtZXNzYWdlIGNvbnRlbnQgYXMgYW4gaW5wdXQgcGFyYW1ldGVyLiBBIG5ldyBTU0Ugb3V0Ym91bmQgZXZlbnQgaXMgYnVpbHQgaW4gdGhlIHN0YW5kYXJkIHdheQorICAgICAgICAgICAgICAgICAgICBhbmQgcGFzc2VkIHRvIHRoZSBicm9hZGNhc3Rlci4gVGhlIGJyb2FkY2FzdGVyIGludGVybmFsbHkgaW52b2tlcyA8bGl0ZXJhbD53cml0ZShPdXRib3VuZEV2ZW50KTwvbGl0ZXJhbD4gb24KKyAgICAgICAgICAgICAgICAgICAgYWxsCisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyZWQgJmxpdC5qZXJzZXkuc3NlLkV2ZW50T3V0cHV0O3MuIEFmdGVyIHRoYXQgdGhlIG1ldGhvZCBqdXN0IHJldHVybiBhIHN0YW5kYXJkIHRleHQgcmVzcG9uc2UKKyAgICAgICAgICAgICAgICAgICAgdG8gdGhlICZsaXQuaHR0cC5QT1NUO2luZyBjbGllbnQgdG8gaW5mb3JtIHRoZSBjbGllbnQgdGhhdCB0aGUgbWVzc2FnZSB3YXMgc3VjY2Vzc2Z1bGx5IGJyb2FkY2FzdC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICA8L3NlY3Rpb24+CisgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICA8c2VjdGlvbj4KKyAgICAgICAgICAgIDx0aXRsZT5Db25zdW1pbmcgU1NFIGV2ZW50cyB3aXRoIEplcnNleSBjbGllbnRzPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgT24gdGhlIGNsaWVudCBzaWRlLCBKZXJzZXkgZXhwb3NlcyBBUElzIHRoYXQgc3VwcG9ydCByZWNlaXZpbmcgYW5kIHByb2Nlc3NpbmcgU1NFIGV2ZW50cyB1c2luZyB0d28gcHJvZ3JhbW1pbmcKKyAgICAgICAgICAgICAgICBtb2RlbHM6CisKKyAgICAgICAgICAgICAgICA8c2ltcGxlbGlzdD4KKyAgICAgICAgICAgICAgICAgICAgPG1lbWJlcj5QdWxsIG1vZGVsIC0gcHVsbGluZyBldmVudHMgZnJvbSBhICZqZXJzZXkuc3NlLkV2ZW50SW5wdXQ7LCBvcgorICAgICAgICAgICAgICAgICAgICA8L21lbWJlcj4KKyAgICAgICAgICAgICAgICAgICAgPG1lbWJlcj5QdXNoIG1vZGVsIC0gbGlzdGVuaW5nIGZvciBhc3luY2hyb25vdXMgbm90aWZpY2F0aW9ucyBvZiAmbGl0LmplcnNleS5zc2UuRXZlbnRTb3VyY2U7CisgICAgICAgICAgICAgICAgICAgIDwvbWVtYmVyPgorICAgICAgICAgICAgICAgIDwvc2ltcGxlbGlzdD4KKyAgICAgICAgICAgICAgICBUaGUgcHVzaCBtb2RlbCBpcyBzaW1pbGFyIHRvIHdoYXQgaXMgaW1wbGVtZW50ZWQgaW4gdGhlIEpBWC1SUyBTU0UgQVBJLiBUaGUgcHVsbCBtb2RlbCBkb2VzIG5vdCBoYXZlIGEgZGlyZWN0CisgICAgICAgICAgICAgICAgY291bnRlcnBhcnQgaW4gdGhlIEpBWC1SUyBBUEkgYW5kIGhhcyB0byBiZSBpbXBsZW1lbnRlZCBieSB0aGUgZGV2ZWxvcGVyLCBpZiByZXF1aXJlZC4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxzZWN0aW9uPgorICAgICAgICAgICAgICAgIDx0aXRsZT5SZWFkaW5nIFNTRSBldmVudHMgd2l0aCAmbGl0LmplcnNleS5zc2UuRXZlbnRJbnB1dDsKKyAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUaGUgZXZlbnRzIGNhbiBiZSByZWFkIG9uIHRoZSBjbGllbnQgc2lkZSBmcm9tIGEgJmplcnNleS5zc2UuRXZlbnRJbnB1dDsuIFNlZSB0aGUgZm9sbG93aW5nIGNvZGU6CisKKyAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+Q2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3QnVpbGRlcigpCisgICAgICAgIC5yZWdpc3RlcihTc2VGZWF0dXJlLmNsYXNzKS5idWlsZCgpOworV2ViVGFyZ2V0IHRhcmdldCA9IGNsaWVudC50YXJnZXQoImh0dHA6Ly9sb2NhbGhvc3Q6OTk5OC9ldmVudHMiKTsKKworRXZlbnRJbnB1dCBldmVudElucHV0ID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoRXZlbnRJbnB1dC5jbGFzcyk7Cit3aGlsZSAoIWV2ZW50SW5wdXQuaXNDbG9zZWQoKSkgeworICAgIGZpbmFsIEluYm91bmRFdmVudCBpbmJvdW5kRXZlbnQgPSBldmVudElucHV0LnJlYWQoKTsKKyAgICBpZiAoaW5ib3VuZEV2ZW50ID09IG51bGwpIHsKKyAgICAgICAgLy8gY29ubmVjdGlvbiBoYXMgYmVlbiBjbG9zZWQKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIFN5c3RlbS5vdXQucHJpbnRsbihpbmJvdW5kRXZlbnQuZ2V0TmFtZSgpICsgIjsgIiArIGluYm91bmRFdmVudC5yZWFkRGF0YShTdHJpbmcuY2xhc3MpKTsKK30KKyAgICAgICAgICAgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKworICAgICAgICAgICAgICAgICAgICBJbiB0aGlzIGV4YW1wbGUsIGEgY2xpZW50IGNvbm5lY3RzIHRvIHRoZSBzZXJ2ZXIgd2hlcmUgdGhlIDxsaXRlcmFsPlNzZVJlc291cmNlPC9saXRlcmFsPiBmcm9tIHRoZQorICAgICAgICAgICAgICAgICAgICA8eHJlZiBsaW5rZW5kPSJleGFtcGxlLXNpbXBsZS1zc2UiLz4KKyAgICAgICAgICAgICAgICAgICAgaXMgZGVwbG95ZWQuIEF0IGZpcnN0LCBhIG5ldyBKQVgtUlMvSmVyc2V5CisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPmNsaWVudDwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UgaXMgY3JlYXRlZCB3aXRoIGEgJmxpdC5qZXJzZXkuc3NlLlNzZUZlYXR1cmU7IHJlZ2lzdGVyZWQuIFRoZW4gYSAmamF4cnMuY2xpZW50LldlYlRhcmdldDsgaW5zdGFuY2UgaXMKKyAgICAgICAgICAgICAgICAgICAgcmV0cmlldmVkIGZyb20gdGhlIDxsaXRlcmFsPmNsaWVudDwvbGl0ZXJhbD4gYW5kIGlzIHVzZWQgdG8gaW52b2tlIGEgSFRUUCByZXF1ZXN0LiBUaGUgcmV0dXJuZWQgcmVzcG9uc2UKKyAgICAgICAgICAgICAgICAgICAgZW50aXR5CisgICAgICAgICAgICAgICAgICAgIGlzIGRpcmVjdGx5IHJlYWQgYXMgYSAmbGl0LmplcnNleS5zc2UuRXZlbnRJbnB1dDsgSmF2YSB0eXBlLCB3aGljaCBpcyBhbiBleHRlbnNpb24gb2YgSmVyc2V5CisgICAgICAgICAgICAgICAgICAgICZsaXQuamVyc2V5LmNsaWVudC5DaHVua2VkSW5wdXQ7IHRoYXQgcHJvdmlkZXMgZ2VuZXJpYyBzdXBwb3J0IGZvciBjb25zdW1pbmcgY2h1bmtlZCBtZXNzYWdlIHBheWxvYWRzLiBUaGUKKyAgICAgICAgICAgICAgICAgICAgY29kZSBpbiB0aGUgZXhhbXBsZSB0aGVuIHByb2Nlc3Mgc3RhcnRzIGEgbG9vcCB0byBwcm9jZXNzIHRoZSBpbmJvdW5kIFNTRSBldmVudHMgcmVhZCBmcm9tIHRoZQorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5ldmVudElucHV0PC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICByZXNwb25zZSBzdHJlYW0uIEVhY2ggY2h1bmsgcmVhZCBmcm9tIHRoZSBpbnB1dCBpcyBhICZsaXQuamVyc2V5LnNzZS5JbmJvdW5kRXZlbnQ7LgorICAgICAgICAgICAgICAgICAgICBUaGUgbWV0aG9kIDxsaXRlcmFsPkluYm91bmRFdmVudC5yZWFkRGF0YShDbGFzcyk8L2xpdGVyYWw+IHByb3ZpZGVzIGEgd2F5IGZvciB0aGUgY2xpZW50IHRvIGluZGljYXRlIHdoYXQgSmF2YQorICAgICAgICAgICAgICAgICAgICB0eXBlCisgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSB1c2VkIGZvciB0aGUgZXZlbnQgZGF0YSBkZS1zZXJpYWxpemF0aW9uLiBJbiBvdXIgZXhhbXBsZSwgaW5kaXZpZHVhbCBldmVudHMgYXJlIGRlLXNlcmlhbGl6ZWQgYXMKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+U3RyaW5nPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICBKYXZhIHR5cGUgaW5zdGFuY2VzLiBUaGlzIG1ldGhvZCBpbnRlcm5hbGx5IGZpbmRzIGFuZCBleGVjdXRlcyBhIHByb3BlcgorICAgICAgICAgICAgICAgICAgICAmamF4cnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyOyB3aGljaCBpcyB0aGUgdXNlZCB0byBkbyB0aGUgYWN0dWFsIGRlLXNlcmlhbGl6YXRpb24uIFRoaXMgaXMgc2ltaWxhciB0byByZWFkaW5nCisgICAgICAgICAgICAgICAgICAgIGFuCisgICAgICAgICAgICAgICAgICAgIGVudGl0eSBmcm9tIHRoZSAmamF4cnMuY29yZS5SZXNwb25zZTsgYnkgPGxpdGVyYWw+cmVhZEVudGl0eShDbGFzcyk8L2xpdGVyYWw+LiBUaGUgbWV0aG9kCisgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPnJlYWREYXRhPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICBjYW4gYWxzbyB0aHJvdyBhICZqYXhycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOy4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgIFRoZSAmbGl0Lm51bGw7IGNoZWNrIG9uIDxsaXRlcmFsPmluYm91bmRFdmVudDwvbGl0ZXJhbD4gaXMgbmVjZXNzYXJ5IHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBjaHVuayB3YXMgcHJvcGVybHkKKyAgICAgICAgICAgICAgICAgICAgcmVhZCBhbmQgY29ubmVjdGlvbiBoYXMgbm90IGJlZW4gY2xvc2VkIGJ5IHRoZSBzZXJ2ZXIuIE9uY2UgdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkLCB0aGUgbG9vcCB0ZXJtaW5hdGVzIGFuZAorICAgICAgICAgICAgICAgICAgICB0aGUgcHJvZ3JhbSBjb21wbGV0ZXMgZXhlY3V0aW9uLiBUaGUgY2xpZW50IGNvZGUgcHJvZHVjZXMgdGhlIGZvbGxvd2luZyBjb25zb2xlIG91dHB1dDoKKworICAgICAgICAgICAgICAgICAgICA8c2NyZWVuIGxhbmd1YWdlPSJ0ZXh0IiBsaW5lbnVtYmVyaW5nPSJ1bm51bWJlcmVkIj5tZXNzYWdlLXRvLWNsaWVudDsgSGVsbG8gd29ybGQgMCEKK21lc3NhZ2UtdG8tY2xpZW50OyBIZWxsbyB3b3JsZCAxIQorbWVzc2FnZS10by1jbGllbnQ7IEhlbGxvIHdvcmxkIDIhCittZXNzYWdlLXRvLWNsaWVudDsgSGVsbG8gd29ybGQgMyEKK21lc3NhZ2UtdG8tY2xpZW50OyBIZWxsbyB3b3JsZCA0IQorbWVzc2FnZS10by1jbGllbnQ7IEhlbGxvIHdvcmxkIDUhCittZXNzYWdlLXRvLWNsaWVudDsgSGVsbG8gd29ybGQgNiEKK21lc3NhZ2UtdG8tY2xpZW50OyBIZWxsbyB3b3JsZCA3IQorbWVzc2FnZS10by1jbGllbnQ7IEhlbGxvIHdvcmxkIDghCittZXNzYWdlLXRvLWNsaWVudDsgSGVsbG8gd29ybGQgOSEKKyAgICAgICAgICAgICAgICAgICAgPC9zY3JlZW4+CisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgICAgICA8c2VjdGlvbj4KKyAgICAgICAgICAgICAgICA8dGl0bGU+QXN5bmNocm9ub3VzIFNTRSBwcm9jZXNzaW5nIHdpdGggJmxpdC5qZXJzZXkuc3NlLkV2ZW50U291cmNlOworICAgICAgICAgICAgICAgIDwvdGl0bGU+CisKKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgVGhlIG1haW4gSmVyc2V5LXNwZWNpZmljIFNTRSBjbGllbnQgQVBJIGNvbXBvbmVudCB1c2VkIHRvIHJlYWQgU1NFIGV2ZW50cyBhc3luY2hyb25vdXNseSBpcworICAgICAgICAgICAgICAgICAgICAmamVyc2V5LnNzZS5FdmVudFNvdXJjZTsuIFRoZSB1c2FnZSBvZiB0aGUgJmxpdC5qZXJzZXkuc3NlLkV2ZW50U291cmNlOyBpcyBzaG93biBvbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUuCisgICAgICAgICAgICAgICAgICAgIDxleGFtcGxlIHhtbDppZD0ic3NlLmV4LmNsaWVudC5ldmVudExpc3RlbmVyIj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5SZWdpc3RlcmluZyAmbGl0LmplcnNleS5zc2UuRXZlbnRMaXN0ZW5lcjsgd2l0aCAmbGl0LmplcnNleS5zc2UuRXZlbnRTb3VyY2U7CisgICAgICAgICAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+Q2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3QnVpbGRlcigpCisgICAgICAgIC5yZWdpc3RlcihTc2VGZWF0dXJlLmNsYXNzKS5idWlsZCgpOworV2ViVGFyZ2V0IHRhcmdldCA9IGNsaWVudC50YXJnZXQoImh0dHA6Ly9leGFtcGxlLmNvbS9ldmVudHMiKTsKK0V2ZW50U291cmNlIGV2ZW50U291cmNlID0gRXZlbnRTb3VyY2UudGFyZ2V0KHRhcmdldCkuYnVpbGQoKTsKK0V2ZW50TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgRXZlbnRMaXN0ZW5lcigpIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkV2ZW50KEluYm91bmRFdmVudCBpbmJvdW5kRXZlbnQpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGluYm91bmRFdmVudC5nZXROYW1lKCkgKyAiOyAiICsgaW5ib3VuZEV2ZW50LnJlYWREYXRhKFN0cmluZy5jbGFzcykpOworICAgIH0KK307CitldmVudFNvdXJjZS5yZWdpc3RlcihsaXN0ZW5lciwgIm1lc3NhZ2UtdG8tY2xpZW50Iik7CitldmVudFNvdXJjZS5vcGVuKCk7CisuLi4KK2V2ZW50U291cmNlLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisKKyAgICAgICAgICAgICAgICAgICAgSW4gdGhpcyBleGFtcGxlLCB0aGUgY2xpZW50IGNvZGUgYWdhaW4gY29ubmVjdHMgdG8gdGhlIHNlcnZlciB3aGVyZSB0aGUgPGxpdGVyYWw+U3NlUmVzb3VyY2U8L2xpdGVyYWw+IGZyb20KKyAgICAgICAgICAgICAgICAgICAgdGhlCisgICAgICAgICAgICAgICAgICAgIDx4cmVmIGxpbmtlbmQ9ImV4YW1wbGUtc2ltcGxlLXNzZSIvPgorICAgICAgICAgICAgICAgICAgICBpcyBkZXBsb3llZC4gVGhlICZqYXhycy5jbGllbnQuQ2xpZW50OyBpbnN0YW5jZQorICAgICAgICAgICAgICAgICAgICBpcyBhZ2FpbiBjcmVhdGVkIGFuZCBpbml0aWFsaXplZCB3aXRoICZqZXJzZXkuc3NlLlNzZUZlYXR1cmU7LiBUaGVuIHRoZSAmamF4cnMuY2xpZW50LldlYlRhcmdldDsgaXMgYnVpbHQuCisgICAgICAgICAgICAgICAgICAgIEluIHRoaXMgY2FzZSBhIHJlcXVlc3QgdG8gdGhlIHdlYiB0YXJnZXQgaXMgbm90IG1hZGUgZGlyZWN0bHkgaW4gdGhlIGNvZGUsIGluc3RlYWQsIHRoZSB3ZWIgdGFyZ2V0IGluc3RhbmNlCisgICAgICAgICAgICAgICAgICAgIGlzIHVzZWQgdG8gaW5pdGlhbGl6ZSBhIG5ldyAmamVyc2V5LnNzZS5FdmVudFNvdXJjZS5CdWlsZGVyOyBpbnN0YW5jZSB0aGF0IGlzIHVzZWQgdG8gYnVpbGQgYSBuZXcKKyAgICAgICAgICAgICAgICAgICAgJmxpdC5qZXJzZXkuc3NlLkV2ZW50U291cmNlOy4gVGhlIGNob2ljZSBvZiA8bGl0ZXJhbD5idWlsZCgpPC9saXRlcmFsPiBtZXRob2QgaXMgaW1wb3J0YW50LCBhcyBpdCB0ZWxscworICAgICAgICAgICAgICAgICAgICB0aGUgJmxpdC5qZXJzZXkuc3NlLkV2ZW50U291cmNlLkJ1aWxkZXI7IHRvIGNyZWF0ZSBhIG5ldyAmbGl0LmplcnNleS5zc2UuRXZlbnRTb3VyY2U7IHRoYXQgaXMgbm90CisgICAgICAgICAgICAgICAgICAgIGF1dG9tYXRpY2FsbHkKKyAgICAgICAgICAgICAgICAgICAgY29ubmVjdGVkIHRvIHRoZSA8bGl0ZXJhbD50YXJnZXQ8L2xpdGVyYWw+LiBUaGUgY29ubmVjdGlvbiBpcyBlc3RhYmxpc2hlZCBvbmx5IGxhdGVyIGJ5IG1hbnVhbGx5IGludm9raW5nCisgICAgICAgICAgICAgICAgICAgIHRoZSA8bGl0ZXJhbD5ldmVudFNvdXJjZS5vcGVuKCk8L2xpdGVyYWw+IG1ldGhvZC4gQSBjdXN0b20gJmplcnNleS5zc2UuRXZlbnRMaXN0ZW5lcjsKKyAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb24gaXMgdXNlZCB0byBsaXN0ZW4gdG8gYW5kIHByb2Nlc3MgaW5jb21pbmcgU1NFIGV2ZW50cy4gVGhlIG1ldGhvZCByZWFkRGF0YShDbGFzcykgc2F5cyB0aGF0IHRoZQorICAgICAgICAgICAgICAgICAgICBldmVudCBkYXRhIHNob3VsZCBiZSBkZS1zZXJpYWxpemVkIGZyb20gYSByZWNlaXZlZCAmamVyc2V5LnNzZS5JbmJvdW5kRXZlbnQ7IGluc3RhbmNlIGludG8gYQorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5TdHJpbmc8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgICAgIEphdmEgdHlwZS4gVGhpcyBtZXRob2QgY2FsbCBpbnRlcm5hbGx5IGV4ZWN1dGVzICZqYXhycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7IHdoaWNoCisgICAgICAgICAgICAgICAgICAgIGRlLXNlcmlhbGl6ZXMgdGhlIGV2ZW50IGRhdGEuIFRoaXMgaXMgc2ltaWxhciB0byByZWFkaW5nIGFuIGVudGl0eSBmcm9tIHRoZSAmamF4cnMuY29yZS5SZXNwb25zZTsgYnkKKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+cmVhZEVudGl0eShDbGFzcyk8L2xpdGVyYWw+LiBUaGUgbWV0aG9kIDxsaXRlcmFsPnJlYWREYXRhPC9saXRlcmFsPiBjYW4gdGhyb3cgYQorICAgICAgICAgICAgICAgICAgICAmamF4cnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbjsuCisgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICBUaGUgY3VzdG9tIGV2ZW50IHNvdXJjZSBsaXN0ZW5lciBpcyByZWdpc3RlcmVkIGluIHRoZSBldmVudCBzb3VyY2UgdmlhCisgICAgICAgICAgICAgICAgICAgICZsaXQuamVyc2V5LnNzZS5FdmVudFNvdXJjZTs8bGl0ZXJhbD4ucmVnaXN0ZXIoRXZlbnRMaXN0ZW5lciwgU3RyaW5nKTwvbGl0ZXJhbD4KKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kLiBUaGUgbmV4dCBtZXRob2QKKyAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzIGRlZmluZSB0aGUgbmFtZXMgb2YgdGhlIGV2ZW50cyB0byByZWNlaXZlIGFuZCBjYW4gYmUgb21pdHRlZC4gSWYgbmFtZXMgYXJlIGRlZmluZWQsIHRoZSBsaXN0ZW5lcgorICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbmFtZWQgZXZlbnRzIGFuZCB3aWxsIG9ubHkgaW52b2tlZCBmb3IgZXZlbnRzIHdpdGggYSBuYW1lIGZyb20gdGhlIHNldCBvZiBkZWZpbmVkCisgICAgICAgICAgICAgICAgICAgIGV2ZW50IG5hbWVzLiBJdCB3aWxsIG5vdCBiZSBpbnZva2VkIGZvciBldmVudHMgd2l0aCBhbnkgb3RoZXIgbmFtZSBvciBmb3IgZXZlbnRzIHdpdGhvdXQgYSBuYW1lLgorCisgICAgICAgICAgICAgICAgICAgIDxpbXBvcnRhbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCBpcyBhIGNvbW1vbiBtaXN0YWtlIHRvIHRoaW5rIHRoYXQgdW5uYW1lZCBldmVudHMgd2lsbCBiZSBwcm9jZXNzZWQgYnkgbGlzdGVuZXJzIHRoYXQgYXJlIHJlZ2lzdGVyZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBwcm9jZXNzIGV2ZW50cyBmcm9tIGEgcGFydGljdWxhciBuYW1lIHNldC4gVGhhdCBpcyBOT1QgdGhlIGNhc2UhIFVubmFtZWQgZXZlbnRzIGFyZSBvbmx5IHByb2Nlc3NlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5IGxpc3RlbmVycyB0aGF0IGFyZSBub3QgbmFtZS1ib3VuZC4gVGhlIHNhbWUgbGltaXRhdGlvbiBhcHBsaWVkIHRvIEhUTUw1IEphdmFzY3JpcHQgU1NFIENsaWVudCBBUEkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQgYnkgbW9kZXJuIGJyb3dzZXJzLgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8L2ltcG9ydGFudD4KKworICAgICAgICAgICAgICAgICAgICBBZnRlciBhIGNvbm5lY3Rpb24gdG8gdGhlIHNlcnZlciBpcyBvcGVuZWQgYnkgY2FsbGluZyB0aGUgPGxpdGVyYWw+b3BlbigpPC9saXRlcmFsPiBtZXRob2Qgb24gdGhlIGV2ZW50CisgICAgICAgICAgICAgICAgICAgIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgdGhlIDxsaXRlcmFsPmV2ZW50U291cmNlPC9saXRlcmFsPiBzdGFydHMgbGlzdGVuaW5nIHRvIGV2ZW50cy4gV2hlbiBhbiBldmVudCBuYW1lZAorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD4ibWVzc2FnZS10by1jbGllbnQiPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICBjb21lcywgdGhlIGxpc3RlbmVyIHdpbGwgYmUgZXhlY3V0ZWQgYnkgdGhlIGV2ZW50IHNvdXJjZS4gSWYgYW55IG90aGVyCisgICAgICAgICAgICAgICAgICAgIGV2ZW50IGNvbWVzICh3aXRoIGEgbmFtZSBkaWZmZXJlbnQgZnJvbSA8bGl0ZXJhbD4ibWVzc2FnZS10by1jbGllbnQiPC9saXRlcmFsPiksIHRoZSByZWdpc3RlcmVkIGxpc3RlbmVyIGlzCisgICAgICAgICAgICAgICAgICAgIG5vdAorICAgICAgICAgICAgICAgICAgICBpbnZva2VkLiBPbmNlIHRoZSBjbGllbnQgaXMgZG9uZSB3aXRoIHByb2Nlc3NpbmcgYW5kIGRvZXMgbm90IHdhbnQgdG8gcmVjZWl2ZSBldmVudHMgYW55bW9yZSwgaXQgY2xvc2VzIHRoZQorICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uIGJ5IGNhbGxpbmcgdGhlIDxsaXRlcmFsPmNsb3NlKCk8L2xpdGVyYWw+IG1ldGhvZCBvbiB0aGUgZXZlbnQgc291cmNlLgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgVGhlIGxpc3RlbmVyIGZyb20gdGhlIGV4YW1wbGUgYWJvdmUgd2lsbCBwcmludCB0aGUgZm9sbG93aW5nIG91dHB1dDoKKyAgICAgICAgICAgICAgICAgICAgPHNjcmVlbiBsYW5ndWFnZT0idGV4dCIgbGluZW51bWJlcmluZz0idW5udW1iZXJlZCI+bWVzc2FnZS10by1jbGllbnQ7IEhlbGxvIHdvcmxkIDAhCittZXNzYWdlLXRvLWNsaWVudDsgSGVsbG8gd29ybGQgMSEKK21lc3NhZ2UtdG8tY2xpZW50OyBIZWxsbyB3b3JsZCAyIQorbWVzc2FnZS10by1jbGllbnQ7IEhlbGxvIHdvcmxkIDMhCittZXNzYWdlLXRvLWNsaWVudDsgSGVsbG8gd29ybGQgNCEKK21lc3NhZ2UtdG8tY2xpZW50OyBIZWxsbyB3b3JsZCA1IQorbWVzc2FnZS10by1jbGllbnQ7IEhlbGxvIHdvcmxkIDYhCittZXNzYWdlLXRvLWNsaWVudDsgSGVsbG8gd29ybGQgNyEKK21lc3NhZ2UtdG8tY2xpZW50OyBIZWxsbyB3b3JsZCA4IQorbWVzc2FnZS10by1jbGllbnQ7IEhlbGxvIHdvcmxkIDkhCisgICAgICAgICAgICAgICAgICAgIDwvc2NyZWVuPgorICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgV2hlbiBicm93c2luZyB0aHJvdWdoIHRoZSBKZXJzZXkgU1NFIEFQSSBkb2N1bWVudGF0aW9uLCB5b3UgbWF5IGhhdmUgbm90aWNlZCB0aGF0IHRoZSAmamVyc2V5LnNzZS5FdmVudFNvdXJjZTsKKyAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyAmamVyc2V5LnNzZS5FdmVudExpc3RlbmVyOyBhbmQgcHJvdmlkZXMgYW4gZW1wdHkgaW1wbGVtZW50YXRpb24gZm9yIHRoZQorICAgICAgICAgICAgICAgICAgICA8bGl0ZXJhbD5vbkV2ZW50KEluYm91bmRFdmVudCBpbmJvdW5kRXZlbnQpPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lciBtZXRob2QuIFRoaXMgYWRkcyBtb3JlIGZsZXhpYmlsaXR5IHRvIHRoZQorICAgICAgICAgICAgICAgICAgICBKZXJzZXkgY2xpZW50LXNpZGUgU1NFIEFQSS4gSW5zdGVhZCBvZiBkZWZpbmluZyBhbmQgcmVnaXN0ZXJpbmcgYSBzZXBhcmF0ZSBldmVudCBsaXN0ZW5lciwgaW4gc2ltcGxlIHNjZW5hcmlvcworICAgICAgICAgICAgICAgICAgICB5b3UgY2FuIGFsc28gY2hvb3NlIHRvIGRlcml2ZSBkaXJlY3RseSBmcm9tIHRoZSAmbGl0LmplcnNleS5zc2UuRXZlbnRTb3VyY2U7IGFuZCBvdmVycmlkZSB0aGUgZW1wdHkgbGlzdGVuZXIKKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kIHRvIGhhbmRsZSB0aGUgaW5jb21pbmcgZXZlbnRzLiBUaGlzIHByb2dyYW1taW5nIG1vZGVsIGlzIHNob3duIGluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZToKKworICAgICAgICAgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0aXRsZT5PdmVycmlkaW5nIDxsaXRlcmFsPkV2ZW50U291cmNlLm9uRXZlbnQoSW5ib3VuZEV2ZW50KTwvbGl0ZXJhbD4gbWV0aG9kCisgICAgICAgICAgICAgICAgICAgICAgICA8L3RpdGxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+Q2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3QnVpbGRlcigpCisgICAgICAgIC5yZWdpc3RlcihTc2VGZWF0dXJlLmNsYXNzKS5idWlsZCgpOworV2ViVGFyZ2V0IHRhcmdldCA9IGNsaWVudC50YXJnZXQoImh0dHA6Ly9leGFtcGxlLmNvbS9ldmVudHMiKTsKK0V2ZW50U291cmNlIGV2ZW50U291cmNlID0gbmV3IEV2ZW50U291cmNlKHRhcmdldCkgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRXZlbnQoSW5ib3VuZEV2ZW50IGluYm91bmRFdmVudCkgeworICAgICAgICBpZiAoIm1lc3NhZ2UtdG8tY2xpZW50Ii5lcXVhbHMoaW5ib3VuZEV2ZW50LmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihpbmJvdW5kRXZlbnQuZ2V0TmFtZSgpICsgIjsgIiArIGluYm91bmRFdmVudC5yZWFkRGF0YShTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgfQorICAgIH0KK307CisuLi4KK2V2ZW50U291cmNlLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICA8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgICAgICA8L2V4YW1wbGU+CisKKyAgICAgICAgICAgICAgICAgICAgVGhlIGNvZGUgYWJvdmUgaXMgdmVyeSBzaW1pbGFyIHRvIHRoZSBjb2RlIGluPHhyZWYgbGlua2VuZD0ic3NlLmV4LmNsaWVudC5ldmVudExpc3RlbmVyIi8+LiBJbiB0aGlzIGV4YW1wbGUKKyAgICAgICAgICAgICAgICAgICAgaG93ZXZlciwgdGhlICZsaXQuamVyc2V5LnNzZS5FdmVudFNvdXJjZTsgaXMgY29uc3RydWN0ZWQgZGlyZWN0bHkgdXNpbmcgYSBzaW5nbGUtcGFyYW1ldGVyIGNvbnN0cnVjdG9yLgorICAgICAgICAgICAgICAgICAgICBUaGlzIHdheSwgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIFNTRSBlbmRwb2ludCBpcyBieSBkZWZhdWx0IGF1dG9tYXRpY2FsbHkgb3BlbmVkIGF0IHRoZSBldmVudCBzb3VyY2UKKyAgICAgICAgICAgICAgICAgICAgY3JlYXRpb24uIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgJmxpdC5qZXJzZXkuc3NlLkV2ZW50TGlzdGVuZXI7IGhhcyBiZWVuIG1vdmVkIGludG8gdGhlIG92ZXJyaWRkZW4KKyAgICAgICAgICAgICAgICAgICAgPGxpdGVyYWw+RXZlbnRTb3VyY2Uub25FdmVudCguLi4pPC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICBtZXRob2QuIEhvd2V2ZXIsIHRoaXMgdGltZSwgdGhlIGxpc3RlbmVyIG1ldGhvZCB3aWxsIGJlIGV4ZWN1dGVkIGZvcgorICAgICAgICAgICAgICAgICAgICBhbGwgZXZlbnRzIC0gdW5uYW1lZCBhcyB3ZWxsIGFzIHdpdGggYW55IDxsaXRlcmFsPm5hbWU8L2xpdGVyYWw+LiBUaGVyZWZvcmUgdGhlIGNvZGUgY2hlY2tzIHRoZSBuYW1lIHdoZXRoZXIKKyAgICAgICAgICAgICAgICAgICAgaXQgaXMKKyAgICAgICAgICAgICAgICAgICAgYW4gZXZlbnQgd2l0aCB0aGUgbmFtZSAibWVzc2FnZS10by1jbGllbnQiIHRoYXQgd2Ugd2FudCB0byBoYW5kbGUuIE5vdGUgdGhhdCB5b3UgY2FuIHN0aWxsIHJlZ2lzdGVyCisgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWwgJmxpdC5qZXJzZXkuc3NlLkV2ZW50TGlzdGVuZXI7cyBsYXRlciBvbi4gVGhlIG92ZXJyaWRkZW4gbWV0aG9kIG9uIHRoZSBldmVudCBzb3VyY2UgYWxsb3dzIHlvdSB0bworICAgICAgICAgICAgICAgICAgICBoYW5kbGUgbWVzc2FnZXMgZXZlbiB3aGVuIG5vIGFkZGl0aW9uYWwgbGlzdGVuZXJzIGFyZSByZWdpc3RlcmVkIHlldC4KKyAgICAgICAgICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgICAgICAgICA8c2VjdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHRpdGxlPiZsaXQuamVyc2V5LnNzZS5FdmVudFNvdXJjZTsgcmVjb25uZWN0IHN1cHBvcnQKKyAgICAgICAgICAgICAgICAgICAgPC90aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICBSZWNvbm5lY3Qgc3VwcG9ydCBpbiBKZXJzZXktc3BlY2lmaWMgJmxpdC5qZXJzZXkuc3NlLkV2ZW50U291cmNlOyB3b3JrcyB0aGUgc2FtZSB3YXkgYXMgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSkFYLVJTICZqYXZheC53cy5ycy5zc2UuU3NlRXZlbnRTb3VyY2U7LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICAgICAgPC9zZWN0aW9uPgorICAgICAgICA8L3NlY3Rpb24+CisgICAgPC9zZWN0aW9uPgorPC9jaGFwdGVyPgpkaWZmIC0tZ2l0IGEvZG9jcy9zcmMvbWFpbi9kb2Nib29rL3Rlc3QtZnJhbWV3b3JrLnhtbCBiL2RvY3Mvc3JjL21haW4vZG9jYm9vay90ZXN0LWZyYW1ld29yay54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI2ZDRlZQotLS0gL2Rldi9udWxsCisrKyBiL2RvY3Mvc3JjL21haW4vZG9jYm9vay90ZXN0LWZyYW1ld29yay54bWwKQEAgLTAsMCArMSw0NzYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzwhRE9DVFlQRSBjaGFwdGVyIFs8IUVOVElUWSAlIGVudHMgU1lTVEVNICJqZXJzZXkuZW50IiA+ICVlbnRzOyBdPgorPGNoYXB0ZXIgeG1sbnM9Imh0dHA6Ly9kb2Nib29rLm9yZy9ucy9kb2Nib29rIgorICAgICAgICAgdmVyc2lvbj0iNS4wIgorICAgICAgICAgeG1sOmxhbmc9ImVuIgorICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIgorICAgICAgICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9kb2Nib29rLm9yZy9ucy9kb2Nib29rIGh0dHA6Ly9kb2Nib29rLm9yZy94bWwvNS4wL3hzZC9kb2Nib29rLnhzZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIGh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsueHNkIgorICAgICAgICAgeG1sOmlkPSJ0ZXN0LWZyYW1ld29yayI+CisKKyAgICA8dGl0bGU+SmVyc2V5IFRlc3QgRnJhbWV3b3JrPC90aXRsZT4KKworICAgIDxwYXJhPgorICAgICAgICBKZXJzZXkgVGVzdCBGcmFtZXdvcmsgb3JpZ2luYXRlZCBhcyBhbiBpbnRlcm5hbCB0b29sIHVzZWQgZm9yIHZlcmlmeWluZyB0aGUgY29ycmVjdCBpbXBsZW1lbnRhdGlvbiBvZgorICAgICAgICBzZXJ2ZXItc2lkZSBjb21wb25lbnRzLiBUZXN0aW5nIFJFU1RmdWwgYXBwbGljYXRpb25zIGJlY2FtZSBhIG1vcmUgcHJlc3NpbmcgaXNzdWUgd2l0aCAibW9kZXJuIiBhcHByb2FjaGVzIGxpa2UKKyAgICAgICAgdGVzdC1kcml2ZW4gZGV2ZWxvcG1lbnQgYW5kIHVzZXJzIHN0YXJ0ZWQgdG8gbG9vayBmb3IgYSB0b29sIHRoYXQgY291bGQgaGVscCB3aXRoIGRlc2lnbmluZyBhbmQgcnVubmluZworICAgICAgICB0aGUgdGVzdHMgYXMgZmFzdCBhcyBwb3NzaWJsZSBidXQgd2l0aCBtYW55IG9wdGlvbnMgcmVsYXRlZCB0byB0ZXN0IGV4ZWN1dGlvbiBlbnZpcm9ubWVudC4KKyAgICA8L3BhcmE+CisKKyAgICA8cGFyYT4KKyAgICAgICAgQ3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiBKZXJzZXkgVGVzdCBGcmFtZXdvcmsgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBzZXQgb2YgZmVhdHVyZXM6CisKKyAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT5wcmUtY29uZmlndXJlZCBjbGllbnQgdG8gYWNjZXNzIGRlcGxveWVkIGFwcGxpY2F0aW9uPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+c3VwcG9ydCBmb3IgbXVsdGlwbGUgY29udGFpbmVycyAtIGdyaXp6bHksIGluLW1lbW9yeSwgamRrLCBzaW1wbGUsIGpldHR5PC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+YWJsZSB0byBydW4gYWdhaW5zdCBhbnkgZXh0ZXJuYWwgY29udGFpbmVyPC9wYXJhPjwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+YXV0b21hdGVkIGNvbmZpZ3VyYWJsZSB0cmFmZmljIGxvZ2dpbmc8L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisKKyAgICAgICAgSmVyc2V5IFRlc3QgRnJhbWV3b3JrIGlzIHByaW1hcmlseSBiYXNlZCBvbiBKVW5pdCBidXQgeW91IGNhbiBydW4gdGVzdHMgdXNpbmcgVGVzdE5HIGFzIHdlbGwuIEl0IHdvcmtzIGFsbW9zdCBvdXQtb2YtdGhlCisgICAgICAgIGJveCBhbmQgaXQgaXMgZWFzeSB0byBpbnRlZ3JhdGUgaXQgd2l0aGluIHlvdXIgTWF2ZW4tYmFzZWQgcHJvamVjdC4gV2hpbGUgaXQgaXMgdXNhYmxlIG9uIGFsbCBlbnZpcm9ubWVudHMgd2hlcmUgeW91IGNhbgorICAgICAgICBydW4gSlVuaXQsIHdlIHN1cHBvcnQgcHJpbWFyaWx5IHRoZSBNYXZlbi1iYXNlZCBzZXR1cHMuCisgICAgPC9wYXJhPgorCisgICAgPHNlY3Rpb24+CisgICAgICAgIDx0aXRsZT5CYXNpY3M8L3RpdGxlPgorCisgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPnB1YmxpYyBjbGFzcyBTaW1wbGVUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAUGF0aCgiaGVsbG8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSGVsbG9SZXNvdXJjZSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRIZWxsbygpIHsKKyAgICAgICAgICAgIHJldHVybiAiSGVsbG8gV29ybGQhIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoSGVsbG9SZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0KCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgaGVsbG8gPSB0YXJnZXQoImhlbGxvIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkhlbGxvIFdvcmxkISIsIGhlbGxvKTsKKyAgICB9Cit9PC9wcm9ncmFtbGlzdGluZz4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIElmIHlvdSB3YW50IHRvIGRldmVsb3AgYSB0ZXN0IHVzaW5nIEplcnNleSBUZXN0IEZyYW1ld29yaywgeW91IG5lZWQgdG8gc3ViY2xhc3MgJmplcnNleS50ZXN0LkplcnNleVRlc3Q7IGFuZAorICAgICAgICAgICAgY29uZmlndXJlIHRoZSBzZXQgb2YgcmVzb3VyY2VzIGFuZC9vciBwcm92aWRlcnMgdGhhdCB3aWxsIGJlIGRlcGxveWVkIGFzIHBhcnQgb2YgdGhlIHRlc3QgYXBwbGljYXRpb24uIFRoaXMgc2hvcnQKKyAgICAgICAgICAgIGNvZGUgc25pcHBldCBzaG93cyBiYXNpYyByZXNvdXJjZSBjbGFzcyA8bGl0ZXJhbD5IZWxsb1Jlc291cmNlPC9saXRlcmFsPiB1c2VkIGluIHRlc3RzIGRlZmluZWQgYXMgcGFydCBvZiB0aGUKKyAgICAgICAgICAgIDxsaXRlcmFsPlNpbXBsZVRlc3Q8L2xpdGVyYWw+IGNsYXNzLiBUaGUgb3ZlcnJpZGRlbiA8bGl0ZXJhbD5jb25maWd1cmU8L2xpdGVyYWw+IG1ldGhvZCByZXR1cm5zCisgICAgICAgICAgICBhICZqZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOyBvZiB0aGUgdGVzdCBhcHBsaWNhdGlvbix0aGF0IGNvbnRhaW5zIG9ubHkgdGhlIDxsaXRlcmFsPkhlbGxvUmVzb3VyY2U8L2xpdGVyYWw+CisgICAgICAgICAgICByZXNvdXJjZSBjbGFzcy4gJmxpdC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOyBpcyBhIHN1Yi1jbGFzcyBvZiBKQVgtUlMgJmpheHJzLmNvcmUuQXBwbGljYXRpb247LiBJdCBpcyBhIEplcnNleQorICAgICAgICAgICAgY29udmVuaWVuY2UgY2xhc3MgZm9yIGNvbmZpZ3VyaW5nIEpBWC1SUyBhcHBsaWNhdGlvbnMuICZsaXQuamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsgYWxzbyBpbXBsZW1lbnRzIEpBWC1SUworICAgICAgICAgICAgJmpheHJzLmNvcmUuQ29uZmlndXJhYmxlOyBpbnRlcmZhY2UgdG8gbWFrZSB0aGUgYXBwbGljYXRpb24gY29uZmlndXJhdGlvbiBtb3JlIGZsZXhpYmxlLgorICAgICAgICA8L3BhcmE+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24+CisgICAgICAgIDx0aXRsZT5TdXBwb3J0ZWQgQ29udGFpbmVyczwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAmamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsgc3VwcG9ydHMgZGVwbG95aW5nIGFwcGxpY2F0aW9ucyBvbiB2YXJpb3VzIGNvbnRhaW5lcnMsIGFsbCAoZXhjZXB0IHRoZSBleHRlcm5hbCBjb250YWluZXIKKyAgICAgICAgICAgIHdyYXBwZXIpIG5lZWQgdG8gaGF2ZSBzb21lICJnbHVlIiBjb2RlIHRvIGJlIHN1cHBvcnRlZC4gQ3VycmVudGx5IEplcnNleSBUZXN0IEZyYW1ld29yayBwcm92aWRlcyBzdXBwb3J0IGZvcgorICAgICAgICAgICAgR3JpenpseSwgSW4tTWVtb3J5LCBKREsgKDxsaXRlcmFsPmNvbS5zdW4ubmV0Lmh0dHBzZXJ2ZXIuSHR0cFNlcnZlcjwvbGl0ZXJhbD4pLCBTaW1wbGUgSFRUUCBjb250YWluZXIKKyAgICAgICAgICAgICg8bGl0ZXJhbD5vcmcuc2ltcGxlZnJhbWV3b3JrLmh0dHA8L2xpdGVyYWw+KSBhbmQgSmV0dHkgSFRUUCBjb250YWluZXIgKDxsaXRlcmFsPm9yZy5lY2xpcHNlLmpldHR5PC9saXRlcmFsPikuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEEgdGVzdCBjb250YWluZXIgaXMgc2VsZWN0ZWQgYmFzZWQgb24gdmFyaW91cyBpbnB1dHMuCisgICAgICAgICAgICA8bGluayB4bGluazpocmVmPSImamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvdGVzdC9KZXJzZXlUZXN0Lmh0bWwjZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSI+SmVyc2V5VGVzdCNnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpPC9saW5rPgorICAgICAgICAgICAgaXMgYWx3YXlzIGV4ZWN1dGVkLCBzbyBpZiB5b3Ugb3ZlcnJpZGUgaXQgYW5kIHByb3ZpZGUgeW91ciBvd24gdmVyc2lvbiBvZgorICAgICAgICAgICAgJmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTssIG5vdGhpbmcgZWxzZSB3aWxsIGJlIGNvbnNpZGVyZWQuCisgICAgICAgICAgICBTZXR0aW5nIGEgc3lzdGVtIHZhcmlhYmxlCisgICAgICAgICAgICA8bGluayB4bGluazpocmVmPSImamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvdGVzdC9UZXN0UHJvcGVydGllcy5odG1sI0NPTlRBSU5FUl9GQUNUT1JZIj5UZXN0UHJvcGVydGllcyNDT05UQUlORVJfRkFDVE9SWTwvbGluaz4KKyAgICAgICAgICAgIGhhcyBzaW1pbGFyIGVmZmVjdC4gVGhpcyB3YXkgeW91IG1heSBkZWZlciB0aGUgZGVjaXNpb24gb24gd2hpY2ggY29udGFpbmVycyB5b3Ugd2FudCB0byBydW4geW91ciB0ZXN0cworICAgICAgICAgICAgZnJvbSB0aGUgY29tcGlsZSB0aW1lIHRvIHRoZSB0ZXN0IGV4ZWN1dGlvbiB0aW1lLgorICAgICAgICAgICAgRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiAmbGl0LmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsgbG9va3MgZm9yIGNvbnRhaW5lciBmYWN0b3JpZXMgb24gY2xhc3NwYXRoLgorICAgICAgICAgICAgSWYgbW9yZSB0aGFuIG9uZSBpbnN0YW5jZSBpcyBmb3VuZCBhbmQgdGhlcmUgaXMgYSBHcml6emx5IHRlc3QgY29udGFpbmVyIGZhY3RvcnkgYW1vbmcgdGhlbSwgaXQgd2lsbCBiZSB1c2VkOyBpZiBub3QsCisgICAgICAgICAgICBhIHdhcm5pbmcgd2lsbCBiZSBsb2dnZWQgYW5kIHRoZSBmaXJzdCBmb3VuZCBmYWN0b3J5IHdpbGwgYmUgaW5zdGFudGlhdGVkLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBGb2xsb3dpbmcgaXMgYSBicmllZiBkZXNjcmlwdGlvbiBvZiBhbGwgY29udGFpbmVyIGZhY3RvcmllcyBzdXBwb3J0ZWQgaW4gSmVyc2V5IFRlc3QgRnJhbWV3b3JrLgorICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgSmVyc2V5IHByb3ZpZGVzIDIgZGlmZmVyZW50IHRlc3QgY29udGFpbmVyIGZhY3RvcmllcyBiYXNlZCBvbiBHcml6emx5LgorICAgICAgICAgICAgICAgICAgICAgICAgVGhlIDxsaXRlcmFsPkdyaXp6bHlUZXN0Q29udGFpbmVyRmFjdG9yeTwvbGl0ZXJhbD4gY3JlYXRlcyBhIGNvbnRhaW5lciB0aGF0IGNhbiBydW4gYXMgYSBsaWdodC13ZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBwbGFpbiBIVFRQIGNvbnRhaW5lci4gQWxtb3N0IGFsbCBKZXJzZXkgdGVzdHMgYXJlIHVzaW5nIEdyaXp6bHkgSFRUUCB0ZXN0IGNvbnRhaW5lciBmYWN0b3J5LgorICAgICAgICAgICAgICAgICAgICAgICAgU2Vjb25kIGZhY3RvcnkgaXMgPGxpdGVyYWw+R3JpenpseVdlYlRlc3RDb250YWluZXJGYWN0b3J5PC9saXRlcmFsPiB0aGF0IGlzIFNlcnZsZXQtYmFzZWQgYW5kIHN1cHBvcnRzCisgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2bGV0IGRlcGxveW1lbnQgY29udGV4dCBmb3IgdGVzdGVkIGFwcGxpY2F0aW9ucy4gVGhpcyBmYWN0b3J5IGNhbiBiZSB1c2VmdWwgd2hlbiB0ZXN0aW5nIG1vcmUgY29tcGxleAorICAgICAgICAgICAgICAgICAgICAgICAgU2VydmxldC1iYXNlZCBhcHBsaWNhdGlvbiBkZXBsb3ltZW50cy4KKworICAgICAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJ4bWwiPiZsdDtkZXBlbmRlbmN5Jmd0OworICAgICZsdDtncm91cElkJmd0O29yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVycyZsdDsvZ3JvdXBJZCZndDsKKyAgICAmbHQ7YXJ0aWZhY3RJZCZndDtqZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZ3JpenpseTImbHQ7L2FydGlmYWN0SWQmZ3Q7CisgICAgJmx0O3ZlcnNpb24mZ3Q7JnZlcnNpb247Jmx0Oy92ZXJzaW9uJmd0OworJmx0Oy9kZXBlbmRlbmN5Jmd0OzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorCisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIEluLU1lbW9yeSBjb250YWluZXIgaXMgbm90IGEgcmVhbCBjb250YWluZXIuIEl0IHN0YXJ0cyBKZXJzZXkgYXBwbGljYXRpb24gYW5kIGRpcmVjdGx5IGNhbGxzIGludGVybmFsCisgICAgICAgICAgICAgICAgICAgICAgICBBUElzIHRvIGhhbmRsZSByZXF1ZXN0IGNyZWF0ZWQgYnkgY2xpZW50IHByb3ZpZGVkIGJ5IHRlc3QgZnJhbWV3b3JrLiBUaGVyZSBpcyBubyBuZXR3b3JrIGNvbW11bmljYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIGludm9sdmVkLiBUaGlzIGNvbnRhaW5lcnMgZG9lcyBub3Qgc3VwcG9ydCBzZXJ2bGV0IGFuZCBvdGhlciBjb250YWluZXIgZGVwZW5kZW50IGZlYXR1cmVzLCBidXQgaXQgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgIGEgcGVyZmVjdCBjaG9pY2UgZm9yIHNpbXBsZSB1bml0IHRlc3RzLgorCisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9InhtbCI+Jmx0O2RlcGVuZGVuY3kmZ3Q7CisgICAgJmx0O2dyb3VwSWQmZ3Q7b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzJmx0Oy9ncm91cElkJmd0OworICAgICZsdDthcnRpZmFjdElkJmd0O2plcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1pbm1lbW9yeSZsdDsvYXJ0aWZhY3RJZCZndDsKKyAgICAmbHQ7dmVyc2lvbiZndDsmdmVyc2lvbjsmbHQ7L3ZlcnNpb24mZ3Q7CismbHQ7L2RlcGVuZGVuY3kmZ3Q7PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaXRlcmFsPkh0dHBTZXJ2ZXI8L2xpdGVyYWw+IGZyb20gT3JhY2xlIEpESyBpcyBhbm90aGVyIHN1cHBvcnRlZCB0ZXN0IGNvbnRhaW5lci4KKworICAgICAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJ4bWwiPiZsdDtkZXBlbmRlbmN5Jmd0OworICAgICZsdDtncm91cElkJmd0O29yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVycyZsdDsvZ3JvdXBJZCZndDsKKyAgICAmbHQ7YXJ0aWZhY3RJZCZndDtqZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItamRrLWh0dHAmbHQ7L2FydGlmYWN0SWQmZ3Q7CisgICAgJmx0O3ZlcnNpb24mZ3Q7JnZlcnNpb247Jmx0Oy92ZXJzaW9uJmd0OworJmx0Oy9kZXBlbmRlbmN5Jmd0OzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICBTaW1wbGUgY29udGFpbmVyICg8bGl0ZXJhbD5vcmcuc2ltcGxlZnJhbWV3b3JrLmh0dHA8L2xpdGVyYWw+KSBpcyBhbm90aGVyIGxpZ2h0LXdlaWdodCBIVFRQIGNvbnRhaW5lcgorICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBpbnRlZ3JhdGVzIHdpdGggSmVyc2V5IGFuZCBpcyBzdXBwb3J0ZWQgYnkgSmVyc2V5IFRlc3QgRnJhbWV3b3JrLgorCisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9InhtbCI+Jmx0O2RlcGVuZGVuY3kmZ3Q7CisgICAgJmx0O2dyb3VwSWQmZ3Q7b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzJmx0Oy9ncm91cElkJmd0OworICAgICZsdDthcnRpZmFjdElkJmd0O2plcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1zaW1wbGUmbHQ7L2FydGlmYWN0SWQmZ3Q7CisgICAgJmx0O3ZlcnNpb24mZ3Q7JnZlcnNpb247Jmx0Oy92ZXJzaW9uJmd0OworJmx0Oy9kZXBlbmRlbmN5Jmd0OzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICBKZXR0eSBjb250YWluZXIgKDxsaXRlcmFsPm9yZy5lY2xpcHNlLmpldHR5PC9saXRlcmFsPikgaXMgYW5vdGhlciBoaWdoLXBlcmZvcm1hbmNlLCBsaWdodC13ZWlnaHQgSFRUUCBzZXJ2ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQgaW50ZWdyYXRlcyB3aXRoIEplcnNleSBhbmQgaXMgc3VwcG9ydGVkIGJ5IEplcnNleSBUZXN0IEZyYW1ld29yay4KKworICAgICAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJ4bWwiPiZsdDtkZXBlbmRlbmN5Jmd0OworICAgICZsdDtncm91cElkJmd0O29yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVycyZsdDsvZ3JvdXBJZCZndDsKKyAgICAmbHQ7YXJ0aWZhY3RJZCZndDtqZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItamV0dHkmbHQ7L2FydGlmYWN0SWQmZ3Q7CisgICAgJmx0O3ZlcnNpb24mZ3Q7JnZlcnNpb247Jmx0Oy92ZXJzaW9uJmd0OworJmx0Oy9kZXBlbmRlbmN5Jmd0OzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiB4bWw6aWQ9InRlc3RuZyI+CisgICAgICAgIDx0aXRsZT5SdW5uaW5nIFRlc3RORyBUZXN0czwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBJdCBpcyBwb3NzaWJsZSB0byBydW4gbm90IG9ubHkgSlVuaXQgdGVzdHMgYnV0IGFsc28gdGVzdHMgYmFzZWQgb24gVGVzdE5HLiBJbiBvcmRlciB0byBkbyB0aGlzIHlvdSBuZWVkIHRvIG1ha2Ugc3VyZQorICAgICAgICAgICAgdGhlIGZvbGxvd2luZyAyIHN0ZXBzIGFyZSBmdWxmaWxsZWQ6CisKKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuZCAmamVyc2V5LnRlc3QuSmVyc2V5VGVzdE5nOywgb3Igb25lIG9mIGl0J3MgaW5uZXIgY2xhc3NlcyAmamVyc2V5LnRlc3QuSmVyc2V5VGVzdE5nLkNvbnRhaW5lclBlckNsYXNzVGVzdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8gJmplcnNleS50ZXN0LkplcnNleVRlc3ROZy5Db250YWluZXJQZXJNZXRob2RUZXN0OywgaW5zdGVhZCBvZiAmamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsuCisgICAgICAgICAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICBBZGQgVGVzdE5HIHRvIHlvdXIgY2xhc3MtcGF0Y2gsIGkuZS46CisKKyAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0ieG1sIj4mbHQ7ZGVwZW5kZW5jeSZndDsKKyAgICAmbHQ7Z3JvdXBJZCZndDtvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yayZsdDsvZ3JvdXBJZCZndDsKKyAgICAmbHQ7YXJ0aWZhY3RJZCZndDtqZXJzZXktdGVzdC1mcmFtZXdvcmstY29yZSZsdDsvYXJ0aWZhY3RJZCZndDsKKyAgICAmbHQ7dmVyc2lvbiZndDsmdmVyc2lvbjsmbHQ7L3ZlcnNpb24mZ3Q7CismbHQ7L2RlcGVuZGVuY3kmZ3Q7CismbHQ7ZGVwZW5kZW5jeSZndDsKKyAgICAmbHQ7Z3JvdXBJZCZndDtvcmcudGVzdG5nJmx0Oy9ncm91cElkJmd0OworICAgICZsdDthcnRpZmFjdElkJmd0O3Rlc3RuZyZsdDsvYXJ0aWZhY3RJZCZndDsKKyAgICAmbHQ7dmVyc2lvbiZndDsuLi4mbHQ7L3ZlcnNpb24mZ3Q7CismbHQ7L2RlcGVuZGVuY3kmZ3Q7PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRvIGRpc2N1c3MgdGhlIGZvcm1lciByZXF1aXJlbWVudCBpbiBtb3JlIGRlcHRoIHdlIG5lZWQgdG8gdGFrZSBhIGxvb2sgYXQgdGhlIGRpZmZlcmVuY2VzIGJldHdlZW4gSlVuaXQgYW5kIFRlc3RORy4KKyAgICAgICAgICAgIEpVbml0IGNyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgYSB0ZXN0IGNsYXNzIGZvciBldmVyeSB0ZXN0IHByZXNlbnQgaW4gdGhhdCBjbGFzcyB3aGljaCwgZnJvbSB0aGUgcG9pbnQgb2YgdmlldyBvZgorICAgICAgICAgICAgSmVyc2V5IFRlc3QgRnJhbWV3b3JrLCBtZWFucyB0aGF0IG5ldyB0ZXN0IGNvbnRhaW5lciBhbmQgY2xpZW50IGlzIGNyZWF0ZWQgZm9yIGVhY2ggdGVzdCBvZiBhIHRlc3QgY2xhc3MuIEhvd2V2ZXIsCisgICAgICAgICAgICBUZXN0TkcgY3JlYXRlcyBvbmx5IG9uZSBpbnN0YW5jZSBvZiBhIHRlc3QgY2xhc3MgYW5kIHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgdGVzdCBjb250YWluZXIgZGVwZW5kcyBtb3JlIG9uCisgICAgICAgICAgICBzZXR1cC90ZWFyZG93biBtZXRob2RzIChkcml2ZW4gYnkgPGxpdGVyYWw+QEJlZm9yZVhYWDwvbGl0ZXJhbD4gYW5kIDxsaXRlcmFsPkBBZnRlclhYWDwvbGl0ZXJhbD4gYW5ub3RhdGlvbnMpIHRoYW4gaW4KKyAgICAgICAgICAgIEpVbml0LiBUaGlzIG1lYW5zIHRoYXQsIGJhc2ljYWxseSwgeW91IGNhbiBzdGFydCBvbmUgaW5zdGFuY2Ugb2YgdGVzdCBjb250YWluZXIgZm9yIGFsbCB0ZXN0cyBwcmVzZW50IGluIGEgdGVzdCBjbGFzcworICAgICAgICAgICAgb3Igc2VwYXJhdGUgdGVzdCBjb250YWluZXIgZm9yIGVhY2ggYW5kIGV2ZXJ5IHRlc3QuIEZvciB0aGlzIHJlYXNvbiBhIHNlcGFyYXRlIHN1YmNsYXNzZXMgb2YgJmplcnNleS50ZXN0LkplcnNleVRlc3ROZzsKKyAgICAgICAgICAgIGhhdmUgYmVlbiBjcmVhdGVkOgorCisgICAgICAgICAgICA8aXRlbWl6ZWRsaXN0PgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgICAgICAgICAmamVyc2V5LnRlc3QuSmVyc2V5VGVzdE5nLkNvbnRhaW5lclBlckNsYXNzVGVzdDsgY3JlYXRlcyBvbmUgY29udGFpbmVyIHRvIHJ1biBhbGwgdGhlIHRlc3RzIGluLiBTZXR1cCBtZXRob2QKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzIGFubm90YXRlZCB3aXRoIDxsaXRlcmFsPkBCZWZvcmVDbGFzczwvbGl0ZXJhbD4sIHRlYXJkb3duIG1ldGhvZCB3aXRoIDxsaXRlcmFsPkBBZnRlckNsYXNzPC9saXRlcmFsPi4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICAgICAgICAgIEZvciBleGFtcGxlIHRha2UgYSBsb29rIGF0IDxsaXRlcmFsPkNvbnRhaW5lclBlckNsYXNzVGVzdDwvbGl0ZXJhbD4gdGVzdC4gSXQgY29udGFpbnMgdHdvIHRlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZHMgKDxsaXRlcmFsPmZpcnN0PC9saXRlcmFsPiBhbmQgPGxpdGVyYWw+c2Vjb25kPC9saXRlcmFsPiksIG9uZSBzaW5nbGV0b24gcmVzb3VyY2UgdGhhdCByZXR1cm5zIGFuCisgICAgICAgICAgICAgICAgICAgICAgICBpbmNyZWFzaW5nIHNlcXVlbmNlIG9mIG51bWJlci4gU2luY2Ugd2Ugc3Bhd24gb25seSBvbmUgaW5zdGFuY2Ugb2YgYSB0ZXN0IGNvbnRhaW5lciBmb3IgdGhlIHdob2xlIGNsYXNzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgZXhwZWN0ZWQgaW4gdGhlIGZpcnN0IHRlc3QgaXMgPGxpdGVyYWw+MTwvbGl0ZXJhbD4gYW5kIGluIHRoZSBzZWNvbmQgaXQncyA8bGl0ZXJhbD4yPC9saXRlcmFsPi4KKworICAgICAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+cHVibGljIGNsYXNzIENvbnRhaW5lclBlckNsYXNzVGVzdCBleHRlbmRzIEplcnNleVRlc3ROZy5Db250YWluZXJQZXJDbGFzc1Rlc3QgeworCisgICAgQFBhdGgoIi8iKQorICAgIEBTaW5nbGV0b24KKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIHByaXZhdGUgaW50IGkgPSAxOworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIGludCBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gaSsrOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QocHJpb3JpdHkgPSAxKQorICAgIHB1YmxpYyB2b2lkIGZpcnN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3QoMSk7CisgICAgfQorCisgICAgQFRlc3QocHJpb3JpdHkgPSAyKQorICAgIHB1YmxpYyB2b2lkIHNlY29uZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0KDIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0KGZpbmFsIEludGVnZXIgZXhwZWN0ZWQpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3BvbnNlLmdldFN0YXR1cygpLCAyMDApOworICAgICAgICBhc3NlcnRFcXVhbHMocmVzcG9uc2UucmVhZEVudGl0eShJbnRlZ2VyLmNsYXNzKSwgZXhwZWN0ZWQpOworICAgIH0KK308L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgPC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgJmplcnNleS50ZXN0LkplcnNleVRlc3ROZy5Db250YWluZXJQZXJNZXRob2RUZXN0OyBjcmVhdGVzIHNlcGFyYXRlIGNvbnRhaW5lciBmb3IgZWFjaCB0ZXN0LiBTZXR1cCBtZXRob2QKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzIGFubm90YXRlZCB3aXRoIDxsaXRlcmFsPkBCZWZvcmVNZXRob2Q8L2xpdGVyYWw+LCB0ZWFyZG93biBtZXRob2Qgd2l0aCA8bGl0ZXJhbD5AQWZ0ZXJNZXRob2Q8L2xpdGVyYWw+LgorICAgICAgICAgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgICAgICAgICAgV2UgY2FuIGNyZWF0ZSBhIHNpbWlsYXIgdGVzdCB0byB0aGUgcHJldmlvdXMgb25lLiBUYWtlIGEgbG9vayBhdCA8bGl0ZXJhbD5Db250YWluZXJQZXJNZXRob2RUZXN0PC9saXRlcmFsPgorICAgICAgICAgICAgICAgICAgICAgICAgdGVzdC4gSXQgbG9va3MgdGhlIHNhbWUgZXhjZXB0IHRoZSBleHBlY3RlZCB2YWx1ZXMgYW5kIGV4dGVuZGluZyBjbGFzczogaXQgY29udGFpbnMgdHdvIHRlc3QKKyAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZHMgKDxsaXRlcmFsPmZpcnN0PC9saXRlcmFsPiBhbmQgPGxpdGVyYWw+c2Vjb25kPC9saXRlcmFsPiksIG9uZSBzaW5nbGV0b24gcmVzb3VyY2UgdGhhdCByZXR1cm5zIGFuCisgICAgICAgICAgICAgICAgICAgICAgICBpbmNyZWFzaW5nIHNlcXVlbmNlIG9mIG51bWJlci4gSW4gdGhpcyBjYXNlIHdlIGNyZWF0ZSBhIHNlcGFyYXRlIHRlc3QgY29udGFpbmVyIGZvciBlYWNoIHRlc3Qgc28KKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIGV4cGVjdGVkIGluIHRoZSBmaXJzdCB0ZXN0IGlzIDxsaXRlcmFsPjE8L2xpdGVyYWw+IGFuZCBpbiB0aGUgc2Vjb25kIGl0J3MgYWxzbyA8bGl0ZXJhbD4xPC9saXRlcmFsPi4KKworICAgICAgICAgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+cHVibGljIGNsYXNzIENvbnRhaW5lclBlck1ldGhvZFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0TmcuQ29udGFpbmVyUGVyTWV0aG9kVGVzdCB7CisKKyAgICBAUGF0aCgiLyIpCisgICAgQFNpbmdsZXRvbgorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgaSA9IDE7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgaW50IGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBpKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGZpcnN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3QoMSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzZWNvbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdCgxKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdChmaW5hbCBJbnRlZ2VyIGV4cGVjdGVkKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydEVxdWFscyhyZXNwb25zZS5nZXRTdGF0dXMoKSwgMjAwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3BvbnNlLnJlYWRFbnRpdHkoSW50ZWdlci5jbGFzcyksIGV4cGVjdGVkKTsKKyAgICB9Cit9PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgSWYgeW91IG5lZWQgbW9yZSBjb21wbGV4IHNldHVwIG9mIHlvdXIgdGVzdCB5b3UgY2FuIGFjaGlldmUgdGhpcyBieSBkaXJlY3RseSBleHRlbmRpbmcgdGhlICZqZXJzZXkudGVzdC5KZXJzZXlUZXN0Tmc7CisgICAgICAgICAgICBjbGFzcyBjcmVhdGUgc2V0dXAvdGVhcmRvd24gbWV0aG9kcyBzdWl0ZWQgdG8geW91ciBuZWVkcyBhbmQgcHJvdmlkZSBhIHN0cmF0ZWd5IGZvciBzdG9yaW5nIGFuZCBoYW5kbGluZyBhIHRlc3QKKyAgICAgICAgICAgIGNvbnRhaW5lciAvIGNsaWVudCBpbnN0YW5jZSAoc2VlIDxsaXRlcmFsPkplcnNleVRlc3ROZy5jb25maWd1cmVTdHJhdGVneShUZXN0TmdTdHJhdGVneSk8L2xpdGVyYWw+IG1ldGhvZCkuCisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbj4KKyAgICAgICAgPHRpdGxlPkFkdmFuY2VkIGZlYXR1cmVzPC90aXRsZT4KKworICAgICAgICA8c2VjdGlvbj4KKyAgICAgICAgICAgIDx0aXRsZT4mbGl0LmplcnNleS50ZXN0LkplcnNleVRlc3Q7IEZlYXR1cmVzPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+JmxpdC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OyBwcm92aWRlCisgICAgICAgICAgICAgICAgPGxpbmsgeGxpbms6aHJlZj0iJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3Rlc3QvSmVyc2V5VGVzdC5odG1sI2VuYWJsZShqYXZhLmxhbmcuU3RyaW5nKSI+ZW5hYmxlKC4uLik8L2xpbms+LAorICAgICAgICAgICAgICAgIDxsaW5rIHhsaW5rOmhyZWY9IiZqZXJzZXkuamF2YWRvYy51cmkucHJlZml4Oy90ZXN0L0plcnNleVRlc3QuaHRtbCNmb3JjZUVuYWJsZShqYXZhLmxhbmcuU3RyaW5nKSI+Zm9yY2VFbmFibGUoLi4uKTwvbGluaz4KKyAgICAgICAgICAgICAgICBhbmQgPGxpbmsgeGxpbms6aHJlZj0iJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3Rlc3QvSmVyc2V5VGVzdC5odG1sI2Rpc2FibGUoamF2YS5sYW5nLlN0cmluZykiPmRpc2FibGUoLi4uKTwvbGluaz4KKyAgICAgICAgICAgICAgICBtZXRob2RzLCB0aGF0IGdpdmUgeW91IGNvbnRyb2wgb3ZlciBjb25maWd1cmluZyB2YWx1ZXMgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5lZCBhbmQgZGVzY3JpYmVkIGluIHRoZQorICAgICAgICAgICAgICAgICZsaXQuamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7IGNsYXNzLiBBIHR5cGljYWwgY29kZSB0aGF0IG92ZXJyaWRlcyB0aGUgZGVmYXVsdCBwcm9wZXJ0eSB2YWx1ZXMgaXMgbGlzdGVkCisgICAgICAgICAgICAgICAgYmVsb3c6CisKKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5wdWJsaWMgY2xhc3MgU2ltcGxlVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworICAgIC8vIC4uLgorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKTsKKworICAgICAgICAvLyAuLi4KKworICAgIH0KK308L3Byb2dyYW1saXN0aW5nPgorCisgICAgICAgICAgICAgICAgVGhlIGNvZGUgaW4gdGhlIGV4YW1wbGUgYWJvdmUgZW5hYmxlcyB0ZXN0IHRyYWZmaWMgbG9nZ2luZyAoaW5ib3VuZCBhbmQgb3V0Ym91bmQgaGVhZGVycykgYXMgd2VsbCBhcworICAgICAgICAgICAgICAgIGR1bXBpbmcgdGhlIEhUVFAgbWVzc2FnZSBlbnRpdHkgYXMgcGFydCBvZiB0aGUgdHJhZmZpYyBsb2dnaW5nLgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L3NlY3Rpb24+CisKKworICAgICAgICA8c2VjdGlvbj4KKyAgICAgICAgICAgIDx0aXRsZT5FeHRlcm5hbCBjb250YWluZXI8L3RpdGxlPgorCisgICAgICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgICAgICBDb21wbGljYXRlZCB0ZXN0IHNjZW5hcmlvcyBtYXkgcmVxdWlyZSBmdWxseSBzdGFydGVkIGNvbnRhaW5lcnMgd2l0aCBjb21wbGV4IHNldHVwIGNvbmZpZ3VyYXRpb24sIHRoYXQgaXMgbm90CisgICAgICAgICAgICAgICAgZWFzaWx5IGRvYWJsZSB3aXRoIGN1cnJlbnQgSmVyc2V5IGNvbnRhaW5lciBzdXBwb3J0LiBUbyBhZGRyZXNzIHRoZXNlIHVzZSBjYXNlcywgSmVyc2V5IFRlc3QgRnJhbWV3b3JrIHByb3ZpZGVycworICAgICAgICAgICAgICAgIGdlbmVyYWwgZmFsbGJhY2sgbWVjaGFuaXNtIC0gYW4gRXh0ZXJuYWwgVGVzdCBDb250YWluZXIgRmFjdG9yeS4gU3VwcG9ydCBvZiB0aGlzIGV4dGVybmFsIGNvbnRhaW5lciAid3JhcHBlciIgaXMKKyAgICAgICAgICAgICAgICBwcm92aWRlZCBhcyB0aGUgZm9sbG93aW5nIG1vZHVsZToKKworICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0ieG1sIj4mbHQ7ZGVwZW5kZW5jeSZndDsKKyAgICAmbHQ7Z3JvdXBJZCZndDtvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnMmbHQ7L2dyb3VwSWQmZ3Q7CisgICAgJmx0O2FydGlmYWN0SWQmZ3Q7amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsJmx0Oy9hcnRpZmFjdElkJmd0OworICAgICZsdDt2ZXJzaW9uJmd0OyZ2ZXJzaW9uOyZsdDsvdmVyc2lvbiZndDsKKyZsdDsvZGVwZW5kZW5jeSZndDs8L3Byb2dyYW1saXN0aW5nPgorCisgICAgICAgICAgICAgICAgQXMgaW5kaWNhdGVkLCB0aGUgImNvbnRhaW5lciIgZXhwb3NlZCBieSB0aGlzIG1vZHVsZSBpcyBqdXN0IGEgd3JhcHBlciBvciBzdHViLCB0aGF0IHJlZGlyZWN0cyBhbGwgcmVxdWVzdCB0bworICAgICAgICAgICAgICAgIGEgY29uZmlndXJlZCBob3N0IGFuZCBwb3J0LiBXcml0aW5nIHRlc3RzIGZvciB0aGlzIGNvbnRhaW5lciBpcyBzYW1lIGFzIGZvciBhbnkgb3RoZXIgYnV0IHlvdSBoYXZlIHRvIHByb3ZpZGUKKyAgICAgICAgICAgICAgICB0aGUgaW5mb3JtYXRpb24gYWJvdXQgaG9zdCBhbmQgcG9ydCBkdXJpbmcgdGhlIHRlc3QgZXhlY3V0aW9uOgorCisgICAgICAgICAgICAgICAgPHNjcmVlbj5tdm4gdGVzdCAtRGplcnNleS50ZXN0Lmhvc3Q9bXlob3N0Lm9yZyAtRGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydD04MDgwPC9zY3JlZW4+CisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKworICAgICAgICA8c2VjdGlvbj4KKyAgICAgICAgICAgIDx0aXRsZT5UZXN0IENsaWVudCBjb25maWd1cmF0aW9uPC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgVGVzdHMgbWlnaHQgcmVxdWlyZSBzb21lIGFkdmFuY2VkIGNsaWVudCBjb25maWd1cmF0aW9uLiBUaGlzIGlzIHBvc3NpYmxlIGJ5IG92ZXJyaWRpbmcKKyAgICAgICAgICAgICAgICA8bGluayB4bGluazpocmVmPSImamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvdGVzdC9KZXJzZXlUZXN0Lmh0bWwjY29uZmlndXJlQ2xpZW50KG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWcpIj5jb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNsaWVudENvbmZpZyk8L2xpbms+CisgICAgICAgICAgICAgICAgbWV0aG9kLiBUeXBpY2FsIHVzZSBjYXNlIGZvciB0aGlzIGlzIHJlZ2lzdGVyaW5nIG1vcmUgcHJvdmlkZXJzLCBzdWNoIGFzICZqYXhycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7cyBvcgorICAgICAgICAgICAgICAgICZqYXhycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7cywgb3IgZW5hYmxpbmcgYWRkaXRpb25hbCBmZWF0dXJlcy4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zZWN0aW9uPgorCisgICAgICAgIDxzZWN0aW9uPgorICAgICAgICAgICAgPHRpdGxlPkFjY2Vzc2luZyB0aGUgbG9nZ2VkIHRlc3QgcmVjb3JkcyBwcm9ncmFtbWF0aWNhbGx5PC90aXRsZT4KKworICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgU29tZXRpbWVzIHlvdSBtaWdodCBuZWVkIHRvIGNoZWNrIGEgbG9nZ2VkIG1lc3NhZ2UgYXMgcGFydCBvZiB5b3VyIHRlc3QgYXNzZXJ0aW9ucy4gRm9yIHRoaXMgcHVycG9zZSBKZXJzZXkgVGVzdAorICAgICAgICAgICAgICAgIEZyYW1ld29yayBwcm92aWRlcyBjb252ZW5pZW50IGFjY2VzcyB0byB0aGUgbG9nZ2VkIHJlY29yZHMgdmlhCisgICAgICAgICAgICAgICAgPGxpbmsgeGxpbms6aHJlZj0iJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3Rlc3QvSmVyc2V5VGVzdC5odG1sI2dldExhc3RMb2dnZWRSZWNvcmQoKSI+SmVyc2V5VGVzdCNnZXRMYXN0TG9nZ2VkUmVjb3JkKCk8L2xpbms+CisgICAgICAgICAgICAgICAgYW5kCisgICAgICAgICAgICAgICAgPGxpbmsgeGxpbms6aHJlZj0iJmplcnNleS5qYXZhZG9jLnVyaS5wcmVmaXg7L3Rlc3QvSmVyc2V5VGVzdC5odG1sI2dldExvZ2dlZFJlY29yZHMoKSI+SmVyc2V5VGVzdCNnZXRMb2dnZWRSZWNvcmRzKCk8L2xpbms+CisgICAgICAgICAgICAgICAgbWV0aG9kcy4gTm90ZSB0aGF0IHRoaXMgZmVhdHVyZSBpcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0LCBzZWUKKyAgICAgICAgICAgICAgICA8bGluayB4bGluazpocmVmPSImamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvdGVzdC9UZXN0UHJvcGVydGllcy5odG1sI1JFQ09SRF9MT0dfTEVWRUwiPlRlc3RQcm9wZXJ0aWVzI1JFQ09SRF9MT0dfTEVWRUw8L2xpbms+CisgICAgICAgICAgICAgICAgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgICAgICAgICAgICA8L3BhcmE+CisgICAgICAgIDwvc2VjdGlvbj4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbiB4bWw6aWQ9InBhcmFsbGVsIj4KKyAgICAgICAgPHRpdGxlPlBhcmFsbGVsIFRlc3Rpbmcgd2l0aCBKZXJzZXkgVGVzdCBGcmFtZXdvcms8L3RpdGxlPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgRm9yIGEgcHVycG9zZSBvZiBydW5uaW5nIG11bHRpcGxlIHRlc3QgY29udGFpbmVycyBpbiBwYXJhbGxlbCB5b3UgbmVlZCB0byBzZXQgdGhlCisgICAgICAgICAgICA8bGluayB4bGluazpocmVmPScmamVyc2V5LmphdmFkb2MudXJpLnByZWZpeDsvdGVzdC9UZXN0UHJvcGVydGllcy5DT05UQUlORVJfUE9SVC5odG1sJz5UZXN0UHJvcGVydGllcy5DT05UQUlORVJfUE9SVDwvbGluaz4KKyAgICAgICAgICAgIHRvIDxsaXRlcmFsPjA8L2xpdGVyYWw+IHZhbHVlLiBUaGlzIHdpbGwgdGVsbCBKZXJzZXkgVGVzdCBGcmFtZXdvcmsgKGFuZCB0aGUgdW5kZXJseWluZyB0ZXN0IGNvbnRhaW5lcikgdG8gdXNlIHRoZQorICAgICAgICAgICAgZmlyc3QgYXZhaWxhYmxlIHBvcnQuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFlvdSBjYW4gc2V0IHRoZSB2YWx1ZSBhcyBhIHN5c3RlbSBwcm9wZXJ0eSAodmlhIGNvbW1hbmQgbGluZSBvcHRpb24pIG9yIGRpcmVjdGx5IGluIHRoZSB0ZXN0ICh0byBub3QgYWZmZWN0IHBvcnRzIG9mCisgICAgICAgICAgICBvdGhlciB0ZXN0cyk6CisKKyAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPkBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIC8vIEZpbmQgZmlyc3QgYXZhaWxhYmxlIHBvcnQuCisgICAgICAgIGZvcmNlU2V0KFRlc3RQcm9wZXJ0aWVzLkNPTlRBSU5FUl9QT1JULCAiMCIpOworCisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MpOworICAgIH08L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaGUgZWFzaWVzdCB3YXkgdG8gc2V0dXAgeW91ciBKVW5pdCBvciBUZXN0TkcgdGVzdHMgdG8gcnVuIGluIHBhcmFsbGVsIGlzIHRvIGNvbmZpZ3VyZSBNYXZlbiBTdXJlZmlyZSBwbHVnaW4uIFlvdSBjYW4KKyAgICAgICAgICAgIGRvIHRoaXMgdmlhIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyA8bGl0ZXJhbD5wYXJhbGxlbDwvbGl0ZXJhbD4gYW5kIDxsaXRlcmFsPnRocmVhZENvdW50PC9saXRlcmFsPiwgaS5lLjoKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0ieG1sIj4uLi4KKyZsdDtjb25maWd1cmF0aW9uJmd0OworICAgICZsdDtwYXJhbGxlbCZndDttZXRob2RzJmx0Oy9wYXJhbGxlbCZndDsKKyAgICAmbHQ7dGhyZWFkQ291bnQmZ3Q7NSZsdDsvdGhyZWFkQ291bnQmZ3Q7CisgICAgLi4uCismbHQ7L2NvbmZpZ3VyYXRpb24mZ3Q7CisuLi48L3Byb2dyYW1saXN0aW5nPgorCisgICAgICAgICAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHRvcGljIGNvbnN1bHQgdGhlIGZvbGxvd2luZyBNYXZlbiBTdXJlZmlyZSBhcnRpY2xlczoKKworICAgICAgICAgICAgPGl0ZW1pemVkbGlzdD4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgICAgIDxwYXJhPjxsaW5rIHhsaW5rOmhyZWY9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3N1cmVmaXJlL21hdmVuLXN1cmVmaXJlLXBsdWdpbi9leGFtcGxlcy9mb3JrLW9wdGlvbnMtYW5kLXBhcmFsbGVsLWV4ZWN1dGlvbi5odG1sIj5Gb3JrIE9wdGlvbnMgYW5kIFBhcmFsbGVsIFRlc3QgRXhlY3V0aW9uPC9saW5rPjwvcGFyYT4KKyAgICAgICAgICAgICAgICA8L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT4KKyAgICAgICAgICAgICAgICAgICAgPHBhcmE+PGxpbmsgeGxpbms6aHJlZj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvc3VyZWZpcmUvbWF2ZW4tc3VyZWZpcmUtcGx1Z2luL2V4YW1wbGVzL3Rlc3RuZy5odG1sI1J1bm5pbmdfdGVzdHNfaW5fcGFyYWxsZWwiPlVzaW5nIFRlc3RORyAtIFJ1bm5pbmcgdGVzdHMgaW4gcGFyYWxsZWw8L2xpbms+PC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPgorICAgICAgICAgICAgICAgICAgICA8cGFyYT48bGluayB4bGluazpocmVmPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9zdXJlZmlyZS9tYXZlbi1zdXJlZmlyZS1wbHVnaW4vZXhhbXBsZXMvanVuaXQuaHRtbCNSdW5uaW5nX3Rlc3RzX2luX3BhcmFsbGVsIj5Vc2luZyBKVW5pdCAtIFJ1bm5pbmcgdGVzdHMgaW4gcGFyYWxsZWw8L2xpbms+PC9wYXJhPgorICAgICAgICAgICAgICAgIDwvbGlzdGl0ZW0+CisgICAgICAgICAgICA8L2l0ZW1pemVkbGlzdD4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKzwvY2hhcHRlcj4KZGlmZiAtLWdpdCBhL2RvY3Mvc3JjL21haW4vZG9jYm9vay91cmlzLWFuZC1saW5rcy54bWwgYi9kb2NzL3NyYy9tYWluL2RvY2Jvb2svdXJpcy1hbmQtbGlua3MueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMTY1NGYKLS0tIC9kZXYvbnVsbAorKysgYi9kb2NzL3NyYy9tYWluL2RvY2Jvb2svdXJpcy1hbmQtbGlua3MueG1sCkBAIC0wLDAgKzEsMTkxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8IURPQ1RZUEUgY2hhcHRlciBbPCFFTlRJVFkgJSBlbnRzIFNZU1RFTSAiamVyc2V5LmVudCIgPiAlZW50czsgXT4KKzxjaGFwdGVyIHhtbG5zPSJodHRwOi8vZG9jYm9vay5vcmcvbnMvZG9jYm9vayIKKyAgICAgICAgIHZlcnNpb249IjUuMCIKKyAgICAgICAgIHhtbDpsYW5nPSJlbiIKKyAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIKKyAgICAgICAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vZG9jYm9vay5vcmcvbnMvZG9jYm9vayBodHRwOi8vZG9jYm9vay5vcmcveG1sLzUuMC94c2QvZG9jYm9vay54c2QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayBodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rLnhzZCIKKyAgICAgICAgIHhtbDppZD0idXJpcy1hbmQtbGlua3MiPgorICAgIDx0aXRsZT5VUklzIGFuZCBMaW5rczwvdGl0bGU+CisKKyAgICA8c2VjdGlvbj4KKyAgICAgICAgPHRpdGxlPkJ1aWxkaW5nIFVSSXM8L3RpdGxlPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgQSB2ZXJ5IGltcG9ydGFudCBhc3BlY3Qgb2YgUkVTVCBpcyBoeXBlcmxpbmtzLCBVUklzLCBpbiByZXByZXNlbnRhdGlvbnMgdGhhdCBjbGllbnRzIGNhbiB1c2UgdG8gdHJhbnNpdGlvbiB0aGUKKyAgICAgICAgICAgIFdlYiBzZXJ2aWNlIHRvIG5ldyBhcHBsaWNhdGlvbiBzdGF0ZXMgKHRoaXMgaXMgb3RoZXJ3aXNlIGtub3duIGFzICJoeXBlcm1lZGlhIGFzIHRoZSBlbmdpbmUgb2YgYXBwbGljYXRpb24gc3RhdGUiKS4KKyAgICAgICAgICAgIEhUTUwgZm9ybXMgcHJlc2VudCBhIGdvb2QgZXhhbXBsZSBvZiB0aGlzIGluIHByYWN0aWNlLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBCdWlsZGluZyBVUklzIGFuZCBidWlsZGluZyB0aGVtIHNhZmVseSBpcyBub3QgZWFzeSB3aXRoICZqZGs2LlVSSTssIHdoaWNoIGlzIHdoeSBKQVgtUlMgaGFzIHRoZQorICAgICAgICAgICAgJmpheHJzLmNvcmUuVXJpQnVpbGRlcjsgY2xhc3MgdGhhdCBtYWtlcyBpdCBzaW1wbGUgYW5kIGVhc3kgdG8gYnVpbGQgVVJJcyBzYWZlbHkuCisgICAgICAgICAgICAmbGl0LmpheHJzLmNvcmUuVXJpQnVpbGRlcjsgY2FuIGJlIHVzZWQgdG8gYnVpbGQgbmV3IFVSSXMgb3IgYnVpbGQgZnJvbSBleGlzdGluZyBVUklzLiBGb3IgcmVzb3VyY2UKKyAgICAgICAgICAgIGNsYXNzZXMgaXQgaXMgbW9yZSB0aGFuIGxpa2VseSB0aGF0IFVSSXMgd2lsbCBiZSBidWlsdCBmcm9tIHRoZSBiYXNlIFVSSSB0aGUgd2ViIHNlcnZpY2UgaXMgZGVwbG95ZWQgYXQKKyAgICAgICAgICAgIG9yIGZyb20gdGhlIHJlcXVlc3QgVVJJLiBUaGUgY2xhc3MgJmpheHJzLmNvcmUuVXJpSW5mbzsgcHJvdmlkZXMgc3VjaCBpbmZvcm1hdGlvbiAoaW4gYWRkaXRpb24gdG8gZnVydGhlcgorICAgICAgICAgICAgaW5mb3JtYXRpb24sIHNlZSBuZXh0IHNlY3Rpb24pLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+VGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIFVSSSBidWlsZGluZyB3aXRoICZsaXQuamF4cnMuY29yZS5VcmlJbmZvOyBhbmQgJmxpdC5qYXhycy5jb3JlLlVyaUJ1aWxkZXI7CisgICAgICAgICAgICBmcm9tIHRoZSBib29rbWFyayBleGFtcGxlOgorCisgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICA8dGl0bGU+VVJJIGJ1aWxkaW5nPC90aXRsZT4KKyAgICAgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj5AUGF0aCgiL3VzZXJzLyIpCitwdWJsaWMgY2xhc3MgVXNlcnNSZXNvdXJjZSB7CisKKyAgICBAQ29udGV4dAorICAgIFVyaUluZm8gdXJpSW5mbzsKKworICAgIC4uLgorCisgICAgQEdFVAorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgcHVibGljIEpTT05BcnJheSBnZXRVc2Vyc0FzSnNvbkFycmF5KCkgeworICAgICAgICBKU09OQXJyYXkgdXJpQXJyYXkgPSBuZXcgSlNPTkFycmF5KCk7CisgICAgICAgIGZvciAoVXNlckVudGl0eSB1c2VyRW50aXR5IDogZ2V0VXNlcnMoKSkgeworICAgICAgICAgICAgVXJpQnVpbGRlciB1YiA9IHVyaUluZm8uZ2V0QWJzb2x1dGVQYXRoQnVpbGRlcigpOworICAgICAgICAgICAgVVJJIHVzZXJVcmkgPSB1Yi4KKyAgICAgICAgICAgICAgICAgICAgcGF0aCh1c2VyRW50aXR5LmdldFVzZXJJZCgpKS4KKyAgICAgICAgICAgICAgICAgICAgYnVpbGQoKTsKKyAgICAgICAgICAgIHVyaUFycmF5LnB1dCh1c2VyVXJpLnRvQVNDSUlTdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHVyaUFycmF5OworICAgIH0KK308L3Byb2dyYW1saXN0aW5nPgorICAgICAgICAgICAgPC9leGFtcGxlPgorCisgICAgICAgICAgICAmbGl0LmpheHJzLmNvcmUuVXJpSW5mbzsgaXMgb2J0YWluZWQgdXNpbmcgdGhlIEBDb250ZXh0IGFubm90YXRpb24sIGFuZCBpbiB0aGlzIHBhcnRpY3VsYXIgZXhhbXBsZSBpbmplY3Rpb24gb250bworICAgICAgICAgICAgdGhlIGZpZWxkIG9mIHRoZSByb290IHJlc291cmNlIGNsYXNzIGlzIHBlcmZvcm1lZCwgcHJldmlvdXMgZXhhbXBsZXMgc2hvd2VkIHRoZSB1c2Ugb2YgQENvbnRleHQgb24gcmVzb3VyY2UgbWV0aG9kCisgICAgICAgICAgICBwYXJhbWV0ZXJzLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAmbGl0LmpheHJzLmNvcmUuVXJpSW5mbzsgY2FuIGJlIHVzZWQgdG8gb2J0YWluIFVSSXMgYW5kIGFzc29jaWF0ZWQgJmxpdC5qYXhycy5jb3JlLlVyaUJ1aWxkZXI7IGluc3RhbmNlcyBmb3IKKyAgICAgICAgICAgIHRoZSBmb2xsb3dpbmcgVVJJczogdGhlIGJhc2UgVVJJIHRoZSBhcHBsaWNhdGlvbiBpcyBkZXBsb3llZCBhdDsgdGhlIHJlcXVlc3QgVVJJOyBhbmQgdGhlIGFic29sdXRlIHBhdGggVVJJLCB3aGljaAorICAgICAgICAgICAgaXMgdGhlIHJlcXVlc3QgVVJJIG1pbnVzIGFueSBxdWVyeSBjb21wb25lbnRzLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaGUgPGxpdGVyYWw+Z2V0VXNlcnNBc0pzb25BcnJheTwvbGl0ZXJhbD4gbWV0aG9kIGNvbnN0cnVjdHMgYSA8bGl0ZXJhbD5KU09OQXJycmF5PC9saXRlcmFsPiwgd2hlcmUgZWFjaCBlbGVtZW50CisgICAgICAgICAgICBpcyBhIFVSSSBpZGVudGlmeWluZyBhIHNwZWNpZmljIHVzZXIgcmVzb3VyY2UuIFRoZSBVUkkgaXMgYnVpbHQgZnJvbSB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGUgcmVxdWVzdCBVUkkgYnkKKyAgICAgICAgICAgIGNhbGxpbmcKKyAgICAgICAgICAgIDxsaW5rIHhsaW5rOmhyZWY9IiZqYXhycy5qYXZhZG9jLnVyaTsvY29yZS9VcmlJbmZvLmh0bWwjZ2V0QWJzb2x1dGVQYXRoQnVpbGRlcigpIj5VcmlJbmZvLmdldEFic29sdXRlUGF0aEJ1aWxkZXIoKTwvbGluaz4uCisgICAgICAgICAgICBBIG5ldyBwYXRoIHNlZ21lbnQgaXMgYWRkZWQsIHdoaWNoIGlzIHRoZSB1c2VyIElELCBhbmQgdGhlbiB0aGUgVVJJIGlzIGJ1aWx0LiBOb3RpY2UgdGhhdCBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvCisgICAgICAgICAgICB3b3JyeSBhYm91dCB0aGUgaW5jbHVzaW9uIG9mIDxsaXRlcmFsPicvJzwvbGl0ZXJhbD4gY2hhcmFjdGVycyBvciB0aGF0IHRoZSB1c2VyIElEIG1heSBjb250YWluIGNoYXJhY3RlcnMgdGhhdCBuZWVkCisgICAgICAgICAgICB0byBiZSBwZXJjZW50IGVuY29kZWQuICZsaXQuamF4cnMuY29yZS5VcmlCdWlsZGVyOyB0YWtlcyBjYXJlIG9mIHN1Y2ggZGV0YWlscy4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPiZsaXQuamF4cnMuY29yZS5VcmlCdWlsZGVyOyBjYW4gYmUgdXNlZCB0byBidWlsZC9yZXBsYWNlIHF1ZXJ5IG9yIG1hdHJpeCBwYXJhbWV0ZXJzLiBVUkkgdGVtcGxhdGVzIGNhbiBhbHNvIGJlCisgICAgICAgICAgICBkZWNsYXJlZCwgZm9yIGV4YW1wbGUgdGhlIGZvbGxvd2luZyB3aWxsIGJ1aWxkIHRoZSBVUkkgPGxpdGVyYWw+Imh0dHA6Ly9sb2NhbGhvc3Qvc2VnbWVudD9uYW1lPXZhbHVlIjwvbGl0ZXJhbD46CisKKyAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgIDx0aXRsZT5CdWlsZGluZyBVUklzIHVzaW5nIHF1ZXJ5IHBhcmFtZXRlcnM8L3RpdGxlPgorICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPlVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdC8iKQorICAgIC5wYXRoKCJ7YX0iKQorICAgIC5xdWVyeVBhcmFtKCJuYW1lIiwgInt2YWx1ZX0iKQorICAgIC5idWlsZCgic2VnbWVudCIsICJ2YWx1ZSIpOzwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbj4KKyAgICAgICAgPHRpdGxlPlJlc29sdmUgYW5kIFJlbGF0aXZpemU8L3RpdGxlPgorCisgICAgICAgIDxwYXJhPkpBWC1SUyAyLjAgaW50cm9kdWNlZCBhZGRpdGlvbmFsIFVSSSByZXNvbHV0aW9uIGFuZCByZWxhdGl2aXphdGlvbiBtZXRob2RzIGluIHRoZSAmbGl0LmpheHJzLmNvcmUuVXJpQnVpbGRlcjs6CisKKyAgICAgICAgICAgIDxpdGVtaXplZGxpc3Q+CisgICAgICAgICAgICAgICAgPGxpc3RpdGVtPjxwYXJhPjxsaW5rIHhsaW5rOmhyZWY9IiZqYXhycy5qYXZhZG9jLnVyaTsvY29yZS9VcmlJbmZvLmh0bWwjcmVzb2x2ZShqYXZhLm5ldC5VUkkpIj5VcmlJbmZvLnJlc29sdmUoamF2YS5uZXQuVVJJKTwvbGluaz48L3BhcmE+PC9saXN0aXRlbT4KKyAgICAgICAgICAgICAgICA8bGlzdGl0ZW0+PHBhcmE+PGxpbmsgeGxpbms6aHJlZj0iJmpheHJzLmphdmFkb2MudXJpOy9jb3JlL1VyaUluZm8uaHRtbCNyZWxhdGl2aXplKGphdmEubmV0LlVSSSkiPlVyaUluZm8ucmVsYXRpdml6ZShqYXZhLm5ldC5VUkkpPC9saW5rPjwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgICAgIDxsaXN0aXRlbT48cGFyYT48bGluayB4bGluazpocmVmPSImamF4cnMuamF2YWRvYy51cmk7L2NvcmUvVXJpQnVpbGRlci5odG1sI3Jlc29sdmVUZW1wbGF0ZShqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0KSI+VXJpQnVpbGRlci5yZXNvbHZlVGVtcGxhdGUoLi4uKTwvbGluaz4gKHZhcmlvdXMgYXJndW1lbnRzKTwvcGFyYT48L2xpc3RpdGVtPgorICAgICAgICAgICAgPC9pdGVtaXplZGxpc3Q+CisKKyAgICAgICAgICAgIFJlc29sdmUgYW5kIHJlbGF0aXZpemUgbWV0aG9kcyBpbiAmamF4cnMuY29yZS5VcmlJbmZvOyBhcmUgZXNzZW50aWFsbHkgY291bnRlcnBhcnRzIHRvIHRoZSBtZXRob2RzIGxpc3RlZCBhYm92ZSAtCisgICAgICAgICAgICA8bGluayB4bGluazpocmVmPSImamF4cnMuamF2YWRvYy51cmk7L2NvcmUvVXJpSW5mby5odG1sI3Jlc29sdmUoamF2YS5uZXQuVVJJKSI+VXJpSW5mby5yZXNvbHZlKGphdmEubmV0LlVSSSk8L2xpbms+CisgICAgICAgICAgICByZXNvbHZlcyBnaXZlbiByZWxhdGl2ZSBVUkkgdG8gYW4gYWJzb2x1dGUgVVJJIHVzaW5nIGFwcGxpY2F0aW9uIGNvbnRleHQgVVJJIGFzIHRoZSBiYXNlIFVSSTsKKyAgICAgICAgICAgIDxsaW5rIHhsaW5rOmhyZWY9IiZqYXhycy5qYXZhZG9jLnVyaTsvY29yZS9VcmlJbmZvLmh0bWwjcmVsYXRpdml6ZShqYXZhLm5ldC5VUkkpIj5VcmlJbmZvLnJlbGF0aXZpemUoamF2YS5uZXQuVVJJKTwvbGluaz4KKyAgICAgICAgICAgIHRoZW4gdHJhbnNmb3JtcyBhbiBhYnNvbHV0ZSBVUkkgdG8gYSByZWxhdGl2ZSBvbmUsIHVzaW5nIGFnYWluIHRoZSBhcHBsaWNhdGlvbnMgY29udGV4dCBVUkkgYXMgdGhlIGJhc2UgVVJJLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAmbGl0LmpheHJzLmNvcmUuVXJpQnVpbGRlcjsgYWxzbyBpbnRyb2R1Y2VzIGEgc2V0IG9mIG1ldGhvZHMgdGhhdCBwcm92aWRlIHdheXMgb2YgcmVzb2x2aW5nIFVSSSB0ZW1wbGF0ZXMgYnkgcmVwbGFjaW5nCisgICAgICAgICAgICBpbmRpdmlkdWFsIHRlbXBsYXRlcyB3aXRoIGEgcHJvdmlkZWQgdmFsdWUocykuIEEgc2hvcnQgZXhhbXBsZToKKworICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+ZmluYWwgVVJJIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL3tob3N0fS97cGF0aH0/cT17cGFyYW19IikKKyAgICAucmVzb2x2ZVRlbXBsYXRlKCJob3N0IiwgImxvY2FsaG9zdCIpCisgICAgLnJlc29sdmVUZW1wbGF0ZSgicGF0aCIsICJteUFwcCIpCisgICAgLnJlc29sdmVUZW1wbGF0ZSgicGFyYW0iLCAidmFsdWUiKS5idWlsZCgpOworCit1cmkudG9TdHJpbmcoKTsgLy8gcmV0dXJucyAiaHR0cDovL2xvY2FsaG9zdC9teUFwcD9xPXZhbHVlIjwvcHJvZ3JhbWxpc3Rpbmc+CisKKyAgICAgICAgICAgIFNlZSB0aGUgJmpheHJzLmNvcmUuVXJpQnVpbGRlcjsgamF2YWRvYyBmb3IgbW9yZSBkZXRhaWxzLgorICAgICAgICA8L3BhcmE+CisgICAgPC9zZWN0aW9uPgorCisgICAgPHNlY3Rpb24+CisgICAgICAgIDx0aXRsZT5MaW5rPC90aXRsZT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEpBWC1SUyAyLjAgaW50cm9kdWNlcyAmamF4cnMuY29yZS5MaW5rOyBjbGFzcywgd2hpY2ggc2VydmVzIGFzIGEgcmVwcmVzZW50YXRpb24gb2YgV2ViIExpbmsgZGVmaW5lZCBpbgorICAgICAgICAgICAgPGxpbmsgeGxpbms6aHJlZj0iaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNTk4OCI+UkZDIDU5ODg8L2xpbms+LgorICAgICAgICAgICAgVGhlIEpBWC1SUyAmbGl0LmpheHJzLmNvcmUuTGluazsgY2xhc3MgYWRkcyBBUEkgc3VwcG9ydCBmb3IgcHJvdmlkaW5nIGFkZGl0aW9uYWwgbWV0YWRhdGEgaW4gSFRUUCBtZXNzYWdlcywKKyAgICAgICAgICAgIGZvciBleGFtcGxlLCBpZiB5b3UgYXJlIGNvbnN1bWluZyBhIFJFU1QgaW50ZXJmYWNlIG9mIGEgcHVibGljIGxpYnJhcnksIHlvdSBtaWdodCBoYXZlIGEgcmVzb3VyY2UgcmV0dXJuaW5nCisgICAgICAgICAgICBkZXNjcmlwdGlvbiBvZiBhIHNpbmdsZSBib29rLiBUaGVuIHlvdSBjYW4gaW5jbHVkZSBsaW5rcyB0byByZWxhdGVkIHJlc291cmNlcywgc3VjaCBhcyBhIGJvb2sgY2F0ZWdvcnksCisgICAgICAgICAgICBhdXRob3IsIGV0Yy4gdG8gbWFrZSB0aGUgcHJvZHVjZWQgcmVzcG9uc2UgY29uY2lzZSBidXQgY29tcGxldGUgYXQgdGhlIHNhbWUgdGltZS4gQ2xpZW50cyBhcmUgdGhlbiBhYmxlIHRvCisgICAgICAgICAgICBxdWVyeSBhbGwgdGhlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdGhleSBhcmUgaW50ZXJlc3RlZCBpbiBhbmQgYXJlIG5vdCBmb3JjZWQgdG8gY29uc3VtZSBkZXRhaWxzIHRoZXkgYXJlCisgICAgICAgICAgICBub3QgaW50ZXJlc3RlZCBpbi4gQXQgdGhlIHNhbWUgdGltZSwgdGhpcyBhcHByb2FjaCByZWxpZXZlcyB0aGUgc2VydmVyIHJlc291cmNlcyBhcyBvbmx5IHRoZSBpbmZvcm1hdGlvbiB0aGF0CisgICAgICAgICAgICBpcyB0cnVseSByZXF1ZXN0ZWQgaXMgYmVpbmcgc2VydmVkIHRvIHRoZSBjbGllbnRzLgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBBICZsaXQuamF4cnMuY29yZS5MaW5rOyBjYW4gYmUgc2VyaWFsaXplZCB0byBhbiBIVFRQIG1lc3NhZ2UgKHR5aWNhbGx5IGEgcmVzcG9uc2UpIGFzIGFkZGl0aW9uYWwgSFRUUCBoZWFkZXIKKyAgICAgICAgICAgICh0aGVyZSBtaWdodCBiZSBtdWx0aXBsZSAmbGl0LmpheHJzLmNvcmUuTGluazsgaGVhZGVycyBwcm92aWRlZCwgdGh1cyBtdWx0aXBsZSBsaW5rcyBjYW4gYmUgc2VydmVkIGluIGEgc2luZ2xlCisgICAgICAgICAgICBtZXNzYWdlKS4gU3VjaCBIVFRQIGhlYWRlciBtYXkgbG9vayBsaWtlOgorICAgICAgICAgICAgPHNjcmVlbiBsYW5ndWFnZT0idGV4dCIgbGluZW51bWJlcmluZz0idW5udW1iZXJlZCI+TGluazogJmx0O2h0dHA6Ly9leGFtcGxlLmNvbS9UaGVCb29rL2NoYXB0ZXIyJmd0OzsgcmVsPSJwcmV2IjsgdGl0bGU9InByZXZpb3VzIGNoYXB0ZXIiPC9zY3JlZW4+CisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFByb2R1Y2luZyBhbmQgY29uc3VtaW5nIExpbmtzIHdpdGggSkFYLVJTIEFQSSBpcyBkZW1vbnN0cmF0ZWQgaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlOgorCisgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9ImphdmEiIGxpbmVudW1iZXJpbmc9InVubnVtYmVyZWQiPi8vIHNlcnZlciBzaWRlIC0gYWRkaW5nIGxpbmtzIHRvIGEgcmVzcG9uc2U6CitSZXNwb25zZSByID0gUmVzcG9uc2Uub2soKS4KKyAgICBsaW5rKCJodHRwOi8vb3JhY2xlLmNvbSIsICJwYXJlbnQiKS4KKyAgICBsaW5rKG5ldyBVUkkoImh0dHA6Ly9qZXJzZXkuamF2YS5uZXQiKSwgImZyYW1ld29yayIpLgorICAgIGJ1aWxkKCk7CisKKy4uLgorCisvLyBjbGllbnQtc2lkZSBwcm9jZXNzaW5nOgorZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLmdldCgpOworCitVUkkgdSA9IHJlc3BvbnNlLmdldExpbmsoInBhcmVudCIpLmdldFVyaSgpOworVVJJIHUgPSByZXNwb25zZS5nZXRMaW5rKCJmcmFtZXdvcmsiKS5nZXRVcmkoKTs8L3Byb2dyYW1saXN0aW5nPgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgSW5zdGFuY2VzIG9mICZsaXQuamF4cnMuY29yZS5MaW5rOyBjYW4gYmUgYWxzbyBjcmVhdGVkIGRpcmVjdGx5IGJ5IGludm9raW5nIG9uZSBvZiB0aGUgZmFjdG9yeSBtZXRob2RzIG9uIHRoZQorICAgICAgICAgICAgJmpheHJzLmNvcmUuTGluazsgQVBJIHRoYXQgcmV0dXJucyBhICZqYXhycy5jb3JlLkxpbmsuQnVpbGRlcjsgdGhhdCBjYW4gYmUgdXNlZCB0byBjb25maWd1cmUgYW5kIHByb2R1Y2UgbmV3CisgICAgICAgICAgICBsaW5rcy4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKzwvY2hhcHRlcj4KZGlmZiAtLWdpdCBhL2RvY3Mvc3JjL21haW4vZG9jYm9vay91c2VyLWd1aWRlLnhtbCBiL2RvY3Mvc3JjL21haW4vZG9jYm9vay91c2VyLWd1aWRlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjU4MjI0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9zcmMvbWFpbi9kb2Nib29rL3VzZXItZ3VpZGUueG1sCkBAIC0wLDAgKzEsMTIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8IURPQ1RZUEUgYm9vayBbPCFFTlRJVFkgJSBlbnRzIFNZU1RFTSAiamVyc2V5LmVudCIgPiAlZW50cztdPgorPGJvb2sgeG1sbnM9Imh0dHA6Ly9kb2Nib29rLm9yZy9ucy9kb2Nib29rIgorICAgICAgdmVyc2lvbj0iNS4wIgorICAgICAgeG1sOmxhbmc9ImVuIgorICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIgorICAgICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCisgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9kb2Nib29rLm9yZy9ucy9kb2Nib29rIGh0dHA6Ly9kb2Nib29rLm9yZy94bWwvNS4wL3hzZC9kb2Nib29rLnhzZAorICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIGh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsueHNkIj4KKyAgICA8aW5mbz4KKyAgICAgICAgPHRpdGxlPkplcnNleSAmdmVyc2lvbjsgVXNlciBHdWlkZTwvdGl0bGU+CisgICAgPC9pbmZvPgorICAgIDxwcmVmYWNlIHhtbDppZD0icHJlZmFjZSI+CisgICAgICAgIDx0aXRsZT5QcmVmYWNlPC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaGlzIGlzIHVzZXIgZ3VpZGUgZm9yIEplcnNleSAmdmVyc2lvbjsuIFdlIGFyZSB0cnlpbmcgdG8ga2VlcCBpdCB1cCB0byBkYXRlIGFzIHdlIGFkZCBuZXcgZmVhdHVyZXMuCisgICAgICAgICAgICBXaGVuIHJlYWRpbmcgdGhlIHVzZXIgZ3VpZGUsIHBsZWFzZSBjb25zdWx0IGFsc28gb3VyCisgICAgICAgICAgICA8bGluayB4bGluazpocmVmPSImamVyc2V5LmphdmFkb2Mucm9vdC51cmk7L2luZGV4Lmh0bWwiPkplcnNleSBBUEkgZG9jdW1lbnRhdGlvbjwvbGluaz4gYXMgYW4gYWRkaXRpb25hbCBzb3VyY2UKKyAgICAgICAgICAgIG9mIGluZm9ybWF0aW9uIGFib3V0IEplcnNleSBmZWF0dXJlcyBhbmQgQVBJLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgSWYgeW91IHdvdWxkIGxpa2UgdG8gY29udHJpYnV0ZSB0byB0aGUgZ3VpZGUgb3IgaGF2ZSBxdWVzdGlvbnMgb24gdGhpbmdzIG5vdCBjb3ZlcmVkIGluIG91ciBkb2NzLCBwbGVhc2UKKyAgICAgICAgICAgIGNvbnRhY3QgdXMgYXQ8bGluayB4bGluazpocmVmPSJtYWlsdG86dXNlcnNAamVyc2V5LmphdmEubmV0Ij51c2Vyc0BqZXJzZXkuamF2YS5uZXQ8L2xpbms+LiBTaW1pbGFybHksCisgICAgICAgICAgICBpbiBjYXNlIHlvdSBzcG90IGFueSBlcnJvcnMgaW4gdGhlIEplcnNleSBkb2N1bWVudGF0aW9uLCBwbGVhc2UgcmVwb3J0IHRoZW0gYnkgZmlsaW5nIGEgbmV3IGlzc3VlIGluIG91cgorICAgICAgICAgICAgPGxpbmsgeGxpbms6aHJlZj0iaHR0cDovL2phdmEubmV0L2ppcmEvYnJvd3NlL0pFUlNFWSI+SmVyc2V5IEpJUkEgSXNzdWUgVHJhY2tlcjwvbGluaz4KKyAgICAgICAgICAgIHVuZGVyCisgICAgICAgICAgICA8bGl0ZXJhbD5kb2NzPC9saXRlcmFsPgorICAgICAgICAgICAgY29tcG9uZW50LiBQbGVhc2UgbWFrZSBzdXJlIHRvIHNwZWNpZnkgdGhlIHZlcnNpb24gb2YgdGhlIEplcnNleSBVc2VyIEd1aWRlIHdoZXJlIHRoZSBlcnJvciBoYXMgYmVlbiBzcG90dGVkCisgICAgICAgICAgICBieSBzZWxlY3RpbmcgdGhlIHByb3BlciB2YWx1ZSBmb3IgdGhlCisgICAgICAgICAgICA8bGl0ZXJhbD5BZmZlY3RlZCBWZXJzaW9uPC9saXRlcmFsPgorICAgICAgICAgICAgZmllbGQuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHNpbXBsZXNlY3Q+CisgICAgICAgICAgICA8dGl0bGU+VGV4dCBmb3JtYXR0aW5nIGNvbnZlbnRpb25zPC90aXRsZT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIEZpcnN0IG1lbnRpb24gb2YgYW55IEplcnNleSBhbmQgSkFYLVJTIEFQSSBjb21wb25lbnQgaW4gYSBzZWN0aW9uIGxpbmtzIHRvIHRoZSBBUEkgZG9jdW1lbnRhdGlvbiBvZiB0aGUKKyAgICAgICAgICAgICAgICByZWZlcmVuY2VkIGNvbXBvbmVudC4gQW55IHN1Yi1zZXF1ZW50IG1lbnRpb25zIG9mIHRoZSBjb21wb25lbnQgaW4gdGhlIHNhbWUgY2hhcHRlciBhcmUgcmVuZGVyZWQgdXNpbmcgYQorICAgICAgICAgICAgICAgIDxsaXRlcmFsPm1vbm9zcGFjZWQ8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgZm9udC4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIDxlbXBoYXNpcz5FbXBoYXNpc2VkIGZvbnQ8L2VtcGhhc2lzPgorICAgICAgICAgICAgICAgIGlzIHVzZWQgdG8gYSBjYWxsIGF0dGVudGlvbiB0byBhIG5ld2x5IGludHJvZHVjZSBjb25jZXB0LCB3aGVuIGl0IGZpcnN0CisgICAgICAgICAgICAgICAgb2NjdXJzIGluIHRoZSB0ZXh0LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICAgICAgPHBhcmE+CisgICAgICAgICAgICAgICAgSW4gc29tZSBvZiB0aGUgY29kZSBsaXN0aW5ncywgY2VydGFpbiBsaW5lcyBhcmUgdG9vIGxvbmcgdG8gYmUgZGlzcGxheWVkIG9uIG9uZSBsaW5lIGZvciB0aGUgYXZhaWxhYmxlCisgICAgICAgICAgICAgICAgcGFnZSB3aWR0aC4gSW4gc3VjaCBjYXNlLCB0aGUgbGluZXMgdGhhdCBleGNlZWQgdGhlIGF2YWlsYWJsZSBwYWdlIHdpZHRoIGFyZSBicm9rZW4gdXAgaW50byBtdWx0aXBsZSBsaW5lcworICAgICAgICAgICAgICAgIHVzaW5nIGEKKyAgICAgICAgICAgICAgICA8bGl0ZXJhbD4nXCc8L2xpdGVyYWw+CisgICAgICAgICAgICAgICAgYXQgdGhlIGVuZCBvZiBlYWNoIGxpbmUgdG8gaW5kaWNhdGUgdGhhdCBhIGJyZWFrIGhhcyBiZWVuIGludHJvZHVjZWQgdG8KKyAgICAgICAgICAgICAgICBmaXQgdGhlIGxpbmUgaW4gdGhlIHBhZ2UuIEZvciBleGFtcGxlOgorCisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxpbmVudW1iZXJpbmc9InVubnVtYmVyZWQiPgorVGhpcyBpcyBhbiBvdmVybHkgbG9uZyBsaW5lIHRoYXQgXAorbWlnaHQgbm90IGZpdCB0aGUgYXZhaWxhYmxlIHBhZ2UgXAord2lkdGggYW5kIGhhZCB0byBiZSBicm9rZW4gaW50byBcCittdWx0aXBsZSBsaW5lcy4KKworVGhpcyBsaW5lIGZpdHMgdGhlIHBhZ2Ugd2lkdGguCisgICAgICAgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKworICAgICAgICAgICAgICAgIFNob3VsZCByZWFkIGFzOgorCisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxpbmVudW1iZXJpbmc9InVubnVtYmVyZWQiPgorVGhpcyBpcyBhbiBvdmVybHkgbG9uZyBsaW5lIHRoYXQgbWlnaHQgbm90IGZpdCB0aGUgYXZhaWxhYmxlIHBhZ2Ugd2lkdGggYW5kIGhhZCB0byBiZSBicm9rZW4gaW50byBtdWx0aXBsZSBsaW5lcy4KKworVGhpcyBsaW5lIGZpdHMgdGhlIHBhZ2Ugd2lkdGguCisgICAgICAgICAgICAgICAgPC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPC9zaW1wbGVzZWN0PgorICAgIDwvcHJlZmFjZT4KKworICAgIDx4aTppbmNsdWRlIGhyZWY9ImdldHRpbmctc3RhcnRlZC54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0iZGVwZW5kZW5jaWVzLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJqYXhycy1yZXNvdXJjZXMueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9ImRlcGxveW1lbnQueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9ImNsaWVudC54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0icngtY2xpZW50LnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJyZXByZXNlbnRhdGlvbnMueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9Im1idy54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ibWVkaWEueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9ImZpbHRlcnMueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9ImFzeW5jLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJ1cmlzLWFuZC1saW5rcy54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0iZGVjbGFyYXRpdmUtbGlua2luZy54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0icmVzb3VyY2UtYnVpbGRlci54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ic3NlLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJzZWN1cml0eS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0id2FkbC54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0iYmVhbi12YWxpZGF0aW9uLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJlbnRpdHktZmlsdGVyaW5nLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJtdmMueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9ImxvZ2dpbmcueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9Im1vbml0b3JpbmcueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9ImN1c3RvbS1kaS54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0iY2RpLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJzcHJpbmcueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9InRlc3QtZnJhbWV3b3JrLnhtbCIgLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJob3ctdG8tYnVpbGQueG1sIiAvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9Im1pZ3JhdGlvbi54bWwiIC8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0iYXBwZW5kaXgtcHJvcGVydGllcy54bWwiIC8+CisKKzwvYm9vaz4KZGlmZiAtLWdpdCBhL2RvY3Mvc3JjL21haW4vZG9jYm9vay93YWRsLnhtbCBiL2RvY3Mvc3JjL21haW4vZG9jYm9vay93YWRsLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTg3NTc0Ci0tLSAvZGV2L251bGwKKysrIGIvZG9jcy9zcmMvbWFpbi9kb2Nib29rL3dhZGwueG1sCkBAIC0wLDAgKzEsNTc2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8IURPQ1RZUEUgY2hhcHRlciBbPCFFTlRJVFkgJSBlbnRzIFNZU1RFTSAiamVyc2V5LmVudCIgPiAlZW50czsgXT4KKzxjaGFwdGVyIHhtbG5zPSJodHRwOi8vZG9jYm9vay5vcmcvbnMvZG9jYm9vayIKKyAgICAgICAgIHZlcnNpb249IjUuMCIKKyAgICAgICAgIHhtbDpsYW5nPSJlbiIKKyAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIKKyAgICAgICAgIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vZG9jYm9vay5vcmcvbnMvZG9jYm9vayBodHRwOi8vZG9jYm9vay5vcmcveG1sLzUuMC94c2QvZG9jYm9vay54c2QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayBodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rLnhzZCIKKyAgICAgICAgIHhtbDppZD0id2FkbCI+CisKKyAgICA8dGl0bGU+V0FETCBTdXBwb3J0PC90aXRsZT4KKyAgICA8c2VjdGlvbj4KKyAgICAgICAgPHRpdGxlPldBREwgaW50cm9kdWN0aW9uPC90aXRsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBKZXJzZXkgY29udGFpbnMgc3VwcG9ydCBmb3IKKyAgICAgICAgICAgIDxsaW5rIHhsaW5rOmhyZWY9J2h0dHA6Ly93YWRsLmphdmEubmV0Lyc+V2ViIEFwcGxpY2F0aW9uIERlc2NyaXB0aW9uIExhbmd1YWdlIChXQURMKTwvbGluaz4uIFdBREwgaXMKKyAgICAgICAgICAgIGEgWE1MIGRlc2NyaXB0aW9uIG9mIGEgZGVwbG95ZWQgUkVTVGZ1bCB3ZWIgYXBwbGljYXRpb24uIEl0IGNvbnRhaW5zIG1vZGVsIG9mIHRoZSBkZXBsb3llZCByZXNvdXJjZXMsIHRoZWlyCisgICAgICAgICAgICBzdHJ1Y3R1cmUsIHN1cHBvcnRlZCBtZWRpYSB0eXBlcywgSFRUUCBtZXRob2RzIGFuZCBzbyBvbi4gSW4gYSBzZW5zZSwgV0FETCBpcyBhIHNpbWlsYXIgdG8gdGhlIFdTREwKKyAgICAgICAgICAgIChXZWIgU2VydmljZSBEZXNjcmlwdGlvbiBMYW5ndWFnZSkgd2hpY2ggZGVzY3JpYmVzIFNPQVAgd2ViIHNlcnZpY2VzLiBXQURMIGlzIGhvd2V2ZXIgc3BlY2lmaWNhbGx5IGRlc2lnbmVkCisgICAgICAgICAgICB0byBkZXNjcmliZSBSRVNUZnVsIFdlYiByZXNvdXJjZXMuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPGltcG9ydGFudD4KKyAgICAgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgICAgIFNpbmNlIEplcnNleSAyLjUuMSB0aGUgV0FETCBnZW5lcmF0ZWQgYnkgZGVmYXVsdCBpcyBXQURMIGluIHNob3J0ZXIgZm9ybSB3aXRob3V0CisgICAgICAgICAgICAgICAgYWRkaXRpb25hbCBleHRlbnNpb24gcmVzb3VyY2VzIChPUFRJT05TIG1ldGhvZHMsIFdBREwgcmVzb3VyY2UpLgorICAgICAgICAgICAgICAgIEluIG9yZGVyIHRvIGdldCBmdWxsIFdBREwgdXNlIHRoZSBxdWVyeSBwYXJhbWV0ZXIgPGxpdGVyYWw+ZGV0YWlsPXRydWU8L2xpdGVyYWw+LgorICAgICAgICAgICAgPC9wYXJhPgorICAgICAgICA8L2ltcG9ydGFudD4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBMZXQncyBzdGFydCB3aXRoIHRoZSBzaW1wbGUgV0FETCBleGFtcGxlLiBJbiB0aGUgZXhhbXBsZSB0aGVyZSBpcyBhIHNpbXBsZSA8bGl0ZXJhbD5Db3VudHJ5UmVzb3VyY2U8L2xpdGVyYWw+CisgICAgICAgICAgICBkZXBsb3llZCBhbmQgd2UgcmVxdWVzdCBhIHdhZGwgb2YgdGhpcyByZXNvdXJjZS4gVGhlIGNvbnRleHQgcm9vdCBwYXRoIG9mIHRoZSBhcHBsaWNhdGlvbiBpcworICAgICAgICAgICAgPGxpdGVyYWw+aHR0cDovL2xvY2FsaG9zdDo5OTk4PC9saXRlcmFsPi4KKyAgICAgICAgICAgIDxleGFtcGxlPgorICAgICAgICAgICAgICAgIDx0aXRsZT5BIHNpbXBsZSBXQURMIGV4YW1wbGUgLSBKQVgtUlMgcmVzb3VyY2UgZGVmaW5pdGlvbjwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJqYXZhIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+QFBhdGgoImNvdW50cnkve2lkfSIpCitwdWJsaWMgc3RhdGljIGNsYXNzIENvdW50cnlSZXNvdXJjZSB7CisKKyAgICBwcml2YXRlIENvdW50cnlTZXJ2aWNlIGNvdW50cnlTZXJ2aWNlOworCisgICAgcHVibGljIENvdW50cnlSZXNvdXJjZSgpIHsKKyAgICAgICAgLy8gaW5pdCBjb3VudHJ5U2VydmljZQorICAgIH0KKworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTCkKKyAgICBwdWJsaWMgQ291bnRyeSBnZXRDb3VudHJ5KEBQYXRoUGFyYW0oImNvdW50cnlJZCIpIGludCBjb3VudHJ5SWQpIHsKKyAgICAgICAgcmV0dXJuIGNvdW50cnlTZXJ2aWNlLmdldENvdW50cnkoY291bnRyeUlkKTsKKyAgICB9Cit9PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKworCisKKyAgICAgICAgICAgIFRoZSBXQURMIG9mIGEgSmVyc2V5IGFwcGxpY2F0aW9uIHRoYXQgY29udGFpbnMgdGhlIHJlc291cmNlIGFib3ZlIGNhbiBiZSByZXF1ZXN0ZWQgYnkgYQorICAgICAgICAgICAgSFRUUCAmbGl0Lmh0dHAuR0VUOyByZXF1ZXN0IHRvIDxsaXRlcmFsPmh0dHA6Ly9sb2NhbGhvc3Q6OTk5OC9hcHBsaWNhdGlvbi53YWRsPC9saXRlcmFsPi4KKyAgICAgICAgICAgIFRoZSBKZXJzZXkgd2lsbCByZXR1cm4gYSByZXNwb25zZSB3aXRoIGEgV0FETCBjb250ZW50IHNpbWlsYXIgdG8gdGhlIG9uZSBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6CisgICAgICAgICAgICA8cHJvZ3JhbWxpc3RpbmcgbGFuZ3VhZ2U9InhtbCIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPjwhW0NEQVRBWzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KKzxhcHBsaWNhdGlvbiB4bWxucz0iaHR0cDovL3dhZGwuZGV2LmphdmEubmV0LzIwMDkvMDIiPgorICAgIDxkb2MgeG1sbnM6amVyc2V5PSJodHRwOi8vamVyc2V5LmphdmEubmV0LyIgamVyc2V5OmdlbmVyYXRlZEJ5PSJKZXJzZXk6IDIuNS1TTkFQU0hPVCAyMDEzLTEyLTIwIDE3OjE0OjIxIi8+CisgICAgPGdyYW1tYXJzLz4KKyAgICA8cmVzb3VyY2VzIGJhc2U9Imh0dHA6Ly9sb2NhbGhvc3Q6OTk5OC8iPgorICAgICAgICA8cmVzb3VyY2UgcGF0aD0iY291bnRyeS97aWR9Ij4KKyAgICAgICAgICAgIDxwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiIHR5cGU9InhzOmludCIgc3R5bGU9InRlbXBsYXRlIiBuYW1lPSJjb3VudHJ5SWQiLz4KKyAgICAgICAgICAgIDxtZXRob2QgbmFtZT0iR0VUIiBpZD0iZ2V0Q291bnRyeSI+CisgICAgICAgICAgICAgICAgPHJlc3BvbnNlPgorICAgICAgICAgICAgICAgICAgICA8cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLz4KKyAgICAgICAgICAgICAgICA8L3Jlc3BvbnNlPgorICAgICAgICAgICAgPC9tZXRob2Q+CisgICAgICAgIDwvcmVzb3VyY2U+CisgICAgPC9yZXNvdXJjZXM+Cis8L2FwcGxpY2F0aW9uPl1dPjwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBUaGUgcmV0dXJuZWQgV0FETCBpcyBhIFhNTCB0aGF0IGNvbnRhaW5zIGVsZW1lbnQgPGxpdGVyYWw+cmVzb3VyY2U8L2xpdGVyYWw+CisgICAgICAgICAgICB3aXRoIHBhdGggPGxpdGVyYWw+Y291bnRyeS97aWR9PC9saXRlcmFsPi4gVGhpcyByZXNvdXJjZSBoYXMgb25lIGlubmVyIDxsaXRlcmFsPm1ldGhvZDwvbGl0ZXJhbD4gZWxlbWVudAorICAgICAgICAgICAgd2l0aCBodHRwIG1ldGhvZCBhcyBhdHRyaWJ1dGUsIG5hbWUgb2YgamF2YSBtZXRob2QgYW5kIGl0cyBwcm9kdWNlZCByZXByZXNlbnRhdGlvbi4gVGhpcyBkZXNjcmlwdGlvbgorICAgICAgICAgICAgY29ycmVzcG9uZHMgdG8gZGVmaW5lZCBqYXZhIHJlc291cmNlLiBOb3cgbGV0J3MgbG9vayBhdCBtb3JlIGNvbXBsZXggZXhhbXBsZS4KKyAgICAgICAgPC9wYXJhPgorCisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgVGhlIHByZXZpb3VzIFdBREwgZG9lcyBub3QgYWN0dWFsbHkgY29udGFpbiBhbGwgcmVzb3VyY2VzIGV4cG9zZWQgaW4gb3VyIEFQSS4gVGhlcmUgYXJlIG90aGVyCisgICAgICAgICAgICByZXNvdXJjZXMgdGhhdCBhcmUgYXZhaWxhYmxlIGFuZCBhcmUgaGlkZGVuIGluIHRoZSBwcmV2aW91cyBXQURMLiBUaGUgcHJldmlvdXMgV0FETCBzaG93cyBvbmx5IHJlc291cmNlcworICAgICAgICAgICAgdGhhdCBhcmUgcHJvdmlkZWQgYnkgdGhlIHVzZXIuIEluIHRoZSBmb2xsb3dpbmcgZXhhbXBsZSwgdGhlIFdBREwKKyAgICAgICAgICAgIGlzIGdlbmVyYXRlZCB1c2luZyBxdWVyeSBwYXJhbWV0ZXIgPGxpdGVyYWw+ZGV0YWlsPC9saXRlcmFsPjoKKyAgICAgICAgICAgIDxsaXRlcmFsPmh0dHA6Ly9sb2NhbGhvc3Q6OTk5OC9hcHBsaWNhdGlvbi53YWRsP2RldGFpbDwvbGl0ZXJhbD4uIE5vdGUgdGhhdCB1c2FnZSBvZgorICAgICAgICAgICAgPGxpdGVyYWw+aHR0cDovL2xvY2FsaG9zdDo5OTk4L2FwcGxpY2F0aW9uLndhZGw/ZGV0YWlsPXRydWU8L2xpdGVyYWw+IGlzIGFsc28gdmFsaWQuCisgICAgICAgICAgICBUaGlzIHdpbGwgcHJvZHVjZSB0aGUgV0FETCB3aXRoIGFsbCByZXNvdXJjZSBhdmFpbGFibGUgaW4gdGhlIGFwcGxpY2F0aW9uOgorICAgICAgICA8L3BhcmE+CisKKyAgICAgICAgPGV4YW1wbGU+CisgICAgICAgICAgICA8dGl0bGU+QSBzaW1wbGUgV0FETCBleGFtcGxlIC0gV0FETCBjb250ZW50PC90aXRsZT4KKyAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0ieG1sIiBsaW5lbnVtYmVyaW5nPSJudW1iZXJlZCI+PCFbQ0RBVEFbPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PgorPGFwcGxpY2F0aW9uIHhtbG5zPSJodHRwOi8vd2FkbC5kZXYuamF2YS5uZXQvMjAwOS8wMiI+CisgICAgPGRvYyB4bWxuczpqZXJzZXk9Imh0dHA6Ly9qZXJzZXkuamF2YS5uZXQvIiBqZXJzZXk6Z2VuZXJhdGVkQnk9IkplcnNleTogMi41LVNOQVBTSE9UIDIwMTMtMTItMjAgMTc6MTQ6MjEiLz4KKyAgICA8ZG9jIHhtbG5zOmplcnNleT0iaHR0cDovL2plcnNleS5qYXZhLm5ldC8iIGplcnNleTpoaW50PSJUbyBnZXQgc2ltcGxpZmllZCBXQURMIHdpdGggdXNlcidzIHJlc291cmNlcyBvbmx5IHVzZSB0aGUgcXVlcnkgcGFyYW1ldGVyICdzaW1wbGU9dHJ1ZScuIExpbms6IGh0dHA6Ly9sb2NhbGhvc3Q6OTk5OC9hcHBsaWNhdGlvbi53YWRsP2RldGFpbD10cnVlJmFtcDtzaW1wbGU9dHJ1ZSIvPgorICAgIDxncmFtbWFycy8+CisgICAgPHJlc291cmNlcyBiYXNlPSJodHRwOi8vbG9jYWxob3N0Ojk5OTgvIj4KKyAgICAgICAgPHJlc291cmNlIHBhdGg9ImNvdW50cnkve2lkfSI+CisgICAgICAgICAgICA8cGFyYW0geG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIiB0eXBlPSJ4czppbnQiIHN0eWxlPSJ0ZW1wbGF0ZSIgbmFtZT0iY291bnRyeUlkIi8+CisgICAgICAgICAgICA8bWV0aG9kIG5hbWU9IkdFVCIgaWQ9ImdldENvdW50cnkiPgorICAgICAgICAgICAgICAgIDxyZXNwb25zZT4KKyAgICAgICAgICAgICAgICAgICAgPHJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+CisgICAgICAgICAgICAgICAgPC9yZXNwb25zZT4KKyAgICAgICAgICAgIDwvbWV0aG9kPgorICAgICAgICAgICAgPG1ldGhvZCBuYW1lPSJPUFRJT05TIiBpZD0iYXBwbHkiPgorICAgICAgICAgICAgICAgIDxyZXF1ZXN0PgorICAgICAgICAgICAgICAgICAgICA8cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSIqLyoiLz4KKyAgICAgICAgICAgICAgICA8L3JlcXVlc3Q+CisgICAgICAgICAgICAgICAgPHJlc3BvbnNlPgorICAgICAgICAgICAgICAgICAgICA8cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi92bmQuc3VuLndhZGwreG1sIi8+CisgICAgICAgICAgICAgICAgPC9yZXNwb25zZT4KKyAgICAgICAgICAgICAgICA8amVyc2V5OmV4dGVuZGVkIHhtbG5zOmplcnNleT0iaHR0cDovL2plcnNleS5qYXZhLm5ldC8iPnRydWU8L2plcnNleTpleHRlbmRlZD4KKyAgICAgICAgICAgIDwvbWV0aG9kPgorICAgICAgICAgICAgPG1ldGhvZCBuYW1lPSJPUFRJT05TIiBpZD0iYXBwbHkiPgorICAgICAgICAgICAgICAgIDxyZXF1ZXN0PgorICAgICAgICAgICAgICAgICAgICA8cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSIqLyoiLz4KKyAgICAgICAgICAgICAgICA8L3JlcXVlc3Q+CisgICAgICAgICAgICAgICAgPHJlc3BvbnNlPgorICAgICAgICAgICAgICAgICAgICA8cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgICAgICAgICAgICAgPC9yZXNwb25zZT4KKyAgICAgICAgICAgICAgICA8amVyc2V5OmV4dGVuZGVkIHhtbG5zOmplcnNleT0iaHR0cDovL2plcnNleS5qYXZhLm5ldC8iPnRydWU8L2plcnNleTpleHRlbmRlZD4KKyAgICAgICAgICAgIDwvbWV0aG9kPgorICAgICAgICAgICAgPG1ldGhvZCBuYW1lPSJPUFRJT05TIiBpZD0iYXBwbHkiPgorICAgICAgICAgICAgICAgIDxyZXF1ZXN0PgorICAgICAgICAgICAgICAgICAgICA8cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSIqLyoiLz4KKyAgICAgICAgICAgICAgICA8L3JlcXVlc3Q+CisgICAgICAgICAgICAgICAgPHJlc3BvbnNlPgorICAgICAgICAgICAgICAgICAgICA8cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSIqLyoiLz4KKyAgICAgICAgICAgICAgICA8L3Jlc3BvbnNlPgorICAgICAgICAgICAgICAgIDxqZXJzZXk6ZXh0ZW5kZWQgeG1sbnM6amVyc2V5PSJodHRwOi8vamVyc2V5LmphdmEubmV0LyI+dHJ1ZTwvamVyc2V5OmV4dGVuZGVkPgorICAgICAgICAgICAgPC9tZXRob2Q+CisgICAgICAgIDwvcmVzb3VyY2U+CisgICAgICAgIDxyZXNvdXJjZSBwYXRoPSJhcHBsaWNhdGlvbi53YWRsIj4KKyAgICAgICAgICAgIDxtZXRob2QgbmFtZT0iR0VUIiBpZD0iZ2V0V2FkbCI+CisgICAgICAgICAgICAgICAgPHJlc3BvbnNlPgorICAgICAgICAgICAgICAgICAgICA8cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi92bmQuc3VuLndhZGwreG1sIi8+CisgICAgICAgICAgICAgICAgICAgIDxyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvPgorICAgICAgICAgICAgICAgIDwvcmVzcG9uc2U+CisgICAgICAgICAgICAgICAgPGplcnNleTpleHRlbmRlZCB4bWxuczpqZXJzZXk9Imh0dHA6Ly9qZXJzZXkuamF2YS5uZXQvIj50cnVlPC9qZXJzZXk6ZXh0ZW5kZWQ+CisgICAgICAgICAgICA8L21ldGhvZD4KKyAgICAgICAgICAgIDxtZXRob2QgbmFtZT0iT1BUSU9OUyIgaWQ9ImFwcGx5Ij4KKyAgICAgICAgICAgICAgICA8cmVxdWVzdD4KKyAgICAgICAgICAgICAgICAgICAgPHJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0iKi8qIi8+CisgICAgICAgICAgICAgICAgPC9yZXF1ZXN0PgorICAgICAgICAgICAgICAgIDxyZXNwb25zZT4KKyAgICAgICAgICAgICAgICAgICAgPHJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0idGV4dC9wbGFpbiIvPgorICAgICAgICAgICAgICAgIDwvcmVzcG9uc2U+CisgICAgICAgICAgICAgICAgPGplcnNleTpleHRlbmRlZCB4bWxuczpqZXJzZXk9Imh0dHA6Ly9qZXJzZXkuamF2YS5uZXQvIj50cnVlPC9qZXJzZXk6ZXh0ZW5kZWQ+CisgICAgICAgICAgICA8L21ldGhvZD4KKyAgICAgICAgICAgIDxtZXRob2QgbmFtZT0iT1BUSU9OUyIgaWQ9ImFwcGx5Ij4KKyAgICAgICAgICAgICAgICA8cmVxdWVzdD4KKyAgICAgICAgICAgICAgICAgICAgPHJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0iKi8qIi8+CisgICAgICAgICAgICAgICAgPC9yZXF1ZXN0PgorICAgICAgICAgICAgICAgIDxyZXNwb25zZT4KKyAgICAgICAgICAgICAgICAgICAgPHJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0iKi8qIi8+CisgICAgICAgICAgICAgICAgPC9yZXNwb25zZT4KKyAgICAgICAgICAgICAgICA8amVyc2V5OmV4dGVuZGVkIHhtbG5zOmplcnNleT0iaHR0cDovL2plcnNleS5qYXZhLm5ldC8iPnRydWU8L2plcnNleTpleHRlbmRlZD4KKyAgICAgICAgICAgIDwvbWV0aG9kPgorICAgICAgICAgICAgPHJlc291cmNlIHBhdGg9IntwYXRofSI+CisgICAgICAgICAgICAgICAgPHBhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIgdHlwZT0ieHM6c3RyaW5nIiBzdHlsZT0idGVtcGxhdGUiIG5hbWU9InBhdGgiLz4KKyAgICAgICAgICAgICAgICA8bWV0aG9kIG5hbWU9IkdFVCIgaWQ9ImdlRXh0ZXJuYWxHcmFtbWFyIj4KKyAgICAgICAgICAgICAgICAgICAgPHJlc3BvbnNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0iYXBwbGljYXRpb24veG1sIi8+CisgICAgICAgICAgICAgICAgICAgIDwvcmVzcG9uc2U+CisgICAgICAgICAgICAgICAgICAgIDxqZXJzZXk6ZXh0ZW5kZWQgeG1sbnM6amVyc2V5PSJodHRwOi8vamVyc2V5LmphdmEubmV0LyI+dHJ1ZTwvamVyc2V5OmV4dGVuZGVkPgorICAgICAgICAgICAgICAgIDwvbWV0aG9kPgorICAgICAgICAgICAgICAgIDxtZXRob2QgbmFtZT0iT1BUSU9OUyIgaWQ9ImFwcGx5Ij4KKyAgICAgICAgICAgICAgICAgICAgPHJlcXVlc3Q+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSIqLyoiLz4KKyAgICAgICAgICAgICAgICAgICAgPC9yZXF1ZXN0PgorICAgICAgICAgICAgICAgICAgICA8cmVzcG9uc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8+CisgICAgICAgICAgICAgICAgICAgIDwvcmVzcG9uc2U+CisgICAgICAgICAgICAgICAgICAgIDxqZXJzZXk6ZXh0ZW5kZWQgeG1sbnM6amVyc2V5PSJodHRwOi8vamVyc2V5LmphdmEubmV0LyI+dHJ1ZTwvamVyc2V5OmV4dGVuZGVkPgorICAgICAgICAgICAgICAgIDwvbWV0aG9kPgorICAgICAgICAgICAgICAgIDxtZXRob2QgbmFtZT0iT1BUSU9OUyIgaWQ9ImFwcGx5Ij4KKyAgICAgICAgICAgICAgICAgICAgPHJlcXVlc3Q+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSIqLyoiLz4KKyAgICAgICAgICAgICAgICAgICAgPC9yZXF1ZXN0PgorICAgICAgICAgICAgICAgICAgICA8cmVzcG9uc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSIqLyoiLz4KKyAgICAgICAgICAgICAgICAgICAgPC9yZXNwb25zZT4KKyAgICAgICAgICAgICAgICAgICAgPGplcnNleTpleHRlbmRlZCB4bWxuczpqZXJzZXk9Imh0dHA6Ly9qZXJzZXkuamF2YS5uZXQvIj50cnVlPC9qZXJzZXk6ZXh0ZW5kZWQ+CisgICAgICAgICAgICAgICAgPC9tZXRob2Q+CisgICAgICAgICAgICAgICAgPGplcnNleTpleHRlbmRlZCB4bWxuczpqZXJzZXk9Imh0dHA6Ly9qZXJzZXkuamF2YS5uZXQvIj50cnVlPC9qZXJzZXk6ZXh0ZW5kZWQ+CisgICAgICAgICAgICA8L3Jlc291cmNlPgorICAgICAgICAgICAgPGplcnNleTpleHRlbmRlZCB4bWxuczpqZXJzZXk9Imh0dHA6Ly9qZXJzZXkuamF2YS5uZXQvIj50cnVlPC9qZXJzZXk6ZXh0ZW5kZWQ+CisgICAgICAgIDwvcmVzb3VyY2U+CisgICAgPC9yZXNvdXJjZXM+Cis8L2FwcGxpY2F0aW9uPgorXV0+PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBJbiB0aGUgZXhhbXBsZSBhYm92ZSB0aGUgcmV0dXJuZWQgYXBwbGljYXRpb24gV0FETCBpcyBzaG93biBpbiBmdWxsLiBXQURMIHNjaGVtYSBpcyBkZWZpbmVkIGJ5IHRoZQorICAgICAgICAgICAgV0FETCBzcGVjaWZpY2F0aW9uLCBzbyBsZXQncyBsb29rIGF0IGl0IGluIG1vcmUgZGV0YWlscy4gVGhlIHJvb3QgV0FETCBkb2N1bWVudCBlbGVtZW50IGlzCisgICAgICAgICAgICB0aGUgPGxpdGVyYWw+YXBwbGljYXRpb248L2xpdGVyYWw+LiBJdCBjb250YWlucyBnbG9iYWwKKyAgICAgICAgICAgIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkZXBsb3llZCBKQVgtUlMgYXBwbGljYXRpb24uIFVuZGVyIHRoaXMgZWxlbWVudCB0aGVyZSBpcyBhIG5lc3RlZCBlbGVtZW50CisgICAgICAgICAgICA8bGl0ZXJhbD5yZXNvdXJjZXM8L2xpdGVyYWw+IHdoaWNoIGNvbnRhaW5zIHplcm8gb3IgbW9yZSA8bGl0ZXJhbD5yZXNvdXJjZTwvbGl0ZXJhbD4gZWxlbWVudHMuIEVhY2gKKyAgICAgICAgICAgIDxsaXRlcmFsPnJlc291cmNlPC9saXRlcmFsPiBlbGVtZW50IGRlc2NyaWJlcyBhIHNpbmdsZSBkZXBsb3llZCByZXNvdXJjZS4gSW4gb3VyIGV4YW1wbGUsIHRoZXJlIGFyZSBvbmx5IHR3byByb290CisgICAgICAgICAgICByZXNvdXJjZXMgLSA8bGl0ZXJhbD4iY291bnRyeS97aWR9IjwvbGl0ZXJhbD4gYW5kIDxsaXRlcmFsPiJhcHBsaWNhdGlvbi53YWRsIjwvbGl0ZXJhbD4uIFRoZQorICAgICAgICAgICAgPGxpdGVyYWw+ImFwcGxpY2F0aW9uLndhZGwiPC9saXRlcmFsPiByZXNvdXJjZSBpcyB0aGUgcmVzb3VyY2UgdGhhdCB3YXMganVzdCByZXF1ZXN0ZWQgaW4gb3JkZXIgdG8gcmVjZWl2ZSB0aGUKKyAgICAgICAgICAgIGFwcGxpY2F0aW9uIFdBREwgZG9jdW1lbnQuIEV2ZW4gdGhvdWdoIFdBREwgc3VwcG9ydCBpcyBhbiBhZGRpdGlvbmFsIGZlYXR1cmUgaW4gSmVyc2V5IGl0IGlzIHN0aWxsCisgICAgICAgICAgICBhIHJlc291cmNlIGRlcGxveWVkIGluIHRoZSByZXNvdXJjZSBtb2RlbCBhbmQgdGhlcmVmb3JlIGl0IGlzIGl0c2VsZiBwcmVzZW50IGluIHRoZSByZXR1cm5lZCBXQURMIGRvY3VtZW50LgorICAgICAgICAgICAgVGhlIGZpcnN0IHJlc291cmNlIGVsZW1lbnQgd2l0aCB0aGUgPGxpdGVyYWw+cGF0aD0iY291bnRyeS97aWR9IjwvbGl0ZXJhbD4gaXMgdGhlIGVsZW1lbnQgdGhhdCBkZXNjcmliZXMgb3VyCisgICAgICAgICAgICBjdXN0b20gZGVwbG95ZWQgcmVzb3VyY2UuCisgICAgICAgICAgICBUaGlzIHJlc291cmNlIGNvbnRhaW5zIGEgJmxpdC5odHRwLkdFVDsgbWV0aG9kIGFuZCB0aHJlZSAmbGl0Lmh0dHAuT1BUSU9OUzsgbWV0aG9kcy4KKyAgICAgICAgICAgIFRoZSAmbGl0Lmh0dHAuR0VUOyBtZXRob2QgaXMgb3VyIGdldENvdW50cnkoKSBtZXRob2QgZGVmaW5lZCBpbiB0aGUgc2FtcGxlLiBUaGVyZSBpcyBhIG1ldGhvZCBuYW1lCisgICAgICAgICAgICBpbiB0aGUgPGxpdGVyYWw+aWQ8L2xpdGVyYWw+IGF0dHJpYnV0ZSBhbmQgJmpheHJzLlByb2R1Y2VzOyBpcyBkZXNjcmliZWQgaW4gdGhlCisgICAgICAgICAgICA8bGl0ZXJhbD5yZXNwb25zZS9yZXByZXNlbnRhdGlvbjwvbGl0ZXJhbD4gV0FETCBlbGVtZW50LiAmbGl0Lmh0dHAuT1BUSU9OUzsgbWV0aG9kcyBhcmUgdGhlIG1ldGhvZHMgdGhhdAorICAgICAgICAgICAgYXJlIGF1dG9tYXRpY2FsbHkgYWRkZWQgYnkgSmVyc2V5IHRvIGVhY2ggcmVzb3VyY2UuIFRoZXJlIGlzIGFuICZsaXQuaHR0cC5PUFRJT05TOyBtZXRob2QKKyAgICAgICAgICAgIHJldHVybmluZyA8bGl0ZXJhbD4idGV4dC9wbGFpbiI8L2xpdGVyYWw+IG1lZGlhIHR5cGUsIHRoYXQgd2lsbCByZXR1cm4gYSByZXNwb25zZSB3aXRoIGEgc3RyaW5nIGVudGl0eSBjb250YWluaW5nCisgICAgICAgICAgICB0aGUgbGlzdCBvZiBtZXRob2RzIGRlcGxveWVkIG9uIHRoaXMgcmVzb3VyY2UgKHRoaXMgbWVhbnMgdGhhdCBpbnN0ZWFkIG9mIFdBREwgeW91IGNhbiB1c2UgdGhpcyAmbGl0Lmh0dHAuT1BUSU9OUzsKKyAgICAgICAgICAgIG1ldGhvZCB0byBnZXQgc2ltaWxhciBpbmZvcm1hdGlvbiBpbiBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24pLgorICAgICAgICAgICAgQW5vdGhlciAmbGl0Lmh0dHAuT1BUSU9OUzsgbWV0aG9kIHJldHVybmluZyA8bGl0ZXJhbD4qLyo8L2xpdGVyYWw+IHdpbGwgcmV0dXJuIGEgcmVzcG9uc2Ugd2l0aCBubyBlbnRpdHkKKyAgICAgICAgICAgIGFuZCA8bGl0ZXJhbD5BbGxvdzwvbGl0ZXJhbD4gaGVhZGVyIHRoYXQgd2lsbCBjb250YWluIGxpc3Qgb2YgbWV0aG9kcyBhcyBhIFN0cmluZy4KKyAgICAgICAgICAgIFRoZSBsYXN0ICZsaXQuaHR0cC5PUFRJT05TOyBtZXRob2QgcHJvZHVjaW5nIDxsaXRlcmFsPiJhcHBsaWNhdGlvbi92bmQuc3VuLndhZGwreG1sIjwvbGl0ZXJhbD4gcmV0dXJucyBhCisgICAgICAgICAgICBXQURMIGRlc2NyaXB0aW9uIG9mIHRoZSByZXNvdXJjZSA8bGl0ZXJhbD4iY291bnRyeS97aWR9IjwvbGl0ZXJhbD4uIEFzIHlvdSBjYW4gc2VlLCBhbGwgJmxpdC5odHRwLk9QVElPTlM7IG1ldGhvZHMKKyAgICAgICAgICAgIHJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVzb3VyY2UgdG8gd2hpY2ggdGhlIEhUVFAgJmxpdC5odHRwLk9QVElPTlM7IHJlcXVlc3QgaXMgbWFkZS4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFNlY29uZCByZXNvdXJjZSB3aXRoIGEgcGF0aCAiYXBwbGljYXRpb24ud2FkbCIgaGFzLCBhZ2Fpbiwgc2ltaWxhciAmbGl0Lmh0dHAuT1BUSU9OUzsgbWV0aG9kcworICAgICAgICAgICAgYW5kIG9uZSAmbGl0Lmh0dHAuR0VUOyBtZXRob2Qgd2hpY2ggcmV0dXJuIHRoaXMgV0FETC4gVGhlcmUgaXMgYWxzbworICAgICAgICAgICAgYSBzdWItcmVzb3VyY2Ugd2l0aCBhIHBhdGggZGVmaW5lZCBieSBwYXRoIHBhcmFtIDxsaXRlcmFsPntwYXRofTwvbGl0ZXJhbD4uIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIHJlcXVlc3QKKyAgICAgICAgICAgIGEgcmVzb3VyY2Ugb24gdGhlIFVSSSA8bGl0ZXJhbD5odHRwOi8vbG9jYWxob3N0Ojk5OTgvYXBwbGljYXRpb24ud2FkbC9zb21ldGhpbmc8L2xpdGVyYWw+LgorICAgICAgICAgICAgVGhpcyBpcyB1c2VkIG9ubHkgdG8gcmV0dXJuIGFuIGV4dGVybmFsIGdyYW1tYXIgaWYgdGhlcmUgaXMgYW55IGF0dGFjaGVkLiBTdWNoIGEgZXh0ZXJuYWwgZ3JhbW1hciBjYW4gYmUKKyAgICAgICAgICAgIGZvciBleGFtcGxlIGFuIDxsaXRlcmFsPlhTRDwvbGl0ZXJhbD4gc2NoZW1hIG9mIHRoZSByZXNwb25zZSBlbnRpdHkgd2hpY2ggaWYgdGhlIHJlc3BvbnNlIGVudGl0eSBpcyBhIEpBWEIgYmVhbi4KKyAgICAgICAgICAgIEFuIGV4dGVybmFsIGdyYW1tYXIgc3VwcG9ydCB2aWEgSmVyc2V5IDxlbXBoYXNpcz5leHRlbmRlZCBXQURMIHN1cHBvcnQ8L2VtcGhhc2lzPiBpcyBkZXNjcmliZWQgaW4gc2VjdGlvbnMgYmVsb3cuCisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBBbGwgcmVzb3VyY2UgdGhhdCB3ZXJlIGFkZGVkIGluIHRoaXMgc2Vjb25kIGV4YW1wbGUgaW50byB0aGUgV0FETCBjb250YWlucworICAgICAgICAgICAgZWxlbWVudCA8bGl0ZXJhbD5leHRlbmRlZDwvbGl0ZXJhbD4uIFRoaXMgbWVhbnMgdGhhdCB0aGlzIHJlc291cmNlIGlzIG5vdCBhIHBhcnQgb2YgYSBjb3JlIFJFU1RmdWwgQVBJIGFuZAorICAgICAgICAgICAgaXMgcmF0aGVyIGEgaGVscGVyIHJlc291cmNlLiBJZiB5b3UgbmVlZCB0byBtYXJrIGFueSB5b3VyIG93biByZXNvdXJjZSBhcmUgZXh0ZW5kZWQsIGFubm90YXRlCisgICAgICAgICAgICBpcyB3aXRoICZqZXJzZXkuc2VydmVyLkV4dGVuZGVkUmVzb3VyY2U7LiBOb3RlIHRoYXQgdGhlcmUgbWlnaHQgYmUgbWV0aG9kcyB2aXNpYmxlIGluIHRoZSBkZWZhdWx0IHNpbXBsZQorICAgICAgICAgICAgV0FETCBldmVuIHRoZSB1c2VyIGhhcyBub3QgYWRkZWQgdGhlbS4gVGhpcyBpcyBmb3IgZXhhbXBsZSB0aGUgY2FzZSBvZiBNVkMgYWRkZWQgbWV0aG9kcyB3aGljaCB3ZXJlIGFkZGVkCisgICAgICAgICAgICBieSAmamVyc2V5LnNlcnZlci5Nb2RlbFByb2Nlc3NvcjsgYnV0IGFyZSBzdGlsbCBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IHRoZSBjbGllbnQgdG8gYWNoaWV2ZSB0aGVpcgorICAgICAgICAgICAgcHJpbWFyeSB1c2UgY2FzZSBvZiBnZXR0aW5nIGZvcm1hdHRlZCBkYXRhLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgTGV0J3Mgbm93IHNlbmQgYW4gSFRUUCAmbGl0Lmh0dHAuT1BUSU9OUzsgcmVxdWVzdCB0byA8bGl0ZXJhbD4iY291bnRyeS97aWR9IjwvbGl0ZXJhbD4gcmVzb3VyY2UgdXNpbmcgdGhlIHRoZQorICAgICAgICAgICAgPGxpdGVyYWw+Y3VybDwvbGl0ZXJhbD4gY29tbWFuZDoKKyAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsaW5lbnVtYmVyaW5nPSJ1bm51bWJlcmVkIj5jdXJsIC1YIE9QVElPTlMgLUggIkFsbG93OiBhcHBsaWNhdGlvbi92bmQuc3VuLndhZGwreG1sIiBcCisgICAgLXYgaHR0cDovL2xvY2FsaG9zdDo5OTk4L2NvdW50cnkvMTU8L3Byb2dyYW1saXN0aW5nPgorCisgICAgICAgICAgICBXZSBzaG91bGQgc2VlIGEgV0FETCByZXR1cm5lZCBzaW1pbGFyIHRvIHRoaXMgb25lOgorCisgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICA8dGl0bGU+T1BUSU9OUyBtZXRob2QgcmV0dXJuaW5nIFdBREw8L3RpdGxlPgorCisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJ4bWwiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8mZ3Q7CismbHQ7YXBwbGljYXRpb24geG1sbnM9Imh0dHA6Ly93YWRsLmRldi5qYXZhLm5ldC8yMDA5LzAyIiZndDsKKyAgICAmbHQ7ZG9jIHhtbG5zOmplcnNleT0iaHR0cDovL2plcnNleS5qYXZhLm5ldC8iCisgICAgICAgIGplcnNleTpnZW5lcmF0ZWRCeT0iSmVyc2V5OiAyLjAtU05BUFNIT1QgJHtidWlsZE51bWJlcn0iLyZndDsKKyAgICAmbHQ7Z3JhbW1hcnMvJmd0OworICAgICZsdDtyZXNvdXJjZXMgYmFzZT0iaHR0cDovL2xvY2FsaG9zdDo5OTk4LyImZ3Q7CisgICAgICAgICZsdDtyZXNvdXJjZSBwYXRoPSJjb3VudHJ5LzE1IiZndDsKKyAgICAgICAgICAgICZsdDttZXRob2QgbmFtZT0iR0VUIiBpZD0iZ2V0Q291bnRyeSImZ3Q7CisgICAgICAgICAgICAgICAgJmx0O3Jlc3BvbnNlJmd0OworICAgICAgICAgICAgICAgICAgICAmbHQ7cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLyZndDsKKyAgICAgICAgICAgICAgICAmbHQ7L3Jlc3BvbnNlJmd0OworICAgICAgICAgICAgJmx0Oy9tZXRob2QmZ3Q7CisgICAgICAgICAgICAmbHQ7bWV0aG9kIG5hbWU9Ik9QVElPTlMiIGlkPSJhcHBseSImZ3Q7CisgICAgICAgICAgICAgICAgJmx0O3JlcXVlc3QmZ3Q7CisgICAgICAgICAgICAgICAgICAgICZsdDtyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9IiovKiIvJmd0OworICAgICAgICAgICAgICAgICZsdDsvcmVxdWVzdCZndDsKKyAgICAgICAgICAgICAgICAmbHQ7cmVzcG9uc2UmZ3Q7CisgICAgICAgICAgICAgICAgICAgICZsdDtyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3ZuZC5zdW4ud2FkbCt4bWwiLyZndDsKKyAgICAgICAgICAgICAgICAmbHQ7L3Jlc3BvbnNlJmd0OworICAgICAgICAgICAgJmx0Oy9tZXRob2QmZ3Q7CisgICAgICAgICAgICAmbHQ7bWV0aG9kIG5hbWU9Ik9QVElPTlMiIGlkPSJhcHBseSImZ3Q7CisgICAgICAgICAgICAgICAgJmx0O3JlcXVlc3QmZ3Q7CisgICAgICAgICAgICAgICAgICAgICZsdDtyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9IiovKiIvJmd0OworICAgICAgICAgICAgICAgICZsdDsvcmVxdWVzdCZndDsKKyAgICAgICAgICAgICAgICAmbHQ7cmVzcG9uc2UmZ3Q7CisgICAgICAgICAgICAgICAgICAgICZsdDtyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLyZndDsKKyAgICAgICAgICAgICAgICAmbHQ7L3Jlc3BvbnNlJmd0OworICAgICAgICAgICAgJmx0Oy9tZXRob2QmZ3Q7CisgICAgICAgICAgICAmbHQ7bWV0aG9kIG5hbWU9Ik9QVElPTlMiIGlkPSJhcHBseSImZ3Q7CisgICAgICAgICAgICAgICAgJmx0O3JlcXVlc3QmZ3Q7CisgICAgICAgICAgICAgICAgICAgICZsdDtyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9IiovKiIvJmd0OworICAgICAgICAgICAgICAgICZsdDsvcmVxdWVzdCZndDsKKyAgICAgICAgICAgICAgICAmbHQ7cmVzcG9uc2UmZ3Q7CisgICAgICAgICAgICAgICAgICAgICZsdDtyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9IiovKiIvJmd0OworICAgICAgICAgICAgICAgICZsdDsvcmVzcG9uc2UmZ3Q7CisgICAgICAgICAgICAmbHQ7L21ldGhvZCZndDsKKyAgICAgICAgJmx0Oy9yZXNvdXJjZSZndDsKKyAgICAmbHQ7L3Jlc291cmNlcyZndDsKKyZsdDsvYXBwbGljYXRpb24mZ3Q7PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKyAgICAgICAgICAgIFRoZSByZXR1cm5lZCBXQURMIGRvY3VtZW50IGhhcyB0aGUgc3RhbmRhcmQgV0FETCBzdHJ1Y3R1cmUgdGhhdCB3ZSBzYXcgaW4gdGhlIFdBREwgZG9jdW1lbnQgcmV0dXJuZWQgZm9yIHRoZQorICAgICAgICAgICAgd2hvbGUgSmVyc2V5IGFwcGxpY2F0aW9uIGVhcmxpZXIuIFRoZSBtYWluIGRpZmZlcmVuY2UgaGVyZSBpcyB0aGF0IHRoZSBvbmx5IDxsaXRlcmFsPnJlc291cmNlPC9saXRlcmFsPiBpcyB0aGUKKyAgICAgICAgICAgIHJlc291cmNlIHRvIHdoaWNoIHRoZSAmbGl0Lmh0dHAuT1BUSU9OUzsgSFRUUCByZXF1ZXN0IHdhcyBzZW50LiBUaGUgcmVzb3VyY2UgaGFzIG5vdyBwYXRoCisgICAgICAgICAgICA8bGl0ZXJhbD4iY291bnRyeS8xNSI8L2xpdGVyYWw+IGFuZCBub3QgPGxpdGVyYWw+ImNvdW50cnkve2lkfSI8L2xpdGVyYWw+IGFzIHRoZSBwYXRoIHBhcmFtZXRlcgorICAgICAgICAgICAgPGxpdGVyYWw+e2lkfTwvbGl0ZXJhbD4gd2FzIGFscmVhZHkgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0IHRvIHRoaXMgY29uY3JldGUgcmVzb3VyY2UuCisgICAgICAgIDwvcGFyYT4KKworICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIEFub3RoZXIsIGEgbW9yZSBjb21wbGV4IFdBREwgZXhhbXBsZSBpcyBzaG93biBpbiB0aGUgbmV4dCBleGFtcGxlLgorCisgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICA8dGl0bGU+TW9yZSBjb21wbGV4IFdBREwgZXhhbXBsZSAtIEpBWC1SUyByZXNvdXJjZSBkZWZpbml0aW9uPC90aXRsZT4KKworICAgICAgICAgICAgICAgIDxwcm9ncmFtbGlzdGluZyBsYW5ndWFnZT0iamF2YSIgbGluZW51bWJlcmluZz0ibnVtYmVyZWQiPkBQYXRoKCJjdXN0b21lci97aWR9IikKK3B1YmxpYyBzdGF0aWMgY2xhc3MgQ3VzdG9tZXJSZXNvdXJjZSB7CisgICAgcHJpdmF0ZSBDdXN0b21lclNlcnZpY2UgY3VzdG9tZXJTZXJ2aWNlOworCisgICAgQEdFVAorICAgIHB1YmxpYyBDdXN0b21lciBnZXQoQFBhdGhQYXJhbSgiaWQiKSBpbnQgaWQpIHsKKyAgICAgICAgcmV0dXJuIGN1c3RvbWVyU2VydmljZS5nZXRDdXN0b21lckJ5SWQoaWQpOworICAgIH0KKworICAgIEBQVVQKKyAgICBwdWJsaWMgQ3VzdG9tZXIgcHV0KEN1c3RvbWVyIGN1c3RvbWVyKSB7CisgICAgICAgIHJldHVybiBjdXN0b21lclNlcnZpY2UudXBkYXRlQ3VzdG9tZXIoY3VzdG9tZXIpOworICAgIH0KKworICAgIEBQYXRoKCJhZGRyZXNzIikKKyAgICBwdWJsaWMgQ3VzdG9tZXJBZGRyZXNzU3ViUmVzb3VyY2UgZ2V0Q3VzdG9tZXJBZGRyZXNzKEBQYXRoUGFyYW0oImlkIikgaW50IGlkKSB7CisgICAgICAgIHJldHVybiBuZXcgQ3VzdG9tZXJBZGRyZXNzU3ViUmVzb3VyY2UoaWQpOworICAgIH0KKworICAgIEBQYXRoKCJhZGRpdGlvbmFsLWluZm8iKQorICAgIHB1YmxpYyBPYmplY3QgZ2V0QWRkaXRpb25hbEluZm9TdWJSZXNvdXJjZShAUGF0aFBhcmFtKCJpZCIpIGludCBpZCkgeworICAgICAgICByZXR1cm4gbmV3IEN1c3RvbWVyQWRkcmVzc1N1YlJlc291cmNlKGlkKTsKKyAgICB9CisKK30KKworCitwdWJsaWMgc3RhdGljIGNsYXNzIEN1c3RvbWVyQWRkcmVzc1N1YlJlc291cmNlIHsKKyAgICBwcml2YXRlIGZpbmFsIGludCBjdXN0b21lcklkOworICAgIHByaXZhdGUgQ3VzdG9tZXJTZXJ2aWNlIGN1c3RvbWVyU2VydmljZTsKKworICAgIHB1YmxpYyBDdXN0b21lckFkZHJlc3NTdWJSZXNvdXJjZShpbnQgY3VzdG9tZXJJZCkgeworICAgICAgICB0aGlzLmN1c3RvbWVySWQgPSBjdXN0b21lcklkOworICAgICAgICB0aGlzLmN1c3RvbWVyU2VydmljZSA9IG51bGw7IC8vIGluaXQgY3VzdG9tZXIgc2VydmljZSBoZXJlCisgICAgfQorCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWRkcmVzcygpIHsKKyAgICAgICAgcmV0dXJuIGN1c3RvbWVyU2VydmljZS5nZXRBZGRyZXNzRm9yQ3VzdG9tZXIoY3VzdG9tZXJJZCk7CisgICAgfQorCisgICAgQFBVVAorICAgIHB1YmxpYyB2b2lkIHVwZGF0ZUFkZHJlc3MoU3RyaW5nIGFkZHJlc3MpIHsKKyAgICAgICAgY3VzdG9tZXJTZXJ2aWNlLnVwZGF0ZUFkZHJlc3NGb3JDdXN0b21lcihjdXN0b21lcklkLCBhZGRyZXNzKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInN1YiIpCisgICAgcHVibGljIFN0cmluZyBnZXREZWxpdmVyeUFkZHJlc3MoKSB7CisgICAgICAgIHJldHVybiBjdXN0b21lclNlcnZpY2UuZ2V0RGVsaXZlcnlBZGRyZXNzRm9yQ3VzdG9tZXIoY3VzdG9tZXJJZCk7CisgICAgfQorfTwvcHJvZ3JhbWxpc3Rpbmc+CisgICAgICAgICAgICA8L2V4YW1wbGU+CisKKyAgICAgICAgICAgIFRoZSAmbGl0Lmh0dHAuR0VUOyByZXF1ZXN0IHRvIDxsaXRlcmFsPmh0dHA6Ly9sb2NhbGhvc3Q6OTk5OC9hcHBsaWNhdGlvbi53YWRsPC9saXRlcmFsPiB3aWxsCisgICAgICAgICAgICByZXR1cm4gdGhlIGZvbGxvd2luZyBXQURMIGRvY3VtZW50OgorCisgICAgICAgICAgICA8ZXhhbXBsZT4KKyAgICAgICAgICAgICAgICA8dGl0bGU+TW9yZSBjb21wbGV4IFdBREwgZXhhbXBsZSAtIFdBREwgY29udGVudDwvdGl0bGU+CisgICAgICAgICAgICAgICAgPHByb2dyYW1saXN0aW5nIGxhbmd1YWdlPSJ4bWwiIGxpbmVudW1iZXJpbmc9Im51bWJlcmVkIj4mbHQ7P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8mZ3Q7CismbHQ7YXBwbGljYXRpb24geG1sbnM9Imh0dHA6Ly93YWRsLmRldi5qYXZhLm5ldC8yMDA5LzAyIiZndDsKKyAgICAmbHQ7ZG9jIHhtbG5zOmplcnNleT0iaHR0cDovL2plcnNleS5qYXZhLm5ldC8iCisgICAgICAgIGplcnNleTpnZW5lcmF0ZWRCeT0iSmVyc2V5OiAyLjAtU05BUFNIT1QgJHtidWlsZE51bWJlcn0iLyZndDsKKyAgICAmbHQ7Z3JhbW1hcnMvJmd0OworICAgICZsdDtyZXNvdXJjZXMgYmFzZT0iaHR0cDovL2xvY2FsaG9zdDo5OTk4LyImZ3Q7CisgICAgICAgICZsdDtyZXNvdXJjZSBwYXRoPSJjdXN0b21lci97aWR9IiZndDsKKyAgICAgICAgICAgICZsdDtwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCisgICAgICAgICAgICAgICAgdHlwZT0ieHM6aW50IiBzdHlsZT0idGVtcGxhdGUiIG5hbWU9ImlkIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7bWV0aG9kIG5hbWU9IkdFVCIgaWQ9ImdldCImZ3Q7CisgICAgICAgICAgICAgICAgJmx0O3Jlc3BvbnNlLyZndDsKKyAgICAgICAgICAgICZsdDsvbWV0aG9kJmd0OworICAgICAgICAgICAgJmx0O21ldGhvZCBuYW1lPSJQVVQiIGlkPSJwdXQiJmd0OworICAgICAgICAgICAgICAgICZsdDtyZXNwb25zZS8mZ3Q7CisgICAgICAgICAgICAmbHQ7L21ldGhvZCZndDsKKyAgICAgICAgICAgICZsdDttZXRob2QgbmFtZT0iT1BUSU9OUyIgaWQ9ImFwcGx5IiZndDsKKyAgICAgICAgICAgICAgICAmbHQ7cmVxdWVzdCZndDsKKyAgICAgICAgICAgICAgICAgICAgJmx0O3JlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0iKi8qIi8mZ3Q7CisgICAgICAgICAgICAgICAgJmx0Oy9yZXF1ZXN0Jmd0OworICAgICAgICAgICAgICAgICZsdDtyZXNwb25zZSZndDsKKyAgICAgICAgICAgICAgICAgICAgJmx0O3JlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vdm5kLnN1bi53YWRsK3htbCIvJmd0OworICAgICAgICAgICAgICAgICZsdDsvcmVzcG9uc2UmZ3Q7CisgICAgICAgICAgICAmbHQ7L21ldGhvZCZndDsKKyAgICAgICAgICAgICZsdDttZXRob2QgbmFtZT0iT1BUSU9OUyIgaWQ9ImFwcGx5IiZndDsKKyAgICAgICAgICAgICAgICAmbHQ7cmVxdWVzdCZndDsKKyAgICAgICAgICAgICAgICAgICAgJmx0O3JlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0iKi8qIi8mZ3Q7CisgICAgICAgICAgICAgICAgJmx0Oy9yZXF1ZXN0Jmd0OworICAgICAgICAgICAgICAgICZsdDtyZXNwb25zZSZndDsKKyAgICAgICAgICAgICAgICAgICAgJmx0O3JlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0idGV4dC9wbGFpbiIvJmd0OworICAgICAgICAgICAgICAgICZsdDsvcmVzcG9uc2UmZ3Q7CisgICAgICAgICAgICAmbHQ7L21ldGhvZCZndDsKKyAgICAgICAgICAgICZsdDttZXRob2QgbmFtZT0iT1BUSU9OUyIgaWQ9ImFwcGx5IiZndDsKKyAgICAgICAgICAgICAgICAmbHQ7cmVxdWVzdCZndDsKKyAgICAgICAgICAgICAgICAgICAgJmx0O3JlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0iKi8qIi8mZ3Q7CisgICAgICAgICAgICAgICAgJmx0Oy9yZXF1ZXN0Jmd0OworICAgICAgICAgICAgICAgICZsdDtyZXNwb25zZSZndDsKKyAgICAgICAgICAgICAgICAgICAgJmx0O3JlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0iKi8qIi8mZ3Q7CisgICAgICAgICAgICAgICAgJmx0Oy9yZXNwb25zZSZndDsKKyAgICAgICAgICAgICZsdDsvbWV0aG9kJmd0OworICAgICAgICAgICAgJmx0O3Jlc291cmNlIHBhdGg9ImFkZGl0aW9uYWwtaW5mbyImZ3Q7CisgICAgICAgICAgICAgICAgJmx0O3BhcmFtIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKKyAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHM6aW50IiBzdHlsZT0idGVtcGxhdGUiIG5hbWU9ImlkIi8mZ3Q7CisgICAgICAgICAgICAmbHQ7L3Jlc291cmNlJmd0OworICAgICAgICAgICAgJmx0O3Jlc291cmNlIHBhdGg9ImFkZHJlc3MiJmd0OworICAgICAgICAgICAgICAgICZsdDtwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCisgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzOmludCIgc3R5bGU9InRlbXBsYXRlIiBuYW1lPSJpZCIvJmd0OworICAgICAgICAgICAgICAgICZsdDttZXRob2QgbmFtZT0iR0VUIiBpZD0iZ2V0QWRkcmVzcyImZ3Q7CisgICAgICAgICAgICAgICAgICAgICZsdDtyZXNwb25zZS8mZ3Q7CisgICAgICAgICAgICAgICAgJmx0Oy9tZXRob2QmZ3Q7CisgICAgICAgICAgICAgICAgJmx0O21ldGhvZCBuYW1lPSJQVVQiIGlkPSJ1cGRhdGVBZGRyZXNzIi8mZ3Q7CisgICAgICAgICAgICAgICAgJmx0O3Jlc291cmNlIHBhdGg9InN1YiImZ3Q7CisgICAgICAgICAgICAgICAgICAgICZsdDttZXRob2QgbmFtZT0iR0VUIiBpZD0iZ2V0RGVsaXZlcnlBZGRyZXNzIiZndDsKKyAgICAgICAgICAgICAgICAgICAgICAgICZsdDtyZXNwb25zZS8mZ3Q7CisgICAgICAgICAgICAgICAgICAgICZsdDsvbWV0aG9kJmd0OworICAgICAgICAgICAgICAgICZsdDsvcmVzb3VyY2UmZ3Q7CisgICAgICAgICAgICAmbHQ7L3Jlc291cmNlJmd0OworICAgICAgICAmbHQ7L3Jlc291cmNlJmd0OworICAgICAgICAmbHQ7cmVzb3VyY2UgcGF0aD0iYXBwbGljYXRpb24ud2FkbCImZ3Q7CisgICAgICAgICAgICAmbHQ7bWV0aG9kIG5hbWU9IkdFVCIgaWQ9ImdldFdhZGwiJmd0OworICAgICAgICAgICAgICAgICZsdDtyZXNwb25zZSZndDsKKyAgICAgICAgICAgICAgICAgICAgJmx0O3JlcHJlc2VudGF0aW9uIG1lZGlhVHlwZT0iYXBwbGljYXRpb24vdm5kLnN1bi53YWRsK3htbCIvJmd0OworICAgICAgICAgICAgICAgICAgICAmbHQ7cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJhcHBsaWNhdGlvbi94bWwiLyZndDsKKyAgICAgICAgICAgICAgICAmbHQ7L3Jlc3BvbnNlJmd0OworICAgICAgICAgICAgJmx0Oy9tZXRob2QmZ3Q7CisgICAgICAgICAgICAmbHQ7bWV0aG9kIG5hbWU9Ik9QVElPTlMiIGlkPSJhcHBseSImZ3Q7CisgICAgICAgICAgICAgICAgJmx0O3JlcXVlc3QmZ3Q7CisgICAgICAgICAgICAgICAgICAgICZsdDtyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9IiovKiIvJmd0OworICAgICAgICAgICAgICAgICZsdDsvcmVxdWVzdCZndDsKKyAgICAgICAgICAgICAgICAmbHQ7cmVzcG9uc2UmZ3Q7CisgICAgICAgICAgICAgICAgICAgICZsdDtyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9InRleHQvcGxhaW4iLyZndDsKKyAgICAgICAgICAgICAgICAmbHQ7L3Jlc3BvbnNlJmd0OworICAgICAgICAgICAgJmx0Oy9tZXRob2QmZ3Q7CisgICAgICAgICAgICAmbHQ7bWV0aG9kIG5hbWU9Ik9QVElPTlMiIGlkPSJhcHBseSImZ3Q7CisgICAgICAgICAgICAgICAgJmx0O3JlcXVlc3QmZ3Q7CisgICAgICAgICAgICAgICAgICAgICZsdDtyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9IiovKiIvJmd0OworICAgICAgICAgICAgICAgICZsdDsvcmVxdWVzdCZndDsKKyAgICAgICAgICAgICAgICAmbHQ7cmVzcG9uc2UmZ3Q7CisgICAgICAgICAgICAgICAgICAgICZsdDtyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9IiovKiIvJmd0OworICAgICAgICAgICAgICAgICZsdDsvcmVzcG9uc2UmZ3Q7CisgICAgICAgICAgICAmbHQ7L21ldGhvZCZndDsKKyAgICAgICAgICAgICZsdDtyZXNvdXJjZSBwYXRoPSJ7cGF0aH0iJmd0OworICAgICAgICAgICAgICAgICZsdDtwYXJhbSB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCisgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzOnN0cmluZyIgc3R5bGU9InRlbXBsYXRlIiBuYW1lPSJwYXRoIi8mZ3Q7CisgICAgICAgICAgICAgICAgJmx0O21ldGhvZCBuYW1lPSJHRVQiIGlkPSJnZUV4dGVybmFsR3JhbW1hciImZ3Q7CisgICAgICAgICAgICAgICAgICAgICZsdDtyZXNwb25zZSZndDsKKyAgICAgICAgICAgICAgICAgICAgICAgICZsdDtyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9ImFwcGxpY2F0aW9uL3htbCIvJmd0OworICAgICAgICAgICAgICAgICAgICAmbHQ7L3Jlc3BvbnNlJmd0OworICAgICAgICAgICAgICAgICZsdDsvbWV0aG9kJmd0OworICAgICAgICAgICAgICAgICZsdDttZXRob2QgbmFtZT0iT1BUSU9OUyIgaWQ9ImFwcGx5IiZndDsKKyAgICAgICAgICAgICAgICAgICAgJmx0O3JlcXVlc3QmZ3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAmbHQ7cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSIqLyoiLyZndDsKKyAgICAgICAgICAgICAgICAgICAgJmx0Oy9yZXF1ZXN0Jmd0OworICAgICAgICAgICAgICAgICAgICAmbHQ7cmVzcG9uc2UmZ3Q7CisgICAgICAgICAgICAgICAgICAgICAgICAmbHQ7cmVwcmVzZW50YXRpb24gbWVkaWFUeXBlPSJ0ZXh0L3BsYWluIi8mZ3Q7CisgICAgICAgICAgICAgICAgICAgICZsdDsvcmVzcG9uc2UmZ3Q7CisgICAgICAgICAgICAgICAgJmx0Oy9tZXRob2QmZ3Q7CisgICAgICAgICAgICAgICAgJmx0O21ldGhvZCBuYW1lPSJPUFRJT05TIiBpZD0iYXBwbHkiJmd0OworICAgICAgICAgICAgICAgICAgICAmbHQ7cmVxdWVzdCZndDsKKyAgICAgICAgICAgICAgICAgICAgICAgICZsdDtyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9IiovKiIvJmd0OworICAgICAgICAgICAgICAgICAgICAmbHQ7L3JlcXVlc3QmZ3Q7CisgICAgICAgICAgICAgICAgICAgICZsdDtyZXNwb25zZSZndDsKKyAgICAgICAgICAgICAgICAgICAgICAgICZsdDtyZXByZXNlbnRhdGlvbiBtZWRpYVR5cGU9IiovKiIvJmd0OworICAgICAgICAgICAgICAgICAgICAmbHQ7L3Jlc3BvbnNlJmd0OworICAgICAgICAgICAgICAgICZsdDsvbWV0aG9kJmd0OworICAgICAgICAgICAgJmx0Oy9yZXNvdXJjZSZndDsKKyAgICAgICAgJmx0Oy9yZXNvdXJjZSZndDsKKyAgICAmbHQ7L3Jlc291cmNlcyZndDsKKyZsdDsvYXBwbGljYXRpb24mZ3Q7PC9wcm9ncmFtbGlzdGluZz4KKyAgICAgICAgICAgIDwvZXhhbXBsZT4KKworICAgICAgICAgICAgVGhlIDxsaXRlcmFsPnJlc291cmNlPC9saXRlcmFsPiB3aXRoIDxsaXRlcmFsPnBhdGg9ImN1c3RvbWVyL3tpZH0iPC9saXRlcmFsPiBpcyBzaW1pbGFyIHRvIHRoZQorICAgICAgICAgICAgY291bnRyeSByZXNvdXJjZSBmcm9tIHRoZSBwcmV2aW91cyBleGFtcGxlLiBUaGVyZSBpcyBhIHBhdGggcGFyYW1ldGVyIHdoaWNoIGlkZW50aWZpZXMgdGhlIGN1c3RvbWVyCisgICAgICAgICAgICBieSA8bGl0ZXJhbD5pZDwvbGl0ZXJhbD4uIFRoZSByZXNvdXJjZSBjb250YWlucyAyIHVzZXItZGVjbGFyZWQgbWV0aG9kcyBhbmQgYWdhaW4gYXV0by1nZW5lcmF0ZWQKKyAgICAgICAgICAgICZsaXQuaHR0cC5PUFRJT05TOyBtZXRob2RzIGFkZGVkIGJ5IEplcnNleS4gVEhlIHJlc291cmNlIGRlY2xhcmVzIDIgc3ViLXJlc291cmNlIGxvY2F0b3JzIHdoaWNoIGFyZQorICAgICAgICAgICAgcmVwcmVzZW50ZWQgaW4gdGhlIHJldHVybmVkIFdBREwgZG9jdW1lbnQgYXMgbmVzdGVkIDxsaXRlcmFsPnJlc291cmNlPC9saXRlcmFsPiBlbGVtZW50cy4gTm90ZSB0aGF0IHRoZSBzdWItcmVzb3VyY2UKKyAgICAgICAgICAgIGxvY2F0b3IgPGxpdGVyYWw+Z2V0Q3VzdG9tZXJBZGRyZXNzKCk8L2xpdGVyYWw+IHJldHVybnMgYSB0eXBlIEN1c3RvbWVyQWRkcmVzc1N1YlJlc291cmNlIGluIHRoZQorICAgICAgICAgICAgbWV0aG9kIGRlY2xhcmF0aW9uIGFuZCBhbHNvIGluIHRoZSBXQURMIHRoZXJlIGlzIGEgPGxpdGVyYWw+cmVzb3VyY2U8L2xpdGVyYWw+IGVsZW1lbnQgZm9yIHN1Y2gKKyAgICAgICAgICAgIGEgc3ViIHJlc291cmNlIHdpdGggZnVsbCBpbnRlcm5hbCBkZXNjcmlwdGlvbi4gVGhlIHNlY29uZCBtZXRob2QKKyAgICAgICAgICAgIDxsaXRlcmFsPmdldEFkZGl0aW9uYWxJbmZvU3ViUmVzb3VyY2UoKTwvbGl0ZXJhbD4gcmV0dXJucyBvbmx5IGFuIDxsaXRlcmFsPk9iamVjdDwvbGl0ZXJhbD4gaW4gdGhlIG1ldGhvZCBkZWNsYXJhdGlvbi4KKyAgICAgICAgICAgIFdoaWxlIHRoaXMgaXMgY29ycmVjdCBmcm9tIHRoZSBKQVgtUlMgcGVyc3BlY3RpdmUgYXMgdGhlIHJlYWwgcmV0dXJuZWQgdHlwZSBjYW4gYmUgY29tcHV0ZWQgZnJvbSBhIHJlcXVlc3QKKyAgICAgICAgICAgIGluZm9ybWF0aW9uLCBpdCBjcmVhdGVzIGEgcHJvYmxlbSBmb3IgV0FETCBnZW5lcmF0b3IgYmVjYXVzZSBXQURMIGlzIGdlbmVyYXRlZCBiYXNlZCBvbiB0aGUgc3RhdGljIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgIG9mIHRoZSBKQVgtUlMgYXBwbGljYXRpb24gcmVzb3VyY2VzLiBUaGUgV0FETCBnZW5lcmF0b3IgZG9lcyBub3Qga25vdyB3aGF0IHR5cGUgd291bGQgYmUgYWN0dWFsbHkgcmV0dXJuZWQgdG8KKyAgICAgICAgICAgIGEgcmVxdWVzdCBhdCBydW4gdGltZS4KKyAgICAgICAgICAgIFRoYXQgaXMgdGhlIHJlYXNvbiB3aHkgdGhlIG5lc3RlZCA8bGl0ZXJhbD5yZXNvdXJjZTwvbGl0ZXJhbD4gZWxlbWVudCB3aXRoIDxsaXRlcmFsPnBhdGg9ImFkZGl0aW9uYWwtaW5mbyI8L2xpdGVyYWw+CisgICAgICAgICAgICBkb2VzIG5vdCBjb250YWluIGFueSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3VwcG9ydGVkIHJlc291cmNlIHJlcHJlc2VudGF0aW9ucy4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZSA8bGl0ZXJhbD5DdXN0b21lckFkZHJlc3NTdWJSZXNvdXJjZTwvbGl0ZXJhbD4gc3ViLXJlc291cmNlIGRlc2NyaWJlZCBpbiB0aGUgbmVzdGVkIGVsZW1lbnQKKyAgICAgICAgICAgIDxsaXRlcmFsPiZsdDtyZXNvdXJjZSBwYXRoPSJhZGRyZXNzIiZndDs8L2xpdGVyYWw+IGRvZXMgbm90IGNvbnRhaW4gYW4gJmxpdC5odHRwLk9QVElPTlM7IG1ldGhvZC4KKyAgICAgICAgICAgIFdoaWxlIHRoZXNlIG1ldGhvZHMgYXJlIGluIGZhY3QgZ2VuZXJhdGVkIGJ5IEplcnNleSBmb3IgdGhlIHN1Yi1yZXNvdXJjZSwgSmVyc2V5IFdBREwgZ2VuZXJhdG9yIGRvZXMgbm90IGN1cnJlbnRseQorICAgICAgICAgICAgc3VwcG9ydCBhZGRpbmcgdGhlc2UgbWV0aG9kcyB0byB0aGUgc3ViLXJlc291cmNlIGRlc2NyaXB0aW9uLiBUaGlzIHNob3VsZCBiZSBhZGRyZXNzZWQgaW4gdGhlIG5lYXIgZnV0dXJlLgorICAgICAgICAgICAgU3RpbGwsIHRoZXJlIGFyZSB0d28gdXNlci1kZWZpbmVkIHJlc291cmNlIG1ldGhvZHMgaGFuZGxpbmcgSFRUUCAmbGl0Lmh0dHAuR0VUOyBhbmQgJmxpdC5odHRwLlBVVDsgcmVxdWVzdHMuCisgICAgICAgICAgICBUaGUgc3ViLXJlc291cmNlIG1ldGhvZCA8bGl0ZXJhbD5nZXREZWxpdmVyeUFkZHJlc3MoKTwvbGl0ZXJhbD4gaXMgcmVwcmVzZW50ZWQgYXMgYSBzZXBhcmF0ZSBuZXN0ZWQgcmVzb3VyY2Ugd2l0aAorICAgICAgICAgICAgPGxpdGVyYWw+cGF0aD0ic3ViIjwvbGl0ZXJhbD4uIFNob3VsZCB0aGVyZSBiZSBtb3JlIHN1Yi1yZXNvdXJjZSBtZXRob2RzIGRlZmluZWQgd2l0aCA8bGl0ZXJhbD5wYXRoPSJzdWIiPC9saXRlcmFsPiwKKyAgICAgICAgICAgIHRoZW4gYWxsIHRoZXNlIG1ldGhvZCBkZXNjcmlwdGlvbnMgd291bGQgYmUgcGxhY2VkIGludG8gdGhlIHNhbWUgPGxpdGVyYWw+cmVzb3VyY2U8L2xpdGVyYWw+IGVsZW1lbnQuCisgICAgICAgICAgICBJbiBvdGhlciB3b3Jkcywgc3ViLXJlc291cmNlIG1ldGhvZHMgYXJlIGdyb3VwZWQgaW4gV0FETCBhcyBzdWItcmVzb3VyY2VzIGJhc2VkIG9uIHRoZWlyIDxsaXRlcmFsPnBhdGg8L2xpdGVyYWw+CisgICAgICAgICAgICB2YWx1ZS4KKyAgICAgICAgPC9wYXJhPgorICAgIDwvc2VjdGlvbj4KKworICAgIDxzZWN0aW9uPgorICAgICAgICA8dGl0bGU+Q29uZmlndXJhdGlvbjwvdGl0bGU+CisKKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBXQURMIGdlbmVyYXRpb24gaXMgZW5hYmxlZCBpbiBKZXJzZXkgYnkgZGVmYXVsdC4gVGhpcyBtZWFucyB0aGF0ICZsaXQuaHR0cC5PUFRJT05TOworICAgICAgICAgICAgbWV0aG9kcyBhcmUgYWRkZWQgYnkgZGVmYXVsdCB0byBlYWNoIHJlc291cmNlIGFuZCBhbiBhdXRvLWdlbmVyYXRlZCA8bGl0ZXJhbD4vYXBwbGljYXRpb24ud2FkbDwvbGl0ZXJhbD4KKyAgICAgICAgICAgIHJlc291cmNlIGlzIGRlcGxveWVkIHRvby4gVG8gb3ZlcnJpZGUgdGhpcyBkZWZhdWx0IGJlaGF2aW9yIGFuZCBkaXNhYmxlIFdBREwgZ2VuZXJhdGlvbiBpbiBKZXJzZXksIHNldHVwIHRoZQorICAgICAgICAgICAgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpbiB5b3VyIGFwcGxpY2F0aW9uOgorCisgICAgICAgICAgICA8cHJvZ3JhbWxpc3Rpbmc+amVyc2V5LmNvbmZpZy5zZXJ2ZXIud2FkbC5kaXNhYmxlV2FkbD10cnVlPC9wcm9ncmFtbGlzdGluZz4KKworICAgICAgICAgICAgVGhpcyBwcm9wZXJ0eSBjYW4gYmUgc2V0dXAgaW4gYSA8bGl0ZXJhbD53ZWIueG1sPC9saXRlcmFsPiBpZiB0aGUgSmVyc2V5IGFwcGxpY2F0aW9uIGlzIGRlcGxveWVkCisgICAgICAgICAgICBpbiB0aGUgc2VydmxldCB3aXRoIDxsaXRlcmFsPndlYi54bWw8L2xpdGVyYWw+IG9yIHRoZSBwcm9wZXJ0eSBjYW4gYmUgcmV0dXJuZWQgZnJvbSB0aGUgJmpheHJzLmNvcmUuQXBwbGljYXRpb247LgorICAgICAgICAgICAgPGxpdGVyYWw+Z2V0UHJvcGVydGllcygpPC9saXRlcmFsPi4gU2VlIDxsaW5rIGxpbmtlbmQ9ImRlcGxveW1lbnQiPkRlcGxveW1lbnQgY2hhcHRlcjwvbGluaz4gZm9yIG1vcmUgaW5mb3JtYXRpb24KKyAgICAgICAgICAgIG9uIHNldHRpbmcgdGhlIGFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcyBpbiB2YXJpb3VzIGRlcGxveW1lbnRzLgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgV0FETCBzdXBwb3J0IGluIEplcnNleSBpcyBpbXBsZW1lbnRlZCB2aWEgJmplcnNleS5zZXJ2ZXIuTW9kZWxQcm9jZXNzb3I7IGV4dGVuc2lvbi4gVGhpcyBpbXBsZW1lbnRhdGlvbiBlbmhhbmNlcworICAgICAgICAgICAgdGhlIGFwcGxpY2F0aW9uIHJlc291cmNlIG1vZGVsIGJ5IGFkZGluZyB0aGUgV0FETCBwcm92aWRpbmcgcmVzb3VyY2VzLiBXQURMICZsaXQuamVyc2V5LnNlcnZlci5Nb2RlbFByb2Nlc3NvcjsKKyAgICAgICAgICAgIHByaW9yaXR5IHZhbHVlIGlzIGhpZ2ggKGkuZS4gdGhlIHByaW9yaXR5IGlzIGxvdykgYXMgaXQgc2hvdWxkIGJlIGV4ZWN1dGVkIGFzIG9uZSBvZiB0aGUgbGFzdCBtb2RlbCBwcm9jZXNzb3JzLgorICAgICAgICAgICAgVGhlcmVmb3JlLCBhbnkgJmxpdC5qZXJzZXkuc2VydmVyLk1vZGVsUHJvY2Vzc29yOyBleGVjdXRlZCBiZWZvcmUgd2lsbCBub3Qgc2VlIFdBREwgZXh0ZW5zaW9ucyBpbiB0aGUgcmVzb3VyY2UgbW9kZWwuCisgICAgICAgICAgICBXQURMIGhhbmRsaW5nIHJlc291cmNlIG1vZGVsIGV4dGVuc2lvbnMgKHJlc291cmNlcyBhbmQgJmxpdC5odHRwLk9QVElPTlM7IHJlc291cmNlIG1ldGhvZHMpIGFyZSBub3QgYWRkZWQgdG8gdGhlCisgICAgICAgICAgICBhcHBsaWNhdGlvbiByZXNvdXJjZSBtb2RlbCBpZiB0aGVyZSBpcyBhbHJlYWR5IGEgbWF0Y2hpbmcgcmVzb3VyY2Ugb3IgYSByZXNvdXJjZSBtZXRob2QgZGV0ZWN0ZWQgaW4gdGhlIG1vZGVsLgorICAgICAgICAgICAgSW4gb3RoZXIgd29yZHMsIGlmIHlvdSBkZWZpbmUgZm9yIGV4YW1wbGUgeW91ciBvd24gJmxpdC5odHRwLk9QVElPTlM7IG1ldGhvZCB0aGF0IHdvdWxkIHByb2R1Y2UKKyAgICAgICAgICAgIDxsaXRlcmFsPiJhcHBsaWNhdGlvbi53YWRsIjwvbGl0ZXJhbD4gcmVzcG9uc2UgY29udGVudCwgdGhpcyBtZXRob2Qgd2lsbCBub3QgYmUgb3ZlcnJpZGRlbiBieSBXQURMIG1vZGVsIHByb2Nlc3Nvci4KKyAgICAgICAgICAgIFNlZSA8bGluayBsaW5rZW5kPSJyZXNvdXJjZS1idWlsZGVyIj5SZXNvdXJjZSBidWlsZGVyIGNoYXB0ZXI8L2xpbms+IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uCisgICAgICAgICAgICAmbGl0LmplcnNleS5zZXJ2ZXIuTW9kZWxQcm9jZXNzb3I7IGV4dGVuc2lvbiBtZWNoYW5pc20uCisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+CisKKyAgICA8c2VjdGlvbj4KKyAgICAgICAgPHRpdGxlPkV4dGVuZGVkIFdBREwgc3VwcG9ydDwvdGl0bGU+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgPGVtcGhhc2lzIHJvbGU9InN0cm9uZyI+UGxlYXNlIG5vdGUgdGhhdCB0aGUgQVBJIG9mIGV4dGVuZGVkIFdBREwgc3VwcG9ydCBpcyBnb2luZyB0byBiZSBjaGFuZ2VkIGluIG9uZSBvZiB0aGUgZnV0dXJlCisgICAgICAgICAgICByZWxlYXNlcyBvZiBKZXJzZXkgMi54IChzZWUgYmVsb3cpLjwvZW1waGFzaXM+CisgICAgICAgIDwvcGFyYT4KKyAgICAgICAgPHBhcmE+CisgICAgICAgICAgICBKZXJzZXkgc3VwcG9ydHMgZXh0ZW5zaW9uIG9mIFdBREwgZ2VuZXJhdGlvbiBjYWxsZWQgPGVtcGhhc2lzPmV4dGVuZGVkIFdBREw8L2VtcGhhc2lzPi4gVXNpbmcgdGhlIGV4dGVuZGVkIFdBREwKKyAgICAgICAgICAgIHN1cHBvcnQgeW91IGNhbiBlbmhhbmNlIHRoZSBnZW5lcmF0ZWQgV0FETCBkb2N1bWVudCB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24sIHN1Y2ggYXMKKyAgICAgICAgICAgIHJlc291cmNlIG1ldGhvZCBqYXZhZG9jLWJhc2VkIGRvY3VtZW50YXRpb24gb2YgeW91ciBSRVNUIEFQSXMsIGFkZGluZyBnZW5lcmFsIGRvY3VtZW50YXRpb24sCisgICAgICAgICAgICBhZGRpbmcgZXh0ZXJuYWwgZ3JhbW1hciBzdXBwb3J0LCBvciBhZGRpbmcgYW55IGN1c3RvbSBXQURMIGV4dGVuc2lvbiBpbmZvcm1hdGlvbi4KKyAgICAgICAgPC9wYXJhPgorICAgICAgICA8cGFyYT4KKyAgICAgICAgICAgIFRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBleGlzdGluZyBleHRlbmRlZCBXQURMIGNhbiBiZSBmb3VuZCBoZXJlOgorICAgICAgICAgICAgPGxpbmsgeGxpbms6aHJlZj0iaHR0cHM6Ly93aWtpcy5vcmFjbGUuY29tL2Rpc3BsYXkvSmVyc2V5L1dBREwiPkV4dGVuZGVkIFdBREwgaW4gSmVyc2V5IDE8L2xpbms+LiBUaGlzIGNvbnRhaW5zCisgICAgICAgICAgICBkZXNjcmlwdGlvbiBvZiBhbiBleHRlbmRlZCBXQURMIGdlbmVyYXRpb24gaW4gSmVyc2V5IDEueCB0aGF0IGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQgYWxzbyBieSBKZXJzZXkgMi54LgorICAgICAgICA8L3BhcmE+CisgICAgICAgIDxwYXJhPgorICAgICAgICAgICAgPGVtcGhhc2lzIHJvbGU9InN0cm9uZyI+QWdhaW4sIG5vdGUgdGhhdCB0aGUgZXh0ZW5kZWQgV0FETCBpbiBKZXJzZXkgMi54IGlzIE5PVCB0aGUgaW50ZW5kZWQgZmluYWwgdmVyc2lvbiBhbmQKKyAgICAgICAgICAgIEFQSSBpcyBnb2luZyB0byBiZSBjaGFuZ2VkLjwvZW1waGFzaXM+IFRoZSBleGlzdGluZyBzZXQgb2YgZmVhdHVyZXMgYW5kIGZ1bmN0aW9uYWxpdHkgd2lsbCBiZSBwcmVzZXJ2ZWQgYnV0IHRoZQorICAgICAgICAgICAgQVBJcyB3aWxsIGJlIHNpZ25pZmljYW50bHkgcmUtZGVzaWduZWQgdG8gc3VwcG9ydCBhZGRpdGlvbmFsIHVzZSBjYXNlcy4gVGhpcyBpbXBhY3RzIG1haW5seSB0aGUgQVBJcyBvZgorICAgICAgICAgICAgJmplcnNleS5zZXJ2ZXIuV2FkbEdlbmVyYXRvcjssICZqZXJzZXkuc2VydmVyLldhZGxHZW5lcmF0b3JDb25maWc7IGFzIHdlbGwgYXMgYW55IHJlbGF0ZWQgY2xhc3Nlcy4gVGhlIEFQSSBjaGFuZ2VzCisgICAgICAgICAgICBtYXkgaW1wYWN0IHlvdXIgY29kZSBpZiB5b3UgYXJlIHVzaW5nIGEgY3VzdG9tICZsaXQuamVyc2V5LnNlcnZlci5XYWRsR2VuZXJhdG9yOyBvciBwbGFuIHRvIGltcGxlbWVudCBvbmUuCisgICAgICAgIDwvcGFyYT4KKyAgICA8L3NlY3Rpb24+Cis8L2NoYXB0ZXI+CmRpZmYgLS1naXQgYS9ldGMvY29uZmlnL2NoZWNrc3R5bGUtc3VwcHJlc3Npb25zLnhtbCBiL2V0Yy9jb25maWcvY2hlY2tzdHlsZS1zdXBwcmVzc2lvbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NDkwZjUKLS0tIC9kZXYvbnVsbAorKysgYi9ldGMvY29uZmlnL2NoZWNrc3R5bGUtc3VwcHJlc3Npb25zLnhtbApAQCAtMCwwICsxLDQzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzwhRE9DVFlQRSBzdXBwcmVzc2lvbnMgUFVCTElDICItLy9QdXBweSBDcmF3bC8vRFREIFN1cHByZXNzaW9ucyAxLjEvL0VOIiAiaHR0cDovL3d3dy5wdXBweWNyYXdsLmNvbS9kdGRzL3N1cHByZXNzaW9uc18xXzEuZHRkIj4KKworPHN1cHByZXNzaW9ucz4KKyAgICA8IS0tIFN1cHByZXNzIGFsbCBjaGVja3Mgb24gYWxsIFdBREwgZ2VuZXJhdGVkIGZpbGVzLiAtLT4KKyAgICA8c3VwcHJlc3MgZmlsZXM9ImNvbVtcXC9dc3VuW1xcL11yZXNlYXJjaFtcXC9dd3NbXFwvXXdhZGwiIGNoZWNrcz0iLioiLz4KKyAgICA8IS0tIFN1cHByZXNzIGFsbCBjaGVja3Mgb24gYWxsIEpNSCBnZW5lcmF0ZWQgZmlsZXMuIC0tPgorICAgIDxzdXBwcmVzcyBmaWxlcz0ib3JnW1xcL11vcGVuamRrW1xcL11qbWgiIGNoZWNrcz0iLioiLz4KKyAgICA8IS0tIFN1cHByZXNzIGFsbCBjaGVja3Mgb24gcmVwYWNrYWdlZCBKYWNrc29uIEpBWC1SUyBwcm92aWRlcnMuIC0tPgorICAgIDxzdXBwcmVzcyBmaWxlcz0ib3JnW1xcL11nbGFzc2Zpc2hbXFwvXWplcnNleVtcXC9damFja3NvbltcXC9daW50ZXJuYWxbXFwvXWphY2tzb24iIGNoZWNrcz0iLioiLz4KKyAgICA8c3VwcHJlc3MgZmlsZXM9ImdlbmVyYXRlZCIgY2hlY2tzPSIuKiIvPgorCisgICAgPCEtLSBTdXBwcmVzcyBhbGwgY2hlY2tzIGZvciBhbGwgSmVyc2V5IHJlcGFja2FnZWQgbGlicmFyaWVzLiAtLT4KKyAgICA8c3VwcHJlc3MgZmlsZXM9ImplcnNleVtcXC9dcmVwYWNrYWdlZCIgY2hlY2tzPSIuKiIvPgorCisgICAgPCEtLSBTdXBwcmVzcyBhbGwgY2hlY2tzIGZvciBzcGVjaWZpYyBjbGFzc2VzLiAtLT4KKyAgICA8c3VwcHJlc3MgZmlsZXM9IkxvY2FsaXphdGlvbk1lc3NhZ2VzIiBjaGVja3M9Ii4qIi8+CisgICAgPHN1cHByZXNzIGZpbGVzPSJDb25jdXJyZW50SGFzaE1hcFY4IiBjaGVja3M9Ii4qIi8+CisgICAgPHN1cHByZXNzIGZpbGVzPSJMaW5rZWRUcmFuc2ZlclF1ZXVlIiBjaGVja3M9Ii4qIi8+CisgICAgPHN1cHByZXNzIGZpbGVzPSJUcmFuc2ZlclF1ZXVlIiBjaGVja3M9Ii4qIi8+CisgICAgPHN1cHByZXNzIGZpbGVzPSJUaHJlYWRMb2NhbFJhbmRvbSIgY2hlY2tzPSIuKiIvPgorCisgICAgPCEtLSBTdXBwcmVzcyAibm8gZmluYWxpemVyIiBjaGVjayBmb3IgY2xpZW50IHJ1bnRpbWUuIC0tPgorICAgIDxzdXBwcmVzcyBmaWxlcz0iQ2xpZW50UnVudGltZSIgY2hlY2tzPSJOb0ZpbmFsaXplckNoZWNrIi8+Cis8L3N1cHByZXNzaW9ucz4KZGlmZiAtLWdpdCBhL2V0Yy9jb25maWcvY2hlY2tzdHlsZS12ZXJpZnkueG1sIGIvZXRjL2NvbmZpZy9jaGVja3N0eWxlLXZlcmlmeS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ0YjFiMwotLS0gL2Rldi9udWxsCisrKyBiL2V0Yy9jb25maWcvY2hlY2tzdHlsZS12ZXJpZnkueG1sCkBAIC0wLDAgKzEsMTMyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzwhRE9DVFlQRSBtb2R1bGUgUFVCTElDICItLy9QdXBweSBDcmF3bC8vRFREIENoZWNrIENvbmZpZ3VyYXRpb24gMS4zLy9FTiIgImh0dHA6Ly93d3cucHVwcHljcmF3bC5jb20vZHRkcy9jb25maWd1cmF0aW9uXzFfMy5kdGQiPgorCis8bW9kdWxlIG5hbWU9IkNoZWNrZXIiPgorICAgIDxwcm9wZXJ0eSBuYW1lPSJjaGFyc2V0IiB2YWx1ZT0iVVRGLTgiLz4KKworICAgIDwhLS0gQ2hlY2tzIGZvciB3aGl0ZXNwYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfd2hpdGVzcGFjZS5odG1sIC0tPgorICAgIDxtb2R1bGUgbmFtZT0iRmlsZVRhYkNoYXJhY3RlciI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJlYWNoTGluZSIgdmFsdWU9InRydWUiLz4KKyAgICA8L21vZHVsZT4KKworICAgIDxtb2R1bGUgbmFtZT0iVHJlZVdhbGtlciI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWJXaWR0aCIgdmFsdWU9IjQiLz4KKworICAgICAgICA8bW9kdWxlIG5hbWU9Ik91dGVyVHlwZUZpbGVuYW1lIi8+CisKKyAgICAgICAgPG1vZHVsZSBuYW1lPSJMaW5lTGVuZ3RoIj4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXgiIHZhbHVlPSIxMzAiLz4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpZ25vcmVQYXR0ZXJuIiB2YWx1ZT0iXnBhY2thZ2UuKnxeaW1wb3J0Lip8YSBocmVmfGhyZWZ8aHR0cDovL3xodHRwczovL3xmdHA6Ly98QHNlZXwgXCogfEBsaW5rfFRPRE98QHRvZG98QHZlcnNpb24iLz4KKyAgICAgICAgPC9tb2R1bGU+CisKKyAgICAgICAgPG1vZHVsZSBuYW1lPSJBdm9pZFN0YXJJbXBvcnQiLz4KKyAgICAgICAgPCEtLTxtb2R1bGUgbmFtZT0iVW51c2VkSW1wb3J0cyIvPi0tPgorCisgICAgICAgIDxtb2R1bGUgbmFtZT0iT25lVG9wTGV2ZWxDbGFzcyIvPgorICAgICAgICA8bW9kdWxlIG5hbWU9Ik5vTGluZVdyYXAiLz4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJNZXRob2RQYXJhbVBhZCIvPgorICAgICAgICA8bW9kdWxlIG5hbWU9Ik5vV2hpdGVzcGFjZUFmdGVyIi8+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iTm9XaGl0ZXNwYWNlQmVmb3JlIi8+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iT3BlcmF0b3JXcmFwIi8+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iUGFyZW5QYWQiLz4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJUeXBlY2FzdFBhcmVuUGFkIi8+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iV2hpdGVzcGFjZUFmdGVyIi8+CisKKyAgICAgICAgPG1vZHVsZSBuYW1lPSJFbXB0eUJsb2NrIj4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvcHRpb24iIHZhbHVlPSJURVhUIi8+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idG9rZW5zIiB2YWx1ZT0iTElURVJBTF9UUlksIExJVEVSQUxfRklOQUxMWSwgTElURVJBTF9JRiwgTElURVJBTF9FTFNFLCBMSVRFUkFMX1NXSVRDSCIvPgorICAgICAgICA8L21vZHVsZT4KKworICAgICAgICA8bW9kdWxlIG5hbWU9Ik5lZWRCcmFjZXMiPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFsbG93U2luZ2xlTGluZVN0YXRlbWVudCIgdmFsdWU9InRydWUiLz4KKyAgICAgICAgPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iTGVmdEN1cmx5Ij4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXhMaW5lTGVuZ3RoIiB2YWx1ZT0iMTMwIi8+CisgICAgICAgIDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlIG5hbWU9IlJpZ2h0Q3VybHkiLz4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJSaWdodEN1cmx5Ij4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvcHRpb24iIHZhbHVlPSJhbG9uZSIvPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRva2VucyIKKyAgICAgICAgICAgICAgICAgICAgdmFsdWU9IkNMQVNTX0RFRiwgTUVUSE9EX0RFRiwgQ1RPUl9ERUYsIExJVEVSQUxfRk9SLCBMSVRFUkFMX1dISUxFLCBMSVRFUkFMX0RPLCBTVEFUSUNfSU5JVCwgSU5TVEFOQ0VfSU5JVCIvPgorICAgICAgICA8L21vZHVsZT4KKworICAgICAgICA8bW9kdWxlIG5hbWU9IldoaXRlc3BhY2VBcm91bmQiPgorICAgICAgICAgICAgPCEtLSBSZW1vdmVkIHN0YXRpYyBpbml0aWFsaXplciBpc3N1ZXM6IFJDVVJMWSwgU0xJU1QgLS0+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idG9rZW5zIgorICAgICAgICAgICAgICAgICAgICAgdmFsdWU9IkFTU0lHTiwgQkFORCwgQkFORF9BU1NJR04sIEJPUiwgQk9SX0FTU0lHTiwgQlNSLCBCU1JfQVNTSUdOLCBCWE9SLCBCWE9SX0FTU0lHTiwgQ09MT04sIERJViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBESVZfQVNTSUdOLCBET19XSElMRSwgRVFVQUwsIEdFLCBHVCwgTEFORCwgTENVUkxZLCBMRSwgTElURVJBTF9BU1NFUlQsIExJVEVSQUxfQ0FUQ0gsIExJVEVSQUxfRE8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElURVJBTF9FTFNFLCBMSVRFUkFMX0ZJTkFMTFksIExJVEVSQUxfRk9SLCBMSVRFUkFMX0lGLCBMSVRFUkFMX1JFVFVSTiwgTElURVJBTF9TV0lUQ0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElURVJBTF9TWU5DSFJPTklaRUQsIExJVEVSQUxfVFJZLCBMSVRFUkFMX1dISUxFLCBMT1IsIExULCBNSU5VUywgTUlOVVNfQVNTSUdOLCBNT0QsIE1PRF9BU1NJR04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTk9UX0VRVUFMLCBQTFVTLCBQTFVTX0FTU0lHTiwgUVVFU1RJT04sIFNMLCBTTF9BU1NJR04sIFNSLCBTUl9BU1NJR04sIFNUQVIsIFNUQVJfQVNTSUdOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRZUEVfRVhURU5TSU9OX0FORCIvPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFsbG93RW1wdHlDb25zdHJ1Y3RvcnMiIHZhbHVlPSJ0cnVlIi8+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYWxsb3dFbXB0eU1ldGhvZHMiIHZhbHVlPSJ0cnVlIi8+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYWxsb3dFbXB0eVR5cGVzIiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFsbG93RW1wdHlMb29wcyIgdmFsdWU9InRydWUiLz4KKyAgICAgICAgICAgIDxtZXNzYWdlIGtleT0id3Mubm90Rm9sbG93ZWQiCisgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJXaGl0ZXNwYWNlQXJvdW5kOiAnJ3swfScnIGlzIG5vdCBmb2xsb3dlZCBieSB3aGl0ZXNwYWNlLiBFbXB0eSBibG9ja3MgbWF5IG9ubHkgYmUgcmVwcmVzZW50ZWQgYXMgJ3t9JyB3aGVuIG5vdCBwYXJ0IG9mIGEgbXVsdGktYmxvY2sgc3RhdGVtZW50ICg0LjEuMykiLz4KKyAgICAgICAgICAgIDxtZXNzYWdlIGtleT0id3Mubm90UHJlY2VkZWQiCisgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJXaGl0ZXNwYWNlQXJvdW5kOiAnJ3swfScnIGlzIG5vdCBwcmVjZWRlZCB3aXRoIHdoaXRlc3BhY2UuIi8+CisgICAgICAgIDwvbW9kdWxlPgorCisgICAgICAgIDxtb2R1bGUgbmFtZT0iT25lU3RhdGVtZW50UGVyTGluZSIvPgorICAgICAgICA8bW9kdWxlIG5hbWU9IkZhbGxUaHJvdWdoIi8+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iVXBwZXJFbGwiLz4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJNb2RpZmllck9yZGVyIi8+CisKKyAgICAgICAgPG1vZHVsZSBuYW1lPSJTZXBhcmF0b3JXcmFwIj4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b2tlbnMiIHZhbHVlPSJET1QiLz4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvcHRpb24iIHZhbHVlPSJubCIvPgorICAgICAgICA8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJTZXBhcmF0b3JXcmFwIj4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b2tlbnMiIHZhbHVlPSJDT01NQSIvPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im9wdGlvbiIgdmFsdWU9IkVPTCIvPgorICAgICAgICA8L21vZHVsZT4KKworICAgICAgICA8bW9kdWxlIG5hbWU9Ik5vRmluYWxpemVyIi8+CisKKyAgICAgICAgPG1vZHVsZSBuYW1lPSJHZW5lcmljV2hpdGVzcGFjZSI+CisgICAgICAgICAgICA8bWVzc2FnZSBrZXk9IndzLmZvbGxvd2VkIgorICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iR2VuZXJpY1doaXRlc3BhY2UgJyd7MH0nJyBpcyBmb2xsb3dlZCBieSB3aGl0ZXNwYWNlLiIvPgorICAgICAgICAgICAgPG1lc3NhZ2Uga2V5PSJ3cy5wcmVjZWRlZCIKKyAgICAgICAgICAgICAgICAgICAgdmFsdWU9IkdlbmVyaWNXaGl0ZXNwYWNlICcnezB9JycgaXMgcHJlY2VkZWQgd2l0aCB3aGl0ZXNwYWNlLiIvPgorICAgICAgICAgICAgPG1lc3NhZ2Uga2V5PSJ3cy5pbGxlZ2FsRm9sbG93IgorICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iR2VuZXJpY1doaXRlc3BhY2UgJyd7MH0nJyBzaG91bGQgZm9sbG93ZWQgYnkgd2hpdGVzcGFjZS4iLz4KKyAgICAgICAgICAgIDxtZXNzYWdlIGtleT0id3Mubm90UHJlY2VkZWQiCisgICAgICAgICAgICAgICAgICAgIHZhbHVlPSJHZW5lcmljV2hpdGVzcGFjZSAnJ3swfScnIGlzIG5vdCBwcmVjZWRlZCB3aXRoIHdoaXRlc3BhY2UuIi8+CisgICAgICAgIDwvbW9kdWxlPgorCisgICAgICAgIDxtb2R1bGUgbmFtZT0iQW5ub3RhdGlvbkxvY2F0aW9uIj4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b2tlbnMiIHZhbHVlPSJDTEFTU19ERUYsIElOVEVSRkFDRV9ERUYsIEVOVU1fREVGLCBNRVRIT0RfREVGLCBDVE9SX0RFRiIvPgorICAgICAgICA8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJBbm5vdGF0aW9uTG9jYXRpb24iPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRva2VucyIgdmFsdWU9IlZBUklBQkxFX0RFRiIvPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFsbG93U2FtZWxpbmVNdWx0aXBsZUFubm90YXRpb25zIiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgICA8L21vZHVsZT4KKworICAgICAgICA8IS0tIE5vIFRyYWlsaW5nIFdoaXRlc3BhY2VzLiAtLT4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJSZWdleHBTaW5nbGVsaW5lSmF2YSI+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZm9ybWF0IiB2YWx1ZT0iWyBdKyQiLz4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtZXNzYWdlIiB2YWx1ZT0iRmlsZSBjb250YWlucyB0cmFpbGluZyB3aGl0ZXNwYWNlLiIvPgorICAgICAgICA8L21vZHVsZT4KKyAgICA8L21vZHVsZT4KKzwvbW9kdWxlPgpkaWZmIC0tZ2l0IGEvZXRjL2NvbmZpZy9jaGVja3N0eWxlLnhtbCBiL2V0Yy9jb25maWcvY2hlY2tzdHlsZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIyYzYxOAotLS0gL2Rldi9udWxsCisrKyBiL2V0Yy9jb25maWcvY2hlY2tzdHlsZS54bWwKQEAgLTAsMCArMSwyMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPCFET0NUWVBFIG1vZHVsZSBQVUJMSUMgIi0vL1B1cHB5IENyYXdsLy9EVEQgQ2hlY2sgQ29uZmlndXJhdGlvbiAxLjMvL0VOIiAiaHR0cDovL3d3dy5wdXBweWNyYXdsLmNvbS9kdGRzL2NvbmZpZ3VyYXRpb25fMV8zLmR0ZCI+Cis8IS0tCisgICAgVGhpcyBmaWxlIGlzIGJhc2VkIG9uIG1hdmVuLWNoZWNrc3R5bGUtcGx1Z2luIGNvbmZpZy9zdW5fY2hlY2tzLnhtbCBmaWxlLgorCisgICAgQ2hlY2tzdHlsZSBjb25maWd1cmF0aW9uIHRoYXQgY2hlY2tzIHRoZSBjb2RpbmcgY29udmVudGlvbnMgYmFzZWQgb246CisKKyAgICAgIC0gdGhlIEphdmEgTGFuZ3VhZ2UgU3BlY2lmaWNhdGlvbiBhdAorICAgICAgICBodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvaW5kZXguaHRtbAorCisgICAgICAtIHRoZSBTdW4gQ29kZSBDb252ZW50aW9ucyBhdCBodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvY29kZWNvbnYvCisKKyAgICAgIC0gdGhlIEphdmFkb2MgZ3VpZGVsaW5lcyBhdAorICAgICAgICBodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvamF2YWRvYy93cml0aW5nZG9jY29tbWVudHMvaW5kZXguaHRtbAorCisgICAgICAtIHRoZSBKREsgQXBpIGRvY3VtZW50YXRpb24gaHR0cDovL2phdmEuc3VuLmNvbS9qMnNlL2RvY3MvYXBpL2luZGV4Lmh0bWwKKworICAgICAgLSBzb21lIGN1c3RvbSByZWxheGF0aW9ucyBvZiB0aGUgcnVsZXMgYWJvdmUgJiBiZXN0IHByYWN0aWNlcworCisgICAgQ2hlY2tzdHlsZSBpcyB2ZXJ5IGNvbmZpZ3VyYWJsZS4gQmUgc3VyZSB0byByZWFkIHRoZSBkb2N1bWVudGF0aW9uIGF0CisgICAgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0IChvciBpbiB5b3VyIGRvd25sb2FkZWQgZGlzdHJpYnV0aW9uKS4KKworICAgIE1vc3QgQ2hlY2tzIGFyZSBjb25maWd1cmFibGUsIGJlIHN1cmUgdG8gY29uc3VsdCB0aGUgZG9jdW1lbnRhdGlvbi4KKyAgICBUbyBjb21wbGV0ZWx5IGRpc2FibGUgYSBjaGVjaywganVzdCBjb21tZW50IGl0IG91dCBvciBkZWxldGUgaXQgZnJvbSB0aGUgZmlsZS4KKyAgICBGaW5hbGx5LCBpdCBpcyB3b3J0aCByZWFkaW5nIHRoZSBkb2N1bWVudGF0aW9uLgorLS0+CisKKzxtb2R1bGUgbmFtZT0iQ2hlY2tlciI+CisgICAgPCEtLQorICAgICAgICBJZiB5b3Ugc2V0IHRoZSBiYXNlZGlyIHByb3BlcnR5IGJlbG93LCB0aGVuIGFsbCByZXBvcnRlZCBmaWxlCisgICAgICAgIG5hbWVzIHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlIHNwZWNpZmllZCBkaXJlY3RvcnkuIFNlZQorICAgICAgICBodHRwOi8vY2hlY2tzdHlsZS5zb3VyY2Vmb3JnZS5uZXQvNS54L2NvbmZpZy5odG1sI0NoZWNrZXIKKworICAgICAgICA8cHJvcGVydHkgbmFtZT0iYmFzZWRpciIgdmFsdWU9IiR7YmFzZWRpcn0iLz4KKyAgICAtLT4KKyAgICA8cHJvcGVydHkgbmFtZT0iY2hhcnNldCIgdmFsdWU9IlVURi04Ii8+CisKKyAgICA8IS0tIENoZWNrcyB0aGF0IGVhY2ggSmF2YSBwYWNrYWdlIGhhcyBhIEphdmFkb2MgZmlsZSB1c2VkIGZvciBjb21tZW50aW5nLiAtLT4KKyAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX2phdmFkb2MuaHRtbCNKYXZhZG9jUGFja2FnZSAgICAgICAtLT4KKyAgICA8bW9kdWxlIG5hbWU9IkphdmFkb2NQYWNrYWdlIiAvPgorCisgICAgPCEtLSBDaGVja3Mgd2hldGhlciBmaWxlcyBlbmQgd2l0aCBhIG5ldyBsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfbWlzYy5odG1sI05ld2xpbmVBdEVuZE9mRmlsZSAtLT4KKyAgICA8bW9kdWxlIG5hbWU9Ik5ld2xpbmVBdEVuZE9mRmlsZSIgLz4KKworICAgIDwhLS0gQ2hlY2tzIHRoYXQgcHJvcGVydHkgZmlsZXMgY29udGFpbiB0aGUgc2FtZSBrZXlzLiAgICAgICAgIC0tPgorICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfbWlzYy5odG1sI1RyYW5zbGF0aW9uIC0tPgorICAgIDxtb2R1bGUgbmFtZT0iVHJhbnNsYXRpb24iLz4KKworICAgIDxtb2R1bGUgbmFtZT0iRmlsZUxlbmd0aCIvPgorCisgICAgPCEtLSBGb2xsb3dpbmcgaW50ZXJwcmV0cyB0aGUgaGVhZGVyIGZpbGUgYXMgcmVndWxhciBleHByZXNzaW9ucy4gLS0+CisgICAgPCEtLSA8bW9kdWxlIG5hbWU9IlJlZ2V4cEhlYWRlciIvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisKKyAgICA8IS0tIFByZXNlbnQgaW4gY2hlY2tzdHlsZS12ZXJpZnkueG1sIC0tPgorICAgIDwhLS08bW9kdWxlIG5hbWU9IkZpbGVUYWJDaGFyYWN0ZXIiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZWFjaExpbmUiIHZhbHVlPSJ0cnVlIi8+CisgICAgPC9tb2R1bGU+LS0+CisKKyAgICA8IS0tIFByZXNlbnQgaW4gY2hlY2tzdHlsZS12ZXJpZnkueG1sIC0tPgorICAgIDwhLS08bW9kdWxlIG5hbWU9IlJlZ2V4cFNpbmdsZWxpbmUiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iZm9ybWF0IiB2YWx1ZT0iXFMrXHMrJCIvPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWVzc2FnZSIgdmFsdWU9Ik5vbi1lbXB0eSBsaW5lIGhhcyB0cmFpbGluZyBzcGFjZXMuIi8+CisgICAgPC9tb2R1bGU+LS0+CisKKyAgICA8bW9kdWxlIG5hbWU9IlRyZWVXYWxrZXIiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iY2FjaGVGaWxlIiB2YWx1ZT0iJHtjaGVja3N0eWxlLmNhY2hlLmZpbGV9Ii8+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0YWJXaWR0aCIgdmFsdWU9IjQiLz4KKworICAgICAgICA8IS0tIENoZWNrcyBmb3IgSmF2YWRvYyBjb21tZW50cy4gICAgICAgICAgICAgICAgICAgICAtLT4KKyAgICAgICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19qYXZhZG9jLmh0bWwgLS0+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iSmF2YWRvY01ldGhvZCI+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ic2NvcGUiIHZhbHVlPSJwcm90ZWN0ZWQiLz4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhbGxvd1VuZGVjbGFyZWRSVEUiIHZhbHVlPSJ0cnVlIi8+CisgICAgICAgIDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlIG5hbWU9IkphdmFkb2NUeXBlIj4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzY29wZSIgdmFsdWU9InByb3RlY3RlZCIvPgorICAgICAgICA8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJKYXZhZG9jVmFyaWFibGUiPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9InNjb3BlIiB2YWx1ZT0icHJvdGVjdGVkIi8+CisgICAgICAgIDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlIG5hbWU9IkphdmFkb2NTdHlsZSIvPgorCisgICAgICAgIDwhLS0gQ2hlY2tzIGZvciBOYW1pbmcgQ29udmVudGlvbnMuICAgICAgICAgICAgICAgICAgLS0+CisgICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfbmFtaW5nLmh0bWwgLS0+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iQ29uc3RhbnROYW1lIi8+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iTG9jYWxGaW5hbFZhcmlhYmxlTmFtZSIvPgorICAgICAgICA8bW9kdWxlIG5hbWU9IkxvY2FsVmFyaWFibGVOYW1lIi8+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iTWVtYmVyTmFtZSIvPgorICAgICAgICA8bW9kdWxlIG5hbWU9Ik1ldGhvZE5hbWUiLz4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJQYWNrYWdlTmFtZSIvPgorICAgICAgICA8bW9kdWxlIG5hbWU9IlBhcmFtZXRlck5hbWUiLz4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJTdGF0aWNWYXJpYWJsZU5hbWUiLz4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJUeXBlTmFtZSIvPgorCisgICAgICAgIDwhLS0gQ2hlY2tzIGZvciBIZWFkZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgICAgICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19oZWFkZXIuaHRtbCAgIC0tPgorICAgICAgICA8IS0tIDxtb2R1bGUgbmFtZT0iSGVhZGVyIj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgICAgICAgICAgICA8IS0tIFRoZSBmb2xsb3cgcHJvcGVydHkgdmFsdWUgZGVtb25zdHJhdGVzIHRoZSBhYmlsaXR5ICAgICAtLT4KKyAgICAgICAgICAgIDwhLS0gdG8gaGF2ZSBhY2Nlc3MgdG8gQU5UIHByb3BlcnRpZXMuIEluIHRoaXMgY2FzZSBpdCB1c2VzIC0tPgorICAgICAgICAgICAgPCEtLSB0aGUgJHtiYXNlZGlyfSBwcm9wZXJ0eSB0byBhbGxvdyBDaGVja3N0eWxlIHRvIGJlIHJ1biAgLS0+CisgICAgICAgICAgICA8IS0tIGZyb20gYW55IGRpcmVjdG9yeSB3aXRoaW4gYSBwcm9qZWN0LiBTZWUgcHJvcGVydHkgICAgICAtLT4KKyAgICAgICAgICAgIDwhLS0gZXhwYW5zaW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgPCEtLSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnLmh0bWwjcHJvcGVydGllcyAgICAgICAgLS0+CisgICAgICAgICAgICA8IS0tIDxwcm9wZXJ0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgICAgICAgICAgIDwhLS0gICAgIG5hbWU9ImhlYWRlckZpbGUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgPCEtLSAgICAgdmFsdWU9IiR7YmFzZWRpcn0vamF2YS5oZWFkZXIiLz4gICAgICAgICAgICAgICAgICAgLS0+CisgICAgICAgIDwhLS0gPC9tb2R1bGU+IC0tPgorCisgICAgICAgIDwhLS0gQ2hlY2tzIGZvciBpbXBvcnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfaW1wb3J0Lmh0bWwgLS0+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iSWxsZWdhbEltcG9ydCIvPiA8IS0tIGRlZmF1bHRzIHRvIHN1bi4qIHBhY2thZ2VzIC0tPgorICAgICAgICA8IS0tIFByZXNlbnQgaW4gY2hlY2tzdHlsZS12ZXJpZnkueG1sIC0tPgorICAgICAgICA8IS0tPG1vZHVsZSBuYW1lPSJBdm9pZFN0YXJJbXBvcnQiLz4tLT4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJSZWR1bmRhbnRJbXBvcnQiLz4KKyAgICAgICAgPCEtLSBQcmVzZW50IGluIGNoZWNrc3R5bGUtdmVyaWZ5LnhtbCAtLT4KKyAgICAgICAgPCEtLTxtb2R1bGUgbmFtZT0iVW51c2VkSW1wb3J0cyIvPi0tPgorCisgICAgICAgIDwhLS0gQ2hlY2tzIGZvciBTaXplIFZpb2xhdGlvbnMuICAgICAgICAgICAgICAgICAgICAtLT4KKyAgICAgICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19zaXplcy5odG1sIC0tPgorICAgICAgICA8IS0tIFByZXNlbnQgaW4gY2hlY2tzdHlsZS12ZXJpZnkueG1sIC0tPgorICAgICAgICA8IS0tPG1vZHVsZSBuYW1lPSJMaW5lTGVuZ3RoIj4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXgiIHZhbHVlPSIxMzAiLz4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpZ25vcmVQYXR0ZXJuIiB2YWx1ZT0iQHZlcnNpb258QHNlZXxAdG9kb3xUT0RPIi8+CisgICAgICAgIDwvbW9kdWxlPi0tPgorICAgICAgICA8bW9kdWxlIG5hbWU9Ik1ldGhvZExlbmd0aCIvPgorICAgICAgICA8bW9kdWxlIG5hbWU9IlBhcmFtZXRlck51bWJlciIvPgorCisgICAgICAgIDwhLS0gQ2hlY2tzIGZvciB3aGl0ZXNwYWNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICAgICAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX3doaXRlc3BhY2UuaHRtbCAtLT4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJFbXB0eUZvckl0ZXJhdG9yUGFkIi8+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iT3BlcmF0b3JXcmFwIi8+CisgICAgICAgIDwhLS0gUHJlc2VudCBpbiBjaGVja3N0eWxlLXZlcmlmeS54bWwgLS0+CisgICAgICAgIDwhLS08bW9kdWxlIG5hbWU9Ik1ldGhvZFBhcmFtUGFkIi8+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iTm9XaGl0ZXNwYWNlQWZ0ZXIiLz4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJOb1doaXRlc3BhY2VCZWZvcmUiLz4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJQYXJlblBhZCIvPgorICAgICAgICA8bW9kdWxlIG5hbWU9IlR5cGVjYXN0UGFyZW5QYWQiLz4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJXaGl0ZXNwYWNlQWZ0ZXIiLz4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJXaGl0ZXNwYWNlQXJvdW5kIj4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhbGxvd0VtcHR5Q29uc3RydWN0b3JzIiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgICA8L21vZHVsZT4tLT4KKworICAgICAgICA8IS0tIE1vZGlmaWVyIENoZWNrcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICAgICAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX21vZGlmaWVycy5odG1sIC0tPgorICAgICAgICA8IS0tPG1vZHVsZSBuYW1lPSJNb2RpZmllck9yZGVyIi8+LS0+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iUmVkdW5kYW50TW9kaWZpZXIiLz4KKworICAgICAgICA8IS0tIENoZWNrcyBmb3IgYmxvY2tzLiBZb3Uga25vdywgdGhvc2Uge30ncyAgICAgICAgIC0tPgorICAgICAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX2Jsb2Nrcy5odG1sIC0tPgorICAgICAgICA8bW9kdWxlIG5hbWU9IkF2b2lkTmVzdGVkQmxvY2tzIi8+CisgICAgICAgIDwhLS0gUHJlc2VudCBpbiBjaGVja3N0eWxlLXZlcmlmeS54bWwgLS0+CisgICAgICAgIDwhLS08bW9kdWxlIG5hbWU9IkVtcHR5QmxvY2siLz4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJMZWZ0Q3VybHkiLz4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJOZWVkQnJhY2VzIi8+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iUmlnaHRDdXJseSIvPi0tPgorCisgICAgICAgIDwhLS0gQ2hlY2tzIGZvciBjb21tb24gY29kaW5nIHByb2JsZW1zICAgICAgICAgICAgICAgLS0+CisgICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfY29kaW5nLmh0bWwgLS0+CisgICAgICAgIDwhLS0gbW9kdWxlIG5hbWU9IkF2b2lkSW5saW5lQ29uZGl0aW9uYWxzIi8tLT4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJFbXB0eVN0YXRlbWVudCIvPgorICAgICAgICA8bW9kdWxlIG5hbWU9IkVxdWFsc0hhc2hDb2RlIi8+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iSGlkZGVuRmllbGQiPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Imlnbm9yZUNvbnN0cnVjdG9yUGFyYW1ldGVyIiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Imlnbm9yZVNldHRlciIgdmFsdWU9InRydWUiLz4KKyAgICAgICAgPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iSWxsZWdhbEluc3RhbnRpYXRpb24iLz4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJJbm5lckFzc2lnbm1lbnQiLz4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJNYWdpY051bWJlciI+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iaWdub3JlSGFzaENvZGVNZXRob2QiIHZhbHVlPSJ0cnVlIi8+CisgICAgICAgIDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlIG5hbWU9Ik1pc3NpbmdTd2l0Y2hEZWZhdWx0Ii8+CisKKyAgICAgICAgPCEtLSBUT0RPOiBJZ25vcmluZyBtb2R1bGUgdW50aWwgdGhpcyBidWcgaXMgcmVzb2x2ZWQ6IGh0dHBzOi8vamlyYS5jb2RlaGF1cy5vcmcvYnJvd3NlL01DSEVDS1NUWUxFLTI3MSAtLT4KKyAgICAgICAgPCEtLTxtb2R1bGUgbmFtZT0iUmVkdW5kYW50VGhyb3dzIj4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhbGxvd1VuY2hlY2tlZCIgdmFsdWU9InRydWUiLz4KKyAgICAgICAgPC9tb2R1bGU+LS0+CisKKyAgICAgICAgPG1vZHVsZSBuYW1lPSJSZWR1bmRhbnRNb2RpZmllciI+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idG9rZW5zIiB2YWx1ZT0iSU5URVJGQUNFX0RFRiIvPgorICAgICAgICA8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJTaW1wbGlmeUJvb2xlYW5FeHByZXNzaW9uIi8+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iU2ltcGxpZnlCb29sZWFuUmV0dXJuIi8+CisKKyAgICAgICAgPCEtLSBDaGVja3MgZm9yIGNsYXNzIGRlc2lnbiAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgICAgICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19kZXNpZ24uaHRtbCAtLT4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJEZXNpZ25Gb3JFeHRlbnNpb24iLz4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJGaW5hbENsYXNzIi8+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iSGlkZVV0aWxpdHlDbGFzc0NvbnN0cnVjdG9yIi8+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iSW50ZXJmYWNlSXNUeXBlIi8+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iVmlzaWJpbGl0eU1vZGlmaWVyIi8+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iVGhyb3dzQ291bnQiPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1heCIgdmFsdWU9IjMiLz4KKyAgICAgICAgPC9tb2R1bGU+CisKKyAgICAgICAgPCEtLSBNaXNjZWxsYW5lb3VzIG90aGVyIGNoZWNrcy4gICAgICAgICAgICAgICAgICAgLS0+CisgICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfbWlzYy5odG1sIC0tPgorICAgICAgICA8bW9kdWxlIG5hbWU9IkFycmF5VHlwZVN0eWxlIi8+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iRmluYWxQYXJhbWV0ZXJzIi8+CisgICAgICAgIDxtb2R1bGUgbmFtZT0iVG9kb0NvbW1lbnQiLz4KKyAgICAgICAgPCEtLSBQcmVzZW50IGluIGNoZWNrc3R5bGUtdmVyaWZ5LnhtbCAtLT4KKyAgICAgICAgPCEtLTxtb2R1bGUgbmFtZT0iVXBwZXJFbGwiLz4tLT4KKyAgICA8L21vZHVsZT4KKzwvbW9kdWxlPgpkaWZmIC0tZ2l0IGEvZXRjL2NvbmZpZy9jb3B5cmlnaHQtZXhjbHVkZSBiL2V0Yy9jb25maWcvY29weXJpZ2h0LWV4Y2x1ZGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVjMjVlZAotLS0gL2Rldi9udWxsCisrKyBiL2V0Yy9jb25maWcvY29weXJpZ2h0LWV4Y2x1ZGUKQEAgLTAsMCArMSw3OSBAQAorLmFwdAorLmFyZ3MKKy5idW5kbGUKKy5jbGFzcworLmV4ZQorLmdpZgorLmdpdGlnbm9yZQorLmljbworLmltbAorLmlwcgorLml3cworLmphcgorLmprcworLmpwZworLmpzCisuanNvbgorLm1tCisub2RzCisucG5nCisucHJvamVjdAorLnNxbAorLnN2ZworLndhcgorLnppcAorLmRhdAorLmx1YQorL2RvY3Mvc3JjL21haW4vZG9jYm9vay9pbmMvbW9kdWxlc190YWJsZV9mb290ZXIuc3JjCisvZG9jcy9zcmMvbWFpbi9kb2Nib29rL2luYy9tb2R1bGVzX3RhYmxlX2hlYWRlci5zcmMKKy9kb2NzL3NyYy9tYWluL2RvY2Jvb2svaW5jL21vZHVsZXNfdGFibGVfcm93LnNyYworamF4Yi5pbmRleAorL01BTklGRVNULk1GCisvTUVUQS1JTkYvc2VydmljZXMvCisvUkVBRE1FCisvR292ZXJuYW5jZVBvbGljeS5tZAorL2V0Yy9qZXJzZXktMS1taWdyYXRlZC10ZXN0cworL2V0Yy9jb25maWcvY29weXJpZ2h0LWV4Y2x1ZGUKKy9ldGMvY29uZmlnL2NvcHlyaWdodC50eHQKKy9MSUNFTlNFLm1kCisvdGhpcmQtcGFydHktbGljZW5zZS1yZWFkbWUudHh0CituYi1jb25maWd1cmF0aW9uLnhtbAorL2FyY2hldHlwZS1yZXNvdXJjZXMvCitjbGllbnQuY2VydAora2V5c3RvcmVfY2xpZW50CitrZXlzdG9yZV9zZXJ2ZXIKK3NlcnZlci5jZXJ0Cit0cnVzdHN0b3JlX2NsaWVudAordHJ1c3RzdG9yZV9zZXJ2ZXIKK2tleXN0b3JlLWNsaWVudAora2V5c3RvcmUtbG9jYWxob3N0LXNlcnZlcgora2V5c3RvcmUtZXhhbXBsZV9jb20tc2VydmVyCit0cnVzdHN0b3JlLWV4YW1wbGVfY29tLWNsaWVudAordHJ1c3RzdG9yZS1sb2NhbGhvc3QtY2xpZW50Cit0cnVzdHN0b3JlLXNlcnZlcgorL2V4YW1wbGVzL3JlbG9hZC9yZXNvdXJjZXMKKy9jb3JlLXNlcnZlci9ldGMKK2Jvb3RzdHJhcAorYnVpbGQucmVhZG1lCisvdGVzdHMvZTJlL2VudGl0eS9tdWx0aXBhcnQtdGVzdGNhc2UudHh0CisvdGVzdHMvZTJlL3NlcnZlci9tdmMvTXZjRW5jb2RpbmdUZXN0L0ZyZWVtYXJrZXJSZXNvdXJjZS5mdGwKKy90ZXN0cy9lMmUvc2VydmVyL212Yy9NdmNFbmNvZGluZ1Rlc3QvTXVzdGFjaGVSZXNvdXJjZS5tdXN0YWNoZQorL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9jb25maWcvamF4cnMtY29tcG9uZW50cworL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkveHhlLnR4dAorL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvY29tL3N1bi9yZXNlYXJjaC93cy93YWRsCisvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9qc3IxNjYKKy90ZXN0cy9wZXJmb3JtYW5jZS9ldGMvZGF0YS9NRUFTVVJFTUVOVF9EQVRBCisvY29yZS1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbnRlcm5hbC9ndWF2YS8KKy9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL2NvcmUvQWJzdHJhY3RTbGlkaW5nV2luZG93VGltZVJlc2Vydm9pci5qYXZhCisvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvaW50ZXJuYWwvbW9uaXRvcmluZy9jb3JlL0Fic3RyYWN0VGltZVNuYXBzaG90LmphdmEKKy9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL2NvcmUvUmVzZXJ2b2lyQ29uc3RhbnRzLmphdmEKKy9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL2NvcmUvU2xpZGluZ1dpbmRvd1RyaW1tZXIuamF2YQorL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3JpbmcvY29yZS9UaW1lUmVzZXJ2b2lyLmphdmEKKy9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL2NvcmUvVW5pZm9ybVRpbWVSZXNlcnZvaXIuamF2YQorL2NvcmUtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3JpbmcvY29yZS9Vbmlmb3JtVGltZVNuYXBzaG90LmphdmEKKy9jb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL2NvcmUvVW5pZm9ybVRpbWVWYWx1ZXNTbmFwc2hvdC5qYXZhCisvY29yZS1zZXJ2ZXIvc3JjL21haW4vamF2YS9qZXJzZXkvcmVwYWNrYWdlZAorL21lZGlhL2pzb24tamFja3Nvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2phY2tzb24vaW50ZXJuYWwvamFja3NvbgorL2V4YW1wbGVzL2JlYW4tdmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vd2ViYXBwL2ZvbnRzCisvTUVUQS1JTkYvTk9USUNFLm1kCitOT1RJQ0UubWQKZGlmZiAtLWdpdCBhL2V0Yy9jb25maWcvY29weXJpZ2h0LnR4dCBiL2V0Yy9jb25maWcvY29weXJpZ2h0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzM0N2I2Ci0tLSAvZGV2L251bGwKKysrIGIvZXRjL2NvbmZpZy9jb3B5cmlnaHQudHh0CkBAIC0wLDAgKzEsMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIFlZWVkgT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCmRpZmYgLS1naXQgYS9ldGMvY29uZmlnL2ZpbmRidWdzLWV4Y2x1ZGUueG1sIGIvZXRjL2NvbmZpZy9maW5kYnVncy1leGNsdWRlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODY1YTk0Ci0tLSAvZGV2L251bGwKKysrIGIvZXRjL2NvbmZpZy9maW5kYnVncy1leGNsdWRlLnhtbApAQCAtMCwwICsxLDEyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8IS0tCisgIENvbmZpZ3VyYXRpb24gZmlsZSBmb3IgRmluZEJ1Z3MgZXhjbHVzaW9uIGZpbHRlci4KKworICBXaGVuIGEgZmlsZSwgY2xhc3Mgb3IgcnVsZSAoZGV0ZWN0b3IpIGlzIG1hdGNoZWQsIGl0IGlzIG5vdCByZXBvcnRlZCBhcyBhIHBvdGVudGlhbCBwcm9ibGVtIGJ5IEZpbmRCdWdzLgorCisgIE5vdGUgdGhhdCB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSBpcyBub3QgdXNlZCBieSBkZWZhdWx0IGluIHRoZSBtYXZlbiBidWlsZCAobXZuIHNpdGUpLCBhcyBGaW5kQnVncyBtYXZlbiBwbHVnaW4KKyAgaGFuZGxlcyB0aGUgcGF0aHMgYXMgcmVsYXRpdmUgdG8gYSBtb2R1bGUgcm9vdCBhbmQgd291bGQgcmVxdWlyZSB0byBoYXZlIHN1Y2ggZmlsZSBpbiBlYWNoIG1vZHVsZSBzZXBhcmF0ZWx5LgorICBUbyB1c2UgdGhpcyBleGNsdXNpb24gY29uZmlndXJhdGlvbiwgcnVuIGJ1aWxkIHdpdGg6CisgIG12biBzaXRlIC1EZmluZGJ1Z3MuZXhjbHVkZT1bamVyc2V5X3Byb2plY3Rfcm9vdF0vZXRjL2NvbmZpZy9maW5kYnVncy1leGNsdWRlLnhtbAorICAtLT4KKzxGaW5kQnVnc0ZpbHRlcj4KKyAgICA8IS0tIHNraXAgRmluZEJ1Z3MgYW5hbHlzaXMgaW4gZXhhbXBsZXMgLS0+CisgICAgPE1hdGNoPgorICAgICAgICA8UGFja2FnZSBuYW1lPSJ+b3JnXC5nbGFzc2Zpc2hcLmplcnNleVwuZXhhbXBsZXMuKiIgLz4KKyAgICA8L01hdGNoPgorCisgICAgPCEtLSBza2lwIEZpbmRCdWdzIGFuYWx5c2lzIGluIHRlc3RzIC0tPgorICAgIDxNYXRjaD4KKyAgICAgICAgPFBhY2thZ2UgbmFtZT0ifm9yZ1wuZ2xhc3NmaXNoXC5qZXJzZXlcLnRlc3RzLioiIC8+CisgICAgPC9NYXRjaD4KKyAgICA8TWF0Y2g+CisgICAgICAgIDxDbGFzcyBuYW1lPSJ+LipcLipUZXN0IiAvPgorICAgIDwvTWF0Y2g+CisKKyAgICA8IS0tIHNraXAgYW5hbHlzaXMgaW4gcmVwYWNrYWdlZCBsaWJyYXJpZXMgLS0+CisgICAgPE1hdGNoPgorICAgICAgICA8UGFja2FnZSBuYW1lPSJ+amVyc2V5XC5yZXBhY2thZ2VkLioiIC8+CisgICAgPC9NYXRjaD4KKworICAgIDwhLS0gc2tpcCBhbmFseXNpcyBpbiB0aGUgc3BlYyBwYWNrYWdlIC0tPgorICAgIDxNYXRjaD4KKyAgICAgICAgPFBhY2thZ2UgbmFtZT0ifmphdmF4XC53c1wucnMuKiIgLz4KKyAgICA8L01hdGNoPgorCisgICAgPCEtLSBkbyBub3QgcmVwb3J0IGlzc3VlcyBmb3VuZCBpbiBidW5kbGVzIC0tPgorICAgIDxNYXRjaD4KKyAgICAgICAgPFNvdXJjZSBuYW1lPSJ+LipidW5kbGVzLioiIC8+CisgICAgPC9NYXRjaD4KKworICAgIDwhLS0KKyAgICBpZ25vcmUgd2FybmluZ3MgY29taW5nIGZyb20gVk9fVk9MQVRJTEVfSU5DUkVNRU5ULCB0aGVyZSBpcyBhIGtub3duIGJ1ZyB3aGljaCBjYXVzZXMgZmFsc2UgcG9zaXRpdmVzOgorICAgIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcC9maW5kYnVncy9idWdzLzEwMzIvCisgICAgLS0+CisgICAgPE1hdGNoPgorICAgICAgICA8QnVnIHBhdHRlcm49IlZPX1ZPTEFUSUxFX0lOQ1JFTUVOVCIgLz4KKyAgICA8L01hdGNoPgorCisgICAgPCEtLSBpZ25vcmUgaXJyZWxldmFudCBhZGRpdGlvbmFsIEdsYXNzRmlzaCBsb2dnaW5nIGRldGVjdG9ycyAtLT4KKyAgICA8TWF0Y2g+CisgICAgICAgIDxCdWcgcGF0dGVybj0iR0ZfSU5WQUxJRF9NU0dfSURfUEFUVEVSTixHRl9NSVNTSU5HX0xPR0dFUl9JTkZPX0FOTk9UQVRJT04sR0ZfTUlTU0lOR19MT0dNRVNTQUdFX0lORk9fQU5OT1RBVElPTiIgLz4KKyAgICA8L01hdGNoPgorCisgICAgPCEtLSBpbmRpdmlkdWFsIGFkLWhvYyBpZ25vcmVzIC0tPgorICAgIDwhLS0gU2VydmVyU2NvcGVQcm92aWRlci5nZXRGaWx0ZXJpbmdTY29wZXMoKSAtIHJldHVybmVkIG9iamVjdCB3b3VsZCBiZSBpZGVudGljYWwgLS0+CisgICAgPE1hdGNoPgorICAgICAgICA8Q2xhc3MgbmFtZT0ib3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuU2VydmVyU2NvcGVQcm92aWRlciIgLz4KKyAgICAgICAgPE1ldGhvZCBuYW1lPSJnZXRGaWx0ZXJpbmdTY29wZXMiIC8+CisgICAgICAgIDxCdWcgcGF0dGVybj0iUlZfUkVUVVJOX1ZBTFVFX09GX1BVVElGQUJTRU5UX0lHTk9SRUQiIC8+CisgICAgPC9NYXRjaD4KKworICAgIDwhLS0gdXNlZCBhcyBmYWxsYmFjaywgY2FuIGJlIGlnbm9yZWQgaGVyZSAtLT4KKyAgICA8TWF0Y2g+CisgICAgICAgIDxCdWcgcGF0dGVybj0iRE1fREVGQVVMVF9FTkNPRElORyIgLz4KKyAgICAgICAgPENsYXNzIG5hbWU9In4uKi5CYXNlNjQiIC8+CisgICAgPC9NYXRjaD4KKworICAgIDwhLS0gVGhlcmUgYXJlIGZldyBjYXNlcyBpbiB0aGUgY29kZWJhc2UgLS0+CisgICAgPE1hdGNoPgorICAgICAgICA8QnVnIHBhdHRlcm49IkNOX0lNUExFTUVOVFNfQ0xPTkVfQlVUX05PVF9DTE9ORUFCTEUiIC8+CisgICAgPC9NYXRjaD4KKworICAgIDxNYXRjaD4KKyAgICAgICAgPEJ1ZyBwYXR0ZXJuPSJSRUNfQ0FUQ0hfRVhDRVBUSU9OIiAvPgorICAgICAgICA8Q2xhc3MgbmFtZT0ifi4qLlZmc1NjaGVtZVJlc291cmNlRmluZGVyRmFjdG9yeSIgLz4KKyAgICA8L01hdGNoPgorCisgICAgPCEtLSBUT0RPcyAtIHRob3NlIGFyZSB0aGUgRmluZEJ1Z3Mgd2FybmluZ3Mgbm90IHJlc29sdmVkIHlldCAtLT4KKyAgICA8IS0tIFRob3NlIGV4Y2x1c2lvbnMgc2hvdWxkIGVpdGhlciBiZSBmaXhlZCBvciwgYWZ0ZXIgZXZhbHVhdGlvbiBtb3ZlZCBvdXRzaWRlIG9mIHRoaXMgIlRPRE8iIHNlY3Rpb24gLS0+CisgICAgPE1hdGNoPgorICAgICAgICA8QnVnIHBhdHRlcm49IkRNX0RFRkFVTFRfRU5DT0RJTkciIC8+CisgICAgICAgIDxPcj4KKyAgICAgICAgICAgIDxDbGFzcyBuYW1lPSJ+LiouQWJzdHJhY3RUZW1wbGF0ZVByb2Nlc3NvciIgLz4KKyAgICAgICAgICAgIDxDbGFzcyBuYW1lPSJ+LiouSG1hU2hhMU1ldGhvZCIgLz4KKyAgICAgICAgICAgIDxDbGFzcyBuYW1lPSJ+LiouUnNhU2hhMU1ldGhvZCIgLz4KKyAgICAgICAgICAgIDxDbGFzcyBuYW1lPSJ+LiouQ29uc3VtZXJDcmVkZW50aWFscyIgLz4KKyAgICAgICAgICAgIDxDbGFzcyBuYW1lPSJ+LiouQWNjZXNzVG9rZW4iIC8+CisgICAgICAgICAgICA8Q2xhc3MgbmFtZT0ifi4qLkNsaWVudElkZW50aWZpZXIiIC8+CisgICAgICAgICAgICA8Q2xhc3MgbmFtZT0ifi4qLkNodW5rZWRJbnB1dCIgLz4KKyAgICAgICAgICAgIDxDbGFzcyBuYW1lPSJ+LiouQ2h1bmtlZE91dHB1dCIgLz4KKyAgICAgICAgPC9Pcj4KKyAgICA8L01hdGNoPgorCisgICAgPE1hdGNoPgorICAgICAgICA8Q2xhc3MgbmFtZT0ib3JnLmdsYXNzZmlzaC5qZXJzZXkuYXBhY2hlLmNvbm5lY3Rvci5BcGFjaGVDb25uZWN0b3IiIC8+CisgICAgPC9NYXRjaD4KKworICAgIDwhLS0gQ0RJIGV4dGVuc2lvbiBvYnNlcnZlciBtZXRob2RzIGFyZSBjYWxsZWQgYnkgQ0RJIGJlYW4gbWFuYWdlciBhdCBydW50aW1lIC0tPgorICAgIDxNYXRjaD4KKyAgICAgICAgPENsYXNzIG5hbWU9Im9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkxeC5pbnRlcm5hbC5DZGlDb21wb25lbnRQcm92aWRlciIgLz4KKyAgICAgICAgPEJ1ZyBwYXR0ZXJuPSJVUE1fVU5DQUxMRURfUFJJVkFURV9NRVRIT0QiIC8+CisgICAgICAgIDxPcj4KKyAgICAgICAgICA8TWV0aG9kIG5hbWU9InByb2Nlc3NBbm5vdGF0ZWRUeXBlIiAvPgorICAgICAgICAgIDxNZXRob2QgbmFtZT0iYWZ0ZXJUeXBlRGlzY292ZXJ5IiAvPgorICAgICAgICAgIDxNZXRob2QgbmFtZT0iYmVmb3JlVHlwZURpc2NvdmVyeSIgLz4KKyAgICAgICAgICA8TWV0aG9kIG5hbWU9InByb2Nlc3NJbmplY3Rpb25UYXJnZXQiIC8+CisgICAgICAgICAgPE1ldGhvZCBuYW1lPSJhZnRlckRpc2NvdmVyeU9ic2VydmVyIiAvPgorICAgICAgICA8L09yPgorICAgIDwvTWF0Y2g+CisKKzwvRmluZEJ1Z3NGaWx0ZXI+CmRpZmYgLS1naXQgYS9ldGMvaHVkc29uL1JFQURNRSBiL2V0Yy9odWRzb24vUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMTMxMmIKLS0tIC9kZXYvbnVsbAorKysgYi9ldGMvaHVkc29uL1JFQURNRQpAQCAtMCwwICsxIEBACitGb2xkZXIgY29udGFpbmluZyBhbGwgSHVkc29uIHNjcmlwdHMuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXRjL2plcnNleS0xLW1pZ3JhdGVkLXRlc3RzIGIvZXRjL2plcnNleS0xLW1pZ3JhdGVkLXRlc3RzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NDllOWUKLS0tIC9kZXYvbnVsbAorKysgYi9ldGMvamVyc2V5LTEtbWlncmF0ZWQtdGVzdHMKQEAgLTAsMCArMSwzMzUgQEAKK1RPRE8gLSBGSVJTVDoKKworamVyc2V5LXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvaW1wbC9odHRwL2hlYWRlci9wcm92aWRlci9CZWFuVGVzdC5qYXZhCitqZXJzZXktdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9pbXBsL2h0dHAvaGVhZGVyL3Byb3ZpZGVyL1RvU3RyaW5nSGVhZGVyVGVzdC5qYXZhCitqZXJzZXktdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9pbXBsL2luamVjdC9JbmplY3RQYXJhbUFubm90YXRpb25JbmplY3RhYmxlVGVzdC5qYXZhCitqZXJzZXktdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9pbXBsL2luamVjdC9Jb0NDb21wb25lbnRQcm9jZXNzb3JUZXN0LmphdmEKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvaW5qZWN0L0pBWEJDb250ZXh0UmVzb2x2ZXJUZXN0LmphdmEKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvaW5qZWN0L092ZXJyaWRlRmllbGRUZXN0LmphdmEKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvaW5qZWN0L092ZXJyaWRlSW5qZWN0YWJsZVRlc3QuamF2YQoramVyc2V5LXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvaW1wbC9pbmplY3QvUGFyZW50UmVmQW5ub3RhdGlvbkluamVjdGFibGVUZXN0LmphdmEKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvaW5qZWN0L1Byb3ZpZGVyUmVzb3VyY2VSZWZUZXN0LmphdmEKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvaW5qZWN0L1Jlc291cmNlTWV0aG9kQ3VzdG9tSW52b2tlclRlc3QuamF2YQoramVyc2V5LXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvaW1wbC9pbmplY3QvU2V0TWV0aG9kSW5qZWN0YWJsZXNUZXN0LmphdmEKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvaW5qZWN0L1dhZGxBcHBsaWNhdGlvbkNvbnRleHRUZXN0LmphdmEKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvanNvbi9JbnRBcnJheVRlc3QuamF2YQoramVyc2V5LXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvaW1wbC9qc29uL0lzc3VlNTgxVGVzdC5qYXZhCitqZXJzZXktdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9pbXBsL2pzb24vSmFja3NvbkVtcHR5TGlzdEJlYW5UZXN0LmphdmEKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvanNvbi9KYWNrc29uTnVsbFN0cmluZ1Rlc3QuamF2YQoramVyc2V5LXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvaW1wbC9qc29uL0pTT05Gcm9tSkFYQkluaGVyaXRhbmNlVGVzdC5qYXZhCitqZXJzZXktdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9pbXBsL2pzb24vTGlzdE9mSkFYQkJlYW5UZXN0LmphdmEKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvanNvbi9OZXN0ZWRBcnJheVRlc3QuamF2YQoramVyc2V5LXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvaW1wbC9saWZlY3ljbGUvSW5zdGFudGlhdGVkV2l0aERlc3Ryb3lUZXN0LmphdmEKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvbGlmZWN5Y2xlL1Byb3ZpZGVyTGlmZWN5Y2xlVGVzdC5qYXZhCitqZXJzZXktdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9pbXBsL2xpZmVjeWNsZS9SZXNvdXJjZUxpZmVjeWNsZVRlc3QuamF2YQoramVyc2V5LXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvaW1wbC9saWZlY3ljbGUvU2luZ2xldG9uTGlmZWN5Y2xlVGVzdC5qYXZhCitqZXJzZXktdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9pbXBsL01lc3NhZ2VSQlRlc3QuamF2YQoramVyc2V5LXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvaW1wbC9PdXRCb3VuZEhlYWRlcnNUZXN0LmphdmEKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvcmVzb3VyY2UvQWNjZXB0TGFuZ3VhZ2VUZXN0LmphdmEKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvcmVzb3VyY2UvQW5ub3RhdGVkRW50aXR5VGVzdC5qYXZhCitqZXJzZXktdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9pbXBsL3Jlc291cmNlL0JlYW5XaXRoV2ViUmVzb3VyY2VUZXN0LmphdmEKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvcmVzb3VyY2UvQnl0ZUFycmF5UmVwcmVzZW50YXRpb25UZXN0LmphdmEKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvcmVzb3VyY2UvQ2xpZW50RXJyb3JUZXN0LmphdmEKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvcmVzb3VyY2UvQ29uc3RydWN0b3JQYXJhbXNUZXN0LmphdmEKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvcmVzb3VyY2UvQ29udGFpbmVySXRlbU1hdHJpeFRlc3QuamF2YQoramVyc2V5LXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvaW1wbC9yZXNvdXJjZS9Db250ZW50TGFuZ3VhZ2VUZXN0LmphdmEKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvcmVzb3VyY2UvQ29udGVudFR5cGVUZXN0LmphdmEKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvcmVzb3VyY2UvRGVmYXVsdFZhbHVlVGVzdC5qYXZhCitqZXJzZXktdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9pbXBsL3Jlc291cmNlL0VtcHR5UGF0aFNlZ1NSTVRlc3QuamF2YQoramVyc2V5LXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvaW1wbC9yZXNvdXJjZS9FbmNvZGVkVXJpVGVtcGxhdGVWYWx1ZXNUZXN0LmphdmEKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvcmVzb3VyY2UvRXhwbGljaXRSb290UmVzb3VyY2VUZXN0LmphdmEKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvcmVzb3VyY2UvRXh0ZW5kZWRVcmlJbmZvVGVzdC5qYXZhCitqZXJzZXktdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9pbXBsL3Jlc291cmNlL0dlbmVyaWNJbmhlcml0YW5jZVRlc3QuamF2YQoramVyc2V5LXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvaW1wbC9yZXNvdXJjZS9HZW5lcmljVHlwZXNUZXN0LmphdmEKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvcmVzb3VyY2UvSHR0cE1ldGhvZHNUZXN0LmphdmEKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvcmVzb3VyY2UvSHR0cFJlc3BvbnNlUmV0dXJuVGVzdC5qYXZhCitqZXJzZXktdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9pbXBsL3Jlc291cmNlL0luaGVyaXRhbmNlVGVzdC5qYXZhCitqZXJzZXktdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9pbXBsL3Jlc291cmNlL0pSZXNwb25zZVRlc3QuamF2YQoramVyc2V5LXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvaW1wbC9yZXNvdXJjZS9Mb2NhdGlvblRlc3QuamF2YQoramVyc2V5LXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvaW1wbC9yZXNvdXJjZS9NZXRob2RJQW5ub3RhdGlvbm5oZXJpdGVuY2VUZXN0LmphdmEKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvcmVzb3VyY2UvTmV3Q29va2llVGVzdC5qYXZhCitqZXJzZXktdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9pbXBsL3Jlc291cmNlL05vQ29udGVudFJlc3BvbnNlVGVzdC5qYXZhCitqZXJzZXktdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9pbXBsL3Jlc291cmNlL051bGxFbnRpdHlNZWRpYVR5cGVUZXN0LmphdmEKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvcmVzb3VyY2UvUG9zdFRlc3QuamF2YQoramVyc2V5LXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvaW1wbC9yZXNvdXJjZS9QcmVjb25kaXRpb25HZXRBbmRQdXRUZXN0LmphdmEKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvcmVzb3VyY2UvUHJlY29uZGl0aW9uVGVzdC5qYXZhCitqZXJzZXktdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9pbXBsL3Jlc291cmNlL1Byb2R1Y2VzQWNjZXB0YWJsZVRlc3QuamF2YQoramVyc2V5LXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvaW1wbC9yZXNvdXJjZS9QdXRUZXN0LmphdmEKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvcmVzb3VyY2UvUXVhbGl0eVNvdXJjZVRlc3QuamF2YQoramVyc2V5LXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvaW1wbC9yZXNvdXJjZS9SZWRpcmVjdFRvUGF0aFdpdGhTbGFzaFRlc3QuamF2YQoramVyc2V5LXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvaW1wbC9yZXNvdXJjZS9SZXByZXNlbnRhdGlvbkJlYW5UZXN0LmphdmEKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvcmVzb3VyY2UvUmVzb3VyY2VFeGNlcHRpb25UZXN0LmphdmEKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvcmVzb3VyY2UvUmVzb3VyY2VNZXRob2REaXNwYXRjaEFkYXB0ZXJUZXN0LmphdmEKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvcmVzb3VyY2UvUmVzcG9uc2VXcml0ZXJBbm5vdGF0aW9uVGVzdC5qYXZhCitqZXJzZXktdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9pbXBsL3Jlc291cmNlL1JldHVybk9iamVjdFRlc3QuamF2YQoramVyc2V5LXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvaW1wbC9yZXNvdXJjZS9SZXR1cm5SZXNwb25zZUhlYWRlcnNUZXN0LmphdmEKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvcmVzb3VyY2UvVGVtcGxhdGVOYW1lc0luVVJJVGVzdC5qYXZhCitqZXJzZXktdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9pbXBsL3Jlc291cmNlL1RlbXBsYXRlUGF0aFRlc3QuamF2YQoramVyc2V5LXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvaW1wbC9yZXNvdXJjZS9UZW1wUmVkaXJlY3RUZXN0LmphdmEKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvcmVzb3VyY2UvVGVybWluYXRpbmdTbGFzaFRlc3QuamF2YQoramVyc2V5LXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvaW1wbC9yZXNvdXJjZS9UeXBlUGFyYW1ldGVyVGVzdC5qYXZhCitqZXJzZXktdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9pbXBsL3Jlc291cmNlL1R5cGVSZXR1cm5UZXN0LmphdmEKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvcmVzb3VyY2UvV2ViUmVzb3JjZVdpdGhGaWVsZEluamVjdGlvblRlc3QuamF2YQoramVyc2V5LXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvaW1wbC9yZXNvdXJjZS9XZWJSZXNvcmNlV2l0aFBhcmFtZXRlckluamVjdGlvblRlc3QuamF2YQoramVyc2V5LXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvaW1wbC9yZXNvdXJjZS9XZWJSZXNvdXJjZUJlYW5UZXN0LmphdmEKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvUmVzcG9uc2VCdWlsZGVyVGVzdC5qYXZhCitqZXJzZXktdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9pbXBsL3RlbXBsYXRlL0V4Y2VwdGlvblZpZXdQcm9jZXNzb3JUZXN0LmphdmEKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvdGVtcGxhdGUvRmxhdEluaGVyaXRlZFZpZXdQcm9jZXNzb3JUZXN0LmphdmEKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvdGVtcGxhdGUvRmxhdFZpZXdQcm9jZXNzb3JUZXN0LmphdmEKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvdGVtcGxhdGUvSW1wbGljaXRQcm9kdWNlc1ZpZXdQcm9jZXNzb3JUZXN0LmphdmEKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvdGVtcGxhdGUvSW1wbGljaXRWaWV3V2l0aFJlc291cmNlRmlsdGVyVGVzdC5qYXZhCitqZXJzZXktdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9pbXBsL3RlbXBsYXRlL0luaGVyaXRlZFZpZXdQcm9jZXNzb3JUZXN0LmphdmEKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvdGVtcGxhdGUvUmVzb2x2aW5nQ2xhc3NWaWV3UHJvY2Vzc29yVGVzdC5qYXZhCitqZXJzZXktdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9pbXBsL3RlbXBsYXRlL1RlbXBsYXRlUHJvY2Vzc29yVGVzdC5qYXZhCitqZXJzZXktdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9pbXBsL3RlbXBsYXRlL1ZpZXdBbmRUZW1wbGF0ZVByb2Nlc3NvclRlc3QuamF2YQoramVyc2V5LXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvaW1wbC90ZW1wbGF0ZS9WaWV3UHJvY2Vzc29yVGVzdC5qYXZhCitqZXJzZXktdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9pbXBsL3VyaS9ydWxlcy9BdXRvbWF0YU1hdGNoaW5nVGVzdC5qYXZhCitqZXJzZXktdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9pbXBsL3VyaS9ydWxlcy9MaW5lYXJNYXRjaGluZ1Rlc3QuamF2YQoramVyc2V5LXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvaW1wbC91cmkvVXJpUGF0aEh0dHBSZXF1ZXN0VGVzdC5qYXZhCitqZXJzZXktdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9pbXBsL3V0aWwvVXJpSGVscGVyVGVzdC5qYXZhCitqZXJzZXktdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9pbXBsL3dhZGwvV2FkbEpBWEJDb250ZW50TW9kZWxUZXN0LmphdmEKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwveG1sL1htbEhlYWRlclRlc3QuamF2YQoramVyc2V5LXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvaW1wbC94bWwvWG1sTGlzdFRlc3QuamF2YQoramVyc2V5LXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvc3BpL21vbml0b3JpbmcvTW9uaXRvcmluZ1Byb3ZpZGVyVGVzdC5qYXZhCisKK29zZ2kvZnVuY3Rpb25hbC10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvZW50aXR5L0VudGl0eVR5cGVzVGVzdC5qYXZhCitvc2dpL2Z1bmN0aW9uYWwtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9vc2dpZnVuY3Rpb25hbHRlc3RzL1BhY2thZ2VTY2FubmluZ1Rlc3QuamF2YQorb3NnaS9mdW5jdGlvbmFsLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvb3NnaS90ZXN0cy9ncml6emx5L0FwcGxpY2F0aW9uUmVsb2FkUmVzb3VyY2VUZXN0LmphdmEKK29zZ2kvZnVuY3Rpb25hbC10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L29zZ2kvdGVzdHMvZ3JpenpseS9BcHBsaWNhdGlvblRlc3QuamF2YQorb3NnaS9mdW5jdGlvbmFsLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvb3NnaS90ZXN0cy9ncml6emx5L0NvbnRleHRSZWRpcmVjdGlvblRlc3QuamF2YQorb3NnaS9mdW5jdGlvbmFsLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvb3NnaS90ZXN0cy9ncml6emx5L0VzY2FwZWRVUklUZXN0LmphdmEKK29zZ2kvZnVuY3Rpb25hbC10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L29zZ2kvdGVzdHMvZ3JpenpseS9FeGNlcHRpb25UZXN0LmphdmEKK29zZ2kvZnVuY3Rpb25hbC10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L29zZ2kvdGVzdHMvZ3JpenpseS9GaXhlZFJlcXVlc3RTaXplVGVzdC5qYXZhCitvc2dpL2Z1bmN0aW9uYWwtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9vc2dpL3Rlc3RzL2dyaXp6bHkvR3JpenpseVdlYlByb3ZpZGVyTGlmZWN5Y2xlVGVzdC5qYXZhCitvc2dpL2Z1bmN0aW9uYWwtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9vc2dpL3Rlc3RzL2dyaXp6bHkvR1pJUENvbnRlbnRFbmNvZGluZ1Rlc3QuamF2YQorb3NnaS9mdW5jdGlvbmFsLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvb3NnaS90ZXN0cy9ncml6emx5L0hlYWRUZXN0LmphdmEKK29zZ2kvZnVuY3Rpb25hbC10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L29zZ2kvdGVzdHMvZ3JpenpseS9IdHRwTWV0aG9kV2l0aENsaWVudEZpbHRlclRlc3QuamF2YQorb3NnaS9mdW5jdGlvbmFsLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvb3NnaS90ZXN0cy9ncml6emx5L0luamVjdGlvblRlc3QuamF2YQorb3NnaS9mdW5jdGlvbmFsLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvb3NnaS90ZXN0cy9ncml6emx5L0xvZ2dpbmdGaWx0ZXJUZXN0LmphdmEKK29zZ2kvZnVuY3Rpb25hbC10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L29zZ2kvdGVzdHMvZ3JpenpseS9NYXRyaXhQYXJhbVRlc3QuamF2YQorb3NnaS9mdW5jdGlvbmFsLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvb3NnaS90ZXN0cy9ncml6emx5L091dHB1dFN0cmVhbVRlc3QuamF2YQorb3NnaS9mdW5jdGlvbmFsLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvb3NnaS90ZXN0cy9ncml6emx5L1F1ZXJ5UGFyYW1UZXN0LmphdmEKK29zZ2kvZnVuY3Rpb25hbC10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L29zZ2kvdGVzdHMvZ3JpenpseS9SZWxvYWRSZXNvdXJjZVRlc3QuamF2YQorb3NnaS9mdW5jdGlvbmFsLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvb3NnaS90ZXN0cy9ncml6emx5L1JlbG9hZFRlc3QuamF2YQorb3NnaS9mdW5jdGlvbmFsLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvb3NnaS90ZXN0cy9ncml6emx5L1Jlc3BvbnNlV3JpdGVyTWV0YWRhdGFUZXN0LmphdmEKK29zZ2kvZnVuY3Rpb25hbC10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L29zZ2kvdGVzdHMvZ3JpenpseS9Sb2xlc0FsbG93ZWRUZXN0LmphdmEKK29zZ2kvZnVuY3Rpb25hbC10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L29zZ2kvdGVzdHMvZ3JpenpseS9TZXJ2bGV0UmVxdWVzdFBhcmFtZXRlcnNUZXN0LmphdmEKK29zZ2kvZnVuY3Rpb25hbC10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L29zZ2kvdGVzdHMvZ3JpenpseS9TdGF0dXNDb2RlVGVzdC5qYXZhCitvc2dpL2Z1bmN0aW9uYWwtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9vc2dpL3Rlc3RzL2dyaXp6bHkvVHJhY2VUZXN0LmphdmEKK29zZ2kvZnVuY3Rpb25hbC10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L29zZ2kvdGVzdHMvamV0dHkvQXBwbGljYXRpb25SZWxvYWRSZXNvdXJjZVRlc3QuamF2YQorb3NnaS9mdW5jdGlvbmFsLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvb3NnaS90ZXN0cy9qZXR0eS9BcHBsaWNhdGlvblRlc3QuamF2YQorb3NnaS9mdW5jdGlvbmFsLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvb3NnaS90ZXN0cy9qZXR0eS9Fc2NhcGVkVVJJVGVzdC5qYXZhCitvc2dpL2Z1bmN0aW9uYWwtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9vc2dpL3Rlc3RzL2pldHR5L0V4Y2VwdGlvblRlc3QuamF2YQorb3NnaS9mdW5jdGlvbmFsLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvb3NnaS90ZXN0cy9qZXR0eS9GaXhlZFJlcXVlc3RTaXplVGVzdC5qYXZhCitvc2dpL2Z1bmN0aW9uYWwtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9vc2dpL3Rlc3RzL2pldHR5L0dyaXp6bHlXZWJQcm92aWRlckxpZmVjeWNsZVRlc3QuamF2YQorb3NnaS9mdW5jdGlvbmFsLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvb3NnaS90ZXN0cy9qZXR0eS9HWklQQ29udGVudEVuY29kaW5nVGVzdC5qYXZhCitvc2dpL2Z1bmN0aW9uYWwtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9vc2dpL3Rlc3RzL2pldHR5L0hlYWRUZXN0LmphdmEKK29zZ2kvZnVuY3Rpb25hbC10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L29zZ2kvdGVzdHMvamV0dHkvSHR0cE1ldGhvZFdpdGhDbGllbnRGaWx0ZXJUZXN0LmphdmEKK29zZ2kvZnVuY3Rpb25hbC10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L29zZ2kvdGVzdHMvamV0dHkvSW5qZWN0aW9uVGVzdC5qYXZhCitvc2dpL2Z1bmN0aW9uYWwtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9vc2dpL3Rlc3RzL2pldHR5L0xvZ2dpbmdGaWx0ZXJUZXN0LmphdmEKK29zZ2kvZnVuY3Rpb25hbC10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L29zZ2kvdGVzdHMvamV0dHkvTWF0cml4UGFyYW1UZXN0LmphdmEKK29zZ2kvZnVuY3Rpb25hbC10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L29zZ2kvdGVzdHMvamV0dHkvT3V0cHV0U3RyZWFtVGVzdC5qYXZhCitvc2dpL2Z1bmN0aW9uYWwtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9vc2dpL3Rlc3RzL2pldHR5L1F1ZXJ5UGFyYW1UZXN0LmphdmEKK29zZ2kvZnVuY3Rpb25hbC10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L29zZ2kvdGVzdHMvamV0dHkvUmVsb2FkUmVzb3VyY2VUZXN0LmphdmEKK29zZ2kvZnVuY3Rpb25hbC10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L29zZ2kvdGVzdHMvamV0dHkvUmVzcG9uc2VXcml0ZXJNZXRhZGF0YVRlc3QuamF2YQorb3NnaS9mdW5jdGlvbmFsLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvb3NnaS90ZXN0cy9qZXR0eS9Sb2xlc0FsbG93ZWRUZXN0LmphdmEKK29zZ2kvZnVuY3Rpb25hbC10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L29zZ2kvdGVzdHMvamV0dHkvU2VydmxldFJlcXVlc3RQYXJhbWV0ZXJzVGVzdC5qYXZhCitvc2dpL2Z1bmN0aW9uYWwtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9vc2dpL3Rlc3RzL2pldHR5L1N0YXR1c0NvZGVUZXN0LmphdmEKK29zZ2kvZnVuY3Rpb25hbC10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L29zZ2kvdGVzdHMvamV0dHkvVHJhY2VUZXN0LmphdmEKKworb3NnaS9ydW50aW1lLWRlbGVnYXRlLXRlc3RzL3JkLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXlvc2dpcmQvQ2xpZW50T25seVRlc3QuamF2YQorb3NnaS9ydW50aW1lLWRlbGVnYXRlLXRlc3RzL3JkLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXlvc2dpcmQvU2VydmVyQ2xpZW50TWl4ZWRDbGllbnRGaXJzdFRlc3QuamF2YQorb3NnaS9ydW50aW1lLWRlbGVnYXRlLXRlc3RzL3JkLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXlvc2dpcmQvU2VydmVyQ2xpZW50TWl4ZWRDcmVhdGVFbmRwb2ludFRlc3QuamF2YQorb3NnaS9ydW50aW1lLWRlbGVnYXRlLXRlc3RzL3JkLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXlvc2dpcmQvU2VydmVyQ2xpZW50TWl4ZWRTZXJ2ZXJGaXJzdFRlc3QuamF2YQorb3NnaS9ydW50aW1lLWRlbGVnYXRlLXRlc3RzL3JkLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXlvc2dpcmQvU2VydmVyQ2xpZW50TWl4ZWRUZXN0LmphdmEKK29zZ2kvcnVudGltZS1kZWxlZ2F0ZS10ZXN0cy9yZC10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5b3NnaXJkL1NlcnZlck9ubHlUZXN0LmphdmEKKworb3NnaS90ZXN0LWdyaXp6bHktYnVuZGxlL2dyaXp6bHktamVyc2V5LXRlc3Qvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9vc2dpL3Rlc3RzL0Jhc2ljT3NnaUludGVncmF0aW9uVGVzdC5qYXZhCisKK3Rlc3RzL2Z1bmN0aW9uYWwvYnVnLXRlc3RzL0plcnNleUlzc3VlNDgvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9xZS90ZXN0cy9idWd0ZXN0cy9Jc3N1ZTQ4Rml4VGVzdC5qYXZhCit0ZXN0cy9mdW5jdGlvbmFsL2J1Zy10ZXN0cy9KZXJzZXlJc3N1ZTUxL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvcWUvdGVzdHMvYnVndGVzdHMvSXNzdWU1MUZpeFRlc3QuamF2YQordGVzdHMvZnVuY3Rpb25hbC9jb3JlLXRlc3RzL2NvcmV0ZXN0MS9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L3FlL3Rlc3RzL2NvcmUvTXlSZXNvdXJjZVRlc3QuamF2YQordGVzdHMvZnVuY3Rpb25hbC9jb3JlLXRlc3RzL2NvcmV0ZXN0Mi9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L3FlL3Rlc3RzL2NvcmUvTXlSZXNvdXJjZVRlc3QuamF2YQordGVzdHMvZnVuY3Rpb25hbC9jb3JlLXRlc3RzL2NvcmV0ZXN0My9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L3FlL3Rlc3RzL2NvcmUvTXlSZXNvdXJjZVRlc3QuamF2YQordGVzdHMvZnVuY3Rpb25hbC9jb3JlLXRlc3RzL2NvcmV0ZXN0NC9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L3FlL3Rlc3RzL2NvcmUvTXlSZXNvdXJjZVRlc3QuamF2YQordGVzdHMvZnVuY3Rpb25hbC9jb3JlLXRlc3RzL2NvcmV0ZXN0NS9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L3FlL3Rlc3RzL2NvcmUvTXlSZXNvdXJjZVRlc3QuamF2YQordGVzdHMvZnVuY3Rpb25hbC9lbmQtdG8tZW5kLXRlc3RzL2V4Y2VwdGlvbnMvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9xZS90ZXN0cy9lcnJvcm1hcHBpbmcvRXJyb3JQYWdlTWFwcGluZ1Rlc3QuamF2YQordGVzdHMvZnVuY3Rpb25hbC9lbmQtdG8tZW5kLXRlc3RzL2xpc3RlbmVycy10ZXN0L3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvcWUvdGVzdHMvZW5kMmVuZC9NYWluVGVzdC5qYXZhCit0ZXN0cy9mdW5jdGlvbmFsL2d1aWNlLXRlc3RzL2plcnNleS1ndWljZS1maWx0ZXIvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9xZS90ZXN0cy9ndWljZS9HdWljZUZpbHRlclRlc3QuamF2YQordGVzdHMvZnVuY3Rpb25hbC9qZXJzZXktc2VydmxldDNfMC1pbnRlZ3JhdGlvbi9hbm5vdGF0ZWRhcHAvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9xZS90ZXN0cy9zZXJ2bGV0My9hbm5vdGF0ZWRhcHAvQW5ub3RhdGVkQXBwVGVzdC5qYXZhCit0ZXN0cy9mdW5jdGlvbmFsL2plcnNleS1zZXJ2bGV0M18wLWludGVncmF0aW9uL2Fubm90YXRlZGFwcHdpdGhzZXJ2bGV0bWFwcGluZy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L3FlL3Rlc3RzL3NlcnZsZXQzL2Fubm90YXRlZGFwcHdpdGhzZXJ2bGV0bWFwcGluZy9Bbm5vdGF0ZWRBcHBXaXRoU2VydmxldE1hcHBpbmdUZXN0LmphdmEKK3Rlc3RzL2Z1bmN0aW9uYWwvamVyc2V5LXNlcnZsZXQzXzAtaW50ZWdyYXRpb24vbm9hcHAvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9xZS90ZXN0cy9zZXJ2bGV0My9ub2FwcC9Ob0FwcFRlc3QuamF2YQordGVzdHMvZnVuY3Rpb25hbC9qZXJzZXktc2VydmxldDNfMC1pbnRlZ3JhdGlvbi9wcmVsaW1pbmFyeWFwcC9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L3FlL3Rlc3RzL3NlcnZsZXQzL3ByZWxpbWluYXJ5YXBwL1ByZWxpbWluYXJ5QXBwVGVzdC5qYXZhCit0ZXN0cy9mdW5jdGlvbmFsL21vbml0b3JpbmctdGVzdHMvY2hpbGQtcmVzb3VyY2UtbW9uaXRvcmluZy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L3FlL21vbml0b3JpbmcvdGVzdHMvY2hpbGRfcmVzb3VyY2VfbW9uaXRvcmluZy9DaGlsZFJlc291cmNlTW9uaXRvcmluZ1Rlc3QuamF2YQordGVzdHMvZnVuY3Rpb25hbC9tb25pdG9yaW5nLXRlc3RzL2hlbGxvd29ybGQtd2ViYXBwL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvc2FtcGxlcy9oZWxsb3dvcmxkL0hlbGxvV29ybGRXZWJBcHBUZXN0LmphdmEKK3Rlc3RzL2Z1bmN0aW9uYWwvbW9uaXRvcmluZy10ZXN0cy93YWRsLXJlc291cmNlLW1vbml0b3Jpbmcvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9xZS90ZXN0cy9tb25pdG9yaW5nL3dhZGxyZXNvdXJjZS9XYWRsUmVzb3VyY2VNb25pdG9yaW5nVGVzdC5qYXZhCisKK3Rlc3RzL2dyaXp6bHkyL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvaW1wbC9jbGllbnQvQWxsb3dIdHRwSGVhZGVyVGVzdC5qYXZhCit0ZXN0cy9ncml6emx5Mi9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvY2xpZW50L0FzeW5jSHR0cE1ldGhvZFRlc3QuamF2YQordGVzdHMvZ3JpenpseTIvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9pbXBsL2NsaWVudC9Db25maWd1cmF0aW9uVGVzdC5qYXZhCit0ZXN0cy9ncml6emx5Mi9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvY2xpZW50L2ZpbHRlci9Db25uZWN0aW9uTGlzdGVuZXJUZXN0LmphdmEKK3Rlc3RzL2dyaXp6bHkyL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvaW1wbC9jbGllbnQvZmlsdGVyL0hUVFBEaWdlc3RBdXRoRmlsdGVyVGVzdC5qYXZhCit0ZXN0cy9ncml6emx5Mi9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvY2xpZW50L0dlbmVyaWNUeXBlQW5kRW50aXR5VGVzdC5qYXZhCit0ZXN0cy9ncml6emx5Mi9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvY2xpZW50L0h0dHBIZWFkZXJzVGVzdC5qYXZhCit0ZXN0cy9ncml6emx5Mi9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvY2xpZW50L0h0dHBNZXRob2RXb3JrYXJvdW5kVGVzdC5qYXZhCit0ZXN0cy9ncml6emx5Mi9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvY2xpZW50L0luamVjdGFibGVQcm92aWRlclRlc3QuamF2YQordGVzdHMvZ3JpenpseTIvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9pbXBsL2NsaWVudC9VcmlCdWlsZGluZ1Rlc3QuamF2YQordGVzdHMvZ3JpenpseTIvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9pbXBsL2NvbnRhaW5lci9ncml6emx5Mi9FeGNlcHRpb25UZXN0LmphdmEKK3Rlc3RzL2dyaXp6bHkyL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvaW1wbC9jb250YWluZXIvZ3JpenpseTIvSHR0cE1ldGhvZFdvcmthcm91bmRUZXN0LmphdmEKK3Rlc3RzL2dyaXp6bHkyL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvaW1wbC9jb250YWluZXIvZ3JpenpseTIvSW5qZWN0aW9uVGVzdC5qYXZhCit0ZXN0cy9ncml6emx5Mi9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvY29udGFpbmVyL2dyaXp6bHkyL1Jlc291cmNlc0NvbnRleHRQYXRoVGVzdC5qYXZhCisKK1RPRE8gLSBMQVRFUjoKKworY29udHJpYnMvamVyc2V5LW9hdXRoL29hdXRoLXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvb2F1dGgvdGVzdHMvT3NnaUludGVncmF0aW9uVGVzdC5qYXZhCisKK2NvbnRyaWJzL2JpbGwtYnVya2UtYm9vay9leDAzXzEvc3JjL3Rlc3QvamF2YS9jb20vcmVzdGZ1bGx5L3Nob3AvdGVzdC9DdXN0b21lclJlc291cmNlVGVzdC5qYXZhCitjb250cmlicy9iaWxsLWJ1cmtlLWJvb2svZXgwNF8xL3NyYy90ZXN0L2phdmEvY29tL3Jlc3RmdWxseS9zaG9wL3Rlc3QvUGF0Y2hUZXN0LmphdmEKK2NvbnRyaWJzL2JpbGwtYnVya2UtYm9vay9leDA0XzIvc3JjL3Rlc3QvamF2YS9jb20vcmVzdGZ1bGx5L3Nob3AvdGVzdC9DdXN0b21lclJlc291cmNlVGVzdC5qYXZhCitjb250cmlicy9iaWxsLWJ1cmtlLWJvb2svZXgwNF8zL3NyYy90ZXN0L2phdmEvY29tL3Jlc3RmdWxseS9zaG9wL3Rlc3QvQ3VzdG9tZXJSZXNvdXJjZVRlc3QuamF2YQorY29udHJpYnMvYmlsbC1idXJrZS1ib29rL2V4MDVfMS9zcmMvdGVzdC9qYXZhL2NvbS9yZXN0ZnVsbHkvc2hvcC90ZXN0L0luamVjdGlvblRlc3QuamF2YQorY29udHJpYnMvYmlsbC1idXJrZS1ib29rL2V4MDZfMS9zcmMvdGVzdC9qYXZhL2NvbS9yZXN0ZnVsbHkvc2hvcC90ZXN0L0N1c3RvbWVyUmVzb3VyY2VUZXN0LmphdmEKK2NvbnRyaWJzL2JpbGwtYnVya2UtYm9vay9leDA2XzIvc3JjL3Rlc3QvamF2YS9jb20vcmVzdGZ1bGx5L3Nob3AvdGVzdC9DdXN0b21lclJlc291cmNlVGVzdC5qYXZhCitjb250cmlicy9iaWxsLWJ1cmtlLWJvb2svZXgwN18xL3NyYy90ZXN0L2phdmEvY29tL3Jlc3RmdWxseS9zaG9wL3Rlc3QvQ3VzdG9tZXJSZXNvdXJjZVRlc3QuamF2YQorY29udHJpYnMvYmlsbC1idXJrZS1ib29rL2V4MDhfMS9zcmMvdGVzdC9qYXZhL2NvbS9yZXN0ZnVsbHkvc2hvcC90ZXN0L0N1c3RvbWVyUmVzb3VyY2VUZXN0LmphdmEKK2NvbnRyaWJzL2JpbGwtYnVya2UtYm9vay9leDA4XzIvc3JjL3Rlc3QvamF2YS9jb20vcmVzdGZ1bGx5L3Nob3AvdGVzdC9DdXN0b21lclJlc291cmNlVGVzdC5qYXZhCitjb250cmlicy9iaWxsLWJ1cmtlLWJvb2svZXgwOV8xL3NyYy90ZXN0L2phdmEvY29tL3Jlc3RmdWxseS9zaG9wL3Rlc3QvQ3VzdG9tZXJSZXNvdXJjZVRlc3QuamF2YQorY29udHJpYnMvYmlsbC1idXJrZS1ib29rL2V4MDlfMi9zcmMvdGVzdC9qYXZhL2NvbS9yZXN0ZnVsbHkvc2hvcC90ZXN0L09yZGVyUmVzb3VyY2VUZXN0LmphdmEKK2NvbnRyaWJzL2JpbGwtYnVya2UtYm9vay9leDEwXzEvc3JjL3Rlc3QvamF2YS9jb20vcmVzdGZ1bGx5L3Nob3AvdGVzdC9DdXN0b21lclJlc291cmNlVGVzdC5qYXZhCitjb250cmlicy9iaWxsLWJ1cmtlLWJvb2svZXgxMV8xL2Vhci9zcmMvdGVzdC9qYXZhL2NvbS9yZXN0ZnVsbHkvc2hvcC90ZXN0L1Nob3BwaW5nVGVzdC5qYXZhCitjb250cmlicy9iaWxsLWJ1cmtlLWJvb2svZXgxMV8yL3NyYy90ZXN0L2phdmEvY29tL3Jlc3RmdWxseS9zaG9wL3Rlc3QvU2hvcHBpbmdUZXN0LmphdmEKKworY29udHJpYnMvamVyc2V5LWd1aWNlL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvZ3VpY2UvQWJzdHJhY3RHdWljZUdyaXp6bHlUZXN0LmphdmEKK2NvbnRyaWJzL2plcnNleS1ndWljZS9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2d1aWNlL0d1aWNlQm91bmRUZXN0LmphdmEKK2NvbnRyaWJzL2plcnNleS1ndWljZS9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2d1aWNlL0d1aWNlQ2hpbGRQYXJlbnRJbmplY3RvclRlc3QuamF2YQorY29udHJpYnMvamVyc2V5LWd1aWNlL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvZ3VpY2UvR3VpY2VDaGlsZFBhcmVudE5vU2NvcGVTaW5nbGV0b25UZXN0LmphdmEKK2NvbnRyaWJzL2plcnNleS1ndWljZS9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2d1aWNlL0d1aWNlSW5qZWN0ZWRUZXN0LmphdmEKK2NvbnRyaWJzL2plcnNleS1ndWljZS9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2d1aWNlL0d1aWNlVW5Cb3VuZFRlc3QuamF2YQorY29udHJpYnMvamVyc2V5LWd1aWNlL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvZ3VpY2UvUHJvdmlkZXNUZXN0LmphdmEKKworY29udHJpYnMvc3ByaW5nL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvc3ByaW5nMjUvQW5ub3RhdGVkUGVyUmVxdWVzdFJlc291cmNlVGVzdC5qYXZhCitjb250cmlicy9zcHJpbmcvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9zcHJpbmcyNS9Bbm5vdGF0ZWRTaW5nbGV0b25SZXNvdXJjZVRlc3QuamF2YQorY29udHJpYnMvc3ByaW5nL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvc3ByaW5nMjUvQXV0b3dpcmVkQnlTcHJpbmdTaW5nbGV0b25SZXNvdXJjZVRlc3QuamF2YQorY29udHJpYnMvc3ByaW5nL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvc3ByaW5nMjUvUHJveGllZFJlc291cmNlVGVzdC5qYXZhCitjb250cmlicy9zcHJpbmcvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9zcHJpbmcyNS9TcHJpbmdTY29wZWRSZXNvdXJjZVRlc3QuamF2YQorY29udHJpYnMvc3ByaW5nL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvc3ByaW5nL0Fic3RyYWN0UmVzb3VyY2VUZXN0LmphdmEKK2NvbnRyaWJzL3NwcmluZy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L3NwcmluZy9qZXJzZXltYW5hZ2VkL0F1dG93aXJlZEJ5SmVyc2V5U3ByaW5nU2luZ2xldG9uUmVzb3VyY2VUZXN0LmphdmEKK2NvbnRyaWJzL3NwcmluZy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L3NwcmluZy9qZXJzZXltYW5hZ2VkL0F1dG93aXJlZFBlclJlcXVlc3RSZXNvdXJjZVRlc3QuamF2YQorY29udHJpYnMvc3ByaW5nL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvc3ByaW5nL2plcnNleW1hbmFnZWQvRXhjZXB0aW9uVGhyb3dpbmdSZXNvdXJjZVRlc3QuamF2YQorY29udHJpYnMvc3ByaW5nL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvc3ByaW5nL2plcnNleW1hbmFnZWQvSmVyc2V5TWFuYWdlZFBlclJlcXVlc3RSZXNvdXJjZVRlc3QuamF2YQorY29udHJpYnMvc3ByaW5nL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvc3ByaW5nL2plcnNleW1hbmFnZWQvSmVyc2V5TWFuYWdlZFNpbmdsZXRvblJlc291cmNlVGVzdC5qYXZhCitjb250cmlicy9zcHJpbmcvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9zcHJpbmcvamVyc2V5bWFuYWdlZC9OYW1lQmFzZWRJbmplY3RpbmdSZXNvdXJjZVRlc3QuamF2YQorY29udHJpYnMvc3ByaW5nL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvc3ByaW5nL1NwcmluZ01hbmFnZWRQZXJSZXF1ZXN0UmVzb3VyY2VUZXN0LmphdmEKK2NvbnRyaWJzL3NwcmluZy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L3NwcmluZy9TcHJpbmdNYW5hZ2VkUGVyUmVxdWVzdFJlc291cmNlV2l0aENvbnN0cnVjdG9yVGVzdC5qYXZhCitjb250cmlicy9zcHJpbmcvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9zcHJpbmcvU3ByaW5nTWFuYWdlZFNpbmdsZXRvblJlc291cmNlVGVzdC5qYXZhCitjb250cmlicy9zcHJpbmcvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9zcHJpbmcvU3ByaW5nTWFuYWdlZFNpbmdsZXRvblJlc291cmNlV2l0aENvbnN0cnVjdG9yVGVzdC5qYXZhCitjb250cmlicy9zcHJpbmcvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9zcHJpbmcvdGVzdHMvYWJzdHJhY3RiZWFuL0Fic3RyYWN0QmVhblRlc3QuamF2YQorY29udHJpYnMvc3ByaW5nL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvc3ByaW5nL3Rlc3RzL0Fic3RyYWN0VGVzdC5qYXZhCitjb250cmlicy9zcHJpbmcvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9zcHJpbmcvdGVzdHMvY2hpbGRjb25maWcvQ2hpbGRDb25maWdDb250ZXh0VGVzdC5qYXZhCitjb250cmlicy9zcHJpbmcvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9zcHJpbmcvdGVzdHMvaW5oZXJpdGVuY2UvSW5oZXJpdGVuY2VUZXN0LmphdmEKKworc2FtcGxlcy9lbnRpdHktcHJvdmlkZXIvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9zYW1wbGVzL2VudGl0eXByb3ZpZGVyL01haW5UZXN0LmphdmEKK3NhbXBsZXMvamVyc2V5LWNkaS9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L3NhbXBsZXMvamVyc2V5X2NkaS90ZXN0L1NpbXBsZVRlc3QuamF2YQorc2FtcGxlcy9qZXJzZXktZ3VpY2UtZmlsdGVyL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvc2FtcGxlcy9ndWljZS9HdWljZUZpbHRlclRlc3QuamF2YQorCitzYW1wbGVzL2ptYWtpLWJhY2tlbmQvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9zYW1wbGVzL2ptYWtpL0pNYWtpQmFja2VuZFdlYmFwcFRlc3QuamF2YQorc2FtcGxlcy9tb3h5LW94bS1tYXBwaW5nL3dlYmFwcC9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L3NhbXBsZXMvbW94eS9Nb3h5V2ViQXBwVGVzdC5qYXZhCitzYW1wbGVzL21veHkvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9zYW1wbGVzL21veHkvTW94eVdlYkFwcFRlc3QuamF2YQorc2FtcGxlcy9vcHRpbWlzdGljLWNvbmN1cnJlbmN5L3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvc2FtcGxlcy9vcHRpbWlzdGljY29uY3VycmVuY3kvTWFpblRlc3QuamF2YQorc2FtcGxlcy9vc2dpLWh0dHAtc2VydmljZS9mdW5jdGlvbmFsLXRlc3Qvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9zYW1wbGVzL29zZ2lodHRwc2VydmljZS90ZXN0L0Fic3RyYWN0SHR0cFNlcnZpY2VUZXN0LmphdmEKK3NhbXBsZXMvb3NnaS1odHRwLXNlcnZpY2UvZnVuY3Rpb25hbC10ZXN0L3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvc2FtcGxlcy9vc2dpaHR0cHNlcnZpY2UvdGVzdC9Hcml6emx5SHR0cFNlcnZpY2VFcXVpbm94VGVzdC5qYXZhCitzYW1wbGVzL29zZ2ktaHR0cC1zZXJ2aWNlL2Z1bmN0aW9uYWwtdGVzdC9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L3NhbXBsZXMvb3NnaWh0dHBzZXJ2aWNlL3Rlc3QvR3JpenpseUh0dHBTZXJ2aWNlRmVsaXhUZXN0LmphdmEKK3NhbXBsZXMvb3NnaS1odHRwLXNlcnZpY2UvZnVuY3Rpb25hbC10ZXN0L3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvc2FtcGxlcy9vc2dpaHR0cHNlcnZpY2UvdGVzdC9KZXR0eUh0dHBTZXJ2aWNlRXF1aW5veFRlc3QuamF2YQorc2FtcGxlcy9vc2dpLWh0dHAtc2VydmljZS9mdW5jdGlvbmFsLXRlc3Qvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9zYW1wbGVzL29zZ2lodHRwc2VydmljZS90ZXN0L0pldHR5SHR0cFNlcnZpY2VGZWxpeFRlc3QuamF2YQorCitzYW1wbGVzL3NpbXBsZS1zZXJ2bGV0L3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvc2FtcGxlcy9zZXJ2bGV0L3Jlc291cmNlcy9NYXN0ZXJSZXNvdXJjZUJlYW5UZXN0LmphdmEKK3NhbXBsZXMvc3ByaW5nLWFubm90YXRpb25zL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvc2FtcGxlcy9zcHJpbmdhbm5vdGF0aW9ucy9TcHJpbmdBbm5vdGF0aW9uc1dlYkFwcFRlc3QuamF2YQorc2FtcGxlcy9zdG9yYWdlLXNlcnZpY2Uvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9zYW1wbGVzL3N0b3JhZ2VzZXJ2aWNlL01haW5UZXN0LmphdmEKKworVE9ETyAtIEZFQVRVUkUgTk9UIFNVUFBPUlRFRCBZRVQ6CisKKy0gSkVSU0VZLTE3MQoramVyc2V5LXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvaW1wbC9jb250YWluZXIvZ3JpenpseS9DYW5vbmljYWxpemF0aW9uRmVhdHVyZVRlc3QuamF2YQoramVyc2V5LXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvaW1wbC9jb250YWluZXIvZ3JpenpseS93ZWIvQ2Fub25pY2FsaXphdGlvbkZlYXR1cmVUZXN0LmphdmEKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvY29udGFpbmVyL2dyaXp6bHkvd2ViL1JlZGlyZWN0aW9uVGVzdC5qYXZhCitqZXJzZXktdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9pbXBsL2NvbnRhaW5lci9odHRwc2VydmVyL0Nhbm9uaWNhbGl6YXRpb25GZWF0dXJlVGVzdC5qYXZhCitvc2dpL2Z1bmN0aW9uYWwtdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9vc2dpL3Rlc3RzL2dyaXp6bHkvQ2Fub25pY2FsaXphdGlvbkZlYXR1cmVUZXN0LmphdmEKK29zZ2kvZnVuY3Rpb25hbC10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L29zZ2kvdGVzdHMvamV0dHkvQ2Fub25pY2FsaXphdGlvbkZlYXR1cmVUZXN0LmphdmEKK3Rlc3RzL2dyaXp6bHkyL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvaW1wbC9jb250YWluZXIvZ3JpenpseTIvQ2Fub25pY2FsaXphdGlvbkZlYXR1cmVUZXN0LmphdmEKKworLSBKRVJTRVktMTY5IC0gQFByZURlc3Ryb3kgZG9lc24ndCB3b3JrLgoramVyc2V5LXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvaW1wbC9jb250YWluZXIvZ3JpenpseS93ZWIvR3JpenpseVdlYlByb3ZpZGVyTGlmZWN5Y2xlVGVzdC5qYXZhCisKK2NvbnRyaWJzL2plcnNleS1hdG9tLWFiZGVyYS9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2F0b20vYWJkZXJhL0NvbnRlbnRIZWxwZXJUZXN0LmphdmEKK2NvbnRyaWJzL2plcnNleS1hdG9tLWFiZGVyYS9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2F0b20vYWJkZXJhL2ltcGwvcHJvdmlkZXIvZW50aXR5L1Byb3ZpZGVyc1Rlc3QuamF2YQorCitjb250cmlicy9qZXJzZXktbm9uLWJsb2NraW5nLWNsaWVudC9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2NsaWVudC9ub24vYmxvY2tpbmcvaW1wbC9Bc3luY0h0dHBNZXRob2RUZXN0LmphdmEKK2NvbnRyaWJzL2plcnNleS1ub24tYmxvY2tpbmctY2xpZW50L3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvY2xpZW50L25vbi9ibG9ja2luZy9pbXBsL0F1dGhUZXN0LmphdmEKK2NvbnRyaWJzL2plcnNleS1ub24tYmxvY2tpbmctY2xpZW50L3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvY2xpZW50L25vbi9ibG9ja2luZy9pbXBsL0Nvb2tpZVRlc3QuamF2YQorY29udHJpYnMvamVyc2V5LW5vbi1ibG9ja2luZy1jbGllbnQvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9jbGllbnQvbm9uL2Jsb2NraW5nL2ltcGwvRmlsdGVyVGVzdC5qYXZhCitjb250cmlicy9qZXJzZXktbm9uLWJsb2NraW5nLWNsaWVudC9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2NsaWVudC9ub24vYmxvY2tpbmcvaW1wbC9HWklQQ29udGVudEVuY29kaW5nVGVzdC5qYXZhCitjb250cmlicy9qZXJzZXktbm9uLWJsb2NraW5nLWNsaWVudC9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2NsaWVudC9ub24vYmxvY2tpbmcvaW1wbC9IdHRwSGVhZGVyc1Rlc3QuamF2YQorY29udHJpYnMvamVyc2V5LW5vbi1ibG9ja2luZy1jbGllbnQvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9jbGllbnQvbm9uL2Jsb2NraW5nL2ltcGwvSHR0cE1ldGhvZFRlc3QuamF2YQorY29udHJpYnMvamVyc2V5LW5vbi1ibG9ja2luZy1jbGllbnQvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9jbGllbnQvbm9uL2Jsb2NraW5nL2ltcGwvSHR0cE1ldGhvZFdpdGhDbGllbnRGaWx0ZXJUZXN0LmphdmEKK2NvbnRyaWJzL2plcnNleS1ub24tYmxvY2tpbmctY2xpZW50L3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvY2xpZW50L25vbi9ibG9ja2luZy9pbXBsL05vRW50aXR5VGVzdC5qYXZhCisKK2V4cGVyaW1lbnRhbC9oeXBlcm1lZGlhLWFjdGlvbi9oeXBlcm1lZGlhLWFjdGlvbi1zYW1wbGUvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9zYW1wbGVzL2h5cGVybWVkaWEvTWFpblRlc3QuamF2YQorCitleHBlcmltZW50YWwvdmlldy1jbGllbnQvamVyc2V5LXZpZXctY2xpZW50LXNhbXBsZXMvaHlwZXJtZWRpYS1hY3Rpb24tc2FtcGxlL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvc2FtcGxlcy9oeXBlcm1lZGlhL01haW5UZXN0LmphdmEKKworamVyc2V5LXNlcnZlci1saW5raW5nL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvc2VydmVyL2xpbmtpbmcvZWwvTGlua0VMQ29udGV4dFRlc3QuamF2YQoramVyc2V5LXNlcnZlci1saW5raW5nL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvc2VydmVyL2xpbmtpbmcvaW1wbC9FbnRpdHlEZXNjcmlwdG9yVGVzdC5qYXZhCitqZXJzZXktc2VydmVyLWxpbmtpbmcvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9zZXJ2ZXIvbGlua2luZy9pbXBsL0xpbmtQcm9jZXNzb3JUZXN0LmphdmEKK2plcnNleS1zZXJ2ZXItbGlua2luZy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L3NlcnZlci9saW5raW5nL2ltcGwvUmVmUHJvY2Vzc29yVGVzdC5qYXZhCisKK3NhbXBsZXMvYXRvbXB1Yi1jb250YWN0cy9hdG9tcHViLWNvbnRhY3RzLWNsaWVudC9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L3NhbXBsZXMvY29udGFjdHMvY2xpZW50L0Fic3RyYWN0VGVzdC5qYXZhCitzYW1wbGVzL2F0b21wdWItY29udGFjdHMvYXRvbXB1Yi1jb250YWN0cy1jbGllbnQvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9zYW1wbGVzL2NvbnRhY3RzL2NsaWVudC9Db250YWN0c0NsaWVudFRlc3QuamF2YQorc2FtcGxlcy9hdG9tcHViLWNvbnRhY3RzL2F0b21wdWItY29udGFjdHMtY2xpZW50L3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvc2FtcGxlcy9jb250YWN0cy9jbGllbnQvVXNlcnNDbGllbnRUZXN0LmphdmEKK3NhbXBsZXMvYXRvbXB1Yi1jb250YWN0cy9hdG9tcHViLWNvbnRhY3RzLW1vZGVscy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L3NhbXBsZXMvY29udGFjdHMvbW9kZWxzL0NvbnRhY3RUZXN0LmphdmEKK3NhbXBsZXMvYXRvbXB1Yi1jb250YWN0cy9hdG9tcHViLWNvbnRhY3RzLW1vZGVscy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L3NhbXBsZXMvY29udGFjdHMvbW9kZWxzL1VzZXJUZXN0LmphdmEKK3NhbXBsZXMvYXRvbXB1Yi1jb250YWN0cy9hdG9tcHViLWNvbnRhY3RzLXNlcnZlci9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L3NhbXBsZXMvY29udGFjdHMvc2VydmVyL0Fic3RyYWN0VGVzdC5qYXZhCitzYW1wbGVzL2F0b21wdWItY29udGFjdHMvYXRvbXB1Yi1jb250YWN0cy1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9zYW1wbGVzL2NvbnRhY3RzL3NlcnZlci9BdXRoZW50aWNhdGlvblRlc3QuamF2YQorc2FtcGxlcy9hdG9tcHViLWNvbnRhY3RzL2F0b21wdWItY29udGFjdHMtc2VydmVyL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvc2FtcGxlcy9jb250YWN0cy9zZXJ2ZXIvQXV0aG9yaXphdGlvblRlc3QuamF2YQorc2FtcGxlcy9hdG9tcHViLWNvbnRhY3RzL2F0b21wdWItY29udGFjdHMtc2VydmVyL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvc2FtcGxlcy9jb250YWN0cy9zZXJ2ZXIvQ29udGFjdHNUZXN0LmphdmEKK3NhbXBsZXMvYXRvbXB1Yi1jb250YWN0cy9hdG9tcHViLWNvbnRhY3RzLXNlcnZlci9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L3NhbXBsZXMvY29udGFjdHMvc2VydmVyL1VzZXJzVGVzdC5qYXZhCisKK3NhbXBsZXMvamVyc2V5LXNlcnZlci1saW5raW5nLXNhbXBsZS9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L3NhbXBsZXMvbGlua2luZy9MaW5rV2ViQXBwVGVzdC5qYXZhCisKK3NhbXBsZXMvc2ltcGxlLWF0b20tc2VydmVyL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvc2FtcGxlcy9hdG9tc2VydmVyL1NpbXBsZUF0b21TZXJ2ZXJUZXN0LmphdmEKKworVE9ETyAtIEZFQVRVUkUgTk9UIFNVUFBPUlRFRCwgVEVTVFMgU0hPVUxEIEJFIERST1BQRUQKKworIyBDbGllbnQgLSBDb250YWluZXJMaXN0ZW5lciwgT25TdGFydENvbm5lY3Rpb25MaXN0ZW5lcgoramVyc2V5LXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvaW1wbC9jbGllbnQvZmlsdGVyL0Nvbm5lY3Rpb25MaXN0ZW5lclRlc3QuamF2YQorIyBDbGllbnQgLSBObyBFbnRpdHlIb2xkZXIKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvZW50aXR5L0VudGl0eUhvbGRlclRlc3QuamF2YQorIyBTZXJ2ZXIgLSBDb250YWluZXJOb3RpZmllcgordGVzdHMvZ3JpenpseTIvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9pbXBsL2NvbnRhaW5lci9ncml6emx5Mi9QYWNrYWdlc1Jlc291cmNlQ29uZmlnUmVsb2FkVGVzdC5qYXZhCit0ZXN0cy9ncml6emx5Mi9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvY29udGFpbmVyL2dyaXp6bHkyL1JlbG9hZFRlc3QuamF2YQoramVyc2V5LXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvaW1wbC9jb250YWluZXIvZ3JpenpseS9QYWNrYWdlc1Jlc291cmNlQ29uZmlnUmVsb2FkVGVzdC5qYXZhCitqZXJzZXktdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9pbXBsL2NvbnRhaW5lci9ncml6emx5L3dlYi9BcHBsaWNhdGlvblJlbG9hZFJlc291cmNlVGVzdC5qYXZhCitqZXJzZXktdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9pbXBsL2NvbnRhaW5lci9odHRwc2VydmVyL1JlbG9hZFRlc3QuamF2YQorCitUT0RPIC0gU1VHR0VTVCBUTyBTS0lQIFRIT1NFIFRFU1RTOgorLS0gdGVzdCBmcmFtZXdvcmsvR3JpenpseTIKK2plcnNleS10ZXN0LWZyYW1ld29yay9qZXJzZXktdGVzdC1mcmFtZXdvcmstZ3JpenpseTIvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS90ZXN0L2ZyYW1ld29yay9CYXNlVXJpVGVzdC5qYXZhIC8vIHRlc3RlZCBtdWx0aXBsZSB0aW1lcyBldmVyeXdoZXJlLCBlLmcuIExvY2F0aW9uSGVhZGVyVGVzdCwgUmVzcG9uc2VUZXN0LCBldGMuCitqZXJzZXktdGVzdC1mcmFtZXdvcmsvamVyc2V5LXRlc3QtZnJhbWV3b3JrLWdyaXp6bHkyL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvdGVzdC9mcmFtZXdvcmsvaW1wbC9jb250YWluZXIvZ3JpenpseTIvR3JpenpseUNsYXNzZXNUZXN0LmphdmEgLy8gc2FtZSBhcyBhYm92ZQoramVyc2V5LXRlc3QtZnJhbWV3b3JrL2plcnNleS10ZXN0LWZyYW1ld29yay1ncml6emx5Mi9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L3Rlc3QvZnJhbWV3b3JrL2ltcGwvY29udGFpbmVyL2dyaXp6bHl3ZWIyL2NvbnRleHRwYXRoL0dyaXp6bHlXZWJDb250ZXh0UGF0aFRlc3QuamF2YQoramVyc2V5LXRlc3QtZnJhbWV3b3JrL2plcnNleS10ZXN0LWZyYW1ld29yay1ncml6emx5Mi9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L3Rlc3QvZnJhbWV3b3JrL2ltcGwvY29udGFpbmVyL2dyaXp6bHl3ZWIyL0dyaXp6bHlXZWJJbmplY3Rpb25UZXN0LmphdmEKK2plcnNleS10ZXN0LWZyYW1ld29yay9qZXJzZXktdGVzdC1mcmFtZXdvcmstZ3JpenpseTIvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS90ZXN0L2ZyYW1ld29yay9pbXBsL2NvbnRhaW5lci9ncml6emx5d2ViMi9Hcml6emx5V2ViU2VydmxldEFuZEZpbHRlclRlc3QuamF2YQoramVyc2V5LXRlc3QtZnJhbWV3b3JrL2plcnNleS10ZXN0LWZyYW1ld29yay1ncml6emx5Mi9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L3Rlc3QvZnJhbWV3b3JrL2ltcGwvY29udGFpbmVyL2dyaXp6bHl3ZWIyL0dyaXp6bHlXZWJUZXN0LmphdmEKKworamVyc2V5LXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvYXBpL2NvcmUvQWJzdHJhY3RSZXNvdXJjZUNvbmZpZ09yZGVyVGVzdC5qYXZhCitqZXJzZXktdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9hcGkvY29yZS9DbGFzc05hbWVzUmVzb3VyY2VDb25maWdUZXN0LmphdmEKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2FwaS9jb3JlL0RlZmF1bHRSZXNvdXJjZUNvbmZpZ1Rlc3QuamF2YQoramVyc2V5LXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvaW1wbC9hcHBsaWNhdGlvbi9XZWJBcHBsaWNhdGlvblRlc3QuamF2YQorCitqZXJzZXktdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9pbXBsL2Vycm9ycy9NaXNzaW5nRGVwZW5kZW5jaWVzVGVzdC5qYXZhIChtaXNzaW5nIGRlcGVuZGVuY2llcyBpbiBqMiBkbyBub3QgbG9nIHdhcm4pCitqZXJzZXktdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9pbXBsL0luQm91bmRIZWFkZXJzVGVzdC5qYXZhCitqZXJzZXktdGVzdHMvc3JjL3Rlc3QvamF2YS9jb20vc3VuL2plcnNleS9pbXBsL0luZmVjdG9yVGVzdC5qYXZhICh0aGUgY2xhc3MgSW5mbGVjdG9yIGhhcyBkaWZmZXJlbnQgcHVycG9zZSBpbiBKMikKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvaW5qZWN0L0Fubm90YXRpb25JbmplY3RhYmxlVGVzdC5qYXZhIChkaWZmZXJlbnQgaW5qZWN0aW9uL2hrMikKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvaW5qZWN0L0NvbnRleHRSZXNvbHZlclRlc3QuamF2YSAoQ29udGV4dFJlc29sdmVyIG5vdCBpbmplY3RhYmxlIGFueSBtb3JlKQoramVyc2V5LXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvaW1wbC9pbmplY3QvSW5qZWN0QW5ub3RhdGlvbkluamVjdGFibGVUZXN0LmphdmEgKEluamVjdGFibGUgaXMgTi9BIGluIEoyL2hrMikKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvbGlmZWN5Y2xlL011bHRpcGxlU2NvcGVUZXN0LmphdmEgKGRpZmZlcmVudCBpbmplY3Rpb24gL2hrMikKK2plcnNleS10ZXN0cy9zcmMvdGVzdC9qYXZhL2NvbS9zdW4vamVyc2V5L2ltcGwvaHR0cC9oZWFkZXIvTGlua1Rlc3QuamF2YQoramVyc2V5LXRlc3RzL3NyYy90ZXN0L2phdmEvY29tL3N1bi9qZXJzZXkvaW1wbC9saWZlY3ljbGUvUG9zdENvbnN0cnVjdFByZURlc3Ryb3lUZXN0LmphdmEgKHJlZHVuZGFudCkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9MSUNFTlNFLm1kIGIvZXhhbXBsZXMvTElDRU5TRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWFkMzM1Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvTElDRU5TRS5tZApAQCAtMCwwICsxLDI5IEBACisNCisgICAgQ29weXJpZ2h0IChjKSAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuDQorICAgDQorICAgIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dA0KKyAgICBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMNCisgICAgYXJlIG1ldDoNCisgICANCisgICAgICAtIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0DQorICAgICAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuDQorICAgDQorICAgICAgLSBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodA0KKyAgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQ0KKyAgICAgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4NCisgICANCisgICAgICAtIE5laXRoZXIgdGhlIG5hbWUgb2YgdGhlIEVjbGlwc2UgRm91bmRhdGlvbiwgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cw0KKyAgICAgICAgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkDQorICAgICAgICBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uDQorICAgDQorICAgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMgIkFTDQorICAgIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywNCisgICAgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUg0KKyAgICBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBPV05FUiBPUg0KKyAgICBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwNCisgICAgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLA0KKyAgICBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1INCisgICAgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRg0KKyAgICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORw0KKyAgICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMNCisgICAgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuDQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYXNzZW1ibGllcy9wb20ueG1sIGIvZXhhbXBsZXMvYXNzZW1ibGllcy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNzE3N2MKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9hc3NlbWJsaWVzL3BvbS54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmFzc2VtYmxpZXM8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktZXhhbXBsZXMtYXNzZW1ibGllczwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgZXhhbXBsZXMgc2hhcmVkIGFzc2VtYmx5IHR5cGVzLjwvZGVzY3JpcHRpb24+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2Fzc2VtYmxpZXMvc3JjL21haW4vcmVzb3VyY2VzL2Fzc2VtYmxpZXMvZ2xhc3NmaXNoLXNyYy16aXAueG1sIGIvZXhhbXBsZXMvYXNzZW1ibGllcy9zcmMvbWFpbi9yZXNvdXJjZXMvYXNzZW1ibGllcy9nbGFzc2Zpc2gtc3JjLXppcC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRiZjBiZgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2Fzc2VtYmxpZXMvc3JjL21haW4vcmVzb3VyY2VzL2Fzc2VtYmxpZXMvZ2xhc3NmaXNoLXNyYy16aXAueG1sCkBAIC0wLDAgKzEsNDMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorCistLT4KKworPGFzc2VtYmx5PgorICAgIDwhLS0KKyAgICAgQW4gYXNzZW1ibHkgdGhhdCBwcm9kdWNlcyBhbiBleGFtcGxlIHByb2plY3Qgc291cmNlIHppcCBidW5kbGUgd2l0aAorICAgICB0aGUgamVyc2V5IGRlcGVuZGVuY2llcyBpbiB0aGUgb3JpZ2luYWwgcHJvamVjdCBwb20ueG1sIGZpbGUgdHJhbnNmb3JtZWQKKyAgICAgdG8gdGhlICJwcm92aWRlZCIgc2NvcGUuCisgICAgIFRoZSByZXN1bHRpbmcgemlwcGVkIGV4YW1wbGUgcHJvamVjdCBzb3VyY2VzIGFyZSB0aHVzIGFibGUgdG8gYnVpbGQgZXhhbXBsZQorICAgICBiaW5hcmllcyB0aGF0IGFyZSBzdWl0YWJsZSBmb3IgYSBkZXBsb3ltZW50IG9uIGNvbnRhaW5lcnMgd2hpY2ggaG9zdCBKZXJzZXkKKyAgICAgcnVudGltZSBieSBkZWZhdWx0IChlLmcuIEdsYXNzRmlzaCkuCisgICAgLS0+CisgICAgPGlkPmdmLXByb2plY3Qtc3JjPC9pZD4KKyAgICA8Zm9ybWF0cz4KKyAgICAgICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KKyAgICA8L2Zvcm1hdHM+CisgICAgPGZpbGVTZXRzPgorICAgICAgICA8ZmlsZVNldD4KKyAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtwcm9qZWN0LmJhc2VkaXJ9PC9kaXJlY3Rvcnk+CisgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5Pi88L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgIDx1c2VEZWZhdWx0RXhjbHVkZXM+dHJ1ZTwvdXNlRGVmYXVsdEV4Y2x1ZGVzPgorICAgICAgICAgICAgPGV4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDxleGNsdWRlPnBvbS54bWw8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovdGFyZ2V0LyoqPC9leGNsdWRlPgorICAgICAgICAgICAgICAgIDxleGNsdWRlPioqLyouaW1sPC9leGNsdWRlPgorICAgICAgICAgICAgPC9leGNsdWRlcz4KKyAgICAgICAgPC9maWxlU2V0PgorICAgICAgICA8ZmlsZVNldD4KKyAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtwcm9qZWN0LmJhc2VkaXJ9L3RhcmdldC9nZi1wb20tZmlsZTwvZGlyZWN0b3J5PgorICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4vPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgIDwvZmlsZVNldD4KKyAgICA8L2ZpbGVTZXRzPgorPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2Fzc2VtYmxpZXMvc3JjL21haW4vcmVzb3VyY2VzL2Fzc2VtYmxpZXMvc3JjLXppcC54bWwgYi9leGFtcGxlcy9hc3NlbWJsaWVzL3NyYy9tYWluL3Jlc291cmNlcy9hc3NlbWJsaWVzL3NyYy16aXAueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmOTlhNjUKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9hc3NlbWJsaWVzL3NyYy9tYWluL3Jlc291cmNlcy9hc3NlbWJsaWVzL3NyYy16aXAueG1sCkBAIC0wLDAgKzEsNDIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorCistLT4KKworPGFzc2VtYmx5PgorICAgIDwhLS0KKyAgICAgQW4gYXNzZW1ibHkgdGhhdCBwcm9kdWNlcyBhbiBleGFtcGxlIHByb2plY3Qgc291cmNlIHppcCBidW5kbGUgd2l0aAorICAgICB0aGUgamVyc2V5IGRlcGVuZGVuY2llcyBpbiB0aGUgb3JpZ2luYWwgcHJvamVjdCBwb20ueG1sIGZpbGUgdHJhbnNmb3JtZWQKKyAgICAgdG8gdGhlICJwcm92aWRlZCIgc2NvcGUuCisgICAgIFRoZSByZXN1bHRpbmcgemlwcGVkIGV4YW1wbGUgcHJvamVjdCBzb3VyY2VzIGFyZSB0aHVzIGFibGUgdG8gYnVpbGQgZXhhbXBsZQorICAgICBiaW5hcmllcyB0aGF0IGFyZSBzdWl0YWJsZSBmb3IgYSBkZXBsb3ltZW50IG9uIGNvbnRhaW5lcnMgd2hpY2ggaG9zdCBKZXJzZXkKKyAgICAgcnVudGltZSBieSBkZWZhdWx0IChlLmcuIEdsYXNzRmlzaCkuCisgICAgLS0+CisgICAgPGlkPnByb2plY3Qtc3JjPC9pZD4KKyAgICA8Zm9ybWF0cz4KKyAgICAgICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KKyAgICA8L2Zvcm1hdHM+CisgICAgPGZpbGVTZXRzPgorICAgICAgICA8ZmlsZVNldD4KKyAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtwcm9qZWN0LmJhc2VkaXJ9PC9kaXJlY3Rvcnk+CisgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5Pi88L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgIDx1c2VEZWZhdWx0RXhjbHVkZXM+dHJ1ZTwvdXNlRGVmYXVsdEV4Y2x1ZGVzPgorICAgICAgICAgICAgPGV4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL3RhcmdldC8qKjwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qLmltbDwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi93ZWJsb2dpYy54bWw8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovZ2xhc3NmaXNoLXdlYi54bWw8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+Kiovc3VuLXdlYi54bWw8L2V4Y2x1ZGU+CisgICAgICAgICAgICA8L2V4Y2x1ZGVzPgorICAgICAgICA8L2ZpbGVTZXQ+CisgICAgPC9maWxlU2V0cz4KKzwvYXNzZW1ibHk+CisKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2Fzc2VtYmxpZXMvc3JjL21haW4vcmVzb3VyY2VzL2Fzc2VtYmxpZXMvd2VibG9naWMtc3JjLXppcC54bWwgYi9leGFtcGxlcy9hc3NlbWJsaWVzL3NyYy9tYWluL3Jlc291cmNlcy9hc3NlbWJsaWVzL3dlYmxvZ2ljLXNyYy16aXAueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYWZhNDAKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9hc3NlbWJsaWVzL3NyYy9tYWluL3Jlc291cmNlcy9hc3NlbWJsaWVzL3dlYmxvZ2ljLXNyYy16aXAueG1sCkBAIC0wLDAgKzEsNTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorCistLT4KKworPGFzc2VtYmx5PgorICAgIDwhLS0KKyAgICAgQW4gYXNzZW1ibHkgdGhhdCBwcm9kdWNlcyBhbiBleGFtcGxlIHByb2plY3Qgc291cmNlIHppcCBidW5kbGUgd2l0aAorICAgICB0aGUgamVyc2V5IGRlcGVuZGVuY2llcyBpbiB0aGUgb3JpZ2luYWwgcHJvamVjdCBwb20ueG1sIGZpbGUgdHJhbnNmb3JtZWQKKyAgICAgdG8gdGhlICJwcm92aWRlZCIgc2NvcGUuCisgICAgIFRoZSByZXN1bHRpbmcgemlwcGVkIGV4YW1wbGUgcHJvamVjdCBzb3VyY2VzIGFyZSB0aHVzIGFibGUgdG8gYnVpbGQgZXhhbXBsZQorICAgICBiaW5hcmllcyB0aGF0IGFyZSBzdWl0YWJsZSBmb3IgYSBkZXBsb3ltZW50IG9uIGNvbnRhaW5lcnMgd2hpY2ggaG9zdCBKZXJzZXkKKyAgICAgcnVudGltZSBieSBkZWZhdWx0IChlLmcuIEdsYXNzRmlzaCkuCisgICAgLS0+CisgICAgPGlkPndscy1wcm9qZWN0LXNyYzwvaWQ+CisgICAgPGZvcm1hdHM+CisgICAgICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+CisgICAgPC9mb3JtYXRzPgorICAgIDxmaWxlU2V0cz4KKyAgICAgICAgPGZpbGVTZXQ+CisgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7cHJvamVjdC5iYXNlZGlyfTwvZGlyZWN0b3J5PgorICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4vPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICA8dXNlRGVmYXVsdEV4Y2x1ZGVzPnRydWU8L3VzZURlZmF1bHRFeGNsdWRlcz4KKyAgICAgICAgICAgIDxleGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8ZXhjbHVkZT5wb20ueG1sPC9leGNsdWRlPgorICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL1dFQi1JTkYvd2ViLnhtbDwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9XRUItSU5GL3dlYmxvZ2ljLnhtbDwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi90YXJnZXQvKio8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKi5pbWw8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovZ2xhc3NmaXNoLXdlYi54bWw8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+Kiovc3VuLXdlYi54bWw8L2V4Y2x1ZGU+CisgICAgICAgICAgICA8L2V4Y2x1ZGVzPgorICAgICAgICA8L2ZpbGVTZXQ+CisgICAgICAgIDxmaWxlU2V0PgorICAgICAgICAgICAgPGRpcmVjdG9yeT4ke3Byb2plY3QuYmFzZWRpcn0vdGFyZ2V0L3dscy1wb20tZmlsZTwvZGlyZWN0b3J5PgorICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4vPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgIDwvZmlsZVNldD4KKyAgICAgICAgPGZpbGVTZXQ+CisgICAgICAgICAgICA8IS0tIHdpbGwgY29weSBldmVyeXRoaW5nIGZyb20gL2V4YW1wbGVzL2V0Yy93bHMvbWFpbi93ZWJhcHAvV0VCLUlORiAtLT4KKyAgICAgICAgICAgIDwhLS0gY3VycmVudGx5IHRoZSBkaXJlY3RvcnkgaXMgZW1wdHkgLS0+CisgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7cHJvamVjdC5iYXNlZGlyfS90YXJnZXQvd2xzLXdlYi14bWwtZmlsZS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORjwvZGlyZWN0b3J5PgorICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4vc3JjL21haW4vd2ViYXBwL1dFQi1JTkY8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgPC9maWxlU2V0PgorICAgICAgICA8ZmlsZVNldD4KKyAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtwcm9qZWN0LmJhc2VkaXJ9Ly4uL2V0Yy93bHM8L2RpcmVjdG9yeT4KKyAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+Lzwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICA8L2ZpbGVTZXQ+CisgICAgPC9maWxlU2V0cz4KKzwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9hc3NlbWJsaWVzL3NyYy9tYWluL3Jlc291cmNlcy9hc3NlbWJsaWVzL3dlYmxvZ2ljMTIxMy1zcmMtemlwLnhtbCBiL2V4YW1wbGVzL2Fzc2VtYmxpZXMvc3JjL21haW4vcmVzb3VyY2VzL2Fzc2VtYmxpZXMvd2VibG9naWMxMjEzLXNyYy16aXAueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZGZhNTcKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9hc3NlbWJsaWVzL3NyYy9tYWluL3Jlc291cmNlcy9hc3NlbWJsaWVzL3dlYmxvZ2ljMTIxMy1zcmMtemlwLnhtbApAQCAtMCwwICsxLDU0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzxhc3NlbWJseT4KKyAgICA8IS0tCisgICAgIEFuIGFzc2VtYmx5IHRoYXQgcHJvZHVjZXMgYW4gZXhhbXBsZSBwcm9qZWN0IHNvdXJjZSB6aXAgYnVuZGxlIHdpdGgKKyAgICAgdGhlIGplcnNleSBkZXBlbmRlbmNpZXMgaW4gdGhlIG9yaWdpbmFsIHByb2plY3QgcG9tLnhtbCBmaWxlIHRyYW5zZm9ybWVkCisgICAgIHRvIHRoZSAicHJvdmlkZWQiIHNjb3BlLgorICAgICBUaGUgcmVzdWx0aW5nIHppcHBlZCBleGFtcGxlIHByb2plY3Qgc291cmNlcyBhcmUgdGh1cyBhYmxlIHRvIGJ1aWxkIGV4YW1wbGUKKyAgICAgYmluYXJpZXMgdGhhdCBhcmUgc3VpdGFibGUgZm9yIGEgZGVwbG95bWVudCBvbiBjb250YWluZXJzIHdoaWNoIGhvc3QgSmVyc2V5CisgICAgIHJ1bnRpbWUgYnkgZGVmYXVsdCAoZS5nLiBHbGFzc0Zpc2gpLgorICAgIC0tPgorICAgIDxpZD53bHMxMjEzLXByb2plY3Qtc3JjPC9pZD4KKyAgICA8Zm9ybWF0cz4KKyAgICAgICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KKyAgICA8L2Zvcm1hdHM+CisgICAgPGZpbGVTZXRzPgorICAgICAgICA8ZmlsZVNldD4KKyAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtwcm9qZWN0LmJhc2VkaXJ9PC9kaXJlY3Rvcnk+CisgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5Pi88L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgIDx1c2VEZWZhdWx0RXhjbHVkZXM+dHJ1ZTwvdXNlRGVmYXVsdEV4Y2x1ZGVzPgorICAgICAgICAgICAgPGV4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDxleGNsdWRlPnBvbS54bWw8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovV0VCLUlORi93ZWIueG1sPC9leGNsdWRlPgorICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL3RhcmdldC8qKjwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi8qLmltbDwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9nbGFzc2Zpc2gtd2ViLnhtbDwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi9zdW4td2ViLnhtbDwvZXhjbHVkZT4KKyAgICAgICAgICAgIDwvZXhjbHVkZXM+CisgICAgICAgIDwvZmlsZVNldD4KKyAgICAgICAgPGZpbGVTZXQ+CisgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7cHJvamVjdC5iYXNlZGlyfS90YXJnZXQvd2xzMTIxMy1wb20tZmlsZTwvZGlyZWN0b3J5PgorICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4vPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgIDwvZmlsZVNldD4KKyAgICAgICAgPGZpbGVTZXQ+CisgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7cHJvamVjdC5iYXNlZGlyfS90YXJnZXQvd2xzMTIxMy13ZWIteG1sLWZpbGUvc3JjL21haW4vd2ViYXBwL1dFQi1JTkY8L2RpcmVjdG9yeT4KKyAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgIDwvZmlsZVNldD4KKyAgICAgICAgPGZpbGVTZXQ+CisgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7cHJvamVjdC5iYXNlZGlyfS8uLi9ldGMvd2xzMTIxMzwvZGlyZWN0b3J5PgorICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4vPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgIDwvZmlsZVNldD4KKyAgICA8L2ZpbGVTZXRzPgorPC9hc3NlbWJseT4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2Jvb2ttYXJrLWVtL1JFQURNRS5NRCBiL2V4YW1wbGVzL2Jvb2ttYXJrLWVtL1JFQURNRS5NRApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjliNTdkCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYm9va21hcmstZW0vUkVBRE1FLk1ECkBAIC0wLDAgKzEsNjAgQEAKK1svL106ICMgIiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIgorWy8vXTogIyAiICIKK1svL106ICMgIiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgIgorWy8vXTogIyAiIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0ICIKK1svL106ICMgIiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuICIKK1svL106ICMgIiAiCitbLy9dOiAjICIgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZSAiCisKK0Jvb2ttYXJrIEVNIEV4YW1wbGUKKz09PT09PT09PT09PT09PT09PT0KKworVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gdXNlIEpQQSBpbiB0aGUgYmFja2VuZC4gVGhlIGV4YW1wbGUgaXMKK2Jhc2VkIG9uIGJvb2ttYXJrIGV4YW1wbGUgZnJvbSB0aGUgW1JFU1RmdWwgV2ViCitTZXJ2aWNlc10oaHR0cDovL3d3dy5vcmVpbGx5LmNvbS9jYXRhbG9nLzk3ODA1OTY1MjkyNjAvKSBib29rLCB3aGljaCB3YXMKK2luc3BpcmVkIGJ5IHRoZSBbaHR0cDovL2RlbC5pY2lvLnVzL10oaHR0cDovL2RlbC5pY2lvLnVzL3YxKSB3ZWIKK3NlcnZpY2UuCisKK0EgYm9va21hcmsgd2ViIGFwcGxpY2F0aW9uIGlzIHByZXNlbnRlZCB0aGF0IGlzIGNhcGFibGUgb2YgbWFpbnRhaW5pbmcKK3VzZXJzIGFuZCB0aGVpciBib29rbWFya3MuCisKK0NvbnRlbnRzCistLS0tLS0tLQorCitUaGUgbWFwcGluZyBvZiB0aGUgVVJJIHBhdGggc3BhY2UgaXMgcHJlc2VudGVkIGluIHRoZSBmb2xsb3dpbmcgdGFibGU6CisKK1VSSSBwYXRoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBSZXNvdXJjZSBjbGFzcyAgICAgIHwgSFRUUCBtZXRob2RzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb3RlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKl8vdXNlcnNfKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVXNlcnNSZXNvdXJjZSAgICAgICB8IEdFVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUmV0dXJucyBhIGxpc3Qgb2YgdXNlcnMuCisqKl8vdXNlcnMve3VzZXJpZH1fKiogICAgICAgICAgICAgICAgICAgIHwgVXNlclJlc291cmNlICAgICAgICB8IEdFVCwgUFVUICh1c2VkIGFsc28gZm9yIGNyZWF0aW5nIG5ldyB1c2VycyksIERFTEVURSAgIHwgUmV0dXJucyB1c2VyIGRldGFpbHMKKyoqXy91c2Vycy97dXNlcmlkfS9ib29rbWFya3NfKiogICAgICAgICAgfCBCb29rbWFya3NSZXNvdXJjZSAgIHwgR0VULCBQT1NUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBSZXR1cm5zIGEgbGlzdCBvZiBib29rbWFya3MgZm9yIGFjdHVhbCB1c2VyIHJlc291cmNlLgorKipfL3VzZXJzL3t1c2VyaWR9L2Jvb2ttYXJrcy97Ym1pZH1fKiogICB8IEJvb2ttYXJrUmVzb3VyY2UgICAgfCBHRVQsIFBVVCwgREVMRVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJldHVybnMgYm9va21hcmsgdXJpIGFuZCBhIGxvbmcgYW5kIHNob3J0IGRlc2NyaXB0aW9uLgorCitSdW5uaW5nIHRoZSBFeGFtcGxlCistLS0tLS0tLS0tLS0tLS0tLS0tCisKK0Jvb2ttYXJrIGV4YW1wbGUgcnVucyBvbiBHbGFzc2Zpc2ggMy4xIGFwcGxpY2F0aW9uIHNlcnZlcgorKFtodHRwczovL2phdmFlZS5naXRodWIuaW8vZ2xhc3NmaXNoL10oaHR0cHM6Ly9qYXZhZWUuZ2l0aHViLmlvL2dsYXNzZmlzaC8pKSBhbmQgbmVlZHMgYSBydW5uaW5nIEphdmFEQgorKDxodHRwOi8vd3d3Lm9yYWNsZS5jb20vdGVjaG5ldHdvcmsvamF2YS9qYXZhZGIvb3ZlcnZpZXcvaW5kZXguaHRtbD4pCitpbnN0YW5jZSBmb3IgdW5kZXJseWluZyBkYXRhIChpdCBjb21lcyBhbG9uZyB3aXRoIEdsYXNzRmlzaCAzLjEpLgorCitQcmVzdW1pbmcsIHlvdSBoYXZlIGluc3RhbGxlZCBHbGFzc2Zpc2ggMy4xLiBgQVNfSE9NRWAgdmFyaWFibGUgc2hvdWxkCitwb2ludCB0byB5b3VyIGdsYXNzZmlzaCBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LgorCisjIyMjIEJ1aWxkaW5nIEFuZCBTdGFydGluZyBUaGUgQm9va21hcmsgU2VydmljZQorCitZb3UgdGhlbiBidWlsZCBhbmQgcnVuIHRoZSBleGFtcGxlIGJ5CisKKyAgICBtdm4gcGFja2FnZQorICAgICRBU19IT01FL2Jpbi9hc2FkbWluIHN0YXJ0LWRvbWFpbgorICAgICRBU19IT01FL2Jpbi9hc2FkbWluIHN0YXJ0LWRhdGFiYXNlCisgICAgJEFTX0hPTUUvYmluL2FzYWRtaW4gZGVwbG95IHRhcmdldC9ib29rbWFyay1lbS53YXIKKworIyMjIyBUZXN0IENsaWVudCBSdW5uaW5nCisKKyAgICBtdm4gdGVzdCAtRGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIuZmFjdG9yeT1vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkgLURqZXJzZXkuY29uZmlnLnRlc3QubG9nZ2luZy5lbmFibGU9dHJ1ZSAtRGplcnNleS5jb25maWcudGVzdC5sb2dnaW5nLmR1bXBFbnRpdHk9dHJ1ZSAtRGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydD04MDgwIC1QdGVzdAorCitMaW5rcworLS0tLS0KKworPGh0dHA6Ly9qYXZhLm5ldC9wcm9qZWN0cy9icGNhdGFsb2cvc291cmNlcy9zdm4vY29udGVudC90cnVuay9lZTUvZG9jcy9wZXJzaXN0ZW5jZS93ZWJvbmx5YXBwLmh0bWw/cmF3PXRydWU+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9ib29rbWFyay1lbS9wb20ueG1sIGIvZXhhbXBsZXMvYm9va21hcmstZW0vcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjkyN2QzCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYm9va21hcmstZW0vcG9tLnhtbApAQCAtMCwwICsxLDEyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKworICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD53ZWJhcHAtZXhhbXBsZS1wYXJlbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vd2ViYXBwLWV4YW1wbGUtcGFyZW50L3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmJvb2ttYXJrLWVtPC9hcnRpZmFjdElkPgorICAgIDxuYW1lPmplcnNleS1leGFtcGxlcy1ib29rbWFyay1lbTwvbmFtZT4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorCisgICAgPGRlc2NyaXB0aW9uPkplcnNleSBCb29rbWFyayBleGFtcGxlIHVzaW5nIEVudGl0eU1hbmFnZXIuPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtanNvbi1qZXR0aXNvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnBlcnNpc3RlbmNlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGVyc2lzdGVuY2UtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWhrMjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguZWpiPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguZWpiLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7ZWpiLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LmFubm90YXRpb248L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5hbm5vdGF0aW9uLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC50cmFuc2FjdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmp0YTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjEuMTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8IS0tIFJ1biB0aGUgYXBwbGljYXRpb24gdXNpbmcgIm12biBlbWJlZGRlZC1nbGFzc2Zpc2g6cnVuIiAtLT4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5lbWJlZGRlZDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1lbWJlZGRlZC1nbGFzc2Zpc2gtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5ydW4tZXh0ZXJuYWwtdGVzdHM8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN5c3RlbVByb3BlcnR5VmFyaWFibGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5mYWN0b3J5PiR7ZXh0ZXJuYWwuY29udGFpbmVyLmZhY3Rvcnl9PC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+JHtleHRlcm5hbC5jb250YWluZXIucG9ydH08L2plcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N5c3RlbVByb3BlcnR5VmFyaWFibGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICAgICAgPHByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgPCEtLSBFeHRlcm5hbCB0ZXN0IGNvbnRhaW5lciBjb25maWd1cmF0aW9uIGlzIGRvbmUgdmlhIHByb3BlcnRpZXMgdG8gYWxsb3cgb3ZlcnJpZGluZyB2aWEgY29tbWFuZCBsaW5lLiAtLT4KKyAgICAgICAgICAgICAgICA8ZXh0ZXJuYWwuY29udGFpbmVyLmZhY3Rvcnk+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5PC9leHRlcm5hbC5jb250YWluZXIuZmFjdG9yeT4KKyAgICAgICAgICAgICAgICA8ZXh0ZXJuYWwuY29udGFpbmVyLnBvcnQ+ODA4MDwvZXh0ZXJuYWwuY29udGFpbmVyLnBvcnQ+CisgICAgICAgICAgICAgICAgPG1hdmVuLnRlc3Quc2tpcD5mYWxzZTwvbWF2ZW4udGVzdC5za2lwPgorICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnJlbGVhc2U8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD54bWwtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2tpcD50cnVlPC9za2lwPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8bWF2ZW4udGVzdC5za2lwPnRydWU8L21hdmVuLnRlc3Quc2tpcD4KKyAgICA8L3Byb3BlcnRpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2Jvb2ttYXJrLWVtL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYm9va21hcmtfZW0vTXlBcHBsaWNhdGlvbi5qYXZhIGIvZXhhbXBsZXMvYm9va21hcmstZW0vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9ib29rbWFya19lbS9NeUFwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNkMDEzOAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2Jvb2ttYXJrLWVtL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYm9va21hcmtfZW0vTXlBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuYm9va21hcmtfZW07CisKK2ltcG9ydCBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGg7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5ib29rbWFya19lbS5yZXNvdXJjZS5Vc2Vyc1Jlc291cmNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHRpc29uLkpldHRpc29uRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BBcHBsaWNhdGlvblBhdGgoIi8iKQorcHVibGljIGNsYXNzIE15QXBwbGljYXRpb24gZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisKKyAgICBwdWJsaWMgTXlBcHBsaWNhdGlvbigpIHsKKyAgICAgICAgcmVnaXN0ZXJDbGFzc2VzKFVzZXJzUmVzb3VyY2UuY2xhc3MpOworICAgICAgICByZWdpc3RlcihuZXcgSmV0dGlzb25GZWF0dXJlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2Jvb2ttYXJrLWVtL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYm9va21hcmtfZW0vZW50aXR5L0Jvb2ttYXJrRW50aXR5LmphdmEgYi9leGFtcGxlcy9ib29rbWFyay1lbS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2Jvb2ttYXJrX2VtL2VudGl0eS9Cb29rbWFya0VudGl0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZDRkNzcKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9ib29rbWFyay1lbS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2Jvb2ttYXJrX2VtL2VudGl0eS9Cb29rbWFya0VudGl0eS5qYXZhCkBAIC0wLDAgKzEsMjYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmJvb2ttYXJrX2VtLmVudGl0eTsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5NYW5hZ2VkQmVhbjsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW47CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW1iZWRkZWRJZDsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHk7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuSm9pbkNvbHVtbjsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5NYW55VG9PbmU7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuTmFtZWRRdWVyaWVzOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLk5hbWVkUXVlcnk7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuVGFibGU7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuVGVtcG9yYWw7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuVGVtcG9yYWxUeXBlOworCisvKioKKyAqIEVudGl0eSBjbGFzcyBCb29rbWFya0VudGl0eS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitARW50aXR5CitAVGFibGUobmFtZSA9ICJCT09LTUFSS1MiKQorQE5hbWVkUXVlcmllcyh7CisgICAgICAgIEBOYW1lZFF1ZXJ5KG5hbWUgPSAiQm9va21hcmtFbnRpdHkuZmluZEJ5VXNlcmlkIiwKKyAgICAgICAgICAgICAgICBxdWVyeSA9ICJTRUxFQ1QgYiBGUk9NIEJvb2ttYXJrRW50aXR5IGIgV0hFUkUgYi5ib29rbWFya0VudGl0eVBLLnVzZXJpZCA9IDp1c2VyaWQiKSwKKyAgICAgICAgQE5hbWVkUXVlcnkobmFtZSA9ICJCb29rbWFya0VudGl0eS5maW5kQnlCbWlkIiwKKyAgICAgICAgICAgICAgICBxdWVyeSA9ICJTRUxFQ1QgYiBGUk9NIEJvb2ttYXJrRW50aXR5IGIgV0hFUkUgYi5ib29rbWFya0VudGl0eVBLLmJtaWQgPSA6Ym1pZCIpLAorICAgICAgICBATmFtZWRRdWVyeShuYW1lID0gIkJvb2ttYXJrRW50aXR5LmZpbmRCeVVyaSIsIHF1ZXJ5ID0gIlNFTEVDVCBiIEZST00gQm9va21hcmtFbnRpdHkgYiBXSEVSRSBiLnVyaSA9IDp1cmkiKSwKKyAgICAgICAgQE5hbWVkUXVlcnkobmFtZSA9ICJCb29rbWFya0VudGl0eS5maW5kQnlVcGRhdGVkIiwgcXVlcnkgPSAiU0VMRUNUIGIgRlJPTSBCb29rbWFya0VudGl0eSBiIFdIRVJFIGIudXBkYXRlZCA9IDp1cGRhdGVkIiksCisgICAgICAgIEBOYW1lZFF1ZXJ5KG5hbWUgPSAiQm9va21hcmtFbnRpdHkuZmluZEJ5TGRlc2MiLCBxdWVyeSA9ICJTRUxFQ1QgYiBGUk9NIEJvb2ttYXJrRW50aXR5IGIgV0hFUkUgYi5sZGVzYyA9IDpsZGVzYyIpLAorICAgICAgICBATmFtZWRRdWVyeShuYW1lID0gIkJvb2ttYXJrRW50aXR5LmZpbmRCeVNkZXNjIiwgcXVlcnkgPSAiU0VMRUNUIGIgRlJPTSBCb29rbWFya0VudGl0eSBiIFdIRVJFIGIuc2Rlc2MgPSA6c2Rlc2MiKQorfSkKK0BNYW5hZ2VkQmVhbgorQFN1cHByZXNzV2FybmluZ3MoIlVudXNlZERlY2xhcmF0aW9uIikKK3B1YmxpYyBjbGFzcyBCb29rbWFya0VudGl0eSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKyAgICAvKioKKyAgICAgKiBFbWJlZGRlZElkIHByaW1hcnkga2V5IGZpZWxkCisgICAgICovCisgICAgQEVtYmVkZGVkSWQKKyAgICBwcm90ZWN0ZWQgQm9va21hcmtFbnRpdHlQSyBib29rbWFya0VudGl0eVBLOworCisgICAgQENvbHVtbihuYW1lID0gIlVSSSIsIG51bGxhYmxlID0gZmFsc2UpCisgICAgcHJpdmF0ZSBTdHJpbmcgdXJpOworCisgICAgQENvbHVtbihuYW1lID0gIlVQREFURUQiKQorICAgIEBUZW1wb3JhbChUZW1wb3JhbFR5cGUuVElNRVNUQU1QKQorICAgIHByaXZhdGUgRGF0ZSB1cGRhdGVkOworCisgICAgQENvbHVtbihuYW1lID0gIkxERVNDIikKKyAgICBwcml2YXRlIFN0cmluZyBsZGVzYzsKKworICAgIEBDb2x1bW4obmFtZSA9ICJTREVTQyIpCisgICAgcHJpdmF0ZSBTdHJpbmcgc2Rlc2M7CisKKyAgICBASm9pbkNvbHVtbihuYW1lID0gIlVTRVJJRCIsIHJlZmVyZW5jZWRDb2x1bW5OYW1lID0gIlVTRVJJRCIsIGluc2VydGFibGUgPSBmYWxzZSwgdXBkYXRhYmxlID0gZmFsc2UpCisgICAgQE1hbnlUb09uZQorICAgIHByaXZhdGUgVXNlckVudGl0eSB1c2VyRW50aXR5OworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBCb29rbWFya0VudGl0eQorICAgICAqLworICAgIHB1YmxpYyBCb29rbWFya0VudGl0eSgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIEJvb2ttYXJrRW50aXR5IHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYm9va21hcmtFbnRpdHlQSyB0aGUgYm9va21hcmtFbnRpdHlQSyBvZiB0aGUgQm9va21hcmtFbnRpdHkKKyAgICAgKi8KKyAgICBwdWJsaWMgQm9va21hcmtFbnRpdHkoQm9va21hcmtFbnRpdHlQSyBib29rbWFya0VudGl0eVBLKSB7CisgICAgICAgIHRoaXMuYm9va21hcmtFbnRpdHlQSyA9IGJvb2ttYXJrRW50aXR5UEs7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBCb29rbWFya0VudGl0eSB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIGJvb2ttYXJrRW50aXR5UEsgdGhlIGJvb2ttYXJrRW50aXR5UEsgb2YgdGhlIEJvb2ttYXJrRW50aXR5CisgICAgICogQHBhcmFtIHVyaSB0aGUgdXJpIG9mIHRoZSBCb29rbWFya0VudGl0eQorICAgICAqLworICAgIHB1YmxpYyBCb29rbWFya0VudGl0eShCb29rbWFya0VudGl0eVBLIGJvb2ttYXJrRW50aXR5UEssIFN0cmluZyB1cmkpIHsKKyAgICAgICAgdGhpcy5ib29rbWFya0VudGl0eVBLID0gYm9va21hcmtFbnRpdHlQSzsKKyAgICAgICAgdGhpcy51cmkgPSB1cmk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBCb29rbWFya0VudGl0eVBLIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYm1pZCB0aGUgYm1pZCBvZiB0aGUgQm9va21hcmtFbnRpdHlQSworICAgICAqIEBwYXJhbSB1c2VyaWQgdGhlIHVzZXJpZCBvZiB0aGUgQm9va21hcmtFbnRpdHlQSworICAgICAqLworICAgIHB1YmxpYyBCb29rbWFya0VudGl0eShTdHJpbmcgYm1pZCwgU3RyaW5nIHVzZXJpZCkgeworICAgICAgICB0aGlzLmJvb2ttYXJrRW50aXR5UEsgPSBuZXcgQm9va21hcmtFbnRpdHlQSyhibWlkLCB1c2VyaWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGJvb2ttYXJrRW50aXR5UEsgb2YgdGhpcyBCb29rbWFya0VudGl0eS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGJvb2ttYXJrRW50aXR5UEsKKyAgICAgKi8KKyAgICBwdWJsaWMgQm9va21hcmtFbnRpdHlQSyBnZXRCb29rbWFya0VudGl0eVBLKCkgeworICAgICAgICByZXR1cm4gdGhpcy5ib29rbWFya0VudGl0eVBLOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGJvb2ttYXJrRW50aXR5UEsgb2YgdGhpcyBCb29rbWFya0VudGl0eSB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIGJvb2ttYXJrRW50aXR5UEsgdGhlIG5ldyBib29rbWFya0VudGl0eVBLCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Qm9va21hcmtFbnRpdHlQSyhCb29rbWFya0VudGl0eVBLIGJvb2ttYXJrRW50aXR5UEspIHsKKyAgICAgICAgdGhpcy5ib29rbWFya0VudGl0eVBLID0gYm9va21hcmtFbnRpdHlQSzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB1cmkgb2YgdGhpcyBCb29rbWFya0VudGl0eS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHVyaQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXJpKCkgeworICAgICAgICByZXR1cm4gdGhpcy51cmk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdXJpIG9mIHRoaXMgQm9va21hcmtFbnRpdHkgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgdGhlIG5ldyB1cmkKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVcmkoU3RyaW5nIHVyaSkgeworICAgICAgICB0aGlzLnVyaSA9IHVyaTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB1cGRhdGVkIG9mIHRoaXMgQm9va21hcmtFbnRpdHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSB1cGRhdGVkCisgICAgICovCisgICAgcHVibGljIERhdGUgZ2V0VXBkYXRlZCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB1cGRhdGVkIG9mIHRoaXMgQm9va21hcmtFbnRpdHkgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cGRhdGVkIHRoZSBuZXcgdXBkYXRlZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVwZGF0ZWQoRGF0ZSB1cGRhdGVkKSB7CisgICAgICAgIHRoaXMudXBkYXRlZCA9IHVwZGF0ZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbGRlc2Mgb2YgdGhpcyBCb29rbWFya0VudGl0eS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGxkZXNjCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRMZGVzYygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubGRlc2M7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbGRlc2Mgb2YgdGhpcyBCb29rbWFya0VudGl0eSB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIGxkZXNjIHRoZSBuZXcgbGRlc2MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRMZGVzYyhTdHJpbmcgbGRlc2MpIHsKKyAgICAgICAgdGhpcy5sZGVzYyA9IGxkZXNjOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHNkZXNjIG9mIHRoaXMgQm9va21hcmtFbnRpdHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBzZGVzYworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2Rlc2MoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnNkZXNjOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHNkZXNjIG9mIHRoaXMgQm9va21hcmtFbnRpdHkgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZGVzYyB0aGUgbmV3IHNkZXNjCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2Rlc2MoU3RyaW5nIHNkZXNjKSB7CisgICAgICAgIHRoaXMuc2Rlc2MgPSBzZGVzYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB1c2VyRW50aXR5IG9mIHRoaXMgQm9va21hcmtFbnRpdHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSB1c2VyRW50aXR5CisgICAgICovCisgICAgcHVibGljIFVzZXJFbnRpdHkgZ2V0VXNlckVudGl0eSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudXNlckVudGl0eTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB1c2VyRW50aXR5IG9mIHRoaXMgQm9va21hcmtFbnRpdHkgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VyRW50aXR5IHRoZSBuZXcgdXNlckVudGl0eQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZXJFbnRpdHkoVXNlckVudGl0eSB1c2VyRW50aXR5KSB7CisgICAgICAgIHRoaXMudXNlckVudGl0eSA9IHVzZXJFbnRpdHk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGhhc2ggY29kZSB2YWx1ZSBmb3IgdGhlIG9iamVjdC4gIFRoaXMgaW1wbGVtZW50YXRpb24gY29tcHV0ZXMKKyAgICAgKiBhIGhhc2ggY29kZSB2YWx1ZSBiYXNlZCBvbiB0aGUgaWQgZmllbGRzIGluIHRoaXMgb2JqZWN0LgorICAgICAqCisgICAgICogQHJldHVybiBhIGhhc2ggY29kZSB2YWx1ZSBmb3IgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGhhc2ggPSAwOworICAgICAgICBoYXNoICs9ICh0aGlzLmJvb2ttYXJrRW50aXR5UEsgIT0gbnVsbCA/IHRoaXMuYm9va21hcmtFbnRpdHlQSy5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIHJldHVybiBoYXNoOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZXMgd2hldGhlciBhbm90aGVyIG9iamVjdCBpcyBlcXVhbCB0byB0aGlzIEJvb2ttYXJrRW50aXR5LiAgVGhlIHJlc3VsdCBpcworICAgICAqIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFuZCBvbmx5IGlmIHRoZSBhcmd1bWVudCBpcyBub3QgbnVsbCBhbmQgaXMgYSBCb29rbWFya0VudGl0eSBvYmplY3QgdGhhdAorICAgICAqIGhhcyB0aGUgc2FtZSBpZCBmaWVsZCB2YWx1ZXMgYXMgdGhpcyBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JqZWN0IHRoZSByZWZlcmVuY2Ugb2JqZWN0IHdpdGggd2hpY2ggdG8gY29tcGFyZQorICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBvYmplY3QgaXMgdGhlIHNhbWUgYXMgdGhlIGFyZ3VtZW50OworICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgeworICAgICAgICAvLyBUT0RPOiBXYXJuaW5nIC0gdGhpcyBtZXRob2Qgd29uJ3Qgd29yayBpbiB0aGUgY2FzZSB0aGUgaWQgZmllbGRzIGFyZSBub3Qgc2V0CisgICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIEJvb2ttYXJrRW50aXR5KSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIEJvb2ttYXJrRW50aXR5IG90aGVyID0gKEJvb2ttYXJrRW50aXR5KSBvYmplY3Q7CisgICAgICAgIHJldHVybiAhKHRoaXMuYm9va21hcmtFbnRpdHlQSyAhPSBvdGhlci5ib29rbWFya0VudGl0eVBLICYmICh0aGlzLmJvb2ttYXJrRW50aXR5UEsgPT0gbnVsbCB8fCAhdGhpcy5ib29rbWFya0VudGl0eVBLCisgICAgICAgICAgICAgICAgLmVxdWFscyhvdGhlci5ib29rbWFya0VudGl0eVBLKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG9iamVjdC4gIFRoaXMgaW1wbGVtZW50YXRpb24gY29uc3RydWN0cworICAgICAqIHRoYXQgcmVwcmVzZW50YXRpb24gYmFzZWQgb24gdGhlIGlkIGZpZWxkcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG9iamVjdC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIkJvb2ttYXJrRW50aXR5eyIKKyAgICAgICAgICAgICAgICsgImJvb2ttYXJrRW50aXR5UEs9IiArIGJvb2ttYXJrRW50aXR5UEsKKyAgICAgICAgICAgICAgICsgJ30nOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2Jvb2ttYXJrLWVtL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYm9va21hcmtfZW0vZW50aXR5L0Jvb2ttYXJrRW50aXR5UEsuamF2YSBiL2V4YW1wbGVzL2Jvb2ttYXJrLWVtL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYm9va21hcmtfZW0vZW50aXR5L0Jvb2ttYXJrRW50aXR5UEsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjJjMzZjCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYm9va21hcmstZW0vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9ib29rbWFya19lbS9lbnRpdHkvQm9va21hcmtFbnRpdHlQSy5qYXZhCkBAIC0wLDAgKzEsMTQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmJvb2ttYXJrX2VtLmVudGl0eTsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkVtYmVkZGFibGU7CisKKy8qKgorICogUHJpbWFyeSBLZXkgY2xhc3MgQm9va21hcmtFbnRpdHlQSyBmb3IgZW50aXR5IGNsYXNzIEJvb2ttYXJrRW50aXR5LgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJVbnVzZWREZWNsYXJhdGlvbiIpCitARW1iZWRkYWJsZQorcHVibGljIGNsYXNzIEJvb2ttYXJrRW50aXR5UEsgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisgICAgQENvbHVtbihuYW1lID0gIlVTRVJJRCIsIG51bGxhYmxlID0gZmFsc2UpCisgICAgcHJpdmF0ZSBTdHJpbmcgdXNlcmlkOworCisgICAgQENvbHVtbihuYW1lID0gIkJNSUQiLCBudWxsYWJsZSA9IGZhbHNlKQorICAgIHByaXZhdGUgU3RyaW5nIGJtaWQ7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIEJvb2ttYXJrRW50aXR5UEsKKyAgICAgKi8KKyAgICBwdWJsaWMgQm9va21hcmtFbnRpdHlQSygpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIEJvb2ttYXJrRW50aXR5UEsgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBibWlkIHRoZSBibWlkIG9mIHRoZSBCb29rbWFya0VudGl0eVBLCisgICAgICogQHBhcmFtIHVzZXJpZCB0aGUgdXNlcmlkIG9mIHRoZSBCb29rbWFya0VudGl0eVBLCisgICAgICovCisgICAgcHVibGljIEJvb2ttYXJrRW50aXR5UEsoU3RyaW5nIGJtaWQsIFN0cmluZyB1c2VyaWQpIHsKKyAgICAgICAgdGhpcy5ibWlkID0gYm1pZDsKKyAgICAgICAgdGhpcy51c2VyaWQgPSB1c2VyaWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdXNlcmlkIG9mIHRoaXMgQm9va21hcmtFbnRpdHlQSy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHVzZXJpZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlcmlkKCkgeworICAgICAgICByZXR1cm4gdGhpcy51c2VyaWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdXNlcmlkIG9mIHRoaXMgQm9va21hcmtFbnRpdHlQSyB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIHVzZXJpZCB0aGUgbmV3IHVzZXJpZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZXJpZChTdHJpbmcgdXNlcmlkKSB7CisgICAgICAgIHRoaXMudXNlcmlkID0gdXNlcmlkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGJtaWQgb2YgdGhpcyBCb29rbWFya0VudGl0eVBLLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgYm1pZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Qm1pZCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuYm1pZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBibWlkIG9mIHRoaXMgQm9va21hcmtFbnRpdHlQSyB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIGJtaWQgdGhlIG5ldyBibWlkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Qm1pZChTdHJpbmcgYm1pZCkgeworICAgICAgICB0aGlzLmJtaWQgPSBibWlkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoZSBvYmplY3QuICBUaGlzIGltcGxlbWVudGF0aW9uIGNvbXB1dGVzCisgICAgICogYSBoYXNoIGNvZGUgdmFsdWUgYmFzZWQgb24gdGhlIGlkIGZpZWxkcyBpbiB0aGlzIG9iamVjdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCBoYXNoID0gMDsKKyAgICAgICAgaGFzaCArPSAodGhpcy5ibWlkICE9IG51bGwgPyB0aGlzLmJtaWQuaGFzaENvZGUoKSA6IDApOworICAgICAgICBoYXNoICs9ICh0aGlzLnVzZXJpZCAhPSBudWxsID8gdGhpcy51c2VyaWQuaGFzaENvZGUoKSA6IDApOworICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYW5vdGhlciBvYmplY3QgaXMgZXF1YWwgdG8gdGhpcyBCb29rbWFya0VudGl0eVBLLiAgVGhlIHJlc3VsdCBpcworICAgICAqIDxjb2RlPnRydWU8L2NvZGU+IGlmIGFuZCBvbmx5IGlmIHRoZSBhcmd1bWVudCBpcyBub3QgbnVsbCBhbmQgaXMgYSBCb29rbWFya0VudGl0eVBLIG9iamVjdCB0aGF0CisgICAgICogaGFzIHRoZSBzYW1lIGlkIGZpZWxkIHZhbHVlcyBhcyB0aGlzIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvYmplY3QgdGhlIHJlZmVyZW5jZSBvYmplY3Qgd2l0aCB3aGljaCB0byBjb21wYXJlCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIG9iamVjdCBpcyB0aGUgc2FtZSBhcyB0aGUgYXJndW1lbnQ7CisgICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJTdHJpbmdFcXVhbGl0eSIpCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmplY3QpIHsKKyAgICAgICAgLy8gVE9ETzogV2FybmluZyAtIHRoaXMgbWV0aG9kIHdvbid0IHdvcmsgaW4gdGhlIGNhc2UgdGhlIGlkIGZpZWxkcyBhcmUgbm90IHNldAorICAgICAgICBpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBCb29rbWFya0VudGl0eVBLKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQm9va21hcmtFbnRpdHlQSyBvdGhlciA9IChCb29rbWFya0VudGl0eVBLKSBvYmplY3Q7CisgICAgICAgIGlmICh0aGlzLmJtaWQgIT0gb3RoZXIuYm1pZCAmJiAodGhpcy5ibWlkID09IG51bGwgfHwgIXRoaXMuYm1pZC5lcXVhbHMob3RoZXIuYm1pZCkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMudXNlcmlkICE9IG90aGVyLnVzZXJpZCAmJiAodGhpcy51c2VyaWQgPT0gbnVsbCB8fCAhdGhpcy51c2VyaWQuZXF1YWxzKG90aGVyLnVzZXJpZCkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvYmplY3QuICBUaGlzIGltcGxlbWVudGF0aW9uIGNvbnN0cnVjdHMKKyAgICAgKiB0aGF0IHJlcHJlc2VudGF0aW9uIGJhc2VkIG9uIHRoZSBpZCBmaWVsZHMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvYmplY3QuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJCb29rbWFya0VudGl0eVBLeyIKKyAgICAgICAgICAgICAgICsgInVzZXJpZD0nIiArIHVzZXJpZCArICdcJycKKyAgICAgICAgICAgICAgICsgIiwgYm1pZD0nIiArIGJtaWQgKyAnXCcnCisgICAgICAgICAgICAgICArICd9JzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9ib29rbWFyay1lbS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2Jvb2ttYXJrX2VtL2VudGl0eS9Vc2VyRW50aXR5LmphdmEgYi9leGFtcGxlcy9ib29rbWFyay1lbS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2Jvb2ttYXJrX2VtL2VudGl0eS9Vc2VyRW50aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZhMmU2OQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2Jvb2ttYXJrLWVtL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYm9va21hcmtfZW0vZW50aXR5L1VzZXJFbnRpdHkuamF2YQpAQCAtMCwwICsxLDIxOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5ib29rbWFya19lbS5lbnRpdHk7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkNhc2NhZGVUeXBlOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkNvbHVtbjsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHk7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuSWQ7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuTmFtZWRRdWVyaWVzOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLk5hbWVkUXVlcnk7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuT25lVG9NYW55OworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLlRhYmxlOworCisvKioKKyAqIEVudGl0eSBjbGFzcyBVc2VyRW50aXR5LgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BFbnRpdHkKK0BUYWJsZShuYW1lID0gIlVTRVJTIikKK0BOYW1lZFF1ZXJpZXMoeworICAgICAgICBATmFtZWRRdWVyeShuYW1lID0gIlVzZXJFbnRpdHkuZmluZEJ5VXNlcmlkIiwgcXVlcnkgPSAiU0VMRUNUIHUgRlJPTSBVc2VyRW50aXR5IHUgV0hFUkUgdS51c2VyaWQgPSA6dXNlcmlkIiksCisgICAgICAgIEBOYW1lZFF1ZXJ5KG5hbWUgPSAiVXNlckVudGl0eS5maW5kQnlQYXNzd29yZCIsIHF1ZXJ5ID0gIlNFTEVDVCB1IEZST00gVXNlckVudGl0eSB1IFdIRVJFIHUucGFzc3dvcmQgPSA6cGFzc3dvcmQiKSwKKyAgICAgICAgQE5hbWVkUXVlcnkobmFtZSA9ICJVc2VyRW50aXR5LmZpbmRCeVVzZXJuYW1lIiwgcXVlcnkgPSAiU0VMRUNUIHUgRlJPTSBVc2VyRW50aXR5IHUgV0hFUkUgdS51c2VybmFtZSA9IDp1c2VybmFtZSIpLAorICAgICAgICBATmFtZWRRdWVyeShuYW1lID0gIlVzZXJFbnRpdHkuZmluZEJ5RW1haWwiLCBxdWVyeSA9ICJTRUxFQ1QgdSBGUk9NIFVzZXJFbnRpdHkgdSBXSEVSRSB1LmVtYWlsID0gOmVtYWlsIikKK30pCitAU3VwcHJlc3NXYXJuaW5ncygiVW51c2VkRGVjbGFyYXRpb24iKQorcHVibGljIGNsYXNzIFVzZXJFbnRpdHkgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisgICAgQElkCisgICAgQENvbHVtbihuYW1lID0gIlVTRVJJRCIsIG51bGxhYmxlID0gZmFsc2UpCisgICAgcHJpdmF0ZSBTdHJpbmcgdXNlcmlkOworCisgICAgQENvbHVtbihuYW1lID0gIlBBU1NXT1JEIiwgbnVsbGFibGUgPSBmYWxzZSkKKyAgICBwcml2YXRlIFN0cmluZyBwYXNzd29yZDsKKworICAgIEBDb2x1bW4obmFtZSA9ICJVU0VSTkFNRSIpCisgICAgcHJpdmF0ZSBTdHJpbmcgdXNlcm5hbWU7CisKKyAgICBAQ29sdW1uKG5hbWUgPSAiRU1BSUwiKQorICAgIHByaXZhdGUgU3RyaW5nIGVtYWlsOworCisgICAgQE9uZVRvTWFueShjYXNjYWRlID0gQ2FzY2FkZVR5cGUuQUxMLCBtYXBwZWRCeSA9ICJ1c2VyRW50aXR5IikKKyAgICBwcml2YXRlIENvbGxlY3Rpb248Qm9va21hcmtFbnRpdHk+IGJvb2ttYXJrRW50aXR5Q29sbGVjdGlvbjsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgVXNlckVudGl0eQorICAgICAqLworICAgIHB1YmxpYyBVc2VyRW50aXR5KCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgVXNlckVudGl0eSB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIHVzZXJpZCB0aGUgdXNlcmlkIG9mIHRoZSBVc2VyRW50aXR5CisgICAgICovCisgICAgcHVibGljIFVzZXJFbnRpdHkoU3RyaW5nIHVzZXJpZCkgeworICAgICAgICB0aGlzLnVzZXJpZCA9IHVzZXJpZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIFVzZXJFbnRpdHkgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VyaWQgdGhlIHVzZXJpZCBvZiB0aGUgVXNlckVudGl0eQorICAgICAqIEBwYXJhbSBwYXNzd29yZCB0aGUgcGFzc3dvcmQgb2YgdGhlIFVzZXJFbnRpdHkKKyAgICAgKi8KKyAgICBwdWJsaWMgVXNlckVudGl0eShTdHJpbmcgdXNlcmlkLCBTdHJpbmcgcGFzc3dvcmQpIHsKKyAgICAgICAgdGhpcy51c2VyaWQgPSB1c2VyaWQ7CisgICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB1c2VyaWQgb2YgdGhpcyBVc2VyRW50aXR5LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgdXNlcmlkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRVc2VyaWQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnVzZXJpZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB1c2VyaWQgb2YgdGhpcyBVc2VyRW50aXR5IHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlcmlkIHRoZSBuZXcgdXNlcmlkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlcmlkKFN0cmluZyB1c2VyaWQpIHsKKyAgICAgICAgdGhpcy51c2VyaWQgPSB1c2VyaWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgcGFzc3dvcmQgb2YgdGhpcyBVc2VyRW50aXR5LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgcGFzc3dvcmQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhc3N3b3JkKCkgeworICAgICAgICByZXR1cm4gdGhpcy5wYXNzd29yZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBwYXNzd29yZCBvZiB0aGlzIFVzZXJFbnRpdHkgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXNzd29yZCB0aGUgbmV3IHBhc3N3b3JkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFzc3dvcmQoU3RyaW5nIHBhc3N3b3JkKSB7CisgICAgICAgIHRoaXMucGFzc3dvcmQgPSBwYXNzd29yZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB1c2VybmFtZSBvZiB0aGlzIFVzZXJFbnRpdHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSB1c2VybmFtZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXNlcm5hbWUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnVzZXJuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHVzZXJuYW1lIG9mIHRoaXMgVXNlckVudGl0eSB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIHVzZXJuYW1lIHRoZSBuZXcgdXNlcm5hbWUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VybmFtZShTdHJpbmcgdXNlcm5hbWUpIHsKKyAgICAgICAgdGhpcy51c2VybmFtZSA9IHVzZXJuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGVtYWlsIG9mIHRoaXMgVXNlckVudGl0eS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGVtYWlsCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRFbWFpbCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZW1haWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZW1haWwgb2YgdGhpcyBVc2VyRW50aXR5IHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW1haWwgdGhlIG5ldyBlbWFpbAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVtYWlsKFN0cmluZyBlbWFpbCkgeworICAgICAgICB0aGlzLmVtYWlsID0gZW1haWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgYm9va21hcmtFbnRpdHlDb2xsZWN0aW9uIG9mIHRoaXMgVXNlckVudGl0eS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGJvb2ttYXJrRW50aXR5Q29sbGVjdGlvbgorICAgICAqLworICAgIHB1YmxpYyBDb2xsZWN0aW9uPEJvb2ttYXJrRW50aXR5PiBnZXRCb29rbWFya0VudGl0eUNvbGxlY3Rpb24oKSB7CisgICAgICAgIHJldHVybiB0aGlzLmJvb2ttYXJrRW50aXR5Q29sbGVjdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBib29rbWFya0VudGl0eUNvbGxlY3Rpb24gb2YgdGhpcyBVc2VyRW50aXR5IHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYm9va21hcmtFbnRpdHlDb2xsZWN0aW9uIHRoZSBuZXcgYm9va21hcmtFbnRpdHlDb2xsZWN0aW9uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0Qm9va21hcmtFbnRpdHlDb2xsZWN0aW9uKENvbGxlY3Rpb248Qm9va21hcmtFbnRpdHk+IGJvb2ttYXJrRW50aXR5Q29sbGVjdGlvbikgeworICAgICAgICB0aGlzLmJvb2ttYXJrRW50aXR5Q29sbGVjdGlvbiA9IGJvb2ttYXJrRW50aXR5Q29sbGVjdGlvbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgaGFzaCBjb2RlIHZhbHVlIGZvciB0aGUgb2JqZWN0LiAgVGhpcyBpbXBsZW1lbnRhdGlvbiBjb21wdXRlcworICAgICAqIGEgaGFzaCBjb2RlIHZhbHVlIGJhc2VkIG9uIHRoZSBpZCBmaWVsZHMgaW4gdGhpcyBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgaGFzaCBjb2RlIHZhbHVlIGZvciB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IDA7CisgICAgICAgIGhhc2ggKz0gKHRoaXMudXNlcmlkICE9IG51bGwgPyB0aGlzLnVzZXJpZC5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIHJldHVybiBoYXNoOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZXMgd2hldGhlciBhbm90aGVyIG9iamVjdCBpcyBlcXVhbCB0byB0aGlzIFVzZXJFbnRpdHkuICBUaGUgcmVzdWx0IGlzCisgICAgICogPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYW5kIG9ubHkgaWYgdGhlIGFyZ3VtZW50IGlzIG5vdCBudWxsIGFuZCBpcyBhIFVzZXJFbnRpdHkgb2JqZWN0IHRoYXQKKyAgICAgKiBoYXMgdGhlIHNhbWUgaWQgZmllbGQgdmFsdWVzIGFzIHRoaXMgb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIG9iamVjdCB0aGUgcmVmZXJlbmNlIG9iamVjdCB3aXRoIHdoaWNoIHRvIGNvbXBhcmUKKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgb2JqZWN0IGlzIHRoZSBzYW1lIGFzIHRoZSBhcmd1bWVudDsKKyAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoIlN0cmluZ0VxdWFsaXR5IikKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgeworICAgICAgICAvLyBUT0RPOiBXYXJuaW5nIC0gdGhpcyBtZXRob2Qgd29uJ3Qgd29yayBpbiB0aGUgY2FzZSB0aGUgaWQgZmllbGRzIGFyZSBub3Qgc2V0CisgICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIFVzZXJFbnRpdHkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgVXNlckVudGl0eSBvdGhlciA9IChVc2VyRW50aXR5KSBvYmplY3Q7CisgICAgICAgIHJldHVybiAhKHRoaXMudXNlcmlkICE9IG90aGVyLnVzZXJpZCAmJiAodGhpcy51c2VyaWQgPT0gbnVsbCB8fCAhdGhpcy51c2VyaWQuZXF1YWxzKG90aGVyLnVzZXJpZCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvYmplY3QuICBUaGlzIGltcGxlbWVudGF0aW9uIGNvbnN0cnVjdHMKKyAgICAgKiB0aGF0IHJlcHJlc2VudGF0aW9uIGJhc2VkIG9uIHRoZSBpZCBmaWVsZHMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvYmplY3QuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJVc2VyRW50aXR5eyIKKyAgICAgICAgICAgICAgICsgInVzZXJpZD0nIiArIHVzZXJpZCArICdcJycKKyAgICAgICAgICAgICAgICsgJ30nOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2Jvb2ttYXJrLWVtL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYm9va21hcmtfZW0vZXhjZXB0aW9uL0V4dGVuZGVkTm90Rm91bmRFeGNlcHRpb24uamF2YSBiL2V4YW1wbGVzL2Jvb2ttYXJrLWVtL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYm9va21hcmtfZW0vZXhjZXB0aW9uL0V4dGVuZGVkTm90Rm91bmRFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTI5MjZlCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYm9va21hcmstZW0vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9ib29rbWFya19lbS9leGNlcHRpb24vRXh0ZW5kZWROb3RGb3VuZEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuYm9va21hcmtfZW0uZXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEV4dGVuZGVkTm90Rm91bmRFeGNlcHRpb24gZXh0ZW5kcyBOb3RGb3VuZEV4Y2VwdGlvbiB7CisKKyAgICBwdWJsaWMgRXh0ZW5kZWROb3RGb3VuZEV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICBzdXBlcihSZXNwb25zZS5zdGF0dXMoUmVzcG9uc2UuU3RhdHVzLk5PVF9GT1VORCkuZW50aXR5KG1lc3NhZ2UpLmJ1aWxkKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2Jvb2ttYXJrLWVtL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYm9va21hcmtfZW0vcmVzb3VyY2UvQm9va21hcmtSZXNvdXJjZS5qYXZhIGIvZXhhbXBsZXMvYm9va21hcmstZW0vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9ib29rbWFya19lbS9yZXNvdXJjZS9Cb29rbWFya1Jlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YxYmM0MAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2Jvb2ttYXJrLWVtL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYm9va21hcmtfZW0vcmVzb3VyY2UvQm9va21hcmtSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmJvb2ttYXJrX2VtLnJlc291cmNlOworCitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5ERUxFVEU7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBVVDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CisKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHlNYW5hZ2VyOworaW1wb3J0IGphdmF4LnRyYW5zYWN0aW9uLlVzZXJUcmFuc2FjdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmJvb2ttYXJrX2VtLmVudGl0eS5Cb29rbWFya0VudGl0eTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5ib29rbWFya19lbS5lbnRpdHkuQm9va21hcmtFbnRpdHlQSzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5ib29rbWFya19lbS5lbnRpdHkuVXNlckVudGl0eTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5ib29rbWFya19lbS5leGNlcHRpb24uRXh0ZW5kZWROb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5ib29rbWFya19lbS51dGlsLnR4LlRyYW5zYWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5ib29rbWFya19lbS51dGlsLnR4LlRyYW5zYWN0aW9uYWw7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuamV0dGlzb24uanNvbi5KU09ORXhjZXB0aW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5qZXR0aXNvbi5qc29uLkpTT05PYmplY3Q7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgQm9va21hcmtSZXNvdXJjZSB7CisKKyAgICBVcmlJbmZvIHVyaUluZm87IC8vIGFjdHVhbCB1cmkgaW5mbyBwcm92aWRlZCBieSBwYXJlbnQgcmVzb3VyY2UKKyAgICBFbnRpdHlNYW5hZ2VyIGVtOyAvLyBlbnRpdHkgbWFuYWdlciBwcm92aWRlZCBieSBwYXJlbnQgcmVzb3VyY2UKKyAgICBVc2VyVHJhbnNhY3Rpb24gdXR4OyAvL3VzZXIgdHJhbnNhY3Rpb24gcHJvdmlkZWQgYnkgcGFyZW50IHJlc291cmNlCisKKyAgICBCb29rbWFya0VudGl0eSBib29rbWFya0VudGl0eTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgVXNlclJlc291cmNlCisgICAgICovCisgICAgcHVibGljIEJvb2ttYXJrUmVzb3VyY2UoVXJpSW5mbyB1cmlJbmZvLCBFbnRpdHlNYW5hZ2VyIGVtLCBVc2VyVHJhbnNhY3Rpb24gdXR4LCBVc2VyRW50aXR5IHVzZXJFbnRpdHksIFN0cmluZyBibWlkKSB7CisgICAgICAgIHRoaXMudXJpSW5mbyA9IHVyaUluZm87CisgICAgICAgIHRoaXMuZW0gPSBlbTsKKyAgICAgICAgdGhpcy51dHggPSB1dHg7CisKKyAgICAgICAgYm9va21hcmtFbnRpdHkgPSBlbS5maW5kKEJvb2ttYXJrRW50aXR5LmNsYXNzLCBuZXcgQm9va21hcmtFbnRpdHlQSyhibWlkLCB1c2VyRW50aXR5LmdldFVzZXJpZCgpKSk7CisgICAgICAgIGlmIChudWxsID09IGJvb2ttYXJrRW50aXR5KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXh0ZW5kZWROb3RGb3VuZEV4Y2VwdGlvbigiYm9va21hcmsgd2l0aCB1c2VyaWQ9IgorICAgICAgICAgICAgICAgICAgICArIHVzZXJFbnRpdHkuZ2V0VXNlcmlkKCkgKyAiIGFuZCBibWlkPSIKKyAgICAgICAgICAgICAgICAgICAgKyBibWlkICsgIiBub3QgZm91bmRcbiIpOworICAgICAgICB9CisgICAgICAgIGJvb2ttYXJrRW50aXR5LnNldFVzZXJFbnRpdHkodXNlckVudGl0eSk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgcHVibGljIEpTT05PYmplY3QgZ2V0Qm9va21hcmsoKSB7CisgICAgICAgIHJldHVybiBhc0pzb24oKTsKKyAgICB9CisKKyAgICBAUFVUCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9qc29uIikKKyAgICBwdWJsaWMgdm9pZCBwdXRCb29rbWFyayhKU09OT2JqZWN0IGpzb25FbnRpdHkpIHRocm93cyBKU09ORXhjZXB0aW9uIHsKKworICAgICAgICBib29rbWFya0VudGl0eS5zZXRMZGVzYyhqc29uRW50aXR5LmdldFN0cmluZygibGRlc2MiKSk7CisgICAgICAgIGJvb2ttYXJrRW50aXR5LnNldFNkZXNjKGpzb25FbnRpdHkuZ2V0U3RyaW5nKCJzZGVzYyIpKTsKKyAgICAgICAgYm9va21hcmtFbnRpdHkuc2V0VXBkYXRlZChuZXcgRGF0ZSgpKTsKKworICAgICAgICBUcmFuc2FjdGlvbk1hbmFnZXIubWFuYWdlKHV0eCwgbmV3IFRyYW5zYWN0aW9uYWwoZW0pIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRyYW5zYWN0KCkgeworICAgICAgICAgICAgICAgIGVtLm1lcmdlKGJvb2ttYXJrRW50aXR5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQERFTEVURQorICAgIHB1YmxpYyB2b2lkIGRlbGV0ZUJvb2ttYXJrKCkgeworICAgICAgICBUcmFuc2FjdGlvbk1hbmFnZXIubWFuYWdlKHV0eCwgbmV3IFRyYW5zYWN0aW9uYWwoZW0pIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRyYW5zYWN0KCkgeworICAgICAgICAgICAgICAgIGVtLnBlcnNpc3QoYm9va21hcmtFbnRpdHkpOworICAgICAgICAgICAgICAgIFVzZXJFbnRpdHkgdXNlckVudGl0eSA9IGJvb2ttYXJrRW50aXR5LmdldFVzZXJFbnRpdHkoKTsKKyAgICAgICAgICAgICAgICB1c2VyRW50aXR5LmdldEJvb2ttYXJrRW50aXR5Q29sbGVjdGlvbigpLnJlbW92ZShib29rbWFya0VudGl0eSk7CisgICAgICAgICAgICAgICAgZW0ubWVyZ2UodXNlckVudGl0eSk7CisgICAgICAgICAgICAgICAgZW0ucmVtb3ZlKGJvb2ttYXJrRW50aXR5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBhc1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIHRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIEpTT05PYmplY3QgYXNKc29uKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBKU09OT2JqZWN0KCkKKyAgICAgICAgICAgICAgICAgICAgLnB1dCgidXNlcmlkIiwgYm9va21hcmtFbnRpdHkuZ2V0Qm9va21hcmtFbnRpdHlQSygpLmdldFVzZXJpZCgpKQorICAgICAgICAgICAgICAgICAgICAucHV0KCJzZGVzYyIsIGJvb2ttYXJrRW50aXR5LmdldFNkZXNjKCkpCisgICAgICAgICAgICAgICAgICAgIC5wdXQoImxkZXNjIiwgYm9va21hcmtFbnRpdHkuZ2V0TGRlc2MoKSkKKyAgICAgICAgICAgICAgICAgICAgLnB1dCgidXJpIiwgYm9va21hcmtFbnRpdHkuZ2V0VXJpKCkpOworICAgICAgICB9IGNhdGNoIChKU09ORXhjZXB0aW9uIGplKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBib29rbWFya0VudGl0eS5nZXRCb29rbWFya0VudGl0eVBLKCkuZ2V0VXNlcmlkKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYm9va21hcmstZW0vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9ib29rbWFya19lbS9yZXNvdXJjZS9Cb29rbWFya3NSZXNvdXJjZS5qYXZhIGIvZXhhbXBsZXMvYm9va21hcmstZW0vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9ib29rbWFya19lbS9yZXNvdXJjZS9Cb29rbWFya3NSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNTY2ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9ib29rbWFyay1lbS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2Jvb2ttYXJrX2VtL3Jlc291cmNlL0Jvb2ttYXJrc1Jlc291cmNlLmphdmEKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuYm9va21hcmtfZW0ucmVzb3VyY2U7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CisKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHlNYW5hZ2VyOworaW1wb3J0IGphdmF4LnRyYW5zYWN0aW9uLlVzZXJUcmFuc2FjdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmJvb2ttYXJrX2VtLmVudGl0eS5Cb29rbWFya0VudGl0eTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5ib29rbWFya19lbS51dGlsLnR4LlRyYW5zYWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5ib29rbWFya19lbS51dGlsLnR4LlRyYW5zYWN0aW9uYWw7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuamV0dGlzb24uanNvbi5KU09OQXJyYXk7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmpldHRpc29uLmpzb24uSlNPTkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuamV0dGlzb24uanNvbi5KU09OT2JqZWN0OworCisvKioKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEJvb2ttYXJrc1Jlc291cmNlIHsKKworICAgIFVyaUluZm8gdXJpSW5mbzsgLy8gYWN0dWFsIHVyaSBpbmZvCisgICAgRW50aXR5TWFuYWdlciBlbTsgLy8gZW50aXR5IG1hbmFnZXIgcHJvdmlkZWQgYnkgcGFyZW50IHJlc291cmNlCisgICAgVXNlclRyYW5zYWN0aW9uIHV0eDsgLy8gdXNlciB0cmFuc2FjdGlvbiBwcm92aWRlZCBieSBwYXJlbnQgcmVzb3VyY2UKKworICAgIFVzZXJSZXNvdXJjZSB1c2VyUmVzb3VyY2U7IC8vIHBhcmVudCB1c2VyIHJlc291cmNlCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIEJvb2ttYXJrc1Jlc291cmNlCisgICAgICovCisgICAgcHVibGljIEJvb2ttYXJrc1Jlc291cmNlKFVyaUluZm8gdXJpSW5mbywgRW50aXR5TWFuYWdlciBlbSwgVXNlclRyYW5zYWN0aW9uIHV0eCwgVXNlclJlc291cmNlIHVzZXJSZXNvdXJjZSkgeworICAgICAgICB0aGlzLnVyaUluZm8gPSB1cmlJbmZvOworICAgICAgICB0aGlzLmVtID0gZW07CisgICAgICAgIHRoaXMudXR4ID0gdXR4OworICAgICAgICB0aGlzLnVzZXJSZXNvdXJjZSA9IHVzZXJSZXNvdXJjZTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29sbGVjdGlvbjxCb29rbWFya0VudGl0eT4gZ2V0Qm9va21hcmtzKCkgeworICAgICAgICByZXR1cm4gdXNlclJlc291cmNlLmdldFVzZXJFbnRpdHkoKS5nZXRCb29rbWFya0VudGl0eUNvbGxlY3Rpb24oKTsKKyAgICB9CisKKyAgICBAUGF0aCgie2JtaWQ6IC4rfSIpCisgICAgcHVibGljIEJvb2ttYXJrUmVzb3VyY2UgZ2V0Qm9va21hcmsoQFBhdGhQYXJhbSgiYm1pZCIpIFN0cmluZyBibWlkKSB7CisgICAgICAgIHJldHVybiBuZXcgQm9va21hcmtSZXNvdXJjZSh1cmlJbmZvLCBlbSwgdXR4LCB1c2VyUmVzb3VyY2UuZ2V0VXNlckVudGl0eSgpLCBibWlkKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9qc29uIikKKyAgICBwdWJsaWMgSlNPTkFycmF5IGdldEJvb2ttYXJrc0FzSnNvbkFycmF5KCkgeworICAgICAgICBKU09OQXJyYXkgdXJpQXJyYXkgPSBuZXcgSlNPTkFycmF5KCk7CisgICAgICAgIGZvciAoQm9va21hcmtFbnRpdHkgYm9va21hcmtFbnRpdHkgOiBnZXRCb29rbWFya3MoKSkgeworICAgICAgICAgICAgVXJpQnVpbGRlciB1YiA9IHVyaUluZm8uZ2V0QWJzb2x1dGVQYXRoQnVpbGRlcigpOworICAgICAgICAgICAgVVJJIGJvb2ttYXJrVXJpID0gdWIKKyAgICAgICAgICAgICAgICAgICAgLnBhdGgoYm9va21hcmtFbnRpdHkuZ2V0Qm9va21hcmtFbnRpdHlQSygpLmdldEJtaWQoKSkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgICAgICB1cmlBcnJheS5wdXQoYm9va21hcmtVcmkudG9BU0NJSVN0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdXJpQXJyYXk7CisgICAgfQorCisgICAgQFBPU1QKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgIHB1YmxpYyBSZXNwb25zZSBwb3N0Rm9ybShKU09OT2JqZWN0IGJvb2ttYXJrKSB0aHJvd3MgSlNPTkV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEJvb2ttYXJrRW50aXR5IGJvb2ttYXJrRW50aXR5ID0gbmV3IEJvb2ttYXJrRW50aXR5KGdldEJvb2ttYXJrSWQoYm9va21hcmsuZ2V0U3RyaW5nKCJ1cmkiKSksCisgICAgICAgICAgICAgICAgdXNlclJlc291cmNlLmdldFVzZXJFbnRpdHkoKS5nZXRVc2VyaWQoKSk7CisKKyAgICAgICAgYm9va21hcmtFbnRpdHkuc2V0VXJpKGJvb2ttYXJrLmdldFN0cmluZygidXJpIikpOworICAgICAgICBib29rbWFya0VudGl0eS5zZXRVcGRhdGVkKG5ldyBEYXRlKCkpOworICAgICAgICBib29rbWFya0VudGl0eS5zZXRTZGVzYyhib29rbWFyay5nZXRTdHJpbmcoInNkZXNjIikpOworICAgICAgICBib29rbWFya0VudGl0eS5zZXRMZGVzYyhib29rbWFyay5nZXRTdHJpbmcoImxkZXNjIikpOworICAgICAgICB1c2VyUmVzb3VyY2UuZ2V0VXNlckVudGl0eSgpLmdldEJvb2ttYXJrRW50aXR5Q29sbGVjdGlvbigpLmFkZChib29rbWFya0VudGl0eSk7CisKKyAgICAgICAgVHJhbnNhY3Rpb25NYW5hZ2VyLm1hbmFnZSh1dHgsIG5ldyBUcmFuc2FjdGlvbmFsKGVtKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCB0cmFuc2FjdCgpIHsKKyAgICAgICAgICAgICAgICBlbS5tZXJnZSh1c2VyUmVzb3VyY2UuZ2V0VXNlckVudGl0eSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgVVJJIGJvb2ttYXJrVXJpID0gdXJpSW5mby5nZXRBYnNvbHV0ZVBhdGhCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAucGF0aChib29rbWFya0VudGl0eS5nZXRCb29rbWFya0VudGl0eVBLKCkuZ2V0Qm1pZCgpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICByZXR1cm4gUmVzcG9uc2UuY3JlYXRlZChib29rbWFya1VyaSkuYnVpbGQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRCb29rbWFya0lkKFN0cmluZyB1cmkpIHsKKyAgICAgICAgcmV0dXJuIHVyaTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9ib29rbWFyay1lbS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2Jvb2ttYXJrX2VtL3Jlc291cmNlL1VzZXJSZXNvdXJjZS5qYXZhIGIvZXhhbXBsZXMvYm9va21hcmstZW0vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9ib29rbWFya19lbS9yZXNvdXJjZS9Vc2VyUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmZiODQyCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYm9va21hcmstZW0vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9ib29rbWFya19lbS9yZXNvdXJjZS9Vc2VyUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5ib29rbWFya19lbS5yZXNvdXJjZTsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkRFTEVURTsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUFVUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CisKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHlNYW5hZ2VyOworaW1wb3J0IGphdmF4LnRyYW5zYWN0aW9uLlVzZXJUcmFuc2FjdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmJvb2ttYXJrX2VtLmVudGl0eS5Vc2VyRW50aXR5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmJvb2ttYXJrX2VtLmV4Y2VwdGlvbi5FeHRlbmRlZE5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmJvb2ttYXJrX2VtLnV0aWwudHguVHJhbnNhY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmJvb2ttYXJrX2VtLnV0aWwudHguVHJhbnNhY3Rpb25hbDsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5qZXR0aXNvbi5qc29uLkpTT05FeGNlcHRpb247CitpbXBvcnQgb3JnLmNvZGVoYXVzLmpldHRpc29uLmpzb24uSlNPTk9iamVjdDsKKworLyoqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBVc2VyUmVzb3VyY2UgeworCisgICAgU3RyaW5nIHVzZXJpZDsgLy8gdXNlcmlkIGZyb20gdXJsCisgICAgVXNlckVudGl0eSB1c2VyRW50aXR5OyAvLyBhcHByb3ByaWF0ZSBqcGEgdXNlciBlbnRpdHkKKworICAgIFVyaUluZm8gdXJpSW5mbzsgLy8gYWN0dWFsIHVyaSBpbmZvIHByb3ZpZGVkIGJ5IHBhcmVudCByZXNvdXJjZQorICAgIEVudGl0eU1hbmFnZXIgZW07IC8vIGVudGl0eSBtYW5hZ2VyIHByb3ZpZGVkIGJ5IHBhcmVudCByZXNvdXJjZQorICAgIFVzZXJUcmFuc2FjdGlvbiB1dHg7IC8vIHVzZXIgdHJhbnNhY3Rpb24gcHJvdmlkZWQgYnkgcGFyZW50IHJlc291cmNlCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIFVzZXJSZXNvdXJjZQorICAgICAqLworICAgIHB1YmxpYyBVc2VyUmVzb3VyY2UoVXJpSW5mbyB1cmlJbmZvLCBFbnRpdHlNYW5hZ2VyIGVtLCBVc2VyVHJhbnNhY3Rpb24gdXR4LCBTdHJpbmcgdXNlcmlkKSB7CisgICAgICAgIHRoaXMudXJpSW5mbyA9IHVyaUluZm87CisgICAgICAgIHRoaXMudXNlcmlkID0gdXNlcmlkOworICAgICAgICB0aGlzLmVtID0gZW07CisgICAgICAgIHRoaXMudXR4ID0gdXR4OworICAgICAgICB1c2VyRW50aXR5ID0gZW0uZmluZChVc2VyRW50aXR5LmNsYXNzLCB1c2VyaWQpOworICAgIH0KKworICAgIEBQYXRoKCJib29rbWFya3MvIikKKyAgICBwdWJsaWMgQm9va21hcmtzUmVzb3VyY2UgZ2V0Qm9va21hcmtzUmVzb3VyY2UoKSB7CisgICAgICAgIGlmIChudWxsID09IHVzZXJFbnRpdHkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeHRlbmRlZE5vdEZvdW5kRXhjZXB0aW9uKCJ1c2VyaWQgIiArIHVzZXJpZCArICIgZG9lcyBub3QgZXhpc3QhIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBCb29rbWFya3NSZXNvdXJjZSh1cmlJbmZvLCBlbSwgdXR4LCB0aGlzKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9qc29uIikKKyAgICBwdWJsaWMgSlNPTk9iamVjdCBnZXRVc2VyKCkgdGhyb3dzIEpTT05FeGNlcHRpb24geworICAgICAgICBpZiAobnVsbCA9PSB1c2VyRW50aXR5KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXh0ZW5kZWROb3RGb3VuZEV4Y2VwdGlvbigidXNlcmlkICIgKyB1c2VyaWQgKyAiZG9lcyBub3QgZXhpc3QhIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBKU09OT2JqZWN0KCkKKyAgICAgICAgICAgICAgICAucHV0KCJ1c2VyaWQiLCB1c2VyRW50aXR5LmdldFVzZXJpZCgpKQorICAgICAgICAgICAgICAgIC5wdXQoInVzZXJuYW1lIiwgdXNlckVudGl0eS5nZXRVc2VybmFtZSgpKQorICAgICAgICAgICAgICAgIC5wdXQoImVtYWlsIiwgdXNlckVudGl0eS5nZXRFbWFpbCgpKQorICAgICAgICAgICAgICAgIC5wdXQoInBhc3N3b3JkIiwgdXNlckVudGl0eS5nZXRQYXNzd29yZCgpKQorICAgICAgICAgICAgICAgIC5wdXQoImJvb2ttYXJrcyIsIHVyaUluZm8uZ2V0QWJzb2x1dGVQYXRoQnVpbGRlcigpLnBhdGgoImJvb2ttYXJrcyIpLmJ1aWxkKCkpOworICAgIH0KKworICAgIEBQVVQKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgIHB1YmxpYyBSZXNwb25zZSBwdXRVc2VyKEpTT05PYmplY3QganNvbkVudGl0eSkgdGhyb3dzIEpTT05FeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyBqc29uVXNlcmlkID0ganNvbkVudGl0eS5nZXRTdHJpbmcoInVzZXJpZCIpOworCisgICAgICAgIGlmICgobnVsbCAhPSBqc29uVXNlcmlkKSAmJiAhanNvblVzZXJpZC5lcXVhbHModXNlcmlkKSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyg0MDkpLmVudGl0eSgidXNlcmlkcyBkaWZmZXIhXG4iKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgYm9vbGVhbiBuZXdSZWNvcmQgPSAobnVsbCA9PSB1c2VyRW50aXR5KTsgLy8gaW5zZXJ0IG9yIHVwZGF0ZSA/CisKKyAgICAgICAgaWYgKG5ld1JlY29yZCkgeyAvLyBuZXcgdXNlciByZWNvcmQgdG8gYmUgaW5zZXJ0ZWQKKyAgICAgICAgICAgIHVzZXJFbnRpdHkgPSBuZXcgVXNlckVudGl0eSgpOworICAgICAgICAgICAgdXNlckVudGl0eS5zZXRVc2VyaWQodXNlcmlkKTsKKyAgICAgICAgfQorICAgICAgICB1c2VyRW50aXR5LnNldFVzZXJuYW1lKGpzb25FbnRpdHkuZ2V0U3RyaW5nKCJ1c2VybmFtZSIpKTsKKyAgICAgICAgdXNlckVudGl0eS5zZXRFbWFpbChqc29uRW50aXR5LmdldFN0cmluZygiZW1haWwiKSk7CisgICAgICAgIHVzZXJFbnRpdHkuc2V0UGFzc3dvcmQoanNvbkVudGl0eS5nZXRTdHJpbmcoInBhc3N3b3JkIikpOworCisgICAgICAgIGlmIChuZXdSZWNvcmQpIHsKKyAgICAgICAgICAgIFRyYW5zYWN0aW9uTWFuYWdlci5tYW5hZ2UodXR4LCBuZXcgVHJhbnNhY3Rpb25hbChlbSkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRyYW5zYWN0KCkgeworICAgICAgICAgICAgICAgICAgICBlbS5qb2luVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgZW0ucGVyc2lzdCh1c2VyRW50aXR5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5jcmVhdGVkKHVyaUluZm8uZ2V0QWJzb2x1dGVQYXRoKCkpLmJ1aWxkKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBUcmFuc2FjdGlvbk1hbmFnZXIubWFuYWdlKHV0eCwgbmV3IFRyYW5zYWN0aW9uYWwoZW0pIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB0cmFuc2FjdCgpIHsKKyAgICAgICAgICAgICAgICAgICAgZW0ubWVyZ2UodXNlckVudGl0eSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uubm9Db250ZW50KCkuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBERUxFVEUKKyAgICBwdWJsaWMgdm9pZCBkZWxldGVVc2VyKCkgeworICAgICAgICBpZiAobnVsbCA9PSB1c2VyRW50aXR5KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXh0ZW5kZWROb3RGb3VuZEV4Y2VwdGlvbigidXNlcmlkICIgKyB1c2VyaWQgKyAiZG9lcyBub3QgZXhpc3QhIik7CisgICAgICAgIH0KKworICAgICAgICBUcmFuc2FjdGlvbk1hbmFnZXIubWFuYWdlKHV0eCwgbmV3IFRyYW5zYWN0aW9uYWwoZW0pIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRyYW5zYWN0KCkgeworICAgICAgICAgICAgICAgIGVtLnBlcnNpc3QodXNlckVudGl0eSk7CisgICAgICAgICAgICAgICAgZW0ucmVtb3ZlKHVzZXJFbnRpdHkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gdXNlckVudGl0eS5nZXRVc2VyaWQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVXNlckVudGl0eSBnZXRVc2VyRW50aXR5KCkgeworICAgICAgICByZXR1cm4gdXNlckVudGl0eTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9ib29rbWFyay1lbS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2Jvb2ttYXJrX2VtL3Jlc291cmNlL1VzZXJzUmVzb3VyY2UuamF2YSBiL2V4YW1wbGVzL2Jvb2ttYXJrLWVtL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYm9va21hcmtfZW0vcmVzb3VyY2UvVXNlcnNSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNzAyNWEKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9ib29rbWFyay1lbS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2Jvb2ttYXJrX2VtL3Jlc291cmNlL1VzZXJzUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmJvb2ttYXJrX2VtLnJlc291cmNlOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5NYW5hZ2VkQmVhbjsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkVudGl0eU1hbmFnZXI7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VDb250ZXh0OworaW1wb3J0IGphdmF4LnRyYW5zYWN0aW9uLlVzZXJUcmFuc2FjdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmJvb2ttYXJrX2VtLmVudGl0eS5Vc2VyRW50aXR5OworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmpldHRpc29uLmpzb24uSlNPTkFycmF5OworCisvKioKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCIvdXNlcnMvIikKK0BNYW5hZ2VkQmVhbgorcHVibGljIGNsYXNzIFVzZXJzUmVzb3VyY2UgeworCisgICAgLy8gaW5qZWN0ZWQgRW50aXR5TWFuYWdlciBwcm9wZXJ0eQorICAgIEBQZXJzaXN0ZW5jZUNvbnRleHQodW5pdE5hbWUgPSAiQm9va21hcmtQVSIpCisgICAgcHJpdmF0ZSBFbnRpdHlNYW5hZ2VyIGVtOworCisgICAgLy8gaW5qZWN0ZWQgVXNlclRyYW5zYWN0aW9uCisgICAgQFJlc291cmNlCisgICAgcHJpdmF0ZSBVc2VyVHJhbnNhY3Rpb24gdXR4OworCisgICAgQENvbnRleHQKKyAgICBVcmlJbmZvIHVyaUluZm87CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIFVzZXJzCisgICAgICovCisgICAgcHVibGljIFVzZXJzUmVzb3VyY2UoKSB7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIExpc3Q8VXNlckVudGl0eT4gZ2V0VXNlcnMoKSB7CisgICAgICAgIHJldHVybiBlbS5jcmVhdGVRdWVyeSgiU0VMRUNUIHUgZnJvbSBVc2VyRW50aXR5IHUiKS5nZXRSZXN1bHRMaXN0KCk7CisgICAgfQorCisgICAgQFBhdGgoInt1c2VyaWR9LyIpCisgICAgcHVibGljIFVzZXJSZXNvdXJjZSBnZXRVc2VyKEBQYXRoUGFyYW0oInVzZXJpZCIpIFN0cmluZyB1c2VyaWQpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBVc2VyUmVzb3VyY2UodXJpSW5mbywgZW0sIHV0eCwgdXNlcmlkKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9qc29uIikKKyAgICBwdWJsaWMgSlNPTkFycmF5IGdldFVzZXJzQXNKc29uQXJyYXkoKSB7CisgICAgICAgIEpTT05BcnJheSB1cmlBcnJheSA9IG5ldyBKU09OQXJyYXkoKTsKKyAgICAgICAgZm9yIChVc2VyRW50aXR5IHVzZXJFbnRpdHkgOiBnZXRVc2VycygpKSB7CisgICAgICAgICAgICBVcmlCdWlsZGVyIHViID0gdXJpSW5mby5nZXRBYnNvbHV0ZVBhdGhCdWlsZGVyKCk7CisgICAgICAgICAgICBVUkkgdXNlclVyaSA9IHViCisgICAgICAgICAgICAgICAgICAgIC5wYXRoKHVzZXJFbnRpdHkuZ2V0VXNlcmlkKCkpCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICAgICAgdXJpQXJyYXkucHV0KHVzZXJVcmkudG9BU0NJSVN0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdXJpQXJyYXk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYm9va21hcmstZW0vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9ib29rbWFya19lbS91dGlsL3R4L1RyYW5zYWN0aW9uTWFuYWdlci5qYXZhIGIvZXhhbXBsZXMvYm9va21hcmstZW0vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9ib29rbWFya19lbS91dGlsL3R4L1RyYW5zYWN0aW9uTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNGQ4NDQKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9ib29rbWFyay1lbS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2Jvb2ttYXJrX2VtL3V0aWwvdHgvVHJhbnNhY3Rpb25NYW5hZ2VyLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5ib29rbWFya19lbS51dGlsLnR4OworCitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC50cmFuc2FjdGlvbi5TeXN0ZW1FeGNlcHRpb247CitpbXBvcnQgamF2YXgudHJhbnNhY3Rpb24uVXNlclRyYW5zYWN0aW9uOworCisvKioKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFRyYW5zYWN0aW9uTWFuYWdlciB7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFuYWdlKFVzZXJUcmFuc2FjdGlvbiB1dHgsIFRyYW5zYWN0aW9uYWwgdCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgdXR4LmJlZ2luKCk7CisgICAgICAgICAgICBpZiAodC5qb2luVHJhbnNhY3Rpb24pIHsKKyAgICAgICAgICAgICAgICB0LmVtLmpvaW5UcmFuc2FjdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdC50cmFuc2FjdCgpOworICAgICAgICAgICAgdXR4LmNvbW1pdCgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB1dHgucm9sbGJhY2soKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFN5c3RlbUV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbihzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViQXBwbGljYXRpb25FeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9ib29rbWFyay1lbS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2Jvb2ttYXJrX2VtL3V0aWwvdHgvVHJhbnNhY3Rpb25hbC5qYXZhIGIvZXhhbXBsZXMvYm9va21hcmstZW0vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9ib29rbWFya19lbS91dGlsL3R4L1RyYW5zYWN0aW9uYWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGE0ZDQyCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYm9va21hcmstZW0vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9ib29rbWFya19lbS91dGlsL3R4L1RyYW5zYWN0aW9uYWwuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmJvb2ttYXJrX2VtLnV0aWwudHg7CisKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHlNYW5hZ2VyOworCisvKioKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFRyYW5zYWN0aW9uYWwgeworCisgICAgRW50aXR5TWFuYWdlciBlbTsKKyAgICBib29sZWFuIGpvaW5UcmFuc2FjdGlvbjsKKworICAgIHB1YmxpYyBUcmFuc2FjdGlvbmFsKEVudGl0eU1hbmFnZXIgZW0sIGJvb2xlYW4gam9pblRyYW5zYWN0aW9uKSB7CisgICAgICAgIHRoaXMuZW0gPSBlbTsKKyAgICAgICAgdGhpcy5qb2luVHJhbnNhY3Rpb24gPSBqb2luVHJhbnNhY3Rpb247CisgICAgfQorCisgICAgcHVibGljIFRyYW5zYWN0aW9uYWwoRW50aXR5TWFuYWdlciBlbSkgeworICAgICAgICB0aGlzKGVtLCB0cnVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB0cmFuc2FjdCgpOworfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYm9va21hcmstZW0vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3BlcnNpc3RlbmNlLnhtbCBiL2V4YW1wbGVzL2Jvb2ttYXJrLWVtL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9wZXJzaXN0ZW5jZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRmMDhlYgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2Jvb2ttYXJrLWVtL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9wZXJzaXN0ZW5jZS54bWwKQEAgLTAsMCArMSwyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisKKy0tPgorCis8cGVyc2lzdGVuY2UgdmVyc2lvbj0iMS4wIiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2UiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2UgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvcGVyc2lzdGVuY2UvcGVyc2lzdGVuY2VfMV8wLnhzZCI+CisgICAgPHBlcnNpc3RlbmNlLXVuaXQgbmFtZT0iQm9va21hcmtQVSIgdHJhbnNhY3Rpb24tdHlwZT0iSlRBIj4KKyAgICAgICAgPGp0YS1kYXRhLXNvdXJjZT5qZGJjL19fZGVmYXVsdDwvanRhLWRhdGEtc291cmNlPgorICAgICAgICA8cHJvcGVydGllcz4KKyAgICAgICAgICAgIDwhLS0gZHJvcCBhbmQgY3JlYXRlIHRhYmxlcyBhdCBkZXBsb3ltZW50IC0tPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImVjbGlwc2VsaW5rLmRkbC1nZW5lcmF0aW9uIiB2YWx1ZT0iZHJvcC1hbmQtY3JlYXRlLXRhYmxlcyIvPgorICAgICAgICAgICAgPCEtLSBsb2cgc3FscyBleGVjdXRlZCBpbiBzZXJ2ZXIubG9nIC0tPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImVjbGlwc2VsaW5rLmxvZ2dpbmcubGV2ZWwiIHZhbHVlPSJGSU5FIi8+CisgICAgICAgICAgICA8IS0tIEluc3RydWN0IEVjbGlwc2VMaW5rIHRvIG5vdCBsb2cgZXhlY2VwdGlvbnMgaXQgdGhyb3dzLiBMZXRzIHRoZSBhcHBsaWNhdGlvbiBkZWNpZGUgYWJvdXQgaXQtLT4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlbGluay5sb2dnaW5nLmV4Y2VwdGlvbnMiIHZhbHVlPSJmYWxzZSIvPgorICAgICAgICA8L3Byb3BlcnRpZXM+CisgICAgPC9wZXJzaXN0ZW5jZS11bml0PgorPC9wZXJzaXN0ZW5jZT4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2Jvb2ttYXJrLWVtL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2dsYXNzZmlzaC13ZWIueG1sIGIvZXhhbXBsZXMvYm9va21hcmstZW0vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZ2xhc3NmaXNoLXdlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVkNTU2NwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2Jvb2ttYXJrLWVtL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2dsYXNzZmlzaC13ZWIueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorCistLT4KKworPCFET0NUWVBFIGdsYXNzZmlzaC13ZWItYXBwIFBVQkxJQyAiLS8vR2xhc3NGaXNoLm9yZy8vRFREIEdsYXNzRmlzaCBBcHBsaWNhdGlvbiBTZXJ2ZXIgMy4xIFNlcnZsZXQgMy4wLy9FTiIgImh0dHA6Ly9nbGFzc2Zpc2gub3JnL2R0ZHMvZ2xhc3NmaXNoLXdlYi1hcHBfM18wLTEuZHRkIj4KKzxnbGFzc2Zpc2gtd2ViLWFwcCBlcnJvci11cmw9IiI+CisgICAgPGNvbnRleHQtcm9vdD4vQm9va21hcmstRU08L2NvbnRleHQtcm9vdD4KKyAgICA8Y2xhc3MtbG9hZGVyIGRlbGVnYXRlPSJ0cnVlIiAvPgorICAgIDxqc3AtY29uZmlnPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NkZWJ1Z2luZm8iIHZhbHVlPSJ0cnVlIj4KKyAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5FbmFibGUgZGVidWcgaW5mbyBjb21waWxhdGlvbiBpbiB0aGUgZ2VuZXJhdGVkIHNlcnZsZXQgY2xhc3M8L2Rlc2NyaXB0aW9uPgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ia2VlcGdlbmVyYXRlZCIgdmFsdWU9InRydWUiPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPktlZXAgYSBjb3B5IG9mIHRoZSBnZW5lcmF0ZWQgc2VydmxldCBjbGFzcycgamF2YSBjb2RlLjwvZGVzY3JpcHRpb24+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXBwZWRmaWxlIiB2YWx1ZT0idHJ1ZSI+CisgICAgICAgICAgICA8ZGVzY3JpcHRpb24+TWFpbnRhaW4gYSBvbmUtdG8tb25lIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gc3RhdGljIGNvbnRlbnQgYW5kIHRoZSBnZW5lcmF0ZWQgc2VydmxldCBjbGFzcycgamF2YSBjb2RlPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICA8L2pzcC1jb25maWc+Cis8L2dsYXNzZmlzaC13ZWItYXBwPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYm9va21hcmstZW0vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL2V4YW1wbGVzL2Jvb2ttYXJrLWVtL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA5ZTIyMwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2Jvb2ttYXJrLWVtL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwzOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIyLjUiIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzJfNS54c2QiPgorICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmJvb2ttYXJrX2VtLk15QXBwbGljYXRpb248L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LndzLnJzLkFwcGxpY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmJvb2ttYXJrX2VtLk15QXBwbGljYXRpb248L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmJvb2ttYXJrX2VtLk15QXBwbGljYXRpb248L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9yZXNvdXJjZXMvKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8cGVyc2lzdGVuY2UtdW5pdC1yZWY+CisgICAgICAgIDxwZXJzaXN0ZW5jZS11bml0LXJlZi1uYW1lPnBlcnNpc3RlbmNlL2Jvb2ttYXJrPC9wZXJzaXN0ZW5jZS11bml0LXJlZi1uYW1lPgorICAgICAgICA8cGVyc2lzdGVuY2UtdW5pdC1uYW1lPkJvb2ttYXJrUFU8L3BlcnNpc3RlbmNlLXVuaXQtbmFtZT4KKyAgICA8L3BlcnNpc3RlbmNlLXVuaXQtcmVmPgorICAgIDxyZXNvdXJjZS1yZWY+CisgICAgICAgIDxyZXMtcmVmLW5hbWU+VXNlclRyYW5zYWN0aW9uPC9yZXMtcmVmLW5hbWU+CisgICAgICAgIDxyZXMtdHlwZT5qYXZheC50cmFuc2FjdGlvbi5Vc2VyVHJhbnNhY3Rpb248L3Jlcy10eXBlPgorICAgICAgICA8cmVzLWF1dGg+Q29udGFpbmVyPC9yZXMtYXV0aD4KKyAgICA8L3Jlc291cmNlLXJlZj4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2Jvb2ttYXJrLWVtL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYm9va21hcmtfZW0vQm9va21hcmtUZXN0LmphdmEgYi9leGFtcGxlcy9ib29rbWFyay1lbS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2Jvb2ttYXJrX2VtL0Jvb2ttYXJrVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYWI3ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9ib29rbWFyay1lbS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2Jvb2ttYXJrX2VtL0Jvb2ttYXJrVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTcyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmJvb2ttYXJrX2VtOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHRpc29uLkpldHRpc29uRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuamV0dGlzb24uanNvbi5KU09OQXJyYXk7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmpldHRpc29uLmpzb24uSlNPTk9iamVjdDsKK2ltcG9ydCBvcmcuanVuaXQuRml4TWV0aG9kT3JkZXI7CitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5NZXRob2RTb3J0ZXJzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIFRPRE8gdW4taWdub3JlIG9uY2UgSmVyc2V5IHN1cHBvcnRzIEBNYW5hZ2VkQmVhbgorICoKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQElnbm9yZSgidW4taWdub3JlIG9uY2UgSmVyc2V5IHN1cHBvcnRzIEBNYW5hZ2VkQmVhbiIpCitARml4TWV0aG9kT3JkZXIoTWV0aG9kU29ydGVycy5OQU1FX0FTQ0VORElORykKK3B1YmxpYyBjbGFzcyBCb29rbWFya1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgQXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVVJJIGdldEJhc2VVcmkoKSB7CisgICAgICAgIHJldHVybiBVUkkuY3JlYXRlKHN1cGVyLmdldEJhc2VVcmkoKS50b1N0cmluZygpICsgIkJvb2ttYXJrLUVNIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcucmVnaXN0ZXIobmV3IEpldHRpc29uRmVhdHVyZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHN0ZXAxX2dldFVzZXJzKCkgeworICAgICAgICBKU09OQXJyYXkgdXNlcnMgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZXMvdXNlcnMvIikucmVxdWVzdCgiYXBwbGljYXRpb24vanNvbiIpLmdldChKU09OQXJyYXkuY2xhc3MpOworICAgICAgICBhc3NlcnRUcnVlKHVzZXJzICE9IG51bGwpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc3RlcDJfY3JlYXRlVXNlcigpIHsKKyAgICAgICAgYm9vbGVhbiB0aHJvd24gPSBmYWxzZTsKKyAgICAgICAgSlNPTk9iamVjdCB1c2VyID0gbmV3IEpTT05PYmplY3QoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdXNlci5wdXQoInVzZXJpZCIsICJ0ZXN0dWlkIikucHV0KCJwYXNzd29yZCIsICJ0ZXN0IikucHV0KCJlbWFpbCIsICJ0ZXN0QHRlc3QubmV0IikucHV0KCJ1c2VybmFtZSIsICJUZXN0IFVzZXIiKTsKKyAgICAgICAgICAgIHRhcmdldCgpLnBhdGgoInJlc291cmNlcy91c2Vycy90ZXN0dWlkIikucmVxdWVzdCgpLnB1dChFbnRpdHkuZW50aXR5KHVzZXIsICJhcHBsaWNhdGlvbi9qc29uIikpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93biA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRGYWxzZSh0aHJvd24pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc3RlcDNfZ2V0VXNlcnMyKCkgeworICAgICAgICBKU09OQXJyYXkgdXNlcnMgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZXMvdXNlcnMvIikucmVxdWVzdCgiYXBwbGljYXRpb24vanNvbiIpLmdldChKU09OQXJyYXkuY2xhc3MpOworICAgICAgICBhc3NlcnRUcnVlKHVzZXJzICE9IG51bGwpOworICAgICAgICBhc3NlcnRUcnVlKHVzZXJzLmxlbmd0aCgpID09IDEpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc3RlcDRfdXBkYXRlVXNlcigpIHsKKyAgICAgICAgYm9vbGVhbiB0aHJvd24gPSBmYWxzZTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgSlNPTk9iamVjdCB1c2VyID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2VzL3VzZXJzL3Rlc3R1aWQiKS5yZXF1ZXN0KCJhcHBsaWNhdGlvbi9qc29uIikuZ2V0KEpTT05PYmplY3QuY2xhc3MpOworCisgICAgICAgICAgICB1c2VyLnB1dCgicGFzc3dvcmQiLCAiTkVXIFBBU1NXT1JEIikucHV0KCJlbWFpbCIsICJORVdARU1BSUwuTkVUIikucHV0KCJ1c2VybmFtZSIsICJVUERBVEVEIFRFU1QgVVNFUiIpOworICAgICAgICAgICAgdGFyZ2V0KCkucGF0aCgicmVzb3VyY2VzL3VzZXJzL3Rlc3R1aWQiKS5yZXF1ZXN0KCkucHV0KEVudGl0eS5lbnRpdHkodXNlciwgImFwcGxpY2F0aW9uL2pzb24iKSk7CisKKyAgICAgICAgICAgIHVzZXIgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZXMvdXNlcnMvdGVzdHVpZCIpLnJlcXVlc3QoImFwcGxpY2F0aW9uL2pzb24iKS5nZXQoSlNPTk9iamVjdC5jbGFzcyk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh1c2VyLmdldCgidXNlcm5hbWUiKSwgIlVQREFURUQgVEVTVCBVU0VSIik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModXNlci5nZXQoImVtYWlsIiksICJORVdARU1BSUwuTkVUIik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModXNlci5nZXQoInBhc3N3b3JkIiksICJORVcgUEFTU1dPUkQiKTsKKworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHRocm93biA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRGYWxzZSh0aHJvd24pOworICAgIH0KKworICAgIC8vIHRoaXMgaXMgdWdseSBidXQgaXQgd291bGQgYmUgcHJvYmFibHkgdWdsaWVyIHdoZW4gZGl2aWRlZCBpbnRvIHNlcGFyYXRlCisgICAgLy8gdGVzdCBjYXNlcworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc3RlcDVfZ2V0VXNlckJvb2ttYXJrTGlzdCgpIHsKKyAgICAgICAgYm9vbGVhbiB0aHJvd24gPSBmYWxzZTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgSlNPTk9iamVjdCB1c2VyID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2VzL3VzZXJzL3Rlc3R1aWQiKS5yZXF1ZXN0KCJhcHBsaWNhdGlvbi9qc29uIikuZ2V0KEpTT05PYmplY3QuY2xhc3MpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh1c2VyICE9IG51bGwpOworCisgICAgICAgICAgICBmaW5hbCBXZWJUYXJnZXQgd2ViVGFyZ2V0ID0gdGFyZ2V0KHVzZXIuZ2V0U3RyaW5nKCJib29rbWFya3MiKSk7CisKKyAgICAgICAgICAgIEpTT05PYmplY3QgYm9va21hcmsgPSBuZXcgSlNPTk9iamVjdCgpOworICAgICAgICAgICAgYm9va21hcmsucHV0KCJ1cmkiLCAiaHR0cDovL2phdmEuc3VuLmNvbSIpLnB1dCgic2Rlc2MiLCAidGVzdCBkZXNjIikucHV0KCJsZGVzYyIsICJsb25nIHRlc3QgZGVzY3JpcHRpb24iKTsKKyAgICAgICAgICAgIHdlYlRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KGJvb2ttYXJrLCAiYXBwbGljYXRpb24vanNvbiIpKTsKKworICAgICAgICAgICAgSlNPTkFycmF5IGJvb2ttYXJrcyA9IHdlYlRhcmdldC5yZXF1ZXN0KCJhcHBsaWNhdGlvbi9qc29uIikuZ2V0KEpTT05BcnJheS5jbGFzcyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGJvb2ttYXJrcyAhPSBudWxsKTsKKyAgICAgICAgICAgIGludCBib29rbWFya3NTaXplID0gYm9va21hcmtzLmxlbmd0aCgpOworCisgICAgICAgICAgICBTdHJpbmcgdGVzdEJvb2ttYXJrVXJsID0gYm9va21hcmtzLmdldFN0cmluZygwKTsKKworICAgICAgICAgICAgZmluYWwgV2ViVGFyZ2V0IGJvb2ttYXJrUmVzb3VyY2UgPSB0YXJnZXQoKS5wYXRoKHRlc3RCb29rbWFya1VybCk7CisgICAgICAgICAgICBib29rbWFyayA9IGJvb2ttYXJrUmVzb3VyY2UucmVxdWVzdCgiYXBwbGljYXRpb24vanNvbiIpLmdldChKU09OT2JqZWN0LmNsYXNzKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoYm9va21hcmsgIT0gbnVsbCk7CisKKyAgICAgICAgICAgIGJvb2ttYXJrUmVzb3VyY2UucmVxdWVzdCgpLmRlbGV0ZSgpOworCisgICAgICAgICAgICBib29rbWFya3MgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZXMvdXNlcnMvdGVzdHVpZC9ib29rbWFya3MiKS5yZXF1ZXN0KCJhcHBsaWNhdGlvbi9qc29uIikuZ2V0KEpTT05BcnJheS5jbGFzcyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGJvb2ttYXJrcyAhPSBudWxsKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoYm9va21hcmtzLmxlbmd0aCgpID09IChib29rbWFya3NTaXplIC0gMSkpOworCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3duID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydEZhbHNlKHRocm93bik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzdGVwNl9kZWxldGVVc2VyKCkgeworICAgICAgICBib29sZWFuIHRocm93biA9IGZhbHNlOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZXMvdXNlcnMvdGVzdHVpZCIpLnJlcXVlc3QoKS5kZWxldGUoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvd24gPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0RmFsc2UodGhyb3duKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9ib29rbWFyay9SRUFETUUuTUQgYi9leGFtcGxlcy9ib29rbWFyay9SRUFETUUuTUQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNhOTI0YQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2Jvb2ttYXJrL1JFQURNRS5NRApAQCAtMCwwICsxLDgxIEBACitbLy9dOiAjICIgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICIKK1svL106ICMgIiAiCitbLy9dOiAjICIgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlICIKK1svL106ICMgIiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCAiCitbLy9dOiAjICIgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLiAiCitbLy9dOiAjICIgIgorWy8vXTogIyAiIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UgIgorCitCb29rbWFyayBFeGFtcGxlCis9PT09PT09PT09PT09PT09CisKK1RoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIHVzZSBKUEEgaW4gdGhlIGJhY2tlbmQuIFRoZSBleGFtcGxlIGlzCitiYXNlZCBvbiBib29rbWFyayBleGFtcGxlIGZyb20gdGhlIFtSRVNUZnVsIFdlYgorU2VydmljZXNdKGh0dHA6Ly93d3cub3JlaWxseS5jb20vY2F0YWxvZy85NzgwNTk2NTI5MjYwLykgYm9vaywgd2hpY2ggd2FzCitpbnNwaXJlZCBieSB0aGUgW2h0dHA6Ly9kZWwuaWNpby51cy9dKGh0dHA6Ly9kZWwuaWNpby51cy92MSkgd2ViCitzZXJ2aWNlLgorCitBIGJvb2ttYXJrIHdlYiBhcHBsaWNhdGlvbiBpcyBwcmVzZW50ZWQgdGhhdCBpcyBjYXBhYmxlIG9mIG1haW50YWluaW5nCit1c2VycyBhbmQgdGhlaXIgYm9va21hcmtzLgorCitDb250ZW50cworLS0tLS0tLS0KKworVGhlIG1hcHBpbmcgb2YgdGhlIFVSSSBwYXRoIHNwYWNlIGlzIHByZXNlbnRlZCBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOgorCitVUkkgcGF0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBSZXNvdXJjZSBjbGFzcyAgICAgIHwgSFRUUCBtZXRob2RzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBOb3RlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqXy91c2Vyc18qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBVc2Vyc1Jlc291cmNlICAgICAgfCAgR0VUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBSZXR1cm5zIGEgbGlzdCBvZiB1c2Vycy4KKyoqXy91c2Vycy97dXNlcmlkfV8qKiAgICAgICAgICAgICAgICAgICB8ICBVc2VyUmVzb3VyY2UgICAgICAgfCAgR0VULCBQVVQgKHVzZWQgYWxzbyBmb3IgY3JlYXRpbmcgbmV3IHVzZXJzKSwgREVMRVRFICB8ICBSZXR1cm5zIHVzZXIgZGV0YWlscworKipfL3VzZXJzL3t1c2VyaWR9L2Jvb2ttYXJrc18qKiAgICAgICAgIHwgIEJvb2ttYXJrc1Jlc291cmNlICB8ICBHRVQsIFBPU1QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIFJldHVybnMgYSBsaXN0IG9mIGJvb2ttYXJrcyBmb3IgYWN0dWFsIHVzZXIgcmVzb3VyY2UuCisqKl8vdXNlcnMve3VzZXJpZH0vYm9va21hcmtzL3tibWlkfV8qKiAgfCAgQm9va21hcmtSZXNvdXJjZSAgIHwgIEdFVCwgUFVULCBERUxFVEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgUmV0dXJucyBib29rbWFyayB1cmkgYW5kIGEgbG9uZyBhbmQgc2hvcnQgZGVzY3JpcHRpb24uCisKK1J1bm5pbmcgdGhlIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworQm9va21hcmsgZXhhbXBsZSBydW5zIG9uIEdsYXNzZmlzaCAzLnggYXBwbGljYXRpb24gc2VydmVycworKFtodHRwczovL2phdmFlZS5naXRodWIuaW8vZ2xhc3NmaXNoL10oaHR0cHM6Ly9qYXZhZWUuZ2l0aHViLmlvL2dsYXNzZmlzaC8pKSBhbmQgbmVlZHMgYQorcnVubmluZyBKYXZhREIKKyg8aHR0cDovL3d3dy5vcmFjbGUuY29tL3RlY2huZXR3b3JrL2phdmEvamF2YWRiL292ZXJ2aWV3L2luZGV4Lmh0bWw+KQoraW5zdGFuY2UgZm9yIHVuZGVybHlpbmcgZGF0YSAoaXQgY29tZXMgYWxvbmcgd2l0aCBHbGFzc0Zpc2gpLgorCitQcmVzdW1pbmcsIHlvdSBoYXZlIGluc3RhbGxlZCBHbGFzc2Zpc2ggMy4xIGBBU19IT01FYCB2YXJpYWJsZSBzaG91bGQKK3BvaW50IHRvIHlvdXIgZ2xhc3NmaXNoIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkuCisKKyMjIyMgQnVpbGRpbmcgQW5kIFN0YXJ0aW5nIFRoZSBCb29rbWFyayBTZXJ2aWNlCisKK0lmIGAuYXNhZG1pbnBhc3NgIGZpbGUgaXMgbWlzc2luZyBhdCB5b3VyIGhvbWUgZGlyZWN0b3J5LCB5b3Ugd2lsbCBuZWVkCit0byBydW4gdGhlIGZvbGxvd2luZyBjb21tYW5kIHRvIGdldCBpdCBjcmVhdGVkCisKKyAgICAkQVNfSE9NRS9iaW4vYXNhZG1pbiBzdGFydC1kb21haW4KKyAgICAkQVNfSE9NRS9iaW4vYXNhZG1pbiBsb2dpbgorCitZb3UgdGhlbiBidWlsZCBhbmQgcnVuIHRoZSBleGFtcGxlIGJ5CisKKyAgICBtdm4gcGFja2FnZQorICAgICRBU19IT01FL2Jpbi9hc2FkbWluIHN0YXJ0LWRvbWFpbgorICAgICRBU19IT01FL2Jpbi9hc2FkbWluIHN0YXJ0LWRhdGFiYXNlCisgICAgJEFTX0hPTUUvYmluL2FzYWRtaW4gY3JlYXRlLWpkYmMtY29ubmVjdGlvbi1wb29sIFwKKyAgICAgICAgICAgICAtLWRhdGFzb3VyY2VjbGFzc25hbWUgb3JnLmFwYWNoZS5kZXJieS5qZGJjLkNsaWVudERhdGFTb3VyY2UgXAorICAgICAgICAgICAgIC0tcmVzdHlwZSBqYXZheC5zcWwuRGF0YVNvdXJjZSBcCisgICAgICAgICAgICAgLS1wcm9wZXJ0eSAicG9ydG51bWJlcj0xNTI3OnBhc3N3b3JkPVJFU1Q6dXNlcj1SRVNUOnNlcnZlck5hbWU9bG9jYWxob3N0OmRhdGFiYXNlTmFtZT1Cb29rbWFya0RCOmNvbm5lY3Rpb25BdHRyaWJ1dGVzPTtjcmVhdGVcPXRydWUiIGJvb2ttYXJrUG9vbAorICAgICRBU19IT01FL2Jpbi9hc2FkbWluIGNyZWF0ZS1qZGJjLXJlc291cmNlIC0tY29ubmVjdGlvbnBvb2xpZCBib29rbWFya1Bvb2wgamRiYy9ib29rbWFya1NhbXBsZQorICAgICRBU19IT01FL2Jpbi9hc2FkbWluIGRlcGxveSB0YXJnZXQvYm9va21hcmsud2FyCisKKyoqTm90aWNlOioqIDxzcGFuIHN0eWxlPSJjb2xvcjogI2YwMCI+T24gV2luZG93czwvc3Bhbj46IHlvdSBtaWdodCBuZWVkCit0byByZXBsYWNlIGFzYWRtaW4gd2l0aCBhc2FkbWluLmJhdC4gQWxzbywgYmVjYXVzZSBpdCBzZWVtcyB0aGVyZSBhcmUKK3NvbWUgaXNzdWVzIHdpdGggY29weS1wYXN0aW5nIGJhY2tzbGFzaGVzLCB5b3Ugd2lsbCBhbHNvIG5lZWQgdG8gdXNlIHRoZQorZm9sbG93aW5nIG9uZS1saW5lciBpbnN0ZWFkIG9mIHRoZSBhYm92ZSBtZW50aW9uZWQgY29tcGxleCBjb21tYW5kOgorCisgICAgYXNhZG1pbiBjcmVhdGUtamRiYy1jb25uZWN0aW9uLXBvb2wgLS1kYXRhc291cmNlY2xhc3NuYW1lIG9yZy5hcGFjaGUuZGVyYnkuamRiYy5DbGllbnREYXRhU291cmNlIC0tcmVzdHlwZSBqYXZheC5zcWwuRGF0YVNvdXJjZSAtLXByb3BlcnR5ICJwb3J0bnVtYmVyPTE1Mjc6cGFzc3dvcmQ9UkVTVDp1c2VyPVJFU1Q6c2VydmVyTmFtZT1sb2NhbGhvc3Q6ZGF0YWJhc2VOYW1lPUJvb2ttYXJrREI6Y29ubmVjdGlvbkF0dHJpYnV0ZXM9O2NyZWF0ZVw9dHJ1ZSIgYm9va21hcmtQb29sCisKK2FuZCBtYWtlIHN1cmUgeW91IGRvIG5vdCBtaXNzIHRoZSBiYWNrc2xhc2ggKFxcKSBpbiBgY3JlYXRlXD10cnVlYCBwYXJ0LgorCisjIyMjIFRlc3QgQ2xpZW50IFJ1bm5pbmcKKworICAgIG12biB0ZXN0IC1EamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5mYWN0b3J5PW9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSAtRGplcnNleS5jb25maWcudGVzdC5sb2dnaW5nLmVuYWJsZT10cnVlIC1EamVyc2V5LmNvbmZpZy50ZXN0LmxvZ2dpbmcuZHVtcEVudGl0eT10cnVlIC1EamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0PTgwODAgLVB0ZXN0CisKK0xpbmtzCistLS0tLQorCis8aHR0cDovL2phdmEubmV0L3Byb2plY3RzL2JwY2F0YWxvZy9zb3VyY2VzL3N2bi9jb250ZW50L3RydW5rL2VlNS9kb2NzL3BlcnNpc3RlbmNlL3dlYm9ubHlhcHAuaHRtbD9yYXc9dHJ1ZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9ib29rbWFyay9wb20ueG1sIGIvZXhhbXBsZXMvYm9va21hcmsvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGI3ZmM5Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYm9va21hcmsvcG9tLnhtbApAQCAtMCwwICsxLDExNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKworICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD53ZWJhcHAtZXhhbXBsZS1wYXJlbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vd2ViYXBwLWV4YW1wbGUtcGFyZW50L3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmJvb2ttYXJrPC9hcnRpZmFjdElkPgorICAgIDxuYW1lPmplcnNleS1leGFtcGxlcy1ib29rbWFyazwvbmFtZT4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorCisgICAgPGRlc2NyaXB0aW9uPkplcnNleSBCb29rbWFyayBleGFtcGxlLjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLWpzb24tamV0dGlzb248L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5wZXJzaXN0ZW5jZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnBlcnNpc3RlbmNlLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1oazI8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC50cmFuc2FjdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmp0YTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjEuMTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8IS0tIFJ1biB0aGUgYXBwbGljYXRpb24gdXNpbmcgIm12biBlbWJlZGRlZC1nbGFzc2Zpc2g6cnVuIiAtLT4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5lbWJlZGRlZDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1lbWJlZGRlZC1nbGFzc2Zpc2gtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5ydW4tZXh0ZXJuYWwtdGVzdHM8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN5c3RlbVByb3BlcnR5VmFyaWFibGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5mYWN0b3J5PiR7ZXh0ZXJuYWwuY29udGFpbmVyLmZhY3Rvcnl9PC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+JHtleHRlcm5hbC5jb250YWluZXIucG9ydH08L2plcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N5c3RlbVByb3BlcnR5VmFyaWFibGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICAgICAgPHByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgPCEtLSBFeHRlcm5hbCB0ZXN0IGNvbnRhaW5lciBjb25maWd1cmF0aW9uIGlzIGRvbmUgdmlhIHByb3BlcnRpZXMgdG8gYWxsb3cgb3ZlcnJpZGluZyB2aWEgY29tbWFuZCBsaW5lLiAtLT4KKyAgICAgICAgICAgICAgICA8ZXh0ZXJuYWwuY29udGFpbmVyLmZhY3Rvcnk+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5PC9leHRlcm5hbC5jb250YWluZXIuZmFjdG9yeT4KKyAgICAgICAgICAgICAgICA8ZXh0ZXJuYWwuY29udGFpbmVyLnBvcnQ+ODA4MDwvZXh0ZXJuYWwuY29udGFpbmVyLnBvcnQ+CisgICAgICAgICAgICAgICAgPG1hdmVuLnRlc3Quc2tpcD5mYWxzZTwvbWF2ZW4udGVzdC5za2lwPgorICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnJlbGVhc2U8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD54bWwtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2tpcD50cnVlPC9za2lwPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8bWF2ZW4udGVzdC5za2lwPnRydWU8L21hdmVuLnRlc3Quc2tpcD4KKyAgICA8L3Byb3BlcnRpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2Jvb2ttYXJrL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYm9va21hcmsvTXlBcHBsaWNhdGlvbi5qYXZhIGIvZXhhbXBsZXMvYm9va21hcmsvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9ib29rbWFyay9NeUFwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ4NzVhOAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2Jvb2ttYXJrL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYm9va21hcmsvTXlBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuYm9va21hcms7CisKK2ltcG9ydCBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGg7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5ib29rbWFyay5yZXNvdXJjZS5Vc2Vyc1Jlc291cmNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHRpc29uLkpldHRpc29uRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BBcHBsaWNhdGlvblBhdGgoIi8iKQorcHVibGljIGNsYXNzIE15QXBwbGljYXRpb24gZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisKKyAgICBwdWJsaWMgTXlBcHBsaWNhdGlvbigpIHsKKyAgICAgICAgcmVnaXN0ZXJDbGFzc2VzKFVzZXJzUmVzb3VyY2UuY2xhc3MpOworICAgICAgICByZWdpc3RlcihuZXcgSmV0dGlzb25GZWF0dXJlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2Jvb2ttYXJrL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYm9va21hcmsvZW50aXR5L0Jvb2ttYXJrRW50aXR5LmphdmEgYi9leGFtcGxlcy9ib29rbWFyay9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2Jvb2ttYXJrL2VudGl0eS9Cb29rbWFya0VudGl0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNjkyYmYKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9ib29rbWFyay9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2Jvb2ttYXJrL2VudGl0eS9Cb29rbWFya0VudGl0eS5qYXZhCkBAIC0wLDAgKzEsMjU5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmJvb2ttYXJrLmVudGl0eTsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkVtYmVkZGVkSWQ7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW50aXR5OworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkpvaW5Db2x1bW47CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuTWFueVRvT25lOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLk5hbWVkUXVlcmllczsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5OYW1lZFF1ZXJ5OworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLlRhYmxlOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLlRlbXBvcmFsOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLlRlbXBvcmFsVHlwZTsKKworLyoqCisgKiBFbnRpdHkgY2xhc3MgQm9va21hcmtFbnRpdHkuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQEVudGl0eQorQFRhYmxlKG5hbWUgPSAiQk9PS01BUktTIikKK0BOYW1lZFF1ZXJpZXMoeworICAgICAgICBATmFtZWRRdWVyeShuYW1lID0gIkJvb2ttYXJrRW50aXR5LmZpbmRCeVVzZXJpZCIsCisgICAgICAgICAgICAgICAgcXVlcnkgPSAiU0VMRUNUIGIgRlJPTSBCb29rbWFya0VudGl0eSBiIFdIRVJFIGIuYm9va21hcmtFbnRpdHlQSy51c2VyaWQgPSA6dXNlcmlkIiksCisgICAgICAgIEBOYW1lZFF1ZXJ5KG5hbWUgPSAiQm9va21hcmtFbnRpdHkuZmluZEJ5Qm1pZCIsCisgICAgICAgICAgICAgICAgcXVlcnkgPSAiU0VMRUNUIGIgRlJPTSBCb29rbWFya0VudGl0eSBiIFdIRVJFIGIuYm9va21hcmtFbnRpdHlQSy5ibWlkID0gOmJtaWQiKSwKKyAgICAgICAgQE5hbWVkUXVlcnkobmFtZSA9ICJCb29rbWFya0VudGl0eS5maW5kQnlVcmkiLCBxdWVyeSA9ICJTRUxFQ1QgYiBGUk9NIEJvb2ttYXJrRW50aXR5IGIgV0hFUkUgYi51cmkgPSA6dXJpIiksCisgICAgICAgIEBOYW1lZFF1ZXJ5KG5hbWUgPSAiQm9va21hcmtFbnRpdHkuZmluZEJ5VXBkYXRlZCIsIHF1ZXJ5ID0gIlNFTEVDVCBiIEZST00gQm9va21hcmtFbnRpdHkgYiBXSEVSRSBiLnVwZGF0ZWQgPSA6dXBkYXRlZCIpLAorICAgICAgICBATmFtZWRRdWVyeShuYW1lID0gIkJvb2ttYXJrRW50aXR5LmZpbmRCeUxkZXNjIiwgcXVlcnkgPSAiU0VMRUNUIGIgRlJPTSBCb29rbWFya0VudGl0eSBiIFdIRVJFIGIubGRlc2MgPSA6bGRlc2MiKSwKKyAgICAgICAgQE5hbWVkUXVlcnkobmFtZSA9ICJCb29rbWFya0VudGl0eS5maW5kQnlTZGVzYyIsIHF1ZXJ5ID0gIlNFTEVDVCBiIEZST00gQm9va21hcmtFbnRpdHkgYiBXSEVSRSBiLnNkZXNjID0gOnNkZXNjIikKK30pCitAU3VwcHJlc3NXYXJuaW5ncygiVW51c2VkRGVjbGFyYXRpb24iKQorcHVibGljIGNsYXNzIEJvb2ttYXJrRW50aXR5IGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworICAgIC8qKgorICAgICAqIEVtYmVkZGVkSWQgcHJpbWFyeSBrZXkgZmllbGQKKyAgICAgKi8KKyAgICBARW1iZWRkZWRJZAorICAgIHByb3RlY3RlZCBCb29rbWFya0VudGl0eVBLIGJvb2ttYXJrRW50aXR5UEs7CisKKyAgICBAQ29sdW1uKG5hbWUgPSAiVVJJIiwgbnVsbGFibGUgPSBmYWxzZSkKKyAgICBwcml2YXRlIFN0cmluZyB1cmk7CisKKyAgICBAQ29sdW1uKG5hbWUgPSAiVVBEQVRFRCIpCisgICAgQFRlbXBvcmFsKFRlbXBvcmFsVHlwZS5USU1FU1RBTVApCisgICAgcHJpdmF0ZSBEYXRlIHVwZGF0ZWQ7CisKKyAgICBAQ29sdW1uKG5hbWUgPSAiTERFU0MiKQorICAgIHByaXZhdGUgU3RyaW5nIGxkZXNjOworCisgICAgQENvbHVtbihuYW1lID0gIlNERVNDIikKKyAgICBwcml2YXRlIFN0cmluZyBzZGVzYzsKKworICAgIEBKb2luQ29sdW1uKG5hbWUgPSAiVVNFUklEIiwgcmVmZXJlbmNlZENvbHVtbk5hbWUgPSAiVVNFUklEIiwgaW5zZXJ0YWJsZSA9IGZhbHNlLCB1cGRhdGFibGUgPSBmYWxzZSkKKyAgICBATWFueVRvT25lCisgICAgcHJpdmF0ZSBVc2VyRW50aXR5IHVzZXJFbnRpdHk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIEJvb2ttYXJrRW50aXR5CisgICAgICovCisgICAgcHVibGljIEJvb2ttYXJrRW50aXR5KCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgQm9va21hcmtFbnRpdHkgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBib29rbWFya0VudGl0eVBLIHRoZSBib29rbWFya0VudGl0eVBLIG9mIHRoZSBCb29rbWFya0VudGl0eQorICAgICAqLworICAgIHB1YmxpYyBCb29rbWFya0VudGl0eShCb29rbWFya0VudGl0eVBLIGJvb2ttYXJrRW50aXR5UEspIHsKKyAgICAgICAgdGhpcy5ib29rbWFya0VudGl0eVBLID0gYm9va21hcmtFbnRpdHlQSzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIEJvb2ttYXJrRW50aXR5IHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYm9va21hcmtFbnRpdHlQSyB0aGUgYm9va21hcmtFbnRpdHlQSyBvZiB0aGUgQm9va21hcmtFbnRpdHkKKyAgICAgKiBAcGFyYW0gdXJpIHRoZSB1cmkgb2YgdGhlIEJvb2ttYXJrRW50aXR5CisgICAgICovCisgICAgcHVibGljIEJvb2ttYXJrRW50aXR5KEJvb2ttYXJrRW50aXR5UEsgYm9va21hcmtFbnRpdHlQSywgU3RyaW5nIHVyaSkgeworICAgICAgICB0aGlzLmJvb2ttYXJrRW50aXR5UEsgPSBib29rbWFya0VudGl0eVBLOworICAgICAgICB0aGlzLnVyaSA9IHVyaTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIEJvb2ttYXJrRW50aXR5UEsgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBibWlkIHRoZSBibWlkIG9mIHRoZSBCb29rbWFya0VudGl0eVBLCisgICAgICogQHBhcmFtIHVzZXJpZCB0aGUgdXNlcmlkIG9mIHRoZSBCb29rbWFya0VudGl0eVBLCisgICAgICovCisgICAgcHVibGljIEJvb2ttYXJrRW50aXR5KFN0cmluZyBibWlkLCBTdHJpbmcgdXNlcmlkKSB7CisgICAgICAgIHRoaXMuYm9va21hcmtFbnRpdHlQSyA9IG5ldyBCb29rbWFya0VudGl0eVBLKGJtaWQsIHVzZXJpZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgYm9va21hcmtFbnRpdHlQSyBvZiB0aGlzIEJvb2ttYXJrRW50aXR5LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgYm9va21hcmtFbnRpdHlQSworICAgICAqLworICAgIHB1YmxpYyBCb29rbWFya0VudGl0eVBLIGdldEJvb2ttYXJrRW50aXR5UEsoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmJvb2ttYXJrRW50aXR5UEs7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgYm9va21hcmtFbnRpdHlQSyBvZiB0aGlzIEJvb2ttYXJrRW50aXR5IHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYm9va21hcmtFbnRpdHlQSyB0aGUgbmV3IGJvb2ttYXJrRW50aXR5UEsKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCb29rbWFya0VudGl0eVBLKEJvb2ttYXJrRW50aXR5UEsgYm9va21hcmtFbnRpdHlQSykgeworICAgICAgICB0aGlzLmJvb2ttYXJrRW50aXR5UEsgPSBib29rbWFya0VudGl0eVBLOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHVyaSBvZiB0aGlzIEJvb2ttYXJrRW50aXR5LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgdXJpCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRVcmkoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnVyaTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB1cmkgb2YgdGhpcyBCb29rbWFya0VudGl0eSB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIHVyaSB0aGUgbmV3IHVyaQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVyaShTdHJpbmcgdXJpKSB7CisgICAgICAgIHRoaXMudXJpID0gdXJpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHVwZGF0ZWQgb2YgdGhpcyBCb29rbWFya0VudGl0eS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHVwZGF0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgRGF0ZSBnZXRVcGRhdGVkKCkgeworICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHVwZGF0ZWQgb2YgdGhpcyBCb29rbWFya0VudGl0eSB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIHVwZGF0ZWQgdGhlIG5ldyB1cGRhdGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXBkYXRlZChEYXRlIHVwZGF0ZWQpIHsKKyAgICAgICAgdGhpcy51cGRhdGVkID0gdXBkYXRlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBsZGVzYyBvZiB0aGlzIEJvb2ttYXJrRW50aXR5LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbGRlc2MKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldExkZXNjKCkgeworICAgICAgICByZXR1cm4gdGhpcy5sZGVzYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBsZGVzYyBvZiB0aGlzIEJvb2ttYXJrRW50aXR5IHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGRlc2MgdGhlIG5ldyBsZGVzYworICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldExkZXNjKFN0cmluZyBsZGVzYykgeworICAgICAgICB0aGlzLmxkZXNjID0gbGRlc2M7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgc2Rlc2Mgb2YgdGhpcyBCb29rbWFya0VudGl0eS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHNkZXNjCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTZGVzYygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuc2Rlc2M7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc2Rlc2Mgb2YgdGhpcyBCb29rbWFya0VudGl0eSB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIHNkZXNjIHRoZSBuZXcgc2Rlc2MKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTZGVzYyhTdHJpbmcgc2Rlc2MpIHsKKyAgICAgICAgdGhpcy5zZGVzYyA9IHNkZXNjOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHVzZXJFbnRpdHkgb2YgdGhpcyBCb29rbWFya0VudGl0eS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHVzZXJFbnRpdHkKKyAgICAgKi8KKyAgICBwdWJsaWMgVXNlckVudGl0eSBnZXRVc2VyRW50aXR5KCkgeworICAgICAgICByZXR1cm4gdGhpcy51c2VyRW50aXR5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHVzZXJFbnRpdHkgb2YgdGhpcyBCb29rbWFya0VudGl0eSB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIHVzZXJFbnRpdHkgdGhlIG5ldyB1c2VyRW50aXR5CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlckVudGl0eShVc2VyRW50aXR5IHVzZXJFbnRpdHkpIHsKKyAgICAgICAgdGhpcy51c2VyRW50aXR5ID0gdXNlckVudGl0eTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgaGFzaCBjb2RlIHZhbHVlIGZvciB0aGUgb2JqZWN0LiAgVGhpcyBpbXBsZW1lbnRhdGlvbiBjb21wdXRlcworICAgICAqIGEgaGFzaCBjb2RlIHZhbHVlIGJhc2VkIG9uIHRoZSBpZCBmaWVsZHMgaW4gdGhpcyBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgaGFzaCBjb2RlIHZhbHVlIGZvciB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IDA7CisgICAgICAgIGhhc2ggKz0gKHRoaXMuYm9va21hcmtFbnRpdHlQSyAhPSBudWxsID8gdGhpcy5ib29rbWFya0VudGl0eVBLLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFub3RoZXIgb2JqZWN0IGlzIGVxdWFsIHRvIHRoaXMgQm9va21hcmtFbnRpdHkuICBUaGUgcmVzdWx0IGlzCisgICAgICogPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYW5kIG9ubHkgaWYgdGhlIGFyZ3VtZW50IGlzIG5vdCBudWxsIGFuZCBpcyBhIEJvb2ttYXJrRW50aXR5IG9iamVjdCB0aGF0CisgICAgICogaGFzIHRoZSBzYW1lIGlkIGZpZWxkIHZhbHVlcyBhcyB0aGlzIG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvYmplY3QgdGhlIHJlZmVyZW5jZSBvYmplY3Qgd2l0aCB3aGljaCB0byBjb21wYXJlCisgICAgICogQHJldHVybiA8Y29kZT50cnVlPC9jb2RlPiBpZiB0aGlzIG9iamVjdCBpcyB0aGUgc2FtZSBhcyB0aGUgYXJndW1lbnQ7CisgICAgICogICAgICAgICA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7CisgICAgICAgIC8vIFRPRE86IFdhcm5pbmcgLSB0aGlzIG1ldGhvZCB3b24ndCB3b3JrIGluIHRoZSBjYXNlIHRoZSBpZCBmaWVsZHMgYXJlIG5vdCBzZXQKKyAgICAgICAgaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgQm9va21hcmtFbnRpdHkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgQm9va21hcmtFbnRpdHkgb3RoZXIgPSAoQm9va21hcmtFbnRpdHkpIG9iamVjdDsKKyAgICAgICAgcmV0dXJuICEodGhpcy5ib29rbWFya0VudGl0eVBLICE9IG90aGVyLmJvb2ttYXJrRW50aXR5UEsgJiYgKHRoaXMuYm9va21hcmtFbnRpdHlQSyA9PSBudWxsIHx8ICF0aGlzLmJvb2ttYXJrRW50aXR5UEsKKyAgICAgICAgICAgICAgICAuZXF1YWxzKG90aGVyLmJvb2ttYXJrRW50aXR5UEspKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0LiAgVGhpcyBpbXBsZW1lbnRhdGlvbiBjb25zdHJ1Y3RzCisgICAgICogdGhhdCByZXByZXNlbnRhdGlvbiBiYXNlZCBvbiB0aGUgaWQgZmllbGRzLgorICAgICAqCisgICAgICogQHJldHVybiBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgb2JqZWN0LgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiQm9va21hcmtFbnRpdHl7IgorICAgICAgICAgICAgICAgKyAiYm9va21hcmtFbnRpdHlQSz0iICsgYm9va21hcmtFbnRpdHlQSworICAgICAgICAgICAgICAgKyAnfSc7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYm9va21hcmsvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9ib29rbWFyay9lbnRpdHkvQm9va21hcmtFbnRpdHlQSy5qYXZhIGIvZXhhbXBsZXMvYm9va21hcmsvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9ib29rbWFyay9lbnRpdHkvQm9va21hcmtFbnRpdHlQSy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NGJjOGEKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9ib29rbWFyay9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2Jvb2ttYXJrL2VudGl0eS9Cb29rbWFya0VudGl0eVBLLmphdmEKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuYm9va21hcmsuZW50aXR5OworCitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CisKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5Db2x1bW47CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW1iZWRkYWJsZTsKKworLyoqCisgKiBQcmltYXJ5IEtleSBjbGFzcyBCb29rbWFya0VudGl0eVBLIGZvciBlbnRpdHkgY2xhc3MgQm9va21hcmtFbnRpdHkuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFN1cHByZXNzV2FybmluZ3MoIlVudXNlZERlY2xhcmF0aW9uIikKK0BFbWJlZGRhYmxlCitwdWJsaWMgY2xhc3MgQm9va21hcmtFbnRpdHlQSyBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKyAgICBAQ29sdW1uKG5hbWUgPSAiVVNFUklEIiwgbnVsbGFibGUgPSBmYWxzZSkKKyAgICBwcml2YXRlIFN0cmluZyB1c2VyaWQ7CisKKyAgICBAQ29sdW1uKG5hbWUgPSAiQk1JRCIsIG51bGxhYmxlID0gZmFsc2UpCisgICAgcHJpdmF0ZSBTdHJpbmcgYm1pZDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgQm9va21hcmtFbnRpdHlQSworICAgICAqLworICAgIHB1YmxpYyBCb29rbWFya0VudGl0eVBLKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgQm9va21hcmtFbnRpdHlQSyB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIGJtaWQgdGhlIGJtaWQgb2YgdGhlIEJvb2ttYXJrRW50aXR5UEsKKyAgICAgKiBAcGFyYW0gdXNlcmlkIHRoZSB1c2VyaWQgb2YgdGhlIEJvb2ttYXJrRW50aXR5UEsKKyAgICAgKi8KKyAgICBwdWJsaWMgQm9va21hcmtFbnRpdHlQSyhTdHJpbmcgYm1pZCwgU3RyaW5nIHVzZXJpZCkgeworICAgICAgICB0aGlzLmJtaWQgPSBibWlkOworICAgICAgICB0aGlzLnVzZXJpZCA9IHVzZXJpZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB1c2VyaWQgb2YgdGhpcyBCb29rbWFya0VudGl0eVBLLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgdXNlcmlkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRVc2VyaWQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnVzZXJpZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB1c2VyaWQgb2YgdGhpcyBCb29rbWFya0VudGl0eVBLIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlcmlkIHRoZSBuZXcgdXNlcmlkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VXNlcmlkKFN0cmluZyB1c2VyaWQpIHsKKyAgICAgICAgdGhpcy51c2VyaWQgPSB1c2VyaWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgYm1pZCBvZiB0aGlzIEJvb2ttYXJrRW50aXR5UEsuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBibWlkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRCbWlkKCkgeworICAgICAgICByZXR1cm4gdGhpcy5ibWlkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGJtaWQgb2YgdGhpcyBCb29rbWFya0VudGl0eVBLIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYm1pZCB0aGUgbmV3IGJtaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCbWlkKFN0cmluZyBibWlkKSB7CisgICAgICAgIHRoaXMuYm1pZCA9IGJtaWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGhhc2ggY29kZSB2YWx1ZSBmb3IgdGhlIG9iamVjdC4gIFRoaXMgaW1wbGVtZW50YXRpb24gY29tcHV0ZXMKKyAgICAgKiBhIGhhc2ggY29kZSB2YWx1ZSBiYXNlZCBvbiB0aGUgaWQgZmllbGRzIGluIHRoaXMgb2JqZWN0LgorICAgICAqCisgICAgICogQHJldHVybiBhIGhhc2ggY29kZSB2YWx1ZSBmb3IgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGhhc2ggPSAwOworICAgICAgICBoYXNoICs9ICh0aGlzLmJtaWQgIT0gbnVsbCA/IHRoaXMuYm1pZC5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIGhhc2ggKz0gKHRoaXMudXNlcmlkICE9IG51bGwgPyB0aGlzLnVzZXJpZC5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIHJldHVybiBoYXNoOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZXMgd2hldGhlciBhbm90aGVyIG9iamVjdCBpcyBlcXVhbCB0byB0aGlzIEJvb2ttYXJrRW50aXR5UEsuICBUaGUgcmVzdWx0IGlzCisgICAgICogPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYW5kIG9ubHkgaWYgdGhlIGFyZ3VtZW50IGlzIG5vdCBudWxsIGFuZCBpcyBhIEJvb2ttYXJrRW50aXR5UEsgb2JqZWN0IHRoYXQKKyAgICAgKiBoYXMgdGhlIHNhbWUgaWQgZmllbGQgdmFsdWVzIGFzIHRoaXMgb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIG9iamVjdCB0aGUgcmVmZXJlbmNlIG9iamVjdCB3aXRoIHdoaWNoIHRvIGNvbXBhcmUKKyAgICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoaXMgb2JqZWN0IGlzIHRoZSBzYW1lIGFzIHRoZSBhcmd1bWVudDsKKyAgICAgKiAgICAgICAgIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgQFN1cHByZXNzV2FybmluZ3MoIlN0cmluZ0VxdWFsaXR5IikKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgeworICAgICAgICAvLyBUT0RPOiBXYXJuaW5nIC0gdGhpcyBtZXRob2Qgd29uJ3Qgd29yayBpbiB0aGUgY2FzZSB0aGUgaWQgZmllbGRzIGFyZSBub3Qgc2V0CisgICAgICAgIGlmICghKG9iamVjdCBpbnN0YW5jZW9mIEJvb2ttYXJrRW50aXR5UEspKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBCb29rbWFya0VudGl0eVBLIG90aGVyID0gKEJvb2ttYXJrRW50aXR5UEspIG9iamVjdDsKKyAgICAgICAgaWYgKHRoaXMuYm1pZCAhPSBvdGhlci5ibWlkICYmICh0aGlzLmJtaWQgPT0gbnVsbCB8fCAhdGhpcy5ibWlkLmVxdWFscyhvdGhlci5ibWlkKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy51c2VyaWQgIT0gb3RoZXIudXNlcmlkICYmICh0aGlzLnVzZXJpZCA9PSBudWxsIHx8ICF0aGlzLnVzZXJpZC5lcXVhbHMob3RoZXIudXNlcmlkKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG9iamVjdC4gIFRoaXMgaW1wbGVtZW50YXRpb24gY29uc3RydWN0cworICAgICAqIHRoYXQgcmVwcmVzZW50YXRpb24gYmFzZWQgb24gdGhlIGlkIGZpZWxkcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIG9iamVjdC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIkJvb2ttYXJrRW50aXR5UEt7IgorICAgICAgICAgICAgICAgKyAidXNlcmlkPSciICsgdXNlcmlkICsgJ1wnJworICAgICAgICAgICAgICAgKyAiLCBibWlkPSciICsgYm1pZCArICdcJycKKyAgICAgICAgICAgICAgICsgJ30nOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2Jvb2ttYXJrL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYm9va21hcmsvZW50aXR5L1VzZXJFbnRpdHkuamF2YSBiL2V4YW1wbGVzL2Jvb2ttYXJrL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYm9va21hcmsvZW50aXR5L1VzZXJFbnRpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjVhYmUyCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYm9va21hcmsvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9ib29rbWFyay9lbnRpdHkvVXNlckVudGl0eS5qYXZhCkBAIC0wLDAgKzEsMjIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmJvb2ttYXJrLmVudGl0eTsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQ2FzY2FkZVR5cGU7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuQ29sdW1uOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkVudGl0eTsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5JZDsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5OYW1lZFF1ZXJpZXM7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuTmFtZWRRdWVyeTsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5PbmVUb01hbnk7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuVGFibGU7CisKKy8qKgorICogRW50aXR5IGNsYXNzIFVzZXJFbnRpdHkuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFN1cHByZXNzV2FybmluZ3MoIlVudXNlZERlY2xhcmF0aW9uIikKK0BFbnRpdHkKK0BUYWJsZShuYW1lID0gIlVTRVJTIikKK0BOYW1lZFF1ZXJpZXMoeworICAgICAgICBATmFtZWRRdWVyeShuYW1lID0gIlVzZXJFbnRpdHkuZmluZEJ5VXNlcmlkIiwgcXVlcnkgPSAiU0VMRUNUIHUgRlJPTSBVc2VyRW50aXR5IHUgV0hFUkUgdS51c2VyaWQgPSA6dXNlcmlkIiksCisgICAgICAgIEBOYW1lZFF1ZXJ5KG5hbWUgPSAiVXNlckVudGl0eS5maW5kQnlQYXNzd29yZCIsIHF1ZXJ5ID0gIlNFTEVDVCB1IEZST00gVXNlckVudGl0eSB1IFdIRVJFIHUucGFzc3dvcmQgPSA6cGFzc3dvcmQiKSwKKyAgICAgICAgQE5hbWVkUXVlcnkobmFtZSA9ICJVc2VyRW50aXR5LmZpbmRCeVVzZXJuYW1lIiwgcXVlcnkgPSAiU0VMRUNUIHUgRlJPTSBVc2VyRW50aXR5IHUgV0hFUkUgdS51c2VybmFtZSA9IDp1c2VybmFtZSIpLAorICAgICAgICBATmFtZWRRdWVyeShuYW1lID0gIlVzZXJFbnRpdHkuZmluZEJ5RW1haWwiLCBxdWVyeSA9ICJTRUxFQ1QgdSBGUk9NIFVzZXJFbnRpdHkgdSBXSEVSRSB1LmVtYWlsID0gOmVtYWlsIikKK30pCitwdWJsaWMgY2xhc3MgVXNlckVudGl0eSBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisKKyAgICBASWQKKyAgICBAQ29sdW1uKG5hbWUgPSAiVVNFUklEIiwgbnVsbGFibGUgPSBmYWxzZSkKKyAgICBwcml2YXRlIFN0cmluZyB1c2VyaWQ7CisKKyAgICBAQ29sdW1uKG5hbWUgPSAiUEFTU1dPUkQiLCBudWxsYWJsZSA9IGZhbHNlKQorICAgIHByaXZhdGUgU3RyaW5nIHBhc3N3b3JkOworCisgICAgQENvbHVtbihuYW1lID0gIlVTRVJOQU1FIikKKyAgICBwcml2YXRlIFN0cmluZyB1c2VybmFtZTsKKworICAgIEBDb2x1bW4obmFtZSA9ICJFTUFJTCIpCisgICAgcHJpdmF0ZSBTdHJpbmcgZW1haWw7CisKKyAgICBAT25lVG9NYW55KGNhc2NhZGUgPSBDYXNjYWRlVHlwZS5BTEwsIG1hcHBlZEJ5ID0gInVzZXJFbnRpdHkiKQorICAgIHByaXZhdGUgQ29sbGVjdGlvbjxCb29rbWFya0VudGl0eT4gYm9va21hcmtFbnRpdHlDb2xsZWN0aW9uOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBVc2VyRW50aXR5CisgICAgICovCisgICAgcHVibGljIFVzZXJFbnRpdHkoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBVc2VyRW50aXR5IHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlcmlkIHRoZSB1c2VyaWQgb2YgdGhlIFVzZXJFbnRpdHkKKyAgICAgKi8KKyAgICBwdWJsaWMgVXNlckVudGl0eShTdHJpbmcgdXNlcmlkKSB7CisgICAgICAgIHRoaXMudXNlcmlkID0gdXNlcmlkOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgVXNlckVudGl0eSB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWVzLgorICAgICAqCisgICAgICogQHBhcmFtIHVzZXJpZCB0aGUgdXNlcmlkIG9mIHRoZSBVc2VyRW50aXR5CisgICAgICogQHBhcmFtIHBhc3N3b3JkIHRoZSBwYXNzd29yZCBvZiB0aGUgVXNlckVudGl0eQorICAgICAqLworICAgIHB1YmxpYyBVc2VyRW50aXR5KFN0cmluZyB1c2VyaWQsIFN0cmluZyBwYXNzd29yZCkgeworICAgICAgICB0aGlzLnVzZXJpZCA9IHVzZXJpZDsKKyAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHVzZXJpZCBvZiB0aGlzIFVzZXJFbnRpdHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSB1c2VyaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFVzZXJpZCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudXNlcmlkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHVzZXJpZCBvZiB0aGlzIFVzZXJFbnRpdHkgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1c2VyaWQgdGhlIG5ldyB1c2VyaWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VyaWQoU3RyaW5nIHVzZXJpZCkgeworICAgICAgICB0aGlzLnVzZXJpZCA9IHVzZXJpZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBwYXNzd29yZCBvZiB0aGlzIFVzZXJFbnRpdHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBwYXNzd29yZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFzc3dvcmQoKSB7CisgICAgICAgIHJldHVybiB0aGlzLnBhc3N3b3JkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHBhc3N3b3JkIG9mIHRoaXMgVXNlckVudGl0eSB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIHBhc3N3b3JkIHRoZSBuZXcgcGFzc3dvcmQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXNzd29yZChTdHJpbmcgcGFzc3dvcmQpIHsKKyAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHVzZXJuYW1lIG9mIHRoaXMgVXNlckVudGl0eS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHVzZXJuYW1lCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRVc2VybmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMudXNlcm5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdXNlcm5hbWUgb2YgdGhpcyBVc2VyRW50aXR5IHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXNlcm5hbWUgdGhlIG5ldyB1c2VybmFtZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFVzZXJuYW1lKFN0cmluZyB1c2VybmFtZSkgeworICAgICAgICB0aGlzLnVzZXJuYW1lID0gdXNlcm5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgZW1haWwgb2YgdGhpcyBVc2VyRW50aXR5LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZW1haWwKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEVtYWlsKCkgeworICAgICAgICByZXR1cm4gdGhpcy5lbWFpbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBlbWFpbCBvZiB0aGlzIFVzZXJFbnRpdHkgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbWFpbCB0aGUgbmV3IGVtYWlsCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RW1haWwoU3RyaW5nIGVtYWlsKSB7CisgICAgICAgIHRoaXMuZW1haWwgPSBlbWFpbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBib29rbWFya0VudGl0eUNvbGxlY3Rpb24gb2YgdGhpcyBVc2VyRW50aXR5LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgYm9va21hcmtFbnRpdHlDb2xsZWN0aW9uCisgICAgICovCisgICAgcHVibGljIENvbGxlY3Rpb248Qm9va21hcmtFbnRpdHk+IGdldEJvb2ttYXJrRW50aXR5Q29sbGVjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuYm9va21hcmtFbnRpdHlDb2xsZWN0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGJvb2ttYXJrRW50aXR5Q29sbGVjdGlvbiBvZiB0aGlzIFVzZXJFbnRpdHkgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBib29rbWFya0VudGl0eUNvbGxlY3Rpb24gdGhlIG5ldyBib29rbWFya0VudGl0eUNvbGxlY3Rpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCb29rbWFya0VudGl0eUNvbGxlY3Rpb24oQ29sbGVjdGlvbjxCb29rbWFya0VudGl0eT4gYm9va21hcmtFbnRpdHlDb2xsZWN0aW9uKSB7CisgICAgICAgIHRoaXMuYm9va21hcmtFbnRpdHlDb2xsZWN0aW9uID0gYm9va21hcmtFbnRpdHlDb2xsZWN0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoZSBvYmplY3QuICBUaGlzIGltcGxlbWVudGF0aW9uIGNvbXB1dGVzCisgICAgICogYSBoYXNoIGNvZGUgdmFsdWUgYmFzZWQgb24gdGhlIGlkIGZpZWxkcyBpbiB0aGlzIG9iamVjdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCBoYXNoID0gMDsKKyAgICAgICAgaGFzaCArPSAodGhpcy51c2VyaWQgIT0gbnVsbCA/IHRoaXMudXNlcmlkLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGFub3RoZXIgb2JqZWN0IGlzIGVxdWFsIHRvIHRoaXMgVXNlckVudGl0eS4gIFRoZSByZXN1bHQgaXMKKyAgICAgKiA8Y29kZT50cnVlPC9jb2RlPiBpZiBhbmQgb25seSBpZiB0aGUgYXJndW1lbnQgaXMgbm90IG51bGwgYW5kIGlzIGEgVXNlckVudGl0eSBvYmplY3QgdGhhdAorICAgICAqIGhhcyB0aGUgc2FtZSBpZCBmaWVsZCB2YWx1ZXMgYXMgdGhpcyBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JqZWN0IHRoZSByZWZlcmVuY2Ugb2JqZWN0IHdpdGggd2hpY2ggdG8gY29tcGFyZQorICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhpcyBvYmplY3QgaXMgdGhlIHNhbWUgYXMgdGhlIGFyZ3VtZW50OworICAgICAqICAgICAgICAgPGNvZGU+ZmFsc2U8L2NvZGU+IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiU3RyaW5nRXF1YWxpdHkiKQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7CisgICAgICAgIC8vIFRPRE86IFdhcm5pbmcgLSB0aGlzIG1ldGhvZCB3b24ndCB3b3JrIGluIHRoZSBjYXNlIHRoZSBpZCBmaWVsZHMgYXJlIG5vdCBzZXQKKyAgICAgICAgaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgVXNlckVudGl0eSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIFVzZXJFbnRpdHkgb3RoZXIgPSAoVXNlckVudGl0eSkgb2JqZWN0OworCisgICAgICAgIHJldHVybiAhKHRoaXMudXNlcmlkICE9IG90aGVyLnVzZXJpZCAmJiAodGhpcy51c2VyaWQgPT0gbnVsbCB8fCAhdGhpcy51c2VyaWQuZXF1YWxzKG90aGVyLnVzZXJpZCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvYmplY3QuICBUaGlzIGltcGxlbWVudGF0aW9uIGNvbnN0cnVjdHMKKyAgICAgKiB0aGF0IHJlcHJlc2VudGF0aW9uIGJhc2VkIG9uIHRoZSBpZCBmaWVsZHMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvYmplY3QuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJVc2VyRW50aXR5eyIKKyAgICAgICAgICAgICAgICsgInVzZXJpZD0nIiArIHVzZXJpZCArICdcJycKKyAgICAgICAgICAgICAgICsgJ30nOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2Jvb2ttYXJrL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYm9va21hcmsvZXhjZXB0aW9uL0V4dGVuZGVkTm90Rm91bmRFeGNlcHRpb24uamF2YSBiL2V4YW1wbGVzL2Jvb2ttYXJrL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYm9va21hcmsvZXhjZXB0aW9uL0V4dGVuZGVkTm90Rm91bmRFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDE3NDI2Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYm9va21hcmsvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9ib29rbWFyay9leGNlcHRpb24vRXh0ZW5kZWROb3RGb3VuZEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuYm9va21hcmsuZXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEV4dGVuZGVkTm90Rm91bmRFeGNlcHRpb24gZXh0ZW5kcyBOb3RGb3VuZEV4Y2VwdGlvbiB7CisKKyAgICBwdWJsaWMgRXh0ZW5kZWROb3RGb3VuZEV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICBzdXBlcihSZXNwb25zZS5zdGF0dXMoUmVzcG9uc2UuU3RhdHVzLk5PVF9GT1VORCkuZW50aXR5KG1lc3NhZ2UpLmJ1aWxkKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2Jvb2ttYXJrL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYm9va21hcmsvcmVzb3VyY2UvQm9va21hcmtSZXNvdXJjZS5qYXZhIGIvZXhhbXBsZXMvYm9va21hcmsvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9ib29rbWFyay9yZXNvdXJjZS9Cb29rbWFya1Jlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVkM2YwZAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2Jvb2ttYXJrL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYm9va21hcmsvcmVzb3VyY2UvQm9va21hcmtSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmJvb2ttYXJrLnJlc291cmNlOworCitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5ERUxFVEU7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBVVDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CisKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHlNYW5hZ2VyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuYm9va21hcmsuZW50aXR5LkJvb2ttYXJrRW50aXR5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmJvb2ttYXJrLmVudGl0eS5Cb29rbWFya0VudGl0eVBLOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmJvb2ttYXJrLmVudGl0eS5Vc2VyRW50aXR5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmJvb2ttYXJrLmV4Y2VwdGlvbi5FeHRlbmRlZE5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmJvb2ttYXJrLnV0aWwudHguVHJhbnNhY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmJvb2ttYXJrLnV0aWwudHguVHJhbnNhY3Rpb25hbDsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5qZXR0aXNvbi5qc29uLkpTT05FeGNlcHRpb247CitpbXBvcnQgb3JnLmNvZGVoYXVzLmpldHRpc29uLmpzb24uSlNPTk9iamVjdDsKKworLyoqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBCb29rbWFya1Jlc291cmNlIHsKKworICAgIFVyaUluZm8gdXJpSW5mbzsgLy8gYWN0dWFsIHVyaSBpbmZvIHByb3ZpZGVkIGJ5IHBhcmVudCByZXNvdXJjZQorICAgIEVudGl0eU1hbmFnZXIgZW07IC8vIGVudGl0eSBtYW5hZ2VyIHByb3ZpZGVkIGJ5IHBhcmVudCByZXNvdXJjZQorCisgICAgQm9va21hcmtFbnRpdHkgYm9va21hcmtFbnRpdHk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIFVzZXJSZXNvdXJjZQorICAgICAqLworICAgIHB1YmxpYyBCb29rbWFya1Jlc291cmNlKFVyaUluZm8gdXJpSW5mbywgRW50aXR5TWFuYWdlciBlbSwgVXNlckVudGl0eSB1c2VyRW50aXR5LCBTdHJpbmcgYm1pZCkgeworICAgICAgICB0aGlzLnVyaUluZm8gPSB1cmlJbmZvOworICAgICAgICB0aGlzLmVtID0gZW07CisgICAgICAgIGJvb2ttYXJrRW50aXR5ID0gZW0uZmluZChCb29rbWFya0VudGl0eS5jbGFzcywgbmV3IEJvb2ttYXJrRW50aXR5UEsoYm1pZCwgdXNlckVudGl0eS5nZXRVc2VyaWQoKSkpOworICAgICAgICBpZiAobnVsbCA9PSBib29rbWFya0VudGl0eSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEV4dGVuZGVkTm90Rm91bmRFeGNlcHRpb24oImJvb2ttYXJrIHdpdGggdXNlcmlkPSIKKyAgICAgICAgICAgICAgICAgICAgKyB1c2VyRW50aXR5LmdldFVzZXJpZCgpICsgIiBhbmQgYm1pZD0iCisgICAgICAgICAgICAgICAgICAgICsgYm1pZCArICIgbm90IGZvdW5kXG4iKTsKKyAgICAgICAgfQorICAgICAgICBib29rbWFya0VudGl0eS5zZXRVc2VyRW50aXR5KHVzZXJFbnRpdHkpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisgICAgcHVibGljIEpTT05PYmplY3QgZ2V0Qm9va21hcmsoKSB7CisgICAgICAgIHJldHVybiBhc0pzb24oKTsKKyAgICB9CisKKyAgICBAUFVUCisgICAgQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorICAgIHB1YmxpYyB2b2lkIHB1dEJvb2ttYXJrKEpTT05PYmplY3QganNvbkVudGl0eSkgdGhyb3dzIEpTT05FeGNlcHRpb24geworCisgICAgICAgIGJvb2ttYXJrRW50aXR5LnNldExkZXNjKGpzb25FbnRpdHkuZ2V0U3RyaW5nKCJsZGVzYyIpKTsKKyAgICAgICAgYm9va21hcmtFbnRpdHkuc2V0U2Rlc2MoanNvbkVudGl0eS5nZXRTdHJpbmcoInNkZXNjIikpOworICAgICAgICBib29rbWFya0VudGl0eS5zZXRVcGRhdGVkKG5ldyBEYXRlKCkpOworCisgICAgICAgIFRyYW5zYWN0aW9uTWFuYWdlci5tYW5hZ2UobmV3IFRyYW5zYWN0aW9uYWwoZW0pIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRyYW5zYWN0KCkgeworICAgICAgICAgICAgICAgIGVtLm1lcmdlKGJvb2ttYXJrRW50aXR5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQERFTEVURQorICAgIHB1YmxpYyB2b2lkIGRlbGV0ZUJvb2ttYXJrKCkgeworICAgICAgICBUcmFuc2FjdGlvbk1hbmFnZXIubWFuYWdlKG5ldyBUcmFuc2FjdGlvbmFsKGVtKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCB0cmFuc2FjdCgpIHsKKyAgICAgICAgICAgICAgICBVc2VyRW50aXR5IHVzZXJFbnRpdHkgPSBib29rbWFya0VudGl0eS5nZXRVc2VyRW50aXR5KCk7CisgICAgICAgICAgICAgICAgdXNlckVudGl0eS5nZXRCb29rbWFya0VudGl0eUNvbGxlY3Rpb24oKS5yZW1vdmUoYm9va21hcmtFbnRpdHkpOworICAgICAgICAgICAgICAgIGVtLm1lcmdlKHVzZXJFbnRpdHkpOworICAgICAgICAgICAgICAgIGVtLnJlbW92ZShib29rbWFya0VudGl0eSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyBKU09OT2JqZWN0IGFzSnNvbigpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSlNPTk9iamVjdCgpLnB1dCgidXNlcmlkIiwgYm9va21hcmtFbnRpdHkuZ2V0Qm9va21hcmtFbnRpdHlQSygpLmdldFVzZXJpZCgpKQorICAgICAgICAgICAgICAgICAgICAucHV0KCJzZGVzYyIsIGJvb2ttYXJrRW50aXR5LmdldFNkZXNjKCkpCisgICAgICAgICAgICAgICAgICAgIC5wdXQoImxkZXNjIiwgYm9va21hcmtFbnRpdHkuZ2V0TGRlc2MoKSkKKyAgICAgICAgICAgICAgICAgICAgLnB1dCgidXJpIiwgYm9va21hcmtFbnRpdHkuZ2V0VXJpKCkpOworICAgICAgICB9IGNhdGNoIChKU09ORXhjZXB0aW9uIGplKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBib29rbWFya0VudGl0eS5nZXRCb29rbWFya0VudGl0eVBLKCkuZ2V0VXNlcmlkKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYm9va21hcmsvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9ib29rbWFyay9yZXNvdXJjZS9Cb29rbWFya3NSZXNvdXJjZS5qYXZhIGIvZXhhbXBsZXMvYm9va21hcmsvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9ib29rbWFyay9yZXNvdXJjZS9Cb29rbWFya3NSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwM2FhYTUKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9ib29rbWFyay9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2Jvb2ttYXJrL3Jlc291cmNlL0Jvb2ttYXJrc1Jlc291cmNlLmphdmEKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuYm9va21hcmsucmVzb3VyY2U7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CisKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHlNYW5hZ2VyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuYm9va21hcmsuZW50aXR5LkJvb2ttYXJrRW50aXR5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmJvb2ttYXJrLnV0aWwudHguVHJhbnNhY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmJvb2ttYXJrLnV0aWwudHguVHJhbnNhY3Rpb25hbDsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5qZXR0aXNvbi5qc29uLkpTT05BcnJheTsKK2ltcG9ydCBvcmcuY29kZWhhdXMuamV0dGlzb24uanNvbi5KU09ORXhjZXB0aW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5qZXR0aXNvbi5qc29uLkpTT05PYmplY3Q7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgQm9va21hcmtzUmVzb3VyY2UgeworCisgICAgVXJpSW5mbyB1cmlJbmZvOyAvLyBhY3R1YWwgdXJpIGluZm8KKyAgICBFbnRpdHlNYW5hZ2VyIGVtOyAvLyBlbnRpdHkgbWFuYWdlciBwcm92aWRlZCBieSBwYXJlbnQgcmVzb3VyY2UKKworICAgIFVzZXJSZXNvdXJjZSB1c2VyUmVzb3VyY2U7IC8vIHBhcmVudCB1c2VyIHJlc291cmNlCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIEJvb2ttYXJrc1Jlc291cmNlCisgICAgICovCisgICAgcHVibGljIEJvb2ttYXJrc1Jlc291cmNlKFVyaUluZm8gdXJpSW5mbywgRW50aXR5TWFuYWdlciBlbSwgVXNlclJlc291cmNlIHVzZXJSZXNvdXJjZSkgeworICAgICAgICB0aGlzLnVyaUluZm8gPSB1cmlJbmZvOworICAgICAgICB0aGlzLmVtID0gZW07CisgICAgICAgIHRoaXMudXNlclJlc291cmNlID0gdXNlclJlc291cmNlOworICAgIH0KKworICAgIHB1YmxpYyBDb2xsZWN0aW9uPEJvb2ttYXJrRW50aXR5PiBnZXRCb29rbWFya3MoKSB7CisgICAgICAgIHJldHVybiB1c2VyUmVzb3VyY2UuZ2V0VXNlckVudGl0eSgpLmdldEJvb2ttYXJrRW50aXR5Q29sbGVjdGlvbigpOworICAgIH0KKworICAgIEBQYXRoKCJ7Ym1pZDogLit9IikKKyAgICBwdWJsaWMgQm9va21hcmtSZXNvdXJjZSBnZXRCb29rbWFyayhAUGF0aFBhcmFtKCJibWlkIikgU3RyaW5nIGJtaWQpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCb29rbWFya1Jlc291cmNlKHVyaUluZm8sIGVtLCB1c2VyUmVzb3VyY2UuZ2V0VXNlckVudGl0eSgpLCBibWlkKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorICAgIHB1YmxpYyBKU09OQXJyYXkgZ2V0Qm9va21hcmtzQXNKc29uQXJyYXkoKSB7CisgICAgICAgIEpTT05BcnJheSB1cmlBcnJheSA9IG5ldyBKU09OQXJyYXkoKTsKKyAgICAgICAgZm9yIChCb29rbWFya0VudGl0eSBib29rbWFya0VudGl0eSA6IGdldEJvb2ttYXJrcygpKSB7CisgICAgICAgICAgICBVcmlCdWlsZGVyIHViID0gdXJpSW5mby5nZXRBYnNvbHV0ZVBhdGhCdWlsZGVyKCk7CisgICAgICAgICAgICBVUkkgYm9va21hcmtVcmkgPSB1YgorICAgICAgICAgICAgICAgICAgICAucGF0aChib29rbWFya0VudGl0eS5nZXRCb29rbWFya0VudGl0eVBLKCkuZ2V0Qm1pZCgpKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgICAgIHVyaUFycmF5LnB1dChib29rbWFya1VyaS50b0FTQ0lJU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB1cmlBcnJheTsKKyAgICB9CisKKyAgICBAUE9TVAorICAgIEBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKyAgICBwdWJsaWMgUmVzcG9uc2UgcG9zdEZvcm0oSlNPTk9iamVjdCBib29rbWFyaykgdGhyb3dzIEpTT05FeGNlcHRpb24geworICAgICAgICBmaW5hbCBCb29rbWFya0VudGl0eSBib29rbWFya0VudGl0eSA9IG5ldyBCb29rbWFya0VudGl0eShnZXRCb29rbWFya0lkKGJvb2ttYXJrLmdldFN0cmluZygidXJpIikpLAorICAgICAgICAgICAgICAgIHVzZXJSZXNvdXJjZS5nZXRVc2VyRW50aXR5KCkuZ2V0VXNlcmlkKCkpOworCisgICAgICAgIGJvb2ttYXJrRW50aXR5LnNldFVyaShib29rbWFyay5nZXRTdHJpbmcoInVyaSIpKTsKKyAgICAgICAgYm9va21hcmtFbnRpdHkuc2V0VXBkYXRlZChuZXcgRGF0ZSgpKTsKKyAgICAgICAgYm9va21hcmtFbnRpdHkuc2V0U2Rlc2MoYm9va21hcmsuZ2V0U3RyaW5nKCJzZGVzYyIpKTsKKyAgICAgICAgYm9va21hcmtFbnRpdHkuc2V0TGRlc2MoYm9va21hcmsuZ2V0U3RyaW5nKCJsZGVzYyIpKTsKKyAgICAgICAgdXNlclJlc291cmNlLmdldFVzZXJFbnRpdHkoKS5nZXRCb29rbWFya0VudGl0eUNvbGxlY3Rpb24oKS5hZGQoYm9va21hcmtFbnRpdHkpOworCisgICAgICAgIFRyYW5zYWN0aW9uTWFuYWdlci5tYW5hZ2UobmV3IFRyYW5zYWN0aW9uYWwoZW0pIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRyYW5zYWN0KCkgeworICAgICAgICAgICAgICAgIGVtLm1lcmdlKHVzZXJSZXNvdXJjZS5nZXRVc2VyRW50aXR5KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBVUkkgYm9va21hcmtVcmkgPSB1cmlJbmZvLmdldEFic29sdXRlUGF0aEJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5wYXRoKGJvb2ttYXJrRW50aXR5LmdldEJvb2ttYXJrRW50aXR5UEsoKS5nZXRCbWlkKCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIHJldHVybiBSZXNwb25zZS5jcmVhdGVkKGJvb2ttYXJrVXJpKS5idWlsZCgpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldEJvb2ttYXJrSWQoU3RyaW5nIHVyaSkgeworICAgICAgICByZXR1cm4gdXJpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2Jvb2ttYXJrL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYm9va21hcmsvcmVzb3VyY2UvVXNlclJlc291cmNlLmphdmEgYi9leGFtcGxlcy9ib29rbWFyay9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2Jvb2ttYXJrL3Jlc291cmNlL1VzZXJSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZTkyZjgKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9ib29rbWFyay9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2Jvb2ttYXJrL3Jlc291cmNlL1VzZXJSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmJvb2ttYXJrLnJlc291cmNlOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuREVMRVRFOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QVVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKKworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkVudGl0eU1hbmFnZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5ib29rbWFyay5lbnRpdHkuVXNlckVudGl0eTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5ib29rbWFyay5leGNlcHRpb24uRXh0ZW5kZWROb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5ib29rbWFyay51dGlsLnR4LlRyYW5zYWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5ib29rbWFyay51dGlsLnR4LlRyYW5zYWN0aW9uYWw7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuamV0dGlzb24uanNvbi5KU09ORXhjZXB0aW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5qZXR0aXNvbi5qc29uLkpTT05PYmplY3Q7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgVXNlclJlc291cmNlIHsKKworICAgIFN0cmluZyB1c2VyaWQ7IC8vIHVzZXJpZCBmcm9tIHVybAorICAgIFVzZXJFbnRpdHkgdXNlckVudGl0eTsgLy8gYXBwcm9wcmlhdGUganBhIHVzZXIgZW50aXR5CisKKyAgICBVcmlJbmZvIHVyaUluZm87IC8vIGFjdHVhbCB1cmkgaW5mbyBwcm92aWRlZCBieSBwYXJlbnQgcmVzb3VyY2UKKyAgICBFbnRpdHlNYW5hZ2VyIGVtOyAvLyBlbnRpdHkgbWFuYWdlciBwcm92aWRlZCBieSBwYXJlbnQgcmVzb3VyY2UKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgVXNlclJlc291cmNlCisgICAgICovCisgICAgcHVibGljIFVzZXJSZXNvdXJjZShVcmlJbmZvIHVyaUluZm8sIEVudGl0eU1hbmFnZXIgZW0sIFN0cmluZyB1c2VyaWQpIHsKKyAgICAgICAgdGhpcy51cmlJbmZvID0gdXJpSW5mbzsKKyAgICAgICAgdGhpcy51c2VyaWQgPSB1c2VyaWQ7CisgICAgICAgIHRoaXMuZW0gPSBlbTsKKyAgICAgICAgdXNlckVudGl0eSA9IGVtLmZpbmQoVXNlckVudGl0eS5jbGFzcywgdXNlcmlkKTsKKyAgICB9CisKKyAgICBAUGF0aCgiYm9va21hcmtzLyIpCisgICAgcHVibGljIEJvb2ttYXJrc1Jlc291cmNlIGdldEJvb2ttYXJrc1Jlc291cmNlKCkgeworICAgICAgICBpZiAobnVsbCA9PSB1c2VyRW50aXR5KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXh0ZW5kZWROb3RGb3VuZEV4Y2VwdGlvbigidXNlcmlkICIgKyB1c2VyaWQgKyAiIGRvZXMgbm90IGV4aXN0ISIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgQm9va21hcmtzUmVzb3VyY2UodXJpSW5mbywgZW0sIHRoaXMpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgIHB1YmxpYyBKU09OT2JqZWN0IGdldFVzZXIoKSB0aHJvd3MgSlNPTkV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChudWxsID09IHVzZXJFbnRpdHkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBFeHRlbmRlZE5vdEZvdW5kRXhjZXB0aW9uKCJ1c2VyaWQgIiArIHVzZXJpZCArICJkb2VzIG5vdCBleGlzdCEiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IEpTT05PYmplY3QoKS5wdXQoInVzZXJpZCIsIHVzZXJFbnRpdHkuZ2V0VXNlcmlkKCkpCisgICAgICAgICAgICAgICAgLnB1dCgidXNlcm5hbWUiLCB1c2VyRW50aXR5LmdldFVzZXJuYW1lKCkpCisgICAgICAgICAgICAgICAgLnB1dCgiZW1haWwiLCB1c2VyRW50aXR5LmdldEVtYWlsKCkpCisgICAgICAgICAgICAgICAgLnB1dCgicGFzc3dvcmQiLCB1c2VyRW50aXR5LmdldFBhc3N3b3JkKCkpCisgICAgICAgICAgICAgICAgLnB1dCgiYm9va21hcmtzIiwgdXJpSW5mby5nZXRBYnNvbHV0ZVBhdGhCdWlsZGVyKCkucGF0aCgiYm9va21hcmtzIikuYnVpbGQoKSk7CisgICAgfQorCisgICAgQFBVVAorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgcHVibGljIFJlc3BvbnNlIHB1dFVzZXIoSlNPTk9iamVjdCBqc29uRW50aXR5KSB0aHJvd3MgSlNPTkV4Y2VwdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIGpzb25Vc2VyaWQgPSBqc29uRW50aXR5LmdldFN0cmluZygidXNlcmlkIik7CisKKyAgICAgICAgaWYgKChudWxsICE9IGpzb25Vc2VyaWQpICYmICFqc29uVXNlcmlkLmVxdWFscyh1c2VyaWQpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDQwOSkuZW50aXR5KCJ1c2VyaWRzIGRpZmZlciFcbiIpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBib29sZWFuIG5ld1JlY29yZCA9IChudWxsID09IHVzZXJFbnRpdHkpOyAvLyBpbnNlcnQgb3IgdXBkYXRlID8KKworICAgICAgICBpZiAobmV3UmVjb3JkKSB7IC8vIG5ldyB1c2VyIHJlY29yZCB0byBiZSBpbnNlcnRlZAorICAgICAgICAgICAgdXNlckVudGl0eSA9IG5ldyBVc2VyRW50aXR5KCk7CisgICAgICAgICAgICB1c2VyRW50aXR5LnNldFVzZXJpZCh1c2VyaWQpOworICAgICAgICB9CisgICAgICAgIHVzZXJFbnRpdHkuc2V0VXNlcm5hbWUoanNvbkVudGl0eS5nZXRTdHJpbmcoInVzZXJuYW1lIikpOworICAgICAgICB1c2VyRW50aXR5LnNldEVtYWlsKGpzb25FbnRpdHkuZ2V0U3RyaW5nKCJlbWFpbCIpKTsKKyAgICAgICAgdXNlckVudGl0eS5zZXRQYXNzd29yZChqc29uRW50aXR5LmdldFN0cmluZygicGFzc3dvcmQiKSk7CisKKyAgICAgICAgaWYgKG5ld1JlY29yZCkgeworICAgICAgICAgICAgVHJhbnNhY3Rpb25NYW5hZ2VyLm1hbmFnZShuZXcgVHJhbnNhY3Rpb25hbChlbSkgeworICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHRyYW5zYWN0KCkgeworICAgICAgICAgICAgICAgICAgICBlbS5wZXJzaXN0KHVzZXJFbnRpdHkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLmNyZWF0ZWQodXJpSW5mby5nZXRBYnNvbHV0ZVBhdGgoKSkuYnVpbGQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFRyYW5zYWN0aW9uTWFuYWdlci5tYW5hZ2UobmV3IFRyYW5zYWN0aW9uYWwoZW0pIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB0cmFuc2FjdCgpIHsKKyAgICAgICAgICAgICAgICAgICAgZW0ubWVyZ2UodXNlckVudGl0eSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uubm9Db250ZW50KCkuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBERUxFVEUKKyAgICBwdWJsaWMgdm9pZCBkZWxldGVVc2VyKCkgeworICAgICAgICBpZiAobnVsbCA9PSB1c2VyRW50aXR5KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgRXh0ZW5kZWROb3RGb3VuZEV4Y2VwdGlvbigidXNlcmlkICIgKyB1c2VyaWQgKyAiZG9lcyBub3QgZXhpc3QhIik7CisgICAgICAgIH0KKyAgICAgICAgVHJhbnNhY3Rpb25NYW5hZ2VyLm1hbmFnZShuZXcgVHJhbnNhY3Rpb25hbChlbSkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgdHJhbnNhY3QoKSB7CisgICAgICAgICAgICAgICAgZW0ucmVtb3ZlKHVzZXJFbnRpdHkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gdXNlckVudGl0eS5nZXRVc2VyaWQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVXNlckVudGl0eSBnZXRVc2VyRW50aXR5KCkgeworICAgICAgICByZXR1cm4gdXNlckVudGl0eTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9ib29rbWFyay9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2Jvb2ttYXJrL3Jlc291cmNlL1VzZXJzUmVzb3VyY2UuamF2YSBiL2V4YW1wbGVzL2Jvb2ttYXJrL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYm9va21hcmsvcmVzb3VyY2UvVXNlcnNSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YjRiMGMKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9ib29rbWFyay9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2Jvb2ttYXJrL3Jlc291cmNlL1VzZXJzUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmJvb2ttYXJrLnJlc291cmNlOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW50aXR5TWFuYWdlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuUGVyc2lzdGVuY2VVbml0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuYm9va21hcmsuZW50aXR5LlVzZXJFbnRpdHk7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuamV0dGlzb24uanNvbi5KU09OQXJyYXk7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIi91c2Vycy8iKQorcHVibGljIGNsYXNzIFVzZXJzUmVzb3VyY2UgeworCisgICAgQENvbnRleHQKKyAgICBVcmlJbmZvIHVyaUluZm87CisKKyAgICBAUGVyc2lzdGVuY2VVbml0KHVuaXROYW1lID0gIkJvb2ttYXJrUFUiKQorICAgIEVudGl0eU1hbmFnZXJGYWN0b3J5IGVtZjsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgVXNlcnMuCisgICAgICovCisgICAgcHVibGljIFVzZXJzUmVzb3VyY2UoKSB7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIExpc3Q8VXNlckVudGl0eT4gZ2V0VXNlcnMoKSB7CisgICAgICAgIHJldHVybiBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpLmNyZWF0ZVF1ZXJ5KCJTRUxFQ1QgdSBmcm9tIFVzZXJFbnRpdHkgdSIpLmdldFJlc3VsdExpc3QoKTsKKyAgICB9CisKKyAgICBAUGF0aCgie3VzZXJpZH0vIikKKyAgICBwdWJsaWMgVXNlclJlc291cmNlIGdldFVzZXIoQFBhdGhQYXJhbSgidXNlcmlkIikgU3RyaW5nIHVzZXJpZCkgeworICAgICAgICByZXR1cm4gbmV3IFVzZXJSZXNvdXJjZSh1cmlJbmZvLCBlbWYuY3JlYXRlRW50aXR5TWFuYWdlcigpLCB1c2VyaWQpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgIHB1YmxpYyBKU09OQXJyYXkgZ2V0VXNlcnNBc0pzb25BcnJheSgpIHsKKyAgICAgICAgSlNPTkFycmF5IHVyaUFycmF5ID0gbmV3IEpTT05BcnJheSgpOworICAgICAgICBmb3IgKFVzZXJFbnRpdHkgdXNlckVudGl0eSA6IGdldFVzZXJzKCkpIHsKKyAgICAgICAgICAgIFVyaUJ1aWxkZXIgdWIgPSB1cmlJbmZvLmdldEFic29sdXRlUGF0aEJ1aWxkZXIoKTsKKyAgICAgICAgICAgIFVSSSB1c2VyVXJpID0gdWIKKyAgICAgICAgICAgICAgICAgICAgLnBhdGgodXNlckVudGl0eS5nZXRVc2VyaWQoKSkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgICAgICB1cmlBcnJheS5wdXQodXNlclVyaS50b0FTQ0lJU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB1cmlBcnJheTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9ib29rbWFyay9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2Jvb2ttYXJrL3V0aWwvdHgvVHJhbnNhY3Rpb25NYW5hZ2VyLmphdmEgYi9leGFtcGxlcy9ib29rbWFyay9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2Jvb2ttYXJrL3V0aWwvdHgvVHJhbnNhY3Rpb25NYW5hZ2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU2YTkwZAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2Jvb2ttYXJrL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYm9va21hcmsvdXRpbC90eC9UcmFuc2FjdGlvbk1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmJvb2ttYXJrLnV0aWwudHg7CisKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4Lm5hbWluZy5Jbml0aWFsQ29udGV4dDsKK2ltcG9ydCBqYXZheC5uYW1pbmcuTmFtaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnRyYW5zYWN0aW9uLlN5c3RlbUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC50cmFuc2FjdGlvbi5Vc2VyVHJhbnNhY3Rpb247CisKKy8qKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitwdWJsaWMgZmluYWwgY2xhc3MgVHJhbnNhY3Rpb25NYW5hZ2VyIHsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYW5hZ2UoVHJhbnNhY3Rpb25hbCB0KSB7CisgICAgICAgIFVzZXJUcmFuc2FjdGlvbiB1dHggPSBnZXRVdHgoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHV0eC5iZWdpbigpOworICAgICAgICAgICAgaWYgKHQuam9pblRyYW5zYWN0aW9uKSB7CisgICAgICAgICAgICAgICAgdC5lbS5qb2luVHJhbnNhY3Rpb24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHQudHJhbnNhY3QoKTsKKyAgICAgICAgICAgIHV0eC5jb21taXQoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdXR4LnJvbGxiYWNrKCk7CisgICAgICAgICAgICB9IGNhdGNoIChTeXN0ZW1FeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViQXBwbGljYXRpb25FeGNlcHRpb24oc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgbmV3IFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdC5lbS5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgVXNlclRyYW5zYWN0aW9uIGdldFV0eCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEluaXRpYWxDb250ZXh0IGljID0gbmV3IEluaXRpYWxDb250ZXh0KCk7CisgICAgICAgICAgICByZXR1cm4gKFVzZXJUcmFuc2FjdGlvbikgaWMubG9va3VwKCJqYXZhOmNvbXAvVXNlclRyYW5zYWN0aW9uIik7CisgICAgICAgIH0gY2F0Y2ggKE5hbWluZ0V4Y2VwdGlvbiBuZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKG5lKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2Jvb2ttYXJrL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYm9va21hcmsvdXRpbC90eC9UcmFuc2FjdGlvbmFsLmphdmEgYi9leGFtcGxlcy9ib29rbWFyay9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2Jvb2ttYXJrL3V0aWwvdHgvVHJhbnNhY3Rpb25hbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjODhkMDYKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9ib29rbWFyay9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2Jvb2ttYXJrL3V0aWwvdHgvVHJhbnNhY3Rpb25hbC5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuYm9va21hcmsudXRpbC50eDsKKworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLkVudGl0eU1hbmFnZXI7CisKKy8qKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVHJhbnNhY3Rpb25hbCB7CisKKyAgICBFbnRpdHlNYW5hZ2VyIGVtOworICAgIGJvb2xlYW4gam9pblRyYW5zYWN0aW9uOworCisgICAgcHVibGljIFRyYW5zYWN0aW9uYWwoRW50aXR5TWFuYWdlciBlbSwgYm9vbGVhbiBqb2luVHJhbnNhY3Rpb24pIHsKKyAgICAgICAgdGhpcy5lbSA9IGVtOworICAgICAgICB0aGlzLmpvaW5UcmFuc2FjdGlvbiA9IGpvaW5UcmFuc2FjdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgVHJhbnNhY3Rpb25hbChFbnRpdHlNYW5hZ2VyIGVtKSB7CisgICAgICAgIHRoaXMoZW0sIHRydWUpOworICAgIH0KKworICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHRyYW5zYWN0KCk7Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9ib29rbWFyay9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvcGVyc2lzdGVuY2UueG1sIGIvZXhhbXBsZXMvYm9va21hcmsvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3BlcnNpc3RlbmNlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzA4NDE0Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYm9va21hcmsvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3BlcnNpc3RlbmNlLnhtbApAQCAtMCwwICsxLDI1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzxwZXJzaXN0ZW5jZSB2ZXJzaW9uPSIxLjAiIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZS9wZXJzaXN0ZW5jZV8xXzAueHNkIj4KKyAgICA8cGVyc2lzdGVuY2UtdW5pdCBuYW1lPSJCb29rbWFya1BVIiB0cmFuc2FjdGlvbi10eXBlPSJKVEEiPgorICAgICAgICA8cHJvdmlkZXI+b3JhY2xlLnRvcGxpbmsuZXNzZW50aWFscy5QZXJzaXN0ZW5jZVByb3ZpZGVyPC9wcm92aWRlcj4KKyAgICAgICAgPHByb3BlcnRpZXM+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idG9wbGluay5qZGJjLnVybCIgdmFsdWU9ImpkYmM6ZGVyYnk6Ly9sb2NhbGhvc3Q6MTUyNy9Cb29rbWFya0RCIi8+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idG9wbGluay5qZGJjLnVzZXIiIHZhbHVlPSJSRVNUIi8+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idG9wbGluay5qZGJjLmRyaXZlciIgdmFsdWU9Im9yZy5hcGFjaGUuZGVyYnkuamRiYy5DbGllbnREcml2ZXIiLz4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b3BsaW5rLmpkYmMucGFzc3dvcmQiIHZhbHVlPSJSRVNUIi8+CisgICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0idG9wbGluay5kZGwtZ2VuZXJhdGlvbiIgdmFsdWU9ImRyb3AtYW5kLWNyZWF0ZS10YWJsZXMiLz4KKyAgICAgICAgPC9wcm9wZXJ0aWVzPgorICAgIDwvcGVyc2lzdGVuY2UtdW5pdD4KKzwvcGVyc2lzdGVuY2U+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9ib29rbWFyay9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9nbGFzc2Zpc2gtd2ViLnhtbCBiL2V4YW1wbGVzL2Jvb2ttYXJrL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2dsYXNzZmlzaC13ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4NWFiZDgKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9ib29rbWFyay9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9nbGFzc2Zpc2gtd2ViLnhtbApAQCAtMCwwICsxLDI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzwhRE9DVFlQRSBnbGFzc2Zpc2gtd2ViLWFwcCBQVUJMSUMgIi0vL0dsYXNzRmlzaC5vcmcvL0RURCBHbGFzc0Zpc2ggQXBwbGljYXRpb24gU2VydmVyIDMuMSBTZXJ2bGV0IDMuMC8vRU4iICJodHRwOi8vZ2xhc3NmaXNoLm9yZy9kdGRzL2dsYXNzZmlzaC13ZWItYXBwXzNfMC0xLmR0ZCI+Cis8Z2xhc3NmaXNoLXdlYi1hcHAgZXJyb3ItdXJsPSIiPgorICAgIDxjb250ZXh0LXJvb3Q+L2Jvb2ttYXJrPC9jb250ZXh0LXJvb3Q+CisgICAgPGNsYXNzLWxvYWRlciBkZWxlZ2F0ZT0idHJ1ZSIgLz4KKyAgICA8anNwLWNvbmZpZz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzZGVidWdpbmZvIiB2YWx1ZT0idHJ1ZSI+CisgICAgICAgICAgICA8ZGVzY3JpcHRpb24+RW5hYmxlIGRlYnVnIGluZm8gY29tcGlsYXRpb24gaW4gdGhlIGdlbmVyYXRlZCBzZXJ2bGV0IGNsYXNzPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImtlZXBnZW5lcmF0ZWQiIHZhbHVlPSJ0cnVlIj4KKyAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5LZWVwIGEgY29weSBvZiB0aGUgZ2VuZXJhdGVkIHNlcnZsZXQgY2xhc3MnIGphdmEgY29kZS48L2Rlc2NyaXB0aW9uPgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWFwcGVkZmlsZSIgdmFsdWU9InRydWUiPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPk1haW50YWluIGEgb25lLXRvLW9uZSBjb3JyZXNwb25kZW5jZSBiZXR3ZWVuIHN0YXRpYyBjb250ZW50IGFuZCB0aGUgZ2VuZXJhdGVkIHNlcnZsZXQgY2xhc3MnIGphdmEgY29kZTwvZGVzY3JpcHRpb24+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgPC9qc3AtY29uZmlnPgorPC9nbGFzc2Zpc2gtd2ViLWFwcD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2Jvb2ttYXJrL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi9leGFtcGxlcy9ib29rbWFyay9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2NGM1ZjEKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9ib29rbWFyay9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsNDIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi41IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIj4KKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5ib29rbWFyay5NeUFwcGxpY2F0aW9uPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC53cy5ycy5BcHBsaWNhdGlvbjwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5ib29rbWFyay5NeUFwcGxpY2F0aW9uPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPnVuaXQ6Qm9va21hcmtQVTwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5wZXJzaXN0ZW5jZS9ib29rbWFyazwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuYm9va21hcmsuTXlBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L3Jlc291cmNlcy8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxwZXJzaXN0ZW5jZS11bml0LXJlZj4KKyAgICAgICAgPHBlcnNpc3RlbmNlLXVuaXQtcmVmLW5hbWU+cGVyc2lzdGVuY2UvYm9va21hcms8L3BlcnNpc3RlbmNlLXVuaXQtcmVmLW5hbWU+CisgICAgICAgIDxwZXJzaXN0ZW5jZS11bml0LW5hbWU+Qm9va21hcmtQVTwvcGVyc2lzdGVuY2UtdW5pdC1uYW1lPgorICAgIDwvcGVyc2lzdGVuY2UtdW5pdC1yZWY+CisgICAgPHJlc291cmNlLXJlZj4KKyAgICAgICAgPHJlcy1yZWYtbmFtZT5Vc2VyVHJhbnNhY3Rpb248L3Jlcy1yZWYtbmFtZT4KKyAgICAgICAgPHJlcy10eXBlPmphdmF4LnRyYW5zYWN0aW9uLlVzZXJUcmFuc2FjdGlvbjwvcmVzLXR5cGU+CisgICAgICAgIDxyZXMtYXV0aD5Db250YWluZXI8L3Jlcy1hdXRoPgorICAgIDwvcmVzb3VyY2UtcmVmPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYm9va21hcmsvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9ib29rbWFyay9Cb29rbWFya1Rlc3QuamF2YSBiL2V4YW1wbGVzL2Jvb2ttYXJrL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYm9va21hcmsvQm9va21hcmtUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBlODYzNwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2Jvb2ttYXJrL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYm9va21hcmsvQm9va21hcmtUZXN0LmphdmEKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuYm9va21hcms7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHRpc29uLkpldHRpc29uRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuamV0dGlzb24uanNvbi5KU09OQXJyYXk7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmpldHRpc29uLmpzb24uSlNPTk9iamVjdDsKK2ltcG9ydCBvcmcuanVuaXQuRml4TWV0aG9kT3JkZXI7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuTWV0aG9kU29ydGVyczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BGaXhNZXRob2RPcmRlcihNZXRob2RTb3J0ZXJzLk5BTUVfQVNDRU5ESU5HKQorcHVibGljIGNsYXNzIEJvb2ttYXJrVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNeUFwcGxpY2F0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFVSSSBnZXRCYXNlVXJpKCkgeworICAgICAgICByZXR1cm4gVXJpQnVpbGRlci5mcm9tVXJpKHN1cGVyLmdldEJhc2VVcmkoKSkucGF0aCgiYm9va21hcmsiKS5idWlsZCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKEpldHRpc29uRmVhdHVyZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzdGVwMV9nZXRVc2VycygpIHsKKyAgICAgICAgZmluYWwgSlNPTkFycmF5IHVzZXJzID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2VzL3VzZXJzLyIpLnJlcXVlc3QoImFwcGxpY2F0aW9uL2pzb24iKS5nZXQoSlNPTkFycmF5LmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh1c2VycyAhPSBudWxsKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHN0ZXAyX2NyZWF0ZVVzZXIoKSB7CisgICAgICAgIGJvb2xlYW4gdGhyb3duID0gZmFsc2U7CisgICAgICAgIEpTT05PYmplY3QgdXNlciA9IG5ldyBKU09OT2JqZWN0KCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHVzZXIucHV0KCJ1c2VyaWQiLCAidGVzdHVpZCIpLnB1dCgicGFzc3dvcmQiLCAidGVzdCIpLnB1dCgiZW1haWwiLCAidGVzdEB0ZXN0Lm5ldCIpLnB1dCgidXNlcm5hbWUiLCAiVGVzdCBVc2VyIik7CisgICAgICAgICAgICB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZXMvdXNlcnMvdGVzdHVpZCIpLnJlcXVlc3QoKS5wdXQoRW50aXR5LmVudGl0eSh1c2VyLCAiYXBwbGljYXRpb24vanNvbiIpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvd24gPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0RmFsc2UodGhyb3duKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHN0ZXAzX2dldFVzZXJzMigpIHsKKyAgICAgICAgZmluYWwgSlNPTkFycmF5IHVzZXJzID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2VzL3VzZXJzLyIpLnJlcXVlc3QoImFwcGxpY2F0aW9uL2pzb24iKS5nZXQoSlNPTkFycmF5LmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh1c2VycyAhPSBudWxsKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh1c2Vycy5sZW5ndGgoKSA9PSAxKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHN0ZXA0X3VwZGF0ZVVzZXIoKSB7CisgICAgICAgIGJvb2xlYW4gdGhyb3duID0gZmFsc2U7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEpTT05PYmplY3QgdXNlciA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlcy91c2Vycy90ZXN0dWlkIikucmVxdWVzdCgiYXBwbGljYXRpb24vanNvbiIpLmdldChKU09OT2JqZWN0LmNsYXNzKTsKKworICAgICAgICAgICAgdXNlci5wdXQoInBhc3N3b3JkIiwgIk5FVyBQQVNTV09SRCIpLnB1dCgiZW1haWwiLCAiTkVXQEVNQUlMLk5FVCIpLnB1dCgidXNlcm5hbWUiLCAiVVBEQVRFRCBURVNUIFVTRVIiKTsKKyAgICAgICAgICAgIHRhcmdldCgpLnBhdGgoInJlc291cmNlcy91c2Vycy90ZXN0dWlkIikucmVxdWVzdCgpLnB1dChFbnRpdHkuZW50aXR5KHVzZXIsICJhcHBsaWNhdGlvbi9qc29uIikpOworCisgICAgICAgICAgICB1c2VyID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2VzL3VzZXJzL3Rlc3R1aWQiKS5yZXF1ZXN0KCJhcHBsaWNhdGlvbi9qc29uIikuZ2V0KEpTT05PYmplY3QuY2xhc3MpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHModXNlci5nZXQoInVzZXJuYW1lIiksICJVUERBVEVEIFRFU1QgVVNFUiIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHVzZXIuZ2V0KCJlbWFpbCIpLCAiTkVXQEVNQUlMLk5FVCIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHVzZXIuZ2V0KCJwYXNzd29yZCIpLCAiTkVXIFBBU1NXT1JEIik7CisKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvd24gPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0RmFsc2UodGhyb3duKTsKKyAgICB9CisKKyAgICAvLyB1Z2x5Li4gYnV0IHNlcGFyYXRpb24gaW50byBzZXBhcmF0ZSB0ZXN0IGNhc2VzIHdvdWxkIGJlIHByb2JhYmx5IHVnbGllcgorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc3RlcDVfZ2V0VXNlckJvb2ttYXJrTGlzdCgpIHsKKyAgICAgICAgYm9vbGVhbiB0aHJvd24gPSBmYWxzZTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgSlNPTk9iamVjdCB1c2VyID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2VzL3VzZXJzL3Rlc3R1aWQiKS5yZXF1ZXN0KCJhcHBsaWNhdGlvbi9qc29uIikuZ2V0KEpTT05PYmplY3QuY2xhc3MpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh1c2VyICE9IG51bGwpOworCisgICAgICAgICAgICBmaW5hbCBXZWJUYXJnZXQgd2ViVGFyZ2V0ID0gY2xpZW50KCkudGFyZ2V0KHVzZXIuZ2V0U3RyaW5nKCJib29rbWFya3MiKSk7CisKKyAgICAgICAgICAgIEpTT05PYmplY3QgYm9va21hcmsgPSBuZXcgSlNPTk9iamVjdCgpOworICAgICAgICAgICAgYm9va21hcmsucHV0KCJ1cmkiLCAiaHR0cDovL2phdmEuc3VuLmNvbSIpLnB1dCgic2Rlc2MiLCAidGVzdCBkZXNjIikucHV0KCJsZGVzYyIsICJsb25nIHRlc3QgZGVzY3JpcHRpb24iKTsKKyAgICAgICAgICAgIHdlYlRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KGJvb2ttYXJrLCAiYXBwbGljYXRpb24vanNvbiIpKTsKKworICAgICAgICAgICAgSlNPTkFycmF5IGJvb2ttYXJrcyA9IHdlYlRhcmdldC5yZXF1ZXN0KCJhcHBsaWNhdGlvbi9qc29uIikuZ2V0KEpTT05BcnJheS5jbGFzcyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGJvb2ttYXJrcyAhPSBudWxsKTsKKyAgICAgICAgICAgIGludCBib29rbWFya3NTaXplID0gYm9va21hcmtzLmxlbmd0aCgpOworCisgICAgICAgICAgICBTdHJpbmcgdGVzdEJvb2ttYXJrVXJsID0gYm9va21hcmtzLmdldFN0cmluZygwKTsKKyAgICAgICAgICAgIGZpbmFsIFdlYlRhcmdldCBib29rbWFya1Jlc291cmNlID0gY2xpZW50KCkudGFyZ2V0KHRlc3RCb29rbWFya1VybCk7CisKKyAgICAgICAgICAgIGJvb2ttYXJrID0gYm9va21hcmtSZXNvdXJjZS5yZXF1ZXN0KCJhcHBsaWNhdGlvbi9qc29uIikuZ2V0KEpTT05PYmplY3QuY2xhc3MpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShib29rbWFyayAhPSBudWxsKTsKKworICAgICAgICAgICAgYm9va21hcmtSZXNvdXJjZS5yZXF1ZXN0KCkuZGVsZXRlKCk7CisKKyAgICAgICAgICAgIGJvb2ttYXJrcyA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlcy91c2Vycy90ZXN0dWlkL2Jvb2ttYXJrcyIpLnJlcXVlc3QoImFwcGxpY2F0aW9uL2pzb24iKS5nZXQoSlNPTkFycmF5LmNsYXNzKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoYm9va21hcmtzICE9IG51bGwpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShib29rbWFya3MubGVuZ3RoKCkgPT0gKGJvb2ttYXJrc1NpemUgLSAxKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgdGhyb3duID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydEZhbHNlKHRocm93bik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzdGVwNl9kZWxldGVVc2VyKCkgeworICAgICAgICBib29sZWFuIHRocm93biA9IGZhbHNlOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZXMvdXNlcnMvdGVzdHVpZCIpLnJlcXVlc3QoKS5kZWxldGUoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvd24gPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0RmFsc2UodGhyb3duKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9ib29rc3RvcmUtd2ViYXBwL1JFQURNRS5NRCBiL2V4YW1wbGVzL2Jvb2tzdG9yZS13ZWJhcHAvUkVBRE1FLk1ECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5MjFkN2YKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9ib29rc3RvcmUtd2ViYXBwL1JFQURNRS5NRApAQCAtMCwwICsxLDEyNSBAQAorWy8vXTogIyAiIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAiCitbLy9dOiAjICIgIgorWy8vXTogIyAiIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAiCitbLy9dOiAjICIgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQgIgorWy8vXTogIyAiIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4gIgorWy8vXTogIyAiICIKK1svL106ICMgIiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlICIKKworQm9va3N0b3JlCis9PT09PT09PT0KKworVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gY29ubmVjdCBKU1AgcGFnZXMgdG8gcmVzb3VyY2VzLiBUaGUKK2V4YW1wbGUgaXMgY29waWVkIGZyb20gdGhlCitbQm9va3N0b3JlXShodHRwOi8vc3RhcGxlci5rb2hzdWtlLm9yZy9nZXR0aW5nLXN0YXJ0ZWQuaHRtbCkgZXhhbXBsZQorcHJlc2VudGVkIGJ5IHRoZSBbU3RhcGxlcl0oaHR0cDovL3N0YXBsZXIua29oc3VrZS5vcmcvKSBwcm9qZWN0IHRoYXQKK3Byb3ZpZGVzIGEgd2F5IHRvIHN0YXBsZSBVUklzIHRvIEphdmEgY2xhc3NlcyB0byBidWlsZCBSRVNUZnVsIFdlYgorYXBwbGljYXRpb25zIHN1Y2ggYXMgW0h1ZHNvbl0oaHR0cDovL2phdmEubmV0L3Byb2plY3RzL2h1ZHNvbi8pLgorCitBIGJvb2tzdG9yZSBXZWIgYXBwbGljYXRpb24gaXMgcHJlc2VudGVkIHRoYXQgaXMgY2FwYWJsZSBvZiBwcmVzZW50aW5nCitib29rcywgQ0RzIGFuZCB0cmFja3Mgb2YgQ0RzLgorCitDb250ZW50cworLS0tLS0tLS0KKworVGhlIGV4YW1wbGUgY29uc2lzdHMgb2YgZm91ciB3ZWIgcmVzb3VyY2VzIGltcGxlbWVudGVkIGJ5IHRoZSBmb2xsb3dpbmc6CisKK2BvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5ib29rc3RvcmUud2ViYXBwLnJlc291cmNlLkJvb2tzdG9yZWAKKworVGhlIGJvb2tzdG9yZSByZXNvdXJjZSB0aGF0IHJldHVybnMgYSBsaXN0IG9mIGl0ZW1zLCBlaXRoZXIgQ0RzCitvciBCb29rcy4gVGhlIHJlc291cmNlIGR5bmFtaWNhbGx5IHJlZmVyZW5jZXMgYSBCb29rIG9yIENEIHJlc291cmNlCit1c2luZyB0aGUgZ2V0SXRlbSBtZXRob2QgdGhhdCBpcyBhbm5vdGF0ZWQgd2l0aCBQYXRoLiBUaGUgQm9vayBhbmQKK0NEIHJlc291cmNlIGJvdGggaW5oZXJpdCBmcm9tIHRoZSBJdGVtIGNsYXNzIGFuZCB0aHVzIHRoZSByZXNvdXJjZXMKK2NhbiBiZSBtYW5hZ2VkIHBvbHltb3JwaGljYWxseS4KKworYG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmJvb2tzdG9yZS53ZWJhcHAucmVzb3VyY2UuQm9va2AKKworVGhlIGJvb2sgcmVzb3VyY2UgdGhhdCBoYXMgYSB0aXRsZSBhbmQgYW4gYXV0aG9yLgorCitgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuYm9va3N0b3JlLndlYmFwcC5yZXNvdXJjZS5DRGAKKworVGhlIENEIHJlc291cmNlIHRoYXQgaGFzIGEgdGl0bGUsIGF1dGhvciBhbmQgYSBsaXN0IG9mIHRyYWNrcy4gVGhlCityZXNvdXJjZSBkeW5hbWljYWxseSByZWZlcmVuY2VzIHRoZSBUcmFjayByZXNvdXJjZSB1c2luZyB0aGUKK2dldFRyYWNrIG1ldGhvZCB0aGF0IGlzIGFubm90YXRlZCB3aXRoIFBhdGguCisKK2BvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5ib29rc3RvcmUud2ViYXBwLnJlc291cmNlLlRyYWNrYAorCitUaGUgVHJhY2tzIHJlc291cmNlIHRoYXQgaGFzIGEgbmFtZSBhbmQgdGhlIGxlbmd0aCBvZiB0aGUgdHJhY2suCisKK1RoZSBtYXBwaW5nIG9mIHRoZSBVUkkgcGF0aCBzcGFjZSBpcyBwcmVzZW50ZWQgaW4gdGhlIGZvbGxvd2luZyB0YWJsZToKKworCitVUkkgcGF0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJlc291cmNlIGNsYXNzICAgfCBIVFRQIG1ldGhvZHMgICB8IE5vdGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKipfL18qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBCb29rc3RvcmUgICAgICAgIHwgR0VUICAgICAgICAgICAgfCB3ZWJhcHAvcmVzb3VyY2UvQm9va3N0b3JlL2luZGV4LmpzcAorKipfL2NvdW50XyoqICAgICAgICAgICAgICAgICAgICAgICAgfCBCb29rc3RvcmUgICAgICAgIHwgR0VUICAgICAgICAgICAgfCB3ZWJhcHAvcmVzb3VyY2UvQm9va3N0b3JlL2NvdW50LmpzcAorKipfL3RpbWVfKiogICAgICAgICAgICAgICAgICAgICAgICAgfCBCb29rc3RvcmUgICAgICAgIHwgR0VUICAgICAgICAgICAgfCB3ZWJhcHAvcmVzb3VyY2UvQm9va3N0b3JlL3RpbWUuanNwCisqKl8vaXRlbXMve2l0ZW1pZH1fKiogICAgICAgICAgICAgICB8IEJvb2ssIENEICAgICAgICAgfCBHRVQgICAgICAgICAgICB8IHdlYmFwcC9yZXNvdXJjZS9Cb29rL2luZGV4LmpzcCwgd2ViYXBwL3Jlc291cmNlL0NEL2luZGV4LmpzcAorKipfL2l0ZW1zL3tpdGVtaWR9L3RyYWNrcy97bnVtfV8qKiAgfCBUcmFjayAgICAgICAgICAgIHwgR0VUICAgICAgICAgICAgfCB3ZWJhcHAvcmVzb3VyY2UvVHJhY2svaW5kZXguanNwCisKK1J1bm5pbmcgdGhlIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworQm9va3N0b3JlIGV4YW1wbGUgcnVucyBvbiBHbGFzc2Zpc2ggNC4wIGFwcGxpY2F0aW9uIHNlcnZlcgorKFtodHRwczovL2phdmFlZS5naXRodWIuaW8vZ2xhc3NmaXNoL10oaHR0cHM6Ly9qYXZhZWUuZ2l0aHViLmlvL2dsYXNzZmlzaC8pKSwgd2hpY2ggY2FuIGJlCitydW4gYXMgYW4gZW1iZWRkZWQgY29udGFpbmVyIG9yIEpldHR5LgorCitJZiB5b3UgYXJlIHdvcmtpbmcgd2l0aCBKZXJzZXkgR2xhc3NGaXNoIHVwZGF0ZSBjZW50ZXIgbW9kdWxlIGluc3RhbGxlZAoraW50byB5b3VyIGV4aXN0aW5nIEdsYXNzRmlzaCBpbnN0YW5jZSwgeW91IHdpbGwgbmVlZCB0byBmb2xsb3cKK2luc3RydWN0aW9ucyBhdCBbdGhlIG1vZHVsZSBSRUFETUUgZmlsZV0oLi4vLi4vUkVBRE1FLmh0bWwpIGluIG9yZGVyIHRvCitkZXBsb3kgdGhlIGV4YW1wbGUuCisKK090aGVyd2lzZSwgeW91IGNhbiBydW4gdGhlIGV4YW1wbGUgdXNpbmcgZW1iZWRkZWQgR2xhc3NGaXNoIGFzIGZvbGxvd3M6CisKK0J1aWxkIGFuZCBkZXBsb3kgdGhlIHByb2plY3QgYnkgZXhlY3V0aW5nIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBmcm9tIHRoZQorcHJvamVjdCBkaXJlY3RvcnkKKworPiAgIG12biBjbGVhbiBwYWNrYWdlIGVtYmVkZGVkLWdsYXNzZmlzaDpydW4gKFRPRE8gZG9lcyBub3Qgd29yayBhdCB0aGUgbW9tZW50KQorCitvciB5b3UgY2FuIHJ1biB0aGUgZXhhbXBsZSB1c2luZyBKZXR0eSBhcyBmb2xsb3dzOgorCis+ICAgbXZuIGNsZWFuIHBhY2thZ2UgamV0dHk6cnVuCisKK0dvIHRvIHRoZSBVUkw6CisKKzxodHRwOi8vbG9jYWxob3N0OjgwODAvYm9va3N0b3JlLXdlYmFwcC8+CisKKyMjIyMgVGVzdCBDbGllbnQgUnVubmluZworCis+ICAgbXZuIHRlc3QgLURqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk9b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5IC1EamVyc2V5LmNvbmZpZy50ZXN0LmxvZ2dpbmcuZW5hYmxlPXRydWUgLURqZXJzZXkuY29uZmlnLnRlc3QubG9nZ2luZy5kdW1wRW50aXR5PXRydWUgLURqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ9ODA4MCAtRG1hdmVuLnRlc3Quc2tpcD1mYWxzZQorCitvcgorCis+ICAgbXZuIHRlc3QgLVBydW4tZXh0ZXJuYWwtdGVzdHMKKworSG93IGl0IHdvcmtzCistLS0tLS0tLS0tLS0KKworVGhpcyBleGFtcGxlIHNob3dzIGhvdyB0byBzdXBwb3J0IHBvbHltb3JwaGlzbSBvZiByZXNvdXJjZXMgYW5kIEpTUAorcGFnZXMuIEhlbmNlIGl0IGlzIHBvc3NpYmxlIHRvIGFkZCBhbm90aGVyIHJlc291cmNlLCBzdWNoIGFzIGEgRFZECityZXNvdXJjZSB3aXRoIGFzc29jaWF0ZWQgSlNQIHBhZ2VzLCB3aGljaCBleHRlbmRzIEl0ZW0gd2l0aG91dCBoYXZpbmcgdG8KK2NoYW5nZSB0aGUgbG9naWMgb2YgQm9va3N0b3JlIG9yIHRoZSBleGlzdGluZyBKU1AgcGFnZXMuCisKK0pTUCBwYWdlcyBhcmUgYXNzb2NpYXRlZCB3aXRoIHJlc291cmNlIGNsYXNzZXMuIFN1Y2ggSlNQIHBhZ2VzIGFyZQorcmVzb2x2ZWQgYnkgY29udmVydGluZyB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIHJlc291cmNlCitjbGFzcyBpbnRvIGEgcGF0aCBhbmQgYXBwZW5kaW5nIGxhc3QgcGF0aCBzZWdtZW50IG9mIHRoZSByZXF1ZXN0IFVSSQorcGF0aCB0byB0aGF0IHBhdGguIEZvciBleGFtcGxlLCB3aGVuIGEgR0VUIGlzIHBlcmZvcm1lZCBvbiB0aGUgVVJJIHBhdGgKKyIvIiB0aGVuIHRoZSBwYXRoIHRvIHRoZSBKU1AgcGFnZSBpcworIi9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9ib29rc3RvcmUvd2ViYXBwL3Jlc291cmNlL0Jvb2tzdG9yZS8iLAorYW5kIGluIHRoaXMgY2FzZSBzaW5jZSB0aGUgbGFzdCBwYXRoIHNlZ21lbnQgaXMgZW1wdHkgImluZGV4LmpzcCIgaXMKK2FwcGVuZGVkIHRvIHRoZSBwYXRoLiBUaGVuIHRoZSByZXF1ZXN0IHVzIGZvcndhcmRlZCB0byB0aGUgSlNQIHBhZ2UgYXQKK3RoYXQgcGF0aC4gU2ltaWxhcmx5IHdoZW4gYSBHRVQgaXMgcGVyZm9ybWVkIG9uIHRoZSBVUkkgcGF0aCAiL2NvdW50IgordGhlbiB0aGUgcGF0aCB0byB0aGUgSlNQIHBhZ2UgaXMKKyIvL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2Jvb2tzdG9yZS93ZWJhcHAvcmVzb3VyY2UvQm9va3N0b3JlL2NvdW50LmpzcCIuCisKK1RoZSBKU1AgdmFyaWFibGUgIml0IiBpcyBzZXQgdG8gdGhlIGluc3RhbmNlIG9mIEJvb2tzdG9yZSBzbyB0aGF0IHRoZQoraW5kZXguanNwLCBvciBjb3VudC5qc3AsIGhhcyBhY2Nlc3MgdG8gdGhlIEJvb2tzdG9yZSBpbnN0YW5jZSBhcyBhIEphdmEKK2JlYW4uCisKK0lmIGEgcmVzb3VyY2UgY2xhc3MgaW5oZXJpdHMgZnJvbSBhbm90aGVyIHJlc291cmNlIGNsYXNzIHRoZW4gaXQgd2lsbAorYXV0b21hdGljYWxseSBpbmhlcml0IHRoZSBKU1BzIGZyb20gdGhlIHN1cGVyIGNsYXNzLgorCitBIEpTUCBwYWdlIG1heSBhbHNvIGluY2x1ZGUgSlNQcyB1c2luZyB0aGUgaW5oZXJpdGFuY2UgbWVjaGFuaXNtLCBmb3IKK2V4YW1wbGUgdGhlIGluZGV4LmpzcCBwYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGUgQm9vayByZXNvdXJjZSBjbGFzcworaW5jbHVkZXMgYSBmb290ZXIuanNwIHBhZ2Ugd2hvc2UgbG9jYXRpb24gaXMgc3BlY2lmaWVkIGJ5IHRoZSBzdXBlcgorY2xhc3MsIEl0ZW0uCmRpZmYgLS1naXQgYS9leGFtcGxlcy9ib29rc3RvcmUtd2ViYXBwL3BvbS54bWwgYi9leGFtcGxlcy9ib29rc3RvcmUtd2ViYXBwL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI5MTBiYgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2Jvb2tzdG9yZS13ZWJhcHAvcG9tLnhtbApAQCAtMCwwICsxLDEyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKworICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD53ZWJhcHAtZXhhbXBsZS1wYXJlbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vd2ViYXBwLWV4YW1wbGUtcGFyZW50L3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmJvb2tzdG9yZS13ZWJhcHA8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktZXhhbXBsZXMtYm9va3N0b3JlLXdlYmFwcDwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgTVZDIEJvb2tzdG9yZSBleGFtcGxlLjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tdmMtanNwPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWhrMjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7c2VydmxldDIudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+anN0bDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7anN0bC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDwhLS0gUnVuIHRoZSBhcHBsaWNhdGlvbiB1c2luZyAibXZuIGpldHR5OnJ1biIgLS0+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHdlYkFwcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb250ZXh0UGF0aD4vYm9va3N0b3JlLXdlYmFwcDwvY29udGV4dFBhdGg+CisgICAgICAgICAgICAgICAgICAgIDwvd2ViQXBwPgorICAgICAgICAgICAgICAgICAgICA8Y29ubmVjdG9ycz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb25uZWN0b3IgaW1wbGVtZW50YXRpb249Im9yZy5lY2xpcHNlLmpldHR5LnNlcnZlci5uaW8uU2VsZWN0Q2hhbm5lbENvbm5lY3RvciI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvcnQ+ODA4MDwvcG9ydD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzcG9uc2VIZWFkZXJTaXplPjE2MTkyPC9yZXNwb25zZUhlYWRlclNpemU+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2Nvbm5lY3Rvcj4KKyAgICAgICAgICAgICAgICAgICAgPC9jb25uZWN0b3JzPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8IS0tIG12biB0ZXN0IC1QcnVuLWV4dGVybmFsLXRlc3RzIC0tPgorICAgICAgICAgICAgPGlkPnJ1bi1leHRlcm5hbC10ZXN0czwvaWQ+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk+JHtleHRlcm5hbC5jb250YWluZXIuZmFjdG9yeX08L2plcnNleS5jb25maWcudGVzdC5jb250YWluZXIuZmFjdG9yeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydD4ke2V4dGVybmFsLmNvbnRhaW5lci5wb3J0fTwvamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgICAgICA8cHJvcGVydGllcz4KKyAgICAgICAgICAgICAgICA8IS0tIEV4dGVybmFsIHRlc3QgY29udGFpbmVyIGNvbmZpZ3VyYXRpb24gaXMgZG9uZSB2aWEgcHJvcGVydGllcyB0byBhbGxvdyBvdmVycmlkaW5nIHZpYSBjb21tYW5kIGxpbmUuIC0tPgorICAgICAgICAgICAgICAgIDxleHRlcm5hbC5jb250YWluZXIuZmFjdG9yeT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk8L2V4dGVybmFsLmNvbnRhaW5lci5mYWN0b3J5PgorICAgICAgICAgICAgICAgIDxleHRlcm5hbC5jb250YWluZXIucG9ydD44MDgwPC9leHRlcm5hbC5jb250YWluZXIucG9ydD4KKyAgICAgICAgICAgICAgICA8bWF2ZW4udGVzdC5za2lwPmZhbHNlPC9tYXZlbi50ZXN0LnNraXA+CisgICAgICAgICAgICA8L3Byb3BlcnRpZXM+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+cmVsZWFzZTwvaWQ+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnhtbC1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxza2lwPnRydWU8L3NraXA+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICA8L3Byb2ZpbGVzPgorCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxtYXZlbi50ZXN0LnNraXA+dHJ1ZTwvbWF2ZW4udGVzdC5za2lwPgorICAgIDwvcHJvcGVydGllcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYm9va3N0b3JlLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2Jvb2tzdG9yZS93ZWJhcHAvTXlBcHBsaWNhdGlvbi5qYXZhIGIvZXhhbXBsZXMvYm9va3N0b3JlLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2Jvb2tzdG9yZS93ZWJhcHAvTXlBcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNTkxZjYKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9ib29rc3RvcmUtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYm9va3N0b3JlL3dlYmFwcC9NeUFwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5ib29rc3RvcmUud2ViYXBwOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuYm9va3N0b3JlLndlYmFwcC5yZXNvdXJjZS5Cb29rc3RvcmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlRyYWNpbmdDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5qc3AuSnNwTXZjRmVhdHVyZTsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIE15QXBwbGljYXRpb24gZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisKKyAgICBwdWJsaWMgTXlBcHBsaWNhdGlvbigpIHsKKyAgICAgICAgLy8gUmVzb3VyY2VzLgorICAgICAgICBwYWNrYWdlcyhCb29rc3RvcmUuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7CisKKyAgICAgICAgLy8gTVZDLgorICAgICAgICByZWdpc3RlcihKc3BNdmNGZWF0dXJlLmNsYXNzKTsKKworICAgICAgICAvLyBMb2dnaW5nLgorICAgICAgICByZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcyk7CisKKyAgICAgICAgLy8gVHJhY2luZyBzdXBwb3J0LgorICAgICAgICBwcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLlRSQUNJTkcsIFRyYWNpbmdDb25maWcuT05fREVNQU5ELm5hbWUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYm9va3N0b3JlLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2Jvb2tzdG9yZS93ZWJhcHAvcmVzb3VyY2UvQm9vay5qYXZhIGIvZXhhbXBsZXMvYm9va3N0b3JlLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2Jvb2tzdG9yZS93ZWJhcHAvcmVzb3VyY2UvQm9vay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMGZmMWIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9ib29rc3RvcmUtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYm9va3N0b3JlL3dlYmFwcC9yZXNvdXJjZS9Cb29rLmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5ib29rc3RvcmUud2ViYXBwLnJlc291cmNlOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKK0BYbWxSb290RWxlbWVudAorQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQorcHVibGljIGNsYXNzIEJvb2sgZXh0ZW5kcyBJdGVtIHsKKworICAgIHB1YmxpYyBCb29rKCkgeworICAgIH0KKworICAgIHB1YmxpYyBCb29rKGZpbmFsIFN0cmluZyB0aXRsZSwgZmluYWwgU3RyaW5nIGF1dGhvcikgeworICAgICAgICBzdXBlcih0aXRsZSwgYXV0aG9yKTsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYm9va3N0b3JlLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2Jvb2tzdG9yZS93ZWJhcHAvcmVzb3VyY2UvQm9va3N0b3JlLmphdmEgYi9leGFtcGxlcy9ib29rc3RvcmUtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYm9va3N0b3JlL3dlYmFwcC9yZXNvdXJjZS9Cb29rc3RvcmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjdlY2NiCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYm9va3N0b3JlLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2Jvb2tzdG9yZS93ZWJhcHAvcmVzb3VyY2UvQm9va3N0b3JlLmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5ib29rc3RvcmUud2ViYXBwLnJlc291cmNlOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5Ob3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuVGVtcGxhdGU7CisKK0BQYXRoKCIvIikKK0BTaW5nbGV0b24KK0BUZW1wbGF0ZQorQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX0hUTUwpCitAWG1sUm9vdEVsZW1lbnQKK0BYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKK3B1YmxpYyBjbGFzcyBCb29rc3RvcmUgeworCisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBJdGVtPiBpdGVtcyA9IG5ldyBUcmVlTWFwPD4oKTsKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworCisgICAgcHVibGljIEJvb2tzdG9yZSgpIHsKKyAgICAgICAgc2V0TmFtZSgiQ3plY2ggQm9va3N0b3JlIik7CisgICAgICAgIGdldEl0ZW1zKCkucHV0KCIxIiwgbmV3IEJvb2soIlN2ZWprIiwgIkphcm9zbGF2IEhhc2VrIikpOworICAgICAgICBnZXRJdGVtcygpLnB1dCgiMiIsIG5ldyBCb29rKCJLcmFrYXRpdCIsICJLYXJlbCBDYXBlayIpKTsKKyAgICAgICAgZ2V0SXRlbXMoKS5wdXQoIjMiLCBuZXcgQ0QoIk1hIFZsYXN0IDEiLCAiQmVkcmljaCBTbWV0YW5hIiwgbmV3IFRyYWNrW10geworICAgICAgICAgICAgICAgIG5ldyBUcmFjaygiVnlzZWhyYWQiLCAxODApLAorICAgICAgICAgICAgICAgIG5ldyBUcmFjaygiVmx0YXZhIiwgMTcyKSwKKyAgICAgICAgICAgICAgICBuZXcgVHJhY2soIlNhcmthIiwgMzIpfSkpOworICAgIH0KKworICAgIEBQYXRoKCJpdGVtcy97aXRlbWlkfS8iKQorICAgIHB1YmxpYyBJdGVtIGdldEl0ZW0oQFBhdGhQYXJhbSgiaXRlbWlkIikgU3RyaW5nIGl0ZW1pZCkgeworICAgICAgICBJdGVtIGkgPSBnZXRJdGVtcygpLmdldChpdGVtaWQpOworICAgICAgICBpZiAoaSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oUmVzcG9uc2UKKyAgICAgICAgICAgICAgICAgICAgLnN0YXR1cyhSZXNwb25zZS5TdGF0dXMuTk9UX0ZPVU5EKQorICAgICAgICAgICAgICAgICAgICAuZW50aXR5KCJJdGVtLCAiICsgaXRlbWlkICsgIiwgaXMgbm90IGZvdW5kIikKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQcm9kdWNlcyh7TWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTCwgTWVkaWFUeXBlLlRFWFRfWE1MLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTn0pCisgICAgcHVibGljIEJvb2tzdG9yZSBnZXRYbWwoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldFN5c3RlbVRpbWUoKSB7CisgICAgICAgIHJldHVybiBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWFwPFN0cmluZywgSXRlbT4gZ2V0SXRlbXMoKSB7CisgICAgICAgIHJldHVybiBpdGVtczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9ib29rc3RvcmUtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYm9va3N0b3JlL3dlYmFwcC9yZXNvdXJjZS9DRC5qYXZhIGIvZXhhbXBsZXMvYm9va3N0b3JlLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2Jvb2tzdG9yZS93ZWJhcHAvcmVzb3VyY2UvQ0QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTM1N2U3Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYm9va3N0b3JlLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2Jvb2tzdG9yZS93ZWJhcHAvcmVzb3VyY2UvQ0QuamF2YQpAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmJvb2tzdG9yZS53ZWJhcHAucmVzb3VyY2U7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Ob3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKK0BYbWxSb290RWxlbWVudAorQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQorcHVibGljIGNsYXNzIENEIGV4dGVuZHMgSXRlbSB7CisKKyAgICBwcml2YXRlIFRyYWNrW10gdHJhY2tzOworCisgICAgcHVibGljIENEKCkgeworICAgIH0KKworICAgIHB1YmxpYyBDRChmaW5hbCBTdHJpbmcgdGl0bGUsIGZpbmFsIFN0cmluZyBhdXRob3IsIGZpbmFsIFRyYWNrW10gdHJhY2tzKSB7CisgICAgICAgIHN1cGVyKHRpdGxlLCBhdXRob3IpOworICAgICAgICB0aGlzLnRyYWNrcyA9IHRyYWNrczsKKyAgICB9CisKKyAgICBwdWJsaWMgVHJhY2tbXSBnZXRUcmFja3MoKSB7CisgICAgICAgIHJldHVybiB0cmFja3M7CisgICAgfQorCisgICAgQFBhdGgoInRyYWNrcy97bnVtfS8iKQorICAgIHB1YmxpYyBUcmFjayBnZXRUcmFjayhAUGF0aFBhcmFtKCJudW0iKSBpbnQgbnVtKSB7CisgICAgICAgIGlmIChudW0gPj0gdHJhY2tzLmxlbmd0aCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKFJlc3BvbnNlCisgICAgICAgICAgICAgICAgICAgIC5zdGF0dXMoUmVzcG9uc2UuU3RhdHVzLk5PVF9GT1VORCkKKyAgICAgICAgICAgICAgICAgICAgLmVudGl0eSgiVHJhY2ssICIgKyBudW0gKyAiLCBvZiBDRCwgIiArIGdldFRpdGxlKCkgKyAiLCBpcyBub3QgZm91bmQiKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRyYWNrc1tudW1dOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2Jvb2tzdG9yZS13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9ib29rc3RvcmUvd2ViYXBwL3Jlc291cmNlL0hhcHB5LmphdmEgYi9leGFtcGxlcy9ib29rc3RvcmUtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYm9va3N0b3JlL3dlYmFwcC9yZXNvdXJjZS9IYXBweS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MzE0ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9ib29rc3RvcmUtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYm9va3N0b3JlL3dlYmFwcC9yZXNvdXJjZS9IYXBweS5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuYm9va3N0b3JlLndlYmFwcC5yZXNvdXJjZTsKKworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5UZW1wbGF0ZTsKKworLyoqCisgKiBHZW5lcmF0ZXMgYSBoZWFkZXIgZGlzcGxheSByZXNvdXJjZSB3aGljaCBpcyB1c2VmdWwgZm9yIGRpc3BsYXlpbmcgdGhlCisgKiB2YXJpb3VzIGhlYWRlcnMgYnJvd3NlcnMgdXNlIGZvciBtYWtpbmcgdGVzdCBjYXNlcworICovCitAVGVtcGxhdGUKK0BQYXRoKCIvaGFwcHkiKQorQFNpbmdsZXRvbgorcHVibGljIGNsYXNzIEhhcHB5IHsKKworICAgIEBDb250ZXh0CisgICAgcHJpdmF0ZSBIdHRwSGVhZGVycyBoZWFkZXJzOworCisgICAgcHVibGljIFN0cmluZyBnZXRIZWFkZXJzKCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGZvciAoU3RyaW5nIGhlYWRlciA6IGhlYWRlcnMuZ2V0UmVxdWVzdEhlYWRlcnMoKS5rZXlTZXQoKSkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgiPGxpPiIpOworICAgICAgICAgICAgYnVmLmFwcGVuZChoZWFkZXIpOworICAgICAgICAgICAgYnVmLmFwcGVuZCgiID0gIik7CisgICAgICAgICAgICBidWYuYXBwZW5kKGhlYWRlcnMuZ2V0UmVxdWVzdEhlYWRlcihoZWFkZXIpKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIjwvbGk+XG4iKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYm9va3N0b3JlLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2Jvb2tzdG9yZS93ZWJhcHAvcmVzb3VyY2UvSXRlbS5qYXZhIGIvZXhhbXBsZXMvYm9va3N0b3JlLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2Jvb2tzdG9yZS93ZWJhcHAvcmVzb3VyY2UvSXRlbS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YmZiZDkKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9ib29rc3RvcmUtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYm9va3N0b3JlL3dlYmFwcC9yZXNvdXJjZS9JdGVtLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5ib29rc3RvcmUud2ViYXBwLnJlc291cmNlOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLlRlbXBsYXRlOworCitAVGVtcGxhdGUKK0BQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9IVE1MKQorQFhtbFJvb3RFbGVtZW50CitAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCitwdWJsaWMgY2xhc3MgSXRlbSB7CisKKyAgICBwcml2YXRlIFN0cmluZyB0aXRsZTsKKyAgICBwcml2YXRlIFN0cmluZyBhdXRob3I7CisKKyAgICBwdWJsaWMgSXRlbSgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgSXRlbShmaW5hbCBTdHJpbmcgdGl0bGUsIGZpbmFsIFN0cmluZyBhdXRob3IpIHsKKyAgICAgICAgdGhpcy50aXRsZSA9IHRpdGxlOworICAgICAgICB0aGlzLmF1dGhvciA9IGF1dGhvcjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgeworICAgICAgICByZXR1cm4gdGl0bGU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRBdXRob3IoKSB7CisgICAgICAgIHJldHVybiBhdXRob3I7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQcm9kdWNlcyh7TWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTCwgTWVkaWFUeXBlLlRFWFRfWE1MLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTn0pCisgICAgcHVibGljIEl0ZW0gZ2V0WG1sKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIkl0ZW17IgorICAgICAgICAgICAgICAgKyAidGl0bGU9JyIgKyB0aXRsZSArICdcJycKKyAgICAgICAgICAgICAgICsgIiwgYXV0aG9yPSciICsgYXV0aG9yICsgJ1wnJworICAgICAgICAgICAgICAgKyAnfSc7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYm9va3N0b3JlLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2Jvb2tzdG9yZS93ZWJhcHAvcmVzb3VyY2UvVHJhY2suamF2YSBiL2V4YW1wbGVzL2Jvb2tzdG9yZS13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9ib29rc3RvcmUvd2ViYXBwL3Jlc291cmNlL1RyYWNrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY4ODhmMQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2Jvb2tzdG9yZS13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9ib29rc3RvcmUvd2ViYXBwL3Jlc291cmNlL1RyYWNrLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5ib29rc3RvcmUud2ViYXBwLnJlc291cmNlOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLlRlbXBsYXRlOworCitAVGVtcGxhdGUKK0BQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9IVE1MKQorQFhtbFJvb3RFbGVtZW50CitAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCitwdWJsaWMgY2xhc3MgVHJhY2sgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKyAgICBwcml2YXRlIGludCBsZW5ndGg7CisKKyAgICBwdWJsaWMgVHJhY2soKSB7CisgICAgfQorCisgICAgcHVibGljIFRyYWNrKFN0cmluZyBuYW1lLCBpbnQgbGVuZ3RoKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMubGVuZ3RoID0gbGVuZ3RoOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRMZW5ndGgoKSB7CisgICAgICAgIHJldHVybiBsZW5ndGg7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQcm9kdWNlcyh7TWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTCwgTWVkaWFUeXBlLlRFWFRfWE1MLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTn0pCisgICAgcHVibGljIFRyYWNrIGdldFhtbCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYm9va3N0b3JlLXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvZXhhbXBsZXMvYm9va3N0b3JlLXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYmE5ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9ib29rc3RvcmUtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwzMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIyLjUiIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzJfNS54c2QiPgorCisgICAgPGZpbHRlcj4KKyAgICAgICAgPGZpbHRlci1uYW1lPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmJvb2tzdG9yZS53ZWJhcHAuTXlBcHBsaWNhdGlvbjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDxmaWx0ZXItY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9maWx0ZXItY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuYm9va3N0b3JlLndlYmFwcC5NeUFwcGxpY2F0aW9uPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8IS0tIHBhc3MgdG8gbmV4dCBmaWx0ZXIgaWYgSmVyc2V5L0FwcCByZXR1cm5zIDQwNCAtLT4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qZXJzZXkuY29uZmlnLnNlcnZsZXQuZmlsdGVyLmZvcndhcmRPbjQwNDwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgIDwvZmlsdGVyPgorICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmJvb2tzdG9yZS53ZWJhcHAuTXlBcHBsaWNhdGlvbjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2Jvb2tzdG9yZS13ZWJhcHAvc3JjL21haW4vd2ViYXBwL2Nzcy9zdHlsZS5jc3MgYi9leGFtcGxlcy9ib29rc3RvcmUtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9jc3Mvc3R5bGUuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMmEyMjMKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9ib29rc3RvcmUtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9jc3Mvc3R5bGUuY3NzCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK2JvZHkgeworICBmb250LWZhbWlseTogVmVyZGFuYSwgIkJpdHN0cmVhbSBWZXJhIFNhbnMiLCBzYW5zLXNlcmlmOworfQorCitoMSwgaDIsIGgzLCBoNCwgaDUsIGg2IHsKKyAgY29sb3I6ICMxMTE7Cit9CisKK2EgeworICBjb2xvcjogIzEyNUFBNzsKK30KKworYTpob3ZlciB7CisgIGNvbG9yOiAjMDAwOworfQorCitibG9ja3F1b3RlIHsKKyAgY29sb3I6ICM2NjY7Cit9CisKK3ByZSB7CisgIGJhY2tncm91bmQ6ICNlZWU7CisgIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7Cit9CisKK2hyIHsKKyAgYmFja2dyb3VuZDogI0IyQ0NGRjsKKyAgY29sb3I6ICNCMkNDRkY7Cit9CisKK3RhYmxlIHsKKyAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNkZGQ7CisgIGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2RkZDsKK30KKwordGgsIHRkIHsKKyAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7CisgIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNkZGQ7Cit9CisKK2EgaW1nIHsKKyAgdGV4dC1kZWNvcmF0aW9uOiBub25lOworfQorCmRpZmYgLS1naXQgYS9leGFtcGxlcy9ib29rc3RvcmUtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9qc3AvaGVscC5qc3AgYi9leGFtcGxlcy9ib29rc3RvcmUtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9qc3AvaGVscC5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFjOWY4NAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2Jvb2tzdG9yZS13ZWJhcHAvc3JjL21haW4vd2ViYXBwL2pzcC9oZWxwLmpzcApAQCAtMCwwICsxLDI2IEBACis8JS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorCistLSU+CisKKzwlQHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbCIlPgorPCVAcGFnZSBwYWdlRW5jb2Rpbmc9IlVURi04IiU+CisKKworPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+CisKKzxodG1sPgorICA8aGVhZD4KKyAgICA8dGl0bGU+PC90aXRsZT4KKyAgPC9oZWFkPgorICA8Ym9keT4KKyAgICBIZWxwIHdlYiBwYWdlCisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2Jvb2tzdG9yZS13ZWJhcHAvc3JjL21haW4vd2ViYXBwL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2Jvb2tzdG9yZS93ZWJhcHAvcmVzb3VyY2UvQm9vay9pbmRleC5qc3AgYi9leGFtcGxlcy9ib29rc3RvcmUtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9ib29rc3RvcmUvd2ViYXBwL3Jlc291cmNlL0Jvb2svaW5kZXguanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlYzU5MmUKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9ib29rc3RvcmUtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9ib29rc3RvcmUvd2ViYXBwL3Jlc291cmNlL0Jvb2svaW5kZXguanNwCkBAIC0wLDAgKzEsNDAgQEAKKzwlLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisKKy0tJT4KKworPCVAcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sIiU+Cis8JUBwYWdlIHBhZ2VFbmNvZGluZz0iVVRGLTgiJT4KKzwlLS0KK1RoZSB0YWdsaWIgZGlyZWN0aXZlIGJlbG93IGltcG9ydHMgdGhlIEpTVEwgbGlicmFyeS4gSWYgeW91IHVuY29tbWVudCBpdCwKK3lvdSBtdXN0IGFsc28gYWRkIHRoZSBKU1RMIGxpYnJhcnkgdG8gdGhlIHByb2plY3QuIFRoZSBBZGQgTGlicmFyeS4uLiBhY3Rpb24KK29uIExpYnJhcmllcyBub2RlIGluIFByb2plY3RzIHZpZXcgY2FuIGJlIHVzZWQgdG8gYWRkIHRoZSBKU1RMIDEuMSBsaWJyYXJ5LgorLS0lPgorPCVAdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc3AvanN0bC9jb3JlIiBwcmVmaXg9ImMiJT4KKzwlQHRhZ2xpYiBwcmVmaXg9InJidCIgdXJpPSJ1cm46b3JnOmdsYXNzZmlzaDpqZXJzZXk6c2VydmxldDptdmMiICU+CisKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCisiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KKworPGh0bWw+CisgICAgPGhlYWQ+CisgICAgICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KKyAgICAgICAgPHRpdGxlPkJvb2s8L3RpdGxlPgorICAgIDwvaGVhZD4KKyAgICA8Ym9keT4KKworICAgICAgICA8aDE+JHtpdC50aXRsZX08L2gxPgorCisgICAgICAgIEJvb2sgZnJvbSAke2l0LmF1dGhvcn0KKworICAgICAgICA8cmJ0OmluY2x1ZGUgcGFnZT0iZm9vdGVyLmpzcCIvPgorCisgICAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYm9va3N0b3JlLXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYm9va3N0b3JlL3dlYmFwcC9yZXNvdXJjZS9Cb29rc3RvcmUvY291bnQuanNwIGIvZXhhbXBsZXMvYm9va3N0b3JlLXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYm9va3N0b3JlL3dlYmFwcC9yZXNvdXJjZS9Cb29rc3RvcmUvY291bnQuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZmY0NTQKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9ib29rc3RvcmUtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9ib29rc3RvcmUvd2ViYXBwL3Jlc291cmNlL0Jvb2tzdG9yZS9jb3VudC5qc3AKQEAgLTAsMCArMSwyMSBAQAorPCUtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0lPgorCis8JUB0YWdsaWIgcHJlZml4PSJmbiIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzcC9qc3RsL2Z1bmN0aW9ucyIgJT4KKzwlLS0KKyAgQW4gZXhhbXBsZSBvZiBhbm90aGVyIHNpZGUgSlNQLgorLS0lPgorPGh0bWw+CisgIDxib2R5PgorICAgIyBvZiBpdGVtczogJHtmbjpsZW5ndGgoaXQuaXRlbXMpfSAKKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYm9va3N0b3JlLXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYm9va3N0b3JlL3dlYmFwcC9yZXNvdXJjZS9Cb29rc3RvcmUvaW5kZXguanNwIGIvZXhhbXBsZXMvYm9va3N0b3JlLXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYm9va3N0b3JlL3dlYmFwcC9yZXNvdXJjZS9Cb29rc3RvcmUvaW5kZXguanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYWZjY2YKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9ib29rc3RvcmUtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9ib29rc3RvcmUvd2ViYXBwL3Jlc291cmNlL0Jvb2tzdG9yZS9pbmRleC5qc3AKQEAgLTAsMCArMSw1MCBAQAorPCUtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0lPgorCis8JUBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWwiJT4KKzwlQHBhZ2UgcGFnZUVuY29kaW5nPSJVVEYtOCIlPgorCis8JUB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzcC9qc3RsL2NvcmUiIHByZWZpeD0iYyIlPiAKKworPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKKyAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorCis8aHRtbD4KKyAgICA8aGVhZD4KKyAgICAgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgorICAgICAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiIG1lZGlhPSJzY3JlZW4iPgorICAgICAgICAgIEBpbXBvcnQgdXJsKCA8Yzp1cmwgdmFsdWU9Ii9jc3Mvc3R5bGUuY3NzIi8+ICk7CisgICAgICAgIDwvc3R5bGU+CisgICAgICAgIDx0aXRsZT5SRVNUIEJvb2tzdG9yZSBTYW1wbGU8L3RpdGxlPgorICAgIDwvaGVhZD4KKyAgICA8Ym9keT4KKworICAgIDxoMT4ke2l0Lm5hbWV9PC9oMT4KKyAgICAKKyAgICA8aDI+SXRlbSBMaXN0PC9oMj4KKworICAgIDx1bD4KKyAgICAgICAgPGM6Zm9yRWFjaCB2YXI9ImkiIGl0ZW1zPSIke2l0Lml0ZW1zfSI+CisgICAgICAgICAgICA8bGk+PGEgaHJlZj0iaXRlbXMvJHtpLmtleX0vIj4ke2kudmFsdWUudGl0bGV9PC9hPgorICAgICAgICA8L2M6Zm9yRWFjaD4KKyAgICA8L3VsPgorICAgIAorICAgIDxoMj5PdGhlcnM8L2gyPgorICAgIDxwPgorICAgICAgPGEgaHJlZj0iY291bnQiPmNvdW50IGludmVudG9yeTwvYT4KKyAgICA8cD4KKyAgICAgIDxhIGhyZWY9InRpbWUiPmdldCB0aGUgc3lzdGVtIHRpbWU8L2E+CisgICAgPHA+CisgICAgICA8YSBocmVmPSJqc3AvaGVscC5qc3AiPnJlZ3VsYXIgcmVzb3VyY2VzPC9hPgorICAgIDwvcD4gICAgCisgICAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvYm9va3N0b3JlLXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYm9va3N0b3JlL3dlYmFwcC9yZXNvdXJjZS9Cb29rc3RvcmUvdGltZS5qc3AgYi9leGFtcGxlcy9ib29rc3RvcmUtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9ib29rc3RvcmUvd2ViYXBwL3Jlc291cmNlL0Jvb2tzdG9yZS90aW1lLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGNjY2VkCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYm9va3N0b3JlLXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYm9va3N0b3JlL3dlYmFwcC9yZXNvdXJjZS9Cb29rc3RvcmUvdGltZS5qc3AKQEAgLTAsMCArMSwxOCBAQAorPCUtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0lPgorCis8JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9VVRGLTgiIGxhbmd1YWdlPSJqYXZhIiAlPgorPGh0bWw+CisgIDxib2R5PgorICAgIEN1cnJlbnQgc3lzdGVtIHRpbWUgaXMgJHtpdC5zeXN0ZW1UaW1lfQorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9ib29rc3RvcmUtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9ib29rc3RvcmUvd2ViYXBwL3Jlc291cmNlL0NEL2luZGV4LmpzcCBiL2V4YW1wbGVzL2Jvb2tzdG9yZS13ZWJhcHAvc3JjL21haW4vd2ViYXBwL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2Jvb2tzdG9yZS93ZWJhcHAvcmVzb3VyY2UvQ0QvaW5kZXguanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNmE4OTYKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9ib29rc3RvcmUtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9ib29rc3RvcmUvd2ViYXBwL3Jlc291cmNlL0NEL2luZGV4LmpzcApAQCAtMCwwICsxLDQ0IEBACis8JS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorCistLSU+CisKKzwlQHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbCIlPgorPCVAcGFnZSBwYWdlRW5jb2Rpbmc9IlVURi04IiU+CisKKzwlQHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNwL2pzdGwvY29yZSIgcHJlZml4PSJjIiU+IAorPCVAdGFnbGliIHByZWZpeD0icmJ0IiB1cmk9InVybjpvcmc6Z2xhc3NmaXNoOmplcnNleTpzZXJ2bGV0Om12YyIgJT4KKworPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKKyAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorCis8aHRtbD4KKyAgICA8aGVhZD4KKyAgICAgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgorICAgICAgICA8dGl0bGU+Q0Q8L3RpdGxlPgorICAgIDwvaGVhZD4KKyAgICA8Ym9keT4KKworICAgIDxoMT4ke2l0LnRpdGxlfTwvaDE+CisgICAgCisgICAgPHA+Q0QgZnJvbSAke2l0LmF1dGhvcn08L3A+CisgICAgCisgICAgPGgyPlRyYWNrIExpc3Q8L2gyPgorCisgICAgPHVsPgorICAgICAgICA8Yzpmb3JFYWNoIHZhcj0idCIgaXRlbXM9IiR7aXQudHJhY2tzfSIgdmFyU3RhdHVzPSJsb29wIj4KKyAgICAgICAgICAgIDxsaT48YSBocmVmPSJ0cmFja3MvJHtsb29wLmluZGV4fS8iPiR7dC5uYW1lfTwvYT48L2xpPgorICAgICAgICA8L2M6Zm9yRWFjaD4KKyAgICA8L3VsPgorICAgIAorICAgIDxyYnQ6aW5jbHVkZSBwYWdlPSJmb290ZXIuanNwIi8+IAorICAgIAorICAgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2Jvb2tzdG9yZS13ZWJhcHAvc3JjL21haW4vd2ViYXBwL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2Jvb2tzdG9yZS93ZWJhcHAvcmVzb3VyY2UvSGFwcHkvaW5kZXguanNwIGIvZXhhbXBsZXMvYm9va3N0b3JlLXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYm9va3N0b3JlL3dlYmFwcC9yZXNvdXJjZS9IYXBweS9pbmRleC5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVlZjNiZgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2Jvb2tzdG9yZS13ZWJhcHAvc3JjL21haW4vd2ViYXBwL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2Jvb2tzdG9yZS93ZWJhcHAvcmVzb3VyY2UvSGFwcHkvaW5kZXguanNwCkBAIC0wLDAgKzEsMzYgQEAKKzwlLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisKKy0tJT4KKworPCVAcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sIiU+Cis8JUBwYWdlIHBhZ2VFbmNvZGluZz0iVVRGLTgiJT4KKworPCVAdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc3AvanN0bC9jb3JlIiBwcmVmaXg9ImMiJT4KKworPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKKyAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorCis8aHRtbD4KKyAgICA8aGVhZD4KKyAgICAgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgorICAgICAgICA8dGl0bGU+UkVTVCBCb29rc3RvcmUgSGFwcHkgUGFnZSE8L3RpdGxlPgorICAgIDwvaGVhZD4KKyAgICA8Ym9keT4KKworICAgIDxoMT5IYXBweSBQYWdlITwvaDE+CisKKyAgICA8aDI+SGVhZGVyczwvaDI+CisgICAgPHVsPgorICAgICAgJHtpdC5oZWFkZXJzfQorICAgIDwvdWw+CisKKyAgICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9ib29rc3RvcmUtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9ib29rc3RvcmUvd2ViYXBwL3Jlc291cmNlL0l0ZW0vZm9vdGVyLmpzcCBiL2V4YW1wbGVzL2Jvb2tzdG9yZS13ZWJhcHAvc3JjL21haW4vd2ViYXBwL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2Jvb2tzdG9yZS93ZWJhcHAvcmVzb3VyY2UvSXRlbS9mb290ZXIuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjYWI1NjcKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9ib29rc3RvcmUtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9ib29rc3RvcmUvd2ViYXBwL3Jlc291cmNlL0l0ZW0vZm9vdGVyLmpzcApAQCAtMCwwICsxLDE4IEBACis8JS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorCistLSU+CisKKzxwPgorPGEgaHJlZj0iLi4vLi4vIj5CYWNrPC9hPgorPGhyPgorPGRpdiBhbGlnbj0icmlnaHQiPgorICAgIENvbW1vbiBmb290ZXIgKHRpdGxlICR7aXQudGl0bGV9KQorPC9kaXY+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9ib29rc3RvcmUtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9ib29rc3RvcmUvd2ViYXBwL3Jlc291cmNlL1RyYWNrL2luZGV4LmpzcCBiL2V4YW1wbGVzL2Jvb2tzdG9yZS13ZWJhcHAvc3JjL21haW4vd2ViYXBwL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2Jvb2tzdG9yZS93ZWJhcHAvcmVzb3VyY2UvVHJhY2svaW5kZXguanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NDFmMjkKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9ib29rc3RvcmUtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9ib29rc3RvcmUvd2ViYXBwL3Jlc291cmNlL1RyYWNrL2luZGV4LmpzcApAQCAtMCwwICsxLDM1IEBACis8JS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorCistLSU+CisKKzwlQHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbCIlPgorPCVAcGFnZSBwYWdlRW5jb2Rpbmc9IlVURi04IiU+CisKKzwlQHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNwL2pzdGwvY29yZSIgcHJlZml4PSJjIiU+IAorCis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgorICAgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+CisKKzxodG1sPgorICAgIDxoZWFkPgorICAgICAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+CisgICAgICAgIDx0aXRsZT5DRCBUcmFjazwvdGl0bGU+CisgICAgPC9oZWFkPgorICAgIDxib2R5PgorCisgICAgPGgxPiR7aXQubmFtZX08L2gxPgorICAgIAorICAgIDxicj5UcmFjayBsZW5ndGg6ICR7aXQubGVuZ3RofSBzZWMuCisgICAgCisgICAgPHA+PGEgaHJlZj0iLi4vLi4vIj5iYWNrPC9hPgorICAgIAorICAgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2Jvb2tzdG9yZS13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9ib29rc3RvcmUvd2ViYXBwL3Jlc291cmNlL0Jvb2tzdG9yZVRlc3QuamF2YSBiL2V4YW1wbGVzL2Jvb2tzdG9yZS13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9ib29rc3RvcmUvd2ViYXBwL3Jlc291cmNlL0Jvb2tzdG9yZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTJkMmNmCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYm9va3N0b3JlLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2Jvb2tzdG9yZS93ZWJhcHAvcmVzb3VyY2UvQm9va3N0b3JlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuYm9va3N0b3JlLndlYmFwcC5yZXNvdXJjZTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworCisvKioKKyAqIEBhdXRob3IgSmFtZXMgU3RyYWNoYW4KKyAqIEBhdXRob3IgTmFyZXNoCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEJvb2tzdG9yZVRlc3QgZXh0ZW5kcyBUZXN0U3VwcG9ydCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUFzSHRtbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRCb29rc3RvcmVIdG1sUmVzcG9uc2UodGFyZ2V0KCJib29rc3RvcmUtd2ViYXBwIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIYXBweVJlc291cmNlQXNIdG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXNwb25zZSA9IHRhcmdldCgiYm9va3N0b3JlLXdlYmFwcC9oYXBweSIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRIdG1sUmVzcG9uc2UocmVzcG9uc2UpOworICAgICAgICBhc3NlcnRSZXNwb25zZUNvbnRhaW5zKHJlc3BvbnNlLCAiSGFwcHkiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUFzWG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEJvb2tzdG9yZSByZXNwb25zZSA9IHRhcmdldCgiYm9va3N0b3JlLXdlYmFwcCIpLnJlcXVlc3QoImFwcGxpY2F0aW9uL3htbCIpLmdldChCb29rc3RvcmUuY2xhc3MpOworCisgICAgICAgIGFzc2VydE5vdE51bGwoIlNob3VsZCBoYXZlIHJldHVybmVkIGEgYm9va3N0b3JlISIsIHJlc3BvbnNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJib29rc3RvcmUgbmFtZSIsICJDemVjaCBCb29rc3RvcmUiLCByZXNwb25zZS5nZXROYW1lKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlQXNIdG1sVXNpbmdXZWJLaXRBY2NlcHRIZWFkZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXNwb25zZSA9IHRhcmdldCgiYm9va3N0b3JlLXdlYmFwcCIpLnJlcXVlc3QoCisgICAgICAgICAgICAgICAgInRleHQvaHRtbCIsCisgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3hodG1sK3htbCIsCisgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3htbDtxPTAuOSIsCisgICAgICAgICAgICAgICAgIiovKjtxPTAuOCIpLmdldChTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydEJvb2tzdG9yZUh0bWxSZXNwb25zZShyZXNwb25zZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0Qm9va3N0b3JlSHRtbFJlc3BvbnNlKFN0cmluZyByZXNwb25zZSkgeworICAgICAgICBhc3NlcnRIdG1sUmVzcG9uc2UocmVzcG9uc2UpOworICAgICAgICBhc3NlcnRSZXNwb25zZUNvbnRhaW5zKHJlc3BvbnNlLCAiQm9va3N0b3JlIik7CisgICAgICAgIGFzc2VydFJlc3BvbnNlQ29udGFpbnMocmVzcG9uc2UsICJJdGVtIExpc3QiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9ib29rc3RvcmUtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYm9va3N0b3JlL3dlYmFwcC9yZXNvdXJjZS9JdGVtVGVzdC5qYXZhIGIvZXhhbXBsZXMvYm9va3N0b3JlLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2Jvb2tzdG9yZS93ZWJhcHAvcmVzb3VyY2UvSXRlbVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTE0YWI0Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvYm9va3N0b3JlLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2Jvb2tzdG9yZS93ZWJhcHAvcmVzb3VyY2UvSXRlbVRlc3QuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmJvb2tzdG9yZS53ZWJhcHAucmVzb3VyY2U7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CisKKy8qKgorICogQGF1dGhvciBKYW1lcyBTdHJhY2hhbgorICogQGF1dGhvciBOYXJlc2gKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgSXRlbVRlc3QgZXh0ZW5kcyBUZXN0U3VwcG9ydCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUFzSHRtbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzcG9uc2UgPSBpdGVtMXJlc291cmNlKCkucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRJdGVtSHRtbFJlc3BvbnNlKHJlc3BvbnNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUFzWG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyB0ZXh0ID0gaXRlbTFyZXNvdXJjZSgpLnJlcXVlc3QoImFwcGxpY2F0aW9uL3htbCIpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkl0ZW0gWE1MIGlzOiAiICsgdGV4dCk7CisKKyAgICAgICAgZmluYWwgQm9vayByZXNwb25zZSA9IGl0ZW0xcmVzb3VyY2UoKS5yZXF1ZXN0KCJhcHBsaWNhdGlvbi94bWwiKS5nZXQoQm9vay5jbGFzcyk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIlNob3VsZCBoYXZlIHJldHVybmVkIGFuIGl0ZW0hIiwgcmVzcG9uc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoIml0ZW0gdGl0bGUiLCAiU3ZlamsiLCByZXNwb25zZS5nZXRUaXRsZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUFzSHRtbFVzaW5nV2ViS2l0QWNjZXB0SGVhZGVycygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzcG9uc2UgPSBpdGVtMXJlc291cmNlKCkucmVxdWVzdCgKKyAgICAgICAgICAgICAgICAidGV4dC9odG1sIiwKKyAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24veGh0bWwreG1sIiwKKyAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24veG1sO3E9MC45IiwKKyAgICAgICAgICAgICAgICAiKi8qO3E9MC44IikuZ2V0KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0SXRlbUh0bWxSZXNwb25zZShyZXNwb25zZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0SXRlbUh0bWxSZXNwb25zZShTdHJpbmcgcmVzcG9uc2UpIHsKKyAgICAgICAgYXNzZXJ0SHRtbFJlc3BvbnNlKHJlc3BvbnNlKTsKKyAgICAgICAgYXNzZXJ0UmVzcG9uc2VDb250YWlucyhyZXNwb25zZSwgIjx0aXRsZT5Cb29rPC90aXRsZT4iKTsKKyAgICAgICAgYXNzZXJ0UmVzcG9uc2VDb250YWlucyhyZXNwb25zZSwgIjxoMT5TdmVqazwvaDE+Iik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFdlYlRhcmdldCBpdGVtMXJlc291cmNlKCkgeworICAgICAgICByZXR1cm4gdGFyZ2V0KCJib29rc3RvcmUtd2ViYXBwIikucGF0aCgiL2l0ZW1zLzEiKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2Jvb2tzdG9yZS13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9ib29rc3RvcmUvd2ViYXBwL3Jlc291cmNlL1Rlc3RTdXBwb3J0LmphdmEgYi9leGFtcGxlcy9ib29rc3RvcmUtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYm9va3N0b3JlL3dlYmFwcC9yZXNvdXJjZS9UZXN0U3VwcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NTRlODUKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9ib29rc3RvcmUtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYm9va3N0b3JlL3dlYmFwcC9yZXNvdXJjZS9UZXN0U3VwcG9ydC5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuYm9va3N0b3JlLndlYmFwcC5yZXNvdXJjZTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5ib29rc3RvcmUud2ViYXBwLk15QXBwbGljYXRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5qc3AuSnNwTXZjRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBAYXV0aG9yIEphbWVzIFN0cmFjaGFuCisgKiBAYXV0aG9yIE5hcmVzaAorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBUZXN0U3VwcG9ydCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZmluYWwgTXlBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiA9IG5ldyBNeUFwcGxpY2F0aW9uKCk7CisgICAgICAgIGFwcGxpY2F0aW9uLnJlZ2lzdGVyKEpzcE12Y0ZlYXR1cmUuY2xhc3MpOworICAgICAgICBhcHBsaWNhdGlvbi5wcm9wZXJ0eShTZXJ2bGV0UHJvcGVydGllcy5GSUxURVJfRk9SV0FSRF9PTl80MDQsIHRydWUpOworICAgICAgICByZXR1cm4gYXBwbGljYXRpb247CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0SHRtbFJlc3BvbnNlKFN0cmluZyByZXNwb25zZSkgeworICAgICAgICBhc3NlcnROb3ROdWxsKCJObyB0ZXh0IHJldHVybmVkISIsIHJlc3BvbnNlKTsKKworICAgICAgICBhc3NlcnRSZXNwb25zZUNvbnRhaW5zKHJlc3BvbnNlLCAiPGh0bWw+Iik7CisgICAgICAgIGFzc2VydFJlc3BvbnNlQ29udGFpbnMocmVzcG9uc2UsICI8L2h0bWw+Iik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0UmVzcG9uc2VDb250YWlucyhTdHJpbmcgcmVzcG9uc2UsIFN0cmluZyB0ZXh0KSB7CisgICAgICAgIGFzc2VydFRydWUoIlJlc3BvbnNlIHNob3VsZCBjb250YWluICIgKyB0ZXh0ICsgIiBidXQgd2FzOiAiICsgcmVzcG9uc2UsIHJlc3BvbnNlLmNvbnRhaW5zKHRleHQpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9idWlsZC5yZWFkbWUgYi9leGFtcGxlcy9idWlsZC5yZWFkbWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM4YjNiMwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2J1aWxkLnJlYWRtZQpAQCAtMCwwICsxLDQyIEBACitUaGlzIHJlYWQtbWUgZmlsZSBicmllZmx5IHN1bW1hcml6ZXMgb3B0aW9ucyBmb3IgYnVpbGRpbmcgSmVyc2V5IGV4YW1wbGVzLgorCitUbyBidWlsZCBleGFtcGxlcyB3aXRob3V0IGdlbmVyYXRpbmcgaW5kaXZpZHVhbCBleGFtcGxlIHByb2plY3Qgc291cmNlIFpJUAorYnVuZGxlcywgcnVuOgorCisgID4gbXZuIGNsZWFuIGluc3RhbGwKKworCitUbyBidWlsZCBleGFtcGxlcyBhbmQgZ2VuZXJhdGUgaW5kaXZpZHVhbCBleGFtcGxlIHByb2plY3Qgc291cmNlIFpJUCBidW5kbGVzLAorcnVuIHRoZSBidWlsZCB3aXRoICJleGFtcGxlcy1zb3VyY2UtemlwIiBwcm9maWxlIGVuYWJsZWQ6CisKKyAgPiBtdm4gY2xlYW4gaW5zdGFsbCAtUCByZWxlYXNlCisKKworU29tZSBleGFtcGxlcyBjb250YWluIHRlc3RzIHRoYXQgZGVwZW5kIG9uIGV4dGVybmFsIGNvbnRhaW5lciB0byBiZSB1cCBhbmQKK3J1bm5pbmcuIFRlc3RzIGluIHRoZXNlIGV4YW1wbGVzIGFyZSBkaXNhYmxlZCBieSBkZWZhdWx0LiBUbyBlbmFibGUgdGhlIHRlc3RzCit0byBiZSBydW4gYWdhaW5zdCBhIHByb3Blcmx5IHNldC11cCBleHRlcm5hbCBjb250YWluZXIgdmVyc2lvbiwgcnVuIHRoZSBidWlsZAord2l0aCAicnVuLWV4dGVybmFsLXRlc3RzIiBwcm9maWxlIGVuYWJsZWQ6CisKKyAgPiBtdm4gY2xlYW4gaW5zdGFsbCAtUCBydW4tZXh0ZXJuYWwtdGVzdHMKKworV2hlbiBydW5uaW5nIHRoZSBidWlsZCB3aXRoIHRoZSAicnVuLWV4dGVybmFsLXRlc3RzIiBwcm9maWxlLCBmb2xsb3dpbmcgY29tbWFuZAorbGluZSBwcm9wZXJ0aWVzIGNhbiBiZSB1c2VkIHRvIGN1c3RvbWl6ZSB0aGUgYnVpbGQ6CisKKyAgZXh0ZXJuYWwuY29udGFpbmVyLmZhY3RvcnkKKworICAgICAtIGRlZmluZXMgZXh0ZXJuYWwgdGVzdCBjb250YWluZXIgZmFjdG9yeSBjbGFzcyB0byBiZSB1c2VkIGZvciB0aGUgdGVzdHMKKyAgICAgICBleGVjdXRlZCBhcyBwYXJ0IG9mIHRoZSAicnVuLWV4dGVybmFsLXRlc3RzIiBwcm9maWxlCisKKyAgICAgLSBkZWZhdWx0cyB0byAib3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5IgorCisKKyAgZXh0ZXJuYWwuY29udGFpbmVyLnBvcnQKKworICAgICAtIGRlZmluZXMgdGhlIFRDUC9JUCBwb3J0IG9mIHRoZSBleHRlcm5hbCB0ZXN0IGNvbnRhaW5lciB0byBiZSB1c2VkIGZvcgorICAgICAgIHRoZSB0ZXN0cyBleGVjdXRlZCBhcyBwYXJ0IG9mIHRoZSAicnVuLWV4dGVybmFsLXRlc3RzIiBwcm9maWxlCisKKyAgICAgLSBkZWZhdWx0cyB0byAiODA4MCIKKworRm9yIGV4YW1wbGU6CisKKyAgPiBtdm4gY2xlYW4gaW5zdGFsbCAtUCBydW4tZXh0ZXJuYWwtdGVzdHMgLURleHRlcm5hbC5jb250YWluZXIucG9ydD05MDkwCmRpZmYgLS1naXQgYS9leGFtcGxlcy9jZGktd2ViYXBwL1JFQURNRS5NRCBiL2V4YW1wbGVzL2NkaS13ZWJhcHAvUkVBRE1FLk1ECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2M2EyOTkKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9jZGktd2ViYXBwL1JFQURNRS5NRApAQCAtMCwwICsxLDYyIEBACitbLy9dOiAjICIgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICIKK1svL106ICMgIiAiCitbLy9dOiAjICIgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlICIKK1svL106ICMgIiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCAiCitbLy9dOiAjICIgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLiAiCitbLy9dOiAjICIgIgorWy8vXTogIyAiIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UgIgorCitKZXJzZXkgQ0RJIEludGVncmF0aW9uIENESSBCZWFucyBXZWJBcHAgRXhhbXBsZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gZGV2ZWxvcCBSRVNUZnVsIHdlYiBzZXJ2aWNlIHdpdGggQ0RJCittYW5hZ2VkIGJlYW5zIGFuZCBhIFNlcnZsZXQgMy4wIFdlYiBjb250YWluZXIuCisKK0NvbnRlbnRzCistLS0tLS0tLQorCitUaGUgbWFwcGluZyBvZiB0aGUgVVJJIHBhdGggc3BhY2UgaXMgcHJlc2VudGVkIGluIHRoZSBmb2xsb3dpbmcgdGFibGU6CisKK1VSSSBwYXRoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBEZXNjcmlwdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRXhwZWN0ZWQgUmVzdWx0cworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKl8vY2RpLXdlYmFwcC9oZWxsb3dvcmxkXyoqICAgICAgICAgIHwgQSBtYW5hZ2VkIGJlYW4gd2l0aCBubyB1c2Ugb2YgaW5qZWN0aW9uIHdoYXRzb2V2ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEhlbGxvIFdvcmxkCisqKl8vY2RpLXdlYmFwcC9zaW5nbGV0b25fKiogICAgICAgICAgIHwgU2hvd3MgaW5qZWN0aW9uIG9mIGNvbnRleHQgb2JqZWN0cyBpbnRvIHRoZSBmaWVsZHMgb2YgYSBtYW5hZ2VkIGJlYW4uICAgICAgICAgICAgICAgICAgICAgICB8IE9LIEdFVCAvY2RpLXdlYmFwcC9zaW5nbGV0b24KKyoqXy9jZGktd2ViYXBwL3NpbmdsZXRvbi9jb3VudGVyXyoqICAgfCBTaG93cyBpbmplY3Rpb24gb2YgY29udGV4dCBvYmplY3RzIGludG8gdGhlIGZpZWxkcyBvZiBhIG1hbmFnZWQgYmVhbi4gICAgICAgICAgICAgICAgICAgICAgIHwgc3RhbmRhbG9uZSBHcml6emx5IChubyByZXNvdXJjZSBpbmplY3Rpb24gc3VwcG9ydCkgLSAwIGluaXRpYWwgaW5jcmVtZW50IHZhbHVlLCB0aGF0IGdldHMgaW5jcmVtZW50ZWQgd2l0aCBlYWNoIG90aGVyIHJlcXVlc3QKK8KgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgwqAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBKYXZhIEVFIGNvbXBsaWFudCBBUyAtIDQyIGluaXRpYWwgaW5jcmVtZW50IHZhbHVlCisqKl8vY2RpLXdlYmFwcC9vdGhlci9DL0RfKiogICAgICAgICAgIHwgU2hvd3MgaW5qZWN0aW9uIG9mIGNvbnRleHQgb2JqZWN0cyBhbmQgcGF0aCBwYXJhbWV0ZXJzIGludG8gdGhlIGZpZWxkcyBvZiBhIG1hbmFnZWQgYmVhbi4gICB8IElOVEVSQ0VQVEVEOiBPSyBHRVQgL2NkaS13ZWJhcHAvb3RoZXIsIGM9QywgZD1ECisqKl8vY2RpLXdlYmFwcC9lY2hvZmllbGQvYj9hPWFfKiogICAgIHwgU2hvd3MgaW5qZWN0aW9uIG9mIHBhdGggYW5kIHF1ZXJ5IHBhcmFtZXRlcnMgaW50byB0aGUgZmllbGRzIG9mIGEgbWFuYWdlZCBiZWFuLiAgICAgICAgICAgICB8IEVDSE8gYSBiCisqKl8vY2RpLXdlYmFwcC9lY2hvL2FfKiogICAgICAgICAgICAgIHwgQSBtYW5hZ2VkIGJlYW4gdGhhdCB1c2VzIChidXQgZG9lcyBub3QgaW5qZWN0KSBhIHBhdGggcGFyYW1ldGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEVDSE8gYQorCitSdW5uaW5nIHRoZSBFeGFtcGxlCistLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgZXhhbXBsZSBzaG91bGQgd29yayBvbiBhbnkgSmF2YSBFRSA3IGNvbXBsaWFudCBhcHBsaWNhdGlvbiBzZXJ2ZXIuCitJdCBoYXMgYmVlbiB0ZXN0ZWQgb24gYSBzdGFuZGFsb25lIEdsYXNzRmlzaCA0IGluc3RhbmNlLiBUaGUgZWFzaWVzdCB3YXkKK3RvIGdldCB0aGUgYXBwbGljYXRpb24gcnVubmluZyB0aGVyZSBpcyB0byBidWlsZCBpdCBhbmQgZGVwbG95IGFzCitmb2xsb3dzOgorCisgICAgbXZuIGNsZWFuIHBhY2thZ2UKKyAgICAkQVNfSE9NRS9hc2FkbWluIGRlcGxveSB0YXJnZXQvY2RpLXdlYmFwcC53YXIKKworQW5vdGhlciBvcHRpb24sIGludHJvZHVjZWQgaW4gSmVyc2V5IDIuMTUsIGlzIHRvIHJ1biB0aGlzIGV4YW1wbGUgaW4KK0dyaXp6bHkgSFRUUCBzZXJ2ZXIuIFRvIGdldCB0aGUgYXBwbGljYXRpb24gcnVubmluZyB0aGVyZSB5b3UganVzdAoraW52b2tlIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoKKworICAgIG12biBjbGVhbiBjb21waWxlIGV4ZWM6amF2YQorCitTaW5jZSBXZWxkIFNlcnZsZXQgc3VwcG9ydCBpcyBwcm92aWRlZCBhbHNvIGZvciBBcGFjaGUgVG9tY2F0IHNlcnZlciwKK3RoZXJlIGlzIHlldCBhbm90aGVyIHdheSBob3cgdG8gZGVwbG95IHRoZSBhcHBsaWNhdGlvbi4gVXNlIHRoZQorYHRvbWNhdC1wYWNrYWdpbmdgIG1hdmVuIHByb2ZpbGUgdG8gZ2V0IHRoZSBXQVIgYXJjaGl2ZSBwYWNrYWdlZCBpbiBhCit3YXkgdGhhdCBtYWtlcyBpdCByZWFkeSBmb3IgVG9tY2F0IDcrIGRlcGxveW1lbnQ6CisKKyAgICBtdm4gLVB0b21jYXQtcGFja2FnaW5nIGNsZWFuIHBhY2thZ2UKKyAgICBjcCB0YXJnZXQvY2RpLXdlYmFwcC53YXIgJENBVEFMSU5BX0hPTUUvd2ViYXBwcworCitBZnRlciB5b3Ugc3VjY2Vzc2Z1bGx5IGRlcGxveSB0aGUgYXBwbGljYXRpb24sIHZpc2l0IHRoZSBmb2xsb3dpbmcgVVJMczoKKworLSAgIDxodHRwOi8vbG9jYWxob3N0OjgwODAvY2RpLXdlYmFwcC9oZWxsb3dvcmxkPgorLSAgIDxodHRwOi8vbG9jYWxob3N0OjgwODAvY2RpLXdlYmFwcC9zaW5nbGV0b24+CistICAgPGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9jZGktd2ViYXBwL3NpbmdsZXRvbi9jb3VudGVyPgorLSAgIDxodHRwOi8vbG9jYWxob3N0OjgwODAvY2RpLXdlYmFwcC9vdGhlci9DL0Q+CistICAgPGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9jZGktd2ViYXBwL2VjaG9maWVsZC9iP2E9YT4KKy0gICA8aHR0cDovL2xvY2FsaG9zdDo4MDgwL2NkaS13ZWJhcHAvZWNoby9hPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2NkaS13ZWJhcHAvcG9tLnhtbCBiL2V4YW1wbGVzL2NkaS13ZWJhcHAvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzhlNmIwCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvY2RpLXdlYmFwcC9wb20ueG1sCkBAIC0wLDAgKzEsMTg4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorCisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPndlYmFwcC1leGFtcGxlLXBhcmVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi93ZWJhcHAtZXhhbXBsZS1wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+Y2RpLXdlYmFwcDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS1leGFtcGxlcy1jZGktd2ViYXBwPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPkplcnNleSBDREkgZXhhbXBsZS48L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktaGsyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LndzLnJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXgud3MucnMtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LmFubm90YXRpb248L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5hbm5vdGF0aW9uLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lbnRlcnByaXNlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2RpLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+IDwhLS0gdGhpcyBpcyB0byBhdm9pZCBKZXJzZXkgamFycyB0byBiZSBidW5kbGVkIHdpdGggdGhlIFdBUiAtLT4KKyAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItZ3JpenpseTItaHR0cDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXNlcnZlcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktd2VsZDItc2U8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jZGkxeDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+cnVuLWV4dGVybmFsLXRlc3RzPC9pZD4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIuZmFjdG9yeT4ke2V4dGVybmFsLmNvbnRhaW5lci5mYWN0b3J5fTwvamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5mYWN0b3J5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0PiR7ZXh0ZXJuYWwuY29udGFpbmVyLnBvcnR9PC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgIDwhLS0gRXh0ZXJuYWwgdGVzdCBjb250YWluZXIgY29uZmlndXJhdGlvbiBpcyBkb25lIHZpYSBwcm9wZXJ0aWVzIHRvIGFsbG93IG92ZXJyaWRpbmcgdmlhIGNvbW1hbmQgbGluZS4gLS0+CisgICAgICAgICAgICAgICAgPGV4dGVybmFsLmNvbnRhaW5lci5mYWN0b3J5Pm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTwvZXh0ZXJuYWwuY29udGFpbmVyLmZhY3Rvcnk+CisgICAgICAgICAgICAgICAgPGV4dGVybmFsLmNvbnRhaW5lci5wb3J0PjgwODA8L2V4dGVybmFsLmNvbnRhaW5lci5wb3J0PgorICAgICAgICAgICAgICAgIDxtYXZlbi50ZXN0LnNraXA+ZmFsc2U8L21hdmVuLnRlc3Quc2tpcD4KKyAgICAgICAgICAgIDwvcHJvcGVydGllcz4KKyAgICAgICAgPC9wcm9maWxlPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5yZWxlYXNlPC9pZD4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+eG1sLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNraXA+dHJ1ZTwvc2tpcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorCisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnRvbWNhdC1wYWNrYWdpbmc8L2lkPgorCisgICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KKyAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LndzLnJzPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC53cy5ycy1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KKyAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldC1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisgICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmhrMi5leHRlcm5hbDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguaW5qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXNlcnZlcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNkaTF4PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisgICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY2RpMXgtc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmpib3NzLndlbGQuc2VydmxldDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+d2VsZC1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmV4ZWMtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8bWFpbkNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmNkaS5BcHA8L21haW5DbGFzcz4KKyAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aFNjb3BlPnRlc3Q8L2NsYXNzcGF0aFNjb3BlPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvY2RpLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2NkaS9BcHAuamF2YSBiL2V4YW1wbGVzL2NkaS13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9jZGkvQXBwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ5NzBiOQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2NkaS13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9jZGkvQXBwLmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5jZGk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgb3JnLmpib3NzLndlbGQuZW52aXJvbm1lbnQuc2UuV2VsZDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guZ3JpenpseS5odHRwLnNlcnZlci5IdHRwU2VydmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmNkaS5yZXNvdXJjZXMuTXlBcHBsaWNhdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5Mi5odHRwc2VydmVyLkdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKKy8qKgorICogSGVsbG8gd29ybGQhCisgKi8KK3B1YmxpYyBjbGFzcyBBcHAgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIEJBU0VfVVJJID0gVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2NkaS13ZWJhcHAvIik7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkplcnNleSBDREkgRXhhbXBsZSBBcHAiKTsKKworICAgICAgICAgICAgZmluYWwgV2VsZCB3ZWxkID0gbmV3IFdlbGQoKTsKKyAgICAgICAgICAgIHdlbGQuaW5pdGlhbGl6ZSgpOworCisgICAgICAgICAgICBmaW5hbCBIdHRwU2VydmVyIHNlcnZlciA9IEdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeS5jcmVhdGVIdHRwU2VydmVyKEJBU0VfVVJJLCBjcmVhdGVKYXhSc0FwcCgpLCBmYWxzZSk7CisgICAgICAgICAgICBSdW50aW1lLmdldFJ1bnRpbWUoKS5hZGRTaHV0ZG93bkhvb2sobmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIuc2h1dGRvd25Ob3coKTsKKyAgICAgICAgICAgICAgICAgICAgd2VsZC5zaHV0ZG93bigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pKTsKKyAgICAgICAgICAgIHNlcnZlci5zdGFydCgpOworCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oU3RyaW5nLmZvcm1hdCgiQXBwbGljYXRpb24gc3RhcnRlZC5cblRyeSBvdXQgJXMlc1xuU3RvcCB0aGUgYXBwbGljYXRpb24gdXNpbmcgQ1RSTCtDIiwKKyAgICAgICAgICAgICAgICAgICAgQkFTRV9VUkksICJhcHBsaWNhdGlvbi53YWRsIikpOworCisgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gfCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihBcHAuY2xhc3MuZ2V0TmFtZSgpKS5sb2coTGV2ZWwuU0VWRVJFLCBudWxsLCBleCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VDb25maWcgY3JlYXRlSmF4UnNBcHAoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcobmV3IE15QXBwbGljYXRpb24oKS5nZXRDbGFzc2VzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2NkaS13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9jZGkvcmVzb3VyY2VzL0VjaG9QYXJhbUNvbnN0cnVjdG9yUmVzb3VyY2UuamF2YSBiL2V4YW1wbGVzL2NkaS13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9jZGkvcmVzb3VyY2VzL0VjaG9QYXJhbUNvbnN0cnVjdG9yUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWZkZTg2Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvY2RpLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2NkaS9yZXNvdXJjZXMvRWNob1BhcmFtQ29uc3RydWN0b3JSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uTWFuYWdlZEJlYW47CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0OworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKKworLyoqCisgKiBTaG93cyBjb25zdHJ1Y3RvciBpbmplY3Rpb24gb2YgYSBwYXRoIHBhcmFtZXRlciBpbiBhIG1hbmFnZWQgYmVhbi4KKyAqCisgKiBAYXV0aG9yIFJvYmVydG8gQ2hpbm5pY2kKKyAqLworQE1hbmFnZWRCZWFuCitAUGF0aCgiZWNob3BhcmFtY29uc3RydWN0b3Ive2F9IikKK3B1YmxpYyBjbGFzcyBFY2hvUGFyYW1Db25zdHJ1Y3RvclJlc291cmNlIHsKKworICAgIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihFY2hvUGFyYW1Db25zdHJ1Y3RvclJlc291cmNlLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBTdHJpbmcgYTsKKworICAgIC8vIG5vLWFyZyBjdG9yIGlzIHJlcXVpcmVkIGJ5IFdMUworICAgIHB1YmxpYyBFY2hvUGFyYW1Db25zdHJ1Y3RvclJlc291cmNlKCkgeworICAgIH0KKworICAgIEBJbmplY3QKKyAgICBwdWJsaWMgRWNob1BhcmFtQ29uc3RydWN0b3JSZXNvdXJjZShAUGF0aFBhcmFtKCJhIikgU3RyaW5nIGEpIHsKKyAgICAgICAgdGhpcy5hID0gYTsKKyAgICB9CisKKyAgICBAUG9zdENvbnN0cnVjdAorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorICAgIHByaXZhdGUgdm9pZCBwb3N0Q29uc3RydWN0KCkgeworICAgICAgICBMT0dHRVIuaW5mbyhTdHJpbmcuZm9ybWF0KCJpbiBwb3N0IGNvbnN0cnVjdCwgYT0lcyIsIGEpKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICByZXR1cm4gIkVDSE8gIiArIGE7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvY2RpLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2NkaS9yZXNvdXJjZXMvRWNob1BhcmFtRmllbGRSZXNvdXJjZS5qYXZhIGIvZXhhbXBsZXMvY2RpLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2NkaS9yZXNvdXJjZXMvRWNob1BhcmFtRmllbGRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MjY3MzEKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9jZGktd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvY2RpL3Jlc291cmNlcy9FY2hvUGFyYW1GaWVsZFJlc291cmNlLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk1hbmFnZWRCZWFuOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUG9zdENvbnN0cnVjdDsKKworLyoqCisgKiBTaG93cyBpbmplY3Rpb24gb2YgcGF0aCBhbmQgcXVlcnkgcGFyYW1ldGVyIGludG8gYSBtYW5hZ2VkIGJlYW4uCisgKgorICogQGF1dGhvciBSb2JlcnRvIENoaW5uaWNpCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitATWFuYWdlZEJlYW4KK0BQYXRoKCJlY2hvZmllbGQve2J9IikKK3B1YmxpYyBjbGFzcyBFY2hvUGFyYW1GaWVsZFJlc291cmNlIHsKKworICAgIEBQYXRoUGFyYW0oImIiKSBTdHJpbmcgYkluamVjdGVkOworCisgICAgU3RyaW5nIGI7CisKKyAgICAvKioKKyAgICAgKiBFbnN1cmUgd2UgZ290IHBhdGggcGFyYW1ldGVyIHZhbHVlIGluamVjdGVkLgorICAgICAqLworICAgIEBQb3N0Q29uc3RydWN0CisgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisgICAgcHJpdmF0ZSB2b2lkIHBvc3RDb25zdHJ1Y3QoKSB7CisgICAgICAgIGlmIChiSW5qZWN0ZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRmllbGQgYiBoYXMgbm90IGJlZW4gaW5qZWN0ZWQhIik7CisgICAgICAgIH0KKyAgICAgICAgYiA9IGJJbmplY3RlZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBzdHJpbmcgY29udGFpbmluZyBpbmplY3RlZCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYSB2YWx1ZSBvZiBhIHF1ZXJ5IHBhcmFtZXRlciBhLgorICAgICAqIEByZXR1cm4gbWVzc2FnZSBjb250YWluaW5nIGluamVjdGVkIHZhbHVlcy4KKyAgICAgKi8KKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldChAUXVlcnlQYXJhbSgiYSIpIFN0cmluZyBhKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJFQ0hPICVzICVzIiwgYSwgYik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvY2RpLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2NkaS9yZXNvdXJjZXMvRWNob1BhcmFtUmVzb3VyY2UuamF2YSBiL2V4YW1wbGVzL2NkaS13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9jZGkvcmVzb3VyY2VzL0VjaG9QYXJhbVJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUwMjU0MwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2NkaS13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9jZGkvcmVzb3VyY2VzL0VjaG9QYXJhbVJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5NYW5hZ2VkQmVhbjsKKworLyoqCisgKiBBIG1hbmFnZWQgYmVhbiB0aGF0IHVzZXMgKGJ1dCBkb2VzIG5vdCBpbmplY3QpIGEgcGF0aCBwYXJhbWV0ZXIuCisgKgorICogQGF1dGhvciBSb2JlcnRvIENoaW5uaWNpCisgKi8KK0BNYW5hZ2VkQmVhbgorQFBhdGgoImVjaG8ve2F9IikKK3B1YmxpYyBjbGFzcyBFY2hvUGFyYW1SZXNvdXJjZSB7CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldChAUGF0aFBhcmFtKCJhIikgU3RyaW5nIHBhcmFtKSB7CisgICAgICAgIHJldHVybiAiRUNITyAiICsgcGFyYW07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvY2RpLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2NkaS9yZXNvdXJjZXMvSGVsbG9Xb3JsZFJlc291cmNlLmphdmEgYi9leGFtcGxlcy9jZGktd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvY2RpL3Jlc291cmNlcy9IZWxsb1dvcmxkUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjIxMGFiCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvY2RpLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2NkaS9yZXNvdXJjZXMvSGVsbG9Xb3JsZFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk1hbmFnZWRCZWFuOworCisvKioKKyAqIEEgbWFuYWdlZCBiZWFuIHdpdGggbm8gdXNlIG9mIGluamVjdGlvbiB3aGF0c29ldmVyLgorICoKKyAqIEBhdXRob3IgUm9iZXJ0byBDaGlubmljaS4KKyAqLworQE1hbmFnZWRCZWFuCitAUGF0aCgiL2hlbGxvd29ybGQiKQorcHVibGljIGNsYXNzIEhlbGxvV29ybGRSZXNvdXJjZSB7CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldENsaWNoZWRNZXNzYWdlKCkgeworICAgICAgICByZXR1cm4gIkhlbGxvIFdvcmxkIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9jZGktd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvY2RpL3Jlc291cmNlcy9NeUFwcGxpY2F0aW9uLmphdmEgYi9leGFtcGxlcy9jZGktd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvY2RpL3Jlc291cmNlcy9NeUFwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA4Nzk5YgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2NkaS13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9jZGkvcmVzb3VyY2VzL015QXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKKy8qKgorICogSkFYLVJTIGFwcGxpY2F0aW9uLgorICoKKyAqIEBhdXRob3IgSm9uYXRoYW4gQmVub2l0IChqb25hdGhhbi5iZW5vaXQgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uUGF0aCgiLyoiKQorcHVibGljIGNsYXNzIE15QXBwbGljYXRpb24gZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgZmluYWwgU2V0PENsYXNzPD8+PiBjbGFzc2VzID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICBjbGFzc2VzLmFkZChNeVNpbmdsZXRvblJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgY2xhc3Nlcy5hZGQoTXlPdGhlclJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgY2xhc3Nlcy5hZGQoSGVsbG9Xb3JsZFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgY2xhc3Nlcy5hZGQoRWNob1BhcmFtUmVzb3VyY2UuY2xhc3MpOworICAgICAgICBjbGFzc2VzLmFkZChFY2hvUGFyYW1GaWVsZFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgY2xhc3Nlcy5hZGQoRWNob1BhcmFtQ29uc3RydWN0b3JSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIGNsYXNzZXMuYWRkKFByb3h5SW5qZWN0ZWRBcHBTY29wZWRSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIGNsYXNzZXMuYWRkKFJlcXVlc3RTY29wZWRSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJldHVybiBjbGFzc2VzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2NkaS13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9jZGkvcmVzb3VyY2VzL015T3RoZXJSZXNvdXJjZS5qYXZhIGIvZXhhbXBsZXMvY2RpLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2NkaS9yZXNvdXJjZXMvTXlPdGhlclJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJiYjgyOQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2NkaS13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9jZGkvcmVzb3VyY2VzL015T3RoZXJSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXF1ZXN0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uTWFuYWdlZEJlYW47CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuUmVxdWVzdFNjb3BlZDsKKworaW1wb3J0IGphdmF4LmludGVyY2VwdG9yLkFyb3VuZEludm9rZTsKK2ltcG9ydCBqYXZheC5pbnRlcmNlcHRvci5JbnRlcmNlcHRvcnM7CitpbXBvcnQgamF2YXguaW50ZXJjZXB0b3IuSW52b2NhdGlvbkNvbnRleHQ7CisKKy8qKgorICogU2hvd3MgaW5qZWN0aW9uIG9mIGNvbnRleHQgb2JqZWN0cyBhbmQgcGF0aCBwYXJhbWV0ZXJzIGludG8gdGhlIGZpZWxkcyBvZiBhIG1hbmFnZWQgYmVhbi4KKyAqCisgKiBAYXV0aG9yIFJvYmVydG8gQ2hpbm5pY2kKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BNYW5hZ2VkQmVhbgorQFJlcXVlc3RTY29wZWQKK0BQYXRoKCIvb3RoZXIve2N9L3tkfSIpCitwdWJsaWMgY2xhc3MgTXlPdGhlclJlc291cmNlIHsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlJbnRlcmNlcHRvciB7CisKKyAgICAgICAgQEFyb3VuZEludm9rZQorICAgICAgICBwdWJsaWMgT2JqZWN0IGFyb3VuZChJbnZvY2F0aW9uQ29udGV4dCBjdHgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIklOVEVSQ0VQVEVEOiAlcyIsIGN0eC5wcm9jZWVkKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQENvbnRleHQgVXJpSW5mbyB1cmlJbmZvOworICAgIEBDb250ZXh0IFJlcXVlc3QgcmVxdWVzdDsKKworICAgIEBQYXRoUGFyYW0oImMiKSBTdHJpbmcgYzsKKyAgICBAUGF0aFBhcmFtKCJkIikgU3RyaW5nIGQ7CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBASW50ZXJjZXB0b3JzKE15SW50ZXJjZXB0b3IuY2xhc3MpCisgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJPSyAlcyAlcywgYz0lcywgZD0lcyIsIHJlcXVlc3QuZ2V0TWV0aG9kKCksIHVyaUluZm8uZ2V0UmVxdWVzdFVyaSgpLCBjLCBkKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9jZGktd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvY2RpL3Jlc291cmNlcy9NeVNpbmdsZXRvblJlc291cmNlLmphdmEgYi9leGFtcGxlcy9jZGktd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvY2RpL3Jlc291cmNlcy9NeVNpbmdsZXRvblJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI2YzQxMAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2NkaS13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9jZGkvcmVzb3VyY2VzL015U2luZ2xldG9uUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUFVUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVxdWVzdDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk1hbmFnZWRCZWFuOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUmVzb3VyY2U7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LkFwcGxpY2F0aW9uU2NvcGVkOworCisvKioKKyAqIFNob3dzIGluamVjdGlvbiBvZiBjb250ZXh0IG9iamVjdHMgaW50byB0aGUgZmllbGRzIG9mIGEgbWFuYWdlZCBiZWFuLgorICoKKyAqIEBhdXRob3IgUm9iZXJ0byBDaGlubmljaQorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQE1hbmFnZWRCZWFuCitAQXBwbGljYXRpb25TY29wZWQKK0BQYXRoKCIvc2luZ2xldG9uIikKK3B1YmxpYyBjbGFzcyBNeVNpbmdsZXRvblJlc291cmNlIHsKKworICAgIEBDb250ZXh0CisgICAgVXJpSW5mbyB1cmlJbmZvOworICAgIEBDb250ZXh0CisgICAgUmVxdWVzdCByZXF1ZXN0OworCisgICAgQFJlc291cmNlKG5hbWUgPSAiaW5qZWN0ZWRSZXNvdXJjZSIpCisgICAgaW50IGNvdW50ZXIgPSAwOworCisgICAgQEdFVAorICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIk9LICVzIHVyaT0lcyIsCisgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRNZXRob2QoKSwgdXJpSW5mby5nZXRSZXF1ZXN0VXJpKCkpOworICAgIH0KKworICAgIEBQYXRoKCJjb3VudGVyIikKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGdldENvdW50KCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJWQiLCBjb3VudGVyKyspOworICAgIH0KKworICAgIEBQYXRoKCJjb3VudGVyIikKKyAgICBAUFVUCisgICAgQENvbnN1bWVzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRDb3VudChTdHJpbmcgYykgeworICAgICAgICBjb3VudGVyID0gSW50ZWdlci5kZWNvZGUoYyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvY2RpLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2NkaS9yZXNvdXJjZXMvUHJveHlJbmplY3RlZEFwcFNjb3BlZFJlc291cmNlLmphdmEgYi9leGFtcGxlcy9jZGktd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvY2RpL3Jlc291cmNlcy9Qcm94eUluamVjdGVkQXBwU2NvcGVkUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjFlZWJlCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvY2RpLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2NkaS9yZXNvdXJjZXMvUHJveHlJbmplY3RlZEFwcFNjb3BlZFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LkFwcGxpY2F0aW9uU2NvcGVkOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CisKKy8qKgorICogQXBwbGljYXRpb24gc2NvcGVkIENESSBiZWFuIHRvIGRlbW9uc3RyYXRlIGEgZHluYW1pYyBwcm94eSBpcyBiZWluZyBpbmplY3RlZAorICogZm9yIFVSSSBpbmZvIHNvIHRoYXQgYWN0dWFsIHJlcXVlc3QgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWxjbGUuY29tKQorICovCitAQXBwbGljYXRpb25TY29wZWQKK0BQYXRoKCJ1aS1hcHAiKQorcHVibGljIGNsYXNzIFByb3h5SW5qZWN0ZWRBcHBTY29wZWRSZXNvdXJjZSB7CisKKyAgICBAQ29udGV4dCBVcmlJbmZvIHVpRmllbGQ7CisKKyAgICBAUGF0aCgie3B9IikKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBnZXRVcmkoQENvbnRleHQgVXJpSW5mbyB1aVBhcmFtKSB7CisgICAgICAgIGlmICh1aVBhcmFtID09IHVpRmllbGQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkR5bmFtaWMgcHJveHkgZXhwZWN0ZWQgaW4gdGhlIHVpRmllbGQiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdWlGaWVsZC5nZXRSZXF1ZXN0VXJpKCkuZ2V0UGF0aCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2NkaS13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9jZGkvcmVzb3VyY2VzL1JlcXVlc3RTY29wZWRSZXNvdXJjZS5qYXZhIGIvZXhhbXBsZXMvY2RpLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2NkaS9yZXNvdXJjZXMvUmVxdWVzdFNjb3BlZFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMxMjdmMwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2NkaS13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9jZGkvcmVzb3VyY2VzL1JlcXVlc3RTY29wZWRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5BcHBsaWNhdGlvblNjb3BlZDsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuUmVxdWVzdFNjb3BlZDsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworCisvKioKKyAqIFJlcXVlc3Qgc2NvcGVkIENESSBiZWFuIHRvIGRlbW9uc3RyYXRlIG5vIGR5bmFtaWMgcHJveHkgaXMgYmVpbmcgaW5qZWN0ZWQKKyAqIGZvciBKQVgtUlMgcmVxdWVzdCBzY29wZWQgVVJJIGluZm8uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhbGNsZS5jb20pCisgKi8KK0BSZXF1ZXN0U2NvcGVkCitAUGF0aCgidWktcmVxIikKK3B1YmxpYyBjbGFzcyBSZXF1ZXN0U2NvcGVkUmVzb3VyY2UgeworCisgICAgQENvbnRleHQgVXJpSW5mbyB1aUZpZWxkOworCisgICAgQFBhdGgoIntwfSIpCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXJpKEBDb250ZXh0IFVyaUluZm8gdWlQYXJhbSkgeworICAgICAgICBpZiAodWlQYXJhbSAhPSB1aUZpZWxkKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJObyBkeW5hbWljIHByb3h5IGV4cGVjdGVkIGluIHRoZSB1aUZpZWxkIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHVpRmllbGQuZ2V0UmVxdWVzdFVyaSgpLmdldFBhdGgoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9jZGktd2ViYXBwL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9iZWFucy54bWwgYi9leGFtcGxlcy9jZGktd2ViYXBwL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9iZWFucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQzNjFlOQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2NkaS13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2JlYW5zLnhtbApAQCAtMCwwICsxLDE0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzxiZWFucy8+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9jZGktd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2JlYW5zLnhtbCBiL2V4YW1wbGVzL2NkaS13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvYmVhbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMzYxZTkKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9jZGktd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2JlYW5zLnhtbApAQCAtMCwwICsxLDE0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzxiZWFucy8+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9jZGktd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi9leGFtcGxlcy9jZGktd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA5MDkyOAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2NkaS13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCit4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfM18wLnhzZCIKKyAgICAgIHZlcnNpb249IjMuMCI+CisgICAgPGVudi1lbnRyeT4KKyAgICAgICAgPGVudi1lbnRyeS1uYW1lPmluamVjdGVkUmVzb3VyY2U8L2Vudi1lbnRyeS1uYW1lPgorICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgorICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPjQyPC9lbnYtZW50cnktdmFsdWU+CisgICAgPC9lbnYtZW50cnk+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9jZGktd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvY2RpL3Jlc291cmNlcy9DZGlUZXN0LmphdmEgYi9leGFtcGxlcy9jZGktd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvY2RpL3Jlc291cmNlcy9DZGlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg1Mjk1ZQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2NkaS13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9jZGkvcmVzb3VyY2VzL0NkaVRlc3QuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5oazIuSGsySW5qZWN0aW9uTWFuYWdlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmpib3NzLndlbGQuZW52aXJvbm1lbnQuc2UuV2VsZDsKK2ltcG9ydCBvcmcuanVuaXQuQXNzdW1lOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CisKKy8qKgorICogVGVzdCBmb3IgQ0RJIHdlYiBhcHBsaWNhdGlvbiByZXNvdXJjZXMuCisgKiBSdW4gd2l0aDoKKyAqIDxwcmU+CisgKiBtdm4gY2xlYW4gcGFja2FnZQorICogJEFTX0hPTUUvYmluL2FzYWRtaW4gZGVwbG95IHRhcmdldC9jZGktd2ViYXBwCisgKiBtdm4gLURza2lwVGVzdHM9ZmFsc2UgdGVzdDwvcHJlPgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBDZGlUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBXZWxkIHdlbGQ7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXAoKSB7CisgICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKEhrMkluamVjdGlvbk1hbmFnZXJGYWN0b3J5LmlzSW1tZWRpYXRlU3RyYXRlZ3koKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgd2VsZCA9IG5ldyBXZWxkKCk7CisgICAgICAgIHdlbGQuaW5pdGlhbGl6ZSgpOworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHdlbGQuc2h1dGRvd24oKTsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IE15QXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVVJJIGdldEJhc2VVcmkoKSB7CisgICAgICAgIHJldHVybiBVcmlCdWlsZGVyLmZyb21Vcmkoc3VwZXIuZ2V0QmFzZVVyaSgpKS5wYXRoKCJjZGktd2ViYXBwIikuYnVpbGQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9jZGktd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvY2RpL3Jlc291cmNlcy9FY2hvUGFyYW1CZWFuVGVzdC5qYXZhIGIvZXhhbXBsZXMvY2RpLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2NkaS9yZXNvdXJjZXMvRWNob1BhcmFtQmVhblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTk2NzFhCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvY2RpLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2NkaS9yZXNvdXJjZXMvRWNob1BhcmFtQmVhblRlc3QuamF2YQpAQCAtMCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogVGVzdCBmb3IgdGhlIGVjaG8gd2l0aCBpbmplY3RlZCBwYXJhbSBtYW5hZ2VkIGJlYW4gcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBFY2hvUGFyYW1CZWFuVGVzdCBleHRlbmRzIENkaVRlc3QgeworCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPYmplY3RbXT4gdGVzdERhdGEoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXVtdIHsKKyAgICAgICAgICAgICAgICB7ImFscGhhIiwgImJldGEifSwKKyAgICAgICAgICAgICAgICB7IkFBQSIsICJCQkIifSwKKyAgICAgICAgICAgICAgICB7ImIiLCAiYSJ9LAorICAgICAgICAgICAgICAgIHsiMSRzIiwgIjImZCJ9CisgICAgICAgIH0pOworICAgIH0KKworICAgIGZpbmFsIFN0cmluZyBhLCBiOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IHRlc3QgY2FzZSBiYXNlZCBvbiB0aGUgYWJvdmUgZGVmaW5lZCBwYXJhbWV0ZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIGEgcXVlcnkgcGFyYW1ldGVyIHZhbHVlCisgICAgICogQHBhcmFtIGIgcGF0aCBwYXJhbWV0ZXIgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgRWNob1BhcmFtQmVhblRlc3QoU3RyaW5nIGEsIFN0cmluZyBiKSB7CisgICAgICAgIHRoaXMuYSA9IGE7CisgICAgICAgIHRoaXMuYiA9IGI7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RWNob1BhcmFtUmVzb3VyY2UoKSB7CisKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpLnBhdGgoImVjaG9maWVsZCIpLnBhdGgoYik7CisKKyAgICAgICAgU3RyaW5nIHMgPSB0YXJnZXQucXVlcnlQYXJhbSgiYSIsIGEpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRUaGF0KHMsIGNvbnRhaW5zU3RyaW5nKCJFQ0hPIikpOworICAgICAgICBhc3NlcnRUaGF0KHMsIGNvbnRhaW5zU3RyaW5nKFN0cmluZy5mb3JtYXQoIiVzICVzIiwgYSwgYikpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9jZGktd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvY2RpL3Jlc291cmNlcy9FY2hvUmVzb3VyY2VUZXN0LmphdmEgYi9leGFtcGxlcy9jZGktd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvY2RpL3Jlc291cmNlcy9FY2hvUmVzb3VyY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA2NjRhNwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2NkaS13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9jZGkvcmVzb3VyY2VzL0VjaG9SZXNvdXJjZVRlc3QuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogVGVzdCBmb3IgdGhlIGVjaG8gcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBFY2hvUmVzb3VyY2VUZXN0IGV4dGVuZHMgQ2RpVGVzdCB7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzCisgICAgcHVibGljIHN0YXRpYyBMaXN0PE9iamVjdFtdPiB0ZXN0RGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW10geworICAgICAgICAgICAgICAgIHsiYWxwaGEifSwKKyAgICAgICAgICAgICAgICB7IkFBQSJ9LAorICAgICAgICAgICAgICAgIHsiYiJ9LAorICAgICAgICAgICAgICAgIHsiMSJ9CisgICAgICAgIH0pOworICAgIH0KKworICAgIGZpbmFsIFN0cmluZyBhOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IHRlc3QgY2FzZSBiYXNlZCBvbiB0aGUgYWJvdmUgZGVmaW5lZCBwYXJhbWV0ZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIGEgcGF0aCBwYXJhbWV0ZXIgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgRWNob1Jlc291cmNlVGVzdChTdHJpbmcgYSkgeworICAgICAgICB0aGlzLmEgPSBhOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVjaG9SZXNvdXJjZSgpIHsKKworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCkucGF0aCgiZWNobyIpLnBhdGgoYSk7CisKKyAgICAgICAgU3RyaW5nIHMgPSB0YXJnZXQucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydFRoYXQocywgY29udGFpbnNTdHJpbmcoIkVDSE8iKSk7CisgICAgICAgIGFzc2VydFRoYXQocywgY29udGFpbnNTdHJpbmcoYSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVjaG9QYXJhbUN0b3JSZXNvdXJjZSgpIHsKKworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCkucGF0aCgiZWNob3BhcmFtY29uc3RydWN0b3IiKS5wYXRoKGEpOworCisgICAgICAgIFN0cmluZyBzID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRUaGF0KHMsIGNvbnRhaW5zU3RyaW5nKCJFQ0hPIikpOworICAgICAgICBhc3NlcnRUaGF0KHMsIGNvbnRhaW5zU3RyaW5nKGEpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9jZGktd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvY2RpL3Jlc291cmNlcy9IZWxsb3dvcmxkVGVzdC5qYXZhIGIvZXhhbXBsZXMvY2RpLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2NkaS9yZXNvdXJjZXMvSGVsbG93b3JsZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGI1MzIzCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvY2RpLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2NkaS9yZXNvdXJjZXMvSGVsbG93b3JsZFRlc3QuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuY29udGFpbnNTdHJpbmc7CisKKy8qKgorICogVGVzdCBmb3IgdGhlIGhlbGxvd29ybGQgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEhlbGxvd29ybGRUZXN0IGV4dGVuZHMgQ2RpVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIZWxsb3dvcmxkUmVzb3VyY2UoKSB7CisgICAgICAgIFN0cmluZyBzID0gdGFyZ2V0KCkucGF0aCgiaGVsbG93b3JsZCIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzLCBjb250YWluc1N0cmluZygiSGVsbG8gV29ybGQiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvY2RpLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2NkaS9yZXNvdXJjZXMvUGVyQXBwbGljYXRpb25CZWFuVGVzdC5qYXZhIGIvZXhhbXBsZXMvY2RpLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2NkaS9yZXNvdXJjZXMvUGVyQXBwbGljYXRpb25CZWFuVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZWM0ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9jZGktd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvY2RpL3Jlc291cmNlcy9QZXJBcHBsaWNhdGlvbkJlYW5UZXN0LmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5jb250YWluc1N0cmluZzsKKworLyoqCisgKiBUZXN0IGZvciB0aGUgYXBwbGljYXRpb24gc2NvcGVkIG1hbmFnZWQgYmVhbiByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgUGVyQXBwbGljYXRpb25CZWFuVGVzdCBleHRlbmRzIENkaVRlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwbGljYXRpb25TY29wZWRSZXNvdXJjZSgpIHsKKworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgc2luZ2xldG9uID0gdGFyZ2V0KCkucGF0aCgic2luZ2xldG9uIik7CisKKyAgICAgICAgU3RyaW5nIHMgPSBzaW5nbGV0b24ucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KHMsIGNvbnRhaW5zU3RyaW5nKHNpbmdsZXRvbi5nZXRVcmkoKS50b1N0cmluZygpKSk7CisgICAgICAgIGFzc2VydFRoYXQocywgY29udGFpbnNTdHJpbmcoIkdFVCIpKTsKKworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgY291bnRlciA9IHNpbmdsZXRvbi5wYXRoKCJjb3VudGVyIik7CisKKyAgICAgICAgLy8gVE9ETzogSkVSU0VZLTI3NDQ6CisgICAgICAgIC8vIFRPRE86IEBSZXNvdXJjZSBpbmplY3Rpb24gd2lsbCBub3Qgd29yayBvbiBTRQorICAgICAgICAvLyBUT0RPOiBhZGQgYSBjdXN0b20gZXh0ZW5zaW9uIHRvIG1ha2UgdGhpcyB3b3JrIHdpdGggR3JpenpseQorLy8gICAgICAgIFN0cmluZyBjNDIgPSBjb3VudGVyLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKy8vICAgICAgICBhc3NlcnRUaGF0KGM0MiwgY29udGFpbnNTdHJpbmcoIjQyIikpOworLy8KKy8vICAgICAgICBTdHJpbmcgYzQzID0gY291bnRlci5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisvLyAgICAgICAgYXNzZXJ0VGhhdChjNDMsIGNvbnRhaW5zU3RyaW5nKCI0MyIpKTsKKworICAgICAgICBjb3VudGVyLnJlcXVlc3QoKS5wdXQoRW50aXR5LnRleHQoIjEyIikpOworCisgICAgICAgIFN0cmluZyBjMTIgPSBjb3VudGVyLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjMTIsIGNvbnRhaW5zU3RyaW5nKCIxMiIpKTsKKworICAgICAgICBjb3VudGVyLnJlcXVlc3QoKS5wdXQoRW50aXR5LnRleHQoIjQyIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2NkaS13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9jZGkvcmVzb3VyY2VzL1BlclJlcXVlc3RCZWFuVGVzdC5qYXZhIGIvZXhhbXBsZXMvY2RpLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2NkaS9yZXNvdXJjZXMvUGVyUmVxdWVzdEJlYW5UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUzMmNjNgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2NkaS13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9jZGkvcmVzb3VyY2VzL1BlclJlcXVlc3RCZWFuVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuY29udGFpbnNTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuc3RhcnRzV2l0aDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIFRlc3QgZm9yIHRoZSByZXF1ZXN0IHNjb3BlZCBtYW5hZ2VkIGJlYW4gcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBQZXJSZXF1ZXN0QmVhblRlc3QgZXh0ZW5kcyBDZGlUZXN0IHsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8T2JqZWN0W10+IHRlc3REYXRhKCkgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W11bXSB7CisgICAgICAgICAgICAgICAgeyJnYW1tYSIsICJkZWx0YSJ9LAorICAgICAgICAgICAgICAgIHsiQ0MgQyIsICJEIEREIn0sCisgICAgICAgICAgICAgICAgeyJkIiwgImMifSwKKyAgICAgICAgICAgICAgICB7IkBeJiIsICI/IToifQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBmaW5hbCBTdHJpbmcgYywgZDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyB0ZXN0IGNhc2UgYmFzZWQgb24gdGhlIGFib3ZlIGRlZmluZWQgcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjIGZpcnN0IHBhdGggcGFyYW1ldGVyIHZhbHVlLgorICAgICAqIEBwYXJhbSBkIHNlY29uZCBwYXRoIHBhcmFtZXRlciB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUGVyUmVxdWVzdEJlYW5UZXN0KFN0cmluZyBjLCBTdHJpbmcgZCkgeworICAgICAgICB0aGlzLmMgPSBjOworICAgICAgICB0aGlzLmQgPSBkOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRoZU90aGVyUmVzb3VyY2UoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKS5wYXRoKCJvdGhlciIpLnBhdGgoYykucGF0aChkKTsKKworICAgICAgICBTdHJpbmcgcyA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRoYXQocywgY29udGFpbnNTdHJpbmcodGFyZ2V0LmdldFVyaSgpLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzLCBjb250YWluc1N0cmluZygiR0VUIikpOworICAgICAgICBhc3NlcnRUaGF0KHMsIGNvbnRhaW5zU3RyaW5nKFN0cmluZy5mb3JtYXQoImM9JXMiLCBjKSkpOworICAgICAgICBhc3NlcnRUaGF0KHMsIGNvbnRhaW5zU3RyaW5nKFN0cmluZy5mb3JtYXQoImQ9JXMiLCBkKSkpOworICAgICAgICBhc3NlcnRUaGF0KHMsIHN0YXJ0c1dpdGgoIklOVEVSQ0VQVEVEIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2NkaS13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9jZGkvcmVzb3VyY2VzL1Byb3h5U2NvcGVBbGlnbm1lbnRUZXN0LmphdmEgYi9leGFtcGxlcy9jZGktd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvY2RpL3Jlc291cmNlcy9Qcm94eVNjb3BlQWxpZ25tZW50VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NjNlM2QKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9jZGktd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvY2RpL3Jlc291cmNlcy9Qcm94eVNjb3BlQWxpZ25tZW50VGVzdC5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5jb250YWluc1N0cmluZzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIEVuc3VyZSBDREkgYW5kIEpBWC1SUyBzY29wZXMgYXJlIHdlbGwgYWxpZ25lZCwgc28gdGhhdCBkeW5hbWljIHByb3hpZXMKKyAqIGFyZSBvbmx5IGNyZWF0ZWQgd2hlbiBuZWVkZWQuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBQcm94eVNjb3BlQWxpZ25tZW50VGVzdCBleHRlbmRzIENkaVRlc3QgeworCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPYmplY3RbXT4gdGVzdERhdGEoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXVtdIHsKKyAgICAgICAgICAgICAgICB7Im9uZSJ9LAorICAgICAgICAgICAgICAgIHsidG9vIn0sCisgICAgICAgICAgICAgICAgeyJtdWNoIn0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgZmluYWwgU3RyaW5nIHA7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgdGVzdCBjYXNlIGJhc2VkIG9uIHRoZSBhYm92ZSBkZWZpbmVkIHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcCBwYXRoIHBhcmFtZXRlciB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBQcm94eVNjb3BlQWxpZ25tZW50VGVzdChTdHJpbmcgcCkgeworICAgICAgICB0aGlzLnAgPSBwOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVpSW5qZWN0aW9uKCkgeworCisgICAgICAgIGZpbmFsIFdlYlRhcmdldCBhcHAgPSB0YXJnZXQoKS5wYXRoKCJ1aS1hcHAiKS5wYXRoKHApOworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgcmVxID0gdGFyZ2V0KCkucGF0aCgidWktcmVxIikucGF0aChwKTsKKworICAgICAgICBTdHJpbmcgYXIgPSBhcHAucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBTdHJpbmcgcnIgPSByZXEucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydFRoYXQoYXIsIGNvbnRhaW5zU3RyaW5nKHApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyciwgY29udGFpbnNTdHJpbmcocCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2NsaXBib2FyZC1wcm9ncmFtbWF0aWMvUkVBRE1FLk1EIGIvZXhhbXBsZXMvY2xpcGJvYXJkLXByb2dyYW1tYXRpYy9SRUFETUUuTUQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNmMDk2ZAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2NsaXBib2FyZC1wcm9ncmFtbWF0aWMvUkVBRE1FLk1ECkBAIC0wLDAgKzEsNDUgQEAKK1svL106ICMgIiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIgorWy8vXTogIyAiICIKK1svL106ICMgIiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgIgorWy8vXTogIyAiIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0ICIKK1svL106ICMgIiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuICIKK1svL106ICMgIiAiCitbLy9dOiAjICIgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZSAiCisKK0NsaXBib2FyZCBFeGFtcGxlCis9PT09PT09PT09PT09PT09PQorCitWZXJ5IGJhc2ljIHByb2dyYW1tYXRpY2FsbHkgY3JlYXRlZCByZXNvdXJjZSBleGFtcGxlIHNob3djYXNlcyBDUlVEIGZ1bmN0aW9uYWxpdHkKK2ltcGxlbWVudGVkIHZpYSBIVFRQIFBPU1QsIEdFVCwgUFVUIGFuZCBERUxFVEUgbWV0aG9kcy4KK0Egc2ltcGxlIGNsaXBib2FyZCBpcyBzaW11bGF0ZWQgd2hpY2ggaXMgY2FwYWJsZSBvZiBoYW5kbGluZyB0ZXh0IGRhdGEgb25seS4KKworQ29udGVudHMKKy0tLS0tLS0tCisKK1RoZSBtYXBwaW5nIG9mIHRoZSBVUkkgcGF0aCBzcGFjZSBpcyBwcmVzZW50ZWQgaW4gdGhlIGZvbGxvd2luZyB0YWJsZToKKworVVJJIHBhdGggICAgICAgICAgICAgICAgICB8IFJlc291cmNlIGNsYXNzICAgfCBIVFRQIG1ldGhvZHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0KKyoqXy9jbGlwYm9hcmRfKiogICAgICAgICAgfCBwcm9ncmFtbWF0aWNhbGx5IHwgR0VUCisqKl8vY2xpcGJvYXJkXyoqICAgICAgICAgIHwgcHJvZ3JhbW1hdGljYWxseSB8IFBPU1QKKyoqXy9jbGlwYm9hcmRfKiogICAgICAgICAgfCBwcm9ncmFtbWF0aWNhbGx5IHwgUFVUCisqKl8vY2xpcGJvYXJkXyoqICAgICAgICAgIHwgcHJvZ3JhbW1hdGljYWxseSB8IERFTEVURQorCitSdW5uaW5nIHRoZSBFeGFtcGxlCistLS0tLS0tLS0tLS0tLS0tLS0tCisKK1J1biB0aGUgZXhhbXBsZSBhcyBmb2xsb3dzOgorCis+ICAgICBtdm4gY2xlYW4gY29tcGlsZSBleGVjOmphdmEKKworVGhpcyBkZXBsb3lzIHRoZSBDbGlwYm9hcmQgZXhhbXBsZSB1c2luZyBbR3JpenpseV0oaHR0cDovL2dyaXp6bHkuamF2YS5uZXQvKQorCitZb3UgY2FuIHBvc3QgYW55IHRleHQ6CisKK2BgYAorY3VybCAtdiAtWCBQT1NUIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9iYXNlL2NsaXBib2FyZCAtSCAiQ29udGVudC1UeXBlOnRleHQvcGxhaW4iIC1kICdUaGUgdXJnZW50IHRhc2snCitgYGAKKworQWZ0ZXIgeW91IHN1Y2Nlc3NmdWxseSBkZXBsb3kgdGhlIGFwcGxpY2F0aW9uIGFuZCBwb3N0IGVudGl0aWVzLCB2aXNpdCB0aGUgZm9sbG93aW5nIFVSTHM6CisKKy0gICA8aHR0cDovL2xvY2FsaG9zdDo4MDgwL2Jhc2UvY2xpcGJvYXJkPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2NsaXBib2FyZC1wcm9ncmFtbWF0aWMvcG9tLnhtbCBiL2V4YW1wbGVzL2NsaXBib2FyZC1wcm9ncmFtbWF0aWMvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTMyMWRiCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvY2xpcGJvYXJkLXByb2dyYW1tYXRpYy9wb20ueG1sCkBAIC0wLDAgKzEsNzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5jbGlwYm9hcmQtcHJvZ3JhbW1hdGljPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LWV4YW1wbGVzLWNsaXBib2FyZC1wcm9ncmFtbWF0aWM8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+SmVyc2V5IHByb2dyYW1tYXRpYyByZXNvdXJjZSBBUEkgY2xpcGJvYXJkIGV4YW1wbGUuPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItZ3JpenpseTItaHR0cDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1oazI8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItYnVuZGxlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHR5cGU+cG9tPC90eXBlPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGVjLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPG1haW5DbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5jbGlwYm9hcmQuQXBwPC9tYWluQ2xhc3M+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5yZWxlYXNlPC9pZD4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2NsaXBib2FyZC1wcm9ncmFtbWF0aWMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9jbGlwYm9hcmQvQXBwLmphdmEgYi9leGFtcGxlcy9jbGlwYm9hcmQtcHJvZ3JhbW1hdGljL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvY2xpcGJvYXJkL0FwcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NjM5N2YKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9jbGlwYm9hcmQtcHJvZ3JhbW1hdGljL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvY2xpcGJvYXJkL0FwcC5qYXZhCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmNsaXBib2FyZDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseTIuaHR0cHNlcnZlci5Hcml6emx5SHR0cFNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5JbmZsZWN0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guZ3JpenpseS5odHRwLnNlcnZlci5IdHRwU2VydmVyOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGV4YW1wbGUgZW50cnkgcG9pbnQsIHdoZXJlIEplcnNleSBhcHBsaWNhdGlvbiBmb3IgdGhlIGV4YW1wbGUKKyAqIGdldHMgcG9wdWxhdGVkIGFuZCBwdWJsaXNoZWQgdXNpbmcgdGhlIEdyaXp6bHkgMiBIVFRQIGNvbnRhaW5lci4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQXBwIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVSSSBCQVNFX1VSSSA9IFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9iYXNlLyIpOworICAgIC8qKgorICAgICAqIENsaXBib2FyZCByb290IHJlc291cmNlIHBhdGguCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVF9QQVRIID0gImNsaXBib2FyZCI7CisKKyAgICAvKioKKyAgICAgKiBNYWluIGFwcGxpY2F0aW9uIGVudHJ5IHBvaW50LgorICAgICAqCisgICAgICogQHBhcmFtIGFyZ3MgYXBwbGljYXRpb24gYXJndW1lbnRzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ2xpcGJvYXJkIEplcnNleSBFeGFtcGxlIEFwcCIpOworCisgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyBjb25maWcgPSBjcmVhdGVQcm9ncmFtbWF0aWNDbGlwYm9hcmRBcHAoKTsKKyAgICAgICAgICAgIGZpbmFsIEh0dHBTZXJ2ZXIgc2VydmVyID0gR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5LmNyZWF0ZUh0dHBTZXJ2ZXIoQkFTRV9VUkksIGNvbmZpZywgZmFsc2UpOworICAgICAgICAgICAgUnVudGltZS5nZXRSdW50aW1lKCkuYWRkU2h1dGRvd25Ib29rKG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyLnNodXRkb3duTm93KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkpOworICAgICAgICAgICAgc2VydmVyLnN0YXJ0KCk7CisKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiQXBwbGljYXRpb24gc3RhcnRlZC4lbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJUcnkgb3V0ICVzJXMlbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJTdG9wIHRoZSBhcHBsaWNhdGlvbiB1c2luZyBDVFJMK0MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBU0VfVVJJLCBST09UX1BBVEgpKTsKKyAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuam9pbigpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiB8IEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKEFwcC5jbGFzcy5nZXROYW1lKCkpLmxvZyhMZXZlbC5TRVZFUkUsIG51bGwsIGV4KTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGV4YW1wbGUgYXBwbGljYXRpb24gcmVzb3VyY2UgY29uZmlndXJhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gaW5pdGlhbGl6ZWQgcmVzb3VyY2UgY29uZmlndXJhdGlvbiBvZiB0aGUgZXhhbXBsZSBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlQ29uZmlnIGNyZWF0ZVByb2dyYW1tYXRpY0NsaXBib2FyZEFwcCgpIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2UuQnVpbGRlciByZXNvdXJjZUJ1aWxkZXIgPSBSZXNvdXJjZS5idWlsZGVyKFJPT1RfUEFUSCk7CisgICAgICAgIGZpbmFsIENsaXBib2FyZCBjbGlwYm9hcmQgPSBuZXcgQ2xpcGJvYXJkKCk7CisKKyAgICAgICAgcmVzb3VyY2VCdWlsZGVyLmFkZE1ldGhvZCgiR0VUIikuaGFuZGxlZEJ5KG5ldyBJbmZsZWN0b3I8Q29udGFpbmVyUmVxdWVzdENvbnRleHQsIFJlc3BvbnNlPigpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgUmVzcG9uc2UgYXBwbHkoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgZGF0YSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjb250ZW50ID0gY2xpcGJvYXJkLmNvbnRlbnQoKTsKKyAgICAgICAgICAgICAgICBpZiAoY29udGVudC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm5vQ29udGVudCgpLmJ1aWxkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vayhjb250ZW50KS5idWlsZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICByZXNvdXJjZUJ1aWxkZXIuYWRkTWV0aG9kKCJQVVQiKS5oYW5kbGVkQnkobmV3IEluZmxlY3RvcjxDb250YWluZXJSZXF1ZXN0Q29udGV4dCwgUmVzcG9uc2U+KCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBSZXNwb25zZSBhcHBseShDb250YWluZXJSZXF1ZXN0Q29udGV4dCBkYXRhKSB7CisgICAgICAgICAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjbGlwYm9hcmQuc2V0Q29udGVudCgoKENvbnRhaW5lclJlcXVlc3QpIGRhdGEpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5ub0NvbnRlbnQoKS5idWlsZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICByZXNvdXJjZUJ1aWxkZXIuYWRkTWV0aG9kKCJQT1NUIikuaGFuZGxlZEJ5KG5ldyBJbmZsZWN0b3I8Q29udGFpbmVyUmVxdWVzdENvbnRleHQsIFJlc3BvbnNlPigpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgUmVzcG9uc2UgYXBwbHkoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgZGF0YSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBuZXdDb250ZW50ID0gKGRhdGEgIT0gbnVsbCkKKyAgICAgICAgICAgICAgICAgICAgICAgID8gY2xpcGJvYXJkLmFwcGVuZCgoKENvbnRhaW5lclJlcXVlc3QpIGRhdGEpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSkgOiAiIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2sobmV3Q29udGVudCkuYnVpbGQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgcmVzb3VyY2VCdWlsZGVyLmFkZE1ldGhvZCgiREVMRVRFIikuaGFuZGxlZEJ5KG5ldyBJbmZsZWN0b3I8Q29udGFpbmVyUmVxdWVzdENvbnRleHQsIFJlc3BvbnNlPigpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgUmVzcG9uc2UgYXBwbHkoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgZGF0YSkgeworICAgICAgICAgICAgICAgIGNsaXBib2FyZC5jbGVhcigpOworICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5ub0NvbnRlbnQoKS5idWlsZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKCkucmVnaXN0ZXJSZXNvdXJjZXMocmVzb3VyY2VCdWlsZGVyLmJ1aWxkKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2NsaXBib2FyZC1wcm9ncmFtbWF0aWMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9jbGlwYm9hcmQvQ2xpcGJvYXJkLmphdmEgYi9leGFtcGxlcy9jbGlwYm9hcmQtcHJvZ3JhbW1hdGljL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvY2xpcGJvYXJkL0NsaXBib2FyZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ODhjNzIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9jbGlwYm9hcmQtcHJvZ3JhbW1hdGljL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvY2xpcGJvYXJkL0NsaXBib2FyZC5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuY2xpcGJvYXJkOworCisvKioKKyAqIFNpbXBsZSBjbGlwYm9hcmQgaW1wbGVtZW50YXRpb24uCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIENsaXBib2FyZCB7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdCdWZmZXIgY29udGVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKKworICAgIHB1YmxpYyBTdHJpbmcgY29udGVudCgpIHsgLy8gR0VUCisgICAgICAgIHJldHVybiBjb250ZW50LnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29udGVudChTdHJpbmcgcmVwbGFjZW1lbnQpIHsgLy8gUFVUCisgICAgICAgIGNvbnRlbnQuZGVsZXRlKDAsIGNvbnRlbnQubGVuZ3RoKCkpLmFwcGVuZChyZXBsYWNlbWVudCk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBhcHBlbmQoU3RyaW5nIGFwcGVuZCkgeyAvLyBQT1NUCisgICAgICAgIHJldHVybiBjb250ZW50LmFwcGVuZChhcHBlbmQpLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7IC8vIERFTEVURQorICAgICAgICBjb250ZW50LmRlbGV0ZSgwLCBjb250ZW50Lmxlbmd0aCgpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2NsaXBib2FyZC1wcm9ncmFtbWF0aWMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9jbGlwYm9hcmQvQ2xpcGJvYXJkVGVzdC5qYXZhIGIvZXhhbXBsZXMvY2xpcGJvYXJkLXByb2dyYW1tYXRpYy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2NsaXBib2FyZC9DbGlwYm9hcmRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcwODE1NgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2NsaXBib2FyZC1wcm9ncmFtbWF0aWMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9jbGlwYm9hcmQvQ2xpcGJvYXJkVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuY2xpcGJvYXJkOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBDbGlwYm9hcmRUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gQXBwLmNyZWF0ZVByb2dyYW1tYXRpY0NsaXBib2FyZEFwcCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsaXBib2FyZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBDbGllbnQgY2xpZW50ID0gY2xpZW50KCk7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCBjbGlwYm9hcmQgPSBjbGllbnQudGFyZ2V0KGdldEJhc2VVcmkoKSkucGF0aChBcHAuUk9PVF9QQVRIKTsKKworICAgICAgICBSZXNwb25zZSByZXNwb25zZTsKKworICAgICAgICByZXNwb25zZSA9IGNsaXBib2FyZC5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDQsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICByZXNwb25zZSA9IGNsaXBib2FyZC5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikucHV0KEVudGl0eS50ZXh0KCJIZWxsbyIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwNCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkhlbGxvIiwgY2xpcGJvYXJkLnJlcXVlc3QoInRleHQvcGxhaW4iKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSBjbGlwYm9hcmQucmVxdWVzdCgidGV4dC9wbGFpbiIpLnBvc3QoRW50aXR5LnRleHQoIiBXb3JsZCEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJIZWxsbyBXb3JsZCEiLCBjbGlwYm9hcmQucmVxdWVzdCgidGV4dC9wbGFpbiIpLmdldChTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICByZXNwb25zZSA9IGNsaXBib2FyZC5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikuZGVsZXRlKCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDQsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwNCwgY2xpcGJvYXJkLnJlcXVlc3QoInRleHQvcGxhaW4iKS5nZXQoKS5nZXRTdGF0dXMoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvY2xpcGJvYXJkL1JFQURNRS5NRCBiL2V4YW1wbGVzL2NsaXBib2FyZC9SRUFETUUuTUQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYxZGY4OQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2NsaXBib2FyZC9SRUFETUUuTUQKQEAgLTAsMCArMSw1NyBAQAorWy8vXTogIyAiIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAiCitbLy9dOiAjICIgIgorWy8vXTogIyAiIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAiCitbLy9dOiAjICIgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQgIgorWy8vXTogIyAiIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4gIgorWy8vXTogIyAiICIKK1svL106ICMgIiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlICIKKworQ2xpcGJvYXJkIEV4YW1wbGUKKz09PT09PT09PT09PT09PT09CisKK1ZlcnkgYmFzaWMgcmVzb3VyY2UgZXhhbXBsZSBzaG93Y2FzZXMgQ1JVRCBmdW5jdGlvbmFsaXR5CitpbXBsZW1lbnRlZCB2aWEgSFRUUCBQT1NULCBHRVQsIFBVVCBhbmQgREVMRVRFIG1ldGhvZHMuCitBIHNpbXBsZSBjbGlwYm9hcmQgaXMgc2ltdWxhdGVkIHdoaWNoIGlzIGNhcGFibGUgb2YgaGFuZGxpbmcgdGV4dCBkYXRhIG9ubHkuCisKK0NvbnRlbnRzCistLS0tLS0tLQorCitUaGUgbWFwcGluZyBvZiB0aGUgVVJJIHBhdGggc3BhY2UgaXMgcHJlc2VudGVkIGluIHRoZSBmb2xsb3dpbmcgdGFibGU6CisKK1VSSSBwYXRoICAgICAgICAgICAgICAgICAgfCBSZXNvdXJjZSBjbGFzcyAgICB8IEhUVFAgbWV0aG9kcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0gIHwgLS0tLS0tLS0tLS0tLS0KKyoqXy9jbGlwYm9hcmRfKiogICAgICAgICAgfCBDbGlwYm9hcmRSZXNvdXJjZSB8IEdFVAorKipfL2NsaXBib2FyZF8qKiAgICAgICAgICB8IENsaXBib2FyZFJlc291cmNlIHwgUE9TVAorKipfL2NsaXBib2FyZF8qKiAgICAgICAgICB8IENsaXBib2FyZFJlc291cmNlIHwgUFVUCisqKl8vY2xpcGJvYXJkXyoqICAgICAgICAgIHwgQ2xpcGJvYXJkUmVzb3VyY2UgfCBERUxFVEUKKyoqXy9jbGlwYm9hcmQvaGlzdG9yeV8qKiAgfCBDbGlwYm9hcmRSZXNvdXJjZSB8IEdFVAorKipfL2NsaXBib2FyZC9oaXN0b3J5XyoqICB8IENsaXBib2FyZFJlc291cmNlIHwgREVMRVRFCisKK1J1bm5pbmcgdGhlIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworUnVuIHRoZSBleGFtcGxlIGFzIGZvbGxvd3M6CisKKz4gICAgIG12biBjbGVhbiBjb21waWxlIGV4ZWM6amF2YQorCitUaGlzIGRlcGxveXMgdGhlIENsaXBib2FyZCBleGFtcGxlIHVzaW5nIFtHcml6emx5XShodHRwOi8vZ3JpenpseS5qYXZhLm5ldC8pCisKK1lvdSBjYW4gcG9zdCBhIEpTT04gZW50aXR5OgorCitgYGAKK2N1cmwgLVggUE9TVCBodHRwOi8vbG9jYWxob3N0OjgwODAvYmFzZS9jbGlwYm9hcmQgLUggIkNvbnRlbnQtVHlwZTphcHBsaWNhdGlvbi9qc29uIiAtZCAnCit7CisgICBjb250ZW50OiAiVGhlIHVyZ2VudCB0YXNrLiIKK30nCitgYGAKKworb3IgcGxhaW4gdGV4dCBlbnRpdHk6CisKK2BgYAorY3VybCAtdiAtWCBQT1NUIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9iYXNlL2NsaXBib2FyZCAtSCAiQ29udGVudC1UeXBlOnRleHQvcGxhaW4iIC1kICdUaGUgdXJnZW50IHRhc2snCitgYGAKKworQWZ0ZXIgeW91IHN1Y2Nlc3NmdWxseSBkZXBsb3kgdGhlIGFwcGxpY2F0aW9uIGFuZCBwb3N0IGVudGl0aWVzLCB2aXNpdCB0aGUgZm9sbG93aW5nIFVSTHM6CisKKy0gICA8aHR0cDovL2xvY2FsaG9zdDo4MDgwL2Jhc2UvY2xpcGJvYXJkPgorLSAgIDxodHRwOi8vbG9jYWxob3N0OjgwODAvYmFzZS9jbGlwYm9hcmQvaGlzdG9yeT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9jbGlwYm9hcmQvcG9tLnhtbCBiL2V4YW1wbGVzL2NsaXBib2FyZC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NTU5NDkKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9jbGlwYm9hcmQvcG9tLnhtbApAQCAtMCwwICsxLDcyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+Y2xpcGJvYXJkPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LWV4YW1wbGVzLWNsaXBib2FyZDwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgY2xpcGJvYXJkIGV4YW1wbGUuPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItZ3JpenpseTItaHR0cDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1oazI8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItYnVuZGxlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHR5cGU+cG9tPC90eXBlPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGVjLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPG1haW5DbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5jbGlwYm9hcmQuQXBwPC9tYWluQ2xhc3M+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5yZWxlYXNlPC9pZD4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2NsaXBib2FyZC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2NsaXBib2FyZC9BcHAuamF2YSBiL2V4YW1wbGVzL2NsaXBib2FyZC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2NsaXBib2FyZC9BcHAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWFlZDI0Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvY2xpcGJvYXJkL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvY2xpcGJvYXJkL0FwcC5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmNsaXBib2FyZDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseTIuaHR0cHNlcnZlci5Hcml6emx5SHR0cFNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5JbmZsZWN0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNZXRob2Q7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmdyaXp6bHkuaHR0cC5zZXJ2ZXIuSHR0cFNlcnZlcjsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBleGFtcGxlIGVudHJ5IHBvaW50LCB3aGVyZSBKZXJzZXkgYXBwbGljYXRpb24gZm9yIHRoZSBleGFtcGxlCisgKiBnZXRzIHBvcHVsYXRlZCBhbmQgcHVibGlzaGVkIHVzaW5nIHRoZSBHcml6emx5IDIgSFRUUCBjb250YWluZXIuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBBcHAgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIEJBU0VfVVJJID0gVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2Jhc2UvIik7CisgICAgLyoqCisgICAgICogQ2xpcGJvYXJkIHJvb3QgcmVzb3VyY2UgcGF0aC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST09UX1BBVEggPSAiY2xpcGJvYXJkIjsKKworICAgIC8qKgorICAgICAqIE1haW4gYXBwbGljYXRpb24gZW50cnkgcG9pbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXJncyBhcHBsaWNhdGlvbiBhcmd1bWVudHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDbGlwYm9hcmQgSmVyc2V5IEV4YW1wbGUgQXBwIik7CisKKyAgICAgICAgICAgIGZpbmFsIEh0dHBTZXJ2ZXIgc2VydmVyID0gR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5LmNyZWF0ZUh0dHBTZXJ2ZXIoQkFTRV9VUkksIGNyZWF0ZUFwcCgpLCBmYWxzZSk7CisgICAgICAgICAgICBSdW50aW1lLmdldFJ1bnRpbWUoKS5hZGRTaHV0ZG93bkhvb2sobmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIuc2h1dGRvd25Ob3coKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KSk7CisgICAgICAgICAgICBzZXJ2ZXIuc3RhcnQoKTsKKworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJBcHBsaWNhdGlvbiBzdGFydGVkLiVuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiVHJ5IG91dCAlcyVzJW4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJTdG9wIHRoZSBhcHBsaWNhdGlvbiB1c2luZyBDVFJMK0MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJBU0VfVVJJLCBST09UX1BBVEgpKTsKKworICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5qb2luKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIHwgSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoQXBwLmNsYXNzLmdldE5hbWUoKSkubG9nKExldmVsLlNFVkVSRSwgbnVsbCwgZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGV4YW1wbGUgYXBwbGljYXRpb24gcmVzb3VyY2UgY29uZmlndXJhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gaW5pdGlhbGl6ZWQgcmVzb3VyY2UgY29uZmlndXJhdGlvbiBvZiB0aGUgZXhhbXBsZSBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlQ29uZmlnIGNyZWF0ZUFwcCgpIHsKKworICAgICAgICBNZWRpYVR5cGVbXSBqc29uQW5kVGV4dFR5cGVzID0gbmV3IE1lZGlhVHlwZVtdIHtNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFfTsKKworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZygKKyAgICAgICAgICAgICAgICBDbGlwYm9hcmRSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBDbGlwYm9hcmREYXRhUHJvdmlkZXIuQXBwbGljYXRpb25Kc29uLmNsYXNzLAorICAgICAgICAgICAgICAgIENsaXBib2FyZERhdGFQcm92aWRlci5UZXh0UGxhaW4uY2xhc3MpOworCisgICAgICAgIGZpbmFsIFJlc291cmNlLkJ1aWxkZXIgcmVzb3VyY2VCdWlsZGVyID0gUmVzb3VyY2UuYnVpbGRlcigiZWNobyIpOworICAgICAgICBSZXNvdXJjZU1ldGhvZC5CdWlsZGVyIHJtQnVpbGRlciA9IHJlc291cmNlQnVpbGRlci5hZGRNZXRob2QoIlBPU1QiKTsKKyAgICAgICAgcm1CdWlsZGVyLmNvbnN1bWVzKGpzb25BbmRUZXh0VHlwZXMpLnByb2R1Y2VzKGpzb25BbmRUZXh0VHlwZXMpCisgICAgICAgICAgICAgICAgLmhhbmRsZWRCeShuZXcgSW5mbGVjdG9yPENvbnRhaW5lclJlcXVlc3RDb250ZXh0LCBSZXNwb25zZT4oKSB7CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBSZXNwb25zZSBhcHBseShDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDbGlwYm9hcmREYXRhIGRhdGEgPSAocmVxdWVzdCAhPSBudWxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICgoQ29udGFpbmVyUmVxdWVzdCkgcmVxdWVzdCkucmVhZEVudGl0eShDbGlwYm9hcmREYXRhLmNsYXNzKSA6IG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soZGF0YSkuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVyUmVzb3VyY2VzKHJlc291cmNlQnVpbGRlci5idWlsZCgpKTsKKyAgICAgICAgcmV0dXJuIHJlc291cmNlQ29uZmlnOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2NsaXBib2FyZC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2NsaXBib2FyZC9DbGlwYm9hcmREYXRhLmphdmEgYi9leGFtcGxlcy9jbGlwYm9hcmQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9jbGlwYm9hcmQvQ2xpcGJvYXJkRGF0YS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNWI0ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9jbGlwYm9hcmQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9jbGlwYm9hcmQvQ2xpcGJvYXJkRGF0YS5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuY2xpcGJvYXJkOworCitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CisKKy8qKgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBDbGlwYm9hcmREYXRhIHsKKworICAgIHByaXZhdGUgU3RyaW5nIGNvbnRlbnQ7CisKKyAgICBwdWJsaWMgQ2xpcGJvYXJkRGF0YShTdHJpbmcgY29udGVudCkgeworICAgICAgICB0aGlzLmNvbnRlbnQgPSBjb250ZW50OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBjb250ZW50OworICAgIH0KKworICAgIGJvb2xlYW4gaXNFbXB0eSgpIHsKKyAgICAgICAgcmV0dXJuICIiLmVxdWFscyhjb250ZW50KTsKKyAgICB9CisKKyAgICBDbGlwYm9hcmREYXRhIGFwcGVuZChDbGlwYm9hcmREYXRhIGFkZGl0aW9uKSB7CisgICAgICAgIGNvbnRlbnQgPSBjb250ZW50ICsgYWRkaXRpb24uY29udGVudDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgY29udGVudCA9ICIiOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3QgbykgeworICAgICAgICBpZiAodGhpcyA9PSBvKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgQ2xpcGJvYXJkRGF0YSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBDbGlwYm9hcmREYXRhIHRoYXQgPSAoQ2xpcGJvYXJkRGF0YSkgbzsKKyAgICAgICAgcmV0dXJuIE9iamVjdHMuZXF1YWxzKGNvbnRlbnQsIHRoYXQuY29udGVudCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIE9iamVjdHMuaGFzaChjb250ZW50KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9jbGlwYm9hcmQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9jbGlwYm9hcmQvQ2xpcGJvYXJkRGF0YVByb3ZpZGVyLmphdmEgYi9leGFtcGxlcy9jbGlwYm9hcmQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9jbGlwYm9hcmQvQ2xpcGJvYXJkRGF0YVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI0ZWIyNQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2NsaXBib2FyZC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2NsaXBib2FyZC9DbGlwYm9hcmREYXRhUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5jbGlwYm9hcmQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5QYXJhbWV0ZXJpemVkVHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5NZXNzYWdlVXRpbHM7CisKKy8qKgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBDbGlwYm9hcmREYXRhUHJvdmlkZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVdyaXRlciwgTWVzc2FnZUJvZHlSZWFkZXIgeworCisgICAgQFByb3ZpZGVyCisgICAgQENvbnN1bWVzKCJ0ZXh0L3BsYWluIikKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGV4dFBsYWluIGV4dGVuZHMgQ2xpcGJvYXJkRGF0YVByb3ZpZGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbyhmaW5hbCBPYmplY3QgdCwgZmluYWwgQ2xhc3MgdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUsIGZpbmFsIE11bHRpdmFsdWVkTWFwIGh0dHBIZWFkZXJzLCBmaW5hbCBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKQorICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgZW50aXR5U3RyZWFtLndyaXRlKHQudG9TdHJpbmcoKS5nZXRCeXRlcyhNZXNzYWdlVXRpbHMuZ2V0Q2hhcnNldChtZWRpYVR5cGUpKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE9iamVjdCByZWFkRnJvbShmaW5hbCBDbGFzcyB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwgZmluYWwgTXVsdGl2YWx1ZWRNYXAgaHR0cEhlYWRlcnMsIGZpbmFsIElucHV0U3RyZWFtIGVudGl0eVN0cmVhbSkKKyAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ2xpcGJvYXJkRGF0YShyZWFkU3RyaW5nRnJvbVN0cmVhbShlbnRpdHlTdHJlYW0sIE1lc3NhZ2VVdGlscy5nZXRDaGFyc2V0KG1lZGlhVHlwZSkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9qc29uIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFwcGxpY2F0aW9uSnNvbiBleHRlbmRzIENsaXBib2FyZERhdGFQcm92aWRlciB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpzb25PcGVubmluZyA9ICJ7XCJjb250ZW50XCI6XCIiOworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSnNvbkNsb3NpbmcgPSAiXCJ9IjsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbyhmaW5hbCBPYmplY3QgdCwgZmluYWwgQ2xhc3MgdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUsIGZpbmFsIE11bHRpdmFsdWVkTWFwIGh0dHBIZWFkZXJzLCBmaW5hbCBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKQorICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgZW50aXR5U3RyZWFtLndyaXRlKFN0cmluZy5mb3JtYXQoIiVzJXMlcyIsIEpzb25PcGVubmluZywgdC50b1N0cmluZygpLCBKc29uQ2xvc2luZykKKyAgICAgICAgICAgICAgICAgICAgLmdldEJ5dGVzKE1lc3NhZ2VVdGlscy5nZXRDaGFyc2V0KG1lZGlhVHlwZSkpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0IHJlYWRGcm9tKGZpbmFsIENsYXNzIHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLCBmaW5hbCBNdWx0aXZhbHVlZE1hcCBodHRwSGVhZGVycywgZmluYWwgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKQorICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGpzb25FeHByZXNzaW9uID0gcmVhZFN0cmluZ0Zyb21TdHJlYW0oZW50aXR5U3RyZWFtLCBNZXNzYWdlVXRpbHMuZ2V0Q2hhcnNldChtZWRpYVR5cGUpKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ2xpcGJvYXJkRGF0YShqc29uRXhwcmVzc2lvbi5yZXBsYWNlKEpzb25PcGVubmluZywgIiIpLnJlcGxhY2UoSnNvbkNsb3NpbmcsICIiKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShmaW5hbCBDbGFzcyB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICByZXR1cm4gaXNLbm93blR5cGUodHlwZSwgZ2VuZXJpY1R5cGUpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc0tub3duVHlwZShmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlKSB7CisgICAgICAgIHJldHVybiB0eXBlLmlzQXNzaWduYWJsZUZyb20oQ2xpcGJvYXJkRGF0YS5jbGFzcykKKyAgICAgICAgICAgICAgICB8fCAoQ29sbGVjdGlvbi5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpCisgICAgICAgICAgICAgICAgICAgICYmICgoKFBhcmFtZXRlcml6ZWRUeXBlKSBnZW5lcmljVHlwZSkuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpWzBdKS5lcXVhbHMoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShmaW5hbCBPYmplY3QgdCwgZmluYWwgQ2xhc3MgdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZShmaW5hbCBDbGFzcyB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiBpc0tub3duVHlwZSh0eXBlLCBnZW5lcmljVHlwZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlYWRTdHJpbmdGcm9tU3RyZWFtKGZpbmFsIElucHV0U3RyZWFtIGVudGl0eVN0cmVhbSwgQ2hhcnNldCBjaGFyc2V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGZpbmFsIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVsyMDQ4XTsKKyAgICAgICAgaW50IGk7CisgICAgICAgIHdoaWxlICgoaSA9IGVudGl0eVN0cmVhbS5yZWFkKGJ1ZikpICE9IC0xKSB7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKG5ldyBTdHJpbmcoYnVmLCAwLCBpLCBjaGFyc2V0KSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2NsaXBib2FyZC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2NsaXBib2FyZC9DbGlwYm9hcmRSZXNvdXJjZS5qYXZhIGIvZXhhbXBsZXMvY2xpcGJvYXJkL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvY2xpcGJvYXJkL0NsaXBib2FyZFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE2N2Q1YwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2NsaXBib2FyZC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2NsaXBib2FyZC9DbGlwYm9hcmRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmNsaXBib2FyZDsKKworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuREVMRVRFOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBVVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlcXVlc3Q7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlZhcmlhbnQ7CisKKy8qKgorICogVmVyeSBiYXNpYyByZXNvdXJjZSBleGFtcGxlIHNob3djYXNlcyBDUlVEIGZ1bmN0aW9uYWxpdHkKKyAqIGltcGxlbWVudGVkIHZpYSBIVFRQIFBPU1QsIEdFVCwgUFVUIGFuZCBERUxFVEUgbWV0aG9kcy4KKyAqIEEgc2ltcGxlIGNsaXBib2FyZCBpcyBzaW11bGF0ZWQgd2hpY2ggaXMgY2FwYWJsZSBvZiBoYW5kbGluZworICogdGV4dCBkYXRhIG9ubHkuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJjbGlwYm9hcmQiKQorcHVibGljIGNsYXNzIENsaXBib2FyZFJlc291cmNlIHsKKworICAgIHN0YXRpYyBmaW5hbCBMaXN0PFZhcmlhbnQ+IHN1cHBvcnRlZFZhcmlhbnRzID0KKyAgICAgICAgICAgIFZhcmlhbnQubWVkaWFUeXBlcygKKyAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkuYWRkKCkuYnVpbGQoKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3Q8U3RyaW5nPiBoaXN0b3J5ID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPigpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgQ2xpcGJvYXJkRGF0YSBjb250ZW50ID0gbmV3IENsaXBib2FyZERhdGEoIiIpOworCisgICAgQENvbnRleHQKKyAgICBSZXF1ZXN0IHJlcXVlc3Q7CisKKyAgICBAR0VUCisgICAgcHVibGljIFJlc3BvbnNlIGNvbnRlbnQoKSB7CisKKyAgICAgICAgaWYgKGNvbnRlbnQuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uubm9Db250ZW50KCkuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFZhcmlhbnQgdmFyaWFudCA9IHJlcXVlc3Quc2VsZWN0VmFyaWFudChzdXBwb3J0ZWRWYXJpYW50cyk7CisKKyAgICAgICAgaWYgKHZhcmlhbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm5vdEFjY2VwdGFibGUoc3VwcG9ydGVkVmFyaWFudHMpLmJ1aWxkKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soY29udGVudCwgdmFyaWFudC5nZXRNZWRpYVR5cGUoKSkuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQVVQKKyAgICBAQ29uc3VtZXMoeyJ0ZXh0L3BsYWluIiwgImFwcGxpY2F0aW9uL2pzb24ifSkKKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50KENsaXBib2FyZERhdGEgbmV3Q29udGVudCkgeworICAgICAgICBzYXZlSGlzdG9yeSgpOworICAgICAgICB1cGRhdGVDb250ZW50KG5ld0NvbnRlbnQpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdXBkYXRlQ29udGVudChDbGlwYm9hcmREYXRhIG5ld0NvbnRlbnQpIHsKKyAgICAgICAgY29udGVudCA9IG5ld0NvbnRlbnQ7CisgICAgfQorCisgICAgQFBPU1QKKyAgICBAQ29uc3VtZXMoeyJ0ZXh0L3BsYWluIiwgImFwcGxpY2F0aW9uL2pzb24ifSkKKyAgICBAUHJvZHVjZXMoeyJ0ZXh0L3BsYWluIiwgImFwcGxpY2F0aW9uL2pzb24ifSkKKyAgICBwdWJsaWMgQ2xpcGJvYXJkRGF0YSBhcHBlbmQoQ2xpcGJvYXJkRGF0YSBhcHBlbmRpeCkgeworICAgICAgICBzYXZlSGlzdG9yeSgpOworICAgICAgICByZXR1cm4gY29udGVudC5hcHBlbmQoYXBwZW5kaXgpOworICAgIH0KKworICAgIEBERUxFVEUKKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgc2F2ZUhpc3RvcnkoKTsKKyAgICAgICAgY29udGVudC5jbGVhcigpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiaGlzdG9yeSIpCisgICAgQFByb2R1Y2VzKHsidGV4dC9wbGFpbiIsICJhcHBsaWNhdGlvbi9qc29uIn0pCisgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRIaXN0b3J5KCkgeworICAgICAgICByZXR1cm4gaGlzdG9yeTsKKyAgICB9CisKKyAgICBAREVMRVRFCisgICAgQFBhdGgoImhpc3RvcnkiKQorICAgIHB1YmxpYyB2b2lkIGNsZWFySGlzdG9yeSgpIHsKKyAgICAgICAgaGlzdG9yeS5jbGVhcigpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzYXZlSGlzdG9yeSgpIHsKKyAgICAgICAgU3RyaW5nIGN1cnJlbnRDb250ZW50ID0gY29udGVudC50b1N0cmluZygpOworICAgICAgICBpZiAoIWN1cnJlbnRDb250ZW50LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgaGlzdG9yeS5hZGQoY3VycmVudENvbnRlbnQpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvY2xpcGJvYXJkL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvY2xpcGJvYXJkL0NsaXBib2FyZFRlc3QuamF2YSBiL2V4YW1wbGVzL2NsaXBib2FyZC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2NsaXBib2FyZC9DbGlwYm9hcmRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZkYjNiMwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2NsaXBib2FyZC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2NsaXBib2FyZC9DbGlwYm9hcmRUZXN0LmphdmEKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuY2xpcGJvYXJkOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitwdWJsaWMgY2xhc3MgQ2xpcGJvYXJkVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKyAgICAgICAgcmV0dXJuIEFwcC5jcmVhdGVBcHAoKTsKKyAgICB9CisKKyAgICBAQmVmb3JlCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKworICAgICAgICBjbGllbnQoKS50YXJnZXQoZ2V0QmFzZVVyaSgpKS5wYXRoKEFwcC5ST09UX1BBVEgpLnJlcXVlc3QoKS5kZWxldGUoKTsKKyAgICAgICAgY2xpZW50KCkudGFyZ2V0KGdldEJhc2VVcmkoKSkucGF0aChBcHAuUk9PVF9QQVRIKS5wYXRoKCJoaXN0b3J5IikucmVxdWVzdCgpLmRlbGV0ZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihDbGlwYm9hcmREYXRhUHJvdmlkZXIuQXBwbGljYXRpb25Kc29uLmNsYXNzKS5yZWdpc3RlcihDbGlwYm9hcmREYXRhUHJvdmlkZXIuVGV4dFBsYWluLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZWNsYXJhdGl2ZUNsaXBib2FyZFRleHRQbGFpbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0RGVjbGFyYXRpdmVDbGlwYm9hcmQoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjbGFyYXRpdmVDbGlwYm9hcmRBcHBKc29uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3REZWNsYXJhdGl2ZUNsaXBib2FyZChNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVjbGFyYXRpdmVDbGlwYm9hcmQoTWVkaWFUeXBlIG1lZGlhVHlwZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCBjbGlwYm9hcmQgPSBjbGllbnQoKS50YXJnZXQoZ2V0QmFzZVVyaSgpKS5wYXRoKEFwcC5ST09UX1BBVEgpOworCisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlOworCisgICAgICAgIHJlc3BvbnNlID0gY2xpcGJvYXJkLnJlcXVlc3QobWVkaWFUeXBlKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwNCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworCisgICAgICAgIHJlc3BvbnNlID0gY2xpcGJvYXJkLnJlcXVlc3QobWVkaWFUeXBlKS5wdXQoRW50aXR5LmVudGl0eShuZXcgQ2xpcGJvYXJkRGF0YSgiSGVsbG8iKSwgbWVkaWFUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDQsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIkhlbGxvIiwgY2xpcGJvYXJkLnJlcXVlc3QobWVkaWFUeXBlKS5nZXQoQ2xpcGJvYXJkRGF0YS5jbGFzcykudG9TdHJpbmcoKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSBjbGlwYm9hcmQucmVxdWVzdChtZWRpYVR5cGUpLnBvc3QoRW50aXR5LmVudGl0eShuZXcgQ2xpcGJvYXJkRGF0YSgiIFdvcmxkISIpLCBtZWRpYVR5cGUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygiSGVsbG8gV29ybGQhIiwgY2xpcGJvYXJkLnJlcXVlc3QobWVkaWFUeXBlKS5nZXQoQ2xpcGJvYXJkRGF0YS5jbGFzcykudG9TdHJpbmcoKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSBjbGlwYm9hcmQucmVxdWVzdChtZWRpYVR5cGUpLmRlbGV0ZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjA0LCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwNCwgY2xpcGJvYXJkLnJlcXVlc3QobWVkaWFUeXBlKS5nZXQoKS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvZ3JhbW1hdGljRWNob1RleHRQbGFpbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0UHJvZ3JhbW1hdGljRWNobyhNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9ncmFtbWF0aWNFY2hvQXBwSnNvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0UHJvZ3JhbW1hdGljRWNobyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIaXN0b3J5SW5Kc29uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGNhbGxHZXRIaXN0b3J5KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhpc3RvcnlJblRleHRQbGFpbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBjYWxsR2V0SGlzdG9yeShNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2FsbEdldEhpc3RvcnkoZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgY2xpcGJvYXJkID0gY2xpZW50KCkudGFyZ2V0KGdldEJhc2VVcmkoKSkucGF0aChBcHAuUk9PVF9QQVRIKTsKKyAgICAgICAgY2xpcGJvYXJkLnJlcXVlc3QobWVkaWFUeXBlKS5wb3N0KEVudGl0eS5lbnRpdHkobmV3IENsaXBib2FyZERhdGEoIlRhc2sgMSAiKSwgbWVkaWFUeXBlKSk7CisgICAgICAgIGNsaXBib2FyZC5yZXF1ZXN0KG1lZGlhVHlwZSkucG9zdChFbnRpdHkuZW50aXR5KG5ldyBDbGlwYm9hcmREYXRhKCJUYXNrIDIgIiksIG1lZGlhVHlwZSkpOworICAgICAgICBjbGlwYm9hcmQucmVxdWVzdChtZWRpYVR5cGUpLnBvc3QoRW50aXR5LmVudGl0eShuZXcgQ2xpcGJvYXJkRGF0YSgiVGFzayAzICIpLCBtZWRpYVR5cGUpKTsKKworICAgICAgICBDbGlwYm9hcmREYXRhIHJlc3BvbnNlID0gY2xpcGJvYXJkLnBhdGgoImhpc3RvcnkiKS5yZXF1ZXN0KG1lZGlhVHlwZSkuZ2V0KENsaXBib2FyZERhdGEuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IENsaXBib2FyZERhdGEoIltUYXNrIDEgLCBUYXNrIDEgVGFzayAyIF0iKSwgcmVzcG9uc2UpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9ncmFtbWF0aWNFY2hvKE1lZGlhVHlwZSBtZWRpYVR5cGUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgZWNobyA9IGNsaWVudCgpLnRhcmdldChnZXRCYXNlVXJpKCkpLnBhdGgoImVjaG8iKTsKKworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IGVjaG8ucmVxdWVzdChtZWRpYVR5cGUpLnBvc3QoRW50aXR5LmVudGl0eShuZXcgQ2xpcGJvYXJkRGF0YSgiSGVsbG8iKSwgbWVkaWFUeXBlKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiSGVsbG8iLCByZXNwb25zZS5yZWFkRW50aXR5KENsaXBib2FyZERhdGEuY2xhc3MpLnRvU3RyaW5nKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2RlY2xhcmF0aXZlLWxpbmtpbmcvUkVBRE1FLk1EIGIvZXhhbXBsZXMvZGVjbGFyYXRpdmUtbGlua2luZy9SRUFETUUuTUQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU4NGRjZgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2RlY2xhcmF0aXZlLWxpbmtpbmcvUkVBRE1FLk1ECkBAIC0wLDAgKzEsODAgQEAKK1svL106ICMgIiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIgorWy8vXTogIyAiICIKK1svL106ICMgIiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgIgorWy8vXTogIyAiIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0ICIKK1svL106ICMgIiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuICIKK1svL106ICMgIiAiCitbLy9dOiAjICIgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZSAiCisKK0RlY2xhcmF0aXZlIEh5cGVybGlua2luZyBFeGFtcGxlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byB1c2UgdGhlIGRlY2xhcmF0aXZlIGh5cGVybGluaworYW5ub3RhdGlvbnMuCisKK0NvbnRlbnRzCistLS0tLS0tLQorCitUaGUgZXhhbXBsZSBjb25zaXN0cyBvZiBvbmUgcmVzb3VyY2UgY2xhc3MgYW5kIG9uZSByZXByZXNlbnRhdGlvbiBjbGFzcworYWxvbmcgd2l0aCBhIGNvdXBsZSBvZiBtb2RlbCBjbGFzc2VzOgorCitgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMubGlua2luZy5yZXNvdXJjZXMuSXRlbVJlc291cmNlYAorCitBIHJlc291cmNlIGNsYXNzIHRoYXQgcHJvZHVjZXMgYSBYTUwgcmVzcG9uc2UgdG8gYW4gSFRUUCBHRVQuCisKK2Bjb20uc3VuLmplcnNleS5zYW1wbGVzLmxpbmtpbmcucmVwcmVzZW50YXRpb24uSXRlbVJlcHJlc2VudGF0aW9uYAorCitBIEpBWEIgcmVwcmVzZW50YXRpb24gY2xhc3MgdXNlZCB0byBwcm9kdWNlIFhNTC4gVGhpcyBjbGFzcyBhbHNvCitjb250YWlucyBATGluayBhbmQgQFJlZiBhbm5vdGF0aW9ucyB0byBwcm9kdWNlIGh5cGVybGlua3MgaW4gdGhlCitYTUwgZG9jdW1lbnQuCisKK1RoZSBtYXBwaW5nIG9mIHRoZSBVUkkgcGF0aCBzcGFjZSBpcyBwcmVzZW50ZWQgaW4gdGhlIGZvbGxvd2luZyB0YWJsZToKKworVVJJIHBhdGggICAgICAgICAgICAgICB8IFJlc291cmNlIGNsYXNzICAgfCBIVFRQIG1ldGhvZHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0KKyoqXy9pdGVtcy97aW5kZXh9XyoqICAgfCBJdGVtUmVzb3VyY2UgICAgIHwgR0VUCisKK1NhbXBsZSBSZXNwb25zZQorLS0tLS0tLS0tLS0tLS0tCisKK1lvdSBjYW4gYWNjZXNzIHJlc291cmNlcyBvZiB0aGlzIGFwcGxpY2F0aW9uIGFsc28gdXNpbmcgY3VybDoKKworPiAgICAgY3VybCAtdiBodHRwOi8vbG9jYWxob3N0OjgwODAvaXRlbXMvMQorCitJbiB0aGlzIGV4YW1wbGUgeW91IHNob3VsZCBzZWUgYW4gWE1MIHNuaXBwZXQgd2l0aCBhIG5leHQgYW5kIGEgcHJldmlvdXMKK2xpbmsuCisKK2BgYHhtbAorPGl0ZW0+CisgICAgPG5hbWU+SXRlbSAxPC9uYW1lPgorICAgIDxsaW5rIGhyZWY9Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pdGVtcy8xIiByZWw9InNlbGYiLz4KKyAgICA8bGlua3M+CisgICAgICAgIDxsaW5rIGhyZWY9Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pdGVtcy8yIiByZWw9Im5leHQiLz4KKyAgICAgICAgPGxpbmsgaHJlZj0iaHR0cDovL2xvY2FsaG9zdDo4MDgwL2l0ZW1zLzAiIHJlbD0icHJldiIvPgorICAgIDwvbGlua3M+Cis8L2l0ZW0+CitgYGAKKworUnVubmluZyB0aGUgRXhhbXBsZQorLS0tLS0tLS0tLS0tLS0tLS0tLQorCitSdW4gdGhlIGV4YW1wbGUgYXMgZm9sbG93czoKKworPiAgICAgbXZuIGNsZWFuIGNvbXBpbGUgZXhlYzpqYXZhCisKK1RoaXMgZGVwbG95cyBjdXJyZW50IGV4YW1wbGUgdXNpbmcgR3JpenpseS4gWW91IGNhbiBhY2Nlc3MgdGhlCithcHBsaWNhdGlvbiBhdDoKKworLSAgIDxodHRwOi8vbG9jYWxob3N0OjgwODAvaXRlbXMvMD5cCistICAgPGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pdGVtcy8xPlwKKy0gICA8aHR0cDovL2xvY2FsaG9zdDo4MDgwL2l0ZW1zLzI+XAorLSAgIDxodHRwOi8vbG9jYWxob3N0OjgwODAvaXRlbXMvMz5cCistICAgPGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9pdGVtcy80PlwKKworTm90aWNlIGhvdyB0aGUgZmlyc3QgaGFzIGEgc2VsZiBsaW5rLCBhIG5leHQgbGluayBidXQgbm8gcHJldmlvdXMgbGluaywKK3RoZSBzZWNvbmQsIHRoaXJkIGFuZCBmb3VydGggaGF2ZSBhbGwgdGhyZWUgYW5kIHRoZSBsYXN0IG9uZSBvbmx5IGhhcyBhCitzZWxmIGxpbmsgYW5kIHByZXYgbGluay4KKworT2JzZXJ2ZSB0aGUgSFRUUCBoZWFkZXJzIGluY2x1ZGVkIGluIHRoZSByZXNwb25zZXMgKGUuZy4gdmlhIGBjdXJsIC12YCkuCitOb3RpY2UgdGhhdCB0aGVyZSBpcyBhIEhUVFAgTGluayBoZWFkZXIgZm9yIG5leHQgYW5kIHByZXZpb3VzIHdoZW4KK2FwcHJvcHJpYXRlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2RlY2xhcmF0aXZlLWxpbmtpbmcvcG9tLnhtbCBiL2V4YW1wbGVzL2RlY2xhcmF0aXZlLWxpbmtpbmcvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjM2NjlkCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZGVjbGFyYXRpdmUtbGlua2luZy9wb20ueG1sCkBAIC0wLDAgKzEsMTAyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+ZGVjbGFyYXRpdmUtbGlua2luZzwvYXJ0aWZhY3RJZD4KKworICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LWV4YW1wbGVzLWRlY2xhcmF0aXZlLWxpbmtpbmc8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+RGVjbGFyYXRpdmUgSHlwZXJsaW5raW5nIC0gSmVyc2V5IFNhbXBsZTwvZGVzY3JpcHRpb24+CisKKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItZ3JpenpseTItaHR0cDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWhrMjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWRlY2xhcmF0aXZlLWxpbmtpbmc8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVsPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguZWwtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLndlYjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LmVsPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1tb3h5PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1veHk8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1idW5kbGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dHlwZT5wb208L3R5cGU+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhlYy1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxtYWluQ2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMubGlua2luZy5BcHA8L21haW5DbGFzcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnJlbGVhc2U8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2xpbmtpbmcvQXBwLmphdmEgYi9leGFtcGxlcy9kZWNsYXJhdGl2ZS1saW5raW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvbGlua2luZy9BcHAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmFjOTE3Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2xpbmtpbmcvQXBwLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5saW5raW5nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMubGlua2luZy5yZXNvdXJjZXMuSXRlbXNSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5Mi5odHRwc2VydmVyLkdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5saW5raW5nLkRlY2xhcmF0aXZlTGlua2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5ncml6emx5Lmh0dHAuc2VydmVyLkh0dHBTZXJ2ZXI7CisKKy8qKgorICogU2hvdyBsaW5rIGluamVjdGlvbiBpbiBhY3Rpb24KKyAqCisgKiBAYXV0aG9yIE1hcmsgSGFkbGV5CisgKiBAYXV0aG9yIEdlcmFyZCBEYXZpc29uIChnZXJhcmQuZGF2aXNvbiBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQXBwIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVSSSBCQVNFX1VSSSA9IFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8iKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST09UX1BBVEggPSAiaXRlbXMiOworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcIkRlY2xhcmF0aXZlIExpbmtpbmdcIiBKZXJzZXkgRXhhbXBsZSBBcHAiKTsKKworICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoSXRlbXNSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgICAgICByZXNvdXJjZUNvbmZpZy5yZWdpc3RlcihEZWNsYXJhdGl2ZUxpbmtpbmdGZWF0dXJlLmNsYXNzKTsKKworICAgICAgICAgICAgZmluYWwgSHR0cFNlcnZlciBzZXJ2ZXIgPSBHcml6emx5SHR0cFNlcnZlckZhY3RvcnkuY3JlYXRlSHR0cFNlcnZlcihCQVNFX1VSSSwgcmVzb3VyY2VDb25maWcsIGZhbHNlKTsKKyAgICAgICAgICAgIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmFkZFNodXRkb3duSG9vayhuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHNlcnZlci5zaHV0ZG93bk5vdygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pKTsKKyAgICAgICAgICAgIHNlcnZlci5zdGFydCgpOworCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oU3RyaW5nLmZvcm1hdCgiQXBwbGljYXRpb24gc3RhcnRlZC5cblRyeSBvdXQgY3VybCAtTCAlcyVzXG5TdG9wIHRoZSBhcHBsaWNhdGlvbiB1c2luZyBDVFJMK0MiLAorICAgICAgICAgICAgICAgICAgICBCQVNFX1VSSSwgUk9PVF9QQVRIKSk7CisgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gfCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihBcHAuY2xhc3MuZ2V0TmFtZSgpKS5sb2coTGV2ZWwuU0VWRVJFLCBudWxsLCBleCk7CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9saW5raW5nL21vZGVsL0l0ZW1Nb2RlbC5qYXZhIGIvZXhhbXBsZXMvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2xpbmtpbmcvbW9kZWwvSXRlbU1vZGVsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRjMjFjNgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9saW5raW5nL21vZGVsL0l0ZW1Nb2RlbC5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMubGlua2luZy5tb2RlbDsKKworLyoqCisgKiBAYXV0aG9yIE1hcmsgSGFkbGV5CisgKiBAYXV0aG9yIEdlcmFyZCBEYXZpc29uIChnZXJhcmQuZGF2aXNvbiBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSXRlbU1vZGVsIHsKKyAgICBTdHJpbmcgbmFtZTsKKworICAgIHB1YmxpYyBJdGVtTW9kZWwoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9saW5raW5nL21vZGVsL0l0ZW1zTW9kZWwuamF2YSBiL2V4YW1wbGVzL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9saW5raW5nL21vZGVsL0l0ZW1zTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDc5NWEzCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2xpbmtpbmcvbW9kZWwvSXRlbXNNb2RlbC5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMubGlua2luZy5tb2RlbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogTW9kZWxzIGEgdGhyZWUgZW50cnkgbGlzdCBvZiBpdGVtcyBhbmQgcHJvdmlkZXMgYSBzaW1wbGUgbWVhbnMgb2YgbmF2aWdhdGluZworICogdGhlIGxpc3QuCisgKgorICogQGF1dGhvciBNYXJrIEhhZGxleQorICogQGF1dGhvciBHZXJhcmQgRGF2aXNvbiAoZ2VyYXJkLmRhdmlzb24gYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEl0ZW1zTW9kZWwgeworCisgICAgcHJpdmF0ZSBMaXN0PEl0ZW1Nb2RlbD4gaXRlbXM7CisgICAgcHJpdmF0ZSBzdGF0aWMgSXRlbXNNb2RlbCBpbnN0YW5jZTsKKworICAgIHB1YmxpYyBzdGF0aWMgc3luY2hyb25pemVkIEl0ZW1zTW9kZWwgZ2V0SW5zdGFuY2UoKSB7CisgICAgICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKSB7CisgICAgICAgICAgICBpbnN0YW5jZSA9IG5ldyBJdGVtc01vZGVsKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGluc3RhbmNlOworICAgIH0KKworICAgIHByaXZhdGUgSXRlbXNNb2RlbCgpIHsKKyAgICAgICAgaXRlbXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgeworICAgICAgICAgICAgaXRlbXMuYWRkKG5ldyBJdGVtTW9kZWwoIkl0ZW0gIiArIGkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoU3RyaW5nIGN1cnJlbnRJZCkgeworICAgICAgICByZXR1cm4gZ2V0SW5kZXgoY3VycmVudElkKSA8IGl0ZW1zLnNpemUoKSAtIDE7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaGFzUHJldihTdHJpbmcgY3VycmVudElkKSB7CisgICAgICAgIHJldHVybiBnZXRJbmRleChjdXJyZW50SWQpID4gMDsKKyAgICB9CisKKyAgICBwdWJsaWMgSXRlbU1vZGVsIGdldEl0ZW0oU3RyaW5nIGlkKSB7CisgICAgICAgIHJldHVybiBpdGVtcy5nZXQoZ2V0SW5kZXgoaWQpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5leHRJZChTdHJpbmcgaWQpIHsKKyAgICAgICAgcmV0dXJuIEludGVnZXIudG9TdHJpbmcoZ2V0SW5kZXgoaWQpICsgMSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRQcmV2SWQoU3RyaW5nIGlkKSB7CisgICAgICAgIHJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKGdldEluZGV4KGlkKSAtIDEpOworICAgIH0KKworICAgIHByaXZhdGUgaW50IGdldEluZGV4KFN0cmluZyBpZCkgeworICAgICAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludChpZCk7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRTaXplKCkgeworICAgICAgICByZXR1cm4gaXRlbXMuc2l6ZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9saW5raW5nL3JlcHJlc2VudGF0aW9uL0l0ZW1SZXByZXNlbnRhdGlvbi5qYXZhIGIvZXhhbXBsZXMvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2xpbmtpbmcvcmVwcmVzZW50YXRpb24vSXRlbVJlcHJlc2VudGF0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMyNTI3YQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9saW5raW5nL3JlcHJlc2VudGF0aW9uL0l0ZW1SZXByZXNlbnRhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmxpbmtpbmcucmVwcmVzZW50YXRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTGluazsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50V3JhcHBlcjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHJhbnNpZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sSmF2YVR5cGVBZGFwdGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMubGlua2luZy5tb2RlbC5JdGVtc01vZGVsOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmxpbmtpbmcucmVzb3VyY2VzLkl0ZW1SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5saW5raW5nLkJpbmRpbmc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubGlua2luZy5JbmplY3RMaW5rOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxpbmtpbmcuSW5qZWN0TGluay5TdHlsZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5saW5raW5nLkluamVjdExpbmtzOworCisvKioKKyAqIEpBWEIgcmVwcmVzZW50YXRpb24gb2YgYW4gaXRlbQorICoKKyAqCisgKiBAYXV0aG9yIE1hcmsgSGFkbGV5CisgKiBAYXV0aG9yIEdlcmFyZCBEYXZpc29uIChnZXJhcmQuZGF2aXNvbiBhdCBvcmFjbGUuY29tKQorICovCitAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuTk9ORSkKK0BYbWxSb290RWxlbWVudChuYW1lID0gIml0ZW0iKQorQEluamVjdExpbmtzKHsKKyAgICAgICAgQEluamVjdExpbmsoCisgICAgICAgICAgICAgICAgcmVzb3VyY2UgPSBJdGVtUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgc3R5bGUgPSBTdHlsZS5BQlNPTFVURSwKKyAgICAgICAgICAgICAgICBjb25kaXRpb24gPSAiJHtpbnN0YW5jZS5uZXh0fSIsCisgICAgICAgICAgICAgICAgYmluZGluZ3MgPSBAQmluZGluZyhuYW1lID0gImlkIiwgdmFsdWUgPSAiJHtpbnN0YW5jZS5uZXh0SWR9IiksCisgICAgICAgICAgICAgICAgcmVsID0gIm5leHQiCisgICAgICAgICksCisgICAgICAgIEBJbmplY3RMaW5rKAorICAgICAgICAgICAgICAgIHJlc291cmNlID0gSXRlbVJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIHN0eWxlID0gU3R5bGUuQUJTT0xVVEUsCisgICAgICAgICAgICAgICAgY29uZGl0aW9uID0gIiR7aW5zdGFuY2UucHJldn0iLAorICAgICAgICAgICAgICAgIGJpbmRpbmdzID0gQEJpbmRpbmcobmFtZSA9ICJpZCIsIHZhbHVlID0gIiR7aW5zdGFuY2UucHJldklkfSIpLAorICAgICAgICAgICAgICAgIHJlbCA9ICJwcmV2IgorICAgICAgICApCit9KQorcHVibGljIGNsYXNzIEl0ZW1SZXByZXNlbnRhdGlvbiB7CisKKyAgICBAWG1sRWxlbWVudAorICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgICBAWG1sVHJhbnNpZW50CisgICAgcHJpdmF0ZSBTdHJpbmcgaWQ7CisgICAgQFhtbFRyYW5zaWVudAorICAgIHByaXZhdGUgSXRlbXNNb2RlbCBpdGVtc01vZGVsOworCisgICAgQEluamVjdExpbmsoCisgICAgICAgICAgICByZXNvdXJjZSA9IEl0ZW1SZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgIHN0eWxlID0gU3R5bGUuQUJTT0xVVEUsCisgICAgICAgICAgICBiaW5kaW5ncyA9IEBCaW5kaW5nKG5hbWUgPSAiaWQiLCB2YWx1ZSA9ICIke2luc3RhbmNlLmlkfSIpLAorICAgICAgICAgICAgcmVsID0gInNlbGYiCisgICAgKQorICAgIEBYbWxKYXZhVHlwZUFkYXB0ZXIoTGluay5KYXhiQWRhcHRlci5jbGFzcykKKyAgICBAWG1sRWxlbWVudChuYW1lID0gImxpbmsiKQorICAgIExpbmsgc2VsZjsKKworICAgIEBJbmplY3RMaW5rcyh7CisgICAgICAgICAgICBASW5qZWN0TGluaygKKyAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2UgPSBJdGVtUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgIHN0eWxlID0gU3R5bGUuQUJTT0xVVEUsCisgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbiA9ICIke2luc3RhbmNlLm5leHR9IiwKKyAgICAgICAgICAgICAgICAgICAgYmluZGluZ3MgPSBAQmluZGluZyhuYW1lID0gImlkIiwgdmFsdWUgPSAiJHtpbnN0YW5jZS5uZXh0SWR9IiksCisgICAgICAgICAgICAgICAgICAgIHJlbCA9ICJuZXh0IgorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIEBJbmplY3RMaW5rKAorICAgICAgICAgICAgICAgICAgICByZXNvdXJjZSA9IEl0ZW1SZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgc3R5bGUgPSBTdHlsZS5BQlNPTFVURSwKKyAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uID0gIiR7aW5zdGFuY2UucHJldn0iLAorICAgICAgICAgICAgICAgICAgICBiaW5kaW5ncyA9IEBCaW5kaW5nKG5hbWUgPSAiaWQiLCB2YWx1ZSA9ICIke2luc3RhbmNlLnByZXZJZH0iKSwKKyAgICAgICAgICAgICAgICAgICAgcmVsID0gInByZXYiCisgICAgICAgICAgICApfSkKKyAgICBAWG1sRWxlbWVudChuYW1lID0gImxpbmsiKQorICAgIEBYbWxFbGVtZW50V3JhcHBlcihuYW1lID0gImxpbmtzIikKKyAgICBAWG1sSmF2YVR5cGVBZGFwdGVyKExpbmsuSmF4YkFkYXB0ZXIuY2xhc3MpCisgICAgTGlzdDxMaW5rPiBsaW5rczsKKworICAgIHB1YmxpYyBJdGVtUmVwcmVzZW50YXRpb24oKSB7CisKKyAgICB9CisKKyAgICBwdWJsaWMgSXRlbVJlcHJlc2VudGF0aW9uKEl0ZW1zTW9kZWwgaXRlbXNNb2RlbCwgU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLml0ZW1zTW9kZWwgPSBpdGVtc01vZGVsOworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIGlkOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzTmV4dCgpIHsKKyAgICAgICAgcmV0dXJuIGl0ZW1zTW9kZWwuaGFzTmV4dChpZCk7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNQcmV2KCkgeworICAgICAgICByZXR1cm4gaXRlbXNNb2RlbC5oYXNQcmV2KGlkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5leHRJZCgpIHsKKyAgICAgICAgcmV0dXJuIGl0ZW1zTW9kZWwuZ2V0TmV4dElkKGlkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFByZXZJZCgpIHsKKyAgICAgICAgcmV0dXJuIGl0ZW1zTW9kZWwuZ2V0UHJldklkKGlkKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9saW5raW5nL3JlcHJlc2VudGF0aW9uL0l0ZW1zUmVwcmVzZW50YXRpb24uamF2YSBiL2V4YW1wbGVzL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9saW5raW5nL3JlcHJlc2VudGF0aW9uL0l0ZW1zUmVwcmVzZW50YXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTIwMjNjCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2xpbmtpbmcvcmVwcmVzZW50YXRpb24vSXRlbXNSZXByZXNlbnRhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmxpbmtpbmcucmVwcmVzZW50YXRpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5MaW5rOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnRXcmFwcGVyOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUcmFuc2llbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxKYXZhVHlwZUFkYXB0ZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5saW5raW5nLm1vZGVsLkl0ZW1zTW9kZWw7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMubGlua2luZy5yZXNvdXJjZXMuSXRlbXNSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5saW5raW5nLkJpbmRpbmc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubGlua2luZy5JbmplY3RMaW5rOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxpbmtpbmcuSW5qZWN0TGluay5TdHlsZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5saW5raW5nLkluamVjdExpbmtzOworCisvKioKKyAqIEpBWEIgcmVwcmVzZW50YXRpb24gb2YgYSBzdWJsaXN0IG9mIGl0ZW1zCisgKgorICogQGF1dGhvciBNYXJrIEhhZGxleQorICogQGF1dGhvciBHZXJhcmQgRGF2aXNvbiAoZ2VyYXJkLmRhdmlzb24gYXQgb3JhY2xlLmNvbSkKKyAqLworQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLk5PTkUpCitAWG1sUm9vdEVsZW1lbnQobmFtZSA9ICJpdGVtcyIpCitASW5qZWN0TGlua3MoeworICAgICAgICBASW5qZWN0TGluaygKKyAgICAgICAgICAgICAgICByZXNvdXJjZSA9IEl0ZW1zUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgc3R5bGUgPSBTdHlsZS5BQlNPTFVURSwKKyAgICAgICAgICAgICAgICBtZXRob2QgPSAicXVlcnkiLAorICAgICAgICAgICAgICAgIGNvbmRpdGlvbiA9ICIke2luc3RhbmNlLm9mZnNldCArIGluc3RhbmNlLmxpbWl0IDwgaW5zdGFuY2UubW9kZWxMaW1pdH0iLAorICAgICAgICAgICAgICAgIGJpbmRpbmdzID0geworICAgICAgICAgICAgICAgICAgICAgICAgQEJpbmRpbmcobmFtZSA9ICJvZmZzZXQiLCB2YWx1ZSA9ICIke2luc3RhbmNlLm9mZnNldCArIGluc3RhbmNlLmxpbWl0fSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgQEJpbmRpbmcobmFtZSA9ICJsaW1pdCIsIHZhbHVlID0gIiR7aW5zdGFuY2UubGltaXR9IikKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIHJlbCA9ICJuZXh0IgorICAgICAgICApLAorICAgICAgICBASW5qZWN0TGluaygKKyAgICAgICAgICAgICAgICByZXNvdXJjZSA9IEl0ZW1zUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgc3R5bGUgPSBTdHlsZS5BQlNPTFVURSwKKyAgICAgICAgICAgICAgICBtZXRob2QgPSAicXVlcnkiLAorICAgICAgICAgICAgICAgIGNvbmRpdGlvbiA9ICIke2luc3RhbmNlLm9mZnNldCAtIGluc3RhbmNlLmxpbWl0ID49IDB9IiwKKyAgICAgICAgICAgICAgICBiaW5kaW5ncyA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEBCaW5kaW5nKG5hbWUgPSAib2Zmc2V0IiwgdmFsdWUgPSAiJHtpbnN0YW5jZS5vZmZzZXQgLSBpbnN0YW5jZS5saW1pdH0iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEBCaW5kaW5nKG5hbWUgPSAibGltaXQiLCB2YWx1ZSA9ICIke2luc3RhbmNlLmxpbWl0fSIpCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICByZWwgPSAicHJldiIKKyAgICAgICAgKX0pCisKK3B1YmxpYyBjbGFzcyBJdGVtc1JlcHJlc2VudGF0aW9uIHsKKworICAgIEBYbWxFbGVtZW50KG5hbWUgPSAiaXRlbXMiKQorICAgIHByaXZhdGUgTGlzdDxJdGVtUmVwcmVzZW50YXRpb24+IGl0ZW1zOworCisgICAgQFhtbFRyYW5zaWVudAorICAgIHByaXZhdGUgaW50IG9mZnNldCwgbGltaXQ7CisKKyAgICBAWG1sVHJhbnNpZW50CisgICAgcHJpdmF0ZSBJdGVtc01vZGVsIGl0ZW1zTW9kZWw7CisKKyAgICBASW5qZWN0TGluaygKKyAgICAgICAgICAgIHJlc291cmNlID0gSXRlbXNSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgIG1ldGhvZCA9ICJxdWVyeSIsCisgICAgICAgICAgICBzdHlsZSA9IFN0eWxlLkFCU09MVVRFLAorICAgICAgICAgICAgYmluZGluZ3MgPSB7QEJpbmRpbmcobmFtZSA9ICJvZmZzZXQiLCB2YWx1ZSA9ICIke2luc3RhbmNlLm9mZnNldH0iKSwKKyAgICAgICAgICAgICAgICAgICAgQEJpbmRpbmcobmFtZSA9ICJsaW1pdCIsIHZhbHVlID0gIiR7aW5zdGFuY2UubGltaXR9IikKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICByZWwgPSAic2VsZiIKKyAgICApCisgICAgQFhtbEphdmFUeXBlQWRhcHRlcihMaW5rLkpheGJBZGFwdGVyLmNsYXNzKQorICAgIEBYbWxFbGVtZW50KG5hbWUgPSAibGluayIpCisgICAgTGluayBzZWxmOworCisgICAgQEluamVjdExpbmtzKHsKKyAgICAgICAgICAgIEBJbmplY3RMaW5rKAorICAgICAgICAgICAgICAgICAgICByZXNvdXJjZSA9IEl0ZW1zUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgIHN0eWxlID0gU3R5bGUuQUJTT0xVVEUsCisgICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9ICJxdWVyeSIsCisgICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbiA9ICIke2luc3RhbmNlLm9mZnNldCArIGluc3RhbmNlLmxpbWl0IDwgaW5zdGFuY2UubW9kZWxMaW1pdH0iLAorICAgICAgICAgICAgICAgICAgICBiaW5kaW5ncyA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBAQmluZGluZyhuYW1lID0gIm9mZnNldCIsIHZhbHVlID0gIiR7aW5zdGFuY2Uub2Zmc2V0ICsgaW5zdGFuY2UubGltaXR9IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQEJpbmRpbmcobmFtZSA9ICJsaW1pdCIsIHZhbHVlID0gIiR7aW5zdGFuY2UubGltaXR9IikKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgcmVsID0gIm5leHQiCisgICAgICAgICAgICApLAorICAgICAgICAgICAgQEluamVjdExpbmsoCisgICAgICAgICAgICAgICAgICAgIHJlc291cmNlID0gSXRlbXNSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgc3R5bGUgPSBTdHlsZS5BQlNPTFVURSwKKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gInF1ZXJ5IiwKKyAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uID0gIiR7aW5zdGFuY2Uub2Zmc2V0IC0gaW5zdGFuY2UubGltaXQgPj0gMH0iLAorICAgICAgICAgICAgICAgICAgICBiaW5kaW5ncyA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBAQmluZGluZyhuYW1lID0gIm9mZnNldCIsIHZhbHVlID0gIiR7aW5zdGFuY2Uub2Zmc2V0IC0gaW5zdGFuY2UubGltaXR9IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQEJpbmRpbmcobmFtZSA9ICJsaW1pdCIsIHZhbHVlID0gIiR7aW5zdGFuY2UubGltaXR9IikKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgcmVsID0gInByZXYiCisgICAgICAgICAgICApfSkKKyAgICBAWG1sRWxlbWVudChuYW1lID0gImxpbmsiKQorICAgIEBYbWxFbGVtZW50V3JhcHBlcihuYW1lID0gImxpbmtzIikKKyAgICBAWG1sSmF2YVR5cGVBZGFwdGVyKExpbmsuSmF4YkFkYXB0ZXIuY2xhc3MpCisgICAgTGlzdDxMaW5rPiBsaW5rczsKKworICAgIHB1YmxpYyBJdGVtc1JlcHJlc2VudGF0aW9uKCkgeworICAgICAgICBvZmZzZXQgPSAwOworICAgICAgICBsaW1pdCA9IDEwOworICAgIH0KKworICAgIHB1YmxpYyBJdGVtc1JlcHJlc2VudGF0aW9uKEl0ZW1zTW9kZWwgaXRlbXNNb2RlbCwgaW50IG9mZnNldCwgaW50IGxpbWl0KSB7CisKKyAgICAgICAgdGhpcy5vZmZzZXQgPSBvZmZzZXQ7CisgICAgICAgIHRoaXMubGltaXQgPSBsaW1pdDsKKyAgICAgICAgdGhpcy5pdGVtc01vZGVsID0gaXRlbXNNb2RlbDsKKworICAgICAgICBpdGVtcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb3IgKGludCBpID0gb2Zmc2V0OyBpIDwgKG9mZnNldCArIGxpbWl0KSAmJiBpIDwgaXRlbXNNb2RlbC5nZXRTaXplKCk7IGkrKykgeworICAgICAgICAgICAgaXRlbXMuYWRkKG5ldyBJdGVtUmVwcmVzZW50YXRpb24oCisgICAgICAgICAgICAgICAgICAgIGl0ZW1zTW9kZWwsCisgICAgICAgICAgICAgICAgICAgIEludGVnZXIudG9TdHJpbmcoaSksCisgICAgICAgICAgICAgICAgICAgIGl0ZW1zTW9kZWwuZ2V0SXRlbShJbnRlZ2VyLnRvU3RyaW5nKGkpKS5nZXROYW1lKCkpKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIGludCBnZXRPZmZzZXQoKSB7CisgICAgICAgIHJldHVybiBvZmZzZXQ7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRMaW1pdCgpIHsKKyAgICAgICAgcmV0dXJuIGxpbWl0OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0TW9kZWxMaW1pdCgpIHsKKyAgICAgICAgcmV0dXJuIGl0ZW1zTW9kZWwuZ2V0U2l6ZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9saW5raW5nL3Jlc291cmNlcy9JdGVtUmVzb3VyY2UuamF2YSBiL2V4YW1wbGVzL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9saW5raW5nL3Jlc291cmNlcy9JdGVtUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjkzMjY3Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2xpbmtpbmcvcmVzb3VyY2VzL0l0ZW1SZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMubGlua2luZy5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5saW5raW5nLm1vZGVsLkl0ZW1Nb2RlbDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5saW5raW5nLm1vZGVsLkl0ZW1zTW9kZWw7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMubGlua2luZy5yZXByZXNlbnRhdGlvbi5JdGVtUmVwcmVzZW50YXRpb247CisKKy8qKgorICogUmVzb3VyY2UgdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gb25lIGl0ZW0gZnJvbSBhIHNldCBvZiBpdGVtcyBtYW5hZ2VkCisgKiBieSBJdGVtc01vZGVsCisgKgorICogQGF1dGhvciBNYXJrIEhhZGxleQorICogQGF1dGhvciBHZXJhcmQgRGF2aXNvbiAoZ2VyYXJkLmRhdmlzb24gYXQgb3JhY2xlLmNvbSkKKyAqLworQFByb2R1Y2VzKHtNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTn0pCitwdWJsaWMgY2xhc3MgSXRlbVJlc291cmNlIHsKKworICAgIHByaXZhdGUgSXRlbXNNb2RlbCBpdGVtc01vZGVsOworICAgIHByaXZhdGUgSXRlbU1vZGVsIGl0ZW1Nb2RlbDsKKyAgICBwcml2YXRlIFN0cmluZyBpZDsKKworICAgIHB1YmxpYyBJdGVtUmVzb3VyY2UoKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk9ubHkgZm9yIEpBWC1CIGRyZXNzaW5nIik7CisgICAgfQorCisgICAgcHVibGljIEl0ZW1SZXNvdXJjZShJdGVtc01vZGVsIGl0ZW1zTW9kZWwsIFN0cmluZyBpZCkgeworICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgICAgIHRoaXMuaXRlbXNNb2RlbCA9IGl0ZW1zTW9kZWw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpdGVtTW9kZWwgPSBpdGVtc01vZGVsLmdldEl0ZW0oaWQpOworICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBHRVQKKyAgICBwdWJsaWMgSXRlbVJlcHJlc2VudGF0aW9uIGdldCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJdGVtUmVwcmVzZW50YXRpb24oaXRlbXNNb2RlbCwgaWQsIGl0ZW1Nb2RlbC5nZXROYW1lKCkpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiBpZDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9kZWNsYXJhdGl2ZS1saW5raW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvbGlua2luZy9yZXNvdXJjZXMvSXRlbXNSZXNvdXJjZS5qYXZhIGIvZXhhbXBsZXMvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2xpbmtpbmcvcmVzb3VyY2VzL0l0ZW1zUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzQyNjY1Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2xpbmtpbmcvcmVzb3VyY2VzL0l0ZW1zUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmxpbmtpbmcucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXgud3MucnMuRGVmYXVsdFZhbHVlOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMubGlua2luZy5tb2RlbC5JdGVtc01vZGVsOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmxpbmtpbmcucmVwcmVzZW50YXRpb24uSXRlbXNSZXByZXNlbnRhdGlvbjsKKworLyoqCisgKiBSZXNvdXJjZSB0aGF0IHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgZW50aXJlIGxpc3Qgb2YgaXRlbXMKKyAqCisgKiBAYXV0aG9yIE1hcmsgSGFkbGV5CisgKiBAYXV0aG9yIEdlcmFyZCBEYXZpc29uIChnZXJhcmQuZGF2aXNvbiBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiaXRlbXMiKQorQFByb2R1Y2VzKHtNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTn0pCitwdWJsaWMgY2xhc3MgSXRlbXNSZXNvdXJjZSB7CisKKyAgICBwcml2YXRlIEl0ZW1zTW9kZWwgaXRlbXNNb2RlbDsKKworICAgIHB1YmxpYyBJdGVtc1Jlc291cmNlKCkgeworICAgICAgICBpdGVtc01vZGVsID0gSXRlbXNNb2RlbC5nZXRJbnN0YW5jZSgpOworICAgIH0KKworICAgIEBHRVQKKyAgICBwdWJsaWMgSXRlbXNSZXByZXNlbnRhdGlvbiBxdWVyeSgKKyAgICAgICAgICAgIEBDb250ZXh0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbyBpbmZvLAorICAgICAgICAgICAgQFF1ZXJ5UGFyYW0oIm9mZnNldCIpIEBEZWZhdWx0VmFsdWUoIi0xIikgaW50IG9mZnNldCwgQERlZmF1bHRWYWx1ZSgiLTEiKSBAUXVlcnlQYXJhbSgibGltaXQiKSBpbnQgbGltaXQpIHsKKworICAgICAgICBpZiAob2Zmc2V0ID09IC0xIHx8IGxpbWl0ID09IC0xKSB7CisgICAgICAgICAgICBvZmZzZXQgPSBvZmZzZXQgPT0gLTEgPyAwIDogb2Zmc2V0OworICAgICAgICAgICAgbGltaXQgPSBsaW1pdCA9PSAtMSA/IDEwIDogbGltaXQ7CisKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2Uuc2VlT3RoZXIoaW5mby5nZXRSZXF1ZXN0VXJpQnVpbGRlcigpLnF1ZXJ5UGFyYW0oIm9mZnNldCIsIG9mZnNldCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgibGltaXQiLCBsaW1pdCkuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKQorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgSXRlbXNSZXByZXNlbnRhdGlvbihpdGVtc01vZGVsLCBvZmZzZXQsIGxpbWl0KTsKKyAgICB9CisKKyAgICBAUGF0aCgie2lkfSIpCisgICAgcHVibGljIEl0ZW1SZXNvdXJjZSBnZXQoQFBhdGhQYXJhbSgiaWQiKSBTdHJpbmcgaWQpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJdGVtUmVzb3VyY2UoaXRlbXNNb2RlbCwgaWQpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2xpbmtpbmcvTGlua1dlYkFwcFRlc3QuamF2YSBiL2V4YW1wbGVzL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9saW5raW5nL0xpbmtXZWJBcHBUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVmYjcyNAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9saW5raW5nL0xpbmtXZWJBcHBUZXN0LmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5saW5raW5nOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMubGlua2luZy5yZXNvdXJjZXMuSXRlbXNSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5saW5raW5nLkRlY2xhcmF0aXZlTGlua2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuY29udGFpbnNTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEBhdXRob3IgTmFyZXNoIChTcmluaXZhcy5CaGltaXNldHR5QFN1bi5Db20pCisgKiBAYXV0aG9yIEdlcmFyZCBEYXZpc29uIChnZXJhcmQuZGF2aXNvbiBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgTGlua1dlYkFwcFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJjID0gbmV3IFJlc291cmNlQ29uZmlnKEl0ZW1zUmVzb3VyY2UuY2xhc3MpOworICAgICAgICByYy5yZWdpc3RlcihEZWNsYXJhdGl2ZUxpbmtpbmdGZWF0dXJlLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCB0aGUgZXhwZWN0ZWQgcmVzcG9uc2UgaXMgc2VudCBiYWNrLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExpbmtzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiaXRlbXMiKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJvZmZzZXQiLCAxMCkKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgibGltaXQiLCAiMTAiKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUxfVFlQRSkKKyAgICAgICAgICAgICAgICAuZ2V0KFJlc3BvbnNlLmNsYXNzKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZS5TdGF0dXNUeXBlIHN0YXR1c0luZm8gPSByZXNwb25zZS5nZXRTdGF0dXNJbmZvKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiU2hvdWxkIGhhdmUgc3VjY2VlZGVkIiwgMjAwLCBzdGF0dXNJbmZvLmdldFN0YXR1c0NvZGUoKSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGNvbnRlbnQgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGZpbmFsIExpc3Q8T2JqZWN0PiBsaW5rSGVhZGVycyA9IHJlc3BvbnNlLmdldEhlYWRlcnMoKS5nZXQoIkxpbmsiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIlNob3VsZCBoYXZlIHR3byBsaW5rIGhlYWRlcnMiLCAyLCBsaW5rSGVhZGVycy5zaXplKCkpOworICAgICAgICBhc3NlcnRUaGF0KCJDb250ZW50IHNob3VsZCBjb250YWluIG5leHQgbGluayIsCisgICAgICAgICAgICAgICAgY29udGVudCwKKyAgICAgICAgICAgICAgICBjb250YWluc1N0cmluZygiaHR0cDovL2xvY2FsaG9zdDoiICsgZ2V0UG9ydCgpICsgIi9pdGVtcz9vZmZzZXQ9MjAmYW1wO2xpbWl0PTEwIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2VudGl0eS1maWx0ZXJpbmctc2VjdXJpdHkvUkVBRE1FLk1EIGIvZXhhbXBsZXMvZW50aXR5LWZpbHRlcmluZy1zZWN1cml0eS9SRUFETUUuTUQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNkYmFmYgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2VudGl0eS1maWx0ZXJpbmctc2VjdXJpdHkvUkVBRE1FLk1ECkBAIC0wLDAgKzEsODAgQEAKK1svL106ICMgIiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIgorWy8vXTogIyAiICIKK1svL106ICMgIiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgIgorWy8vXTogIyAiIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0ICIKK1svL106ICMgIiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuICIKK1svL106ICMgIiAiCitbLy9dOiAjICIgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZSAiCisKK0VudGl0eSBEYXRhIEZpbHRlcmluZworPT09PT09PT09PT09PT09PT09PT09CisKKyMjIyAqUm9sZS1iYXNlZCBFbnRpdHkgRmlsdGVyaW5nIHVzaW5nIHNlY3VyaXR5IGFubm90YXRpb25zKgorCitUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byB1c2UgZW50aXR5IGZpbHRlcmluZyBmZWF0dXJlIHRvZ2V0aGVyCit3aXRoIHNlY3VyaXR5IGFubm90YXRpb25zIChmcm9tIGBqYXZheC5hbm5vdGF0aW9uLnNlY3VyaXR5YCBwYWNrYWdlKSBhbmQKK2hvdyB0byBhcHBseSB0aGVtIG9uIGRvbWFpbiBjbGFzc2VzIGFzIHdlbGwgYXMgb24gSkFYLVJTIHJlc291cmNlCitjbGFzc2VzIG9yIEpBWC1SUyByZXNvdXJjZSBtZXRob2RzLgorCitJbiBhZGRpdGlvbiB0byBkb21haW4gY2xhc3NlcyBhbmQgSkFYLVJTIHJlc291cmNlcyAod2l0aCBzZWN1cml0eQorYW5ub3RhdGlvbnMgYXBwbGllZCkgdGhlcmUgaXMgYWxzbyBvbmUgKHByZS1tYXRjaGluZykgY29udGFpbmVyIHJlcXVlc3QKK2ZpbHRlciwgYFNlY3VyaXR5UmVxdWVzdEZpbHRlcmAuIFRoZSBmaWx0ZXIgc2V0cyBzZWN1cml0eSBjb250ZXh0IGZvcgorZWFjaCBpbmNvbWluZyByZXF1ZXN0IGFzIGlmIHRoZSByZXF1ZXN0IHdhcyBpbnZva2VkIGJ5IGEgdXNlciBpbiByb2xlCisibWFuYWdlciIuCisKK1RoZSBmdWxsIGRlc2NyaXB0aW9uIGhvdyBFbnRpdHkgRGF0YSBGaWx0ZXJpbmcgY2FuIGJlIGZvdW5kIGluIEplcnNleQorVXNlciBHdWlkZSwgY2hhcHRlciBbRW50aXR5IERhdGEKK0ZpbHRlcmluZ10oaHR0cHM6Ly9qZXJzZXkuamF2YS5uZXQvZG9jdW1lbnRhdGlvbi9sYXRlc3QvZW50aXR5LWZpbHRlcmluZy5odG1sKS4KK1NlY3Rpb25zIHJlbGV2YW50IHRvIHRoaXMgZXhhbXBsZSAoZGVzY3JpYmluZyB0aGlzIGV4YWN0IGV4YW1wbGUpIGFyZToKKworLSAgIFtFbmFibGluZyBhbmQgY29uZmlndXJpbmcgRW50aXR5IEZpbHRlcmluZyBpbiB5b3VyCisgICAgYXBwbGljYXRpb25dKGh0dHBzOi8vamVyc2V5LmphdmEubmV0L2RvY3VtZW50YXRpb24vbGF0ZXN0L2VudGl0eS1maWx0ZXJpbmcuaHRtbCNkMGUxMzkxMSkKKy0gICBbUm9sZS1iYXNlZCBFbnRpdHkgRmlsdGVyaW5nIHVzaW5nIChqYXZheC5hbm5vdGF0aW9uLnNlY3VyaXR5KQorICAgIGFubm90YXRpb25zXShodHRwczovL2plcnNleS5qYXZhLm5ldC9kb2N1bWVudGF0aW9uL2xhdGVzdC9lbnRpdHktZmlsdGVyaW5nLmh0bWwjZWYuc2VjdXJpdHkuYW5ub3RhdGlvbnMpCisKK0NvbnRlbnRzCistLS0tLS0tLQorCitUaGUgbWFwcGluZyBvZiB0aGUgVVJJIHBhdGggc3BhY2UgaXMgcHJlc2VudGVkIGluIHRoZSBmb2xsb3dpbmcgdGFibGU6CisKKworVVJJIHBhdGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBSZXNvdXJjZSBjbGFzcyAgICAgICAgIHwgSFRUUCBtZXRob2RzICAgfCBOb3RlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKl8vcmVzdHJpY3RlZC1yZXNvdXJjZS9kZW55QWxsXyoqICAgICAgICB8IFJlc3RyaWN0ZWRSZXNvdXJjZSAgICAgfCBHRVQgICAgICAgICAgICB8IGBARGVueUFsbGAgLSByZXR1cm5zIEhUVFAgNDAzLCBGb3JiaWRkZW4gcmVzcG9uc2UKKyoqXy9yZXN0cmljdGVkLXJlc291cmNlL3Blcm1pdEFsbF8qKiAgICAgIHwgUmVzdHJpY3RlZFJlc291cmNlICAgICB8IEdFVCAgICAgICAgICAgIHwgYEBQZXJtaXRBbGxgIC0gUm9sZS1iYXNlZCB2aWV3IG9uIFJlc3RyaWN0ZWRFbnRpdHkgY2xhc3MgLSBwZXJtaXRBbGwsIHNpbXBsZUZpZWxkCisqKl8vcmVzdHJpY3RlZC1yZXNvdXJjZS9yb2xlc0FsbG93ZWRfKiogICB8IFJlc3RyaWN0ZWRSZXNvdXJjZSAgICAgfCBHRVQgICAgICAgICAgICB8IGBAUm9sZXNBbGxvd2VkKHsibWFuYWdlciJ9KWAgLSBSb2xlLWJhc2VkIHZpZXcgb24gUmVzdHJpY3RlZEVudGl0eSBjbGFzcyAtIHBlcm1pdEFsbCwgc2ltcGxlRmllbGQsIG1peGVkRmllbGQubWFuYWdlckZpZWxkCisqKl8vdW5yZXN0cmljdGVkLXJlc291cmNlXyoqICAgICAgICAgICAgICB8IFVucmVzdHJpY3RlZFJlc291cmNlICAgfCBHRVQgICAgICAgICAgICB8IE5vIHNlY3VyaXR5IGFubm90YXRpb24gdXNlZCwgdXNlciBpbiByb2xlICJtYW5hZ2VyIiAtIFJvbGUtYmFzZWQgdmlldyBvbiBSZXN0cmljdGVkRW50aXR5IGNsYXNzIC0gcGVybWl0QWxsLCBzaW1wbGVGaWVsZCwgbWl4ZWRGaWVsZC5tYW5hZ2VyRmllbGQKKworQXBwbGljYXRpb24gaXMgYmFzZWQgb24gR3JpenpseSBjb250YWluZXIgKHNlZSBgQXBwYCkuIEV2ZXJ5dGhpbmcgbmVlZGVkCisocmVzb3VyY2VzL3Byb3ZpZGVycykgaXMgcmVnaXN0ZXJlZCBpbgorYFNlY3VyaXR5RW50aXR5RmlsdGVyaW5nQXBwbGljYXRpb25gLgorCitSdW5uaW5nIHRoZSBFeGFtcGxlCistLS0tLS0tLS0tLS0tLS0tLS0tCisKK1J1biB0aGUgZXhhbXBsZSBhcyBmb2xsb3dzOgorCis+ICAgICBtdm4gY2xlYW4gcGFja2FnZSBleGVjOmphdmEKKworVGhpcyBkZXBsb3lzIGN1cnJlbnQgZXhhbXBsZSB1c2luZyBHcml6emx5LiBZb3UgY2FuIGFjY2VzcyB0aGUKK2FwcGxpY2F0aW9uIGF0OgorCistICAgPGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC91bnJlc3RyaWN0ZWQtcmVzb3VyY2U+CistICAgPGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZXN0cmljdGVkLXJlc291cmNlL2RlbnlBbGw+CistICAgPGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yZXN0cmljdGVkLXJlc291cmNlL3Blcm1pdEFsbD4KKy0gICA8aHR0cDovL2xvY2FsaG9zdDo4MDgwL3Jlc3RyaWN0ZWQtcmVzb3VyY2Uvcm9sZXNBbGxvd2VkPgorLSAgIDxodHRwOi8vbG9jYWxob3N0OjgwODAvcmVzdHJpY3RlZC1yZXNvdXJjZS9ydW50aW1lUm9sZXNBbGxvd2VkP3JvbGVzPW1hbmFnZXIsdXNlcj4KKworVXNpbmcgSmFja3NvbiBpbnN0ZWFkIG9mIE1PWHkKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgZXhhbXBsZXMgdXNlcyBieSBkZWZhdWx0IEVudGl0eSBEYXRhIEZpbHRlcmluZyBmZWF0dXJlIHRvZ2V0aGVyCit3aXRoIE1PWHkuIFRvIHN3aXRjaCBNT1h5IEpTT04gcHJvdmlkZXIgdG8gSmFja3NvbiAoMi54KSBKU09OIHByb3ZpZGVyCitzaW1wbHkKKworLSAgIGNvbW1lbnQgcmVnaXN0cmF0aW9uIG9mIE1PWHkgQ29udGV4dFJlc29sdmVyLCBhbmRcCisgICAgIGByZWdpc3RlcihuZXcgTW94eUpzb25Db25maWcoKS5zZXRGb3JtYXR0ZWRPdXRwdXQodHJ1ZSkucmVzb2x2ZXIoKSlgCistICAgdW5jb21tZW50IHJlZ2lzdHJhdGlvbiBvZiBKYWNrc29uRmVhdHVyZVwKKyAgICAgYHJlZ2lzdGVyKEphY2tzb25GZWF0dXJlLmNsYXNzKWAKKworaW4gYFNlY3VyaXR5RW50aXR5RmlsdGVyaW5nQXBwbGljYXRpb25gIGNsYXNzLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZW50aXR5LWZpbHRlcmluZy1zZWN1cml0eS9wb20ueG1sIGIvZXhhbXBsZXMvZW50aXR5LWZpbHRlcmluZy1zZWN1cml0eS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlY2ExNWMKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9lbnRpdHktZmlsdGVyaW5nLXNlY3VyaXR5L3BvbS54bWwKQEAgLTAsMCArMSw5MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKworICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+ZW50aXR5LWZpbHRlcmluZy1zZWN1cml0eTwvYXJ0aWZhY3RJZD4KKyAgICA8bmFtZT5qZXJzZXktZXhhbXBsZXMtZW50aXR5LWZpbHRlcmluZy1zZWN1cml0eTwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgRW50aXR5IERhdGEgRmlsdGVyaW5nIFNlY3VyaXR5IEV4YW1wbGUuPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1zZXJ2ZXI8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1ncml6emx5Mi1odHRwPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWVudGl0eS1maWx0ZXJpbmc8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktaGsyPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtbW94eTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLWpzb24tamFja3NvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDwhLS0gUnVuIHRoZSBhcHBsaWNhdGlvbiB1c2luZyAibXZuIGV4ZWM6amF2YSIgLS0+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmV4ZWMtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8bWFpbkNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmVudGl0eWZpbHRlcmluZy5zZWN1cml0eS5BcHA8L21haW5DbGFzcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnJlbGVhc2U8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZW50aXR5LWZpbHRlcmluZy1zZWN1cml0eS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2VudGl0eWZpbHRlcmluZy9zZWN1cml0eS9BcHAuamF2YSBiL2V4YW1wbGVzL2VudGl0eS1maWx0ZXJpbmctc2VjdXJpdHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9lbnRpdHlmaWx0ZXJpbmcvc2VjdXJpdHkvQXBwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThjNGNkZgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2VudGl0eS1maWx0ZXJpbmctc2VjdXJpdHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9lbnRpdHlmaWx0ZXJpbmcvc2VjdXJpdHkvQXBwLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5lbnRpdHlmaWx0ZXJpbmcuc2VjdXJpdHk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5Mi5odHRwc2VydmVyLkdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guZ3JpenpseS5odHRwLnNlcnZlci5IdHRwU2VydmVyOworCisvKioKKyAqIEphdmEgYXBwbGljYXRpb24gY2xhc3Mgc3RhcnRpbmcgR3JpenpseTIgc2VydmVyIHdpdGggRW50aXR5IERhdGEgRmlsdGVyaW5nIHdpdGggc2VjdXJpdHkgYW5ub3RhdGlvbnMuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBBcHAgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIEJBU0VfVVJJID0gVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwLyIpOworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJKZXJzZXkgRW50aXR5IERhdGEgRmlsdGVyaW5nIEV4YW1wbGUuIik7CisKKyAgICAgICAgICAgIGZpbmFsIEh0dHBTZXJ2ZXIgc2VydmVyID0gR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5LmNyZWF0ZUh0dHBTZXJ2ZXIoQkFTRV9VUkksCisgICAgICAgICAgICAgICAgICAgIG5ldyBTZWN1cml0eUVudGl0eUZpbHRlcmluZ0FwcGxpY2F0aW9uKCksIGZhbHNlKTsKKyAgICAgICAgICAgIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmFkZFNodXRkb3duSG9vayhuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHNlcnZlci5zaHV0ZG93bk5vdygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pKTsKKyAgICAgICAgICAgIHNlcnZlci5zdGFydCgpOworCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFwcGxpY2F0aW9uIHN0YXJ0ZWQuXG5Ucnkgb3V0IG9uZSBvZiB0aGVzZSBVUklzOiIpOworICAgICAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgcGF0aCA6IG5ldyBTdHJpbmdbXSB7InVucmVzdHJpY3RlZC1yZXNvdXJjZSIsICJyZXN0cmljdGVkLXJlc291cmNlL2RlbnlBbGwiLAorICAgICAgICAgICAgICAgICAgICAicmVzdHJpY3RlZC1yZXNvdXJjZS9wZXJtaXRBbGwiLCAicmVzdHJpY3RlZC1yZXNvdXJjZS9yb2xlc0FsbG93ZWQiLAorICAgICAgICAgICAgICAgICAgICAicmVzdHJpY3RlZC1yZXNvdXJjZS9ydW50aW1lUm9sZXNBbGxvd2VkP3JvbGVzPW1hbmFnZXIsdXNlciJ9KSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKEJBU0VfVVJJICsgcGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0b3AgdGhlIGFwcGxpY2F0aW9uIHVzaW5nIENUUkwrQyIpOworCisgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gfCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihBcHAuY2xhc3MuZ2V0TmFtZSgpKQorICAgICAgICAgICAgICAgICAgICAubG9nKExldmVsLlNFVkVSRSwgIkkvTyBlcnJvciBvY2N1cnJlZCBkdXJpbmcgcmVhZGluZyBmcm9tIGFuIHN5c3RlbSBpbnB1dCBzdHJlYW0uIiwgZXgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZW50aXR5LWZpbHRlcmluZy1zZWN1cml0eS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2VudGl0eWZpbHRlcmluZy9zZWN1cml0eS9TZWN1cml0eUVudGl0eUZpbHRlcmluZ0FwcGxpY2F0aW9uLmphdmEgYi9leGFtcGxlcy9lbnRpdHktZmlsdGVyaW5nLXNlY3VyaXR5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZW50aXR5ZmlsdGVyaW5nL3NlY3VyaXR5L1NlY3VyaXR5RW50aXR5RmlsdGVyaW5nQXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmM3NDFiCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZW50aXR5LWZpbHRlcmluZy1zZWN1cml0eS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2VudGl0eWZpbHRlcmluZy9zZWN1cml0eS9TZWN1cml0eUVudGl0eUZpbHRlcmluZ0FwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5lbnRpdHlmaWx0ZXJpbmcuc2VjdXJpdHk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGg7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uLkphY2tzb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLlNlY3VyaXR5RW50aXR5RmlsdGVyaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb3h5Lmpzb24uTW94eUpzb25Db25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCisvKioKKyAqIEVudGl0eSBEYXRhIEZpbHRlcmluZyBhcHBsaWNhdGlvbiB1c2luZyBzZWN1cml0eSBhbm5vdGF0aW9ucy4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQEFwcGxpY2F0aW9uUGF0aCgiLyIpCitwdWJsaWMgY2xhc3MgU2VjdXJpdHlFbnRpdHlGaWx0ZXJpbmdBcHBsaWNhdGlvbiBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKworICAgIHB1YmxpYyBTZWN1cml0eUVudGl0eUZpbHRlcmluZ0FwcGxpY2F0aW9uKCkgeworICAgICAgICAvLyBSZWdpc3RlciBhbGwgcmVzb3VyY2VzIHByZXNlbnQgdW5kZXIgdGhlIHBhY2thZ2UuCisgICAgICAgIHBhY2thZ2VzKCJvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5lbnRpdHlmaWx0ZXJpbmcuc2VjdXJpdHkiKTsKKworICAgICAgICAvLyBSZWdpc3RlciBlbnRpdHktZmlsdGVyaW5nIHNlY3VyaXR5IGZlYXR1cmUuCisgICAgICAgIHJlZ2lzdGVyKFNlY3VyaXR5RW50aXR5RmlsdGVyaW5nRmVhdHVyZS5jbGFzcyk7CisKKyAgICAgICAgLy8gQ29uZmlndXJlIE1PWHkgSnNvbiBwcm92aWRlci4gQ29tbWVudCB0aGlzIGxpbmUgdG8gdXNlIEphY2tzb24uIFVuY29tbWVudCB0byB1c2UgTU9YeS4KKyAgICAgICAgcmVnaXN0ZXIobmV3IE1veHlKc29uQ29uZmlnKCkuc2V0Rm9ybWF0dGVkT3V0cHV0KHRydWUpLnJlc29sdmVyKCkpOworCisgICAgICAgIC8vIENvbmZpZ3VyZSBKYWNrc29uIEpzb24gcHJvdmlkZXIuIENvbW1lbnQgdGhpcyBsaW5lIHRvIHVzZSBNT1h5LiBVbmNvbW1lbnQgdG8gdXNlIEphY2tzb24uCisgICAgICAgIC8vIHJlZ2lzdGVyKEphY2tzb25GZWF0dXJlLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9lbnRpdHktZmlsdGVyaW5nLXNlY3VyaXR5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZW50aXR5ZmlsdGVyaW5nL3NlY3VyaXR5L2RvbWFpbi9SZXN0cmljdGVkRW50aXR5LmphdmEgYi9leGFtcGxlcy9lbnRpdHktZmlsdGVyaW5nLXNlY3VyaXR5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZW50aXR5ZmlsdGVyaW5nL3NlY3VyaXR5L2RvbWFpbi9SZXN0cmljdGVkRW50aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI0YWIyMgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2VudGl0eS1maWx0ZXJpbmctc2VjdXJpdHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9lbnRpdHlmaWx0ZXJpbmcvc2VjdXJpdHkvZG9tYWluL1Jlc3RyaWN0ZWRFbnRpdHkuamF2YQpAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmVudGl0eWZpbHRlcmluZy5zZWN1cml0eS5kb21haW47CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLnNlY3VyaXR5LkRlbnlBbGw7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5zZWN1cml0eS5QZXJtaXRBbGw7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5zZWN1cml0eS5Sb2xlc0FsbG93ZWQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworLyoqCisgKiBSZXN0cmljdGVkIGVudGl0eSB0byBkZW1vbnN0cmF0ZSB2YXJpb3VzIHNlY3VyaXR5IGFubm90YXRpb25zLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAWG1sUm9vdEVsZW1lbnQKK3B1YmxpYyBjbGFzcyBSZXN0cmljdGVkRW50aXR5IHsKKworICAgIHByaXZhdGUgU3RyaW5nIHNpbXBsZUZpZWxkOworCisgICAgcHJpdmF0ZSBTdHJpbmcgZGVueUFsbDsKKworICAgIHByaXZhdGUgU3RyaW5nIHBlcm1pdEFsbDsKKworICAgIHByaXZhdGUgUmVzdHJpY3RlZFN1YkVudGl0eSBtaXhlZEZpZWxkOworCisgICAgcHVibGljIFN0cmluZyBnZXRTaW1wbGVGaWVsZCgpIHsKKyAgICAgICAgcmV0dXJuIHNpbXBsZUZpZWxkOworICAgIH0KKworICAgIEBEZW55QWxsCisgICAgcHVibGljIFN0cmluZyBnZXREZW55QWxsKCkgeworICAgICAgICByZXR1cm4gZGVueUFsbDsKKyAgICB9CisKKyAgICBAUGVybWl0QWxsCisgICAgcHVibGljIFN0cmluZyBnZXRQZXJtaXRBbGwoKSB7CisgICAgICAgIHJldHVybiBwZXJtaXRBbGw7CisgICAgfQorCisgICAgQFJvbGVzQWxsb3dlZCh7Im1hbmFnZXIiLCAidXNlciJ9KQorICAgIHB1YmxpYyBSZXN0cmljdGVkU3ViRW50aXR5IGdldE1peGVkRmllbGQoKSB7CisgICAgICAgIHJldHVybiBtaXhlZEZpZWxkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNpbXBsZUZpZWxkKGZpbmFsIFN0cmluZyBzaW1wbGVGaWVsZCkgeworICAgICAgICB0aGlzLnNpbXBsZUZpZWxkID0gc2ltcGxlRmllbGQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGVueUFsbChmaW5hbCBTdHJpbmcgZGVueUFsbCkgeworICAgICAgICB0aGlzLmRlbnlBbGwgPSBkZW55QWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFBlcm1pdEFsbChmaW5hbCBTdHJpbmcgcGVybWl0QWxsKSB7CisgICAgICAgIHRoaXMucGVybWl0QWxsID0gcGVybWl0QWxsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE1peGVkRmllbGQoZmluYWwgUmVzdHJpY3RlZFN1YkVudGl0eSBtaXhlZEZpZWxkKSB7CisgICAgICAgIHRoaXMubWl4ZWRGaWVsZCA9IG1peGVkRmllbGQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGFuIGluc3RhbmNlIG9mIFJlc3RyaWN0ZWRFbnRpdHkuIFRoaXMgbWV0aG9kIGNyZWF0ZXMgYWx3YXlzIGEgbmV3IGluc3RhbmNlIG9mIFJlc3RyaWN0ZWRFbnRpdHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIFJlc3RyaWN0ZWRFbnRpdHkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBSZXN0cmljdGVkRW50aXR5IGluc3RhbmNlKCkgeworICAgICAgICBmaW5hbCBSZXN0cmljdGVkRW50aXR5IGVudGl0eSA9IG5ldyBSZXN0cmljdGVkRW50aXR5KCk7CisKKyAgICAgICAgZW50aXR5LnNldFNpbXBsZUZpZWxkKCJTaW1wbGUgRmllbGQuIik7CisgICAgICAgIGVudGl0eS5zZXREZW55QWxsKCJEZW55IEFsbC4iKTsKKyAgICAgICAgZW50aXR5LnNldFBlcm1pdEFsbCgiUGVybWl0IEFsbC4iKTsKKworICAgICAgICBmaW5hbCBSZXN0cmljdGVkU3ViRW50aXR5IG1peGVkRmllbGQgPSBuZXcgUmVzdHJpY3RlZFN1YkVudGl0eSgpOworICAgICAgICBtaXhlZEZpZWxkLnNldE1hbmFnZXJGaWVsZCgiTWFuYWdlcidzIEZpZWxkLiIpOworICAgICAgICBtaXhlZEZpZWxkLnNldFVzZXJGaWVsZCgiVXNlcidzIEZpZWxkLiIpOworCisgICAgICAgIGVudGl0eS5zZXRNaXhlZEZpZWxkKG1peGVkRmllbGQpOworCisgICAgICAgIHJldHVybiBlbnRpdHk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZW50aXR5LWZpbHRlcmluZy1zZWN1cml0eS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2VudGl0eWZpbHRlcmluZy9zZWN1cml0eS9kb21haW4vUmVzdHJpY3RlZFN1YkVudGl0eS5qYXZhIGIvZXhhbXBsZXMvZW50aXR5LWZpbHRlcmluZy1zZWN1cml0eS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2VudGl0eWZpbHRlcmluZy9zZWN1cml0eS9kb21haW4vUmVzdHJpY3RlZFN1YkVudGl0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhYmM4NDUKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9lbnRpdHktZmlsdGVyaW5nLXNlY3VyaXR5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZW50aXR5ZmlsdGVyaW5nL3NlY3VyaXR5L2RvbWFpbi9SZXN0cmljdGVkU3ViRW50aXR5LmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5lbnRpdHlmaWx0ZXJpbmcuc2VjdXJpdHkuZG9tYWluOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5zZWN1cml0eS5Sb2xlc0FsbG93ZWQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworLyoqCisgKiBSZXN0cmljdGVkIHN1Yi1lbnRpdHkgdG8gZGVtb25zdHJhdGUgdGhhdCBzZWN1cml0eSBlbnRpdHktZmlsdGVyaW5nIGlzIHRyYW5zaXRpdmUuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BYbWxSb290RWxlbWVudAorcHVibGljIGNsYXNzIFJlc3RyaWN0ZWRTdWJFbnRpdHkgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgbWFuYWdlckZpZWxkOworCisgICAgcHJpdmF0ZSBTdHJpbmcgdXNlckZpZWxkOworCisgICAgQFJvbGVzQWxsb3dlZCgibWFuYWdlciIpCisgICAgcHVibGljIFN0cmluZyBnZXRNYW5hZ2VyRmllbGQoKSB7CisgICAgICAgIHJldHVybiBtYW5hZ2VyRmllbGQ7CisgICAgfQorCisgICAgQFJvbGVzQWxsb3dlZCgidXNlciIpCisgICAgcHVibGljIFN0cmluZyBnZXRVc2VyRmllbGQoKSB7CisgICAgICAgIHJldHVybiB1c2VyRmllbGQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWFuYWdlckZpZWxkKGZpbmFsIFN0cmluZyBtYW5hZ2VyRmllbGQpIHsKKyAgICAgICAgdGhpcy5tYW5hZ2VyRmllbGQgPSBtYW5hZ2VyRmllbGQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXNlckZpZWxkKGZpbmFsIFN0cmluZyB1c2VyRmllbGQpIHsKKyAgICAgICAgdGhpcy51c2VyRmllbGQgPSB1c2VyRmllbGQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZW50aXR5LWZpbHRlcmluZy1zZWN1cml0eS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2VudGl0eWZpbHRlcmluZy9zZWN1cml0eS9wcm92aWRlci9TZWN1cml0eVJlcXVlc3RGaWx0ZXIuamF2YSBiL2V4YW1wbGVzL2VudGl0eS1maWx0ZXJpbmctc2VjdXJpdHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9lbnRpdHlmaWx0ZXJpbmcvc2VjdXJpdHkvcHJvdmlkZXIvU2VjdXJpdHlSZXF1ZXN0RmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJmNWEyOQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2VudGl0eS1maWx0ZXJpbmctc2VjdXJpdHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9lbnRpdHlmaWx0ZXJpbmcvc2VjdXJpdHkvcHJvdmlkZXIvU2VjdXJpdHlSZXF1ZXN0RmlsdGVyLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5lbnRpdHlmaWx0ZXJpbmcuc2VjdXJpdHkucHJvdmlkZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworCitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5QcmVNYXRjaGluZzsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlNlY3VyaXR5Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BQcm92aWRlcgorQFByZU1hdGNoaW5nCitwdWJsaWMgY2xhc3MgU2VjdXJpdHlSZXF1ZXN0RmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoZmluYWwgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJlcXVlc3RDb250ZXh0LnNldFNlY3VyaXR5Q29udGV4dChuZXcgU2VjdXJpdHlDb250ZXh0KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgUHJpbmNpcGFsIGdldFVzZXJQcmluY2lwYWwoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcmluY2lwYWwoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkplcnNleSI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzVXNlckluUm9sZShmaW5hbCBTdHJpbmcgcm9sZSkgeworICAgICAgICAgICAgICAgIHJldHVybiAibWFuYWdlciIuZXF1YWxzKHJvbGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzU2VjdXJlKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEF1dGhlbnRpY2F0aW9uU2NoZW1lKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9lbnRpdHktZmlsdGVyaW5nLXNlY3VyaXR5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZW50aXR5ZmlsdGVyaW5nL3NlY3VyaXR5L3Jlc291cmNlL1Jlc3RyaWN0ZWRSZXNvdXJjZS5qYXZhIGIvZXhhbXBsZXMvZW50aXR5LWZpbHRlcmluZy1zZWN1cml0eS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2VudGl0eWZpbHRlcmluZy9zZWN1cml0eS9yZXNvdXJjZS9SZXN0cmljdGVkUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDUxN2QzCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZW50aXR5LWZpbHRlcmluZy1zZWN1cml0eS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2VudGl0eWZpbHRlcmluZy9zZWN1cml0eS9yZXNvdXJjZS9SZXN0cmljdGVkUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmVudGl0eWZpbHRlcmluZy5zZWN1cml0eS5yZXNvdXJjZTsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5EZWZhdWx0VmFsdWU7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5zZWN1cml0eS5EZW55QWxsOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uc2VjdXJpdHkuUGVybWl0QWxsOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uc2VjdXJpdHkuUm9sZXNBbGxvd2VkOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZW50aXR5ZmlsdGVyaW5nLnNlY3VyaXR5LmRvbWFpbi5SZXN0cmljdGVkRW50aXR5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuVG9rZW5pemVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLlNlY3VyaXR5QW5ub3RhdGlvbnM7CisKKy8qKgorICogUmVzb3VyY2UgcmVzdHJpY3RlZCB3aXRoIHNlY3VyaXR5IGFubm90YXRpb25zLiBTZWN1cml0eSByZXN0cmljdGlvbnMgYXJlIGRlZmluZWQgYnkgcmVzb3VyY2UgbWV0aG9kcyBhbmQKKyAqIHtAbGluayBSZXN0cmljdGVkRW50aXR5fS4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFBhdGgoInJlc3RyaWN0ZWQtcmVzb3VyY2UiKQorQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9qc29uIikKK3B1YmxpYyBjbGFzcyBSZXN0cmljdGVkUmVzb3VyY2UgeworCisgICAgQEdFVAorICAgIEBQYXRoKCJkZW55QWxsIikKKyAgICBARGVueUFsbAorICAgIHB1YmxpYyBSZXN0cmljdGVkRW50aXR5IGRlbnlBbGwoKSB7CisgICAgICAgIHJldHVybiBSZXN0cmljdGVkRW50aXR5Lmluc3RhbmNlKCk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJwZXJtaXRBbGwiKQorICAgIEBQZXJtaXRBbGwKKyAgICBwdWJsaWMgUmVzdHJpY3RlZEVudGl0eSBwZXJtaXRBbGwoKSB7CisgICAgICAgIHJldHVybiBSZXN0cmljdGVkRW50aXR5Lmluc3RhbmNlKCk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJyb2xlc0FsbG93ZWQiKQorICAgIEBSb2xlc0FsbG93ZWQoeyJtYW5hZ2VyIn0pCisgICAgcHVibGljIFJlc3RyaWN0ZWRFbnRpdHkgcm9sZXNBbGxvd2VkKCkgeworICAgICAgICByZXR1cm4gUmVzdHJpY3RlZEVudGl0eS5pbnN0YW5jZSgpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgicnVudGltZVJvbGVzQWxsb3dlZCIpCisgICAgcHVibGljIFJlc3BvbnNlIHJ1bnRpbWVSb2xlc0FsbG93ZWQoQFF1ZXJ5UGFyYW0oInJvbGVzIikgQERlZmF1bHRWYWx1ZSgiIikgZmluYWwgU3RyaW5nIHJvbGVzKSB7CisgICAgICAgIHJldHVybiBSZXNwb25zZQorICAgICAgICAgICAgICAgIC5vaygpCisgICAgICAgICAgICAgICAgLmVudGl0eShSZXN0cmljdGVkRW50aXR5Lmluc3RhbmNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQW5ub3RhdGlvbltdIHtTZWN1cml0eUFubm90YXRpb25zLnJvbGVzQWxsb3dlZChUb2tlbml6ZXIudG9rZW5pemUocm9sZXMpKX0pCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZW50aXR5LWZpbHRlcmluZy1zZWN1cml0eS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2VudGl0eWZpbHRlcmluZy9zZWN1cml0eS9yZXNvdXJjZS9VbnJlc3RyaWN0ZWRSZXNvdXJjZS5qYXZhIGIvZXhhbXBsZXMvZW50aXR5LWZpbHRlcmluZy1zZWN1cml0eS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2VudGl0eWZpbHRlcmluZy9zZWN1cml0eS9yZXNvdXJjZS9VbnJlc3RyaWN0ZWRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZTIwOTQKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9lbnRpdHktZmlsdGVyaW5nLXNlY3VyaXR5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZW50aXR5ZmlsdGVyaW5nL3NlY3VyaXR5L3Jlc291cmNlL1VucmVzdHJpY3RlZFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5lbnRpdHlmaWx0ZXJpbmcuc2VjdXJpdHkucmVzb3VyY2U7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmVudGl0eWZpbHRlcmluZy5zZWN1cml0eS5kb21haW4uUmVzdHJpY3RlZEVudGl0eTsKKworLyoqCisgKiBSZXNvdXJjZSBub3QgcmVzdHJpY3RlZCB3aXRoIHNlY3VyaXR5IGFubm90YXRpb25zIGxlYXZpbmcgc2VjdXJpdHkgcmVzdHJpY3Rpb25zIHNvbGVseSB0byB7QGxpbmsgUmVzdHJpY3RlZEVudGl0eX0gYW5kCisgKiB7QGxpbmsgamF2YXgud3MucnMuY29yZS5TZWN1cml0eUNvbnRleHR9LgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUGF0aCgidW5yZXN0cmljdGVkLXJlc291cmNlIikKK0BQcm9kdWNlcygiYXBwbGljYXRpb24vanNvbiIpCitwdWJsaWMgY2xhc3MgVW5yZXN0cmljdGVkUmVzb3VyY2UgeworCisgICAgQEdFVAorICAgIHB1YmxpYyBSZXN0cmljdGVkRW50aXR5IGdldFJlc3RyaWN0ZWRFbnRpdHkoKSB7CisgICAgICAgIHJldHVybiBSZXN0cmljdGVkRW50aXR5Lmluc3RhbmNlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZW50aXR5LWZpbHRlcmluZy1zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2VudGl0eWZpbHRlcmluZy9zZWN1cml0eS9SZXN0cmljdGVkUmVzb3VyY2VUZXN0LmphdmEgYi9leGFtcGxlcy9lbnRpdHktZmlsdGVyaW5nLXNlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZW50aXR5ZmlsdGVyaW5nL3NlY3VyaXR5L1Jlc3RyaWN0ZWRSZXNvdXJjZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTUzMGI3Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZW50aXR5LWZpbHRlcmluZy1zZWN1cml0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2VudGl0eWZpbHRlcmluZy9zZWN1cml0eS9SZXN0cmljdGVkUmVzb3VyY2VUZXN0LmphdmEKQEAgLTAsMCArMSwxNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZW50aXR5ZmlsdGVyaW5nLnNlY3VyaXR5OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZW50aXR5ZmlsdGVyaW5nLnNlY3VyaXR5LmRvbWFpbi5SZXN0cmljdGVkRW50aXR5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmVudGl0eWZpbHRlcmluZy5zZWN1cml0eS5kb21haW4uUmVzdHJpY3RlZFN1YkVudGl0eTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uLkphY2tzb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLlNlY3VyaXR5RW50aXR5RmlsdGVyaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb3h5Lmpzb24uTW94eUpzb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMubm90TnVsbFZhbHVlOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLm51bGxWYWx1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZW50aXR5ZmlsdGVyaW5nLnNlY3VyaXR5LnJlc291cmNlLlJlc3RyaWN0ZWRSZXNvdXJjZX0gdW5pdCB0ZXN0cy4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBSZXN0cmljdGVkUmVzb3VyY2VUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKG5hbWUgPSAiUHJvdmlkZXI6IHswfSIpCisgICAgcHVibGljIHN0YXRpYyBJdGVyYWJsZTxDbGFzc1tdPiBwcm92aWRlcnMoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBDbGFzc1tdW117e01veHlKc29uRmVhdHVyZS5jbGFzc30sIHtKYWNrc29uRmVhdHVyZS5jbGFzc319KTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVzdHJpY3RlZFJlc291cmNlVGVzdChmaW5hbCBDbGFzczxGZWF0dXJlPiBmaWx0ZXJpbmdQcm92aWRlcikgeworICAgICAgICBzdXBlcihuZXcgUmVzb3VyY2VDb25maWcoU2VjdXJpdHlFbnRpdHlGaWx0ZXJpbmdGZWF0dXJlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5wYWNrYWdlcygib3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZW50aXR5ZmlsdGVyaW5nLnNlY3VyaXR5IikKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoZmlsdGVyaW5nUHJvdmlkZXIpKTsKKworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlbnlBbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0VGhhdCh0YXJnZXQoInJlc3RyaWN0ZWQtcmVzb3VyY2UiKS5wYXRoKCJkZW55QWxsIikucmVxdWVzdCgpLmdldCgpLmdldFN0YXR1cygpLAorICAgICAgICAgICAgICAgIGVxdWFsVG8oUmVzcG9uc2UuU3RhdHVzLkZPUkJJRERFTi5nZXRTdGF0dXNDb2RlKCkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQZXJtaXRBbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzdHJpY3RlZEVudGl0eSBlbnRpdHkgPSB0YXJnZXQoInJlc3RyaWN0ZWQtcmVzb3VyY2UiKS5wYXRoKCJwZXJtaXRBbGwiKS5yZXF1ZXN0KCkuZ2V0KFJlc3RyaWN0ZWRFbnRpdHkuY2xhc3MpOworICAgICAgICBmaW5hbCBSZXN0cmljdGVkU3ViRW50aXR5IG1peGVkRmllbGQgPSBlbnRpdHkuZ2V0TWl4ZWRGaWVsZCgpOworCisgICAgICAgIC8vIE5vdCBudWxsIHZhbHVlcy4KKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0U2ltcGxlRmllbGQoKSwgbm90TnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXRQZXJtaXRBbGwoKSwgbm90TnVsbFZhbHVlKCkpOworCisgICAgICAgIC8vIE51bGwgdmFsdWVzLgorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXREZW55QWxsKCksIG51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtaXhlZEZpZWxkLCBudWxsVmFsdWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Um9sZXNBbGxvd2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3RyaWN0ZWRFbnRpdHkgZW50aXR5ID0gdGFyZ2V0KCJyZXN0cmljdGVkLXJlc291cmNlIikucGF0aCgicm9sZXNBbGxvd2VkIikucmVxdWVzdCgpLmdldChSZXN0cmljdGVkRW50aXR5LmNsYXNzKTsKKyAgICAgICAgZmluYWwgUmVzdHJpY3RlZFN1YkVudGl0eSBtaXhlZEZpZWxkID0gZW50aXR5LmdldE1peGVkRmllbGQoKTsKKworICAgICAgICAvLyBOb3QgbnVsbCB2YWx1ZXMuCisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmdldFNpbXBsZUZpZWxkKCksIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0UGVybWl0QWxsKCksIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtaXhlZEZpZWxkLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQobWl4ZWRGaWVsZC5nZXRNYW5hZ2VyRmllbGQoKSwgbm90TnVsbFZhbHVlKCkpOworCisgICAgICAgIC8vIE51bGwgdmFsdWVzLgorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXREZW55QWxsKCksIG51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtaXhlZEZpZWxkLmdldFVzZXJGaWVsZCgpLCBudWxsVmFsdWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UnVudGltZVJvbGVzQWxsb3dlZFVzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzdHJpY3RlZEVudGl0eSBlbnRpdHkgPSB0YXJnZXQoInJlc3RyaWN0ZWQtcmVzb3VyY2UiKQorICAgICAgICAgICAgICAgIC5wYXRoKCJydW50aW1lUm9sZXNBbGxvd2VkIikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgicm9sZXMiLCAidXNlciIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5nZXQoUmVzdHJpY3RlZEVudGl0eS5jbGFzcyk7CisgICAgICAgIGZpbmFsIFJlc3RyaWN0ZWRTdWJFbnRpdHkgbWl4ZWRGaWVsZCA9IGVudGl0eS5nZXRNaXhlZEZpZWxkKCk7CisKKyAgICAgICAgLy8gTm90IG51bGwgdmFsdWVzLgorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXRTaW1wbGVGaWVsZCgpLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmdldFBlcm1pdEFsbCgpLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQobWl4ZWRGaWVsZCwgbm90TnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KG1peGVkRmllbGQuZ2V0VXNlckZpZWxkKCksIG5vdE51bGxWYWx1ZSgpKTsKKworICAgICAgICAvLyBOdWxsIHZhbHVlcy4KKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0RGVueUFsbCgpLCBudWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQobWl4ZWRGaWVsZC5nZXRNYW5hZ2VyRmllbGQoKSwgbnVsbFZhbHVlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJ1bnRpbWVSb2xlc0FsbG93ZWRNYW5hZ2VyVXNlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXN0cmljdGVkRW50aXR5IGVudGl0eSA9IHRhcmdldCgicmVzdHJpY3RlZC1yZXNvdXJjZSIpCisgICAgICAgICAgICAgICAgLnBhdGgoInJ1bnRpbWVSb2xlc0FsbG93ZWQiKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJyb2xlcyIsICJ1c2VyLG1hbmFnZXIiKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkuZ2V0KFJlc3RyaWN0ZWRFbnRpdHkuY2xhc3MpOworICAgICAgICBmaW5hbCBSZXN0cmljdGVkU3ViRW50aXR5IG1peGVkRmllbGQgPSBlbnRpdHkuZ2V0TWl4ZWRGaWVsZCgpOworCisgICAgICAgIC8vIE5vdCBudWxsIHZhbHVlcy4KKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0U2ltcGxlRmllbGQoKSwgbm90TnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXRQZXJtaXRBbGwoKSwgbm90TnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KG1peGVkRmllbGQsIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtaXhlZEZpZWxkLmdldFVzZXJGaWVsZCgpLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQobWl4ZWRGaWVsZC5nZXRNYW5hZ2VyRmllbGQoKSwgbm90TnVsbFZhbHVlKCkpOworCisgICAgICAgIC8vIE51bGwgdmFsdWVzLgorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXREZW55QWxsKCksIG51bGxWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSdW50aW1lUm9sZXNBbGxvd2VkSW52YWxpZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXN0cmljdGVkRW50aXR5IGVudGl0eSA9IHRhcmdldCgicmVzdHJpY3RlZC1yZXNvdXJjZSIpCisgICAgICAgICAgICAgICAgLnBhdGgoInJ1bnRpbWVSb2xlc0FsbG93ZWQiKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJyb2xlcyIsICJpbnZhbGlkIikKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpLmdldChSZXN0cmljdGVkRW50aXR5LmNsYXNzKTsKKyAgICAgICAgZmluYWwgUmVzdHJpY3RlZFN1YkVudGl0eSBtaXhlZEZpZWxkID0gZW50aXR5LmdldE1peGVkRmllbGQoKTsKKworICAgICAgICAvLyBOb3QgbnVsbCB2YWx1ZXMuCisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmdldFNpbXBsZUZpZWxkKCksIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0UGVybWl0QWxsKCksIG5vdE51bGxWYWx1ZSgpKTsKKworICAgICAgICAvLyBOdWxsIHZhbHVlcy4KKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0RGVueUFsbCgpLCBudWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQobWl4ZWRGaWVsZCwgbnVsbFZhbHVlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2VudGl0eS1maWx0ZXJpbmctc2VjdXJpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9lbnRpdHlmaWx0ZXJpbmcvc2VjdXJpdHkvVW5yZXN0cmljdGVkUmVzb3VyY2VUZXN0LmphdmEgYi9leGFtcGxlcy9lbnRpdHktZmlsdGVyaW5nLXNlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZW50aXR5ZmlsdGVyaW5nL3NlY3VyaXR5L1VucmVzdHJpY3RlZFJlc291cmNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNmE4MzgKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9lbnRpdHktZmlsdGVyaW5nLXNlY3VyaXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZW50aXR5ZmlsdGVyaW5nL3NlY3VyaXR5L1VucmVzdHJpY3RlZFJlc291cmNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZW50aXR5ZmlsdGVyaW5nLnNlY3VyaXR5OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmVudGl0eWZpbHRlcmluZy5zZWN1cml0eS5kb21haW4uUmVzdHJpY3RlZEVudGl0eTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5lbnRpdHlmaWx0ZXJpbmcuc2VjdXJpdHkuZG9tYWluLlJlc3RyaWN0ZWRTdWJFbnRpdHk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamFja3Nvbi5KYWNrc29uRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5TZWN1cml0eUVudGl0eUZpbHRlcmluZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW94eS5qc29uLk1veHlKc29uRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5ub3ROdWxsVmFsdWU7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMubnVsbFZhbHVlOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5lbnRpdHlmaWx0ZXJpbmcuc2VjdXJpdHkucmVzb3VyY2UuVW5yZXN0cmljdGVkUmVzb3VyY2V9IHVuaXQgdGVzdHMuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgVW5yZXN0cmljdGVkUmVzb3VyY2VUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKG5hbWUgPSAiUHJvdmlkZXI6IHswfSIpCisgICAgcHVibGljIHN0YXRpYyBJdGVyYWJsZTxDbGFzc1tdPiBwcm92aWRlcnMoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBDbGFzc1tdW117e01veHlKc29uRmVhdHVyZS5jbGFzc30sIHtKYWNrc29uRmVhdHVyZS5jbGFzc319KTsKKyAgICB9CisKKyAgICBwdWJsaWMgVW5yZXN0cmljdGVkUmVzb3VyY2VUZXN0KGZpbmFsIENsYXNzPEZlYXR1cmU+IGZpbHRlcmluZ1Byb3ZpZGVyKSB7CisgICAgICAgIHN1cGVyKG5ldyBSZXNvdXJjZUNvbmZpZyhTZWN1cml0eUVudGl0eUZpbHRlcmluZ0ZlYXR1cmUuY2xhc3MpCisgICAgICAgICAgICAgICAgLnBhY2thZ2VzKCJvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5lbnRpdHlmaWx0ZXJpbmcuc2VjdXJpdHkiKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihmaWx0ZXJpbmdQcm92aWRlcikpOworCisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5EVU1QX0VOVElUWSk7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzdHJpY3RlZEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXN0cmljdGVkRW50aXR5IGVudGl0eSA9IHRhcmdldCgidW5yZXN0cmljdGVkLXJlc291cmNlIikucmVxdWVzdCgpLmdldChSZXN0cmljdGVkRW50aXR5LmNsYXNzKTsKKyAgICAgICAgZmluYWwgUmVzdHJpY3RlZFN1YkVudGl0eSBtaXhlZEZpZWxkID0gZW50aXR5LmdldE1peGVkRmllbGQoKTsKKworICAgICAgICAvLyBOb3QgbnVsbCB2YWx1ZXMuCisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmdldFNpbXBsZUZpZWxkKCksIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0UGVybWl0QWxsKCksIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtaXhlZEZpZWxkLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQobWl4ZWRGaWVsZC5nZXRNYW5hZ2VyRmllbGQoKSwgbm90TnVsbFZhbHVlKCkpOworCisgICAgICAgIC8vIE51bGwgdmFsdWVzLgorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXREZW55QWxsKCksIG51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtaXhlZEZpZWxkLmdldFVzZXJGaWVsZCgpLCBudWxsVmFsdWUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZW50aXR5LWZpbHRlcmluZy1zZWxlY3RhYmxlL1JFQURNRS5NRCBiL2V4YW1wbGVzL2VudGl0eS1maWx0ZXJpbmctc2VsZWN0YWJsZS9SRUFETUUuTUQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI0MTYzNQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2VudGl0eS1maWx0ZXJpbmctc2VsZWN0YWJsZS9SRUFETUUuTUQKQEAgLTAsMCArMSw5OSBAQAorWy8vXTogIyAiIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAiCitbLy9dOiAjICIgIgorWy8vXTogIyAiIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAiCitbLy9dOiAjICIgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQgIgorWy8vXTogIyAiIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4gIgorWy8vXTogIyAiICIKK1svL106ICMgIiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlICIKKworRW50aXR5IERhdGEgRmlsdGVyaW5nIER5bmFtaWMgYW5kIENvbmZpZ3VyYWJsZSBRdWVyeSBQYXJhbWV0ZXJzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gdXNlIGVudGl0eSBmaWx0ZXJpbmcgZmVhdHVyZQorZHluYW1pY2FsbHkgd2l0aCBkZWZpbmluZyB3aGF0IHNob3VsZCBiZSBzZW50IHRvIHRoZSBvdGhlciBzaWRlIGJhc2VkIG9uCitxdWVyeSBwYXJhbWV0ZXJzIGFuZCBob3cgdG8gYXBwbHkgdGhlIHJ1bGVzIG9uIGRvbWFpbiBjbGFzc2VzIGFzIHdlbGwgYXMKK29uIEpBWC1SUyByZXNvdXJjZSBjbGFzc2VzIG9yIEpBWC1SUyByZXNvdXJjZSBtZXRob2RzLgorCitUaGUgZnVsbCBkZXNjcmlwdGlvbiBob3cgRW50aXR5IERhdGEgRmlsdGVyaW5nIGNhbiBiZSBmb3VuZCBpbiBKZXJzZXkKK1VzZXIgR3VpZGUsIGNoYXB0ZXIgW0VudGl0eSBEYXRhCitGaWx0ZXJpbmddKGh0dHBzOi8vamVyc2V5LmphdmEubmV0L2RvY3VtZW50YXRpb24vbGF0ZXN0L2VudGl0eS1maWx0ZXJpbmcuaHRtbCkuCitTZWN0aW9ucyByZWxldmFudCB0byB0aGlzIGV4YW1wbGUgKGRlc2NyaWJpbmcgdGhpcyBleGFjdCBleGFtcGxlKSBhcmU6CisKKy0gICBbRW5hYmxpbmcgYW5kIGNvbmZpZ3VyaW5nIEVudGl0eSBGaWx0ZXJpbmcgaW4geW91cgorICAgIGFwcGxpY2F0aW9uXShodHRwczovL2plcnNleS5qYXZhLm5ldC9kb2N1bWVudGF0aW9uL2xhdGVzdC9lbnRpdHktZmlsdGVyaW5nLmh0bWwjZDBlMTM5MTEpCistICAgW0VudGl0eSBGaWx0ZXJpbmcgYmFzZWQgb24gZHluYW1pYyBhbmQgY29uZmlndXJhYmxlIHF1ZXJ5CisgICAgcGFyYW1ldGVyc10oaHR0cHM6Ly9qZXJzZXkuamF2YS5uZXQvZG9jdW1lbnRhdGlvbi9sYXRlc3QvZW50aXR5LWZpbHRlcmluZy5odG1sI2VmLnNlbGVjdGFibGUuYW5ub3RhdGlvbnMpCisKK0NvbnRlbnRzCistLS0tLS0tLQorCitUaGUgbWFwcGluZyBvZiB0aGUgVVJJIHBhdGggc3BhY2UgaXMgcHJlc2VudGVkIGluIHRoZSBmb2xsb3dpbmcgdGFibGU6CisKK1VSSSBwYXRoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUmVzb3VyY2UgY2xhc3MgICB8IEhUVFAgbWV0aG9kcyAgIHwgQWxsb3dlZCB2YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IE5vdGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICB8IC0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKl8vcGVvcGxlL3tpZH0/c2VsZWN0PXtzZWxlY3R9XyoqICAgICAgICAgICB8ICBQZXJzb25SZXNvdXJjZSAgfCAgR0VUICAgICAgICAgICB8ICBpZCA9IGFueSB2YWx1ZSwgc2VsZWN0ID0gZmllbGQgbmFtZXMgZnJvbSBQZXJzb24vQWRkcmVzcy9QaG9uZU51bWJlciBjbGFzcyAgfCAgUmV0dXJucyBmaWVsZHMgb2YgUGVyc29uL0FkZHJlc3MvUGhvbmVOdW1iZXIKKyoqXy9wZW9wbGUve2lkfS9hZGRyZXNzZXM/c2VsZWN0PXtzZWxlY3R9XyoqIHwgIFBlcnNvblJlc291cmNlICB8ICBHRVQgICAgICAgICAgIHwgIGlkID0gYW55IHZhbHVlLCBzZWxlY3QgPSBmaWVsZCBuYW1lcyBmcm9tIEFkZHJlc3MvUGhvbmVOdW1iZXIgY2xhc3MgICAgICAgICB8ICBSZXR1cm5zIGZpZWxkcyBvZiBBZGRyZXNzL1Bob25lTnVtYmVyCisKK0FwcGxpY2F0aW9uIGlzIGJhc2VkIG9uIEdyaXp6bHkgY29udGFpbmVyIChzZWUgYEFwcGApLiBFdmVyeXRoaW5nIG5lZWRlZAorKHJlc291cmNlcy9wcm92aWRlcnMpIGlzIHJlZ2lzdGVyZWQgaW4KK2BTZWxlY3RhYmxlRW50aXR5RmlsdGVyaW5nQXBwbGljYXRpb25gLgorCitTYW1wbGUgUmVzcG9uc2UKKy0tLS0tLS0tLS0tLS0tLQorCitFdmVuIHRob3VnaCB0aGUgc2FtZSBpbnN0YW5jZSBvZiwgZS5nLiBQZXJzb24gY2xhc3MsIGlzIHVzZWQgdG8gY3JlYXRlCityZXNwb25zZSB0aGUgZ2l2ZW4gdmFsdWVzIG9mIGBzZWxlY3RgIHF1ZXJ5IHBhcmFtZXRlciBhcmUgdXNlZCB0byBzZWxlY3QKK3RoZSBmaWVsZHMgdGhhdCB3b3VsZCBiZSB0cmFuc2ZlcnJlZCBvdmVyIHRoZSB3aXJlLiBGb3IKK2BwZW9wbGUvMTIzND9zZWxlY3Q9ZmFtaWx5TmFtZSxnaXZlbk5hbWVgIGl0IGxvb2tzIGxpa2U6CisKK2BgYGphdmFzY3JpcHQKK3sKKyAgICJmYW1pbHlOYW1lIjogIkRvd2QiLAorICAgImdpdmVuTmFtZSI6ICJBbmRyZXciCit9CitgYGAKKworQW5kIGZvciBgcGVvcGxlLzEyMzQ/c2VsZWN0PWZhbWlseU5hbWUsZ2l2ZW5OYW1lLGFkZHJlc3Nlcy5waG9uZU51bWJlci5udW1iZXJgIGl0IGxvb2tzIGxpa2U6CisKK2BgYGphdmFzY3JpcHQKK3sKKyAgICJhZGRyZXNzZXMiOlsKKyAgICAgIHsKKyAgICAgICAgICJwaG9uZU51bWJlciI6eworICAgICAgICAgICAgIm51bWJlciI6ICI4NjctNTMwOSIKKyAgICAgICAgIH0KKyAgICAgIH0KKyAgIF0sCisgICAiZmFtaWx5TmFtZSI6ICJEb3dkIiwKKyAgICJnaXZlbk5hbWUiOiAiQW5kcmV3IgorfQorYGBgCisKK1J1bm5pbmcgdGhlIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworUnVuIHRoZSBleGFtcGxlIGFzIGZvbGxvd3M6CisKKz4gICAgIG12biBjbGVhbiBwYWNrYWdlIGV4ZWM6amF2YQorCitUaGlzIGRlcGxveXMgY3VycmVudCBleGFtcGxlIHVzaW5nIEdyaXp6bHkuIFlvdSBjYW4gYWNjZXNzIHRoZQorYXBwbGljYXRpb24gYXQ6CisKKy0gICA8aHR0cDovL2xvY2FsaG9zdDo4MDgwL3Blb3BsZS8xMjM0PgorLSAgIDxodHRwOi8vbG9jYWxob3N0OjgwODAvcGVvcGxlLzEyMzQ/c2VsZWN0PWZhbWlseU5hbWUsZ2l2ZW5OYW1lPgorLSAgIDxodHRwOi8vbG9jYWxob3N0OjgwODAvcGVvcGxlLzEyMzQ/c2VsZWN0PXJlZ2lvbixhZGRyZXNzZXMucmVnaW9uPgorLSAgIDxodHRwOi8vbG9jYWxob3N0OjgwODAvcGVvcGxlLzEyMzQ/c2VsZWN0PWZhbWlseU5hbWUsZ2l2ZW5OYW1lLGFkZHJlc3Nlcy5waG9uZU51bWJlci5udW1iZXI+CisKK1VzaW5nIEphY2tzb24gaW5zdGVhZCBvZiBNT1h5CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIGV4YW1wbGVzIHVzZXMgYnkgZGVmYXVsdCBFbnRpdHkgRGF0YSBGaWx0ZXJpbmcgZmVhdHVyZSB0b2dldGhlcgord2l0aCBNT1h5LiBUbyBzd2l0Y2ggTU9YeSBKU09OIHByb3ZpZGVyIHRvIEphY2tzb24gKDIueCkgSlNPTiBwcm92aWRlcgorc2ltcGx5CisKKy0gICBjb21tZW50IHJlZ2lzdHJhdGlvbiBvZiBNT1h5IENvbnRleHRSZXNvbHZlciwgYW5kXAorICAgICBgcmVnaXN0ZXIobmV3IE1veHlKc29uQ29uZmlnKCkuc2V0Rm9ybWF0dGVkT3V0cHV0KHRydWUpLnJlc29sdmVyKCkpYAorLSAgIHVuY29tbWVudCByZWdpc3RyYXRpb24gb2YgSmFja3NvbkZlYXR1cmVcCisgICAgIGByZWdpc3RlcihKYWNrc29uRmVhdHVyZS5jbGFzcylgCisKK2luIGBTZWxlY3RhYmxlRW50aXR5RmlsdGVyaW5nQXBwbGljYXRpb25gIGNsYXNzLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZW50aXR5LWZpbHRlcmluZy1zZWxlY3RhYmxlL3BvbS54bWwgYi9leGFtcGxlcy9lbnRpdHktZmlsdGVyaW5nLXNlbGVjdGFibGUvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTFhY2M1Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZW50aXR5LWZpbHRlcmluZy1zZWxlY3RhYmxlL3BvbS54bWwKQEAgLTAsMCArMSw5MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKworICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+ZW50aXR5LWZpbHRlcmluZy1zZWxlY3RhYmxlPC9hcnRpZmFjdElkPgorICAgIDxuYW1lPmplcnNleS1leGFtcGxlcy1lbnRpdHktZmlsdGVyaW5nLXNlbGVjdGFibGU8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+SmVyc2V5IEVudGl0eSBEYXRhIEZpbHRlcmluZyBTZWxlY3RhYmxlIEV4YW1wbGUuPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1zZXJ2ZXI8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1ncml6emx5Mi1odHRwPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWVudGl0eS1maWx0ZXJpbmc8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktaGsyPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtbW94eTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLWpzb24tamFja3NvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDwhLS0gUnVuIHRoZSBhcHBsaWNhdGlvbiB1c2luZyAibXZuIGV4ZWM6amF2YSIgLS0+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmV4ZWMtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8bWFpbkNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmVudGl0eWZpbHRlcmluZy5zZWxlY3RhYmxlLkFwcDwvbWFpbkNsYXNzPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+cmVsZWFzZTwvaWQ+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICA8L3Byb2ZpbGVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9lbnRpdHktZmlsdGVyaW5nLXNlbGVjdGFibGUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9lbnRpdHlmaWx0ZXJpbmcvc2VsZWN0YWJsZS9BcHAuamF2YSBiL2V4YW1wbGVzL2VudGl0eS1maWx0ZXJpbmctc2VsZWN0YWJsZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2VudGl0eWZpbHRlcmluZy9zZWxlY3RhYmxlL0FwcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YzAwODIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9lbnRpdHktZmlsdGVyaW5nLXNlbGVjdGFibGUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9lbnRpdHlmaWx0ZXJpbmcvc2VsZWN0YWJsZS9BcHAuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmVudGl0eWZpbHRlcmluZy5zZWxlY3RhYmxlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5ncml6emx5Lmh0dHAuc2VydmVyLkh0dHBTZXJ2ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseTIuaHR0cHNlcnZlci5Hcml6emx5SHR0cFNlcnZlckZhY3Rvcnk7CisKKy8qKgorICogSmF2YSBhcHBsaWNhdGlvbiBjbGFzcyBzdGFydGluZyBHcml6emx5MiBzZXJ2ZXIgd2l0aCBFbnRpdHkgRGF0YSBGaWx0ZXJpbmcgd2l0aCBxdWVyeSBwYXJhbWV0ZXJzLgorICoKKyAqIEBhdXRob3IgQW5keSBQZW1iZXJ0b24gKHBlbWJlcnRvbmEgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEFwcCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgQkFTRV9VUkkgPSBVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvIik7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihmaW5hbCBTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkplcnNleSBFbnRpdHkgRGF0YSBGaWx0ZXJpbmcgRXhhbXBsZS4iKTsKKworICAgICAgICAgICAgZmluYWwgSHR0cFNlcnZlciBzZXJ2ZXIgPSBHcml6emx5SHR0cFNlcnZlckZhY3RvcnkKKyAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZUh0dHBTZXJ2ZXIoQkFTRV9VUkksIG5ldyBTZWxlY3RhYmxlRW50aXR5RmlsdGVyaW5nQXBwbGljYXRpb24oKSwgZmFsc2UpOworICAgICAgICAgICAgUnVudGltZS5nZXRSdW50aW1lKCkuYWRkU2h1dGRvd25Ib29rKG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyLnNodXRkb3duTm93KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkpOworICAgICAgICAgICAgc2VydmVyLnN0YXJ0KCk7CisKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQXBwbGljYXRpb24gc3RhcnRlZC5cblRyeSBvdXQgb25lIG9mIHRoZXNlIFVSSXM6Iik7CisgICAgICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBwYXRoIDogbmV3IFN0cmluZ1tdeyJwZW9wbGUvMTIzNCIsICJwZW9wbGUvMTIzND9zZWxlY3Q9ZmFtaWx5TmFtZSxnaXZlbk5hbWUiLAorICAgICAgICAgICAgICAgICAgICAicGVvcGxlLzEyMzQ/c2VsZWN0PXJlZ2lvbixhZGRyZXNzZXMucmVnaW9uIiwKKyAgICAgICAgICAgICAgICAgICAgInBlb3BsZS8xMjM0P3NlbGVjdD1mYW1pbHlOYW1lLGdpdmVuTmFtZSxhZGRyZXNzZXMucGhvbmVOdW1iZXIubnVtYmVyIn0pIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oQkFTRV9VUkkgKyBwYXRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RvcCB0aGUgYXBwbGljYXRpb24gdXNpbmcgQ1RSTCtDIik7CisKKyAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuam9pbigpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiB8IEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKEFwcC5jbGFzcy5nZXROYW1lKCkpLmxvZyhMZXZlbC5TRVZFUkUsIG51bGwsIGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFByZXZlbnQgaW5zdGFudGlhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIEFwcCgpIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9lbnRpdHktZmlsdGVyaW5nLXNlbGVjdGFibGUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9lbnRpdHlmaWx0ZXJpbmcvc2VsZWN0YWJsZS9TZWxlY3RhYmxlRW50aXR5RmlsdGVyaW5nQXBwbGljYXRpb24uamF2YSBiL2V4YW1wbGVzL2VudGl0eS1maWx0ZXJpbmctc2VsZWN0YWJsZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2VudGl0eWZpbHRlcmluZy9zZWxlY3RhYmxlL1NlbGVjdGFibGVFbnRpdHlGaWx0ZXJpbmdBcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlOTRlM2EKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9lbnRpdHktZmlsdGVyaW5nLXNlbGVjdGFibGUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9lbnRpdHlmaWx0ZXJpbmcvc2VsZWN0YWJsZS9TZWxlY3RhYmxlRW50aXR5RmlsdGVyaW5nQXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmVudGl0eWZpbHRlcmluZy5zZWxlY3RhYmxlOworCitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamFja3Nvbi5KYWNrc29uRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5TZWxlY3RhYmxlRW50aXR5RmlsdGVyaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb3h5Lmpzb24uTW94eUpzb25Db25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCisvKioKKyAqIEVudGl0eSBEYXRhIEZpbHRlcmluZyBhcHBsaWNhdGlvbiB1c2luZyByZXF1ZXN0IHBhcmFtZXRlcnMuCisgKgorICogQGF1dGhvciBBbmR5IFBlbWJlcnRvbiAocGVtYmVydG9uYSBhdCBnbWFpbC5jb20pCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQEFwcGxpY2F0aW9uUGF0aCgiLyIpCitwdWJsaWMgY2xhc3MgU2VsZWN0YWJsZUVudGl0eUZpbHRlcmluZ0FwcGxpY2F0aW9uIGV4dGVuZHMgUmVzb3VyY2VDb25maWcgeworCisgICAgcHVibGljIFNlbGVjdGFibGVFbnRpdHlGaWx0ZXJpbmdBcHBsaWNhdGlvbigpIHsKKyAgICAgICAgLy8gUmVnaXN0ZXIgYWxsIHJlc291cmNlcyBwcmVzZW50IHVuZGVyIHRoZSBwYWNrYWdlLgorICAgICAgICBwYWNrYWdlcygib3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZW50aXR5ZmlsdGVyaW5nLnNlbGVjdGFibGUiKTsKKworICAgICAgICAvLyBSZWdpc3RlciBlbnRpdHktZmlsdGVyaW5nIHNlbGVjdGFibGUgZmVhdHVyZS4KKyAgICAgICAgcmVnaXN0ZXIoU2VsZWN0YWJsZUVudGl0eUZpbHRlcmluZ0ZlYXR1cmUuY2xhc3MpOworICAgICAgICBwcm9wZXJ0eShTZWxlY3RhYmxlRW50aXR5RmlsdGVyaW5nRmVhdHVyZS5RVUVSWV9QQVJBTV9OQU1FLCAic2VsZWN0Iik7CisKKyAgICAgICAgLy8gQ29uZmlndXJlIE1PWHkgSnNvbiBwcm92aWRlci4gQ29tbWVudCB0aGlzIGxpbmUgdG8gdXNlIEphY2tzb24uIFVuY29tbWVudCB0byB1c2UgTU9YeS4KKyAgICAgICAgcmVnaXN0ZXIobmV3IE1veHlKc29uQ29uZmlnKCkuc2V0Rm9ybWF0dGVkT3V0cHV0KHRydWUpLnJlc29sdmVyKCkpOworCisgICAgICAgIC8vIENvbmZpZ3VyZSBKYWNrc29uIEpzb24gcHJvdmlkZXIuIENvbW1lbnQgdGhpcyBsaW5lIHRvIHVzZSBNT1h5LiBVbmNvbW1lbnQgdG8gdXNlIEphY2tzb24uCisgICAgICAgIC8vIHJlZ2lzdGVyKEphY2tzb25GZWF0dXJlLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9lbnRpdHktZmlsdGVyaW5nLXNlbGVjdGFibGUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9lbnRpdHlmaWx0ZXJpbmcvc2VsZWN0YWJsZS9kb21haW4vQWRkcmVzcy5qYXZhIGIvZXhhbXBsZXMvZW50aXR5LWZpbHRlcmluZy1zZWxlY3RhYmxlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZW50aXR5ZmlsdGVyaW5nL3NlbGVjdGFibGUvZG9tYWluL0FkZHJlc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzRlZGJiCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZW50aXR5LWZpbHRlcmluZy1zZWxlY3RhYmxlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZW50aXR5ZmlsdGVyaW5nL3NlbGVjdGFibGUvZG9tYWluL0FkZHJlc3MuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmVudGl0eWZpbHRlcmluZy5zZWxlY3RhYmxlLmRvbWFpbjsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKK0BYbWxSb290RWxlbWVudAorcHVibGljIGNsYXNzIEFkZHJlc3MgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgc3RyZWV0QWRkcmVzczsKKworICAgIHByaXZhdGUgU3RyaW5nIHJlZ2lvbjsKKworICAgIHByaXZhdGUgUGhvbmVOdW1iZXIgcGhvbmVOdW1iZXI7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmVldEFkZHJlc3MoKSB7CisgICAgICAgIHJldHVybiBzdHJlZXRBZGRyZXNzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFN0cmVldEFkZHJlc3MoU3RyaW5nIHN0cmVldEFkZHJlc3MpIHsKKyAgICAgICAgdGhpcy5zdHJlZXRBZGRyZXNzID0gc3RyZWV0QWRkcmVzczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlZ2lvbigpIHsKKyAgICAgICAgcmV0dXJuIHJlZ2lvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZWdpb24oU3RyaW5nIHJlZ2lvbikgeworICAgICAgICB0aGlzLnJlZ2lvbiA9IHJlZ2lvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgUGhvbmVOdW1iZXIgZ2V0UGhvbmVOdW1iZXIoKSB7CisgICAgICAgIHJldHVybiBwaG9uZU51bWJlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQaG9uZU51bWJlcihQaG9uZU51bWJlciBwaG9uZU51bWJlcikgeworICAgICAgICB0aGlzLnBob25lTnVtYmVyID0gcGhvbmVOdW1iZXI7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9lbnRpdHktZmlsdGVyaW5nLXNlbGVjdGFibGUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9lbnRpdHlmaWx0ZXJpbmcvc2VsZWN0YWJsZS9kb21haW4vUGVyc29uLmphdmEgYi9leGFtcGxlcy9lbnRpdHktZmlsdGVyaW5nLXNlbGVjdGFibGUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9lbnRpdHlmaWx0ZXJpbmcvc2VsZWN0YWJsZS9kb21haW4vUGVyc29uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ0YjliNQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2VudGl0eS1maWx0ZXJpbmctc2VsZWN0YWJsZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2VudGl0eWZpbHRlcmluZy9zZWxlY3RhYmxlL2RvbWFpbi9QZXJzb24uamF2YQpAQCAtMCwwICsxLDkwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmVudGl0eWZpbHRlcmluZy5zZWxlY3RhYmxlLmRvbWFpbjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCitAWG1sUm9vdEVsZW1lbnQKK3B1YmxpYyBjbGFzcyBQZXJzb24geworICAgIHByaXZhdGUgU3RyaW5nIGdpdmVuTmFtZTsKKworICAgIHByaXZhdGUgU3RyaW5nIGZhbWlseU5hbWU7CisKKyAgICBwcml2YXRlIFN0cmluZyBob25vcmlmaWNTdWZmaXg7CisKKyAgICBwcml2YXRlIFN0cmluZyBob25vcmlmaWNQcmVmaXg7CisKKyAgICAvLyBzYW1lIG5hbWUgYXMgQWRkcmVzcy5yZWdpb24KKyAgICBwcml2YXRlIFN0cmluZyByZWdpb247CisKKyAgICBwcml2YXRlIExpc3Q8QWRkcmVzcz4gYWRkcmVzc2VzOworCisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBQaG9uZU51bWJlcj4gcGhvbmVOdW1iZXJzOworCisgICAgcHVibGljIFN0cmluZyBnZXRHaXZlbk5hbWUoKSB7CisgICAgICAgIHJldHVybiBnaXZlbk5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0R2l2ZW5OYW1lKFN0cmluZyBnaXZlbk5hbWUpIHsKKyAgICAgICAgdGhpcy5naXZlbk5hbWUgPSBnaXZlbk5hbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRGYW1pbHlOYW1lKCkgeworICAgICAgICByZXR1cm4gZmFtaWx5TmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGYW1pbHlOYW1lKFN0cmluZyBmYW1pbHlOYW1lKSB7CisgICAgICAgIHRoaXMuZmFtaWx5TmFtZSA9IGZhbWlseU5hbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRIb25vcmlmaWNTdWZmaXgoKSB7CisgICAgICAgIHJldHVybiBob25vcmlmaWNTdWZmaXg7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SG9ub3JpZmljU3VmZml4KFN0cmluZyBob25vcmlmaWNTdWZmaXgpIHsKKyAgICAgICAgdGhpcy5ob25vcmlmaWNTdWZmaXggPSBob25vcmlmaWNTdWZmaXg7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRIb25vcmlmaWNQcmVmaXgoKSB7CisgICAgICAgIHJldHVybiBob25vcmlmaWNQcmVmaXg7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SG9ub3JpZmljUHJlZml4KFN0cmluZyBob25vcmlmaWNQcmVmaXgpIHsKKyAgICAgICAgdGhpcy5ob25vcmlmaWNQcmVmaXggPSBob25vcmlmaWNQcmVmaXg7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8QWRkcmVzcz4gZ2V0QWRkcmVzc2VzKCkgeworICAgICAgICByZXR1cm4gYWRkcmVzc2VzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEFkZHJlc3NlcyhMaXN0PEFkZHJlc3M+IGFkZHJlc3NlcykgeworICAgICAgICB0aGlzLmFkZHJlc3NlcyA9IGFkZHJlc3NlczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlZ2lvbigpIHsKKyAgICAgICAgcmV0dXJuIHJlZ2lvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZWdpb24oU3RyaW5nIHJlZ2lvbikgeworICAgICAgICB0aGlzLnJlZ2lvbiA9IHJlZ2lvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgTWFwPFN0cmluZywgUGhvbmVOdW1iZXI+IGdldFBob25lTnVtYmVycygpIHsKKyAgICAgICAgcmV0dXJuIHBob25lTnVtYmVyczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQaG9uZU51bWJlcnMoTWFwPFN0cmluZywgUGhvbmVOdW1iZXI+IHBob25lTnVtYmVycykgeworICAgICAgICB0aGlzLnBob25lTnVtYmVycyA9IHBob25lTnVtYmVyczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9lbnRpdHktZmlsdGVyaW5nLXNlbGVjdGFibGUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9lbnRpdHlmaWx0ZXJpbmcvc2VsZWN0YWJsZS9kb21haW4vUGhvbmVOdW1iZXIuamF2YSBiL2V4YW1wbGVzL2VudGl0eS1maWx0ZXJpbmctc2VsZWN0YWJsZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2VudGl0eWZpbHRlcmluZy9zZWxlY3RhYmxlL2RvbWFpbi9QaG9uZU51bWJlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlOGU4OWUKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9lbnRpdHktZmlsdGVyaW5nLXNlbGVjdGFibGUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9lbnRpdHlmaWx0ZXJpbmcvc2VsZWN0YWJsZS9kb21haW4vUGhvbmVOdW1iZXIuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmVudGl0eWZpbHRlcmluZy5zZWxlY3RhYmxlLmRvbWFpbjsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKK0BYbWxSb290RWxlbWVudAorcHVibGljIGNsYXNzIFBob25lTnVtYmVyIHsKKworICAgIHByaXZhdGUgU3RyaW5nIGFyZWFDb2RlOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbnVtYmVyOworCisgICAgcHVibGljIFN0cmluZyBnZXROdW1iZXIoKSB7CisgICAgICAgIHJldHVybiBudW1iZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TnVtYmVyKFN0cmluZyBudW1iZXIpIHsKKyAgICAgICAgdGhpcy5udW1iZXIgPSBudW1iZXI7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRBcmVhQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIGFyZWFDb2RlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEFyZWFDb2RlKFN0cmluZyBhcmVhQ29kZSkgeworICAgICAgICB0aGlzLmFyZWFDb2RlID0gYXJlYUNvZGU7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9lbnRpdHktZmlsdGVyaW5nLXNlbGVjdGFibGUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9lbnRpdHlmaWx0ZXJpbmcvc2VsZWN0YWJsZS9yZXNvdXJjZS9QZXJzb25SZXNvdXJjZS5qYXZhIGIvZXhhbXBsZXMvZW50aXR5LWZpbHRlcmluZy1zZWxlY3RhYmxlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZW50aXR5ZmlsdGVyaW5nL3NlbGVjdGFibGUvcmVzb3VyY2UvUGVyc29uUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWJiOGI2Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZW50aXR5LWZpbHRlcmluZy1zZWxlY3RhYmxlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZW50aXR5ZmlsdGVyaW5nL3NlbGVjdGFibGUvcmVzb3VyY2UvUGVyc29uUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmVudGl0eWZpbHRlcmluZy5zZWxlY3RhYmxlLnJlc291cmNlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZW50aXR5ZmlsdGVyaW5nLnNlbGVjdGFibGUuZG9tYWluLkFkZHJlc3M7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZW50aXR5ZmlsdGVyaW5nLnNlbGVjdGFibGUuZG9tYWluLlBlcnNvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5lbnRpdHlmaWx0ZXJpbmcuc2VsZWN0YWJsZS5kb21haW4uUGhvbmVOdW1iZXI7CisKKy8qKgorICogUmVzb3VyY2UgdG8gc3VwcG9ydCBxdWVyeSBwYXJhbWV0ZXIgZHJpdmVuIGVudGl0eSBmaWx0ZXJpbmcuCisgKgorICogQGF1dGhvciBBbmR5IFBlbWJlcnRvbiAocGVtYmVydG9uYSBhdCBnbWFpbC5jb20pCisgKi8KK0BQYXRoKCJwZW9wbGUiKQorQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9qc29uIikKK3B1YmxpYyBjbGFzcyBQZXJzb25SZXNvdXJjZSB7CisKKyAgICBAR0VUCisgICAgQFBhdGgoIntpZH0iKQorICAgIHB1YmxpYyBQZXJzb24gZ2V0UGVyc29uKCkgeworICAgICAgICBmaW5hbCBQZXJzb24gcGVyc29uID0gbmV3IFBlcnNvbigpOworICAgICAgICBwZXJzb24uc2V0R2l2ZW5OYW1lKCJBbmRyZXciKTsKKyAgICAgICAgcGVyc29uLnNldEZhbWlseU5hbWUoIkRvd2QiKTsKKyAgICAgICAgcGVyc29uLnNldEhvbm9yaWZpY1ByZWZpeCgiTXIuIik7CisgICAgICAgIHBlcnNvbi5zZXRIb25vcmlmaWNTdWZmaXgoIlBoRCIpOworICAgICAgICBwZXJzb24uc2V0UmVnaW9uKCIxc3QgTGV2ZWwgUmVnaW9uIik7CisKKyAgICAgICAgZmluYWwgQXJyYXlMaXN0PEFkZHJlc3M+IGFkZHJlc3NlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBwZXJzb24uc2V0QWRkcmVzc2VzKGFkZHJlc3Nlcyk7CisKKyAgICAgICAgZmluYWwgQWRkcmVzcyBhZGRyZXNzID0gbmV3IEFkZHJlc3MoKTsKKyAgICAgICAgYWRkcmVzc2VzLmFkZChhZGRyZXNzKTsKKyAgICAgICAgYWRkcmVzcy5zZXRSZWdpb24oIjJuZCBMZXZlbCBSZWdpb24iKTsKKyAgICAgICAgYWRkcmVzcy5zZXRTdHJlZXRBZGRyZXNzKCIxMjM0IGZha2Ugc3QuIik7CisgICAgICAgIGFkZHJlc3Muc2V0UGhvbmVOdW1iZXIobmV3IFBob25lTnVtYmVyKCkpOworICAgICAgICBhZGRyZXNzLmdldFBob25lTnVtYmVyKCkuc2V0TnVtYmVyKCI4NjctNTMwOSIpOworICAgICAgICBhZGRyZXNzLmdldFBob25lTnVtYmVyKCkuc2V0QXJlYUNvZGUoIjU0MCIpOworCisgICAgICAgIHBlcnNvbi5zZXRQaG9uZU51bWJlcnMobmV3IEhhc2hNYXA8U3RyaW5nLCBQaG9uZU51bWJlcj4oKSk7CisgICAgICAgIGZpbmFsIFBob25lTnVtYmVyIG51bWJlciA9IG5ldyBQaG9uZU51bWJlcigpOworICAgICAgICBudW1iZXIuc2V0QXJlYUNvZGUoIjgwNCIpOworICAgICAgICBudW1iZXIuc2V0TnVtYmVyKCI4NjctNTMwOSIpOworICAgICAgICBwZXJzb24uZ2V0UGhvbmVOdW1iZXJzKCkucHV0KCJIT01FIiwgbnVtYmVyKTsKKworICAgICAgICByZXR1cm4gcGVyc29uOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgie2lkfS9hZGRyZXNzZXMiKQorICAgIHB1YmxpYyBBZGRyZXNzIGdldEFkZHJlc3MoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmdldFBlcnNvbigpLmdldEFkZHJlc3NlcygpLmdldCgwKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9lbnRpdHktZmlsdGVyaW5nLXNlbGVjdGFibGUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9lbnRpdHlmaWx0ZXJpbmcvc2VsZWN0YWJsZS9QZXJzb25SZXNvdXJjZVRlc3QuamF2YSBiL2V4YW1wbGVzL2VudGl0eS1maWx0ZXJpbmctc2VsZWN0YWJsZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2VudGl0eWZpbHRlcmluZy9zZWxlY3RhYmxlL1BlcnNvblJlc291cmNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMGEyNzUKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9lbnRpdHktZmlsdGVyaW5nLXNlbGVjdGFibGUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9lbnRpdHlmaWx0ZXJpbmcvc2VsZWN0YWJsZS9QZXJzb25SZXNvdXJjZVRlc3QuamF2YQpAQCAtMCwwICsxLDE4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5lbnRpdHlmaWx0ZXJpbmcuc2VsZWN0YWJsZTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZW50aXR5ZmlsdGVyaW5nLnNlbGVjdGFibGUuZG9tYWluLkFkZHJlc3M7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZW50aXR5ZmlsdGVyaW5nLnNlbGVjdGFibGUuZG9tYWluLlBlcnNvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5lbnRpdHlmaWx0ZXJpbmcuc2VsZWN0YWJsZS5kb21haW4uUGhvbmVOdW1iZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZW50aXR5ZmlsdGVyaW5nLnNlbGVjdGFibGUucmVzb3VyY2UuUGVyc29uUmVzb3VyY2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamFja3Nvbi5KYWNrc29uRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5TZWxlY3RhYmxlRW50aXR5RmlsdGVyaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb3h5Lmpzb24uTW94eUpzb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLm5vdE51bGxWYWx1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5udWxsVmFsdWU7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICoge0BsaW5rIFBlcnNvblJlc291cmNlfSB1bml0IHRlc3RzLgorICoKKyAqIEBhdXRob3IgQW5keSBQZW1iZXJ0b24gKHBlbWJlcnRvbmEgYXQgZ21haWwuY29tKQorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgUGVyc29uUmVzb3VyY2VUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKG5hbWUgPSAiUHJvdmlkZXI6IHswfSIpCisgICAgcHVibGljIHN0YXRpYyBJdGVyYWJsZTxDbGFzc1tdPiBwcm92aWRlcnMoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBDbGFzc1tdW117e01veHlKc29uRmVhdHVyZS5jbGFzc30sIHtKYWNrc29uRmVhdHVyZS5jbGFzc319KTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIENsYXNzPEZlYXR1cmU+IGZpbHRlcmluZ1Byb3ZpZGVyOworCisgICAgcHVibGljIFBlcnNvblJlc291cmNlVGVzdChmaW5hbCBDbGFzczxGZWF0dXJlPiBmaWx0ZXJpbmdQcm92aWRlcikgeworICAgICAgICBzdXBlcihuZXcgUmVzb3VyY2VDb25maWcoU2VsZWN0YWJsZUVudGl0eUZpbHRlcmluZ0ZlYXR1cmUuY2xhc3MpCisgICAgICAgICAgICAgICAgLnBhY2thZ2VzKCJvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5lbnRpdHlmaWx0ZXJpbmcuc2VsZWN0YWJsZSIpCisgICAgICAgICAgICAgICAgLnByb3BlcnR5KFNlbGVjdGFibGVFbnRpdHlGaWx0ZXJpbmdGZWF0dXJlLlFVRVJZX1BBUkFNX05BTUUsICJzZWxlY3QiKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihmaWx0ZXJpbmdQcm92aWRlcikpOworCisgICAgICAgIHRoaXMuZmlsdGVyaW5nUHJvdmlkZXIgPSBmaWx0ZXJpbmdQcm92aWRlcjsKKworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChmaW5hbCBDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihmaWx0ZXJpbmdQcm92aWRlcik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9GaWx0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUGVyc29uIGVudGl0eSA9IHRhcmdldCgicGVvcGxlIikucGF0aCgiMTIzNCIpLnJlcXVlc3QoKS5nZXQoUGVyc29uLmNsYXNzKTsKKworICAgICAgICAvLyBOb3QgbnVsbCB2YWx1ZXMuCisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmdldEZhbWlseU5hbWUoKSwgbm90TnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXRHaXZlbk5hbWUoKSwgbm90TnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXRIb25vcmlmaWNQcmVmaXgoKSwgbm90TnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXRIb25vcmlmaWNTdWZmaXgoKSwgbm90TnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXRSZWdpb24oKSwgbm90TnVsbFZhbHVlKCkpOworCisgICAgICAgIGZpbmFsIExpc3Q8QWRkcmVzcz4gYWRkcmVzc2VzID0gZW50aXR5LmdldEFkZHJlc3NlcygpOworICAgICAgICBhc3NlcnRUaGF0KGFkZHJlc3Nlcywgbm90TnVsbFZhbHVlKCkpOworICAgICAgICBmaW5hbCBBZGRyZXNzIGFkZHJlc3MgPSBhZGRyZXNzZXMuZ2V0KDApOworICAgICAgICBhc3NlcnRUaGF0KGFkZHJlc3MsIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChhZGRyZXNzLmdldFJlZ2lvbigpLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoYWRkcmVzcy5nZXRTdHJlZXRBZGRyZXNzKCksIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgUGhvbmVOdW1iZXIgcGhvbmVOdW1iZXIgPSBhZGRyZXNzLmdldFBob25lTnVtYmVyKCk7CisgICAgICAgIGFzc2VydFRoYXQocGhvbmVOdW1iZXIsIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChwaG9uZU51bWJlci5nZXRBcmVhQ29kZSgpLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQocGhvbmVOdW1iZXIuZ2V0TnVtYmVyKCksIG5vdE51bGxWYWx1ZSgpKTsKKworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBQaG9uZU51bWJlcj4gcGhvbmVOdW1iZXJzID0gZW50aXR5LmdldFBob25lTnVtYmVycygpOworICAgICAgICBhc3NlcnRUaGF0KHBob25lTnVtYmVycywgbm90TnVsbFZhbHVlKCkpOworCisgICAgICAgIC8vIFRPRE86IGVuYWJsZSBmb3IgTU9YeSBhcyB3ZWxsIHdoZW4gSkVSU0VZLTI3NTEgZ2V0cyBmaXhlZC4KKyAgICAgICAgaWYgKEphY2tzb25GZWF0dXJlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oZmlsdGVyaW5nUHJvdmlkZXIpKSB7CisgICAgICAgICAgICBwaG9uZU51bWJlciA9IHBob25lTnVtYmVycy5nZXQoIkhPTUUiKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQocGhvbmVOdW1iZXIsIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQocGhvbmVOdW1iZXIuZ2V0QXJlYUNvZGUoKSwgbm90TnVsbFZhbHVlKCkpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChwaG9uZU51bWJlci5nZXROdW1iZXIoKSwgbm90TnVsbFZhbHVlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZEZpbHRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBQZXJzb24gZW50aXR5ID0gdGFyZ2V0KCJwZW9wbGUiKS5wYXRoKCIxMjM0IikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgic2VsZWN0IiwgImludmFsaWQiKS5yZXF1ZXN0KCkuZ2V0KFBlcnNvbi5jbGFzcyk7CisKKyAgICAgICAgLy8gQWxsIG51bGwgdmFsdWVzLgorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXRGYW1pbHlOYW1lKCksIG51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0R2l2ZW5OYW1lKCksIG51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0SG9ub3JpZmljUHJlZml4KCksIG51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0SG9ub3JpZmljU3VmZml4KCksIG51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0UmVnaW9uKCksIG51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0QWRkcmVzc2VzKCksIG51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0UGhvbmVOdW1iZXJzKCksIG51bGxWYWx1ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGZpcnN0IGxldmVsIGZpbHRlcnMuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsdGVycygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBQZXJzb24gZW50aXR5ID0gdGFyZ2V0KCJwZW9wbGUiKS5wYXRoKCIxMjM0IikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgic2VsZWN0IiwgImZhbWlseU5hbWUsZ2l2ZW5OYW1lIikucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLmdldChQZXJzb24uY2xhc3MpOworCisgICAgICAgIC8vIE5vdCBudWxsIHZhbHVlcy4KKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0RmFtaWx5TmFtZSgpLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmdldEdpdmVuTmFtZSgpLCBub3ROdWxsVmFsdWUoKSk7CisKKyAgICAgICAgLy8gTnVsbCB2YWx1ZXMuCisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmdldEFkZHJlc3NlcygpLCBudWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmdldFBob25lTnVtYmVycygpLCBudWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmdldFJlZ2lvbigpLCBudWxsVmFsdWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCAybmQgYW5kIDNyZCBsZXZlbCBmaWx0ZXJzLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN1YkZpbHRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUGVyc29uIGVudGl0eSA9IHRhcmdldCgicGVvcGxlIikKKyAgICAgICAgICAgICAgICAucGF0aCgiMTIzNCIpCisgICAgICAgICAgICAgICAgLnF1ZXJ5UGFyYW0oInNlbGVjdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiZmFtaWx5TmFtZSxnaXZlbk5hbWUsYWRkcmVzc2VzLnN0cmVldEFkZHJlc3MsYWRkcmVzc2VzLnBob25lTnVtYmVyLmFyZWFDb2RlIikKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpLmdldChQZXJzb24uY2xhc3MpOworCisgICAgICAgIC8vIE5vdCBudWxsIHZhbHVlcy4KKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0RmFtaWx5TmFtZSgpLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmdldEdpdmVuTmFtZSgpLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmdldEFkZHJlc3NlcygpLmdldCgwKS5nZXRTdHJlZXRBZGRyZXNzKCksIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0QWRkcmVzc2VzKCkuZ2V0KDApLmdldFBob25lTnVtYmVyKCkuZ2V0QXJlYUNvZGUoKSwgbm90TnVsbFZhbHVlKCkpOworCisgICAgICAgIC8vIE51bGwgdmFsdWVzLgorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXRSZWdpb24oKSwgbnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXRBZGRyZXNzZXMoKS5nZXQoMCkuZ2V0UGhvbmVOdW1iZXIoKS5nZXROdW1iZXIoKSwgbnVsbFZhbHVlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCAxc3QgYW5kIDJuZCBsZXZlbCBmaWx0ZXJzIHdpdGggdGhlIHNhbWUgbmFtZSBhY3QgYXMgZXhwZWN0ZWQuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsdGVyc1NhbWVOYW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFBlcnNvbiBmaXJzdExldmVsID0gdGFyZ2V0KCJwZW9wbGUiKS5wYXRoKCIxMjM0IikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgic2VsZWN0IiwgImZhbWlseU5hbWUscmVnaW9uIikucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLmdldChQZXJzb24uY2xhc3MpOworICAgICAgICBmaW5hbCBQZXJzb24gc2Vjb25kTGV2ZWwgPSB0YXJnZXQoInBlb3BsZSIpLnBhdGgoIjEyMzQiKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJzZWxlY3QiLCAiZmFtaWx5TmFtZSxhZGRyZXNzZXMucmVnaW9uIikucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLmdldChQZXJzb24uY2xhc3MpOworCisgICAgICAgIC8vIE5vdCBudWxsIHZhbHVlcy4KKyAgICAgICAgYXNzZXJ0VGhhdChmaXJzdExldmVsLmdldFJlZ2lvbigpLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoc2Vjb25kTGV2ZWwuZ2V0QWRkcmVzc2VzKCkuZ2V0KDApLmdldFJlZ2lvbigpLCBub3ROdWxsVmFsdWUoKSk7CisKKyAgICAgICAgLy8gTnVsbCB2YWx1ZXMuCisgICAgICAgIGFzc2VydFRoYXQoZmlyc3RMZXZlbC5nZXRBZGRyZXNzZXMoKSwgbnVsbFZhbHVlKCkpOyAvL2NvbmZpcm1zIDJuZCBsZXZlbCByZWdpb24gb24gYWRkcmVzc2VzIGlzIG51bGwKKyAgICAgICAgYXNzZXJ0VGhhdChzZWNvbmRMZXZlbC5nZXRSZWdpb24oKSwgbnVsbFZhbHVlKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZW50aXR5LWZpbHRlcmluZy9SRUFETUUuTUQgYi9leGFtcGxlcy9lbnRpdHktZmlsdGVyaW5nL1JFQURNRS5NRApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmMyNTM5Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZW50aXR5LWZpbHRlcmluZy9SRUFETUUuTUQKQEAgLTAsMCArMSwxMTQgQEAKK1svL106ICMgIiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIgorWy8vXTogIyAiICIKK1svL106ICMgIiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgIgorWy8vXTogIyAiIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0ICIKK1svL106ICMgIiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuICIKK1svL106ICMgIiAiCitbLy9dOiAjICIgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZSAiCisKK0VudGl0eSBEYXRhIEZpbHRlcmluZworPT09PT09PT09PT09PT09PT09PT09CisKKyMjIyAqRW50aXR5IERhdGEgRmlsdGVyaW5nIFVzaW5nIGN1c3RvbSBhbm5vdGF0aW9ucyB0byBmaWx0ZXIgZW50aXRpZXMqCisKK1RoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIGRlZmluZSBjdXN0b20gZW50aXR5IGZpbHRlcmluZworYW5ub3RhdGlvbnMgKHZpZXdzKSBhbmQgaG93IHRvIGFwcGx5IHRoZW0gb24gZG9tYWluIGNsYXNzZXMgYXMgd2VsbCBhcworb24gSkFYLVJTIHJlc291cmNlIGNsYXNzZXMgb3IgSkFYLVJTIHJlc291cmNlIG1ldGhvZHMuCisKK1RoZSBmdWxsIGRlc2NyaXB0aW9uIGhvdyBFbnRpdHkgRGF0YSBGaWx0ZXJpbmcgY2FuIGJlIGZvdW5kIGluIEplcnNleSBVc2VyIEd1aWRlLCBjaGFwdGVyCitbRW50aXR5IERhdGEgRmlsdGVyaW5nXShodHRwczovL2plcnNleS5qYXZhLm5ldC9kb2N1bWVudGF0aW9uL2xhdGVzdC9lbnRpdHktZmlsdGVyaW5nLmh0bWwpLgorU2VjdGlvbnMgcmVsZXZhbnQgdG8gdGhpcyBleGFtcGxlIChkZXNjcmliaW5nIHRoaXMgZXhhY3QgZXhhbXBsZSkgYXJlOgorCistICAgW0VuYWJsaW5nIGFuZCBjb25maWd1cmluZyBFbnRpdHkgRmlsdGVyaW5nIGluIHlvdXIgYXBwbGljYXRpb25dKGh0dHBzOi8vamVyc2V5LmphdmEubmV0L2RvY3VtZW50YXRpb24vbGF0ZXN0L2VudGl0eS1maWx0ZXJpbmcuaHRtbCNkMGUxMzkxMSkKKy0gICBbQ29tcG9uZW50cyB1c2VkIHRvIGRlc2NyaWJlIEVudGl0eSBGaWx0ZXJpbmcgY29uY2VwdHNdKGh0dHBzOi8vamVyc2V5LmphdmEubmV0L2RvY3VtZW50YXRpb24vbGF0ZXN0L2VudGl0eS1maWx0ZXJpbmcuaHRtbCNkMGUxNDAyNCkKKy0gICBbVXNpbmcgY3VzdG9tIGFubm90YXRpb25zIHRvIGZpbHRlciBlbnRpdGllc10oaHR0cHM6Ly9qZXJzZXkuamF2YS5uZXQvZG9jdW1lbnRhdGlvbi9sYXRlc3QvZW50aXR5LWZpbHRlcmluZy5odG1sI2VmLmFubm90YXRpb25zKQorCitDb250ZW50cworLS0tLS0tLS0KKworVGhlIG1hcHBpbmcgb2YgdGhlIFVSSSBwYXRoIHNwYWNlIGlzIHByZXNlbnRlZCBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOgorCitVUkkgcGF0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBSZXNvdXJjZSBjbGFzcyAgICAgfCBIVFRQIG1ldGhvZHMgICB8IEFsbG93ZWQgdmFsdWVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgfCAtLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0KKyoqXy9wcm9qZWN0cy97aWR9XyoqICAgICAgICAgICAgICAgICAgICAgICB8IFByb2plY3RzUmVzb3VyY2UgICB8IEdFVCAgICAgICAgICAgIHwgaW50CisqKl8vcHJvamVjdHNfKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBQcm9qZWN0c1Jlc291cmNlICAgfCBHRVQgICAgICAgICAgICB8IE4vQQorKipfL3Byb2plY3RzL2RldGFpbGVkL3tpZH1fKiogICAgICAgICAgICAgIHwgUHJvamVjdHNSZXNvdXJjZSAgIHwgR0VUICAgICAgICAgICAgfCBpbnQKKyoqXy9wcm9qZWN0cy9kZXRhaWxlZF8qKiAgICAgICAgICAgICAgICAgICB8IFByb2plY3RzUmVzb3VyY2UgICB8IEdFVCAgICAgICAgICAgIHwgTi9BCisqKl8vdGFza3Mve2lkfT9kZXRhaWxlZD17dHJ1ZVx8ZmFsc2V9XyoqICAgfCBUYXNrc1Jlc291cmNlICAgICAgfCBHRVQgICAgICAgICAgICB8IGludCwgYm9vbGVhbgorKipfL3Rhc2tzXyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVGFza3NSZXNvdXJjZSAgICAgIHwgR0VUICAgICAgICAgICAgfCBOL0EKKyoqXy90YXNrcy9kZXRhaWxlZF8qKiAgICAgICAgICAgICAgICAgICAgICB8IFRhc2tzUmVzb3VyY2UgICAgICB8IEdFVCAgICAgICAgICAgIHwgTi9BCisqKl8vdXNlcnMve2lkfT9kZXRhaWxlZD17dHJ1ZVx8ZmFsc2V9XyoqICAgfCBVc2Vyc1Jlc291cmNlICAgICAgfCBHRVQgICAgICAgICAgICB8IGludCwgYm9vbGVhbgorKipfL3Rhc2tzP2RldGFpbGVkPXt0cnVlXHxmYWxzZX1fKiogICAgICAgIHwgVXNlcnNSZXNvdXJjZSAgICAgIHwgR0VUICAgICAgICAgICAgfCBOL0EKKworQXBwbGljYXRpb24gaXMgYmFzZWQgb24gR3JpenpseSBjb250YWluZXIgKHNlZSBgQXBwYCkuIEV2ZXJ5dGhpbmcgbmVlZGVkCisocmVzb3VyY2VzL3Byb3ZpZGVycykgaXMgcmVnaXN0ZXJlZCBpbiBgRW50aXR5RmlsdGVyaW5nQXBwbGljYXRpb25gLgorCitTYW1wbGUgUmVzcG9uc2UKKy0tLS0tLS0tLS0tLS0tLQorCitFdmVuIHRob3VnaCB0aGUgc2FtZSBpbnN0YW5jZSBvZiwgZS5nLiBQcm9qZWN0IGNsYXNzLCBpcyB1c2VkIHRvIGNyZWF0ZQorcmVzcG9uc2UgZm9yIGJvdGggYmFzaWMgYW5kIGRldGFpbGVkIHZpZXcgdGhlIGFjdHVhbCBkYXRhIHNlbnQgb3ZlciB0aGUKK3dpcmUgZGlmZmVyIGZvciBlYWNoIG9mIHRoZXNlIHR3byB2aWV3cy4gRm9yIGJhc2ljIHZpZXcgaXQgbG9va3MgbGlrZToKKworYGBgamF2YXNjcmlwdAoreworICAgImRlc2NyaXB0aW9uIiA6ICJKZXJzZXkgaXMgdGhlIG9wZW4gc291cmNlICh1bmRlciBkdWFsIEVQTCtHUEwgbGljZW5zZSkgSkFYLVJTIDIuMSAoSlNSIDM3MCkgcHJvZHVjdGlvbiBxdWFsaXR5IFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiBmb3IgYnVpbGRpbmcgUkVTVGZ1bCBXZWIgc2VydmljZXMuIiwKKyAgICJpZCIgOiAxLAorICAgIm5hbWUiIDogIkplcnNleSIKK30KK2BgYAorCitBbmQgZm9yIGRldGFpbGVkIHZpZXcgaXQgbG9va3MgbGlrZToKKworYGBgamF2YXNjcmlwdAoreworICAgImRlc2NyaXB0aW9uIiA6ICJKZXJzZXkgaXMgdGhlIG9wZW4gc291cmNlICh1bmRlciBkdWFsIEVQTCtHUEwgbGljZW5zZSkgSkFYLVJTIDIuMSAoSlNSIDM3MCkgcHJvZHVjdGlvbiBxdWFsaXR5IFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiBmb3IgYnVpbGRpbmcgUkVTVGZ1bCBXZWIgc2VydmljZXMuIiwKKyAgICJpZCIgOiAxLAorICAgIm5hbWUiIDogIkplcnNleSIsCisgICAidGFza3MiIDogWyB7CisgICAgICAiZGVzY3JpcHRpb24iIDogIkVudGl0eSBEYXRhIEZpbHRlcmluZyIsCisgICAgICAiaWQiIDogMSwKKyAgICAgICJuYW1lIiA6ICJFTlRfRkxUIgorICAgfSwgeworICAgICAgImRlc2NyaXB0aW9uIiA6ICJPQXV0aCAxICsgMiIsCisgICAgICAiaWQiIDogMiwKKyAgICAgICJuYW1lIiA6ICJPQVVUSCIKKyAgIH0gXSwKKyAgICJ1c2VycyIgOiBbIHsKKyAgICAgICJlbWFpbCIgOiAidmVyeUBzZWNyZXQuY29tIiwKKyAgICAgICJpZCIgOiAxLAorICAgICAgIm5hbWUiIDogIkplcnNleSBSb2JvdCIKKyAgIH0gXQorfQorYGBgCisKK1J1bm5pbmcgdGhlIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworUnVuIHRoZSBleGFtcGxlIGFzIGZvbGxvd3M6CisKKz4gICAgIG12biBjbGVhbiBwYWNrYWdlIGV4ZWM6amF2YQorCitUaGlzIGRlcGxveXMgY3VycmVudCBleGFtcGxlIHVzaW5nIEdyaXp6bHkuIFlvdSBjYW4gYWNjZXNzIHRoZQorYXBwbGljYXRpb24gYXQ6CisKKy0gICA8aHR0cDovL2xvY2FsaG9zdDo4MDgwL3Byb2plY3RzPgorLSAgIDxodHRwOi8vbG9jYWxob3N0OjgwODAvcHJvamVjdHMvZGV0YWlsZWQ+CistICAgPGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC91c2Vycz4KKy0gICA8aHR0cDovL2xvY2FsaG9zdDo4MDgwL3VzZXJzP2RldGFpbGVkPXRydWU+CistICAgPGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC90YXNrcz4KKy0gICA8aHR0cDovL2xvY2FsaG9zdDo4MDgwL3Rhc2tzL2RldGFpbGVkPgorCitVc2luZyBKYWNrc29uIGluc3RlYWQgb2YgTU9YeQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhpcyBleGFtcGxlcyB1c2VzIGJ5IGRlZmF1bHQgRW50aXR5IERhdGEgRmlsdGVyaW5nIGZlYXR1cmUgdG9nZXRoZXIKK3dpdGggTU9YeS4gVG8gc3dpdGNoIE1PWHkgSlNPTiBwcm92aWRlciB0byBKYWNrc29uICgyLngpIEpTT04gcHJvdmlkZXIKK3NpbXBseQorCistICAgY29tbWVudCByZWdpc3RyYXRpb24gb2YgTU9YeSBDb250ZXh0UmVzb2x2ZXIsIGFuZFwKKyAgICAgYHJlZ2lzdGVyKG5ldyBNb3h5SnNvbkNvbmZpZygpLnNldEZvcm1hdHRlZE91dHB1dCh0cnVlKS5yZXNvbHZlcigpKWAKKy0gICB1bmNvbW1lbnQgcmVnaXN0cmF0aW9uIG9mIEphY2tzb25GZWF0dXJlXAorICAgICBgcmVnaXN0ZXIoSmFja3NvbkZlYXR1cmUuY2xhc3MpYAorCitpbiBgRW50aXR5RmlsdGVyaW5nQXBwbGljYXRpb25gIGNsYXNzLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZW50aXR5LWZpbHRlcmluZy9wb20ueG1sIGIvZXhhbXBsZXMvZW50aXR5LWZpbHRlcmluZy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNGY2MTUKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9lbnRpdHktZmlsdGVyaW5nL3BvbS54bWwKQEAgLTAsMCArMSw5MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKworICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+ZW50aXR5LWZpbHRlcmluZzwvYXJ0aWZhY3RJZD4KKyAgICA8bmFtZT5qZXJzZXktZXhhbXBsZXMtZW50aXR5LWZpbHRlcmluZzwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgRW50aXR5IERhdGEgRmlsdGVyaW5nIEV4YW1wbGUuPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1zZXJ2ZXI8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1ncml6emx5Mi1odHRwPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWVudGl0eS1maWx0ZXJpbmc8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktaGsyPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtbW94eTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLWpzb24tamFja3NvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItYnVuZGxlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHR5cGU+cG9tPC90eXBlPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPCEtLSBSdW4gdGhlIGFwcGxpY2F0aW9uIHVzaW5nICJtdm4gZXhlYzpqYXZhIiAtLT4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhlYy1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxtYWluQ2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZW50aXR5ZmlsdGVyaW5nLkFwcDwvbWFpbkNsYXNzPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+cmVsZWFzZTwvaWQ+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICA8L3Byb2ZpbGVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZW50aXR5ZmlsdGVyaW5nL0FwcC5qYXZhIGIvZXhhbXBsZXMvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2VudGl0eWZpbHRlcmluZy9BcHAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2RiOTVmCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2VudGl0eWZpbHRlcmluZy9BcHAuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmVudGl0eWZpbHRlcmluZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkyLmh0dHBzZXJ2ZXIuR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5ncml6emx5Lmh0dHAuc2VydmVyLkh0dHBTZXJ2ZXI7CisKKy8qKgorICogSmF2YSBhcHBsaWNhdGlvbiBjbGFzcyBzdGFydGluZyBHcml6emx5MiBzZXJ2ZXIgd2l0aCBFbnRpdHkgRGF0YSBGaWx0ZXJpbmcgYXBwIGRlcGxveWVkLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgZmluYWwgY2xhc3MgQXBwIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVSSSBCQVNFX1VSSSA9IFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8iKTsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSmVyc2V5IEVudGl0eSBEYXRhIEZpbHRlcmluZyBFeGFtcGxlLiIpOworCisgICAgICAgICAgICBmaW5hbCBIdHRwU2VydmVyIHNlcnZlciA9IEdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeQorICAgICAgICAgICAgICAgICAgICAuY3JlYXRlSHR0cFNlcnZlcihCQVNFX1VSSSwgbmV3IEVudGl0eUZpbHRlcmluZ0FwcGxpY2F0aW9uKCksIGZhbHNlKTsKKyAgICAgICAgICAgIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmFkZFNodXRkb3duSG9vayhuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHNlcnZlci5zaHV0ZG93bk5vdygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pKTsKKyAgICAgICAgICAgIHNlcnZlci5zdGFydCgpOworCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFwcGxpY2F0aW9uIHN0YXJ0ZWQuXG5Ucnkgb3V0IG9uZSBvZiB0aGVzZSBVUklzOiIpOworICAgICAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgcGF0aCA6IG5ldyBTdHJpbmdbXXsicHJvamVjdHMiLCAicHJvamVjdHMvZGV0YWlsZWQiLCAidXNlcnMiLCAidXNlcnM/ZGV0YWlsZWQ9dHJ1ZSIsICJ0YXNrcyIsCisgICAgICAgICAgICAgICAgICAgICJ0YXNrcy9kZXRhaWxlZCJ9KSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKEJBU0VfVVJJICsgcGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0b3AgdGhlIGFwcGxpY2F0aW9uIHVzaW5nIENUUkwrQyIpOworCisgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gfCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihBcHAuY2xhc3MuZ2V0TmFtZSgpKQorICAgICAgICAgICAgICAgICAgICAubG9nKExldmVsLlNFVkVSRSwgIkkvTyBlcnJvciBvY2N1cnJlZCBkdXJpbmcgcmVhZGluZyBmcm9tIGFuIHN5c3RlbSBpbnB1dCBzdHJlYW0uIiwgZXgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2VudGl0eWZpbHRlcmluZy9FbnRpdHlGaWx0ZXJpbmdBcHBsaWNhdGlvbi5qYXZhIGIvZXhhbXBsZXMvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2VudGl0eWZpbHRlcmluZy9FbnRpdHlGaWx0ZXJpbmdBcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5OGM1ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZW50aXR5ZmlsdGVyaW5nL0VudGl0eUZpbHRlcmluZ0FwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5lbnRpdHlmaWx0ZXJpbmc7CisKK2ltcG9ydCBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGg7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uLkphY2tzb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLkVudGl0eUZpbHRlcmluZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW94eS5qc29uLk1veHlKc29uQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworLyoqCisgKiBFbnRpdHkgRGF0YSBGaWx0ZXJpbmcgYXBwbGljYXRpb24uCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BBcHBsaWNhdGlvblBhdGgoIi8iKQorcHVibGljIGNsYXNzIEVudGl0eUZpbHRlcmluZ0FwcGxpY2F0aW9uIGV4dGVuZHMgUmVzb3VyY2VDb25maWcgeworCisgICAgcHVibGljIEVudGl0eUZpbHRlcmluZ0FwcGxpY2F0aW9uKCkgeworICAgICAgICAvLyBSZWdpc3RlciBhbGwgcmVzb3VyY2VzIHByZXNlbnQgdW5kZXIgdGhlIHBhY2thZ2UuCisgICAgICAgIHBhY2thZ2VzKCJvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5lbnRpdHlmaWx0ZXJpbmciKTsKKworICAgICAgICAvLyBFbnRpdHkgRGF0YSBGaWx0ZXJpbmcgZmVhdHVyZS4KKyAgICAgICAgcmVnaXN0ZXIoRW50aXR5RmlsdGVyaW5nRmVhdHVyZS5jbGFzcyk7CisKKyAgICAgICAgLy8gQ29uZmlndXJlIE1PWHkgSnNvbiBwcm92aWRlci4gQ29tbWVudCB0aGlzIGxpbmUgdG8gdXNlIEphY2tzb24uIFVuY29tbWVudCB0byB1c2UgTU9YeS4KKyAgICAgICAgcmVnaXN0ZXIobmV3IE1veHlKc29uQ29uZmlnKCkuc2V0Rm9ybWF0dGVkT3V0cHV0KHRydWUpLnJlc29sdmVyKCkpOworCisgICAgICAgIC8vIENvbmZpZ3VyZSBKYWNrc29uIEpzb24gcHJvdmlkZXIuIENvbW1lbnQgdGhpcyBsaW5lIHRvIHVzZSBNT1h5LiBVbmNvbW1lbnQgdG8gdXNlIEphY2tzb24uCisgICAgICAgIC8vIHJlZ2lzdGVyKEphY2tzb25GZWF0dXJlLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZW50aXR5ZmlsdGVyaW5nL2RvbWFpbi9FbnRpdHlTdG9yZS5qYXZhIGIvZXhhbXBsZXMvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2VudGl0eWZpbHRlcmluZy9kb21haW4vRW50aXR5U3RvcmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDk5ZWRhCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2VudGl0eWZpbHRlcmluZy9kb21haW4vRW50aXR5U3RvcmUuamF2YQpAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5lbnRpdHlmaWx0ZXJpbmcuZG9tYWluOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIEVudGl0eS1zdG9yZSB1dGlsaXR5IGNsYXNzLiBDbGFzcyBjcmVhdGVzIGEgc2FtcGxlIGluc3RhbmNlIG9mIGVhY2ggZW50aXR5LgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAU3VwcHJlc3NXYXJuaW5ncyh7IkphdmFEb2MiLCAiVW51c2VkRGVjbGFyYXRpb24ifSkKK3B1YmxpYyBmaW5hbCBjbGFzcyBFbnRpdHlTdG9yZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8TG9uZywgUHJvamVjdD4gUFJPSkVDVFMgPSBuZXcgTGlua2VkSGFzaE1hcDw+KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPExvbmcsIFVzZXI+IFVTRVJTID0gbmV3IExpbmtlZEhhc2hNYXA8PigpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxMb25nLCBUYXNrPiBUQVNLUyA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIC8vIFByb2plY3RzLgorICAgICAgICBmaW5hbCBQcm9qZWN0IHByb2plY3QgPSBjcmVhdGVQcm9qZWN0KCJKZXJzZXkiLCAiSmVyc2V5IGlzIHRoZSBvcGVuIHNvdXJjZSAodW5kZXIgZHVhbCBFUEwrR1BMIGxpY2Vuc2UpIEpBWC1SUyAyLjEgIgorICAgICAgICAgICAgICAgICsgIihKU1IgMzcwKSBwcm9kdWN0aW9uIHF1YWxpdHkgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uIGZvciBidWlsZGluZyBSRVNUZnVsIFdlYiBzZXJ2aWNlcy4iKTsKKworICAgICAgICAvLyBVc2Vycy4KKyAgICAgICAgZmluYWwgVXNlciByb2JvdCA9IGNyZWF0ZVVzZXIoIkplcnNleSBSb2JvdCIsICJ2ZXJ5QHNlY3JldC5jb20iKTsKKworICAgICAgICAvLyBUYXNrcy4KKyAgICAgICAgZmluYWwgVGFzayBmaWx0ZXJpbmcgPSBjcmVhdGVUYXNrKCJFTlRfRkxUIiwgIkVudGl0eSBEYXRhIEZpbHRlcmluZyIpOworICAgICAgICBmaW5hbCBUYXNrIG9hdXRoID0gY3JlYXRlVGFzaygiT0FVVEgiLCAiT0F1dGggMSArIDIiKTsKKworICAgICAgICAvLyBQcm9qZWN0IC0+IFVzZXJzLCBUYXNrcy4KKyAgICAgICAgYWRkKHByb2plY3QsIHJvYm90KTsKKyAgICAgICAgZmlsdGVyaW5nLnNldFByb2plY3QocHJvamVjdCk7CisgICAgICAgIG9hdXRoLnNldFByb2plY3QocHJvamVjdCk7CisKKyAgICAgICAgLy8gVXNlcnMgLT4gUHJvamVjdHMsIFRhc2tzLgorICAgICAgICBhZGQocm9ib3QsIHByb2plY3QpOworICAgICAgICBmaWx0ZXJpbmcuc2V0VXNlcihyb2JvdCk7CisgICAgICAgIG9hdXRoLnNldFVzZXIocm9ib3QpOworCisgICAgICAgIC8vIFRhc2tzIC0+IFByb2plY3RzLCBVc2Vycy4KKyAgICAgICAgYWRkKGZpbHRlcmluZywgcHJvamVjdCk7CisgICAgICAgIGFkZChvYXV0aCwgcHJvamVjdCk7CisgICAgICAgIGFkZChmaWx0ZXJpbmcsIHJvYm90KTsKKyAgICAgICAgYWRkKG9hdXRoLCByb2JvdCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZChmaW5hbCBQcm9qZWN0IHByb2plY3QsIGZpbmFsIFVzZXIgdXNlcikgeworICAgICAgICB1c2VyLmdldFByb2plY3RzKCkuYWRkKHByb2plY3QpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGQoZmluYWwgVXNlciB1c2VyLCBmaW5hbCBQcm9qZWN0IHByb2plY3QpIHsKKyAgICAgICAgcHJvamVjdC5nZXRVc2VycygpLmFkZCh1c2VyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkKGZpbmFsIFRhc2sgdGFzaywgZmluYWwgVXNlciB1c2VyKSB7CisgICAgICAgIHVzZXIuZ2V0VGFza3MoKS5hZGQodGFzayk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZChmaW5hbCBUYXNrIHRhc2ssIGZpbmFsIFByb2plY3QgcHJvamVjdCkgeworICAgICAgICBwcm9qZWN0LmdldFRhc2tzKCkuYWRkKHRhc2spOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUHJvamVjdCBjcmVhdGVQcm9qZWN0KGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZVByb2plY3QobmFtZSwgZGVzY3JpcHRpb24sIG51bGwsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUHJvamVjdCBjcmVhdGVQcm9qZWN0KGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24sIGZpbmFsIExpc3Q8VXNlcj4gdXNlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxUYXNrPiB0YXNrcykgeworICAgICAgICBmaW5hbCBQcm9qZWN0IHByb2plY3QgPSBuZXcgUHJvamVjdChQUk9KRUNUUy5zaXplKCkgKyAxTCwgbmFtZSwgZGVzY3JpcHRpb24pOworCisgICAgICAgIHByb2plY3Quc2V0VGFza3ModGFza3MgPT0gbnVsbCA/IG5ldyBBcnJheUxpc3Q8VGFzaz4oKSA6IHRhc2tzKTsKKyAgICAgICAgcHJvamVjdC5zZXRVc2Vycyh1c2VycyA9PSBudWxsID8gbmV3IEFycmF5TGlzdDxVc2VyPigpIDogdXNlcnMpOworICAgICAgICBQUk9KRUNUUy5wdXQocHJvamVjdC5nZXRJZCgpLCBwcm9qZWN0KTsKKworICAgICAgICByZXR1cm4gcHJvamVjdDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFVzZXIgY3JlYXRlVXNlcihmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIGVtYWlsKSB7CisgICAgICAgIHJldHVybiBjcmVhdGVVc2VyKG5hbWUsIGVtYWlsLCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFVzZXIgY3JlYXRlVXNlcihmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIGVtYWlsLCBmaW5hbCBMaXN0PFByb2plY3Q+IHByb2plY3RzLCBmaW5hbCBMaXN0PFRhc2s+IHRhc2tzKSB7CisgICAgICAgIGZpbmFsIFVzZXIgdXNlciA9IG5ldyBVc2VyKFVTRVJTLnNpemUoKSArIDFMLCBuYW1lLCBlbWFpbCk7CisKKyAgICAgICAgdXNlci5zZXRQcm9qZWN0cyhwcm9qZWN0cyA9PSBudWxsID8gbmV3IEFycmF5TGlzdDxQcm9qZWN0PigpIDogcHJvamVjdHMpOworICAgICAgICB1c2VyLnNldFRhc2tzKHRhc2tzID09IG51bGwgPyBuZXcgQXJyYXlMaXN0PFRhc2s+KCkgOiB0YXNrcyk7CisgICAgICAgIFVTRVJTLnB1dCh1c2VyLmdldElkKCksIHVzZXIpOworCisgICAgICAgIHJldHVybiB1c2VyOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVGFzayBjcmVhdGVUYXNrKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZVRhc2sobmFtZSwgZGVzY3JpcHRpb24sIG51bGwsIG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgVGFzayBjcmVhdGVUYXNrKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24sIGZpbmFsIFByb2plY3QgcHJvamVjdCwgZmluYWwgVXNlciB1c2VyKSB7CisgICAgICAgIGZpbmFsIFRhc2sgdGFzayA9IG5ldyBUYXNrKFRBU0tTLnNpemUoKSArIDFMLCBuYW1lLCBkZXNjcmlwdGlvbik7CisKKyAgICAgICAgdGFzay5zZXRQcm9qZWN0KHByb2plY3QpOworICAgICAgICB0YXNrLnNldFVzZXIodXNlcik7CisgICAgICAgIFRBU0tTLnB1dCh0YXNrLmdldElkKCksIHRhc2spOworCisgICAgICAgIHJldHVybiB0YXNrOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUHJvamVjdCBnZXRQcm9qZWN0KGZpbmFsIExvbmcgaWQpIHsKKyAgICAgICAgcmV0dXJuIFBST0pFQ1RTLmdldChpZCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBVc2VyIGdldFVzZXIoZmluYWwgTG9uZyBpZCkgeworICAgICAgICByZXR1cm4gVVNFUlMuZ2V0KGlkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFRhc2sgZ2V0VGFzayhmaW5hbCBMb25nIGlkKSB7CisgICAgICAgIHJldHVybiBUQVNLUy5nZXQoaWQpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxQcm9qZWN0PiBnZXRQcm9qZWN0cygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8PihQUk9KRUNUUy52YWx1ZXMoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBMaXN0PFVzZXI+IGdldFVzZXJzKCkgeworICAgICAgICByZXR1cm4gbmV3IEFycmF5TGlzdDw+KFVTRVJTLnZhbHVlcygpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8VGFzaz4gZ2V0VGFza3MoKSB7CisgICAgICAgIHJldHVybiBuZXcgQXJyYXlMaXN0PD4oVEFTS1MudmFsdWVzKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByZXZlbnQgaW5zdGFudGlhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIEVudGl0eVN0b3JlKCkgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9lbnRpdHlmaWx0ZXJpbmcvZG9tYWluL1Byb2plY3QuamF2YSBiL2V4YW1wbGVzL2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9lbnRpdHlmaWx0ZXJpbmcvZG9tYWluL1Byb2plY3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTMzZWE5Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2VudGl0eWZpbHRlcmluZy9kb21haW4vUHJvamVjdC5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZW50aXR5ZmlsdGVyaW5nLmRvbWFpbjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmVudGl0eWZpbHRlcmluZy5maWx0ZXJpbmcuUHJvamVjdERldGFpbGVkVmlldzsKKworLyoqCisgKiBQcm9qZWN0IGVudGl0eSBjbGFzcy4gRmllbGRzIHtAY29kZSB0YXNrc30gYW5kIHtAY29kZSB1c2Vyc30gYXJlIGF2YWlsYWJsZSBvbmx5IGluIGRldGFpbGVkIHZpZXcgKGRlZmluZWQgdmlhCisgKiB7QGxpbmsgUHJvamVjdERldGFpbGVkVmlld30pLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAU3VwcHJlc3NXYXJuaW5ncyh7IkphdmFEb2MiLCAiVW51c2VkRGVjbGFyYXRpb24ifSkKK0BYbWxSb290RWxlbWVudAorcHVibGljIGNsYXNzIFByb2plY3QgeworCisgICAgcHJpdmF0ZSBMb25nIGlkOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOworCisgICAgQFByb2plY3REZXRhaWxlZFZpZXcKKyAgICBwcml2YXRlIExpc3Q8VGFzaz4gdGFza3M7CisKKyAgICBAUHJvamVjdERldGFpbGVkVmlldworICAgIHByaXZhdGUgTGlzdDxVc2VyPiB1c2VyczsKKworICAgIHB1YmxpYyBQcm9qZWN0KCkgeworICAgIH0KKworICAgIHB1YmxpYyBQcm9qZWN0KGZpbmFsIExvbmcgaWQsIGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKKyAgICAgICAgdGhpcy5pZCA9IGlkOworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisgICAgfQorCisgICAgcHVibGljIExvbmcgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiBpZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJZChmaW5hbCBMb25nIGlkKSB7CisgICAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgeworICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxUYXNrPiBnZXRUYXNrcygpIHsKKyAgICAgICAgcmV0dXJuIHRhc2tzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRhc2tzKGZpbmFsIExpc3Q8VGFzaz4gdGFza3MpIHsKKyAgICAgICAgdGhpcy50YXNrcyA9IHRhc2tzOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PFVzZXI+IGdldFVzZXJzKCkgeworICAgICAgICByZXR1cm4gdXNlcnM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXNlcnMoZmluYWwgTGlzdDxVc2VyPiB1c2VycykgeworICAgICAgICB0aGlzLnVzZXJzID0gdXNlcnM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2VudGl0eWZpbHRlcmluZy9kb21haW4vVGFzay5qYXZhIGIvZXhhbXBsZXMvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2VudGl0eWZpbHRlcmluZy9kb21haW4vVGFzay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkN2Q4ODkKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZW50aXR5ZmlsdGVyaW5nL2RvbWFpbi9UYXNrLmphdmEKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5lbnRpdHlmaWx0ZXJpbmcuZG9tYWluOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmVudGl0eWZpbHRlcmluZy5maWx0ZXJpbmcuVGFza0RldGFpbGVkVmlldzsKKworLyoqCisgKiBUYXNrIGVudGl0eSBjbGFzcy4gRmllbGRzIHtAY29kZSBwcm9qZWN0fSBhbmQge0Bjb2RlIHVzZXJ9IGFyZSBhdmFpbGFibGUgb25seSBpbiBkZXRhaWxlZCB2aWV3IChkZWZpbmVkIHZpYQorICoge0BsaW5rIFRhc2tEZXRhaWxlZFZpZXd9KS4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiIsICJKYXZhRG9jIn0pCitAWG1sUm9vdEVsZW1lbnQKK3B1YmxpYyBjbGFzcyBUYXNrIHsKKworICAgIHByaXZhdGUgTG9uZyBpZDsKKworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgICBwcml2YXRlIFN0cmluZyBkZXNjcmlwdGlvbjsKKworICAgIEBUYXNrRGV0YWlsZWRWaWV3CisgICAgcHJpdmF0ZSBQcm9qZWN0IHByb2plY3Q7CisKKyAgICBAVGFza0RldGFpbGVkVmlldworICAgIHByaXZhdGUgVXNlciB1c2VyOworCisgICAgcHVibGljIFRhc2soKSB7CisgICAgfQorCisgICAgcHVibGljIFRhc2soZmluYWwgTG9uZyBpZCwgZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbikgeworICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgTG9uZyBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIGlkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldElkKGZpbmFsIExvbmcgaWQpIHsKKyAgICAgICAgdGhpcy5pZCA9IGlkOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKKyAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBQcm9qZWN0IGdldFByb2plY3QoKSB7CisgICAgICAgIHJldHVybiBwcm9qZWN0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByb2plY3QoZmluYWwgUHJvamVjdCBwcm9qZWN0KSB7CisgICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7CisgICAgfQorCisgICAgcHVibGljIFVzZXIgZ2V0VXNlcigpIHsKKyAgICAgICAgcmV0dXJuIHVzZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VXNlcihmaW5hbCBVc2VyIHVzZXIpIHsKKyAgICAgICAgdGhpcy51c2VyID0gdXNlcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZW50aXR5ZmlsdGVyaW5nL2RvbWFpbi9Vc2VyLmphdmEgYi9leGFtcGxlcy9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZW50aXR5ZmlsdGVyaW5nL2RvbWFpbi9Vc2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWEyNjczZgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9lbnRpdHlmaWx0ZXJpbmcvZG9tYWluL1VzZXIuamF2YQpAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmVudGl0eWZpbHRlcmluZy5kb21haW47CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5lbnRpdHlmaWx0ZXJpbmcuZmlsdGVyaW5nLlVzZXJEZXRhaWxlZFZpZXc7CisKKy8qKgorICogVXNlciBlbnRpdHkgY2xhc3MuIEZpZWxkcyB7QGNvZGUgcHJvamVjdHN9IGFuZCB7QGNvZGUgdGFza3N9IGFyZSBhdmFpbGFibGUgb25seSBpbiBkZXRhaWxlZCB2aWV3IChkZWZpbmVkIHZpYQorICoge0BsaW5rIFVzZXJEZXRhaWxlZFZpZXd9IG9uIGdldHRlcnMpLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIiwgIkphdmFEb2MifSkKK0BYbWxSb290RWxlbWVudAorcHVibGljIGNsYXNzIFVzZXIgeworCisgICAgcHJpdmF0ZSBMb25nIGlkOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgIHByaXZhdGUgU3RyaW5nIGVtYWlsOworCisgICAgcHJpdmF0ZSBMaXN0PFByb2plY3Q+IHByb2plY3RzOworCisgICAgcHJpdmF0ZSBMaXN0PFRhc2s+IHRhc2tzOworCisgICAgcHVibGljIFVzZXIoKSB7CisgICAgfQorCisgICAgcHVibGljIFVzZXIoZmluYWwgTG9uZyBpZCwgZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyBlbWFpbCkgeworICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuZW1haWwgPSBlbWFpbDsKKyAgICB9CisKKyAgICBwdWJsaWMgTG9uZyBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIGlkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldElkKGZpbmFsIExvbmcgaWQpIHsKKyAgICAgICAgdGhpcy5pZCA9IGlkOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW1haWwoKSB7CisgICAgICAgIHJldHVybiBlbWFpbDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRFbWFpbChmaW5hbCBTdHJpbmcgZW1haWwpIHsKKyAgICAgICAgdGhpcy5lbWFpbCA9IGVtYWlsOworICAgIH0KKworICAgIEBVc2VyRGV0YWlsZWRWaWV3CisgICAgcHVibGljIExpc3Q8UHJvamVjdD4gZ2V0UHJvamVjdHMoKSB7CisgICAgICAgIHJldHVybiBwcm9qZWN0czsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9qZWN0cyhmaW5hbCBMaXN0PFByb2plY3Q+IHByb2plY3RzKSB7CisgICAgICAgIHRoaXMucHJvamVjdHMgPSBwcm9qZWN0czsKKyAgICB9CisKKyAgICBAVXNlckRldGFpbGVkVmlldworICAgIHB1YmxpYyBMaXN0PFRhc2s+IGdldFRhc2tzKCkgeworICAgICAgICByZXR1cm4gdGFza3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGFza3MoZmluYWwgTGlzdDxUYXNrPiB0YXNrcykgeworICAgICAgICB0aGlzLnRhc2tzID0gdGFza3M7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2VudGl0eWZpbHRlcmluZy9maWx0ZXJpbmcvUHJvamVjdERldGFpbGVkVmlldy5qYXZhIGIvZXhhbXBsZXMvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2VudGl0eWZpbHRlcmluZy9maWx0ZXJpbmcvUHJvamVjdERldGFpbGVkVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNjRlOWQKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZW50aXR5ZmlsdGVyaW5nL2ZpbHRlcmluZy9Qcm9qZWN0RGV0YWlsZWRWaWV3LmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5lbnRpdHlmaWx0ZXJpbmcuZmlsdGVyaW5nOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5Bbm5vdGF0aW9uTGl0ZXJhbDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5FbnRpdHlGaWx0ZXJpbmc7CisKKy8qKgorICogRW50aXR5LWZpbHRlcmluZyBhbm5vdGF0aW9uIHVzZWQgdG8gZGVmaW5lIGRldGFpbGVkIHZpZXcgb24gcmV0dXJuZWQKKyAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5lbnRpdHlmaWx0ZXJpbmcuZG9tYWluLlByb2plY3R9IGVudGl0aWVzLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAVGFyZ2V0KHtFbGVtZW50VHlwZS5UWVBFLCBFbGVtZW50VHlwZS5NRVRIT0QsIEVsZW1lbnRUeXBlLkZJRUxEfSkKK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitARG9jdW1lbnRlZAorQEVudGl0eUZpbHRlcmluZworcHVibGljIEBpbnRlcmZhY2UgUHJvamVjdERldGFpbGVkVmlldyB7CisKKyAgICAvKioKKyAgICAgKiBGYWN0b3J5IGNsYXNzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMgb2Yge0Bjb2RlIFByb2plY3REZXRhaWxlZFZpZXd9IGFubm90YXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5IGV4dGVuZHMgQW5ub3RhdGlvbkxpdGVyYWw8UHJvamVjdERldGFpbGVkVmlldz4gaW1wbGVtZW50cyBQcm9qZWN0RGV0YWlsZWRWaWV3IHsKKworICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIFByb2plY3REZXRhaWxlZFZpZXcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBGYWN0b3J5KCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZW50aXR5ZmlsdGVyaW5nL2ZpbHRlcmluZy9UYXNrRGV0YWlsZWRWaWV3LmphdmEgYi9leGFtcGxlcy9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZW50aXR5ZmlsdGVyaW5nL2ZpbHRlcmluZy9UYXNrRGV0YWlsZWRWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkzZTgwOQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9lbnRpdHlmaWx0ZXJpbmcvZmlsdGVyaW5nL1Rhc2tEZXRhaWxlZFZpZXcuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmVudGl0eWZpbHRlcmluZy5maWx0ZXJpbmc7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkFubm90YXRpb25MaXRlcmFsOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLkVudGl0eUZpbHRlcmluZzsKKworLyoqCisgKiBFbnRpdHktZmlsdGVyaW5nIGFubm90YXRpb24gdXNlZCB0byBkZWZpbmUgZGV0YWlsZWQgdmlldyBvbiByZXR1cm5lZAorICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmVudGl0eWZpbHRlcmluZy5kb21haW4uVGFza30gZW50aXRpZXMuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BUYXJnZXQoe0VsZW1lbnRUeXBlLlRZUEUsIEVsZW1lbnRUeXBlLk1FVEhPRCwgRWxlbWVudFR5cGUuRklFTER9KQorQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BEb2N1bWVudGVkCitARW50aXR5RmlsdGVyaW5nCitwdWJsaWMgQGludGVyZmFjZSBUYXNrRGV0YWlsZWRWaWV3IHsKKworICAgIC8qKgorICAgICAqIEZhY3RvcnkgY2xhc3MgZm9yIGNyZWF0aW5nIGluc3RhbmNlcyBvZiB7QGNvZGUgVGFza0RldGFpbGVkVmlld30gYW5ub3RhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3RvcnkgZXh0ZW5kcyBBbm5vdGF0aW9uTGl0ZXJhbDxUYXNrRGV0YWlsZWRWaWV3PiBpbXBsZW1lbnRzIFRhc2tEZXRhaWxlZFZpZXcgeworCisgICAgICAgIHByaXZhdGUgRmFjdG9yeSgpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgVGFza0RldGFpbGVkVmlldyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEZhY3RvcnkoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9lbnRpdHlmaWx0ZXJpbmcvZmlsdGVyaW5nL1VzZXJEZXRhaWxlZFZpZXcuamF2YSBiL2V4YW1wbGVzL2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9lbnRpdHlmaWx0ZXJpbmcvZmlsdGVyaW5nL1VzZXJEZXRhaWxlZFZpZXcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWY5M2NkCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2VudGl0eWZpbHRlcmluZy9maWx0ZXJpbmcvVXNlckRldGFpbGVkVmlldy5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZW50aXR5ZmlsdGVyaW5nLmZpbHRlcmluZzsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQW5ub3RhdGlvbkxpdGVyYWw7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuRW50aXR5RmlsdGVyaW5nOworCisvKioKKyAqIEVudGl0eS1maWx0ZXJpbmcgYW5ub3RhdGlvbiB1c2VkIHRvIGRlZmluZSBkZXRhaWxlZCB2aWV3IG9uIHJldHVybmVkCisgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZW50aXR5ZmlsdGVyaW5nLmRvbWFpbi5Vc2VyfSBlbnRpdGllcy4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFRhcmdldCh7RWxlbWVudFR5cGUuVFlQRSwgRWxlbWVudFR5cGUuTUVUSE9ELCBFbGVtZW50VHlwZS5GSUVMRH0pCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorQERvY3VtZW50ZWQKK0BFbnRpdHlGaWx0ZXJpbmcKK3B1YmxpYyBAaW50ZXJmYWNlIFVzZXJEZXRhaWxlZFZpZXcgeworCisgICAgLyoqCisgICAgICogRmFjdG9yeSBjbGFzcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzIG9mIHtAY29kZSBVc2VyRGV0YWlsZWRWaWV3fSBhbm5vdGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeSBleHRlbmRzIEFubm90YXRpb25MaXRlcmFsPFVzZXJEZXRhaWxlZFZpZXc+IGltcGxlbWVudHMgVXNlckRldGFpbGVkVmlldyB7CisKKyAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBVc2VyRGV0YWlsZWRWaWV3IGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRmFjdG9yeSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2VudGl0eWZpbHRlcmluZy9yZXNvdXJjZS9Qcm9qZWN0c1Jlc291cmNlLmphdmEgYi9leGFtcGxlcy9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZW50aXR5ZmlsdGVyaW5nL3Jlc291cmNlL1Byb2plY3RzUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTBlY2U2Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2VudGl0eWZpbHRlcmluZy9yZXNvdXJjZS9Qcm9qZWN0c1Jlc291cmNlLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5lbnRpdHlmaWx0ZXJpbmcucmVzb3VyY2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmVudGl0eWZpbHRlcmluZy5kb21haW4uRW50aXR5U3RvcmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZW50aXR5ZmlsdGVyaW5nLmRvbWFpbi5Qcm9qZWN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmVudGl0eWZpbHRlcmluZy5maWx0ZXJpbmcuUHJvamVjdERldGFpbGVkVmlldzsKKworLyoqCisgKiBSZXNvdXJjZSBjbGFzcyBmb3Ige0BsaW5rIFByb2plY3QgcHJvamVjdHN9LiBQcm92aWRlcyBtZXRob2RzIHRvIHJldHJpZXZlIHByb2plY3RzIGluICJkZWZhdWx0IiB2aWV3ICh7QGxpbmsgI2dldFByb2plY3RzKCl9CisgKiBhbmQge0BsaW5rICNnZXRQcm9qZWN0KExvbmcpfSkgYW5kIGluICJkZXRhaWxlZCIgdmlldyAoe0BsaW5rICNnZXREZXRhaWxlZFByb2plY3RzKCl9IGFuZCB7QGxpbmsgI2dldERldGFpbGVkUHJvamVjdChMb25nKX0pLgorICogPHAvPgorICogVG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgbWV0aG9kcyB3aGlsZSBrZWVwaW5nIHRoZSBmdW5jdGlvbmFsaXR5IG9mIHJlc291cmNlIHVuY2hhbmdlZCAoc3VwcG9ydCBmb3IgYm90aCAiZGVmYXVsdCIgYW5kCisgKiAiZGV0YWlsZWQiIHZpZXcpIHNlZSB7QGxpbmsgVXNlcnNSZXNvdXJjZX0uCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKiBAc2VlIFVzZXJzUmVzb3VyY2UKKyAqLworQFBhdGgoInByb2plY3RzIikKK0BQcm9kdWNlcygiYXBwbGljYXRpb24vanNvbiIpCitwdWJsaWMgY2xhc3MgUHJvamVjdHNSZXNvdXJjZSB7CisKKyAgICBAR0VUCisgICAgQFBhdGgoIntpZH0iKQorICAgIHB1YmxpYyBQcm9qZWN0IGdldFByb2plY3QoQFBhdGhQYXJhbSgiaWQiKSBmaW5hbCBMb25nIGlkKSB7CisgICAgICAgIHJldHVybiBnZXREZXRhaWxlZFByb2plY3QoaWQpOworICAgIH0KKworICAgIEBHRVQKKyAgICBwdWJsaWMgTGlzdDxQcm9qZWN0PiBnZXRQcm9qZWN0cygpIHsKKyAgICAgICAgcmV0dXJuIGdldERldGFpbGVkUHJvamVjdHMoKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImRldGFpbGVkL3tpZH0iKQorICAgIEBQcm9qZWN0RGV0YWlsZWRWaWV3CisgICAgcHVibGljIFByb2plY3QgZ2V0RGV0YWlsZWRQcm9qZWN0KEBQYXRoUGFyYW0oImlkIikgZmluYWwgTG9uZyBpZCkgeworICAgICAgICByZXR1cm4gRW50aXR5U3RvcmUuZ2V0UHJvamVjdChpZCk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJkZXRhaWxlZCIpCisgICAgQFByb2plY3REZXRhaWxlZFZpZXcKKyAgICBwdWJsaWMgTGlzdDxQcm9qZWN0PiBnZXREZXRhaWxlZFByb2plY3RzKCkgeworICAgICAgICByZXR1cm4gRW50aXR5U3RvcmUuZ2V0UHJvamVjdHMoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZW50aXR5ZmlsdGVyaW5nL3Jlc291cmNlL1Rhc2tzUmVzb3VyY2UuamF2YSBiL2V4YW1wbGVzL2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9lbnRpdHlmaWx0ZXJpbmcvcmVzb3VyY2UvVGFza3NSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMWYxNzcKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZW50aXR5ZmlsdGVyaW5nL3Jlc291cmNlL1Rhc2tzUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmVudGl0eWZpbHRlcmluZy5yZXNvdXJjZTsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZW50aXR5ZmlsdGVyaW5nLmRvbWFpbi5FbnRpdHlTdG9yZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5lbnRpdHlmaWx0ZXJpbmcuZG9tYWluLlRhc2s7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZW50aXR5ZmlsdGVyaW5nLmZpbHRlcmluZy5UYXNrRGV0YWlsZWRWaWV3OworCisvKioKKyAqIFJlc291cmNlIGNsYXNzIGZvciB7QGxpbmsgVGFzayB0YXNrc30uCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BQYXRoKCJ0YXNrcyIpCitAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2pzb24iKQorcHVibGljIGNsYXNzIFRhc2tzUmVzb3VyY2UgeworCisgICAgQEdFVAorICAgIHB1YmxpYyBMaXN0PFRhc2s+IGdldFRhc2tzKCkgeworICAgICAgICByZXR1cm4gZ2V0RGV0YWlsZWRUYXNrcygpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiZGV0YWlsZWQiKQorICAgIEBUYXNrRGV0YWlsZWRWaWV3CisgICAgcHVibGljIExpc3Q8VGFzaz4gZ2V0RGV0YWlsZWRUYXNrcygpIHsKKyAgICAgICAgcmV0dXJuIEVudGl0eVN0b3JlLmdldFRhc2tzKCk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJ7aWR9IikKKyAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0VGFzayhAUGF0aFBhcmFtKCJpZCIpIGZpbmFsIExvbmcgaWQsIEBRdWVyeVBhcmFtKCJkZXRhaWxlZCIpIGZpbmFsIGJvb2xlYW4gaXNEZXRhaWxlZCkgeworICAgICAgICByZXR1cm4gUmVzcG9uc2UKKyAgICAgICAgICAgICAgICAub2soKQorICAgICAgICAgICAgICAgIC5lbnRpdHkoRW50aXR5U3RvcmUuZ2V0VGFzayhpZCksCisgICAgICAgICAgICAgICAgICAgICAgICBpc0RldGFpbGVkID8gbmV3IEFubm90YXRpb25bXSB7VGFza0RldGFpbGVkVmlldy5GYWN0b3J5LmdldCgpfSA6IG5ldyBBbm5vdGF0aW9uWzBdKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9lbnRpdHlmaWx0ZXJpbmcvcmVzb3VyY2UvVXNlcnNSZXNvdXJjZS5qYXZhIGIvZXhhbXBsZXMvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2VudGl0eWZpbHRlcmluZy9yZXNvdXJjZS9Vc2Vyc1Jlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFkNzY0NgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9lbnRpdHlmaWx0ZXJpbmcvcmVzb3VyY2UvVXNlcnNSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZW50aXR5ZmlsdGVyaW5nLnJlc291cmNlOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY0VudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZW50aXR5ZmlsdGVyaW5nLmRvbWFpbi5FbnRpdHlTdG9yZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5lbnRpdHlmaWx0ZXJpbmcuZG9tYWluLlVzZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZW50aXR5ZmlsdGVyaW5nLmZpbHRlcmluZy5Vc2VyRGV0YWlsZWRWaWV3OworCisvKioKKyAqIFJlc291cmNlIGNsYXNzIGZvciB7QGxpbmsgVXNlciB1c2Vyc30uIFByb3ZpZGVzIGNvbWJpbmVkIG1ldGhvZHMgdG8gcmV0cmlldmUgdXNlcnMgaW4gImRlZmF1bHQiIHZpZXcgYW5kICJkZXRhaWxlZCIgdmlldy4KKyAqIERldGFpbGVkIHZpZXcgY2FuIGJlIHRyaWdnZXJlZCBieSBhcHBlbmRpbmcge0Bjb2RlIGRldGFpbGVkfSBxdWVyeSBwYXJhbSB0byB0aGUgVVJJLgorICogPHAvPgorICogVG8gc2VlIHRoZSByZXNvdXJjZSBtZXRob2RzIGV4cGFuZGVkIHJlZmVyIHRvIHRoZSB7QGxpbmsgUHJvamVjdHNSZXNvdXJjZX0uCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKiBAc2VlIFByb2plY3RzUmVzb3VyY2UKKyAqLworQFBhdGgoInVzZXJzIikKK0BQcm9kdWNlcygiYXBwbGljYXRpb24vanNvbiIpCitwdWJsaWMgY2xhc3MgVXNlcnNSZXNvdXJjZSB7CisKKyAgICBAR0VUCisgICAgcHVibGljIFJlc3BvbnNlIGdldFVzZXJzKEBRdWVyeVBhcmFtKCJkZXRhaWxlZCIpIGZpbmFsIGJvb2xlYW4gaXNEZXRhaWxlZCkgeworICAgICAgICByZXR1cm4gUmVzcG9uc2UKKyAgICAgICAgICAgICAgICAub2soKQorICAgICAgICAgICAgICAgIC5lbnRpdHkobmV3IEdlbmVyaWNFbnRpdHk8TGlzdDxVc2VyPj4oRW50aXR5U3RvcmUuZ2V0VXNlcnMoKSkge30sCisgICAgICAgICAgICAgICAgICAgICAgICBpc0RldGFpbGVkID8gbmV3IEFubm90YXRpb25bXXtVc2VyRGV0YWlsZWRWaWV3LkZhY3RvcnkuZ2V0KCl9IDogbmV3IEFubm90YXRpb25bMF0pCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJ7aWR9IikKKyAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0VXNlcihAUGF0aFBhcmFtKCJpZCIpIGZpbmFsIExvbmcgaWQsIEBRdWVyeVBhcmFtKCJkZXRhaWxlZCIpIGZpbmFsIGJvb2xlYW4gaXNEZXRhaWxlZCkgeworICAgICAgICByZXR1cm4gUmVzcG9uc2UKKyAgICAgICAgICAgICAgICAub2soKQorICAgICAgICAgICAgICAgIC5lbnRpdHkoRW50aXR5U3RvcmUuZ2V0VXNlcihpZCksCisgICAgICAgICAgICAgICAgICAgICAgICBpc0RldGFpbGVkID8gbmV3IEFubm90YXRpb25bXXtVc2VyRGV0YWlsZWRWaWV3LkZhY3RvcnkuZ2V0KCl9IDogbmV3IEFubm90YXRpb25bMF0pCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZW50aXR5LWZpbHRlcmluZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2VudGl0eWZpbHRlcmluZy9Qcm9qZWN0c1Jlc291cmNlVGVzdC5qYXZhIGIvZXhhbXBsZXMvZW50aXR5LWZpbHRlcmluZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2VudGl0eWZpbHRlcmluZy9Qcm9qZWN0c1Jlc291cmNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNTEyMzcKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9lbnRpdHktZmlsdGVyaW5nL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZW50aXR5ZmlsdGVyaW5nL1Byb2plY3RzUmVzb3VyY2VUZXN0LmphdmEKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5lbnRpdHlmaWx0ZXJpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY1R5cGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5lbnRpdHlmaWx0ZXJpbmcuZG9tYWluLlByb2plY3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamFja3Nvbi5KYWNrc29uRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5FbnRpdHlGaWx0ZXJpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1veHkuanNvbi5Nb3h5SnNvbkZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMubm90TnVsbFZhbHVlOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLm51bGxWYWx1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZW50aXR5ZmlsdGVyaW5nLnJlc291cmNlLlVzZXJzUmVzb3VyY2V9IHVuaXQgdGVzdHMuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgUHJvamVjdHNSZXNvdXJjZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMobmFtZSA9ICJQcm92aWRlcjogezB9IikKKyAgICBwdWJsaWMgc3RhdGljIEl0ZXJhYmxlPENsYXNzW10+IHByb3ZpZGVycygpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IENsYXNzW11bXXt7TW94eUpzb25GZWF0dXJlLmNsYXNzfSwge0phY2tzb25GZWF0dXJlLmNsYXNzfX0pOworICAgIH0KKworICAgIHB1YmxpYyBQcm9qZWN0c1Jlc291cmNlVGVzdChmaW5hbCBDbGFzczxGZWF0dXJlPiBmaWx0ZXJpbmdQcm92aWRlcikgeworICAgICAgICBzdXBlcihuZXcgUmVzb3VyY2VDb25maWcoRW50aXR5RmlsdGVyaW5nRmVhdHVyZS5jbGFzcykKKyAgICAgICAgICAgICAgICAucGFja2FnZXMoIm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmVudGl0eWZpbHRlcmluZy5yZXNvdXJjZSIpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKGZpbHRlcmluZ1Byb3ZpZGVyKSk7CisKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKTsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9qZWN0cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKGZpbmFsIFByb2plY3QgcHJvamVjdCA6IHRhcmdldCgicHJvamVjdHMiKS5yZXF1ZXN0KCkuZ2V0KG5ldyBHZW5lcmljVHlwZTxMaXN0PFByb2plY3Q+PigpIHt9KSkgeworICAgICAgICAgICAgdGVzdFByb2plY3QocHJvamVjdCwgZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvamVjdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0UHJvamVjdCh0YXJnZXQoInByb2plY3RzIikucGF0aCgiMSIpLnJlcXVlc3QoKS5nZXQoUHJvamVjdC5jbGFzcyksIGZhbHNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZXRhaWxlZFByb2plY3RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoZmluYWwgUHJvamVjdCBwcm9qZWN0IDogdGFyZ2V0KCJwcm9qZWN0cy9kZXRhaWxlZCIpLnJlcXVlc3QoKS5nZXQobmV3IEdlbmVyaWNUeXBlPExpc3Q8UHJvamVjdD4+KCkge30pKSB7CisgICAgICAgICAgICB0ZXN0UHJvamVjdChwcm9qZWN0LCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERldGFpbGVkUHJvamVjdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0UHJvamVjdCh0YXJnZXQoInByb2plY3RzL2RldGFpbGVkIikucGF0aCgiMSIpLnJlcXVlc3QoKS5nZXQoUHJvamVjdC5jbGFzcyksIHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0UHJvamVjdChmaW5hbCBQcm9qZWN0IHByb2plY3QsIGZpbmFsIGJvb2xlYW4gaXNEZXRhaWxlZCkgeworICAgICAgICAvLyBGb2xsb3dpbmcgcHJvcGVydGllcyBzaG91bGQgYmUgaW4gZXZlcnkgcmV0dXJuZWQgcHJvamVjdC4KKyAgICAgICAgYXNzZXJ0VGhhdChwcm9qZWN0LmdldElkKCksIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChwcm9qZWN0LmdldE5hbWUoKSwgbm90TnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KHByb2plY3QuZ2V0RGVzY3JpcHRpb24oKSwgbm90TnVsbFZhbHVlKCkpOworCisgICAgICAgIC8vIFRhc2tzIGFuZCB1c2VycyBzaG91bGQgYmUgb25seSBpbiAiZGV0YWlsZWQiIHZpZXcuCisgICAgICAgIGlmICghaXNEZXRhaWxlZCkgeworICAgICAgICAgICAgYXNzZXJ0VGhhdCgiVXNlcnMgcHJlc2VudCBpbiBub24tZGV0YWlsZWQgcHJvamVjdCB2aWV3IiwgcHJvamVjdC5nZXRVc2VycygpLCBudWxsVmFsdWUoKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KCJUYXNrcyBwcmVzZW50IGluIG5vbi1kZXRhaWxlZCBwcm9qZWN0IHZpZXciLCBwcm9qZWN0LmdldFRhc2tzKCksIG51bGxWYWx1ZSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoIlVzZXJzIG5vdCBwcmVzZW50IGluIGRldGFpbGVkIHByb2plY3QgdmlldyIsIHByb2plY3QuZ2V0VXNlcnMoKSwgbm90TnVsbFZhbHVlKCkpOworICAgICAgICAgICAgYXNzZXJ0VGhhdCgiVGFza3Mgbm90IHByZXNlbnQgaW4gZGV0YWlsZWQgcHJvamVjdCB2aWV3IiwgcHJvamVjdC5nZXRUYXNrcygpLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9lbnRpdHktZmlsdGVyaW5nL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZW50aXR5ZmlsdGVyaW5nL1Rhc2tSZXNvdXJjZVRlc3QuamF2YSBiL2V4YW1wbGVzL2VudGl0eS1maWx0ZXJpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9lbnRpdHlmaWx0ZXJpbmcvVGFza1Jlc291cmNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MTcxYWMKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9lbnRpdHktZmlsdGVyaW5nL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZW50aXR5ZmlsdGVyaW5nL1Rhc2tSZXNvdXJjZVRlc3QuamF2YQpAQCAtMCwwICsxLDk1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmVudGl0eWZpbHRlcmluZzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljVHlwZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmVudGl0eWZpbHRlcmluZy5kb21haW4uVGFzazsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uLkphY2tzb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLkVudGl0eUZpbHRlcmluZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW94eS5qc29uLk1veHlKc29uRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5ub3ROdWxsVmFsdWU7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMubnVsbFZhbHVlOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5lbnRpdHlmaWx0ZXJpbmcucmVzb3VyY2UuVGFza3NSZXNvdXJjZX0gdW5pdCB0ZXN0cy4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBUYXNrUmVzb3VyY2VUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKG5hbWUgPSAiUHJvdmlkZXI6IHswfSIpCisgICAgcHVibGljIHN0YXRpYyBJdGVyYWJsZTxDbGFzc1tdPiBwcm92aWRlcnMoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBDbGFzc1tdW117e01veHlKc29uRmVhdHVyZS5jbGFzc30sIHtKYWNrc29uRmVhdHVyZS5jbGFzc319KTsKKyAgICB9CisKKyAgICBwdWJsaWMgVGFza1Jlc291cmNlVGVzdChmaW5hbCBDbGFzczxGZWF0dXJlPiBmaWx0ZXJpbmdQcm92aWRlcikgeworICAgICAgICBzdXBlcihuZXcgUmVzb3VyY2VDb25maWcoRW50aXR5RmlsdGVyaW5nRmVhdHVyZS5jbGFzcykKKyAgICAgICAgICAgICAgICAucGFja2FnZXMoIm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmVudGl0eWZpbHRlcmluZy5yZXNvdXJjZSIpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKGZpbHRlcmluZ1Byb3ZpZGVyKSk7CisKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKTsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUYXNrcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKGZpbmFsIFRhc2sgdGFzayA6IHRhcmdldCgidGFza3MiKS5yZXF1ZXN0KCkuZ2V0KG5ldyBHZW5lcmljVHlwZTxMaXN0PFRhc2s+PigpIHt9KSkgeworICAgICAgICAgICAgdGVzdFRhc2sodGFzaywgZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGFzaygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0VGFzayh0YXJnZXQoInRhc2tzIikucGF0aCgiMSIpLnJlcXVlc3QoKS5nZXQoVGFzay5jbGFzcyksIGZhbHNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZXRhaWxlZFRhc2tzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoZmluYWwgVGFzayB0YXNrIDogdGFyZ2V0KCJ0YXNrcyIpLnBhdGgoImRldGFpbGVkIikucmVxdWVzdCgpLmdldChuZXcgR2VuZXJpY1R5cGU8TGlzdDxUYXNrPj4oKSB7fSkpIHsKKyAgICAgICAgICAgIHRlc3RUYXNrKHRhc2ssIHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGV0YWlsZWRUYXNrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RUYXNrKHRhcmdldCgidGFza3MiKS5wYXRoKCIxIikucXVlcnlQYXJhbSgiZGV0YWlsZWQiLCB0cnVlKS5yZXF1ZXN0KCkuZ2V0KFRhc2suY2xhc3MpLCB0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdFRhc2soZmluYWwgVGFzayB0YXNrLCBmaW5hbCBib29sZWFuIGlzRGV0YWlsZWQpIHsKKyAgICAgICAgLy8gRm9sbG93aW5nIHByb3BlcnRpZXMgc2hvdWxkIGJlIGluIGV2ZXJ5IHJldHVybmVkIHRhc2suCisgICAgICAgIGFzc2VydFRoYXQodGFzay5nZXRJZCgpLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQodGFzay5nZXROYW1lKCksIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh0YXNrLmdldERlc2NyaXB0aW9uKCksIG5vdE51bGxWYWx1ZSgpKTsKKworICAgICAgICAvLyBUYXNrcyBhbmQgdGFza3Mgc2hvdWxkIGJlIGluICJkZXRhaWxlZCIgdmlldy4KKyAgICAgICAgaWYgKCFpc0RldGFpbGVkKSB7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHRhc2suZ2V0UHJvamVjdCgpLCBudWxsVmFsdWUoKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHRhc2suZ2V0VXNlcigpLCBudWxsVmFsdWUoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHRhc2suZ2V0UHJvamVjdCgpLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHRhc2suZ2V0VXNlcigpLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9lbnRpdHktZmlsdGVyaW5nL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZW50aXR5ZmlsdGVyaW5nL1VzZXJzUmVzb3VyY2VUZXN0LmphdmEgYi9leGFtcGxlcy9lbnRpdHktZmlsdGVyaW5nL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZW50aXR5ZmlsdGVyaW5nL1VzZXJzUmVzb3VyY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg1Zjc3OQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2VudGl0eS1maWx0ZXJpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9lbnRpdHlmaWx0ZXJpbmcvVXNlcnNSZXNvdXJjZVRlc3QuamF2YQpAQCAtMCwwICsxLDk1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmVudGl0eWZpbHRlcmluZzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljVHlwZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmVudGl0eWZpbHRlcmluZy5kb21haW4uVXNlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uLkphY2tzb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLkVudGl0eUZpbHRlcmluZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW94eS5qc29uLk1veHlKc29uRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5ub3ROdWxsVmFsdWU7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMubnVsbFZhbHVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmVudGl0eWZpbHRlcmluZy5yZXNvdXJjZS5Vc2Vyc1Jlc291cmNlfSB1bml0IHRlc3RzLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGNsYXNzIFVzZXJzUmVzb3VyY2VUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKG5hbWUgPSAiUHJvdmlkZXI6IHswfSIpCisgICAgcHVibGljIHN0YXRpYyBJdGVyYWJsZTxDbGFzc1tdPiBwcm92aWRlcnMoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBDbGFzc1tdW117e01veHlKc29uRmVhdHVyZS5jbGFzc30sIHtKYWNrc29uRmVhdHVyZS5jbGFzc319KTsKKyAgICB9CisKKyAgICBwdWJsaWMgVXNlcnNSZXNvdXJjZVRlc3QoZmluYWwgQ2xhc3M8RmVhdHVyZT4gZmlsdGVyaW5nUHJvdmlkZXIpIHsKKyAgICAgICAgc3VwZXIobmV3IFJlc291cmNlQ29uZmlnKEVudGl0eUZpbHRlcmluZ0ZlYXR1cmUuY2xhc3MpCisgICAgICAgICAgICAgICAgLnBhY2thZ2VzKCJvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5lbnRpdHlmaWx0ZXJpbmcucmVzb3VyY2UiKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihmaWx0ZXJpbmdQcm92aWRlcikpOworCisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5EVU1QX0VOVElUWSk7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXNlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChmaW5hbCBVc2VyIHVzZXIgOiB0YXJnZXQoInVzZXJzIikucmVxdWVzdCgpLmdldChuZXcgR2VuZXJpY1R5cGU8TGlzdDxVc2VyPj4oKSB7fSkpIHsKKyAgICAgICAgICAgIHRlc3RVc2VyKHVzZXIsIGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVzZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdFVzZXIodGFyZ2V0KCJ1c2VycyIpLnBhdGgoIjEiKS5yZXF1ZXN0KCkuZ2V0KFVzZXIuY2xhc3MpLCBmYWxzZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGV0YWlsZWRVc2VycygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKGZpbmFsIFVzZXIgdXNlciA6IHRhcmdldCgidXNlcnMiKS5xdWVyeVBhcmFtKCJkZXRhaWxlZCIsIHRydWUpLnJlcXVlc3QoKS5nZXQobmV3IEdlbmVyaWNUeXBlPExpc3Q8VXNlcj4+KCkge30pKSB7CisgICAgICAgICAgICB0ZXN0VXNlcih1c2VyLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERldGFpbGVkVXNlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0VXNlcih0YXJnZXQoInVzZXJzIikucGF0aCgiMSIpLnF1ZXJ5UGFyYW0oImRldGFpbGVkIiwgdHJ1ZSkucmVxdWVzdCgpLmdldChVc2VyLmNsYXNzKSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RVc2VyKGZpbmFsIFVzZXIgdXNlciwgZmluYWwgYm9vbGVhbiBpc0RldGFpbGVkKSB7CisgICAgICAgIC8vIEZvbGxvd2luZyBwcm9wZXJ0aWVzIHNob3VsZCBiZSBpbiBldmVyeSByZXR1cm5lZCB1c2VyLgorICAgICAgICBhc3NlcnRUaGF0KHVzZXIuZ2V0SWQoKSwgbm90TnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KHVzZXIuZ2V0TmFtZSgpLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQodXNlci5nZXRFbWFpbCgpLCBub3ROdWxsVmFsdWUoKSk7CisKKyAgICAgICAgLy8gVGFza3MgYW5kIHVzZXJzIHNob3VsZCBiZSBpbiAiZGV0YWlsZWQiIHZpZXcuCisgICAgICAgIGlmICghaXNEZXRhaWxlZCkgeworICAgICAgICAgICAgYXNzZXJ0VGhhdCh1c2VyLmdldFByb2plY3RzKCksIG51bGxWYWx1ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQodXNlci5nZXRUYXNrcygpLCBudWxsVmFsdWUoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHVzZXIuZ2V0UHJvamVjdHMoKSwgbm90TnVsbFZhbHVlKCkpOworICAgICAgICAgICAgYXNzZXJ0VGhhdCh1c2VyLmdldFRhc2tzKCksIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2V0Yy9nZi1wcm9qZWN0LXNyYy1wb20ueHNsIGIvZXhhbXBsZXMvZXRjL2dmLXByb2plY3Qtc3JjLXBvbS54c2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBkZjA4ZgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2V0Yy9nZi1wcm9qZWN0LXNyYy1wb20ueHNsCkBAIC0wLDAgKzEsMjExIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKKyAgICAgICAgICAgICAgICB4bWxuczpwb209Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKKyAgICAgICAgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiCisgICAgICAgICAgICAgICAgdmVyc2lvbj0iMS4wIj4KKworICAgIDx4c2w6b3V0cHV0IG1ldGhvZD0ieG1sIiBpbmRlbnQ9InllcyIgLz4KKworICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iPgorICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyAvPgorICAgIDwveHNsOnRlbXBsYXRlPgorCisgICAgPHhzbDp0ZW1wbGF0ZQorICAgICAgICAgICAgbWF0Y2g9InBvbTpkZXBlbmRlbmNpZXMvcG9tOmRlcGVuZGVuY3lbcG9tOmdyb3VwSWQ9J29yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmUnCisgICAgICAgICAgICBvciBwb206Z3JvdXBJZD0nb3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVycycKKyAgICAgICAgICAgIG9yIHBvbTpncm91cElkPSdvcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpJworICAgICAgICAgICAgb3IgcG9tOmdyb3VwSWQ9J29yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhJworICAgICAgICAgICAgb3IgcG9tOmFydGlmYWN0SWQ9J2plcnNleS13YWRsLWRvY2xldCcKKyAgICAgICAgICAgIG9yIHBvbTphcnRpZmFjdElkPSdqZXJzZXktbXZjLWpzcCcKKyAgICAgICAgICAgIG9yIHBvbTphcnRpZmFjdElkPSdqZXJzZXktYmVhbi12YWxpZGF0aW9uJworICAgICAgICAgICAgb3IgcG9tOmdyb3VwSWQ9J2NvbS5zdW4ueG1sLmJpbmQnCisgICAgICAgICAgICBvciBwb206Z3JvdXBJZD0nb3JnLmNvZGVoYXVzLmpldHRpc29uJworICAgICAgICAgICAgb3IgcG9tOmdyb3VwSWQ9J2phdmF4LmFubm90YXRpb24nCisgICAgICAgICAgICBvciBwb206Z3JvdXBJZD0namF2YXguZW50ZXJwcmlzZScKKyAgICAgICAgICAgIG9yIHBvbTpncm91cElkPSdqYXZheC5zZXJ2bGV0JworICAgICAgICAgICAgb3IgcG9tOmdyb3VwSWQ9J2phdmF4LndzLnJzJ10vcG9tOnNjb3BlW3RleHQoKSE9dGVzdF0iPgorICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgIDwveHNsOnRlbXBsYXRlPgorCisgICAgPHhzbDp0ZW1wbGF0ZQorICAgICAgICAgICAgbWF0Y2g9InBvbTpkZXBlbmRlbmNpZXMvcG9tOmRlcGVuZGVuY3lbcG9tOmdyb3VwSWQ9J29yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmUnCisgICAgICAgICAgICBvciBwb206Z3JvdXBJZD0nb3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVycycKKyAgICAgICAgICAgIG9yIHBvbTpncm91cElkPSdvcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpJworICAgICAgICAgICAgb3IgcG9tOmdyb3VwSWQ9J29yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhJworICAgICAgICAgICAgb3IgcG9tOmFydGlmYWN0SWQ9J2plcnNleS13YWRsLWRvY2xldCcKKyAgICAgICAgICAgIG9yIHBvbTphcnRpZmFjdElkPSdqZXJzZXktbXZjLWpzcCcKKyAgICAgICAgICAgIG9yIHBvbTphcnRpZmFjdElkPSdqZXJzZXktYmVhbi12YWxpZGF0aW9uJworICAgICAgICAgICAgb3IgcG9tOmdyb3VwSWQ9J2NvbS5zdW4ueG1sLmJpbmQnCisgICAgICAgICAgICBvciBwb206Z3JvdXBJZD0namF2YXgudmFsaWRhdGlvbicKKyAgICAgICAgICAgIG9yIHBvbTpncm91cElkPSdvcmcuY29kZWhhdXMuamV0dGlzb24nCisgICAgICAgICAgICBvciBwb206Z3JvdXBJZD0namF2YXguYW5ub3RhdGlvbicKKyAgICAgICAgICAgIG9yIHBvbTpncm91cElkPSdqYXZheC5lbnRlcnByaXNlJworICAgICAgICAgICAgb3IgcG9tOmdyb3VwSWQ9J2phdmF4LnNlcnZsZXQnCisgICAgICAgICAgICBvciBwb206Z3JvdXBJZD0namF2YXgud3MucnMnXSI+CisgICAgICAgIDx4c2w6Y29weT4KKyAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIC8+CisgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KHBvbTpzY29wZSk9MCI+CisgICAgICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICA8L3hzbDpjb3B5PgorICAgIDwveHNsOnRlbXBsYXRlPgorCisgICAgPHhzbDp0ZW1wbGF0ZQorICAgICAgICAgICAgbWF0Y2g9InBvbTpkZXBlbmRlbmNpZXMvcG9tOmRlcGVuZGVuY3lbcG9tOmFydGlmYWN0SWQ9J2plcnNleS1tdmMtZnJlZW1hcmtlciddIj4KKyAgICAgICAgPHhzbDpjb3B5PgorICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgLz4KKyAgICAgICAgICAgIDxleGNsdXNpb25zPgorICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbXZjPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC53cy5yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC53cy5ycy1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICAgICAgPC9leGNsdXNpb25zPgorICAgICAgICA8L3hzbDpjb3B5PgorICAgIDwveHNsOnRlbXBsYXRlPgorCisgICAgPCEtLSBUaGVyZSBpcyBwcm9ibGVtIHRvIHJ1biBTcHJpbmcgZXhhbXBsZSBvbiBHRiAtIGh0dHBzOi8vamF2YS5uZXQvamlyYS9icm93c2UvSkVSU0VZLTIwMzIKKyAgICA8eHNsOnRlbXBsYXRlCisgICAgICAgICAgICBtYXRjaD0icG9tOmRlcGVuZGVuY2llcy9wb206ZGVwZW5kZW5jeVtwb206YXJ0aWZhY3RJZD0namVyc2V5LXNwcmluZzMnXSI+CisgICAgICAgIDx4c2w6Y29weT4KKyAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIC8+CisgICAgICAgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC53cy5yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXgud3MucnMtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgorCisKKyAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktc2VydmVyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgorCisgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+CisKKyAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmhrMjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGsyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgorCisgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguc2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgICAgIDwveHNsOmNvcHk+CisgICAgPC94c2w6dGVtcGxhdGU+CisgICAgLS0+CisKKyAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJwb206ZGVwZW5kZW5jaWVzIj4KKyAgICAgIDx4c2w6Y29weT4KKyAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgLz4KKyAgICAgICAgPHhzbDppZiB0ZXN0PSJjb3VudChwb206ZGVwZW5kZW5jeVtwb206YXJ0aWZhY3RJZD0namVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmUnXSk9MCI+CisgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPC94c2w6aWY+CisgICAgICAgIDx4c2w6aWYgdGVzdD0iY291bnQocG9tOmRlcGVuZGVuY3lbcG9tOmFydGlmYWN0SWQ9J2plcnNleS1tdmMtZnJlZW1hcmtlciddKT0xIj4KKyAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tdmM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPC94c2w6aWY+CisgICAgICAgPC94c2w6Y29weT4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InBvbTpwcm9qZWN0Ij4KKyAgICAgICA8eHNsOmNvcHk+CisgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIC8+CisgICAgICAgIDx4c2w6aWYgdGVzdD0iY291bnQocG9tOmRlcGVuZGVuY2llcyk9MCI+CisgICAgICAgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICA8L2RlcGVuZGVuY2llcz4KKyAgICAgICAgPC94c2w6aWY+CisgICAgICAgIDwveHNsOmNvcHk+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKyAgICA8IS0tIHJlbW92ZSA8cGFja2FnaW5nRXhjbHVkZXM+V0VCLUlORi9nbGFzc2Zpc2gtd2ViLnhtbDwvcGFja2FnaW5nRXhjbHVkZXM+CisgICAgICAgICBhcyB0aGlzIGZpbGUgaXMgcmVxdWlyZWQgaW4gR2xhc3NmaXNoIGJ1bmRsZSBzaW5jZSA8Y2xhc3MtbG9hZGVyPgorICAgICAgICAgaXMgZGVmaW5lZCBpbiBpdCAtLT4KKyAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJwb206cGx1Z2luW3BvbTphcnRpZmFjdElkPSdtYXZlbi13YXItcGx1Z2luJ10vcG9tOmNvbmZpZ3VyYXRpb25bcG9tOnBhY2thZ2luZ0V4Y2x1ZGVzXSI+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKyAgICA8IS0tYnVpbGQgd2FyIGV2ZW4gaWYgd2ViLnhtbCBpcyBtaXNzaW5nIGFzIGl0J3Mgbm90IHJlcXVpcmVkLAorICAgICAgICA8cGFja2FnaW5nSW5jbHVkZXM+IGRlZmF1bHRzIHRvICdhbGwnIHNvIGl0IGluY2x1ZGVzCisgICAgICAgIDxwYWNrYWdpbmdJbmNsdWRlcz5XRUItSU5GL2dsYXNzZmlzaC13ZWIueG1sPC9wYWNrYWdpbmdJbmNsdWRlcz4KKyAgICAgICAgdG8gcGljayB1cCA8Y2xhc3MtbG9hZGVyPiAtLT4KKyAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJwb206cGx1Z2luW3BvbTphcnRpZmFjdElkPSdtYXZlbi13YXItcGx1Z2luJ10iPgorICAgICAgICA8eHNsOmNvcHk+CisgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyAvPgorICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJjb3VudChwb206Y29uZmlndXJhdGlvbik9MSI+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxmYWlsT25NaXNzaW5nV2ViWG1sPmZhbHNlPC9mYWlsT25NaXNzaW5nV2ViWG1sPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICA8L3hzbDpjb3B5PgorICAgIDwveHNsOnRlbXBsYXRlPgorCisgICAgPCEtLSByZW1vdmUgZXhhbXBsZXMtc291cmNlLXppcCBwcm9maWxlIC0tPgorICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InBvbTpwcm9maWxlL3BvbTpwbHVnaW5zL3BvbTpwbHVnaW5bcG9tOmlkPSdleGFtcGxlcy1zb3VyY2UtemlwJ10iPgorICAgIDwveHNsOnRlbXBsYXRlPgorCisgICAgPCEtLSZsdDshJm5kYXNoOyByZW1vdmUgeHNsdC1tYXZlbi1wbHVnaW4gJm5kYXNoOyZndDstLT4KKyAgICA8IS0tPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icG9tOnBsdWdpbltwb206YXJ0aWZhY3RJZD0neG1sLW1hdmVuLXBsdWdpbiddIj4tLT4KKyAgICA8IS0tPC94c2w6dGVtcGxhdGU+LS0+CisKKyAgICA8IS0tJmx0OyEmbmRhc2g7IHJlbW92ZSBtYXZlbi1hc3NlbWJseS1wbHVnaW4gJm5kYXNoOyZndDstLT4KKyAgICA8IS0tPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icG9tOnBsdWdpbltwb206YXJ0aWZhY3RJZD0nbWF2ZW4tYXNzZW1ibHktcGx1Z2luJ10iPi0tPgorICAgIDwhLS08L3hzbDp0ZW1wbGF0ZT4tLT4KKworICAgIDwhLS0gcmVtb3ZlIG1hdmVuLWpldHR5LXBsdWdpbiAtLT4KKyAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJwb206cGx1Z2luW3BvbTphcnRpZmFjdElkPSdtYXZlbi1qZXR0eS1wbHVnaW4nXSI+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKyAgICA8IS0tIHJlbW92ZSBqZXR0eS1tYXZlbi1wbHVnaW4gLS0+CisgICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icG9tOnBsdWdpbltwb206YXJ0aWZhY3RJZD0namV0dHktbWF2ZW4tcGx1Z2luJ10iPgorICAgIDwveHNsOnRlbXBsYXRlPgorCisgICAgPCEtLSByZW1vdmUgZmFpbHNhZmUgcGx1Z2luIChpbnRlZ3JhdGlvbiB0ZXN0aW5nIG5vdCBwb3NzaWJsZSB3aXRob3V0IGpldHR5L290aGVyIGNvbnRhaW5lcikgLS0+CisgICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icG9tOnBsdWdpbltwb206YXJ0aWZhY3RJZD0nbWF2ZW4tZmFpbHNhZmUtcGx1Z2luJ10iPgorICAgIDwveHNsOnRlbXBsYXRlPgorCisgICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iY29tbWVudCgpIj4KKyAgICAgICAgPHhzbDpjb21tZW50PgorICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iIC8+CisgICAgICAgIDwveHNsOmNvbW1lbnQ+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKyAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIqIj4KKyAgICAgICAgPHhzbDpjb3B5PgorICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgLz4KKyAgICAgICAgPC94c2w6Y29weT4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2V0Yy93bHMtcHJvamVjdC1zcmMtcG9tLnhzbCBiL2V4YW1wbGVzL2V0Yy93bHMtcHJvamVjdC1zcmMtcG9tLnhzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTE2YjViCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZXRjL3dscy1wcm9qZWN0LXNyYy1wb20ueHNsCkBAIC0wLDAgKzEsMTkzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKKyAgICAgICAgeG1sbnM6cG9tPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCisgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiCisgICAgICAgIHZlcnNpb249IjEuMCI+CisKKyAgICA8eHNsOm91dHB1dCBtZXRob2Q9InhtbCIgaW5kZW50PSJ5ZXMiIC8+CisKKyAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KKyAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgLz4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDx4c2w6dGVtcGxhdGUKKyAgICAgICAgICAgIG1hdGNoPSJwb206ZGVwZW5kZW5jaWVzL3BvbTpkZXBlbmRlbmN5W3BvbTpncm91cElkPSdvcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlJworICAgICAgICAgICAgb3IgcG9tOmdyb3VwSWQ9J29yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnMnCisgICAgICAgICAgICBvciBwb206YXJ0aWZhY3RJZD0namVyc2V5LWJlYW4tdmFsaWRhdGlvbicKKyAgICAgICAgICAgIG9yIHBvbTphcnRpZmFjdElkPSdqZXJzZXktbWVkaWEtanNvbi1qYWNrc29uJworICAgICAgICAgICAgb3IgcG9tOmFydGlmYWN0SWQ9J2plcnNleS1tZWRpYS1qc29uLWpldHRpc29uJworICAgICAgICAgICAgb3IgcG9tOmFydGlmYWN0SWQ9J2plcnNleS1tZWRpYS1tb3h5JworICAgICAgICAgICAgb3IgcG9tOmFydGlmYWN0SWQ9J2plcnNleS1tZWRpYS1tdWx0aXBhcnQnCisgICAgICAgICAgICBvciBwb206YXJ0aWZhY3RJZD0namVyc2V5LW1lZGlhLXNzZScKKyAgICAgICAgICAgIG9yIHBvbTpncm91cElkPSdjb20uc3VuLnhtbC5iaW5kJworICAgICAgICAgICAgb3IgcG9tOmdyb3VwSWQ9J2phdmF4LnNlcnZsZXQnXS9wb206c2NvcGVbdGV4dCgpIT10ZXN0XSI+CisgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKyAgICA8eHNsOnRlbXBsYXRlCisgICAgICAgICAgICBtYXRjaD0icG9tOmRlcGVuZGVuY2llcy9wb206ZGVwZW5kZW5jeVtwb206Z3JvdXBJZD0nb3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZScKKyAgICAgICAgICAgIG9yIHBvbTpncm91cElkPSdvcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzJworICAgICAgICAgICAgb3IgcG9tOmFydGlmYWN0SWQ9J2plcnNleS1iZWFuLXZhbGlkYXRpb24nCisgICAgICAgICAgICBvciBwb206YXJ0aWZhY3RJZD0namVyc2V5LW1lZGlhLWpzb24tamFja3NvbicKKyAgICAgICAgICAgIG9yIHBvbTphcnRpZmFjdElkPSdqZXJzZXktbWVkaWEtanNvbi1qZXR0aXNvbicKKyAgICAgICAgICAgIG9yIHBvbTphcnRpZmFjdElkPSdqZXJzZXktbWVkaWEtbW94eScKKyAgICAgICAgICAgIG9yIHBvbTphcnRpZmFjdElkPSdqZXJzZXktbWVkaWEtbXVsdGlwYXJ0JworICAgICAgICAgICAgb3IgcG9tOmFydGlmYWN0SWQ9J2plcnNleS1tZWRpYS1zc2UnCisgICAgICAgICAgICBvciBwb206Z3JvdXBJZD0nY29tLnN1bi54bWwuYmluZCcKKyAgICAgICAgICAgIG9yIHBvbTpncm91cElkPSdqYXZheC5zZXJ2bGV0J10iPgorICAgICAgICA8eHNsOmNvcHk+CisgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyAvPgorICAgICAgICAgICAgPHhzbDppZiB0ZXN0PSJjb3VudChwb206c2NvcGUpPTAiPgorICAgICAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgPC94c2w6Y29weT4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDx4c2w6dGVtcGxhdGUKKyAgICAgICAgICAgIG1hdGNoPSJwb206ZGVwZW5kZW5jaWVzL3BvbTpkZXBlbmRlbmN5W3BvbTphcnRpZmFjdElkPSdqZXJzZXktbXZjLWpzcCcKKyAgICAgICAgICAgIG9yIHBvbTphcnRpZmFjdElkPSdqZXJzZXktbXZjLWZyZWVtYXJrZXInCisgICAgICAgICAgICBvciBwb206YXJ0aWZhY3RJZD0namVyc2V5LW1lZGlhLWpzb24tcHJvY2Vzc2luZyddL3BvbTpzY29wZVt0ZXh0KCkhPXRlc3RdIj4KKyAgICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbW1vbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1zZXJ2ZXI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5oazIuZXh0ZXJuYWw8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguaW5qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LndzLnJzPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LndzLnJzLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKyAgICA8eHNsOnRlbXBsYXRlCisgICAgICAgICAgICBtYXRjaD0icG9tOmRlcGVuZGVuY2llcy9wb206ZGVwZW5kZW5jeVtwb206YXJ0aWZhY3RJZD0namVyc2V5LW12Yy1qc3AnCisgICAgICAgICAgICBvciBwb206YXJ0aWZhY3RJZD0namVyc2V5LW12Yy1mcmVlbWFya2VyJworICAgICAgICAgICAgb3IgcG9tOmFydGlmYWN0SWQ9J2plcnNleS1tZWRpYS1qc29uLXByb2Nlc3NpbmcnXSI+CisgICAgICAgIDx4c2w6Y29weT4KKyAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIC8+CisgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KHBvbTpzY29wZSk9MCI+CisgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgICAgICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbW1vbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXNlcnZlcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmhrMi5leHRlcm5hbDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LmluamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC53cy5yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LndzLnJzLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgICAgICAgPC9leGNsdXNpb25zPgorICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgIDwveHNsOmNvcHk+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKyAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJwb206ZGVwZW5kZW5jaWVzIj4KKyAgICAgICAgPHhzbDpjb3B5PgorICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgLz4KKyAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iY291bnQocG9tOmRlcGVuZGVuY3lbcG9tOmFydGlmYWN0SWQ9J2plcnNleS1jb250YWluZXItc2VydmxldC1jb3JlJ10pPTAiPgorICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgPC94c2w6Y29weT4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InBvbTpwcm9qZWN0Ij4KKyAgICAgICAgPHhzbDpjb3B5PgorICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgLz4KKyAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iY291bnQocG9tOmRlcGVuZGVuY2llcyk9MCI+CisgICAgICAgICAgICAgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+CisgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgPC94c2w6Y29weT4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDwhLS0gcmVtb3ZlIDxwYWNrYWdpbmdFeGNsdWRlcz5XRUItSU5GL2dsYXNzZmlzaC13ZWIueG1sPC9wYWNrYWdpbmdFeGNsdWRlcz4KKyAgICAgICAgIGFzIHRoaXMgZmlsZSBpcyByZXF1aXJlZCBpbiBHbGFzc2Zpc2ggYnVuZGxlIHNpbmNlIDxjbGFzcy1sb2FkZXI+CisgICAgICAgICBpcyBkZWZpbmVkIGluIGl0IC0tPgorICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InBvbTpwbHVnaW5bcG9tOmFydGlmYWN0SWQ9J21hdmVuLXdhci1wbHVnaW4nXS9wb206Y29uZmlndXJhdGlvbltwb206cGFja2FnaW5nRXhjbHVkZXNdIj4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDwhLS1idWlsZCB3YXIgZXZlbiBpZiB3ZWIueG1sIGlzIG1pc3NpbmcgYXMgaXQncyBub3QgcmVxdWlyZWQsCisgICAgICAgIDxwYWNrYWdpbmdJbmNsdWRlcz4gZGVmYXVsdHMgdG8gJ2FsbCcgc28gaXQgaW5jbHVkZXMKKyAgICAgICAgPHBhY2thZ2luZ0luY2x1ZGVzPldFQi1JTkYvZ2xhc3NmaXNoLXdlYi54bWw8L3BhY2thZ2luZ0luY2x1ZGVzPgorICAgICAgICB0byBwaWNrIHVwIDxjbGFzcy1sb2FkZXI+IC0tPgorICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InBvbTpwbHVnaW5bcG9tOmFydGlmYWN0SWQ9J21hdmVuLXdhci1wbHVnaW4nXSI+CisgICAgICAgIDx4c2w6Y29weT4KKyAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIC8+CisgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KHBvbTpjb25maWd1cmF0aW9uKT0xIj4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGZhaWxPbk1pc3NpbmdXZWJYbWw+ZmFsc2U8L2ZhaWxPbk1pc3NpbmdXZWJYbWw+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgIDwveHNsOmNvcHk+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKyAgICA8IS0tIHJlbW92ZSBleGFtcGxlcy1zb3VyY2UtemlwIHByb2ZpbGUgLS0+CisgICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icG9tOnByb2ZpbGUvcG9tOnBsdWdpbnMvcG9tOnBsdWdpbltwb206aWQ9J2V4YW1wbGVzLXNvdXJjZS16aXAnXSI+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKyAgICA8IS0tJmx0OyEmbmRhc2g7IHJlbW92ZSB4c2x0LW1hdmVuLXBsdWdpbiAmbmRhc2g7Jmd0Oy0tPgorICAgIDwhLS08eHNsOnRlbXBsYXRlIG1hdGNoPSJwb206cGx1Z2luW3BvbTphcnRpZmFjdElkPSd4bWwtbWF2ZW4tcGx1Z2luJ10iPi0tPgorICAgIDwhLS08L3hzbDp0ZW1wbGF0ZT4tLT4KKworICAgIDwhLS0mbHQ7ISZuZGFzaDsgcmVtb3ZlIG1hdmVuLWFzc2VtYmx5LXBsdWdpbiAmbmRhc2g7Jmd0Oy0tPgorICAgIDwhLS08eHNsOnRlbXBsYXRlIG1hdGNoPSJwb206cGx1Z2luW3BvbTphcnRpZmFjdElkPSdtYXZlbi1hc3NlbWJseS1wbHVnaW4nXSI+LS0+CisgICAgPCEtLTwveHNsOnRlbXBsYXRlPi0tPgorCisgICAgPCEtLSByZW1vdmUgbWF2ZW4tamV0dHktcGx1Z2luIC0tPgorICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InBvbTpwbHVnaW5bcG9tOmFydGlmYWN0SWQ9J21hdmVuLWpldHR5LXBsdWdpbiddIj4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDwhLS0gcmVtb3ZlIGpldHR5LW1hdmVuLXBsdWdpbiAtLT4KKyAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJwb206cGx1Z2luW3BvbTphcnRpZmFjdElkPSdqZXR0eS1tYXZlbi1wbHVnaW4nXSI+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKyAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJjb21tZW50KCkiPgorICAgICAgICA8eHNsOmNvbW1lbnQ+CisgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIgLz4KKyAgICAgICAgPC94c2w6Y29tbWVudD4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9IioiPgorICAgICAgICA8eHNsOmNvcHk+CisgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyAvPgorICAgICAgICA8L3hzbDpjb3B5PgorICAgIDwveHNsOnRlbXBsYXRlPgorCis8L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZXRjL3dscy1wcm9qZWN0LXNyYy13ZWIueHNsIGIvZXhhbXBsZXMvZXRjL3dscy1wcm9qZWN0LXNyYy13ZWIueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MDA5Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9ldGMvd2xzLXByb2plY3Qtc3JjLXdlYi54c2wKQEAgLTAsMCArMSwzMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisKKy0tPgorCis8eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCisgICAgICAgIHhtbG5zOndlYj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgorICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIgorICAgICAgICB2ZXJzaW9uPSIxLjAiPgorCisgICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibm9kZSgpfEAqIj4KKyAgICAgICAgPHhzbDpjb3B5PgorICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJub2RlKCl8QCoiLz4KKyAgICAgICAgPC94c2w6Y29weT4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDwhLS0gZml4ZXMgdGhlIGhhcmRjb2RlZCBwb3J0IGluIG1hbmFnZWQtY2xpZW50LXdlYmFwcCBleGFtcGxlJ3Mgd2ViLnhtbCAtLT4KKyAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL3dlYjp3ZWItYXBwL3dlYjpzZXJ2bGV0L3dlYjppbml0LXBhcmFtW3dlYjpwYXJhbS1uYW1lPSdvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5tYW5hZ2VkY2xpZW50LkNsaWVudEEuYmFzZVVyaSddL3dlYjpwYXJhbS12YWx1ZSI+CisgICAgICAgIDx4c2w6Y29weT4KKyAgICAgICAgICAgIDx4c2w6dGV4dD5odHRwOi8vbG9jYWxob3N0OjcwMDEvbWFuYWdlZC1jbGllbnQtd2ViYXBwL2ludGVybmFsPC94c2w6dGV4dD4KKyAgICAgICAgPC94c2w6Y29weT4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2V0Yy93bHMxMjEzLXByb2plY3Qtc3JjLXBvbS54c2wgYi9leGFtcGxlcy9ldGMvd2xzMTIxMy1wcm9qZWN0LXNyYy1wb20ueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwYjYzYjUKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9ldGMvd2xzMTIxMy1wcm9qZWN0LXNyYy1wb20ueHNsCkBAIC0wLDAgKzEsMTkzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKKyAgICAgICAgeG1sbnM6cG9tPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCisgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiCisgICAgICAgIHZlcnNpb249IjEuMCI+CisKKyAgICA8eHNsOm91dHB1dCBtZXRob2Q9InhtbCIgaW5kZW50PSJ5ZXMiIC8+CisKKyAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KKyAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgLz4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDx4c2w6dGVtcGxhdGUKKyAgICAgICAgICAgIG1hdGNoPSJwb206ZGVwZW5kZW5jaWVzL3BvbTpkZXBlbmRlbmN5W3BvbTpncm91cElkPSdvcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlJworICAgICAgICAgICAgb3IgcG9tOmdyb3VwSWQ9J29yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnMnCisgICAgICAgICAgICBvciBwb206YXJ0aWZhY3RJZD0namVyc2V5LW1lZGlhLWpzb24tamFja3NvbicKKyAgICAgICAgICAgIG9yIHBvbTphcnRpZmFjdElkPSdqZXJzZXktbWVkaWEtanNvbi1qZXR0aXNvbicKKyAgICAgICAgICAgIG9yIHBvbTphcnRpZmFjdElkPSdqZXJzZXktbWVkaWEtbW94eScKKyAgICAgICAgICAgIG9yIHBvbTphcnRpZmFjdElkPSdqZXJzZXktbWVkaWEtbXVsdGlwYXJ0JworICAgICAgICAgICAgb3IgcG9tOmFydGlmYWN0SWQ9J2plcnNleS1tZWRpYS1zc2UnCisgICAgICAgICAgICBvciBwb206Z3JvdXBJZD0nY29tLnN1bi54bWwuYmluZCcKKyAgICAgICAgICAgIG9yIHBvbTpncm91cElkPSdqYXZheC5zZXJ2bGV0J10vcG9tOnNjb3BlW3RleHQoKSE9dGVzdF0iPgorICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgIDwveHNsOnRlbXBsYXRlPgorCisgICAgPHhzbDp0ZW1wbGF0ZQorICAgICAgICAgICAgbWF0Y2g9InBvbTpkZXBlbmRlbmNpZXMvcG9tOmRlcGVuZGVuY3lbcG9tOmdyb3VwSWQ9J29yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmUnCisgICAgICAgICAgICBvciBwb206Z3JvdXBJZD0nb3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVycycKKyAgICAgICAgICAgIG9yIHBvbTphcnRpZmFjdElkPSdqZXJzZXktbWVkaWEtanNvbi1qYWNrc29uJworICAgICAgICAgICAgb3IgcG9tOmFydGlmYWN0SWQ9J2plcnNleS1tZWRpYS1qc29uLWpldHRpc29uJworICAgICAgICAgICAgb3IgcG9tOmFydGlmYWN0SWQ9J2plcnNleS1tZWRpYS1tb3h5JworICAgICAgICAgICAgb3IgcG9tOmFydGlmYWN0SWQ9J2plcnNleS1tZWRpYS1tdWx0aXBhcnQnCisgICAgICAgICAgICBvciBwb206YXJ0aWZhY3RJZD0namVyc2V5LW1lZGlhLXNzZScKKyAgICAgICAgICAgIG9yIHBvbTpncm91cElkPSdjb20uc3VuLnhtbC5iaW5kJworICAgICAgICAgICAgb3IgcG9tOmdyb3VwSWQ9J2phdmF4LnNlcnZsZXQnXSI+CisgICAgICAgIDx4c2w6Y29weT4KKyAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIC8+CisgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KHBvbTpzY29wZSk9MCI+CisgICAgICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgICAgIDwveHNsOmlmPgorICAgICAgICA8L3hzbDpjb3B5PgorICAgIDwveHNsOnRlbXBsYXRlPgorCisgICAgPHhzbDp0ZW1wbGF0ZQorICAgICAgICAgICAgbWF0Y2g9InBvbTpkZXBlbmRlbmNpZXMvcG9tOmRlcGVuZGVuY3lbcG9tOmFydGlmYWN0SWQ9J2plcnNleS1iZWFuLXZhbGlkYXRpb24nCisgICAgICAgICAgICBvciBwb206YXJ0aWZhY3RJZD0namVyc2V5LW12Yy1qc3AnCisgICAgICAgICAgICBvciBwb206YXJ0aWZhY3RJZD0namVyc2V5LW12Yy1mcmVlbWFya2VyJworICAgICAgICAgICAgb3IgcG9tOmFydGlmYWN0SWQ9J2plcnNleS1tZWRpYS1qc29uLXByb2Nlc3NpbmcnXS9wb206c2NvcGVbdGV4dCgpIT10ZXN0XSI+CisgICAgICAgIDxleGNsdXNpb25zPgorICAgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb21tb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktc2VydmVyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guaGsyLmV4dGVybmFsPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LmluamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC53cy5yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC53cy5ycy1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgPC9leGNsdXNpb25zPgorICAgIDwveHNsOnRlbXBsYXRlPgorCisgICAgPHhzbDp0ZW1wbGF0ZQorICAgICAgICAgICAgbWF0Y2g9InBvbTpkZXBlbmRlbmNpZXMvcG9tOmRlcGVuZGVuY3lbcG9tOmFydGlmYWN0SWQ9J2plcnNleS1iZWFuLXZhbGlkYXRpb24nCisgICAgICAgICAgICBvciBwb206YXJ0aWZhY3RJZD0namVyc2V5LW12Yy1qc3AnCisgICAgICAgICAgICBvciBwb206YXJ0aWZhY3RJZD0namVyc2V5LW12Yy1mcmVlbWFya2VyJworICAgICAgICAgICAgb3IgcG9tOmFydGlmYWN0SWQ9J2plcnNleS1tZWRpYS1qc29uLXByb2Nlc3NpbmcnXSI+CisgICAgICAgIDx4c2w6Y29weT4KKyAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIC8+CisgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KHBvbTpzY29wZSk9MCI+CisgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgICAgICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbW1vbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXNlcnZlcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmhrMi5leHRlcm5hbDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LmluamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC53cy5yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LndzLnJzLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgICAgICAgPC9leGNsdXNpb25zPgorICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgIDwveHNsOmNvcHk+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKyAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJwb206ZGVwZW5kZW5jaWVzIj4KKyAgICAgICAgPHhzbDpjb3B5PgorICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgLz4KKyAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iY291bnQocG9tOmRlcGVuZGVuY3lbcG9tOmFydGlmYWN0SWQ9J2plcnNleS1jb250YWluZXItc2VydmxldC1jb3JlJ10pPTAiPgorICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgPC94c2w6Y29weT4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InBvbTpwcm9qZWN0Ij4KKyAgICAgICAgPHhzbDpjb3B5PgorICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgLz4KKyAgICAgICAgICAgIDx4c2w6aWYgdGVzdD0iY291bnQocG9tOmRlcGVuZGVuY2llcyk9MCI+CisgICAgICAgICAgICAgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+CisgICAgICAgICAgICA8L3hzbDppZj4KKyAgICAgICAgPC94c2w6Y29weT4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDwhLS0gcmVtb3ZlIDxwYWNrYWdpbmdFeGNsdWRlcz5XRUItSU5GL2dsYXNzZmlzaC13ZWIueG1sPC9wYWNrYWdpbmdFeGNsdWRlcz4KKyAgICAgICAgIGFzIHRoaXMgZmlsZSBpcyByZXF1aXJlZCBpbiBHbGFzc2Zpc2ggYnVuZGxlIHNpbmNlIDxjbGFzcy1sb2FkZXI+CisgICAgICAgICBpcyBkZWZpbmVkIGluIGl0IC0tPgorICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InBvbTpwbHVnaW5bcG9tOmFydGlmYWN0SWQ9J21hdmVuLXdhci1wbHVnaW4nXS9wb206Y29uZmlndXJhdGlvbltwb206cGFja2FnaW5nRXhjbHVkZXNdIj4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDwhLS1idWlsZCB3YXIgZXZlbiBpZiB3ZWIueG1sIGlzIG1pc3NpbmcgYXMgaXQncyBub3QgcmVxdWlyZWQsCisgICAgICAgIDxwYWNrYWdpbmdJbmNsdWRlcz4gZGVmYXVsdHMgdG8gJ2FsbCcgc28gaXQgaW5jbHVkZXMKKyAgICAgICAgPHBhY2thZ2luZ0luY2x1ZGVzPldFQi1JTkYvZ2xhc3NmaXNoLXdlYi54bWw8L3BhY2thZ2luZ0luY2x1ZGVzPgorICAgICAgICB0byBwaWNrIHVwIDxjbGFzcy1sb2FkZXI+IC0tPgorICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InBvbTpwbHVnaW5bcG9tOmFydGlmYWN0SWQ9J21hdmVuLXdhci1wbHVnaW4nXSI+CisgICAgICAgIDx4c2w6Y29weT4KKyAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIC8+CisgICAgICAgICAgICA8eHNsOmlmIHRlc3Q9ImNvdW50KHBvbTpjb25maWd1cmF0aW9uKT0xIj4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGZhaWxPbk1pc3NpbmdXZWJYbWw+ZmFsc2U8L2ZhaWxPbk1pc3NpbmdXZWJYbWw+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC94c2w6aWY+CisgICAgICAgIDwveHNsOmNvcHk+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKyAgICA8IS0tIHJlbW92ZSBleGFtcGxlcy1zb3VyY2UtemlwIHByb2ZpbGUgLS0+CisgICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0icG9tOnByb2ZpbGUvcG9tOnBsdWdpbnMvcG9tOnBsdWdpbltwb206aWQ9J2V4YW1wbGVzLXNvdXJjZS16aXAnXSI+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKyAgICA8IS0tJmx0OyEmbmRhc2g7IHJlbW92ZSB4c2x0LW1hdmVuLXBsdWdpbiAmbmRhc2g7Jmd0Oy0tPgorICAgIDwhLS08eHNsOnRlbXBsYXRlIG1hdGNoPSJwb206cGx1Z2luW3BvbTphcnRpZmFjdElkPSd4bWwtbWF2ZW4tcGx1Z2luJ10iPi0tPgorICAgIDwhLS08L3hzbDp0ZW1wbGF0ZT4tLT4KKworICAgIDwhLS0mbHQ7ISZuZGFzaDsgcmVtb3ZlIG1hdmVuLWFzc2VtYmx5LXBsdWdpbiAmbmRhc2g7Jmd0Oy0tPgorICAgIDwhLS08eHNsOnRlbXBsYXRlIG1hdGNoPSJwb206cGx1Z2luW3BvbTphcnRpZmFjdElkPSdtYXZlbi1hc3NlbWJseS1wbHVnaW4nXSI+LS0+CisgICAgPCEtLTwveHNsOnRlbXBsYXRlPi0tPgorCisgICAgPCEtLSByZW1vdmUgbWF2ZW4tamV0dHktcGx1Z2luIC0tPgorICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9InBvbTpwbHVnaW5bcG9tOmFydGlmYWN0SWQ9J21hdmVuLWpldHR5LXBsdWdpbiddIj4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDwhLS0gcmVtb3ZlIGpldHR5LW1hdmVuLXBsdWdpbiAtLT4KKyAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJwb206cGx1Z2luW3BvbTphcnRpZmFjdElkPSdqZXR0eS1tYXZlbi1wbHVnaW4nXSI+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKyAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJjb21tZW50KCkiPgorICAgICAgICA8eHNsOmNvbW1lbnQ+CisgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIgLz4KKyAgICAgICAgPC94c2w6Y29tbWVudD4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9IioiPgorICAgICAgICA8eHNsOmNvcHk+CisgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyAvPgorICAgICAgICA8L3hzbDpjb3B5PgorICAgIDwveHNsOnRlbXBsYXRlPgorCis8L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZXRjL3dsczEyMTMtcHJvamVjdC1zcmMtd2ViLnhzbCBiL2V4YW1wbGVzL2V0Yy93bHMxMjEzLXByb2plY3Qtc3JjLXdlYi54c2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI0MWU3YgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2V0Yy93bHMxMjEzLXByb2plY3Qtc3JjLXdlYi54c2wKQEAgLTAsMCArMSwzMyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisKKy0tPgorCis8eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCisgICAgICAgIHhtbG5zOndlYj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgorICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIgorICAgICAgICB2ZXJzaW9uPSIxLjAiPgorCisgICAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibm9kZSgpfEAqIj4KKyAgICAgICAgPHhzbDpjb3B5PgorICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJub2RlKCl8QCoiLz4KKyAgICAgICAgPC94c2w6Y29weT4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDwhLS0gZml4ZXMgdGhlIGhhcmRjb2RlZCBwb3J0IGluIG1hbmFnZWQtY2xpZW50LXdlYmFwcCBleGFtcGxlJ3Mgd2ViLnhtbCAtLT4KKyAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL3dlYjp3ZWItYXBwL3dlYjpzZXJ2bGV0L3dlYjppbml0LXBhcmFtW3dlYjpwYXJhbS1uYW1lPSdvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5tYW5hZ2VkY2xpZW50LkNsaWVudEEuYmFzZVVyaSddL3dlYjpwYXJhbS12YWx1ZSI+CisgICAgICAgIDx4c2w6Y29weT4KKyAgICAgICAgICAgIDx4c2w6dGV4dD5odHRwOi8vbG9jYWxob3N0OjcwMDEvbWFuYWdlZC1jbGllbnQtd2ViYXBwL2ludGVybmFsPC94c2w6dGV4dD4KKyAgICAgICAgPC94c2w6Y29weT4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2V0Yy93bHMxMjEzL1JFQURNRS1XTFMuaHRtbCBiL2V4YW1wbGVzL2V0Yy93bHMxMjEzL1JFQURNRS1XTFMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTZiOWI1Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZXRjL3dsczEyMTMvUkVBRE1FLVdMUy5odG1sCkBAIC0wLDAgKzEsNzggQEAKKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisKKy0tPgorCis8IURPQ1RZUEUgaHRtbD4KKyAgICA8aGVhZD4KKyAgICAgICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgorICAgICAgICA8bWV0YSBodHRwLWVxdWl2PSJYLVVBLUNvbXBhdGlibGUiIGNvbnRlbnQ9IklFPWVkZ2UiPgorICAgICAgICA8dGl0bGU+V0xTIDEyLjEuMyBTaGFyZWQgTGlicmFyeSBpbnN0YWxsYXRpb24gc3RlcHMuPC90aXRsZT4KKworICAgICAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHA6Ly9uZXRkbmEuYm9vdHN0cmFwY2RuLmNvbS9ib290c3RyYXAvMy4wLjAtcmMxL2Nzcy9ib290c3RyYXAubWluLmNzcyI+CisgICAgPC9oZWFkPgorCisgICAgPGJvZHk+CisgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CisgICAgICAgICAgICA8ZGl2IGNsYXNzPSJyb3ciPgorICAgICAgICAgICAgICAgIDxoMT5XZWJsb2dpYyAxMi4xLjMgU2hhcmVkIExpYnJhcnkgSW5zdGFsbGF0aW9uIFN0ZXBzPC9oMT4KKworICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgICAgICBCZWZvcmUgZGVwbG95aW5nIGFuIEpBWC1SUyAyLjAgYXBwbGljYXRpb24gaW50byBXTFMgMTIuMS4zIHlvdSBuZWVkIHRvIGluc3RhbGwgKGRlcGxveSkgdGhlIEpBWC1SUyAyLjAgc2hhcmVkCisgICAgICAgICAgICAgICAgICAgIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBuZWNlc3NhcnkgZGVwZW5kZW5jaWVzIGFuZCBjb25maWd1cmF0aW9uLiBUaGlzIGxpYnJhcnkgaXMgbG9jYXRlZCBhdAorICAgICAgICAgICAgICAgICAgICA8Y29kZT5NV19IT01FXHdsc2VydmVyXGNvbW1vblxkZXBsb3lhYmxlLWxpYnJhcmllc1xqYXgtcnMtMi4wLndhcjwvY29kZT4uCisgICAgICAgICAgICAgICAgPC9wPgorICAgICAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgICAgICBUaGVyZSBhcmUgdHdvIHdheXMsIGhvdyB5b3UgY2FuIGRlcGxveSB0aGlzIGxpYnJhcnk6CisgICAgICAgICAgICAgICAgICAgIDx1bD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaT5Vc2luZyBXTFMgY29uc29sZTwvbGk+CisgICAgICAgICAgICAgICAgICAgICAgICA8bGk+VXNpbmcgV0xTVDwvbGk+CisgICAgICAgICAgICAgICAgICAgIDwvdWw+CisgICAgICAgICAgICAgICAgPC9wPgorCisgICAgICAgICAgICAgICAgPGgyPkRlcGxveWluZyBzaGFyZWQgbGlicmFyeSB1c2luZyBXTFMgY29uc29sZTwvaDI+CisKKyAgICAgICAgICAgICAgICA8b2w+CisgICAgICAgICAgICAgICAgICAgIDxsaT5Mb2cgaW50byBXTFMgY29uc29sZSBhdCA8Y29kZT5odHRwOi8vJmx0O2hvc3QmZ3Q7OiZsdDtwb3J0Jmd0Oy9jb25zb2xlPC9jb2RlPiAoZS5nLiA8Y29kZT5odHRwOi8vbG9jYWxob3N0OjcwMDEvY29uc29sZTwvY29kZT4pPC9saT4KKyAgICAgICAgICAgICAgICAgICAgPGxpPkNsaWNrIG9uIDxlbT5EZXBsb3ltZW50czwvZW0+PC9saT4KKyAgICAgICAgICAgICAgICAgICAgPGxpPkZpbmQgU2hhcmVkIExpYnJhcnkgV0FSIChsb2NhdGVkIGF0IDxjb2RlPk1XX0hPTUVcd2xzZXJ2ZXJcY29tbW9uXGRlcGxveWFibGUtbGlicmFyaWVzXGpheC1ycy0yLjAud2FyPC9jb2RlPik8L2xpPgorICAgICAgICAgICAgICAgICAgICA8bGk+Q2xpY2sgb24gPGVtPk5leHQ8L2VtPjwvbGk+CisgICAgICAgICAgICAgICAgICAgIDxsaT5DaG9vc2UgPGVtPkRlcGxveSBhcyBMaWJyYXJ5PC9lbT48L2xpPgorICAgICAgICAgICAgICAgICAgICA8bGk+Q2xpY2sgb24gPGVtPk5leHQ8L2VtPjwvbGk+CisgICAgICAgICAgICAgICAgICAgIDxsaT5DbGljayBvbiA8ZW0+RmluaXNoPC9lbT48L2xpPgorICAgICAgICAgICAgICAgIDwvb2w+CisKKyAgICAgICAgICAgICAgICA8aDI+RGVwbG95aW5nIHNoYXJlZCBsaWJyYXJ5IHVzaW5nIFdMU1Q8L2gyPgorCisgICAgICAgICAgICAgICAgPHA+TGV0cyBhc3N1bWUgdGhhdCBXTFMgaXMgcnVubmluZyBhbmQgeW91ciBkb21haW4gaXMgbG9jYXRlZCBpbiA8Y29kZT5NV19IT01FPC9jb2RlPiAoPGNvZGU+TVdfSE9NRVxkb21haW48L2NvZGU+KS48L3A+CisKKyAgICAgICAgICAgICAgICA8cD5TZXR1cCB5b3VyIHNoZWxsIGFuZCBlbnRlciB0aGUgV0xTVCBjb25zb2xlOjwvcD4KKworPHByZT4KKz4gIyBiYXNoIHByb21wdAorPiBjZCAkTVdfSE9NRVxkb21haW4KKz4gLiAuL2Jpbi9zZXREb21haW5FbnYuc2gKKz4gamF2YSB3ZWJsb2dpYy5XTFNUCis8L3ByZT4KKworICAgICAgICAgICAgICAgIDxwPkRlcGxveSB0aGUgbGlicmFyeTo8L3A+CisKKzxwcmU+Cis+ICMgV0xTVCBjb25zb2xlCis+IGNvbm5lY3QoJ3VzZXInLCAncGFzcycsICdob3N0JykKKz4gZGVwbG95KCdqYXgtcnMnLCAnLi4vd2xzZXJ2ZXIvY29tbW9uL2RlcGxveWFibGUtbGlicmFyaWVzL2pheC1ycy0yLjAud2FyJywgbGlicmFyeU1vZHVsZT0ndHJ1ZScpCis+IGV4aXQoKQorPC9wcmU+CisKKworICAgICAgICAgICAgPC9kaXY+CisgICAgICAgIDwvZGl2PgorICAgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2V0Yy93bHMxMjEzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYmxvZ2ljLnhtbCBiL2V4YW1wbGVzL2V0Yy93bHMxMjEzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYmxvZ2ljLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWMxMWMwCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZXRjL3dsczEyMTMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2VibG9naWMueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorCistLT4KKworPHdsczp3ZWJsb2dpYy13ZWItYXBwIHhtbG5zOndscz0iaHR0cDovL3htbG5zLm9yYWNsZS5jb20vd2VibG9naWMvd2VibG9naWMtd2ViLWFwcCIKKyAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8veG1sbnMub3JhY2xlLmNvbS93ZWJsb2dpYy93ZWJsb2dpYy13ZWItYXBwIGh0dHA6Ly94bWxucy5vcmFjbGUuY29tL3dlYmxvZ2ljL3dlYmxvZ2ljLXdlYi1hcHAvMS4wL3dlYmxvZ2ljLXdlYi1hcHAueHNkIj4KKworICAgIDx3bHM6bGlicmFyeS1yZWY+CisgICAgICAgIDx3bHM6bGlicmFyeS1uYW1lPmpheC1yczwvd2xzOmxpYnJhcnktbmFtZT4KKyAgICAgICAgPHdsczpzcGVjaWZpY2F0aW9uLXZlcnNpb24+Mi4wPC93bHM6c3BlY2lmaWNhdGlvbi12ZXJzaW9uPgorICAgICAgICA8d2xzOmV4YWN0LW1hdGNoPnRydWU8L3dsczpleGFjdC1tYXRjaD4KKyAgICA8L3dsczpsaWJyYXJ5LXJlZj4KKzwvd2xzOndlYmxvZ2ljLXdlYi1hcHA+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9leGNlcHRpb24tbWFwcGluZy9SRUFETUUuTUQgYi9leGFtcGxlcy9leGNlcHRpb24tbWFwcGluZy9SRUFETUUuTUQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEzNjI0ZAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2V4Y2VwdGlvbi1tYXBwaW5nL1JFQURNRS5NRApAQCAtMCwwICsxLDQ5IEBACitbLy9dOiAjICIgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICIKK1svL106ICMgIiAiCitbLy9dOiAjICIgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlICIKK1svL106ICMgIiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCAiCitbLy9dOiAjICIgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLiAiCitbLy9dOiAjICIgIgorWy8vXTogIyAiIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UgIgorCitFeGNlcHRpb24gTWFwcGluZyBFeGFtcGxlCis9PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIGNyZWF0ZSBhIGN1c3RvbSBleGNlcHRpb24gbWFwcGluZy4gVGhlcmUgYXJlIGRlc2NyaWJlZCBzZXZlcmFsIGNvbW1vbiB1c2UtY2FzZXMgc3VjaCBhcworYFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uYCwgY3VzdG9tIGV4Y2VwdGlvbnMgYW5kIGFuIGV4Y2VwdGlvbiBtYXBwZXIgaW5oZXJpdGFuY2UuCisKK1RoZSBmdWxsIGRlc2NyaXB0aW9uIGhvdyB0byBoYW5kbGUgZXhjZXB0aW9uIGFuZCBtYXAgdGhlbSB0byBSZXNwb25zZSBvYmplY3QgY2FuIGJlIGZvdW5kIGluIEplcnNleSBVc2VyIEd1aWRlLCBjaGFwdGVyCitbV2ViQXBwbGljYXRpb25FeGNlcHRpb24gYW5kIE1hcHBpbmcgRXhjZXB0aW9ucyB0byBSZXNwb25zZXNdKGh0dHBzOi8vamVyc2V5LmphdmEubmV0L2RvY3VtZW50YXRpb24vbGF0ZXN0L3JlcHJlc2VudGF0aW9ucy5odG1sI2QwZTY1NjcpLgorCitDb250ZW50cworLS0tLS0tLS0KKworVGhlIG1hcHBpbmcgb2YgdGhlIFVSSSBwYXRoIHNwYWNlIGlzIHByZXNlbnRlZCBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOgorCitVUkkgcGF0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBIVFRQIG1ldGhvZHMgIHwgQWxsb3dlZCBWYWx1ZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgfCAtLS0tLS0tLS0tLS0tIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0KKyoqXy9leGNlcHRpb25fKiogICAgICAgICAgICAgICAgICAgICAgICAgICB8IEdFVCAgICAgICAgICAgfCAtLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcmV0dXJucyAicGluZyEiCisqKl8vZXhjZXB0aW9uL3dlYmFwcGxpY2F0aW9uX2VudGl0eV8qKiAgICAgfCBQT1NUICAgICAgICAgIHwgdHdvIG51bWJlcnMgZGVsaW1pdGVkIGJ5IGNvbG9ucyBlLmcuIDE6MjAxICB8IG5vdCBoYW5kbGVkIGJ5IGBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbk1hcHBlcmAgKGFscmVhZHkgaGFzIGFuIGVudGl0eSBpbiB0aGUgZXhjZXB0aW9uKQorKipfL2V4Y2VwdGlvbi93ZWJhcHBsaWNhdGlvbl9ub2VudGl0eV8qKiAgIHwgUE9TVCAgICAgICAgICB8IGUuZy4gMToyMDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBoYW5kbGVkIGJ5IGBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbk1hcHBlcmAKKyoqXy9leGNlcHRpb24vbXlfKiogICAgICAgICAgICAgICAgICAgICAgICB8IFBPU1QgICAgICAgICAgfCBlLmcuIDE6MjAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgaGFuZGxlZCBieSBgTXlFeGNlcHRpb25NYXBwZXJgCisqKl8vZXhjZXB0aW9uL215c3ViXyoqICAgICAgICAgICAgICAgICAgICAgfCBQT1NUICAgICAgICAgIHwgZS5nLiAxOjIwMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGhhbmRsZWQgYnkgYE15U3ViRXhjZXB0aW9uTWFwcGVyYAorKipfL2V4Y2VwdGlvbi9teXN1YnN1Yl8qKiAgICAgICAgICAgICAgICAgIHwgUE9TVCAgICAgICAgICB8IGUuZy4gMToyMDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBoYW5kbGVkIGJ5IGBNeVN1YkV4Y2VwdGlvbk1hcHBlcmAKKyoqXy9leGNlcHRpb24vcmVxdWVzdF9leGNlcHRpb25fKiogICAgICAgICB8IFBPU1QgICAgICAgICAgfCBTdHJpbmcgIlJlcXVlc3QgRXhjZXB0aW9uIiAgICAgICAgICAgICAgICAgIHwgbm90IHJlYWNoZWQgYSByZXNvdXJjZSBtZXRob2QsIHByb2Nlc3NlZCBieSBgQ29udGFpbmVyUmVxdWVzdEZpbHRlcmAKKyoqXy9leGNlcHRpb24vcmVzcG9uc2VfZXhjZXB0aW9uXyoqICAgICAgICB8IEdFVCAgICAgICAgICAgfCAtLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgcmVzcG9uc2UgaGFuZGxlZCBhbmQgY2hhbmdlZCBieSBgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXJgCisKKworQXBwbGljYXRpb24gaXMgYmFzZWQgb24gR3JpenpseSBjb250YWluZXIgKHNlZSBgQXBwYCkuIEV2ZXJ5dGhpbmcgbmVlZGVkCisocmVzb3VyY2VzL3Byb3ZpZGVycykgaXMgcmVnaXN0ZXJlZCBpbiBgRXhjZXB0aW9uUmVzb3VyY2VgIGFuZCBjdXN0b20gZXhjZXB0aW9ucworYWxvbmcgd2l0aCBtYXBwZXJzIGNhbiBiZSBmb3VuZCBpbiBgRXhjZXB0aW9uc2AgY2xhc3MuCisKK1J1bm5pbmcgdGhlIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworUnVuIHRoZSBleGFtcGxlIGFzIGZvbGxvd3M6CisKKz4gICAgIG12biBjbGVhbiBjb21waWxlIGV4ZWM6amF2YQorCitUaGlzIGRlcGxveXMgdGhlIGV4YW1wbGUgdXNpbmcgW0dyaXp6bHldKGh0dHA6Ly9ncml6emx5LmphdmEubmV0LykgY29udGFpbmVyLgorCistICAgPGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9iYXNlL2V4Y2VwdGlvbj4KKy0gICA8aHR0cDovL2xvY2FsaG9zdDo4MDgwL2Jhc2UvZXhjZXB0aW9uL3Jlc3BvbnNlX2V4Y2VwdGlvbj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2V4Y2VwdGlvbi1tYXBwaW5nL3BvbS54bWwgYi9leGFtcGxlcy9leGNlcHRpb24tbWFwcGluZy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZjQxOGQKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9leGNlcHRpb24tbWFwcGluZy9wb20ueG1sCkBAIC0wLDAgKzEsNzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5leGNlcHRpb24tbWFwcGluZzwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS1leGFtcGxlcy1leGNlcHRpb24tbWFwcGluZzwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgZXhhbXBsZSBzaG93aW5nIGV4Y2VwdGlvbiBtYXBwZXJzIGluIGFjdGlvbi48L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1ncml6emx5Mi1odHRwPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWhrMjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1idW5kbGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dHlwZT5wb208L3R5cGU+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmV4ZWMtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8bWFpbkNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmV4Y2VwdGlvbi5BcHA8L21haW5DbGFzcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnJlbGVhc2U8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZXhjZXB0aW9uLW1hcHBpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9leGNlcHRpb24vQXBwLmphdmEgYi9leGFtcGxlcy9leGNlcHRpb24tbWFwcGluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2V4Y2VwdGlvbi9BcHAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTIwZWRhCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZXhjZXB0aW9uLW1hcHBpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9leGNlcHRpb24vQXBwLmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5leGNlcHRpb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5Mi5odHRwc2VydmVyLkdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmdyaXp6bHkuaHR0cC5zZXJ2ZXIuSHR0cFNlcnZlcjsKKworLyoqCisgKiBIZWxsbyB3b3JsZCEKKyAqLworcHVibGljIGNsYXNzIEFwcCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgQkFTRV9VUkkgPSBVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYmFzZS8iKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST09UX1BBVEggPSAiZXhjZXB0aW9uIjsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXCJFeGNlcHRpb24gTWFwcGluZ1wiIEplcnNleSBFeGFtcGxlIEFwcCIpOworCisgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgRXhjZXB0aW9uUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlvblJlc291cmNlLk15UmVzcG9uc2VGaWx0ZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgIEV4Y2VwdGlvblJlc291cmNlLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uRmlsdGVyLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb25zLk15RXhjZXB0aW9uTWFwcGVyLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb25zLk15U3ViRXhjZXB0aW9uTWFwcGVyLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICBFeGNlcHRpb25zLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uTWFwcGVyLmNsYXNzKTsKKworICAgICAgICAgICAgZmluYWwgSHR0cFNlcnZlciBzZXJ2ZXIgPSBHcml6emx5SHR0cFNlcnZlckZhY3RvcnkuY3JlYXRlSHR0cFNlcnZlcihCQVNFX1VSSSwgcmVzb3VyY2VDb25maWcsIGZhbHNlKTsKKyAgICAgICAgICAgIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmFkZFNodXRkb3duSG9vayhuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHNlcnZlci5zaHV0ZG93bk5vdygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pKTsKKyAgICAgICAgICAgIHNlcnZlci5zdGFydCgpOworCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgIkFwcGxpY2F0aW9uIHN0YXJ0ZWQuJW4iCisgICAgICAgICAgICAgICAgICAgICsgIlRyeSBvdXQgJXMlcyVuIgorICAgICAgICAgICAgICAgICAgICArICJTdG9wIHRoZSBhcHBsaWNhdGlvbiB1c2luZyBDVFJMK0MiLAorICAgICAgICAgICAgICAgICAgICBCQVNFX1VSSSwgUk9PVF9QQVRIKSk7CisKKyAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuam9pbigpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiB8IEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKEFwcC5jbGFzcy5nZXROYW1lKCkpLmxvZyhMZXZlbC5TRVZFUkUsIG51bGwsIGV4KTsKKyAgICAgICAgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZXhjZXB0aW9uLW1hcHBpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9leGNlcHRpb24vRXhjZXB0aW9uUmVzb3VyY2UuamF2YSBiL2V4YW1wbGVzL2V4Y2VwdGlvbi1tYXBwaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZXhjZXB0aW9uL0V4Y2VwdGlvblJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRjZmU3NAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2V4Y2VwdGlvbi1tYXBwaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZXhjZXB0aW9uL0V4Y2VwdGlvblJlc291cmNlLmphdmEKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZXhjZXB0aW9uOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5JbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlc3BvbnNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5leGNlcHRpb24uRXhjZXB0aW9ucy5NeUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5leGNlcHRpb24uRXhjZXB0aW9ucy5NeVN1YkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5leGNlcHRpb24uRXhjZXB0aW9ucy5NeVN1YlN1YkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdDsKKworLyoqCisgKiBFeGNlcHRpb25SZXNvdXJjZSBjbGFzcy4KKyAqCisgKiBAYXV0aG9yIFNhbnRpYWdvLlBlcmljYXNHZWVydHNlbiBhdCBvcmFjbGUuY29tCisgKi8KK0BQYXRoKCJleGNlcHRpb24iKQorQENvbnN1bWVzKCJ0ZXh0L3BsYWluIikKK0BQcm9kdWNlcygidGV4dC9wbGFpbiIpCitwdWJsaWMgY2xhc3MgRXhjZXB0aW9uUmVzb3VyY2UgeworCisgICAgQFByb3ZpZGVyCisgICAgc3RhdGljIGNsYXNzIE15UmVzcG9uc2VGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXNwb25zZUZpbHRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCwgQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTXlSZXNwb25zZUZpbHRlci5wb3N0RmlsdGVyKCkgZW50ZXIiKTsKKyAgICAgICAgICAgIHJlc3BvbnNlQ29udGV4dC5zZXRFbnRpdHkoCisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlQ29udGV4dC5nZXRFbnRpdHkoKSArICI6IiArIGdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpLCBudWxsLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTXlSZXNwb25zZUZpbHRlci5wb3N0RmlsdGVyKCkgZXhpdCIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgc3RhdGljIGNsYXNzIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uRmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciwgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV2ViQXBwbGljYXRpb25FeGNlcHRpb25GaWx0ZXIucHJlRmlsdGVyKCkgZW50ZXIiKTsKKworICAgICAgICAgICAgU3RyaW5nIHBhdGggPSAoKENvbnRhaW5lclJlcXVlc3QpIGNvbnRleHQpLmdldFJlcXVlc3RVcmkoKS5nZXRQYXRoKCk7CisgICAgICAgICAgICBpZiAocGF0aC5lbmRzV2l0aCgicmVxdWVzdF9leGNlcHRpb24iKSAmJiBjb250ZXh0Lmhhc0VudGl0eSgpICYmICgoQ29udGFpbmVyUmVxdWVzdCkgY29udGV4dCkKKyAgICAgICAgICAgICAgICAgICAgLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKS5lcXVhbHMoIlJlcXVlc3QgRXhjZXB0aW9uIikpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViQXBwbGljYXRpb25FeGNlcHRpb24oUmVzcG9uc2UuU3RhdHVzLk9LKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV2ViQXBwbGljYXRpb25FeGNlcHRpb25GaWx0ZXIucHJlRmlsdGVyKCkgZXhpdCIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCwgQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV2ViQXBwbGljYXRpb25FeGNlcHRpb25GaWx0ZXIucG9zdEZpbHRlcigpIGVudGVyIik7CisgICAgICAgICAgICBpZiAocmVzcG9uc2VDb250ZXh0Lmhhc0VudGl0eSgpICYmIHJlc3BvbnNlQ29udGV4dC5nZXRFbnRpdHkoKS5lcXVhbHMoIlJlc3BvbnNlIEV4Y2VwdGlvbiIpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKFJlc3BvbnNlLlN0YXR1cy5PSyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uRmlsdGVyLnBvc3RGaWx0ZXIoKSBleGl0Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBwaW5nTWUoKSB7CisgICAgICAgIHJldHVybiAicGluZyEiOworICAgIH0KKworICAgIEBQT1NUCisgICAgQFBhdGgoIndlYmFwcGxpY2F0aW9uX2VudGl0eSIpCisgICAgcHVibGljIFN0cmluZyB0ZXN0V2ViQXBwbGljYXRpb25FeGNlcHRpb25FbnRpdHkoU3RyaW5nIHMpIHsKKyAgICAgICAgU3RyaW5nW10gdG9rZW5zID0gcy5zcGxpdCgiOiIpOworICAgICAgICBhc3NlcnQgdG9rZW5zLmxlbmd0aCA9PSAyOworICAgICAgICBpbnQgc3RhdHVzQ29kZSA9IEludGVnZXIudmFsdWVPZih0b2tlbnNbMV0pOworICAgICAgICBSZXNwb25zZSByID0gUmVzcG9uc2Uuc3RhdHVzKHN0YXR1c0NvZGUpLmVudGl0eShzKS5idWlsZCgpOworICAgICAgICB0aHJvdyBuZXcgV2ViQXBwbGljYXRpb25FeGNlcHRpb24ocik7CisgICAgfQorCisgICAgQFBPU1QKKyAgICBAUGF0aCgid2ViYXBwbGljYXRpb25fbm9lbnRpdHkiKQorICAgIHB1YmxpYyBTdHJpbmcgdGVzdFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uTm9FbnRpdHkoU3RyaW5nIHMpIHsKKyAgICAgICAgU3RyaW5nW10gdG9rZW5zID0gcy5zcGxpdCgiOiIpOworICAgICAgICBhc3NlcnQgdG9rZW5zLmxlbmd0aCA9PSAyOworICAgICAgICBpbnQgc3RhdHVzQ29kZSA9IEludGVnZXIudmFsdWVPZih0b2tlbnNbMV0pOworICAgICAgICBSZXNwb25zZSByID0gUmVzcG9uc2Uuc3RhdHVzKHN0YXR1c0NvZGUpLmJ1aWxkKCk7CisgICAgICAgIHRocm93IG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbihyKTsKKyAgICB9CisKKyAgICBAUE9TVAorICAgIEBQYXRoKCJteSIpCisgICAgcHVibGljIFN0cmluZyB0ZXN0TXlFeGNlcHRpb24oU3RyaW5nIHMpIHsKKyAgICAgICAgU3RyaW5nW10gdG9rZW5zID0gcy5zcGxpdCgiOiIpOworICAgICAgICBhc3NlcnQgdG9rZW5zLmxlbmd0aCA9PSAyOworICAgICAgICBpbnQgc3RhdHVzQ29kZSA9IEludGVnZXIudmFsdWVPZih0b2tlbnNbMV0pOworICAgICAgICBSZXNwb25zZSByID0gUmVzcG9uc2Uuc3RhdHVzKHN0YXR1c0NvZGUpLmJ1aWxkKCk7CisgICAgICAgIHRocm93IG5ldyBNeUV4Y2VwdGlvbihyKTsKKyAgICB9CisKKyAgICBAUE9TVAorICAgIEBQYXRoKCJteXN1YiIpCisgICAgcHVibGljIFN0cmluZyB0ZXN0TXlTdWJFeGNlcHRpb24oU3RyaW5nIHMpIHsKKyAgICAgICAgU3RyaW5nW10gdG9rZW5zID0gcy5zcGxpdCgiOiIpOworICAgICAgICBhc3NlcnQgdG9rZW5zLmxlbmd0aCA9PSAyOworICAgICAgICBpbnQgc3RhdHVzQ29kZSA9IEludGVnZXIudmFsdWVPZih0b2tlbnNbMV0pOworICAgICAgICBSZXNwb25zZSByID0gUmVzcG9uc2Uuc3RhdHVzKHN0YXR1c0NvZGUpLmJ1aWxkKCk7CisgICAgICAgIHRocm93IG5ldyBNeVN1YkV4Y2VwdGlvbihyKTsKKyAgICB9CisKKyAgICBAUE9TVAorICAgIEBQYXRoKCJteXN1YnN1YiIpCisgICAgcHVibGljIFN0cmluZyB0ZXN0TXlTdWJTdWJFeGNlcHRpb24oU3RyaW5nIHMpIHsKKyAgICAgICAgU3RyaW5nW10gdG9rZW5zID0gcy5zcGxpdCgiOiIpOworICAgICAgICBhc3NlcnQgdG9rZW5zLmxlbmd0aCA9PSAyOworICAgICAgICBpbnQgc3RhdHVzQ29kZSA9IEludGVnZXIudmFsdWVPZih0b2tlbnNbMV0pOworICAgICAgICBSZXNwb25zZSByID0gUmVzcG9uc2Uuc3RhdHVzKHN0YXR1c0NvZGUpLmJ1aWxkKCk7CisgICAgICAgIHRocm93IG5ldyBNeVN1YlN1YkV4Y2VwdGlvbihyKTsKKyAgICB9CisKKyAgICBAUE9TVAorICAgIEBQYXRoKCJyZXF1ZXN0X2V4Y2VwdGlvbiIpCisgICAgcHVibGljIFN0cmluZyBleGNlcHRpb25JblJlcXVlc3RGaWx0ZXIoKSB7CisgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uKCk7ICAgICAgICAvLyBzaG91bGQgbm90IHJlYWNoIGhlcmUKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInJlc3BvbnNlX2V4Y2VwdGlvbiIpCisgICAgcHVibGljIFN0cmluZyBleGNlcHRpb25JblJlc3BvbnNlRmlsdGVyKCkgeworICAgICAgICByZXR1cm4gIlJlc3BvbnNlIEV4Y2VwdGlvbiI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZXhjZXB0aW9uLW1hcHBpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9leGNlcHRpb24vRXhjZXB0aW9ucy5qYXZhIGIvZXhhbXBsZXMvZXhjZXB0aW9uLW1hcHBpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9leGNlcHRpb24vRXhjZXB0aW9ucy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MGJkZTgKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9leGNlcHRpb24tbWFwcGluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2V4Y2VwdGlvbi9FeGNlcHRpb25zLmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5leGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5FeGNlcHRpb25NYXBwZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCisvKioKKyAqIEV4Y2VwdGlvbnMgY2xhc3MuCisgKgorICogQGF1dGhvciBTYW50aWFnby5QZXJpY2FzLUdlZXJ0c2VuIGF0IG9yYWNsZS5jb20KKyAqLworcHVibGljIGNsYXNzIEV4Y2VwdGlvbnMgeworCisgICAgLy8gLS0gRXhjZXB0aW9ucworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKworICAgICAgICBwcml2YXRlIFJlc3BvbnNlIHJlc3BvbnNlOworCisgICAgICAgIHB1YmxpYyBNeUV4Y2VwdGlvbihSZXNwb25zZSByZXNwb25zZSkgeworICAgICAgICAgICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldFJlc3BvbnNlKCkgeworICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVN1YkV4Y2VwdGlvbiBleHRlbmRzIE15RXhjZXB0aW9uIHsKKworICAgICAgICBwdWJsaWMgTXlTdWJFeGNlcHRpb24oUmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgICAgIHN1cGVyKHJlc3BvbnNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlTdWJTdWJFeGNlcHRpb24gZXh0ZW5kcyBNeVN1YkV4Y2VwdGlvbiB7CisKKyAgICAgICAgcHVibGljIE15U3ViU3ViRXhjZXB0aW9uKFJlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgICAgICAgICBzdXBlcihyZXNwb25zZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyAtLSBFeGNlcHRpb24gTWFwcGVycworICAgIEBQcm92aWRlcgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlFeGNlcHRpb25NYXBwZXIgaW1wbGVtZW50cyBFeGNlcHRpb25NYXBwZXI8TXlFeGNlcHRpb24+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHRvUmVzcG9uc2UoTXlFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICBSZXNwb25zZSByID0gZXhjZXB0aW9uLmdldFJlc3BvbnNlKCk7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKHIuZ2V0U3RhdHVzKCkpLmVudGl0eSgKKyAgICAgICAgICAgICAgICAgICAgIkNvZGU6IiArIHIuZ2V0U3RhdHVzKCkgKyAiOiIgKyBnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSkuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlTdWJFeGNlcHRpb25NYXBwZXIgaW1wbGVtZW50cyBFeGNlcHRpb25NYXBwZXI8TXlTdWJFeGNlcHRpb24+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHRvUmVzcG9uc2UoTXlTdWJFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICBSZXNwb25zZSByID0gZXhjZXB0aW9uLmdldFJlc3BvbnNlKCk7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKHIuZ2V0U3RhdHVzKCkpLmVudGl0eSgKKyAgICAgICAgICAgICAgICAgICAgIkNvZGU6IiArIHIuZ2V0U3RhdHVzKCkgKyAiOiIgKyBnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSkuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgV2ViQXBwbGljYXRpb25FeGNlcHRpb25NYXBwZXIgaW1wbGVtZW50cyBFeGNlcHRpb25NYXBwZXI8V2ViQXBwbGljYXRpb25FeGNlcHRpb24+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHRvUmVzcG9uc2UoV2ViQXBwbGljYXRpb25FeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICBSZXNwb25zZSByID0gZXhjZXB0aW9uLmdldFJlc3BvbnNlKCk7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKHIuZ2V0U3RhdHVzKCkpLmVudGl0eSgiQ29kZToiICsgci5nZXRTdGF0dXMoKSArICI6IgorICAgICAgICAgICAgICAgICAgICArIGdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZXhjZXB0aW9uLW1hcHBpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9leGNlcHRpb24vRXhjZXB0aW9uTWFwcGluZ0ZpbHRlclRlc3QuamF2YSBiL2V4YW1wbGVzL2V4Y2VwdGlvbi1tYXBwaW5nL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZXhjZXB0aW9uL0V4Y2VwdGlvbk1hcHBpbmdGaWx0ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUwOTkzNAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2V4Y2VwdGlvbi1tYXBwaW5nL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZXhjZXB0aW9uL0V4Y2VwdGlvbk1hcHBpbmdGaWx0ZXJUZXN0LmphdmEKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5leGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmV4Y2VwdGlvbi5FeGNlcHRpb25SZXNvdXJjZS5NeVJlc3BvbnNlRmlsdGVyOworaW1wb3J0IHN0YXRpYyBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5leGNlcHRpb24uRXhjZXB0aW9ucy5NeUV4Y2VwdGlvbk1hcHBlcjsKK2ltcG9ydCBzdGF0aWMgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZXhjZXB0aW9uLkV4Y2VwdGlvbnMuTXlTdWJFeGNlcHRpb25NYXBwZXI7CitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmV4Y2VwdGlvbi5FeGNlcHRpb25zLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uTWFwcGVyOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIEV4Y2VwdGlvbk1hcHBpbmdGaWx0ZXJUZXN0IGNsYXNzLgorICoKKyAqIEBhdXRob3IgU2FudGlhZ28uUGVyaWNhc0dlZXJ0c2VuIGF0IG9yYWNsZS5jb20KKyAqLworcHVibGljIGNsYXNzIEV4Y2VwdGlvbk1hcHBpbmdGaWx0ZXJUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICAvLyBtdm4gdGVzdCAtRGplcnNleS50ZXN0LmNvbnRhaW5lckZhY3Rvcnk9b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5pbm1lbW9yeS5Jbk1lbW9yeVRlc3RDb250YWluZXJGYWN0b3J5CisgICAgICAgIC8vIG12biB0ZXN0IC1EamVyc2V5LnRlc3QuY29udGFpbmVyRmFjdG9yeT1vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmdyaXp6bHkuR3JpenpseVRlc3RDb250YWluZXJGYWN0b3J5CisKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoCisgICAgICAgICAgICAgICAgRXhjZXB0aW9uUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgTXlSZXNwb25zZUZpbHRlci5jbGFzcywKKyAgICAgICAgICAgICAgICBFeGNlcHRpb25SZXNvdXJjZS5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbkZpbHRlci5jbGFzcywKKyAgICAgICAgICAgICAgICBNeUV4Y2VwdGlvbk1hcHBlci5jbGFzcywKKyAgICAgICAgICAgICAgICBNeVN1YkV4Y2VwdGlvbk1hcHBlci5jbGFzcywKKyAgICAgICAgICAgICAgICBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbk1hcHBlci5jbGFzcyk7CisKKyAgICAgICAgcmV0dXJuIHJlc291cmNlQ29uZmlnOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluc3RydWN0cyByZXF1ZXN0IGZpbHRlciB0byB0aHJvdyBhIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHdoaWNoIG11c3QgYmUgbWFwcGVkCisgICAgICogdG8gYSByZXNwb25zZSBhbmQgcHJvY2Vzc2VkIHRocm91Z2ggcmVzcG9uc2UgcGlwZWxpbmUuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViQXBwbGljYXRpb25FeGNlcHRpb25JblJlcXVlc3RGaWx0ZXIoKSB7CisgICAgICAgIFdlYlRhcmdldCB0ID0gY2xpZW50KCkudGFyZ2V0KFVyaUJ1aWxkZXIuZnJvbVVyaShnZXRCYXNlVXJpKCkpLnBhdGgoQXBwLlJPT1RfUEFUSCkucGF0aCgicmVxdWVzdF9leGNlcHRpb24iKS5idWlsZCgpKTsKKyAgICAgICAgUmVzcG9uc2UgciA9IHQucmVxdWVzdCgidGV4dC9wbGFpbiIpLnBvc3QoRW50aXR5LnRleHQoIlJlcXVlc3QgRXhjZXB0aW9uIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByLmdldFN0YXR1cygpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGVudGl0eSA9IHIucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImVudGl0eSA9ICIgKyBlbnRpdHkpOworICAgICAgICBhc3NlcnRUcnVlKGVudGl0eS5jb250YWlucyhNeVJlc3BvbnNlRmlsdGVyLmNsYXNzLmdldFNpbXBsZU5hbWUoKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uSW5SZXNwb25zZUZpbHRlcigpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHQgPSBjbGllbnQoKS50YXJnZXQoVXJpQnVpbGRlci5mcm9tVXJpKGdldEJhc2VVcmkoKSkucGF0aChBcHAuUk9PVF9QQVRIKS5wYXRoKCJyZXNwb25zZV9leGNlcHRpb24iKS5idWlsZCgpKTsKKyAgICAgICAgUmVzcG9uc2UgciA9IHQucmVxdWVzdCgidGV4dC9wbGFpbiIpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByLmdldFN0YXR1cygpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGVudGl0eSA9IHIucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImVudGl0eSA9ICIgKyBlbnRpdHkpOworICAgICAgICBhc3NlcnRUcnVlKGVudGl0eS5jb250YWlucyhNeVJlc3BvbnNlRmlsdGVyLmNsYXNzLmdldFNpbXBsZU5hbWUoKSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2V4Y2VwdGlvbi1tYXBwaW5nL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZXhjZXB0aW9uL0V4Y2VwdGlvbk1hcHBpbmdUZXN0LmphdmEgYi9leGFtcGxlcy9leGNlcHRpb24tbWFwcGluZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2V4Y2VwdGlvbi9FeGNlcHRpb25NYXBwaW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNjYzMTIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9leGNlcHRpb24tbWFwcGluZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2V4Y2VwdGlvbi9FeGNlcHRpb25NYXBwaW5nVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZXhjZXB0aW9uLkV4Y2VwdGlvblJlc291cmNlLk15UmVzcG9uc2VGaWx0ZXI7CitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmV4Y2VwdGlvbi5FeGNlcHRpb25zLk15RXhjZXB0aW9uTWFwcGVyOworaW1wb3J0IHN0YXRpYyBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5leGNlcHRpb24uRXhjZXB0aW9ucy5NeVN1YkV4Y2VwdGlvbk1hcHBlcjsKK2ltcG9ydCBzdGF0aWMgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZXhjZXB0aW9uLkV4Y2VwdGlvbnMuTXlTdWJTdWJFeGNlcHRpb247CitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmV4Y2VwdGlvbi5FeGNlcHRpb25zLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uTWFwcGVyOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIEV4Y2VwdGlvbk1hcHBpbmdUZXN0IGNsYXNzLgorICoKKyAqIEBhdXRob3IgU2FudGlhZ28uUGVyaWNhc0dlZXJ0c2VuIGF0IG9yYWNsZS5jb20KKyAqLworcHVibGljIGNsYXNzIEV4Y2VwdGlvbk1hcHBpbmdUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICAvLyBtdm4gdGVzdCAtRGplcnNleS50ZXN0LmNvbnRhaW5lckZhY3Rvcnk9b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5pbm1lbW9yeS5Jbk1lbW9yeVRlc3RDb250YWluZXJGYWN0b3J5CisgICAgICAgIC8vIG12biB0ZXN0IC1EamVyc2V5LnRlc3QuY29udGFpbmVyRmFjdG9yeT1vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmdyaXp6bHkuR3JpenpseVRlc3RDb250YWluZXJGYWN0b3J5CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoCisgICAgICAgICAgICAgICAgRXhjZXB0aW9uUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgTXlSZXNwb25zZUZpbHRlci5jbGFzcywKKyAgICAgICAgICAgICAgICBNeUV4Y2VwdGlvbk1hcHBlci5jbGFzcywKKyAgICAgICAgICAgICAgICBNeVN1YkV4Y2VwdGlvbk1hcHBlci5jbGFzcywKKyAgICAgICAgICAgICAgICBNeVN1YlN1YkV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbk1hcHBlci5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRW5zdXJlIHdlIGNhbiBhY2Nlc3MgcmVzb3VyY2Ugd2l0aCByZXNwb25zZSBmaWx0ZXIgaW5zdGFsbGVkLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBpbmdBbmRGaWx0ZXIoKSB7CisgICAgICAgIFdlYlRhcmdldCB0ID0gY2xpZW50KCkudGFyZ2V0KFVyaUJ1aWxkZXIuZnJvbVVyaShnZXRCYXNlVXJpKCkpLnBhdGgoQXBwLlJPT1RfUEFUSCkuYnVpbGQoKSk7CisgICAgICAgIFJlc3BvbnNlIHIgPSB0LnJlcXVlc3QoInRleHQvcGxhaW4iKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgci5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydFRydWUoci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykuY29udGFpbnMoTXlSZXNwb25zZUZpbHRlci5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBObyBtYXBwZXIgc2hvdWxkIGJlIHVzZWQgaWYgV2ViQXBwbGljYXRpb25FeGNlcHRpb24gYWxyZWFkeSBjb250YWlucyBhCisgICAgICogUmVzcG9uc2Ugd2l0aCBhIG5vbi1lbXB0eSBlbnRpdHkuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViQXBwbGljYXRpb25FeGNlcHRpb25XaXRoRW50aXR5KCkgeworICAgICAgICBXZWJUYXJnZXQgdCA9IGNsaWVudCgpLnRhcmdldChVcmlCdWlsZGVyLmZyb21VcmkoZ2V0QmFzZVVyaSgpKS5wYXRoKEFwcC5ST09UX1BBVEgpLnBhdGgoIndlYmFwcGxpY2F0aW9uX2VudGl0eSIpLmJ1aWxkKCkpOworICAgICAgICBSZXNwb25zZSByID0gdC5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikucG9zdChFbnRpdHkudGV4dCgiQ29kZToyMDAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHIuZ2V0U3RhdHVzKCkpOworICAgICAgICBmaW5hbCBTdHJpbmcgZW50aXR5ID0gci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRydWUoZW50aXR5LmNvbnRhaW5zKCJDb2RlOjIwMCIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShlbnRpdHkuY29udGFpbnMoTXlSZXNwb25zZUZpbHRlci5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBObyBtYXBwZXIgc2hvdWxkIGJlIHVzZWQgaWYgV2ViQXBwbGljYXRpb25FeGNlcHRpb24gYWxyZWFkeSBjb250YWlucyBhCisgICAgICogUmVzcG9uc2Ugd2l0aCBhIG5vbi1lbXB0eSBlbnRpdHkuIFNhbWUgYXMgbGFzdCB0ZXN0IGJ1dCB1c2luZyA0MDAgY29kZS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbldpdGhFbnRpdHk0MDAoKSB7CisgICAgICAgIFdlYlRhcmdldCB0ID0gY2xpZW50KCkudGFyZ2V0KFVyaUJ1aWxkZXIuZnJvbVVyaShnZXRCYXNlVXJpKCkpLnBhdGgoQXBwLlJPT1RfUEFUSCkucGF0aCgid2ViYXBwbGljYXRpb25fZW50aXR5IikuYnVpbGQoKSk7CisgICAgICAgIFJlc3BvbnNlIHIgPSB0LnJlcXVlc3QoInRleHQvcGxhaW4iKS5wb3N0KEVudGl0eS50ZXh0KCJDb2RlOjQwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMCwgci5nZXRTdGF0dXMoKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBlbnRpdHkgPSByLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShlbnRpdHkuY29udGFpbnMoIkNvZGU6NDAwIikpOworICAgICAgICBhc3NlcnRUcnVlKGVudGl0eS5jb250YWlucyhNeVJlc3BvbnNlRmlsdGVyLmNsYXNzLmdldFNpbXBsZU5hbWUoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uTWFwcGVyIHNob3VsZCBiZSB1c2VkIGlmIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIGNvbnRhaW5zCisgICAgICogZW1wdHkgZW50aXR5LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uVXNpbmdNYXBwZXIoKSB7CisgICAgICAgIFdlYlRhcmdldCB0ID0gY2xpZW50KCkKKyAgICAgICAgICAgICAgICAudGFyZ2V0KFVyaUJ1aWxkZXIuZnJvbVVyaShnZXRCYXNlVXJpKCkpLnBhdGgoQXBwLlJPT1RfUEFUSCkucGF0aCgid2ViYXBwbGljYXRpb25fbm9lbnRpdHkiKS5idWlsZCgpKTsKKyAgICAgICAgUmVzcG9uc2UgciA9IHQucmVxdWVzdCgidGV4dC9wbGFpbiIpLnBvc3QoRW50aXR5LnRleHQoIkNvZGU6MjAwIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByLmdldFN0YXR1cygpKTsKKyAgICAgICAgU3RyaW5nIGVudGl0eSA9IHIucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUcnVlKGVudGl0eS5jb250YWlucygiQ29kZToyMDAiKSk7CisgICAgICAgIGFzc2VydFRydWUoZW50aXR5LmNvbnRhaW5zKFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uTWFwcGVyLmNsYXNzLmdldFNpbXBsZU5hbWUoKSkpOworICAgICAgICBhc3NlcnRUcnVlKGVudGl0eS5jb250YWlucyhNeVJlc3BvbnNlRmlsdGVyLmNsYXNzLmdldFNpbXBsZU5hbWUoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE15RXhjZXB0aW9uTWFwcGVyIHNob3VsZCBiZSB1c2VkIGlmIE15RXhjZXB0aW9uIGlzIHRocm93bi4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNeUV4Y2VwdGlvbigpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHQgPSBjbGllbnQoKS50YXJnZXQoVXJpQnVpbGRlci5mcm9tVXJpKGdldEJhc2VVcmkoKSkucGF0aChBcHAuUk9PVF9QQVRIKS5wYXRoKCJteSIpLmJ1aWxkKCkpOworICAgICAgICBSZXNwb25zZSByID0gdC5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikucG9zdChFbnRpdHkudGV4dCgiQ29kZToyMDAiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHIuZ2V0U3RhdHVzKCkpOworICAgICAgICBTdHJpbmcgZW50aXR5ID0gci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRydWUoZW50aXR5LmNvbnRhaW5zKCJDb2RlOjIwMCIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShlbnRpdHkuY29udGFpbnMoTXlFeGNlcHRpb25NYXBwZXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKSk7CisgICAgICAgIGFzc2VydFRydWUoZW50aXR5LmNvbnRhaW5zKE15UmVzcG9uc2VGaWx0ZXIuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTXlTdWJFeGNlcHRpb25NYXBwZXIgc2hvdWxkIGJlIHVzZWQgaWYgTXlTdWJFeGNlcHRpb24gaXMgdGhyb3duLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE15U3ViRXhjZXB0aW9uKCkgeworICAgICAgICBXZWJUYXJnZXQgdCA9IGNsaWVudCgpLnRhcmdldChVcmlCdWlsZGVyLmZyb21VcmkoZ2V0QmFzZVVyaSgpKS5wYXRoKEFwcC5ST09UX1BBVEgpLnBhdGgoIm15c3ViIikuYnVpbGQoKSk7CisgICAgICAgIFJlc3BvbnNlIHIgPSB0LnJlcXVlc3QoInRleHQvcGxhaW4iKS5wb3N0KEVudGl0eS50ZXh0KCJDb2RlOjIwMCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgci5nZXRTdGF0dXMoKSk7CisgICAgICAgIFN0cmluZyBlbnRpdHkgPSByLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShlbnRpdHkuY29udGFpbnMoIkNvZGU6MjAwIikpOworICAgICAgICBhc3NlcnRUcnVlKGVudGl0eS5jb250YWlucyhNeVN1YkV4Y2VwdGlvbk1hcHBlci5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShlbnRpdHkuY29udGFpbnMoTXlSZXNwb25zZUZpbHRlci5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNeVN1YkV4Y2VwdGlvbk1hcHBlciBzaG91bGQgYmUgdXNlZCBpZiBNeVN1YlN1YkV4Y2VwdGlvbiBpcyB0aHJvd24sIGdpdmVuIHRoYXQKKyAgICAgKiB0aGVyZSBpcyBubyBtYXBwZXIgZm9yIE15U3ViU3ViRXhjZXB0aW9uIGFuZCBNeVN1YkV4Y2VwdGlvbiBpcyB0aGUgbmVhcmVzdAorICAgICAqIHN1cGVyIHR5cGUuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXlTdWJTdWJFeGNlcHRpb24oKSB7CisgICAgICAgIFdlYlRhcmdldCB0ID0gY2xpZW50KCkudGFyZ2V0KFVyaUJ1aWxkZXIuZnJvbVVyaShnZXRCYXNlVXJpKCkpLnBhdGgoQXBwLlJPT1RfUEFUSCkucGF0aCgibXlzdWIiKS5idWlsZCgpKTsKKyAgICAgICAgUmVzcG9uc2UgciA9IHQucmVxdWVzdCgidGV4dC9wbGFpbiIpLnBvc3QoRW50aXR5LnRleHQoIkNvZGU6MjAwIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByLmdldFN0YXR1cygpKTsKKyAgICAgICAgU3RyaW5nIGVudGl0eSA9IHIucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUcnVlKGVudGl0eS5jb250YWlucygiQ29kZToyMDAiKSk7CisgICAgICAgIGFzc2VydFRydWUoZW50aXR5LmNvbnRhaW5zKE15U3ViRXhjZXB0aW9uTWFwcGVyLmNsYXNzLmdldFNpbXBsZU5hbWUoKSkpOworICAgICAgICBhc3NlcnRUcnVlKGVudGl0eS5jb250YWlucyhNeVJlc3BvbnNlRmlsdGVyLmNsYXNzLmdldFNpbXBsZU5hbWUoKSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2V4dGVuZGVkLXdhZGwtd2ViYXBwL1JFQURNRS5NRCBiL2V4YW1wbGVzL2V4dGVuZGVkLXdhZGwtd2ViYXBwL1JFQURNRS5NRApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2E1OWQxCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZXh0ZW5kZWQtd2FkbC13ZWJhcHAvUkVBRE1FLk1ECkBAIC0wLDAgKzEsNjMgQEAKK1svL106ICMgIiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIgorWy8vXTogIyAiICIKK1svL106ICMgIiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgIgorWy8vXTogIyAiIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0ICIKK1svL106ICMgIiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuICIKK1svL106ICMgIiAiCitbLy9dOiAjICIgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZSAiCisKK0V4dGVuZGVkIFdBREwgV2ViQXBwIEV4YW1wbGUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gZ2V0IGFuIGV4dGVuZGVkIFdBREwgZ2VuZXJhdGVkIGJ5CitqZXJzZXkuCisKK0NvbnRlbnRzCistLS0tLS0tLQorCitUaGUgZGVzY3JpcHRpb24gb2Ygd2hhdCdzIGRvbmUgaGVyZSB5b3UnbGwgZmluZCBpbiB0aGUgW2plcnNleSAxCit3aWtpXShodHRwczovL3dpa2lzLm9yYWNsZS5jb20vZGlzcGxheS9KZXJzZXkvSG93VG9Db25maWd1cmVFeHRlbmRlZFdBREwpLgorCitUaGUgZGlmZmVyZW5jZSBpbiBjb25maWd1cmF0aW9uIGFnYWluc3QgamVyc2V5IDEueCBpcyBpbiBwcm9wZXJ0eQorY29uZmlndXJpbmcgdGhlIGN1c3RvbSBXYWRsR2VuZXJhdG9yQ29uZmlnLiBJbnN0ZWFkIG9mIHByb3BlcnR5IGtleQorJ2NvbS5zdW4uamVyc2V5LmNvbmZpZy5wcm9wZXJ0eS5XYWRsR2VuZXJhdG9yQ29uZmlnJyB1c2UgdGhlIHByb3BlcnR5CitrZXkgJ2plcnNleS5jb25maWcuc2VydmVyLndhZGwuZ2VuZXJhdG9yQ29uZmlnJy4gQWxzbyBjaGVjayBwb20ueG1sIG9mCit0aGlzIHNhbXBsZSB0byBzZWUgb3RoZXIgY29uZmlndXJhdGlvbiBkaWZmZXJlbmNlcy4KKworSnVzdCBhcyBhIHBvaW50ZXIgYXQgd2hpY2ggZmlsZXMgeW91IG1pZ2h0IGhhdmUgYSBsb29rOgorCistICAgcG9tLnhtbAorLSAgIHNyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKKy0gICBzcmMvbWFpbi9yZXNvdXJjZXMvXCoKKy0gICBzcmMvbWFpbi94c2Qvc2NoZW1hLnhzZAorLSAgIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmV4dGVuZGVkd2FkbC5TYW1wbGVXYWRsR2VuZXJhdG9yQ29uZmlnCisKK1RoZSBtYXBwaW5nIG9mIHRoZSBVUkkgcGF0aCBzcGFjZSBpcyBwcmVzZW50ZWQgaW4gdGhlIGZvbGxvd2luZyB0YWJsZToKKworVVJJIHBhdGggICAgICAgICAgICAgICAgICAgICAgICB8IFJlc291cmNlIGNsYXNzICAgfCBIVFRQIG1ldGhvZHMgICB8IERlc2NyaXB0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKl8vaXRlbXNfKiogICAgICAgICAgICAgICAgICAgIHwgSXRlbXNSZXNvdXJjZSAgICB8IFBPU1QgICAgICAgICAgIHwgQ3JlYXRlcyBhIG5ldyBpdGVtIGFuZCBhbGxvY2F0ZXMgYSBuZXcgdW5pcXVlIFVSSSBmb3IgaXQsIHRoZSBuZXcgVVJJIGlzIHJldHVybmVkIGJhY2sgaW4gdGhlIExvY2F0aW9uIGhlYWRlcgorKipfL2l0ZW1zL3tpZH1fKiogICAgICAgICAgICAgICB8IEl0ZW1SZXNvdXJjZSAgICAgfCBHRVQgICAgICAgICAgICB8IFJldHVybnMgYW4gaXRlbSB3aXRoIHRoZSBpZD17aWR9CisqKl8vaXRlbXMve2lkfS92YWx1ZS97dmFsfV8qKiAgIHwgSXRlbVJlc291cmNlICAgICB8IFBVVCAgICAgICAgICAgIHwgVXBkYXRlcyB0aGUgdmFsdWUgb2YgdGhlIGl0ZW0gd2l0aCB0aGUgaWQ9e2lkfSB3aXRoIHRoZSBuZXcgdmFsdWUge3ZhbH0KKworUnVubmluZyB0aGUgRXhhbXBsZQorLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJZiB5b3UgYXJlIHdvcmtpbmcgd2l0aCBKZXJzZXkgR2xhc3NGaXNoIHVwZGF0ZSBjZW50ZXIgbW9kdWxlIGluc3RhbGxlZAoraW50byB5b3VyIGV4aXN0aW5nIEdsYXNzRmlzaCBpbnN0YW5jZSwgeW91IHdpbGwgbmVlZCB0byBmb2xsb3cKK2luc3RydWN0aW9ucyBhdCBbdGhlIG1vZHVsZSBSRUFETUUgZmlsZV0oLi4vLi4vUkVBRE1FLmh0bWwpIGluIG9yZGVyIHRvCitkZXBsb3kgdGhlIGV4YW1wbGUuCisKK090aGVyd2lzZSwgeW91IGNhbiBydW4gdGhlIGV4YW1wbGUgdXNpbmcgZW1iZWRkZWQgR2xhc3NGaXNoIGFzIGZvbGxvd3M6CisKK1lvdSBjYW4gcnVuIHRoZSBleGFtcGxlIHVzaW5nIEdyaXp6bHkgYXMgZm9sbG93czoKKworPiAgICAgbXZuIGNsZWFuIHBhY2thZ2UgZXhlYzpqYXZhCisKK0dldCB0aGUgZ2VuZXJhdGVkIHdhZGwgdmlhIGN1cmw6CisKKz4gICAgIGN1cmwgaHR0cDovL2xvY2FsaG9zdDo4MDgwL2V4dGVuZGVkLXdhZGwtd2ViYXBwL2FwcGxpY2F0aW9uLndhZGwKKworT3IgZnJvbSBhIHdlYiBicm93c2VyLCB2aXNpdDoKKworPiAgICAgaHR0cDovL2xvY2FsaG9zdDo4MDgwL2V4dGVuZGVkLXdhZGwtd2ViYXBwL2FwcGxpY2F0aW9uLndhZGwKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2V4dGVuZGVkLXdhZGwtd2ViYXBwL3BvbS54bWwgYi9leGFtcGxlcy9leHRlbmRlZC13YWRsLXdlYmFwcC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMTRmMmUKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9leHRlbmRlZC13YWRsLXdlYmFwcC9wb20ueG1sCkBAIC0wLDAgKzEsMjgyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorCisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPndlYmFwcC1leGFtcGxlLXBhcmVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi93ZWJhcHAtZXhhbXBsZS1wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+ZXh0ZW5kZWQtd2FkbC13ZWJhcHA8L2FydGlmYWN0SWQ+CisgICAgPG5hbWU+amVyc2V5LWV4YW1wbGVzLWV4dGVuZGVkLXdhZGwtd2ViYXBwPC9uYW1lPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisKKyAgICA8ZGVzY3JpcHRpb24+RXh0ZW5kZWQgV0FETCBleGFtcGxlLjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktc2VydmVyPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPCEtLSBFeHRlbmRlZCBXYWRsIENvbmZpZzogRGVwZW5kZW5jeSB0byBqZXJzZXktd2FkbC1kb2NsZXQgaXMgbmVlZGVkIGhlcmUgdG8ga2VlcCB0aGUgY29ycmVjdCBidWlsZCBvcmRlci4gLS0+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktd2FkbC1kb2NsZXQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktaGsyPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgudmFsaWRhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnZhbGlkYXRpb24tYXBpPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1ncml6emx5Mi1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPCEtLSBQYXgtRXhhbSBhbmQgSlVuaXQgZGVwZW5kZW5jaWVzIC0tPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5vcHM0ai5wYXguZXhhbTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnBheC1leGFtPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm9wczRqLnBheC5leGFtPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGF4LWV4YW0tanVuaXQ0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1sb2dnaW5nPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxvZ2dpbmc8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcub3BzNGoucGF4LmV4YW08L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5wYXgtZXhhbS1jb250YWluZXItZm9ya2VkPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm9wczRqLnBheC5leGFtPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGF4LWV4YW0tanVuaXQtZXh0ZW5kZXItaW1wbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5vcHM0ai5wYXgudGlueWJ1bmRsZXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD50aW55YnVuZGxlczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjIuMC4wPC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm9wczRqLnBheC5leGFtPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGF4LWV4YW0tbGluay1tdm48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8IS0tIE9TR2kgcnVudGltZSAtIEZlbGl4IC0tPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZmVsaXg8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuYXBhY2hlLmZlbGl4LmZyYW1ld29yazwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisKKyAgICAgICAgPCEtLSBsb2dnaW5nIC0tPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnNsZjRqLWxvZzRqMTI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjYuNDwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLmpldHRpc29uPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dGlzb248L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guaGsyLmV4dGVybmFsPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+YW9wYWxsaWFuY2UtcmVwYWNrYWdlZDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5qYXZhc3Npc3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZhc3Npc3Q8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8IS0tIEV4dGVuZGVkIFdhZGwgQ29uZmlnOiB0aGlzIHBsdWdpbiBnZW5lcmF0ZXMgdGhlIGpheGIgYmVhbnMgZnJvbSB4c2Qgc2NoZW1hcyAtLT4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmp2bmV0LmpheGIyLm1hdmVuMjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXhiMi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+MC44LjA8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+Z2VuZXJhdGUtc291cmNlczwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Z2VuZXJhdGU8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxnZW5lcmF0ZVBhY2thZ2U+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZXh0ZW5kZWR3YWRsPC9nZW5lcmF0ZVBhY2thZ2U+CisgICAgICAgICAgICAgICAgICAgIDxzY2hlbWFEaXJlY3Rvcnk+c3JjL21haW4veHNkPC9zY2hlbWFEaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICAgIDwhLS08aW5jbHVkZVNjaGVtYXM+LS0+CisgICAgICAgICAgICAgICAgICAgIDwhLS08aW5jbHVkZVNjaGVtYT4qKi8qLnhzZDwvaW5jbHVkZVNjaGVtYT4tLT4KKyAgICAgICAgICAgICAgICAgICAgPCEtLTwvaW5jbHVkZVNjaGVtYXM+LS0+CisgICAgICAgICAgICAgICAgICAgIDxleHRlbnNpb24+dHJ1ZTwvZXh0ZW5zaW9uPgorICAgICAgICAgICAgICAgICAgICA8c3RyaWN0PmZhbHNlPC9zdHJpY3Q+CisgICAgICAgICAgICAgICAgICAgIDx2ZXJib3NlPnRydWU8L3ZlcmJvc2U+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisKKyAgICAgICAgICAgIDwhLS0gRXh0ZW5kZWQgV2FkbCBDb25maWc6IGphdmFkb2MgcGx1Z2luIGdlbmVyYXRlcyByZXNvdXJjZWRvYy54bWwgZHVyaW5nIHRoZSBjb21waWxhdGlvbiB1c2luZyBkb2NsZXQuCisgICAgICAgICAgICBHZW5lcmF0ZWQgZmlsZSBpcyB0aGVuIHVzZWQgZHVyaW5nIHJ1bnRpbWUgdG8gYXR0YWNoIGphdmFkb2MgaW5mb3JtYXRpb24gdG8gd2FkbC4gLS0+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXZhZG9jLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5qYXZhZG9jPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wcm9jZXNzLWNsYXNzZXM8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxlbmNvZGluZz5VVEYtODwvZW5jb2Rpbmc+CisgICAgICAgICAgICAgICAgICAgIDx2ZXJib3NlPmZhbHNlPC92ZXJib3NlPgorICAgICAgICAgICAgICAgICAgICA8c2hvdz5wdWJsaWM8L3Nob3c+CisgICAgICAgICAgICAgICAgICAgIDxzdWJwYWNrYWdlcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5leHRlbmRlZHdhZGw8L3N1YnBhY2thZ2VzPgorICAgICAgICAgICAgICAgICAgICA8ZG9jbGV0Pm9yZy5nbGFzc2Zpc2guamVyc2V5LndhZGwuZG9jbGV0LlJlc291cmNlRG9jbGV0PC9kb2NsZXQ+CisgICAgICAgICAgICAgICAgICAgIDxkb2NsZXRQYXRoPiR7cGF0aC5zZXBhcmF0b3J9JHtwcm9qZWN0LmJ1aWxkLm91dHB1dERpcmVjdG9yeX08L2RvY2xldFBhdGg+CisgICAgICAgICAgICAgICAgICAgIDxkb2NsZXRBcnRpZmFjdHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGplcnNleSBkb2NsZXQgZ2VuZXJhdG9yIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPGRvY2xldEFydGlmYWN0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktd2FkbC1kb2NsZXQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9kb2NsZXRBcnRpZmFjdD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbHNvIHNwZWNpZnkgamVyc2V5IGFuZCB4ZXJjZXMgYXMgZG9jbGV0IGFydGlmYWN0cyBhcyB0aGUgUmVzb3VyY2VEb2NsZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VzIGNsYXNzZXMgcHJvdmlkZWQgYnkgdGhlbSB0byBnZW5lcmF0ZSB0aGUgcmVzb3VyY2Vkb2MuCisgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZG9jbGV0QXJ0aWZhY3Q+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktc2VydmVyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZG9jbGV0QXJ0aWZhY3Q+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZG9jbGV0QXJ0aWZhY3Q+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+eGVyY2VzPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnhlcmNlc0ltcGw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHt4ZXJjZXMudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2RvY2xldEFydGlmYWN0PgorICAgICAgICAgICAgICAgICAgICA8L2RvY2xldEFydGlmYWN0cz4KKyAgICAgICAgICAgICAgICAgICAgPCEtLSB0aGUgZm9sbG93aW5nIG9wdGlvbiBpcyByZXF1aXJlZCBhcyBhIHdvcmsgYXJvdW5kIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnNpb24gMi41IG9mIHRoZSBqYXZhZG9jIHBsdWdpbiB3aGljaCB3aWxsIGJlIHVzZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICBieSBhIG1hdmVuIHZlcnNpb24gPiAyLjAuOSAtLT4KKyAgICAgICAgICAgICAgICAgICAgPHVzZVN0YW5kYXJkRG9jbGV0T3B0aW9ucz5mYWxzZTwvdXNlU3RhbmRhcmREb2NsZXRPcHRpb25zPgorICAgICAgICAgICAgICAgICAgICA8YWRkaXRpb25hbHBhcmFtPi1vdXRwdXQgJHtwcm9qZWN0LmJ1aWxkLm91dHB1dERpcmVjdG9yeX0vcmVzb3VyY2Vkb2MueG1sPC9hZGRpdGlvbmFscGFyYW0+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxmb3JrTW9kZT5hbHdheXM8L2ZvcmtNb2RlPgorICAgICAgICAgICAgICAgICAgICA8ZW5hYmxlQXNzZXJ0aW9ucz5mYWxzZTwvZW5hYmxlQXNzZXJ0aW9ucz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm9wczRqLnBheC5leGFtPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBheGV4YW0tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisKKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhlYy1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxtYWluQ2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZXh0ZW5kZWR3YWRsLkFwcDwvbWFpbkNsYXNzPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+cmVsZWFzZTwvaWQ+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnhtbC1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+dHJhbnNmb3JtLWdmLXBvbTwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+dHJhbnNmb3JtPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cmFuc2Zvcm1hdGlvblNldHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyYW5zZm9ybWF0aW9uU2V0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGlyPiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2dmLXBvbS1maWxlPC9kaXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPnBvbS54bWw8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHlsZXNoZWV0PnNyYy9tYWluL3hzbHQvZ2YueHNsPC9zdHlsZXNoZWV0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyPiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2dmLXBvbS1maWxlPC9vdXRwdXREaXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cmFuc2Zvcm1hdGlvblNldD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHJhbnNmb3JtYXRpb25TZXRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnNvbmFyPC9pZD4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZGlzYWJsZSBKYUNvQ28gbGlzdGVuZXIgYmVjYXVzZSBpdCdzIG5vdCB3b3JraW5nIHdpdGggPGZvcmtNb2RlPmFsd2F5czwvZm9yaz4gKDxyZXVzZUZvcmtzPmZhbHNlPC9yZXVzZUZvcmtzPiByZXNwZWN0aXZlbHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBzOi8vamlyYS5zb25hcnNvdXJjZS5jb20vYnJvd3NlL1NPTkFSSkFWQS03MjggKGh0dHBzOi8vZ2l0aHViLmNvbS9Tb25hclNvdXJjZS9zb25hci1qYXZhL3B1bGwvMzI0KSAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnRpZXMgY29tYmluZS5zZWxmPSJvdmVycmlkZSIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICA8L3Byb2ZpbGVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZXh0ZW5kZWQtd2FkbC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9leHRlbmRlZHdhZGwvQXBwLmphdmEgYi9leGFtcGxlcy9leHRlbmRlZC13YWRsLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2V4dGVuZGVkd2FkbC9BcHAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTUyZDNhCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZXh0ZW5kZWQtd2FkbC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9leHRlbmRlZHdhZGwvQXBwLmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5leHRlbmRlZHdhZGw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmV4dGVuZGVkd2FkbC5yZXNvdXJjZXMuTXlBcHBsaWNhdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5Mi5zZXJ2bGV0LkdyaXp6bHlXZWJDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRQcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5ncml6emx5Lmh0dHAuc2VydmVyLkh0dHBTZXJ2ZXI7CisKKworLyoqCisgKiBSdW5uZXIgZm9yIHRoZSBKZXJzZXkgZXh0ZW5kZWQtd2FkbC13ZWJhcHAgc2FtcGxlLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIEFwcCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgQkFTRV9VUkkgPSBVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvZXh0ZW5kZWQtd2FkbC13ZWJhcHAiKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST09UX1BBVEggPSAiL2FwcGxpY2F0aW9uLndhZGwiOworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeHRlbmRlZCBXQURMIHdlYiBhcHBsaWNhdGlvbiBleGFtcGxlIik7CisKKyAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gaW5pdFBhcmFtcyA9IG5ldyBIYXNoTWFwPD4oKTsKKworICAgICAgICAgICAgaW5pdFBhcmFtcy5wdXQoCisgICAgICAgICAgICAgICAgICAgIFNlcnZsZXRQcm9wZXJ0aWVzLkpBWFJTX0FQUExJQ0FUSU9OX0NMQVNTLAorICAgICAgICAgICAgICAgICAgICBNeUFwcGxpY2F0aW9uLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICAgICAgICAgIGluaXRQYXJhbXMucHV0KFNlcnZlclByb3BlcnRpZXMuV0FETF9HRU5FUkFUT1JfQ09ORklHLCAib3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZXh0ZW5kZWR3YWRsIgorICAgICAgICAgICAgICAgICAgICArICIuU2FtcGxlV2FkbEdlbmVyYXRvckNvbmZpZyIpOworCisgICAgICAgICAgICBmaW5hbCBIdHRwU2VydmVyIHNlcnZlciA9IEdyaXp6bHlXZWJDb250YWluZXJGYWN0b3J5LmNyZWF0ZShCQVNFX1VSSSwgU2VydmxldENvbnRhaW5lci5jbGFzcywgaW5pdFBhcmFtcyk7CisgICAgICAgICAgICBSdW50aW1lLmdldFJ1bnRpbWUoKS5hZGRTaHV0ZG93bkhvb2sobmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIuc2h1dGRvd25Ob3coKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KSk7CisKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihTdHJpbmcuZm9ybWF0KCJBcHBsaWNhdGlvbiBzdGFydGVkLiVuVHJ5IG91dCAlcyVzJW5TdG9wIHRoZSBhcHBsaWNhdGlvbiB1c2luZyBDVFJMK0MiLAorICAgICAgICAgICAgICAgICAgICBCQVNFX1VSSSwgUk9PVF9QQVRIKSk7CisKKyAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuam9pbigpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiB8IEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKEFwcC5jbGFzcy5nZXROYW1lKCkpLmxvZyhMZXZlbC5TRVZFUkUsIG51bGwsIGV4KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2V4dGVuZGVkLXdhZGwtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZXh0ZW5kZWR3YWRsL1NhbXBsZVdhZGxHZW5lcmF0b3JDb25maWcuamF2YSBiL2V4YW1wbGVzL2V4dGVuZGVkLXdhZGwtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZXh0ZW5kZWR3YWRsL1NhbXBsZVdhZGxHZW5lcmF0b3JDb25maWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDcwYmRlCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZXh0ZW5kZWQtd2FkbC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9leHRlbmRlZHdhZGwvU2FtcGxlV2FkbEdlbmVyYXRvckNvbmZpZy5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZXh0ZW5kZWR3YWRsOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5jb25maWcuV2FkbEdlbmVyYXRvckNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5jb25maWcuV2FkbEdlbmVyYXRvckRlc2NyaXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLmludGVybmFsLmdlbmVyYXRvcnMuV2FkbEdlbmVyYXRvckFwcGxpY2F0aW9uRG9jOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLmludGVybmFsLmdlbmVyYXRvcnMuV2FkbEdlbmVyYXRvckdyYW1tYXJzU3VwcG9ydDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5pbnRlcm5hbC5nZW5lcmF0b3JzLnJlc291cmNlZG9jLldhZGxHZW5lcmF0b3JSZXNvdXJjZURvY1N1cHBvcnQ7CisKKy8qKgorICogVGhpcyBzdWJjbGFzcyBvZiB7QGxpbmsgV2FkbEdlbmVyYXRvckNvbmZpZ30gZGVmaW5lcy9jb25maWd1cmVzIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5XYWRsR2VuZXJhdG9yfXMKKyAqIHRvIGJlIHVzZWQgZm9yIGdlbmVyYXRpbmcgV0FETC4KKyAqCisgKiBAYXV0aG9yIE1hcnRpbiBHcm90emtlIChtYXJ0aW4uZ3JvdHprZUBmcmVpaGVpdC5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBTYW1wbGVXYWRsR2VuZXJhdG9yQ29uZmlnIGV4dGVuZHMgV2FkbEdlbmVyYXRvckNvbmZpZyB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxXYWRsR2VuZXJhdG9yRGVzY3JpcHRpb24+IGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIGdlbmVyYXRvcihXYWRsR2VuZXJhdG9yQXBwbGljYXRpb25Eb2MuY2xhc3MpCisgICAgICAgICAgICAgICAgLnByb3AoImFwcGxpY2F0aW9uRG9jc1N0cmVhbSIsICJhcHBsaWNhdGlvbi1kb2MueG1sIikKKyAgICAgICAgICAgICAgICAuZ2VuZXJhdG9yKFdhZGxHZW5lcmF0b3JHcmFtbWFyc1N1cHBvcnQuY2xhc3MpCisgICAgICAgICAgICAgICAgLnByb3AoImdyYW1tYXJzU3RyZWFtIiwgImFwcGxpY2F0aW9uLWdyYW1tYXJzLnhtbCIpCisgICAgICAgICAgICAgICAgLnByb3AoIm92ZXJyaWRlR3JhbW1hcnMiLCB0cnVlKQorICAgICAgICAgICAgICAgIC5nZW5lcmF0b3IoV2FkbEdlbmVyYXRvclJlc291cmNlRG9jU3VwcG9ydC5jbGFzcykKKyAgICAgICAgICAgICAgICAucHJvcCgicmVzb3VyY2VEb2NTdHJlYW0iLCAicmVzb3VyY2Vkb2MueG1sIikKKyAgICAgICAgICAgICAgICAuZGVzY3JpcHRpb25zKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9leHRlbmRlZC13YWRsLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2V4dGVuZGVkd2FkbC9yZXNvdXJjZXMvSXRlbVJlc291cmNlLmphdmEgYi9leGFtcGxlcy9leHRlbmRlZC13YWRsLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2V4dGVuZGVkd2FkbC9yZXNvdXJjZXMvSXRlbVJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdhZTJlZQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2V4dGVuZGVkLXdhZGwtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZXh0ZW5kZWR3YWRsL3Jlc291cmNlcy9JdGVtUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5leHRlbmRlZHdhZGwucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLkhlYWRlclBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlBVVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2UuU3RhdHVzOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZXh0ZW5kZWR3YWRsLkl0ZW07CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuamV0dGlzb24uanNvbi5KU09OQXJyYXk7CisKKy8qKgorICogVGhpcyByZXNvdXJjZSBpcyB1c2VkIHRvIG1hbmFnZSBhIHNpbmdsZSBpdGVtLgorICoKKyAqIEBhdXRob3IgTWFydGluIEdyb3R6a2UgKG1hcnRpbi5ncm90emtlQGZyZWloZWl0LmNvbSkKKyAqLworcHVibGljIGNsYXNzIEl0ZW1SZXNvdXJjZSB7CisKKyAgICBwcml2YXRlIGZpbmFsIEl0ZW0gX2l0ZW07CisKKyAgICBwdWJsaWMgSXRlbVJlc291cmNlKEl0ZW0gaXRlbSkgeworICAgICAgICBfaXRlbSA9IGl0ZW07CisgICAgfQorCisgICAgLyoqCisgICAgICogVHlwaWNhbGx5IHJldHVybnMgdGhlIGl0ZW0gaWYgaXQgZXhpc3RzLiBQbGVhc2UgYmUgYXdhcmUgdGhhdCB0aGlzIG1ldGhvZCBpcyBleHRyZW1lbHkKKyAgICAgKiBleHBlbnNpdmUsIHNvIHdlIGNhbid0IGd1YXJhbnRlZSB0aGF0IGdldHRpbmcgaXRlbXMgaXMgYWxsIHRoZSB0aW1lIHBvc3NpYmxlLgorICAgICAqCisgICAgICogQHJlc3BvbnNlLnJlcHJlc2VudGF0aW9uLjIwMC5xbmFtZSB7aHR0cDovL3d3dy5leGFtcGxlLmNvbX1pdGVtCisgICAgICogQHJlc3BvbnNlLnJlcHJlc2VudGF0aW9uLjIwMC5tZWRpYVR5cGUgYXBwbGljYXRpb24veG1sCisgICAgICogQHJlc3BvbnNlLnJlcHJlc2VudGF0aW9uLjIwMC5kb2MgVGhpcyBpcyB0aGUgcmVwcmVzZW50YXRpb24gcmV0dXJuZWQgYnkgZGVmYXVsdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpZiB3ZSBoYXZlIGFuIGV2ZW4gbnVtYmVyIG9mIG1pbGxpcyBzaW5jZSAxOTcwLi4uOikKKyAgICAgKiBAcmVzcG9uc2UucmVwcmVzZW50YXRpb24uMjAwLmV4YW1wbGUge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmV4dGVuZGVkd2FkbC51dGlsLkV4YW1wbGVzI1NBTVBMRV9JVEVNfQorICAgICAqCisgICAgICogQHJlc3BvbnNlLnJlcHJlc2VudGF0aW9uLjUwMy5tZWRpYVR5cGUgdGV4dC9wbGFpbgorICAgICAqIEByZXNwb25zZS5yZXByZXNlbnRhdGlvbi41MDMuZXhhbXBsZSBZb3UnbGwgZ2V0IHNvbWUgZXhwbGFuYXRpb24gd2h5IHRoaXMgc2VydmljZSBpcyBub3QgYXZhaWxhYmxlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSByZXF1ZXN0ZWQgaXRlbSBpZiB0aGlzIHNlcnZpY2UgaXMgYXZhaWxhYmxlLCBvdGhlcndpc2UgYSA1MDMuCisgICAgICovCisgICAgQEdFVAorICAgIEBQcm9kdWNlcyh7ImFwcGxpY2F0aW9uL3htbCIsICJ0ZXh0L3BsYWluIn0pCisgICAgcHVibGljIFJlc3BvbnNlIGdldEl0ZW0oKSB7CisgICAgICAgIGlmIChTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAlIDIgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyhTdGF0dXMuU0VSVklDRV9VTkFWQUlMQUJMRSkKKyAgICAgICAgICAgICAgICAgICAgLmVudGl0eSgiU29ycnksIGJ1dCByaWdodCBub3cgd2UgY2FuJ3QgcHJvY2VzcyB0aGlzIHJlcXVlc3QsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0cnkgYWdhaW4gYW4gb2RkIG51bWJlciBvZiBtaWxsaXNlY29uZHMgbGF0ZXIsIHBsZWFzZSA6KSIpCisgICAgICAgICAgICAgICAgICAgIC50eXBlKE1lZGlhVHlwZS5URVhUX1BMQUlOKS5idWlsZCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBSZXNwb25zZS5vayhfaXRlbSkuYnVpbGQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmllcyBoYXJkIHRvIHJldHVybiB0aGUgaXRlbSBpZiBpdCBleGlzdHMuIElmICJUcnktSGFyZCIgaGVhZGVyIGlzIHNldCB0byAidHJ1ZSIsIHRoZSBtZXRob2QgaXMgZ3VhcmFudGVlZCB0byBhbHdheXMKKyAgICAgKiBjb21wbGV0ZSBzdWNjZXNzZnVsbHkgaWYgdGhlIGl0ZW0gZXhpc3RzLgorICAgICAqCisgICAgICogQHJlcXVlc3QucGFyYW0ge0BuYW1lIFRyeS1IYXJkfQorICAgICAqICAgICAgICAgICAgICAgICAge0BzdHlsZSBoZWFkZXJ9CisgICAgICogICAgICAgICAgICAgICAgICB7QHR5cGUge2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfXN0cmluZ30KKyAgICAgKiAgICAgICAgICAgICAgICAgIHtAZG9jIElmIHNldCB0byAidHJ1ZSIsIHRoZSBjYWxsIHdpbGwgYWx3YXlzIHN1Y2NlZWQgcHJvdmlkZWQgdGhlIGl0ZW0gZXhpc3RzLn0KKyAgICAgKgorICAgICAqIEByZXNwb25zZS5yZXByZXNlbnRhdGlvbi4yMDAucW5hbWUge2h0dHA6Ly93d3cuZXhhbXBsZS5jb219aXRlbQorICAgICAqIEByZXNwb25zZS5yZXByZXNlbnRhdGlvbi4yMDAubWVkaWFUeXBlIGFwcGxpY2F0aW9uL3htbAorICAgICAqIEByZXNwb25zZS5yZXByZXNlbnRhdGlvbi4yMDAuZG9jIFRoaXMgaXMgdGhlIHJlcHJlc2VudGF0aW9uIHJldHVybmVkIGJ5IGRlZmF1bHQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaWYgd2UgaGF2ZSBhbiBldmVuIG51bWJlciBvZiBtaWxsaXMgc2luY2UgMTk3MC4uLjopCisgICAgICogQHJlc3BvbnNlLnJlcHJlc2VudGF0aW9uLjIwMC5leGFtcGxlIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5leHRlbmRlZHdhZGwudXRpbC5FeGFtcGxlcyNTQU1QTEVfSVRFTX0KKyAgICAgKgorICAgICAqIEByZXNwb25zZS5yZXByZXNlbnRhdGlvbi41MDMubWVkaWFUeXBlIHRleHQvcGxhaW4KKyAgICAgKiBAcmVzcG9uc2UucmVwcmVzZW50YXRpb24uNTAzLmV4YW1wbGUgWW91J2xsIGdldCBzb21lIGV4cGxhbmF0aW9uIHdoeSB0aGlzIHNlcnZpY2UgaXMgbm90IGF2YWlsYWJsZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHJlcXVlc3RlZCBpdGVtIGlmIGl0IGV4aXN0cyBhbmQgdGhlICJUcnktSGFyZCIgaGVhZGVyIGlzIHNldCB0byAidHJ1ZSIsIG90aGVyd2lzZSBhIDUwMy4KKyAgICAgKi8KKyAgICAvLyBNZXRob2QgYWRkZWQgdG8gcmVwcm9kdWNlIE9XTFMtMjQyNDMgaXNzdWUuCisgICAgQEdFVAorICAgIEBQcm9kdWNlcyh7ImFwcGxpY2F0aW9uL3htbCIsICJ0ZXh0L3BsYWluIn0pCisgICAgQFBhdGgoInRyeS1oYXJkIikKKyAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0SXRlbShASGVhZGVyUGFyYW0oIlRyeS1IYXJkIikgYm9vbGVhbiB0cnlIYXJkKSB7CisgICAgICAgIGlmICghdHJ5SGFyZCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyhTdGF0dXMuU0VSVklDRV9VTkFWQUlMQUJMRSkKKyAgICAgICAgICAgICAgICAgICAgLmVudGl0eSgiU29ycnksIGJ1dCByaWdodCBub3cgd2UgY2FuJ3QgcHJvY2VzcyB0aGlzIHJlcXVlc3QsIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiB0cnkgYWdhaW4gYW5kIHNldCB0aGUgXCJUcnktSGFyZFwiIGhlYWRlciB0byBcInRydWVcIiIpCisgICAgICAgICAgICAgICAgICAgIC50eXBlKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soX2l0ZW0pLmJ1aWxkKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBpdGVtIGlmIGV4aXN0aW5nLgorICAgICAqCisgICAgICogQHJlc3BvbnNlLnJlcHJlc2VudGF0aW9uLjIwMC5tZWRpYVR5cGUgYXBwbGljYXRpb24vanNvbgorICAgICAqIEByZXNwb25zZS5yZXByZXNlbnRhdGlvbi4yMDAuZXhhbXBsZSBbIm15VmFsdWUiXQorICAgICAqCisgICAgICogQHJldHVybiB0aGUgcmVxdWVzdGVkIGl0ZW0uCisgICAgICovCisgICAgQEdFVAorICAgIEBQcm9kdWNlcyh7ImFwcGxpY2F0aW9uL2pzb24ifSkKKyAgICBwdWJsaWMgSlNPTkFycmF5IGdldEl0ZW1Bc0pTT04oKSB7CisgICAgICAgIGZpbmFsIEpTT05BcnJheSByZXN1bHQgPSBuZXcgSlNPTkFycmF5KCk7CisgICAgICAgIHJlc3VsdC5wdXQoX2l0ZW0uZ2V0VmFsdWUoKSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogVXBkYXRlIHRoZSB2YWx1ZSBwcm9wZXJ0eSBvZiB0aGUgY3VycmVudCBpdGVtLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSBuZXcgdmFsdWUgdG8gc2V0CisgICAgICovCisgICAgQFBhdGgoInZhbHVlL3t2YWx1ZX0iKQorICAgIEBQVVQKKyAgICBAQ29uc3VtZXMoeyJhcHBsaWNhdGlvbi94bWwifSkKKyAgICBwdWJsaWMgdm9pZCB1cGRhdGVJdGVtVmFsdWUoQFBhdGhQYXJhbSgidmFsdWUiKSBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgX2l0ZW0uc2V0VmFsdWUodmFsdWUpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZXh0ZW5kZWQtd2FkbC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9leHRlbmRlZHdhZGwvcmVzb3VyY2VzL0l0ZW1zUmVzb3VyY2UuamF2YSBiL2V4YW1wbGVzL2V4dGVuZGVkLXdhZGwtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZXh0ZW5kZWR3YWRsL3Jlc291cmNlcy9JdGVtc1Jlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjFiN2Y1MQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2V4dGVuZGVkLXdhZGwtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZXh0ZW5kZWR3YWRsL3Jlc291cmNlcy9JdGVtc1Jlc291cmNlLmphdmEKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5leHRlbmRlZHdhZGwucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLk5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmV4dGVuZGVkd2FkbC5JdGVtOworCisvKioKKyAqIFRoaXMgaXMgdGhlIHJvb3QgcmVzb3VyY2UgZm9yIG1hbmFnaW5nIGl0ZW1zLgorICoKKyAqIEBhdXRob3IgTWFydGluIEdyb3R6a2UgKG1hcnRpbi5ncm90emtlQGZyZWloZWl0LmNvbSkKKyAqLworQFNpbmdsZXRvbgorQFBhdGgoIml0ZW1zIikKK3B1YmxpYyBjbGFzcyBJdGVtc1Jlc291cmNlIHsKKworICAgIEBDb250ZXh0CisgICAgVXJpSW5mbyBfdXJpSW5mbzsKKyAgICBwcml2YXRlIGZpbmFsIEF0b21pY0ludGVnZXIgX3NlcXVlbmNlOworICAgIHByaXZhdGUgZmluYWwgTWFwPEludGVnZXIsIEl0ZW0+IF9yZXBvc2l0b3J5OworCisgICAgcHVibGljIEl0ZW1zUmVzb3VyY2UoKSB7CisgICAgICAgIF9zZXF1ZW5jZSA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CisgICAgICAgIF9yZXBvc2l0b3J5ID0gbmV3IEhhc2hNYXA8PigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhbiBpdGVtIHJlc291cmNlIGZvciBhbiBpdGVtIGZyb20gdGhlIGxpc3Qgb2YgbWFuYWdlZCBpdGVtcyBiYXNlZCBvbiB0aGUgYXNzaWduZWQgaWQgZXh0cmFjdGVkIGZyb20gdGhlIHBhdGggcGFyYW1ldGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGlkIFRoZSBJRCBvZiB0aGUgaXRlbSB0byByZXRyaWV2ZS4KKyAgICAgKiBAcmV0dXJuIHJlc3BlY3RpdmUgaXRlbXMgcmVzb3VyY2UuCisgICAgICoKKyAgICAgKi8KKyAgICBAUGF0aCgie2lkfSIpCisgICAgcHVibGljIEl0ZW1SZXNvdXJjZSBnZXRJdGVtKEBQYXRoUGFyYW0oImlkIikgZmluYWwgSW50ZWdlciBpZCkgeworICAgICAgICBmaW5hbCBJdGVtIGl0ZW0gPSBfcmVwb3NpdG9yeS5nZXQoaWQpOworICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oUmVzcG9uc2Uuc3RhdHVzKFJlc3BvbnNlLlN0YXR1cy5OT1RfRk9VTkQpLmVudGl0eSgiSXRlbSB3aXRoIGlkICIgKyBpZCArICIgZG9lcyBub3QgIgorICAgICAgICAgICAgICAgICAgICArICJleGlzdCEiKS5idWlsZCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgSXRlbVJlc291cmNlKGl0ZW0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhIG5ldyBpdGVtIHRvIHRoZSBsaXN0IG9mIG1hbmFnZWQgaXRlbXMuIFRoZSBpdGVtIHdpbGwgZ2V0IGFzc2lnbmVkIGFuIGlkLAorICAgICAqIHRoZSByZXNvdXJjZSB3aGVyZSB0aGUgaXRlbSBpcyBhdmFpbGFibGUgd2lsbCBiZSByZXR1cm5lZCBpbiB0aGUgbG9jYXRpb24gaGVhZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGl0ZW0gVGhlIGl0ZW0gdG8gY3JlYXRlLgorICAgICAqCisgICAgICogQHJlcXVlc3QucmVwcmVzZW50YXRpb24ucW5hbWUge2h0dHA6Ly93d3cuZXhhbXBsZS5jb219aXRlbQorICAgICAqIEByZXF1ZXN0LnJlcHJlc2VudGF0aW9uLm1lZGlhVHlwZSBhcHBsaWNhdGlvbi94bWwKKyAgICAgKiBAcmVxdWVzdC5yZXByZXNlbnRhdGlvbi5leGFtcGxlIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5leHRlbmRlZHdhZGwudXRpbC5FeGFtcGxlcyNTQU1QTEVfSVRFTX0KKyAgICAgKgorICAgICAqIEByZXNwb25zZS5wYXJhbSB7QG5hbWUgTG9jYXRpb259CisgICAgICogICAgICAgICAgICAgICAgICB7QHN0eWxlIGhlYWRlcn0KKyAgICAgKiAgICAgICAgICAgICAgICAgIHtAdHlwZSB7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VVJJfQorICAgICAqICAgICAgICAgICAgICAgICAge0Bkb2MgVGhlIFVSSSB3aGVyZSB0aGUgY3JlYXRlZCBpdGVtIGlzIGFjY2Vzc2FibGUufQorICAgICAqCisgICAgICogQHJldHVybiBUaGUgcmVzcG9uc2Ugd2l0aCB0aGUgc3RhdHVzIGNvZGUgYW5kIHRoZSBsb2NhdGlvbiBoZWFkZXIuCisgICAgICoKKyAgICAgKi8KKyAgICBAUE9TVAorICAgIEBDb25zdW1lcyh7ImFwcGxpY2F0aW9uL3htbCJ9KQorICAgIHB1YmxpYyBSZXNwb25zZSBjcmVhdGVJdGVtKEl0ZW0gaXRlbSkgeworICAgICAgICBmaW5hbCBJbnRlZ2VyIGlkID0gX3NlcXVlbmNlLmluY3JlbWVudEFuZEdldCgpOworICAgICAgICBfcmVwb3NpdG9yeS5wdXQoaWQsIGl0ZW0pOworICAgICAgICByZXR1cm4gUmVzcG9uc2UuY3JlYXRlZCgKKyAgICAgICAgICAgICAgICBfdXJpSW5mby5nZXRBYnNvbHV0ZVBhdGhCdWlsZGVyKCkuY2xvbmUoKS5wYXRoKGlkLnRvU3RyaW5nKCkpLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9leHRlbmRlZC13YWRsLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2V4dGVuZGVkd2FkbC9yZXNvdXJjZXMvTXlBcHBsaWNhdGlvbi5qYXZhIGIvZXhhbXBsZXMvZXh0ZW5kZWQtd2FkbC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9leHRlbmRlZHdhZGwvcmVzb3VyY2VzL015QXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2E3Mjg5Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZXh0ZW5kZWQtd2FkbC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9leHRlbmRlZHdhZGwvcmVzb3VyY2VzL015QXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDI0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmV4dGVuZGVkd2FkbC5yZXNvdXJjZXM7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5leHRlbmRlZHdhZGwuU2FtcGxlV2FkbEdlbmVyYXRvckNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5leHRlbmRlZHdhZGwudXRpbC5FeGFtcGxlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKKy8qKgorICogQGF1dGhvciBKb25hdGhhbiBCZW5vaXQKKyAqLworcHVibGljIGNsYXNzIE15QXBwbGljYXRpb24gZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisgICAgcHVibGljIE15QXBwbGljYXRpb24oKSB7CisgICAgICAgIHN1cGVyKEl0ZW1SZXNvdXJjZS5jbGFzcywgSXRlbXNSZXNvdXJjZS5jbGFzcywgRXhhbXBsZXMuY2xhc3MsIFNhbXBsZVdhZGxHZW5lcmF0b3JDb25maWcuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2V4dGVuZGVkLXdhZGwtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZXh0ZW5kZWR3YWRsL3V0aWwvRXhhbXBsZXMuamF2YSBiL2V4YW1wbGVzL2V4dGVuZGVkLXdhZGwtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZXh0ZW5kZWR3YWRsL3V0aWwvRXhhbXBsZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDJlZTBiCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZXh0ZW5kZWQtd2FkbC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9leHRlbmRlZHdhZGwvdXRpbC9FeGFtcGxlcy5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZXh0ZW5kZWR3YWRsLnV0aWw7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5leHRlbmRlZHdhZGwuSXRlbTsKKworLyoqCisgKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGV4YW1wbGUgcmVwcmVzZW50YXRpb25zIHRoYXQgY2FuIGJlIHVzZWQgZm9yIHdhZGwgZG9jcy48YnI+CisgKiBDcmVhdGVkIG9uOiBKdWwgMjAsIDIwMDg8YnI+CisgKgorICogQGF1dGhvciBNYXJ0aW4gR3JvdHprZSAobWFydGluLmdyb3R6a2VAZnJlaWhlaXQuY29tKQorICovCitwdWJsaWMgY2xhc3MgRXhhbXBsZXMgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBJdGVtIFNBTVBMRV9JVEVNID0gbmV3IEl0ZW0oKTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIFNBTVBMRV9JVEVNLnNldFZhbHVlKCJmb28iKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2V4dGVuZGVkLXdhZGwtd2ViYXBwL3NyYy9tYWluL3Jlc291cmNlcy9hcHBsaWNhdGlvbi1kb2MueG1sIGIvZXhhbXBsZXMvZXh0ZW5kZWQtd2FkbC13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL2FwcGxpY2F0aW9uLWRvYy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIxZWNjOAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2V4dGVuZGVkLXdhZGwtd2ViYXBwL3NyYy9tYWluL3Jlc291cmNlcy9hcHBsaWNhdGlvbi1kb2MueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisKKy0tPgorCis8YXBwbGljYXRpb25Eb2NzIHRhcmdldE5hbWVzcGFjZT0iaHR0cDovL3dhZGwuZGV2LmphdmEubmV0LzIwMDkvMDIiPgorCisgICAgPGRvYyB4bWw6bGFuZz0iZW4iIHRpdGxlPSJUaGUgZG9jIGZvciB5b3VyIEFQSSI+CisgICAgICAgIFRoaXMgaXMgYSBwYXJhZ3JhcGggdGhhdCBpcyBhZGRlZCB0byB0aGUgc3RhcnQgb2YgdGhlIGdlbmVyYXRlZCBhcHBsaWNhdGlvbi53YWRsCisgICAgPC9kb2M+CisKKyAgICA8ZG9jIHhtbDpsYW5nPSJkZSIgdGl0bGU9IkRpZSBEb2t1bWVudGF0aW9uIGZ1ZXIgSWhyZSBBUEkiPgorICAgICAgICBEaWVzIGluIGVpbiBBYnNjaG5pdHQsIGRlciBkZW0gQmVnaW5uIGRlciBnZW5lcmllcnRlIGFwcGxpY2F0aW9uLndhZGwgaGluenVnZWbDvGd0IHdpcmQgLSBpbiBkZXV0c2NoZXIgU3ByYWNoZS4KKyAgICA8L2RvYz4KKzwvYXBwbGljYXRpb25Eb2NzPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZXh0ZW5kZWQtd2FkbC13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL2FwcGxpY2F0aW9uLWdyYW1tYXJzLnhtbCBiL2V4YW1wbGVzL2V4dGVuZGVkLXdhZGwtd2ViYXBwL3NyYy9tYWluL3Jlc291cmNlcy9hcHBsaWNhdGlvbi1ncmFtbWFycy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjgyN2FhMAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2V4dGVuZGVkLXdhZGwtd2ViYXBwL3NyYy9tYWluL3Jlc291cmNlcy9hcHBsaWNhdGlvbi1ncmFtbWFycy54bWwKQEAgLTAsMCArMSwxOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzxncmFtbWFycyB4bWxucz0iaHR0cDovL3dhZGwuZGV2LmphdmEubmV0LzIwMDkvMDIiCisgICAgeG1sbnM6eHNkPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSIKKyAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YTUwveGluY2x1ZGUiPgorICAgIDxpbmNsdWRlIGhyZWY9InNjaGVtYS54c2QiIC8+Cis8L2dyYW1tYXJzPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZXh0ZW5kZWQtd2FkbC13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZ2xhc3NmaXNoLXdlYi54bWwgYi9leGFtcGxlcy9leHRlbmRlZC13YWRsLXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9nbGFzc2Zpc2gtd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGRiMWU0Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZXh0ZW5kZWQtd2FkbC13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZ2xhc3NmaXNoLXdlYi54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisKKy0tPgorCis8IURPQ1RZUEUgZ2xhc3NmaXNoLXdlYi1hcHAgUFVCTElDICItLy9HbGFzc0Zpc2gub3JnLy9EVEQgR2xhc3NGaXNoIEFwcGxpY2F0aW9uIFNlcnZlciAzLjEgU2VydmxldCAzLjAvL0VOIiAiaHR0cDovL2dsYXNzZmlzaC5vcmcvZHRkcy9nbGFzc2Zpc2gtd2ViLWFwcF8zXzAtMS5kdGQiPgorPGdsYXNzZmlzaC13ZWItYXBwIGVycm9yLXVybD0iIj4KKyAgICA8Y29udGV4dC1yb290Pi9leHRlbmRlZC13YWRsLXdlYmFwcDwvY29udGV4dC1yb290PgorICAgIDxjbGFzcy1sb2FkZXIgZGVsZWdhdGU9InRydWUiIC8+CisgICAgPGpzcC1jb25maWc+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc2RlYnVnaW5mbyIgdmFsdWU9InRydWUiPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPkVuYWJsZSBkZWJ1ZyBpbmZvIGNvbXBpbGF0aW9uIGluIHRoZSBnZW5lcmF0ZWQgc2VydmxldCBjbGFzczwvZGVzY3JpcHRpb24+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJrZWVwZ2VuZXJhdGVkIiB2YWx1ZT0idHJ1ZSI+CisgICAgICAgICAgICA8ZGVzY3JpcHRpb24+S2VlcCBhIGNvcHkgb2YgdGhlIGdlbmVyYXRlZCBzZXJ2bGV0IGNsYXNzJyBqYXZhIGNvZGUuPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1hcHBlZGZpbGUiIHZhbHVlPSJ0cnVlIj4KKyAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5NYWludGFpbiBhIG9uZS10by1vbmUgY29ycmVzcG9uZGVuY2UgYmV0d2VlbiBzdGF0aWMgY29udGVudCBhbmQgdGhlIGdlbmVyYXRlZCBzZXJ2bGV0IGNsYXNzJyBqYXZhIGNvZGU8L2Rlc2NyaXB0aW9uPgorICAgICAgICA8L3Byb3BlcnR5PgorICAgIDwvanNwLWNvbmZpZz4KKzwvZ2xhc3NmaXNoLXdlYi1hcHA+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9leHRlbmRlZC13YWRsLXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvZXhhbXBsZXMvZXh0ZW5kZWQtd2FkbC13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2IyZWRlCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZXh0ZW5kZWQtd2FkbC13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDMyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjIuNSIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI+CisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZXh0ZW5kZWR3YWRsLnJlc291cmNlcy5NeUFwcGxpY2F0aW9uPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC53cy5ycy5BcHBsaWNhdGlvbjwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5leHRlbmRlZHdhZGwucmVzb3VyY2VzLk15QXBwbGljYXRpb248L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amVyc2V5LmNvbmZpZy5zZXJ2ZXIud2FkbC5nZW5lcmF0b3JDb25maWc8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZXh0ZW5kZWR3YWRsLlNhbXBsZVdhZGxHZW5lcmF0b3JDb25maWc8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmV4dGVuZGVkd2FkbC5yZXNvdXJjZXMuTXlBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZXh0ZW5kZWQtd2FkbC13ZWJhcHAvc3JjL21haW4veHNkL3NjaGVtYS54c2QgYi9leGFtcGxlcy9leHRlbmRlZC13YWRsLXdlYmFwcC9zcmMvbWFpbi94c2Qvc2NoZW1hLnhzZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDhkMmJjCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZXh0ZW5kZWQtd2FkbC13ZWJhcHAvc3JjL21haW4veHNkL3NjaGVtYS54c2QKQEAgLTAsMCArMSwzNSBAQAorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzxzY2hlbWEKKyAgICAgICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgorICAgICAgICB4bWxuczpleGFtcGxlPSJodHRwOi8vd3d3LmV4YW1wbGUuY29tIgorICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly93d3cuZXhhbXBsZS5jb20iCisgICAgICAgID4KKworICAgIDxlbGVtZW50IG5hbWU9Iml0ZW1zIiB0eXBlPSJleGFtcGxlOml0ZW1zIi8+CisKKyAgICA8Y29tcGxleFR5cGUgbmFtZT0iaXRlbXMiPgorICAgICAgICA8c2VxdWVuY2U+CisgICAgICAgICAgICA8ZWxlbWVudCBuYW1lPSJpdGVtIiB0eXBlPSJzdHJpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgPC9zZXF1ZW5jZT4KKyAgICA8L2NvbXBsZXhUeXBlPgorCisgICAgPGVsZW1lbnQgbmFtZT0iaXRlbSI+CisgICAgICAgIDxjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDxzaW1wbGVDb250ZW50PgorICAgICAgICAgICAgICAgIDxleHRlbnNpb24gYmFzZT0ic3RyaW5nIj48L2V4dGVuc2lvbj4KKyAgICAgICAgICAgIDwvc2ltcGxlQ29udGVudD4KKyAgICAgICAgPC9jb21wbGV4VHlwZT4KKyAgICA8L2VsZW1lbnQ+CisKKzwvc2NoZW1hPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZXh0ZW5kZWQtd2FkbC13ZWJhcHAvc3JjL21haW4veHNsdC9nZi54c2wgYi9leGFtcGxlcy9leHRlbmRlZC13YWRsLXdlYmFwcC9zcmMvbWFpbi94c2x0L2dmLnhzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWFkNjE1Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZXh0ZW5kZWQtd2FkbC13ZWJhcHAvc3JjL21haW4veHNsdC9nZi54c2wKQEAgLTAsMCArMSw0OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisKKy0tPgorCis8eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCisgICAgICAgICAgICAgICAgeG1sbnM6cG9tPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCisgICAgICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIgorICAgICAgICAgICAgICAgIHZlcnNpb249IjEuMCI+CisKKyAgICA8eHNsOm91dHB1dCBtZXRob2Q9InhtbCIgaW5kZW50PSJ5ZXMiIC8+CisKKyAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvIj4KKyAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgLz4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDx4c2w6dGVtcGxhdGUKKyAgICAgICAgICAgIG1hdGNoPSJwb206cGx1Z2lucy9wb206cGx1Z2luW3BvbTphcnRpZmFjdElkPSdtYXZlbi1zdXJlZmlyZS1wbHVnaW4nXS9wb206Y29uZmlndXJhdGlvbiI+CisgICAgICAgIDx4c2w6Y29weT4KKyAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIC8+CisgICAgICAgICAgICA8ZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovRXh0ZW5kZWRXYWRsV2ViYXBwT3NnaVRlc3QuamF2YTwvZXhjbHVkZT4KKyAgICAgICAgICAgIDwvZXhjbHVkZXM+CisgICAgICAgIDwveHNsOmNvcHk+CisgICAgPC94c2w6dGVtcGxhdGU+CisKKyAgICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJjb21tZW50KCkiPgorICAgICAgICA8eHNsOmNvbW1lbnQ+CisgICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iLiIgLz4KKyAgICAgICAgPC94c2w6Y29tbWVudD4KKyAgICA8L3hzbDp0ZW1wbGF0ZT4KKworICAgIDx4c2w6dGVtcGxhdGUgbWF0Y2g9IioiPgorICAgICAgICA8eHNsOmNvcHk+CisgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyAvPgorICAgICAgICA8L3hzbDpjb3B5PgorICAgIDwveHNsOnRlbXBsYXRlPgorCis8L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZXh0ZW5kZWQtd2FkbC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9leHRlbmRlZHdhZGwvRXh0ZW5kZWRXYWRsV2ViYXBwT3NnaVRlc3QuamF2YSBiL2V4YW1wbGVzL2V4dGVuZGVkLXdhZGwtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZXh0ZW5kZWR3YWRsL0V4dGVuZGVkV2FkbFdlYmFwcE9zZ2lUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg1M2JmOAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2V4dGVuZGVkLXdhZGwtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZXh0ZW5kZWR3YWRsL0V4dGVuZGVkV2FkbFdlYmFwcE9zZ2lUZXN0LmphdmEKQEAgLTAsMCArMSwzMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZXh0ZW5kZWR3YWRsOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoOworaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aENvbnN0YW50czsKK2ltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGhGYWN0b3J5OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZXh0ZW5kZWR3YWRsLnJlc291cmNlcy5JdGVtUmVzb3VyY2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZXh0ZW5kZWR3YWRsLnJlc291cmNlcy5JdGVtc1Jlc291cmNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmV4dGVuZGVkd2FkbC5yZXNvdXJjZXMuTXlBcHBsaWNhdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5leHRlbmRlZHdhZGwudXRpbC5FeGFtcGxlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5Mi5odHRwc2VydmVyLkdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlByb3BlcnRpZXNIZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5TaW1wbGVOYW1lc3BhY2VSZXNvbHZlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLk1lZGlhVHlwZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLmludGVybmFsLldhZGxVdGlsczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5ncml6emx5Lmh0dHAuc2VydmVyLkh0dHBTZXJ2ZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLm9wczRqLnBheC5leGFtLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wczRqLnBheC5leGFtLk9wdGlvbjsKK2ltcG9ydCBvcmcub3BzNGoucGF4LmV4YW0uanVuaXQuUGF4RXhhbTsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVFeGNlcHRpb247CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5vcHM0ai5wYXguZXhhbS5Db3JlT3B0aW9ucy5qdW5pdEJ1bmRsZXM7CitpbXBvcnQgc3RhdGljIG9yZy5vcHM0ai5wYXguZXhhbS5Db3JlT3B0aW9ucy5tYXZlbkJ1bmRsZTsKK2ltcG9ydCBzdGF0aWMgb3JnLm9wczRqLnBheC5leGFtLkNvcmVPcHRpb25zLm9wdGlvbnM7CitpbXBvcnQgc3RhdGljIG9yZy5vcHM0ai5wYXguZXhhbS5Db3JlT3B0aW9ucy5wcm92aXNpb247CitpbXBvcnQgc3RhdGljIG9yZy5vcHM0ai5wYXguZXhhbS5Db3JlT3B0aW9ucy5zeXN0ZW1QYWNrYWdlOworaW1wb3J0IHN0YXRpYyBvcmcub3BzNGoucGF4LmV4YW0uQ29yZU9wdGlvbnMuc3lzdGVtUHJvcGVydHk7CitpbXBvcnQgc3RhdGljIG9yZy5vcHM0ai5wYXgudGlueWJ1bmRsZXMuY29yZS5UaW55QnVuZGxlcy5idW5kbGU7CisKKy8qKgorICogQGF1dGhvciBOYXJlc2gKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSdW5XaXRoKFBheEV4YW0uY2xhc3MpCitwdWJsaWMgY2xhc3MgRXh0ZW5kZWRXYWRsV2ViYXBwT3NnaVRlc3QgeworCisgICAgQEluamVjdAorICAgIEJ1bmRsZUNvbnRleHQgYnVuZGxlQ29udGV4dDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEV4dGVuZGVkV2FkbFdlYmFwcE9zZ2lUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICAvLyB3ZSB3YW50IHRvIHJlLXVzZSB0aGUgcG9ydCBudW1iZXIgYXMgc2V0IGZvciBKZXJzZXkgdGVzdCBjb250YWluZXIgdG8gYXZvaWQgQ1QgcG9ydCBudW1iZXIgY2xhc2hlcworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB0ZXN0Q29udGFpbmVyUG9ydCA9IFN5c3RlbS5nZXRQcm9wZXJ0eShUZXN0UHJvcGVydGllcy5DT05UQUlORVJfUE9SVCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHRlc3RQb3J0ID0gdGVzdENvbnRhaW5lclBvcnQgPT0gbnVsbAorICAgICAgICAgICAgPyBUZXN0UHJvcGVydGllcy5ERUZBVUxUX0NPTlRBSU5FUl9QT1JUIDogSW50ZWdlci5wYXJzZUludCh0ZXN0Q29udGFpbmVyUG9ydCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgYmFzZVVyaSA9IFVyaUJ1aWxkZXIKKyAgICAgICAgICAgIC5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0IikKKyAgICAgICAgICAgIC5wb3J0KHRlc3RQb3J0KQorICAgICAgICAgICAgLnBhdGgoImV4dGVuZGVkLXdhZGwtd2ViYXBwIikuYnVpbGQoKTsKKworICAgIEBDb25maWd1cmF0aW9uCisgICAgcHVibGljIHN0YXRpYyBPcHRpb25bXSBjb25maWd1cmF0aW9uKCkgeworICAgICAgICBMaXN0PE9wdGlvbj4gb3B0aW9ucyA9IEFycmF5cy5hc0xpc3Qob3B0aW9ucygKKyAgICAgICAgICAgICAgICAvLyBzeXN0ZW1Qcm9wZXJ0eSgib3JnLm9wczRqLnBheC5sb2dnaW5nLkRlZmF1bHRTZXJ2aWNlTG9nLmxldmVsIikudmFsdWUoIkZJTkVTVCIpLAorICAgICAgICAgICAgICAgIHN5c3RlbVByb3BlcnR5KCJvcmcub3NnaS5mcmFtZXdvcmsuc3lzdGVtLnBhY2thZ2VzLmV4dHJhIikudmFsdWUoImphdmF4LmFubm90YXRpb24iKSwKKworICAgICAgICAgICAgICAgIC8vIGphdmF4LmFubm90YXRpb24gbXVzdCBnbyBmaXJzdCEKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoImphdmF4LmFubm90YXRpb24iKS5hcnRpZmFjdElkKCJqYXZheC5hbm5vdGF0aW9uLWFwaSIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorCisgICAgICAgICAgICAgICAganVuaXRCdW5kbGVzKCksCisKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgib3JnLm9wczRqLnBheC51cmwiLCAicGF4LXVybC1tdm4iKSwKKworICAgICAgICAgICAgICAgIC8vIEhLMgorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmdsYXNzZmlzaC5oazIiKS5hcnRpZmFjdElkKCJoazItYXBpIikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuZ2xhc3NmaXNoLmhrMiIpLmFydGlmYWN0SWQoIm9zZ2ktcmVzb3VyY2UtbG9jYXRvciIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmdsYXNzZmlzaC5oazIiKS5hcnRpZmFjdElkKCJoazItbG9jYXRvciIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmdsYXNzZmlzaC5oazIiKS5hcnRpZmFjdElkKCJoazItdXRpbHMiKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5nbGFzc2Zpc2guaGsyLmV4dGVybmFsIikuYXJ0aWZhY3RJZCgiamF2YXguaW5qZWN0IikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuZ2xhc3NmaXNoLmhrMi5leHRlcm5hbCIpLmFydGlmYWN0SWQoImFvcGFsbGlhbmNlLXJlcGFja2FnZWQiKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5qYXZhc3Npc3QiKS5hcnRpZmFjdElkKCJqYXZhc3Npc3QiKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKworICAgICAgICAgICAgICAgIC8vIEpBWC1SUyBBUEkKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoImphdmF4LndzLnJzIikuYXJ0aWZhY3RJZCgiamF2YXgud3MucnMtYXBpIikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisKKyAgICAgICAgICAgICAgICAvLyBKZXJzZXkgYnVuZGxlcworICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZSIpLmFydGlmYWN0SWQoImplcnNleS1jb21tb24iKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhIikuYXJ0aWZhY3RJZCgiamVyc2V5LW1lZGlhLWpheGIiKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmUiKS5hcnRpZmFjdElkKCJqZXJzZXktc2VydmVyIikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlIikuYXJ0aWZhY3RJZCgiamVyc2V5LWNsaWVudCIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0IikuYXJ0aWZhY3RJZCgiamVyc2V5LWhrMiIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorCisgICAgICAgICAgICAgICAgLy8gamV0dGlzb24KKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5jb2RlaGF1cy5qZXR0aXNvbiIpLmFydGlmYWN0SWQoImpldHRpc29uIikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisKKyAgICAgICAgICAgICAgICAvLyB2YWxpZGF0aW9uCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJqYXZheC52YWxpZGF0aW9uIikuYXJ0aWZhY3RJZCgidmFsaWRhdGlvbi1hcGkiKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKworICAgICAgICAgICAgICAgIC8vIEdyaXp6bHkKKyAgICAgICAgICAgICAgICBzeXN0ZW1QYWNrYWdlKCJzdW4ubWlzYyIpLCAgICAgICAvLyByZXF1aXJlZCBieSBncml6emx5LWZyYW1ld29yaworICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmdsYXNzZmlzaC5ncml6emx5IikuYXJ0aWZhY3RJZCgiZ3JpenpseS1mcmFtZXdvcmsiKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5nbGFzc2Zpc2guZ3JpenpseSIpLmFydGlmYWN0SWQoImdyaXp6bHktaHR0cCIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmdsYXNzZmlzaC5ncml6emx5IikuYXJ0aWZhY3RJZCgiZ3JpenpseS1odHRwLXNlcnZlciIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorCisgICAgICAgICAgICAgICAgLy8gSmVyc2V5IEdyaXp6bHkKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnMiKS5hcnRpZmFjdElkKCJqZXJzZXktY29udGFpbmVyLWdyaXp6bHkyLWh0dHAiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnZlcnNpb25Bc0luUHJvamVjdCgpLAorCisgICAgICAgICAgICAgICAgLy8gdGlueWJ1bmRsZXMgKyByZXF1aXJlZCBkZXBlbmRlbmNpZXMKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5vcHM0ai5wYXgudGlueWJ1bmRsZXMiKS5hcnRpZmFjdElkKCJ0aW55YnVuZGxlcyIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgiYml6LmFRdXRlLmJuZCIpLmFydGlmYWN0SWQoImJuZGxpYiIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorCisgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGFkLWhvYyBidW5kbGUKKyAgICAgICAgICAgICAgICBwcm92aXNpb24oCisgICAgICAgICAgICAgICAgICAgICAgICBidW5kbGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKE15QXBwbGljYXRpb24uY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoSXRlbVJlc291cmNlLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKEl0ZW1zUmVzb3VyY2UuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoRXhhbXBsZXMuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoU2FtcGxlV2FkbEdlbmVyYXRvckNvbmZpZy5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChJdGVtLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKEl0ZW1zLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKE9iamVjdEZhY3RvcnkuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoImFwcGxpY2F0aW9uLWRvYy54bWwiLCBDbGFzc0xvYWRlci5nZXRTeXN0ZW1SZXNvdXJjZUFzU3RyZWFtKCJhcHBsaWNhdGlvbi1kb2MueG1sIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoImFwcGxpY2F0aW9uLWdyYW1tYXJzLnhtbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtUmVzb3VyY2VBc1N0cmVhbSgiYXBwbGljYXRpb24tZ3JhbW1hcnMueG1sIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoInJlc291cmNlZG9jLnhtbCIsIENsYXNzTG9hZGVyLmdldFN5c3RlbVJlc291cmNlQXNTdHJlYW0oInJlc291cmNlZG9jLnhtbCIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KCJFeHBvcnQtUGFja2FnZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXlBcHBsaWNhdGlvbi5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpICsgIiwiICsgU2FtcGxlV2FkbEdlbmVyYXRvckNvbmZpZy5jbGFzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXQoIkR5bmFtaWNJbXBvcnQtUGFja2FnZSIsICIqIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldCgiQnVuZGxlLVN5bWJvbGljTmFtZSIsICJ3ZWJhcHAiKS5idWlsZCgpKQorICAgICAgICApKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGxvY2FsUmVwb3NpdG9yeSA9IEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKFByb3BlcnRpZXNIZWxwZXIuZ2V0U3lzdGVtUHJvcGVydHkoImxvY2FsUmVwb3NpdG9yeSIpKTsKKyAgICAgICAgaWYgKGxvY2FsUmVwb3NpdG9yeSAhPSBudWxsKSB7CisgICAgICAgICAgICBvcHRpb25zID0gbmV3IEFycmF5TGlzdDw+KG9wdGlvbnMpOworICAgICAgICAgICAgb3B0aW9ucy5hZGQoc3lzdGVtUHJvcGVydHkoIm9yZy5vcHM0ai5wYXgudXJsLm12bi5sb2NhbFJlcG9zaXRvcnkiKS52YWx1ZShsb2NhbFJlcG9zaXRvcnkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb3B0aW9ucy50b0FycmF5KG5ldyBPcHRpb25bb3B0aW9ucy5zaXplKCldKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlc291cmNlQ29uZmlnIGNyZWF0ZVJlc291cmNlQ29uZmlnKCkgeworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhuZXcgTXlBcHBsaWNhdGlvbigpLmdldENsYXNzZXMoKSk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuV0FETF9HRU5FUkFUT1JfQ09ORklHLCBTYW1wbGVXYWRsR2VuZXJhdG9yQ29uZmlnLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICAgICAgcmV0dXJuIHJlc291cmNlQ29uZmlnOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgY2hlY2tzIHRoYXQgdGhlIFdBREwgZ2VuZXJhdGVkIHVzaW5nIHRoZSBXYWRsR2VuZXJhdG9yIGFwaSBkb2Vzbid0CisgICAgICogY29udGFpbiB0aGUgZXhwZWN0ZWQgdGV4dC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGVzdCBlcnJvci4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeHRlbmRlZFdhZGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBUT0RPIC0gdGVtcG9yYXJ5IHdvcmthcm91bmQKKyAgICAgICAgLy8gVGhpcyBpcyBhIHdvcmthcm91bmQgcmVsYXRlZCB0byBpc3N1ZSBKRVJTRVktMjA5MzsgZ3JpenpseSAoMS45LjUpIG5lZWRzIHRvIGhhdmUgdGhlIGNvcnJlY3QgY29udGV4dAorICAgICAgICAvLyBjbGFzcyBsb2FkZXIgc2V0CisgICAgICAgIENsYXNzTG9hZGVyIG15Q2xhc3NMb2FkZXIgPSB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKKworICAgICAgICBmb3IgKEJ1bmRsZSBidW5kbGUgOiBidW5kbGVDb250ZXh0LmdldEJ1bmRsZXMoKSkgeworICAgICAgICAgICAgaWYgKCJ3ZWJhcHAiLmVxdWFscyhidW5kbGUuZ2V0U3ltYm9saWNOYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgbXlDbGFzc0xvYWRlciA9IGJ1bmRsZS5sb2FkQ2xhc3MoIm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmV4dGVuZGVkd2FkbC5yZXNvdXJjZXMuTXlBcHBsaWNhdGlvbiIpCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKG15Q2xhc3NMb2FkZXIpOworICAgICAgICAvLyBFTkQgb2Ygd29ya2Fyb3VuZCAtIHRoZSBlbnRpcmUgYmxvY2sgY2FuIGJlIGRlbGV0ZWQgYWZ0ZXIgZ3JpenpseSBpcyB1cGRhdGVkIHRvIHJlY2VudCB2ZXJzaW9uCisKKyAgICAgICAgLy8gTGlzdCBhbGwgdGhlIE9TR2kgYnVuZGxlcworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgc2IuYXBwZW5kKCItLSBCdW5kbGUgbGlzdCAtLSBcbiIpOworICAgICAgICBmb3IgKEJ1bmRsZSBiIDogYnVuZGxlQ29udGV4dC5nZXRCdW5kbGVzKCkpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZChTdHJpbmcuZm9ybWF0KCIlMSQ1cyIsICJbIiArIGIuZ2V0QnVuZGxlSWQoKSArICJdIikpLmFwcGVuZCgiICIpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiJTEkLTcwcyIsIGIuZ2V0U3ltYm9saWNOYW1lKCkpKS5hcHBlbmQoIiB8ICIpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiJTEkLTIwcyIsIGIuZ2V0VmVyc2lvbigpKSkuYXBwZW5kKCIgfCIpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBiLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgU1RBUlRFRCAgfCAiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEJ1bmRsZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIgKkZBSUxFRCogfCAiKS5hcHBlbmQoZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2IuYXBwZW5kKGIuZ2V0TG9jYXRpb24oKSkuYXBwZW5kKCJcbiIpOworICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZCgiLS0gXG5cbiIpOworICAgICAgICBMT0dHRVIuZmluZShzYi50b1N0cmluZygpKTsKKworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IGNyZWF0ZVJlc291cmNlQ29uZmlnKCk7CisgICAgICAgIGZpbmFsIEh0dHBTZXJ2ZXIgc2VydmVyID0gR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5LmNyZWF0ZUh0dHBTZXJ2ZXIoYmFzZVVyaSwgcmVzb3VyY2VDb25maWcpOworICAgICAgICBmaW5hbCBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSBjbGllbnQudGFyZ2V0KGJhc2VVcmkpLnBhdGgoImFwcGxpY2F0aW9uLndhZGwiKS5yZXF1ZXN0KE1lZGlhVHlwZXMuV0FETF9UWVBFKS5idWlsZEdldCgpCisgICAgICAgICAgICAgICAgLmludm9rZSgpOworCisgICAgICAgIFN0cmluZyB3YWRsID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBMT0dHRVIuaW5mbygiUkVTVUxUID0gIiArIHdhZGwpOworCisgICAgICAgIGFzc2VydFRydWUoIkdlbmVyYXRlZCB3YWRsIGlzIG9mIG51bGwgbGVuZ3RoIiwgIXdhZGwuaXNFbXB0eSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiR2VuZXJhdGVkIHdhZGwgZG9lc24ndCBjb250YWluIHRoZSBleHBlY3RlZCB0ZXh0IiwKKyAgICAgICAgICAgICAgICB3YWRsLmNvbnRhaW5zKCJUaGlzIGlzIGEgcGFyYWdyYXBoIikpOworCisgICAgICAgIGFzc2VydEZhbHNlKHdhZGwuY29udGFpbnMoImFwcGxpY2F0aW9uLndhZGwveHNkMC54c2QiKSk7CisKKyAgICAgICAgc2VydmVyLnNodXRkb3duTm93KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2FkbE9wdGlvbnNNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gVE9ETyAtIHRlbXBvcmFyeSB3b3JrYXJvdW5kCisgICAgICAgIC8vIFRoaXMgaXMgYSB3b3JrYXJvdW5kIHJlbGF0ZWQgdG8gaXNzdWUgSkVSU0VZLTIwOTM7IGdyaXp6bHkgKDEuOS41KSBuZWVkcyB0byBoYXZlIHRoZSBjb3JyZWN0IGNvbnRleHQKKyAgICAgICAgLy8gY2xhc3MgbG9hZGVyIHNldAorICAgICAgICBDbGFzc0xvYWRlciBteUNsYXNzTG9hZGVyID0gdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7CisgICAgICAgIGZvciAoQnVuZGxlIGJ1bmRsZSA6IGJ1bmRsZUNvbnRleHQuZ2V0QnVuZGxlcygpKSB7CisgICAgICAgICAgICBpZiAoIndlYmFwcCIuZXF1YWxzKGJ1bmRsZS5nZXRTeW1ib2xpY05hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICBteUNsYXNzTG9hZGVyID0gYnVuZGxlLmxvYWRDbGFzcygib3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZXh0ZW5kZWR3YWRsLnJlc291cmNlcy5NeUFwcGxpY2F0aW9uIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRDbGFzc0xvYWRlcigpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIobXlDbGFzc0xvYWRlcik7CisgICAgICAgIC8vIEVORCBvZiB3b3JrYXJvdW5kOyBUaGUgZW50aXJlIGJsb2NrIGNhbiBiZSByZW1vdmVkIGFmdGVyIGdyaXp6bHkgaXMgbWlncmF0ZWQgdG8gbW9yZSByZWNlbnQgdmVyc2lvbgorCisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gY3JlYXRlUmVzb3VyY2VDb25maWcoKTsKKyAgICAgICAgZmluYWwgSHR0cFNlcnZlciBzZXJ2ZXIgPSBHcml6emx5SHR0cFNlcnZlckZhY3RvcnkuY3JlYXRlSHR0cFNlcnZlcihiYXNlVXJpLCByZXNvdXJjZUNvbmZpZyk7CisgICAgICAgIGZpbmFsIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpOworCisgICAgICAgIFN0cmluZyB3YWRsID0gY2xpZW50LnRhcmdldChiYXNlVXJpKS5wYXRoKCJpdGVtcyIpLnF1ZXJ5UGFyYW0oV2FkbFV0aWxzLkRFVEFJTEVEX1dBRExfUVVFUllfUEFSQU0sICJ0cnVlIikKKyAgICAgICAgICAgICAgICAucmVxdWVzdChNZWRpYVR5cGVzLldBRExfVFlQRSkub3B0aW9ucyhTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydFRydWUoIkdlbmVyYXRlZCB3YWRsIGlzIG9mIG51bGwgbGVuZ3RoIiwgIXdhZGwuaXNFbXB0eSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiR2VuZXJhdGVkIHdhZGwgZG9lc24ndCBjb250YWluIHRoZSBleHBlY3RlZCB0ZXh0IiwKKyAgICAgICAgICAgICAgICB3YWRsLmNvbnRhaW5zKCJUaGlzIGlzIGEgcGFyYWdyYXBoIikpOworCisgICAgICAgIGNoZWNrV2FkbCh3YWRsLCBiYXNlVXJpKTsKKworICAgICAgICBzZXJ2ZXIuc2h1dGRvd25Ob3coKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tXYWRsKFN0cmluZyB3YWRsLCBVUkkgYmFzZVVyaSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgYmYgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIGJmLnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOworICAgICAgICBiZi5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKKyAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGIgPSBiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBiLnBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSh3YWRsLmdldEJ5dGVzKENoYXJzZXQuZm9yTmFtZSgiVVRGLTgiKSkpKTsKKyAgICAgICAgWFBhdGggeHAgPSBYUGF0aEZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdYUGF0aCgpOworICAgICAgICB4cC5zZXROYW1lc3BhY2VDb250ZXh0KG5ldyBTaW1wbGVOYW1lc3BhY2VSZXNvbHZlcigid2FkbCIsICJodHRwOi8vd2FkbC5kZXYuamF2YS5uZXQvMjAwOS8wMiIpKTsKKyAgICAgICAgU3RyaW5nIHZhbCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKCIvd2FkbDphcHBsaWNhdGlvbi93YWRsOnJlc291cmNlcy9AYmFzZSIsIGRvY3VtZW50LCBYUGF0aENvbnN0YW50cy5TVFJJTkcpOworICAgICAgICBhc3NlcnRFcXVhbHMoYmFzZVVyaS50b1N0cmluZygpLCB2YWwuZW5kc1dpdGgoIi8iKSA/IHZhbC5zdWJzdHJpbmcoMCwgdmFsLmxlbmd0aCgpIC0gMSkgOiB2YWwpOworICAgICAgICB2YWwgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZSgiY291bnQoLy93YWRsOnJlc291cmNlKSIsIGRvY3VtZW50LCBYUGF0aENvbnN0YW50cy5TVFJJTkcpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIHJlc291cmNlIGVsZW1lbnRzLiIsIHZhbCwgIjQiKTsKKyAgICAgICAgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoImNvdW50KC8vd2FkbDpyZXNvdXJjZVtAcGF0aD0naXRlbXMnXSkiLCBkb2N1bWVudCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG51bWJlciBvZiByZXNvdXJjZSBlbGVtZW50cyB3aXRoICdpdGVtcycgcGF0aC4iLCAiMSIsIHZhbCk7CisgICAgICAgIHZhbCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKCJjb3VudCgvL3dhZGw6cmVzb3VyY2VbQHBhdGg9J3tpZH0nXSkiLCBkb2N1bWVudCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG51bWJlciBvZiByZXNvdXJjZSBlbGVtZW50cyB3aXRoICd7aWR9JyBwYXRoLiIsICIxIiwgdmFsKTsKKyAgICAgICAgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoImNvdW50KC8vd2FkbDpyZXNvdXJjZVtAcGF0aD0ndHJ5LWhhcmQnXSkiLCBkb2N1bWVudCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG51bWJlciBvZiByZXNvdXJjZSBlbGVtZW50cyB3aXRoICd0cnktaGFyZCcgcGF0aC4iLCAiMSIsIHZhbCk7CisgICAgICAgIHZhbCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKCJjb3VudCgvL3dhZGw6cmVzb3VyY2VbQHBhdGg9J3ZhbHVlL3t2YWx1ZX0nXSkiLCBkb2N1bWVudCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG51bWJlciBvZiByZXNvdXJjZSBlbGVtZW50cyB3aXRoICd2YWx1ZS97dmFsdWV9JyBwYXRoLiIsICIxIiwgdmFsKTsKKworICAgICAgICB2YWwgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZSgiY291bnQoLy93YWRsOnJlc291cmNlW0BwYXRoPSd7aWR9J10vd2FkbDptZXRob2QpIiwgZG9jdW1lbnQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBudW1iZXIgb2YgbWV0aG9kcyBpbiByZXNvdXJjZSBlbGVtZW50IHdpdGggJ3tpZH0nIHBhdGguIiwgIjIiLCB2YWwpOworICAgICAgICB2YWwgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZSgiY291bnQoLy93YWRsOnJlc291cmNlW0BwYXRoPSd7aWR9J10vd2FkbDptZXRob2RbQGlkPSdnZXRJdGVtJ10iCisgICAgICAgICAgICAgICAgICAgICAgICArICIvd2FkbDpkb2NbY29udGFpbnMoLiwgJ1R5cGljYWxseSByZXR1cm5zIHRoZSBpdGVtIGlmIGl0IGV4aXN0cy4nKV0pIiwKKyAgICAgICAgICAgICAgICBkb2N1bWVudCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGRvY3VtZW50YXRpb24gb2YgZ2V0SXRlbSByZXNvdXJjZSBtZXRob2QgYXQgJ3tpZH0nIHBhdGgiLCAiMSIsIHZhbCk7CisKKyAgICAgICAgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoImNvdW50KC8vd2FkbDpyZXNvdXJjZVtAcGF0aD0ndHJ5LWhhcmQnXS93YWRsOm1ldGhvZCkiLCBkb2N1bWVudCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG51bWJlciBvZiBtZXRob2RzIGluIHJlc291cmNlIGVsZW1lbnQgd2l0aCAndHJ5LWhhcmQnIHBhdGguIiwgIjEiLCB2YWwpOworICAgICAgICB2YWwgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZSgiY291bnQoLy93YWRsOnJlc291cmNlW0BwYXRoPSd0cnktaGFyZCddL3dhZGw6bWV0aG9kW0BpZD0nZ2V0SXRlbSddIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiL3dhZGw6ZG9jW2NvbnRhaW5zKC4sICdUcmllcyBoYXJkIHRvIHJldHVybiB0aGUgaXRlbSBpZiBpdCBleGlzdHMuJyldKSIsCisgICAgICAgICAgICAgICAgZG9jdW1lbnQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBkb2N1bWVudGF0aW9uIG9mIGdldEl0ZW0gcmVzb3VyY2UgbWV0aG9kIGF0ICd0cnktaGFyZCcgcGF0aCIsICIxIiwgdmFsKTsKKworICAgICAgICB2YWwgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZSgiY291bnQoLy93YWRsOnJlc291cmNlW0BwYXRoPSdpdGVtcyddL3dhZGw6bWV0aG9kKSIsIGRvY3VtZW50LCBYUGF0aENvbnN0YW50cy5TVFJJTkcpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIG1ldGhvZHMgaW4gcmVzb3VyY2UgZWxlbWVudCB3aXRoICdpdGVtcycgcGF0aC4iLCAiNCIsIHZhbCk7CisgICAgICAgIHZhbCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKCJjb3VudCgvL3dhZGw6cmVzb3VyY2VbQHBhdGg9J3ZhbHVlL3t2YWx1ZX0nXS93YWRsOm1ldGhvZCkiLCBkb2N1bWVudCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG51bWJlciBvZiBtZXRob2RzIGluIHJlc291cmNlIGVsZW1lbnQgd2l0aCAndmFsdWUve3ZhbHVlfScgcGF0aC4iLCAiMSIsIHZhbCk7CisKKyAgICAgICAgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoImNvdW50KC8vd2FkbDphcHBsaWNhdGlvbi93YWRsOmRvYykiLCBkb2N1bWVudCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG51bWJlciBvZiBkb2MgZWxlbWVudHMgaW4gYXBwbGljYXRpb24gZWxlbWVudC4iLCAiMyIsIHZhbCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZXh0ZW5kZWQtd2FkbC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9leHRlbmRlZHdhZGwvRXh0ZW5kZWRXYWRsV2ViYXBwVGVzdC5qYXZhIGIvZXhhbXBsZXMvZXh0ZW5kZWQtd2FkbC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9leHRlbmRlZHdhZGwvRXh0ZW5kZWRXYWRsV2ViYXBwVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMDUwYjEKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9leHRlbmRlZC13YWRsLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2V4dGVuZGVkd2FkbC9FeHRlbmRlZFdhZGxXZWJhcHBUZXN0LmphdmEKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZXh0ZW5kZWR3YWRsOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoOworaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aENvbnN0YW50czsKK2ltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGhGYWN0b3J5OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZXh0ZW5kZWR3YWRsLnJlc291cmNlcy5NeUFwcGxpY2F0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuU2ltcGxlTmFtZXNwYWNlUmVzb2x2ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5NZWRpYVR5cGVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuSW5mbGVjdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuaW50ZXJuYWwuV2FkbFV0aWxzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuRGVwbG95bWVudENvbnRleHQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogV0FETCBleHRlbnNpb24gZXhhbXBsZSB0ZXN0cy4KKyAqCisgKiBAYXV0aG9yIE5hcmVzaAorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgY2xhc3MgRXh0ZW5kZWRXYWRsV2ViYXBwVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoRXh0ZW5kZWRXYWRsV2ViYXBwVGVzdC5jbGFzcy5nZXROYW1lKCkpOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIERlcGxveW1lbnRDb250ZXh0IGNvbmZpZ3VyZURlcGxveW1lbnQoKSB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKG5ldyBNeUFwcGxpY2F0aW9uKCkuZ2V0Q2xhc3NlcygpKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5XQURMX0dFTkVSQVRPUl9DT05GSUcsICJvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5leHRlbmRlZHdhZGwiCisgICAgICAgICAgICAgICAgKyAiLlNhbXBsZVdhZGxHZW5lcmF0b3JDb25maWciKTsKKworICAgICAgICBmaW5hbCBSZXNvdXJjZS5CdWlsZGVyIHJlc291cmNlQnVpbGRlciA9IFJlc291cmNlLmJ1aWxkZXIoKTsKKyAgICAgICAgcmVzb3VyY2VCdWlsZGVyLm5hbWUoInJlc291cmNlLXByb2dyYW1tYXRpYyIpLnBhdGgoInByb2dyYW1tYXRpYyIpLmFkZE1ldGhvZCgiR0VUIikKKworICAgICAgICAgICAgICAgIC5oYW5kbGVkQnkobmV3IFByb2dyYW1tYXRpY1Jlc291cmNlKCkpOworICAgICAgICByZXNvdXJjZUNvbmZpZy5yZWdpc3RlclJlc291cmNlcyhyZXNvdXJjZUJ1aWxkZXIuYnVpbGQoKSk7CisgICAgICAgIHJldHVybiBEZXBsb3ltZW50Q29udGV4dC5idWlsZGVyKHJlc291cmNlQ29uZmlnKS5jb250ZXh0UGF0aCgiZXh0ZW5kZWQtd2FkbC13ZWJhcHAiKS5idWlsZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgY2hlY2tzIHRoYXQgdGhlIFdBREwgZ2VuZXJhdGVkIHVzaW5nIHRoZSBXYWRsR2VuZXJhdG9yIGFwaSBkb2Vzbid0CisgICAgICogY29udGFpbiB0aGUgZXhwZWN0ZWQgdGV4dC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbiBpbiBjYXNlIG9mIHRlc3QgZXJyb3IuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0ZW5kZWRXYWRsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyB3YWRsID0gdGFyZ2V0KCkucGF0aCgiYXBwbGljYXRpb24ud2FkbCIpCisgICAgICAgICAgICAgICAgLnF1ZXJ5UGFyYW0oV2FkbFV0aWxzLkRFVEFJTEVEX1dBRExfUVVFUllfUEFSQU0sICJ0cnVlIikucmVxdWVzdChNZWRpYVR5cGVzLldBRExfVFlQRSkuZ2V0KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgTE9HR0VSLmZpbmUod2FkbCk7CisgICAgICAgIGFzc2VydFRydWUoIkdlbmVyYXRlZCB3YWRsIGlzIG9mIG51bGwgbGVuZ3RoIiwgIXdhZGwuaXNFbXB0eSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiR2VuZXJhdGVkIHdhZGwgZG9lc24ndCBjb250YWluIHRoZSBleHBlY3RlZCB0ZXh0IiwKKyAgICAgICAgICAgICAgICB3YWRsLmNvbnRhaW5zKCJUaGlzIGlzIGEgcGFyYWdyYXBoIikpOworCisgICAgICAgIGFzc2VydEZhbHNlKHdhZGwuY29udGFpbnMoImFwcGxpY2F0aW9uLndhZGwveHNkMC54c2QiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2FkbE9wdGlvbnNNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHdhZGwgPSB0YXJnZXQoKS5wYXRoKCJpdGVtcyIpCisgICAgICAgICAgICAgICAgLnF1ZXJ5UGFyYW0oV2FkbFV0aWxzLkRFVEFJTEVEX1dBRExfUVVFUllfUEFSQU0sICJ0cnVlIikucmVxdWVzdChNZWRpYVR5cGVzLldBRExfVFlQRSkub3B0aW9ucyhTdHJpbmcuY2xhc3MpOworCisgICAgICAgIExPR0dFUi5maW5lKHdhZGwpOworICAgICAgICBhc3NlcnRUcnVlKCJHZW5lcmF0ZWQgd2FkbCBpcyBvZiBudWxsIGxlbmd0aCIsICF3YWRsLmlzRW1wdHkoKSk7CisgICAgICAgIGFzc2VydFRydWUoIkdlbmVyYXRlZCB3YWRsIGRvZXNuJ3QgY29udGFpbiB0aGUgZXhwZWN0ZWQgdGV4dCIsCisgICAgICAgICAgICAgICAgd2FkbC5jb250YWlucygiVGhpcyBpcyBhIHBhcmFncmFwaCIpKTsKKyAgICAgICAgY2hlY2tXYWRsKHdhZGwsIGdldEJhc2VVcmkoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvZ3JhbW1hdGljIHJlc291cmNlIGNsYXNzIGphdmFkb2MuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJvZ3JhbW1hdGljUmVzb3VyY2UgaW1wbGVtZW50cyBJbmZsZWN0b3I8Q29udGFpbmVyUmVxdWVzdENvbnRleHQsIFJlc3BvbnNlPiB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgYXBwbHkoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgZGF0YSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCJwcm9ncmFtbWF0aWMiKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrV2FkbChTdHJpbmcgd2FkbCwgVVJJIGJhc2VVcmkpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGJmID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICBiZi5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKyAgICAgICAgYmYuc2V0VmFsaWRhdGluZyhmYWxzZSk7CisvLyAgICAgICAgaWYgKCFTYXhIZWxwZXIuaXNYZGtEb2N1bWVudEJ1aWxkZXJGYWN0b3J5KGJmKSkgeworLy8gICAgICAgICAgICBiZi5zZXRYSW5jbHVkZUF3YXJlKGZhbHNlKTsKKy8vICAgICAgICB9CisgICAgICAgIERvY3VtZW50QnVpbGRlciBiID0gYmYubmV3RG9jdW1lbnRCdWlsZGVyKCk7CisgICAgICAgIERvY3VtZW50IGRvY3VtZW50ID0gYi5wYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0od2FkbC5nZXRCeXRlcyhDaGFyc2V0LmZvck5hbWUoIlVURi04IikpKSk7CisgICAgICAgIFhQYXRoIHhwID0gWFBhdGhGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3WFBhdGgoKTsKKyAgICAgICAgeHAuc2V0TmFtZXNwYWNlQ29udGV4dChuZXcgU2ltcGxlTmFtZXNwYWNlUmVzb2x2ZXIoIndhZGwiLCAiaHR0cDovL3dhZGwuZGV2LmphdmEubmV0LzIwMDkvMDIiKSk7CisgICAgICAgIFN0cmluZyB2YWwgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZSgiL3dhZGw6YXBwbGljYXRpb24vd2FkbDpyZXNvdXJjZXMvQGJhc2UiLCBkb2N1bWVudCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGJhc2VVcmkudG9TdHJpbmcoKSwgdmFsLmVuZHNXaXRoKCIvIikgPyB2YWwuc3Vic3RyaW5nKDAsIHZhbC5sZW5ndGgoKSAtIDEpIDogdmFsKTsKKyAgICAgICAgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoImNvdW50KC8vd2FkbDpyZXNvdXJjZSkiLCBkb2N1bWVudCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG51bWJlciBvZiByZXNvdXJjZSBlbGVtZW50cy4iLCB2YWwsICI0Iik7CisgICAgICAgIHZhbCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKCJjb3VudCgvL3dhZGw6cmVzb3VyY2VbQHBhdGg9J2l0ZW1zJ10pIiwgZG9jdW1lbnQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBudW1iZXIgb2YgcmVzb3VyY2UgZWxlbWVudHMgd2l0aCAnaXRlbXMnIHBhdGguIiwgIjEiLCB2YWwpOworICAgICAgICB2YWwgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZSgiY291bnQoLy93YWRsOnJlc291cmNlW0BwYXRoPSd7aWR9J10pIiwgZG9jdW1lbnQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBudW1iZXIgb2YgcmVzb3VyY2UgZWxlbWVudHMgd2l0aCAne2lkfScgcGF0aC4iLCAiMSIsIHZhbCk7CisgICAgICAgIHZhbCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKCJjb3VudCgvL3dhZGw6cmVzb3VyY2VbQHBhdGg9J3RyeS1oYXJkJ10pIiwgZG9jdW1lbnQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBudW1iZXIgb2YgcmVzb3VyY2UgZWxlbWVudHMgd2l0aCAndHJ5LWhhcmQnIHBhdGguIiwgIjEiLCB2YWwpOworICAgICAgICB2YWwgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZSgiY291bnQoLy93YWRsOnJlc291cmNlW0BwYXRoPSd2YWx1ZS97dmFsdWV9J10pIiwgZG9jdW1lbnQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBudW1iZXIgb2YgcmVzb3VyY2UgZWxlbWVudHMgd2l0aCAndmFsdWUve3ZhbHVlfScgcGF0aC4iLCAiMSIsIHZhbCk7CisKKyAgICAgICAgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoImNvdW50KC8vd2FkbDpyZXNvdXJjZVtAcGF0aD0ne2lkfSddL3dhZGw6bWV0aG9kKSIsIGRvY3VtZW50LCBYUGF0aENvbnN0YW50cy5TVFJJTkcpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIG1ldGhvZHMgaW4gcmVzb3VyY2UgZWxlbWVudCB3aXRoICd7aWR9JyBwYXRoLiIsICIyIiwgdmFsKTsKKyAgICAgICAgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoImNvdW50KC8vd2FkbDpyZXNvdXJjZVtAcGF0aD0ne2lkfSddL3dhZGw6bWV0aG9kW0BpZD0nZ2V0SXRlbSddIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiL3dhZGw6ZG9jW2NvbnRhaW5zKC4sICdUeXBpY2FsbHkgcmV0dXJucyB0aGUgaXRlbSBpZiBpdCBleGlzdHMuJyldKSIsCisgICAgICAgICAgICAgICAgZG9jdW1lbnQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBkb2N1bWVudGF0aW9uIG9mIGdldEl0ZW0gcmVzb3VyY2UgbWV0aG9kIGF0ICd7aWR9JyBwYXRoIiwgIjEiLCB2YWwpOworCisgICAgICAgIHZhbCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKCJjb3VudCgvL3dhZGw6cmVzb3VyY2VbQHBhdGg9J3RyeS1oYXJkJ10vd2FkbDptZXRob2QpIiwgZG9jdW1lbnQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBudW1iZXIgb2YgbWV0aG9kcyBpbiByZXNvdXJjZSBlbGVtZW50IHdpdGggJ3RyeS1oYXJkJyBwYXRoLiIsICIxIiwgdmFsKTsKKyAgICAgICAgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoImNvdW50KC8vd2FkbDpyZXNvdXJjZVtAcGF0aD0ndHJ5LWhhcmQnXS93YWRsOm1ldGhvZFtAaWQ9J2dldEl0ZW0nXSIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIi93YWRsOmRvY1tjb250YWlucyguLCAnVHJpZXMgaGFyZCB0byByZXR1cm4gdGhlIGl0ZW0gaWYgaXQgZXhpc3RzLicpXSkiLAorICAgICAgICAgICAgICAgIGRvY3VtZW50LCBYUGF0aENvbnN0YW50cy5TVFJJTkcpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgZG9jdW1lbnRhdGlvbiBvZiBnZXRJdGVtIHJlc291cmNlIG1ldGhvZCBhdCAndHJ5LWhhcmQnIHBhdGgiLCAiMSIsIHZhbCk7CisKKyAgICAgICAgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoImNvdW50KC8vd2FkbDpyZXNvdXJjZVtAcGF0aD0naXRlbXMnXS93YWRsOm1ldGhvZCkiLCBkb2N1bWVudCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG51bWJlciBvZiBtZXRob2RzIGluIHJlc291cmNlIGVsZW1lbnQgd2l0aCAnaXRlbXMnIHBhdGguIiwgIjQiLCB2YWwpOworICAgICAgICB2YWwgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZSgiY291bnQoLy93YWRsOnJlc291cmNlW0BwYXRoPSd2YWx1ZS97dmFsdWV9J10vd2FkbDptZXRob2QpIiwgZG9jdW1lbnQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBudW1iZXIgb2YgbWV0aG9kcyBpbiByZXNvdXJjZSBlbGVtZW50IHdpdGggJ3ZhbHVlL3t2YWx1ZX0nIHBhdGguIiwgIjEiLCB2YWwpOworCisgICAgICAgIHZhbCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKCJjb3VudCgvL3dhZGw6YXBwbGljYXRpb24vd2FkbDpkb2MpIiwgZG9jdW1lbnQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBudW1iZXIgb2YgZG9jIGVsZW1lbnRzIGluIGFwcGxpY2F0aW9uIGVsZW1lbnQuIiwgIjMiLCB2YWwpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2V4dGVuZGVkLXdhZGwtd2ViYXBwL3NyYy90ZXN0L3Jlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvZXh0ZW5kZWQtd2FkbC13ZWJhcHAvc3JjL3Rlc3QvcmVzb3VyY2VzL2xvZzRqLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFmZDllNQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2V4dGVuZGVkLXdhZGwtd2ViYXBwL3NyYy90ZXN0L3Jlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTQgQEAKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisjCisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyMKKworbG9nNGoucm9vdENhdGVnb3J5PURFQlVHLCBzdGRvdXQKK2xvZzRqLmFwcGVuZGVyLnN0ZG91dD1vcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlcgorbG9nNGouYXBwZW5kZXIuc3Rkb3V0LmxheW91dC5Db252ZXJzaW9uUGF0dGVybj1bJTMwLjMwY3sxfV0gLSAlbSVuCitsb2c0ai5hcHBlbmRlci5zdGRvdXQubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZnJlZW1hcmtlci13ZWJhcHAvUkVBRE1FLk1EIGIvZXhhbXBsZXMvZnJlZW1hcmtlci13ZWJhcHAvUkVBRE1FLk1ECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYmZhMmIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9mcmVlbWFya2VyLXdlYmFwcC9SRUFETUUuTUQKQEAgLTAsMCArMSw1MiBAQAorWy8vXTogIyAiIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAiCitbLy9dOiAjICIgIgorWy8vXTogIyAiIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAiCitbLy9dOiAjICIgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQgIgorWy8vXTogIyAiIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4gIgorWy8vXTogIyAiICIKK1svL106ICMgIiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlICIKKworRnJlZW1ha2VyIGV4YW1wbGUKKz09PT09PT09PT09PT09PT09CisKK1RoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIHVzZSBGcmVlbWFya2VyIHRlbXBsYXRpbmcgZW5naW5lIHRvCitwcm9kdWNlIHdlYiBwYWdlcyB2aWEgSmVyc2V5IHZpZXdhYmxlIHN1cHBvcnQuCisKK0NvbnRlbnRzCistLS0tLS0tLQorCitUaGUgbWFwcGluZyBvZiB0aGUgVVJJIHBhdGggc3BhY2UgaXMgcHJlc2VudGVkIGluIHRoZSBmb2xsb3dpbmcgdGFibGU6CisKK1VSSSBwYXRoICAgICAgICAgICAgICAgICAgICB8IFJlc291cmNlIGNsYXNzICAgICAgIHwgSFRUUCBtZXRob2RzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tCisqKl8vaGVsbG9fKiogICAgICAgICAgICAgICAgfCBGcmVlbWFya2VyUmVzb3VyY2UgICB8IEdFVAorKipfL2F1dG9UZW1wbGF0ZV8qKiAgICAgICAgIHwgRnJlZW1hcmtlclJlc291cmNlICAgfCBHRVQKKyoqXy9oZWxsb1dpdGhvdXRTdWZmaXhfKiogICB8IEZyZWVtYXJrZXJSZXNvdXJjZSAgIHwgR0VUCisKK1NlZSBGcmVlbWFya2VyUmVzb3VyY2UgZm9yIGRldGFpbHMgb24gaG93IHRvIHVzZSBqZXJzZXktZnJlZW1ha2VyLXdlYmFwcAorbW9kdWxlIGZvciBnZW5lcmF0aW5nIHdlYiBwYWdlcy4KKworSWYgeW91IHdhbnQgdG8gdXNlIGZyZWVtYXJrZXIgaW4geW91ciBwcm9qZWN0LCBkb24ndCBmb3JnZXQgdG8gc2V0CisqKiJqZXJzZXkuY29uZmlnLmZyZWVtYXJrZXIuVGVtcGxhdGVCYXNlUGF0aCIqKiBpbml0IHBhcmFtLCB3aGljaCB3aWxsCitiZSBwb2ludGluZyB0byBiYXNlIGRpcmVjdG9yeSB3aGVyZSB5b3VyIHRlbXBsYXRlcyBhcmUgc3RvcmVkCisoRnJlZW1hcmtlclRlc3QgY2xhc3MgZG9lcyB0aGF0KS4KKworUnVubmluZyB0aGUgRXhhbXBsZQorLS0tLS0tLS0tLS0tLS0tLS0tLQorCitSdW4gdGhlIHRlc3RzIG9mIHRoZSBleGFtcGxlIGFzIGZvbGxvd3M6CisKKz4gICAgIG12biBjbGVhbiB0ZXN0CisKK1RoaXMgZGVwbG95cyB0aGlzIGV4YW1wbGUgdXNpbmcgW0dyaXp6bHldKGh0dHA6Ly9ncml6emx5LmphdmEubmV0LykgYW5kCitleGVjdXRlcyB0aGUgSmVyc2V5IFRlc3QgRnJhbWV3b3JrIHVzaW5nIHRoZSB1bml0IHRlc3QgZnJhbWV3b3JrLgorCitZb3UgY2FuIHNlZSB0ZXN0IGNsYXNzZXMgYXQgYHNyYy9tYWluL3Rlc3RgIHN1YmRpcmVjdG9yeSBmb3IgZGV0YWlsZWQKK2luZm9ybWF0aW9uIGhvdyB0byBjb25zdW1lIHRoZSBzZXJ2aWNlIHVzaW5nIENsaWVudCBBUEkuCisKK1J1biB0aGUgZXhhbXBsZSBhcyBmb2xsb3dzOgorCis+ICAgICBtdm4gY2xlYW4gcGFja2FnZSBqZXR0eTpydW4KKworVGhpcyBkZXBsb3lzIGN1cnJlbnQgZXhhbXBsZSB1c2luZyBKZXR0eS4gWW91IGNhbiBhY2Nlc3MgdGhlIGFwcGxpY2F0aW9uCithdCA8aHR0cDovL2xvY2FsaG9zdDo4MDgwL2ZyZWVtYXJrZXItd2ViYXBwL2hlbGxvPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2ZyZWVtYXJrZXItd2ViYXBwL3BvbS54bWwgYi9leGFtcGxlcy9mcmVlbWFya2VyLXdlYmFwcC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YzZiMmIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9mcmVlbWFya2VyLXdlYmFwcC9wb20ueG1sCkBAIC0wLDAgKzEsNzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisKKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+d2ViYXBwLWV4YW1wbGUtcGFyZW50PC9hcnRpZmFjdElkPgorICAgICAgICA8cmVsYXRpdmVQYXRoPi4uL3dlYmFwcC1leGFtcGxlLXBhcmVudC9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5mcmVlbWFya2VyLXdlYmFwcDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS1leGFtcGxlcy1mcmVlbWFya2VyLXdlYmFwcDwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgRnJlZW1hcmtlciBleGFtcGxlLjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tdmMtZnJlZW1hcmtlcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1oazI8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8IS0tIFJ1biB0aGUgYXBwbGljYXRpb24gdXNpbmcgIm12biBqZXR0eTpydW4iIC0tPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qZXR0eS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnJlbGVhc2U8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD54bWwtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2ZyZWVtYXJrZXItd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZnJlZW1hcmtlci9NeUFwcGxpY2F0aW9uLmphdmEgYi9leGFtcGxlcy9mcmVlbWFya2VyLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2ZyZWVtYXJrZXIvTXlBcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMzE4Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9mcmVlbWFya2VyLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2ZyZWVtYXJrZXIvTXlBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZnJlZW1hcmtlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmZyZWVtYXJrZXIucmVzb3VyY2VzLkZyZWVtYXJrZXJSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLmZyZWVtYXJrZXIuRnJlZW1hcmtlck12Y0ZlYXR1cmU7CisKKy8qKgorICogRnJlZW1hcmtlciBhcHBsaWNhdGlvbiBjb25maWd1cmF0aW9uLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgTXlBcHBsaWNhdGlvbiBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKworICAgIHB1YmxpYyBNeUFwcGxpY2F0aW9uKCkgeworICAgICAgICBzdXBlcihGcmVlbWFya2VyUmVzb3VyY2UuY2xhc3MpOworCisgICAgICAgIHJlZ2lzdGVyKExvZ2dpbmdGZWF0dXJlLmNsYXNzKTsKKyAgICAgICAgcmVnaXN0ZXIoRnJlZW1hcmtlck12Y0ZlYXR1cmUuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2ZyZWVtYXJrZXItd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZnJlZW1hcmtlci9yZXNvdXJjZXMvRnJlZW1hcmtlclJlc291cmNlLmphdmEgYi9leGFtcGxlcy9mcmVlbWFya2VyLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2ZyZWVtYXJrZXIvcmVzb3VyY2VzL0ZyZWVtYXJrZXJSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYjcxZTMKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9mcmVlbWFya2VyLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2ZyZWVtYXJrZXIvcmVzb3VyY2VzL0ZyZWVtYXJrZXJSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZnJlZW1hcmtlci5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuVmlld2FibGU7CisKKy8qKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIi8iKQorcHVibGljIGNsYXNzIEZyZWVtYXJrZXJSZXNvdXJjZSB7CisKKyAgICBAR0VUCisgICAgQFBhdGgoImhlbGxvIikKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfSFRNTCkKKyAgICBwdWJsaWMgVmlld2FibGUgZ2V0SGVsbG8oKSB7CisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisgICAgICAgIG1hcC5wdXQoInVzZXIiLCAiUGF2ZWwiKTsKKyAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgbGlzdC5hZGQoIml0ZW0xIik7CisgICAgICAgIGxpc3QuYWRkKCJpdGVtMiIpOworICAgICAgICBsaXN0LmFkZCgiaXRlbTMiKTsKKyAgICAgICAgbWFwLnB1dCgiaXRlbXMiLCBsaXN0KTsKKworICAgICAgICByZXR1cm4gbmV3IFZpZXdhYmxlKCIvaGVsbG8uZnRsIiwgbWFwKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImhlbGxvLWRlZmF1bHQtbW9kZWwiKQorICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9IVE1MKQorICAgIHB1YmxpYyBWaWV3YWJsZSBnZXRIZWxsb1dpdGhEZWZhdWx0TW9kZWwoKSB7CisgICAgICAgIHJldHVybiBuZXcgVmlld2FibGUoIi9oZWxsby1kZWZhdWx0LW1vZGVsLmZ0bCIsICJQYXZlbCIpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiYXV0b1RlbXBsYXRlIikKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfSFRNTCkKKyAgICBwdWJsaWMgVmlld2FibGUgZ2V0QXV0b1RlbXBsYXRlKCkgeworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgICAgICBtYXAucHV0KCJ1c2VyIiwgIlBhdmVsIik7CisKKyAgICAgICAgLy8gdGVtcGxhdGUgbmFtZSBpcyBkZXJpdmVkIGZyb20gcmVzb3VyY2UgY2xhc3MgbmFtZQorICAgICAgICByZXR1cm4gbmV3IFZpZXdhYmxlKCIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZnJlZW1hcmtlci9yZXNvdXJjZXMvRnJlZW1hcmtlclJlc291cmNlLmZ0bCIsCisgICAgICAgICAgICAgICAgbWFwKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImhlbGxvV2l0aG91dFN1ZmZpeCIpCisgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX0hUTUwpCisgICAgcHVibGljIFZpZXdhYmxlIGdldEhlbGxvV2l0aG91dFN1ZmZpeCgpIHsKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICAgICAgbWFwLnB1dCgidXNlciIsICJQYXZlbCIpOworICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICBsaXN0LmFkZCgiaXRlbTEiKTsKKyAgICAgICAgbGlzdC5hZGQoIml0ZW0yIik7CisgICAgICAgIGxpc3QuYWRkKCJpdGVtMyIpOworICAgICAgICBtYXAucHV0KCJpdGVtcyIsIGxpc3QpOworCisgICAgICAgIHJldHVybiBuZXcgVmlld2FibGUoIi9oZWxsbyIsIG1hcCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZnJlZW1hcmtlci13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL2ZyZWVtYXJrZXIvaGVsbG8tZGVmYXVsdC1tb2RlbC5mdGwgYi9leGFtcGxlcy9mcmVlbWFya2VyLXdlYmFwcC9zcmMvbWFpbi9yZXNvdXJjZXMvZnJlZW1hcmtlci9oZWxsby1kZWZhdWx0LW1vZGVsLmZ0bApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTNjMjAzCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZnJlZW1hcmtlci13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL2ZyZWVtYXJrZXIvaGVsbG8tZGVmYXVsdC1tb2RlbC5mdGwKQEAgLTAsMCArMSwyMCBAQAorPCMtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+Cis8aHRtbD4KKyAgICA8aGVhZD4KKyAgICAgIDx0aXRsZT5XZWxjb21lITwvdGl0bGU+CisgICAgPC9oZWFkPgorCisgICAgPGJvZHk+CisgICAgICA8aDE+V2VsY29tZSAke21vZGVsfSE8L2gxPgorICAgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2ZyZWVtYXJrZXItd2ViYXBwL3NyYy9tYWluL3Jlc291cmNlcy9mcmVlbWFya2VyL2hlbGxvLmZ0bCBiL2V4YW1wbGVzL2ZyZWVtYXJrZXItd2ViYXBwL3NyYy9tYWluL3Jlc291cmNlcy9mcmVlbWFya2VyL2hlbGxvLmZ0bApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzdiZmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZnJlZW1hcmtlci13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL2ZyZWVtYXJrZXIvaGVsbG8uZnRsCkBAIC0wLDAgKzEsMjUgQEAKKzwjLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisKKy0tPgorPGh0bWw+CisgICAgPGhlYWQ+CisgICAgICA8dGl0bGU+V2VsY29tZSE8L3RpdGxlPgorICAgIDwvaGVhZD4KKworICAgIDxib2R5PgorICAgICAgPGgxPldlbGNvbWUgJHt1c2VyfSE8L2gxPgorICAgICAgPHA+aXRlbXM6PGJyIC8+CisgICAgICAgICAgICA8I2xpc3QgaXRlbXMgYXMgaXRlbT4KKyAgICAgICAgICAgICAgICAke2l0ZW19PGJyIC8+CisgICAgICAgICAgICA8LyNsaXN0PgorICAgICAgPC9wPgorICAgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2ZyZWVtYXJrZXItd2ViYXBwL3NyYy9tYWluL3Jlc291cmNlcy9mcmVlbWFya2VyL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2ZyZWVtYXJrZXIvcmVzb3VyY2VzL0ZyZWVtYXJrZXJSZXNvdXJjZS5mdGwgYi9leGFtcGxlcy9mcmVlbWFya2VyLXdlYmFwcC9zcmMvbWFpbi9yZXNvdXJjZXMvZnJlZW1hcmtlci9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9mcmVlbWFya2VyL3Jlc291cmNlcy9GcmVlbWFya2VyUmVzb3VyY2UuZnRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MWFkN2IKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9mcmVlbWFya2VyLXdlYmFwcC9zcmMvbWFpbi9yZXNvdXJjZXMvZnJlZW1hcmtlci9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9mcmVlbWFya2VyL3Jlc291cmNlcy9GcmVlbWFya2VyUmVzb3VyY2UuZnRsCkBAIC0wLDAgKzEsMjAgQEAKKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisKKy0tPgorPGh0bWw+CisgICAgPGhlYWQ+CisgICAgICA8dGl0bGU+V2VsY29tZSAtIGF1dG9tYXRpY2FsbHkgY2hvc2VuIHRlbXBsYXRlPC90aXRsZT4KKyAgICA8L2hlYWQ+CisKKyAgICA8Ym9keT4KKyAgICAgIDxoMT5XZWxjb21lICR7dXNlcn0hPC9oMT4KKyAgICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9mcmVlbWFya2VyLXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9nbGFzc2Zpc2gtd2ViLnhtbCBiL2V4YW1wbGVzL2ZyZWVtYXJrZXItd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2dsYXNzZmlzaC13ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NjVmY2IKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9mcmVlbWFya2VyLXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9nbGFzc2Zpc2gtd2ViLnhtbApAQCAtMCwwICsxLDI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzwhRE9DVFlQRSBnbGFzc2Zpc2gtd2ViLWFwcCBQVUJMSUMgIi0vL0dsYXNzRmlzaC5vcmcvL0RURCBHbGFzc0Zpc2ggQXBwbGljYXRpb24gU2VydmVyIDMuMSBTZXJ2bGV0IDMuMC8vRU4iICJodHRwOi8vZ2xhc3NmaXNoLm9yZy9kdGRzL2dsYXNzZmlzaC13ZWItYXBwXzNfMC0xLmR0ZCI+Cis8Z2xhc3NmaXNoLXdlYi1hcHAgZXJyb3ItdXJsPSIiPgorICAgIDxjb250ZXh0LXJvb3Q+L2ZyZWVtYXJrZXItd2ViYXBwPC9jb250ZXh0LXJvb3Q+CisgICAgPGNsYXNzLWxvYWRlciBkZWxlZ2F0ZT0idHJ1ZSIgLz4KKyAgICA8anNwLWNvbmZpZz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzZGVidWdpbmZvIiB2YWx1ZT0idHJ1ZSI+CisgICAgICAgICAgICA8ZGVzY3JpcHRpb24+RW5hYmxlIGRlYnVnIGluZm8gY29tcGlsYXRpb24gaW4gdGhlIGdlbmVyYXRlZCBzZXJ2bGV0IGNsYXNzPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImtlZXBnZW5lcmF0ZWQiIHZhbHVlPSJ0cnVlIj4KKyAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5LZWVwIGEgY29weSBvZiB0aGUgZ2VuZXJhdGVkIHNlcnZsZXQgY2xhc3MnIGphdmEgY29kZS48L2Rlc2NyaXB0aW9uPgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWFwcGVkZmlsZSIgdmFsdWU9InRydWUiPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPk1haW50YWluIGEgb25lLXRvLW9uZSBjb3JyZXNwb25kZW5jZSBiZXR3ZWVuIHN0YXRpYyBjb250ZW50IGFuZCB0aGUgZ2VuZXJhdGVkIHNlcnZsZXQgY2xhc3MnIGphdmEgY29kZTwvZGVzY3JpcHRpb24+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgPC9qc3AtY29uZmlnPgorPC9nbGFzc2Zpc2gtd2ViLWFwcD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2ZyZWVtYXJrZXItd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi9leGFtcGxlcy9mcmVlbWFya2VyLXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MGIxMWEKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9mcmVlbWFya2VyLXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi41IgorICAgICAgICB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgorICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIj4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmZyZWVtYXJrZXIuTXlBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZnJlZW1hcmtlci5NeUFwcGxpY2F0aW9uPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmplcnNleS5jb25maWcuc2VydmVyLm12Yy50ZW1wbGF0ZUJhc2VQYXRoLmZyZWVtYXJrZXI8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+ZnJlZW1hcmtlcjwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5mcmVlbWFya2VyLk15QXBwbGljYXRpb248L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZnJlZW1hcmtlci13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9mcmVlbWFya2VyL0ZyZWVtYXJrZXJUZXN0LmphdmEgYi9leGFtcGxlcy9mcmVlbWFya2VyLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2ZyZWVtYXJrZXIvRnJlZW1hcmtlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzAxNjU0Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZnJlZW1hcmtlci13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9mcmVlbWFya2VyL0ZyZWVtYXJrZXJUZXN0LmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5mcmVlbWFya2VyOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLmZyZWVtYXJrZXIuRnJlZW1hcmtlck12Y0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBGcmVlbWFya2VyVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKTsKKworICAgICAgICByZXR1cm4gbmV3IE15QXBwbGljYXRpb24oKS5wcm9wZXJ0eShGcmVlbWFya2VyTXZjRmVhdHVyZS5URU1QTEFURV9CQVNFX1BBVEgsICJmcmVlbWFya2VyIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFVSSSBnZXRCYXNlVXJpKCkgeworICAgICAgICByZXR1cm4gVXJpQnVpbGRlci5mcm9tVXJpKHN1cGVyLmdldEJhc2VVcmkoKSkucGF0aCgiZnJlZW1hcmtlci13ZWJhcHAiKS5idWlsZCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhlbGxvKCkgeworICAgICAgICBhc3NlcnRUcnVlKHRhcmdldCgpLnBhdGgoImhlbGxvIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpLmNvbnRhaW5zKCJQYXZlbCIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIZWxsb3dpdGhEZWZhdWx0TW9kZWwoKSB7CisgICAgICAgIGFzc2VydFRydWUodGFyZ2V0KCkucGF0aCgiaGVsbG8tZGVmYXVsdC1tb2RlbCIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKS5jb250YWlucygiUGF2ZWwiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0b1RlbXBsYXRlKCkgeworICAgICAgICBhc3NlcnRUcnVlKHRhcmdldCgpLnBhdGgoImF1dG9UZW1wbGF0ZSIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKS5jb250YWlucygiUGF2ZWwiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0b1RlbXBsYXRlV2l0aG91dFN1ZmZpeCgpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0YXJnZXQoKS5wYXRoKCJoZWxsb1dpdGhvdXRTdWZmaXgiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykuY29udGFpbnMoIlBhdmVsIikpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZ3Jvb3Z5L1JFQURNRS5NRCBiL2V4YW1wbGVzL2dyb292eS9SRUFETUUuTUQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhlNWMxNgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2dyb292eS9SRUFETUUuTUQKQEAgLTAsMCArMSw0MSBAQAorWy8vXTogIyAiIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAiCitbLy9dOiAjICIgIgorWy8vXTogIyAiIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAiCitbLy9dOiAjICIgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQgIgorWy8vXTogIyAiIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4gIgorWy8vXTogIyAiICIKK1svL106ICMgIiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlICIKKworR3Jvb3Z5IEV4YW1wbGUKKz09PT09PT09PT09PT09CisKK1RoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIGRldmVsb3AgUkVTVGZ1bCBoZWxsbyB3b3JsZCB3ZWIgc2VydmljZQordXNpbmcgR3Jvb3Z5IGFuZCB0aGUgZW1iZWRkZWQgR3JpenpseSBzZXJ2ZXIuCisKK0NvbnRlbnRzCistLS0tLS0tLQorCitUaGUgZXhhbXBsZSBjb25zaXN0cyBvZiBqdXN0IG9uZSBKZXJzZXkgcmVzb3VyY2U6CisKK2BvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5ncm9vdnkuR3Jvb3Z5UmVzb3VyY2VgCisKK2hhdCBwcm9kdWNlcyBhIHRleHR1YWwgcmVzcG9uc2UgdG8gYW4gSFRUUCBHRVQuCisKK1RoZSBtYXBwaW5nIG9mIHRoZSBVUkkgcGF0aCBzcGFjZSBpcyBwcmVzZW50ZWQgaW4gdGhlIGZvbGxvd2luZyB0YWJsZToKKworVVJJIHBhdGggICAgICB8IFJlc291cmNlIGNsYXNzICAgfCBIVFRQIG1ldGhvZHMKKy0tLS0tLS0tLS0tICAgfCAtLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0KKyoqXy9ncm9vdnlfKiogfCBHcm9vdnlSZXNvdXJjZSAgfCBHRVQKKworUnVubmluZyB0aGUgRXhhbXBsZQorLS0tLS0tLS0tLS0tLS0tLS0tLQorCitSdW4gdGhlIGV4YW1wbGUgYXMgZm9sbG93czoKKworPiAgICAgbXZuIGNsZWFuIGNvbXBpbGUgZXhlYzpqYXZhCisKK1RoaXMgZGVwbG95cyB0aGUgZXhhbXBsZSB1c2luZyBbR3JpenpseV0oaHR0cDovL2dyaXp6bHkuamF2YS5uZXQvKSBjb250YWluZXIuCisKK0Zyb20gYSB3ZWIgYnJvd3NlciwgdmlzaXQ6CisKKy0gICA8aHR0cDovL2xvY2FsaG9zdDo5OTk4L2dyb292eT4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2dyb292eS9wb20ueG1sIGIvZXhhbXBsZXMvZ3Jvb3Z5L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNlODA4OAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2dyb292eS9wb20ueG1sCkBAIC0wLDAgKzEsMTQ1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorICAgIDxhcnRpZmFjdElkPmdyb292eTwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS1leGFtcGxlcy1ncm9vdnk8L25hbWU+CisgICAgPGRlc2NyaXB0aW9uPkdyb292eSBKZXJzZXk8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMuZ3Jvb3Z5PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z3Jvb3Z5LWFsbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjIuNC4zPC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLWdyaXp6bHkyLWh0dHA8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktaGsyPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnJlbGVhc2U8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmV4ZWMtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8bWFpbkNsYXNzPmdyb292eS51aS5Hcm9vdnlNYWluPC9tYWluQ2xhc3M+CisgICAgICAgICAgICAgICAgICAgIDxhcmd1bWVudHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJndW1lbnQ+JHtwb20uYmFzZWRpcn0vc3JjL21haW4vc2NyaXB0L05ld0dyb292eVNjcmlwdC5ncm9vdnk8L2FyZ3VtZW50PgorICAgICAgICAgICAgICAgICAgICA8L2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKworICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMuZ21hdmVucGx1czwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5nbWF2ZW5wbHVzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjY8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+MTwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+Z2VuZXJhdGUtcmVzb3VyY2VzPC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hZGRTb3VyY2VzPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmFkZFRlc3RTb3VyY2VzPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmdlbmVyYXRlU3R1YnM8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Y29tcGlsZTwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5nZW5lcmF0ZVRlc3RTdHViczwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jb21waWxlVGVzdHM8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cmVtb3ZlU3R1YnM8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cmVtb3ZlVGVzdFN0dWJzPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmdyb292eWRvYzwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorCisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hbnRydW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlkPjI8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPmdlbmVyYXRlLXJlc291cmNlczwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amFyIGRlc3RmaWxlPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8ke3Byb2plY3QuYXJ0aWZhY3RJZH0tamF2YWRvYy5qYXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHppcGZpbGVzZXQgZGlyPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9nYXBpZG9jcyIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9qYXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90YXJnZXQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJ1aWxkLWhlbHBlci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+My4wLjA8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+MzwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+Z2VuZXJhdGUtcmVzb3VyY2VzPC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5hdHRhY2gtYXJ0aWZhY3Q8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGU+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vJHtwcm9qZWN0LmFydGlmYWN0SWR9LWphdmFkb2MuamFyPC9maWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHR5cGU+amFyPC90eXBlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+amF2YWRvYzwvY2xhc3NpZmllcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hcnRpZmFjdD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2FydGlmYWN0cz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9ncm9vdnkvR3Jvb3Z5UmVzb3VyY2UuZ3Jvb3Z5IGIvZXhhbXBsZXMvZ3Jvb3Z5L3NyYy9tYWluL2dyb292eS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9ncm9vdnkvR3Jvb3Z5UmVzb3VyY2UuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNjdlMTUKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9ncm9vdnkvc3JjL21haW4vZ3Jvb3Z5L29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2dyb292eS9Hcm9vdnlSZXNvdXJjZS5ncm9vdnkKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5ncm9vdnkKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCisvKioKKyAqIEV4YW1wbGUgR3Jvb3Z5IEpBWC1SUyByZXNvdXJjZS4KKyAqLworQFBhdGgoImdyb292eSIpCitjbGFzcyBHcm9vdnlSZXNvdXJjZSB7CisgICAgQFByb2R1Y2VzKFsidGV4dC9wbGFpbiJdKSBAR0VUIGRlZiBzaG93KCkgeworICAgICAgICAiZ3Jvb3Z5IgorICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2dyb292eS9zcmMvbWFpbi9zY3JpcHQvTmV3R3Jvb3Z5U2NyaXB0Lmdyb292eSBiL2V4YW1wbGVzL2dyb292eS9zcmMvbWFpbi9zY3JpcHQvTmV3R3Jvb3Z5U2NyaXB0Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2FhZTUyCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvZ3Jvb3Z5L3NyYy9tYWluL3NjcmlwdC9OZXdHcm9vdnlTY3JpcHQuZ3Jvb3Z5CkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZ3Jvb3Z5CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5Mi5odHRwc2VydmVyLkdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeQoraW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyCisKKy8qCisgKiBHcm9vdnkgc2NyaXB0IHRvIHN0YXJ0IHRoZSBleGFtcGxlIGFwcAorICovCitiYXNlVXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0LyIpLnBvcnQoOTk5OCkuYnVpbGQoKQorc2VydmVyID0gR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5LmNyZWF0ZUh0dHBTZXJ2ZXIoYmFzZVVyaSwgbmV3IFJlc291cmNlQ29uZmlnKEdyb292eVJlc291cmNlLmNsYXNzKSkKKworU3lzdGVtLm91dC5wcmludGxuKFN0cmluZy5mb3JtYXQoIkplcnNleSBhcHAgc3RhcnRlZCB3aXRoIFdBREwgYXZhaWxhYmxlIGF0ICIgKyAiJXNhcHBsaWNhdGlvbi53YWRsXG4iCisgICAgICAgICsgIlRyeSBvdXQgJXNncm9vdnlcbkhpdCAgZW50ZXIgdG8gc3RvcCBpdC4uLiIsIGJhc2VVcmksIGJhc2VVcmkpKTsKKworU3lzdGVtLmluLnJlYWQoKQorc2VydmVyLnNodXRkb3duKCkKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2dyb292eS9zcmMvdGVzdC9ncm9vdnkvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvZ3Jvb3Z5L0dyb292eVJlc291cmNlVGVzdC5ncm9vdnkgYi9leGFtcGxlcy9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2dyb292eS9Hcm9vdnlSZXNvdXJjZVRlc3QuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZGI0ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9ncm9vdnkvc3JjL3Rlc3QvZ3Jvb3Z5L29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2dyb292eS9Hcm9vdnlSZXNvdXJjZVRlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuZ3Jvb3Z5CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWcKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3QKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzCitpbXBvcnQgb3JnLmp1bml0LlRlc3QKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2UKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHMKKworLyoqCisgKiBUZXN0IHRoZSBhdmFpbGFiaWxpdHkgb2YgdGhlIHtAbGluayBHcm9vdnlSZXNvdXJjZX0uCisgKi8KK2NsYXNzIEdyb292eVJlc291cmNlVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhHcm9vdnlSZXNvdXJjZS5jbGFzcykKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHcm9vdnlSZXNvdXJjZSgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImdyb292eSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJncm9vdnkiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2hlbGxvd29ybGQtYmVuY2htYXJrL1JFQURNRS5NRCBiL2V4YW1wbGVzL2hlbGxvd29ybGQtYmVuY2htYXJrL1JFQURNRS5NRApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWEzMGNhCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvaGVsbG93b3JsZC1iZW5jaG1hcmsvUkVBRE1FLk1ECkBAIC0wLDAgKzEsODUgQEAKK1svL106ICMgIiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIgorWy8vXTogIyAiICIKK1svL106ICMgIiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgIgorWy8vXTogIyAiIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0ICIKK1svL106ICMgIiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuICIKK1svL106ICMgIiAiCitbLy9dOiAjICIgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZSAiCisKK0hlbGxvIFdvcmxkIEpNSCBFeGFtcGxlCis9PT09PT09PT09PT09PT09PT09PT09PQorCisjIyMgKkhvdyB0byB3cml0ZSBKQVgtUlMgTWljcm8tQmVuY2htYXJrcyoKKworVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gd3JpdGUgc2ltcGxlIG1pY3JvLWJlbmNobWFya3MsIGJhc2VkIG9uCitKTUgsIGZvciBKQVgtUlMgYXBwbGljYXRpb24uIFRoaXMgcGFydGljdWxhciBleGFtcGxlIHNob3dzIGhvdyB0byBvYnRhaW4KK3Rocm91Z2hwdXQgb2YgYSBzaW1wbGUgJ0hlbGxvIFdvcmxkJyBhcHBsaWNhdGlvbi4KKworVGhlIGFwcGxpY2F0aW9uIGNvbnNpc3RzIG9mIG9uZSByZXNvdXJjZSwgYEhlbGxvV29ybGRSZXNvdXJjZWAgd2l0aAordGhyZWUgcmVzb3VyY2UgbWV0aG9kcyAob25lIG1ldGhvZCBwZXIgSFRUUCBHRVQsIFBPU1QgYW5kIFBVVCBtZXRob2RzKS4KK1RvIG1ha2UgaXQgbW9yZSBpbnRlcmVzdGluZyB0aGUgcmVzb3VyY2UgYWxzbyBhY3RzIGxpa2Ugc3ViLXJlc291cmNlCitsb2NhdG9yIHdoaWNoIGFsbG93cyB1cyB0byBtZWFzdXJlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gcHJvY2Vzc2luZyBvZgorbm9ybWFsIHJlc291cmNlIG1ldGhvZHMgYW5kIHN1Yi1yZXNvdXJjZSBsb2NhdG9ycy4KKworVGhpcyBhcHBsaWNhdGlvbiBpcyBzb2xlbHkgZm9jdXNlZCBvbiBzaG93aW5nIGhvdyB0byB3cml0ZSBiZW5jaG1hcmtzCithbmQgaXQgZG9lc24ndCBzdGFydCBhbnkgc2VydmVyIHRoYXQgd291bGQgYWxsb3cgb25lIHRvIHNlbmQgcmVxdWVzdCB0bwordGhlIGBIZWxsb1dvcmxkUmVzb3VyY2VgLgorCitNYWluIGNsYXNzIHRoYXQgaWxsdXN0cmF0ZXMgd3JpdGluZyBiZW5jaG1hcmtzIGZvciBKQVgtUlMgYXBwbGljYXRpb25zCitpcyBgSGVsbG9Xb3JsZEJlbmNobWFya2AuIE1lYXN1cmVtZW50cyBhcmUgbm90IGJhc2VkIG9uIGFueSBjb250YWluZXIKK3N1Y2ggYXMgU2VydmxldCBvciBHcml6emx5IGNvbnRhaW5lci4gUmVxdWVzdHMgYXJlIGRpcmVjdGx5IGludm9rZWQgb24KK2BBcHBsaWNhdGlvbkhhbmRsZXJgIGNsYXNzIGZyb20gSmVyc2V5IFNlcnZlciBtb2R1bGUgdG8gZWxpbWluYXRlIGFueQorbmV0d29yayBpbmZsdWVuY2VzLiBTdGlsbCwgYWxsIEpBWC1SUyBmZWF0dXJlcywgbGlrZSBmaWx0ZXJzIGFuZAoraW50ZXJjZXB0b3JzLCBhcmUgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uIHdoZW4gdGhlIGJlbmNobWFyayBpcworZXhlY3V0ZWQuCisKK0l0J3MgYWxzbyBwb3NzaWJsZSB0byBydW4gdGhlIGJlbmNobWFyayBvbiBvbGRlciB2ZXJzaW9ucyBvZiBKZXJzZXksCitlLmcuIDIuMTUsIHdoaWNoIGhhZCBrbm93biBwZXJmb3JtYW5jZSBpc3N1ZXMgd2l0aCBzdWItcmVzb3VyY2UKK2xvY2F0b3JzLiBUaGUgcmVjb21tZW5kZWQgYXBwcm9hY2ggaXMgdG8gcnVuIHRoZSBiZW5jaG1hcmtzIHdpdGhvdXQgYW55CitjaGFuZ2VzIGF0IGZpcnN0IGFuZCB0aGVuIG1vZGlmeSB0aGUgYHBvbS54bWxgIHRvIHN3aXRjaCB2ZXJzaW9uIG9mCitKZXJzZXkgdG8gMi4xNSBhbmQgcnVuIHRoZSBiZW5jaG1hcmtzIGFnYWluIHRvIHNlZSB0aGUgKGJpZykgZGlmZmVyZW5jZS4KK0xvb2sgZm9yIGBqZXJzZXktYm9tYCBhcnRpZmFjdCBpbiBgcG9tLnhtbGAgdG8gc2VlIGhvdyB0aGUgc3dpdGNoIHNob3VsZAorYmUgZG9uZS4KKworU2FtcGxlIFJlc3VsdHMKKy0tLS0tLS0tLS0tLS0tCisKK1RoZSBleGVjdXRpb24gdGFrZXMgYXJvdW5kIDIgbWludXRlcyBhbmQgeW91IGNhbiBzZWUgcGFydGlhbCByZXN1bHRzCisoZm9yIGVhY2ggY29tYmluYXRpb24gb2YgcGFyYW1ldGVycykgb2YgZXZlcnkgaXRlcmF0aW9uLiBBdCB0aGUgZW5kIEpNSAorZ2l2ZXMgeW91IHdob2xlIHN1bW1hcnkuIEZvciBleGFtcGxlLCBKZXJzZXkgMi4xNiBnaXZlcyB0aGUgZm9sbG93aW5nCityZXN1bHRzOgorCisgICAgIyBSdW4gY29tcGxldGUuIFRvdGFsIHRpbWU6IDAwOjAxOjQxCisKKyAgICBCZW5jaG1hcmsgICAgICAgICAgICAgICAgICAgIChtZXRob2QpICAgICAgICAgICAgICAocGF0aCkgICBNb2RlICBDbnQgICAgICBTY29yZSAgICAgIEVycm9yICBVbml0cworICAgIEhlbGxvV29ybGRCZW5jaG1hcmsubWVhc3VyZSAgICAgICBHRVQgICAgICAgICAgaGVsbG93b3JsZCAgdGhycHQgICAgOCAgNzQzNDMuODY0IMKxIDQ4MTQuOTc5ICBvcHMvcworICAgIEhlbGxvV29ybGRCZW5jaG1hcmsubWVhc3VyZSAgICAgICBHRVQgIGhlbGxvd29ybGQvbG9jYXRvciAgdGhycHQgICAgOCAgNTQxMzcuMTAyIMKxIDg5OTYuNzY2ICBvcHMvcworICAgIEhlbGxvV29ybGRCZW5jaG1hcmsubWVhc3VyZSAgICAgIFBPU1QgICAgICAgICAgaGVsbG93b3JsZCAgdGhycHQgICAgOCAgNDUxNzMuODUzIMKxIDUzNDkuMzYzICBvcHMvcworICAgIEhlbGxvV29ybGRCZW5jaG1hcmsubWVhc3VyZSAgICAgIFBPU1QgIGhlbGxvd29ybGQvbG9jYXRvciAgdGhycHQgICAgOCAgMzcxNDQuNzk3IMKxIDQ2OTkuNzgyICBvcHMvcworICAgIEhlbGxvV29ybGRCZW5jaG1hcmsubWVhc3VyZSAgICAgICBQVVQgICAgICAgICAgaGVsbG93b3JsZCAgdGhycHQgICAgOCAgNDU5NDUuOTc0IMKxIDQxMTYuNzUyICBvcHMvcworICAgIEhlbGxvV29ybGRCZW5jaG1hcmsubWVhc3VyZSAgICAgICBQVVQgIGhlbGxvd29ybGQvbG9jYXRvciAgdGhycHQgICAgOCAgMzYzNDUuNjY3IMKxIDU5MjkuNDgwICBvcHMvcworCitSdW5uaW5nIHRoZSBFeGFtcGxlCistLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZXJlIGFyZSB0d28gd2F5cyBob3cgdG8gcnVuIHRoZSBtaWNyby1iZW5jaG1hcmsuIEVpdGhlciB2aWEgTWF2ZW4KK2BleGVjOmV4ZWNgCisKKz4gICAgIG12biBjbGVhbiBpbnN0YWxsIGV4ZWM6ZXhlYworCitvciB5b3UgY2FuIGJ1aWxkIHRoZSBiZW5jaG1hcmsgSkFSIGF0IGZpcnN0CisKKz4gICAgIG12biBjbGVhbiBpbnN0YWxsCisKK2FuZCB0aGVuIGludm9raW5nIGl0IHVzaW5nIGBqYXZhYCBjb21tYW5kCisKKz4gICAgIGphdmEgLWphciB0YXJnZXQvYmVuY2htYXJrLmphcgorCitSZXNvdXJjZXMKKy0tLS0tLS0tLQorCitKTUggaGFzIGV4Y2VsbGVudCBvdmVydmlldyBvZiBpdCdzIGZlYXR1cmVzIHByZXNlbnRlZCBhcyBsaXN0IG9mCitkaWZmZXJlbnQgc2FtcGxlcy4gWW91IGNhbiBmaW5kIHRoZW0gb24gW0pNSAorU2FtcGxlc10oaHR0cDovL2hnLm9wZW5qZGsuamF2YS5uZXQvY29kZS10b29scy9qbWgvZmlsZS90aXAvam1oLXNhbXBsZXMvc3JjL21haW4vamF2YS9vcmcvb3Blbmpkay9qbWgvc2FtcGxlcy8pLgorVGhlIGdlbmVyYWwgb3ZlcnZpZXcgb2YgSk1IIGlzIGF2YWlsYWJsZSBhdCB0aGVpciBbaG9tZQorcGFnZV0oaHR0cDovL29wZW5qZGsuamF2YS5uZXQvcHJvamVjdHMvY29kZS10b29scy9qbWgvKS4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2hlbGxvd29ybGQtYmVuY2htYXJrL3BvbS54bWwgYi9leGFtcGxlcy9oZWxsb3dvcmxkLWJlbmNobWFyay9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjZTdjNGMKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9oZWxsb3dvcmxkLWJlbmNobWFyay9wb20ueG1sCkBAIC0wLDAgKzEsMTUwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+aGVsbG93b3JsZC1iZW5jaG1hcms8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktZXhhbXBsZXMtaGVsbG93b3JsZC1iZW5jaG1hcms8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+SmVyc2V5ICJIZWxsbyBXb3JsZCIgYmVuY2htYXJrIGV4YW1wbGUuPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmN5TWFuYWdlbWVudD4KKyAgICAgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1ib208L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHR5cGU+cG9tPC90eXBlPgorICAgICAgICAgICAgICAgIDxzY29wZT5pbXBvcnQ8L3Njb3BlPgorCisgICAgICAgICAgICAgICAgPCEtLSBDb21tZW50IHRoaXMgbGluZSB0byB1c2UgSmVyc2V5IDIuMTUuIFVuLWNvbW1lbnQgdG8gdXNlIHRoZSBjdXJyZW50IHZlcnNpb24uIC0tPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8IS0tIENvbW1lbnQgdGhpcyBsaW5lIHRvIHVzZSB0aGUgY3VycmVudCB2ZXJzaW9uLiBVbi1jb21tZW50IHRvIHVzZSBKZXJzZXkgMi4xNS4gLS0+CisgICAgICAgICAgICAgICAgPCEtLTx2ZXJzaW9uPjIuMTU8L3ZlcnNpb24+LS0+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDwvZGVwZW5kZW5jaWVzPgorICAgIDwvZGVwZW5kZW5jeU1hbmFnZW1lbnQ+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktc2VydmVyPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWhrMjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5vcGVuamRrLmptaDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmptaC1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm9wZW5qZGsuam1oPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+am1oLWdlbmVyYXRvci1hbm5wcm9jZXNzPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcms8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstdXRpbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhlYy1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRhYmxlPmphdmE8L2V4ZWN1dGFibGU+CisgICAgICAgICAgICAgICAgICAgIDxhcmd1bWVudHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJndW1lbnQ+LWNsYXNzcGF0aDwvYXJndW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJndW1lbnQ+b3JnLm9wZW5qZGsuam1oLk1haW48L2FyZ3VtZW50PgorICAgICAgICAgICAgICAgICAgICA8L2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNoYWRlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPG1pbmltaXplSmFyPmZhbHNlPC9taW5pbWl6ZUphcj4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+c2hhZGUtYXJjaGl2ZTwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+c2hhZGU8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbmFsTmFtZT4ke3ViZXJqYXIubmFtZX08L2ZpbmFsTmFtZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHJhbnNmb3JtZXJzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHJhbnNmb3JtZXIgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucy5zaGFkZS5yZXNvdXJjZS5NYW5pZmVzdFJlc291cmNlVHJhbnNmb3JtZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1haW5DbGFzcz5vcmcub3Blbmpkay5qbWguTWFpbjwvbWFpbkNsYXNzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyYW5zZm9ybWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHJhbnNmb3JtZXJzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXJzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsdGVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNoYWRpbmcgc2lnbmVkIEpBUnMgd2lsbCBmYWlsIHdpdGhvdXQgdGhpcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzk5OTQ4OS9pbnZhbGlkLXNpZ25hdHVyZS1maWxlLXdoZW4tYXR0ZW1wdGluZy10by1ydW4tYS1qYXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0Pio6KjwvYXJ0aWZhY3Q+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+TUVUQS1JTkYvKi5TRjwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5NRVRBLUlORi8qLkRTQTwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5NRVRBLUlORi8qLlJTQTwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsdGVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsdGVycz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5yZWxlYXNlPC9pZD4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPHViZXJqYXIubmFtZT5iZW5jaG1hcms8L3ViZXJqYXIubmFtZT4KKyAgICA8L3Byb3BlcnRpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9oZWxsb3dvcmxkLWJlbmNobWFyay9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvQXBwbGljYXRpb24uamF2YSBiL2V4YW1wbGVzL2hlbGxvd29ybGQtYmVuY2htYXJrL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9BcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MmIzM2QKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9oZWxsb3dvcmxkLWJlbmNobWFyay9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvQXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmhlbGxvd29ybGQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXM7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbiBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKworICAgIHB1YmxpYyBBcHBsaWNhdGlvbigpIHsKKyAgICAgICAgcmVnaXN0ZXIoSGVsbG9Xb3JsZFJlc291cmNlLmNsYXNzKTsKKworICAgICAgICAvLyBUdXJuIG9mZiBNb25pdG9yaW5nIHRvIG5vdCBhZmZlY3QgYmVuY2htYXJrcy4KKyAgICAgICAgcHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5NT05JVE9SSU5HX0VOQUJMRUQsIGZhbHNlKTsKKyAgICAgICAgcHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5NT05JVE9SSU5HX1NUQVRJU1RJQ1NfRU5BQkxFRCwgZmFsc2UpOworICAgICAgICBwcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLk1PTklUT1JJTkdfU1RBVElTVElDU19NQkVBTlNfRU5BQkxFRCwgZmFsc2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2hlbGxvd29ybGQtYmVuY2htYXJrL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9IZWxsb1dvcmxkQmVuY2htYXJrLmphdmEgYi9leGFtcGxlcy9oZWxsb3dvcmxkLWJlbmNobWFyay9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvSGVsbG9Xb3JsZEJlbmNobWFyay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YzYzNjUKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9oZWxsb3dvcmxkLWJlbmNobWFyay9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvSGVsbG9Xb3JsZEJlbmNobWFyay5qYXZhCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuaGVsbG93b3JsZDsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QudXRpbC5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdEJ1aWxkZXI7CisKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuQmVuY2htYXJrOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5CZW5jaG1hcmtNb2RlOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5Gb3JrOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5MZXZlbDsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuTWVhc3VyZW1lbnQ7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLk1vZGU7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLk91dHB1dFRpbWVVbml0OworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5QYXJhbTsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuU2NvcGU7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLlNldHVwOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5TdGF0ZTsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuVGVhckRvd247CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLldhcm11cDsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWgucnVubmVyLlJ1bm5lcjsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWgucnVubmVyLm9wdGlvbnMuT3B0aW9uczsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWgucnVubmVyLm9wdGlvbnMuT3B0aW9uc0J1aWxkZXI7CisKKy8qKgorICogIkhlbGxvIHdvcmxkISIgSmVyc2V5IHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyfSBiZW5jaG1hcmsuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BCZW5jaG1hcmtNb2RlKE1vZGUuVGhyb3VnaHB1dCkKK0BPdXRwdXRUaW1lVW5pdChUaW1lVW5pdC5TRUNPTkRTKQorQFdhcm11cChpdGVyYXRpb25zID0gOCwgdGltZSA9IDEsIHRpbWVVbml0ID0gVGltZVVuaXQuU0VDT05EUykKK0BNZWFzdXJlbWVudChpdGVyYXRpb25zID0gOCwgdGltZSA9IDEsIHRpbWVVbml0ID0gVGltZVVuaXQuU0VDT05EUykKK0BGb3JrKDEpCitAU3RhdGUoU2NvcGUuQmVuY2htYXJrKQorcHVibGljIGNsYXNzIEhlbGxvV29ybGRCZW5jaG1hcmsgeworCisgICAgQFBhcmFtKHZhbHVlID0geyJoZWxsb3dvcmxkIiwgImhlbGxvd29ybGQvbG9jYXRvciJ9KQorICAgIHByaXZhdGUgU3RyaW5nIHBhdGg7CisKKyAgICBAUGFyYW0odmFsdWUgPSB7IkdFVCIsICJQT1NUIiwgIlBVVCJ9KQorICAgIHByaXZhdGUgU3RyaW5nIG1ldGhvZDsKKworICAgIHByaXZhdGUgdm9sYXRpbGUgQXBwbGljYXRpb25IYW5kbGVyIGhhbmRsZXI7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBDb250YWluZXJSZXF1ZXN0IHJlcXVlc3Q7CisKKyAgICBAU2V0dXAKKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBoYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihuZXcgQXBwbGljYXRpb24oKSk7CisgICAgfQorCisgICAgQFNldHVwKExldmVsLkl0ZXJhdGlvbikKKyAgICBwdWJsaWMgdm9pZCByZXF1ZXN0KCkgeworICAgICAgICByZXF1ZXN0ID0gQ29udGFpbmVyUmVxdWVzdEJ1aWxkZXIKKyAgICAgICAgICAgICAgICAuZnJvbShwYXRoLCBtZXRob2QpCisgICAgICAgICAgICAgICAgLmVudGl0eSgiR0VUIi5lcXVhbHMobWV0aG9kKSA/IG51bGwgOiBIZWxsb1dvcmxkUmVzb3VyY2UuQ0xJQ0hFRF9NRVNTQUdFLCBoYW5kbGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgIH0KKworICAgIEBUZWFyRG93bgorICAgIHB1YmxpYyB2b2lkIHNodXRkb3duKCkgeworICAgIH0KKworICAgIEBCZW5jaG1hcmsKKyAgICBwdWJsaWMgRnV0dXJlPENvbnRhaW5lclJlc3BvbnNlPiBtZWFzdXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBoYW5kbGVyLmFwcGx5KHJlcXVlc3QpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGZpbmFsIFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBPcHRpb25zIG9wdCA9IG5ldyBPcHRpb25zQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLy8gUmVnaXN0ZXIgb3VyIGJlbmNobWFya3MuCisgICAgICAgICAgICAgICAgLmluY2x1ZGUoSGVsbG9Xb3JsZEJlbmNobWFyay5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAgICAgbmV3IFJ1bm5lcihvcHQpLnJ1bigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2hlbGxvd29ybGQtYmVuY2htYXJrL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9IZWxsb1dvcmxkUmVzb3VyY2UuamF2YSBiL2V4YW1wbGVzL2hlbGxvd29ybGQtYmVuY2htYXJrL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9IZWxsb1dvcmxkUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTdhNTNkCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvaGVsbG93b3JsZC1iZW5jaG1hcmsvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL0hlbGxvV29ybGRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuaGVsbG93b3JsZDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBVVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCisvKioKKyAqIFNpbXBsZSAiSGVsbG8gV29ybGQiIHJlc291cmNlIHdpdGggdGhyZWUgcmVzb3VyY2UgbWV0aG9kcyBhbmQgYSBzdWItcmVzb3VyY2UgbG9jYXRvciAodGhhdCBwb2ludHMgYWdhaW4gdG8gdGhpcyBjbGFzcyBpdHNlbGYpLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUGF0aCgiaGVsbG93b3JsZCIpCitAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorcHVibGljIGNsYXNzIEhlbGxvV29ybGRSZXNvdXJjZSB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTElDSEVEX01FU1NBR0UgPSAiSGVsbG8gV29ybGQhIjsKKworICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgcmV0dXJuIENMSUNIRURfTUVTU0FHRTsKKyAgICB9CisKKyAgICBAUE9TVAorICAgIHB1YmxpYyBTdHJpbmcgcG9zdChmaW5hbCBTdHJpbmcgZW50aXR5KSB7CisgICAgICAgIHJldHVybiBlbnRpdHk7CisgICAgfQorCisgICAgQFBVVAorICAgIHB1YmxpYyB2b2lkIHB1dChmaW5hbCBTdHJpbmcgZW50aXR5KSB7CisgICAgICAgIC8vIE5PT1AKKyAgICB9CisKKyAgICBAUGF0aCgibG9jYXRvciIpCisgICAgcHVibGljIENsYXNzPD8+IHN1YigpIHsKKyAgICAgICAgcmV0dXJuIEhlbGxvV29ybGRSZXNvdXJjZS5jbGFzczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9oZWxsb3dvcmxkLWJlbmNobWFyay9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvSGVsbG9Xb3JsZFRlc3QuamF2YSBiL2V4YW1wbGVzL2hlbGxvd29ybGQtYmVuY2htYXJrL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9IZWxsb1dvcmxkVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlN2MwNDYKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9oZWxsb3dvcmxkLWJlbmNobWFyay9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvSGVsbG9Xb3JsZFRlc3QuamF2YQpAQCAtMCwwICsxLDkxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmhlbGxvd29ybGQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5oZWxsb3dvcmxkLkhlbGxvV29ybGRSZXNvdXJjZX0gdGVzdHMuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEhlbGxvV29ybGRSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoImhlbGxvd29ybGQiKS5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdCgiV3JvbmcgSFRUUCByZXNwb25zZSBjb2RlIHJldHVybmVkLiIsIHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgiVW5leHBlY3RlZCByZXNwb25zZSBlbnRpdHkuIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBpcyhIZWxsb1dvcmxkUmVzb3VyY2UuQ0xJQ0hFRF9NRVNTQUdFKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TG9jYXRvcigpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJoZWxsb3dvcmxkIikucGF0aCgibG9jYXRvciIpLnJlcXVlc3QoInRleHQvcGxhaW4iKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRUaGF0KCJXcm9uZyBIVFRQIHJlc3BvbnNlIGNvZGUgcmV0dXJuZWQuIiwgcmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KCJVbmV4cGVjdGVkIHJlc3BvbnNlIGVudGl0eS4iLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGlzKEhlbGxvV29ybGRSZXNvdXJjZS5DTElDSEVEX01FU1NBR0UpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0KCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoImhlbGxvd29ybGQiKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkudGV4dChIZWxsb1dvcmxkUmVzb3VyY2UuQ0xJQ0hFRF9NRVNTQUdFKSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdCgiV3JvbmcgSFRUUCByZXNwb25zZSBjb2RlIHJldHVybmVkLiIsIHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgiVW5leHBlY3RlZCByZXNwb25zZSBlbnRpdHkuIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBpcyhIZWxsb1dvcmxkUmVzb3VyY2UuQ0xJQ0hFRF9NRVNTQUdFKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdExvY2F0b3IoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiaGVsbG93b3JsZCIpLnBhdGgoImxvY2F0b3IiKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkudGV4dChIZWxsb1dvcmxkUmVzb3VyY2UuQ0xJQ0hFRF9NRVNTQUdFKSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdCgiV3JvbmcgSFRUUCByZXNwb25zZSBjb2RlIHJldHVybmVkLiIsIHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgiVW5leHBlY3RlZCByZXNwb25zZSBlbnRpdHkuIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBpcyhIZWxsb1dvcmxkUmVzb3VyY2UuQ0xJQ0hFRF9NRVNTQUdFKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0KCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoImhlbGxvd29ybGQiKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikKKyAgICAgICAgICAgICAgICAucHV0KEVudGl0eS50ZXh0KEhlbGxvV29ybGRSZXNvdXJjZS5DTElDSEVEX01FU1NBR0UpKTsKKworICAgICAgICBhc3NlcnRUaGF0KCJXcm9uZyBIVFRQIHJlc3BvbnNlIGNvZGUgcmV0dXJuZWQuIiwgcmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwNCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFB1dExvY2F0b3IoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiaGVsbG93b3JsZCIpLnBhdGgoImxvY2F0b3IiKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikKKyAgICAgICAgICAgICAgICAucHV0KEVudGl0eS50ZXh0KEhlbGxvV29ybGRSZXNvdXJjZS5DTElDSEVEX01FU1NBR0UpKTsKKworICAgICAgICBhc3NlcnRUaGF0KCJXcm9uZyBIVFRQIHJlc3BvbnNlIGNvZGUgcmV0dXJuZWQuIiwgcmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwNCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2hlbGxvd29ybGQtY2RpMi1zZS9SRUFETUUuTUQgYi9leGFtcGxlcy9oZWxsb3dvcmxkLWNkaTItc2UvUkVBRE1FLk1ECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNDAyNmYKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9oZWxsb3dvcmxkLWNkaTItc2UvUkVBRE1FLk1ECkBAIC0wLDAgKzEsMzQgQEAKK1svL106ICMgIiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIgorWy8vXTogIyAiICIKK1svL106ICMgIiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgIgorWy8vXTogIyAiIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0ICIKK1svL106ICMgIiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuICIKK1svL106ICMgIiAiCitbLy9dOiAjICIgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZSAiCisKK0hlbGxvIFdvcmxkIGFuZCBDb3VudGVyIEV4YW1wbGUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyBIZWxsbyBXb3JsZCBhbmQgQ291bnRlciBleGFtcGxlcyB3aXRoIENESSAyIFNFIGltcGxlbWVudGVkIGJ5IFdlbGQuCisKK0NvbnRlbnRzCistLS0tLS0tLQorCitUaGUgbWFwcGluZyBvZiB0aGUgVVJJIHBhdGggc3BhY2UgaXMgcHJlc2VudGVkIGluIHRoZSBmb2xsb3dpbmcgdGFibGU6CisKK1VSSSBwYXRoICAgICAgICAgICAgICAgICAgICB8IFJlc291cmNlIGNsYXNzICAgICAgfCBIVFRQIG1ldGhvZHMgfCBOb3RlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKl8vaGVsbG93b3JsZC97bmFtZX1fKiogICAgfCBIZWxsb1dvcmxkUmVzb3VyY2UgIHwgIEdFVCAgICAgICAgIHwgIFJldHVybnMgYEhlbGxvIHtuYW1lfWAKKyoqXy9jb3VudGVyL3JlcXVlc3RfKiogICAgICB8IENvdW50ZXJSZXNvdXJjZSAgICAgfCAgR0VUICAgICAgICAgfCAgUmV0dXJucyBhbHdheXMgYDFgIChpbmplY3RlZCBhbHdheXMgYSBuZXcgaW5zdGFuY2Ugb2YgY291bnRlcikKKyoqXy9jb3VudGVyL2FwcGxpY2F0aW9uXyoqICB8IENvdW50ZXJSZXNvdXJjZSAgICAgfCAgR0VUICAgICAgICAgfCAgUmV0dXJucyBhbiBpbmNyZW1lbnRlZCBudW1iZXIgKGluamVjdGVkIGFsd2F5cyB0aGUgc2FtZSBjb3VudGVyKS4KKworUnVubmluZyB0aGUgRXhhbXBsZQorLS0tLS0tLS0tLS0tLS0tLS0tLQorCitSdW4gdGhlIGV4YW1wbGUgYXMgZm9sbG93czoKKworPiAgICAgbXZuIGNsZWFuIGNvbXBpbGUgZXhlYzpqYXZhCisKK1RoaXMgZGVwbG95cyB0aGUgZXhhbXBsZSB1c2luZyBbR3JpenpseV0oaHR0cDovL2dyaXp6bHkuamF2YS5uZXQvKSBjb250YWluZXIuCisKKy0gICA8aHR0cDovL2xvY2FsaG9zdDo4MDgwL2hlbGxvd29ybGQ+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9oZWxsb3dvcmxkLWNkaTItc2UvcG9tLnhtbCBiL2V4YW1wbGVzL2hlbGxvd29ybGQtY2RpMi1zZS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhM2NmYWEKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9oZWxsb3dvcmxkLWNkaTItc2UvcG9tLnhtbApAQCAtMCwwICsxLDg2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+aGVsbG93b3JsZC1jZGkyLXNlPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LWV4YW1wbGVzLWhlbGxvd29ybGQtY2RpMi1zZTwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgIkhlbGxvIHdvcmxkIiBleGFtcGxlIHdpdGggQ0RJIDIgU0UuPC9kZXNjcmlwdGlvbj4KKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8Y2RpLmFwaS52ZXJzaW9uPjIuMDwvY2RpLmFwaS52ZXJzaW9uPgorICAgICAgICA8d2VsZC52ZXJzaW9uPiR7d2VsZDMudmVyc2lvbn08L3dlbGQudmVyc2lvbj4KKyAgICA8L3Byb3BlcnRpZXM+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jZGkyLXNlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1ncml6emx5Mi1odHRwPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yazwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay11dGlsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItYnVuZGxlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHR5cGU+cG9tPC90eXBlPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGVjLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPG1haW5DbGFzcz5qYXZhLm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmhlbGxvd29ybGQuY2RpMnNlLkFwcDwvbWFpbkNsYXNzPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+cmVsZWFzZTwvaWQ+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICA8L3Byb2ZpbGVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9oZWxsb3dvcmxkLWNkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL2NkaTJzZS9BcHAuamF2YSBiL2V4YW1wbGVzL2hlbGxvd29ybGQtY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvY2RpMnNlL0FwcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzNTIzM2YKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9oZWxsb3dvcmxkLWNkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL2NkaTJzZS9BcHAuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmhlbGxvd29ybGQuY2RpMnNlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseTIuaHR0cHNlcnZlci5Hcml6emx5SHR0cFNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5ncml6emx5Lmh0dHAuc2VydmVyLkh0dHBTZXJ2ZXI7CisKKy8qKgorICogSGVsbG8gd29ybGQhCisgKi8KK3B1YmxpYyBjbGFzcyBBcHAgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIEJBU0VfVVJJID0gVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2Jhc2UvIik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVF9IRUxMT19QQVRIID0gImhlbGxvd29ybGQiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RfQ09VTlRFUl9QQVRIID0gImNvdW50ZXIiOworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcIkhlbGxvIFdvcmxkXCIgSmVyc2V5IEV4YW1wbGUgQXBwIik7CisKKyAgICAgICAgICAgIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKEhlbGxvV29ybGRSZXNvdXJjZS5jbGFzcywgQ291bnRlclJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgICAgIEh0dHBTZXJ2ZXIgc2VydmVyID0gR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5LmNyZWF0ZUh0dHBTZXJ2ZXIoQkFTRV9VUkksIHJlc291cmNlQ29uZmlnLCBmYWxzZSk7CisgICAgICAgICAgICBSdW50aW1lLmdldFJ1bnRpbWUoKS5hZGRTaHV0ZG93bkhvb2sobmV3IFRocmVhZChzZXJ2ZXI6OnNodXRkb3duTm93KSk7CisKKyAgICAgICAgICAgIHNlcnZlci5zdGFydCgpOworCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFwcGxpY2F0aW9uIHN0YXJ0ZWQuXG5Ucnkgb3V0Iik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oU3RyaW5nLmZvcm1hdCgiJXMlcyIsIEJBU0VfVVJJLCBST09UX0hFTExPX1BBVEgpKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihTdHJpbmcuZm9ybWF0KCIlcyVzJXMiLCBCQVNFX1VSSSwgUk9PVF9DT1VOVEVSX1BBVEgsICIvcmVxdWVzdCIpKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihTdHJpbmcuZm9ybWF0KCIlcyVzJXMiLCBCQVNFX1VSSSwgUk9PVF9DT1VOVEVSX1BBVEgsICIvYXBwbGljYXRpb24iKSk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlN0b3AgdGhlIGFwcGxpY2F0aW9uIHVzaW5nIENUUkwrQyIpOworCisgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gfCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihBcHAuY2xhc3MuZ2V0TmFtZSgpKS5sb2coTGV2ZWwuU0VWRVJFLCBudWxsLCBleCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9oZWxsb3dvcmxkLWNkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL2NkaTJzZS9BcHBsaWNhdGlvblNjb3BlZENvdW50ZXIuamF2YSBiL2V4YW1wbGVzL2hlbGxvd29ybGQtY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvY2RpMnNlL0FwcGxpY2F0aW9uU2NvcGVkQ291bnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExOWFhMDgKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9oZWxsb3dvcmxkLWNkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL2NkaTJzZS9BcHBsaWNhdGlvblNjb3BlZENvdW50ZXIuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmhlbGxvd29ybGQuY2RpMnNlOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuQXBwbGljYXRpb25TY29wZWQ7CisKKy8qKgorICogQXBwbGljYXRpb24tc2NvcGVkIGNvdW50ZXIuCisgKi8KK0BBcHBsaWNhdGlvblNjb3BlZAorcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uU2NvcGVkQ291bnRlciB7CisKKyAgICBwcml2YXRlIGZpbmFsIEF0b21pY0ludGVnZXIgY291bnRlciA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CisKKyAgICBwdWJsaWMgaW50IGdldE51bWJlcigpIHsKKyAgICAgICAgcmV0dXJuIGNvdW50ZXIuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaGVsbG93b3JsZC1jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9jZGkyc2UvQ291bnRlclJlc291cmNlLmphdmEgYi9leGFtcGxlcy9oZWxsb3dvcmxkLWNkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL2NkaTJzZS9Db3VudGVyUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTlkYTk0Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvaGVsbG93b3JsZC1jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9jZGkyc2UvQ291bnRlclJlc291cmNlLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5oZWxsb3dvcmxkLmNkaTJzZTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKKworLyoqCisgKiBSZXF1ZXN0LXNjb3BlZCByZXNvdXJjZSBjb3VudGVyLgorICoKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitAUGF0aCgiY291bnRlciIpCitwdWJsaWMgY2xhc3MgQ291bnRlclJlc291cmNlIHsKKworICAgIEBJbmplY3QKKyAgICBwcml2YXRlIFJlcXVlc3RTY29wZWRDb3VudGVyIHJlcXVlc3RTY29wZWQ7CisKKyAgICBASW5qZWN0CisgICAgcHJpdmF0ZSBBcHBsaWNhdGlvblNjb3BlZENvdW50ZXIgYXBwbGljYXRpb25TY29wZWQ7CisKKyAgICBAR0VUCisgICAgQFBhdGgoImFwcGxpY2F0aW9uIikKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBpbnQgZ2V0QXBwQ291bnRlcigpIHsKKyAgICAgICAgcmV0dXJuIGFwcGxpY2F0aW9uU2NvcGVkLmdldE51bWJlcigpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgicmVxdWVzdCIpCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgaW50IGdldFJlcUNvdW50ZXIoKSB7CisgICAgICAgIHJldHVybiByZXF1ZXN0U2NvcGVkLmdldE51bWJlcigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2hlbGxvd29ybGQtY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvY2RpMnNlL0hlbGxvQmVhbi5qYXZhIGIvZXhhbXBsZXMvaGVsbG93b3JsZC1jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9jZGkyc2UvSGVsbG9CZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EwNjc1OQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2hlbGxvd29ybGQtY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvY2RpMnNlL0hlbGxvQmVhbi5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuaGVsbG93b3JsZC5jZGkyc2U7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuQXBwbGljYXRpb25TY29wZWQ7CisKKy8qKgorICogQXBwbGljYXRpb24tc2NvcGVkIHNlcnZpY2UgcmV0dXJuaW5nICJoZWxsbyIgc2VudGVuY2UuCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK0BBcHBsaWNhdGlvblNjb3BlZAorcHVibGljIGNsYXNzIEhlbGxvQmVhbiB7CisKKyAgICBwdWJsaWMgU3RyaW5nIGhlbGxvKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiAiSGVsbG8gIiArIG5hbWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaGVsbG93b3JsZC1jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9jZGkyc2UvSGVsbG9Xb3JsZFJlc291cmNlLmphdmEgYi9leGFtcGxlcy9oZWxsb3dvcmxkLWNkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL2NkaTJzZS9IZWxsb1dvcmxkUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Nzk5ZGEzCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvaGVsbG93b3JsZC1jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9jZGkyc2UvSGVsbG9Xb3JsZFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5oZWxsb3dvcmxkLmNkaTJzZTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworLyoqCisgKiBTaW5nbGV0b24tc2NvcGVkIHJlc291cmNlLgorICoKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitAU2luZ2xldG9uCitAUGF0aCgiaGVsbG93b3JsZCIpCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZFJlc291cmNlIHsKKworICAgIEBJbmplY3QKKyAgICBwcml2YXRlIEhlbGxvQmVhbiBoZWxsb0JlYW47CisKKyAgICBAR0VUCisgICAgQFBhdGgoIntuYW1lfSIpCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldEhlbGxvKEBQYXRoUGFyYW0oIm5hbWUiKSBTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gaGVsbG9CZWFuLmhlbGxvKG5hbWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2hlbGxvd29ybGQtY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvY2RpMnNlL1JlcXVlc3RTY29wZWRDb3VudGVyLmphdmEgYi9leGFtcGxlcy9oZWxsb3dvcmxkLWNkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL2NkaTJzZS9SZXF1ZXN0U2NvcGVkQ291bnRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NTc4NzgKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9oZWxsb3dvcmxkLWNkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL2NkaTJzZS9SZXF1ZXN0U2NvcGVkQ291bnRlci5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuaGVsbG93b3JsZC5jZGkyc2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5SZXF1ZXN0U2NvcGVkOworCisvKioKKyAqIFJlcXVlc3Qtc2NvcGVkIGNvdW50ZXIuCisgKi8KK0BSZXF1ZXN0U2NvcGVkCitwdWJsaWMgY2xhc3MgUmVxdWVzdFNjb3BlZENvdW50ZXIgeworCisgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNJbnRlZ2VyIGNvdW50ZXIgPSBuZXcgQXRvbWljSW50ZWdlcigpOworCisgICAgcHVibGljIGludCBnZXROdW1iZXIoKSB7CisgICAgICAgIHJldHVybiBjb3VudGVyLmluY3JlbWVudEFuZEdldCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2hlbGxvd29ybGQtY2RpMi1zZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvYmVhbnMueG1sIGIvZXhhbXBsZXMvaGVsbG93b3JsZC1jZGkyLXNlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9iZWFucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmMyMTBhMAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2hlbGxvd29ybGQtY2RpMi1zZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvYmVhbnMueG1sCkBAIC0wLDAgKzEsMTQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorCistLT4KKworPGJlYW5zLz4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2hlbGxvd29ybGQtY2RpMi1zZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvY2RpMnNlL0NvdW50ZXJUZXN0LmphdmEgYi9leGFtcGxlcy9oZWxsb3dvcmxkLWNkaTItc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL2NkaTJzZS9Db3VudGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMTc0MTkKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9oZWxsb3dvcmxkLWNkaTItc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL2NkaTJzZS9Db3VudGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuaGVsbG93b3JsZC5jZGkyc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3RzIENESSBjb3VudGVyIHJlc291cmNlLgorICovCitwdWJsaWMgY2xhc3MgQ291bnRlclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoQ291bnRlclJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1ZXN0Q291bnRlcigpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIEludGVnZXIgcmVzcG9uc2UxID0gdGFyZ2V0KCkucGF0aChBcHAuUk9PVF9DT1VOVEVSX1BBVEgpLnBhdGgoInJlcXVlc3QiKS5yZXF1ZXN0KCkuZ2V0KEludGVnZXIuY2xhc3MpOworICAgICAgICBJbnRlZ2VyIHJlc3BvbnNlMiA9IHRhcmdldCgpLnBhdGgoQXBwLlJPT1RfQ09VTlRFUl9QQVRIKS5wYXRoKCJyZXF1ZXN0IikucmVxdWVzdCgpLmdldChJbnRlZ2VyLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKChJbnRlZ2VyKSAxLCByZXNwb25zZTEpOworICAgICAgICBhc3NlcnRFcXVhbHMoKEludGVnZXIpIDEsIHJlc3BvbnNlMik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwbGljYXRpb25Db3VudGVyKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgSW50ZWdlciByZXNwb25zZTEgPSB0YXJnZXQoKS5wYXRoKEFwcC5ST09UX0NPVU5URVJfUEFUSCkucGF0aCgiYXBwbGljYXRpb24iKS5yZXF1ZXN0KCkuZ2V0KEludGVnZXIuY2xhc3MpOworICAgICAgICBJbnRlZ2VyIHJlc3BvbnNlMiA9IHRhcmdldCgpLnBhdGgoQXBwLlJPT1RfQ09VTlRFUl9QQVRIKS5wYXRoKCJhcHBsaWNhdGlvbiIpLnJlcXVlc3QoKS5nZXQoSW50ZWdlci5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygoSW50ZWdlcikgMSwgcmVzcG9uc2UxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKChJbnRlZ2VyKSAyLCByZXNwb25zZTIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2hlbGxvd29ybGQtY2RpMi1zZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvY2RpMnNlL0hlbGxvV29ybGRUZXN0LmphdmEgYi9leGFtcGxlcy9oZWxsb3dvcmxkLWNkaTItc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL2NkaTJzZS9IZWxsb1dvcmxkVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiYmEyOGEKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9oZWxsb3dvcmxkLWNkaTItc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL2NkaTJzZS9IZWxsb1dvcmxkVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuaGVsbG93b3JsZC5jZGkyc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3RzIENESSBoZWxsb3dvcmxkIHJlc291cmNlLgorICovCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoSGVsbG9Xb3JsZFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIZWxsbygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoQXBwLlJPT1RfSEVMTE9fUEFUSCkucGF0aCgiSmFtZXMiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiSGVsbG8gSmFtZXMiLCByZXNwb25zZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaGVsbG93b3JsZC1uZXR0eS9SRUFETUUuTUQgYi9leGFtcGxlcy9oZWxsb3dvcmxkLW5ldHR5L1JFQURNRS5NRApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmY1ZTljCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvaGVsbG93b3JsZC1uZXR0eS9SRUFETUUuTUQKQEAgLTAsMCArMSwzMyBAQAorWy8vXTogIyAiIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAiCitbLy9dOiAjICIgIgorWy8vXTogIyAiIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAiCitbLy9dOiAjICIgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQgIgorWy8vXTogIyAiIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4gIgorWy8vXTogIyAiICIKK1svL106ICMgIiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlICIKKworSGVsbG8gV29ybGQgRXhhbXBsZQorPT09PT09PT09PT09PT09PT09PQorCitUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIEhlbGxvIFdvcmxkIGV4YW1wbGUgcnVubmluZyBvbiB0b3Agb2YgTmV0dHkgY29udGFpbmVyIGFuZCB1c2luZyBOZXR0eSBjb25uZWN0b3IgYXMgYSBjbGllbnQKK2ltcGxlbWVudGF0aW9uIGZvciB0ZXN0aW5nLiBKQVgtUlMgcmVzb3VyY2UgcmV0dXJucyB0aGUgdXN1YWwgdGV4dCBgSGVsbG8gV29ybGQhYC4KKworQ29udGVudHMKKy0tLS0tLS0tCisKK1RoZSBtYXBwaW5nIG9mIHRoZSBVUkkgcGF0aCBzcGFjZSBpcyBwcmVzZW50ZWQgaW4gdGhlIGZvbGxvd2luZyB0YWJsZToKKworVVJJIHBhdGggICAgICAgICAgICAgfCBSZXNvdXJjZSBjbGFzcyAgICAgIHwgSFRUUCBtZXRob2RzIHwgTm90ZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKl8vaGVsbG93b3JsZF8qKiAgICB8IEhlbGxvV29ybGRSZXNvdXJjZSAgfCAgR0VUICAgICAgICAgfCAgUmV0dXJucyBgSGVsbG8gV29ybGQhYAorCitSdW5uaW5nIHRoZSBFeGFtcGxlCistLS0tLS0tLS0tLS0tLS0tLS0tCisKK1J1biB0aGUgZXhhbXBsZSBhcyBmb2xsb3dzOgorCis+ICAgICBtdm4gY2xlYW4gY29tcGlsZSBleGVjOmphdmEKKworVGhpcyBkZXBsb3lzIHRoZSBleGFtcGxlIHVzaW5nIFtOZXR0eV0oaHR0cDovL25ldHR5LmlvLykgY29udGFpbmVyLgorCistICAgPGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9oZWxsb3dvcmxkPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaGVsbG93b3JsZC1uZXR0eS9wb20ueG1sIGIvZXhhbXBsZXMvaGVsbG93b3JsZC1uZXR0eS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZWM4OTgKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9oZWxsb3dvcmxkLW5ldHR5L3BvbS54bWwKQEAgLTAsMCArMSw3OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmhlbGxvd29ybGQtbmV0dHk8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktZXhhbXBsZXMtaGVsbG93b3JsZC1uZXR0eTwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgIkhlbGxvIHdvcmxkIiBleGFtcGxlIG9uIE5ldHR5IGNvbnRhaW5lci48L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1uZXR0eS1odHRwPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWhrMjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXV0aWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1idW5kbGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dHlwZT5wb208L3R5cGU+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhlYy1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxtYWluQ2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuaGVsbG93b3JsZC5uZXR0eS5BcHA8L21haW5DbGFzcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnJlbGVhc2U8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaGVsbG93b3JsZC1uZXR0eS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvbmV0dHkvQXBwLmphdmEgYi9leGFtcGxlcy9oZWxsb3dvcmxkLW5ldHR5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9uZXR0eS9BcHAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTE4ODMxCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvaGVsbG93b3JsZC1uZXR0eS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvbmV0dHkvQXBwLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5oZWxsb3dvcmxkLm5ldHR5OworCitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGlvLm5ldHR5LmNoYW5uZWwuQ2hhbm5lbDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5uZXR0eS5odHRwc2VydmVyLk5ldHR5SHR0cENvbnRhaW5lclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworLyoqCisgKiBIZWxsbyB3b3JsZCEKKyAqLworcHVibGljIGNsYXNzIEFwcCB7CisKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RfUEFUSCA9ICJoZWxsb3dvcmxkIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVSSSBCQVNFX1VSSSA9IFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8iKTsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXCJIZWxsbyBXb3JsZFwiIEplcnNleSBFeGFtcGxlIEFwcCBvbiBOZXR0eSBjb250YWluZXIuIik7CisKKyAgICAgICAgICAgIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKEhlbGxvV29ybGRSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgICAgICBmaW5hbCBDaGFubmVsIHNlcnZlciA9IE5ldHR5SHR0cENvbnRhaW5lclByb3ZpZGVyLmNyZWF0ZUh0dHAyU2VydmVyKEJBU0VfVVJJLCByZXNvdXJjZUNvbmZpZywgbnVsbCk7CisKKyAgICAgICAgICAgIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmFkZFNodXRkb3duSG9vayhuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHNlcnZlci5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pKTsKKworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFN0cmluZy5mb3JtYXQoIkFwcGxpY2F0aW9uIHN0YXJ0ZWQuIChIVFRQLzIgZW5hYmxlZCEpXG5Ucnkgb3V0ICVzJXNcblN0b3AgdGhlIGFwcGxpY2F0aW9uIHVzaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiQ1RSTCtDLiIsIEJBU0VfVVJJLCBST09UX1BBVEgpKTsKKyAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuam9pbigpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihBcHAuY2xhc3MuZ2V0TmFtZSgpKS5sb2coTGV2ZWwuU0VWRVJFLCBudWxsLCBleCk7CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2hlbGxvd29ybGQtbmV0dHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL25ldHR5L0hlbGxvV29ybGRSZXNvdXJjZS5qYXZhIGIvZXhhbXBsZXMvaGVsbG93b3JsZC1uZXR0eS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvbmV0dHkvSGVsbG9Xb3JsZFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFmMWJlNwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2hlbGxvd29ybGQtbmV0dHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL25ldHR5L0hlbGxvV29ybGRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuaGVsbG93b3JsZC5uZXR0eTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCisvKioKKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiaGVsbG93b3JsZCIpCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZFJlc291cmNlIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTElDSEVEX01FU1NBR0UgPSAiSGVsbG8gV29ybGQhIjsKKworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0SGVsbG8oKSB7CisgICAgICAgIHJldHVybiBDTElDSEVEX01FU1NBR0U7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9oZWxsb3dvcmxkLW5ldHR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9uZXR0eS9DdXN0b21Mb2dnaW5nRmlsdGVyLmphdmEgYi9leGFtcGxlcy9oZWxsb3dvcmxkLW5ldHR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9uZXR0eS9DdXN0b21Mb2dnaW5nRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk2YWJkZAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2hlbGxvd29ybGQtbmV0dHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL25ldHR5L0N1c3RvbUxvZ2dpbmdGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmhlbGxvd29ybGQubmV0dHk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVzcG9uc2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXNwb25zZUZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlc3BvbnNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQ3VzdG9tIGxvZ2dpbmcgZmlsdGVyLgorICoKKyAqIEBhdXRob3IgU2FudGlhZ28gUGVyaWNhcy1HZWVydHNlbiAoc2FudGlhZ28ucGVyaWNhc2dlZXJ0c2VuIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBDdXN0b21Mb2dnaW5nRmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciwgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXIsCisgICAgICAgIENsaWVudFJlcXVlc3RGaWx0ZXIsIENsaWVudFJlc3BvbnNlRmlsdGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEN1c3RvbUxvZ2dpbmdGaWx0ZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIHN0YXRpYyBpbnQgcHJlRmlsdGVyQ2FsbGVkID0gMDsKKyAgICBzdGF0aWMgaW50IHBvc3RGaWx0ZXJDYWxsZWQgPSAwOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZmlsdGVyKENsaWVudFJlcXVlc3RDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIExPR0dFUi5pbmZvKCJDdXN0b21Mb2dnaW5nRmlsdGVyLnByZUZpbHRlciBjYWxsZWQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnRleHQuZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnR5KCJmb28iKSwgImJhciIpOworICAgICAgICBwcmVGaWx0ZXJDYWxsZWQrKzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ2xpZW50UmVxdWVzdENvbnRleHQgY29udGV4dCwgQ2xpZW50UmVzcG9uc2VDb250ZXh0IGNsaWVudFJlc3BvbnNlQ29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgTE9HR0VSLmluZm8oIkN1c3RvbUxvZ2dpbmdGaWx0ZXIucG9zdEZpbHRlciBjYWxsZWQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnRleHQuZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnR5KCJmb28iKSwgImJhciIpOworICAgICAgICBwb3N0RmlsdGVyQ2FsbGVkKys7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIExPR0dFUi5pbmZvKCJDdXN0b21Mb2dnaW5nRmlsdGVyLnByZUZpbHRlciBjYWxsZWQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnRleHQuZ2V0UHJvcGVydHkoImZvbyIpLCAiYmFyIik7CisgICAgICAgIHByZUZpbHRlckNhbGxlZCsrOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCBjb250ZXh0LCBDb250YWluZXJSZXNwb25zZUNvbnRleHQgY29udGFpbmVyUmVzcG9uc2VDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBMT0dHRVIuaW5mbygiQ3VzdG9tTG9nZ2luZ0ZpbHRlci5wb3N0RmlsdGVyIGNhbGxlZCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoY29udGV4dC5nZXRQcm9wZXJ0eSgiZm9vIiksICJiYXIiKTsKKyAgICAgICAgcG9zdEZpbHRlckNhbGxlZCsrOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaGVsbG93b3JsZC1uZXR0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvbmV0dHkvSGVsbG9Xb3JsZFRlc3QuamF2YSBiL2V4YW1wbGVzL2hlbGxvd29ybGQtbmV0dHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL25ldHR5L0hlbGxvV29ybGRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RiODJiNQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2hlbGxvd29ybGQtbmV0dHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL25ldHR5L0hlbGxvV29ybGRUZXN0LmphdmEKQEAgLTAsMCArMSwyMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuaGVsbG93b3JsZC5uZXR0eTsKKworaW1wb3J0IGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5JbnZvY2F0aW9uQ2FsbGJhY2s7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubmV0dHkuY29ubmVjdG9yLk5ldHR5Q29ubmVjdG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QubmV0dHkuTmV0dHlUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QudXRpbC5ydW5uZXIuQ29uY3VycmVudFJ1bm5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnV0aWwucnVubmVyLlJ1blNlcGFyYXRlbHk7CitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK0BSdW5XaXRoKENvbmN1cnJlbnRSdW5uZXIuY2xhc3MpCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisgICAgICAgIC8vIGVuYWJsZShUZXN0UHJvcGVydGllcy5EVU1QX0VOVElUWSk7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoSGVsbG9Xb3JsZFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNsaWVudENvbmZpZykgeworICAgICAgICBjbGllbnRDb25maWcuY29ubmVjdG9yUHJvdmlkZXIobmV3IE5ldHR5Q29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IE5ldHR5VGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBJZ25vcmUoIm5vdCBjb21wYXRpYmxlIHdpdGggdGVzdCBmcmFtZXdvcmsgKGRvZXNuJ3QgdXNlIGNsaWVudCgpKSIpCisgICAgcHVibGljIHZvaWQgdGVzdEhlbGxvV29ybGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgVVJMIGdldFVybCA9IFVyaUJ1aWxkZXIuZnJvbVVyaShnZXRCYXNlVXJpKCkpLnBhdGgoQXBwLlJPT1RfUEFUSCkuYnVpbGQoKS50b1VSTCgpOworICAgICAgICBIdHRwVVJMQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gKEh0dHBVUkxDb25uZWN0aW9uKSBnZXRVcmwub3BlbkNvbm5lY3Rpb24oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbm5lY3Rpb24uc2V0RG9PdXRwdXQodHJ1ZSk7CisgICAgICAgICAgICBjb25uZWN0aW9uLnNldEluc3RhbmNlRm9sbG93UmVkaXJlY3RzKGZhbHNlKTsKKyAgICAgICAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdE1ldGhvZCgiR0VUIik7CisgICAgICAgICAgICBjb25uZWN0aW9uLnNldFJlcXVlc3RQcm9wZXJ0eSgiQ29udGVudC1UeXBlIiwgInRleHQvcGxhaW4iKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhIdHRwVVJMQ29ubmVjdGlvbi5IVFRQX09LLCBjb25uZWN0aW9uLmdldFJlc3BvbnNlQ29kZSgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNvbm5lY3Rpb24uZGlzY29ubmVjdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdGlvbigpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKEFwcC5ST09UX1BBVEgpLnJlcXVlc3QoInRleHQvcGxhaW4iKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsaWVudFN0cmluZ1Jlc3BvbnNlKCkgeworICAgICAgICBTdHJpbmcgcyA9IHRhcmdldCgpLnBhdGgoQXBwLlJPT1RfUEFUSCkucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoSGVsbG9Xb3JsZFJlc291cmNlLkNMSUNIRURfTUVTU0FHRSwgcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNDbGllbnRSZXF1ZXN0cygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGludCBSRVFVRVNUUyA9IDEwOworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaChSRVFVRVNUUyk7CisgICAgICAgIGZpbmFsIGxvbmcgdGljID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUkVRVUVTVFM7IGkrKykgeworICAgICAgICAgICAgZmluYWwgaW50IGlkID0gaTsKKyAgICAgICAgICAgIHRhcmdldCgpLnBhdGgoQXBwLlJPT1RfUEFUSCkucmVxdWVzdCgpLmFzeW5jKCkuZ2V0KG5ldyBJbnZvY2F0aW9uQ2FsbGJhY2s8UmVzcG9uc2U+KCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbXBsZXRlZChSZXNwb25zZSByZXNwb25zZSkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhIZWxsb1dvcmxkUmVzb3VyY2UuQ0xJQ0hFRF9NRVNTQUdFLCByZXN1bHQpOworICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBmYWlsZWQoVGhyb3dhYmxlIGVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIGVycm9yLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgICBsYXRjaC5hd2FpdCgxMCAqIGdldEFzeW5jVGltZW91dE11bHRpcGxpZXIoKSwgVGltZVVuaXQuU0VDT05EUyk7CisgICAgICAgIGZpbmFsIGxvbmcgdG9jID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoSGVsbG9Xb3JsZFRlc3QuY2xhc3MuZ2V0TmFtZSgpKS5pbmZvKCJFeGVjdXRlZCBpbjogIiArICh0b2MgLSB0aWMpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIZWFkKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoQXBwLlJPT1RfUEFUSCkucmVxdWVzdCgpLmhlYWQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSwgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZvb0Jhck9wdGlvbnMoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aChBcHAuUk9PVF9QQVRIKS5yZXF1ZXN0KCkuaGVhZGVyKCJBY2NlcHQiLCAiZm9vL2JhciIpLm9wdGlvbnMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBmaW5hbCBTdHJpbmcgYWxsb3dIZWFkZXIgPSByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIkFsbG93Iik7CisgICAgICAgIF9jaGVja0FsbG93Q29udGVudChhbGxvd0hlYWRlcik7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9vL2JhciIsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcmVzcG9uc2UuZ2V0TGVuZ3RoKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRleHRQbGFpbk9wdGlvbnMoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aChBcHAuUk9PVF9QQVRIKS5yZXF1ZXN0KCkuaGVhZGVyKCJBY2NlcHQiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTikub3B0aW9ucygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBhbGxvd0hlYWRlciA9IHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiQWxsb3ciKTsKKyAgICAgICAgX2NoZWNrQWxsb3dDb250ZW50KGFsbG93SGVhZGVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3BvbnNlQm9keSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgX2NoZWNrQWxsb3dDb250ZW50KHJlc3BvbnNlQm9keSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF9jaGVja0FsbG93Q29udGVudChmaW5hbCBTdHJpbmcgY29udGVudCkgeworICAgICAgICBhc3NlcnRUcnVlKGNvbnRlbnQuY29udGFpbnMoIkdFVCIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb250ZW50LmNvbnRhaW5zKCJIRUFEIikpOworICAgICAgICBhc3NlcnRUcnVlKGNvbnRlbnQuY29udGFpbnMoIk9QVElPTlMiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ1Jlc291cmNlTm90Rm91bmQoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aChBcHAuUk9PVF9QQVRIICsgImFyYml0cmFyeSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwNCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aChBcHAuUk9PVF9QQVRIKS5wYXRoKCJhcmJpdHJhcnkiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDQsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBSdW5TZXBhcmF0ZWx5CisgICAgcHVibGljIHZvaWQgdGVzdExvZ2dpbmdGaWx0ZXJDbGllbnRDbGFzcygpIHsKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IGNsaWVudCgpOworICAgICAgICBjbGllbnQucmVnaXN0ZXIoQ3VzdG9tTG9nZ2luZ0ZpbHRlci5jbGFzcykucHJvcGVydHkoImZvbyIsICJiYXIiKTsKKyAgICAgICAgQ3VzdG9tTG9nZ2luZ0ZpbHRlci5wcmVGaWx0ZXJDYWxsZWQgPSBDdXN0b21Mb2dnaW5nRmlsdGVyLnBvc3RGaWx0ZXJDYWxsZWQgPSAwOworICAgICAgICBTdHJpbmcgcyA9IHRhcmdldCgpLnBhdGgoQXBwLlJPT1RfUEFUSCkucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoSGVsbG9Xb3JsZFJlc291cmNlLkNMSUNIRURfTUVTU0FHRSwgcyk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBDdXN0b21Mb2dnaW5nRmlsdGVyLnByZUZpbHRlckNhbGxlZCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBDdXN0b21Mb2dnaW5nRmlsdGVyLnBvc3RGaWx0ZXJDYWxsZWQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQFJ1blNlcGFyYXRlbHkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9nZ2luZ0ZpbHRlckNsaWVudEluc3RhbmNlKCkgeworICAgICAgICBDbGllbnQgY2xpZW50ID0gY2xpZW50KCk7CisgICAgICAgIGNsaWVudC5yZWdpc3RlcihuZXcgQ3VzdG9tTG9nZ2luZ0ZpbHRlcigpKS5wcm9wZXJ0eSgiZm9vIiwgImJhciIpOworICAgICAgICBDdXN0b21Mb2dnaW5nRmlsdGVyLnByZUZpbHRlckNhbGxlZCA9IEN1c3RvbUxvZ2dpbmdGaWx0ZXIucG9zdEZpbHRlckNhbGxlZCA9IDA7CisgICAgICAgIFN0cmluZyBzID0gdGFyZ2V0KCkucGF0aChBcHAuUk9PVF9QQVRIKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhIZWxsb1dvcmxkUmVzb3VyY2UuQ0xJQ0hFRF9NRVNTQUdFLCBzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIEN1c3RvbUxvZ2dpbmdGaWx0ZXIucHJlRmlsdGVyQ2FsbGVkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIEN1c3RvbUxvZ2dpbmdGaWx0ZXIucG9zdEZpbHRlckNhbGxlZCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAUnVuU2VwYXJhdGVseQorICAgIHB1YmxpYyB2b2lkIHRlc3RMb2dnaW5nRmlsdGVyVGFyZ2V0Q2xhc3MoKSB7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKS5wYXRoKEFwcC5ST09UX1BBVEgpOworICAgICAgICB0YXJnZXQucmVnaXN0ZXIoQ3VzdG9tTG9nZ2luZ0ZpbHRlci5jbGFzcykucHJvcGVydHkoImZvbyIsICJiYXIiKTsKKyAgICAgICAgQ3VzdG9tTG9nZ2luZ0ZpbHRlci5wcmVGaWx0ZXJDYWxsZWQgPSBDdXN0b21Mb2dnaW5nRmlsdGVyLnBvc3RGaWx0ZXJDYWxsZWQgPSAwOworICAgICAgICBTdHJpbmcgcyA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhIZWxsb1dvcmxkUmVzb3VyY2UuQ0xJQ0hFRF9NRVNTQUdFLCBzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIEN1c3RvbUxvZ2dpbmdGaWx0ZXIucHJlRmlsdGVyQ2FsbGVkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIEN1c3RvbUxvZ2dpbmdGaWx0ZXIucG9zdEZpbHRlckNhbGxlZCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAUnVuU2VwYXJhdGVseQorICAgIHB1YmxpYyB2b2lkIHRlc3RMb2dnaW5nRmlsdGVyVGFyZ2V0SW5zdGFuY2UoKSB7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKS5wYXRoKEFwcC5ST09UX1BBVEgpOworICAgICAgICB0YXJnZXQucmVnaXN0ZXIobmV3IEN1c3RvbUxvZ2dpbmdGaWx0ZXIoKSkucHJvcGVydHkoImZvbyIsICJiYXIiKTsKKyAgICAgICAgQ3VzdG9tTG9nZ2luZ0ZpbHRlci5wcmVGaWx0ZXJDYWxsZWQgPSBDdXN0b21Mb2dnaW5nRmlsdGVyLnBvc3RGaWx0ZXJDYWxsZWQgPSAwOworICAgICAgICBTdHJpbmcgcyA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhIZWxsb1dvcmxkUmVzb3VyY2UuQ0xJQ0hFRF9NRVNTQUdFLCBzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIEN1c3RvbUxvZ2dpbmdGaWx0ZXIucHJlRmlsdGVyQ2FsbGVkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIEN1c3RvbUxvZ2dpbmdGaWx0ZXIucG9zdEZpbHRlckNhbGxlZCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAUnVuU2VwYXJhdGVseQorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25maWd1cmF0aW9uVXBkYXRlKCkgeworICAgICAgICBDbGllbnQgY2xpZW50MSA9IGNsaWVudCgpOworICAgICAgICBjbGllbnQxLnJlZ2lzdGVyKEN1c3RvbUxvZ2dpbmdGaWx0ZXIuY2xhc3MpLnByb3BlcnR5KCJmb28iLCAiYmFyIik7CisKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KGNsaWVudDEuZ2V0Q29uZmlndXJhdGlvbigpKTsKKyAgICAgICAgQ3VzdG9tTG9nZ2luZ0ZpbHRlci5wcmVGaWx0ZXJDYWxsZWQgPSBDdXN0b21Mb2dnaW5nRmlsdGVyLnBvc3RGaWx0ZXJDYWxsZWQgPSAwOworICAgICAgICBTdHJpbmcgcyA9IHRhcmdldCgpLnBhdGgoQXBwLlJPT1RfUEFUSCkucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoSGVsbG9Xb3JsZFJlc291cmNlLkNMSUNIRURfTUVTU0FHRSwgcyk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBDdXN0b21Mb2dnaW5nRmlsdGVyLnByZUZpbHRlckNhbGxlZCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBDdXN0b21Mb2dnaW5nRmlsdGVyLnBvc3RGaWx0ZXJDYWxsZWQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2hlbGxvd29ybGQtcHJvZ3JhbW1hdGljL1JFQURNRS5NRCBiL2V4YW1wbGVzL2hlbGxvd29ybGQtcHJvZ3JhbW1hdGljL1JFQURNRS5NRApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmQyMTBkCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvaGVsbG93b3JsZC1wcm9ncmFtbWF0aWMvUkVBRE1FLk1ECkBAIC0wLDAgKzEsMzUgQEAKK1svL106ICMgIiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIgorWy8vXTogIyAiICIKK1svL106ICMgIiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgIgorWy8vXTogIyAiIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0ICIKK1svL106ICMgIiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuICIKK1svL106ICMgIiAiCitbLy9dOiAjICIgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZSAiCisKK0hlbGxvIFdvcmxkIEV4YW1wbGUKKz09PT09PT09PT09PT09PT09PT0KKworVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gY3JlYXRlIHByb2dyYW1tYXRpY2FsbHkgSGVsbG8gV29ybGQgZXhhbXBsZS4KK0pBWC1SUyByZXNvdXJjZSByZXR1cm5zIHRoZSB1c3VhbCB0ZXh0IGBIZWxsbyBXb3JsZCFgLgorCitDb250ZW50cworLS0tLS0tLS0KKworVGhlIG1hcHBpbmcgb2YgdGhlIFVSSSBwYXRoIHNwYWNlIGlzIHByZXNlbnRlZCBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOgorCitVUkkgcGF0aCAgICAgICAgICAgICB8IFJlc291cmNlIGNsYXNzICAgICAgfCBIVFRQIG1ldGhvZHMgfCBOb3RlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqXy9oZWxsb3dvcmxkXyoqICAgIHwgSGVsbG9Xb3JsZFJlc291cmNlICB8IEdFVCAgICAgICAgICB8IFJldHVybnMgYEhlbGxvIFdvcmxkIWAKKyoqXy9oZWxsb3dvcmxkXyoqICAgIHwgSGVsbG9Xb3JsZFJlc291cmNlICB8IE9QVElPTlMgICAgICB8IFJldHVybnMgSFRUUCBTdGF0dXMgMjA0CisqKl8vaGVsbG93b3JsZF8qKiAgICB8IEhlbGxvV29ybGRSZXNvdXJjZSAgfCBIRUFEICAgICAgICAgfCBSZXR1cm5zIEhUVFAgU3RhdHVzIDIwNAorCitSdW5uaW5nIHRoZSBFeGFtcGxlCistLS0tLS0tLS0tLS0tLS0tLS0tCisKK1J1biB0aGUgZXhhbXBsZSBhcyBmb2xsb3dzOgorCis+ICAgICBtdm4gY2xlYW4gY29tcGlsZSBleGVjOmphdmEKKworVGhpcyBkZXBsb3lzIHRoZSBleGFtcGxlIHVzaW5nIFtHcml6emx5XShodHRwOi8vZ3JpenpseS5qYXZhLm5ldC8pIGNvbnRhaW5lci4gWW91IGNhbiBhY2Nlc3MgdGhlIGFwcGxpY2F0aW9uIGF0OgorCistICAgPGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9iYXNlL2hlbGxvd29ybGQ+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9oZWxsb3dvcmxkLXByb2dyYW1tYXRpYy9wb20ueG1sIGIvZXhhbXBsZXMvaGVsbG93b3JsZC1wcm9ncmFtbWF0aWMvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzU2YjUwCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvaGVsbG93b3JsZC1wcm9ncmFtbWF0aWMvcG9tLnhtbApAQCAtMCwwICsxLDcyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+aGVsbG93b3JsZC1wcm9ncmFtbWF0aWM8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktZXhhbXBsZXMtaGVsbG93b3JsZC1wcm9ncmFtbWF0aWM8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+SmVyc2V5IHByb2dyYW1tYXRpYyByZXNvdXJjZSBBUEkgIkhlbGxvIHdvcmxkIiBleGFtcGxlLjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLWdyaXp6bHkyLWh0dHA8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktaGsyPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhlYy1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxtYWluQ2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuaGVsbG93b3JsZC5BcHA8L21haW5DbGFzcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnJlbGVhc2U8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaGVsbG93b3JsZC1wcm9ncmFtbWF0aWMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL0FwcC5qYXZhIGIvZXhhbXBsZXMvaGVsbG93b3JsZC1wcm9ncmFtbWF0aWMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL0FwcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NjljYzUKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9oZWxsb3dvcmxkLXByb2dyYW1tYXRpYy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvQXBwLmphdmEKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuaGVsbG93b3JsZDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseTIuaHR0cHNlcnZlci5Hcml6emx5SHR0cFNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5JbmZsZWN0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guZ3JpenpseS5odHRwLnNlcnZlci5IdHRwU2VydmVyOworCisvKioKKyAqIFRoaXMgaXMgdGhlIGV4YW1wbGUgZW50cnkgcG9pbnQsIHdoZXJlIEplcnNleSBhcHBsaWNhdGlvbiBmb3IgdGhlIGV4YW1wbGUKKyAqIGdldHMgcG9wdWxhdGVkIGFuZCBwdWJsaXNoZWQgdXNpbmcgdGhlIEdyaXp6bHkgMiBIVFRQIGNvbnRhaW5lci4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQXBwIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVSSSBCQVNFX1VSSSA9IFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9iYXNlLyIpOworICAgIC8qKgorICAgICAqICJIZWxsbyBXb3JsZCIgcm9vdCByZXNvdXJjZSBwYXRoLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RfUEFUSCA9ICJoZWxsb3dvcmxkIjsKKworICAgIC8qKgorICAgICAqIE1haW4gYXBwbGljYXRpb24gZW50cnkgcG9pbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXJncyBhcHBsaWNhdGlvbiBhcmd1bWVudHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcIkhlbGxvIFdvcmxkXCIgSmVyc2V5IEV4YW1wbGUgQXBwIik7CisKKyAgICAgICAgICAgIGZpbmFsIEh0dHBTZXJ2ZXIgc2VydmVyID0gR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5LmNyZWF0ZUh0dHBTZXJ2ZXIoQkFTRV9VUkksIGNyZWF0ZSgpLCBmYWxzZSk7CisgICAgICAgICAgICBSdW50aW1lLmdldFJ1bnRpbWUoKS5hZGRTaHV0ZG93bkhvb2sobmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIuc2h1dGRvd25Ob3coKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KSk7CisgICAgICAgICAgICBzZXJ2ZXIuc3RhcnQoKTsKKworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJBcHBsaWNhdGlvbiBzdGFydGVkLiVuIgorICAgICAgICAgICAgICAgICAgICArICJUcnkgb3V0ICVzJXMlbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiU3RvcCB0aGUgYXBwbGljYXRpb24gdXNpbmcgQ1RSTCtDIiwKKyAgICAgICAgICAgICAgICAgICAgQkFTRV9VUkksIFJPT1RfUEFUSCkpOworCisgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gfCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihBcHAuY2xhc3MuZ2V0TmFtZSgpKS5sb2coTGV2ZWwuU0VWRVJFLCBudWxsLCBleCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgYXNzZXJ0aW9uIGluZGljYXRvciB0aGF0IGEgR0VUIG1ldGhvZCBoYW5kbGVyIGhhcyBiZWVuIGNhbGxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvbGF0aWxlIGJvb2xlYW4gZ2V0TWV0aG9kQ2FsbGVkID0gZmFsc2U7CisgICAgLyoqCisgICAgICogVGVzdCBhc3NlcnRpb24gaW5kaWNhdG9yIHRoYXQgYSBIRUFEIG1ldGhvZCBoYW5kbGVyIGhhcyBiZWVuIGNhbGxlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvbGF0aWxlIGJvb2xlYW4gaGVhZE1ldGhvZENhbGxlZCA9IGZhbHNlOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGV4YW1wbGUgYXBwbGljYXRpb24gcmVzb3VyY2UgY29uZmlndXJhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gaW5pdGlhbGl6ZWQgcmVzb3VyY2UgY29uZmlndXJhdGlvbiBvZiB0aGUgZXhhbXBsZSBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlQ29uZmlnIGNyZWF0ZSgpIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2UuQnVpbGRlciByZXNvdXJjZUJ1aWxkZXIgPSBSZXNvdXJjZS5idWlsZGVyKFJPT1RfUEFUSCk7CisKKyAgICAgICAgcmVzb3VyY2VCdWlsZGVyLmFkZE1ldGhvZCgiR0VUIikuaGFuZGxlZEJ5KG5ldyBJbmZsZWN0b3I8Q29udGFpbmVyUmVxdWVzdENvbnRleHQsIFJlc3BvbnNlPigpIHsKKworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIFJlc3BvbnNlIGFwcGx5KENvbnRhaW5lclJlcXVlc3RDb250ZXh0IGRhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldE1ldGhvZENhbGxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soIkhlbGxvIFdvcmxkISIpLmJ1aWxkKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICBJbmZsZWN0b3I8Q29udGFpbmVyUmVxdWVzdENvbnRleHQsIFJlc3BvbnNlPiBub0NvbnRlbnRSZXNwb25kZXIgPSBuZXcgSW5mbGVjdG9yPENvbnRhaW5lclJlcXVlc3RDb250ZXh0LCBSZXNwb25zZT4oKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFJlc3BvbnNlIGFwcGx5KENvbnRhaW5lclJlcXVlc3RDb250ZXh0IGRhdGEpIHsKKyAgICAgICAgICAgICAgICBoZWFkTWV0aG9kQ2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uubm9Db250ZW50KCkuYnVpbGQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgcmVzb3VyY2VCdWlsZGVyLmFkZE1ldGhvZCgiSEVBRCIpLmhhbmRsZWRCeShub0NvbnRlbnRSZXNwb25kZXIpOworICAgICAgICByZXNvdXJjZUJ1aWxkZXIuYWRkTWV0aG9kKCJPUFRJT05TIikuaGFuZGxlZEJ5KG5vQ29udGVudFJlc3BvbmRlcik7CisKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZygpLnJlZ2lzdGVyUmVzb3VyY2VzKHJlc291cmNlQnVpbGRlci5idWlsZCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9oZWxsb3dvcmxkLXByb2dyYW1tYXRpYy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvSGVsbG9Xb3JsZFRlc3QuamF2YSBiL2V4YW1wbGVzL2hlbGxvd29ybGQtcHJvZ3JhbW1hdGljL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9IZWxsb1dvcmxkVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NTk2ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9oZWxsb3dvcmxkLXByb2dyYW1tYXRpYy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvSGVsbG9Xb3JsZFRlc3QuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmhlbGxvd29ybGQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBBcHAuY3JlYXRlKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVsbG9Xb3JsZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKTsKKworICAgICAgICBhc3NlcnRGYWxzZShBcHAuZ2V0TWV0aG9kQ2FsbGVkKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSBjbGllbnQudGFyZ2V0KFVyaUJ1aWxkZXIuZnJvbVVyaShnZXRCYXNlVXJpKCkpLnBhdGgoQXBwLlJPT1RfUEFUSCkuYnVpbGQoKS50b1N0cmluZygpKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikuZ2V0KCk7CisgICAgICAgIGFzc2VydFRydWUoQXBwLmdldE1ldGhvZENhbGxlZCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5oYXNFbnRpdHkoKSk7CisgICAgICAgIGFzc2VydFRydWUoIkhlbGxvIFdvcmxkISIuZXF1YWxzKHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSkpOworCisgICAgICAgIFN0cmluZyBzID0gY2xpZW50LnRhcmdldChnZXRCYXNlVXJpKCkpLnBhdGgoImhlbGxvd29ybGQiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRydWUocy5lcXVhbHMoIkhlbGxvIFdvcmxkISIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIZWxsb1dvcmxkT3RoZXJNZXRob2RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpOworICAgICAgICBhc3NlcnRGYWxzZShBcHAuaGVhZE1ldGhvZENhbGxlZCk7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gY2xpZW50LnRhcmdldChVcmlCdWlsZGVyLmZyb21VcmkoZ2V0QmFzZVVyaSgpKS5wYXRoKEFwcC5ST09UX1BBVEgpLmJ1aWxkKCkudG9TdHJpbmcoKSkKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgidGV4dC9wbGFpbiIpLmhlYWQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShBcHAuaGVhZE1ldGhvZENhbGxlZCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDQsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICByZXNwb25zZSA9IGNsaWVudC50YXJnZXQoVXJpQnVpbGRlci5mcm9tVXJpKGdldEJhc2VVcmkoKSkucGF0aChBcHAuUk9PVF9QQVRIKS5idWlsZCgpLnRvU3RyaW5nKCkpLnJlcXVlc3QoInRleHQvcGxhaW4iKQorICAgICAgICAgICAgICAgIC5vcHRpb25zKCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDQsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9oZWxsb3dvcmxkLXB1cmUtamF4LXJzL1JFQURNRS5NRCBiL2V4YW1wbGVzL2hlbGxvd29ybGQtcHVyZS1qYXgtcnMvUkVBRE1FLk1ECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxMjkxNjgKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9oZWxsb3dvcmxkLXB1cmUtamF4LXJzL1JFQURNRS5NRApAQCAtMCwwICsxLDMyIEBACitbLy9dOiAjICIgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICIKK1svL106ICMgIiAiCitbLy9dOiAjICIgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlICIKK1svL106ICMgIiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCAiCitbLy9dOiAjICIgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLiAiCitbLy9dOiAjICIgIgorWy8vXTogIyAiIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UgIgorCitIZWxsbyBXb3JsZCBFeGFtcGxlCis9PT09PT09PT09PT09PT09PT09CisKK1RoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgSGVsbG8gV29ybGQgZXhhbXBsZS4gSkFYLVJTIHJlc291cmNlIHJldHVybnMgdGhlIHVzdWFsIHRleHQgYEhlbGxvIFdvcmxkIWAuCisKK0NvbnRlbnRzCistLS0tLS0tLQorCitUaGUgbWFwcGluZyBvZiB0aGUgVVJJIHBhdGggc3BhY2UgaXMgcHJlc2VudGVkIGluIHRoZSBmb2xsb3dpbmcgdGFibGU6CisKK1VSSSBwYXRoICAgICAgICAgICAgIHwgUmVzb3VyY2UgY2xhc3MgICAgICB8IEhUVFAgbWV0aG9kcyB8IE5vdGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKipfL2hlbGxvd29ybGRfKiogICAgfCBIZWxsb1dvcmxkUmVzb3VyY2UgIHwgIEdFVCAgICAgICAgIHwgIFJldHVybnMgYEhlbGxvIFdvcmxkIWAKKworUnVubmluZyB0aGUgRXhhbXBsZQorLS0tLS0tLS0tLS0tLS0tLS0tLQorCitSdW4gdGhlIGV4YW1wbGUgYXMgZm9sbG93czoKKworPiAgICAgbXZuIGNsZWFuIGNvbXBpbGUgZXhlYzpqYXZhCisKK1RoaXMgZGVwbG95cyB0aGUgZXhhbXBsZSB1c2luZyBbR3JpenpseV0oaHR0cDovL2dyaXp6bHkuamF2YS5uZXQvKSBjb250YWluZXIuIFlvdSBjYW4gYWNjZXNzIHRoZSBhcHBsaWNhdGlvbiBhdDoKKworLSAgIDxodHRwOi8vbG9jYWxob3N0OjgwODAvaGVsbG93b3JsZD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2hlbGxvd29ybGQtcHVyZS1qYXgtcnMvcG9tLnhtbCBiL2V4YW1wbGVzL2hlbGxvd29ybGQtcHVyZS1qYXgtcnMvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTM0ZWM0Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvaGVsbG93b3JsZC1wdXJlLWpheC1ycy9wb20ueG1sCkBAIC0wLDAgKzEsNzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5oZWxsb3dvcmxkLXB1cmUtamF4LXJzPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LWV4YW1wbGVzLWhlbGxvd29ybGQtcHVyZS1qYXgtcnM8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+RXhhbXBsZSB1c2luZyBvbmx5IHRoZSBzdGFuZGFyZCBKQVgtUlMgQVBJJ3MgYW5kIHRoZSBsaWdodHdlaWdodCBIVFRQIHNlcnZlciBidW5kbGVkIGluIEpESy48L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1qZGstaHR0cDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY2xpZW50PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWhrMjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmV4ZWMtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8bWFpbkNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmhlbGxvd29ybGQuamF4cnMuQXBwPC9tYWluQ2xhc3M+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5yZWxlYXNlPC9pZD4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2hlbGxvd29ybGQtcHVyZS1qYXgtcnMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL2pheHJzL0FwcC5qYXZhIGIvZXhhbXBsZXMvaGVsbG93b3JsZC1wdXJlLWpheC1ycy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvamF4cnMvQXBwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JiMTkzYwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2hlbGxvd29ybGQtcHVyZS1qYXgtcnMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL2pheHJzL0FwcC5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuaGVsbG93b3JsZC5qYXhyczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuSW5ldFNvY2tldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuVVJJOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SdW50aW1lRGVsZWdhdGU7CisKK2ltcG9ydCBjb20uc3VuLm5ldC5odHRwc2VydmVyLkh0dHBIYW5kbGVyOworaW1wb3J0IGNvbS5zdW4ubmV0Lmh0dHBzZXJ2ZXIuSHR0cFNlcnZlcjsKKworLyoqCisgKiBIZWxsbyB3b3JsZCBhcHBsaWNhdGlvbiB1c2luZyBvbmx5IHRoZSBzdGFuZGFyZCBKQVgtUlMgQVBJIGFuZCBsaWdodHdlaWdodCBIVFRQIHNlcnZlciBidW5kbGVkIGluIEpESy4KKyAqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIEFwcCB7CisKKyAgICAvKioKKyAgICAgKiBTdGFydHMgdGhlIGxpZ2h0d2VpZ2h0IEhUVFAgc2VydmVyIHNlcnZpbmcgdGhlIEpBWC1SUyBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbmV3IGluc3RhbmNlIG9mIHRoZSBsaWdodHdlaWdodCBIVFRQIHNlcnZlcgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBzdGF0aWMgSHR0cFNlcnZlciBzdGFydFNlcnZlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBzZXJ2ZXIgbGlzdGVuaW5nIGF0IHBvcnQgODA4MAorICAgICAgICBmaW5hbCBIdHRwU2VydmVyIHNlcnZlciA9IEh0dHBTZXJ2ZXIuY3JlYXRlKG5ldyBJbmV0U29ja2V0QWRkcmVzcyhnZXRCYXNlVVJJKCkuZ2V0UG9ydCgpKSwgMCk7CisgICAgICAgIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmFkZFNodXRkb3duSG9vayhuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIHNlcnZlci5zdG9wKDApOworICAgICAgICAgICAgfQorICAgICAgICB9KSk7CisKKyAgICAgICAgLy8gY3JlYXRlIGEgaGFuZGxlciB3cmFwcGluZyB0aGUgSkFYLVJTIGFwcGxpY2F0aW9uCisgICAgICAgIEh0dHBIYW5kbGVyIGhhbmRsZXIgPSBSdW50aW1lRGVsZWdhdGUuZ2V0SW5zdGFuY2UoKS5jcmVhdGVFbmRwb2ludChuZXcgSmF4UnNBcHBsaWNhdGlvbigpLCBIdHRwSGFuZGxlci5jbGFzcyk7CisKKyAgICAgICAgLy8gbWFwIEpBWC1SUyBoYW5kbGVyIHRvIHRoZSBzZXJ2ZXIgcm9vdAorICAgICAgICBzZXJ2ZXIuY3JlYXRlQ29udGV4dChnZXRCYXNlVVJJKCkuZ2V0UGF0aCgpLCBoYW5kbGVyKTsKKworICAgICAgICAvLyBzdGFydCB0aGUgc2VydmVyCisgICAgICAgIHNlcnZlci5zdGFydCgpOworCisgICAgICAgIHJldHVybiBzZXJ2ZXI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXCJIZWxsbyBXb3JsZFwiIEplcnNleSBFeGFtcGxlIEFwcGxpY2F0aW9uIik7CisKKyAgICAgICAgc3RhcnRTZXJ2ZXIoKTsKKworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFwcGxpY2F0aW9uIHN0YXJ0ZWQuXG4iCisgICAgICAgICAgICAgICAgKyAiVHJ5IGFjY2Vzc2luZyAiICsgZ2V0QmFzZVVSSSgpICsgImhlbGxvd29ybGQgaW4gdGhlIGJyb3dzZXIuXG4iCisgICAgICAgICAgICAgICAgKyAiSGl0IGVudGVyIHRvIHN0b3AgdGhlIGFwcGxpY2F0aW9uLi4uIik7CisKKyAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5qb2luKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldFBvcnQoaW50IGRlZmF1bHRQb3J0KSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBwb3J0ID0gU3lzdGVtLmdldFByb3BlcnR5KCJqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQiKTsKKyAgICAgICAgaWYgKG51bGwgIT0gcG9ydCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludChwb3J0KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJWYWx1ZSBvZiBqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQgcHJvcGVydHkiCisgICAgICAgICAgICAgICAgICAgICAgICArICIgaXMgbm90IGEgdmFsaWQgcG9zaXRpdmUgaW50ZWdlciBbIiArIHBvcnQgKyAiXS4iCisgICAgICAgICAgICAgICAgICAgICAgICArICIgUmV2ZXJ0aW5nIHRvIGRlZmF1bHQgWyIgKyBkZWZhdWx0UG9ydCArICJdLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBkZWZhdWx0UG9ydDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGJhc2Uge0BsaW5rIFVSSX0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGJhc2Uge0BsaW5rIFVSSX0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBVUkkgZ2V0QmFzZVVSSSgpIHsKKyAgICAgICAgcmV0dXJuIFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdC8iKS5wb3J0KGdldFBvcnQoODA4MCkpLmJ1aWxkKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaGVsbG93b3JsZC1wdXJlLWpheC1ycy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvamF4cnMvSGVsbG9Xb3JsZFJlc291cmNlLmphdmEgYi9leGFtcGxlcy9oZWxsb3dvcmxkLXB1cmUtamF4LXJzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9qYXhycy9IZWxsb1dvcmxkUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTZmMjMzCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvaGVsbG93b3JsZC1wdXJlLWpheC1ycy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvamF4cnMvSGVsbG9Xb3JsZFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5oZWxsb3dvcmxkLmpheHJzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKKy8qKgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJoZWxsb3dvcmxkIikKK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkUmVzb3VyY2UgeworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMSUNIRURfTUVTU0FHRSA9ICJIZWxsbyBXb3JsZCEiOworCisgICAgQEdFVAorICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICBwdWJsaWMgU3RyaW5nIGdldEhlbGxvKCkgeworICAgICAgICByZXR1cm4gQ0xJQ0hFRF9NRVNTQUdFOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaGVsbG93b3JsZC1wdXJlLWpheC1ycy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvamF4cnMvSmF4UnNBcHBsaWNhdGlvbi5qYXZhIGIvZXhhbXBsZXMvaGVsbG93b3JsZC1wdXJlLWpheC1ycy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvamF4cnMvSmF4UnNBcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MGVhMWMKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9oZWxsb3dvcmxkLXB1cmUtamF4LXJzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9qYXhycy9KYXhSc0FwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5oZWxsb3dvcmxkLmpheHJzOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworLyoqCisgKiBKQVgtUlMgQXBwbGljYXRpb24gY2xhc3MgZm9yIHRoaXMgZXhhbXBsZS4KKyAqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIEpheFJzQXBwbGljYXRpb24gZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IGNsYXNzZXM7CisKKyAgICBwdWJsaWMgSmF4UnNBcHBsaWNhdGlvbigpIHsKKyAgICAgICAgSGFzaFNldDxDbGFzczw/Pj4gYyA9IG5ldyBIYXNoU2V0PENsYXNzPD8+PigpOworICAgICAgICBjLmFkZChIZWxsb1dvcmxkUmVzb3VyY2UuY2xhc3MpOworICAgICAgICBjbGFzc2VzID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KGMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgIHJldHVybiBjbGFzc2VzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2hlbGxvd29ybGQtcHVyZS1qYXgtcnMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL2pheHJzL0hlbGxvV29ybGRUZXN0LmphdmEgYi9leGFtcGxlcy9oZWxsb3dvcmxkLXB1cmUtamF4LXJzL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9qYXhycy9IZWxsb1dvcmxkVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NjJhNGYKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9oZWxsb3dvcmxkLXB1cmUtamF4LXJzL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9qYXhycy9IZWxsb1dvcmxkVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuaGVsbG93b3JsZC5qYXhyczsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK2ltcG9ydCBjb20uc3VuLm5ldC5odHRwc2VydmVyLkh0dHBTZXJ2ZXI7CisKKy8qKgorICogU2ltcGxlIHRlc3QgdG8gY29uZmlybSB0aGUgc2VydmVyIGlzIHJ1bm5pbmcgYW5kIHNlcnZpbmcgb3VyIHJlc291cmNlLgorICoKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZFRlc3QgeworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhlbGxvV29ybGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSHR0cFNlcnZlciBzZXJ2ZXIgPSBBcHAuc3RhcnRTZXJ2ZXIoKTsKKworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKS50YXJnZXQoQXBwLmdldEJhc2VVUkkoKSArICJoZWxsb3dvcmxkIik7CisgICAgICAgIGFzc2VydEVxdWFscyhIZWxsb1dvcmxkUmVzb3VyY2UuQ0xJQ0hFRF9NRVNTQUdFLCB0YXJnZXQucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9QTEFJTikuZ2V0KFN0cmluZy5jbGFzcykpOworCisgICAgICAgIHNlcnZlci5zdG9wKDApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2hlbGxvd29ybGQtc3ByaW5nLWFubm90YXRpb25zL1JFQURNRS5NRCBiL2V4YW1wbGVzL2hlbGxvd29ybGQtc3ByaW5nLWFubm90YXRpb25zL1JFQURNRS5NRApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTlhNTk1Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvaGVsbG93b3JsZC1zcHJpbmctYW5ub3RhdGlvbnMvUkVBRE1FLk1ECkBAIC0wLDAgKzEsMzcgQEAKK1svL106ICMgIiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIgorWy8vXTogIyAiICIKK1svL106ICMgIiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgIgorWy8vXTogIyAiIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0ICIKK1svL106ICMgIiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuICIKK1svL106ICMgIiAiCitbLy9dOiAjICIgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZSAiCisKK0plcnNleSBTcHJpbmcgSW50ZWdyYXRpb24gU3ByaW5nIEhlbGxvd29ybGQgV2ViQXBwIEV4YW1wbGUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gY3JlYXRlIHNpbXBsZSBKZXJzZXkgYXBwbGljYXRpb24gdGhhdAordXRpbGlzZXMgU3ByaW5nIDMgREkgZmVhdHVyZXMgYmFzZWQgb24gU3ByaW5nIGFubm90YXRpb25zLCBwYWNrYWdlZCBpbnRvIFdBUiBmaWxlLgorCitDb250ZW50cworLS0tLS0tLS0KKworVGhlIG1hcHBpbmcgb2YgdGhlIFVSSSBwYXRoIHNwYWNlIGlzIHByZXNlbnRlZCBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOgorCitVUkkgcGF0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBSZXNvdXJjZSBjbGFzcyAgICAgICAgICAgIHwgSFRUUCBtZXRob2RzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0KKyoqXy9zcHJpbmctcmVzb3VyY2VfKiogICAgICAgICAgICAgICAgICAgICB8IFNwcmluZ1JlcXVlc3RSZXNvdXJjZSAgICAgfCBHRVQKKyoqXy9zcHJpbmctcmVzb3VyY2UvZ29vZGJ5ZV8qKiAgICAgICAgICAgICB8IFNwcmluZ1JlcXVlc3RSZXNvdXJjZSAgICAgfCBHRVQKKyoqXy9zcHJpbmctcmVzb3VyY2Uvbm9yd2VnaWFuLWdvb2RieWVfKiogICB8IFNwcmluZ1JlcXVlc3RSZXNvdXJjZSAgICAgfCBHRVQKKworUnVubmluZyB0aGUgRXhhbXBsZQorLS0tLS0tLS0tLS0tLS0tLS0tLQorCitSdW4gdGhlIGV4YW1wbGUgYXMgZm9sbG93czoKKworPiAgICAgbXZuIGNsZWFuIGNvbXBpbGUgZXhlYzpqYXZhCisKK1RoaXMgZGVwbG95cyB0aGUgZXhhbXBsZSB1c2luZyBbR3JpenpseV0oaHR0cDovL2dyaXp6bHkuamF2YS5uZXQvKSBjb250YWluZXIuCisKKy0gICA8aHR0cDovL2xvY2FsaG9zdDo4MDgwL2Jhc2Uvc3ByaW5nLXJlc291cmNlPgorLSAgIDxodHRwOi8vbG9jYWxob3N0OjgwODAvYmFzZS9zcHJpbmctcmVzb3VyY2UvZ29vZGJ5ZT4KKy0gICA8aHR0cDovL2xvY2FsaG9zdDo4MDgwL2Jhc2Uvc3ByaW5nLXJlc291cmNlL25vcndlZ2lhbi1nb29kYnllPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2hlbGxvd29ybGQtc3ByaW5nLWFubm90YXRpb25zL3BvbS54bWwgYi9leGFtcGxlcy9oZWxsb3dvcmxkLXNwcmluZy1hbm5vdGF0aW9ucy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NWUzM2UKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9oZWxsb3dvcmxkLXNwcmluZy1hbm5vdGF0aW9ucy9wb20ueG1sCkBAIC0wLDAgKzEsMTA2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxwYXJlbnQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgICA8YXJ0aWZhY3RJZD5oZWxsb3dvcmxkLXNwcmluZy1hbm5vdGF0aW9uczwvYXJ0aWZhY3RJZD4KKyAgICA8ZGVzY3JpcHRpb24+U3ByaW5nIDQgSW50ZWdyYXRpb24gSmVyc2V5IEV4YW1wbGU8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1ncml6emx5Mi1odHRwPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWhrMjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1zcHJpbmc0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy13ZWI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3NwcmluZzQudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWxvZ2dpbmc8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxvZ2dpbmc8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjI8L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItaW5tZW1vcnk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmV4ZWMtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8bWFpbkNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmhlbGxvLnNwcmluZy5hbm5vdGF0aW9ucy5BcHA8L21haW5DbGFzcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnJlbGVhc2U8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD54bWwtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5kZWxheWVkLXN0cmF0ZWd5LXNraXAtdGVzdDwvaWQ+CisgICAgICAgICAgICA8YWN0aXZhdGlvbj4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgIDxuYW1lPm9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdGlvbi5tYW5hZ2VyLnN0cmF0ZWd5PC9uYW1lPgorICAgICAgICAgICAgICAgICAgICA8dmFsdWU+ZGVsYXllZDwvdmFsdWU+CisgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxza2lwVGVzdHM+dHJ1ZTwvc2tpcFRlc3RzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaGVsbG93b3JsZC1zcHJpbmctYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsby9zcHJpbmcvYW5ub3RhdGlvbnMvQXBwLmphdmEgYi9leGFtcGxlcy9oZWxsb3dvcmxkLXNwcmluZy1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvL3NwcmluZy9hbm5vdGF0aW9ucy9BcHAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTU2MDM0Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvaGVsbG93b3JsZC1zcHJpbmctYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsby9zcHJpbmcvYW5ub3RhdGlvbnMvQXBwLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5oZWxsby5zcHJpbmcuYW5ub3RhdGlvbnM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5Mi5odHRwc2VydmVyLkdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guZ3JpenpseS5odHRwLnNlcnZlci5IdHRwU2VydmVyOworCitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LmFubm90YXRpb24uQW5ub3RhdGlvbkNvbmZpZ0FwcGxpY2F0aW9uQ29udGV4dDsKKworLyoqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworcHVibGljIGNsYXNzIEFwcCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgQkFTRV9VUkkgPSBVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYmFzZS8iKTsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RfUEFUSCA9ICJiYXNlIjsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXCJIZWxsbyBXb3JsZFwiIEplcnNleS1TcHJpbmcgRXhhbXBsZSBBcHAiKTsKKworICAgICAgICAgICAgZmluYWwgSmVyc2V5Q29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IEplcnNleUNvbmZpZygpOworICAgICAgICAgICAgcmVzb3VyY2VDb25maWcucHJvcGVydHkoImNvbnRleHRDb25maWciLCBuZXcgQW5ub3RhdGlvbkNvbmZpZ0FwcGxpY2F0aW9uQ29udGV4dChTcHJpbmdBbm5vdGF0aW9uQ29uZmlnLmNsYXNzKSk7CisKKyAgICAgICAgICAgIGZpbmFsIEh0dHBTZXJ2ZXIgc2VydmVyID0gR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5LmNyZWF0ZUh0dHBTZXJ2ZXIoQkFTRV9VUkksIHJlc291cmNlQ29uZmlnLCBmYWxzZSk7CisgICAgICAgICAgICBSdW50aW1lLmdldFJ1bnRpbWUoKS5hZGRTaHV0ZG93bkhvb2sobmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIuc2h1dGRvd25Ob3coKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KSk7CisgICAgICAgICAgICBzZXJ2ZXIuc3RhcnQoKTsKKworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFN0cmluZy5mb3JtYXQoIkFwcGxpY2F0aW9uIHN0YXJ0ZWQuXG5Ucnkgb3V0ICVzJXNcblN0b3AgdGhlIGFwcGxpY2F0aW9uIHVzaW5nIENUUkwrQyIsCisgICAgICAgICAgICAgICAgICAgIEJBU0VfVVJJLCBST09UX1BBVEgpKTsKKworICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5qb2luKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIHwgSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoQXBwLmNsYXNzLmdldE5hbWUoKSkubG9nKExldmVsLlNFVkVSRSwgbnVsbCwgZXgpOworICAgICAgICB9CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9oZWxsb3dvcmxkLXNwcmluZy1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvL3NwcmluZy9hbm5vdGF0aW9ucy9FbmdsaXNoR29vZGJ5ZVNlcnZpY2UuamF2YSBiL2V4YW1wbGVzL2hlbGxvd29ybGQtc3ByaW5nLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG8vc3ByaW5nL2Fubm90YXRpb25zL0VuZ2xpc2hHb29kYnllU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNzE3NGEKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9oZWxsb3dvcmxkLXNwcmluZy1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvL3NwcmluZy9hbm5vdGF0aW9ucy9FbmdsaXNoR29vZGJ5ZVNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDIyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmhlbGxvLnNwcmluZy5hbm5vdGF0aW9uczsKKworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db21wb25lbnQ7CisKK0BDb21wb25lbnQKK3B1YmxpYyBjbGFzcyBFbmdsaXNoR29vZGJ5ZVNlcnZpY2UgaW1wbGVtZW50cyBHb29kYnllU2VydmljZSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdvb2RieWUoZmluYWwgU3RyaW5nIHdobykgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiZ29vZGJ5ZSwgJXMhIiwgd2hvKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9oZWxsb3dvcmxkLXNwcmluZy1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvL3NwcmluZy9hbm5vdGF0aW9ucy9Hb29kYnllU2VydmljZS5qYXZhIGIvZXhhbXBsZXMvaGVsbG93b3JsZC1zcHJpbmctYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsby9zcHJpbmcvYW5ub3RhdGlvbnMvR29vZGJ5ZVNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjU3ZDhhCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvaGVsbG93b3JsZC1zcHJpbmctYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsby9zcHJpbmcvYW5ub3RhdGlvbnMvR29vZGJ5ZVNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDE2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmhlbGxvLnNwcmluZy5hbm5vdGF0aW9uczsKKworcHVibGljIGludGVyZmFjZSBHb29kYnllU2VydmljZSB7CisKKyAgICBTdHJpbmcgZ29vZGJ5ZShTdHJpbmcgd2hvKTsKK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2hlbGxvd29ybGQtc3ByaW5nLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG8vc3ByaW5nL2Fubm90YXRpb25zL0dyZWV0aW5nU2VydmljZS5qYXZhIGIvZXhhbXBsZXMvaGVsbG93b3JsZC1zcHJpbmctYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsby9zcHJpbmcvYW5ub3RhdGlvbnMvR3JlZXRpbmdTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjEzZjEwNwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2hlbGxvd29ybGQtc3ByaW5nLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG8vc3ByaW5nL2Fubm90YXRpb25zL0dyZWV0aW5nU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuaGVsbG8uc3ByaW5nLmFubm90YXRpb25zOworCitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLlNlcnZpY2U7CisKKy8qKgorICogU2ltcGxlIGdyZWV0aW5nIHNlcnZpY2UKKyAqCisgKiBAYXV0aG9yIEdlb2Zmcm95IFdhcmluIChodHRwOi8vZ2Vvd2FyaW4uZ2l0aHViLmlvKQorICovCitAU2VydmljZQorcHVibGljIGNsYXNzIEdyZWV0aW5nU2VydmljZSB7CisgICAgcHVibGljIFN0cmluZyBncmVldChTdHJpbmcgd2hvKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJoZWxsbywgJXMhIiwgd2hvKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9oZWxsb3dvcmxkLXNwcmluZy1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvL3NwcmluZy9hbm5vdGF0aW9ucy9KZXJzZXlDb25maWcuamF2YSBiL2V4YW1wbGVzL2hlbGxvd29ybGQtc3ByaW5nLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG8vc3ByaW5nL2Fubm90YXRpb25zL0plcnNleUNvbmZpZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MmNhODYKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9oZWxsb3dvcmxkLXNwcmluZy1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvL3NwcmluZy9hbm5vdGF0aW9ucy9KZXJzZXlDb25maWcuamF2YQpAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmhlbGxvLnNwcmluZy5hbm5vdGF0aW9uczsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmcuc2NvcGUuUmVxdWVzdENvbnRleHRGaWx0ZXI7CisKKy8qKgorICogQSBzaW1wbGUgcGFja2FnZSBiYXNlZCBjb25maWd1cmF0aW9uCisgKgorICogQGF1dGhvciBHZW9mZnJveSBXYXJpbiAoaHR0cDovL2dlb3dhcmluLmdpdGh1Yi5pbykKKyAqLworcHVibGljIGNsYXNzIEplcnNleUNvbmZpZyBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKworICAgIHB1YmxpYyBKZXJzZXlDb25maWcoKSB7CisgICAgICAgIHJlZ2lzdGVyKFJlcXVlc3RDb250ZXh0RmlsdGVyLmNsYXNzKTsKKyAgICAgICAgcGFja2FnZXMoIm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmhlbGxvLnNwcmluZy5hbm5vdGF0aW9ucyIpOworICAgICAgICByZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaGVsbG93b3JsZC1zcHJpbmctYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsby9zcHJpbmcvYW5ub3RhdGlvbnMvTm9yd2VnaWFuR29vZGJ5ZVNlcnZpY2UuamF2YSBiL2V4YW1wbGVzL2hlbGxvd29ybGQtc3ByaW5nLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG8vc3ByaW5nL2Fubm90YXRpb25zL05vcndlZ2lhbkdvb2RieWVTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM1ZmUxOQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2hlbGxvd29ybGQtc3ByaW5nLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG8vc3ByaW5nL2Fubm90YXRpb25zL05vcndlZ2lhbkdvb2RieWVTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5oZWxsby5zcHJpbmcuYW5ub3RhdGlvbnM7CisKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OworCitAQ29tcG9uZW50CitwdWJsaWMgY2xhc3MgTm9yd2VnaWFuR29vZGJ5ZVNlcnZpY2UgaW1wbGVtZW50cyBHb29kYnllU2VydmljZSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdvb2RieWUoZmluYWwgU3RyaW5nIHdobykgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiaGFkZXQsICVzISIsIHdobyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaGVsbG93b3JsZC1zcHJpbmctYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsby9zcHJpbmcvYW5ub3RhdGlvbnMvU3ByaW5nQW5ub3RhdGlvbkNvbmZpZy5qYXZhIGIvZXhhbXBsZXMvaGVsbG93b3JsZC1zcHJpbmctYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsby9zcHJpbmcvYW5ub3RhdGlvbnMvU3ByaW5nQW5ub3RhdGlvbkNvbmZpZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZTYzZjAKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9oZWxsb3dvcmxkLXNwcmluZy1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvL3NwcmluZy9hbm5vdGF0aW9ucy9TcHJpbmdBbm5vdGF0aW9uQ29uZmlnLmphdmEKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5oZWxsby5zcHJpbmcuYW5ub3RhdGlvbnM7CisKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuYW5ub3RhdGlvbi5Db21wb25lbnRTY2FuOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5hbm5vdGF0aW9uLkNvbmZpZ3VyYXRpb247CisKKy8qKgorICogU3ByaW5nIGNvbmZpZ3VyYXRpb24gdG8gaW5jbHVkZSBvdXIgc2VydmljZXMKKyAqCisgKiBAYXV0aG9yIEdlb2Zmcm95IFdhcmluIChodHRwOi8vZ2Vvd2FyaW4uZ2l0aHViLmlvKQorICovCitAQ29uZmlndXJhdGlvbgorQENvbXBvbmVudFNjYW4oYmFzZVBhY2thZ2VDbGFzc2VzID0ge0dyZWV0aW5nU2VydmljZS5jbGFzc30pCitwdWJsaWMgY2xhc3MgU3ByaW5nQW5ub3RhdGlvbkNvbmZpZyB7Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9oZWxsb3dvcmxkLXNwcmluZy1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvL3NwcmluZy9hbm5vdGF0aW9ucy9TcHJpbmdSZXF1ZXN0UmVzb3VyY2UuamF2YSBiL2V4YW1wbGVzL2hlbGxvd29ybGQtc3ByaW5nLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG8vc3ByaW5nL2Fubm90YXRpb25zL1NwcmluZ1JlcXVlc3RSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZGJiYmUKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9oZWxsb3dvcmxkLXNwcmluZy1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvL3NwcmluZy9hbm5vdGF0aW9ucy9TcHJpbmdSZXF1ZXN0UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5oZWxsby5zcHJpbmcuYW5ub3RhdGlvbnM7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uQXV0b3dpcmVkOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5TZXJ2aWNlOworCisvKioKKyAqIEludGVncmF0aW9uIG9mIGplcnNleSBhbmQgc3ByaW5nLgorICogVGhpcyByZXN0IGNvbnRyb2xsZXIgaXMgYSBzaW5nbGV0b24gc3ByaW5nIGJlYW4gd2l0aCBhdXRvd2lyZWQgZGVwZW5kZW5jaWVzCisgKiBmcm9tIHNwcmluZworICoKKyAqIEBhdXRob3IgR2VvZmZyb3kgV2FyaW4gKGh0dHA6Ly9nZW93YXJpbi5naXRodWIuaW8pCisgKi8KK0BTaW5nbGV0b24KK0BQYXRoKCJzcHJpbmctcmVzb3VyY2UiKQorQFNlcnZpY2UKK3B1YmxpYyBjbGFzcyBTcHJpbmdSZXF1ZXN0UmVzb3VyY2UgeworCisgICAgQXRvbWljSW50ZWdlciBjb3VudGVyID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKworICAgIEBBdXRvd2lyZWQKKyAgICBwcml2YXRlIEdyZWV0aW5nU2VydmljZSBncmVldGluZ1NlcnZpY2U7CisKKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBMaXN0PEdvb2RieWVTZXJ2aWNlPiBnb29kYnllU2VydmljZXNMaXN0OworICAgIEBBdXRvd2lyZWQKKyAgICBwcml2YXRlIFNldDxHb29kYnllU2VydmljZT4gZ29vZGJ5ZVNlcnZpY2VzU2V0OworCisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgTGlzdDxHb29kYnllU2VydmljZT4gZ29vZGJ5ZVNlcnZpY2VzSXRlcmFibGU7CisKKworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgcHVibGljIFN0cmluZyBnZXRIZWxsbygpIHsKKyAgICAgICAgcmV0dXJuIGdyZWV0aW5nU2VydmljZS5ncmVldCgid29ybGQgIiArIGNvdW50ZXIuaW5jcmVtZW50QW5kR2V0KCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja0ludGVncml0eSgpIHsKKyAgICAgICAgZmluYWwgSXRlcmF0b3I8R29vZGJ5ZVNlcnZpY2U+IGl0ID0gZ29vZGJ5ZVNlcnZpY2VzSXRlcmFibGUuaXRlcmF0b3IoKTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisKKyAgICAgICAgICAgIGZpbmFsIEdvb2RieWVTZXJ2aWNlIHMxID0gaXQubmV4dCgpOworICAgICAgICAgICAgZmluYWwgR29vZGJ5ZVNlcnZpY2UgczIgPSBnb29kYnllU2VydmljZXNMaXN0LmdldChpKTsKKyAgICAgICAgICAgIGlmIChzMSAhPSBzMikgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKCJJbnN0YW5jZSBvZiBzZXJ2aWNlIHMxICgiICsgczEuZ2V0Q2xhc3MoKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiKSBpcyBub3QgZXF1YWwgdG8gc2VydmljZSBzMigiICsgczIuZ2V0Q2xhc3MoKSArICIpIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpKys7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZ29vZGJ5ZVNlcnZpY2VzTGlzdC5zaXplKCkgIT0gZ29vZGJ5ZVNlcnZpY2VzU2V0LnNpemUoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oIlNpemUgb2Ygc2V0IGFuZCBzaXplIG9mIHRoZSBsaXN0IGRpZmZlcnMuIGxpc3Q9IiArIGdvb2RieWVTZXJ2aWNlc0xpc3Quc2l6ZSgpCisgICAgICAgICAgICAgICAgICAgICsgIjsgc2V0PSIgKyBnb29kYnllU2VydmljZXNTZXQuc2l6ZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgR29vZGJ5ZVNlcnZpY2UgZ2V0U2VydmljZShDbGFzczw/PiBzZXJ2aWNlQ2xhc3MpIHsKKyAgICAgICAgZm9yIChHb29kYnllU2VydmljZSBzZXJ2aWNlIDogZ29vZGJ5ZVNlcnZpY2VzTGlzdCkgeworICAgICAgICAgICAgaWYgKHNlcnZpY2VDbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHNlcnZpY2UuZ2V0Q2xhc3MoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAUGF0aCgiZ29vZGJ5ZSIpCisgICAgQEdFVAorICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICBwdWJsaWMgU3RyaW5nIGdldEdvb2RieWUoKSB7CisgICAgICAgIGNoZWNrSW50ZWdyaXR5KCk7CisKKyAgICAgICAgZmluYWwgR29vZGJ5ZVNlcnZpY2UgZ29vZGJ5ZVNlcnZpY2UgPSBnZXRTZXJ2aWNlKEVuZ2xpc2hHb29kYnllU2VydmljZS5jbGFzcyk7CisgICAgICAgIHJldHVybiBnb29kYnllU2VydmljZS5nb29kYnllKCJjcnVlbCB3b3JsZCIpOworICAgIH0KKworICAgIEBQYXRoKCJub3J3ZWdpYW4tZ29vZGJ5ZSIpCisgICAgQEdFVAorICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5vcndlZ2lhbkdvb2RieWUoKSB7CisgICAgICAgIGNoZWNrSW50ZWdyaXR5KCk7CisgICAgICAgIHJldHVybiBnZXRTZXJ2aWNlKE5vcndlZ2lhbkdvb2RieWVTZXJ2aWNlLmNsYXNzKS5nb29kYnllKCJww6UgYmFkZXQiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9oZWxsb3dvcmxkLXNwcmluZy1hbm5vdGF0aW9ucy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvL3NwcmluZy9hbm5vdGF0aW9ucy9TcHJpbmdSZXF1ZXN0UmVzb3VyY2VUZXN0LmphdmEgYi9leGFtcGxlcy9oZWxsb3dvcmxkLXNwcmluZy1hbm5vdGF0aW9ucy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvL3NwcmluZy9hbm5vdGF0aW9ucy9TcHJpbmdSZXF1ZXN0UmVzb3VyY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY2ZmQ0YQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2hlbGxvd29ybGQtc3ByaW5nLWFubm90YXRpb25zL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG8vc3ByaW5nL2Fubm90YXRpb25zL1NwcmluZ1JlcXVlc3RSZXNvdXJjZVRlc3QuamF2YQpAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmhlbGxvLnNwcmluZy5hbm5vdGF0aW9uczsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5BcHBsaWNhdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LmFubm90YXRpb24uQW5ub3RhdGlvbkNvbmZpZ0FwcGxpY2F0aW9uQ29udGV4dDsKKworLyoqCisgKiBUZXN0aW5nIG91ciBzZXJ2aWNlIHdpdGggb3VyIGFubm90YXRpb24gY29udGV4dCBiZWluZyBwYXNzZWQgZGlyZWN0bHkgdG8gamVyc2V5LXNwcmluZworICoKKyAqIEBhdXRob3IgR2VvZmZyb3kgV2FyaW4gKGh0dHA6Ly9nZW93YXJpbi5naXRodWIuaW8pCisgKi8KK3B1YmxpYyBjbGFzcyBTcHJpbmdSZXF1ZXN0UmVzb3VyY2VUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBBcHBsaWNhdGlvbkNvbnRleHQgY29udGV4dCA9IG5ldyBBbm5vdGF0aW9uQ29uZmlnQXBwbGljYXRpb25Db250ZXh0KFNwcmluZ0Fubm90YXRpb25Db25maWcuY2xhc3MpOworICAgICAgICByZXR1cm4gbmV3IEplcnNleUNvbmZpZygpLnByb3BlcnR5KCJjb250ZXh0Q29uZmlnIiwgY29udGV4dCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R3JlZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGdyZWV0aW5nID0gdGFyZ2V0KCJzcHJpbmctcmVzb3VyY2UiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImhlbGxvLCB3b3JsZCAxISIsIGdyZWV0aW5nKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGdyZWV0aW5nMiA9IHRhcmdldCgic3ByaW5nLXJlc291cmNlIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJoZWxsbywgd29ybGQgMiEiLCBncmVldGluZzIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdvb2RieWUoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBnb29kYnllID0gdGFyZ2V0KCJzcHJpbmctcmVzb3VyY2UiKS5wYXRoKCJnb29kYnllIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJnb29kYnllLCBjcnVlbCB3b3JsZCEiLCBnb29kYnllKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIG5vcndlZ2lhbkdvb2RieWUgPSB0YXJnZXQoInNwcmluZy1yZXNvdXJjZSIpLnBhdGgoIm5vcndlZ2lhbi1nb29kYnllIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJoYWRldCwgcMOlIGJhZGV0ISIsIG5vcndlZ2lhbkdvb2RieWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2hlbGxvd29ybGQtc3ByaW5nLXdlYmFwcC9SRUFETUUuTUQgYi9leGFtcGxlcy9oZWxsb3dvcmxkLXNwcmluZy13ZWJhcHAvUkVBRE1FLk1ECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZjA3ZjcKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9oZWxsb3dvcmxkLXNwcmluZy13ZWJhcHAvUkVBRE1FLk1ECkBAIC0wLDAgKzEsNDMgQEAKK1svL106ICMgIiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIgorWy8vXTogIyAiICIKK1svL106ICMgIiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgIgorWy8vXTogIyAiIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0ICIKK1svL106ICMgIiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuICIKK1svL106ICMgIiAiCitbLy9dOiAjICIgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZSAiCisKK0plcnNleSBTcHJpbmcgSW50ZWdyYXRpb24gU3ByaW5nIEhlbGxvd29ybGQgV2ViQXBwIEV4YW1wbGUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gY3JlYXRlIHNpbXBsZSBKZXJzZXkgYXBwbGljYXRpb24gdGhhdAordXRpbGlzZXMgU3ByaW5nIDMgREkgZmVhdHVyZXMsIHBhY2thZ2VkIGludG8gV0FSIGZpbGUuCisKK0NvbnRlbnRzCistLS0tLS0tLQorCitUaGUgbWFwcGluZyBvZiB0aGUgVVJJIHBhdGggc3BhY2UgaXMgcHJlc2VudGVkIGluIHRoZSBmb2xsb3dpbmcgdGFibGU6CisKK1VSSSBwYXRoICAgICAgICAgICAgICAgICAgICAgICAgfCBSZXNvdXJjZSBjbGFzcyAgICAgICAgICAgIHwgSFRUUCBtZXRob2RzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tCisqKl8vamVyc2V5LWhlbGxvXyoqICAgICAgICAgICAgIHwgSmVyc2V5UmVzb3VyY2UgICAgICAgICAgICB8IEdFVAorKipfL3NwcmluZy1oZWxsb18qKiAgICAgICAgICAgICB8IFNwcmluZ1JlcXVlc3RSZXNvdXJjZSAgICAgfCBHRVQKKyoqXy9zcHJpbmctc2luZ2xldG9uLWhlbGxvXyoqICAgfCBTcHJpbmdTaW5nbGV0b25SZXNvdXJjZSAgIHwgR0VUCisKK0FwcGxpY2F0aW9uIGlzIGNvbmZpZ3VyZWQgYnkgdXNpbmcgd2ViLnhtbCwgd2hpY2ggcmVnaXN0ZXJzCitbamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbl0oaHR0cHM6Ly9qYXgtcnMtc3BlYy5qYXZhLm5ldC9ub25hdi8yLjAvYXBpZG9jcy9qYXZheC93cy9ycy9jb3JlL0FwcGxpY2F0aW9uLmh0bWwpCitkZXNjZW5kYW50IHRvIGdldCBjbGFzc2VzIGFuZCBzaW5nbGV0b25zIGZyb20gaXQgKHNlZSBjbGFzcworTXlBcHBsaWNhdGlvbikuCisKK1J1bm5pbmcgdGhlIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworUnVuIHRoZSBleGFtcGxlIGFzIGZvbGxvd3M6CisKKz4gICAgIG12biBjbGVhbiBwYWNrYWdlIGpldHR5OnJ1bgorCitUaGlzIGRlcGxveXMgY3VycmVudCBleGFtcGxlIHVzaW5nIEpldHR5IHdlYiBzZXJ2ZXIuIE9uY2UgZGVwbG95ZWQsIHRoZQorYXBwbGljYXRpb24gaXMgcmVhZHkgdG8gc2VydmUgdGhlIGZvbGxvd2luZyByZXNvdXJjZXM6CisKKy0gICA8aHR0cDovL2xvY2FsaG9zdDo4MDgwL2hlbGxvd29ybGQtc3ByaW5nLXdlYmFwcC9qZXJzZXktaGVsbG8+CistICAgPGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9oZWxsb3dvcmxkLXNwcmluZy13ZWJhcHAvc3ByaW5nLWhlbGxvPgorLSAgIDxodHRwOi8vbG9jYWxob3N0OjgwODAvaGVsbG93b3JsZC1zcHJpbmctd2ViYXBwL3NwcmluZy1zaW5nbGV0b24taGVsbG8+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaGVsbG93b3JsZC1zcHJpbmctd2ViYXBwL3BvbS54bWwgYi9leGFtcGxlcy9oZWxsb3dvcmxkLXNwcmluZy13ZWJhcHAvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWY4ODJmCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvaGVsbG93b3JsZC1zcHJpbmctd2ViYXBwL3BvbS54bWwKQEAgLTAsMCArMSwxMTMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPCEtLSBUaGVyZSBpcyBwcm9ibGVtIHRvIHJ1biBTcHJpbmcgZXhhbXBsZSBvbiBHRiAtIGh0dHBzOi8vamF2YS5uZXQvamlyYS9icm93c2UvSkVSU0VZLTIwMzIKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+d2ViYXBwLWV4YW1wbGUtcGFyZW50PC9hcnRpZmFjdElkPgorICAgICAgICA8cmVsYXRpdmVQYXRoPi4uL3dlYmFwcC1leGFtcGxlLXBhcmVudC9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+CisgICAgICAgIDx2ZXJzaW9uPjIuMi1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKyAgICAtLT4KKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmhlbGxvd29ybGQtc3ByaW5nLXdlYmFwcDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS1leGFtcGxlcy1oZWxsb3dvcmxkLXNwcmluZy13ZWJhcHA8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+U3ByaW5nIDQgSW50ZWdyYXRpb24gSmVyc2V5IEV4YW1wbGU8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWhrMjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctd2ViPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtzcHJpbmc0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWxvZ2dpbmc8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxvZ2dpbmc8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjI8L3ZlcnNpb24+CisgICAgICAgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXNwcmluZzQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGktMi41PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtqZXR0eS5zZXJ2bGV0LmFwaS4yNS52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8IS0tIFJ1biB0aGUgYXBwbGljYXRpb24gdXNpbmcgIm12biBqZXR0eTpydW4iIHRvIGRlcGxveSB0byBKZXR0eS0tPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qZXR0eS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnJlbGVhc2U8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD54bWwtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2hlbGxvd29ybGQtc3ByaW5nLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvc3ByaW5nL0N1c3RvbUV4Y2VwdGlvbk1hcHBlci5qYXZhIGIvZXhhbXBsZXMvaGVsbG93b3JsZC1zcHJpbmctd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9zcHJpbmcvQ3VzdG9tRXhjZXB0aW9uTWFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWMxZTZiNAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2hlbGxvd29ybGQtc3ByaW5nLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvc3ByaW5nL0N1c3RvbUV4Y2VwdGlvbk1hcHBlci5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuaGVsbG93b3JsZC5zcHJpbmc7CisKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuRXhjZXB0aW9uTWFwcGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworLyoqCisgKiBFeGNlcHRpb24gbWFwcGVyIHRvIGNvbnZlcnQge0BsaW5rIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbn0gaW50byBhIHRleHR1YWwgcmVzcG9uc2UuCisgKgorICogQGF1dGhvciBNYXJrbyBBc3BsdW5kIChtYXJrby5hc3BsdW5kIGF0IHlhaG9vLmNvbSkKKyAqLworQFByb3ZpZGVyCitwdWJsaWMgY2xhc3MgQ3VzdG9tRXhjZXB0aW9uTWFwcGVyIGltcGxlbWVudHMgRXhjZXB0aW9uTWFwcGVyPElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbj4geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc3BvbnNlIHRvUmVzcG9uc2UoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soIklsbGVnYWwgQXJndW1lbnQgRXhjZXB0aW9uIENhdWdodCIpLmJ1aWxkKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaGVsbG93b3JsZC1zcHJpbmctd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9zcHJpbmcvRGF0ZVRpbWVTZXJ2aWNlLmphdmEgYi9leGFtcGxlcy9oZWxsb3dvcmxkLXNwcmluZy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL3NwcmluZy9EYXRlVGltZVNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmMzYTQyCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvaGVsbG93b3JsZC1zcHJpbmctd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9zcHJpbmcvRGF0ZVRpbWVTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5oZWxsb3dvcmxkLnNwcmluZzsKKworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCisvKioKKyAqIFNpbXBsZSBkYXRlIHNlcnZpY2UgdGhhdCBwcm92aWRlcyBhY3R1YWwgdGltZSBhbmQgZGF0ZSBpbmZvLgorICoKKyAqIEBhdXRob3IgTWFya28gQXNwbHVuZCAobWFya28uYXNwbHVuZCBhdCB5YWhvby5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBEYXRlVGltZVNlcnZpY2UgeworCisgICAgLyoqCisgICAgICogR2V0IGN1cnJlbnQgZGF0ZSBhbmQgdGltZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gY3VycmVudCBkYXRlLgorICAgICAqLworICAgIHB1YmxpYyBEYXRlIGdldERhdGVUaW1lKCkgeworICAgICAgICByZXR1cm4gbmV3IERhdGUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9oZWxsb3dvcmxkLXNwcmluZy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL3NwcmluZy9HcmVldGluZ1NlcnZpY2UuamF2YSBiL2V4YW1wbGVzL2hlbGxvd29ybGQtc3ByaW5nLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvc3ByaW5nL0dyZWV0aW5nU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhOWY3MTkKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9oZWxsb3dvcmxkLXNwcmluZy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL3NwcmluZy9HcmVldGluZ1NlcnZpY2UuamF2YQpAQCAtMCwwICsxLDI3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmhlbGxvd29ybGQuc3ByaW5nOworCisvKioKKyAqIFNpbXBsZSBncmVldGluZyBzZXJ2aWNlLgorICoKKyAqIEBhdXRob3IgTWFya28gQXNwbHVuZCAobWFya28uYXNwbHVuZCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgaW50ZXJmYWNlIEdyZWV0aW5nU2VydmljZSB7CisKKyAgICAvKioKKyAgICAgKiBXb3Jrb3V0IGEgZ3JlZXRpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd2hvIHRvIGdyZWV0LgorICAgICAqIEByZXR1cm4gZ3JlZXRpbmcuCisgICAgICovCisgICAgU3RyaW5nIGdyZWV0KFN0cmluZyB3aG8pOworfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaGVsbG93b3JsZC1zcHJpbmctd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9zcHJpbmcvR3JlZXRpbmdTZXJ2aWNlSW1wbC5qYXZhIGIvZXhhbXBsZXMvaGVsbG93b3JsZC1zcHJpbmctd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9zcHJpbmcvR3JlZXRpbmdTZXJ2aWNlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNTRkMmEKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9oZWxsb3dvcmxkLXNwcmluZy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL3NwcmluZy9HcmVldGluZ1NlcnZpY2VJbXBsLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5oZWxsb3dvcmxkLnNwcmluZzsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CisKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ7CisKKy8qKgorICogU2ltcGxlIHtAbGluayBHcmVldGluZ1NlcnZpY2V9IGltcGxlbWVudGF0aW9uIHRvIGp1c3Qgc2F5IGhlbGxvLgorICoKKyAqIEBhdXRob3IgTWFya28gQXNwbHVuZCAobWFya28uYXNwbHVuZCBhdCB5YWhvby5jb20pCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgR3JlZXRpbmdTZXJ2aWNlSW1wbCBpbXBsZW1lbnRzIEdyZWV0aW5nU2VydmljZSB7CisKKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBIdHRwU2VydmxldFJlcXVlc3Qgc2VydmxldFJlcXVlc3Q7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdyZWV0KFN0cmluZyB3aG8pIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHNlcnZlck5hbWUgPSBzZXJ2bGV0UmVxdWVzdC5nZXRTZXJ2ZXJOYW1lKCk7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJoZWxsbywgJXMhIEdyZWV0aW5ncyBmcm9tIHNlcnZlciAlcyEiLCB3aG8sIHNlcnZlck5hbWUpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaGVsbG93b3JsZC1zcHJpbmctd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9zcHJpbmcvSmVyc2V5UmVzb3VyY2UuamF2YSBiL2V4YW1wbGVzL2hlbGxvd29ybGQtc3ByaW5nLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvc3ByaW5nL0plcnNleVJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMwNDM5YwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2hlbGxvd29ybGQtc3ByaW5nLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvc3ByaW5nL0plcnNleVJlc291cmNlLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5oZWxsb3dvcmxkLnNwcmluZzsKKworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ7CisKKy8qKgorICogSmVyc2V5IFNwcmluZyBpbnRlZ3JhdGlvbiBleGFtcGxlLgorICogRGVtb25zdHJhdGUgaG93IHRvIGluamVjdCBhIFNwcmluZyBiZWFuIGludG8gYSBKZXJzZXkgbWFuYWdlZCBKQVgtUlMgcmVzb3VyY2UgY2xhc3MuCisgKgorICogQGF1dGhvciBNYXJrbyBBc3BsdW5kIChtYXJrby5hc3BsdW5kIGF0IGdtYWlsLmNvbSkKKyAqLworQFBhdGgoImplcnNleS1oZWxsbyIpCitwdWJsaWMgY2xhc3MgSmVyc2V5UmVzb3VyY2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEplcnNleVJlc291cmNlLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBHcmVldGluZ1NlcnZpY2UgZ3JlZXRpbmdTZXJ2aWNlOworCisgICAgQEluamVjdAorICAgIHByaXZhdGUgRGF0ZVRpbWVTZXJ2aWNlIHRpbWVTZXJ2aWNlOworCisgICAgcHVibGljIEplcnNleVJlc291cmNlKCkgeworICAgICAgICBMT0dHRVIuZmluZSgiSGVsbG9Xb3JsZFJlc291cmNlKCkiKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0SGVsbG8oKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlczogJXMiLCB0aW1lU2VydmljZS5nZXREYXRlVGltZSgpLCBncmVldGluZ1NlcnZpY2UuZ3JlZXQoIndvcmxkIikpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaGVsbG93b3JsZC1zcHJpbmctd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9zcHJpbmcvTXlBcHBsaWNhdGlvbi5qYXZhIGIvZXhhbXBsZXMvaGVsbG93b3JsZC1zcHJpbmctd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9zcHJpbmcvTXlBcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwN2IyMjUKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9oZWxsb3dvcmxkLXNwcmluZy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL3NwcmluZy9NeUFwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5oZWxsb3dvcmxkLnNwcmluZzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLnNjb3BlLlJlcXVlc3RDb250ZXh0RmlsdGVyOworCisvKioKKyAqIFNwcmluZyBIZWxsb1dvcmxkIFdlYiBBcHBsaWNhdGlvbiBjb25maWd1cmF0aW9uLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBNeUFwcGxpY2F0aW9uIGV4dGVuZHMgUmVzb3VyY2VDb25maWcgeworCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgSkFYLVJTIGFwcGxpY2F0aW9uIGNvbXBvbmVudHMuCisgICAgICovCisgICAgcHVibGljIE15QXBwbGljYXRpb24oKSB7CisgICAgICAgIHJlZ2lzdGVyKFJlcXVlc3RDb250ZXh0RmlsdGVyLmNsYXNzKTsKKyAgICAgICAgcmVnaXN0ZXIoSmVyc2V5UmVzb3VyY2UuY2xhc3MpOworICAgICAgICByZWdpc3RlcihTcHJpbmdTaW5nbGV0b25SZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJlZ2lzdGVyKFNwcmluZ1JlcXVlc3RSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJlZ2lzdGVyKEN1c3RvbUV4Y2VwdGlvbk1hcHBlci5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaGVsbG93b3JsZC1zcHJpbmctd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9zcHJpbmcvU3ByaW5nUmVxdWVzdFJlc291cmNlLmphdmEgYi9leGFtcGxlcy9oZWxsb3dvcmxkLXNwcmluZy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL3NwcmluZy9TcHJpbmdSZXF1ZXN0UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTg3YTg1Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvaGVsbG93b3JsZC1zcHJpbmctd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9zcHJpbmcvU3ByaW5nUmVxdWVzdFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5oZWxsb3dvcmxkLnNwcmluZzsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uQXV0b3dpcmVkOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db21wb25lbnQ7CisKKy8qKgorICogSmVyc2V5IFNwcmluZyBpbnRlZ3JhdGlvbiBleGFtcGxlLgorICogRGVtb25zdHJhdGUgaG93IHRvIHVzZSBTcHJpbmcgbWFuYWdlZCBKQVgtUlMgcmVzb3VyY2UgY2xhc3Mgd2l0aCByZXF1ZXN0IHNjb3BlICgrIFNwcmluZyBiZWFuIERJKS4KKyAqCisgKiBAYXV0aG9yIE1hcmtvIEFzcGx1bmQgKG1hcmtvLmFzcGx1bmQgYXQgZ21haWwuY29tKQorICovCitAUGF0aCgic3ByaW5nLWhlbGxvIikKK0BDb21wb25lbnQKK3B1YmxpYyBjbGFzcyBTcHJpbmdSZXF1ZXN0UmVzb3VyY2UgeworCisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgR3JlZXRpbmdTZXJ2aWNlIGdyZWV0aW5nU2VydmljZTsKKworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgcHVibGljIFN0cmluZyBnZXRIZWxsbygpIHsKKyAgICAgICAgcmV0dXJuIGdyZWV0aW5nU2VydmljZS5ncmVldCgid29ybGQiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9oZWxsb3dvcmxkLXNwcmluZy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL3NwcmluZy9TcHJpbmdTaW5nbGV0b25SZXNvdXJjZS5qYXZhIGIvZXhhbXBsZXMvaGVsbG93b3JsZC1zcHJpbmctd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9zcHJpbmcvU3ByaW5nU2luZ2xldG9uUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTkxZDYzCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvaGVsbG93b3JsZC1zcHJpbmctd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9zcHJpbmcvU3ByaW5nU2luZ2xldG9uUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmhlbGxvd29ybGQuc3ByaW5nOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OworCisvKioKKyAqIEplcnNleSBTcHJpbmcgaW50ZWdyYXRpb24gZXhhbXBsZS4KKyAqIERlbW9uc3RyYXRlIGhvdyB0byB1c2UgU3ByaW5nIG1hbmFnZWQgSkFYLVJTIHJlc291cmNlIGNsYXNzIHdpdGggc2luZ2xldG9uIHNjb3BlICgrIFNwcmluZyBiZWFuIERJKS4KKyAqCisgKiBAYXV0aG9yIE1hcmtvIEFzcGx1bmQgKG1hcmtvLmFzcGx1bmQgYXQgZ21haWwuY29tKQorICovCitAUGF0aCgic3ByaW5nLXNpbmdsZXRvbi1oZWxsbyIpCitAQ29tcG9uZW50CitAU2luZ2xldG9uCitwdWJsaWMgY2xhc3MgU3ByaW5nU2luZ2xldG9uUmVzb3VyY2UgeworCisgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNJbnRlZ2VyIGNvdW50ZXIgPSBuZXcgQXRvbWljSW50ZWdlcigpOworCisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgR3JlZXRpbmdTZXJ2aWNlIGdyZWV0aW5nU2VydmljZTsKKworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgcHVibGljIFN0cmluZyBnZXRIZWxsbyhAQ29udGV4dCBIdHRwSGVhZGVycyBoZWFkZXJzLCBAUXVlcnlQYXJhbSgicDEiKSBTdHJpbmcgcDEpIHsKKyAgICAgICAgaWYgKCJmb29iYXIiLmVxdWFscyhwMSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImZvb2JhciBpcyBpbGxlZ2FsIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiVkOiAlcyIsIGNvdW50ZXIuaW5jcmVtZW50QW5kR2V0KCksIGdyZWV0aW5nU2VydmljZS5ncmVldCgid29ybGQiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaGVsbG93b3JsZC1zcHJpbmctd2ViYXBwL3NyYy9tYWluL3Jlc291cmNlcy9hcHBsaWNhdGlvbkNvbnRleHQueG1sIGIvZXhhbXBsZXMvaGVsbG93b3JsZC1zcHJpbmctd2ViYXBwL3NyYy9tYWluL3Jlc291cmNlcy9hcHBsaWNhdGlvbkNvbnRleHQueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhM2ZmZDEKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9oZWxsb3dvcmxkLXNwcmluZy13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL2FwcGxpY2F0aW9uQ29udGV4dC54bWwKQEAgLTAsMCArMSwzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisKKy0tPgorCis8YmVhbnMgeG1sbnM9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMiCisgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMKKyAgICAgICBodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zL3NwcmluZy1iZWFucy54c2QiPgorCisgICAgPGJlYW4gaWQ9ImdyZWV0aW5nU2VydmljZSIgY2xhc3M9Im9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmhlbGxvd29ybGQuc3ByaW5nLkdyZWV0aW5nU2VydmljZUltcGwiLz4KKworICAgIDxiZWFuIGNsYXNzPSJvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWRBbm5vdGF0aW9uQmVhblBvc3RQcm9jZXNzb3IiIC8+CisKKyAgICA8YmVhbiBjbGFzcz0ib3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuaGVsbG93b3JsZC5zcHJpbmcuRGF0ZVRpbWVTZXJ2aWNlIiBzY29wZT0icmVxdWVzdCIvPgorCisgICAgPGJlYW4gY2xhc3M9Im9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmhlbGxvd29ybGQuc3ByaW5nLlNwcmluZ1NpbmdsZXRvblJlc291cmNlIi8+CisKKyAgICA8YmVhbiBjbGFzcz0ib3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuaGVsbG93b3JsZC5zcHJpbmcuU3ByaW5nUmVxdWVzdFJlc291cmNlIiBzY29wZT0icmVxdWVzdCIvPgorCisgICAgPGJlYW4gY2xhc3M9Im9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmhlbGxvd29ybGQuc3ByaW5nLkN1c3RvbUV4Y2VwdGlvbk1hcHBlciIvPgorCis8L2JlYW5zPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaGVsbG93b3JsZC1zcHJpbmctd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi9leGFtcGxlcy9oZWxsb3dvcmxkLXNwcmluZy13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2JiNmE1Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvaGVsbG93b3JsZC1zcHJpbmctd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSw0MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIzLjAiIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCisgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfM18wLnhzZCI+CisKKyAgICA8bW9kdWxlLW5hbWU+aGVsbG93b3JsZC1zcHJpbmc8L21vZHVsZS1uYW1lPgorCisgICAgPGxpc3RlbmVyPgorICAgICAgICA8bGlzdGVuZXItY2xhc3M+b3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuY29udGV4dC5Db250ZXh0TG9hZGVyTGlzdGVuZXI8L2xpc3RlbmVyLWNsYXNzPgorICAgIDwvbGlzdGVuZXI+CisKKyAgICA8Y29udGV4dC1wYXJhbT4KKyAgICAgICAgPHBhcmFtLW5hbWU+Y29udGV4dENvbmZpZ0xvY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICA8cGFyYW0tdmFsdWU+Y2xhc3NwYXRoOmFwcGxpY2F0aW9uQ29udGV4dC54bWw8L3BhcmFtLXZhbHVlPgorICAgIDwvY29udGV4dC1wYXJhbT4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPlNwcmluZ0FwcGxpY2F0aW9uPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC53cy5ycy5BcHBsaWNhdGlvbjwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5oZWxsb3dvcmxkLnNwcmluZy5NeUFwcGxpY2F0aW9uPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5TcHJpbmdBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9oZWxsb3dvcmxkLXdlYmFwcC9SRUFETUUuTUQgYi9leGFtcGxlcy9oZWxsb3dvcmxkLXdlYmFwcC9SRUFETUUuTUQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ0OWZjZQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2hlbGxvd29ybGQtd2ViYXBwL1JFQURNRS5NRApAQCAtMCwwICsxLDM4IEBACitbLy9dOiAjICIgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICIKK1svL106ICMgIiAiCitbLy9dOiAjICIgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlICIKK1svL106ICMgIiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCAiCitbLy9dOiAjICIgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLiAiCitbLy9dOiAjICIgIgorWy8vXTogIyAiIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UgIgorCitIZWxsb3dvcmxkIHdlYmFwcCBFeGFtcGxlCis9PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIGNyZWF0ZSBzaW1wbGUgSmVyc2V5IGFwcGxpY2F0aW9uLAorcGFja2FnZSBpdCBpbnRvIFdBUiBmaWxlIGFuZCBob3cgdG8gcnVuIGl0IHVzaW5nIFtHcml6emx5Citjb250YWluZXJdKGh0dHA6Ly9ncml6emx5LmphdmEubmV0KS4KKworQ29udGVudHMKKy0tLS0tLS0tCisKK1RoZSBtYXBwaW5nIG9mIHRoZSBVUkkgcGF0aCBzcGFjZSBpcyBwcmVzZW50ZWQgaW4gdGhlIGZvbGxvd2luZyB0YWJsZToKKworVVJJIHBhdGggICAgICAgICAgICB8IFJlc291cmNlIGNsYXNzICAgICAgIHwgSFRUUCBtZXRob2RzCistLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLQorKipfL2hlbGxvd29ybGRfKiogICB8IEhlbGxvV29ybGRSZXNvdXJjZSAgIHwgR0VUCisKK0FwcGxpY2F0aW9uIGlzIGNvbmZpZ3VyZWQgYnkgdXNpbmcgd2ViLnhtbCwgd2hpY2ggcmVnaXN0ZXJzCitbamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbl0oaHR0cHM6Ly9qYXgtcnMtc3BlYy5qYXZhLm5ldC9ub25hdi8yLjAvYXBpZG9jcy9qYXZheC93cy9ycy9jb3JlL0FwcGxpY2F0aW9uLmh0bWwpCitkZXNjZW5kYW50IHRvIGdldCBjbGFzc2VzIGFuZCBzaW5nbGV0b25zIGZyb20gaXQgKHNlZSBjbGFzcyBNeUFwcGxpY2F0aW9uKS4KKworUnVubmluZyB0aGUgRXhhbXBsZQorLS0tLS0tLS0tLS0tLS0tLS0tLQorCitSdW4gdGhlIGV4YW1wbGUgYXMgZm9sbG93czoKKworPiAgICAgbXZuIGNsZWFuIGNvbXBpbGUgZXhlYzpqYXZhCisKK1RoaXMgZGVwbG95cyB0aGUgZXhhbXBsZSB1c2luZyBbR3JpenpseV0oaHR0cDovL2dyaXp6bHkuamF2YS5uZXQvKSBjb250YWluZXIuIFlvdSBjYW4gYWNjZXNzIHRoZSBhcHBsaWNhdGlvbiBhdDoKKworLSA8aHR0cDovL2xvY2FsaG9zdDo4MDgwL2hlbGxvd29ybGQtd2ViYXBwL2hlbGxvd29ybGQ+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9oZWxsb3dvcmxkLXdlYmFwcC9wb20ueG1sIGIvZXhhbXBsZXMvaGVsbG93b3JsZC13ZWJhcHAvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDU3NWRlCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvaGVsbG93b3JsZC13ZWJhcHAvcG9tLnhtbApAQCAtMCwwICsxLDg1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorCisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPndlYmFwcC1leGFtcGxlLXBhcmVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi93ZWJhcHAtZXhhbXBsZS1wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+aGVsbG93b3JsZC13ZWJhcHA8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktZXhhbXBsZXMtaGVsbG93b3JsZC13ZWJhcHA8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+SmVyc2V5IGFubm90YXRlZCByZXNvdXJjZSBjbGFzcyAiSGVsbG8gd29ybGQiIGV4YW1wbGUuPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtzZXJ2bGV0NC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItZ3JpenpseTItc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWhrMjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDwhLS0gUnVuIHRoZSBhcHBsaWNhdGlvbiB1c2luZyAibXZuIGpldHR5OnJ1biIgdG8gZGVwbG95IHRvIEpldHR5LS0+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWpldHR5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPCEtLSBSdW4gdGhlIGFwcGxpY2F0aW9uIHVzaW5nICJtdm4gZXhlYzpqYXZhIiB0byBkZXBsb3kgdG8gR3JpenpseSBTZXJ2bGV0LS0+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmV4ZWMtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8bWFpbkNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmhlbGxvd29ybGQud2ViYXBwLkFwcDwvbWFpbkNsYXNzPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+cmVsZWFzZTwvaWQ+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnhtbC1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaGVsbG93b3JsZC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL3dlYmFwcC9BcHAuamF2YSBiL2V4YW1wbGVzL2hlbGxvd29ybGQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC93ZWJhcHAvQXBwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU2MThjZQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2hlbGxvd29ybGQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC93ZWJhcHAvQXBwLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5oZWxsb3dvcmxkLndlYmFwcDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseTIuc2VydmxldC5Hcml6emx5V2ViQ29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmdyaXp6bHkuaHR0cC5zZXJ2ZXIuSHR0cFNlcnZlcjsKKworLyoqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQXBwIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVSSSBCQVNFX1VSSSA9IFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9oZWxsb3dvcmxkLXdlYmFwcC8iKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST09UX1BBVEggPSAiaGVsbG93b3JsZCI7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlwiSGVsbG8gV29ybGRcIiBKZXJzZXkgRXhhbXBsZSBBcHAiKTsKKworICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBpbml0UGFyYW1zID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICAgICAgaW5pdFBhcmFtcy5wdXQoCisgICAgICAgICAgICAgICAgICAgIFNlcnZlclByb3BlcnRpZXMuUFJPVklERVJfUEFDS0FHRVMsCisgICAgICAgICAgICAgICAgICAgIEhlbGxvV29ybGRSZXNvdXJjZS5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGZpbmFsIEh0dHBTZXJ2ZXIgc2VydmVyID0gR3JpenpseVdlYkNvbnRhaW5lckZhY3RvcnkuY3JlYXRlKEJBU0VfVVJJLCBTZXJ2bGV0Q29udGFpbmVyLmNsYXNzLCBpbml0UGFyYW1zKTsKKyAgICAgICAgICAgIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmFkZFNodXRkb3duSG9vayhuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHNlcnZlci5zaHV0ZG93bk5vdygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pKTsKKworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFN0cmluZy5mb3JtYXQoIkFwcGxpY2F0aW9uIHN0YXJ0ZWQuJW5Ucnkgb3V0ICVzJXMlblN0b3AgdGhlIGFwcGxpY2F0aW9uIHVzaW5nIENUUkwrQyIsCisgICAgICAgICAgICAgICAgICAgIEJBU0VfVVJJLCBST09UX1BBVEgpKTsKKworICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5qb2luKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIHwgSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoQXBwLmNsYXNzLmdldE5hbWUoKSkubG9nKExldmVsLlNFVkVSRSwgbnVsbCwgZXgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaGVsbG93b3JsZC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL3dlYmFwcC9IZWxsb1dvcmxkUmVzb3VyY2UuamF2YSBiL2V4YW1wbGVzL2hlbGxvd29ybGQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC93ZWJhcHAvSGVsbG9Xb3JsZFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY2OWI2OQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2hlbGxvd29ybGQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC93ZWJhcHAvSGVsbG9Xb3JsZFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5oZWxsb3dvcmxkLndlYmFwcDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJoZWxsb3dvcmxkIikKK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkUmVzb3VyY2UgeworCisgICAgQEdFVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIFN0cmluZyBnZXRIZWxsbygpIHsKKyAgICAgICAgcmV0dXJuICJIZWxsbyBXb3JsZCEiOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaGVsbG93b3JsZC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL3dlYmFwcC9NeUFwcGxpY2F0aW9uLmphdmEgYi9leGFtcGxlcy9oZWxsb3dvcmxkLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvd2ViYXBwL015QXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTkyOWU1Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvaGVsbG93b3JsZC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL3dlYmFwcC9NeUFwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5oZWxsb3dvcmxkLndlYmFwcDsKKworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uUGF0aCgiLyIpCitwdWJsaWMgY2xhc3MgTXlBcHBsaWNhdGlvbiBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IGNsYXNzZXMgPSBuZXcgSGFzaFNldDxDbGFzczw/Pj4oKTsKKyAgICAgICAgLy8gcmVnaXN0ZXIgcm9vdCByZXNvdXJjZQorICAgICAgICBjbGFzc2VzLmFkZChIZWxsb1dvcmxkUmVzb3VyY2UuY2xhc3MpOworICAgICAgICByZXR1cm4gY2xhc3NlczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9oZWxsb3dvcmxkLXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9nbGFzc2Zpc2gtd2ViLnhtbCBiL2V4YW1wbGVzL2hlbGxvd29ybGQtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2dsYXNzZmlzaC13ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4M2RmZjQKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9oZWxsb3dvcmxkLXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9nbGFzc2Zpc2gtd2ViLnhtbApAQCAtMCwwICsxLDI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzwhRE9DVFlQRSBnbGFzc2Zpc2gtd2ViLWFwcCBQVUJMSUMgIi0vL0dsYXNzRmlzaC5vcmcvL0RURCBHbGFzc0Zpc2ggQXBwbGljYXRpb24gU2VydmVyIDMuMSBTZXJ2bGV0IDMuMC8vRU4iICJodHRwOi8vZ2xhc3NmaXNoLm9yZy9kdGRzL2dsYXNzZmlzaC13ZWItYXBwXzNfMC0xLmR0ZCI+Cis8Z2xhc3NmaXNoLXdlYi1hcHAgZXJyb3ItdXJsPSIiPgorICAgIDxjb250ZXh0LXJvb3Q+L2hlbGxvd29ybGQtd2ViYXBwPC9jb250ZXh0LXJvb3Q+CisgICAgPGNsYXNzLWxvYWRlciBkZWxlZ2F0ZT0idHJ1ZSIgLz4KKyAgICA8anNwLWNvbmZpZz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzZGVidWdpbmZvIiB2YWx1ZT0idHJ1ZSI+CisgICAgICAgICAgICA8ZGVzY3JpcHRpb24+RW5hYmxlIGRlYnVnIGluZm8gY29tcGlsYXRpb24gaW4gdGhlIGdlbmVyYXRlZCBzZXJ2bGV0IGNsYXNzPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImtlZXBnZW5lcmF0ZWQiIHZhbHVlPSJ0cnVlIj4KKyAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5LZWVwIGEgY29weSBvZiB0aGUgZ2VuZXJhdGVkIHNlcnZsZXQgY2xhc3MnIGphdmEgY29kZS48L2Rlc2NyaXB0aW9uPgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWFwcGVkZmlsZSIgdmFsdWU9InRydWUiPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPk1haW50YWluIGEgb25lLXRvLW9uZSBjb3JyZXNwb25kZW5jZSBiZXR3ZWVuIHN0YXRpYyBjb250ZW50IGFuZCB0aGUgZ2VuZXJhdGVkIHNlcnZsZXQgY2xhc3MnIGphdmEgY29kZTwvZGVzY3JpcHRpb24+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgPC9qc3AtY29uZmlnPgorPC9nbGFzc2Zpc2gtd2ViLWFwcD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2hlbGxvd29ybGQtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi9leGFtcGxlcy9oZWxsb3dvcmxkLXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNDg0YjkKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9oZWxsb3dvcmxkLXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMjggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi41IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIj4KKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5oZWxsb3dvcmxkX3NlcnZsZXQuTXlBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuaGVsbG93b3JsZC53ZWJhcHAuTXlBcHBsaWNhdGlvbjwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuaGVsbG93b3JsZF9zZXJ2bGV0Lk15QXBwbGljYXRpb248L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2hlbGxvd29ybGQtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC93ZWJhcHAvSGVsbG9Xb3JsZFRlc3QuamF2YSBiL2V4YW1wbGVzL2hlbGxvd29ybGQtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC93ZWJhcHAvSGVsbG9Xb3JsZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGE0YTlmCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvaGVsbG93b3JsZC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL3dlYmFwcC9IZWxsb1dvcmxkVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuaGVsbG93b3JsZC53ZWJhcHA7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBTaW1wbGUgdGVzdCB0byBjaGVjayAiSGVsbG8gV29ybGQhIiBpcyBiZWluZyByZXR1cm5lZCBmcm9tIHRoZSBoZWxsb3dvcmxkIHJlc291cmNlLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNeUFwcGxpY2F0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFVSSSBnZXRCYXNlVXJpKCkgeworICAgICAgICByZXR1cm4gVXJpQnVpbGRlci5mcm9tVXJpKHN1cGVyLmdldEJhc2VVcmkoKSkucGF0aCgiaGVsbG93b3JsZC13ZWJhcHAiKS5idWlsZCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsaWVudFN0cmluZ1Jlc3BvbnNlKCkgeworICAgICAgICBTdHJpbmcgcyA9IHRhcmdldCgpLnBhdGgoQXBwLlJPT1RfUEFUSCkucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkhlbGxvIFdvcmxkISIsIHMpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaGVsbG93b3JsZC13ZWxkL1JFQURNRS5NRCBiL2V4YW1wbGVzL2hlbGxvd29ybGQtd2VsZC9SRUFETUUuTUQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEzOWUyMQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2hlbGxvd29ybGQtd2VsZC9SRUFETUUuTUQKQEAgLTAsMCArMSw0MCBAQAorWy8vXTogIyAiIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAiCitbLy9dOiAjICIgIgorWy8vXTogIyAiIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAiCitbLy9dOiAjICIgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQgIgorWy8vXTogIyAiIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4gIgorWy8vXTogIyAiICIKK1svL106ICMgIiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlICIKKworSmVyc2V5IFdlbGQgSW50ZWdyYXRpb24gSmVyc2V5IFdlbGQgb24gR3JpenpseSBFeGFtcGxlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gZGV2ZWxvcCBSRVNUZnVsIHdlYiBzZXJ2aWNlIHdpdGggQ0RJCittYW5hZ2VkIGJlYW5zIGFuZCBHcml6emx5IEhUVFAgY29udGFpbmVyLgorCitXZSBzdWdnZXN0IHlvdSBpbnNwZWN0IHRoZSBleGFtcGxlIHNvdXJjZSBjb2RlIHRvIGdldCBiZXR0ZXIKK3VuZGVyc3RhbmRpbmcgb24gdmFyaW91cyBDREkgZmVhdHVyZXMgdXRpbGl6ZWQgdGhlcmUuIEZvbGxvd2luZyB0YWJsZQorY29udGFpbnMgc29tZSBvZiB0aGUgcHVibGlzaGVkIHJlc291cmNlcyB0aGF0IHlvdSBtaWdodCB3YW50IHRvIGNoZWNrLgorCitDb250ZW50cworLS0tLS0tLS0KKworVGhlIG1hcHBpbmcgb2YgdGhlIFVSSSBwYXRoIHNwYWNlIGlzIHByZXNlbnRlZCBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOgorCitVUkwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgRGVzY3JpcHRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFeHBlY3RlZCBSZXN1bHRzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqXy9oZWxsb3dvcmxkP25hbWU9QmlsbF8qKiAgICAgICAgICAgICAgICAgICAgfCBBIGhlbGxvLXdvcmxkIG1hbmFnZWQgYmVhbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEhlbGxvIEJpbGwKKyoqXy9hcHAvY291bnRfKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBcHBsaWNhdGlvbiBzY29wZWQgcmVzb3VyY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IHJlcXVlc3QgY291bnQgKGluY3JlbWVudGVkIHdpdGggZXZlcnkgb3RoZXIgcmVxdWVzdCkKKyoqXy9yZXEvYXBwL2NvdW50ZXJfKiogICAgICAgICAgICAgICAgICAgICAgICAgfCBSZXF1ZXN0IHNjb3BlZCByZXNvdXJjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGxpbmtzIHRvIGFib3ZlIHJlcXVlc3QgY291bnRlcgorKipfL3JlcS9wYXJhbWV0ZXJpemVkLWFzeW5jP3E9ZWNobyUyMHRoaXNfKiogICB8IEFzeW5jaHJvbm91cyBlY2hvIHJlc291cmNlIG1ldGhvZCB0aGF0IGlzIGJlaW5nIEpBWC1SUyBpbnRlcmNlcHRlZCAgIHwgZWNobyB0aGlzCisKK1J1bm5pbmcgdGhlIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworUnVuIHRoZSBleGFtcGxlIGFzIGZvbGxvd3M6CisKKz4gICAgIG12biBjbGVhbiBjb21waWxlIGV4ZWM6amF2YQorCitUaGlzIGRlcGxveXMgdGhlIGV4YW1wbGUgdXNpbmcgW0dyaXp6bHldKGh0dHA6Ly9ncml6emx5LmphdmEubmV0LykgY29udGFpbmVyLiBZb3UgY2FuIGFjY2VzcyB0aGUgYXBwbGljYXRpb24gYXQ6CisKKy0gPGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC93ZWxkPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2hlbGxvd29ybGQtd2VsZC9wb20ueG1sIGIvZXhhbXBsZXMvaGVsbG93b3JsZC13ZWxkL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRhZGY4OQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2hlbGxvd29ybGQtd2VsZC9wb20ueG1sCkBAIC0wLDAgKzEsMTA4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+aGVsbG93b3JsZC13ZWxkPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LWV4YW1wbGVzLWhlbGxvd29ybGQtd2VsZDwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgYW5ub3RhdGVkIHJlc291cmNlIGNsYXNzICJIZWxsbyB3b3JsZCIgZXhhbXBsZSB3aXRoIFdlbGQgc3VwcG9ydC48L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1ncml6emx5Mi1odHRwPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWhrMjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1idW5kbGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dHlwZT5wb208L3R5cGU+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXV0aWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktd2VsZDItc2U8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY2RpMXg8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmV4ZWMtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8bWFpbkNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmhlbGxvd29ybGQuQXBwPC9tYWluQ2xhc3M+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5yZWxlYXNlPC9pZD4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5kZWxheWVkLXN0cmF0ZWd5LXNraXAtdGVzdDwvaWQ+CisgICAgICAgICAgICA8YWN0aXZhdGlvbj4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgIDxuYW1lPm9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdGlvbi5tYW5hZ2VyLnN0cmF0ZWd5PC9uYW1lPgorICAgICAgICAgICAgICAgICAgICA8dmFsdWU+ZGVsYXllZDwvdmFsdWU+CisgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxza2lwVGVzdHM+dHJ1ZTwvc2tpcFRlc3RzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaGVsbG93b3JsZC13ZWxkL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9BcHAuamF2YSBiL2V4YW1wbGVzL2hlbGxvd29ybGQtd2VsZC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvQXBwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDllZDEyOAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2hlbGxvd29ybGQtd2VsZC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvQXBwLmphdmEKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuaGVsbG93b3JsZDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk1hbmFnZWRCZWFuOworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5BcHBsaWNhdGlvblNjb3BlZDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmdyaXp6bHkuaHR0cC5zZXJ2ZXIuSHR0cFNlcnZlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5Mi5odHRwc2VydmVyLkdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBvcmcuamJvc3Mud2VsZC5lbnZpcm9ubWVudC5zZS5XZWxkOworCisvKioKKyAqIE1haW4gSmF2YSBhcHBsaWNhdGlvbi4gVXNlZCB0byBib290c3RyYXAgV2VsZCBjb250YWluZXIgYW5kIHN0YXJ0IEdyaXp6bHkgSFRUUCBjb250YWluZXIuCisgKi8KK3B1YmxpYyBjbGFzcyBBcHAgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIEJBU0VfVVJJID0gVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3dlbGQvIik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVF9QQVRIID0gImFwcGxpY2F0aW9uLndhZGwiOworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcIkhlbGxvIFdvcmxkXCIgSmVyc2V5IEV4YW1wbGUgV2VsZCBBcHAiKTsKKworICAgICAgICAgICAgZmluYWwgV2VsZCB3ZWxkID0gbmV3IFdlbGQoKTsKKyAgICAgICAgICAgIHdlbGQuaW5pdGlhbGl6ZSgpOworCisgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IGNyZWF0ZUpheFJzQXBwKCk7CisKKyAgICAgICAgICAgIGZpbmFsIEh0dHBTZXJ2ZXIgc2VydmVyID0gR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5LmNyZWF0ZUh0dHBTZXJ2ZXIoQkFTRV9VUkksIHJlc291cmNlQ29uZmlnLCBmYWxzZSk7CisgICAgICAgICAgICBSdW50aW1lLmdldFJ1bnRpbWUoKS5hZGRTaHV0ZG93bkhvb2sobmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIuc2h1dGRvd25Ob3coKTsKKyAgICAgICAgICAgICAgICAgICAgd2VsZC5zaHV0ZG93bigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pKTsKKyAgICAgICAgICAgIHNlcnZlci5zdGFydCgpOworCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oU3RyaW5nLmZvcm1hdCgiQXBwbGljYXRpb24gc3RhcnRlZC5cblRyeSBvdXQgJXMlc1xuU3RvcCB0aGUgYXBwbGljYXRpb24gdXNpbmcgQ1RSTCtDIiwKKyAgICAgICAgICAgICAgICAgICAgQkFTRV9VUkksIFJPT1RfUEFUSCkpOworCisgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gfCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihBcHAuY2xhc3MuZ2V0TmFtZSgpKS5sb2coTGV2ZWwuU0VWRVJFLCBudWxsLCBleCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIEpBWC1SUyBhcHBsaWNhdGlvbiBkZWZpbmVkIGFzIGEgQ0RJIGJlYW4uCisgICAgICovCisgICAgQE1hbmFnZWRCZWFuCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKYXhSc0FwcGxpY2F0aW9uIGV4dGVuZHMgQXBwbGljYXRpb24geworCisgICAgICAgIEBDb250ZXh0CisgICAgICAgIFVyaUluZm8gdUluZm87CisKKyAgICAgICAgc3RhdGljIGZpbmFsIFNldDxDbGFzczw/Pj4gYXBwQ2xhc3NlcyA9IG5ldyBIYXNoU2V0PD4oKTsKKworICAgICAgICBzdGF0aWMgeworICAgICAgICAgICAgYXBwQ2xhc3Nlcy5hZGQoSGVsbG9Xb3JsZFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgICAgIGFwcENsYXNzZXMuYWRkKEFwcFNjb3BlZFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgICAgIGFwcENsYXNzZXMuYWRkKFJlcXVlc3RTY29wZWRSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgICAgICBhcHBDbGFzc2VzLmFkZChDdXN0b21JbnRlcmNlcHRvci5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBhcHBDbGFzc2VzOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIEpBWC1SUyBhcHBsaWNhdGlvbi4gVGhlIHNhbWUgb25lIGlzIHVzZWQgYWxzbyBpbiB0aGUgdGVzdHMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEplcnNleSdzIHJlc291cmNlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIFdlbGQgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZUNvbmZpZyBjcmVhdGVKYXhSc0FwcCgpIHsKKyAgICAgICAgcmV0dXJuIFJlc291cmNlQ29uZmlnLmZvckFwcGxpY2F0aW9uQ2xhc3MoSmF4UnNBcHBsaWNhdGlvbi5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaGVsbG93b3JsZC13ZWxkL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9BcHBTY29wZWRSZXNvdXJjZS5qYXZhIGIvZXhhbXBsZXMvaGVsbG93b3JsZC13ZWxkL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9BcHBTY29wZWRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMjMxZmMKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9oZWxsb3dvcmxkLXdlbGQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL0FwcFNjb3BlZFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5oZWxsb3dvcmxkOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuQXBwbGljYXRpb25TY29wZWQ7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CisKKy8qKgorICogQXBwbGljYXRpb24gc2NvcGVkIENESSBiYXNlZCByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiYXBwIikKK0BBcHBsaWNhdGlvblNjb3BlZAorcHVibGljIGNsYXNzIEFwcFNjb3BlZFJlc291cmNlIHsKKworICAgIEF0b21pY0ludGVnZXIgY291bnRlciA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CisKKyAgICBAR0VUCisgICAgQFBhdGgoImNvdW50IikKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7CisgICAgICAgIHJldHVybiBjb3VudGVyLmluY3JlbWVudEFuZEdldCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2hlbGxvd29ybGQtd2VsZC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvQ3VzdG9tSW50ZXJjZXB0b3IuamF2YSBiL2V4YW1wbGVzL2hlbGxvd29ybGQtd2VsZC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvQ3VzdG9tSW50ZXJjZXB0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDJhN2M3Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvaGVsbG93b3JsZC13ZWxkL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9DdXN0b21JbnRlcmNlcHRvci5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuaGVsbG93b3JsZDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuQXBwbGljYXRpb25TY29wZWQ7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvckNvbnRleHQ7CisKKy8qKgorICogQ0RJIGJhc2VkIEpBWC1SUyBpbnRlcmNlcHRvciB0aGF0IHJlLXdyaXRlcyB0aGUgb3JpZ2luYWwgb3V0cHV0CisgKiB3aXRoIHJlcXVlc3QgSUQgb2J0YWluZWQgZnJvbSBhbm90aGVyIENESSBiZWFuLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSZXNwb25zZUJvZHlGcm9tQ2RpQmVhbgorQEFwcGxpY2F0aW9uU2NvcGVkCitwdWJsaWMgY2xhc3MgQ3VzdG9tSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBXcml0ZXJJbnRlcmNlcHRvciB7CisKKyAgICAvLyBDREkgaW5qZWN0ZWQgcHJveHkKKyAgICBASW5qZWN0IFJlcXVlc3RTY29wZWRCZWFuIGJlYW47CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhcm91bmRXcml0ZVRvKFdyaXRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlcXVlc3RJZCA9IGJlYW4uZ2V0UmVxdWVzdElkKCk7CisgICAgICAgIGNvbnRleHQuZ2V0T3V0cHV0U3RyZWFtKCkud3JpdGUocmVxdWVzdElkLmdldEJ5dGVzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2hlbGxvd29ybGQtd2VsZC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvSGVsbG9Xb3JsZFJlc291cmNlLmphdmEgYi9leGFtcGxlcy9oZWxsb3dvcmxkLXdlbGQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL0hlbGxvV29ybGRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNzZmNTAKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9oZWxsb3dvcmxkLXdlbGQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL0hlbGxvV29ybGRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuaGVsbG93b3JsZDsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5SZXF1ZXN0U2NvcGVkOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKKworLyoqCisgKiBIZWxsby13b3JsZCBKQVgtUlMgcmVzb3VyY2UgaW1wbGVtZW50ZWQgYXMgQ0RJIGJlYW4uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoImhlbGxvd29ybGQiKQorQFJlcXVlc3RTY29wZWQKK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkUmVzb3VyY2UgeworCisgICAgQFF1ZXJ5UGFyYW0oIm5hbWUiKQorICAgIFN0cmluZyBuYW1lOworCisgICAgQEdFVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIFN0cmluZyBnZXRIZWxsbygpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIkhlbGxvICVzIiwgbmFtZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaGVsbG93b3JsZC13ZWxkL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9SZXF1ZXN0U2NvcGVkQmVhbi5qYXZhIGIvZXhhbXBsZXMvaGVsbG93b3JsZC13ZWxkL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9SZXF1ZXN0U2NvcGVkQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYWMwNDEKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9oZWxsb3dvcmxkLXdlbGQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL1JlcXVlc3RTY29wZWRCZWFuLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5oZWxsb3dvcmxkOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LlJlcXVlc3RTY29wZWQ7CisKKy8qKgorICogUmVxdWVzdCBzY29wZWQgQ0RJIGJlYW4uIFNlcnZlcyBhcyBhIHN0b3JhZ2UKKyAqIGZvciByZXF1ZXN0IHNjb3BlZCBkYXRhIHRvIGRlbW9uc3RyYXRlIHRoYXQgQ0RJIGJhc2VkCisgKiBKQVgtUlMgaW50ZXJjZXB0b3IsIHtAbGluayBDdXN0b21JbnRlcmNlcHRvcn0sIGNvdWxkCisgKiB1c2UgQ0RJIG1lYW5zIHRvIG9idGFpbiBKQVgtUlMgcmVxdWVzdCBkYXRhLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSZXF1ZXN0U2NvcGVkCitwdWJsaWMgY2xhc3MgUmVxdWVzdFNjb3BlZEJlYW4geworCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVxdWVzdElkOworCisgICAgLyoqCisgICAgICogUmVxdWVzdCBJRCBzZXR0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdElkCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVxdWVzdElkKFN0cmluZyByZXF1ZXN0SWQpIHsKKyAgICAgICAgdGhpcy5yZXF1ZXN0SWQgPSByZXF1ZXN0SWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IG1lIGN1cnJlbnQgcmVxdWVzdCBJRC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gcmVxdWVzdCBpZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RJZCgpIHsKKyAgICAgICAgcmV0dXJuIHJlcXVlc3RJZDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9oZWxsb3dvcmxkLXdlbGQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL1JlcXVlc3RTY29wZWRSZXNvdXJjZS5qYXZhIGIvZXhhbXBsZXMvaGVsbG93b3JsZC13ZWxkL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9SZXF1ZXN0U2NvcGVkUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzViMTEwCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvaGVsbG93b3JsZC13ZWxkL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9SZXF1ZXN0U2NvcGVkUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5oZWxsb3dvcmxkOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkFzeW5jUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlN1c3BlbmRlZDsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5SZXF1ZXN0U2NvcGVkOworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKKworLyoqCisgKiBKQVgtUlMgcmVzb3VyY2UgY2xhc3MgYmFja2VkIGJ5IGEgcmVxdWVzdCBzY29wZWQgQ0RJIGJlYW4uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJlcXVlc3RTY29wZWQKK0BQYXRoKCJyZXEiKQorcHVibGljIGNsYXNzIFJlcXVlc3RTY29wZWRSZXNvdXJjZSB7CisKKyAgICBASW5qZWN0CisgICAgQXBwU2NvcGVkUmVzb3VyY2UgYXBwUmVzb3VyY2U7CisKKyAgICBASW5qZWN0CisgICAgUmVxdWVzdFNjb3BlZEJlYW4gYmVhbjsKKworICAgIEBHRVQKKyAgICBAUGF0aCgiYXBwL2NvdW50ZXIiKQorICAgIHB1YmxpYyBpbnQgZ2V0Q291bnRlcigpIHsKKyAgICAgICAgcmV0dXJuIGFwcFJlc291cmNlLmdldENvdW50KCk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJteXNlbGYiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TXlzZWxmKCkgeworICAgICAgICByZXR1cm4gdGhpcy50b1N0cmluZygpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgicGFyYW1ldGVyaXplZCIpCisgICAgQFJlc3BvbnNlQm9keUZyb21DZGlCZWFuCisgICAgcHVibGljIFN0cmluZyBpbnRlcmNlcHRlZFBhcmFtZXRlcml6ZWQoQFF1ZXJ5UGFyYW0oInEiKSBTdHJpbmcgcSkgeworICAgICAgICBiZWFuLnNldFJlcXVlc3RJZChxKTsKKyAgICAgICAgcmV0dXJuICJkb2VzIG5vdCBtYXR0ZXIiOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgic3RyYWlnaHQiKQorICAgIHB1YmxpYyBTdHJpbmcgcGFyYW1ldGVyaXplZFN0cmFpZ2h0KEBRdWVyeVBhcmFtKCJxIikgU3RyaW5nIHEpIHsKKyAgICAgICAgcmV0dXJuICJzdHJhaWdodDogIiArIHE7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXhlY3V0b3IgZXhlY3V0b3IgPSBFeGVjdXRvcnMubmV3Q2FjaGVkVGhyZWFkUG9vbCgpOworCisgICAgQEdFVAorICAgIEBQYXRoKCJwYXJhbWV0ZXJpemVkLWFzeW5jIikKKyAgICBAUmVzcG9uc2VCb2R5RnJvbUNkaUJlYW4KKyAgICBwdWJsaWMgdm9pZCBpbnRlcmNlcHRlZFBhcmFtZXRlcml6ZWRBc3luYyhAUXVlcnlQYXJhbSgicSIpIGZpbmFsIFN0cmluZyBxLCBAU3VzcGVuZGVkIGZpbmFsIEFzeW5jUmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgYmVhbi5zZXRSZXF1ZXN0SWQocSk7CisgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUobmV3IFJ1bm5hYmxlKCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihSZXF1ZXN0U2NvcGVkUmVzb3VyY2UuY2xhc3MuZ2V0TmFtZSgpKS5sb2coTGV2ZWwuU0VWRVJFLCBudWxsLCBleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlc3BvbnNlLnJlc3VtZSgidGhpcyB3aWxsIG5ldmVyIG1ha2UgaXQgdG8gdGhlIGNsaWVudCIpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAQ29udGV4dAorICAgIFVyaUluZm8gdXJpSW5mbzsKKworICAgIEBJbmplY3QgQXBwLkpheFJzQXBwbGljYXRpb24gamF4UnNBcHBsaWNhdGlvbjsKKworICAgIEBHRVQKKyAgICBAUGF0aCgidWkvamF4LXJzLWZpZWxkL3tkfSIpCisgICAgcHVibGljIFN0cmluZyBnZXRKYXhSc0luamVjdGVkVUlVcmkoKSB7CisKKyAgICAgICAgaWYgKHVyaUluZm8gPT0gamF4UnNBcHBsaWNhdGlvbi51SW5mbykgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVXJpSW5mbyBpbmplY3RlZCBpbnRvIHJlcSBzY29wZWQgY2RpIGJlYW4gc2hvdWxkIG5vdCBnZXQgcHJveGllZC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB1cmlJbmZvLmdldFJlcXVlc3RVcmkoKS50b1N0cmluZygpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgidWkvamF4LXJzLWFwcC1maWVsZC97ZH0iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2RpSW5qZWN0ZWRKYXhSc0FwcFVyaSgpIHsKKyAgICAgICAgcmV0dXJuIGpheFJzQXBwbGljYXRpb24udUluZm8uZ2V0UmVxdWVzdFVyaSgpLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaGVsbG93b3JsZC13ZWxkL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9SZXNwb25zZUJvZHlGcm9tQ2RpQmVhbi5qYXZhIGIvZXhhbXBsZXMvaGVsbG93b3JsZC13ZWxkL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9SZXNwb25zZUJvZHlGcm9tQ2RpQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MDM2NDgKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9oZWxsb3dvcmxkLXdlbGQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL1Jlc3BvbnNlQm9keUZyb21DZGlCZWFuLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5oZWxsb3dvcmxkOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlRZUEU7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5OYW1lQmluZGluZzsKKworLyoqCisgKiBCaW5kcyB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuaGVsbG93b3JsZC5DdXN0b21JbnRlcmNlcHRvcn0gd2l0aCByZXNvdXJjZSBtZXRob2RzIHRoYXQgc2hvdWxkIHJldHVybiBtb2RpZmllZAorICogZW50aXR5IHRoYW4gdGhlIG9uZSByZXR1cm5lZCBmcm9tIHRoZSBtZXRob2QuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJldGVudGlvbihSVU5USU1FKQorQFRhcmdldCh7TUVUSE9ELCBUWVBFfSkKK0BOYW1lQmluZGluZworcHVibGljIEBpbnRlcmZhY2UgUmVzcG9uc2VCb2R5RnJvbUNkaUJlYW4geworfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaGVsbG93b3JsZC13ZWxkL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9iZWFucy54bWwgYi9leGFtcGxlcy9oZWxsb3dvcmxkLXdlbGQvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2JlYW5zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDM2MWU5Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvaGVsbG93b3JsZC13ZWxkL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9iZWFucy54bWwKQEAgLTAsMCArMSwxNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisKKy0tPgorCis8YmVhbnMvPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaGVsbG93b3JsZC13ZWxkL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9BcHBTY29wZWRSZXNvdXJjZVRlc3QuamF2YSBiL2V4YW1wbGVzL2hlbGxvd29ybGQtd2VsZC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvQXBwU2NvcGVkUmVzb3VyY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNkYzU3OQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2hlbGxvd29ybGQtd2VsZC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvQXBwU2NvcGVkUmVzb3VyY2VUZXN0LmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5oZWxsb3dvcmxkOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50Lkludm9jYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuamJvc3Mud2VsZC5lbnZpcm9ubWVudC5zZS5XZWxkOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogVGVzdCBmb3IgdGhlIHtAbGluayBBcHBTY29wZWRSZXNvdXJjZX0gSkFYLVJTIHJlc291cmNlIGNsYXNzLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBBcHBTY29wZWRSZXNvdXJjZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIFdlbGQgd2VsZDsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHdlbGQgPSBuZXcgV2VsZCgpOworICAgICAgICB3ZWxkLmluaXRpYWxpemUoKTsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB3ZWxkLnNodXRkb3duKCk7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgLy8gbXZuIHRlc3QgLURqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk9b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5pbm1lbW9yeS5Jbk1lbW9yeVRlc3RDb250YWluZXJGYWN0b3J5CisgICAgICAgIC8vIG12biB0ZXN0IC1EamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5mYWN0b3J5PW9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZ3JpenpseS5Hcml6emx5VGVzdENvbnRhaW5lckZhY3RvcnkKKyAgICAgICAgLy8gbXZuIHRlc3QgLURqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk9b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5qZGtodHRwLkpka0h0dHBTZXJ2ZXJUZXN0Q29udGFpbmVyRmFjdG9yeQorICAgICAgICAvLyBtdm4gdGVzdCAtRGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIuZmFjdG9yeT1vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNpbXBsZS5TaW1wbGVUZXN0Q29udGFpbmVyRmFjdG9yeQorICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworICAgICAgICAvLyBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworICAgICAgICByZXR1cm4gQXBwLmNyZWF0ZUpheFJzQXBwKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q291bnRlcigpIHsKKyAgICAgICAgZmluYWwgSW52b2NhdGlvbi5CdWlsZGVyIGNvdW50ZXIgPSB0YXJnZXQoKS5wYXRoKCJhcHAvY291bnQiKS5yZXF1ZXN0KCJ0ZXh0L3BsYWluIik7CisKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSBjb3VudGVyLmdldCgpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgaW50IGMxID0gcmVzcG9uc2UucmVhZEVudGl0eShJbnRlZ2VyLmNsYXNzKTsKKyAgICAgICAgaW50IGMyID0gY291bnRlci5nZXQoSW50ZWdlci5jbGFzcyk7CisgICAgICAgIGludCBjMyA9IGNvdW50ZXIuZ2V0KEludGVnZXIuY2xhc3MpOworICAgICAgICBhc3NlcnRUcnVlKGMxIDwgYzIpOworICAgICAgICBhc3NlcnRUcnVlKGMyIDwgYzMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2hlbGxvd29ybGQtd2VsZC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvSGVsbG9Xb3JsZFRlc3QuamF2YSBiL2V4YW1wbGVzL2hlbGxvd29ybGQtd2VsZC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvSGVsbG9Xb3JsZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjZhMzExCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvaGVsbG93b3JsZC13ZWxkL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9IZWxsb1dvcmxkVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuaGVsbG93b3JsZDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmpib3NzLndlbGQuZW52aXJvbm1lbnQuc2UuV2VsZDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0IGZvciB0aGUge0BsaW5rIEhlbGxvV29ybGRSZXNvdXJjZX0gSkFYLVJTIHJlc291cmNlIGNsYXNzLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBXZWxkIHdlbGQ7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB3ZWxkID0gbmV3IFdlbGQoKTsKKyAgICAgICAgd2VsZC5pbml0aWFsaXplKCk7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgd2VsZC5zaHV0ZG93bigpOworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIC8vIG12biB0ZXN0IC1EamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5mYWN0b3J5PW9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuaW5tZW1vcnkuSW5NZW1vcnlUZXN0Q29udGFpbmVyRmFjdG9yeQorICAgICAgICAvLyBtdm4gdGVzdCAtRGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIuZmFjdG9yeT1vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmdyaXp6bHkuR3JpenpseVRlc3RDb250YWluZXJGYWN0b3J5CisgICAgICAgIC8vIG12biB0ZXN0IC1EamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5mYWN0b3J5PW9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuamRraHR0cC5KZGtIdHRwU2VydmVyVGVzdENvbnRhaW5lckZhY3RvcnkKKyAgICAgICAgLy8gbXZuIHRlc3QgLURqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk9b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zaW1wbGUuU2ltcGxlVGVzdENvbnRhaW5lckZhY3RvcnkKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKyAgICAgICAgLy8gZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKTsKKyAgICAgICAgcmV0dXJuIEFwcC5jcmVhdGVKYXhSc0FwcCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhlbGxvV29ybGQoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiaGVsbG93b3JsZCIpLnF1ZXJ5UGFyYW0oIm5hbWUiLCAiSm9zZWYiKS5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5mb3JtYXQoIkhlbGxvICVzIiwgIkpvc2VmIiksIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaGVsbG93b3JsZC13ZWxkL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9SZXF1ZXN0U2NvcGVBbGlnbm1lbnRUZXN0LmphdmEgYi9leGFtcGxlcy9oZWxsb3dvcmxkLXdlbGQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL1JlcXVlc3RTY29wZUFsaWdubWVudFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmJlMTIzCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvaGVsbG93b3JsZC13ZWxkL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9SZXF1ZXN0U2NvcGVBbGlnbm1lbnRUZXN0LmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5oZWxsb3dvcmxkOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmpib3NzLndlbGQuZW52aXJvbm1lbnQuc2UuV2VsZDsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5jb250YWluc1N0cmluZzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5zdGFydHNXaXRoOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogVGVzdCBmb3IgdGhlIHJlcXVlc3Qgc2NvcGVkIG1hbmFnZWQgYmVhbiByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgUmVxdWVzdFNjb3BlQWxpZ25tZW50VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgc3RhdGljIFdlbGQgd2VsZDsKKworICAgIEBCZWZvcmVDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBiZWZvcmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgd2VsZCA9IG5ldyBXZWxkKCk7CisgICAgICAgIHdlbGQuaW5pdGlhbGl6ZSgpOworICAgIH0KKworICAgIEBBZnRlckNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFmdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHdlbGQuc2h1dGRvd24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gQXBwLmNyZWF0ZUpheFJzQXBwKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXJpSW5mb1Byb3BhZ2F0ZXNUb0FwcCgpIHsKKworICAgICAgICBmb3IgKFN0cmluZyBkIDogbmV3IFN0cmluZ1tdeyJvbmUiLCAidHdvIiwgInRocmVlIn0pIHsKKworICAgICAgICAgICAgZmluYWwgV2ViVGFyZ2V0IGZpZWxkVGFyZ2V0ID0gdGFyZ2V0KCkucGF0aCgicmVxL3VpL2pheC1ycy1maWVsZCIpLnBhdGgoZCk7CisgICAgICAgICAgICBmaW5hbCBXZWJUYXJnZXQgYXBwRmllbGRUYXJnZXQgPSB0YXJnZXQoKS5wYXRoKCJyZXEvdWkvamF4LXJzLWFwcC1maWVsZCIpLnBhdGgoZCk7CisKKyAgICAgICAgICAgIFN0cmluZyBmID0gZmllbGRUYXJnZXQucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChmLCBjb250YWluc1N0cmluZyhmaWVsZFRhcmdldC5nZXRVcmkoKS50b1N0cmluZygpKSk7CisgICAgICAgICAgICBTdHJpbmcgYWYgPSBhcHBGaWVsZFRhcmdldC5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGFmLCBjb250YWluc1N0cmluZyhhcHBGaWVsZFRhcmdldC5nZXRVcmkoKS50b1N0cmluZygpKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9oZWxsb3dvcmxkLXdlbGQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL1JlcXVlc3RTY29wZWRSZXNvdXJjZVRlc3QuamF2YSBiL2V4YW1wbGVzL2hlbGxvd29ybGQtd2VsZC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvUmVxdWVzdFNjb3BlZFJlc291cmNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2YTRmYTkKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9oZWxsb3dvcmxkLXdlbGQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL1JlcXVlc3RTY29wZWRSZXNvdXJjZVRlc3QuamF2YQpAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5oZWxsb3dvcmxkOworCitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnV0aWwucnVubmVyLkNvbmN1cnJlbnRQYXJhbWV0ZXJpemVkUnVubmVyOworCitpbXBvcnQgb3JnLmpib3NzLndlbGQuZW52aXJvbm1lbnQuc2UuV2VsZDsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CisKKy8qKgorICogVGVzdCByZXF1ZXN0IHNjb3BlZCByZXNvdXJjZS4gTnVtYmVyIG9mIHZhcmlvdXMgcmVxdWVzdHMgd2lsbCBiZSBtYWRlIGluIHBhcmFsbGVsCisgKiBhZ2FpbnN0IGEgc2luZ2xlIEdyaXp6bHkgaW5zdGFuY2UuIFRoaXMgaXMgdG8gZW5zdXJlIHNlcnZlciBzaWRlIGV4dGVybmFsIHJlcXVlc3Qgc2NvcGUKKyAqIGJpbmRpbmcgZG9lcyBub3QgbWl4IGRpZmZlcmVudCByZXF1ZXN0IGRhdGEuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJ1bldpdGgoQ29uY3VycmVudFBhcmFtZXRlcml6ZWRSdW5uZXIuY2xhc3MpCitwdWJsaWMgY2xhc3MgUmVxdWVzdFNjb3BlZFJlc291cmNlVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgLy8gVG90YWwgbnVtYmVyIG9mIHJlcXVlc3RzIHRvIG1ha2UKKyAgICBzdGF0aWMgZmluYWwgaW50IFJFUVVFU1RfQ09VTlQgPSAxMDAwOworICAgIC8vIGJhc2lzIGZvciB0ZXN0IGRhdGEgc2VxdWVuY2UKKyAgICBzdGF0aWMgZmluYWwgQXRvbWljSW50ZWdlciBkYXRhRmVlZCA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CisKKyAgICAvLyB0byBoZWxwIHVzIHJhbmRvbWlseSBzZWxlY3QgcmVzb3VyY2UgbWV0aG9kIHRvIHRlc3QKKyAgICBzdGF0aWMgZmluYWwgUmFuZG9tIFJBTkRPTUlaRVIgPSBuZXcgUmFuZG9tKCk7CisKKyAgICAvLyBvdXIgV2VsZCBjb250YWluZXIgaW5zdGFuY2UKKyAgICBzdGF0aWMgV2VsZCB3ZWxkOworCisgICAgLyoqCisgICAgICogVGFrZSB0ZXN0IGRhdGEgc2VxdWVuY2UgZnJvbSBoZXJlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGl0ZXJhYmxlIHRlc3QgaW5wdXQgZGF0YQorICAgICAqLworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMKKyAgICBwdWJsaWMgc3RhdGljIEl0ZXJhYmxlPE9iamVjdFtdPiBkYXRhKCkgeworICAgICAgICByZXR1cm4gbmV3IEl0ZXJhYmxlPE9iamVjdFtdPigpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgSXRlcmF0b3I8T2JqZWN0W10+IGl0ZXJhdG9yKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSXRlcmF0b3I8T2JqZWN0W10+KCkgeworCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGFGZWVkLmdldCgpIDwgUkVRVUVTVF9DT1VOVDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0W10gbmV4dCgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFtdIHJlc3VsdCA9IG5ldyBPYmplY3RbMV07CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbmV4dFZhbHVlID0gZGF0YUZlZWQuZ2V0QW5kSW5jcmVtZW50KCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbMF0gPSBTdHJpbmcuZm9ybWF0KCIlMDJkIiwgbmV4dFZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworICAgIEBCZWZvcmVDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBiZWZvcmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgd2VsZCA9IG5ldyBXZWxkKCk7CisgICAgICAgIHdlbGQuaW5pdGlhbGl6ZSgpOworICAgIH0KKworICAgIEBBZnRlckNsYXNzCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGFmdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHdlbGQuc2h1dGRvd24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiU1lOQzogJWQsIEFTWU5DOiAlZCwgU1RSQUlHSFQ6ICVkJW4iLAorICAgICAgICAgICAgICAgIHBhcmFtZXRlcml6ZWRDb3VudGVyLmludFZhbHVlKCksIHBhcmFtZXRlcml6ZWRBc3luY0NvdW50ZXIuaW50VmFsdWUoKSwgc3RyYWlnaHRDb3VudGVyLmludFZhbHVlKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIC8vICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworICAgICAgICByZXR1cm4gQXBwLmNyZWF0ZUpheFJzQXBwKCk7CisgICAgfQorCisgICAgLy8gd2Ugd2FudCB0byBrZWVwIHNvbWUgc3RhdGlzdGljcworICAgIGZpbmFsIEF0b21pY0ludGVnZXIgcGFyYW1ldGVyaXplZENvdW50ZXIgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKKyAgICBmaW5hbCBBdG9taWNJbnRlZ2VyIHBhcmFtZXRlcml6ZWRBc3luY0NvdW50ZXIgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKKyAgICBmaW5hbCBBdG9taWNJbnRlZ2VyIHN0cmFpZ2h0Q291bnRlciA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWVzdFNjb3BlZFJlc291cmNlKGZpbmFsIFN0cmluZyBwYXJhbSkgeworCisgICAgICAgIFN0cmluZyBwYXRoOworICAgICAgICBTdHJpbmcgZXhwZWN0ZWQgPSBwYXJhbTsKKworICAgICAgICAvLyBzZWxlY3Qgb25lIG9mIHRoZSB0aHJlZSByZXNvdXJjZSBtZXRob2RzIGF2YWlsYWJsZQorICAgICAgICBzd2l0Y2ggKFJBTkRPTUlaRVIubmV4dEludCgzKSkgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIHBhdGggPSAicmVxL3BhcmFtZXRlcml6ZWQiOworICAgICAgICAgICAgICAgIHBhcmFtZXRlcml6ZWRDb3VudGVyLmluY3JlbWVudEFuZEdldCgpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIHBhdGggPSAicmVxL3BhcmFtZXRlcml6ZWQtYXN5bmMiOworICAgICAgICAgICAgICAgIHBhcmFtZXRlcml6ZWRBc3luY0NvdW50ZXIuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHBhdGggPSAicmVxL3N0cmFpZ2h0IjsKKyAgICAgICAgICAgICAgICBleHBlY3RlZCA9IFN0cmluZy5mb3JtYXQoInN0cmFpZ2h0OiAlcyIsIHBhcmFtKTsKKyAgICAgICAgICAgICAgICBzdHJhaWdodENvdW50ZXIuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgocGF0aCkucXVlcnlQYXJhbSgicSIsIHBhcmFtKS5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChTdHJpbmcuZm9ybWF0KCJSZXF1ZXN0IGZhaWxlZCBmb3IgJXMiLCBwYXRoKSwgcmVzcG9uc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9oZWxsb3dvcmxkL1JFQURNRS5NRCBiL2V4YW1wbGVzL2hlbGxvd29ybGQvUkVBRE1FLk1ECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MGQ5OTEKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9oZWxsb3dvcmxkL1JFQURNRS5NRApAQCAtMCwwICsxLDMyIEBACitbLy9dOiAjICIgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICIKK1svL106ICMgIiAiCitbLy9dOiAjICIgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlICIKK1svL106ICMgIiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCAiCitbLy9dOiAjICIgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLiAiCitbLy9dOiAjICIgIgorWy8vXTogIyAiIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UgIgorCitIZWxsbyBXb3JsZCBFeGFtcGxlCis9PT09PT09PT09PT09PT09PT09CisKK1RoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgSGVsbG8gV29ybGQgZXhhbXBsZS4gSkFYLVJTIHJlc291cmNlIHJldHVybnMgdGhlIHVzdWFsIHRleHQKKworQ29udGVudHMKKy0tLS0tLS0tCisKK1RoZSBtYXBwaW5nIG9mIHRoZSBVUkkgcGF0aCBzcGFjZSBpcyBwcmVzZW50ZWQgaW4gdGhlIGZvbGxvd2luZyB0YWJsZToKKworVVJJIHBhdGggICAgICAgICAgICAgfCBSZXNvdXJjZSBjbGFzcyAgICAgIHwgSFRUUCBtZXRob2RzIHwgTm90ZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKl8vaGVsbG93b3JsZF8qKiAgICB8IEhlbGxvV29ybGRSZXNvdXJjZSAgfCAgR0VUICAgICAgICAgfCAgUmV0dXJucyBgSGVsbG8gV29ybGQhYAorCitSdW5uaW5nIHRoZSBFeGFtcGxlCistLS0tLS0tLS0tLS0tLS0tLS0tCisKK1J1biB0aGUgZXhhbXBsZSBhcyBmb2xsb3dzOgorCis+ICAgICBtdm4gY2xlYW4gY29tcGlsZSBleGVjOmphdmEKKworVGhpcyBkZXBsb3lzIHRoZSBleGFtcGxlIHVzaW5nIFtHcml6emx5XShodHRwOi8vZ3JpenpseS5qYXZhLm5ldC8pIGNvbnRhaW5lci4KKworLSAgIDxodHRwOi8vbG9jYWxob3N0OjgwODAvYmFzZS9oZWxsb3dvcmxkPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaGVsbG93b3JsZC9wb20ueG1sIGIvZXhhbXBsZXMvaGVsbG93b3JsZC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MTY1ODcKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9oZWxsb3dvcmxkL3BvbS54bWwKQEAgLTAsMCArMSw4MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmhlbGxvd29ybGQ8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktZXhhbXBsZXMtaGVsbG93b3JsZDwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgYW5ub3RhdGVkIHJlc291cmNlIGNsYXNzICJIZWxsbyB3b3JsZCIgZXhhbXBsZS48L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1ncml6emx5Mi1odHRwPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktaGsyPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yazwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay11dGlsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItYnVuZGxlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHR5cGU+cG9tPC90eXBlPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmV4ZWMtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8bWFpbkNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmhlbGxvd29ybGQuQXBwPC9tYWluQ2xhc3M+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5yZWxlYXNlPC9pZD4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2hlbGxvd29ybGQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL0FwcC5qYXZhIGIvZXhhbXBsZXMvaGVsbG93b3JsZC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvQXBwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUzZWMyYgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2hlbGxvd29ybGQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL0FwcC5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuaGVsbG93b3JsZDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkyLmh0dHBzZXJ2ZXIuR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guZ3JpenpseS5odHRwLnNlcnZlci5IdHRwU2VydmVyOworCisvKioKKyAqIEhlbGxvIHdvcmxkIQorICovCitwdWJsaWMgY2xhc3MgQXBwIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVSSSBCQVNFX1VSSSA9IFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9iYXNlLyIpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RfUEFUSCA9ICJoZWxsb3dvcmxkIjsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXCJIZWxsbyBXb3JsZFwiIEplcnNleSBFeGFtcGxlIEFwcCIpOworCisgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhIZWxsb1dvcmxkUmVzb3VyY2UuY2xhc3MpOworICAgICAgICAgICAgZmluYWwgSHR0cFNlcnZlciBzZXJ2ZXIgPSBHcml6emx5SHR0cFNlcnZlckZhY3RvcnkuY3JlYXRlSHR0cFNlcnZlcihCQVNFX1VSSSwgcmVzb3VyY2VDb25maWcsIGZhbHNlKTsKKyAgICAgICAgICAgIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmFkZFNodXRkb3duSG9vayhuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHNlcnZlci5zaHV0ZG93bk5vdygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pKTsKKyAgICAgICAgICAgIHNlcnZlci5zdGFydCgpOworCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oU3RyaW5nLmZvcm1hdCgiQXBwbGljYXRpb24gc3RhcnRlZC5cblRyeSBvdXQgJXMlc1xuU3RvcCB0aGUgYXBwbGljYXRpb24gdXNpbmcgQ1RSTCtDIiwKKyAgICAgICAgICAgICAgICAgICAgQkFTRV9VUkksIFJPT1RfUEFUSCkpOworICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5qb2luKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIHwgSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoQXBwLmNsYXNzLmdldE5hbWUoKSkubG9nKExldmVsLlNFVkVSRSwgbnVsbCwgZXgpOworICAgICAgICB9CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9oZWxsb3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9IZWxsb1dvcmxkUmVzb3VyY2UuamF2YSBiL2V4YW1wbGVzL2hlbGxvd29ybGQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL0hlbGxvV29ybGRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMzI2ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9oZWxsb3dvcmxkL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9IZWxsb1dvcmxkUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmhlbGxvd29ybGQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKKworLyoqCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoImhlbGxvd29ybGQiKQorcHVibGljIGNsYXNzIEhlbGxvV29ybGRSZXNvdXJjZSB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJQ0hFRF9NRVNTQUdFID0gIkhlbGxvIFdvcmxkISI7CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldEhlbGxvKCkgeworICAgICAgICByZXR1cm4gQ0xJQ0hFRF9NRVNTQUdFOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaGVsbG93b3JsZC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvQ3VzdG9tTG9nZ2luZ0ZpbHRlci5qYXZhIGIvZXhhbXBsZXMvaGVsbG93b3JsZC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvQ3VzdG9tTG9nZ2luZ0ZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMDRkNDYKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9oZWxsb3dvcmxkL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9DdXN0b21Mb2dnaW5nRmlsdGVyLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5oZWxsb3dvcmxkOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVzcG9uc2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXNwb25zZUZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlc3BvbnNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXI7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQ3VzdG9tIGxvZ2dpbmcgZmlsdGVyLgorICoKKyAqIEBhdXRob3IgU2FudGlhZ28gUGVyaWNhcy1HZWVydHNlbiAoc2FudGlhZ28ucGVyaWNhc2dlZXJ0c2VuIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBDdXN0b21Mb2dnaW5nRmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciwgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXIsCisgICAgICAgIENsaWVudFJlcXVlc3RGaWx0ZXIsIENsaWVudFJlc3BvbnNlRmlsdGVyIHsKKworICAgIHN0YXRpYyBpbnQgcHJlRmlsdGVyQ2FsbGVkID0gMDsKKyAgICBzdGF0aWMgaW50IHBvc3RGaWx0ZXJDYWxsZWQgPSAwOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZmlsdGVyKENsaWVudFJlcXVlc3RDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ3VzdG9tTG9nZ2luZ0ZpbHRlci5wcmVGaWx0ZXIgY2FsbGVkIik7CisgICAgICAgIGFzc2VydEVxdWFscyhjb250ZXh0LmdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0eSgiZm9vIiksICJiYXIiKTsKKyAgICAgICAgcHJlRmlsdGVyQ2FsbGVkKys7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZmlsdGVyKENsaWVudFJlcXVlc3RDb250ZXh0IGNvbnRleHQsIENsaWVudFJlc3BvbnNlQ29udGV4dCBjbGllbnRSZXNwb25zZUNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQ3VzdG9tTG9nZ2luZ0ZpbHRlci5wb3N0RmlsdGVyIGNhbGxlZCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoY29udGV4dC5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UHJvcGVydHkoImZvbyIpLCAiYmFyIik7CisgICAgICAgIHBvc3RGaWx0ZXJDYWxsZWQrKzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDdXN0b21Mb2dnaW5nRmlsdGVyLnByZUZpbHRlciBjYWxsZWQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnRleHQuZ2V0UHJvcGVydHkoImZvbyIpLCAiYmFyIik7CisgICAgICAgIHByZUZpbHRlckNhbGxlZCsrOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCBjb250ZXh0LCBDb250YWluZXJSZXNwb25zZUNvbnRleHQgY29udGFpbmVyUmVzcG9uc2VDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkN1c3RvbUxvZ2dpbmdGaWx0ZXIucG9zdEZpbHRlciBjYWxsZWQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnRleHQuZ2V0UHJvcGVydHkoImZvbyIpLCAiYmFyIik7CisgICAgICAgIHBvc3RGaWx0ZXJDYWxsZWQrKzsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2hlbGxvd29ybGQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL0hlbGxvV29ybGRUZXN0LmphdmEgYi9leGFtcGxlcy9oZWxsb3dvcmxkL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9IZWxsb1dvcmxkVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzOGMyMTIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9oZWxsb3dvcmxkL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC9IZWxsb1dvcmxkVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjI0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmhlbGxvd29ybGQ7CisKK2ltcG9ydCBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuSW52b2NhdGlvbkNhbGxiYWNrOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC51dGlsLnJ1bm5lci5Db25jdXJyZW50UnVubmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QudXRpbC5ydW5uZXIuUnVuU2VwYXJhdGVseTsKKworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK0BSdW5XaXRoKENvbmN1cnJlbnRSdW5uZXIuY2xhc3MpCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIC8vIG12biB0ZXN0IC1EamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5mYWN0b3J5PW9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuaW5tZW1vcnkuSW5NZW1vcnlUZXN0Q29udGFpbmVyRmFjdG9yeQorICAgICAgICAvLyBtdm4gdGVzdCAtRGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIuZmFjdG9yeT1vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmdyaXp6bHkuR3JpenpseVRlc3RDb250YWluZXJGYWN0b3J5CisgICAgICAgIC8vIG12biB0ZXN0IC1EamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5mYWN0b3J5PW9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuamRraHR0cC5KZGtIdHRwU2VydmVyVGVzdENvbnRhaW5lckZhY3RvcnkKKyAgICAgICAgLy8gbXZuIHRlc3QgLURqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk9b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zaW1wbGUuU2ltcGxlVGVzdENvbnRhaW5lckZhY3RvcnkKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKyAgICAgICAgLy8gZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKTsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhIZWxsb1dvcmxkUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworLy8gICAgVW5jb21tZW50IHRvIHVzZSBHcml6emx5IGFzeW5jIGNsaWVudAorLy8gICAgQE92ZXJyaWRlCisvLyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNsaWVudENvbmZpZykgeworLy8gICAgICAgIGNsaWVudENvbmZpZy5jb25uZWN0b3IobmV3IEdyaXp6bHlDb25uZWN0b3IoY2xpZW50Q29uZmlnKSk7CisvLyAgICB9CisKKyAgICBAVGVzdAorICAgIEBJZ25vcmUoIm5vdCBjb21wYXRpYmxlIHdpdGggdGVzdCBmcmFtZXdvcmsgKGRvZXNuJ3QgdXNlIGNsaWVudCgpKSIpCisgICAgcHVibGljIHZvaWQgdGVzdEhlbGxvV29ybGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgVVJMIGdldFVybCA9IFVyaUJ1aWxkZXIuZnJvbVVyaShnZXRCYXNlVXJpKCkpLnBhdGgoQXBwLlJPT1RfUEFUSCkuYnVpbGQoKS50b1VSTCgpOworICAgICAgICBIdHRwVVJMQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gKEh0dHBVUkxDb25uZWN0aW9uKSBnZXRVcmwub3BlbkNvbm5lY3Rpb24oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbm5lY3Rpb24uc2V0RG9PdXRwdXQodHJ1ZSk7CisgICAgICAgICAgICBjb25uZWN0aW9uLnNldEluc3RhbmNlRm9sbG93UmVkaXJlY3RzKGZhbHNlKTsKKyAgICAgICAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdE1ldGhvZCgiR0VUIik7CisgICAgICAgICAgICBjb25uZWN0aW9uLnNldFJlcXVlc3RQcm9wZXJ0eSgiQ29udGVudC1UeXBlIiwgInRleHQvcGxhaW4iKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhIdHRwVVJMQ29ubmVjdGlvbi5IVFRQX09LLCBjb25uZWN0aW9uLmdldFJlc3BvbnNlQ29kZSgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNvbm5lY3Rpb24uZGlzY29ubmVjdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29ubmVjdGlvbigpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKEFwcC5ST09UX1BBVEgpLnJlcXVlc3QoInRleHQvcGxhaW4iKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsaWVudFN0cmluZ1Jlc3BvbnNlKCkgeworICAgICAgICBTdHJpbmcgcyA9IHRhcmdldCgpLnBhdGgoQXBwLlJPT1RfUEFUSCkucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoSGVsbG9Xb3JsZFJlc291cmNlLkNMSUNIRURfTUVTU0FHRSwgcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNDbGllbnRSZXF1ZXN0cygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGludCBSRVFVRVNUUyA9IDEwOworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaChSRVFVRVNUUyk7CisgICAgICAgIGZpbmFsIGxvbmcgdGljID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUkVRVUVTVFM7IGkrKykgeworICAgICAgICAgICAgZmluYWwgaW50IGlkID0gaTsKKyAgICAgICAgICAgIHRhcmdldCgpLnBhdGgoQXBwLlJPT1RfUEFUSCkucmVxdWVzdCgpLmFzeW5jKCkuZ2V0KG5ldyBJbnZvY2F0aW9uQ2FsbGJhY2s8UmVzcG9uc2U+KCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbXBsZXRlZChSZXNwb25zZSByZXNwb25zZSkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhIZWxsb1dvcmxkUmVzb3VyY2UuQ0xJQ0hFRF9NRVNTQUdFLCByZXN1bHQpOworICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBmYWlsZWQoVGhyb3dhYmxlIGVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIGVycm9yLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgICBsYXRjaC5hd2FpdCgxMCAqIGdldEFzeW5jVGltZW91dE11bHRpcGxpZXIoKSwgVGltZVVuaXQuU0VDT05EUyk7CisgICAgICAgIGZpbmFsIGxvbmcgdG9jID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoSGVsbG9Xb3JsZFRlc3QuY2xhc3MuZ2V0TmFtZSgpKS5pbmZvKCJFeGVjdXRlZCBpbjogIiArICh0b2MgLSB0aWMpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIZWFkKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoQXBwLlJPT1RfUEFUSCkucmVxdWVzdCgpLmhlYWQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSwgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZvb0Jhck9wdGlvbnMoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aChBcHAuUk9PVF9QQVRIKS5yZXF1ZXN0KCkuaGVhZGVyKCJBY2NlcHQiLCAiZm9vL2JhciIpLm9wdGlvbnMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBmaW5hbCBTdHJpbmcgYWxsb3dIZWFkZXIgPSByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIkFsbG93Iik7CisgICAgICAgIF9jaGVja0FsbG93Q29udGVudChhbGxvd0hlYWRlcik7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9vL2JhciIsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcmVzcG9uc2UuZ2V0TGVuZ3RoKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRleHRQbGFpbk9wdGlvbnMoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aChBcHAuUk9PVF9QQVRIKS5yZXF1ZXN0KCkuaGVhZGVyKCJBY2NlcHQiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTikub3B0aW9ucygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBhbGxvd0hlYWRlciA9IHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiQWxsb3ciKTsKKyAgICAgICAgX2NoZWNrQWxsb3dDb250ZW50KGFsbG93SGVhZGVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3BvbnNlQm9keSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgX2NoZWNrQWxsb3dDb250ZW50KHJlc3BvbnNlQm9keSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF9jaGVja0FsbG93Q29udGVudChmaW5hbCBTdHJpbmcgY29udGVudCkgeworICAgICAgICBhc3NlcnRUcnVlKGNvbnRlbnQuY29udGFpbnMoIkdFVCIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb250ZW50LmNvbnRhaW5zKCJIRUFEIikpOworICAgICAgICBhc3NlcnRUcnVlKGNvbnRlbnQuY29udGFpbnMoIk9QVElPTlMiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ1Jlc291cmNlTm90Rm91bmQoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aChBcHAuUk9PVF9QQVRIICsgImFyYml0cmFyeSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwNCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aChBcHAuUk9PVF9QQVRIKS5wYXRoKCJhcmJpdHJhcnkiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDQsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBSdW5TZXBhcmF0ZWx5CisgICAgcHVibGljIHZvaWQgdGVzdExvZ2dpbmdGaWx0ZXJDbGllbnRDbGFzcygpIHsKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IGNsaWVudCgpOworICAgICAgICBjbGllbnQucmVnaXN0ZXIoQ3VzdG9tTG9nZ2luZ0ZpbHRlci5jbGFzcykucHJvcGVydHkoImZvbyIsICJiYXIiKTsKKyAgICAgICAgQ3VzdG9tTG9nZ2luZ0ZpbHRlci5wcmVGaWx0ZXJDYWxsZWQgPSBDdXN0b21Mb2dnaW5nRmlsdGVyLnBvc3RGaWx0ZXJDYWxsZWQgPSAwOworICAgICAgICBTdHJpbmcgcyA9IHRhcmdldCgpLnBhdGgoQXBwLlJPT1RfUEFUSCkucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoSGVsbG9Xb3JsZFJlc291cmNlLkNMSUNIRURfTUVTU0FHRSwgcyk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBDdXN0b21Mb2dnaW5nRmlsdGVyLnByZUZpbHRlckNhbGxlZCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBDdXN0b21Mb2dnaW5nRmlsdGVyLnBvc3RGaWx0ZXJDYWxsZWQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQFJ1blNlcGFyYXRlbHkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9nZ2luZ0ZpbHRlckNsaWVudEluc3RhbmNlKCkgeworICAgICAgICBDbGllbnQgY2xpZW50ID0gY2xpZW50KCk7CisgICAgICAgIGNsaWVudC5yZWdpc3RlcihuZXcgQ3VzdG9tTG9nZ2luZ0ZpbHRlcigpKS5wcm9wZXJ0eSgiZm9vIiwgImJhciIpOworICAgICAgICBDdXN0b21Mb2dnaW5nRmlsdGVyLnByZUZpbHRlckNhbGxlZCA9IEN1c3RvbUxvZ2dpbmdGaWx0ZXIucG9zdEZpbHRlckNhbGxlZCA9IDA7CisgICAgICAgIFN0cmluZyBzID0gdGFyZ2V0KCkucGF0aChBcHAuUk9PVF9QQVRIKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhIZWxsb1dvcmxkUmVzb3VyY2UuQ0xJQ0hFRF9NRVNTQUdFLCBzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIEN1c3RvbUxvZ2dpbmdGaWx0ZXIucHJlRmlsdGVyQ2FsbGVkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIEN1c3RvbUxvZ2dpbmdGaWx0ZXIucG9zdEZpbHRlckNhbGxlZCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAUnVuU2VwYXJhdGVseQorICAgIHB1YmxpYyB2b2lkIHRlc3RMb2dnaW5nRmlsdGVyVGFyZ2V0Q2xhc3MoKSB7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKS5wYXRoKEFwcC5ST09UX1BBVEgpOworICAgICAgICB0YXJnZXQucmVnaXN0ZXIoQ3VzdG9tTG9nZ2luZ0ZpbHRlci5jbGFzcykucHJvcGVydHkoImZvbyIsICJiYXIiKTsKKyAgICAgICAgQ3VzdG9tTG9nZ2luZ0ZpbHRlci5wcmVGaWx0ZXJDYWxsZWQgPSBDdXN0b21Mb2dnaW5nRmlsdGVyLnBvc3RGaWx0ZXJDYWxsZWQgPSAwOworICAgICAgICBTdHJpbmcgcyA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhIZWxsb1dvcmxkUmVzb3VyY2UuQ0xJQ0hFRF9NRVNTQUdFLCBzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIEN1c3RvbUxvZ2dpbmdGaWx0ZXIucHJlRmlsdGVyQ2FsbGVkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIEN1c3RvbUxvZ2dpbmdGaWx0ZXIucG9zdEZpbHRlckNhbGxlZCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAUnVuU2VwYXJhdGVseQorICAgIHB1YmxpYyB2b2lkIHRlc3RMb2dnaW5nRmlsdGVyVGFyZ2V0SW5zdGFuY2UoKSB7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKS5wYXRoKEFwcC5ST09UX1BBVEgpOworICAgICAgICB0YXJnZXQucmVnaXN0ZXIobmV3IEN1c3RvbUxvZ2dpbmdGaWx0ZXIoKSkucHJvcGVydHkoImZvbyIsICJiYXIiKTsKKyAgICAgICAgQ3VzdG9tTG9nZ2luZ0ZpbHRlci5wcmVGaWx0ZXJDYWxsZWQgPSBDdXN0b21Mb2dnaW5nRmlsdGVyLnBvc3RGaWx0ZXJDYWxsZWQgPSAwOworICAgICAgICBTdHJpbmcgcyA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhIZWxsb1dvcmxkUmVzb3VyY2UuQ0xJQ0hFRF9NRVNTQUdFLCBzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIEN1c3RvbUxvZ2dpbmdGaWx0ZXIucHJlRmlsdGVyQ2FsbGVkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIEN1c3RvbUxvZ2dpbmdGaWx0ZXIucG9zdEZpbHRlckNhbGxlZCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAUnVuU2VwYXJhdGVseQorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25maWd1cmF0aW9uVXBkYXRlKCkgeworICAgICAgICBDbGllbnQgY2xpZW50MSA9IGNsaWVudCgpOworICAgICAgICBjbGllbnQxLnJlZ2lzdGVyKEN1c3RvbUxvZ2dpbmdGaWx0ZXIuY2xhc3MpLnByb3BlcnR5KCJmb28iLCAiYmFyIik7CisKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KGNsaWVudDEuZ2V0Q29uZmlndXJhdGlvbigpKTsKKyAgICAgICAgQ3VzdG9tTG9nZ2luZ0ZpbHRlci5wcmVGaWx0ZXJDYWxsZWQgPSBDdXN0b21Mb2dnaW5nRmlsdGVyLnBvc3RGaWx0ZXJDYWxsZWQgPSAwOworICAgICAgICBTdHJpbmcgcyA9IHRhcmdldCgpLnBhdGgoQXBwLlJPT1RfUEFUSCkucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoSGVsbG9Xb3JsZFJlc291cmNlLkNMSUNIRURfTUVTU0FHRSwgcyk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBDdXN0b21Mb2dnaW5nRmlsdGVyLnByZUZpbHRlckNhbGxlZCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBDdXN0b21Mb2dnaW5nRmlsdGVyLnBvc3RGaWx0ZXJDYWxsZWQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2h0dHAtcGF0Y2gvUkVBRE1FLk1EIGIvZXhhbXBsZXMvaHR0cC1wYXRjaC9SRUFETUUuTUQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ2ZjZhZAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2h0dHAtcGF0Y2gvUkVBRE1FLk1ECkBAIC0wLDAgKzEsMTAxIEBACitbLy9dOiAjICIgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICIKK1svL106ICMgIiAiCitbLy9dOiAjICIgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlICIKK1svL106ICMgIiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCAiCitbLy9dOiAjICIgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLiAiCitbLy9dOiAjICIgIgorWy8vXTogIyAiIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UgIgorCitKZXJzZXkgSFRUUCBQQVRDSAorPT09PT09PT09PT09PT09PT0KKworIyMjICpKZXJzZXkgSFRUUCBQQVRDSCBTdXBwb3J0IEV4YW1wbGUqCisKK1RoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIGltcGxlbWVudCBnZW5lcmljIHN1cHBvcnQgZm9yCitbSFRUUCBQQVRDSCBNZXRob2QgKFJGQy01Nzg5KV0oaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzU3ODkpCit2aWEgSkFYLVJTIHJlYWRlciBpbnRlcmNlcHRvci4gVGhlIGV4YW1wbGUgaGFzIGJlZW4gY3JlYXRlZCBiYXNlZCBvbgorW3RoaXMgR2VyYXJkIERhdmlzb24ncyBibG9nZW50cnldIChodHRwOi8va2luZ3NmbGVldC5ibG9nc3BvdC5jby51ay8yMDE0LzAyL3RyYW5zcGFyZW50LXBhdGNoLXN1cHBvcnQtaW4tamF4LXJzLTIwLmh0bWwpLgorVGhlIHBhdGNoIGZvcm1hdCBzdXBwb3J0ZWQgYnkgdGhpcyBleGFtcGxlIGlzIFtKU09OIFBhdGNoIChSRkMtNjkwMildKGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzY5MDIpLgorCitDb250ZW50cworLS0tLS0tLS0KKworVGhlIG1hcHBpbmcgb2YgdGhlIFVSSSBwYXRoIHNwYWNlIGlzIHByZXNlbnRlZCBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOgorCitVUkkgcGF0aCAgICAgICAgICAgICAgICAgfCBSZXNvdXJjZSBjbGFzcyAgICAgIHwgSFRUUCBtZXRob2RzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0KKyoqXy9wYXRjaGFibGUtc3RhdGVfKiogICB8IFBhdGNoYWJsZVJlc291cmNlICAgfCBHRVQsIFBBVENICisKK0FzIHlvdSBjYW4gc2VlIGluIHRoZSB0YWJsZSwgdGhlcmUgaXMgb25seSBhIHNpbmdsZSByZXNvdXJjZSBkZXBsb3llZCBpbgordGhpcyBhcHBsaWNhdGlvbiwgdGhhdCBzdXBwb3J0cyBgR0VUYCBhbmQgYFBBVENIYCBtZXRob2RzLiBUaGUgcmVzb3VyY2UKK3JlcHJlc2VudHMgYSAqcGF0Y2hhYmxlKiBzdGF0ZSwgd2hpY2ggY29uc2lzdHMgb2YgMyBwcm9wZXJ0aWVzOgorCistICAgYSBgdGl0bGVgIHRleHQgcHJvcGVydHksCistICAgYSBgbWVzc2FnZWAgdGV4dCBwcm9wZXJ0eSwgYW5kCistICAgYSBgbGlzdGAgcHJvcGVydHkgdGhhdCByZXByZXNlbnRzIGEgbGlzdC9hcnJheSBvZiB0ZXh0IHN0cmluZ3MuCisKK1RoaXMgc3RhdGUgY2FuIGJlIHBhdGNoIHZpYSBIVFRQIEdFVCBtZXRob2QgYnkgc2VuZGluZyB0aGUgZGVzaXJlZAorcGF0Y2gvZGlmZiBpbiB0aGUgSlNPTiBQYXRjaCBmb3JtYXQgYXMgZGVmaW5lZCBpbiBSRkMtNjkwMiwgZm9yIGV4YW1wbGU6CisKK2BgYGphdmFzY3JpcHQKK1sKKyAgeworICAgICJvcCIgOiAicmVwbGFjZSIsCisgICAgInBhdGgiIDogIi9tZXNzYWdlIiwKKyAgICAidmFsdWUiIDogInBhdGNoZWRNZXNzYWdlIgorICB9LCB7CisgICAgIm9wIiA6ICJhZGQiLAorICAgICJwYXRoIiA6ICIvbGlzdC8tIiwKKyAgICAidmFsdWUiIDogIm9uZSIKKyAgfQorXQorYGBgCisKK1RoaXMgcGF0Y2ggd2lsbCBpbnN0cnVjdCB0aGUgcmVzb3VyY2UgdG8gcmVwbGFjZSBpdCdzIGBtZXNzYWdlYCBwcm9wZXJ0eQorY29udGVudCB3aXRoIGEgbmV3IGAicGF0Y2hlZE1lc3NhZ2UiYCB0ZXh0IGFuZCBhbHNvIHRvIGFwcGVuZCBhIG5ldworYCJvbmUiYCBzdHJpbmcgdmFsdWUgdG8gdGhlIGxpc3Qgb2YgdmFsdWVkIGNvbnRhaW5lZCBpbiB0aGUgYGxpc3RgCitwcm9wZXJ0eS4KKworKFNlZSBgSHR0cFBhdGNoVGVzdGAgZm9yIG1vcmUgZGV0YWlscy4pCisKK1NhbXBsZSBSZXNwb25zZQorLS0tLS0tLS0tLS0tLS0tCisKK1lvdSBjYW4gYXBwbHkgYSBwYXRjaCB1c2luZyBjdXJsOgorCis+ICAgICBjdXJsIC12IC1YIFBBVENIIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9odHRwLXBhdGNoL3BhdGNoYWJsZS1zdGF0ZSAtSCAiQ29udGVudC1UeXBlOmFwcGxpY2F0aW9uL2pzb24tcGF0Y2granNvbiIgLWQgJ1t7Cis+ICAgICAgICAib3AiOiAicmVwbGFjZSIsCis+ICAgICAgICAicGF0aCI6ICIvbWVzc2FnZSIsCis+ICAgICAgICAidmFsdWUiOiAicGF0Y2hlZE1lc3NhZ2UiCis+ICAgICB9LCB7Cis+ICAgICAgICAib3AiOiAiYWRkIiwKKz4gICAgICAgICJwYXRoIjogIi9saXN0Ly0iLAorPiAgICAgICAgInZhbHVlIjogIm9uZSIKKz4gICAgIH1dJworCitUaGUgYXBwbGljYXRpb24gd2lsbCBhbnN3ZXIgd2l0aCBhIHBhdGNoZWQgb2JqZWN0OgorCitgYGBqYXZhc2NyaXB0Cit7CisgICAibGlzdCIgOiBbICJvbmUiIF0sCisgICAibWVzc2FnZSIgOiAicGF0Y2hlZE1lc3NhZ2UiLAorICAgInRpdGxlIiA6ICIiCit9CitgYGAKKworUnVubmluZyB0aGUgRXhhbXBsZQorLS0tLS0tLS0tLS0tLS0tLS0tLQorCitSdW4gdGhlIGV4YW1wbGUgYXMgZm9sbG93czoKKworPiAgICAgbXZuIGNsZWFuIGNvbXBpbGUgZXhlYzpqYXZhCisKK1RoaXMgZGVwbG95cyB0aGUgZXhhbXBsZSB1c2luZyBbR3JpenpseV0oaHR0cDovL2dyaXp6bHkuamF2YS5uZXQvKSBjb250YWluZXIuCisKK0EgW1dBREwgZGVzY3JpcHRpb25dKGh0dHA6Ly93YWRsLmphdmEubmV0LyNzcGVjKSBtYXkgYmUgYWNjZXNzZWQgYXQgdGhlIFVSTDoKKworLSAgIDxodHRwOi8vbG9jYWxob3N0OjgwODAvaHR0cC1wYXRjaC9hcHBsaWNhdGlvbi53YWRsPgorCitUaGUgcmVzb3VyY2UgaXMgYXZhaWxhYmxlIGF0CisKKy0gICA8aHR0cDovL2xvY2FsaG9zdDo4MDgwL2h0dHAtcGF0Y2gvcGF0Y2hhYmxlLXN0YXRlPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaHR0cC1wYXRjaC9wb20ueG1sIGIvZXhhbXBsZXMvaHR0cC1wYXRjaC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZDUxNzkKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9odHRwLXBhdGNoL3BvbS54bWwKQEAgLTAsMCArMSw5OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmh0dHAtcGF0Y2g8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktZXhhbXBsZXMtaHR0cC1wYXRjaDwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgSmVyc2V5IGV4YW1wbGUgZm9yIGltcGxlbWVudGluZyBnZW5lcmljIFBBVENIIHN1cHBvcnQgdmlhIEpBWC1SUyByZWFkZXIgaW50ZXJjZXB0b3IuCisgICAgICAgIFRha2VuIGZyb20gR2VyYXJkIERhdmlzb24ncyBibG9nIGVudHJ5OgorICAgICAgICBodHRwOi8va2luZ3NmbGVldC5ibG9nc3BvdC5jby51ay8yMDE0LzAyL3RyYW5zcGFyZW50LXBhdGNoLXN1cHBvcnQtaW4tamF4LXJzLTIwLmh0bWwKKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1ncml6emx5Mi1odHRwPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWhrMjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS5naXRodWIuZmdlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNvbi1wYXRjaDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjEuOTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLW1veHk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLWpzb24tcHJvY2Vzc2luZzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1idW5kbGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dHlwZT5wb208L3R5cGU+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb25uZWN0b3JzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWdyaXp6bHktY29ubmVjdG9yPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGVjLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPG1haW5DbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5odHRwcGF0Y2guQXBwPC9tYWluQ2xhc3M+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5yZWxlYXNlPC9pZD4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2h0dHAtcGF0Y2gvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9odHRwcGF0Y2gvQXBwLmphdmEgYi9leGFtcGxlcy9odHRwLXBhdGNoL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaHR0cHBhdGNoL0FwcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZmM5ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9odHRwLXBhdGNoL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaHR0cHBhdGNoL0FwcC5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuaHR0cHBhdGNoOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuZXh0LkNvbnRleHRSZXNvbHZlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkyLmh0dHBzZXJ2ZXIuR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1veHkuanNvbi5Nb3h5SnNvbkNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmdyaXp6bHkuaHR0cC5zZXJ2ZXIuSHR0cFNlcnZlcjsKKworLyoqCisgKiBIVFRQIFBBVENIIERlbW8gQXBwbGljYXRpb24uCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEFwcCB7CisgICAgLyoqCisgICAgICogUHJldmVudHMgaW5zdGFudGlhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIEFwcCgpIHsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgQkFTRV9VUkkgPSBVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvaHR0cC1wYXRjaCIpOworICAgIC8qKgorICAgICAqIFJvb3QgcmVzb3VyY2UgcGF0aC4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RfUEFUSCA9ICJwYXRjaGFibGUtc3RhdGUiOworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJKZXJzZXkgSFRUUCBQQVRDSCBTdXBwb3J0IEV4YW1wbGUgQXBwIik7CisKKyAgICAgICAgICAgIGZpbmFsIEh0dHBTZXJ2ZXIgc2VydmVyID0gR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5LmNyZWF0ZUh0dHBTZXJ2ZXIoQkFTRV9VUkksIGNyZWF0ZSgpLCBmYWxzZSk7CisgICAgICAgICAgICBSdW50aW1lLmdldFJ1bnRpbWUoKS5hZGRTaHV0ZG93bkhvb2sobmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIuc2h1dGRvd25Ob3coKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KSk7CisgICAgICAgICAgICBzZXJ2ZXIuc3RhcnQoKTsKKworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFN0cmluZy5mb3JtYXQoIkFwcGxpY2F0aW9uIHN0YXJ0ZWQuXG5Ucnkgb3V0ICVzLyVzXG5TdG9wIHRoZSBhcHBsaWNhdGlvbiB1c2luZyBDVFJMK0MiLAorICAgICAgICAgICAgICAgICAgICBCQVNFX1VSSSwKKyAgICAgICAgICAgICAgICAgICAgUk9PVF9QQVRIKSk7CisKKyAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuam9pbigpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiB8IEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKEFwcC5jbGFzcy5nZXROYW1lKCkpLmxvZyhMZXZlbC5TRVZFUkUsIG51bGwsIGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBKQVgtUlMgYXBwbGljYXRpb24gZm9yIHRoZSBleGFtcGxlLgorICAgICAqCisgICAgICogQHJldHVybiBjcmVhdGVkIGFwcGxpY2F0aW9uIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VDb25maWcgY3JlYXRlKCkgeworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyBhcHAgPSBuZXcgUmVzb3VyY2VDb25maWcoCisgICAgICAgICAgICAgICAgUGF0Y2hhYmxlUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgT3B0aW9uc0FjY2VwdFBhdGNoSGVhZGVyRmlsdGVyLmNsYXNzLAorICAgICAgICAgICAgICAgIFBhdGNoaW5nSW50ZXJjZXB0b3IuY2xhc3MpOworCisgICAgICAgIGFwcC5yZWdpc3RlcihjcmVhdGVNb3h5SnNvblJlc29sdmVyKCkpOworCisgICAgICAgIC8vIEVuYWJsZSBvbi1kZW1hbmQgdHJhY2luZworICAgICAgICBhcHAucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5UUkFDSU5HLCAiT05fREVNQU5EIik7CisKKyAgICAgICAgcmV0dXJuIGFwcDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUge0BsaW5rIGphdmF4LndzLnJzLmV4dC5Db250ZXh0UmVzb2x2ZXJ9IGZvciB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW94eS5qc29uLk1veHlKc29uQ29uZmlnfQorICAgICAqIGZvciB0aGlzIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgTW94eUpzb25Db25maWd9IGNvbnRleHQgcmVzb2x2ZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDb250ZXh0UmVzb2x2ZXI8TW94eUpzb25Db25maWc+IGNyZWF0ZU1veHlKc29uUmVzb2x2ZXIoKSB7CisgICAgICAgIGZpbmFsIE1veHlKc29uQ29uZmlnIG1veHlKc29uQ29uZmlnID0gbmV3IE1veHlKc29uQ29uZmlnKCkKKyAgICAgICAgICAgICAgICAuc2V0Rm9ybWF0dGVkT3V0cHV0KHRydWUpCisgICAgICAgICAgICAgICAgLnNldE5hbWVzcGFjZVNlcGFyYXRvcignOicpOworICAgICAgICByZXR1cm4gbW94eUpzb25Db25maWcucmVzb2x2ZXIoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9odHRwLXBhdGNoL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaHR0cHBhdGNoL09wdGlvbnNBY2NlcHRQYXRjaEhlYWRlckZpbHRlci5qYXZhIGIvZXhhbXBsZXMvaHR0cC1wYXRjaC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2h0dHBwYXRjaC9PcHRpb25zQWNjZXB0UGF0Y2hIZWFkZXJGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzE1Y2UwCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvaHR0cC1wYXRjaC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2h0dHBwYXRjaC9PcHRpb25zQWNjZXB0UGF0Y2hIZWFkZXJGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmh0dHBwYXRjaDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5IdHRwTWV0aG9kOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworCisvKioKKyAqIEEgSkFYLVJTIGNvbnRhaW5lciByZXNwb25zZSBmaWx0ZXIgdGhhdCBhcHBsaWVzIHtAY29kZSBBY2NlcHQtUGF0Y2h9IGhlYWRlcgorICogdG8gYW55IHJlc3BvbnNlIHRvIGFuIHtAY29kZSBPUFRJT05TfSByZXF1ZXN0LgorICoKKyAqIEBhdXRob3IgR2VyYXJkIERhdmlzb24gKGdlcmFyZC5kYXZpc29uIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgT3B0aW9uc0FjY2VwdFBhdGNoSGVhZGVyRmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ0VQVF9QQVRDSF9IRUFERVIgPSAiQWNjZXB0LVBhdGNoIjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZpbHRlcihmaW5hbCBDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCwgZmluYWwgQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKEh0dHBNZXRob2QuT1BUSU9OUy5lcXVhbHMocmVxdWVzdENvbnRleHQuZ2V0TWV0aG9kKCkpKSB7CisgICAgICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaGVhZGVycyA9IHJlc3BvbnNlQ29udGV4dC5nZXRIZWFkZXJzKCk7CisgICAgICAgICAgICBpZiAoIWhlYWRlcnMuY29udGFpbnNLZXkoQUNDRVBUX1BBVENIX0hFQURFUikpIHsKKyAgICAgICAgICAgICAgICBoZWFkZXJzLnB1dFNpbmdsZShBQ0NFUFRfUEFUQ0hfSEVBREVSLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9QQVRDSF9KU09OKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2h0dHAtcGF0Y2gvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9odHRwcGF0Y2gvUGF0Y2hhYmxlUmVzb3VyY2UuamF2YSBiL2V4YW1wbGVzL2h0dHAtcGF0Y2gvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9odHRwcGF0Y2gvUGF0Y2hhYmxlUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmU2NDQwCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvaHR0cC1wYXRjaC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2h0dHBwYXRjaC9QYXRjaGFibGVSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuaHR0cHBhdGNoOworCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBBVENIOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKKy8qKgorICogUGF0Y2hhYmxlIHJlc291cmNlLgorICoKKyAqIEBhdXRob3IgR2VyYXJkIERhdmlzb24gKGdlcmFyZC5kYXZpc29uIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aChBcHAuUk9PVF9QQVRIKQorQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorcHVibGljIGNsYXNzIFBhdGNoYWJsZVJlc291cmNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBTdGF0ZSBzdGF0ZSA9IG5ldyBTdGF0ZSgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFBhdGNoYWJsZVJlc291cmNlLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgY3VycmVudCByZXNvdXJjZSBzdGF0ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gY3VycmVudCByZXNvdXJjZSBzdGF0ZS4KKyAgICAgKi8KKyAgICBAR0VUCisgICAgQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorICAgIHB1YmxpYyBTdGF0ZSBnZXRTdGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBuZXcgcmVzb3VyY2Ugc3RhdGUuCisgICAgICogPHA+CisgICAgICogV2Ugb25seSBuZWVkIHRvIHJlcGxhY2UgdGhlIHJlc291cmNlIHN0YXRlIHdpdGggdGhlIG9uZSBwYXNzZWQgaW50byB0aGUgbWV0aG9kCisgICAgICogYXMgdGhlIGFjdHVhbCBzdGF0ZSBwYXRjaGluZyBvY2N1cnJlZCBpbiB0aGUge0BsaW5rIFBhdGNoaW5nSW50ZXJjZXB0b3J9LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuZXdTdGF0ZSBuZXcgcmVzb3VyY2Ugc3RhdGUuCisgICAgICogQHJldHVybiBwYXRjaGVkIHN0YXRlLgorICAgICAqLworICAgIEBQQVRDSAorICAgIEBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9QQVRDSF9KU09OKQorICAgIHB1YmxpYyBTdGF0ZSBwYXRjaFN0YXRlKFN0YXRlIG5ld1N0YXRlKSB7CisgICAgICAgIExPR0dFUi5pbmZvKCJOZXcgcmVzb3VyY2Ugc3RhdGU6ICIgKyBuZXdTdGF0ZS50b1N0cmluZygpKTsKKyAgICAgICAgc3RhdGUgPSBuZXdTdGF0ZTsKKyAgICAgICAgcmV0dXJuIG5ld1N0YXRlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2h0dHAtcGF0Y2gvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9odHRwcGF0Y2gvUGF0Y2hpbmdJbnRlcmNlcHRvci5qYXZhIGIvZXhhbXBsZXMvaHR0cC1wYXRjaC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2h0dHBwYXRjaC9QYXRjaGluZ0ludGVyY2VwdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU0NTFiNAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2h0dHAtcGF0Y2gvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9odHRwcGF0Y2gvUGF0Y2hpbmdJbnRlcmNlcHRvci5qYXZhCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmh0dHBwYXRjaDsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5JbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkSGFzaE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SZWFkZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5NZXNzYWdlQm9keVdvcmtlcnM7CisKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuSnNvbk5vZGU7CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLk9iamVjdE1hcHBlcjsKK2ltcG9ydCBjb20uZ2l0aHViLmZnZS5qc29ucGF0Y2guSnNvblBhdGNoOworaW1wb3J0IGNvbS5naXRodWIuZmdlLmpzb25wYXRjaC5Kc29uUGF0Y2hFeGNlcHRpb247CisKKy8qKgorICogSkFYLVJTIHJlYWRlciBpbnRlcmNlcHRvciB0aGF0IGltcGxlbWVudHMgc2VydmVyLXNpZGUgUEFUQ0ggc3VwcG9ydC4KKyAqCisgKiBAYXV0aG9yIEdlcmFyZCBEYXZpc29uIChnZXJhcmQuZGF2aXNvbiBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFBhdGNoaW5nSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBSZWFkZXJJbnRlcmNlcHRvciB7CisKKyAgICBwcml2YXRlIGZpbmFsIFVyaUluZm8gdXJpSW5mbzsKKyAgICBwcml2YXRlIGZpbmFsIE1lc3NhZ2VCb2R5V29ya2VycyB3b3JrZXJzOworCisgICAgLyoqCisgICAgICoge0Bjb2RlIFBhdGNoaW5nSW50ZXJjZXB0b3J9IGluamVjdGlvbiBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmlJbmZvIHtAY29kZSBqYXZheC53cy5ycy5jb3JlLlVyaUluZm99IHByb3h5IGluc3RhbmNlLgorICAgICAqIEBwYXJhbSB3b3JrZXJzIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLk1lc3NhZ2VCb2R5V29ya2Vyc30gbWVzc2FnZSBib2R5IHdvcmtlcnMuCisgICAgICovCisgICAgcHVibGljIFBhdGNoaW5nSW50ZXJjZXB0b3IoQENvbnRleHQgVXJpSW5mbyB1cmlJbmZvLCBAQ29udGV4dCBNZXNzYWdlQm9keVdvcmtlcnMgd29ya2VycykgeworICAgICAgICB0aGlzLnVyaUluZm8gPSB1cmlJbmZvOworICAgICAgICB0aGlzLndvcmtlcnMgPSB3b3JrZXJzOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgYXJvdW5kUmVhZEZyb20oUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0IHJlYWRlckludGVyY2VwdG9yQ29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIC8vIEdldCB0aGUgcmVzb3VyY2Ugd2UgYXJlIGJlaW5nIGNhbGxlZCBvbiwgYW5kIGZpbmQgdGhlIEdFVCBtZXRob2QKKyAgICAgICAgT2JqZWN0IHJlc291cmNlID0gdXJpSW5mby5nZXRNYXRjaGVkUmVzb3VyY2VzKCkuZ2V0KDApOworCisgICAgICAgIE1ldGhvZCBmb3VuZCA9IG51bGw7CisgICAgICAgIGZvciAoTWV0aG9kIG5leHQgOiByZXNvdXJjZS5nZXRDbGFzcygpLmdldE1ldGhvZHMoKSkgeworICAgICAgICAgICAgaWYgKG5leHQuZ2V0QW5ub3RhdGlvbihHRVQuY2xhc3MpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IG5leHQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZm91bmQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24oIk5vIG1hdGNoaW5nIEdFVCBtZXRob2Qgb24gcmVzb3VyY2UiKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEludm9rZSB0aGUgZ2V0IG1ldGhvZCB0byBnZXQgdGhlIHN0YXRlIHdlIGFyZSB0cnlpbmcgdG8gcGF0Y2gKKyAgICAgICAgT2JqZWN0IGJlYW47CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBiZWFuID0gZm91bmQuaW52b2tlKHJlc291cmNlKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvbnZlcnQgdGhpcyBvYmplY3QgdG8gYSBhbiBhcnJheSBvZiBieXRlcworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgTWVzc2FnZUJvZHlXcml0ZXIgYm9keVdyaXRlciA9CisgICAgICAgICAgICAgICAgd29ya2Vycy5nZXRNZXNzYWdlQm9keVdyaXRlcihiZWFuLmdldENsYXNzKCksIGJlYW4uZ2V0Q2xhc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBbm5vdGF0aW9uWzBdLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFKTsKKworICAgICAgICBib2R5V3JpdGVyLndyaXRlVG8oYmVhbiwgYmVhbi5nZXRDbGFzcygpLCBiZWFuLmdldENsYXNzKCksCisgICAgICAgICAgICAgICAgbmV3IEFubm90YXRpb25bMF0sIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUsCisgICAgICAgICAgICAgICAgbmV3IE11bHRpdmFsdWVkSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKSwgYmFvcyk7CisKKworICAgICAgICAvLyBVc2UgdGhlIEphY2tzb24gMi54IGNsYXNzZXMgdG8gY29udmVydCBib3RoIHRoZSBpbmNvbWluZyBwYXRjaAorICAgICAgICAvLyBhbmQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIG9iamVjdCBpbnRvIGEgSnNvbk5vZGUgLyBKc29uUGF0Y2gKKyAgICAgICAgT2JqZWN0TWFwcGVyIG1hcHBlciA9IG5ldyBPYmplY3RNYXBwZXIoKTsKKyAgICAgICAgSnNvbk5vZGUgc2VydmVyU3RhdGUgPSBtYXBwZXIucmVhZFZhbHVlKGJhb3MudG9CeXRlQXJyYXkoKSwgSnNvbk5vZGUuY2xhc3MpOworICAgICAgICBKc29uTm9kZSBwYXRjaEFzTm9kZSA9IG1hcHBlci5yZWFkVmFsdWUocmVhZGVySW50ZXJjZXB0b3JDb250ZXh0LmdldElucHV0U3RyZWFtKCksIEpzb25Ob2RlLmNsYXNzKTsKKyAgICAgICAgSnNvblBhdGNoIHBhdGNoID0gSnNvblBhdGNoLmZyb21Kc29uKHBhdGNoQXNOb2RlKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gQXBwbHkgdGhlIHBhdGNoCisgICAgICAgICAgICBKc29uTm9kZSByZXN1bHQgPSBwYXRjaC5hcHBseShzZXJ2ZXJTdGF0ZSk7CisKKyAgICAgICAgICAgIC8vIFN0cmVhbSB0aGUgcmVzdWx0ICYgbW9kaWZ5IHRoZSBzdHJlYW0gb24gdGhlIHJlYWRlckludGVyY2VwdG9yCisgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcmVzdWx0QXNCeXRlQXJyYXkgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICBtYXBwZXIud3JpdGVWYWx1ZShyZXN1bHRBc0J5dGVBcnJheSwgcmVzdWx0KTsKKyAgICAgICAgICAgIHJlYWRlckludGVyY2VwdG9yQ29udGV4dC5zZXRJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocmVzdWx0QXNCeXRlQXJyYXkudG9CeXRlQXJyYXkoKSkpOworCisgICAgICAgICAgICAvLyBQYXNzIGNvbnRyb2wgYmFjayB0byB0aGUgSmVyc2V5IGNvZGUKKyAgICAgICAgICAgIHJldHVybiByZWFkZXJJbnRlcmNlcHRvckNvbnRleHQucHJvY2VlZCgpOworICAgICAgICB9IGNhdGNoIChKc29uUGF0Y2hFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uKCJFcnJvciBhcHBseWluZyBwYXRjaC4iLCBleCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9odHRwLXBhdGNoL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaHR0cHBhdGNoL1N0YXRlLmphdmEgYi9leGFtcGxlcy9odHRwLXBhdGNoL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaHR0cHBhdGNoL1N0YXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzAwZWExNQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2h0dHAtcGF0Y2gvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9odHRwcGF0Y2gvU3RhdGUuamF2YQpAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5odHRwcGF0Y2g7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKioKKyAqIEEgcmVzb3VyY2Ugc3RhdGUgbW9kZWxsZWQgYXMgSmF2YSBiZWFuICh0aGF0IGNhbiBiZSBwYXRjaGVkKS4KKyAqCisgKiBAYXV0aG9yIEdlcmFyZCBEYXZpc29uIChnZXJhcmQuZGF2aXNvbiBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFN0YXRlIHsKKworICAgIHByaXZhdGUgU3RyaW5nIHRpdGxlOworICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2U7CisgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbGlzdDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgYmVhbiBpbnN0YW5jZSB3aXRob3V0IGFueSBkYXRhLgorICAgICAqLworICAgIHB1YmxpYyBTdGF0ZSgpIHsKKyAgICAgICAgdGhpcy50aXRsZSA9ICIiOworICAgICAgICB0aGlzLm1lc3NhZ2UgPSAiIjsKKyAgICAgICAgdGhpcy5saXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TGlzdChMaXN0PFN0cmluZz4gbGlzdCkgeworICAgICAgICB0aGlzLmxpc3QgPSBsaXN0OworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0TGlzdCgpIHsKKyAgICAgICAgcmV0dXJuIGxpc3Q7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGl0bGUoU3RyaW5nIHRpdGxlKSB7CisgICAgICAgIHRoaXMudGl0bGUgPSB0aXRsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgeworICAgICAgICByZXR1cm4gdGl0bGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmICh0aGlzID09IG8pIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIFN0YXRlIGJlYW4gPSAoU3RhdGUpIG87CisKKyAgICAgICAgaWYgKGxpc3QgIT0gbnVsbCA/ICFsaXN0LmVxdWFscyhiZWFuLmxpc3QpIDogYmVhbi5saXN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobWVzc2FnZSAhPSBudWxsID8gIW1lc3NhZ2UuZXF1YWxzKGJlYW4ubWVzc2FnZSkgOiBiZWFuLm1lc3NhZ2UgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICh0aXRsZSAhPSBudWxsID8gIXRpdGxlLmVxdWFscyhiZWFuLnRpdGxlKSA6IGJlYW4udGl0bGUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IHRpdGxlICE9IG51bGwgPyB0aXRsZS5oYXNoQ29kZSgpIDogMDsKKyAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyAobWVzc2FnZSAhPSBudWxsID8gbWVzc2FnZS5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgKGxpc3QgIT0gbnVsbCA/IGxpc3QuaGFzaENvZGUoKSA6IDApOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiU3RhdGV7IgorICAgICAgICAgICAgICAgICsgInRpdGxlPSciICsgdGl0bGUgKyAnXCcnCisgICAgICAgICAgICAgICAgKyAiLCBtZXNzYWdlPSciICsgbWVzc2FnZSArICdcJycKKyAgICAgICAgICAgICAgICArICIsIGxpc3Q9IiArIGxpc3QKKyAgICAgICAgICAgICAgICArICd9JzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9odHRwLXBhdGNoL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaHR0cHBhdGNoL0h0dHBQYXRjaFRlc3QuamF2YSBiL2V4YW1wbGVzL2h0dHAtcGF0Y2gvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9odHRwcGF0Y2gvSHR0cFBhdGNoVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYmJhY2QKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9odHRwLXBhdGNoL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaHR0cHBhdGNoL0h0dHBQYXRjaFRlc3QuamF2YQpAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5odHRwcGF0Y2g7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBqYXZheC5qc29uLkpzb247CitpbXBvcnQgamF2YXguanNvbi5Kc29uQXJyYXk7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkuY29ubmVjdG9yLkdyaXp6bHlDb25uZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEhUVFAgUEFUQ0ggRXhhbXBsZSB1bml0IHRlc3RzLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBIdHRwUGF0Y2hUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICAvLyBVbmNvbW1lbnQgdG8gZW5hYmxlIG1lc3NhZ2UgZXhjaGFuZ2UgbG9nZ2luZworICAgICAgICAvLyBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworICAgICAgICAvLyBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworICAgICAgICByZXR1cm4gQXBwLmNyZWF0ZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihBcHAuY3JlYXRlTW94eUpzb25SZXNvbHZlcigpKQorICAgICAgICAgICAgICAgIC5jb25uZWN0b3JQcm92aWRlcihuZXcgR3JpenpseUNvbm5lY3RvclByb3ZpZGVyKCkpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyB0ZXN0IHZlcmlmaWVzIHRoYXQgdGhlIHBhdGNoaW5nIG9mIHRoZSByZXNvdXJjZSBzdGF0ZSB3b3Jrcy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgcGF0Y2ggaXMgY3JlYXRlZCB1c2luZyB0aGUgbmV3IHN0YW5kYXJkIEpTT04gUHJvY2Vzc2luZyBBUEkgZm9yIEphdmEgYW5kCisgICAgICogaXMgdGhlbiBzZW50IHRvIHRoZSBzZXJ2ZXIuIHtAY29kZSBQQVRDSH0gcmVzcG9uc2UgYXMgd2VsbCBhcyB0aGUgbmV3IHJlc291cmNlCisgICAgICogc3RhdGUgb2J0YWluZWQgdmlhIHN1YnNlcXVlbnQge0Bjb2RlIEdFVH0gbWV0aG9kIGlzIHZlcmlmaWVkIGFnYWluc3QgdGhlIGV4cGVjdGVkCisgICAgICogc3RhdGUuCisgICAgICogPC9wPgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhdGNoKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KEFwcC5ST09UX1BBVEgpOworCisgICAgICAgIC8vIGluaXRpYWwgcHJlY29uZGl0aW9uIGNoZWNrCisgICAgICAgIGZpbmFsIFN0YXRlIGV4cGVjdGVkID0gbmV3IFN0YXRlKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgdGFyZ2V0LnJlcXVlc3QoImFwcGxpY2F0aW9uL2pzb24iKS5nZXQoU3RhdGUuY2xhc3MpKTsKKworICAgICAgICAvLyBhcHBseSBmaXJzdCBwYXRjaAorICAgICAgICBleHBlY3RlZC5zZXRNZXNzYWdlKCJwYXRjaGVkTWVzc2FnZSIpOworICAgICAgICBleHBlY3RlZC5zZXRUaXRsZSgicGF0Y2hlZFRpdGxlIik7CisgICAgICAgIGV4cGVjdGVkLmdldExpc3QoKS5hZGQoIm9uZSIpOworICAgICAgICBleHBlY3RlZC5nZXRMaXN0KCkuYWRkKCJ0d28iKTsKKworICAgICAgICBKc29uQXJyYXkgcGF0Y2hfMSA9IEpzb24uY3JlYXRlQXJyYXlCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuYWRkKEpzb24uY3JlYXRlT2JqZWN0QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKCJvcCIsICJyZXBsYWNlIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoInBhdGgiLCAiL21lc3NhZ2UiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFkZCgidmFsdWUiLCBleHBlY3RlZC5nZXRNZXNzYWdlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAuYWRkKEpzb24uY3JlYXRlT2JqZWN0QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKCJvcCIsICJyZXBsYWNlIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoInBhdGgiLCAiL3RpdGxlIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoInZhbHVlIiwgZXhwZWN0ZWQuZ2V0VGl0bGUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAgICAgICAgIC5hZGQoSnNvbi5jcmVhdGVPYmplY3RCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoIm9wIiwgInJlcGxhY2UiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFkZCgicGF0aCIsICIvbGlzdCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKCJ2YWx1ZSIsIEpzb24uY3JlYXRlQXJyYXlCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChleHBlY3RlZC5nZXRMaXN0KCkuZ2V0KDApKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKGV4cGVjdGVkLmdldExpc3QoKS5nZXQoMSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCB0YXJnZXQucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1ldGhvZCgiUEFUQ0giLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW50aXR5LmVudGl0eShwYXRjaF8xLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9QQVRDSF9KU09OKSwgU3RhdGUuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCB0YXJnZXQucmVxdWVzdCgiYXBwbGljYXRpb24vanNvbiIpLmdldChTdGF0ZS5jbGFzcykpOworCisgICAgICAgIC8vIGFwcGx5IHNlY29uZCBwYXRjaAorICAgICAgICBleHBlY3RlZC5nZXRMaXN0KCkuYWRkKCJ0aHJlZSIpOworCisgICAgICAgIEpzb25BcnJheSBwYXRjaF8yID0gSnNvbi5jcmVhdGVBcnJheUJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5hZGQoSnNvbi5jcmVhdGVPYmplY3RCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoIm9wIiwgImFkZCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKCJwYXRoIiwgIi9saXN0Ly0iKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFkZCgidmFsdWUiLCBleHBlY3RlZC5nZXRMaXN0KCkuZ2V0KDIpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgdGFyZ2V0LnJlcXVlc3QoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tZXRob2QoIlBBVENIIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudGl0eS5lbnRpdHkocGF0Y2hfMiwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fUEFUQ0hfSlNPTiksIFN0YXRlLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgdGFyZ2V0LnJlcXVlc3QoImFwcGxpY2F0aW9uL2pzb24iKS5nZXQoU3RhdGUuY2xhc3MpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9odHRwLXRyYWNlL1JFQURNRS5NRCBiL2V4YW1wbGVzL2h0dHAtdHJhY2UvUkVBRE1FLk1ECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NzY5YjMKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9odHRwLXRyYWNlL1JFQURNRS5NRApAQCAtMCwwICsxLDQ2IEBACitbLy9dOiAjICIgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICIKK1svL106ICMgIiAiCitbLy9dOiAjICIgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlICIKK1svL106ICMgIiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCAiCitbLy9dOiAjICIgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLiAiCitbLy9dOiAjICIgIgorWy8vXTogIyAiIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UgIgorCitKZXJzZXkgSFRUUCBQQVRDSAorPT09PT09PT09PT09PT09PT0KKworIyMjICpKZXJzZXkgSFRUUCBQQVRDSCBTdXBwb3J0IEV4YW1wbGUqCisKK1RoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIGltcGxlbWVudCBhIHN1cHBvcnQgZm9yICoqSFRUUCBUUkFDRSBtZXRob2QqKiB2aWEgKipIdHRwTWV0aG9kKiogYW5ub3RhdGlvbiBpbiBKZXJzZXkuCisKK1VzaW5nIEh0dHBNZXRob2QgYW5ub3RhdGlvbiB5b3UgY2FuIGltcGxlbWVudCB3aGF0ZXZlciBuYW1lIG9mIGFuIEhUVFAgbWV0aG9kIHlvdSB3YW50LgorCitDb250ZW50cworLS0tLS0tLS0KKworVGhlIG1hcHBpbmcgb2YgdGhlIFVSSSBwYXRoIHNwYWNlIGlzIHByZXNlbnRlZCBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOgorCitVUkkgcGF0aCAgICAgICAgICAgICAgICAgICAgfCBSZXNvdXJjZSBjbGFzcyAgICAgIHwgSFRUUCBtZXRob2RzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0KKyoqXy90cmFjaW5nL2Fubm90YXRlZF8qKiAgICB8IFRyYWNpbmdSZXNvdXJjZSAgICAgfCBUUkFDRQorKipfL3RyYWNpbmcvcHJvZ3JhbW1hdGljXyoqIHwgLS0tICAgICAgICAgICAgICAgICB8IFRSQUNFCisKK1NhbXBsZSBSZXNwb25zZQorLS0tLS0tLS0tLS0tLS0tCisKK1lvdSBjYW4gdHJhY2UgeW91ciBhbm5vdGF0ZWQgcmVzb3VyY2UgdXNpbmcgdGhpcyBjb21tYW5kOgorCis+ICAgY3VybCAtdiAtWCBUUkFDRSBodHRwOi8vbG9jYWxob3N0Ojk5OTgvYmFzZS90cmFjaW5nL2Fubm90YXRlZAorCitvciBwcm9ncmFtbWF0aWMgcmVzb3VyY2U6CisKKz4gICBjdXJsIC12IC1YIFRSQUNFIGh0dHA6Ly9sb2NhbGhvc3Q6OTk5OC9iYXNlL3RyYWNpbmcvcHJvZ3JhbW1hdGljCisKK1J1bm5pbmcgdGhlIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworUnVuIHRoZSBleGFtcGxlIGFzIGZvbGxvd3M6CisKKz4gICAgIG12biBjbGVhbiBjb21waWxlIGV4ZWM6amF2YQorCitUaGlzIGRlcGxveXMgdGhlIGV4YW1wbGUgdXNpbmcgW0dyaXp6bHldKGh0dHA6Ly9ncml6emx5LmphdmEubmV0LykgY29udGFpbmVyLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2h0dHAtdHJhY2UvcG9tLnhtbCBiL2V4YW1wbGVzL2h0dHAtdHJhY2UvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGU3N2FiCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvaHR0cC10cmFjZS9wb20ueG1sCkBAIC0wLDAgKzEsNzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5odHRwLXRyYWNlPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LWV4YW1wbGVzLWh0dHAtdHJhY2U8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+SmVyc2V5IEhUVFAgVFJBQ0Ugc3VwcG9ydCBleGFtcGxlLjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLWdyaXp6bHkyLWh0dHA8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktaGsyPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbm5lY3RvcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktZ3JpenpseS1jb25uZWN0b3I8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmV4ZWMtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8bWFpbkNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmh0dHB0cmFjZS5BcHA8L21haW5DbGFzcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnJlbGVhc2U8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaHR0cC10cmFjZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2h0dHB0cmFjZS9BcHAuamF2YSBiL2V4YW1wbGVzL2h0dHAtdHJhY2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9odHRwdHJhY2UvQXBwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJkMDVhZgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2h0dHAtdHJhY2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9odHRwdHJhY2UvQXBwLmphdmEKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuaHR0cHRyYWNlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5Mi5odHRwc2VydmVyLkdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLkluZmxlY3RvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5ncml6emx5Lmh0dHAuc2VydmVyLkh0dHBTZXJ2ZXI7CisKKy8qKgorICogVGhpcyBpcyB0aGUgZXhhbXBsZSBlbnRyeSBwb2ludCwgd2hlcmUgSmVyc2V5IGFwcGxpY2F0aW9uIGdldHMgcG9wdWxhdGVkIGFuZCBwdWJsaXNoZWQKKyAqIHVzaW5nIHRoZSBHcml6emx5IDIgSFRUUCBjb250YWluZXIuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBBcHAgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIEJBU0VfVVJJID0gVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo5OTk4L2Jhc2UvIik7CisgICAgLyoqCisgICAgICogUHJvZ3JhbW1hdGljIHRyYWNpbmcgcm9vdCByZXNvdXJjZSBwYXRoLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RfUEFUSF9QUk9HUkFNTUFUSUMgPSAidHJhY2luZy9wcm9ncmFtbWF0aWMiOworICAgIC8qKgorICAgICAqIEFubm90YXRlZCBjbGFzcy1iYXNlZCB0cmFjaW5nIHJvb3QgcmVzb3VyY2UgcGF0aC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST09UX1BBVEhfQU5OT1RBVEVEID0gInRyYWNpbmcvYW5ub3RhdGVkIjsKKworICAgIC8qKgorICAgICAqIE1haW4gYXBwbGljYXRpb24gZW50cnkgcG9pbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXJncyBhcHBsaWNhdGlvbiBhcmd1bWVudHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJIVFRQIFRSQUNFIFN1cHBvcnQgSmVyc2V5IEV4YW1wbGUgQXBwIik7CisKKyAgICAgICAgICAgIGZpbmFsIEh0dHBTZXJ2ZXIgc2VydmVyID0gR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5LmNyZWF0ZUh0dHBTZXJ2ZXIoQkFTRV9VUkksIGNyZWF0ZSgpLCBmYWxzZSk7CisgICAgICAgICAgICBSdW50aW1lLmdldFJ1bnRpbWUoKS5hZGRTaHV0ZG93bkhvb2sobmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIuc2h1dGRvd25Ob3coKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KSk7CisgICAgICAgICAgICBzZXJ2ZXIuc3RhcnQoKTsKKworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICJBcHBsaWNhdGlvbiBzdGFydGVkLlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlRvIHRlc3QgVFJBQ0Ugd2l0aCBhIHByb2dyYW1tYXRpYyByZXNvdXJjZSwgc2VuZCBIVFRQIFRSQUNFIHJlcXVlc3QgdG86JW4gICVzJXMlbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJUbyB0ZXN0IFRSQUNFIHdpdGggYW4gYW5ub3RhdGVkIHJlc291cmNlLCBzZW5kIEhUVFAgVFJBQ0UgcmVxdWVzdCB0bzolbiAgJXMlcyVuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlN0b3AgdGhlIGFwcGxpY2F0aW9uIHVzaW5nIENUUkwrQyIsCisgICAgICAgICAgICAgICAgICAgIEJBU0VfVVJJLCBST09UX1BBVEhfUFJPR1JBTU1BVElDLAorICAgICAgICAgICAgICAgICAgICBCQVNFX1VSSSwgUk9PVF9QQVRIX0FOTk9UQVRFRCkpOworCisgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gfCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihBcHAuY2xhc3MuZ2V0TmFtZSgpKS5sb2coTGV2ZWwuU0VWRVJFLCBudWxsLCBleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgZXhhbXBsZSBhcHBsaWNhdGlvbiByZXNvdXJjZSBjb25maWd1cmF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBpbml0aWFsaXplZCByZXNvdXJjZSBjb25maWd1cmF0aW9uIG9mIHRoZSBleGFtcGxlIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VDb25maWcgY3JlYXRlKCkgeworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhUcmFjaW5nUmVzb3VyY2UuY2xhc3MpOworCisgICAgICAgIGZpbmFsIFJlc291cmNlLkJ1aWxkZXIgcmVzb3VyY2VCdWlsZGVyID0gUmVzb3VyY2UuYnVpbGRlcihST09UX1BBVEhfUFJPR1JBTU1BVElDKTsKKyAgICAgICAgcmVzb3VyY2VCdWlsZGVyLmFkZE1ldGhvZChUUkFDRS5OQU1FKS5oYW5kbGVkQnkobmV3IEluZmxlY3RvcjxDb250YWluZXJSZXF1ZXN0Q29udGV4dCwgUmVzcG9uc2U+KCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBSZXNwb25zZSBhcHBseShDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0KSB7CisgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3QgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uubm9Db250ZW50KCkuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soU3RyaW5naWZpZXIuc3RyaW5naWZ5KChDb250YWluZXJSZXF1ZXN0KSByZXF1ZXN0KSwgTWVkaWFUeXBlLlRFWFRfUExBSU4pLmJ1aWxkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICByZXR1cm4gcmVzb3VyY2VDb25maWcucmVnaXN0ZXJSZXNvdXJjZXMocmVzb3VyY2VCdWlsZGVyLmJ1aWxkKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2h0dHAtdHJhY2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9odHRwdHJhY2UvU3RyaW5naWZpZXIuamF2YSBiL2V4YW1wbGVzL2h0dHAtdHJhY2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9odHRwdHJhY2UvU3RyaW5naWZpZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODM5ZjFiCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvaHR0cC10cmFjZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2h0dHB0cmFjZS9TdHJpbmdpZmllci5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuaHR0cHRyYWNlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlcXVlc3Q7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdDsKKworLyoqCisgKiBSZXF1ZXN0IHN0cmluZ2lmaWVyLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBTdHJpbmdpZmllciB7CisKKyAgICBwcml2YXRlIFN0cmluZ2lmaWVyKCkgeworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmluZ2lmeShDb250YWluZXJSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisgICAgICAgIHByaW50UmVxdWVzdExpbmUoYnVmZmVyLCByZXF1ZXN0KTsKKyAgICAgICAgcHJpbnRQcmVmaXhlZEhlYWRlcnMoYnVmZmVyLCByZXF1ZXN0LmdldEhlYWRlcnMoKSk7CisKKyAgICAgICAgaWYgKHJlcXVlc3QuaGFzRW50aXR5KCkpIHsKKyAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQocmVxdWVzdC5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50UmVxdWVzdExpbmUoU3RyaW5nQnVpbGRlciBidWZmZXIsIENvbnRhaW5lclJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICBidWZmZXIuYXBwZW5kKHJlcXVlc3QuZ2V0TWV0aG9kKCkpLmFwcGVuZCgiICIpLmFwcGVuZChyZXF1ZXN0LmdldFVyaUluZm8oKS5nZXRSZXF1ZXN0VXJpKCkudG9BU0NJSVN0cmluZygpKS5hcHBlbmQoIlxuIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludFByZWZpeGVkSGVhZGVycyhTdHJpbmdCdWlsZGVyIGJ1ZmZlciwgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBoZWFkZXJzKSB7CisgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTGlzdDxTdHJpbmc+PiBlIDogaGVhZGVycy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBMaXN0PFN0cmluZz4gdmFsID0gZS5nZXRWYWx1ZSgpOworICAgICAgICAgICAgU3RyaW5nIGhlYWRlciA9IGUuZ2V0S2V5KCk7CisKKyAgICAgICAgICAgIGlmICh2YWwuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgICAgICBidWZmZXIuYXBwZW5kKGhlYWRlcikuYXBwZW5kKCI6ICIpLmFwcGVuZCh2YWwuZ2V0KDApKS5hcHBlbmQoIlxuIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gYWRkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgcyA6IHZhbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYWRkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJywnKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhZGQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQocyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoaGVhZGVyKS5hcHBlbmQoIjogIikuYXBwZW5kKHNiLnRvU3RyaW5nKCkpLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2h0dHAtdHJhY2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9odHRwdHJhY2UvVFJBQ0UuamF2YSBiL2V4YW1wbGVzL2h0dHAtdHJhY2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9odHRwdHJhY2UvVFJBQ0UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzdkNTIyCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvaHR0cC10cmFjZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2h0dHB0cmFjZS9UUkFDRS5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuaHR0cHRyYWNlOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuSHR0cE1ldGhvZDsKKworLyoqCisgKiBIVFRQIFRSQUNFIG1ldGhvZCBhbm5vdGF0aW9uLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK0BIdHRwTWV0aG9kKFRSQUNFLk5BTUUpCitAVGFyZ2V0KEVsZW1lbnRUeXBlLk1FVEhPRCkKK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitwdWJsaWMgQGludGVyZmFjZSBUUkFDRSB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJUUkFDRSI7Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9odHRwLXRyYWNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaHR0cHRyYWNlL1RyYWNpbmdSZXNvdXJjZS5qYXZhIGIvZXhhbXBsZXMvaHR0cC10cmFjZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2h0dHB0cmFjZS9UcmFjaW5nUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmZkMzcxCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvaHR0cC10cmFjZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2h0dHB0cmFjZS9UcmFjaW5nUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmh0dHB0cmFjZTsKKworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXF1ZXN0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3Q7CisKKy8qKgorICogVGhpcyB2ZXJ5IGJhc2ljIHJlc291cmNlIHNob3djYXNlcyBzdXBwb3J0IG9mIGEgSFRUUCBUUkFDRSBtZXRob2QsCisgKiBub3QgZGlyZWN0bHkgc3VwcG9ydGVkIGJ5IEpBWC1SUyBBUEkuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoQXBwLlJPT1RfUEFUSF9BTk5PVEFURUQpCitwdWJsaWMgY2xhc3MgVHJhY2luZ1Jlc291cmNlIHsKKworICAgIEBUUkFDRQorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIFN0cmluZyB0cmFjZShSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZ2lmaWVyLnN0cmluZ2lmeSgoQ29udGFpbmVyUmVxdWVzdCkgcmVxdWVzdCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaHR0cC10cmFjZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2h0dHB0cmFjZS9UcmFjZVN1cHBvcnRUZXN0LmphdmEgYi9leGFtcGxlcy9odHRwLXRyYWNlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaHR0cHRyYWNlL1RyYWNlU3VwcG9ydFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGVjNDE2Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvaHR0cC10cmFjZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2h0dHB0cmFjZS9UcmFjZVN1cHBvcnRUZXN0LmphdmEKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuaHR0cHRyYWNlOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseS5jb25uZWN0b3IuR3JpenpseUNvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworcHVibGljIGNsYXNzIFRyYWNlU3VwcG9ydFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5EVU1QX0VOVElUWSk7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisgICAgICAgIHJldHVybiBBcHAuY3JlYXRlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmdbXSBleHBlY3RlZEZyYWdtZW50c1Byb2dyYW1tYXRpYyA9IG5ldyBTdHJpbmdbXXsKKyAgICAgICAgICAgICJUUkFDRSBodHRwOi8vbG9jYWxob3N0OiIgKyB0aGlzLmdldFBvcnQoKSArICIvdHJhY2luZy9wcm9ncmFtbWF0aWMiCisgICAgfTsKKyAgICBwcml2YXRlIFN0cmluZ1tdIGV4cGVjdGVkRnJhZ21lbnRzQW5ub3RhdGVkID0gbmV3IFN0cmluZ1tdeworICAgICAgICAgICAgIlRSQUNFIGh0dHA6Ly9sb2NhbGhvc3Q6IiArIHRoaXMuZ2V0UG9ydCgpICsgIi90cmFjaW5nL2Fubm90YXRlZCIKKyAgICB9OworCisgICAgcHJpdmF0ZSBXZWJUYXJnZXQgcHJlcGFyZVRhcmdldChTdHJpbmcgcGF0aCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCk7CisgICAgICAgIHRhcmdldC5yZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIHJldHVybiB0YXJnZXQucGF0aChwYXRoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9ncmFtbWF0aWNBcHAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSBwcmVwYXJlVGFyZ2V0KEFwcC5ST09UX1BBVEhfUFJPR1JBTU1BVElDKS5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikubWV0aG9kKFRSQUNFLk5BTUUpOworCisgICAgICAgIGFzc2VydEVxdWFscyhSZXNwb25zZS5TdGF0dXMuT0suZ2V0U3RhdHVzQ29kZSgpLCByZXNwb25zZS5nZXRTdGF0dXNJbmZvKCkuZ2V0U3RhdHVzQ29kZSgpKTsKKworICAgICAgICBTdHJpbmcgcmVzcG9uc2VFbnRpdHkgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGZvciAoU3RyaW5nIGV4cGVjdGVkRnJhZ21lbnQgOiBleHBlY3RlZEZyYWdtZW50c1Byb2dyYW1tYXRpYykgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZnJhZ21lbnQgJyIgKyBleHBlY3RlZEZyYWdtZW50ICsgIicgbm90IGZvdW5kIGluIHJlc3BvbnNlOlxuIiArIHJlc3BvbnNlRW50aXR5LAorICAgICAgICAgICAgICAgICAgICAvLyB0b0xvd2VyQ2FzZSAtIGh0dHAgaGVhZGVyIGZpZWxkIG5hbWVzIGFyZSBjYXNlIGluc2Vuc2l0aXZlCisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlRW50aXR5LmNvbnRhaW5zKGV4cGVjdGVkRnJhZ21lbnQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFubm90YXRlZEFwcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHByZXBhcmVUYXJnZXQoQXBwLlJPT1RfUEFUSF9BTk5PVEFURUQpLnJlcXVlc3QoInRleHQvcGxhaW4iKS5tZXRob2QoVFJBQ0UuTkFNRSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJlc3BvbnNlLlN0YXR1cy5PSy5nZXRTdGF0dXNDb2RlKCksIHJlc3BvbnNlLmdldFN0YXR1c0luZm8oKS5nZXRTdGF0dXNDb2RlKCkpOworCisgICAgICAgIFN0cmluZyByZXNwb25zZUVudGl0eSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgZm9yIChTdHJpbmcgZXhwZWN0ZWRGcmFnbWVudCA6IGV4cGVjdGVkRnJhZ21lbnRzQW5ub3RhdGVkKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCBmcmFnbWVudCAnIiArIGV4cGVjdGVkRnJhZ21lbnQgKyAiJyBub3QgZm91bmQgaW4gcmVzcG9uc2U6XG4iICsgcmVzcG9uc2VFbnRpdHksCisgICAgICAgICAgICAgICAgICAgIC8vIHRvTG93ZXJDYXNlIC0gaHR0cCBoZWFkZXIgZmllbGQgbmFtZXMgYXJlIGNhc2UgaW5zZW5zaXRpdmUKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VFbnRpdHkuY29udGFpbnMoZXhwZWN0ZWRGcmFnbWVudCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhY2VXaXRoRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0VHJhY2VXaXRoRW50aXR5KGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNUcmFjZVdpdGhFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RUcmFjZVdpdGhFbnRpdHkodHJ1ZSwgZmFsc2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRyYWNlV2l0aEVudGl0eUdyaXp6bHlDb25uZWN0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RUcmFjZVdpdGhFbnRpdHkoZmFsc2UsIHRydWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFzeW5jVHJhY2VXaXRoRW50aXR5R3JpenpseUNvbm5lY3RvcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdFRyYWNlV2l0aEVudGl0eSh0cnVlLCB0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3RUcmFjZVdpdGhFbnRpdHkoZmluYWwgYm9vbGVhbiBpc0FzeW5jLCBmaW5hbCBib29sZWFuIHVzZUdyaXp6bHlDb25uZWN0aW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB1c2VHcml6emx5Q29ubmVjdGlvbiA/IGdldEdyaXp6bHlDbGllbnQoKS50YXJnZXQodGFyZ2V0KCkuZ2V0VXJpKCkpIDogdGFyZ2V0KCk7CisgICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQucGF0aChBcHAuUk9PVF9QQVRIX0FOTk9UQVRFRCk7CisKKyAgICAgICAgICAgIGZpbmFsIEVudGl0eTxTdHJpbmc+IGVudGl0eSA9IEVudGl0eS5lbnRpdHkoInRyYWNlIiwgTWVkaWFUeXBlLldJTERDQVJEX1RZUEUpOworCisgICAgICAgICAgICBSZXNwb25zZSByZXNwb25zZTsKKyAgICAgICAgICAgIGlmICghaXNBc3luYykgeworICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5tZXRob2QoVFJBQ0UuTkFNRSwgZW50aXR5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLmFzeW5jKCkubWV0aG9kKFRSQUNFLk5BTUUsIGVudGl0eSkuZ2V0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZhaWwoIkEgVFJBQ0UgcmVxdWVzdCBNVVNUIE5PVCBpbmNsdWRlIGFuIGVudGl0eS4gKHJlc3BvbnNlPSIgKyByZXNwb25zZSArICIpIik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBPSworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBDbGllbnQgZ2V0R3JpenpseUNsaWVudCgpIHsKKyAgICAgICAgcmV0dXJuIENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KG5ldyBDbGllbnRDb25maWcoKS5jb25uZWN0b3JQcm92aWRlcihuZXcgR3JpenpseUNvbm5lY3RvclByb3ZpZGVyKCkpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9odHRwcy1jbGllbnRzZXJ2ZXItZ3JpenpseS9SRUFETUUuTUQgYi9leGFtcGxlcy9odHRwcy1jbGllbnRzZXJ2ZXItZ3JpenpseS9SRUFETUUuTUQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E2MTgwZAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2h0dHBzLWNsaWVudHNlcnZlci1ncml6emx5L1JFQURNRS5NRApAQCAtMCwwICsxLDExNCBAQAorWy8vXTogIyAiIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAiCitbLy9dOiAjICIgIgorWy8vXTogIyAiIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAiCitbLy9dOiAjICIgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQgIgorWy8vXTogIyAiIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4gIgorWy8vXTogIyAiICIKK1svL106ICMgIiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlICIKKworSFRUUFMgQ2xpZW50L1NlcnZlciBFeGFtcGxlIC0gR3JpenpseQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byBkZXZlbG9wIFJFU1RmdWwgSFRUUFMgU2VydmVyIHVzaW5nCitHcml6emx5IGFuZCBob3cgdG8gaW1wbGVtZW50IEhUVFBTIENsaWVudCB1c2luZyBKZXJzZXkgd2l0aCBzZXJ2ZXIKK2F1dGhlbnRpY2F0aW9uLgorCitDb250ZW50cworLS0tLS0tLS0KKworIyMjIFNlcnZlciBzaWRlCisKK1RoaXMgZXhhbXBsZSBjb25zaXN0cyBvZiBqdXN0IG9uZSByZXNvdXJjZSAtIFJvb3RSZXNvdXJjZSwgd2hpY2ggaXMKK2Jhc2ljYWxseSBjb3B5IG9mIEhlbGxvV29ybGQgUmVzb3VyY2UgZnJvbSBjb3JyZXNwb25kaW5nIHNhbXBsZSB3aXRoCitsaXR0bGUgaW1wcm92ZW1lbnQuCisKK090aGVyIGNsYXNzZXMgYXJlIHVzZWQgdG8gc3RhcnQgR3JpenpseSBlbWJlZGRlZCBzZXJ2ZXIgYW5kIHNldCB1cCBpdHMKK2F1dGhlbnRpY2F0aW9uIGFuZCBhdXRob3JpemF0aW9uIG1lY2hhbmlzbSBhbmQga2V5c3RvcmUgYW5kIHRydXN0c3RvcmUuCisKKyMjIyBDbGllbnQgc2lkZQorCitDbGllbnQgc2lkZSBpcyBpbXBsZW1lbnRlZCBhcyBhIHRlc3QgY2FzZSwgc2VlIGNsYXNzCisqKm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmh0dHBzY2xpZW50c2VydmVyZ3JpenpseS5NYWluVGVzdCoqLCBhbmQKK2l0cyBtZXRob2QgYHRlc3RTU0xXaXRoQXV0aGAgKG90aGVycyBhcmUganVzdCB0ZXN0cyBmb3IgaW52YWxpZAorYXV0aG9yaXphdGlvbikuIEZpcnN0IHRoaW5nIHlvdSBoYXZlIHRvIGRvIGlmIHlvdSB3YW50IHRvIGNvbW11bmljYXRlCit3aXRoIHNlcnZpY2UgdmlhIGh0dHBzIGlzIHNldCB1cCAqKlNTTENvbnRleHQqKiB3aGljaCBpcyBiYXNpY2FsbHkKK3Byb3ZpZGluZyBrZXlzdG9yZSBhbmQgdHJ1c3RzdG9yZS4gS2V5c3RvcmUgaXMgdXNlZCBmb3Igc3RvcmluZyBvd24ga2V5cworYW5kIHRydXN0c3RvcmUgaXMgdXNlZCBmb3Igc3RvcmluZyBjZXJ0aWZpY2F0ZXMgdG8gd2hpY2ggeW91IGhhdmUKK2RlY2lkZWQgdG8gdHJ1c3QuIEZvciBtb3JlIGluZm9ybWF0aW9ucyBzZWUgW1xbMVxdXSgjSlNTRVJlZkd1aWRlKS4KKworVG8gc2V0ICoqU1NMQ29udGV4dCoqIG9uIEplcnNleSBjbGllbnQgeW91IGhhdmUgdG8gc2V0IGl0IGFzIGEgcHJvcGVydHkKK3RvIHRoZSBjbGllbnQgaW5zdGFuY2U6CisKKyAgICBDbGllbnQgY2xpZW50ID0gQ2xpZW50RmFjdG9yeS5uZXdDbGllbnQoKTsKKyAgICBjbGllbnQuY29uZmlndXJhdGlvbigpLnNldFByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuU1NMX0NPTlRFWFQsIGNvbnRleHQpOworCisjIyMgQ2VydGlmaWNhdGVzIHNldHVwCisKKyoqVGhlc2Ugc3RlcHMgYXJlIG5vdCByZXF1aXJlZCB0byBydW4gdGhpcyBleGFtcGxlLiBQcmUtZ2VuZXJhdGVkCitrZXlzdG9yZSBhbmQgdHJ1c3RzdG9yZSBmaWxlcyBhcmUgYWxyZWFkeSBwcmVzZW50LioqCisKK1dlIG5lZWRlZCBzZXQgdXAgZmV3IHRoaW5ncyB0byBnZXQgdGhpcyBleGFtcGxlIHdvcmtpbmc6CisKKy0gICBnZW5lcmF0ZSBjbGllbnQgYW5kIHNlcnZlciBrZXlzCistICAgZ2VuZXJhdGUgY2xpZW50IGFuZCBzZXJ2ZXIgY2VydGlmaWNhdGVzCistICAgaW1wb3J0IGNlcnRpZmljYXRlcyB0byBjb3JyZXNwb25kaW5nIHRydXN0c3RvcmVzCisKK0NsaWVudCBjZXJ0aWZpY2F0ZSBpcyBuZWVkZWQgdG9vIGJlY2F1c2Ugd2UncmUgZ29pbmcgdG8gdXNlIHNlcnZlci1zaWRlCitjZXJ0aWZpY2F0ZSBhdXRoZW50aWNhdGlvbiBhcyB3ZWxsICh5ZXMsIGFmdGVyIHRoaXMgSHR0cCBCYXNpYworYXV0aGVudGljYXRpb24gc2VlbXMgdG8gYmUga2luZCBvZiByZWR1bmRhbnQgYnV0IHRoZXJlIGFyZSBzb21lIHVzZWNhc2VzCit3aGVyZSB5b3UgbWlnaHQgd2FudCB0byB1c2UgdGhlbSBib3RoKS4KK0dlbmVyYXRlIGNsaWVudCBrZXkgYW5kIHN0b3JlIGl0IGludG8ga2V5c3RvcmU6XAorCisgICAga2V5dG9vbCAtZ2Vua2V5IC1rZXlzdG9yZSAuL2tleXN0b3JlX2NsaWVudCAtYWxpYXMgY2xpZW50S2V5IC1kbmFtZSAiQ049Q2xpZW50LCBPVT1KZXJzZXksIE89T3JhY2xlIENvcnBvcmF0aW9uLCBMPVByYWd1ZSwgU1Q9Q3plY2ggUmVwdWJsaWMsIEM9Q1oiCisKK0dlbmVyYXRlIGNsaWVudCBjZXJ0aWZpY2F0ZSAodGhpcyB3aWxsIGdlbmVyYXRlIHNlbGYtc2lnbmVkIGNlcnRpZmljYXRlOworaWYgeW91IGhhdmUgY2VydGlmaWNhdGlvbiBhdXRob3JpdHkgYW5kIHdhbnQgZ2VuZXJhdGUgY2VydGlmaWNhdGUKK3JlcXVlc3QsIHVzZSBrZXl0b29sIC1jZXJ0cmVxKToKKworICAgIGtleXRvb2wgLWV4cG9ydCAtYWxpYXMgY2xpZW50S2V5IC1yZmMgLWtleXN0b3JlIC4va2V5c3RvcmVfY2xpZW50ID4gLi9jbGllbnQuY2VydAorCitJbXBvcnQgY2xpZW50IGNlcnRpZmljYXRlIHRvIHNlcnZlcnMgdHJ1c3RzdG9yZToKKworICAgIGtleXRvb2wgLWltcG9ydCAtYWxpYXMgY2xpZW50Q2VydCAtZmlsZSAuL2NsaWVudC5jZXJ0IC1rZXlzdG9yZSAuL3RydXN0c3RvcmVfc2VydmVyCisKK1RoZXNlIHN0ZXBzIGFyZSBzaW1pbGFyIGZvciBzZXJ2ZXIgc2lkZToKKworICAgIGtleXRvb2wgLWdlbmtleSAta2V5c3RvcmUgLi9rZXlzdG9yZV9zZXJ2ZXIgLWFsaWFzIHNlcnZlcktleSAtZG5hbWUgIkNOPWxvY2FsaG9zdCwgT1U9SmVyc2V5LCBPPU9yYWNsZSBDb3Jwb3JhdGlvbiwgTD1QcmFndWUsIFNUPUN6ZWNoIFJlcHVibGljLCBDPUNaIgorICAgIGtleXRvb2wgLWV4cG9ydCAtYWxpYXMgc2VydmVyS2V5IC1yZmMgLWtleXN0b3JlIC4va2V5c3RvcmVfc2VydmVyID4gLi9zZXJ2ZXIuY2VydAorICAgIGtleXRvb2wgLWltcG9ydCAtYWxpYXMgc2VydmVyQ2VydCAtZmlsZSAuL3NlcnZlci5jZXJ0IC1rZXlzdG9yZSAuL3RydXN0c3RvcmVfY2xpZW50CisKK1J1bm5pbmcgdGhlIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworUnVuIHRoZSBleGFtcGxlIGFzIGZvbGxvd3M6CisKK3Rlc3QKKworPiAgICAgbXZuIGNsZWFuIHRlc3QKKworcnVuCisKKz4gICAgIG12biBjb21waWxlIGV4ZWM6amF2YQorCitGcm9tIGEgd2ViIGJyb3dzZXIsIHZpc2l0OlwKKyAqKlRoaXMgd29uJ3Qgd29yayEgXCoqKgorCis+IGBodHRwczovL2xvY2FsaG9zdDo4NDYzYAorCisqKlxbXCpcXSoqIFlvdXIgd2ViIGJyb3dzZXIgbmVlZHMgaGF2ZSBhbmQgdXNlIGdlbmVyYXRlZCBjbGllbnQga2V5cy4gT3IKK3lvdSBoYXZlIHRvIGRpc2FibGUgc2VydmVyIHNpZGUgY2xpZW50IGF1dGhlbnRpY2F0aW9uIC0gc2V0IE5lZWRDbGllbnRBdXRoIHRvIGZhbHNlOgorKipuZXcgU1NMRW5naW5lQ29uZmlndXJhdG9yKHNzbENvbnRleHQpLnNldENsaWVudE1vZGUoZmFsc2UpLnNldE5lZWRDbGllbnRBdXRoKGZhbHNlKSoqIGluICpTZXJ2ZXIuamF2YSouCisKK1RoZW4gaWdub3JlIGFueSBzZWN1cml0eSB3YXJuaW5nIChzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZXMgYXJlbid0IHRydXN0ZWQgaW4gZ2VuZXJhbCkKK2FuZCBsb2dpbiB3aXRoIHVzZXJuYW1lICJ1c2VyIiBhbmQgcGFzc3dvcmQgInBhc3N3b3JkIi4gVGV4dCAiSkVSU0VZCitIVFRQUyBFWEFNUExFIiBzaG91bGQgYXBwZWFyLgorCitNb3ppbGEgRmlyZWZveCBhbmQgSW50ZXJuZXQgRXhwbG9yZXIgZG9uJ3QgYWxsb3cgdXNlcnMgdG8gZGlzcGxheSBhbnkKK2NvbnRlbnQgcHJvdmlkZWQgb24gYmVoYWxmIG9mIGFueSBzZWxmLXNpZ25lZCBjZXJ0aWZpY2F0ZSBzbyB5b3UgaGF2ZSB0bwordXNlIHNvbWUgb3RoZXIgYnJvd3NlciB3aGljaCBhbGxvd3MgdGhpcyAoZm9yIGV4YW1wbGUgU2FmYXJpIG9yIE9wZXJhKS4KKworUmVmZXJlbmNlcworLS0tLS0tLS0tLQorCitcWzFcXQorPGh0dHA6Ly9kb3dubG9hZC5vcmFjbGUuY29tL2phdmFzZS82L2RvY3MvdGVjaG5vdGVzL2d1aWRlcy9zZWN1cml0eS9qc3NlL0pTU0VSZWZHdWlkZS5odG1sPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaHR0cHMtY2xpZW50c2VydmVyLWdyaXp6bHkvY2xpZW50LmNlcnQgYi9leGFtcGxlcy9odHRwcy1jbGllbnRzZXJ2ZXItZ3JpenpseS9jbGllbnQuY2VydApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDNkODhiCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvaHR0cHMtY2xpZW50c2VydmVyLWdyaXp6bHkvY2xpZW50LmNlcnQKQEAgLTAsMCArMSwxNyBAQAorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlESlRDQ0F1T2dBd0lCQWdJRVQ1WnlZakFMQmdjcWhrak9PQVFEQlFBd2RqRUxNQWtHQTFVRUJoTUNRMW94RnpBVkJnTlZCQWdUCitEa042WldOb0lGSmxjSFZpYkdsak1ROHdEUVlEVlFRSEV3WlFjbUZuZFdVeEd6QVpCZ05WQkFvVEVrOXlZV05zWlNCRGIzSndiM0poCitkR2x2YmpFUE1BMEdBMVVFQ3hNR1NtVnljMlY1TVE4d0RRWURWUVFERXdaRGJHbGxiblF3SGhjTk1USXdOREkwTURreU9UQTJXaGNOCitNVEl3TnpJek1Ea3lPVEEyV2pCMk1Rc3dDUVlEVlFRR0V3SkRXakVYTUJVR0ExVUVDQk1PUTNwbFkyZ2dVbVZ3ZFdKc2FXTXhEekFOCitCZ05WQkFjVEJsQnlZV2QxWlRFYk1Ca0dBMVVFQ2hNU1QzSmhZMnhsSUVOdmNuQnZjbUYwYVc5dU1ROHdEUVlEVlFRTEV3WktaWEp6CitaWGt4RHpBTkJnTlZCQU1UQmtOc2FXVnVkRENDQWJjd2dnRXNCZ2NxaGtqT09BUUJNSUlCSHdLQmdRRDlmMU9CSFhVU0tWTGZTcHd1Cis3T1RuOWhHM1VqenZSQURESGorQXRsRW1hVVZkUUNKUisxazlqVmo2djhYMXVqRDJ5NXRWYk5lQk80QWRORy95Wm1DM2E1bFFwYVNmCituK2dFZXhBaXdrKzdxZGYrdDhZYitEdFg1OGFvcGhVUEJQdUQ5dFBGSHNNQ05WUVRXaGFSTXZaMTg2NHJZZGNxNy9JaUF4bWQwVWdCCit4d0lWQUpkZ1VJOFZJd3ZNc3BLNWdxTHJoQXZ3V0J6MUFvR0JBUGZob0lYV216M2V5N3lyWERhNFY3bDVsSys3K2pycWd2bFhUQXM5CitCNEpuVVZsWGpyclVXVS9tY1FjUWdZQzBTUlp4SStoTUtCWVR0ODhKTW96SXB1RThGbnFMVkh5TktPQ2pyaDRyczZaMWtXNmpmd3Y2CitJVFZpOGZ0aWVnRWtPOHlrOGI2b1VaQ0pxSVBmNFZybG53YVNpMlplZ0h0VkpXUUJURHYrejBrcUE0R0VBQUtCZ0JtSE5BQ0RrMWF3Cit2VVpqc1JlY01TQmxra0NTcXIvY0NyWU9zTndwZmxlUUtzTTZyZE9vZnVqQU5VVmVvVUZoWDhlOEs0NUZrbnhFcUF1Z21oR1E5TlJuCit1TWVucnZWK1h1cEMwVjJ1R0gwT2NpWGVBekhiZmVJdEJDYm1KY3ZNZFBXL3ErSTJ2RmNodjYrYWpFaU5Ib2dCckNjM3F3U01oeVZRCit1ZzJmWEhtSk1Bc0dCeXFHU000NEJBTUZBQU12QURBc0FoUVl6blltSDBocmNMbmk0RXFYM092YWMrcE5KZ0lVZWhuRWFXMVY1ZGpuCitkaFlCQVlVa1N5Y0VUbDQ9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCmRpZmYgLS1naXQgYS9leGFtcGxlcy9odHRwcy1jbGllbnRzZXJ2ZXItZ3JpenpseS9rZXlzdG9yZV9jbGllbnQgYi9leGFtcGxlcy9odHRwcy1jbGllbnRzZXJ2ZXItZ3JpenpseS9rZXlzdG9yZV9jbGllbnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAxNmZkMgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2h0dHBzLWNsaWVudHNlcnZlci1ncml6emx5L2tleXN0b3JlX2NsaWVudApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9odHRwcy1jbGllbnRzZXJ2ZXItZ3JpenpseS9rZXlzdG9yZV9zZXJ2ZXIgYi9leGFtcGxlcy9odHRwcy1jbGllbnRzZXJ2ZXItZ3JpenpseS9rZXlzdG9yZV9zZXJ2ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdjOTNmYwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2h0dHBzLWNsaWVudHNlcnZlci1ncml6emx5L2tleXN0b3JlX3NlcnZlcgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9odHRwcy1jbGllbnRzZXJ2ZXItZ3JpenpseS9wb20ueG1sIGIvZXhhbXBsZXMvaHR0cHMtY2xpZW50c2VydmVyLWdyaXp6bHkvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjA2MGIwCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvaHR0cHMtY2xpZW50c2VydmVyLWdyaXp6bHkvcG9tLnhtbApAQCAtMCwwICsxLDg1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorCisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5odHRwcy1jbGllbnRzZXJ2ZXItZ3JpenpseTwvYXJ0aWZhY3RJZD4KKyAgICA8bmFtZT5qZXJzZXktZXhhbXBsZXMtaHR0cHMtY2xpZW50c2VydmVyLWdyaXp6bHk8L25hbWU+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgSFRUUFMgQ2xpZW50L1NlcnZlciBleGFtcGxlIG9uIEdyaXp6bHkuPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguYW5ub3RhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LmFubm90YXRpb24tYXBpPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItZ3JpenpseTItc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY2xpZW50PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29ubmVjdG9yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1ncml6emx5LWNvbm5lY3RvcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1oazI8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGVjLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPG1haW5DbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5odHRwc2NsaWVudHNlcnZlcmdyaXp6bHkuU2VydmVyPC9tYWluQ2xhc3M+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5yZWxlYXNlPC9pZD4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2h0dHBzLWNsaWVudHNlcnZlci1ncml6emx5L3NlcnZlci5jZXJ0IGIvZXhhbXBsZXMvaHR0cHMtY2xpZW50c2VydmVyLWdyaXp6bHkvc2VydmVyLmNlcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIwODQxYwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2h0dHBzLWNsaWVudHNlcnZlci1ncml6emx5L3NlcnZlci5jZXJ0CkBAIC0wLDAgKzEsMTcgQEAKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJREt6Q0NBdW1nQXdJQkFnSUVUNVp5empBTEJnY3Foa2pPT0FRREJRQXdlVEVMTUFrR0ExVUVCaE1DUTFveEZ6QVZCZ05WQkFnVAorRGtONlpXTm9JRkpsY0hWaWJHbGpNUTh3RFFZRFZRUUhFd1pRY21GbmRXVXhHekFaQmdOVkJBb1RFazl5WVdOc1pTQkRiM0p3YjNKaAorZEdsdmJqRVBNQTBHQTFVRUN4TUdTbVZ5YzJWNU1SSXdFQVlEVlFRREV3bHNiMk5oYkdodmMzUXdIaGNOTVRJd05ESTBNRGt6TURVMAorV2hjTk1USXdOekl6TURrek1EVTBXakI1TVFzd0NRWURWUVFHRXdKRFdqRVhNQlVHQTFVRUNCTU9RM3BsWTJnZ1VtVndkV0pzYVdNeAorRHpBTkJnTlZCQWNUQmxCeVlXZDFaVEViTUJrR0ExVUVDaE1TVDNKaFkyeGxJRU52Y25CdmNtRjBhVzl1TVE4d0RRWURWUVFMRXdaSworWlhKelpYa3hFakFRQmdOVkJBTVRDV3h2WTJGc2FHOXpkRENDQWJjd2dnRXNCZ2NxaGtqT09BUUJNSUlCSHdLQmdRRDlmMU9CSFhVUworS1ZMZlNwd3U3T1RuOWhHM1VqenZSQURESGorQXRsRW1hVVZkUUNKUisxazlqVmo2djhYMXVqRDJ5NXRWYk5lQk80QWRORy95Wm1DMworYTVsUXBhU2ZuK2dFZXhBaXdrKzdxZGYrdDhZYitEdFg1OGFvcGhVUEJQdUQ5dFBGSHNNQ05WUVRXaGFSTXZaMTg2NHJZZGNxNy9JaQorQXhtZDBVZ0J4d0lWQUpkZ1VJOFZJd3ZNc3BLNWdxTHJoQXZ3V0J6MUFvR0JBUGZob0lYV216M2V5N3lyWERhNFY3bDVsSys3K2pycQorZ3ZsWFRBczlCNEpuVVZsWGpyclVXVS9tY1FjUWdZQzBTUlp4SStoTUtCWVR0ODhKTW96SXB1RThGbnFMVkh5TktPQ2pyaDRyczZaMQora1c2amZ3djZJVFZpOGZ0aWVnRWtPOHlrOGI2b1VaQ0pxSVBmNFZybG53YVNpMlplZ0h0VkpXUUJURHYrejBrcUE0R0VBQUtCZ0dJcworVlRvN2RPRHA2aU95SEZMK21rT1ZsT2xvWmN5bXlXbEhVWlh6S3FydkFpNWpJU3B0WlpNK0FvSmNVVWxVV0VPOXV3VlR2WDBNQ2srNAordml3bFB3dCtYaGFQTTBrcWZGY3gxSVMwN0JBeDd6OWNYUkVmWVFwb0ZTc0ZXN3BVczZjZHZ1MHJqajhJcDZCbkhBTHhRRGdhQms0MAorelhNMzlrQjlMZEdCdDR1RE1Bc0dCeXFHU000NEJBTUZBQU12QURBc0FoUUU0UW9RUDR4UGliam5vem84eDVPUkpxQnVDQUlVVGtMUQorMnVkWjJEZWtud1BZWHAvek1rWVhMTjQ9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCmRpZmYgLS1naXQgYS9leGFtcGxlcy9odHRwcy1jbGllbnRzZXJ2ZXItZ3JpenpseS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2h0dHBzY2xpZW50c2VydmVyZ3JpenpseS9BdXRoZW50aWNhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvZXhhbXBsZXMvaHR0cHMtY2xpZW50c2VydmVyLWdyaXp6bHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9odHRwc2NsaWVudHNlcnZlcmdyaXp6bHkvQXV0aGVudGljYXRpb25FeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2VlZWRmCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvaHR0cHMtY2xpZW50c2VydmVyLWdyaXp6bHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9odHRwc2NsaWVudHNlcnZlcmdyaXp6bHkvQXV0aGVudGljYXRpb25FeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmh0dHBzY2xpZW50c2VydmVyZ3JpenpseTsKKworLyoqCisgKiBBIHJ1bnRpbWUgZXhjZXB0aW9uIHJlcHJlc2VudGluZyBhIGZhaWx1cmUgdG8gcHJvdmlkZSBjb3JyZWN0IGF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWxzLgorICoKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworCisgICAgcHVibGljIEF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBTdHJpbmcgcmVhbG0pIHsKKyAgICAgICAgc3VwZXIobWVzc2FnZSk7CisgICAgICAgIHRoaXMucmVhbG0gPSByZWFsbTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyByZWFsbSA9IG51bGw7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlYWxtKCkgeworICAgICAgICByZXR1cm4gdGhpcy5yZWFsbTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2h0dHBzLWNsaWVudHNlcnZlci1ncml6emx5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaHR0cHNjbGllbnRzZXJ2ZXJncml6emx5L0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uTWFwcGVyLmphdmEgYi9leGFtcGxlcy9odHRwcy1jbGllbnRzZXJ2ZXItZ3JpenpseS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2h0dHBzY2xpZW50c2VydmVyZ3JpenpseS9BdXRoZW50aWNhdGlvbkV4Y2VwdGlvbk1hcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZDEyZjcKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9odHRwcy1jbGllbnRzZXJ2ZXItZ3JpenpseS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2h0dHBzY2xpZW50c2VydmVyZ3JpenpseS9BdXRoZW50aWNhdGlvbkV4Y2VwdGlvbk1hcHBlci5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuaHR0cHNjbGllbnRzZXJ2ZXJncml6emx5OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlLlN0YXR1czsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuRXhjZXB0aW9uTWFwcGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworLyoqCisgKiBNYXAgYW4gYXV0aGVudGljYXRpb24gZXhjZXB0aW9uIHRvIGFuIEhUVFAgNDAxIHJlc3BvbnNlLCBvcHRpb25hbGx5IGluY2x1ZGluZyB0aGUgcmVhbG0gZm9yIGEgY3JlZGVudGlhbHMgY2hhbGxlbmdlIGF0IHRoZSBjbGllbnQuCisgKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFByb3ZpZGVyCitwdWJsaWMgY2xhc3MgQXV0aGVudGljYXRpb25FeGNlcHRpb25NYXBwZXIgaW1wbGVtZW50cyBFeGNlcHRpb25NYXBwZXI8QXV0aGVudGljYXRpb25FeGNlcHRpb24+IHsKKworICAgIHB1YmxpYyBSZXNwb25zZSB0b1Jlc3BvbnNlKEF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgaWYgKGUuZ2V0UmVhbG0oKSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2UKKyAgICAgICAgICAgICAgICAgICAgLnN0YXR1cyhTdGF0dXMuVU5BVVRIT1JJWkVEKQorICAgICAgICAgICAgICAgICAgICAuaGVhZGVyKCJXV1ctQXV0aGVudGljYXRlIiwgIkJhc2ljIHJlYWxtPVwiIiArIGUuZ2V0UmVhbG0oKSArICJcIiIpCisgICAgICAgICAgICAgICAgICAgIC50eXBlKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgICAgICAgICAgICAgLmVudGl0eShlLmdldE1lc3NhZ2UoKSkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2UKKyAgICAgICAgICAgICAgICAgICAgLnN0YXR1cyhTdGF0dXMuVU5BVVRIT1JJWkVEKQorICAgICAgICAgICAgICAgICAgICAudHlwZSgidGV4dC9wbGFpbiIpCisgICAgICAgICAgICAgICAgICAgIC5lbnRpdHkoZS5nZXRNZXNzYWdlKCkpCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9odHRwcy1jbGllbnRzZXJ2ZXItZ3JpenpseS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2h0dHBzY2xpZW50c2VydmVyZ3JpenpseS9Sb290UmVzb3VyY2UuamF2YSBiL2V4YW1wbGVzL2h0dHBzLWNsaWVudHNlcnZlci1ncml6emx5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaHR0cHNjbGllbnRzZXJ2ZXJncml6emx5L1Jvb3RSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzODVkMmYKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9odHRwcy1jbGllbnRzZXJ2ZXItZ3JpenpseS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2h0dHBzY2xpZW50c2VydmVyZ3JpenpseS9Sb290UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmh0dHBzY2xpZW50c2VydmVyZ3JpenpseTsKKworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5EYXRhdHlwZUNvbnZlcnRlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworCisvKioKKyAqIFNpbXBsZSByZXNvdXJjZSBkZW1vbnN0cmF0aW5nIGxvdyBsZXZlbCBhcHByb2FjaCBvZiBnZXR0aW5nIHVzZXIgY3JlZGVudGlhbHMuCisgKgorICogQmV0dGVyIHdheSB3b3VsZCBiZSBpbmplY3Rpbmcge0BsaW5rIGphdmF4LndzLnJzLmNvcmUuU2VjdXJpdHlDb250ZXh0fS4KKyAqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiLyIpCitwdWJsaWMgY2xhc3MgUm9vdFJlc291cmNlIHsKKworICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdldDEoQENvbnRleHQgSHR0cEhlYWRlcnMgaGVhZGVycykgeworICAgICAgICAvLyB5b3UgY2FuIGdldCB1c2VybmFtZSBmb3JtIEh0dHBIZWFkZXJzCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU2VydmljZTogR0VUIC8gVXNlcjogIiArIGdldFVzZXIoaGVhZGVycykpOworCisgICAgICAgIHJldHVybiBTZXJ2ZXIuQ09OVEVOVDsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRVc2VyKEh0dHBIZWFkZXJzIGhlYWRlcnMpIHsKKworICAgICAgICAvLyB0aGlzIGlzIGEgdmVyeSBtaW5pbWFsaXN0aWMgYW5kICJuYWl2ZSIgY29kZTsgaWYgeW91IHBsYW4gdG8gdXNlIGl0CisgICAgICAgIC8vIGFkZCBuZWNlc3NhcnkgY2hlY2tzIChzZWUgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuaHR0cHNjbGllbnRzZXJ2ZXJncml6emx5LmF1dGhzZXJ2ZXJncml6emx5LlNlY3VyaXR5RmlsdGVyKQorCisgICAgICAgIFN0cmluZyBhdXRoID0gaGVhZGVycy5nZXRSZXF1ZXN0SGVhZGVyKCJhdXRob3JpemF0aW9uIikuZ2V0KDApOworCisgICAgICAgIGF1dGggPSBhdXRoLnN1YnN0cmluZygiQmFzaWMgIi5sZW5ndGgoKSk7CisgICAgICAgIFN0cmluZ1tdIHZhbHVlcyA9IG5ldyBTdHJpbmcoRGF0YXR5cGVDb252ZXJ0ZXIucGFyc2VCYXNlNjRCaW5hcnkoYXV0aCksIENoYXJzZXQuZm9yTmFtZSgiQVNDSUkiKSkuc3BsaXQoIjoiKTsKKworICAgICAgICAvLyBTdHJpbmcgdXNlcm5hbWUgPSB2YWx1ZXNbMF07CisgICAgICAgIC8vIFN0cmluZyBwYXNzd29yZCA9IHZhbHVlc1sxXTsKKworICAgICAgICByZXR1cm4gdmFsdWVzWzBdOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2h0dHBzLWNsaWVudHNlcnZlci1ncml6emx5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaHR0cHNjbGllbnRzZXJ2ZXJncml6emx5L1NlY3VyaXR5RmlsdGVyLmphdmEgYi9leGFtcGxlcy9odHRwcy1jbGllbnRzZXJ2ZXItZ3JpenpseS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2h0dHBzY2xpZW50c2VydmVyZ3JpenpseS9TZWN1cml0eUZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MTg3MTIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9odHRwcy1jbGllbnRzZXJ2ZXItZ3JpenpseS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2h0dHBzY2xpZW50c2VydmVyZ3JpenpseS9TZWN1cml0eUZpbHRlci5qYXZhCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmh0dHBzY2xpZW50c2VydmVyZ3JpenpseTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CisKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlByZU1hdGNoaW5nOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5TZWN1cml0eUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuRGF0YXR5cGVDb252ZXJ0ZXI7CisKKy8qKgorICogU2ltcGxlIGF1dGhlbnRpY2F0aW9uIGZpbHRlci4KKyAqCisgKiBSZXR1cm5zIHJlc3BvbnNlIHdpdGggaHR0cCBzdGF0dXMgNDAxIHdoZW4gcHJvcGVyIGF1dGhlbnRpY2F0aW9uIGlzIG5vdCBwcm92aWRlZCBpbiBpbmNvbWluZyByZXF1ZXN0LgorICoKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKiBAc2VlIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIKKyAqLworQFByb3ZpZGVyCitAUHJlTWF0Y2hpbmcKK3B1YmxpYyBjbGFzcyBTZWN1cml0eUZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIgeworCisgICAgQEluamVjdAorICAgIGphdmF4LmluamVjdC5Qcm92aWRlcjxVcmlJbmZvPiB1cmlJbmZvOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFMTSA9ICJIVFRQUyBFeGFtcGxlIGF1dGhlbnRpY2F0aW9uIjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCBmaWx0ZXJDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBVc2VyIHVzZXIgPSBhdXRoZW50aWNhdGUoZmlsdGVyQ29udGV4dCk7CisgICAgICAgIGZpbHRlckNvbnRleHQuc2V0U2VjdXJpdHlDb250ZXh0KG5ldyBBdXRob3JpemVyKHVzZXIpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFVzZXIgYXV0aGVudGljYXRlKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IGZpbHRlckNvbnRleHQpIHsKKyAgICAgICAgLy8gRXh0cmFjdCBhdXRoZW50aWNhdGlvbiBjcmVkZW50aWFscworICAgICAgICBTdHJpbmcgYXV0aGVudGljYXRpb24gPSBmaWx0ZXJDb250ZXh0LmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5BVVRIT1JJWkFUSU9OKTsKKyAgICAgICAgaWYgKGF1dGhlbnRpY2F0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbigiQXV0aGVudGljYXRpb24gY3JlZGVudGlhbHMgYXJlIHJlcXVpcmVkIiwgUkVBTE0pOworICAgICAgICB9CisgICAgICAgIGlmICghYXV0aGVudGljYXRpb24uc3RhcnRzV2l0aCgiQmFzaWMgIikpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgLy8gYWRkaXRpb25hbCBjaGVja3Mgc2hvdWxkIGJlIGRvbmUgaGVyZQorICAgICAgICAgICAgLy8gIk9ubHkgSFRUUCBCYXNpYyBhdXRoZW50aWNhdGlvbiBpcyBzdXBwb3J0ZWQiCisgICAgICAgIH0KKyAgICAgICAgYXV0aGVudGljYXRpb24gPSBhdXRoZW50aWNhdGlvbi5zdWJzdHJpbmcoIkJhc2ljICIubGVuZ3RoKCkpOworICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBuZXcgU3RyaW5nKERhdGF0eXBlQ29udmVydGVyLnBhcnNlQmFzZTY0QmluYXJ5KGF1dGhlbnRpY2F0aW9uKSwgQ2hhcnNldC5mb3JOYW1lKCJBU0NJSSIpKS5zcGxpdCgiOiIpOworICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA8IDIpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbig0MDApOworICAgICAgICAgICAgLy8gIkludmFsaWQgc3ludGF4IGZvciB1c2VybmFtZSBhbmQgcGFzc3dvcmQiCisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHVzZXJuYW1lID0gdmFsdWVzWzBdOworICAgICAgICBTdHJpbmcgcGFzc3dvcmQgPSB2YWx1ZXNbMV07CisgICAgICAgIGlmICgodXNlcm5hbWUgPT0gbnVsbCkgfHwgKHBhc3N3b3JkID09IG51bGwpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViQXBwbGljYXRpb25FeGNlcHRpb24oNDAwKTsKKyAgICAgICAgICAgIC8vICJNaXNzaW5nIHVzZXJuYW1lIG9yIHBhc3N3b3JkIgorICAgICAgICB9CisKKyAgICAgICAgLy8gVmFsaWRhdGUgdGhlIGV4dHJhY3RlZCBjcmVkZW50aWFscworICAgICAgICBVc2VyIHVzZXI7CisKKyAgICAgICAgaWYgKHVzZXJuYW1lLmVxdWFscygidXNlciIpICYmIHBhc3N3b3JkLmVxdWFscygicGFzc3dvcmQiKSkgeworICAgICAgICAgICAgdXNlciA9IG5ldyBVc2VyKCJ1c2VyIiwgInVzZXIiKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVVNFUiBBVVRIRU5USUNBVEVEIik7CisgICAgICAgICAgICAvLyAgICAgICAgfSBlbHNlIGlmICh1c2VybmFtZS5lcXVhbHMoImFkbWluIikgJiYgcGFzc3dvcmQuZXF1YWxzKCJhZG1pbmFkbWluIikpIHsKKyAgICAgICAgICAgIC8vICAgICAgICAgICAgdXNlciA9IG5ldyBVc2VyKCJhZG1pbiIsICJhZG1pbiIpOworICAgICAgICAgICAgLy8gICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkFETUlOIEFVVEhFTlRJQ0FURUQiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVVNFUiBOT1QgQVVUSEVOVElDQVRFRCIpOworICAgICAgICAgICAgdGhyb3cgbmV3IEF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uKCJJbnZhbGlkIHVzZXJuYW1lIG9yIHBhc3N3b3JkXHJcbiIsIFJFQUxNKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdXNlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgY2xhc3MgQXV0aG9yaXplciBpbXBsZW1lbnRzIFNlY3VyaXR5Q29udGV4dCB7CisKKyAgICAgICAgcHJpdmF0ZSBVc2VyIHVzZXI7CisgICAgICAgIHByaXZhdGUgUHJpbmNpcGFsIHByaW5jaXBhbDsKKworICAgICAgICBwdWJsaWMgQXV0aG9yaXplcihmaW5hbCBVc2VyIHVzZXIpIHsKKyAgICAgICAgICAgIHRoaXMudXNlciA9IHVzZXI7CisgICAgICAgICAgICB0aGlzLnByaW5jaXBhbCA9IG5ldyBQcmluY2lwYWwoKSB7CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB1c2VyLnVzZXJuYW1lOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUHJpbmNpcGFsIGdldFVzZXJQcmluY2lwYWwoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5wcmluY2lwYWw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1VzZXJJblJvbGUoU3RyaW5nIHJvbGUpIHsKKyAgICAgICAgICAgIHJldHVybiAocm9sZS5lcXVhbHModXNlci5yb2xlKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1NlY3VyZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAiaHR0cHMiLmVxdWFscyh1cmlJbmZvLmdldCgpLmdldFJlcXVlc3RVcmkoKS5nZXRTY2hlbWUoKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEF1dGhlbnRpY2F0aW9uU2NoZW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIFNlY3VyaXR5Q29udGV4dC5CQVNJQ19BVVRIOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGNsYXNzIFVzZXIgeworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdXNlcm5hbWU7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgcm9sZTsKKworICAgICAgICBwdWJsaWMgVXNlcihTdHJpbmcgdXNlcm5hbWUsIFN0cmluZyByb2xlKSB7CisgICAgICAgICAgICB0aGlzLnVzZXJuYW1lID0gdXNlcm5hbWU7CisgICAgICAgICAgICB0aGlzLnJvbGUgPSByb2xlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvaHR0cHMtY2xpZW50c2VydmVyLWdyaXp6bHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9odHRwc2NsaWVudHNlcnZlcmdyaXp6bHkvU2VydmVyLmphdmEgYi9leGFtcGxlcy9odHRwcy1jbGllbnRzZXJ2ZXItZ3JpenpseS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2h0dHBzY2xpZW50c2VydmVyZ3JpenpseS9TZXJ2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGM5MWU0Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvaHR0cHMtY2xpZW50c2VydmVyLWdyaXp6bHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9odHRwc2NsaWVudHNlcnZlcmdyaXp6bHkvU2VydmVyLmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuaHR0cHNjbGllbnRzZXJ2ZXJncml6emx5OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkyLmh0dHBzZXJ2ZXIuR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUHJvcGVydGllc0hlbHBlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmdyaXp6bHkuaHR0cC5zZXJ2ZXIuSHR0cFNlcnZlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmdyaXp6bHkuc3NsLlNTTENvbnRleHRDb25maWd1cmF0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5ncml6emx5LnNzbC5TU0xFbmdpbmVDb25maWd1cmF0b3I7CisKKy8qKgorICogQSBzaW1wbGUgU1NMLXNlY3VyZWQgSFRUUCBzZXJ2ZXIuCisgKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFNlcnZlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihTZXJ2ZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlTVE9SRV9TRVJWRVJfRklMRSA9ICIuL2tleXN0b3JlX3NlcnZlciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWVNUT1JFX1NFUlZFUl9QV0QgPSAiYXNkZmdoIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJVU1RPUkVfU0VSVkVSX0ZJTEUgPSAiLi90cnVzdHN0b3JlX3NlcnZlciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSVVNUT1JFX1NFUlZFUl9QV0QgPSAiYXNkZmdoIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVVJJIEJBU0VfVVJJID0gZ2V0QmFzZVVSSSgpOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlQgPSAiSkVSU0VZIEhUVFBTIEVYQU1QTEVcbiI7CisKKyAgICBwcml2YXRlIGZpbmFsIEh0dHBTZXJ2ZXIgd2ViU2VydmVyOworCisgICAgcHJpdmF0ZSBTZXJ2ZXIoZmluYWwgSHR0cFNlcnZlciB3ZWJTZXJ2ZXIpIHsKKyAgICAgICAgdGhpcy53ZWJTZXJ2ZXIgPSB3ZWJTZXJ2ZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgVVJJIGdldEJhc2VVUkkoKSB7CisgICAgICAgIHJldHVybiBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHBzOi8vbG9jYWxob3N0LyIpLnBvcnQoZ2V0UG9ydCg4NDYzKSkuYnVpbGQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0UG9ydChpbnQgZGVmYXVsdFBvcnQpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHBvcnQgPQorICAgICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKFByb3BlcnRpZXNIZWxwZXIuZ2V0U3lzdGVtUHJvcGVydHkoImplcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydCIpKTsKKyAgICAgICAgaWYgKG51bGwgIT0gcG9ydCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludChwb3J0KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLndhcm5pbmcoIlZhbHVlIG9mIGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydCBwcm9wZXJ0eSIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpcyBub3QgYSB2YWxpZCBwb3NpdGl2ZSBpbnRlZ2VyIFsiICsgcG9ydCArICJdLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIiBSZXZlcnRpbmcgdG8gZGVmYXVsdCBbIiArIGRlZmF1bHRQb3J0ICsgIl0uIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRlZmF1bHRQb3J0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0YXJ0IFNTTC1zZWN1cmVkIEhUVFAgdGVzdCBzZXJ2ZXIuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGluIGNhc2UgdGhlcmUgaXMgYW4gZXJyb3Igd2hpbGUgcmVhZGluZyBzZXJ2ZXIga2V5IHN0b3JlIG9yIHRydXN0IHN0b3JlLgorICAgICAqIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgdGhlIHN0YXJ0ZWQgU1NMLXNlY3VyZWQgSFRUUCB0ZXN0IHNlcnZlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNlcnZlciBzdGFydCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIEdyaXp6bHkgc3NsIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgU1NMQ29udGV4dENvbmZpZ3VyYXRvciBzc2xDb250ZXh0ID0gbmV3IFNTTENvbnRleHRDb25maWd1cmF0b3IoKTsKKworICAgICAgICAvLyBzZXQgdXAgc2VjdXJpdHkgY29udGV4dAorICAgICAgICBzc2xDb250ZXh0LnNldEtleVN0b3JlRmlsZShLRVlTVE9SRV9TRVJWRVJfRklMRSk7IC8vIGNvbnRhaW5zIHNlcnZlciBrZXlwYWlyCisgICAgICAgIHNzbENvbnRleHQuc2V0S2V5U3RvcmVQYXNzKEtFWVNUT1JFX1NFUlZFUl9QV0QpOworICAgICAgICBzc2xDb250ZXh0LnNldFRydXN0U3RvcmVGaWxlKFRSVVNUT1JFX1NFUlZFUl9GSUxFKTsgLy8gY29udGFpbnMgY2xpZW50IGNlcnRpZmljYXRlCisgICAgICAgIHNzbENvbnRleHQuc2V0VHJ1c3RTdG9yZVBhc3MoVFJVU1RPUkVfU0VSVkVSX1BXRCk7CisKKyAgICAgICAgUmVzb3VyY2VDb25maWcgcmMgPSBuZXcgUmVzb3VyY2VDb25maWcoKTsKKyAgICAgICAgcmMucmVnaXN0ZXJDbGFzc2VzKFJvb3RSZXNvdXJjZS5jbGFzcywgU2VjdXJpdHlGaWx0ZXIuY2xhc3MsIEF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uTWFwcGVyLmNsYXNzKTsKKworICAgICAgICBmaW5hbCBIdHRwU2VydmVyIGdyaXp6bHlTZXJ2ZXIgPSBHcml6emx5SHR0cFNlcnZlckZhY3RvcnkuY3JlYXRlSHR0cFNlcnZlcigKKyAgICAgICAgICAgICAgICBnZXRCYXNlVVJJKCksCisgICAgICAgICAgICAgICAgcmMsCisgICAgICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICBuZXcgU1NMRW5naW5lQ29uZmlndXJhdG9yKHNzbENvbnRleHQpLnNldENsaWVudE1vZGUoZmFsc2UpLnNldE5lZWRDbGllbnRBdXRoKHRydWUpCisgICAgICAgICk7CisKKyAgICAgICAgLy8gc3RhcnQgR3JpenpseSBlbWJlZGRlZCBzZXJ2ZXIgLy8KKyAgICAgICAgTE9HR0VSLmluZm8oIkplcnNleSBhcHAgc3RhcnRlZC4gVHJ5IG91dCAiICsgQkFTRV9VUkkgKyAiXG5IaXQgQ1RSTCArIEMgdG8gc3RvcCBpdC4uLiIpOworICAgICAgICBncml6emx5U2VydmVyLnN0YXJ0KCk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBTZXJ2ZXIoZ3JpenpseVNlcnZlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RvcCBTU0wtc2VjdXJlZCBIVFRQIHRlc3Qgc2VydmVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgICAgIHdlYlNlcnZlci5zaHV0ZG93bk5vdygpOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJSZXN1bHRPZk1ldGhvZENhbGxJZ25vcmVkIikKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgc3RhcnQoKTsKKworICAgICAgICBTeXN0ZW0uaW4ucmVhZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2h0dHBzLWNsaWVudHNlcnZlci1ncml6emx5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaHR0cHNjbGllbnRzZXJ2ZXJncml6emx5L01haW5UZXN0LmphdmEgYi9leGFtcGxlcy9odHRwcy1jbGllbnRzZXJ2ZXItZ3JpenpseS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2h0dHBzY2xpZW50c2VydmVyZ3JpenpseS9NYWluVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZmVmYTgKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9odHRwcy1jbGllbnRzZXJ2ZXItZ3JpenpseS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2h0dHBzY2xpZW50c2VydmVyZ3JpenpseS9NYWluVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjAxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmh0dHBzY2xpZW50c2VydmVyZ3JpenpseTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgamF2YXgubmV0LnNzbC5TU0xDb250ZXh0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuU3NsQ29uZmlndXJhdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50Lkh0dHBVcmxDb25uZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuYXV0aGVudGljYXRpb24uSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5LmNvbm5lY3Rvci5Hcml6emx5Q29ubmVjdG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIFRoaXMgdGVzdCBjbGFzcyBzdGFydHMgdGhlIGdyaXp6bHkgc2VydmVyIGFuZCB0aGVuIGNsaWVudCBwZXJmb3JtcyBzZXZlcmFsIFNTTCAoaHR0cHMpCisgKiByZXF1ZXN0cyB3aGVyZSBkaWZmZXJlbnQgc2NlbmFyaW9zIGFyZSB0ZXN0ZWQgKFNTTCBDbGllbnQgYXV0aGVudGljYXRpb24sIG1pc3NpbmcgdHJ1c3RzdG9yZQorICogY29uZmlndXJhdGlvbiwgZXRjLikuIFNlcnZlciBpcyBhIEdyaXp6bHkgc2VydmVyIGNvbmZpZ3VyZWQgZm9yIFNTTCBzdXBwb3J0IGFuZCBjbGllbnQKKyAqIHVzZXMgYm90aCwge0BsaW5rIEh0dHBVcmxDb25uZWN0b3JQcm92aWRlcn0gYW5kIHtAbGluayBHcml6emx5Q29ubmVjdG9yUHJvdmlkZXJ9LgorICoKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBNYWluVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVFJVU1RPUkVfQ0xJRU5UX0ZJTEUgPSAiLi90cnVzdHN0b3JlX2NsaWVudCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRSVVNUU1RPUkVfQ0xJRU5UX1BXRCA9ICJhc2RmZ2giOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlTVE9SRV9DTElFTlRfRklMRSA9ICIuL2tleXN0b3JlX2NsaWVudCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWVNUT1JFX0NMSUVOVF9QV0QgPSAiYXNkZmdoIjsKKworICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IHNlcnZlckd1YXJkID0gbmV3IE9iamVjdCgpOworICAgIHByaXZhdGUgU2VydmVyIHNlcnZlciA9IG51bGw7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3luY2hyb25pemVkIChzZXJ2ZXJHdWFyZCkgeworICAgICAgICAgICAgaWYgKHNlcnZlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJUZXN0IHJ1biBzeW5jIGlzc3VlOiBBbm90aGVyIGluc3RhbmNlIG9mIHRoZSBTU0wtc2VjdXJlZCBIVFRQIHRlc3Qgc2VydmVyIGhhcyBiZWVuIGFscmVhZHkgc3RhcnRlZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlcnZlciA9IFNlcnZlci5zdGFydCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3luY2hyb25pemVkIChzZXJ2ZXJHdWFyZCkgeworICAgICAgICAgICAgaWYgKHNlcnZlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGVzdCBydW4gc3luYyBpc3N1ZTogVGhlcmUgaXMgbm8gU1NMLXNlY3VyZWQgSFRUUCB0ZXN0IHNlcnZlciB0byBzdG9wLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2VydmVyLnN0b3AoKTsKKyAgICAgICAgICAgIHNlcnZlciA9IG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTU0xXaXRoQmFzaWNBbmRTU0xBdXRoR3JpenpseUNvbm5lY3RvcigpIHsKKyAgICAgICAgZmluYWwgQ2xpZW50Q29uZmlnIGNsaWVudENvbmZpZyA9IGdldEdyaXp6bHlDb25maWcoKTsKKyAgICAgICAgX3Rlc3RTU0xXaXRoQmFzaWNBbmRTU0xBdXRoKGNsaWVudENvbmZpZyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBDbGllbnRDb25maWcgZ2V0R3JpenpseUNvbmZpZygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDbGllbnRDb25maWcoKS5jb25uZWN0b3JQcm92aWRlcihuZXcgR3JpenpseUNvbm5lY3RvclByb3ZpZGVyKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNTTFdpdGhCYXNpY0FuZFNTTEF1dGhIdHRwVXJsQ29ubmVjdG9yKCkgeworICAgICAgICBmaW5hbCBDbGllbnRDb25maWcgY2xpZW50Q29uZmlnID0gZ2V0SHR0cFVybENvbm5lY3RvckNvbmZpZygpOworICAgICAgICBfdGVzdFNTTFdpdGhCYXNpY0FuZFNTTEF1dGgoY2xpZW50Q29uZmlnKTsKKyAgICB9CisKKyAgICBwcml2YXRlIENsaWVudENvbmZpZyBnZXRIdHRwVXJsQ29ubmVjdG9yQ29uZmlnKCkgeworICAgICAgICByZXR1cm4gbmV3IENsaWVudENvbmZpZygpLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBIdHRwVXJsQ29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0byBzZWUgdGhhdCB0aGUgY29ycmVjdCBIdHRwIHN0YXR1cyBpcyByZXR1cm5lZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgX3Rlc3RTU0xXaXRoQmFzaWNBbmRTU0xBdXRoKENsaWVudENvbmZpZyBjbGllbnRDb25maWcpIHsKKyAgICAgICAgU3NsQ29uZmlndXJhdG9yIHNzbENvbmZpZyA9IFNzbENvbmZpZ3VyYXRvci5uZXdJbnN0YW5jZSgpCisgICAgICAgICAgICAgICAgLnRydXN0U3RvcmVGaWxlKFRSVVNUT1JFX0NMSUVOVF9GSUxFKQorICAgICAgICAgICAgICAgIC50cnVzdFN0b3JlUGFzc3dvcmQoVFJVU1RTVE9SRV9DTElFTlRfUFdEKQorICAgICAgICAgICAgICAgIC5rZXlTdG9yZUZpbGUoS0VZU1RPUkVfQ0xJRU5UX0ZJTEUpCisgICAgICAgICAgICAgICAgLmtleVBhc3N3b3JkKEtFWVNUT1JFX0NMSUVOVF9QV0QpOworCisgICAgICAgIGZpbmFsIFNTTENvbnRleHQgc3NsQ29udGV4dCA9IHNzbENvbmZpZy5jcmVhdGVTU0xDb250ZXh0KCk7CisgICAgICAgIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0J1aWxkZXIoKS53aXRoQ29uZmlnKGNsaWVudENvbmZpZykKKyAgICAgICAgICAgICAgICAuc3NsQ29udGV4dChzc2xDb250ZXh0KS5idWlsZCgpOworCisgICAgICAgIC8vIGNsaWVudCBiYXNpYyBhdXRoIGRlbW9uc3RyYXRpb24KKyAgICAgICAgY2xpZW50LnJlZ2lzdGVyKEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUuYmFzaWMoInVzZXIiLCAicGFzc3dvcmQiKSk7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDbGllbnQ6IEdFVCAiICsgU2VydmVyLkJBU0VfVVJJKTsKKworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gY2xpZW50LnRhcmdldChTZXJ2ZXIuQkFTRV9VUkkpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnBhdGgoIi8iKS5yZXF1ZXN0KCkuZ2V0KFJlc3BvbnNlLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaXRob3V0QmFzaWNBdXRoSHR0cFVybENvbm5lY3RvcigpIHsKKyAgICAgICAgX3Rlc3RXaXRob3V0QmFzaWNBdXRoKGdldEh0dHBVcmxDb25uZWN0b3JDb25maWcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2l0aG91dEJhc2ljQXV0aEdyaXp6bHlDb25uZWN0b3IoKSB7CisgICAgICAgIF90ZXN0V2l0aG91dEJhc2ljQXV0aChnZXRHcml6emx5Q29uZmlnKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdG8gc2VlIHRoYXQgSFRUUCA0MDEgaXMgcmV0dXJuZWQgd2hlbiBjbGllbnQgdHJpZXMgdG8gR0VUIHdpdGhvdXQKKyAgICAgKiBwcm9wZXIgY3JlZGVudGlhbHMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0V2l0aG91dEJhc2ljQXV0aChDbGllbnRDb25maWcgY2xpZW50Q29uZmlnKSB7CisgICAgICAgIFNzbENvbmZpZ3VyYXRvciBzc2xDb25maWcgPSBTc2xDb25maWd1cmF0b3IubmV3SW5zdGFuY2UoKQorICAgICAgICAgICAgICAgIC50cnVzdFN0b3JlRmlsZShUUlVTVE9SRV9DTElFTlRfRklMRSkKKyAgICAgICAgICAgICAgICAudHJ1c3RTdG9yZVBhc3N3b3JkKFRSVVNUU1RPUkVfQ0xJRU5UX1BXRCkKKyAgICAgICAgICAgICAgICAua2V5U3RvcmVGaWxlKEtFWVNUT1JFX0NMSUVOVF9GSUxFKQorICAgICAgICAgICAgICAgIC5rZXlQYXNzd29yZChLRVlTVE9SRV9DTElFTlRfUFdEKTsKKworICAgICAgICBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdCdWlsZGVyKCkud2l0aENvbmZpZyhjbGllbnRDb25maWcpLnNzbENvbnRleHQoc3NsQ29uZmlnCisgICAgICAgICAgICAgICAgLmNyZWF0ZVNTTENvbnRleHQoKSkuYnVpbGQoKTsKKworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNsaWVudDogR0VUICIgKyBTZXJ2ZXIuQkFTRV9VUkkpOworCisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSBjbGllbnQudGFyZ2V0KFNlcnZlci5CQVNFX1VSSSk7CisgICAgICAgIHRhcmdldC5yZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcyk7CisKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2U7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0LnBhdGgoIi8iKS5yZXF1ZXN0KCkuZ2V0KFJlc3BvbnNlLmNsYXNzKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydEVxdWFscyg0MDEsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRvIHNlZSB0aGF0IFNTTEhhbmRzaGFrZUV4Y2VwdGlvbiBpcyB0aHJvd24gd2hlbiBjbGllbnQgZG9uJ3QgaGF2ZQorICAgICAqIHRydXN0ZWQga2V5LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBfdGVzdFdpdGhvdXRTU0xBdXRoZW50aWNhdGlvbihDbGllbnRDb25maWcgY2xpZW50Q29uZmlnKSB7CisgICAgICAgIFNzbENvbmZpZ3VyYXRvciBzc2xDb25maWcgPSBTc2xDb25maWd1cmF0b3IubmV3SW5zdGFuY2UoKQorICAgICAgICAgICAgICAgIC50cnVzdFN0b3JlRmlsZShUUlVTVE9SRV9DTElFTlRfRklMRSkKKyAgICAgICAgICAgICAgICAudHJ1c3RTdG9yZVBhc3N3b3JkKFRSVVNUU1RPUkVfQ0xJRU5UX1BXRCk7CisKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgLndpdGhDb25maWcoY2xpZW50Q29uZmlnKQorICAgICAgICAgICAgICAgIC5zc2xDb250ZXh0KHNzbENvbmZpZy5jcmVhdGVTU0xDb250ZXh0KCkpLmJ1aWxkKCk7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDbGllbnQ6IEdFVCAiICsgU2VydmVyLkJBU0VfVVJJKTsKKworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gY2xpZW50LnRhcmdldChTZXJ2ZXIuQkFTRV9VUkkpOworICAgICAgICB0YXJnZXQucmVnaXN0ZXIoTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpOworCisgICAgICAgIGJvb2xlYW4gY2F1Z2h0ID0gZmFsc2U7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRhcmdldC5wYXRoKCIvIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgY2F1Z2h0ID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydFRydWUoY2F1Z2h0KTsKKyAgICAgICAgLy8gc29sYXJpcyB0aHJvd3MgamF2YS5uZXQuU29ja2V0RXhjZXB0aW9uIGluc3RlYWQgb2YgU1NMSGFuZHNoYWtlRXhjZXB0aW9uCisgICAgICAgIC8vIGFzc2VydFRydWUobXNnLmNvbnRhaW5zKCJTU0xIYW5kc2hha2VFeGNlcHRpb24iKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2l0aG91dFNTTEF1dGhlbnRpY2F0aW9uR3JpenpseSgpIHsKKyAgICAgICAgX3Rlc3RXaXRob3V0U1NMQXV0aGVudGljYXRpb24oZ2V0R3JpenpseUNvbmZpZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaXRob3V0U1NMQXV0aGVudGljYXRpb25IdHRwVXJsQ29ubmVjdG9yKCkgeworICAgICAgICBfdGVzdFdpdGhvdXRTU0xBdXRoZW50aWNhdGlvbihnZXRIdHRwVXJsQ29ubmVjdG9yQ29uZmlnKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2h0dHBzLWNsaWVudHNlcnZlci1ncml6emx5L3RydXN0c3RvcmVfY2xpZW50IGIvZXhhbXBsZXMvaHR0cHMtY2xpZW50c2VydmVyLWdyaXp6bHkvdHJ1c3RzdG9yZV9jbGllbnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ3ODRmYgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2h0dHBzLWNsaWVudHNlcnZlci1ncml6emx5L3RydXN0c3RvcmVfY2xpZW50CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2h0dHBzLWNsaWVudHNlcnZlci1ncml6emx5L3RydXN0c3RvcmVfc2VydmVyIGIvZXhhbXBsZXMvaHR0cHMtY2xpZW50c2VydmVyLWdyaXp6bHkvdHJ1c3RzdG9yZV9zZXJ2ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWIyNmNlNAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2h0dHBzLWNsaWVudHNlcnZlci1ncml6emx5L3RydXN0c3RvcmVfc2VydmVyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2h0dHBzLXNlcnZlci1nbGFzc2Zpc2gvUkVBRE1FLk1EIGIvZXhhbXBsZXMvaHR0cHMtc2VydmVyLWdsYXNzZmlzaC9SRUFETUUuTUQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI3YWQzNQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2h0dHBzLXNlcnZlci1nbGFzc2Zpc2gvUkVBRE1FLk1ECkBAIC0wLDAgKzEsMTAxIEBACitbLy9dOiAjICIgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICIKK1svL106ICMgIiAiCitbLy9dOiAjICIgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlICIKK1svL106ICMgIiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCAiCitbLy9dOiAjICIgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLiAiCitbLy9dOiAjICIgIgorWy8vXTogIyAiIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UgIgorCitIVFRQUyBTZXJ2ZXIgRXhhbXBsZSAtIEdsYXNzRmlzaAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gZGV2ZWxvcCBzZWN1cmUgUkVTVGZ1bCAiSGVsbG8gd29ybGQiCit3ZWIgc2VydmljZSB3aXRoIGEgU2VydmxldCAyLjUgY29udGFpbmVyLgorCitDb250ZW50cworLS0tLS0tLS0KKworVGhlIGV4YW1wbGUgY29uc2lzdHMgb2YganVzdCBvbmUgSmF2YSBjbGFzczoKKworYG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmh0dHBzLmdsYXNzZmlzaC5yZXNvdXJjZXMuSGVsbG9Xb3JsZFJlc291cmNlYAorCitBIHJlc291cmNlIGNsYXNzIHRoYXQgcHJvZHVjZXMgYSB0ZXh0dWFsIHJlc3BvbnNlIHRvIGFuIEhUVFAgR0VUIHJlcXVlc3QuCisKK1RoZSBtYXBwaW5nIG9mIHRoZSBVUkkgcGF0aCBzcGFjZSBpcyBwcmVzZW50ZWQgaW4gdGhlIGZvbGxvd2luZyB0YWJsZToKKworVVJJIHBhdGggICAgICAgICAgICB8IFJlc291cmNlIGNsYXNzICAgICAgIHwgSFRUUCBtZXRob2RzCistLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLQorKipfL2hlbGxvd29ybGRfKiogICB8IEhlbGxvV29ybGRSZXNvdXJjZSAgIHwgR0VUCisKK1J1bm5pbmcgdGhlIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworUnVuIHRoZSBleGFtcGxlIGFzIGZvbGxvd3M6CisKK0NyZWF0ZSB3YXIgcGFja2FnZQorCis+ICAgICBtdm4gY2xlYW4gcGFja2FnZQorCitTZXR1cCBHbGFzc0Zpc2ggNC4wIChpbnN0YWxsZWQgYXQgYEFTX0hPTUU9PGluc3RhbGxfZGlyPi9nbGFzc2Zpc2g0YCk6CisKK0FkZCBuZXcgc2VjdXJpdHkgcmVhbG0gY2FsbGVkICJgbXlSZWFsbWAiCistICAgU3RhcnQgR2xhc3NGaXNoIHVzaW5nIGFzYWRtaW4gYCRBU19IT01FL2Jpbi9hc2FkbWluIHN0YXJ0LWRvbWFpbmAKKy0gICBBY2Nlc3MgQWRtaW4gY29uc29sZSwgYXNzdW1pbmcgdGhlIHVzZSBvZiBkZWZhdWx0IGFkbWluIHBvcnQsIGF0CisgICAgPGh0dHA6Ly9sb2NhbGhvc3Q6NDg0OD4KKy0gICBOYXZpZ2F0ZSBpbiBBZG1pbiBjb25zb2xlIHRvOgorICAgIGBDb25maWd1cmF0aW9ucyAtPiBzZXJ2ZXItY29uZmlnIC0+IFNlY3VyaXR5IC0+IFJlYWxtc2AsIGNsaWNrIG9uCisgICAgImBOZXcuLi5gIgorLSAgIENyZWF0ZSB1c2VyIGFuZCBzZXQgcGFzc3dvcmQgZm9yIHVzZXIgYG15VXNlcmAgKGNsaWNrIG9uICJgbXlSZWFsbWAiCisgICAgLSZndDsgImBNYW5hZ2UgVXNlcnNgIiAtJmd0OyAiYE5ldy4uLmAiKTsKKyAgICAtICAgKipFbnN1cmUqKiAiYFVzZXIgSUQ6YCIgc2V0IHRvICJgbXlVc2VyYCIgKiphbmQqKgorICAgICAgICAiYEdyb3VwIExpc3Q6YCIgc2V0IHRvICJgVXNlcnNgIgorICAgIC0gICBFbnRlciBwYXNzd29yZCAqKmBteVBhc3NgKiogaW4gImBOZXcgUGFzc3dvcmQ6YCIgYW5kCisgICAgICAgICJgQ29uZmlybSBOZXcgUGFzc3dvcmQ6YCIgdGV4dCBmaWVsZHMKKy0gICBBZGQgb25lIG90aGVyIHVzZXIgbmFtZSBgam9lVXNlcmAgKGNsaWNrIG9uICJgbXlSZWFsbWAiIC0mZ3Q7CisgICAgImBNYW5hZ2UgVXNlcnNgIiAtJmd0OyAiYE5ldy4uLmAiKTsKKyAgICAtICAgKipFbnN1cmUqKiAiYFVzZXIgSUQ6YCIgc2V0IHRvICJgam9lVXNlcmAiICoqYW5kKioKKyAgICAgICAgImBHcm91cCBMaXN0OmAiIHNldCB0byAiYFVzZXJzYCIKKyAgICAtICAgRW50ZXIgcGFzc3dvcmQgKipgam9lUGFzc2AqKiBpbiAiYE5ldyBQYXNzd29yZDpgIiBhbmQKKyAgICAgICAgImBDb25maXJtIE5ldyBQYXNzd29yZDpgIiB0ZXh0IGZpZWxkcworCitDaGVjayBgd2ViLnhtbGAgYW5kIGBzdW4td2ViLnhtbGAgdG8gdW5kZXJzdGFuZCBob3cgcm9sZSBtYXBwaW5ncyBhcmUKK2NvbmZpZ3VyZWQuIFtUaGlzCitibG9nXShodHRwOi8vYmxvZ3Mub3JhY2xlLmNvbS9ib2JieS9lbnRyeS9zaW1wbGlmaWVkX3NlY3VyaXR5X3JvbGVfbWFwcGluZykKK2lzIGFsc28gaGVscGZ1bCBpbiBoZWxwaW5nIHRvIGNsYXJpZnkgcm9sZSBtYXBwaW5ncy4KK0RlcGxveSBgaHR0cHMtc2VydmVyLWdsYXNzZmlzaC53YXJgIGFzIGEgV2ViIEFwcGxpY2F0aW9uCistICAgQWRtaW4gY29uc29sZTogc2VsZWN0IGBBcHBsaWNhdGlvbnNgLCBjbGljayBvbiAiYERlcGxveS4uLmAiLiBTZWxlY3QKKyAgICBmaWxlIGAuL3RhcmdldC9odHRwcy1zZXJ2ZXItZ2xhc3NmaXNoLndhcmAKKy0gICBvciB5b3UgY2FuIHVzZSBjb21tYW5kIGxpbmU6CisgICAgYCRBU19IT01FL2Jpbi9hc2FkbWluIGRlcGxveSAuL3RhcmdldC9odHRwcy1zZXJ2ZXItZ2xhc3NmaXNoLndhcmAKKworRnJvbSBhIHdlYiBicm93c2VyLCB2aXNpdDoKKworLSAgIDxodHRwczovL2xvY2FsaG9zdDo4MTgxL2h0dHBzLXNlcnZlci1nbGFzc2Zpc2gtd2ViYXBwL2hlbGxvd29ybGQ+CistICAgRW50ZXIgZWl0aGVyIFVzZXJuYW1lIGBteVVzZXJgIGFuZCBQYXNzd29yZCBgbXlQYXNzYCBvciwgVXNlcm5hbWUgIGBqb2VVc2VyYCBhbmQgUGFzc3dvcmQgYGpvZVBhc3NgCistICAgSWYgZW50ZXJlZCBVc2VybmFtZSBgbXlVc2VyYCBhbmQgUGFzc3dvcmQgYG15UGFzc2AsIHZlcmlmeSB0aGF0CisgICAgKipleHBlY3RlZCBvdXRwdXQqKjogYFNlbmRpbmcgIkhlbGxvIFdvcmxkIiB0byB1c2VyICJteVVzZXIiYCB3YXMgZGlzcGxheWVkCistICAgSWYgZW50ZXJlZCBVc2VybmFtZSBgam9lVXNlcmAgYW5kIFBhc3N3b3JkIGBqb2VQYXNzYCwgdmVyaWZ5IHRoYXQKKyAgICAqKmV4cGVjdGVkIG91dHB1dCoqOiBgU2VuZGluZyAiSGVsbG8gV29ybGQiIHRvIHVzZXIgImpvZVVzZXIiYCB3YXMgZGlzcGxheWVkCisKK1J1bm5pbmcgdGhlIE5lZ2F0aXZlIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworUnVuIHRoZSBleGFtcGxlIGFzIGZvbGxvd3M6CisKKzEuICBDcmVhdGUgd2FyIHBhY2thZ2UKKworICAgID4gICAgIG12biBjbGVhbiBwYWNrYWdlCisKKzIuICBzZXR1cCBHbGFzc0Zpc2ggNC4wIChpbnN0YWxsZWQgYXQKKyAgICBgQVNfSE9NRT08aW5zdGFsbF9kaXI+L2dsYXNzZmlzaDRgKToKKworICAgIC0gICBGb2xsb3cgdGhlIHN0ZXBzIGRlc2NyaWJlZCBpbiB0aGUgIioqc2V0dXAgR2xhc3NGaXNoIDMuMSoqIgorICAgICAgICBzZWN0aW9uIGZyb20gdGhlIHByZXZpb3VzIGNoYXB0ZXIgIioqUnVubmluZyB0aGUgRXhhbXBsZSoqIiBidXQKKyAgICAgICAgaW5zdGVhZCBvZiBhZGRpbmcgdGhlIHVzZXIgImBqb2VVc2VyYCIgdG8gdGhlICJgR3JvdXAgTGlzdDpgIiBvZgorICAgICAgICAiYFVzZXJzYCIgc2V0ICJgR3JvdXAgTGlzdDpgIiBmb3IgdGhpcyB1c2VyIHRvICJgT3RoZXJVc2Vyc2AiCisKKzMuICBGcm9tIGEgd2ViIGJyb3dzZXIsIHZpc2l0OgorCisgICAgLSAgIDxodHRwczovL2xvY2FsaG9zdDo4MTgxL2h0dHBzLXNlcnZlci1nbGFzc2Zpc2gtd2ViYXBwL2hlbGxvd29ybGQ+CisgICAgLSAgIEVudGVyIFVzZXJuYW1lIGBqb2VVc2VyYCBhbmQgUGFzc3dvcmQgYGpvZVBhc3NgLCB2ZXJpZnkgdGhhdCAqKmV4cGVjdGVkIG91dHB1dCoqCisgICAgICAgIGxvb2tzIGxpa2U6IGBIVFRQIFN0YXR1cyA0MDMgLSBBY2Nlc3MgdG8gdGhlIHJlcXVlc3RlZCByZXNvdXJjZSBoYXMgYmVlbiBkZW5pZWRgCmRpZmYgLS1naXQgYS9leGFtcGxlcy9odHRwcy1zZXJ2ZXItZ2xhc3NmaXNoL3BvbS54bWwgYi9leGFtcGxlcy9odHRwcy1zZXJ2ZXItZ2xhc3NmaXNoL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ0YmEwZAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2h0dHBzLXNlcnZlci1nbGFzc2Zpc2gvcG9tLnhtbApAQCAtMCwwICsxLDc2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorCisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPndlYmFwcC1leGFtcGxlLXBhcmVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi93ZWJhcHAtZXhhbXBsZS1wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+aHR0cHMtc2VydmVyLWdsYXNzZmlzaDwvYXJ0aWZhY3RJZD4KKyAgICA8bmFtZT5qZXJzZXktZXhhbXBsZXMtaHR0cHMtc2VydmVyLWdsYXNzZmlzaDwvbmFtZT4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorCisgICAgPGRlc2NyaXB0aW9uPkplcnNleSBIVFRQUyBzZXJ2ZXIgb24gR2xhc3NGaXNoIGV4YW1wbGUuPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItZ3JpenpseTItc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1oazI8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNsaWVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDwhLS0gVW5jb21tZW50IHRvIHJ1biB0aGUgYXBwbGljYXRpb24gdXNpbmcgIm12biBlbWJlZGRlZC1nbGFzc2Zpc2g6cnVuIgorICAgICAgICAgICAgICAgICAoZG9lcyBub3Qgd29yayB3aXRoIHRoZSBzZWN1cml0eSBjb25maWcgcmVxdWlyZWQgYnkgZXhhbXBsZSBhdCB0aGUgbW9tZW50KSAtLT4KKyAgICAgICAgICAgIDwhLS1wbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5lbWJlZGRlZDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1lbWJlZGRlZC1nbGFzc2Zpc2gtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4tLT4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnJlbGVhc2U8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD54bWwtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2h0dHBzLXNlcnZlci1nbGFzc2Zpc2gvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9odHRwcy9nbGFzc2Zpc2gvcmVzb3VyY2VzL0hlbGxvV29ybGRSZXNvdXJjZS5qYXZhIGIvZXhhbXBsZXMvaHR0cHMtc2VydmVyLWdsYXNzZmlzaC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2h0dHBzL2dsYXNzZmlzaC9yZXNvdXJjZXMvSGVsbG9Xb3JsZFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGQ0ZGM5OAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2h0dHBzLXNlcnZlci1nbGFzc2Zpc2gvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9odHRwcy9nbGFzc2Zpc2gvcmVzb3VyY2VzL0hlbGxvV29ybGRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuaHR0cHMuZ2xhc3NmaXNoLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5zZWN1cml0eS5Sb2xlc0FsbG93ZWQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKKworLyoqCisgKiBUaGUgSkFYLVJTIHJlc291cmNlIGNsYXNzIHdpbGwgYmUgaG9zdGVkIGF0IHRoZSBVUkkgcGF0aCB7QGNvZGUgIi9oZWxsb3dvcmxkIn0uCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIi9oZWxsb3dvcmxkIikKK0BSb2xlc0FsbG93ZWQoIm15Um9sZSIpCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZFJlc291cmNlIHsKKworICAgIC8qKgorICAgICAqIEhUVFAgR0VUIGNvbnRyb2xsZXIgbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgSFRUUCBzZXJ2bGV0IHJlcXVlc3QuCisgICAgICogQHJldHVybiBhIHNpbXBsZSB0ZXh0IG1lc3NhZ2UuCisgICAgICovCisgICAgQEdFVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIFJlc3BvbnNlIGdldENsaWNoZWRNZXNzYWdlKEBDb250ZXh0IEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIHJldHVybiBSZXNwb25zZQorICAgICAgICAgICAgICAgIC5zdGF0dXMoUmVzcG9uc2UuU3RhdHVzLk9LKQorICAgICAgICAgICAgICAgIC50eXBlKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgICAgICAgICAuZW50aXR5KCJTZW5kaW5nIFwiSGVsbG8gV29ybGRcIiB0byB1c2VyIFwiIiArIHJlcXVlc3QuZ2V0VXNlclByaW5jaXBhbCgpLmdldE5hbWUoKSArICJcIiIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9odHRwcy1zZXJ2ZXItZ2xhc3NmaXNoL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2dsYXNzZmlzaC13ZWIueG1sIGIvZXhhbXBsZXMvaHR0cHMtc2VydmVyLWdsYXNzZmlzaC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9nbGFzc2Zpc2gtd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGVmMGI4Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvaHR0cHMtc2VydmVyLWdsYXNzZmlzaC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9nbGFzc2Zpc2gtd2ViLnhtbApAQCAtMCwwICsxLDM2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzwhRE9DVFlQRSBnbGFzc2Zpc2gtd2ViLWFwcCBQVUJMSUMgIi0vL0dsYXNzRmlzaC5vcmcvL0RURCBHbGFzc0Zpc2ggQXBwbGljYXRpb24gU2VydmVyIDMuMSBTZXJ2bGV0IDMuMC8vRU4iICJodHRwOi8vZ2xhc3NmaXNoLm9yZy9kdGRzL2dsYXNzZmlzaC13ZWItYXBwXzNfMC0xLmR0ZCI+Cis8Z2xhc3NmaXNoLXdlYi1hcHAgZXJyb3ItdXJsPSIiPgorICAgIDxjb250ZXh0LXJvb3Q+L2h0dHBzLXNlcnZlci1nbGFzc2Zpc2gtd2ViYXBwPC9jb250ZXh0LXJvb3Q+CisKKyAgICA8c2VjdXJpdHktcm9sZS1tYXBwaW5nPgorICAgICAgICA8IS0tIG1hcHMgIlVzZXJzIiBncm91cCB0byBteVJvbGUgLS0+CisgICAgICAgIDxyb2xlLW5hbWU+bXlSb2xlPC9yb2xlLW5hbWU+CisgICAgICAgIDxncm91cC1uYW1lPlVzZXJzPC9ncm91cC1uYW1lPgorICAgIDwvc2VjdXJpdHktcm9sZS1tYXBwaW5nPgorCisgICAgPGNsYXNzLWxvYWRlciBkZWxlZ2F0ZT0idHJ1ZSIgLz4KKyAgICA8anNwLWNvbmZpZz4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImNsYXNzZGVidWdpbmZvIiB2YWx1ZT0idHJ1ZSI+CisgICAgICAgICAgICA8ZGVzY3JpcHRpb24+RW5hYmxlIGRlYnVnIGluZm8gY29tcGlsYXRpb24gaW4gdGhlIGdlbmVyYXRlZCBzZXJ2bGV0IGNsYXNzPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImtlZXBnZW5lcmF0ZWQiIHZhbHVlPSJ0cnVlIj4KKyAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5LZWVwIGEgY29weSBvZiB0aGUgZ2VuZXJhdGVkIHNlcnZsZXQgY2xhc3MnIGphdmEgY29kZS48L2Rlc2NyaXB0aW9uPgorICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWFwcGVkZmlsZSIgdmFsdWU9InRydWUiPgorICAgICAgICAgICAgPGRlc2NyaXB0aW9uPk1haW50YWluIGEgb25lLXRvLW9uZSBjb3JyZXNwb25kZW5jZSBiZXR3ZWVuIHN0YXRpYyBjb250ZW50IGFuZCB0aGUgZ2VuZXJhdGVkIHNlcnZsZXQgY2xhc3MnIGphdmEgY29kZTwvZGVzY3JpcHRpb24+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgPC9qc3AtY29uZmlnPgorPC9nbGFzc2Zpc2gtd2ViLWFwcD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2h0dHBzLXNlcnZlci1nbGFzc2Zpc2gvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL2V4YW1wbGVzL2h0dHBzLXNlcnZlci1nbGFzc2Zpc2gvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODMzZDBmCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvaHR0cHMtc2VydmVyLWdsYXNzZmlzaC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsNjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi41IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI+CisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SmVyc2V5IFdlYiBBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amVyc2V5LmNvbmZpZy5zZXJ2ZXIucHJvdmlkZXIucGFja2FnZXM8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuaHR0cHMuZ2xhc3NmaXNoLnJlc291cmNlczwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qZXJzZXkuY29uZmlnLnNlcnZlci5wcm92aWRlci5jbGFzc25hbWVzPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5maWx0ZXIuUm9sZXNBbGxvd2VkRHluYW1pY0ZlYXR1cmU8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkplcnNleSBXZWIgQXBwbGljYXRpb248L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKyAgICA8c2VjdXJpdHktY29uc3RyYWludD4KKyAgICAgICAgPHdlYi1yZXNvdXJjZS1jb2xsZWN0aW9uPgorICAgICAgICAgICAgPHdlYi1yZXNvdXJjZS1uYW1lPlByb3RlY3RlZCByZXNvdXJjZTwvd2ViLXJlc291cmNlLW5hbWU+CisgICAgICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgICAgICAgICAgPGh0dHAtbWV0aG9kPkdFVDwvaHR0cC1tZXRob2Q+CisgICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+CisKKyAgICAgICAgPCEtLSBhZGRlZCAtLT4KKyAgICAgICAgPGF1dGgtY29uc3RyYWludD4KKyAgICAgICAgICAgIDwhLS0gcm9sZSBuYW1lIHVzZWQgaW4gSGVsbG9Xb3JsZFJlc291cmNlLmphdmEtLT4KKyAgICAgICAgICAgIDxyb2xlLW5hbWU+bXlSb2xlPC9yb2xlLW5hbWU+CisgICAgICAgIDwvYXV0aC1jb25zdHJhaW50PgorICAgICAgICA8IS0tIC9hZGRlZCAtLT4KKworICAgICAgICA8IS0tIGh0dHBzIC0tPgorICAgICAgICA8dXNlci1kYXRhLWNvbnN0cmFpbnQ+CisgICAgICAgICAgICA8dHJhbnNwb3J0LWd1YXJhbnRlZT5DT05GSURFTlRJQUw8L3RyYW5zcG9ydC1ndWFyYW50ZWU+CisgICAgICAgIDwvdXNlci1kYXRhLWNvbnN0cmFpbnQ+CisgICAgPC9zZWN1cml0eS1jb25zdHJhaW50PgorCisgICAgPCEtLSBhZGRlZCAtLT4KKyAgICA8bG9naW4tY29uZmlnPgorICAgICAgICA8YXV0aC1tZXRob2Q+QkFTSUM8L2F1dGgtbWV0aG9kPgorICAgICAgICA8IS0tIHJlYWxtIG5hbWUgdXNlZCBpbiBHbGFzc0Zpc2ggLS0+CisgICAgICAgIDxyZWFsbS1uYW1lPm15UmVhbG08L3JlYWxtLW5hbWU+CisgICAgPC9sb2dpbi1jb25maWc+CisgICAgPHNlY3VyaXR5LXJvbGU+CisgICAgICAgIDxyb2xlLW5hbWU+bXlSb2xlPC9yb2xlLW5hbWU+CisgICAgPC9zZWN1cml0eS1yb2xlPgorICAgIDwhLS0gL2FkZGVkIC0tPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvamF2YTgtd2ViYXBwL1JFQURNRS5NRCBiL2V4YW1wbGVzL2phdmE4LXdlYmFwcC9SRUFETUUuTUQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNkMjU2NQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2phdmE4LXdlYmFwcC9SRUFETUUuTUQKQEAgLTAsMCArMSw0NSBAQAorWy8vXTogIyAiIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAiCitbLy9dOiAjICIgIgorWy8vXTogIyAiIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAiCitbLy9dOiAjICIgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQgIgorWy8vXTogIyAiIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4gIgorWy8vXTogIyAiICIKK1svL106ICMgIiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlICIKKworSmVyc2V5IGFuZCBKYXZhIDggRXhhbXBsZXMgRmVhdHVyZXMgYW5kIFR5cGVzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyB0aGUgdXNhZ2Ugb2YgSmF2YSA4J3MgbmV3IGNvbnN0cnVjdHMgYW5kIHR5cGVzLgorCitDdXJyZW50bHkgZGVtb25zdHJhdGVkIGFyZToKKworLSAgIERlZmF1bHQgbWV0aG9kcyBpbiBpbnRlcmZhY2VzIC0gYWN0aW5nIGFzIEpBWC1SUyBSZXNvdXJjZSBNZXRob2RzCisKK0NvbnRlbnRzCistLS0tLS0tLQorCitUaGUgbWFwcGluZyBvZiB0aGUgVVJJIHBhdGggc3BhY2UgaXMgcHJlc2VudGVkIGluIHRoZSBmb2xsb3dpbmcgdGFibGU6CisKK1VSSSBwYXRoICAgICAgICAgICAgICAgICAgICAgICAgIHwgUmVzb3VyY2UgY2xhc3MgICAgICAgICAgIHwgSFRUUCBtZXRob2QgICB8IGRlc2NyaXB0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqXy9qOC9kZWZhdWx0LW1ldGhvZF8qKiAgICAgICAgIHwgRGVmYXVsdE1ldGhvZEludGVyZmFjZSAgIHwgR0VUICAgICAgICAgICB8IHJldHVybnMgYGludGVyZmFjZS1yb290YCBpbiBgdGV4dC9wbGFpbmAKKyoqXy9qOC9kZWZhdWx0LW1ldGhvZC9wYXRoXyoqICAgIHwgRGVmYXVsdE1ldGhvZEludGVyZmFjZSAgIHwgR0VUICAgICAgICAgICB8IHJldHVybnMgYGludGVyZmFjZS1wYXRoYCBpbiBgdGV4dC9wbGFpbmAKKyoqXy9qOC9kZWZhdWx0LW1ldGhvZC9jbGFzc18qKiAgIHwgRGVmYXVsdE1ldGhvZFJlc291cmNlICAgIHwgR0VUICAgICAgICAgICB8IHJldHVybnMgYGNsYXNzYCBpbiBgdGV4dC9wbGFpbmAKKyoqXy9qOC9sYW1iZGFzL3twfV8qKiAgICAgICAgICAgIHwgTGFtYmRhUmVzb3VyY2UgICAgICAgICAgIHwgR0VUICAgICAgICAgICB8IHJldHVybnMgYHtwfS1sYW1iZGFpemVkYCBpbiBgdGV4dC9wbGFpbmAKKworQXBwbGljYXRpb24gaXMgU2VydmxldCAzIGJhc2VkLCB3ZWIueG1sLWxlc3MuIEV2ZXJ5dGhpbmcgbmVlZGVkCisocmVzb3VyY2VzL3Byb3ZpZGVycykgaXMgcmVnaXN0ZXJlZCBpbiB0aGUgYEphdmE4QXBwbGljYXRpb25gIGNsYXNzLgorCitSdW5uaW5nIHRoZSBFeGFtcGxlCistLS0tLS0tLS0tLS0tLS0tLS0tCisKK1J1biB0aGUgZXhhbXBsZSBhcyBmb2xsb3dzOgorCis+ICAgICBtdm4gY2xlYW4gcGFja2FnZSBqZXR0eTpydW4KKworVGhpcyBkZXBsb3lzIGN1cnJlbnQgZXhhbXBsZSB1c2luZyBKZXR0eS4gWW91IGNhbiBhY2Nlc3MgdGhlIGFwcGxpY2F0aW9uIGF0OgorCistICAgPGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qOC9kZWZhdWx0LW1ldGhvZD4KKy0gICA8aHR0cDovL2xvY2FsaG9zdDo4MDgwL2o4L2RlZmF1bHQtbWV0aG9kL3BhdGg+CistICAgPGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qOC9kZWZhdWx0LW1ldGhvZC9jbGFzcz4KKy0gICA8aHR0cDovL2xvY2FsaG9zdDo4MDgwL2o4L2xhbWJkYXMvdGVzdD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2phdmE4LXdlYmFwcC9wb20ueG1sIGIvZXhhbXBsZXMvamF2YTgtd2ViYXBwL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI0YWMyOAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2phdmE4LXdlYmFwcC9wb20ueG1sCkBAIC0wLDAgKzEsMTAxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD53ZWJhcHAtZXhhbXBsZS1wYXJlbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vd2ViYXBwLWV4YW1wbGUtcGFyZW50L3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmphdmE4LXdlYmFwcDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS1leGFtcGxlcy1qYXZhOC13ZWJhcHA8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+SmF2YSA4IFR5cGVzIFdlYkFwcCBFeGFtcGxlLjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktaGsyPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c291cmNlPiR7amF2YS52ZXJzaW9ufTwvc291cmNlPgorICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PiR7amF2YS52ZXJzaW9ufTwvdGFyZ2V0PgorICAgICAgICAgICAgICAgICAgICA8c2hvd1dhcm5pbmdzPmZhbHNlPC9zaG93V2FybmluZ3M+CisgICAgICAgICAgICAgICAgICAgIDxmb3JrPmZhbHNlPC9mb3JrPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPCEtLSBSdW4gdGhlIGFwcGxpY2F0aW9uIHVzaW5nICJtdm4gamV0dHk6cnVuIiAtLT4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDwhLS0gVE9ETzogUmVtb3ZlIHRoZSB2ZXJzaW9uIHdoZW4gSkVSU0VZLTI3NDMgaXMgcmVzb2x2ZWQuIC0tPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjkuMi42LnYyMDE0MTIwNTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHNjYW5JbnRlcnZhbFNlY29uZHM+NTwvc2NhbkludGVydmFsU2Vjb25kcz4KKyAgICAgICAgICAgICAgICAgICAgPHN0b3BQb3J0Pjk5OTk8L3N0b3BQb3J0PgorICAgICAgICAgICAgICAgICAgICA8c3RvcEtleT5TVE9QPC9zdG9wS2V5PgorICAgICAgICAgICAgICAgICAgICA8d2ViQXBwPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbnRleHRQYXRoPi88L2NvbnRleHRQYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgPHdlYkluZkluY2x1ZGVKYXJQYXR0ZXJuPi4qLy4qamVyc2V5LVteL11cLmphciQ8L3dlYkluZkluY2x1ZGVKYXJQYXR0ZXJuPgorICAgICAgICAgICAgICAgICAgICA8L3dlYkFwcD4KKyAgICAgICAgICAgICAgICAgICAgPHN5c3RlbVByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+amV0dHkucG9ydDwvbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+JHtqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnR9PC92YWx1ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydGllcz4KKyAgICAgICAgICAgICAgICAgICAgPHdhcj4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8ke3Byb2plY3QuYnVpbGQuZmluYWxOYW1lfS53YXI8L3dhcj4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnJlbGVhc2U8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD54bWwtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydD44MDgwPC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+CisgICAgPC9wcm9wZXJ0aWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvamF2YTgtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamF2YTgvSmF2YThBcHBsaWNhdGlvbi5qYXZhIGIvZXhhbXBsZXMvamF2YTgtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamF2YTgvSmF2YThBcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MWM1YWQKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9qYXZhOC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qYXZhOC9KYXZhOEFwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5qYXZhODsKKworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmphdmE4LnJlc291cmNlcy5EZWZhdWx0TWV0aG9kUmVzb3VyY2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuamF2YTgucmVzb3VyY2VzLkxhbWJkYVJlc291cmNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworLyoqCisgKiBBcHBsaWNhdGlvbiBmb3IgaWxsdXN0cmF0aW5nIHNvbWUgb2YgdGhlIGZlYXR1cmVzIG9mIEphdmEgOCBpbiBKQVgtUlMuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BBcHBsaWNhdGlvblBhdGgoImo4IikKK3B1YmxpYyBjbGFzcyBKYXZhOEFwcGxpY2F0aW9uIGV4dGVuZHMgUmVzb3VyY2VDb25maWcgeworCisgICAgcHVibGljIEphdmE4QXBwbGljYXRpb24oKSB7CisgICAgICAgIC8vIFJlc291cmNlcy4KKyAgICAgICAgcmVnaXN0ZXIoRGVmYXVsdE1ldGhvZFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgcmVnaXN0ZXIoTGFtYmRhUmVzb3VyY2UuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2phdmE4LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2phdmE4L3Jlc291cmNlcy9EZWZhdWx0TWV0aG9kSW50ZXJmYWNlLmphdmEgYi9leGFtcGxlcy9qYXZhOC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qYXZhOC9yZXNvdXJjZXMvRGVmYXVsdE1ldGhvZEludGVyZmFjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhNjdlOWYKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9qYXZhOC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qYXZhOC9yZXNvdXJjZXMvRGVmYXVsdE1ldGhvZEludGVyZmFjZS5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuamF2YTgucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CisKKy8qKgorICogRXhhbXBsZSBpbnRlcmZhY2UgY29udGFpbmluZyByZXNvdXJjZSBtZXRob2RzIGluIGZvcm0gb2YgSmF2YTgncyBkZWZhdWx0IG1ldGhvZHMuCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgaW50ZXJmYWNlIERlZmF1bHRNZXRob2RJbnRlcmZhY2UgeworCisgICAgQEdFVAorICAgIGRlZmF1bHQgU3RyaW5nIHJvb3QoKSB7CisgICAgICAgIHJldHVybiAiaW50ZXJmYWNlLXJvb3QiOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgicGF0aCIpCisgICAgZGVmYXVsdCBTdHJpbmcgcGF0aCgpIHsKKyAgICAgICAgcmV0dXJuICJpbnRlcmZhY2UtcGF0aCI7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9leGFtcGxlcy9qYXZhOC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qYXZhOC9yZXNvdXJjZXMvRGVmYXVsdE1ldGhvZFJlc291cmNlLmphdmEgYi9leGFtcGxlcy9qYXZhOC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qYXZhOC9yZXNvdXJjZXMvRGVmYXVsdE1ldGhvZFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzllMzQ3ZAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2phdmE4LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2phdmE4L3Jlc291cmNlcy9EZWZhdWx0TWV0aG9kUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmphdmE4LnJlc291cmNlczsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCisvKioKKyAqIEpBWC1SUyByZXNvdXJjZSBpbmhlcml0aW5nIHNvbWUgcmVzb3VyY2UgbWV0aG9kIGltcGxlbWVudGF0aW9ucyBmcm9tIHRoZSBpbXBsZW1lbnRlZCBpbnRlcmZhY2UuCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiZGVmYXVsdC1tZXRob2QiKQorQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKK3B1YmxpYyBjbGFzcyBEZWZhdWx0TWV0aG9kUmVzb3VyY2UgaW1wbGVtZW50cyBEZWZhdWx0TWV0aG9kSW50ZXJmYWNlIHsKKworICAgIEBHRVQKKyAgICBAUGF0aCgiY2xhc3MiKQorICAgIHB1YmxpYyBTdHJpbmcgZnJvbUNsYXNzKCkgeworICAgICAgICByZXR1cm4gImNsYXNzIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9qYXZhOC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qYXZhOC9yZXNvdXJjZXMvTGFtYmRhUmVzb3VyY2UuamF2YSBiL2V4YW1wbGVzL2phdmE4LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2phdmE4L3Jlc291cmNlcy9MYW1iZGFSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0NDhlYTgKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9qYXZhOC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qYXZhOC9yZXNvdXJjZXMvTGFtYmRhUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmphdmE4LnJlc291cmNlczsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoUGFyYW07CisKKy8qKgorICogSkFYLVJTIHJlc291cmNlIHVzaW5nIEphdmEgU0UgOCBsYW1iZGFzLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJsYW1iZGFzL3twfSIpCitwdWJsaWMgY2xhc3MgTGFtYmRhUmVzb3VyY2UgeworICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdldExhbWJkYVJlc3VsdChAUGF0aFBhcmFtKCJwIikgU3RyaW5nIHApIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbihwKS5zdHJlYW0oKS5tYXAodiAtPiB2ICsgIi1sYW1iZGFpemVkIikuY29sbGVjdChDb2xsZWN0b3JzLmpvaW5pbmcoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvamF2YTgtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamF2YTgvRGVmYXVsdE1ldGhvZFJlc291cmNlVGVzdC5qYXZhIGIvZXhhbXBsZXMvamF2YTgtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamF2YTgvRGVmYXVsdE1ldGhvZFJlc291cmNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMTg3ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9qYXZhOC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qYXZhOC9EZWZhdWx0TWV0aG9kUmVzb3VyY2VUZXN0LmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5qYXZhODsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0IHVzYWdlIG9mIEphdmE4J3MgaW50ZXJmYWNlIGRlZmF1bHQgbWV0aG9kcyBhcyByZXNvdXJjZSBtZXRob2RzLgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIERlZmF1bHRNZXRob2RSZXNvdXJjZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgSmF2YThBcHBsaWNhdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCBKREs4IGRlZmF1bHQgbWV0aG9kcyBkbyB3b3JrIGFzIGNvbW1vbiBKQVgtUlMgcmVzb3VyY2UgbWV0aG9kcy4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0TWV0aG9kcygpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IGRlZmF1bHRNZXRob2RUYXJnZXQgPSB0YXJnZXQoImRlZmF1bHQtbWV0aG9kIik7CisKKyAgICAgICAgLy8gdGVzdCBkZWZhdWx0IG1ldGhvZCB3aXRoIG5vIEBQYXRoIGFubm90YXRpb24KKyAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gZGVmYXVsdE1ldGhvZFRhcmdldC5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiaW50ZXJmYWNlLXJvb3QiLCByZXNwb25zZSk7CisKKyAgICAgICAgLy8gdGVzdCBkZWZhdWx0IG1ldGhvZCB3aXRoIHdpdGggQFBhdGggYW5ub3RhdGlvbgorICAgICAgICByZXNwb25zZSA9IGRlZmF1bHRNZXRob2RUYXJnZXQucGF0aCgicGF0aCIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbnRlcmZhY2UtcGF0aCIsIHJlc3BvbnNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0LCB0aGF0IHJlc291cmNlIG1ldGhvZHMgZGVmaW5lZCBpbiB0aGUgY2xhc3MgaW1wbGVtZW50aW5nIHRoZSBpbnRlcmZhY2Ugd2l0aCBkZWZhdWx0IG1ldGhvZCBkbyB3b3JrIG5vcm1hbGx5LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEltcGxlbWVudGluZ0NsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXNwb25zZSA9IHRhcmdldCgiZGVmYXVsdC1tZXRob2QiKS5wYXRoKCJjbGFzcyIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjbGFzcyIsIHJlc3BvbnNlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9qYXZhOC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qYXZhOC9MYW1iZGFSZXNvdXJjZVRlc3QuamF2YSBiL2V4YW1wbGVzL2phdmE4LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2phdmE4L0xhbWJkYVJlc291cmNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzN2IxYzcKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9qYXZhOC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qYXZhOC9MYW1iZGFSZXNvdXJjZVRlc3QuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmphdmE4OworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIFRlc3QgdXNhZ2Ugb2YgSmF2YSBTRSA4IGxhbWJkYXMgaW4gSkFYLVJTIHJlc291cmNlIG1ldGhvZHMuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIExhbWJkYVJlc291cmNlVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKYXZhOEFwcGxpY2F0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0aGF0IEpESzggbGFtYmRhcyBkbyB3b3JrIGluIGNvbW1vbiBKQVgtUlMgcmVzb3VyY2UgbWV0aG9kcy4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMYW1iZGFzKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJsYW1iZGFzL3twfSIpOworCisgICAgICAgIC8vIHRlc3QgZGVmYXVsdCBtZXRob2Qgd2l0aCBubyBAUGF0aCBhbm5vdGF0aW9uCisgICAgICAgIFN0cmluZyByZXNwb25zZSA9IHRhcmdldC5yZXNvbHZlVGVtcGxhdGUoInAiLCAidGVzdCIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZSwgZXF1YWxUbygidGVzdC1sYW1iZGFpemVkIikpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvamF4Yi9SRUFETUUuTUQgYi9leGFtcGxlcy9qYXhiL1JFQURNRS5NRApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2QyMTZlCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvamF4Yi9SRUFETUUuTUQKQEAgLTAsMCArMSw3MyBAQAorWy8vXTogIyAiIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAiCitbLy9dOiAjICIgIgorWy8vXTogIyAiIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAiCitbLy9dOiAjICIgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQgIgorWy8vXTogIyAiIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4gIgorWy8vXTogIyAiICIKK1svL106ICMgIiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlICIKKworSkFYQiBFeGFtcGxlCis9PT09PT09PT09PT0KKworVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gdXNlIEpBWEIgdHlwZXMgd2l0aCByZXNvdXJjZSBjbGFzc2VzIGFuZCB0aGUgSkFYLVJTIENsaWVudCBBUEkuCisKK1RoZSBmb2xsb3dpbmcgSkFYQiB0eXBlcyBhcmUgc3VwcG9ydGVkIGFuZCBkZW1vbnN0cmF0ZWQ6CisKKy0gICBKQVhCIGNsYXNzZXMgYW5ub3RhdGVkIHdpdGggQFhtbFJvb3RFbGVtZW50CistICAgSkFYQiBjbGFzc2VzIGFubm90YXRlZCB3aXRoIEBYbWxUeXBlCistICAgSkFYQkVsZW1lbnQmbHQ7VCZndDsgd2hlcmUgVCBpcyBhIEpBWEIgeG1sIHR5cGUgdGhhdCBtYXkgb3IgbWF5IG5vdCBiZSBhbm5vdGF0ZWQgd2l0aCBAWG1sVHlwZQorLSAgIExpc3QmbHQ7VCZndDssIENvbGxlY3Rpb24mbHQ7VCZndDssIGFuZCBUXFtcXSB3aGVyZSBUIGlzIGEgSkFYQiBjbGFzcyBhbm5vdGF0ZWQgd2l0aCBAWG1sUm9vdEVsZW1lbnQgb3IgQFhtbFR5cGUKKworSXQgYWxzbyBzaG93cyBob3cgdG8gdXNlIEBYbWxIZWFkZXIgYW5ub3RhdGlvbiB0byBzcGVjaWZ5IHRoZSBoZWFkZXIgb2YgdGhlIFhNTCByZXNwb25zZXMuCisKK0NvbnRlbnRzCistLS0tLS0tLQorCitUaGUgbWFwcGluZyBvZiB0aGUgVVJJIHBhdGggc3BhY2UgaXMgcHJlc2VudGVkIGluIHRoZSBmb2xsb3dpbmcgdGFibGU6CisKK1VSSSBwYXRoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJlc291cmNlIGNsYXNzICAgICAgICAgICB8IEhUVFAgbWV0aG9kcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0KKyoqXy9qYXhiL1htbFJvb3RFbGVtZW50XyoqICAgICAgICAgICAgICB8IEpheGJSZXNvdXJjZSAgICAgICAgICAgICB8IEdFVCwgUE9TVAorKipfL2pheGIvWG1sUm9vdEVsZW1lbnRXaXRoSGVhZGVyXyoqICAgIHwgSmF4YlJlc291cmNlICAgICAgICAgICAgIHwgR0VUCisqKl8vamF4Yi9KQVhCRWxlbWVudF8qKiAgICAgICAgICAgICAgICAgfCBKYXhiUmVzb3VyY2UgICAgICAgICAgICAgfCBHRVQsIFBPU1QKKyoqXy9qYXhiL1htbFR5cGVfKiogICAgICAgICAgICAgICAgICAgICB8IEpheGJSZXNvdXJjZSAgICAgICAgICAgICB8IFBPU1QKKyoqXy9qYXhiL2NvbGxlY3Rpb24vWG1sUm9vdEVsZW1lbnRfKiogICB8IEpheGJDb2xsZWN0aW9uUmVzb3VyY2UgICB8IEdFVCwgUE9TVAorKipfL2pheGIvY29sbGVjdGlvbi9YbWxUeXBlXyoqICAgICAgICAgIHwgSmF4YkNvbGxlY3Rpb25SZXNvdXJjZSAgIHwgUE9TVAorKipfL2pheGIvYXJyYXkvWG1sUm9vdEVsZW1lbnRfKiogICAgICAgIHwgSmF4YkFycmF5UmVzb3VyY2UgICAgICAgIHwgR0VULCBQT1NUCisqKl8vamF4Yi9hcnJheS9YbWxUeXBlXyoqICAgICAgICAgICAgICAgfCBKYXhiQXJyYXlSZXNvdXJjZSAgICAgICAgfCBQT1NUCisKK0pBWEIgY2xhc3NlcyBhbm5vdGF0ZWQgd2l0aCBAWG1sUm9vdEVsZW1lbnQgbWF5IGJlIHByb2R1Y2VkIGFuZAorY29uc3VtZWQuIEpBWEIgY2xhc3NzZXMgYW5ub3RhdGVkIHdpdGggQFhtbFR5cGUgY2FuIG9ubHkgYmUgY29uc3VtZWQKK2hlbmNlIHdoeSBvbmx5IHRoZSBQT1NUIG1ldGhvZCBpcyBzdXBwb3J0ZWQgZm9yIHRoZSByZXNvdXJjZXMgYXNzb2NpYXRlZAord2l0aCBYbWxUeXBlLiBUaGlzIGlzIGJlY2F1c2UgdGhlIEpBWEIgcmVxdWlyZXMgZW5vdWdoIGluZm9ybWF0aW9uIHRvCitzZXJpYWxpemUgdGhlIEpBWEIgaW5zdGFuY2UgdG8gYSB3ZWxsLWZvcm1lZCBYTUwgZG9jdW1lbnQuIFRoZSBzYW1lCitydWxlcyBhcHBseSB0byBjb2xsZWN0aW9ucyBvZiBzdWNoIGNsYXNzZXMuCisKK0ZvciB0aGUgc2VyaWFsaXphdGlvbiBvZiBhIENvbGxlY3Rpb24gb2YgSkFYQiB0eXBlLCBvciBhbiBhcnJheSwgSmVyc2V5Cit3aWxsIGF1dG9tYXRpY2FsbHkgZGVyaXZlIHRoZSBYTUwgcm9vdCBlbGVtZW50IG9mIHRoZSBYTUwgZG9jdW1lbnQgdG8KK3NlcmlhbGl6ZSBmcm9tIHRoZSBYTUwgbmFtZSBvZiB0aGUgSkFYQiBjbGFzcyBhbm5vYXRlZCB3aXRoCitAWG1sUm9vdEVsZW1lbnQuCisKK1J1bm5pbmcgdGhlIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworUnVuIHRoZSBleGFtcGxlIGFzIGZvbGxvd3M6CisKKz4gICAgIG12biBjbGVhbiBjb21waWxlIGV4ZWM6amF2YQorCitUaGlzIGRlcGxveXMgdGhlIGV4YW1wbGUgdXNpbmcgW0dyaXp6bHldKGh0dHA6Ly9ncml6emx5LmphdmEubmV0LykgY29udGFpbmVyLiBZb3UgY2FuIGFjY2VzcyB0aGUgYXBwbGljYXRpb24gYXQ6CisKKy0gICA8aHR0cDovL2xvY2FsaG9zdDo4MDgwL2pheGIvamF4Yi9YbWxSb290RWxlbWVudD4KKy0gICA8aHR0cDovL2xvY2FsaG9zdDo4MDgwL2pheGIvamF4Yi9YbWxSb290RWxlbWVudFdpdGhIZWFkZXI+CistICAgPGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qYXhiL2pheGIvSkFYQkVsZW1lbnQ+CistICAgPGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qYXhiL2pheGIvY29sbGVjdGlvbi9YbWxSb290RWxlbWVudD4KKy0gICA8aHR0cDovL2xvY2FsaG9zdDo4MDgwL2pheGIvamF4Yi9hcnJheS9YbWxSb290RWxlbWVudD4KKworb3IgeW91IGNhbiBwb3N0IGFuIHhtbCBlbnRpdHk6CisKKz4gICAgY3VybCAtdiAtWCBQT1NUIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qYXhiL2pheGIvWG1sUm9vdEVsZW1lbnQgLUggIkNvbnRlbnQtVHlwZTphcHBsaWNhdGlvbi94bWwiIC1kICcKKz4gICAgPGpheGJYbWxSb290RWxlbWVudD4KKz4gICAgICAgIDx2YWx1ZT54bWwgcm9vdCBlbGVtZW50PC92YWx1ZT4KKz4gICAgPC9qYXhiWG1sUm9vdEVsZW1lbnQ+JworCitZb3UgY2FuIHNlZSB0ZXN0IGNsYXNzZXMgYXQgYHNyYy9tYWluL3Rlc3RgIHN1YmRpcmVjdG9yeSBmb3IgZGV0YWlsZWQgaW5mb3JtYXRpb24gaG93IHRvIGNvbnN1bWUgdGhlIHNlcnZpY2UgdXNpbmcgSkFYLVJTIENsaWVudCBBUEkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9qYXhiL3BvbS54bWwgYi9leGFtcGxlcy9qYXhiL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdmODU2ZAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2pheGIvcG9tLnhtbApAQCAtMCwwICsxLDc3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmpheGI8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktZXhhbXBsZXMtamF4YjwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgSkFYQiBleGFtcGxlLjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLWdyaXp6bHkyLWh0dHA8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktaGsyPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLndvb2RzdG94PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+d29vZHN0b3gtY29yZS1hc2w8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj40LjEuMjwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhlYy1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxtYWluQ2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuamF4Yi5BcHA8L21haW5DbGFzcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnJlbGVhc2U8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvamF4Yi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2pheGIvQXBwLmphdmEgYi9leGFtcGxlcy9qYXhiL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamF4Yi9BcHAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDdhOTJiCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvamF4Yi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2pheGIvQXBwLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5qYXhiOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseTIuaHR0cHNlcnZlci5Hcml6emx5SHR0cFNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5ncml6emx5Lmh0dHAuc2VydmVyLkh0dHBTZXJ2ZXI7CisKKy8qKgorICogSmVyc2V5IEpBWEIgZXhhbXBsZSBhcHBsaWNhdGlvbi4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQXBwIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVSSSBCQVNFX1VSSSA9IFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qYXhiLyIpOworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJKQVhCIEplcnNleSBFeGFtcGxlIEFwcCIpOworCisgICAgICAgICAgICBmaW5hbCBIdHRwU2VydmVyIHNlcnZlciA9IEdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeS5jcmVhdGVIdHRwU2VydmVyKEJBU0VfVVJJLCBjcmVhdGVBcHAoKSwgZmFsc2UpOworICAgICAgICAgICAgUnVudGltZS5nZXRSdW50aW1lKCkuYWRkU2h1dGRvd25Ib29rKG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyLnNodXRkb3duTm93KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkpOworICAgICAgICAgICAgc2VydmVyLnN0YXJ0KCk7CisKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiQXBwbGljYXRpb24gc3RhcnRlZC4lblRyeSBvdXQgJXMlblN0b3AgdGhlIGFwcGxpY2F0aW9uIHVzaW5nIENUUkwrQyIsIEJBU0VfVVJJKSk7CisKKyAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuam9pbigpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiB8IEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKEFwcC5jbGFzcy5nZXROYW1lKCkpLmxvZyhMZXZlbC5TRVZFUkUsIG51bGwsIGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VDb25maWcgY3JlYXRlQXBwKCkgeworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByYyA9IG5ldyBSZXNvdXJjZUNvbmZpZygpCisgICAgICAgICAgICAgICAgLnBhY2thZ2VzKEpheGJSZXNvdXJjZS5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKKworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvamF4Yi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2pheGIvSmF4YkFycmF5UmVzb3VyY2UuamF2YSBiL2V4YW1wbGVzL2pheGIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qYXhiL0pheGJBcnJheVJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI0MmM1MwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2pheGIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qYXhiL0pheGJBcnJheVJlc291cmNlLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5qYXhiOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CisKKy8qKgorICogQW4gZXhhbXBsZSByZXNvdXJjZSB1dGlsaXppbmcgYXJyYXkgb2YgSkFYQiBiZWFucy4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKi8KK0BQYXRoKCJqYXhiL2FycmF5IikKK0BQcm9kdWNlcygiYXBwbGljYXRpb24veG1sIikKK0BDb25zdW1lcygiYXBwbGljYXRpb24veG1sIikKK3B1YmxpYyBjbGFzcyBKYXhiQXJyYXlSZXNvdXJjZSB7CisKKyAgICBAUGF0aCgiWG1sUm9vdEVsZW1lbnQiKQorICAgIEBHRVQKKyAgICBwdWJsaWMgSmF4YlhtbFJvb3RFbGVtZW50W10gZ2V0Um9vdEVsZW1lbnQoKSB7CisgICAgICAgIExpc3Q8SmF4YlhtbFJvb3RFbGVtZW50PiBlbCA9IG5ldyBBcnJheUxpc3Q8SmF4YlhtbFJvb3RFbGVtZW50PigpOworICAgICAgICBlbC5hZGQobmV3IEpheGJYbWxSb290RWxlbWVudCgib25lIHJvb3QgZWxlbWVudCIpKTsKKyAgICAgICAgZWwuYWRkKG5ldyBKYXhiWG1sUm9vdEVsZW1lbnQoInR3byByb290IGVsZW1lbnQiKSk7CisgICAgICAgIGVsLmFkZChuZXcgSmF4YlhtbFJvb3RFbGVtZW50KCJ0aHJlZSByb290IGVsZW1lbnQiKSk7CisgICAgICAgIHJldHVybiBlbC50b0FycmF5KG5ldyBKYXhiWG1sUm9vdEVsZW1lbnRbZWwuc2l6ZSgpXSk7CisgICAgfQorCisgICAgQFBhdGgoIlhtbFJvb3RFbGVtZW50IikKKyAgICBAUE9TVAorICAgIHB1YmxpYyBKYXhiWG1sUm9vdEVsZW1lbnRbXSBwb3N0Um9vdEVsZW1lbnQoSmF4YlhtbFJvb3RFbGVtZW50W10gZWwpIHsKKyAgICAgICAgcmV0dXJuIGVsOworICAgIH0KKworICAgIEBQYXRoKCJYbWxUeXBlIikKKyAgICBAUE9TVAorICAgIHB1YmxpYyBKYXhiWG1sUm9vdEVsZW1lbnRbXSBwb3N0WG1sVHlwZShKYXhiWG1sVHlwZVtdIHRsKSB7CisgICAgICAgIExpc3Q8SmF4YlhtbFJvb3RFbGVtZW50PiBlbCA9IG5ldyBBcnJheUxpc3Q8SmF4YlhtbFJvb3RFbGVtZW50PigpOworCisgICAgICAgIGZvciAoSmF4YlhtbFR5cGUgdCA6IHRsKSB7CisgICAgICAgICAgICBlbC5hZGQobmV3IEpheGJYbWxSb290RWxlbWVudCh0LnZhbHVlKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZWwudG9BcnJheShuZXcgSmF4YlhtbFJvb3RFbGVtZW50W2VsLnNpemUoKV0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2pheGIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qYXhiL0pheGJDb2xsZWN0aW9uUmVzb3VyY2UuamF2YSBiL2V4YW1wbGVzL2pheGIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qYXhiL0pheGJDb2xsZWN0aW9uUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjBlNjRlCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvamF4Yi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2pheGIvSmF4YkNvbGxlY3Rpb25SZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuamF4YjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCisvKioKKyAqIEFuIGV4YW1wbGUgcmVzb3VyY2UgdXRpbGl6aW5nIGNvbGxlY3Rpb25zIG9mIEpBWEIgYmVhbnMuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitAUGF0aCgiamF4Yi9jb2xsZWN0aW9uIikKK0BQcm9kdWNlcygiYXBwbGljYXRpb24veG1sIikKK0BDb25zdW1lcygiYXBwbGljYXRpb24veG1sIikKK3B1YmxpYyBjbGFzcyBKYXhiQ29sbGVjdGlvblJlc291cmNlIHsKKworICAgIEBQYXRoKCJYbWxSb290RWxlbWVudCIpCisgICAgQEdFVAorICAgIHB1YmxpYyBMaXN0PEpheGJYbWxSb290RWxlbWVudD4gZ2V0Um9vdEVsZW1lbnQoKSB7CisgICAgICAgIExpc3Q8SmF4YlhtbFJvb3RFbGVtZW50PiBlbCA9IG5ldyBBcnJheUxpc3Q8SmF4YlhtbFJvb3RFbGVtZW50PigpOworICAgICAgICBlbC5hZGQobmV3IEpheGJYbWxSb290RWxlbWVudCgib25lIHJvb3QgZWxlbWVudCIpKTsKKyAgICAgICAgZWwuYWRkKG5ldyBKYXhiWG1sUm9vdEVsZW1lbnQoInR3byByb290IGVsZW1lbnQiKSk7CisgICAgICAgIGVsLmFkZChuZXcgSmF4YlhtbFJvb3RFbGVtZW50KCJ0aHJlZSByb290IGVsZW1lbnQiKSk7CisgICAgICAgIHJldHVybiBlbDsKKyAgICB9CisKKyAgICBAUGF0aCgiWG1sUm9vdEVsZW1lbnQiKQorICAgIEBQT1NUCisgICAgcHVibGljIENvbGxlY3Rpb248SmF4YlhtbFJvb3RFbGVtZW50PiBwb3N0Um9vdEVsZW1lbnQoTGlzdDxKYXhiWG1sUm9vdEVsZW1lbnQ+IGVsKSB7CisgICAgICAgIHJldHVybiBlbDsKKyAgICB9CisKKyAgICBAUGF0aCgiWG1sVHlwZSIpCisgICAgQFBPU1QKKyAgICBwdWJsaWMgTGlzdDxKYXhiWG1sUm9vdEVsZW1lbnQ+IHBvc3RYbWxUeXBlKExpc3Q8SmF4YlhtbFR5cGU+IHRsKSB7CisgICAgICAgIExpc3Q8SmF4YlhtbFJvb3RFbGVtZW50PiBlbCA9IG5ldyBBcnJheUxpc3Q8SmF4YlhtbFJvb3RFbGVtZW50PigpOworCisgICAgICAgIGZvciAoSmF4YlhtbFR5cGUgdCA6IHRsKSB7CisgICAgICAgICAgICBlbC5hZGQobmV3IEpheGJYbWxSb290RWxlbWVudCh0LnZhbHVlKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZWw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvamF4Yi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2pheGIvSmF4YlJlc291cmNlLmphdmEgYi9leGFtcGxlcy9qYXhiL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamF4Yi9KYXhiUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGNkNDM1Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvamF4Yi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2pheGIvSmF4YlJlc291cmNlLmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5qYXhiOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLlhtbEhlYWRlcjsKKworLyoqCisgKiBBbiBleGFtcGxlIHJlc291cmNlIHV0aWxpemluZyBKQVhCIGJlYW5zLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqLworQFBhdGgoImpheGIiKQorQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi94bWwiKQorQENvbnN1bWVzKCJhcHBsaWNhdGlvbi94bWwiKQorcHVibGljIGNsYXNzIEpheGJSZXNvdXJjZSB7CisKKyAgICBAUGF0aCgiWG1sUm9vdEVsZW1lbnQiKQorICAgIEBHRVQKKyAgICBwdWJsaWMgSmF4YlhtbFJvb3RFbGVtZW50IGdldFJvb3RFbGVtZW50KCkgeworICAgICAgICByZXR1cm4gbmV3IEpheGJYbWxSb290RWxlbWVudCgieG1sIHJvb3QgZWxlbWVudCIpOworICAgIH0KKworICAgIEBQYXRoKCJYbWxSb290RWxlbWVudFdpdGhIZWFkZXIiKQorICAgIEBHRVQKKyAgICBAWG1sSGVhZGVyKCI8P3htbC1zdHlsZXNoZWV0IHR5cGU9J3RleHQveHNsJyBocmVmPSdmb29iYXIueHNsJyA/PiIpCisgICAgcHVibGljIEpheGJYbWxSb290RWxlbWVudCBnZXRSb290RWxlbWVudFdpdGhIZWFkZXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgSmF4YlhtbFJvb3RFbGVtZW50KCJ4bWwgcm9vdCBlbGVtZW50Iik7CisgICAgfQorCisgICAgQFBhdGgoIlhtbFJvb3RFbGVtZW50IikKKyAgICBAUE9TVAorICAgIHB1YmxpYyBKYXhiWG1sUm9vdEVsZW1lbnQgcG9zdFJvb3RFbGVtZW50KEpheGJYbWxSb290RWxlbWVudCByKSB7CisgICAgICAgIHJldHVybiByOworICAgIH0KKworICAgIEBQYXRoKCJKQVhCRWxlbWVudCIpCisgICAgQEdFVAorICAgIHB1YmxpYyBKQVhCRWxlbWVudDxKYXhiWG1sVHlwZT4gZ2V0SkFYQkVsZW1lbnQoKSB7CisgICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8SmF4YlhtbFR5cGU+KAorICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgiamF4YlhtbFJvb3RFbGVtZW50IiksCisgICAgICAgICAgICAgICAgSmF4YlhtbFR5cGUuY2xhc3MsCisgICAgICAgICAgICAgICAgbmV3IEpheGJYbWxUeXBlKCJ4bWwgdHlwZSIpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiSkFYQkVsZW1lbnQiKQorICAgIEBQT1NUCisgICAgcHVibGljIEpBWEJFbGVtZW50PEpheGJYbWxUeXBlPiBwb3N0SkFYQkVsZW1lbnQoSkFYQkVsZW1lbnQ8SmF4YlhtbFR5cGU+IGUpIHsKKyAgICAgICAgcmV0dXJuIGU7CisgICAgfQorCisgICAgQFBhdGgoIlhtbFR5cGUiKQorICAgIEBQT1NUCisgICAgcHVibGljIEpBWEJFbGVtZW50PEpheGJYbWxUeXBlPiBwb3N0WG1sVHlwZShKYXhiWG1sVHlwZSByKSB7CisgICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnQ8SmF4YlhtbFR5cGU+KAorICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgiamF4YlhtbFJvb3RFbGVtZW50IiksIEpheGJYbWxUeXBlLmNsYXNzLCByKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9qYXhiL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamF4Yi9KYXhiWG1sUm9vdEVsZW1lbnQuamF2YSBiL2V4YW1wbGVzL2pheGIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qYXhiL0pheGJYbWxSb290RWxlbWVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYjYyOTQKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9qYXhiL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamF4Yi9KYXhiWG1sUm9vdEVsZW1lbnQuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmpheGI7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCitAWG1sUm9vdEVsZW1lbnQKK3B1YmxpYyBjbGFzcyBKYXhiWG1sUm9vdEVsZW1lbnQgeworCisgICAgcHVibGljIFN0cmluZyB2YWx1ZTsKKworICAgIHB1YmxpYyBKYXhiWG1sUm9vdEVsZW1lbnQoKSB7CisgICAgfQorCisgICAgcHVibGljIEpheGJYbWxSb290RWxlbWVudChTdHJpbmcgc3RyKSB7CisgICAgICAgIHZhbHVlID0gc3RyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgSmF4YlhtbFJvb3RFbGVtZW50KSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoKEpheGJYbWxSb290RWxlbWVudCkgbykudmFsdWUuZXF1YWxzKHZhbHVlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IDM7CisgICAgICAgIGhhc2ggPSA4OSAqIGhhc2ggKyAodGhpcy52YWx1ZSAhPSBudWxsID8gdGhpcy52YWx1ZS5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIHJldHVybiBoYXNoOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2pheGIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qYXhiL0pheGJYbWxUeXBlLmphdmEgYi9leGFtcGxlcy9qYXhiL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamF4Yi9KYXhiWG1sVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwOWJhY2MKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9qYXhiL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamF4Yi9KYXhiWG1sVHlwZS5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuamF4YjsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKKworQFhtbFR5cGUKK3B1YmxpYyBjbGFzcyBKYXhiWG1sVHlwZSB7CisKKyAgICBwdWJsaWMgU3RyaW5nIHZhbHVlOworCisgICAgcHVibGljIEpheGJYbWxUeXBlKCkgeworICAgIH0KKworICAgIHB1YmxpYyBKYXhiWG1sVHlwZShTdHJpbmcgc3RyKSB7CisgICAgICAgIHZhbHVlID0gc3RyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgSmF4YlhtbFR5cGUpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICgoSmF4YlhtbFR5cGUpIG8pLnZhbHVlLmVxdWFscyh2YWx1ZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGhhc2ggPSA3OworICAgICAgICBoYXNoID0gNzkgKiBoYXNoICsgKHRoaXMudmFsdWUgIT0gbnVsbCA/IHRoaXMudmFsdWUuaGFzaENvZGUoKSA6IDApOworICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9qYXhiL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamF4Yi9KYXhiVGVzdC5qYXZhIGIvZXhhbXBsZXMvamF4Yi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2pheGIvSmF4YlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmYzYThjCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvamF4Yi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2pheGIvSmF4YlRlc3QuamF2YQpAQCAtMCwwICsxLDE2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5qYXhiOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkdlbmVyaWNFbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljVHlwZTsKK2ltcG9ydCBzdGF0aWMgamF2YXgud3MucnMuY2xpZW50LkVudGl0eS54bWw7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogSmVyc2V5IEpBWEIgZXhhbXBsZSB0ZXN0LgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBKYXhiVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKTsKKworICAgICAgICByZXR1cm4gQXBwLmNyZWF0ZUFwcCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgY2hlY2tzIHRoYXQgdGhlIGFwcGxpY2F0aW9uLndhZGwgaXMgcmVhY2hhYmxlLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFwcGxpY2F0aW9uV2FkbCgpIHsKKyAgICAgICAgU3RyaW5nIGFwcGxpY2F0aW9uV2FkbCA9IHRhcmdldCgpLnBhdGgoImFwcGxpY2F0aW9uLndhZGwiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRydWUoIlNvbWV0aGluZyB3cm9uZy4gUmV0dXJuZWQgd2FkbCBsZW5ndGggaXMgbm90ID4gMCIsCisgICAgICAgICAgICAgICAgYXBwbGljYXRpb25XYWRsLmxlbmd0aCgpID4gMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Um9vdEVsZW1lbnQoKSB7CisgICAgICAgIEpheGJYbWxSb290RWxlbWVudCBlMSA9IHRhcmdldCgpLnBhdGgoImpheGIvWG1sUm9vdEVsZW1lbnQiKS5yZXF1ZXN0KCkuZ2V0KEpheGJYbWxSb290RWxlbWVudC5jbGFzcyk7CisKKyAgICAgICAgSmF4YlhtbFJvb3RFbGVtZW50IGUyID0gdGFyZ2V0KCkucGF0aCgiamF4Yi9YbWxSb290RWxlbWVudCIpLnJlcXVlc3QoImFwcGxpY2F0aW9uL3htbCIpCisgICAgICAgICAgICAgICAgLnBvc3QoeG1sKGUxKSwgSmF4YlhtbFJvb3RFbGVtZW50LmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoZTEsIGUyKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSb290RWxlbWVudFdpdGhIZWFkZXIoKSB7CisgICAgICAgIFN0cmluZyBlMSA9IHRhcmdldCgpLnBhdGgoImpheGIvWG1sUm9vdEVsZW1lbnQiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgU3RyaW5nIGUyID0gdGFyZ2V0KCkucGF0aCgiamF4Yi9YbWxSb290RWxlbWVudFdpdGhIZWFkZXIiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRydWUoZTIuY29udGFpbnMoIjw/eG1sLXN0eWxlc2hlZXQgdHlwZT0ndGV4dC94c2wnIGhyZWY9J2Zvb2Jhci54c2wnID8+IikgJiYgZTIuY29udGFpbnMoZTEuc3Vic3RyaW5nKGUxLmluZGV4T2YoIj8+IikgKyAyKS50cmltKCkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCRWxlbWVudCgpIHsKKyAgICAgICAgR2VuZXJpY1R5cGU8SkFYQkVsZW1lbnQ8SmF4YlhtbFR5cGU+PiBnZW5lcmljVHlwZSA9IG5ldyBHZW5lcmljVHlwZTxKQVhCRWxlbWVudDxKYXhiWG1sVHlwZT4+KCkge307CisKKyAgICAgICAgSkFYQkVsZW1lbnQ8SmF4YlhtbFR5cGU+IGUxID0gdGFyZ2V0KCkucGF0aCgiamF4Yi9KQVhCRWxlbWVudCIpLnJlcXVlc3QoKS5nZXQoZ2VuZXJpY1R5cGUpOworCisgICAgICAgIEpBWEJFbGVtZW50PEpheGJYbWxUeXBlPiBlMiA9IHRhcmdldCgpLnBhdGgoImpheGIvSkFYQkVsZW1lbnQiKS5yZXF1ZXN0KCJhcHBsaWNhdGlvbi94bWwiKQorICAgICAgICAgICAgICAgIC5wb3N0KHhtbChlMSksIGdlbmVyaWNUeXBlKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoZTEuZ2V0VmFsdWUoKSwgZTIuZ2V0VmFsdWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0WG1sVHlwZSgpIHsKKyAgICAgICAgSmF4YlhtbFR5cGUgdDEgPSB0YXJnZXQoKS5wYXRoKCJqYXhiL0pBWEJFbGVtZW50IikucmVxdWVzdCgpLmdldChKYXhiWG1sVHlwZS5jbGFzcyk7CisKKyAgICAgICAgSkFYQkVsZW1lbnQ8SmF4YlhtbFR5cGU+IGUgPSBuZXcgSkFYQkVsZW1lbnQ8SmF4YlhtbFR5cGU+KAorICAgICAgICAgICAgICAgIG5ldyBRTmFtZSgiamF4YlhtbFJvb3RFbGVtZW50IiksCisgICAgICAgICAgICAgICAgSmF4YlhtbFR5cGUuY2xhc3MsCisgICAgICAgICAgICAgICAgdDEpOworICAgICAgICBKYXhiWG1sVHlwZSB0MiA9IHRhcmdldCgpLnBhdGgoImpheGIvWG1sVHlwZSIpLnJlcXVlc3QoImFwcGxpY2F0aW9uL3htbCIpCisgICAgICAgICAgICAgICAgLnBvc3QoeG1sKGUpLCBKYXhiWG1sVHlwZS5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHQxLCB0Mik7CisgICAgfQorCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSb290RWxlbWVudENvbGxlY3Rpb24oKSB7CisgICAgICAgIEdlbmVyaWNUeXBlPENvbGxlY3Rpb248SmF4YlhtbFJvb3RFbGVtZW50Pj4gZ2VuZXJpY1R5cGUgPQorICAgICAgICAgICAgICAgIG5ldyBHZW5lcmljVHlwZTxDb2xsZWN0aW9uPEpheGJYbWxSb290RWxlbWVudD4+KCkge307CisKKyAgICAgICAgQ29sbGVjdGlvbjxKYXhiWG1sUm9vdEVsZW1lbnQ+IGNlMSA9IHRhcmdldCgpLnBhdGgoImpheGIvY29sbGVjdGlvbi9YbWxSb290RWxlbWVudCIpLnJlcXVlc3QoKS5nZXQoZ2VuZXJpY1R5cGUpOworICAgICAgICBDb2xsZWN0aW9uPEpheGJYbWxSb290RWxlbWVudD4gY2UyID0gdGFyZ2V0KCkucGF0aCgiamF4Yi9jb2xsZWN0aW9uL1htbFJvb3RFbGVtZW50IikucmVxdWVzdCgiYXBwbGljYXRpb24veG1sIikKKyAgICAgICAgICAgICAgICAucG9zdCh4bWwobmV3IEdlbmVyaWNFbnRpdHk8Q29sbGVjdGlvbjxKYXhiWG1sUm9vdEVsZW1lbnQ+PihjZTEpIHt9KSwgZ2VuZXJpY1R5cGUpOworCisgICAgICAgIGFzc2VydEVxdWFscyhjZTEsIGNlMik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0WG1sVHlwZUNvbGxlY3Rpb24oKSB7CisgICAgICAgIEdlbmVyaWNUeXBlPENvbGxlY3Rpb248SmF4YlhtbFJvb3RFbGVtZW50Pj4gZ2VuZXJpY1Jvb3RFbGVtZW50ID0KKyAgICAgICAgICAgICAgICBuZXcgR2VuZXJpY1R5cGU8Q29sbGVjdGlvbjxKYXhiWG1sUm9vdEVsZW1lbnQ+PigpIHt9OworICAgICAgICBHZW5lcmljVHlwZTxDb2xsZWN0aW9uPEpheGJYbWxUeXBlPj4gZ2VuZXJpY1htbFR5cGUgPQorICAgICAgICAgICAgICAgIG5ldyBHZW5lcmljVHlwZTxDb2xsZWN0aW9uPEpheGJYbWxUeXBlPj4oKSB7CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICBDb2xsZWN0aW9uPEpheGJYbWxSb290RWxlbWVudD4gY2UxID0gdGFyZ2V0KCkucGF0aCgiamF4Yi9jb2xsZWN0aW9uL1htbFJvb3RFbGVtZW50IikucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLmdldChnZW5lcmljUm9vdEVsZW1lbnQpOworCisgICAgICAgIENvbGxlY3Rpb248SmF4YlhtbFR5cGU+IGN0MSA9IHRhcmdldCgpLnBhdGgoImpheGIvY29sbGVjdGlvbi9YbWxUeXBlIikucmVxdWVzdCgiYXBwbGljYXRpb24veG1sIikKKyAgICAgICAgICAgICAgICAucG9zdCh4bWwobmV3IEdlbmVyaWNFbnRpdHk8Q29sbGVjdGlvbjxKYXhiWG1sUm9vdEVsZW1lbnQ+PihjZTEpIHt9KSwgZ2VuZXJpY1htbFR5cGUpOworCisgICAgICAgIENvbGxlY3Rpb248SmF4YlhtbFR5cGU+IGN0MiA9IHRhcmdldCgpLnBhdGgoImpheGIvY29sbGVjdGlvbi9YbWxSb290RWxlbWVudCIpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5nZXQoZ2VuZXJpY1htbFR5cGUpOworCisgICAgICAgIGFzc2VydEVxdWFscyhjdDEsIGN0Mik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Um9vdEVsZW1lbnRBcnJheSgpIHsKKyAgICAgICAgSmF4YlhtbFJvb3RFbGVtZW50W10gYWUxID0gdGFyZ2V0KCkucGF0aCgiamF4Yi9hcnJheS9YbWxSb290RWxlbWVudCIpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5nZXQoSmF4YlhtbFJvb3RFbGVtZW50W10uY2xhc3MpOworICAgICAgICBKYXhiWG1sUm9vdEVsZW1lbnRbXSBhZTIgPSB0YXJnZXQoKS5wYXRoKCJqYXhiL2FycmF5L1htbFJvb3RFbGVtZW50IikucmVxdWVzdCgiYXBwbGljYXRpb24veG1sIikKKyAgICAgICAgICAgICAgICAucG9zdCh4bWwoYWUxKSwgSmF4YlhtbFJvb3RFbGVtZW50W10uY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscyhhZTEubGVuZ3RoLCBhZTIubGVuZ3RoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhZTEubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhhZTFbaV0sIGFlMltpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RYbWxUeXBlQXJyYXkoKSB7CisgICAgICAgIEpheGJYbWxSb290RWxlbWVudFtdIGFlMSA9IHRhcmdldCgpLnBhdGgoImpheGIvYXJyYXkvWG1sUm9vdEVsZW1lbnQiKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAuZ2V0KEpheGJYbWxSb290RWxlbWVudFtdLmNsYXNzKTsKKworICAgICAgICBKYXhiWG1sVHlwZVtdIGF0MSA9IHRhcmdldCgpLnBhdGgoImpheGIvYXJyYXkvWG1sVHlwZSIpLnJlcXVlc3QoImFwcGxpY2F0aW9uL3htbCIpCisgICAgICAgICAgICAgICAgLnBvc3QoeG1sKGFlMSksIEpheGJYbWxUeXBlW10uY2xhc3MpOworCisgICAgICAgIEpheGJYbWxUeXBlW10gYXQyID0gdGFyZ2V0KCkucGF0aCgiamF4Yi9hcnJheS9YbWxSb290RWxlbWVudCIpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5nZXQoSmF4YlhtbFR5cGVbXS5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGF0MS5sZW5ndGgsIGF0Mi5sZW5ndGgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGF0MS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGF0MVtpXSwgYXQyW2ldKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2pheHJzLXR5cGVzLWluamVjdGlvbi9SRUFETUUuTUQgYi9leGFtcGxlcy9qYXhycy10eXBlcy1pbmplY3Rpb24vUkVBRE1FLk1ECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwN2Y1MWIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9qYXhycy10eXBlcy1pbmplY3Rpb24vUkVBRE1FLk1ECkBAIC0wLDAgKzEsNTggQEAKK1svL106ICMgIiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIgorWy8vXTogIyAiICIKK1svL106ICMgIiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgIgorWy8vXTogIyAiIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0ICIKK1svL106ICMgIiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuICIKK1svL106ICMgIiAiCitbLy9dOiAjICIgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZSAiCisKK0pBWC1SUyBUeXBlcyBJbmplY3Rpb24gRXhhbXBsZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaW5qZWN0aW9uIG9mIHZhcmlvdXMgcnVudGltZSBpbmZvcm1hdGlvbiBpbnRvIEplcnNleS9KQVgtUlMgcmVzb3VyY2VzLgorCitBIHNpbXBsZSBhcHBsaWNhdGlvbiBjb25zaXN0cyBvZiB0d28gc2ltcGxlIHJlc291cmNlczogT25lIGlzIGEgdHlwaWNhbAorSkFYLVJTIGBAUGF0aGAgYW5ub3RhdGVkIHJlc291cmNlLiBUaGUgc2Vjb25kIHJlc291cmNlIGlzIGNyZWF0ZWQKK3Byb2dyYW1tYXRpY2FsbHkgdXNpbmcgdGhlIG5ldyBKZXJlc3kgMiBwcm9ncmFtbWF0aWMgcmVzb3VyY2UgYmluZGluZworQVBJLiBCb3RoIHJlc291cmNlcyBpbmplY3QgdGhlIHNhbWUgaW5mb3JtYXRpb24gYW5kIHByb2R1Y2UgdGhlIHJlcG9ydAordGhhdCBpcyByZXR1cm5lZCBpbiB0aGUgcmVzcG9uc2UgYmFjayB0byB0aGUgY2xpZW50LgorCitDb250ZW50cworLS0tLS0tLS0KKworVGhlIEpBWC1SUyBgQFBhdGhgIGFubm90YXRlZCB3ZWIgcmVzb3VyY2UgaXMgaW1wbGVtZW50ZWQgYnkgdGhlCisKK2BvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5qYXhyc3R5cGVpbmplY3Rpb24uSmF4cnNJbmplY3Rpb25SZXBvcnRpbmdSZXNvdXJjZWAKKworY2xhc3MuIFRoZSBwcm9ncmFtbWF0aWMgcmVzb3VyY2UgaXMgaW1wbGVtZW50ZWQgYnkgdGhlCisKK2BvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5qYXhyc3R5cGVpbmplY3Rpb24uSmF4cnNJbmplY3Rpb25SZXBvcnRpbmdJbmZsZWN0b3JgIGNsYXNzLgorCitUaGUgbWFwcGluZyBvZiB0aGUgVVJJIHBhdGggc3BhY2UgaXMgcHJlc2VudGVkIGluIHRoZSBmb2xsb3dpbmcgdGFibGU6CisKK1VSSSBwYXRoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBSZXNvdXJjZSBjbGFzcyAgICAgICAgICAgICAgICAgICAgIHwgSFRUUCBtZXRob2RzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tCisqKl8vYW5ub3RhdGVkL2luc3RhbmNlL3twMX0ve3AyfT9xMT08aW50X3ZhbHVlPiZxMj08c3RyaW5nX3ZhbHVlPiZxMj08c3RyaW5nX3ZhbHVlPl8qKiAgIHwgSmF4cnNJbmplY3Rpb25SZXBvcnRpbmdSZXNvdXJjZSAgICB8IEdFVAorKipfL2Fubm90YXRlZC9tZXRob2Qve3AxfS97cDJ9P3ExPTxpbnRfdmFsdWU+JnEyPTxzdHJpbmdfdmFsdWU+JnEyPTxzdHJpbmdfdmFsdWU+XyoqICAgICB8IEpheHJzSW5qZWN0aW9uUmVwb3J0aW5nUmVzb3VyY2UgICAgfCBHRVQKKyoqXy9wcm9ncmFtbWF0aWMve3AxfS97cDJ9P3ExPTxpbnRfdmFsdWU+JnEyPTxzdHJpbmdfdmFsdWU+JnEyPTxzdHJpbmdfdmFsdWU+XyoqICAgICAgICAgfCBKYXhyc0luamVjdGlvblJlcG9ydGluZ0luZmxlY3RvciAgIHwgR0VUCisKK1BsZWFzZSBub3RlIHRoYXQgdGhlIHZhbHVlIG9mIHRoZSBgcTFgIFVSSSBxdWVyeSBwYXJhbWV0ZXIgaXMgZXhwZWN0ZWQKKworUnVubmluZyB0aGUgRXhhbXBsZQorLS0tLS0tLS0tLS0tLS0tLS0tLQorCitSdW4gdGhlIGV4YW1wbGUgYXMgZm9sbG93czoKKworPiAgICAgbXZuIGNsZWFuIGNvbXBpbGUgZXhlYzpqYXZhCisKK1RoaXMgZGVwbG95cyB0aGUgSkFYLVJTIFR5cGVzIEluamVjdGlvbiBFeGFtcGxlIHVzaW5nIFtHcml6emx5XShodHRwOi8vZ3JpenpseS5qYXZhLm5ldC8pCisKK0EgW1dBREwgZGVzY3JpcHRpb25dKGh0dHA6Ly93YWRsLmphdmEubmV0LyNzcGVjKSBtYXkgYmUgYWNjZXNzZWQgYXQgdGhlIFVSTDoKKworLSAgIDxodHRwOi8vbG9jYWxob3N0OjgwODAvamF4cnMtdHlwZS1pbmplY3Rpb24vYXBwbGljYXRpb24ud2FkbD4KKworVGhlIHJlc291cmNlcyBjb3VsZCBiZSBhY2Nlc3NlZCB2aWEKKworLSAgIDxodHRwOi8vbG9jYWxob3N0OjgwODAvamF4cnMtdHlwZS1pbmplY3Rpb24vYW5ub3RhdGVkL2luc3RhbmNlL3AxL3AyP3ExPTEyMyZxMj1hYmMmcTI9ZGVmPgorLSAgIDxodHRwOi8vbG9jYWxob3N0OjgwODAvamF4cnMtdHlwZS1pbmplY3Rpb24vYW5ub3RhdGVkL21ldGhvZC9wMS9wMj9xMT0xMjMmcTI9YWJjJnEyPWRlZj4KKy0gICA8aHR0cDovL2xvY2FsaG9zdDo4MDgwL2pheHJzLXR5cGUtaW5qZWN0aW9uL3Byb2dyYW1tYXRpYy9wMS9wMj9xMT0xMjMmcTI9YWJjJnEyPWRlZj4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2pheHJzLXR5cGVzLWluamVjdGlvbi9wb20ueG1sIGIvZXhhbXBsZXMvamF4cnMtdHlwZXMtaW5qZWN0aW9uL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAyNjkxMgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2pheHJzLXR5cGVzLWluamVjdGlvbi9wb20ueG1sCkBAIC0wLDAgKzEsNzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qYXhycy10eXBlcy1pbmplY3Rpb248L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktZXhhbXBsZXMtamF4cnMtdHlwZXMtaW5qZWN0aW9uPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPkplcnNleSBKQVgtUlMgdHlwZXMgaW5qZWN0aW9uIGV4YW1wbGUuPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItZ3JpenpseTItaHR0cDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1oazI8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItYnVuZGxlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHR5cGU+cG9tPC90eXBlPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGVjLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPG1haW5DbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5qYXhyc3R5cGVpbmplY3Rpb24uQXBwPC9tYWluQ2xhc3M+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5yZWxlYXNlPC9pZD4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2pheHJzLXR5cGVzLWluamVjdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2pheHJzdHlwZWluamVjdGlvbi9BcHAuamF2YSBiL2V4YW1wbGVzL2pheHJzLXR5cGVzLWluamVjdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2pheHJzdHlwZWluamVjdGlvbi9BcHAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmIyYWI2Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvamF4cnMtdHlwZXMtaW5qZWN0aW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamF4cnN0eXBlaW5qZWN0aW9uL0FwcC5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuamF4cnN0eXBlaW5qZWN0aW9uOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseTIuaHR0cHNlcnZlci5Hcml6emx5SHR0cFNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guZ3JpenpseS5odHRwLnNlcnZlci5IdHRwU2VydmVyOworCisvKioKKyAqIEplcnNleSBhcHBsaWNhdGlvbiB0aGF0IGRlbW9uc3RyYXRlcyBpbmplY3Rpb24gb2YgSkFYLVJTIGNvbXBvbmVudHMgaW50byByZXNvdXJjZXMuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEFwcCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgQkFTRV9VUkkgPSBVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvamF4cnMtdHlwZS1pbmplY3Rpb24vIik7CisgICAgLyoqCisgICAgICogUHJvZ3JhbW1hdGljIHJvb3QgcmVzb3VyY2UgcGF0aCB0ZW1wbGF0ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST09UX1BBVEhfUFJPR1JBTU1BVElDID0gInByb2dyYW1tYXRpYy97cDF9L3twMn0iOworICAgIC8qKgorICAgICAqIEFubm90YXRlZCBjbGFzcy1iYXNlZCByb290IHJlc291cmNlIHBhdGggdGVtcGxhdGUgZGVtb25zdHJhdGluZyBpbnN0YW5jZSBmaWVsZCBpbmplY3Rpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVF9QQVRIX0FOTk9UQVRFRF9JTlNUQU5DRSA9ICJhbm5vdGF0ZWQvaW5zdGFuY2Uve3AxfS97cDJ9IjsKKyAgICAvKioKKyAgICAgKiBBbm5vdGF0ZWQgY2xhc3MtYmFzZWQgcm9vdCByZXNvdXJjZSBwYXRoIHRlbXBsYXRlIGRlbW9uc3RyYXRpbmcgbWV0aG9kIGluamVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST09UX1BBVEhfQU5OT1RBVEVEX01FVEhPRCA9ICJhbm5vdGF0ZWQvbWV0aG9kL3twMX0ve3AyfSI7CisKKyAgICAvKioKKyAgICAgKiBNYWluIGFwcGxpY2F0aW9uIGVudHJ5IHBvaW50LgorICAgICAqCisgICAgICogQHBhcmFtIGFyZ3MgYXBwbGljYXRpb24gYXJndW1lbnRzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSkFYLVJTIFR5cGUgSW5qZWN0aW9uIEplcnNleSBFeGFtcGxlIEFwcCIpOworCisgICAgICAgICAgICBmaW5hbCBIdHRwU2VydmVyIHNlcnZlciA9IEdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeS5jcmVhdGVIdHRwU2VydmVyKEJBU0VfVVJJLCBjcmVhdGUoKSwgZmFsc2UpOworICAgICAgICAgICAgUnVudGltZS5nZXRSdW50aW1lKCkuYWRkU2h1dGRvd25Ib29rKG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyLnNodXRkb3duTm93KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkpOworICAgICAgICAgICAgc2VydmVyLnN0YXJ0KCk7CisKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAiQXBwbGljYXRpb24gc3RhcnRlZC4lbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJUbyB0ZXN0IGluamVjdGlvbiBpbnRvIGEgcHJvZ3JhbW1hdGljIHJlc291cmNlLCB0cnkgb3V0OiVuICAlcyVzJXMlbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJUbyB0ZXN0IGluc3RhbmNlIGluamVjdGlvbiBpbnRvIGFuIGFubm90YXRlZCByZXNvdXJjZSwgdHJ5IG91dDolbiAgJXMlcyVzJW4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiVG8gdGVzdCBtZXRob2QgaW5qZWN0aW9uIGludG8gYW4gYW5ub3RhdGVkIHJlc291cmNlLCB0cnkgb3V0OiVuICAlcyVzJXMlbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJTdG9wIHRoZSBhcHBsaWNhdGlvbiB1c2luZyBDVFJMK0MiLAorICAgICAgICAgICAgICAgICAgICBCQVNFX1VSSSwgUk9PVF9QQVRIX1BST0dSQU1NQVRJQywgIj9xMT08dmFsdWVfMT4mcTI9PHZhbHVlXzI+JnEyPTx2YWx1ZV8zPiIsCisgICAgICAgICAgICAgICAgICAgIEJBU0VfVVJJLCBST09UX1BBVEhfQU5OT1RBVEVEX0lOU1RBTkNFLCAiP3ExPTx2YWx1ZV8xPiZxMj08dmFsdWVfMj4mcTI9PHZhbHVlXzM+IiwKKyAgICAgICAgICAgICAgICAgICAgQkFTRV9VUkksIFJPT1RfUEFUSF9BTk5PVEFURURfTUVUSE9ELCAiP3ExPTx2YWx1ZV8xPiZxMj08dmFsdWVfMj4mcTI9PHZhbHVlXzM+IikpOworCisgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gfCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihBcHAuY2xhc3MuZ2V0TmFtZSgpKS5sb2coTGV2ZWwuU0VWRVJFLCBudWxsLCBleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgZXhhbXBsZSBhcHBsaWNhdGlvbiByZXNvdXJjZSBjb25maWd1cmF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBpbml0aWFsaXplZCByZXNvdXJjZSBjb25maWd1cmF0aW9uIG9mIHRoZSBleGFtcGxlIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VDb25maWcgY3JlYXRlKCkgeworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhKYXhyc0luamVjdGlvblJlcG9ydGluZ1Jlc291cmNlLmNsYXNzKTsKKyAgICAgICAgZmluYWwgUmVzb3VyY2UuQnVpbGRlciByZXNvdXJjZUJ1aWxkZXIgPSBSZXNvdXJjZS5idWlsZGVyKFJPT1RfUEFUSF9QUk9HUkFNTUFUSUMpOworICAgICAgICByZXNvdXJjZUJ1aWxkZXIuYWRkTWV0aG9kKCJHRVQiKS5oYW5kbGVkQnkoSmF4cnNJbmplY3Rpb25SZXBvcnRpbmdJbmZsZWN0b3IuY2xhc3MpOworCisgICAgICAgIHJldHVybiByZXNvdXJjZUNvbmZpZy5yZWdpc3RlclJlc291cmNlcyhyZXNvdXJjZUJ1aWxkZXIuYnVpbGQoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvamF4cnMtdHlwZXMtaW5qZWN0aW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamF4cnN0eXBlaW5qZWN0aW9uL0pheHJzSW5qZWN0aW9uUmVwb3J0aW5nSW5mbGVjdG9yLmphdmEgYi9leGFtcGxlcy9qYXhycy10eXBlcy1pbmplY3Rpb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qYXhyc3R5cGVpbmplY3Rpb24vSmF4cnNJbmplY3Rpb25SZXBvcnRpbmdJbmZsZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzdhYjhmCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvamF4cnMtdHlwZXMtaW5qZWN0aW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamF4cnN0eXBlaW5qZWN0aW9uL0pheHJzSW5qZWN0aW9uUmVwb3J0aW5nSW5mbGVjdG9yLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5qYXhyc3R5cGVpbmplY3Rpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlBhdGhTZWdtZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVxdWVzdDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuSW5mbGVjdG9yOworCisvKioKKyAqIFByb2dyYW1tYXRpYyByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitjbGFzcyBKYXhyc0luamVjdGlvblJlcG9ydGluZ0luZmxlY3RvciBpbXBsZW1lbnRzIEluZmxlY3RvcjxSZXF1ZXN0LCBSZXNwb25zZT4geworCisgICAgQEluamVjdAorICAgIEh0dHBIZWFkZXJzIGh0dHBIZWFkZXJzOworICAgIEBJbmplY3QKKyAgICBVcmlJbmZvIHVyaUluZm87CisgICAgQFBhdGhQYXJhbSh2YWx1ZSA9ICJwMSIpCisgICAgU3RyaW5nIHAxOworICAgIHByaXZhdGUgUGF0aFNlZ21lbnQgcDI7CisKKyAgICBAUGF0aFBhcmFtKHZhbHVlID0gInAyIikKKyAgICBwdWJsaWMgdm9pZCBzZXRQMihQYXRoU2VnbWVudCBwMikgeworICAgICAgICB0aGlzLnAyID0gcDI7CisgICAgfQorICAgIEBRdWVyeVBhcmFtKHZhbHVlID0gInExIikKKyAgICBwcml2YXRlIGludCBxMTsKKyAgICBAUXVlcnlQYXJhbSh2YWx1ZSA9ICJxMiIpCisgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gcTI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzcG9uc2UgYXBwbHkoUmVxdWVzdCBkYXRhKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBSZXBvcnRCdWlsZGVyLmFwcGVuZCgKKyAgICAgICAgICAgICAgICBuZXcgU3RyaW5nQnVpbGRlcigiSW5qZWN0ZWQgaW5mb3JtYXRpb246XG4iKSwgdXJpSW5mbywgaHR0cEhlYWRlcnMpOworICAgICAgICBzYi5hcHBlbmQoIlxuIFVSSSBjb21wb25lbnQgaW5qZWN0aW9uOiIpOworICAgICAgICBzYi5hcHBlbmQoIlxuICAgU3RyaW5nIHBhdGggcGFyYW0gcDE9IikuYXBwZW5kKHAxKTsKKyAgICAgICAgc2IuYXBwZW5kKCJcbiAgIFBhdGhTZWdtZW50IHBhdGggcGFyYW0gcDI9IikuYXBwZW5kKHAyKTsKKyAgICAgICAgc2IuYXBwZW5kKCJcbiAgIGludCBxdWVyeSBwYXJhbSBxMT0iKS5hcHBlbmQocTEpOworICAgICAgICBzYi5hcHBlbmQoIlxuICAgTGlzdDxTdHJpbmc+IHF1ZXJ5IHBhcmFtIHEyPSIpLmFwcGVuZChxMik7CisgICAgICAgIHJldHVybiBSZXNwb25zZS5vayhzYi50b1N0cmluZygpLCBNZWRpYVR5cGUuVEVYVF9QTEFJTikuYnVpbGQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9qYXhycy10eXBlcy1pbmplY3Rpb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qYXhyc3R5cGVpbmplY3Rpb24vSmF4cnNJbmplY3Rpb25SZXBvcnRpbmdSZXNvdXJjZS5qYXZhIGIvZXhhbXBsZXMvamF4cnMtdHlwZXMtaW5qZWN0aW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamF4cnN0eXBlaW5qZWN0aW9uL0pheHJzSW5qZWN0aW9uUmVwb3J0aW5nUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2YwM2Q5Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvamF4cnMtdHlwZXMtaW5qZWN0aW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamF4cnN0eXBlaW5qZWN0aW9uL0pheHJzSW5qZWN0aW9uUmVwb3J0aW5nUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmpheHJzdHlwZWluamVjdGlvbjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5QYXRoU2VnbWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CisKKy8qKgorICogQW5ub3RhdGVkIHJlc291cmNlLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJhbm5vdGF0ZWQiKQorcHVibGljIGNsYXNzIEpheHJzSW5qZWN0aW9uUmVwb3J0aW5nUmVzb3VyY2UgeworCisgICAgQENvbnRleHQKKyAgICBIdHRwSGVhZGVycyBodHRwSGVhZGVyczsKKyAgICBAQ29udGV4dAorICAgIFVyaUluZm8gdXJpSW5mbzsKKyAgICBAUGF0aFBhcmFtKHZhbHVlID0gInAxIikKKyAgICBTdHJpbmcgcDE7CisgICAgcHJpdmF0ZSBQYXRoU2VnbWVudCBwMjsKKworICAgIEBQYXRoUGFyYW0odmFsdWUgPSAicDIiKQorICAgIHB1YmxpYyB2b2lkIHNldFAyKFBhdGhTZWdtZW50IHAyKSB7CisgICAgICAgIHRoaXMucDIgPSBwMjsKKyAgICB9CisKKyAgICBAUXVlcnlQYXJhbSh2YWx1ZSA9ICJxMSIpCisgICAgcHJpdmF0ZSBpbnQgcTE7CisgICAgQFF1ZXJ5UGFyYW0odmFsdWUgPSAicTIiKQorICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IHEyOworCisgICAgQEdFVAorICAgIEBQYXRoKCJtZXRob2Qve3AxfS97cDJ9IikKKyAgICBwdWJsaWMgU3RyaW5nIGRvR2V0KAorICAgICAgICAgICAgQENvbnRleHQgSHR0cEhlYWRlcnMgaHR0cEhlYWRlcnMsCisgICAgICAgICAgICBAQ29udGV4dCBVcmlJbmZvIHVyaUluZm8sCisgICAgICAgICAgICBAUGF0aFBhcmFtKHZhbHVlID0gInAxIikgU3RyaW5nIHAxLAorICAgICAgICAgICAgQFBhdGhQYXJhbSh2YWx1ZSA9ICJwMiIpIFBhdGhTZWdtZW50IHAyLAorICAgICAgICAgICAgQFF1ZXJ5UGFyYW0odmFsdWUgPSAicTEiKSBpbnQgcTEsCisgICAgICAgICAgICBAUXVlcnlQYXJhbSh2YWx1ZSA9ICJxMiIpIExpc3Q8U3RyaW5nPiBxMikgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gUmVwb3J0QnVpbGRlci5hcHBlbmQoCisgICAgICAgICAgICAgICAgbmV3IFN0cmluZ0J1aWxkZXIoIkluamVjdGVkIGluZm9ybWF0aW9uOlxuIiksIHVyaUluZm8sIGh0dHBIZWFkZXJzKTsKKyAgICAgICAgc2IuYXBwZW5kKCJcbiBVUkkgY29tcG9uZW50IGluamVjdGlvbjoiKTsKKyAgICAgICAgc2IuYXBwZW5kKCJcbiAgIFN0cmluZyBwYXRoIHBhcmFtIHAxPSIpLmFwcGVuZChwMSk7CisgICAgICAgIHNiLmFwcGVuZCgiXG4gICBQYXRoU2VnbWVudCBwYXRoIHBhcmFtIHAyPSIpLmFwcGVuZChwMik7CisgICAgICAgIHNiLmFwcGVuZCgiXG4gICBpbnQgcXVlcnkgcGFyYW0gcTE9IikuYXBwZW5kKHExKTsKKyAgICAgICAgc2IuYXBwZW5kKCJcbiAgIExpc3Q8U3RyaW5nPiBxdWVyeSBwYXJhbSBxMj0iKS5hcHBlbmQocTIpOworICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImluc3RhbmNlL3twMX0ve3AyfSIpCisgICAgcHVibGljIFN0cmluZyBkb0dldCgpIHsKKyAgICAgICAgcmV0dXJuIGRvR2V0KGh0dHBIZWFkZXJzLCB1cmlJbmZvLCBwMSwgcDIsIHExLCBxMik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvamF4cnMtdHlwZXMtaW5qZWN0aW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamF4cnN0eXBlaW5qZWN0aW9uL1JlcG9ydEJ1aWxkZXIuamF2YSBiL2V4YW1wbGVzL2pheHJzLXR5cGVzLWluamVjdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2pheHJzdHlwZWluamVjdGlvbi9SZXBvcnRCdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNhZmEyNgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2pheHJzLXR5cGVzLWluamVjdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2pheHJzdHlwZWluamVjdGlvbi9SZXBvcnRCdWlsZGVyLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5qYXhyc3R5cGVpbmplY3Rpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CisKKy8qKgorICogUHJvdmlkZXMgZnVuY3Rpb25hbGl0eSBmb3IgYXBwZW5kaW5nIHZhbHVlcyBvZiBKQVgtUlMgdHlwZXMgdG8gYSBzdHJpbmctYmFzZWQKKyAqIHJlcG9ydC4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitjbGFzcyBSZXBvcnRCdWlsZGVyIHsKKworICAgIHByaXZhdGUgUmVwb3J0QnVpbGRlcigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZ0J1aWxkZXIgYXBwZW5kKFN0cmluZ0J1aWxkZXIgc2IsIFVyaUluZm8gdXJpSW5mbywgSHR0cEhlYWRlcnMgaHR0cEhlYWRlcnMpIHsKKyAgICAgICAgc2IuYXBwZW5kKCJcbiBVcmlJbmZvOiIpOworICAgICAgICBzYi5hcHBlbmQoIlxuICAgQWJzb2x1dGUgcGF0aCA6ICIpLmFwcGVuZCh1cmlJbmZvLmdldEFic29sdXRlUGF0aCgpKTsKKyAgICAgICAgc2IuYXBwZW5kKCJcbiAgIEJhc2UgVVJJIDogIikuYXBwZW5kKHVyaUluZm8uZ2V0QmFzZVVyaSgpKTsKKyAgICAgICAgc2IuYXBwZW5kKCJcbiAgIE1hdGhjZWQgcmVzb3VyY2VzIDogIikuYXBwZW5kKHVyaUluZm8uZ2V0TWF0Y2hlZFJlc291cmNlcygpLnRvU3RyaW5nKCkpOworICAgICAgICBzYi5hcHBlbmQoIlxuICAgTWF0Y2hlZCBVUklzIDogIikuYXBwZW5kKHVyaUluZm8uZ2V0TWF0Y2hlZFVSSXMoKS50b1N0cmluZygpKTsKKyAgICAgICAgc2IuYXBwZW5kKCJcbiAgIFBhdGggOiAiKS5hcHBlbmQodXJpSW5mby5nZXRQYXRoKCkpOworICAgICAgICBzYi5hcHBlbmQoIlxuICAgUGF0aCBwYXJhbWV0ZXJzOlxuIik7CisgICAgICAgIGR1bXBNdWx0aXZhbHVlZE1hcChzYiwgdXJpSW5mby5nZXRQYXRoUGFyYW1ldGVycygpKTsKKyAgICAgICAgc2IuYXBwZW5kKCIgICBQYXRoIHNlZ21lbnRzIDogIikuYXBwZW5kKHVyaUluZm8uZ2V0UGF0aFNlZ21lbnRzKCkudG9TdHJpbmcoKSk7CisgICAgICAgIHNiLmFwcGVuZCgiXG4gICBRdWVyeSBwYXJhbWV0ZXJzOlxuIik7CisgICAgICAgIGR1bXBNdWx0aXZhbHVlZE1hcChzYiwgdXJpSW5mby5nZXRRdWVyeVBhcmFtZXRlcnMoKSk7CisgICAgICAgIHNiLmFwcGVuZCgiICAgUmVxdWVzdCBVUkkgOiAiKS5hcHBlbmQodXJpSW5mby5nZXRSZXF1ZXN0VXJpKCkpOworICAgICAgICBzYi5hcHBlbmQoIlxuXG4gSHR0cEhlYWRlcnM6XG4iKTsKKyAgICAgICAgZHVtcE11bHRpdmFsdWVkTWFwKHNiLCBodHRwSGVhZGVycy5nZXRSZXF1ZXN0SGVhZGVycygpKTsKKyAgICAgICAgcmV0dXJuIHNiOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBkdW1wTXVsdGl2YWx1ZWRNYXAoU3RyaW5nQnVpbGRlciBzYiwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCkgeworICAgICAgICBpZiAobWFwID09IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICAgICBbIG51bGwgXVxuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGhlYWRlckVudHJ5IDogbWFwLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiICAgICAiKS5hcHBlbmQoaGVhZGVyRW50cnkuZ2V0S2V5KCkpLmFwcGVuZCgiIDogIik7CisgICAgICAgICAgICBmaW5hbCBJdGVyYXRvcjxTdHJpbmc+IHZhbHVlSXRlcmF0b3IgPSBoZWFkZXJFbnRyeS5nZXRWYWx1ZSgpLml0ZXJhdG9yKCk7CisgICAgICAgICAgICBzYi5hcHBlbmQodmFsdWVJdGVyYXRvci5uZXh0KCkpOworICAgICAgICAgICAgd2hpbGUgKHZhbHVlSXRlcmF0b3IuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIsICIpLmFwcGVuZCh2YWx1ZUl0ZXJhdG9yLm5leHQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYi5hcHBlbmQoJ1xuJyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9qYXhycy10eXBlcy1pbmplY3Rpb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qYXhyc3R5cGVpbmplY3Rpb24vSmF4cnNUeXBlSW5qZWN0aW9uVGVzdC5qYXZhIGIvZXhhbXBsZXMvamF4cnMtdHlwZXMtaW5qZWN0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamF4cnN0eXBlaW5qZWN0aW9uL0pheHJzVHlwZUluamVjdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWU4N2UxCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvamF4cnMtdHlwZXMtaW5qZWN0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamF4cnN0eXBlaW5qZWN0aW9uL0pheHJzVHlwZUluamVjdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5qYXhyc3R5cGVpbmplY3Rpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworcHVibGljIGNsYXNzIEpheHJzVHlwZUluamVjdGlvblRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBBcHAuY3JlYXRlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmdbXSBleHBlY3RlZEZyYWdtZW50c1Byb2dyYW1tYXRpYyA9IG5ldyBTdHJpbmdbXXsKKyAgICAgICAgICAgIC8vIFVyaUluZm8KKyAgICAgICAgICAgICJBYnNvbHV0ZSBwYXRoIDogIiArIHRoaXMuZ2V0QmFzZVVyaSgpICsgInByb2dyYW1tYXRpYy92MS92MiIsCisgICAgICAgICAgICAiQmFzZSBVUkkgOiAiICsgdGhpcy5nZXRCYXNlVXJpKCksCisgICAgICAgICAgICAiUGF0aCA6IHByb2dyYW1tYXRpYy92MS92MiIsCisgICAgICAgICAgICAiUGF0aCBzZWdtZW50cyA6IFtwcm9ncmFtbWF0aWMsIHYxLCB2Ml0iLAorICAgICAgICAgICAgInAxIDogdjEiLCAicDIgOiB2MiIsIC8vIHBhdGggcGFyYW1zCisgICAgICAgICAgICAicTEgOiAxIiwgInEyIDogdjIsIHYzIiwgLy8gcXVlcnkgcGFyYW1zCisgICAgICAgICAgICAiUmVxdWVzdCBVUkkgOiAiICsgdGhpcy5nZXRCYXNlVXJpKCkgKyAicHJvZ3JhbW1hdGljL3YxL3YyP3ExPTEmcTI9djImcTI9djMiLAorICAgICAgICAgICAgLy8gUmVxdWVzdEhlYWRlcnMvSHR0cEhlYWRlcnMKKyAgICAgICAgICAgICJBY2NlcHQgOiB0ZXh0L3BsYWluIiwKKyAgICAgICAgICAgIC8vIEluamVjdGVkIFBhcmFtZXRlcnMKKyAgICAgICAgICAgICJTdHJpbmcgcGF0aCBwYXJhbSBwMT12MSIsCisgICAgICAgICAgICAiUGF0aFNlZ21lbnQgcGF0aCBwYXJhbSBwMj12MiIsCisgICAgICAgICAgICAiaW50IHF1ZXJ5IHBhcmFtIHExPTEiLAorICAgICAgICAgICAgIkxpc3Q8U3RyaW5nPiBxdWVyeSBwYXJhbSBxMj1bdjIsIHYzXSIKKyAgICB9OworICAgIHByaXZhdGUgU3RyaW5nW10gZXhwZWN0ZWRGcmFnbWVudHNBbm5vdGF0ZWRJbnN0YW5jZSA9IG5ldyBTdHJpbmdbXXsKKyAgICAgICAgICAgIC8vIFVyaUluZm8KKyAgICAgICAgICAgICJBYnNvbHV0ZSBwYXRoIDogIiArIHRoaXMuZ2V0QmFzZVVyaSgpICsgImFubm90YXRlZC9pbnN0YW5jZS92MS92MiIsCisgICAgICAgICAgICAiQmFzZSBVUkkgOiAiICsgdGhpcy5nZXRCYXNlVXJpKCksCisgICAgICAgICAgICAiUGF0aCA6IGFubm90YXRlZC9pbnN0YW5jZS92MS92MiIsCisgICAgICAgICAgICAiUGF0aCBzZWdtZW50cyA6IFthbm5vdGF0ZWQsIGluc3RhbmNlLCB2MSwgdjJdIiwKKyAgICAgICAgICAgICJwMSA6IHYxIiwgInAyIDogdjIiLCAvLyBwYXRoIHBhcmFtcworICAgICAgICAgICAgInExIDogMSIsICJxMiA6IHYyLCB2MyIsIC8vIHF1ZXJ5IHBhcmFtcworICAgICAgICAgICAgIlJlcXVlc3QgVVJJIDogIiArIHRoaXMuZ2V0QmFzZVVyaSgpICsgImFubm90YXRlZC9pbnN0YW5jZS92MS92Mj9xMT0xJnEyPXYyJnEyPXYzIiwKKyAgICAgICAgICAgIC8vIFJlcXVlc3RIZWFkZXJzL0h0dHBIZWFkZXJzCisgICAgICAgICAgICAiQWNjZXB0IDogdGV4dC9wbGFpbiIsCisgICAgICAgICAgICAvLyBJbmplY3RlZCBQYXJhbWV0ZXJzCisgICAgICAgICAgICAiU3RyaW5nIHBhdGggcGFyYW0gcDE9djEiLAorICAgICAgICAgICAgIlBhdGhTZWdtZW50IHBhdGggcGFyYW0gcDI9djIiLAorICAgICAgICAgICAgImludCBxdWVyeSBwYXJhbSBxMT0xIiwKKyAgICAgICAgICAgICJMaXN0PFN0cmluZz4gcXVlcnkgcGFyYW0gcTI9W3YyLCB2M10iCisgICAgfTsKKyAgICBwcml2YXRlIFN0cmluZ1tdIGV4cGVjdGVkRnJhZ21lbnRzQW5ub3RhdGVkTWV0aG9kID0gbmV3IFN0cmluZ1tdeworICAgICAgICAgICAgLy8gVXJpSW5mbworICAgICAgICAgICAgIkFic29sdXRlIHBhdGggOiAiICsgdGhpcy5nZXRCYXNlVXJpKCkgKyAiYW5ub3RhdGVkL21ldGhvZC92MS92MiIsCisgICAgICAgICAgICAiQmFzZSBVUkkgOiAiICsgdGhpcy5nZXRCYXNlVXJpKCksCisgICAgICAgICAgICAiUGF0aCA6IGFubm90YXRlZC9tZXRob2QvdjEvdjIiLAorICAgICAgICAgICAgIlBhdGggc2VnbWVudHMgOiBbYW5ub3RhdGVkLCBtZXRob2QsIHYxLCB2Ml0iLAorICAgICAgICAgICAgInAxIDogdjEiLCAicDIgOiB2MiIsIC8vIHBhdGggcGFyYW1zCisgICAgICAgICAgICAicTEgOiAxIiwgInEyIDogdjIsIHYzIiwgLy8gcXVlcnkgcGFyYW1zCisgICAgICAgICAgICAiUmVxdWVzdCBVUkkgOiAiICsgdGhpcy5nZXRCYXNlVXJpKCkgKyAiYW5ub3RhdGVkL21ldGhvZC92MS92Mj9xMT0xJnEyPXYyJnEyPXYzIiwKKyAgICAgICAgICAgIC8vIFJlcXVlc3RIZWFkZXJzL0h0dHBIZWFkZXJzCisgICAgICAgICAgICAiQWNjZXB0IDogdGV4dC9wbGFpbiIsCisgICAgICAgICAgICAvLyBJbmplY3RlZCBQYXJhbWV0ZXJzCisgICAgICAgICAgICAiU3RyaW5nIHBhdGggcGFyYW0gcDE9djEiLAorICAgICAgICAgICAgIlBhdGhTZWdtZW50IHBhdGggcGFyYW0gcDI9djIiLAorICAgICAgICAgICAgImludCBxdWVyeSBwYXJhbSBxMT0xIiwKKyAgICAgICAgICAgICJMaXN0PFN0cmluZz4gcXVlcnkgcGFyYW0gcTI9W3YyLCB2M10iCisgICAgfTsKKworICAgIHByaXZhdGUgV2ViVGFyZ2V0IHByZXBhcmVUYXJnZXQoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpOworICAgICAgICB0YXJnZXQucmVnaXN0ZXIoTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpOworICAgICAgICByZXR1cm4gdGFyZ2V0LnBhdGgocGF0aCkucmVzb2x2ZVRlbXBsYXRlKCJwMSIsICJ2MSIpLnJlc29sdmVUZW1wbGF0ZSgicDIiLAorICAgICAgICAgICAgICAgICJ2MiIpLnF1ZXJ5UGFyYW0oInExIiwgMSkucXVlcnlQYXJhbSgicTIiLCAidjIiKS5xdWVyeVBhcmFtKCJxMiIsICJ2MyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByb2dyYW1tYXRpY0FwcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgcmVzcG9uc2VFbnRpdHkgPSBwcmVwYXJlVGFyZ2V0KEFwcC5ST09UX1BBVEhfUFJPR1JBTU1BVElDKS5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikuZ2V0KFN0cmluZy5jbGFzcykKKyAgICAgICAgICAgICAgICAudG9Mb3dlckNhc2UoKTsKKworICAgICAgICBmb3IgKFN0cmluZyBleHBlY3RlZEZyYWdtZW50IDogZXhwZWN0ZWRGcmFnbWVudHNQcm9ncmFtbWF0aWMpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkIGZyYWdtZW50ICciICsgZXhwZWN0ZWRGcmFnbWVudCArICInIG5vdCBmb3VuZCBpbiByZXNwb25zZTpcbiIgKyByZXNwb25zZUVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgLy8gaHR0cCBoZWFkZXIgZmllbGQgbmFtZXMgYXJlIGNhc2UgaW5zZW5zaXRpdmUKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VFbnRpdHkuY29udGFpbnMoZXhwZWN0ZWRGcmFnbWVudC50b0xvd2VyQ2FzZSgpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0ZWRJbnN0YW5jZUFwcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgcmVzcG9uc2VFbnRpdHkgPSBwcmVwYXJlVGFyZ2V0KEFwcC5ST09UX1BBVEhfQU5OT1RBVEVEX0lOU1RBTkNFKS5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikuZ2V0KFN0cmluZy5jbGFzcykKKyAgICAgICAgICAgICAgICAudG9Mb3dlckNhc2UoKTsKKworICAgICAgICBmb3IgKFN0cmluZyBleHBlY3RlZEZyYWdtZW50IDogZXhwZWN0ZWRGcmFnbWVudHNBbm5vdGF0ZWRJbnN0YW5jZSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgZnJhZ21lbnQgJyIgKyBleHBlY3RlZEZyYWdtZW50ICsgIicgbm90IGZvdW5kIGluIHJlc3BvbnNlOlxuIiArIHJlc3BvbnNlRW50aXR5LAorICAgICAgICAgICAgICAgICAgICAvLyBodHRwIGhlYWRlciBmaWVsZCBuYW1lcyBhcmUgY2FzZSBpbnNlbnNpdGl2ZQorICAgICAgICAgICAgICAgICAgICByZXNwb25zZUVudGl0eS5jb250YWlucyhleHBlY3RlZEZyYWdtZW50LnRvTG93ZXJDYXNlKCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFubm90YXRlZE1ldGhvZEFwcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgcmVzcG9uc2VFbnRpdHkgPSBwcmVwYXJlVGFyZ2V0KEFwcC5ST09UX1BBVEhfQU5OT1RBVEVEX01FVEhPRCkucmVxdWVzdCgidGV4dC9wbGFpbiIpLmdldChTdHJpbmcuY2xhc3MpCisgICAgICAgICAgICAgICAgLnRvTG93ZXJDYXNlKCk7CisKKyAgICAgICAgZm9yIChTdHJpbmcgZXhwZWN0ZWRGcmFnbWVudCA6IGV4cGVjdGVkRnJhZ21lbnRzQW5ub3RhdGVkTWV0aG9kKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCBmcmFnbWVudCAnIiArIGV4cGVjdGVkRnJhZ21lbnQgKyAiJyBub3QgZm91bmQgaW4gcmVzcG9uc2U6XG4iICsgcmVzcG9uc2VFbnRpdHksCisgICAgICAgICAgICAgICAgICAgIC8vIGh0dHAgaGVhZGVyIGZpZWxkIG5hbWVzIGFyZSBjYXNlIGluc2Vuc2l0aXZlCisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlRW50aXR5LmNvbnRhaW5zKGV4cGVjdGVkRnJhZ21lbnQudG9Mb3dlckNhc2UoKSkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvamVyc2V5LWVqYi9SRUFETUUuTUQgYi9leGFtcGxlcy9qZXJzZXktZWpiL1JFQURNRS5NRApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTlhOWE2Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvamVyc2V5LWVqYi9SRUFETUUuTUQKQEAgLTAsMCArMSw0NCBAQAorWy8vXTogIyAiIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAiCitbLy9dOiAjICIgIgorWy8vXTogIyAiIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAiCitbLy9dOiAjICIgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQgIgorWy8vXTogIyAiIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4gIgorWy8vXTogIyAiICIKK1svL106ICMgIiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlICIKKworSmVyc2V5IEVKQiBFeGFtcGxlCis9PT09PT09PT09PT09PT09PT0KKworVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gZGV2ZWxvcCBSRVNUZnVsIHdlYiBzZXJ2aWNlIHdpdGggYSBTZXJ2bGV0IDMuMCBhbmQgRUpCIDMuMSBjb250YWluZXIuCisKK0NvbnRlbnRzCistLS0tLS0tLQorCitUaGUgbWFwcGluZyBvZiB0aGUgVVJJIHBhdGggc3BhY2UgaXMgcHJlc2VudGVkIGluIHRoZSBmb2xsb3dpbmcgdGFibGU6CisKK1VSSSBwYXRoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJlc291cmNlIGNsYXNzICAgICAgICAgICAgIHwgSFRUUCBtZXRob2RzICAgfCBEZXNjcmlwdGlvbgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKipfL2plcnNleS1lamJfKiogICAgICAgICAgICAgICAgICAgICAgIHwgLS0tICAgICAgICAgICAgICAgICAgICAgICAgfCBHRVQgICAgICAgICAgICB8IFNpbXBsZSBodG1sL2FqYXggY2xpZW50CisqKl8vamVyc2V5LWVqYi9hcHAvbWVzc2FnZXNfKiogICAgICAgICAgfCBNZXNzYWdlQm9hcmRSZXNvdXJjZUJlYW4gICB8IEdFVCAgICAgICAgICAgIHwgUmV0dXJucyBmaXJzdCB0ZW4gbWVzc3NhZ2VzCisqKl8vamVyc2V5LWVqYi9hcHAvbWVzc2FnZXMve2lkfV8qKiAgICAgfCBNZXNzYWdlQm9hcmRSZXNvdXJjZUJlYW4gICB8IEdFVCAgICAgICAgICAgIHwgUmV0dXJucyBtZXNzYWdlIHdpdGggdW5pcXVlSWQgPSB7aWR9IG9yIHJldHVybnMgSFRUUCA0MDQgaWYgbWVzc2FnZSBkb2VzIG5vdCBleGlzdAorKipfL2plcnNleS1lamIvYXBwL21lc3NhZ2VzL3tpZH1fKiogICAgIHwgTWVzc2FnZUJvYXJkUmVzb3VyY2VCZWFuICAgfCBERUxFVEUgICAgICAgICB8IERlbGV0ZXMgbWVzc2FnZSB3aXRoIHVuaXF1ZUlkID0ge2lkfSBvciByZXR1cm5zIEhUVFAgNDA0IGlmIG1lc3NhZ2UgZG9lcyBub3QgZXhpc3QKKyoqXy9qZXJzZXktZWpiL2FwcC9tZXNzYWdlcy9fKiogICAgICAgICB8IE1lc3NhZ2VCb2FyZFJlc291cmNlQmVhbiAgIHwgUE9TVCAgICAgICAgICAgfCBDcmVhdGVzIG5ldyBtZXNzYWdlIGFuZCBhbGxvY2F0ZXMgdW5pcXVlIGlkIGZvciBpdCAod2l0aCBtZXNzYWdlIGFzIHJlcXVlc3QgZW50aXR5KQorCitSdW5uaW5nIHRoZSBFeGFtcGxlCistLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoaXMgc2FtcGxlIHV0aWxpemVzIEphdmEgRUUgZmVhdHVyZXMgaW4gdGhlIEdsYXNzRmlzaCBjb250YWluZXIKKworQnVpbGQgdGhlIGFwcGxpY2F0aW9uIFdBUiBmaWxlIGJ5IGV4ZWN1dGluZyBtYXZlbiAyIGZyb20gdGhlIHByb2plY3QgZGlyZWN0b3J5OgorCis+ICAgICBtdm4gY2xlYW4gcGFja2FnZQorCitUbyBkZXBsb3kgb24gYSBydW5uaW5nIEdsYXNzRmlzaCBjb250YWluZXIsIHlvdSB3b3VsZCB0aGVuIHR5cGljYWxseSBuZWVkIHRvIGxhdW5jaDoKKworPiAgICAgJEFTX0hPTUUvYmluL2FzYWRtaW4gZGVwbG95IHRhcmdldC9qZXJzZXktZWpiLndhcgorCitBbm90aGVyIG9wdGlvbiBpcyB0byBkZXBsb3kgdXNpbmcgW0dsYXNzRmlzaCBhZG1pbmlzdHJhdG9yIGNvbnNvbGUgR1VJXShodHRwOi8vbG9jYWxob3N0OjQ4NDgvKQorCitZb3UgY2FuIGFjY2VzcyB0aGUgYXBwbGljYXRpb24gYXQ6CisKKy0gICA8aHR0cDovL2xvY2FsaG9zdDo4MDgwL2plcnNleS1lamI+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9qZXJzZXktZWpiL3BvbS54bWwgYi9leGFtcGxlcy9qZXJzZXktZWpiL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE2MjgxNwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2plcnNleS1lamIvcG9tLnhtbApAQCAtMCwwICsxLDk4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorCisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPndlYmFwcC1leGFtcGxlLXBhcmVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi93ZWJhcHAtZXhhbXBsZS1wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LWVqYjwvYXJ0aWZhY3RJZD4KKyAgICA8bmFtZT5qZXJzZXktZXhhbXBsZXMtZWpiPC9uYW1lPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lamI8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5lamItYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1oazI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+cnVuLWV4dGVybmFsLXRlc3RzPC9pZD4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIuZmFjdG9yeT4ke2V4dGVybmFsLmNvbnRhaW5lci5mYWN0b3J5fTwvamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5mYWN0b3J5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0PiR7ZXh0ZXJuYWwuY29udGFpbmVyLnBvcnR9PC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgIDwhLS0gRXh0ZXJuYWwgdGVzdCBjb250YWluZXIgY29uZmlndXJhdGlvbiBpcyBkb25lIHZpYSBwcm9wZXJ0aWVzIHRvIGFsbG93IG92ZXJyaWRpbmcgdmlhIGNvbW1hbmQgbGluZS4gLS0+CisgICAgICAgICAgICAgICAgPGV4dGVybmFsLmNvbnRhaW5lci5mYWN0b3J5Pm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTwvZXh0ZXJuYWwuY29udGFpbmVyLmZhY3Rvcnk+CisgICAgICAgICAgICAgICAgPGV4dGVybmFsLmNvbnRhaW5lci5wb3J0PjgwODA8L2V4dGVybmFsLmNvbnRhaW5lci5wb3J0PgorICAgICAgICAgICAgICAgIDxtYXZlbi50ZXN0LnNraXA+ZmFsc2U8L21hdmVuLnRlc3Quc2tpcD4KKyAgICAgICAgICAgIDwvcHJvcGVydGllcz4KKyAgICAgICAgPC9wcm9maWxlPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5yZWxlYXNlPC9pZD4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+eG1sLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNraXA+dHJ1ZTwvc2tpcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPG1hdmVuLnRlc3Quc2tpcD50cnVlPC9tYXZlbi50ZXN0LnNraXA+CisgICAgPC9wcm9wZXJ0aWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvamVyc2V5LWVqYi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2plcnNleV9lamIvZW50aXRpZXMvTWVzc2FnZS5qYXZhIGIvZXhhbXBsZXMvamVyc2V5LWVqYi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2plcnNleV9lamIvZW50aXRpZXMvTWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZWE5NTQKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9qZXJzZXktZWpiL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamVyc2V5X2VqYi9lbnRpdGllcy9NZXNzYWdlLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5qZXJzZXlfZWpiLmVudGl0aWVzOworCitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKKy8qKgorICogTWVzc2FnZSBiZWFuIHJlcHJlc2VudGluZyBhIHNpbmdsZSBtZXNzYWdlLgorICoKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBNZXNzYWdlIHsKKworICAgIHByaXZhdGUgRGF0ZSBjcmVhdGVkOworICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2U7CisgICAgcHJpdmF0ZSBpbnQgdW5pcXVlSWQ7CisKKyAgICBwdWJsaWMgTWVzc2FnZShEYXRlIGNyZWF0ZWQsIFN0cmluZyBtZXNzYWdlLCBpbnQgdW5pcXVlSWQpIHsKKyAgICAgICAgdGhpcy5jcmVhdGVkID0gY3JlYXRlZDsKKyAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICAgICAgdGhpcy51bmlxdWVJZCA9IHVuaXF1ZUlkOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0VW5pcXVlSWQoKSB7CisgICAgICAgIHJldHVybiB1bmlxdWVJZDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIjxzcGFuIGNsYXNzPSdjcmVhdGVkJz5DUkVBVEVEOiAiICsgY3JlYXRlZCArICI8L3NwYW4+IDxzcGFuIGNsYXNzPSd1bmlxdWVJZCc+SUQ6ICIgKyB1bmlxdWVJZAorICAgICAgICAgICAgICAgICsgIjwvc3Bhbj4gPHNwYW4gY2xhc3M9J21lc3NhZ2UnPk1FU1NBR0U6ICIgKyBtZXNzYWdlICsgIjwvc3Bhbj4iOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2plcnNleS1lamIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qZXJzZXlfZWpiL2VudGl0aWVzL01lc3NhZ2VMaXN0V3JpdGVyLmphdmEgYi9leGFtcGxlcy9qZXJzZXktZWpiL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamVyc2V5X2VqYi9lbnRpdGllcy9NZXNzYWdlTGlzdFdyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZWVmNjgKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9qZXJzZXktZWpiL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamVyc2V5X2VqYi9lbnRpdGllcy9NZXNzYWdlTGlzdFdyaXRlci5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuamVyc2V5X2VqYi5lbnRpdGllczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5QYXJhbWV0ZXJpemVkVHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgamF2YXguZWpiLlN0YXRlbGVzczsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuTWVzc2FnZVV0aWxzOworCisvKioKKyAqIEEgc2ltcGxlIEhUTUwgbWVzc2FnZSBib2R5IHdyaXRlciB0byBzZXJpYWxpemUgbGlzdCBvZiBtZXNzYWdlIGJlYW5zLgorICoKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTdGF0ZWxlc3MKK0BQcm92aWRlcgorcHVibGljIGNsYXNzIE1lc3NhZ2VMaXN0V3JpdGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8TGlzdDxNZXNzYWdlPj4geworCisgICAgQENvbnRleHQKKyAgICBwcml2YXRlIGphdmF4LmluamVjdC5Qcm92aWRlcjxVcmlJbmZvPiB1aTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKGZpbmFsIENsYXNzPD8+IGNsYXp6LCBmaW5hbCBUeXBlIHR5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9uLCBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiB2ZXJpZnlHZW5lcmljVHlwZSh0eXBlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gdmVyaWZ5R2VuZXJpY1R5cGUoZmluYWwgVHlwZSBnZW5lcmljVHlwZSkgeworICAgICAgICBpZiAoIShnZW5lcmljVHlwZSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRUeXBlKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgUGFyYW1ldGVyaXplZFR5cGUgcHQgPSAoUGFyYW1ldGVyaXplZFR5cGUpIGdlbmVyaWNUeXBlOworCisgICAgICAgIGlmIChwdC5nZXRBY3R1YWxUeXBlQXJndW1lbnRzKCkubGVuZ3RoID4gMSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCEocHQuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpWzBdIGluc3RhbmNlb2YgQ2xhc3MpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBDbGFzcyBsaXN0Q2xhc3MgPSAoQ2xhc3MpIHB0LmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKVswXTsKKyAgICAgICAgcmV0dXJuIGxpc3RDbGFzcyA9PSBNZXNzYWdlLmNsYXNzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGdldFNpemUoZmluYWwgTGlzdDxNZXNzYWdlPiBtZXNzYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IGNsYXp6LAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIExpc3Q8TWVzc2FnZT4gbWVzc2FnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiBjbGF6eiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBhcmc1LAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtIG9zdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICBmb3IgKGZpbmFsIE1lc3NhZ2UgbSA6IG1lc3NhZ2VzKSB7CisgICAgICAgICAgICBvc3RyZWFtLndyaXRlKG0udG9TdHJpbmcoKS5nZXRCeXRlcyhNZXNzYWdlVXRpbHMuZ2V0Q2hhcnNldChtZWRpYVR5cGUpKSk7CisgICAgICAgICAgICBmaW5hbCBVUkkgbVVyaSA9IHVpLmdldCgpLmdldEFic29sdXRlUGF0aEJ1aWxkZXIoKS5wYXRoKEludGVnZXIudG9TdHJpbmcobS5nZXRVbmlxdWVJZCgpKSkuYnVpbGQoKTsKKyAgICAgICAgICAgIG9zdHJlYW0ud3JpdGUoKCIgPGEgaHJlZj0nIiArIG1VcmkudG9BU0NJSVN0cmluZygpICsgIic+bGluazwvYT48YnIgLz4iKS5nZXRCeXRlcygpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2plcnNleS1lamIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qZXJzZXlfZWpiL2VudGl0aWVzL01lc3NhZ2VXcml0ZXIuamF2YSBiL2V4YW1wbGVzL2plcnNleS1lamIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qZXJzZXlfZWpiL2VudGl0aWVzL01lc3NhZ2VXcml0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZDdkMmNkCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvamVyc2V5LWVqYi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2plcnNleV9lamIvZW50aXRpZXMvTWVzc2FnZVdyaXRlci5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuamVyc2V5X2VqYi5lbnRpdGllczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworCitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgamF2YXguZWpiLlNpbmdsZXRvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLk1lc3NhZ2VVdGlsczsKKworLyoqCisgKiBBIHNpbXBsZSBtZXNzYWdlIGJvZHkgd3JpdGVyIHRvIHNlcmlhbGl6ZSBhIHNpbmdsZSBtZXNzYWdlIGJlYW4uCisgKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFNpbmdsZXRvbgorQFByb3ZpZGVyCitwdWJsaWMgY2xhc3MgTWVzc2FnZVdyaXRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5V3JpdGVyPE1lc3NhZ2U+IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKGZpbmFsIENsYXNzPD8+IGNsYXp6LCBmaW5hbCBUeXBlIHR5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9uLCBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiBjbGF6eiA9PSBNZXNzYWdlLmNsYXNzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGdldFNpemUoZmluYWwgTWVzc2FnZSBtZXNzYWdlLCBmaW5hbCBDbGFzczw/PiBjbGF6eiwgZmluYWwgVHlwZSB0eXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oZmluYWwgTWVzc2FnZSBtZXNzYWdlLCBmaW5hbCBDbGFzczw/PiBjbGF6eiwgZmluYWwgVHlwZSB0eXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUsIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBhcmc1LCBmaW5hbCBPdXRwdXRTdHJlYW0gb3N0cmVhbSkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICBvc3RyZWFtLndyaXRlKG1lc3NhZ2UudG9TdHJpbmcoKS5nZXRCeXRlcyhNZXNzYWdlVXRpbHMuZ2V0Q2hhcnNldChtZWRpYVR5cGUpKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvamVyc2V5LWVqYi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2plcnNleV9lamIvZXhjZXB0aW9ucy9DdXN0b21Ob3RGb3VuZEV4Y2VwdGlvbi5qYXZhIGIvZXhhbXBsZXMvamVyc2V5LWVqYi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2plcnNleV9lamIvZXhjZXB0aW9ucy9DdXN0b21Ob3RGb3VuZEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NmE0N2UKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9qZXJzZXktZWpiL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamVyc2V5X2VqYi9leGNlcHRpb25zL0N1c3RvbU5vdEZvdW5kRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5qZXJzZXlfZWpiLmV4Y2VwdGlvbnM7CisKKy8qKgorICogVGhpcyBleGNlcHRpb25zIHdpbGwgZ2V0IG1hcHBlZCB0byBhIDQwNCByZXNwb25zZSB3aXRoIHRoZSBhcHBsaWNhdGlvbiBleGNlcHRpb24gbWFwcGVyCisgKiBpbXBsZW1lbnRlZCBieSB7QGxpbmsgTm90Rm91bmRFeGNlcHRpb25NYXBwZXJ9IGNsYXNzLgorICoKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBDdXN0b21Ob3RGb3VuZEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisKK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2plcnNleS1lamIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qZXJzZXlfZWpiL2V4Y2VwdGlvbnMvTm90Rm91bmRFeGNlcHRpb25NYXBwZXIuamF2YSBiL2V4YW1wbGVzL2plcnNleS1lamIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qZXJzZXlfZWpiL2V4Y2VwdGlvbnMvTm90Rm91bmRFeGNlcHRpb25NYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzY1OTNhCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvamVyc2V5LWVqYi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2plcnNleV9lamIvZXhjZXB0aW9ucy9Ob3RGb3VuZEV4Y2VwdGlvbk1hcHBlci5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuamVyc2V5X2VqYi5leGNlcHRpb25zOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuRXhjZXB0aW9uTWFwcGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworLyoqCisgKiBBbiBleGNlcHRpb24gbWFwcGVyIHRvIHJldHVybiA0MDQgcmVzcG9uc2VzIHdoZW4gYSB7QGxpbmsgQ3VzdG9tTm90Rm91bmRFeGNlcHRpb259IGlzIHRocm93bi4KKyAqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitAUHJvdmlkZXIKK3B1YmxpYyBjbGFzcyBOb3RGb3VuZEV4Y2VwdGlvbk1hcHBlciBpbXBsZW1lbnRzIEV4Y2VwdGlvbk1hcHBlcjxDdXN0b21Ob3RGb3VuZEV4Y2VwdGlvbj4geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc3BvbnNlIHRvUmVzcG9uc2UoQ3VzdG9tTm90Rm91bmRFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoNDA0KS5idWlsZCgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvamVyc2V5LWVqYi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2plcnNleV9lamIvcmVzb3VyY2VzL01lc3NhZ2VCb2FyZFJlc291cmNlQmVhbi5qYXZhIGIvZXhhbXBsZXMvamVyc2V5LWVqYi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2plcnNleV9lamIvcmVzb3VyY2VzL01lc3NhZ2VCb2FyZFJlc291cmNlQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NTIxOWUKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9qZXJzZXktZWpiL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamVyc2V5X2VqYi9yZXNvdXJjZXMvTWVzc2FnZUJvYXJkUmVzb3VyY2VCZWFuLmphdmEKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5qZXJzZXlfZWpiLnJlc291cmNlczsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5ERUxFVEU7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLk5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworCitpbXBvcnQgamF2YXguZWpiLkVKQjsKK2ltcG9ydCBqYXZheC5lamIuU3RhdGVsZXNzOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuamVyc2V5X2VqYi5lbnRpdGllcy5NZXNzYWdlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmplcnNleV9lamIuZXhjZXB0aW9ucy5DdXN0b21Ob3RGb3VuZEV4Y2VwdGlvbjsKKworLyoqCisgKiBBIHN0YXRlbGVzcyBFSkIgYmVhbiB0byBoYW5kbGUgUkVTVCByZXF1ZXN0cyB0byB0aGUgbWVzc2FnZXMgcmVzb3VyY2UuCisgKiBNZXNzYWdlcyBhcmUgc3RvcmVkIGluIHRoZSBpbmplY3RlZCBFSkIgc2luZ2xldG9uIGluc3RhbmNlLgorICoKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTdGF0ZWxlc3MKK3B1YmxpYyBjbGFzcyBNZXNzYWdlQm9hcmRSZXNvdXJjZUJlYW4geworCisgICAgQENvbnRleHQKKyAgICBwcml2YXRlIFVyaUluZm8gdWk7CisgICAgQEVKQgorICAgIE1lc3NhZ2VIb2xkZXJTaW5nbGV0b25CZWFuIHNpbmdsZXRvbjsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBtZXNzYWdlcyBzdG9yZWQgaW4gdGhlIGludGVybmFsIG1lc3NhZ2UgaG9sZGVyLgorICAgICAqLworICAgIEBHRVQKKyAgICBwdWJsaWMgTGlzdDxNZXNzYWdlPiBnZXRNZXNzYWdlcygpIHsKKyAgICAgICAgcmV0dXJuIHNpbmdsZXRvbi5nZXRNZXNzYWdlcygpOworICAgIH0KKworICAgIEBQT1NUCisgICAgcHVibGljIFJlc3BvbnNlIGFkZE1lc3NhZ2UoU3RyaW5nIG1zZykgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICAgIE1lc3NhZ2UgbSA9IHNpbmdsZXRvbi5hZGRNZXNzYWdlKG1zZyk7CisKKyAgICAgICAgVVJJIG1zZ1VSSSA9IHVpLmdldFJlcXVlc3RVcmlCdWlsZGVyKCkucGF0aChJbnRlZ2VyLnRvU3RyaW5nKG0uZ2V0VW5pcXVlSWQoKSkpLmJ1aWxkKCk7CisKKyAgICAgICAgcmV0dXJuIFJlc3BvbnNlLmNyZWF0ZWQobXNnVVJJKS5idWlsZCgpOworICAgIH0KKworICAgIEBQYXRoKCJ7bXNnTnVtfSIpCisgICAgQEdFVAorICAgIHB1YmxpYyBNZXNzYWdlIGdldE1lc3NhZ2UoQFBhdGhQYXJhbSgibXNnTnVtIikgaW50IG1zZ051bSkgeworICAgICAgICBNZXNzYWdlIG0gPSBzaW5nbGV0b24uZ2V0TWVzc2FnZShtc2dOdW0pOworCisgICAgICAgIGlmIChtID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgZXhjZXB0aW9uIHdpbGwgYmUgcGFzc2VkIHRocm91Z2ggdG8gdGhlIEpBWC1SUyBydW50aW1lCisgICAgICAgICAgICAvLyBObyBvdGhlciBydW50aW1lIGV4Y2VwdGlvbiB3aWxsIGJlaGF2ZSB0aGlzIHdheSB1bmxlc3MgdGhlCisgICAgICAgICAgICAvLyBleGNlcHRpb24gaXMgYW5ub3RhdGVkIHdpdGggamF2YXguZWpiLkFwcGxpY2F0aW9uRXhjZXB0aW9uCisgICAgICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtOworCisgICAgfQorCisgICAgQFBhdGgoInttc2dOdW19IikKKyAgICBAREVMRVRFCisgICAgcHVibGljIHZvaWQgZGVsZXRlTWVzc2FnZShAUGF0aFBhcmFtKCJtc2dOdW0iKSBpbnQgbXNnTnVtKSB0aHJvd3MgQ3VzdG9tTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICBib29sZWFuIGRlbGV0ZWQgPSBzaW5nbGV0b24uZGVsZXRlTWVzc2FnZShtc2dOdW0pOworCisgICAgICAgIGlmICghZGVsZXRlZCkgeworICAgICAgICAgICAgLy8gVGhpcyBleGNlcHRpb24gd2lsbCBiZSBtYXBwZWQgdG8gYSA0MDQgcmVzcG9uc2UKKyAgICAgICAgICAgIHRocm93IG5ldyBDdXN0b21Ob3RGb3VuZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorfQorCisKKworCisKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2plcnNleS1lamIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qZXJzZXlfZWpiL3Jlc291cmNlcy9NZXNzYWdlQm9hcmRSb290UmVzb3VyY2UuamF2YSBiL2V4YW1wbGVzL2plcnNleS1lamIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qZXJzZXlfZWpiL3Jlc291cmNlcy9NZXNzYWdlQm9hcmRSb290UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmQ2NjVhCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvamVyc2V5LWVqYi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2plcnNleV9lamIvcmVzb3VyY2VzL01lc3NhZ2VCb2FyZFJvb3RSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuamVyc2V5X2VqYi5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC5lamIuRUpCOworaW1wb3J0IGphdmF4LmVqYi5TdGF0ZWxlc3M7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworLyoqCisgKiBNZXNzYWdlIGJvYXJkIHJvb3QgcmVzb3VyY2UuIFRoZSBtYWluIG1lc3NhZ2UgYm9hcmQgcmVzb3VyY2UKKyAqIGdldHMgaW5qZWN0ZWQgYXMgYW4gRUpCIHN0YXRlbGVzcyBiZWFuCisgKiBhbmQgcHJvdmlkZWQgdmlhIGEgc3ViLXJlc291cmNlIGxvY2F0b3IgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4KKyAqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitAU3RhdGVsZXNzCitAUGF0aCgiLyIpCitwdWJsaWMgY2xhc3MgTWVzc2FnZUJvYXJkUm9vdFJlc291cmNlIHsKKworICAgIEBFSkIgTWVzc2FnZUJvYXJkUmVzb3VyY2VCZWFuIHI7CisKKyAgICBAUGF0aCgibWVzc2FnZXMiKQorICAgIHB1YmxpYyBNZXNzYWdlQm9hcmRSZXNvdXJjZUJlYW4gZ2V0TWVzc2FnZUJvYXJkUmVzb3VyY2VCZWFuKCkgeworICAgICAgICByZXR1cm4gcjsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2plcnNleS1lamIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qZXJzZXlfZWpiL3Jlc291cmNlcy9NZXNzYWdlSG9sZGVyU2luZ2xldG9uQmVhbi5qYXZhIGIvZXhhbXBsZXMvamVyc2V5LWVqYi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2plcnNleV9lamIvcmVzb3VyY2VzL01lc3NhZ2VIb2xkZXJTaW5nbGV0b25CZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE3MDBkNgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2plcnNleS1lamIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qZXJzZXlfZWpiL3Jlc291cmNlcy9NZXNzYWdlSG9sZGVyU2luZ2xldG9uQmVhbi5qYXZhCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuamVyc2V5X2VqYi5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3B5T25Xcml0ZUFycmF5TGlzdDsKKworaW1wb3J0IGphdmF4LmVqYi5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5qZXJzZXlfZWpiLmVudGl0aWVzLk1lc3NhZ2U7CisKKy8qKgorICogQW4gRUpCIHNpbmdsZXRvbiB0byBtYWludGFpbiBhbGwgcHJvY2Vzc2VkIG1lc3NhZ2UgYmVhbnMuCisgKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFNpbmdsZXRvbgorcHVibGljIGNsYXNzIE1lc3NhZ2VIb2xkZXJTaW5nbGV0b25CZWFuIHsKKworICAgIHByaXZhdGUgTGlzdDxNZXNzYWdlPiBsaXN0ID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PE1lc3NhZ2U+KCk7CisgICAgcHJpdmF0ZSBpbnQgbWF4TWVzc2FnZXMgPSAxMDsKKworICAgIGludCBjdXJyZW50SWQgPSAwOworCisgICAgcHVibGljIE1lc3NhZ2VIb2xkZXJTaW5nbGV0b25CZWFuKCkgeworICAgICAgICAvLyBpbml0aWFsIGNvbnRlbnQKKyAgICAgICAgYWRkTWVzc2FnZSgibXNnMCIsIG5ldyBEYXRlKDApKTsKKyAgICAgICAgYWRkTWVzc2FnZSgibXNnMSIsIG5ldyBEYXRlKDEwMDApKTsKKyAgICAgICAgYWRkTWVzc2FnZSgibXNnMiIsIG5ldyBEYXRlKDIwMDApKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxNZXNzYWdlPiBnZXRNZXNzYWdlcygpIHsKKyAgICAgICAgTGlzdDxNZXNzYWdlPiBsID0gbmV3IExpbmtlZExpc3Q8TWVzc2FnZT4oKTsKKworICAgICAgICBpbnQgaW5kZXggPSAwOworCisgICAgICAgIHdoaWxlIChpbmRleCA8IGxpc3Quc2l6ZSgpICYmIGluZGV4IDwgbWF4TWVzc2FnZXMpIHsKKyAgICAgICAgICAgIGwuYWRkKGxpc3QuZ2V0KGluZGV4KSk7CisgICAgICAgICAgICBpbmRleCsrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZ2V0TmV3SWQoKSB7CisgICAgICAgIHJldHVybiBjdXJyZW50SWQrKzsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVzc2FnZSBhZGRNZXNzYWdlKFN0cmluZyBtc2cpIHsKKyAgICAgICAgcmV0dXJuIGFkZE1lc3NhZ2UobXNnLCBuZXcgRGF0ZSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIE1lc3NhZ2UgYWRkTWVzc2FnZShTdHJpbmcgbXNnLCBEYXRlIGRhdGUpIHsKKyAgICAgICAgTWVzc2FnZSBtID0gbmV3IE1lc3NhZ2UoZGF0ZSwgbXNnLCBnZXROZXdJZCgpKTsKKworICAgICAgICBsaXN0LmFkZCgwLCBtKTsKKworICAgICAgICByZXR1cm4gbTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVzc2FnZSBnZXRNZXNzYWdlKGludCB1bmlxdWVJZCkgeworICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICBNZXNzYWdlIG07CisKKyAgICAgICAgd2hpbGUgKGluZGV4IDwgbGlzdC5zaXplKCkpIHsKKyAgICAgICAgICAgIGlmICgobSA9IGxpc3QuZ2V0KGluZGV4KSkuZ2V0VW5pcXVlSWQoKSA9PSB1bmlxdWVJZCkgeworICAgICAgICAgICAgICAgIHJldHVybiBtOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5kZXgrKzsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGRlbGV0ZU1lc3NhZ2UoaW50IHVuaXF1ZUlkKSB7CisgICAgICAgIGludCBpbmRleCA9IDA7CisKKyAgICAgICAgd2hpbGUgKGluZGV4IDwgbGlzdC5zaXplKCkpIHsKKyAgICAgICAgICAgIGlmIChsaXN0LmdldChpbmRleCkuZ2V0VW5pcXVlSWQoKSA9PSB1bmlxdWVJZCkgeworICAgICAgICAgICAgICAgIGxpc3QucmVtb3ZlKGluZGV4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluZGV4Kys7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvamVyc2V5LWVqYi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2plcnNleV9lamIvcmVzb3VyY2VzL015QXBwbGljYXRpb24uamF2YSBiL2V4YW1wbGVzL2plcnNleS1lamIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qZXJzZXlfZWpiL3Jlc291cmNlcy9NeUFwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjIxYTc3OQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2plcnNleS1lamIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qZXJzZXlfZWpiL3Jlc291cmNlcy9NeUFwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5qZXJzZXlfZWpiLnJlc291cmNlczsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmplcnNleV9lamIuZW50aXRpZXMuTWVzc2FnZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5qZXJzZXlfZWpiLmVudGl0aWVzLk1lc3NhZ2VMaXN0V3JpdGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmplcnNleV9lamIuZW50aXRpZXMuTWVzc2FnZVdyaXRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5qZXJzZXlfZWpiLmV4Y2VwdGlvbnMuTm90Rm91bmRFeGNlcHRpb25NYXBwZXI7CisKKy8qKgorICogTWFpbiBhcHBsaWNhdGlvbiBjbGFzcy4KKyAqCisgKiBAYXV0aG9yIEpvbmF0aGFuIEJlbm9pdAorICovCitAQXBwbGljYXRpb25QYXRoKCIvYXBwLyoiKQorcHVibGljIGNsYXNzIE15QXBwbGljYXRpb24gZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgZmluYWwgU2V0PENsYXNzPD8+PiBjbGFzc2VzID0gbmV3IEhhc2hTZXQ8Q2xhc3M8Pz4+KCk7CisgICAgICAgIC8vIHJlZ2lzdGVyIHJvb3QgcmVzb3VyY2VzL3Byb3ZpZGVycworICAgICAgICBjbGFzc2VzLmFkZChNZXNzYWdlQm9hcmRSb290UmVzb3VyY2UuY2xhc3MpOworICAgICAgICBjbGFzc2VzLmFkZChNZXNzYWdlQm9hcmRSZXNvdXJjZUJlYW4uY2xhc3MpOworICAgICAgICBjbGFzc2VzLmFkZChNZXNzYWdlSG9sZGVyU2luZ2xldG9uQmVhbi5jbGFzcyk7CisgICAgICAgIGNsYXNzZXMuYWRkKE5vdEZvdW5kRXhjZXB0aW9uTWFwcGVyLmNsYXNzKTsKKyAgICAgICAgY2xhc3Nlcy5hZGQoTWVzc2FnZVdyaXRlci5jbGFzcyk7CisgICAgICAgIGNsYXNzZXMuYWRkKE1lc3NhZ2VMaXN0V3JpdGVyLmNsYXNzKTsKKyAgICAgICAgY2xhc3Nlcy5hZGQoTWVzc2FnZS5jbGFzcyk7CisgICAgICAgIHJldHVybiBjbGFzc2VzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2plcnNleS1lamIvc3JjL21haW4vd2ViYXBwL2luZGV4Lmh0bWwgYi9leGFtcGxlcy9qZXJzZXktZWpiL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkY2Q0ZDMKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9qZXJzZXktZWpiL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sCkBAIC0wLDAgKzEsMTc3IEBACis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorCistLT4KKworPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+Cis8aHRtbD4KKyAgICA8aGVhZD4KKyAgICAgICAgPHRpdGxlPjwvdGl0bGU+CisgICAgICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PU1hY1JvbWFuIj4KKworICAgICAgICA8c3R5bGU+CisgICAgICAgICAgICAuY3JlYXRlZCB7Y29sb3I6IGdyZWVufQorICAgICAgICAgICAgLnVuaXF1ZUlkIHtjb2xvcjogcmVkfQorICAgICAgICAgICAgLm1lc3NhZ2Uge2NvbG9yOiBibGFja30KKyAgICAgICAgPC9zdHlsZT4KKyAgICA8L2hlYWQ+CisKKyAgICA8Ym9keT4KKworICAgICAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CisgICAgICAgICAgICBmdW5jdGlvbiBnZXRYbWxIdHRwUmVxdWVzdCgpIHsKKyAgICAgICAgICAgICAgICB0cnkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZpcmVmb3gsIE9wZXJhIDguMCssIFNhZmFyaQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhdGNoIChlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJuZXQgRXhwbG9yZXIKKyAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQWN0aXZlWE9iamVjdCgiTXN4bWwyLlhNTEhUVFAiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBY3RpdmVYT2JqZWN0KCJNaWNyb3NvZnQuWE1MSFRUUCIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQoIllvdXIgYnJvd3NlciBkb2VzIG5vdCBzdXBwb3J0IEFKQVghIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZ1bmN0aW9uIGdldE1lc3NhZ2VzKCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgeG1sSHR0cCA9IGdldFhtbEh0dHBSZXF1ZXN0KCk7CisgICAgICAgICAgICAgICAgeG1sSHR0cC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoeG1sSHR0cC5yZWFkeVN0YXRlPT00KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicXVlcnkiKS5pbm5lckhUTUw9IkdFVCBhcHAvbWVzc2FnZXMiOworICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm91dHB1dCIpLmlubmVySFRNTD14bWxIdHRwLnJlc3BvbnNlVGV4dDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB4bWxIdHRwLm9wZW4oIkdFVCIsImFwcC9tZXNzYWdlcy8iLHRydWUpOworICAgICAgICAgICAgICAgIHhtbEh0dHAuc2VuZChudWxsKTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBmdW5jdGlvbiBnZXRNZXNzYWdlKGluZGV4KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHZhciB4bWxIdHRwID0gZ2V0WG1sSHR0cFJlcXVlc3QoKTsKKyAgICAgICAgICAgICAgICB4bWxIdHRwLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpZih4bWxIdHRwLnJlYWR5U3RhdGU9PTQpCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJxdWVyeSIpLmlubmVySFRNTD0iR0VUIGFwcC9tZXNzYWdlcy8iICsgaW5kZXg7CisgICAgICAgICAgICAgICAgICAgICAgICBpZih4bWxIdHRwLnJlc3BvbnNlVGV4dC5pbmRleE9mKCI8Ym9keT4iKSAhPSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMgPSB4bWxIdHRwLnJlc3BvbnNlVGV4dC5zdWJzdHJpbmcoeG1sSHR0cC5yZXNwb25zZVRleHQuaW5kZXhPZigiPGJvZHk+IikgKyA2LCB4bWxIdHRwLnJlc3BvbnNlVGV4dC5pbmRleE9mKCI8L2JvZHk+IikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm91dHB1dCIpLmlubmVySFRNTD1zOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgib3V0cHV0IikuaW5uZXJIVE1MPXhtbEh0dHAucmVzcG9uc2VUZXh0OworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgeG1sSHR0cC5vcGVuKCJHRVQiLCJhcHAvbWVzc2FnZXMvIiArIGluZGV4LHRydWUpOworICAgICAgICAgICAgICAgIHhtbEh0dHAuc2VuZChudWxsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZnVuY3Rpb24gZGVsZXRlTWVzc2FnZShpbmRleCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2YXIgeG1sSHR0cCA9IGdldFhtbEh0dHBSZXF1ZXN0KCk7CisgICAgICAgICAgICAgICAgeG1sSHR0cC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoeG1sSHR0cC5yZWFkeVN0YXRlPT00KQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicXVlcnkiKS5pbm5lckhUTUw9IkRFTEVURSBhcHAvbWVzc2FnZXMvIiArIGluZGV4OworICAgICAgICAgICAgICAgICAgICAgICAgaWYoeG1sSHR0cC5yZXNwb25zZVRleHQuaW5kZXhPZigiPGJvZHk+IikgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzID0geG1sSHR0cC5yZXNwb25zZVRleHQuc3Vic3RyaW5nKHhtbEh0dHAucmVzcG9uc2VUZXh0LmluZGV4T2YoIjxib2R5PiIpICsgNiwgeG1sSHR0cC5yZXNwb25zZVRleHQuaW5kZXhPZigiPC9ib2R5PiIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvdXRwdXQiKS5pbm5lckhUTUw9czsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm91dHB1dCIpLmlubmVySFRNTD14bWxIdHRwLnJlc3BvbnNlVGV4dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB4bWxIdHRwLm9wZW4oIkRFTEVURSIsImFwcC9tZXNzYWdlcy8iICsgaW5kZXgsdHJ1ZSk7CisgICAgICAgICAgICAgICAgeG1sSHR0cC5zZW5kKG51bGwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmdW5jdGlvbiBhZGRNZXNzYWdlKG1lc3NhZ2UpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdmFyIHhtbEh0dHAgPSBnZXRYbWxIdHRwUmVxdWVzdCgpOworICAgICAgICAgICAgICAgIHhtbEh0dHAub25yZWFkeXN0YXRlY2hhbmdlPWZ1bmN0aW9uKCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKHhtbEh0dHAucmVhZHlTdGF0ZT09NCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInF1ZXJ5IikuaW5uZXJIVE1MPSJQT1NUIGFwcC9tZXNzYWdlcyI7CisgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgib3V0cHV0IikuaW5uZXJIVE1MPSIiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHhtbEh0dHAub3BlbigiUE9TVCIsImFwcC9tZXNzYWdlcy8iLHRydWUpOworICAgICAgICAgICAgICAgIHhtbEh0dHAuc2VuZChtZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgIDwvc2NyaXB0PgorCisKKyAgICAgICAgPGgxPk1lc3NhZ2VCb2FyZCBzYW1wbGU8L2gxPgorCisgICAgICAgIDxmb3JtIG5hbWU9ImZvcm0wIj4KKworICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJidXR0b24iIG5hbWU9IkdFVDAiIG9uY2xpY2s9ImdldE1lc3NhZ2VzKCkiPkxJU1QgQUxMIE1FU1NBR0VTPC9idXR0b24+CisKKyAgICAgICAgPC9mb3JtPgorCisKKyAgICAgICAgPGZvcm0gbmFtZT0iZm9ybTEiPgorICAgICAgICAgICAgTWVzc2FnZSBpZCM6IDxpbnB1dCBzdHlsZT0id2lkdGg6IDRlbSIgdHlwZT0idGV4dCIgbmFtZT0ibWVzc2FnZU51bWJlciIgLz4KKworPGJ1dHRvbiB0eXBlPSJidXR0b24iIG5hbWU9IkdFVDEiIG9uY2xpY2s9ImdldE1lc3NhZ2UoZG9jdW1lbnQuZm9ybTEubWVzc2FnZU51bWJlci52YWx1ZSkiPkdFVCBNRVNTQUdFPC9idXR0b24+CisKKzwvZm9ybT4KKworPGZvcm0gbmFtZT0iZm9ybTIiPgorICAgIE1lc3NhZ2UgaWQjOiA8aW5wdXQgc3R5bGU9IndpZHRoOiA0ZW0iIHR5cGU9InRleHQiIG5hbWU9Im1lc3NhZ2VOdW1iZXIiIC8+CisKKzxidXR0b24gdHlwZT0iYnV0dG9uIiBuYW1lPSJHRVQyIiBvbmNsaWNrPSJkZWxldGVNZXNzYWdlKGRvY3VtZW50LmZvcm0yLm1lc3NhZ2VOdW1iZXIudmFsdWUpIj5ERUxFVEUgTUVTU0FHRTwvYnV0dG9uPgorCis8L2Zvcm0+CisKKzxmb3JtIG5hbWU9ImZvcm0zIj4KKyAgICBNZXNzYWdlOiA8aW5wdXQgdHlwZT0idGVzdCIgbmFtZT0ibWVzc2FnZVRleHQiIC8+CisKKyAgICA8YnV0dG9uIHR5cGU9ImJ1dHRvbiIgbmFtZT0iR0VUMiIgb25jbGljaz0iYWRkTWVzc2FnZShkb2N1bWVudC5mb3JtMy5tZXNzYWdlVGV4dC52YWx1ZSkiPkFERCBNRVNTQUdFPC9idXR0b24+CisKKzwvZm9ybT4KKworCis8aDI+TWVzc2FnZUJvYXJkPC9oMj4KKyAgICA8aDM+cXVlcnk6IDwvaDM+Cis8ZGl2IGlkPSJxdWVyeSIgc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkIj48L2Rpdj4KKyAgICA8aDM+cmVzdWx0PC9oMz4KKzxkaXYgaWQ9Im91dHB1dCIgc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyBjb2xvcjogYmxhY2s7IGhlaWdodDogMThlbTsgd2lkdGg6IDEwMCUiPjwvZGl2PgorCisKKzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICBnZXRNZXNzYWdlcygpOworPC9zY3JpcHQ+CisKKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvamVyc2V5LWVqYi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2plcnNleV9lamIvdGVzdC9NZXNzYWdlQm9hcmRUZXN0LmphdmEgYi9leGFtcGxlcy9qZXJzZXktZWpiL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamVyc2V5X2VqYi90ZXN0L01lc3NhZ2VCb2FyZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTUwM2ExCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvamVyc2V5LWVqYi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2plcnNleV9lamIvdGVzdC9NZXNzYWdlQm9hcmRUZXN0LmphdmEKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuamVyc2V5X2VqYi50ZXN0OworCitpbXBvcnQgamF2YS5uZXQuVVJJOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuamVyc2V5X2VqYi5yZXNvdXJjZXMuTXlBcHBsaWNhdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCisvKioKKyAqIEJhc2ljIHRlc3QgZm9yIGFkZGluZy9yZW1vdmluZyBtZXNzYWdlcy4KKyAqCisgKiBUZXN0cyBjdXJyZW50bHkgZGlzYWJsZWQgaW4gcG9tLnhtbCBmaWxlLgorICoKKyAqIFRvIHRlc3QgdGhlIGFwcCwgbXZuIGNsZWFuIHBhY2thZ2UgYW5kIGFzYWRtaW4gZGVwbG95IHRhcmdldC9qZXJzZXktZWpiCisgKiBhbmQgdGhlbiBydW4gdGhlIHRlc3RzIHVzaW5nIGV4dGVucm5hbCB0ZXN0IGNvbnRhaW5lciBmYWN0b3J5OgorICogbXZuIC1QcnVuLWV4dGVybmFsLXRlc3RzIHRlc3QKKyAqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgTWVzc2FnZUJvYXJkVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNeUFwcGxpY2F0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFVSSSBnZXRCYXNlVXJpKCkgeworICAgICAgICByZXR1cm4gVXJpQnVpbGRlci5mcm9tVXJpKHN1cGVyLmdldEJhc2VVcmkoKSkucGF0aCgiamVyc2V5LWVqYiIpLmJ1aWxkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVncmVzc2lvbiB0ZXN0IGZvciBKRVJTRVktMjU0MS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMaXN0TWVzc2FnZXMoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiYXBwL21lc3NhZ2VzIikucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9IVE1MKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiUmVzcG9uc2Ugc3RhdHVzIHNob3VsZCBiZSAyMDAuIEN1cnJlbnQgdmFsdWUgaXMgJWQuIiwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpLAorICAgICAgICAgICAgICAgIDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFkZE1lc3NhZ2UoKSB7CisKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJhcHAvbWVzc2FnZXMiKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkoImhlbGxvIHdvcmxkISIsIE1lZGlhVHlwZS5URVhUX1BMQUlOKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXNwb25zZSBzdGF0dXMgc2hvdWxkIGJlIENSRUFURUQuIEN1cnJlbnQgdmFsdWUgaXMgXCIiICsgcmVzcG9uc2UuZ2V0U3RhdHVzKCkgKyAiXCIiLAorICAgICAgICAgICAgICAgIFJlc3BvbnNlLlN0YXR1cy5DUkVBVEVELmdldFN0YXR1c0NvZGUoKSwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworCisgICAgICAgIGNsaWVudCgpLnRhcmdldChyZXNwb25zZS5nZXRMb2NhdGlvbigpKS5yZXF1ZXN0KCkuZGVsZXRlKCk7IC8vIHJlbW92ZSBhZGRlZCBtZXNzYWdlCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVsZXRlTWVzc2FnZSgpIHsKKworICAgICAgICBVUkkgdSA9IG51bGw7CisKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJhcHAvbWVzc2FnZXMiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KCJ0b0RlbGV0ZSIsIE1lZGlhVHlwZS5URVhUX1BMQUlOKSk7CisgICAgICAgIGlmIChyZXNwb25zZS5nZXRTdGF0dXMoKSA9PSBSZXNwb25zZS5TdGF0dXMuQ1JFQVRFRC5nZXRTdGF0dXNDb2RlKCkpIHsKKyAgICAgICAgICAgIHUgPSByZXNwb25zZS5nZXRMb2NhdGlvbigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIHMgPSBjbGllbnQoKS50YXJnZXQodSkucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydFRydWUocy5jb250YWlucygidG9EZWxldGUiKSk7CisKKyAgICAgICAgUmVzcG9uc2UgZmlyc3REZWxldGVSZXNwb25zZSA9IGNsaWVudCgpLnRhcmdldCh1KS5yZXF1ZXN0KCkuZGVsZXRlKCk7CisgICAgICAgIGZpbmFsIGludCBzdWNjZXNzZnVsRGVsZXRlUmVzcG9uc2VTdGF0dXMgPSBmaXJzdERlbGV0ZVJlc3BvbnNlLmdldFN0YXR1cygpOworICAgICAgICBhc3NlcnRUcnVlKCJGaXJzdCBERUxFVEUgcmVxdWVzdCBzaG91bGQgcmV0dXJuIHdpdGggYSAyeHggc3RhdHVzIGNvZGUiLAorICAgICAgICAgICAgICAgICgyMDAgPD0gc3VjY2Vzc2Z1bERlbGV0ZVJlc3BvbnNlU3RhdHVzKSAmJiAoc3VjY2Vzc2Z1bERlbGV0ZVJlc3BvbnNlU3RhdHVzIDwgMzAwKSk7CisKKyAgICAgICAgUmVzcG9uc2Ugbm9uRXhpc3RlbnRHZXRSZXNwb25zZSA9IGNsaWVudCgpLnRhcmdldCh1KS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiR0VUIHJlcXVlc3QgdG8gYSBub24gZXhpc3RlbnQgcmVzb3VyY2Ugc2hvdWxkIHJldHVybiA0MDQiLCA0MDQsIG5vbkV4aXN0ZW50R2V0UmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworCisgICAgICAgIFJlc3BvbnNlIG5vbkV4aXN0ZW50RGVsZXRlUmVzcG9uc2UgPSBjbGllbnQoKS50YXJnZXQodSkucmVxdWVzdCgpLmRlbGV0ZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkRFTEVURSByZXF1ZXN0IHRvIGEgbm9uIGV4aXN0ZW50IHJlc291cmNlIHNob3VsZCByZXR1cm4gNDA0IiwgNDA0LCBub25FeGlzdGVudERlbGV0ZVJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2pzb24tYmluZGluZy13ZWJhcHAvUkVBRE1FLk1EIGIvZXhhbXBsZXMvanNvbi1iaW5kaW5nLXdlYmFwcC9SRUFETUUuTUQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU2MTJiZgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2pzb24tYmluZGluZy13ZWJhcHAvUkVBRE1FLk1ECkBAIC0wLDAgKzEsNDMgQEAKK1svL106ICMgIiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIgorWy8vXTogIyAiICIKK1svL106ICMgIiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgIgorWy8vXTogIyAiIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0ICIKK1svL106ICMgIiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuICIKK1svL106ICMgIiAiCitbLy9dOiAjICIgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZSAiCisKK0pTT05CIEV4YW1wbGUKKz09PT09PT09PT09PT0KKworVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gdXNlIEpTT05CIHdpdGggcmVzb3VyY2UgY2xhc3Nlcy4KKworQ29udGVudHMKKy0tLS0tLS0tCisKK1RoZSBtYXBwaW5nIG9mIHRoZSBVUkkgcGF0aCBzcGFjZSBpcyBwcmVzZW50ZWQgaW4gdGhlIGZvbGxvd2luZyB0YWJsZToKKworVVJJIHBhdGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUmVzb3VyY2UgY2xhc3MgICAgICAgICAgIHwgSFRUUCBtZXRob2RzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLQorKipfL2pzb25iL2NhdHMvb25lXyoqICAgICAgICAgICAgICAgICAgIHwgSnNvbmJSZXNvdXJjZSAgICAgICAgICAgIHwgR0VUCisqKl8vanNvbmIvY2F0cy9hbGxfKiogICAgICAgICAgICAgICAgICAgfCBKc29uYlJlc291cmNlICAgICAgICAgICAgfCBHRVQKKyoqXy9qc29uYi9jYXRzL2FkZF8qKiAgICAgICAgICAgICAgICAgICB8IEpzb25iUmVzb3VyY2UgICAgICAgICAgICB8IFBPU1QKKyoqXy9qc29uYi9jYXRzL2FkZEFsbF8qKiAgICAgICAgICAgICAgICB8IEpzb25iUmVzb3VyY2UgICAgICAgICAgICB8IFBPU1QKKworUnVubmluZyB0aGUgRXhhbXBsZQorLS0tLS0tLS0tLS0tLS0tLS0tLQorCitSdW4gdGhlIGV4YW1wbGUgYXMgZm9sbG93czoKKworPiAgICAgbXZuIGNsZWFuIGNvbXBpbGUgZXhlYzpqYXZhCisKK1RoaXMgZGVwbG95cyB0aGUgZXhhbXBsZSB1c2luZyBbR3JpenpseV0oaHR0cDovL2dyaXp6bHkuamF2YS5uZXQvKSBjb250YWluZXIuIFlvdSBjYW4gYWNjZXNzIHRoZSBhcHBsaWNhdGlvbiBhdDoKKworLSAgIDxodHRwOi8vbG9jYWxob3N0OjgwODAvanNvbi1iaW5kaW5nLXdlYmFwcC9jYXRzL29uZT4KKy0gICA8aHR0cDovL2xvY2FsaG9zdDo4MDgwL2pzb24tYmluZGluZy13ZWJhcHAvY2F0cy9hbGw+CisKK29yIHlvdSBjYW4gcG9zdCBhbiB4bWwgZW50aXR5OgorCis+ICAgIGN1cmwgLXYgLVggUE9TVCBodHRwOi8vbG9jYWxob3N0OjgwODAvanNvbi1iaW5kaW5nLXdlYmFwcC9jYXRzL2FkZCAtSCAiQ29udGVudC1UeXBlOmFwcGxpY2F0aW9uL2pzb24iIC1kICcKKz4gICB7ImNvbG9yIjoid2hpdGUiLCJzb3J0IjoibWFpbmUgY29vbiIsImNhdE5hbWUiOiJEYXJ3aW4iLCAiZG9tZXN0aWNhdGVkIjoidHJ1ZSJ9JworCitZb3UgY2FuIGFsc28gdXNlIHRoZSBidWlsdCB3YXIgZmlsZSB0byBkZXBsb3kgdGhlIGFwcCB0byBhIGNvbnRhaW5lciBvZiB5b3VyIGNob2ljZS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9qc29uLWJpbmRpbmctd2ViYXBwL3BvbS54bWwgYi9leGFtcGxlcy9qc29uLWJpbmRpbmctd2ViYXBwL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVlZjVhYQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2pzb24tYmluZGluZy13ZWJhcHAvcG9tLnhtbApAQCAtMCwwICsxLDgzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmpzb24tYmluZGluZy13ZWJhcHA8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktZXhhbXBsZXMtanNvbi1iaW5kaW5nLXdlYmFwcDwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgSlNPTiBCaW5kaW5nIGV4YW1wbGUuPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItZ3JpenpseTItaHR0cDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtanNvbi1iaW5kaW5nPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktaGsyPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGVjLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPG1haW5DbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5qc29uYi5BcHA8L21haW5DbGFzcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnJlbGVhc2U8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvanNvbi1iaW5kaW5nLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2pzb25iL0FwcC5qYXZhIGIvZXhhbXBsZXMvanNvbi1iaW5kaW5nLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2pzb25iL0FwcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZDE4ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9qc29uLWJpbmRpbmctd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvanNvbmIvQXBwLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5qc29uYjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkyLmh0dHBzZXJ2ZXIuR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5ncml6emx5Lmh0dHAuc2VydmVyLkh0dHBTZXJ2ZXI7CisKKy8qKgorICogSmVyc2V5IEpTT04tQiBleGFtcGxlIHN0YW5kYWxvbmUgYXBwbGljYXRpb24uCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQXBwIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVSSSBCQVNFX1VSSSA9IFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qc29uLWJpbmRpbmctd2ViYXBwLyIpOworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJKU09OLUIgKGpzb24tYmluZGluZykgSmVyc2V5IEV4YW1wbGUgQXBwIik7CisKKyAgICAgICAgICAgIGZpbmFsIEh0dHBTZXJ2ZXIgc2VydmVyID0gR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5LmNyZWF0ZUh0dHBTZXJ2ZXIoQkFTRV9VUkksIG5ldyBKc29uYkFwcGxpY2F0aW9uKCksIGZhbHNlKTsKKyAgICAgICAgICAgIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmFkZFNodXRkb3duSG9vayhuZXcgVGhyZWFkKHNlcnZlcjo6c2h1dGRvd25Ob3cpKTsKKyAgICAgICAgICAgIHNlcnZlci5zdGFydCgpOworCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCisgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIkFwcGxpY2F0aW9uIHN0YXJ0ZWQuJW5Ucnkgb3V0ICVzJW5TdG9wIHRoZSBhcHBsaWNhdGlvbiB1c2luZyBDVFJMK0MiLCBCQVNFX1VSSSkpOworCisgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gfCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihBcHAuY2xhc3MuZ2V0TmFtZSgpKS5sb2coTGV2ZWwuU0VWRVJFLCBudWxsLCBleCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9qc29uLWJpbmRpbmctd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvanNvbmIvQ2F0LmphdmEgYi9leGFtcGxlcy9qc29uLWJpbmRpbmctd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvanNvbmIvQ2F0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzIwYTYzZQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2pzb24tYmluZGluZy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qc29uYi9DYXQuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmpzb25iOworCitpbXBvcnQgamF2YXguanNvbi5iaW5kLmFubm90YXRpb24uSnNvbmJQcm9wZXJ0eTsKK2ltcG9ydCBqYXZheC5qc29uLmJpbmQuYW5ub3RhdGlvbi5Kc29uYlByb3BlcnR5T3JkZXI7CisKKy8qKgorICogRXhhbXBsZSBjYXQgUE9KTyBmb3IgSlNPTkIgKHVuKW1hcnNoYWxsaW5nLgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworQEpzb25iUHJvcGVydHlPcmRlcih7ImNvbG9yIiwgInNvcnQiLCAibmFtZSIsICJkb21lc3RpY2F0ZWQifSkKK3B1YmxpYyBjbGFzcyBDYXQgeworICAgIEBKc29uYlByb3BlcnR5KCJjYXROYW1lIikKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworICAgIHByaXZhdGUgU3RyaW5nIHNvcnQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgY29sb3I7CisgICAgcHJpdmF0ZSBib29sZWFuIGRvbWVzdGljYXRlZDsKKworICAgIC8vIGpzb24tYiBuZWVkcyB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvcgorICAgIHB1YmxpYyBDYXQoKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorCisgICAgcHVibGljIENhdChTdHJpbmcgbmFtZSwgU3RyaW5nIHNvcnQsIFN0cmluZyBjb2xvciwgYm9vbGVhbiBkb21lc3RpY2F0ZWQpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5zb3J0ID0gc29ydDsKKyAgICAgICAgdGhpcy5jb2xvciA9IGNvbG9yOworICAgICAgICB0aGlzLmRvbWVzdGljYXRlZCA9IGRvbWVzdGljYXRlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBDYXQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBASnNvbmJQcm9wZXJ0eSgiY2F0U29ydCIpCisgICAgcHVibGljIFN0cmluZyBnZXRTb3J0KCkgeworICAgICAgICByZXR1cm4gc29ydDsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2F0IHNldFNvcnQoU3RyaW5nIHNvcnQpIHsKKyAgICAgICAgdGhpcy5zb3J0ID0gc29ydDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDb2xvcigpIHsKKyAgICAgICAgcmV0dXJuIGNvbG9yOworICAgIH0KKworICAgIHB1YmxpYyBDYXQgc2V0Q29sb3IoU3RyaW5nIGNvbG9yKSB7CisgICAgICAgIHRoaXMuY29sb3IgPSBjb2xvcjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNEb21lc3RpY2F0ZWQoKSB7CisgICAgICAgIHJldHVybiBkb21lc3RpY2F0ZWQ7CisgICAgfQorCisgICAgcHVibGljIENhdCBzZXREb21lc3RpY2F0ZWQoYm9vbGVhbiBkb21lc3RpY2F0ZWQpIHsKKyAgICAgICAgdGhpcy5kb21lc3RpY2F0ZWQgPSBkb21lc3RpY2F0ZWQ7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2pzb24tYmluZGluZy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qc29uYi9Kc29uYkFwcGxpY2F0aW9uLmphdmEgYi9leGFtcGxlcy9qc29uLWJpbmRpbmctd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvanNvbmIvSnNvbmJBcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4OWI1M2QKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9qc29uLWJpbmRpbmctd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvanNvbmIvSnNvbmJBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuanNvbmI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGg7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKKy8qKgorICogSmVyc2V5IEpTT04tQiBleGFtcGxlIGFwcGxpY2F0aW9uLgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uUGF0aCgiLyIpCitwdWJsaWMgY2xhc3MgSnNvbmJBcHBsaWNhdGlvbiBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKyAgICBwdWJsaWMgSnNvbmJBcHBsaWNhdGlvbigpIHsKKyAgICAgICAgcmVnaXN0ZXIoSnNvbmJSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvanNvbi1iaW5kaW5nLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2pzb25iL0pzb25iUmVzb3VyY2UuamF2YSBiL2V4YW1wbGVzL2pzb24tYmluZGluZy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qc29uYi9Kc29uYlJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRkNmQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2pzb24tYmluZGluZy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qc29uYi9Kc29uYlJlc291cmNlLmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5qc29uYjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKKy8qKgorICogQW4gZXhhbXBsZSByZXNvdXJjZSB1dGlsaXppbmcgSlNPTkIuCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiY2F0cyIpCitAQ29uc3VtZXMoImFwcGxpY2F0aW9uL2pzb24iKQorcHVibGljIGNsYXNzIEpzb25iUmVzb3VyY2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxDYXQ+IGNhdHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIGNhdHMuYWRkKG5ldyBDYXQoIlJvc2EiLCAic2VtaS1icml0aXNoIiwgInRhYmJ5IiwgdHJ1ZSkpOworICAgICAgICBjYXRzLmFkZChuZXcgQ2F0KCJBbGZyZWQiLCAic2VtaS1icml0aXNoIiwgImdpbmdlciIsIHRydWUpKTsKKyAgICAgICAgY2F0cy5hZGQobmV3IENhdCgiTWlzaGFuIiwgImJyaXRpc2ggYmx1ZSIsICJibHVlL3NpbHZlciIsIHRydWUpKTsKKyAgICAgICAgY2F0cy5hZGQobmV3IENhdCgiQ29zdGEiLCAiY29tbW9uIGNhdCIsICJzdHJhY2NpYXRlbGxhIiwgdHJ1ZSkpOworICAgIH0KKworICAgIEBQYXRoKCJvbmUiKQorICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgIHB1YmxpYyBDYXQgZ2V0Q2F0KCkgeworICAgICAgICByZXR1cm4gY2F0cy5nZXQoKGludCkgKE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSAqIDMpKSk7CisgICAgfQorCisgICAgQFBhdGgoImFsbCIpCisgICAgQEdFVAorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgcHVibGljIExpc3Q8Q2F0PiBnZXRBbGwoKSB7CisgICAgICAgIHJldHVybiBjYXRzOworICAgIH0KKworICAgIEBQYXRoKCJzY2hyb2VkaW5nZXIiKQorICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGNoZWNrKCkgeworICAgICAgICByZXR1cm4gIlRoZSBjYXQgaXMgOXggYWxpdmUhIjsKKyAgICB9CisKKyAgICBAUGF0aCgiYWRkIikKKyAgICBAUE9TVAorICAgIHB1YmxpYyBSZXNwb25zZSBjcmVhdGVDYXQoQ2F0IGNhdCkgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkNyZWF0aW5nIGNhdC4iKTsKKyAgICAgICAgY2F0cy5hZGQoY2F0KTsKKyAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCkuYnVpbGQoKTsKKyAgICB9CisKKyAgICBAUGF0aCgiYWRkQWxsIikKKyAgICBAUE9TVAorICAgIHB1YmxpYyBSZXNwb25zZSBjcmVhdGVNdWx0aXBsZShMaXN0PENhdD4gYWRkZWRDYXRzKSB7CisgICAgICAgIGNhdHMuYWRkQWxsKGFkZGVkQ2F0cyk7CisgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygpLmJ1aWxkKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9qc29uLWphY2tzb24vUkVBRE1FLk1EIGIvZXhhbXBsZXMvanNvbi1qYWNrc29uL1JFQURNRS5NRApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmU1NmFhCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvanNvbi1qYWNrc29uL1JFQURNRS5NRApAQCAtMCwwICsxLDkxIEBACitbLy9dOiAjICIgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICIKK1svL106ICMgIiAiCitbLy9dOiAjICIgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlICIKK1svL106ICMgIiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCAiCitbLy9dOiAjICIgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLiAiCitbLy9dOiAjICIgIgorWy8vXTogIyAiIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UgIgorCitKYWNrc29uIEpBWC1SUyBKU09OIFByb3ZpZGVyIEV4YW1wbGUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byBwcm9kdWNlL2NvbnN1bWUgSlNPTiByZXByZXNlbnRhdGlvbnMKK2Zyb20gSmF2YSBvYmplY3RzLiBUaGlzIGFwcGxpZXMgbm90IG9ubHkgdG8gSkFYQiBiZWFucywgYXMgc2hvd24gaW4gdGhlCitganNvbi1mcm9tLWpheGJgIGV4YW1wbGUgYnV0IGFsc28gdG8gb3JkaW5hcnksIHVuLWFubm90YXRlZCwgUE9KT3MuCisKK1RoaXMgZXhhbXBsZSBob3N0cyB0aHJlZSBzaW1wbGUgcmVhZC1vbmx5IHJlc291cmNlczogT25lIHByb3ZpZGVzIGFuCitleGFtcGxlIG9mIHVzaW5nIGEgSmFja3NvbiBKU09OIHByb3ZpZGVyIChyZWdpc3RlcmVkIGJ5IHRoZSBmZWF0dXJlCitgSmFja3NvbkZlYXR1cmVgIGluIHRoZSBgTXlBcHBsaWNhdGlvbmAgY2xhc3MpIGluc3RlYWQgb2YgdXNpbmcgSkFYQgorKE9iamVjdC0mZ3Q7SkFYQi0mZ3Q7SlNPTikgd2hpY2ggaGFzIHNvbWUgbGltaXRhdGlvbnMgKGUuZy4gZW1wdHkgYXJyYXlzCitpbiBKQVhCIGJlYW5zKS4gRm9yIHRoaXMgcmVzb3VyY2UgdGhlIEpTT04gcmVwcmVzZW50YXRpb24gaXMgcHJvZHVjZWQgYnkKK3RoZSBKYWNrc29uIEpBWC1SUyBwcm92aWRlciwgd2hpbGUgdGhlIFhNTCByZXByZXNlbnRhdGlvbiBpcyBnZW5lcmF0ZWQKK2J5IEpBWEIgYXMgdXN1YWwuIFRoZSBzZWNvbmQgd2ViIHJlc291cmNlIGlzIGJhc2VkIG9uIGEgc2ltcGxlCit1bi1hbm5vdGF0ZWQgUE9KTyBhbmQgcHJvdmlkZXMgb25seSBKU09OLWJhc2VkIHJlcHJlc2VudGF0aW9uczogSlNPTiBhbmQKK0pTT04gd2l0aCBwYWRkaW5nIChKU09OUCkuIFRoZSB0aGlyZCByZXNvdXJjZSBkZXBpY3RzIGhvdyBKYWNrc29uIGFuZAorSkFYQiBhbm5vdGF0aW9ucyBjb3VsZCBiZSBtaXhlZCB0b2dldGhlciB3aXRoaW4gYSBzaW5nbGUgUE9KTy4KKworQ29udGVudHMKKy0tLS0tLS0tCisKK1RoZSAiZW1wdHkgYXJyYXkiIHdlYiByZXNvdXJjZSBpcyBpbXBsZW1lbnRlZCBieSB0aGUgYG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmphY2tzb24uRW1wdHlBcnJheVJlc291cmNlYCBjbGFzcy4KKworVGhlICJub24gSkFYQiIgd2ViIHJlc291cmNlIGlzIGltcGxlbWVudGVkIGJ5IHRoZSBgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuamFja3Nvbi5Ob25KYXhiQmVhblJlc291cmNlYCBjbGFzcy4KKworQm90aCByZXNvdXJjZXMgdXNlIHRoZSBkZWZhdWx0IEphY2tzb24gbWFwcGVyIGNvbmZpZ3VyYXRpb24gdG8gc2VyaWFsaXplIEpTT04KK2RhdGEgb3V0IGFuZCBkZXBpY3RzIHRoZSBjb3JuZXIgY2FzZXMsIHdoZXJlIHRoZSBKZXJzZXkgaW50ZXJuYWwsIFN0QVgKK2Jhc2VkLCBKU09OIHByb2Nlc3NpbmcgY2FuIG5vdCBiZSB1dGlsaXplZC4KKworVGhlIGBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5qYWNrc29uLkNvbWJpbmVkQW5ub3RhdGlvblJlc291cmNlYAorY2xhc3MgaXMgdXNlZCB0byBzaG93IGhvdyBKQVhCIGFuZCBKYWNrc29uIGFubm90YXRpb25zIGNvdWxkIGJlIGNvbWJpbmVkCit0b2dldGhlciBpbiBvbmUgSmF2YSBiZWFuIGZvciBKU09OIHNlcmlhbGl6YXRpb24uIFNlZSB0aGUKKworYG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmphY2tzb24uTXlPYmplY3RNYXBwZXJQcm92aWRlcmAgY2xhc3MKK3doZXJlIEphY2tzb24gc3BlY2lmaWMgb3B0aW9ucyBhcmUgdXNlZCB0byBzZXQgdXAgdGhlIGRlc2lyZWQgSlNPTgorc2VyaWFsaXphdGlvbiBjb25maWd1cmF0aW9uLgorCitUaGUgbWFwcGluZyBvZiB0aGUgVVJJIHBhdGggc3BhY2UgaXMgcHJlc2VudGVkIGluIHRoZSBmb2xsb3dpbmcgdGFibGU6CisKK1VSSSBwYXRoICAgICAgICAgICAgICAgICAgICAgfCBSZXNvdXJjZSBjbGFzcyAgICAgICAgICAgICAgIHwgSFRUUCBtZXRob2QKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLQorKipfL2VtcHR5QXJyYXlSZXNvdXJjZV8qKiAgICB8IEVtcHR5QXJyYXlSZXNvdXJjZSAgICAgICAgICAgfCBHRVQKKyoqXy9ub25KYXhiUmVzb3VyY2VfKiogICAgICAgfCBOb25KYXhiQmVhblJlc291cmNlICAgICAgICAgIHwgR0VUCisqKl8vY29tYmluZWRBbm5vdGF0aW9uc18qKiAgIHwgQ29tYmluZWRBbm5vdGF0aW9uUmVzb3VyY2UgICB8IEdFVAorCitUbyB1c2UgSmFja3NvbiBzcGVjaWZpYyBjb25maWd1cmF0aW9uIG9wdGlvbnMsIG9uZSBjYW4gaW1wbGVtZW50IGEKK2BDb250ZXh0UmVzb2x2ZXI8T2JqZWN0TWFwcGVyPmAgcHJvdmlkZXIuIEZvciBhbiBleGFtcGxlIG9mIHN1Y2ggYW4KK2ltcGxlbWVudGF0aW9uLCBzZWUgdGhlIGBNeU9iamVjdE1hcHBlclByb3ZpZGVyYCBjbGFzcy4KKworUnVubmluZyB0aGUgRXhhbXBsZQorLS0tLS0tLS0tLS0tLS0tLS0tLQorCitSdW4gdGhlIGV4YW1wbGUgYXMgZm9sbG93czoKKworPiAgICAgbXZuIGNsZWFuIGNvbXBpbGUgZXhlYzpqYXZhCisKK1RoaXMgZGVwbG95cyB0aGUgZXhhbXBsZSB1c2luZ1tHcml6emx5XShodHRwOi8vZ3JpenpseS5qYXZhLm5ldC8pCisKK0EgW1dBREwgZGVzY3JpcHRpb25dKGh0dHA6Ly93YWRsLmphdmEubmV0LyNzcGVjKSBtYXkgYmUgYWNjZXNzZWQgYXQgdGhlIFVSTDoKKworLSAgIDxodHRwOi8vbG9jYWxob3N0OjgwODAvamFja3Nvbi9hcHBsaWNhdGlvbi53YWRsPgorCitUaGUgdGhyZWUgcmVzb3VyY2VzIGFyZSBhdmFpbGFibGUgYXQKKworLSAgIDxodHRwOi8vbG9jYWxob3N0OjgwODAvamFja3Nvbi9lbXB0eUFycmF5UmVzb3VyY2U+CistICAgPGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qYWNrc29uL25vbkpheGJSZXNvdXJjZT4KKy0gICA8aHR0cDovL2xvY2FsaG9zdDo4MDgwL2phY2tzb24vY29tYmluZWRBbm5vdGF0aW9ucz4KKworVG8gZWFzaWx5IG9idGFpbiB0aGUgZGlmZmVyZW50IG91dHB1dCB0eXBlcyBhdmFpbGFibGUsCitbY1VSTF0oaHR0cDovL2N1cmwuaGF4eC5zZS8pIGNhbiBiZSB1c2VkIGFzIGZvbGxvd3M6CisKK09idGFpbiB0aGUgSlNPTiBvdXRwdXQgb2YgRW1wdHlBcnJheVJlc291cmNlICh1c2UKK2AtSEFjY2VwdDphcHBsaWNhdGlvbi94bWxgIGZvciBYTUwgb3V0cHV0KToKKworPiAgICAgY3VybCAtSEFjY2VwdDphcHBsaWNhdGlvbi9qc29uIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qYWNrc29uL2VtcHR5QXJyYXlSZXNvdXJjZQorCitPYnRhaW4gdGhlIEpTT04gb3V0cHV0IG9mIE5vbkpheGJCZWFuUmVzb3VyY2UgKHVzZSBgLUhBY2NlcHQ6YXBwbGljYXRpb24vamF2YXNjcmlwdGAgZm9yIEpTT05QIG91dHB1dCk6CisKKz4gICAgIGN1cmwgLUhBY2NlcHQ6YXBwbGljYXRpb24vanNvbiBodHRwOi8vbG9jYWxob3N0OjgwODAvamFja3Nvbi9ub25KYXhiUmVzb3VyY2UKKworT2J0YWluIHRoZSBKU09OIG91dHB1dCBvZiBDb21iaW5lZEFubm90YXRpb25SZXNvdXJjZToKKworPiAgICAgY3VybCAtSEFjY2VwdDphcHBsaWNhdGlvbi9qc29uIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qYWNrc29uL2NvbWJpbmVkQW5ub3RhdGlvbnMKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2pzb24tamFja3Nvbi9wb20ueG1sIGIvZXhhbXBsZXMvanNvbi1qYWNrc29uL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZkMGY2ZAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2pzb24tamFja3Nvbi9wb20ueG1sCkBAIC0wLDAgKzEsODMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+anNvbi1qYWNrc29uPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LWV4YW1wbGVzLWpzb24tamFja3NvbjwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgSlNPTiB3aXRoIEphY2tzb24gZXhhbXBsZS48L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1ncml6emx5Mi1odHRwPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWhrMjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLWpzb24tamFja3NvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcms8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstdXRpbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhlYy1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxtYWluQ2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuamFja3Nvbi5BcHA8L21haW5DbGFzcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnJlbGVhc2U8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvanNvbi1qYWNrc29uL3NyYy9tYWluL2Fzc2VtYmx5L3NyYy54bWwgYi9leGFtcGxlcy9qc29uLWphY2tzb24vc3JjL21haW4vYXNzZW1ibHkvc3JjLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDMwNDMzCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvanNvbi1qYWNrc29uL3NyYy9tYWluL2Fzc2VtYmx5L3NyYy54bWwKQEAgLTAsMCArMSwyOCBAQAorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzxhc3NlbWJseT4KKyAgICA8aWQ+cHJvamVjdDwvaWQ+CisgICAgPGZvcm1hdHM+CisgICAgICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+CisgICAgPC9mb3JtYXRzPgorICAgIDxmaWxlU2V0cz4KKyAgICAgICAgPGZpbGVTZXQ+CisgICAgICAgICAgICA8ZGlyZWN0b3J5Pi48L2RpcmVjdG9yeT4KKyAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+PC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICA8dXNlRGVmYXVsdEV4Y2x1ZGVzPnRydWU8L3VzZURlZmF1bHRFeGNsdWRlcz4KKyAgICAgICAgICAgIDxleGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi90YXJnZXQvKio8L2V4Y2x1ZGU+CisgICAgICAgICAgICA8L2V4Y2x1ZGVzPgorICAgICAgICA8L2ZpbGVTZXQ+CisgICAgPC9maWxlU2V0cz4KKzwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qYWNrc29uL0FwcC5qYXZhIGIvZXhhbXBsZXMvanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamFja3Nvbi9BcHAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWJiMWMwCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamFja3Nvbi9BcHAuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmphY2tzb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkyLmh0dHBzZXJ2ZXIuR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guZ3JpenpseS5odHRwLnNlcnZlci5IdHRwU2VydmVyOworCisvKioKKyAqIFV0aWxpdHkgY2xhc3Mgd2hpY2ggY3JlYXRlcyB7QGxpbmsgTXlBcHBsaWNhdGlvbn0gaW5zdGFuY2VzIGFuZCBwcm92aWRlcyBzdXBwb3J0CisgKiBmb3IgcnVubmluZyB0aGlzIHNhbXBsZSBmcm9tIGNvbW1hbmQgbGluZS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQXBwIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVSSSBCQVNFX1VSSSA9IFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qYWNrc29uLyIpOworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJKU09OIHdpdGggSmFja3NvbiBKZXJzZXkgRXhhbXBsZSBBcHAiKTsKKworICAgICAgICAgICAgZmluYWwgSHR0cFNlcnZlciBzZXJ2ZXIgPSBHcml6emx5SHR0cFNlcnZlckZhY3RvcnkuY3JlYXRlSHR0cFNlcnZlcihCQVNFX1VSSSwgY3JlYXRlQXBwKCksIGZhbHNlKTsKKyAgICAgICAgICAgIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmFkZFNodXRkb3duSG9vayhuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHNlcnZlci5zaHV0ZG93bk5vdygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pKTsKKyAgICAgICAgICAgIHNlcnZlci5zdGFydCgpOworCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oU3RyaW5nLmZvcm1hdCgiQXBwbGljYXRpb24gc3RhcnRlZC4lblN0b3AgdGhlIGFwcGxpY2F0aW9uIHVzaW5nIENUUkwrQyIpKTsKKworICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5qb2luKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIHwgSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoQXBwLmNsYXNzLmdldE5hbWUoKSkubG9nKExldmVsLlNFVkVSRSwgbnVsbCwgZXgpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlQ29uZmlnIGNyZWF0ZUFwcCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNeUFwcGxpY2F0aW9uKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamFja3Nvbi9Db21iaW5lZEFubm90YXRpb25CZWFuLmphdmEgYi9leGFtcGxlcy9qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qYWNrc29uL0NvbWJpbmVkQW5ub3RhdGlvbkJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODUyNzczCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamFja3Nvbi9Db21iaW5lZEFubm90YXRpb25CZWFuLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5qYWNrc29uOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5hbm5vdGF0aW9uLkpzb25Qcm9wZXJ0eTsKKworLyoqCisgKiBUT0RPIGphdmFkb2MuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFhtbFJvb3RFbGVtZW50KG5hbWUgPSAiYWNjb3VudCIpCitwdWJsaWMgY2xhc3MgQ29tYmluZWRBbm5vdGF0aW9uQmVhbiB7CisKKyAgICBASnNvblByb3BlcnR5KCJ2YWx1ZSIpCisgICAgaW50IHg7CisKKyAgICBwdWJsaWMgQ29tYmluZWRBbm5vdGF0aW9uQmVhbihpbnQgeCkgeworICAgICAgICB0aGlzLnggPSB4OworICAgIH0KKworICAgIHB1YmxpYyBDb21iaW5lZEFubm90YXRpb25CZWFuKCkgeworICAgICAgICB0aGlzKDE1KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qYWNrc29uL0NvbWJpbmVkQW5ub3RhdGlvblJlc291cmNlLmphdmEgYi9leGFtcGxlcy9qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qYWNrc29uL0NvbWJpbmVkQW5ub3RhdGlvblJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJkZWFkNgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2pzb24tamFja3Nvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2phY2tzb24vQ29tYmluZWRBbm5vdGF0aW9uUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmphY2tzb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworLyoqCisgKiBUT0RPIGphdmFkb2MuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoImNvbWJpbmVkQW5ub3RhdGlvbnMiKQorcHVibGljIGNsYXNzIENvbWJpbmVkQW5ub3RhdGlvblJlc291cmNlIHsKKworICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKyAgICBAR0VUCisgICAgcHVibGljIENvbWJpbmVkQW5ub3RhdGlvbkJlYW4gZ2V0QWNjb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDb21iaW5lZEFubm90YXRpb25CZWFuKDEyKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qYWNrc29uL0R1bW15QmVhbi5qYXZhIGIvZXhhbXBsZXMvanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamFja3Nvbi9EdW1teUJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTA1ZTlkCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamFja3Nvbi9EdW1teUJlYW4uamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmphY2tzb247CisKKy8qKgorICogVGVzdGluZyBiZWFuIGZvciBFeGNlcHRpb25NYXBwaW5nVGVzdFJlc291cmNlLgorICoKKyAqLworcHVibGljIGNsYXNzIER1bW15QmVhbiB7CisgICAgcHJpdmF0ZSBpbnQga2V5OworICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlOworCisgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRLZXkoKSB7CisgICAgICAgIHJldHVybiBrZXk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0S2V5KGludCBrZXkpIHsKKyAgICAgICAgdGhpcy5rZXkgPSBrZXk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qYWNrc29uL0VtcHR5QXJyYXlCZWFuLmphdmEgYi9leGFtcGxlcy9qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qYWNrc29uL0VtcHR5QXJyYXlCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzMyYWU4NAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2pzb24tamFja3Nvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2phY2tzb24vRW1wdHlBcnJheUJlYW4uamF2YQpAQCAtMCwwICsxLDI0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmphY2tzb247CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCisvKioKKyAqIFRPRE8gamF2YWRvYy4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAWG1sUm9vdEVsZW1lbnQKK3B1YmxpYyBjbGFzcyBFbXB0eUFycmF5QmVhbiB7CisKKyAgICBwdWJsaWMgU3RyaW5nW10gZW10cHlBcnJheSA9IG5ldyBTdHJpbmdbMF07Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qYWNrc29uL0VtcHR5QXJyYXlSZXNvdXJjZS5qYXZhIGIvZXhhbXBsZXMvanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamFja3Nvbi9FbXB0eUFycmF5UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjRhYmY1Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamFja3Nvbi9FbXB0eUFycmF5UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmphY2tzb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworLyoqCisgKiBUT0RPIGphdmFkb2MuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIi9lbXB0eUFycmF5UmVzb3VyY2UiKQorcHVibGljIGNsYXNzIEVtcHR5QXJyYXlSZXNvdXJjZSB7CisKKyAgICAvLyB0aGUgcmVzb3VyY2UgSlNPTiByZXByZXNlbnRhdGlvbiB3aWxsIGJlIHNlcmlhbGl6ZWQgYnkgSmFja3NvbiBKQVgtUlMgcHJvdmlkZXIsCisgICAgLy8gd2hpbGUgdGhlIFhNTCB3aWxsIHN0aWxsIGJlIGdlbmVyYXRlZCBieSBKQVhCCisgICAgQEdFVAorICAgIEBQcm9kdWNlcyh7TWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04sIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUx9KQorICAgIHB1YmxpYyBFbXB0eUFycmF5QmVhbiBnZXRJdCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFbXB0eUFycmF5QmVhbigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2pzb24tamFja3Nvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2phY2tzb24vRXhjZXB0aW9uTWFwcGluZ1Rlc3RSZXNvdXJjZS5qYXZhIGIvZXhhbXBsZXMvanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamFja3Nvbi9FeGNlcHRpb25NYXBwaW5nVGVzdFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFmZWYwZQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2pzb24tamFja3Nvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2phY2tzb24vRXhjZXB0aW9uTWFwcGluZ1Rlc3RSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuamFja3NvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLlBVVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCisvKioKKyAqIFRlc3RpbmcgYmVhbiB0aGF0IGFjY2VwdHMgSlNPTiBmb3IgdGhlIFBVVCBtZXRob2QuCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgicGFyc2VFeGNlcHRpb25UZXN0IikKK3B1YmxpYyBjbGFzcyBFeGNlcHRpb25NYXBwaW5nVGVzdFJlc291cmNlIHsKKworICAgIEBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKyAgICBAUFVUCisgICAgcHVibGljIER1bW15QmVhbiBnZXRBY2NvdW50KER1bW15QmVhbiBiZWFuKSB7CisgICAgICAgIHJldHVybiBiZWFuOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2pzb24tamFja3Nvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2phY2tzb24vTXlBcHBsaWNhdGlvbi5qYXZhIGIvZXhhbXBsZXMvanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamFja3Nvbi9NeUFwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE0Yzk2NgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2pzb24tamFja3Nvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2phY2tzb24vTXlBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuamFja3NvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uSmFja3NvbkZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCisvKioKKyAqIHtAbGluayBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9ufSBkZXNjZW5kYW50LgorICoKKyAqIFVzZWQgdG8gc2V0IHJlc291cmNlIGFuZCBwcm92aWRlcnMgY2xhc3Nlcy4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgTXlBcHBsaWNhdGlvbiBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKyAgICBwdWJsaWMgTXlBcHBsaWNhdGlvbigpIHsKKyAgICAgICAgc3VwZXIoCisgICAgICAgICAgICAgICAgRW1wdHlBcnJheVJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIE5vbkpheGJCZWFuUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgQ29tYmluZWRBbm5vdGF0aW9uUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgLy8gcmVnaXN0ZXIgSmFja3NvbiBPYmplY3RNYXBwZXIgcmVzb2x2ZXIKKyAgICAgICAgICAgICAgICBNeU9iamVjdE1hcHBlclByb3ZpZGVyLmNsYXNzLAorICAgICAgICAgICAgICAgIEV4Y2VwdGlvbk1hcHBpbmdUZXN0UmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgSmFja3NvbkZlYXR1cmUuY2xhc3MKKyAgICAgICAgKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qYWNrc29uL015T2JqZWN0TWFwcGVyUHJvdmlkZXIuamF2YSBiL2V4YW1wbGVzL2pzb24tamFja3Nvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2phY2tzb24vTXlPYmplY3RNYXBwZXJQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmOTY1OGIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qYWNrc29uL015T2JqZWN0TWFwcGVyUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmphY2tzb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuQ29udGV4dFJlc29sdmVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5Bbm5vdGF0aW9uSW50cm9zcGVjdG9yOworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5EZXNlcmlhbGl6YXRpb25GZWF0dXJlOworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5PYmplY3RNYXBwZXI7CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLlNlcmlhbGl6YXRpb25GZWF0dXJlOworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5pbnRyb3NwZWN0LkphY2tzb25Bbm5vdGF0aW9uSW50cm9zcGVjdG9yOworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC50eXBlLlR5cGVGYWN0b3J5OworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5tb2R1bGUuamF4Yi5KYXhiQW5ub3RhdGlvbkludHJvc3BlY3RvcjsKKworLyoqCisgKiBUT0RPIGphdmFkb2MuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFByb3ZpZGVyCitwdWJsaWMgY2xhc3MgTXlPYmplY3RNYXBwZXJQcm92aWRlciBpbXBsZW1lbnRzIENvbnRleHRSZXNvbHZlcjxPYmplY3RNYXBwZXI+IHsKKworICAgIGZpbmFsIE9iamVjdE1hcHBlciBkZWZhdWx0T2JqZWN0TWFwcGVyOworICAgIGZpbmFsIE9iamVjdE1hcHBlciBjb21iaW5lZE9iamVjdE1hcHBlcjsKKworICAgIHB1YmxpYyBNeU9iamVjdE1hcHBlclByb3ZpZGVyKCkgeworICAgICAgICBkZWZhdWx0T2JqZWN0TWFwcGVyID0gY3JlYXRlRGVmYXVsdE1hcHBlcigpOworICAgICAgICBjb21iaW5lZE9iamVjdE1hcHBlciA9IGNyZWF0ZUNvbWJpbmVkT2JqZWN0TWFwcGVyKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdE1hcHBlciBnZXRDb250ZXh0KGZpbmFsIENsYXNzPD8+IHR5cGUpIHsKKworICAgICAgICBpZiAodHlwZSA9PSBDb21iaW5lZEFubm90YXRpb25CZWFuLmNsYXNzKSB7CisgICAgICAgICAgICByZXR1cm4gY29tYmluZWRPYmplY3RNYXBwZXI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdE9iamVjdE1hcHBlcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE9iamVjdE1hcHBlciBjcmVhdGVDb21iaW5lZE9iamVjdE1hcHBlcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RNYXBwZXIoKQorICAgICAgICAgICAgICAgIC5jb25maWd1cmUoU2VyaWFsaXphdGlvbkZlYXR1cmUuV1JBUF9ST09UX1ZBTFVFLCB0cnVlKQorICAgICAgICAgICAgICAgIC5jb25maWd1cmUoRGVzZXJpYWxpemF0aW9uRmVhdHVyZS5VTldSQVBfUk9PVF9WQUxVRSwgdHJ1ZSkKKyAgICAgICAgICAgICAgICAuc2V0QW5ub3RhdGlvbkludHJvc3BlY3RvcihjcmVhdGVKYXhiSmFja3NvbkFubm90YXRpb25JbnRyb3NwZWN0b3IoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0TWFwcGVyIGNyZWF0ZURlZmF1bHRNYXBwZXIoKSB7CisgICAgICAgIGZpbmFsIE9iamVjdE1hcHBlciByZXN1bHQgPSBuZXcgT2JqZWN0TWFwcGVyKCk7CisgICAgICAgIHJlc3VsdC5lbmFibGUoU2VyaWFsaXphdGlvbkZlYXR1cmUuSU5ERU5UX09VVFBVVCk7CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBBbm5vdGF0aW9uSW50cm9zcGVjdG9yIGNyZWF0ZUpheGJKYWNrc29uQW5ub3RhdGlvbkludHJvc3BlY3RvcigpIHsKKworICAgICAgICBmaW5hbCBBbm5vdGF0aW9uSW50cm9zcGVjdG9yIGpheGJJbnRyb3NwZWN0b3IgPSBuZXcgSmF4YkFubm90YXRpb25JbnRyb3NwZWN0b3IoVHlwZUZhY3RvcnkuZGVmYXVsdEluc3RhbmNlKCkpOworICAgICAgICBmaW5hbCBBbm5vdGF0aW9uSW50cm9zcGVjdG9yIGphY2tzb25JbnRyb3NwZWN0b3IgPSBuZXcgSmFja3NvbkFubm90YXRpb25JbnRyb3NwZWN0b3IoKTsKKworICAgICAgICByZXR1cm4gQW5ub3RhdGlvbkludHJvc3BlY3Rvci5wYWlyKGphY2tzb25JbnRyb3NwZWN0b3IsIGpheGJJbnRyb3NwZWN0b3IpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2pzb24tamFja3Nvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2phY2tzb24vTm9uSmF4YkJlYW4uamF2YSBiL2V4YW1wbGVzL2pzb24tamFja3Nvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2phY2tzb24vTm9uSmF4YkJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDQ2ZjNiCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamFja3Nvbi9Ob25KYXhiQmVhbi5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuamFja3NvbjsKKworLyoqCisgKiBUT0RPIGphdmFkb2MuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIE5vbkpheGJCZWFuIHsKKworICAgIHByaXZhdGUgU3RyaW5nIG5hbWUgPSAibm9uLUpBWEItYmVhbiI7CisgICAgcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb24gPSAiSSBhbSBub3QgYSBKQVhCIGJlYW4sIGp1c3QgYW4gdW5hbm5vdGF0ZWQgUE9KTyI7CisgICAgcHJpdmF0ZSBpbnRbXSBhcnJheSA9IHsxLCAxLCAyLCAzLCA1LCA4LCAxMywgMjF9OworCisgICAgcHVibGljIGludFtdIGdldEFycmF5KCkgeworICAgICAgICByZXR1cm4gYXJyYXk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QXJyYXkoaW50W10gYXJyYXkpIHsKKyAgICAgICAgdGhpcy5hcnJheSA9IGFycmF5OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKKyAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2pzb24tamFja3Nvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2phY2tzb24vTm9uSmF4YkJlYW5SZXNvdXJjZS5qYXZhIGIvZXhhbXBsZXMvanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamFja3Nvbi9Ob25KYXhiQmVhblJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhlMDFlNwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2pzb24tamFja3Nvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2phY2tzb24vTm9uSmF4YkJlYW5SZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuamFja3NvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkpTT05QOworCisvKioKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCIvbm9uSmF4YlJlc291cmNlIikKK3B1YmxpYyBjbGFzcyBOb25KYXhiQmVhblJlc291cmNlIHsKKworICAgIEBHRVQKKyAgICBASlNPTlAKKyAgICBAUHJvZHVjZXMoeyJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0IiwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT059KQorICAgIHB1YmxpYyBOb25KYXhiQmVhbiBnZXRTaW1wbGVCZWFuSlNPTlAoKSB7CisgICAgICAgIHJldHVybiBuZXcgTm9uSmF4YkJlYW4oKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9qc29uLWphY2tzb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qYWNrc29uL0phY2tzb25UZXN0LmphdmEgYi9leGFtcGxlcy9qc29uLWphY2tzb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qYWNrc29uL0phY2tzb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRlNjYyZQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2pzb24tamFja3Nvbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2phY2tzb24vSmFja3NvblRlc3QuamF2YQpAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5qYWNrc29uOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uSmFja3NvbkZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5NZWRpYVR5cGVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnV0aWwucnVubmVyLkNvbmN1cnJlbnRSdW5uZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJ1bldpdGgoQ29uY3VycmVudFJ1bm5lci5jbGFzcykKK3B1YmxpYyBjbGFzcyBKYWNrc29uVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKTsKKworICAgICAgICByZXR1cm4gQXBwLmNyZWF0ZUFwcCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihuZXcgSmFja3NvbkZlYXR1cmUoKSkucmVnaXN0ZXIoTXlPYmplY3RNYXBwZXJQcm92aWRlci5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlBcnJheVByZXNlbnQoKSB7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKTsKKyAgICAgICAgU3RyaW5nIHJlc3BvbnNlTXNnID0gdGFyZ2V0LnBhdGgoImVtcHR5QXJyYXlSZXNvdXJjZSIpLnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlTXNnLnJlcGxhY2VBbGwoIlsgXHRdKiIsICIiKS5jb250YWlucygiW10iKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SlNPTlBQcmVzZW50KCkgeworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCk7CisgICAgICAgIFN0cmluZyByZXNwb25zZU1zZyA9IHRhcmdldC5wYXRoKCJub25KYXhiUmVzb3VyY2UiKS5yZXF1ZXN0KCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0IikuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VNc2cuc3RhcnRzV2l0aCgiY2FsbGJhY2soIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpTT05Eb2VzTm90UmVmbGVjdEpTT05QV3JhcHBlcigpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpOworICAgICAgICBTdHJpbmcgcmVzcG9uc2VNc2cgPSB0YXJnZXQucGF0aCgibm9uSmF4YlJlc291cmNlIikucmVxdWVzdCgiYXBwbGljYXRpb24vanNvbiIpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUcnVlKCFyZXNwb25zZU1zZy5jb250YWlucygianNvblNvdXJjZSIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb21iaW5lZEFubm90YXRpb25SZXNvdXJjZSgpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpOworICAgICAgICBTdHJpbmcgcmVzcG9uc2VNc2cgPSB0YXJnZXQucGF0aCgiY29tYmluZWRBbm5vdGF0aW9ucyIpLnJlcXVlc3QoImFwcGxpY2F0aW9uL2pzb24iKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZU1zZy5jb250YWlucygiYWNjb3VudCIpICYmIHJlc3BvbnNlTXNnLmNvbnRhaW5zKCJ2YWx1ZSIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUFycmF5QmVhbigpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpOworICAgICAgICBFbXB0eUFycmF5QmVhbiByZXNwb25zZU1zZyA9IHRhcmdldC5wYXRoKCJlbXB0eUFycmF5UmVzb3VyY2UiKS5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorICAgICAgICAgICAgICAgIC5nZXQoRW1wdHlBcnJheUJlYW4uY2xhc3MpOworICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlTXNnKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb21iaW5lZEFubm90YXRpb25CZWFuKCkgeworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCk7CisgICAgICAgIENvbWJpbmVkQW5ub3RhdGlvbkJlYW4gcmVzcG9uc2VNc2cgPSB0YXJnZXQucGF0aCgiY29tYmluZWRBbm5vdGF0aW9ucyIpLnJlcXVlc3QoImFwcGxpY2F0aW9uL2pzb24iKQorICAgICAgICAgICAgICAgIC5nZXQoQ29tYmluZWRBbm5vdGF0aW9uQmVhbi5jbGFzcyk7CisgICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2VNc2cpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQElnbm9yZQorICAgIC8vIFRPRE8gdW4taWdub3JlIG9uY2UgYSBKU09OIHJlYWRlciBmb3IgImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiIGlzIHN1cHBvcnRlZAorICAgIHB1YmxpYyB2b2lkIHRlc3RKU09OUEJlYW4oKSB7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKTsKKyAgICAgICAgTm9uSmF4YkJlYW4gcmVzcG9uc2VNc2cgPSB0YXJnZXQucGF0aCgibm9uSmF4YlJlc291cmNlIikucmVxdWVzdCgiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpLmdldChOb25KYXhiQmVhbi5jbGFzcyk7CisgICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2VNc2cpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgaWYgYSBXQURMIGRvY3VtZW50IGlzIGF2YWlsYWJsZSBhdCB0aGUgcmVsYXRpdmUgcGF0aAorICAgICAqICJhcHBsaWNhdGlvbi53YWRsIi4KKyAgICAgKiA8cC8+CisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwbGljYXRpb25XYWRsKCkgeworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCk7CisgICAgICAgIFN0cmluZyBzZXJ2aWNlV2FkbCA9IHRhcmdldC5wYXRoKCJhcHBsaWNhdGlvbi53YWRsIikucmVxdWVzdChNZWRpYVR5cGVzLldBRExfVFlQRSkuZ2V0KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShzZXJ2aWNlV2FkbC5sZW5ndGgoKSA+IDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QsIHRoYXQgaW4gY2FzZSBvZiBtYWxmb3JtZWQgSlNPTiwgdGhlIGphY2tzb24gZXhjZXB0aW9uIG1hcHBlcnMgd2lsbCBiZSB1c2VkIGFuZCB0aGUgcmVzcG9uc2Ugd2lsbCBiZQorICAgICAqIDQwMCAtIGJhZCByZXF1ZXN0IGluc3RlYWQgb2YgNTAwIC0gc2VydmVyIGVycm9yCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhjZXB0aW9uTWFwcGluZygpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKyAgICAgICAgLy8gY3JlYXRlIGEgcmVxdWVzdCB3aXRoIGludmFsaWQganNvbiBzdHJpbmcgdG8gY2F1c2UgYW4gZXhjZXB0aW9uIGluIEphY2tzb24KKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJwYXJzZUV4Y2VwdGlvblRlc3QiKS5yZXF1ZXN0KCJhcHBsaWNhdGlvbi9qc29uIikKKyAgICAgICAgICAgICAgICAucHV0KEVudGl0eS5lbnRpdHkoIk1hbGZvcm1lZCBqc29uIHN0cmluZy4iLCBNZWRpYVR5cGUudmFsdWVPZigiYXBwbGljYXRpb24vanNvbiIpKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJlc3BvbnNlLlN0YXR1cy5CQURfUkVRVUVTVC5nZXRTdGF0dXNDb2RlKCksIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9qc29uLWphY2tzb24xL1JFQURNRS5NRCBiL2V4YW1wbGVzL2pzb24tamFja3NvbjEvUkVBRE1FLk1ECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlYjdmYTIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9qc29uLWphY2tzb24xL1JFQURNRS5NRApAQCAtMCwwICsxLDkxIEBACitbLy9dOiAjICIgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICIKK1svL106ICMgIiAiCitbLy9dOiAjICIgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlICIKK1svL106ICMgIiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCAiCitbLy9dOiAjICIgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLiAiCitbLy9dOiAjICIgIgorWy8vXTogIyAiIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UgIgorCitKYWNrc29uICgxLngpIEpBWC1SUyBKU09OIFByb3ZpZGVyIEV4YW1wbGUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byBwcm9kdWNlL2NvbnN1bWUgSlNPTiByZXByZXNlbnRhdGlvbnMKK2Zyb20gSmF2YSBvYmplY3RzLiBUaGlzIGFwcGxpZXMgbm90IG9ubHkgdG8gSkFYQiBiZWFucywgYXMgc2hvd24gaW4gdGhlCitganNvbi1mcm9tLWpheGJgIGV4YW1wbGUgYnV0IGFsc28gdG8gb3JkaW5hcnksIHVuLWFubm90YXRlZCwgUE9KT3MuCisKK1RoaXMgZXhhbXBsZSBob3N0cyB0aHJlZSBzaW1wbGUgcmVhZC1vbmx5IHJlc291cmNlczogT25lIHByb3ZpZGVzIGFuCitleGFtcGxlIG9mIHVzaW5nIGEgSmFja3NvbiBKU09OIHByb3ZpZGVyIChyZWdpc3RlcmVkIGJ5IHRoZSBmZWF0dXJlCitgSmFja3NvbjFGZWF0dXJlYCBpbiB0aGUgYE15QXBwbGljYXRpb25gIGNsYXNzKSBpbnN0ZWFkIG9mIHVzaW5nIEpBWEIKKyhPYmplY3QtJmd0O0pBWEItJmd0O0pTT04pIHdoaWNoIGhhcyBzb21lIGxpbWl0YXRpb25zIChlLmcuIGVtcHR5IGFycmF5cworaW4gSkFYQiBiZWFucykuIEZvciB0aGlzIHJlc291cmNlIHRoZSBKU09OIHJlcHJlc2VudGF0aW9uIGlzIHByb2R1Y2VkIGJ5Cit0aGUgSmFja3NvbiBKQVgtUlMgcHJvdmlkZXIsIHdoaWxlIHRoZSBYTUwgcmVwcmVzZW50YXRpb24gaXMgZ2VuZXJhdGVkCitieSBKQVhCIGFzIHVzdWFsLiBUaGUgc2Vjb25kIHdlYiByZXNvdXJjZSBpcyBiYXNlZCBvbiBhIHNpbXBsZQordW4tYW5ub3RhdGVkIFBPSk8gYW5kIHByb3ZpZGVzIG9ubHkgSlNPTi1iYXNlZCByZXByZXNlbnRhdGlvbnM6IEpTT04gYW5kCitKU09OIHdpdGggcGFkZGluZyAoSlNPTlApLiBUaGUgdGhpcmQgcmVzb3VyY2UgZGVwaWN0cyBob3cgSmFja3NvbiBhbmQKK0pBWEIgYW5ub3RhdGlvbnMgY291bGQgYmUgbWl4ZWQgdG9nZXRoZXIgd2l0aGluIGEgc2luZ2xlIFBPSk8uCisKK0NvbnRlbnRzCistLS0tLS0tLQorCitUaGUgImVtcHR5IGFycmF5IiB3ZWIgcmVzb3VyY2UgaXMgaW1wbGVtZW50ZWQgYnkgdGhlCitgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuamFja3NvbjEuRW1wdHlBcnJheVJlc291cmNlYCBjbGFzcy4KKworVGhlICJub24gSkFYQiIgd2ViIHJlc291cmNlIGlzIGltcGxlbWVudGVkIGJ5IHRoZQorYG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmphY2tzb24xLk5vbkpheGJCZWFuUmVzb3VyY2VgIGNsYXNzLgorCitCb3RoIHJlc291cmNlcyB1c2UgdGhlIGRlZmF1bHQgSmFja3NvbiBtYXBwZXIgY29uZmlndXJhdGlvbiB0byBzZXJpYWxpemUgSlNPTgorZGF0YSBvdXQgYW5kIGRlcGljdHMgdGhlIGNvcm5lciBjYXNlcywgd2hlcmUgdGhlIEplcnNleSBpbnRlcm5hbCwgU3RBWAorYmFzZWQsIEpTT04gcHJvY2Vzc2luZyBjYW4gbm90IGJlIHV0aWxpemVkLgorCitUaGUgYG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmphY2tzb24xLkNvbWJpbmVkQW5ub3RhdGlvblJlc291cmNlYAorY2xhc3MgaXMgdXNlZCB0byBzaG93IGhvdyBKQVhCIGFuZCBKYWNrc29uIGFubm90YXRpb25zIGNvdWxkIGJlIGNvbWJpbmVkCit0b2dldGhlciBpbiBvbmUgSmF2YSBiZWFuIGZvciBKU09OIHNlcmlhbGl6YXRpb24uCisKK1NlZSB0aGUgYG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmphY2tzb24xLk15T2JqZWN0TWFwcGVyUHJvdmlkZXJgIGNsYXNzCit3aGVyZSBKYWNrc29uIHNwZWNpZmljIG9wdGlvbnMgYXJlIHVzZWQgdG8gc2V0IHVwIHRoZSBkZXNpcmVkIEpTT04KK3NlcmlhbGl6YXRpb24gY29uZmlndXJhdGlvbi4KKworVGhlIG1hcHBpbmcgb2YgdGhlIFVSSSBwYXRoIHNwYWNlIGlzIHByZXNlbnRlZCBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOgorCitVUkkgcGF0aCAgICAgICAgICAgICAgICAgICAgIHwgUmVzb3VyY2UgY2xhc3MgICAgICAgICAgICAgICB8IEhUVFAgbWV0aG9kCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0KKyoqXy9lbXB0eUFycmF5UmVzb3VyY2VfKiogICAgfCBFbXB0eUFycmF5UmVzb3VyY2UgICAgICAgICAgIHwgR0VUCisqKl8vbm9uSmF4YlJlc291cmNlXyoqICAgICAgIHwgTm9uSmF4YkJlYW5SZXNvdXJjZSAgICAgICAgICB8IEdFVAorKipfL2NvbWJpbmVkQW5ub3RhdGlvbnNfKiogICB8IENvbWJpbmVkQW5ub3RhdGlvblJlc291cmNlICAgfCBHRVQKKworVG8gdXNlIEphY2tzb24gc3BlY2lmaWMgY29uZmlndXJhdGlvbiBvcHRpb25zLCBvbmUgY2FuIGltcGxlbWVudCBhCitgQ29udGV4dFJlc29sdmVyPE9iamVjdE1hcHBlcj5gIHByb3ZpZGVyLiBGb3IgYW4gZXhhbXBsZSBvZiBzdWNoIGFuCitpbXBsZW1lbnRhdGlvbiwgc2VlIHRoZSBgTXlPYmplY3RNYXBwZXJQcm92aWRlcmAgY2xhc3MuCisKK1J1bm5pbmcgdGhlIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworUnVuIHRoZSBleGFtcGxlIGFzIGZvbGxvd3M6CisKKz4gICAgIG12biBjbGVhbiBjb21waWxlIGV4ZWM6amF2YQorCitUaGlzIGRlcGxveXMgdGhlIGV4YW1wbGUgdXNpbmcgW0dyaXp6bHldKGh0dHA6Ly9ncml6emx5LmphdmEubmV0LykKKworQSBbV0FETCBkZXNjcmlwdGlvbl0oaHR0cDovL3dhZGwuamF2YS5uZXQvI3NwZWMpIG1heSBiZSBhY2Nlc3NlZCBhdCB0aGUgVVJMOgorCistICAgYGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qYWNrc29uMS9hcHBsaWNhdGlvbi53YWRsYAorCitUaGUgdGhyZWUgcmVzb3VyY2VzIGFyZSBhdmFpbGFibGUgYXQKKworLSAgIDxodHRwOi8vbG9jYWxob3N0OjgwODAvamFja3NvbjEvZW1wdHlBcnJheVJlc291cmNlPgorLSAgIDxodHRwOi8vbG9jYWxob3N0OjgwODAvamFja3NvbjEvbm9uSmF4YlJlc291cmNlPgorLSAgIDxodHRwOi8vbG9jYWxob3N0OjgwODAvamFja3NvbjEvY29tYmluZWRBbm5vdGF0aW9ucz4KKworVG8gZWFzaWx5IG9idGFpbiB0aGUgZGlmZmVyZW50IG91dHB1dCB0eXBlcyBhdmFpbGFibGUsIFtjVVJMXShodHRwOi8vY3VybC5oYXh4LnNlLykgY2FuIGJlIHVzZWQgYXMgZm9sbG93czoKKworT2J0YWluIHRoZSBKU09OIG91dHB1dCBvZiBFbXB0eUFycmF5UmVzb3VyY2UgKHVzZSBgLUhBY2NlcHQ6YXBwbGljYXRpb24veG1sYCBmb3IgWE1MIG91dHB1dCk6CisKKz4gICAgIGN1cmwgLUhBY2NlcHQ6YXBwbGljYXRpb24vanNvbiBodHRwOi8vbG9jYWxob3N0OjgwODAvamFja3NvbjEvZW1wdHlBcnJheVJlc291cmNlCisKK09idGFpbiB0aGUgSlNPTiBvdXRwdXQgb2YgTm9uSmF4YkJlYW5SZXNvdXJjZSAodXNlIGAtSEFjY2VwdDphcHBsaWNhdGlvbi9qYXZhc2NyaXB0YCBmb3IgSlNPTlAgb3V0cHV0KToKKworPiAgICAgY3VybCAtSEFjY2VwdDphcHBsaWNhdGlvbi9qc29uIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qYWNrc29uMS9ub25KYXhiUmVzb3VyY2UKKworT2J0YWluIHRoZSBKU09OIG91dHB1dCBvZiBDb21iaW5lZEFubm90YXRpb25SZXNvdXJjZToKKworPiAgICAgY3VybCAtSEFjY2VwdDphcHBsaWNhdGlvbi9qc29uIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qYWNrc29uMS9jb21iaW5lZEFubm90YXRpb25zCmRpZmYgLS1naXQgYS9leGFtcGxlcy9qc29uLWphY2tzb24xL3BvbS54bWwgYi9leGFtcGxlcy9qc29uLWphY2tzb24xL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY4YzY0NQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2pzb24tamFja3NvbjEvcG9tLnhtbApAQCAtMCwwICsxLDc3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmpzb24tamFja3NvbjE8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktZXhhbXBsZXMtanNvbi1qYWNrc29uMTwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgSlNPTiB3aXRoIEphY2tzb24gMS54IGV4YW1wbGUuPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItZ3JpenpseTItaHR0cDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1oazI8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1qc29uLWphY2tzb24xPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItYnVuZGxlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHR5cGU+cG9tPC90eXBlPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGVjLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPG1haW5DbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5qYWNrc29uMS5BcHA8L21haW5DbGFzcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnJlbGVhc2U8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvanNvbi1qYWNrc29uMS9zcmMvbWFpbi9hc3NlbWJseS9zcmMueG1sIGIvZXhhbXBsZXMvanNvbi1qYWNrc29uMS9zcmMvbWFpbi9hc3NlbWJseS9zcmMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMzA0MzMKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9qc29uLWphY2tzb24xL3NyYy9tYWluL2Fzc2VtYmx5L3NyYy54bWwKQEAgLTAsMCArMSwyOCBAQAorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzxhc3NlbWJseT4KKyAgICA8aWQ+cHJvamVjdDwvaWQ+CisgICAgPGZvcm1hdHM+CisgICAgICAgIDxmb3JtYXQ+emlwPC9mb3JtYXQ+CisgICAgPC9mb3JtYXRzPgorICAgIDxmaWxlU2V0cz4KKyAgICAgICAgPGZpbGVTZXQ+CisgICAgICAgICAgICA8ZGlyZWN0b3J5Pi48L2RpcmVjdG9yeT4KKyAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+PC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICA8dXNlRGVmYXVsdEV4Y2x1ZGVzPnRydWU8L3VzZURlZmF1bHRFeGNsdWRlcz4KKyAgICAgICAgICAgIDxleGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qKi90YXJnZXQvKio8L2V4Y2x1ZGU+CisgICAgICAgICAgICA8L2V4Y2x1ZGVzPgorICAgICAgICA8L2ZpbGVTZXQ+CisgICAgPC9maWxlU2V0cz4KKzwvYXNzZW1ibHk+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9qc29uLWphY2tzb24xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamFja3NvbjEvQXBwLmphdmEgYi9leGFtcGxlcy9qc29uLWphY2tzb24xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamFja3NvbjEvQXBwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNkOGRmYgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2pzb24tamFja3NvbjEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qYWNrc29uMS9BcHAuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmphY2tzb24xOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5Mi5odHRwc2VydmVyLkdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmdyaXp6bHkuaHR0cC5zZXJ2ZXIuSHR0cFNlcnZlcjsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIHdoaWNoIGNyZWF0ZXMge0BsaW5rIE15QXBwbGljYXRpb259IGluc3RhbmNlcyBhbmQgcHJvdmlkZXMgc3VwcG9ydAorICogZm9yIHJ1bm5pbmcgdGhpcyBzYW1wbGUgZnJvbSBjb21tYW5kIGxpbmUuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEFwcCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgQkFTRV9VUkkgPSBVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvamFja3NvbjEvIik7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihmaW5hbCBTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkpTT04gd2l0aCBKYWNrc29uIEplcnNleSBFeGFtcGxlIEFwcCIpOworCisgICAgICAgICAgICBmaW5hbCBIdHRwU2VydmVyIHNlcnZlciA9IEdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeS5jcmVhdGVIdHRwU2VydmVyKEJBU0VfVVJJLCBjcmVhdGVBcHAoKSwgZmFsc2UpOworICAgICAgICAgICAgUnVudGltZS5nZXRSdW50aW1lKCkuYWRkU2h1dGRvd25Ib29rKG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyLnNodXRkb3duTm93KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkpOworICAgICAgICAgICAgc2VydmVyLnN0YXJ0KCk7CisKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihTdHJpbmcuZm9ybWF0KCJBcHBsaWNhdGlvbiBzdGFydGVkLiVuU3RvcCB0aGUgYXBwbGljYXRpb24gdXNpbmcgQ1RSTCtDIikpOworCisgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gfCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihBcHAuY2xhc3MuZ2V0TmFtZSgpKS5sb2coTGV2ZWwuU0VWRVJFLCBudWxsLCBleCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VDb25maWcgY3JlYXRlQXBwKCkgeworICAgICAgICByZXR1cm4gbmV3IE15QXBwbGljYXRpb24oKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9qc29uLWphY2tzb24xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamFja3NvbjEvQ29tYmluZWRBbm5vdGF0aW9uQmVhbi5qYXZhIGIvZXhhbXBsZXMvanNvbi1qYWNrc29uMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2phY2tzb24xL0NvbWJpbmVkQW5ub3RhdGlvbkJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGFkM2IyCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvanNvbi1qYWNrc29uMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2phY2tzb24xL0NvbWJpbmVkQW5ub3RhdGlvbkJlYW4uamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmphY2tzb24xOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKK2ltcG9ydCBvcmcuY29kZWhhdXMuamFja3Nvbi5hbm5vdGF0ZS5Kc29uUHJvcGVydHk7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFhtbFJvb3RFbGVtZW50KG5hbWUgPSAiYWNjb3VudCIpCitwdWJsaWMgY2xhc3MgQ29tYmluZWRBbm5vdGF0aW9uQmVhbiB7CisKKyAgICBASnNvblByb3BlcnR5KCJ2YWx1ZSIpCisgICAgaW50IHg7CisKKyAgICBwdWJsaWMgQ29tYmluZWRBbm5vdGF0aW9uQmVhbihmaW5hbCBpbnQgeCkgeworICAgICAgICB0aGlzLnggPSB4OworICAgIH0KKworICAgIHB1YmxpYyBDb21iaW5lZEFubm90YXRpb25CZWFuKCkgeworICAgICAgICB0aGlzKDE1KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9qc29uLWphY2tzb24xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamFja3NvbjEvQ29tYmluZWRBbm5vdGF0aW9uUmVzb3VyY2UuamF2YSBiL2V4YW1wbGVzL2pzb24tamFja3NvbjEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qYWNrc29uMS9Db21iaW5lZEFubm90YXRpb25SZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MWQ5MzAKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9qc29uLWphY2tzb24xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamFja3NvbjEvQ29tYmluZWRBbm5vdGF0aW9uUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmphY2tzb24xOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoImNvbWJpbmVkQW5ub3RhdGlvbnMiKQorcHVibGljIGNsYXNzIENvbWJpbmVkQW5ub3RhdGlvblJlc291cmNlIHsKKworICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKyAgICBAR0VUCisgICAgcHVibGljIENvbWJpbmVkQW5ub3RhdGlvbkJlYW4gZ2V0QWNjb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDb21iaW5lZEFubm90YXRpb25CZWFuKDEyKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9qc29uLWphY2tzb24xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamFja3NvbjEvRHVtbXlCZWFuLmphdmEgYi9leGFtcGxlcy9qc29uLWphY2tzb24xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamFja3NvbjEvRHVtbXlCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNlNjZlMQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2pzb24tamFja3NvbjEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qYWNrc29uMS9EdW1teUJlYW4uamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmphY2tzb24xOworCisvKioKKyAqIFRlc3RpbmcgYmVhbiBmb3IgRXhjZXB0aW9uTWFwcGluZ1Rlc3RSZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgRHVtbXlCZWFuIHsKKworICAgIHByaXZhdGUgaW50IGtleTsKKyAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0S2V5KCkgeworICAgICAgICByZXR1cm4ga2V5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEtleShmaW5hbCBpbnQga2V5KSB7CisgICAgICAgIHRoaXMua2V5ID0ga2V5OworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvanNvbi1qYWNrc29uMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2phY2tzb24xL0VtcHR5QXJyYXlCZWFuLmphdmEgYi9leGFtcGxlcy9qc29uLWphY2tzb24xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamFja3NvbjEvRW1wdHlBcnJheUJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmMxMTY0Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvanNvbi1qYWNrc29uMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2phY2tzb24xL0VtcHR5QXJyYXlCZWFuLmphdmEKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5qYWNrc29uMTsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFhtbFJvb3RFbGVtZW50CitwdWJsaWMgY2xhc3MgRW1wdHlBcnJheUJlYW4geworCisgICAgcHVibGljIFN0cmluZ1tdIGVtdHB5QXJyYXkgPSBuZXcgU3RyaW5nWzBdOworfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvanNvbi1qYWNrc29uMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2phY2tzb24xL0VtcHR5QXJyYXlSZXNvdXJjZS5qYXZhIGIvZXhhbXBsZXMvanNvbi1qYWNrc29uMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2phY2tzb24xL0VtcHR5QXJyYXlSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzYWM5ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9qc29uLWphY2tzb24xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamFja3NvbjEvRW1wdHlBcnJheVJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5qYWNrc29uMTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCisvKioKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCIvZW1wdHlBcnJheVJlc291cmNlIikKK3B1YmxpYyBjbGFzcyBFbXB0eUFycmF5UmVzb3VyY2UgeworCisgICAgLy8gdGhlIHJlc291cmNlIEpTT04gcmVwcmVzZW50YXRpb24gd2lsbCBiZSBzZXJpYWxpemVkIGJ5IEphY2tzb24gSkFYLVJTIHByb3ZpZGVyLAorICAgIC8vIHdoaWxlIHRoZSBYTUwgd2lsbCBzdGlsbCBiZSBnZW5lcmF0ZWQgYnkgSkFYQgorICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoe01lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MfSkKKyAgICBwdWJsaWMgRW1wdHlBcnJheUJlYW4gZ2V0SXQoKSB7CisgICAgICAgIHJldHVybiBuZXcgRW1wdHlBcnJheUJlYW4oKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9qc29uLWphY2tzb24xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamFja3NvbjEvRXhjZXB0aW9uTWFwcGluZ1Rlc3RSZXNvdXJjZS5qYXZhIGIvZXhhbXBsZXMvanNvbi1qYWNrc29uMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2phY2tzb24xL0V4Y2VwdGlvbk1hcHBpbmdUZXN0UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDJiNzBjCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvanNvbi1qYWNrc29uMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2phY2tzb24xL0V4Y2VwdGlvbk1hcHBpbmdUZXN0UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmphY2tzb24xOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuUFVUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKKy8qKgorICogVGVzdGluZyBiZWFuIHRoYXQgYWNjZXB0cyBKU09OIGZvciB0aGUgUFVUIG1ldGhvZC4KKyAqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJwYXJzZUV4Y2VwdGlvblRlc3QiKQorcHVibGljIGNsYXNzIEV4Y2VwdGlvbk1hcHBpbmdUZXN0UmVzb3VyY2UgeworCisgICAgQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorICAgIEBQVVQKKyAgICBwdWJsaWMgRHVtbXlCZWFuIGdldEFjY291bnQoZmluYWwgRHVtbXlCZWFuIGJlYW4pIHsKKyAgICAgICAgcmV0dXJuIGJlYW47CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvanNvbi1qYWNrc29uMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2phY2tzb24xL015QXBwbGljYXRpb24uamF2YSBiL2V4YW1wbGVzL2pzb24tamFja3NvbjEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qYWNrc29uMS9NeUFwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk2NzY5NwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2pzb24tamFja3NvbjEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qYWNrc29uMS9NeUFwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5qYWNrc29uMTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24xLkphY2tzb24xRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKKy8qKgorICoge0BsaW5rIGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb259IGRlc2NlbmRhbnQuCisgKgorICogVXNlZCB0byBzZXQgcmVzb3VyY2UgYW5kIHByb3ZpZGVycyBjbGFzc2VzLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBNeUFwcGxpY2F0aW9uIGV4dGVuZHMgUmVzb3VyY2VDb25maWcgeworCisgICAgcHVibGljIE15QXBwbGljYXRpb24oKSB7CisgICAgICAgIHN1cGVyKAorICAgICAgICAgICAgICAgIEVtcHR5QXJyYXlSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBOb25KYXhiQmVhblJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIENvbWJpbmVkQW5ub3RhdGlvblJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIC8vIHJlZ2lzdGVyIEphY2tzb24gT2JqZWN0TWFwcGVyIHJlc29sdmVyCisgICAgICAgICAgICAgICAgTXlPYmplY3RNYXBwZXJQcm92aWRlci5jbGFzcywKKyAgICAgICAgICAgICAgICBFeGNlcHRpb25NYXBwaW5nVGVzdFJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIEphY2tzb24xRmVhdHVyZS5jbGFzcworICAgICAgICApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2pzb24tamFja3NvbjEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qYWNrc29uMS9NeU9iamVjdE1hcHBlclByb3ZpZGVyLmphdmEgYi9leGFtcGxlcy9qc29uLWphY2tzb24xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamFja3NvbjEvTXlPYmplY3RNYXBwZXJQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNjk5NmYKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9qc29uLWphY2tzb24xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamFja3NvbjEvTXlPYmplY3RNYXBwZXJQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuamFja3NvbjE7CisKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuQ29udGV4dFJlc29sdmVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5qYWNrc29uLm1hcC5Bbm5vdGF0aW9uSW50cm9zcGVjdG9yOworaW1wb3J0IG9yZy5jb2RlaGF1cy5qYWNrc29uLm1hcC5Bbm5vdGF0aW9uSW50cm9zcGVjdG9yLlBhaXI7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmphY2tzb24ubWFwLkRlc2VyaWFsaXphdGlvbkNvbmZpZzsKK2ltcG9ydCBvcmcuY29kZWhhdXMuamFja3Nvbi5tYXAuT2JqZWN0TWFwcGVyOworaW1wb3J0IG9yZy5jb2RlaGF1cy5qYWNrc29uLm1hcC5TZXJpYWxpemF0aW9uQ29uZmlnOworaW1wb3J0IG9yZy5jb2RlaGF1cy5qYWNrc29uLm1hcC5TZXJpYWxpemF0aW9uQ29uZmlnLkZlYXR1cmU7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmphY2tzb24ubWFwLmludHJvc3BlY3QuSmFja3NvbkFubm90YXRpb25JbnRyb3NwZWN0b3I7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmphY2tzb24ueGMuSmF4YkFubm90YXRpb25JbnRyb3NwZWN0b3I7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFByb3ZpZGVyCitwdWJsaWMgY2xhc3MgTXlPYmplY3RNYXBwZXJQcm92aWRlciBpbXBsZW1lbnRzIENvbnRleHRSZXNvbHZlcjxPYmplY3RNYXBwZXI+IHsKKworICAgIGZpbmFsIE9iamVjdE1hcHBlciBkZWZhdWx0T2JqZWN0TWFwcGVyOworICAgIGZpbmFsIE9iamVjdE1hcHBlciBjb21iaW5lZE9iamVjdE1hcHBlcjsKKworICAgIHB1YmxpYyBNeU9iamVjdE1hcHBlclByb3ZpZGVyKCkgeworICAgICAgICBkZWZhdWx0T2JqZWN0TWFwcGVyID0gY3JlYXRlRGVmYXVsdE1hcHBlcigpOworICAgICAgICBjb21iaW5lZE9iamVjdE1hcHBlciA9IGNyZWF0ZUNvbWJpbmVkT2JqZWN0TWFwcGVyKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdE1hcHBlciBnZXRDb250ZXh0KGZpbmFsIENsYXNzPD8+IHR5cGUpIHsKKworICAgICAgICBpZiAodHlwZSA9PSBDb21iaW5lZEFubm90YXRpb25CZWFuLmNsYXNzKSB7CisgICAgICAgICAgICByZXR1cm4gY29tYmluZWRPYmplY3RNYXBwZXI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZGVmYXVsdE9iamVjdE1hcHBlcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE9iamVjdE1hcHBlciBjcmVhdGVDb21iaW5lZE9iamVjdE1hcHBlcigpIHsKKyAgICAgICAgZmluYWwgUGFpciBjb21iaW5lZEludHJvc3BlY3RvciA9IGNyZWF0ZUpheGJKYWNrc29uQW5ub3RhdGlvbkludHJvc3BlY3RvcigpOworICAgICAgICBmaW5hbCBPYmplY3RNYXBwZXIgcmVzdWx0ID0gbmV3IE9iamVjdE1hcHBlcigpOworICAgICAgICByZXN1bHQuY29uZmlndXJlKFNlcmlhbGl6YXRpb25Db25maWcuRmVhdHVyZS5XUkFQX1JPT1RfVkFMVUUsIHRydWUpOworICAgICAgICByZXN1bHQuY29uZmlndXJlKERlc2VyaWFsaXphdGlvbkNvbmZpZy5GZWF0dXJlLlVOV1JBUF9ST09UX1ZBTFVFLCB0cnVlKTsKKyAgICAgICAgcmVzdWx0LnNldERlc2VyaWFsaXphdGlvbkNvbmZpZyhyZXN1bHQuZ2V0RGVzZXJpYWxpemF0aW9uQ29uZmlnKCkud2l0aEFubm90YXRpb25JbnRyb3NwZWN0b3IoY29tYmluZWRJbnRyb3NwZWN0b3IpKTsKKyAgICAgICAgcmVzdWx0LnNldFNlcmlhbGl6YXRpb25Db25maWcocmVzdWx0LmdldFNlcmlhbGl6YXRpb25Db25maWcoKS53aXRoQW5ub3RhdGlvbkludHJvc3BlY3Rvcihjb21iaW5lZEludHJvc3BlY3RvcikpOworCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0TWFwcGVyIGNyZWF0ZURlZmF1bHRNYXBwZXIoKSB7CisKKyAgICAgICAgZmluYWwgT2JqZWN0TWFwcGVyIHJlc3VsdCA9IG5ldyBPYmplY3RNYXBwZXIoKTsKKyAgICAgICAgcmVzdWx0LmNvbmZpZ3VyZShGZWF0dXJlLklOREVOVF9PVVRQVVQsIHRydWUpOworCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgUGFpciBjcmVhdGVKYXhiSmFja3NvbkFubm90YXRpb25JbnRyb3NwZWN0b3IoKSB7CisKKyAgICAgICAgZmluYWwgQW5ub3RhdGlvbkludHJvc3BlY3RvciBqYXhiSW50cm9zcGVjdG9yID0gbmV3IEpheGJBbm5vdGF0aW9uSW50cm9zcGVjdG9yKCk7CisgICAgICAgIGZpbmFsIEFubm90YXRpb25JbnRyb3NwZWN0b3IgamFja3NvbkludHJvc3BlY3RvciA9IG5ldyBKYWNrc29uQW5ub3RhdGlvbkludHJvc3BlY3RvcigpOworCisgICAgICAgIHJldHVybiBuZXcgQW5ub3RhdGlvbkludHJvc3BlY3Rvci5QYWlyKGphY2tzb25JbnRyb3NwZWN0b3IsIGpheGJJbnRyb3NwZWN0b3IpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2pzb24tamFja3NvbjEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qYWNrc29uMS9Ob25KYXhiQmVhbi5qYXZhIGIvZXhhbXBsZXMvanNvbi1qYWNrc29uMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2phY2tzb24xL05vbkpheGJCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU2OGYzOQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2pzb24tamFja3NvbjEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qYWNrc29uMS9Ob25KYXhiQmVhbi5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuamFja3NvbjE7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIE5vbkpheGJCZWFuIHsKKworICAgIHByaXZhdGUgU3RyaW5nIG5hbWUgPSAibm9uLUpBWEItYmVhbiI7CisgICAgcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb24gPSAiSSBhbSBub3QgYSBKQVhCIGJlYW4sIGp1c3QgYW4gdW5hbm5vdGF0ZWQgUE9KTyI7CisgICAgcHJpdmF0ZSBpbnRbXSBhcnJheSA9IHsxLCAxLCAyLCAzLCA1LCA4LCAxMywgMjF9OworCisgICAgcHVibGljIGludFtdIGdldEFycmF5KCkgeworICAgICAgICByZXR1cm4gYXJyYXk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QXJyYXkoZmluYWwgaW50W10gYXJyYXkpIHsKKyAgICAgICAgdGhpcy5hcnJheSA9IGFycmF5OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKKyAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2pzb24tamFja3NvbjEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qYWNrc29uMS9Ob25KYXhiQmVhblJlc291cmNlLmphdmEgYi9leGFtcGxlcy9qc29uLWphY2tzb24xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamFja3NvbjEvTm9uSmF4YkJlYW5SZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5YWJkMzQKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9qc29uLWphY2tzb24xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamFja3NvbjEvTm9uSmF4YkJlYW5SZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuamFja3NvbjE7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5KU09OUDsKKworLyoqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiL25vbkpheGJSZXNvdXJjZSIpCitwdWJsaWMgY2xhc3MgTm9uSmF4YkJlYW5SZXNvdXJjZSB7CisKKyAgICBAR0VUCisgICAgQEpTT05QCisgICAgQFByb2R1Y2VzKHsiYXBwbGljYXRpb24vamF2YXNjcmlwdCIsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OfSkKKyAgICBwdWJsaWMgTm9uSmF4YkJlYW4gZ2V0U2ltcGxlQmVhbkpTT05QKCkgeworICAgICAgICByZXR1cm4gbmV3IE5vbkpheGJCZWFuKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvanNvbi1qYWNrc29uMS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2phY2tzb24xL0phY2tzb24xVGVzdC5qYXZhIGIvZXhhbXBsZXMvanNvbi1qYWNrc29uMS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2phY2tzb24xL0phY2tzb24xVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNzhmMjYKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9qc29uLWphY2tzb24xL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamFja3NvbjEvSmFja3NvbjFUZXN0LmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuamFja3NvbjE7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamFja3NvbjEuSmFja3NvbjFGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuTWVkaWFUeXBlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEphY2tzb24xVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKTsKKworICAgICAgICByZXR1cm4gQXBwLmNyZWF0ZUFwcCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChmaW5hbCBDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihKYWNrc29uMUZlYXR1cmUuY2xhc3MpLnJlZ2lzdGVyKE15T2JqZWN0TWFwcGVyUHJvdmlkZXIuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5QXJyYXlQcmVzZW50KCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzcG9uc2VNc2cgPSB0YXJnZXQoImVtcHR5QXJyYXlSZXNvdXJjZSIpLnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlTXNnLnJlcGxhY2VBbGwoIlsgXHRdKiIsICIiKS5jb250YWlucygiW10iKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SlNPTlBQcmVzZW50KCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzcG9uc2VNc2cgPSB0YXJnZXQoIm5vbkpheGJSZXNvdXJjZSIpLnJlcXVlc3QoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZU1zZy5zdGFydHNXaXRoKCJjYWxsYmFjaygiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SlNPTkRvZXNOb3RSZWZsZWN0SlNPTlBXcmFwcGVyKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzcG9uc2VNc2cgPSB0YXJnZXQoIm5vbkpheGJSZXNvdXJjZSIpLnJlcXVlc3QoImFwcGxpY2F0aW9uL2pzb24iKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghcmVzcG9uc2VNc2cuY29udGFpbnMoImpzb25Tb3VyY2UiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tYmluZWRBbm5vdGF0aW9uUmVzb3VyY2UoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXNwb25zZU1zZyA9IHRhcmdldCgiY29tYmluZWRBbm5vdGF0aW9ucyIpLnJlcXVlc3QoImFwcGxpY2F0aW9uL2pzb24iKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZU1zZy5jb250YWlucygiYWNjb3VudCIpICYmIHJlc3BvbnNlTXNnLmNvbnRhaW5zKCJ2YWx1ZSIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUFycmF5QmVhbigpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh0YXJnZXQoImVtcHR5QXJyYXlSZXNvdXJjZSIpLnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pLmdldChFbXB0eUFycmF5QmVhbi5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbWJpbmVkQW5ub3RhdGlvbkJlYW4oKSB7CisgICAgICAgIGFzc2VydE5vdE51bGwodGFyZ2V0KCJjb21iaW5lZEFubm90YXRpb25zIikucmVxdWVzdCgiYXBwbGljYXRpb24vanNvbiIpLmdldChDb21iaW5lZEFubm90YXRpb25CZWFuLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBASWdub3JlCisgICAgLy8gVE9ETyB1bi1pZ25vcmUgb25jZSBhIEpTT04gcmVhZGVyIGZvciAiYXBwbGljYXRpb24vamF2YXNjcmlwdCIgaXMgc3VwcG9ydGVkCisgICAgcHVibGljIHZvaWQgdGVzdEpTT05QQmVhbigpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh0YXJnZXQoIm5vbkpheGJSZXNvdXJjZSIpLnJlcXVlc3QoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiKS5nZXQoTm9uSmF4YkJlYW4uY2xhc3MpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGlmIGEgV0FETCBkb2N1bWVudCBpcyBhdmFpbGFibGUgYXQgdGhlIHJlbGF0aXZlIHBhdGgKKyAgICAgKiAiYXBwbGljYXRpb24ud2FkbCIuCisgICAgICogPHAvPgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFwcGxpY2F0aW9uV2FkbCgpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpOworICAgICAgICBmaW5hbCBTdHJpbmcgc2VydmljZVdhZGwgPSB0YXJnZXQucGF0aCgiYXBwbGljYXRpb24ud2FkbCIpLnJlcXVlc3QoTWVkaWFUeXBlcy5XQURMX1RZUEUpLmdldChTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydFRydWUoc2VydmljZVdhZGwubGVuZ3RoKCkgPiAwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0LCB0aGF0IGluIGNhc2Ugb2YgbWFsZm9ybWVkIEpTT04sIHRoZSBqYWNrc29uIGV4Y2VwdGlvbiBtYXBwZXJzIHdpbGwgYmUgdXNlZCBhbmQgdGhlIHJlc3BvbnNlIHdpbGwgYmUKKyAgICAgKiA0MDAgLSBiYWQgcmVxdWVzdCBpbnN0ZWFkIG9mIDUwMCAtIHNlcnZlciBlcnJvcgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvbk1hcHBpbmcoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisgICAgICAgIC8vIGNyZWF0ZSBhIHJlcXVlc3Qgd2l0aCBpbnZhbGlkIGpzb24gc3RyaW5nIHRvIGNhdXNlIGFuIGV4Y2VwdGlvbiBpbiBKYWNrc29uCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicGFyc2VFeGNlcHRpb25UZXN0IikucmVxdWVzdCgiYXBwbGljYXRpb24vanNvbiIpCisgICAgICAgICAgICAgICAgLnB1dChFbnRpdHkuZW50aXR5KCJNYWxmb3JtZWQganNvbiBzdHJpbmcuIiwgTWVkaWFUeXBlLnZhbHVlT2YoImFwcGxpY2F0aW9uL2pzb24iKSkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhSZXNwb25zZS5TdGF0dXMuQkFEX1JFUVVFU1QuZ2V0U3RhdHVzQ29kZSgpLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvanNvbi1qZXR0aXNvbi9SRUFETUUuTUQgYi9leGFtcGxlcy9qc29uLWpldHRpc29uL1JFQURNRS5NRApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWU4M2QyCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvanNvbi1qZXR0aXNvbi9SRUFETUUuTUQKQEAgLTAsMCArMSw2NCBAQAorWy8vXTogIyAiIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAiCitbLy9dOiAjICIgIgorWy8vXTogIyAiIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAiCitbLy9dOiAjICIgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQgIgorWy8vXTogIyAiIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4gIgorWy8vXTogIyAiICIKK1svL106ICMgIiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlICIKKworSmV0dGlzb24gSkFYLVJTIEpTT04gUHJvdmlkZXIgRXhhbXBsZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byB1c2UgSlNPTiByZXByZXNlbnRhdGlvbiBvZiBKQVhCIGJhc2VkCityZXNvdXJjZXMgd2l0aCBKZXR0aXNvbiBKU09OIHByb3ZpZGVyLgorCitBIHNpbXBsZSB3ZWIgYXBwbGljYXRpb24gaXMgcHJlc2VudGVkIHdpdGggdHdvIHJlc291cmNlczogYSBmbGlnaHQgbGlzdAorYW5kIGEgYWlyY3JhZnQgdHlwZSBsaXN0LiBBIGNsaWVudCBjYW4gb2J0YWluIHRoZSBmb3JtZXIgbGlzdCBvciB1cGRhdGUKK2l0IHVzaW5nIFhNTCBvciBKU09OIHJlcHJlc2VudGF0aW9uLiBUaGUgc2Vjb25kIGxpc3QgaXMgcmVhZC1vbmx5IGFuZAorc2hvd3MgaG93IHRvIHByb3ZpZGUgSlNPTiBhcnJheSB1c2luZyBMaXN0Jmx0O0pBWEJCZWFuJmd0OyBvYmplY3RzLgorCitDb250ZW50cworLS0tLS0tLS0KKworVGhlIGZsaWdodCBsaXN0IHdlYiByZXNvdXJjZSBpcyBpbXBsZW1lbnRlZCBieQorYG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmpldHRpc29uLkZsaWdodExpc3RgIGNsYXNzLgorCitUaGUgYWlyY3JhZnQgdHlwZSBsaXN0IHdlYiByZXNvdXJjZSBpcyBpbXBsZW1lbnRlZCBieQorYG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmpldHRpc29uLkFpcmNyYWZ0VHlwZUxpc3RgIGNsYXNzLgorCitUaGUgbWFwcGluZyBvZiB0aGUgVVJJIHBhdGggc3BhY2UgaXMgcHJlc2VudGVkIGluIHRoZSBmb2xsb3dpbmcgdGFibGU6CisKK1VSSSBwYXRoICAgICAgICAgICB8IFJlc291cmNlIGNsYXNzICAgICB8IEhUVFAgbWV0aG9kCistLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tCisqKl8vZmxpZ2h0c18qKiAgICAgfCBGbGlnaHRMaXN0ICAgICAgICAgfCBHRVQsIFBVVAorKipfL2FpcmNyYWZ0c18qKiAgIHwgQWlyY3JhZnRUeXBlTGlzdCAgIHwgR0VUCisKK1J1bm5pbmcgdGhlIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworUnVuIHRoZSBleGFtcGxlIGFzIGZvbGxvd3M6CisKKz4gICAgIG12biBjbGVhbiBjb21waWxlIGV4ZWM6amF2YQorCitUaGlzIGRlcGxveXMgdGhlIEpTT04gZnJvbSBKQVhCIGV4YW1wbGUgdXNpbmcgW0dyaXp6bHldKGh0dHA6Ly9ncml6emx5LmphdmEubmV0LykKKworQSBbV0FETCBkZXNjcmlwdGlvbl0oaHR0cDovL3dhZGwuamF2YS5uZXQvI3NwZWMpIG1heSBiZSBhY2Nlc3NlZCBhdCB0aGUgVVJMOgorCistICAgPGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZXR0aXNvbi9hcHBsaWNhdGlvbi53YWRsPgorCitGb2xsb3dpbmcgc3RlcHMgYXJlIHVzaW5nIFtjVVJMXShodHRwOi8vY3VybC5oYXh4LnNlLykgY29tbWFuZCBsaW5lIHRvb2w6CisKK0dldCB0aGUgbGlzdCBvZiBmbGlnaHRzIGluIEpTT04gZm9ybWF0OgorCis+ICAgICBjdXJsIC1IQWNjZXB0OmFwcGxpY2F0aW9uL2pzb24gaHR0cDovL2xvY2FsaG9zdDo4MDgwL2pldHRpc29uL2ZsaWdodHMKKworR2V0IHRoZSBsaXN0IG9mIGZsaWdodHMgaW4gWE1MIGZvcm1hdDoKKworPiAgICAgY3VybCAtSEFjY2VwdDphcHBsaWNhdGlvbi94bWwgaHR0cDovL2xvY2FsaG9zdDo4MDgwL2pldHRpc29uL2ZsaWdodHMKKworR2V0IHRoZSBsaXN0IG9mIGFpcmNyYWZ0IHR5cGVzIGluIEpTT04gZm9ybWF0OgorCis+ICAgICBjdXJsIC1IQWNjZXB0OmFwcGxpY2F0aW9uL2pzb24gaHR0cDovL2xvY2FsaG9zdDo4MDgwL2pldHRpc29uL2FpcmNyYWZ0cworCitZb3UgY2FuIGFsc28gc2VlIHRlc3QgY2xhc3NlcyBhdCBgc3JjL21haW4vdGVzdGAgc3ViZGlyZWN0b3J5IGZvciBkZXRhaWwKK2luZm9ybWF0aW9uIGhvdyB0byBjb25zdW1lIHRoZSBzZXJ2aWNlIHVzaW5nIEpBWC1SUyBjbGllbnQgQVBJCmRpZmYgLS1naXQgYS9leGFtcGxlcy9qc29uLWpldHRpc29uL3BvbS54bWwgYi9leGFtcGxlcy9qc29uLWpldHRpc29uL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIxMjI2YQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2pzb24tamV0dGlzb24vcG9tLnhtbApAQCAtMCwwICsxLDc3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+anNvbi1qZXR0aXNvbjwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS1leGFtcGxlcy1qc29uLWpldHRpc29uPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPkplcnNleSBKU09OIHdpdGggSmV0dGlzb24gSkFYQiBleGFtcGxlLjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLWdyaXp6bHkyLWh0dHA8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktaGsyPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtanNvbi1qZXR0aXNvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhlYy1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxtYWluQ2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuamV0dGlzb24uQXBwPC9tYWluQ2xhc3M+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5yZWxlYXNlPC9pZD4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2pzb24tamV0dGlzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qZXR0aXNvbi9BaXJjcmFmdFR5cGUuamF2YSBiL2V4YW1wbGVzL2pzb24tamV0dGlzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qZXR0aXNvbi9BaXJjcmFmdFR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjg5M2ZhCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvanNvbi1qZXR0aXNvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2pldHRpc29uL0FpcmNyYWZ0VHlwZS5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuamV0dGlzb247CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCisvKioKKyAqIFRPRE8gamF2YWRvYy4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQFhtbFJvb3RFbGVtZW50CitwdWJsaWMgY2xhc3MgQWlyY3JhZnRUeXBlIHsKKyAgICBwdWJsaWMgU3RyaW5nIHR5cGU7CisgICAgcHVibGljIGRvdWJsZSBsZW5ndGg7CisgICAgcHVibGljIGludCBzZWF0aW5nQ2FwYWNpdHk7CisKKyAgICBwdWJsaWMgQWlyY3JhZnRUeXBlKCl7fQorCisgICAgcHVibGljIEFpcmNyYWZ0VHlwZShTdHJpbmcgdHlwZSwgZG91YmxlIGxlbmd0aCwgaW50IHNlYXRpbmdDYXBhY2l0eSkgeworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICB0aGlzLmxlbmd0aCA9IGxlbmd0aDsKKyAgICAgICAgdGhpcy5zZWF0aW5nQ2FwYWNpdHkgPSBzZWF0aW5nQ2FwYWNpdHk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvanNvbi1qZXR0aXNvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2pldHRpc29uL0FpcmNyYWZ0VHlwZUxpc3QuamF2YSBiL2V4YW1wbGVzL2pzb24tamV0dGlzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qZXR0aXNvbi9BaXJjcmFmdFR5cGVMaXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA5MWY1MgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2pzb24tamV0dGlzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qZXR0aXNvbi9BaXJjcmFmdFR5cGVMaXN0LmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5qZXR0aXNvbjsKKworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCisvKioKKyAqIFRPRE8gamF2YWRvYy4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIi9haXJjcmFmdHMiKQorcHVibGljIGNsYXNzIEFpcmNyYWZ0VHlwZUxpc3QgeworCisgICAgc3RhdGljIGZpbmFsIExpc3Q8QWlyY3JhZnRUeXBlPiBhaXJjcmFmdFR5cGVzID0gbmV3IExpbmtlZExpc3Q8QWlyY3JhZnRUeXBlPigpOworCisgICAgc3RhdGljIHsKKyAgICAgICAgYWlyY3JhZnRUeXBlcy5hZGQobmV3IEFpcmNyYWZ0VHlwZSgiQjczNyIsIDQyLjEsIDIwNCkpOworICAgICAgICBhaXJjcmFmdFR5cGVzLmFkZChuZXcgQWlyY3JhZnRUeXBlKCJBMzMwIiwgNTguOCwgMjUzKSk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQcm9kdWNlcyh7TWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04sIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUx9KQorICAgIHB1YmxpYyBMaXN0PEFpcmNyYWZ0VHlwZT4gZ2V0QWlyY3JhZnRUeXBlcygpIHsKKyAgICAgICAgcmV0dXJuIGFpcmNyYWZ0VHlwZXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvanNvbi1qZXR0aXNvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2pldHRpc29uL0FwcC5qYXZhIGIvZXhhbXBsZXMvanNvbi1qZXR0aXNvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2pldHRpc29uL0FwcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1MmUyZTUKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9qc29uLWpldHRpc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamV0dGlzb24vQXBwLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5qZXR0aXNvbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkyLmh0dHBzZXJ2ZXIuR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHRpc29uLkpldHRpc29uRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmdyaXp6bHkuaHR0cC5zZXJ2ZXIuSHR0cFNlcnZlcjsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIHdoaWNoIGNhbiBjcmVhdGUge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXJ9IGluc3RhbmNlIGFuZCBwcm92aWRlcyBzdXBwb3J0CisgKiBmb3IgcnVubmluZyB0aGlzIHNhbXBsZSBmcm9tIGNvbW1hbmQgbGluZS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEFwcCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgQkFTRV9VUkkgPSBVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvamV0dGlzb24vIik7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkpTT04gd2l0aCBKQVhCIEplcnNleSBFeGFtcGxlIEFwcCIpOworCisgICAgICAgICAgICBmaW5hbCBIdHRwU2VydmVyIHNlcnZlciA9IEdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeS5jcmVhdGVIdHRwU2VydmVyKEJBU0VfVVJJLCBjcmVhdGVBcHAoKSwgZmFsc2UpOworICAgICAgICAgICAgUnVudGltZS5nZXRSdW50aW1lKCkuYWRkU2h1dGRvd25Ib29rKG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyLnNodXRkb3duTm93KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkpOworICAgICAgICAgICAgc2VydmVyLnN0YXJ0KCk7CisKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihTdHJpbmcuZm9ybWF0KCJBcHBsaWNhdGlvbiBzdGFydGVkLiVuU3RvcCB0aGUgYXBwbGljYXRpb24gdXNpbmcgQ1RSTCtDIikpOworCisgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gfCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihBcHAuY2xhc3MuZ2V0TmFtZSgpKS5sb2coTGV2ZWwuU0VWRVJFLCBudWxsLCBleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlQ29uZmlnIGNyZWF0ZUFwcCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZygpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKG5ldyBKZXR0aXNvbkZlYXR1cmUoKSkKKyAgICAgICAgICAgICAgICAucGFja2FnZXMoIm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmpldHRpc29uIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvanNvbi1qZXR0aXNvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2pldHRpc29uL0ZsaWdodExpc3QuamF2YSBiL2V4YW1wbGVzL2pzb24tamV0dGlzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qZXR0aXNvbi9GbGlnaHRMaXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMzOTcxNwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2pzb24tamV0dGlzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qZXR0aXNvbi9GbGlnaHRMaXN0LmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5qZXR0aXNvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBVVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCisvKioKKyAqIFRPRE8gamF2YWRvYy4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgodmFsdWUgPSAiL2ZsaWdodHMiKQorcHVibGljIGNsYXNzIEZsaWdodExpc3QgeworCisgICAgQEdFVAorICAgIEBQcm9kdWNlcyh7ImFwcGxpY2F0aW9uL2pzb24iLCAiYXBwbGljYXRpb24veG1sIn0pCisgICAgcHVibGljIEZsaWdodHMgZ2V0RmxpZ2h0TGlzdCgpIHsKKyAgICAgICAgcmV0dXJuIEZsaWdodHNEYXRhU3RvcmUuZ2V0RmxpZ2h0cygpOworICAgIH0KKworICAgIEBQVVQKKyAgICBAQ29uc3VtZXMoeyJhcHBsaWNhdGlvbi9qc29uIiwgImFwcGxpY2F0aW9uL3htbCJ9KQorICAgIHB1YmxpYyB2b2lkIHB1dEZsaWdodExpc3QoRmxpZ2h0cyBmbGlnaHRzKSB7CisgICAgICAgIEZsaWdodHNEYXRhU3RvcmUuaW5pdChmbGlnaHRzKTsKKyAgICB9CisKKyAgICBAUE9TVAorICAgIEBQYXRoKCJpbml0IikKKyAgICBAUHJvZHVjZXMoeyJhcHBsaWNhdGlvbi9qc29uIiwgImFwcGxpY2F0aW9uL3htbCJ9KQorICAgIHB1YmxpYyB2b2lkIGluaXREYXRhKCkgeworICAgICAgICBGbGlnaHRzRGF0YVN0b3JlLmluaXQoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2pzb24tamV0dGlzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qZXR0aXNvbi9GbGlnaHRUeXBlLmphdmEgYi9leGFtcGxlcy9qc29uLWpldHRpc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamV0dGlzb24vRmxpZ2h0VHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ODE2MWEKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9qc29uLWpldHRpc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamV0dGlzb24vRmxpZ2h0VHlwZS5qYXZhCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCisvLworLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdkpBWEIgMi4wIGluIEpESyAxLjYKKy8vIFNlZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiIj5odHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiPC9hPgorLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuCisvLyBHZW5lcmF0ZWQgb246IDIwMDcuMDcuMTMgYXQgMDM6NTY6NTMgUE0gQ0VTVAorLy8KK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuamV0dGlzb247CisKK2ltcG9ydCBqYXZhLnV0aWwuRm9ybWF0dGVyOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOworCisvKioKKyAqIDxwPkphdmEgY2xhc3MgZm9yIGZsaWdodFR5cGUgY29tcGxleCB0eXBlLgorICoKKyAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCisgKgorICogPHByZT4KKyAqICZsdDtjb21wbGV4VHlwZSBuYW1lPSJmbGlnaHRUeXBlIj4KKyAqICAgJmx0O2NvbXBsZXhDb250ZW50PgorICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+CisgKiAgICAgICAmbHQ7c2VxdWVuY2U+CisgKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImNvbXBhbnkiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1zdHJpbmciLz4KKyAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0ibnVtYmVyIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9bG9uZyIvPgorICogICAgICAgICAmbHQ7ZWxlbWVudCBuYW1lPSJhaXJjcmFmdCIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfXN0cmluZyIvPgorICogICAgICAgJmx0Oy9zZXF1ZW5jZT4KKyAqICAgICAgICZsdDthdHRyaWJ1dGUgbmFtZT0iZmxpZ2h0SWQiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1zdHJpbmciIC8+CisgKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KKyAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4KKyAqICZsdDsvY29tcGxleFR5cGU+CisgKiA8L3ByZT4KKyAqCisgKgorICovCitAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCitAWG1sVHlwZShuYW1lID0gImZsaWdodFR5cGUiLCBwcm9wT3JkZXIgPSB7CisgICAgImZsaWdodElkIiwKKyAgICAiY29tcGFueSIsCisgICAgIm51bWJlciIsCisgICAgImFpcmNyYWZ0IgorfSkKK3B1YmxpYyBjbGFzcyBGbGlnaHRUeXBlIHsKKworICAgIEBYbWxFbGVtZW50KHJlcXVpcmVkID0gdHJ1ZSkKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbXBhbnk7CisgICAgcHJvdGVjdGVkIGxvbmcgbnVtYmVyOworICAgIEBYbWxFbGVtZW50KHJlcXVpcmVkID0gdHJ1ZSkKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGFpcmNyYWZ0OworICAgIEBYbWxFbGVtZW50KHJlcXVpcmVkID0gdHJ1ZSkKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGZsaWdodElkOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGNvbXBhbnkgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgIHBvc3NpYmxlIG9iamVjdCBpcworICAgICAqICAgICB7QGxpbmsgU3RyaW5nIH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcGFueSgpIHsKKyAgICAgICAgcmV0dXJuIGNvbXBhbnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGNvbXBhbnkgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiAgICAgYWxsb3dlZCBvYmplY3QgaXMKKyAgICAgKiAgICAge0BsaW5rIFN0cmluZyB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb21wYW55KFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0aGlzLmNvbXBhbnkgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbnVtYmVyIHByb3BlcnR5LgorICAgICAqCisgICAgICogQHJldHVybiBmbGlnaHQgbnVtYmVyLgorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldE51bWJlcigpIHsKKyAgICAgICAgcmV0dXJuIG51bWJlcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgbnVtYmVyIHByb3BlcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIG5ldyBmbGlnaHQgbnVtYmVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE51bWJlcihsb25nIHZhbHVlKSB7CisgICAgICAgIHRoaXMubnVtYmVyID0gdmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGFpcmNyYWZ0IHByb3BlcnR5LgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqICAgICBwb3NzaWJsZSBvYmplY3QgaXMKKyAgICAgKiAgICAge0BsaW5rIFN0cmluZyB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEFpcmNyYWZ0KCkgeworICAgICAgICByZXR1cm4gYWlyY3JhZnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGFpcmNyYWZ0IHByb3BlcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICogICAgIGFsbG93ZWQgb2JqZWN0IGlzCisgICAgICogICAgIHtAbGluayBTdHJpbmcgfQorICAgICAqCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0QWlyY3JhZnQoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHRoaXMuYWlyY3JhZnQgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZmxpZ2h0SWQgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICogICAgIHBvc3NpYmxlIG9iamVjdCBpcworICAgICAqICAgICB7QGxpbmsgU3RyaW5nIH0KKyAgICAgKgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmxpZ2h0SWQoKSB7CisgICAgICAgIHJldHVybiBmbGlnaHRJZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZmxpZ2h0SWQgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKiAgICAgYWxsb3dlZCBvYmplY3QgaXMKKyAgICAgKiAgICAge0BsaW5rIFN0cmluZyB9CisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGbGlnaHRJZChTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgdGhpcy5mbGlnaHRJZCA9IHZhbHVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAobmV3IEZvcm1hdHRlcigpKS5mb3JtYXQoCisgICAgICAgICAgICAgICAgIntcImZsaWdodElkXCI6XCIlc1wiLFwiY29tcGFueVwiOlwiJXNcIixcIm51bWJlclwiOiVkLFwiYWlyY3JhZnRcIjpcIiVzXCJ9IiwKKyAgICAgICAgICAgICAgICB0aGlzLmZsaWdodElkLCB0aGlzLmNvbXBhbnksIHRoaXMubnVtYmVyLCB0aGlzLmFpcmNyYWZ0KS50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2pzb24tamV0dGlzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qZXR0aXNvbi9GbGlnaHRzLmphdmEgYi9leGFtcGxlcy9qc29uLWpldHRpc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamV0dGlzb24vRmxpZ2h0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNWZiY2UKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9qc29uLWpldHRpc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamV0dGlzb24vRmxpZ2h0cy5qYXZhCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKKy8vCisvLyBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB0aGUgSmF2YVRNIEFyY2hpdGVjdHVyZSBmb3IgWE1MIEJpbmRpbmcoSkFYQikgUmVmZXJlbmNlIEltcGxlbWVudGF0aW9uLCB2SkFYQiAyLjAgaW4gSkRLIDEuNgorLy8gU2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGIiPmh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL2pheGI8L2E+CisvLyBBbnkgbW9kaWZpY2F0aW9ucyB0byB0aGlzIGZpbGUgd2lsbCBiZSBsb3N0IHVwb24gcmVjb21waWxhdGlvbiBvZiB0aGUgc291cmNlIHNjaGVtYS4KKy8vIEdlbmVyYXRlZCBvbjogMjAwNy4wNy4xMyBhdCAwMzo1Njo1MyBQTSBDRVNUCisvLworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5qZXR0aXNvbjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKKworLyoqCisgKiA8cD5KYXZhIGNsYXNzIGZvciBhbm9ueW1vdXMgY29tcGxleCB0eXBlLgorICoKKyAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCisgKgorICogPHByZT4KKyAqICZsdDtjb21wbGV4VHlwZT4KKyAqICAgJmx0O2NvbXBsZXhDb250ZW50PgorICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+CisgKiAgICAgICAmbHQ7c2VxdWVuY2U+CisgKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImZsaWdodCIgdHlwZT0ie31mbGlnaHRUeXBlIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICogICAgICAgJmx0Oy9zZXF1ZW5jZT4KKyAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPgorICogICAmbHQ7L2NvbXBsZXhDb250ZW50PgorICogJmx0Oy9jb21wbGV4VHlwZT4KKyAqIDwvcHJlPgorICoKKyAqCisgKi8KK0BYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKK0BYbWxUeXBlKG5hbWUgPSAiIiwgcHJvcE9yZGVyID0geworICAgICJmbGlnaHQiCit9KQorQFhtbFJvb3RFbGVtZW50KG5hbWUgPSAiZmxpZ2h0cyIpCitwdWJsaWMgY2xhc3MgRmxpZ2h0cyB7CisKKyAgICBAWG1sRWxlbWVudChyZXF1aXJlZCA9IHRydWUpCisgICAgcHJvdGVjdGVkIExpc3Q8RmxpZ2h0VHlwZT4gZmxpZ2h0OworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIGZsaWdodCBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoaXMgYWNjZXNzb3IgbWV0aG9kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGxpdmUgbGlzdCwKKyAgICAgKiBub3QgYSBzbmFwc2hvdC4gVGhlcmVmb3JlIGFueSBtb2RpZmljYXRpb24geW91IG1ha2UgdG8gdGhlCisgICAgICogcmV0dXJuZWQgbGlzdCB3aWxsIGJlIHByZXNlbnQgaW5zaWRlIHRoZSBKQVhCIG9iamVjdC4KKyAgICAgKiBUaGlzIGlzIHdoeSB0aGVyZSBpcyBub3QgYSA8Q09ERT5zZXQ8L0NPREU+IG1ldGhvZCBmb3IgdGhlIGZsaWdodCBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIEZvciBleGFtcGxlLCB0byBhZGQgYSBuZXcgaXRlbSwgZG8gYXMgZm9sbG93czoKKyAgICAgKiA8cHJlPgorICAgICAqICAgIGdldEZsaWdodCgpLmFkZChuZXdJdGVtKTsKKyAgICAgKiA8L3ByZT4KKyAgICAgKgorICAgICAqCisgICAgICogPHA+CisgICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3QKKyAgICAgKiB7QGxpbmsgRmxpZ2h0VHlwZSB9CisgICAgICoKKyAgICAgKgorICAgICAqIEByZXR1cm4gbGlzdCBvZiBmbGlnaHRzLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PEZsaWdodFR5cGU+IGdldEZsaWdodCgpIHsKKyAgICAgICAgaWYgKGZsaWdodCA9PSBudWxsKSB7CisgICAgICAgICAgICBmbGlnaHQgPSBuZXcgQXJyYXlMaXN0PEZsaWdodFR5cGU+KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXMuZmxpZ2h0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAodGhpcy5mbGlnaHQgIT0gbnVsbCkgPyAie1wiZmxpZ2h0XCI6ICIgKyB0aGlzLmZsaWdodC50b1N0cmluZygpICsgIn0iIDogIntmbGlnaHQ6W119IjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9qc29uLWpldHRpc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamV0dGlzb24vRmxpZ2h0c0RhdGFTdG9yZS5qYXZhIGIvZXhhbXBsZXMvanNvbi1qZXR0aXNvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2pldHRpc29uL0ZsaWdodHNEYXRhU3RvcmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2JlMTJkCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvanNvbi1qZXR0aXNvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2pldHRpc29uL0ZsaWdodHNEYXRhU3RvcmUuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmpldHRpc29uOworCisvKioKKyAqIFRPRE8gamF2YWRvYy4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgRmxpZ2h0c0RhdGFTdG9yZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBGbGlnaHRzIGZsaWdodHNEYXRhID0gaW5pdEZsaWdodHNEYXRhKCk7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5pdCgpIHsKKyAgICAgICAgaW5pdChpbml0RmxpZ2h0c0RhdGEoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGluaXQoZmluYWwgRmxpZ2h0cyBmbGlnaHRzKSB7CisgICAgICAgIGZsaWdodHNEYXRhID0gZmxpZ2h0czsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEZsaWdodHMgZ2V0RmxpZ2h0cygpIHsKKyAgICAgICAgcmV0dXJuIGZsaWdodHNEYXRhOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEZsaWdodHMgaW5pdEZsaWdodHNEYXRhKCkgeworICAgICAgICBGbGlnaHRzIGZsaWdodHMgPSBuZXcgRmxpZ2h0cygpOworICAgICAgICBGbGlnaHRUeXBlIGZsaWdodDEyMyA9IG5ldyBGbGlnaHRUeXBlKCk7CisgICAgICAgIGZsaWdodDEyMy5zZXRDb21wYW55KCJDemVjaCBBaXJsaW5lcyIpOworICAgICAgICBmbGlnaHQxMjMuc2V0TnVtYmVyKDEyMyk7CisgICAgICAgIGZsaWdodDEyMy5zZXRGbGlnaHRJZCgiT0sxMjMiKTsKKyAgICAgICAgZmxpZ2h0MTIzLnNldEFpcmNyYWZ0KCJCNzM3Iik7CisgICAgICAgIEZsaWdodFR5cGUgZmxpZ2h0MTI0ID0gbmV3IEZsaWdodFR5cGUoKTsKKyAgICAgICAgZmxpZ2h0MTI0LnNldENvbXBhbnkoIkN6ZWNoIEFpcmxpbmVzIik7CisgICAgICAgIGZsaWdodDEyNC5zZXROdW1iZXIoMTI0KTsKKyAgICAgICAgZmxpZ2h0MTI0LnNldEZsaWdodElkKCJPSzEyNCIpOworICAgICAgICBmbGlnaHQxMjQuc2V0QWlyY3JhZnQoIkFCMTE1Iik7CisgICAgICAgIGZsaWdodHMuZ2V0RmxpZ2h0KCkuYWRkKGZsaWdodDEyMyk7CisgICAgICAgIGZsaWdodHMuZ2V0RmxpZ2h0KCkuYWRkKGZsaWdodDEyNCk7CisKKyAgICAgICAgcmV0dXJuIGZsaWdodHM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvanNvbi1qZXR0aXNvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2pldHRpc29uL0pheGJDb250ZXh0UmVzb2x2ZXIuamF2YSBiL2V4YW1wbGVzL2pzb24tamV0dGlzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qZXR0aXNvbi9KYXhiQ29udGV4dFJlc29sdmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQyZDYxZQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2pzb24tamV0dGlzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qZXR0aXNvbi9KYXhiQ29udGV4dFJlc29sdmVyLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5qZXR0aXNvbjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Db250ZXh0UmVzb2x2ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0aXNvbi5KZXR0aXNvbkNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0aXNvbi5KZXR0aXNvbkpheGJDb250ZXh0OworCisvKioKKyAqIHtAbGluayBDb250ZXh0UmVzb2x2ZXIgQ29udGV4dCByZXNvbHZlcn0gZm9yIHtAbGluayBKQVhCQ29udGV4dH0uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQcm92aWRlcgorcHVibGljIGZpbmFsIGNsYXNzIEpheGJDb250ZXh0UmVzb2x2ZXIgaW1wbGVtZW50cyBDb250ZXh0UmVzb2x2ZXI8SkFYQkNvbnRleHQ+IHsKKworICAgIHByaXZhdGUgZmluYWwgSkFYQkNvbnRleHQgY29udGV4dDsKKyAgICBwcml2YXRlIGZpbmFsIFNldDxDbGFzczw/Pj4gdHlwZXM7CisgICAgcHJpdmF0ZSBmaW5hbCBDbGFzczw/PltdIGNUeXBlcyA9IHtGbGlnaHRzLmNsYXNzLCBGbGlnaHRUeXBlLmNsYXNzLCBBaXJjcmFmdFR5cGUuY2xhc3N9OworCisgICAgcHVibGljIEpheGJDb250ZXh0UmVzb2x2ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy50eXBlcyA9IG5ldyBIYXNoU2V0PENsYXNzPD8+PihBcnJheXMuYXNMaXN0KGNUeXBlcykpOworICAgICAgICB0aGlzLmNvbnRleHQgPSBuZXcgSmV0dGlzb25KYXhiQ29udGV4dChKZXR0aXNvbkNvbmZpZy5ERUZBVUxULCBjVHlwZXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBKQVhCQ29udGV4dCBnZXRDb250ZXh0KENsYXNzPD8+IG9iamVjdFR5cGUpIHsKKyAgICAgICAgcmV0dXJuICh0eXBlcy5jb250YWlucyhvYmplY3RUeXBlKSkgPyBjb250ZXh0IDogbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9qc29uLWpldHRpc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvamV0dGlzb24vT2JqZWN0RmFjdG9yeS5qYXZhIGIvZXhhbXBsZXMvanNvbi1qZXR0aXNvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2pldHRpc29uL09iamVjdEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTY1NjBiCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvanNvbi1qZXR0aXNvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2pldHRpc29uL09iamVjdEZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCisvLworLy8gVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdGhlIEphdmFUTSBBcmNoaXRlY3R1cmUgZm9yIFhNTCBCaW5kaW5nKEpBWEIpIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiwgdkpBWEIgMi4wIGluIEpESyAxLjYKKy8vIFNlZSA8YSBocmVmPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiIj5odHRwOi8vamF2YS5zdW4uY29tL3htbC9qYXhiPC9hPgorLy8gQW55IG1vZGlmaWNhdGlvbnMgdG8gdGhpcyBmaWxlIHdpbGwgYmUgbG9zdCB1cG9uIHJlY29tcGlsYXRpb24gb2YgdGhlIHNvdXJjZSBzY2hlbWEuCisvLyBHZW5lcmF0ZWQgb246IDIwMDcuMDcuMTMgYXQgMDM6NTY6NTMgUE0gQ0VTVAorLy8KK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuamV0dGlzb247CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJlZ2lzdHJ5OworCisKKy8qKgorICogVGhpcyBvYmplY3QgY29udGFpbnMgZmFjdG9yeSBtZXRob2RzIGZvciBlYWNoCisgKiBKYXZhIGNvbnRlbnQgaW50ZXJmYWNlIGFuZCBKYXZhIGVsZW1lbnQgaW50ZXJmYWNlCisgKiBnZW5lcmF0ZWQgaW4gdGhlIGNvbS5zdW4uamVyc2V5LnNhbXBsZXMuanNvbmZyb21qYXhiLmpheGIgcGFja2FnZS4KKyAqIDxwPkFuIE9iamVjdEZhY3RvcnkgYWxsb3dzIHlvdSB0byBwcm9ncmFtYXRpY2FsbHkKKyAqIGNvbnN0cnVjdCBuZXcgaW5zdGFuY2VzIG9mIHRoZSBKYXZhIHJlcHJlc2VudGF0aW9uCisgKiBmb3IgWE1MIGNvbnRlbnQuIFRoZSBKYXZhIHJlcHJlc2VudGF0aW9uIG9mIFhNTAorICogY29udGVudCBjYW4gY29uc2lzdCBvZiBzY2hlbWEgZGVyaXZlZCBpbnRlcmZhY2VzCisgKiBhbmQgY2xhc3NlcyByZXByZXNlbnRpbmcgdGhlIGJpbmRpbmcgb2Ygc2NoZW1hCisgKiB0eXBlIGRlZmluaXRpb25zLCBlbGVtZW50IGRlY2xhcmF0aW9ucyBhbmQgbW9kZWwKKyAqIGdyb3Vwcy4gIEZhY3RvcnkgbWV0aG9kcyBmb3IgZWFjaCBvZiB0aGVzZSBhcmUKKyAqIHByb3ZpZGVkIGluIHRoaXMgY2xhc3MuCisgKgorICovCitAWG1sUmVnaXN0cnkKK3B1YmxpYyBjbGFzcyBPYmplY3RGYWN0b3J5IHsKKworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IE9iamVjdEZhY3RvcnkgdGhhdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgbmV3IGluc3RhbmNlcyBvZiBzY2hlbWEgZGVyaXZlZCBjbGFzc2VzIGZvciBwYWNrYWdlOiBjb20uc3VuLmplcnNleS5zYW1wbGVzLmpzb25mcm9tamF4Yi5qYXhiCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0RmFjdG9yeSgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEZsaWdodFR5cGUgfQorICAgICAqCisgICAgICogQHJldHVybiBmbGlnaHQgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmxpZ2h0VHlwZSBjcmVhdGVGbGlnaHRUeXBlKCkgeworICAgICAgICByZXR1cm4gbmV3IEZsaWdodFR5cGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEZsaWdodHMgfQorICAgICAqCisgICAgICogQHJldHVybiBmbGlnaHRzIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBGbGlnaHRzIGNyZWF0ZUZsaWdodHMoKSB7CisgICAgICAgIHJldHVybiBuZXcgRmxpZ2h0cygpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvanNvbi1qZXR0aXNvbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2pldHRpc29uL0pzb25KZXR0aXNvblRlc3QuamF2YSBiL2V4YW1wbGVzL2pzb24tamV0dGlzb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qZXR0aXNvbi9Kc29uSmV0dGlzb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcyZTUyMQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2pzb24tamV0dGlzb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qZXR0aXNvbi9Kc29uSmV0dGlzb25UZXN0LmphdmEKQEAgLTAsMCArMSwxNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuamV0dGlzb247CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljVHlwZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dGlzb24uSmV0dGlzb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBKc29uSmV0dGlzb25UZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworCisgICAgICAgIHJldHVybiBBcHAuY3JlYXRlQXBwKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKG5ldyBKZXR0aXNvbkZlYXR1cmUoKSkucmVnaXN0ZXIoSmF4YkNvbnRleHRSZXNvbHZlci5jbGFzcyk7CisgICAgfQorCisgICAgQEJlZm9yZQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisKKyAgICAgICAgLy8gcmVzZXQgc3RhdGljIGZsaWdodHMgbGlzdAorICAgICAgICB0YXJnZXQoKS5wYXRoKCJmbGlnaHRzL2luaXQiKS5yZXF1ZXN0KCJhcHBsaWNhdGlvbi9qc29uIikucG9zdChudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGNoZWNrcyB0aGF0IHRoZSBhcHBsaWNhdGlvbi53YWRsIGlzIHJlYWNoYWJsZS4KKyAgICAgKiA8cC8+CisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwbGljYXRpb25XYWRsKCkgeworICAgICAgICBTdHJpbmcgYXBwbGljYXRpb25XYWRsID0gdGFyZ2V0KCkucGF0aCgiYXBwbGljYXRpb24ud2FkbCIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU29tZXRoaW5nIHdyb25nLiBSZXR1cm5lZCB3YWRsIGxlbmd0aCBpcyBub3QgPiAwIiwgYXBwbGljYXRpb25XYWRsLmxlbmd0aCgpID4gMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBjaGVjayBHRVQgb24gdGhlICJmbGlnaHRzIiByZXNvdXJjZSBpbiAiYXBwbGljYXRpb24vanNvbiIgZm9ybWF0LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldE9uRmxpZ2h0c0pTT05Gb3JtYXQoKSB7CisgICAgICAgIC8vIGdldCB0aGUgaW5pdGlhbCByZXByZXNlbnRhdGlvbgorICAgICAgICBGbGlnaHRzIGZsaWdodHMgPSB0YXJnZXQoKS5wYXRoKCJmbGlnaHRzIikucmVxdWVzdCgiYXBwbGljYXRpb24vanNvbiIpLmdldChGbGlnaHRzLmNsYXNzKTsKKyAgICAgICAgLy8gY2hlY2sgdGhhdCB0aGVyZSBhcmUgdHdvIGZsaWdodCBlbnRyaWVzCisgICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgbnVtYmVyIG9mIGluaXRpYWwgZW50cmllcyBub3QgZm91bmQiLCAyLCBmbGlnaHRzLmdldEZsaWdodCgpLnNpemUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBjaGVja3MgUFVUIG9uIHRoZSAiZmxpZ2h0cyIgcmVzb3VyY2UgaW4gImFwcGxpY2F0aW9uL2pzb24iIGZvcm1hdC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQdXRPbkZsaWdodHNKU09ORm9ybWF0KCkgeworICAgICAgICAvLyBnZXQgdGhlIGluaXRpYWwgcmVwcmVzZW50YXRpb24KKyAgICAgICAgRmxpZ2h0cyBmbGlnaHRzID0gdGFyZ2V0KCkucGF0aCgiZmxpZ2h0cyIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoImFwcGxpY2F0aW9uL2pzb24iKS5nZXQoRmxpZ2h0cy5jbGFzcyk7CisgICAgICAgIC8vIGNoZWNrIHRoYXQgdGhlcmUgYXJlIHR3byBmbGlnaHQgZW50cmllcworICAgICAgICBhc3NlcnRFcXVhbHMoIkV4cGVjdGVkIG51bWJlciBvZiBpbml0aWFsIGVudHJpZXMgbm90IGZvdW5kIiwgMiwgZmxpZ2h0cy5nZXRGbGlnaHQoKS5zaXplKCkpOworCisgICAgICAgIC8vIHJlbW92ZSB0aGUgc2Vjb25kIGZsaWdodCBlbnRyeQorICAgICAgICBpZiAoZmxpZ2h0cy5nZXRGbGlnaHQoKS5zaXplKCkgPiAxKSB7CisgICAgICAgICAgICBmbGlnaHRzLmdldEZsaWdodCgpLnJlbW92ZSgxKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHVwZGF0ZSB0aGUgZmlyc3QgZW50cnkKKyAgICAgICAgZmxpZ2h0cy5nZXRGbGlnaHQoKS5nZXQoMCkuc2V0TnVtYmVyKDEyNSk7CisgICAgICAgIGZsaWdodHMuZ2V0RmxpZ2h0KCkuZ2V0KDApLnNldEZsaWdodElkKCJPSzEyNSIpOworCisgICAgICAgIC8vIGFuZCBzZW5kIHRoZSB1cGRhdGVkIGxpc3QgYmFjayB0byB0aGUgc2VydmVyCisgICAgICAgIHRhcmdldCgpLnBhdGgoImZsaWdodHMiKS5yZXF1ZXN0KCkucHV0KEVudGl0eS5qc29uKGZsaWdodHMpKTsKKworICAgICAgICAvLyBnZXQgdGhlIHVwZGF0ZWQgbGlzdCBvdXQgZnJvbSB0aGUgc2VydmVyOgorICAgICAgICBGbGlnaHRzIHVwZGF0ZWRGbGlnaHRzID0gdGFyZ2V0KCkucGF0aCgiZmxpZ2h0cyIpLnJlcXVlc3QoImFwcGxpY2F0aW9uL2pzb24iKS5nZXQoRmxpZ2h0cy5jbGFzcyk7CisgICAgICAgIC8vY2hlY2sgdGhhdCB0aGVyZSBpcyBvbmx5IG9uZSBmbGlnaHQgZW50cnkKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZW1haW5pbmcgbnVtYmVyIG9mIGZsaWdodCBlbnRyaWVzIGRvIG5vdCBtYXRjaCB0aGUgZXhwZWN0ZWQgdmFsdWUiLCAxLCB1cGRhdGVkRmxpZ2h0cy5nZXRGbGlnaHQoKS5zaXplKCkpOworICAgICAgICAvLyBjaGVjayB0aGF0IHRoZSBmbGlnaHQgZW50cnkgaW4gcmV0cmlldmVkIGxpc3QgaGFzIEZsaWdodElEIE9LIUAlCisgICAgICAgIGFzc2VydEVxdWFscygiUmV0cmlldmVkIGZsaWdodCBJRCBkb2Vzbid0IG1hdGNoIHRoZSBleHBlY3RlZCB2YWx1ZSIsICJPSzEyNSIsCisgICAgICAgICAgICAgICAgdXBkYXRlZEZsaWdodHMuZ2V0RmxpZ2h0KCkuZ2V0KDApLmdldEZsaWdodElkKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgY2hlY2tzIEdFVCBvbiAiZmxpZ2h0cyIgcmVzb3VyY2Ugd2l0aCBtaW1lLXR5cGUgImFwcGxpY2F0aW9uL3htbCIuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0T25GbGlnaHRzWE1MRm9ybWF0KCkgeworICAgICAgICAvLyBnZXQgdGhlIGluaXRpYWwgcmVwcmVzZW50YXRpb24KKyAgICAgICAgRmxpZ2h0cyBmbGlnaHRzID0gdGFyZ2V0KCkucGF0aCgiZmxpZ2h0cyIpLnJlcXVlc3QoImFwcGxpY2F0aW9uL3htbCIpLmdldChGbGlnaHRzLmNsYXNzKTsKKyAgICAgICAgLy8gY2hlY2sgdGhhdCB0aGVyZSBhcmUgdHdvIGZsaWdodCBlbnRyaWVzCisgICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgbnVtYmVyIG9mIGluaXRpYWwgZW50cmllcyBub3QgZm91bmQiLCAyLCBmbGlnaHRzLmdldEZsaWdodCgpLnNpemUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBjaGVja3MgUFVUIG9uICJmbGlnaHRzIiByZXNvdXJjZSB3aXRoIG1pbWUtdHlwZSAiYXBwbGljYXRpb24veG1sIi4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQdXRPbkZsaWdodHNYTUxGb3JtYXQoKSB7CisgICAgICAgIC8vIGdldCB0aGUgaW5pdGlhbCByZXByZXNlbnRhdGlvbgorICAgICAgICBGbGlnaHRzIGZsaWdodHMgPSB0YXJnZXQoKS5wYXRoKCJmbGlnaHRzIikucmVxdWVzdCgiYXBwbGljYXRpb24vWE1MIikuZ2V0KEZsaWdodHMuY2xhc3MpOworICAgICAgICAvLyBjaGVjayB0aGF0IHRoZXJlIGFyZSB0d28gZmxpZ2h0IGVudHJpZXMKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCBudW1iZXIgb2YgaW5pdGlhbCBlbnRyaWVzIG5vdCBmb3VuZCIsIDIsIGZsaWdodHMuZ2V0RmxpZ2h0KCkuc2l6ZSgpKTsKKworICAgICAgICAvLyByZW1vdmUgdGhlIHNlY29uZCBmbGlnaHQgZW50cnkKKyAgICAgICAgaWYgKGZsaWdodHMuZ2V0RmxpZ2h0KCkuc2l6ZSgpID4gMSkgeworICAgICAgICAgICAgZmxpZ2h0cy5nZXRGbGlnaHQoKS5yZW1vdmUoMSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB1cGRhdGUgdGhlIGZpcnN0IGVudHJ5CisgICAgICAgIGZsaWdodHMuZ2V0RmxpZ2h0KCkuZ2V0KDApLnNldE51bWJlcigxMjUpOworICAgICAgICBmbGlnaHRzLmdldEZsaWdodCgpLmdldCgwKS5zZXRGbGlnaHRJZCgiT0sxMjUiKTsKKworICAgICAgICAvLyBhbmQgc2VuZCB0aGUgdXBkYXRlZCBsaXN0IGJhY2sgdG8gdGhlIHNlcnZlcgorICAgICAgICB0YXJnZXQoKS5wYXRoKCJmbGlnaHRzIikucmVxdWVzdCgpLnB1dChFbnRpdHkueG1sKGZsaWdodHMpKTsKKworICAgICAgICAvLyBnZXQgdGhlIHVwZGF0ZWQgbGlzdCBvdXQgZnJvbSB0aGUgc2VydmVyOgorICAgICAgICBGbGlnaHRzIHVwZGF0ZWRGbGlnaHRzID0gdGFyZ2V0KCkucGF0aCgiZmxpZ2h0cyIpLnJlcXVlc3QoImFwcGxpY2F0aW9uL1hNTCIpLmdldChGbGlnaHRzLmNsYXNzKTsKKyAgICAgICAgLy9jaGVjayB0aGF0IHRoZXJlIGlzIG9ubHkgb25lIGZsaWdodCBlbnRyeQorICAgICAgICBhc3NlcnRFcXVhbHMoIlJlbWFpbmluZyBudW1iZXIgb2YgZmxpZ2h0IGVudHJpZXMgZG8gbm90IG1hdGNoIHRoZSBleHBlY3RlZCB2YWx1ZSIsIDEsIHVwZGF0ZWRGbGlnaHRzLmdldEZsaWdodCgpLnNpemUoKSk7CisgICAgICAgIC8vIGNoZWNrIHRoYXQgdGhlIGZsaWdodCBlbnRyeSBpbiByZXRyaWV2ZWQgbGlzdCBoYXMgRmxpZ2h0SUQgT0shQCUKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXRyaWV2ZWQgZmxpZ2h0IElEIGRvZXNuJ3QgbWF0Y2ggdGhlIGV4cGVjdGVkIHZhbHVlIiwgIk9LMTI1IiwKKyAgICAgICAgICAgICAgICB1cGRhdGVkRmxpZ2h0cy5nZXRGbGlnaHQoKS5nZXQoMCkuZ2V0RmxpZ2h0SWQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBjaGVjayBHRVQgb24gdGhlICJhaXJjcmFmdHMiIHJlc291cmNlIGluICJhcHBsaWNhdGlvbi9qc29uIiBmb3JtYXQuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0T25BaXJjcmFmdHNKU09ORm9ybWF0KCkgeworICAgICAgICBHZW5lcmljVHlwZTxMaXN0PEFpcmNyYWZ0VHlwZT4+IGxpc3RPZkFpcmNyYWZ0cyA9IG5ldyBHZW5lcmljVHlwZTxMaXN0PEFpcmNyYWZ0VHlwZT4+KCkgeworICAgICAgICB9OworICAgICAgICAvLyBnZXQgdGhlIGluaXRpYWwgcmVwcmVzZW50YXRpb24KKyAgICAgICAgTGlzdDxBaXJjcmFmdFR5cGU+IGFpcmNyYWZ0VHlwZXMgPSB0YXJnZXQoKS5wYXRoKCJhaXJjcmFmdHMiKS5yZXF1ZXN0KCJhcHBsaWNhdGlvbi9qc29uIikuZ2V0KGxpc3RPZkFpcmNyYWZ0cyk7CisgICAgICAgIC8vIGNoZWNrIHRoYXQgdGhlcmUgYXJlIHR3byBhaXJjcmFmdCB0eXBlIGVudHJpZXMKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCBudW1iZXIgb2YgaW5pdGlhbCBhaXJjcmFmdCB0eXBlcyBub3QgZm91bmQiLCAyLCBhaXJjcmFmdFR5cGVzLnNpemUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvanNvbi1tb3h5L1JFQURNRS5NRCBiL2V4YW1wbGVzL2pzb24tbW94eS9SRUFETUUuTUQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ2MzU5MAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2pzb24tbW94eS9SRUFETUUuTUQKQEAgLTAsMCArMSw0MSBAQAorWy8vXTogIyAiIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAiCitbLy9dOiAjICIgIgorWy8vXTogIyAiIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAiCitbLy9dOiAjICIgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQgIgorWy8vXTogIyAiIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4gIgorWy8vXTogIyAiICIKK1svL106ICMgIiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlICIKKworTU9YeSBKQVgtUlMgSlNPTiBQcm92aWRlciBFeGFtcGxlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gcHJvZHVjZS9jb25zdW1lIEpTT04gcmVwcmVzZW50YXRpb25zIGZyb20gSmF2YSBvYmplY3RzLgorCitDb250ZW50cworLS0tLS0tLS0KKworVGhlIG1hcHBpbmcgb2YgdGhlIFVSSSBwYXRoIHNwYWNlIGlzIHByZXNlbnRlZCBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOgorCitVUkkgcGF0aCAgICAgICB8IFJlc291cmNlIGNsYXNzICAgfCBIVFRQIG1ldGhvZAorLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLQorKipfL3Rlc3RfKiogICAgfCBKc29uUmVzb3VyY2UgICAgIHwgR0VUCisqKl8vdGVzdF8qKiAgICB8IEpzb25SZXNvdXJjZSAgICAgfCBQT1NUCisKKyhTZWUgSnNvblJlc291cmNlVGVzdCBmb3IgbW9yZSBkZXRhaWxzLikKKworUnVubmluZyB0aGUgRXhhbXBsZQorLS0tLS0tLS0tLS0tLS0tLS0tLQorCitSdW4gdGhlIGV4YW1wbGUgYXMgZm9sbG93czoKKworPiAgICAgbXZuIGNsZWFuIGNvbXBpbGUgZXhlYzpqYXZhCisKK1RoaXMgZGVwbG95cyB0aGUgZXhhbXBsZSB1c2luZyBbR3JpenpseV0oaHR0cDovL2dyaXp6bHkuamF2YS5uZXQvKQorCitBIFtXQURMIGRlc2NyaXB0aW9uXShodHRwOi8vd2FkbC5qYXZhLm5ldC8jc3BlYykgbWF5IGJlIGFjY2Vzc2VkIGF0IHRoZSBVUkw6CisKKy0gICA8aHR0cDovL2xvY2FsaG9zdDo5OTk4L2pzb25tb3h5L2FwcGxpY2F0aW9uLndhZGw+CisKK1RoZSByZXNvdXJjZSBpcyBhdmFpbGFibGUgYXQKKworLSAgIDxodHRwOi8vbG9jYWxob3N0Ojk5OTgvanNvbm1veHkvdGVzdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9qc29uLW1veHkvcG9tLnhtbCBiL2V4YW1wbGVzL2pzb24tbW94eS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNWFlMzgKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9qc29uLW1veHkvcG9tLnhtbApAQCAtMCwwICsxLDc3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+anNvbi1tb3h5PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LWV4YW1wbGVzLWpzb24tbW94eTwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgSlNPTiB3aXRoIE1PWHkgZXhhbXBsZS48L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1ncml6emx5Mi1odHRwPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWhrMjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLW1veHk8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1idW5kbGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dHlwZT5wb208L3R5cGU+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmV4ZWMtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8bWFpbkNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmpzb25tb3h5LkFwcDwvbWFpbkNsYXNzPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+cmVsZWFzZTwvaWQ+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICA8L3Byb2ZpbGVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9qc29uLW1veHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qc29ubW94eS9BcHAuamF2YSBiL2V4YW1wbGVzL2pzb24tbW94eS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2pzb25tb3h5L0FwcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MTVkMTEKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9qc29uLW1veHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qc29ubW94eS9BcHAuamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmpzb25tb3h5OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuQ29udGV4dFJlc29sdmVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseTIuaHR0cHNlcnZlci5Hcml6emx5SHR0cFNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW94eS5qc29uLk1veHlKc29uQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guZ3JpenpseS5odHRwLnNlcnZlci5IdHRwU2VydmVyOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEFwcCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgQkFTRV9VUkkgPSBVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0Ojk5OTgvanNvbm1veHkvIik7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkpTT04gd2l0aCBNT1h5IEplcnNleSBFeGFtcGxlIEFwcCIpOworCisgICAgICAgICAgICBmaW5hbCBIdHRwU2VydmVyIHNlcnZlciA9IEdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeS5jcmVhdGVIdHRwU2VydmVyKEJBU0VfVVJJLCBjcmVhdGVBcHAoKSwgZmFsc2UpOworICAgICAgICAgICAgUnVudGltZS5nZXRSdW50aW1lKCkuYWRkU2h1dGRvd25Ib29rKG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyLnNodXRkb3duTm93KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkpOworICAgICAgICAgICAgc2VydmVyLnN0YXJ0KCk7CisKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihTdHJpbmcuZm9ybWF0KCJBcHBsaWNhdGlvbiBzdGFydGVkLiVuU3RvcCB0aGUgYXBwbGljYXRpb24gdXNpbmcgQ1RSTCtDIikpOworCisgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gfCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihBcHAuY2xhc3MuZ2V0TmFtZSgpKS5sb2coTGV2ZWwuU0VWRVJFLCBudWxsLCBleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlQ29uZmlnIGNyZWF0ZUFwcCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZygpCisgICAgICAgICAgICAgICAgLnBhY2thZ2VzKCJvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5qc29ubW94eSIpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKGNyZWF0ZU1veHlKc29uUmVzb2x2ZXIoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBDb250ZXh0UmVzb2x2ZXI8TW94eUpzb25Db25maWc+IGNyZWF0ZU1veHlKc29uUmVzb2x2ZXIoKSB7CisgICAgICAgIGZpbmFsIE1veHlKc29uQ29uZmlnIG1veHlKc29uQ29uZmlnID0gbmV3IE1veHlKc29uQ29uZmlnKCk7CisgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gbmFtZXNwYWNlUHJlZml4TWFwcGVyID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KDEpOworICAgICAgICBuYW1lc3BhY2VQcmVmaXhNYXBwZXIucHV0KCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsICJ4c2kiKTsKKyAgICAgICAgbW94eUpzb25Db25maWcuc2V0TmFtZXNwYWNlUHJlZml4TWFwcGVyKG5hbWVzcGFjZVByZWZpeE1hcHBlcikuc2V0TmFtZXNwYWNlU2VwYXJhdG9yKCc6Jyk7CisgICAgICAgIHJldHVybiBtb3h5SnNvbkNvbmZpZy5yZXNvbHZlcigpOworICAgIH0KK30KKworCisKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2pzb24tbW94eS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2pzb25tb3h5L0pzb25SZXNvdXJjZS5qYXZhIGIvZXhhbXBsZXMvanNvbi1tb3h5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvanNvbm1veHkvSnNvblJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI2ZTQzMAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2pzb24tbW94eS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2pzb25tb3h5L0pzb25SZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuanNvbm1veHk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJ0ZXN0IikKK3B1YmxpYyBjbGFzcyBKc29uUmVzb3VyY2UgeworCisgICAgQEdFVAorICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKyAgICBwdWJsaWMgVGVzdEJlYW4gY3JlYXRlU2ltcGxlQmVhbigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0QmVhbigiYSIsIDEsIDFMKTsKKyAgICB9CisKKyAgICBAUE9TVAorICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKyAgICBAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisgICAgcHVibGljIFRlc3RCZWFuIHJvdW5kVHJpcChUZXN0QmVhbiBzKSB7CisgICAgICAgIHJldHVybiBzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2pzb24tbW94eS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2pzb25tb3h5L1Rlc3RCZWFuLmphdmEgYi9leGFtcGxlcy9qc29uLW1veHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qc29ubW94eS9UZXN0QmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZjFlMzgKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9qc29uLW1veHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qc29ubW94eS9UZXN0QmVhbi5qYXZhCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuanNvbm1veHk7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BYbWxSb290RWxlbWVudAorcHVibGljIGNsYXNzIFRlc3RCZWFuIHsKKworICAgIHB1YmxpYyBTdHJpbmcgYTsKKyAgICBwdWJsaWMgaW50IGI7CisgICAgcHVibGljIGxvbmcgYzsKKworICAgIHB1YmxpYyBUZXN0QmVhbigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgVGVzdEJlYW4oU3RyaW5nIGEsIGludCBiLCBsb25nIGMpIHsKKyAgICAgICAgdGhpcy5hID0gYTsKKyAgICAgICAgdGhpcy5iID0gYjsKKyAgICAgICAgdGhpcy5jID0gYzsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEEoKSB7CisgICAgICAgIHJldHVybiBhOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0QigpIHsKKyAgICAgICAgcmV0dXJuIGI7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0QygpIHsKKyAgICAgICAgcmV0dXJuIGM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmICh0aGlzID09IG8pIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIFRlc3RCZWFuIHRoYXQgPSAoVGVzdEJlYW4pIG87CisKKyAgICAgICAgaWYgKGIgIT0gdGhhdC5iKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGMgIT0gdGhhdC5jKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGEgIT0gbnVsbCA/ICFhLmVxdWFscyh0aGF0LmEpIDogdGhhdC5hICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCByZXN1bHQgPSBhICE9IG51bGwgPyBhLmhhc2hDb2RlKCkgOiAwOworICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIGI7CisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgKGludCkgKGMgXiAoYyA+Pj4gMzIpKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9qc29uLW1veHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qc29ubW94eS9Kc29uUmVzb3VyY2VUZXN0LmphdmEgYi9leGFtcGxlcy9qc29uLW1veHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qc29ubW94eS9Kc29uUmVzb3VyY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y2MDAwYQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2pzb24tbW94eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2pzb25tb3h5L0pzb25SZXNvdXJjZVRlc3QuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmpzb25tb3h5OworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEpzb25SZXNvdXJjZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5EVU1QX0VOVElUWSk7CisKKyAgICAgICAgcmV0dXJuIEFwcC5jcmVhdGVBcHAoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcucmVnaXN0ZXIoQXBwLmNyZWF0ZU1veHlKc29uUmVzb2x2ZXIoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJ0ZXN0Iik7CisgICAgICAgIGZpbmFsIFRlc3RCZWFuIHRlc3RCZWFuID0gdGFyZ2V0LnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSkuZ2V0KFRlc3RCZWFuLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHModGVzdEJlYW4sIG5ldyBUZXN0QmVhbigiYSIsIDEsIDFMKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByb3VuZFRyaXBUZXN0KCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJ0ZXN0Iik7CisgICAgICAgIGZpbmFsIFRlc3RCZWFuIHRlc3RCZWFuID0gdGFyZ2V0CisgICAgICAgICAgICAgICAgLnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSkKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KG5ldyBUZXN0QmVhbigiYSIsIDEsIDFMKSwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSksIFRlc3RCZWFuLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHModGVzdEJlYW4sIG5ldyBUZXN0QmVhbigiYSIsIDEsIDFMKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvanNvbi1wcm9jZXNzaW5nLXdlYmFwcC9SRUFETUUuTUQgYi9leGFtcGxlcy9qc29uLXByb2Nlc3Npbmctd2ViYXBwL1JFQURNRS5NRApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDE3NTBmCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvanNvbi1wcm9jZXNzaW5nLXdlYmFwcC9SRUFETUUuTUQKQEAgLTAsMCArMSw2MSBAQAorWy8vXTogIyAiIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAiCitbLy9dOiAjICIgIgorWy8vXTogIyAiIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAiCitbLy9dOiAjICIgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQgIgorWy8vXTogIyAiIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4gIgorWy8vXTogIyAiICIKK1svL106ICMgIiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlICIKKworSlNPTi1QIEpBWC1SUyBKU09OIFByb3ZpZGVyIEV4YW1wbGUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIHByb2R1Y2UvY29uc3VtZSBKU09OIHJlcHJlc2VudGF0aW9ucworZGVmaW5lZCBieSBbSlNSLTM1M10oaHR0cDovL2pjcC5vcmcvZW4vanNyL2RldGFpbD9pZD0zNTMpLgorCitDb250ZW50cworLS0tLS0tLS0KKworVGhlIG1hcHBpbmcgb2YgdGhlIFVSSSBwYXRoIHNwYWNlIGlzIHByZXNlbnRlZCBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOgorCitVUkkgcGF0aCAgICAgICAgICAgICAgICAgICAgfCBSZXNvdXJjZSBjbGFzcyAgICAgICAgICAgICAgfCBIVFRQIG1ldGhvZHMgICB8IEFsbG93ZWQgdmFsdWVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKipfL2RvY3VtZW50XyoqICAgICAgICAgICAgIHwgRG9jdW1lbnRSZXNvdXJjZSAgICAgICAgICAgIHwgR0VUICAgICAgICAgICAgfAorKipfL2RvY3VtZW50XyoqICAgICAgICAgICAgIHwgRG9jdW1lbnRSZXNvdXJjZSAgICAgICAgICAgIHwgREVMRVRFICAgICAgICAgfMKgCisqKl8vZG9jdW1lbnRfKiogICAgICAgICAgICAgfCBEb2N1bWVudFJlc291cmNlICAgICAgICAgICAgfCBQT1NUICAgICAgICAgICB8IGBKc29uT2JqZWN0YAorKipfL2RvY3VtZW50L3tpZDogXGQrfV8qKiAgIHwgRG9jdW1lbnRSZXNvdXJjZSAgICAgICAgICAgIHwgR0VUICAgICAgICAgICAgfMKgCisqKl8vZG9jdW1lbnQve2lkOiBcZCt9XyoqICAgfCBEb2N1bWVudFJlc291cmNlICAgICAgICAgICAgfCBERUxFVEUgICAgICAgICB8wqAKKyoqXy9kb2N1bWVudC9tdWx0aXBsZV8qKiAgICB8IERvY3VtZW50UmVzb3VyY2UgICAgICAgICAgICB8IFBPU1QgICAgICAgICAgIHwgYEpzb25BcnJheWAgb2YgYEpzb25PYmplY3RgcworKipfL2RvY3VtZW50L2ZpbHRlcl8qKiAgICAgIHwgRG9jdW1lbnRGaWx0ZXJpbmdSZXNvdXJjZSAgIHwgUE9TVCAgICAgICAgICAgfCBgSnNvbkFycmF5YCBvZiBzdHJpbmcgdmFsdWVzCisKKyhTZWUgSnNvblByb2Nlc3NpbmdSZXNvdXJjZVRlc3QgZm9yIG1vcmUgZGV0YWlscy4pCisKK1J1bm5pbmcgdGhlIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworUnVuIHRoZSBleGFtcGxlIGFzIGZvbGxvd3M6CisKKz4gICAgIG12biBjbGVhbiBwYWNrYWdlIGpldHR5OnJ1bgorCitBIFtXQURMIGRlc2NyaXB0aW9uXShodHRwOi8vd2FkbC5qYXZhLm5ldC8jc3BlYykgbWF5IGJlIGFjY2Vzc2VkIGF0IHRoZSBVUkw6CisKKy0gICA8aHR0cDovL2xvY2FsaG9zdDo4MDgwL2pzb25wLXdlYmFwcC9hcHBsaWNhdGlvbi53YWRsPgorCitUaGlzIGRlcGxveXMgY3VycmVudCBleGFtcGxlIHVzaW5nIEpldHR5LiBZb3UgY2FuIGFjY2VzcyB0aGUgYXBwbGljYXRpb24gYXQgPGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qc29ucC13ZWJhcHAvZG9jdW1lbnQ+CisKK1lvdSBjYW4gYWNjZXNzIHJlc291cmNlcyBvZiB0aGlzIGFwcGxpY2F0aW9uIGFsc28gdXNpbmcgY3VybDoKKworIyMjIFN0b3JlIHNvbWUgZG9jdW1lbnRzLgorCis+ICAgICBjdXJsIC1IICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24iIC1YIFBPU1QgLS1kYXRhICdbeyJuYW1lIjoiSmVyc2V5Iiwic2l0ZSI6Imh0dHA6Ly9qZXJzZXkuamF2YS5uZXQifSx7ImFnZSI6MzMsInBob25lIjoiMTU4MTU4MTU4IiwibmFtZSI6IkZvbyJ9LHsibmFtZSI6IkpTT04tUCIsInNpdGUiOiJodHRwOi8vanNvbnAuamF2YS5uZXQifV0nIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qc29ucC13ZWJhcHAvZG9jdW1lbnQvbXVsdGlwbGUKKworIyMjIFJldHJpZXZlIHN0b3JlZCBkb2N1bWVudHMuCisKKz4gICAgIGN1cmwgaHR0cDovL2xvY2FsaG9zdDo4MDgwL2pzb25wLXdlYmFwcC9kb2N1bWVudAorCisjIyMgUmV0cmlldmUgYSBkb2N1bWVudCB3aXRoIGlkIDEuCisKKz4gICAgIGN1cmwgaHR0cDovL2xvY2FsaG9zdDo4MDgwL2pzb25wLXdlYmFwcC9kb2N1bWVudC8xCisKKyMjIyBSZXRyaWV2ZSBgc2l0ZWAgYXR0cmlidXRlcyB3aXRoIHZhbHVlcyBvZiBkb2N1bWVudHMgY29udGFpbmluZyB0aGlzIGF0dHJpYnV0ZS4KKworPiAgICAgY3VybCAtSCAiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9qc29uIiAtWCBQT1NUIC0tZGF0YSAnWyJzaXRlIl0nIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qc29ucC13ZWJhcHAvZG9jdW1lbnQvZmlsdGVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9qc29uLXByb2Nlc3Npbmctd2ViYXBwL3BvbS54bWwgYi9leGFtcGxlcy9qc29uLXByb2Nlc3Npbmctd2ViYXBwL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg0MDAzYgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2pzb24tcHJvY2Vzc2luZy13ZWJhcHAvcG9tLnhtbApAQCAtMCwwICsxLDY5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorCisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPndlYmFwcC1leGFtcGxlLXBhcmVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi93ZWJhcHAtZXhhbXBsZS1wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+anNvbi1wcm9jZXNzaW5nLXdlYmFwcDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS1leGFtcGxlcy1qc29uLXByb2Nlc3Npbmctd2ViYXBwPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPkplcnNleSBKU09OLVAgKEpTUiAzNTMpIGV4YW1wbGUuPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtanNvbi1wcm9jZXNzaW5nPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWhrMjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamV0dHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5yZWxlYXNlPC9pZD4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+eG1sLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICA8L3Byb2ZpbGVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9qc29uLXByb2Nlc3Npbmctd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvanNvbnAvTXlBcHBsaWNhdGlvbi5qYXZhIGIvZXhhbXBsZXMvanNvbi1wcm9jZXNzaW5nLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2pzb25wL015QXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjVkYTcxCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvanNvbi1wcm9jZXNzaW5nLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2pzb25wL015QXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmpzb25wOworCitpbXBvcnQgamF2YXguanNvbi5zdHJlYW0uSnNvbkdlbmVyYXRvcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgTXlBcHBsaWNhdGlvbiBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKworICAgIHB1YmxpYyBNeUFwcGxpY2F0aW9uKCkgeworICAgICAgICBwYWNrYWdlcygib3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuanNvbnAucmVzb3VyY2UiKTsKKyAgICAgICAgcmVnaXN0ZXIoTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpOworICAgICAgICBwcm9wZXJ0eShKc29uR2VuZXJhdG9yLlBSRVRUWV9QUklOVElORywgdHJ1ZSk7CisgICAgfQorfQorCisKKwpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvanNvbi1wcm9jZXNzaW5nLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2pzb25wL3Jlc291cmNlL0RvY3VtZW50RmlsdGVyaW5nUmVzb3VyY2UuamF2YSBiL2V4YW1wbGVzL2pzb24tcHJvY2Vzc2luZy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qc29ucC9yZXNvdXJjZS9Eb2N1bWVudEZpbHRlcmluZ1Jlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNhOTI5OQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2pzb24tcHJvY2Vzc2luZy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qc29ucC9yZXNvdXJjZS9Eb2N1bWVudEZpbHRlcmluZ1Jlc291cmNlLmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5qc29ucC5yZXNvdXJjZTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IGphdmF4Lmpzb24uSnNvbjsKK2ltcG9ydCBqYXZheC5qc29uLkpzb25BcnJheTsKK2ltcG9ydCBqYXZheC5qc29uLkpzb25BcnJheUJ1aWxkZXI7CitpbXBvcnQgamF2YXguanNvbi5Kc29uT2JqZWN0OworaW1wb3J0IGphdmF4Lmpzb24uSnNvbk9iamVjdEJ1aWxkZXI7CitpbXBvcnQgamF2YXguanNvbi5Kc29uU3RyaW5nOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuanNvbnAuc2VydmljZS5Eb2N1bWVudFN0b3JhZ2U7CisKKy8qKgorICogUmVzb3VyY2UgZmlsdGVyaW5nIHN0b3JlZCBkb2N1bWVudHMgYmFzZWQgb24gdGhlIHByZXNlbmNlIG9mIGdpdmVuIGF0dHJpYnV0ZXMuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKK0BQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKK3B1YmxpYyBjbGFzcyBEb2N1bWVudEZpbHRlcmluZ1Jlc291cmNlIHsKKworICAgIEBQT1NUCisgICAgcHVibGljIEpzb25BcnJheSBmaWx0ZXIoZmluYWwgSnNvbkFycmF5IHByb3BlcnRpZXMpIHsKKyAgICAgICAgZmluYWwgSnNvbkFycmF5QnVpbGRlciBkb2N1bWVudHMgPSBKc29uLmNyZWF0ZUFycmF5QnVpbGRlcigpOworICAgICAgICBmaW5hbCBMaXN0PEpzb25TdHJpbmc+IHByb3BlcnR5TGlzdCA9IHByb3BlcnRpZXMuZ2V0VmFsdWVzQXMoSnNvblN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgZm9yIChmaW5hbCBKc29uT2JqZWN0IGpzb25PYmplY3QgOiBEb2N1bWVudFN0b3JhZ2UuZ2V0QWxsKCkpIHsKKyAgICAgICAgICAgIGZpbmFsIEpzb25PYmplY3RCdWlsZGVyIGRvY3VtZW50QnVpbGRlciA9IEpzb24uY3JlYXRlT2JqZWN0QnVpbGRlcigpOworCisgICAgICAgICAgICBmb3IgKGZpbmFsIEpzb25TdHJpbmcgcHJvcGVydHkgOiBwcm9wZXJ0eUxpc3QpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcga2V5ID0gcHJvcGVydHkuZ2V0U3RyaW5nKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoanNvbk9iamVjdC5jb250YWluc0tleShrZXkpKSB7CisgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50QnVpbGRlci5hZGQoa2V5LCBqc29uT2JqZWN0LmdldChrZXkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIEpzb25PYmplY3QgZG9jdW1lbnQgPSBkb2N1bWVudEJ1aWxkZXIuYnVpbGQoKTsKKyAgICAgICAgICAgIGlmICghZG9jdW1lbnQuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgZG9jdW1lbnRzLmFkZChkb2N1bWVudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZG9jdW1lbnRzLmJ1aWxkKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9qc29uLXByb2Nlc3Npbmctd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvanNvbnAvcmVzb3VyY2UvRG9jdW1lbnRSZXNvdXJjZS5qYXZhIGIvZXhhbXBsZXMvanNvbi1wcm9jZXNzaW5nLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2pzb25wL3Jlc291cmNlL0RvY3VtZW50UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmE0MmI5Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvanNvbi1wcm9jZXNzaW5nLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2pzb25wL3Jlc291cmNlL0RvY3VtZW50UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDg0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmpzb25wLnJlc291cmNlOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuREVMRVRFOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgamF2YXguanNvbi5Kc29uOworaW1wb3J0IGphdmF4Lmpzb24uSnNvbkFycmF5OworaW1wb3J0IGphdmF4Lmpzb24uSnNvbkFycmF5QnVpbGRlcjsKK2ltcG9ydCBqYXZheC5qc29uLkpzb25PYmplY3Q7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5qc29ucC5zZXJ2aWNlLkRvY3VtZW50U3RvcmFnZTsKKworLyoqCisgKiBEb2N1bWVudCBSZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFBhdGgoImRvY3VtZW50IikKK0BDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKK0BQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKK3B1YmxpYyBjbGFzcyBEb2N1bWVudFJlc291cmNlIHsKKworICAgIEBHRVQKKyAgICBwdWJsaWMgSnNvbkFycmF5IGdldEFsbCgpIHsKKyAgICAgICAgZmluYWwgSnNvbkFycmF5QnVpbGRlciBhcnJheUJ1aWxkZXIgPSBKc29uLmNyZWF0ZUFycmF5QnVpbGRlcigpOworICAgICAgICBmb3IgKGZpbmFsIEpzb25PYmplY3QgZG9jdW1lbnQgOiBEb2N1bWVudFN0b3JhZ2UuZ2V0QWxsKCkpIHsKKyAgICAgICAgICAgIGFycmF5QnVpbGRlci5hZGQoZG9jdW1lbnQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhcnJheUJ1aWxkZXIuYnVpbGQoKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoIntpZDogXFxkK30iKQorICAgIHB1YmxpYyBKc29uT2JqZWN0IGdldChAUGF0aFBhcmFtKCJpZCIpIGZpbmFsIGludCBpZCkgeworICAgICAgICByZXR1cm4gRG9jdW1lbnRTdG9yYWdlLmdldChpZCk7CisgICAgfQorCisgICAgQERFTEVURQorICAgIEBQYXRoKCJ7aWQ6IFxcZCt9IikKKyAgICBwdWJsaWMgSnNvbk9iamVjdCByZW1vdmUoQFBhdGhQYXJhbSgiaWQiKSBmaW5hbCBpbnQgaWQpIHsKKyAgICAgICAgcmV0dXJuIERvY3VtZW50U3RvcmFnZS5yZW1vdmUoaWQpOworICAgIH0KKworICAgIEBERUxFVEUKKyAgICBwdWJsaWMgdm9pZCByZW1vdmVBbGwoKSB7CisgICAgICAgIERvY3VtZW50U3RvcmFnZS5yZW1vdmVBbGwoKTsKKyAgICB9CisKKyAgICBAUE9TVAorICAgIHB1YmxpYyBKc29uQXJyYXkgc3RvcmUoZmluYWwgSnNvbk9iamVjdCBkb2N1bWVudCkgeworICAgICAgICByZXR1cm4gSnNvbi5jcmVhdGVBcnJheUJ1aWxkZXIoKS5hZGQoRG9jdW1lbnRTdG9yYWdlLnN0b3JlKGRvY3VtZW50KSkuYnVpbGQoKTsKKyAgICB9CisKKyAgICBAUE9TVAorICAgIEBQYXRoKCJtdWx0aXBsZSIpCisgICAgcHVibGljIEpzb25BcnJheSBzdG9yZShmaW5hbCBKc29uQXJyYXkgZG9jdW1lbnRzKSB7CisgICAgICAgIGZpbmFsIEpzb25BcnJheUJ1aWxkZXIgYXJyYXlCdWlsZGVyID0gSnNvbi5jcmVhdGVBcnJheUJ1aWxkZXIoKTsKKyAgICAgICAgZm9yIChmaW5hbCBKc29uT2JqZWN0IGRvY3VtZW50IDogZG9jdW1lbnRzLmdldFZhbHVlc0FzKEpzb25PYmplY3QuY2xhc3MpKSB7CisgICAgICAgICAgICBhcnJheUJ1aWxkZXIuYWRkKERvY3VtZW50U3RvcmFnZS5zdG9yZShkb2N1bWVudCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhcnJheUJ1aWxkZXIuYnVpbGQoKTsKKyAgICB9CisKKyAgICBAUGF0aCgiZmlsdGVyIikKKyAgICBwdWJsaWMgQ2xhc3M8RG9jdW1lbnRGaWx0ZXJpbmdSZXNvdXJjZT4gZ2V0RmlsdGVyaW5nUmVzb3VyY2UoKSB7CisgICAgICAgIHJldHVybiBEb2N1bWVudEZpbHRlcmluZ1Jlc291cmNlLmNsYXNzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2pzb24tcHJvY2Vzc2luZy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qc29ucC9zZXJ2aWNlL0RvY3VtZW50U3RvcmFnZS5qYXZhIGIvZXhhbXBsZXMvanNvbi1wcm9jZXNzaW5nLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2pzb25wL3NlcnZpY2UvRG9jdW1lbnRTdG9yYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM1ODdkMgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2pzb24tcHJvY2Vzc2luZy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qc29ucC9zZXJ2aWNlL0RvY3VtZW50U3RvcmFnZS5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuanNvbnAuc2VydmljZTsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CisKK2ltcG9ydCBqYXZheC5qc29uLkpzb25PYmplY3Q7CisKKy8qKgorICogU3RvcmFnZSBvZiBkb2N1bWVudHMuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBEb2N1bWVudFN0b3JhZ2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPEludGVnZXIsIEpzb25PYmplY3Q+IHN0b3JhZ2UgPSBuZXcgTGlua2VkSGFzaE1hcDw+KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXRvbWljSW50ZWdlciBjb3VudGVyID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CisKKyAgICBwdWJsaWMgc3RhdGljIGludCBzdG9yZShmaW5hbCBKc29uT2JqZWN0IGRvY3VtZW50KSB7CisgICAgICAgIGZpbmFsIGludCBpZCA9IGNvdW50ZXIuYWRkQW5kR2V0KDEpOworICAgICAgICBzdG9yYWdlLnB1dChpZCwgZG9jdW1lbnQpOworICAgICAgICByZXR1cm4gaWQ7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBKc29uT2JqZWN0IGdldChmaW5hbCBpbnQgaWQpIHsKKyAgICAgICAgcmV0dXJuIHN0b3JhZ2UuZ2V0KGlkKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248SnNvbk9iamVjdD4gZ2V0QWxsKCkgeworICAgICAgICByZXR1cm4gc3RvcmFnZS52YWx1ZXMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIEpzb25PYmplY3QgcmVtb3ZlKGZpbmFsIGludCBpZCkgeworICAgICAgICByZXR1cm4gc3RvcmFnZS5yZW1vdmUoaWQpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVBbGwoKSB7CisgICAgICAgIHN0b3JhZ2UuY2xlYXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmV2ZW50IGluaXRpYWxpemF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgRG9jdW1lbnRTdG9yYWdlKCkgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2pzb24tcHJvY2Vzc2luZy13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL2V4YW1wbGVzL2pzb24tcHJvY2Vzc2luZy13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWExN2ViCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvanNvbi1wcm9jZXNzaW5nLXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi41IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIj4KKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5qc29ucC5NeUFwcGxpY2F0aW9uPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC53cy5ycy5BcHBsaWNhdGlvbjwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5qc29ucC5NeUFwcGxpY2F0aW9uPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmphdmF4Lmpzb24uc3RyZWFtLkpzb25HZW5lcmF0b3IucHJldHR5UHJpbnRpbmc8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5qc29ucC5NeUFwcGxpY2F0aW9uPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9qc29uLXByb2Nlc3Npbmctd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvanNvbnAvSnNvblByb2Nlc3NpbmdSZXNvdXJjZVRlc3QuamF2YSBiL2V4YW1wbGVzL2pzb24tcHJvY2Vzc2luZy13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qc29ucC9Kc29uUHJvY2Vzc2luZ1Jlc291cmNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNjg2YzEKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9qc29uLXByb2Nlc3Npbmctd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvanNvbnAvSnNvblByb2Nlc3NpbmdSZXNvdXJjZVRlc3QuamF2YQpAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5qc29ucDsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKKworaW1wb3J0IGphdmF4Lmpzb24uSnNvbjsKK2ltcG9ydCBqYXZheC5qc29uLkpzb25BcnJheTsKK2ltcG9ydCBqYXZheC5qc29uLkpzb25BcnJheUJ1aWxkZXI7CitpbXBvcnQgamF2YXguanNvbi5Kc29uTnVtYmVyOworaW1wb3J0IGphdmF4Lmpzb24uSnNvbk9iamVjdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgSnNvblByb2Nlc3NpbmdSZXNvdXJjZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3Q8SnNvbk9iamVjdD4gZG9jdW1lbnRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICBzdGF0aWMgeworICAgICAgICBkb2N1bWVudHMuYWRkKEpzb24uY3JlYXRlT2JqZWN0QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKCJuYW1lIiwgIkplcnNleSIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKCJzaXRlIiwgImh0dHA6Ly9qZXJzZXkuZ2l0aHViLmlvIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpCisgICAgICAgICk7CisgICAgICAgIGRvY3VtZW50cy5hZGQoSnNvbi5jcmVhdGVPYmplY3RCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoImFnZSIsIDMzKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFkZCgicGhvbmUiLCAiMTU4MTU4MTU4IikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoIm5hbWUiLCAiRm9vIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpCisgICAgICAgICk7CisgICAgICAgIGRvY3VtZW50cy5hZGQoSnNvbi5jcmVhdGVPYmplY3RCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoIm5hbWUiLCAiSlNPTi1QIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoInNpdGUiLCAiaHR0cHM6Ly9qYXZhZWUuZ2l0aHViLmlvL2pzb25wLyIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKQorICAgICAgICApOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgTXlBcHBsaWNhdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBVUkkgZ2V0QmFzZVVyaSgpIHsKKyAgICAgICAgcmV0dXJuIFVyaUJ1aWxkZXIuZnJvbVVyaShzdXBlci5nZXRCYXNlVXJpKCkpLnBhdGgoImpzb24tcHJvY2Vzc2luZy13ZWJhcHAiKS5idWlsZCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0b3JlR2V0UmVtb3ZlRG9jdW1lbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSnNvbk9iamVjdCBkb2N1bWVudCA9IGRvY3VtZW50cy5nZXQoMCk7CisKKyAgICAgICAgLy8gU3RvcmUuCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJkb2N1bWVudCIpLnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pLnBvc3QoRW50aXR5Lmpzb24oZG9jdW1lbnQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworCisgICAgICAgIGZpbmFsIExpc3Q8SnNvbk51bWJlcj4gaWRzID0gcmVzcG9uc2UucmVhZEVudGl0eShKc29uQXJyYXkuY2xhc3MpLmdldFZhbHVlc0FzKEpzb25OdW1iZXIuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgaWRzLnNpemUoKSk7CisKKyAgICAgICAgLy8gR2V0LgorICAgICAgICBmaW5hbCBTdHJpbmcgaWQgPSBpZHMuZ2V0KDApLnRvU3RyaW5nKCk7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCBkb2N1bWVudFRhcmdldCA9IHRhcmdldCgiZG9jdW1lbnQiKS5wYXRoKGlkKTsKKyAgICAgICAgZmluYWwgSnNvbk9iamVjdCBzdG9yZWREb2N1bWVudCA9IGRvY3VtZW50VGFyZ2V0LnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisgICAgICAgICAgICAgICAgLmdldChKc29uT2JqZWN0LmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRvY3VtZW50LCBzdG9yZWREb2N1bWVudCk7CisKKyAgICAgICAgLy8gUmVtb3ZlLgorICAgICAgICBmaW5hbCBKc29uT2JqZWN0IHJlbW92ZWREb2N1bWVudCA9IGRvY3VtZW50VGFyZ2V0LnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pLmRlbGV0ZShKc29uT2JqZWN0LmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGRvY3VtZW50LCByZW1vdmVkRG9jdW1lbnQpOworCisgICAgICAgIC8vIEdldC4KKyAgICAgICAgZmluYWwgUmVzcG9uc2UgZXJyb3JSZXNwb25zZSA9IGRvY3VtZW50VGFyZ2V0LnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjA0LCBlcnJvclJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEpzb25BcnJheSBnZXREb2N1bWVudEpzb25BcnJheSgpIHsKKyAgICAgICAgZmluYWwgSnNvbkFycmF5QnVpbGRlciBhcnJheUJ1aWxkZXIgPSBKc29uLmNyZWF0ZUFycmF5QnVpbGRlcigpOworICAgICAgICBmb3IgKGZpbmFsIEpzb25PYmplY3QgZG9jdW1lbnQgOiBkb2N1bWVudHMpIHsKKyAgICAgICAgICAgIGFycmF5QnVpbGRlci5hZGQoZG9jdW1lbnQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhcnJheUJ1aWxkZXIuYnVpbGQoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdG9yZURvY3VtZW50cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiZG9jdW1lbnQvbXVsdGlwbGUiKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKS5wb3N0KEVudGl0eS5qc29uKGdldERvY3VtZW50SnNvbkFycmF5KCkpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgZmluYWwgTGlzdDxKc29uTnVtYmVyPiBpZHMgPSByZXNwb25zZS5yZWFkRW50aXR5KEpzb25BcnJheS5jbGFzcykuZ2V0VmFsdWVzQXMoSnNvbk51bWJlci5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhkb2N1bWVudHMuc2l6ZSgpLCBpZHMuc2l6ZSgpKTsKKworICAgICAgICAvLyBSZW1vdmUgQWxsLgorICAgICAgICB0YXJnZXQoImRvY3VtZW50IikucmVxdWVzdCgpLmRlbGV0ZSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpbHRlckRvY3VtZW50cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBTdG9yZSBkb2N1bWVudHMuCisgICAgICAgIHRhcmdldCgiZG9jdW1lbnQvbXVsdGlwbGUiKS5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUpLnBvc3QoRW50aXR5Lmpzb24oZ2V0RG9jdW1lbnRKc29uQXJyYXkoKSkpOworCisgICAgICAgIC8vIEZpbHRlci4KKyAgICAgICAgSnNvbkFycmF5IGZpbHRlciA9IEpzb24uY3JlYXRlQXJyYXlCdWlsZGVyKCkuYWRkKCJzaXRlIikuYnVpbGQoKTsKKyAgICAgICAgSnNvbkFycmF5IGZpbHRlcmVkID0gdGFyZ2V0KCJkb2N1bWVudC9maWx0ZXIiKS5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5qc29uKGZpbHRlciksIEpzb25BcnJheS5jbGFzcyk7CisKKyAgICAgICAgY2hlY2tGaWx0ZXJlZERvY3VtZW50cyhmaWx0ZXJlZCwgMiwgInNpdGUiKTsKKworICAgICAgICBmaWx0ZXIgPSBKc29uLmNyZWF0ZUFycmF5QnVpbGRlcigpLmFkZCgic2l0ZSIpLmFkZCgiYWdlIikuYnVpbGQoKTsKKyAgICAgICAgZmlsdGVyZWQgPSB0YXJnZXQoImRvY3VtZW50L2ZpbHRlciIpLnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5Lmpzb24oZmlsdGVyKSwgSnNvbkFycmF5LmNsYXNzKTsKKworICAgICAgICBjaGVja0ZpbHRlcmVkRG9jdW1lbnRzKGZpbHRlcmVkLCAzLCAic2l0ZSIsICJhZ2UiKTsKKworICAgICAgICAvLyBSZW1vdmUgQWxsLgorICAgICAgICB0YXJnZXQoImRvY3VtZW50IikucmVxdWVzdCgpLmRlbGV0ZSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja0ZpbHRlcmVkRG9jdW1lbnRzKGZpbmFsIEpzb25BcnJheSBmaWx0ZXJlZCwgZmluYWwgaW50IHNpemUsIGZpbmFsIFN0cmluZy4uLiBwcm9wZXJ0aWVzKSB7CisgICAgICAgIGFzc2VydEVxdWFscyhzaXplLCBmaWx0ZXJlZC5zaXplKCkpOworCisgICAgICAgIFNldDxTdHJpbmc+IHN0cmluZ3MgPSBBcnJheXMuc3RyZWFtKHByb3BlcnRpZXMpLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKTsKKyAgICAgICAgZm9yIChmaW5hbCBKc29uT2JqZWN0IGRvY3VtZW50IDogZmlsdGVyZWQuZ2V0VmFsdWVzQXMoSnNvbk9iamVjdC5jbGFzcykpIHsKKyAgICAgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIHByb3BlcnR5IDogZG9jdW1lbnQua2V5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHN0cmluZ3MuY29udGFpbnMocHJvcGVydHkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2pzb24td2l0aC1wYWRkaW5nL1JFQURNRS5NRCBiL2V4YW1wbGVzL2pzb24td2l0aC1wYWRkaW5nL1JFQURNRS5NRApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzEyYTMwCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvanNvbi13aXRoLXBhZGRpbmcvUkVBRE1FLk1ECkBAIC0wLDAgKzEsNzEgQEAKK1svL106ICMgIiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIgorWy8vXTogIyAiICIKK1svL106ICMgIiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgIgorWy8vXTogIyAiIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0ICIKK1svL106ICMgIiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuICIKK1svL106ICMgIiAiCitbLy9dOiAjICIgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZSAiCisKK0pTT05QIEV4YW1wbGUKKz09PT09PT09PT09PT0KKworVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gdXNlIEpTT05QIHdyYXBwZXIgaW4gb3JkZXIgdG8gc2VydmUgbm90Citvbmx5IEpTT04gYnV0IGFsc28gYSBKYXZhU2NyaXB0IGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIGEgZnVuY3Rpb24gY2FsbAord2l0aCB0aGUgb3JpZ2luYWwgSlNPTiBkYXRhIGFzIGEgcGFyYW1ldGVyLiBUaGUgdGVjaG5pcXVlIGlzIHdlbGwKK2Rlc2NyaWJlZCBlLmcuIGF0IDxodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0pTT04jSlNPTlA+LgorCitBIHNpbXBsZSB3ZWIgYXBwbGljYXRpb24gaXMgcHJlc2VudGVkIHdpdGgganVzdCBvbmUgcmVzb3VyY2U6IGEgY2hhbmdlCityZWNvcmQgbGlzdC4gQSBjbGllbnQgY2FuIG9idGFpbiB0aGUgbGlzdCB1c2luZyBYTUwgb3IgSlNPTiBvcgorSmF2YVNjcmlwdCByZXByZXNlbnRhdGlvbi4gVGhlIGxhc3QgY2hhbmdlIHJlY29yZCBpcyBhbHNvIGF2YWlsYWJsZSBpbgorYWxsIHRocmVlIGZvcm1hdHMgYXMgYSBzdWJyZXNvdXJjZSBvZiB0aGUgcHJldmlvdXNseSBtZW50aW9uZWQgbGlzdAorcmVzb3VyY2UuCisKK0NvbnRlbnRzCistLS0tLS0tLQorCitUaGUgY2hhbmdlIHJlY29yZCBsaXN0IHdlYiByZXNvdXJjZSBpcyBpbXBsZW1lbnRlZCBieQorYG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmpzb25wLkNoYW5nZUxpc3RSZXNvdXJjZWAgY2xhc3MuCisKK1RoZSBtYXBwaW5nIG9mIHRoZSBVUkkgcGF0aCBzcGFjZSBpcyBwcmVzZW50ZWQgaW4gdGhlIGZvbGxvd2luZyB0YWJsZToKKworVVJJIHBhdGggICAgICAgICAgICAgICAgfCBSZXNvdXJjZSBjbGFzcyAgIHwgSFRUUCBtZXRob2RzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLQorKipfL2NoYW5nZXNfKiogICAgICAgICAgfCBDaGFuZ2VMaXN0ICAgICAgIHwgR0VUCisqKl8vY2hhbmdlcy9sYXRlc3RfKiogICB8IENoYW5nZUxpc3QgICAgICAgfCBHRVQKKworUnVubmluZyB0aGUgRXhhbXBsZQorLS0tLS0tLS0tLS0tLS0tLS0tLQorCitSdW4gdGhlIGV4YW1wbGUgYXMgZm9sbG93czoKKworPiAgICAgbXZuIGNsZWFuIGNvbXBpbGUgZXhlYzpqYXZhCisKK1RoaXMgZGVwbG95cyB0aGUgSlNPTlAgZXhhbXBsZSB1c2luZyBbR3JpenpseV0oaHR0cDovL2dyaXp6bHkuamF2YS5uZXQvKQorCitBIFtXQURMIGRlc2NyaXB0aW9uXShodHRwOi8vd2FkbC5qYXZhLm5ldC8jc3BlYykgbWF5IGJlIHRoZW4gYWNjZXNzZWQgYXQgdGhlIFVSTDoKKworLSA8aHR0cDovL2xvY2FsaG9zdDo4MDgwL2pzb25wL2FwcGxpY2F0aW9uLndhZGw+CisKK0ZvbGxvd2luZyBzdGVwcyBhcmUgdXNpbmcgW2NVUkxdKGh0dHA6Ly9jdXJsLmhheHguc2UvKSBjb21tYW5kIGxpbmUgdG9vbDoKKworR2V0IHRoZSBsaXN0IG9mIGNoYW5nZXMgaW4gSlNPTiBmb3JtYXQ6CisKKz4gICAgIGN1cmwgLUhBY2NlcHQ6YXBwbGljYXRpb24vanNvbiBodHRwOi8vbG9jYWxob3N0OjgwODAvanNvbnAvY2hhbmdlcworCitHZXQgdGhlIGxpc3Qgb2YgY2hhbmdlcyBpbiBYTUwgZm9ybWF0OgorCis+ICAgICBjdXJsIC1IQWNjZXB0OmFwcGxpY2F0aW9uL3htbCBodHRwOi8vbG9jYWxob3N0OjgwODAvanNvbnAvY2hhbmdlcworCitHZXQgdGhlIGxpc3Qgb2YgY2hhbmdlcyBhcyBhIEphdmFTY3JpcHQgY2FsbGJhY2s6CisKKz4gICAgIGN1cmwgLUhBY2NlcHQ6YXBwbGljYXRpb24veC1qYXZhc2NyaXB0IGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qc29ucC9jaGFuZ2VzCisKK1lvdSBjYW4gYWxzbyBzZWUgdGVzdCBjbGFzc2VzIGF0IGBzcmMvbWFpbi90ZXN0YCBzdWJkaXJlY3RvcnkgZm9yIGRldGFpbAoraW5mb3JtYXRpb24gaG93IHRvIGNvbnN1bWUgdGhlIHNlcnZpY2UgdXNpbmcgSmVyc2V5IGNsaWVudCBBUEkKKworIyMjIEphdmFTY3JpcHQgQ2xpZW50CisKK0FmdGVyIHN0YXJ0aW5nIHRoZSBzZXJ2aWNlIGFuZCByZWZyZXNoaW5nIHRoaXMgcGFnZSwgYSBsaXN0IG9mIGNoYW5nZXMKK3Nob3VsZCBiZSBkaXNwbGF5ZWQgYmVsb3c6CisKK2BZb3UgbmVlZCB0byBydW4gdGhlIHNlcnZpY2UgZmlyc3QhYApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2pzb24td2l0aC1wYWRkaW5nL3BvbS54bWwgYi9leGFtcGxlcy9qc29uLXdpdGgtcGFkZGluZy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjODE0YTMKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9qc29uLXdpdGgtcGFkZGluZy9wb20ueG1sCkBAIC0wLDAgKzEsODMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisKKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmpzb24td2l0aC1wYWRkaW5nPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LWV4YW1wbGVzLWpzb24td2l0aC1wYWRkaW5nPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPkplcnNleSBKU09OIHdpdGggUGFkZGluZyBleGFtcGxlLjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLWdyaXp6bHkyLWh0dHA8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktaGsyPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtbW94eTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi54bWwuYmluZDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmpheGItaW1wbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhlYy1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxtYWluQ2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuanNvbnAuQXBwPC9tYWluQ2xhc3M+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5yZWxlYXNlPC9pZD4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL2pzb24td2l0aC1wYWRkaW5nL3NyYy9tYWluL2Fzc2VtYmx5L3NyYy54bWwgYi9leGFtcGxlcy9qc29uLXdpdGgtcGFkZGluZy9zcmMvbWFpbi9hc3NlbWJseS9zcmMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNDdhNGIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9qc29uLXdpdGgtcGFkZGluZy9zcmMvbWFpbi9hc3NlbWJseS9zcmMueG1sCkBAIC0wLDAgKzEsMjggQEAKKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisKKy0tPgorCis8YXNzZW1ibHk+CisgIDxpZD5wcm9qZWN0PC9pZD4KKyAgPGZvcm1hdHM+CisgICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KKyAgPC9mb3JtYXRzPgorICA8ZmlsZVNldHM+CisgICAgPGZpbGVTZXQ+CisgICAgICA8ZGlyZWN0b3J5Pi48L2RpcmVjdG9yeT4KKyAgICAgIDxvdXRwdXREaXJlY3Rvcnk+PC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICA8dXNlRGVmYXVsdEV4Y2x1ZGVzPnRydWU8L3VzZURlZmF1bHRFeGNsdWRlcz4KKyAgICAgIDxleGNsdWRlcz4KKyAgICAgICAgPGV4Y2x1ZGU+KiovdGFyZ2V0LyoqPC9leGNsdWRlPgorICAgICAgPC9leGNsdWRlcz4KKyAgICA8L2ZpbGVTZXQ+CisgIDwvZmlsZVNldHM+Cis8L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvanNvbi13aXRoLXBhZGRpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qc29ucC9BcHAuamF2YSBiL2V4YW1wbGVzL2pzb24td2l0aC1wYWRkaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvanNvbnAvQXBwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RiY2M1MQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2pzb24td2l0aC1wYWRkaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvanNvbnAvQXBwLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5qc29ucDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkyLmh0dHBzZXJ2ZXIuR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guZ3JpenpseS5odHRwLnNlcnZlci5IdHRwU2VydmVyOworCisvKioKKyAqIFV0aWxpdHkgY2xhc3Mgd2hpY2ggY2FuIGNyZWF0ZSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlcn0gaW5zdGFuY2UgYW5kIHByb3ZpZGVzIHN1cHBvcnQKKyAqIGZvciBydW5uaW5nIHRoaXMgc2FtcGxlIGZyb20gY29tbWFuZCBsaW5lLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQXBwIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVSSSBCQVNFX1VSSSA9IFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qc29ucC8iKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBST09UX1BBVEggPSAiY2hhbmdlcyI7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkpTT05QIEplcnNleSBFeGFtcGxlIEFwcCIpOworCisgICAgICAgICAgICBmaW5hbCBIdHRwU2VydmVyIHNlcnZlciA9IEdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeS5jcmVhdGVIdHRwU2VydmVyKEJBU0VfVVJJLCBjcmVhdGVBcHAoKSwgZmFsc2UpOworICAgICAgICAgICAgUnVudGltZS5nZXRSdW50aW1lKCkuYWRkU2h1dGRvd25Ib29rKG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyLnNodXRkb3duTm93KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkpOworICAgICAgICAgICAgc2VydmVyLnN0YXJ0KCk7CisKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiQXBwbGljYXRpb24gc3RhcnRlZC4lblRyeSBvdXQgJXMlcyVuU3RvcCB0aGUgYXBwbGljYXRpb24gdXNpbmcgQ1RSTCtDIiwgQkFTRV9VUkksIFJPT1RfUEFUSCkpOworCisgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gfCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihBcHAuY2xhc3MuZ2V0TmFtZSgpKS5sb2coTGV2ZWwuU0VWRVJFLCBudWxsLCBleCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VDb25maWcgY3JlYXRlQXBwKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKENoYW5nZUxpc3RSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvanNvbi13aXRoLXBhZGRpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qc29ucC9DaGFuZ2VMaXN0UmVzb3VyY2UuamF2YSBiL2V4YW1wbGVzL2pzb24td2l0aC1wYWRkaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvanNvbnAvQ2hhbmdlTGlzdFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBiMjRhNgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL2pzb24td2l0aC1wYWRkaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvanNvbnAvQ2hhbmdlTGlzdFJlc291cmNlLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5qc29ucDsKKworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5KU09OUDsKKworLyoqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aChBcHAuUk9PVF9QQVRIKQorQFByb2R1Y2VzKHsiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0IiwgImFwcGxpY2F0aW9uL2pzb24iLCAiYXBwbGljYXRpb24veG1sIn0pCitwdWJsaWMgY2xhc3MgQ2hhbmdlTGlzdFJlc291cmNlIHsKKworICAgIHN0YXRpYyBmaW5hbCBMaXN0PENoYW5nZVJlY29yZEJlYW4+IGNoYW5nZXMgPSBuZXcgTGlua2VkTGlzdDxDaGFuZ2VSZWNvcmRCZWFuPigpOworCisgICAgc3RhdGljIHsKKyAgICAgICAgY2hhbmdlcy5hZGQobmV3IENoYW5nZVJlY29yZEJlYW4oZmFsc2UsIDIsICJ0aXRsZSBcIlVzZXIgR3VpZGVcIiB1cGRhdGVkIikpOworICAgICAgICBjaGFuZ2VzLmFkZChuZXcgQ2hhbmdlUmVjb3JkQmVhbih0cnVlLCAxLCAiZml4ZWQgbWV0YWRhdGEiKSk7CisgICAgICAgIGNoYW5nZXMuYWRkKG5ldyBDaGFuZ2VSZWNvcmRCZWFuKGZhbHNlLCA5MSwgImFkZGVkIGluZGV4IikpOworICAgICAgICBjaGFuZ2VzLmFkZChuZXcgQ2hhbmdlUmVjb3JkQmVhbihmYWxzZSwgNjUwLCAiXCJUcm91Ymxlc2hvb3RoaW5nXCIgY2hhcHRlciIpKTsKKyAgICAgICAgY2hhbmdlcy5hZGQobmV3IENoYW5nZVJlY29yZEJlYW4oZmFsc2UsIDEsICJmaXhpbmcgdHlwbyIpKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQEpTT05QKHF1ZXJ5UGFyYW0gPSBKU09OUC5ERUZBVUxUX1FVRVJZKQorICAgIHB1YmxpYyBMaXN0PENoYW5nZVJlY29yZEJlYW4+IGdldENoYW5nZXMoQFF1ZXJ5UGFyYW0oSlNPTlAuREVGQVVMVF9RVUVSWSkgU3RyaW5nIGNhbGxiYWNrLCBAUXVlcnlQYXJhbSgidHlwZSIpIGludCB0eXBlKSB7CisgICAgICAgIHJldHVybiBjaGFuZ2VzOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgibGF0ZXN0IikKKyAgICBASlNPTlAKKyAgICBwdWJsaWMgQ2hhbmdlUmVjb3JkQmVhbiBnZXRMYXN0Q2hhbmdlKEBRdWVyeVBhcmFtKCJjYWxsYmFjayIpIFN0cmluZyBjYWxsYmFjaywgQFF1ZXJ5UGFyYW0oInR5cGUiKSBpbnQgdHlwZSkgeworICAgICAgICByZXR1cm4gY2hhbmdlcy5nZXQoY2hhbmdlcy5zaXplKCkgLSAxKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9qc29uLXdpdGgtcGFkZGluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2pzb25wL0NoYW5nZVJlY29yZEJlYW4uamF2YSBiL2V4YW1wbGVzL2pzb24td2l0aC1wYWRkaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvanNvbnAvQ2hhbmdlUmVjb3JkQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZjI0NzkKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9qc29uLXdpdGgtcGFkZGluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2pzb25wL0NoYW5nZVJlY29yZEJlYW4uamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmpzb25wOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworLyoqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAWG1sUm9vdEVsZW1lbnQobmFtZSA9ICJjaGFuZ2UiKQorcHVibGljIGNsYXNzIENoYW5nZVJlY29yZEJlYW4geworCisgICAgQFhtbEF0dHJpYnV0ZQorICAgIHB1YmxpYyBib29sZWFuIG1hZGVCeUFkbWluOworICAgIHB1YmxpYyBpbnQgbGluZXNDaGFuZ2VkOworICAgIHB1YmxpYyBTdHJpbmcgbG9nTWVzc2FnZTsKKworICAgIC8qKgorICAgICAqIE5vLWFyZyBjb25zdHJ1Y3RvciBmb3IgSkFYQgorICAgICAqLworICAgIHB1YmxpYyBDaGFuZ2VSZWNvcmRCZWFuKCkge30KKworICAgIHB1YmxpYyBDaGFuZ2VSZWNvcmRCZWFuKGJvb2xlYW4gbWFkZUJ5QWRtaW4sIGludCBsaW5lc0NoYW5nZWQsIFN0cmluZyBsb2dNZXNzYWdlKSB7CisgICAgICAgIHRoaXMubWFkZUJ5QWRtaW4gPSBtYWRlQnlBZG1pbjsKKyAgICAgICAgdGhpcy5saW5lc0NoYW5nZWQgPSBsaW5lc0NoYW5nZWQ7CisgICAgICAgIHRoaXMubG9nTWVzc2FnZSA9IGxvZ01lc3NhZ2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvanNvbi13aXRoLXBhZGRpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qc29ucC9Kc29uV2l0aFBhZGRpbmdUZXN0LmphdmEgYi9leGFtcGxlcy9qc29uLXdpdGgtcGFkZGluZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2pzb25wL0pzb25XaXRoUGFkZGluZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTg5ZGMxCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvanNvbi13aXRoLXBhZGRpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9qc29ucC9Kc29uV2l0aFBhZGRpbmdUZXN0LmphdmEKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5qc29ucDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkdlbmVyaWNUeXBlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEpzb25XaXRoUGFkZGluZ1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5EVU1QX0VOVElUWSk7CisKKyAgICAgICAgcmV0dXJuIEFwcC5jcmVhdGVBcHAoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGNoZWNrcyB0aGF0IHRoZSBhcHBsaWNhdGlvbi53YWRsIGlzIHJlYWNoYWJsZS4KKyAgICAgKiA8cC8+CisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwbGljYXRpb25XYWRsKCkgeworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCk7CisgICAgICAgIFN0cmluZyBhcHBsaWNhdGlvbldhZGwgPSB0YXJnZXQucGF0aCgiYXBwbGljYXRpb24ud2FkbCIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU29tZXRoaW5nIHdyb25nLiBSZXR1cm5lZCB3YWRsIGxlbmd0aCBpcyBub3QgPiAwIiwgYXBwbGljYXRpb25XYWRsLmxlbmd0aCgpID4gMCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBjaGVjayBHRVQgb24gdGhlICJjaGFuZ2VzIiByZXNvdXJjZSBpbiAiYXBwbGljYXRpb24vanNvbiIgZm9ybWF0LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldE9uQ2hhbmdlc0pTT05Gb3JtYXQoKSB7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKTsKKyAgICAgICAgR2VuZXJpY1R5cGU8TGlzdDxDaGFuZ2VSZWNvcmRCZWFuPj4gZ2VuZXJpY1R5cGUgPSBuZXcgR2VuZXJpY1R5cGU8TGlzdDxDaGFuZ2VSZWNvcmRCZWFuPj4oKSB7fTsKKyAgICAgICAgLy8gZ2V0IHRoZSBpbml0aWFsIHJlcHJlc2VudGF0aW9uCisgICAgICAgIExpc3Q8Q2hhbmdlUmVjb3JkQmVhbj4gY2hhbmdlcyA9IHRhcmdldC5wYXRoKCJjaGFuZ2VzIikucmVxdWVzdCgiYXBwbGljYXRpb24vanNvbiIpLmdldChnZW5lcmljVHlwZSk7CisgICAgICAgIC8vIGNoZWNrIHRoYXQgdGhlcmUgYXJlIHR3byBjaGFuZ2VzIGVudHJpZXMKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCBudW1iZXIgb2YgaW5pdGlhbCBjaGFuZ2VzIG5vdCBmb3VuZCIsIDUsIGNoYW5nZXMuc2l6ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGNoZWNrIEdFVCBvbiB0aGUgImNoYW5nZXMiIHJlc291cmNlIGluICJhcHBsaWNhdGlvbi94bWwiIGZvcm1hdC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRPbkxhdGVzdENoYW5nZVhNTEZvcm1hdCgpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpOworICAgICAgICBDaGFuZ2VSZWNvcmRCZWFuIGxhc3RDaGFuZ2UgPSB0YXJnZXQucGF0aCgiY2hhbmdlcy9sYXRlc3QiKS5yZXF1ZXN0KCJhcHBsaWNhdGlvbi94bWwiKS5nZXQoQ2hhbmdlUmVjb3JkQmVhbi5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBsYXN0Q2hhbmdlLmxpbmVzQ2hhbmdlZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBjaGVjayBHRVQgb24gdGhlICJjaGFuZ2VzIiByZXNvdXJjZSBpbiAiYXBwbGljYXRpb24vamF2YXNjcmlwdCIgZm9ybWF0LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldE9uTGF0ZXN0Q2hhbmdlSmF2YXNjcmlwdEZvcm1hdCgpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpOworICAgICAgICBTdHJpbmcganMgPSB0YXJnZXQucGF0aCgiY2hhbmdlcyIpLnJlcXVlc3QoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUcnVlKGpzLnN0YXJ0c1dpdGgoImNhbGxiYWNrIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldE9uTGF0ZXN0Q2hhbmdlSmF2YXNjcmlwdEZvcm1hdERpZmZlcmVudENhbGxiYWNrKCkgeworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCk7CisgICAgICAgIFN0cmluZyBqcyA9IHRhcmdldC5wYXRoKCJjaGFuZ2VzIikucXVlcnlQYXJhbSgiX19jYWxsYmFjayIsICJwYXJzZSIpLnJlcXVlc3QoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpCisgICAgICAgICAgICAgICAgLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUcnVlKGpzLnN0YXJ0c1dpdGgoInBhcnNlIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL21hbmFnZWQtYmVhbnMtd2ViYXBwL1JFQURNRS5NRCBiL2V4YW1wbGVzL21hbmFnZWQtYmVhbnMtd2ViYXBwL1JFQURNRS5NRApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGU4YjFhCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvbWFuYWdlZC1iZWFucy13ZWJhcHAvUkVBRE1FLk1ECkBAIC0wLDAgKzEsNDIgQEAKK1svL106ICMgIiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIgorWy8vXTogIyAiICIKK1svL106ICMgIiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgIgorWy8vXTogIyAiIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0ICIKK1svL106ICMgIiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuICIKK1svL106ICMgIiAiCitbLy9dOiAjICIgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZSAiCisKK01hbmFnZWQgQmVhbnMgRXhhbXBsZQorPT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgbWFuYWdlZCBiZWFuIHN1cHBvcnQgaW4gSmVyc2V5LiBKQVgtUlMgcm9vdAorcmVzb3VyY2UgY2xhc3NlcyBhcmUgYW5ub3RhdGVkIHdpdGggQE1hbmFnZWRCZWFuLCB3aGljaCBtZWFucyBFRS1yZWxhdGVkCityZXNvdXJjZXMgbWF5IGJlIGluamVjdGVkIGludG8gaW5zdGFuY2VzIG9mIHRob3NlIGNsYXNzZXMuCisKK0NvbnRlbnQKKy0tLS0tLS0KKworVGhlIGV4YW1wbGUgYXBwbGljYXRpb24gaW5jbHVkZXMgdHdvIHJvb3QgcmVzb3VyY2UgY2xhc3NlcyB0aGF0IGFyZQordHJlYXRlZCBhcyBKYXZhIEVFIG1hbmFnZWQgYmVhbnMuIE9uZSByb290IHJlc291cmNlIGNsYXNzIGlzIG1hbmFnZWQgaW4KK3RoZSBkZWZhdWx0IEpBWC1SUyBsaWZlLWN5Y2xlIChvbmUgaW5zdGFuY2UgcGVyIHJlcXVlc3QpIGFuZCB0aGUgb3RoZXIKK2lzIG1hbmFnZWQgaW4gdGhlIHNpbmdsZXRvbiBsaWZlLWN5Y2xlIChvbmUgaW5zdGFuY2UgcGVyIHdlYgorYXBwbGljYXRpb24pLgorCitUd28gSmF2YSBFRSBhcnRpZmFjdHMgYXJlIGluamVjdGVkIGludG8gdGhlIHNpbmdsZXRvbiByb290IHJlc291cmNlLiBUaGUKK2ZpcnN0IGlzIGEgcmVzb3VyY2UgY29uc3RhbnQgZGVmaW5lZCBpbiB0aGUgd2ViLnhtbC4gVGhlIHNlY29uZCBpcyBhbgorZW50aXR5IG1hbmFnZXIgZmFjdG9yeSB0byBhbGxvdyBpbnRlZ3JhdGlvbiB3aXRoIEpQQSBsYXllci4KKworUnVubmluZyB0aGUgRXhhbXBsZQorLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGlzIHNhbXBsZSB1dGlsaXplcyBKYXZhIEVFIGZlYXR1cmVzIGluIEdsYXNzRmlzaCBhcHBsaWNhdGlvbiBzZXJ2ZXIuCisKK1RoZSBlYXNpZXN0IHdheSB0byBnZXQgdGhlIGFwcGxpY2F0aW9uIHJ1bm5pbmcgaXMgdG8gYnVpbGQgaXQgYW5kIGRlcGxveQorYXMgZm9sbG93czoKKworICAgIG12biBjbGVhbiBwYWNrYWdlCisgICAgJEFTX0hPTUUvYXNhZG1pbiBkZXBsb3kgdGFyZ2V0L21hbmFnZWQtYmVhbnMtd2ViYXBwLndhcgorCitGcm9tIGEgd2ViIGJyb3dzZXIsIHZpc2l0OgorCistICAgPGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9tYW5hZ2VkLWJlYW5zLXdlYmFwcD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL21hbmFnZWQtYmVhbnMtd2ViYXBwL3BvbS54bWwgYi9leGFtcGxlcy9tYW5hZ2VkLWJlYW5zLXdlYmFwcC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MDNhYTYKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9tYW5hZ2VkLWJlYW5zLXdlYmFwcC9wb20ueG1sCkBAIC0wLDAgKzEsMTEwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorCisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPndlYmFwcC1leGFtcGxlLXBhcmVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi93ZWJhcHAtZXhhbXBsZS1wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+bWFuYWdlZC1iZWFucy13ZWJhcHA8L2FydGlmYWN0SWQ+CisgICAgPG5hbWU+amVyc2V5LWV4YW1wbGVzLW1hbmFnZWQtYmVhbnMtd2ViYXBwPC9uYW1lPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisKKyAgICA8ZGVzY3JpcHRpb24+SmVyc2V5IE1hbmFnZWQgQmVhbnMgV2ViIEFwcGxpY2F0aW9uIEV4YW1wbGUuPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWhrMjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC53cy5yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LndzLnJzLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5hbm5vdGF0aW9uPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguYW5ub3RhdGlvbi1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguZW50ZXJwcmlzZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmNkaS1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgucGVyc2lzdGVuY2U8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5wZXJzaXN0ZW5jZS1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+cnVuLWV4dGVybmFsLXRlc3RzPC9pZD4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIuZmFjdG9yeT4ke2V4dGVybmFsLmNvbnRhaW5lci5mYWN0b3J5fTwvamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5mYWN0b3J5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0PiR7ZXh0ZXJuYWwuY29udGFpbmVyLnBvcnR9PC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgIDwhLS0gRXh0ZXJuYWwgdGVzdCBjb250YWluZXIgY29uZmlndXJhdGlvbiBpcyBkb25lIHZpYSBwcm9wZXJ0aWVzIHRvIGFsbG93IG92ZXJyaWRpbmcgdmlhIGNvbW1hbmQgbGluZS4gLS0+CisgICAgICAgICAgICAgICAgPGV4dGVybmFsLmNvbnRhaW5lci5mYWN0b3J5Pm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTwvZXh0ZXJuYWwuY29udGFpbmVyLmZhY3Rvcnk+CisgICAgICAgICAgICAgICAgPGV4dGVybmFsLmNvbnRhaW5lci5wb3J0PjgwODA8L2V4dGVybmFsLmNvbnRhaW5lci5wb3J0PgorICAgICAgICAgICAgICAgIDxtYXZlbi50ZXN0LnNraXA+ZmFsc2U8L21hdmVuLnRlc3Quc2tpcD4KKyAgICAgICAgICAgIDwvcHJvcGVydGllcz4KKyAgICAgICAgPC9wcm9maWxlPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5yZWxlYXNlPC9pZD4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+eG1sLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNraXA+dHJ1ZTwvc2tpcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPG1hdmVuLnRlc3Quc2tpcD50cnVlPC9tYXZlbi50ZXN0LnNraXA+CisgICAgPC9wcm9wZXJ0aWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9tYW5hZ2VkLWJlYW5zLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL21hbmFnZWRiZWFucy9yZXNvdXJjZXMvTWFuYWdlZEJlYW5FeGNlcHRpb24uamF2YSBiL2V4YW1wbGVzL21hbmFnZWQtYmVhbnMtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvbWFuYWdlZGJlYW5zL3Jlc291cmNlcy9NYW5hZ2VkQmVhbkV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiMjQ1MjAKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9tYW5hZ2VkLWJlYW5zLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL21hbmFnZWRiZWFucy9yZXNvdXJjZXMvTWFuYWdlZEJlYW5FeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLm1hbmFnZWRiZWFucy5yZXNvdXJjZXM7CisKKy8qKgorICogRXhjZXB0aW9uIHRvIGJlIHRocm93biBhbmQgbWFwcGVkIGJ5IHRoZSB3ZWIgYXBwbGljYXRpb24uCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitwdWJsaWMgY2xhc3MgTWFuYWdlZEJlYW5FeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKworfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvbWFuYWdlZC1iZWFucy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9tYW5hZ2VkYmVhbnMvcmVzb3VyY2VzL01hbmFnZWRCZWFuRXhjZXB0aW9uTWFwcGVyLmphdmEgYi9leGFtcGxlcy9tYW5hZ2VkLWJlYW5zLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL21hbmFnZWRiZWFucy9yZXNvdXJjZXMvTWFuYWdlZEJlYW5FeGNlcHRpb25NYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDFkNDUyCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvbWFuYWdlZC1iZWFucy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9tYW5hZ2VkYmVhbnMvcmVzb3VyY2VzL01hbmFnZWRCZWFuRXhjZXB0aW9uTWFwcGVyLmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5tYW5hZ2VkYmVhbnMucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlJlc291cmNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CitpbXBvcnQgamF2YXgud3MucnMuZXh0LkV4Y2VwdGlvbk1hcHBlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLk1hbmFnZWRCZWFuOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUG9zdENvbnN0cnVjdDsKKworLyoqCisgKiBDdXN0b20gZXhjZXB0aW9uIG1hcHBlci4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKi8KK0BQcm92aWRlcgorQE1hbmFnZWRCZWFuCitwdWJsaWMgY2xhc3MgTWFuYWdlZEJlYW5FeGNlcHRpb25NYXBwZXIgaW1wbGVtZW50cyBFeGNlcHRpb25NYXBwZXI8TWFuYWdlZEJlYW5FeGNlcHRpb24+IHsKKworICAgIEBDb250ZXh0CisgICAgcHJpdmF0ZSBVcmlJbmZvIHVpRmllbGRJbmplY3Q7CisKKyAgICBAQ29udGV4dAorICAgIHByaXZhdGUgUmVzb3VyY2VDb250ZXh0IHJjOworCisgICAgcHJpdmF0ZSBVcmlJbmZvIHVpTWV0aG9kSW5qZWN0OworCisgICAgcHJpdmF0ZSBVcmlJbmZvIHVpOworCisgICAgQENvbnRleHQKKyAgICBwdWJsaWMgdm9pZCBzZXQoVXJpSW5mbyB1aSkgeworICAgICAgICB0aGlzLnVpTWV0aG9kSW5qZWN0ID0gdWk7CisgICAgfQorCisgICAgQFBvc3RDb25zdHJ1Y3QKKyAgICBwdWJsaWMgdm9pZCBwb3N0Q29uc3RydWN0KCkgeworICAgICAgICBlbnN1cmVJbmplY3RlZCgpOworICAgICAgICB0aGlzLnVpID0gdWlNZXRob2RJbmplY3Q7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc3BvbnNlIHRvUmVzcG9uc2UoTWFuYWdlZEJlYW5FeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgIGVuc3VyZUluamVjdGVkKCk7CisgICAgICAgIHJldHVybiBSZXNwb25zZS5zZXJ2ZXJFcnJvcigpLmVudGl0eShTdHJpbmcuZm9ybWF0KCJNYW5hZ2VkQmVhbkV4Y2VwdGlvbiBmcm9tICVzIiwgdWkuZ2V0UGF0aCgpKSkuYnVpbGQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5zdXJlSW5qZWN0ZWQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHVpRmllbGRJbmplY3QgPT0gbnVsbCB8fCB1aU1ldGhvZEluamVjdCA9PSBudWxsIHx8IHJjID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL21hbmFnZWQtYmVhbnMtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvbWFuYWdlZGJlYW5zL3Jlc291cmNlcy9NYW5hZ2VkQmVhblBlclJlcXVlc3RSZXNvdXJjZS5qYXZhIGIvZXhhbXBsZXMvbWFuYWdlZC1iZWFucy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9tYW5hZ2VkYmVhbnMvcmVzb3VyY2VzL01hbmFnZWRCZWFuUGVyUmVxdWVzdFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI3Mzg3ZAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL21hbmFnZWQtYmVhbnMtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvbWFuYWdlZGJlYW5zL3Jlc291cmNlcy9NYW5hZ2VkQmVhblBlclJlcXVlc3RSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMubWFuYWdlZGJlYW5zLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uTWFuYWdlZEJlYW47CisKK2ltcG9ydCBqYXZheC5pbnRlcmNlcHRvci5Bcm91bmRJbnZva2U7CitpbXBvcnQgamF2YXguaW50ZXJjZXB0b3IuSW50ZXJjZXB0b3JzOworaW1wb3J0IGphdmF4LmludGVyY2VwdG9yLkludm9jYXRpb25Db250ZXh0OworCisvKioKKyAqIEpBWC1SUyByb290IHJlc291cmNlIHRyZWF0ZWQgYXMgbWFuYWdlZCBiZWFuLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqLworQFBhdGgoIi9tYW5hZ2VkYmVhbi9wZXItcmVxdWVzdCIpCitATWFuYWdlZEJlYW4KK3B1YmxpYyBjbGFzcyBNYW5hZ2VkQmVhblBlclJlcXVlc3RSZXNvdXJjZSB7CisKKyAgICBAQ29udGV4dCBVcmlJbmZvIHVpOworCisgICAgQFF1ZXJ5UGFyYW0oIngiKSBTdHJpbmcgeDsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlJbnRlcmNlcHRvciB7CisKKyAgICAgICAgQEFyb3VuZEludm9rZQorICAgICAgICBwdWJsaWMgT2JqZWN0IGFyb3VuZChJbnZvY2F0aW9uQ29udGV4dCBjdHgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIklOVEVSQ0VQVEVEOiAlcyIsIGN0eC5wcm9jZWVkKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQEdFVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgQEludGVyY2VwdG9ycyhNeUludGVyY2VwdG9yLmNsYXNzKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoImVjaG8gZnJvbSAlczogJXMiLCB1aS5nZXRQYXRoKCksIHgpOworICAgIH0KKworICAgIEBQYXRoKCJleGNlcHRpb24iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhjZXB0aW9uKCkgeworICAgICAgICB0aHJvdyBuZXcgTWFuYWdlZEJlYW5FeGNlcHRpb24oKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9tYW5hZ2VkLWJlYW5zLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL21hbmFnZWRiZWFucy9yZXNvdXJjZXMvTWFuYWdlZEJlYW5TaW5nbGV0b25SZXNvdXJjZS5qYXZhIGIvZXhhbXBsZXMvbWFuYWdlZC1iZWFucy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9tYW5hZ2VkYmVhbnMvcmVzb3VyY2VzL01hbmFnZWRCZWFuU2luZ2xldG9uUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjc5MzkxCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvbWFuYWdlZC1iZWFucy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9tYW5hZ2VkYmVhbnMvcmVzb3VyY2VzL01hbmFnZWRCZWFuU2luZ2xldG9uUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5tYW5hZ2VkYmVhbnMucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXgud3MucnMuREVMRVRFOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QVVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5NYW5hZ2VkQmVhbjsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlOworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW50aXR5TWFuYWdlcjsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHlNYW5hZ2VyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5QZXJzaXN0ZW5jZVVuaXQ7CisKKy8qKgorICogSkFYLVJTIHJvb3QgcmVzb3VyY2UgdHJlYXRlZCBhcyBKYXZhIEVFIG1hbmFnZWQgYmVhbiBpbiBzaW5nbGV0b24gc2NvcGUuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIi9tYW5hZ2VkYmVhbi9zaW5nbGV0b24iKQorQFNpbmdsZXRvbgorQE1hbmFnZWRCZWFuCitwdWJsaWMgY2xhc3MgTWFuYWdlZEJlYW5TaW5nbGV0b25SZXNvdXJjZSB7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsIHZhbHVlIHNob3VsZCBnZXQgaW5qZWN0ZWQgYnkgSmF2YSBFRSBjb250YWluZXIuCisgICAgICovCisgICAgQFJlc291cmNlKG5hbWUgPSAiaW5qZWN0ZWRSZXNvdXJjZSIpCisgICAgaW50IGNvdW50ZXIgPSAwOworCisgICAgQENvbnRleHQKKyAgICBVcmlJbmZvIHVpOworCisgICAgcHJpdmF0ZSBFbnRpdHlNYW5hZ2VyIGVudGl0eU1hbmFnZXI7CisKKyAgICAvKioKKyAgICAgKiBTZXQgZW50aXR5IG1hbmFnZXIgYmFzZWQgb24gaW5qZWN0ZWQgZW50aXR5IG1hbmFnZXIgZmFjdG9yeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbSBlbnRpdHkgbWFuYWdlciBmYWN0b3J5IGluamVjdGVkIGJ5IEphdmEgRUUgY29udGFpbmVyLgorICAgICAqLworICAgIEBQZXJzaXN0ZW5jZVVuaXQodW5pdE5hbWUgPSAiTWFuYWdlZEJlYW5zUFUiKQorICAgIHZvaWQgc2V0RW50aXR5TWFuYWdlcihmaW5hbCBFbnRpdHlNYW5hZ2VyRmFjdG9yeSBlbSkgeworICAgICAgICBlbnRpdHlNYW5hZ2VyID0gZW0uY3JlYXRlRW50aXR5TWFuYWdlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb3ZpZGUgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW50ZXJuYWwgY291bnRlci4KKyAgICAgKiBAcmV0dXJuIGludGVybmFsIGNvdW50ZXIge0Bjb2RlIFN0cmluZ30gcmVwcmVzZW50YXRpb24KKyAgICAgKi8KKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CisgICAgICAgIHJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKGNvdW50ZXIrKyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzZXQgaW50ZXJuYWwgY291bnRlci4KKyAgICAgKiBAcGFyYW0gaSBuZXcgY291bnRlciB2YWx1ZSB0byBiZSBzZXQuCisgICAgICovCisgICAgQFBVVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIHZvaWQgcHV0TWVzc2FnZShmaW5hbCBpbnQgaSkgeworICAgICAgICBjb3VudGVyID0gaTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaHJvdyBhIHJ1bnRpbWUgZXhjZXB0aW9uLCBzbyB0aGF0IGl0IGNvdWxkIGJlIG1hcHBlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbm90aGluZywganVzdCB0aHJvdyB0aGUgY3VzdG9tIGV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBAUGF0aCgiZXhjZXB0aW9uIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldEV4Y2VwdGlvbigpIHsKKyAgICAgICAgdGhyb3cgbmV3IE1hbmFnZWRCZWFuRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IEpQQSB3aWRnZXQgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaWQgd2lkZ2V0IGlkLgorICAgICAqIEByZXR1cm4gdmFsdWUgb2YgdGhlIHdpZGdldCBvciA0MDQgaWYgZ2l2ZW4gd2lkZ2V0IGlkIGlzIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBAUGF0aCgid2lkZ2V0L3tpZDogXFxkK30iKQorICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdldFdpZGdldChAUGF0aFBhcmFtKCJpZCIpIGZpbmFsIGludCBpZCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGVudGl0eU1hbmFnZXIuZmluZChXaWRnZXQuY2xhc3MsIGlkKS52YWw7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIE51bGxQb2ludGVyRXhjZXB0aW9uIGlnbm9yZWQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbihSZXNwb25zZS5TdGF0dXMuTk9UX0ZPVU5EKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCBuZXcgd2lkZ2V0IHZhbHVlLgorICAgICAqIEBwYXJhbSBpZCB3aWRnZXQgaWQuCisgICAgICogQHBhcmFtIHZhbCBuZXcgdmFsdWUgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIGFib3ZlIHNwZWNpZmllZCBpZC4KKyAgICAgKi8KKyAgICBAUGF0aCgid2lkZ2V0L3tpZDogXFxkK30iKQorICAgIEBQVVQKKyAgICBwdWJsaWMgdm9pZCBwdXRXaWRnZXQoQFBhdGhQYXJhbSgiaWQiKSBmaW5hbCBpbnQgaWQsIGZpbmFsIFN0cmluZyB2YWwpIHsKKyAgICAgICAgZW50aXR5TWFuYWdlci5tZXJnZShuZXcgV2lkZ2V0KGlkLCB2YWwpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgd2lkZ2V0IHdpdGggZ2l2ZW4gaWQuCisgICAgICogQHBhcmFtIGlkIGlkIG9mIHRoZSB3aWRnZXQgdG8gYmUgcmVtb3ZlZC4KKyAgICAgKi8KKyAgICBAUGF0aCgid2lkZ2V0L3tpZDogXFxkK30iKQorICAgIEBERUxFVEUKKyAgICBwdWJsaWMgdm9pZCBkZWxldGVXaWRnZXQoQFBhdGhQYXJhbSgiaWQiKSBmaW5hbCBpbnQgaWQpIHsKKyAgICAgICAgZW50aXR5TWFuYWdlci5yZW1vdmUoZW50aXR5TWFuYWdlci5maW5kKFdpZGdldC5jbGFzcywgaWQpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9tYW5hZ2VkLWJlYW5zLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL21hbmFnZWRiZWFucy9yZXNvdXJjZXMvTXlBcHBsaWNhdGlvbi5qYXZhIGIvZXhhbXBsZXMvbWFuYWdlZC1iZWFucy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9tYW5hZ2VkYmVhbnMvcmVzb3VyY2VzL015QXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmI0MjhmCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvbWFuYWdlZC1iZWFucy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9tYW5hZ2VkYmVhbnMvcmVzb3VyY2VzL015QXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLm1hbmFnZWRiZWFucy5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKKy8qKgorICogSkFYLVJTIGFwcGxpY2F0aW9uLgorICoKKyAqIEBhdXRob3IgSm9uYXRoYW4gQmVub2l0CisgKi8KK0BBcHBsaWNhdGlvblBhdGgoIi9hcHAvKiIpCitwdWJsaWMgY2xhc3MgTXlBcHBsaWNhdGlvbiBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IGNsYXNzZXMgPSBuZXcgSGFzaFNldDxDbGFzczw/Pj4oKTsKKyAgICAgICAgY2xhc3Nlcy5hZGQoTWFuYWdlZEJlYW5FeGNlcHRpb24uY2xhc3MpOworICAgICAgICBjbGFzc2VzLmFkZChNYW5hZ2VkQmVhblNpbmdsZXRvblJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgY2xhc3Nlcy5hZGQoTWFuYWdlZEJlYW5QZXJSZXF1ZXN0UmVzb3VyY2UuY2xhc3MpOworICAgICAgICBjbGFzc2VzLmFkZChNYW5hZ2VkQmVhbkV4Y2VwdGlvbk1hcHBlci5jbGFzcyk7CisgICAgICAgIHJldHVybiBjbGFzc2VzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL21hbmFnZWQtYmVhbnMtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvbWFuYWdlZGJlYW5zL3Jlc291cmNlcy9XaWRnZXQuamF2YSBiL2V4YW1wbGVzL21hbmFnZWQtYmVhbnMtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvbWFuYWdlZGJlYW5zL3Jlc291cmNlcy9XaWRnZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmYzZGNkCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvbWFuYWdlZC1iZWFucy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9tYW5hZ2VkYmVhbnMvcmVzb3VyY2VzL1dpZGdldC5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMubWFuYWdlZGJlYW5zLnJlc291cmNlczsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuRW50aXR5OworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLklkOworCisvKioKKyAqIFNpbXBsZSBKUEEgZW50aXR5IG1hZGUgYWNjZXNzaWJsZSB2aWEge0BsaW5rIE1hbmFnZWRCZWFuU2luZ2xldG9uUmVzb3VyY2V9LgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BFbnRpdHkKK3B1YmxpYyBjbGFzcyBXaWRnZXQgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisgICAgQElkCisgICAgaW50IGlkOworCisgICAgU3RyaW5nIHZhbDsKKworICAgIC8qKgorICAgICAqIE5vLWFyZyBjb25zdHJ1Y3RvciB0byBtYWtlIEpQQSBoYXBweS4KKyAgICAgKi8KKyAgICBwdWJsaWMgV2lkZ2V0KCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyB3aWRnZXQgd2l0aCBnaXZlbiBpZCBhbmQgdmFsdWUuCisgICAgICogQHBhcmFtIGlkIHdpZGdldCBpZAorICAgICAqIEBwYXJhbSB2YWwgd2lkZ2V0IHZhbHVlCisgICAgICovCisgICAgcHVibGljIFdpZGdldChpbnQgaWQsIFN0cmluZyB2YWwpIHsKKyAgICAgICAgdGhpcy5pZCA9IGlkOworICAgICAgICB0aGlzLnZhbCA9IHZhbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9tYW5hZ2VkLWJlYW5zLXdlYmFwcC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvcGVyc2lzdGVuY2UueG1sIGIvZXhhbXBsZXMvbWFuYWdlZC1iZWFucy13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3BlcnNpc3RlbmNlLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWNjZGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvbWFuYWdlZC1iZWFucy13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3BlcnNpc3RlbmNlLnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzxwZXJzaXN0ZW5jZSB2ZXJzaW9uPSIxLjAiIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wZXJzaXN0ZW5jZS9wZXJzaXN0ZW5jZV8xXzAueHNkIj4KKyAgICA8cGVyc2lzdGVuY2UtdW5pdCBuYW1lPSJNYW5hZ2VkQmVhbnNQVSIgdHJhbnNhY3Rpb24tdHlwZT0iSlRBIj4KKyAgICAgICAgPGp0YS1kYXRhLXNvdXJjZT5qZGJjL19fZGVmYXVsdDwvanRhLWRhdGEtc291cmNlPgorICAgICAgICA8cHJvcGVydGllcz4KKyAgICAgICAgICAgIDwhLS0gZHJvcCBhbmQgY3JlYXRlIHRhYmxlcyBhdCBkZXBsb3ltZW50IC0tPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImVjbGlwc2VsaW5rLmRkbC1nZW5lcmF0aW9uIiB2YWx1ZT0iZHJvcC1hbmQtY3JlYXRlLXRhYmxlcyIvPgorICAgICAgICAgICAgPCEtLSBsb2cgc3FscyBleGVjdXRlZCBpbiBzZXJ2ZXIubG9nIC0tPgorICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImVjbGlwc2VsaW5rLmxvZ2dpbmcubGV2ZWwiIHZhbHVlPSJGSU5FIi8+CisgICAgICAgICAgICA8IS0tIEluc3RydWN0IEVjbGlwc2VMaW5rIHRvIG5vdCBsb2cgZXhlY2VwdGlvbnMgaXQgdGhyb3dzLiBMZXRzIHRoZSBhcHBsaWNhdGlvbiBkZWNpZGUgYWJvdXQgaXQtLT4KKyAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJlY2xpcHNlbGluay5sb2dnaW5nLmV4Y2VwdGlvbnMiIHZhbHVlPSJmYWxzZSIvPgorICAgICAgICA8L3Byb3BlcnRpZXM+CisgICAgPC9wZXJzaXN0ZW5jZS11bml0PgorPC9wZXJzaXN0ZW5jZT4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL21hbmFnZWQtYmVhbnMtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi9leGFtcGxlcy9tYW5hZ2VkLWJlYW5zLXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMzI4M2IKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9tYW5hZ2VkLWJlYW5zLXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorCistLT4KKworPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKKyAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8zXzAueHNkIgorICAgICAgdmVyc2lvbj0iMy4wIj4KKyAgICA8ZW52LWVudHJ5PgorICAgICAgICA8ZW52LWVudHJ5LW5hbWU+aW5qZWN0ZWRSZXNvdXJjZTwvZW52LWVudHJ5LW5hbWU+CisgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+CisgICAgICAgIDxlbnYtZW50cnktdmFsdWU+MzwvZW52LWVudHJ5LXZhbHVlPgorICAgIDwvZW52LWVudHJ5PgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvbWFuYWdlZC1iZWFucy13ZWJhcHAvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcCBiL2V4YW1wbGVzL21hbmFnZWQtYmVhbnMtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjljMDJmNgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL21hbmFnZWQtYmVhbnMtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKQEAgLTAsMCArMSwzMiBAQAorPCUtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDA5LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0lPgorCis8JS0tCisgICAgRG9jdW1lbnQgICA6IGluZGV4CisgICAgQ3JlYXRlZCBvbiA6IE9jdCAyMiwgMjAwOSwgOToxNjo0NyBBTQorICAgIEF1dGhvciAgICAgOiBwYXVsc2FuZG96CistLSU+CisKKzwlQHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbCIgcGFnZUVuY29kaW5nPSJVVEYtOCIlPgorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKKyAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorCis8aHRtbD4KKyAgICA8aGVhZD4KKyAgICAgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgorICAgICAgICA8dGl0bGU+TWFuYWdlZCBCZWFucyBXZWJBcHA8L3RpdGxlPgorICAgIDwvaGVhZD4KKyAgICA8Ym9keT4KKyAgICAgICAgPHA+UGVyLXJlcXVlc3QgcmVzb3VyY2UgPGEgaHJlZj0iYXBwL21hbmFnZWRiZWFuL3Blci1yZXF1ZXN0Ij5tYW5hZ2VkYmVhbi9wZXItcmVxdWVzdDwvYT48L3A+CisgICAgICAgIDxwPlNpbmdsZXRvbiByZXNvdXJjZSA8YSBocmVmPSJhcHAvbWFuYWdlZGJlYW4vc2luZ2xldG9uIj5tYW5hZ2VkYmVhbi9zaW5nbGV0b248L2E+PC9wPgorICAgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL21hbmFnZWQtYmVhbnMtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvbWFuYWdlZGJlYW5zL01hbmFnZWRCZWFuV2ViQXBwVGVzdC5qYXZhIGIvZXhhbXBsZXMvbWFuYWdlZC1iZWFucy13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9tYW5hZ2VkYmVhbnMvTWFuYWdlZEJlYW5XZWJBcHBUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdlODZiNgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL21hbmFnZWQtYmVhbnMtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvbWFuYWdlZGJlYW5zL01hbmFnZWRCZWFuV2ViQXBwVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLm1hbmFnZWRiZWFuczsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMubWFuYWdlZGJlYW5zLnJlc291cmNlcy5NeUFwcGxpY2F0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuTWVkaWFUeXBlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5jb250YWluc1N0cmluZzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5ub3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuc3RhcnRzV2l0aDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBNYWluIHRlc3QgZm9yIHRoZSBNYW5hZ2VkIEJlYW5zIHdlYiBhcHBsaWNhdGlvbi4KKyAqIFRoZSBhcHBsaWNhdGlvbiBtdXN0IGJlIGRlcGxveWVkIGFuZCBydW5uaW5nIG9uIGEgc3RhbmRhbG9uZSBHbGFzc0Zpc2ggY29udGFpbmVyLgorICogVG8gcnVuIHRoZSB0ZXN0cyB0aGVuLCB5b3UganVzdCBsYXVuY2ggdGhlIGZvbGxvd2luZyBjb21tYW5kOgorICogPHByZT4KKyAqIG12biAtRHNraXBUZXN0cz1mYWxzZSB0ZXN0PC9wcmU+CisgKgorICogQGF1dGhvciBOYXJlc2ggU3Jpbml2YXMgQmhpbWlzZXR0eQorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIE1hbmFnZWRCZWFuV2ViQXBwVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNeUFwcGxpY2F0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFVSSSBnZXRCYXNlVXJpKCkgeworICAgICAgICByZXR1cm4gVXJpQnVpbGRlci5mcm9tVXJpKHN1cGVyLmdldEJhc2VVcmkoKSkucGF0aCgibWFuYWdlZC1iZWFucy13ZWJhcHAiKS5wYXRoKCJhcHAiKS5idWlsZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCBwcm92aWRlZCBxdWVyeSBwYXJhbWV0ZXIgbWFrZXMgaXQgYmFjay4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQZXJSZXF1ZXN0UmVzb3VyY2UoKSB7CisgICAgICAgIFdlYlRhcmdldCBwZXJSZXF1ZXN0ID0gdGFyZ2V0KCkucGF0aCgibWFuYWdlZGJlYW4vcGVyLXJlcXVlc3QiKTsKKworICAgICAgICBTdHJpbmcgcmVzcG9uc2VNc2cgPSBwZXJSZXF1ZXN0LnF1ZXJ5UGFyYW0oIngiLCAiWCIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZU1zZywgY29udGFpbnNTdHJpbmcoIlgiKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2VNc2csIHN0YXJ0c1dpdGgoIklOVEVSQ0VQVEVEIikpOworCisgICAgICAgIHJlc3BvbnNlTXNnID0gcGVyUmVxdWVzdC5xdWVyeVBhcmFtKCJ4IiwgImhpIHRoZXJlIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlTXNnLCBjb250YWluc1N0cmluZygiaGkgdGhlcmUiKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2VNc2csIHN0YXJ0c1dpdGgoIklOVEVSQ0VQVEVEIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCBzaW5nbGV0b24gY291bnRlciBnZXRzIGluY3JlbWVudGVkIHdpdGggZWFjaCBjYWxsIGFuZCBjYW4gYmUgcmVzZXQuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xldG9uUmVzb3VyY2UoKSB7CisgICAgICAgIFdlYlRhcmdldCBzaW5nbGV0b24gPSB0YXJnZXQoKS5wYXRoKCJtYW5hZ2VkYmVhbi9zaW5nbGV0b24iKTsKKworICAgICAgICBTdHJpbmcgcmVzcG9uc2VNc2cgPSBzaW5nbGV0b24ucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlTXNnLCBjb250YWluc1N0cmluZygiMyIpKTsKKworICAgICAgICByZXNwb25zZU1zZyA9IHNpbmdsZXRvbi5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2VNc2csIGNvbnRhaW5zU3RyaW5nKCI0IikpOworCisgICAgICAgIHNpbmdsZXRvbi5yZXF1ZXN0KCkucHV0KEVudGl0eS50ZXh0KCIxIikpOworCisgICAgICAgIHJlc3BvbnNlTXNnID0gc2luZ2xldG9uLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZU1zZywgY29udGFpbnNTdHJpbmcoIjEiKSk7CisKKyAgICAgICAgcmVzcG9uc2VNc2cgPSBzaW5nbGV0b24ucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlTXNnLCBjb250YWluc1N0cmluZygiMiIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoZSBKUEEgYmFja2VuZC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaWRnZXQoKSB7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKS5wYXRoKCJtYW5hZ2VkYmVhbi9zaW5nbGV0b24vd2lkZ2V0Iik7CisKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHdpZGdldCA9IHRhcmdldC5wYXRoKCIxIik7CisKKyAgICAgICAgYXNzZXJ0VGhhdCh3aWRnZXQucmVxdWVzdCgpLmdldCgpLmdldFN0YXR1cygpLCBpcyg0MDQpKTsKKworICAgICAgICB3aWRnZXQucmVxdWVzdCgpLnB1dChFbnRpdHkudGV4dCgiT25lIikpOworICAgICAgICBhc3NlcnRUaGF0KHdpZGdldC5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyksIGlzKCJPbmUiKSk7CisKKyAgICAgICAgd2lkZ2V0LnJlcXVlc3QoKS5wdXQoRW50aXR5LnRleHQoIlR3byIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh3aWRnZXQucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpLCBpcygiVHdvIikpOworCisgICAgICAgIGFzc2VydFRoYXQod2lkZ2V0LnJlcXVlc3QoKS5kZWxldGUoKS5nZXRTdGF0dXMoKSwgaXMoMjA0KSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdCh3aWRnZXQucmVxdWVzdCgpLmdldCgpLmdldFN0YXR1cygpLCBpcyg0MDQpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGV4Y2VwdGlvbnMgYXJlIHByb3Blcmx5IG1hcHBlZC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeGNlcHRpb25NYXBwZXIoKSB7CisKKyAgICAgICAgV2ViVGFyZ2V0IHNpbmdsZXRvblRhcmdldCA9IHRhcmdldCgpLnBhdGgoIm1hbmFnZWRiZWFuL3NpbmdsZXRvbi9leGNlcHRpb24iKTsKKyAgICAgICAgV2ViVGFyZ2V0IHBlclJlcXVlc3RUYXJnZXQgPSB0YXJnZXQoKS5wYXRoKCJtYW5hZ2VkYmVhbi9wZXItcmVxdWVzdC9leGNlcHRpb24iKTsKKworICAgICAgICBfdGVzdEV4Y2VwdGlvbk91dHB1dChzaW5nbGV0b25UYXJnZXQsICJzaW5nbGV0b24iKTsKKyAgICAgICAgX3Rlc3RFeGNlcHRpb25PdXRwdXQocGVyUmVxdWVzdFRhcmdldCwgInBlci1yZXF1ZXN0Iik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBhIG5vbiBlbXB0eSBXQURMIGlzIGdlbmVyYXRlZC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBsaWNhdGlvbldhZGwoKSB7CisgICAgICAgIFdlYlRhcmdldCB3YWRsID0gdGFyZ2V0KCkucGF0aCgiYXBwbGljYXRpb24ud2FkbCIpOworICAgICAgICBTdHJpbmcgd2FkbERvYyA9IHdhZGwucmVxdWVzdChNZWRpYVR5cGVzLldBRExfVFlQRSkuZ2V0KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0VGhhdCh3YWRsRG9jLmxlbmd0aCgpLCBpcyhub3QoMCkpKTsKKyAgICB9CisKKworICAgIHByaXZhdGUgdm9pZCBfdGVzdEV4Y2VwdGlvbk91dHB1dChXZWJUYXJnZXQgZXhjZXB0aW9uVGFyZ2V0LCBTdHJpbmcgdGhhdFNob3VsZEJlUHJlc2VudEluUmVzcG9uc2VCb2R5KSB7CisKKyAgICAgICAgUmVzcG9uc2UgZXhjZXB0aW9uUmVzcG9uc2UgPSBleGNlcHRpb25UYXJnZXQucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KGV4Y2VwdGlvblJlc3BvbnNlLmdldFN0YXR1cygpLCBpcyg1MDApKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzcG9uc2VCb2R5ID0gZXhjZXB0aW9uUmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2VCb2R5LCBjb250YWluc1N0cmluZygiTWFuYWdlZEJlYW5FeGNlcHRpb24iKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2VCb2R5LCBjb250YWluc1N0cmluZyh0aGF0U2hvdWxkQmVQcmVzZW50SW5SZXNwb25zZUJvZHkpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9tYW5hZ2VkLWNsaWVudC1zaW1wbGUtd2ViYXBwL1JFQURNRS5NRCBiL2V4YW1wbGVzL21hbmFnZWQtY2xpZW50LXNpbXBsZS13ZWJhcHAvUkVBRE1FLk1ECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3OTIxMzcKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9tYW5hZ2VkLWNsaWVudC1zaW1wbGUtd2ViYXBwL1JFQURNRS5NRApAQCAtMCwwICsxLDQzIEBACitbLy9dOiAjICIgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICIKK1svL106ICMgIiAiCitbLy9dOiAjICIgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlICIKK1svL106ICMgIiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCAiCitbLy9dOiAjICIgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLiAiCitbLy9dOiAjICIgIgorWy8vXTogIyAiIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UgIgorCitNYW5hZ2VkIENsaWVudCBTaW1wbGUgRXhhbXBsZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tCisKK1RoaXMgc2FtcGxlIHNob3dzIHVzYWdlIG9mIGluamVjdGVkIGNsaWVudCBtYW5hZ2VkIGJ5IGplcnNleSBjb250YWluZXIKK2ludG8gYSByZXNvdXJjZSBtZXRob2RzLiBUaGUgYW5ub3RhdGlvbiBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuVXJpCitpcyB1c2VkIHRvIGluamVjdCBjbGllbnQgZm9yIHNwZWNpZmllZCBwYXRoLiBUaGUgamF4LXJzIGFwcGxpY2F0aW9uCitjb250YWlucyBzdGFuZGFyZCByZXNvdXJjZXMgYW5kIGFsc28gcmVzb3VyY2VzIHdoaWNoIHVzZSBpbmplY3RlZCBjbGllbnQKK3RvIHF1ZXJ5IHRoZXNlIHN0YW5kYXJkIHJlc291cmNlcy4gSW4gb3RoZXIgd29yZHMgdGhlIGluamVjdGVkIGNsaWVudAoraW52b2tlcyByZXF1ZXN0cyB0byB0aGUgb3RoZXIgcmVzb3VyY2VzIGZyb20gdGhlIHNhbWUgamF4LXJzCithcHBsaWNhdGlvbi4gQWxzbyB0aGVyZSBpcyBhIGV4YW1wbGUgb2YgY2xpZW50IHJlcXVlc3RpbmcgcmVzb3VyY2UgZnJvbQorb3V0c2lkZSBvZiB0aGUgYXBwbGljYXRpb24uCisKK0Zyb250IHBhZ2Ugc2hvd3MgdGhlIHRhYmxlIHdpdGggcmVzb3VyY2VzIGV4cG9zZWQgaW4gZGVwbG95ZWQKK2FwcGxpY2F0aW9uIHdpdGggZGVzY3JpcHRpb24uIFNpbXBseSBqdXN0IGNsaWNrIHRoZSBsaW5rcyB0byBnbyB0byB0aGVzZQorcmVzb3VyY2VzLgorCitLZXkgRmVhdHVyZXMKKy0tLS0tLS0tLS0tLQorCistICAgYEBVcmlgCistICAgYEBQYXRoYCwgYEBQYXRoUGFyYW1gCisKK1J1bm5pbmcgdGhlIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworUnVuIHRoZSBleGFtcGxlIGFzIGZvbGxvd3M6CisKKz4gICAgIG12biBjbGVhbiBwYWNrYWdlIGpldHR5OnJ1bgorCitUaGlzIGRlcGxveXMgY3VycmVudCBleGFtcGxlIG9uIHRoZSBsb2NhbCBob3N0LiBZb3UgY2FuIHRoZW4gYWNjZXNzCitmcm9udHBhZ2UgYXQgPGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9tYW5hZ2VkLWNsaWVudC1zaW1wbGUtd2ViYXBwL2luZGV4Lmh0bWw+LgorVGhpcyBwYWdlIGNvbnRpYW5zIGRlc2NyaXB0aW9uIG9mIGFsbCByZXNvdXJjZXMgYXZhaWxhYmxlIGluIHRoZSBhcHBsaWNhdGlvbi4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL21hbmFnZWQtY2xpZW50LXNpbXBsZS13ZWJhcHAvcG9tLnhtbCBiL2V4YW1wbGVzL21hbmFnZWQtY2xpZW50LXNpbXBsZS13ZWJhcHAvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjQ0ZTBiCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvbWFuYWdlZC1jbGllbnQtc2ltcGxlLXdlYmFwcC9wb20ueG1sCkBAIC0wLDAgKzEsNjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisKKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+d2ViYXBwLWV4YW1wbGUtcGFyZW50PC9hcnRpZmFjdElkPgorICAgICAgICA8cmVsYXRpdmVQYXRoPi4uL3dlYmFwcC1leGFtcGxlLXBhcmVudC9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5tYW5hZ2VkLWNsaWVudC1zaW1wbGUtd2ViYXBwPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LWV4YW1wbGVzLW1hbmFnZWQtY2xpZW50LXNpbXBsZS13ZWJhcHA8L25hbWU+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1oazI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qZXR0eS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnJlbGVhc2U8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD54bWwtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9tYW5hZ2VkLWNsaWVudC1zaW1wbGUtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvbWFuYWdlZGNsaWVudHNpbXBsZS9yZXNvdXJjZXMvQ2xpZW50UmVzb3VyY2UuamF2YSBiL2V4YW1wbGVzL21hbmFnZWQtY2xpZW50LXNpbXBsZS13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9tYW5hZ2VkY2xpZW50c2ltcGxlL3Jlc291cmNlcy9DbGllbnRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhYTc1MmQKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9tYW5hZ2VkLWNsaWVudC1zaW1wbGUtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvbWFuYWdlZGNsaWVudHNpbXBsZS9yZXNvdXJjZXMvQ2xpZW50UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLm1hbmFnZWRjbGllbnRzaW1wbGUucmVzb3VyY2VzOworCisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlVyaTsKKworLyoqCisgKiBBIHJlc291cmNlIHdoaWNoIHVzZSBtYW5hZ2VkIGNsaWVudCBpbmplY3RlZCBieSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlVyaSBAVXJpIGFubm90YXRpb259IHRvIHF1ZXJ5CisgKiBleHRlcm5hbCByZXNvdXJjZXMgYW5kIHJlc291cmNlIGZyb20ge0BsaW5rIFN0YW5kYXJkUmVzb3VyY2V9LgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqCisgKi8KK0BQYXRoKCJjbGllbnQiKQorcHVibGljIGNsYXNzIENsaWVudFJlc291cmNlIHsKKworICAgIC8qKgorICAgICAqIE1ha2UgcmVxdWVzdCB0byBleHRlcm5hbCB3ZWIgc2l0ZSB1c2luZyBpbmplY3RlZCBjbGllbnQuIFRoZSByZXNwb25zZSBmcm9tIHRoZSBpbmplY3RlZCBjbGllbnQgaXMgdGhlbgorICAgICAqIHJldHVybmVkIGFzIGEgcmVzcG9uc2UgZnJvbSB0aGlzIHJlc291cmNlIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3ZWJUYXJnZXQgSW5qZWN0ZWQgd2ViIHRhcmdldC4KKyAgICAgKiBAcmV0dXJuIFJlc3BvbnNlLgorICAgICAqLworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfSFRNTCkKKyAgICBAUGF0aCgiZ2xhc3NmaXNoIikKKyAgICBwdWJsaWMgUmVzcG9uc2UgZ2xhc3NmaXNoKEBVcmkoImh0dHA6Ly9nbGFzc2Zpc2guamF2YS5uZXQvIikgV2ViVGFyZ2V0IHdlYlRhcmdldCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHdlYlRhcmdldC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIHJldHVybiBSZXNwb25zZS5mcm9tUmVzcG9uc2UocmVzcG9uc2UpLmJ1aWxkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUXVlcnkge0BsaW5rIFN0YW5kYXJkUmVzb3VyY2V9IGFuZCByZXR1cm4gcmVzdWx0IGJhc2VkIG9uIHRoZSByZXN1bHRzIGZyb20gbWV0aG9kcyBvZiB0aGUge0BsaW5rIFN0YW5kYXJkUmVzb3VyY2V9LgorICAgICAqCisgICAgICogQHBhcmFtIGRvZ1dlYlRhcmdldCBJbmplY3RlZCBjbGllbnQuCisgICAgICogQHBhcmFtIGNhdFdlYlRhcmdldCBJbmplY3RlZCBjbGllbnQuCisgICAgICogQHBhcmFtIGVsZWZhbnRXZWJUYXJnZXQgSW5qZWN0ZWQgY2xpZW50LgorICAgICAqIEByZXR1cm4gU3RyaW5nIGVudGl0eS4KKyAgICAgKi8KKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgIEBQYXRoKCJhbmltYWxzIikKKyAgICBwdWJsaWMgU3RyaW5nIGFuaW1hbHMoQFVyaSgicmVzb3VyY2UvZG9nIikgV2ViVGFyZ2V0IGRvZ1dlYlRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQFVyaSgicmVzb3VyY2UvY2F0IikgV2ViVGFyZ2V0IGNhdFdlYlRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQFVyaSgicmVzb3VyY2UvZWxlZmFudCIpIFdlYlRhcmdldCBlbGVmYW50V2ViVGFyZ2V0KSB7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGRvZyA9IGRvZ1dlYlRhcmdldC5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGZpbmFsIFN0cmluZyBjYXQgPSBjYXRXZWJUYXJnZXQucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBmaW5hbCBTdHJpbmcgZWxlZmFudCA9IGVsZWZhbnRXZWJUYXJnZXQucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICByZXR1cm4gIlF1ZXJpZWQgYW5pbWFsczogIiArIGRvZyArICIgYW5kICIgKyBjYXQgKyAiIGFuZCAiICsgZWxlZmFudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBRdWVyeSB7QGxpbmsgU3RhbmRhcmRSZXNvdXJjZX0gdXNpbmcgYSBpbmplY3RlZCBjbGllbnQuIFRoZSBjbGllbnQgaW5qZWN0aW9uIGlzIHVzaW5nIGEgdGVtcGxhdGUgcGFyYW1ldGVyIHtAY29kZSBpZH0KKyAgICAgKiB3aGljaCBpcyBmaWxsZWQgYnkgSkFYLVJTIGltcGxlbWVudGF0aW9uIHVzaW5nIGEgcGF0aCBwYXJhbWV0ZXIgb2YgdGhpcyByZXNvdXJjZSBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd2ViVGFyZ2V0IEluamVjdGVkIGNsaWVudC4KKyAgICAgKiBAcGFyYW0gaWQgUGF0aCBwYXJhbWV0ZXIuCisgICAgICogQHJldHVybiBTdHJpbmcgZW50aXR5LgorICAgICAqLworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgQFBhdGgoImNhci97aWR9IikKKyAgICBwdWJsaWMgU3RyaW5nIGNhcihAVXJpKCJyZXNvdXJjZS9jYXIve2lkfSIpIFdlYlRhcmdldCB3ZWJUYXJnZXQsIEBQYXRoUGFyYW0oImlkIikgU3RyaW5nIGlkKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gd2ViVGFyZ2V0LnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgcmV0dXJuICJSZXNwb25zZSBmcm9tIHJlc291cmNlL2Nhci8iICsgaWQgKyAiOiAiICsgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL21hbmFnZWQtY2xpZW50LXNpbXBsZS13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9tYW5hZ2VkY2xpZW50c2ltcGxlL3Jlc291cmNlcy9NYW5hZ2VkQ2xpZW50QXBwbGljYXRpb24uamF2YSBiL2V4YW1wbGVzL21hbmFnZWQtY2xpZW50LXNpbXBsZS13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9tYW5hZ2VkY2xpZW50c2ltcGxlL3Jlc291cmNlcy9NYW5hZ2VkQ2xpZW50QXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDA4ZWVkCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvbWFuYWdlZC1jbGllbnQtc2ltcGxlLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL21hbmFnZWRjbGllbnRzaW1wbGUvcmVzb3VyY2VzL01hbmFnZWRDbGllbnRBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMubWFuYWdlZGNsaWVudHNpbXBsZS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGg7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKKy8qKgorICoge0BsaW5rIFJlc291cmNlQ29uZmlnIHJlc291cmNlIGNvbmZpZ30gcmVnaXN0ZXJpbmcgcmVzb3VyY2UgZm9yIG1hbmFnZWQgY2xpZW50IHNpbXBsZSBzYW1wbGUuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitAQXBwbGljYXRpb25QYXRoKCIvYXBwIikKK3B1YmxpYyBjbGFzcyBNYW5hZ2VkQ2xpZW50QXBwbGljYXRpb24gZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisKKyAgICBwdWJsaWMgTWFuYWdlZENsaWVudEFwcGxpY2F0aW9uKCkgeworICAgICAgICBzdXBlcihDbGllbnRSZXNvdXJjZS5jbGFzcywgU3RhbmRhcmRSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9tYW5hZ2VkLWNsaWVudC1zaW1wbGUtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvbWFuYWdlZGNsaWVudHNpbXBsZS9yZXNvdXJjZXMvU3RhbmRhcmRSZXNvdXJjZS5qYXZhIGIvZXhhbXBsZXMvbWFuYWdlZC1jbGllbnQtc2ltcGxlLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL21hbmFnZWRjbGllbnRzaW1wbGUvcmVzb3VyY2VzL1N0YW5kYXJkUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2M0ZWU3Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvbWFuYWdlZC1jbGllbnQtc2ltcGxlLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL21hbmFnZWRjbGllbnRzaW1wbGUvcmVzb3VyY2VzL1N0YW5kYXJkUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLm1hbmFnZWRjbGllbnRzaW1wbGUucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworCisvKioKKyAqIFN0YW5kYXJkIGV4YW1wbGUgcmVzb3VyY2UgZXhwb3NpbmcgIEdFVCBtZXRob2RzLiBUaGlzIHJlc291cmNlIGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSBieSBHRVQgYW5kIGlzIGFsc28KKyAqIGFjY2Vzc2VkIGZyb20ge0BsaW5rIENsaWVudFJlc291cmNlfSB1c2luZyBpbmplY3RlZCBjbGllbnQuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICoKKyAqLworQFBhdGgoInJlc291cmNlIikKK3B1YmxpYyBjbGFzcyBTdGFuZGFyZFJlc291cmNlIHsKKyAgICBAR0VUCisgICAgQFBhdGgoImRvZyIpCisgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgIHJldHVybiAiTWF4IjsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImNhdCIpCisgICAgcHVibGljIFN0cmluZyBjYXQoKSB7CisgICAgICAgIHJldHVybiAiTHVjeSI7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJlbGVmYW50IikKKyAgICBwdWJsaWMgU3RyaW5nIGVsZWZhbnQoKSB7CisgICAgICAgIHJldHVybiAiQm9ibyI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyByZXNvdXJjZSBiYXNlZCBvbiB0aGUgaWQgd2hpY2ggaXMgcGFzc2VkIGFzIHBhdGggcGFyYW1ldGVyLiBGb3IgcHVycG9zZSBvZiB0aGlzIHNhbXBsZSB0aGUgbWV0aG9kCisgICAgICoganVzdCB1c2UgdGhlIHBhdGggcGFyYW1ldGVyIGlkIHRvIGNvbnN0cnVjdCBhIHN0cmluZyB3aGljaCBpcyByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpZCBJbmplY3RlZCBwYXRoIHBhcmFtZXRlci4KKyAgICAgKiBAcmV0dXJuIFJlc291cmNlIGNvbnN0cnVjdGVkIGZyb20gZ2l2ZW4gaWQuCisgICAgICovCisgICAgQEdFVAorICAgIEBQYXRoKCJjYXIve2lkfSIpCisgICAgcHVibGljIFN0cmluZyBjYXIoQFBhdGhQYXJhbSgiaWQiKSBTdHJpbmcgaWQpIHsKKyAgICAgICAgcmV0dXJuICJDQVIgd2l0aCBpZD0iICsgaWQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvbWFuYWdlZC1jbGllbnQtc2ltcGxlLXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvZXhhbXBsZXMvbWFuYWdlZC1jbGllbnQtc2ltcGxlLXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMzZhYjIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9tYW5hZ2VkLWNsaWVudC1zaW1wbGUtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIyLjUiIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIj4KKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5tYW5hZ2VkY2xpZW50c2ltcGxlLnJlc291cmNlcy5NYW5hZ2VkQ2xpZW50QXBwbGljYXRpb248L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LndzLnJzLkFwcGxpY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLm1hbmFnZWRjbGllbnRzaW1wbGUucmVzb3VyY2VzLk1hbmFnZWRDbGllbnRBcHBsaWNhdGlvbjwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+bWFuYWdlZGNsaWVudHNpbXBsZS5yZXNvdXJjZXMuTWFuYWdlZENsaWVudEFwcGxpY2F0aW9uPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vYXBwLyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPHdlbGNvbWUtZmlsZS1saXN0PgorCTx3ZWxjb21lLWZpbGU+CisgICAgICAgICAgICBpbmRleC5odG1sCisgICAgICAgIDwvd2VsY29tZS1maWxlPgorICAgIDwvd2VsY29tZS1maWxlLWxpc3Q+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9tYW5hZ2VkLWNsaWVudC1zaW1wbGUtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sIGIvZXhhbXBsZXMvbWFuYWdlZC1jbGllbnQtc2ltcGxlLXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvaW5kZXguaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWI2YWNjCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvbWFuYWdlZC1jbGllbnQtc2ltcGxlLXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvaW5kZXguaHRtbApAQCAtMCwwICsxLDk3IEBACis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorCistLT4KKworPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+Cis8aHRtbD4KKzxoZWFkPgorICAgIDx0aXRsZT5NYW5hZ2VkIGNsaWVudCBzYW1wbGU8L3RpdGxlPgorICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PU1hY1JvbWFuIj4KKworICAgIDxzdHlsZT4KKyAgICAgICAgdGFibGUsIHRyLCB0aCwgdGQgeworICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQ7CisgICAgICAgICAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOworICAgICAgICAgICAgcGFkZGluZzogMnB4OworICAgICAgICB9CisgICAgPC9zdHlsZT4KKworPC9oZWFkPgorCis8Ym9keT4KKyAgICA8aDE+TWFuYWdlZCBjbGllbnQgc2ltcGxlIHNhbXBsZTwvaDE+CisgICAgPHA+VGhpcyBzYW1wbGUgc2hvd3MgdXNpbmcgY2xpZW50IGluamVjdGVkIGJ5IEBVcmkgaW50byB0aGUgcmVzb3VyY2UgbWV0aG9kcy4gVGhlIGZvbGxvd2luZyB0YWJsZSBjb250YWlucyBkZXNjcmlwdGlvbgorICAgIG9mIGFsbCBhY2Nlc3NpYmxlIHJlc291cmNlLjwvcD4KKyAgICA8dGFibGU+CisgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0ZD51cmk8L3RkPgorICAgICAgICAgICAgPHRkPmh0dHAgbWV0aG9kPC90ZD4KKyAgICAgICAgICAgIDx0ZD5kZXNjcmlwdGlvbjwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0ZD4vaW5kZXguaHRtbDwvdGQ+CisgICAgICAgICAgICA8dGQ+R0VUPC90ZD4KKyAgICAgICAgICAgIDx0ZD50aGlzIHBhZ2U8L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQ+L2FwcC8qPC90ZD4KKyAgICAgICAgICAgIDx0ZD48L3RkPgorICAgICAgICAgICAgPHRkPnJlc3QgYXBwbGljYXRpb24gaXMgZGVwbG95ZWQgdW5kZXIgdGhpcyBwYXRoPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRkPi9hcHAvcmVzb3VyY2UvKjwvdGQ+CisgICAgICAgICAgICA8dGQ+PC90ZD4KKyAgICAgICAgICAgIDx0ZD5zdGFuZGFyZCBzYW1wbGUgcmVzb3VyY2Ugd2l0aCBzdWIgcmVzb3VyY2UgbWV0aG9kczwvdGQ+CisgICAgICAgIDwvdHI+CisgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0ZD48YSBocmVmPSIuL2FwcC9yZXNvdXJjZS9kb2ciPi4vYXBwL3Jlc291cmNlL2RvZzwvYT48L3RkPgorICAgICAgICAgICAgPHRkPkdFVDwvdGQ+CisgICAgICAgICAgICA8dGQ+cmVzb3VyY2UgKHBsYWluL3RleHQpPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Ii4vYXBwL3Jlc291cmNlL2NhdCI+Li9hcHAvcmVzb3VyY2UvY2F0PC9hPjwvdGQ+CisgICAgICAgICAgICA8dGQ+R0VUPC90ZD4KKyAgICAgICAgICAgIDx0ZD5yZXNvdXJjZSAocGxhaW4vdGV4dCk8L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iLi9hcHAvcmVzb3VyY2UvZWxlZmFudCI+Li9hcHAvcmVzb3VyY2UvZWxlZmFudDwvYT48L3RkPgorICAgICAgICAgICAgPHRkPkdFVDwvdGQ+CisgICAgICAgICAgICA8dGQ+cmVzb3VyY2UgKHBsYWluL3RleHQpPC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRkPjxhIGhyZWY9Ii4vYXBwL3Jlc291cmNlL2Nhci84MCI+Li9hcHAvcmVzb3VyY2UvY2FyL3tpZH08L2E+PC90ZD4KKyAgICAgICAgICAgIDx0ZD5HRVQ8L3RkPgorICAgICAgICAgICAgPHRkPnJlc291cmNlIHdpdGggcGF0aCBwYXJhbSAocGxhaW4vdGV4dCkuIHtpZH0gaXMgYSBzdHJpbmcgcGF0aCBwYXJhbWV0ZXIuIEV4YW1wbGU6IC4vYXBwL3Jlc291cmNlL2Nhci84MDwvdGQ+CisgICAgICAgIDwvdHI+CisKKyAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRkPi9hcHAvY2xpZW50Lyo8L3RkPgorICAgICAgICAgICAgPHRkPjwvdGQ+CisgICAgICAgICAgICA8dGQ+UmVzb3VyY2Ugd2l0aCBzdWIgcmVzb3VyY2VzIHRoYXQgdXNlIGluamVjdGVkIGNsaWVudHMgdG8gcXVlcnkgc3ViIHJlc291cmNlcyBvZiA8Yj4vYXBwL3Jlc291cmNlLyo8L2I+IGFuZCBvdGhlciByZXNvdXJjZXM8L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iLi9hcHAvY2xpZW50L2dsYXNzZmlzaCI+Li9hcHAvY2xpZW50L2dsYXNzZmlzaDwvYT48L3RkPgorICAgICAgICAgICAgPHRkPkdFVDwvdGQ+CisgICAgICAgICAgICA8dGQ+UXVlcmllcyBieSBHRVQgPGEgaHJlZj0iaHR0cDovL2dsYXNzZmlzaC5qYXZhLm5ldCI+aHR0cDovL2dsYXNzZmlzaC5qYXZhLm5ldDwvYT4gYW5kIHJldHVybnMgdGFyZ2V0IGh0bWwgcGFnZS48L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQ+PGEgaHJlZj0iLi9hcHAvY2xpZW50L2FuaW1hbHMiPi4vYXBwL2NsaWVudC9hbmltYWxzPC9hPjwvdGQ+CisgICAgICAgICAgICA8dGQ+R0VUPC90ZD4KKyAgICAgICAgICAgIDx0ZD5RdWVyaWVzIDxhIGhyZWY9Ii4vYXBwL3Jlc291cmNlL2RvZyI+Li9hcHAvcmVzb3VyY2UvZG9nPC9hPiwgPGEgaHJlZj0iLi9hcHAvcmVzb3VyY2UvY2F0Ij4uL2FwcC9yZXNvdXJjZS9jYXQ8L2E+IGFuZCA8YSBocmVmPSIuL2FwcC9yZXNvdXJjZS9lbGVmYW50Ij4uL2FwcC9yZXNvdXJjZS9lbGVmYW50PC9hPiBhbmQgcmV0dXJucyBtZXJnZWQgcmVzdWx0PC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICA8dGQ+PGEgaHJlZj0iLi9hcHAvY2xpZW50L2Nhci8xNSI+Li9hcHAvY2xpZW50L2Nhci97aWR9PC9hPjwvdGQ+CisgICAgICAgICAgICA8dGQ+R0VUPC90ZD4KKyAgICAgICAgICAgIDx0ZD5RdWVyaWVzIC9hcHAvcmVzb3VyY2UvY2FyL3tpZH0gYW5kIHJldHVybnMgcmVzdWx0LiB7aWR9IGlzIGEgc3RyaW5nIHBhdGggcGFyYW1ldGVyLiBFeGFtcGxlOiAuL2FwcC9yZXNvdXJjZS9jbGllbnQvY2FyLzE1PC90ZD4KKyAgICAgICAgPC90cj4KKyAgICA8L3RhYmxlPgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvbWFuYWdlZC1jbGllbnQtc2ltcGxlLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL21hbmFnZWRjbGllbnRzaW1wbGUvTWFuYWdlZENsaWVudFNpbXBsZVRlc3QuamF2YSBiL2V4YW1wbGVzL21hbmFnZWQtY2xpZW50LXNpbXBsZS13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9tYW5hZ2VkY2xpZW50c2ltcGxlL01hbmFnZWRDbGllbnRTaW1wbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYxMGY4OQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL21hbmFnZWQtY2xpZW50LXNpbXBsZS13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9tYW5hZ2VkY2xpZW50c2ltcGxlL01hbmFnZWRDbGllbnRTaW1wbGVUZXN0LmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5tYW5hZ2VkY2xpZW50c2ltcGxlOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLm1hbmFnZWRjbGllbnRzaW1wbGUucmVzb3VyY2VzLk1hbmFnZWRDbGllbnRBcHBsaWNhdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKgorICovCitwdWJsaWMgY2xhc3MgTWFuYWdlZENsaWVudFNpbXBsZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgTWFuYWdlZENsaWVudEFwcGxpY2F0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFVSSSBnZXRCYXNlVXJpKCkgeworICAgICAgICBmaW5hbCBVcmlCdWlsZGVyIGJhc2VVcmlCdWlsZGVyID0gVXJpQnVpbGRlci5mcm9tVXJpKHN1cGVyLmdldEJhc2VVcmkoKSkucGF0aCgibWFuYWdlZC1jbGllbnQtc2ltcGxlLXdlYmFwcCIpOworICAgICAgICBmaW5hbCBib29sZWFuIGV4dGVybmFsRmFjdG9yeUluVXNlID0gZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSBpbnN0YW5jZW9mIEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CisgICAgICAgIHJldHVybiBleHRlcm5hbEZhY3RvcnlJblVzZSA/IGJhc2VVcmlCdWlsZGVyLnBhdGgoImFwcCIpLmJ1aWxkKCkgOiBiYXNlVXJpQnVpbGRlci5idWlsZCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hbmFnZWRDbGllbnRTaW1wbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHJlc291cmNlID0gdGFyZ2V0KCkucGF0aCgiY2xpZW50Iik7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlOworCisgICAgICAgIHJlc3BvbnNlID0gcmVzb3VyY2UucGF0aCgiYW5pbWFscyIpLnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfUExBSU4pLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiUXVlcmllZCBhbmltYWxzOiBNYXggYW5kIEx1Y3kgYW5kIEJvYm8iLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworCisgICAgICAgIHJlc3BvbnNlID0gcmVzb3VyY2UucGF0aCgiY2FyLzEiKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlJlc3BvbnNlIGZyb20gcmVzb3VyY2UvY2FyLzE6IENBUiB3aXRoIGlkPTEiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS9leGFtcGxlcy9tYW5hZ2VkLWNsaWVudC13ZWJhcHAvUkVBRE1FLk1EIGIvZXhhbXBsZXMvbWFuYWdlZC1jbGllbnQtd2ViYXBwL1JFQURNRS5NRApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTM3ZDFiCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvbWFuYWdlZC1jbGllbnQtd2ViYXBwL1JFQURNRS5NRApAQCAtMCwwICsxLDgxIEBACitbLy9dOiAjICIgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICIKK1svL106ICMgIiAiCitbLy9dOiAjICIgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlICIKK1svL106ICMgIiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCAiCitbLy9dOiAjICIgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLiAiCitbLy9dOiAjICIgIgorWy8vXTogIyAiIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UgIgorCitNYW5hZ2VkIENsaWVudCBFeGFtcGxlCis9PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgYSBzaW1wbGUgdXNhZ2Ugb2YgSmVyc2V5IE1hbmFnZWQgQ2xpZW50CitmZWF0dXJlLgorCitDb250ZW50cworLS0tLS0tLS0KKworVGhlIG1hcHBpbmcgb2YgdGhlIFVSSSBwYXRoIHNwYWNlIGlzIHByZXNlbnRlZCBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOgorCitVUkkgcGF0aCAgICAgICAgICAgIHwgUmVzb3VyY2UgY2xhc3MgICAgIHwgSFRUUCBtZXRob2RzCistLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0KKyoqXy9wdWJsaWMvYV8qKiAgICAgfCBQdWJsaWNSZXNvdXJjZSAgICAgfCBHRVQKKyoqXy9wdWJsaWMvYl8qKiAgICAgfCBQdWJsaWNSZXNvdXJjZSAgICAgfCBHRVQKKyoqXy9pbnRlcm5hbC9hXyoqICAgfCBJbnRlcm5hbFJlc291cmNlICAgfCBHRVQKKyoqXy9pbnRlcm5hbC9iXyoqICAgfCBJbnRlcm5hbFJlc291cmNlICAgfCBHRVQKKworSW4gdGhlIGV4YW1wbGUsIHRoZSByZXF1ZXN0cyB0byBhICpwdWJsaWMgcmVzb3VyY2UqIGRlcGxveWVkIG9uCitgL3B1YmxpYy9gIHBhdGggYXJlIGZvcndhcmRlZCB0byBhbiAqaW50ZXJuYWwgcmVzb3VyY2UqIChkZXBsb3llZCBvbgorYC9pbnRlcm5hbC9gIHBhdGgpIHVzaW5nIGluamVjdGVkCitbamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldF0oaHR0cHM6Ly9qYXgtcnMtc3BlYy5qYXZhLm5ldC9ub25hdi8yLjAvYXBpZG9jcy9qYXZheC93cy9ycy9jbGllbnQvV2ViVGFyZ2V0Lmh0bWwpCitpbnN0YW5jZXMgcHJvZHVjZWQgdXNpbmcgMiBzZXBhcmF0ZSBtYW5hZ2VkIGNsaWVudHMgZWFjaCBvZiB0aGUgbWFuYWdlZAorY2xpZW50cyB1c2luZyBpdCdzIG93biBjdXN0b20gY29uZmlndXJhdGlvbi4KKworQW4gYWNjZXNzIHRvIGludGVybmFsIHJlc291cmNlIG1ldGhvZHMgaXMgZ3VhcmRlZCBieSBhIGNvbnRhaW5lciByZXF1ZXN0CitmaWx0ZXIgKGBDdXN0b21IZWFkZXJGaWx0ZXJgKSB3aGljaCByZWplY3RzIGFueSByZXF1ZXN0IHRoYXQgZG9lcyBub3QKK2NvbnRhaW4gZXhwZWN0ZWQgY3VzdG9tIGhlYWRlciBzZXQgdG8gYW4gZXhwZWN0ZWQgdmFsdWUuIEluIHRoZSBleGFtcGxlLAordGhlIDIgbWFuYWdlZCBjbGllbnRzICh1c2VkIGJ5IGEgcHVibGljIHJlc291cmNlIHRvIGFjY2VzcyB0aGUgbWV0aG9kcworb24gdGhlIGludGVybmFsIHJlc291cmNlKSBhcmUgY29uZmlndXJlZCB3aXRoIGN1c3RvbSBjb25maWd1cmF0aW9ucywKK2VhY2ggY29udGFpbmluZyBhIHJlZ2lzdHJhdGlvbiBvZiBhIGN1c3RvbSBjbGllbnQgcmVxdWVzdCBmaWx0ZXIgdGhhdCBpcworaW5zdHJ1Y3RlZCB0byBhcHBlbmQgYSByZXF1aXJlZCBjdXN0b20gaGVhZGVyIGFuZCB2YWx1ZSB0byBldmVyeQorb3V0Z29pbmcgcmVxdWVzdC4gT25seSB3aXRoIG1hbmFnZWQgY2xpZW50IHN1cHBvcnQgd29ya2luZyBwcm9wZXJseSwgdGhlCitwdWJsaWMgcmVzb3VyY2UgaXMgYWJsZSB0byBzdWNjZXNzZnVsbHkgcmV0cmlldmUgZGF0YSBmcm9tIHRoZSBpbnRlcm5hbAorcmVzb3VyY2UuCisKK1J1bm5pbmcgdGhlIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworUnVuIHRoZSBleGFtcGxlIGFzIGZvbGxvd3M6CisKKz4gICAgIG12biBjbGVhbiBwYWNrYWdlIGpldHR5OnJ1bgorCitUaGlzIGRlcGxveXMgY3VycmVudCBleGFtcGxlIG9uIHRoZSBsb2NhbCBob3N0LiBZb3UgY2FuIHRoZW4gYWNjZXNzIFdBREwKK2Rlc2NyaXB0aW9uIG9mIHRoZSBkZXBsb3llZCBhcHBsaWNhdGlvbiBhdAorPGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9tYW5hZ2VkLWNsaWVudC13ZWJhcHAvYXBwbGljYXRpb24ud2FkbD4uCisKK1lvdSBjYW4gYWNjZXNzIHB1YmxpYyByZXNvdXJjZSBvZiB0aGlzIGFwcGxpY2F0aW9uIHVzaW5nIGN1cmw6CisKKz4gICAgIGN1cmwgLXYgLUggIkFjY2VwdDogdGV4dC9wbGFpbiIgaHR0cDovL2xvY2FsaG9zdDo4MDgwL21hbmFnZWQtY2xpZW50LXdlYmFwcC9wdWJsaWMvYQorCis+ICAgICBjdXJsIC12IC1IICJBY2NlcHQ6IHRleHQvcGxhaW4iIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9tYW5hZ2VkLWNsaWVudC13ZWJhcHAvcHVibGljL2IKKworSW4gdGhpcyBleGFtcGxlIHlvdSBzaG91bGQgc2VlIHRoZSByZXR1cm5lZCByZXNwb25zZSBtZXNzYWdlIGJvZHkKK2NvbnRhaW5zICJhIiBvciAiYiIgcmVzcGVjdGl2ZWx5IHVwb24gc3VjY2Vzc2Z1bCBpbnZvY2F0aW9uLgorCitZb3UgbWF5IGFsc28gdmVyaWZ5IHRoYXQgYWNjZXNzIHRvIGludGVybmFsIHJlc291cmNlIGlzIG5vdCBwb3NzaWJsZQord2l0aG91dCBpbmNsdWRpbmcgYSBwcm9wZXIgaGVhZGVyIGluIHRoZSByZXF1ZXN0LiBGaXJzdCB0cnkgdG8gYWNjZXNzCit0aGUgaW50ZXJuYWwgcmVzb3VyY2Ugd2l0aG91dCBhbnkgY3VzdG9tIGhlYWRlcjoKKworPiAgICAgY3VybCAtdiAtSCAiQWNjZXB0OiB0ZXh0L3BsYWluIiBodHRwOi8vbG9jYWxob3N0OjgwODAvbWFuYWdlZC1jbGllbnQtd2ViYXBwL2ludGVybmFsL2EKKworPiAgICAgY3VybCAtdiAtSCAiQWNjZXB0OiB0ZXh0L3BsYWluIiBodHRwOi8vbG9jYWxob3N0OjgwODAvbWFuYWdlZC1jbGllbnQtd2ViYXBwL2ludGVybmFsL2IKKworSW4gYm90aCBjYXNlcyBhIGBIVFRQIDQwMyBGb3JiaWRkZW4uYCByZXNwb25zZSBpcyByZXR1cm5lZC4gTm93IGxldHMgdHJ5Cit0byBhY2Nlc3MgdGhlIHJlc291cmNlIG9uY2UgYWdhaW4sIGJ1dCB0aGlzIHRpbWUgd2UnbGwgaW5jbHVkZSBhbHNvIHRoZQorZXhwZWN0ZWQgY3VzdG9tIGhlYWRlcnM6CisKKz4gICAgIGN1cmwgLXYgLUggIkFjY2VwdDogdGV4dC9wbGFpbiIgLUggImN1c3RvbS1oZWFkZXI6YSIgaHR0cDovL2xvY2FsaG9zdDo4MDgwL21hbmFnZWQtY2xpZW50LXdlYmFwcC9pbnRlcm5hbC9hCisKKz4gICAgIGN1cmwgLXYgLUggIkFjY2VwdDogdGV4dC9wbGFpbiIgLUggImN1c3RvbS1oZWFkZXI6YiIgaHR0cDovL2xvY2FsaG9zdDo4MDgwL21hbmFnZWQtY2xpZW50LXdlYmFwcC9pbnRlcm5hbC9iCisKK0ZpbmFsbHksIHlvdSBzaG91bGQgc2VlIHRoZSBpbnZvY2F0aW9uIHN1Y2NlZWRlZCBhbmQgdGhlIHJldHVybmVkIHJlc3BvbnNlIG1lc3NhZ2UgYm9keSBjb250YWlucyAiYSIgb3IgImIiIHJlc3BlY3RpdmVseS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9tYW5hZ2VkLWNsaWVudC13ZWJhcHAvcG9tLnhtbCBiL2V4YW1wbGVzL21hbmFnZWQtY2xpZW50LXdlYmFwcC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmOTI4N2YKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9tYW5hZ2VkLWNsaWVudC13ZWJhcHAvcG9tLnhtbApAQCAtMCwwICsxLDcyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorCisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPndlYmFwcC1leGFtcGxlLXBhcmVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi93ZWJhcHAtZXhhbXBsZS1wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+bWFuYWdlZC1jbGllbnQtd2ViYXBwPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LWV4YW1wbGVzLW1hbmFnZWQtY2xpZW50LXdlYmFwcDwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgbWFuYWdlZCBjbGllbnQgd2ViIGFwcGxpY2F0aW9uIGV4YW1wbGUuPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDwhLS0gdW5jb21tZW50IHRvIHVzZSBHcml6emx5IGNsaWVudCAtLT4KKyAgICAgICAgPCEtLWRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb25uZWN0b3JzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWdyaXp6bHktY29ubmVjdG9yPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3ktLT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktaGsyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamV0dHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5yZWxlYXNlPC9pZD4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+eG1sLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICA8L3Byb2ZpbGVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9tYW5hZ2VkLWNsaWVudC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9tYW5hZ2VkY2xpZW50L0NsaWVudEEuamF2YSBiL2V4YW1wbGVzL21hbmFnZWQtY2xpZW50LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL21hbmFnZWRjbGllbnQvQ2xpZW50QS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4ZmRhMmIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9tYW5hZ2VkLWNsaWVudC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9tYW5hZ2VkY2xpZW50L0NsaWVudEEuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLm1hbmFnZWRjbGllbnQ7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNsaWVudEJpbmRpbmc7CisKKy8qKgorICogTWFuYWdlZCBjbGllbnQgY29uZmlndXJhdGlvbiBmb3IgY2xpZW50IEEuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQENsaWVudEJpbmRpbmcoY29uZmlnQ2xhc3MgPSBNeUFwcGxpY2F0aW9uLk15Q2xpZW50QUNvbmZpZy5jbGFzcykKK0BEb2N1bWVudGVkCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorQFRhcmdldCh7RWxlbWVudFR5cGUuRklFTEQsIEVsZW1lbnRUeXBlLlBBUkFNRVRFUn0pCitwdWJsaWMgQGludGVyZmFjZSBDbGllbnRBIHsKK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL21hbmFnZWQtY2xpZW50LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL21hbmFnZWRjbGllbnQvQ2xpZW50Qi5qYXZhIGIvZXhhbXBsZXMvbWFuYWdlZC1jbGllbnQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvbWFuYWdlZGNsaWVudC9DbGllbnRCLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc4MjI5ZgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL21hbmFnZWQtY2xpZW50LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL21hbmFnZWRjbGllbnQvQ2xpZW50Qi5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMubWFuYWdlZGNsaWVudDsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ2xpZW50QmluZGluZzsKKworLyoqCisgKiBNYW5hZ2VkIGNsaWVudCBjb25maWd1cmF0aW9uIGZvciBjbGllbnQgQi4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitAQ2xpZW50QmluZGluZyhjb25maWdDbGFzcyA9IE15QXBwbGljYXRpb24uTXlDbGllbnRCQ29uZmlnLmNsYXNzKQorQERvY3VtZW50ZWQKK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitAVGFyZ2V0KHtFbGVtZW50VHlwZS5GSUVMRCwgRWxlbWVudFR5cGUuUEFSQU1FVEVSfSkKK3B1YmxpYyBAaW50ZXJmYWNlIENsaWVudEIgeworfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvbWFuYWdlZC1jbGllbnQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvbWFuYWdlZGNsaWVudC9DdXN0b21IZWFkZXJGZWF0dXJlLmphdmEgYi9leGFtcGxlcy9tYW5hZ2VkLWNsaWVudC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9tYW5hZ2VkY2xpZW50L0N1c3RvbUhlYWRlckZlYXR1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjczYWY2Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvbWFuYWdlZC1jbGllbnQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvbWFuYWdlZGNsaWVudC9DdXN0b21IZWFkZXJGZWF0dXJlLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5tYW5hZ2VkY2xpZW50OworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5EeW5hbWljRmVhdHVyZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuUmVzb3VyY2VJbmZvOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CisKKy8qKgorICogRHluYW1pYyBmZWF0dXJlIHRoYXQgYXBwZW5kcyBhIHByb3Blcmx5IGNvbmZpZ3VyZWQge0BsaW5rIEN1c3RvbUhlYWRlckZpbHRlcn0gaW5zdGFuY2UKKyAqIHRvIGV2ZXJ5IG1ldGhvZCB0aGF0IGlzIGFubm90YXRlZCB3aXRoIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5tYW5hZ2VkY2xpZW50LkN1c3RvbUhlYWRlckZlYXR1cmUuUmVxdWlyZSAmIzY0O1JlcXVpcmV9IGludGVybmFsIGZlYXR1cmUKKyAqIGFubm90YXRpb24uCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEN1c3RvbUhlYWRlckZlYXR1cmUgaW1wbGVtZW50cyBEeW5hbWljRmVhdHVyZSB7CisKKyAgICAvKioKKyAgICAgKiBBIG1ldGhvZCBhbm5vdGF0aW9uIHRvIGJlIHBsYWNlZCBvbiB0aG9zZSByZXNvdXJjZSBtZXRob2RzIHRvIHdoaWNoIGEgdmFsaWRhdGluZworICAgICAqIHtAbGluayBDdXN0b21IZWFkZXJGaWx0ZXJ9IGluc3RhbmNlIHNob3VsZCBiZSBhZGRlZC4KKyAgICAgKi8KKyAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorICAgIEBEb2N1bWVudGVkCisgICAgQFRhcmdldChFbGVtZW50VHlwZS5NRVRIT0QpCisgICAgcHVibGljIHN0YXRpYyBAaW50ZXJmYWNlIFJlcXVpcmUgeworICAgICAgICAvKioKKyAgICAgICAgICogRXhwZWN0ZWQgY3VzdG9tIGhlYWRlciBuYW1lIHRvIGJlIHZhbGlkYXRlZCBieSB0aGUge0BsaW5rIEN1c3RvbUhlYWRlckZpbHRlcn0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGhlYWRlck5hbWUoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogRXhwZWN0ZWQgY3VzdG9tIGhlYWRlciB2YWx1ZSB0byBiZSB2YWxpZGF0ZWQgYnkgdGhlIHtAbGluayBDdXN0b21IZWFkZXJGaWx0ZXJ9LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBoZWFkZXJWYWx1ZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShSZXNvdXJjZUluZm8gcmVzb3VyY2VJbmZvLCBGZWF0dXJlQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGZpbmFsIFJlcXVpcmUgdmEgPSByZXNvdXJjZUluZm8uZ2V0UmVzb3VyY2VNZXRob2QoKS5nZXRBbm5vdGF0aW9uKFJlcXVpcmUuY2xhc3MpOworICAgICAgICBpZiAodmEgIT0gbnVsbCkgeworICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihuZXcgQ3VzdG9tSGVhZGVyRmlsdGVyKHZhLmhlYWRlck5hbWUoKSwgdmEuaGVhZGVyVmFsdWUoKSkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvbWFuYWdlZC1jbGllbnQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvbWFuYWdlZGNsaWVudC9DdXN0b21IZWFkZXJGaWx0ZXIuamF2YSBiL2V4YW1wbGVzL21hbmFnZWQtY2xpZW50LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL21hbmFnZWRjbGllbnQvQ3VzdG9tSGVhZGVyRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTEwNDE0YgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL21hbmFnZWQtY2xpZW50LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL21hbmFnZWRjbGllbnQvQ3VzdG9tSGVhZGVyRmlsdGVyLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5tYW5hZ2VkY2xpZW50OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworLyoqCisgKiBBIGZpbHRlciBmb3IgYXBwZW5kaW5nIGFuZCB2YWxpZGF0aW5nIGN1c3RvbSBoZWFkZXJzLgorICogPHA+CisgKiBPbiB0aGUgY2xpZW50IHNpZGUsIGFwcGVuZHMgYSBuZXcgY3VzdG9tIHJlcXVlc3QgaGVhZGVyIHdpdGggYSBjb25maWd1cmVkIG5hbWUgYW5kIHZhbHVlIHRvIGVhY2ggb3V0Z29pbmcgcmVxdWVzdC4KKyAqIDwvcD4KKyAqIDxwPgorICogT24gdGhlIHNlcnZlciBzaWRlLCB2YWxpZGF0ZXMgdGhhdCBlYWNoIHJlcXVlc3QgaGFzIGEgY3VzdG9tIGhlYWRlciB3aXRoIGEgY29uZmlndXJlZCBuYW1lIGFuZCB2YWx1ZS4KKyAqIElmIHRoZSB2YWxpZGF0aW9uIGZhaWxzIGEgSFRUUCA0MDMgcmVzcG9uc2UgaXMgcmV0dXJuZWQuCisgKiA8L3A+CisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEN1c3RvbUhlYWRlckZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIsIENsaWVudFJlcXVlc3RGaWx0ZXIgeworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGhlYWRlck5hbWU7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaGVhZGVyVmFsdWU7CisKKyAgICBwdWJsaWMgQ3VzdG9tSGVhZGVyRmlsdGVyKFN0cmluZyBoZWFkZXJOYW1lLCBTdHJpbmcgaGVhZGVyVmFsdWUpIHsKKyAgICAgICAgaWYgKGhlYWRlck5hbWUgPT0gbnVsbCB8fCBoZWFkZXJWYWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJIZWFkZXIgbmFtZSBhbmQgdmFsdWUgbXVzdCBub3QgYmUgbnVsbC4iKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmhlYWRlck5hbWUgPSBoZWFkZXJOYW1lOworICAgICAgICB0aGlzLmhlYWRlclZhbHVlID0gaGVhZGVyVmFsdWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IGN0eCkgdGhyb3dzIElPRXhjZXB0aW9uIHsgLy8gdmFsaWRhdGUKKyAgICAgICAgaWYgKCFoZWFkZXJWYWx1ZS5lcXVhbHMoY3R4LmdldEhlYWRlclN0cmluZyhoZWFkZXJOYW1lKSkpIHsKKyAgICAgICAgICAgIGN0eC5hYm9ydFdpdGgoUmVzcG9uc2Uuc3RhdHVzKFJlc3BvbnNlLlN0YXR1cy5GT1JCSURERU4pCisgICAgICAgICAgICAgICAgICAgIC50eXBlKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgICAgICAgICAgICAgICAgICAuZW50aXR5KFN0cmluZy5mb3JtYXQoIkV4cGVjdGVkIGhlYWRlciAnJXMnIG5vdCBwcmVzZW50IG9yIHZhbHVlIG5vdCBlcXVhbCB0byAnJXMnIiwgaGVhZGVyTmFtZSwgaGVhZGVyVmFsdWUpKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ2xpZW50UmVxdWVzdENvbnRleHQgY3R4KSB0aHJvd3MgSU9FeGNlcHRpb24geyAvLyBhcHBlbmQKKyAgICAgICAgY3R4LmdldEhlYWRlcnMoKS5wdXRTaW5nbGUoaGVhZGVyTmFtZSwgaGVhZGVyVmFsdWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL21hbmFnZWQtY2xpZW50LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL21hbmFnZWRjbGllbnQvSW50ZXJuYWxSZXNvdXJjZS5qYXZhIGIvZXhhbXBsZXMvbWFuYWdlZC1jbGllbnQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvbWFuYWdlZGNsaWVudC9JbnRlcm5hbFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjcxNTEyOQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL21hbmFnZWQtY2xpZW50LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL21hbmFnZWRjbGllbnQvSW50ZXJuYWxSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMubWFuYWdlZGNsaWVudDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworCisvKioKKyAqIEludGVybmFsIHJlc291cmNlIGFjY2Vzc2VkIGZyb20gdGhlIG1hbmFnZWQgY2xpZW50IHJlc291cmNlLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJpbnRlcm5hbCIpCitwdWJsaWMgY2xhc3MgSW50ZXJuYWxSZXNvdXJjZSB7CisKKyAgICBAR0VUCisgICAgQFBhdGgoImEiKQorICAgIEBDdXN0b21IZWFkZXJGZWF0dXJlLlJlcXVpcmUoaGVhZGVyTmFtZSA9ICJjdXN0b20taGVhZGVyIiwgaGVhZGVyVmFsdWUgPSAiYSIpCisgICAgcHVibGljIFN0cmluZyBnZXRBKCkgeworICAgICAgICByZXR1cm4gImEiOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiYiIpCisgICAgQEN1c3RvbUhlYWRlckZlYXR1cmUuUmVxdWlyZShoZWFkZXJOYW1lID0gImN1c3RvbS1oZWFkZXIiLCBoZWFkZXJWYWx1ZSA9ICJiIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldEIoKSB7CisgICAgICAgIHJldHVybiAiYiI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvbWFuYWdlZC1jbGllbnQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvbWFuYWdlZGNsaWVudC9NeUFwcGxpY2F0aW9uLmphdmEgYi9leGFtcGxlcy9tYW5hZ2VkLWNsaWVudC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9tYW5hZ2VkY2xpZW50L015QXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzhjY2M2Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvbWFuYWdlZC1jbGllbnQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvbWFuYWdlZGNsaWVudC9NeUFwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5tYW5hZ2VkY2xpZW50OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKKy8qKgorICogSmVyc2V5IG1hbmFnZWQgY2xpZW50IGV4YW1wbGUgYXBwbGljYXRpb24uCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIE15QXBwbGljYXRpb24gZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgSkFYLVJTIGFwcGxpY2F0aW9uIGZvciB0aGUgZXhhbXBsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTXlBcHBsaWNhdGlvbigpIHsKKyAgICAgICAgc3VwZXIoUHVibGljUmVzb3VyY2UuY2xhc3MsIEludGVybmFsUmVzb3VyY2UuY2xhc3MsIEN1c3RvbUhlYWRlckZlYXR1cmUuY2xhc3MpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlDbGllbnRBQ29uZmlnIGV4dGVuZHMgQ2xpZW50Q29uZmlnIHsKKyAgICAgICAgcHVibGljIE15Q2xpZW50QUNvbmZpZygpIHsKKyAgICAgICAgICAgIHRoaXMucmVnaXN0ZXIobmV3IEN1c3RvbUhlYWRlckZpbHRlcigiY3VzdG9tLWhlYWRlciIsICJhIikpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUNsaWVudEJDb25maWcgZXh0ZW5kcyBDbGllbnRDb25maWcgeworICAgICAgICBwdWJsaWMgTXlDbGllbnRCQ29uZmlnKCkgeworICAgICAgICAgICAgdGhpcy5yZWdpc3RlcihuZXcgQ3VzdG9tSGVhZGVyRmlsdGVyKCJjdXN0b20taGVhZGVyIiwgImIiKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9tYW5hZ2VkLWNsaWVudC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9tYW5hZ2VkY2xpZW50L1B1YmxpY1Jlc291cmNlLmphdmEgYi9leGFtcGxlcy9tYW5hZ2VkLWNsaWVudC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9tYW5hZ2VkY2xpZW50L1B1YmxpY1Jlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc0NTRiYwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL21hbmFnZWQtY2xpZW50LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL21hbmFnZWRjbGllbnQvUHVibGljUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLm1hbmFnZWRjbGllbnQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuVXJpOworCisvKioKKyAqIEEgcmVzb3VyY2UgdGhhdCB1c2VzIG1hbmFnZWQgY2xpZW50cyB0byByZXRyaWV2ZSB2YWx1ZXMgb2YgaW50ZXJuYWwKKyAqIHJlc291cmNlcyAnQScgYW5kICdCJywgd2hpY2ggYXJlIHByb3RlY3RlZCBieSBhIHtAbGluayBDdXN0b21IZWFkZXJGaWx0ZXJ9CisgKiBhbmQgcmVxdWlyZSBhIHNwZWNpZmljIGN1c3RvbSBoZWFkZXIgaW4gYSByZXF1ZXN0IHRvIGJlIHNldCB0byBhIHNwZWNpZmljIHZhbHVlLgorICogPHA+CisgKiBQcm9wZXJseSBjb25maWd1cmVkIG1hbmFnZWQgY2xpZW50cyBoYXZlIGEge0Bjb2RlIEN1c3RvbUhlYWRlckZpbHRlcn0gaW5zdGFuY2UKKyAqIGNvbmZpZ3VyZWQgdG8gaW5zZXJ0IHRoZSB7QGxpbmsgQ3VzdG9tSGVhZGVyRmVhdHVyZS5SZXF1aXJlIHJlcXVpcmVkfSBjdXN0b20gaGVhZGVyCisgKiB3aXRoIGEgcHJvcGVyIHZhbHVlIGludG8gdGhlIG91dGdvaW5nIGNsaWVudCByZXF1ZXN0cy4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgicHVibGljIikKK3B1YmxpYyBjbGFzcyBQdWJsaWNSZXNvdXJjZSB7CisKKyAgICBAVXJpKCJhIikgQENsaWVudEEgLy8gcmVzb2x2ZXMgdG8gPGJhc2U+L2ludGVybmFsL2EKKyAgICBwcml2YXRlIFdlYlRhcmdldCB0YXJnZXRBOworCisgICAgQEdFVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgQFBhdGgoImEiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0QSgpIHsKKyAgICAgICAgcmV0dXJuIHRhcmdldEEucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9QTEFJTikuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgQFBhdGgoImIiKQorICAgIHB1YmxpYyBSZXNwb25zZSBnZXRUYXJnZXRCKEBVcmkoImludGVybmFsL2IiKSBAQ2xpZW50QiBXZWJUYXJnZXQgdGFyZ2V0QikgeworICAgICAgICByZXR1cm4gdGFyZ2V0Qi5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOKS5nZXQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9tYW5hZ2VkLWNsaWVudC13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL2V4YW1wbGVzL21hbmFnZWQtY2xpZW50LXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYzA2YjgKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9tYW5hZ2VkLWNsaWVudC13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDMyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjIuNSIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI+CisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMubWFuYWdlZGNsaWVudC5NeUFwcGxpY2F0aW9uPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC53cy5ycy5BcHBsaWNhdGlvbjwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5tYW5hZ2VkY2xpZW50Lk15QXBwbGljYXRpb248L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMubWFuYWdlZGNsaWVudC5DbGllbnRBLmJhc2VVcmk8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+aHR0cDovL2xvY2FsaG9zdDo4MDgwL21hbmFnZWQtY2xpZW50LXdlYmFwcC9pbnRlcm5hbDwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMubWFuYWdlZGNsaWVudC5NeUFwcGxpY2F0aW9uPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9tYW5hZ2VkLWNsaWVudC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9tYW5hZ2VkY2xpZW50L01hbmFnZWRDbGllbnRUZXN0LmphdmEgYi9leGFtcGxlcy9tYW5hZ2VkLWNsaWVudC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9tYW5hZ2VkY2xpZW50L01hbmFnZWRDbGllbnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRjM2FjZAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL21hbmFnZWQtY2xpZW50LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL21hbmFnZWRjbGllbnQvTWFuYWdlZENsaWVudFRlc3QuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLm1hbmFnZWRjbGllbnQ7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEplcnNleSBtYW5hZ2VkIGNsaWVudCBleGFtcGxlIHRlc3RzLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBNYW5hZ2VkQ2xpZW50VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgLy8gbXZuIHRlc3QgLURqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk9b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5pbm1lbW9yeS5Jbk1lbW9yeVRlc3RDb250YWluZXJGYWN0b3J5CisgICAgICAgIC8vIG12biB0ZXN0IC1EamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5mYWN0b3J5PW9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZ3JpenpseS5Hcml6emx5VGVzdENvbnRhaW5lckZhY3RvcnkKKyAgICAgICAgLy8gbXZuIHRlc3QgLURqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk9b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5qZGtodHRwLkpka0h0dHBTZXJ2ZXJUZXN0Q29udGFpbmVyRmFjdG9yeQorICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworICAgICAgICAvLyBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworCisgICAgICAgIGZpbmFsIE15QXBwbGljYXRpb24gYXBwID0gbmV3IE15QXBwbGljYXRpb24oKTsKKyAgICAgICAgLy8gb3ZlcnJpZGluZyBDbGllbnRBIGJhc2UgVXJpIHByb3BlcnR5IGZvciB0ZXN0IHB1cnBvc2VzCisgICAgICAgIGFwcC5wcm9wZXJ0eShDbGllbnRBLmNsYXNzLmdldE5hbWUoKSArICIuYmFzZVVyaSIsIFVyaUJ1aWxkZXIuZnJvbVVyaShnZXRCYXNlVXJpKCkpLnBhdGgoImludGVybmFsIikuYnVpbGQoKSk7CisgICAgICAgIHJldHVybiBhcHA7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFVSSSBnZXRCYXNlVXJpKCkgeworICAgICAgIHJldHVybiBVcmlCdWlsZGVyLmZyb21Vcmkoc3VwZXIuZ2V0QmFzZVVyaSgpKS5wYXRoKCJtYW5hZ2VkLWNsaWVudC13ZWJhcHAiKS5idWlsZCgpOworICAgIH0KKworLy8gICAgVW5jb21tZW50IHRvIHVzZSBHcml6emx5IGFzeW5jIGNsaWVudAorLy8gICAgQE92ZXJyaWRlCisvLyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNsaWVudENvbmZpZykgeworLy8gICAgICAgIGNsaWVudENvbmZpZy5jb25uZWN0b3IobmV3IEdyaXp6bHlDb25uZWN0b3IoY2xpZW50Q29uZmlnKSk7CisvLyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoYXQgYSBjb25uZWN0aW9uIHZpYSBtYW5hZ2VkIGNsaWVudHMgd29ya3MgcHJvcGVybHkuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpbiBjYXNlIG9mIHRlc3QgZmFpbHVyZS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYW5hZ2VkQ2xpZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCByZXNvdXJjZSA9IHRhcmdldCgpLnBhdGgoInB1YmxpYyIpLnBhdGgoIntuYW1lfSIpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZTsKKworICAgICAgICByZXNwb25zZSA9IHJlc291cmNlLnJlc29sdmVUZW1wbGF0ZSgibmFtZSIsICJhIikucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9QTEFJTikuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICByZXNwb25zZSA9IHJlc291cmNlLnJlc29sdmVUZW1wbGF0ZSgibmFtZSIsICJiIikucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9QTEFJTikuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9tYW5hZ2VkLWNsaWVudC9SRUFETUUuTUQgYi9leGFtcGxlcy9tYW5hZ2VkLWNsaWVudC9SRUFETUUuTUQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ5ZWViOQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL21hbmFnZWQtY2xpZW50L1JFQURNRS5NRApAQCAtMCwwICsxLDgxIEBACitbLy9dOiAjICIgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICIKK1svL106ICMgIiAiCitbLy9dOiAjICIgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlICIKK1svL106ICMgIiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCAiCitbLy9dOiAjICIgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLiAiCitbLy9dOiAjICIgIgorWy8vXTogIyAiIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UgIgorCitNYW5hZ2VkIENsaWVudCBFeGFtcGxlCis9PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgYSBzaW1wbGUgdXNhZ2Ugb2YgSmVyc2V5IE1hbmFnZWQgQ2xpZW50CitmZWF0dXJlLgorCitDb250ZW50cworLS0tLS0tLS0KKworVGhlIG1hcHBpbmcgb2YgdGhlIFVSSSBwYXRoIHNwYWNlIGlzIHByZXNlbnRlZCBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOgorCitVUkkgcGF0aCAgICAgICAgICAgIHwgUmVzb3VyY2UgY2xhc3MgICAgIHwgSFRUUCBtZXRob2RzCistLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0KKyoqXy9wdWJsaWMvYV8qKiAgICAgfCBQdWJsaWNSZXNvdXJjZSAgICAgfCBHRVQKKyoqXy9wdWJsaWMvYl8qKiAgICAgfCBQdWJsaWNSZXNvdXJjZSAgICAgfCBHRVQKKyoqXy9pbnRlcm5hbC9hXyoqICAgfCBJbnRlcm5hbFJlc291cmNlICAgfCBHRVQKKyoqXy9pbnRlcm5hbC9iXyoqICAgfCBJbnRlcm5hbFJlc291cmNlICAgfCBHRVQKKworSW4gdGhlIGV4YW1wbGUsIHRoZSByZXF1ZXN0cyB0byBhICpwdWJsaWMgcmVzb3VyY2UqIGRlcGxveWVkIG9uCitgL3B1YmxpYy9gIHBhdGggYXJlIGZvcndhcmRlZCB0byBhbiAqaW50ZXJuYWwgcmVzb3VyY2UqIChkZXBsb3llZCBvbgorYC9pbnRlcm5hbC9gIHBhdGgpIHVzaW5nIGluamVjdGVkCitbamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldF0oaHR0cHM6Ly9qYXgtcnMtc3BlYy5qYXZhLm5ldC9ub25hdi8yLjAvYXBpZG9jcy9qYXZheC93cy9ycy9jbGllbnQvV2ViVGFyZ2V0Lmh0bWwpCitpbnN0YW5jZXMgcHJvZHVjZWQgdXNpbmcgMiBzZXBhcmF0ZSBtYW5hZ2VkIGNsaWVudHMgZWFjaCBvZiB0aGUgbWFuYWdlZAorY2xpZW50cyB1c2luZyBpdCdzIG93biBjdXN0b20gY29uZmlndXJhdGlvbi4KKworQW4gYWNjZXNzIHRvIGludGVybmFsIHJlc291cmNlIG1ldGhvZHMgaXMgZ3VhcmRlZCBieSBhIGNvbnRhaW5lciByZXF1ZXN0CitmaWx0ZXIgKGBDdXN0b21IZWFkZXJGaWx0ZXJgKSB3aGljaCByZWplY3RzIGFueSByZXF1ZXN0IHRoYXQgZG9lcyBub3QKK2NvbnRhaW4gZXhwZWN0ZWQgY3VzdG9tIGhlYWRlciBzZXQgdG8gYW4gZXhwZWN0ZWQgdmFsdWUuIEluIHRoZSBleGFtcGxlLAordGhlIDIgbWFuYWdlZCBjbGllbnRzICh1c2VkIGJ5IGEgcHVibGljIHJlc291cmNlIHRvIGFjY2VzcyB0aGUgbWV0aG9kcworb24gdGhlIGludGVybmFsIHJlc291cmNlKSBhcmUgY29uZmlndXJlZCB3aXRoIGN1c3RvbSBjb25maWd1cmF0aW9ucywKK2VhY2ggY29udGFpbmluZyBhIHJlZ2lzdHJhdGlvbiBvZiBhIGN1c3RvbSBjbGllbnQgcmVxdWVzdCBmaWx0ZXIgdGhhdCBpcworaW5zdHJ1Y3RlZCB0byBhcHBlbmQgYSByZXF1aXJlZCBjdXN0b20gaGVhZGVyIGFuZCB2YWx1ZSB0byBldmVyeQorb3V0Z29pbmcgcmVxdWVzdC4gT25seSB3aXRoIG1hbmFnZWQgY2xpZW50IHN1cHBvcnQgd29ya2luZyBwcm9wZXJseSwgdGhlCitwdWJsaWMgcmVzb3VyY2UgaXMgYWJsZSB0byBzdWNjZXNzZnVsbHkgcmV0cmlldmUgZGF0YSBmcm9tIHRoZSBpbnRlcm5hbAorcmVzb3VyY2UuCisKK1J1bm5pbmcgdGhlIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworUnVuIHRoZSBleGFtcGxlIGFzIGZvbGxvd3M6CisKKz4gICAgIG12biBjbGVhbiBwYWNrYWdlIGV4ZWM6amF2YQorCitUaGlzIGRlcGxveXMgY3VycmVudCBleGFtcGxlIG9uIHRoZSBsb2NhbCBob3N0LiBZb3UgY2FuIHRoZW4gYWNjZXNzIFdBREwKK2Rlc2NyaXB0aW9uIG9mIHRoZSBkZXBsb3llZCBhcHBsaWNhdGlvbiBhdAorPGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9tYW5hZ2VkLWNsaWVudC13ZWJhcHAvYXBwbGljYXRpb24ud2FkbD4uCisKK1lvdSBjYW4gYWNjZXNzIHB1YmxpYyByZXNvdXJjZSBvZiB0aGlzIGFwcGxpY2F0aW9uIHVzaW5nIGN1cmw6CisKKz4gICAgIGN1cmwgLXYgLUggIkFjY2VwdDogdGV4dC9wbGFpbiIgaHR0cDovL2xvY2FsaG9zdDo4MDgwL21hbmFnZWQtY2xpZW50LXdlYmFwcC9wdWJsaWMvYQorCis+ICAgICBjdXJsIC12IC1IICJBY2NlcHQ6IHRleHQvcGxhaW4iIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9tYW5hZ2VkLWNsaWVudC13ZWJhcHAvcHVibGljL2IKKworSW4gdGhpcyBleGFtcGxlIHlvdSBzaG91bGQgc2VlIHRoZSByZXR1cm5lZCByZXNwb25zZSBtZXNzYWdlIGJvZHkKK2NvbnRhaW5zICJhIiBvciAiYiIgcmVzcGVjdGl2ZWx5IHVwb24gc3VjY2Vzc2Z1bCBpbnZvY2F0aW9uLgorCitZb3UgbWF5IGFsc28gdmVyaWZ5IHRoYXQgYWNjZXNzIHRvIGludGVybmFsIHJlc291cmNlIGlzIG5vdCBwb3NzaWJsZQord2l0aG91dCBpbmNsdWRpbmcgYSBwcm9wZXIgaGVhZGVyIGluIHRoZSByZXF1ZXN0LiBGaXJzdCB0cnkgdG8gYWNjZXNzCit0aGUgaW50ZXJuYWwgcmVzb3VyY2Ugd2l0aG91dCBhbnkgY3VzdG9tIGhlYWRlcjoKKworPiAgICAgY3VybCAtdiAtSCAiQWNjZXB0OiB0ZXh0L3BsYWluIiBodHRwOi8vbG9jYWxob3N0OjgwODAvbWFuYWdlZC1jbGllbnQtd2ViYXBwL2ludGVybmFsL2EKKworPiAgICAgY3VybCAtdiAtSCAiQWNjZXB0OiB0ZXh0L3BsYWluIiBodHRwOi8vbG9jYWxob3N0OjgwODAvbWFuYWdlZC1jbGllbnQtd2ViYXBwL2ludGVybmFsL2IKKworSW4gYm90aCBjYXNlcyBhIGBIVFRQIDQwMyBGb3JiaWRkZW4uYCByZXNwb25zZSBpcyByZXR1cm5lZC4gTm93IGxldHMgdHJ5Cit0byBhY2Nlc3MgdGhlIHJlc291cmNlIG9uY2UgYWdhaW4sIGJ1dCB0aGlzIHRpbWUgd2UnbGwgaW5jbHVkZSBhbHNvIHRoZQorZXhwZWN0ZWQgY3VzdG9tIGhlYWRlcnM6CisKKz4gICAgIGN1cmwgLXYgLUggIkFjY2VwdDogdGV4dC9wbGFpbiIgLUggImN1c3RvbS1oZWFkZXI6YSIgaHR0cDovL2xvY2FsaG9zdDo4MDgwL21hbmFnZWQtY2xpZW50LXdlYmFwcC9pbnRlcm5hbC9hCisKKz4gICAgIGN1cmwgLXYgLUggIkFjY2VwdDogdGV4dC9wbGFpbiIgLUggImN1c3RvbS1oZWFkZXI6YiIgaHR0cDovL2xvY2FsaG9zdDo4MDgwL21hbmFnZWQtY2xpZW50LXdlYmFwcC9pbnRlcm5hbC9iCisKK0ZpbmFsbHksIHlvdSBzaG91bGQgc2VlIHRoZSBpbnZvY2F0aW9uIHN1Y2NlZWRlZCBhbmQgdGhlIHJldHVybmVkIHJlc3BvbnNlIG1lc3NhZ2UgYm9keSBjb250YWlucyAiYSIgb3IgImIiIHJlc3BlY3RpdmVseS4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL21hbmFnZWQtY2xpZW50L3BvbS54bWwgYi9leGFtcGxlcy9tYW5hZ2VkLWNsaWVudC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkOTIyZDQKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9tYW5hZ2VkLWNsaWVudC9wb20ueG1sCkBAIC0wLDAgKzEsNzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5tYW5hZ2VkLWNsaWVudDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS1leGFtcGxlcy1tYW5hZ2VkLWNsaWVudDwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgbWFuYWdlZCBjbGllbnQgZXhhbXBsZS48L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1ncml6emx5Mi1odHRwPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWhrMjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1idW5kbGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dHlwZT5wb208L3R5cGU+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPCEtLSB1bmNvbW1lbnQgdG8gdXNlIEdyaXp6bHkgY2xpZW50IC0tPgorICAgICAgICA8IS0tZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbm5lY3RvcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktZ3JpenpseS1jb25uZWN0b3I8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeS0tPgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhlYy1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxtYWluQ2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMubWFuYWdlZGNsaWVudC5BcHA8L21haW5DbGFzcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnJlbGVhc2U8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL21hbmFnZWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvbWFuYWdlZGNsaWVudC9BcHAuamF2YSBiL2V4YW1wbGVzL21hbmFnZWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvbWFuYWdlZGNsaWVudC9BcHAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzIzZTZkCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvbWFuYWdlZC1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9tYW5hZ2VkY2xpZW50L0FwcC5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMubWFuYWdlZGNsaWVudDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseTIuaHR0cHNlcnZlci5Hcml6emx5SHR0cFNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5ncml6emx5Lmh0dHAuc2VydmVyLkh0dHBTZXJ2ZXI7CisKKy8qKgorICogSmVyc2V5IHByb2dyYW1tYXRpYyBtYW5hZ2VkIGNsaWVudCBleGFtcGxlIGFwcGxpY2F0aW9uLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBBcHAgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIEJBU0VfVVJJID0gVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL21hbmFnZWRjbGllbnQvIik7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlwiTWFuYWdlZCBDbGllbnRcIiBKZXJzZXkgRXhhbXBsZSBBcHAiKTsKKworICAgICAgICAgICAgZmluYWwgSHR0cFNlcnZlciBzZXJ2ZXIgPSBHcml6emx5SHR0cFNlcnZlckZhY3RvcnkuY3JlYXRlSHR0cFNlcnZlcihCQVNFX1VSSSwgY3JlYXRlKCksIGZhbHNlKTsKKyAgICAgICAgICAgIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmFkZFNodXRkb3duSG9vayhuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHNlcnZlci5zaHV0ZG93bk5vdygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pKTsKKyAgICAgICAgICAgIHNlcnZlci5zdGFydCgpOworCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oU3RyaW5nLmZvcm1hdCgiQXBwbGljYXRpb24gc3RhcnRlZC5cblRyeSBvdXQgcHVibGljIGVuZHBvaW50czpcbiAgJXMlc1xuICAlcyVzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiU3RvcCB0aGUgYXBwbGljYXRpb24gdXNpbmcgQ1RSTCtDIiwKKyAgICAgICAgICAgICAgICAgICAgQkFTRV9VUkksICJwdWJsaWMvYSIsCisgICAgICAgICAgICAgICAgICAgIEJBU0VfVVJJLCAicHVibGljL2IiKSk7CisKKyAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuam9pbigpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiB8IEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKEFwcC5jbGFzcy5nZXROYW1lKCkpLmxvZyhMZXZlbC5TRVZFUkUsIG51bGwsIGV4KTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIEpBWC1SUyBhcHBsaWNhdGlvbiBmb3IgdGhlIGV4YW1wbGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGNyZWF0ZSBKQVgtUlMgYXBwbGljYXRpb24gZm9yIHRoZSBleGFtcGxlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VDb25maWcgY3JlYXRlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFB1YmxpY1Jlc291cmNlLmNsYXNzLCBJbnRlcm5hbFJlc291cmNlLmNsYXNzLCBDdXN0b21IZWFkZXJGZWF0dXJlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShDbGllbnRBLmNsYXNzLmdldE5hbWUoKSArICIuYmFzZVVyaSIsIEJBU0VfVVJJLnRvU3RyaW5nKCkgKyAiaW50ZXJuYWwiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15Q2xpZW50QUNvbmZpZyBleHRlbmRzIENsaWVudENvbmZpZyB7CisKKyAgICAgICAgcHVibGljIE15Q2xpZW50QUNvbmZpZygpIHsKKyAgICAgICAgICAgIHRoaXMucmVnaXN0ZXIobmV3IEN1c3RvbUhlYWRlckZpbHRlcigiY3VzdG9tLWhlYWRlciIsICJhIikpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUNsaWVudEJDb25maWcgZXh0ZW5kcyBDbGllbnRDb25maWcgeworCisgICAgICAgIHB1YmxpYyBNeUNsaWVudEJDb25maWcoKSB7CisgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyKG5ldyBDdXN0b21IZWFkZXJGaWx0ZXIoImN1c3RvbS1oZWFkZXIiLCAiYiIpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL21hbmFnZWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvbWFuYWdlZGNsaWVudC9DbGllbnRBLmphdmEgYi9leGFtcGxlcy9tYW5hZ2VkLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL21hbmFnZWRjbGllbnQvQ2xpZW50QS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2N2RkMWUKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9tYW5hZ2VkLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL21hbmFnZWRjbGllbnQvQ2xpZW50QS5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMubWFuYWdlZGNsaWVudDsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ2xpZW50QmluZGluZzsKKworLyoqCisgKiBNYW5hZ2VkIGNsaWVudCBjb25maWd1cmF0aW9uIGZvciBjbGllbnQgQS4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitAQ2xpZW50QmluZGluZyhjb25maWdDbGFzcyA9IEFwcC5NeUNsaWVudEFDb25maWcuY2xhc3MpCitARG9jdW1lbnRlZAorQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BUYXJnZXQoe0VsZW1lbnRUeXBlLkZJRUxELCBFbGVtZW50VHlwZS5QQVJBTUVURVJ9KQorcHVibGljIEBpbnRlcmZhY2UgQ2xpZW50QSB7Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9tYW5hZ2VkLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL21hbmFnZWRjbGllbnQvQ2xpZW50Qi5qYXZhIGIvZXhhbXBsZXMvbWFuYWdlZC1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9tYW5hZ2VkY2xpZW50L0NsaWVudEIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODEzZGY5Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvbWFuYWdlZC1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9tYW5hZ2VkY2xpZW50L0NsaWVudEIuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLm1hbmFnZWRjbGllbnQ7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNsaWVudEJpbmRpbmc7CisKKy8qKgorICogTWFuYWdlZCBjbGllbnQgY29uZmlndXJhdGlvbiBmb3IgY2xpZW50IEIuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQENsaWVudEJpbmRpbmcoY29uZmlnQ2xhc3MgPSBBcHAuTXlDbGllbnRCQ29uZmlnLmNsYXNzKQorQERvY3VtZW50ZWQKK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitAVGFyZ2V0KHtFbGVtZW50VHlwZS5GSUVMRCwgRWxlbWVudFR5cGUuUEFSQU1FVEVSfSkKK3B1YmxpYyBAaW50ZXJmYWNlIENsaWVudEIgeworfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvbWFuYWdlZC1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9tYW5hZ2VkY2xpZW50L0N1c3RvbUhlYWRlckZlYXR1cmUuamF2YSBiL2V4YW1wbGVzL21hbmFnZWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvbWFuYWdlZGNsaWVudC9DdXN0b21IZWFkZXJGZWF0dXJlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MyNDlhMQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL21hbmFnZWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvbWFuYWdlZGNsaWVudC9DdXN0b21IZWFkZXJGZWF0dXJlLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5tYW5hZ2VkY2xpZW50OworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5EeW5hbWljRmVhdHVyZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuUmVzb3VyY2VJbmZvOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CisKKy8qKgorICpEeW5hbWljIGZlYXR1cmUgdGhhdCBhcHBlbmRzIGEgcHJvcGVybHkgY29uZmlndXJlZCB7QGxpbmsgQ3VzdG9tSGVhZGVyRmlsdGVyfSBpbnN0YW5jZQorICogdG8gZXZlcnkgbWV0aG9kIHRoYXQgaXMgYW5ub3RhdGVkIHdpdGgge0BsaW5rIFJlcXVpcmUgJiM2NDtSZXF1aXJlfSBpbnRlcm5hbCBmZWF0dXJlCisgKiBhbm5vdGF0aW9uLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBDdXN0b21IZWFkZXJGZWF0dXJlIGltcGxlbWVudHMgRHluYW1pY0ZlYXR1cmUgeworCisgICAgLyoqCisgICAgICogQSBtZXRob2QgYW5ub3RhdGlvbiB0byBiZSBwbGFjZWQgb24gdGhvc2UgcmVzb3VyY2UgbWV0aG9kcyB0byB3aGljaCBhIHZhbGlkYXRpbmcKKyAgICAgKiB7QGxpbmsgQ3VzdG9tSGVhZGVyRmlsdGVyfSBpbnN0YW5jZSBzaG91bGQgYmUgYWRkZWQuCisgICAgICovCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgICBARG9jdW1lbnRlZAorICAgIEBUYXJnZXQoRWxlbWVudFR5cGUuTUVUSE9EKQorICAgIHB1YmxpYyBzdGF0aWMgQGludGVyZmFjZSBSZXF1aXJlIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEV4cGVjdGVkIGN1c3RvbSBoZWFkZXIgbmFtZSB0byBiZSB2YWxpZGF0ZWQgYnkgdGhlIHtAbGluayBDdXN0b21IZWFkZXJGaWx0ZXJ9LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBoZWFkZXJOYW1lKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEV4cGVjdGVkIGN1c3RvbSBoZWFkZXIgdmFsdWUgdG8gYmUgdmFsaWRhdGVkIGJ5IHRoZSB7QGxpbmsgQ3VzdG9tSGVhZGVyRmlsdGVyfS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgaGVhZGVyVmFsdWUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoUmVzb3VyY2VJbmZvIHJlc291cmNlSW5mbywgRmVhdHVyZUNvbnRleHQgY29udGV4dCkgeworICAgICAgICBmaW5hbCBSZXF1aXJlIHZhID0gcmVzb3VyY2VJbmZvLmdldFJlc291cmNlTWV0aG9kKCkuZ2V0QW5ub3RhdGlvbihSZXF1aXJlLmNsYXNzKTsKKyAgICAgICAgaWYgKHZhICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIobmV3IEN1c3RvbUhlYWRlckZpbHRlcih2YS5oZWFkZXJOYW1lKCksIHZhLmhlYWRlclZhbHVlKCkpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL21hbmFnZWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvbWFuYWdlZGNsaWVudC9DdXN0b21IZWFkZXJGaWx0ZXIuamF2YSBiL2V4YW1wbGVzL21hbmFnZWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvbWFuYWdlZGNsaWVudC9DdXN0b21IZWFkZXJGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTA0MTRiCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvbWFuYWdlZC1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9tYW5hZ2VkY2xpZW50L0N1c3RvbUhlYWRlckZpbHRlci5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMubWFuYWdlZGNsaWVudDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKKy8qKgorICogQSBmaWx0ZXIgZm9yIGFwcGVuZGluZyBhbmQgdmFsaWRhdGluZyBjdXN0b20gaGVhZGVycy4KKyAqIDxwPgorICogT24gdGhlIGNsaWVudCBzaWRlLCBhcHBlbmRzIGEgbmV3IGN1c3RvbSByZXF1ZXN0IGhlYWRlciB3aXRoIGEgY29uZmlndXJlZCBuYW1lIGFuZCB2YWx1ZSB0byBlYWNoIG91dGdvaW5nIHJlcXVlc3QuCisgKiA8L3A+CisgKiA8cD4KKyAqIE9uIHRoZSBzZXJ2ZXIgc2lkZSwgdmFsaWRhdGVzIHRoYXQgZWFjaCByZXF1ZXN0IGhhcyBhIGN1c3RvbSBoZWFkZXIgd2l0aCBhIGNvbmZpZ3VyZWQgbmFtZSBhbmQgdmFsdWUuCisgKiBJZiB0aGUgdmFsaWRhdGlvbiBmYWlscyBhIEhUVFAgNDAzIHJlc3BvbnNlIGlzIHJldHVybmVkLgorICogPC9wPgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBDdXN0b21IZWFkZXJGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyLCBDbGllbnRSZXF1ZXN0RmlsdGVyIHsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBoZWFkZXJOYW1lOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGhlYWRlclZhbHVlOworCisgICAgcHVibGljIEN1c3RvbUhlYWRlckZpbHRlcihTdHJpbmcgaGVhZGVyTmFtZSwgU3RyaW5nIGhlYWRlclZhbHVlKSB7CisgICAgICAgIGlmIChoZWFkZXJOYW1lID09IG51bGwgfHwgaGVhZGVyVmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSGVhZGVyIG5hbWUgYW5kIHZhbHVlIG11c3Qgbm90IGJlIG51bGwuIik7CisgICAgICAgIH0KKyAgICAgICAgdGhpcy5oZWFkZXJOYW1lID0gaGVhZGVyTmFtZTsKKyAgICAgICAgdGhpcy5oZWFkZXJWYWx1ZSA9IGhlYWRlclZhbHVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCBjdHgpIHRocm93cyBJT0V4Y2VwdGlvbiB7IC8vIHZhbGlkYXRlCisgICAgICAgIGlmICghaGVhZGVyVmFsdWUuZXF1YWxzKGN0eC5nZXRIZWFkZXJTdHJpbmcoaGVhZGVyTmFtZSkpKSB7CisgICAgICAgICAgICBjdHguYWJvcnRXaXRoKFJlc3BvbnNlLnN0YXR1cyhSZXNwb25zZS5TdGF0dXMuRk9SQklEREVOKQorICAgICAgICAgICAgICAgICAgICAudHlwZShNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICAgICAgICAgICAgICAgICAgLmVudGl0eShTdHJpbmcuZm9ybWF0KCJFeHBlY3RlZCBoZWFkZXIgJyVzJyBub3QgcHJlc2VudCBvciB2YWx1ZSBub3QgZXF1YWwgdG8gJyVzJyIsIGhlYWRlck5hbWUsIGhlYWRlclZhbHVlKSkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZmlsdGVyKENsaWVudFJlcXVlc3RDb250ZXh0IGN0eCkgdGhyb3dzIElPRXhjZXB0aW9uIHsgLy8gYXBwZW5kCisgICAgICAgIGN0eC5nZXRIZWFkZXJzKCkucHV0U2luZ2xlKGhlYWRlck5hbWUsIGhlYWRlclZhbHVlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9tYW5hZ2VkLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL21hbmFnZWRjbGllbnQvSW50ZXJuYWxSZXNvdXJjZS5qYXZhIGIvZXhhbXBsZXMvbWFuYWdlZC1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9tYW5hZ2VkY2xpZW50L0ludGVybmFsUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzE1MTI5Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvbWFuYWdlZC1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9tYW5hZ2VkY2xpZW50L0ludGVybmFsUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLm1hbmFnZWRjbGllbnQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworLyoqCisgKiBJbnRlcm5hbCByZXNvdXJjZSBhY2Nlc3NlZCBmcm9tIHRoZSBtYW5hZ2VkIGNsaWVudCByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiaW50ZXJuYWwiKQorcHVibGljIGNsYXNzIEludGVybmFsUmVzb3VyY2UgeworCisgICAgQEdFVAorICAgIEBQYXRoKCJhIikKKyAgICBAQ3VzdG9tSGVhZGVyRmVhdHVyZS5SZXF1aXJlKGhlYWRlck5hbWUgPSAiY3VzdG9tLWhlYWRlciIsIGhlYWRlclZhbHVlID0gImEiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QSgpIHsKKyAgICAgICAgcmV0dXJuICJhIjsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImIiKQorICAgIEBDdXN0b21IZWFkZXJGZWF0dXJlLlJlcXVpcmUoaGVhZGVyTmFtZSA9ICJjdXN0b20taGVhZGVyIiwgaGVhZGVyVmFsdWUgPSAiYiIpCisgICAgcHVibGljIFN0cmluZyBnZXRCKCkgeworICAgICAgICByZXR1cm4gImIiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL21hbmFnZWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvbWFuYWdlZGNsaWVudC9QdWJsaWNSZXNvdXJjZS5qYXZhIGIvZXhhbXBsZXMvbWFuYWdlZC1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9tYW5hZ2VkY2xpZW50L1B1YmxpY1Jlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM0MGMxNgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL21hbmFnZWQtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvbWFuYWdlZGNsaWVudC9QdWJsaWNSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMubWFuYWdlZGNsaWVudDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Vcmk7CisKKy8qKgorICogQSByZXNvdXJjZSB0aGF0IHVzZXMgbWFuYWdlZCBjbGllbnRzIHRvIHJldHJpZXZlIHZhbHVlcyBvZiBpbnRlcm5hbAorICogcmVzb3VyY2VzICdBJyBhbmQgJ0InLCB3aGljaCBhcmUgcHJvdGVjdGVkIGJ5IGEge0BsaW5rIEN1c3RvbUhlYWRlckZpbHRlcn0KKyAqIGFuZCByZXF1aXJlIGEgc3BlY2lmaWMgY3VzdG9tIGhlYWRlciBpbiBhIHJlcXVlc3QgdG8gYmUgc2V0IHRvIGEgc3BlY2lmaWMgdmFsdWUuCisgKiA8cD4KKyAqIFByb3Blcmx5IGNvbmZpZ3VyZWQgbWFuYWdlZCBjbGllbnRzIGhhdmUgYSB7QGNvZGUgQ3VzdG9tSGVhZGVyRmlsdGVyfSBpbnN0YW5jZQorICogY29uZmlndXJlZCB0byBpbnNlcnQgdGhlIHtAbGluayBDdXN0b21IZWFkZXJGZWF0dXJlLlJlcXVpcmUgcmVxdWlyZWR9IGN1c3RvbSBoZWFkZXIKKyAqIHdpdGggYSBwcm9wZXIgdmFsdWUgaW50byB0aGUgb3V0Z29pbmcgY2xpZW50IHJlcXVlc3RzLgorICogPC9wPgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJwdWJsaWMiKQorcHVibGljIGNsYXNzIFB1YmxpY1Jlc291cmNlIHsKKyAgICBAVXJpKCJhIikgQENsaWVudEEgLy8gcmVzb2x2ZXMgdG8gPGJhc2U+L2ludGVybmFsL2EKKyAgICBwcml2YXRlIFdlYlRhcmdldCB0YXJnZXRBOworCisgICAgQEdFVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgQFBhdGgoImEiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGFyZ2V0QSgpIHsKKyAgICAgICAgcmV0dXJuIHRhcmdldEEucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9QTEFJTikuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgQFBhdGgoImIiKQorICAgIHB1YmxpYyBSZXNwb25zZSBnZXRUYXJnZXRCKEBVcmkoImludGVybmFsL2IiKSBAQ2xpZW50QiBXZWJUYXJnZXQgdGFyZ2V0QikgeworICAgICAgICByZXR1cm4gdGFyZ2V0Qi5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOKS5nZXQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9tYW5hZ2VkLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL21hbmFnZWRjbGllbnQvTWFuYWdlZENsaWVudFRlc3QuamF2YSBiL2V4YW1wbGVzL21hbmFnZWQtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvbWFuYWdlZGNsaWVudC9NYW5hZ2VkQ2xpZW50VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NmFlZGQKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9tYW5hZ2VkLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL21hbmFnZWRjbGllbnQvTWFuYWdlZENsaWVudFRlc3QuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLm1hbmFnZWRjbGllbnQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogSmVyc2V5IG1hbmFnZWQgY2xpZW50IGV4YW1wbGUgdGVzdHMuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIE1hbmFnZWRDbGllbnRUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICAvLyBtdm4gdGVzdCAtRGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIuZmFjdG9yeT1vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmlubWVtb3J5LkluTWVtb3J5VGVzdENvbnRhaW5lckZhY3RvcnkKKyAgICAgICAgLy8gbXZuIHRlc3QgLURqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk9b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5ncml6emx5LkdyaXp6bHlUZXN0Q29udGFpbmVyRmFjdG9yeQorICAgICAgICAvLyBtdm4gdGVzdCAtRGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIuZmFjdG9yeT1vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0Lmpka2h0dHAuSmRrSHR0cFNlcnZlclRlc3RDb250YWluZXJGYWN0b3J5CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisgICAgICAgIC8vIGVuYWJsZShUZXN0UHJvcGVydGllcy5EVU1QX0VOVElUWSk7CisKKyAgICAgICAgLy8gb3ZlcnJpZGluZyBDbGllbnRBIGJhc2UgVXJpIHByb3BlcnR5IGZvciB0ZXN0IHB1cnBvc2VzCisgICAgICAgIHJldHVybiBBcHAuY3JlYXRlKCkucHJvcGVydHkoQ2xpZW50QS5jbGFzcy5nZXROYW1lKCkgKyAiLmJhc2VVcmkiLCB0aGlzLmdldEJhc2VVcmkoKS50b1N0cmluZygpICsgImludGVybmFsIik7CisgICAgfQorCisvLyAgICBVbmNvbW1lbnQgdG8gdXNlIEdyaXp6bHkgYXN5bmMgY2xpZW50CisvLyAgICBAT3ZlcnJpZGUKKy8vICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY2xpZW50Q29uZmlnKSB7CisvLyAgICAgICAgY2xpZW50Q29uZmlnLmNvbm5lY3RvcihuZXcgR3JpenpseUNvbm5lY3RvcihjbGllbnRDb25maWcpKTsKKy8vICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCBhIGNvbm5lY3Rpb24gdmlhIG1hbmFnZWQgY2xpZW50cyB3b3JrcyBwcm9wZXJseS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGluIGNhc2Ugb2YgdGVzdCBmYWlsdXJlLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hbmFnZWRDbGllbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHJlc291cmNlID0gdGFyZ2V0KCkucGF0aCgicHVibGljIikucGF0aCgie25hbWV9Iik7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlOworCisgICAgICAgIHJlc3BvbnNlID0gcmVzb3VyY2UucmVzb2x2ZVRlbXBsYXRlKCJuYW1lIiwgImEiKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworCisgICAgICAgIHJlc3BvbnNlID0gcmVzb3VyY2UucmVzb2x2ZVRlbXBsYXRlKCJuYW1lIiwgImIiKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImIiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL211bHRpcGFydC13ZWJhcHAvUkVBRE1FLk1EIGIvZXhhbXBsZXMvbXVsdGlwYXJ0LXdlYmFwcC9SRUFETUUuTUQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU2YzA1YgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL211bHRpcGFydC13ZWJhcHAvUkVBRE1FLk1ECkBAIC0wLDAgKzEsMzUgQEAKK1svL106ICMgIiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIgorWy8vXTogIyAiICIKK1svL106ICMgIiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgIgorWy8vXTogIyAiIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0ICIKK1svL106ICMgIiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuICIKK1svL106ICMgIiAiCitbLy9dOiAjICIgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZSAiCisKK011bHRpcGFydCBXZWIgYXBwIEV4YW1wbGUKKz09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gZGV2ZWxvcCBSRVNUZnVsIHdlYiBzZXJ2aWNlIHdpdGgKK2RlbW9uc3RyYXRpbmcgSkFYLVJTIEludGVncmF0aW9uIHdpdGggTUlNRSBNdWx0aVBhcnQgTWVzc2FnZSBGb3JtYXRzIGFuZAorYW4gRUUgNiBjb21wbGlhbnQgV2ViIGNvbnRhaW5lci4KKworQ29udGVudHMKKy0tLS0tLS0tCisKK1RoZSBtYXBwaW5nIG9mIHRoZSBVUkkgcGF0aCBzcGFjZSBpcyBwcmVzZW50ZWQgaW4gdGhlIGZvbGxvd2luZyB0YWJsZToKKworVVJJIHBhdGggICAgICAgICAgICAgICAgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTYW1wbGUgcmVxdWVzdCB1c2luZyBjdXJsCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKl8vZm9ybS9wYXJ0XyoqICAgICAgICAgICAgIHwgUE9TVCBtZXNzYWdlIHJldHVybmluZyBlbnRpcmUgc3RyaW5nICAgICAgICAgICB8IGBjdXJsIC1YIFBPU1QgLUYgInBhcnQ9cGFydDEiICBodHRwOi8vbG9jYWxob3N0OjgwODAvbXVsdGlwYXJ0LXdlYmFwcC9mb3JtL3BhcnRgCisqKl8vZm9ybS9wYXJ0LWZpbGUtbmFtZV8qKiAgIHwgUE9TVCBtZXNzYWdlIHJldHVybmluZyBwYXJ0IGZpbGVuYW1lIHN0cmluZy4gICB8IEJlIHN1cmUgdG8gZXhlY3V0ZSB0aGlzIGN1cmwgZnJvbSBwcm9qZWN0IGRpcmVjdG9yeSB3aGVyZSBwb20ueG1sIHJlc2lkZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYGN1cmwgLVggUE9TVCAtRiAicGFydD1AcG9tLnhtbCIgIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9tdWx0aXBhcnQtd2ViYXBwL2Zvcm0vcGFydC1maWxlLW5hbWVgCisqKl8vZm9ybS94bWwtamF4Yi1wYXJ0XyoqICAgIHwgUE9TVCBtZXNzYWdlIHJldHVybmluZyB4bWwgamF4YiBwYXJ0IHN0cmluZy4gICB8IE5vIGN1cmwgc2FtcGxlIGF2YWlsYWJsZSwgcGxlYXNlIGNoZWNrIHRlc3Qgc291cmNlcy4KKworUnVubmluZyB0aGUgRXhhbXBsZQorLS0tLS0tLS0tLS0tLS0tLS0tLQorCitZb3UgY2FuIHJ1biB0aGUgZXhhbXBsZSB1c2luZyBKZXR0eSBhcyBmb2xsb3dzOgorCis+IGBtdm4gY2xlYW4gcGFja2FnZSBqZXR0eTpydW5gCisKK0ZvbGxvd2luZyBzdGVwcyBhcmUgdXNpbmcgW2NVUkxdKGh0dHA6Ly9jdXJsLmhheHguc2UvKSBjb21tYW5kIGxpbmUgdG9vbDoKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9leGFtcGxlcy9tdWx0aXBhcnQtd2ViYXBwL3BvbS54bWwgYi9leGFtcGxlcy9tdWx0aXBhcnQtd2ViYXBwL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRhMjA1NwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL211bHRpcGFydC13ZWJhcHAvcG9tLnhtbApAQCAtMCwwICsxLDY5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorCisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPndlYmFwcC1leGFtcGxlLXBhcmVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi93ZWJhcHAtZXhhbXBsZS1wYXJlbnQvcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+bXVsdGlwYXJ0LXdlYmFwcDwvYXJ0aWZhY3RJZD4KKyAgICA8bmFtZT5qZXJzZXktZXhhbXBsZXMtbXVsdGlwYXJ0LXdlYmFwcDwvbmFtZT4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorCisgICAgPGRlc2NyaXB0aW9uPkplcnNleSBNdWx0aXBhcnQgZXhhbXBsZS48L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1tdWx0aXBhcnQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktaGsyPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qZXR0eS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnJlbGVhc2U8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD54bWwtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL211bHRpcGFydC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9tdWx0aXBhcnQvd2ViYXBwL0JlYW4uamF2YSBiL2V4YW1wbGVzL211bHRpcGFydC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9tdWx0aXBhcnQvd2ViYXBwL0JlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzU5Y2Q1Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvbXVsdGlwYXJ0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL211bHRpcGFydC93ZWJhcHAvQmVhbi5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMubXVsdGlwYXJ0LndlYmFwcDsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKK0BYbWxSb290RWxlbWVudAorcHVibGljIGNsYXNzIEJlYW4geworCisgICAgcHVibGljIFN0cmluZyB2YWx1ZTsKKworICAgIHB1YmxpYyBCZWFuKCkgeworICAgIH0KKworICAgIHB1YmxpYyBCZWFuKFN0cmluZyBzdHIpIHsKKyAgICAgICAgdmFsdWUgPSBzdHI7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9tdWx0aXBhcnQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvbXVsdGlwYXJ0L3dlYmFwcC9NdWx0aVBhcnRGaWVsZEluamVjdGVkUmVzb3VyY2UuamF2YSBiL2V4YW1wbGVzL211bHRpcGFydC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9tdWx0aXBhcnQvd2ViYXBwL011bHRpUGFydEZpZWxkSW5qZWN0ZWRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZGJhM2YKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9tdWx0aXBhcnQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvbXVsdGlwYXJ0L3dlYmFwcC9NdWx0aVBhcnRGaWVsZEluamVjdGVkUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLm11bHRpcGFydC53ZWJhcHA7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LkZvcm1EYXRhUGFyYW07CisKKy8qKgorICogRmllbGQtaW5qZWN0ZWQgdmVyc2lvbiBvZiB0aGUge0BsaW5rIEZvcm1EYXRhUGFyYW19IGluamVjdGlvbiB0ZXN0aW5nIHJlc291cmNlLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCIvZm9ybS1maWVsZC1pbmplY3RlZCIpCitwdWJsaWMgY2xhc3MgTXVsdGlQYXJ0RmllbGRJbmplY3RlZFJlc291cmNlIHsKKyAgICBARm9ybURhdGFQYXJhbSgic3RyaW5nIikgcHJpdmF0ZSBTdHJpbmcgczsKKyAgICBARm9ybURhdGFQYXJhbSgic3RyaW5nIikgcHJpdmF0ZSBGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbiBzZDsKKyAgICBARm9ybURhdGFQYXJhbSgiYmVhbiIpIHByaXZhdGUgQmVhbiBiOworICAgIEBGb3JtRGF0YVBhcmFtKCJiZWFuIikgcHJpdmF0ZSBGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbiBiZDsKKworICAgIEBQT1NUCisgICAgQFBhdGgoInhtbC1qYXhiLXBhcnQiKQorICAgIEBDb25zdW1lcyhNZWRpYVR5cGUuTVVMVElQQVJUX0ZPUk1fREFUQSkKKyAgICBwdWJsaWMgU3RyaW5nIHBvc3QoKSB7CisgICAgICAgIHJldHVybiBzICsgIjoiICsgc2QuZ2V0RmlsZU5hbWUoKSArICIsIiArIGIudmFsdWUgKyAiOiIgKyBiZC5nZXRGaWxlTmFtZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL211bHRpcGFydC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9tdWx0aXBhcnQvd2ViYXBwL011bHRpUGFydFJlc291cmNlLmphdmEgYi9leGFtcGxlcy9tdWx0aXBhcnQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvbXVsdGlwYXJ0L3dlYmFwcC9NdWx0aVBhcnRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNzM5NTYKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9tdWx0aXBhcnQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvbXVsdGlwYXJ0L3dlYmFwcC9NdWx0aVBhcnRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMubXVsdGlwYXJ0LndlYmFwcDsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5Gb3JtRGF0YVBhcmFtOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5Gb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbjsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFBhdGgoIi9mb3JtIikKK3B1YmxpYyBjbGFzcyBNdWx0aVBhcnRSZXNvdXJjZSB7CisKKyAgICBAUE9TVAorICAgIEBQYXRoKCJwYXJ0IikKKyAgICBAQ29uc3VtZXMoTWVkaWFUeXBlLk1VTFRJUEFSVF9GT1JNX0RBVEEpCisgICAgcHVibGljIFN0cmluZyBwb3N0KEBGb3JtRGF0YVBhcmFtKCJwYXJ0IikgU3RyaW5nIHMpIHsKKyAgICAgICAgcmV0dXJuIHM7CisgICAgfQorCisgICAgQFBPU1QKKyAgICBAUGF0aCgicGFydC1maWxlLW5hbWUiKQorICAgIEBDb25zdW1lcyhNZWRpYVR5cGUuTVVMVElQQVJUX0ZPUk1fREFUQSkKKyAgICBwdWJsaWMgU3RyaW5nIHBvc3QoCisgICAgICAgICAgICBARm9ybURhdGFQYXJhbSgicGFydCIpIFN0cmluZyBzLAorICAgICAgICAgICAgQEZvcm1EYXRhUGFyYW0oInBhcnQiKSBGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbiBkKSB7CisgICAgICAgIHJldHVybiBzICsgIjoiICsgZC5nZXRGaWxlTmFtZSgpOworICAgIH0KKworICAgIEBQT1NUCisgICAgQFBhdGgoInhtbC1qYXhiLXBhcnQiKQorICAgIEBDb25zdW1lcyhNZWRpYVR5cGUuTVVMVElQQVJUX0ZPUk1fREFUQSkKKyAgICBwdWJsaWMgU3RyaW5nIHBvc3QoCisgICAgICAgICAgICBARm9ybURhdGFQYXJhbSgic3RyaW5nIikgU3RyaW5nIHMsCisgICAgICAgICAgICBARm9ybURhdGFQYXJhbSgic3RyaW5nIikgRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24gc2QsCisgICAgICAgICAgICBARm9ybURhdGFQYXJhbSgiYmVhbiIpIEJlYW4gYiwKKyAgICAgICAgICAgIEBGb3JtRGF0YVBhcmFtKCJiZWFuIikgRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24gYmQpIHsKKyAgICAgICAgcmV0dXJuIHMgKyAiOiIgKyBzZC5nZXRGaWxlTmFtZSgpICsgIiwiICsgYi52YWx1ZSArICI6IiArIGJkLmdldEZpbGVOYW1lKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvbXVsdGlwYXJ0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL211bHRpcGFydC93ZWJhcHAvTXlBcHBsaWNhdGlvbi5qYXZhIGIvZXhhbXBsZXMvbXVsdGlwYXJ0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL211bHRpcGFydC93ZWJhcHAvTXlBcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMGRlMDUKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9tdWx0aXBhcnQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvbXVsdGlwYXJ0L3dlYmFwcC9NeUFwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5tdWx0aXBhcnQud2ViYXBwOworCitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0Lk11bHRpUGFydEZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAQXBwbGljYXRpb25QYXRoKCIvIikKK3B1YmxpYyBjbGFzcyBNeUFwcGxpY2F0aW9uIGV4dGVuZHMgUmVzb3VyY2VDb25maWcgeworCisgICAgcHVibGljIE15QXBwbGljYXRpb24oKSB7CisgICAgICAgIHN1cGVyKE11bHRpUGFydFJlc291cmNlLmNsYXNzLCBNdWx0aVBhcnRGaWVsZEluamVjdGVkUmVzb3VyY2UuY2xhc3MsIE11bHRpUGFydEZlYXR1cmUuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL211bHRpcGFydC13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL2V4YW1wbGVzL211bHRpcGFydC13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjAxZWVhCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvbXVsdGlwYXJ0LXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi41IgorICAgICAgICB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgorICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIj4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLm11bHRpcGFydC5yZXNvdXJjZXMuTXlBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMubXVsdGlwYXJ0LndlYmFwcC5NeUFwcGxpY2F0aW9uPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLm11bHRpcGFydC5yZXNvdXJjZXMuTXlBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9tdWx0aXBhcnQtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvbXVsdGlwYXJ0L3dlYmFwcC9NdWx0aVBhcnRXZWJBcHBUZXN0LmphdmEgYi9leGFtcGxlcy9tdWx0aXBhcnQtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvbXVsdGlwYXJ0L3dlYmFwcC9NdWx0aVBhcnRXZWJBcHBUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQwNzM5NgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL211bHRpcGFydC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9tdWx0aXBhcnQvd2ViYXBwL011bHRpUGFydFdlYkFwcFRlc3QuamF2YQpAQCAtMCwwICsxLDE0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5tdWx0aXBhcnQud2ViYXBwOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubmV0LlVSSTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoOworaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aENvbnN0YW50czsKK2ltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGhGYWN0b3J5OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlNheEhlbHBlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlNpbXBsZU5hbWVzcGFjZVJlc29sdmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5Gb3JtRGF0YUJvZHlQYXJ0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5Gb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuRm9ybURhdGFNdWx0aVBhcnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0Lk11bHRpUGFydEZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3RzIGZvciB7QGNvZGUgTXVsdGlwYXJ0UmVzb3VyY2V9IGNsYXNzLgorICoKKyAqIEBhdXRob3IgTmFyZXNoIChzcmluaXZhcy5iaGltaXNldHR5IGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIE11bHRpUGFydFdlYkFwcFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBVUkkgZ2V0QmFzZVVyaSgpIHsKKyAgICAgICAgcmV0dXJuIFVyaUJ1aWxkZXIuZnJvbVVyaShzdXBlci5nZXRCYXNlVXJpKCkpLnBhdGgoIm11bHRpcGFydC13ZWJhcHAiKS5idWlsZCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgTXlBcHBsaWNhdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihNdWx0aVBhcnRGZWF0dXJlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBsaWNhdGlvbldhZGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpLnBhdGgoImFwcGxpY2F0aW9uLndhZGwiKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgZmluYWwgRmlsZSB0bXBGaWxlID0gcmVzcG9uc2UucmVhZEVudGl0eShGaWxlLmNsYXNzKTsKKworICAgICAgICBmaW5hbCBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGJmID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICBiZi5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKyAgICAgICAgYmYuc2V0VmFsaWRhdGluZyhmYWxzZSk7CisKKyAgICAgICAgaWYgKCFTYXhIZWxwZXIuaXNYZGtEb2N1bWVudEJ1aWxkZXJGYWN0b3J5KGJmKSkgeworICAgICAgICAgICAgYmYuc2V0WEluY2x1ZGVBd2FyZShmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBEb2N1bWVudEJ1aWxkZXIgYiA9IGJmLm5ld0RvY3VtZW50QnVpbGRlcigpOworICAgICAgICBmaW5hbCBEb2N1bWVudCBkID0gYi5wYXJzZSh0bXBGaWxlKTsKKworICAgICAgICBmaW5hbCBYUGF0aCB4cCA9IFhQYXRoRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1hQYXRoKCk7CisgICAgICAgIHhwLnNldE5hbWVzcGFjZUNvbnRleHQobmV3IFNpbXBsZU5hbWVzcGFjZVJlc29sdmVyKCJ3YWRsIiwgImh0dHA6Ly93YWRsLmRldi5qYXZhLm5ldC8yMDA5LzAyIikpOworICAgICAgICBTdHJpbmcgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoCisgICAgICAgICAgICAgICAgIi8vd2FkbDpyZXNvdXJjZVtAcGF0aD0ncGFydCddL3dhZGw6bWV0aG9kW0BuYW1lPSdQT1NUJ10vd2FkbDpyZXF1ZXN0L3dhZGw6cmVwcmVzZW50YXRpb24vQG1lZGlhVHlwZSIsCisgICAgICAgICAgICAgICAgZCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIm11bHRpcGFydC9mb3JtLWRhdGEiLCB2YWwpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhcnQoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKS5wYXRoKCJmb3JtL3BhcnQiKTsKKworICAgICAgICBmaW5hbCBGb3JtRGF0YU11bHRpUGFydCBtcCA9IG5ldyBGb3JtRGF0YU11bHRpUGFydCgpOworICAgICAgICBmaW5hbCBGb3JtRGF0YUJvZHlQYXJ0IHAgPSBuZXcgRm9ybURhdGFCb2R5UGFydChGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbi5uYW1lKCJwYXJ0IikuYnVpbGQoKSwgIkNPTlRFTlQiKTsKKyAgICAgICAgbXAuYm9keVBhcnQocCk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHMgPSB0YXJnZXQucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShtcCwgTWVkaWFUeXBlLk1VTFRJUEFSVF9GT1JNX0RBVEFfVFlQRSksIFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiQ09OVEVOVCIsIHMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhcnRXaXRoRmlsZU5hbWUoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKS5wYXRoKCJmb3JtL3BhcnQtZmlsZS1uYW1lIik7CisKKyAgICAgICAgZmluYWwgRm9ybURhdGFNdWx0aVBhcnQgbXAgPSBuZXcgRm9ybURhdGFNdWx0aVBhcnQoKTsKKyAgICAgICAgZmluYWwgRm9ybURhdGFCb2R5UGFydCBwID0gbmV3IEZvcm1EYXRhQm9keVBhcnQoRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24ubmFtZSgicGFydCIpLmZpbGVOYW1lKCJmaWxlIikuYnVpbGQoKSwKKyAgICAgICAgICAgICAgICAiQ09OVEVOVCIpOworICAgICAgICBtcC5ib2R5UGFydChwKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgcyA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG1wLCBNZWRpYVR5cGUuTVVMVElQQVJUX0ZPUk1fREFUQV9UWVBFKSwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJDT05URU5UOmZpbGUiLCBzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RYbWxKQVhCUGFydCgpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpLnBhdGgoImZvcm0veG1sLWpheGItcGFydCIpOworCisgICAgICAgIGZpbmFsIEZvcm1EYXRhTXVsdGlQYXJ0IG1wID0gbmV3IEZvcm1EYXRhTXVsdGlQYXJ0KCk7CisgICAgICAgIG1wLmJvZHlQYXJ0KG5ldyBGb3JtRGF0YUJvZHlQYXJ0KEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uLm5hbWUoImJlYW4iKS5maWxlTmFtZSgiYmVhbiIpLmJ1aWxkKCksCisgICAgICAgICAgICAgICAgbmV3IEJlYW4oIkJFQU4iKSwKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MX1RZUEUpKTsKKyAgICAgICAgbXAuYm9keVBhcnQobmV3IEZvcm1EYXRhQm9keVBhcnQoRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24ubmFtZSgic3RyaW5nIikuZmlsZU5hbWUoInN0cmluZyIpLmJ1aWxkKCksCisgICAgICAgICAgICAgICAgIlNUUklORyIpKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgcyA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG1wLCBNZWRpYVR5cGUuTVVMVElQQVJUX0ZPUk1fREFUQV9UWVBFKSwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTVFJJTkc6c3RyaW5nLEJFQU46YmVhbiIsIHMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpZWxkSW5qZWN0ZWRYbWxKQVhCUGFydCgpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpLnBhdGgoImZvcm0tZmllbGQtaW5qZWN0ZWQveG1sLWpheGItcGFydCIpOworCisgICAgICAgIGZpbmFsIEZvcm1EYXRhTXVsdGlQYXJ0IG1wID0gbmV3IEZvcm1EYXRhTXVsdGlQYXJ0KCk7CisgICAgICAgIG1wLmJvZHlQYXJ0KG5ldyBGb3JtRGF0YUJvZHlQYXJ0KEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uLm5hbWUoImJlYW4iKS5maWxlTmFtZSgiYmVhbiIpLmJ1aWxkKCksCisgICAgICAgICAgICAgICAgbmV3IEJlYW4oIkJFQU4iKSwKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MX1RZUEUpKTsKKyAgICAgICAgbXAuYm9keVBhcnQobmV3IEZvcm1EYXRhQm9keVBhcnQoRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24ubmFtZSgic3RyaW5nIikuZmlsZU5hbWUoInN0cmluZyIpLmJ1aWxkKCksCisgICAgICAgICAgICAgICAgIlNUUklORyIpKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgcyA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG1wLCBNZWRpYVR5cGUuTVVMVElQQVJUX0ZPUk1fREFUQV9UWVBFKSwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTVFJJTkc6c3RyaW5nLEJFQU46YmVhbiIsIHMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29hdXRoLWNsaWVudC10d2l0dGVyL1JFQURNRS5NRCBiL2V4YW1wbGVzL29hdXRoLWNsaWVudC10d2l0dGVyL1JFQURNRS5NRApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWQxN2ZjCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvb2F1dGgtY2xpZW50LXR3aXR0ZXIvUkVBRE1FLk1ECkBAIC0wLDAgKzEsODAgQEAKK1svL106ICMgIiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIgorWy8vXTogIyAiICIKK1svL106ICMgIiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgIgorWy8vXTogIyAiIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0ICIKK1svL106ICMgIiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuICIKK1svL106ICMgIiAiCitbLy9dOiAjICIgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZSAiCisKK09BdXRoIDEgQ2xpZW50IFNhbXBsZSAtIFR3aXR0ZXIgQ2xpZW50Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byBkZXZlbG9wIGEgc2ltcGxlIHdlYiBhcHAgY2xpZW50Cit1dGlsaXppbmcgSkFYLVJTIGNsaWVudCBBUEkgYW5kIEplcnNleSBPQXV0aCBzdXBwb3J0LgorCitDb250ZW50cworLS0tLS0tLS0KKworVGhpcyBleGFtcGxlIGNvbnNpc3RzIG9mIHRoZSBtYWluIGNsYXNzIChgQXBwYCkgYW5kIHR3byBKQVhCIGJlYW5zIHVzZWQKK2ZvciB1bm1hcnNoYWxpbmcgdGhlIHJlc3BvbnNlcyBmcm9tIFR3aXR0ZXIgKGBTdGF0dXNgIGFuZCBgVXNlcmApLgorCitSdW5uaW5nIHRoZSBFeGFtcGxlCistLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMjIyBSZWdpc3RlcmluZyB3aXRoIFR3aXR0ZXIKKworQmVmb3JlIHJ1bm5pbmcgdGhlIGV4YW1wbGUsIHlvdSBoYXZlIHRvIHJlZ2lzdGVyIHlvdXIgb3duIGFwcGxpY2F0aW9uCit3aXRoIFR3aXR0ZXIgKHRvIG9idGFpbiBjb25zdW1lciBrZXkgYW5kIGNvbnN1bWVyIHNlY3JldCB5b3UgaGF2ZSB0byB1c2UKK3RvIGNvbmZpZ3VyZSB0aGlzIGNsaWVudCkuIFlvdSBjYW4gZG8gaXQgYXMgZm9sbG93czoKKworMS4gIEdvIHRvIFtUd2l0dGVyIERldmVsb3BlcnMgUGFnZV0oaHR0cDovL2Rldi50d2l0dGVyLmNvbS8pLiBZb3UgbmVlZAorICAgIHRvIHNpZ24gaW4gdG8gdGhlIFR3aXR0ZXIgKGlmIHlvdSBhcmUgbmV3IHRvIFR3aXR0ZXIgeW91IG5lZWQgdG8KKyAgICBzaWduIHVwKS4gVGhlbiBpbiB0aGUgcmlnaHQgdXBwZXIgY29ybmVyIHlvdSB3aWxsIHNlZSB5b3VyIHByb2ZpbGUKKyAgICBwaG90byBhbmQgZHJvcCBkb3duIGxpc3QgaW4gd2hpY2ggeW91IHNlbGVjdCAiTXkgQXBwbGljYXRpb24iLiBDbGljaworICAgIG9uICoqQ3JlYXRlIGEgbmV3IGFwcGxpY2F0aW9uKiogYnV0dG9uLgorCisyLiAgRmlsbCBvdXQgdGhlICJDcmVhdGUgYW4gYXBwbGljYXRpb24iIGZvcm0gLSB5b3UgaGF2ZSB0byBwaWNrIGEKKyAgICB1bmlxdWUgYXBwbGljYXRpb24gbmFtZSAoZS5nLiBhcHAxMjM0NTY3OCksIHB1dCBpbiBzb21lIGRlc2NyaXB0aW9uLAorICAgIHB1dCBpbiBzb21ldGhpbmcgZm9yIGFwcCB3ZWJzaXRlIChlLmcuIGh0dHA6Ly9qZXJzZXkuamF2YS5uZXQpLAorICAgIEFjY2VwdCB0ZXJtcyBieSBzZWxlY3RpbmcgKipZZXMsIEkgYWdyZWUqKiBpbiAiVHdpdHRlciBDb250ZW50IgorICAgIGNoZWNrYm94LCBlbnRlciBjYXB0Y2hhLgorCiszLiAgQ2xpY2sgKipDcmVhdGUgeW91ciB0d2l0dGVyIGFwcGxpY2F0aW9uKiogYnV0dG9uLgorCis0LiAgWW91IHdpbGwgYmUgcHJlc2VudGVkIHdpdGggY29uc3VtZXIga2V5LCBjb25zdW1lciBzZWNyZXQgYW5kIG90aGVyCisgICAgZGV0YWlscyBmb3IgeW91ciByZWdpc3RlcmVkIGFwcGxpY2F0aW9uLgorCisjIyMgUnVubmluZyBmb3IgdGhlIEZpcnN0IFRpbWUKKworRW50ZXIgdGhlIGZvbGxvd2luZyBvbiB0aGUgY29tbWFuZC1saW5lOgorCis+ICAgIG12biBjbGVhbiBjb21waWxlIGV4ZWM6amF2YSAtRGNvbnN1bWVyS2V5PTxjb25zdW1lciBrZXkgYXNzaWduZWQgdG8geW91ciBhcHA+IC1EY29uc3VtZXJTZWNyZXQ9PGNvbnN1bWVyIHNlY3JldCBhc3NpZ25lZCB0byB5b3VyIGFwcD4KKworIyMjIFN1YnNlcXVlbnQgUnVucworCitBZnRlciB5b3UgcnVuIHRoZSBhcHBsaWNhdGlvbiBmb3IgdGhlIGZpcnN0IHRpbWUsIGl0IHN0b3JlcyB0aGUgY29uc3VtZXIKK2tleSwgc2VjcmV0IGFuZCB0b2tlbiBhbmQgdG9rZW4gc2VjcmV0IGluIGEgcHJvcGVydHkgZmlsZSBmb3IgZnV0dXJlCit1c2UuIFNvLCBmb3Igc3Vic2VxdWVudCBydW5zIHlvdSBkb24ndCBoYXZlIHRvIHNwZWNpZnkgdGhlc2UgYXMgc3lzdGVtCitwcm9wZXJ0aWVzLiBUaGUgZm9sbG93aW5nIGNvbW1hbmQgaXMgZ29vZCBlbm91Z2ggZm9yIHJ1bm5pbmcgdGhlCithcHBsaWNhdGlvbiBhZnRlciBpdCB3YXMgYnVpbHQsIHJ1biBmb3IgdGhlIGZpcnN0IHRpbWUgYW5kIHRoZSBwcm9wZXJ0eQorZmlsZSB3YXMgY3JlYXRlZDoKKworPiAgICBtdm4gZXhlYzpqYXZhCisKK1Ryb3VibGVzaG9vdGluZworLS0tLS0tLS0tLS0tLS0tCisKKyMjIyBIVFRQIFByb3h5CisKK0JlaGluZCBhIEhUVFAgcHJveHksIHlvdSB3aWxsIG5lZWQgdG8gc2V0dXAgdGhlIGZvbGxvd2luZyBzeXN0ZW0KK3Byb3BlcnRpZXMgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgVHdpdHRlciBzZXJ2ZXI6CisKKy0gICBodHRwLnByb3h5SG9zdCAtIHRoZSBuYW1lIG9mIHRoZSBwcm94eSBob3N0LgorLSAgIGh0dHAucHJveHlQb3J0IC0gdGhlIHBvcnQgb2YgdGhlIHByb3h5IGhvc3QuCistICAgaHR0cC5wcm94eUF1dGggLSB0aGUgdXNlciBuYW1lIGFuZCBwYXNzd29yZCB0byB1c2Ugd2hlbiBjb25uZWN0aW5nCisgICAgdG8gdGhlIHByb3h5OyB0aGlzIHN0cmluZyBzaG91bGQgYmUgdGhlIHVzZXIgbmFtZSBhbmQgcGFzc3dvcmQKKyAgICBzZXBhcmF0ZWQgYnkgYSBjb2xvbiAoZS5nLiwgcmlja2hhbGw6bXlwYXNzd29yZCkuCisKK1RoZXNlIHN5c3RlbSBwcm9wZXJ0aWVzIGNhbiBiZSBzZXQgZGlyZWN0bHkgb24gdGhlIGNvbW1hbmQgbGluZSB3aGVuCitzdGFydGluZyB0aGUgSlZNIHVzaW5nIHRoZSBzdGFuZGFyZCAiLUQmbHQ7cHJvcCZndDs9Jmx0O3ZhbHVlJmd0OyIKK3N5bnRheC4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29hdXRoLWNsaWVudC10d2l0dGVyL3BvbS54bWwgYi9leGFtcGxlcy9vYXV0aC1jbGllbnQtdHdpdHRlci9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYzk5Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9vYXV0aC1jbGllbnQtdHdpdHRlci9wb20ueG1sCkBAIC0wLDAgKzEsODIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPHBhcmVudD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPGFydGlmYWN0SWQ+b2F1dGgtY2xpZW50LXR3aXR0ZXI8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKworCisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBUd2l0dGVyIGNsaWVudCB1c2luZyBPQXV0aCAxIHN1cHBvcnQgZm9yIEplcnNleSB0aGF0IHJldHJpZXZlcyBUd2VldHMgZnJvbSB0aGUgaG9tZSB0aW1lbGluZSBvZiBhCisgICAgICAgIHJlZ2lzdGVyZWQgVHdpdHRlciBhY2NvdW50LgorICAgIDwvZGVzY3JpcHRpb24+CisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNsaWVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWhrMjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VjdXJpdHk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vYXV0aDEtY2xpZW50PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1qc29uLWphY2tzb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhlYy1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxtYWluQ2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMub2F1dGgudHdpdHRlcmNsaWVudC5BcHA8L21haW5DbGFzcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnJlbGVhc2U8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb2F1dGgtY2xpZW50LXR3aXR0ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9vYXV0aC90d2l0dGVyY2xpZW50L0FwcC5qYXZhIGIvZXhhbXBsZXMvb2F1dGgtY2xpZW50LXR3aXR0ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9vYXV0aC90d2l0dGVyY2xpZW50L0FwcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwMTVhYTUKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9vYXV0aC1jbGllbnQtdHdpdHRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL29hdXRoL3R3aXR0ZXJjbGllbnQvQXBwLmphdmEKQEAgLTAsMCArMSwxOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMub2F1dGgudHdpdHRlcmNsaWVudDsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkdlbmVyaWNUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQub2F1dGgxLkFjY2Vzc1Rva2VuOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5vYXV0aDEuQ29uc3VtZXJDcmVkZW50aWFsczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQub2F1dGgxLk9BdXRoMUF1dGhvcml6YXRpb25GbG93OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5vYXV0aDEuT0F1dGgxQ2xpZW50U3VwcG9ydDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uLkphY2tzb25GZWF0dXJlOworCisvKiogU2ltcGxlIGNvbW1hbmQtbGluZSBhcHBsaWNhdGlvbiB0aGF0IHVzZXMgSmVyc2V5IE9BdXRoIGNsaWVudCBsaWJyYXJ5IHRvIGF1dGhlbnRpY2F0ZQorICogd2l0aCBUd2l0dGVyLgorICoKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgY2xhc3MgQXBwIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCdWZmZXJlZFJlYWRlciBJTiA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoU3lzdGVtLmluLCBDaGFyc2V0LmZvck5hbWUoIlVURi04IikpKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRlJJRU5EU19USU1FTElORV9VUkkgPSAiaHR0cHM6Ly9hcGkudHdpdHRlci5jb20vMS4xL3N0YXR1c2VzL2hvbWVfdGltZWxpbmUuanNvbiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUHJvcGVydGllcyBQUk9QRVJUSUVTID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVElFU19GSUxFX05BTUUgPSAidHdpdHRlcmNsaWVudC5wcm9wZXJ0aWVzIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQ09OU1VNRVJfS0VZID0gImNvbnN1bWVyS2V5IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfQ09OU1VNRVJfU0VDUkVUID0gImNvbnN1bWVyU2VjcmV0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPUEVSVFlfVE9LRU4gPSAidG9rZW4iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9UT0tFTl9TRUNSRVQgPSAidG9rZW5TZWNyZXQiOworCisgICAgLyoqCisgICAgICogTWFpbiBtZXRob2QgdGhhdCBjcmVhdGVzIGEge0BsaW5rIENsaWVudCBjbGllbnR9IGFuZCBpbml0aWFsaXplcyB0aGUgT0F1dGggc3VwcG9ydCB3aXRoCisgICAgICogY29uZmlndXJhdGlvbiBuZWVkZWQgdG8gY29ubmVjdCB0byB0aGUgVHdpdHRlciBhbmQgcmV0cmlldmUgc3RhdHVzZXMuCisgICAgICogPHAvPgorICAgICAqIEV4ZWN1dGUgdGhpcyBtZXRob2QgdG8gZGVtbworICAgICAqCisgICAgICogQHBhcmFtIGFyZ3MgQ29tbWFuZCBsaW5lIGFyZ3VtZW50cy4KKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBUaHJvd24gd2hlbiBlcnJvciBvY2N1cnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oZmluYWwgU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHJldHJpZXZlIGNvbnN1bWVyIGtleS9zZWNyZXQgYW5kIHRva2VuL3NlY3JldCBmcm9tIHRoZSBwcm9wZXJ0eSBmaWxlCisgICAgICAgIC8vIG9yIHN5c3RlbSBwcm9wZXJ0aWVzCisgICAgICAgIGxvYWRTZXR0aW5ncygpOworCisgICAgICAgIGZpbmFsIENvbnN1bWVyQ3JlZGVudGlhbHMgY29uc3VtZXJDcmVkZW50aWFscyA9IG5ldyBDb25zdW1lckNyZWRlbnRpYWxzKAorICAgICAgICAgICAgICAgIFBST1BFUlRJRVMuZ2V0UHJvcGVydHkoUFJPUEVSVFlfQ09OU1VNRVJfS0VZKSwKKyAgICAgICAgICAgICAgICBQUk9QRVJUSUVTLmdldFByb3BlcnR5KFBST1BFUlRZX0NPTlNVTUVSX1NFQ1JFVCkpOworCisgICAgICAgIGZpbmFsIEZlYXR1cmUgZmlsdGVyRmVhdHVyZTsKKyAgICAgICAgaWYgKFBST1BFUlRJRVMuZ2V0UHJvcGVydHkoUFJPUEVSVFlfVE9LRU4pID09IG51bGwpIHsKKworICAgICAgICAgICAgLy8gd2UgZG8gbm90IGhhdmUgQWNjZXNzIFRva2VuIHlldC4gTGV0J3MgcGVyZm9tIHRoZSBBdXRob3JpemF0aW9uIEZsb3cgZmlyc3QsCisgICAgICAgICAgICAvLyBsZXQgdGhlIHVzZXIgYXBwcm92ZSBvdXIgYXBwIGFuZCBnZXQgQWNjZXNzIFRva2VuLgorICAgICAgICAgICAgZmluYWwgT0F1dGgxQXV0aG9yaXphdGlvbkZsb3cgYXV0aEZsb3cgPSBPQXV0aDFDbGllbnRTdXBwb3J0LmJ1aWxkZXIoY29uc3VtZXJDcmVkZW50aWFscykKKyAgICAgICAgICAgICAgICAgICAgLmF1dGhvcml6YXRpb25GbG93KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwczovL2FwaS50d2l0dGVyLmNvbS9vYXV0aC9yZXF1ZXN0X3Rva2VuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cHM6Ly9hcGkudHdpdHRlci5jb20vb2F1dGgvYWNjZXNzX3Rva2VuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaHR0cHM6Ly9hcGkudHdpdHRlci5jb20vb2F1dGgvYXV0aG9yaXplIikKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYXV0aG9yaXphdGlvblVyaSA9IGF1dGhGbG93LnN0YXJ0KCk7CisKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRW50ZXIgdGhlIGZvbGxvd2luZyBVUkkgaW50byBhIHdlYiBicm93c2VyIGFuZCBhdXRob3JpemUgbWU6Iik7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oYXV0aG9yaXphdGlvblVyaSk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCJFbnRlciB0aGUgYXV0aG9yaXphdGlvbiBjb2RlOiAiKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2ZXJpZmllcjsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdmVyaWZpZXIgPSBJTi5yZWFkTGluZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBBY2Nlc3NUb2tlbiBhY2Nlc3NUb2tlbiA9IGF1dGhGbG93LmZpbmlzaCh2ZXJpZmllcik7CisKKyAgICAgICAgICAgIC8vIHN0b3JlIGFjY2VzcyB0b2tlbiBmb3IgbmV4dCBhcHBsaWNhdGlvbiBleGVjdXRpb24KKyAgICAgICAgICAgIFBST1BFUlRJRVMuc2V0UHJvcGVydHkoUFJPUEVSVFlfVE9LRU4sIGFjY2Vzc1Rva2VuLmdldFRva2VuKCkpOworICAgICAgICAgICAgUFJPUEVSVElFUy5zZXRQcm9wZXJ0eShQUk9QRVJUWV9UT0tFTl9TRUNSRVQsIGFjY2Vzc1Rva2VuLmdldEFjY2Vzc1Rva2VuU2VjcmV0KCkpOworCisgICAgICAgICAgICAvLyBnZXQgdGhlIGZlYXR1cmUgdGhhdCB3aWxsIGNvbmZpZ3VyZSB0aGUgY2xpZW50IHdpdGggY29uc3VtZXIgY3JlZGVudGlhbHMgYW5kCisgICAgICAgICAgICAvLyByZWNlaXZlZCBhY2Nlc3MgdG9rZW4KKyAgICAgICAgICAgIGZpbHRlckZlYXR1cmUgPSBhdXRoRmxvdy5nZXRPQXV0aDFGZWF0dXJlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaW5hbCBBY2Nlc3NUb2tlbiBzdG9yZWRUb2tlbiA9IG5ldyBBY2Nlc3NUb2tlbihQUk9QRVJUSUVTLmdldFByb3BlcnR5KFBST1BFUlRZX1RPS0VOKSwKKyAgICAgICAgICAgICAgICAgICAgUFJPUEVSVElFUy5nZXRQcm9wZXJ0eShQUk9QRVJUWV9UT0tFTl9TRUNSRVQpKTsKKyAgICAgICAgICAgIC8vIGJ1aWxkIGEgbmV3IGZlYXR1cmUgZnJvbSB0aGUgc3RvcmVkIGNvbnN1bWVyIGNyZWRlbnRpYWxzIGFuZCBhY2Nlc3MgdG9rZW4KKyAgICAgICAgICAgIGZpbHRlckZlYXR1cmUgPSBPQXV0aDFDbGllbnRTdXBwb3J0LmJ1aWxkZXIoY29uc3VtZXJDcmVkZW50aWFscykuZmVhdHVyZSgpCisgICAgICAgICAgICAgICAgICAgIC5hY2Nlc3NUb2tlbihzdG9yZWRUb2tlbikuYnVpbGQoKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8gY3JlYXRlIGEgbmV3IEplcnNleSBjbGllbnQgYW5kIHJlZ2lzdGVyIGZpbHRlciBmZWF0dXJlIHRoYXQgd2lsbCBhZGQgT0F1dGggc2lnbmF0dXJlcyBhbmQKKyAgICAgICAgLy8gSmFja3NvbkZlYXR1cmUgdGhhdCB3aWxsIHByb2Nlc3MgcmV0dXJuZWQgSlNPTiBkYXRhLgorICAgICAgICBmaW5hbCBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoZmlsdGVyRmVhdHVyZSkKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoSmFja3NvbkZlYXR1cmUuY2xhc3MpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAgICAgLy8gbWFrZSByZXF1ZXN0cyB0byBwcm90ZWN0ZWQgcmVzb3VyY2VzCisgICAgICAgIC8vIChubyBuZWVkIHRvIGNhcmUgYWJvdXQgdGhlIE9BdXRoIHNpZ25hdHVyZXMpCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gY2xpZW50LnRhcmdldChGUklFTkRTX1RJTUVMSU5FX1VSSSkucmVxdWVzdCgpLmdldCgpOworICAgICAgICBpZiAocmVzcG9uc2UuZ2V0U3RhdHVzKCkgIT0gMjAwKSB7CisgICAgICAgICAgICBTdHJpbmcgZXJyb3JFbnRpdHkgPSBudWxsOworICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmhhc0VudGl0eSgpKSB7CisgICAgICAgICAgICAgICAgZXJyb3JFbnRpdHkgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiUmVxdWVzdCB0byBUd2l0dGVyIHdhcyBub3Qgc3VjY2Vzc2Z1bC4gUmVzcG9uc2UgY29kZTogIgorICAgICAgICAgICAgICAgICAgICArIHJlc3BvbnNlLmdldFN0YXR1cygpICsgIiwgcmVhc29uOiAiICsgcmVzcG9uc2UuZ2V0U3RhdHVzSW5mbygpLmdldFJlYXNvblBocmFzZSgpCisgICAgICAgICAgICAgICAgICAgICsgIiwgZW50aXR5OiAiICsgZXJyb3JFbnRpdHkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gcGVyc2lzdCB0aGUgY3VycmVudCBjb25zdW1lciBrZXkvc2VjcmV0IGFuZCB0b2tlbi9zZWNyZXQgZm9yIGZ1dHVyZSB1c2UKKyAgICAgICAgc3RvcmVTZXR0aW5ncygpOworCisgICAgICAgIGZpbmFsIExpc3Q8U3RhdHVzPiBzdGF0dXNlcyA9IHJlc3BvbnNlLnJlYWRFbnRpdHkobmV3IEdlbmVyaWNUeXBlPExpc3Q8U3RhdHVzPj4oKSB7CisgICAgICAgIH0pOworCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVHdlZXRzOlxuIik7CisgICAgICAgIGZvciAoZmluYWwgU3RhdHVzIHMgOiBzdGF0dXNlcykgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHMuZ2V0VGV4dCgpKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiW3Bvc3RlZCBieSAiICsgcy5nZXRVc2VyKCkuZ2V0TmFtZSgpICsgIiBhdCAiICsgcy5nZXRDcmVhdGVkQXQoKSArICJdIik7CisgICAgICAgIH0KKworCisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2FkU2V0dGluZ3MoKSB7CisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBzdCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oUFJPUEVSVElFU19GSUxFX05BTUUpOworICAgICAgICAgICAgUFJPUEVSVElFUy5sb2FkKHN0KTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoc3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHN0LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgbmFtZSA6IG5ldyBTdHJpbmdbXXtQUk9QRVJUWV9DT05TVU1FUl9LRVksIFBST1BFUlRZX0NPTlNVTUVSX1NFQ1JFVCwKKyAgICAgICAgICAgICAgICBQUk9QRVJUWV9UT0tFTiwgUFJPUEVSVFlfVE9LRU5fU0VDUkVUfSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlID0gU3lzdGVtLmdldFByb3BlcnR5KG5hbWUpOworICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBQUk9QRVJUSUVTLnNldFByb3BlcnR5KG5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChQUk9QRVJUSUVTLmdldFByb3BlcnR5KFBST1BFUlRZX0NPTlNVTUVSX0tFWSkgPT0gbnVsbAorICAgICAgICAgICAgICAgIHx8IFBST1BFUlRJRVMuZ2V0UHJvcGVydHkoUFJPUEVSVFlfQ09OU1VNRVJfU0VDUkVUKSA9PSBudWxsKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIk5vIGNvbnN1bWVyS2V5IGFuZC9vciBjb25zdW1lclNlY3JldCBmb3VuZCBpbiB0d2l0dGVyY2xpZW50LnByb3BlcnRpZXMgZmlsZS4gIgorICAgICAgICAgICAgICAgICAgICArICJZb3UgaGF2ZSB0byBwcm92aWRlIHRoZXNlIGFzIHN5c3RlbSBwcm9wZXJ0aWVzLiBTZWUgUkVBRE1FLmh0bWwgZm9yIG1vcmUgaW5mb3JtYXRpb24uIik7CisgICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc3RvcmVTZXR0aW5ncygpIHsKKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBzdCA9IG51bGw7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdCA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKFBST1BFUlRJRVNfRklMRV9OQU1FKTsKKyAgICAgICAgICAgIFBST1BFUlRJRVMuc3RvcmUoc3QsIG51bGwpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKHN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgc3QuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vYXV0aC1jbGllbnQtdHdpdHRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL29hdXRoL3R3aXR0ZXJjbGllbnQvU3RhdHVzLmphdmEgYi9leGFtcGxlcy9vYXV0aC1jbGllbnQtdHdpdHRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL29hdXRoL3R3aXR0ZXJjbGllbnQvU3RhdHVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRmMmFiZQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL29hdXRoLWNsaWVudC10d2l0dGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvb2F1dGgvdHdpdHRlcmNsaWVudC9TdGF0dXMuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLm9hdXRoLnR3aXR0ZXJjbGllbnQ7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5hbm5vdGF0aW9uLkpzb25JZ25vcmVQcm9wZXJ0aWVzOworCisvKioKKyAqIEVudGl0eSBpbnRvIHdoaWNoIHRoZSBUd2l0dGVyIHN0YXR1cyAodHdlZXQpIGlzIGRlc2VyaWFsaXplZAorICoKKyAqICBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworQFhtbFJvb3RFbGVtZW50CitASnNvbklnbm9yZVByb3BlcnRpZXMoaWdub3JlVW5rbm93biA9IHRydWUpCitwdWJsaWMgY2xhc3MgU3RhdHVzIHsKKworICAgIEBYbWxFbGVtZW50KG5hbWUgPSAiY3JlYXRlZF9hdCIpCisgICAgcHJpdmF0ZSBTdHJpbmcgY3JlYXRlZEF0OworICAgIEBYbWxFbGVtZW50KG5hbWUgPSAidGV4dCIpCisgICAgcHJpdmF0ZSBTdHJpbmcgdGV4dDsKKyAgICBAWG1sRWxlbWVudChuYW1lID0gInVzZXIiKQorICAgIHByaXZhdGUgVXNlciB1c2VyOworCisgICAgcHVibGljIFN0cmluZyBnZXRDcmVhdGVkQXQoKSB7CisgICAgICAgIHJldHVybiBjcmVhdGVkQXQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgeworICAgICAgICByZXR1cm4gdGV4dDsKKyAgICB9CisKKyAgICBwdWJsaWMgVXNlciBnZXRVc2VyKCkgeworICAgICAgICByZXR1cm4gdXNlcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vYXV0aC1jbGllbnQtdHdpdHRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL29hdXRoL3R3aXR0ZXJjbGllbnQvVXNlci5qYXZhIGIvZXhhbXBsZXMvb2F1dGgtY2xpZW50LXR3aXR0ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9vYXV0aC90d2l0dGVyY2xpZW50L1VzZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmUyNTcxCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvb2F1dGgtY2xpZW50LXR3aXR0ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9vYXV0aC90d2l0dGVyY2xpZW50L1VzZXIuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLm9hdXRoLnR3aXR0ZXJjbGllbnQ7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5hbm5vdGF0aW9uLkpzb25JZ25vcmVQcm9wZXJ0aWVzOworCisvKioKKyAqIEVudGl0eSBpbnRvIHdoaWNoIHRoZSBUd2l0dGVyIHVzZXIgaXMgZGVzZXJpYWxpemVkLgorICoKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitAWG1sUm9vdEVsZW1lbnQKK0BKc29uSWdub3JlUHJvcGVydGllcyhpZ25vcmVVbmtub3duID0gdHJ1ZSkKK3B1YmxpYyBjbGFzcyBVc2VyIHsKKyAgICBAWG1sRWxlbWVudChuYW1lID0gIm5hbWUiKQorICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29wZW4tdHJhY2luZy9SRUFETUUuTUQgYi9leGFtcGxlcy9vcGVuLXRyYWNpbmcvUkVBRE1FLk1ECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYTNhODIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9vcGVuLXRyYWNpbmcvUkVBRE1FLk1ECkBAIC0wLDAgKzEsODQgQEAKK1svL106ICMgIiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIgorWy8vXTogIyAiICIKK1svL106ICMgIiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgIgorWy8vXTogIyAiIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0ICIKK1svL106ICMgIiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuICIKK1svL106ICMgIiAiCitbLy9dOiAjICIgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZSAiCisKK0plcnNleSBPcGVuVHJhY2luZyBFeGFtcGxlCis9PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIEplcnNleSBPcGVuVHJhY2luZyBpbnRlZ3JhdGlvbi4gVGhlIEpBWC1SUyByZXNvdXJjZSBjb250YWlucyBzZXZlcmFsIHJlc291cmNlIG1ldGhvZCBzaG93aW5nIHZhcmlvdXMKK3Bvc3NpYmlsaXRpZXMuCisKK1RoaXMgcGFydGljdWxhciBleGFtcGxlIGlzIGNvbmZpZ3VyZWQgd2l0aCBKYWVnZXIgYXMgdGhlIEdsb2JhbFRyYWNlciwgYnV0IGNhbiBiZSBlYXNpbHkgYWRqdXN0ZWQgdG8gdXNlIGFueSBvdGhlciB0cmFjZXIKK2ltcGxlbWVudGF0aW9uLgorCitSdW5uaW5nIHRoZSBFeGFtcGxlCistLS0tLS0tLS0tLS0tLS0tLS0tCitFeGFtcGxlIGNhbiBiZSBsYXVuY2hlZCBhcyBpcywgYnV0IGRvZXMgbm90IHBlcmZvcm0gYW55IGludGVyZXN0aW5nIGFjdGlvbiBvdXQgb2YgdGhlIGJveC4KK1RvIGJlIGFibGUgdG8gdmlzdWFsaXNlIHRoZSB0cmFjZXMsIGl0IGlzIHJlY29tbWVuZGVkIHRvIHN0YXJ0IEphZWdlciAoYW5kIHRoIFVJKSBsb2NhbGx5LCBlLmcuIGluIERvY2tlcjoKKworPiAgICAgZG9ja2VyIHJ1biAtZCAtcCA1Nzc1OjU3NzUvdWRwIC1wIDE2Njg2OjE2Njg2IGphZWdlcnRyYWNpbmcvYWxsLWluLW9uZTp0cmF2aXMtMTI3OAorCitDaGVjayB0aGUgVUkgb24gW2xvY2FsaG9zdDoxNjY4Nl0oaHR0cDovL2xvY2FsaG9zdDoxNjY4NiksIHRoZXJlIHNob3VsZCBiZSBubyB0cmFjZXMgdmlzaWJsZS4KKworUnVuIHRoZSBleGFtcGxlIGFzIGZvbGxvd3M6CisKKz4gICAgIG12biBjbGVhbiBjb21waWxlIGV4ZWM6amF2YQorCitUaGlzIGRlcGxveXMgdGhlIGV4YW1wbGUgdXNpbmcgW0dyaXp6bHldKGh0dHA6Ly9ncml6emx5LmphdmEubmV0LykgY29udGFpbmVyLgorCitUcnkgdG8gYWNjZXNzIHJlc291cmNlcyB1c2luZyB0aGUgVVJJcyBsaXN0ZWQgYmVsbG93IGFuZCBsb29rIGludG8gSmFnZXIgVUkgd2hhdCB0cmFjZXMgYXJlIHByb2R1Y2VkLgorVGhlIGZpcnN0IGV4YW1wbGUgc2hvdWxkIGJlIHZpc2libGUgaW4gdGhlIEphZWdlciBVSSByaWdodCBhZnRlciB0aGUgZXhhbXBsZSBhcHBsaWNhdGlvbiBpcyBzdGFydGVkLiBPdGhlcnMgY2FuIGJlIGNyZWF0ZWQgYnkKK2RvaW5nIHJlc3QgY2FsbHMgdG8gdGhlIGV4cG9zZWQgcmVzb3VyY2UuCisKKzEuIE9uIHN0YXJ0LCB0aGUgZXhhbXBsZSBhcHBsaWNhdGlvbiBzZW5kcyBvbmUgcmVxdWVzdCBkZW1vbnN0cmF0aW5nIG1vcmUgY29tcGxleCB0cmFjaW5nCistIGplcnNleSBjbGllbnQgKHcvIHJlZ2lzdGVyZWQgT3BlblRyYWNpbmdGZWF0dXJlKSBjcmVhdGVzIHRoZSAiamVyc2V5LWNsaWVudC1HRVQiIHNwYW4KKy0gdGhlIHNwYW4gaXMgcHJvcGFnYXRlZCB0byBzZXJ2ZXIgKHZpYSBodHRwIGhlYWRlcnMpLCBqZXJzZXkgc2VydmVyICh3LyByZWdpc3RlcmVkIE9wZW5UcmFjaW5mRmVhdHVyZSkgYXV0b21hdGljYWxseSBjcmVhdGVzIGEKKyBjaGlsZCBzcGFuIG9mIHRoZSBjbGllbnQgc3BhbgorLSBpbiB0aGUgcmVzb3VyY2UgbWV0aG9kLCBjaGlsZCBzcGFuIG9mIHRoZSBzZXJ2ZXIgc3BhbiBpcyBtYW51YWxseSBjcmVhdGVkIGFuZCBwcm9wYWdhdGVkIGludG8gbWFuYWdlZCBjbGllbnQgY2FsbHMKKy0gdGhlIG1hbmFnZWQgY2xpZW50cyBhcmUgYWxzbyB0cmFjaW5nLWVuYWJsZWQsIHNvIGVhY2ggb25lIGNyZWF0ZXMgaXRzIG93biBjaGlsZCBzcGFuLCB0aGF0IGlzIHByb3BhZ2F0ZWQgdG8gdGhlIHNlcnZlciwgYW5kCitzbyBvbgorCisyLiBObyBleHBsaWNpdCAodXNlci1kZWZpbmVkKSBzcGFucy4KKy0gb25lIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCAicm9vdCIgc3BhbiwgdGhhdCBtZWFzdXJlcyB0aGUgcHJvY2Vzc2luZyBvbiB0aGUgSmVyc2V5IHNpZGUgYW5kIG9uZSAicmVzb3VyY2UtbGV2ZWwiIHNwYW4gdG8gYmUKK3VzZWQgZm9yIGxvZ2dpbmcgZXZlbnRzIG9uIHRoZSBhcHBsaWNhdGlvbiBsZXZlbAorLSB0aGUgInJvb3QiIGNvbnRhaW5zIHNldmVyYWwgdGFncyB3aXRoIHJlcXVlc3QgYW5kIHJlc3BvbnNlIG1ldGFkYXRhLCBzdWNoIGFzIHJlcXVlc3QgaGVhZGVycywgc3RhdHVzIGNvZGUsIGV0YworLSBhbHNvLCBzZXZlcmFsIHRlY2huaWNhbCBKZXJzZXktbGV2ZWwgZXZlbnRzIGhhdmUgYmVlbiBsb2dnZWQKKy0gdG8gc2VlIHRoaXMgc2ltcGxlIGNhc2UsIGNhbGwKKz4gICAgIGN1cmwgbG9jYWxob3N0OjgwODAvb3BlbnRyYWNpbmcvcmVzb3VyY2UvZGVmYXVsdFRyYWNlCisKKzMuIEV4cGxpY2l0IGxvZ2dpbmcgaW50byByZXNvdXJjZS1sZXZlbCBzcGFuCistIHNhbWUgYXMgYWJvdmUsIGJ1dCB0aGUgInJlc291cmNlLWxldmVsIiBzcGFuIHdhcyByZXNvbHZlZCB3aXRoaW4gdGhlIGFwcGxpY2F0aW9uIGxvZ2ljLCBhbiBldmVudCB3YXMgbG9nZ2VkIGFuZCBhIHRhZyB3YXMgYWRkZWQKKz4gICAgIGN1cmwgbG9jYWxob3N0OjgwODAvb3BlbnRyYWNpbmcvcmVzb3VyY2UvYXBwTGV2ZWxMb2dnaW5nCisKKy0gc2ltaWxhciBjYWxsIHdpdGggUE9TVDoKKz4gICAgIGN1cmwgLVggUE9TVCAtZCAiSmVyc2V5IFJvY2tzIiBsb2NhbGhvc3Q6ODA4MC9vcGVudHJhY2luZy9yZXNvdXJjZS9hcHBMZXZlbFBvc3QKKworCis0LiBFeHBsaWNpdCBjaGlsZCBzcGFuIGNyZWF0aW9uCistIHNhbWUgYXMgYWJvdmUsIGJ1dCBpbnN0ZWFkIG9mICJyZXNvdXJjZS1sZXZlbCIgc3BhbiwgYSBjaGlsZCBzcGFuIHdhcyBjcmVhdGVkIGFuZCB1c2VkIGZvciBsb2dnaW5nIGFuZCBhZGRpbmcgdGFncworLSBub3RlLCB0aGF0IHN1Y2ggYSBzcGFuIG5lZWRzIHRvIGJlIGZpbmlzaGVkIG1hbnVhbGx5LCBvdGhlcndpc2UgaXQgd29uJ3QgcHJvcGFnYXRlICh0aGUgdHJhY2luZyBpbmZvIHdpbGwgYmUgbG9zdCkKKz4gICAgIGN1cmwgbG9jYWxob3N0OjgwODAvb3BlbnRyYWNpbmcvcmVzb3VyY2UvY2hpbGRTcGFuCisKKworNC4gQ2xpZW50IGNhbGxzIGZyb20gdGhlIHJlc291cmNlCistIG1vcmUgY29tcGxleCBjYXNlLCB0aGUgcmVzb3VyY2UgbWV0aG9kIGludm9rZXMgdHdvIGNsaWVudCBjYWxscyB1c2luZyBtYW5hZ2VkIGNsaWVudAorLSBvbmUgcmVxdWVzdCB2aWEgbWFuYWdlZCBjbGllbnQgaXMgdHJpZ2dlcmVkIHdpdGhpbiB0aGUgInByb3ZpZGVkIiwgcmVzb3VyY2UtbGV2ZWwgc3BhbgorLSBjaGlsZCBzcGFuIGlzIGNyZWF0ZWQgYW5kIGFub3RoZXIgcmVxdWVzdCB2aWEgbWFuZ2VkIGNsaWVudCBpcyB0cmlnZ2VyZWQgd2l0aGluIHRoZSBjaGlsZCBzcGFuCistIHRoZSBzcGFuIGNvbnRleHQgbmVlZHMgdG8gYmUgcHJvcGFnYXRlZCBtYW51YWxseSB1c2luZyB0aGUgT3BlblRyYWNpbmdGZWF0dXJlLlNQQU5fQ09OVEVYVF9QUk9QRVJUWQorLSBpbiBib3RoIGNhc2VzLCB0aGUgc3BhbiBjb250ZXh0IGlzIHByb3BhZ2F0ZWQgdXNpbmcgaHR0cCBoZWFkZXJzIHRvIHRoZSBzZXJ2ZXIgYW5kIGJhY2sgdG8gdGhlIGNsaWVudAorLSB0aGUgY2hpbGQgc3BhbiAoY3JlYXRlZCBpbiB0aGUgcmVzb3VyY2UpIG5lZWRzIHRvIGJlIGV4cGxpY2l0bHkgZmluaXNoZWQgaW4gdGhlIHJlc291cmNlIChvciBlbHNld2hlcmUsIGJ1dCBuZWVkcyB0byBiZSBmaW5pc2hlZCkKKz4gICAgIGN1cmwgbG9jYWxob3N0OjgwODAvb3BlbnRyYWNpbmcvcmVzb3VyY2UvdHJhY2VXaXRoTWFuYWdlZENsaWVudAorCis1LiBBc3luY2hyb25vdXMgcHJvY2Vzc2luZworLSBlaXRoZXIgYmFzaWMgY2FzZSwgYnV0IHVzaW5nIGFzeW5jaHJvbm91cyByZXF1ZXN0IHByb2Nlc3NpbmcKKy0gdGhlcmUgc2hvdWxkIGJlIG5vIHByYWN0aWNhbCBkaWZmZXJlbmNlIHZpc2libGUgaW4gdGhlIHRyYWNpbmcgaW5mbworPiAgICAgY3VybCBsb2NhbGhvc3Q6ODA4MC9vcGVudHJhY2luZy9yZXNvdXJjZS9hc3luYworCis2LiBGYWlsaW5nIHJlc291cmNlCistIGRlbW9uc3RyYXRlcyBleGNlcHRpb24gdGhyb3duIGluIHRoZSByZXNvdXJjZSBtZXRob2QKKy0gSmFlZ2VyIHNob3dzIGZhaWxlZCBzcGFucyB3aXRoIHRoZSBleGNsYW1hdGlvbiBtYXJrIHN5bWJvbCBhbmQgdGhlIGV4Y2VwdGlvbiBpcyBsb2dnZWQgaW4gdGhlIHJlcXVlc3Qgc3BhbgorPiAgICAgY3VybCBsb2NhbGhvc3Q6ODA4MC9vcGVudHJhY2luZy9yZXNvdXJjZS9lcnJvcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29wZW4tdHJhY2luZy9wb20ueG1sIGIvZXhhbXBsZXMvb3Blbi10cmFjaW5nL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMwODNlMwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL29wZW4tdHJhY2luZy9wb20ueG1sCkBAIC0wLDAgKzEsMTA1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+b3Blbi10cmFjaW5nPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LWV4YW1wbGVzLW9wZW4tdHJhY2luZzwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgT3BlblRyYWNpbmcgZXhhbXBsZTwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLWdyaXp6bHkyLWh0dHA8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmluY3ViYXRvcjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1vcGVuLXRyYWNpbmc8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8IS0tIG5vdCBhIHBhcnQgb2YgYm9tIHBvbS54bWwgYXMgbG9uZyBhcyBpdCByZXNpZGVzIGluIGluY3ViYXRvciAtLT4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+aW8ub3BlbnRyYWNpbmc8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcGVudHJhY2luZy1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmlvLm9wZW50cmFjaW5nPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3BlbnRyYWNpbmctdXRpbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnViZXIuamFlZ2VyPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amFlZ2VyLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4wLjIwLjA8L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcms8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstdXRpbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWhrMjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGVjLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPG1haW5DbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5vcGVudHJhY2luZy5BcHA8L21haW5DbGFzcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnJlbGVhc2U8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3Blbi10cmFjaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvb3BlbnRyYWNpbmcvQXBwLmphdmEgYi9leGFtcGxlcy9vcGVuLXRyYWNpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9vcGVudHJhY2luZy9BcHAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2M0OGU1Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvb3Blbi10cmFjaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvb3BlbnRyYWNpbmcvQXBwLmphdmEKQEAgLTAsMCArMSwxNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMub3BlbnRyYWNpbmc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUZpbHRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkyLmh0dHBzZXJ2ZXIuR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9wZW50cmFjaW5nLk9wZW5UcmFjaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5vcGVudHJhY2luZy5PcGVuVHJhY2luZ1V0aWxzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guZ3JpenpseS5odHRwLnNlcnZlci5IdHRwU2VydmVyOworCitpbXBvcnQgY29tLnViZXIuamFlZ2VyLkNvbmZpZ3VyYXRpb247CisKK2ltcG9ydCBpby5vcGVudHJhY2luZy5TcGFuOworaW1wb3J0IGlvLm9wZW50cmFjaW5nLnV0aWwuR2xvYmFsVHJhY2VyOworCisvKioKKyAqIE9wZW4gdHJhY2luZyBleGFtcGxlIGFwcGxpY2F0aW9uLgorICogPHA+CisgKiBFeHBvc2VzIE9wZW5UcmFjaW5nLWVuYWJsZWQgUkVTVCBhcHBsaWNhdGlvbiAod2l0aCBKYWVnZXIgcmVnaXN0ZXJlZCBhcyB0aGUgVHJhY2VyKQorICogYW5kIGludm9rZXMgb25lIHJlcXVlc3QgZnJvbSAoYWxzbyBPcGVuVHJhY2luZy1lbmFibGVkKSBKZXJzZXkgY2xpZW50LgorICogPHA+CisgKiBUbyB2aXN1YWxpc2UgdGhlIHRyYWNlcywgc3RhcnQgSmFlZ2VyIGxvY2FsbHk6CisgKiA8cHJlPgorICogZG9ja2VyIHJ1biAtZCAtcCA1Nzc1OjU3NzUvdWRwIC1wIDE2Njg2OjE2Njg2IGphZWdlcnRyYWNpbmcvYWxsLWluLW9uZTp0cmF2aXMtMTI3OAorICogPC9wcmU+CisgKiBhbmQgZ28gdG8ge0Bjb2RlIGxvY2FsaG9zdDoxNjY4Nn0uCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICogQHNpbmNlIDIuMjYKKyAqLworcHVibGljIGNsYXNzIEFwcCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgQkFTRV9VUkkgPSBVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvb3BlbnRyYWNpbmciKTsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXCJIZWxsbyBXb3JsZFwiIEplcnNleSBPcGVuVHJhY2luZyBFeGFtcGxlIEFwcCIpOworICAgICAgICAgICAgcHJlcGFyZSgpOworCisgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhUcmFjZWRSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgT3BlblRyYWNpbmdGZWF0dXJlLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICBSZXFGaWx0ZXJBLmNsYXNzLCBSZXFGaWx0ZXJCLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICBSZXNwRmlsdGVyQS5jbGFzcywgUmVzcEZpbHRlckIuY2xhc3MpOworCisgICAgICAgICAgICBmaW5hbCBIdHRwU2VydmVyIHNlcnZlciA9IEdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeS5jcmVhdGVIdHRwU2VydmVyKEJBU0VfVVJJLCByZXNvdXJjZUNvbmZpZywgZmFsc2UpOworICAgICAgICAgICAgUnVudGltZS5nZXRSdW50aW1lKCkuYWRkU2h1dGRvd25Ib29rKG5ldyBUaHJlYWQoc2VydmVyOjpzaHV0ZG93bk5vdykpOworICAgICAgICAgICAgc2VydmVyLnN0YXJ0KCk7CisKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihTdHJpbmcuZm9ybWF0KCJBcHBsaWNhdGlvbiBzdGFydGVkLlxuVHJ5IG91dCAlcy9hcHBsaWNhdGlvbi53YWRsXG4iCisgICAgICAgICAgICAgICAgICAgICsgIlN0b3AgdGhlIGFwcGxpY2F0aW9uIHVzaW5nIENUUkwrQyIsIEJBU0VfVVJJKSk7CisKKyAgICAgICAgICAgIC8vIGRvIHRoZSBmaXJzdCAiZXhhbXBsZSIgcmVxdWVzdCB3aXRoIHRyYWNpbmctZW5hYmxlZCBjbGllbnQgdG8gc2hvdyBzb21ldGhpbmcgaW4gSmFlZ2dlciBVSSwKKyAgICAgICAgICAgIC8vIGluY2x1ZGUgc29tZSB3ZWlyZCBoZWFkZXJzIGFuZCBhY2NlcHRlZCB0eXBlcywgdGhhdCB3aWxsIGJlIHZpc2libGUgaW4gdGhlIHNwYW4ncyB0YWdzCisgICAgICAgICAgICBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdCdWlsZGVyKCkucmVnaXN0ZXIoT3BlblRyYWNpbmdGZWF0dXJlLmNsYXNzKS5idWlsZCgpOworICAgICAgICAgICAgY2xpZW50LnRhcmdldChCQVNFX1VSSSkucGF0aCgicmVzb3VyY2UvbWFuYWdlZENsaWVudCIpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgICAgICAuYWNjZXB0KCJ0ZXh0L3BsYWluIiwgImFwcGxpY2F0aW9uL2pzb24iLCAiKi8qIikKKyAgICAgICAgICAgICAgICAgICAgLmhlYWRlcigiZm9vIiwgImJhciIpCisgICAgICAgICAgICAgICAgICAgIC5oZWFkZXIoImZvbyIsICJiYXoiKQorICAgICAgICAgICAgICAgICAgICAuaGVhZGVyKCJIZWxsbyIsICJXb3JsZCIpLmdldCgpOworCisgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gfCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihBcHAuY2xhc3MuZ2V0TmFtZSgpKS5sb2coTGV2ZWwuU0VWRVJFLCBudWxsLCBleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmVzIEphZWdlciB0cmFjZXIgYXMgdGhlIHtAbGluayBHbG9iYWxUcmFjZXJ9LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJlcGFyZSgpIHsKKyAgICAgICAgR2xvYmFsVHJhY2VyLnJlZ2lzdGVyKAorICAgICAgICAgICAgICAgIG5ldyBjb20udWJlci5qYWVnZXIuQ29uZmlndXJhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJPcGVuVHJhY2luZ1RlbXBvcmFyeVRlc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvbmZpZ3VyYXRpb24uU2FtcGxlckNvbmZpZ3VyYXRpb24oImNvbnN0IiwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ29uZmlndXJhdGlvbi5SZXBvcnRlckNvbmZpZ3VyYXRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2NhbGhvc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1Nzc1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMCkKKyAgICAgICAgICAgICAgICApLmdldFRyYWNlcigpCisgICAgICAgICk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTm8tb3AgcmVxdWVzdCBmaWx0ZXIsIGp1c3QgdG8gdGVzdCwgdGhhdCBpdCB3aWxsIGJlIGxpc3RlZCBpbiB0aGUgcm9vdCBsZXZlbCBzcGFuJ3MgbG9ncy4KKyAgICAgKiBGb3IgZGVtb25zdHJhdGluZyBwdXJwb3NlcywgaXQgcmVzb2x2ZXMgdGhlICJyb290IiByZXF1ZXN0IHNwYW4gYW5kIGxvZ3MgaW50byBpdC4gSWYgaXQgZmFpbHMgdG8gcmVzb2x2ZSB0aGUgc3BhbiwgaXQKKyAgICAgKiBjcmVhdGVzIGEgbmV3IGFkLWhvYyBzcGFuLgorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBSZXFGaWx0ZXJBIGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBTcGFuIHNwYW4gPSBPcGVuVHJhY2luZ1V0aWxzCisgICAgICAgICAgICAgICAgICAgIC5nZXRSZXF1ZXN0U3BhbihyZXF1ZXN0Q29udGV4dCkKKyAgICAgICAgICAgICAgICAgICAgLm9yRWxzZShHbG9iYWxUcmFjZXIuZ2V0KCkuYnVpbGRTcGFuKCJhZC1ob2Mtc3Bhbi1yZXFBIikuc3RhcnRNYW51YWwoKSk7CisgICAgICAgICAgICBzcGFuLmxvZygiUmVxRmlsdGVyQS5maWx0ZXIoKSBpbnZva2VkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOby1vcCByZXF1ZXN0IGZpbHRlciwganVzdCB0byB0ZXN0LCB0aGF0IGl0IHdpbGwgYmUgbGlzdGVkIGluIHRoZSByb290IGxldmVsIHNwYW4ncyBsb2dzLgorICAgICAqIEZvciBkZW1vbnN0cmF0aW5nIHB1cnBvc2VzLCBpdCByZXNvbHZlcyB0aGUgInJvb3QiIHJlcXVlc3Qgc3BhbiBhbmQgbG9ncyBpbnRvIGl0LiBJZiBpdCBmYWlscyB0byByZXNvbHZlIHRoZSBzcGFuLCBpdAorICAgICAqIGNyZWF0ZXMgYSBuZXcgYWQtaG9jIHNwYW4uCisgICAgICovCisgICAgc3RhdGljIGNsYXNzIFJlcUZpbHRlckIgaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFNwYW4gc3BhbiA9IE9wZW5UcmFjaW5nVXRpbHMKKyAgICAgICAgICAgICAgICAgICAgLmdldFJlcXVlc3RTcGFuKHJlcXVlc3RDb250ZXh0KQorICAgICAgICAgICAgICAgICAgICAub3JFbHNlKEdsb2JhbFRyYWNlci5nZXQoKS5idWlsZFNwYW4oImFkLWhvYy1zcGFuLXJlcUIiKS5zdGFydE1hbnVhbCgpKTsKKyAgICAgICAgICAgIHNwYW4ubG9nKCJSZXFGaWx0ZXJCLmZpbHRlcigpIGludm9rZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE5vLW9wIHJlc3BvbnNlIGZpbHRlciwganVzdCB0byB0ZXN0LCB0aGF0IGl0IHdpbGwgYmUgbGlzdGVkIGluIHRoZSByb290IGxldmVsIHNwYW4ncyBsb2dzLgorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBSZXNwRmlsdGVyQSBpbXBsZW1lbnRzIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCwgQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFNwYW4gc3BhbiA9IE9wZW5UcmFjaW5nVXRpbHMKKyAgICAgICAgICAgICAgICAgICAgLmdldFJlcXVlc3RTcGFuKHJlcXVlc3RDb250ZXh0KQorICAgICAgICAgICAgICAgICAgICAub3JFbHNlKEdsb2JhbFRyYWNlci5nZXQoKS5idWlsZFNwYW4oImFkLWhvYy1zcGFuLXJlc3BBIikuc3RhcnRNYW51YWwoKSk7CisgICAgICAgICAgICBzcGFuLmxvZygiUmVzcEZpbHRlckEuZmlsdGVyKCkgaW52b2tlZCIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTm8tb3AgcmVzcG9uc2UgZmlsdGVyLCBqdXN0IHRvIHRlc3QsIHRoYXQgaXQgd2lsbCBiZSBsaXN0ZWQgaW4gdGhlIHJvb3QgbGV2ZWwgc3BhbidzIGxvZ3MuCisgICAgICovCisgICAgc3RhdGljIGNsYXNzIFJlc3BGaWx0ZXJCIGltcGxlbWVudHMgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXIgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LCBDb250YWluZXJSZXNwb25zZUNvbnRleHQgcmVzcG9uc2VDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgU3BhbiBzcGFuID0gT3BlblRyYWNpbmdVdGlscworICAgICAgICAgICAgICAgICAgICAuZ2V0UmVxdWVzdFNwYW4ocmVxdWVzdENvbnRleHQpCisgICAgICAgICAgICAgICAgICAgIC5vckVsc2UoR2xvYmFsVHJhY2VyLmdldCgpLmJ1aWxkU3BhbigiYWQtaG9jLXNwYW4tcmVzcEIiKS5zdGFydE1hbnVhbCgpKTsKKyAgICAgICAgICAgIHNwYW4ubG9nKCJSZXNwRmlsdGVyQi5maWx0ZXIoKSBpbnZva2VkIik7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29wZW4tdHJhY2luZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL29wZW50cmFjaW5nL1RyYWNlZFJlc291cmNlLmphdmEgYi9leGFtcGxlcy9vcGVuLXRyYWNpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9vcGVudHJhY2luZy9UcmFjZWRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlOGU4M2IKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9vcGVuLXRyYWNpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9vcGVudHJhY2luZy9UcmFjZWRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMjAwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLm9wZW50cmFjaW5nOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkFzeW5jUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5TdXNwZW5kZWQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5vcGVudHJhY2luZy5PcGVuVHJhY2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkub3BlbnRyYWNpbmcuT3BlblRyYWNpbmdVdGlsczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuTWFuYWdlZEFzeW5jOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Vcmk7CisKK2ltcG9ydCBpby5vcGVudHJhY2luZy5TcGFuOworCisKKy8qKgorICogT3BlblRyYWNpbmcgZXhhbXBsZSByZXNvdXJjZS4KKyAqIDxwPgorICogSmVyc2V5ICh3aXRoIHJlZ2lzdGVyZWQge0BsaW5rIE9wZW5UcmFjaW5nRmVhdHVyZX0gd2lsbCBhdXRvbWF0aWNhbGx5CisgKiBjcmVhdGUgYW5kIHN0YXJ0IHNwYW4gZm9yIGVhY2ggcmVxdWVzdCAoInJvb3QiIHNwYW4gb3IgInJlcXVlc3QiIHNwYW4pIGFuZCBhIGNoaWxkIHNwYW4gdG8gYmUgdXNlZCBpbiB0aGUgcmVzb3VyY2UgbWV0aG9kCisgKiAoInJlc291cmNlIiBzcGFuKS4gVGhlIHJvb3Qgc3BhbiBpcyB1c2VkIGZvciBKZXJzZXktbGV2ZWwgZXZlbnQgbG9nZ2luZyAocmVzb3VyY2UgbWF0Y2hpbmcgc3RhcnRlZCwgcmVxdWVzdCBmaWx0ZXJzIGFwcGxpZWQsCisgKiBldGMpLiBUaGUgcmVzb3VyY2Ugc3BhbiBzZXJ2ZXMgZm9yIGFwcGxpY2F0aW9uLWxldmVsIGV2ZW50IGxvZ2dpbmcgcHVycG9zZXMgKHVzZWQtZGVmaW5lZCkuIEJvdGggYXJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZAorICogYW5kIGFsc28gYXV0b21hdGljYWxseSBmaW5pc2hlZC4KKyAqIDxwPgorICogUmVzb3VyY2Ugc3BhbiBpcyBjcmVhdGVkIHJpZ2h0IGJlZm9yZSB0aGUgcmVzb3VyY2UgbWV0aG9kIGludm9jYXRpb24gYW5kIGZpbmlzaGVkIHJpZ2h0IGFmdGVyIHJlc291cmNlIG1ldGhvZCBmaW5pc2hlcy4gSXQKKyAqIGNhbiBiZSByZXNvbHZlZCBieSBjYWxsaW5nIHtAbGluayBPcGVuVHJhY2luZ1V0aWxzI2dldFJlcXVlc3RTcGFuKENvbnRhaW5lclJlcXVlc3RDb250ZXh0KX0uCisgKiA8cD4KKyAqIEFwcGxpY2F0aW9uIGNvZGUgY2FuIGFsc28gY3JlYXRlIGFkLWhvYyBzcGFucyBhcyBjaGlsZCBzcGFucyBvZiB0aGUgcmVzb3VyY2Ugc3Bhbi4gVGhpcyBjYW4gYmUgYWNoaWV2ZWQgYnkgY2FsbGluZyBvbmUgb2YgdGhlCisgKiBjb252ZW5pZW5jZSBtZXRob2RzIHtAbGluayBPcGVuVHJhY2luZ1V0aWxzI2dldFJlcXVlc3RDaGlsZFNwYW4oQ29udGFpbmVyUmVxdWVzdENvbnRleHQpfS4KKyAqIDxwPgorICoge0BsaW5rIENvbnRhaW5lclJlcXVlc3RDb250ZXh0fSBjYW4gYmUgb2J0YWluZWQgdmlhIGluamVjdGlvbi4KKyAqIDxwPgorICogQWxsIHRoZSBhZC1ob2MgY3JlYXRlZCBzcGFucyBNVVNUIGJlIHtAbGluayBTcGFuI2ZpbmlzaCgpIGZpbmlzaGVkfSBleHBsaWNpdGx5LgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgodmFsdWUgPSAiL3Jlc291cmNlIikKK3B1YmxpYyBjbGFzcyBUcmFjZWRSZXNvdXJjZSB7CisKKyAgICAvKioKKyAgICAgKiBSZXNvdXJjZSBtZXRob2Qgd2l0aCBubyBleHBsaWNpdCB0cmFjaW5nLgorICAgICAqIDxwPgorICAgICAqIE9uZSBzcGFuIChqZXJzZXktc2VydmVyKSB3aWxsIGJlIGNyZWF0ZWQgYW5kIGZpbmlzaGVkIGF1dG9tYXRpY2FsbHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGR1bW15IHJlc3BvbnNlCisgICAgICovCisgICAgQEdFVAorICAgIEBQYXRoKCJkZWZhdWx0VHJhY2UiKQorICAgIHB1YmxpYyBSZXNwb25zZSBkZWZhdWx0VHJhY2UoKSB7CisgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygiZm9vIikuYnVpbGQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNvdXJjZSBtZXRob2Qgd2l0aCBleHBsaWNpdCBsb2dnaW5nIGludG8gcmVzb3VyY2Ugc3Bhbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IGluamVjdGVkIHJlcXVlc3QgY29udGV4dCB3aXRoIHJlc291cmNlLWxldmVsIHNwYW4gcmVmZXJlbmNlCisgICAgICogQHJldHVybiBkdW1teSByZXNwb25zZQorICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgaW50ZXJydXB0ZWQKKyAgICAgKi8KKyAgICBAR0VUCisgICAgQFBhdGgoImFwcExldmVsTG9nZ2luZyIpCisgICAgcHVibGljIFJlc3BvbnNlIGFwcExldmVsTG9nZ2luZyhAQ29udGV4dCBDb250YWluZXJSZXF1ZXN0Q29udGV4dCBjb250ZXh0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTcGFuIHJlc291cmNlU3BhbiA9IE9wZW5UcmFjaW5nVXRpbHMKKyAgICAgICAgICAgICAgICAuZ2V0UmVxdWVzdFNwYW4oY29udGV4dCkKKyAgICAgICAgICAgICAgICAub3JFbHNlVGhyb3coKCkgLT4gbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRyYWNpbmcgaGFzIGZhaWxlZCIpKTsKKworICAgICAgICByZXNvdXJjZVNwYW4ubG9nKCJTdGFydGluZyBleHBlbnNpdmUgb3BlcmF0aW9uLiIpOworICAgICAgICAvLyBEbyB0aGUgYnVzaW5lc3MKKyAgICAgICAgVGhyZWFkLnNsZWVwKDIwMCk7CisgICAgICAgIHJlc291cmNlU3Bhbi5sb2coIkV4cGVuc2l2ZSBvcGVyYXRpb24gZmluaXNoZWQuIik7CisgICAgICAgIHJlc291cmNlU3Bhbi5zZXRUYWcoImV4cGVuc2l2ZU9wZXJhdGlvblN1Y2Nlc3MiLCB0cnVlKTsKKworICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soIlNVQ0NFU1MiKS5idWlsZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNpbWlsYXIgYXMge0BsaW5rICNhcHBMZXZlbExvZ2dpbmcoQ29udGFpbmVyUmVxdWVzdENvbnRleHQpfSwganVzdCB3aXRoIHtAY29kZSBQT1NUfSBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW50aXR5ICBwb3N0ZWQgZW50aXR5CisgICAgICogQHBhcmFtIGNvbnRleHQgaW5qZWN0ZWQgY29udGV4dAorICAgICAqIEByZXR1cm4gZHVtbXkgcmVzcG9uc2UKKyAgICAgKi8KKyAgICBAUE9TVAorICAgIEBQYXRoKCJhcHBMZXZlbFBvc3QiKQorICAgIHB1YmxpYyBSZXNwb25zZSB0cmFjZVBvc3QoU3RyaW5nIGVudGl0eSwgQENvbnRleHQgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgY29udGV4dCkgeworICAgICAgICBmaW5hbCBTcGFuIHJlc291cmNlU3BhbiA9IE9wZW5UcmFjaW5nVXRpbHMKKyAgICAgICAgICAgICAgICAuZ2V0UmVxdWVzdFNwYW4oY29udGV4dCkKKyAgICAgICAgICAgICAgICAub3JFbHNlVGhyb3coKCkgLT4gbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlRyYWNpbmcgaGFzIGZhaWxlZCIpKTsKKworICAgICAgICByZXNvdXJjZVNwYW4uc2V0VGFnKCJyZXN1bHQiLCAiNDIiKTsKKyAgICAgICAgcmVzb3VyY2VTcGFuLnNldEJhZ2dhZ2VJdGVtKCJlbnRpdHkiLCBlbnRpdHkpOworICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soIkRvbmUhIikuYnVpbGQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNvdXJjZSBtZXRob2Qgd2l0aCBleHBsaWNpdCBjaGlsZCBzcGFuIGNyZWF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgaW5qZWN0ZWQgcmVxdWVzdCBjb250ZXh0IHdpdGggcmVzb3VyY2UtbGV2ZWwgKHBhcmVudCkgc3BhbiByZWZlcmVuY2UKKyAgICAgKiBAcmV0dXJuIGR1bW15IHJlc3BvbnNlCisgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiBpbnRlcnJ1cHRlZAorICAgICAqLworICAgIEBHRVQKKyAgICBAUGF0aCgiY2hpbGRTcGFuIikKKyAgICBwdWJsaWMgUmVzcG9uc2UgY2hpbGRTcGFuKEBDb250ZXh0IENvbnRhaW5lclJlcXVlc3RDb250ZXh0IGNvbnRleHQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFNwYW4gY2hpbGRTcGFuID0gT3BlblRyYWNpbmdVdGlscy5nZXRSZXF1ZXN0Q2hpbGRTcGFuKGNvbnRleHQsICJBcHBDcmVhdGVkU3BhbiIpOworICAgICAgICBjaGlsZFNwYW4ubG9nKCJTdGFydGluZyBleHBlbnNpdmUgb3BlcmF0aW9uLiIpOworICAgICAgICAvLyBEbyB0aGUgYnVzaW5lc3MKKyAgICAgICAgVGhyZWFkLnNsZWVwKDIwMCk7CisgICAgICAgIGNoaWxkU3Bhbi5sb2coIkV4cGVuc2l2ZSBvcGVyYXRpb24gZmluaXNoZWQuIik7CisgICAgICAgIGNoaWxkU3Bhbi5zZXRUYWcoImV4cGVuc2l2ZU9wZXJhdGlvblN1Y2Nlc3MiLCB0cnVlKTsKKworICAgICAgICBjaGlsZFNwYW4uZmluaXNoKCk7CisgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygiU1VDQ0VTUyIpLmJ1aWxkKCk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXNvdXJjZSBtZXRob2Qgd2l0aCBleHBsaWNpdCBzcGFuIGNyZWF0aW9uIGFuZCBwcm9wYWdhdGlvbiBpbnRvIGluamVjdGVkIG1hbmFnZWQgY2xpZW50LgorICAgICAqIDxwPgorICAgICAqIFNob3dzIGhvdyB0byBwcm9wYWdhdGUgdGhlIHNlcnZlci1zaWRlIHNwYW4gaW50byBtYW5hZ2VkIGNsaWVudCAob3IgYW55IGNvbW1vbiBKZXJzZXkgY2xpZW50KS4KKyAgICAgKiBUaGlzIHdheSwgdGhlIGNsaWVudCBzcGFuIHdpbGwgYmUgY2hpbGQgb2YgdGhlIHJlc291cmNlIHNwYW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBpbmplY3RlZCBjb250ZXh0CisgICAgICogQHBhcmFtIHd0ICAgICAgaW5qZWN0ZWQgd2ViIHRhcmdldAorICAgICAqIEByZXR1cm4gZHVtbXkgcmVzcG9uc2UKKyAgICAgKi8KKyAgICBAR0VUCisgICAgQFBhdGgoIm1hbmFnZWRDbGllbnQiKQorICAgIHB1YmxpYyBSZXNwb25zZSB0cmFjZVdpdGhNYW5hZ2VkQ2xpZW50KEBDb250ZXh0IENvbnRhaW5lclJlcXVlc3RDb250ZXh0IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQFVyaSgicmVzb3VyY2UvYXBwTGV2ZWxQb3N0IikgV2ViVGFyZ2V0IHd0KSB7CisgICAgICAgIGZpbmFsIFNwYW4gcHJvdmlkZWRTcGFuID0gT3BlblRyYWNpbmdVdGlscworICAgICAgICAgICAgICAgIC5nZXRSZXF1ZXN0U3Bhbihjb250ZXh0KQorICAgICAgICAgICAgICAgIC5vckVsc2VUaHJvdygoKSAtPiBuZXcgUnVudGltZUV4Y2VwdGlvbigiVHJhY2luZyBmYWlsZWQiKSk7CisKKyAgICAgICAgcHJvdmlkZWRTcGFuLmxvZygiUmVzb3VyY2UgbWV0aG9kIHN0YXJ0ZWQuIik7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB3dC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAucHJvcGVydHkoT3BlblRyYWNpbmdGZWF0dXJlLlNQQU5fQ09OVEVYVF9QUk9QRVJUWSwgcHJvdmlkZWRTcGFuLmNvbnRleHQoKSkgIC8vIDwtLS0gc3BhbiBwcm9wYWdhdGlvbgorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS50ZXh0KCJIZWxsbyIpKTsKKworICAgICAgICBwcm92aWRlZFNwYW4ubG9nKCIxc3QgUmVzcG9uc2UgcmVjZWl2ZWQgZnJvbSBtYW5hZ2VkIGNsaWVudCIpOworICAgICAgICBwcm92aWRlZFNwYW4ubG9nKCJGaXJpbmcgMXN0IHJlcXVlc3QgZnJvbSBtYW5hZ2VkIGNsaWVudCIpOworCisgICAgICAgIHByb3ZpZGVkU3Bhbi5sb2coIkNyZWF0aW5nIGNoaWxkIHNwYW4iKTsKKyAgICAgICAgZmluYWwgU3BhbiBjaGlsZFNwYW4gPSBPcGVuVHJhY2luZ1V0aWxzLmdldFJlcXVlc3RDaGlsZFNwYW4oY29udGV4dCwgImplcnNleS1yZXNvdXJjZS1jaGlsZC1zcGFuIik7CisKKworICAgICAgICBjaGlsZFNwYW4ubG9nKCJGaXJpbmcgMm5kIHJlcXVlc3QgZnJvbSBtYW5hZ2VkIGNsaWVudCIpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZTIgPSB3dC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAucHJvcGVydHkoT3BlblRyYWNpbmdGZWF0dXJlLlNQQU5fQ09OVEVYVF9QUk9QRVJUWSwgY2hpbGRTcGFuLmNvbnRleHQoKSkgIC8vIDwtLS0gc3BhbiBwcm9wYWdhdGlvbgorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS50ZXh0KCJXb3JsZCIpKTsKKyAgICAgICAgY2hpbGRTcGFuLmxvZygiMnN0IFJlc3BvbnNlIHJlY2VpdmVkIGZyb20gbWFuYWdlZCBjbGllbnQiKTsKKworICAgICAgICBjaGlsZFNwYW4uZmluaXNoKCk7CisgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygiUmVzdWx0OiAiICsgcmVzcG9uc2UuZ2V0U3RhdHVzKCkgKyAiLCAiICsgcmVzcG9uc2UyLmdldFN0YXR1cygpKS5idWlsZCgpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiYXN5bmMiKQorICAgIEBNYW5hZ2VkQXN5bmMKKyAgICBwdWJsaWMgdm9pZCB0cmFjZVdpdGhBc3luYyhAU3VzcGVuZGVkIGZpbmFsIEFzeW5jUmVzcG9uc2UgYXN5bmNSZXNwb25zZSwgQENvbnRleHQgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgY29udGV4dCkgeworICAgICAgICBmaW5hbCBTcGFuIHNwYW4gPSBPcGVuVHJhY2luZ1V0aWxzLmdldFJlcXVlc3RTcGFuKGNvbnRleHQpLm9yRWxzZVRocm93KCgpIC0+IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJ0cmFjaW5nIGZhaWxlZCIpKTsKKyAgICAgICAgc3Bhbi5sb2coIkluIHRoZSByZXNvdXJjZSBtZXRob2QuIik7CisgICAgICAgIEV4ZWN1dG9ycy5uZXdTaW5nbGVUaHJlYWRFeGVjdXRvcigpLnN1Ym1pdCgoKSAtPiB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgyMDApOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHNwYW4ubG9nKCJJbnRlcnJ1cHRlZCIpOworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcGFuLmxvZygiUmVzdW1pbmciKTsKKyAgICAgICAgICAgIGFzeW5jUmVzcG9uc2UucmVzdW1lKCJPSyIpOworICAgICAgICB9KTsKKyAgICAgICAgc3Bhbi5sb2coIkJlZm9yZSBleGl0aW5nIHRoZSByZXNvdXJjZSBtZXRob2QiKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImVycm9yIikKKyAgICBwdWJsaWMgU3RyaW5nIGZhaWxUcmFjZShAQ29udGV4dCBDb250YWluZXJSZXF1ZXN0Q29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJGYWlsaW5nIGp1c3QgZm9yIGZ1bi4iKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vc2dpLWhlbGxvd29ybGQtd2ViYXBwL1JFQURNRS5NRCBiL2V4YW1wbGVzL29zZ2ktaGVsbG93b3JsZC13ZWJhcHAvUkVBRE1FLk1ECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwYjk4ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9vc2dpLWhlbGxvd29ybGQtd2ViYXBwL1JFQURNRS5NRApAQCAtMCwwICsxLDQ3IEBACitbLy9dOiAjICIgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICIKK1svL106ICMgIiAiCitbLy9dOiAjICIgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlICIKK1svL106ICMgIiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCAiCitbLy9dOiAjICIgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLiAiCitbLy9dOiAjICIgIgorWy8vXTogIyAiIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UgIgorCitIZWxsb1dvcmxkIE9TR2kgRXhhbXBsZQorPT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gZGV2ZWxvcCBhIHNpbXBsZSBPU0dpIFdBUiBidW5kbGUKK2NvbnRhaW5pbmcgYSBSRVNUZnVsIGhlbGxvIHdvcmxkIHdlYiBzZXJ2aWNlCisKK0NvbnRlbnRzCistLS0tLS0tLQorCitUaGUgZXhhbXBsZSBXQVIgKHNlZSB0aGUgYHdhci1idW5kbGVgIG1vZHVsZSkgY29uc2lzdHMgb2YgdHdvIEplcnNleQorcmVzb3VyY2VzOgorCitgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMub3NnaS5oZWxsb3dvcmxkLnJlc291cmNlLkhlbGxvV29ybGRSZXNvdXJjZWAKKwordGhhdCBwcm9kdWNlcyBhIHRleHR1YWwgcmVzcG9uc2UgdG8gYW4gSFRUUCBHRVQKKworYG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLm9zZ2kuaGVsbG93b3JsZC5yZXNvdXJjZS5Bbm90aGVyUmVzb3VyY2VgCisKK3RoYXQgcHJvZHVjZXMgYSBkaWZmZXJlbnQgdGV4dHVhbCByZXNwb25zZSB0byBhbiBIVFRQIEdFVC4gVGhlCitwdXJwb3NlIG9mIHRoaXMgcmVzb3VyY2UgaXMgdG8gc2hvdyBob3cgdG8gZGVmaW5lIG11bHRpcGxlIHdlYgorcmVzb3VyY2VzIHdpdGhpbiBhIHdlYiBhcHBsaWNhdGlvbi4KKworVGhlIG1hcHBpbmcgb2YgdGhlIFVSSSBwYXRoIHNwYWNlIGlzIHByZXNlbnRlZCBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOgorCitVUkkgcGF0aCAgICAgICAgICAgfCBSZXNvdXJjZSBjbGFzcyAgICAgICB8IEhUVFAgbWV0aG9kCistLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0KKyoqXy9oZWxsb3dvcmxkXyoqICB8IEhlbGxvV29ybGRSZXNvdXJjZSAgIHwgR0VUCisqKl8vYW5vdGhlcl8qKiAgICAgfCBBbm90aGVyUmVzb3VyY2UgICAgICB8IEdFVAorCitSdW5uaW5nIHRoZSBFeGFtcGxlCistLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RvIHJ1biB0aGUgZXhhbXBsZSwgeW91IHdvdWxkIG5lZWQgdG8gYnVpbGQgdGhlIFdBUiBmaWxlIGFuZCBpbnN0YWxsIGl0Cit0byBhbiBPU0dpIHJ1bnRpbWUgKGUuZy4gQXBhY2hlIEZlbGl4KSB0b2dldGhlciB3aXRoIG90aGVyIE9TR2kgbW9kdWxlcy4KK0xvb2sgYXQgdGhlIGF0dGFjaGVkIGBmdW5jdGlvbmFsLXRlc3RgIG1vZHVsZSBmb3IgZGV0YWlscyBvbiB0aGUKK3Byb2dyYW1hdGljYWwgcnVudGltZSBjb25maWd1cmF0aW9uLiBUbyBidWlsZCB0aGUgd2FyIGFyY2hpdmUgYW5kIHJ1bgordGhlIHRlc3RzLCB5b3UgY2FuIGp1c3QgbGF1bmNoCisKKz4gICAgIG12biBjbGVhbiBpbnN0YWxsCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vc2dpLWhlbGxvd29ybGQtd2ViYXBwL2FkZGl0aW9uYWwtYnVuZGxlL3BvbS54bWwgYi9leGFtcGxlcy9vc2dpLWhlbGxvd29ybGQtd2ViYXBwL2FkZGl0aW9uYWwtYnVuZGxlL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UwZmEwNQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL29zZ2ktaGVsbG93b3JsZC13ZWJhcHAvYWRkaXRpb25hbC1idW5kbGUvcG9tLnhtbApAQCAtMCwwICsxLDg4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorCisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm9zZ2ktaGVsbG93b3JsZC13ZWJhcHA8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5vc2dpLWhlbGxvd29ybGQtd2ViYXBwPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmFkZGl0aW9uYWwtYnVuZGxlPC9hcnRpZmFjdElkPgorICAgIDxuYW1lPmplcnNleS1leGFtcGxlcy1vc2dpLWhlbGxvd29ybGQtd2ViYXBwLWFkZGl0aW9uYWw8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+T1NHaSBIZWxsb3dvcmxkIFdlYmFwcCAtIGFkZGl0aW9uYWwgYnVuZGxlPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgud3MucnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC53cy5ycy1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPCEtLSB0byBnZW5lcmF0ZSB0aGUgTUFOSUZFU1QtRklMRSByZXF1aXJlZCBieSB0aGUgYnVuZGxlIC0tPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmZlbGl4PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWJ1bmRsZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGV4dGVuc2lvbnM+dHJ1ZTwvZXh0ZW5zaW9ucz4KKyAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5idW5kbGUtbWFuaWZlc3Q8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnByb2Nlc3MtY2xhc3NlczwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+bWFuaWZlc3Q8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxtYW5pZmVzdExvY2F0aW9uPiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L01FVEEtSU5GPC9tYW5pZmVzdExvY2F0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c3VwcG9ydGVkUHJvamVjdFR5cGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHN1cHBvcnRlZFByb2plY3RUeXBlPmJ1bmRsZTwvc3VwcG9ydGVkUHJvamVjdFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3VwcG9ydGVkUHJvamVjdFR5cGU+amFyPC9zdXBwb3J0ZWRQcm9qZWN0VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPC9zdXBwb3J0ZWRQcm9qZWN0VHlwZXM+CisgICAgICAgICAgICAgICAgICAgIDxpbnN0cnVjdGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8QnVuZGxlLVN5bWJvbGljTmFtZT4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L0J1bmRsZS1TeW1ib2xpY05hbWU+CisgICAgICAgICAgICAgICAgICAgICAgICA8SW1wb3J0LVBhY2thZ2U+KjwvSW1wb3J0LVBhY2thZ2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8RXhwb3J0LVBhY2thZ2U+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMub3NnaS5oZWxsb3dvcmxkLmFkZGl0aW9uYWwucmVzb3VyY2U8L0V4cG9ydC1QYWNrYWdlPgorICAgICAgICAgICAgICAgICAgICA8L2luc3RydWN0aW9ucz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnJlbGVhc2U8L2lkPgorICAgICAgICAgICAgPCEtLSBkbyBub3QgY3JlYXRlIHNvdXJjZSB6aXAgYnVuZGxlcyAtLT4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxza2lwQXNzZW1ibHk+dHJ1ZTwvc2tpcEFzc2VtYmx5PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3NnaS1oZWxsb3dvcmxkLXdlYmFwcC9hZGRpdGlvbmFsLWJ1bmRsZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL29zZ2kvaGVsbG93b3JsZC9hZGRpdGlvbmFsL3Jlc291cmNlL0FkZGl0aW9uYWxSZXNvdXJjZS5qYXZhIGIvZXhhbXBsZXMvb3NnaS1oZWxsb3dvcmxkLXdlYmFwcC9hZGRpdGlvbmFsLWJ1bmRsZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL29zZ2kvaGVsbG93b3JsZC9hZGRpdGlvbmFsL3Jlc291cmNlL0FkZGl0aW9uYWxSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxOGQ1YzQKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9vc2dpLWhlbGxvd29ybGQtd2ViYXBwL2FkZGl0aW9uYWwtYnVuZGxlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvb3NnaS9oZWxsb3dvcmxkL2FkZGl0aW9uYWwvcmVzb3VyY2UvQWRkaXRpb25hbFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5vc2dpLmhlbGxvd29ybGQuYWRkaXRpb25hbC5yZXNvdXJjZTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCisvKioKKyAqIFRlc3QgcmVzb3VyY2UgZm9yIG9zZ2ktaGVsbG93b3JsZC13ZWJhcHAgZXhhbXBsZTsKKyAqIEl0IGlzIGFpbWVkIHRvIGVuc3VyZSwgdGhhdCB0aGUgcGFja2FnZSBzY2FubmluZyB3b3JrcyBpbiBPU0dpIGZvciBtdWx0aXBsZSBwYWNrYWdlcyBkZWZpbmVkIGluIHdlYi54bWwKKyAqCisgKiBUaGVyZSBpcyBhbHNvIGFuIGFsdGVybmF0ZSB2ZXJzaW9uIG9mIHRoZSByZXNvdXJjZSB3aXRoIHRoZSBzYW1lIGNsYXNzIG5hbWUgd2l0aGluIHRoZSBzYW1lIHBhY2thZ2Ugd2hpY2gKKyAqIHNob3VsZCBub3QgYmUgdmlzaWJsZSB0byBKZXJzZXkgdmlhIE9TR2kuCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiL2FkZGl0aW9uYWwiKQorcHVibGljIGNsYXNzIEFkZGl0aW9uYWxSZXNvdXJjZSB7CisgICAgQEdFVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIFN0cmluZyBnZXRBZGRpdGlvbmFsUmVzb3VyY2VNZXNzYWdlKCkgeworICAgICAgICByZXR1cm4gIkFkZGl0aW9uYWwgQnVuZGxlISI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3NnaS1oZWxsb3dvcmxkLXdlYmFwcC9hZGRpdGlvbmFsLWJ1bmRsZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL29zZ2kvaGVsbG93b3JsZC9hZGRpdGlvbmFsL3Jlc291cmNlL3N1YnBhY2thZ2UvQWRkaXRpb25hbFN1YlBhY2thZ2VkUmVzb3VyY2UuamF2YSBiL2V4YW1wbGVzL29zZ2ktaGVsbG93b3JsZC13ZWJhcHAvYWRkaXRpb25hbC1idW5kbGUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9vc2dpL2hlbGxvd29ybGQvYWRkaXRpb25hbC9yZXNvdXJjZS9zdWJwYWNrYWdlL0FkZGl0aW9uYWxTdWJQYWNrYWdlZFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUzMThjYwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL29zZ2ktaGVsbG93b3JsZC13ZWJhcHAvYWRkaXRpb25hbC1idW5kbGUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9vc2dpL2hlbGxvd29ybGQvYWRkaXRpb25hbC9yZXNvdXJjZS9zdWJwYWNrYWdlL0FkZGl0aW9uYWxTdWJQYWNrYWdlZFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5vc2dpLmhlbGxvd29ybGQuYWRkaXRpb25hbC5yZXNvdXJjZS5zdWJwYWNrYWdlOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CisKKy8qKgorICogVGhpcyByZXNvdXJjZSBpcyBsb2NhdGVkIGluIGEgc3ViLXBhY2thZ2UgYW5kIHdpbGwgYmUgZGV0ZWN0ZWQgYnkgT1NHSSBmcmFtZXdvcmsgb25seSBpZiByZWN1cnNpdmUgc2Nhbm5pbmcgaXMgdHVybmVkIG9uLgorICoKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIi9zdWJhZGRpdGlvbmFsIikKK3B1YmxpYyBjbGFzcyBBZGRpdGlvbmFsU3ViUGFja2FnZWRSZXNvdXJjZSB7CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN1YlBhY2thZ2VkQWRkaXRpb25hbE1lc3NhZ2UoKSB7CisgICAgICAgIHJldHVybiAiU3ViLXBhY2thZ2VkIEFkZGl0aW9uYWwgQnVuZGxlISI7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vc2dpLWhlbGxvd29ybGQtd2ViYXBwL2FsdGVybmF0ZS12ZXJzaW9uLWJ1bmRsZS9wb20ueG1sIGIvZXhhbXBsZXMvb3NnaS1oZWxsb3dvcmxkLXdlYmFwcC9hbHRlcm5hdGUtdmVyc2lvbi1idW5kbGUvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTU4ZmRjCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvb3NnaS1oZWxsb3dvcmxkLXdlYmFwcC9hbHRlcm5hdGUtdmVyc2lvbi1idW5kbGUvcG9tLnhtbApAQCAtMCwwICsxLDkyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorCisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm9zZ2ktaGVsbG93b3JsZC13ZWJhcHA8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5vc2dpLWhlbGxvd29ybGQtd2ViYXBwPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmFsdGVybmF0ZS12ZXJzaW9uLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICA8bmFtZT5qZXJzZXktZXhhbXBsZXMtb3NnaS1oZWxsb3dvcmxkLXdlYmFwcC1hbHRlcm5hdGUtdmVyc2lvbjwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5PU0dpIEhlbGxvd29ybGQgV2ViYXBwIC0gYWx0ZXJuYXRlIHZlcnNpb24gYnVuZGxlPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgud3MucnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC53cy5ycy1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPCEtLSB0byBnZW5lcmF0ZSB0aGUgTUFOSUZFU1QtRklMRSByZXF1aXJlZCBieSB0aGUgYnVuZGxlIC0tPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmZlbGl4PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWJ1bmRsZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGV4dGVuc2lvbnM+dHJ1ZTwvZXh0ZW5zaW9ucz4KKyAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5idW5kbGUtbWFuaWZlc3Q8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnByb2Nlc3MtY2xhc3NlczwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+bWFuaWZlc3Q8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxtYW5pZmVzdExvY2F0aW9uPiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L01FVEEtSU5GPC9tYW5pZmVzdExvY2F0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c3VwcG9ydGVkUHJvamVjdFR5cGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHN1cHBvcnRlZFByb2plY3RUeXBlPmJ1bmRsZTwvc3VwcG9ydGVkUHJvamVjdFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3VwcG9ydGVkUHJvamVjdFR5cGU+amFyPC9zdXBwb3J0ZWRQcm9qZWN0VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPC9zdXBwb3J0ZWRQcm9qZWN0VHlwZXM+CisgICAgICAgICAgICAgICAgICAgIDxpbnN0cnVjdGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8QnVuZGxlLVN5bWJvbGljTmFtZT5hZGRpdGlvbmFsLWJ1bmRsZTwvQnVuZGxlLVN5bWJvbGljTmFtZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxCdW5kbGUtTmFtZT5qZXJzZXktZXhhbXBsZXMtb3NnaS1oZWxsb3dvcmxkLXdlYmFwcC1hZGRpdGlvbmFsPC9CdW5kbGUtTmFtZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gdGhpcyB2ZXJzaW9uIGhhcyB0byBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgJ2FkZGl0aW9uYWwtYnVuZGxlJworICAgICAgICAgICAgICAgICAgICAgICAgdmVyc2lvbiBpbiBvcmRlciB0byB0ZXN0IHRoZSBjb3JyZWN0IGJ1bmRsZSByZXNvbHV0aW9uIHdpdGhpbiBPU0dpIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPEJ1bmRsZS1WZXJzaW9uPjIuMi4xPC9CdW5kbGUtVmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxJbXBvcnQtUGFja2FnZT4qPC9JbXBvcnQtUGFja2FnZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFeHBvcnQtUGFja2FnZT5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5vc2dpLmhlbGxvd29ybGQuYWRkaXRpb25hbC5yZXNvdXJjZTwvRXhwb3J0LVBhY2thZ2U+CisgICAgICAgICAgICAgICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+cmVsZWFzZTwvaWQ+CisgICAgICAgICAgICA8IS0tIGRvIG5vdCBjcmVhdGUgc291cmNlIHppcCBidW5kbGVzIC0tPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNraXBBc3NlbWJseT50cnVlPC9za2lwQXNzZW1ibHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICA8L3Byb2ZpbGVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vc2dpLWhlbGxvd29ybGQtd2ViYXBwL2FsdGVybmF0ZS12ZXJzaW9uLWJ1bmRsZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL29zZ2kvaGVsbG93b3JsZC9hZGRpdGlvbmFsL3Jlc291cmNlL0FkZGl0aW9uYWxSZXNvdXJjZS5qYXZhIGIvZXhhbXBsZXMvb3NnaS1oZWxsb3dvcmxkLXdlYmFwcC9hbHRlcm5hdGUtdmVyc2lvbi1idW5kbGUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9vc2dpL2hlbGxvd29ybGQvYWRkaXRpb25hbC9yZXNvdXJjZS9BZGRpdGlvbmFsUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTRiMzdmCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvb3NnaS1oZWxsb3dvcmxkLXdlYmFwcC9hbHRlcm5hdGUtdmVyc2lvbi1idW5kbGUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9vc2dpL2hlbGxvd29ybGQvYWRkaXRpb25hbC9yZXNvdXJjZS9BZGRpdGlvbmFsUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLm9zZ2kuaGVsbG93b3JsZC5hZGRpdGlvbmFsLnJlc291cmNlOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CisKKy8qKgorICogQWx0ZXJuYXRlIHZlcnNpb24gb2YgdGVzdCByZXNvdXJjZSBmb3Igb3NnaS1oZWxsb3dvcmxkLXdlYmFwcCBleGFtcGxlOworICogVGhlIG9yaWdpbmFsIGNsYXNzIHdpdGhpbiBhZGRpdGlvbmFsLWJ1bmRsZSBtb2R1bGUgaGFzIHRoZSBzYW1lIG5hbWUgYW5kIHJlc2lkZXMgd2l0aGluZyB0aGUgc2FtZSBwYWNrYWdlLgorICoKKyAqIFRoZSBjb250YWluaW5nIG1vZHVsZSdzIChhbHRlcm5hdGUtdmVyc2lvbi1idW5kbGUpIHBvbS54bWwgY29uZmlndXJlcyB0aGUgTUFOSUZFU1QgYnVuZGxlIGhlYWRlcnMgYXMgYW4gb2xkZXIgdmVyc2lvbiBvZgorICogYWRkaXRpb25hbC1idW5kbGUuCisgKgorICogQm90aCB2ZXJzaW9ucyBhcmUgdGhlbiBleHBsaWNpdGx5IGxvYWRlZCBpbnRvIE9TR2kgcnVudGltZSBhbmQgdGhlIGNvcnJlY3QgdmVyc2lvbiAodGhlIG9uZSBpbiBhZGRpdGlvbmFsLWJ1bmRsZSBtb2R1bGUpCisgKiBzaG91bGQgYmUgdXNlZCBieSBKZXJzZXkuCisgKgorICogSWYgdGhpcyB2ZXJzaW9uIG9mIHRoZSByZXNvdXJjZSBpcyB1c2VkLCB0aGUgdGVzdCB3aWxsIGZhaWwuCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiL2FkZGl0aW9uYWwiKQorcHVibGljIGNsYXNzIEFkZGl0aW9uYWxSZXNvdXJjZSB7CisgICAgQEdFVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIFN0cmluZyBnZXRBZGRpdGlvbmFsUmVzb3VyY2VNZXNzYWdlKCkgeworICAgICAgICByZXR1cm4gIldST05HIFZFUlNJT04gb2YgYWRkaXRpb25hbCBCdW5kbGUhIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vc2dpLWhlbGxvd29ybGQtd2ViYXBwL2Z1bmN0aW9uYWwtdGVzdC9wb20ueG1sIGIvZXhhbXBsZXMvb3NnaS1oZWxsb3dvcmxkLXdlYmFwcC9mdW5jdGlvbmFsLXRlc3QvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTRhZWFmCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvb3NnaS1oZWxsb3dvcmxkLXdlYmFwcC9mdW5jdGlvbmFsLXRlc3QvcG9tLnhtbApAQCAtMCwwICsxLDI1NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKworICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5vc2dpLWhlbGxvd29ybGQtd2ViYXBwPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMub3NnaS1oZWxsb3dvcmxkLXdlYmFwcDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5mdW5jdGlvbmFsLXRlc3Q8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktZXhhbXBsZXMtb3NnaS1oZWxsb3dvcmxkLXdlYmFwcC10ZXN0PC9uYW1lPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPCEtLSBleGFtcGxlIHdhciBidW5kbGUgLS0+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMub3NnaS1oZWxsb3dvcmxkLXdlYmFwcDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPndhci1idW5kbGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dHlwZT53YXI8L3R5cGU+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLm9zZ2ktaGVsbG93b3JsZC13ZWJhcHA8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hZGRpdGlvbmFsLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLm9zZ2ktaGVsbG93b3JsZC13ZWJhcHA8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hbHRlcm5hdGUtdmVyc2lvbi1idW5kbGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktaGsyPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNsaWVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5hbm5vdGF0aW9uPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguYW5ub3RhdGlvbi1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmhrMi5leHRlcm5hbDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmFvcGFsbGlhbmNlLXJlcGFja2FnZWQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuamF2YXNzaXN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXNzaXN0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPCEtLSBsb2dnaW5nIC0tPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnNsZjRqLWxvZzRqMTI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjYuNDwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDwhLS0gSlVuaXQgYW5kIFBheC1FeGFtIGRlcGVuZGVuY2llcyAtLT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcub3BzNGoucGF4LmV4YW08L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5wYXgtZXhhbS1qdW5pdDQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcub3BzNGoucGF4LmV4YW08L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5wYXgtZXhhbS1jb250YWluZXItZm9ya2VkPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm9wczRqLnBheC5leGFtPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGF4LWV4YW0tbGluay1tdm48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcub3BzNGoucGF4LndlYjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnBheC13ZWItamV0dHktYnVuZGxlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm9wczRqLnBheC53ZWI8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5wYXgtd2ViLWV4dGVuZGVyLXdhcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8IS0tIE9TR2kgcnVudGltZSAtIEZlbGl4IC0tPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZmVsaXg8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuYXBhY2hlLmZlbGl4LmV2ZW50YWRtaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmZlbGl4PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmFwYWNoZS5mZWxpeC5mcmFtZXdvcms8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZmVsaXg8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuYXBhY2hlLmZlbGl4LmZyYW1ld29yay5zZWN1cml0eTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgIDwhLS0gdW5jb21tZW50IHRoZSBmb2xsb3dpbmcgZGVwZW5kZW5jeSB0byBnZXQgYWJpbGl0eQorICAgICAgICAgICAgICB0byBydW4gZmVsaXggY29uc29sZSBpbiB0aGUgdGVzdCAtLT4KKyAgICAgICAgIDwhLS1kZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5mZWxpeDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5hcGFjaGUuZmVsaXguc2hlbGwucmVtb3RlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+MS4xLjI8L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcub3NnaS5jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICAgICAgPC9leGNsdXNpb25zPgorICAgICAgICAgPC9kZXBlbmRlbmN5LS0+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcub3BzNGoucGF4LmV4YW08L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGF4ZXhhbS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Z2VuZXJhdGUtY29uZmlnPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5nZW5lcmF0ZS1kZXBlbmRzLWZpbGU8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpZD50ZXN0LWNvbXBpbGU8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnRlc3QtY29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+dGVzdENvbXBpbGU8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVzb3VyY2VzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wcm9jZXNzLXRlc3QtcmVzb3VyY2VzPC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD50ZXN0UmVzb3VyY2VzPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGZvcmtNb2RlPmFsd2F5czwvZm9ya01vZGU+CisgICAgICAgICAgICAgICAgICAgIDxlbmFibGVBc3NlcnRpb25zPmZhbHNlPC9lbmFibGVBc3NlcnRpb25zPgorICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoRGVwZW5kZW5jeUV4Y2x1ZGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aERlcGVuZW5jeUV4Y2x1ZGU+b3JnLmFwYWNoZS5mZWxpeDpvcmcub3NnaS5jb3JlPC9jbGFzc3BhdGhEZXBlbmVuY3lFeGNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aERlcGVuZW5jeUV4Y2x1ZGU+b3JnLm9zZ2k6b3JnLm9zZ2kuY29yZTwvY2xhc3NwYXRoRGVwZW5lbmN5RXhjbHVkZT4KKyAgICAgICAgICAgICAgICAgICAgPC9jbGFzc3BhdGhEZXBlbmRlbmN5RXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlkPnRlc3Q8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnRlc3Q8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnRlc3Q8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnJlbGVhc2U8L2lkPgorICAgICAgICAgICAgPCEtLSBkbyBub3QgY3JlYXRlIHNvdXJjZSB6aXAgYnVuZGxlcyAtLT4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxza2lwQXNzZW1ibHk+dHJ1ZTwvc2tpcEFzc2VtYmx5PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnNvbmFyPC9pZD4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZGlzYWJsZSBKYUNvQ28gbGlzdGVuZXIgYmVjYXVzZSBpdCdzIG5vdCB3b3JraW5nIHdpdGggPGZvcmtNb2RlPmFsd2F5czwvZm9yaz4gKDxyZXVzZUZvcmtzPmZhbHNlPC9yZXVzZUZvcmtzPiByZXNwZWN0aXZlbHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBzOi8vamlyYS5zb25hcnNvdXJjZS5jb20vYnJvd3NlL1NPTkFSSkFWQS03MjggKGh0dHBzOi8vZ2l0aHViLmNvbS9Tb25hclNvdXJjZS9zb25hci1qYXZhL3B1bGwvMzI0KSAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnRpZXMgY29tYmluZS5zZWxmPSJvdmVycmlkZSIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICA8L3Byb2ZpbGVzPgorCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxzdXJlZmlyZS5zZWN1cml0eS5hcmdsaW5lPi1EZmVsaXgucG9saWN5PSR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3Rlc3QtY2xhc3Nlcy9mZWxpeC5wb2xpY3kgLURydW50aW1lLnBvbGljeT0ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS90ZXN0LWNsYXNzZXMvcnVudGltZS5wb2xpY3k8L3N1cmVmaXJlLnNlY3VyaXR5LmFyZ2xpbmU+CisgICAgPC9wcm9wZXJ0aWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vc2dpLWhlbGxvd29ybGQtd2ViYXBwL2Z1bmN0aW9uYWwtdGVzdC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvdGVzdC9BYnN0cmFjdFdlYkFwcFRlc3QuamF2YSBiL2V4YW1wbGVzL29zZ2ktaGVsbG93b3JsZC13ZWJhcHAvZnVuY3Rpb25hbC10ZXN0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvaGVsbG93b3JsZC90ZXN0L0Fic3RyYWN0V2ViQXBwVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YmQyOGEKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9vc2dpLWhlbGxvd29ybGQtd2ViYXBwL2Z1bmN0aW9uYWwtdGVzdC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvdGVzdC9BYnN0cmFjdFdlYkFwcFRlc3QuamF2YQpAQCAtMCwwICsxLDM2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5oZWxsb3dvcmxkLnRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5EaWN0aW9uYXJ5OworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lb3V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5Qcm9wZXJ0aWVzSGVscGVyOworCitpbXBvcnQgb3JnLm9wczRqLnBheC5leGFtLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wczRqLnBheC5leGFtLk9wdGlvbjsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5TZXJ2aWNlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UuY29uZHBlcm1hZG1pbi5Db25kaXRpb25hbFBlcm1pc3Npb25BZG1pbjsKK2ltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLmNvbmRwZXJtYWRtaW4uQ29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mbzsKK2ltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLmNvbmRwZXJtYWRtaW4uQ29uZGl0aW9uYWxQZXJtaXNzaW9uVXBkYXRlOworaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UuZXZlbnQuRXZlbnQ7CitpbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5ldmVudC5FdmVudENvbnN0YW50czsKK2ltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLmV2ZW50LkV2ZW50SGFuZGxlcjsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcub3BzNGoucGF4LmV4YW0uQ29yZU9wdGlvbnMuanVuaXRCdW5kbGVzOworaW1wb3J0IHN0YXRpYyBvcmcub3BzNGoucGF4LmV4YW0uQ29yZU9wdGlvbnMubWF2ZW5CdW5kbGU7CitpbXBvcnQgc3RhdGljIG9yZy5vcHM0ai5wYXguZXhhbS5Db3JlT3B0aW9ucy5vcHRpb25zOworaW1wb3J0IHN0YXRpYyBvcmcub3BzNGoucGF4LmV4YW0uQ29yZU9wdGlvbnMuc3lzdGVtUHJvcGVydHk7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0V2ViQXBwVGVzdCB7CisKKyAgICBASW5qZWN0CisgICAgQnVuZGxlQ29udGV4dCBidW5kbGVDb250ZXh0OworICAgIC8qKgorICAgICAqIG1heGltdW0gd2FpdGluZyB0aW1lIGZvciBydW50aW1lIGluaXRpYWxpemF0aW9uIGFuZCBKZXJzZXkgZGVwbG95bWVudAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBNQVhfV0FJVElOR19TRUNPTkRTID0gMTBMOworICAgIC8qKgorICAgICAqIExhdGNoIGZvciBibG9ja2luZyB0aGUgdGVzdGluZyB0aHJlYWQgdW50aWwgdGhlIHJ1bnRpbWUgaXMgcmVhZHkgYW5kCisgICAgICogSmVyc2V5IGRlcGxveWVkCisgICAgICovCisgICAgZmluYWwgQ291bnREb3duTGF0Y2ggY291bnREb3duTGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IHBvcnQgPSBnZXRQcm9wZXJ0eSgiamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0IiwgODA4MCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIHJ1bnRpbWVQb2xpY3kgPSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKKyAgICAgICAgICAgIFByb3BlcnRpZXNIZWxwZXIuZ2V0U3lzdGVtUHJvcGVydHkoInJ1bnRpbWUucG9saWN5IikpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBmZWxpeFBvbGljeSA9IEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKFByb3BlcnRpZXNIZWxwZXIuZ2V0U3lzdGVtUHJvcGVydHkoImZlbGl4LnBvbGljeSIpKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVYVCA9ICIvaGVsbG93b3JsZCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIGJhc2VVcmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3QiKS5wb3J0KHBvcnQpLnBhdGgoQ09OVEVYVCkuYnVpbGQoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihBYnN0cmFjdFdlYkFwcFRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIC8qKgorICAgICAqIEFsbG93IHN1YmNsYXNzZXMgdG8gZGVmaW5lIGFkZGl0aW9uYWwgT1NHaSBjb25maWd1cmF0aW9uIC0gY2FsbGVkIGFmdGVyCisgICAgICogZ2VuZXJpY09zZ2lPcHRpb25zKCkgYW5kIGpldHR5T3B0aW9ucygpCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgcGF4IGV4YW0gT3B0aW9ucworICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBMaXN0PE9wdGlvbj4gb3NnaVJ1bnRpbWVPcHRpb25zKCk7CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmljIE9TR2kgb3B0aW9ucyAtIGRlZmluZXMgd2hpY2ggZGVwZW5kZW5jaWVzIChidW5kbGVzKSBzaG91bGQgYmUKKyAgICAgKiBsb2FkZWQgaW50byBydW50aW1lCisgICAgICovCisgICAgcHVibGljIExpc3Q8T3B0aW9uPiBnZW5lcmljT3NnaU9wdGlvbnMoKSB7CisKKyAgICAgICAgLy8gdW5jb21tZW50IGZvciBkZWJ1Z2dpbmcgdXNpbmcgZmVsaXggY29uc29sZSAobG9va3VwIGdvZ28gc3RyaW5nIGluIHRoZSBjb21tbmVudGVkIGxpbmVzIGJlbG93KQorICAgICAgICBTdHJpbmcgZ29nb1ZlcnNpb24gPSAiMC44LjAiOworCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJSZWR1bmRhbnRTdHJpbmdUb1N0cmluZyIpCisgICAgICAgIExpc3Q8T3B0aW9uPiBvcHRpb25zID0gQXJyYXlzLmFzTGlzdChvcHRpb25zKAorICAgICAgICAgICAgICAgIC8vIHZtT3B0aW9uKCItWHJ1bmpkd3A6dHJhbnNwb3J0PWR0X3NvY2tldCxzZXJ2ZXI9eSxzdXNwZW5kPXksYWRkcmVzcz01MDA1IiksCisgICAgICAgICAgICAgICAgLy8gdm1PcHRpb24oIi1EamF2YS5zZWN1cml0eS5kZWJ1Zz1zY2wiKSwKKworICAgICAgICAgICAgICAgIC8vIHVuY29tbWVudCBmb3IgdmVyYm9zZSBjbGFzcyBsb2FkaW5nIGluZm8KKyAgICAgICAgICAgICAgICAvLyB2bU9wdGlvbigiLXZlcmJvc2U6Y2xhc3MiKSwKKworICAgICAgICAgICAgICAgIC8vIGJvb3REZWxlZ2F0aW9uUGFja2FnZSgib3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LioiKSwKKworICAgICAgICAgICAgICAgIHN5c3RlbVByb3BlcnR5KCJqYXZhLnNlY3VyaXR5Lm1hbmFnZXIiKS52YWx1ZSgiIiksCisgICAgICAgICAgICAgICAgc3lzdGVtUHJvcGVydHkoImZlbGl4LnBvbGljeSIpLnZhbHVlKGZlbGl4UG9saWN5KSwKKyAgICAgICAgICAgICAgICBzeXN0ZW1Qcm9wZXJ0eSgiamF2YS5zZWN1cml0eS5wb2xpY3kiKS52YWx1ZShydW50aW1lUG9saWN5KSwKKyAgICAgICAgICAgICAgICBzeXN0ZW1Qcm9wZXJ0eShvcmcub3NnaS5mcmFtZXdvcmsuQ29uc3RhbnRzLkZSQU1FV09SS19TRUNVUklUWSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZShvcmcub3NnaS5mcmFtZXdvcmsuQ29uc3RhbnRzLkZSQU1FV09SS19TRUNVUklUWV9PU0dJKSwKKyAgICAgICAgICAgICAgICBzeXN0ZW1Qcm9wZXJ0eSgib3JnLm9zZ2kuc2VydmljZS5odHRwLnBvcnQiKS52YWx1ZShTdHJpbmcudmFsdWVPZihwb3J0KSksCisgICAgICAgICAgICAgICAgc3lzdGVtUHJvcGVydHkoIm9yZy5vc2dpLmZyYW1ld29yay5zeXN0ZW0ucGFja2FnZXMuZXh0cmEiKS52YWx1ZSgiamF2YXguYW5ub3RhdGlvbiIpLAorICAgICAgICAgICAgICAgIHN5c3RlbVByb3BlcnR5KCJqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQiKS52YWx1ZShTdHJpbmcudmFsdWVPZihwb3J0KSksCisgICAgICAgICAgICAgICAgLy8gc3lzdGVtUHJvcGVydHkoQnVuZGxlTG9jYXRpb25Qcm9wZXJ0eSkudmFsdWUoYnVuZGxlTG9jYXRpb24pLAorCisgICAgICAgICAgICAgICAgLy8gZG8gbm90IHJlbW92ZSB0aGUgZm9sbG93aW5nIGxpbmUKKyAgICAgICAgICAgICAgICBzeXN0ZW1Qcm9wZXJ0eSgib3JnLm9wczRqLnBheC5sb2dnaW5nLkRlZmF1bHRTZXJ2aWNlTG9nLmxldmVsIikudmFsdWUoIkZJTkVTVCIpLAorICAgICAgICAgICAgICAgIC8vIHVuY29tbWVudCB0aGUgZm9sbG93aW5nIDQgbGluZXMgc2hvdWxkIHlvdSBuZWVkIHRvIGRlYnVnIGZyb20gdGggZmVsaXggY29uc29sZQorICAgICAgICAgICAgICAgIC8vIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmFwYWNoZS5mZWxpeCIpLmFydGlmYWN0SWQoIm9yZy5hcGFjaGUuZmVsaXguZ29nby5ydW50aW1lIikudmVyc2lvbihnb2dvVmVyc2lvbiksCisgICAgICAgICAgICAgICAgLy8gbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuYXBhY2hlLmZlbGl4IikuYXJ0aWZhY3RJZCgib3JnLmFwYWNoZS5mZWxpeC5nb2dvLnNoZWxsIikudmVyc2lvbihnb2dvVmVyc2lvbiksCisgICAgICAgICAgICAgICAgLy8gbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuYXBhY2hlLmZlbGl4IikuYXJ0aWZhY3RJZCgib3JnLmFwYWNoZS5mZWxpeC5nb2dvLmNvbW1hbmQiKS52ZXJzaW9uKGdvZ29WZXJzaW9uKSwKKyAgICAgICAgICAgICAgICAvLyBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5hcGFjaGUuZmVsaXgiKS5hcnRpZmFjdElkKCJvcmcuYXBhY2hlLmZlbGl4LnNoZWxsLnJlbW90ZSIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCJvcmcuYXBhY2hlLmZlbGl4IiwgIm9yZy5hcGFjaGUuZmVsaXguZnJhbWV3b3JrLnNlY3VyaXR5IikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisgICAgICAgICAgICAgICAgLy8gdW5jb21tZW50IGZvciBsb2dnaW5nIChkbyBub3QgcmVtb3ZlIHRoZSBmb2xsb3dpbmcgdHdvIGxpbmVzKQorICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgib3JnLm9wczRqLnBheC5sb2dnaW5nIiwgInBheC1sb2dnaW5nLWFwaSIsICIxLjQiKSwKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoIm9yZy5vcHM0ai5wYXgubG9nZ2luZyIsICJwYXgtbG9nZ2luZy1zZXJ2aWNlIiwgIjEuNCIpLAorCisgICAgICAgICAgICAgICAgLy8gamF2YXguYW5ub3RhdGlvbiBtdXN0IGdvIGZpcnN0IQorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgiamF2YXguYW5ub3RhdGlvbiIpLmFydGlmYWN0SWQoImphdmF4LmFubm90YXRpb24tYXBpIikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisgICAgICAgICAgICAgICAgLy8gcGF4IGV4YW0gZGVwZW5kZW5jaWVzCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoIm9yZy5vcHM0ai5wYXgudXJsIiwgInBheC11cmwtbXZuIiksCisgICAgICAgICAgICAgICAganVuaXRCdW5kbGVzKCksIC8vIGFkZHMganVuaXQgY2xhc3NlcyB0byB0aGUgT1NHaSBjb250ZXh0CisKKyAgICAgICAgICAgICAgICAvLyBISzIKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5nbGFzc2Zpc2guaGsyIikuYXJ0aWZhY3RJZCgiaGsyLWFwaSIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmdsYXNzZmlzaC5oazIiKS5hcnRpZmFjdElkKCJvc2dpLXJlc291cmNlLWxvY2F0b3IiKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5nbGFzc2Zpc2guaGsyIikuYXJ0aWZhY3RJZCgiaGsyLWxvY2F0b3IiKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5nbGFzc2Zpc2guaGsyIikuYXJ0aWZhY3RJZCgiaGsyLXV0aWxzIikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuZ2xhc3NmaXNoLmhrMi5leHRlcm5hbCIpLmFydGlmYWN0SWQoImphdmF4LmluamVjdCIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmdsYXNzZmlzaC5oazIuZXh0ZXJuYWwiKS5hcnRpZmFjdElkKCJhb3BhbGxpYW5jZS1yZXBhY2thZ2VkIikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuamF2YXNzaXN0IikuYXJ0aWZhY3RJZCgiamF2YXNzaXN0IikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisgICAgICAgICAgICAgICAgLy8gSkFYLVJTIEFQSQorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgiamF2YXgud3MucnMiKS5hcnRpZmFjdElkKCJqYXZheC53cy5ycy1hcGkiKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKyAgICAgICAgICAgICAgICAvLyB2YWxpZGF0aW9uIC0gcmVxdWlyZWQgYnkgamVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmUKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoImphdmF4LnZhbGlkYXRpb24iKS5hcnRpZmFjdElkKCJ2YWxpZGF0aW9uLWFwaSIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgIC8vIEplcnNleSBidW5kbGVzCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlIikuYXJ0aWZhY3RJZCgiamVyc2V5LWNvbW1vbiIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZSIpLmFydGlmYWN0SWQoImplcnNleS1zZXJ2ZXIiKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmUiKS5hcnRpZmFjdElkKCJqZXJzZXktY2xpZW50IikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzIikuYXJ0aWZhY3RJZCgiamVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmUiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0IikuYXJ0aWZhY3RJZCgiamVyc2V5LWhrMiIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgIC8vIFRob3NlIHR3byBidW5kbGVzIGhhdmUgZGlmZmVyZW50ICh1bmlxdWUpIG1hdmVuIGNvb3JkaW5hdGVzLCBidXQgcmVwcmVzZW50IHRoZSBzYW1lIE9TR2kgYnVuZGxlIGluIHR3bworICAgICAgICAgICAgICAgIC8vIGRpZmZlcmVudCB2ZXJzaW9ucy4KKyAgICAgICAgICAgICAgICAvLyAoc2VlIHRoZSBtYXZlbiBidW5kbGUgcGx1Z2luIGNvbmZpZ3VyYXRpb24gaW4gZWFjaCBvZiB0aGUgdHdvIHBvbS54bWwgZmlsZXMKKyAgICAgICAgICAgICAgICAvLyBCb3RoIGJ1bmRsZXMgYXJlIGV4cGxpY2l0bHkgbG9hZGVkIGhlcmUgdG8gZW5zdXJlLCB0aGF0IGJvdGggY28tZXhpc3Qgd2l0aGluIHRoZSBPU0dpIHJ1bnRpbWU7CisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5vc2dpLWhlbGxvd29ybGQtd2ViYXBwIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFydGlmYWN0SWQoImFkZGl0aW9uYWwtYnVuZGxlIikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisgICAgICAgICAgICAgICAgLy8gVGhlIGFsdGVybmF0ZS12ZXJzaW9uLWJ1bmRsZSBjb250YWlucyB0aGUgc2FtZSByZXNvdXJjZSBpbiB0aGUgc2FtZSBwYWNrYWdlCisgICAgICAgICAgICAgICAgLy8gKG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLm9zZ2kuaGVsbG93b3JsZC5hZGRpdGlvbmFsLnJlc291cmNlLkFkZGl0aW9uYWxSZXNvdXJjZSksCisgICAgICAgICAgICAgICAgLy8gbWFwcGVkIHRvIHRoZSBzYW1lIFVSSSAoL2FkZGl0aW9uYWwpLCBidXQgcmV0dXJuaW5nIGEgZGlmZmVyZW50IHN0cmluZyBhcyBhIHJlc3BvbnNlLgorICAgICAgICAgICAgICAgIC8vIC0tLT4gaWYgdGhlIHRlc3QgcGFzc2VzLCBpdCBlbnN1cmVzLCB0aGF0IEplcnNleSBzZWVzL3VzZXMgdGhlIGNvcnJlY3QgdmVyc2lvbiBvZiB0aGUgYnVuZGxlCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5vc2dpLWhlbGxvd29ybGQtd2ViYXBwIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFydGlmYWN0SWQoImFsdGVybmF0ZS12ZXJzaW9uLWJ1bmRsZSIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMub3NnaS1oZWxsb3dvcmxkLXdlYmFwcCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcnRpZmFjdElkKCJ3YXItYnVuZGxlIikudHlwZSgid2FyIikudmVyc2lvbkFzSW5Qcm9qZWN0KCkKKyAgICAgICAgICAgICAgICAvLyB1bmNvbW1lbnQgZm9yIGRlYnVnZ2luZworICAgICAgICAgICAgICAgIC8vIHZtT3B0aW9uKCAiLVhydW5qZHdwOnRyYW5zcG9ydD1kdF9zb2NrZXQsc2VydmVyPXksc3VzcGVuZD15LGFkZHJlc3M9NTAwNSIgKQorICAgICAgICAgICAgICAgICkpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBsb2NhbFJlcG9zaXRvcnkgPSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChQcm9wZXJ0aWVzSGVscGVyLmdldFN5c3RlbVByb3BlcnR5KCJsb2NhbFJlcG9zaXRvcnkiKSk7CisgICAgICAgIGlmIChsb2NhbFJlcG9zaXRvcnkgIT0gbnVsbCkgeworICAgICAgICAgICAgb3B0aW9ucyA9IG5ldyBBcnJheUxpc3Q8T3B0aW9uPihvcHRpb25zKTsKKyAgICAgICAgICAgIG9wdGlvbnMuYWRkKHN5c3RlbVByb3BlcnR5KCJvcmcub3BzNGoucGF4LnVybC5tdm4ubG9jYWxSZXBvc2l0b3J5IikudmFsdWUobG9jYWxSZXBvc2l0b3J5KSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gb3B0aW9uczsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxPcHRpb24+IGpldHR5T3B0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3Qob3B0aW9ucygKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5vcHM0ai5wYXgud2ViIikuYXJ0aWZhY3RJZCgicGF4LXdlYi1qZXR0eS1idW5kbGUiKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5vcHM0ai5wYXgud2ViIikuYXJ0aWZhY3RJZCgicGF4LXdlYi1leHRlbmRlci13YXIiKS52ZXJzaW9uQXNJblByb2plY3QoKSkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1cGRhdGVQZXJtaXNzaW9uc0Zyb21GaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBmaW5hbCBTZXJ2aWNlUmVmZXJlbmNlIGNwYVJlZiA9IGJ1bmRsZUNvbnRleHQuZ2V0U2VydmljZVJlZmVyZW5jZShDb25kaXRpb25hbFBlcm1pc3Npb25BZG1pbi5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICBmaW5hbCBDb25kaXRpb25hbFBlcm1pc3Npb25BZG1pbiBjb25kaXRpb25hbFBlcm1pc3Npb25BZG1pbiA9IChDb25kaXRpb25hbFBlcm1pc3Npb25BZG1pbikgYnVuZGxlQ29udGV4dAorICAgICAgICAgICAgICAgIC5nZXRTZXJ2aWNlKGNwYVJlZik7CisgICAgICAgIGZpbmFsIENvbmRpdGlvbmFsUGVybWlzc2lvblVwZGF0ZSBwZXJtaXNzaW9uVXBkYXRlID0gY29uZGl0aW9uYWxQZXJtaXNzaW9uQWRtaW4ubmV3Q29uZGl0aW9uYWxQZXJtaXNzaW9uVXBkYXRlKCk7CisgICAgICAgIGZpbmFsIExpc3QgY29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mb3MgPSBwZXJtaXNzaW9uVXBkYXRlLmdldENvbmRpdGlvbmFsUGVybWlzc2lvbkluZm9zKCk7CisKKyAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgZmluYWwgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKGZlbGl4UG9saWN5KSk7CisgICAgICAgICAgICBTdHJpbmcgbGluZTsKKyAgICAgICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IGNwaU5hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworCisgICAgICAgICAgICB3aGlsZSAoKGxpbmUgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmICghbGluZS5zdGFydHNXaXRoKCIvLyIpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbmRpdGlvbmFsUGVybWlzc2lvbkluZm8gY3BpID0gY29uZGl0aW9uYWxQZXJtaXNzaW9uQWRtaW4ubmV3Q29uZGl0aW9uYWxQZXJtaXNzaW9uSW5mbyhsaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNwaU5hbWUgPSBjcGkuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoY3BpTmFtZXMuY29udGFpbnMoY3BpTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJSZWR1bmRhbnQgcG9saWN5IG5hbWUhIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY3BpTmFtZXMuYWRkKGNwaU5hbWUpOworICAgICAgICAgICAgICAgICAgICBjb25kaXRpb25hbFBlcm1pc3Npb25JbmZvcy5hZGQoY3BpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKKyAgICAgICAgICAgIHBlcm1pc3Npb25VcGRhdGUuY29tbWl0KCk7CisKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGJ1bmRsZUNvbnRleHQudW5nZXRTZXJ2aWNlKGNwYVJlZik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZnRlciB0aGUgd2FyIGJ1bmRsZSBpcyBsb2FkZWQgYW5kIGluaXRpYWxpemVkLCBpdCBzZW5kcyBjdXN0b20gT1NHaQorICAgICAqIGV2ZW50ICJqZXJzZXkvdGVzdC9ERVBMT1lFRCI7IFRoaXMgY2xhc3MgaGFuZGxlcyB0aGUgZXZlbnQgKHJlbGVhc2VzIHRoZQorICAgICAqIHdhaXRpbmcgbG9jaykKKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiVW51c2VkRGVjbGFyYXRpb24iKQorICAgIHB1YmxpYyBjbGFzcyBXZWJFdmVudEhhbmRsZXIgaW1wbGVtZW50cyBFdmVudEhhbmRsZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgeworICAgICAgICAgICAgY291bnREb3duTGF0Y2guY291bnREb3duKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgV2ViRXZlbnRIYW5kbGVyKFN0cmluZyBoYW5kbGVyTmFtZSkgeworICAgICAgICAgICAgdGhpcy5oYW5kbGVyTmFtZSA9IGhhbmRsZXJOYW1lOworICAgICAgICB9CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGhhbmRsZXJOYW1lOworCisgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0SGFuZGxlck5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gaGFuZGxlck5hbWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmF0aW9uIG1ldGhvZCBjYWxsZWQgYnkgcGF4LWV4YW0gZnJhbWV3b3JrCisgICAgICoKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoIlVudXNlZERlY2xhcmF0aW9uIikKKyAgICBAQ29uZmlndXJhdGlvbgorICAgIHB1YmxpYyBPcHRpb25bXSBjb25maWd1cmF0aW9uKCkgeworICAgICAgICBMaXN0PE9wdGlvbj4gb3B0aW9ucyA9IG5ldyBMaW5rZWRMaXN0PE9wdGlvbj4oKTsKKworICAgICAgICBvcHRpb25zLmFkZEFsbChnZW5lcmljT3NnaU9wdGlvbnMoKSk7CisgICAgICAgIG9wdGlvbnMuYWRkQWxsKGpldHR5T3B0aW9ucygpKTsKKyAgICAgICAgb3B0aW9ucy5hZGRBbGwob3NnaVJ1bnRpbWVPcHRpb25zKCkpOworCisgICAgICAgIHJldHVybiBvcHRpb25zLnRvQXJyYXkobmV3IE9wdGlvbltvcHRpb25zLnNpemUoKV0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVycyB0aGUgZXZlbnQgaGFuZGxlciBmb3IgY3VzdG9tIGplcnNleS90ZXN0L0RFUExPWUVEIGV2ZW50CisgICAgICovCisgICAgcHVibGljIHZvaWQgZGVmYXVsdE1hbmRhdG9yeUJlZm9yZU1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBidW5kbGVDb250ZXh0LnJlZ2lzdGVyU2VydmljZShFdmVudEhhbmRsZXIuY2xhc3MuZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgIG5ldyBXZWJFdmVudEhhbmRsZXIoIkRlcGxveSBIYW5kbGVyIiksIGdldEhhbmRsZXJTZXJ2aWNlUHJvcGVydGllcygiamVyc2V5L3Rlc3QvREVQTE9ZRUQiKSk7CisKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChTeXN0ZW0uZ2V0U2VjdXJpdHlNYW5hZ2VyKCkpOworCisgICAgICAgIHVwZGF0ZVBlcm1pc3Npb25zRnJvbUZpbGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGVzdCBtZXRob2QgaXRzZWxmIC0gaW5zdGFsbHMgdGhlIHdhci1idW5kbGUgYW5kIHNlbmRzIHR3byB0ZXN0aW5nCisgICAgICogcmVxdWVzdHMKKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIFdlYlRhcmdldCB3ZWJBcHBUZXN0VGFyZ2V0KFN0cmluZyBhcHBSb290KSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBMT0dHRVIuaW5mbyhidW5kbGVMaXN0KCkpOworCisgICAgICAgIC8vIHJlc3RhcnQgd2FyIGJ1bmRsZS4uLgorICAgICAgICBmaW5hbCBCdW5kbGUgd2FyQnVuZGxlID0gbG9va3VwV2FyQnVuZGxlKCk7CisgICAgICAgIHdhckJ1bmRsZS5zdG9wKCk7CisgICAgICAgIHdhckJ1bmRsZS5zdGFydCgpOworCisgICAgICAgIC8vIGFuZCB3YWl0IHVudGlsIGl0J3MgcmVhZHkKKyAgICAgICAgTE9HR0VSLmZpbmUoIldhaXRpbmcgZm9yIGplcnNleS90ZXN0L0RFUExPWUVEIGV2ZW50IHdpdGggdGltZW91dCAiICsgTUFYX1dBSVRJTkdfU0VDT05EUyArICIgc2Vjb25kcy4uLiIpOworICAgICAgICBpZiAoIWNvdW50RG93bkxhdGNoLmF3YWl0KE1BWF9XQUlUSU5HX1NFQ09ORFMsIFRpbWVVbml0LlNFQ09ORFMpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVGltZW91dEV4Y2VwdGlvbigiVGhlIGV2ZW50IGplcnNleS90ZXN0L0RFUExPWUVEIGRpZCBub3QgYXJyaXZlIGluICIKKyAgICAgICAgICAgICAgICAgICAgKyBNQVhfV0FJVElOR19TRUNPTkRTCisgICAgICAgICAgICAgICAgICAgICsgIiBzZWNvbmRzLiBXYWl0aW5nIHRpbWVkIG91dC4iKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBDbGllbnQgYyA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KCk7CisKKyAgICAgICAgLy8gc2VydmVyIHNob3VsZCBiZSBsaXN0ZW5pbmcgbm93IGFuZCBldmVyeXRoaW5nIHNob3VsZCBiZSBpbml0aWFsaXplZAorICAgICAgICByZXR1cm4gYy50YXJnZXQoYmFzZVVyaSArIGFwcFJvb3QpOworCisgICAgfQorCisgICAgcHJpdmF0ZSBCdW5kbGUgbG9va3VwV2FyQnVuZGxlKCkgeworICAgICAgICBmb3IgKEJ1bmRsZSBiIDogYnVuZGxlQ29udGV4dC5nZXRCdW5kbGVzKCkpIHsKKyAgICAgICAgICAgIGlmIChiLmdldFN5bWJvbGljTmFtZSgpLmNvbnRhaW5zKCJ3YXItYnVuZGxlIikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0UHJvcGVydHkoZmluYWwgU3RyaW5nIHZhck5hbWUsIGludCBkZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgaWYgKG51bGwgPT0gdmFyTmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgdmFyVmFsdWUgPSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChQcm9wZXJ0aWVzSGVscGVyLmdldFN5c3RlbVByb3BlcnR5KHZhck5hbWUpKTsKKyAgICAgICAgaWYgKG51bGwgIT0gdmFyVmFsdWUpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQodmFyVmFsdWUpOworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyB3aWxsIHJldHVybiBkZWZhdWx0IHZhbHVlIGJlbG93CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlVzZU9mT2Jzb2xldGVDb2xsZWN0aW9uVHlwZSIsICJ1bmNoZWNrZWQifSkKKyAgICBwcml2YXRlIERpY3Rpb25hcnkgZ2V0SGFuZGxlclNlcnZpY2VQcm9wZXJ0aWVzKFN0cmluZy4uLiB0b3BpY3MpIHsKKyAgICAgICAgRGljdGlvbmFyeSByZXN1bHQgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgICAgIHJlc3VsdC5wdXQoRXZlbnRDb25zdGFudHMuRVZFTlRfVE9QSUMsIHRvcGljcyk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgYnVuZGxlTGlzdCgpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIHNiLmFwcGVuZCgiLS0gQnVuZGxlIGxpc3QgLS0gXG4iKTsKKyAgICAgICAgZm9yIChCdW5kbGUgYiA6IGJ1bmRsZUNvbnRleHQuZ2V0QnVuZGxlcygpKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiJTEkNXMiLCAiWyIgKyBiLmdldEJ1bmRsZUlkKCkgKyAiXSIpKS5hcHBlbmQoIiAiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKFN0cmluZy5mb3JtYXQoIiUxJC03MHMiLCBiLmdldFN5bWJvbGljTmFtZSgpKSkuYXBwZW5kKCIgfCAiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKFN0cmluZy5mb3JtYXQoIiUxJC0yMHMiLCBiLmdldFZlcnNpb24oKSkpLmFwcGVuZCgiIHwiKTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChzdGF0ZVN0cmluZyhiKSkuYXBwZW5kKCIgfCIpOworICAgICAgICAgICAgc2IuYXBwZW5kKGIuZ2V0TG9jYXRpb24oKSkuYXBwZW5kKCJcbiIpOworICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZCgiLS0gXG5cbiIpOworICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBzdGF0ZVN0cmluZyhCdW5kbGUgYikgeworICAgICAgICBzd2l0Y2ggKGIuZ2V0U3RhdGUoKSkgeworICAgICAgICAgICAgY2FzZSBCdW5kbGUuQUNUSVZFOgorICAgICAgICAgICAgICAgIHJldHVybiAiQUNUSVZFIjsKKyAgICAgICAgICAgIGNhc2UgQnVuZGxlLklOU1RBTExFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIklOU1RBTExFRCI7CisgICAgICAgICAgICBjYXNlIEJ1bmRsZS5SRVNPTFZFRDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIlJFU09MVkVEIjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICI/Pz8iOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3NnaS1oZWxsb3dvcmxkLXdlYmFwcC9mdW5jdGlvbmFsLXRlc3Qvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL3Rlc3QvV2ViQXBwRmVsaXhUZXN0LmphdmEgYi9leGFtcGxlcy9vc2dpLWhlbGxvd29ybGQtd2ViYXBwL2Z1bmN0aW9uYWwtdGVzdC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2hlbGxvd29ybGQvdGVzdC9XZWJBcHBGZWxpeFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTZjMjUxCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvb3NnaS1oZWxsb3dvcmxkLXdlYmFwcC9mdW5jdGlvbmFsLXRlc3Qvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9oZWxsb3dvcmxkL3Rlc3QvV2ViQXBwRmVsaXhUZXN0LmphdmEKQEAgLTAsMCArMSwxNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuaGVsbG93b3JsZC50ZXN0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcub3BzNGoucGF4LmV4YW0uQ29yZU9wdGlvbnM7CitpbXBvcnQgb3JnLm9wczRqLnBheC5leGFtLk9wdGlvbjsKK2ltcG9ydCBvcmcub3BzNGoucGF4LmV4YW0uanVuaXQuUGF4RXhhbTsKK2ltcG9ydCBvcmcub3BzNGoucGF4LmV4YW0uc3BpLnJlYWN0b3JzLkV4YW1SZWFjdG9yU3RyYXRlZ3k7CitpbXBvcnQgb3JnLm9wczRqLnBheC5leGFtLnNwaS5yZWFjdG9ycy5QZXJTdWl0ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5vcHM0ai5wYXguZXhhbS5Db3JlT3B0aW9ucy5tYXZlbkJ1bmRsZTsKKworQFJ1bldpdGgoUGF4RXhhbS5jbGFzcykKK0BFeGFtUmVhY3RvclN0cmF0ZWd5KFBlclN1aXRlLmNsYXNzKQorcHVibGljIGNsYXNzIFdlYkFwcEZlbGl4VGVzdCBleHRlbmRzIEFic3RyYWN0V2ViQXBwVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihXZWJBcHBGZWxpeFRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PE9wdGlvbj4gb3NnaVJ1bnRpbWVPcHRpb25zKCkgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChDb3JlT3B0aW9ucy5vcHRpb25zKAorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5ncm91cElkKCJvcmcuYXBhY2hlLmZlbGl4IikuYXJ0aWZhY3RJZCgib3JnLmFwYWNoZS5mZWxpeC5ldmVudGFkbWluIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC52ZXJzaW9uQXNJblByb2plY3QoKQorICAgICAgICApCisgICAgICAgICk7CisgICAgfQorCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIGJlZm9yZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkZWZhdWx0TWFuZGF0b3J5QmVmb3JlTWV0aG9kKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViUmVzb3VyY2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB3ZWJBcHBUZXN0VGFyZ2V0KCIvd2VicmVzb3VyY2VzIik7CisKKyAgICAgICAgLy8gc2VuZCByZXF1ZXN0IGFuZCBjaGVjayByZXNwb25zZSAtIGhlbGxvd29ybGQgcmVzb3VyY2UKKyAgICAgICAgZmluYWwgU3RyaW5nIGhlbGxvUmVzdWx0ID0gdGFyZ2V0LnBhdGgoIi9oZWxsb3dvcmxkIikucmVxdWVzdCgpLmJ1aWxkKCJHRVQiKS5pbnZva2UoKS5yZWFkRW50aXR5KAorICAgICAgICAgICAgICAgIFN0cmluZy5jbGFzcyk7CisgICAgICAgIExPR0dFUi5pbmZvKCJIRUxMTyBSRVNVTFQgPSAiICsgaGVsbG9SZXN1bHQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkhlbGxvIFdvcmxkIiwgaGVsbG9SZXN1bHQpOworCisgICAgICAgIC8vIHNlbmQgcmVxdWVzdCBhbmQgY2hlY2sgcmVzcG9uc2UgLSBhbm90aGVyIHJlc291cmNlCisgICAgICAgIGZpbmFsIFN0cmluZyBhbm90aGVyUmVzdWx0ID0gdGFyZ2V0LnBhdGgoIi9hbm90aGVyIikucmVxdWVzdCgpLmJ1aWxkKCJHRVQiKS5pbnZva2UoKQorICAgICAgICAgICAgICAgIC5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgTE9HR0VSLmluZm8oIkFOT1RIRVIgUkVTVUxUID0gIiArIGFub3RoZXJSZXN1bHQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkFub3RoZXIiLCBhbm90aGVyUmVzdWx0KTsKKworICAgICAgICAvLyBzZW5kIHJlcXVlc3QgYW5kIGNoZWNrIHJlc3BvbnNlIGZvciB0aGUgYWRkaXRpb25hbCBidW5kbGUgLSBzaG91bGQgZmFpbCBub3cKKyAgICAgICAgZmluYWwgU3RyaW5nIGFkZGl0aW9uYWxSZXN1bHQgPSB0YXJnZXQucGF0aCgiL2FkZGl0aW9uYWwiKS5yZXF1ZXN0KCkuYnVpbGQoIkdFVCIpLmludm9rZSgpCisgICAgICAgICAgICAgICAgLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBMT0dHRVIuaW5mbygiQURESVRJT05BTCBSRVNVTFQgPSAiICsgYWRkaXRpb25hbFJlc3VsdCk7CisgICAgICAgIGFzc2VydEVxdWFscygiQWRkaXRpb25hbCBCdW5kbGUhIiwgYWRkaXRpb25hbFJlc3VsdCk7CisKKyAgICAgICAgLy8gc2VuZCByZXF1ZXN0IGFuZCBjaGVjayByZXNwb25zZSBmb3IgdGhlIHN1Yi1wYWNrYWdlZCBhZGRpdGlvbmFsIGJ1bmRsZQorICAgICAgICBmaW5hbCBTdHJpbmcgc3ViQWRkaXRpb25hbFJlc3VsdCA9IHRhcmdldC5wYXRoKCIvc3ViYWRkaXRpb25hbCIpLnJlcXVlc3QoKS5idWlsZCgiR0VUIikuaW52b2tlKCkKKyAgICAgICAgICAgICAgICAucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworCisgICAgICAgIExPR0dFUi5pbmZvKCJTVUItUEFDS0FHRUQgQURESVRJT05BTCBSRVNVTFQgPSAiICsgc3ViQWRkaXRpb25hbFJlc3VsdCk7CisgICAgICAgIGFzc2VydEVxdWFscygiU3ViLXBhY2thZ2VkIEFkZGl0aW9uYWwgQnVuZGxlISIsIHN1YkFkZGl0aW9uYWxSZXN1bHQpOworCisgICAgICAgIC8vIHNlbmQgcmVxdWVzdCBhbmQgY2hlY2sgcmVzcG9uc2UgZm9yIHRoZSBXRUItSU5GIGNsYXNzZXMgbG9jYXRlZCByZXNvdXJjZQorICAgICAgICBmaW5hbCBTdHJpbmcgd2ViSW5mQ2xhc3Nlc1Jlc291cmNlUmVzdWx0ID0gdGFyZ2V0LnBhdGgoIi93ZWJpbmYiKS5yZXF1ZXN0KCkuYnVpbGQoIkdFVCIpLmludm9rZSgpCisgICAgICAgICAgICAgICAgLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBMT0dHRVIuaW5mbygiV0VCLUlORiBDTEFTU0VTIFJFU09VUkNFIFJFU1VMVCA9ICIgKyB3ZWJJbmZDbGFzc2VzUmVzb3VyY2VSZXN1bHQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIldlYkluZkNsYXNzZXNSZXNvdXJjZSIsIHdlYkluZkNsYXNzZXNSZXNvdXJjZVJlc3VsdCk7CisKKyAgICAgICAgLy8gc2VuZCByZXF1ZXN0IGFuZCBjaGVjayByZXNwb25zZSBmb3IgdGhlIFdFQi1JTkYgY2xhc3NlcyBsb2NhdGVkIHJlc291cmNlCisgICAgICAgIGZpbmFsIFN0cmluZyB3ZWJJbmZDbGFzc2VzU3ViUGFja2FnZWRSZXNvdXJjZVJlc3VsdCA9IHRhcmdldC5wYXRoKCIvc3Vid2ViaW5mIikucmVxdWVzdCgpLmJ1aWxkKCJHRVQiKQorICAgICAgICAgICAgICAgIC5pbnZva2UoKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgTE9HR0VSLmluZm8oIldFQi1JTkYgQ0xBU1NFUyBTVUItUEFDS0FHRUQgUkVTT1VSQ0UgUkVTVUxUID0gIiArIHdlYkluZkNsYXNzZXNTdWJQYWNrYWdlZFJlc291cmNlUmVzdWx0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJXZWJJbmZDbGFzc2VzU3ViUGFja2FnZWRSZXNvdXJjZSIsIHdlYkluZkNsYXNzZXNTdWJQYWNrYWdlZFJlc291cmNlUmVzdWx0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb25SZWN1cnNpdmVXZWJSZXNvdXJjZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHdlYkFwcFRlc3RUYXJnZXQoIi9uLXdlYnJlc291cmNlcyIpOworCisgICAgICAgIC8vIHNlbmQgcmVxdWVzdCBhbmQgY2hlY2sgcmVzcG9uc2UgLSBoZWxsb3dvcmxkIHJlc291cmNlCisgICAgICAgIGZpbmFsIFN0cmluZyBoZWxsb1Jlc3VsdCA9IHRhcmdldC5wYXRoKCIvaGVsbG93b3JsZCIpLnJlcXVlc3QoKS5idWlsZCgiR0VUIikuaW52b2tlKCkucmVhZEVudGl0eSgKKyAgICAgICAgICAgICAgICBTdHJpbmcuY2xhc3MpOworICAgICAgICBMT0dHRVIuaW5mbygiSEVMTE8gUkVTVUxUID0gIiArIGhlbGxvUmVzdWx0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJIZWxsbyBXb3JsZCIsIGhlbGxvUmVzdWx0KTsKKworICAgICAgICAvLyBzZW5kIHJlcXVlc3QgYW5kIGNoZWNrIHJlc3BvbnNlIC0gYW5vdGhlciByZXNvdXJjZQorICAgICAgICBmaW5hbCBTdHJpbmcgYW5vdGhlclJlc3VsdCA9IHRhcmdldC5wYXRoKCIvYW5vdGhlciIpLnJlcXVlc3QoKS5idWlsZCgiR0VUIikuaW52b2tlKCkKKyAgICAgICAgICAgICAgICAucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworCisgICAgICAgIExPR0dFUi5pbmZvKCJBTk9USEVSIFJFU1VMVCA9ICIgKyBhbm90aGVyUmVzdWx0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBbm90aGVyIiwgYW5vdGhlclJlc3VsdCk7CisKKyAgICAgICAgLy8gc2VuZCByZXF1ZXN0IGFuZCBjaGVjayByZXNwb25zZSBmb3IgdGhlIGFkZGl0aW9uYWwgYnVuZGxlIC0gc2hvdWxkIGZhaWwgbm93CisgICAgICAgIGZpbmFsIFN0cmluZyBhZGRpdGlvbmFsUmVzdWx0ID0gdGFyZ2V0LnBhdGgoIi9hZGRpdGlvbmFsIikucmVxdWVzdCgpLmJ1aWxkKCJHRVQiKS5pbnZva2UoKQorICAgICAgICAgICAgICAgIC5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgTE9HR0VSLmluZm8oIkFERElUSU9OQUwgUkVTVUxUID0gIiArIGFkZGl0aW9uYWxSZXN1bHQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkFkZGl0aW9uYWwgQnVuZGxlISIsIGFkZGl0aW9uYWxSZXN1bHQpOworCisgICAgICAgIC8vIHNlbmQgcmVxdWVzdCBhbmQgY2hlY2sgcmVzcG9uc2UgZm9yIHRoZSBzdWItcGFja2FnZWQgYWRkaXRpb25hbCBidW5kbGUKKyAgICAgICAgZmluYWwgUmVzcG9uc2Ugc3ViQWRkaXRpb25hbFJlc3BvbnNlID0gdGFyZ2V0LnBhdGgoIi9zdWJhZGRpdGlvbmFsIikucmVxdWVzdCgpLmJ1aWxkKCJHRVQiKS5pbnZva2UoKTsKKworICAgICAgICBMT0dHRVIuaW5mbygiU1VCLVBBQ0tBR0VEIEFERElUSU9OQUwgaHR0cCBzdGF0dXMgPSAiICsgc3ViQWRkaXRpb25hbFJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJlc3BvbnNlLlN0YXR1cy5OT1RfRk9VTkQuZ2V0U3RhdHVzQ29kZSgpLCBzdWJBZGRpdGlvbmFsUmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworCisgICAgICAgIC8vIHNlbmQgcmVxdWVzdCBhbmQgY2hlY2sgcmVzcG9uc2UgZm9yIHRoZSBXRUItSU5GIGNsYXNzZXMgbG9jYXRlZCByZXNvdXJjZQorICAgICAgICBmaW5hbCBTdHJpbmcgd2ViSW5mQ2xhc3Nlc1Jlc291cmNlUmVzdWx0ID0gdGFyZ2V0LnBhdGgoIi93ZWJpbmYiKS5yZXF1ZXN0KCkuYnVpbGQoIkdFVCIpLmludm9rZSgpCisgICAgICAgICAgICAgICAgLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBMT0dHRVIuaW5mbygiV0VCLUlORiBDTEFTU0VTIFJFU09VUkNFIFJFU1VMVCA9ICIgKyB3ZWJJbmZDbGFzc2VzUmVzb3VyY2VSZXN1bHQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIldlYkluZkNsYXNzZXNSZXNvdXJjZSIsIHdlYkluZkNsYXNzZXNSZXNvdXJjZVJlc3VsdCk7CisKKyAgICAgICAgLy8gc2VuZCByZXF1ZXN0IGFuZCBjaGVjayByZXNwb25zZSBmb3IgdGhlIFdFQi1JTkYgY2xhc3NlcyBsb2NhdGVkIHJlc291cmNlCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHdlYkluZkNsYXNzZXNTdWJQYWNrYWdlZFJlc291cmNlUmVzcG9uc2UgPSB0YXJnZXQucGF0aCgiL3N1YndlYmluZiIpLnJlcXVlc3QoKS5idWlsZCgiR0VUIikKKyAgICAgICAgICAgICAgICAuaW52b2tlKCk7CisKKyAgICAgICAgTE9HR0VSLmluZm8oIldFQi1JTkYgQ0xBU1NFUyBTVUItUEFDS0FHRUQgaHR0cCBzdGF0dXMgPSAiICsgd2ViSW5mQ2xhc3Nlc1N1YlBhY2thZ2VkUmVzb3VyY2VSZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhSZXNwb25zZS5TdGF0dXMuTk9UX0ZPVU5ELmdldFN0YXR1c0NvZGUoKSwgd2ViSW5mQ2xhc3Nlc1N1YlBhY2thZ2VkUmVzb3VyY2VSZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3NnaS1oZWxsb3dvcmxkLXdlYmFwcC9mdW5jdGlvbmFsLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL2ZlbGl4LnBvbGljeSBiL2V4YW1wbGVzL29zZ2ktaGVsbG93b3JsZC13ZWJhcHAvZnVuY3Rpb25hbC10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9mZWxpeC5wb2xpY3kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJlMGQ1MAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL29zZ2ktaGVsbG93b3JsZC13ZWJhcHAvZnVuY3Rpb25hbC10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9mZWxpeC5wb2xpY3kKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKyAKK2FsbG93IHsgW29yZy5vc2dpLnNlcnZpY2UuY29uZHBlcm1hZG1pbi5CdW5kbGVMb2NhdGlvbkNvbmRpdGlvbiAiKlN5c3RlbSoiXSAoamF2YS5zZWN1cml0eS5BbGxQZXJtaXNzaW9uKSB9ICJhbGxUb1N5c3RlbSI7CithbGxvdyB7IFtvcmcub3NnaS5zZXJ2aWNlLmNvbmRwZXJtYWRtaW4uQnVuZGxlTG9jYXRpb25Db25kaXRpb24gIipTeXN0ZW0qIl0gKG9yZy5vc2dpLmZyYW1ld29yay5BZG1pblBlcm1pc3Npb24pIH0gImFkbWluVG9TeXN0ZW0iOworYWxsb3cgeyBbb3JnLm9zZ2kuc2VydmljZS5jb25kcGVybWFkbWluLkJ1bmRsZUxvY2F0aW9uQ29uZGl0aW9uICIqU3lzdGVtKiJdIChvcmcub3NnaS5mcmFtZXdvcmsuUGFja2FnZVBlcm1pc3Npb24pIH0gInBhY2thZ2VUb1N5c3RlbSI7CithbGxvdyB7IFtvcmcub3NnaS5zZXJ2aWNlLmNvbmRwZXJtYWRtaW4uQnVuZGxlTG9jYXRpb25Db25kaXRpb24gIiphZGRpdGlvbmFsLWJ1bmRsZSoiXSAoamF2YS5zZWN1cml0eS5BbGxQZXJtaXNzaW9uKSB9ICJhbGxUb0FkZGl0aW9uYWwiOworYWxsb3cgeyBbb3JnLm9zZ2kuc2VydmljZS5jb25kcGVybWFkbWluLkJ1bmRsZUxvY2F0aW9uQ29uZGl0aW9uICIqamF2YXNzaXN0KiJdIChqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb24pIH0gImFsbFRvSmF2YXNzaXN0IjsKK2FsbG93IHsgW29yZy5vc2dpLnNlcnZpY2UuY29uZHBlcm1hZG1pbi5CdW5kbGVMb2NhdGlvbkNvbmRpdGlvbiAiKmphdmF4LndzLnJzKiJdIChqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb24pIH0gImFsbFRvSmF2YXhXc1JzIjsKK2FsbG93IHsgW29yZy5vc2dpLnNlcnZpY2UuY29uZHBlcm1hZG1pbi5CdW5kbGVMb2NhdGlvbkNvbmRpdGlvbiAiKmpldHR5KiJdIChqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb24pIH0gImFsbFRvSmV0dHkiOworYWxsb3cgeyBbb3JnLm9zZ2kuc2VydmljZS5jb25kcGVybWFkbWluLkJ1bmRsZUxvY2F0aW9uQ29uZGl0aW9uICIqaGsyKiJdIChqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb24pIH0gImFsbFRvSGsyIjsKK2FsbG93IHsgW29yZy5vc2dpLnNlcnZpY2UuY29uZHBlcm1hZG1pbi5CdW5kbGVMb2NhdGlvbkNvbmRpdGlvbiAiKm9zZ2kqIl0gKGphdmEuc2VjdXJpdHkuQWxsUGVybWlzc2lvbikgfSAiYWxsVG9Pc2dpIjsKK2FsbG93IHsgW29yZy5vc2dpLnNlcnZpY2UuY29uZHBlcm1hZG1pbi5CdW5kbGVMb2NhdGlvbkNvbmRpdGlvbiAiKm9yZy5hcGFjaGUqIl0gKGphdmEuc2VjdXJpdHkuQWxsUGVybWlzc2lvbikgfSAiYWxsVG9BcGFjaGUiOworYWxsb3cgeyBbb3JnLm9zZ2kuc2VydmljZS5jb25kcGVybWFkbWluLkJ1bmRsZUxvY2F0aW9uQ29uZGl0aW9uICIqb3JnLmFwYWNoZSoiXSAob3JnLm9zZ2kuZnJhbWV3b3JrLkFkbWluUGVybWlzc2lvbikgfSAiYWRtaW5Ub0FwYWNoZSI7CithbGxvdyB7IFtvcmcub3NnaS5zZXJ2aWNlLmNvbmRwZXJtYWRtaW4uQnVuZGxlTG9jYXRpb25Db25kaXRpb24gIipvcmcuYXBhY2hlKiJdIChvcmcub3NnaS5mcmFtZXdvcmsuUGFja2FnZVBlcm1pc3Npb24pIH0gIlBhY2thZ2VUb0FwYWNoZSI7CithbGxvdyB7IFtvcmcub3NnaS5zZXJ2aWNlLmNvbmRwZXJtYWRtaW4uQnVuZGxlTG9jYXRpb25Db25kaXRpb24gIipvcmcub3BzNGoqIl0gKGphdmEuc2VjdXJpdHkuQWxsUGVybWlzc2lvbikgfSAiYWxsVG9PcHM0SiI7CithbGxvdyB7IFtvcmcub3NnaS5zZXJ2aWNlLmNvbmRwZXJtYWRtaW4uQnVuZGxlTG9jYXRpb25Db25kaXRpb24gIipvcmcub3BzNGoqIl0gKG9yZy5vc2dpLmZyYW1ld29yay5BZG1pblBlcm1pc3Npb24pIH0gImFkbWluVG9PcHM0SiI7CithbGxvdyB7IFtvcmcub3NnaS5zZXJ2aWNlLmNvbmRwZXJtYWRtaW4uQnVuZGxlTG9jYXRpb25Db25kaXRpb24gIipvcmcub3BzNGoqIl0gKG9yZy5vc2dpLmZyYW1ld29yay5QYWNrYWdlUGVybWlzc2lvbikgfSAicGFja2FnZVRvT3BzNEoiOworYWxsb3cgeyBbb3JnLm9zZ2kuc2VydmljZS5jb25kcGVybWFkbWluLkJ1bmRsZUxvY2F0aW9uQ29uZGl0aW9uICIqY2xpZW50LWJ1bmRsZSoiXSAoamF2YS5zZWN1cml0eS5BbGxQZXJtaXNzaW9uKSB9ICJhbGxUb0NCIjsKK2FsbG93IHsgW29yZy5vc2dpLnNlcnZpY2UuY29uZHBlcm1hZG1pbi5CdW5kbGVMb2NhdGlvbkNvbmRpdGlvbiAiKndhci1idW5kbGUqIl0gKGphdmEuc2VjdXJpdHkuQWxsUGVybWlzc2lvbikgfSAiYWxsVG9XYXIiOworYWxsb3cgeyBbb3JnLm9zZ2kuc2VydmljZS5jb25kcGVybWFkbWluLkJ1bmRsZUxvY2F0aW9uQ29uZGl0aW9uICIqd2FyLWJ1bmRsZSoiXSAob3JnLm9zZ2kuZnJhbWV3b3JrLkFkbWluUGVybWlzc2lvbikgfSAiYWRtaW5Ub1dhciI7CithbGxvdyB7IFtvcmcub3NnaS5zZXJ2aWNlLmNvbmRwZXJtYWRtaW4uQnVuZGxlTG9jYXRpb25Db25kaXRpb24gImxvY2FsIl0gKGphdmEuc2VjdXJpdHkuQWxsUGVybWlzc2lvbikgfSAiYWxsVG9Mb2NhbCI7CithbGxvdyB7IFtvcmcub3NnaS5zZXJ2aWNlLmNvbmRwZXJtYWRtaW4uQnVuZGxlTG9jYXRpb25Db25kaXRpb24gImxvY2FsIl0gKG9yZy5vc2dpLmZyYW1ld29yay5BZG1pblBlcm1pc3Npb24pIH0gImFkbWluVG9Mb2NhbCI7CithbGxvdyB7IFtvcmcub3NnaS5zZXJ2aWNlLmNvbmRwZXJtYWRtaW4uQnVuZGxlTG9jYXRpb25Db25kaXRpb24gImxvY2FsIl0gKG9yZy5vc2dpLmZyYW1ld29yay5QYWNrYWdlUGVybWlzc2lvbikgfSAicGFja2FnZVRvTG9jYWwiOworYWxsb3cgeyBbb3JnLm9zZ2kuc2VydmljZS5jb25kcGVybWFkbWluLkJ1bmRsZUxvY2F0aW9uQ29uZGl0aW9uICIqamVyc2V5LWNvbW1vbioiXSAob3JnLm9zZ2kuZnJhbWV3b3JrLkFkbWluUGVybWlzc2lvbiAiKiIgImNsYXNzLHJlc29sdmUscmVzb3VyY2UiKSB9ICJhZG1pblBlcm1pc3Npb25Ub0plcnNleUNvbW1vbiI7CithbGxvdyB7IFtvcmcub3NnaS5zZXJ2aWNlLmNvbmRwZXJtYWRtaW4uQnVuZGxlTG9jYXRpb25Db25kaXRpb24gIipqZXJzZXktY29tbW9uKiJdIChvcmcub3NnaS5mcmFtZXdvcmsuUGFja2FnZVBlcm1pc3Npb24pIH0gInBhY2thZ2VQZXJtaXNzaW9uVG9KZXJzZXlDb21tb24iOworYWxsb3cgeyBbb3JnLm9zZ2kuc2VydmljZS5jb25kcGVybWFkbWluLkJ1bmRsZUxvY2F0aW9uQ29uZGl0aW9uICIqamVyc2V5LWNvbW1vbioiXSAoamF2YS5sYW5nLnJlZmxlY3QuUmVmbGVjdFBlcm1pc3Npb24gInN1cHByZXNzQWNjZXNzQ2hlY2tzIikgfSAic3VwcHJlc3NBY2Nlc3NDaGVja3NUb0plcnNleUNvbW1vbiI7CithbGxvdyB7IFtvcmcub3NnaS5zZXJ2aWNlLmNvbmRwZXJtYWRtaW4uQnVuZGxlTG9jYXRpb25Db25kaXRpb24gIipqZXJzZXktY29tbW9uKiJdIChqYXZhLm5ldC5Tb2NrZXRQZXJtaXNzaW9uICIqIiAiY29ubmVjdCxyZXNvbHZlIikgfSAic29ja2V0UGVybWlzc2lvblRvSmVyc2V5Q29tbW9uIjsKK2FsbG93IHsgW29yZy5vc2dpLnNlcnZpY2UuY29uZHBlcm1hZG1pbi5CdW5kbGVMb2NhdGlvbkNvbmRpdGlvbiAiKmplcnNleS1jb21tb24qIl0gKGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiAiYWNjZXNzRGVjbGFyZWRNZW1iZXJzIikgfSAiYWNjZXNzRGVjbGFyZWRNZW1iZXJzVG9KZXJzZXlDb21tb24iOworYWxsb3cgeyBbb3JnLm9zZ2kuc2VydmljZS5jb25kcGVybWFkbWluLkJ1bmRsZUxvY2F0aW9uQ29uZGl0aW9uICIqamVyc2V5LWNvbW1vbioiXSAoamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uICJhY2Nlc3NDbGFzc0luUGFja2FnZS5zdW4ubWlzYyIpIH0gImFjY2Vzc0NsYXNzSW5QYWNrYWdlU3VuTWlzYyI7CithbGxvdyB7IFtvcmcub3NnaS5zZXJ2aWNlLmNvbmRwZXJtYWRtaW4uQnVuZGxlTG9jYXRpb25Db25kaXRpb24gIipqZXJzZXktY29tbW9uKiJdIChqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gImdldENsYXNzTG9hZGVyIikgfSAiZ2V0Q0xUb0plcnNleUNvbW1vbiI7CithbGxvdyB7IFtvcmcub3NnaS5zZXJ2aWNlLmNvbmRwZXJtYWRtaW4uQnVuZGxlTG9jYXRpb25Db25kaXRpb24gIipqZXJzZXktY29tbW9uKiJdIChqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gIm1vZGlmeVRocmVhZCIpIH0gIm1vZGlmeVRocmVhZFRvSmVyc2V5Q29tbW9uIjsKK2FsbG93IHsgW29yZy5vc2dpLnNlcnZpY2UuY29uZHBlcm1hZG1pbi5CdW5kbGVMb2NhdGlvbkNvbmRpdGlvbiAiKmplcnNleS1jb21tb24qIl0gKGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gIioiICJyZWFkIikgfSAicHJvcFJlYWRUb0plcnNleUNvbW1vbiI7CithbGxvdyB7IFtvcmcub3NnaS5zZXJ2aWNlLmNvbmRwZXJtYWRtaW4uQnVuZGxlTG9jYXRpb25Db25kaXRpb24gIipqZXJzZXktY29tbW9uKiJdIChqYXZhLmlvLkZpbGVQZXJtaXNzaW9uICI8PEFMTCBGSUxFUz4+IiAicmVhZCx3cml0ZSIpIH0gImZpbGVSZWFkVG9KZXJzZXlDb21tb24iOworYWxsb3cgeyBbb3JnLm9zZ2kuc2VydmljZS5jb25kcGVybWFkbWluLkJ1bmRsZUxvY2F0aW9uQ29uZGl0aW9uICIqamVyc2V5LWNsaWVudCoiXSAoamF2YS5zZWN1cml0eS5BbGxQZXJtaXNzaW9uKSB9ICJhbGxUb0plcnNleUNsaWVudCI7CithbGxvdyB7IFtvcmcub3NnaS5zZXJ2aWNlLmNvbmRwZXJtYWRtaW4uQnVuZGxlTG9jYXRpb25Db25kaXRpb24gIipqZXJzZXktc2VydmVyKiJdIChvcmcub3NnaS5mcmFtZXdvcmsuQWRtaW5QZXJtaXNzaW9uICIqIiAiY2xhc3MscmVzb2x2ZSxyZXNvdXJjZSIpIH0gImFkbWluUGVybWlzc2lvblRvSmVyc2V5U2VydmVyIjsKK2FsbG93IHsgW29yZy5vc2dpLnNlcnZpY2UuY29uZHBlcm1hZG1pbi5CdW5kbGVMb2NhdGlvbkNvbmRpdGlvbiAiKmplcnNleS1zZXJ2ZXIqIl0gKGphdmEubGFuZy5yZWZsZWN0LlJlZmxlY3RQZXJtaXNzaW9uICJzdXBwcmVzc0FjY2Vzc0NoZWNrcyIpIH0gInN1cHByZXNzQWNjZXNzQ2hlY2tzVG9KZXJzZXlTZXJ2ZXIiOworYWxsb3cgeyBbb3JnLm9zZ2kuc2VydmljZS5jb25kcGVybWFkbWluLkJ1bmRsZUxvY2F0aW9uQ29uZGl0aW9uICIqamVyc2V5LXNlcnZlcioiXSAoamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uICJhY2Nlc3NEZWNsYXJlZE1lbWJlcnMiKSB9ICJhY2Nlc3NEZWNsYXJlZE1lbWJlcnNUb0plcnNleVNlcnZlciI7CithbGxvdyB7IFtvcmcub3NnaS5zZXJ2aWNlLmNvbmRwZXJtYWRtaW4uQnVuZGxlTG9jYXRpb25Db25kaXRpb24gIipqZXJzZXktc2VydmVyKiJdIChqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gInNldENvbnRleHRDbGFzc0xvYWRlciIpIH0gInNldENvbnRleHRDTFRvSmVyc2V5U2VydmVyIjsKK2FsbG93IHsgW29yZy5vc2dpLnNlcnZpY2UuY29uZHBlcm1hZG1pbi5CdW5kbGVMb2NhdGlvbkNvbmRpdGlvbiAiKmplcnNleS1zZXJ2ZXIqIl0gKGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiAiZ2V0Q2xhc3NMb2FkZXIiKSB9ICJnZXRDbGFzc0xvYWRlclRvSmVyc2V5U2VydmVyIjsKK2FsbG93IHsgW29yZy5vc2dpLnNlcnZpY2UuY29uZHBlcm1hZG1pbi5CdW5kbGVMb2NhdGlvbkNvbmRpdGlvbiAiKmplcnNleS1zZXJ2ZXIqIl0gKGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gIioiICJyZWFkIikgfSAicHJvcFJlYWRUb0plcnNleVNlcnZlciI7CithbGxvdyB7IFtvcmcub3NnaS5zZXJ2aWNlLmNvbmRwZXJtYWRtaW4uQnVuZGxlTG9jYXRpb25Db25kaXRpb24gIipqZXJzZXktc2VydmVyKiJdIChqYXZhLmlvLkZpbGVQZXJtaXNzaW9uICI8PEFMTCBGSUxFUz4+IiAicmVhZCx3cml0ZSIpIH0gImZpbGVSZWFkVG9KZXJzZXlTZXJ2ZXIiOworYWxsb3cgeyBbb3JnLm9zZ2kuc2VydmljZS5jb25kcGVybWFkbWluLkJ1bmRsZUxvY2F0aW9uQ29uZGl0aW9uICIqamVyc2V5LXNlcnZlcioiXSAoamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uICJtb2RpZnlUaHJlYWQiKSB9ICJtb2RpZnlUaHJlYWRUb0plcnNleVNlcnZlciI7CithbGxvdyB7IFtvcmcub3NnaS5zZXJ2aWNlLmNvbmRwZXJtYWRtaW4uQnVuZGxlTG9jYXRpb25Db25kaXRpb24gIipqZXJzZXktY29udGFpbmVyKiJdIChqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb24pIH0gImFsbFRvSmVyc2V5Q29udGFpbmVyIjsKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29zZ2ktaGVsbG93b3JsZC13ZWJhcHAvZnVuY3Rpb25hbC10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzIGIvZXhhbXBsZXMvb3NnaS1oZWxsb3dvcmxkLXdlYmFwcC9mdW5jdGlvbmFsLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL2xvZzRqLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZkMjNkZgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL29zZ2ktaGVsbG93b3JsZC13ZWJhcHAvZnVuY3Rpb25hbC10ZXN0L3NyYy90ZXN0L3Jlc291cmNlcy9sb2c0ai5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTQgQEAKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisjCisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyMKKworbG9nNGoucm9vdENhdGVnb3J5PUVSUk9SLCBzdGRvdXQKK2xvZzRqLmFwcGVuZGVyLnN0ZG91dD1vcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlcgorbG9nNGouYXBwZW5kZXIuc3Rkb3V0LmxheW91dC5Db252ZXJzaW9uUGF0dGVybj1bJTMwLjMwY3sxfV0gLSAlbSVuCitsb2c0ai5hcHBlbmRlci5zdGRvdXQubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3NnaS1oZWxsb3dvcmxkLXdlYmFwcC9mdW5jdGlvbmFsLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL3J1bnRpbWUucG9saWN5IGIvZXhhbXBsZXMvb3NnaS1oZWxsb3dvcmxkLXdlYmFwcC9mdW5jdGlvbmFsLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL3J1bnRpbWUucG9saWN5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZDEyNzcKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9vc2dpLWhlbGxvd29ybGQtd2ViYXBwL2Z1bmN0aW9uYWwtdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvcnVudGltZS5wb2xpY3kKQEAgLTAsMCArMSwxMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworZ3JhbnQgeworICBwZXJtaXNzaW9uIGphdmEuc2VjdXJpdHkuQWxsUGVybWlzc2lvbjsKK307CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vc2dpLWhlbGxvd29ybGQtd2ViYXBwL2xpYi1idW5kbGUvcG9tLnhtbCBiL2V4YW1wbGVzL29zZ2ktaGVsbG93b3JsZC13ZWJhcHAvbGliLWJ1bmRsZS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4NTg2YmYKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9vc2dpLWhlbGxvd29ybGQtd2ViYXBwL2xpYi1idW5kbGUvcG9tLnhtbApAQCAtMCwwICsxLDg4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorCisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm9zZ2ktaGVsbG93b3JsZC13ZWJhcHA8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5vc2dpLWhlbGxvd29ybGQtd2ViYXBwPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmxpYi1idW5kbGU8L2FydGlmYWN0SWQ+CisgICAgPG5hbWU+amVyc2V5LWV4YW1wbGVzLW9zZ2ktaGVsbG93b3JsZC13ZWJhcHAtbGliPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPk9TR2kgSGVsbG93b3JsZCBXZWJhcHAgLSBsaWIgYnVuZGxlPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgud3MucnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC53cy5ycy1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPCEtLSB0byBnZW5lcmF0ZSB0aGUgTUFOSUZFU1QtRklMRSByZXF1aXJlZCBieSB0aGUgYnVuZGxlIC0tPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmZlbGl4PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWJ1bmRsZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGV4dGVuc2lvbnM+dHJ1ZTwvZXh0ZW5zaW9ucz4KKyAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5idW5kbGUtbWFuaWZlc3Q8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnByb2Nlc3MtY2xhc3NlczwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+bWFuaWZlc3Q8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxtYW5pZmVzdExvY2F0aW9uPiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L01FVEEtSU5GPC9tYW5pZmVzdExvY2F0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c3VwcG9ydGVkUHJvamVjdFR5cGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHN1cHBvcnRlZFByb2plY3RUeXBlPmJ1bmRsZTwvc3VwcG9ydGVkUHJvamVjdFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3VwcG9ydGVkUHJvamVjdFR5cGU+amFyPC9zdXBwb3J0ZWRQcm9qZWN0VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPC9zdXBwb3J0ZWRQcm9qZWN0VHlwZXM+CisgICAgICAgICAgICAgICAgICAgIDxpbnN0cnVjdGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8QnVuZGxlLVN5bWJvbGljTmFtZT4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L0J1bmRsZS1TeW1ib2xpY05hbWU+CisgICAgICAgICAgICAgICAgICAgICAgICA8SW1wb3J0LVBhY2thZ2U+KjwvSW1wb3J0LVBhY2thZ2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8RXhwb3J0LVBhY2thZ2U+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMub3NnaS5oZWxsb3dvcmxkLnJlc291cmNlPC9FeHBvcnQtUGFja2FnZT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbnN0cnVjdGlvbnM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5yZWxlYXNlPC9pZD4KKyAgICAgICAgICAgIDwhLS0gZG8gbm90IGNyZWF0ZSBzb3VyY2UgemlwIGJ1bmRsZXMgLS0+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2tpcEFzc2VtYmx5PnRydWU8L3NraXBBc3NlbWJseT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29zZ2ktaGVsbG93b3JsZC13ZWJhcHAvbGliLWJ1bmRsZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL29zZ2kvaGVsbG93b3JsZC9yZXNvdXJjZS9Bbm90aGVyUmVzb3VyY2UuamF2YSBiL2V4YW1wbGVzL29zZ2ktaGVsbG93b3JsZC13ZWJhcHAvbGliLWJ1bmRsZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL29zZ2kvaGVsbG93b3JsZC9yZXNvdXJjZS9Bbm90aGVyUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDA1MGUyCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvb3NnaS1oZWxsb3dvcmxkLXdlYmFwcC9saWItYnVuZGxlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvb3NnaS9oZWxsb3dvcmxkL3Jlc291cmNlL0Fub3RoZXJSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMub3NnaS5oZWxsb3dvcmxkLnJlc291cmNlOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CisKK0BQYXRoKCIvYW5vdGhlciIpCitwdWJsaWMgY2xhc3MgQW5vdGhlclJlc291cmNlIHsKKworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW5vdGhlck1lc3NhZ2UoKSB7CisgICAgICAgIHJldHVybiAiQW5vdGhlciI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3NnaS1oZWxsb3dvcmxkLXdlYmFwcC9saWItYnVuZGxlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvb3NnaS9oZWxsb3dvcmxkL3Jlc291cmNlL0hlbGxvV29ybGRSZXNvdXJjZS5qYXZhIGIvZXhhbXBsZXMvb3NnaS1oZWxsb3dvcmxkLXdlYmFwcC9saWItYnVuZGxlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvb3NnaS9oZWxsb3dvcmxkL3Jlc291cmNlL0hlbGxvV29ybGRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5OTg5ODIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9vc2dpLWhlbGxvd29ybGQtd2ViYXBwL2xpYi1idW5kbGUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9vc2dpL2hlbGxvd29ybGQvcmVzb3VyY2UvSGVsbG9Xb3JsZFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5vc2dpLmhlbGxvd29ybGQucmVzb3VyY2U7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKKworQFBhdGgoIi9oZWxsb3dvcmxkIikKK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkUmVzb3VyY2UgeworCisgICAgQEdFVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIFN0cmluZyBnZXRDbGljaGVkTWVzc2FnZSgpIHsKKyAgICAgICAgcmV0dXJuICJIZWxsbyBXb3JsZCI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3NnaS1oZWxsb3dvcmxkLXdlYmFwcC9saWItYnVuZGxlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvb3NnaS9oZWxsb3dvcmxkL3Jlc291cmNlL015QXBwbGljYXRpb24uamF2YSBiL2V4YW1wbGVzL29zZ2ktaGVsbG93b3JsZC13ZWJhcHAvbGliLWJ1bmRsZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL29zZ2kvaGVsbG93b3JsZC9yZXNvdXJjZS9NeUFwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc3OTU2MQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL29zZ2ktaGVsbG93b3JsZC13ZWJhcHAvbGliLWJ1bmRsZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL29zZ2kvaGVsbG93b3JsZC9yZXNvdXJjZS9NeUFwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5vc2dpLmhlbGxvd29ybGQucmVzb3VyY2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworcHVibGljIGNsYXNzIE15QXBwbGljYXRpb24gZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKyAgICBzdGF0aWMgZmluYWwgU2V0PENsYXNzPD8+PiBjbGFzc2VzID0gbmV3IEhhc2hTZXQ8Q2xhc3M8Pz4+KCkgeworICAgICAgICB7CisgICAgICAgICAgICBhZGQoSGVsbG9Xb3JsZFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgICAgIGFkZChBbm90aGVyUmVzb3VyY2UuY2xhc3MpOworICAgICAgICB9fTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgIHJldHVybiBjbGFzc2VzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29zZ2ktaGVsbG93b3JsZC13ZWJhcHAvcG9tLnhtbCBiL2V4YW1wbGVzL29zZ2ktaGVsbG93b3JsZC13ZWJhcHAvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDYxYjVmCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvb3NnaS1oZWxsb3dvcmxkLXdlYmFwcC9wb20ueG1sCkBAIC0wLDAgKzEsNTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisKKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPm9zZ2ktaGVsbG93b3JsZC13ZWJhcHA8L2FydGlmYWN0SWQ+CisgICAgPG5hbWU+amVyc2V5LWV4YW1wbGVzLW9zZ2ktaGVsbG93b3JsZC13ZWJhcHA8L25hbWU+CisgICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KKworICAgIDxtb2R1bGVzPgorICAgICAgICA8bW9kdWxlPndhci1idW5kbGU8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5mdW5jdGlvbmFsLXRlc3Q8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5saWItYnVuZGxlPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+YWRkaXRpb25hbC1idW5kbGU8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5hbHRlcm5hdGUtdmVyc2lvbi1idW5kbGU8L21vZHVsZT4KKyAgICA8L21vZHVsZXM+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnJlbGVhc2U8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3NnaS1oZWxsb3dvcmxkLXdlYmFwcC93YXItYnVuZGxlL3BvbS54bWwgYi9leGFtcGxlcy9vc2dpLWhlbGxvd29ybGQtd2ViYXBwL3dhci1idW5kbGUvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmY4YjE2Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvb3NnaS1oZWxsb3dvcmxkLXdlYmFwcC93YXItYnVuZGxlL3BvbS54bWwKQEAgLTAsMCArMSwxODQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisKKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+b3NnaS1oZWxsb3dvcmxkLXdlYmFwcDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLm9zZ2ktaGVsbG93b3JsZC13ZWJhcHA8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+d2FyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICA8bmFtZT5qZXJzZXktZXhhbXBsZXMtb3NnaS1oZWxsb3dvcmxkLXdlYmFwcC13YWI8L25hbWU+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKworICAgIDxkZXNjcmlwdGlvbj5PU0dpIEhlbGxvd29ybGQgV2ViYXBwIFdBUiBidW5kbGU8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMub3NnaS1oZWxsb3dvcmxkLXdlYmFwcDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmxpYi1idW5kbGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5vc2dpLWhlbGxvd29ybGQtd2ViYXBwPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+YWRkaXRpb25hbC1idW5kbGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5vc2dpLWhlbGxvd29ybGQtd2ViYXBwPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+YWx0ZXJuYXRlLXZlcnNpb24tYnVuZGxlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgud3MucnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC53cy5ycy1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+Mi41PC92ZXJzaW9uPjwhLS0gdGhlIGN1cnJlbnQgcHJvamVjdCdzICR7c2VydmxldDIudmVyc2lvbn0gaXMgMi40IGFuZCB0aGF0J3Mgbm90IGVub3VnaCAtLT4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZmVsaXg8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuYXBhY2hlLmZlbGl4LmV2ZW50YWRtaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPCEtLSB0byBnZW5lcmF0ZSB0aGUgTUFOSUZFU1QtRklMRSByZXF1aXJlZCBieSB0aGUgYnVuZGxlIC0tPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmZlbGl4PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWJ1bmRsZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGV4dGVuc2lvbnM+dHJ1ZTwvZXh0ZW5zaW9ucz4KKyAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5idW5kbGUtbWFuaWZlc3Q8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnByb2Nlc3MtY2xhc3NlczwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+bWFuaWZlc3Q8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxtYW5pZmVzdExvY2F0aW9uPiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L01FVEEtSU5GPC9tYW5pZmVzdExvY2F0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c3VwcG9ydGVkUHJvamVjdFR5cGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHN1cHBvcnRlZFByb2plY3RUeXBlPmJ1bmRsZTwvc3VwcG9ydGVkUHJvamVjdFR5cGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3VwcG9ydGVkUHJvamVjdFR5cGU+d2FyPC9zdXBwb3J0ZWRQcm9qZWN0VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPC9zdXBwb3J0ZWRQcm9qZWN0VHlwZXM+CisgICAgICAgICAgICAgICAgICAgIDxpbnN0cnVjdGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8QnVuZGxlLVN5bWJvbGljTmFtZT4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L0J1bmRsZS1TeW1ib2xpY05hbWU+CisgICAgICAgICAgICAgICAgICAgICAgICA8QnVuZGxlLUNsYXNzUGF0aD4uLFdFQi1JTkYvY2xhc3NlczwvQnVuZGxlLUNsYXNzUGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxJbXBvcnQtUGFja2FnZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBwYWNrYWdlIGlzIGV4cG9ydGVkIGJ5IHR3byBkaWZmZXJlbnQgYnVuZGxlIHZlcnNpb25zIG9mICdhZGRpdGlvbmFsLWJ1bmRsZScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBvbmUgaXMgaW4gdGhlIG1hdmVuIG1vZHVsZSAnYWRkaXRpb25hbC1idW5kbGUnIHdpdGggdGhlIGN1cnJlbnQgJHtwcm9qZWN0LnZlcnNpb259LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIHRoZSBvdGhlciBvbmUgaXMgaW4gdGhlIG1hdmVuIG1vZHVsZSAnYWx0ZXJuYXRlLXZlcnNpb24tYnVuZGxlJyB3aXRoIEJ1bmRsZS1WZXJzaW9uIDIuMi4xCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGUgbmFtZXMgb2YgbWF2ZW4gYXJ0aWZhY3RzIGhhdmUgdG8gYmUgdW5pcXVlLCBidXQgdGhlIG5hbWUgb2YgYnVuZGxlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVmaW5lZCBpbiB0aGUgbWF2ZW4tYnVuZGxlLXBsdWdpbiBjb25maWd1cmF0aW9uKSBpcyB0aGUgc2FtZSBmb3IgYm90aC4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb3RoIGJ1bmRsZXMgKGFkZGl0aW9uYWwtYnVuZGxlIDIuMi4xIGFuZCBhZGRpdGlvbmFsLWJ1bmRsZSAke3Byb2plY3QudmVyc2lvbn0gYXJlIGxvYWRlZCBpbnRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9TR2kgcnVudGltZSwgc28gdGhhdCB0aGVyZSBhcmUgdHdvIHZlcnNpb25zIG9mIHRoZSBzYW1lIHJlc291cmNlIGF2YWlsYWJsZSwgZWFjaCBvbmUgcmV0dXJuaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVudCBzdHJpbmcgYXMgYSByZXNwb25zZS4gSWYgdGhlIGltcG9ydCB2ZXJzaW9uIGlzIGNoYW5nZWQgdG8gWzIuMiwyLjMpIGFzIHByZXBhcmVkIGJlbG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdGVzdCB3aWxsIGZhaWwgKHRoZSByZXNwb25zZSByZXR1cm5lZCBmcm9tIHRoZSBhbHRlcm5hdGUgdmVyc2lvbiBvZiB0aGUgYnVuZGxlIGlzIGRpZmZlcmVudCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5PVEUgLSB0byB0ZXN0IHRoaXMsIHRoZSB2ZXJzaW9uIGhhcyB0byBiZSByZXN0cmljdGVkIGZyb20gYWJvdmUsIG90aGVyd2lzZSBPU0dpIGNhbiBjaG9vc2UgYW55IG9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0d28gYnVuZGxlcywgYXMgdmVyc2lvbj0iMi4yIiBhY3R1YWxseSBtZWFucyAidmVyc2lvbiAyLjIuIG9yIGhpZ2hlciIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBUT0RPOiBuZXdlciBidW5kbGUgcGx1Z2luICgzLjIuMCkgZ2VuZXJhdGVzIHZlcnNpb24gc3RyaW5nIGZyb20gU05BUFNIT1RTIGRpZmZlcmVudGx5IHRoYW4gMi54IHZlcnNpb24gLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMub3NnaS5oZWxsb3dvcmxkLmFkZGl0aW9uYWwucmVzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5vc2dpLmhlbGxvd29ybGQuYWRkaXRpb25hbC5yZXNvdXJjZTt2ZXJzaW9uPSIke3Byb2plY3QudmVyc2lvbn0iLC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMub3NnaS5oZWxsb3dvcmxkLmFkZGl0aW9uYWwucmVzb3VyY2U7dmVyc2lvbj0iWzIuMiwyLjMpIiwgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICAgICAgICAgPC9JbXBvcnQtUGFja2FnZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFeHBvcnQtUGFja2FnZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5vc2dpLmhlbGxvd29ybGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMub3NnaS5oZWxsb3dvcmxkLnJlc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLm9zZ2kuaGVsbG93b3JsZC5hZGRpdGlvbmFsLnJlc291cmNlCisgICAgICAgICAgICAgICAgICAgICAgICA8L0V4cG9ydC1QYWNrYWdlPgorICAgICAgICAgICAgICAgICAgICAgICAgPEVtYmVkLURpcmVjdG9yeT5XRUItSU5GL2xpYjwvRW1iZWQtRGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgICAgICAgPEVtYmVkLURlcGVuZGVuY3k+KjtzY29wZT1jb21waWxlfHJ1bnRpbWU8L0VtYmVkLURlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgICAgICAgICA8RW1iZWQtVHJhbnNpdGl2ZT50cnVlPC9FbWJlZC1UcmFuc2l0aXZlPgorICAgICAgICAgICAgICAgICAgICAgICAgPFdlYmFwcC1Db250ZXh0PmhlbGxvd29ybGQ8L1dlYmFwcC1Db250ZXh0PgorICAgICAgICAgICAgICAgICAgICAgICAgPFdlYi1Db250ZXh0UGF0aD5oZWxsb3dvcmxkPC9XZWItQ29udGV4dFBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICA8QnVuZGxlLUFjdGl2YXRvcj5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5vc2dpLmhlbGxvd29ybGQuV2ViQXBwQ29udGV4dExpc3RlbmVyPC9CdW5kbGUtQWN0aXZhdG9yPgorICAgICAgICAgICAgICAgICAgICAgICAgPF93YWI+c3JjL21haW4vd2ViYXBwPC9fd2FiPgorICAgICAgICAgICAgICAgICAgICA8L2luc3RydWN0aW9ucz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKworICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4td2FyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGF0dGFjaENsYXNzZXM+dHJ1ZTwvYXR0YWNoQ2xhc3Nlcz4KKyAgICAgICAgICAgICAgICAgICAgPGFyY2hpdmU+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWFuaWZlc3RGaWxlPiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L01FVEEtSU5GL01BTklGRVNULk1GPC9tYW5pZmVzdEZpbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWFuaWZlc3RFbnRyaWVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxCdW5kbGUtQ2xhc3NQYXRoPldFQi1JTkYvY2xhc3NlczwvQnVuZGxlLUNsYXNzUGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbWFuaWZlc3RFbnRyaWVzPgorICAgICAgICAgICAgICAgICAgICA8L2FyY2hpdmU+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5yZWxlYXNlPC9pZD4KKyAgICAgICAgICAgIDwhLS0gZG8gbm90IGNyZWF0ZSBzb3VyY2UgemlwIGJ1bmRsZXMgLS0+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2tpcEFzc2VtYmx5PnRydWU8L3NraXBBc3NlbWJseT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICA8aWQ+bW94eTwvaWQ+CisgICAgICAgICAgPGFjdGl2YXRpb24+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICA8bmFtZT5tb3h5PC9uYW1lPgorICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgPC9hY3RpdmF0aW9uPgorICAgICAgICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tb3h5PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke21veHkudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+CisgICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3NnaS1oZWxsb3dvcmxkLXdlYmFwcC93YXItYnVuZGxlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvb3NnaS9oZWxsb3dvcmxkL1dlYkFwcENvbnRleHRMaXN0ZW5lci5qYXZhIGIvZXhhbXBsZXMvb3NnaS1oZWxsb3dvcmxkLXdlYmFwcC93YXItYnVuZGxlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvb3NnaS9oZWxsb3dvcmxkL1dlYkFwcENvbnRleHRMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZGE3NWIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9vc2dpLWhlbGxvd29ybGQtd2ViYXBwL3dhci1idW5kbGUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9vc2dpL2hlbGxvd29ybGQvV2ViQXBwQ29udGV4dExpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5vc2dpLmhlbGxvd29ybGQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHRFdmVudDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0TGlzdGVuZXI7CisKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQWN0aXZhdG9yOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGVDb250ZXh0OworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5TZXJ2aWNlUmVmZXJlbmNlOworaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UuZXZlbnQuRXZlbnQ7CitpbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5ldmVudC5FdmVudEFkbWluOworCisvKioKKyAqIFRoaXMgaXMgdG8gbWFrZSBzdXJlIHdlIHNpZ25hbCB0aGUgYXBwbGljYXRpb24gaGFzIGJlZW4gZGVwbG95ZWQvdW4tZGVwbG95ZWQKKyAqIHZpYSB0aGUgT1NHaSBFdmVudEFkbWluIHNlcnZpY2UuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFdlYkFwcENvbnRleHRMaXN0ZW5lciBpbXBsZW1lbnRzIEJ1bmRsZUFjdGl2YXRvciwgU2VydmxldENvbnRleHRMaXN0ZW5lciB7CisKKyAgICBzdGF0aWMgRXZlbnRBZG1pbiBlYTsKKworICAgIEJ1bmRsZUNvbnRleHQgYmM7CisgICAgU2VydmljZVJlZmVyZW5jZSBlYVJlZjsKKworICAgIHN0YXRpYyBzeW5jaHJvbml6ZWQgRXZlbnRBZG1pbiBnZXRFYSgpIHsKKyAgICAgICAgcmV0dXJuIGVhOworICAgIH0KKworICAgIHN0YXRpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRFYShFdmVudEFkbWluIGVhKSB7CisgICAgICAgIFdlYkFwcENvbnRleHRMaXN0ZW5lci5lYSA9IGVhOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNvbnRleHRJbml0aWFsaXplZChmaW5hbCBTZXJ2bGV0Q29udGV4dEV2ZW50IHNjZSkgeworICAgICAgICBpZiAoZ2V0RWEoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY29udGV4dFBhdGggPSBzY2UuZ2V0U2VydmxldENvbnRleHQoKS5nZXRDb250ZXh0UGF0aCgpOworICAgICAgICAgICAgZ2V0RWEoKS5zZW5kRXZlbnQobmV3IEV2ZW50KCJqZXJzZXkvdGVzdC9ERVBMT1lFRCIsIG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpIHt7CisgICAgICAgICAgICAgICAgcHV0KCJjb250ZXh0LXBhdGgiLCBjb250ZXh0UGF0aCk7CisgICAgICAgICAgICB9fSkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY29udGV4dERlc3Ryb3llZChmaW5hbCBTZXJ2bGV0Q29udGV4dEV2ZW50IHNjZSkgeworICAgICAgICBpZiAoZ2V0RWEoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBnZXRFYSgpLnNlbmRFdmVudChuZXcgRXZlbnQoImplcnNleS90ZXN0L1VOREVQTE9ZRUQiLCBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKSB7eworICAgICAgICAgICAgICAgIHB1dCgiY29udGV4dC1wYXRoIiwgc2NlLmdldFNlcnZsZXRDb250ZXh0KCkuZ2V0Q29udGV4dFBhdGgoKSk7CisgICAgICAgICAgICB9fSkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3RhcnQoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYmMgPSBjb250ZXh0OworICAgICAgICBlYVJlZiA9IGJjLmdldFNlcnZpY2VSZWZlcmVuY2UoRXZlbnRBZG1pbi5jbGFzcy5nZXROYW1lKCkpOworICAgICAgICBpZiAoZWFSZWYgIT0gbnVsbCkgeworICAgICAgICAgICAgc2V0RWEoKEV2ZW50QWRtaW4pIGJjLmdldFNlcnZpY2UoZWFSZWYpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGVhUmVmICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNldEVhKG51bGwpOworICAgICAgICAgICAgYmMudW5nZXRTZXJ2aWNlKGVhUmVmKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29zZ2ktaGVsbG93b3JsZC13ZWJhcHAvd2FyLWJ1bmRsZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL29zZ2kvaGVsbG93b3JsZC9yZXNvdXJjZS9XZWJJbmZDbGFzc2VzUmVzb3VyY2UuamF2YSBiL2V4YW1wbGVzL29zZ2ktaGVsbG93b3JsZC13ZWJhcHAvd2FyLWJ1bmRsZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL29zZ2kvaGVsbG93b3JsZC9yZXNvdXJjZS9XZWJJbmZDbGFzc2VzUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDA5NmMzCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvb3NnaS1oZWxsb3dvcmxkLXdlYmFwcC93YXItYnVuZGxlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvb3NnaS9oZWxsb3dvcmxkL3Jlc291cmNlL1dlYkluZkNsYXNzZXNSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMub3NnaS5oZWxsb3dvcmxkLnJlc291cmNlOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CisKKy8qKgorICogVGhpcyByZXNvdXJjZSBpcyBwaHlzaWNhbGx5IGxvY2F0ZWQgaW4gV0VCLUlORi9jbGFzc2VzIG9mIGEgT1NHSSBidW5kbGUuCisgKgorICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYSBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiL3dlYmluZiIpCitwdWJsaWMgY2xhc3MgV2ViSW5mQ2xhc3Nlc1Jlc291cmNlIHsKKworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0V2ViSW5mTWVzc2FnZSgpIHsKKyAgICAgICAgcmV0dXJuICJXZWJJbmZDbGFzc2VzUmVzb3VyY2UiOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3NnaS1oZWxsb3dvcmxkLXdlYmFwcC93YXItYnVuZGxlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvb3NnaS9oZWxsb3dvcmxkL3Jlc291cmNlL3N1YnBhY2thZ2UvV2ViSW5mQ2xhc3Nlc1N1YlBhY2thZ2VkUmVzb3VyY2UuamF2YSBiL2V4YW1wbGVzL29zZ2ktaGVsbG93b3JsZC13ZWJhcHAvd2FyLWJ1bmRsZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL29zZ2kvaGVsbG93b3JsZC9yZXNvdXJjZS9zdWJwYWNrYWdlL1dlYkluZkNsYXNzZXNTdWJQYWNrYWdlZFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y1YTlhNgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL29zZ2ktaGVsbG93b3JsZC13ZWJhcHAvd2FyLWJ1bmRsZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL29zZ2kvaGVsbG93b3JsZC9yZXNvdXJjZS9zdWJwYWNrYWdlL1dlYkluZkNsYXNzZXNTdWJQYWNrYWdlZFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5vc2dpLmhlbGxvd29ybGQucmVzb3VyY2Uuc3VicGFja2FnZTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCisvKioKKyAqIFRoaXMgcmVzb3VyY2UgaXMgbG9jYXRlZCBpbiBhIHN1Yi1wYWNrYWdlIGFuZCB3aWxsIGJlIGRldGVjdGVkIGJ5IE9TR0kgZnJhbWV3b3JrIG9ubHkgaWYgcmVjdXJzaXZlIHNjYW5uaW5nIGlzIHR1cm5lZCBvbi48YnIvPgorICogQXMgYSBtYXR0ZXIgb2YgZmFjdCwgdGhpcyByZXNvdXJjZSBpcyBwaHlzaWNhbGx5IGxvY2F0ZWQgaW4gV0VCLUlORi9jbGFzc2VzIHdoaWNoIG5lZWRzIHRvIGJlIHRlc3RlZCBhcyB3ZWxsLgorICoKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIi9zdWJ3ZWJpbmYiKQorcHVibGljIGNsYXNzIFdlYkluZkNsYXNzZXNTdWJQYWNrYWdlZFJlc291cmNlIHsKKworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3ViUGFja2FnZWRXZWJJbmZNZXNzYWdlKCkgeworICAgICAgICByZXR1cm4gIldlYkluZkNsYXNzZXNTdWJQYWNrYWdlZFJlc291cmNlIjsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29zZ2ktaGVsbG93b3JsZC13ZWJhcHAvd2FyLWJ1bmRsZS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvZXhhbXBsZXMvb3NnaS1oZWxsb3dvcmxkLXdlYmFwcC93YXItYnVuZGxlL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQwOGNhYQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL29zZ2ktaGVsbG93b3JsZC13ZWJhcHAvd2FyLWJ1bmRsZS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsNjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi40IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkIj4KKyAgICA8bGlzdGVuZXI+CisgICAgICAgIDxsaXN0ZW5lci1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5vc2dpLmhlbGxvd29ybGQuV2ViQXBwQ29udGV4dExpc3RlbmVyPC9saXN0ZW5lci1jbGFzcz4KKyAgICA8L2xpc3RlbmVyPgorICAgIDwhLS0gV2UgZG8gbm90IHJlYWxseSBuZWVkIHRoZSB3ZWxjb21lIGZpbGVzLCBidXQgdGhlIGpldHR5IGJ1bmRsZWQgd2l0aCBwYXggZXhhbSByZXF1aXJlcyBpdCAtLT4KKyAgICA8d2VsY29tZS1maWxlLWxpc3Q+CisgICAgICAgIDx3ZWxjb21lLWZpbGU+aW5kZXguanNwPC93ZWxjb21lLWZpbGU+CisgICAgPC93ZWxjb21lLWZpbGUtbGlzdD4KKworICAgIDwhLS0gSmVyc2V5IEFQUCB0aGF0IGhhcyBlbmFibGVkIHJlY3Vyc2l2ZSBzY2FubmluZyAodGhlIGRlZmF1bHQgdmFsdWUpIC0tPgorICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkplcnNleSBXZWIgQXBwbGljYXRpb248L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmplcnNleS5jb25maWcuc2VydmVyLnByb3ZpZGVyLnBhY2thZ2VzPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPgorICAgICAgICAgICAgICAgICAgICBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5vc2dpLmhlbGxvd29ybGQucmVzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLm9zZ2kuaGVsbG93b3JsZC5hZGRpdGlvbmFsLnJlc291cmNlLAorICAgICAgICAgICAgPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5KZXJzZXkgV2ViIEFwcGxpY2F0aW9uPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vd2VicmVzb3VyY2VzLyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPCEtLSBKZXJzZXkgQVBQIHdpdGggZGlzYWJsZWQgcmVjdXJzaXZlIHNjYW5uaW5nIC0tPgorICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkplcnNleSBXZWIgTm9uLXJlY3Vyc2l2ZSBBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amVyc2V5LmNvbmZpZy5zZXJ2ZXIucHJvdmlkZXIucGFja2FnZXM8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+CisgICAgICAgICAgICAgICAgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMub3NnaS5oZWxsb3dvcmxkLnJlc291cmNlLAorICAgICAgICAgICAgICAgIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLm9zZ2kuaGVsbG93b3JsZC5hZGRpdGlvbmFsLnJlc291cmNlLAorICAgICAgICAgICAgICAgIDwhLS0gJ3BhY2thZ2UnIHBhY2thZ2UgcGF0aCBwcmV2ZW50cyByZWdyZXNzaW9uIGluIG1hdGNoaW5nIHBhY2thZ2VzIGltcGxlbWVudGVkIGluIE9zZ2lSZWdpc3RyeSBhcyBpdCBtYXRjaGVzCisgICAgICAgICAgICAgICAgc3RyaW5nICdvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5vc2dpLmhlbGxvd29ybGQucmVzb3VyY2Uuc3ViW3BhY2thZ2VdJyAtLT4KKyAgICAgICAgICAgICAgICBwYWNrYWdlCisgICAgICAgICAgICA8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amVyc2V5LmNvbmZpZy5zZXJ2ZXIucHJvdmlkZXIuc2Nhbm5pbmcucmVjdXJzaXZlPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPmZhbHNlPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5KZXJzZXkgV2ViIE5vbi1yZWN1cnNpdmUgQXBwbGljYXRpb248L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9uLXdlYnJlc291cmNlcy8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29zZ2ktaHR0cC1zZXJ2aWNlL1JFQURNRS5NRCBiL2V4YW1wbGVzL29zZ2ktaHR0cC1zZXJ2aWNlL1JFQURNRS5NRApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTA5YWQwCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvb3NnaS1odHRwLXNlcnZpY2UvUkVBRE1FLk1ECkBAIC0wLDAgKzEsNDEgQEAKK1svL106ICMgIiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIgorWy8vXTogIyAiICIKK1svL106ICMgIiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgIgorWy8vXTogIyAiIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0ICIKK1svL106ICMgIiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuICIKK1svL106ICMgIiAiCitbLy9dOiAjICIgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZSAiCisKK09TR2kgSHR0cFNlcnZpY2UgRXhhbXBsZQorPT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIGRldmVsb3AgYSBzaW1wbGUgT1NHaSBidW5kbGUKK3JlZ2lzdGVyaW5nIGEgSmVyc2V5IGJhc2VkIFJFU1RmdWwgd2ViIHNlcnZpY2UgYXMgYW4gW09TR2kKK0h0dHBTZXJ2aWNlXShodHRwOi8vd3d3Lm9zZ2kub3JnL2phdmFkb2MvcjR2NDIvb3JnL29zZ2kvc2VydmljZS9odHRwL0h0dHBTZXJ2aWNlLmh0bWwpCisKK0NvbnRlbnRzCistLS0tLS0tLQorCitUaGUgZXhhbXBsZSBidW5kbGUgKHNlZSB0aGUgYGJ1bmRsZWAgbW9kdWxlKSBjb25zaXN0cyBvZiBqdXN0IG9uZSBKZXJzZXkgcmVzb3VyY2U6CisKK2BvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5vc2dpaHR0cHNlcnZpY2UuU3RhdHVzUmVzb3VyY2VgCisKK3RoYXQgcHJvZHVjZXMgYSB0ZXh0dWFsIHJlc3BvbnNlIHRvIGFuIEhUVFAgR0VUCisKK1RoZSBtYXBwaW5nIG9mIHRoZSBVUkkgcGF0aCBzcGFjZSBpcyBwcmVzZW50ZWQgaW4gdGhlIGZvbGxvd2luZyB0YWJsZToKKworVVJJIHBhdGggICAgICAgIHwgUmVzb3VyY2UgY2xhc3MgICB8IEhUVFAgbWV0aG9kCistLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLQorKipfL3N0YXR1c18qKiAgIHwgU3RhdHVzUmVzb3VyY2UgICB8IEdFVAorCitSdW5uaW5nIHRoZSBFeGFtcGxlCistLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RvIHJ1biB0aGUgZXhhbXBsZSwgeW91IHdvdWxkIG5lZWQgdG8gYnVpbGQgdGhlIE9TR2kgYnVuZGxlIGluIHRoZQorYGJ1bmRsZWAgbW9kdWxlIGFuZCBpbnN0YWxsIGl0IHRvIGFuIE9TR2kgcnVudGltZSAoZS5nLiBBcGFjaGUgRmVsaXgpCit0b2dldGhlciB3aXRoIG90aGVyIE9TR2kgYnVuZGxlcy4gTG9vayBhdCB0aGUgYXR0YWNoZWQgYGZ1bmN0aW9uYWwtdGVzdGAKK21vZHVsZSBmb3IgZGV0YWlscyBvbiB0aGUgcHJvZ3JhbWF0aWNhbCBydW50aW1lIGNvbmZpZ3VyYXRpb24KKworVG8gYnVpbGQgdGhlIGJ1bmRsZSBqYXIgZmlsZSBhbmQgcnVuIHRoZSB0ZXN0cywgeW91IGNhbiBqdXN0IGxhdW5jaAorCis+ICAgICBtdm4gY2xlYW4gaW5zdGFsbApkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3NnaS1odHRwLXNlcnZpY2UvYnVuZGxlL3BvbS54bWwgYi9leGFtcGxlcy9vc2dpLWh0dHAtc2VydmljZS9idW5kbGUvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWU5MTRlCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvb3NnaS1odHRwLXNlcnZpY2UvYnVuZGxlL3BvbS54bWwKQEAgLTAsMCArMSw5MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKworICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5vc2dpLWh0dHAtc2VydmljZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLm9zZ2ktaHR0cC1zZXJ2aWNlPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICA8bmFtZT5qZXJzZXktZXhhbXBsZXMtb3NnaS1odHRwLXNlcnZpY2UtYnVuZGxlPC9uYW1lPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisKKyAgICA8ZGVzY3JpcHRpb24+T1NHaSBIdHRwU2VydmljZSBleGFtcGxlIGJ1bmRsZTwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1oazI8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmZlbGl4PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmFwYWNoZS5mZWxpeC5odHRwLmJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjIuMi4wPC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5mZWxpeDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5hcGFjaGUuZmVsaXguZXZlbnRhZG1pbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZmVsaXg8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYnVuZGxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8ZXh0ZW5zaW9ucz50cnVlPC9leHRlbnNpb25zPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8aW5zdHJ1Y3Rpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgPEV4cG9ydC1QYWNrYWdlPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLm9zZ2lodHRwc2VydmljZTwvRXhwb3J0LVBhY2thZ2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8SW1wb3J0LVBhY2thZ2U+amF2YXguc2VydmxldC4qO3ZlcnNpb249IlsyLjQsNS4wKSIsKjwvSW1wb3J0LVBhY2thZ2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8QnVuZGxlLUFjdGl2YXRvcj5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5vc2dpaHR0cHNlcnZpY2UuQWN0aXZhdG9yPC9CdW5kbGUtQWN0aXZhdG9yPgorICAgICAgICAgICAgICAgICAgICAgICAgPEltcGxlbWVudGF0aW9uLVRpdGxlPmplcnNleS1vc2dpLWh0dHAtc2VydmljZS1idW5kbGU8L0ltcGxlbWVudGF0aW9uLVRpdGxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPEltcGxlbWVudGF0aW9uLVZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC9JbXBsZW1lbnRhdGlvbi1WZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICA8L2luc3RydWN0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPHVucGFja0J1bmRsZT50cnVlPC91bnBhY2tCdW5kbGU+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5yZWxlYXNlPC9pZD4KKyAgICAgICAgICAgIDwhLS0gZG8gbm90IGNyZWF0ZSBzb3VyY2UgemlwIGJ1bmRsZXMgLS0+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2tpcEFzc2VtYmx5PnRydWU8L3NraXBBc3NlbWJseT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29zZ2ktaHR0cC1zZXJ2aWNlL2J1bmRsZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL29zZ2lodHRwc2VydmljZS9BY3RpdmF0b3IuamF2YSBiL2V4YW1wbGVzL29zZ2ktaHR0cC1zZXJ2aWNlL2J1bmRsZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL29zZ2lodHRwc2VydmljZS9BY3RpdmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTI2ZjM2Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvb3NnaS1odHRwLXNlcnZpY2UvYnVuZGxlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvb3NnaWh0dHBzZXJ2aWNlL0FjdGl2YXRvci5qYXZhCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLm9zZ2lodHRwc2VydmljZTsKKworaW1wb3J0IGphdmEudXRpbC5EaWN0aW9uYXJ5OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNodGFibGU7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyOworCitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUFjdGl2YXRvcjsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuU2VydmljZVJlZmVyZW5jZTsKK2ltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLmV2ZW50LkV2ZW50OworaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UuZXZlbnQuRXZlbnRBZG1pbjsKK2ltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLmh0dHAuSHR0cFNlcnZpY2U7CitpbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5odHRwLk5hbWVzcGFjZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcub3NnaS51dGlsLnRyYWNrZXIuU2VydmljZVRyYWNrZXI7CisKK3B1YmxpYyBjbGFzcyBBY3RpdmF0b3IgaW1wbGVtZW50cyBCdW5kbGVBY3RpdmF0b3IgeworCisgICAgcHJpdmF0ZSBCdW5kbGVDb250ZXh0IGJjOworICAgIHByaXZhdGUgU2VydmljZVRyYWNrZXIgdHJhY2tlcjsKKyAgICBwcml2YXRlIEh0dHBTZXJ2aWNlIGh0dHBTZXJ2aWNlID0gbnVsbDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihBY3RpdmF0b3IuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdGFydChCdW5kbGVDb250ZXh0IGJ1bmRsZUNvbnRleHQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0aGlzLmJjID0gYnVuZGxlQ29udGV4dDsKKworICAgICAgICBsb2dnZXIuaW5mbygiU1RBUlRJTkcgSFRUUCBTRVJWSUNFIEJVTkRMRSIpOworCisgICAgICAgIHRoaXMudHJhY2tlciA9IG5ldyBTZXJ2aWNlVHJhY2tlcih0aGlzLmJjLCBIdHRwU2VydmljZS5jbGFzcy5nZXROYW1lKCksIG51bGwpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGFkZGluZ1NlcnZpY2UoU2VydmljZVJlZmVyZW5jZSBzZXJ2aWNlUmVmKSB7CisgICAgICAgICAgICAgICAgaHR0cFNlcnZpY2UgPSAoSHR0cFNlcnZpY2UpIHN1cGVyLmFkZGluZ1NlcnZpY2Uoc2VydmljZVJlZik7CisgICAgICAgICAgICAgICAgcmVnaXN0ZXJTZXJ2bGV0cygpOworICAgICAgICAgICAgICAgIHJldHVybiBodHRwU2VydmljZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmVkU2VydmljZShTZXJ2aWNlUmVmZXJlbmNlIHJlZiwgT2JqZWN0IHNlcnZpY2UpIHsKKyAgICAgICAgICAgICAgICBpZiAoaHR0cFNlcnZpY2UgPT0gc2VydmljZSkgeworICAgICAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyU2VydmxldHMoKTsKKyAgICAgICAgICAgICAgICAgICAgaHR0cFNlcnZpY2UgPSBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdXBlci5yZW1vdmVkU2VydmljZShyZWYsIHNlcnZpY2UpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHRoaXMudHJhY2tlci5vcGVuKCk7CisKKyAgICAgICAgbG9nZ2VyLmluZm8oIkhUVFAgU0VSVklDRSBCVU5ETEUgU1RBUlRFRCIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzdG9wKEJ1bmRsZUNvbnRleHQgYnVuZGxlQ29udGV4dCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMudHJhY2tlci5jbG9zZSgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWdpc3RlclNlcnZsZXRzKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmF3UmVnaXN0ZXJTZXJ2bGV0cygpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB8IE5hbWVzcGFjZUV4Y2VwdGlvbiB8IFNlcnZsZXRFeGNlcHRpb24gaWUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGllKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByYXdSZWdpc3RlclNlcnZsZXRzKCkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIE5hbWVzcGFjZUV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBsb2dnZXIuaW5mbygiSkVSU0VZIEJVTkRMRTogUkVHSVNURVJJTkcgU0VSVkxFVFMiKTsKKyAgICAgICAgbG9nZ2VyLmluZm8oIkpFUlNFWSBCVU5ETEU6IEhUVFAgU0VSVklDRSA9ICIgKyBodHRwU2VydmljZS50b1N0cmluZygpKTsKKworICAgICAgICAvLyBUT0RPIC0gdGVtcG9yYXJ5IHdvcmthcm91bmQKKyAgICAgICAgLy8gVGhpcyBpcyBhIHdvcmthcm91bmQgcmVsYXRlZCB0byBpc3N1ZSBKRVJTRVktMjA5MzsgZ3JpenpseSAoMS45LjUpIG5lZWRzIHRvIGhhdmUgdGhlIGNvcnJlY3QgY29udGV4dAorICAgICAgICAvLyBjbGFzc2xvYWRlciBzZXQKKyAgICAgICAgQ2xhc3NMb2FkZXIgbXlDbGFzc0xvYWRlciA9IGdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgQ2xhc3NMb2FkZXIgb3JpZ2luYWxDb250ZXh0Q2xhc3NMb2FkZXIgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIobXlDbGFzc0xvYWRlcik7CisgICAgICAgICAgICBodHRwU2VydmljZS5yZWdpc3RlclNlcnZsZXQoIi9qZXJzZXktaHR0cC1zZXJ2aWNlIiwgbmV3IFNlcnZsZXRDb250YWluZXIoKSwgZ2V0SmVyc2V5U2VydmxldFBhcmFtcygpLCBudWxsKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuc2V0Q29udGV4dENsYXNzTG9hZGVyKG9yaWdpbmFsQ29udGV4dENsYXNzTG9hZGVyKTsKKyAgICAgICAgfQorICAgICAgICAvLyBFTkQgb2Ygd29ya2Fyb3VuZCAtIGFmdGVyIGdyaXp6bHkgdXBkYXRlZCB0byB0aGUgcmVjZW50IHZlcnNpb24sIG9ubHkgdGhlIGlubmVyIGNhbGwgZnJvbSB0cnkgYmxvY2sgd2lsbCByZW1haW46CisgICAgICAgIC8vIGh0dHBTZXJ2aWNlLnJlZ2lzdGVyU2VydmxldCgiL2plcnNleS1odHRwLXNlcnZpY2UiLCBuZXcgU2VydmxldENvbnRhaW5lcigpLCBnZXRKZXJzZXlTZXJ2bGV0UGFyYW1zKCksIG51bGwpOworCisgICAgICAgIHNlbmRBZG1pbkV2ZW50KCk7CisgICAgICAgIGxvZ2dlci5pbmZvKCJKRVJTRVkgQlVORExFOiBTRVJWTEVUUyBSRUdJU1RFUkVEIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHNlbmRBZG1pbkV2ZW50KCkgeworICAgICAgICBTZXJ2aWNlUmVmZXJlbmNlIGVhUmVmID0gYmMuZ2V0U2VydmljZVJlZmVyZW5jZShFdmVudEFkbWluLmNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgIGlmIChlYVJlZiAhPSBudWxsKSB7CisgICAgICAgICAgICBFdmVudEFkbWluIGVhID0gKEV2ZW50QWRtaW4pIGJjLmdldFNlcnZpY2UoZWFSZWYpOworICAgICAgICAgICAgZWEuc2VuZEV2ZW50KG5ldyBFdmVudCgiamVyc2V5L3Rlc3QvREVQTE9ZRUQiLCBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKSB7CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBwdXQoImNvbnRleHQtcGF0aCIsICIvIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkpOworICAgICAgICAgICAgYmMudW5nZXRTZXJ2aWNlKGVhUmVmKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB1bnJlZ2lzdGVyU2VydmxldHMoKSB7CisgICAgICAgIGlmICh0aGlzLmh0dHBTZXJ2aWNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJKRVJTRVkgQlVORExFOiBVTlJFR0lTVEVSSU5HIFNFUlZMRVRTIik7CisgICAgICAgICAgICBodHRwU2VydmljZS51bnJlZ2lzdGVyKCIvamVyc2V5LWh0dHAtc2VydmljZSIpOworICAgICAgICAgICAgbG9nZ2VyLmluZm8oIkpFUlNFWSBCVU5ETEU6IFNFUlZMRVRTIFVOUkVHSVNURVJFRCIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoIlVzZU9mT2Jzb2xldGVDb2xsZWN0aW9uVHlwZSIpCisgICAgcHJpdmF0ZSBEaWN0aW9uYXJ5PFN0cmluZywgU3RyaW5nPiBnZXRKZXJzZXlTZXJ2bGV0UGFyYW1zKCkgeworICAgICAgICBEaWN0aW9uYXJ5PFN0cmluZywgU3RyaW5nPiBqZXJzZXlTZXJ2bGV0UGFyYW1zID0gbmV3IEhhc2h0YWJsZTw+KCk7CisgICAgICAgIGplcnNleVNlcnZsZXRQYXJhbXMucHV0KCJqYXZheC53cy5ycy5BcHBsaWNhdGlvbiIsIEplcnNleUFwcGxpY2F0aW9uLmNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgIHJldHVybiBqZXJzZXlTZXJ2bGV0UGFyYW1zOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29zZ2ktaHR0cC1zZXJ2aWNlL2J1bmRsZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL29zZ2lodHRwc2VydmljZS9KZXJzZXlBcHBsaWNhdGlvbi5qYXZhIGIvZXhhbXBsZXMvb3NnaS1odHRwLXNlcnZpY2UvYnVuZGxlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvb3NnaWh0dHBzZXJ2aWNlL0plcnNleUFwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM4Mjc4YwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL29zZ2ktaHR0cC1zZXJ2aWNlL2J1bmRsZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL29zZ2lodHRwc2VydmljZS9KZXJzZXlBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMub3NnaWh0dHBzZXJ2aWNlOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitwdWJsaWMgY2xhc3MgSmVyc2V5QXBwbGljYXRpb24gZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICBTZXQ8Q2xhc3M8Pz4+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PENsYXNzPD8+PigpOworICAgICAgICByZXN1bHQuYWRkKFN0YXR1c1Jlc291cmNlLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29zZ2ktaHR0cC1zZXJ2aWNlL2J1bmRsZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL29zZ2lodHRwc2VydmljZS9TdGF0dXNSZXNvdXJjZS5qYXZhIGIvZXhhbXBsZXMvb3NnaS1odHRwLXNlcnZpY2UvYnVuZGxlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvb3NnaWh0dHBzZXJ2aWNlL1N0YXR1c1Jlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVhMzM2MQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL29zZ2ktaHR0cC1zZXJ2aWNlL2J1bmRsZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL29zZ2lodHRwc2VydmljZS9TdGF0dXNSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMub3NnaWh0dHBzZXJ2aWNlOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoInN0YXR1cyIpCitwdWJsaWMgY2xhc3MgU3RhdHVzUmVzb3VyY2UgeworCisgICAgQEdFVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIFN0cmluZyBnZXRTdGF0dXMoKSB7CisgICAgICAgIHJldHVybiAiYWN0aXZlIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9vc2dpLWh0dHAtc2VydmljZS9mdW5jdGlvbmFsLXRlc3QvcG9tLnhtbCBiL2V4YW1wbGVzL29zZ2ktaHR0cC1zZXJ2aWNlL2Z1bmN0aW9uYWwtdGVzdC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkMTQ3ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9vc2dpLWh0dHAtc2VydmljZS9mdW5jdGlvbmFsLXRlc3QvcG9tLnhtbApAQCAtMCwwICsxLDIyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKworICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5vc2dpLWh0dHAtc2VydmljZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLm9zZ2ktaHR0cC1zZXJ2aWNlPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmZ1bmN0aW9uYWwtdGVzdDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS1leGFtcGxlcy1vc2dpLWh0dHAtc2VydmljZS10ZXN0PC9uYW1lPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPCEtLSBFeGFtcGxlIGJ1bmRsZSAtLT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5vc2dpLWh0dHAtc2VydmljZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jbGllbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5hbm5vdGF0aW9uPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguYW5ub3RhdGlvbi1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guaGsyLmV4dGVybmFsPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+YW9wYWxsaWFuY2UtcmVwYWNrYWdlZDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5qYXZhc3Npc3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZhc3Npc3Q8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8IS0tIE9TR2kgcnVudGltZSAtIEZlbGl4IC0tPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZmVsaXg8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuYXBhY2hlLmZlbGl4LmZyYW1ld29yazwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZmVsaXg8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuYXBhY2hlLmZlbGl4LmV2ZW50YWRtaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8IS0tIFBheC1FeGFtIGFuZCBKVW5pdCBkZXBlbmRlbmNpZXMgLS0+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm9wczRqLnBheC5leGFtPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGF4LWV4YW08L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcub3BzNGoucGF4LmV4YW08L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5wYXgtZXhhbS1qdW5pdDQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcub3BzNGoucGF4LmV4YW08L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5wYXgtZXhhbS1jb250YWluZXItZm9ya2VkPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcub3BzNGoucGF4LmV4YW08L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5wYXgtZXhhbS1saW5rLW12bjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5vcHM0ai5wYXgud2ViPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGF4LXdlYi1qZXR0eS1idW5kbGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcub3BzNGoucGF4LndlYjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnBheC13ZWItZXh0ZW5kZXItd2FyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPCEtLSBHcml6emx5IGRlcGVuZGVuY2llcy0tPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4uZ3JpenpseS5vc2dpPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z3JpenpseS1odHRwc2VydmljZS1idW5kbGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjkuNDU8L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItZ3JpenpseTItc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDwhLS0gTG9nZ2luZyBkZXBlbmRlbmNpZXMtLT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zbGY0ai1sb2c0ajEyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+MS42LjQ8L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm9wczRqLnBheC5leGFtPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBheGV4YW0tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmdlbmVyYXRlLWNvbmZpZzwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Z2VuZXJhdGUtZGVwZW5kcy1maWxlPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+dGVzdC1jb21waWxlPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT50ZXN0LWNvbXBpbGU8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnRlc3RDb21waWxlPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZXNvdXJjZXMtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnByb2Nlc3MtdGVzdC1yZXNvdXJjZXM8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnRlc3RSZXNvdXJjZXM8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGZvcmtNb2RlPmFsd2F5czwvZm9ya01vZGU+CisgICAgICAgICAgICAgICAgICAgIDxlbmFibGVBc3NlcnRpb25zPmZhbHNlPC9lbmFibGVBc3NlcnRpb25zPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpZD50ZXN0PC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT50ZXN0PC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD50ZXN0PC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5yZWxlYXNlPC9pZD4KKyAgICAgICAgICAgIDwhLS0gZG8gbm90IGNyZWF0ZSBzb3VyY2UgemlwIGJ1bmRsZXMgLS0+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2tpcEFzc2VtYmx5PnRydWU8L3NraXBBc3NlbWJseT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5zb25hcjwvaWQ+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGRpc2FibGUgSmFDb0NvIGxpc3RlbmVyIGJlY2F1c2UgaXQncyBub3Qgd29ya2luZyB3aXRoIDxmb3JrTW9kZT5hbHdheXM8L2Zvcms+ICg8cmV1c2VGb3Jrcz5mYWxzZTwvcmV1c2VGb3Jrcz4gcmVzcGVjdGl2ZWx5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwczovL2ppcmEuc29uYXJzb3VyY2UuY29tL2Jyb3dzZS9TT05BUkpBVkEtNzI4IChodHRwczovL2dpdGh1Yi5jb20vU29uYXJTb3VyY2Uvc29uYXItamF2YS9wdWxsLzMyNCkgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0aWVzIGNvbWJpbmUuc2VsZj0ib3ZlcnJpZGUiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3NnaS1odHRwLXNlcnZpY2UvZnVuY3Rpb25hbC10ZXN0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvb3NnaWh0dHBzZXJ2aWNlL3Rlc3QvQWJzdHJhY3RIdHRwU2VydmljZVRlc3QuamF2YSBiL2V4YW1wbGVzL29zZ2ktaHR0cC1zZXJ2aWNlL2Z1bmN0aW9uYWwtdGVzdC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL29zZ2lodHRwc2VydmljZS90ZXN0L0Fic3RyYWN0SHR0cFNlcnZpY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVjNDEwOQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL29zZ2ktaHR0cC1zZXJ2aWNlL2Z1bmN0aW9uYWwtdGVzdC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL29zZ2lodHRwc2VydmljZS90ZXN0L0Fic3RyYWN0SHR0cFNlcnZpY2VUZXN0LmphdmEKQEAgLTAsMCArMSwyNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMub3NnaWh0dHBzZXJ2aWNlLnRlc3Q7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuRGljdGlvbmFyeTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaHRhYmxlOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlByb3BlcnRpZXNIZWxwZXI7CisKK2ltcG9ydCBvcmcub3BzNGoucGF4LmV4YW0uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcub3BzNGoucGF4LmV4YW0uT3B0aW9uOworaW1wb3J0IG9yZy5vc2dpLmZyYW1ld29yay5CdW5kbGU7CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUNvbnRleHQ7CitpbXBvcnQgb3JnLm9zZ2kuZnJhbWV3b3JrLkJ1bmRsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcub3NnaS5zZXJ2aWNlLmV2ZW50LkV2ZW50OworaW1wb3J0IG9yZy5vc2dpLnNlcnZpY2UuZXZlbnQuRXZlbnRDb25zdGFudHM7CitpbXBvcnQgb3JnLm9zZ2kuc2VydmljZS5ldmVudC5FdmVudEhhbmRsZXI7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcub3BzNGoucGF4LmV4YW0uQ29yZU9wdGlvbnMuanVuaXRCdW5kbGVzOworaW1wb3J0IHN0YXRpYyBvcmcub3BzNGoucGF4LmV4YW0uQ29yZU9wdGlvbnMubWF2ZW5CdW5kbGU7CitpbXBvcnQgc3RhdGljIG9yZy5vcHM0ai5wYXguZXhhbS5Db3JlT3B0aW9ucy5vcHRpb25zOworaW1wb3J0IHN0YXRpYyBvcmcub3BzNGoucGF4LmV4YW0uQ29yZU9wdGlvbnMuc3lzdGVtUHJvcGVydHk7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SHR0cFNlcnZpY2VUZXN0IHsKKworICAgIEBJbmplY3QKKyAgICBCdW5kbGVDb250ZXh0IGJ1bmRsZUNvbnRleHQ7CisKKyAgICAvKiogbWF4aW11bSB3YWl0aW5nIHRpbWUgZm9yIHJ1bnRpbWUgaW5pdGlhbGl6YXRpb24gYW5kIEplcnNleSBkZXBsb3ltZW50ICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIE1BWF9XQUlUSU5HX1NFQ09ORFMgPSAxMEw7CisKKyAgICAvKiogTGF0Y2ggZm9yIGJsb2NraW5nIHRoZSB0ZXN0aW5nIHRocmVhZCB1bnRpbCB0aGUgcnVudGltZSBpcyByZWFkeSBhbmQgSmVyc2V5IGRlcGxveWVkICovCisgICAgZmluYWwgQ291bnREb3duTGF0Y2ggY291bnREb3duTGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgcG9ydCA9IGdldFByb3BlcnR5KCJqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQiLCA4MDgwKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVYVCA9ICIvamVyc2V5LWh0dHAtc2VydmljZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIGJhc2VVcmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3QiKS5wb3J0KHBvcnQpLnBhdGgoQ09OVEVYVCkuYnVpbGQoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQnVuZGxlTG9jYXRpb25Qcm9wZXJ0eSA9ICJqZXJzZXkuYnVuZGxlLmxvY2F0aW9uIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEFic3RyYWN0SHR0cFNlcnZpY2VUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBwdWJsaWMgYWJzdHJhY3QgTGlzdDxPcHRpb24+IGh0dHBTZXJ2aWNlUHJvdmlkZXJPcHRpb25zKCk7CisKKyAgICBwdWJsaWMgYWJzdHJhY3QgTGlzdDxPcHRpb24+IG9zZ2lSdW50aW1lT3B0aW9ucygpOworCisgICAgcHVibGljIExpc3Q8T3B0aW9uPiBnZW5lcmljT3NnaU9wdGlvbnMoKSB7CisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJSZWR1bmRhbnRTdHJpbmdUb1N0cmluZyIpCisgICAgICAgIGZpbmFsIFN0cmluZyBidW5kbGVMb2NhdGlvbiA9IG1hdmVuQnVuZGxlKCkKKyAgICAgICAgICAgICAgICAuZ3JvdXBJZCgib3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMub3NnaS1odHRwLXNlcnZpY2UiKQorICAgICAgICAgICAgICAgIC5hcnRpZmFjdElkKCJidW5kbGUiKQorICAgICAgICAgICAgICAgIC52ZXJzaW9uQXNJblByb2plY3QoKS5nZXRVUkwoKS50b1N0cmluZygpOworCisgICAgICAgIExpc3Q8T3B0aW9uPiBvcHRpb25zID0gQXJyYXlzLmFzTGlzdChvcHRpb25zKAorICAgICAgICAgICAgICAgIHN5c3RlbVByb3BlcnR5KCJvcmcub3NnaS5zZXJ2aWNlLmh0dHAucG9ydCIpLnZhbHVlKFN0cmluZy52YWx1ZU9mKHBvcnQpKSwKKyAgICAgICAgICAgICAgICBzeXN0ZW1Qcm9wZXJ0eShCdW5kbGVMb2NhdGlvblByb3BlcnR5KS52YWx1ZShidW5kbGVMb2NhdGlvbiksCisgICAgICAgICAgICAgICAgc3lzdGVtUHJvcGVydHkoImplcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydCIpLnZhbHVlKFN0cmluZy52YWx1ZU9mKHBvcnQpKSwKKyAgICAgICAgICAgICAgICBzeXN0ZW1Qcm9wZXJ0eSgib3JnLm9zZ2kuZnJhbWV3b3JrLnN5c3RlbS5wYWNrYWdlcy5leHRyYSIpLnZhbHVlKCJqYXZheC5hbm5vdGF0aW9uIiksCisKKyAgICAgICAgICAgICAgICAvLyBkbyBub3QgcmVtb3ZlIHRoZSBmb2xsb3dpbmcgbGluZQorICAgICAgICAgICAgICAgIC8vIHN5c3RlbVByb3BlcnR5KCJvcmcub3BzNGoucGF4LmxvZ2dpbmcuRGVmYXVsdFNlcnZpY2VMb2cubGV2ZWwiKS52YWx1ZSgiRklORVNUIiksCisKKyAgICAgICAgICAgICAgICAvLyB1bmNvbW1lbnQgZm9yIGxvZ2dpbmcgKGRvIG5vdCByZW1vdmUgdGhlIGZvbGxvd2luZyB0d28gbGluZXMpCisgICAgICAgICAgICAgICAgLy8gbWF2ZW5CdW5kbGUoIm9yZy5vcHM0ai5wYXgubG9nZ2luZyIsICJwYXgtbG9nZ2luZy1hcGkiLCAiMS40IiksCisgICAgICAgICAgICAgICAgLy8gbWF2ZW5CdW5kbGUoIm9yZy5vcHM0ai5wYXgubG9nZ2luZyIsICJwYXgtbG9nZ2luZy1zZXJ2aWNlIiwgIjEuNCIpLAorCisgICAgICAgICAgICAgICAgLy8gamF2YXguYW5ub3RhdGlvbiBoYXMgdG8gZ28gZmlyc3QhCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJqYXZheC5hbm5vdGF0aW9uIikuYXJ0aWZhY3RJZCgiamF2YXguYW5ub3RhdGlvbi1hcGkiKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKworICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCJvcmcub3BzNGoucGF4LnVybCIsICJwYXgtdXJsLW12biIpLAorICAgICAgICAgICAgICAgIGp1bml0QnVuZGxlcygpLAorCisgICAgICAgICAgICAgICAgLy8gSEsyCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuZ2xhc3NmaXNoLmhrMiIpLmFydGlmYWN0SWQoImhrMi1hcGkiKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5nbGFzc2Zpc2guaGsyIikuYXJ0aWZhY3RJZCgib3NnaS1yZXNvdXJjZS1sb2NhdG9yIikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuZ2xhc3NmaXNoLmhrMiIpLmFydGlmYWN0SWQoImhrMi1sb2NhdG9yIikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuZ2xhc3NmaXNoLmhrMiIpLmFydGlmYWN0SWQoImhrMi11dGlscyIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmdsYXNzZmlzaC5oazIuZXh0ZXJuYWwiKS5hcnRpZmFjdElkKCJqYXZheC5pbmplY3QiKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5nbGFzc2Zpc2guaGsyLmV4dGVybmFsIikuYXJ0aWZhY3RJZCgiYW9wYWxsaWFuY2UtcmVwYWNrYWdlZCIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmphdmFzc2lzdCIpLmFydGlmYWN0SWQoImphdmFzc2lzdCIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorCisgICAgICAgICAgICAgICAgLy8gSkFYLVJTIEFQSQorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgiamF2YXgud3MucnMiKS5hcnRpZmFjdElkKCJqYXZheC53cy5ycy1hcGkiKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKworICAgICAgICAgICAgICAgIC8vIHZhbGlkYXRpb24KKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoImphdmF4LnZhbGlkYXRpb24iKS5hcnRpZmFjdElkKCJ2YWxpZGF0aW9uLWFwaSIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorCisgICAgICAgICAgICAgICAgLy8gSmVyc2V5IGJ1bmRsZXMKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmUiKS5hcnRpZmFjdElkKCJqZXJzZXktY29tbW9uIikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlIikuYXJ0aWZhY3RJZCgiamVyc2V5LXNlcnZlciIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZSIpLmFydGlmYWN0SWQoImplcnNleS1jbGllbnQiKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnMiKS5hcnRpZmFjdElkKCJqZXJzZXktY29udGFpbmVyLXNlcnZsZXQtY29yZSIpCisgICAgICAgICAgICAgICAgLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0IikuYXJ0aWZhY3RJZCgiamVyc2V5LWhrMiIpLnZlcnNpb25Bc0luUHJvamVjdCgpCisgICAgICAgICAgICAgICAgKSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGxvY2FsUmVwb3NpdG9yeSA9IEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKFByb3BlcnRpZXNIZWxwZXIuZ2V0U3lzdGVtUHJvcGVydHkoImxvY2FsUmVwb3NpdG9yeSIpKTsKKyAgICAgICAgaWYgKGxvY2FsUmVwb3NpdG9yeSAhPSBudWxsKSB7CisgICAgICAgICAgICBvcHRpb25zID0gbmV3IEFycmF5TGlzdDw+KG9wdGlvbnMpOworICAgICAgICAgICAgb3B0aW9ucy5hZGQoc3lzdGVtUHJvcGVydHkoIm9yZy5vcHM0ai5wYXgudXJsLm12bi5sb2NhbFJlcG9zaXRvcnkiKS52YWx1ZShsb2NhbFJlcG9zaXRvcnkpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBvcHRpb25zOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PE9wdGlvbj4gZ3JpenpseU9wdGlvbnMoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG9wdGlvbnMoCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJjb20uc3VuLmdyaXp6bHkub3NnaSIpLmFydGlmYWN0SWQoImdyaXp6bHktaHR0cHNlcnZpY2UtYnVuZGxlIikudmVyc2lvbkFzSW5Qcm9qZWN0KCkKKyAgICAgICAgKSk7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8T3B0aW9uPiBqZXR0eU9wdGlvbnMoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG9wdGlvbnMoCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcub3BzNGoucGF4LndlYiIpLmFydGlmYWN0SWQoInBheC13ZWItamV0dHktYnVuZGxlIikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcub3BzNGoucGF4LndlYiIpLmFydGlmYWN0SWQoInBheC13ZWItZXh0ZW5kZXItd2FyIikudmVyc2lvbkFzSW5Qcm9qZWN0KCkpKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiVW51c2VkRGVjbGFyYXRpb24iKQorICAgIHB1YmxpYyBjbGFzcyBXZWJFdmVudEhhbmRsZXIgaW1wbGVtZW50cyBFdmVudEhhbmRsZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVFdmVudChFdmVudCBldmVudCkgeworICAgICAgICAgICAgY291bnREb3duTGF0Y2guY291bnREb3duKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgV2ViRXZlbnRIYW5kbGVyKFN0cmluZyBoYW5kbGVyTmFtZSkgeworICAgICAgICAgICAgdGhpcy5oYW5kbGVyTmFtZSA9IGhhbmRsZXJOYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaGFuZGxlck5hbWU7CisKKyAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRIYW5kbGVyTmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBoYW5kbGVyTmFtZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJVbnVzZWREZWNsYXJhdGlvbiIpCisgICAgQENvbmZpZ3VyYXRpb24KKyAgICBwdWJsaWMgT3B0aW9uW10gY29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgZmluYWwgTGlzdDxPcHRpb24+IG9wdGlvbnMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisKKyAgICAgICAgb3B0aW9ucy5hZGRBbGwoZ2VuZXJpY09zZ2lPcHRpb25zKCkpOworICAgICAgICBvcHRpb25zLmFkZEFsbChodHRwU2VydmljZVByb3ZpZGVyT3B0aW9ucygpKTsKKyAgICAgICAgb3B0aW9ucy5hZGRBbGwob3NnaVJ1bnRpbWVPcHRpb25zKCkpOworCisgICAgICAgIHJldHVybiBvcHRpb25zLnRvQXJyYXkobmV3IE9wdGlvbltvcHRpb25zLnNpemUoKV0pOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRlZmF1bHRNYW5kYXRvcnlCZWZvcmVNZXRob2QoKSB7CisgICAgICAgIExPR0dFUi5maW5lKCJSZWdpc3RlcmluZyBldmVudCBoYW5kbGVyIGZvciBqZXJzZXkvdGVzdC9ERVBMT1lFRCIpOworICAgICAgICBidW5kbGVDb250ZXh0LnJlZ2lzdGVyU2VydmljZShFdmVudEhhbmRsZXIuY2xhc3MuZ2V0TmFtZSgpLCBuZXcgV2ViRXZlbnRIYW5kbGVyKCJEZXBsb3kgSGFuZGxlciIpLAorICAgICAgICAgICAgICAgIGdldEhhbmRsZXJTZXJ2aWNlUHJvcGVydGllcygiamVyc2V5L3Rlc3QvREVQTE9ZRUQiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZGVmYXVsdEh0dHBTZXJ2aWNlVGVzdE1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBsb2cgdGhlIGxpc3Qgb2YgYnVuZGxlcyBhbmQgcmVzdWx0IG9mIHRoZSBhdHRlbXB0IHRvIHN0YXJ0CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBzYi5hcHBlbmQoIi0tIEJ1bmRsZSBsaXN0IC0tIFxuIik7CisgICAgICAgIGZvciAoQnVuZGxlIGIgOiBidW5kbGVDb250ZXh0LmdldEJ1bmRsZXMoKSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKFN0cmluZy5mb3JtYXQoIiUxJDVzIiwgIlsiICsgYi5nZXRCdW5kbGVJZCgpICsgIl0iKSkuYXBwZW5kKCIgIikKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChTdHJpbmcuZm9ybWF0KCIlMSQtNzBzIiwgYi5nZXRTeW1ib2xpY05hbWUoKSkpLmFwcGVuZCgiIHwgIikKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChTdHJpbmcuZm9ybWF0KCIlMSQtMjBzIiwgYi5nZXRWZXJzaW9uKCkpKS5hcHBlbmQoIiB8Iik7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGIuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiBTVEFSVEVEICB8ICIpOworICAgICAgICAgICAgfSBjYXRjaCAoQnVuZGxlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIiAqRkFJTEVEKiB8ICIpLmFwcGVuZChlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYi5hcHBlbmQoYi5nZXRMb2NhdGlvbigpKS5hcHBlbmQoIlxuIik7CisgICAgICAgIH0KKyAgICAgICAgc2IuYXBwZW5kKCItLSBcblxuIik7CisgICAgICAgIExPR0dFUi5maW5lKHNiLnRvU3RyaW5nKCkpOworCisgICAgICAgIC8vIHN0YXJ0IHRoZSBleGFtcGxlIGJ1bmRsZQorICAgICAgICBidW5kbGVDb250ZXh0Lmluc3RhbGxCdW5kbGUoCisgICAgICAgICAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoUHJvcGVydGllc0hlbHBlci5nZXRTeXN0ZW1Qcm9wZXJ0eShCdW5kbGVMb2NhdGlvblByb3BlcnR5KSkKKyAgICAgICAgKS5zdGFydCgpOworCisgICAgICAgIExPR0dFUi5maW5lKCJXYWl0aW5nIGZvciBqZXJzZXkvdGVzdC9ERVBMT1lFRCBldmVudCB3aXRoIHRpbWVvdXQgIiArIE1BWF9XQUlUSU5HX1NFQ09ORFMgKyAiIHNlY29uZHMuLi4iKTsKKyAgICAgICAgaWYgKCFjb3VudERvd25MYXRjaC5hd2FpdChNQVhfV0FJVElOR19TRUNPTkRTLCBUaW1lVW5pdC5TRUNPTkRTKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRpbWVvdXRFeGNlcHRpb24oIlRoZSBldmVudCBqZXJzZXkvdGVzdC9ERVBMT1lFRCBkaWQgbm90IGFycml2ZSBpbiAiCisgICAgICAgICAgICAgICAgICAgICsgTUFYX1dBSVRJTkdfU0VDT05EUworICAgICAgICAgICAgICAgICAgICArICIgc2Vjb25kcy4gV2FpdGluZyB0aW1lZCBvdXQuIik7CisgICAgICAgIH0KKworICAgICAgICBDbGllbnQgYyA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KCk7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSBjLnRhcmdldChiYXNlVXJpKTsKKworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gdGFyZ2V0LnBhdGgoIi9zdGF0dXMiKS5yZXF1ZXN0KCkuYnVpbGQoIkdFVCIpLmludm9rZSgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBMT0dHRVIuaW5mbygiSkVSU0VZIFJFU1VMVCA9ICIgKyByZXN1bHQpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFjdGl2ZSIsIHJlc3VsdCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0UHJvcGVydHkoZmluYWwgU3RyaW5nIHZhck5hbWUsIGludCBkZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgaWYgKG51bGwgPT0gdmFyTmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgdmFyVmFsdWUgPSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChQcm9wZXJ0aWVzSGVscGVyLmdldFN5c3RlbVByb3BlcnR5KHZhck5hbWUpKTsKKyAgICAgICAgaWYgKG51bGwgIT0gdmFyVmFsdWUpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQodmFyVmFsdWUpOworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyB3aWxsIHJldHVybiBkZWZhdWx0IHZhbHVlIGJlbG93CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlVzZU9mT2Jzb2xldGVDb2xsZWN0aW9uVHlwZSIsICJ1bmNoZWNrZWQifSkKKyAgICBwcml2YXRlIERpY3Rpb25hcnkgZ2V0SGFuZGxlclNlcnZpY2VQcm9wZXJ0aWVzKFN0cmluZy4uLiB0b3BpY3MpIHsKKyAgICAgICAgRGljdGlvbmFyeSByZXN1bHQgPSBuZXcgSGFzaHRhYmxlKCk7CisgICAgICAgIHJlc3VsdC5wdXQoRXZlbnRDb25zdGFudHMuRVZFTlRfVE9QSUMsIHRvcGljcyk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvb3NnaS1odHRwLXNlcnZpY2UvZnVuY3Rpb25hbC10ZXN0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvb3NnaWh0dHBzZXJ2aWNlL3Rlc3QvR3JpenpseUh0dHBTZXJ2aWNlRmVsaXhUZXN0LmphdmEgYi9leGFtcGxlcy9vc2dpLWh0dHAtc2VydmljZS9mdW5jdGlvbmFsLXRlc3Qvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9vc2dpaHR0cHNlcnZpY2UvdGVzdC9Hcml6emx5SHR0cFNlcnZpY2VGZWxpeFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTc3OTE2Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvb3NnaS1odHRwLXNlcnZpY2UvZnVuY3Rpb25hbC10ZXN0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvb3NnaWh0dHBzZXJ2aWNlL3Rlc3QvR3JpenpseUh0dHBTZXJ2aWNlRmVsaXhUZXN0LmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5vc2dpaHR0cHNlcnZpY2UudGVzdDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcub3BzNGoucGF4LmV4YW0uQ29yZU9wdGlvbnM7CitpbXBvcnQgb3JnLm9wczRqLnBheC5leGFtLk9wdGlvbjsKK2ltcG9ydCBvcmcub3BzNGoucGF4LmV4YW0uanVuaXQuUGF4RXhhbTsKK2ltcG9ydCBzdGF0aWMgb3JnLm9wczRqLnBheC5leGFtLkNvcmVPcHRpb25zLm1hdmVuQnVuZGxlOworCitAUnVuV2l0aChQYXhFeGFtLmNsYXNzKQorcHVibGljIGNsYXNzIEdyaXp6bHlIdHRwU2VydmljZUZlbGl4VGVzdCBleHRlbmRzIEFic3RyYWN0SHR0cFNlcnZpY2VUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PE9wdGlvbj4gb3NnaVJ1bnRpbWVPcHRpb25zKCkgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChDb3JlT3B0aW9ucy5vcHRpb25zKAorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5ncm91cElkKCJvcmcuYXBhY2hlLmZlbGl4IikuYXJ0aWZhY3RJZCgib3JnLmFwYWNoZS5mZWxpeC5ldmVudGFkbWluIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC52ZXJzaW9uQXNJblByb2plY3QoKQorICAgICAgICApCisgICAgICAgICk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8T3B0aW9uPiBodHRwU2VydmljZVByb3ZpZGVyT3B0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIGdyaXp6bHlPcHRpb25zKCk7CisgICAgfQorCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIGJlZm9yZSgpIHsKKyAgICAgICAgZGVmYXVsdE1hbmRhdG9yeUJlZm9yZU1ldGhvZCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEh0dHBTZXJ2aWNlTWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGRlZmF1bHRIdHRwU2VydmljZVRlc3RNZXRob2QoKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29zZ2ktaHR0cC1zZXJ2aWNlL2Z1bmN0aW9uYWwtdGVzdC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL29zZ2lodHRwc2VydmljZS90ZXN0L0pldHR5SHR0cFNlcnZpY2VGZWxpeFRlc3QuamF2YSBiL2V4YW1wbGVzL29zZ2ktaHR0cC1zZXJ2aWNlL2Z1bmN0aW9uYWwtdGVzdC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL29zZ2lodHRwc2VydmljZS90ZXN0L0pldHR5SHR0cFNlcnZpY2VGZWxpeFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzNiYjExCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvb3NnaS1odHRwLXNlcnZpY2UvZnVuY3Rpb25hbC10ZXN0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvb3NnaWh0dHBzZXJ2aWNlL3Rlc3QvSmV0dHlIdHRwU2VydmljZUZlbGl4VGVzdC5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMub3NnaWh0dHBzZXJ2aWNlLnRlc3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLm9wczRqLnBheC5leGFtLkNvcmVPcHRpb25zOworaW1wb3J0IG9yZy5vcHM0ai5wYXguZXhhbS5PcHRpb247CitpbXBvcnQgb3JnLm9wczRqLnBheC5leGFtLmp1bml0LlBheEV4YW07CitpbXBvcnQgc3RhdGljIG9yZy5vcHM0ai5wYXguZXhhbS5Db3JlT3B0aW9ucy5tYXZlbkJ1bmRsZTsKKworQFJ1bldpdGgoUGF4RXhhbS5jbGFzcykKK3B1YmxpYyBjbGFzcyBKZXR0eUh0dHBTZXJ2aWNlRmVsaXhUZXN0IGV4dGVuZHMgQWJzdHJhY3RIdHRwU2VydmljZVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8T3B0aW9uPiBvc2dpUnVudGltZU9wdGlvbnMoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KENvcmVPcHRpb25zLm9wdGlvbnMoCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuYXBhY2hlLmZlbGl4IikuYXJ0aWZhY3RJZCgib3JnLmFwYWNoZS5mZWxpeC5ldmVudGFkbWluIikudmVyc2lvbkFzSW5Qcm9qZWN0KCkKKyAgICAgICAgKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8T3B0aW9uPiBodHRwU2VydmljZVByb3ZpZGVyT3B0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIGpldHR5T3B0aW9ucygpOworICAgIH0KKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBiZWZvcmUoKSB7CisgICAgICAgIGRlZmF1bHRNYW5kYXRvcnlCZWZvcmVNZXRob2QoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIdHRwU2VydmljZU1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkZWZhdWx0SHR0cFNlcnZpY2VUZXN0TWV0aG9kKCk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9leGFtcGxlcy9vc2dpLWh0dHAtc2VydmljZS9mdW5jdGlvbmFsLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL2xvZzRqLnByb3BlcnRpZXMgYi9leGFtcGxlcy9vc2dpLWh0dHAtc2VydmljZS9mdW5jdGlvbmFsLXRlc3Qvc3JjL3Rlc3QvcmVzb3VyY2VzL2xvZzRqLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZkMjNkZgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL29zZ2ktaHR0cC1zZXJ2aWNlL2Z1bmN0aW9uYWwtdGVzdC9zcmMvdGVzdC9yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcwpAQCAtMCwwICsxLDE0IEBACisjCisjIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyMgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorIworIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisjCisKK2xvZzRqLnJvb3RDYXRlZ29yeT1FUlJPUiwgc3Rkb3V0Citsb2c0ai5hcHBlbmRlci5zdGRvdXQ9b3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXIKK2xvZzRqLmFwcGVuZGVyLnN0ZG91dC5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49WyUzMC4zMGN7MX1dIC0gJW0lbgorbG9nNGouYXBwZW5kZXIuc3Rkb3V0LmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL29zZ2ktaHR0cC1zZXJ2aWNlL3BvbS54bWwgYi9leGFtcGxlcy9vc2dpLWh0dHAtc2VydmljZS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YjJiMGYKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9vc2dpLWh0dHAtc2VydmljZS9wb20ueG1sCkBAIC0wLDAgKzEsNDkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisKKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPm9zZ2ktaHR0cC1zZXJ2aWNlPC9hcnRpZmFjdElkPgorICAgIDxuYW1lPmplcnNleS1leGFtcGxlcy1vc2dpLWh0dHAtc2VydmljZTwvbmFtZT4KKyAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgorCisgICAgPGRlc2NyaXB0aW9uPk9TR2kgSHR0cFNlcnZpY2UgZXhhbXBsZTwvZGVzY3JpcHRpb24+CisKKyAgICA8bW9kdWxlcz4KKyAgICAgICAgPG1vZHVsZT5idW5kbGU8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5mdW5jdGlvbmFsLXRlc3Q8L21vZHVsZT4KKyAgICA8L21vZHVsZXM+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnJlbGVhc2U8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvcG9tLnhtbCBiL2V4YW1wbGVzL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBkOGE3MAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3BvbS54bWwKQEAgLTAsMCArMSwxODcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisKKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleTwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxsaWNlbnNlcz4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgICA8bmFtZT5FY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMDwvbmFtZT4KKyAgICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwPC91cmw+CisgICAgICAgICAgICA8ZGlzdHJpYnV0aW9uPnJlcG88L2Rpc3RyaWJ1dGlvbj4KKyAgICAgICAgICAgIDxjb21tZW50cz5FeGNlcHQgZm9yIEFuZ3VsYXJKUywgYm9vdHN0cmFwLmpzLCBqUXVlcnksIGpRdWVyeSBCYXJjb2RlIHBsdWdpbiwgS2luZXRpY0pTCisgICAgICAgICAgICAgICAgU2VlIGFsc28gaHR0cHM6Ly9naXRodWIuY29tL2VjbGlwc2UtZWU0ai9qZXJzZXkvYmxvYi9tYXN0ZXIvTk9USUNFLm1kPC9jb21tZW50cz4KKyAgICAgICAgPC9saWNlbnNlPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICAgIDxuYW1lPmpRdWVyeSBsaWNlbnNlPC9uYW1lPgorICAgICAgICAgICAgPHVybD5qcXVlcnkub3JnL2xpY2Vuc2U8L3VybD4KKyAgICAgICAgICAgIDxkaXN0cmlidXRpb24+cmVwbzwvZGlzdHJpYnV0aW9uPgorICAgICAgICAgICAgPGNvbW1lbnRzPmpRdWVyeSB2MS4xMi40PC9jb21tZW50cz4KKyAgICAgICAgPC9saWNlbnNlPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICAgIDxuYW1lPk1JVCBsaWNlbnNlPC9uYW1lPgorICAgICAgICAgICAgPHVybD5odHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocDwvdXJsPgorICAgICAgICAgICAgPGRpc3RyaWJ1dGlvbj5yZXBvPC9kaXN0cmlidXRpb24+CisgICAgICAgICAgICA8Y29tbWVudHM+QW5ndWxhckpTLCBCb290c3RyYXAgdjMuMy43IChodHRwOi8vZ2V0Ym9vdHN0cmFwLmNvbSksIAorICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeSBCYXJjb2RlIHBsdWdpbiAwLjMsIEtpbmV0aWNKUyB2NC43LjE8L2NvbW1lbnRzPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgPC9saWNlbnNlcz4KKworICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktZXhhbXBsZXM8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+SmVyc2V5IGV4YW1wbGVzPC9kZXNjcmlwdGlvbj4KKworICAgIDxtb2R1bGVzPgorICAgICAgICA8bW9kdWxlPmFzc2VtYmxpZXM8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5iZWFuLXZhbGlkYXRpb24td2ViYXBwPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+Ym9va21hcms8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5ib29rbWFyay1lbTwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmJvb2tzdG9yZS13ZWJhcHA8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5jZGktd2ViYXBwPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+Y2xpcGJvYXJkPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+Y2xpcGJvYXJkLXByb2dyYW1tYXRpYzwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmRlY2xhcmF0aXZlLWxpbmtpbmc8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5lbnRpdHktZmlsdGVyaW5nPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+ZW50aXR5LWZpbHRlcmluZy1zZWxlY3RhYmxlPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+ZW50aXR5LWZpbHRlcmluZy1zZWN1cml0eTwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmV4dGVuZGVkLXdhZGwtd2ViYXBwPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+ZXhjZXB0aW9uLW1hcHBpbmc8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5mZWVkLWNvbWJpbmVyLWphdmE4LXdlYmFwcDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmZyZWVtYXJrZXItd2ViYXBwPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+ZmxpZ2h0LW1nbXQtd2ViYXBwPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+Z3Jvb3Z5PC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+aGVsbG93b3JsZDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmhlbGxvd29ybGQtYmVuY2htYXJrPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+aGVsbG93b3JsZC1jZGkyLXNlPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+aGVsbG93b3JsZC1uZXR0eTwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmhlbGxvd29ybGQtcHJvZ3JhbW1hdGljPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+aGVsbG93b3JsZC1wdXJlLWpheC1yczwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmhlbGxvd29ybGQtd2ViYXBwPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+aGVsbG93b3JsZC13ZWxkPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+aGVsbG93b3JsZC1zcHJpbmctd2ViYXBwPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+aGVsbG93b3JsZC1zcHJpbmctYW5ub3RhdGlvbnM8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5odHRwLXBhdGNoPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+aHR0cC10cmFjZTwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmh0dHBzLWNsaWVudHNlcnZlci1ncml6emx5PC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+aHR0cHMtc2VydmVyLWdsYXNzZmlzaDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmphdmE4LXdlYmFwcDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmpheGI8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5qYXhycy10eXBlcy1pbmplY3Rpb248L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5qZXJzZXktZWpiPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+anNvbi1iaW5kaW5nLXdlYmFwcDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmpzb24tamFja3NvbjwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmpzb24tamFja3NvbjE8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5qc29uLWpldHRpc29uPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+anNvbi1tb3h5PC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+anNvbi1wcm9jZXNzaW5nLXdlYmFwcDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmpzb24td2l0aC1wYWRkaW5nPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+bWFuYWdlZC1iZWFucy13ZWJhcHA8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5tYW5hZ2VkLWNsaWVudDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPm1hbmFnZWQtY2xpZW50LXdlYmFwcDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPm1hbmFnZWQtY2xpZW50LXNpbXBsZS13ZWJhcHA8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5tb25pdG9yaW5nLXdlYmFwcDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPm11bHRpcGFydC13ZWJhcHA8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5vcGVuLXRyYWNpbmc8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5vc2dpLWhlbGxvd29ybGQtd2ViYXBwPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+b3NnaS1odHRwLXNlcnZpY2U8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5vYXV0aC1jbGllbnQtdHdpdHRlcjwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPm9hdXRoMi1jbGllbnQtZ29vZ2xlLXdlYmFwcDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnJlbG9hZDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnJ4LWNsaWVudC13ZWJhcHA8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5zZXJ2ZXItYXN5bmM8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5zZXJ2ZXItYXN5bmMtbWFuYWdlZDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnNlcnZlci1hc3luYy1zdGFuZGFsb25lPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+c2VydmVyLXNlbnQtZXZlbnRzLWplcnNleTwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnNlcnZlci1zZW50LWV2ZW50cy1qYXhyczwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnNlcnZsZXQzLXdlYmFwcDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnNpbXBsZS1jb25zb2xlPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+c2hvcnRlbmVyLXdlYmFwcDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnNwYXJrbGluZXM8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5zc2UtaXRlbS1zdG9yZS1qZXJzZXktd2ViYXBwPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+c3NlLWl0ZW0tc3RvcmUtamF4cnMtd2ViYXBwPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+c3NlLXR3aXR0ZXItYWdncmVnYXRvcjwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnN5c3RlbS1wcm9wZXJ0aWVzLWV4YW1wbGU8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT50b25lLWdlbmVyYXRvcjwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPndlYmFwcC1leGFtcGxlLXBhcmVudDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnhtbC1tb3h5PC9tb2R1bGU+CisgICAgPC9tb2R1bGVzPgorCisgICAgPGRlcGVuZGVuY3lNYW5hZ2VtZW50PgorICAgICAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWJvbTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPHR5cGU+cG9tPC90eXBlPgorICAgICAgICAgICAgICAgIDxzY29wZT5pbXBvcnQ8L3Njb3BlPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8L2RlcGVuZGVuY2llcz4KKyAgICA8L2RlcGVuZGVuY3lNYW5hZ2VtZW50PgorCisgICAgPGJ1aWxkPgorICAgICAgICA8ZmluYWxOYW1lPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvZmluYWxOYW1lPgorICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBDb250YWlucyBzaGFyZWQgSmVyc2V5IGV4YW1wbGUgYXNzZW1ibHkgZGVzY3JpcHRvcnMtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmFzc2VtYmxpZXM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY2llcz4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hc3NlbWJsZS1zcmMtemlwPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5zaW5nbGU8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3JSZWZzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSZWZlcmVuY2UgdG8gYSBkZXNjcmlwdG9yIGluIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzOmFzc2VtYmxpZXMgbW9kdWxlIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3JSZWY+c3JjLXppcDwvZGVzY3JpcHRvclJlZj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9yUmVmcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGVjLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amF2YTwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgPC9wbHVnaW5NYW5hZ2VtZW50PgorICAgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3JlbG9hZC9SRUFETUUuTUQgYi9leGFtcGxlcy9yZWxvYWQvUkVBRE1FLk1ECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3YTg1N2IKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9yZWxvYWQvUkVBRE1FLk1ECkBAIC0wLDAgKzEsNjkgQEAKK1svL106ICMgIiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIgorWy8vXTogIyAiICIKK1svL106ICMgIiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgIgorWy8vXTogIyAiIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0ICIKK1svL106ICMgIiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuICIKK1svL106ICMgIiAiCitbLy9dOiAjICIgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZSAiCisKK1Jlc291cmNlIENvbmZpZ3VyYXRpb24gUmVsb2FkIEV4YW1wbGUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgdG8gY3JlYXRlIGEgc2ltcGxlIEplcnNleSBhcHBsaWNhdGlvbiB3aXRoCityZXNvdXJjZSByZWxvYWRpbmcgY2FwYWJpbGl0eSB1c2luZworW0dyaXp6bHkgSFRUUCBTZXJ2ZXIgY29udGFpbmVyXShodHRwOi8vZ3JpenpseS5qYXZhLm5ldCkuCisKK0NvbnRlbnRzCistLS0tLS0tLQorCitUaGUgbWFwcGluZyBvZiB0aGUgVVJJIHBhdGggc3BhY2UgaXMgcHJlc2VudGVkIGluIHRoZSBmb2xsb3dpbmcgdGFibGU6CisKK1VSSSBwYXRoICAgICAgICAgICAgICAgICAgICB8IFJlc291cmNlIGNsYXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IENvbnRlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEhUVFAgbWV0aG9kcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0KKyoqXy9mbGlnaHRzL2Fycml2YWxzXyoqICAgICB8IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnJlbG9hZC5BcnJpdmFsc1Jlc291cmNlICAgICB8IER1bW15IEFycml2YWxzIEluZm9ybWF0aW9uICAgICAgICAgICAgICAgICAgICAgICB8IEdFVAorKipfL2ZsaWdodHMvZGVwYXJ0dXJlc18qKiAgIHwgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMucmVsb2FkLkRlcGFydHVyZXNSZXNvdXJjZSAgIHwgRHVtbXkgRGVwYXJ0dXJlcyBJbmZvcm1hdGlvbiAgICAgICAgICAgICAgICAgICAgIHwgR0VUCisqKl8vZmxpZ2h0cy9zdGF0c18qKiAgICAgICAgfCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5yZWxvYWQuU3RhdHNSZXNvdXJjZSAgICAgICAgfCBTdGF0aXN0aWNzIG9uIGFwcGxpY2F0aW9uIHJlc291cmNlIHV0aWxpemF0aW9uICAgfCBHRVQKKworVGhlIGFwcGxpY2F0aW9uIGdldHMgY29uZmlndXJlZCB2aWEgYSBwbGFpbiB0ZXh0IGZpbGUgbmFtZWQgYHJlc291cmNlc2AuCitUaGUgZmlsZSBjb250YWlucyBhIGxpc3Qgb2YgcmVzb3VyY2UgY2xhc3NlcyB0byBiZSBwdWJsaXNoZWQgYnkgdGhlCithcHBsaWNhdGlvbi4gQWZ0ZXIgdGhlIGFwcGxpY2F0aW9uIGdldHMgc3RhcnRlZCwgaXQgd2F0Y2hlcyB0aGUgZmlsZSBzeXN0ZW0KK2FuZCByZWxvYWRzIHRoZSBhcHBsaWNhdGlvbiBhcyBmaWxlIHVwZGF0ZXMgYXJlIGJlaW5nIGRldGVjdGVkLgorQ2hhbmdlcyBpbiBKQVgtUlMgcmVzb3VyY2Ugc291cmNlIGZpbGVzIGFuZCB1cGRhdGVzIG9mIHRoZSBhYm92ZSBtZW50aW9uZWQgcmVzb3VyY2VzIGZpbGUKK2FyZSBiZWluZyBkZXRlY3RlZC4gSmF2YSBjb2RlIHJlLWNvbXBpbGF0aW9uIGlzIGRvbmUgYXMgcmVxdWlyZWQuCisKK1J1bm5pbmcgdGhlIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworUnVuIHRoZSBleGFtcGxlIGFzIGZvbGxvd3M6CisKKz4gICAgIG12biBjbGVhbiBjb21waWxlIGV4ZWM6amF2YQorCitUaGlzIGRlcGxveXMgY3VycmVudCBleGFtcGxlIHVzaW5nW0dyaXp6bHkKK2NvbnRhaW5lcl0oaHR0cDovL2dyaXp6bHkuamF2YS5uZXQvKS4gU3RhdHNSZXNvdXJjZSBzaG91bGQgYmUgYXZhaWxhYmxlCithdCA8aHR0cDovL2xvY2FsaG9zdDo4MDgwL2ZsaWdodHMvc3RhdHM+CisKK1lvdSBtYXkgd2FudCB0byBjaGVjayB0aGUgb3RoZXIgcmVzb3VyY2VzIGFzIHdlbGw6CisKKy0gICA8aHR0cDovL2xvY2FsaG9zdDo4MDgwL2ZsaWdodHMvZGVwYXJ0dXJlcz4KKy0gICA8aHR0cDovL2xvY2FsaG9zdDo4MDgwL2ZsaWdodHMvYXJyaXZhbHM+CisKK1VwZGF0ZWQgaW5mb3JtYXRpb24gb24gbnVtYmVyIG9mIGhpdHMgc2hvdWxkIGJlIGF2YWlsYWJsZSBhdAorPGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9mbGlnaHRzL3N0YXRzPi4KK05vdyB5b3UgY2FuIHRyeSB0byBlZGl0IHRoZSBgcmVzb3VyY2VzYCBmaWxlIGFuZCBjb21tZW50IHRoZSBzdGF0cworcmVzb3VyY2Ugb3V0IGJ5IHVzaW5nIHRoZSBgI2AgcHJlZml4LiBUaGUgcG9pbnQgaXMgeW91IGxlYXZlIHRoZQorYXBwbGljYXRpb24gcnVubmluZyB3aGlsZSBlZGl0aW5nIHRoZSBmaWxlLiBUaGUgY2hhbmdlcyB3aWwgZ2V0IHBpY2tlZAordXAgYXV0b21hdGljYWxseS4gTm8gbmVlZCB0byBtYW51YWxseSByZXN0YXJ0IHRoZSBhcHBsaWNhdGlvbi4gVGhlCitgcmVzb3VyY2VgIGZpbGUgY29udGVudCBzaG91bGQgbm93IGxvb2sgbGlrZSBmb2xsb3dzOgorCisgICAgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMucmVsb2FkLkRlcGFydHVyZXNSZXNvdXJjZQorICAgIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnJlbG9hZC5BcnJpdmFsc1Jlc291cmNlCisgICAgI29yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnJlbG9hZC5TdGF0c1Jlc291cmNlCisKK09uY2UgeW91IHNhdmUgdGhlIGNoYW5nZSwgdGhlIHN0YXRzIHJlc291cmNlIHNob3VsZCBub3QgYmUgYXZhaWxhYmxlLAorYnV0IHRoZSBvdGhlciwgZGVwYXJ0dXJlcy9hcnJpdmFscywgcmVzb3VyY2VzIHNob3VsZCByZW1haW4gZnVuY3Rpb25hbC4KKworTm93IHlvdSBjYW4gcmV2ZXJ0IHRoZSBjaGFuZ2UgYmFjayBhbmQgY2hlY2sgdGhlIHN0YXRzIHJlc291cmNlIGlzIGJhY2sKK3Byb3ZpZGluZyBhY3R1YWwgc3RhdGlzdGljcyBpbmZvcm1hdGlvbi4KKworWW91IGNhbiBhbHNvIHRyeSB0byBjaGFuZ2UgdGhlIEpBWC1SUyByZXNvdXJjZXMgc291cmNlIGNvZGUuIFRoZXNlIGNoYW5nZXMKK3dpbGwgYmUgYWxzbyBwaWNrZWQgdXAgYXV0b21hdGljYWxseS4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3JlbG9hZC9wb20ueG1sIGIvZXhhbXBsZXMvcmVsb2FkL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJmMDk3ZAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3JlbG9hZC9wb20ueG1sCkBAIC0wLDAgKzEsMTExIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorCisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5yZWxvYWQ8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktZXhhbXBsZXMtcmVsb2FkPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPkplcnNleSByZXNvdXJjZSBjb25maWd1cmF0aW9uIHJlbG9hZCBleGFtcGxlLjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLWdyaXp6bHkyLWh0dHA8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktaGsyPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwZW5kZW5jeS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPCEtLTx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4tLT4KKyAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5nZW5lcmF0ZS1zb3VyY2VzPC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5idWlsZC1jbGFzc3BhdGg8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxvdXRwdXRGaWxlPiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2NsYXNzcGF0aC5wcm9wZXJ0aWVzPC9vdXRwdXRGaWxlPgorICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RmlsdGVyRmlsZT50cnVlPC9vdXRwdXRGaWx0ZXJGaWxlPgorICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZVNjb3BlPmNvbXBpbGU8L2luY2x1ZGVTY29wZT4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+cHJvcGVydGllcy1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+MS4wLWFscGhhLTI8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+cmVhZC1wcm9qZWN0LXByb3BlcnRpZXM8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJlYWQtcHJvamVjdC1wcm9wZXJ0aWVzPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwhLS08cGhhc2U+aW5pdGlhbGl6ZTwvcGhhc2U+LS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+Z2VuZXJhdGUtc291cmNlczwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlPiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2NsYXNzcGF0aC5wcm9wZXJ0aWVzPC9maWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGVjLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPG1haW5DbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5yZWxvYWQuQXBwPC9tYWluQ2xhc3M+CisgICAgICAgICAgICAgICAgICAgIDxhcmd1bWVudHM+PGFyZ3VtZW50Pi1jcD0ke2NsYXNzcGF0aH08L2FyZ3VtZW50PjwvYXJndW1lbnRzPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+cmVsZWFzZTwvaWQ+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICA8L3Byb2ZpbGVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9yZWxvYWQvcmVzb3VyY2VzIGIvZXhhbXBsZXMvcmVsb2FkL3Jlc291cmNlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWQxMTNhCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvcmVsb2FkL3Jlc291cmNlcwpAQCAtMCwwICsxLDMgQEAKK29yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnJlbG9hZC5EZXBhcnR1cmVzUmVzb3VyY2UKK29yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnJlbG9hZC5BcnJpdmFsc1Jlc291cmNlCisjb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMucmVsb2FkLlN0YXRzUmVzb3VyY2UKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3JlbG9hZC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3JlbG9hZC9BcHAuamF2YSBiL2V4YW1wbGVzL3JlbG9hZC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3JlbG9hZC9BcHAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDI0NGY2Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvcmVsb2FkL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvcmVsb2FkL0FwcC5qYXZhCkBAIC0wLDAgKzEsMjI3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnJlbG9hZDsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlU3lzdGVtczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlN0YW5kYXJkV2F0Y2hFdmVudEtpbmRzOworaW1wb3J0IGphdmEubmlvLmZpbGUuV2F0Y2hFdmVudDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLldhdGNoS2V5OworaW1wb3J0IGphdmEubmlvLmZpbGUuV2F0Y2hTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5UaW1lcjsKK2ltcG9ydCBqYXZhLnV0aWwuVGltZXJUYXNrOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnJlbG9hZC5jb21waWxlci5BcHBDbGFzc0xvYWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5yZWxvYWQuY29tcGlsZXIuQ29tcGlsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMucmVsb2FkLmNvbXBpbGVyLkphdmFGaWxlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkyLmh0dHBzZXJ2ZXIuR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5ncml6emx5Lmh0dHAuc2VydmVyLkh0dHBTZXJ2ZXI7CisKK2ltcG9ydCBjb20uc3VuLm5pby5maWxlLlNlbnNpdGl2aXR5V2F0Y2hFdmVudE1vZGlmaWVyOworCisvKioKKyAqIFJlbG9hZCBleGFtcGxlIGFwcGxpY2F0aW9uLgorICogPHAvPgorICogQSB7QGxpbmsgQ29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXIgY29udGFpbmVyIGxpc3RlbmVyfSBnZXRzIHJlZ2lzdGVyZWQKKyAqIHdpdGggdGhlIGFwcGxpY2F0aW9uLiBVcG9uIGFwcGxpY2F0aW9uIHN0YXJ0dXAgbm90aWZpY2F0aW9uLCB0aGUgbGlzdGVuZXIgc2NoZWR1bGVzCisgKiBhIG5ldyB7QGxpbmsgVGltZXJUYXNrIHRpbWVyIHRhc2t9IHRvIGNoZWNrIGEgdGV4dCBmaWxlIGNhbGxlZCB7QGNvZGUgcmVzb3VyY2VzfQorICogZXZlcnkgMiBzZWNvbmRzLiBXaGVuIHRoZSB0ZXh0IGZpbGUgY2hhbmdlIGlzIGRldGVjdGVkLCB0aGUgYXBwbGljYXRpb24gZ2V0cyByZWxvYWRlZCB3aXRoCisgKiBhIG5ldyB7QGxpbmsgUmVzb3VyY2VDb25maWcgcmVzb3VyY2UgY29uZmlndXJhdGlvbn0gaW5jbHVkaW5nIGFsbAorICogcmVzb3VyY2UgY2xhc3NlcyBsaXN0ZWQgaW4gdGhhdCBmaWxlLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBBcHAgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoQXBwLmNsYXNzLmdldE5hbWUoKSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIEJBU0VfVVJJID0gVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2ZsaWdodHMvIik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVF9QQVRIID0gImFycml2YWxzIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05GSUdfRklMRU5BTUUgPSAicmVzb3VyY2VzIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTUkNfTUFJTl9KQVZBID0gInNyYy9tYWluL2phdmEiOworCisgICAgc3RhdGljIENvbnRhaW5lciBjb250YWluZXI7CisKKyAgICBzdGF0aWMgY2xhc3MgRmlsZUNoZWNrVGFzayBleHRlbmRzIFRpbWVyVGFzayB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKworICAgICAgICAgICAgV2F0Y2hTZXJ2aWNlIHdhdGNoZXI7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgd2F0Y2hlciA9IEZpbGVTeXN0ZW1zLmdldERlZmF1bHQoKS5uZXdXYXRjaFNlcnZpY2UoKTsKKworICAgICAgICAgICAgICAgIFBhdGggc3JjRGlyID0gUGF0aHMuZ2V0KCJzcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3JlbG9hZCIpOworICAgICAgICAgICAgICAgIHJlZ2lzdGVyV2F0Y2hlcih3YXRjaGVyLCBzcmNEaXIpOworCisgICAgICAgICAgICAgICAgUGF0aCBjb25maWdGaWxlUGF0aCA9IFBhdGhzLmdldCgiLiIpOworICAgICAgICAgICAgICAgIHJlZ2lzdGVyV2F0Y2hlcih3YXRjaGVyLCBjb25maWdGaWxlUGF0aCk7CisKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDb3VsZCBub3QgaW5pdGlhbGl6ZSB3YXRjaGVyIHNlcnZpY2UhIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoOzspIHsKKworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFdhdGNoS2V5IHdhdGNoS2V5ID0gd2F0Y2hlci50YWtlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoV2F0Y2hFdmVudDw/PiBldmVudCA6IHdhdGNoS2V5LnBvbGxFdmVudHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFdhdGNoRXZlbnQuS2luZDw/PiBraW5kID0gZXZlbnQua2luZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChraW5kID09IFN0YW5kYXJkV2F0Y2hFdmVudEtpbmRzLkVOVFJZX01PRElGWSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXYXRjaEV2ZW50PFBhdGg+IHBhdGhFdmVudCA9IChXYXRjaEV2ZW50PFBhdGg+KSBldmVudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGF0aCBtb2RpZmllZEZpbGUgPSBwYXRoRXZlbnQuY29udGV4dCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiRklMRSBNT0RJRklFRDogJXNcbiIsIG1vZGlmaWVkRmlsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgd2F0Y2hLZXkucmVzZXQoKTsgLy8gc28gdGhhdCBjb25zZWN1dGl2ZSBldmVudHMgY291bGQgYmUgcHJvY2Vzc2VkCisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlIGNvbmZpZ0ZpbGUgPSBuZXcgRmlsZShDT05GSUdfRklMRU5BTUUpOworICAgICAgICAgICAgICAgICAgICByZWxvYWRBcHAoY29uZmlnRmlsZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCByZWdpc3RlcldhdGNoZXIoV2F0Y2hTZXJ2aWNlIHdhdGNoZXIsIFBhdGggZGlyZWN0b3J5KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgZGlyZWN0b3J5LnJlZ2lzdGVyKHdhdGNoZXIsCisgICAgICAgICAgICAgICAgICAgIG5ldyBXYXRjaEV2ZW50LktpbmRbXXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFuZGFyZFdhdGNoRXZlbnRLaW5kcy5FTlRSWV9NT0RJRlkKKyAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgU2Vuc2l0aXZpdHlXYXRjaEV2ZW50TW9kaWZpZXIuSElHSCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgcmVsb2FkQXBwKGZpbmFsIEZpbGUgY29uZmlnRmlsZSkgeworICAgICAgICAgICAgTE9HR0VSLmluZm8oIlJlbG9hZGluZyByZXNvdXJjZSBjbGFzc2VzOiIpOworICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmMgPSBjcmVhdGVSZXNvdXJjZUNvbmZpZyhjb25maWdGaWxlKTsKKyAgICAgICAgICAgIEFwcC5jb250YWluZXIucmVsb2FkKHJjKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VDb25maWcgY3JlYXRlUmVzb3VyY2VDb25maWcoRmlsZSBjb25maWdGaWxlKSB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJjID0gbmV3IFJlc291cmNlQ29uZmlnKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIEFwcENsYXNzTG9hZGVyIGFwcENsYXNzTG9hZGVyID0gbmV3IEFwcENsYXNzTG9hZGVyKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOworICAgICAgICAgICAgZmluYWwgTGlzdDxKYXZhRmlsZT4gamF2YUZpbGVzID0gZ2V0SmF2YUZpbGVzKGNvbmZpZ0ZpbGUpOworCisgICAgICAgICAgICBDb21waWxlci5jb21waWxlKGFwcENsYXNzTG9hZGVyLCBqYXZhRmlsZXMpOworCisgICAgICAgICAgICBmb3IgKEphdmFGaWxlIGphdmFGaWxlIDogamF2YUZpbGVzKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmMucmVnaXN0ZXJDbGFzc2VzKGFwcENsYXNzTG9hZGVyLmxvYWRDbGFzcyhqYXZhRmlsZS5nZXRDbGFzc05hbWUoKSkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIENsYXNzTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmluZm8oU3RyaW5nLmZvcm1hdCgiICEgY2xhc3MgJXMgbm90IGZvdW5kLlxuIiwgamF2YUZpbGUuZ2V0Q2xhc3NOYW1lKCkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihBcHAuY2xhc3MuZ2V0TmFtZSgpKS5sb2coTGV2ZWwuU0VWRVJFLCBudWxsLCBleCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxKYXZhRmlsZT4gZ2V0SmF2YUZpbGVzKEZpbGUgY29uZmlnRmlsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgZmluYWwgTGlzdDxKYXZhRmlsZT4gamF2YUZpbGVzID0gbmV3IExpbmtlZExpc3Q8PigpOworCisgICAgICAgIHRyeSAoQnVmZmVyZWRSZWFkZXIgciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIobmV3IEZpbGVJbnB1dFN0cmVhbShjb25maWdGaWxlKSwgIlVURi04IikpKSB7CisgICAgICAgICAgICB3aGlsZSAoci5yZWFkeSgpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNsYXNzTmFtZSA9IHIucmVhZExpbmUoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWNsYXNzTmFtZS5zdGFydHNXaXRoKCIjIikpIHsKKyAgICAgICAgICAgICAgICAgICAgamF2YUZpbGVzLmFkZChuZXcgSmF2YUZpbGUoY2xhc3NOYW1lLCBTUkNfTUFJTl9KQVZBKSk7CisgICAgICAgICAgICAgICAgICAgIExPR0dFUi5pbmZvKFN0cmluZy5mb3JtYXQoIiArIGluY2x1ZGVkIGNsYXNzICVzLlxuIiwgY2xhc3NOYW1lKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmluZm8oU3RyaW5nLmZvcm1hdCgiIC0gaWdub3JlZCBjbGFzcyAlc1xuIiwgY2xhc3NOYW1lLnN1YnN0cmluZygxKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gamF2YUZpbGVzOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGZpbmFsIFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgTE9HR0VSLmluZm8oIlJlc291cmNlIENvbmZpZyBSZWxvYWQgSmVyc2V5IEV4YW1wbGUgQXBwIik7CisKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIHMgOiBhcmdzKSB7CisgICAgICAgICAgICAgICAgaWYgKHMuc3RhcnRzV2l0aCgiLWNwPSIpKSB7CisgICAgICAgICAgICAgICAgICAgIENvbXBpbGVyLmNsYXNzcGF0aCA9IHMuc3Vic3RyaW5nKDQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBjcmVhdGVSZXNvdXJjZUNvbmZpZyhuZXcgRmlsZShDT05GSUdfRklMRU5BTUUpKTsKKyAgICAgICAgICAgIHJlZ2lzdGVyUmVsb2FkZXIocmVzb3VyY2VDb25maWcpOworCisgICAgICAgICAgICBmaW5hbCBIdHRwU2VydmVyIHNlcnZlciA9IEdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeS5jcmVhdGVIdHRwU2VydmVyKEJBU0VfVVJJLCByZXNvdXJjZUNvbmZpZywgdHJ1ZSk7CisgICAgICAgICAgICBSdW50aW1lLmdldFJ1bnRpbWUoKS5hZGRTaHV0ZG93bkhvb2sobmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIuc2h1dGRvd25Ob3coKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KSk7CisgICAgICAgICAgICBzZXJ2ZXIuc3RhcnQoKTsKKworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJBcHBsaWNhdGlvbiBzdGFydGVkLlxuVHJ5IG91dCAlcyVzXG5TdG9wIHRoZSBhcHBsaWNhdGlvbiB1c2luZyBDVFJMK0MiLCBCQVNFX1VSSSwgUk9PVF9QQVRIKSk7CisKKyAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuam9pbigpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiB8IEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKEFwcC5jbGFzcy5nZXROYW1lKCkpLmxvZyhMZXZlbC5TRVZFUkUsIG51bGwsIGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIENsYXNzPD8+IGxvYWRDbGFzcyhTdHJpbmcgY2xhc3NOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSmF2YUZpbGUgamF2YUZpbGUgPSBuZXcgSmF2YUZpbGUoY2xhc3NOYW1lLCBTUkNfTUFJTl9KQVZBKTsKKyAgICAgICAgcmV0dXJuIENvbXBpbGVyLmNvbXBpbGUoY2xhc3NOYW1lLCBqYXZhRmlsZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZWdpc3RlclJlbG9hZGVyKFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnKSB7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVySW5zdGFuY2VzKG5ldyBDb250YWluZXJMaWZlY3ljbGVMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25TdGFydHVwKGZpbmFsIENvbnRhaW5lciBjb250YWluZXIpIHsKKyAgICAgICAgICAgICAgICBBcHAuY29udGFpbmVyID0gY29udGFpbmVyOworICAgICAgICAgICAgICAgIGZpbmFsIFRpbWVyIHQgPSBuZXcgVGltZXIodHJ1ZSk7CisgICAgICAgICAgICAgICAgdC5zY2hlZHVsZShuZXcgRmlsZUNoZWNrVGFzaygpLCAwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlbG9hZChmaW5hbCBDb250YWluZXIgY29udGFpbmVyKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBcHBsaWNhdGlvbiBoYXMgYmVlbiByZWxvYWRlZCEiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblNodXRkb3duKGZpbmFsIENvbnRhaW5lciBjb250YWluZXIpIHsKKyAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvcmVsb2FkL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvcmVsb2FkL0Fycml2YWxzUmVzb3VyY2UuamF2YSBiL2V4YW1wbGVzL3JlbG9hZC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3JlbG9hZC9BcnJpdmFsc1Jlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg0OWY1YQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3JlbG9hZC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3JlbG9hZC9BcnJpdmFsc1Jlc291cmNlLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5yZWxvYWQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKKworLyoqCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoImFycml2YWxzIikKK3B1YmxpYyBjbGFzcyBBcnJpdmFsc1Jlc291cmNlIHsKKworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXJyaXZhbHMoKSB7CisgICAgICAgIEZsaWdodHNEQi5hcnJpdmFsc1JlcUNvdW50LmluY3JlbWVudEFuZEdldCgpOworICAgICAgICByZXR1cm4gIk5vIGFycml2YWwgc2NoZWR1bGVkIGluIHRoZSBmb2xsb3dpbmcgZGF5cyI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvcmVsb2FkL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvcmVsb2FkL0RlcGFydHVyZXNSZXNvdXJjZS5qYXZhIGIvZXhhbXBsZXMvcmVsb2FkL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvcmVsb2FkL0RlcGFydHVyZXNSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZjkwOTgKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9yZWxvYWQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9yZWxvYWQvRGVwYXJ0dXJlc1Jlc291cmNlLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5yZWxvYWQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKKworLyoqCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoImRlcGFydHVyZXMiKQorcHVibGljIGNsYXNzIERlcGFydHVyZXNSZXNvdXJjZSB7CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlcGFydHVyZXMoKSB7CisgICAgICAgIEZsaWdodHNEQi5kZXBhcnR1cmVzUmVxQ291bnQuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICAgIHJldHVybiAiTm8gZGVwYXJ0dXJlIHNjaGVkdWxlZCBpbiB0aGUgZm9sbG93aW5nIGRheXMiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3JlbG9hZC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3JlbG9hZC9GbGlnaHRzREIuamF2YSBiL2V4YW1wbGVzL3JlbG9hZC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3JlbG9hZC9GbGlnaHRzREIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGU5M2RiCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvcmVsb2FkL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvcmVsb2FkL0ZsaWdodHNEQi5qYXZhCkBAIC0wLDAgKzEsMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMucmVsb2FkOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CisKKy8qKgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBGbGlnaHRzREIgeworCisgICAgc3RhdGljIEF0b21pY0ludGVnZXIgZGVwYXJ0dXJlc1JlcUNvdW50ID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKyAgICBzdGF0aWMgQXRvbWljSW50ZWdlciBhcnJpdmFsc1JlcUNvdW50ID0gbmV3IEF0b21pY0ludGVnZXIoKTsKK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3JlbG9hZC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3JlbG9hZC9TdGF0c1Jlc291cmNlLmphdmEgYi9leGFtcGxlcy9yZWxvYWQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9yZWxvYWQvU3RhdHNSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMGZjYTYKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9yZWxvYWQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9yZWxvYWQvU3RhdHNSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMucmVsb2FkOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CisKKy8qKgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJzdGF0cyIpCitAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorcHVibGljIGNsYXNzIFN0YXRzUmVzb3VyY2UgeworCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhdHMoKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJBcnJpdmFscyByZXNvdXJjZSBoaXRzOiAlZFxuRGVwYXJ0dXJlcyByZXNvdXJjZSBoaXRzOiAlZCIsCisgICAgICAgICAgICAgICAgRmxpZ2h0c0RCLmFycml2YWxzUmVxQ291bnQuZ2V0KCksIEZsaWdodHNEQi5kZXBhcnR1cmVzUmVxQ291bnQuZ2V0KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3JlbG9hZC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3JlbG9hZC9jb21waWxlci9BcHBDbGFzc0xvYWRlci5qYXZhIGIvZXhhbXBsZXMvcmVsb2FkL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvcmVsb2FkL2NvbXBpbGVyL0FwcENsYXNzTG9hZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlhODgyOAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3JlbG9hZC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3JlbG9hZC9jb21waWxlci9BcHBDbGFzc0xvYWRlci5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMucmVsb2FkLmNvbXBpbGVyOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBJbiBvcmRlciB0byBsb2FkIHJlLWNvbXBpbGVkIGNsYXNzZXMgd2UgbmVlZAorICogdG8gaGF2ZSBhIHNlcGFyYXRlIGNsYXNzLWxvYWRlciBmb3IgZWFjaCByZWxvYWQuCisgKgorICogSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBBcHBDbGFzc0xvYWRlciBleHRlbmRzIENsYXNzTG9hZGVyIHsKKworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgQ2xhc3NGaWxlPiBjbGFzc0ZpbGVzID0gbmV3IEhhc2hNYXA8PigpOworCisgICAgcHVibGljIEFwcENsYXNzTG9hZGVyKENsYXNzTG9hZGVyIHBhcmVudCkgeworICAgICAgICBzdXBlcihwYXJlbnQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvZGUoQ2xhc3NGaWxlIGNjKSB7CisgICAgICAgIGNsYXNzRmlsZXMucHV0KGNjLmdldE5hbWUoKSwgY2MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBDbGFzczw/PiBmaW5kQ2xhc3MoU3RyaW5nIG5hbWUpIHRocm93cyBDbGFzc05vdEZvdW5kRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3NGaWxlIGNjID0gY2xhc3NGaWxlcy5nZXQobmFtZSk7CisgICAgICAgIGlmIChjYyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZmluZENsYXNzKG5hbWUpOworICAgICAgICB9CisgICAgICAgIGJ5dGVbXSBieXRlQ29kZSA9IGNjLmdldEJ5dGVDb2RlKCk7CisgICAgICAgIHJldHVybiBkZWZpbmVDbGFzcyhuYW1lLCBieXRlQ29kZSwgMCwgYnl0ZUNvZGUubGVuZ3RoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2xhc3M8Pz4gbG9hZENsYXNzKFN0cmluZyBuYW1lKSB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHdlIGFyZSBjaGVhdGluZyBoZXJlLCB0aGUgcGFyZW50IGFscmVhZHkgaGFzIHRoZSBjbGFzcywgYnV0IHdlIHByZWZlciBvdXIgYnl0ZWNvZGUgdG8gYmUgdXNlZC4KKyAgICAgICAgQ2xhc3NGaWxlIGNjID0gY2xhc3NGaWxlcy5nZXQobmFtZSk7CisgICAgICAgIGlmIChjYyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIubG9hZENsYXNzKG5hbWUpOworICAgICAgICB9CisgICAgICAgIGJ5dGVbXSBieXRlQ29kZSA9IGNjLmdldEJ5dGVDb2RlKCk7CisgICAgICAgIHJldHVybiBkZWZpbmVDbGFzcyhuYW1lLCBieXRlQ29kZSwgMCwgYnl0ZUNvZGUubGVuZ3RoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9yZWxvYWQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9yZWxvYWQvY29tcGlsZXIvQ2xhc3NGaWxlLmphdmEgYi9leGFtcGxlcy9yZWxvYWQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9yZWxvYWQvY29tcGlsZXIvQ2xhc3NGaWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ1MTFjZgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3JlbG9hZC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3JlbG9hZC9jb21waWxlci9DbGFzc0ZpbGUuamF2YQpAQCAtMCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnJlbG9hZC5jb21waWxlcjsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LnRvb2xzLlNpbXBsZUphdmFGaWxlT2JqZWN0OworCisvKioKKyAqIENsYXNzIGZpbGUgcmVwcmVzZW50YXRpb24uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIENsYXNzRmlsZSBleHRlbmRzIFNpbXBsZUphdmFGaWxlT2JqZWN0IHsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGNsYXNzTmFtZTsKKworICAgIHByaXZhdGUgZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ5dGVDb2RlID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBjbGFzcyBmaWxlIGhvbGRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGFzc05hbWUgY2xhc3MgbmFtZS4KKyAgICAgKiBAdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiBpbiBjYXNlIGdpdmVuIGNsYXNzIG5hbWUgY291bGQgbm90IGJlIHJlcHJlc2VudGVkIGFzIGFuIFVSSS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3NGaWxlKFN0cmluZyBjbGFzc05hbWUpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24geworICAgICAgICBzdXBlcihuZXcgVVJJKGNsYXNzTmFtZSksIEtpbmQuQ0xBU1MpOworICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXR0ZXIgZm9yIGNsYXNzIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2xhc3MgZmlsZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gY2xhc3MgbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENsYXNzTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIG9wZW5PdXRwdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gYnl0ZUNvZGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBieXRlIGNvZGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNsYXNzIGFmdGVyIHRoZSBjbGFzcyBoYXMgYmVlbiBjb21waWxlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gY29tcGlsZWQgYnl0ZSBjb2RlIG9mIHRoZSBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYnl0ZVtdIGdldEJ5dGVDb2RlKCkgeworICAgICAgICByZXR1cm4gYnl0ZUNvZGUudG9CeXRlQXJyYXkoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9yZWxvYWQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9yZWxvYWQvY29tcGlsZXIvQ29tcGlsZXIuamF2YSBiL2V4YW1wbGVzL3JlbG9hZC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3JlbG9hZC9jb21waWxlci9Db21waWxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNjAyZTMKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9yZWxvYWQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9yZWxvYWQvY29tcGlsZXIvQ29tcGlsZXIuamF2YQpAQCAtMCwwICsxLDg0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnJlbG9hZC5jb21waWxlcjsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC50b29scy5KYXZhQ29tcGlsZXI7CitpbXBvcnQgamF2YXgudG9vbHMuSmF2YUZpbGVPYmplY3Q7CitpbXBvcnQgamF2YXgudG9vbHMuU2ltcGxlSmF2YUZpbGVPYmplY3Q7CitpbXBvcnQgamF2YXgudG9vbHMuVG9vbFByb3ZpZGVyOworCisvKioKKyAqIEphdmEgY29tcGlsZXIgdXRpbGl0eS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQ29tcGlsZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgSmF2YUNvbXBpbGVyIGphdmFjID0gVG9vbFByb3ZpZGVyLmdldFN5c3RlbUphdmFDb21waWxlcigpOworCisgICAgLyoqCisgICAgICogQ29tcGlsZXIgY2xhc3NwYXRoLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNsYXNzcGF0aDsKKworICAgIC8qKgorICAgICAqIENvbXBpbGVzIGEgc2luZ2xlIGNsYXNzIGFuZCBsb2FkcyB0aGUgY2xhc3MgdXNpbmcgYSBuZXcgY2xhc3MgbG9hZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzTmFtZSBjbGFzcyB0byBjb21waWxlLgorICAgICAqIEBwYXJhbSBzb3VyY2VDb2RlIHNvdXJjZSBjb2RlIG9mIHRoZSBjbGFzcyB0byBjb21waWxlLgorICAgICAqIEByZXR1cm4gbG9hZGVkIGNsYXNzCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENsYXNzPD8+IGNvbXBpbGUoU3RyaW5nIGNsYXNzTmFtZSwgU2ltcGxlSmF2YUZpbGVPYmplY3Qgc291cmNlQ29kZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENsYXNzRmlsZSBjbGFzc0ZpbGUgPSBuZXcgQ2xhc3NGaWxlKGNsYXNzTmFtZSk7CisKKyAgICAgICAgSXRlcmFibGU8PyBleHRlbmRzIEphdmFGaWxlT2JqZWN0PiBjb21waWxhdGlvblVuaXRzID0gQXJyYXlzLmFzTGlzdChzb3VyY2VDb2RlKTsKKyAgICAgICAgQXBwQ2xhc3NMb2FkZXIgY2wgPSBuZXcgQXBwQ2xhc3NMb2FkZXIoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgIEZpbGVNYW5hZ2VyIGZpbGVNYW5hZ2VyID0gbmV3IEZpbGVNYW5hZ2VyKGphdmFjLmdldFN0YW5kYXJkRmlsZU1hbmFnZXIobnVsbCwgbnVsbCwgbnVsbCksIEFycmF5cy5hc0xpc3QoY2xhc3NGaWxlKSwgY2wpOworICAgICAgICBKYXZhQ29tcGlsZXIuQ29tcGlsYXRpb25UYXNrIHRhc2sgPSBqYXZhYy5nZXRUYXNrKG51bGwsIGZpbGVNYW5hZ2VyLCBudWxsLCBnZXRDbE9wdGlvbnMoKSwgbnVsbCwgY29tcGlsYXRpb25Vbml0cyk7CisgICAgICAgIHRhc2suY2FsbCgpOworICAgICAgICByZXR1cm4gY2wubG9hZENsYXNzKGNsYXNzTmFtZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb21waWxlcyBtdWx0aXBsZSBzb3VyY2UgZmlsZXMgYXQgb25jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcHBDbGFzc0xvYWRlciBjb21tb24gY2xhc3MgbG9hZGVyIGZvciB0aGUgY2xhc3Nlcy4KKyAgICAgKiBAcGFyYW0gamF2YUZpbGVzIHNvdXJjZSBmaWxlcyB0byBjb21waWxlLgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGluIGNhc2Ugc29tZXRoaW5nIGdvZXMgd3JvbmcuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNvbXBpbGUoQXBwQ2xhc3NMb2FkZXIgYXBwQ2xhc3NMb2FkZXIsIExpc3Q8SmF2YUZpbGU+IGphdmFGaWxlcykgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgTGlzdDxDbGFzc0ZpbGU+IGNsYXNzZXMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisKKyAgICAgICAgZm9yIChKYXZhRmlsZSBqYXZhRmlsZSA6IGphdmFGaWxlcykgeworICAgICAgICAgICAgY2xhc3Nlcy5hZGQobmV3IENsYXNzRmlsZShqYXZhRmlsZS5nZXRDbGFzc05hbWUoKSkpOworICAgICAgICB9CisgICAgICAgIEl0ZXJhYmxlPD8gZXh0ZW5kcyBKYXZhRmlsZU9iamVjdD4gY29tcGlsYXRpb25Vbml0cyA9IGphdmFGaWxlczsKKworICAgICAgICBGaWxlTWFuYWdlciBmaWxlTWFuYWdlciA9IG5ldyBGaWxlTWFuYWdlcihqYXZhYy5nZXRTdGFuZGFyZEZpbGVNYW5hZ2VyKG51bGwsIG51bGwsIG51bGwpLCBjbGFzc2VzLCBhcHBDbGFzc0xvYWRlcik7CisgICAgICAgIEphdmFDb21waWxlci5Db21waWxhdGlvblRhc2sgdGFzayA9IGphdmFjLmdldFRhc2sobnVsbCwgZmlsZU1hbmFnZXIsIG51bGwsIGdldENsT3B0aW9ucygpLCBudWxsLCBjb21waWxhdGlvblVuaXRzKTsKKyAgICAgICAgdGFzay5jYWxsKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldENsT3B0aW9ucygpIHsKKyAgICAgICAgTGlzdDxTdHJpbmc+IG9wdGlvbkxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgb3B0aW9uTGlzdC5hZGRBbGwoQXJyYXlzLmFzTGlzdCgiLWNsYXNzcGF0aCIsIGNsYXNzcGF0aCArIEZpbGUucGF0aFNlcGFyYXRvciArICJ0YXJnZXQvY2xhc3NlcyIpKTsKKyAgICAgICAgcmV0dXJuIG9wdGlvbkxpc3Q7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvcmVsb2FkL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvcmVsb2FkL2NvbXBpbGVyL0ZpbGVNYW5hZ2VyLmphdmEgYi9leGFtcGxlcy9yZWxvYWQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9yZWxvYWQvY29tcGlsZXIvRmlsZU1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmM2MTFlCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvcmVsb2FkL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvcmVsb2FkL2NvbXBpbGVyL0ZpbGVNYW5hZ2VyLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5yZWxvYWQuY29tcGlsZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC50b29scy5GaWxlT2JqZWN0OworaW1wb3J0IGphdmF4LnRvb2xzLkZvcndhcmRpbmdKYXZhRmlsZU1hbmFnZXI7CitpbXBvcnQgamF2YXgudG9vbHMuSmF2YUZpbGVNYW5hZ2VyOworaW1wb3J0IGphdmF4LnRvb2xzLkphdmFGaWxlT2JqZWN0OworCisvKioKKyAqIEZpbGUgbWFuYWdlciBkZWxlZ2F0b3IgdG8gY29udHJvbCBvdXIgc291cmNlIGFuZCBjbGFzcyBmaWxlcy4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBAIG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBGaWxlTWFuYWdlciBleHRlbmRzIEZvcndhcmRpbmdKYXZhRmlsZU1hbmFnZXI8SmF2YUZpbGVNYW5hZ2VyPiB7CisKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIENsYXNzRmlsZT4gY2xhc3NGaWxlczsKKyAgICBwcml2YXRlIGZpbmFsIEFwcENsYXNzTG9hZGVyIGNsOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiBGaWxlTWFuYWdlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlTWFuYWdlciBkZWxlZ2F0ZSB0byB0aGlzIGZpbGUgbWFuYWdlcgorICAgICAqIEBwYXJhbSBjbAorICAgICAqLworICAgIHByb3RlY3RlZCBGaWxlTWFuYWdlcihKYXZhRmlsZU1hbmFnZXIgZmlsZU1hbmFnZXIsIExpc3Q8Q2xhc3NGaWxlPiBjbGFzc0ZpbGVzLCBBcHBDbGFzc0xvYWRlciBjbCkgeworICAgICAgICBzdXBlcihmaWxlTWFuYWdlcik7CisgICAgICAgIHRoaXMuY2xhc3NGaWxlcyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgdGhpcy5jbCA9IGNsOworICAgICAgICBmb3IgKENsYXNzRmlsZSBjbGFzc0ZpbGUgOiBjbGFzc0ZpbGVzKSB7CisgICAgICAgICAgICB0aGlzLmNsYXNzRmlsZXMucHV0KGNsYXNzRmlsZS5nZXRDbGFzc05hbWUoKSwgY2xhc3NGaWxlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBKYXZhRmlsZU9iamVjdCBnZXRKYXZhRmlsZUZvck91dHB1dCgKKyAgICAgICAgICAgIEphdmFGaWxlTWFuYWdlci5Mb2NhdGlvbiBsb2NhdGlvbiwKKyAgICAgICAgICAgIFN0cmluZyBjbGFzc05hbWUsCisgICAgICAgICAgICBKYXZhRmlsZU9iamVjdC5LaW5kIGtpbmQsCisgICAgICAgICAgICBGaWxlT2JqZWN0IHNpYmxpbmcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgZmluYWwgQ2xhc3NGaWxlIGNsYXNzRmlsZSA9IGNsYXNzRmlsZXMuZ2V0KGNsYXNzTmFtZSk7CisgICAgICAgIGlmIChjbGFzc0ZpbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5jbC5zZXRDb2RlKGNsYXNzRmlsZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY2xhc3NGaWxlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDbGFzc0xvYWRlciBnZXRDbGFzc0xvYWRlcihKYXZhRmlsZU1hbmFnZXIuTG9jYXRpb24gbG9jYXRpb24pIHsKKyAgICAgICAgcmV0dXJuIGNsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3JlbG9hZC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3JlbG9hZC9jb21waWxlci9KYXZhRmlsZS5qYXZhIGIvZXhhbXBsZXMvcmVsb2FkL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvcmVsb2FkL2NvbXBpbGVyL0phdmFGaWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc0NThlZgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3JlbG9hZC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3JlbG9hZC9jb21waWxlci9KYXZhRmlsZS5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMucmVsb2FkLmNvbXBpbGVyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsKKworaW1wb3J0IGphdmF4LnRvb2xzLlNpbXBsZUphdmFGaWxlT2JqZWN0OworCisvKioKKyAqIEphdmEgc291cmNlIGZpbGUgcmVwcmVzZW50YXRpb24uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEphdmFGaWxlIGV4dGVuZHMgU2ltcGxlSmF2YUZpbGVPYmplY3QgeworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY2xhc3NOYW1lOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHBhdGg7CisKKyAgICBwdWJsaWMgSmF2YUZpbGUoU3RyaW5nIGNsYXNzTmFtZSwgU3RyaW5nIHBhdGgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlcihVUkkuY3JlYXRlKCJzdHJpbmc6Ly8vIiArIGNsYXNzTmFtZS5yZXBsYWNlKCcuJywgJy8nKSArIEtpbmQuU09VUkNFLmV4dGVuc2lvbiksIEtpbmQuU09VUkNFKTsKKyAgICAgICAgdGhpcy5jbGFzc05hbWUgPSBjbGFzc05hbWU7CisgICAgICAgIHRoaXMucGF0aCA9IHBhdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xhc3MgbmFtZSBnZXR0ZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGNsYXNzIG5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWUoKSB7CisgICAgICAgIHJldHVybiBjbGFzc05hbWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRDaGFyQ29udGVudChib29sZWFuIGlnbm9yZUVuY29kaW5nRXJyb3JzKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIFN0cmluZyBmaWxlUGF0aCA9IHBhdGggKyBGaWxlLnNlcGFyYXRvciArIGNsYXNzTmFtZS5yZXBsYWNlKCcuJywgJy8nKSArIEtpbmQuU09VUkNFLmV4dGVuc2lvbjsKKyAgICAgICAgZmluYWwgYnl0ZVtdIGJ5dGVzID0gRmlsZXMucmVhZEFsbEJ5dGVzKFBhdGhzLmdldChmaWxlUGF0aCkpOworCisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJ5dGVzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9yZWxvYWQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9yZWxvYWQvUmVsb2FkVGVzdC5qYXZhIGIvZXhhbXBsZXMvcmVsb2FkL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvcmVsb2FkL1JlbG9hZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWZkMDc5Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvcmVsb2FkL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvcmVsb2FkL1JlbG9hZFRlc3QuamF2YQpAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnJlbG9hZDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5BYnN0cmFjdENvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29udGFpbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogVGhpcyBpcyB0byB0ZXN0IHRoZSByZWxvYWQgZmVhdHVyZSB3aXRob3V0IHVwZGF0aW5nIHRoZSByZXNvdXJjZXMgdGV4dCBmaWxlLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBSZWxvYWRUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBDb250YWluZXIgY29udGFpbmVyOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXN1bHQgPSBuZXcgUmVzb3VyY2VDb25maWcoQXJyaXZhbHNSZXNvdXJjZS5jbGFzcyk7CisKKyAgICAgICAgcmVzdWx0LnJlZ2lzdGVySW5zdGFuY2VzKG5ldyBBYnN0cmFjdENvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0dXAoQ29udGFpbmVyIGNvbnRhaW5lcikgeworICAgICAgICAgICAgICAgIFJlbG9hZFRlc3QuY29udGFpbmVyID0gY29udGFpbmVyOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlbG9hZCgpIHsKKworICAgICAgICAvLyBoaXQgYXJyaXZhbHMKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJhcnJpdmFscyIpLnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfUExBSU4pLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgLy8gbWFrZSBzdXJlIHN0YXRzIHJlc291cmNlIGlzIG5vdCBmb3VuZAorICAgICAgICByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInN0YXRzIikucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9QTEFJTikuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDQsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICAvLyBhZGQgc3RhdHMgcmVzb3VyY2UKKyAgICAgICAgY29udGFpbmVyLnJlbG9hZChuZXcgUmVzb3VyY2VDb25maWcoQXJyaXZhbHNSZXNvdXJjZS5jbGFzcywgU3RhdHNSZXNvdXJjZS5jbGFzcykpOworCisgICAgICAgIC8vIGNoZWNrIHN0YXRzCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgic3RhdHMiKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRUcnVlKCIxIGV4cGVjdGVkIGFzIG51bWJlciBvZiBhcnJpdmFscyBoaXRzIGluIHN0YXRzIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLmNvbnRhaW5zKCIxIikpOworCisgICAgICAgIC8vIGFub3RoZXIgYXJyaXZhbHMgaGl0CisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiYXJyaXZhbHMiKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworCisgICAgICAgIC8vIGNoZWNrIHVwZGF0ZWQgc3RhdHMKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJzdGF0cyIpLnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfUExBSU4pLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydFRydWUoIjIgZXhwZWN0ZWQgYXMgbnVtYmVyIG9mIGFycml2YWxzIGhpdHMgaW4gc3RhdHMiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykuY29udGFpbnMoIjIiKSk7CisKKyAgICAgICAgLy8gcmVtb3ZlIHN0YXRzCisgICAgICAgIGNvbnRhaW5lci5yZWxvYWQobmV3IFJlc291cmNlQ29uZmlnKEFycml2YWxzUmVzb3VyY2UuY2xhc3MpKTsKKworICAgICAgICAvLyBtYWtlIHN1cmUgc3RhdHMgcmVzb3VyY2UgaXMgbm90IGZvdW5kCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgic3RhdHMiKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwNCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3J4LWNsaWVudC13ZWJhcHAvUkVBRE1FLk1EIGIvZXhhbXBsZXMvcngtY2xpZW50LXdlYmFwcC9SRUFETUUuTUQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZiNTNjYgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3J4LWNsaWVudC13ZWJhcHAvUkVBRE1FLk1ECkBAIC0wLDAgKzEsMTYwIEBACitbLy9dOiAjICIgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICIKK1svL106ICMgIiAiCitbLy9dOiAjICIgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlICIKK1svL106ICMgIiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCAiCitbLy9dOiAjICIgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLiAiCitbLy9dOiAjICIgIgorWy8vXTogIyAiIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UgIgorCitSZWFjdGl2ZSBDbGllbnRzIEplcnNleSBSZWFjdGl2ZSBDbGllbnQgRXh0ZW5zaW9ucyBFeGFtcGxlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IGRhdGEgZnJvbSBtdWx0aXBsZSByZXNvdXJjZXMgYW5kIGluCit2YXJpb3VzIGZvcm1hdHMgKGpzb24sIHhtbCkgY2FuIGJlIGNvbWJpbmVkIGludG8gYSBmb3JtIHN1aXRhYmxlIHRvIG9uZXMKK3JlcXVpcmVtZW50cy4gVGhlIGV4YW1wbGUgc2hvdyBhbmQgY29tcGFyZXMgdXNhZ2Ugb2Ygc3RhbmRhcmQgSkFYLVJTCitzeW5jIGNsaWVudCwgSkFYLVJTIGFzeW5jIGNsaWVudCwgSmVyc2V5J3MgT2JzZXJ2YWJsZSAoUnhKYXZhKSBjbGllbnQKK2V4dGVuc2lvbiwgSmVyc2V5J3MgQ29tcGxldGlvblN0YWdlIChKYXZhIDgpIGNsaWVudCBleHRlbnNpb24gYW5kCitKZXJzZXkncyBMaXN0ZW5hYmxlRnV0dXJlIChHdWF2YSkgY2xpZW50IGV4dGVuc2lvbi4KKworVGhlIGFwcGxpY2F0aW9uIGNvbnNpc3RzIG9mIHR3byBwYXJ0czoKKworLSAgICoqIlJlbW90ZSIqKiwgdGhhdCBjYW4gYmUgY29uc2lkZXJlZCB0byBiZSBkZXBsb3llZCBvbiBhCisgICAgcmVtb3RlIG1hY2hpbmUuIEluIGZhY3QgZWFjaCByZXNvdXJjZSBmcm9tCisgICAgYG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnJ4LnJlbW90ZWAgcGFja2FnZSBjYW4gYmUgZGVwbG95ZWQgb24KKyAgICBhIHNlcGFyYXRlIHJlbW90ZSBtYWNoaW5lIGFzIGV2ZXJ5IHJlc291cmNlIHJlcHJlc2VudHMgYSBzZXJ2aWNlIG9mCisgICAgaXQncyBvd24uCisKKy0gICAqKk5vdGU6KiogYERlc3RpbmF0aW9uUmVzb3VyY2VgIHJldHVybnMgcmVzcG9uc2UgZW50aXRpZXMgYXMgYEpTT05gCisgICAgd2hpbGUgYENhbGN1bGF0aW9uUmVzb3VyY2VgIGFuZCBgRm9yZWNhc3RSZXNvdXJjZWAgYXMgYFhNTGAuCisKKy0gICAqKiJBZ2VudCIqKiwgd2hpY2ggaXMgYSBzeW5jaHJvbml6YXRpb24vb3JjaGVzdHJhdGlvbiBsYXllci4gVGhpcworICAgIGxheWVyLCBhbHNvIGRlcGxveWVkIGFzIGEgc2VydmVyIGFwcGxpY2F0aW9uLCBmZXRjaGVzIGRhdGEgZnJvbSBhbGwKKyAgICBuZWVkZWQgcmVzb3VyY2VzICh1c2luZyBKQVgtUlMgQ2xpZW50IEFQSSkgYW5kIGNvbWJpbmUKKyAgICB0aGVtIHRvZ2V0aGVyLiBUaGUgY29tYmluZWQgcmVzdWx0IGlzIHRoZW4gc2VudCB0byB0aGUgY2xpZW50IHRoYXQKKyAgICBpbnZva2VkIHRoZSBvcmlnaW5hbCByZXF1ZXN0IG9uIHRoZSBvcmNoZXN0cmF0aW9uIGxheWVyLgorCitFdmVyeSAiYWdlbnQiIHJlc291cmNlIChwYWNrYWdlIGBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5yeC5hZ2VudGApCitpbnZva2VzIHRoZSBmb2xsb3dpbmcgcmVxdWVzdHMgdG8gdGhlICJyZW1vdGUiIHJlc291cmNlOgorCistICAgT2J0YWluICoqdmlzaXRlZCoqIGRlc3RpbmF0aW9ucyBmb3IgYSB1c2VyLiAoVXNlciBpZGVudGlmaWNhdGlvbiBpcworICAgIHByb3BhZ2F0ZWQgdmlhIHJlcXVlc3QgaGVhZGVyIGFuZCBiYXNpY2FsbHkgZXZlcnl0aGluZyBhYm91dCBhIHVzZXIKKyAgICBtYXhpbWFsbHkgc2ltcGxpZmllZCBzaW5jZSBpdCdzIG91dCBvZiBzY29wZSBvZiB0aGlzIGV4YW1wbGUpCisKKy0gICBPYnRhaW4gKipyZWNvbW1lbmRlZCoqIGRlc3RpbmF0aW9ucyBmb3IgYSB1c2VyLiBSZXF1ZXN0cyBvYnRhaW5pbmcKKyAgICAqKnZpc2l0ZWQqKiBhbmQgKipyZWNvbW1lbmRlZCoqIGRlc3RpbmF0aW9ucyBhcmUgaW5kZXBlbmRlbnQgYW5kIGNhbgorICAgIGJlIHJ1biBpbiBwYXJhbGxlbC4KKworLSAgIE9idGFpbiB3ZWF0aGVyICoqZm9yZWNhc3RzKiogZm9yIHJlY29tbWVuZGVkIGRlc3RpbmF0aW9ucy4gTmV3CisgICAgY2xpZW50IHJlcXVlc3QgaXMgaW52b2tlZCBmb3IgZXZlcnkgcmVjb21tZW5kZWQgZGVzdGluYXRpb24uCisgICAgT2J0YWluaW5nIHdlYXRoZXIgKipmb3JlY2FzdHMqKiBkZXBlbmQgb24gYWN0dWFsCisgICAgKipyZWNvbW1lbmRlZCoqIGRlc3RpbmF0aW9ucy4KKworLSAgIE9idGFpbiB0cmlwICoqY2FsY3VsYXRpb25zKiogKHByaWNlcykgZm9yIHJlY29tbWVuZGVkIGRlc3RpbmF0aW9ucy4KKyAgICBOZXcgY2xpZW50IHJlcXVlc3QgaXMgaW52b2tlZCBmb3IgZXZlcnkgcmVjb21tZW5kZWQgZGVzdGluYXRpb24uCisgICAgT2J0YWluaW5nIHRyaXAgKipjYWxjdWxhdGlvbnMqKiBkZXBlbmQgb24gYWN0dWFsCisgICAgKipyZWNvbW1lbmRlZCoqIGRlc3RpbmF0aW9ucy4gKipmb3JlY2FzdCoqIGFuZCAqKmNhbGN1bGF0aW9uKioKKyAgICByZXF1ZXN0cyBhcmUgaW5kZXBlbmRlbnQgb24gZWFjaCBvdGhlciBhbmQgY2FuIGJlIGludm9rZWQKKyAgICBpbiBwYXJhbGxlbC4KKworQ29udGVudHMKKy0tLS0tLS0tCisKKz4gUGxlYXNlIG5vdGUgdGhhdCB0aGUgZXhhbXBsZSBpcyBub3QgZnVsbHkgaW1wbGVtZW50ZWQgcmlnaHQgbm93LgorPgorPiBBdmFpbGFibGUgImFnZW50IiByZXNvdXJjZXMgYXJlIF8vcngvYWdlbnQvc3luY18sIF8vcngvYWdlbnQvYXN5bmNfIGFuZCBfL3J4L2FnZW50L2NvbXBsZXRpb25fLgorCitUaGUgbWFwcGluZyBvZiB0aGUgVVJJIHBhdGggc3BhY2UgaXMgcHJlc2VudGVkIGluIHRoZSBmb2xsb3dpbmcgdGFibGU6CisKK1VSSSBwYXRoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUmVzb3VyY2UgY2xhc3MgICAgICAgICAgICAgICAgICB8IEhUVFAgbWV0aG9kcyAgIHwgQWxsb3dlZCB2YWx1ZXMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqKl8vcngvYWdlbnQvc3luY18qKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFN5bmNBZ2VudFJlc291cmNlICAgICAgICAgICAgICAgfCBHRVQgICAgICAgICAgICB8IHJldHVybnMgSlNPTgorKipfL3J4L2FnZW50L2FzeW5jXyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBc3luY0FnZW50UmVzb3VyY2UgICAgICAgICAgICAgIHwgR0VUICAgICAgICAgICAgfCByZXR1cm5zIEpTT04KKyoqXy9yeC9hZ2VudC9vYnNlcnZhYmxlXyoqICoqKHRlbXBvcmFyaWx5IG4vYSkqKiAgIHwgT2JzZXJ2YWJsZUFnZW50UmVzb3VyY2UgICAgICAgICB8IEdFVCAgICAgICAgICAgIHwgcmV0dXJucyBKU09OCisqKl8vcngvYWdlbnQvY29tcGxldGlvbl8qKiAgICAgICAgICAgICAgICAgICAgICAgICB8IENvbXBsZXRpb25TdGFnZUFnZW50UmVzb3VyY2UgICAgfCBHRVQgICAgICAgICAgICB8IHJldHVybnMgSlNPTgorKipfL3J4L2FnZW50L2xpc3RlbmFibGVfKiogKioodGVtcG9yYXJpbHkgbi9hKSoqICAgfCBMaXN0ZW5hYmxlRnV0dXJlQWdlbnRSZXNvdXJjZSAgIHwgR0VUICAgICAgICAgICAgfCByZXR1cm5zIEpTT04KKyoqXy9yeC9yZW1vdGUvZGVzdGluYXRpb24vdmlzaXRlZF8qKiAgICAgICAgICAgICAgIHwgRGVzdGluYXRpb25SZXNvdXJjZSAgICAgICAgICAgICB8IEdFVCAgICAgICAgICAgIHwgcmV0dXJucyBKU09OCisqKl8vcngvcmVtb3RlL2Rlc3RpbmF0aW9uL3JlY29tbWVuZGVkXyoqICAgICAgICAgICB8IERlc3RpbmF0aW9uUmVzb3VyY2UgICAgICAgICAgICAgfCBHRVQgICAgICAgICAgICB8IHJldHVybnMgSlNPTgorKipfL3J4L3JlbW90ZS9mb3JlY2FzdC97ZGVzdGluYXRpb259XyoqICAgICAgICAgICAgfCBGb3JlY2FzdFJlc291cmNlICAgICAgICAgICAgICAgIHwgR0VUICAgICAgICAgICAgfCBkZXN0aW5hdGlvbiAtIG5hbWUgb2YgYSBjb3VudHJ5OyByZXR1cm5zIFhNTCAocmFuZG9tIHZhbHVlKQorKipfL3J4L3JlbW90ZS9jYWxjdWxhdGlvbi9mcm9tL3tmcm9tfS90by97dG99XyoqICAgfCBDYWxjdWxhdGlvblJlc291cmNlICAgICAgICAgICAgIHwgR0VUICAgICAgICAgICAgfCBmcm9tIC0gbmFtZSBvZiBhIGNvdW50cnksIHRvIC0gbmFtZSBvZiBhIGNvdW50cnk7IHJldHVybnMgWE1MIChyYW5kb20gdmFsdWUpCisKK0FwcGxpY2F0aW9uIGlzIFNlcnZsZXQgMyBiYXNlZCwgd2ViLnhtbC1sZXNzLiBFdmVyeXRoaW5nIG5lZWRlZCAocmVzb3VyY2VzL3Byb3ZpZGVycykgaXMgcmVnaXN0ZXJlZCBpbiBgUnhBcHBsaWNhdGlvbmAuCisKK1NhbXBsZSBSZXNwb25zZQorLS0tLS0tLS0tLS0tLS0tCisKK0FnZW50IHJlc3BvbnNlcyBsb29rIHNpbWlsYXIgdG8gdGhlIGZvbGxvd2luZyBvbmU6CisKK2BgYGphdmFzY3JpcHQKK3sKKyAgInZpc2l0ZWQiIDogWyB7CisgICAgImRlc3RpbmF0aW9uIiA6ICJBbnRpZ3VhICYgQmFyYnVkYSIKKyAgfSwgeworICAgICJkZXN0aW5hdGlvbiIgOiAiR3VpbmVhIgorICB9LCB7CisgICAgImRlc3RpbmF0aW9uIiA6ICJNYWx0YSIKKyAgfSwgeworICAgICJkZXN0aW5hdGlvbiIgOiAiRGVubWFyayIKKyAgfSwgeworICAgICJkZXN0aW5hdGlvbiIgOiAiVGFqaWtpc3RhbiIKKyAgfSBdLAorICAicmVjb21tZW5kZWQiIDogWyB7CisgICAgImRlc3RpbmF0aW9uIiA6ICJCb2xpdmlhIiwKKyAgICAiZm9yZWNhc3QiIDogIlNob3dlcnMiLAorICAgICJwcmljZSIgOiAxMzU5CisgIH0sIHsKKyAgICAiZGVzdGluYXRpb24iIDogIlllbWVuIiwKKyAgICAiZm9yZWNhc3QiIDogIkhhemUiLAorICAgICJwcmljZSIgOiA4MDMyCisgIH0sIHsKKyAgICAiZGVzdGluYXRpb24iIDogIkRvbWluaWNhbiBSZXB1YmxpYyIsCisgICAgImZvcmVjYXN0IiA6ICJDbG91ZHkiLAorICAgICJwcmljZSIgOiAxMTQxCisgIH0sIHsKKyAgICAiZGVzdGluYXRpb24iIDogIktvcmVhIFNvdXRoIiwKKyAgICAiZm9yZWNhc3QiIDogIk1vc3RseSBTdW5ueSIsCisgICAgInByaWNlIiA6IDk4NTMKKyAgfSwgeworICAgICJkZXN0aW5hdGlvbiIgOiAiU2F1ZGkgQXJhYmlhIiwKKyAgICAiZm9yZWNhc3QiIDogIkZvZyIsCisgICAgInByaWNlIiA6IDkwNjMKKyAgfSBdLAorICAicHJvY2Vzc2luZ1RpbWUiIDogODc3Cit9CitgYGAKKworQXMgY2FuIGJlIHNlZW4gdGhlIHJlc3BvbnNlIGVudGl0eSBjb250YWlucyAzIG1haW4gZWxlbWVudHM6ICoqdmlzaXRlZCoqCisobGlzdCBvZiB2aXNpdGVkIGRlc3RpbmF0aW9ucyksICoqcmVjb21tZW5kZWQqKiAobGlzdCBvZiByZWNvbW1lbmRlZAorZGVzdGluYXRpb25zICsgd2VhdGhlciBmb3JlY2FzdCBhbmQgcHJpY2UgY2FsY3VsYXRpb24pIGFuZAorKipwcm9jZXNzaW5nVGltZSoqIChkZXNjcmliaW5nIGhvdyBsb25nIGl0IHRvb2sgdG8gb2J0YWluIHByZXZpb3VzIHR3bworZWxlbWVudHMpLgorCitSdW5uaW5nIHRoZSBFeGFtcGxlCistLS0tLS0tLS0tLS0tLS0tLS0tCisKK1J1biB0aGUgZXhhbXBsZSBhcyBmb2xsb3dzOgorCis+ICAgICBtdm4gY2xlYW4gcGFja2FnZSBqZXR0eTpydW4KKworVGhpcyBkZXBsb3lzIGN1cnJlbnQgZXhhbXBsZSB1c2luZyBKZXR0eS4gWW91IGNhbiBhY2Nlc3MgdGhlIGFwcGxpY2F0aW9uIGF0OgorCistICAgPGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yeC9hZ2VudC9zeW5jPgorLSAgIDxodHRwOi8vbG9jYWxob3N0OjgwODAvcngvYWdlbnQvYXN5bmM+CistICAgPGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9yeC9hZ2VudC9saXN0ZW5hYmxlPiAqKih0ZW1wb3JhcmlseSBuL2EpKioKKy0gICA8aHR0cDovL2xvY2FsaG9zdDo4MDgwL3J4L2FnZW50L29ic2VydmFibGU+ICoqKHRlbXBvcmFyaWx5IG4vYSkqKgorLSAgIDxodHRwOi8vbG9jYWxob3N0OjgwODAvcngvYWdlbnQvY29tcGxldGlvbj4KKworUmVzb3VyY2VzCistLS0tLS0tLS0KKworVGhpcyBleGFtcGxlcyBpcyB1c2luZyB0aGUgZm9sbG93aW5nICgzLXJkIHBhcnR5KSBsaWJyYXJpZXM6CisKKyoqUnhKYXZhKiogYnkgTmV0ZmxpeAorLSAgIFtHaXRIdWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9SZWFjdGl2ZVgvUnhKYXZhKQorLSAgIFtHaXRIdWIuV2lraV0oaHR0cHM6Ly9naXRodWIuY29tL1JlYWN0aXZlWC9SeEphdmEvd2lraSkKKy0gICBbSmF2YURvY10oaHR0cDovL3JlYWN0aXZleC5pby9SeEphdmEvamF2YWRvYy8pCisKKyoqR3VhdmEqKiBieSBHb29nbGUKKy0gICBbSG9tZXBhZ2VdKGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ3VhdmEtbGlicmFyaWVzLykKKy0gICBbTGlzdGVuYWJsZUZ1dHVyZQorICAgIEV4cGxhaW5lZF0oaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9ndWF2YS1saWJyYXJpZXMvd2lraS9MaXN0ZW5hYmxlRnV0dXJlRXhwbGFpbmVkKQorLSAgIFtKYXZhRG9jXShodHRwOi8vZG9jcy5ndWF2YS1saWJyYXJpZXMuZ29vZ2xlY29kZS5jb20vZ2l0L2phdmFkb2MvaW5kZXguaHRtbD9vdmVydmlldy1zdW1tYXJ5Lmh0bWwpCmRpZmYgLS1naXQgYS9leGFtcGxlcy9yeC1jbGllbnQtd2ViYXBwL3BvbS54bWwgYi9leGFtcGxlcy9yeC1jbGllbnQtd2ViYXBwL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRhYjQzZAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3J4LWNsaWVudC13ZWJhcHAvcG9tLnhtbApAQCAtMCwwICsxLDEwNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+d2ViYXBwLWV4YW1wbGUtcGFyZW50PC9hcnRpZmFjdElkPgorICAgICAgICA8cmVsYXRpdmVQYXRoPi4uL3dlYmFwcC1leGFtcGxlLXBhcmVudC9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5yeC1jbGllbnQtd2ViYXBwPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LWV4YW1wbGVzLXJ4LWNsaWVudC13ZWJhcHA8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+SmVyc2V5IFJlYWN0aXZlIENsaWVudCBXZWJBcHAgRXhhbXBsZS48L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktaGsyPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5yeDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1yeC1jbGllbnQtZ3VhdmE8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQucng8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktcngtY2xpZW50LXJ4amF2YTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5yeDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1yeC1jbGllbnQtcnhqYXZhMjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLWpzb24tamFja3NvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDwhLS0gUnVuIHRoZSBhcHBsaWNhdGlvbiB1c2luZyAibXZuIGpldHR5OnJ1biIgLS0+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHNjYW5JbnRlcnZhbFNlY29uZHM+NTwvc2NhbkludGVydmFsU2Vjb25kcz4KKyAgICAgICAgICAgICAgICAgICAgPHN0b3BQb3J0Pjk5OTk8L3N0b3BQb3J0PgorICAgICAgICAgICAgICAgICAgICA8c3RvcEtleT5TVE9QPC9zdG9wS2V5PgorICAgICAgICAgICAgICAgICAgICA8d2ViQXBwPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbnRleHRQYXRoPi88L2NvbnRleHRQYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgPHdlYkluZkluY2x1ZGVKYXJQYXR0ZXJuPi4qLy4qamVyc2V5LVteL11cLmphciQ8L3dlYkluZkluY2x1ZGVKYXJQYXR0ZXJuPgorICAgICAgICAgICAgICAgICAgICA8L3dlYkFwcD4KKyAgICAgICAgICAgICAgICAgICAgPHN5c3RlbVByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+amV0dHkucG9ydDwvbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+JHtqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnR9PC92YWx1ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydGllcz4KKyAgICAgICAgICAgICAgICAgICAgPHdhcj4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8ke3Byb2plY3QuYnVpbGQuZmluYWxOYW1lfS53YXI8L3dhcj4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnJlbGVhc2U8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD54bWwtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydD44MDgwPC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+CisgICAgPC9wcm9wZXJ0aWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvcngtY2xpZW50LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3J4L0hlbHBlci5qYXZhIGIvZXhhbXBsZXMvcngtY2xpZW50LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3J4L0hlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMGY4YzUKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9yeC1jbGllbnQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvcngvSGVscGVyLmphdmEKQEAgLTAsMCArMSwyOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMucng7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBIZWxwZXIgeworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNsZWVwKCkgeworICAgICAgICBzbGVlcCg1MDApOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzbGVlcChmaW5hbCBsb25nIG1pbGxpcykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKG1pbGxpcyk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIE5PT1AuCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8U3RyaW5nPiBnZXRDb3VudHJpZXMoZmluYWwgaW50IGxpbWl0KSB7CisgICAgICAgIHJldHVybiBnZXRDb3VudHJpZXMobGltaXQsIENvbGxlY3Rpb25zLjxTdHJpbmc+ZW1wdHlMaXN0KCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldENvdW50cmllcyhmaW5hbCBpbnQgbGltaXQsIGZpbmFsIExpc3Q8U3RyaW5nPiBleGNsdXNpb25zKSB7CisgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBkaWZmID0gbmV3IEFycmF5TGlzdDw+KENPVU5UUklFUyk7CisgICAgICAgIGRpZmYucmVtb3ZlQWxsKGV4Y2x1c2lvbnMpOworCisgICAgICAgIGlmIChsaW1pdCA+PSBkaWZmLnNpemUoKSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBBcnJheUxpc3Q8PihkaWZmKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBjb3VudHJpZXMgPSBuZXcgQXJyYXlMaXN0PD4obGltaXQpOworICAgICAgICAgICAgZmluYWwgUmFuZG9tIHJhbmRvbSA9IG5ldyBSYW5kb20oKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaW1pdDsgaSsrKSB7CisgICAgICAgICAgICAgICAgY291bnRyaWVzLmFkZChkaWZmLnJlbW92ZShyYW5kb20ubmV4dEludChkaWZmLnNpemUoKSkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGNvdW50cmllczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEZvcmVjYXN0KCkgeworICAgICAgICByZXR1cm4gV0VBVEhFUl9DT05ESVRJT05TLmdldChuZXcgUmFuZG9tKCkubmV4dEludChXRUFUSEVSX0NPTkRJVElPTlMuc2l6ZSgpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdDxTdHJpbmc+IENPVU5UUklFUyA9IEFycmF5cy5hc0xpc3QoIkFmZ2hhbmlzdGFuIiwKKyAgICAgICAgICAgICJBbGJhbmlhIiwKKyAgICAgICAgICAgICJBbGdlcmlhIiwKKyAgICAgICAgICAgICJBbmRvcnJhIiwKKyAgICAgICAgICAgICJBbmdvbGEiLAorICAgICAgICAgICAgIkFudGlndWEgJiBCYXJidWRhIiwKKyAgICAgICAgICAgICJBcmdlbnRpbmEiLAorICAgICAgICAgICAgIkFybWVuaWEiLAorICAgICAgICAgICAgIkF1c3RyYWxpYSIsCisgICAgICAgICAgICAiQXVzdHJpYSIsCisgICAgICAgICAgICAiQXplcmJhaWphbiIsCisgICAgICAgICAgICAiQmFoYW1hcyIsCisgICAgICAgICAgICAiQmFocmFpbiIsCisgICAgICAgICAgICAiQmFuZ2xhZGVzaCIsCisgICAgICAgICAgICAiQmFyYmFkb3MiLAorICAgICAgICAgICAgIkJlbGFydXMiLAorICAgICAgICAgICAgIkJlbGdpdW0iLAorICAgICAgICAgICAgIkJlbGl6ZSIsCisgICAgICAgICAgICAiQmVuaW4iLAorICAgICAgICAgICAgIkJodXRhbiIsCisgICAgICAgICAgICAiQm9saXZpYSIsCisgICAgICAgICAgICAiQm9zbmlhICYgSGVyemVnb3ZpbmEiLAorICAgICAgICAgICAgIkJvdHN3YW5hIiwKKyAgICAgICAgICAgICJCcmF6aWwiLAorICAgICAgICAgICAgIkJydW5laSIsCisgICAgICAgICAgICAiQnVsZ2FyaWEiLAorICAgICAgICAgICAgIkJ1cmtpbmEgRmFzbyIsCisgICAgICAgICAgICAiQnVydW5kaSIsCisgICAgICAgICAgICAiQ2FtYm9kaWEiLAorICAgICAgICAgICAgIkNhbWVyb29uIiwKKyAgICAgICAgICAgICJDYW5hZGEiLAorICAgICAgICAgICAgIkNhcGUgVmVyZGUiLAorICAgICAgICAgICAgIkNlbnRyYWwgQWZyaWNhbiBSZXB1YmxpYyIsCisgICAgICAgICAgICAiQ2hhZCIsCisgICAgICAgICAgICAiQ2hpbGUiLAorICAgICAgICAgICAgIkNoaW5hIiwKKyAgICAgICAgICAgICJDb2xvbWJpYSIsCisgICAgICAgICAgICAiQ29tb3JvcyIsCisgICAgICAgICAgICAiQ29uZ28iLAorICAgICAgICAgICAgIkNvbmdvIERlbW9jcmF0aWMgUmVwdWJsaWMiLAorICAgICAgICAgICAgIkNvc3RhIFJpY2EiLAorICAgICAgICAgICAgIkNvdGUgZCdJdm9pcmUiLAorICAgICAgICAgICAgIkNyb2F0aWEiLAorICAgICAgICAgICAgIkN1YmEiLAorICAgICAgICAgICAgIkN5cHJ1cyIsCisgICAgICAgICAgICAiQ3plY2ggUmVwdWJsaWMiLAorICAgICAgICAgICAgIkRlbm1hcmsiLAorICAgICAgICAgICAgIkRqaWJvdXRpIiwKKyAgICAgICAgICAgICJEb21pbmljYSIsCisgICAgICAgICAgICAiRG9taW5pY2FuIFJlcHVibGljIiwKKyAgICAgICAgICAgICJFY3VhZG9yIiwKKyAgICAgICAgICAgICJFYXN0IFRpbW9yIiwKKyAgICAgICAgICAgICJFZ3lwdCIsCisgICAgICAgICAgICAiRWwgU2FsdmFkb3IiLAorICAgICAgICAgICAgIkVxdWF0b3JpYWwgR3VpbmVhIiwKKyAgICAgICAgICAgICJFcml0cmVhIiwKKyAgICAgICAgICAgICJFc3RvbmlhIiwKKyAgICAgICAgICAgICJFdGhpb3BpYSIsCisgICAgICAgICAgICAiRmlqaSIsCisgICAgICAgICAgICAiRmlubGFuZCIsCisgICAgICAgICAgICAiRnJhbmNlIiwKKyAgICAgICAgICAgICJHYWJvbiIsCisgICAgICAgICAgICAiR2FtYmlhIiwKKyAgICAgICAgICAgICJHZW9yZ2lhIiwKKyAgICAgICAgICAgICJHZXJtYW55IiwKKyAgICAgICAgICAgICJHaGFuYSIsCisgICAgICAgICAgICAiR3JlZWNlIiwKKyAgICAgICAgICAgICJHcmVuYWRhIiwKKyAgICAgICAgICAgICJHdWF0ZW1hbGEiLAorICAgICAgICAgICAgIkd1aW5lYSIsCisgICAgICAgICAgICAiR3VpbmVhLUJpc3NhdSIsCisgICAgICAgICAgICAiR3V5YW5hIiwKKyAgICAgICAgICAgICJIYWl0aSIsCisgICAgICAgICAgICAiSG9uZHVyYXMiLAorICAgICAgICAgICAgIkh1bmdhcnkiLAorICAgICAgICAgICAgIkljZWxhbmQiLAorICAgICAgICAgICAgIkluZGlhIiwKKyAgICAgICAgICAgICJJbmRvbmVzaWEiLAorICAgICAgICAgICAgIklyYW4iLAorICAgICAgICAgICAgIklyYXEiLAorICAgICAgICAgICAgIklyZWxhbmQiLAorICAgICAgICAgICAgIklzcmFlbCIsCisgICAgICAgICAgICAiSXRhbHkiLAorICAgICAgICAgICAgIkphbWFpY2EiLAorICAgICAgICAgICAgIkphcGFuIiwKKyAgICAgICAgICAgICJKb3JkYW4iLAorICAgICAgICAgICAgIkthemFraHN0YW4iLAorICAgICAgICAgICAgIktlbnlhIiwKKyAgICAgICAgICAgICJLaXJpYmF0aSIsCisgICAgICAgICAgICAiS29yZWEgTm9ydGgiLAorICAgICAgICAgICAgIktvcmVhIFNvdXRoIiwKKyAgICAgICAgICAgICJLb3Nvdm8iLAorICAgICAgICAgICAgIkt1d2FpdCIsCisgICAgICAgICAgICAiS3lyZ3l6c3RhbiIsCisgICAgICAgICAgICAiTGFvcyIsCisgICAgICAgICAgICAiTGF0dmlhIiwKKyAgICAgICAgICAgICJMZWJhbm9uIiwKKyAgICAgICAgICAgICJMZXNvdGhvIiwKKyAgICAgICAgICAgICJMaWJlcmlhIiwKKyAgICAgICAgICAgICJMaWJ5YSIsCisgICAgICAgICAgICAiTGllY2h0ZW5zdGVpbiIsCisgICAgICAgICAgICAiTGl0aHVhbmlhIiwKKyAgICAgICAgICAgICJMdXhlbWJvdXJnIiwKKyAgICAgICAgICAgICJNYWNlZG9uaWEiLAorICAgICAgICAgICAgIk1hZGFnYXNjYXIiLAorICAgICAgICAgICAgIk1hbGF3aSIsCisgICAgICAgICAgICAiTWFsYXlzaWEiLAorICAgICAgICAgICAgIk1hbGRpdmVzIiwKKyAgICAgICAgICAgICJNYWxpIiwKKyAgICAgICAgICAgICJNYWx0YSIsCisgICAgICAgICAgICAiTWFyc2hhbGwgSXNsYW5kcyIsCisgICAgICAgICAgICAiTWF1cml0YW5pYSIsCisgICAgICAgICAgICAiTWF1cml0aXVzIiwKKyAgICAgICAgICAgICJNZXhpY28iLAorICAgICAgICAgICAgIk1pY3JvbmVzaWEiLAorICAgICAgICAgICAgIk1vbGRvdmEiLAorICAgICAgICAgICAgIk1vbmFjbyIsCisgICAgICAgICAgICAiTW9uZ29saWEiLAorICAgICAgICAgICAgIk1vbnRlbmVncm8iLAorICAgICAgICAgICAgIk1vcm9jY28iLAorICAgICAgICAgICAgIk1vemFtYmlxdWUiLAorICAgICAgICAgICAgIk15YW5tYXIgKEJ1cm1hKSIsCisgICAgICAgICAgICAiTmFtaWJpYSIsCisgICAgICAgICAgICAiTmF1cnUiLAorICAgICAgICAgICAgIk5lcGFsIiwKKyAgICAgICAgICAgICJUaGUgTmV0aGVybGFuZHMiLAorICAgICAgICAgICAgIk5ldyBaZWFsYW5kIiwKKyAgICAgICAgICAgICJOaWNhcmFndWEiLAorICAgICAgICAgICAgIk5pZ2VyIiwKKyAgICAgICAgICAgICJOaWdlcmlhIiwKKyAgICAgICAgICAgICJOb3J3YXkiLAorICAgICAgICAgICAgIk9tYW4iLAorICAgICAgICAgICAgIlBha2lzdGFuIiwKKyAgICAgICAgICAgICJQYWxhdSIsCisgICAgICAgICAgICAiUGFsZXN0aW5pYW4gU3RhdGUiLAorICAgICAgICAgICAgIlBhbmFtYSIsCisgICAgICAgICAgICAiUGFwdWEgTmV3IEd1aW5lYSIsCisgICAgICAgICAgICAiUGFyYWd1YXkiLAorICAgICAgICAgICAgIlBlcnUiLAorICAgICAgICAgICAgIlRoZSBQaGlsaXBwaW5lcyIsCisgICAgICAgICAgICAiUG9sYW5kIiwKKyAgICAgICAgICAgICJQb3J0dWdhbCIsCisgICAgICAgICAgICAiUWF0YXIiLAorICAgICAgICAgICAgIlJvbWFuaWEiLAorICAgICAgICAgICAgIlJ1c3NpYSIsCisgICAgICAgICAgICAiUndhbmRhIiwKKyAgICAgICAgICAgICJTdC4gS2l0dHMgJiBOZXZpcyIsCisgICAgICAgICAgICAiU3QuIEx1Y2lhIiwKKyAgICAgICAgICAgICJTdC4gVmluY2VudCAmIFRoZSBHcmVuYWRpbmVzIiwKKyAgICAgICAgICAgICJTYW1vYSIsCisgICAgICAgICAgICAiU2FuIE1hcmlubyIsCisgICAgICAgICAgICAiU2FvIFRvbWUgJiBQcmluY2lwZSIsCisgICAgICAgICAgICAiU2F1ZGkgQXJhYmlhIiwKKyAgICAgICAgICAgICJTZW5lZ2FsIiwKKyAgICAgICAgICAgICJTZXJiaWEiLAorICAgICAgICAgICAgIlNleWNoZWxsZXMiLAorICAgICAgICAgICAgIlNpZXJyYSBMZW9uZSIsCisgICAgICAgICAgICAiU2luZ2Fwb3JlIiwKKyAgICAgICAgICAgICJTbG92YWtpYSIsCisgICAgICAgICAgICAiU2xvdmVuaWEiLAorICAgICAgICAgICAgIlNvbG9tb24gSXNsYW5kcyIsCisgICAgICAgICAgICAiU29tYWxpYSIsCisgICAgICAgICAgICAiU291dGggQWZyaWNhIiwKKyAgICAgICAgICAgICJTb3V0aCBTdWRhbiIsCisgICAgICAgICAgICAiU3BhaW4iLAorICAgICAgICAgICAgIlNyaSBMYW5rYSIsCisgICAgICAgICAgICAiU3VkYW4iLAorICAgICAgICAgICAgIlN1cmluYW1lIiwKKyAgICAgICAgICAgICJTd2F6aWxhbmQiLAorICAgICAgICAgICAgIlN3ZWRlbiIsCisgICAgICAgICAgICAiU3dpdHplcmxhbmQiLAorICAgICAgICAgICAgIlN5cmlhIiwKKyAgICAgICAgICAgICJUYWl3YW4iLAorICAgICAgICAgICAgIlRhamlraXN0YW4iLAorICAgICAgICAgICAgIlRhbnphbmlhIiwKKyAgICAgICAgICAgICJUaGFpbGFuZCIsCisgICAgICAgICAgICAiVG9nbyIsCisgICAgICAgICAgICAiVG9uZ2EiLAorICAgICAgICAgICAgIlRyaW5pZGFkICYgVG9iYWdvIiwKKyAgICAgICAgICAgICJUdW5pc2lhIiwKKyAgICAgICAgICAgICJUdXJrZXkiLAorICAgICAgICAgICAgIlR1cmttZW5pc3RhbiIsCisgICAgICAgICAgICAiVHV2YWx1IiwKKyAgICAgICAgICAgICJVZ2FuZGEiLAorICAgICAgICAgICAgIlVrcmFpbmUiLAorICAgICAgICAgICAgIlVuaXRlZCBBcmFiIEVtaXJhdGVzIiwKKyAgICAgICAgICAgICJVbml0ZWQgS2luZ2RvbSIsCisgICAgICAgICAgICAiVW5pdGVkIFN0YXRlcyBvZiBBbWVyaWNhIiwKKyAgICAgICAgICAgICJVcnVndWF5IiwKKyAgICAgICAgICAgICJVemJla2lzdGFuIiwKKyAgICAgICAgICAgICJWYW51YXR1IiwKKyAgICAgICAgICAgICJWYXRpY2FuIENpdHkgKEhvbHkgU2VlKSIsCisgICAgICAgICAgICAiVmVuZXp1ZWxhIiwKKyAgICAgICAgICAgICJWaWV0bmFtIiwKKyAgICAgICAgICAgICJZZW1lbiIsCisgICAgICAgICAgICAiWmFtYmlhIiwKKyAgICAgICAgICAgICJaaW1iYWJ3ZSIpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdDxTdHJpbmc+IFdFQVRIRVJfQ09ORElUSU9OUyA9IEFycmF5cy5hc0xpc3QoIlBhcnRseSBTdW5ueSIsCisgICAgICAgICAgICAiU2NhdHRlcmVkIFRodW5kZXJzdG9ybXMiLAorICAgICAgICAgICAgIlNob3dlcnMiLAorICAgICAgICAgICAgIlNjYXR0ZXJlZCBTaG93ZXJzIiwKKyAgICAgICAgICAgICJSYWluIGFuZCBTbm93IiwKKyAgICAgICAgICAgICJPdmVyY2FzdCIsCisgICAgICAgICAgICAiTGlnaHQgU25vdyIsCisgICAgICAgICAgICAiRnJlZXppbmcgRHJpenpsZSIsCisgICAgICAgICAgICAiQ2hhbmNlIG9mIFJhaW4iLAorICAgICAgICAgICAgIlN1bm55IiwKKyAgICAgICAgICAgICJDbGVhciIsCisgICAgICAgICAgICAiTW9zdGx5IFN1bm55IiwKKyAgICAgICAgICAgICJQYXJ0bHkgQ2xvdWR5IiwKKyAgICAgICAgICAgICJNb3N0bHkgQ2xvdWR5IiwKKyAgICAgICAgICAgICJDaGFuY2Ugb2YgU3Rvcm0iLAorICAgICAgICAgICAgIlJhaW4iLAorICAgICAgICAgICAgIkNoYW5jZSBvZiBTbm93IiwKKyAgICAgICAgICAgICJDbG91ZHkiLAorICAgICAgICAgICAgIk1pc3QiLAorICAgICAgICAgICAgIlN0b3JtIiwKKyAgICAgICAgICAgICJUaHVuZGVyc3Rvcm0iLAorICAgICAgICAgICAgIkNoYW5jZSBvZiBUU3Rvcm0iLAorICAgICAgICAgICAgIlNsZWV0IiwKKyAgICAgICAgICAgICJTbm93IiwKKyAgICAgICAgICAgICJJY3kiLAorICAgICAgICAgICAgIkR1c3QiLAorICAgICAgICAgICAgIkZvZyIsCisgICAgICAgICAgICAiU21va2UiLAorICAgICAgICAgICAgIkhhemUiLAorICAgICAgICAgICAgIkZsdXJyaWVzIiwKKyAgICAgICAgICAgICJMaWdodCBSYWluIiwKKyAgICAgICAgICAgICJTbm93IFNob3dlcnMiLAorICAgICAgICAgICAgIkhhaWwiKTsKK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3J4LWNsaWVudC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9yeC9SeEFwcGxpY2F0aW9uLmphdmEgYi9leGFtcGxlcy9yeC1jbGllbnQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvcngvUnhBcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ZTMwMTEKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9yeC1jbGllbnQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvcngvUnhBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMucng7CisKK2ltcG9ydCBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LkNvbnRleHRSZXNvbHZlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnJ4LmFnZW50LkFzeW5jQWdlbnRSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5yeC5hZ2VudC5Db21wbGV0aW9uU3RhZ2VBZ2VudFJlc291cmNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnJ4LmFnZW50LkZsb3dhYmxlQWdlbnRSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5yeC5hZ2VudC5MaXN0ZW5hYmxlRnV0dXJlQWdlbnRSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5yeC5hZ2VudC5PYnNlcnZhYmxlQWdlbnRSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5yeC5hZ2VudC5TeW5jQWdlbnRSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5yeC5yZW1vdGUuQ2FsY3VsYXRpb25SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5yeC5yZW1vdGUuRGVzdGluYXRpb25SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5yeC5yZW1vdGUuRm9yZWNhc3RSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uLkphY2tzb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5PYmplY3RNYXBwZXI7CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLlNlcmlhbGl6YXRpb25GZWF0dXJlOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAQXBwbGljYXRpb25QYXRoKCJyeCIpCitwdWJsaWMgY2xhc3MgUnhBcHBsaWNhdGlvbiBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKworICAgIHB1YmxpYyBSeEFwcGxpY2F0aW9uKCkgeworICAgICAgICAvLyBSZW1vdGUgKFNlcnZlcikgUmVzb3VyY2VzLgorICAgICAgICByZWdpc3RlcihEZXN0aW5hdGlvblJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgcmVnaXN0ZXIoQ2FsY3VsYXRpb25SZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJlZ2lzdGVyKEZvcmVjYXN0UmVzb3VyY2UuY2xhc3MpOworCisgICAgICAgIC8vIEFnZW50IChDbGllbnQpIFJlc291cmNlcy4KKyAgICAgICAgcmVnaXN0ZXIoU3luY0FnZW50UmVzb3VyY2UuY2xhc3MpOworICAgICAgICByZWdpc3RlcihBc3luY0FnZW50UmVzb3VyY2UuY2xhc3MpOworICAgICAgICByZWdpc3RlcihPYnNlcnZhYmxlQWdlbnRSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJlZ2lzdGVyKEZsb3dhYmxlQWdlbnRSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJlZ2lzdGVyKExpc3RlbmFibGVGdXR1cmVBZ2VudFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgcmVnaXN0ZXIoQ29tcGxldGlvblN0YWdlQWdlbnRSZXNvdXJjZS5jbGFzcyk7CisKKyAgICAgICAgLy8gUHJvdmlkZXJzLgorICAgICAgICByZWdpc3RlcihKYWNrc29uRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIHJlZ2lzdGVyKE9iamVjdE1hcHBlclByb3ZpZGVyLmNsYXNzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE9iamVjdE1hcHBlclByb3ZpZGVyIGltcGxlbWVudHMgQ29udGV4dFJlc29sdmVyPE9iamVjdE1hcHBlcj4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0TWFwcGVyIGdldENvbnRleHQoZmluYWwgQ2xhc3M8Pz4gdHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBPYmplY3RNYXBwZXIoKS5lbmFibGUoU2VyaWFsaXphdGlvbkZlYXR1cmUuSU5ERU5UX09VVFBVVCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9yeC1jbGllbnQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvcngvYWdlbnQvQXN5bmNBZ2VudFJlc291cmNlLmphdmEgYi9leGFtcGxlcy9yeC1jbGllbnQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvcngvYWdlbnQvQXN5bmNBZ2VudFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTczNTNhMgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3J4LWNsaWVudC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9yeC9hZ2VudC9Bc3luY0FnZW50UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDIxMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5yeC5hZ2VudDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5RdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TGlua2VkUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3I7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50Lkludm9jYXRpb25DYWxsYmFjazsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Bc3luY1Jlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5TdXNwZW5kZWQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5yeC5kb21haW4uQWdlbnRSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5yeC5kb21haW4uQ2FsY3VsYXRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMucnguZG9tYWluLkRlc3RpbmF0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnJ4LmRvbWFpbi5Gb3JlY2FzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5yeC5kb21haW4uUmVjb21tZW5kYXRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmEuVGhyZWFkRmFjdG9yeUJ1aWxkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5KZXJzZXlQcm9jZXNzaW5nVW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5NYW5hZ2VkQXN5bmM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlVyaTsKKworLyoqCisgKiBPYnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgdmlzaXRlZCAoZGVzdGluYXRpb24pIGFuZCByZWNvbW1lbmRlZCAoZGVzdGluYXRpb24sIGZvcmVjYXN0LCBwcmljZSkgcGxhY2VzIGZvciAiQXN5bmMiIHVzZXIuIFVzZXMKKyAqIHN0YW5kYXJkIEpBWC1SUyBhc3luYyBhcHByb2FjaCB0byBvYnRhaW4gdGhlIGRhdGEuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BQYXRoKCJhZ2VudC9hc3luYyIpCitAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2pzb24iKQorcHVibGljIGNsYXNzIEFzeW5jQWdlbnRSZXNvdXJjZSB7CisKKyAgICBAVXJpKCJyZW1vdGUvZGVzdGluYXRpb24iKQorICAgIHByaXZhdGUgV2ViVGFyZ2V0IGRlc3RpbmF0aW9uOworCisgICAgQFVyaSgicmVtb3RlL2NhbGN1bGF0aW9uL2Zyb20ve2Zyb219L3RvL3t0b30iKQorICAgIHByaXZhdGUgV2ViVGFyZ2V0IGNhbGN1bGF0aW9uOworCisgICAgQFVyaSgicmVtb3RlL2ZvcmVjYXN0L3tkZXN0aW5hdGlvbn0iKQorICAgIHByaXZhdGUgV2ViVGFyZ2V0IGZvcmVjYXN0OworCisgICAgcHJpdmF0ZSBmaW5hbCBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3I7CisKKyAgICBwdWJsaWMgQXN5bmNBZ2VudFJlc291cmNlKCkgeworICAgICAgICBleGVjdXRvciA9IG5ldyBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IoMjAsIG5ldyBUaHJlYWRGYWN0b3J5QnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldE5hbWVGb3JtYXQoImplcnNleS1yeC1jbGllbnQtYXN5bmMtJWQiKQorICAgICAgICAgICAgICAgIC5zZXRVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIobmV3IEplcnNleVByb2Nlc3NpbmdVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIoKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBNYW5hZ2VkQXN5bmMKKyAgICBwdWJsaWMgdm9pZCBhc3luYyhAU3VzcGVuZGVkIGZpbmFsIEFzeW5jUmVzcG9uc2UgYXN5bmMpIHsKKyAgICAgICAgZmluYWwgbG9uZyB0aW1lID0gU3lzdGVtLm5hbm9UaW1lKCk7CisKKyAgICAgICAgZmluYWwgQWdlbnRSZXNwb25zZSByZXNwb25zZSA9IG5ldyBBZ2VudFJlc3BvbnNlKCk7CisKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggb3V0ZXJMYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgyKTsKKyAgICAgICAgZmluYWwgUXVldWU8U3RyaW5nPiBlcnJvcnMgPSBuZXcgQ29uY3VycmVudExpbmtlZFF1ZXVlPD4oKTsKKworICAgICAgICAvLyBPYnRhaW4gdmlzaXRlZCBkZXN0aW5hdGlvbnMuCisgICAgICAgIGRlc3RpbmF0aW9uLnBhdGgoInZpc2l0ZWQiKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAvLyBJZGVudGlmeSB0aGUgdXNlci4KKyAgICAgICAgICAgICAgICAuaGVhZGVyKCJSeC1Vc2VyIiwgIkFzeW5jIikKKyAgICAgICAgICAgICAgICAvLyBBc3luYyBpbnZva2VyLgorICAgICAgICAgICAgICAgIC5hc3luYygpCisgICAgICAgICAgICAgICAgLy8gUmV0dXJuIGEgbGlzdCBvZiBkZXN0aW5hdGlvbnMKKyAgICAgICAgICAgICAgICAuZ2V0KG5ldyBJbnZvY2F0aW9uQ2FsbGJhY2s8TGlzdDxEZXN0aW5hdGlvbj4+KCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY29tcGxldGVkKGZpbmFsIExpc3Q8RGVzdGluYXRpb24+IGRlc3RpbmF0aW9ucykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0VmlzaXRlZChkZXN0aW5hdGlvbnMpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZXJMYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBmYWlsZWQoZmluYWwgVGhyb3dhYmxlIHRocm93YWJsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLm9mZmVyKCJWaXNpdGVkOiAiICsgdGhyb3dhYmxlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRlckxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisKKworICAgICAgICAvLyBPYnRhaW4gcmVjb21tZW5kZWQgZGVzdGluYXRpb25zLiAoZG9lcyBub3QgZGVwZW5kIG9uIHZpc2l0ZWQgb25lcykKKyAgICAgICAgZGVzdGluYXRpb24ucGF0aCgicmVjb21tZW5kZWQiKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAvLyBJZGVudGlmeSB0aGUgdXNlci4KKyAgICAgICAgICAgICAgICAuaGVhZGVyKCJSeC1Vc2VyIiwgIkFzeW5jIikKKyAgICAgICAgICAgICAgICAvLyBBc3luYyBpbnZva2VyLgorICAgICAgICAgICAgICAgIC5hc3luYygpCisgICAgICAgICAgICAgICAgLy8gUmV0dXJuIGEgbGlzdCBvZiBkZXN0aW5hdGlvbnMuCisgICAgICAgICAgICAgICAgLmdldChuZXcgSW52b2NhdGlvbkNhbGxiYWNrPExpc3Q8RGVzdGluYXRpb24+PigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbXBsZXRlZChmaW5hbCBMaXN0PERlc3RpbmF0aW9uPiByZWNvbW1lbmRlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggaW5uZXJMYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaChyZWNvbW1lbmRlZC5zaXplKCkgKiAyKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yZWNhc3RzLiAoZGVwZW5kIG9uIHJlY29tbWVuZGVkIGRlc3RpbmF0aW9ucykKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIEZvcmVjYXN0PiBmb3JlY2FzdHMgPSBDb2xsZWN0aW9ucy5zeW5jaHJvbml6ZWRNYXAobmV3IEhhc2hNYXA8PigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoZmluYWwgRGVzdGluYXRpb24gZGVzdCA6IHJlY29tbWVuZGVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWNhc3QucmVzb2x2ZVRlbXBsYXRlKCJkZXN0aW5hdGlvbiIsIGRlc3QuZ2V0RGVzdGluYXRpb24oKSkucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXN5bmMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldChuZXcgSW52b2NhdGlvbkNhbGxiYWNrPEZvcmVjYXN0PigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBjb21wbGV0ZWQoZmluYWwgRm9yZWNhc3QgZm9yZWNhc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWNhc3RzLnB1dChkZXN0LmdldERlc3RpbmF0aW9uKCksIGZvcmVjYXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJMYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBmYWlsZWQoZmluYWwgVGhyb3dhYmxlIHRocm93YWJsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMub2ZmZXIoIkZvcmVjYXN0OiAiICsgdGhyb3dhYmxlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyTGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0aW9ucy4gKGRlcGVuZCBvbiByZWNvbW1lbmRlZCBkZXN0aW5hdGlvbnMpCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PEZ1dHVyZTxDYWxjdWxhdGlvbj4+IGZ1dHVyZXMgPSByZWNvbW1lbmRlZC5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKGRlc3QgLT4gY2FsY3VsYXRpb24ucmVzb2x2ZVRlbXBsYXRlKCJmcm9tIiwgIk1vb24iKS5yZXNvbHZlVGVtcGxhdGUoInRvIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0LmdldERlc3RpbmF0aW9uKCkpLnJlcXVlc3QoKS5hc3luYygpLmdldChDYWxjdWxhdGlvbi5jbGFzcykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBDYWxjdWxhdGlvbj4gY2FsY3VsYXRpb25zID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFmdXR1cmVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEl0ZXJhdG9yPEZ1dHVyZTxDYWxjdWxhdGlvbj4+IGl0ZXJhdG9yID0gZnV0dXJlcy5pdGVyYXRvcigpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGl0ZXJhdG9yLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBGdXR1cmU8Q2FsY3VsYXRpb24+IGYgPSBpdGVyYXRvci5uZXh0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmLmlzRG9uZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENhbGN1bGF0aW9uIGNhbGN1bGF0aW9uID0gZi5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjdWxhdGlvbnMucHV0KGNhbGN1bGF0aW9uLmdldFRvKCksIGNhbGN1bGF0aW9uKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubmVyTGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5vZmZlcigiQ2FsY3VsYXRpb246ICIgKyB0LmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJMYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3IucmVtb3ZlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhhdmUgdG8gd2FpdCBoZXJlIGZvciBkZXBlbmRlbnQgcmVxdWVzdHMgLi4uCisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5uZXJMYXRjaC5hd2FpdCgxMCwgVGltZVVuaXQuU0VDT05EUykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLm9mZmVyKCJJbm5lcjogV2FpdGluZyBmb3IgcmVxdWVzdHMgdG8gY29tcGxldGUgaGFzIHRpbWVkIG91dC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLm9mZmVyKCJJbm5lcjogV2FpdGluZyBmb3IgcmVxdWVzdHMgdG8gY29tcGxldGUgaGFzIGJlZW4gaW50ZXJydXB0ZWQuIik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlY29tbWVuZGF0aW9ucy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8UmVjb21tZW5kYXRpb24+IHJlY29tbWVuZGF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8PihyZWNvbW1lbmRlZC5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChmaW5hbCBEZXN0aW5hdGlvbiBkZXN0IDogcmVjb21tZW5kZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBGb3JlY2FzdCBmb3JlID0gZm9yZWNhc3RzLmdldChkZXN0LmdldERlc3RpbmF0aW9uKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENhbGN1bGF0aW9uIGNhbGMgPSBjYWxjdWxhdGlvbnMuZ2V0KGRlc3QuZ2V0RGVzdGluYXRpb24oKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvbW1lbmRhdGlvbnMuYWRkKG5ldyBSZWNvbW1lbmRhdGlvbihkZXN0LmdldERlc3RpbmF0aW9uKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlICE9IG51bGwgPyBmb3JlLmdldEZvcmVjYXN0KCkgOiAiTi9BIiwgY2FsYyAhPSBudWxsID8gY2FsYy5nZXRQcmljZSgpIDogLTEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldFJlY29tbWVuZGVkKHJlY29tbWVuZGF0aW9ucyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dGVyTGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZmFpbGVkKGZpbmFsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5vZmZlcigiUmVjb21tZW5kZWQ6ICIgKyB0aHJvd2FibGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dGVyTGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAvLyAuLi4gYW5kIGhhdmUgdG8gd2FpdCBhbHNvIGhlcmUgZm9yIGluZGVwZW5kZW50IHJlcXVlc3RzLgorICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKCFvdXRlckxhdGNoLmF3YWl0KDEwLCBUaW1lVW5pdC5TRUNPTkRTKSkgeworICAgICAgICAgICAgICAgIGVycm9ycy5vZmZlcigiT3V0ZXI6IFdhaXRpbmcgZm9yIHJlcXVlc3RzIHRvIGNvbXBsZXRlIGhhcyB0aW1lZCBvdXQuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGVycm9ycy5vZmZlcigiT3V0ZXI6IFdhaXRpbmcgZm9yIHJlcXVlc3RzIHRvIGNvbXBsZXRlIGhhcyBiZWVuIGludGVycnVwdGVkLiIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRG8gc29tZXRoaW5nIHdpdGggZXJyb3JzLgorICAgICAgICAvLyAuLi4KKworICAgICAgICByZXNwb25zZS5zZXRQcm9jZXNzaW5nVGltZSgoU3lzdGVtLm5hbm9UaW1lKCkgLSB0aW1lKSAvIDEwMDAwMDApOworICAgICAgICBhc3luYy5yZXN1bWUocmVzcG9uc2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3J4LWNsaWVudC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9yeC9hZ2VudC9Db21wbGV0aW9uU3RhZ2VBZ2VudFJlc291cmNlLmphdmEgYi9leGFtcGxlcy9yeC1jbGllbnQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvcngvYWdlbnQvQ29tcGxldGlvblN0YWdlQWdlbnRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkOWY0MTAKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9yeC1jbGllbnQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvcngvYWdlbnQvQ29tcGxldGlvblN0YWdlQWdlbnRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnJ4LmFnZW50OworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5RdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db21wbGV0YWJsZUZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db21wbGV0aW9uU3RhZ2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudExpbmtlZFF1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3I7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQXN5bmNSZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuU3VzcGVuZGVkOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY1R5cGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5yeC5kb21haW4uQWdlbnRSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5yeC5kb21haW4uQ2FsY3VsYXRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMucnguZG9tYWluLkRlc3RpbmF0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnJ4LmRvbWFpbi5Gb3JlY2FzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5yeC5kb21haW4uUmVjb21tZW5kYXRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmEuVGhyZWFkRmFjdG9yeUJ1aWxkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlVyaTsKKworLyoqCisgKiBPYnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgdmlzaXRlZCAoZGVzdGluYXRpb24pIGFuZCByZWNvbW1lbmRlZCAoZGVzdGluYXRpb24sIGZvcmVjYXN0LCBwcmljZSkgcGxhY2VzIGZvcgorICogIkNvbXBsZXRpb25TdGFnZSIgdXNlci4gVXNlcyBKYXZhIDggQ29tcGxldGlvblN0YWdlIGFuZCBKZXJzZXkgQ2xpZW50IHRvIG9idGFpbiB0aGUgZGF0YS4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFBhdGgoImFnZW50L2NvbXBsZXRpb24iKQorQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9qc29uIikKK3B1YmxpYyBjbGFzcyBDb21wbGV0aW9uU3RhZ2VBZ2VudFJlc291cmNlIHsKKworICAgIEBVcmkoInJlbW90ZS9kZXN0aW5hdGlvbiIpCisgICAgcHJpdmF0ZSBXZWJUYXJnZXQgZGVzdGluYXRpb25UYXJnZXQ7CisKKyAgICBAVXJpKCJyZW1vdGUvY2FsY3VsYXRpb24vZnJvbS97ZnJvbX0vdG8ve3RvfSIpCisgICAgcHJpdmF0ZSBXZWJUYXJnZXQgY2FsY3VsYXRpb25UYXJnZXQ7CisKKyAgICBAVXJpKCJyZW1vdGUvZm9yZWNhc3Qve2Rlc3RpbmF0aW9ufSIpCisgICAgcHJpdmF0ZSBXZWJUYXJnZXQgZm9yZWNhc3RUYXJnZXQ7CisKKyAgICBwcml2YXRlIGZpbmFsIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvcjsKKworICAgIHB1YmxpYyBDb21wbGV0aW9uU3RhZ2VBZ2VudFJlc291cmNlKCkgeworICAgICAgICBleGVjdXRvciA9IG5ldyBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IoMjAsCisgICAgICAgICAgICAgICAgbmV3IFRocmVhZEZhY3RvcnlCdWlsZGVyKCkuc2V0TmFtZUZvcm1hdCgiamVyc2V5LXJ4LWNsaWVudC1jb21wbGV0aW9uLSVkIikuYnVpbGQoKSk7CisgICAgfQorCisgICAgQEdFVAorICAgIHB1YmxpYyB2b2lkIGNvbXBsZXRpb24oQFN1c3BlbmRlZCBmaW5hbCBBc3luY1Jlc3BvbnNlIGFzeW5jKSB7CisgICAgICAgIGZpbmFsIGxvbmcgdGltZSA9IFN5c3RlbS5uYW5vVGltZSgpOworCisgICAgICAgIGZpbmFsIFF1ZXVlPFN0cmluZz4gZXJyb3JzID0gbmV3IENvbmN1cnJlbnRMaW5rZWRRdWV1ZTw+KCk7CisKKyAgICAgICAgQ29tcGxldGFibGVGdXR1cmUuY29tcGxldGVkRnV0dXJlKG5ldyBBZ2VudFJlc3BvbnNlKCkpCisgICAgICAgICAgICAgICAgLnRoZW5Db21iaW5lKHZpc2l0ZWQoZGVzdGluYXRpb25UYXJnZXQsIGV4ZWN1dG9yLCBlcnJvcnMpLCBBZ2VudFJlc3BvbnNlOjp2aXNpdGVkKQorICAgICAgICAgICAgICAgIC50aGVuQ29tYmluZShyZWNvbW1lbmRlZChkZXN0aW5hdGlvblRhcmdldCwgZXhlY3V0b3IsIGVycm9ycyksIEFnZW50UmVzcG9uc2U6OnJlY29tbWVuZGVkKQorICAgICAgICAgICAgICAgIC53aGVuQ29tcGxldGVBc3luYygocmVzcG9uc2UsIHRocm93YWJsZSkgLT4geworICAgICAgICAgICAgICAgICAgICAvLyBEbyBzb21ldGhpbmcgd2l0aCBlcnJvcnMuCisKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0UHJvY2Vzc2luZ1RpbWUoKFN5c3RlbS5uYW5vVGltZSgpIC0gdGltZSkgLyAxMDAwMDAwKTsKKyAgICAgICAgICAgICAgICAgICAgYXN5bmMucmVzdW1lKHRocm93YWJsZSA9PSBudWxsID8gcmVzcG9uc2UgOiB0aHJvd2FibGUpOworICAgICAgICAgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgQ29tcGxldGlvblN0YWdlPExpc3Q8RGVzdGluYXRpb24+PiB2aXNpdGVkKGZpbmFsIFdlYlRhcmdldCBkZXN0aW5hdGlvblRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUXVldWU8U3RyaW5nPiBlcnJvcnMpIHsKKyAgICAgICAgcmV0dXJuIGRlc3RpbmF0aW9uVGFyZ2V0LnBhdGgoInZpc2l0ZWQiKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAvLyBJZGVudGlmeSB0aGUgdXNlci4KKyAgICAgICAgICAgICAgICAuaGVhZGVyKCJSeC1Vc2VyIiwgIkNvbXBsZXRpb25TdGFnZSIpCisgICAgICAgICAgICAgICAgLy8gUmVhY3RpdmUgaW52b2tlci4KKyAgICAgICAgICAgICAgICAucngoKQorICAgICAgICAgICAgICAgIC8vIFJldHVybiBhIGxpc3Qgb2YgZGVzdGluYXRpb25zLgorICAgICAgICAgICAgICAgIC5nZXQobmV3IEdlbmVyaWNUeXBlPExpc3Q8RGVzdGluYXRpb24+PigpIHt9KQorICAgICAgICAgICAgICAgIC5leGNlcHRpb25hbGx5KHRocm93YWJsZSAtPiB7CisgICAgICAgICAgICAgICAgICAgIGVycm9ycy5vZmZlcigiVmlzaXRlZDogIiArIHRocm93YWJsZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBDb21wbGV0aW9uU3RhZ2U8TGlzdDxSZWNvbW1lbmRhdGlvbj4+IHJlY29tbWVuZGVkKGZpbmFsIFdlYlRhcmdldCBkZXN0aW5hdGlvblRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBRdWV1ZTxTdHJpbmc+IGVycm9ycykgeworICAgICAgICAvLyBSZWNvbW1lbmRlZCBwbGFjZXMuCisgICAgICAgIGZpbmFsIENvbXBsZXRpb25TdGFnZTxMaXN0PERlc3RpbmF0aW9uPj4gcmVjb21tZW5kZWQgPSBkZXN0aW5hdGlvblRhcmdldC5wYXRoKCJyZWNvbW1lbmRlZCIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC8vIElkZW50aWZ5IHRoZSB1c2VyLgorICAgICAgICAgICAgICAgIC5oZWFkZXIoIlJ4LVVzZXIiLCAiQ29tcGxldGlvblN0YWdlIikKKyAgICAgICAgICAgICAgICAvLyBSZWFjdGl2ZSBpbnZva2VyLgorICAgICAgICAgICAgICAgIC5yeCgpCisgICAgICAgICAgICAgICAgLy8gUmV0dXJuIGEgbGlzdCBvZiBkZXN0aW5hdGlvbnMuCisgICAgICAgICAgICAgICAgLmdldChuZXcgR2VuZXJpY1R5cGU8TGlzdDxEZXN0aW5hdGlvbj4+KCkge30pCisgICAgICAgICAgICAgICAgLmV4Y2VwdGlvbmFsbHkodGhyb3dhYmxlIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgZXJyb3JzLm9mZmVyKCJSZWNvbW1lbmRlZDogIiArIHRocm93YWJsZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgcmV0dXJuIHJlY29tbWVuZGVkLnRoZW5Db21wb3NlKGRlc3RpbmF0aW9ucyAtPiB7CisgICAgICAgICAgICBmaW5hbCBXZWJUYXJnZXQgZmluYWxGb3JlY2FzdCA9IGZvcmVjYXN0VGFyZ2V0OworICAgICAgICAgICAgZmluYWwgV2ViVGFyZ2V0IGZpbmFsQ2FsY3VsYXRpb24gPSBjYWxjdWxhdGlvblRhcmdldDsKKworICAgICAgICAgICAgTGlzdDxDb21wbGV0aW9uU3RhZ2U8UmVjb21tZW5kYXRpb24+PiByZWNvbW1lbmRhdGlvbnMgPSBkZXN0aW5hdGlvbnMuc3RyZWFtKCkubWFwKGRlc3RpbmF0aW9uIC0+IHsKKyAgICAgICAgICAgICAgICAvLyBGb3IgZWFjaCBkZXN0aW5hdGlvbiwgb2J0YWluIGEgd2VhdGhlciBmb3JlY2FzdCAuLi4KKyAgICAgICAgICAgICAgICBmaW5hbCBDb21wbGV0aW9uU3RhZ2U8Rm9yZWNhc3Q+IGZvcmVjYXN0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsRm9yZWNhc3QucmVzb2x2ZVRlbXBsYXRlKCJkZXN0aW5hdGlvbiIsIGRlc3RpbmF0aW9uLmdldERlc3RpbmF0aW9uKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5yeCgpLmdldChGb3JlY2FzdC5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZXhjZXB0aW9uYWxseSh0aHJvd2FibGUgLT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMub2ZmZXIoIkZvcmVjYXN0OiAiICsgdGhyb3dhYmxlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRm9yZWNhc3QoZGVzdGluYXRpb24uZ2V0RGVzdGluYXRpb24oKSwgIk4vQSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIC8vIC4uLiBhbmQgYSBwcmljZSBjYWxjdWxhdGlvbgorICAgICAgICAgICAgICAgIGZpbmFsIENvbXBsZXRpb25TdGFnZTxDYWxjdWxhdGlvbj4gY2FsY3VsYXRpb24gPSBmaW5hbENhbGN1bGF0aW9uLnJlc29sdmVUZW1wbGF0ZSgiZnJvbSIsICJNb29uIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5yZXNvbHZlVGVtcGxhdGUoInRvIiwgZGVzdGluYXRpb24uZ2V0RGVzdGluYXRpb24oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkucngoKS5nZXQoQ2FsY3VsYXRpb24uY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAuZXhjZXB0aW9uYWxseSh0aHJvd2FibGUgLT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5vZmZlcigiQ2FsY3VsYXRpb246ICIgKyB0aHJvd2FibGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENhbGN1bGF0aW9uKCJNb29uIiwgZGVzdGluYXRpb24uZ2V0RGVzdGluYXRpb24oKSwgLTEpOworICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgICAvL25vaW5zcGVjdGlvbiB1bmNoZWNrZWQKKyAgICAgICAgICAgICAgICByZXR1cm4gQ29tcGxldGFibGVGdXR1cmUuY29tcGxldGVkRnV0dXJlKG5ldyBSZWNvbW1lbmRhdGlvbihkZXN0aW5hdGlvbikpCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgZm9yZWNhc3QgZm9yIHJlY29tbWVuZGVkIGRlc3RpbmF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW5Db21iaW5lKGZvcmVjYXN0LCBSZWNvbW1lbmRhdGlvbjo6Zm9yZWNhc3QpCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgY2FsY3VsYXRpb24gZm9yIHJlY29tbWVuZGVkIGRlc3RpbmF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW5Db21iaW5lKGNhbGN1bGF0aW9uLCBSZWNvbW1lbmRhdGlvbjo6Y2FsY3VsYXRpb24pOworICAgICAgICAgICAgfSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKworICAgICAgICAgICAgLy8gVHJhbnNmb3JtIExpc3Q8Q29tcGxldGlvblN0YWdlPFJlY29tbWVuZGF0aW9uPj4gdG8gQ29tcGxldGlvblN0YWdlPExpc3Q8UmVjb21tZW5kYXRpb24+PgorICAgICAgICAgICAgcmV0dXJuIHNlcXVlbmNlKHJlY29tbWVuZGF0aW9ucyk7CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgPFQ+IENvbXBsZXRpb25TdGFnZTxMaXN0PFQ+PiBzZXF1ZW5jZShmaW5hbCBMaXN0PENvbXBsZXRpb25TdGFnZTxUPj4gc3RhZ2VzKSB7CisgICAgICAgIC8vbm9pbnNwZWN0aW9uIFN1c3BpY2lvdXNUb0FycmF5Q2FsbAorICAgICAgICBmaW5hbCBDb21wbGV0YWJsZUZ1dHVyZTxWb2lkPiBkb25lID0gQ29tcGxldGFibGVGdXR1cmUuYWxsT2Yoc3RhZ2VzLnRvQXJyYXkobmV3IENvbXBsZXRhYmxlRnV0dXJlW3N0YWdlcy5zaXplKCldKSk7CisKKyAgICAgICAgcmV0dXJuIGRvbmUudGhlbkFwcGx5KHYgLT4gc3RhZ2VzLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgICAgICAubWFwKENvbXBsZXRpb25TdGFnZTo6dG9Db21wbGV0YWJsZUZ1dHVyZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoQ29tcGxldGFibGVGdXR1cmU6OmpvaW4pCisgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLjxUPnRvTGlzdCgpKQorICAgICAgICApOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvcngtY2xpZW50LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3J4L2FnZW50L0Zsb3dhYmxlQWdlbnRSZXNvdXJjZS5qYXZhIGIvZXhhbXBsZXMvcngtY2xpZW50LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3J4L2FnZW50L0Zsb3dhYmxlQWdlbnRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZmZhZWYKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9yeC1jbGllbnQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvcngvYWdlbnQvRmxvd2FibGVBZ2VudFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMucnguYWdlbnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlF1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRMaW5rZWRRdWV1ZTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkFzeW5jUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlN1c3BlbmRlZDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkdlbmVyaWNUeXBlOworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5yeC5yeGphdmEyLlJ4Rmxvd2FibGVJbnZva2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5yeC5yeGphdmEyLlJ4Rmxvd2FibGVJbnZva2VyUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMucnguZG9tYWluLkFnZW50UmVzcG9uc2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMucnguZG9tYWluLkNhbGN1bGF0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnJ4LmRvbWFpbi5EZXN0aW5hdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5yeC5kb21haW4uRm9yZWNhc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMucnguZG9tYWluLlJlY29tbWVuZGF0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Vcmk7CisKK2ltcG9ydCBpby5yZWFjdGl2ZXguRmxvd2FibGU7CitpbXBvcnQgaW8ucmVhY3RpdmV4LnNjaGVkdWxlcnMuU2NoZWR1bGVyczsKKworLyoqCisgKiBPYnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgdmlzaXRlZCAoZGVzdGluYXRpb24pIGFuZCByZWNvbW1lbmRlZCAoZGVzdGluYXRpb24sIGZvcmVjYXN0LCBwcmljZSkgcGxhY2VzIGZvciAiUnhKYXZhMiIKKyAqIHVzZXIuIFVzZXMgUnhKYXZhMiBGbG93YWJsZSBhbmQgSmVyc2V5IENsaWVudCB0byBvYnRhaW4gdGhlIGRhdGEuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitAU2luZ2xldG9uCitAUGF0aCgiYWdlbnQvZmxvd2FibGUiKQorQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9qc29uIikKK3B1YmxpYyBjbGFzcyBGbG93YWJsZUFnZW50UmVzb3VyY2UgeworCisgICAgQFVyaSgicmVtb3RlL2Rlc3RpbmF0aW9uIikKKyAgICBwcml2YXRlIFdlYlRhcmdldCBkZXN0aW5hdGlvbjsKKworICAgIEBVcmkoInJlbW90ZS9jYWxjdWxhdGlvbi9mcm9tL3tmcm9tfS90by97dG99IikKKyAgICBwcml2YXRlIFdlYlRhcmdldCBjYWxjdWxhdGlvbjsKKworICAgIEBVcmkoInJlbW90ZS9mb3JlY2FzdC97ZGVzdGluYXRpb259IikKKyAgICBwcml2YXRlIFdlYlRhcmdldCBmb3JlY2FzdDsKKworICAgIEBHRVQKKyAgICBwdWJsaWMgdm9pZCBmbG93YWJsZShAU3VzcGVuZGVkIGZpbmFsIEFzeW5jUmVzcG9uc2UgYXN5bmMpIHsKKyAgICAgICAgZmluYWwgbG9uZyB0aW1lID0gU3lzdGVtLm5hbm9UaW1lKCk7CisgICAgICAgIGZpbmFsIFF1ZXVlPFN0cmluZz4gZXJyb3JzID0gbmV3IENvbmN1cnJlbnRMaW5rZWRRdWV1ZTw+KCk7CisKKyAgICAgICAgRmxvd2FibGUuanVzdChuZXcgQWdlbnRSZXNwb25zZSgpKQorICAgICAgICAgICAgICAgIC8vIE9idGFpbiB2aXNpdGVkIGRlc3RpbmF0aW9ucy4KKyAgICAgICAgICAgICAgICAuemlwV2l0aCh2aXNpdGVkKGVycm9ycyksIChhZ2VudFJlc3BvbnNlLCB2aXNpdGVkKSAtPiB7CisgICAgICAgICAgICAgICAgICAgIGFnZW50UmVzcG9uc2Uuc2V0VmlzaXRlZCh2aXNpdGVkKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFnZW50UmVzcG9uc2U7CisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAvLyBPYnRhaW4gcmVjb21tZW5kZWQgZGVzdGluYXRpb25zLiAoZG9lcyBub3QgZGVwZW5kIG9uIHZpc2l0ZWQgb25lcykKKyAgICAgICAgICAgICAgICAuemlwV2l0aCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY29tbWVuZGVkKGVycm9ycyksCisgICAgICAgICAgICAgICAgICAgICAgICAoYWdlbnRSZXNwb25zZSwgcmVjb21tZW5kYXRpb25zKSAtPiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWdlbnRSZXNwb25zZS5zZXRSZWNvbW1lbmRlZChyZWNvbW1lbmRhdGlvbnMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhZ2VudFJlc3BvbnNlOworICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAvLyBPYnNlcnZlIG9uIGFub3RoZXIgdGhyZWFkIHRoYW4gdGhlIG9uZSBwcm9jZXNzaW5nIHZpc2l0ZWQgb3IgcmVjb21tZW5kZWQgZGVzdGluYXRpb25zLgorICAgICAgICAgICAgICAgIC5vYnNlcnZlT24oU2NoZWR1bGVycy5pbygpKQorICAgICAgICAgICAgICAgIC8vIFN1YnNjcmliZS4KKyAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKGFnZW50UmVzcG9uc2UgLT4geworICAgICAgICAgICAgICAgICAgICBhZ2VudFJlc3BvbnNlLnNldFByb2Nlc3NpbmdUaW1lKChTeXN0ZW0ubmFub1RpbWUoKSAtIHRpbWUpIC8gMTAwMDAwMCk7CisgICAgICAgICAgICAgICAgICAgIGFzeW5jLnJlc3VtZShhZ2VudFJlc3BvbnNlKTsKKworICAgICAgICAgICAgICAgIH0sIGFzeW5jOjpyZXN1bWUpOworICAgIH0KKworICAgIHByaXZhdGUgRmxvd2FibGU8TGlzdDxEZXN0aW5hdGlvbj4+IHZpc2l0ZWQoZmluYWwgUXVldWU8U3RyaW5nPiBlcnJvcnMpIHsKKyAgICAgICAgZGVzdGluYXRpb24ucmVnaXN0ZXIoUnhGbG93YWJsZUludm9rZXJQcm92aWRlci5jbGFzcyk7CisKKyAgICAgICAgcmV0dXJuIGRlc3RpbmF0aW9uLnBhdGgoInZpc2l0ZWQiKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWRlbnRpZnkgdGhlIHVzZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5oZWFkZXIoIlJ4LVVzZXIiLCAiUnhKYXZhMiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlYWN0aXZlIGludm9rZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5yeChSeEZsb3dhYmxlSW52b2tlci5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV0dXJuIGEgbGlzdCBvZiBkZXN0aW5hdGlvbnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQobmV3IEdlbmVyaWNUeXBlPExpc3Q8RGVzdGluYXRpb24+PigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGFuZGxlIEVycm9ycy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgLm9uRXJyb3JSZXR1cm4odGhyb3dhYmxlIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5vZmZlcigiVmlzaXRlZDogIiArIHRocm93YWJsZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwcml2YXRlIEZsb3dhYmxlPExpc3Q8UmVjb21tZW5kYXRpb24+PiByZWNvbW1lbmRlZChmaW5hbCBRdWV1ZTxTdHJpbmc+IGVycm9ycykgeworICAgICAgICBkZXN0aW5hdGlvbi5yZWdpc3RlcihSeEZsb3dhYmxlSW52b2tlclByb3ZpZGVyLmNsYXNzKTsKKworICAgICAgICAvLyBSZWNvbW1lbmRlZCBwbGFjZXMuCisgICAgICAgIGZpbmFsIEZsb3dhYmxlPERlc3RpbmF0aW9uPiByZWNvbW1lbmRlZCA9IGRlc3RpbmF0aW9uLnBhdGgoInJlY29tbWVuZGVkIikucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWRlbnRpZnkgdGhlIHVzZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmhlYWRlcigiUngtVXNlciIsICJSeEphdmEyIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWFjdGl2ZSBpbnZva2VyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yeChSeEZsb3dhYmxlSW52b2tlci5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gYSBsaXN0IG9mIGRlc3RpbmF0aW9ucy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KG5ldyBHZW5lcmljVHlwZTxMaXN0PERlc3RpbmF0aW9uPj4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIYW5kbGUgRXJyb3JzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vbkVycm9yUmV0dXJuKHRocm93YWJsZSAtPiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5vZmZlcigiUmVjb21tZW5kZWQ6ICIgKyB0aHJvd2FibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW1pdCBkZXN0aW5hdGlvbnMgb25lLWJ5LW9uZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmxhdE1hcChGbG93YWJsZTo6ZnJvbUl0ZXJhYmxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlbWVtYmVyIGVtaXR0ZWQgaXRlbXMgZm9yIGRlcGVuZGFudCByZXF1ZXN0cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2FjaGUoKTsKKworICAgICAgICBmb3JlY2FzdC5yZWdpc3RlcihSeEZsb3dhYmxlSW52b2tlclByb3ZpZGVyLmNsYXNzKTsKKworICAgICAgICAvLyBGb3JlY2FzdHMuIChkZXBlbmQgb24gcmVjb21tZW5kZWQgZGVzdGluYXRpb25zKQorICAgICAgICBmaW5hbCBGbG93YWJsZTxGb3JlY2FzdD4gZm9yZWNhc3RzID0gcmVjb21tZW5kZWQuZmxhdE1hcChkZXN0aW5hdGlvbiAtPgorICAgICAgICAgICAgICAgIGZvcmVjYXN0CisgICAgICAgICAgICAgICAgICAgICAgICAucmVzb2x2ZVRlbXBsYXRlKCJkZXN0aW5hdGlvbiIsIGRlc3RpbmF0aW9uLmdldERlc3RpbmF0aW9uKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAucmVxdWVzdCgpLnJ4KFJ4Rmxvd2FibGVJbnZva2VyLmNsYXNzKS5nZXQoRm9yZWNhc3QuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAub25FcnJvclJldHVybih0aHJvd2FibGUgLT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5vZmZlcigiRm9yZWNhc3Q6ICIgKyB0aHJvd2FibGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZvcmVjYXN0KGRlc3RpbmF0aW9uLmdldERlc3RpbmF0aW9uKCksICJOL0EiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKKworICAgICAgICBjYWxjdWxhdGlvbi5yZWdpc3RlcihSeEZsb3dhYmxlSW52b2tlclByb3ZpZGVyLmNsYXNzKTsKKworICAgICAgICAvLyBDYWxjdWxhdGlvbnMuIChkZXBlbmQgb24gcmVjb21tZW5kZWQgZGVzdGluYXRpb25zKQorICAgICAgICBmaW5hbCBGbG93YWJsZTxDYWxjdWxhdGlvbj4gY2FsY3VsYXRpb25zID0gcmVjb21tZW5kZWQuZmxhdE1hcChkZXN0aW5hdGlvbiAtPiB7CisgICAgICAgICAgICByZXR1cm4gY2FsY3VsYXRpb24ucmVzb2x2ZVRlbXBsYXRlKCJmcm9tIiwgIk1vb24iKS5yZXNvbHZlVGVtcGxhdGUoInRvIiwgZGVzdGluYXRpb24uZ2V0RGVzdGluYXRpb24oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkucngoUnhGbG93YWJsZUludm9rZXIuY2xhc3MpLmdldChDYWxjdWxhdGlvbi5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vbkVycm9yUmV0dXJuKHRocm93YWJsZSAtPiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLm9mZmVyKCJDYWxjdWxhdGlvbjogIiArIHRocm93YWJsZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2FsY3VsYXRpb24oIk1vb24iLCBkZXN0aW5hdGlvbi5nZXREZXN0aW5hdGlvbigpLCAtMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgcmV0dXJuIEZsb3dhYmxlLnppcChyZWNvbW1lbmRlZCwgZm9yZWNhc3RzLCBjYWxjdWxhdGlvbnMsIFJlY29tbWVuZGF0aW9uOjpuZXcpLmJ1ZmZlcihJbnRlZ2VyLk1BWF9WQUxVRSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvcngtY2xpZW50LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3J4L2FnZW50L0xpc3RlbmFibGVGdXR1cmVBZ2VudFJlc291cmNlLmphdmEgYi9leGFtcGxlcy9yeC1jbGllbnQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvcngvYWdlbnQvTGlzdGVuYWJsZUZ1dHVyZUFnZW50UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGMzZDVmCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvcngtY2xpZW50LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3J4L2FnZW50L0xpc3RlbmFibGVGdXR1cmVBZ2VudFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwxODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMucnguYWdlbnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQXN5bmNSZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuU3VzcGVuZGVkOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY1R5cGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQucnguZ3VhdmEuUnhMaXN0ZW5hYmxlRnV0dXJlSW52b2tlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQucnguZ3VhdmEuUnhMaXN0ZW5hYmxlRnV0dXJlSW52b2tlclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnJ4LmRvbWFpbi5BZ2VudFJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnJ4LmRvbWFpbi5DYWxjdWxhdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5yeC5kb21haW4uRGVzdGluYXRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMucnguZG9tYWluLkZvcmVjYXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnJ4LmRvbWFpbi5SZWNvbW1lbmRhdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuTWFuYWdlZEFzeW5jOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Vcmk7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0Lkxpc3RzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5Bc3luY0Z1bmN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5GdXR1cmVDYWxsYmFjazsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuRnV0dXJlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuTGlzdGVuYWJsZUZ1dHVyZTsKKworLyoqCisgKiBPYnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgdmlzaXRlZCAoZGVzdGluYXRpb24pIGFuZCByZWNvbW1lbmRlZCAoZGVzdGluYXRpb24sIGZvcmVjYXN0LCBwcmljZSkgcGxhY2VzIGZvciAiR3VhdmEiIHVzZXIuIFVzZXMKKyAqIEd1YXZhIExpc3RlbmFibGVGdXR1cmUgYW5kIEplcnNleSBDbGllbnQgdG8gb2J0YWluIHRoZSBkYXRhLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoImFnZW50L2xpc3RlbmFibGUiKQorQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9qc29uIikKK3B1YmxpYyBjbGFzcyBMaXN0ZW5hYmxlRnV0dXJlQWdlbnRSZXNvdXJjZSB7CisKKyAgICBAVXJpKCJyZW1vdGUvZGVzdGluYXRpb24iKQorICAgIHByaXZhdGUgV2ViVGFyZ2V0IGRlc3RpbmF0aW9uOworCisgICAgQFVyaSgicmVtb3RlL2NhbGN1bGF0aW9uL2Zyb20ve2Zyb219L3RvL3t0b30iKQorICAgIHByaXZhdGUgV2ViVGFyZ2V0IGNhbGN1bGF0aW9uOworCisgICAgQFVyaSgicmVtb3RlL2ZvcmVjYXN0L3tkZXN0aW5hdGlvbn0iKQorICAgIHByaXZhdGUgV2ViVGFyZ2V0IGZvcmVjYXN0OworCisgICAgQEdFVAorICAgIEBNYW5hZ2VkQXN5bmMKKyAgICBwdWJsaWMgdm9pZCBsaXN0ZW5hYmxlKEBTdXNwZW5kZWQgZmluYWwgQXN5bmNSZXNwb25zZSBhc3luYykgeworICAgICAgICBmaW5hbCBsb25nIHRpbWUgPSBTeXN0ZW0ubmFub1RpbWUoKTsKKyAgICAgICAgZmluYWwgQWdlbnRSZXNwb25zZSByZXNwb25zZSA9IG5ldyBBZ2VudFJlc3BvbnNlKCk7CisKKyAgICAgICAgLy8gT2J0YWluIGFuZCBzZXQgdmlzaXRlZCBhbmQgcmVjb21tZW5kZWQgcGxhY2VzIHRvIGNyZWF0ZSBhIHJlc3BvbnNlIC4uLgorICAgICAgICBmaW5hbCBMaXN0ZW5hYmxlRnV0dXJlPExpc3Q8QWdlbnRSZXNwb25zZT4+IHN1Y2Nlc3NmdWwgPSBGdXR1cmVzLnN1Y2Nlc3NmdWxBc0xpc3QoCisgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCh2aXNpdGVkKHJlc3BvbnNlKSwgcmVjb21tZW5kZWQocmVzcG9uc2UpKSk7CisKKyAgICAgICAgLy8gLi4uIGFuZCB3aGVuIHdlIGhhdmUgdGhlbSwgcmV0dXJuIHJlc3BvbnNlIHRvIHRoZSBjbGllbnQuCisgICAgICAgIEZ1dHVyZXMuYWRkQ2FsbGJhY2soc3VjY2Vzc2Z1bCwgbmV3IEZ1dHVyZUNhbGxiYWNrPExpc3Q8QWdlbnRSZXNwb25zZT4+KCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VjY2VzcyhmaW5hbCBMaXN0PEFnZW50UmVzcG9uc2U+IHJlc3VsdCkgeworICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldFByb2Nlc3NpbmdUaW1lKChTeXN0ZW0ubmFub1RpbWUoKSAtIHRpbWUpIC8gMTAwMDAwMCk7CisgICAgICAgICAgICAgICAgYXN5bmMucmVzdW1lKHJlc3BvbnNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkZhaWx1cmUoZmluYWwgVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICBhc3luYy5yZXN1bWUodCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgTGlzdGVuYWJsZUZ1dHVyZTxBZ2VudFJlc3BvbnNlPiB2aXNpdGVkKGZpbmFsIEFnZW50UmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgZGVzdGluYXRpb24ucmVnaXN0ZXIoUnhMaXN0ZW5hYmxlRnV0dXJlSW52b2tlclByb3ZpZGVyLmNsYXNzKTsKKworICAgICAgICAvLyBHZXQgYSBsaXN0IG9mIHZpc2l0ZWQgZGVzdGluYXRpb25zIC4uLgorICAgICAgICBmaW5hbCBMaXN0ZW5hYmxlRnV0dXJlPExpc3Q8RGVzdGluYXRpb24+PiB2aXNpdGVkID0gZGVzdGluYXRpb24ucGF0aCgidmlzaXRlZCIpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZGVudGlmeSB0aGUgdXNlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmhlYWRlcigiUngtVXNlciIsICJHdWF2YSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlYWN0aXZlIGludm9rZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yeChSeExpc3RlbmFibGVGdXR1cmVJbnZva2VyLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gYSBsaXN0IG9mIGRlc3RpbmF0aW9ucy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldChuZXcgR2VuZXJpY1R5cGU8TGlzdDxEZXN0aW5hdGlvbj4+KCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAvLyAuLi4gYW5kIHNldCB0aGVtIHRvIHRoZSBmaW5hbCByZXNwb25zZS4KKyAgICAgICAgcmV0dXJuIEZ1dHVyZXMudHJhbnNmb3JtKHZpc2l0ZWQsIChBc3luY0Z1bmN0aW9uPExpc3Q8RGVzdGluYXRpb24+LCBBZ2VudFJlc3BvbnNlPikgZGVzdGluYXRpb25zIC0+IHsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNldFZpc2l0ZWQoZGVzdGluYXRpb25zKTsKKworICAgICAgICAgICAgcmV0dXJuIEZ1dHVyZXMuaW1tZWRpYXRlRnV0dXJlKHJlc3BvbnNlKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0ZW5hYmxlRnV0dXJlPEFnZW50UmVzcG9uc2U+IHJlY29tbWVuZGVkKGZpbmFsIEFnZW50UmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgZGVzdGluYXRpb24ucmVnaXN0ZXIoUnhMaXN0ZW5hYmxlRnV0dXJlSW52b2tlclByb3ZpZGVyLmNsYXNzKTsKKworICAgICAgICAvLyBHZXQgYSBsaXN0IG9mIHJlY29tbWVuZGVkIGRlc3RpbmF0aW9ucyAuLi4KKyAgICAgICAgZmluYWwgTGlzdGVuYWJsZUZ1dHVyZTxMaXN0PERlc3RpbmF0aW9uPj4gZGVzdGluYXRpb25zID0gZGVzdGluYXRpb24ucGF0aCgicmVjb21tZW5kZWQiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZGVudGlmeSB0aGUgdXNlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaGVhZGVyKCJSeC1Vc2VyIiwgIkd1YXZhIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWFjdGl2ZSBpbnZva2VyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yeChSeExpc3RlbmFibGVGdXR1cmVJbnZva2VyLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldHVybiBhIGxpc3Qgb2YgZGVzdGluYXRpb25zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQobmV3IEdlbmVyaWNUeXBlPExpc3Q8RGVzdGluYXRpb24+PigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAvLyAuLi4gdHJhbnNmb3JtIHRoZW0gdG8gUmVjb21tZW5kYXRpb24gaW5zdGFuY2VzIC4uLgorICAgICAgICBmaW5hbCBMaXN0ZW5hYmxlRnV0dXJlPExpc3Q8UmVjb21tZW5kYXRpb24+PiByZWNvbW1lbmRhdGlvbnMgPSBGdXR1cmVzLnRyYW5zZm9ybSgKKyAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbnMsCisgICAgICAgICAgICAgICAgKEFzeW5jRnVuY3Rpb248TGlzdDxEZXN0aW5hdGlvbj4sIExpc3Q8UmVjb21tZW5kYXRpb24+PikgZGVzdGluYXRpb25MaXN0IC0+IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyBhcnJheSBsaXN0IHRvIGF2b2lkIG11bHRpcGxlIHJlbW90ZSBjYWxscy4KKyAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxSZWNvbW1lbmRhdGlvbj4gcmVjb21tZW5kYXRpb25MaXN0ID0gTGlzdHMubmV3QXJyYXlMaXN0KExpc3RzLnRyYW5zZm9ybSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbkxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24gLT4gbmV3IFJlY29tbWVuZGF0aW9uKGRlc3RpbmF0aW9uLmdldERlc3RpbmF0aW9uKCksIG51bGwsIDApKSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZ1dHVyZXMuaW1tZWRpYXRlRnV0dXJlKHJlY29tbWVuZGF0aW9uTGlzdCk7CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgLy8gLi4uIGFkZCBmb3JlY2FzdHMgYW5kIGNhbGN1bGF0aW9ucyAuLi4KKyAgICAgICAgZmluYWwgTGlzdGVuYWJsZUZ1dHVyZTxMaXN0PExpc3Q8UmVjb21tZW5kYXRpb24+Pj4gZmlsbGVkUmVjb21tZW5kYXRpb25zID0gRnV0dXJlcworICAgICAgICAgICAgICAgIC5zdWNjZXNzZnVsQXNMaXN0KEFycmF5cy5hc0xpc3QoCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBBZGQgRm9yZWNhc3RzIHRvIFJlY29tbWVuZGF0aW9ucy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVjYXN0cyhyZWNvbW1lbmRhdGlvbnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIEZvcmVjYXN0cyB0byBSZWNvbW1lbmRhdGlvbnMuCisgICAgICAgICAgICAgICAgICAgICAgICBjYWxjdWxhdGlvbnMocmVjb21tZW5kYXRpb25zKSkpOworCisgICAgICAgIC8vIC4uLiBhbmQgdHJhbnNmb3JtIHRoZSBsaXN0IGludG8gYWdlbnQgcmVzcG9uc2Ugd2l0aCBmaWxsZWQgcmVjb21tZW5kYXRpb25zLgorICAgICAgICByZXR1cm4gRnV0dXJlcworICAgICAgICAgICAgICAgIC50cmFuc2Zvcm0oZmlsbGVkUmVjb21tZW5kYXRpb25zLCAoQXN5bmNGdW5jdGlvbjxMaXN0PExpc3Q8UmVjb21tZW5kYXRpb24+PiwgQWdlbnRSZXNwb25zZT4pIGlucHV0IC0+IHsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0UmVjb21tZW5kZWQoaW5wdXQuZ2V0KDApKTsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRnV0dXJlcy5pbW1lZGlhdGVGdXR1cmUocmVzcG9uc2UpOworICAgICAgICAgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgTGlzdGVuYWJsZUZ1dHVyZTxMaXN0PFJlY29tbWVuZGF0aW9uPj4gZm9yZWNhc3RzKGZpbmFsIExpc3RlbmFibGVGdXR1cmU8TGlzdDxSZWNvbW1lbmRhdGlvbj4+IHJlY29tbWVuZGF0aW9ucykgeworICAgICAgICBmb3JlY2FzdC5yZWdpc3RlcihSeExpc3RlbmFibGVGdXR1cmVJbnZva2VyUHJvdmlkZXIuY2xhc3MpOworCisgICAgICAgIC8vIEZpbGwgdGhlIGxpc3Qgd2l0aCB3ZWF0aGVyIGZvcmVjYXN0LgorICAgICAgICByZXR1cm4gRnV0dXJlcy50cmFuc2Zvcm0ocmVjb21tZW5kYXRpb25zLCAoQXN5bmNGdW5jdGlvbjxMaXN0PFJlY29tbWVuZGF0aW9uPiwgTGlzdDxSZWNvbW1lbmRhdGlvbj4+KSBsaXN0IC0+CisgICAgICAgICAgICAgICAgLy8gRm9yIGVhY2ggcmVjb21tZW5kYXRpb24gLi4uCisgICAgICAgICAgICAgICAgRnV0dXJlcy5zdWNjZXNzZnVsQXNMaXN0KExpc3RzLnRyYW5zZm9ybShsaXN0LCByZWNvbW1lbmRhdGlvbiAtPiBGdXR1cmVzLnRyYW5zZm9ybSgKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uLiBnZXQgdGhlIHdlYXRoZXIgZm9yZWNhc3QgLi4uCisgICAgICAgICAgICAgICAgICAgICAgICBmb3JlY2FzdC5yZXNvbHZlVGVtcGxhdGUoImRlc3RpbmF0aW9uIiwgcmVjb21tZW5kYXRpb24uZ2V0RGVzdGluYXRpb24oKSkucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yeChSeExpc3RlbmFibGVGdXR1cmVJbnZva2VyLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KEZvcmVjYXN0LmNsYXNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIC4uLiBhbmQgc2V0IGl0IHRvIHRoZSByZWNvbW1lbmRhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgIChBc3luY0Z1bmN0aW9uPEZvcmVjYXN0LCBSZWNvbW1lbmRhdGlvbj4pIGZvcmVjYXN0IC0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvbW1lbmRhdGlvbi5zZXRGb3JlY2FzdChmb3JlY2FzdC5nZXRGb3JlY2FzdCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRnV0dXJlcy5pbW1lZGlhdGVGdXR1cmUocmVjb21tZW5kYXRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgfSkpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0ZW5hYmxlRnV0dXJlPExpc3Q8UmVjb21tZW5kYXRpb24+PiBjYWxjdWxhdGlvbnMoZmluYWwgTGlzdGVuYWJsZUZ1dHVyZTxMaXN0PFJlY29tbWVuZGF0aW9uPj4gcmVjb21tZW5kYXRpb25zKSB7CisgICAgICAgIGNhbGN1bGF0aW9uLnJlZ2lzdGVyKFJ4TGlzdGVuYWJsZUZ1dHVyZUludm9rZXJQcm92aWRlci5jbGFzcyk7CisKKyAgICAgICAgLy8gRmlsbCB0aGUgbGlzdCB3aXRoIHByaWNlIGNhbGN1bGF0aW9ucy4KKyAgICAgICAgcmV0dXJuIEZ1dHVyZXMudHJhbnNmb3JtKHJlY29tbWVuZGF0aW9ucywgKEFzeW5jRnVuY3Rpb248TGlzdDxSZWNvbW1lbmRhdGlvbj4sIExpc3Q8UmVjb21tZW5kYXRpb24+PikgbGlzdCAtPgorICAgICAgICAgICAgICAgIC8vIEZvciBlYWNoIHJlY29tbWVuZGF0aW9uIC4uLgorICAgICAgICAgICAgICAgIEZ1dHVyZXMuc3VjY2Vzc2Z1bEFzTGlzdChMaXN0cy50cmFuc2Zvcm0obGlzdCwgcmVjb21tZW5kYXRpb24gLT4gRnV0dXJlcy50cmFuc2Zvcm0oCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi4gZ2V0IHRoZSBwcmljZSBjYWxjdWxhdGlvbiAuLi4KKyAgICAgICAgICAgICAgICAgICAgICAgIGNhbGN1bGF0aW9uLnJlc29sdmVUZW1wbGF0ZSgiZnJvbSIsICJNb29uIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlc29sdmVUZW1wbGF0ZSgidG8iLCByZWNvbW1lbmRhdGlvbi5nZXREZXN0aW5hdGlvbigpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVxdWVzdCgpLnJ4KFJ4TGlzdGVuYWJsZUZ1dHVyZUludm9rZXIuY2xhc3MpLmdldChDYWxjdWxhdGlvbi5jbGFzcyksCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAuLi4gYW5kIHNldCBpdCB0byB0aGUgcmVjb21tZW5kYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAoQXN5bmNGdW5jdGlvbjxDYWxjdWxhdGlvbiwgUmVjb21tZW5kYXRpb24+KSBjYWxjdWxhdGlvbiAtPiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb21tZW5kYXRpb24uc2V0UHJpY2UoY2FsY3VsYXRpb24uZ2V0UHJpY2UoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZ1dHVyZXMuaW1tZWRpYXRlRnV0dXJlKHJlY29tbWVuZGF0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pKSkKKyAgICAgICAgKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9yeC1jbGllbnQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvcngvYWdlbnQvT2JzZXJ2YWJsZUFnZW50UmVzb3VyY2UuamF2YSBiL2V4YW1wbGVzL3J4LWNsaWVudC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9yeC9hZ2VudC9PYnNlcnZhYmxlQWdlbnRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyM2FhNjYKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9yeC1jbGllbnQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvcngvYWdlbnQvT2JzZXJ2YWJsZUFnZW50UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5yeC5hZ2VudDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudExpbmtlZFF1ZXVlOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQXN5bmNSZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuU3VzcGVuZGVkOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY1R5cGU7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnJ4LnJ4amF2YS5SeE9ic2VydmFibGVJbnZva2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5yeC5yeGphdmEuUnhPYnNlcnZhYmxlSW52b2tlclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnJ4LmRvbWFpbi5BZ2VudFJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnJ4LmRvbWFpbi5DYWxjdWxhdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5yeC5kb21haW4uRGVzdGluYXRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMucnguZG9tYWluLkZvcmVjYXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnJ4LmRvbWFpbi5SZWNvbW1lbmRhdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuVXJpOworCitpbXBvcnQgcnguT2JzZXJ2YWJsZTsKK2ltcG9ydCByeC5zY2hlZHVsZXJzLlNjaGVkdWxlcnM7CisKKy8qKgorICogT2J0YWluIGluZm9ybWF0aW9uIGFib3V0IHZpc2l0ZWQgKGRlc3RpbmF0aW9uKSBhbmQgcmVjb21tZW5kZWQgKGRlc3RpbmF0aW9uLCBmb3JlY2FzdCwgcHJpY2UpIHBsYWNlcyBmb3IgIlJ4SmF2YSIgdXNlci4gVXNlcworICogUnhKYXZhIE9ic2VydmFibGUgYW5kIEplcnNleSBDbGllbnQgdG8gb2J0YWluIHRoZSBkYXRhLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFNpbmdsZXRvbgorQFBhdGgoImFnZW50L29ic2VydmFibGUiKQorQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9qc29uIikKK3B1YmxpYyBjbGFzcyBPYnNlcnZhYmxlQWdlbnRSZXNvdXJjZSB7CisKKyAgICBAVXJpKCJyZW1vdGUvZGVzdGluYXRpb24iKQorICAgIHByaXZhdGUgV2ViVGFyZ2V0IGRlc3RpbmF0aW9uOworCisgICAgQFVyaSgicmVtb3RlL2NhbGN1bGF0aW9uL2Zyb20ve2Zyb219L3RvL3t0b30iKQorICAgIHByaXZhdGUgV2ViVGFyZ2V0IGNhbGN1bGF0aW9uOworCisgICAgQFVyaSgicmVtb3RlL2ZvcmVjYXN0L3tkZXN0aW5hdGlvbn0iKQorICAgIHByaXZhdGUgV2ViVGFyZ2V0IGZvcmVjYXN0OworCisgICAgQEdFVAorICAgIHB1YmxpYyB2b2lkIG9ic2VydmFibGUoQFN1c3BlbmRlZCBmaW5hbCBBc3luY1Jlc3BvbnNlIGFzeW5jKSB7CisgICAgICAgIGZpbmFsIGxvbmcgdGltZSA9IFN5c3RlbS5uYW5vVGltZSgpOworICAgICAgICBmaW5hbCBRdWV1ZTxTdHJpbmc+IGVycm9ycyA9IG5ldyBDb25jdXJyZW50TGlua2VkUXVldWU8PigpOworCisgICAgICAgIE9ic2VydmFibGUuanVzdChuZXcgQWdlbnRSZXNwb25zZSgpKQorICAgICAgICAgICAgICAgICAgLy8gT2J0YWluIHZpc2l0ZWQgZGVzdGluYXRpb25zLgorICAgICAgICAgICAgICAgICAgLnppcFdpdGgodmlzaXRlZChlcnJvcnMpLCAocmVzcG9uc2UsIHZpc2l0ZWQpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRWaXNpdGVkKHZpc2l0ZWQpOworICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTsKKyAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAvLyBPYnRhaW4gcmVjb21tZW5kZWQgZGVzdGluYXRpb25zLiAoZG9lcyBub3QgZGVwZW5kIG9uIHZpc2l0ZWQgb25lcykKKyAgICAgICAgICAgICAgICAgIC56aXBXaXRoKHJlY29tbWVuZGVkKGVycm9ycyksIChyZXNwb25zZSwgcmVjb21tZW5kYXRpb25zKSAtPiB7CisgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0UmVjb21tZW5kZWQocmVjb21tZW5kYXRpb25zKTsKKyAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7CisgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgLy8gT2JzZXJ2ZSBvbiBhbm90aGVyIHRocmVhZCB0aGFuIHRoZSBvbmUgcHJvY2Vzc2luZyB2aXNpdGVkIG9yIHJlY29tbWVuZGVkIGRlc3RpbmF0aW9ucy4KKyAgICAgICAgICAgICAgICAgIC5vYnNlcnZlT24oU2NoZWR1bGVycy5pbygpKQorICAgICAgICAgICAgICAgICAgLy8gU3Vic2NyaWJlLgorICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZShyZXNwb25zZSAtPiB7CisgICAgICAgICAgICAgICAgICAgICAgLy8gRG8gc29tZXRoaW5nIHdpdGggZXJyb3JzLgorCisgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0UHJvY2Vzc2luZ1RpbWUoKFN5c3RlbS5uYW5vVGltZSgpIC0gdGltZSkgLyAxMDAwMDAwKTsKKyAgICAgICAgICAgICAgICAgICAgICBhc3luYy5yZXN1bWUocmVzcG9uc2UpOworICAgICAgICAgICAgICAgICAgfSwgYXN5bmM6OnJlc3VtZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBPYnNlcnZhYmxlPExpc3Q8RGVzdGluYXRpb24+PiB2aXNpdGVkKGZpbmFsIFF1ZXVlPFN0cmluZz4gZXJyb3JzKSB7CisgICAgICAgIGRlc3RpbmF0aW9uLnJlZ2lzdGVyKFJ4T2JzZXJ2YWJsZUludm9rZXJQcm92aWRlci5jbGFzcyk7CisKKyAgICAgICAgcmV0dXJuIGRlc3RpbmF0aW9uLnBhdGgoInZpc2l0ZWQiKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWRlbnRpZnkgdGhlIHVzZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5oZWFkZXIoIlJ4LVVzZXIiLCAiUnhKYXZhIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVhY3RpdmUgaW52b2tlci4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgLnJ4KFJ4T2JzZXJ2YWJsZUludm9rZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldHVybiBhIGxpc3Qgb2YgZGVzdGluYXRpb25zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KG5ldyBHZW5lcmljVHlwZTxMaXN0PERlc3RpbmF0aW9uPj4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBFcnJvcnMuCisgICAgICAgICAgICAgICAgICAgICAgICAgIC5vbkVycm9yUmV0dXJuKHRocm93YWJsZSAtPiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMub2ZmZXIoIlZpc2l0ZWQ6ICIgKyB0aHJvd2FibGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBPYnNlcnZhYmxlPExpc3Q8UmVjb21tZW5kYXRpb24+PiByZWNvbW1lbmRlZChmaW5hbCBRdWV1ZTxTdHJpbmc+IGVycm9ycykgeworICAgICAgICBkZXN0aW5hdGlvbi5yZWdpc3RlcihSeE9ic2VydmFibGVJbnZva2VyUHJvdmlkZXIuY2xhc3MpOworCisgICAgICAgIC8vIFJlY29tbWVuZGVkIHBsYWNlcy4KKyAgICAgICAgZmluYWwgT2JzZXJ2YWJsZTxEZXN0aW5hdGlvbj4gcmVjb21tZW5kZWQgPSBkZXN0aW5hdGlvbi5wYXRoKCJyZWNvbW1lbmRlZCIpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWRlbnRpZnkgdGhlIHVzZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaGVhZGVyKCJSeC1Vc2VyIiwgIlJ4SmF2YSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWFjdGl2ZSBpbnZva2VyLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJ4KFJ4T2JzZXJ2YWJsZUludm9rZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gYSBsaXN0IG9mIGRlc3RpbmF0aW9ucy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQobmV3IEdlbmVyaWNUeXBlPExpc3Q8RGVzdGluYXRpb24+PigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIYW5kbGUgRXJyb3JzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9uRXJyb3JSZXR1cm4odGhyb3dhYmxlIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMub2ZmZXIoIlJlY29tbWVuZGVkOiAiICsgdGhyb3dhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW1pdCBkZXN0aW5hdGlvbnMgb25lLWJ5LW9uZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mbGF0TWFwKE9ic2VydmFibGU6OmZyb20pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1lbWJlciBlbWl0dGVkIGl0ZW1zIGZvciBkZXBlbmRhbnQgcmVxdWVzdHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2FjaGUoKTsKKworICAgICAgICBmb3JlY2FzdC5yZWdpc3RlcihSeE9ic2VydmFibGVJbnZva2VyUHJvdmlkZXIuY2xhc3MpOworCisgICAgICAgIC8vIEZvcmVjYXN0cy4gKGRlcGVuZCBvbiByZWNvbW1lbmRlZCBkZXN0aW5hdGlvbnMpCisgICAgICAgIGZpbmFsIE9ic2VydmFibGU8Rm9yZWNhc3Q+IGZvcmVjYXN0cyA9IHJlY29tbWVuZGVkLmZsYXRNYXAoZGVzdGluYXRpb24gLT4KKyAgICAgICAgICAgICAgICBmb3JlY2FzdAorICAgICAgICAgICAgICAgICAgICAgICAgLnJlc29sdmVUZW1wbGF0ZSgiZGVzdGluYXRpb24iLCBkZXN0aW5hdGlvbi5nZXREZXN0aW5hdGlvbigpKQorICAgICAgICAgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5yeChSeE9ic2VydmFibGVJbnZva2VyLmNsYXNzKS5nZXQoRm9yZWNhc3QuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAub25FcnJvclJldHVybih0aHJvd2FibGUgLT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5vZmZlcigiRm9yZWNhc3Q6ICIgKyB0aHJvd2FibGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZvcmVjYXN0KGRlc3RpbmF0aW9uLmdldERlc3RpbmF0aW9uKCksICJOL0EiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKKworICAgICAgICBjYWxjdWxhdGlvbi5yZWdpc3RlcihSeE9ic2VydmFibGVJbnZva2VyUHJvdmlkZXIuY2xhc3MpOworCisgICAgICAgIC8vIENhbGN1bGF0aW9ucy4gKGRlcGVuZCBvbiByZWNvbW1lbmRlZCBkZXN0aW5hdGlvbnMpCisgICAgICAgIGZpbmFsIE9ic2VydmFibGU8Q2FsY3VsYXRpb24+IGNhbGN1bGF0aW9ucyA9IHJlY29tbWVuZGVkLmZsYXRNYXAoZGVzdGluYXRpb24gLT4KKyAgICAgICAgICAgICAgICBjYWxjdWxhdGlvbi5yZXNvbHZlVGVtcGxhdGUoImZyb20iLCAiTW9vbiIpLnJlc29sdmVUZW1wbGF0ZSgidG8iLCBkZXN0aW5hdGlvbi5nZXREZXN0aW5hdGlvbigpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5yeChSeE9ic2VydmFibGVJbnZva2VyLmNsYXNzKS5nZXQoQ2FsY3VsYXRpb24uY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAub25FcnJvclJldHVybih0aHJvd2FibGUgLT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5vZmZlcigiQ2FsY3VsYXRpb246ICIgKyB0aHJvd2FibGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENhbGN1bGF0aW9uKCJNb29uIiwgZGVzdGluYXRpb24uZ2V0RGVzdGluYXRpb24oKSwgLTEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOworCisgICAgICAgIHJldHVybiBPYnNlcnZhYmxlLnppcChyZWNvbW1lbmRlZCwgZm9yZWNhc3RzLCBjYWxjdWxhdGlvbnMsIFJlY29tbWVuZGF0aW9uOjpuZXcpLnRvTGlzdCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3J4LWNsaWVudC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9yeC9hZ2VudC9TeW5jQWdlbnRSZXNvdXJjZS5qYXZhIGIvZXhhbXBsZXMvcngtY2xpZW50LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3J4L2FnZW50L1N5bmNBZ2VudFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAyZDQ2NQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3J4LWNsaWVudC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9yeC9hZ2VudC9TeW5jQWdlbnRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnJ4LmFnZW50OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudExpbmtlZFF1ZXVlOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkdlbmVyaWNUeXBlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMucnguZG9tYWluLkFnZW50UmVzcG9uc2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMucnguZG9tYWluLkNhbGN1bGF0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnJ4LmRvbWFpbi5EZXN0aW5hdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5yeC5kb21haW4uRm9yZWNhc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMucnguZG9tYWluLlJlY29tbWVuZGF0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Vcmk7CisKKy8qKgorICogT2J0YWluIGluZm9ybWF0aW9uIGFib3V0IHZpc2l0ZWQgKGRlc3RpbmF0aW9uKSBhbmQgcmVjb21tZW5kZWQgKGRlc3RpbmF0aW9uLCBmb3JlY2FzdCwgcHJpY2UpIHBsYWNlcyBmb3IgIlN5bmMiIHVzZXIuIFVzZXMKKyAqIHN0YW5kYXJkIEpBWC1SUyBzeW5jIGFwcHJvYWNoIHRvIG9idGFpbiB0aGUgZGF0YS4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFBhdGgoImFnZW50L3N5bmMiKQorQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9qc29uIikKK3B1YmxpYyBjbGFzcyBTeW5jQWdlbnRSZXNvdXJjZSB7CisKKyAgICBAVXJpKCJyZW1vdGUvZGVzdGluYXRpb24iKQorICAgIHByaXZhdGUgV2ViVGFyZ2V0IGRlc3RpbmF0aW9uOworCisgICAgQFVyaSgicmVtb3RlL2NhbGN1bGF0aW9uL2Zyb20ve2Zyb219L3RvL3t0b30iKQorICAgIHByaXZhdGUgV2ViVGFyZ2V0IGNhbGN1bGF0aW9uOworCisgICAgQFVyaSgicmVtb3RlL2ZvcmVjYXN0L3tkZXN0aW5hdGlvbn0iKQorICAgIHByaXZhdGUgV2ViVGFyZ2V0IGZvcmVjYXN0OworCisgICAgQEdFVAorICAgIHB1YmxpYyBBZ2VudFJlc3BvbnNlIHN5bmMoKSB7CisgICAgICAgIGZpbmFsIGxvbmcgdGltZSA9IFN5c3RlbS5uYW5vVGltZSgpOworCisgICAgICAgIGZpbmFsIEFnZW50UmVzcG9uc2UgcmVzcG9uc2UgPSBuZXcgQWdlbnRSZXNwb25zZSgpOworICAgICAgICBmaW5hbCBRdWV1ZTxTdHJpbmc+IGVycm9ycyA9IG5ldyBDb25jdXJyZW50TGlua2VkUXVldWU8PigpOworCisgICAgICAgIC8vIE9idGFpbiB2aXNpdGVkIGRlc3RpbmF0aW9ucy4KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNldFZpc2l0ZWQoZGVzdGluYXRpb24ucGF0aCgidmlzaXRlZCIpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgICAgICAvLyBJZGVudGlmeSB0aGUgdXNlci4KKyAgICAgICAgICAgICAgICAgICAgLmhlYWRlcigiUngtVXNlciIsICJTeW5jIikKKyAgICAgICAgICAgICAgICAgICAgLy8gUmV0dXJuIGEgbGlzdCBvZiBkZXN0aW5hdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgLmdldChuZXcgR2VuZXJpY1R5cGU8TGlzdDxEZXN0aW5hdGlvbj4+KCkge30pKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgVGhyb3dhYmxlIHRocm93YWJsZSkgeworICAgICAgICAgICAgZXJyb3JzLm9mZmVyKCJWaXNpdGVkOiAiICsgdGhyb3dhYmxlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBPYnRhaW4gcmVjb21tZW5kZWQgZGVzdGluYXRpb25zLiAoZG9lcyBub3QgZGVwZW5kIG9uIHZpc2l0ZWQgb25lcykKKyAgICAgICAgTGlzdDxEZXN0aW5hdGlvbj4gcmVjb21tZW5kZWQgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlY29tbWVuZGVkID0gZGVzdGluYXRpb24ucGF0aCgicmVjb21tZW5kZWQiKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAgICAgLy8gSWRlbnRpZnkgdGhlIHVzZXIuCisgICAgICAgICAgICAgICAgICAgIC5oZWFkZXIoIlJ4LVVzZXIiLCAiU3luYyIpCisgICAgICAgICAgICAgICAgICAgIC8vIFJldHVybiBhIGxpc3Qgb2YgZGVzdGluYXRpb25zLgorICAgICAgICAgICAgICAgICAgICAuZ2V0KG5ldyBHZW5lcmljVHlwZTxMaXN0PERlc3RpbmF0aW9uPj4oKSB7fSk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKKyAgICAgICAgICAgIGVycm9ycy5vZmZlcigiUmVjb21tZW5kZWQ6ICIgKyB0aHJvd2FibGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZvcmVjYXN0cy4gKGRlcGVuZCBvbiByZWNvbW1lbmRlZCBkZXN0aW5hdGlvbnMpCisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIEZvcmVjYXN0PiBmb3JlY2FzdHMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIGZvciAoZmluYWwgRGVzdGluYXRpb24gZGVzdCA6IHJlY29tbWVuZGVkKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZvcmVjYXN0cy5wdXQoZGVzdC5nZXREZXN0aW5hdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWNhc3QucmVzb2x2ZVRlbXBsYXRlKCJkZXN0aW5hdGlvbiIsIGRlc3QuZ2V0RGVzdGluYXRpb24oKSkucmVxdWVzdCgpLmdldChGb3JlY2FzdC5jbGFzcykpOworICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgVGhyb3dhYmxlIHRocm93YWJsZSkgeworICAgICAgICAgICAgICAgIGVycm9ycy5vZmZlcigiRm9yZWNhc3Q6ICIgKyB0aHJvd2FibGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIENhbGN1bGF0aW9ucy4gKGRlcGVuZCBvbiByZWNvbW1lbmRlZCBkZXN0aW5hdGlvbnMpCisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIENhbGN1bGF0aW9uPiBjYWxjdWxhdGlvbnMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIHJlY29tbWVuZGVkLnN0cmVhbSgpLmZvckVhY2goZGVzdGluYXRpb24gLT4geworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjYWxjdWxhdGlvbnMucHV0KGRlc3RpbmF0aW9uLmdldERlc3RpbmF0aW9uKCksIGNhbGN1bGF0aW9uLnJlc29sdmVUZW1wbGF0ZSgiZnJvbSIsICJNb29uIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5yZXNvbHZlVGVtcGxhdGUoInRvIiwgZGVzdGluYXRpb24uZ2V0RGVzdGluYXRpb24oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkuZ2V0KENhbGN1bGF0aW9uLmNsYXNzKSk7CisgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7CisgICAgICAgICAgICAgICAgZXJyb3JzLm9mZmVyKCJDYWxjdWxhdGlvbjogIiArIHRocm93YWJsZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICAvLyBSZWNvbW1lbmRhdGlvbnMuCisgICAgICAgIGZpbmFsIExpc3Q8UmVjb21tZW5kYXRpb24+IHJlY29tbWVuZGF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8PihyZWNvbW1lbmRlZC5zaXplKCkpOworICAgICAgICBmb3IgKGZpbmFsIERlc3RpbmF0aW9uIGRlc3QgOiByZWNvbW1lbmRlZCkgeworICAgICAgICAgICAgZmluYWwgRm9yZWNhc3QgZm9yZSA9IGZvcmVjYXN0cy5nZXQoZGVzdC5nZXREZXN0aW5hdGlvbigpKTsKKyAgICAgICAgICAgIGZpbmFsIENhbGN1bGF0aW9uIGNhbGMgPSBjYWxjdWxhdGlvbnMuZ2V0KGRlc3QuZ2V0RGVzdGluYXRpb24oKSk7CisKKyAgICAgICAgICAgIHJlY29tbWVuZGF0aW9ucy5hZGQobmV3IFJlY29tbWVuZGF0aW9uKGRlc3QuZ2V0RGVzdGluYXRpb24oKSwKKyAgICAgICAgICAgICAgICAgICAgZm9yZSAhPSBudWxsID8gZm9yZS5nZXRGb3JlY2FzdCgpIDogIk4vQSIsIGNhbGMgIT0gbnVsbCA/IGNhbGMuZ2V0UHJpY2UoKSA6IC0xKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBEbyBzb21ldGhpbmcgd2l0aCBlcnJvcnMuCisgICAgICAgIC8vIC4uLgorCisgICAgICAgIHJlc3BvbnNlLnNldFJlY29tbWVuZGVkKHJlY29tbWVuZGF0aW9ucyk7CisgICAgICAgIHJlc3BvbnNlLnNldFByb2Nlc3NpbmdUaW1lKChTeXN0ZW0ubmFub1RpbWUoKSAtIHRpbWUpIC8gMTAwMDAwMCk7CisgICAgICAgIHJldHVybiByZXNwb25zZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9yeC1jbGllbnQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvcngvZG9tYWluL0FnZW50UmVzcG9uc2UuamF2YSBiL2V4YW1wbGVzL3J4LWNsaWVudC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9yeC9kb21haW4vQWdlbnRSZXNwb25zZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNjU2ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9yeC1jbGllbnQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvcngvZG9tYWluL0FnZW50UmVzcG9uc2UuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnJ4LmRvbWFpbjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBBZ2VudFJlc3BvbnNlIHsKKworICAgIHByaXZhdGUgTGlzdDxEZXN0aW5hdGlvbj4gdmlzaXRlZCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgIHByaXZhdGUgTGlzdDxSZWNvbW1lbmRhdGlvbj4gcmVjb21tZW5kZWQ7CisgICAgcHJpdmF0ZSBsb25nIHByb2Nlc3NpbmdUaW1lOworCisgICAgcHVibGljIEFnZW50UmVzcG9uc2UoKSB7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8RGVzdGluYXRpb24+IGdldFZpc2l0ZWQoKSB7CisgICAgICAgIHJldHVybiB2aXNpdGVkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFZpc2l0ZWQoZmluYWwgTGlzdDxEZXN0aW5hdGlvbj4gdmlzaXRlZCkgeworICAgICAgICB0aGlzLnZpc2l0ZWQgPSB2aXNpdGVkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJlY29tbWVuZGVkKGZpbmFsIExpc3Q8UmVjb21tZW5kYXRpb24+IHJlY29tbWVuZGVkKSB7CisgICAgICAgIHRoaXMucmVjb21tZW5kZWQgPSByZWNvbW1lbmRlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxSZWNvbW1lbmRhdGlvbj4gZ2V0UmVjb21tZW5kZWQoKSB7CisgICAgICAgIHJldHVybiByZWNvbW1lbmRlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9jZXNzaW5nVGltZShmaW5hbCBsb25nIHByb2Nlc3NpbmdUaW1lKSB7CisgICAgICAgIHRoaXMucHJvY2Vzc2luZ1RpbWUgPSBwcm9jZXNzaW5nVGltZTsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRQcm9jZXNzaW5nVGltZSgpIHsKKyAgICAgICAgcmV0dXJuIHByb2Nlc3NpbmdUaW1lOworICAgIH0KKworICAgIHB1YmxpYyBBZ2VudFJlc3BvbnNlIHZpc2l0ZWQoZmluYWwgTGlzdDxEZXN0aW5hdGlvbj4gdmlzaXRlZCkgeworICAgICAgICBzZXRWaXNpdGVkKHZpc2l0ZWQpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgQWdlbnRSZXNwb25zZSByZWNvbW1lbmRlZChmaW5hbCBMaXN0PFJlY29tbWVuZGF0aW9uPiByZWNvbW1lbmRlZCkgeworICAgICAgICBzZXRSZWNvbW1lbmRlZChyZWNvbW1lbmRlZCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3J4LWNsaWVudC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9yeC9kb21haW4vQ2FsY3VsYXRpb24uamF2YSBiL2V4YW1wbGVzL3J4LWNsaWVudC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9yeC9kb21haW4vQ2FsY3VsYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDVhMTQxCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvcngtY2xpZW50LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3J4L2RvbWFpbi9DYWxjdWxhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMucnguZG9tYWluOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFhtbFJvb3RFbGVtZW50CitwdWJsaWMgY2xhc3MgQ2FsY3VsYXRpb24geworCisgICAgcHJpdmF0ZSBTdHJpbmcgZnJvbTsKKyAgICBwcml2YXRlIFN0cmluZyB0bzsKKyAgICBwcml2YXRlIGludCBwcmljZTsKKworICAgIHB1YmxpYyBDYWxjdWxhdGlvbigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2FsY3VsYXRpb24oZmluYWwgU3RyaW5nIGZyb20sIGZpbmFsIFN0cmluZyB0bywgZmluYWwgaW50IHByaWNlKSB7CisgICAgICAgIHRoaXMuZnJvbSA9IGZyb207CisgICAgICAgIHRoaXMudG8gPSB0bzsKKyAgICAgICAgdGhpcy5wcmljZSA9IHByaWNlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RnJvbSgpIHsKKyAgICAgICAgcmV0dXJuIGZyb207CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RnJvbShmaW5hbCBTdHJpbmcgZnJvbSkgeworICAgICAgICB0aGlzLmZyb20gPSBmcm9tOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VG8oKSB7CisgICAgICAgIHJldHVybiB0bzsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUbyhmaW5hbCBTdHJpbmcgdG8pIHsKKyAgICAgICAgdGhpcy50byA9IHRvOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UHJpY2UoKSB7CisgICAgICAgIHJldHVybiBwcmljZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcmljZShmaW5hbCBpbnQgcHJpY2UpIHsKKyAgICAgICAgdGhpcy5wcmljZSA9IHByaWNlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3J4LWNsaWVudC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9yeC9kb21haW4vRGVzdGluYXRpb24uamF2YSBiL2V4YW1wbGVzL3J4LWNsaWVudC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9yeC9kb21haW4vRGVzdGluYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWE0Mjc2Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvcngtY2xpZW50LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3J4L2RvbWFpbi9EZXN0aW5hdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMucnguZG9tYWluOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgRGVzdGluYXRpb24geworCisgICAgcHJpdmF0ZSBTdHJpbmcgZGVzdGluYXRpb247CisKKyAgICBwdWJsaWMgRGVzdGluYXRpb24oKSB7CisgICAgfQorCisgICAgcHVibGljIERlc3RpbmF0aW9uKGZpbmFsIFN0cmluZyBkZXN0aW5hdGlvbikgeworICAgICAgICB0aGlzLmRlc3RpbmF0aW9uID0gZGVzdGluYXRpb247CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXREZXN0aW5hdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGRlc3RpbmF0aW9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERlc3RpbmF0aW9uKGZpbmFsIFN0cmluZyBkZXN0aW5hdGlvbikgeworICAgICAgICB0aGlzLmRlc3RpbmF0aW9uID0gZGVzdGluYXRpb247CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvcngtY2xpZW50LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3J4L2RvbWFpbi9Gb3JlY2FzdC5qYXZhIGIvZXhhbXBsZXMvcngtY2xpZW50LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3J4L2RvbWFpbi9Gb3JlY2FzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZWUyMGMKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9yeC1jbGllbnQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvcngvZG9tYWluL0ZvcmVjYXN0LmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5yeC5kb21haW47CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAWG1sUm9vdEVsZW1lbnQKK3B1YmxpYyBjbGFzcyBGb3JlY2FzdCB7CisKKyAgICBwcml2YXRlIFN0cmluZyBmb3JlY2FzdDsKKyAgICBwcml2YXRlIFN0cmluZyBkZXN0aW5hdGlvbjsKKworICAgIHB1YmxpYyBGb3JlY2FzdCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgRm9yZWNhc3QoZmluYWwgU3RyaW5nIGRlc3RpbmF0aW9uLCBmaW5hbCBTdHJpbmcgZm9yZWNhc3QpIHsKKyAgICAgICAgdGhpcy5kZXN0aW5hdGlvbiA9IGRlc3RpbmF0aW9uOworICAgICAgICB0aGlzLmZvcmVjYXN0ID0gZm9yZWNhc3Q7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRGb3JlY2FzdCgpIHsKKyAgICAgICAgcmV0dXJuIGZvcmVjYXN0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEZvcmVjYXN0KGZpbmFsIFN0cmluZyBmb3JlY2FzdCkgeworICAgICAgICB0aGlzLmZvcmVjYXN0ID0gZm9yZWNhc3Q7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXREZXN0aW5hdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGRlc3RpbmF0aW9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERlc3RpbmF0aW9uKGZpbmFsIFN0cmluZyBkZXN0aW5hdGlvbikgeworICAgICAgICB0aGlzLmRlc3RpbmF0aW9uID0gZGVzdGluYXRpb247CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvcngtY2xpZW50LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3J4L2RvbWFpbi9SZWNvbW1lbmRhdGlvbi5qYXZhIGIvZXhhbXBsZXMvcngtY2xpZW50LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3J4L2RvbWFpbi9SZWNvbW1lbmRhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMmM3ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9yeC1jbGllbnQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvcngvZG9tYWluL1JlY29tbWVuZGF0aW9uLmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5yeC5kb21haW47CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBSZWNvbW1lbmRhdGlvbiB7CisKKyAgICBwcml2YXRlIFN0cmluZyBkZXN0aW5hdGlvbjsKKyAgICBwcml2YXRlIFN0cmluZyBmb3JlY2FzdDsKKyAgICBwcml2YXRlIGludCBwcmljZTsKKworICAgIHB1YmxpYyBSZWNvbW1lbmRhdGlvbigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVjb21tZW5kYXRpb24oZmluYWwgU3RyaW5nIGRlc3RpbmF0aW9uKSB7CisgICAgICAgIHRoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVjb21tZW5kYXRpb24oZmluYWwgU3RyaW5nIGRlc3RpbmF0aW9uLCBmaW5hbCBTdHJpbmcgZm9yZWNhc3QsIGZpbmFsIGludCBwcmljZSkgeworICAgICAgICB0aGlzLmRlc3RpbmF0aW9uID0gZGVzdGluYXRpb247CisgICAgICAgIHRoaXMuZm9yZWNhc3QgPSBmb3JlY2FzdDsKKyAgICAgICAgdGhpcy5wcmljZSA9IHByaWNlOworICAgIH0KKworICAgIHB1YmxpYyBSZWNvbW1lbmRhdGlvbihmaW5hbCBEZXN0aW5hdGlvbiBkZXN0aW5hdGlvbikgeworICAgICAgICB0aGlzLmRlc3RpbmF0aW9uID0gZGVzdGluYXRpb24uZ2V0RGVzdGluYXRpb24oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVjb21tZW5kYXRpb24oZmluYWwgRGVzdGluYXRpb24gZGVzdGluYXRpb24sIGZpbmFsIEZvcmVjYXN0IGZvcmVjYXN0LCBmaW5hbCBDYWxjdWxhdGlvbiBjYWxjdWxhdGlvbikgeworICAgICAgICB0aGlzLmRlc3RpbmF0aW9uID0gZGVzdGluYXRpb24uZ2V0RGVzdGluYXRpb24oKTsKKyAgICAgICAgdGhpcy5mb3JlY2FzdCA9IGZvcmVjYXN0LmdldEZvcmVjYXN0KCk7CisgICAgICAgIHRoaXMucHJpY2UgPSBjYWxjdWxhdGlvbi5nZXRQcmljZSgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzdGluYXRpb24oKSB7CisgICAgICAgIHJldHVybiBkZXN0aW5hdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZXN0aW5hdGlvbihmaW5hbCBTdHJpbmcgZGVzdGluYXRpb24pIHsKKyAgICAgICAgdGhpcy5kZXN0aW5hdGlvbiA9IGRlc3RpbmF0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9yZWNhc3QoKSB7CisgICAgICAgIHJldHVybiBmb3JlY2FzdDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGb3JlY2FzdChmaW5hbCBTdHJpbmcgZm9yZWNhc3QpIHsKKyAgICAgICAgdGhpcy5mb3JlY2FzdCA9IGZvcmVjYXN0OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UHJpY2UoKSB7CisgICAgICAgIHJldHVybiBwcmljZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcmljZShmaW5hbCBpbnQgcHJpY2UpIHsKKyAgICAgICAgdGhpcy5wcmljZSA9IHByaWNlOworICAgIH0KKworICAgIHB1YmxpYyBSZWNvbW1lbmRhdGlvbiBmb3JlY2FzdChmaW5hbCBGb3JlY2FzdCBmb3JlY2FzdCkgeworICAgICAgICBzZXRGb3JlY2FzdChmb3JlY2FzdC5nZXRGb3JlY2FzdCgpKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFJlY29tbWVuZGF0aW9uIGNhbGN1bGF0aW9uKGZpbmFsIENhbGN1bGF0aW9uIGNhbGN1bGF0aW9uKSB7CisgICAgICAgIHNldFByaWNlKGNhbGN1bGF0aW9uLmdldFByaWNlKCkpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9yeC1jbGllbnQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvcngvcmVtb3RlL0NhbGN1bGF0aW9uUmVzb3VyY2UuamF2YSBiL2V4YW1wbGVzL3J4LWNsaWVudC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9yeC9yZW1vdGUvQ2FsY3VsYXRpb25SZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NzkyZWEKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9yeC1jbGllbnQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvcngvcmVtb3RlL0NhbGN1bGF0aW9uUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnJ4LnJlbW90ZTsKKworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CisKK2ltcG9ydCBqYXZheC53cy5ycy5EZWZhdWx0VmFsdWU7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMucnguSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnJ4LmRvbWFpbi5DYWxjdWxhdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuTWFuYWdlZEFzeW5jOworCisvKioKKyAqIE9idGFpbiBhIGNhbGN1bGF0aW9uIGZvciBhIHRyaXAgZnJvbSBvbmUgZGVzdGluYXRpb24gdG8gYW5vdGhlci4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFBhdGgoInJlbW90ZS9jYWxjdWxhdGlvbiIpCitAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2pzb24iKQorcHVibGljIGNsYXNzIENhbGN1bGF0aW9uUmVzb3VyY2UgeworCisgICAgQEdFVAorICAgIEBNYW5hZ2VkQXN5bmMKKyAgICBAUGF0aCgiL2Zyb20ve2Zyb219L3RvL3t0b30iKQorICAgIHB1YmxpYyBDYWxjdWxhdGlvbiBjYWxjdWxhdGlvbihAUGF0aFBhcmFtKCJmcm9tIikgQERlZmF1bHRWYWx1ZSgiTW9vbiIpIGZpbmFsIFN0cmluZyBmcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAUGF0aFBhcmFtKCJ0byIpIGZpbmFsIFN0cmluZyB0bykgeworICAgICAgICAvLyBTaW11bGF0ZSBsb25nLXJ1bm5pbmcgb3BlcmF0aW9uLgorICAgICAgICBIZWxwZXIuc2xlZXAoMzUwKTsKKworICAgICAgICByZXR1cm4gbmV3IENhbGN1bGF0aW9uKGZyb20sIHRvLCBuZXcgUmFuZG9tKCkubmV4dEludCgxMDAwMCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3J4LWNsaWVudC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9yeC9yZW1vdGUvRGVzdGluYXRpb25SZXNvdXJjZS5qYXZhIGIvZXhhbXBsZXMvcngtY2xpZW50LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3J4L3JlbW90ZS9EZXN0aW5hdGlvblJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZhMWQxNQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3J4LWNsaWVudC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9yeC9yZW1vdGUvRGVzdGluYXRpb25SZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMucngucmVtb3RlOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LndzLnJzLkRlZmF1bHRWYWx1ZTsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuSGVhZGVyUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnJ4LkhlbHBlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5yeC5kb21haW4uRGVzdGluYXRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLlZpZXdzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5NYW5hZ2VkQXN5bmM7CisKKy8qKgorICogT2J0YWluIGEgbGlzdCBvZiB2aXNpdGVkIC8gcmVjb21tZW5kZWQgcGxhY2VzIGZvciBhIGdpdmVuIHVzZXIuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BTaW5nbGV0b24KK0BQYXRoKCJyZW1vdGUvZGVzdGluYXRpb24iKQorQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9qc29uIikKK3B1YmxpYyBjbGFzcyBEZXN0aW5hdGlvblJlc291cmNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gVklTSVRFRCA9IG5ldyBIYXNoTWFwPD4oKTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIFZJU0lURUQucHV0KCJTeW5jIiwgSGVscGVyLmdldENvdW50cmllcyg1KSk7CisgICAgICAgIFZJU0lURUQucHV0KCJBc3luYyIsIEhlbHBlci5nZXRDb3VudHJpZXMoNSkpOworICAgICAgICBWSVNJVEVELnB1dCgiR3VhdmEiLCBIZWxwZXIuZ2V0Q291bnRyaWVzKDUpKTsKKyAgICAgICAgVklTSVRFRC5wdXQoIlJ4SmF2YSIsIEhlbHBlci5nZXRDb3VudHJpZXMoNSkpOworICAgICAgICBWSVNJVEVELnB1dCgiUnhKYXZhMiIsIEhlbHBlci5nZXRDb3VudHJpZXMoNSkpOworICAgICAgICBWSVNJVEVELnB1dCgiQ29tcGxldGlvblN0YWdlIiwgSGVscGVyLmdldENvdW50cmllcyg1KSk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBNYW5hZ2VkQXN5bmMKKyAgICBAUGF0aCgidmlzaXRlZCIpCisgICAgcHVibGljIExpc3Q8RGVzdGluYXRpb24+IHZpc2l0ZWQoQEhlYWRlclBhcmFtKCJSeC1Vc2VyIikgQERlZmF1bHRWYWx1ZSgiS08iKSBmaW5hbCBTdHJpbmcgdXNlcikgeworICAgICAgICAvLyBTaW11bGF0ZSBsb25nLXJ1bm5pbmcgb3BlcmF0aW9uLgorICAgICAgICBIZWxwZXIuc2xlZXAoKTsKKworICAgICAgICBpZiAoIVZJU0lURUQuY29udGFpbnNLZXkodXNlcikpIHsKKyAgICAgICAgICAgIFZJU0lURUQucHV0KHVzZXIsIEhlbHBlci5nZXRDb3VudHJpZXMoNSkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIFZpZXdzLmxpc3RWaWV3KFZJU0lURUQuZ2V0KHVzZXIpLCBEZXN0aW5hdGlvbjo6bmV3KTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQE1hbmFnZWRBc3luYworICAgIEBQYXRoKCJyZWNvbW1lbmRlZCIpCisgICAgcHVibGljIExpc3Q8RGVzdGluYXRpb24+IHJlY29tbWVuZGVkKEBIZWFkZXJQYXJhbSgiUngtVXNlciIpIEBEZWZhdWx0VmFsdWUoIktPIikgZmluYWwgU3RyaW5nIHVzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBRdWVyeVBhcmFtKCJsaW1pdCIpIEBEZWZhdWx0VmFsdWUoIjUiKSBmaW5hbCBpbnQgbGltaXQpIHsKKyAgICAgICAgLy8gU2ltdWxhdGUgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbi4KKyAgICAgICAgSGVscGVyLnNsZWVwKCk7CisKKyAgICAgICAgaWYgKCFWSVNJVEVELmNvbnRhaW5zS2V5KHVzZXIpKSB7CisgICAgICAgICAgICBWSVNJVEVELnB1dCh1c2VyLCBIZWxwZXIuZ2V0Q291bnRyaWVzKDUpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBWaWV3cy5saXN0VmlldyhIZWxwZXIuZ2V0Q291bnRyaWVzKGxpbWl0LCBWSVNJVEVELmdldCh1c2VyKSksIERlc3RpbmF0aW9uOjpuZXcpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3J4LWNsaWVudC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9yeC9yZW1vdGUvRm9yZWNhc3RSZXNvdXJjZS5qYXZhIGIvZXhhbXBsZXMvcngtY2xpZW50LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3J4L3JlbW90ZS9Gb3JlY2FzdFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDkyNDdmZQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3J4LWNsaWVudC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9yeC9yZW1vdGUvRm9yZWNhc3RSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMucngucmVtb3RlOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMucnguSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnJ4LmRvbWFpbi5Gb3JlY2FzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuTWFuYWdlZEFzeW5jOworCisvKioKKyAqIE9idGFpbiBjdXJyZW50IHdlYXRoZXIgY29uZGl0aW9ucyBpbiBhIGRlc3RpbmF0aW9uLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUGF0aCgicmVtb3RlL2ZvcmVjYXN0IikKK0BQcm9kdWNlcygiYXBwbGljYXRpb24vanNvbiIpCitwdWJsaWMgY2xhc3MgRm9yZWNhc3RSZXNvdXJjZSB7CisKKyAgICBAR0VUCisgICAgQE1hbmFnZWRBc3luYworICAgIEBQYXRoKCIve2Rlc3RpbmF0aW9ufSIpCisgICAgcHVibGljIEZvcmVjYXN0IGZvcmVjYXN0KEBQYXRoUGFyYW0oImRlc3RpbmF0aW9uIikgZmluYWwgU3RyaW5nIGRlc3RpbmF0aW9uKSB7CisgICAgICAgIC8vIFNpbXVsYXRlIGxvbmctcnVubmluZyBvcGVyYXRpb24uCisgICAgICAgIEhlbHBlci5zbGVlcCgzNTApOworCisgICAgICAgIHJldHVybiBuZXcgRm9yZWNhc3QoZGVzdGluYXRpb24sIEhlbHBlci5nZXRGb3JlY2FzdCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9yeC1jbGllbnQtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvcngvUnhDbGllbnRzVGVzdC5qYXZhIGIvZXhhbXBsZXMvcngtY2xpZW50LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3J4L1J4Q2xpZW50c1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDZhZTEyCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvcngtY2xpZW50LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3J4L1J4Q2xpZW50c1Rlc3QuamF2YQpAQCAtMCwwICsxLDEzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5yeDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5yeC5kb21haW4uQWdlbnRSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkRlcGxveW1lbnRDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlNlcnZsZXREZXBsb3ltZW50Q29udGV4dDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIEludm9rZSBjbGllbnRzIGluIEFnZW50IHBhcnQgb2YgdGhlIGFwcGxpY2F0aW9uLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFJ4Q2xpZW50c1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBEZXBsb3ltZW50Q29udGV4dCBjb25maWd1cmVEZXBsb3ltZW50KCkgeworICAgICAgICByZXR1cm4gU2VydmxldERlcGxveW1lbnRDb250ZXh0LmJ1aWxkZXIoUnhBcHBsaWNhdGlvbi5jbGFzcykKKyAgICAgICAgICAgICAgICAuY29udGV4dFBhdGgoInJ4LWNsaWVudC13ZWJhcHAvcngiKS5idWlsZCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN5bmNDbGllbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gd2FybXVwCisgICAgICAgIHRhcmdldCgiYWdlbnQiKS5wYXRoKCJzeW5jIikucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJhZ2VudCIpLnBhdGgoInN5bmMiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIHJlc3BvbnNlLmJ1ZmZlckVudGl0eSgpOworCisgICAgICAgIGZpbmFsIEFnZW50UmVzcG9uc2UgYWdlbnRSZXNwb25zZSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoQWdlbnRSZXNwb25zZS5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChhZ2VudFJlc3BvbnNlLmdldFZpc2l0ZWQoKS5zaXplKCksIGlzKDUpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChhZ2VudFJlc3BvbnNlLmdldFJlY29tbWVuZGVkKCkuc2l6ZSgpLCBpcyg1KSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChhZ2VudFJlc3BvbnNlLmdldFByb2Nlc3NpbmdUaW1lKCkgPiA0NTAwLCBpcyh0cnVlKSk7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUHJvY2Vzc2luZyBUaW1lOiAiICsgYWdlbnRSZXNwb25zZS5nZXRQcm9jZXNzaW5nVGltZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luY0NsaWVudCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyB3YXJtdXAKKyAgICAgICAgdGFyZ2V0KCJhZ2VudCIpLnBhdGgoImFzeW5jIikucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJhZ2VudCIpLnBhdGgoImFzeW5jIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICByZXNwb25zZS5idWZmZXJFbnRpdHkoKTsKKworICAgICAgICBmaW5hbCBBZ2VudFJlc3BvbnNlIGFnZW50UmVzcG9uc2UgPSByZXNwb25zZS5yZWFkRW50aXR5KEFnZW50UmVzcG9uc2UuY2xhc3MpOworCisgICAgICAgIGFzc2VydFRoYXQoYWdlbnRSZXNwb25zZS5nZXRWaXNpdGVkKCkuc2l6ZSgpLCBpcyg1KSk7CisgICAgICAgIGFzc2VydFRoYXQoYWdlbnRSZXNwb25zZS5nZXRSZWNvbW1lbmRlZCgpLnNpemUoKSwgaXMoNSkpOworCisgICAgICAgIGFzc2VydFRoYXQoYWdlbnRSZXNwb25zZS5nZXRQcm9jZXNzaW5nVGltZSgpID4gODUwLCBpcyh0cnVlKSk7CisgICAgICAgIGFzc2VydFRoYXQoYWdlbnRSZXNwb25zZS5nZXRQcm9jZXNzaW5nVGltZSgpIDwgNDUwMCwgaXModHJ1ZSkpOworCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlByb2Nlc3NpbmcgVGltZTogIiArIGFnZW50UmVzcG9uc2UuZ2V0UHJvY2Vzc2luZ1RpbWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UnhPYnNlcnZhYmxlQ2xpZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIHdhcm11cAorICAgICAgICB0YXJnZXQoImFnZW50IikucGF0aCgib2JzZXJ2YWJsZSIpLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiYWdlbnQiKS5wYXRoKCJvYnNlcnZhYmxlIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICByZXNwb25zZS5idWZmZXJFbnRpdHkoKTsKKworICAgICAgICBmaW5hbCBBZ2VudFJlc3BvbnNlIGFnZW50UmVzcG9uc2UgPSByZXNwb25zZS5yZWFkRW50aXR5KEFnZW50UmVzcG9uc2UuY2xhc3MpOworCisgICAgICAgIGFzc2VydFRoYXQoYWdlbnRSZXNwb25zZS5nZXRWaXNpdGVkKCkuc2l6ZSgpLCBpcyg1KSk7CisgICAgICAgIGFzc2VydFRoYXQoYWdlbnRSZXNwb25zZS5nZXRSZWNvbW1lbmRlZCgpLnNpemUoKSwgaXMoNSkpOworCisgICAgICAgIGFzc2VydFRoYXQoYWdlbnRSZXNwb25zZS5nZXRQcm9jZXNzaW5nVGltZSgpID4gODUwLCBpcyh0cnVlKSk7CisgICAgICAgIGFzc2VydFRoYXQoYWdlbnRSZXNwb25zZS5nZXRQcm9jZXNzaW5nVGltZSgpIDwgNDUwMCwgaXModHJ1ZSkpOworCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlByb2Nlc3NpbmcgVGltZTogIiArIGFnZW50UmVzcG9uc2UuZ2V0UHJvY2Vzc2luZ1RpbWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UnhGbG93YWJsZUNsaWVudCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyB3YXJtdXAKKyAgICAgICAgdGFyZ2V0KCJhZ2VudCIpLnBhdGgoImZsb3dhYmxlIikucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJhZ2VudCIpLnBhdGgoImZsb3dhYmxlIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICByZXNwb25zZS5idWZmZXJFbnRpdHkoKTsKKworICAgICAgICBmaW5hbCBBZ2VudFJlc3BvbnNlIGFnZW50UmVzcG9uc2UgPSByZXNwb25zZS5yZWFkRW50aXR5KEFnZW50UmVzcG9uc2UuY2xhc3MpOworCisgICAgICAgIGFzc2VydFRoYXQoYWdlbnRSZXNwb25zZS5nZXRWaXNpdGVkKCkuc2l6ZSgpLCBpcyg1KSk7CisgICAgICAgIGFzc2VydFRoYXQoYWdlbnRSZXNwb25zZS5nZXRSZWNvbW1lbmRlZCgpLnNpemUoKSwgaXMoNSkpOworCisgICAgICAgIGFzc2VydFRoYXQoYWdlbnRSZXNwb25zZS5nZXRQcm9jZXNzaW5nVGltZSgpID4gODUwLCBpcyh0cnVlKSk7CisgICAgICAgIGFzc2VydFRoYXQoYWdlbnRSZXNwb25zZS5nZXRQcm9jZXNzaW5nVGltZSgpIDwgNDUwMCwgaXModHJ1ZSkpOworCisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlByb2Nlc3NpbmcgVGltZTogIiArIGFnZW50UmVzcG9uc2UuZ2V0UHJvY2Vzc2luZ1RpbWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UnhDb21wbGV0aW9uU3RhZ2VDbGllbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gd2FybXVwCisgICAgICAgIHRhcmdldCgiYWdlbnQiKS5wYXRoKCJjb21wbGV0aW9uIikucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJhZ2VudCIpLnBhdGgoImNvbXBsZXRpb24iKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIHJlc3BvbnNlLmJ1ZmZlckVudGl0eSgpOworCisgICAgICAgIGZpbmFsIEFnZW50UmVzcG9uc2UgYWdlbnRSZXNwb25zZSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoQWdlbnRSZXNwb25zZS5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChhZ2VudFJlc3BvbnNlLmdldFZpc2l0ZWQoKS5zaXplKCksIGlzKDUpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChhZ2VudFJlc3BvbnNlLmdldFJlY29tbWVuZGVkKCkuc2l6ZSgpLCBpcyg1KSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChhZ2VudFJlc3BvbnNlLmdldFByb2Nlc3NpbmdUaW1lKCkgPiA4NTAsIGlzKHRydWUpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChhZ2VudFJlc3BvbnNlLmdldFByb2Nlc3NpbmdUaW1lKCkgPCA0NTAwLCBpcyh0cnVlKSk7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUHJvY2Vzc2luZyBUaW1lOiAiICsgYWdlbnRSZXNwb25zZS5nZXRQcm9jZXNzaW5nVGltZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9zZXJ2ZXItYXN5bmMtbWFuYWdlZC9SRUFETUUuTUQgYi9leGFtcGxlcy9zZXJ2ZXItYXN5bmMtbWFuYWdlZC9SRUFETUUuTUQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM2M2Y0YwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3NlcnZlci1hc3luYy1tYW5hZ2VkL1JFQURNRS5NRApAQCAtMCwwICsxLDc0IEBACitbLy9dOiAjICIgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICIKK1svL106ICMgIiAiCitbLy9dOiAjICIgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlICIKK1svL106ICMgIiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCAiCitbLy9dOiAjICIgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLiAiCitbLy9dOiAjICIgIgorWy8vXTogIyAiIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UgIgorCitTZXJ2ZXIgQXN5bmNocm9ub3VzIE1hbmFnZWQgRXhhbXBsZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyBKQVgtUlMgMi4wIHNlcnZlci1zaWRlIG5vbi1ibG9ja2luZyBBUEkgdXNpbmcgKipNYW5hZ2VkQXN5bmMqKiBhbm5vdGF0aW9uLgorCitUaGUgZnVsbCBkZXNjcmlwdGlvbiBob3cgdG8gY3JlYXRlIGFuIGFzeW5jaHJvbm91cyByZXNvdXJjZSBjYW4gYmUgZm91bmQgaW4gSmVyc2V5IFVzZXIgR3VpZGUsIGNoYXB0ZXIgCitbQXN5bmNocm9ub3VzIFNlcnZpY2VzIGFuZCBDbGllbnRzXShodHRwczovL2plcnNleS5qYXZhLm5ldC9kb2N1bWVudGF0aW9uL2xhdGVzdC9hc3luYy5odG1sKS4KKworSW5kaWNhdGVzIHRoYXQgdGhlIHJlc291cmNlIG1ldGhvZCB0byB3aGljaCB0aGUgYW5ub3RhdGlvbiBoYXMgYmVlbiBhcHBsaWVkCisgKiBzaG91bGQgYmUgZXhlY3V0ZWQgb24gYSBzZXBhcmF0ZSB0aHJlYWQgbWFuYWdlZCBieSBhbiBpbnRlcm5hbCBKZXJzZXkKKworVGhlICBnb2FsIG9mIHRoZSBzYW1wbGUgaXMgdG8gZGVtb25zdHJhdGUgdGhhdCB3aXRoIGxpbWl0ZWQgSS9PIHByb2Nlc3NpbmcgdGhyZWFkcworb24gdGhlIHNlcnZlciB0aGUgc3luY2hyb25vdXMgZXhlY3V0aW9uIG9mIGEgbG9uZy1ydW5uaW5nIHRhc2sgbWF5IGxlYWQgdG8gcmVzb3VyY2UKK3N0YXJ2YXRpb24gY2F1c2VkIGJ5IEkvTyBwcm9jZXNzaW5nIHRocmVhZHMgYmVpbmcgYmxvY2tlZCBieSB0aGUgbG9uZy1ydW5uaW5nCitvcGVyYXRpb24sIHVuYWJsZSB0byBzZXJ2ZSBuZXcgaW5jb21pbmcgcmVxdWVzdHMuCisKK09UT0gsIHdoZW4gdGhlIHNhbWUgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbiBpcyBleGVjdXRlZCBhc3luY2hyb25vdXNseSwgdGhlIEkvTwordGhyZWFkcyBkbyBub3QgbmVlZCB0byBibG9jayB3aGlsZSB3YWl0aW5nIGZvciB0aGUgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbiB0byBmaW5pc2gKK2FuZCB0aGUgb3ZlcmFsbCB0aHJvdWdocHV0IG9mIHRoZSBzeXN0ZW0gaXMgZ3JlYXRseSBpbmNyZWFzZWQuCisKKy0gTG9vayBhdCB0aGUgYW5vdGhlciBleGFtcGxlIGhvdyB0byBjcmVhdGUgYSBub24tYmxvY2tpbmcgQVBJIHdpdGhvdXQgKipNYW5hZ2VkQXN5bmMqKgorYW5ub3RhdGlvbiA8aHR0cHM6Ly9naXRodWIuY29tL2plcnNleS9qZXJzZXkvdHJlZS9tYXN0ZXIvZXhhbXBsZXMvc2VydmVyLWFzeW5jPgord2hpY2ggYWxzbyBzaG93biB0aGUgd2F5IGhvdyB0byBwcm92aWRlIGFuIGltbWVkaWF0ZSByZXNwb25zZSBmb3IgYSBjbGllbnQKKworQ29udGVudHMKKy0tLS0tLS0tCisKK1RoZSBtYXBwaW5nIG9mIHRoZSBVUkkgcGF0aCBzcGFjZSBpcyBwcmVzZW50ZWQgaW4gdGhlIGZvbGxvd2luZyB0YWJsZToKKworVVJJIHBhdGggICAgICAgICAgICAgICAgICAgICAgICB8IFJlc291cmNlIGNsYXNzICAgICAgICAgICAgfCBIVFRQIG1ldGhvZHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgLS0tLS0tLS0tLS0tLS0KKyoqX2NoYXRfKiogICAgICAgICAgICAgICAgICAgICAgfCBDaGF0UmVzb3VyY2UgICAgICAgICAgICAgIHwgUE9TVAorKipfY2hhdF8qKiAgICAgICAgICAgICAgICAgICAgICB8IENoYXRSZXNvdXJjZSAgICAgICAgICAgICAgfCBHRVQKKyoqX21hbmFnZWRhc3luYy9sb25ncnVubmluZ18qKiAgfCBCbG9ja2luZ1Bvc3RDaGF0UmVzb3VyY2UgIHwgUE9TVAorCitTYW1wbGUgUmVzcG9uc2UKKy0tLS0tLS0tLS0tLS0tLQorCitUaGlzIHNlY3Rpb24gc2hvcnRseSBkZXNjcmliZXMgd2hhdCByZWFsbHkgaGFwcGVucyBkdXJpbmcgdGhlIGNhbGxzIGluIHRoaXMgY2hhdCBleGFtcGxlLgorCitXZSBjYW4gc3RhcnQgd2l0aCBQT1NUIHJlcXVlc3Q6CitgYGAKK2N1cmwgLXYgLVggUE9TVCBodHRwOi8vbG9jYWxob3N0OjgwODAvYmFzZS9jaGF0IC1IICJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL2pzb24iIC1kICd7CisgICAgImF1dGhvciI6ICJBbm9ueW1vdXMgQXV0aG9yIiwKKyAgICAibWVzc2FnZSI6ICJTZWNyZXQgTWVzc2FnZSIKK30nCitgYGAKKworV2UgY2FuIG5vdGljZSB0aGF0IHdlIGhhdmVuJ3QgZ290IGFueSByZXNwb25zZSB5ZXQuIFRoZSBjYWxsZWQgbWV0aG9kIGlzIGFubm90YXRlZCAqKkBNYW5hZ2VkQXN5bmMqKgord2hpY2ggbWVhbnMgdGhhdCB0aGUgSS9PIHRocmVhZCBkZWxlZ2F0ZXMgYSBtZXRob2QgcHJvY2Vzc2luZyB0byBhbm90aGVyIFRocmVhZC1Qb29sIGFuZCBpcyByZWFkeQordG8gYWNjZXB0IGFub3RoZXIgaW5jb21pbmcgcmVxdWVzdC4gQnV0IHRoZSBwcm9jZXNzaW5nIGlzIHN0aWxsIHN0b3AuIFdoeT8gKipBc3luY1Jlc3BvbnNlKiogd2FzIGFkZGVkCit0byB0aGUgYmxvY2tpbmcgcXVldWUgYW5kIG5vdyBpdCdzIHdhaXRpbmcgZm9yIEdFVCBjYWxsIHdoaWNoIHdpbGwgdGFrZSB0aGUgcmVzcG9uc2UgYW5kIHdpbGwgZmluaXNoIHRoZSBwcm9jZXNzaW5nCitvZiB0aGUgcHJlY2VkaW5nIGNhbGwuCisKK2BgYAorY3VybCAtdiAtWCBHRVQgaHR0cDovL2xvY2FsaG9zdDo4MDgwL2Jhc2UvY2hhdAorYGBgCisKK1J1bm5pbmcgdGhlIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworUnVuIHRoZSBleGFtcGxlIGFzIGZvbGxvd3M6CisKKz4gICAgIG12biBjbGVhbiBjb21waWxlIGV4ZWM6amF2YQorCitUaGlzIGRlcGxveXMgdGhlIGV4YW1wbGUgdXNpbmcgW0dyaXp6bHldKGh0dHA6Ly9ncml6emx5LmphdmEubmV0LykgY29udGFpbmVyLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc2VydmVyLWFzeW5jLW1hbmFnZWQvcG9tLnhtbCBiL2V4YW1wbGVzL3NlcnZlci1hc3luYy1tYW5hZ2VkL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA5MDViYgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3NlcnZlci1hc3luYy1tYW5hZ2VkL3BvbS54bWwKQEAgLTAsMCArMSw3NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPnNlcnZlci1hc3luYy1tYW5hZ2VkPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LWV4YW1wbGVzLXNlcnZlci1hc3luYy1tYW5hZ2VkPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPkplcnNleSBKQVgtUlMgYXN5bmNocm9ub3VzIHNlcnZlci1zaWRlIGV4YW1wbGUgd2l0aCBjdXN0b20gSmVyc2V5IGV4ZWN1dG9yIHByb3ZpZGVycy48L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1ncml6emx5Mi1odHRwPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtanNvbi1qYWNrc29uPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWhrMjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1idW5kbGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dHlwZT5wb208L3R5cGU+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmV4ZWMtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8bWFpbkNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnNlcnZlci5hc3luYy5tYW5hZ2VkLkFwcDwvbWFpbkNsYXNzPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+cmVsZWFzZTwvaWQ+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICA8L3Byb2ZpbGVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9zZXJ2ZXItYXN5bmMtbWFuYWdlZC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3NlcnZlci9hc3luYy9tYW5hZ2VkL0FwcC5qYXZhIGIvZXhhbXBsZXMvc2VydmVyLWFzeW5jLW1hbmFnZWQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9zZXJ2ZXIvYXN5bmMvbWFuYWdlZC9BcHAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTcxMDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvc2VydmVyLWFzeW5jLW1hbmFnZWQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9zZXJ2ZXIvYXN5bmMvbWFuYWdlZC9BcHAuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnNlcnZlci5hc3luYy5tYW5hZ2VkOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5Mi5odHRwc2VydmVyLkdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uLkphY2tzb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guZ3JpenpseS5odHRwLnNlcnZlci5IdHRwU2VydmVyOworCitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmUuVmVyYm9zaXR5LlBBWUxPQURfQU5ZOworCisvKioKKyAqIEplcnNleSBleGFtcGxlIGFwcGxpY2F0aW9uIGZvciBjdXN0b20gZXhlY3V0b3JzIG1hbmFnZWQgYXN5bmMgcmVzb3VyY2VzLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBBcHAgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIEJBU0VfVVJJID0gVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2Jhc2UvIik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNZTkNfTE9OR19SVU5OSU5HX01BTkFHRURfT1BfUEFUSCA9ICJtYW5hZ2VkYXN5bmMvbG9uZ3J1bm5pbmciOworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcIkN1c3RvbSBFeGVjdXRvciBNYW5hZ2VkIEFzeW5jIFJlc291cmNlc1wiIEplcnNleSBFeGFtcGxlIEFwcCIpOworCisgICAgICAgICAgICBmaW5hbCBIdHRwU2VydmVyIHNlcnZlciA9IEdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeS5jcmVhdGVIdHRwU2VydmVyKEJBU0VfVVJJLCBjcmVhdGUoKSwgZmFsc2UpOworICAgICAgICAgICAgUnVudGltZS5nZXRSdW50aW1lKCkuYWRkU2h1dGRvd25Ib29rKG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyLnNodXRkb3duTm93KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkpOworICAgICAgICAgICAgc2VydmVyLnN0YXJ0KCk7CisKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihTdHJpbmcuZm9ybWF0KCJBcHBsaWNhdGlvbiBzdGFydGVkLlxuIgorICAgICAgICAgICAgICAgICAgICArICJUbyB0ZXN0IGxvbmctcnVubmluZyBhc3luY2hyb25vdXMgb3BlcmF0aW9uIHJlc291cmNlLCB0cnkgJXMlc1xuIgorICAgICAgICAgICAgICAgICAgICArICJUbyB0ZXN0IGFzeW5jIGNoYXQgcmVzb3VyY2UsIHRyeSAlcyVzXG4iCisgICAgICAgICAgICAgICAgICAgICsgIlN0b3AgdGhlIGFwcGxpY2F0aW9uIHVzaW5nIENUUkwrQyIsIEJBU0VfVVJJLCBBU1lOQ19MT05HX1JVTk5JTkdfTUFOQUdFRF9PUF9QQVRILCBCQVNFX1VSSSwgImNoYXQiKSk7CisKKyAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuam9pbigpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiB8IEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKEFwcC5jbGFzcy5nZXROYW1lKCkpLmxvZyhMZXZlbC5TRVZFUkUsIG51bGwsIGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VDb25maWcgY3JlYXRlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKCkKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXJDbGFzc2VzKEphY2tzb25GZWF0dXJlLmNsYXNzLCBDaGF0UmVzb3VyY2UuY2xhc3MsIFNpbXBsZUplcnNleUV4ZWN1dG9yTWFuYWdlZExvbmdSdW5uaW5nUmVzb3VyY2UuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVySW5zdGFuY2VzKG5ldyBMb2dnaW5nRmVhdHVyZShMb2dnZXIuZ2V0TG9nZ2VyKEFwcC5jbGFzcy5nZXROYW1lKCkpLCBQQVlMT0FEX0FOWSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3NlcnZlci1hc3luYy1tYW5hZ2VkL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvc2VydmVyL2FzeW5jL21hbmFnZWQvQ2hhdFJlc291cmNlLmphdmEgYi9leGFtcGxlcy9zZXJ2ZXItYXN5bmMtbWFuYWdlZC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3NlcnZlci9hc3luYy9tYW5hZ2VkL0NoYXRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjODZhZDcKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zZXJ2ZXItYXN5bmMtbWFuYWdlZC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3NlcnZlci9hc3luYy9tYW5hZ2VkL0NoYXRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuc2VydmVyLmFzeW5jLm1hbmFnZWQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5BcnJheUJsb2NraW5nUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQmxvY2tpbmdRdWV1ZTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkFzeW5jUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlN1c3BlbmRlZDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5NYW5hZ2VkQXN5bmM7CisKKy8qKgorICogRXhhbXBsZSBvZiBhIHNpbXBsZSBmaXJlJmZvcmdldCBwb2ludC10by1wb2ludCBtZXNzYWdpbmcgcmVzb3VyY2UuCisgKgorICogVGhpcyB2ZXJzaW9uIG9mIHRoZSBtZXNzYWdpbmcgcmVzb3VyY2UgZG9lcyBub3QgYmxvY2sgd2hlbiBQT1NUaW5nIGEgbmV3IG1lc3NhZ2UuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoImNoYXQiKQorQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9qc29uIikKK3B1YmxpYyBjbGFzcyBDaGF0UmVzb3VyY2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQmxvY2tpbmdRdWV1ZTxBc3luY1Jlc3BvbnNlPiBzdXNwZW5kZWQgPSBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPEFzeW5jUmVzcG9uc2U+KDUpOworCisgICAgQEdFVAorICAgIEBNYW5hZ2VkQXN5bmMKKyAgICBwdWJsaWMgdm9pZCBnZXRNZXNzYWdlKEBTdXNwZW5kZWQgZmluYWwgQXN5bmNSZXNwb25zZSBhcikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgc3VzcGVuZGVkLnB1dChhcik7CisgICAgfQorCisgICAgQFBPU1QKKyAgICBATWFuYWdlZEFzeW5jCisgICAgcHVibGljIFN0cmluZyBwb3N0TWVzc2FnZShmaW5hbCBNZXNzYWdlIG1lc3NhZ2UpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEFzeW5jUmVzcG9uc2UgYXN5bmNSZXNwb25zZSA9IHN1c3BlbmRlZC50YWtlKCk7CisgICAgICAgIGFzeW5jUmVzcG9uc2UucmVzdW1lKG1lc3NhZ2UpOworICAgICAgICByZXR1cm4gIlNlbnQhIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9zZXJ2ZXItYXN5bmMtbWFuYWdlZC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3NlcnZlci9hc3luYy9tYW5hZ2VkL01lc3NhZ2UuamF2YSBiL2V4YW1wbGVzL3NlcnZlci1hc3luYy1tYW5hZ2VkL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvc2VydmVyL2FzeW5jL21hbmFnZWQvTWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNTI2ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zZXJ2ZXItYXN5bmMtbWFuYWdlZC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3NlcnZlci9hc3luYy9tYW5hZ2VkL01lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnNlcnZlci5hc3luYy5tYW5hZ2VkOworCitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworLyoqCisgKiBDaGF0IG1lc3NhZ2UgSkFYQiBQT0pPLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK0BYbWxSb290RWxlbWVudAorcHVibGljIGNsYXNzIE1lc3NhZ2UgeworCisgICAgcHVibGljIFN0cmluZyBhdXRob3IgPSAiIjsKKyAgICBwdWJsaWMgU3RyaW5nIG1lc3NhZ2UgPSAiIjsKKyAgICBwdWJsaWMgbG9uZyB0aW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CisKKyAgICBwdWJsaWMgTWVzc2FnZShTdHJpbmcgYXV0aG9yLCBTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICB0aGlzLmF1dGhvciA9IGF1dGhvcjsKKyAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVzc2FnZSgpIHsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIk1lc3NhZ2V7IiArICJhdXRob3I9IiArIGF1dGhvciArICIsIG1lc3NhZ2U9IiArIG1lc3NhZ2UgKyAiLCB0aW1lPSIgKyB0aW1lICsgJ30nOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgTWVzc2FnZSBvdGhlciA9IChNZXNzYWdlKSBvYmo7CisgICAgICAgIGlmICgodGhpcy5hdXRob3IgPT0gbnVsbCkgPyAob3RoZXIuYXV0aG9yICE9IG51bGwpIDogIXRoaXMuYXV0aG9yLmVxdWFscyhvdGhlci5hdXRob3IpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh0aGlzLm1lc3NhZ2UgPT0gbnVsbCkgPyAob3RoZXIubWVzc2FnZSAhPSBudWxsKSA6ICF0aGlzLm1lc3NhZ2UuZXF1YWxzKG90aGVyLm1lc3NhZ2UpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGhhc2ggPSA1OworICAgICAgICBoYXNoID0gNDcgKiBoYXNoICsgKHRoaXMuYXV0aG9yICE9IG51bGwgPyB0aGlzLmF1dGhvci5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIGhhc2ggPSA0NyAqIGhhc2ggKyAodGhpcy5tZXNzYWdlICE9IG51bGwgPyB0aGlzLm1lc3NhZ2UuaGFzaENvZGUoKSA6IDApOworICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9zZXJ2ZXItYXN5bmMtbWFuYWdlZC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3NlcnZlci9hc3luYy9tYW5hZ2VkL1NpbXBsZUplcnNleUV4ZWN1dG9yTWFuYWdlZExvbmdSdW5uaW5nUmVzb3VyY2UuamF2YSBiL2V4YW1wbGVzL3NlcnZlci1hc3luYy1tYW5hZ2VkL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvc2VydmVyL2FzeW5jL21hbmFnZWQvU2ltcGxlSmVyc2V5RXhlY3V0b3JNYW5hZ2VkTG9uZ1J1bm5pbmdSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZjI4NTEKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zZXJ2ZXItYXN5bmMtbWFuYWdlZC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3NlcnZlci9hc3luYy9tYW5hZ2VkL1NpbXBsZUplcnNleUV4ZWN1dG9yTWFuYWdlZExvbmdSdW5uaW5nUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnNlcnZlci5hc3luYy5tYW5hZ2VkOworCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQXN5bmNSZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuU3VzcGVuZGVkOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLk1hbmFnZWRBc3luYzsKKworLyoqCisgKiBFeGFtcGxlIG9mIGEgc2ltcGxlIHJlc291cmNlIHdpdGggYSBsb25nLXJ1bm5pbmcgb3BlcmF0aW9uIGV4ZWN1dGVkIGluIGEKKyAqIGN1c3RvbSBKZXJzZXkgY29udGFpbmVyIHJlcXVlc3QgcHJvY2Vzc2luZyB0aHJlYWQuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoQXBwLkFTWU5DX0xPTkdfUlVOTklOR19NQU5BR0VEX09QX1BBVEgpCitAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorcHVibGljIGNsYXNzIFNpbXBsZUplcnNleUV4ZWN1dG9yTWFuYWdlZExvbmdSdW5uaW5nUmVzb3VyY2UgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTk9USUZJQ0FUSU9OX1JFU1BPTlNFID0gIkhlbGxvIGFzeW5jIHdvcmxkISI7CisgICAgLy8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihTaW1wbGVKZXJzZXlFeGVjdXRvck1hbmFnZWRMb25nUnVubmluZ1Jlc291cmNlLmNsYXNzLmdldE5hbWUoKSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNMRUVQX1RJTUVfSU5fTUlMTElTID0gMTAwMDsKKworICAgIEBHRVQKKyAgICBATWFuYWdlZEFzeW5jCisgICAgcHVibGljIHZvaWQgbG9uZ0dldChAU3VzcGVuZGVkIGZpbmFsIEFzeW5jUmVzcG9uc2UgYXIsIEBRdWVyeVBhcmFtKCJpZCIpIGludCByZXF1ZXN0SWQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTTEVFUF9USU1FX0lOX01JTExJUyk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLlNFVkVSRSwgIlJlc3BvbnNlIHByb2Nlc3NpbmcgaW50ZXJydXB0ZWQiLCBleCk7CisgICAgICAgIH0KKyAgICAgICAgYXIucmVzdW1lKHJlcXVlc3RJZCArICIgLSAiICsgTk9USUZJQ0FUSU9OX1JFU1BPTlNFKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9zZXJ2ZXItYXN5bmMtbWFuYWdlZC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3NlcnZlci9hc3luYy9tYW5hZ2VkL01hbmFnZWRBc3luY1Jlc291cmNlVGVzdC5qYXZhIGIvZXhhbXBsZXMvc2VydmVyLWFzeW5jLW1hbmFnZWQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9zZXJ2ZXIvYXN5bmMvbWFuYWdlZC9NYW5hZ2VkQXN5bmNSZXNvdXJjZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWI2MjM0Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvc2VydmVyLWFzeW5jLW1hbmFnZWQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9zZXJ2ZXIvYXN5bmMvbWFuYWdlZC9NYW5hZ2VkQXN5bmNSZXNvdXJjZVRlc3QuamF2YQpAQCAtMCwwICsxLDMxNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5zZXJ2ZXIuYXN5bmMubWFuYWdlZDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmEuVGhyZWFkRmFjdG9yeUJ1aWxkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamFja3Nvbi5KYWNrc29uRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLkplcnNleVByb2Nlc3NpbmdVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiBUZXN0IGZvciB0aGUgYXN5bmNocm9ub3VzIG1hbmFnZWQgcmVzb3VyY2VzIGV4YW1wbGUuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIE1hbmFnZWRBc3luY1Jlc291cmNlVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoTWFuYWdlZEFzeW5jUmVzb3VyY2VUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICAvLyBtdm4gdGVzdCAtRGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIuZmFjdG9yeT1vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmlubWVtb3J5LkluTWVtb3J5VGVzdENvbnRhaW5lckZhY3RvcnkKKyAgICAgICAgLy8gbXZuIHRlc3QgLURqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk9b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5ncml6emx5LkdyaXp6bHlUZXN0Q29udGFpbmVyRmFjdG9yeQorICAgICAgICAvLyBtdm4gdGVzdCAtRGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIuZmFjdG9yeT1vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkKKworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworICAgICAgICByZXR1cm4gQXBwLmNyZWF0ZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihuZXcgSmFja3NvbkZlYXR1cmUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9uZ1J1bm5pbmdSZXNvdXJjZSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCByZXNvdXJjZVRhcmdldCA9IHRhcmdldCgpLnBhdGgoQXBwLkFTWU5DX0xPTkdfUlVOTklOR19NQU5BR0VEX09QX1BBVEgpOworICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWRSZXNwb25zZSA9IFNpbXBsZUplcnNleUV4ZWN1dG9yTWFuYWdlZExvbmdSdW5uaW5nUmVzb3VyY2UuTk9USUZJQ0FUSU9OX1JFU1BPTlNFOworCisgICAgICAgIGZpbmFsIGludCBNQVhfTUVTU0FHRVMgPSAxMDA7CisgICAgICAgIGZpbmFsIGludCBMQVRDSF9XQUlUX1RJTUVPVVQgPSAxMCAqIGdldEFzeW5jVGltZW91dE11bHRpcGxpZXIoKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBkZWJ1Z01vZGUgPSBmYWxzZTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBzZXF1ZW50aWFsR2V0ID0gZmFsc2U7CisgICAgICAgIGZpbmFsIE9iamVjdCBzZXF1ZW50aWFsR2V0TG9jayA9IG5ldyBPYmplY3QoKTsKKworICAgICAgICBmaW5hbCBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3IgPSBFeGVjdXRvcnMubmV3Q2FjaGVkVGhyZWFkUG9vbChuZXcgVGhyZWFkRmFjdG9yeUJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXROYW1lRm9ybWF0KCJhc3luYy1yZXNvdXJjZS10ZXN0LSVkIikKKyAgICAgICAgICAgICAgICAuc2V0VW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyKG5ldyBKZXJzZXlQcm9jZXNzaW5nVW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyKCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGZpbmFsIE1hcDxJbnRlZ2VyLCBTdHJpbmc+IGdldFJlc3BvbnNlcyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+KCk7CisKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggZ2V0UmVxdWVzdExhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKE1BWF9NRVNTQUdFUyk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX01FU1NBR0VTOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcmVxdWVzdElkID0gaTsKKyAgICAgICAgICAgICAgICBleGVjdXRvci5zdWJtaXQobmV3IFJ1bm5hYmxlKCkgeworCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVidWdNb2RlIHx8IHNlcXVlbnRpYWxHZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNlcXVlbnRpYWxHZXRMb2NrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwcml2YXRlIHZvaWQgZ2V0KCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXR0ZW1wdENvdW50ZXIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGVtcHRDb3VudGVyKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVzcG9uc2UgPSByZXNvdXJjZVRhcmdldC5xdWVyeVBhcmFtKCJpZCIsIHJlcXVlc3RJZCkucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlc3BvbnNlcy5wdXQocmVxdWVzdElkLCByZXNwb25zZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuU0VWRVJFLCBTdHJpbmcuZm9ybWF0KCJFcnJvciBzZW5kaW5nIEdFVCByZXF1ZXN0IDwlcz4gZm9yICVkLiB0aW1lLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCwgYXR0ZW1wdENvdW50ZXIpLCB0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0ZW1wdENvdW50ZXIgPiAzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGlnbm9yZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJFcnJvciBzZW5kaW5nIEdFVCBtZXNzYWdlIDwlcz46IEludGVycnVwdGVkIiwgcmVxdWVzdElkKSwgaWdub3JlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlcXVlc3RMYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZGVidWdNb2RlKSB7CisgICAgICAgICAgICAgICAgZ2V0UmVxdWVzdExhdGNoLmF3YWl0KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICghZ2V0UmVxdWVzdExhdGNoLmF3YWl0KExBVENIX1dBSVRfVElNRU9VVCwgVGltZVVuaXQuU0VDT05EUykpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5TRVZFUkUsICJXYWl0aW5nIGZvciBhbGwgR0VUIHJlcXVlc3RzIHRvIGNvbXBsZXRlIGhhcyB0aW1lZCBvdXQuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZXhlY3V0b3Iuc2h1dGRvd25Ob3coKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZ0J1aWxkZXIgbWVzc2FnZUJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigiR0VUIHJlc3BvbnNlcyByZWNlaXZlZDogIikuYXBwZW5kKGdldFJlc3BvbnNlcy5zaXplKCkpLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgZm9yIChNYXAuRW50cnk8SW50ZWdlciwgU3RyaW5nPiBnZXRSZXNwb25zZUVudHJ5IDogZ2V0UmVzcG9uc2VzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIG1lc3NhZ2VCdWlsZGVyLmFwcGVuZCgiR0VUIHJlc3BvbnNlIGZvciBtZXNzYWdlICIpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoZ2V0UmVzcG9uc2VFbnRyeS5nZXRLZXkoKSkuYXBwZW5kKCI6ICIpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoZ2V0UmVzcG9uc2VFbnRyeS5nZXRWYWx1ZSgpKS5hcHBlbmQoJ1xuJyk7CisgICAgICAgIH0KKyAgICAgICAgTE9HR0VSLmluZm8obWVzc2FnZUJ1aWxkZXIudG9TdHJpbmcoKSk7CisKKyAgICAgICAgZm9yIChNYXAuRW50cnk8SW50ZWdlciwgU3RyaW5nPiBlbnRyeSA6IGdldFJlc3BvbnNlcy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKAorICAgICAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBHRVQgbm90aWZpY2F0aW9uIHJlc3BvbnNlIGZvciBtZXNzYWdlICIgKyBlbnRyeS5nZXRLZXkoKSwKKyAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0VmFsdWUoKS5jb250YWlucyhleHBlY3RlZFJlc3BvbnNlKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9NRVNTQUdFUywgZ2V0UmVzcG9uc2VzLnNpemUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hhdFJlc291cmNlKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHJlc291cmNlVGFyZ2V0ID0gdGFyZ2V0KCkucGF0aCgiY2hhdCIpOworICAgICAgICBmaW5hbCBpbnQgTUFYX01FU1NBR0VTID0gMTAwOworICAgICAgICBmaW5hbCBpbnQgTEFUQ0hfV0FJVF9USU1FT1VUID0gMTAgKiBnZXRBc3luY1RpbWVvdXRNdWx0aXBsaWVyKCk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gZGVidWdNb2RlID0gZmFsc2U7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gc2VxdWVudGlhbEdldCA9IGZhbHNlOworICAgICAgICBmaW5hbCBib29sZWFuIHNlcXVlbnRpYWxQb3N0ID0gZmFsc2U7CisgICAgICAgIGZpbmFsIE9iamVjdCBzZXF1ZW50aWFsR2V0TG9jayA9IG5ldyBPYmplY3QoKTsKKyAgICAgICAgZmluYWwgT2JqZWN0IHNlcXVlbnRpYWxQb3N0TG9jayA9IG5ldyBPYmplY3QoKTsKKworICAgICAgICBmaW5hbCBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3IgPSBFeGVjdXRvcnMubmV3Q2FjaGVkVGhyZWFkUG9vbChuZXcgVGhyZWFkRmFjdG9yeUJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXROYW1lRm9ybWF0KCJhc3luYy1yZXNvdXJjZS10ZXN0LSVkIikKKyAgICAgICAgICAgICAgICAuc2V0VW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyKG5ldyBKZXJzZXlQcm9jZXNzaW5nVW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyKCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGZpbmFsIE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBwb3N0UmVzcG9uc2VzID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPEludGVnZXIsIEludGVnZXI+KCk7CisgICAgICAgIGZpbmFsIE1hcDxJbnRlZ2VyLCBNZXNzYWdlPiBnZXRSZXNwb25zZXMgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8SW50ZWdlciwgTWVzc2FnZT4oKTsKKworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBwb3N0UmVxdWVzdExhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKE1BWF9NRVNTQUdFUyk7CisgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGdldFJlcXVlc3RMYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaChNQVhfTUVTU0FHRVMpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9NRVNTQUdFUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHJlcXVlc3RJZCA9IGk7CisgICAgICAgICAgICAgICAgZXhlY3V0b3Iuc3VibWl0KG5ldyBSdW5uYWJsZSgpIHsKKworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnTW9kZSB8fCBzZXF1ZW50aWFsUG9zdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoc2VxdWVudGlhbFBvc3RMb2NrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgdm9pZCBwb3N0KCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXR0ZW1wdENvdW50ZXIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGVtcHRDb3VudGVyKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHJlc291cmNlVGFyZ2V0LnJlcXVlc3QoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuanNvbihuZXcgTWVzc2FnZSgiIiArIHJlcXVlc3RJZCwgIiIgKyByZXF1ZXN0SWQpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0UmVzcG9uc2VzLnB1dChyZXF1ZXN0SWQsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5XQVJOSU5HLCBTdHJpbmcuZm9ybWF0KCJFcnJvciBQT1NUSU5HIG1lc3NhZ2UgPCVzPiBmb3IgJWQuIHRpbWUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLCBhdHRlbXB0Q291bnRlciksIHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRlbXB0Q291bnRlciA+IDMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWdub3JlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIkVycm9yIFBPU1RJTkcgbWVzc2FnZSA8JXM+OiBJbnRlcnJ1cHRlZCIsIHJlcXVlc3RJZCksIGlnbm9yZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0UmVxdWVzdExhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgZXhlY3V0b3Iuc3VibWl0KG5ldyBSdW5uYWJsZSgpIHsKKworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnTW9kZSB8fCBzZXF1ZW50aWFsR2V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChzZXF1ZW50aWFsR2V0TG9jaykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIGdldCgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF0dGVtcHRDb3VudGVyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRlbXB0Q291bnRlcisrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVzc2FnZSByZXNwb25zZSA9IHJlc291cmNlVGFyZ2V0LnJlcXVlc3QoImFwcGxpY2F0aW9uL2pzb24iKS5nZXQoTWVzc2FnZS5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRSZXNwb25zZXMucHV0KHJlcXVlc3RJZCwgcmVzcG9uc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLlNFVkVSRSwgU3RyaW5nLmZvcm1hdCgiRXJyb3Igc2VuZGluZyBHRVQgcmVxdWVzdCA8JXM+IGZvciAlZC4gdGltZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsIGF0dGVtcHRDb3VudGVyKSwgdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF0dGVtcHRDb3VudGVyID4gMykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZ25vcmVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiRXJyb3Igc2VuZGluZyBHRVQgbWVzc2FnZSA8JXM+OiBJbnRlcnJ1cHRlZCIsIHJlcXVlc3RJZCksIGlnbm9yZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRSZXF1ZXN0TGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGRlYnVnTW9kZSkgeworICAgICAgICAgICAgICAgIHBvc3RSZXF1ZXN0TGF0Y2guYXdhaXQoKTsKKyAgICAgICAgICAgICAgICBnZXRSZXF1ZXN0TGF0Y2guYXdhaXQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCFwb3N0UmVxdWVzdExhdGNoLmF3YWl0KExBVENIX1dBSVRfVElNRU9VVCwgVGltZVVuaXQuU0VDT05EUykpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5TRVZFUkUsICJXYWl0aW5nIGZvciBhbGwgUE9TVCByZXF1ZXN0cyB0byBjb21wbGV0ZSBoYXMgdGltZWQgb3V0LiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIWdldFJlcXVlc3RMYXRjaC5hd2FpdChMQVRDSF9XQUlUX1RJTUVPVVQsIFRpbWVVbml0LlNFQ09ORFMpKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuU0VWRVJFLCAiV2FpdGluZyBmb3IgYWxsIEdFVCByZXF1ZXN0cyB0byBjb21wbGV0ZSBoYXMgdGltZWQgb3V0LiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGV4ZWN1dG9yLnNodXRkb3duTm93KCk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmdCdWlsZGVyIG1lc3NhZ2VCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoIlBPU1QgcmVzcG9uc2VzIHJlY2VpdmVkOiAiKS5hcHBlbmQocG9zdFJlc3BvbnNlcy5zaXplKCkpLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgZm9yIChNYXAuRW50cnk8SW50ZWdlciwgSW50ZWdlcj4gcG9zdFJlc3BvbnNlRW50cnkgOiBwb3N0UmVzcG9uc2VzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIG1lc3NhZ2VCdWlsZGVyLmFwcGVuZCgiUE9TVCByZXNwb25zZSBmb3IgbWVzc2FnZSAiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHBvc3RSZXNwb25zZUVudHJ5LmdldEtleSgpKS5hcHBlbmQoIjogIikKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChwb3N0UmVzcG9uc2VFbnRyeS5nZXRWYWx1ZSgpKS5hcHBlbmQoJ1xuJyk7CisgICAgICAgIH0KKyAgICAgICAgbWVzc2FnZUJ1aWxkZXIuYXBwZW5kKCdcbicpOworICAgICAgICBtZXNzYWdlQnVpbGRlci5hcHBlbmQoIkdFVCByZXNwb25zZXMgcmVjZWl2ZWQ6ICIpLmFwcGVuZChnZXRSZXNwb25zZXMuc2l6ZSgpKS5hcHBlbmQoIlxuIik7CisgICAgICAgIGZvciAoTWFwLkVudHJ5PEludGVnZXIsIE1lc3NhZ2U+IGdldFJlc3BvbnNlRW50cnkgOiBnZXRSZXNwb25zZXMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgbWVzc2FnZUJ1aWxkZXIuYXBwZW5kKCJHRVQgcmVzcG9uc2UgZm9yIG1lc3NhZ2UgIikKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChnZXRSZXNwb25zZUVudHJ5LmdldEtleSgpKS5hcHBlbmQoIjogIikKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChnZXRSZXNwb25zZUVudHJ5LmdldFZhbHVlKCkpLmFwcGVuZCgnXG4nKTsKKyAgICAgICAgfQorICAgICAgICBMT0dHRVIuaW5mbyhtZXNzYWdlQnVpbGRlci50b1N0cmluZygpKTsKKworICAgICAgICBmb3IgKE1hcC5FbnRyeTxJbnRlZ2VyLCBJbnRlZ2VyPiBwb3N0UmVzcG9uc2VFbnRyeSA6IHBvc3RSZXNwb25zZXMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBQT1NUIG5vdGlmaWNhdGlvbiByZXNwb25zZSBmb3IgbWVzc2FnZSAiICsgcG9zdFJlc3BvbnNlRW50cnkuZ2V0S2V5KCksCisgICAgICAgICAgICAgICAgICAgIDIwMCwgcG9zdFJlc3BvbnNlRW50cnkuZ2V0VmFsdWUoKS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIExpc3Q8SW50ZWdlcj4gbG9zdCA9IG5ldyBMaW5rZWRMaXN0PEludGVnZXI+KCk7CisgICAgICAgIGZpbmFsIENvbGxlY3Rpb248TWVzc2FnZT4gZ2V0UmVzcG9uc2VWYWx1ZXMgPSBnZXRSZXNwb25zZXMudmFsdWVzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX01FU1NBR0VTOyBpKyspIHsKKyAgICAgICAgICAgIGlmICghZ2V0UmVzcG9uc2VWYWx1ZXMuY29udGFpbnMobmV3IE1lc3NhZ2UoIiIgKyBpLCAiIiArIGkpKSkgeworICAgICAgICAgICAgICAgIGxvc3QuYWRkKGkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghbG9zdC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGZhaWwoIkRldGVjdGVkIGEgcG9zdGVkIG1lc3NhZ2UgbG9zcyhlcyk6ICIgKyBsb3N0LnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfTUVTU0FHRVMsIHBvc3RSZXNwb25zZXMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9NRVNTQUdFUywgZ2V0UmVzcG9uc2VzLnNpemUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc2VydmVyLWFzeW5jLXN0YW5kYWxvbmUvUkVBRE1FLk1EIGIvZXhhbXBsZXMvc2VydmVyLWFzeW5jLXN0YW5kYWxvbmUvUkVBRE1FLk1ECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YWRkMGIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zZXJ2ZXItYXN5bmMtc3RhbmRhbG9uZS9SRUFETUUuTUQKQEAgLTAsMCArMSwxMDQgQEAKK1svL106ICMgIiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIgorWy8vXTogIyAiICIKK1svL106ICMgIiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgIgorWy8vXTogIyAiIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0ICIKK1svL106ICMgIiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuICIKK1svL106ICMgIiAiCitbLy9dOiAjICIgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZSAiCisKK1NlcnZlciBBc3luY2hyb25vdXMgU3RhbmRhbG9uZSBFeGFtcGxlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIEpBWC1SUyAyLjAgYXN5bmNocm9ub3VzIEFQSSwgYm90aCBvbiB0aGUgY2xpZW50IGFuZAorc2VydmVyIHNpZGUuCisKK1RoZSAgZ29hbCBvZiB0aGUgc2FtcGxlIGlzIHRvIGRlbW9uc3RyYXRlIHRoYXQgd2l0aCBsaW1pdGVkIEkvTyBwcm9jZXNzaW5nIHRocmVhZHMKK29uIHRoZSBzZXJ2ZXIgdGhlIHN5bmNocm9ub3VzIGV4ZWN1dGlvbiBvZiBhIGxvbmctcnVubmluZyB0YXNrIG1heSBsZWFkIHRvIHJlc291cmNlCitzdGFydmF0aW9uIGNhdXNlZCBieSBJL08gcHJvY2Vzc2luZyB0aHJlYWRzIGJlaW5nIGJsb2NrZWQgYnkgdGhlIGxvbmctcnVubmluZworb3BlcmF0aW9uLCB1bmFibGUgdG8gc2VydmUgbmV3IGluY29taW5nIHJlcXVlc3RzLgorCitPVE9ILCB3aGVuIHRoZSBzYW1lIGxvbmctcnVubmluZyBvcGVyYXRpb24gaXMgZXhlY3V0ZWQgYXN5bmNocm9ub3VzbHksIHRoZSBJL08KK3RocmVhZHMgZG8gbm90IG5lZWQgdG8gYmxvY2sgd2hpbGUgd2FpdGluZyBmb3IgdGhlIGxvbmctcnVubmluZyBvcGVyYXRpb24gdG8gZmluaXNoCithbmQgdGhlIG92ZXJhbGwgdGhyb3VnaHB1dCBvZiB0aGUgc3lzdGVtIGlzIGdyZWF0bHkgaW5jcmVhc2VkLgorCitUaGUgZXhhbXBsZSBjb25zaXN0cyBvZiAyIG1vZHVsZXM6CisKKyAgMS4gd2ViIGFwcGxpY2F0aW9uIG1vZHVsZSAid2ViYXBwIiAocHJvZHVjZXMgc2VydmVyLWFzeW5jLXN0YW5kYWxvbmUtd2ViYXBwLndhcikKKworICAgICAtIHRoZSBtb2R1bGUgY29udGFpbnMgYW4gbG9uZy1ydW5uaW5nIGVjaG8gc2VydmljZSBkZXBsb3llZCB1bmRlciBhcHBsaWNhdGlvbiBjb250ZXh0IHJvb3Qgb24gcGF0aCB0ZW1wbGF0ZXM6CisKKyAgICAgICAtICJsb25nLXJ1bm5pbmcvc3luYy97ZWNob30iLCBzZXJ2ZWQgYnkgYSBzeW5jaHJvbm91c2x5IGV4ZWN1dGVkLCBibG9ja2luZ21ldGhvZC4KKworICAgICAgIC0gImxvbmctcnVubmluZy9hc3luYy97ZWNob30iLCBzZXJ2ZWQgYnkgYW4gYXN5bmNocm9ub3VzbHkgZXhlY3V0ZWQsIG5vbi1ibG9ja2luZyBtZXRob2QuCisKKyAgMi4gY2xpZW50IG1vZHVsZSAiY2xpZW50IiAocHJvZHVjZXMgY2xpZW50LmphcikKKworICAgICAtIHRoZSBtb2R1bGUgY29udGFpbnMgdGhlIHdlYiBhcHBsaWNhdGlvbiBjbGllbnQgZGV2ZWxvcGVkIHVzaW5nIEpBWC1SUyAyLjAKKyAgICAgICBjbGllbnQgQVBJICYgbGV2ZXJhZ2luZyB0aGUgYXN5bmNocm9ub3VzIGNsaWVudCBleGVjdXRpb24gZm9yIHNwYXduaW5nCisgICAgICAgbXVsdGlwbGUgc2ltdWx0YW5lb3VzIGNsaWVudCByZXF1ZXN0cyB3aXRoIHN1YnNlcXVlbnQgYXN5bmNocm9ub3VzIHJlc3BvbnNlCisgICAgICAgcHJvY2Vzc2luZy4KKworVG8gYnVpbGQgdGhlIGV4YW1wbGUsIGNoYW5nZSB0byB0aGUgZXhhbXBsZSByb290IGRpcmVjdG9yeSBhbmQgaW52b2tlIG1hdmVuIGJ1aWxkOgorCis+ICAgbXZuIGNsZWFuIHBhY2thZ2UKKworVGhpcyBjb21tYW5kIGJ1aWxkcyB0aGUgd2ViIGFwcGxpY2F0aW9uIFdBUiBhcyB3ZWxsIGFzIGNsaWVudCBKQVIgYXJ0aWZhY3RzLiBPbmNlCitidWlsdCwgdGhlIHdlYiBhcHBsaWNhdGlvbiBtYXkgYmUgZGVwbG95ZWQgdG8gdGhlIGFwcGxpY2F0aW9uIHNlcnZlci4gRS5nLiB0byBkZXBsb3kKK3RoZSBhcHBsaWNhdGlvbiB0byBhIHJ1bm5pbmcgR2xhc3NGaXNoIGluc3RhbmNlLCB5b3UgbWF5IGRvICh3aGlsZSBzdGlsbCBiZWluZyBpbgordGhlIHJvb3QgZXhhbXBsZSBkaXJlY3RvcnkpOgorCis+ICAgJEFTX0hPTUUvYmluL2FzLWFkbWluIGRlcGxveSAuL3dlYmFwcC90YXJnZXQvc2VydmVyLWFzeW5jLXN0YW5kYWxvbmUtd2ViYXBwLndhcgorCitPbmNlIGRlcGxveWVkLCB0aGUgY2xpZW50IGNhbiBiZSBydW4gYXMgZm9sbG93czoKKworPiAgIGNkIGNsaWVudAorPiAgIG12biBleGVjOmphdmEKKworVGhpcyB3aWxsIHN0YXJ0IHRoZSBtYWluIGNsaWVudCBHVUkgd2luZG93LiBJbiB0aGUgdG9wIHBhbmVsLCB0aGUgR1VJIGxldHMgeW91IHRvIGN1c3RvbWl6ZQorZmV3IHZhcmlhYmxlcyBzdWNoIGFzIG51bWJlciBvZiByZXF1ZXN0cyB0byBiZSBzZW50LCBiYXNlIHdlYiBhcHBsaWNhdGlvbiBVUkwgb3Igc3luYy9hc3luYworZW5kcG9pbnQgdG8gYmUgaW52b2tlZC4gT25jZSB0aGUgY2xpZW50IGlzIHNldCB1cCwgdGhlICJSdW4iIGJ1dHRvbiBydW5zIHRoZSByZXF1ZXN0cy4gRWFjaAorcmVxdWVzdCBpcyByZXByZXNlbnRlZCBhcyBhIGNvbG9yZWQgYm94IGluIHRoZSBsb3dlciB3aW5kb3cgcGFuZWwuIFRoZSBjb2xvciBpbmRpY2F0ZXMgdGhlCityZXF1ZXN0IHN0YXR1czoKKworKiB5ZWxsb3cgLSBydW5uaW5nCisqIGdyZWVuICAtIHN1Y2Nlc3NmdWxseSBjb21wbGV0ZWQKKyogcmVkICAgIC0gcmVxdWVzdCBleGVjdXRpb24gZmFpbGVkIHdpdGggYW4gZXJyb3IKKworQWxzbywgdGhlIHRvb2x0aXAgb2YgZWFjaCBib3ggcHJvdmlkZXMgYWRkaXRpb25hbCBzdGF0dXMgaW5mb3JtYXRpb24uIEFmdGVyIHRoZSBleGVjdXRpb24gaXMKK2ZpbmlzaGVkLCBzaG9ydCBzdGF0aXN0aWNzIGFib3V0IHRoZSBydW4gYXJlIGRpc3BsYXllZCBpbiB0aGUgbWlkZGxlIHdpbmRvdyBwYW5lbC4KKworRXhlY3V0aW5nIGNvbW1hbmQtbGluZSBjbGllbnQ6CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK09wdGlvbmFsbHksIGEgY29tbWFuZCBsaW5lIE1haW4uamF2YSBjbGllbnQgY2FuIGJlIGV4ZWN1dGVkIChieSBjaGFuZ2luZyB0aGUgbWFpbkNsYXNzIG9mCitleGVjLW1hdmVuLXBsdWdpbiBpbiBwb20ueG1sIHRvIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnNlcnZlci5hc3luYy5NYWluKS4KK0ZvbGxvd2luZyBwcm9wZXJ0aWVzIG1heSBiZSBjdXN0b21pemVkIGluIHRoZSBjb21tYW5kLWxpbmUgY2xpZW50IHJ1bnRpbWU6CisKKyAgMS4gcmVxPTxuPgorCisgICAgIDogbnVtYmVyIG9mIHJlcXVlc3RzIHRvIGJlIHNlbnQgYnkgdGhlIGNsaWVudCwgZGVmYXVsdHMgdG8gMTAKKworICAyLiBtb2RlPShzeW5jfGFzeW5jKQorCisgICAgIDogZXhlY3V0aW9uIG1vZGUgZGVmaW5lcyB3aGljaCB2ZXJzaW9uIG9mIHRoZSBzZXJ2aWNlIHNob3VsZCBiZSB1c2VkLCBkZWZhdWx0cyB0byAiYXN5bmMiCisKKyAgMy4gdXJpPTxiYXNlX3dlYmFwcF91cmk+CisKKyAgICAgOiBiYXNlIFVSSSBvZiB0aGUgZGVwbG95ZWQgd2ViIGFwcGxpY2F0aW9uLCBkZWZhdWx0cyB0byAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3NlcnZlci1hc3luYy1zdGFuZGFsb25lLXdlYmFwcCIKKworVGhlc2UgcHJvcGVydGllcyBtYXkgYmUgcGFzc2VkIHRocm91ZyBtYXZlbiB0byB0aGUgY2xpZW50IHJ1bnRpbWUgYXMgY29tbWFuZC1saW5lIGFyZ3VtZW50cwordXNpbmcgdGhlIC1EZXhlYy5hcmdzPSI8YXJndW1lbnRzPiIgZmxhZywgZS5nLjoKKworPiAgIG12biBleGVjOmphdmEgLURleGVjLmFyZ3M9InJlcT0yMCBtb2RlPXN5bmMgdXJpPWh0dHA6Ly9mb28uY29tL2JhciIKKworV2hlbiB0aGUgZXhhbXBsZSBjbGllbnQgaXMgcnVuLCBzdWNjZXNzZnVsbHkgZXhlY3V0ZWQgcmVxdWVzdHMgYXJlIG91dHB1dCBhcyBhbgorYXN0ZXJpc2sgJyonLCBmYWlsZWQgcmVxdWVzdHMgYXMgYW4gZXhjbGFtYXRpb24gbWFyayAnIScuIEFueSBlcnJvcnMgdGhhdCBvY2N1cmVkCitkdXJpbmcgdGhlIGNsaWVudCBleGVjdXRpb24gYXJlIHJlcG9ydGVkIGF0IHRoZSBlbmQgb2YgdGhlIHJ1biBpbmNsdWRpbmcgdGhlCitzdGF0aXN0aWNzIGFib3V0IHRoZSBwcm9jZXNzaW5nIHRpbWUgYW5kIHN1Y2Nlc3MgcmF0aW8uCisKK1RyeSBydW5uaW5nIHRoZSBjbGllbnQgdXNpbmcgbWFueSByZXF1ZXN0cyBhbmQgY29tcGFyZSB0aGUgcmVzdWx0cyB3aGVuIHJ1bm5pbmcKK2FnYWluc3Qgc3luYyBhbmQgYXN5bmMgdmVyc2lvbiBvZiB0aGUgcmVzb3VyY2UsIGUuZy46CisKKz4gICBtdm4gZXhlYzpqYXZhIC1EZXhlYy5hcmdzPSJyZXE9MTAwIG1vZGU9c3luYyIKKz4gICBtdm4gZXhlYzpqYXZhIC1EZXhlYy5hcmdzPSJyZXE9MTAwIG1vZGU9YXN5bmMiCisKK1lvdSBzaG91bGQgc2VlIGEgc2lnbmlmaWNhbnQgc3BlZWQgaW1wcm92ZW1lbnQgaW4gdGhlIGxhdHRlciBydW4uCmRpZmYgLS1naXQgYS9leGFtcGxlcy9zZXJ2ZXItYXN5bmMtc3RhbmRhbG9uZS9jbGllbnQvcG9tLnhtbCBiL2V4YW1wbGVzL3NlcnZlci1hc3luYy1zdGFuZGFsb25lL2NsaWVudC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2Zjc3OWIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zZXJ2ZXItYXN5bmMtc3RhbmRhbG9uZS9jbGllbnQvcG9tLnhtbApAQCAtMCwwICsxLDEzNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+c2VydmVyLWFzeW5jLXN0YW5kYWxvbmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5zZXJ2ZXItYXN5bmMtc3RhbmRhbG9uZS1jbGllbnQ8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktZXhhbXBsZXMtc2VydmVyLWFzeW5jLXN0YW5kYWxvbmUtY2xpZW50PC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPlN0YW5kYWxvbmUgSmVyc2V5IEpBWC1SUyBhc3luY2hyb25vdXMgc2VydmVyLXNpZGUgcHJvY2Vzc2luZyBleGFtcGxlIGNsaWVudC48L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC53cy5yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LndzLnJzLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY2xpZW50PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWhrMjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5zd2luZ2xhYnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zd2luZy1sYXlvdXQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjAuMzwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGFyY2hpdmU+CisgICAgICAgICAgICAgICAgICAgICAgICA8aW5kZXg+dHJ1ZTwvaW5kZXg+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWFuaWZlc3Q+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFkZENsYXNzcGF0aD50cnVlPC9hZGRDbGFzc3BhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1haW5DbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5zZXJ2ZXIuYXN5bmMuTWFpbldpbmRvdzwvbWFpbkNsYXNzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9tYW5pZmVzdD4KKyAgICAgICAgICAgICAgICAgICAgPC9hcmNoaXZlPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPCEtLSBSdW4gdGhlIGFwcGxpY2F0aW9uIHVzaW5nICJtdm4gZXhlYzpqYXZhIiAtLT4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhlYy1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxtYWluQ2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuc2VydmVyLmFzeW5jLk1haW5XaW5kb3c8L21haW5DbGFzcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnJ1bi1leHRlcm5hbC10ZXN0czwvaWQ+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk+JHtleHRlcm5hbC5jb250YWluZXIuZmFjdG9yeX08L2plcnNleS5jb25maWcudGVzdC5jb250YWluZXIuZmFjdG9yeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydD4ke2V4dGVybmFsLmNvbnRhaW5lci5wb3J0fTwvamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgICAgICA8cHJvcGVydGllcz4KKyAgICAgICAgICAgICAgICA8IS0tIEV4dGVybmFsIHRlc3QgY29udGFpbmVyIGNvbmZpZ3VyYXRpb24gaXMgZG9uZSB2aWEgcHJvcGVydGllcyB0byBhbGxvdyBvdmVycmlkaW5nIHZpYSBjb21tYW5kIGxpbmUuIC0tPgorICAgICAgICAgICAgICAgIDxleHRlcm5hbC5jb250YWluZXIuZmFjdG9yeT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk8L2V4dGVybmFsLmNvbnRhaW5lci5mYWN0b3J5PgorICAgICAgICAgICAgICAgIDxleHRlcm5hbC5jb250YWluZXIucG9ydD44MDgwPC9leHRlcm5hbC5jb250YWluZXIucG9ydD4KKyAgICAgICAgICAgICAgICA8bWF2ZW4udGVzdC5za2lwPmZhbHNlPC9tYXZlbi50ZXN0LnNraXA+CisgICAgICAgICAgICA8L3Byb3BlcnRpZXM+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+cmVsZWFzZTwvaWQ+CisgICAgICAgICAgICA8IS0tIGRvIG5vdCBjcmVhdGUgc291cmNlIHppcCBidW5kbGVzIC0tPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNraXBBc3NlbWJseT50cnVlPC9za2lwQXNzZW1ibHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNraXA+dHJ1ZTwvc2tpcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPG1hdmVuLnRlc3Quc2tpcD50cnVlPC9tYXZlbi50ZXN0LnNraXA+CisgICAgPC9wcm9wZXJ0aWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9zZXJ2ZXItYXN5bmMtc3RhbmRhbG9uZS9jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9zZXJ2ZXIvYXN5bmMvTWFpbi5qYXZhIGIvZXhhbXBsZXMvc2VydmVyLWFzeW5jLXN0YW5kYWxvbmUvY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvc2VydmVyL2FzeW5jL01haW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjdjMjkxCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvc2VydmVyLWFzeW5jLXN0YW5kYWxvbmUvY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvc2VydmVyL2FzeW5jL01haW4uamF2YQpAQCAtMCwwICsxLDE2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5zZXJ2ZXIuYXN5bmM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5RdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TGlua2VkUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5JbnZvY2F0aW9uQ2FsbGJhY2s7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKKworLyoqCisgKiBMb25nLXJ1bm5pbmcgYXN5bmNocm9ub3VzIHNlcnZpY2UgY2xpZW50LgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBNYWluIHsKKworICAgIC8qKgorICAgICAqIE1haW4gY2xpZW50IGVudHJ5IHBvaW50LgorICAgICAqCisgICAgICogQHBhcmFtIGFyZ3MgY29tbWFuZC1saW5lIGFyZ3VtZW50cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIFN5c3RlbS5leGl0KHJ1bkNsaWVudChhcmdzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xpZW50IC0gYnVzaW5lc3MgbG9naWMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXJncyBjb21tYW5kLWxpbmUgYXJndW1lbnRzLgorICAgICAqIEByZXR1cm4gZXhpdCBjb2RlIG9mIHRoZSB1dGlsaXR5LiB7QGNvZGUgMH0gaWYgZXZlcnl0aGluZyBjb21wbGV0ZWQgd2l0aG91dCBlcnJvcnMsIHtAY29kZSAtMX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHN0YXRpYyBpbnQgcnVuQ2xpZW50KGZpbmFsIFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgLy8gUGFyc2luZyBjb21tYW5kLWxpbmUgYXJndW1lbnRzCisgICAgICAgIGZpbmFsIENvbmZpZyBjb25maWcgPSBDb25maWcucGFyc2UoYXJncyk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihTdHJpbmcuZm9ybWF0KCJcblN0YXJ0aW5nIHRvIGV4ZWN1dGUgJWQgcmVxdWVzdHM6XG4iLCBjb25maWcucmVxdWVzdHMpKTsKKyAgICAgICAgLy8gQ3JlYXRpbmcgSkFYLVJTIGNsaWVudAorICAgICAgICBmaW5hbCBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKTsKKyAgICAgICAgLy8gVGFyZ2V0aW5nIGVjaG8gcmVzb3VyY2UgYXQgVVJJICI8YmFzZVVyaT4vbG9uZy1ydW5uaW5nLyhzeW5jfGFzeW5jKS97ZWNob30iCisgICAgICAgIGZpbmFsIFdlYlRhcmdldCBlY2hvUmVzb3VyY2UgPSBjbGllbnQudGFyZ2V0KGNvbmZpZy5iYXNlVXJpKS5wYXRoKCJsb25nLXJ1bm5pbmcve21vZGV9L3tlY2hvfSIpCisgICAgICAgICAgICAgICAgLnJlc29sdmVUZW1wbGF0ZSgibW9kZSIsIChjb25maWcuc3luYykgPyAic3luYyIgOiAiYXN5bmMiKTsKKworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaChjb25maWcucmVxdWVzdHMpOworICAgICAgICBmaW5hbCBRdWV1ZTxTdHJpbmc+IGVycm9ycyA9IG5ldyBDb25jdXJyZW50TGlua2VkUXVldWU8U3RyaW5nPigpOworICAgICAgICBmaW5hbCBBdG9taWNJbnRlZ2VyIHJlcXVlc3RDb3VudGVyID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CisKKyAgICAgICAgZmluYWwgbG9uZyB0aWMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb25maWcucmVxdWVzdHM7IGkrKykgeworICAgICAgICAgICAgZmluYWwgaW50IHJlcUlkID0gaTsKKyAgICAgICAgICAgIGVjaG9SZXNvdXJjZS5yZXNvbHZlVGVtcGxhdGUoImVjaG8iLCByZXFJZCkucmVxdWVzdCgpLmFzeW5jKCkuZ2V0KG5ldyBJbnZvY2F0aW9uQ2FsbGJhY2s8U3RyaW5nPigpIHsKKyAgICAgICAgICAgICAgICBwcml2YXRlIGZpbmFsIEF0b21pY0ludGVnZXIgcmV0cmllcyA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOworCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY29tcGxldGVkKFN0cmluZyByZXNwb25zZSkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVxdWVzdElkID0gSW50ZWdlci50b1N0cmluZyhyZXFJZCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0SWQuZXF1YWxzKHJlc3BvbnNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiKiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdENvdW50ZXIuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIhIik7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcnMub2ZmZXIoU3RyaW5nLmZvcm1hdCgiRWNobyByZXNwb25zZSAnJXMnIG5vdCBlcXVhbCB0byByZXF1ZXN0ICclcyciLCByZXNwb25zZSwgcmVxdWVzdElkKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZmFpbGVkKFRocm93YWJsZSBlcnJvcikgeworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIElPRXhjZXB0aW9uICYmIHJldHJpZXMuZ2V0QW5kSW5jcmVtZW50KCkgPCAzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNlbmQKKyAgICAgICAgICAgICAgICAgICAgICAgIGVjaG9SZXNvdXJjZS5yZXNvbHZlVGVtcGxhdGUoImVjaG8iLCByZXFJZCkucmVxdWVzdCgpLmFzeW5jKCkuZ2V0KHRoaXMpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludCgiISIpOworICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLm9mZmVyKFN0cmluZy5mb3JtYXQoIlJlcXVlc3QgJyVkJyBoYXMgZmFpbGVkOiAlcyIsIHJlcUlkLCBlcnJvci50b1N0cmluZygpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICghbGF0Y2guYXdhaXQoNjAsIFRpbWVVbml0LlNFQ09ORFMpKSB7CisgICAgICAgICAgICAgICAgZXJyb3JzLm9mZmVyKCJXYWl0aW5nIGZvciByZXF1ZXN0cyB0byBjb21wbGV0ZSBoYXMgdGltZWQgb3V0LiIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlcnJvcnMub2ZmZXIoIldhaXRpbmcgZm9yIHJlcXVlc3RzIHRvIGNvbXBsZXRlIGhhcyBiZWVuIGludGVycnVwdGVkLiIpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIGxvbmcgdG9jID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFN0cmluZy5mb3JtYXQoIlxuXG5FeGVjdXRpb24gZmluaXNoZWQgaW4gJWQgbXMuXG5TdWNjZXNzIHJhdGU6ICU2LjJmICUlIiwKKyAgICAgICAgICAgICAgICB0b2MgLSB0aWMsCisgICAgICAgICAgICAgICAgKChkb3VibGUpIHJlcXVlc3RDb3VudGVyLmdldCgpIC8gY29uZmlnLnJlcXVlc3RzKSAqIDEwMCkpOworICAgICAgICBpZiAoZXJyb3JzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRm9sbG93aW5nIGVycm9ycyBvY2N1cnJlZCBkdXJpbmcgdGhlIHJlcXVlc3QgZXhlY3V0aW9uIik7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBlcnJvciA6IGVycm9ycykgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXHQiICsgZXJyb3IpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgY2xpZW50LmNsb3NlKCk7CisKKyAgICAgICAgcmV0dXJuIGVycm9ycy5zaXplKCkgPiAwID8gLTEgOiAwOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBDb25maWcgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBEZWZhdWx0IGJhc2UgVVJJIG9mIHRoZSBhc3luYyBlY2hvIHdlYiBhcHBsaWNhdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQkFTRV9VUkkgPSAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3NlcnZlci1hc3luYy1zdGFuZGFsb25lLXdlYmFwcC8iOworCisgICAgICAgIGZpbmFsIFN0cmluZyBiYXNlVXJpOworICAgICAgICBmaW5hbCBib29sZWFuIHN5bmM7CisgICAgICAgIGZpbmFsIGludCByZXF1ZXN0czsKKworICAgICAgICBDb25maWcoU3RyaW5nIGJhc2VVcmksIGJvb2xlYW4gc3luYywgaW50IHJlcXVlc3RzKSB7CisgICAgICAgICAgICB0aGlzLmJhc2VVcmkgPSBiYXNlVXJpOworICAgICAgICAgICAgdGhpcy5zeW5jID0gc3luYzsKKyAgICAgICAgICAgIHRoaXMucmVxdWVzdHMgPSByZXF1ZXN0czsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQ29uZmlnIHBhcnNlKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgICAgIFN0cmluZyBiYXNlVXJpID0gREVGQVVMVF9CQVNFX1VSSTsKKyAgICAgICAgICAgIGJvb2xlYW4gc3luYyA9IGZhbHNlOworICAgICAgICAgICAgaW50IHJlcXVlc3RzID0gMTA7CisKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIGFyZyA6IGFyZ3MpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBrZXlWYWx1ZVBhaXIgPSBhcmcudHJpbSgpLnNwbGl0KCI9Iik7CisKKyAgICAgICAgICAgICAgICBpZiAoInVyaSIuZXF1YWxzKGtleVZhbHVlUGFpclswXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgYmFzZVVyaSA9IGtleVZhbHVlUGFpclsxXTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJtb2RlIi5lcXVhbHMoa2V5VmFsdWVQYWlyWzBdKSkgeworICAgICAgICAgICAgICAgICAgICBzeW5jID0gInN5bmMiLmVxdWFscyhrZXlWYWx1ZVBhaXJbMV0pOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoInJlcSIuZXF1YWxzKGtleVZhbHVlUGFpclswXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdHMgPSBJbnRlZ2VyLnBhcnNlSW50KGtleVZhbHVlUGFpclsxXSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXQVJOSU5HOiBVbmtub3duIHBhcmFtZXRlcjogIiArIGtleVZhbHVlUGFpclswXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbmV3IENvbmZpZyhiYXNlVXJpLCBzeW5jLCByZXF1ZXN0cyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiQ29uZmlneyIKKyAgICAgICAgICAgICAgICAgICAgKyAiYmFzZVVyaT0nIiArIGJhc2VVcmkgKyAnXCcnCisgICAgICAgICAgICAgICAgICAgICsgIiwgc3luYz0iICsgc3luYworICAgICAgICAgICAgICAgICAgICArICIsIHJlcXVlc3RzPSIgKyByZXF1ZXN0cworICAgICAgICAgICAgICAgICAgICArICd9JzsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3NlcnZlci1hc3luYy1zdGFuZGFsb25lL2NsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3NlcnZlci9hc3luYy9NYWluV2luZG93LmZvcm0gYi9leGFtcGxlcy9zZXJ2ZXItYXN5bmMtc3RhbmRhbG9uZS9jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9zZXJ2ZXIvYXN5bmMvTWFpbldpbmRvdy5mb3JtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3OGE4NjEKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zZXJ2ZXItYXN5bmMtc3RhbmRhbG9uZS9jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9zZXJ2ZXIvYXN5bmMvTWFpbldpbmRvdy5mb3JtCkBAIC0wLDAgKzEsMjU2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisKKy0tPgorCis8Rm9ybSB2ZXJzaW9uPSIxLjMiIG1heFZlcnNpb249IjEuOCIgdHlwZT0ib3JnLm5ldGJlYW5zLm1vZHVsZXMuZm9ybS5mb3JtaW5mby5KRnJhbWVGb3JtSW5mbyI+CisgIDxOb25WaXN1YWxDb21wb25lbnRzPgorICAgIDxDb21wb25lbnQgY2xhc3M9ImphdmF4LnN3aW5nLkJ1dHRvbkdyb3VwIiBuYW1lPSJzeW5jQXN5bmNTd2l0Y2hHcm91cCI+CisgICAgPC9Db21wb25lbnQ+CisgIDwvTm9uVmlzdWFsQ29tcG9uZW50cz4KKyAgPFByb3BlcnRpZXM+CisgICAgPFByb3BlcnR5IG5hbWU9ImRlZmF1bHRDbG9zZU9wZXJhdGlvbiIgdHlwZT0iaW50IiB2YWx1ZT0iMyIvPgorICAgIDxQcm9wZXJ0eSBuYW1lPSJtYXhpbXVtU2l6ZSIgdHlwZT0iamF2YS5hd3QuRGltZW5zaW9uIiBlZGl0b3I9Im9yZy5uZXRiZWFucy5iZWFuaW5mby5lZGl0b3JzLkRpbWVuc2lvbkVkaXRvciI+CisgICAgICA8RGltZW5zaW9uIHZhbHVlPSJbNDgwLCA2MDBdIi8+CisgICAgPC9Qcm9wZXJ0eT4KKyAgICA8UHJvcGVydHkgbmFtZT0ibWluaW11bVNpemUiIHR5cGU9ImphdmEuYXd0LkRpbWVuc2lvbiIgZWRpdG9yPSJvcmcubmV0YmVhbnMuYmVhbmluZm8uZWRpdG9ycy5EaW1lbnNpb25FZGl0b3IiPgorICAgICAgPERpbWVuc2lvbiB2YWx1ZT0iWzQ4MCwgNjAwXSIvPgorICAgIDwvUHJvcGVydHk+CisgICAgPFByb3BlcnR5IG5hbWU9InJlc2l6YWJsZSIgdHlwZT0iYm9vbGVhbiIgdmFsdWU9ImZhbHNlIi8+CisgIDwvUHJvcGVydGllcz4KKyAgPFN5bnRoZXRpY1Byb3BlcnRpZXM+CisgICAgPFN5bnRoZXRpY1Byb3BlcnR5IG5hbWU9ImZvcm1TaXplUG9saWN5IiB0eXBlPSJpbnQiIHZhbHVlPSIxIi8+CisgIDwvU3ludGhldGljUHJvcGVydGllcz4KKyAgPEF1eFZhbHVlcz4KKyAgICA8QXV4VmFsdWUgbmFtZT0iRm9ybVNldHRpbmdzX2F1dG9SZXNvdXJjaW5nIiB0eXBlPSJqYXZhLmxhbmcuSW50ZWdlciIgdmFsdWU9IjAiLz4KKyAgICA8QXV4VmFsdWUgbmFtZT0iRm9ybVNldHRpbmdzX2F1dG9TZXRDb21wb25lbnROYW1lIiB0eXBlPSJqYXZhLmxhbmcuQm9vbGVhbiIgdmFsdWU9ImZhbHNlIi8+CisgICAgPEF1eFZhbHVlIG5hbWU9IkZvcm1TZXR0aW5nc19nZW5lcmF0ZUZRTiIgdHlwZT0iamF2YS5sYW5nLkJvb2xlYW4iIHZhbHVlPSJ0cnVlIi8+CisgICAgPEF1eFZhbHVlIG5hbWU9IkZvcm1TZXR0aW5nc19nZW5lcmF0ZU1uZW1vbmljc0NvZGUiIHR5cGU9ImphdmEubGFuZy5Cb29sZWFuIiB2YWx1ZT0iZmFsc2UiLz4KKyAgICA8QXV4VmFsdWUgbmFtZT0iRm9ybVNldHRpbmdzX2kxOG5BdXRvTW9kZSIgdHlwZT0iamF2YS5sYW5nLkJvb2xlYW4iIHZhbHVlPSJmYWxzZSIvPgorICAgIDxBdXhWYWx1ZSBuYW1lPSJGb3JtU2V0dGluZ3NfbGF5b3V0Q29kZVRhcmdldCIgdHlwZT0iamF2YS5sYW5nLkludGVnZXIiIHZhbHVlPSIyIi8+CisgICAgPEF1eFZhbHVlIG5hbWU9IkZvcm1TZXR0aW5nc19saXN0ZW5lckdlbmVyYXRpb25TdHlsZSIgdHlwZT0iamF2YS5sYW5nLkludGVnZXIiIHZhbHVlPSIwIi8+CisgICAgPEF1eFZhbHVlIG5hbWU9IkZvcm1TZXR0aW5nc192YXJpYWJsZXNMb2NhbCIgdHlwZT0iamF2YS5sYW5nLkJvb2xlYW4iIHZhbHVlPSJmYWxzZSIvPgorICAgIDxBdXhWYWx1ZSBuYW1lPSJGb3JtU2V0dGluZ3NfdmFyaWFibGVzTW9kaWZpZXIiIHR5cGU9ImphdmEubGFuZy5JbnRlZ2VyIiB2YWx1ZT0iMiIvPgorICA8L0F1eFZhbHVlcz4KKworICA8TGF5b3V0PgorICAgIDxEaW1lbnNpb25MYXlvdXQgZGltPSIwIj4KKyAgICAgIDxHcm91cCB0eXBlPSIxMDMiIGdyb3VwQWxpZ25tZW50PSIwIiBhdHRyaWJ1dGVzPSIwIj4KKyAgICAgICAgICA8R3JvdXAgdHlwZT0iMTAyIiBhbGlnbm1lbnQ9IjEiIGF0dHJpYnV0ZXM9IjAiPgorICAgICAgICAgICAgICA8RW1wdHlTcGFjZSBtYXg9Ii0yIiBhdHRyaWJ1dGVzPSIwIi8+CisgICAgICAgICAgICAgIDxHcm91cCB0eXBlPSIxMDMiIGdyb3VwQWxpZ25tZW50PSIxIiBhdHRyaWJ1dGVzPSIwIj4KKyAgICAgICAgICAgICAgICAgIDxDb21wb25lbnQgaWQ9ImpQYW5lbDIiIG1heD0iMzI3NjciIGF0dHJpYnV0ZXM9IjAiLz4KKyAgICAgICAgICAgICAgICAgIDxDb21wb25lbnQgaWQ9ImpQYW5lbDEiIGFsaWdubWVudD0iMCIgbWF4PSIzMjc2NyIgYXR0cmlidXRlcz0iMCIvPgorICAgICAgICAgICAgICAgICAgPENvbXBvbmVudCBpZD0ibWVzc2FnZVBhbmVsIiBhbGlnbm1lbnQ9IjEiIG1pbj0iLTIiIHByZWY9IjQ2OCIgbWF4PSItMiIgYXR0cmlidXRlcz0iMCIvPgorICAgICAgICAgICAgICA8L0dyb3VwPgorICAgICAgICAgICAgICA8RW1wdHlTcGFjZSBtYXg9Ii0yIiBhdHRyaWJ1dGVzPSIwIi8+CisgICAgICAgICAgPC9Hcm91cD4KKyAgICAgIDwvR3JvdXA+CisgICAgPC9EaW1lbnNpb25MYXlvdXQ+CisgICAgPERpbWVuc2lvbkxheW91dCBkaW09IjEiPgorICAgICAgPEdyb3VwIHR5cGU9IjEwMyIgZ3JvdXBBbGlnbm1lbnQ9IjAiIGF0dHJpYnV0ZXM9IjAiPgorICAgICAgICAgIDxHcm91cCB0eXBlPSIxMDIiIGFsaWdubWVudD0iMCIgYXR0cmlidXRlcz0iMCI+CisgICAgICAgICAgICAgIDxFbXB0eVNwYWNlIG1heD0iLTIiIGF0dHJpYnV0ZXM9IjAiLz4KKyAgICAgICAgICAgICAgPENvbXBvbmVudCBpZD0ialBhbmVsMSIgbWluPSItMiIgbWF4PSItMiIgYXR0cmlidXRlcz0iMCIvPgorICAgICAgICAgICAgICA8RW1wdHlTcGFjZSBtYXg9Ii0yIiBhdHRyaWJ1dGVzPSIwIi8+CisgICAgICAgICAgICAgIDxDb21wb25lbnQgaWQ9ImpQYW5lbDIiIG1pbj0iLTIiIG1heD0iLTIiIGF0dHJpYnV0ZXM9IjAiLz4KKyAgICAgICAgICAgICAgPEVtcHR5U3BhY2UgbWF4PSItMiIgYXR0cmlidXRlcz0iMCIvPgorICAgICAgICAgICAgICA8Q29tcG9uZW50IGlkPSJtZXNzYWdlUGFuZWwiIHByZWY9IjQ1NiIgbWF4PSIzMjc2NyIgYXR0cmlidXRlcz0iMCIvPgorICAgICAgICAgICAgICA8RW1wdHlTcGFjZSBtYXg9Ii0yIiBhdHRyaWJ1dGVzPSIwIi8+CisgICAgICAgICAgPC9Hcm91cD4KKyAgICAgIDwvR3JvdXA+CisgICAgPC9EaW1lbnNpb25MYXlvdXQ+CisgIDwvTGF5b3V0PgorICA8U3ViQ29tcG9uZW50cz4KKyAgICA8Q29udGFpbmVyIGNsYXNzPSJqYXZheC5zd2luZy5KUGFuZWwiIG5hbWU9ImpQYW5lbDEiPgorCisgICAgICA8TGF5b3V0PgorICAgICAgICA8RGltZW5zaW9uTGF5b3V0IGRpbT0iMCI+CisgICAgICAgICAgPEdyb3VwIHR5cGU9IjEwMyIgZ3JvdXBBbGlnbm1lbnQ9IjAiIGF0dHJpYnV0ZXM9IjAiPgorICAgICAgICAgICAgICA8R3JvdXAgdHlwZT0iMTAyIiBhdHRyaWJ1dGVzPSIwIj4KKyAgICAgICAgICAgICAgICAgIDxFbXB0eVNwYWNlIG1heD0iLTIiIGF0dHJpYnV0ZXM9IjAiLz4KKyAgICAgICAgICAgICAgICAgIDxHcm91cCB0eXBlPSIxMDMiIGdyb3VwQWxpZ25tZW50PSIwIiBhdHRyaWJ1dGVzPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICA8Q29tcG9uZW50IGlkPSJqTGFiZWwxIiBtaW49Ii0yIiBtYXg9Ii0yIiBhdHRyaWJ1dGVzPSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgPENvbXBvbmVudCBpZD0iakxhYmVsMiIgYWxpZ25tZW50PSIxIiBtaW49Ii0yIiBtYXg9Ii0yIiBhdHRyaWJ1dGVzPSIwIi8+CisgICAgICAgICAgICAgICAgICA8L0dyb3VwPgorICAgICAgICAgICAgICAgICAgPEVtcHR5U3BhY2UgdHlwZT0idW5yZWxhdGVkIiBtYXg9Ii0yIiBhdHRyaWJ1dGVzPSIwIi8+CisgICAgICAgICAgICAgICAgICA8R3JvdXAgdHlwZT0iMTAzIiBncm91cEFsaWdubWVudD0iMCIgYXR0cmlidXRlcz0iMCI+CisgICAgICAgICAgICAgICAgICAgICAgPEdyb3VwIHR5cGU9IjEwMiIgYXR0cmlidXRlcz0iMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDxDb21wb25lbnQgaWQ9InJlcXVlc3RDb3VudEZpZWxkIiBtYXg9IjMyNzY3IiBhdHRyaWJ1dGVzPSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDxFbXB0eVNwYWNlIG1heD0iLTIiIGF0dHJpYnV0ZXM9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPENvbXBvbmVudCBpZD0ic3luY1JhZGlvIiBtaW49Ii0yIiBtYXg9Ii0yIiBhdHRyaWJ1dGVzPSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDxFbXB0eVNwYWNlIG1heD0iLTIiIGF0dHJpYnV0ZXM9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPENvbXBvbmVudCBpZD0iYXN5bmNSYWRpbyIgbWluPSItMiIgbWF4PSItMiIgYXR0cmlidXRlcz0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8RW1wdHlTcGFjZSBtaW49Ii0yIiBwcmVmPSIyNCIgbWF4PSItMiIgYXR0cmlidXRlcz0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8Q29tcG9uZW50IGlkPSJydW5CdXR0b24iIG1pbj0iLTIiIG1heD0iLTIiIGF0dHJpYnV0ZXM9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICA8L0dyb3VwPgorICAgICAgICAgICAgICAgICAgICAgIDxHcm91cCB0eXBlPSIxMDIiIGF0dHJpYnV0ZXM9IjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8Q29tcG9uZW50IGlkPSJ1cmlGaWVsZCIgbWF4PSIzMjc2NyIgYXR0cmlidXRlcz0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8RW1wdHlTcGFjZSBtYXg9Ii0yIiBhdHRyaWJ1dGVzPSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgPC9Hcm91cD4KKyAgICAgICAgICAgICAgICAgIDwvR3JvdXA+CisgICAgICAgICAgICAgIDwvR3JvdXA+CisgICAgICAgICAgPC9Hcm91cD4KKyAgICAgICAgPC9EaW1lbnNpb25MYXlvdXQ+CisgICAgICAgIDxEaW1lbnNpb25MYXlvdXQgZGltPSIxIj4KKyAgICAgICAgICA8R3JvdXAgdHlwZT0iMTAzIiBncm91cEFsaWdubWVudD0iMCIgYXR0cmlidXRlcz0iMCI+CisgICAgICAgICAgICAgIDxHcm91cCB0eXBlPSIxMDIiIGFsaWdubWVudD0iMSIgYXR0cmlidXRlcz0iMCI+CisgICAgICAgICAgICAgICAgICA8RW1wdHlTcGFjZSBtYXg9IjMyNzY3IiBhdHRyaWJ1dGVzPSIwIi8+CisgICAgICAgICAgICAgICAgICA8R3JvdXAgdHlwZT0iMTAzIiBncm91cEFsaWdubWVudD0iMyIgYXR0cmlidXRlcz0iMCI+CisgICAgICAgICAgICAgICAgICAgICAgPENvbXBvbmVudCBpZD0idXJpRmllbGQiIGFsaWdubWVudD0iMyIgbWluPSItMiIgbWF4PSItMiIgYXR0cmlidXRlcz0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgIDxDb21wb25lbnQgaWQ9ImpMYWJlbDIiIGFsaWdubWVudD0iMyIgbWluPSItMiIgbWF4PSItMiIgYXR0cmlidXRlcz0iMCIvPgorICAgICAgICAgICAgICAgICAgPC9Hcm91cD4KKyAgICAgICAgICAgICAgICAgIDxFbXB0eVNwYWNlIG1heD0iLTIiIGF0dHJpYnV0ZXM9IjAiLz4KKyAgICAgICAgICAgICAgICAgIDxHcm91cCB0eXBlPSIxMDMiIGdyb3VwQWxpZ25tZW50PSIzIiBhdHRyaWJ1dGVzPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICA8Q29tcG9uZW50IGlkPSJyZXF1ZXN0Q291bnRGaWVsZCIgYWxpZ25tZW50PSIzIiBtaW49Ii0yIiBtYXg9Ii0yIiBhdHRyaWJ1dGVzPSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgPENvbXBvbmVudCBpZD0iakxhYmVsMSIgYWxpZ25tZW50PSIzIiBtaW49Ii0yIiBtYXg9Ii0yIiBhdHRyaWJ1dGVzPSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgPENvbXBvbmVudCBpZD0ic3luY1JhZGlvIiBhbGlnbm1lbnQ9IjMiIG1pbj0iLTIiIG1heD0iLTIiIGF0dHJpYnV0ZXM9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICA8Q29tcG9uZW50IGlkPSJhc3luY1JhZGlvIiBhbGlnbm1lbnQ9IjMiIG1pbj0iLTIiIG1heD0iLTIiIGF0dHJpYnV0ZXM9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICA8Q29tcG9uZW50IGlkPSJydW5CdXR0b24iIGFsaWdubWVudD0iMyIgbWluPSItMiIgbWF4PSItMiIgYXR0cmlidXRlcz0iMCIvPgorICAgICAgICAgICAgICAgICAgPC9Hcm91cD4KKyAgICAgICAgICAgICAgPC9Hcm91cD4KKyAgICAgICAgICA8L0dyb3VwPgorICAgICAgICA8L0RpbWVuc2lvbkxheW91dD4KKyAgICAgIDwvTGF5b3V0PgorICAgICAgPFN1YkNvbXBvbmVudHM+CisgICAgICAgIDxDb21wb25lbnQgY2xhc3M9ImphdmF4LnN3aW5nLkpMYWJlbCIgbmFtZT0iakxhYmVsMSI+CisgICAgICAgICAgPFByb3BlcnRpZXM+CisgICAgICAgICAgICA8UHJvcGVydHkgbmFtZT0idGV4dCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdmFsdWU9Ik51bWJlciBvZiByZXF1ZXN0cyIvPgorICAgICAgICAgIDwvUHJvcGVydGllcz4KKyAgICAgICAgPC9Db21wb25lbnQ+CisgICAgICAgIDxDb21wb25lbnQgY2xhc3M9ImphdmF4LnN3aW5nLkpUZXh0RmllbGQiIG5hbWU9InJlcXVlc3RDb3VudEZpZWxkIj4KKyAgICAgICAgICA8UHJvcGVydGllcz4KKyAgICAgICAgICAgIDxQcm9wZXJ0eSBuYW1lPSJob3Jpem9udGFsQWxpZ25tZW50IiB0eXBlPSJpbnQiIHZhbHVlPSI0Ii8+CisgICAgICAgICAgICA8UHJvcGVydHkgbmFtZT0idGV4dCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdmFsdWU9IjEwIi8+CisgICAgICAgICAgPC9Qcm9wZXJ0aWVzPgorICAgICAgICA8L0NvbXBvbmVudD4KKyAgICAgICAgPENvbXBvbmVudCBjbGFzcz0iamF2YXguc3dpbmcuSlJhZGlvQnV0dG9uIiBuYW1lPSJzeW5jUmFkaW8iPgorICAgICAgICAgIDxQcm9wZXJ0aWVzPgorICAgICAgICAgICAgPFByb3BlcnR5IG5hbWU9ImJ1dHRvbkdyb3VwIiB0eXBlPSJqYXZheC5zd2luZy5CdXR0b25Hcm91cCIgZWRpdG9yPSJvcmcubmV0YmVhbnMubW9kdWxlcy5mb3JtLlJBRENvbXBvbmVudCRCdXR0b25Hcm91cFByb3BlcnR5RWRpdG9yIj4KKyAgICAgICAgICAgICAgPENvbXBvbmVudFJlZiBuYW1lPSJzeW5jQXN5bmNTd2l0Y2hHcm91cCIvPgorICAgICAgICAgICAgPC9Qcm9wZXJ0eT4KKyAgICAgICAgICAgIDxQcm9wZXJ0eSBuYW1lPSJ0ZXh0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB2YWx1ZT0ic3luYyIvPgorICAgICAgICAgIDwvUHJvcGVydGllcz4KKyAgICAgICAgPC9Db21wb25lbnQ+CisgICAgICAgIDxDb21wb25lbnQgY2xhc3M9ImphdmF4LnN3aW5nLkpSYWRpb0J1dHRvbiIgbmFtZT0iYXN5bmNSYWRpbyI+CisgICAgICAgICAgPFByb3BlcnRpZXM+CisgICAgICAgICAgICA8UHJvcGVydHkgbmFtZT0iYnV0dG9uR3JvdXAiIHR5cGU9ImphdmF4LnN3aW5nLkJ1dHRvbkdyb3VwIiBlZGl0b3I9Im9yZy5uZXRiZWFucy5tb2R1bGVzLmZvcm0uUkFEQ29tcG9uZW50JEJ1dHRvbkdyb3VwUHJvcGVydHlFZGl0b3IiPgorICAgICAgICAgICAgICA8Q29tcG9uZW50UmVmIG5hbWU9InN5bmNBc3luY1N3aXRjaEdyb3VwIi8+CisgICAgICAgICAgICA8L1Byb3BlcnR5PgorICAgICAgICAgICAgPFByb3BlcnR5IG5hbWU9InNlbGVjdGVkIiB0eXBlPSJib29sZWFuIiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgICAgICAgPFByb3BlcnR5IG5hbWU9InRleHQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHZhbHVlPSJhc3luYyIvPgorICAgICAgICAgIDwvUHJvcGVydGllcz4KKyAgICAgICAgPC9Db21wb25lbnQ+CisgICAgICAgIDxDb21wb25lbnQgY2xhc3M9ImphdmF4LnN3aW5nLkpUZXh0RmllbGQiIG5hbWU9InVyaUZpZWxkIj4KKyAgICAgICAgICA8UHJvcGVydGllcz4KKyAgICAgICAgICAgIDxQcm9wZXJ0eSBuYW1lPSJ0ZXh0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB2YWx1ZT0ialRleHRGaWVsZDIiLz4KKyAgICAgICAgICA8L1Byb3BlcnRpZXM+CisgICAgICAgIDwvQ29tcG9uZW50PgorICAgICAgICA8Q29tcG9uZW50IGNsYXNzPSJqYXZheC5zd2luZy5KTGFiZWwiIG5hbWU9ImpMYWJlbDIiPgorICAgICAgICAgIDxQcm9wZXJ0aWVzPgorICAgICAgICAgICAgPFByb3BlcnR5IG5hbWU9InRleHQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHZhbHVlPSJCYXNlIHdlYiBhcHAgVVJMIi8+CisgICAgICAgICAgPC9Qcm9wZXJ0aWVzPgorICAgICAgICA8L0NvbXBvbmVudD4KKyAgICAgICAgPENvbXBvbmVudCBjbGFzcz0iamF2YXguc3dpbmcuSkJ1dHRvbiIgbmFtZT0icnVuQnV0dG9uIj4KKyAgICAgICAgICA8UHJvcGVydGllcz4KKyAgICAgICAgICAgIDxQcm9wZXJ0eSBuYW1lPSJ0ZXh0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB2YWx1ZT0iUnVuIi8+CisgICAgICAgICAgPC9Qcm9wZXJ0aWVzPgorICAgICAgICAgIDxFdmVudHM+CisgICAgICAgICAgICA8RXZlbnRIYW5kbGVyIGV2ZW50PSJhY3Rpb25QZXJmb3JtZWQiIGxpc3RlbmVyPSJqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lciIgcGFyYW1ldGVycz0iamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQiIGhhbmRsZXI9InJ1bkJ1dHRvbkFjdGlvblBlcmZvcm1lZCIvPgorICAgICAgICAgIDwvRXZlbnRzPgorICAgICAgICA8L0NvbXBvbmVudD4KKyAgICAgIDwvU3ViQ29tcG9uZW50cz4KKyAgICA8L0NvbnRhaW5lcj4KKyAgICA8Q29udGFpbmVyIGNsYXNzPSJqYXZheC5zd2luZy5KUGFuZWwiIG5hbWU9Im1lc3NhZ2VQYW5lbCI+CisgICAgICA8UHJvcGVydGllcz4KKyAgICAgICAgPFByb3BlcnR5IG5hbWU9ImJvcmRlciIgdHlwZT0iamF2YXguc3dpbmcuYm9yZGVyLkJvcmRlciIgZWRpdG9yPSJvcmcubmV0YmVhbnMubW9kdWxlcy5mb3JtLmVkaXRvcnMyLkJvcmRlckVkaXRvciI+CisgICAgICAgICAgPEJvcmRlciBpbmZvPSJvcmcubmV0YmVhbnMubW9kdWxlcy5mb3JtLmNvbXBhdDIuYm9yZGVyLkV0Y2hlZEJvcmRlckluZm8iPgorICAgICAgICAgICAgPEV0Y2hldEJvcmRlci8+CisgICAgICAgICAgPC9Cb3JkZXI+CisgICAgICAgIDwvUHJvcGVydHk+CisgICAgICA8L1Byb3BlcnRpZXM+CisKKyAgICAgIDxMYXlvdXQgY2xhc3M9Im9yZy5uZXRiZWFucy5tb2R1bGVzLmZvcm0uY29tcGF0Mi5sYXlvdXRzLkRlc2lnbkZsb3dMYXlvdXQiLz4KKyAgICAgIDxTdWJDb21wb25lbnRzPgorICAgICAgICA8Q29tcG9uZW50IGNsYXNzPSJqYXZheC5zd2luZy5KTGFiZWwiIG5hbWU9ImpMYWJlbDMiPgorICAgICAgICAgIDxQcm9wZXJ0aWVzPgorICAgICAgICAgICAgPFByb3BlcnR5IG5hbWU9ImJhY2tncm91bmQiIHR5cGU9ImphdmEuYXd0LkNvbG9yIiBlZGl0b3I9Im9yZy5uZXRiZWFucy5iZWFuaW5mby5lZGl0b3JzLkNvbG9yRWRpdG9yIj4KKyAgICAgICAgICAgICAgPENvbG9yIGJsdWU9IjAiIGdyZWVuPSJmZiIgcmVkPSJmZiIgdHlwZT0icmdiIi8+CisgICAgICAgICAgICA8L1Byb3BlcnR5PgorICAgICAgICAgICAgPFByb3BlcnR5IG5hbWU9InRleHQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHZhbHVlPSIgICAiLz4KKyAgICAgICAgICAgIDxQcm9wZXJ0eSBuYW1lPSJ0b29sVGlwVGV4dCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdmFsdWU9IlJ1bm5pbmcuLi4iLz4KKyAgICAgICAgICAgIDxQcm9wZXJ0eSBuYW1lPSJib3JkZXIiIHR5cGU9ImphdmF4LnN3aW5nLmJvcmRlci5Cb3JkZXIiIGVkaXRvcj0ib3JnLm5ldGJlYW5zLm1vZHVsZXMuZm9ybS5lZGl0b3JzMi5Cb3JkZXJFZGl0b3IiPgorICAgICAgICAgICAgICA8Qm9yZGVyIGluZm89Im9yZy5uZXRiZWFucy5tb2R1bGVzLmZvcm0uY29tcGF0Mi5ib3JkZXIuTGluZUJvcmRlckluZm8iPgorICAgICAgICAgICAgICAgIDxMaW5lQm9yZGVyLz4KKyAgICAgICAgICAgICAgPC9Cb3JkZXI+CisgICAgICAgICAgICA8L1Byb3BlcnR5PgorICAgICAgICAgICAgPFByb3BlcnR5IG5hbWU9Im9wYXF1ZSIgdHlwZT0iYm9vbGVhbiIgdmFsdWU9InRydWUiLz4KKyAgICAgICAgICA8L1Byb3BlcnRpZXM+CisgICAgICAgIDwvQ29tcG9uZW50PgorICAgICAgICA8Q29tcG9uZW50IGNsYXNzPSJqYXZheC5zd2luZy5KTGFiZWwiIG5hbWU9ImpMYWJlbDQiPgorICAgICAgICAgIDxQcm9wZXJ0aWVzPgorICAgICAgICAgICAgPFByb3BlcnR5IG5hbWU9ImJhY2tncm91bmQiIHR5cGU9ImphdmEuYXd0LkNvbG9yIiBlZGl0b3I9Im9yZy5uZXRiZWFucy5iZWFuaW5mby5lZGl0b3JzLkNvbG9yRWRpdG9yIj4KKyAgICAgICAgICAgICAgPENvbG9yIGJsdWU9IjAiIGdyZWVuPSJmZiIgcmVkPSJmZiIgdHlwZT0icmdiIi8+CisgICAgICAgICAgICA8L1Byb3BlcnR5PgorICAgICAgICAgICAgPFByb3BlcnR5IG5hbWU9InRleHQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHZhbHVlPSIgICAiLz4KKyAgICAgICAgICAgIDxQcm9wZXJ0eSBuYW1lPSJ0b29sVGlwVGV4dCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdmFsdWU9IlJ1bm5pbmcuLi4iLz4KKyAgICAgICAgICAgIDxQcm9wZXJ0eSBuYW1lPSJib3JkZXIiIHR5cGU9ImphdmF4LnN3aW5nLmJvcmRlci5Cb3JkZXIiIGVkaXRvcj0ib3JnLm5ldGJlYW5zLm1vZHVsZXMuZm9ybS5lZGl0b3JzMi5Cb3JkZXJFZGl0b3IiPgorICAgICAgICAgICAgICA8Qm9yZGVyIGluZm89Im9yZy5uZXRiZWFucy5tb2R1bGVzLmZvcm0uY29tcGF0Mi5ib3JkZXIuTGluZUJvcmRlckluZm8iPgorICAgICAgICAgICAgICAgIDxMaW5lQm9yZGVyLz4KKyAgICAgICAgICAgICAgPC9Cb3JkZXI+CisgICAgICAgICAgICA8L1Byb3BlcnR5PgorICAgICAgICAgICAgPFByb3BlcnR5IG5hbWU9Im9wYXF1ZSIgdHlwZT0iYm9vbGVhbiIgdmFsdWU9InRydWUiLz4KKyAgICAgICAgICA8L1Byb3BlcnRpZXM+CisgICAgICAgIDwvQ29tcG9uZW50PgorICAgICAgPC9TdWJDb21wb25lbnRzPgorICAgIDwvQ29udGFpbmVyPgorICAgIDxDb250YWluZXIgY2xhc3M9ImphdmF4LnN3aW5nLkpQYW5lbCIgbmFtZT0ialBhbmVsMiI+CisKKyAgICAgIDxMYXlvdXQ+CisgICAgICAgIDxEaW1lbnNpb25MYXlvdXQgZGltPSIwIj4KKyAgICAgICAgICA8R3JvdXAgdHlwZT0iMTAzIiBncm91cEFsaWdubWVudD0iMCIgYXR0cmlidXRlcz0iMCI+CisgICAgICAgICAgICAgIDxHcm91cCB0eXBlPSIxMDIiIGF0dHJpYnV0ZXM9IjAiPgorICAgICAgICAgICAgICAgICAgPEVtcHR5U3BhY2UgbWF4PSItMiIgYXR0cmlidXRlcz0iMCIvPgorICAgICAgICAgICAgICAgICAgPEdyb3VwIHR5cGU9IjEwMyIgZ3JvdXBBbGlnbm1lbnQ9IjAiIGF0dHJpYnV0ZXM9IjAiPgorICAgICAgICAgICAgICAgICAgICAgIDxDb21wb25lbnQgaWQ9ImZpbmlzaFN0YXR1c0xhYmVsIiBtYXg9IjMyNzY3IiBhdHRyaWJ1dGVzPSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgPENvbXBvbmVudCBpZD0ic3VjY2Vzc1JhdGVTdGF0dXNMYWJlbCIgbWF4PSIzMjc2NyIgYXR0cmlidXRlcz0iMCIvPgorICAgICAgICAgICAgICAgICAgPC9Hcm91cD4KKyAgICAgICAgICAgICAgICAgIDxFbXB0eVNwYWNlIG1heD0iLTIiIGF0dHJpYnV0ZXM9IjAiLz4KKyAgICAgICAgICAgICAgPC9Hcm91cD4KKyAgICAgICAgICA8L0dyb3VwPgorICAgICAgICA8L0RpbWVuc2lvbkxheW91dD4KKyAgICAgICAgPERpbWVuc2lvbkxheW91dCBkaW09IjEiPgorICAgICAgICAgIDxHcm91cCB0eXBlPSIxMDMiIGdyb3VwQWxpZ25tZW50PSIwIiBhdHRyaWJ1dGVzPSIwIj4KKyAgICAgICAgICAgICAgPEdyb3VwIHR5cGU9IjEwMiIgYWxpZ25tZW50PSIwIiBhdHRyaWJ1dGVzPSIwIj4KKyAgICAgICAgICAgICAgICAgIDxFbXB0eVNwYWNlIG1heD0iLTIiIGF0dHJpYnV0ZXM9IjAiLz4KKyAgICAgICAgICAgICAgICAgIDxDb21wb25lbnQgaWQ9ImZpbmlzaFN0YXR1c0xhYmVsIiBtaW49Ii0yIiBtYXg9Ii0yIiBhdHRyaWJ1dGVzPSIwIi8+CisgICAgICAgICAgICAgICAgICA8RW1wdHlTcGFjZSBtYXg9Ii0yIiBhdHRyaWJ1dGVzPSIwIi8+CisgICAgICAgICAgICAgICAgICA8Q29tcG9uZW50IGlkPSJzdWNjZXNzUmF0ZVN0YXR1c0xhYmVsIiBtaW49Ii0yIiBtYXg9Ii0yIiBhdHRyaWJ1dGVzPSIwIi8+CisgICAgICAgICAgICAgICAgICA8RW1wdHlTcGFjZSBtYXg9IjMyNzY3IiBhdHRyaWJ1dGVzPSIwIi8+CisgICAgICAgICAgICAgIDwvR3JvdXA+CisgICAgICAgICAgPC9Hcm91cD4KKyAgICAgICAgPC9EaW1lbnNpb25MYXlvdXQ+CisgICAgICA8L0xheW91dD4KKyAgICAgIDxTdWJDb21wb25lbnRzPgorICAgICAgICA8Q29tcG9uZW50IGNsYXNzPSJqYXZheC5zd2luZy5KTGFiZWwiIG5hbWU9ImZpbmlzaFN0YXR1c0xhYmVsIj4KKyAgICAgICAgICA8UHJvcGVydGllcz4KKyAgICAgICAgICAgIDxQcm9wZXJ0eSBuYW1lPSJ0ZXh0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB2YWx1ZT0iICIvPgorICAgICAgICAgIDwvUHJvcGVydGllcz4KKyAgICAgICAgPC9Db21wb25lbnQ+CisgICAgICAgIDxDb21wb25lbnQgY2xhc3M9ImphdmF4LnN3aW5nLkpMYWJlbCIgbmFtZT0ic3VjY2Vzc1JhdGVTdGF0dXNMYWJlbCI+CisgICAgICAgICAgPFByb3BlcnRpZXM+CisgICAgICAgICAgICA8UHJvcGVydHkgbmFtZT0idGV4dCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdmFsdWU9IiAiLz4KKyAgICAgICAgICA8L1Byb3BlcnRpZXM+CisgICAgICAgIDwvQ29tcG9uZW50PgorICAgICAgPC9TdWJDb21wb25lbnRzPgorICAgIDwvQ29udGFpbmVyPgorICA8L1N1YkNvbXBvbmVudHM+Cis8L0Zvcm0+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9zZXJ2ZXItYXN5bmMtc3RhbmRhbG9uZS9jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9zZXJ2ZXIvYXN5bmMvTWFpbldpbmRvdy5qYXZhIGIvZXhhbXBsZXMvc2VydmVyLWFzeW5jLXN0YW5kYWxvbmUvY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvc2VydmVyL2FzeW5jL01haW5XaW5kb3cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTlkZjRiCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvc2VydmVyLWFzeW5jLXN0YW5kYWxvbmUvY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvc2VydmVyL2FzeW5jL01haW5XaW5kb3cuamF2YQpAQCAtMCwwICsxLDQxMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5zZXJ2ZXIuYXN5bmM7CisKK2ltcG9ydCBqYXZhLmF3dC5Db2xvcjsKK2ltcG9ydCBqYXZhLmF3dC5FdmVudFF1ZXVlOworaW1wb3J0IGphdmEuYXd0LkZsb3dMYXlvdXQ7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5JbnZvY2F0aW9uQ2FsbGJhY2s7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKKworaW1wb3J0IGphdmF4LnN3aW5nLkpMYWJlbDsKKworLyoqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgTWFpbldpbmRvdyBleHRlbmRzIGphdmF4LnN3aW5nLkpGcmFtZSB7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIG5ldyBmb3JtIE1haW5XaW5kb3cKKyAgICAgKi8KKyAgICBwdWJsaWMgTWFpbldpbmRvdygpIHsKKyAgICAgICAgaW5pdENvbXBvbmVudHMoKTsKKworICAgICAgICB1cmlGaWVsZC5zZXRUZXh0KE1haW4uQ29uZmlnLkRFRkFVTFRfQkFTRV9VUkkpOworICAgICAgICAoKEZsb3dMYXlvdXQpIG1lc3NhZ2VQYW5lbC5nZXRMYXlvdXQoKSkuc2V0QWxpZ25tZW50KEZsb3dMYXlvdXQuTEVBRElORyk7CisgICAgICAgIG1lc3NhZ2VQYW5lbC5yZW1vdmVBbGwoKTsKKyAgICAgICAgbWVzc2FnZVBhbmVsLnJldmFsaWRhdGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgZnJvbSB3aXRoaW4gdGhlIGNvbnN0cnVjdG9yIHRvCisgICAgICogaW5pdGlhbGl6ZSB0aGUgZm9ybS4KKyAgICAgKiBXQVJOSU5HOiBEbyBOT1QgbW9kaWZ5IHRoaXMgY29kZS4gVGhlIGNvbnRlbnQgb2YgdGhpcyBtZXRob2QgaXMKKyAgICAgKiBhbHdheXMgcmVnZW5lcmF0ZWQgYnkgdGhlIEZvcm0gRWRpdG9yLgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIC8vIDxlZGl0b3ItZm9sZCBkZWZhdWx0c3RhdGU9ImNvbGxhcHNlZCIgZGVzYz0iR2VuZXJhdGVkIENvZGUiPi8vR0VOLUJFR0lOOmluaXRDb21wb25lbnRzCisgICAgcHJpdmF0ZSB2b2lkIGluaXRDb21wb25lbnRzKCkgeworCisgICAgICAgIHN5bmNBc3luY1N3aXRjaEdyb3VwID0gbmV3IGphdmF4LnN3aW5nLkJ1dHRvbkdyb3VwKCk7CisgICAgICAgIGpQYW5lbDEgPSBuZXcgamF2YXguc3dpbmcuSlBhbmVsKCk7CisgICAgICAgIGpMYWJlbDEgPSBuZXcgamF2YXguc3dpbmcuSkxhYmVsKCk7CisgICAgICAgIHJlcXVlc3RDb3VudEZpZWxkID0gbmV3IGphdmF4LnN3aW5nLkpUZXh0RmllbGQoKTsKKyAgICAgICAgc3luY1JhZGlvID0gbmV3IGphdmF4LnN3aW5nLkpSYWRpb0J1dHRvbigpOworICAgICAgICBhc3luY1JhZGlvID0gbmV3IGphdmF4LnN3aW5nLkpSYWRpb0J1dHRvbigpOworICAgICAgICB1cmlGaWVsZCA9IG5ldyBqYXZheC5zd2luZy5KVGV4dEZpZWxkKCk7CisgICAgICAgIGpMYWJlbDIgPSBuZXcgamF2YXguc3dpbmcuSkxhYmVsKCk7CisgICAgICAgIHJ1bkJ1dHRvbiA9IG5ldyBqYXZheC5zd2luZy5KQnV0dG9uKCk7CisgICAgICAgIG1lc3NhZ2VQYW5lbCA9IG5ldyBqYXZheC5zd2luZy5KUGFuZWwoKTsKKyAgICAgICAgakxhYmVsMyA9IG5ldyBqYXZheC5zd2luZy5KTGFiZWwoKTsKKyAgICAgICAgakxhYmVsNCA9IG5ldyBqYXZheC5zd2luZy5KTGFiZWwoKTsKKyAgICAgICAgalBhbmVsMiA9IG5ldyBqYXZheC5zd2luZy5KUGFuZWwoKTsKKyAgICAgICAgZmluaXNoU3RhdHVzTGFiZWwgPSBuZXcgamF2YXguc3dpbmcuSkxhYmVsKCk7CisgICAgICAgIHN1Y2Nlc3NSYXRlU3RhdHVzTGFiZWwgPSBuZXcgamF2YXguc3dpbmcuSkxhYmVsKCk7CisKKyAgICAgICAgc2V0RGVmYXVsdENsb3NlT3BlcmF0aW9uKGphdmF4LnN3aW5nLldpbmRvd0NvbnN0YW50cy5FWElUX09OX0NMT1NFKTsKKyAgICAgICAgc2V0TWF4aW11bVNpemUobmV3IGphdmEuYXd0LkRpbWVuc2lvbig0ODAsIDYwMCkpOworICAgICAgICBzZXRNaW5pbXVtU2l6ZShuZXcgamF2YS5hd3QuRGltZW5zaW9uKDQ4MCwgNjAwKSk7CisgICAgICAgIHNldFJlc2l6YWJsZShmYWxzZSk7CisKKyAgICAgICAgakxhYmVsMS5zZXRUZXh0KCJOdW1iZXIgb2YgcmVxdWVzdHMiKTsKKworICAgICAgICByZXF1ZXN0Q291bnRGaWVsZC5zZXRIb3Jpem9udGFsQWxpZ25tZW50KGphdmF4LnN3aW5nLkpUZXh0RmllbGQuUklHSFQpOworICAgICAgICByZXF1ZXN0Q291bnRGaWVsZC5zZXRUZXh0KCIxMCIpOworCisgICAgICAgIHN5bmNBc3luY1N3aXRjaEdyb3VwLmFkZChzeW5jUmFkaW8pOworICAgICAgICBzeW5jUmFkaW8uc2V0VGV4dCgic3luYyIpOworCisgICAgICAgIHN5bmNBc3luY1N3aXRjaEdyb3VwLmFkZChhc3luY1JhZGlvKTsKKyAgICAgICAgYXN5bmNSYWRpby5zZXRTZWxlY3RlZCh0cnVlKTsKKyAgICAgICAgYXN5bmNSYWRpby5zZXRUZXh0KCJhc3luYyIpOworCisgICAgICAgIHVyaUZpZWxkLnNldFRleHQoImpUZXh0RmllbGQyIik7CisKKyAgICAgICAgakxhYmVsMi5zZXRUZXh0KCJCYXNlIHdlYiBhcHAgVVJMIik7CisKKyAgICAgICAgcnVuQnV0dG9uLnNldFRleHQoIlJ1biIpOworICAgICAgICBydW5CdXR0b24uYWRkQWN0aW9uTGlzdGVuZXIobmV3IGphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyKCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgYWN0aW9uUGVyZm9ybWVkKGphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50IGV2dCkgeworICAgICAgICAgICAgICAgIHJ1bkJ1dHRvbkFjdGlvblBlcmZvcm1lZChldnQpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBvcmcuamRlc2t0b3AubGF5b3V0Lkdyb3VwTGF5b3V0IGpQYW5lbDFMYXlvdXQgPSBuZXcgb3JnLmpkZXNrdG9wLmxheW91dC5Hcm91cExheW91dChqUGFuZWwxKTsKKyAgICAgICAgalBhbmVsMS5zZXRMYXlvdXQoalBhbmVsMUxheW91dCk7CisgICAgICAgIGpQYW5lbDFMYXlvdXQuc2V0SG9yaXpvbnRhbEdyb3VwKAorICAgICAgICAgICAgICAgIGpQYW5lbDFMYXlvdXQuY3JlYXRlUGFyYWxsZWxHcm91cChvcmcuamRlc2t0b3AubGF5b3V0Lkdyb3VwTGF5b3V0LkxFQURJTkcpCisgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKGpQYW5lbDFMYXlvdXQuY3JlYXRlU2VxdWVudGlhbEdyb3VwKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENvbnRhaW5lckdhcCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoalBhbmVsMUxheW91dC5jcmVhdGVQYXJhbGxlbEdyb3VwKG9yZy5qZGVza3RvcC5sYXlvdXQuR3JvdXBMYXlvdXQuTEVBRElORykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKGpMYWJlbDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChvcmcuamRlc2t0b3AubGF5b3V0Lkdyb3VwTGF5b3V0LlRSQUlMSU5HLCBqTGFiZWwyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFByZWZlcnJlZEdhcChvcmcuamRlc2t0b3AubGF5b3V0LkxheW91dFN0eWxlLlVOUkVMQVRFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChqUGFuZWwxTGF5b3V0LmNyZWF0ZVBhcmFsbGVsR3JvdXAob3JnLmpkZXNrdG9wLmxheW91dC5Hcm91cExheW91dC5MRUFESU5HKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoalBhbmVsMUxheW91dC5jcmVhdGVTZXF1ZW50aWFsR3JvdXAoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChyZXF1ZXN0Q291bnRGaWVsZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRQcmVmZXJyZWRHYXAob3JnLmpkZXNrdG9wLmxheW91dC5MYXlvdXRTdHlsZS5SRUxBVEVEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChzeW5jUmFkaW8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUHJlZmVycmVkR2FwKG9yZy5qZGVza3RvcC5sYXlvdXQuTGF5b3V0U3R5bGUuUkVMQVRFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoYXN5bmNSYWRpbykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoMjQsIDI0LCAyNCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQocnVuQnV0dG9uKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKGpQYW5lbDFMYXlvdXQuY3JlYXRlU2VxdWVudGlhbEdyb3VwKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQodXJpRmllbGQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ29udGFpbmVyR2FwKCkpKSkKKyAgICAgICAgKTsKKyAgICAgICAgalBhbmVsMUxheW91dC5zZXRWZXJ0aWNhbEdyb3VwKAorICAgICAgICAgICAgICAgIGpQYW5lbDFMYXlvdXQuY3JlYXRlUGFyYWxsZWxHcm91cChvcmcuamRlc2t0b3AubGF5b3V0Lkdyb3VwTGF5b3V0LkxFQURJTkcpCisgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKG9yZy5qZGVza3RvcC5sYXlvdXQuR3JvdXBMYXlvdXQuVFJBSUxJTkcsIGpQYW5lbDFMYXlvdXQuY3JlYXRlU2VxdWVudGlhbEdyb3VwKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENvbnRhaW5lckdhcChvcmcuamRlc2t0b3AubGF5b3V0Lkdyb3VwTGF5b3V0LkRFRkFVTFRfU0laRSwgU2hvcnQuTUFYX1ZBTFVFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKGpQYW5lbDFMYXlvdXQuY3JlYXRlUGFyYWxsZWxHcm91cChvcmcuamRlc2t0b3AubGF5b3V0Lkdyb3VwTGF5b3V0LkJBU0VMSU5FKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQodXJpRmllbGQsIG9yZy5qZGVza3RvcC5sYXlvdXQuR3JvdXBMYXlvdXQuUFJFRkVSUkVEX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuamRlc2t0b3AubGF5b3V0Lkdyb3VwTGF5b3V0LkRFRkFVTFRfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5qZGVza3RvcC5sYXlvdXQuR3JvdXBMYXlvdXQuUFJFRkVSUkVEX1NJWkUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChqTGFiZWwyKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFByZWZlcnJlZEdhcChvcmcuamRlc2t0b3AubGF5b3V0LkxheW91dFN0eWxlLlJFTEFURUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoalBhbmVsMUxheW91dC5jcmVhdGVQYXJhbGxlbEdyb3VwKG9yZy5qZGVza3RvcC5sYXlvdXQuR3JvdXBMYXlvdXQuQkFTRUxJTkUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChyZXF1ZXN0Q291bnRGaWVsZCwgb3JnLmpkZXNrdG9wLmxheW91dC5Hcm91cExheW91dC5QUkVGRVJSRURfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5qZGVza3RvcC5sYXlvdXQuR3JvdXBMYXlvdXQuREVGQVVMVF9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmpkZXNrdG9wLmxheW91dC5Hcm91cExheW91dC5QUkVGRVJSRURfU0laRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKGpMYWJlbDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChzeW5jUmFkaW8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChhc3luY1JhZGlvKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQocnVuQnV0dG9uKSkpCisgICAgICAgICk7CisKKyAgICAgICAgbWVzc2FnZVBhbmVsLnNldEJvcmRlcihqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5LmNyZWF0ZUV0Y2hlZEJvcmRlcigpKTsKKworICAgICAgICBqTGFiZWwzLnNldEJhY2tncm91bmQobmV3IGphdmEuYXd0LkNvbG9yKDI1NSwgMjU1LCAwKSk7CisgICAgICAgIGpMYWJlbDMuc2V0VGV4dCgiICAgIik7CisgICAgICAgIGpMYWJlbDMuc2V0VG9vbFRpcFRleHQoIlJ1bm5pbmcuLi4iKTsKKyAgICAgICAgakxhYmVsMy5zZXRCb3JkZXIoamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeS5jcmVhdGVMaW5lQm9yZGVyKG5ldyBqYXZhLmF3dC5Db2xvcigwLCAwLCAwKSkpOworICAgICAgICBqTGFiZWwzLnNldE9wYXF1ZSh0cnVlKTsKKyAgICAgICAgbWVzc2FnZVBhbmVsLmFkZChqTGFiZWwzKTsKKworICAgICAgICBqTGFiZWw0LnNldEJhY2tncm91bmQobmV3IGphdmEuYXd0LkNvbG9yKDI1NSwgMjU1LCAwKSk7CisgICAgICAgIGpMYWJlbDQuc2V0VGV4dCgiICAgIik7CisgICAgICAgIGpMYWJlbDQuc2V0VG9vbFRpcFRleHQoIlJ1bm5pbmcuLi4iKTsKKyAgICAgICAgakxhYmVsNC5zZXRCb3JkZXIoamF2YXguc3dpbmcuQm9yZGVyRmFjdG9yeS5jcmVhdGVMaW5lQm9yZGVyKG5ldyBqYXZhLmF3dC5Db2xvcigwLCAwLCAwKSkpOworICAgICAgICBqTGFiZWw0LnNldE9wYXF1ZSh0cnVlKTsKKyAgICAgICAgbWVzc2FnZVBhbmVsLmFkZChqTGFiZWw0KTsKKworICAgICAgICBmaW5pc2hTdGF0dXNMYWJlbC5zZXRUZXh0KCIgIik7CisKKyAgICAgICAgc3VjY2Vzc1JhdGVTdGF0dXNMYWJlbC5zZXRUZXh0KCIgIik7CisKKyAgICAgICAgb3JnLmpkZXNrdG9wLmxheW91dC5Hcm91cExheW91dCBqUGFuZWwyTGF5b3V0ID0gbmV3IG9yZy5qZGVza3RvcC5sYXlvdXQuR3JvdXBMYXlvdXQoalBhbmVsMik7CisgICAgICAgIGpQYW5lbDIuc2V0TGF5b3V0KGpQYW5lbDJMYXlvdXQpOworICAgICAgICBqUGFuZWwyTGF5b3V0LnNldEhvcml6b250YWxHcm91cCgKKyAgICAgICAgICAgICAgICBqUGFuZWwyTGF5b3V0LmNyZWF0ZVBhcmFsbGVsR3JvdXAob3JnLmpkZXNrdG9wLmxheW91dC5Hcm91cExheW91dC5MRUFESU5HKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChqUGFuZWwyTGF5b3V0LmNyZWF0ZVNlcXVlbnRpYWxHcm91cCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDb250YWluZXJHYXAoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKGpQYW5lbDJMYXlvdXQuY3JlYXRlUGFyYWxsZWxHcm91cChvcmcuamRlc2t0b3AubGF5b3V0Lkdyb3VwTGF5b3V0LkxFQURJTkcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChmaW5pc2hTdGF0dXNMYWJlbCwgb3JnLmpkZXNrdG9wLmxheW91dC5Hcm91cExheW91dC5ERUZBVUxUX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuamRlc2t0b3AubGF5b3V0Lkdyb3VwTGF5b3V0LkRFRkFVTFRfU0laRSwgU2hvcnQuTUFYX1ZBTFVFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoc3VjY2Vzc1JhdGVTdGF0dXNMYWJlbCwgb3JnLmpkZXNrdG9wLmxheW91dC5Hcm91cExheW91dC5ERUZBVUxUX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuamRlc2t0b3AubGF5b3V0Lkdyb3VwTGF5b3V0LkRFRkFVTFRfU0laRSwgU2hvcnQuTUFYX1ZBTFVFKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENvbnRhaW5lckdhcCgpKQorICAgICAgICApOworICAgICAgICBqUGFuZWwyTGF5b3V0LnNldFZlcnRpY2FsR3JvdXAoCisgICAgICAgICAgICAgICAgalBhbmVsMkxheW91dC5jcmVhdGVQYXJhbGxlbEdyb3VwKG9yZy5qZGVza3RvcC5sYXlvdXQuR3JvdXBMYXlvdXQuTEVBRElORykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoalBhbmVsMkxheW91dC5jcmVhdGVTZXF1ZW50aWFsR3JvdXAoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ29udGFpbmVyR2FwKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChmaW5pc2hTdGF0dXNMYWJlbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFByZWZlcnJlZEdhcChvcmcuamRlc2t0b3AubGF5b3V0LkxheW91dFN0eWxlLlJFTEFURUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoc3VjY2Vzc1JhdGVTdGF0dXNMYWJlbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENvbnRhaW5lckdhcChvcmcuamRlc2t0b3AubGF5b3V0Lkdyb3VwTGF5b3V0LkRFRkFVTFRfU0laRSwgU2hvcnQuTUFYX1ZBTFVFKSkKKyAgICAgICAgKTsKKworICAgICAgICBvcmcuamRlc2t0b3AubGF5b3V0Lkdyb3VwTGF5b3V0IGxheW91dCA9IG5ldyBvcmcuamRlc2t0b3AubGF5b3V0Lkdyb3VwTGF5b3V0KGdldENvbnRlbnRQYW5lKCkpOworICAgICAgICBnZXRDb250ZW50UGFuZSgpLnNldExheW91dChsYXlvdXQpOworICAgICAgICBsYXlvdXQuc2V0SG9yaXpvbnRhbEdyb3VwKAorICAgICAgICAgICAgICAgIGxheW91dC5jcmVhdGVQYXJhbGxlbEdyb3VwKG9yZy5qZGVza3RvcC5sYXlvdXQuR3JvdXBMYXlvdXQuTEVBRElORykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQob3JnLmpkZXNrdG9wLmxheW91dC5Hcm91cExheW91dC5UUkFJTElORywgbGF5b3V0LmNyZWF0ZVNlcXVlbnRpYWxHcm91cCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDb250YWluZXJHYXAoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKGxheW91dC5jcmVhdGVQYXJhbGxlbEdyb3VwKG9yZy5qZGVza3RvcC5sYXlvdXQuR3JvdXBMYXlvdXQuVFJBSUxJTkcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChqUGFuZWwyLCBvcmcuamRlc2t0b3AubGF5b3V0Lkdyb3VwTGF5b3V0LkRFRkFVTFRfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5qZGVza3RvcC5sYXlvdXQuR3JvdXBMYXlvdXQuREVGQVVMVF9TSVpFLCBTaG9ydC5NQVhfVkFMVUUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChvcmcuamRlc2t0b3AubGF5b3V0Lkdyb3VwTGF5b3V0LkxFQURJTkcsIGpQYW5lbDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuamRlc2t0b3AubGF5b3V0Lkdyb3VwTGF5b3V0LkRFRkFVTFRfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5qZGVza3RvcC5sYXlvdXQuR3JvdXBMYXlvdXQuREVGQVVMVF9TSVpFLCBTaG9ydC5NQVhfVkFMVUUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChtZXNzYWdlUGFuZWwsIG9yZy5qZGVza3RvcC5sYXlvdXQuR3JvdXBMYXlvdXQuUFJFRkVSUkVEX1NJWkUsIDQ2OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5qZGVza3RvcC5sYXlvdXQuR3JvdXBMYXlvdXQuUFJFRkVSUkVEX1NJWkUpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ29udGFpbmVyR2FwKCkpCisgICAgICAgICk7CisgICAgICAgIGxheW91dC5zZXRWZXJ0aWNhbEdyb3VwKAorICAgICAgICAgICAgICAgIGxheW91dC5jcmVhdGVQYXJhbGxlbEdyb3VwKG9yZy5qZGVza3RvcC5sYXlvdXQuR3JvdXBMYXlvdXQuTEVBRElORykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQobGF5b3V0LmNyZWF0ZVNlcXVlbnRpYWxHcm91cCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDb250YWluZXJHYXAoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKGpQYW5lbDEsIG9yZy5qZGVza3RvcC5sYXlvdXQuR3JvdXBMYXlvdXQuUFJFRkVSUkVEX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmpkZXNrdG9wLmxheW91dC5Hcm91cExheW91dC5ERUZBVUxUX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmpkZXNrdG9wLmxheW91dC5Hcm91cExheW91dC5QUkVGRVJSRURfU0laRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFByZWZlcnJlZEdhcChvcmcuamRlc2t0b3AubGF5b3V0LkxheW91dFN0eWxlLlJFTEFURUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoalBhbmVsMiwgb3JnLmpkZXNrdG9wLmxheW91dC5Hcm91cExheW91dC5QUkVGRVJSRURfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuamRlc2t0b3AubGF5b3V0Lkdyb3VwTGF5b3V0LkRFRkFVTFRfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuamRlc2t0b3AubGF5b3V0Lkdyb3VwTGF5b3V0LlBSRUZFUlJFRF9TSVpFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUHJlZmVycmVkR2FwKG9yZy5qZGVza3RvcC5sYXlvdXQuTGF5b3V0U3R5bGUuUkVMQVRFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChtZXNzYWdlUGFuZWwsIG9yZy5qZGVza3RvcC5sYXlvdXQuR3JvdXBMYXlvdXQuREVGQVVMVF9TSVpFLCA0NTYsIFNob3J0Lk1BWF9WQUxVRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENvbnRhaW5lckdhcCgpKQorICAgICAgICApOworCisgICAgICAgIHBhY2soKTsKKyAgICB9Ly8gPC9lZGl0b3ItZm9sZD4vL0dFTi1FTkQ6aW5pdENvbXBvbmVudHMKKworICAgIHByaXZhdGUgdm9pZCBydW5CdXR0b25BY3Rpb25QZXJmb3JtZWQoamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQgZXZ0KSB7Ly9HRU4tRklSU1Q6ZXZlbnRfcnVuQnV0dG9uQWN0aW9uUGVyZm9ybWVkCisgICAgICAgIGZpbmFsIE1haW4uQ29uZmlnIGNvbmZpZyA9IG5ldyBNYWluLkNvbmZpZyh1cmlGaWVsZC5nZXRUZXh0KCksIHN5bmNSYWRpby5pc1NlbGVjdGVkKCksCisgICAgICAgICAgICAgICAgSW50ZWdlci5wYXJzZUludChyZXF1ZXN0Q291bnRGaWVsZC5nZXRUZXh0KCkpKTsKKyAgICAgICAgcnVuQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOworICAgICAgICBmaW5pc2hTdGF0dXNMYWJlbC5zZXRUZXh0KCIgIik7CisgICAgICAgIHN1Y2Nlc3NSYXRlU3RhdHVzTGFiZWwuc2V0VGV4dCgiICIpOworICAgICAgICBtZXNzYWdlUGFuZWwucmVtb3ZlQWxsKCk7CisgICAgICAgIG1lc3NhZ2VQYW5lbC5yZXZhbGlkYXRlKCk7CisgICAgICAgIG1lc3NhZ2VQYW5lbC5yZXBhaW50KCk7CisgICAgICAgIEV4ZWN1dG9ycy5uZXdTaW5nbGVUaHJlYWRFeGVjdXRvcigpLnN1Ym1pdChuZXcgUnVubmFibGUoKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIHNlbmRNZXNzYWdlcyhjb25maWcpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9Ly9HRU4tTEFTVDpldmVudF9ydW5CdXR0b25BY3Rpb25QZXJmb3JtZWQKKworICAgIC8qKgorICAgICAqIEBwYXJhbSBhcmdzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nIGFyZ3NbXSkgeworICAgICAgICAvKiBTZXQgdGhlIE5pbWJ1cyBsb29rIGFuZCBmZWVsICovCisgICAgICAgIC8vPGVkaXRvci1mb2xkIGRlZmF1bHRzdGF0ZT0iY29sbGFwc2VkIiBkZXNjPSIgTG9vayBhbmQgZmVlbCBzZXR0aW5nIGNvZGUgKG9wdGlvbmFsKSAiPgorICAgICAgICAvKiBJZiBOaW1idXMgKGludHJvZHVjZWQgaW4gSmF2YSBTRSA2KSBpcyBub3QgYXZhaWxhYmxlLCBzdGF5IHdpdGggdGhlIGRlZmF1bHQgbG9vayBhbmQgZmVlbC4KKyAgICAgICAgICogRm9yIGRldGFpbHMgc2VlIGh0dHA6Ly9kb3dubG9hZC5vcmFjbGUuY29tL2phdmFzZS90dXRvcmlhbC91aXN3aW5nL2xvb2thbmRmZWVsL3BsYWYuaHRtbAorICAgICAgICAgKi8KKy8vICAgICAgICB0cnkgeworLy8gICAgICAgICAgICBmb3IgKGphdmF4LnN3aW5nLlVJTWFuYWdlci5Mb29rQW5kRmVlbEluZm8gaW5mbyA6IGphdmF4LnN3aW5nLlVJTWFuYWdlci5nZXRJbnN0YWxsZWRMb29rQW5kRmVlbHMoKSkgeworLy8gICAgICAgICAgICAgICAgaWYgKCJOaW1idXMiLmVxdWFscyhpbmZvLmdldE5hbWUoKSkpIHsKKy8vICAgICAgICAgICAgICAgICAgICBqYXZheC5zd2luZy5VSU1hbmFnZXIuc2V0TG9va0FuZEZlZWwoaW5mby5nZXRDbGFzc05hbWUoKSk7CisvLyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisvLyAgICAgICAgICAgICAgICB9CisvLyAgICAgICAgICAgIH0KKy8vICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGV4KSB7CisvLyAgICAgICAgICAgIGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlci5nZXRMb2dnZXIoTWFpbldpbmRvdy5jbGFzcy5nZXROYW1lKCkpLmxvZyhqYXZhLnV0aWwubG9nZ2luZy5MZXZlbC5TRVZFUkUsIG51bGwsIGV4KTsKKy8vICAgICAgICB9IGNhdGNoIChJbnN0YW50aWF0aW9uRXhjZXB0aW9uIGV4KSB7CisvLyAgICAgICAgICAgIGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlci5nZXRMb2dnZXIoTWFpbldpbmRvdy5jbGFzcy5nZXROYW1lKCkpLmxvZyhqYXZhLnV0aWwubG9nZ2luZy5MZXZlbC5TRVZFUkUsIG51bGwsIGV4KTsKKy8vICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7CisvLyAgICAgICAgICAgIGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlci5nZXRMb2dnZXIoTWFpbldpbmRvdy5jbGFzcy5nZXROYW1lKCkpLmxvZyhqYXZhLnV0aWwubG9nZ2luZy5MZXZlbC5TRVZFUkUsIG51bGwsIGV4KTsKKy8vICAgICAgICB9IGNhdGNoIChqYXZheC5zd2luZy5VbnN1cHBvcnRlZExvb2tBbmRGZWVsRXhjZXB0aW9uIGV4KSB7CisvLyAgICAgICAgICAgIGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlci5nZXRMb2dnZXIoTWFpbldpbmRvdy5jbGFzcy5nZXROYW1lKCkpLmxvZyhqYXZhLnV0aWwubG9nZ2luZy5MZXZlbC5TRVZFUkUsIG51bGwsIGV4KTsKKy8vICAgICAgICB9CisgICAgICAgIC8vPC9lZGl0b3ItZm9sZD4KKworICAgICAgICAvKiBDcmVhdGUgYW5kIGRpc3BsYXkgdGhlIGZvcm0gKi8KKyAgICAgICAgamF2YS5hd3QuRXZlbnRRdWV1ZS5pbnZva2VMYXRlcihuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgZmluYWwgTWFpbldpbmRvdyBtYWluV2luZG93ID0gbmV3IE1haW5XaW5kb3coKTsKKyAgICAgICAgICAgICAgICBtYWluV2luZG93LnNldExvY2F0aW9uUmVsYXRpdmVUbyhudWxsKTsKKyAgICAgICAgICAgICAgICBtYWluV2luZG93LnNldFZpc2libGUodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIC8vIFZhcmlhYmxlcyBkZWNsYXJhdGlvbiAtIGRvIG5vdCBtb2RpZnkvL0dFTi1CRUdJTjp2YXJpYWJsZXMKKyAgICBwcml2YXRlIGphdmF4LnN3aW5nLkpSYWRpb0J1dHRvbiBhc3luY1JhZGlvOworICAgIHByaXZhdGUgamF2YXguc3dpbmcuSkxhYmVsIGZpbmlzaFN0YXR1c0xhYmVsOworICAgIHByaXZhdGUgamF2YXguc3dpbmcuSkxhYmVsIGpMYWJlbDE7CisgICAgcHJpdmF0ZSBqYXZheC5zd2luZy5KTGFiZWwgakxhYmVsMjsKKyAgICBwcml2YXRlIGphdmF4LnN3aW5nLkpMYWJlbCBqTGFiZWwzOworICAgIHByaXZhdGUgamF2YXguc3dpbmcuSkxhYmVsIGpMYWJlbDQ7CisgICAgcHJpdmF0ZSBqYXZheC5zd2luZy5KUGFuZWwgalBhbmVsMTsKKyAgICBwcml2YXRlIGphdmF4LnN3aW5nLkpQYW5lbCBqUGFuZWwyOworICAgIHByaXZhdGUgamF2YXguc3dpbmcuSlBhbmVsIG1lc3NhZ2VQYW5lbDsKKyAgICBwcml2YXRlIGphdmF4LnN3aW5nLkpUZXh0RmllbGQgcmVxdWVzdENvdW50RmllbGQ7CisgICAgcHJpdmF0ZSBqYXZheC5zd2luZy5KQnV0dG9uIHJ1bkJ1dHRvbjsKKyAgICBwcml2YXRlIGphdmF4LnN3aW5nLkpMYWJlbCBzdWNjZXNzUmF0ZVN0YXR1c0xhYmVsOworICAgIHByaXZhdGUgamF2YXguc3dpbmcuQnV0dG9uR3JvdXAgc3luY0FzeW5jU3dpdGNoR3JvdXA7CisgICAgcHJpdmF0ZSBqYXZheC5zd2luZy5KUmFkaW9CdXR0b24gc3luY1JhZGlvOworICAgIHByaXZhdGUgamF2YXguc3dpbmcuSlRleHRGaWVsZCB1cmlGaWVsZDsKKyAgICAvLyBFbmQgb2YgdmFyaWFibGVzIGRlY2xhcmF0aW9uLy9HRU4tRU5EOnZhcmlhYmxlcworCisgICAgcHJpdmF0ZSBmaW5hbCBDb2xvciBQUk9HUkVTU19DT0xPUiA9IG5ldyBDb2xvcigyNTUsIDI1NSwgMCk7CisgICAgcHJpdmF0ZSBmaW5hbCBDb2xvciBFUlJPUl9DT0xPUiA9IG5ldyBDb2xvcigyNTUsIDAsIDApOworICAgIHByaXZhdGUgZmluYWwgQ29sb3IgU1VDQ0VTU19DT0xPUiA9IG5ldyBDb2xvcigwLCAyNTUsIDApOworCisgICAgcHJpdmF0ZSBKTGFiZWwgY3JlYXRlUmVxdWVzdFN0YXR1c0xhYmVsKCkgeworICAgICAgICBmaW5hbCBKTGFiZWwgbGFiZWwgPSBuZXcgSkxhYmVsKCIgICAiKTsKKyAgICAgICAgaW52b2tlQW5kV2FpdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKworICAgICAgICAgICAgICAgIGxhYmVsLnNldEJhY2tncm91bmQoUFJPR1JFU1NfQ09MT1IpOworICAgICAgICAgICAgICAgIGxhYmVsLnNldFRvb2xUaXBUZXh0KCJSdW5uaW5nLi4uIik7CisgICAgICAgICAgICAgICAgbGFiZWwuc2V0Qm9yZGVyKGphdmF4LnN3aW5nLkJvcmRlckZhY3RvcnkuY3JlYXRlTGluZUJvcmRlcihuZXcgQ29sb3IoMCwgMCwgMCkpKTsKKyAgICAgICAgICAgICAgICBsYWJlbC5zZXRPcGFxdWUodHJ1ZSk7CisKKyAgICAgICAgICAgICAgICBtZXNzYWdlUGFuZWwuYWRkKGxhYmVsKTsKKyAgICAgICAgICAgICAgICBtZXNzYWdlUGFuZWwucmV2YWxpZGF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICByZXR1cm4gbGFiZWw7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGludm9rZUFuZFdhaXQoUnVubmFibGUgZXZlbnQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEV2ZW50UXVldWUuaW52b2tlQW5kV2FpdChldmVudCk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZW5kTWVzc2FnZXMoZmluYWwgTWFpbi5Db25maWcgY29uZmlnKSB7CisgICAgICAgIC8vIENyZWF0aW5nIEpBWC1SUyBjbGllbnQKKyAgICAgICAgZmluYWwgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KCk7CisgICAgICAgIC8vIFRhcmdldGluZyBlY2hvIHJlc291cmNlIGF0IFVSSSAiPGJhc2VVcmk+L2xvbmctcnVubmluZy8oc3luY3xhc3luYykve2VjaG99IgorICAgICAgICBmaW5hbCBXZWJUYXJnZXQgZWNob1Jlc291cmNlID0gY2xpZW50LnRhcmdldChjb25maWcuYmFzZVVyaSkucGF0aCgibG9uZy1ydW5uaW5nL3ttb2RlfS97ZWNob30iKQorICAgICAgICAgICAgICAgIC5yZXNvbHZlVGVtcGxhdGUoIm1vZGUiLCAoY29uZmlnLnN5bmMpID8gInN5bmMiIDogImFzeW5jIik7CisKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goY29uZmlnLnJlcXVlc3RzKTsKKyAgICAgICAgZmluYWwgQXRvbWljSW50ZWdlciByZXF1ZXN0Q291bnRlciA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOworCisgICAgICAgIGZpbmFsIGxvbmcgdGljID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29uZmlnLnJlcXVlc3RzOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIGludCByZXFJZCA9IGk7CisKKyAgICAgICAgICAgIGZpbmFsIEpMYWJlbCByZXF1ZXN0U3RhdHVzTGFiZWwgPSBjcmVhdGVSZXF1ZXN0U3RhdHVzTGFiZWwoKTsKKworICAgICAgICAgICAgZWNob1Jlc291cmNlLnJlc29sdmVUZW1wbGF0ZSgiZWNobyIsIHJlcUlkKS5yZXF1ZXN0KCkuYXN5bmMoKS5nZXQobmV3IEludm9jYXRpb25DYWxsYmFjazxTdHJpbmc+KCkgeworICAgICAgICAgICAgICAgIHByaXZhdGUgZmluYWwgQXRvbWljSW50ZWdlciByZXRyaWVzID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBjb21wbGV0ZWQoZmluYWwgU3RyaW5nIHJlc3BvbnNlKSB7CisgICAgICAgICAgICAgICAgICAgIGludm9rZUFuZFdhaXQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJlcXVlc3RJZCA9IEludGVnZXIudG9TdHJpbmcocmVxSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0SWQuZXF1YWxzKHJlc3BvbnNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0U3RhdHVzTGFiZWwuc2V0QmFja2dyb3VuZChTVUNDRVNTX0NPTE9SKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFN0YXR1c0xhYmVsLnNldFRvb2xUaXBUZXh0KHJlcXVlc3RJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RDb3VudGVyLmluY3JlbWVudEFuZEdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RTdGF0dXNMYWJlbC5zZXRCYWNrZ3JvdW5kKEVSUk9SX0NPTE9SKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFN0YXR1c0xhYmVsLnNldFRvb2xUaXBUZXh0KFN0cmluZy5mb3JtYXQoIkVjaG8gcmVzcG9uc2UgJyVzJyBub3QgZXF1YWwgdG8gcmVxdWVzdCAnJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZSwgcmVxdWVzdElkKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBmYWlsZWQoZmluYWwgVGhyb3dhYmxlIGVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvci5nZXRDYXVzZSgpIGluc3RhbmNlb2YgSU9FeGNlcHRpb24gJiYgcmV0cmllcy5nZXRBbmRJbmNyZW1lbnQoKSA8IDMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2VuZAorICAgICAgICAgICAgICAgICAgICAgICAgZWNob1Jlc291cmNlLnJlc29sdmVUZW1wbGF0ZSgiZWNobyIsIHJlcUlkKS5yZXF1ZXN0KCkuYXN5bmMoKS5nZXQodGhpcyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnZva2VBbmRXYWl0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RTdGF0dXNMYWJlbC5zZXRCYWNrZ3JvdW5kKEVSUk9SX0NPTE9SKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFN0YXR1c0xhYmVsLnNldFRvb2xUaXBUZXh0KFN0cmluZy5mb3JtYXQoIlJlcXVlc3QgJyVkJyBoYXMgZmFpbGVkOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxSWQsIGVycm9yLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpZiAoIWxhdGNoLmF3YWl0KDYwLCBUaW1lVW5pdC5TRUNPTkRTKSkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV2FpdGluZyBmb3IgcmVxdWVzdHMgdG8gY29tcGxldGUgaGFzIHRpbWVkIG91dC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJXYWl0aW5nIGZvciByZXF1ZXN0cyB0byBjb21wbGV0ZSBoYXMgYmVlbiBpbnRlcnJ1cHRlZC4iKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBsb25nIHRvYyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworCisgICAgICAgIGludm9rZUFuZFdhaXQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgZmluaXNoU3RhdHVzTGFiZWwuc2V0VGV4dChTdHJpbmcuZm9ybWF0KCJFeGVjdXRpb24gZmluaXNoZWQgaW4gJWQgbXMuIiwgdG9jIC0gdGljKSk7CisgICAgICAgICAgICAgICAgc3VjY2Vzc1JhdGVTdGF0dXNMYWJlbC5zZXRUZXh0KFN0cmluZy5mb3JtYXQoIlN1Y2Nlc3MgcmF0ZTogJTYuMmYgJSUiLAorICAgICAgICAgICAgICAgICAgICAgICAgKChkb3VibGUpIHJlcXVlc3RDb3VudGVyLmdldCgpIC8gY29uZmlnLnJlcXVlc3RzKSAqIDEwMCkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgY2xpZW50LmNsb3NlKCk7CisKKyAgICAgICAgRXZlbnRRdWV1ZS5pbnZva2VMYXRlcihuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBydW5CdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc2VydmVyLWFzeW5jLXN0YW5kYWxvbmUvY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvc2VydmVyL2FzeW5jL01haW5UZXN0LmphdmEgYi9leGFtcGxlcy9zZXJ2ZXItYXN5bmMtc3RhbmRhbG9uZS9jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9zZXJ2ZXIvYXN5bmMvTWFpblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODI2ZTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvc2VydmVyLWFzeW5jLXN0YW5kYWxvbmUvY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvc2VydmVyL2FzeW5jL01haW5UZXN0LmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5zZXJ2ZXIuYXN5bmM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdCB3aGV0aGVyIGNhc2VzIGRlc2NyaWJlZCBpbiB7QGNvZGUgUkVBRE1FfSBhcmUgcGFzc2luZy4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIE1haW5UZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN5bmMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIE1haW4ucnVuQ2xpZW50KG5ldyBTdHJpbmdbXXsicmVxPTEwIiwgIm1vZGU9c3luYyJ9KSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIE1haW4ucnVuQ2xpZW50KG5ldyBTdHJpbmdbXXsicmVxPTEwIiwgIm1vZGU9YXN5bmMifSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFzeW5jV3JvbmdVcmkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBNYWluLnJ1bkNsaWVudChuZXcgU3RyaW5nW117InJlcT0xIiwgIm1vZGU9YXN5bmMiLCAidXJpPWh0dHA6Ly9mb28uYmFyIn0pKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTeW5jV3JvbmdVcmkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBNYWluLnJ1bkNsaWVudChuZXcgU3RyaW5nW117InJlcT0xIiwgIm1vZGU9c3luYyIsICJ1cmk9aHR0cDovL2Zvby5iYXIifSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3NlcnZlci1hc3luYy1zdGFuZGFsb25lL3BvbS54bWwgYi9leGFtcGxlcy9zZXJ2ZXItYXN5bmMtc3RhbmRhbG9uZS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0YzNlOGEKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zZXJ2ZXItYXN5bmMtc3RhbmRhbG9uZS9wb20ueG1sCkBAIC0wLDAgKzEsNDggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5zZXJ2ZXItYXN5bmMtc3RhbmRhbG9uZTwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS1leGFtcGxlcy1zZXJ2ZXItYXN5bmMtc3RhbmRhbG9uZTwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5TdGFuZGFsb25lIEplcnNleSBKQVgtUlMgYXN5bmNocm9ub3VzIHNlcnZlci1zaWRlIHByb2Nlc3NpbmcgZXhhbXBsZS48L2Rlc2NyaXB0aW9uPgorCisgICAgPG1vZHVsZXM+CisgICAgICAgIDxtb2R1bGU+Y2xpZW50PC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+d2ViYXBwPC9tb2R1bGU+CisgICAgPC9tb2R1bGVzPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5yZWxlYXNlPC9pZD4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3NlcnZlci1hc3luYy1zdGFuZGFsb25lL3dlYmFwcC9wb20ueG1sIGIvZXhhbXBsZXMvc2VydmVyLWFzeW5jLXN0YW5kYWxvbmUvd2ViYXBwL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJiYzFiOAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3NlcnZlci1hc3luYy1zdGFuZGFsb25lL3dlYmFwcC9wb20ueG1sCkBAIC0wLDAgKzEsNTYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisKKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+c2VydmVyLWFzeW5jLXN0YW5kYWxvbmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5zZXJ2ZXItYXN5bmMtc3RhbmRhbG9uZS13ZWJhcHA8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktZXhhbXBsZXMtc2VydmVyLWFzeW5jLXN0YW5kYWxvbmUtd2ViYXBwPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPlN0YW5kYWxvbmUgSmVyc2V5IEpBWC1SUyBhc3luY2hyb25vdXMgc2VydmVyLXNpZGUgcHJvY2Vzc2luZyBleGFtcGxlIHdlYiBhcHBsaWNhdGlvbi48L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5yZWxlYXNlPC9pZD4KKyAgICAgICAgICAgIDwhLS0gZG8gbm90IGNyZWF0ZSBzb3VyY2UgemlwIGJ1bmRsZXMgLS0+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2tpcEFzc2VtYmx5PnRydWU8L3NraXBBc3NlbWJseT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3NlcnZlci1hc3luYy1zdGFuZGFsb25lL3dlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3NlcnZlci9hc3luYy9Bc3luY0pheHJzQXBwbGljYXRpb24uamF2YSBiL2V4YW1wbGVzL3NlcnZlci1hc3luYy1zdGFuZGFsb25lL3dlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3NlcnZlci9hc3luYy9Bc3luY0pheHJzQXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDVmMzI3Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvc2VydmVyLWFzeW5jLXN0YW5kYWxvbmUvd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvc2VydmVyL2FzeW5jL0FzeW5jSmF4cnNBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuc2VydmVyLmFzeW5jOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CisKKy8qKgorICogSmVyc2V5IEFzeW5jIFdlYmFwcCBhcHBsaWNhdGlvbiBjbGFzcy4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitAQXBwbGljYXRpb25QYXRoKCIvIikKK3B1YmxpYyBjbGFzcyBBc3luY0pheHJzQXBwbGljYXRpb24gZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICBmaW5hbCBIYXNoU2V0PENsYXNzPD8+PiBjbGFzc2VzID0gbmV3IEhhc2hTZXQ8Q2xhc3M8Pz4+KCk7CisgICAgICAgIGNsYXNzZXMuYWRkKExvbmdSdW5uaW5nRWNob1Jlc291cmNlLmNsYXNzKTsKKworICAgICAgICByZXR1cm4gY2xhc3NlczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PE9iamVjdD4gZ2V0U2luZ2xldG9ucygpIHsKKyAgICAgICAgZmluYWwgSGFzaFNldDxPYmplY3Q+IGluc3RhbmNlcyA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKTsKKworICAgICAgICBpbnN0YW5jZXMuYWRkKG5ldyBMb2dnaW5nRmVhdHVyZShMb2dnZXIuZ2V0TG9nZ2VyKEFzeW5jSmF4cnNBcHBsaWNhdGlvbi5jbGFzcy5nZXROYW1lKCkpLAorICAgICAgICAgICAgICAgIExvZ2dpbmdGZWF0dXJlLlZlcmJvc2l0eS5QQVlMT0FEX0FOWSkpOworCisgICAgICAgIHJldHVybiBpbnN0YW5jZXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc2VydmVyLWFzeW5jLXN0YW5kYWxvbmUvd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvc2VydmVyL2FzeW5jL0xvbmdSdW5uaW5nRWNob1Jlc291cmNlLmphdmEgYi9leGFtcGxlcy9zZXJ2ZXItYXN5bmMtc3RhbmRhbG9uZS93ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9zZXJ2ZXIvYXN5bmMvTG9uZ1J1bm5pbmdFY2hvUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmQwMTZiCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvc2VydmVyLWFzeW5jLXN0YW5kYWxvbmUvd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvc2VydmVyL2FzeW5jL0xvbmdSdW5uaW5nRWNob1Jlc291cmNlLmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5zZXJ2ZXIuYXN5bmM7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLlNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQXN5bmNSZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuU3VzcGVuZGVkOworCisvKioKKyAqIEV4YW1wbGUgb2YgYSBzaW1wbGUgcmVzb3VyY2Ugd2l0aCBhIGxvbmctcnVubmluZyBvcGVyYXRpb24gZXhlY3V0ZWQgaW4gYQorICogY3VzdG9tIGFwcGxpY2F0aW9uIHRocmVhZC4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgibG9uZy1ydW5uaW5nIikKK0BQcm9kdWNlcygidGV4dC9wbGFpbiIpCitwdWJsaWMgY2xhc3MgTG9uZ1J1bm5pbmdFY2hvUmVzb3VyY2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNMRUVQX1RJTUVfSU5fTUlMTElTID0gMTAwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBFeGVjdXRvclNlcnZpY2UgVEFTS19FWEVDVVRPUiA9IEV4ZWN1dG9ycy5uZXdDYWNoZWRUaHJlYWRQb29sKCk7CisKKyAgICAvKioKKyAgICAgKiBTeW5jaHJvbm91c2x5IGVjaG8gdGhlIGxhc3QgcGF0aCBzZWdtZW50IGFmdGVyIHNsZWVwaW5nIGZvciBhIGxvbmcgdGltZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlY2hvIG1lc3NhZ2UgdG8gZWNoby4KKyAgICAgKiBAcmV0dXJuIGVjaG9lZCBtZXNzYWdlLgorICAgICAqLworICAgIEBHRVQKKyAgICBAUGF0aCgic3luYy97ZWNob30iKQorICAgIHB1YmxpYyBTdHJpbmcgc3luY0VjaG8oQFBhdGhQYXJhbSgiZWNobyIpIGZpbmFsIFN0cmluZyBlY2hvKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0xFRVBfVElNRV9JTl9NSUxMSVMpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlY2hvOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzeW5jaHJvbm91c2x5IGVjaG8gdGhlIGxhc3QgcGF0aCBzZWdtZW50IGFmdGVyIHNsZWVwaW5nIGZvciBhIGxvbmcgdGltZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlY2hvIG1lc3NhZ2UgdG8gZWNoby4KKyAgICAgKiBAcGFyYW0gYXIgQXN5bmNocm9ub3VzUmVzcG9uc2UsIHdpbGwgY29udGFpbiBlY2hvZWQgbWVzc2FnZS4KKyAgICAgKi8KKyAgICBAR0VUCisgICAgQFBhdGgoImFzeW5jL3tlY2hvfSIpCisgICAgcHVibGljIHZvaWQgYXN5bmNFY2hvKEBQYXRoUGFyYW0oImVjaG8iKSBmaW5hbCBTdHJpbmcgZWNobywgQFN1c3BlbmRlZCBmaW5hbCBBc3luY1Jlc3BvbnNlIGFyKSB7CisgICAgICAgIFRBU0tfRVhFQ1VUT1Iuc3VibWl0KG5ldyBSdW5uYWJsZSgpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKFNMRUVQX1RJTUVfSU5fTUlMTElTKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICBhci5jYW5jZWwoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXIucmVzdW1lKGVjaG8pOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9zZXJ2ZXItYXN5bmMtc3RhbmRhbG9uZS93ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL2V4YW1wbGVzL3NlcnZlci1hc3luYy1zdGFuZGFsb25lL3dlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNjM4MTUKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zZXJ2ZXItYXN5bmMtc3RhbmRhbG9uZS93ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDMyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCisgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfM18wLnhzZCIKKyAgICAgICAgIHZlcnNpb249IjMuMCI+CisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+YXN5bmMtYXBwPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC53cy5ycy5BcHBsaWNhdGlvbjwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5zZXJ2ZXIuYXN5bmMuQXN5bmNKYXhyc0FwcGxpY2F0aW9uPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICAgICAgPGFzeW5jLXN1cHBvcnRlZD50cnVlPC9hc3luYy1zdXBwb3J0ZWQ+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+YXN5bmMtYXBwPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9zZXJ2ZXItYXN5bmMvUkVBRE1FLk1EIGIvZXhhbXBsZXMvc2VydmVyLWFzeW5jL1JFQURNRS5NRApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjRkMTgwCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvc2VydmVyLWFzeW5jL1JFQURNRS5NRApAQCAtMCwwICsxLDgwIEBACitbLy9dOiAjICIgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICIKK1svL106ICMgIiAiCitbLy9dOiAjICIgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlICIKK1svL106ICMgIiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCAiCitbLy9dOiAjICIgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLiAiCitbLy9dOiAjICIgIgorWy8vXTogIyAiIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UgIgorCitTZXJ2ZXIgQXN5bmNocm9ub3VzIEV4YW1wbGUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgZnVsbCBkZXNjcmlwdGlvbiBob3cgdG8gY3JlYXRlIGFuIGFzeW5jaHJvbm91cyByZXNvdXJjZSBjYW4gYmUgZm91bmQgaW4gSmVyc2V5IFVzZXIgR3VpZGUsIGNoYXB0ZXIgCitbQXN5bmNocm9ub3VzIFNlcnZpY2VzIGFuZCBDbGllbnRzXShodHRwczovL2plcnNleS5qYXZhLm5ldC9kb2N1bWVudGF0aW9uL2xhdGVzdC9hc3luYy5odG1sKS4KKworVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyBKQVgtUlMgMi4wIHNlcnZlci1zaWRlIG5vbi1ibG9ja2luZyBBUEkgaW4gY29tcGFyaXNvbiB0byBibG9ja2luZyBhbmQgbG9uZy1ydW5uaW5nCithc3luY2hyb25vdXMgb3BlcmF0aW9ucy4KKworVGhlICBnb2FsIG9mIHRoZSBzYW1wbGUgaXMgdG8gZGVtb25zdHJhdGUgdGhhdCB3aXRoIGxpbWl0ZWQgSS9PIHByb2Nlc3NpbmcgdGhyZWFkcworb24gdGhlIHNlcnZlciB0aGUgc3luY2hyb25vdXMgZXhlY3V0aW9uIG9mIGEgbG9uZy1ydW5uaW5nIHRhc2sgbWF5IGxlYWQgdG8gcmVzb3VyY2UKK3N0YXJ2YXRpb24gY2F1c2VkIGJ5IEkvTyBwcm9jZXNzaW5nIHRocmVhZHMgYmVpbmcgYmxvY2tlZCBieSB0aGUgbG9uZy1ydW5uaW5nCitvcGVyYXRpb24sIHVuYWJsZSB0byBzZXJ2ZSBuZXcgaW5jb21pbmcgcmVxdWVzdHMuCisKK09UT0gsIHdoZW4gdGhlIHNhbWUgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbiBpcyBleGVjdXRlZCBhc3luY2hyb25vdXNseSwgdGhlIEkvTwordGhyZWFkcyBkbyBub3QgbmVlZCB0byBibG9jayB3aGlsZSB3YWl0aW5nIGZvciB0aGUgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbiB0byBmaW5pc2gKK2FuZCB0aGUgb3ZlcmFsbCB0aHJvdWdocHV0IG9mIHRoZSBzeXN0ZW0gaXMgZ3JlYXRseSBpbmNyZWFzZWQuCisKK0NvbnRlbnRzCistLS0tLS0tLQorCitUaGUgbWFwcGluZyBvZiB0aGUgVVJJIHBhdGggc3BhY2UgaXMgcHJlc2VudGVkIGluIHRoZSBmb2xsb3dpbmcgdGFibGU6CisKK1VSSSBwYXRoICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFJlc291cmNlIGNsYXNzICAgICAgICAgICAgfCBIVFRQIG1ldGhvZHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCAtLS0tLS0tLS0tLS0tLQorKipfYXN5bmMvbWVzc2FnaW5nL2ZpcmVBbmRGb3JnZXRfKiogIHwgRmlyZUFuZEZvcmdldENoYXRSZXNvdXJjZSB8IFBPU1QxCisqKl9hc3luYy9tZXNzYWdpbmcvZmlyZUFuZEZvcmdldF8qKiAgfCBGaXJlQW5kRm9yZ2V0Q2hhdFJlc291cmNlIHwgR0VUCisqKl9hc3luYy9tZXNzYWdpbmcvYmxvY2tpbmdfKiogICAgICAgfCBCbG9ja2luZ1Bvc3RDaGF0UmVzb3VyY2UgIHwgUE9TVAorKipfYXN5bmMvbWVzc2FnaW5nL2Jsb2NraW5nXyoqICAgICAgIHwgQmxvY2tpbmdQb3N0Q2hhdFJlc291cmNlICB8IEdFVAorKipfYXN5bmMvbG9uZ3J1bm5pbmdfKiogICAgICAgICAgICAgIHwgU2ltcGxlTG9uZ1J1bm5pbmdSZXNvdXJjZSB8IEdFVAorCitTYW1wbGUgUmVzcG9uc2UKKy0tLS0tLS0tLS0tLS0tLQorCitUaGlzIHNlY3Rpb24gc2hvcnRseSBkZXNjcmliZXMgYSBtYWluIGRpZmZlcmVuY2UgYmV0d2VlbiBibG9ja2luZyBhbmQgbm9uLWJsb2NraW5nIGFwcHJvYWNoIGltcGxlbWVudGVkCitpbiB0aGUgZXhhbXBsZS4KKworIyMjIyBCbG9ja2luZyBBcHByb2FjaAorCitGaXJzdCB5b3UgaGF2ZSB0byBzZW50IFBPU1QgcmVxdWVzdCB3aGljaCBpcyBzaG93biBiZWxvdyBhbmQgcmVwZWF0IHRoaXMgY2FsbCA1LXRpbWVzLgorCis+ICAgICBjdXJsIC12IC1YIFBPU1QgaHR0cDovL2xvY2FsaG9zdDo4MDgwL2Jhc2UvYXN5bmMvbWVzc2FnaW5nL2Jsb2NraW5nIC1IICJDb250ZW50LVR5cGU6IHRleHQvcGxhaW4iIC1kICJNeSBtZXNzYWdlIgorCitBbGwgcHJldmlvdXMgcmVxdWVzdHMgd2VyZSBwcm9jZXNzZWQgdXNpbmcgSS9PIENvbnRhaW5lciB0aHJlYWRzLCB0aGVyZSB3YXMgbm8gcHJvYmxlbSB3aXRoCithIHJldHVybmluZyByZXNwb25zZSBhbmQgYSByZXNwb25zZSdzIGRlbGF5IHVudGlsIG5vdy4gQnV0IGlmIHlvdSBydW4gdGhlIDYtdGggY2FsbCwgdGhlIHNlcnZlciB3aWxsCitiZSBibG9ja2VkLiBBdCB0aGlzIHRpbWUgSS9PIHRocmVhZCBpcyBibG9ja2VkIChiZWNhdXNlIG9mIEFycmF5QmxvY2tpbmdRdWV1ZSBpcyBmdWxsKSBhbmQgd2FpdHMgZm9yCit0aGUgY2FsbCB3aGljaCBzaG91bGQgcmVhZCBhbmQgcmVtb3ZlIG9uZSBvZiB0aGUgc2F2ZWQgbWVzc2FnZXMuIE9uY2UgdGhlIGEgYmVsb3cgbWVudGlvbmVkCityZXF1ZXN0IGlzIGNhbGxlZCwgdGhlIEJsb2NraW5nIGhhcyBwbGFjZSBmb3IgYW5vdGhlciBtZXNzYWdlIGFuZCB3YWl0aW5nIHRocmVhZCBpcyBwcm9jZXNzZWQuCisKKz4gICAgIGN1cmwgLXYgLVggR0VUIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9iYXNlL2FzeW5jL21lc3NhZ2luZy9ibG9ja2luZworCisjIyMjIE5vbi1ibG9ja2luZyBBcHByb2FjaAorCitXZSBjYW4gc3RhcnQgd2l0aCB0aGUgc2FtZSBwcm9jZWR1cmUgYXMgaW4gcHJldmlvdXMgYXBwcm9hY2guIFNlbnQgdGhlIFBPU1QgcmVxdWVzdCBzaG93biBiZWxvdyA1LXRpbWVzCisKKz4gICAgIGN1cmwgLXYgLVggUE9TVCBodHRwOi8vbG9jYWxob3N0OjgwODAvYmFzZS9hc3luYy9tZXNzYWdpbmcvZmlyZUFuZEZvcmdldCAtSCAiQ29udGVudC1UeXBlOiB0ZXh0L3BsYWluIiAtZCAiTXkgbWVzc2FnZSIKKworQXQgdGhpcyB0aW1lIGJsb2NraW5nIHF1ZXVlIGluIHJlc291cmNlIHNob3VsZCBiZSBmdWxsLCBidXQgaWYgeW91IHNlbmQgYW5vdGhlciByZXF1ZXN0LCB0aGUgY2xpZW50IGFwcGxpY2F0aW9uIHdvbid0CitiZSBibG9ja2VkIGFuZCB3aWxsIHJlY2VpdmUgdGhlIGdpdmVuIHJlc3BvbnNlIGltbWVkaWF0ZWx5LiBTaW5jZSB0aGUgc2VydmVyIGFwcGxpY2F0aW9uIGRvZXNuJ3QgYmxvY2sgdGhlIEkvTyB0aHJlYWQKK2J1dCBibG9ja3MgYSB0aHJlYWQgd2hpY2ggaXMgZGVkaWNhdGVkIGZvciBwcm9jZXNzaW5nIHRoZSByZXF1ZXN0LiBBZnRlciB0aGUgR0VUIGNhbGwsIHRoZSBibG9ja2VkIGRlZGljYXRlZCB0aHJlYWQKK2lzIHByb2Nlc3NlZCBhbmQgcmV0dXJuZWQgdG8gYSBjYWNoZWQgdGhyZWFkIHBvb2wuCisKKz4gICAgIGN1cmwgLXYgLVggR0VUIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9iYXNlL2FzeW5jL21lc3NhZ2luZy9maXJlQW5kRm9yZ2V0CisKK1J1bm5pbmcgdGhlIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworUnVuIHRoZSBleGFtcGxlIGFzIGZvbGxvd3M6CisKKz4gICAgIG12biBjbGVhbiBjb21waWxlIGV4ZWM6amF2YQorCitUaGlzIGRlcGxveXMgdGhlIGV4YW1wbGUgdXNpbmcgW0dyaXp6bHldKGh0dHA6Ly9ncml6emx5LmphdmEubmV0LykgY29udGFpbmVyLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc2VydmVyLWFzeW5jL3BvbS54bWwgYi9leGFtcGxlcy9zZXJ2ZXItYXN5bmMvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGQwYzIzCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvc2VydmVyLWFzeW5jL3BvbS54bWwKQEAgLTAsMCArMSw3MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKworICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+c2VydmVyLWFzeW5jPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LWV4YW1wbGVzLXNlcnZlci1hc3luYzwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgSkFYLVJTIGFzeW5jaHJvbm91cyBzZXJ2ZXItc2lkZSBleGFtcGxlLjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLWdyaXp6bHkyLWh0dHA8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktaGsyPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhlYy1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxtYWluQ2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuc2VydmVyLmFzeW5jLkFwcDwvbWFpbkNsYXNzPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+cmVsZWFzZTwvaWQ+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICA8L3Byb2ZpbGVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9zZXJ2ZXItYXN5bmMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9zZXJ2ZXIvYXN5bmMvQXBwLmphdmEgYi9leGFtcGxlcy9zZXJ2ZXItYXN5bmMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9zZXJ2ZXIvYXN5bmMvQXBwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIwNjNmMgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3NlcnZlci1hc3luYy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3NlcnZlci9hc3luYy9BcHAuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnNlcnZlci5hc3luYzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guZ3JpenpseS5odHRwLnNlcnZlci5IdHRwU2VydmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseTIuaHR0cHNlcnZlci5Hcml6emx5SHR0cFNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCitpbXBvcnQgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmUuVmVyYm9zaXR5LlBBWUxPQURfQU5ZOworCisvKioKKyAqIEplcnNleSBleGFtcGxlIGFwcGxpY2F0aW9uIGZvciBjdXN0b20gZXhlY3V0b3JzIG1hbmFnZWQgYXN5bmMgcmVzb3VyY2VzLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBBcHAgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIEJBU0VfVVJJID0gVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2Jhc2UvIik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNZTkNfTUVTU0FHSU5HX0ZJUkVfTl9GT1JHRVRfUEFUSCA9ICJhc3luYy9tZXNzYWdpbmcvZmlyZUFuZEZvcmdldCI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVNZTkNfTUVTU0FHSU5HX0JMT0NLSU5HX1BBVEggPSAiYXN5bmMvbWVzc2FnaW5nL2Jsb2NraW5nIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBU1lOQ19MT05HX1JVTk5JTkdfT1BfUEFUSCA9ICJhc3luYy9sb25ncnVubmluZyI7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlwiQXN5bmMgcmVzb3VyY2VzXCIgSmVyc2V5IEV4YW1wbGUgQXBwIik7CisKKyAgICAgICAgICAgIGZpbmFsIEh0dHBTZXJ2ZXIgc2VydmVyID0gR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5LmNyZWF0ZUh0dHBTZXJ2ZXIoQkFTRV9VUkksIGNyZWF0ZSgpLCBmYWxzZSk7CisgICAgICAgICAgICBSdW50aW1lLmdldFJ1bnRpbWUoKS5hZGRTaHV0ZG93bkhvb2sobmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIuc2h1dGRvd25Ob3coKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KSk7CisgICAgICAgICAgICBzZXJ2ZXIuc3RhcnQoKTsKKworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICJBcHBsaWNhdGlvbiBzdGFydGVkLlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlRvIHRlc3Qgc2ltcGxlLCBub24tYmxvY2tpbmcgYXN5bmNocm9ub3VzIG1lc3NhZ2luZyByZXNvdXJjZSwgdHJ5ICVzJXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJUbyB0ZXN0IGJsb2NraW5nIHZlcnNpb24gb2YgYXN5bmNocm9ub3VzIG1lc3NhZ2luZyByZXNvdXJjZSwgdHJ5ICVzJXNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJUbyB0ZXN0IGxvbmctcnVubmluZyBhc3luY2hyb25vdXMgb3BlcmF0aW9uIHJlc291cmNlLCB0cnkgJXMlc1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlN0b3AgdGhlIGFwcGxpY2F0aW9uIHVzaW5nIENUUkwrQyIsCisgICAgICAgICAgICAgICAgICAgIEJBU0VfVVJJLCBBU1lOQ19NRVNTQUdJTkdfRklSRV9OX0ZPUkdFVF9QQVRILAorICAgICAgICAgICAgICAgICAgICBCQVNFX1VSSSwgQVNZTkNfTUVTU0FHSU5HX0JMT0NLSU5HX1BBVEgsCisgICAgICAgICAgICAgICAgICAgIEJBU0VfVVJJLCBBU1lOQ19MT05HX1JVTk5JTkdfT1BfUEFUSCkpOworCisgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gfCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihBcHAuY2xhc3MuZ2V0TmFtZSgpKS5sb2coTGV2ZWwuU0VWRVJFLCBudWxsLCBleCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VDb25maWcgY3JlYXRlKCkgeworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZygpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyQ2xhc3NlcyhCbG9ja2luZ1Bvc3RDaGF0UmVzb3VyY2UuY2xhc3MsIEZpcmVBbmRGb3JnZXRDaGF0UmVzb3VyY2UuY2xhc3MsIFNpbXBsZUxvbmdSdW5uaW5nUmVzb3VyY2UuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVySW5zdGFuY2VzKG5ldyBMb2dnaW5nRmVhdHVyZShMb2dnZXIuZ2V0TG9nZ2VyKEFwcC5jbGFzcy5nZXROYW1lKCkpLCBQQVlMT0FEX0FOWSkpOworCisgICAgICAgIHJldHVybiByZXNvdXJjZUNvbmZpZzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9zZXJ2ZXItYXN5bmMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9zZXJ2ZXIvYXN5bmMvQmxvY2tpbmdQb3N0Q2hhdFJlc291cmNlLmphdmEgYi9leGFtcGxlcy9zZXJ2ZXItYXN5bmMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9zZXJ2ZXIvYXN5bmMvQmxvY2tpbmdQb3N0Q2hhdFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRiODM0OAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3NlcnZlci1hc3luYy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3NlcnZlci9hc3luYy9CbG9ja2luZ1Bvc3RDaGF0UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5zZXJ2ZXIuYXN5bmM7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5BcnJheUJsb2NraW5nUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQmxvY2tpbmdRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQXN5bmNSZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuU3VzcGVuZGVkOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmEuVGhyZWFkRmFjdG9yeUJ1aWxkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5KZXJzZXlQcm9jZXNzaW5nVW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyOworCisvKioKKyAqIEV4YW1wbGUgb2YgYSBzaW1wbGUgYmxvY2tpbmcgcG9pbnQtdG8tcG9pbnQgbWVzc2FnaW5nIHJlc291cmNlLgorICoKKyAqIFRoaXMgdmVyc2lvbiBvZiB0aGUgbWVzc2FnaW5nIHJlc291cmNlIGJsb2NrcyB3aGVuIFBPU1RpbmcgYSBuZXcgbWVzc2FnZSB1bnRpbAorICogdGhlIG1lc3NhZ2UgaXMgcmV0cmlldmVkLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKEFwcC5BU1lOQ19NRVNTQUdJTkdfQkxPQ0tJTkdfUEFUSCkKK0BQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKK0BDb25zdW1lcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKK3B1YmxpYyBjbGFzcyBCbG9ja2luZ1Bvc3RDaGF0UmVzb3VyY2UgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE9TVF9OT1RJRklDQVRJT05fUkVTUE9OU0UgPSAiTWVzc2FnZSBzdG9yZWQuIjsKKyAgICAvLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEJsb2NraW5nUG9zdENoYXRSZXNvdXJjZS5jbGFzcy5nZXROYW1lKCkpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExldmVsIERFQlVHID0gTGV2ZWwuSU5GTzsKKyAgICAvLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEV4ZWN1dG9yU2VydmljZSBRVUVVRV9FWEVDVVRPUiA9IEV4ZWN1dG9ycy5uZXdDYWNoZWRUaHJlYWRQb29sKG5ldyBUaHJlYWRGYWN0b3J5QnVpbGRlcigpCisgICAgICAgICAgICAuc2V0TmFtZUZvcm1hdCgiYmxvY2tpbmctcG9zdC1jaGF0LXJlc291cmNlLWV4ZWN1dG9yLSVkIikKKyAgICAgICAgICAgIC5zZXRVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIobmV3IEplcnNleVByb2Nlc3NpbmdVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIoKSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCbG9ja2luZ1F1ZXVlPFN0cmluZz4gbWVzc2FnZXMgPSBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPFN0cmluZz4oNSk7CisgICAgLy8KKworICAgIEBHRVQKKyAgICBwdWJsaWMgdm9pZCBwaWNrVXBNZXNzYWdlKEBTdXNwZW5kZWQgZmluYWwgQXN5bmNSZXNwb25zZSBhciwgQFF1ZXJ5UGFyYW0oImlkIikgZmluYWwgU3RyaW5nIG1lc3NhZ2VJZCkgeworICAgICAgICBMT0dHRVIubG9nKERFQlVHLCAiUmVjZWl2ZWQgR0VUIDx7MH0+IHdpdGggY29udGV4dCB7MX0gb24gdGhyZWFkIHsyfS4iLAorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXXttZXNzYWdlSWQsIGFyLnRvU3RyaW5nKCksIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpfSk7CisgICAgICAgIFFVRVVFX0VYRUNVVE9SLnN1Ym1pdChuZXcgUnVubmFibGUoKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gbWVzc2FnZXMudGFrZSgpOworICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKERFQlVHLCAiUmVzdW1pbmcgR0VUIDx7MH0+IGNvbnRleHQgezF9IHdpdGggYSBtZXNzYWdlIHsyfSBvbiB0aHJlYWQgezN9LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9iamVjdFtde21lc3NhZ2VJZCwgYXIudG9TdHJpbmcoKSwgbWVzc2FnZSwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCl9KTsKKyAgICAgICAgICAgICAgICAgICAgYXIucmVzdW1lKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuU0VWRVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXYWl0aW5nIGZvciBhIG1lc3NhZ2UgcGljay11cCBpbnRlcnJ1cHRlZC4gQ2FuY2VsbGluZyBjb250ZXh0IiArIGFyLnRvU3RyaW5nKCksIGV4KTsKKyAgICAgICAgICAgICAgICAgICAgYXIuY2FuY2VsKCk7IC8vIGNsb3NlIHRoZSBvcGVuIGNvbm5lY3Rpb24KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBQT1NUCisgICAgcHVibGljIHZvaWQgcG9zdE1lc3NhZ2UoQFN1c3BlbmRlZCBmaW5hbCBBc3luY1Jlc3BvbnNlIGFyLCBmaW5hbCBTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICBMT0dHRVIubG9nKERFQlVHLCAiUmVjZWl2ZWQgUE9TVCA8ezB9PiB3aXRoIGNvbnRleHQgezF9IG9uIHRocmVhZCB7Mn0uIFN1c3BlbmRpbmcgdGhlIGNvbnRleHQuIiwKKyAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117bWVzc2FnZSwgYXIudG9TdHJpbmcoKSwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCl9KTsKKyAgICAgICAgUVVFVUVfRVhFQ1VUT1Iuc3VibWl0KG5ldyBSdW5uYWJsZSgpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXMucHV0KG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKERFQlVHLCAiUE9TVGVkIG1lc3NhZ2UgPHswfT4gc3VjY2Vzc2Z1bGx5IHF1ZXVlZC4gUmVzdW1pbmcgUE9TVCB3aXRoIGNvbnRleHQgezF9IG9uIHRocmVhZCB7Mn0uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W117bWVzc2FnZSwgYXIudG9TdHJpbmcoKSwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCl9KTsKKyAgICAgICAgICAgICAgICAgICAgYXIucmVzdW1lKFBPU1RfTk9USUZJQ0FUSU9OX1JFU1BPTlNFKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLlNFVkVSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiV2FpdGluZyBmb3IgYSBxdWV1ZWluZyBhIG1lc3NhZ2UgJyIgKyBtZXNzYWdlICsgIicgaGFzIGJlZW4gaW50ZXJydXB0ZWQuIiwgZXgpOworICAgICAgICAgICAgICAgICAgICBhci5yZXN1bWUoZXgpOyAvLyBwcm9wYWdhdGUgaW5mbyBhYm91dCB0aGUgcHJvYmxlbQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc2VydmVyLWFzeW5jL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvc2VydmVyL2FzeW5jL0ZpcmVBbmRGb3JnZXRDaGF0UmVzb3VyY2UuamF2YSBiL2V4YW1wbGVzL3NlcnZlci1hc3luYy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3NlcnZlci9hc3luYy9GaXJlQW5kRm9yZ2V0Q2hhdFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EzMmQzOQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3NlcnZlci1hc3luYy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3NlcnZlci9hc3luYy9GaXJlQW5kRm9yZ2V0Q2hhdFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuc2VydmVyLmFzeW5jOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQXJyYXlCbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkJsb2NraW5nUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkFzeW5jUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlN1c3BlbmRlZDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhLlRocmVhZEZhY3RvcnlCdWlsZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuSmVyc2V5UHJvY2Vzc2luZ1VuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcjsKKworLyoqCisgKiBFeGFtcGxlIG9mIGEgc2ltcGxlIGZpcmUmZm9yZ2V0IHBvaW50LXRvLXBvaW50IG1lc3NhZ2luZyByZXNvdXJjZS4KKyAqCisgKiBUaGlzIHZlcnNpb24gb2YgdGhlIG1lc3NhZ2luZyByZXNvdXJjZSBkb2VzIG5vdCBibG9jayB3aGVuIFBPU1RpbmcgYSBuZXcgbWVzc2FnZS4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aChBcHAuQVNZTkNfTUVTU0FHSU5HX0ZJUkVfTl9GT1JHRVRfUEFUSCkKK0BQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKK0BDb25zdW1lcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKK3B1YmxpYyBjbGFzcyBGaXJlQW5kRm9yZ2V0Q2hhdFJlc291cmNlIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBPU1RfTk9USUZJQ0FUSU9OX1JFU1BPTlNFID0gIk1lc3NhZ2Ugc2VudCI7CisgICAgLy8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihGaXJlQW5kRm9yZ2V0Q2hhdFJlc291cmNlLmNsYXNzLmdldE5hbWUoKSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGV2ZWwgREVCVUcgPSBMZXZlbC5JTkZPOworICAgIC8vCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIFFVRVVFX0VYRUNVVE9SID0gRXhlY3V0b3JzLm5ld0NhY2hlZFRocmVhZFBvb2wobmV3IFRocmVhZEZhY3RvcnlCdWlsZGVyKCkKKyAgICAgICAgICAgIC5zZXROYW1lRm9ybWF0KCJmaXJlJmZvcmdldC1jaGF0LXJlc291cmNlLWV4ZWN1dG9yLSVkIikKKyAgICAgICAgICAgIC5zZXRVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIobmV3IEplcnNleVByb2Nlc3NpbmdVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIoKSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCbG9ja2luZ1F1ZXVlPEFzeW5jUmVzcG9uc2U+IHN1c3BlbmRlZCA9IG5ldyBBcnJheUJsb2NraW5nUXVldWU8QXN5bmNSZXNwb25zZT4oNSk7CisKKyAgICBAR0VUCisgICAgcHVibGljIHZvaWQgcGlja1VwTWVzc2FnZShAU3VzcGVuZGVkIGZpbmFsIEFzeW5jUmVzcG9uc2UgYXIsIEBRdWVyeVBhcmFtKCJpZCIpIGZpbmFsIFN0cmluZyBtZXNzYWdlSWQpCisgICAgICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBMT0dHRVIubG9nKERFQlVHLCAiUmVjZWl2ZWQgR0VUIDx7MH0+IHdpdGggY29udGV4dCB7MX0gb24gdGhyZWFkIHsyfS4iLAorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7bWVzc2FnZUlkLCBhci50b1N0cmluZygpLCBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKX0pOworICAgICAgICBRVUVVRV9FWEVDVVRPUi5zdWJtaXQobmV3IFJ1bm5hYmxlKCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzdXNwZW5kZWQucHV0KGFyKTsKKyAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhERUJVRywgIkdFVCA8ezB9PiBjb250ZXh0IHsxfSBzY2hlZHVsZWQgZm9yIHJlc3VtZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7bWVzc2FnZUlkLCBhci50b1N0cmluZygpfSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5TRVZFUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIldhaXRpbmcgZm9yIGEgbWVzc2FnZSBwaWNrLXVwIGludGVycnVwdGVkLiBDYW5jZWxsaW5nIGNvbnRleHQiICsgYXIudG9TdHJpbmcoKSwgZXgpOworICAgICAgICAgICAgICAgICAgICBhci5jYW5jZWwoKTsgLy8gY2xvc2UgdGhlIG9wZW4gY29ubmVjdGlvbgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQFBPU1QKKyAgICBwdWJsaWMgU3RyaW5nIHBvc3RNZXNzYWdlKGZpbmFsIFN0cmluZyBtZXNzYWdlKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBMT0dHRVIubG9nKERFQlVHLCAiUmVjZWl2ZWQgUE9TVGVkIG1lc3NhZ2UgPHswfT4gb24gdGhyZWFkIHsxfS4iLAorICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7bWVzc2FnZSwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCl9KTsKKyAgICAgICAgUVVFVUVfRVhFQ1VUT1Iuc3VibWl0KG5ldyBSdW5uYWJsZSgpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQXN5bmNSZXNwb25zZSBzdXNwZW5kZWRSZXNwb25zZSA9IHN1c3BlbmRlZC50YWtlKCk7CisgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coREVCVUcsICJSZXN1bWluZyBHRVQgY29udGV4dCB7MH0gd2l0aCBhIG1lc3NhZ2UgPHsxfT4gb24gdGhyZWFkIHsyfS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPYmplY3RbXSB7c3VzcGVuZGVkUmVzcG9uc2UudG9TdHJpbmcoKSwgbWVzc2FnZSwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCl9KTsKKyAgICAgICAgICAgICAgICAgICAgc3VzcGVuZGVkUmVzcG9uc2UucmVzdW1lKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuU0VWRVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJXYWl0aW5nIGZvciBhIHNlbmRpbmcgYSBtZXNzYWdlIDwiICsgbWVzc2FnZSArICI+IGhhcyBiZWVuIGludGVycnVwdGVkLiIsIGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIHJldHVybiBQT1NUX05PVElGSUNBVElPTl9SRVNQT05TRTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9zZXJ2ZXItYXN5bmMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9zZXJ2ZXIvYXN5bmMvTG9uZ1J1bm5pbmdBc3luY09wZXJhdGlvblJlc291cmNlLmphdmEgYi9leGFtcGxlcy9zZXJ2ZXItYXN5bmMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9zZXJ2ZXIvYXN5bmMvTG9uZ1J1bm5pbmdBc3luY09wZXJhdGlvblJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTViM2EwOAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3NlcnZlci1hc3luYy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3NlcnZlci9hc3luYy9Mb25nUnVubmluZ0FzeW5jT3BlcmF0aW9uUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnNlcnZlci5hc3luYzsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQXN5bmNSZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuU3VzcGVuZGVkOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmEuVGhyZWFkRmFjdG9yeUJ1aWxkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5KZXJzZXlQcm9jZXNzaW5nVW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyOworCisvKioKKyAqIEV4YW1wbGUgcmVzb3VyY2UgZm9yIGxvbmcgcnVubmluZyBhc3luYyBvcGVyYXRpb25zLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KKy8vVE9ETyBtb3ZlIHRoZSB0ZXN0IHRvIGludGVncmF0aW9uIHRlc3RzLgorLy9AUGF0aChBcHAuTE9OR19SVU5OSU5HX0FTWU5DX09QX1BBVEgpCitAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorcHVibGljIGNsYXNzIExvbmdSdW5uaW5nQXN5bmNPcGVyYXRpb25SZXNvdXJjZSB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RJRklDQVRJT05fUkVTUE9OU0UgPSAiSGVsbG8gYXN5bmMgd29ybGQhIjsKKyAgICAvLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKExvbmdSdW5uaW5nQXN5bmNPcGVyYXRpb25SZXNvdXJjZS5jbGFzcy5nZXROYW1lKCkpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTTEVFUF9USU1FX0lOX01JTExJUyA9IDEwMDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIFRBU0tfRVhFQ1VUT1IgPSBFeGVjdXRvcnMubmV3Q2FjaGVkVGhyZWFkUG9vbChuZXcgVGhyZWFkRmFjdG9yeUJ1aWxkZXIoKQorICAgICAgICAgICAgLnNldE5hbWVGb3JtYXQoImxvbmctcnVubmluZy1yZXNvdXJjZS1leGVjdXRvci0lZCIpCisgICAgICAgICAgICAuc2V0VW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyKG5ldyBKZXJzZXlQcm9jZXNzaW5nVW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyKCkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBAR0VUCisgICAgQFBhdGgoImJhc2ljU3luY0V4YW1wbGUiKQorICAgIHB1YmxpYyBTdHJpbmcgYmFzaWNTeW5jRXhhbXBsZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChTTEVFUF9USU1FX0lOX01JTExJUyk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLlNFVkVSRSwgIlJlc3BvbnNlIHByb2Nlc3NpbmcgaW50ZXJydXB0ZWQiLCBleCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5PVElGSUNBVElPTl9SRVNQT05TRTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImFzeW5jIikKKyAgICBwdWJsaWMgdm9pZCBzdXNwZW5kVmlhQ29udGV4dEV4YW1wbGUoQFN1c3BlbmRlZCBmaW5hbCBBc3luY1Jlc3BvbnNlIGFyLCBAUXVlcnlQYXJhbSgicXVlcnkiKSBmaW5hbCBTdHJpbmcgcXVlcnkpIHsKKyAgICAgICAgVEFTS19FWEVDVVRPUi5zdWJtaXQobmV3IFJ1bm5hYmxlKCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0xFRVBfVElNRV9JTl9NSUxMSVMpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuU0VWRVJFLCAiUmVzcG9uc2UgcHJvY2Vzc2luZyBpbnRlcnJ1cHRlZCIsIGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXIucmVzdW1lKCJDb21wbGV4IHJlc3VsdCBmb3IgIiArIHF1ZXJ5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc2VydmVyLWFzeW5jL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvc2VydmVyL2FzeW5jL1NpbXBsZUxvbmdSdW5uaW5nUmVzb3VyY2UuamF2YSBiL2V4YW1wbGVzL3NlcnZlci1hc3luYy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3NlcnZlci9hc3luYy9TaW1wbGVMb25nUnVubmluZ1Jlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZjYWU3MwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3NlcnZlci1hc3luYy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3NlcnZlci9hc3luYy9TaW1wbGVMb25nUnVubmluZ1Jlc291cmNlLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5zZXJ2ZXIuYXN5bmM7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Bc3luY1Jlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5TdXNwZW5kZWQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YS5UaHJlYWRGYWN0b3J5QnVpbGRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLkplcnNleVByb2Nlc3NpbmdVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXI7CisKKy8qKgorICogRXhhbXBsZSBvZiBhIHNpbXBsZSByZXNvdXJjZSB3aXRoIGEgbG9uZy1ydW5uaW5nIG9wZXJhdGlvbiBleGVjdXRlZCBpbiBhCisgKiBjdXN0b20gYXBwbGljYXRpb24gdGhyZWFkLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKEFwcC5BU1lOQ19MT05HX1JVTk5JTkdfT1BfUEFUSCkKK0BQcm9kdWNlcygidGV4dC9wbGFpbiIpCitwdWJsaWMgY2xhc3MgU2ltcGxlTG9uZ1J1bm5pbmdSZXNvdXJjZSB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT1RJRklDQVRJT05fUkVTUE9OU0UgPSAiSGVsbG8gYXN5bmMgd29ybGQhIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihTaW1wbGVMb25nUnVubmluZ1Jlc291cmNlLmNsYXNzLmdldE5hbWUoKSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNMRUVQX1RJTUVfSU5fTUlMTElTID0gMTAwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBFeGVjdXRvclNlcnZpY2UgVEFTS19FWEVDVVRPUiA9IEV4ZWN1dG9ycy5uZXdDYWNoZWRUaHJlYWRQb29sKG5ldyBUaHJlYWRGYWN0b3J5QnVpbGRlcigpCisgICAgICAgICAgICAuc2V0TmFtZUZvcm1hdCgibG9uZy1ydW5uaW5nLXJlc291cmNlLWV4ZWN1dG9yLSVkIikKKyAgICAgICAgICAgIC5zZXRVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIobmV3IEplcnNleVByb2Nlc3NpbmdVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIoKSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIEBHRVQKKyAgICBwdWJsaWMgdm9pZCBsb25nR2V0KEBTdXNwZW5kZWQgZmluYWwgQXN5bmNSZXNwb25zZSBhcikgeworICAgICAgICBUQVNLX0VYRUNVVE9SLnN1Ym1pdChuZXcgUnVubmFibGUoKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChTTEVFUF9USU1FX0lOX01JTExJUyk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5TRVZFUkUsICJSZXNwb25zZSBwcm9jZXNzaW5nIGludGVycnVwdGVkIiwgZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhci5yZXN1bWUoTk9USUZJQ0FUSU9OX1JFU1BPTlNFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc2VydmVyLWFzeW5jL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvc2VydmVyL2FzeW5jL0FzeW5jUmVzb3VyY2VUZXN0LmphdmEgYi9leGFtcGxlcy9zZXJ2ZXItYXN5bmMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9zZXJ2ZXIvYXN5bmMvQXN5bmNSZXNvdXJjZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTdjOGRjCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvc2VydmVyLWFzeW5jL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvc2VydmVyL2FzeW5jL0FzeW5jUmVzb3VyY2VUZXN0LmphdmEKQEAgLTAsMCArMSwzMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuc2VydmVyLmFzeW5jOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhLlRocmVhZEZhY3RvcnlCdWlsZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuSmVyc2V5UHJvY2Vzc2luZ1VuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCitwdWJsaWMgY2xhc3MgQXN5bmNSZXNvdXJjZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEFzeW5jUmVzb3VyY2VUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICAvLyBtdm4gdGVzdCAtRGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIuZmFjdG9yeT1vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmlubWVtb3J5LkluTWVtb3J5VGVzdENvbnRhaW5lckZhY3RvcnkKKyAgICAgICAgLy8gbXZuIHRlc3QgLURqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk9b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5ncml6emx5LkdyaXp6bHlUZXN0Q29udGFpbmVyRmFjdG9yeQorICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworICAgICAgICByZXR1cm4gQXBwLmNyZWF0ZSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpcmVBbmRGb3JnZXRDaGF0UmVzb3VyY2UoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBleGVjdXRlQ2hhdFRlc3QodGFyZ2V0KCkucGF0aChBcHAuQVNZTkNfTUVTU0FHSU5HX0ZJUkVfTl9GT1JHRVRfUEFUSCksCisgICAgICAgICAgICAgICAgRmlyZUFuZEZvcmdldENoYXRSZXNvdXJjZS5QT1NUX05PVElGSUNBVElPTl9SRVNQT05TRSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmxvY2tpbmdQb3N0Q2hhdFJlc291cmNlKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZUNoYXRUZXN0KHRhcmdldCgpLnBhdGgoQXBwLkFTWU5DX01FU1NBR0lOR19CTE9DS0lOR19QQVRIKSwgQmxvY2tpbmdQb3N0Q2hhdFJlc291cmNlLlBPU1RfTk9USUZJQ0FUSU9OX1JFU1BPTlNFKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZXhlY3V0ZUNoYXRUZXN0KGZpbmFsIFdlYlRhcmdldCByZXNvdXJjZVRhcmdldCwgZmluYWwgU3RyaW5nIGV4cGVjdGVkUG9zdFJlc3BvbnNlKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBpbnQgTUFYX01FU1NBR0VTID0gMTAwOworICAgICAgICBmaW5hbCBpbnQgTEFUQ0hfV0FJVF9USU1FT1VUID0gMTAgKiBnZXRBc3luY1RpbWVvdXRNdWx0aXBsaWVyKCk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gZGVidWdNb2RlID0gZmFsc2U7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gc2VxdWVudGlhbEdldCA9IGZhbHNlOworICAgICAgICBmaW5hbCBib29sZWFuIHNlcXVlbnRpYWxQb3N0ID0gZmFsc2U7CisgICAgICAgIGZpbmFsIE9iamVjdCBzZXF1ZW50aWFsR2V0TG9jayA9IG5ldyBPYmplY3QoKTsKKyAgICAgICAgZmluYWwgT2JqZWN0IHNlcXVlbnRpYWxQb3N0TG9jayA9IG5ldyBPYmplY3QoKTsKKworICAgICAgICBmaW5hbCBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3IgPSBFeGVjdXRvcnMubmV3Q2FjaGVkVGhyZWFkUG9vbChuZXcgVGhyZWFkRmFjdG9yeUJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXROYW1lRm9ybWF0KCJhc3luYy1yZXNvdXJjZS10ZXN0LSUwMmQiKQorICAgICAgICAgICAgICAgIC5zZXRVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIobmV3IEplcnNleVByb2Nlc3NpbmdVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIoKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgZmluYWwgTWFwPEludGVnZXIsIFN0cmluZz4gcG9zdFJlc3BvbnNlcyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+KCk7CisgICAgICAgIGZpbmFsIE1hcDxJbnRlZ2VyLCBTdHJpbmc+IGdldFJlc3BvbnNlcyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+KCk7CisKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggcG9zdFJlcXVlc3RMYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaChNQVhfTUVTU0FHRVMpOworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBnZXRSZXF1ZXN0TGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goTUFYX01FU1NBR0VTKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfTUVTU0FHRVM7IGkrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCByZXF1ZXN0SWQgPSBpOworICAgICAgICAgICAgICAgIGV4ZWN1dG9yLnN1Ym1pdChuZXcgUnVubmFibGUoKSB7CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z01vZGUgfHwgc2VxdWVudGlhbFBvc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNlcXVlbnRpYWxQb3N0TG9jaykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwcml2YXRlIHZvaWQgcG9zdCgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF0dGVtcHRDb3VudGVyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRlbXB0Q291bnRlcisrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJlc3BvbnNlID0gcmVzb3VyY2VUYXJnZXQucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS50ZXh0KFN0cmluZy5mb3JtYXQoIiUwMmQiLCByZXF1ZXN0SWQpKSwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RSZXNwb25zZXMucHV0KHJlcXVlc3RJZCwgcmVzcG9uc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLldBUk5JTkcsIFN0cmluZy5mb3JtYXQoIkVycm9yIFBPU1RJTkcgbWVzc2FnZSA8JXM+IGZvciAlZC4gdGltZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsIGF0dGVtcHRDb3VudGVyKSwgdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF0dGVtcHRDb3VudGVyID4gMykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZ25vcmVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiRXJyb3IgUE9TVElORyBtZXNzYWdlIDwlcz46IEludGVycnVwdGVkIiwgcmVxdWVzdElkKSwgaWdub3JlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RSZXF1ZXN0TGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBleGVjdXRvci5zdWJtaXQobmV3IFJ1bm5hYmxlKCkgeworCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVidWdNb2RlIHx8IHNlcXVlbnRpYWxHZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNlcXVlbnRpYWxHZXRMb2NrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwcml2YXRlIHZvaWQgZ2V0KCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXR0ZW1wdENvdW50ZXIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGVtcHRDb3VudGVyKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVzcG9uc2UgPSByZXNvdXJjZVRhcmdldC5xdWVyeVBhcmFtKCJpZCIsIHJlcXVlc3RJZCkucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlc3BvbnNlcy5wdXQocmVxdWVzdElkLCByZXNwb25zZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuU0VWRVJFLCBTdHJpbmcuZm9ybWF0KCJFcnJvciBzZW5kaW5nIEdFVCByZXF1ZXN0IDwlcz4gZm9yICVkLiB0aW1lLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCwgYXR0ZW1wdENvdW50ZXIpLCB0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0ZW1wdENvdW50ZXIgPiAzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGlnbm9yZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJFcnJvciBzZW5kaW5nIEdFVCBtZXNzYWdlIDwlcz46IEludGVycnVwdGVkIiwgcmVxdWVzdElkKSwgaWdub3JlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlcXVlc3RMYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZGVidWdNb2RlKSB7CisgICAgICAgICAgICAgICAgcG9zdFJlcXVlc3RMYXRjaC5hd2FpdCgpOworICAgICAgICAgICAgICAgIGdldFJlcXVlc3RMYXRjaC5hd2FpdCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoIXBvc3RSZXF1ZXN0TGF0Y2guYXdhaXQoTEFUQ0hfV0FJVF9USU1FT1VULCBUaW1lVW5pdC5TRUNPTkRTKSkgeworICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLlNFVkVSRSwgIldhaXRpbmcgZm9yIGFsbCBQT1NUIHJlcXVlc3RzIHRvIGNvbXBsZXRlIGhhcyB0aW1lZCBvdXQuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghZ2V0UmVxdWVzdExhdGNoLmF3YWl0KExBVENIX1dBSVRfVElNRU9VVCwgVGltZVVuaXQuU0VDT05EUykpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5TRVZFUkUsICJXYWl0aW5nIGZvciBhbGwgR0VUIHJlcXVlc3RzIHRvIGNvbXBsZXRlIGhhcyB0aW1lZCBvdXQuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZXhlY3V0b3Iuc2h1dGRvd25Ob3coKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZ0J1aWxkZXIgbWVzc2FnZUJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigiUE9TVCByZXNwb25zZXMgcmVjZWl2ZWQ6ICIpLmFwcGVuZChwb3N0UmVzcG9uc2VzLnNpemUoKSkuYXBwZW5kKCJcbiIpOworICAgICAgICBmb3IgKE1hcC5FbnRyeTxJbnRlZ2VyLCBTdHJpbmc+IHBvc3RSZXNwb25zZUVudHJ5IDogcG9zdFJlc3BvbnNlcy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBtZXNzYWdlQnVpbGRlci5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiUE9TVCByZXNwb25zZSBmb3IgbWVzc2FnZSAlMDJkOiAiLCBwb3N0UmVzcG9uc2VFbnRyeS5nZXRLZXkoKSkpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQocG9zdFJlc3BvbnNlRW50cnkuZ2V0VmFsdWUoKSkuYXBwZW5kKCdcbicpOworICAgICAgICB9CisgICAgICAgIG1lc3NhZ2VCdWlsZGVyLmFwcGVuZCgnXG4nKTsKKyAgICAgICAgbWVzc2FnZUJ1aWxkZXIuYXBwZW5kKCJHRVQgcmVzcG9uc2VzIHJlY2VpdmVkOiAiKS5hcHBlbmQoZ2V0UmVzcG9uc2VzLnNpemUoKSkuYXBwZW5kKCJcbiIpOworICAgICAgICBmb3IgKE1hcC5FbnRyeTxJbnRlZ2VyLCBTdHJpbmc+IGdldFJlc3BvbnNlRW50cnkgOiBnZXRSZXNwb25zZXMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgbWVzc2FnZUJ1aWxkZXIuYXBwZW5kKFN0cmluZy5mb3JtYXQoIkdFVCByZXNwb25zZSBmb3IgbWVzc2FnZSAlMDJkOiAiLCBnZXRSZXNwb25zZUVudHJ5LmdldEtleSgpKSkKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChnZXRSZXNwb25zZUVudHJ5LmdldFZhbHVlKCkpLmFwcGVuZCgnXG4nKTsKKyAgICAgICAgfQorICAgICAgICBMT0dHRVIuaW5mbyhtZXNzYWdlQnVpbGRlci50b1N0cmluZygpKTsKKworICAgICAgICBmb3IgKE1hcC5FbnRyeTxJbnRlZ2VyLCBTdHJpbmc+IHBvc3RSZXNwb25zZUVudHJ5IDogcG9zdFJlc3BvbnNlcy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIlVuZXhwZWN0ZWQgUE9TVCBub3RpZmljYXRpb24gcmVzcG9uc2UgZm9yIG1lc3NhZ2UgJTAyZCIsIHBvc3RSZXNwb25zZUVudHJ5LmdldEtleSgpKSwKKyAgICAgICAgICAgICAgICAgICAgZXhwZWN0ZWRQb3N0UmVzcG9uc2UsIHBvc3RSZXNwb25zZUVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgTGlzdDxJbnRlZ2VyPiBsb3N0ID0gbmV3IExpbmtlZExpc3Q8SW50ZWdlcj4oKTsKKyAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IGdldFJlc3BvbnNlVmFsdWVzID0gZ2V0UmVzcG9uc2VzLnZhbHVlcygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9NRVNTQUdFUzsgaSsrKSB7CisgICAgICAgICAgICBpZiAoIWdldFJlc3BvbnNlVmFsdWVzLmNvbnRhaW5zKFN0cmluZy5mb3JtYXQoIiUwMmQiLCBpKSkpIHsKKyAgICAgICAgICAgICAgICBsb3N0LmFkZChpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWxvc3QuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBmYWlsKCJEZXRlY3RlZCBhIHBvc3RlZCBtZXNzYWdlIGxvc3MoZXMpOiAiICsgbG9zdC50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX01FU1NBR0VTLCBwb3N0UmVzcG9uc2VzLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfTUVTU0FHRVMsIGdldFJlc3BvbnNlcy5zaXplKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvbmdSdW5uaW5nUmVzb3VyY2UoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgcmVzb3VyY2VUYXJnZXQgPSB0YXJnZXQoKS5wYXRoKEFwcC5BU1lOQ19MT05HX1JVTk5JTkdfT1BfUEFUSCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZFJlc3BvbnNlID0gU2ltcGxlTG9uZ1J1bm5pbmdSZXNvdXJjZS5OT1RJRklDQVRJT05fUkVTUE9OU0U7CisKKyAgICAgICAgZmluYWwgaW50IE1BWF9NRVNTQUdFUyA9IDEwMDsKKyAgICAgICAgZmluYWwgaW50IExBVENIX1dBSVRfVElNRU9VVCA9IDI1ICogZ2V0QXN5bmNUaW1lb3V0TXVsdGlwbGllcigpOworICAgICAgICBmaW5hbCBib29sZWFuIGRlYnVnTW9kZSA9IGZhbHNlOworICAgICAgICBmaW5hbCBib29sZWFuIHNlcXVlbnRpYWxHZXQgPSBmYWxzZTsKKyAgICAgICAgZmluYWwgT2JqZWN0IHNlcXVlbnRpYWxHZXRMb2NrID0gbmV3IE9iamVjdCgpOworCisgICAgICAgIGZpbmFsIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvciA9IEV4ZWN1dG9ycy5uZXdDYWNoZWRUaHJlYWRQb29sKG5ldyBUaHJlYWRGYWN0b3J5QnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldE5hbWVGb3JtYXQoImFzeW5jLXJlc291cmNlLXRlc3QtJTAyZCIpCisgICAgICAgICAgICAgICAgLnNldFVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcihuZXcgSmVyc2V5UHJvY2Vzc2luZ1VuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcigpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBmaW5hbCBNYXA8SW50ZWdlciwgU3RyaW5nPiBnZXRSZXNwb25zZXMgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8SW50ZWdlciwgU3RyaW5nPigpOworCisgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGdldFJlcXVlc3RMYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaChNQVhfTUVTU0FHRVMpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9NRVNTQUdFUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IHJlcXVlc3RJZCA9IGk7CisgICAgICAgICAgICAgICAgZXhlY3V0b3Iuc3VibWl0KG5ldyBSdW5uYWJsZSgpIHsKKworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnTW9kZSB8fCBzZXF1ZW50aWFsR2V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChzZXF1ZW50aWFsR2V0TG9jaykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIGdldCgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF0dGVtcHRDb3VudGVyID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRlbXB0Q291bnRlcisrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJlc3BvbnNlID0gcmVzb3VyY2VUYXJnZXQucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVzcG9uc2VzLnB1dChyZXF1ZXN0SWQsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5TRVZFUkUsIFN0cmluZy5mb3JtYXQoIkVycm9yIHNlbmRpbmcgR0VUIHJlcXVlc3QgPCVzPiBmb3IgJWQuIHRpbWUuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLCBhdHRlbXB0Q291bnRlciksIHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdHRlbXB0Q291bnRlciA+IDMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gaWdub3JlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIkVycm9yIHNlbmRpbmcgR0VUIG1lc3NhZ2UgPCVzPjogSW50ZXJydXB0ZWQiLCByZXF1ZXN0SWQpLCBpZ25vcmVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVxdWVzdExhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChkZWJ1Z01vZGUpIHsKKyAgICAgICAgICAgICAgICBnZXRSZXF1ZXN0TGF0Y2guYXdhaXQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCFnZXRSZXF1ZXN0TGF0Y2guYXdhaXQoTEFUQ0hfV0FJVF9USU1FT1VULCBUaW1lVW5pdC5TRUNPTkRTKSkgeworICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLlNFVkVSRSwgIldhaXRpbmcgZm9yIGFsbCBHRVQgcmVxdWVzdHMgdG8gY29tcGxldGUgaGFzIHRpbWVkIG91dC4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBleGVjdXRvci5zaHV0ZG93bk5vdygpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgQXJyYXlMaXN0PE1hcC5FbnRyeTxJbnRlZ2VyLCBTdHJpbmc+PiByZXNwb25zZUVudHJ5TGlzdCA9CisgICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxNYXAuRW50cnk8SW50ZWdlciwgU3RyaW5nPj4oZ2V0UmVzcG9uc2VzLmVudHJ5U2V0KCkpOworICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHJlc3BvbnNlRW50cnlMaXN0LAorICAgICAgICAgICAgICAgIG5ldyBDb21wYXJhdG9yPE1hcC5FbnRyeTxJbnRlZ2VyLCBTdHJpbmc+PigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShNYXAuRW50cnk8SW50ZWdlciwgU3RyaW5nPiBvMSwgTWFwLkVudHJ5PEludGVnZXIsIFN0cmluZz4gbzIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvMS5nZXRLZXkoKS5jb21wYXJlVG8obzIuZ2V0S2V5KCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgbWVzc2FnZUJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigiR0VUIHJlc3BvbnNlcyByZWNlaXZlZDogIikuYXBwZW5kKHJlc3BvbnNlRW50cnlMaXN0LnNpemUoKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCJcbiIpOworICAgICAgICBmb3IgKE1hcC5FbnRyeTxJbnRlZ2VyLCBTdHJpbmc+IGdldFJlc3BvbnNlRW50cnkgOiByZXNwb25zZUVudHJ5TGlzdCkgeworICAgICAgICAgICAgbWVzc2FnZUJ1aWxkZXIuYXBwZW5kKFN0cmluZy5mb3JtYXQoIkdFVCByZXNwb25zZSBmb3IgbWVzc2FnZSAlMDJkOiAiLCBnZXRSZXNwb25zZUVudHJ5LmdldEtleSgpKSkKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChnZXRSZXNwb25zZUVudHJ5LmdldFZhbHVlKCkpLmFwcGVuZCgnXG4nKTsKKyAgICAgICAgfQorICAgICAgICBMT0dHRVIuaW5mbyhtZXNzYWdlQnVpbGRlci50b1N0cmluZygpKTsKKworICAgICAgICBmb3IgKE1hcC5FbnRyeTxJbnRlZ2VyLCBTdHJpbmc+IGVudHJ5IDogcmVzcG9uc2VFbnRyeUxpc3QpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiVW5leHBlY3RlZCBHRVQgbm90aWZpY2F0aW9uIHJlc3BvbnNlIGZvciBtZXNzYWdlICUwMmQiLCBlbnRyeS5nZXRLZXkoKSksCisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkUmVzcG9uc2UsIGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfTUVTU0FHRVMsIGdldFJlc3BvbnNlcy5zaXplKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc2VydmVyLXNlbnQtZXZlbnRzLWpheHJzL1JFQURNRS5NRCBiL2V4YW1wbGVzL3NlcnZlci1zZW50LWV2ZW50cy1qYXhycy9SRUFETUUuTUQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDEwYmFhYQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3NlcnZlci1zZW50LWV2ZW50cy1qYXhycy9SRUFETUUuTUQKQEAgLTAsMCArMSw3MCBAQAorWy8vXTogIyAiIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAiCitbLy9dOiAjICIgIgorWy8vXTogIyAiIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAiCitbLy9dOiAjICIgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQgIgorWy8vXTogIyAiIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4gIgorWy8vXTogIyAiICIKK1svL106ICMgIiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlICIKKworU2VydmVyLVNlbnQgRXZlbnRzIChTU0UpIEV4YW1wbGUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgSkFYLVJTIDIuMSBzZXJ2ZXItc2VudCBldmVudHMgc3VwcG9ydC4KKworVGhlIGZ1bGwgZGVzY3JpcHRpb24gaG93IHRvIGFkZCBzdXBwb3J0IGZvciBzZXJ2ZXItc2VudCBldmVudHMgdG8geW91ciBhcHBsaWNhdGlvbiBjYW4gYmUgZm91bmQgaW4gSmVyc2V5IFVzZXIgR3VpZGUsIAorY2hhcHRlcgorW1NlcnZlci1TZW50IEV2ZW50cyAoU1NFKSBTdXBwb3J0XShodHRwczovL2plcnNleS5qYXZhLm5ldC9kb2N1bWVudGF0aW9uL2xhdGVzdC9zc2UuaHRtbCkuCisKK0NvbnRlbnRzCistLS0tLS0tLQorCitUaGUgbWFwcGluZyBvZiB0aGUgVVJJIHBhdGggc3BhY2UgaXMgcHJlc2VudGVkIGluIHRoZSBmb2xsb3dpbmcgdGFibGU6CisKK1VSSSBwYXRoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBSZXNvdXJjZSBjbGFzcyAgICAgICAgICAgICB8IEhUVFAgbWV0aG9kcyAgIHwgRGVzY3JpcHRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tCisqKl9zZXJ2ZXItc2VudC1ldmVudHNfKiogICAgICAgICAgICAgIHwgU2VydmVyU2VudEV2ZW50c1Jlc291cmNlICAgfCBHRVQgICAgICAgICAgICB8IEdldCBlbnRpcmUgRXZlbnRPdXRwdXQgd2l0aCBhbGwgbWVzc2FnZXMKKyoqX3NlcnZlci1zZW50LWV2ZW50c18qKiAgICAgICAgICAgICAgfCBTZXJ2ZXJTZW50RXZlbnRzUmVzb3VyY2UgICB8IFBPU1QgICAgICAgICAgIHwgSW5zZXJ0IGEgbmV3IG1lc3NhZ2UgaW4gRXZlbnRPdXRwdXQKKyoqX3NlcnZlci1zZW50LWV2ZW50c18qKiAgICAgICAgICAgICAgfCBTZXJ2ZXJTZW50RXZlbnRzUmVzb3VyY2UgICB8IERFTEVURSAgICAgICAgIHwgUmVzZXQgRXZlbnRPdXRwdXQKKyoqX3NlcnZlci1zZW50LWV2ZW50cy9kb21haW5zL3tpZH1fKiogfCBCbG9ja2luZ1Bvc3RDaGF0UmVzb3VyY2UgICB8IFBPU1QgICAgICAgICAgIHwgR2VuZXJhdGUgc2V2ZXJhbCBtZXNzYWdlcyB3aXRoIGEgZGVsYXkgaW4gRXZlbnRPdXRwdXQgYW5kIHJldHVybiBpdAorCitTYW1wbGUgUmVzcG9uc2UKKy0tLS0tLS0tLS0tLS0tLQorCitBIGdyZWF0IGV4YW1wbGUgb2YgU2VydmVyLVNlbnQgRXZlbnRzIGlzIGBzZXJ2ZXItc2VudC1ldmVudHMvZG9tYWlucy97aWR9YCB3aGljaCBzZW5kcyBzZXZlcmFsIG1lc3NhZ2VzIHdpdGggYSBkZWxheSAyMDBtcworYmV0d2VlbiBlYWNoIG90aGVyLgorCis+ICAgICBjdXJsIC12IC1YIFBPU1QgaHR0cDovL2xvY2FsaG9zdDo4MDgwL3NlcnZlci1zZW50LWV2ZW50cy1qYXhycy9kb21haW5zLzEgLUggIkNvbnRlbnQtVHlwZTogdGV4dC9ldmVudC1zdHJlYW0iCisKK0xvb2sgYXQgYSBjb25zb2xlIGhvdyBldmVudHMgYXJlIGhhbmRsZWQgb25lIGFmdGVyIGFub3RoZXIgaW4gdGhlIHJpZ2h0IG9yZGVyLgorCitgYGAKK2V2ZW50OiBkb21haW4tcHJvZ3Jlc3MKK2RhdGE6IHN0YXJ0aW5nIGRvbWFpbiAxIC4uLgorCitldmVudDogZG9tYWluLXByb2dyZXNzCitkYXRhOiA1MCUKKworZXZlbnQ6IGRvbWFpbi1wcm9ncmVzcworZGF0YTogNjAlCisKK2V2ZW50OiBkb21haW4tcHJvZ3Jlc3MKK2RhdGE6IDcwJQorCitldmVudDogZG9tYWluLXByb2dyZXNzCitkYXRhOiA5OSUKKworZXZlbnQ6IGRvbWFpbi1wcm9ncmVzcworZGF0YTogZG9uZQorYGBgCisKK1J1bm5pbmcgdGhlIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworTG9vayBhdCBKZXJzZXkgRG9jdW1lbnRhdGlvbiB0byBsZWFybiBob3cgdG8gY29uc3VtZSBTZXJ2ZXItU2VudCBFdmVudHMgdXNpbmcgSmVyc2V5IENsaWVudAorPGh0dHBzOi8vamVyc2V5LmphdmEubmV0L2RvY3VtZW50YXRpb24vbGF0ZXN0L3NzZS5odG1sI2QwZTExNzg2PgorCitSdW4gdGhlIGV4YW1wbGUgYXMgZm9sbG93czoKKworPiAgICAgbXZuIGNsZWFuIGNvbXBpbGUgZXhlYzpqYXZhCisKK1RoaXMgZGVwbG95cyB0aGUgZXhhbXBsZSB1c2luZyBbR3JpenpseV0oaHR0cDovL2dyaXp6bHkuamF2YS5uZXQvKSBjb250YWluZXIuCmRpZmYgLS1naXQgYS9leGFtcGxlcy9zZXJ2ZXItc2VudC1ldmVudHMtamF4cnMvcG9tLnhtbCBiL2V4YW1wbGVzL3NlcnZlci1zZW50LWV2ZW50cy1qYXhycy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZTJhOGYKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zZXJ2ZXItc2VudC1ldmVudHMtamF4cnMvcG9tLnhtbApAQCAtMCwwICsxLDc3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+c2VydmVyLXNlbnQtZXZlbnRzLWpheHJzPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LWV4YW1wbGVzLXNlcnZlci1zZW50LWV2ZW50cy1qYXhyczwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgSkFYLVJTIDIuMSBTZXJ2ZXItU2VudCBFdmVudHMgZXhhbXBsZS48L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1ncml6emx5Mi1odHRwPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWhrMjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLXNzZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhlYy1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxtYWluQ2xhc3M+QXBwPC9tYWluQ2xhc3M+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5yZWxlYXNlPC9pZD4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3NlcnZlci1zZW50LWV2ZW50cy1qYXhycy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3NzZS9qYXhycy9BcHAuamF2YSBiL2V4YW1wbGVzL3NlcnZlci1zZW50LWV2ZW50cy1qYXhycy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3NzZS9qYXhycy9BcHAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWQ0NGZmCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvc2VydmVyLXNlbnQtZXZlbnRzLWpheHJzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvc3NlL2pheHJzL0FwcC5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuc3NlLmpheHJzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseTIuaHR0cHNlcnZlci5Hcml6emx5SHR0cFNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5ncml6emx5Lmh0dHAuc2VydmVyLkh0dHBTZXJ2ZXI7CisKKy8qKgorICogU2VydmVyIHNlbnQgZXZlbnQgZXhhbXBsZS4KKyAqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQXBwIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVSSSBCQVNFX1VSSSA9IFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8iKTsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJPT1RfUEFUSCA9ICJzZXJ2ZXItc2VudC1ldmVudHMiOworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcIkpBWC1SUyAyLjEgU2VydmVyLVNlbnQgRXZlbnRzXCIgSmVyc2V5IEV4YW1wbGUgQXBwIik7CisKKyAgICAgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKEpheFJzU2VydmVyU2VudEV2ZW50c1Jlc291cmNlLmNsYXNzKTsKKworICAgICAgICAgICAgZmluYWwgSHR0cFNlcnZlciBzZXJ2ZXIgPSBHcml6emx5SHR0cFNlcnZlckZhY3RvcnkuY3JlYXRlSHR0cFNlcnZlcihCQVNFX1VSSSwgcmVzb3VyY2VDb25maWcsIGZhbHNlKTsKKyAgICAgICAgICAgIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmFkZFNodXRkb3duSG9vayhuZXcgVGhyZWFkKHNlcnZlcjo6c2h1dGRvd25Ob3cpKTsKKyAgICAgICAgICAgIHNlcnZlci5zdGFydCgpOworCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oU3RyaW5nLmZvcm1hdCgiQXBwbGljYXRpb24gc3RhcnRlZC5cblRyeSBvdXQgJXMlc1xuU3RvcCB0aGUgYXBwbGljYXRpb24gdXNpbmcgQ1RSTCtDIiwKKyAgICAgICAgICAgICAgICAgICAgQkFTRV9VUkksIFJPT1RfUEFUSCkpOworCisgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gfCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihBcHAuY2xhc3MuZ2V0TmFtZSgpKS5sb2coTGV2ZWwuU0VWRVJFLCBudWxsLCBleCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9zZXJ2ZXItc2VudC1ldmVudHMtamF4cnMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9zc2UvamF4cnMvRG9tYWluUmVzb3VyY2UuamF2YSBiL2V4YW1wbGVzL3NlcnZlci1zZW50LWV2ZW50cy1qYXhycy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3NzZS9qYXhycy9Eb21haW5SZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YTAzZTAKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zZXJ2ZXItc2VudC1ldmVudHMtamF4cnMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9zc2UvamF4cnMvRG9tYWluUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5zc2UuamF4cnM7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5EZWZhdWx0VmFsdWU7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLk5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuc3NlLlNzZTsKK2ltcG9ydCBqYXZheC53cy5ycy5zc2UuU3NlQnJvYWRjYXN0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuc3NlLlNzZUV2ZW50U2luazsKKworLyoqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiZG9tYWluIikKK3B1YmxpYyBjbGFzcyBEb21haW5SZXNvdXJjZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8SW50ZWdlciwgUHJvY2Vzcz4gcHJvY2Vzc2VzID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPD4oKTsKKworICAgIEBQYXRoKCJzdGFydCIpCisgICAgQFBPU1QKKyAgICBwdWJsaWMgUmVzcG9uc2UgcG9zdChARGVmYXVsdFZhbHVlKCIwIikgQFF1ZXJ5UGFyYW0oInRlc3RTb3VyY2VzIikgaW50IHRlc3RTb3VyY2VzLCBAQ29udGV4dCBTc2Ugc3NlKSB7CisgICAgICAgIGZpbmFsIFByb2Nlc3MgcHJvY2VzcyA9IG5ldyBQcm9jZXNzKHRlc3RTb3VyY2VzLCBzc2UpOworICAgICAgICBwcm9jZXNzZXMucHV0KHByb2Nlc3MuZ2V0SWQoKSwgcHJvY2Vzcyk7CisKKyAgICAgICAgRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yKCkuZXhlY3V0ZShwcm9jZXNzKTsKKworICAgICAgICBmaW5hbCBVUkkgcHJvY2Vzc0lkVXJpID0gVXJpQnVpbGRlci5mcm9tUmVzb3VyY2UoRG9tYWluUmVzb3VyY2UuY2xhc3MpLnBhdGgoInByb2Nlc3Mve2lkfSIpLmJ1aWxkKHByb2Nlc3MuZ2V0SWQoKSk7CisgICAgICAgIHJldHVybiBSZXNwb25zZS5jcmVhdGVkKHByb2Nlc3NJZFVyaSkuYnVpbGQoKTsKKyAgICB9CisKKyAgICBAUGF0aCgicHJvY2Vzcy97aWR9IikKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlNFUlZFUl9TRU5UX0VWRU5UUykKKyAgICBAR0VUCisgICAgcHVibGljIHZvaWQgZ2V0UHJvZ3Jlc3MoQFBhdGhQYXJhbSgiaWQiKSBpbnQgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQERlZmF1bHRWYWx1ZSgiZmFsc2UiKSBAUXVlcnlQYXJhbSgidGVzdFNvdXJjZSIpIGJvb2xlYW4gdGVzdFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBAQ29udGV4dCBTc2VFdmVudFNpbmsgZXZlbnRTaW5rKSB7CisgICAgICAgIGZpbmFsIFByb2Nlc3MgcHJvY2VzcyA9IHByb2Nlc3Nlcy5nZXQoaWQpOworCisgICAgICAgIGlmIChwcm9jZXNzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICh0ZXN0U291cmNlKSB7CisgICAgICAgICAgICAgICAgcHJvY2Vzcy5yZWxlYXNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcm9jZXNzLmdldEJyb2FkY2FzdGVyKCkucmVnaXN0ZXIoZXZlbnRTaW5rKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFByb2Nlc3MgaW1wbGVtZW50cyBSdW5uYWJsZSB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXRvbWljSW50ZWdlciBjb3VudGVyID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgaWQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2g7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3NlQnJvYWRjYXN0ZXIgYnJvYWRjYXN0ZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3NlIHNzZTsKKworICAgICAgICBQcm9jZXNzKGludCB0ZXN0UmVjZWl2ZXJzLCBTc2Ugc3NlKSB7CisgICAgICAgICAgICB0aGlzLnNzZSA9IHNzZTsKKyAgICAgICAgICAgIHRoaXMuYnJvYWRjYXN0ZXIgPSBzc2UubmV3QnJvYWRjYXN0ZXIoKTsKKyAgICAgICAgICAgIGlkID0gY291bnRlci5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgICAgICAgIGxhdGNoID0gdGVzdFJlY2VpdmVycyA+IDAgPyBuZXcgQ291bnREb3duTGF0Y2godGVzdFJlY2VpdmVycykgOiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgaW50IGdldElkKCkgeworICAgICAgICAgICAgcmV0dXJuIGlkOworICAgICAgICB9CisKKyAgICAgICAgU3NlQnJvYWRjYXN0ZXIgZ2V0QnJvYWRjYXN0ZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gYnJvYWRjYXN0ZXI7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHJlbGVhc2UoKSB7CisgICAgICAgICAgICBpZiAobGF0Y2ggIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAobGF0Y2ggIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyB3YWl0IGZvciBhbGwgdGVzdCBFdmVudFNvdXJjZXMgdG8gYmUgcmVnaXN0ZXJlZAorICAgICAgICAgICAgICAgICAgICBsYXRjaC5hd2FpdCg1LCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicm9hZGNhc3Rlci5icm9hZGNhc3Qoc3NlLm5ld0V2ZW50QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lKCJkb21haW4tcHJvZ3Jlc3MiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGF0YShTdHJpbmcuY2xhc3MsICJzdGFydGluZyBkb21haW4gIiArIGlkICsgIiAuLi4iKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgICAgICAgICAgYnJvYWRjYXN0ZXIuYnJvYWRjYXN0KHNzZS5uZXdFdmVudEJ1aWxkZXIoKS5uYW1lKCJkb21haW4tcHJvZ3Jlc3MiKS5kYXRhKFN0cmluZy5jbGFzcywgIjUwJSIpLmJ1aWxkKCkpOworICAgICAgICAgICAgICAgIGJyb2FkY2FzdGVyLmJyb2FkY2FzdChzc2UubmV3RXZlbnRCdWlsZGVyKCkubmFtZSgiZG9tYWluLXByb2dyZXNzIikuZGF0YShTdHJpbmcuY2xhc3MsICI2MCUiKS5idWlsZCgpKTsKKyAgICAgICAgICAgICAgICBicm9hZGNhc3Rlci5icm9hZGNhc3Qoc3NlLm5ld0V2ZW50QnVpbGRlcigpLm5hbWUoImRvbWFpbi1wcm9ncmVzcyIpLmRhdGEoU3RyaW5nLmNsYXNzLCAiNzAlIikuYnVpbGQoKSk7CisgICAgICAgICAgICAgICAgYnJvYWRjYXN0ZXIuYnJvYWRjYXN0KHNzZS5uZXdFdmVudEJ1aWxkZXIoKS5uYW1lKCJkb21haW4tcHJvZ3Jlc3MiKS5kYXRhKFN0cmluZy5jbGFzcywgIjk5JSIpLmJ1aWxkKCkpOworICAgICAgICAgICAgICAgIGJyb2FkY2FzdGVyLmJyb2FkY2FzdChzc2UubmV3RXZlbnRCdWlsZGVyKCkubmFtZSgiZG9tYWluLXByb2dyZXNzIikuZGF0YShTdHJpbmcuY2xhc3MsICJkb25lIikuYnVpbGQoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3NlcnZlci1zZW50LWV2ZW50cy1qYXhycy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3NzZS9qYXhycy9KYXhSc1NlcnZlclNlbnRFdmVudHNSZXNvdXJjZS5qYXZhIGIvZXhhbXBsZXMvc2VydmVyLXNlbnQtZXZlbnRzLWpheHJzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvc3NlL2pheHJzL0pheFJzU2VydmVyU2VudEV2ZW50c1Jlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhhYjc1MAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3NlcnZlci1zZW50LWV2ZW50cy1qYXhycy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3NzZS9qYXhycy9KYXhSc1NlcnZlclNlbnRFdmVudHNSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuc3NlLmpheHJzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkRFTEVURTsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuc3NlLlNzZTsKK2ltcG9ydCBqYXZheC53cy5ycy5zc2UuU3NlRXZlbnRTaW5rOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJzZXJ2ZXItc2VudC1ldmVudHMiKQorcHVibGljIGNsYXNzIEpheFJzU2VydmVyU2VudEV2ZW50c1Jlc291cmNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIFNzZUV2ZW50U2luayBldmVudFNpbmsgPSBudWxsOworCisgICAgQEdFVAorICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuU0VSVkVSX1NFTlRfRVZFTlRTKQorICAgIHB1YmxpYyB2b2lkIGdldE1lc3NhZ2VRdWV1ZShAQ29udGV4dCBTc2VFdmVudFNpbmsgc2luaykgeworICAgICAgICBldmVudFNpbmsgPSBzaW5rOworICAgIH0KKworICAgIEBQT1NUCisgICAgcHVibGljIHZvaWQgYWRkTWVzc2FnZShmaW5hbCBTdHJpbmcgbWVzc2FnZSwgQENvbnRleHQgU3NlIHNzZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3NlRXZlbnRTaW5rIGxvY2FsU2luayA9IGV2ZW50U2luazsKKyAgICAgICAgaWYgKGxvY2FsU2luayAhPSBudWxsKSB7CisgICAgICAgICAgICBsb2NhbFNpbmsuc2VuZChzc2UubmV3RXZlbnRCdWlsZGVyKCkubmFtZSgiY3VzdG9tLW1lc3NhZ2UiKS5kYXRhKFN0cmluZy5jbGFzcywgbWVzc2FnZSkuYnVpbGQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAREVMRVRFCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBTc2VFdmVudFNpbmsgbG9jYWxTaW5rID0gZXZlbnRTaW5rOworICAgICAgICBpZiAobG9jYWxTaW5rICE9IG51bGwpIHsKKyAgICAgICAgICAgIGV2ZW50U2luay5jbG9zZSgpOworICAgICAgICB9CisgICAgICAgIGV2ZW50U2luayA9IG51bGw7CisgICAgfQorCisgICAgQFBPU1QKKyAgICBAUGF0aCgiZG9tYWlucy97aWR9IikKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlNFUlZFUl9TRU5UX0VWRU5UUykKKyAgICBwdWJsaWMgdm9pZCBzdGFydERvbWFpbihAUGF0aFBhcmFtKCJpZCIpIGZpbmFsIFN0cmluZyBpZCwgQENvbnRleHQgU3NlRXZlbnRTaW5rIGRvbWFpblNpbmssIEBDb250ZXh0IFNzZSBzc2UpIHsKKyAgICAgICAgbmV3IFRocmVhZCgoKSAtPiB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGRvbWFpblNpbmsuc2VuZChzc2UubmV3RXZlbnRCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lKCJkb21haW4tcHJvZ3Jlc3MiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRhdGEoU3RyaW5nLmNsYXNzLCAic3RhcnRpbmcgZG9tYWluICIgKyBpZCArICIgLi4uIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMjAwKTsKKyAgICAgICAgICAgICAgICBkb21haW5TaW5rLnNlbmQoc3NlLm5ld0V2ZW50QnVpbGRlcigpLm5hbWUoImRvbWFpbi1wcm9ncmVzcyIpLmRhdGEoU3RyaW5nLmNsYXNzLCAiNTAlIikuYnVpbGQoKSk7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDIwMCk7CisgICAgICAgICAgICAgICAgZG9tYWluU2luay5zZW5kKHNzZS5uZXdFdmVudEJ1aWxkZXIoKS5uYW1lKCJkb21haW4tcHJvZ3Jlc3MiKS5kYXRhKFN0cmluZy5jbGFzcywgIjYwJSIpLmJ1aWxkKCkpOworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgyMDApOworICAgICAgICAgICAgICAgIGRvbWFpblNpbmsuc2VuZChzc2UubmV3RXZlbnRCdWlsZGVyKCkubmFtZSgiZG9tYWluLXByb2dyZXNzIikuZGF0YShTdHJpbmcuY2xhc3MsICI3MCUiKS5idWlsZCgpKTsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMjAwKTsKKyAgICAgICAgICAgICAgICBkb21haW5TaW5rLnNlbmQoc3NlLm5ld0V2ZW50QnVpbGRlcigpLm5hbWUoImRvbWFpbi1wcm9ncmVzcyIpLmRhdGEoU3RyaW5nLmNsYXNzLCAiOTklIikuYnVpbGQoKSk7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDIwMCk7CisgICAgICAgICAgICAgICAgZG9tYWluU2luay5zZW5kKHNzZS5uZXdFdmVudEJ1aWxkZXIoKS5uYW1lKCJkb21haW4tcHJvZ3Jlc3MiKS5kYXRhKFN0cmluZy5jbGFzcywgImRvbmUiKS5idWlsZCgpKTsKKyAgICAgICAgICAgICAgICBkb21haW5TaW5rLmNsb3NlKCk7CisKKyAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9KS5zdGFydCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3NlcnZlci1zZW50LWV2ZW50cy1qYXhycy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3NzZS9qYXhycy9TZXJ2ZXJTZW50RXZlbnRzVGVzdC5qYXZhIGIvZXhhbXBsZXMvc2VydmVyLXNlbnQtZXZlbnRzLWpheHJzL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvc3NlL2pheHJzL1NlcnZlclNlbnRFdmVudHNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBlMjM0YQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3NlcnZlci1zZW50LWV2ZW50cy1qYXhycy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3NzZS9qYXhycy9TZXJ2ZXJTZW50RXZlbnRzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnNzZS5qYXhyczsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLnNzZS5Tc2VFdmVudFNvdXJjZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhLlRocmVhZEZhY3RvcnlCdWlsZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLm5vdE51bGxWYWx1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogU1NFIGV4YW1wbGUgcmVzb3VyY2VzIHRlc3QuCisgKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBTZXJ2ZXJTZW50RXZlbnRzVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBmaW5hbCBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlID0KKyAgICAgICAgICAgIEV4ZWN1dG9ycy5uZXdDYWNoZWRUaHJlYWRQb29sKG5ldyBUaHJlYWRGYWN0b3J5QnVpbGRlcigpLnNldE5hbWVGb3JtYXQoIlNlcnZlclNlbnRFdmVudHNUZXN0LSVkIikuYnVpbGQoKSk7CisgICAgcHJpdmF0ZSBmaW5hbCBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdCdWlsZGVyKCkuZXhlY3V0b3JTZXJ2aWNlKGV4ZWN1dG9yU2VydmljZSkuYnVpbGQoKTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIC8vIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoSmF4UnNTZXJ2ZXJTZW50RXZlbnRzUmVzb3VyY2UuY2xhc3MsIERvbWFpblJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQ2xpZW50IGdldENsaWVudCgpIHsKKyAgICAgICAgcmV0dXJuIGNsaWVudDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgICAgICBjbGllbnQuY2xvc2UoKTsKKyAgICAgICAgZXhlY3V0b3JTZXJ2aWNlLnNodXRkb3duKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBjb25zdW1pbmcgYSBzaW5nbGUgU1NFIGV2ZW50IHZpYSBldmVudCBzb3VyY2UuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgZmFpbHVyZSBkdXJpbmcgdGhlIHRlc3QgZXhlY3V0aW9uLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEV2ZW50U291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgIGZpbmFsIEF0b21pY1JlZmVyZW5jZTxTdHJpbmc+IG1lc3NhZ2UgPSBuZXcgQXRvbWljUmVmZXJlbmNlPD4oKTsKKyAgICAgICAgZmluYWwgU3NlRXZlbnRTb3VyY2UgZXZlbnRTb3VyY2UgPSBTc2VFdmVudFNvdXJjZS50YXJnZXQodGFyZ2V0KCkucGF0aChBcHAuUk9PVF9QQVRIKSkuYnVpbGQoKTsKKyAgICAgICAgZXZlbnRTb3VyY2UucmVnaXN0ZXIoKGluYm91bmRFdmVudCkgLT4geworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlID0gaW5ib3VuZEV2ZW50LnJlYWREYXRhKCk7CisgICAgICAgICAgICBtZXNzYWdlLnNldCh2YWx1ZSk7CisgICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgZXZlbnRTb3VyY2Uub3BlbigpOworICAgICAgICB0YXJnZXQoKS5wYXRoKEFwcC5ST09UX1BBVEgpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS50ZXh0KCJtZXNzYWdlIikpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJXYWl0aW5nIGZvciBtZXNzYWdlIHRvIGJlIGRlbGl2ZXJlZCBoYXMgdGltZWQgb3V0LiIsCisgICAgICAgICAgICAgICAgICAgIGxhdGNoLmF3YWl0KDUgKiBnZXRBc3luY1RpbWVvdXRNdWx0aXBsaWVyKCksIFRpbWVVbml0LlNFQ09ORFMpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGV2ZW50U291cmNlLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VGhhdCgiVW5leHBlY3RlZCBTU0UgZXZlbnQgZGF0YSB2YWx1ZS4iLCBtZXNzYWdlLmdldCgpLCBlcXVhbFRvKCJtZXNzYWdlIikpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGVzdCByZWNlaXZpbmcgYWxsIHN0cmVhbWVkIG1lc3NhZ2VzIGluIHBhcmFsbGVsIGJ5IG11bHRpcGxlIGV2ZW50IHNvdXJjZXMuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgZmFpbHVyZSBkdXJpbmcgdGhlIHRlc3QgZXhlY3V0aW9uLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZURvbWFpbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBpbnQgTUFYX0NMSUVOVFMgPSAyNTsKKyAgICAgICAgZmluYWwgaW50IE1FU1NBR0VfQ09VTlQgPSA2OworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiZG9tYWluL3N0YXJ0IikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgidGVzdFNvdXJjZXMiLCBNQVhfQ0xJRU5UUykKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpLnBvc3QoRW50aXR5LnRleHQoImRhdGEiKSwgUmVzcG9uc2UuY2xhc3MpOworCisgICAgICAgIGFzc2VydFRoYXQoIlVuZXhwZWN0ZWQgc3RhcnQgZG9tYWluIHJlc3BvbnNlIHN0YXR1cyBjb2RlLiIsCisgICAgICAgICAgICAgICAgcmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oUmVzcG9uc2UuU3RhdHVzLkNSRUFURUQuZ2V0U3RhdHVzQ29kZSgpKSk7CisKKyAgICAgICAgZmluYWwgTWFwPEludGVnZXIsIEludGVnZXI+IG1lc3NhZ2VDb3VudHMgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8PihNQVhfQ0xJRU5UUyk7CisgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGRvbmVMYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaChNQVhfQ0xJRU5UUyk7CisgICAgICAgIGZpbmFsIFNzZUV2ZW50U291cmNlW10gc291cmNlcyA9IG5ldyBTc2VFdmVudFNvdXJjZVtNQVhfQ0xJRU5UU107CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHByb2Nlc3NVcmlTdHJpbmcgPSB0YXJnZXQoKS5nZXRVcmkoKS5yZWxhdGl2aXplKHJlc3BvbnNlLmdldExvY2F0aW9uKCkpLnRvU3RyaW5nKCk7CisKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHNzZVRhcmdldCA9IHRhcmdldCgpLnBhdGgocHJvY2Vzc1VyaVN0cmluZykucXVlcnlQYXJhbSgidGVzdFNvdXJjZSIsICJ0cnVlIik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0NMSUVOVFM7IGkrKykgeworICAgICAgICAgICAgZmluYWwgQXRvbWljSW50ZWdlciBtZXNzYWdlQ291bnQgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsgIC8vIHdpbGwgdGhpcyB3b3JrPworICAgICAgICAgICAgZmluYWwgaW50IGlkID0gaTsKKyAgICAgICAgICAgIHNvdXJjZXNbaWRdID0gU3NlRXZlbnRTb3VyY2UudGFyZ2V0KHNzZVRhcmdldCkuYnVpbGQoKTsKKyAgICAgICAgICAgIHNvdXJjZXNbaWRdLnJlZ2lzdGVyKChldmVudCkgLT4geworICAgICAgICAgICAgICAgIG1lc3NhZ2VDb3VudC5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9IGV2ZW50LnJlYWREYXRhKFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICAgICAgaWYgKCJkb25lIi5lcXVhbHMobWVzc2FnZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUNvdW50cy5wdXQoaWQsIG1lc3NhZ2VDb3VudC5nZXQoKSk7CisgICAgICAgICAgICAgICAgICAgIGRvbmVMYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHNvdXJjZXNbaV0ub3BlbigpOworICAgICAgICB9CisKKyAgICAgICAgZG9uZUxhdGNoLmF3YWl0KDUgKiBnZXRBc3luY1RpbWVvdXRNdWx0aXBsaWVyKCksIFRpbWVVbml0LlNFQ09ORFMpOworCisgICAgICAgIGZvciAoU3NlRXZlbnRTb3VyY2Ugc291cmNlIDogc291cmNlcykgeworICAgICAgICAgICAgc291cmNlLmNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9DTElFTlRTOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIEludGVnZXIgY291bnQgPSBtZXNzYWdlQ291bnRzLmdldChpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoIkZpbmFsIG1lc3NhZ2Ugbm90IHJlY2VpdmVkIGJ5IGV2ZW50IHNvdXJjZSAiICsgaSwgY291bnQsIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIG1lc3NhZ2VzIHJlY2VpdmVkIGJ5IGV2ZW50IHNvdXJjZSAiICsgaSwKKyAgICAgICAgICAgICAgICAgICAgY291bnQsIGVxdWFsVG8oTUVTU0FHRV9DT1VOVCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc2VydmVyLXNlbnQtZXZlbnRzLWplcnNleS9SRUFETUUuTUQgYi9leGFtcGxlcy9zZXJ2ZXItc2VudC1ldmVudHMtamVyc2V5L1JFQURNRS5NRApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzEyMzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvc2VydmVyLXNlbnQtZXZlbnRzLWplcnNleS9SRUFETUUuTUQKQEAgLTAsMCArMSw3MiBAQAorWy8vXTogIyAiIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAiCitbLy9dOiAjICIgIgorWy8vXTogIyAiIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAiCitbLy9dOiAjICIgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQgIgorWy8vXTogIyAiIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4gIgorWy8vXTogIyAiICIKK1svL106ICMgIiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlICIKKworU2VydmVyLVNlbnQgRXZlbnRzIChTU0UpIEV4YW1wbGUKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgSkFYLVJTIDIuMCBzZXJ2ZXItc2VudCBldmVudHMgc3VwcG9ydCBzb21ldGltZXMgYWxzbyBjYWxsZWQgb25lLXdheSBwdWJsaXNoLXN1YnNjcmliZSBtb2RlbC4KKworVGhlIGZ1bGwgZGVzY3JpcHRpb24gaG93IHRvIGNyZWF0ZSBhIHN1cHBvcnQgZm9yIHNlcnZlci1zZW50IGV2ZW50cyBjYW4gYmUgZm91bmQgaW4gSmVyc2V5IFVzZXIgR3VpZGUsIGNoYXB0ZXIKK1tTZXJ2ZXItU2VudCBFdmVudHMgKFNTRSkgU3VwcG9ydF0oaHR0cHM6Ly9qZXJzZXkuamF2YS5uZXQvZG9jdW1lbnRhdGlvbi9sYXRlc3Qvc3NlLmh0bWwpLgorCitJdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdG8gbG9vayBhdCBkZXRhaWxzIG9mIFNTRSBBUEkgU3BlY2lmaWNhdGlvbiBvbgorPGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDkvV0QtZXZlbnRzb3VyY2UtMjAwOTEwMjkvPgorCitDb250ZW50cworLS0tLS0tLS0KKworVGhlIG1hcHBpbmcgb2YgdGhlIFVSSSBwYXRoIHNwYWNlIGlzIHByZXNlbnRlZCBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOgorCitVUkkgcGF0aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgUmVzb3VyY2UgY2xhc3MgICAgICAgICAgICAgfCBIVFRQIG1ldGhvZHMgICB8IERlc2NyaXB0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLQorKipfc2VydmVyLXNlbnQtZXZlbnRzXyoqICAgICAgICAgICAgICB8IFNlcnZlclNlbnRFdmVudHNSZXNvdXJjZSAgIHwgR0VUICAgICAgICAgICAgfCBHZXQgZW50aXJlIEV2ZW50T3V0cHV0IHdpdGggYWxsIG1lc3NhZ2VzCisqKl9zZXJ2ZXItc2VudC1ldmVudHNfKiogICAgICAgICAgICAgIHwgU2VydmVyU2VudEV2ZW50c1Jlc291cmNlICAgfCBQT1NUICAgICAgICAgICB8IEluc2VydCBhIG5ldyBtZXNzYWdlIGluIEV2ZW50T3V0cHV0CisqKl9zZXJ2ZXItc2VudC1ldmVudHNfKiogICAgICAgICAgICAgIHwgU2VydmVyU2VudEV2ZW50c1Jlc291cmNlICAgfCBERUxFVEUgICAgICAgICB8IFJlc2V0IEV2ZW50T3V0cHV0CisqKl9zZXJ2ZXItc2VudC1ldmVudHMvZG9tYWlucy97aWR9XyoqIHwgQmxvY2tpbmdQb3N0Q2hhdFJlc291cmNlICAgfCBQT1NUICAgICAgICAgICB8IEdlbmVyYXRlIHNldmVyYWwgbWVzc2FnZXMgd2l0aCBhIGRlbGF5IGluIEV2ZW50T3V0cHV0IGFuZCByZXR1cm4gaXQKKworU2FtcGxlIFJlc3BvbnNlCistLS0tLS0tLS0tLS0tLS0KKworQSBncmVhdCBleGFtcGxlIG9mIFNlcnZlci1TZW50IEV2ZW50cyBpcyBgc2VydmVyLXNlbnQtZXZlbnRzL2RvbWFpbnMve2lkfWAgd2hpY2ggc2VuZHMgc2V2ZXJhbCBtZXNzYWdlcyB3aXRoIGEgZGVsYXkgMjAwbXMKK2JldHdlZW4gZWFjaCBvdGhlci4KKworPiAgICAgY3VybCAtdiAtWCBQT1NUIGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9zZXJ2ZXItc2VudC1ldmVudHMtamVyc2V5L2RvbWFpbnMvMSAtSCAiQ29udGVudC1UeXBlOiB0ZXh0L2V2ZW50LXN0cmVhbSIKKworTG9vayBhdCBhIGNvbnNvbGUgaG93IGV2ZW50cyBhcmUgaGFuZGxlZCBvbmUgYWZ0ZXIgYW5vdGhlciBpbiB0aGUgcmlnaHQgb3JkZXIuCisKK2BgYAorZXZlbnQ6IGRvbWFpbi1wcm9ncmVzcworZGF0YTogc3RhcnRpbmcgZG9tYWluIDEgLi4uCisKK2V2ZW50OiBkb21haW4tcHJvZ3Jlc3MKK2RhdGE6IDUwJQorCitldmVudDogZG9tYWluLXByb2dyZXNzCitkYXRhOiA2MCUKKworZXZlbnQ6IGRvbWFpbi1wcm9ncmVzcworZGF0YTogNzAlCisKK2V2ZW50OiBkb21haW4tcHJvZ3Jlc3MKK2RhdGE6IDk5JQorCitldmVudDogZG9tYWluLXByb2dyZXNzCitkYXRhOiBkb25lCitgYGAKKworUnVubmluZyB0aGUgRXhhbXBsZQorLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMb29rIGF0IEplcnNleSBEb2N1bWVudGF0aW9uIHRvIGxlYXJuIGhvdyB0byBjb25zdW1lIFNlcnZlci1TZW50IEV2ZW50cyB1c2luZyBKZXJzZXkgQ2xpZW50IAorPGh0dHBzOi8vamVyc2V5LmphdmEubmV0L2RvY3VtZW50YXRpb24vbGF0ZXN0L3NzZS5odG1sI2QwZTExNzg2PgorCitSdW4gdGhlIGV4YW1wbGUgYXMgZm9sbG93czoKKworPiAgICAgbXZuIGNsZWFuIGNvbXBpbGUgZXhlYzpqYXZhCisKK1RoaXMgZGVwbG95cyB0aGUgZXhhbXBsZSB1c2luZyBbR3JpenpseV0oaHR0cDovL2dyaXp6bHkuamF2YS5uZXQvKSBjb250YWluZXIuCmRpZmYgLS1naXQgYS9leGFtcGxlcy9zZXJ2ZXItc2VudC1ldmVudHMtamVyc2V5L3BvbS54bWwgYi9leGFtcGxlcy9zZXJ2ZXItc2VudC1ldmVudHMtamVyc2V5L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY1ODBjMQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3NlcnZlci1zZW50LWV2ZW50cy1qZXJzZXkvcG9tLnhtbApAQCAtMCwwICsxLDc3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+c2VydmVyLXNlbnQtZXZlbnRzLWplcnNleTwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS1leGFtcGxlcy1zZXJ2ZXItc2VudC1ldmVudHMtamVyc2V5PC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPkplcnNleSBTZXJ2ZXItU2VudCBFdmVudHMgZXhhbXBsZS48L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1ncml6emx5Mi1odHRwPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWhrMjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLXNzZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhlYy1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxtYWluQ2xhc3M+QXBwPC9tYWluQ2xhc3M+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5yZWxlYXNlPC9pZD4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3NlcnZlci1zZW50LWV2ZW50cy1qZXJzZXkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9zc2UvamVyc2V5L0FwcC5qYXZhIGIvZXhhbXBsZXMvc2VydmVyLXNlbnQtZXZlbnRzLWplcnNleS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3NzZS9qZXJzZXkvQXBwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI1M2Q2YwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3NlcnZlci1zZW50LWV2ZW50cy1qZXJzZXkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9zc2UvamVyc2V5L0FwcC5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuc3NlLmplcnNleTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkyLmh0dHBzZXJ2ZXIuR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5Tc2VGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guZ3JpenpseS5odHRwLnNlcnZlci5IdHRwU2VydmVyOworCisvKioKKyAqIFNlcnZlciBzZW50IGV2ZW50IGV4YW1wbGUuCisgKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEFwcCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgQkFTRV9VUkkgPSBVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvIik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVF9QQVRIID0gInNlcnZlci1zZW50LWV2ZW50cyI7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlwiU2VydmVyLVNlbnQgRXZlbnRzXCIgSmVyc2V5IEV4YW1wbGUgQXBwIik7CisKKyAgICAgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKFNlcnZlclNlbnRFdmVudHNSZXNvdXJjZS5jbGFzcywgU3NlRmVhdHVyZS5jbGFzcyk7CisKKyAgICAgICAgICAgIGZpbmFsIEh0dHBTZXJ2ZXIgc2VydmVyID0gR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5LmNyZWF0ZUh0dHBTZXJ2ZXIoQkFTRV9VUkksIHJlc291cmNlQ29uZmlnLCBmYWxzZSk7CisgICAgICAgICAgICBSdW50aW1lLmdldFJ1bnRpbWUoKS5hZGRTaHV0ZG93bkhvb2sobmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIuc2h1dGRvd25Ob3coKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KSk7CisgICAgICAgICAgICBzZXJ2ZXIuc3RhcnQoKTsKKworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFN0cmluZy5mb3JtYXQoIkFwcGxpY2F0aW9uIHN0YXJ0ZWQuXG5Ucnkgb3V0ICVzJXNcblN0b3AgdGhlIGFwcGxpY2F0aW9uIHVzaW5nIENUUkwrQyIsCisgICAgICAgICAgICAgICAgICAgIEJBU0VfVVJJLCBST09UX1BBVEgpKTsKKworICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5qb2luKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIHwgSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoQXBwLmNsYXNzLmdldE5hbWUoKSkubG9nKExldmVsLlNFVkVSRSwgbnVsbCwgZXgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc2VydmVyLXNlbnQtZXZlbnRzLWplcnNleS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3NzZS9qZXJzZXkvRG9tYWluUmVzb3VyY2UuamF2YSBiL2V4YW1wbGVzL3NlcnZlci1zZW50LWV2ZW50cy1qZXJzZXkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9zc2UvamVyc2V5L0RvbWFpblJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUxZTkxNgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3NlcnZlci1zZW50LWV2ZW50cy1qZXJzZXkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9zc2UvamVyc2V5L0RvbWFpblJlc291cmNlLmphdmEKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuc3NlLmplcnNleTsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkRlZmF1bHRWYWx1ZTsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLkV2ZW50T3V0cHV0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5PdXRib3VuZEV2ZW50OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5Tc2VCcm9hZGNhc3RlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5zc2UuU3NlRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ2h1bmtlZE91dHB1dDsKKworLyoqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiZG9tYWluIikKK3B1YmxpYyBjbGFzcyBEb21haW5SZXNvdXJjZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8SW50ZWdlciwgUHJvY2Vzcz4gcHJvY2Vzc2VzID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPEludGVnZXIsIFByb2Nlc3M+KCk7CisKKyAgICBAUGF0aCgic3RhcnQiKQorICAgIEBQT1NUCisgICAgcHVibGljIFJlc3BvbnNlIHBvc3QoQERlZmF1bHRWYWx1ZSgiMCIpIEBRdWVyeVBhcmFtKCJ0ZXN0U291cmNlcyIpIGludCB0ZXN0U291cmNlcykgeworICAgICAgICBmaW5hbCBQcm9jZXNzIHByb2Nlc3MgPSBuZXcgUHJvY2Vzcyh0ZXN0U291cmNlcyk7CisgICAgICAgIHByb2Nlc3Nlcy5wdXQocHJvY2Vzcy5nZXRJZCgpLCBwcm9jZXNzKTsKKworICAgICAgICBFeGVjdXRvcnMubmV3U2luZ2xlVGhyZWFkRXhlY3V0b3IoKS5leGVjdXRlKHByb2Nlc3MpOworCisgICAgICAgIGZpbmFsIFVSSSBwcm9jZXNzSWRVcmkgPSBVcmlCdWlsZGVyLmZyb21SZXNvdXJjZShEb21haW5SZXNvdXJjZS5jbGFzcykucGF0aCgicHJvY2Vzcy97aWR9IikuYnVpbGQocHJvY2Vzcy5nZXRJZCgpKTsKKyAgICAgICAgcmV0dXJuIFJlc3BvbnNlLmNyZWF0ZWQocHJvY2Vzc0lkVXJpKS5idWlsZCgpOworICAgIH0KKworICAgIEBQYXRoKCJwcm9jZXNzL3tpZH0iKQorICAgIEBQcm9kdWNlcyhTc2VGZWF0dXJlLlNFUlZFUl9TRU5UX0VWRU5UUykKKyAgICBAR0VUCisgICAgcHVibGljIEV2ZW50T3V0cHV0IGdldFByb2dyZXNzKEBQYXRoUGFyYW0oImlkIikgaW50IGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBARGVmYXVsdFZhbHVlKCJmYWxzZSIpIEBRdWVyeVBhcmFtKCJ0ZXN0U291cmNlIikgYm9vbGVhbiB0ZXN0U291cmNlKSB7CisgICAgICAgIGZpbmFsIFByb2Nlc3MgcHJvY2VzcyA9IHByb2Nlc3Nlcy5nZXQoaWQpOworCisgICAgICAgIGlmIChwcm9jZXNzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmICh0ZXN0U291cmNlKSB7CisgICAgICAgICAgICAgICAgcHJvY2Vzcy5yZWxlYXNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBFdmVudE91dHB1dCBldmVudE91dHB1dCA9IG5ldyBFdmVudE91dHB1dCgpOworICAgICAgICAgICAgcHJvY2Vzcy5nZXRCcm9hZGNhc3RlcigpLmFkZChldmVudE91dHB1dCk7CisgICAgICAgICAgICByZXR1cm4gZXZlbnRPdXRwdXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm90Rm91bmRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBQcm9jZXNzIGltcGxlbWVudHMgUnVubmFibGUgeworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEF0b21pY0ludGVnZXIgY291bnRlciA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOworCisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IGlkOworICAgICAgICBwcml2YXRlIGZpbmFsIENvdW50RG93bkxhdGNoIGxhdGNoOworICAgICAgICBwcml2YXRlIGZpbmFsIFNzZUJyb2FkY2FzdGVyIGJyb2FkY2FzdGVyID0gbmV3IFNzZUJyb2FkY2FzdGVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkV4Y2VwdGlvbihDaHVua2VkT3V0cHV0PE91dGJvdW5kRXZlbnQ+IG91dGJvdW5kRXZlbnRDaHVua2VkT3V0cHV0LCBFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgZXhjZXB0aW9uLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHB1YmxpYyBQcm9jZXNzKGludCB0ZXN0UmVjZWl2ZXJzKSB7CisgICAgICAgICAgICBpZCA9IGNvdW50ZXIuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICAgICAgICBsYXRjaCA9IHRlc3RSZWNlaXZlcnMgPiAwID8gbmV3IENvdW50RG93bkxhdGNoKHRlc3RSZWNlaXZlcnMpIDogbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0SWQoKSB7CisgICAgICAgICAgICByZXR1cm4gaWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3NlQnJvYWRjYXN0ZXIgZ2V0QnJvYWRjYXN0ZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gYnJvYWRjYXN0ZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiByZWxlYXNlKCkgeworICAgICAgICAgICAgaWYgKGxhdGNoID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmIChsYXRjaCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHdhaXQgZm9yIGFsbCB0ZXN0IEV2ZW50U291cmNlcyB0byBiZSByZWdpc3RlcmVkCisgICAgICAgICAgICAgICAgICAgIGxhdGNoLmF3YWl0KDUsIFRpbWVVbml0LlNFQ09ORFMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJyb2FkY2FzdGVyLmJyb2FkY2FzdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPdXRib3VuZEV2ZW50LkJ1aWxkZXIoKS5uYW1lKCJkb21haW4tcHJvZ3Jlc3MiKS5kYXRhKFN0cmluZy5jbGFzcywgInN0YXJ0aW5nIGRvbWFpbiAiICsgaWQgKyAiIC4uLiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgICAgICAgICBicm9hZGNhc3Rlci5icm9hZGNhc3QobmV3IE91dGJvdW5kRXZlbnQuQnVpbGRlcigpLm5hbWUoImRvbWFpbi1wcm9ncmVzcyIpLmRhdGEoU3RyaW5nLmNsYXNzLCAiNTAlIikuYnVpbGQoKSk7CisgICAgICAgICAgICAgICAgYnJvYWRjYXN0ZXIuYnJvYWRjYXN0KG5ldyBPdXRib3VuZEV2ZW50LkJ1aWxkZXIoKS5uYW1lKCJkb21haW4tcHJvZ3Jlc3MiKS5kYXRhKFN0cmluZy5jbGFzcywgIjYwJSIpLmJ1aWxkKCkpOworICAgICAgICAgICAgICAgIGJyb2FkY2FzdGVyLmJyb2FkY2FzdChuZXcgT3V0Ym91bmRFdmVudC5CdWlsZGVyKCkubmFtZSgiZG9tYWluLXByb2dyZXNzIikuZGF0YShTdHJpbmcuY2xhc3MsICI3MCUiKS5idWlsZCgpKTsKKyAgICAgICAgICAgICAgICBicm9hZGNhc3Rlci5icm9hZGNhc3QobmV3IE91dGJvdW5kRXZlbnQuQnVpbGRlcigpLm5hbWUoImRvbWFpbi1wcm9ncmVzcyIpLmRhdGEoU3RyaW5nLmNsYXNzLCAiOTklIikuYnVpbGQoKSk7CisgICAgICAgICAgICAgICAgYnJvYWRjYXN0ZXIuYnJvYWRjYXN0KG5ldyBPdXRib3VuZEV2ZW50LkJ1aWxkZXIoKS5uYW1lKCJkb21haW4tcHJvZ3Jlc3MiKS5kYXRhKFN0cmluZy5jbGFzcywgImRvbmUiKS5idWlsZCgpKTsKKyAgICAgICAgICAgICAgICBicm9hZGNhc3Rlci5jbG9zZUFsbCgpOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9zZXJ2ZXItc2VudC1ldmVudHMtamVyc2V5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvc3NlL2plcnNleS9TZXJ2ZXJTZW50RXZlbnRzUmVzb3VyY2UuamF2YSBiL2V4YW1wbGVzL3NlcnZlci1zZW50LWV2ZW50cy1qZXJzZXkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9zc2UvamVyc2V5L1NlcnZlclNlbnRFdmVudHNSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiODA5NmQKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zZXJ2ZXItc2VudC1ldmVudHMtamVyc2V5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvc3NlL2plcnNleS9TZXJ2ZXJTZW50RXZlbnRzUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDkyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnNzZS5qZXJzZXk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuREVMRVRFOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLkV2ZW50T3V0cHV0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5PdXRib3VuZEV2ZW50OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5Tc2VGZWF0dXJlOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJzZXJ2ZXItc2VudC1ldmVudHMiKQorcHVibGljIGNsYXNzIFNlcnZlclNlbnRFdmVudHNSZXNvdXJjZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBFdmVudE91dHB1dCBldmVudE91dHB1dCA9IG5ldyBFdmVudE91dHB1dCgpOworCisgICAgQEdFVAorICAgIEBQcm9kdWNlcyhTc2VGZWF0dXJlLlNFUlZFUl9TRU5UX0VWRU5UUykKKyAgICBwdWJsaWMgRXZlbnRPdXRwdXQgZ2V0TWVzc2FnZVF1ZXVlKCkgeworICAgICAgICByZXR1cm4gZXZlbnRPdXRwdXQ7CisgICAgfQorCisgICAgQFBPU1QKKyAgICBwdWJsaWMgdm9pZCBhZGRNZXNzYWdlKGZpbmFsIFN0cmluZyBtZXNzYWdlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBFdmVudE91dHB1dCBsb2NhbE91dHB1dCA9IGV2ZW50T3V0cHV0OworICAgICAgICBpZiAobG9jYWxPdXRwdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgZXZlbnRPdXRwdXQud3JpdGUobmV3IE91dGJvdW5kRXZlbnQuQnVpbGRlcigpLm5hbWUoImN1c3RvbS1tZXNzYWdlIikuZGF0YShTdHJpbmcuY2xhc3MsIG1lc3NhZ2UpLmJ1aWxkKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQERFTEVURQorICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgRXZlbnRPdXRwdXQgbG9jYWxPdXRwdXQgPSBldmVudE91dHB1dDsKKyAgICAgICAgaWYgKGxvY2FsT3V0cHV0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGV2ZW50T3V0cHV0LmNsb3NlKCk7CisgICAgICAgIH0KKyAgICAgICAgU2VydmVyU2VudEV2ZW50c1Jlc291cmNlLnNldEV2ZW50T3V0cHV0KG5ldyBFdmVudE91dHB1dCgpKTsKKyAgICB9CisKKyAgICBAUE9TVAorICAgIEBQYXRoKCJkb21haW5zL3tpZH0iKQorICAgIEBQcm9kdWNlcyhTc2VGZWF0dXJlLlNFUlZFUl9TRU5UX0VWRU5UUykKKyAgICBwdWJsaWMgRXZlbnRPdXRwdXQgc3RhcnREb21haW4oQFBhdGhQYXJhbSgiaWQiKSBmaW5hbCBTdHJpbmcgaWQpIHsKKyAgICAgICAgZmluYWwgRXZlbnRPdXRwdXQgc2VxID0gbmV3IEV2ZW50T3V0cHV0KCk7CisKKyAgICAgICAgbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzZXEud3JpdGUobmV3IE91dGJvdW5kRXZlbnQuQnVpbGRlcigpLm5hbWUoImRvbWFpbi1wcm9ncmVzcyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRhdGEoU3RyaW5nLmNsYXNzLCAic3RhcnRpbmcgZG9tYWluICIgKyBpZCArICIgLi4uIikuYnVpbGQoKSk7CisgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgyMDApOworICAgICAgICAgICAgICAgICAgICBzZXEud3JpdGUobmV3IE91dGJvdW5kRXZlbnQuQnVpbGRlcigpLm5hbWUoImRvbWFpbi1wcm9ncmVzcyIpLmRhdGEoU3RyaW5nLmNsYXNzLCAiNTAlIikuYnVpbGQoKSk7CisgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgyMDApOworICAgICAgICAgICAgICAgICAgICBzZXEud3JpdGUobmV3IE91dGJvdW5kRXZlbnQuQnVpbGRlcigpLm5hbWUoImRvbWFpbi1wcm9ncmVzcyIpLmRhdGEoU3RyaW5nLmNsYXNzLCAiNjAlIikuYnVpbGQoKSk7CisgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgyMDApOworICAgICAgICAgICAgICAgICAgICBzZXEud3JpdGUobmV3IE91dGJvdW5kRXZlbnQuQnVpbGRlcigpLm5hbWUoImRvbWFpbi1wcm9ncmVzcyIpLmRhdGEoU3RyaW5nLmNsYXNzLCAiNzAlIikuYnVpbGQoKSk7CisgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgyMDApOworICAgICAgICAgICAgICAgICAgICBzZXEud3JpdGUobmV3IE91dGJvdW5kRXZlbnQuQnVpbGRlcigpLm5hbWUoImRvbWFpbi1wcm9ncmVzcyIpLmRhdGEoU3RyaW5nLmNsYXNzLCAiOTklIikuYnVpbGQoKSk7CisgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgyMDApOworICAgICAgICAgICAgICAgICAgICBzZXEud3JpdGUobmV3IE91dGJvdW5kRXZlbnQuQnVpbGRlcigpLm5hbWUoImRvbWFpbi1wcm9ncmVzcyIpLmRhdGEoU3RyaW5nLmNsYXNzLCAiZG9uZSIpLmJ1aWxkKCkpOworICAgICAgICAgICAgICAgICAgICBzZXEuY2xvc2UoKTsKKworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEludGVycnVwdGVkRXhjZXB0aW9uIHwgSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfS5zdGFydCgpOworCisgICAgICAgIHJldHVybiBzZXE7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRFdmVudE91dHB1dChmaW5hbCBFdmVudE91dHB1dCBldmVudE91dHB1dCkgeworICAgICAgICBTZXJ2ZXJTZW50RXZlbnRzUmVzb3VyY2UuZXZlbnRPdXRwdXQgPSBldmVudE91dHB1dDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9zZXJ2ZXItc2VudC1ldmVudHMtamVyc2V5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvc3NlL2plcnNleS9TZXJ2ZXJTZW50RXZlbnRzVGVzdC5qYXZhIGIvZXhhbXBsZXMvc2VydmVyLXNlbnQtZXZlbnRzLWplcnNleS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3NzZS9qZXJzZXkvU2VydmVyU2VudEV2ZW50c1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzgyZTdkCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvc2VydmVyLXNlbnQtZXZlbnRzLWplcnNleS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3NzZS9qZXJzZXkvU2VydmVyU2VudEV2ZW50c1Rlc3QuamF2YQpAQCAtMCwwICsxLDIxNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5zc2UuamVyc2V5OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5FdmVudElucHV0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5FdmVudExpc3RlbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5FdmVudFNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5zc2UuSW5ib3VuZEV2ZW50OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5Tc2VGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMubm90TnVsbFZhbHVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBTU0UgZXhhbXBsZSByZXNvdXJjZXMgdGVzdC4KKyAqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFNlcnZlclNlbnRFdmVudHNUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisgICAgLy8gVE9ETyAtIGR1ZSB0byBKZGtDb25uZWN0b3IgbWlncmF0aW9uIHRoaXMgd2FzIHJhZGljYWxseSByZWR1Y2VkLiBJdCBkZWFkbG9ja3Mgd2l0aCAyNSBjbGllbnRzLCBmaW5kIG91dCB3aHkhCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9DTElFTlRTID0gMTA7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICAvLyBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFNlcnZlclNlbnRFdmVudHNSZXNvdXJjZS5jbGFzcywgRG9tYWluUmVzb3VyY2UuY2xhc3MsIFNzZUZlYXR1cmUuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5wcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLkFTWU5DX1RIUkVBRFBPT0xfU0laRSwgTUFYX0NMSUVOVFMgKyAyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGNvbnN1bWluZyBhIHNpbmdsZSBTU0UgZXZlbnQgdmlhIGV2ZW50IHNvdXJjZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGluIGNhc2Ugb2YgYSBmYWlsdXJlIGR1cmluZyB0aGUgdGVzdCBleGVjdXRpb24uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXZlbnRTb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgZmluYWwgQXRvbWljUmVmZXJlbmNlPFN0cmluZz4gbWVzc2FnZSA9IG5ldyBBdG9taWNSZWZlcmVuY2U8U3RyaW5nPigpOworICAgICAgICBmaW5hbCBFdmVudFNvdXJjZSBldmVudFNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSh0YXJnZXQoKS5wYXRoKEFwcC5ST09UX1BBVEgpKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXZlbnQoSW5ib3VuZEV2ZW50IGluYm91bmRFdmVudCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSA9IGluYm91bmRFdmVudC5yZWFkRGF0YSgpOworICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNldCh2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFByb2Nlc3NpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICB0YXJnZXQoKS5wYXRoKEFwcC5ST09UX1BBVEgpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS50ZXh0KCJtZXNzYWdlIikpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJXYWl0aW5nIGZvciBtZXNzYWdlIHRvIGJlIGRlbGl2ZXJlZCBoYXMgdGltZWQgb3V0LiIsCisgICAgICAgICAgICAgICAgICAgIGxhdGNoLmF3YWl0KDUgKiBnZXRBc3luY1RpbWVvdXRNdWx0aXBsaWVyKCksIFRpbWVVbml0LlNFQ09ORFMpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGV2ZW50U291cmNlLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0VGhhdCgiVW5leHBlY3RlZCBTU0UgZXZlbnQgZGF0YSB2YWx1ZS4iLCBtZXNzYWdlLmdldCgpLCBlcXVhbFRvKCJtZXNzYWdlIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgY29uc3VtaW5nIG11bHRpcGxlIFNTRSBldmVudHMgc2VxdWVudGlhbGx5IHVzaW5nIGV2ZW50IGlucHV0LgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24gaW4gY2FzZSBvZiBhIGZhaWx1cmUgZHVyaW5nIHRoZSB0ZXN0IGV4ZWN1dGlvbi4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbmJvdW5kRXZlbnRSZWFkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgaW50IE1BWF9NRVNTQUdFUyA9IDU7CisgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIHN0YXJ0TGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisKKyAgICAgICAgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBGdXR1cmU8TGlzdDxTdHJpbmc+PiBmdXR1cmVNZXNzYWdlcyA9CisgICAgICAgICAgICAgICAgICAgIGV4ZWN1dG9yLnN1Ym1pdChuZXcgQ2FsbGFibGU8TGlzdDxTdHJpbmc+PigpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBFdmVudElucHV0IGV2ZW50SW5wdXQgPSB0YXJnZXQoQXBwLlJPT1RfUEFUSCkucmVnaXN0ZXIoU3NlRmVhdHVyZS5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkuZ2V0KEV2ZW50SW5wdXQuY2xhc3MpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRMYXRjaC5jb3VudERvd24oKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBtZXNzYWdlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPihNQVhfTUVTU0FHRVMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX01FU1NBR0VTOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluYm91bmRFdmVudCBldmVudCA9IGV2ZW50SW5wdXQucmVhZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXMuYWRkKGV2ZW50LnJlYWREYXRhKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50SW5wdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRJbnB1dC5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiV2FpdGluZyBmb3IgcmVjZWl2ZXIgdGhyZWFkIHRvIHN0YXJ0IGhhcyB0aW1lZCBvdXQuIiwKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRMYXRjaC5hd2FpdCg1LCBUaW1lVW5pdC5TRUNPTkRTKSk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX01FU1NBR0VTOyBpKyspIHsKKyAgICAgICAgICAgICAgICB0YXJnZXQoQXBwLlJPT1RfUEFUSCkucmVxdWVzdCgpLnBvc3QoRW50aXR5LnRleHQoIm1lc3NhZ2UgIiArIGkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgZm9yIChTdHJpbmcgbWVzc2FnZSA6IGZ1dHVyZU1lc3NhZ2VzLmdldCg1MDAwLCBUaW1lVW5pdC5TRUNPTkRTKSkgeworICAgICAgICAgICAgICAgIGFzc2VydFRoYXQoIlVuZXhwZWN0ZWQgU1NFIGV2ZW50IGRhdGEgdmFsdWUuIiwgbWVzc2FnZSwgZXF1YWxUbygibWVzc2FnZSAiICsgaSsrKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBleGVjdXRvci5zaHV0ZG93bk5vdygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCByZWNlaXZpbmcgYWxsIHN0cmVhbWVkIG1lc3NhZ2VzIGluIHBhcmFsbGVsIGJ5IG11bHRpcGxlIGV2ZW50IHNvdXJjZXMuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgZmFpbHVyZSBkdXJpbmcgdGhlIHRlc3QgZXhlY3V0aW9uLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZURvbWFpbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBpbnQgTUVTU0FHRV9DT1VOVCA9IDY7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJkb21haW4vc3RhcnQiKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJ0ZXN0U291cmNlcyIsIE1BWF9DTElFTlRTKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkucG9zdChFbnRpdHkudGV4dCgiZGF0YSIpLCBSZXNwb25zZS5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0VGhhdCgiVW5leHBlY3RlZCBzdGFydCBkb21haW4gcmVzcG9uc2Ugc3RhdHVzIGNvZGUuIiwKKyAgICAgICAgICAgICAgICByZXNwb25zZS5nZXRTdGF0dXMoKSwgZXF1YWxUbyhSZXNwb25zZS5TdGF0dXMuQ1JFQVRFRC5nZXRTdGF0dXNDb2RlKCkpKTsKKworICAgICAgICBmaW5hbCBNYXA8SW50ZWdlciwgSW50ZWdlcj4gbWVzc2FnZUNvdW50cyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPihNQVhfQ0xJRU5UUyk7CisgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGRvbmVMYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaChNQVhfQ0xJRU5UUyk7CisgICAgICAgIGZpbmFsIEV2ZW50U291cmNlW10gc291cmNlcyA9IG5ldyBFdmVudFNvdXJjZVtNQVhfQ0xJRU5UU107CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHByb2Nlc3NVcmlTdHJpbmcgPSB0YXJnZXQoKS5nZXRVcmkoKS5yZWxhdGl2aXplKHJlc3BvbnNlLmdldExvY2F0aW9uKCkpLnRvU3RyaW5nKCk7CisKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHNzZVRhcmdldCA9IHRhcmdldCgpLnBhdGgocHJvY2Vzc1VyaVN0cmluZykucXVlcnlQYXJhbSgidGVzdFNvdXJjZSIsICJ0cnVlIik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0NMSUVOVFM7IGkrKykgeworICAgICAgICAgICAgZmluYWwgaW50IGlkID0gaTsKKyAgICAgICAgICAgIHNvdXJjZXNbaWRdID0gRXZlbnRTb3VyY2UudGFyZ2V0KHNzZVRhcmdldCkuYnVpbGQoKTsKKyAgICAgICAgICAgIHNvdXJjZXNbaWRdLnJlZ2lzdGVyKG5ldyBFdmVudExpc3RlbmVyKCkgeworCisgICAgICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNJbnRlZ2VyIG1lc3NhZ2VDb3VudCA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOworCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25FdmVudChJbmJvdW5kRXZlbnQgaW5ib3VuZEV2ZW50KSB7CisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VDb3VudC5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSBpbmJvdW5kRXZlbnQucmVhZERhdGEoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCJkb25lIi5lcXVhbHMobWVzc2FnZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VDb3VudHMucHV0KGlkLCBtZXNzYWdlQ291bnQuZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgZG9uZUxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBzb3VyY2VzW2ldLm9wZW4oKTsKKyAgICAgICAgfQorCisgICAgICAgIGRvbmVMYXRjaC5hd2FpdCg1ICogZ2V0QXN5bmNUaW1lb3V0TXVsdGlwbGllcigpLCBUaW1lVW5pdC5TRUNPTkRTKTsKKworICAgICAgICBmb3IgKEV2ZW50U291cmNlIHNvdXJjZSA6IHNvdXJjZXMpIHsKKyAgICAgICAgICAgIHNvdXJjZS5jbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfQ0xJRU5UUzsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBJbnRlZ2VyIGNvdW50ID0gbWVzc2FnZUNvdW50cy5nZXQoaSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KCJGaW5hbCBtZXNzYWdlIG5vdCByZWNlaXZlZCBieSBldmVudCBzb3VyY2UgIiArIGksIGNvdW50LCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KCJVbmV4cGVjdGVkIG51bWJlciBvZiBtZXNzYWdlcyByZWNlaXZlZCBieSBldmVudCBzb3VyY2UgIiArIGksCisgICAgICAgICAgICAgICAgICAgIGNvdW50LCBlcXVhbFRvKE1FU1NBR0VfQ09VTlQpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3NlcnZsZXQzLXdlYmFwcC9SRUFETUUuTUQgYi9leGFtcGxlcy9zZXJ2bGV0My13ZWJhcHAvUkVBRE1FLk1ECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzOWY3ODkKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zZXJ2bGV0My13ZWJhcHAvUkVBRE1FLk1ECkBAIC0wLDAgKzEsMzUgQEAKK1svL106ICMgIiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIgorWy8vXTogIyAiICIKK1svL106ICMgIiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgIgorWy8vXTogIyAiIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0ICIKK1svL106ICMgIiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuICIKK1svL106ICMgIiAiCitbLy9dOiAjICIgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZSAiCisKK1NlcnZsZXQgMyBFeGFtcGxlCis9PT09PT09PT09PT09PT09PT09CisKK1RoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIHVzZSBhZHZhbnRhZ2VzIG9mIFNlcnZsZXQgdjMgYW5kIGhvdyB0byBjb25maWd1cmUgSmVyc2V5IGFwcGxpY2F0aW9uIHdpdGggdGhpcyB2ZXJzaW9uIG9mIEplcnNleS4KK0pBWC1SUyByZXNvdXJjZSByZXR1cm5zIHRoZSB1c3VhbCB0ZXh0CisKK0NvbnRlbnRzCistLS0tLS0tLQorCitUaGUgbWFwcGluZyBvZiB0aGUgVVJJIHBhdGggc3BhY2UgaXMgcHJlc2VudGVkIGluIHRoZSBmb2xsb3dpbmcgdGFibGU6CisKK1VSSSBwYXRoICAgICAgICAgICAgIHwgUmVzb3VyY2UgY2xhc3MgICAgICB8IEhUVFAgbWV0aG9kcworLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tCisqKl8vY2F0XyoqICAgICAgICAgICB8IENhdFJlc291cmNlICAgICAgICAgfCAgR0VUCisqKl8vZG9nXyoqICAgICAgICAgICB8IERvZ1Jlc291cmNlICAgICAgICAgfCAgR0VUCisKK1J1bm5pbmcgdGhlIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworUnVuIHRoZSBleGFtcGxlIHVzaW5nIEpldHR5ICBhcyBmb2xsb3dzOgorCis+ICAgbXZuIGNsZWFuIHBhY2thZ2UgamV0dHk6cnVuCisKK0dvIHRvIHRoZSBVUkw6CisKKy0gICA8aHR0cDovL2xvY2FsaG9zdDo5OTk4L2FuaW1hbHMvY2F0PgorLSAgIDxodHRwOi8vbG9jYWxob3N0Ojk5OTgvYW5pbWFscy9kb2c+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9zZXJ2bGV0My13ZWJhcHAvcG9tLnhtbCBiL2V4YW1wbGVzL3NlcnZsZXQzLXdlYmFwcC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzYWNmYjIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zZXJ2bGV0My13ZWJhcHAvcG9tLnhtbApAQCAtMCwwICsxLDEzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKworICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD53ZWJhcHAtZXhhbXBsZS1wYXJlbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vd2ViYXBwLWV4YW1wbGUtcGFyZW50L3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPnNlcnZsZXQzLXdlYmFwcDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS1leGFtcGxlcy1zZXJ2bGV0My13ZWJhcHA8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+SmVyc2V5IFNlcnZsZXQgMyBleGFtcGxlIHdpdGggbWlzc2luZyBzZXJ2bGV0LWNsYXNzIGluIHRoZSB3ZWIueG1sIGZpbGU8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguc2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3NlcnZsZXQzLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktaGsyPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1ncml6emx5Mi1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxza2lwVGVzdHM+dHJ1ZTwvc2tpcFRlc3RzPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHNraXA+JHtza2lwLnRlc3RzfTwvc2tpcD4KKyAgICAgICAgICAgICAgICAgICAgPHNjYW5JbnRlcnZhbFNlY29uZHM+MTA8L3NjYW5JbnRlcnZhbFNlY29uZHM+CisgICAgICAgICAgICAgICAgICAgIDxzdG9wUG9ydD45OTk5PC9zdG9wUG9ydD4KKyAgICAgICAgICAgICAgICAgICAgPHN0b3BLZXk+U1RPUDwvc3RvcEtleT4KKyAgICAgICAgICAgICAgICAgICAgPHdlYkFwcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb250ZXh0UGF0aD4vPC9jb250ZXh0UGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx3ZWJJbmZJbmNsdWRlSmFyUGF0dGVybj4uKi8uKmplcnNleS1bXi9dXC5qYXIkPC93ZWJJbmZJbmNsdWRlSmFyUGF0dGVybj4KKyAgICAgICAgICAgICAgICAgICAgPC93ZWJBcHA+CisgICAgICAgICAgICAgICAgICAgIDxjb25uZWN0b3JzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbm5lY3RvciBpbXBsZW1lbnRhdGlvbj0ib3JnLmVjbGlwc2UuamV0dHkuc2VydmVyLm5pby5TZWxlY3RDaGFubmVsQ29ubmVjdG9yIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9ydD4ke2plcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydH08L3BvcnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1heElkbGVUaW1lPjYwMDAwPC9tYXhJZGxlVGltZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29ubmVjdG9yPgorICAgICAgICAgICAgICAgICAgICA8L2Nvbm5lY3RvcnM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlkPnN0YXJ0LWpldHR5PC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wcmUtaW50ZWdyYXRpb24tdGVzdDwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzY2FuSW50ZXJ2YWxTZWNvbmRzPjA8L3NjYW5JbnRlcnZhbFNlY29uZHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRhZW1vbj50cnVlPC9kYWVtb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlkPnN0b3AtamV0dHk8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBvc3QtaW50ZWdyYXRpb24tdGVzdDwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+c3RvcDwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+cmVsZWFzZTwvaWQ+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnhtbC1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0Pjk5OTg8L2plcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydD4KKyAgICA8L3Byb3BlcnRpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3NlcnZsZXQzLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3NlcnZsZXQzL3dlYmFwcC9BcHAuamF2YSBiL2V4YW1wbGVzL3NlcnZsZXQzLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3NlcnZsZXQzL3dlYmFwcC9BcHAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTNmNWQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvc2VydmxldDMtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvc2VydmxldDMvd2ViYXBwL0FwcC5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuc2VydmxldDMud2ViYXBwOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIFRlc3QgQXBwbGljYXRpb24gc3ViY2xhc3MgZm9yIHNlcnZsZXQzLXdlYmFwcCBleGFtcGxlLgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEFwcCBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgIEhhc2hTZXQ8Q2xhc3M8Pz4+IGNsYXNzZXMgPSBuZXcgSGFzaFNldDxDbGFzczw/Pj4oKTsKKyAgICAgICAgY2xhc3Nlcy5hZGQoRG9nUmVzb3VyY2UuY2xhc3MpOworICAgICAgICBjbGFzc2VzLmFkZChDYXRSZXNvdXJjZS5jbGFzcyk7CisKKyAgICAgICAgcmV0dXJuIGNsYXNzZXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc2VydmxldDMtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvc2VydmxldDMvd2ViYXBwL0NhdFJlc291cmNlLmphdmEgYi9leGFtcGxlcy9zZXJ2bGV0My13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9zZXJ2bGV0My93ZWJhcHAvQ2F0UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDIwNzFkCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvc2VydmxldDMtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvc2VydmxldDMvd2ViYXBwL0NhdFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5zZXJ2bGV0My53ZWJhcHA7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKKworLyoqCisgKiBUZXN0IHJlc291cmNlIGZvciB0aGUgc2VydmxldDMtd2ViYXBwIGV4YW1wbGUuCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiY2F0IikKK3B1YmxpYyBjbGFzcyBDYXRSZXNvdXJjZSB7CisgICAgQEdFVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIFN0cmluZyBtZW93KCkgeworICAgICAgICByZXR1cm4gIk1pYW93ISI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc2VydmxldDMtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvc2VydmxldDMvd2ViYXBwL0RvZ1Jlc291cmNlLmphdmEgYi9leGFtcGxlcy9zZXJ2bGV0My13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9zZXJ2bGV0My93ZWJhcHAvRG9nUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTI1NzZlCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvc2VydmxldDMtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvc2VydmxldDMvd2ViYXBwL0RvZ1Jlc291cmNlLmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5zZXJ2bGV0My53ZWJhcHA7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKKworLyoqCisgKiBUZXN0IHJlc291cmNlIGZvciB0aGUgc2VydmxldDMtd2ViYXBwIGV4YW1wbGUuCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiZG9nIikKK3B1YmxpYyBjbGFzcyBEb2dSZXNvdXJjZSB7CisgICAgQEdFVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIFN0cmluZyBiYXJrKCkgeworICAgICAgICByZXR1cm4gIldvb2YhIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9zZXJ2bGV0My13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL2V4YW1wbGVzL3NlcnZsZXQzLXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYTY2MTQKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zZXJ2bGV0My13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDIzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjMuMCIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzNfMC54c2QiPgorICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnNlcnZsZXQzLndlYmFwcC5BcHA8L3NlcnZsZXQtbmFtZT4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5zZXJ2bGV0My53ZWJhcHAuQXBwPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vYW5pbWFscy8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3NlcnZsZXQzLXdlYmFwcC9zcmMvdGVzdC9qYXZhL1NlcnZsZXQzV2ViYXBwSVRDYXNlLmphdmEgYi9leGFtcGxlcy9zZXJ2bGV0My13ZWJhcHAvc3JjL3Rlc3QvamF2YS9TZXJ2bGV0M1dlYmFwcElUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NTJkYWMKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zZXJ2bGV0My13ZWJhcHAvc3JjL3Rlc3QvamF2YS9TZXJ2bGV0M1dlYmFwcElUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdHMgdGhlIHNlcnZsZXQzLXdlYmFwcCBleGFtcGxlLgorICogSW50ZWdyYXRpb24gdGVzdCBsYXVuY2hlZCBieSBtYXZlbi1qZXR0eS1wbHVnaW4KKyAqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBTZXJ2bGV0M1dlYmFwcElUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKyAgICAgICAgcmV0dXJuIG5ldyBBcHBsaWNhdGlvbigpOyAvLyBkdW1teSBBcHBsaWNhdGlvbiBpbnN0YW5jZSBmb3IgdGVzdCBmcmFtZXdvcmsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBVUkkgZ2V0QmFzZVVyaSgpIHsKKyAgICAgICAgcmV0dXJuIFVyaUJ1aWxkZXIuZnJvbVVyaShzdXBlci5nZXRCYXNlVXJpKCkpLnBhdGgoImFuaW1hbHMiKS5idWlsZCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsaWVudFN0cmluZ1Jlc3BvbnNlKCkgeworICAgICAgICBTdHJpbmcgcyA9IHRhcmdldCgpLnBhdGgoImRvZyIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJXb29mISIsIHMpOworCisgICAgICAgIHMgPSB0YXJnZXQoKS5wYXRoKCJjYXQiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiTWlhb3chIiwgcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc2ltcGxlLWNvbnNvbGUvUkVBRE1FLk1EIGIvZXhhbXBsZXMvc2ltcGxlLWNvbnNvbGUvUkVBRE1FLk1ECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ODEzMTgKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zaW1wbGUtY29uc29sZS9SRUFETUUuTUQKQEAgLTAsMCArMSw3MyBAQAorWy8vXTogIyAiIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAiCitbLy9dOiAjICIgIgorWy8vXTogIyAiIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAiCitbLy9dOiAjICIgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQgIgorWy8vXTogIyAiIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4gIgorWy8vXTogIyAiICIKK1svL106ICMgIiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlICIKKworU2ltcGxlIENvbnNvbGUgRXhhbXBsZQorPT09PT09PT09PT09PT09PT09PT09PQorCitUaGlzIGV4YW1wbGUgZGVtb25zdHJhdGVzIGhvdyB0byBkZXZlbG9wIFJFU1RmdWwgd2ViIHNlcnZpY2VzIHdpdGggdGhlCitlbWJlZGRlZCBHcml6emx5IHNlcnZlci4KKworQ29udGVudHMKKy0tLS0tLS0tCisKK1RoZSBleGFtcGxlIGNvbnNpc3RzIG9mIHRocmVlIEphdmEgY2xhc3NlcyBhbmQgb25lIEhUTUwgZmlsZToKKworYG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmNvbnNvbGUuQXBwYAorCitDb250YWlucyB0aGUgbWFpbiBmdW5jdGlvbiB3aGljaCBzdGFydHMgYW5kIHN0b3BzIHRoZSBIVFRQIHNlcnZlci4KKworYG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmNvbnNvbGUucmVzb3VyY2VzLkNvbG91cnNgCisKK0EgcmVzb3VyY2UgY2xhc3MgdGhhdCBjYW4gcHJvZHVjZSB0d28gZGlmZmVyZW50IHJlcHJlc2VudGF0aW9ucyBvZiBhCitsaXN0IG9mIGNvbG9ycy4gVGhlIGxpc3QgY2FuIGJlIGZpbHRlcmVkIGJ5IGEgY2xpZW50LXN1cHBsaWVkCitxdWVyeSBwYXJhbWV0ZXIuIFRoZSByZXNvdXJjZSByZWZlcmVuY2VzIHRoZSBGb3JtIHJlc291cmNlIHVzaW5nIHRoZQorUGF0aCBhbm5vdGF0aW9uIGRlY2xhcmVkIG9uIHRoZSBDb2xvdXJzLmdldENvbG91cnMgbWV0aG9kLgorCitgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuY29uc29sZS5Gb3JtUmVzb3VyY2VgCisKK0EgcmVzb3VyY2UgY2xhc3MgdGhhdCBwcm9kdWNlcyBhIGZvcm0gaW4gcmVzcG9uc2UgdG8gYW4gSFRUUCBHRVQsCitwcm9jZXNzZXMgdGhlIGNvbnRlbnQgb2YgdGhlIGZvcm0gd2hlbiBzdWJtaXR0ZWQsIGFuZCBwcm9kdWNlcyBhCit0YWJsZSBvZiB0aGUgc3VibWl0dGVkIHZhbHVlcyBpbiByZXNwb3NlIHRvIHRoZSBmb3JtIGJlaW5nIHBvc3RlZC4KKworYGZvcm0uaHRtbGAKKworQSBzdGF0aWMgSFRNTCBmaWxlIHRoYXQgaXMgcmV0dXJuZWQgYnkgdGhlIEZvcm0gcmVzb3VyY2UuCisKK1RoZSBtYXBwaW5nIG9mIHRoZSBVUkkgcGF0aCBzcGFjZSBpcyBwcmVzZW50ZWQgaW4gdGhlIGZvbGxvd2luZyB0YWJsZToKKworVVJJIHBhdGggICAgICAgICAgICAgIHwgUmVzb3VyY2UgY2xhc3MgICB8IEhUVFAgbWV0aG9kcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tCisqKl8vZm9ybV8qKiAgICAgICAgICAgfCBGb3JtICAgICAgICAgICAgIHwgR0VULCBQT1NUCisqKl8vZm9ybS9jb2xvdXJzXyoqICAgfCBDb2xvdXJzICAgICAgICAgIHwgR0VUCisKK1J1bm5pbmcgdGhlIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworUnVuIHRoZSBleGFtcGxlIGFzIGZvbGxvd3M6CisKKz4gICAgIG12biBjbGVhbiBjb21waWxlIGV4ZWM6amF2YQorCitUaGlzIGRlcGxveXMgdGhlIGV4YW1wbGUgdXNpbmcgW0dyaXp6bHldKGh0dHA6Ly9ncml6emx5LmphdmEubmV0LykgY29udGFpbmVyLiBZb3UgY2FuIGFjY2VzcyB0aGUgYXBwbGljYXRpb24gYXQ6CisKKy0gICA8aHR0cDovLzEyNy4wLjAuMTo5OTk4L3Jlc291cmNlcy9mb3JtPgorCitGaWxsIGluIHRoZSBmb3JtIGFuZCBzdWJtaXQgaXQuIE5vdGUgdGhhdCB0aGUgcHVsbC1kb3duIGxpc3Qgb2YgY29sb3JzCitpcyBwb3B1bGF0ZWQgZHluYW1pY2FsbHkuIEVudGVyIHBhcnQgb2YgYSBjb2xvciBuYW1lIGluIHRoZSBoaW50IGJveCB0bworc2VlIGEgZmlsdGVyZWQgbGlzdCBvZiBjb2xvcnMgY29udGFpbmluZyB0aGUgaGludC4KKworWW91IGNhbiBzZWUgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgY29sb3JzIGF0OgorCistICAgPGh0dHA6Ly8xMjcuMC4wLjE6OTk5OC9yZXNvdXJjZXMvZm9ybS9jb2xvdXJzPgorCitPciBzZWUgb25seSB0aG9zZSBjb2xvcnMgY29udGFpbmluZyB0aGUgbGV0dGVyICdyJzoKKworLSAgIDxodHRwOi8vMTI3LjAuMC4xOjk5OTgvcmVzb3VyY2VzL2Zvcm0vY29sb3Vycz9tYXRjaD1yPgorCitBIFtXQURMIGRlc2NyaXB0aW9uXShodHRwOi8vd2FkbC5qYXZhLm5ldC8jc3BlYykgbWF5IGJlIGFjY2Vzc2VkIGF0IHRoZSBVUkw6CisKKy0gICA8aHR0cDovLzEyNy4wLjAuMTo5OTk4L3Jlc291cmNlcy9hcHBsaWNhdGlvbi53YWRsPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3NpbXBsZS1jb25zb2xlL3BvbS54bWwgYi9leGFtcGxlcy9zaW1wbGUtY29uc29sZS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjYjVmYzgKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zaW1wbGUtY29uc29sZS9wb20ueG1sCkBAIC0wLDAgKzEsNzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5zaW1wbGUtY29uc29sZTwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS1leGFtcGxlcy1zaW1wbGUtY29uc29sZTwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgU2ltcGxlIENvbnNvbGUgZXhhbXBsZTwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLWdyaXp6bHkyLWh0dHA8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktaGsyPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtanNvbi1qZXR0aXNvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhlYy1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxtYWluQ2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuY29uc29sZS5BcHA8L21haW5DbGFzcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnJlbGVhc2U8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc2ltcGxlLWNvbnNvbGUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9jb25zb2xlL0FwcC5qYXZhIGIvZXhhbXBsZXMvc2ltcGxlLWNvbnNvbGUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9jb25zb2xlL0FwcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNTAyOTQKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zaW1wbGUtY29uc29sZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2NvbnNvbGUvQXBwLmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5jb25zb2xlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseTIuaHR0cHNlcnZlci5Hcml6emx5SHR0cFNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dGlzb24uSmV0dGlzb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guZ3JpenpseS5odHRwLnNlcnZlci5IdHRwU2VydmVyOworCitwdWJsaWMgY2xhc3MgQXBwIHsKKworICAgIHByaXZhdGUgc3RhdGljIGludCBnZXRQb3J0KGludCBkZWZhdWx0UG9ydCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgcG9ydCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0Iik7CisgICAgICAgIGlmIChudWxsICE9IHBvcnQpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQocG9ydCk7CisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVmFsdWUgb2YgamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0IHByb3BlcnR5IgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGlzIG5vdCBhIHZhbGlkIHBvc2l0aXZlIGludGVnZXIgWyIgKyBwb3J0ICsgIl0uIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIFJldmVydGluZyB0byBkZWZhdWx0IFsiICsgZGVmYXVsdFBvcnQgKyAiXS4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZGVmYXVsdFBvcnQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgVVJJIGdldEJhc2VVUkkoKSB7CisgICAgICAgIHJldHVybiBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3QvcmVzb3VyY2VzIikucG9ydChnZXRQb3J0KGRlZmF1bHRQb3J0KSkuYnVpbGQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVSSSBCQVNFX1VSSSA9IGdldEJhc2VVUkkoKTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBkZWZhdWx0UG9ydCA9IDk5OTg7CisKKyAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlQ29uZmlnIGNyZWF0ZUFwcCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZygpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKG5ldyBKZXR0aXNvbkZlYXR1cmUoKSkKKyAgICAgICAgICAgICAgICAucGFja2FnZXMoIm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmNvbnNvbGUiKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNpbXBsZSBDb25zb2xlIEplcnNleSBFeGFtcGxlIEFwcCIpOworCisgICAgICAgICAgICBmaW5hbCBIdHRwU2VydmVyIHNlcnZlciA9IEdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeS5jcmVhdGVIdHRwU2VydmVyKGdldEJhc2VVUkkoKSwgY3JlYXRlQXBwKCksIGZhbHNlKTsKKyAgICAgICAgICAgIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmFkZFNodXRkb3duSG9vayhuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHNlcnZlci5zaHV0ZG93bk5vdygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pKTsKKyAgICAgICAgICAgIHNlcnZlci5zdGFydCgpOworCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCisgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIkFwcGxpY2F0aW9uIHN0YXJ0ZWQuJW5Ucnkgb3V0ICVzJW5TdG9wIHRoZSBhcHBsaWNhdGlvbiB1c2luZyBDVFJMK0MiLCBCQVNFX1VSSSArICIvZm9ybSIpKTsKKworICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5qb2luKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIHwgSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoQXBwLmNsYXNzLmdldE5hbWUoKSkubG9nKExldmVsLlNFVkVSRSwgbnVsbCwgZXgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc2ltcGxlLWNvbnNvbGUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9jb25zb2xlL3Jlc291cmNlcy9Db2xvdXJzLmphdmEgYi9leGFtcGxlcy9zaW1wbGUtY29uc29sZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2NvbnNvbGUvcmVzb3VyY2VzL0NvbG91cnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDgzNDlhCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvc2ltcGxlLWNvbnNvbGUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9jb25zb2xlL3Jlc291cmNlcy9Db2xvdXJzLmphdmEKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5jb25zb2xlLnJlc291cmNlczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5qZXR0aXNvbi5qc29uLkpTT05BcnJheTsKKworLyoqCisgKiBBIHdlYiByZXNvdXJjZSBmb3IgYSBsaXN0IG9mIGNvbG91cnMuCisgKi8KK3B1YmxpYyBjbGFzcyBDb2xvdXJzIHsKKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBjb2xvdXJzW10gPSB7InJlZCIsICJvcmFuZ2UiLCAieWVsbG93IiwgImdyZWVuIiwgImJsdWUiLCAiaW5kaWdvIiwgInZpb2xldCJ9OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgY29sb3VycyBhcyBwbGFpbiB0ZXh0LCBvbmUgY29sb3VyIHBlciBsaW5lLgorICAgICAqIEBwYXJhbSBmaWx0ZXIgSWYgbm90IGVtcHR5LCBjb25zdHJhaW5zIHRoZSBsaXN0IG9mIGNvbG91cnMgdG8gb25seQorICAgICAqIHRob3NlIHRoYXQgY29udGFpbiB0aGlzIHN1YnN0cmluZworICAgICAqIEByZXR1cm4gdGhlIGxpc3Qgb2YgY29sb3VycyBtYXRjaGluZyB0aGUgZmlsdGVyCisgICAgICovCisgICAgQEdFVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIFN0cmluZyBnZXRDb2xvdXJMaXN0QXNUZXh0KEBRdWVyeVBhcmFtKCJtYXRjaCIpIFN0cmluZyBmaWx0ZXIpIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBidWYgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBmb3IgKFN0cmluZyBjb2xvdXIgOiBnZXRNYXRjaGluZ0NvbG91cnMoZmlsdGVyKSkgeworICAgICAgICAgICAgYnVmLmFwcGVuZChjb2xvdXIpOworICAgICAgICAgICAgYnVmLmFwcGVuZCgnXG4nKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgY29sb3VycyBhcyBhIEpTT04gYXJyYXkuCisgICAgICogQHBhcmFtIGZpbHRlciBJZiBub3QgZW1wdHksIGNvbnN0cmFpbnMgdGhlIGxpc3Qgb2YgY29sb3VycyB0byBvbmx5CisgICAgICogdGhvc2UgdGhhdCBjb250YWluIHRoaXMgc3Vic3RyaW5nCisgICAgICogQHJldHVybiB0aGUgbGlzdCBvZiBjb2xvdXJzIG1hdGNoaW5nIHRoZSBmaWx0ZXIKKyAgICAgKi8KKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9qc29uIikKKyAgICBwdWJsaWMgSlNPTkFycmF5IGdldENvbG91ckxpc3RBc0pTT04oQFF1ZXJ5UGFyYW0oIm1hdGNoIikgU3RyaW5nIGZpbHRlcikgeworICAgICAgICByZXR1cm4gbmV3IEpTT05BcnJheShnZXRNYXRjaGluZ0NvbG91cnMoZmlsdGVyKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgY29sb3Vycy4KKyAgICAgKiBAcGFyYW0gZmlsdGVyIElmIG5vdCBlbXB0eSwgY29uc3RyYWlucyB0aGUgbGlzdCBvZiBjb2xvdXJzIHRvIG9ubHkKKyAgICAgKiB0aG9zZSB0aGF0IGNvbnRhaW4gdGhpcyBzdWJzdHJpbmcKKyAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGNvbG91cnMgbWF0Y2hpbmcgdGhlIGZpbHRlcgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxTdHJpbmc+IGdldE1hdGNoaW5nQ29sb3VycyhTdHJpbmcgZmlsdGVyKSB7CisgICAgICAgIExpc3Q8U3RyaW5nPiBtYXRjaGVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICAgICAgZm9yIChTdHJpbmcgY29sb3VyIDogY29sb3VycykgeworICAgICAgICAgICAgaWYgKGZpbHRlciA9PSBudWxsIHx8IGZpbHRlci5sZW5ndGgoKSA9PSAwIHx8IGNvbG91ci5jb250YWlucyhmaWx0ZXIpKSB7CisgICAgICAgICAgICAgICAgbWF0Y2hlcy5hZGQoY29sb3VyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtYXRjaGVzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3NpbXBsZS1jb25zb2xlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvY29uc29sZS9yZXNvdXJjZXMvRm9ybVJlc291cmNlLmphdmEgYi9leGFtcGxlcy9zaW1wbGUtY29uc29sZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2NvbnNvbGUvcmVzb3VyY2VzL0Zvcm1SZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiN2Q0OTUKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zaW1wbGUtY29uc29sZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2NvbnNvbGUvcmVzb3VyY2VzL0Zvcm1SZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuY29uc29sZS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db29raWU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTmV3Q29va2llOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKKy8qKgorICogQSBXZWIgZm9ybSByZXNvdXJjZSwgcHJvZHVjZXMgdGhlIGZvcm0gYW5kIHByb2Nlc3NlcyB0aGUgcmVzdWx0cyBvZgorICogc3VibWl0dGluZyBpdC4KKyAqCisgKi8KK0BQYXRoKCIvZm9ybSIpCitAUHJvZHVjZXMoInRleHQvaHRtbCIpCitwdWJsaWMgY2xhc3MgRm9ybVJlc291cmNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbG91cnMgY29sb3Vyc1Jlc291cmNlID0gbmV3IENvbG91cnMoKTsKKworICAgIEBDb250ZXh0CisgICAgSHR0cEhlYWRlcnMgaGVhZGVyczsKKworICAgIEBQYXRoKCJjb2xvdXJzIikKKyAgICBwdWJsaWMgQ29sb3VycyBnZXRDb2xvdXJzKCkgeworICAgICAgICByZXR1cm4gY29sb3Vyc1Jlc291cmNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2R1Y2UgYSBmb3JtIGZyb20gYSBzdGF0aWMgSFRNTCBmaWxlIHBhY2thZ2VkIHdpdGggdGhlIGNvbXBpbGVkIGNsYXNzCisgICAgICogQHJldHVybiBhIHN0cmVhbSBmcm9tIHdoaWNoIHRoZSBIVE1MIGZvcm0gY2FuIGJlIHJlYWQuCisgICAgICovCisgICAgQEdFVAorICAgIHB1YmxpYyBSZXNwb25zZSBnZXRGb3JtKCkgeworICAgICAgICBEYXRlIG5vdyA9IG5ldyBEYXRlKCk7CisKKyAgICAgICAgSW5wdXRTdHJlYW0gZW50aXR5ID0gdGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbSgiZm9ybS5odG1sIik7CisgICAgICAgIHJldHVybiBSZXNwb25zZS5vayhlbnRpdHkpCisgICAgICAgICAgICAgICAgLmNvb2tpZShuZXcgTmV3Q29va2llKCJkYXRlIiwgbm93LnRvU3RyaW5nKCkpKS5idWlsZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIGZvcm0gc3VibWlzc2lvbi4gUHJvZHVjZXMgYSB0YWJsZSBzaG93aW5nIHRoZSBmb3JtIGZpZWxkCisgICAgICogdmFsdWVzIHN1Ym1pdHRlZC4KKyAgICAgKiBAcmV0dXJuIGEgZHluYW1pY2FsbHkgZ2VuZXJhdGVkIEhUTUwgdGFibGUuCisgICAgICogQHBhcmFtIGZvcm1EYXRhIHRoZSBkYXRhIGZyb20gdGhlIGZvcm0gc3VibWlzc2lvbgorICAgICAqLworICAgIEBQT1NUCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKQorICAgIHB1YmxpYyBTdHJpbmcgcHJvY2Vzc0Zvcm0oTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGZvcm1EYXRhKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgYnVmLmFwcGVuZCgiPGh0bWw+PGhlYWQ+PHRpdGxlPkZvcm0gcmVzdWx0czwvdGl0bGU+PC9oZWFkPjxib2R5PiIpOworICAgICAgICBidWYuYXBwZW5kKCI8cD5IZWxsbywgeW91IGVudGVyZWQgdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbjogPC9wPjx0YWJsZSBib3JkZXI9JzEnPiIpOworICAgICAgICBmb3IgKFN0cmluZyBrZXkgOiBmb3JtRGF0YS5rZXlTZXQoKSkgeworICAgICAgICAgICAgaWYgKGtleS5lcXVhbHMoInN1Ym1pdCIpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWYuYXBwZW5kKCI8dHI+PHRkPiIpOworICAgICAgICAgICAgYnVmLmFwcGVuZChrZXkpOworICAgICAgICAgICAgYnVmLmFwcGVuZCgiPC90ZD48dGQ+Iik7CisgICAgICAgICAgICBidWYuYXBwZW5kKGZvcm1EYXRhLmdldEZpcnN0KGtleSkpOworICAgICAgICAgICAgYnVmLmFwcGVuZCgiPC90ZD48L3RyPiIpOworICAgICAgICB9CisgICAgICAgIGZvciAoQ29va2llIGMgOiBoZWFkZXJzLmdldENvb2tpZXMoKS52YWx1ZXMoKSkgeworICAgICAgICAgICAgYnVmLmFwcGVuZCgiPHRyPjx0ZD5Db29raWU6ICIpOworICAgICAgICAgICAgYnVmLmFwcGVuZChjLmdldE5hbWUoKSk7CisgICAgICAgICAgICBidWYuYXBwZW5kKCI8L3RkPjx0ZD4iKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoYy5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIjwvdGQ+PC90cj4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGJ1Zi5hcHBlbmQoIjwvdGFibGU+PC9ib2R5PjwvaHRtbD4iKTsKKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc2ltcGxlLWNvbnNvbGUvc3JjL21haW4vcmVzb3VyY2VzL2Zvcm0uaHRtbCBiL2V4YW1wbGVzL3NpbXBsZS1jb25zb2xlL3NyYy9tYWluL3Jlc291cmNlcy9mb3JtLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY2NTQ1NQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3NpbXBsZS1jb25zb2xlL3NyYy9tYWluL3Jlc291cmNlcy9mb3JtLmh0bWwKQEAgLTAsMCArMSw2NyBAQAorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iPgorCis8aHRtbD4KKzxoZWFkPgorICAgIDx0aXRsZT5BIEZvcm08L3RpdGxlPgorICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KKyAgICAgICAgZnVuY3Rpb24gc2V0Q29sb3VycygpIHsKKyAgICAgICAgICAgIHZhciBodHRwX3JlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKKyAgICAgICAgICAgIGlmIChkb2N1bWVudC5iaW8uaGludC52YWx1ZS5sZW5ndGggPiAwKQorICAgICAgICAgICAgICAgIGh0dHBfcmVxdWVzdC5vcGVuKCJHRVQiLCAiZm9ybS9jb2xvdXJzP21hdGNoPSIrZG9jdW1lbnQuYmlvLmhpbnQudmFsdWUsIGZhbHNlKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBodHRwX3JlcXVlc3Qub3BlbigiR0VUIiwgImZvcm0vY29sb3VycyIsIGZhbHNlKTsKKyAgICAgICAgICAgIGh0dHBfcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCJBY2NlcHQiLCAiYXBwbGljYXRpb24vanNvbiIpOworICAgICAgICAgICAgaHR0cF9yZXF1ZXN0LnNlbmQobnVsbCk7CisgICAgICAgICAgICBpZiAoaHR0cF9yZXF1ZXN0LnN0YXR1cyA9PSAyMDApIHsKKyAgICAgICAgICAgICAgICBsaXN0ID0gZXZhbCgiKCIgKyBodHRwX3JlcXVlc3QucmVzcG9uc2VUZXh0ICsgIikiKTsKKyAgICAgICAgICAgICAgICBkb2N1bWVudC5iaW8uY29sb3VyLm9wdGlvbnMubGVuZ3RoID0gMDsKKyAgICAgICAgICAgICAgICBkb2N1bWVudC5iaW8uY29sb3VyLm9wdGlvbnNbMF0gPSBuZXcgT3B0aW9uKCJQaWNrIGEgY29sb3VyIiwgIiIsIHRydWUsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaTxsaXN0Lmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJpby5jb2xvdXIub3B0aW9uc1tpKzFdID0gbmV3IE9wdGlvbihsaXN0W2ldLCBsaXN0W2ldLCBmYWxzZSwgZmFsc2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYWxlcnQoIlRoZXJlIHdhcyBhIHByb2JsZW0gZmV0Y2hpbmcgdGhlIGxpc3Qgb2YgY29sb3Vycy4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGh0dHBfcmVxdWVzdCA9IG51bGw7CisgICAgICAgIH0KKyAgICA8L3NjcmlwdD4KKzwvaGVhZD4KKzxib2R5PgorPHA+VGVsbCBtZSBhYm91dCB5b3Vyc2VsZjo8L3A+Cis8Zm9ybSBuYW1lPSJiaW8iIGFjdGlvbj0iZm9ybSIgbWV0aG9kPSJQT1NUIj4KKyAgICA8dGFibGU+CisgICAgICAgIDx0cj4KKyAgICAgICAgICAgIDx0ZCBhbGlnbj0icmlnaHQiPk5hbWU6PC90ZD4KKyAgICAgICAgICAgIDx0ZD48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ibmFtZSIgdmFsdWU9IiIgc2l6ZT0iMzAiIC8+PC90ZD4KKyAgICAgICAgPC90cj4KKyAgICAgICAgPHRyPgorICAgICAgICAgICAgPHRkIGFsaWduPSJyaWdodCI+RmF2b3JpdGUgY29sb3VyOjwvdGQ+CisgICAgICAgICAgICA8dGQ+CisgICAgICAgICAgICAgICAgPHNlbGVjdCBuYW1lPSJjb2xvdXIiIG9ubW91c2Vkb3duPSJzZXRDb2xvdXJzKCkiPgorICAgICAgICAgICAgICAgICAgICA8b3B0aW9uPlBpY2sgYSBjb2xvdXI8L29wdGlvbj4KKyAgICAgICAgICAgICAgICA8L3NlbGVjdD4gPGk+UG9wdWxhdGVkIGR5bmFtaWNhbGx5IHdoZW4geW91IGNsaWNrIG9uIHRoZSBjb250cm9sPC9pPjxici8+CisgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImhpbnQiIHZhbHVlPSIiIHNpemU9IjEzIi8+IDxpPlR5cGUgYSBoaW50IHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIG9wdGlvbnM8L2k+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICA8L3RyPgorICAgICAgICA8dHI+CisgICAgICAgICAgICA8dGQ+PC90ZD4KKyAgICAgICAgICAgIDx0ZD4KKyAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0ic3VibWl0IiB2YWx1ZT0iU3VibWl0IiBuYW1lPSJzdWJtaXQiIC8+CisgICAgICAgICAgICA8L3RkPgorICAgICAgICA8L3RyPgorICAgIDwvdGFibGU+Cis8L2Zvcm0+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9zaW1wbGUtY29uc29sZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2NvbnNvbGUvTWFpblRlc3QuamF2YSBiL2V4YW1wbGVzL3NpbXBsZS1jb25zb2xlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvY29uc29sZS9NYWluVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZmUyNzcKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zaW1wbGUtY29uc29sZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2NvbnNvbGUvTWFpblRlc3QuamF2YQpAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5jb25zb2xlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uTXVsdGl2YWx1ZWRTdHJpbmdNYXA7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dGlzb24uSmV0dGlzb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuTWVkaWFUeXBlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuamV0dGlzb24uanNvbi5KU09OQXJyYXk7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogQGF1dGhvciBOYXJlc2ggKHNyaW5pdmFzLmJoaW1pc2V0dHkgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIE1haW5UZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworCisgICAgICAgIHJldHVybiBBcHAuY3JlYXRlQXBwKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKG5ldyBKZXR0aXNvbkZlYXR1cmUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBpZiBhIFdBREwgZG9jdW1lbnQgaXMgYXZhaWxhYmxlIGF0IHRoZSByZWxhdGl2ZSBwYXRoCisgICAgICogImFwcGxpY2F0aW9uLndhZGwiLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFwcGxpY2F0aW9uV2FkbCgpIHsKKyAgICAgICAgU3RyaW5nIHNlcnZpY2VXYWRsID0gdGFyZ2V0KCkucGF0aCgiYXBwbGljYXRpb24ud2FkbCIpLnJlcXVlc3QoTWVkaWFUeXBlcy5XQURMX1RZUEUpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUcnVlKCFzZXJ2aWNlV2FkbC5pc0VtcHR5KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgaWYgR0VUIG9uIHRoZSByZXNvdXJjZSAiL2Zvcm0iIGdpdmVzIHJlc3BvbnNlIHdpdGggc3RhdHVzIGNvZGUgMjAwLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldE9uRm9ybSgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJmb3JtIikucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9IVE1MKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJHRVQgb24gdGhlICdmb3JtJyByZXNvdXJjZSBkb2Vzbid0IGdpdmUgZXhwZWN0ZWQgcmVzcG9uc2UiLCBSZXNwb25zZS5TdGF0dXMuT0suZ2V0U3RhdHVzQ29kZSgpLAorICAgICAgICAgICAgICAgIHJlc3BvbnNlLmdldFN0YXR1c0luZm8oKS5nZXRTdGF0dXNDb2RlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgY2hlY2tzIHRoYXQgUE9TVCBvbiB0aGUgJy9mb3JtJyByZXNvdXJjZSBnaXZlcyBhIHJlc3BvbnNlIHBhZ2UKKyAgICAgKiB3aXRoIHRoZSBlbnRlcmVkIGRhdGEuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdE9uRm9ybSgpIHsKKyAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGZvcm1EYXRhID0gbmV3IE11bHRpdmFsdWVkU3RyaW5nTWFwKCk7CisgICAgICAgIGZvcm1EYXRhLmFkZCgibmFtZSIsICJ0ZXN0TmFtZSIpOworICAgICAgICBmb3JtRGF0YS5hZGQoImNvbG91ciIsICJyZWQiKTsKKyAgICAgICAgZm9ybURhdGEuYWRkKCJoaW50IiwgInJlIik7CisKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJmb3JtIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShmb3JtRGF0YSwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0ZPUk1fVVJMRU5DT0RFRCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmVzcG9uc2UuU3RhdHVzLk9LLmdldFN0YXR1c0NvZGUoKSwgcmVzcG9uc2UuZ2V0U3RhdHVzSW5mbygpLmdldFN0YXR1c0NvZGUoKSk7CisKKyAgICAgICAgLy8gY2hlY2sgdGhhdCB0aGUgZ2VuZXJhdGVkIHJlc3BvbnNlIGlzIHRoZSBleHBlY3RlZCBvbmUKKyAgICAgICAgSW5wdXRTdHJlYW0gcmVzcG9uc2VJbnB1dFN0cmVhbSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoSW5wdXRTdHJlYW0uY2xhc3MpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgYnl0ZVtdIHJlc3BvbnNlRGF0YSA9IG5ldyBieXRlW3Jlc3BvbnNlSW5wdXRTdHJlYW0uYXZhaWxhYmxlKCldOworICAgICAgICAgICAgZmluYWwgaW50IHJlYWQgPSByZXNwb25zZUlucHV0U3RyZWFtLnJlYWQocmVzcG9uc2VEYXRhKTsKKworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyZWFkID4gMCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG5ldyBTdHJpbmcocmVzcG9uc2VEYXRhKS5jb250YWlucygiSGVsbG8sIHlvdSBlbnRlcmVkIikpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihNYWluVGVzdC5jbGFzcy5nZXROYW1lKCkpLmxvZyhMZXZlbC5TRVZFUkUsIG51bGwsIGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgY2hlY2tzIHRoYXQgYSBHRVQgb24gdGhlIHJlc291cmNlICIvZm9ybS9jb2xvdXJzIiB3aXRoIG1pbWUtdHlwZSAidGV4dC9odG1sIgorICAgICAqIHNob3dzIHRoZSBhcHByb3ByaWF0ZSBjb2xvdXJzIGJhc2VkIG9uIHRoZSBxdWVyeSBwYXJhbSAibWF0Y2giLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldENvbG91cnNBc1BsYWluVGV4dCgpIHsKKyAgICAgICAgLy8gd2l0aG91dCB0aGUgcXVlcnkgcGFyYW0gIm1hdGNoIgorICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoImZvcm0iKS5wYXRoKCJjb2xvdXJzIikucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9QTEFJTikuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiR0VUIG9uIHBhdGggJy9mb3JtL2NvbG91cnMnIHdpdGggbWltZSB0eXBlICd0ZXh0L2h0bWwnIGRvZXNuJ3QgZ2l2ZSBleHBlY3RlZCByZXNwb25zZSIsCisgICAgICAgICAgICAgICAgUmVzcG9uc2UuU3RhdHVzLk9LLmdldFN0YXR1c0NvZGUoKSwgcmVzcG9uc2UuZ2V0U3RhdHVzSW5mbygpLmdldFN0YXR1c0NvZGUoKSk7CisKKyAgICAgICAgU3RyaW5nIHJlc3BvbnNlTXNnID0gdGFyZ2V0KCkucGF0aCgiZm9ybSIpLnBhdGgoImNvbG91cnMiKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXNwb25zZSBjb250ZW50IGRvZXNuJ3QgbWF0Y2ggdGhlIGV4cGVjdGVkIHZhbHVlIiwgInJlZFxub3JhbmdlXG55ZWxsb3dcbmdyZWVuXG5ibHVlXG5pbmRpZ29cbnZpb2xldFxuIiwKKyAgICAgICAgICAgICAgICByZXNwb25zZU1zZyk7CisKKyAgICAgICAgLy8gd2l0aCB0aGUgcXVlcnkgcGFyYW0gIm1hdGNoIiB2YWx1ZSAicmUiCisgICAgICAgIHJlc3BvbnNlTXNnID0gdGFyZ2V0KCJmb3JtL2NvbG91cnMiKS5xdWVyeVBhcmFtKCJtYXRjaCIsICJyZSIpLnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfUExBSU4pLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlJlc3BvbnNlIGNvbnRlbnQgZG9lc24ndCBtYXRjaCB0aGUgZXhwZWN0ZWQgdmFsdWUgd2l0aCB0aGUgcXVlcnkgcGFyYW0gJ21hdGNoPXJlJyIsICJyZWRcbmdyZWVuXG4iLAorICAgICAgICAgICAgICAgIHJlc3BvbnNlTXNnKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGNoZWNrcyB0aGF0IGEgR0VUIG9uIHRoZSByZXNvdXJjZSAiL2Zvcm0vY29sb3VycyIgd2l0aCBtaW1lLXR5cGUgImFwcGxpY2F0aW9uL2pzb24iCisgICAgICogc2hvd3MgdGhlIGFwcHJvcHJpYXRlIGNvbG91cnMgYmFzZWQgb24gdGhlIHF1ZXJ5IHBhcmFtICJtYXRjaCIuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q29sb3Vyc0FzSnNvbigpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJmb3JtIikucGF0aCgiY29sb3VycyIpLnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCBvbiBwYXRoICcvZm9ybS9jb2xvdXJzJyB3aXRoIG1pbWUgdHlwZSAnYXBwbGljYXRpb24vanNvbicgZG9lc24ndCBnaXZlIGV4cGVjdGVkIHJlc3BvbnNlIiwKKyAgICAgICAgICAgICAgICBSZXNwb25zZS5TdGF0dXMuT0suZ2V0U3RhdHVzQ29kZSgpLCByZXNwb25zZS5nZXRTdGF0dXNJbmZvKCkuZ2V0U3RhdHVzQ29kZSgpKTsKKworICAgICAgICBKU09OQXJyYXkganNvbkFycmF5ID0gdGFyZ2V0KCkucGF0aCgiZm9ybSIpLnBhdGgoImNvbG91cnMiKS5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKS5nZXQoSlNPTkFycmF5LmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXR1cm5lZCBKU09OQXJyYXkgZG9lc24ndCBoYXZlIGV4cGVjdGVkIG51bWJlciBvZiBlbnRyaWVzIiwgNywganNvbkFycmF5Lmxlbmd0aCgpKTsKKworICAgICAgICAvLyB3aXRoIHRoZSBxdWVyeSBwYXJhbSAibWF0Y2giIHZhbHVlICJyZSIKKyAgICAgICAganNvbkFycmF5ID0gdGFyZ2V0KCJmb3JtL2NvbG91cnMiKS5xdWVyeVBhcmFtKCJtYXRjaCIsICJyZSIpLnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pLmdldChKU09OQXJyYXkuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlJldHVybmVkIEpTT05BcnJheSBkb2Vzbid0IGhhdmUgZXhwZWN0ZWQgbnVtYmVyIG9mIGVudHJpZXMgd2l0aCB0aGUgcXVlcnkgcGFyYW0gJ21hdGNoPXJlJyIsIDIsCisgICAgICAgICAgICAgICAganNvbkFycmF5Lmxlbmd0aCgpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3NzZS1pdGVtLXN0b3JlLWpheHJzLXdlYmFwcC9SRUFETUUuTUQgYi9leGFtcGxlcy9zc2UtaXRlbS1zdG9yZS1qYXhycy13ZWJhcHAvUkVBRE1FLk1ECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NDhiMDcKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zc2UtaXRlbS1zdG9yZS1qYXhycy13ZWJhcHAvUkVBRE1FLk1ECkBAIC0wLDAgKzEsNjcgQEAKK1svL106ICMgIiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIgorWy8vXTogIyAiICIKK1svL106ICMgIiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgIgorWy8vXTogIyAiIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0ICIKK1svL106ICMgIiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuICIKK1svL106ICMgIiAiCitbLy9dOiAjICIgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZSAiCisKK0pBWC1SUyBTU0UgSXRlbSBTdG9yZSBKZXJzZXkgRXhhbXBsZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0FuIGV4YW1wbGUgZGVtb25zdHJhdGluZyBob3cgbmV3IFNlcnZlciBTZW50IEV2ZW50cyAoU1NFKSBKQVgtUlMgQVBJIGNhbgorYmUgdXNlZCB0byBub3RpZnkgY2xpZW50cyBhYm91dCBjaGFuZ2VzIGluIHNlcnZlci1zaWRlIG1hbmFnZWQgZGF0YQorKGNvbGxlY3Rpb24gb2YgaXRlbXMpLiBUaGUgZXhhbXBsZSBhbHNvIG91dGxpbmVzIGhvdyBTU0UgZXZlbnRzIGNhbiBiZQorY29uc3VtZWQgdXNpbmcgamF2YXNjcmlwdCBicm93c2VyLWJhc2VkIGNsaWVudHMuCisKK0NvbnRlbnRzCistLS0tLS0tLQorCitUaGUgZXhhbXBsZSBjb25zaXN0cyBvZiBhIHdlYi1iYXNlZCBjbGllbnQgYXBwbGljYXRpb24gYW5kIGEgc2VydmVyLXNpZGUKK2FwcGxpY2F0aW9uIGRlcGxveWVkIG9uIGEgW0pldHR5IHNlcnZsZXQgY29udGFpbmVyXShodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2pldHR5L2RvY3VtZW50YXRpb24vY3VycmVudC8pLgorCitUaGUgc2VydmVyIHNpZGUgcGFydCBvZiB0aGUgYXBwbGljYXRpb24gY29uc2lzdHMgb2YgYSBKQVgtUlMgcmVzb3VyY2UKK21hbmFnaW5nIGNvbGxlY3Rpb24gb2Ygc3RyaW5nIGl0ZW1zIGFuZCBhIHNpbXBsZSBIVE1MIHBhZ2UgdGhhdCBpbmNsdWRlcworYSBicm93c2VyIFNTRSBjbGllbnQgd3JpdHRlbiBpbiBKYXZhc2NyaXB0IGFzIHdlbGwgYXMgYSBiYXNpYyBDU1MKK3N0eWxlc2hlZXQuIFRoZSBTU0UgSmF2YXNjcmlwdCBjbGllbnQgY29ubmVjdHMgdG8gdGhlIEpBWC1SUyByZXNvdXJjZQorYW5kIHRyYW5zZm9ybXMgdGhlIHN0cmVhbWVkIG1lc3NhZ2VzIGludG8gSFRNTCBjb2RlIHRoYXQgaXMgcmVuZGVyZWQgYnkKK3RoZSBicm93c2VyLiBUaGUgamF2YXNjcmlwdCBjbGllbnQgYWxzbyBkZW1vbnN0cmF0ZXMgaG93IG5hbWVkIGFuZAordW5uYW1lZCBTU0UgZXZlbnRzIGFyZSBoYW5kbGVkIGJ5IEhUTUw1IGBFdmVudFNvdXJjZWAgY29tcG9uZW50LiBUaGUKK21hcHBpbmcgb2YgdGhlIFVSSSBwYXRoIHNwYWNlIG9mIHRoZSBzZXJ2ZXItc2lkZSBwYXJ0IG9mIHRoZSBhcHBsaWNhdGlvbgoraXMgcHJlc2VudGVkIGluIHRoZSBmb2xsb3dpbmcgdGFibGU6CisKK1VSSSBwYXRoICAgICAgICAgICAgICAgICAgICAgICAgfCAgUmVzb3VyY2UgY2xhc3MgICAgICB8IEhUVFAgbWV0aG9kcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8ICAtLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0KKyoqXy9yZXNvdXJjZXMvaXRlbXNfKiogICAgICAgICAgfCAgSXRlbVN0b3JlUmVzb3VyY2UgICB8IEdFVCwgUE9TVAorKipfL3Jlc291cmNlcy9pdGVtcy9ldmVudHNfKiogICB8ICBJdGVtU3RvcmVSZXNvdXJjZSAgIHwgR0VUIChTU0UpCisKK0FwcGxpY2F0aW9uIGlzIGNvbmZpZ3VyZWQgdG8gcnVuIHVzaW5nIEpldHR5IG1hdmVuIHBsdWdpbiB1bmRlciBiYXNlCitwYXRoIGBzc2UtaXRlbS1zdG9yZS1qYXhycy13ZWJhcHBgLgorCitSdW5uaW5nIHRoZSBFeGFtcGxlCistLS0tLS0tLS0tLS0tLS0tLS0tCisKKz4gICAgIG12biBjbGVhbiBjb21waWxlIGpldHR5OnJ1bgorCitUaGUgY29tbWFuZCBhYm92ZSBkZXBsb3lzIHRoZSBjdXJyZW50IGV4YW1wbGUuIEFmdGVyIHN1Y2Nlc3NmdWwKK2RlcGxveW1lbnQsIHlvdSBzaG91bGQgYmUgYWJsZSB0byBhY2Nlc3MgdGhlIGJyb3dzZXIgU1NFIGNsaWVudCBwYWdlIGF0Cis8aHR0cDovL2xvY2FsaG9zdDo4MDgwL3NzZS1pdGVtLXN0b3JlLWpheHJzLXdlYmFwcC9pbmRleC5odG1sPi4gVG8gc2VlIHRoZSByYXcKK1NTRSBldmVudCBzdHJlYW0sIHlvdSBtYXkgYWxzbyBwb2ludCB5b3VyIGJyb3dzZXIgZGlyZWN0bHkgYXQgdGhlCitbYEl0ZW1TdG9yZVJlc291cmNlYF0oaHR0cDovL2xvY2FsaG9zdDo4MDgwL3NzZS1pdGVtLXN0b3JlLWpheHJzLXdlYmFwcC9yZXNvdXJjZXMvaXRlbXMvZXZlbnRzKS4KKworRGVwbG95aW5nIHRoZSBleGFtcGxlIHRvIGFub3RoZXIgc2VydmxldCBjb250YWluZXIuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPiAgICAgbXZuIGNsZWFuIHBhY2thZ2UKKworVGhlIGNvbW1hbmQgYWJvdmUgY3JlYXRlcyBhIFNlcnZsZXQgMy54IGNvbXBsaWFudCBXQVIgbG9jYXRlZCBpbiB0aGUKK3RhcmdldCBkaXJlY3RvcnkuIFRoZSBXQVIgY2FuIGJlIHRoZW4gZGVwbG95ZWQgdG8geW91ciBTZXJ2bGV0IDMueAorY29tcGxpYW50IGNvbnRhaW5lci4KKworUnVubmluZyBUZXN0IENsaWVudAorLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBZnRlciBkZXBsb3lpbmcgdGhlIGFwcGxpY2F0aW9uIGludG8gYSBTZXJ2bGV0IDMueCBjb21wbGlhbnQgY29udGFpbmVyLAoreW91IGNhbiBydW4gdGhlIGF0dGFjaGVkIHRlc3QgYnkgZXhlY3V0aW5nOgorCis+ICAgICBtdm4gdGVzdCAtRGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIuZmFjdG9yeT1vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkgLURqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ9PHBvcnQ+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9zc2UtaXRlbS1zdG9yZS1qYXhycy13ZWJhcHAvcG9tLnhtbCBiL2V4YW1wbGVzL3NzZS1pdGVtLXN0b3JlLWpheHJzLXdlYmFwcC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYmE2YzEKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zc2UtaXRlbS1zdG9yZS1qYXhycy13ZWJhcHAvcG9tLnhtbApAQCAtMCwwICsxLDEwMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKworICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD53ZWJhcHAtZXhhbXBsZS1wYXJlbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vd2ViYXBwLWV4YW1wbGUtcGFyZW50L3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPnNzZS1pdGVtLXN0b3JlLWpheHJzLXdlYmFwcDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS1leGFtcGxlcy1zc2UtaXRlbS1zdG9yZS1qYXhycy13ZWJhcHA8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+SmVyc2V5IEpBWC1SUyAyLjEgU1NFIEFQSS1iYXNlZCBpdGVtIHN0b3JlIGV4YW1wbGUuPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWhrMjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtc3NlPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb25uZWN0b3JzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWFwYWNoZS1jb25uZWN0b3I8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8IS0tIFJ1biB0aGUgYXBwbGljYXRpb24gdXNpbmcgIm12biBqZXR0eTpydW4iIC0tPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8IS0tIFRPRE8gdW5pZnkgSmV0dHkgaW4gYWxsIGV4YW1wbGVzIC0tPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHNjYW5JbnRlcnZhbFNlY29uZHM+MTA8L3NjYW5JbnRlcnZhbFNlY29uZHM+CisgICAgICAgICAgICAgICAgICAgIDxzdG9wUG9ydD45OTk5PC9zdG9wUG9ydD4KKyAgICAgICAgICAgICAgICAgICAgPHN0b3BLZXk+U1RPUDwvc3RvcEtleT4KKyAgICAgICAgICAgICAgICAgICAgPHdlYkFwcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb250ZXh0UGF0aD4vJHtwcm9qZWN0LmFydGlmYWN0SWR9PC9jb250ZXh0UGF0aD4KKyAgICAgICAgICAgICAgICAgICAgPC93ZWJBcHA+CisgICAgICAgICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHN5c3RlbVByb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmpldHR5LnBvcnQ8L25hbWU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPiR7amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0fTwvdmFsdWU+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3N5c3RlbVByb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICA8L3N5c3RlbVByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5yZWxlYXNlPC9pZD4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+eG1sLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICA8L3Byb2ZpbGVzPgorCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+ODA4MDwvamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0PgorICAgIDwvcHJvcGVydGllcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3NzZS1pdGVtLXN0b3JlLWpheHJzLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3NzZWl0ZW1zdG9yZS9qYXhycy9KYXhyc0l0ZW1TdG9yZUFwcC5qYXZhIGIvZXhhbXBsZXMvc3NlLWl0ZW0tc3RvcmUtamF4cnMtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvc3NlaXRlbXN0b3JlL2pheHJzL0pheHJzSXRlbVN0b3JlQXBwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ3NmVjZgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3NzZS1pdGVtLXN0b3JlLWpheHJzLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3NzZWl0ZW1zdG9yZS9qYXhycy9KYXhyc0l0ZW1TdG9yZUFwcC5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuc3NlaXRlbXN0b3JlLmpheHJzOworCitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCisvKioKKyAqIFNTRSBpdGVtIHN0b3JlIEpBWC1SUyBhcHBsaWNhdGlvbiBjbGFzcy4KKyAqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK0BBcHBsaWNhdGlvblBhdGgoInJlc291cmNlcyIpCitwdWJsaWMgY2xhc3MgSmF4cnNJdGVtU3RvcmVBcHAgZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyBTU0UgSXRlbSBTdG9yZSBFeGFtcGxlIEpBWC1SUyBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgSmF4cnNJdGVtU3RvcmVBcHAoKSB7CisgICAgICAgIHN1cGVyKEpheHJzSXRlbVN0b3JlUmVzb3VyY2UuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3NzZS1pdGVtLXN0b3JlLWpheHJzLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3NzZWl0ZW1zdG9yZS9qYXhycy9KYXhyc0l0ZW1TdG9yZVJlc291cmNlLmphdmEgYi9leGFtcGxlcy9zc2UtaXRlbS1zdG9yZS1qYXhycy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9zc2VpdGVtc3RvcmUvamF4cnMvSmF4cnNJdGVtU3RvcmVSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4YzE5M2QKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zc2UtaXRlbS1zdG9yZS1qYXhycy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9zc2VpdGVtc3RvcmUvamF4cnMvSmF4cnNJdGVtU3RvcmVSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMjI3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnNzZWl0ZW1zdG9yZS5qYXhyczsKKworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRSZWFkV3JpdGVMb2NrOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkJhZFJlcXVlc3RFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuRGVmYXVsdFZhbHVlOworaW1wb3J0IGphdmF4LndzLnJzLkZvcm1QYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuSGVhZGVyUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5zc2UuT3V0Ym91bmRTc2VFdmVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5zc2UuU3NlOworaW1wb3J0IGphdmF4LndzLnJzLnNzZS5Tc2VCcm9hZGNhc3RlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5zc2UuU3NlRXZlbnRTaW5rOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLlNzZUZlYXR1cmU7CisKKworLyoqCisgKiBBIHJlc291cmNlIGZvciBzdG9yaW5nIG5hbWVkIGl0ZW1zLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJpdGVtcyIpCitwdWJsaWMgY2xhc3MgSmF4cnNJdGVtU3RvcmVSZXNvdXJjZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoSmF4cnNJdGVtU3RvcmVSZXNvdXJjZS5jbGFzcy5nZXROYW1lKCkpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVlbnRyYW50UmVhZFdyaXRlTG9jayBzdG9yZUxvY2sgPSBuZXcgUmVlbnRyYW50UmVhZFdyaXRlTG9jaygpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExpbmtlZExpc3Q8U3RyaW5nPiBpdGVtU3RvcmUgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBdG9taWNSZWZlcmVuY2U8U3NlQnJvYWRjYXN0ZXI+IEJST0FEQ0FTVEVSID0gbmV3IEF0b21pY1JlZmVyZW5jZTw+KG51bGwpOworCisgICAgQENvbnRleHQKKyAgICBwcml2YXRlIFNzZSBzc2U7CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBsb25nIHJlY29ubmVjdERlbGF5ID0gMDsKKworICAgIC8qKgorICAgICAqIExpc3QgYWxsIHN0b3JlZCBpdGVtcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbGlzdCBvZiBhbGwgc3RvcmVkIGl0ZW1zLgorICAgICAqLworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgcHVibGljIFN0cmluZyBsaXN0SXRlbXMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdG9yZUxvY2sucmVhZExvY2soKS5sb2NrKCk7CisgICAgICAgICAgICByZXR1cm4gaXRlbVN0b3JlLnRvU3RyaW5nKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzdG9yZUxvY2sucmVhZExvY2soKS51bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlY2VpdmUgJiBwcm9jZXNzIGNvbW1hbmRzIHNlbnQgYnkgdGhlIHRlc3QgY2xpZW50IHRoYXQgY29udHJvbCB0aGUgaW50ZXJuYWwgcmVzb3VyY2Ugc3RhdGUuCisgICAgICogPHA+CisgICAgICogRm9sbG93aW5nIGlzIHRoZSBsaXN0IG9mIHJlY29nbml6ZWQgY29tbWFuZHM6CisgICAgICogPHVsPgorICAgICAqIDxsaT48Yj5kaXNjb25uZWN0PC9iPiAtIGRpc2Nvbm5lY3QgYWxsIHJlZ2lzdGVyZWQgZXZlbnQgc3RyZWFtcy48L2xpPgorICAgICAqIDxsaT48Yj5yZWNvbm5lY3Qgbm93PC9iPiAtIGVuYWJsZSBjbGllbnQgcmVjb25uZWN0aW5nLjwvbGk+CisgICAgICogPGxpPjxiPnJlY29ubmVjdCAmbHQ7c2Vjb25kcyZndDs8L2I+IC0gZGlzYWJsZSBjbGllbnQgcmVjb25uZWN0aW5nLgorICAgICAqIFJlY29ubmVjdGluZyBjbGllbnRzIHdpbGwgcmVjZWl2ZSBhIEhUVFAgNTAzIHJlc3BvbnNlIHdpdGgKKyAgICAgKiB7QHZhbHVlIGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnMjUkVUUllfQUZURVJ9IHNldCB0byB0aGUgYW1vdW50IG9mCisgICAgICogbWlsbGlzZWNvbmRzIHNwZWNpZmllZC48L2xpPgorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiBAcGFyYW0gY29tbWFuZCBjb21tYW5kIHRvIGJlIHByb2Nlc3NlZC4KKyAgICAgKiBAcmV0dXJuIG1lc3NhZ2UgYWJvdXQgcHJvY2Vzc2luZyByZXN1bHQuCisgICAgICogQHRocm93cyBCYWRSZXF1ZXN0RXhjZXB0aW9uIGluIGNhc2UgdGhlIGNvbW1hbmQgaXMgbm90IHJlY29nbml6ZWQgb3Igbm90IHNwZWNpZmllZC4KKyAgICAgKi8KKyAgICBAUE9TVAorICAgIEBQYXRoKCJjb21tYW5kcyIpCisgICAgcHVibGljIFN0cmluZyBwcm9jZXNzQ29tbWFuZChTdHJpbmcgY29tbWFuZCkgeworICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsIHx8IGNvbW1hbmQuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbigiTm8gY29tbWFuZCBzcGVjaWZpZWQuIik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoImRpc2Nvbm5lY3QiLmVxdWFscyhjb21tYW5kKSkgeworICAgICAgICAgICAgY2xvc2VCcm9hZGNhc3RlcigpOworICAgICAgICAgICAgcmV0dXJuICJEaXNjb25uZWN0ZWQuIjsKKyAgICAgICAgfSBlbHNlIGlmICgicmVjb25uZWN0ICIubGVuZ3RoKCkgPCBjb21tYW5kLmxlbmd0aCgpICYmIGNvbW1hbmQuc3RhcnRzV2l0aCgicmVjb25uZWN0ICIpKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgd2hlbiA9IGNvbW1hbmQuc3Vic3RyaW5nKCJyZWNvbm5lY3QgIi5sZW5ndGgoKSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlY29ubmVjdERlbGF5ID0gIm5vdyIuZXF1YWxzKHdoZW4pID8gMCA6IExvbmcucGFyc2VMb25nKHdoZW4pOworICAgICAgICAgICAgICAgIHJldHVybiAiUmVjb25uZWN0IHN0cmF0ZWd5IHVwZGF0ZWQ6ICIgKyB3aGVuOworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIC8vIGlnbm9yZWQKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKCJDb21tYW5kIG5vdCByZWNvZ25pemVkOiAnIiArIGNvbW1hbmQgKyAiJyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRPRE8gLSByZXdyaXRlIENvbm5lY3Qgb3IgcmUtY29ubmVjdCB0byBTU0UgZXZlbnQgc3RyZWFtLgorICAgICAqCisgICAgICogQHBhcmFtIGxhc3RFdmVudElkIFZhbHVlIG9mIGN1c3RvbSBTU0UgSFRUUCA8dHQ+e0B2YWx1ZSBTc2VGZWF0dXJlI0xBU1RfRVZFTlRfSURfSEVBREVSfTwvdHQ+IGhlYWRlci4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgRGVmYXVsdHMgdG8ge0Bjb2RlIC0xfSBpZiBub3Qgc2V0LgorICAgICAqIEB0aHJvd3MgSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbiBpbiBjYXNlIHJlcGxheWluZyBtaXNzZWQgZXZlbnRzIHRvIHRoZSByZWNvbm5lY3RlZCBvdXRwdXQgc3RyZWFtIGZhaWxzLgorICAgICAqIEB0aHJvd3MgU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uICBpbiBjYXNlIHRoZSByZWNvbm5lY3QgZGVsYXkgaXMgc2V0IHRvIGEgcG9zaXRpdmUgdmFsdWUuCisgICAgICovCisgICAgQEdFVAorICAgIEBQYXRoKCJldmVudHMiKQorICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuU0VSVkVSX1NFTlRfRVZFTlRTKQorICAgIHB1YmxpYyB2b2lkIGl0ZW1FdmVudHMoQEhlYWRlclBhcmFtKFNzZUZlYXR1cmUuTEFTVF9FVkVOVF9JRF9IRUFERVIpIEBEZWZhdWx0VmFsdWUoIi0xIikgaW50IGxhc3RFdmVudElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQENvbnRleHQgU3NlRXZlbnRTaW5rIGV2ZW50U2luaykgeworCisgICAgICAgIGlmIChsYXN0RXZlbnRJZCA+PSAwKSB7CisgICAgICAgICAgICBMT0dHRVIuaW5mbygiUmVjZWl2ZWQgbGFzdCBldmVudCBpZCA6IiArIGxhc3RFdmVudElkKTsKKworICAgICAgICAgICAgLy8gZGVjaWRlIHRoZSByZWNvbm5lY3QgaGFuZGxpbmcgc3RyYXRlZ3kgYmFzZWQgb24gY3VycmVudCByZWNvbm5lY3QgZGVsYXkgdmFsdWUuCisgICAgICAgICAgICBmaW5hbCBsb25nIGRlbGF5ID0gcmVjb25uZWN0RGVsYXk7CisgICAgICAgICAgICBpZiAoMCA8IGRlbGF5KSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmluZm8oIk5vbi16ZXJvIHJlY29ubmVjdCBkZWxheSBbIiArIGRlbGF5ICsgIl0gLSByZXNwb25kaW5nIHdpdGggSFRUUCA1MDMuIik7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbihkZWxheSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExPR0dFUi5pbmZvKCJaZXJvIHJlY29ubmVjdCBkZWxheSAtIHJlY29ubmVjdGluZy4iKTsKKyAgICAgICAgICAgICAgICByZXBsYXlNaXNzZWRFdmVudHMobGFzdEV2ZW50SWQsIGV2ZW50U2luayk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBnZXRCcm9hZGNhc3RlcigpLnJlZ2lzdGVyKGV2ZW50U2luayk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJlcGxheU1pc3NlZEV2ZW50cyhpbnQgbGFzdEV2ZW50SWQsIFNzZUV2ZW50U2luayBldmVudFNpbmspIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN0b3JlTG9jay5yZWFkTG9jaygpLmxvY2soKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBmaXJzdFVucmVjZWl2ZWQgPSBsYXN0RXZlbnRJZCArIDE7CisgICAgICAgICAgICBmaW5hbCBpbnQgbWlzc2luZ0NvdW50ID0gaXRlbVN0b3JlLnNpemUoKSAtIGZpcnN0VW5yZWNlaXZlZDsKKyAgICAgICAgICAgIGlmIChtaXNzaW5nQ291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmluZm8oIlJlcGxheWluZyBldmVudHMgLSBzdGFydGluZyB3aXRoIGlkICIgKyBmaXJzdFVucmVjZWl2ZWQpOworICAgICAgICAgICAgICAgIGZpbmFsIExpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ID0gaXRlbVN0b3JlLnN1Ykxpc3QoZmlyc3RVbnJlY2VpdmVkLCBpdGVtU3RvcmUuc2l6ZSgpKS5saXN0SXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGV2ZW50U2luay5zZW5kKGNyZWF0ZUl0ZW1FdmVudChpdC5uZXh0SW5kZXgoKSArIGZpcnN0VW5yZWNlaXZlZCwgaXQubmV4dCgpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0dHRVIuaW5mbygiTm8gZXZlbnRzIHRvIHJlcGxheS4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHN0b3JlTG9jay5yZWFkTG9jaygpLnVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIG5ldyBpdGVtIHRvIHRoZSBpdGVtIHN0b3JlLgorICAgICAqIDxwPgorICAgICAqIEludm9raW5nIHRoaXMgbWV0aG9kIHdpbGwgZmlyZSAyIG5ldyBTU0UgZXZlbnRzIC0gMXN0IGFib3V0IG5ld2x5IGFkZGVkIGl0ZW0gYW5kIDJuZCBhYm91dCB0aGUgbmV3IGl0ZW0gc3RvcmUgc2l6ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIGl0ZW0gbmFtZS4KKyAgICAgKi8KKyAgICBAUE9TVAorICAgIHB1YmxpYyB2b2lkIGFkZEl0ZW0oQEZvcm1QYXJhbSgibmFtZSIpIFN0cmluZyBuYW1lKSB7CisgICAgICAgIC8vIElnbm9yZSBpZiB0aGUgcmVxdWVzdCB3YXMgc2VudCB3aXRob3V0IG5hbWUgcGFyYW1ldGVyLgorICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBpbnQgZXZlbnRJZDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN0b3JlTG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisgICAgICAgICAgICBldmVudElkID0gaXRlbVN0b3JlLnNpemUoKTsKKyAgICAgICAgICAgIGl0ZW1TdG9yZS5hZGQobmFtZSk7CisKKyAgICAgICAgICAgIFNzZUJyb2FkY2FzdGVyIHNzZUJyb2FkY2FzdGVyID0gZ2V0QnJvYWRjYXN0ZXIoKTsKKworICAgICAgICAgICAgLy8gQnJvYWRjYXN0aW5nIGFuIHVuLW5hbWVkIGV2ZW50IHdpdGggdGhlIG5hbWUgb2YgdGhlIG5ld2x5IGFkZGVkIGl0ZW0gaW4gZGF0YQorICAgICAgICAgICAgc3NlQnJvYWRjYXN0ZXIuYnJvYWRjYXN0KGNyZWF0ZUl0ZW1FdmVudChldmVudElkLCBuYW1lKSk7CisKKyAgICAgICAgICAgIC8vIEJyb2FkY2FzdGluZyBhIG5hbWVkICJzaXplIiBldmVudCB3aXRoIHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGl0ZW1zIGNvbGxlY3Rpb24gaW4gZGF0YQorICAgICAgICAgICAgZmluYWwgT3V0Ym91bmRTc2VFdmVudCBldmVudCA9IHNzZS5uZXdFdmVudEJ1aWxkZXIoKS5uYW1lKCJzaXplIikuZGF0YShJbnRlZ2VyLmNsYXNzLCBldmVudElkICsgMSkuYnVpbGQoKTsKKyAgICAgICAgICAgIHNzZUJyb2FkY2FzdGVyLmJyb2FkY2FzdChldmVudCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzdG9yZUxvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIE91dGJvdW5kU3NlRXZlbnQgY3JlYXRlSXRlbUV2ZW50KGZpbmFsIGludCBldmVudElkLCBmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKEpheHJzSXRlbVN0b3JlUmVzb3VyY2UuY2xhc3MuZ2V0TmFtZSgpKQorICAgICAgICAgICAgICAgIC5pbmZvKCJDcmVhdGluZyBldmVudCBpZCBbIiArIGV2ZW50SWQgKyAiXSBuYW1lIFsiICsgbmFtZSArICJdIik7CisgICAgICAgIHJldHVybiBzc2UubmV3RXZlbnRCdWlsZGVyKCkuaWQoIiIgKyBldmVudElkKS5kYXRhKFN0cmluZy5jbGFzcywgbmFtZSkuYnVpbGQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgc3RvcmVkIGJyb2FkY2FzdGVyIG9yIGNyZWF0ZSBhIG5ldyBvbmUgYW5kIHN0b3JlIGl0LgorICAgICAqCisgICAgICogQHJldHVybiBicm9hZGNhc3RlciBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNzZUJyb2FkY2FzdGVyIGdldEJyb2FkY2FzdGVyKCkgeworICAgICAgICBTc2VCcm9hZGNhc3RlciBzc2VCcm9hZGNhc3RlciA9IEJST0FEQ0FTVEVSLmdldCgpOworICAgICAgICBpZiAoc3NlQnJvYWRjYXN0ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgQlJPQURDQVNURVIuY29tcGFyZUFuZFNldChudWxsLCBzc2UubmV3QnJvYWRjYXN0ZXIoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gQlJPQURDQVNURVIuZ2V0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xvc2UgY3VycmVudGx5IHN0b3JlZCBicm9hZGNhc3Rlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgY2xvc2VCcm9hZGNhc3RlcigpIHsKKyAgICAgICAgU3NlQnJvYWRjYXN0ZXIgc3NlQnJvYWRjYXN0ZXIgPSBCUk9BRENBU1RFUi5nZXRBbmRTZXQobnVsbCk7CisgICAgICAgIGlmIChzc2VCcm9hZGNhc3RlciA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc3NlQnJvYWRjYXN0ZXIuY2xvc2UoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9zc2UtaXRlbS1zdG9yZS1qYXhycy13ZWJhcHAvc3JjL21haW4vd2ViYXBwL2Nzcy9tYWluLmNzcyBiL2V4YW1wbGVzL3NzZS1pdGVtLXN0b3JlLWpheHJzLXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvY3NzL21haW4uY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMzEzMjAKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zc2UtaXRlbS1zdG9yZS1qYXhycy13ZWJhcHAvc3JjL21haW4vd2ViYXBwL2Nzcy9tYWluLmNzcwpAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitkaXYubWVzc2FnZSB7CisgICAgYm9yZGVyLXJhZGl1czogMTBweDsKKyAgICBib3JkZXI6IHRoaW4gc29saWQgIzQ0NDQ0NDsKKyAgICBtYXJnaW46IDEwcHg7CisgICAgd2lkdGg6IDMwMHB4OworICAgIHBhZGRpbmc6IDEwcHg7CisgICAgYm94LXNoYWRvdzogNXB4IDVweCA1cHggIzg4ODg4ODsKKyAgICBmb250LWZhbWlseTogSGVsdmV0aWNhLCBzZXJpZjsKKyAgICBjb2xvcjogIzMzMzMzMzsKK30KKworZGl2Lml0ZW1zIHsKKyAgICBib3JkZXItcmFkaXVzOiAxMHB4OworICAgIGJvcmRlcjogdGhpbiBkb3R0ZWQgI0FBQUFGRjsKKyAgICBtYXJnaW46IDEwcHg7CisgICAgcGFkZGluZzogMTBweDsKKyAgICBmb250LWZhbWlseTogSGVsdmV0aWNhLCBzZXJpZjsKKyAgICBjb2xvcjogIzQ0NDRGRjsKK30KKworZGl2Lm1lc3NhZ3MgeworICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CisgICAgYm9yZGVyOiB0aGluIGRvdHRlZCAjODg4ODg4OworICAgIG1hcmdpbjogMTBweDsKKyAgICBwYWRkaW5nOiAxMHB4OworfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc3NlLWl0ZW0tc3RvcmUtamF4cnMtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sIGIvZXhhbXBsZXMvc3NlLWl0ZW0tc3RvcmUtamF4cnMtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNDg4YTIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zc2UtaXRlbS1zdG9yZS1qYXhycy13ZWJhcHAvc3JjL21haW4vd2ViYXBwL2luZGV4Lmh0bWwKQEAgLTAsMCArMSwyNyBAQAorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorPGh0bWw+Cis8aGVhZD4KKyAgICA8dGl0bGU+SmVyc2V5IFNTRSBJdGVtIFN0b3JlIEV4YW1wbGU8L3RpdGxlPgorICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iY3NzL21haW4uY3NzIi8+CisgICAgPHNjcmlwdCBzcmM9ImpzL2VuZ2luZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KKzwvaGVhZD4KKzxib2R5PgorPGRpdj4KKyAgICBFbnRlciBpdGVtOiA8aW5wdXQgaWQ9Im5hbWUiIHR5cGU9InRleHQiLz48aW5wdXQgdmFsdWU9IkFkZCIgdHlwZT0iYnV0dG9uIiBvbmNsaWNrPSJhZGRJdGVtKCkiLz4KKzwvZGl2PgorPGRpdiBpZD0iaXRlbXMiIGNsYXNzPSJpdGVtcyI+PC9kaXY+Cis8ZGl2IGlkPSJtZXNzYWdlcyIgY2xhc3M9Im1lc3NhZ2VzIj48L2Rpdj4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3NzZS1pdGVtLXN0b3JlLWpheHJzLXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvanMvZW5naW5lLmpzIGIvZXhhbXBsZXMvc3NlLWl0ZW0tc3RvcmUtamF4cnMtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9qcy9lbmdpbmUuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IxZjQyZAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3NzZS1pdGVtLXN0b3JlLWpheHJzLXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvanMvZW5naW5lLmpzCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKKyJ1c2Ugc3RyaWN0IjsKKworZnVuY3Rpb24gYWRkSXRlbSgpIHsKKyAgICB2YXIgaXRlbUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm5hbWUiKTsKKworICAgIHZhciByZXEgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKKyAgICByZXEub3BlbigiUE9TVCIsICJyZXNvdXJjZXMvaXRlbXMiLCB0cnVlKTsKKyAgICByZXEuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIiwgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpOworICAgIHJlcS5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7CisgICAgICAgIGlmIChyZXEucmVhZHlTdGF0ZSA9PSA0ICYmIHJlcS5zdGF0dXMgPT0gMjA0KSB7CisgICAgICAgICAgICAvL0NhbGwgYSBmdW5jdGlvbiB3aGVuIHRoZSBzdGF0ZSBjaGFuZ2VzLgorICAgICAgICAgICAgaXRlbUlucHV0LnZhbHVlID0gIiI7CisgICAgICAgICAgICBnZXRJdGVtcygpOworICAgICAgICB9CisgICAgfTsKKyAgICByZXEuc2VuZCgibmFtZT0iICsgaXRlbUlucHV0LnZhbHVlKTsKK30KKworZnVuY3Rpb24gZ2V0SXRlbXMoKSB7CisgICAgdmFyIHJlcSA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOworICAgIHJlcS5vcGVuKCJHRVQiLCAicmVzb3VyY2VzL2l0ZW1zIiwgdHJ1ZSk7CisgICAgcmVxLnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsICJ0ZXh0L3BsYWluIik7CisgICAgcmVxLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgLy9DYWxsIGEgZnVuY3Rpb24gd2hlbiB0aGUgc3RhdGUgY2hhbmdlcy4KKyAgICAgICAgaWYgKHJlcS5yZWFkeVN0YXRlID09IDQgJiYgcmVxLnN0YXR1cyA9PSAyMDApIHsKKyAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJpdGVtcyIpLmlubmVySFRNTCA9IHJlcS5yZXNwb25zZVRleHQ7CisgICAgICAgIH0KKyAgICB9OworICAgIHJlcS5zZW5kKCk7Cit9CisKK2Z1bmN0aW9uIGRpc3BsYXkoZGF0YSwgcmdiKSB7CisgICAgdmFyIG1zZ1NwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7CisgICAgbXNnU3Bhbi5zdHlsZS5jb2xvciA9IHJnYjsKKyAgICBtc2dTcGFuLmlubmVySFRNTCA9IGRhdGE7CisgICAgdmFyIG1zZ0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworICAgIG1zZ0Rpdi5jbGFzc05hbWUgPSAibWVzc2FnZSI7CisgICAgbXNnRGl2LmFwcGVuZENoaWxkKG1zZ1NwYW4pOworCisgICAgdmFyIG1lc3NhZ2VzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1lc3NhZ2VzIik7CisgICAgbWVzc2FnZXMuaW5zZXJ0QmVmb3JlKG1zZ0RpdiwgbWVzc2FnZXMuZmlyc3RDaGlsZCk7Cit9CisKK2Z1bmN0aW9uIHJlY2VpdmVNZXNzYWdlcygpIHsKKyAgICBpZiAodHlwZW9mKEV2ZW50U291cmNlKSAhPT0gInVuZGVmaW5lZCIpIHsKKyAgICAgICAgLy8gWWVzISBTZXJ2ZXItc2VudCBldmVudHMgc3VwcG9ydCEKKyAgICAgICAgdmFyIHNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSgicmVzb3VyY2VzL2l0ZW1zL2V2ZW50cyIpOworICAgICAgICBzb3VyY2Uub25tZXNzYWdlID0gZnVuY3Rpb24gKGV2ZW50KSB7CisgICAgICAgICAgICBjb25zb2xlLmxvZygnUmVjZWl2ZWQgdW5uYW1lZCBldmVudDogJyArIGV2ZW50LmRhdGEpOworICAgICAgICAgICAgZGlzcGxheSgiQWRkZWQgbmV3IGl0ZW06ICIgKyBldmVudC5kYXRhLCAiIzQ0NDQ0NCIpOworICAgICAgICB9OworCisgICAgICAgIHNvdXJjZS5hZGRFdmVudExpc3RlbmVyKCJzaXplIiwgZnVuY3Rpb24oZSkgeworICAgICAgICAgICAgY29uc29sZS5sb2coJ1JlY2VpdmVkIGV2ZW50ICcgKyBldmVudC5uYW1lICsgJzogJyArIGV2ZW50LmRhdGEpOworICAgICAgICAgICAgZGlzcGxheSgiTmV3IGl0ZW1zIHNpemU6ICIgKyBldmVudC5kYXRhLCAiIzAwMDBGRiIpOworICAgICAgICB9LCBmYWxzZSk7CisKKyAgICAgICAgc291cmNlLm9ub3BlbiA9IGZ1bmN0aW9uIChldmVudCkgeworICAgICAgICAgICAgY29uc29sZS5sb2coImV2ZW50IHNvdXJjZSBvcGVuZWQiKTsKKyAgICAgICAgfTsKKworICAgICAgICBzb3VyY2Uub25lcnJvciA9IGZ1bmN0aW9uIChldmVudCkgeworICAgICAgICAgICAgY29uc29sZS5sb2coJ1JlY2VpdmVkIGVycm9yIGV2ZW50OiAnICsgZXZlbnQuZGF0YSk7CisgICAgICAgICAgICBkaXNwbGF5KGV2ZW50LmRhdGEsICIjRkYwMDAwIik7CisgICAgICAgIH07CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gU29ycnkhIE5vIHNlcnZlci1zZW50IGV2ZW50cyBzdXBwb3J0Li4KKyAgICAgICAgZGlzcGxheSgnU1NFIG5vdCBzdXBwb3J0ZWQgYnkgYnJvd3Nlci4nLCAiI0ZGMDAwMCIpOworICAgIH0KK30KKword2luZG93Lm9ubG9hZCA9IHJlY2VpdmVNZXNzYWdlczsKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3NzZS1pdGVtLXN0b3JlLWpheHJzLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3NzZWl0ZW1zdG9yZS9qYXhycy9KYXhyc0l0ZW1TdG9yZVJlc291cmNlVGVzdC5qYXZhIGIvZXhhbXBsZXMvc3NlLWl0ZW0tc3RvcmUtamF4cnMtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvc3NlaXRlbXN0b3JlL2pheHJzL0pheHJzSXRlbVN0b3JlUmVzb3VyY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYzNTJhNgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3NzZS1pdGVtLXN0b3JlLWpheHJzLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3NzZWl0ZW1zdG9yZS9qYXhycy9KYXhyc0l0ZW1TdG9yZVJlc291cmNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzAxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnNzZWl0ZW1zdG9yZS5qYXhyczsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5RdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TGlua2VkUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Gb3JtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLnNzZS5Tc2VFdmVudFNvdXJjZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmFwYWNoZS5jb25uZWN0b3IuQXBhY2hlQ2xpZW50UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5hcGFjaGUuY29ubmVjdG9yLkFwYWNoZUNvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmEuVGhyZWFkRmFjdG9yeUJ1aWxkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNvbm4uUG9vbGluZ0h0dHBDbGllbnRDb25uZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmRlc2NyaWJlZEFzOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaGFzSXRlbXM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBJdGVtIHN0b3JlIHRlc3QuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEpheHJzSXRlbVN0b3JlUmVzb3VyY2VUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUkVDT05ORUNUX0RFRkFVTFQgPSA1MDA7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoSmF4cnNJdGVtU3RvcmVSZXNvdXJjZVRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0xJU1RFTkVSUyA9IDU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9JVEVNUyA9IDEwOworCisgICAgcHJpdmF0ZSBmaW5hbCBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlID0KKyAgICAgICAgICAgIEV4ZWN1dG9ycy5uZXdDYWNoZWRUaHJlYWRQb29sKG5ldyBUaHJlYWRGYWN0b3J5QnVpbGRlcigpLnNldE5hbWVGb3JtYXQoIkpheHJzSXRlbVN0b3JlUmVzb3VyY2VUZXN0LSVkIikuYnVpbGQoKSk7CisgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNSZWZlcmVuY2U8Q2xpZW50PiBjbGllbnQgPSBuZXcgQXRvbWljUmVmZXJlbmNlPD4obnVsbCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IEpheHJzSXRlbVN0b3JlQXBwKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgLy8gdXNpbmcgQUhDIGFzIGEgdGVzdCBjbGllbnQgY29ubmVjdG9yIHRvIGF2b2lkIGlzc3VlcyB3aXRoIEh0dHBVcmxDb25uZWN0aW9uIHNvY2tldCBtYW5hZ2VtZW50LgorICAgICAgICBQb29saW5nSHR0cENsaWVudENvbm5lY3Rpb25NYW5hZ2VyIGNtID0gbmV3IFBvb2xpbmdIdHRwQ2xpZW50Q29ubmVjdGlvbk1hbmFnZXIoKTsKKworICAgICAgICAvLyBhZGp1c3RpbmcgbWF4LiBjb25uZWN0aW9ucyBqdXN0IHRvIGJlIHNhZmUgLSB0aGUgdGVzdEV2ZW50U291cmNlUmVjb25uZWN0IGlzIHF1aXRlIGdyZWVkeS4uLgorICAgICAgICBjbS5zZXRNYXhUb3RhbChNQVhfTElTVEVORVJTICogTUFYX0lURU1TKTsKKyAgICAgICAgY20uc2V0RGVmYXVsdE1heFBlclJvdXRlKE1BWF9MSVNURU5FUlMgKiBNQVhfSVRFTVMpOworCisgICAgICAgIGNvbmZpZy5wcm9wZXJ0eShBcGFjaGVDbGllbnRQcm9wZXJ0aWVzLkNPTk5FQ1RJT05fTUFOQUdFUiwgY20pCisgICAgICAgICAgICAgICAgLnByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuUkVBRF9USU1FT1VULCAyMDAwKQorICAgICAgICAgICAgICAgIC5jb25uZWN0b3JQcm92aWRlcihuZXcgQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIENsaWVudCBnZXRDbGllbnQoKSB7CisgICAgICAgIGlmIChjbGllbnQuZ2V0KCkgPT0gbnVsbCkgeworICAgICAgICAgICAgQ2xpZW50Q29uZmlnIGNsaWVudENvbmZpZyA9IG5ldyBDbGllbnRDb25maWcoKTsKKyAgICAgICAgICAgIGNvbmZpZ3VyZUNsaWVudChjbGllbnRDb25maWcpOworICAgICAgICAgICAgY2xpZW50LmNvbXBhcmVBbmRTZXQobnVsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudEJ1aWxkZXIubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhDb25maWcoY2xpZW50Q29uZmlnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5leGVjdXRvclNlcnZpY2UoZXhlY3V0b3JTZXJ2aWNlKS5idWlsZCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjbGllbnQuZ2V0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICAgICAgY2xpZW50LmdldCgpLmNsb3NlKCk7CisgICAgICAgIGV4ZWN1dG9yU2VydmljZS5zaHV0ZG93bigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBVUkkgZ2V0QmFzZVVyaSgpIHsKKyAgICAgICAgZmluYWwgVXJpQnVpbGRlciBiYXNlVXJpQnVpbGRlciA9IFVyaUJ1aWxkZXIuZnJvbVVyaShzdXBlci5nZXRCYXNlVXJpKCkpLnBhdGgoInNzZS1pdGVtLXN0b3JlLWpheHJzLXdlYmFwcCIpOworICAgICAgICBmaW5hbCBib29sZWFuIGV4dGVybmFsRmFjdG9yeUluVXNlID0gZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSBpbnN0YW5jZW9mIEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CisgICAgICAgIHJldHVybiBleHRlcm5hbEZhY3RvcnlJblVzZSA/IGJhc2VVcmlCdWlsZGVyLnBhdGgoInJlc291cmNlcyIpLmJ1aWxkKCkgOiBiYXNlVXJpQnVpbGRlci5idWlsZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhlIGl0ZW0gYWRkaXRpb24sIGFkZGl0aW9uIGV2ZW50IGJyb2FkY2FzdGluZyBhbmQgaXRlbSByZXRyaWV2YWwgZnJvbSB7QGxpbmsgSmF4cnNJdGVtU3RvcmVSZXNvdXJjZX0uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGVzdCBmYWlsdXJlLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEl0ZW1zU3RvcmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGl0ZW1zID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KCJmb28iLCAiYmFyIiwgImJheiIpKTsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IGl0ZW1zVGFyZ2V0ID0gdGFyZ2V0KCJpdGVtcyIpOworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaChpdGVtcy5zaXplKCkgKiBNQVhfTElTVEVORVJTICogMik7IC8vIGNvdW50ZG93biBvbiBhbGwgZXZlbnRzCisgICAgICAgIGZpbmFsIExpc3Q8UXVldWU8SW50ZWdlcj4+IGluZGV4UXVldWVzID0gbmV3IEFycmF5TGlzdDw+KE1BWF9MSVNURU5FUlMpOworICAgICAgICBmaW5hbCBTc2VFdmVudFNvdXJjZVtdIHNvdXJjZXMgPSBuZXcgU3NlRXZlbnRTb3VyY2VbTUFYX0xJU1RFTkVSU107CisgICAgICAgIGZpbmFsIEF0b21pY0ludGVnZXIgc2l6ZUV2ZW50c0NvdW50ID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfTElTVEVORVJTOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBpZCA9IGk7CisgICAgICAgICAgICBmaW5hbCBTc2VFdmVudFNvdXJjZSBlcyA9IFNzZUV2ZW50U291cmNlLnRhcmdldChpdGVtc1RhcmdldC5wYXRoKCJldmVudHMiKSkuYnVpbGQoKTsKKyAgICAgICAgICAgIHNvdXJjZXNbaWRdID0gZXM7CisKKyAgICAgICAgICAgIGZpbmFsIFF1ZXVlPEludGVnZXI+IGluZGV4ZXMgPSBuZXcgQ29uY3VycmVudExpbmtlZFF1ZXVlPD4oKTsKKyAgICAgICAgICAgIGluZGV4UXVldWVzLmFkZChpbmRleGVzKTsKKworICAgICAgICAgICAgZXMucmVnaXN0ZXIoaW5ib3VuZEV2ZW50IC0+IHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAobnVsbCA9PSBpbmJvdW5kRXZlbnQuZ2V0TmFtZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGF0YSA9IGluYm91bmRFdmVudC5yZWFkRGF0YSgpOworICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmluZm8oIlstaS1dIFNPVVJDRSAiICsgaWQgKyAiOiBSZWNlaXZlZCBldmVudCBpZD0iICsgaW5ib3VuZEV2ZW50LmdldElkKCkgKyAiIGRhdGE9IiArIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhlcy5hZGQoaXRlbXMuaW5kZXhPZihkYXRhKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoInNpemUiLmVxdWFscyhpbmJvdW5kRXZlbnQuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZUV2ZW50c0NvdW50LmluY3JlbWVudEFuZEdldCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuU0VWRVJFLCAiWy14LV0gU09VUkNFICIgKyBpZCArICI6IEVycm9yIGdldHRpbmcgZXZlbnQgZGF0YS4iLCBleCk7CisgICAgICAgICAgICAgICAgICAgIGluZGV4ZXMuYWRkKC05OTkpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9wZW4oc291cmNlcyk7CisgICAgICAgICAgICBpdGVtcy5mb3JFYWNoKChpdGVtKSAtPiBwb3N0SXRlbShpdGVtc1RhcmdldCwgaXRlbSkpOworCisgICAgICAgICAgICBhc3NlcnRUcnVlKCJXYWl0aW5nIHRvIHJlY2VpdmUgYWxsIGV2ZW50cyBoYXMgdGltZWQgb3V0LiIsCisgICAgICAgICAgICAgICAgICAgIGxhdGNoLmF3YWl0KCgxMDAwICsgTUFYX0xJU1RFTkVSUyAqIFJFQ09OTkVDVF9ERUZBVUxUKSAqIGdldEFzeW5jVGltZW91dE11bHRpcGxpZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKworICAgICAgICAgICAgLy8gbmVlZCB0byBmb3JjZSBkaXNjb25uZWN0IG9uIHNlcnZlciBpbiBvcmRlciBmb3IgRXZlbnRTb3VyY2UuY2xvc2UoLi4uKSB0byBzdWNjZWVkIHdpdGggSHR0cFVybENvbm5lY3Rpb24KKyAgICAgICAgICAgIHNlbmRDb21tYW5kKGl0ZW1zVGFyZ2V0LCAiZGlzY29ubmVjdCIpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgY2xvc2Uoc291cmNlcyk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgcG9zdGVkSXRlbXMgPSBpdGVtc1RhcmdldC5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0pIC0+IGFzc2VydFRydWUoIkl0ZW0gJyIgKyBpdGVtICsgIicgbm90IHN0b3JlZCBvbiBzZXJ2ZXIuIiwgcG9zdGVkSXRlbXMuY29udGFpbnMoaXRlbSkpKTsKKworICAgICAgICBmaW5hbCBBdG9taWNJbnRlZ2VyIHF1ZXVlSWQgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKKyAgICAgICAgaW5kZXhRdWV1ZXMuZm9yRWFjaCgoaW5kZXhlcykgLT4geworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdGVtcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkV2ZW50IGZvciAnIiArIGl0ZW1zLmdldChpKSArICInIG5vdCByZWNlaXZlZCBpbiBxdWV1ZSAiICsgcXVldWVJZC5nZXQoKSwgaW5kZXhlcy5jb250YWlucyhpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIk5vdCByZWNlaXZlZCB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIGV2ZW50cyBpbiBxdWV1ZSAiICsgcXVldWVJZC5nZXQoKSwgaXRlbXMuc2l6ZSgpLCBpbmRleGVzLnNpemUoKSk7CisgICAgICAgICAgICBxdWV1ZUlkLmluY3JlbWVudEFuZEdldCgpOworICAgICAgICB9KTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIk51bWJlciBvZiByZWNlaXZlZCAnc2l6ZScgZXZlbnRzIGRvZXMgbm90IG1hdGNoLiIsIGl0ZW1zLnNpemUoKSAqIE1BWF9MSVNURU5FUlMsIHNpemVFdmVudHNDb3VudC5nZXQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0aGUge0BsaW5rIFNzZUV2ZW50U291cmNlfSByZWNvbm5lY3QgZmVhdHVyZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0ZXN0IGZhaWx1cmUuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXZlbnRTb3VyY2VSZWNvbm5lY3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IGl0ZW1zVGFyZ2V0ID0gdGFyZ2V0KCJpdGVtcyIpOworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaChNQVhfSVRFTVMgKiBNQVhfTElTVEVORVJTICogMik7IC8vIGNvdW50ZG93biBvbmx5IG9uIG5ldyBpdGVtIGV2ZW50cworICAgICAgICBmaW5hbCBMaXN0PFF1ZXVlPFN0cmluZz4+IHJlY2VpdmVkUXVldWVzID0gbmV3IEFycmF5TGlzdDw+KE1BWF9MSVNURU5FUlMpOworICAgICAgICBmaW5hbCBTc2VFdmVudFNvdXJjZVtdIHNvdXJjZXMgPSBuZXcgU3NlRXZlbnRTb3VyY2VbTUFYX0xJU1RFTkVSU107CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfTElTVEVORVJTOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBpZCA9IGk7CisgICAgICAgICAgICBmaW5hbCBTc2VFdmVudFNvdXJjZSBlcyA9IFNzZUV2ZW50U291cmNlLnRhcmdldChpdGVtc1RhcmdldC5wYXRoKCJldmVudHMiKSkKKyAgICAgICAgICAgICAgICAgICAgLnJlY29ubmVjdGluZ0V2ZXJ5KDEsIFRpbWVVbml0Lk1JTExJU0VDT05EUykuYnVpbGQoKTsKKyAgICAgICAgICAgIHNvdXJjZXNbaWRdID0gZXM7CisKKyAgICAgICAgICAgIGZpbmFsIFF1ZXVlPFN0cmluZz4gcmVjZWl2ZWQgPSBuZXcgQ29uY3VycmVudExpbmtlZFF1ZXVlPD4oKTsKKyAgICAgICAgICAgIHJlY2VpdmVkUXVldWVzLmFkZChyZWNlaXZlZCk7CisKKyAgICAgICAgICAgIGVzLnJlZ2lzdGVyKGluYm91bmRFdmVudCAtPiB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gaW5ib3VuZEV2ZW50LmdldE5hbWUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRhdGEgPSBpbmJvdW5kRXZlbnQucmVhZERhdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi5pbmZvKCJbLWktXSBTT1VSQ0UgIiArIGlkICsgIjogUmVjZWl2ZWQgZXZlbnQgaWQ9IiArIGluYm91bmRFdmVudC5nZXRJZCgpICsgIiBkYXRhPSIgKyBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkLmFkZChkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuU0VWRVJFLCAiWy14LV0gU09VUkNFICIgKyBpZCArICI6IEVycm9yIGdldHRpbmcgZXZlbnQgZGF0YS4iLCBleCk7CisgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkLmFkZCgiW2RhdGEgcHJvY2Vzc2luZyBlcnJvcl0iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFN0cmluZ1tdIHBvc3RlZEl0ZW1zID0gbmV3IFN0cmluZ1tNQVhfSVRFTVMgKiAyXTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG9wZW4oc291cmNlcyk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0lURU1TOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaXRlbSA9IFN0cmluZy5mb3JtYXQoInJvdW5kLTEtJTAyZCIsIGkpOworICAgICAgICAgICAgICAgIHBvc3RJdGVtKGl0ZW1zVGFyZ2V0LCBpdGVtKTsKKyAgICAgICAgICAgICAgICBwb3N0ZWRJdGVtc1tpXSA9IGl0ZW07CisgICAgICAgICAgICAgICAgc2VuZENvbW1hbmQoaXRlbXNUYXJnZXQsICJkaXNjb25uZWN0Iik7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDIwMCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIGludCByZWNvbm5lY3REZWxheSA9IDE7CisgICAgICAgICAgICBzZW5kQ29tbWFuZChpdGVtc1RhcmdldCwgInJlY29ubmVjdCAiICsgcmVjb25uZWN0RGVsYXkpOworICAgICAgICAgICAgc2VuZENvbW1hbmQoaXRlbXNUYXJnZXQsICJkaXNjb25uZWN0Iik7CisKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcChyZWNvbm5lY3REZWxheSAqIDEwMDApOworCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9JVEVNUzsgaSsrKSB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGl0ZW0gPSBTdHJpbmcuZm9ybWF0KCJyb3VuZC0yLSUwMmQiLCBpKTsKKyAgICAgICAgICAgICAgICBwb3N0ZWRJdGVtc1tpICsgTUFYX0lURU1TXSA9IGl0ZW07CisgICAgICAgICAgICAgICAgcG9zdEl0ZW0oaXRlbXNUYXJnZXQsIGl0ZW0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzZW5kQ29tbWFuZChpdGVtc1RhcmdldCwgInJlY29ubmVjdCBub3ciKTsKKworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiV2FpdGluZyB0byByZWNlaXZlIGFsbCBldmVudHMgaGFzIHRpbWVkIG91dC4iLAorICAgICAgICAgICAgICAgICAgICBsYXRjaC5hd2FpdCgoMSArIE1BWF9MSVNURU5FUlMgKiAoTUFYX0lURU1TICsgMSkgKiByZWNvbm5lY3REZWxheSkgKiBnZXRBc3luY1RpbWVvdXRNdWx0aXBsaWVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQuU0VDT05EUykpOworCisgICAgICAgICAgICAvLyBuZWVkIHRvIGZvcmNlIGRpc2Nvbm5lY3Qgb24gc2VydmVyIGluIG9yZGVyIGZvciBFdmVudFNvdXJjZS5jbG9zZSguLi4pIHRvIHN1Y2NlZWQgd2l0aCBIdHRwVXJsQ29ubmVjdGlvbgorICAgICAgICAgICAgc2VuZENvbW1hbmQoaXRlbXNUYXJnZXQsICJkaXNjb25uZWN0Iik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBjbG9zZShzb3VyY2VzKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFN0cmluZyBzdG9yZWRJdGVtcyA9IGl0ZW1zVGFyZ2V0LnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgZm9yIChTdHJpbmcgaXRlbSA6IHBvc3RlZEl0ZW1zKSB7CisgICAgICAgICAgICBhc3NlcnRUaGF0KCJQb3N0ZWQgaXRlbSAnIiArIGl0ZW0gKyAiJyBzdG9yZWQgb24gc2VydmVyIiwgc3RvcmVkSXRlbXMsIGNvbnRhaW5zU3RyaW5nKGl0ZW0pKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBzb3VyY2VJZCA9IDA7CisgICAgICAgIGZvciAoUXVldWU8U3RyaW5nPiBxdWV1ZSA6IHJlY2VpdmVkUXVldWVzKSB7CisgICAgICAgICAgICBhc3NlcnRUaGF0KCJSZWNlaXZlZCBldmVudHMgaW4gc291cmNlICIgKyBzb3VyY2VJZCwgcXVldWUsCisgICAgICAgICAgICAgICAgICAgIGRlc2NyaWJlZEFzKCJDb2xsZWN0aW9uIGNvbnRhaW5pbmcgJTAiLCBoYXNJdGVtcyhwb3N0ZWRJdGVtcyksIEFycmF5cy5hc0xpc3QocG9zdGVkSXRlbXMpLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoIlNpemUgb2YgcmVjZWl2ZWQgcXVldWUgZm9yIHNvdXJjZSAiICsgc291cmNlSWQsIHF1ZXVlLnNpemUoKSwgZXF1YWxUbyhwb3N0ZWRJdGVtcy5sZW5ndGgpKTsKKyAgICAgICAgICAgIHNvdXJjZUlkKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHBvc3RJdGVtKGZpbmFsIFdlYlRhcmdldCBpdGVtc1RhcmdldCwgZmluYWwgU3RyaW5nIGl0ZW0pIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSBpdGVtc1RhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZm9ybShuZXcgRm9ybSgibmFtZSIsIGl0ZW0pKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiUG9zdGluZyBuZXcgaXRlbSBoYXMgZmFpbGVkLiIsIDIwNCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBMT0dHRVIuaW5mbygiWy1pLV0gUE9TVGVkIGl0ZW06ICciICsgaXRlbSArICInIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBvcGVuKGZpbmFsIFNzZUV2ZW50U291cmNlW10gc291cmNlcykgeworICAgICAgICBBcnJheXMuc3RyZWFtKHNvdXJjZXMpLmZvckVhY2goU3NlRXZlbnRTb3VyY2U6Om9wZW4pOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2xvc2UoZmluYWwgU3NlRXZlbnRTb3VyY2VbXSBzb3VyY2VzKSB7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgZm9yIChTc2VFdmVudFNvdXJjZSBzb3VyY2UgOiBzb3VyY2VzKSB7CisgICAgICAgICAgICBpZiAoc291cmNlLmlzT3BlbigpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiV2FpdGluZyB0byBjbG9zZSBhIHNvdXJjZSBoYXMgdGltZWQgb3V0LiIsIHNvdXJjZS5jbG9zZSgxLCBUaW1lVW5pdC5TRUNPTkRTKSk7CisvLyAgICAgICAgICAgICAgICAgICAgc291cmNlLmNsb3NlKDEwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgICAgICBMT0dHRVIuaW5mbygiWzwtLV0gU09VUkNFICIgKyBpKysgKyAiIGNsb3NlZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2VuZENvbW1hbmQoZmluYWwgV2ViVGFyZ2V0IGl0ZW1zVGFyZ2V0LCBmaW5hbCBTdHJpbmcgY29tbWFuZCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IGl0ZW1zVGFyZ2V0LnBhdGgoImNvbW1hbmRzIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LnRleHQoY29tbWFuZCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiciICsgY29tbWFuZCArICInIGNvbW1hbmQgaGFzIGZhaWxlZC4iLCAyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgTE9HR0VSLmluZm8oIlstIS1dIENPTU1BTkQgJyIgKyBjb21tYW5kICsgIicgaGFzIGJlZW4gcHJvY2Vzc2VkLiIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3NzZS1pdGVtLXN0b3JlLWplcnNleS13ZWJhcHAvUkVBRE1FLk1EIGIvZXhhbXBsZXMvc3NlLWl0ZW0tc3RvcmUtamVyc2V5LXdlYmFwcC9SRUFETUUuTUQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg1MDg3NQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3NzZS1pdGVtLXN0b3JlLWplcnNleS13ZWJhcHAvUkVBRE1FLk1ECkBAIC0wLDAgKzEsNjcgQEAKK1svL106ICMgIiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gIgorWy8vXTogIyAiICIKK1svL106ICMgIiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgIgorWy8vXTogIyAiIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0ICIKK1svL106ICMgIiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuICIKK1svL106ICMgIiAiCitbLy9dOiAjICIgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZSAiCisKK1NTRSBJdGVtIFN0b3JlIEplcnNleSBFeGFtcGxlCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitBbiBleGFtcGxlIGRlbW9uc3RyYXRpbmcgaG93IFNlcnZlciBTZW50IEV2ZW50cyAoU1NFKSBKZXJzZXkgc3VwcG9ydCBjYW4KK2JlIHVzZWQgdG8gbm90aWZ5IGNsaWVudHMgYWJvdXQgY2hhbmdlcyBpbiBzZXJ2ZXItc2lkZSBtYW5hZ2VkIGRhdGEKKyhjb2xsZWN0aW9uIG9mIGl0ZW1zKS4gVGhlIGV4YW1wbGUgYWxzbyBvdXRsaW5lcyBob3cgU1NFIGV2ZW50cyBjYW4gYmUKK2NvbnN1bWVkIHVzaW5nIGphdmFzY3JpcHQgYnJvd3Nlci1iYXNlZCBjbGllbnRzLgorCitDb250ZW50cworLS0tLS0tLS0KKworVGhlIGV4YW1wbGUgY29uc2lzdHMgb2YgYSB3ZWItYmFzZWQgY2xpZW50IGFwcGxpY2F0aW9uIGFuZCBhIHNlcnZlci1zaWRlCithcHBsaWNhdGlvbiBkZXBsb3llZCBvbiBhIFtKZXR0eSBzZXJ2bGV0IGNvbnRhaW5lcl0oaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9qZXR0eS9kb2N1bWVudGF0aW9uL2N1cnJlbnQvKS4KKworVGhlIHNlcnZlciBzaWRlIHBhcnQgb2YgdGhlIGFwcGxpY2F0aW9uIGNvbnNpc3RzIG9mIGEgSkFYLVJTIHJlc291cmNlCittYW5hZ2luZyBjb2xsZWN0aW9uIG9mIHN0cmluZyBpdGVtcyBhbmQgYSBzaW1wbGUgSFRNTCBwYWdlIHRoYXQgaW5jbHVkZXMKK2EgYnJvd3NlciBTU0UgY2xpZW50IHdyaXR0ZW4gaW4gSmF2YXNjcmlwdCBhcyB3ZWxsIGFzIGEgYmFzaWMgQ1NTCitzdHlsZXNoZWV0LiBUaGUgU1NFIEphdmFzY3JpcHQgY2xpZW50IGNvbm5lY3RzIHRvIHRoZSBKQVgtUlMgcmVzb3VyY2UKK2FuZCB0cmFuc2Zvcm1zIHRoZSBzdHJlYW1lZCBtZXNzYWdlcyBpbnRvIEhUTUwgY29kZSB0aGF0IGlzIHJlbmRlcmVkIGJ5Cit0aGUgYnJvd3Nlci4gVGhlIGphdmFzY3JpcHQgY2xpZW50IGFsc28gZGVtb25zdHJhdGVzIGhvdyBuYW1lZCBhbmQKK3VubmFtZWQgU1NFIGV2ZW50cyBhcmUgaGFuZGxlZCBieSBIVE1MNSBgRXZlbnRTb3VyY2VgIGNvbXBvbmVudC4gVGhlCittYXBwaW5nIG9mIHRoZSBVUkkgcGF0aCBzcGFjZSBvZiB0aGUgc2VydmVyLXNpZGUgcGFydCBvZiB0aGUgYXBwbGljYXRpb24KK2lzIHByZXNlbnRlZCBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOgorCitVUkkgcGF0aCAgICAgICAgICAgICAgICAgICAgICAgIHwgIFJlc291cmNlIGNsYXNzICAgICAgfCBIVFRQIG1ldGhvZHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAgLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tCisqKl8vcmVzb3VyY2VzL2l0ZW1zXyoqICAgICAgICAgIHwgIEl0ZW1TdG9yZVJlc291cmNlICAgfCBHRVQsIFBPU1QKKyoqXy9yZXNvdXJjZXMvaXRlbXMvZXZlbnRzXyoqICAgfCAgSXRlbVN0b3JlUmVzb3VyY2UgICB8IEdFVCAoU1NFKQorCitBcHBsaWNhdGlvbiBpcyBjb25maWd1cmVkIHRvIHJ1biB1c2luZyBKZXR0eSBtYXZlbiBwbHVnaW4gdW5kZXIgYmFzZQorcGF0aCBgc3NlLWl0ZW0tc3RvcmUtd2ViYXBwYC4KKworUnVubmluZyB0aGUgRXhhbXBsZQorLS0tLS0tLS0tLS0tLS0tLS0tLQorCis+ICAgICBtdm4gY2xlYW4gY29tcGlsZSBqZXR0eTpydW4KKworVGhlIGNvbW1hbmQgYWJvdmUgZGVwbG95cyB0aGUgY3VycmVudCBleGFtcGxlLiBBZnRlciBzdWNjZXNzZnVsCitkZXBsb3ltZW50LCB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gYWNjZXNzIHRoZSBicm93c2VyIFNTRSBjbGllbnQgcGFnZSBhdAorPGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9zc2UtaXRlbS1zdG9yZS1qZXJzZXktd2ViYXBwL2luZGV4Lmh0bWw+LiBUbyBzZWUgdGhlIHJhdworU1NFIGV2ZW50IHN0cmVhbSwgeW91IG1heSBhbHNvIHBvaW50IHlvdXIgYnJvd3NlciBkaXJlY3RseSBhdCB0aGUKK1tgSXRlbVN0b3JlUmVzb3VyY2VgXShodHRwOi8vbG9jYWxob3N0OjgwODAvc3NlLWl0ZW0tc3RvcmUtamVyc2V5LXdlYmFwcC9yZXNvdXJjZXMvaXRlbXMvZXZlbnRzKS4KKworRGVwbG95aW5nIHRoZSBleGFtcGxlIHRvIGFub3RoZXIgc2VydmxldCBjb250YWluZXIuCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPiAgICAgbXZuIGNsZWFuIHBhY2thZ2UKKworVGhlIGNvbW1hbmQgYWJvdmUgY3JlYXRlcyBhIFNlcnZsZXQgMy54IGNvbXBsaWFudCBXQVIgbG9jYXRlZCBpbiB0aGUKK3RhcmdldCBkaXJlY3RvcnkuIFRoZSBXQVIgY2FuIGJlIHRoZW4gZGVwbG95ZWQgdG8geW91ciBTZXJ2bGV0IDMueAorY29tcGxpYW50IGNvbnRhaW5lci4KKworUnVubmluZyBUZXN0IENsaWVudAorLS0tLS0tLS0tLS0tLS0tLS0tLQorCitBZnRlciBkZXBsb3lpbmcgdGhlIGFwcGxpY2F0aW9uIGludG8gYSBTZXJ2bGV0IDMueCBjb21wbGlhbnQgY29udGFpbmVyLAoreW91IGNhbiBydW4gdGhlIGF0dGFjaGVkIHRlc3QgYnkgZXhlY3V0aW5nOgorCis+ICAgICBtdm4gdGVzdCAtRGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIuZmFjdG9yeT1vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkgLURqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ9PHBvcnQ+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9zc2UtaXRlbS1zdG9yZS1qZXJzZXktd2ViYXBwL3BvbS54bWwgYi9leGFtcGxlcy9zc2UtaXRlbS1zdG9yZS1qZXJzZXktd2ViYXBwL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRhZGNkNQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3NzZS1pdGVtLXN0b3JlLWplcnNleS13ZWJhcHAvcG9tLnhtbApAQCAtMCwwICsxLDEwMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKworICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD53ZWJhcHAtZXhhbXBsZS1wYXJlbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vd2ViYXBwLWV4YW1wbGUtcGFyZW50L3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPnNzZS1pdGVtLXN0b3JlLWplcnNleS13ZWJhcHA8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktZXhhbXBsZXMtc3NlLWl0ZW0tc3RvcmUtamVyc2V5LXdlYmFwcDwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgU1NFIEFQSS1iYXNlZCBpdGVtIHN0b3JlIGV4YW1wbGUuPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWhrMjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtc3NlPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb25uZWN0b3JzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWFwYWNoZS1jb25uZWN0b3I8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8IS0tIFJ1biB0aGUgYXBwbGljYXRpb24gdXNpbmcgIm12biBqZXR0eTpydW4iIC0tPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8IS0tIFRPRE8gdW5pZnkgSmV0dHkgaW4gYWxsIGV4YW1wbGVzIC0tPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHNjYW5JbnRlcnZhbFNlY29uZHM+MTA8L3NjYW5JbnRlcnZhbFNlY29uZHM+CisgICAgICAgICAgICAgICAgICAgIDxzdG9wUG9ydD45OTk5PC9zdG9wUG9ydD4KKyAgICAgICAgICAgICAgICAgICAgPHN0b3BLZXk+U1RPUDwvc3RvcEtleT4KKyAgICAgICAgICAgICAgICAgICAgPHdlYkFwcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb250ZXh0UGF0aD4vJHtwcm9qZWN0LmFydGlmYWN0SWR9PC9jb250ZXh0UGF0aD4KKyAgICAgICAgICAgICAgICAgICAgPC93ZWJBcHA+CisgICAgICAgICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHN5c3RlbVByb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmpldHR5LnBvcnQ8L25hbWU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPiR7amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0fTwvdmFsdWU+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3N5c3RlbVByb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICA8L3N5c3RlbVByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5yZWxlYXNlPC9pZD4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+eG1sLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICA8L3Byb2ZpbGVzPgorCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+ODA4MDwvamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0PgorICAgIDwvcHJvcGVydGllcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3NzZS1pdGVtLXN0b3JlLWplcnNleS13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9zc2VpdGVtc3RvcmUvamVyc2V5L0l0ZW1TdG9yZUFwcC5qYXZhIGIvZXhhbXBsZXMvc3NlLWl0ZW0tc3RvcmUtamVyc2V5LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3NzZWl0ZW1zdG9yZS9qZXJzZXkvSXRlbVN0b3JlQXBwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThjYTU5MwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3NzZS1pdGVtLXN0b3JlLWplcnNleS13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9zc2VpdGVtc3RvcmUvamVyc2V5L0l0ZW1TdG9yZUFwcC5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuc3NlaXRlbXN0b3JlLmplcnNleTsKKworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5Tc2VGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworLyoqCisgKiBTU0UgaXRlbSBzdG9yZSBKQVgtUlMgYXBwbGljYXRpb24gY2xhc3MuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uUGF0aCgicmVzb3VyY2VzIikKK3B1YmxpYyBjbGFzcyBJdGVtU3RvcmVBcHAgZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyBTU0UgSXRlbSBTdG9yZSBFeGFtcGxlIEpBWC1SUyBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgSXRlbVN0b3JlQXBwKCkgeworICAgICAgICBzdXBlcihJdGVtU3RvcmVSZXNvdXJjZS5jbGFzcywgU3NlRmVhdHVyZS5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc3NlLWl0ZW0tc3RvcmUtamVyc2V5LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3NzZWl0ZW1zdG9yZS9qZXJzZXkvSXRlbVN0b3JlUmVzb3VyY2UuamF2YSBiL2V4YW1wbGVzL3NzZS1pdGVtLXN0b3JlLWplcnNleS13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9zc2VpdGVtc3RvcmUvamVyc2V5L0l0ZW1TdG9yZVJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThkMWRjNwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3NzZS1pdGVtLXN0b3JlLWplcnNleS13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9zc2VpdGVtc3RvcmUvamVyc2V5L0l0ZW1TdG9yZVJlc291cmNlLmphdmEKQEAgLTAsMCArMSwyMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuc3NlaXRlbXN0b3JlLmplcnNleTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3RJdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5sb2Nrcy5SZWVudHJhbnRSZWFkV3JpdGVMb2NrOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkJhZFJlcXVlc3RFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuRGVmYXVsdFZhbHVlOworaW1wb3J0IGphdmF4LndzLnJzLkZvcm1QYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuSGVhZGVyUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLkV2ZW50T3V0cHV0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5PdXRib3VuZEV2ZW50OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5Tc2VCcm9hZGNhc3RlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5zc2UuU3NlRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQnJvYWRjYXN0ZXJMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ2h1bmtlZE91dHB1dDsKKworLyoqCisgKiBBIHJlc291cmNlIGZvciBzdG9yaW5nIG5hbWVkIGl0ZW1zLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJpdGVtcyIpCitwdWJsaWMgY2xhc3MgSXRlbVN0b3JlUmVzb3VyY2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEl0ZW1TdG9yZVJlc291cmNlLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZWVudHJhbnRSZWFkV3JpdGVMb2NrIHN0b3JlTG9jayA9IG5ldyBSZWVudHJhbnRSZWFkV3JpdGVMb2NrKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlua2VkTGlzdDxTdHJpbmc+IGl0ZW1TdG9yZSA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTc2VCcm9hZGNhc3RlciBicm9hZGNhc3RlciA9IG5ldyBTc2VCcm9hZGNhc3RlcigpOworCisgICAgc3RhdGljIHsKKyAgICAgICAgYnJvYWRjYXN0ZXIuYWRkKG5ldyBCcm9hZGNhc3Rlckxpc3RlbmVyPE91dGJvdW5kRXZlbnQ+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkV4Y2VwdGlvbihDaHVua2VkT3V0cHV0PE91dGJvdW5kRXZlbnQ+IGNodW5rZWRPdXRwdXQsIEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLldBUk5JTkcsCisgICAgICAgICAgICAgICAgICAgICAgICAiQW4gZXhjZXB0aW9uIGhhcyBiZWVuIHRocm93biB3aGlsZSBicm9hZGNhc3RpbmcgdG8gYW4gZXZlbnQgb3V0cHV0LiIsCisgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb24pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xvc2UoQ2h1bmtlZE91dHB1dDxPdXRib3VuZEV2ZW50PiBjaHVua2VkT3V0cHV0KSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5JTkZPLCAiQ2h1bmtlZCBvdXRwdXQgaGFzIGJlZW4gY2xvc2VkLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBsb25nIHJlY29ubmVjdERlbGF5ID0gMDsKKworICAgIC8qKgorICAgICAqIExpc3QgYWxsIHN0b3JlZCBpdGVtcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbGlzdCBvZiBhbGwgc3RvcmVkIGl0ZW1zLgorICAgICAqLworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgcHVibGljIFN0cmluZyBsaXN0SXRlbXMoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdG9yZUxvY2sucmVhZExvY2soKS5sb2NrKCk7CisgICAgICAgICAgICByZXR1cm4gaXRlbVN0b3JlLnRvU3RyaW5nKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzdG9yZUxvY2sucmVhZExvY2soKS51bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlY2VpdmUgJiBwcm9jZXNzIGNvbW1hbmRzIHNlbnQgYnkgdGhlIHRlc3QgY2xpZW50IHRoYXQgY29udHJvbCB0aGUgaW50ZXJuYWwgcmVzb3VyY2Ugc3RhdGUuCisgICAgICoKKyAgICAgKiBGb2xsb3dpbmcgaXMgdGhlIGxpc3Qgb2YgcmVjb2duaXplZCBjb21tYW5kczoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPjxiPmRpc2Nvbm5lY3Q8L2I+IC0gZGlzY29ubmVjdCBhbGwgcmVnaXN0ZXJlZCBldmVudCBzdHJlYW1zLjwvbGk+CisgICAgICogPGxpPjxiPnJlY29ubmVjdCBub3c8L2I+IC0gZW5hYmxlIGNsaWVudCByZWNvbm5lY3RpbmcuPC9saT4KKyAgICAgKiA8bGk+PGI+cmVjb25uZWN0ICZsdDtzZWNvbmRzJmd0OzwvYj4gLSBkaXNhYmxlIGNsaWVudCByZWNvbm5lY3RpbmcuCisgICAgICogUmVjb25uZWN0aW5nIGNsaWVudHMgd2lsbCByZWNlaXZlIGEgSFRUUCA1MDMgcmVzcG9uc2Ugd2l0aAorICAgICAqIHtAdmFsdWUgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVycyNSRVRSWV9BRlRFUn0gc2V0IHRvIHRoZSBhbW91bnQgb2YKKyAgICAgKiBtaWxsaXNlY29uZHMgc3BlY2lmaWVkLjwvbGk+CisgICAgICogPC91bD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb21tYW5kIGNvbW1hbmQgdG8gYmUgcHJvY2Vzc2VkLgorICAgICAqIEByZXR1cm4gbWVzc2FnZSBhYm91dCBwcm9jZXNzaW5nIHJlc3VsdC4KKyAgICAgKiBAdGhyb3dzIEJhZFJlcXVlc3RFeGNlcHRpb24gaW4gY2FzZSB0aGUgY29tbWFuZCBpcyBub3QgcmVjb2duaXplZCBvciBub3Qgc3BlY2lmaWVkLgorICAgICAqLworICAgIEBQT1NUCisgICAgQFBhdGgoImNvbW1hbmRzIikKKyAgICBwdWJsaWMgU3RyaW5nIHByb2Nlc3NDb21tYW5kKFN0cmluZyBjb21tYW5kKSB7CisgICAgICAgIGlmIChjb21tYW5kID09IG51bGwgfHwgY29tbWFuZC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKCJObyBjb21tYW5kIHNwZWNpZmllZC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgiZGlzY29ubmVjdCIuZXF1YWxzKGNvbW1hbmQpKSB7CisgICAgICAgICAgICBicm9hZGNhc3Rlci5jbG9zZUFsbCgpOworICAgICAgICAgICAgcmV0dXJuICJEaXNjb25uZWN0ZWQuIjsKKyAgICAgICAgfSBlbHNlIGlmIChjb21tYW5kLmxlbmd0aCgpID4gInJlY29ubmVjdCAiLmxlbmd0aCgpICYmIGNvbW1hbmQuc3RhcnRzV2l0aCgicmVjb25uZWN0ICIpKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgd2hlbiA9IGNvbW1hbmQuc3Vic3RyaW5nKCJyZWNvbm5lY3QgIi5sZW5ndGgoKSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlY29ubmVjdERlbGF5ID0gIm5vdyIuZXF1YWxzKHdoZW4pID8gMCA6IExvbmcucGFyc2VMb25nKHdoZW4pOworICAgICAgICAgICAgICAgIHJldHVybiAiUmVjb25uZWN0IHN0cmF0ZWd5IHVwZGF0ZWQ6ICIgKyB3aGVuOworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGlnbm9yZSkgeworICAgICAgICAgICAgICAgIC8vIGlnbm9yZWQKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKCJDb21tYW5kIG5vdCByZWNvZ25pemVkOiAnIiArIGNvbW1hbmQgKyAiJyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbm5lY3Qgb3IgcmUtY29ubmVjdCB0byBTU0UgZXZlbnQgc3RyZWFtLgorICAgICAqCisgICAgICogQHBhcmFtIGxhc3RFdmVudElkIFZhbHVlIG9mIGN1c3RvbSBTU0UgSFRUUCA8dHQ+e0B2YWx1ZSBTc2VGZWF0dXJlI0xBU1RfRVZFTlRfSURfSEVBREVSfTwvdHQ+IGhlYWRlci4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgRGVmYXVsdHMgdG8ge0Bjb2RlIC0xfSBpZiBub3Qgc2V0LgorICAgICAqIEByZXR1cm4gbmV3IFNTRSBldmVudCBvdXRwdXQgc3RyZWFtIHJlcHJlc2VudGluZyB0aGUgKHJlLSllc3RhYmxpc2hlZCBTU0UgY2xpZW50IGNvbm5lY3Rpb24uCisgICAgICogQHRocm93cyBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uIGluIGNhc2UgcmVwbGF5aW5nIG1pc3NlZCBldmVudHMgdG8gdGhlIHJlY29ubmVjdGVkIG91dHB1dCBzdHJlYW0gZmFpbHMuCisgICAgICogQHRocm93cyBTZXJ2aWNlVW5hdmFpbGFibGVFeGNlcHRpb24gIGluIGNhc2UgdGhlIHJlY29ubmVjdCBkZWxheSBpcyBzZXQgdG8gYSBwb3NpdGl2ZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBAR0VUCisgICAgQFBhdGgoImV2ZW50cyIpCisgICAgQFByb2R1Y2VzKFNzZUZlYXR1cmUuU0VSVkVSX1NFTlRfRVZFTlRTKQorICAgIHB1YmxpYyBFdmVudE91dHB1dCBpdGVtRXZlbnRzKAorICAgICAgICAgICAgQEhlYWRlclBhcmFtKFNzZUZlYXR1cmUuTEFTVF9FVkVOVF9JRF9IRUFERVIpIEBEZWZhdWx0VmFsdWUoIi0xIikgaW50IGxhc3RFdmVudElkKSB7CisgICAgICAgIGZpbmFsIEV2ZW50T3V0cHV0IGV2ZW50T3V0cHV0ID0gbmV3IEV2ZW50T3V0cHV0KCk7CisKKyAgICAgICAgaWYgKGxhc3RFdmVudElkID49IDApIHsKKyAgICAgICAgICAgIExPR0dFUi5pbmZvKCJSZWNlaXZlZCBsYXN0IGV2ZW50IGlkIDoiICsgbGFzdEV2ZW50SWQpOworCisgICAgICAgICAgICAvLyBkZWNpZGUgdGhlIHJlY29ubmVjdCBoYW5kbGluZyBzdHJhdGVneSBiYXNlZCBvbiBjdXJyZW50IHJlY29ubmVjdCBkZWxheSB2YWx1ZS4KKyAgICAgICAgICAgIGZpbmFsIGxvbmcgZGVsYXkgPSByZWNvbm5lY3REZWxheTsKKyAgICAgICAgICAgIGlmIChkZWxheSA+IDApIHsKKyAgICAgICAgICAgICAgICBMT0dHRVIuaW5mbygiTm9uLXplcm8gcmVjb25uZWN0IGRlbGF5IFsiICsgZGVsYXkgKyAiXSAtIHJlc3BvbmRpbmcgd2l0aCBIVFRQIDUwMy4iKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uKGRlbGF5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmluZm8oIlplcm8gcmVjb25uZWN0IGRlbGF5IC0gcmVjb25uZWN0aW5nLiIpOworICAgICAgICAgICAgICAgIHJlcGxheU1pc3NlZEV2ZW50cyhsYXN0RXZlbnRJZCwgZXZlbnRPdXRwdXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFicm9hZGNhc3Rlci5hZGQoZXZlbnRPdXRwdXQpKSB7CisgICAgICAgICAgICBMT0dHRVIuc2V2ZXJlKCIhISEgVW5hYmxlIHRvIGFkZCBuZXcgZXZlbnQgb3V0cHV0IHRvIHRoZSBicm9hZGNhc3RlciAhISEiKTsKKyAgICAgICAgICAgIC8vIGxldCdzIHRyeSB0byBmb3JjZSBhIDVzIGRlbGF5ZWQgY2xpZW50IHJlY29ubmVjdCBhdHRlbXB0CisgICAgICAgICAgICB0aHJvdyBuZXcgU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uKDVMKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBldmVudE91dHB1dDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcmVwbGF5TWlzc2VkRXZlbnRzKGZpbmFsIGludCBsYXN0RXZlbnRJZCwgZmluYWwgRXZlbnRPdXRwdXQgZXZlbnRPdXRwdXQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN0b3JlTG9jay5yZWFkTG9jaygpLmxvY2soKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBmaXJzdFVucmVjZWl2ZWQgPSBsYXN0RXZlbnRJZCArIDE7CisgICAgICAgICAgICBmaW5hbCBpbnQgbWlzc2luZ0NvdW50ID0gaXRlbVN0b3JlLnNpemUoKSAtIGZpcnN0VW5yZWNlaXZlZDsKKyAgICAgICAgICAgIGlmIChtaXNzaW5nQ291bnQgPiAwKSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmluZm8oIlJlcGxheWluZyBldmVudHMgLSBzdGFydGluZyB3aXRoIGlkICIgKyBmaXJzdFVucmVjZWl2ZWQpOworICAgICAgICAgICAgICAgIGZpbmFsIExpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ID0gaXRlbVN0b3JlLnN1Ykxpc3QoZmlyc3RVbnJlY2VpdmVkLCBpdGVtU3RvcmUuc2l6ZSgpKS5saXN0SXRlcmF0b3IoKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGV2ZW50T3V0cHV0LndyaXRlKGNyZWF0ZUl0ZW1FdmVudChpdC5uZXh0SW5kZXgoKSArIGZpcnN0VW5yZWNlaXZlZCwgaXQubmV4dCgpKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0dHRVIuaW5mbygiTm8gZXZlbnRzIHRvIHJlcGxheS4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uKCJFcnJvciByZXBsYXlpbmcgbWlzc2VkIGV2ZW50cyIsIGV4KTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHN0b3JlTG9jay5yZWFkTG9jaygpLnVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIG5ldyBpdGVtIHRvIHRoZSBpdGVtIHN0b3JlLgorICAgICAqCisgICAgICogSW52b2tpbmcgdGhpcyBtZXRob2Qgd2lsbCBmaXJlIDIgbmV3IFNTRSBldmVudHMgLSAxc3QgYWJvdXQgbmV3bHkgYWRkZWQgaXRlbSBhbmQgMm5kIGFib3V0IHRoZSBuZXcgaXRlbSBzdG9yZSBzaXplLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgaXRlbSBuYW1lLgorICAgICAqLworICAgIEBQT1NUCisgICAgcHVibGljIHZvaWQgYWRkSXRlbShARm9ybVBhcmFtKCJuYW1lIikgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgLy8gSWdub3JlIGlmIHRoZSByZXF1ZXN0IHdhcyBzZW50IHdpdGhvdXQgbmFtZSBwYXJhbWV0ZXIuCisgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGludCBldmVudElkOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3RvcmVMb2NrLndyaXRlTG9jaygpLmxvY2soKTsKKyAgICAgICAgICAgIGV2ZW50SWQgPSBpdGVtU3RvcmUuc2l6ZSgpOworICAgICAgICAgICAgaXRlbVN0b3JlLmFkZChuYW1lKTsKKyAgICAgICAgICAgIC8vIEJyb2FkY2FzdGluZyBhbiB1bi1uYW1lZCBldmVudCB3aXRoIHRoZSBuYW1lIG9mIHRoZSBuZXdseSBhZGRlZCBpdGVtIGluIGRhdGEKKyAgICAgICAgICAgIGJyb2FkY2FzdGVyLmJyb2FkY2FzdChjcmVhdGVJdGVtRXZlbnQoZXZlbnRJZCwgbmFtZSkpOworICAgICAgICAgICAgLy8gQnJvYWRjYXN0aW5nIGEgbmFtZWQgInNpemUiIGV2ZW50IHdpdGggdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgaXRlbXMgY29sbGVjdGlvbiBpbiBkYXRhCisgICAgICAgICAgICBicm9hZGNhc3Rlci5icm9hZGNhc3QobmV3IE91dGJvdW5kRXZlbnQuQnVpbGRlcigpLm5hbWUoInNpemUiKS5kYXRhKEludGVnZXIuY2xhc3MsIGV2ZW50SWQgKyAxKS5idWlsZCgpKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHN0b3JlTG9jay53cml0ZUxvY2soKS51bmxvY2soKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgT3V0Ym91bmRFdmVudCBjcmVhdGVJdGVtRXZlbnQoZmluYWwgaW50IGV2ZW50SWQsIGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoSXRlbVN0b3JlUmVzb3VyY2UuY2xhc3MuZ2V0TmFtZSgpKS5pbmZvKCJDcmVhdGluZyBldmVudCBpZCBbIiArIGV2ZW50SWQgKyAiXSBuYW1lIFsiICsgbmFtZSArICJdIik7CisgICAgICAgIHJldHVybiBuZXcgT3V0Ym91bmRFdmVudC5CdWlsZGVyKCkuaWQoIiIgKyBldmVudElkKS5kYXRhKFN0cmluZy5jbGFzcywgbmFtZSkuYnVpbGQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9zc2UtaXRlbS1zdG9yZS1qZXJzZXktd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9jc3MvbWFpbi5jc3MgYi9leGFtcGxlcy9zc2UtaXRlbS1zdG9yZS1qZXJzZXktd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9jc3MvbWFpbi5jc3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkwN2MyYwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3NzZS1pdGVtLXN0b3JlLWplcnNleS13ZWJhcHAvc3JjL21haW4vd2ViYXBwL2Nzcy9tYWluLmNzcwpAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitkaXYubWVzc2FnZSB7CisgICAgYm9yZGVyLXJhZGl1czogMTBweDsKKyAgICBib3JkZXI6IHRoaW4gc29saWQgIzQ0NDQ0NDsKKyAgICBtYXJnaW46IDEwcHg7CisgICAgd2lkdGg6IDMwMHB4OworICAgIHBhZGRpbmc6IDEwcHg7CisgICAgYm94LXNoYWRvdzogNXB4IDVweCA1cHggIzg4ODg4ODsKKyAgICBmb250LWZhbWlseTogSGVsdmV0aWNhLCBzZXJpZjsKKyAgICBjb2xvcjogIzMzMzMzMzsKK30KKworZGl2Lml0ZW1zIHsKKyAgICBib3JkZXItcmFkaXVzOiAxMHB4OworICAgIGJvcmRlcjogdGhpbiBkb3R0ZWQgI0FBQUFGRjsKKyAgICBtYXJnaW46IDEwcHg7CisgICAgcGFkZGluZzogMTBweDsKKyAgICBmb250LWZhbWlseTogSGVsdmV0aWNhLCBzZXJpZjsKKyAgICBjb2xvcjogIzQ0NDRGRjsKK30KKworZGl2Lm1lc3NhZ3MgeworICAgIGJvcmRlci1yYWRpdXM6IDEwcHg7CisgICAgYm9yZGVyOiB0aGluIGRvdHRlZCAjODg4ODg4OworICAgIG1hcmdpbjogMTBweDsKKyAgICBwYWRkaW5nOiAxMHB4OworfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc3NlLWl0ZW0tc3RvcmUtamVyc2V5LXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvaW5kZXguaHRtbCBiL2V4YW1wbGVzL3NzZS1pdGVtLXN0b3JlLWplcnNleS13ZWJhcHAvc3JjL21haW4vd2ViYXBwL2luZGV4Lmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJkOThiZQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3NzZS1pdGVtLXN0b3JlLWplcnNleS13ZWJhcHAvc3JjL21haW4vd2ViYXBwL2luZGV4Lmh0bWwKQEAgLTAsMCArMSwyNyBAQAorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorPGh0bWw+Cis8aGVhZD4KKyAgICA8dGl0bGU+SmVyc2V5IFNTRSBJdGVtIFN0b3JlIEV4YW1wbGU8L3RpdGxlPgorICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iY3NzL21haW4uY3NzIi8+CisgICAgPHNjcmlwdCBzcmM9ImpzL2VuZ2luZS5qcyIgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48L3NjcmlwdD4KKzwvaGVhZD4KKzxib2R5PgorPGRpdj4KKyAgICBFbnRlciBpdGVtOiA8aW5wdXQgaWQ9Im5hbWUiIHR5cGU9InRleHQiLz48aW5wdXQgdmFsdWU9IkFkZCIgdHlwZT0iYnV0dG9uIiBvbmNsaWNrPSJhZGRJdGVtKCkiLz4KKzwvZGl2PgorPGRpdiBpZD0iaXRlbXMiIGNsYXNzPSJpdGVtcyI+PC9kaXY+Cis8ZGl2IGlkPSJtZXNzYWdlcyIgY2xhc3M9Im1lc3NhZ2VzIj48L2Rpdj4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3NzZS1pdGVtLXN0b3JlLWplcnNleS13ZWJhcHAvc3JjL21haW4vd2ViYXBwL2pzL2VuZ2luZS5qcyBiL2V4YW1wbGVzL3NzZS1pdGVtLXN0b3JlLWplcnNleS13ZWJhcHAvc3JjL21haW4vd2ViYXBwL2pzL2VuZ2luZS5qcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDE3NzZkCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvc3NlLWl0ZW0tc3RvcmUtamVyc2V5LXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvanMvZW5naW5lLmpzCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKKyJ1c2Ugc3RyaWN0IjsKKworZnVuY3Rpb24gYWRkSXRlbSgpIHsKKyAgICB2YXIgaXRlbUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm5hbWUiKTsKKworICAgIHZhciByZXEgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKKyAgICByZXEub3BlbigiUE9TVCIsICJyZXNvdXJjZXMvaXRlbXMiLCB0cnVlKTsKKyAgICByZXEuc2V0UmVxdWVzdEhlYWRlcigiQ29udGVudC1UeXBlIiwgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpOworICAgIHJlcS5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbiAoKSB7CisgICAgICAgIGlmIChyZXEucmVhZHlTdGF0ZSA9PSA0ICYmIHJlcS5zdGF0dXMgPT0gMjA0KSB7CisgICAgICAgICAgICAvL0NhbGwgYSBmdW5jdGlvbiB3aGVuIHRoZSBzdGF0ZSBjaGFuZ2VzLgorICAgICAgICAgICAgaXRlbUlucHV0LnZhbHVlID0gIiI7CisgICAgICAgICAgICBnZXRJdGVtcygpOworICAgICAgICB9CisgICAgfTsKKyAgICByZXEuc2VuZCgibmFtZT0iICsgaXRlbUlucHV0LnZhbHVlKTsKK30KKworZnVuY3Rpb24gZ2V0SXRlbXMoKSB7CisgICAgdmFyIHJlcSA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOworICAgIHJlcS5vcGVuKCJHRVQiLCAicmVzb3VyY2VzL2l0ZW1zIiwgdHJ1ZSk7CisgICAgcmVxLnNldFJlcXVlc3RIZWFkZXIoIkFjY2VwdCIsICJ0ZXh0L3BsYWluIik7CisgICAgcmVxLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uICgpIHsKKyAgICAgICAgLy9DYWxsIGEgZnVuY3Rpb24gd2hlbiB0aGUgc3RhdGUgY2hhbmdlcy4KKyAgICAgICAgaWYgKHJlcS5yZWFkeVN0YXRlID09IDQgJiYgcmVxLnN0YXR1cyA9PSAyMDApIHsKKyAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJpdGVtcyIpLmlubmVySFRNTCA9IHJlcS5yZXNwb25zZVRleHQ7CisgICAgICAgIH0KKyAgICB9OworICAgIHJlcS5zZW5kKCk7Cit9CisKK2Z1bmN0aW9uIGRpc3BsYXkoZGF0YSwgcmdiKSB7CisgICAgdmFyIG1zZ1NwYW4gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7CisgICAgbXNnU3Bhbi5zdHlsZS5jb2xvciA9IHJnYjsKKyAgICBtc2dTcGFuLmlubmVySFRNTCA9IGRhdGE7CisgICAgdmFyIG1zZ0RpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOworICAgIG1zZ0Rpdi5jbGFzc05hbWUgPSAibWVzc2FnZSI7CisgICAgbXNnRGl2LmFwcGVuZENoaWxkKG1zZ1NwYW4pOworCisgICAgdmFyIG1lc3NhZ2VzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1lc3NhZ2VzIik7CisgICAgbWVzc2FnZXMuaW5zZXJ0QmVmb3JlKG1zZ0RpdiwgbWVzc2FnZXMuZmlyc3RDaGlsZCk7Cit9CisKK2Z1bmN0aW9uIHJlY2VpdmVNZXNzYWdlcygpIHsKKyAgICBpZiAodHlwZW9mKEV2ZW50U291cmNlKSAhPT0gInVuZGVmaW5lZCIpIHsKKyAgICAgICAgLy8gWWVzISBTZXJ2ZXItc2VudCBldmVudHMgc3VwcG9ydCEKKyAgICAgICAgdmFyIHNvdXJjZSA9IG5ldyBFdmVudFNvdXJjZSgicmVzb3VyY2VzL2l0ZW1zL2V2ZW50cyIpOworICAgICAgICBzb3VyY2Uub25tZXNzYWdlID0gZnVuY3Rpb24gKGV2ZW50KSB7CisgICAgICAgICAgICBjb25zb2xlLmxvZygnUmVjZWl2ZWQgdW5uYW1lZCBldmVudDogJyArIGV2ZW50LmRhdGEpOworICAgICAgICAgICAgZGlzcGxheSgiQWRkZWQgbmV3IGl0ZW06ICIgKyBldmVudC5kYXRhLCAiIzQ0NDQ0NCIpOworICAgICAgICB9OworCisgICAgICAgIHNvdXJjZS5hZGRFdmVudExpc3RlbmVyKCJzaXplIiwgZnVuY3Rpb24oZSkgeworICAgICAgICAgICAgY29uc29sZS5sb2coJ1JlY2VpdmVkIGV2ZW50ICcgKyBldmVudC5uYW1lICsgJzogJyArIGV2ZW50LmRhdGEpOworICAgICAgICAgICAgZGlzcGxheSgiTmV3IGl0ZW1zIHNpemU6ICIgKyBldmVudC5kYXRhLCAiIzAwMDBGRiIpOworICAgICAgICB9LCBmYWxzZSk7CisKKyAgICAgICAgc291cmNlLm9ub3BlbiA9IGZ1bmN0aW9uIChldmVudCkgeworICAgICAgICAgICAgY29uc29sZS5sb2coImV2ZW50IHNvdXJjZSBvcGVuZWQiKTsKKyAgICAgICAgfTsKKworICAgICAgICBzb3VyY2Uub25lcnJvciA9IGZ1bmN0aW9uIChldmVudCkgeworICAgICAgICAgICAgY29uc29sZS5sb2coJ1JlY2VpdmVkIGVycm9yIGV2ZW50OiAnICsgZXZlbnQuZGF0YSk7CisgICAgICAgICAgICBkaXNwbGF5KGV2ZW50LmRhdGEsICIjRkYwMDAwIik7CisgICAgICAgIH07CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gU29ycnkhIE5vIHNlcnZlci1zZW50IGV2ZW50cyBzdXBwb3J0Li4KKyAgICAgICAgZGlzcGxheSgnU1NFIG5vdCBzdXBwb3J0ZWQgYnkgYnJvd3Nlci4nLCAiI0ZGMDAwMCIpOworICAgIH0KK30KKword2luZG93Lm9ubG9hZCA9IHJlY2VpdmVNZXNzYWdlczsKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3NzZS1pdGVtLXN0b3JlLWplcnNleS13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9zc2VpdGVtc3RvcmUvamVyc2V5L0plcnNleUl0ZW1TdG9yZVJlc291cmNlVGVzdC5qYXZhIGIvZXhhbXBsZXMvc3NlLWl0ZW0tc3RvcmUtamVyc2V5LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3NzZWl0ZW1zdG9yZS9qZXJzZXkvSmVyc2V5SXRlbVN0b3JlUmVzb3VyY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDEyMmEzZAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3NzZS1pdGVtLXN0b3JlLWplcnNleS13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9zc2VpdGVtc3RvcmUvamVyc2V5L0plcnNleUl0ZW1TdG9yZVJlc291cmNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjg1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnNzZWl0ZW1zdG9yZS5qZXJzZXk7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudExpbmtlZFF1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRm9ybTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmFwYWNoZS5jb25uZWN0b3IuQXBhY2hlQ2xpZW50UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5hcGFjaGUuY29ubmVjdG9yLkFwYWNoZUNvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLkV2ZW50U291cmNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5Tc2VGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuaW1wbC5jb25uLlBvb2xpbmdIdHRwQ2xpZW50Q29ubmVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5jb250YWluc1N0cmluZzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5kZXNjcmliZWRBczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmhhc0l0ZW1zOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogSXRlbSBzdG9yZSB0ZXN0LgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXlJdGVtU3RvcmVSZXNvdXJjZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEplcnNleUl0ZW1TdG9yZVJlc291cmNlVGVzdC5jbGFzcy5nZXROYW1lKCkpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfTElTVEVORVJTID0gNTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0lURU1TID0gMTA7CisKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgSXRlbVN0b3JlQXBwKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgLy8gdXNpbmcgQUhDIGFzIGEgdGVzdCBjbGllbnQgY29ubmVjdG9yIHRvIGF2b2lkIGlzc3VlcyB3aXRoIEh0dHBVcmxDb25uZWN0aW9uIHNvY2tldCBtYW5hZ2VtZW50LgorICAgICAgICBQb29saW5nSHR0cENsaWVudENvbm5lY3Rpb25NYW5hZ2VyIGNtID0gbmV3IFBvb2xpbmdIdHRwQ2xpZW50Q29ubmVjdGlvbk1hbmFnZXIoKTsKKworICAgICAgICAvLyBhZGp1c3RpbmcgbWF4LiBjb25uZWN0aW9ucyBqdXN0IHRvIGJlIHNhZmUgLSB0aGUgdGVzdEV2ZW50U291cmNlUmVjb25uZWN0IGlzIHF1aXRlIGdyZWVkeS4uLgorICAgICAgICBjbS5zZXRNYXhUb3RhbChNQVhfTElTVEVORVJTICogTUFYX0lURU1TKTsKKyAgICAgICAgY20uc2V0RGVmYXVsdE1heFBlclJvdXRlKE1BWF9MSVNURU5FUlMgKiBNQVhfSVRFTVMpOworCisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihTc2VGZWF0dXJlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShBcGFjaGVDbGllbnRQcm9wZXJ0aWVzLkNPTk5FQ1RJT05fTUFOQUdFUiwgY20pCisgICAgICAgICAgICAgICAgLnByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuUkVBRF9USU1FT1VULCAyMDAwKQorICAgICAgICAgICAgICAgIC5jb25uZWN0b3JQcm92aWRlcihuZXcgQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFVSSSBnZXRCYXNlVXJpKCkgeworICAgICAgICBmaW5hbCBVcmlCdWlsZGVyIGJhc2VVcmlCdWlsZGVyID0gVXJpQnVpbGRlci5mcm9tVXJpKHN1cGVyLmdldEJhc2VVcmkoKSkucGF0aCgic3NlLWl0ZW0tc3RvcmUtamVyc2V5LXdlYmFwcCIpOworICAgICAgICBmaW5hbCBib29sZWFuIGV4dGVybmFsRmFjdG9yeUluVXNlID0gZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSBpbnN0YW5jZW9mIEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CisgICAgICAgIHJldHVybiBleHRlcm5hbEZhY3RvcnlJblVzZSA/IGJhc2VVcmlCdWlsZGVyLnBhdGgoInJlc291cmNlcyIpLmJ1aWxkKCkgOiBiYXNlVXJpQnVpbGRlci5idWlsZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhlIGl0ZW0gYWRkaXRpb24sIGFkZGl0aW9uIGV2ZW50IGJyb2FkY2FzdGluZyBhbmQgaXRlbSByZXRyaWV2YWwgZnJvbSB7QGxpbmsgSXRlbVN0b3JlUmVzb3VyY2V9LgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRlc3QgZmFpbHVyZS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJdGVtc1N0b3JlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBpdGVtcyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdCgKKyAgICAgICAgICAgICAgICAiZm9vIiwKKyAgICAgICAgICAgICAgICAiYmFyIiwKKyAgICAgICAgICAgICAgICAiYmF6IikpOworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgaXRlbXNUYXJnZXQgPSB0YXJnZXQoIml0ZW1zIik7CisgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKGl0ZW1zLnNpemUoKSAqIE1BWF9MSVNURU5FUlMgKiAyKTsgLy8gY291bnRkb3duIG9uIGFsbCBldmVudHMKKyAgICAgICAgZmluYWwgTGlzdDxRdWV1ZTxJbnRlZ2VyPj4gaW5kZXhRdWV1ZXMgPSBuZXcgQXJyYXlMaXN0PD4oTUFYX0xJU1RFTkVSUyk7CisgICAgICAgIGZpbmFsIEV2ZW50U291cmNlW10gc291cmNlcyA9IG5ldyBFdmVudFNvdXJjZVtNQVhfTElTVEVORVJTXTsKKyAgICAgICAgZmluYWwgQXRvbWljSW50ZWdlciBzaXplRXZlbnRzQ291bnQgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9MSVNURU5FUlM7IGkrKykgeworICAgICAgICAgICAgZmluYWwgaW50IGlkID0gaTsKKyAgICAgICAgICAgIGZpbmFsIEV2ZW50U291cmNlIGVzID0gRXZlbnRTb3VyY2UudGFyZ2V0KGl0ZW1zVGFyZ2V0LnBhdGgoImV2ZW50cyIpKQorICAgICAgICAgICAgICAgICAgICAubmFtZWQoIlNPVVJDRSAiICsgaWQpLmJ1aWxkKCk7CisgICAgICAgICAgICBzb3VyY2VzW2lkXSA9IGVzOworCisgICAgICAgICAgICBmaW5hbCBRdWV1ZTxJbnRlZ2VyPiBpbmRleGVzID0gbmV3IENvbmN1cnJlbnRMaW5rZWRRdWV1ZTw+KCk7CisgICAgICAgICAgICBpbmRleFF1ZXVlcy5hZGQoaW5kZXhlcyk7CisKKyAgICAgICAgICAgIGVzLnJlZ2lzdGVyKGluYm91bmRFdmVudCAtPiB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluYm91bmRFdmVudC5nZXROYW1lKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRhdGEgPSBpbmJvdW5kRXZlbnQucmVhZERhdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi5pbmZvKCJbLWktXSBTT1VSQ0UgIiArIGlkICsgIjogUmVjZWl2ZWQgZXZlbnQgaWQ9IiArIGluYm91bmRFdmVudC5nZXRJZCgpICsgIiBkYXRhPSIgKyBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ZXMuYWRkKGl0ZW1zLmluZGV4T2YoZGF0YSkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJzaXplIi5lcXVhbHMoaW5ib3VuZEV2ZW50LmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVFdmVudHNDb3VudC5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLlNFVkVSRSwgIlsteC1dIFNPVVJDRSAiICsgaWQgKyAiOiBFcnJvciBnZXR0aW5nIGV2ZW50IGRhdGEuIiwgZXgpOworICAgICAgICAgICAgICAgICAgICBpbmRleGVzLmFkZCgtOTk5KTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvcGVuKHNvdXJjZXMpOworCisgICAgICAgICAgICBmb3IgKFN0cmluZyBpdGVtIDogaXRlbXMpIHsKKyAgICAgICAgICAgICAgICBwb3N0SXRlbShpdGVtc1RhcmdldCwgaXRlbSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFzc2VydFRydWUoIldhaXRpbmcgdG8gcmVjZWl2ZSBhbGwgZXZlbnRzIGhhcyB0aW1lZCBvdXQuIiwKKyAgICAgICAgICAgICAgICAgICAgbGF0Y2guYXdhaXQoKDEwMDAgKyBNQVhfTElTVEVORVJTICogRXZlbnRTb3VyY2UuUkVDT05ORUNUX0RFRkFVTFQpICogZ2V0QXN5bmNUaW1lb3V0TXVsdGlwbGllcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworCisgICAgICAgICAgICAvLyBuZWVkIHRvIGZvcmNlIGRpc2Nvbm5lY3Qgb24gc2VydmVyIGluIG9yZGVyIGZvciBFdmVudFNvdXJjZS5jbG9zZSguLi4pIHRvIHN1Y2NlZWQgd2l0aCBIdHRwVXJsQ29ubmVjdGlvbgorICAgICAgICAgICAgc2VuZENvbW1hbmQoaXRlbXNUYXJnZXQsICJkaXNjb25uZWN0Iik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBjbG9zZShzb3VyY2VzKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBwb3N0ZWRJdGVtcyA9IGl0ZW1zVGFyZ2V0LnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgZm9yIChTdHJpbmcgaXRlbSA6IGl0ZW1zKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJJdGVtICciICsgaXRlbSArICInIG5vdCBzdG9yZWQgb24gc2VydmVyLiIsIHBvc3RlZEl0ZW1zLmNvbnRhaW5zKGl0ZW0pKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBxdWV1ZUlkID0gMDsKKyAgICAgICAgZm9yIChRdWV1ZTxJbnRlZ2VyPiBpbmRleGVzIDogaW5kZXhRdWV1ZXMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJFdmVudCBmb3IgJyIgKyBpdGVtcy5nZXQoaSkgKyAiJyBub3QgcmVjZWl2ZWQgaW4gcXVldWUgIiArIHF1ZXVlSWQsIGluZGV4ZXMuY29udGFpbnMoaSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJOb3QgcmVjZWl2ZWQgdGhlIGV4cGVjdGVkIG51bWJlciBvZiBldmVudHMgaW4gcXVldWUgIiArIHF1ZXVlSWQsIGl0ZW1zLnNpemUoKSwgaW5kZXhlcy5zaXplKCkpOworICAgICAgICAgICAgcXVldWVJZCsrOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJOdW1iZXIgb2YgcmVjZWl2ZWQgJ3NpemUnIGV2ZW50cyBkb2VzIG5vdCBtYXRjaC4iLCBpdGVtcy5zaXplKCkgKiBNQVhfTElTVEVORVJTLCBzaXplRXZlbnRzQ291bnQuZ2V0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhlIHtAbGluayBFdmVudFNvdXJjZX0gcmVjb25uZWN0IGZlYXR1cmUuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGVzdCBmYWlsdXJlLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEV2ZW50U291cmNlUmVjb25uZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCBpdGVtc1RhcmdldCA9IHRhcmdldCgiaXRlbXMiKTsKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goTUFYX0lURU1TICogTUFYX0xJU1RFTkVSUyAqIDIpOyAvLyBjb3VudGRvd24gb25seSBvbiBuZXcgaXRlbSBldmVudHMKKyAgICAgICAgZmluYWwgTGlzdDxRdWV1ZTxTdHJpbmc+PiByZWNlaXZlZFF1ZXVlcyA9IG5ldyBBcnJheUxpc3Q8PihNQVhfTElTVEVORVJTKTsKKyAgICAgICAgZmluYWwgRXZlbnRTb3VyY2VbXSBzb3VyY2VzID0gbmV3IEV2ZW50U291cmNlW01BWF9MSVNURU5FUlNdOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0xJU1RFTkVSUzsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBpbnQgaWQgPSBpOworICAgICAgICAgICAgZmluYWwgRXZlbnRTb3VyY2UgZXMgPSBFdmVudFNvdXJjZS50YXJnZXQoaXRlbXNUYXJnZXQucGF0aCgiZXZlbnRzIikpLm5hbWVkKCJTT1VSQ0UgIiArIGlkKS5idWlsZCgpOworICAgICAgICAgICAgc291cmNlc1tpZF0gPSBlczsKKworICAgICAgICAgICAgZmluYWwgUXVldWU8U3RyaW5nPiByZWNlaXZlZCA9IG5ldyBDb25jdXJyZW50TGlua2VkUXVldWU8PigpOworICAgICAgICAgICAgcmVjZWl2ZWRRdWV1ZXMuYWRkKHJlY2VpdmVkKTsKKworICAgICAgICAgICAgZXMucmVnaXN0ZXIoaW5ib3VuZEV2ZW50IC0+IHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW5ib3VuZEV2ZW50LmdldE5hbWUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBkYXRhID0gaW5ib3VuZEV2ZW50LnJlYWREYXRhKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dHRVIuaW5mbygiWy1pLV0gU09VUkNFICIgKyBpZCArICI6IFJlY2VpdmVkIGV2ZW50IGlkPSIgKyBpbmJvdW5kRXZlbnQuZ2V0SWQoKSArICIgZGF0YT0iICsgZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlZC5hZGQoZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5TRVZFUkUsICJbLXgtXSBTT1VSQ0UgIiArIGlkICsgIjogRXJyb3IgZ2V0dGluZyBldmVudCBkYXRhLiIsIGV4KTsKKyAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWQuYWRkKCJbZGF0YSBwcm9jZXNzaW5nIGVycm9yXSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgU3RyaW5nW10gcG9zdGVkSXRlbXMgPSBuZXcgU3RyaW5nW01BWF9JVEVNUyAqIDJdOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb3Blbihzb3VyY2VzKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfSVRFTVM7IGkrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpdGVtID0gU3RyaW5nLmZvcm1hdCgicm91bmQtMS0lMDJkIiwgaSk7CisgICAgICAgICAgICAgICAgcG9zdEl0ZW0oaXRlbXNUYXJnZXQsIGl0ZW0pOworICAgICAgICAgICAgICAgIHBvc3RlZEl0ZW1zW2ldID0gaXRlbTsKKyAgICAgICAgICAgICAgICBzZW5kQ29tbWFuZChpdGVtc1RhcmdldCwgImRpc2Nvbm5lY3QiKTsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgaW50IHJlY29ubmVjdERlbGF5ID0gMTsKKyAgICAgICAgICAgIHNlbmRDb21tYW5kKGl0ZW1zVGFyZ2V0LCAicmVjb25uZWN0ICIgKyByZWNvbm5lY3REZWxheSk7CisgICAgICAgICAgICBzZW5kQ29tbWFuZChpdGVtc1RhcmdldCwgImRpc2Nvbm5lY3QiKTsKKworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKHJlY29ubmVjdERlbGF5ICogMTAwMCk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0lURU1TOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaXRlbSA9IFN0cmluZy5mb3JtYXQoInJvdW5kLTItJTAyZCIsIGkpOworICAgICAgICAgICAgICAgIHBvc3RlZEl0ZW1zW2kgKyBNQVhfSVRFTVNdID0gaXRlbTsKKyAgICAgICAgICAgICAgICBwb3N0SXRlbShpdGVtc1RhcmdldCwgaXRlbSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNlbmRDb21tYW5kKGl0ZW1zVGFyZ2V0LCAicmVjb25uZWN0IG5vdyIpOworCisgICAgICAgICAgICBhc3NlcnRUcnVlKCJXYWl0aW5nIHRvIHJlY2VpdmUgYWxsIGV2ZW50cyBoYXMgdGltZWQgb3V0LiIsCisgICAgICAgICAgICAgICAgICAgIGxhdGNoLmF3YWl0KCgxICsgTUFYX0xJU1RFTkVSUyAqIChNQVhfSVRFTVMgKyAxKSAqIHJlY29ubmVjdERlbGF5KSAqIGdldEFzeW5jVGltZW91dE11bHRpcGxpZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdC5TRUNPTkRTKSk7CisKKyAgICAgICAgICAgIC8vIG5lZWQgdG8gZm9yY2UgZGlzY29ubmVjdCBvbiBzZXJ2ZXIgaW4gb3JkZXIgZm9yIEV2ZW50U291cmNlLmNsb3NlKC4uLikgdG8gc3VjY2VlZCB3aXRoIEh0dHBVcmxDb25uZWN0aW9uCisgICAgICAgICAgICBzZW5kQ29tbWFuZChpdGVtc1RhcmdldCwgImRpc2Nvbm5lY3QiKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNsb3NlKHNvdXJjZXMpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHN0b3JlZEl0ZW1zID0gaXRlbXNUYXJnZXQucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBmb3IgKFN0cmluZyBpdGVtIDogcG9zdGVkSXRlbXMpIHsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoIlBvc3RlZCBpdGVtICciICsgaXRlbSArICInIHN0b3JlZCBvbiBzZXJ2ZXIiLCBzdG9yZWRJdGVtcywgY29udGFpbnNTdHJpbmcoaXRlbSkpOworICAgICAgICB9CisKKyAgICAgICAgaW50IHNvdXJjZUlkID0gMDsKKyAgICAgICAgZm9yIChRdWV1ZTxTdHJpbmc+IHF1ZXVlIDogcmVjZWl2ZWRRdWV1ZXMpIHsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoIlJlY2VpdmVkIGV2ZW50cyBpbiBzb3VyY2UgIiArIHNvdXJjZUlkLCBxdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgZGVzY3JpYmVkQXMoIkNvbGxlY3Rpb24gY29udGFpbmluZyAlMCIsIGhhc0l0ZW1zKHBvc3RlZEl0ZW1zKSwgQXJyYXlzLmFzTGlzdChwb3N0ZWRJdGVtcykudG9TdHJpbmcoKSkpOworICAgICAgICAgICAgYXNzZXJ0VGhhdCgiU2l6ZSBvZiByZWNlaXZlZCBxdWV1ZSBmb3Igc291cmNlICIgKyBzb3VyY2VJZCwgcXVldWUuc2l6ZSgpLCBlcXVhbFRvKHBvc3RlZEl0ZW1zLmxlbmd0aCkpOworICAgICAgICAgICAgc291cmNlSWQrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcG9zdEl0ZW0oZmluYWwgV2ViVGFyZ2V0IGl0ZW1zVGFyZ2V0LCBmaW5hbCBTdHJpbmcgaXRlbSkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IGl0ZW1zVGFyZ2V0LnJlcXVlc3QoKS5wb3N0KEVudGl0eS5mb3JtKG5ldyBGb3JtKCJuYW1lIiwgaXRlbSkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJQb3N0aW5nIG5ldyBpdGVtIGhhcyBmYWlsZWQuIiwgMjA0LCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIExPR0dFUi5pbmZvKCJbLWktXSBQT1NUZWQgaXRlbTogJyIgKyBpdGVtICsgIiciKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIG9wZW4oZmluYWwgRXZlbnRTb3VyY2VbXSBzb3VyY2VzKSB7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgZm9yIChFdmVudFNvdXJjZSBzb3VyY2UgOiBzb3VyY2VzKSB7CisgICAgICAgICAgICBzb3VyY2Uub3BlbigpOworICAgICAgICAgICAgTE9HR0VSLmluZm8oIlstLT5dIFNPVVJDRSAiICsgaSsrICsgIiBvcGVuZWQuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNsb3NlKGZpbmFsIEV2ZW50U291cmNlW10gc291cmNlcykgeworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIGZvciAoRXZlbnRTb3VyY2Ugc291cmNlIDogc291cmNlcykgeworICAgICAgICAgICAgaWYgKHNvdXJjZS5pc09wZW4oKSkgeworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIldhaXRpbmcgdG8gY2xvc2UgYSBzb3VyY2UgaGFzIHRpbWVkIG91dC4iLCBzb3VyY2UuY2xvc2UoMSwgVGltZVVuaXQuU0VDT05EUykpOworLy8gICAgICAgICAgICAgICAgICAgIHNvdXJjZS5jbG9zZSgxMDAsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgICAgICAgICAgTE9HR0VSLmluZm8oIls8LS1dIFNPVVJDRSAiICsgaSsrICsgIiBjbG9zZWQuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNlbmRDb21tYW5kKGZpbmFsIFdlYlRhcmdldCBpdGVtc1RhcmdldCwgZmluYWwgU3RyaW5nIGNvbW1hbmQpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSBpdGVtc1RhcmdldC5wYXRoKCJjb21tYW5kcyIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS50ZXh0KGNvbW1hbmQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCInIiArIGNvbW1hbmQgKyAiJyBjb21tYW5kIGhhcyBmYWlsZWQuIiwgMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIExPR0dFUi5pbmZvKCJbLSEtXSBDT01NQU5EICciICsgY29tbWFuZCArICInIGhhcyBiZWVuIHByb2Nlc3NlZC4iKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9zc2UtdHdpdHRlci1hZ2dyZWdhdG9yL1JFQURNRS5NRCBiL2V4YW1wbGVzL3NzZS10d2l0dGVyLWFnZ3JlZ2F0b3IvUkVBRE1FLk1ECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1Y2VjNjEKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zc2UtdHdpdHRlci1hZ2dyZWdhdG9yL1JFQURNRS5NRApAQCAtMCwwICsxLDkwIEBACitbLy9dOiAjICIgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICIKK1svL106ICMgIiAiCitbLy9dOiAjICIgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlICIKK1svL106ICMgIiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCAiCitbLy9dOiAjICIgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLiAiCitbLy9dOiAjICIgIgorWy8vXTogIyAiIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UgIgorCitNZXNzYWdlIFN0cmVhbWluZyBKZXJzZXkgRXhhbXBsZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworQW4gZXhhbXBsZSBkZW1vbnN0cmF0aW5nIGhvdyBTZXJ2ZXIgU2VudCBFdmVudHMgKFNTRSkgSmVyc2V5IHN1cHBvcnQgY2FuCitiZSB1c2VkIHRvIGNyZWF0ZSBhIG1lc3NhZ2UgYWdncmVnYXRpbmcgYW5kIHN0cmVhbWluZyByZXNvdXJjZS4gVGhlCitleGFtcGxlIGFsc28gZGVtb25zdHJhdGVzIGhvdyB0byBjb25zdW1lIGRhdGEgcHJvdmlkZWQgYnkgYSBbVHdpdHRlcgorU3RyZWFtaW5nIEFQSV0oaHR0cHM6Ly9kZXYudHdpdHRlci5jb20vZG9jcy9zdHJlYW1pbmctYXBpcykgdXNpbmcgSmVyc2V5CitgQ2h1bmtlZElucHV0YCBjbGllbnQtc2lkZSBzdXBwb3J0LgorCitDb250ZW50cworLS0tLS0tLS0KKworVGhlIGV4YW1wbGUgY29uc2lzdHMgb2YgYSBTd2luZyBHVUkgY2xpZW50IGFwcGxpY2F0aW9uIGFuZCBhIHNlcnZlci1zaWRlCithcHBsaWNhdGlvbiBkZXBsb3llZCBvbiBhIFtHcml6emx5IGNvbnRhaW5lcl0oaHR0cDovL2dyaXp6bHkuamF2YS5uZXQpLgorCitUaGUgU3dpbmcgY2xpZW50IGFwcGxpY2F0aW9uIG9wZW5zIGluIGEgc2luZ2xlIHdpbmRvdyBzcGxpdCBpbnRvCittdWx0aXBsZSBjb25maWd1cmF0aW9uIHBhbmVscy4gVGhlIHRvcC1sZWZ0IHBhbmVsIGFsbG93cyB0byBzZWxlY3Qgd2hpY2gKK2FnZ3JlZ2F0b3JzIHNob3VsZCBiZSBleGVjdXRlZC4gSXQgaXMgcG9zc2libGUgdG8gc2VsZWN0IGEgdHdpdHRlcgorbWVzc2FnZSBhZ2dyZWdhdG9yIGFuZC9vciBhIGZha2UgdGVzdCBtZXNzYWdlIGFnZ3JlZ2F0b3IuIFRoZSBwYW5lbAorYmVsb3cgcHJvdmlkZXMgbWVhbnMgZm9yIGFkZGluZyBuZXcga2V5d29yZHMgdHJhY2tlZCBieSB0aGUgVHdpdHRlcgorbWVzc2FnZSBhZ2dyZWdhdG9yIChpZiBlbmFibGVkKS4gQWxsIGFjdGl2ZWx5IHRyYWNrZWQga2V5d29yZHMgYXJlCitsaXN0ZWQgaW4gdGhlIHJpZ2h0LXNpZGUgbGlzdCBib3ggd2hpY2ggc3VwcG9ydHMgcmVtb3ZhbCBvZiB0aGUga2V5cwordXNpbmcgYSBgRGVsZXRlYCBrZXkgb24geW91ciBrZXlib2FyZC4gVGhlIGxhc3QgcGFuZWwgaW4gdGhlIFN3aW5nCitjbGllbnQgd2luZG93IGNvbnRhaW5zIGEgU3RhcnQvU3RvcCBidXR0b24gZm9yIHN0YXJ0aW5nIG9yIHN0b3BwaW5nIHRoZQorc2VsZWN0ZWQgYWdncmVnYXRvcnMgYXMgd2VsbCBhcyBhIHRleHQgYXJlYSBmb3IgZGlzcGxheWluZyB0aGUgbWVzc2FnZXMKK3RoYXQgdGhlIGFnZ3JlZ2F0b3JzIGhhdmUgc2VudCB0byB0aGUgbWVzc2FnZSBhZ2dyZWdhdGluZyByZXNvdXJjZQorZGVwbG95ZWQgb24gdGhlIHNlcnZlci1zaWRlIG9mIHRoZSBhcHBsaWNhdGlvbi4KKworVGhlIHNlcnZlciBzaWRlIHBhcnQgb2YgdGhlIGFwcGxpY2F0aW9uIGNvbnNpc3RzIG9mIGEgbWVzc2FnZQorYWdncmVnYXRpbmcgSkFYLVJTIHJlc291cmNlIGFuZCBhIHNpbXBsZSBIVE1MIHBhZ2UgdGhhdCBpbmNsdWRlcyBhCiticm93c2VyIFNTRSBjbGllbnQgd3JpdHRlbiBpbiBKYXZhc2NyaXB0IGFzIHdlbGwgYXMgYSBiYXNpYyBDU1MKK3N0eWxlc2hlZXQuIFRoZSBTU0UgSmF2YXNjcmlwdCBjbGllbnQgY29ubmVjdHMgdG8gdGhlIEpBWC1SUyBtZXNzYWdlCithZ2dyZWdhdGluZyByZXNvdXJjZSBhbmQgdHJhbnNmb3JtcyB0aGUgc3RyZWFtZWQgbWVzc2FnZSBkYXRhIGludG8gSFRNTAorY29kZSB0aGF0IGlzIHJlbmRlcmVkIGJ5IHRoZSBicm93c2VyLiBUaGUgbWFwcGluZyBvZiB0aGUgVVJJIHBhdGggc3BhY2UKK29mIHRoZSBzZXJ2ZXItc2lkZSBwYXJ0IG9mIHRoZSBhcHBsaWNhdGlvbiBpcyBwcmVzZW50ZWQgaW4gdGhlIGZvbGxvd2luZwordGFibGU6CisKK1VSSSBwYXRoICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBSZXNvdXJjZSBjbGFzcyAgICAgICAgICB8IEhUVFAgbWV0aG9kcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHwgLS0tLS0tLS0tLS0tLS0KK2AvYWdncmVnYXRvci1hcGkvbWVzc2FnZS9zdHJlYW1gICAgfCBNZXNzYWdlU3RyZWFtUmVzb3VyY2UgICB8IEdFVCwgUFVUCisKK0FwcGxpY2F0aW9uIGlzIHByb2dyYW1tYXRpY2FsbHkgY29uZmlndXJlZCB0byBydW4gb24gR3JpenpseSBjb250YWluZXIKK3VuZGVyIGJhc2UgcGF0aHMgYGFnZ3JlZ2F0b3JgIGFuZCBgYWdncmVnYXRvci1hcGlgLgorCitSdW5uaW5nIHRoZSBFeGFtcGxlCistLS0tLS0tLS0tLS0tLS0tLS0tCisKK0JlZm9yZSBydW5uaW5nIHRoZSBleGFtcGxlLCB5b3UgbmVlZCB0byBjb3B5IHRoZQorYHR3aXR0ZXItYXBpLnByb3BlcnRpZXNgIGZpbGUgYXZhaWxhYmxlIGluIHRoZSByb290IGRpcmVjdG9yeSBvZiB0aGlzCitleGFtcGxlIHRvIHlvdXIgdXNlciBob21lIGRpcmVjdG9yeS4gT25jZSBkb25lLCB5b3UgbmVlZCB0byBlZGl0IHRoZQorZmlsZSBpbiB5b3VyIHVzZXIgaG9tZSBkaXJlY3RvcnkgYW5kIHByb3ZpZGUgYSB2YWxpZCB0d2l0dGVyIGFjY291bnQKK2NyZWRlbnRpYWxzLiBUaGlzIHN0ZXAgaXMgbmVjZXNzYXJ5IGFzIHRoZSBUd2l0dGVyIHN0cmVhbWluZyBBUEkgaXMKK3Byb3RlY3RlZCB1c2luZyBIVFRQIEJhc2ljIEF1dGhlbnRpY2F0aW9uIG1lY2hhbmlzbSBhbmQgb25seSBhbgorYXV0aGVudGljYXRlZCB0d2l0dGVyIGFjY291bnQgb3duZXIgY2FuIGFjY2VzcyB0aGUgQVBJLiBUaGUKK1R3aXR0ZXJBZ2dyZWdhdG9yIGNsYXNzIGluIHRoZSBleGFtcGxlIHdpbGwgdXNlIHRoZSBjcmVkZW50aWFscyBwcm92aWRlZAoraW4gdGhlIGZpbGUgdG8gYWNjZXNzIHRoZSBUd2l0dGVyIFN0cmVhbWluZyBBUEkuCisKK09uY2UgeW91IGhhdmUgc2V0IHVwIHlvdXIgVHdpdHRlciBjcmVkZW50aWFscywgeW91J3JlIHJlYWR5IHRvIHJ1biB0aGUKK2V4YW1wbGUuIFlvdSBjYW4gcnVuIHRoZSBleGFtcGxlIGJ5IGV4ZWN1dGluZyBhIG1haW4gY2xhc3MgdmlhIG1hdmVuIGFzCitmb2xsb3dzOgorCis+ICAgICBtdm4gY2xlYW4gY29tcGlsZSBleGVjOmphdmEKKworVGhpcyBkZXBsb3lzIHRoZSBjdXJyZW50IGV4YW1wbGUgYXMgd2VsbCBhcyBpdCBzdGFydHMgdGhlIFN3aW5nIGNsaWVudAorYXBwbGljYXRpb24uIFlvdSBzaG91bGQgYmUgYWJsZSB0byBzZWUgdGhlIG1haW4gU3dpbmcgYXBwbGljYXRpb24gd2luZG93CitvcGVuIGFzIHlvdSBydW4gdGhlIGFwcGxpY2F0aW9uIGFzIHdlbGwgYXMgeW91IHNob3VsZCBzZWUgdGhlIG5vdGUgaW4KK3RoZSBjb21tYW5kIGxpbmUgc3RhdGluZyB0aGF0IHRoZSBHcml6emx5IGNvbnRhaW5lciBoYXMgc3RhcnRlZCBhbmQgdGhlCitzZXJ2ZXIgc2lkZSBwYXJ0IG9mIHRoZSBhcHBsaWNhdGlvbiBoYXMgYmVlbiBkZXBsb3llZC4KKworQWZ0ZXIgc3VjY2Vzc2Z1bCBkZXBsb3ltZW50LCB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gYWNjZXNzIHRoZSBicm93c2VyCitTU0UgY2xpZW50IHBhZ2UgYXQKKworLSAgIDxodHRwOi8vbG9jYWxob3N0OjgwODAvYWdncmVnYXRvci9pbmRleC5odG1sPgorCitUbyBzZWUgdGhlIHJhdyBTU0UgZXZlbnQgc3RyZWFtLCB5b3UgbWF5IGFsc28gcG9pbnQgeW91ciBicm93c2VyCitkaXJlY3RseSBhdCB0aGUKKworLSAgIFtNZXNzYWdlU3RyZWFtUmVzb3VyY2VdKGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hZ2dyZWdhdG9yLWFwaS9tZXNzYWdlL3N0cmVhbSkKKworTm90ZSB0aGF0IHlvdSBmaXJzdCBuZWVkIHRvIHN0YXJ0IHRoZSBtZXNzYWdlIGFnZ3JlZ2F0b3JzIHZpYSB0aGUgU3dpbmcKK2NsaWVudCBhcHBsaWNhdGlvbiBpbiBvcmRlciB0byBiZSBhYmxlIHRvIHJlY2VpdmUgYW55IFNTRSBldmVudHMgZnJvbQordGhlIG1lc3NhZ2Ugc3RyZWFtaW5nIHJlc291cmNlLgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc3NlLXR3aXR0ZXItYWdncmVnYXRvci9jbGllbnQuY2VydCBiL2V4YW1wbGVzL3NzZS10d2l0dGVyLWFnZ3JlZ2F0b3IvY2xpZW50LmNlcnQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQzZDg4YgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3NzZS10d2l0dGVyLWFnZ3JlZ2F0b3IvY2xpZW50LmNlcnQKQEAgLTAsMCArMSwxNyBAQAorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlESlRDQ0F1T2dBd0lCQWdJRVQ1WnlZakFMQmdjcWhrak9PQVFEQlFBd2RqRUxNQWtHQTFVRUJoTUNRMW94RnpBVkJnTlZCQWdUCitEa042WldOb0lGSmxjSFZpYkdsak1ROHdEUVlEVlFRSEV3WlFjbUZuZFdVeEd6QVpCZ05WQkFvVEVrOXlZV05zWlNCRGIzSndiM0poCitkR2x2YmpFUE1BMEdBMVVFQ3hNR1NtVnljMlY1TVE4d0RRWURWUVFERXdaRGJHbGxiblF3SGhjTk1USXdOREkwTURreU9UQTJXaGNOCitNVEl3TnpJek1Ea3lPVEEyV2pCMk1Rc3dDUVlEVlFRR0V3SkRXakVYTUJVR0ExVUVDQk1PUTNwbFkyZ2dVbVZ3ZFdKc2FXTXhEekFOCitCZ05WQkFjVEJsQnlZV2QxWlRFYk1Ca0dBMVVFQ2hNU1QzSmhZMnhsSUVOdmNuQnZjbUYwYVc5dU1ROHdEUVlEVlFRTEV3WktaWEp6CitaWGt4RHpBTkJnTlZCQU1UQmtOc2FXVnVkRENDQWJjd2dnRXNCZ2NxaGtqT09BUUJNSUlCSHdLQmdRRDlmMU9CSFhVU0tWTGZTcHd1Cis3T1RuOWhHM1VqenZSQURESGorQXRsRW1hVVZkUUNKUisxazlqVmo2djhYMXVqRDJ5NXRWYk5lQk80QWRORy95Wm1DM2E1bFFwYVNmCituK2dFZXhBaXdrKzdxZGYrdDhZYitEdFg1OGFvcGhVUEJQdUQ5dFBGSHNNQ05WUVRXaGFSTXZaMTg2NHJZZGNxNy9JaUF4bWQwVWdCCit4d0lWQUpkZ1VJOFZJd3ZNc3BLNWdxTHJoQXZ3V0J6MUFvR0JBUGZob0lYV216M2V5N3lyWERhNFY3bDVsSys3K2pycWd2bFhUQXM5CitCNEpuVVZsWGpyclVXVS9tY1FjUWdZQzBTUlp4SStoTUtCWVR0ODhKTW96SXB1RThGbnFMVkh5TktPQ2pyaDRyczZaMWtXNmpmd3Y2CitJVFZpOGZ0aWVnRWtPOHlrOGI2b1VaQ0pxSVBmNFZybG53YVNpMlplZ0h0VkpXUUJURHYrejBrcUE0R0VBQUtCZ0JtSE5BQ0RrMWF3Cit2VVpqc1JlY01TQmxra0NTcXIvY0NyWU9zTndwZmxlUUtzTTZyZE9vZnVqQU5VVmVvVUZoWDhlOEs0NUZrbnhFcUF1Z21oR1E5TlJuCit1TWVucnZWK1h1cEMwVjJ1R0gwT2NpWGVBekhiZmVJdEJDYm1KY3ZNZFBXL3ErSTJ2RmNodjYrYWpFaU5Ib2dCckNjM3F3U01oeVZRCit1ZzJmWEhtSk1Bc0dCeXFHU000NEJBTUZBQU12QURBc0FoUVl6blltSDBocmNMbmk0RXFYM092YWMrcE5KZ0lVZWhuRWFXMVY1ZGpuCitkaFlCQVlVa1N5Y0VUbDQ9CistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCmRpZmYgLS1naXQgYS9leGFtcGxlcy9zc2UtdHdpdHRlci1hZ2dyZWdhdG9yL2tleXN0b3JlX2NsaWVudCBiL2V4YW1wbGVzL3NzZS10d2l0dGVyLWFnZ3JlZ2F0b3Iva2V5c3RvcmVfY2xpZW50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMTZmZDIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zc2UtdHdpdHRlci1hZ2dyZWdhdG9yL2tleXN0b3JlX2NsaWVudApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9zc2UtdHdpdHRlci1hZ2dyZWdhdG9yL3BvbS54bWwgYi9leGFtcGxlcy9zc2UtdHdpdHRlci1hZ2dyZWdhdG9yL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE2NWQzNgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3NzZS10d2l0dGVyLWFnZ3JlZ2F0b3IvcG9tLnhtbApAQCAtMCwwICsxLDkyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+c3NlLXR3aXR0ZXItYWdncmVnYXRvcjwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS1leGFtcGxlcy1zc2UtdHdpdHRlci1hZ2dyZWdhdG9yPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPkplcnNleSBTU0UgVHdpdHRlciBNZXNzYWdlIEFnZ3JlZ2F0b3IgRXhhbXBsZS48L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1ncml6emx5Mi1odHRwPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWhrMjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8IS0tIHVuY29tbWVudCB0byB1c2UgR3JpenpseSBjbGllbnQgLS0+CisgICAgICAgIDwhLS1kZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29ubmVjdG9yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1ncml6emx5LWNvbm5lY3RvcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5LS0+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtbW94eTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLXNzZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5zd2luZ2xhYnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zd2luZy1sYXlvdXQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjAuMzwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhlYy1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxtYWluQ2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuYWdncmVnYXRvci5BcHA8L21haW5DbGFzcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnJlbGVhc2U8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc3NlLXR3aXR0ZXItYWdncmVnYXRvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2FnZ3JlZ2F0b3IvQWJzdHJhY3RUZXN0QWdncmVnYXRvci5qYXZhIGIvZXhhbXBsZXMvc3NlLXR3aXR0ZXItYWdncmVnYXRvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2FnZ3JlZ2F0b3IvQWJzdHJhY3RUZXN0QWdncmVnYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNGYxZTkKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zc2UtdHdpdHRlci1hZ2dyZWdhdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYWdncmVnYXRvci9BYnN0cmFjdFRlc3RBZ2dyZWdhdG9yLmphdmEKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuYWdncmVnYXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5SYW5kb207CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb3h5Lmpzb24uTW94eUpzb25GZWF0dXJlOworCisvKioKKyAqIEZha2UgbWVzc2FnZSBhZ2dyZWdhdG9yIHVzZWQgZm9yIHRlc3RpbmcgcHVycG9zZXMuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VGVzdEFnZ3JlZ2F0b3IgaW1wbGVtZW50cyBEYXRhQWdncmVnYXRvciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoQWJzdHJhY3RUZXN0QWdncmVnYXRvci5jbGFzcy5nZXROYW1lKCkpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE1FU1NBR0VTID0gbmV3IFN0cmluZ1tdIHsKKyAgICAgICAgICAgICJXaGVyZSBkbyB5b3VyIFJFU1RmdWwgV2ViIFNlcnZpY2VzIHdhbnQgdG8gZ28gdG9kYXk/IiwKKyAgICAgICAgICAgICJKZXJzZXkgUkVTVGZ1bCBXZWIgU2VydmljZXMgZnJhbWV3b3JrIHJvY2tzISIsCisgICAgICAgICAgICAiSmVyc2V5IGFuZCBKQVgtUlMgYXJlIGNvb2whIiwKKyAgICAgICAgICAgICJXaGF0IGFyZSB0aGUgNSBpbnNhbmUgYnV0IHRydWUgdGhpbmdzIGFib3V0IEpBWC1SUz8iLAorICAgICAgICAgICAgIldvdywgSkFYLVJTIDIuMCBwcm92aWRlcyBhc3luY2hyb25vdXMgc2VydmljZSBhbmQgY2xpZW50IEFQSXMhIiwKKyAgICAgICAgICAgICJGaW5hbGx5ISBKQVgtUlMgMi4wIGFkZHMgZmlsdGVycyBhbmQgaW50ZXJjZXB0b3JzIHN1cHBvcnQuIiwKKyAgICAgICAgICAgICJKZXJzZXkgMi4wIHByb2dyYW1tYXRpYyByZXNvdXJjZSBBUEkgbG9va3MgZ3JlYXQhIiwKKyAgICAgICAgICAgICJIb3cgY291bGQgSSBsaXZlIHdpdGhvdXQgSmVyc2V5IFJlc291cmNlQ29uZmlnIGNsYXNzPz8iLAorICAgICAgICAgICAgIkp1c3Qgd3JvdGUgbXkgZmlyc3QgSkFYLVJTIHNlcnZpY2UgdXNpbmcgSmVyc2V5LiIsCisgICAgICAgICAgICAiSmVyc2V5IGlzIHRoZSBiZXN0IFJFU1RmdWwgZnJhbWV3b3JrIGV2ZXIuIiwKKyAgICAgICAgICAgICJKQVgtUlMgcnVsZXMgdGhlIHdlYiBzZXJ2aWNlcy4iLAorICAgICAgICAgICAgIkplcnNleSAyLjAgaXMgdGhlIG5ldyBBbWVyaWNhbiBpZG9sISIKKyAgICB9OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBJTUdfVVJJCisgICAgICAgICAgICA9ICJodHRwOi8vZmlsZXMuc29mdGljb25zLmNvbS9kb3dubG9hZC9pbnRlcm5ldC1jb25zL2hhbGxvd2Vlbi1hdmF0YXJzLWljb25zLWJ5LWRlbGVrZXQvcG5nLzQ4L1Zvb2RvbyUyMERvbGwucG5nIjsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHJnYkNvbG9yOworICAgIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBydW5uaW5nOworCisgICAgQWJzdHJhY3RUZXN0QWdncmVnYXRvcihTdHJpbmcgcmdiQ29sb3IpIHsKKyAgICAgICAgdGhpcy5yZ2JDb2xvciA9IHJnYkNvbG9yOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHN0YXJ0KGZpbmFsIFN0cmluZyBrZXl3b3JkcywgZmluYWwgRGF0YUxpc3RlbmVyIG1zZ0xpc3RlbmVyKSB7CisgICAgICAgIG1zZ0xpc3RlbmVyLm9uU3RhcnQoKTsKKyAgICAgICAgcnVubmluZyA9IHRydWU7CisKKyAgICAgICAgZmluYWwgUmFuZG9tIHJuZCA9IG5ldyBSYW5kb20oKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGFnZ3JlZ2F0b3JQcmVmaXggPSBnZXRQcmVmaXgoKTsKKworICAgICAgICBFeGVjdXRvcnMubmV3U2luZ2xlVGhyZWFkRXhlY3V0b3IoKS5zdWJtaXQoKCkgLT4geworICAgICAgICAgICAgZmluYWwgQ2xpZW50IHJlc291cmNlQ2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKTsKKyAgICAgICAgICAgIHJlc291cmNlQ2xpZW50LnJlZ2lzdGVyKG5ldyBNb3h5SnNvbkZlYXR1cmUoKSk7CisgICAgICAgICAgICBmaW5hbCBXZWJUYXJnZXQgbWVzc2FnZVN0cmVhbVJlc291cmNlID0gcmVzb3VyY2VDbGllbnQudGFyZ2V0KEFwcC5nZXRBcGlVcmkoKSkucGF0aChnZXRQYXRoKCkpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHdoaWxlIChydW5uaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFnZ3JlZ2F0b3JQcmVmaXggKyAiICIgKyBNRVNTQUdFU1tybmQubmV4dEludChNRVNTQUdFUy5sZW5ndGgpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZ2JDb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTUdfVVJJKTsKKyAgICAgICAgICAgICAgICAgICAgbXNnTGlzdGVuZXIub25NZXNzYWdlKG1lc3NhZ2UpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByID0gbWVzc2FnZVN0cmVhbVJlc291cmNlLnJlcXVlc3QoKS5wdXQoRW50aXR5Lmpzb24obWVzc2FnZSkpOworICAgICAgICAgICAgICAgICAgICBpZiAoci5nZXRTdGF0dXNJbmZvKCkuZ2V0RmFtaWx5KCkgIT0gUmVzcG9uc2UuU3RhdHVzLkZhbWlseS5TVUNDRVNTRlVMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dHRVIud2FybmluZygiVW5leHBlY3RlZCBQVVQgbWVzc2FnZSByZXNwb25zZSBzdGF0dXMgY29kZTogIiArIHIuZ2V0U3RhdHVzKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChybmQubmV4dEludCgxMDAwKSArIDc1MCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1zZ0xpc3RlbmVyLm9uQ29tcGxldGUoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5XQVJOSU5HLCAiV2FpdGluZyBmb3IgYSBtZXNzYWdlIGhhcyBiZWVuIGludGVycnVwdGVkLiIsIHQpOworICAgICAgICAgICAgICAgIG1zZ0xpc3RlbmVyLm9uRXJyb3IoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgeworICAgICAgICBydW5uaW5nID0gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHJlbGF0aXZlIHBhdGggdG8gdGhlIGV2ZW50IHN0cmVhbS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldFBhdGgoKTsKKworICAgIC8qKgorICAgICAqIEdldCBtZXNzYWdlIHByZWZpeCB0byBpZGVudGlmeSB0aGUgY29uY3JldGUgYWdncmVnYXRvci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbWVzc2FnZSBwcmVmaXggKGFnZ3JlZ2F0b3IgcXVhbGlmaWVyKQorICAgICAqLworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0UHJlZml4KCk7CisKK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3NzZS10d2l0dGVyLWFnZ3JlZ2F0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9hZ2dyZWdhdG9yL0FwcC5qYXZhIGIvZXhhbXBsZXMvc3NlLXR3aXR0ZXItYWdncmVnYXRvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2FnZ3JlZ2F0b3IvQXBwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBmOTI4YQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3NzZS10d2l0dGVyLWFnZ3JlZ2F0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9hZ2dyZWdhdG9yL0FwcC5qYXZhCkBAIC0wLDAgKzEsMjQ3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmFnZ3JlZ2F0b3I7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJ1bnRpbWVEZWxlZ2F0ZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkyLmh0dHBzZXJ2ZXIuR3JpenpseUh0dHBDb250YWluZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLlNzZUZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5SZWFkZXJXcml0ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW94eS5qc29uLk1veHlKc29uRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmdyaXp6bHkuaHR0cC5zZXJ2ZXIuSHR0cEhhbmRsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5ncml6emx5Lmh0dHAuc2VydmVyLkh0dHBTZXJ2ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5ncml6emx5Lmh0dHAuc2VydmVyLk5ldHdvcmtMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmdyaXp6bHkuaHR0cC5zZXJ2ZXIuUmVxdWVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmdyaXp6bHkuaHR0cC5zZXJ2ZXIuUmVzcG9uc2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5ncml6emx5Lmh0dHAuc2VydmVyLlNlcnZlckNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5ncml6emx5Lmh0dHAudXRpbC5IdHRwU3RhdHVzOworCisvKioKKyAqIEplcnNleSBUd2l0dGVyIEFnZ3JlZ2F0b3IgZXhhbXBsZSBhcHBsaWNhdGlvbi4KKyAqLworcHVibGljIGNsYXNzIEFwcCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQcm9wZXJ0aWVzIFRXSVRURVJfUFJPUEVSVElFUyA9IGxvYWRTZXR0aW5ncygpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUV0lUVEVSX1VTRVJfTkFNRSA9ICJ0d2l0dGVyLnVzZXIubmFtZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRXSVRURVJfVVNFUl9QQVNTV09SRCA9ICJ0d2l0dGVyLnVzZXIucGFzc3dvcmQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUV0lUVEVSX1BST1BFUlRJRVNfRklMRV9OQU1FID0gInR3aXR0ZXItYXBpLnByb3BlcnRpZXMiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUF9QQVRIID0gIi9hZ2dyZWdhdG9yLyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQSV9QQVRIID0gIi9hZ2dyZWdhdG9yLWFwaS8iOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgV0VCX1JPT1QgPSAiL3dlYnJvb3QiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQT1JUID0gODA4MDsKKworICAgIC8qKgorICAgICAqIFN0YXJ0cyBHcml6emx5IEhUVFAgc2VydmVyIGV4cG9zaW5nIHN0YXRpYyBjb250ZW50LCBKQVgtUlMgcmVzb3VyY2VzCisgICAgICogYW5kIHdlYiBzb2NrZXRzIGRlZmluZWQgaW4gdGhpcyBhcHBsaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3ZWJSb290UGF0aCBzdGF0aWMgY29udGVudCByb290IHBhdGguCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzdGFydFNlcnZlcihTdHJpbmcgd2ViUm9vdFBhdGgpIHsKKyAgICAgICAgZmluYWwgSHR0cFNlcnZlciBzZXJ2ZXIgPSBuZXcgSHR0cFNlcnZlcigpOworICAgICAgICBSdW50aW1lLmdldFJ1bnRpbWUoKS5hZGRTaHV0ZG93bkhvb2sobmV3IFRocmVhZChzZXJ2ZXI6OnNodXRkb3duTm93KSk7CisKKyAgICAgICAgZmluYWwgTmV0d29ya0xpc3RlbmVyIGxpc3RlbmVyID0gbmV3IE5ldHdvcmtMaXN0ZW5lcigiZ3JpenpseSIsICJsb2NhbGhvc3QiLCBQT1JUKTsKKworICAgICAgICBzZXJ2ZXIuYWRkTGlzdGVuZXIobGlzdGVuZXIpOworCisgICAgICAgIGZpbmFsIFNlcnZlckNvbmZpZ3VyYXRpb24gY29uZmlnID0gc2VydmVyLmdldFNlcnZlckNvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgLy8gYWRkIGhhbmRsZXIgZm9yIHNlcnZpbmcgc3RhdGljIGNvbnRlbnQKKyAgICAgICAgY29uZmlnLmFkZEh0dHBIYW5kbGVyKG5ldyBTdGF0aWNDb250ZW50SGFuZGxlcih3ZWJSb290UGF0aCksCisgICAgICAgICAgICAgICAgQVBQX1BBVEgpOworCisgICAgICAgIC8vIGFkZCBoYW5kbGVyIGZvciBzZXJ2aW5nIEpBWC1SUyByZXNvdXJjZXMKKyAgICAgICAgY29uZmlnLmFkZEh0dHBIYW5kbGVyKFJ1bnRpbWVEZWxlZ2F0ZS5nZXRJbnN0YW5jZSgpLmNyZWF0ZUVuZHBvaW50KGNyZWF0ZVJlc291cmNlQ29uZmlnKCksIEdyaXp6bHlIdHRwQ29udGFpbmVyLmNsYXNzKSwKKyAgICAgICAgICAgICAgICBBUElfUEFUSCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIFN0YXJ0IHRoZSBzZXJ2ZXIuCisgICAgICAgICAgICBzZXJ2ZXIuc3RhcnQoKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbigiRXhjZXB0aW9uIHRocm93biB3aGVuIHRyeWluZyB0byBzdGFydCBncml6emx5IHNlcnZlciIsIGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgTWFpbldpbmRvdy5tYWluKGFyZ3MpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlwiU1NFIFR3aXR0ZXIgTWVzc2FnZSBBZ2dyZWdhdG9yXCIgSmVyc2V5IEV4YW1wbGUgQXBwIik7CisgICAgICAgICAgICBzdGFydFNlcnZlcihhcmdzLmxlbmd0aCA+PSAxID8gYXJnc1swXSA6IG51bGwpOworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFN0cmluZy5mb3JtYXQoIkFwcGxpY2F0aW9uIHN0YXJ0ZWQuXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiQWNjZXNzIGl0IGF0ICVzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiU3RvcCB0aGUgYXBwbGljYXRpb24gdXNpbmcgQ1RSTCtDIiwKKyAgICAgICAgICAgICAgICAgICAgZ2V0QXBwVXJpKCkpKTsKKworICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5qb2luKCk7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKEFwcC5jbGFzcy5nZXROYW1lKCkpLmxvZyhMZXZlbC5TRVZFUkUsIG51bGwsIGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBTdHJpbmcgZ2V0QXBpVXJpKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiaHR0cDovL2xvY2FsaG9zdDolcyVzIiwgUE9SVCwgQVBJX1BBVEgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRBcHBVcmkoKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJodHRwOi8vbG9jYWxob3N0OiVzJXMiLCBQT1JULCBBUFBfUEFUSCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIEplcnNleSBzZXJ2ZXItc2lkZSBhcHBsaWNhdGlvbiByZXNvdXJjZSBjb25maWd1cmF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBKZXJzZXkgc2VydmVyLXNpZGUgYXBwbGljYXRpb24gY29uZmlndXJhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBSZXNvdXJjZUNvbmZpZyBjcmVhdGVSZXNvdXJjZUNvbmZpZygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZygpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyQ2xhc3NlcyhNZXNzYWdlU3RyZWFtUmVzb3VyY2VKZXJzZXkuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlU3RyZWFtUmVzb3VyY2VKYXhScy5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgIFNzZUZlYXR1cmUuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICBNb3h5SnNvbkZlYXR1cmUuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBjb25maWd1cmVkIHR3aXR0ZXIgdXNlciBuYW1lLgorICAgICAqCisgICAgICogQHJldHVybiBjb25maWd1cmVkIHR3aXR0ZXIgdXNlciBuYW1lLgorICAgICAqLworICAgIHN0YXRpYyBTdHJpbmcgZ2V0VHdpdHRlclVzZXJOYW1lKCkgeworICAgICAgICByZXR1cm4gKFN0cmluZykgVFdJVFRFUl9QUk9QRVJUSUVTLmdldChUV0lUVEVSX1VTRVJfTkFNRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGNvbmZpZ3VyZWQgdHdpdHRlciB1c2VyIHBhc3N3b3JkLgorICAgICAqCisgICAgICogQHJldHVybiBjb25maWd1cmVkIHR3aXR0ZXIgdXNlciBwYXNzd29yZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgU3RyaW5nIGdldFR3aXR0ZXJVc2VyUGFzc3dvcmQoKSB7CisgICAgICAgIHJldHVybiAoU3RyaW5nKSBUV0lUVEVSX1BST1BFUlRJRVMuZ2V0KFRXSVRURVJfVVNFUl9QQVNTV09SRCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgUHJvcGVydGllcyBsb2FkU2V0dGluZ3MoKSB7CisgICAgICAgIGZpbmFsIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIHN0ID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN0cmluZyBob21lRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJ1c2VyLmhvbWUiKTsKKyAgICAgICAgICAgIHN0ID0gbmV3IEZpbGVJbnB1dFN0cmVhbShob21lRGlyICsgRmlsZS5zZXBhcmF0b3IgKyBUV0lUVEVSX1BST1BFUlRJRVNfRklMRV9OQU1FKTsKKyAgICAgICAgICAgIHByb3BlcnRpZXMubG9hZChzdCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHN0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzdC5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoU3RyaW5nIG5hbWUgOiBuZXcgU3RyaW5nW10ge1RXSVRURVJfVVNFUl9OQU1FLCBUV0lUVEVSX1VTRVJfUEFTU1dPUkR9KSB7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBTeXN0ZW0uZ2V0UHJvcGVydHkobmFtZSk7CisgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHByb3BlcnRpZXMuc2V0UHJvcGVydHkobmFtZSwgdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHByb3BlcnRpZXMuZ2V0UHJvcGVydHkoVFdJVFRFUl9VU0VSX05BTUUpID09IG51bGwKKyAgICAgICAgICAgICAgICB8fCBwcm9wZXJ0aWVzLmdldFByb3BlcnR5KFRXSVRURVJfVVNFUl9QQVNTV09SRCkgPT0gbnVsbCkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICInJXMnIGFuZCAnJXMnIHByb3BlcnRpZXMgbm90IHNldC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIllvdSBuZWVkIHRvIHByb3ZpZGUgdGhlbSBlaXRoZXIgdmlhICckSE9NRS8lcycgZmlsZSBvciBhcyBzeXN0ZW0gcHJvcGVydGllcy4iLAorICAgICAgICAgICAgICAgICAgICBUV0lUVEVSX1VTRVJfTkFNRSwgVFdJVFRFUl9VU0VSX1BBU1NXT1JELCBUV0lUVEVSX1BST1BFUlRJRVNfRklMRV9OQU1FKSk7CisgICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcHJvcGVydGllczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaW1wbGUgSHR0cEhhbmRsZXIgZm9yIHNlcnZpbmcgc3RhdGljIGNvbnRlbnQgaW5jbHVkZWQgaW4gd2ViIHJvb3QKKyAgICAgKiBkaXJlY3Rvcnkgb2YgdGhpcyBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTdGF0aWNDb250ZW50SGFuZGxlciBleHRlbmRzIEh0dHBIYW5kbGVyIHsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBFWFRFTlNJT05fVE9fTUVESUFfVFlQRTsKKworICAgICAgICBzdGF0aWMgeworICAgICAgICAgICAgRVhURU5TSU9OX1RPX01FRElBX1RZUEUgPSBuZXcgSGFzaE1hcDw+KCk7CisKKyAgICAgICAgICAgIEVYVEVOU0lPTl9UT19NRURJQV9UWVBFLnB1dCgiaHRtbCIsICJ0ZXh0L2h0bWwiKTsKKyAgICAgICAgICAgIEVYVEVOU0lPTl9UT19NRURJQV9UWVBFLnB1dCgianMiLCAiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpOworICAgICAgICAgICAgRVhURU5TSU9OX1RPX01FRElBX1RZUEUucHV0KCJjc3MiLCAidGV4dC9jc3MiKTsKKyAgICAgICAgICAgIEVYVEVOU0lPTl9UT19NRURJQV9UWVBFLnB1dCgicG5nIiwgImltYWdlL3BuZyIpOworICAgICAgICAgICAgRVhURU5TSU9OX1RPX01FRElBX1RZUEUucHV0KCJpY28iLCAiaW1hZ2UvcG5nIik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB3ZWJSb290UGF0aDsKKworICAgICAgICBTdGF0aWNDb250ZW50SGFuZGxlcihTdHJpbmcgd2ViUm9vdFBhdGgpIHsKKyAgICAgICAgICAgIHRoaXMud2ViUm9vdFBhdGggPSB3ZWJSb290UGF0aDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXJ2aWNlKFJlcXVlc3QgcmVxdWVzdCwgUmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgU3RyaW5nIHVyaSA9IHJlcXVlc3QuZ2V0UmVxdWVzdFVSSSgpOworCisgICAgICAgICAgICBpbnQgcG9zID0gdXJpLmxhc3RJbmRleE9mKCcuJyk7CisgICAgICAgICAgICBTdHJpbmcgZXh0ZW5zaW9uID0gdXJpLnN1YnN0cmluZyhwb3MgKyAxKTsKKyAgICAgICAgICAgIFN0cmluZyBtZWRpYVR5cGUgPSBFWFRFTlNJT05fVE9fTUVESUFfVFlQRS5nZXQoZXh0ZW5zaW9uKTsKKworICAgICAgICAgICAgaWYgKHVyaS5jb250YWlucygiLi4iKSB8fCBtZWRpYVR5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNlbmRFcnJvcihIdHRwU3RhdHVzLk5PVF9GT1VORF80MDQuZ2V0U3RhdHVzQ29kZSgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZXNvdXJjZXNDb250ZXh0UGF0aCA9IHJlcXVlc3QuZ2V0Q29udGV4dFBhdGgoKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiY29udGV4dDogIiArIHJlc291cmNlc0NvbnRleHRQYXRoKTsKKyAgICAgICAgICAgIGlmIChyZXNvdXJjZXNDb250ZXh0UGF0aCAhPSBudWxsICYmICFyZXNvdXJjZXNDb250ZXh0UGF0aC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXVyaS5zdGFydHNXaXRoKHJlc291cmNlc0NvbnRleHRQYXRoKSkgeworICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZW5kRXJyb3IoSHR0cFN0YXR1cy5OT1RfRk9VTkRfNDA0LmdldFN0YXR1c0NvZGUoKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB1cmkgPSB1cmkuc3Vic3RyaW5nKHJlc291cmNlc0NvbnRleHRQYXRoLmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlVSSTogIiArIHVyaSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIElucHV0U3RyZWFtIGZpbGVTdHJlYW07CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZmlsZVN0cmVhbSA9IHdlYlJvb3RQYXRoID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgID8gQXBwLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oV0VCX1JPT1QgKyB1cmkpCisgICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBGaWxlSW5wdXRTdHJlYW0od2ViUm9vdFBhdGggKyB1cmkpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGZpbGVTdHJlYW0gPSBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZmlsZVN0cmVhbSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2VuZEVycm9yKEh0dHBTdGF0dXMuTk9UX0ZPVU5EXzQwNC5nZXRTdGF0dXNDb2RlKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5zZXRTdGF0dXMoSHR0cFN0YXR1cy5PS18yMDApOworICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldENvbnRlbnRUeXBlKG1lZGlhVHlwZSk7CisgICAgICAgICAgICAgICAgUmVhZGVyV3JpdGVyLndyaXRlVG8oZmlsZVN0cmVhbSwgcmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc3NlLXR3aXR0ZXItYWdncmVnYXRvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2FnZ3JlZ2F0b3IvRGF0YUFnZ3JlZ2F0b3IuamF2YSBiL2V4YW1wbGVzL3NzZS10d2l0dGVyLWFnZ3JlZ2F0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9hZ2dyZWdhdG9yL0RhdGFBZ2dyZWdhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM2NzdhZQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3NzZS10d2l0dGVyLWFnZ3JlZ2F0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9hZ2dyZWdhdG9yL0RhdGFBZ2dyZWdhdG9yLmphdmEKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5hZ2dyZWdhdG9yOworCisvKioKKyAqIERhdGEgYWdncmVnYXRvciBmb3IgbGlzdGVuaW5nIGZvciBldmVudHMgYWdncmVnYXRlZCBiYXNlZCBvbiBnaXZlIGtleXdvcmRzLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRGF0YUFnZ3JlZ2F0b3IgeworICAgIHZvaWQgc3RhcnQoU3RyaW5nIGtleXdvcmRzLCBEYXRhTGlzdGVuZXIgbXNnTGlzdGVuZXIpOworCisgICAgdm9pZCBzdG9wKCk7Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9zc2UtdHdpdHRlci1hZ2dyZWdhdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYWdncmVnYXRvci9EYXRhTGlzdGVuZXIuamF2YSBiL2V4YW1wbGVzL3NzZS10d2l0dGVyLWFnZ3JlZ2F0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9hZ2dyZWdhdG9yL0RhdGFMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNTEzZDcKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zc2UtdHdpdHRlci1hZ2dyZWdhdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYWdncmVnYXRvci9EYXRhTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmFnZ3JlZ2F0b3I7CisKKy8qKgorICogSW5jb21pbmcgZGF0YSBsaXN0ZW5lci4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgaW50ZXJmYWNlIERhdGFMaXN0ZW5lciB7CisgICAgLyoqCisgICAgICogSW52b2tlZCB3aGVuIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBkYXRhIHN0cmVhbSBoYXMgYmVlbiBlc3RhYmxpc2hlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvblN0YXJ0KCk7CisKKyAgICAvKioKKyAgICAgKiBJbnZva2VkIHdoZW4gdGhlIGRhdGEgc3RyZWFtIGhhcyBkcmllZCBvdXQgKG9yIHRoZSBjb25uZWN0aW9uIGhhcyBiZWVuIGNsb3NlZCkuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZSgpOworCisgICAgLyoqCisgICAgICogSW52b2tlZCB3aGVuIHRoZXJlIHdhcyBhbiBlcnJvciB3aGlsZSByZWNlaXZpbmcgc3RyZWFtZWQgZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBvbkVycm9yKCk7CisKKyAgICAvKioKKyAgICAgKiBJbnZva2VkIHdoZW4gYSBuZXcgbWVzc2FnZSBkYXRhIGFyZSBhdmFpbGFibGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBuZXcgbWVzc2FnZSBkYXRhLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIG9uTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpOworfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc3NlLXR3aXR0ZXItYWdncmVnYXRvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2FnZ3JlZ2F0b3IvTWFpbldpbmRvdy5mb3JtIGIvZXhhbXBsZXMvc3NlLXR3aXR0ZXItYWdncmVnYXRvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2FnZ3JlZ2F0b3IvTWFpbldpbmRvdy5mb3JtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYmViN2UKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zc2UtdHdpdHRlci1hZ2dyZWdhdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYWdncmVnYXRvci9NYWluV2luZG93LmZvcm0KQEAgLTAsMCArMSwzNDIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiA/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzxGb3JtIHZlcnNpb249IjEuMyIgbWF4VmVyc2lvbj0iMS44IiB0eXBlPSJvcmcubmV0YmVhbnMubW9kdWxlcy5mb3JtLmZvcm1pbmZvLkpGcmFtZUZvcm1JbmZvIj4KKyAgPFByb3BlcnRpZXM+CisgICAgPFByb3BlcnR5IG5hbWU9ImRlZmF1bHRDbG9zZU9wZXJhdGlvbiIgdHlwZT0iaW50IiB2YWx1ZT0iMyIvPgorICAgIDxQcm9wZXJ0eSBuYW1lPSJ0aXRsZSIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdmFsdWU9Ik1lc3NhZ2UgYWdncmVnYXRvciIvPgorICAgIDxQcm9wZXJ0eSBuYW1lPSJtaW5pbXVtU2l6ZSIgdHlwZT0iamF2YS5hd3QuRGltZW5zaW9uIiBlZGl0b3I9Im9yZy5uZXRiZWFucy5iZWFuaW5mby5lZGl0b3JzLkRpbWVuc2lvbkVkaXRvciI+CisgICAgICA8RGltZW5zaW9uIHZhbHVlPSJbMzA0LCAzMDBdIi8+CisgICAgPC9Qcm9wZXJ0eT4KKyAgPC9Qcm9wZXJ0aWVzPgorICA8U3ludGhldGljUHJvcGVydGllcz4KKyAgICA8U3ludGhldGljUHJvcGVydHkgbmFtZT0iZm9ybVNpemVQb2xpY3kiIHR5cGU9ImludCIgdmFsdWU9IjEiLz4KKyAgPC9TeW50aGV0aWNQcm9wZXJ0aWVzPgorICA8QXV4VmFsdWVzPgorICAgIDxBdXhWYWx1ZSBuYW1lPSJGb3JtU2V0dGluZ3NfYXV0b1Jlc291cmNpbmciIHR5cGU9ImphdmEubGFuZy5JbnRlZ2VyIiB2YWx1ZT0iMCIvPgorICAgIDxBdXhWYWx1ZSBuYW1lPSJGb3JtU2V0dGluZ3NfYXV0b1NldENvbXBvbmVudE5hbWUiIHR5cGU9ImphdmEubGFuZy5Cb29sZWFuIiB2YWx1ZT0iZmFsc2UiLz4KKyAgICA8QXV4VmFsdWUgbmFtZT0iRm9ybVNldHRpbmdzX2dlbmVyYXRlRlFOIiB0eXBlPSJqYXZhLmxhbmcuQm9vbGVhbiIgdmFsdWU9InRydWUiLz4KKyAgICA8QXV4VmFsdWUgbmFtZT0iRm9ybVNldHRpbmdzX2dlbmVyYXRlTW5lbW9uaWNzQ29kZSIgdHlwZT0iamF2YS5sYW5nLkJvb2xlYW4iIHZhbHVlPSJmYWxzZSIvPgorICAgIDxBdXhWYWx1ZSBuYW1lPSJGb3JtU2V0dGluZ3NfaTE4bkF1dG9Nb2RlIiB0eXBlPSJqYXZhLmxhbmcuQm9vbGVhbiIgdmFsdWU9ImZhbHNlIi8+CisgICAgPEF1eFZhbHVlIG5hbWU9IkZvcm1TZXR0aW5nc19sYXlvdXRDb2RlVGFyZ2V0IiB0eXBlPSJqYXZhLmxhbmcuSW50ZWdlciIgdmFsdWU9IjIiLz4KKyAgICA8QXV4VmFsdWUgbmFtZT0iRm9ybVNldHRpbmdzX2xpc3RlbmVyR2VuZXJhdGlvblN0eWxlIiB0eXBlPSJqYXZhLmxhbmcuSW50ZWdlciIgdmFsdWU9IjAiLz4KKyAgICA8QXV4VmFsdWUgbmFtZT0iRm9ybVNldHRpbmdzX3ZhcmlhYmxlc0xvY2FsIiB0eXBlPSJqYXZhLmxhbmcuQm9vbGVhbiIgdmFsdWU9ImZhbHNlIi8+CisgICAgPEF1eFZhbHVlIG5hbWU9IkZvcm1TZXR0aW5nc192YXJpYWJsZXNNb2RpZmllciIgdHlwZT0iamF2YS5sYW5nLkludGVnZXIiIHZhbHVlPSIyIi8+CisgIDwvQXV4VmFsdWVzPgorCisgIDxMYXlvdXQ+CisgICAgPERpbWVuc2lvbkxheW91dCBkaW09IjAiPgorICAgICAgPEdyb3VwIHR5cGU9IjEwMyIgZ3JvdXBBbGlnbm1lbnQ9IjAiIGF0dHJpYnV0ZXM9IjAiPgorICAgICAgICAgIDxHcm91cCB0eXBlPSIxMDIiIGFsaWdubWVudD0iMCIgYXR0cmlidXRlcz0iMCI+CisgICAgICAgICAgICAgIDxFbXB0eVNwYWNlIG1heD0iLTIiIGF0dHJpYnV0ZXM9IjAiLz4KKyAgICAgICAgICAgICAgPEdyb3VwIHR5cGU9IjEwMyIgZ3JvdXBBbGlnbm1lbnQ9IjAiIGF0dHJpYnV0ZXM9IjAiPgorICAgICAgICAgICAgICAgICAgPENvbXBvbmVudCBpZD0ialBhbmVsMSIgbWF4PSIzMjc2NyIgYXR0cmlidXRlcz0iMCIvPgorICAgICAgICAgICAgICAgICAgPENvbXBvbmVudCBpZD0ialBhbmVsNCIgYWxpZ25tZW50PSIwIiBtYXg9IjMyNzY3IiBhdHRyaWJ1dGVzPSIwIi8+CisgICAgICAgICAgICAgICAgICA8Q29tcG9uZW50IGlkPSJqUGFuZWwzIiBhbGlnbm1lbnQ9IjAiIG1heD0iMzI3NjciIGF0dHJpYnV0ZXM9IjAiLz4KKyAgICAgICAgICAgICAgPC9Hcm91cD4KKyAgICAgICAgICAgICAgPEVtcHR5U3BhY2UgbWF4PSItMiIgYXR0cmlidXRlcz0iMCIvPgorICAgICAgICAgICAgICA8Q29tcG9uZW50IGlkPSJqUGFuZWwyIiBtYXg9IjMyNzY3IiBhdHRyaWJ1dGVzPSIwIi8+CisgICAgICAgICAgICAgIDxFbXB0eVNwYWNlIG1pbj0iLTIiIG1heD0iLTIiIGF0dHJpYnV0ZXM9IjAiLz4KKyAgICAgICAgICA8L0dyb3VwPgorICAgICAgPC9Hcm91cD4KKyAgICA8L0RpbWVuc2lvbkxheW91dD4KKyAgICA8RGltZW5zaW9uTGF5b3V0IGRpbT0iMSI+CisgICAgICA8R3JvdXAgdHlwZT0iMTAzIiBncm91cEFsaWdubWVudD0iMCIgYXR0cmlidXRlcz0iMCI+CisgICAgICAgICAgPEdyb3VwIHR5cGU9IjEwMiIgYWxpZ25tZW50PSIwIiBhdHRyaWJ1dGVzPSIwIj4KKyAgICAgICAgICAgICAgPEVtcHR5U3BhY2UgbWF4PSItMiIgYXR0cmlidXRlcz0iMCIvPgorICAgICAgICAgICAgICA8R3JvdXAgdHlwZT0iMTAzIiBncm91cEFsaWdubWVudD0iMCIgYXR0cmlidXRlcz0iMCI+CisgICAgICAgICAgICAgICAgICA8Q29tcG9uZW50IGlkPSJqUGFuZWwyIiBtYXg9IjMyNzY3IiBhdHRyaWJ1dGVzPSIwIi8+CisgICAgICAgICAgICAgICAgICA8R3JvdXAgdHlwZT0iMTAyIiBhdHRyaWJ1dGVzPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICA8Q29tcG9uZW50IGlkPSJqUGFuZWw0IiBtaW49Ii0yIiBtYXg9Ii0yIiBhdHRyaWJ1dGVzPSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgPEVtcHR5U3BhY2UgbWF4PSItMiIgYXR0cmlidXRlcz0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgIDxDb21wb25lbnQgaWQ9ImpQYW5lbDMiIG1pbj0iLTIiIG1heD0iLTIiIGF0dHJpYnV0ZXM9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICA8RW1wdHlTcGFjZSBtYXg9Ii0yIiBhdHRyaWJ1dGVzPSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgPENvbXBvbmVudCBpZD0ialBhbmVsMSIgbWF4PSIzMjc2NyIgYXR0cmlidXRlcz0iMCIvPgorICAgICAgICAgICAgICAgICAgPC9Hcm91cD4KKyAgICAgICAgICAgICAgPC9Hcm91cD4KKyAgICAgICAgICAgICAgPEVtcHR5U3BhY2UgbWF4PSItMiIgYXR0cmlidXRlcz0iMCIvPgorICAgICAgICAgIDwvR3JvdXA+CisgICAgICA8L0dyb3VwPgorICAgIDwvRGltZW5zaW9uTGF5b3V0PgorICA8L0xheW91dD4KKyAgPFN1YkNvbXBvbmVudHM+CisgICAgPENvbnRhaW5lciBjbGFzcz0iamF2YXguc3dpbmcuSlBhbmVsIiBuYW1lPSJqUGFuZWwzIj4KKyAgICAgIDxQcm9wZXJ0aWVzPgorICAgICAgICA8UHJvcGVydHkgbmFtZT0iYm9yZGVyIiB0eXBlPSJqYXZheC5zd2luZy5ib3JkZXIuQm9yZGVyIiBlZGl0b3I9Im9yZy5uZXRiZWFucy5tb2R1bGVzLmZvcm0uZWRpdG9yczIuQm9yZGVyRWRpdG9yIj4KKyAgICAgICAgICA8Qm9yZGVyIGluZm89Im9yZy5uZXRiZWFucy5tb2R1bGVzLmZvcm0uY29tcGF0Mi5ib3JkZXIuRXRjaGVkQm9yZGVySW5mbyI+CisgICAgICAgICAgICA8RXRjaGV0Qm9yZGVyLz4KKyAgICAgICAgICA8L0JvcmRlcj4KKyAgICAgICAgPC9Qcm9wZXJ0eT4KKyAgICAgIDwvUHJvcGVydGllcz4KKyAgICAgIDxBdXhWYWx1ZXM+CisgICAgICAgIDxBdXhWYWx1ZSBuYW1lPSJKYXZhQ29kZUdlbmVyYXRvcl9WYXJpYWJsZUxvY2FsIiB0eXBlPSJqYXZhLmxhbmcuQm9vbGVhbiIgdmFsdWU9InRydWUiLz4KKyAgICAgICAgPEF1eFZhbHVlIG5hbWU9IkphdmFDb2RlR2VuZXJhdG9yX1ZhcmlhYmxlTW9kaWZpZXIiIHR5cGU9ImphdmEubGFuZy5JbnRlZ2VyIiB2YWx1ZT0iMCIvPgorICAgICAgPC9BdXhWYWx1ZXM+CisKKyAgICAgIDxMYXlvdXQ+CisgICAgICAgIDxEaW1lbnNpb25MYXlvdXQgZGltPSIwIj4KKyAgICAgICAgICA8R3JvdXAgdHlwZT0iMTAzIiBncm91cEFsaWdubWVudD0iMCIgYXR0cmlidXRlcz0iMCI+CisgICAgICAgICAgICAgIDxHcm91cCB0eXBlPSIxMDIiIGFsaWdubWVudD0iMCIgYXR0cmlidXRlcz0iMCI+CisgICAgICAgICAgICAgICAgICA8RW1wdHlTcGFjZSBtYXg9Ii0yIiBhdHRyaWJ1dGVzPSIwIi8+CisgICAgICAgICAgICAgICAgICA8Q29tcG9uZW50IGlkPSJuZXdLZXl3b3JkRmllbGQiIG1heD0iMzI3NjciIGF0dHJpYnV0ZXM9IjAiLz4KKyAgICAgICAgICAgICAgICAgIDxFbXB0eVNwYWNlIG1heD0iLTIiIGF0dHJpYnV0ZXM9IjAiLz4KKyAgICAgICAgICAgICAgICAgIDxDb21wb25lbnQgaWQ9ImFkZEJ1dHRvbiIgbWluPSItMiIgcHJlZj0iNzIiIG1heD0iLTIiIGF0dHJpYnV0ZXM9IjAiLz4KKyAgICAgICAgICAgICAgICAgIDxFbXB0eVNwYWNlIG1heD0iLTIiIGF0dHJpYnV0ZXM9IjAiLz4KKyAgICAgICAgICAgICAgPC9Hcm91cD4KKyAgICAgICAgICA8L0dyb3VwPgorICAgICAgICA8L0RpbWVuc2lvbkxheW91dD4KKyAgICAgICAgPERpbWVuc2lvbkxheW91dCBkaW09IjEiPgorICAgICAgICAgIDxHcm91cCB0eXBlPSIxMDMiIGdyb3VwQWxpZ25tZW50PSIwIiBhdHRyaWJ1dGVzPSIwIj4KKyAgICAgICAgICAgICAgPEdyb3VwIHR5cGU9IjEwMiIgYWxpZ25tZW50PSIwIiBhdHRyaWJ1dGVzPSIwIj4KKyAgICAgICAgICAgICAgICAgIDxFbXB0eVNwYWNlIG1heD0iLTIiIGF0dHJpYnV0ZXM9IjAiLz4KKyAgICAgICAgICAgICAgICAgIDxHcm91cCB0eXBlPSIxMDMiIGdyb3VwQWxpZ25tZW50PSIzIiBhdHRyaWJ1dGVzPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICA8Q29tcG9uZW50IGlkPSJuZXdLZXl3b3JkRmllbGQiIGFsaWdubWVudD0iMyIgbWluPSItMiIgbWF4PSItMiIgYXR0cmlidXRlcz0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgIDxDb21wb25lbnQgaWQ9ImFkZEJ1dHRvbiIgYWxpZ25tZW50PSIzIiBtaW49Ii0yIiBtYXg9Ii0yIiBhdHRyaWJ1dGVzPSIwIi8+CisgICAgICAgICAgICAgICAgICA8L0dyb3VwPgorICAgICAgICAgICAgICAgICAgPEVtcHR5U3BhY2UgbWF4PSIzMjc2NyIgYXR0cmlidXRlcz0iMCIvPgorICAgICAgICAgICAgICA8L0dyb3VwPgorICAgICAgICAgIDwvR3JvdXA+CisgICAgICAgIDwvRGltZW5zaW9uTGF5b3V0PgorICAgICAgPC9MYXlvdXQ+CisgICAgICA8U3ViQ29tcG9uZW50cz4KKyAgICAgICAgPENvbXBvbmVudCBjbGFzcz0iamF2YXguc3dpbmcuSlRleHRGaWVsZCIgbmFtZT0ibmV3S2V5d29yZEZpZWxkIj4KKyAgICAgICAgICA8RXZlbnRzPgorICAgICAgICAgICAgPEV2ZW50SGFuZGxlciBldmVudD0iYWN0aW9uUGVyZm9ybWVkIiBsaXN0ZW5lcj0iamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXIiIHBhcmFtZXRlcnM9ImphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50IiBoYW5kbGVyPSJvbktleXdvcmRFbnRlcmVkIi8+CisgICAgICAgICAgPC9FdmVudHM+CisgICAgICAgIDwvQ29tcG9uZW50PgorICAgICAgICA8Q29tcG9uZW50IGNsYXNzPSJqYXZheC5zd2luZy5KQnV0dG9uIiBuYW1lPSJhZGRCdXR0b24iPgorICAgICAgICAgIDxQcm9wZXJ0aWVzPgorICAgICAgICAgICAgPFByb3BlcnR5IG5hbWU9InRleHQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHZhbHVlPSJBZGQiLz4KKyAgICAgICAgICA8L1Byb3BlcnRpZXM+CisgICAgICAgICAgPEV2ZW50cz4KKyAgICAgICAgICAgIDxFdmVudEhhbmRsZXIgZXZlbnQ9ImFjdGlvblBlcmZvcm1lZCIgbGlzdGVuZXI9ImphdmEuYXd0LmV2ZW50LkFjdGlvbkxpc3RlbmVyIiBwYXJhbWV0ZXJzPSJqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudCIgaGFuZGxlcj0ib25BZGQiLz4KKyAgICAgICAgICA8L0V2ZW50cz4KKyAgICAgICAgPC9Db21wb25lbnQ+CisgICAgICA8L1N1YkNvbXBvbmVudHM+CisgICAgPC9Db250YWluZXI+CisgICAgPENvbnRhaW5lciBjbGFzcz0iamF2YXguc3dpbmcuSlBhbmVsIiBuYW1lPSJqUGFuZWwxIj4KKyAgICAgIDxQcm9wZXJ0aWVzPgorICAgICAgICA8UHJvcGVydHkgbmFtZT0iYm9yZGVyIiB0eXBlPSJqYXZheC5zd2luZy5ib3JkZXIuQm9yZGVyIiBlZGl0b3I9Im9yZy5uZXRiZWFucy5tb2R1bGVzLmZvcm0uZWRpdG9yczIuQm9yZGVyRWRpdG9yIj4KKyAgICAgICAgICA8Qm9yZGVyIGluZm89Im9yZy5uZXRiZWFucy5tb2R1bGVzLmZvcm0uY29tcGF0Mi5ib3JkZXIuRXRjaGVkQm9yZGVySW5mbyI+CisgICAgICAgICAgICA8RXRjaGV0Qm9yZGVyLz4KKyAgICAgICAgICA8L0JvcmRlcj4KKyAgICAgICAgPC9Qcm9wZXJ0eT4KKyAgICAgIDwvUHJvcGVydGllcz4KKyAgICAgIDxBdXhWYWx1ZXM+CisgICAgICAgIDxBdXhWYWx1ZSBuYW1lPSJKYXZhQ29kZUdlbmVyYXRvcl9WYXJpYWJsZUxvY2FsIiB0eXBlPSJqYXZhLmxhbmcuQm9vbGVhbiIgdmFsdWU9InRydWUiLz4KKyAgICAgICAgPEF1eFZhbHVlIG5hbWU9IkphdmFDb2RlR2VuZXJhdG9yX1ZhcmlhYmxlTW9kaWZpZXIiIHR5cGU9ImphdmEubGFuZy5JbnRlZ2VyIiB2YWx1ZT0iMCIvPgorICAgICAgPC9BdXhWYWx1ZXM+CisKKyAgICAgIDxMYXlvdXQ+CisgICAgICAgIDxEaW1lbnNpb25MYXlvdXQgZGltPSIwIj4KKyAgICAgICAgICA8R3JvdXAgdHlwZT0iMTAzIiBncm91cEFsaWdubWVudD0iMCIgYXR0cmlidXRlcz0iMCI+CisgICAgICAgICAgICAgIDxHcm91cCB0eXBlPSIxMDIiIGFsaWdubWVudD0iMCIgYXR0cmlidXRlcz0iMCI+CisgICAgICAgICAgICAgICAgICA8RW1wdHlTcGFjZSBtYXg9Ii0yIiBhdHRyaWJ1dGVzPSIwIi8+CisgICAgICAgICAgICAgICAgICA8R3JvdXAgdHlwZT0iMTAzIiBncm91cEFsaWdubWVudD0iMCIgYXR0cmlidXRlcz0iMCI+CisgICAgICAgICAgICAgICAgICAgICAgPEdyb3VwIHR5cGU9IjEwMiIgYXR0cmlidXRlcz0iMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDxDb21wb25lbnQgaWQ9ImpTY3JvbGxQYW5lMiIgcHJlZj0iMjQ3IiBtYXg9IjMyNzY3IiBhdHRyaWJ1dGVzPSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDxFbXB0eVNwYWNlIG1heD0iLTIiIGF0dHJpYnV0ZXM9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICA8L0dyb3VwPgorICAgICAgICAgICAgICAgICAgICAgIDxHcm91cCB0eXBlPSIxMDIiIGF0dHJpYnV0ZXM9IjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8Q29tcG9uZW50IGlkPSJjb25uZWN0aW9uU3RhdHVzTGFiZWwiIG1heD0iMzI3NjciIGF0dHJpYnV0ZXM9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPEVtcHR5U3BhY2UgbWF4PSItMiIgYXR0cmlidXRlcz0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8Q29tcG9uZW50IGlkPSJzdGFydFN0b3BCdXR0b24iIG1pbj0iLTIiIG1heD0iLTIiIGF0dHJpYnV0ZXM9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICA8L0dyb3VwPgorICAgICAgICAgICAgICAgICAgPC9Hcm91cD4KKyAgICAgICAgICAgICAgPC9Hcm91cD4KKyAgICAgICAgICA8L0dyb3VwPgorICAgICAgICA8L0RpbWVuc2lvbkxheW91dD4KKyAgICAgICAgPERpbWVuc2lvbkxheW91dCBkaW09IjEiPgorICAgICAgICAgIDxHcm91cCB0eXBlPSIxMDMiIGdyb3VwQWxpZ25tZW50PSIwIiBhdHRyaWJ1dGVzPSIwIj4KKyAgICAgICAgICAgICAgPEdyb3VwIHR5cGU9IjEwMiIgYWxpZ25tZW50PSIwIiBhdHRyaWJ1dGVzPSIwIj4KKyAgICAgICAgICAgICAgICAgIDxFbXB0eVNwYWNlIG1heD0iLTIiIGF0dHJpYnV0ZXM9IjAiLz4KKyAgICAgICAgICAgICAgICAgIDxHcm91cCB0eXBlPSIxMDMiIGdyb3VwQWxpZ25tZW50PSIzIiBhdHRyaWJ1dGVzPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICA8Q29tcG9uZW50IGlkPSJzdGFydFN0b3BCdXR0b24iIGFsaWdubWVudD0iMyIgbWluPSItMiIgbWF4PSItMiIgYXR0cmlidXRlcz0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgIDxDb21wb25lbnQgaWQ9ImNvbm5lY3Rpb25TdGF0dXNMYWJlbCIgYWxpZ25tZW50PSIzIiBtaW49Ii0yIiBtYXg9Ii0yIiBhdHRyaWJ1dGVzPSIwIi8+CisgICAgICAgICAgICAgICAgICA8L0dyb3VwPgorICAgICAgICAgICAgICAgICAgPEVtcHR5U3BhY2UgbWF4PSItMiIgYXR0cmlidXRlcz0iMCIvPgorICAgICAgICAgICAgICAgICAgPENvbXBvbmVudCBpZD0ialNjcm9sbFBhbmUyIiBtYXg9IjMyNzY3IiBhdHRyaWJ1dGVzPSIwIi8+CisgICAgICAgICAgICAgICAgICA8RW1wdHlTcGFjZSBtYXg9Ii0yIiBhdHRyaWJ1dGVzPSIwIi8+CisgICAgICAgICAgICAgIDwvR3JvdXA+CisgICAgICAgICAgPC9Hcm91cD4KKyAgICAgICAgPC9EaW1lbnNpb25MYXlvdXQ+CisgICAgICA8L0xheW91dD4KKyAgICAgIDxTdWJDb21wb25lbnRzPgorICAgICAgICA8Q29tcG9uZW50IGNsYXNzPSJqYXZheC5zd2luZy5KTGFiZWwiIG5hbWU9ImNvbm5lY3Rpb25TdGF0dXNMYWJlbCI+CisgICAgICAgIDwvQ29tcG9uZW50PgorICAgICAgICA8Q29tcG9uZW50IGNsYXNzPSJqYXZheC5zd2luZy5KQnV0dG9uIiBuYW1lPSJzdGFydFN0b3BCdXR0b24iPgorICAgICAgICAgIDxQcm9wZXJ0aWVzPgorICAgICAgICAgICAgPFByb3BlcnR5IG5hbWU9InRleHQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHZhbHVlPSJTdGFydCIvPgorICAgICAgICAgIDwvUHJvcGVydGllcz4KKyAgICAgICAgICA8RXZlbnRzPgorICAgICAgICAgICAgPEV2ZW50SGFuZGxlciBldmVudD0iYWN0aW9uUGVyZm9ybWVkIiBsaXN0ZW5lcj0iamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXIiIHBhcmFtZXRlcnM9ImphdmEuYXd0LmV2ZW50LkFjdGlvbkV2ZW50IiBoYW5kbGVyPSJvblN0YXJ0T3JTdG9wIi8+CisgICAgICAgICAgPC9FdmVudHM+CisgICAgICAgIDwvQ29tcG9uZW50PgorICAgICAgICA8Q29udGFpbmVyIGNsYXNzPSJqYXZheC5zd2luZy5KU2Nyb2xsUGFuZSIgbmFtZT0ialNjcm9sbFBhbmUyIj4KKyAgICAgICAgICA8QXV4VmFsdWVzPgorICAgICAgICAgICAgPEF1eFZhbHVlIG5hbWU9IkphdmFDb2RlR2VuZXJhdG9yX1ZhcmlhYmxlTG9jYWwiIHR5cGU9ImphdmEubGFuZy5Cb29sZWFuIiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgICAgICAgPEF1eFZhbHVlIG5hbWU9IkphdmFDb2RlR2VuZXJhdG9yX1ZhcmlhYmxlTW9kaWZpZXIiIHR5cGU9ImphdmEubGFuZy5JbnRlZ2VyIiB2YWx1ZT0iMCIvPgorICAgICAgICAgICAgPEF1eFZhbHVlIG5hbWU9ImF1dG9TY3JvbGxQYW5lIiB0eXBlPSJqYXZhLmxhbmcuQm9vbGVhbiIgdmFsdWU9InRydWUiLz4KKyAgICAgICAgICA8L0F1eFZhbHVlcz4KKworICAgICAgICAgIDxMYXlvdXQgY2xhc3M9Im9yZy5uZXRiZWFucy5tb2R1bGVzLmZvcm0uY29tcGF0Mi5sYXlvdXRzLnN1cHBvcnQuSlNjcm9sbFBhbmVTdXBwb3J0TGF5b3V0Ii8+CisgICAgICAgICAgPFN1YkNvbXBvbmVudHM+CisgICAgICAgICAgICA8Q29tcG9uZW50IGNsYXNzPSJqYXZheC5zd2luZy5KVGV4dEFyZWEiIG5hbWU9Im1lc3NhZ2VzQXJlYSI+CisgICAgICAgICAgICAgIDxQcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgIDxQcm9wZXJ0eSBuYW1lPSJjb2x1bW5zIiB0eXBlPSJpbnQiIHZhbHVlPSIyMCIvPgorICAgICAgICAgICAgICAgIDxQcm9wZXJ0eSBuYW1lPSJsaW5lV3JhcCIgdHlwZT0iYm9vbGVhbiIgdmFsdWU9InRydWUiLz4KKyAgICAgICAgICAgICAgICA8UHJvcGVydHkgbmFtZT0icm93cyIgdHlwZT0iaW50IiB2YWx1ZT0iNSIvPgorICAgICAgICAgICAgICAgIDxQcm9wZXJ0eSBuYW1lPSJ3cmFwU3R5bGVXb3JkIiB0eXBlPSJib29sZWFuIiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgICAgICAgICAgIDxQcm9wZXJ0eSBuYW1lPSJmb2N1c2FibGUiIHR5cGU9ImJvb2xlYW4iIHZhbHVlPSJmYWxzZSIvPgorICAgICAgICAgICAgICA8L1Byb3BlcnRpZXM+CisgICAgICAgICAgICA8L0NvbXBvbmVudD4KKyAgICAgICAgICA8L1N1YkNvbXBvbmVudHM+CisgICAgICAgIDwvQ29udGFpbmVyPgorICAgICAgPC9TdWJDb21wb25lbnRzPgorICAgIDwvQ29udGFpbmVyPgorICAgIDxDb250YWluZXIgY2xhc3M9ImphdmF4LnN3aW5nLkpQYW5lbCIgbmFtZT0ialBhbmVsMiI+CisgICAgICA8UHJvcGVydGllcz4KKyAgICAgICAgPFByb3BlcnR5IG5hbWU9ImJvcmRlciIgdHlwZT0iamF2YXguc3dpbmcuYm9yZGVyLkJvcmRlciIgZWRpdG9yPSJvcmcubmV0YmVhbnMubW9kdWxlcy5mb3JtLmVkaXRvcnMyLkJvcmRlckVkaXRvciI+CisgICAgICAgICAgPEJvcmRlciBpbmZvPSJvcmcubmV0YmVhbnMubW9kdWxlcy5mb3JtLmNvbXBhdDIuYm9yZGVyLkV0Y2hlZEJvcmRlckluZm8iPgorICAgICAgICAgICAgPEV0Y2hldEJvcmRlci8+CisgICAgICAgICAgPC9Cb3JkZXI+CisgICAgICAgIDwvUHJvcGVydHk+CisgICAgICA8L1Byb3BlcnRpZXM+CisgICAgICA8QXV4VmFsdWVzPgorICAgICAgICA8QXV4VmFsdWUgbmFtZT0iSmF2YUNvZGVHZW5lcmF0b3JfVmFyaWFibGVMb2NhbCIgdHlwZT0iamF2YS5sYW5nLkJvb2xlYW4iIHZhbHVlPSJ0cnVlIi8+CisgICAgICAgIDxBdXhWYWx1ZSBuYW1lPSJKYXZhQ29kZUdlbmVyYXRvcl9WYXJpYWJsZU1vZGlmaWVyIiB0eXBlPSJqYXZhLmxhbmcuSW50ZWdlciIgdmFsdWU9IjAiLz4KKyAgICAgIDwvQXV4VmFsdWVzPgorCisgICAgICA8TGF5b3V0PgorICAgICAgICA8RGltZW5zaW9uTGF5b3V0IGRpbT0iMCI+CisgICAgICAgICAgPEdyb3VwIHR5cGU9IjEwMyIgZ3JvdXBBbGlnbm1lbnQ9IjAiIGF0dHJpYnV0ZXM9IjAiPgorICAgICAgICAgICAgICA8R3JvdXAgdHlwZT0iMTAyIiBhbGlnbm1lbnQ9IjAiIGF0dHJpYnV0ZXM9IjAiPgorICAgICAgICAgICAgICAgICAgPEVtcHR5U3BhY2UgbWF4PSItMiIgYXR0cmlidXRlcz0iMCIvPgorICAgICAgICAgICAgICAgICAgPENvbXBvbmVudCBpZD0ialNjcm9sbFBhbmUxIiBwcmVmPSI5NyIgbWF4PSIzMjc2NyIgYXR0cmlidXRlcz0iMCIvPgorICAgICAgICAgICAgICAgICAgPEVtcHR5U3BhY2UgbWF4PSItMiIgYXR0cmlidXRlcz0iMCIvPgorICAgICAgICAgICAgICA8L0dyb3VwPgorICAgICAgICAgIDwvR3JvdXA+CisgICAgICAgIDwvRGltZW5zaW9uTGF5b3V0PgorICAgICAgICA8RGltZW5zaW9uTGF5b3V0IGRpbT0iMSI+CisgICAgICAgICAgPEdyb3VwIHR5cGU9IjEwMyIgZ3JvdXBBbGlnbm1lbnQ9IjAiIGF0dHJpYnV0ZXM9IjAiPgorICAgICAgICAgICAgICA8R3JvdXAgdHlwZT0iMTAyIiBhbGlnbm1lbnQ9IjAiIGF0dHJpYnV0ZXM9IjAiPgorICAgICAgICAgICAgICAgICAgPEVtcHR5U3BhY2UgbWF4PSItMiIgYXR0cmlidXRlcz0iMCIvPgorICAgICAgICAgICAgICAgICAgPENvbXBvbmVudCBpZD0ialNjcm9sbFBhbmUxIiBwcmVmPSIzMzIiIG1heD0iMzI3NjciIGF0dHJpYnV0ZXM9IjAiLz4KKyAgICAgICAgICAgICAgICAgIDxFbXB0eVNwYWNlIG1heD0iLTIiIGF0dHJpYnV0ZXM9IjAiLz4KKyAgICAgICAgICAgICAgPC9Hcm91cD4KKyAgICAgICAgICA8L0dyb3VwPgorICAgICAgICA8L0RpbWVuc2lvbkxheW91dD4KKyAgICAgIDwvTGF5b3V0PgorICAgICAgPFN1YkNvbXBvbmVudHM+CisgICAgICAgIDxDb250YWluZXIgY2xhc3M9ImphdmF4LnN3aW5nLkpTY3JvbGxQYW5lIiBuYW1lPSJqU2Nyb2xsUGFuZTEiPgorICAgICAgICAgIDxBdXhWYWx1ZXM+CisgICAgICAgICAgICA8QXV4VmFsdWUgbmFtZT0iSmF2YUNvZGVHZW5lcmF0b3JfVmFyaWFibGVMb2NhbCIgdHlwZT0iamF2YS5sYW5nLkJvb2xlYW4iIHZhbHVlPSJ0cnVlIi8+CisgICAgICAgICAgICA8QXV4VmFsdWUgbmFtZT0iSmF2YUNvZGVHZW5lcmF0b3JfVmFyaWFibGVNb2RpZmllciIgdHlwZT0iamF2YS5sYW5nLkludGVnZXIiIHZhbHVlPSIwIi8+CisgICAgICAgICAgICA8QXV4VmFsdWUgbmFtZT0iYXV0b1Njcm9sbFBhbmUiIHR5cGU9ImphdmEubGFuZy5Cb29sZWFuIiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgICAgIDwvQXV4VmFsdWVzPgorCisgICAgICAgICAgPExheW91dCBjbGFzcz0ib3JnLm5ldGJlYW5zLm1vZHVsZXMuZm9ybS5jb21wYXQyLmxheW91dHMuc3VwcG9ydC5KU2Nyb2xsUGFuZVN1cHBvcnRMYXlvdXQiLz4KKyAgICAgICAgICA8U3ViQ29tcG9uZW50cz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgY2xhc3M9ImphdmF4LnN3aW5nLkpMaXN0IiBuYW1lPSJrZXl3b3JkTGlzdCI+CisgICAgICAgICAgICAgIDxQcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgIDxQcm9wZXJ0eSBuYW1lPSJtb2RlbCIgdHlwZT0iamF2YXguc3dpbmcuTGlzdE1vZGVsIiBlZGl0b3I9Im9yZy5uZXRiZWFucy5tb2R1bGVzLmZvcm0uUkFEQ29ubmVjdGlvblByb3BlcnR5RWRpdG9yIj4KKyAgICAgICAgICAgICAgICAgIDxDb25uZWN0aW9uIGNvZGU9ImtleXdvcmRMaXN0TW9kZWwiIHR5cGU9ImNvZGUiLz4KKyAgICAgICAgICAgICAgICA8L1Byb3BlcnR5PgorICAgICAgICAgICAgICA8L1Byb3BlcnRpZXM+CisgICAgICAgICAgICA8L0NvbXBvbmVudD4KKyAgICAgICAgICA8L1N1YkNvbXBvbmVudHM+CisgICAgICAgIDwvQ29udGFpbmVyPgorICAgICAgPC9TdWJDb21wb25lbnRzPgorICAgIDwvQ29udGFpbmVyPgorICAgIDxDb250YWluZXIgY2xhc3M9ImphdmF4LnN3aW5nLkpQYW5lbCIgbmFtZT0ialBhbmVsNCI+CisgICAgICA8UHJvcGVydGllcz4KKyAgICAgICAgPFByb3BlcnR5IG5hbWU9ImJvcmRlciIgdHlwZT0iamF2YXguc3dpbmcuYm9yZGVyLkJvcmRlciIgZWRpdG9yPSJvcmcubmV0YmVhbnMubW9kdWxlcy5mb3JtLmVkaXRvcnMyLkJvcmRlckVkaXRvciI+CisgICAgICAgICAgPEJvcmRlciBpbmZvPSJvcmcubmV0YmVhbnMubW9kdWxlcy5mb3JtLmNvbXBhdDIuYm9yZGVyLkV0Y2hlZEJvcmRlckluZm8iPgorICAgICAgICAgICAgPEV0Y2hldEJvcmRlci8+CisgICAgICAgICAgPC9Cb3JkZXI+CisgICAgICAgIDwvUHJvcGVydHk+CisgICAgICA8L1Byb3BlcnRpZXM+CisKKyAgICAgIDxMYXlvdXQ+CisgICAgICAgIDxEaW1lbnNpb25MYXlvdXQgZGltPSIwIj4KKyAgICAgICAgICA8R3JvdXAgdHlwZT0iMTAzIiBncm91cEFsaWdubWVudD0iMCIgYXR0cmlidXRlcz0iMCI+CisgICAgICAgICAgICAgIDxHcm91cCB0eXBlPSIxMDIiIGF0dHJpYnV0ZXM9IjAiPgorICAgICAgICAgICAgICAgICAgPEVtcHR5U3BhY2UgbWF4PSItMiIgYXR0cmlidXRlcz0iMCIvPgorICAgICAgICAgICAgICAgICAgPEdyb3VwIHR5cGU9IjEwMyIgZ3JvdXBBbGlnbm1lbnQ9IjAiIGF0dHJpYnV0ZXM9IjAiPgorICAgICAgICAgICAgICAgICAgICAgIDxHcm91cCB0eXBlPSIxMDIiIGFsaWdubWVudD0iMSIgYXR0cmlidXRlcz0iMCI+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDxDb21wb25lbnQgaWQ9InR3aXR0ZXJDb2xvckxhYmVsIiBtaW49Ii0yIiBtYXg9Ii0yIiBhdHRyaWJ1dGVzPSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDxFbXB0eVNwYWNlIG1heD0iLTIiIGF0dHJpYnV0ZXM9IjAiLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgPENvbXBvbmVudCBpZD0idHdpdHRlckNoZWNrYm94IiBtYXg9IjMyNzY3IiBhdHRyaWJ1dGVzPSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgPC9Hcm91cD4KKyAgICAgICAgICAgICAgICAgICAgICA8R3JvdXAgdHlwZT0iMTAyIiBhbGlnbm1lbnQ9IjEiIGF0dHJpYnV0ZXM9IjAiPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8Q29tcG9uZW50IGlkPSJ0ZXN0Q29sb3JMYWJlbCIgbWluPSItMiIgbWF4PSItMiIgYXR0cmlidXRlcz0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgICAgICA8RW1wdHlTcGFjZSBtYXg9Ii0yIiBhdHRyaWJ1dGVzPSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgICAgIDxDb21wb25lbnQgaWQ9InRlc3RDaGVja2JveCIgbWF4PSIzMjc2NyIgYXR0cmlidXRlcz0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgIDwvR3JvdXA+CisgICAgICAgICAgICAgICAgICA8L0dyb3VwPgorICAgICAgICAgICAgICAgICAgPEVtcHR5U3BhY2UgbWF4PSItMiIgYXR0cmlidXRlcz0iMCIvPgorICAgICAgICAgICAgICA8L0dyb3VwPgorICAgICAgICAgIDwvR3JvdXA+CisgICAgICAgIDwvRGltZW5zaW9uTGF5b3V0PgorICAgICAgICA8RGltZW5zaW9uTGF5b3V0IGRpbT0iMSI+CisgICAgICAgICAgPEdyb3VwIHR5cGU9IjEwMyIgZ3JvdXBBbGlnbm1lbnQ9IjAiIGF0dHJpYnV0ZXM9IjAiPgorICAgICAgICAgICAgICA8R3JvdXAgdHlwZT0iMTAyIiBhbGlnbm1lbnQ9IjAiIGF0dHJpYnV0ZXM9IjAiPgorICAgICAgICAgICAgICAgICAgPEVtcHR5U3BhY2UgbWF4PSItMiIgYXR0cmlidXRlcz0iMCIvPgorICAgICAgICAgICAgICAgICAgPEdyb3VwIHR5cGU9IjEwMyIgZ3JvdXBBbGlnbm1lbnQ9IjMiIGF0dHJpYnV0ZXM9IjAiPgorICAgICAgICAgICAgICAgICAgICAgIDxDb21wb25lbnQgaWQ9InR3aXR0ZXJDaGVja2JveCIgYWxpZ25tZW50PSIzIiBtaW49Ii0yIiBtYXg9Ii0yIiBhdHRyaWJ1dGVzPSIwIi8+CisgICAgICAgICAgICAgICAgICAgICAgPENvbXBvbmVudCBpZD0idHdpdHRlckNvbG9yTGFiZWwiIGFsaWdubWVudD0iMyIgbWluPSItMiIgbWF4PSItMiIgYXR0cmlidXRlcz0iMCIvPgorICAgICAgICAgICAgICAgICAgPC9Hcm91cD4KKyAgICAgICAgICAgICAgICAgIDxFbXB0eVNwYWNlIG1heD0iLTIiIGF0dHJpYnV0ZXM9IjAiLz4KKyAgICAgICAgICAgICAgICAgIDxHcm91cCB0eXBlPSIxMDMiIGdyb3VwQWxpZ25tZW50PSIzIiBhdHRyaWJ1dGVzPSIwIj4KKyAgICAgICAgICAgICAgICAgICAgICA8Q29tcG9uZW50IGlkPSJ0ZXN0Q2hlY2tib3giIGFsaWdubWVudD0iMyIgbWluPSItMiIgbWF4PSItMiIgYXR0cmlidXRlcz0iMCIvPgorICAgICAgICAgICAgICAgICAgICAgIDxDb21wb25lbnQgaWQ9InRlc3RDb2xvckxhYmVsIiBhbGlnbm1lbnQ9IjMiIG1pbj0iLTIiIG1heD0iLTIiIGF0dHJpYnV0ZXM9IjAiLz4KKyAgICAgICAgICAgICAgICAgIDwvR3JvdXA+CisgICAgICAgICAgICAgICAgICA8RW1wdHlTcGFjZSBtYXg9IjMyNzY3IiBhdHRyaWJ1dGVzPSIwIi8+CisgICAgICAgICAgICAgIDwvR3JvdXA+CisgICAgICAgICAgPC9Hcm91cD4KKyAgICAgICAgPC9EaW1lbnNpb25MYXlvdXQ+CisgICAgICA8L0xheW91dD4KKyAgICAgIDxTdWJDb21wb25lbnRzPgorICAgICAgICA8Q29tcG9uZW50IGNsYXNzPSJqYXZheC5zd2luZy5KQ2hlY2tCb3giIG5hbWU9InR3aXR0ZXJDaGVja2JveCI+CisgICAgICAgICAgPFByb3BlcnRpZXM+CisgICAgICAgICAgICA8UHJvcGVydHkgbmFtZT0ic2VsZWN0ZWQiIHR5cGU9ImJvb2xlYW4iIHZhbHVlPSJ0cnVlIi8+CisgICAgICAgICAgICA8UHJvcGVydHkgbmFtZT0idGV4dCIgdHlwZT0iamF2YS5sYW5nLlN0cmluZyIgdmFsdWU9IlR3aXR0ZXIgYWdncmVnYXRvciIvPgorICAgICAgICAgIDwvUHJvcGVydGllcz4KKyAgICAgICAgPC9Db21wb25lbnQ+CisgICAgICAgIDxDb21wb25lbnQgY2xhc3M9ImphdmF4LnN3aW5nLkpMYWJlbCIgbmFtZT0idHdpdHRlckNvbG9yTGFiZWwiPgorICAgICAgICAgIDxQcm9wZXJ0aWVzPgorICAgICAgICAgICAgPFByb3BlcnR5IG5hbWU9ImJhY2tncm91bmQiIHR5cGU9ImphdmEuYXd0LkNvbG9yIiBlZGl0b3I9Im9yZy5uZXRiZWFucy5iZWFuaW5mby5lZGl0b3JzLkNvbG9yRWRpdG9yIj4KKyAgICAgICAgICAgICAgPENvbG9yIGJsdWU9IjAiIGdyZWVuPSJhYSIgcmVkPSI1NSIgdHlwZT0icmdiIi8+CisgICAgICAgICAgICA8L1Byb3BlcnR5PgorICAgICAgICAgICAgPFByb3BlcnR5IG5hbWU9InRleHQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHZhbHVlPSIgICAgIi8+CisgICAgICAgICAgICA8UHJvcGVydHkgbmFtZT0ib3BhcXVlIiB0eXBlPSJib29sZWFuIiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgICAgIDwvUHJvcGVydGllcz4KKyAgICAgICAgPC9Db21wb25lbnQ+CisgICAgICAgIDxDb21wb25lbnQgY2xhc3M9ImphdmF4LnN3aW5nLkpMYWJlbCIgbmFtZT0idGVzdENvbG9yTGFiZWwiPgorICAgICAgICAgIDxQcm9wZXJ0aWVzPgorICAgICAgICAgICAgPFByb3BlcnR5IG5hbWU9ImJhY2tncm91bmQiIHR5cGU9ImphdmEuYXd0LkNvbG9yIiBlZGl0b3I9Im9yZy5uZXRiZWFucy5iZWFuaW5mby5lZGl0b3JzLkNvbG9yRWRpdG9yIj4KKyAgICAgICAgICAgICAgPENvbG9yIGJsdWU9ImFhIiBncmVlbj0iNTUiIHJlZD0iMCIgdHlwZT0icmdiIi8+CisgICAgICAgICAgICA8L1Byb3BlcnR5PgorICAgICAgICAgICAgPFByb3BlcnR5IG5hbWU9InRleHQiIHR5cGU9ImphdmEubGFuZy5TdHJpbmciIHZhbHVlPSIgICAgIi8+CisgICAgICAgICAgICA8UHJvcGVydHkgbmFtZT0ib3BhcXVlIiB0eXBlPSJib29sZWFuIiB2YWx1ZT0idHJ1ZSIvPgorICAgICAgICAgIDwvUHJvcGVydGllcz4KKyAgICAgICAgPC9Db21wb25lbnQ+CisgICAgICAgIDxDb21wb25lbnQgY2xhc3M9ImphdmF4LnN3aW5nLkpDaGVja0JveCIgbmFtZT0idGVzdENoZWNrYm94Ij4KKyAgICAgICAgICA8UHJvcGVydGllcz4KKyAgICAgICAgICAgIDxQcm9wZXJ0eSBuYW1lPSJ0ZXh0IiB0eXBlPSJqYXZhLmxhbmcuU3RyaW5nIiB2YWx1ZT0iVGVzdCBBZ2dyZWdhdG9yIi8+CisgICAgICAgICAgPC9Qcm9wZXJ0aWVzPgorICAgICAgICA8L0NvbXBvbmVudD4KKyAgICAgIDwvU3ViQ29tcG9uZW50cz4KKyAgICA8L0NvbnRhaW5lcj4KKyAgPC9TdWJDb21wb25lbnRzPgorPC9Gb3JtPgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc3NlLXR3aXR0ZXItYWdncmVnYXRvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2FnZ3JlZ2F0b3IvTWFpbldpbmRvdy5qYXZhIGIvZXhhbXBsZXMvc3NlLXR3aXR0ZXItYWdncmVnYXRvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2FnZ3JlZ2F0b3IvTWFpbldpbmRvdy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwOGMyODgKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zc2UtdHdpdHRlci1hZ2dyZWdhdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYWdncmVnYXRvci9NYWluV2luZG93LmphdmEKQEAgLTAsMCArMSw0MjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuYWdncmVnYXRvcjsKKworaW1wb3J0IGphdmEuYXd0LkNvbG9yOworaW1wb3J0IGphdmEuYXd0LkV2ZW50UXVldWU7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CisKK2ltcG9ydCBqYXZheC5zd2luZy5BY3Rpb25NYXA7CitpbXBvcnQgamF2YXguc3dpbmcuRGVmYXVsdExpc3RNb2RlbDsKK2ltcG9ydCBqYXZheC5zd2luZy5JbnB1dE1hcDsKK2ltcG9ydCBqYXZheC5zd2luZy5KQ29tcG9uZW50OworaW1wb3J0IGphdmF4LnN3aW5nLktleVN0cm9rZTsKK2ltcG9ydCBqYXZheC5zd2luZy5XaW5kb3dDb25zdGFudHM7CisKKy8qKgorICogTWFpbiBkYXRhIGFnZ3JlZ2F0b3IgY2xpZW50IGFwcGxpY2F0aW9uIFVJIHdpbmRvdy4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgTWFpbldpbmRvdyBleHRlbmRzIGphdmF4LnN3aW5nLkpGcmFtZSB7CisKKyAgICBwcml2YXRlIGZpbmFsIERlZmF1bHRMaXN0TW9kZWwga2V5d29yZExpc3RNb2RlbDsKKyAgICBwcml2YXRlIGZpbmFsIEF0b21pY0Jvb2xlYW4gcmVjZWl2ZU1lc3NhZ2VzOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxEYXRhQWdncmVnYXRvcj4gZGF0YUFnZ3JlZ2F0b3JzOworCisgICAgLy8gVmFyaWFibGVzIGRlY2xhcmF0aW9uIC0gZG8gbm90IG1vZGlmeS8vR0VOLUJFR0lOOnZhcmlhYmxlcworICAgIHByaXZhdGUgamF2YXguc3dpbmcuSkJ1dHRvbiBhZGRCdXR0b247CisgICAgcHJpdmF0ZSBqYXZheC5zd2luZy5KTGFiZWwgY29ubmVjdGlvblN0YXR1c0xhYmVsOworICAgIHByaXZhdGUgamF2YXguc3dpbmcuSlBhbmVsIGpQYW5lbDQ7CisgICAgcHJpdmF0ZSBqYXZheC5zd2luZy5KTGlzdCBrZXl3b3JkTGlzdDsKKyAgICBwcml2YXRlIGphdmF4LnN3aW5nLkpUZXh0QXJlYSBtZXNzYWdlc0FyZWE7CisgICAgcHJpdmF0ZSBqYXZheC5zd2luZy5KVGV4dEZpZWxkIG5ld0tleXdvcmRGaWVsZDsKKyAgICBwcml2YXRlIGphdmF4LnN3aW5nLkpCdXR0b24gc3RhcnRTdG9wQnV0dG9uOworICAgIHByaXZhdGUgamF2YXguc3dpbmcuSkNoZWNrQm94IHRlc3RDaGVja2JveDsKKyAgICBwcml2YXRlIGphdmF4LnN3aW5nLkpMYWJlbCB0ZXN0Q29sb3JMYWJlbDsKKyAgICBwcml2YXRlIGphdmF4LnN3aW5nLkpDaGVja0JveCB0d2l0dGVyQ2hlY2tib3g7CisgICAgcHJpdmF0ZSBqYXZheC5zd2luZy5KTGFiZWwgdHdpdHRlckNvbG9yTGFiZWw7CisgICAgLy8gRW5kIG9mIHZhcmlhYmxlcyBkZWNsYXJhdGlvbi8vR0VOLUVORDp2YXJpYWJsZXMKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgbmV3IGZvcm0gTWVzc2FnZUFnZ3JlZ2F0b3IKKyAgICAgKi8KKyAgICBwdWJsaWMgTWFpbldpbmRvdygpIHsKKyAgICAgICAga2V5d29yZExpc3RNb2RlbCA9IG5ldyBEZWZhdWx0TGlzdE1vZGVsKCk7CisgICAgICAgIHJlY2VpdmVNZXNzYWdlcyA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKworICAgICAgICBpbml0Q29tcG9uZW50cygpOworCisgICAgICAgIC8vIEJpbmQgInJlbW92ZSBzZWxlY3RlZCBsaXN0IGl0ZW1zIiBhY3Rpb24gdG8gREVMRVRFIGtleSBwcmVzc2VkIGluIGtleXdvcmQgbGlzdC4KKyAgICAgICAgQWN0aW9uTWFwIGFjdGlvbk1hcCA9IGtleXdvcmRMaXN0LmdldEFjdGlvbk1hcCgpOworICAgICAgICBJbnB1dE1hcCBpbnB1dE1hcCA9IGtleXdvcmRMaXN0LmdldElucHV0TWFwKEpDb21wb25lbnQuV0hFTl9GT0NVU0VEKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgYWN0aW9uS2V5ID0gIlJlbW92ZVNlbGVjdGVkTGlzdEl0ZW1zIjsKKyAgICAgICAgYWN0aW9uTWFwLnB1dChhY3Rpb25LZXksIG5ldyBSZW1vdmVTZWxlY3RlZExpc3RJdGVtc0FjdGlvbihrZXl3b3JkTGlzdCwga2V5d29yZExpc3RNb2RlbCkpOworICAgICAgICBpbnB1dE1hcC5wdXQoS2V5U3Ryb2tlLmdldEtleVN0cm9rZShLZXlFdmVudC5WS19ERUxFVEUsIDApLCBhY3Rpb25LZXkpOworCisgICAgICAgIGRhdGFBZ2dyZWdhdG9ycyA9IG5ldyBBcnJheUxpc3Q8RGF0YUFnZ3JlZ2F0b3I+KDIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0QWdncmVnYXRvcnMoKSB7CisgICAgICAgIGlmICh0d2l0dGVyQ2hlY2tib3guaXNTZWxlY3RlZCgpKSB7CisgICAgICAgICAgICBkYXRhQWdncmVnYXRvcnMuYWRkKG5ldyBUd2l0dGVyQWdncmVnYXRvcihjb2xvclRvU3RyaW5nKHR3aXR0ZXJDb2xvckxhYmVsLmdldEJhY2tncm91bmQoKSkpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGVzdENoZWNrYm94LmlzU2VsZWN0ZWQoKSkgeworICAgICAgICAgICAgZGF0YUFnZ3JlZ2F0b3JzLmFkZChuZXcgVGVzdEFnZ3JlZ2F0b3JKZXJzZXkoY29sb3JUb1N0cmluZyh0ZXN0Q29sb3JMYWJlbC5nZXRCYWNrZ3JvdW5kKCkpKSk7CisgICAgICAgICAgICBkYXRhQWdncmVnYXRvcnMuYWRkKG5ldyBUZXN0QWdncmVnYXRvckpheFJzKGNvbG9yVG9TdHJpbmcodGVzdENvbG9yTGFiZWwuZ2V0QmFja2dyb3VuZCgpKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgY29sb3JUb1N0cmluZyhDb2xvciBjb2xvcikgeworICAgICAgICBTdHJpbmdCdWlsZGVyIGNvbG9yQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKyAgICAgICAgY29sb3JCdWlsZGVyCisgICAgICAgICAgICAgICAgLmFwcGVuZChTdHJpbmcuZm9ybWF0KCIlMDJYIiwgY29sb3IuZ2V0UmVkKCkpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiJTAyWCIsIGNvbG9yLmdldEdyZWVuKCkpKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoU3RyaW5nLmZvcm1hdCgiJTAyWCIsIGNvbG9yLmdldEJsdWUoKSkpOworCisgICAgICAgIHJldHVybiBjb2xvckJ1aWxkZXIudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgb25LZXl3b3JkRW50ZXJlZChqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudCBldnQpIHsvL0dFTi1GSVJTVDpldmVudF9vbktleXdvcmRFbnRlcmVkCisgICAgICAgIGZpbmFsIFN0cmluZyBrZXl3b3JkID0gbmV3S2V5d29yZEZpZWxkLmdldFRleHQoKTsKKyAgICAgICAgaWYgKGtleXdvcmQgPT0gbnVsbCB8fCBrZXl3b3JkLmlzRW1wdHkoKSB8fCBrZXl3b3JkTGlzdE1vZGVsLmNvbnRhaW5zKGtleXdvcmQpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYWRkQnV0dG9uLmRvQ2xpY2soKTsKKyAgICB9Ly9HRU4tTEFTVDpldmVudF9vbktleXdvcmRFbnRlcmVkCisKKyAgICBwcml2YXRlIHZvaWQgb25BZGQoamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQgZXZ0KSB7Ly9HRU4tRklSU1Q6ZXZlbnRfb25BZGQKKyAgICAgICAgZmluYWwgU3RyaW5nIGtleXdvcmQgPSBuZXdLZXl3b3JkRmllbGQuZ2V0VGV4dCgpOworICAgICAgICBpZiAoa2V5d29yZCA9PSBudWxsIHx8IGtleXdvcmQuaXNFbXB0eSgpIHx8IGtleXdvcmRMaXN0TW9kZWwuY29udGFpbnMoa2V5d29yZCkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGtleXdvcmRMaXN0TW9kZWwuYWRkRWxlbWVudChrZXl3b3JkKTsKKyAgICAgICAgbmV3S2V5d29yZEZpZWxkLnNldFRleHQoIiIpOworICAgIH0vL0dFTi1MQVNUOmV2ZW50X29uQWRkCisKKyAgICBwcml2YXRlIHZvaWQgb25TdGFydE9yU3RvcChqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudCBldnQpIHsvL0dFTi1GSVJTVDpldmVudF9vblN0YXJ0T3JTdG9wCisgICAgICAgIGlmIChyZWNlaXZlTWVzc2FnZXMuZ2V0KCkpIHsKKyAgICAgICAgICAgIC8vIHN0b3AKKyAgICAgICAgICAgIHJlY2VpdmVNZXNzYWdlcy5zZXQoZmFsc2UpOworICAgICAgICAgICAgc3RhcnRTdG9wQnV0dG9uLnNldFRleHQoIlN0YXJ0Iik7CisgICAgICAgICAgICBuZXdLZXl3b3JkRmllbGQuc2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgIGFkZEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOworICAgICAgICAgICAgc3RvcCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gc3RhcnQKKyAgICAgICAgICAgIHJlY2VpdmVNZXNzYWdlcy5zZXQodHJ1ZSk7CisgICAgICAgICAgICBzdGFydFN0b3BCdXR0b24uc2V0VGV4dCgiU3RvcCIpOworICAgICAgICAgICAgY29ubmVjdGlvblN0YXR1c0xhYmVsLnNldFRleHQoIkNvbm5lY3RpbmcuLi4iKTsKKyAgICAgICAgICAgIG5ld0tleXdvcmRGaWVsZC5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgIGFkZEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgIG1lc3NhZ2VzQXJlYS5zZXRUZXh0KCIiKTsKKworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBrZXl3b3Jkc0J1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgZmluYWwgRW51bWVyYXRpb248Pz4gZWxlbWVudHMgPSBrZXl3b3JkTGlzdE1vZGVsLmVsZW1lbnRzKCk7CisgICAgICAgICAgICB3aGlsZSAoZWxlbWVudHMuaGFzTW9yZUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICBrZXl3b3Jkc0J1aWxkZXIuYXBwZW5kKGVsZW1lbnRzLm5leHRFbGVtZW50KCkpOworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50cy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgICAgICAgICBrZXl3b3Jkc0J1aWxkZXIuYXBwZW5kKCIsIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGFydChrZXl3b3Jkc0J1aWxkZXIudG9TdHJpbmcoKSwgbmV3IERhdGFMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0KCkgeworICAgICAgICAgICAgICAgICAgICBFdmVudFF1ZXVlLmludm9rZUxhdGVyKCgpIC0+IGNvbm5lY3Rpb25TdGF0dXNMYWJlbC5zZXRUZXh0KCJDb25uZWN0ZWQuIikpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uTWVzc2FnZShmaW5hbCBNZXNzYWdlIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgRXZlbnRRdWV1ZS5pbnZva2VMYXRlcigoKSAtPiBtZXNzYWdlc0FyZWEuYXBwZW5kKG1lc3NhZ2UuZ2V0VGV4dCgpICsgIlxuXG4iKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcigpIHsKKyAgICAgICAgICAgICAgICAgICAgRXZlbnRRdWV1ZS5pbnZva2VMYXRlcigoKSAtPiB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uU3RhdHVzTGFiZWwuc2V0VGV4dCgiQ29ubmVjdGlvbiBFcnJvciEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVNZXNzYWdlcy5zZXQoZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRTdG9wQnV0dG9uLnNldFRleHQoIlN0YXJ0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdLZXl3b3JkRmllbGQuc2V0RW5hYmxlZCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOworICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKCkgeworICAgICAgICAgICAgICAgICAgICBFdmVudFF1ZXVlLmludm9rZUxhdGVyKCgpIC0+IGNvbm5lY3Rpb25TdGF0dXNMYWJlbC5zZXRUZXh0KCJEaXNjb25uZWN0ZWQuIikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICB9Ly9HRU4tTEFTVDpldmVudF9vblN0YXJ0T3JTdG9wCisKKyAgICBwcml2YXRlIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgZm9yIChEYXRhQWdncmVnYXRvciBkYXRhQWdncmVnYXRvciA6IGRhdGFBZ2dyZWdhdG9ycykgeworICAgICAgICAgICAgZGF0YUFnZ3JlZ2F0b3Iuc3RvcCgpOworICAgICAgICB9CisgICAgICAgIGRhdGFBZ2dyZWdhdG9ycy5jbGVhcigpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdGFydChTdHJpbmcga2V5d29yZHMsIERhdGFMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBpbml0QWdncmVnYXRvcnMoKTsKKworICAgICAgICBmb3IgKERhdGFBZ2dyZWdhdG9yIGRhdGFBZ2dyZWdhdG9yIDogZGF0YUFnZ3JlZ2F0b3JzKSB7CisgICAgICAgICAgICBkYXRhQWdncmVnYXRvci5zdGFydChrZXl3b3JkcywgbGlzdGVuZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGFyZ3MgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcgYXJnc1tdKSB7CisgICAgICAgIC8qIENyZWF0ZSBhbmQgZGlzcGxheSB0aGUgZm9ybSAqLworICAgICAgICBFdmVudFF1ZXVlLmludm9rZUxhdGVyKCgpIC0+IHsKKyAgICAgICAgICAgIGZpbmFsIE1haW5XaW5kb3cgbWVzc2FnZUFnZ3JlZ2F0b3IgPSBuZXcgTWFpbldpbmRvdygpOworICAgICAgICAgICAgbWVzc2FnZUFnZ3JlZ2F0b3Iuc2V0TG9jYXRpb25SZWxhdGl2ZVRvKG51bGwpOworICAgICAgICAgICAgbWVzc2FnZUFnZ3JlZ2F0b3Iuc2V0VmlzaWJsZSh0cnVlKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGZyb20gd2l0aGluIHRoZSBjb25zdHJ1Y3RvciB0bworICAgICAqIGluaXRpYWxpemUgdGhlIGZvcm0uCisgICAgICogV0FSTklORzogRG8gTk9UIG1vZGlmeSB0aGlzIGNvZGUuIFRoZSBjb250ZW50IG9mIHRoaXMgbWV0aG9kIGlzCisgICAgICogYWx3YXlzIHJlZ2VuZXJhdGVkIGJ5IHRoZSBGb3JtIEVkaXRvci4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAvLyA8ZWRpdG9yLWZvbGQgZGVmYXVsdHN0YXRlPSJjb2xsYXBzZWQiIGRlc2M9IkdlbmVyYXRlZCBDb2RlIj4vL0dFTi1CRUdJTjppbml0Q29tcG9uZW50cworICAgIHByaXZhdGUgdm9pZCBpbml0Q29tcG9uZW50cygpIHsKKworICAgICAgICBqYXZheC5zd2luZy5KUGFuZWwgalBhbmVsMyA9IG5ldyBqYXZheC5zd2luZy5KUGFuZWwoKTsKKyAgICAgICAgbmV3S2V5d29yZEZpZWxkID0gbmV3IGphdmF4LnN3aW5nLkpUZXh0RmllbGQoKTsKKyAgICAgICAgYWRkQnV0dG9uID0gbmV3IGphdmF4LnN3aW5nLkpCdXR0b24oKTsKKyAgICAgICAgamF2YXguc3dpbmcuSlBhbmVsIGpQYW5lbDEgPSBuZXcgamF2YXguc3dpbmcuSlBhbmVsKCk7CisgICAgICAgIGNvbm5lY3Rpb25TdGF0dXNMYWJlbCA9IG5ldyBqYXZheC5zd2luZy5KTGFiZWwoKTsKKyAgICAgICAgc3RhcnRTdG9wQnV0dG9uID0gbmV3IGphdmF4LnN3aW5nLkpCdXR0b24oKTsKKyAgICAgICAgamF2YXguc3dpbmcuSlNjcm9sbFBhbmUgalNjcm9sbFBhbmUyID0gbmV3IGphdmF4LnN3aW5nLkpTY3JvbGxQYW5lKCk7CisgICAgICAgIG1lc3NhZ2VzQXJlYSA9IG5ldyBqYXZheC5zd2luZy5KVGV4dEFyZWEoKTsKKyAgICAgICAgamF2YXguc3dpbmcuSlBhbmVsIGpQYW5lbDIgPSBuZXcgamF2YXguc3dpbmcuSlBhbmVsKCk7CisgICAgICAgIGphdmF4LnN3aW5nLkpTY3JvbGxQYW5lIGpTY3JvbGxQYW5lMSA9IG5ldyBqYXZheC5zd2luZy5KU2Nyb2xsUGFuZSgpOworICAgICAgICBrZXl3b3JkTGlzdCA9IG5ldyBqYXZheC5zd2luZy5KTGlzdCgpOworICAgICAgICBqUGFuZWw0ID0gbmV3IGphdmF4LnN3aW5nLkpQYW5lbCgpOworICAgICAgICB0d2l0dGVyQ2hlY2tib3ggPSBuZXcgamF2YXguc3dpbmcuSkNoZWNrQm94KCk7CisgICAgICAgIHR3aXR0ZXJDb2xvckxhYmVsID0gbmV3IGphdmF4LnN3aW5nLkpMYWJlbCgpOworICAgICAgICB0ZXN0Q29sb3JMYWJlbCA9IG5ldyBqYXZheC5zd2luZy5KTGFiZWwoKTsKKyAgICAgICAgdGVzdENoZWNrYm94ID0gbmV3IGphdmF4LnN3aW5nLkpDaGVja0JveCgpOworCisgICAgICAgIHNldERlZmF1bHRDbG9zZU9wZXJhdGlvbihXaW5kb3dDb25zdGFudHMuRElTUE9TRV9PTl9DTE9TRSk7CisgICAgICAgIHNldFRpdGxlKCJNZXNzYWdlIGFnZ3JlZ2F0b3IiKTsKKyAgICAgICAgc2V0TWluaW11bVNpemUobmV3IGphdmEuYXd0LkRpbWVuc2lvbigzMDQsIDMwMCkpOworCisgICAgICAgIGpQYW5lbDMuc2V0Qm9yZGVyKGphdmF4LnN3aW5nLkJvcmRlckZhY3RvcnkuY3JlYXRlRXRjaGVkQm9yZGVyKCkpOworCisgICAgICAgIG5ld0tleXdvcmRGaWVsZC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQgZXZ0KSB7CisgICAgICAgICAgICAgICAgb25LZXl3b3JkRW50ZXJlZChldnQpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBhZGRCdXR0b24uc2V0VGV4dCgiQWRkIik7CisgICAgICAgIGFkZEJ1dHRvbi5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgamF2YS5hd3QuZXZlbnQuQWN0aW9uTGlzdGVuZXIoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQgZXZ0KSB7CisgICAgICAgICAgICAgICAgb25BZGQoZXZ0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgb3JnLmpkZXNrdG9wLmxheW91dC5Hcm91cExheW91dCBqUGFuZWwzTGF5b3V0ID0gbmV3IG9yZy5qZGVza3RvcC5sYXlvdXQuR3JvdXBMYXlvdXQoalBhbmVsMyk7CisgICAgICAgIGpQYW5lbDMuc2V0TGF5b3V0KGpQYW5lbDNMYXlvdXQpOworICAgICAgICBqUGFuZWwzTGF5b3V0LnNldEhvcml6b250YWxHcm91cCgKKyAgICAgICAgICAgICAgICBqUGFuZWwzTGF5b3V0LmNyZWF0ZVBhcmFsbGVsR3JvdXAob3JnLmpkZXNrdG9wLmxheW91dC5Hcm91cExheW91dC5MRUFESU5HKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChqUGFuZWwzTGF5b3V0LmNyZWF0ZVNlcXVlbnRpYWxHcm91cCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDb250YWluZXJHYXAoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKG5ld0tleXdvcmRGaWVsZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFByZWZlcnJlZEdhcChvcmcuamRlc2t0b3AubGF5b3V0LkxheW91dFN0eWxlLlJFTEFURUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoYWRkQnV0dG9uLCBvcmcuamRlc2t0b3AubGF5b3V0Lkdyb3VwTGF5b3V0LlBSRUZFUlJFRF9TSVpFLCA3MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuamRlc2t0b3AubGF5b3V0Lkdyb3VwTGF5b3V0LlBSRUZFUlJFRF9TSVpFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ29udGFpbmVyR2FwKCkpCisgICAgICAgICk7CisgICAgICAgIGpQYW5lbDNMYXlvdXQuc2V0VmVydGljYWxHcm91cCgKKyAgICAgICAgICAgICAgICBqUGFuZWwzTGF5b3V0LmNyZWF0ZVBhcmFsbGVsR3JvdXAob3JnLmpkZXNrdG9wLmxheW91dC5Hcm91cExheW91dC5MRUFESU5HKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChqUGFuZWwzTGF5b3V0LmNyZWF0ZVNlcXVlbnRpYWxHcm91cCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDb250YWluZXJHYXAoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKGpQYW5lbDNMYXlvdXQuY3JlYXRlUGFyYWxsZWxHcm91cChvcmcuamRlc2t0b3AubGF5b3V0Lkdyb3VwTGF5b3V0LkJBU0VMSU5FKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQobmV3S2V5d29yZEZpZWxkLCBvcmcuamRlc2t0b3AubGF5b3V0Lkdyb3VwTGF5b3V0LlBSRUZFUlJFRF9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmpkZXNrdG9wLmxheW91dC5Hcm91cExheW91dC5ERUZBVUxUX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuamRlc2t0b3AubGF5b3V0Lkdyb3VwTGF5b3V0LlBSRUZFUlJFRF9TSVpFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoYWRkQnV0dG9uKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENvbnRhaW5lckdhcChvcmcuamRlc2t0b3AubGF5b3V0Lkdyb3VwTGF5b3V0LkRFRkFVTFRfU0laRSwgU2hvcnQuTUFYX1ZBTFVFKSkKKyAgICAgICAgKTsKKworICAgICAgICBqUGFuZWwxLnNldEJvcmRlcihqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5LmNyZWF0ZUV0Y2hlZEJvcmRlcigpKTsKKworICAgICAgICBzdGFydFN0b3BCdXR0b24uc2V0VGV4dCgiU3RhcnQiKTsKKyAgICAgICAgc3RhcnRTdG9wQnV0dG9uLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBqYXZhLmF3dC5ldmVudC5BY3Rpb25MaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFjdGlvblBlcmZvcm1lZChqYXZhLmF3dC5ldmVudC5BY3Rpb25FdmVudCBldnQpIHsKKyAgICAgICAgICAgICAgICBvblN0YXJ0T3JTdG9wKGV2dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIG1lc3NhZ2VzQXJlYS5zZXRDb2x1bW5zKDIwKTsKKyAgICAgICAgbWVzc2FnZXNBcmVhLnNldExpbmVXcmFwKHRydWUpOworICAgICAgICBtZXNzYWdlc0FyZWEuc2V0Um93cyg1KTsKKyAgICAgICAgbWVzc2FnZXNBcmVhLnNldFdyYXBTdHlsZVdvcmQodHJ1ZSk7CisgICAgICAgIG1lc3NhZ2VzQXJlYS5zZXRGb2N1c2FibGUoZmFsc2UpOworICAgICAgICBqU2Nyb2xsUGFuZTIuc2V0Vmlld3BvcnRWaWV3KG1lc3NhZ2VzQXJlYSk7CisKKyAgICAgICAgb3JnLmpkZXNrdG9wLmxheW91dC5Hcm91cExheW91dCBqUGFuZWwxTGF5b3V0ID0gbmV3IG9yZy5qZGVza3RvcC5sYXlvdXQuR3JvdXBMYXlvdXQoalBhbmVsMSk7CisgICAgICAgIGpQYW5lbDEuc2V0TGF5b3V0KGpQYW5lbDFMYXlvdXQpOworICAgICAgICBqUGFuZWwxTGF5b3V0LnNldEhvcml6b250YWxHcm91cCgKKyAgICAgICAgICAgICAgICBqUGFuZWwxTGF5b3V0LmNyZWF0ZVBhcmFsbGVsR3JvdXAob3JnLmpkZXNrdG9wLmxheW91dC5Hcm91cExheW91dC5MRUFESU5HKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChqUGFuZWwxTGF5b3V0LmNyZWF0ZVNlcXVlbnRpYWxHcm91cCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDb250YWluZXJHYXAoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKGpQYW5lbDFMYXlvdXQuY3JlYXRlUGFyYWxsZWxHcm91cChvcmcuamRlc2t0b3AubGF5b3V0Lkdyb3VwTGF5b3V0LkxFQURJTkcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChqUGFuZWwxTGF5b3V0LmNyZWF0ZVNlcXVlbnRpYWxHcm91cCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKGpTY3JvbGxQYW5lMiwgb3JnLmpkZXNrdG9wLmxheW91dC5Hcm91cExheW91dC5ERUZBVUxUX1NJWkUsIDI0NywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hvcnQuTUFYX1ZBTFVFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENvbnRhaW5lckdhcCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoalBhbmVsMUxheW91dC5jcmVhdGVTZXF1ZW50aWFsR3JvdXAoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChjb25uZWN0aW9uU3RhdHVzTGFiZWwsIG9yZy5qZGVza3RvcC5sYXlvdXQuR3JvdXBMYXlvdXQuREVGQVVMVF9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuamRlc2t0b3AubGF5b3V0Lkdyb3VwTGF5b3V0LkRFRkFVTFRfU0laRSwgU2hvcnQuTUFYX1ZBTFVFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFByZWZlcnJlZEdhcChvcmcuamRlc2t0b3AubGF5b3V0LkxheW91dFN0eWxlLlJFTEFURUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKHN0YXJ0U3RvcEJ1dHRvbikpKSkKKyAgICAgICAgKTsKKyAgICAgICAgalBhbmVsMUxheW91dC5zZXRWZXJ0aWNhbEdyb3VwKAorICAgICAgICAgICAgICAgIGpQYW5lbDFMYXlvdXQuY3JlYXRlUGFyYWxsZWxHcm91cChvcmcuamRlc2t0b3AubGF5b3V0Lkdyb3VwTGF5b3V0LkxFQURJTkcpCisgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKGpQYW5lbDFMYXlvdXQuY3JlYXRlU2VxdWVudGlhbEdyb3VwKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENvbnRhaW5lckdhcCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoalBhbmVsMUxheW91dC5jcmVhdGVQYXJhbGxlbEdyb3VwKG9yZy5qZGVza3RvcC5sYXlvdXQuR3JvdXBMYXlvdXQuQkFTRUxJTkUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChzdGFydFN0b3BCdXR0b24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChjb25uZWN0aW9uU3RhdHVzTGFiZWwpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUHJlZmVycmVkR2FwKG9yZy5qZGVza3RvcC5sYXlvdXQuTGF5b3V0U3R5bGUuUkVMQVRFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChqU2Nyb2xsUGFuZTIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDb250YWluZXJHYXAoKSkKKyAgICAgICAgKTsKKworICAgICAgICBqUGFuZWwyLnNldEJvcmRlcihqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5LmNyZWF0ZUV0Y2hlZEJvcmRlcigpKTsKKworICAgICAgICBrZXl3b3JkTGlzdC5zZXRNb2RlbChrZXl3b3JkTGlzdE1vZGVsKTsKKyAgICAgICAgalNjcm9sbFBhbmUxLnNldFZpZXdwb3J0VmlldyhrZXl3b3JkTGlzdCk7CisKKyAgICAgICAgb3JnLmpkZXNrdG9wLmxheW91dC5Hcm91cExheW91dCBqUGFuZWwyTGF5b3V0ID0gbmV3IG9yZy5qZGVza3RvcC5sYXlvdXQuR3JvdXBMYXlvdXQoalBhbmVsMik7CisgICAgICAgIGpQYW5lbDIuc2V0TGF5b3V0KGpQYW5lbDJMYXlvdXQpOworICAgICAgICBqUGFuZWwyTGF5b3V0LnNldEhvcml6b250YWxHcm91cCgKKyAgICAgICAgICAgICAgICBqUGFuZWwyTGF5b3V0LmNyZWF0ZVBhcmFsbGVsR3JvdXAob3JnLmpkZXNrdG9wLmxheW91dC5Hcm91cExheW91dC5MRUFESU5HKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChqUGFuZWwyTGF5b3V0LmNyZWF0ZVNlcXVlbnRpYWxHcm91cCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDb250YWluZXJHYXAoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKGpTY3JvbGxQYW5lMSwgb3JnLmpkZXNrdG9wLmxheW91dC5Hcm91cExheW91dC5ERUZBVUxUX1NJWkUsIDk3LCBTaG9ydC5NQVhfVkFMVUUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDb250YWluZXJHYXAoKSkKKyAgICAgICAgKTsKKyAgICAgICAgalBhbmVsMkxheW91dC5zZXRWZXJ0aWNhbEdyb3VwKAorICAgICAgICAgICAgICAgIGpQYW5lbDJMYXlvdXQuY3JlYXRlUGFyYWxsZWxHcm91cChvcmcuamRlc2t0b3AubGF5b3V0Lkdyb3VwTGF5b3V0LkxFQURJTkcpCisgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKGpQYW5lbDJMYXlvdXQuY3JlYXRlU2VxdWVudGlhbEdyb3VwKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENvbnRhaW5lckdhcCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoalNjcm9sbFBhbmUxLCBvcmcuamRlc2t0b3AubGF5b3V0Lkdyb3VwTGF5b3V0LkRFRkFVTFRfU0laRSwgMzMyLCBTaG9ydC5NQVhfVkFMVUUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDb250YWluZXJHYXAoKSkKKyAgICAgICAgKTsKKworICAgICAgICBqUGFuZWw0LnNldEJvcmRlcihqYXZheC5zd2luZy5Cb3JkZXJGYWN0b3J5LmNyZWF0ZUV0Y2hlZEJvcmRlcigpKTsKKworICAgICAgICB0d2l0dGVyQ2hlY2tib3guc2V0U2VsZWN0ZWQodHJ1ZSk7CisgICAgICAgIHR3aXR0ZXJDaGVja2JveC5zZXRUZXh0KCJUd2l0dGVyIGFnZ3JlZ2F0b3IiKTsKKworICAgICAgICB0d2l0dGVyQ29sb3JMYWJlbC5zZXRCYWNrZ3JvdW5kKG5ldyBqYXZhLmF3dC5Db2xvcig4NSwgMTcwLCAwKSk7CisgICAgICAgIHR3aXR0ZXJDb2xvckxhYmVsLnNldFRleHQoIiAgICAiKTsKKyAgICAgICAgdHdpdHRlckNvbG9yTGFiZWwuc2V0T3BhcXVlKHRydWUpOworCisgICAgICAgIHRlc3RDb2xvckxhYmVsLnNldEJhY2tncm91bmQobmV3IGphdmEuYXd0LkNvbG9yKDAsIDg1LCAxNzApKTsKKyAgICAgICAgdGVzdENvbG9yTGFiZWwuc2V0VGV4dCgiICAgICIpOworICAgICAgICB0ZXN0Q29sb3JMYWJlbC5zZXRPcGFxdWUodHJ1ZSk7CisKKyAgICAgICAgdGVzdENoZWNrYm94LnNldFRleHQoIlRlc3QgQWdncmVnYXRvciIpOworCisgICAgICAgIG9yZy5qZGVza3RvcC5sYXlvdXQuR3JvdXBMYXlvdXQgalBhbmVsNExheW91dCA9IG5ldyBvcmcuamRlc2t0b3AubGF5b3V0Lkdyb3VwTGF5b3V0KGpQYW5lbDQpOworICAgICAgICBqUGFuZWw0LnNldExheW91dChqUGFuZWw0TGF5b3V0KTsKKyAgICAgICAgalBhbmVsNExheW91dC5zZXRIb3Jpem9udGFsR3JvdXAoCisgICAgICAgICAgICAgICAgalBhbmVsNExheW91dC5jcmVhdGVQYXJhbGxlbEdyb3VwKG9yZy5qZGVza3RvcC5sYXlvdXQuR3JvdXBMYXlvdXQuTEVBRElORykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoalBhbmVsNExheW91dC5jcmVhdGVTZXF1ZW50aWFsR3JvdXAoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ29udGFpbmVyR2FwKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChqUGFuZWw0TGF5b3V0LmNyZWF0ZVBhcmFsbGVsR3JvdXAob3JnLmpkZXNrdG9wLmxheW91dC5Hcm91cExheW91dC5MRUFESU5HKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQob3JnLmpkZXNrdG9wLmxheW91dC5Hcm91cExheW91dC5UUkFJTElORywgalBhbmVsNExheW91dC5jcmVhdGVTZXF1ZW50aWFsR3JvdXAoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZCh0d2l0dGVyQ29sb3JMYWJlbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRQcmVmZXJyZWRHYXAob3JnLmpkZXNrdG9wLmxheW91dC5MYXlvdXRTdHlsZS5SRUxBVEVEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZCh0d2l0dGVyQ2hlY2tib3gsIG9yZy5qZGVza3RvcC5sYXlvdXQuR3JvdXBMYXlvdXQuREVGQVVMVF9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuamRlc2t0b3AubGF5b3V0Lkdyb3VwTGF5b3V0LkRFRkFVTFRfU0laRSwgU2hvcnQuTUFYX1ZBTFVFKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKG9yZy5qZGVza3RvcC5sYXlvdXQuR3JvdXBMYXlvdXQuVFJBSUxJTkcsIGpQYW5lbDRMYXlvdXQuY3JlYXRlU2VxdWVudGlhbEdyb3VwKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQodGVzdENvbG9yTGFiZWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUHJlZmVycmVkR2FwKG9yZy5qZGVza3RvcC5sYXlvdXQuTGF5b3V0U3R5bGUuUkVMQVRFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQodGVzdENoZWNrYm94LCBvcmcuamRlc2t0b3AubGF5b3V0Lkdyb3VwTGF5b3V0LkRFRkFVTFRfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmpkZXNrdG9wLmxheW91dC5Hcm91cExheW91dC5ERUZBVUxUX1NJWkUsIFNob3J0Lk1BWF9WQUxVRSkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ29udGFpbmVyR2FwKCkpCisgICAgICAgICk7CisgICAgICAgIGpQYW5lbDRMYXlvdXQuc2V0VmVydGljYWxHcm91cCgKKyAgICAgICAgICAgICAgICBqUGFuZWw0TGF5b3V0LmNyZWF0ZVBhcmFsbGVsR3JvdXAob3JnLmpkZXNrdG9wLmxheW91dC5Hcm91cExheW91dC5MRUFESU5HKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChqUGFuZWw0TGF5b3V0LmNyZWF0ZVNlcXVlbnRpYWxHcm91cCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDb250YWluZXJHYXAoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKGpQYW5lbDRMYXlvdXQuY3JlYXRlUGFyYWxsZWxHcm91cChvcmcuamRlc2t0b3AubGF5b3V0Lkdyb3VwTGF5b3V0LkJBU0VMSU5FKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQodHdpdHRlckNoZWNrYm94KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQodHdpdHRlckNvbG9yTGFiZWwpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkUHJlZmVycmVkR2FwKG9yZy5qZGVza3RvcC5sYXlvdXQuTGF5b3V0U3R5bGUuUkVMQVRFRCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChqUGFuZWw0TGF5b3V0LmNyZWF0ZVBhcmFsbGVsR3JvdXAob3JnLmpkZXNrdG9wLmxheW91dC5Hcm91cExheW91dC5CQVNFTElORSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKHRlc3RDaGVja2JveCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKHRlc3RDb2xvckxhYmVsKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENvbnRhaW5lckdhcChvcmcuamRlc2t0b3AubGF5b3V0Lkdyb3VwTGF5b3V0LkRFRkFVTFRfU0laRSwgU2hvcnQuTUFYX1ZBTFVFKSkKKyAgICAgICAgKTsKKworICAgICAgICBvcmcuamRlc2t0b3AubGF5b3V0Lkdyb3VwTGF5b3V0IGxheW91dCA9IG5ldyBvcmcuamRlc2t0b3AubGF5b3V0Lkdyb3VwTGF5b3V0KGdldENvbnRlbnRQYW5lKCkpOworICAgICAgICBnZXRDb250ZW50UGFuZSgpLnNldExheW91dChsYXlvdXQpOworICAgICAgICBsYXlvdXQuc2V0SG9yaXpvbnRhbEdyb3VwKAorICAgICAgICAgICAgICAgIGxheW91dC5jcmVhdGVQYXJhbGxlbEdyb3VwKG9yZy5qZGVza3RvcC5sYXlvdXQuR3JvdXBMYXlvdXQuTEVBRElORykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQobGF5b3V0LmNyZWF0ZVNlcXVlbnRpYWxHcm91cCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDb250YWluZXJHYXAoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKGxheW91dC5jcmVhdGVQYXJhbGxlbEdyb3VwKG9yZy5qZGVza3RvcC5sYXlvdXQuR3JvdXBMYXlvdXQuTEVBRElORykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKGpQYW5lbDEsIG9yZy5qZGVza3RvcC5sYXlvdXQuR3JvdXBMYXlvdXQuREVGQVVMVF9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmpkZXNrdG9wLmxheW91dC5Hcm91cExheW91dC5ERUZBVUxUX1NJWkUsIFNob3J0Lk1BWF9WQUxVRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKGpQYW5lbDQsIG9yZy5qZGVza3RvcC5sYXlvdXQuR3JvdXBMYXlvdXQuREVGQVVMVF9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmpkZXNrdG9wLmxheW91dC5Hcm91cExheW91dC5ERUZBVUxUX1NJWkUsIFNob3J0Lk1BWF9WQUxVRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKGpQYW5lbDMsIG9yZy5qZGVza3RvcC5sYXlvdXQuR3JvdXBMYXlvdXQuREVGQVVMVF9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmpkZXNrdG9wLmxheW91dC5Hcm91cExheW91dC5ERUZBVUxUX1NJWkUsIFNob3J0Lk1BWF9WQUxVRSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRQcmVmZXJyZWRHYXAob3JnLmpkZXNrdG9wLmxheW91dC5MYXlvdXRTdHlsZS5SRUxBVEVEKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKGpQYW5lbDIsIG9yZy5qZGVza3RvcC5sYXlvdXQuR3JvdXBMYXlvdXQuREVGQVVMVF9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5qZGVza3RvcC5sYXlvdXQuR3JvdXBMYXlvdXQuREVGQVVMVF9TSVpFLCBTaG9ydC5NQVhfVkFMVUUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDb250YWluZXJHYXAoKSkKKyAgICAgICAgKTsKKyAgICAgICAgbGF5b3V0LnNldFZlcnRpY2FsR3JvdXAoCisgICAgICAgICAgICAgICAgbGF5b3V0LmNyZWF0ZVBhcmFsbGVsR3JvdXAob3JnLmpkZXNrdG9wLmxheW91dC5Hcm91cExheW91dC5MRUFESU5HKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFkZChsYXlvdXQuY3JlYXRlU2VxdWVudGlhbEdyb3VwKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENvbnRhaW5lckdhcCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQobGF5b3V0LmNyZWF0ZVBhcmFsbGVsR3JvdXAob3JnLmpkZXNrdG9wLmxheW91dC5Hcm91cExheW91dC5MRUFESU5HKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQoalBhbmVsMiwgb3JnLmpkZXNrdG9wLmxheW91dC5Hcm91cExheW91dC5ERUZBVUxUX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuamRlc2t0b3AubGF5b3V0Lkdyb3VwTGF5b3V0LkRFRkFVTFRfU0laRSwgU2hvcnQuTUFYX1ZBTFVFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGQobGF5b3V0LmNyZWF0ZVNlcXVlbnRpYWxHcm91cCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKGpQYW5lbDQsIG9yZy5qZGVza3RvcC5sYXlvdXQuR3JvdXBMYXlvdXQuUFJFRkVSUkVEX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5qZGVza3RvcC5sYXlvdXQuR3JvdXBMYXlvdXQuREVGQVVMVF9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuamRlc2t0b3AubGF5b3V0Lkdyb3VwTGF5b3V0LlBSRUZFUlJFRF9TSVpFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFByZWZlcnJlZEdhcChvcmcuamRlc2t0b3AubGF5b3V0LkxheW91dFN0eWxlLlJFTEFURUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKGpQYW5lbDMsIG9yZy5qZGVza3RvcC5sYXlvdXQuR3JvdXBMYXlvdXQuUFJFRkVSUkVEX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5qZGVza3RvcC5sYXlvdXQuR3JvdXBMYXlvdXQuREVGQVVMVF9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuamRlc2t0b3AubGF5b3V0Lkdyb3VwTGF5b3V0LlBSRUZFUlJFRF9TSVpFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZFByZWZlcnJlZEdhcChvcmcuamRlc2t0b3AubGF5b3V0LkxheW91dFN0eWxlLlJFTEFURUQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkKGpQYW5lbDEsIG9yZy5qZGVza3RvcC5sYXlvdXQuR3JvdXBMYXlvdXQuREVGQVVMVF9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmcuamRlc2t0b3AubGF5b3V0Lkdyb3VwTGF5b3V0LkRFRkFVTFRfU0laRSwgU2hvcnQuTUFYX1ZBTFVFKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hZGRDb250YWluZXJHYXAoKSkKKyAgICAgICAgKTsKKworICAgICAgICBwYWNrKCk7CisgICAgfS8vIDwvZWRpdG9yLWZvbGQ+Ly9HRU4tRU5EOmluaXRDb21wb25lbnRzCit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9zc2UtdHdpdHRlci1hZ2dyZWdhdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYWdncmVnYXRvci9NZXNzYWdlLmphdmEgYi9leGFtcGxlcy9zc2UtdHdpdHRlci1hZ2dyZWdhdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYWdncmVnYXRvci9NZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZhOTNhOAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3NzZS10d2l0dGVyLWFnZ3JlZ2F0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9hZ2dyZWdhdG9yL01lc3NhZ2UuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLmFnZ3JlZ2F0b3I7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5veG0uYW5ub3RhdGlvbnMuWG1sUGF0aDsKKworLyoqCisgKiBNZXNzYWdlIGJlYW4uCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIE1lc3NhZ2UgeworCisgICAgQFhtbEVsZW1lbnQKKyAgICBwcml2YXRlIFN0cmluZyB0ZXh0OworCisgICAgQFhtbFBhdGgoInVzZXIvcHJvZmlsZV9pbWFnZV91cmwvdGV4dCgpIikKKyAgICBwcml2YXRlIFN0cmluZyBwcm9maWxlSW1nOworCisgICAgQFhtbEVsZW1lbnQobmlsbGFibGUgPSB0cnVlKQorICAgIHByaXZhdGUgU3RyaW5nIHJnYkNvbG9yOworCisgICAgcHVibGljIE1lc3NhZ2UoKSB7CisgICAgfQorCisgICAgcHVibGljIE1lc3NhZ2UoZmluYWwgU3RyaW5nIHRleHQsIGZpbmFsIFN0cmluZyByZ2JDb2xvciwgZmluYWwgU3RyaW5nIHByb2ZpbGVJbWcpIHsKKyAgICAgICAgdGhpcy50ZXh0ID0gdGV4dDsKKyAgICAgICAgdGhpcy5yZ2JDb2xvciA9IHJnYkNvbG9yOworICAgICAgICB0aGlzLnByb2ZpbGVJbWcgPSBwcm9maWxlSW1nOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIHRleHQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRQcm9maWxlSW1nKCkgeworICAgICAgICByZXR1cm4gcHJvZmlsZUltZzsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJnYkNvbG9yKCkgeworICAgICAgICByZXR1cm4gcmdiQ29sb3I7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UmdiQ29sb3IoU3RyaW5nIHJnYkNvbG9yKSB7CisgICAgICAgIHRoaXMucmdiQ29sb3IgPSByZ2JDb2xvcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIk1lc3NhZ2V7IgorICAgICAgICAgICAgICAgICsgInRleHQ9JyIgKyB0ZXh0ICsgJ1wnJworICAgICAgICAgICAgICAgICsgIiwgcHJvZmlsZUltZz0nIiArIHByb2ZpbGVJbWcgKyAnXCcnCisgICAgICAgICAgICAgICAgKyAiLCByZ3BDb2xvcj0nIiArIHJnYkNvbG9yICsgJ1wnJworICAgICAgICAgICAgICAgICsgJ30nOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3NzZS10d2l0dGVyLWFnZ3JlZ2F0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9hZ2dyZWdhdG9yL01lc3NhZ2VTdHJlYW1SZXNvdXJjZUpheFJzLmphdmEgYi9leGFtcGxlcy9zc2UtdHdpdHRlci1hZ2dyZWdhdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYWdncmVnYXRvci9NZXNzYWdlU3RyZWFtUmVzb3VyY2VKYXhScy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0YTI0NjYKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zc2UtdHdpdHRlci1hZ2dyZWdhdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYWdncmVnYXRvci9NZXNzYWdlU3RyZWFtUmVzb3VyY2VKYXhScy5qYXZhCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuYWdncmVnYXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNMb25nOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QVVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuc3NlLk91dGJvdW5kU3NlRXZlbnQ7CitpbXBvcnQgamF2YXgud3MucnMuc3NlLlNzZTsKK2ltcG9ydCBqYXZheC53cy5ycy5zc2UuU3NlQnJvYWRjYXN0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuc3NlLlNzZUV2ZW50U2luazsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKKy8qKgorICogUmVzb3VyY2UgdGhhdCBhZ2dyZWdhdGVzIGluY29taW5nIG1lc3NhZ2VzIGFuZCBicm9hZGNhc3RzIHRoZW0KKyAqIHRvIHRoZSByZWdpc3RlcmVkIFNlcnZlci1TZW50IEV2ZW4gKFNTRSkgY2xpZW50IHN0cmVhbXMuCisgKiA8cD4KKyAqIFVzZXMgdGhlIEpBWC1SUyAyLjEgU1NFIEFQSS4KKyAqCisgKiBAc2VlIE1lc3NhZ2VTdHJlYW1SZXNvdXJjZUplcnNleQorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIm1lc3NhZ2Uvc3RyZWFtL2pheHJzIikKK0BTaW5nbGV0b24KK3B1YmxpYyBmaW5hbCBjbGFzcyBNZXNzYWdlU3RyZWFtUmVzb3VyY2VKYXhScyB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoTWVzc2FnZVN0cmVhbVJlc291cmNlSmF4UnMuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICBwcml2YXRlIHN0YXRpYyBBdG9taWNMb25nIG5leHRNZXNzYWdlSWQgPSBuZXcgQXRvbWljTG9uZygwKTsKKworICAgIHByaXZhdGUgZmluYWwgU3NlIHNzZTsKKyAgICBwcml2YXRlIGZpbmFsIFNzZUJyb2FkY2FzdGVyIGJyb2FkY2FzdGVyOworCisgICAgcHVibGljIE1lc3NhZ2VTdHJlYW1SZXNvdXJjZUpheFJzKEBDb250ZXh0IFNzZSBzc2UpIHsKKyAgICAgICAgdGhpcy5zc2UgPSBzc2U7CisgICAgICAgIHRoaXMuYnJvYWRjYXN0ZXIgPSBzc2UubmV3QnJvYWRjYXN0ZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQdXQgYSBuZXcgbWVzc2FnZSB0byB0aGUgc3RyZWFtLgorICAgICAqCisgICAgICogVGhlIG1lc3NhZ2Ugd2lsbCBiZSBicm9hZGNhc3QgdG8gYWxsIHJlZ2lzdGVyZWQgU1NFIGNsaWVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBtZXNzYWdlIHRvIGJlIGJyb2FkY2FzdC4KKyAgICAgKi8KKyAgICBAUFVUCisgICAgQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorICAgIHB1YmxpYyB2b2lkIHB1dE1lc3NhZ2UoZmluYWwgTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgIExPR0dFUi5pbmZvKCItLT4gTWVzc2FnZSByZWNlaXZlZC4iKTsKKworICAgICAgICBmaW5hbCBPdXRib3VuZFNzZUV2ZW50IGV2ZW50ID0gc3NlLm5ld0V2ZW50QnVpbGRlcigpCisgICAgICAgICAgICAgICAgLmlkKFN0cmluZy52YWx1ZU9mKG5leHRNZXNzYWdlSWQuZ2V0QW5kSW5jcmVtZW50KCkpKQorICAgICAgICAgICAgICAgIC5tZWRpYVR5cGUoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSkKKyAgICAgICAgICAgICAgICAuZGF0YShNZXNzYWdlLmNsYXNzLCBtZXNzYWdlKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgIGJyb2FkY2FzdGVyLmJyb2FkY2FzdChldmVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBuZXcgU1NFIG1lc3NhZ2Ugc3RyZWFtIGNoYW5uZWwuCisgICAgICovCisgICAgQEdFVAorICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuU0VSVkVSX1NFTlRfRVZFTlRTKQorICAgIHB1YmxpYyB2b2lkIGdldE1lc3NhZ2VTdHJlYW0oQENvbnRleHQgU3NlRXZlbnRTaW5rIGV2ZW50U2luaykgeworICAgICAgICBMT0dHRVIuaW5mbygiLS0+IFNTRSBjb25uZWN0aW9uIHJlY2VpdmVkLiIpOworICAgICAgICBicm9hZGNhc3Rlci5yZWdpc3RlcihldmVudFNpbmspOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc3NlLXR3aXR0ZXItYWdncmVnYXRvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2FnZ3JlZ2F0b3IvTWVzc2FnZVN0cmVhbVJlc291cmNlSmVyc2V5LmphdmEgYi9leGFtcGxlcy9zc2UtdHdpdHRlci1hZ2dyZWdhdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYWdncmVnYXRvci9NZXNzYWdlU3RyZWFtUmVzb3VyY2VKZXJzZXkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTE3NzZhCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvc3NlLXR3aXR0ZXItYWdncmVnYXRvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2FnZ3JlZ2F0b3IvTWVzc2FnZVN0cmVhbVJlc291cmNlSmVyc2V5LmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5hZ2dyZWdhdG9yOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0xvbmc7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBVVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLkV2ZW50T3V0cHV0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5PdXRib3VuZEV2ZW50OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5Tc2VCcm9hZGNhc3RlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5zc2UuU3NlRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ2h1bmtlZE91dHB1dDsKKworLyoqCisgKiBSZXNvdXJjZSB0aGF0IGFnZ3JlZ2F0ZXMgaW5jb21pbmcgbWVzc2FnZXMgYW5kIGJyb2FkY2FzdHMgdGhlbQorICogdG8gdGhlIHJlZ2lzdGVyZWQgU2VydmVyLVNlbnQgRXZlbiAoU1NFKSBjbGllbnQgc3RyZWFtcy4KKyAqIDxwPgorICogVXNlcyB0aGUgSmVyc2V5LXNwZWNpZmljIFNTRSBBUEkuCisgKgorICogQHNlZSBNZXNzYWdlU3RyZWFtUmVzb3VyY2VKYXhScworICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIm1lc3NhZ2Uvc3RyZWFtL2plcnNleSIpCitwdWJsaWMgZmluYWwgY2xhc3MgTWVzc2FnZVN0cmVhbVJlc291cmNlSmVyc2V5IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihNZXNzYWdlU3RyZWFtUmVzb3VyY2VKZXJzZXkuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIHByaXZhdGUgc3RhdGljIFNzZUJyb2FkY2FzdGVyIGJyb2FkY2FzdGVyID0gbmV3IFNzZUJyb2FkY2FzdGVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25FeGNlcHRpb24oZmluYWwgQ2h1bmtlZE91dHB1dDxPdXRib3VuZEV2ZW50PiBjaHVua2VkT3V0cHV0LCBmaW5hbCBFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLlNFVkVSRSwgIkVycm9yIGJyb2FkY2FzdGluZyBtZXNzYWdlLiIsIGV4Y2VwdGlvbik7CisgICAgICAgIH0KKyAgICB9OworICAgIHByaXZhdGUgc3RhdGljIEF0b21pY0xvbmcgbmV4dE1lc3NhZ2VJZCA9IG5ldyBBdG9taWNMb25nKDApOworCisgICAgLyoqCisgICAgICogUHV0IGEgbmV3IG1lc3NhZ2UgdG8gdGhlIHN0cmVhbS4KKyAgICAgKgorICAgICAqIFRoZSBtZXNzYWdlIHdpbGwgYmUgYnJvYWRjYXN0IHRvIGFsbCByZWdpc3RlcmVkIFNTRSBjbGllbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2UgbWVzc2FnZSB0byBiZSBicm9hZGNhc3QuCisgICAgICovCisgICAgQFBVVAorICAgIEBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKyAgICBwdWJsaWMgdm9pZCBwdXRNZXNzYWdlKGZpbmFsIE1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICBMT0dHRVIuaW5mbygiLS0+IE1lc3NhZ2UgcmVjZWl2ZWQuIik7CisKKyAgICAgICAgZmluYWwgT3V0Ym91bmRFdmVudCBldmVudCA9IG5ldyBPdXRib3VuZEV2ZW50LkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5pZChTdHJpbmcudmFsdWVPZihuZXh0TWVzc2FnZUlkLmdldEFuZEluY3JlbWVudCgpKSkKKyAgICAgICAgICAgICAgICAubWVkaWFUeXBlKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUpCisgICAgICAgICAgICAgICAgLmRhdGEoTWVzc2FnZS5jbGFzcywgbWVzc2FnZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICBicm9hZGNhc3Rlci5icm9hZGNhc3QoZXZlbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbmV3IFNTRSBtZXNzYWdlIHN0cmVhbSBjaGFubmVsLgorICAgICAqCisgICAgICogQHJldHVybiBuZXcgU1NFIG1lc3NhZ2Ugc3RyZWFtIGNoYW5uZWwuCisgICAgICovCisgICAgQEdFVAorICAgIEBQcm9kdWNlcyhTc2VGZWF0dXJlLlNFUlZFUl9TRU5UX0VWRU5UUykKKyAgICBwdWJsaWMgRXZlbnRPdXRwdXQgZ2V0TWVzc2FnZVN0cmVhbSgpIHsKKyAgICAgICAgTE9HR0VSLmluZm8oIi0tPiBTU0UgY29ubmVjdGlvbiByZWNlaXZlZC4iKTsKKyAgICAgICAgZmluYWwgRXZlbnRPdXRwdXQgZXZlbnRPdXRwdXQgPSBuZXcgRXZlbnRPdXRwdXQoKTsKKyAgICAgICAgYnJvYWRjYXN0ZXIuYWRkKGV2ZW50T3V0cHV0KTsKKyAgICAgICAgcmV0dXJuIGV2ZW50T3V0cHV0OworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc3NlLXR3aXR0ZXItYWdncmVnYXRvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2FnZ3JlZ2F0b3IvUmVtb3ZlU2VsZWN0ZWRMaXN0SXRlbXNBY3Rpb24uamF2YSBiL2V4YW1wbGVzL3NzZS10d2l0dGVyLWFnZ3JlZ2F0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9hZ2dyZWdhdG9yL1JlbW92ZVNlbGVjdGVkTGlzdEl0ZW1zQWN0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRlYjdkNwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3NzZS10d2l0dGVyLWFnZ3JlZ2F0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9hZ2dyZWdhdG9yL1JlbW92ZVNlbGVjdGVkTGlzdEl0ZW1zQWN0aW9uLmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5hZ2dyZWdhdG9yOworCitpbXBvcnQgamF2YS5hd3QuZXZlbnQuQWN0aW9uRXZlbnQ7CitpbXBvcnQgamF2YS5hd3QuZXZlbnQuS2V5RXZlbnQ7CisKK2ltcG9ydCBqYXZheC5zd2luZy5BYnN0cmFjdEFjdGlvbjsKK2ltcG9ydCBqYXZheC5zd2luZy5EZWZhdWx0TGlzdE1vZGVsOworaW1wb3J0IGphdmF4LnN3aW5nLkpMaXN0OworaW1wb3J0IGphdmF4LnN3aW5nLktleVN0cm9rZTsKKworLyoqCisgKiBUT0RPOiBqYXZhZG9jLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBSZW1vdmVTZWxlY3RlZExpc3RJdGVtc0FjdGlvbiBleHRlbmRzIEFic3RyYWN0QWN0aW9uIHsKKworICAgIHByaXZhdGUgZmluYWwgSkxpc3QgbGlzdDsKKyAgICBwcml2YXRlIGZpbmFsIERlZmF1bHRMaXN0TW9kZWwgbGlzdE1vZGVsOworCisgICAgcHVibGljIFJlbW92ZVNlbGVjdGVkTGlzdEl0ZW1zQWN0aW9uKEpMaXN0IGxpc3QsIERlZmF1bHRMaXN0TW9kZWwgbW9kZWwpIHsKKyAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCB8fCBtb2RlbCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkJvdW5kIEpMaXN0IGNvbXBvbmVudCBhbmQgaXQncyBtb2RlbCBtdXN0IG5vdCBiZSBudWxsLiIpOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5saXN0ID0gbGlzdDsKKyAgICAgICAgdGhpcy5saXN0TW9kZWwgPSBtb2RlbDsKKworICAgICAgICBwdXRWYWx1ZShOQU1FLCAiRGVsZXRlIik7CisgICAgICAgIHB1dFZhbHVlKEFDQ0VMRVJBVE9SX0tFWSwgS2V5U3Ryb2tlLmdldEtleVN0cm9rZShLZXlFdmVudC5WS19ERUxFVEUsIDApKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhY3Rpb25QZXJmb3JtZWQoQWN0aW9uRXZlbnQgZSkgeworICAgICAgICByZW1vdmVTZWxlY3RlZExpc3RJdGVtcygpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZW1vdmVTZWxlY3RlZExpc3RJdGVtcygpIHsKKyAgICAgICAgT2JqZWN0W10gc2VsZWN0ZWRWYWx1ZXMgPSBsaXN0LmdldFNlbGVjdGVkVmFsdWVzKCk7CisgICAgICAgIGJvb2xlYW4gaXRlbXNTZWxlY3RlZCA9IHNlbGVjdGVkVmFsdWVzLmxlbmd0aCA+IDA7CisKKyAgICAgICAgaWYgKGl0ZW1zU2VsZWN0ZWQgJiYgY29uZmlybVJlbW92ZSgpKSB7CisgICAgICAgICAgICBmb3IgKE9iamVjdCBzZWxlY3RlZFZhbHVlIDogc2VsZWN0ZWRWYWx1ZXMpIHsKKyAgICAgICAgICAgICAgICBsaXN0TW9kZWwucmVtb3ZlRWxlbWVudChzZWxlY3RlZFZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBjb25maXJtUmVtb3ZlKCkgeworICAgICAgICAvLyBFLmcuIEpPcHRpb25QYW5lLUNvbmZpcm0tRGlhbG9nCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3NzZS10d2l0dGVyLWFnZ3JlZ2F0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9hZ2dyZWdhdG9yL1Rlc3RBZ2dyZWdhdG9ySmF4UnMuamF2YSBiL2V4YW1wbGVzL3NzZS10d2l0dGVyLWFnZ3JlZ2F0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9hZ2dyZWdhdG9yL1Rlc3RBZ2dyZWdhdG9ySmF4UnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzE1MWYxCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvc3NlLXR3aXR0ZXItYWdncmVnYXRvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2FnZ3JlZ2F0b3IvVGVzdEFnZ3JlZ2F0b3JKYXhScy5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuYWdncmVnYXRvcjsKKworLyoqCisgKiBGYWtlIG1lc3NhZ2UgYWdncmVnYXRvciB1c2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzIHBvaW50aW5nIHRvIFNTRSBldmVudCBzdHJlYW0gaW1wbGVtZW50ZWQgdXNpbmcgSmVyc2V5LXNwZWNpZmljIEFQSS4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgVGVzdEFnZ3JlZ2F0b3JKYXhScyBleHRlbmRzIEFic3RyYWN0VGVzdEFnZ3JlZ2F0b3IgeworCisgICAgcHVibGljIFRlc3RBZ2dyZWdhdG9ySmF4UnMoU3RyaW5nIHJnYkNvbG9yKSB7CisgICAgICAgIHN1cGVyKHJnYkNvbG9yKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7CisgICAgICAgIHJldHVybiAibWVzc2FnZS9zdHJlYW0vamF4cnMiOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UHJlZml4KCkgeworICAgICAgICByZXR1cm4gIkpBWC1SUyBhZ2dyZWdhdG9yOiAiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3NzZS10d2l0dGVyLWFnZ3JlZ2F0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9hZ2dyZWdhdG9yL1Rlc3RBZ2dyZWdhdG9ySmVyc2V5LmphdmEgYi9leGFtcGxlcy9zc2UtdHdpdHRlci1hZ2dyZWdhdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYWdncmVnYXRvci9UZXN0QWdncmVnYXRvckplcnNleS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1Y2E1ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zc2UtdHdpdHRlci1hZ2dyZWdhdG9yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvYWdncmVnYXRvci9UZXN0QWdncmVnYXRvckplcnNleS5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuYWdncmVnYXRvcjsKKworLyoqCisgKiBGYWtlIG1lc3NhZ2UgYWdncmVnYXRvciB1c2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzIHBvaW50aW5nIHRvIFNTRSBldmVudCBzdHJlYW0gaW1wbGVtZW50ZWQgdXNpbmcgSmVyc2V5LXNwZWNpZmljIEFQSS4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgVGVzdEFnZ3JlZ2F0b3JKZXJzZXkgZXh0ZW5kcyBBYnN0cmFjdFRlc3RBZ2dyZWdhdG9yIHsKKworICAgIHB1YmxpYyBUZXN0QWdncmVnYXRvckplcnNleShTdHJpbmcgcmdiQ29sb3IpIHsKKyAgICAgICAgc3VwZXIocmdiQ29sb3IpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuICJtZXNzYWdlL3N0cmVhbS9qZXJzZXkiOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UHJlZml4KCkgeworICAgICAgICByZXR1cm4gIkplcnNleSBhZ2dyZWdhdG9yOiAiOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc3NlLXR3aXR0ZXItYWdncmVnYXRvci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL2FnZ3JlZ2F0b3IvVHdpdHRlckFnZ3JlZ2F0b3IuamF2YSBiL2V4YW1wbGVzL3NzZS10d2l0dGVyLWFnZ3JlZ2F0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9hZ2dyZWdhdG9yL1R3aXR0ZXJBZ2dyZWdhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRhMGFhMgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3NzZS10d2l0dGVyLWFnZ3JlZ2F0b3Ivc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9hZ2dyZWdhdG9yL1R3aXR0ZXJBZ2dyZWdhdG9yLmphdmEKQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuYWdncmVnYXRvcjsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuTGlua2VkQmxvY2tpbmdRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkdlbmVyaWNUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LlNzbENvbmZpZ3VyYXRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2h1bmtlZElucHV0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5hdXRoZW50aWNhdGlvbi5IdHRwQXV0aGVudGljYXRpb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuR1ppcEVuY29kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW94eS5qc29uLk1veHlKc29uRmVhdHVyZTsKKworLyoqCisgKiBUd2l0dGVyIG1lc3NhZ2UtYmFzZWQgZGF0YSBhZ2dyZWdhdG9yIGltcGxlbWVudGF0aW9uLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBUd2l0dGVyQWdncmVnYXRvciBpbXBsZW1lbnRzIERhdGFBZ2dyZWdhdG9yIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihUd2l0dGVyQWdncmVnYXRvci5jbGFzcy5nZXROYW1lKCkpOworCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGNhbmNlbGxlZDsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyByZ2JDb2xvcjsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgdHdpdHRlciBtZXNzYWdlIGFnZ3JlZ2F0b3Igd2l0aCBhIHNwZWNpZmljIG1lc3NhZ2UgY29sb3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmdiQ29sb3IgbWVzc2FnZSBjb2xvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgVHdpdHRlckFnZ3JlZ2F0b3IoU3RyaW5nIHJnYkNvbG9yKSB7CisgICAgICAgIHRoaXMucmdiQ29sb3IgPSByZ2JDb2xvcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzdGFydChmaW5hbCBTdHJpbmcga2V5d29yZHMsIGZpbmFsIERhdGFMaXN0ZW5lciBtc2dMaXN0ZW5lcikgeworICAgICAgICBjYW5jZWxsZWQgPSBmYWxzZTsKKworLy8gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiaHR0cC5wcm94eUhvc3QiLCAid3d3LXByb3h5LnVzLm9yYWNsZS5jb20iKTsKKy8vICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImh0dHAucHJveHlQb3J0IiwgIjgwIik7CisvLyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJodHRwcy5wcm94eUhvc3QiLCAid3d3LXByb3h5LnVzLm9yYWNsZS5jb20iKTsKKy8vICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoImh0dHBzLnByb3h5UG9ydCIsICI4MCIpOworCisKKyAgICAgICAgZmluYWwgTGlua2VkQmxvY2tpbmdRdWV1ZTxNZXNzYWdlPiBtZXNzYWdlcyA9IG5ldyBMaW5rZWRCbG9ja2luZ1F1ZXVlPE1lc3NhZ2U+KCk7CisKKyAgICAgICAgZmluYWwgRnV0dXJlPD8+IHJlYWRlckhhbmRsZSA9IEV4ZWN1dG9ycy5uZXdTaW5nbGVUaHJlYWRFeGVjdXRvcigpLnN1Ym1pdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBTc2xDb25maWd1cmF0b3Igc3NsQ29uZmlnID0gU3NsQ29uZmlndXJhdG9yLm5ld0luc3RhbmNlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC50cnVzdFN0b3JlRmlsZSgiLi90cnVzdHN0b3JlX2NsaWVudCIpCisgICAgICAgICAgICAgICAgICAgICAgICAudHJ1c3RTdG9yZVBhc3N3b3JkKCJhc2RmZ2giKQorCisgICAgICAgICAgICAgICAgICAgICAgICAua2V5U3RvcmVGaWxlKCIuL2tleXN0b3JlX2NsaWVudCIpCisgICAgICAgICAgICAgICAgICAgICAgICAua2V5UGFzc3dvcmQoImFzZGZnaCIpOworCisgICAgICAgICAgICAgICAgZmluYWwgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3QnVpbGRlcigpLnNzbENvbnRleHQoc3NsQ29uZmlnLmNyZWF0ZVNTTENvbnRleHQoKSkuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICBjbGllbnQucHJvcGVydHkoQ2xpZW50UHJvcGVydGllcy5DT05ORUNUX1RJTUVPVVQsIDIwMDApCisgICAgICAgICAgICAgICAgICAgICAgICAucmVnaXN0ZXIobmV3IE1veHlKc29uRmVhdHVyZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUuYmFzaWMoQXBwLmdldFR3aXR0ZXJVc2VyTmFtZSgpLCBBcHAuZ2V0VHdpdHRlclVzZXJQYXNzd29yZCgpKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5yZWdpc3RlcihHWmlwRW5jb2Rlci5jbGFzcyk7CisKKyAgICAgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IGNsaWVudC50YXJnZXQoImh0dHBzOi8vc3RyZWFtLnR3aXR0ZXIuY29tLzEuMS9zdGF0dXNlcy9maWx0ZXIuanNvbiIpCisgICAgICAgICAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgidHJhY2siLCBrZXl3b3JkcykKKy8vICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJsb2NhdGlvbnMiLCAiLTEyMi43NSwzNi44LC0xMjEuNzUsMzcuOCIpIC8vIFNhbiBGcmFuY2lzY28KKyAgICAgICAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUpCisgICAgICAgICAgICAgICAgICAgICAgICAuaGVhZGVyKEh0dHBIZWFkZXJzLkhPU1QsICJzdHJlYW0udHdpdHRlci5jb20iKQorICAgICAgICAgICAgICAgICAgICAgICAgLmhlYWRlcihIdHRwSGVhZGVycy5VU0VSX0FHRU5ULCAiSmVyc2V5LzIuMCIpCisgICAgICAgICAgICAgICAgICAgICAgICAuaGVhZGVyKEh0dHBIZWFkZXJzLkFDQ0VQVF9FTkNPRElORywgImd6aXAiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldCgpOworCisgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmdldFN0YXR1c0luZm8oKS5nZXRGYW1pbHkoKSAhPSBSZXNwb25zZS5TdGF0dXMuRmFtaWx5LlNVQ0NFU1NGVUwpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5XQVJOSU5HLCAiRXJyb3IgY29ubmVjdGluZyB0byBUd2l0dGVyIFN0cmVhbWluZyBBUEk6ICIgKyByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgICAgICAgICAgICAgIG1zZ0xpc3RlbmVyLm9uRXJyb3IoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtc2dMaXN0ZW5lci5vblN0YXJ0KCk7CisKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBDaHVua2VkSW5wdXQ8TWVzc2FnZT4gY2h1bmtzID0gcmVzcG9uc2UucmVhZEVudGl0eShuZXcgR2VuZXJpY1R5cGU8Q2h1bmtlZElucHV0PE1lc3NhZ2U+PigpIHsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIVRocmVhZC5pbnRlcnJ1cHRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gY2h1bmtzLnJlYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnNldFJnYkNvbG9yKHJnYkNvbG9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKG1lc3NhZ2UudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1dChtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaHVua3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rcy5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5XQVJOSU5HLCAiUmVhZGluZyBmcm9tIHRoZSBUd2l0dGVyIHN0cmVhbSBoYXMgZmFpbGVkIiwgdCk7CisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLm9mZmVyKG51bGwpOworICAgICAgICAgICAgICAgICAgICBtc2dMaXN0ZW5lci5vbkVycm9yKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBFeGVjdXRvcnMubmV3U2luZ2xlVGhyZWFkRXhlY3V0b3IoKS5zdWJtaXQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgZmluYWwgQ2xpZW50IHJlc291cmNlQ2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKTsKKyAgICAgICAgICAgICAgICByZXNvdXJjZUNsaWVudC5yZWdpc3RlcihuZXcgTW94eUpzb25GZWF0dXJlKCkpOworICAgICAgICAgICAgICAgIGZpbmFsIFdlYlRhcmdldCBtZXNzYWdlU3RyZWFtUmVzb3VyY2UgPSByZXNvdXJjZUNsaWVudC50YXJnZXQoQXBwLmdldEFwaVVyaSgpKS5wYXRoKCJtZXNzYWdlL3N0cmVhbSIpOworCisgICAgICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gbnVsbDsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIWNhbmNlbGxlZCAmJiAobWVzc2FnZSA9IG1lc3NhZ2VzLnRha2UoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbXNnTGlzdGVuZXIub25NZXNzYWdlKG1lc3NhZ2UpOworCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByID0gbWVzc2FnZVN0cmVhbVJlc291cmNlLnJlcXVlc3QoKS5wdXQoRW50aXR5Lmpzb24obWVzc2FnZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIuZ2V0U3RhdHVzSW5mbygpLmdldEZhbWlseSgpICE9IFJlc3BvbnNlLlN0YXR1cy5GYW1pbHkuU1VDQ0VTU0ZVTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi53YXJuaW5nKCJVbmV4cGVjdGVkIFBVVCBtZXNzYWdlIHJlc3BvbnNlIHN0YXR1cyBjb2RlOiAiICsgci5nZXRTdGF0dXMoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dHRVIuaW5mbygiVGltZWQgb3V0IHdoaWxlIHdhaXRpbmcgZm9yIGEgbWVzc2FnZS4iKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuV0FSTklORywgIldhaXRpbmcgZm9yIGEgbWVzc2FnZSBoYXMgYmVlbiBpbnRlcnJ1cHRlZC4iLCBleCk7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgcmVhZGVySGFuZGxlLmNhbmNlbCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgbXNnTGlzdGVuZXIub25Db21wbGV0ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgY2FuY2VsbGVkID0gdHJ1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy9zc2UtdHdpdHRlci1hZ2dyZWdhdG9yL3NyYy9tYWluL3Jlc291cmNlcy93ZWJyb290L2Nzcy9tYWluLmNzcyBiL2V4YW1wbGVzL3NzZS10d2l0dGVyLWFnZ3JlZ2F0b3Ivc3JjL21haW4vcmVzb3VyY2VzL3dlYnJvb3QvY3NzL21haW4uY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MTM1MTAKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zc2UtdHdpdHRlci1hZ2dyZWdhdG9yL3NyYy9tYWluL3Jlc291cmNlcy93ZWJyb290L2Nzcy9tYWluLmNzcwpAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitkaXYubWVzc2FnZSB7CisgICAgYm9yZGVyOiB0aGljayBzb2xpZDsKKyAgICBib3JkZXItcmFkaXVzOiAxMHB4OworICAgIG1hcmdpbjogMTBweDsKKyAgICB3aWR0aDogMzAwcHg7CisgICAgcGFkZGluZzogMTBweDsKKyAgICBib3gtc2hhZG93OiA1cHggNXB4IDVweCAjODg4ODg4OworICAgIGZvbnQtZmFtaWx5OiBIZWx2ZXRpY2EsIHNlcmlmOworICAgIGNvbG9yOiAjNDQ0NDQ0OworfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc3NlLXR3aXR0ZXItYWdncmVnYXRvci9zcmMvbWFpbi9yZXNvdXJjZXMvd2Vicm9vdC9pbmRleC5odG1sIGIvZXhhbXBsZXMvc3NlLXR3aXR0ZXItYWdncmVnYXRvci9zcmMvbWFpbi9yZXNvdXJjZXMvd2Vicm9vdC9pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlYmZjZWIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zc2UtdHdpdHRlci1hZ2dyZWdhdG9yL3NyYy9tYWluL3Jlc291cmNlcy93ZWJyb290L2luZGV4Lmh0bWwKQEAgLTAsMCArMSwyMiBAQAorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKworLS0+CisKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorPGh0bWw+Cis8aGVhZD4KKyAgICA8dGl0bGU+SmVyc2V5IE1lc3NhZ2UgU3RyZWFtaW5nIEV4YW1wbGU8L3RpdGxlPgorICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iY3NzL21haW4uY3NzIiAvPgorICAgIDxzY3JpcHQgc3JjPSJqcy9zc2UtY2xpZW50LmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPjwvc2NyaXB0PgorPC9oZWFkPgorPGJvZHk+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9zc2UtdHdpdHRlci1hZ2dyZWdhdG9yL3NyYy9tYWluL3Jlc291cmNlcy93ZWJyb290L2pzL3NzZS1jbGllbnQuanMgYi9leGFtcGxlcy9zc2UtdHdpdHRlci1hZ2dyZWdhdG9yL3NyYy9tYWluL3Jlc291cmNlcy93ZWJyb290L2pzL3NzZS1jbGllbnQuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjhhZjgyMwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3NzZS10d2l0dGVyLWFnZ3JlZ2F0b3Ivc3JjL21haW4vcmVzb3VyY2VzL3dlYnJvb3QvanMvc3NlLWNsaWVudC5qcwpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCisidXNlIHN0cmljdCI7CisKK2Z1bmN0aW9uIHJlY2VpdmVNZXNzYWdlcygpIHsKKyAgICBpZiAodHlwZW9mKEV2ZW50U291cmNlKSAhPT0gInVuZGVmaW5lZCIpIHsKKyAgICAgICAgLy8gWWVzISBTZXJ2ZXItc2VudCBldmVudHMgc3VwcG9ydCEKKyAgICAgICAgdmFyIHNvdXJjZUplcnNleSA9IG5ldyBFdmVudFNvdXJjZSgnL2FnZ3JlZ2F0b3ItYXBpL21lc3NhZ2Uvc3RyZWFtL2plcnNleScpOworICAgICAgICB2YXIgc291cmNlSmF4UnMgPSBuZXcgRXZlbnRTb3VyY2UoJy9hZ2dyZWdhdG9yLWFwaS9tZXNzYWdlL3N0cmVhbS9qYXhycycpOworICAgICAgICB2YXIgZXZlbnRIYW5kbGVyID1mdW5jdGlvbiAoZXZlbnQpIHsKKyAgICAgICAgICAgIHZhciBkYXRhID0gSlNPTi5wYXJzZShldmVudC5kYXRhKTsKKyAgICAgICAgICAgIGNvbnNvbGUubG9nKGRhdGEpOworCisgICAgICAgICAgICB2YXIgbmV3RW50cnkgPQorICAgICAgICAgICAgICAgICc8ZGl2IGNsYXNzPSJtZXNzYWdlIj4nCisgICAgICAgICAgICAgICAgICAgICsgJzxpbWcgc3JjPSInICsgZGF0YS51c2VyLnByb2ZpbGVfaW1hZ2VfdXJsICsgJyIgLz4nCisgICAgICAgICAgICAgICAgICAgICsgJzxzcGFuIHN0eWxlPSJjb2xvcjogIycgKyBkYXRhLnJnYkNvbG9yICsgJyI+JworICAgICAgICAgICAgICAgICAgICArIGRhdGEudGV4dCArICc8L3NwYW4+PC9kaXY+JzsKKworICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5pbm5lckhUTUwgPSBuZXdFbnRyeSArIGRvY3VtZW50LmJvZHkuaW5uZXJIVE1MOworICAgICAgICB9OworICAgICAgICBzb3VyY2VKZXJzZXkub25tZXNzYWdlID0gZXZlbnRIYW5kbGVyOworICAgICAgICBzb3VyY2VKYXhScy5vbm1lc3NhZ2UgPSBldmVudEhhbmRsZXI7CisKKyAgICAgICAgc291cmNlSmVyc2V5Lm9ub3BlbiA9IGZ1bmN0aW9uIChldmVudCkgeworICAgICAgICAgICAgLy8gQ29ubmVjdGlvbiB3YXMgb3BlbmVkLgorICAgICAgICAgICAgY29uc29sZS5sb2coJ0pyZXNleSBzdHJlYW0gb3BlbmVkLicpCisgICAgICAgIH07CisKKyAgICAgICAgc291cmNlSmF4UnMub25vcGVuID0gZnVuY3Rpb24gKGV2ZW50KSB7CisgICAgICAgICAgICBjb25zb2xlLmxvZygnSkFYLVJTIHN0cmVhbSBvcGVuZWQuJykKKyAgICAgICAgfQorCisgICAgICAgIHNvdXJjZUplcnNleS5vbmNsb3NlID0gZnVuY3Rpb24gKGV2ZW50KSB7CisgICAgICAgICAgICAvLyBDb25uZWN0aW9uIHdhcyBjbG9zZWQuCisgICAgICAgICAgICBjb25zb2xlLmxvZygnSmVyc2V5IGNvbm5lY3Rpb24gY2xvc2VkJykKKyAgICAgICAgfTsKKworICAgICAgICBzb3VyY2VKYXhScy5vbmNsb3NlID0gZnVuY3Rpb24gKGV2ZW50KSB7CisgICAgICAgICAgICAvLyBDb25uZWN0aW9uIHdhcyBjbG9zZWQuCisgICAgICAgICAgICBjb25zb2xlLmxvZygnSkFYLVJTIGNvbm5lY3Rpb24gY2xvc2VkJykKKyAgICAgICAgfTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBTb3JyeSEgTm8gc2VydmVyLXNlbnQgZXZlbnRzIHN1cHBvcnQuLgorICAgICAgICBjb25zb2xlLmxvZygnU1NFIG5vdCBzdXBwb3J0ZWQgYnkgYnJvd3Nlci4nKQorICAgIH0KK30KKword2luZG93Lm9ubG9hZCA9IHJlY2VpdmVNZXNzYWdlcyA7CmRpZmYgLS1naXQgYS9leGFtcGxlcy9zc2UtdHdpdHRlci1hZ2dyZWdhdG9yL3RydXN0c3RvcmVfY2xpZW50IGIvZXhhbXBsZXMvc3NlLXR3aXR0ZXItYWdncmVnYXRvci90cnVzdHN0b3JlX2NsaWVudApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDc4NGZiCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvc3NlLXR3aXR0ZXItYWdncmVnYXRvci90cnVzdHN0b3JlX2NsaWVudApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9leGFtcGxlcy9zc2UtdHdpdHRlci1hZ2dyZWdhdG9yL3R3aXR0ZXItYXBpLnByb3BlcnRpZXMgYi9leGFtcGxlcy9zc2UtdHdpdHRlci1hZ2dyZWdhdG9yL3R3aXR0ZXItYXBpLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ0MTliYwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3NzZS10d2l0dGVyLWFnZ3JlZ2F0b3IvdHdpdHRlci1hcGkucHJvcGVydGllcwpAQCAtMCwwICsxLDEyIEBACisjCisjIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyMgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorIworIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisjCisKK3R3aXR0ZXIudXNlci5uYW1lPTxlbnRlcl95b3VyX3R3aXR0ZXJfYWNjb3VudF9uYW1lX2hlcmU+Cit0d2l0dGVyLnVzZXIucGFzc3dvcmQ9PGVudGVyX3lvdXJfdHdpdHRlcl9hY2NvdW50X3Bhc3N3b3JkX2hlcmU+CmRpZmYgLS1naXQgYS9leGFtcGxlcy9zeXN0ZW0tcHJvcGVydGllcy1leGFtcGxlL1JFQURNRS5NRCBiL2V4YW1wbGVzL3N5c3RlbS1wcm9wZXJ0aWVzLWV4YW1wbGUvUkVBRE1FLk1ECm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExOTZiZGYKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zeXN0ZW0tcHJvcGVydGllcy1leGFtcGxlL1JFQURNRS5NRApAQCAtMCwwICsxLDM2IEBACitbLy9dOiAjICIgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICIKK1svL106ICMgIiAiCitbLy9dOiAjICIgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlICIKK1svL106ICMgIiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCAiCitbLy9dOiAjICIgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLiAiCitbLy9dOiAjICIgIgorWy8vXTogIyAiIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UgIgorCitIZWxsb3dvcmxkIHdlYmFwcCBFeGFtcGxlCis9PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoaXMgZXhhbXBsZSBkZW1vbnN0cmF0ZXMgaG93IHRvIG1hbmFnZSBzeXN0ZW0gcHJvcGVydGllcyB1c2luZyBSRVNUIEFQSS4gU3lzdGVtIFByb3BlcnRpZXMgRXhhbXBsZQoraXMgYWJsZSB0byBleHBvc2UgYWxsIHJlZ2lzdGVyZWQgc3lzdGVtIHByb3BlcnRpZXMsIGZpbmQgb3V0IGl0cyB2YWx1ZXMgYW5kIGV2ZW4gY2hhbmdlIGEgZ2l2ZW4KK3Byb3BlcnR5IHZhbHVlLgorCitDb250ZW50cworLS0tLS0tLS0KKworVGhlIG1hcHBpbmcgb2YgdGhlIFVSSSBwYXRoIHNwYWNlIGlzIHByZXNlbnRlZCBpbiB0aGUgZm9sbG93aW5nIHRhYmxlOgorCitVUkkgcGF0aCAgICAgICAgICAgICAgICAgICAgICAgIHwgUmVzb3VyY2UgY2xhc3MgICAgICAgICAgfCBIVFRQIG1ldGhvZHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSB8IC0tLS0tLS0tLS0tLS0tCisqKl8vcHJvcGVydGllc18qKiAgICAgICAgICAgICAgIHwgUHJvcGVydHlOYW1lc1Jlc291cmNlICAgfCBHRVQKKyoqXy9wcm9wZXJ0aWVzL3twcm9wX25hbWV9XyoqICAgfCBQcm9wZXJ0eVJlc291cmNlICAgICAgICB8IEdFVAorKipfL3Byb3BlcnRpZXMve3Byb3BfbmFtZX1fKiogICB8IFByb3BlcnR5UmVzb3VyY2UgICAgICAgIHwgUFVUCisKK1J1bm5pbmcgdGhlIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworUnVuIHRoZSBleGFtcGxlIGFzIGZvbGxvd3M6CisKKz4gICAgIG12biBjbGVhbiBjb21waWxlIGV4ZWM6amF2YQorCitUaGlzIGRlcGxveXMgdGhlIGV4YW1wbGUgdXNpbmcgW0dyaXp6bHldKGh0dHA6Ly9ncml6emx5LmphdmEubmV0LykgY29udGFpbmVyLiBZb3UgY2FuIGFjY2VzcyB0aGUgYXBwbGljYXRpb24gYXQ6CisKKy0gICA8aHR0cDovL2xvY2FsaG9zdDo4MDgwL3Byb3BlcnRpZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc3lzdGVtLXByb3BlcnRpZXMtZXhhbXBsZS9wb20ueG1sIGIvZXhhbXBsZXMvc3lzdGVtLXByb3BlcnRpZXMtZXhhbXBsZS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNjU3YTIKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zeXN0ZW0tcHJvcGVydGllcy1leGFtcGxlL3BvbS54bWwKQEAgLTAsMCArMSw3OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPnN5c3RlbS1wcm9wZXJ0aWVzLWV4YW1wbGU8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktZXhhbXBsZXMtc3lzdGVtLXByb3BlcnRpZXM8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+SmVyc2V5IHN5c3RlbSBwcm9wZXJ0aWVzIGV4YW1wbGUuPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItZ3JpenpseTItaHR0cDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1oazI8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktcHJveHktY2xpZW50PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItYnVuZGxlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHR5cGU+cG9tPC90eXBlPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGVjLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPG1haW5DbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5zeXNwcm9wcy5BcHA8L21haW5DbGFzcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnJlbGVhc2U8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc3lzdGVtLXByb3BlcnRpZXMtZXhhbXBsZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3N5c3Byb3BzL0FwcC5qYXZhIGIvZXhhbXBsZXMvc3lzdGVtLXByb3BlcnRpZXMtZXhhbXBsZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3N5c3Byb3BzL0FwcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YWU4NDMKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zeXN0ZW0tcHJvcGVydGllcy1leGFtcGxlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvc3lzcHJvcHMvQXBwLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5zeXNwcm9wczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnN5c3Byb3BzLmltcGwuUHJvcGVydHlOYW1lc1Jlc291cmNlSW1wbDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5Mi5odHRwc2VydmVyLkdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmdyaXp6bHkuaHR0cC5zZXJ2ZXIuSHR0cFNlcnZlcjsKKworLyoqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIEFwcCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIEJBU0VfVVJJID0gVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwLyIpOworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTeXN0ZW0gUHJvcGVydGllcyBKZXJzZXkgRXhhbXBsZSBBcHAiKTsKKworICAgICAgICAgICAgZmluYWwgSHR0cFNlcnZlciBzZXJ2ZXIgPSBHcml6emx5SHR0cFNlcnZlckZhY3RvcnkuY3JlYXRlSHR0cFNlcnZlcihCQVNFX1VSSSwgY3JlYXRlQXBwKCksIGZhbHNlKTsKKyAgICAgICAgICAgIFJ1bnRpbWUuZ2V0UnVudGltZSgpLmFkZFNodXRkb3duSG9vayhuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHNlcnZlci5zaHV0ZG93bk5vdygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pKTsKKyAgICAgICAgICAgIHNlcnZlci5zdGFydCgpOworCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCisgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIkFwcGxpY2F0aW9uIHN0YXJ0ZWQuJW4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiVHJ5IG91dCAlcyVuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlN0b3AgdGhlIGFwcGxpY2F0aW9uIHVzaW5nIENUUkwrQyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQkFTRV9VUkkgKyAiL3Byb3BlcnRpZXMiKSk7CisKKyAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuam9pbigpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiB8IEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKEFwcC5jbGFzcy5nZXROYW1lKCkpLmxvZyhMZXZlbC5TRVZFUkUsIG51bGwsIGV4KTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZUNvbmZpZyBjcmVhdGVBcHAoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoCisgICAgICAgICAgICAgICAgUHJvcGVydHlOYW1lc1Jlc291cmNlSW1wbC5jbGFzcywKKyAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzV3JpdGVyLmNsYXNzCisgICAgICAgICk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc3lzdGVtLXByb3BlcnRpZXMtZXhhbXBsZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3N5c3Byb3BzL1Byb3BlcnRpZXNSZWFkZXIuamF2YSBiL2V4YW1wbGVzL3N5c3RlbS1wcm9wZXJ0aWVzLWV4YW1wbGUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9zeXNwcm9wcy9Qcm9wZXJ0aWVzUmVhZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVkZDM5MgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3N5c3RlbS1wcm9wZXJ0aWVzLWV4YW1wbGUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9zeXNwcm9wcy9Qcm9wZXJ0aWVzUmVhZGVyLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5zeXNwcm9wczsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuTWVzc2FnZVV0aWxzOworCisvKioKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitAQ29uc3VtZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCitwdWJsaWMgY2xhc3MgUHJvcGVydGllc1JlYWRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5UmVhZGVyPFNldDxTdHJpbmc+PiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKGZpbmFsIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICByZXR1cm4gU2V0LmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxTdHJpbmc+IHJlYWRGcm9tKGZpbmFsIENsYXNzPFNldDxTdHJpbmc+PiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGVudGl0eVN0cmVhbSwgTWVzc2FnZVV0aWxzLmdldENoYXJzZXQobWVkaWFUeXBlKSkpOworICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiByZXN1bHQgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgIFN0cmluZyBsaW5lOworICAgICAgICB3aGlsZSAoKGxpbmUgPSBici5yZWFkTGluZSgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXN1bHQuYWRkKGxpbmUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc3lzdGVtLXByb3BlcnRpZXMtZXhhbXBsZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3N5c3Byb3BzL1Byb3BlcnRpZXNXcml0ZXIuamF2YSBiL2V4YW1wbGVzL3N5c3RlbS1wcm9wZXJ0aWVzLWV4YW1wbGUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9zeXNwcm9wcy9Qcm9wZXJ0aWVzV3JpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTliODQ3MgotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3N5c3RlbS1wcm9wZXJ0aWVzLWV4YW1wbGUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9zeXNwcm9wcy9Qcm9wZXJ0aWVzV3JpdGVyLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5zeXNwcm9wczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLk1lc3NhZ2VVdGlsczsKKworLyoqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorcHVibGljIGNsYXNzIFByb3BlcnRpZXNXcml0ZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVdyaXRlcjxTZXQ8U3RyaW5nPj4geworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiBTZXQuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0eXBlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBnZXRTaXplKGZpbmFsIFNldDxTdHJpbmc+IHMsIGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oZmluYWwgU2V0PFN0cmluZz4gcywgZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFByaW50U3RyZWFtIHBzID0gbmV3IFByaW50U3RyZWFtKGVudGl0eVN0cmVhbSwgdHJ1ZSwgTWVzc2FnZVV0aWxzLmdldENoYXJzZXQobWVkaWFUeXBlKS5uYW1lKCkpOworCisgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIGl0ZW0gOiBzKSB7CisgICAgICAgICAgICBwcy5wcmludGxuKGl0ZW0pOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc3lzdGVtLXByb3BlcnRpZXMtZXhhbXBsZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3N5c3Byb3BzL1Byb3BlcnR5TmFtZXNSZXNvdXJjZS5qYXZhIGIvZXhhbXBsZXMvc3lzdGVtLXByb3BlcnRpZXMtZXhhbXBsZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3N5c3Byb3BzL1Byb3BlcnR5TmFtZXNSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzN2UwYTkKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zeXN0ZW0tcHJvcGVydGllcy1leGFtcGxlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvc3lzcHJvcHMvUHJvcGVydHlOYW1lc1Jlc291cmNlLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5zeXNwcm9wczsKKworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKKy8qKgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK0BQYXRoKCJwcm9wZXJ0aWVzIikKK0BQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKK0BDb25zdW1lcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKK3B1YmxpYyBpbnRlcmZhY2UgUHJvcGVydHlOYW1lc1Jlc291cmNlIHsKKyAgICBAR0VUCisgICAgU2V0PFN0cmluZz4gZ2V0UHJvcGVydHlOYW1lcygpOworCisgICAgQFBhdGgoIntuYW1lfSIpCisgICAgcHVibGljIFByb3BlcnR5UmVzb3VyY2UgZ2V0UHJvcGVydHkoQFBhdGhQYXJhbSgibmFtZSIpIFN0cmluZyBuYW1lKTsKK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3N5c3RlbS1wcm9wZXJ0aWVzLWV4YW1wbGUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9zeXNwcm9wcy9Qcm9wZXJ0eVJlc291cmNlLmphdmEgYi9leGFtcGxlcy9zeXN0ZW0tcHJvcGVydGllcy1leGFtcGxlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvc3lzcHJvcHMvUHJvcGVydHlSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZTg5NTQKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zeXN0ZW0tcHJvcGVydGllcy1leGFtcGxlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvc3lzcHJvcHMvUHJvcGVydHlSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuc3lzcHJvcHM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUFVUOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCisvKioKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCitAQ29uc3VtZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCitwdWJsaWMgaW50ZXJmYWNlIFByb3BlcnR5UmVzb3VyY2UgeworICAgIEBHRVQKKyAgICBTdHJpbmcgZ2V0KCk7CisKKyAgICBAUFVUCisgICAgU3RyaW5nIHNldChTdHJpbmcgdmFsdWUpOworfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc3lzdGVtLXByb3BlcnRpZXMtZXhhbXBsZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3N5c3Byb3BzL2ltcGwvUHJvcGVydHlOYW1lc1Jlc291cmNlSW1wbC5qYXZhIGIvZXhhbXBsZXMvc3lzdGVtLXByb3BlcnRpZXMtZXhhbXBsZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3N5c3Byb3BzL2ltcGwvUHJvcGVydHlOYW1lc1Jlc291cmNlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ZDNlYjgKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zeXN0ZW0tcHJvcGVydGllcy1leGFtcGxlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvc3lzcHJvcHMvaW1wbC9Qcm9wZXJ0eU5hbWVzUmVzb3VyY2VJbXBsLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5zeXNwcm9wcy5pbXBsOworCitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5zeXNwcm9wcy5Qcm9wZXJ0eU5hbWVzUmVzb3VyY2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMuc3lzcHJvcHMuUHJvcGVydHlSZXNvdXJjZTsKKworLyoqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIFByb3BlcnR5TmFtZXNSZXNvdXJjZUltcGwgaW1wbGVtZW50cyBQcm9wZXJ0eU5hbWVzUmVzb3VyY2UgeworICAgIEBDb250ZXh0CisgICAgcHJpdmF0ZSBVcmlJbmZvIHVyaUluZm87CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0UHJvcGVydHlOYW1lcygpIHsKKyAgICAgICAgcmV0dXJuIFN5c3RlbS5nZXRQcm9wZXJ0aWVzKCkuc3RyaW5nUHJvcGVydHlOYW1lcygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBQcm9wZXJ0eVJlc291cmNlIGdldFByb3BlcnR5KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBuZXcgUHJvcGVydHlSZXNvdXJjZUltcGwobmFtZSwgdXJpSW5mbyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc3lzdGVtLXByb3BlcnRpZXMtZXhhbXBsZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3N5c3Byb3BzL2ltcGwvUHJvcGVydHlSZXNvdXJjZUltcGwuamF2YSBiL2V4YW1wbGVzL3N5c3RlbS1wcm9wZXJ0aWVzLWV4YW1wbGUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9zeXNwcm9wcy9pbXBsL1Byb3BlcnR5UmVzb3VyY2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ3OTQxNwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3N5c3RlbS1wcm9wZXJ0aWVzLWV4YW1wbGUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy9zeXNwcm9wcy9pbXBsL1Byb3BlcnR5UmVzb3VyY2VJbXBsLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5zeXNwcm9wcy5pbXBsOworCitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5zeXNwcm9wcy5Qcm9wZXJ0eVJlc291cmNlOworCisvKioKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitwdWJsaWMgY2xhc3MgUHJvcGVydHlSZXNvdXJjZUltcGwgaW1wbGVtZW50cyBQcm9wZXJ0eVJlc291cmNlIHsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworICAgIHByaXZhdGUgZmluYWwgVXJpSW5mbyB1cmlJbmZvOworCisgICAgcHVibGljIFByb3BlcnR5UmVzb3VyY2VJbXBsKFN0cmluZyBuYW1lLCBVcmlJbmZvIHVyaUluZm8pIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy51cmlJbmZvID0gdXJpSW5mbzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgU3RyaW5nIHZhbHVlID0gU3lzdGVtLmdldFByb3BlcnR5KG5hbWUpOworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKDQwNCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgc2V0KFN0cmluZyB2YWx1ZSkgeworICAgICAgICBpZiAoU3lzdGVtLnNldFByb3BlcnR5KG5hbWUsIHZhbHVlKSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViQXBwbGljYXRpb25FeGNlcHRpb24oUmVzcG9uc2UuY3JlYXRlZCh1cmlJbmZvLmdldFJlcXVlc3RVcmkoKSkuZW50aXR5KHZhbHVlKS5idWlsZCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvc3lzdGVtLXByb3BlcnRpZXMtZXhhbXBsZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3N5c3Byb3BzL1N5c1Byb3BzVGVzdC5qYXZhIGIvZXhhbXBsZXMvc3lzdGVtLXByb3BlcnRpZXMtZXhhbXBsZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3N5c3Byb3BzL1N5c1Byb3BzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxODg3ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy9zeXN0ZW0tcHJvcGVydGllcy1leGFtcGxlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMvc3lzcHJvcHMvU3lzUHJvcHNUZXN0LmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy5zeXNwcm9wczsKKworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5wcm94eS5XZWJSZXNvdXJjZUZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFN5c3RlbSBwcm9wZXJ0aWVzIGV4YW1wbGUgdW5pdCB0ZXN0LgorICoKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitwdWJsaWMgY2xhc3MgU3lzUHJvcHNUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKyAgICAgICAgcmV0dXJuIEFwcC5jcmVhdGVBcHAoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcucmVnaXN0ZXIoUHJvcGVydGllc1JlYWRlci5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UHJvcGVydHlOYW1lcygpIHsKKyAgICAgICAgUHJvcGVydHlOYW1lc1Jlc291cmNlIHByb3BlcnR5TmFtZXNSZXNvdXJjZSA9IFdlYlJlc291cmNlRmFjdG9yeS5uZXdSZXNvdXJjZShQcm9wZXJ0eU5hbWVzUmVzb3VyY2UuY2xhc3MsIHRhcmdldCgpKTsKKyAgICAgICAgU2V0PFN0cmluZz4gcHJvcGVydHlOYW1lcyA9IHByb3BlcnR5TmFtZXNSZXNvdXJjZS5nZXRQcm9wZXJ0eU5hbWVzKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhTeXN0ZW0uZ2V0UHJvcGVydGllcygpLnN0cmluZ1Byb3BlcnR5TmFtZXMoKSwgcHJvcGVydHlOYW1lcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UHJvcGVydHkoKSB7CisgICAgICAgIFByb3BlcnR5TmFtZXNSZXNvdXJjZSBwbnIgPSBXZWJSZXNvdXJjZUZhY3RvcnkubmV3UmVzb3VyY2UoUHJvcGVydHlOYW1lc1Jlc291cmNlLmNsYXNzLCB0YXJnZXQoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIiksIHBuci5nZXRQcm9wZXJ0eSgiamF2YS5ob21lIikuZ2V0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNldFByb3BlcnR5KCkgeworICAgICAgICBQcm9wZXJ0eU5hbWVzUmVzb3VyY2UgcG5yID0gV2ViUmVzb3VyY2VGYWN0b3J5Lm5ld1Jlc291cmNlKFByb3BlcnR5TmFtZXNSZXNvdXJjZS5jbGFzcywgdGFyZ2V0KCkpOworCisgICAgICAgIHBuci5nZXRQcm9wZXJ0eSgidGVzdCIpLnNldCgidGhpcyBpcyBhIHRlc3QiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFN5c3RlbS5nZXRQcm9wZXJ0eSgidGVzdCIpLCBwbnIuZ2V0UHJvcGVydHkoInRlc3QiKS5nZXQoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMvd2ViYXBwLWV4YW1wbGUtcGFyZW50L3BvbS54bWwgYi9leGFtcGxlcy93ZWJhcHAtZXhhbXBsZS1wYXJlbnQvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmE3MDZlCi0tLSAvZGV2L251bGwKKysrIGIvZXhhbXBsZXMvd2ViYXBwLWV4YW1wbGUtcGFyZW50L3BvbS54bWwKQEAgLTAsMCArMSwxODMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisKKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPndlYmFwcC1leGFtcGxlLXBhcmVudDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS1leGFtcGxlcy13ZWJhcHAtcGFyZW50LXBvbTwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgV2ViIEFwcGxpY2F0aW9uIChTZXJ2bGV0KSBleGFtcGxlcyBwYXJlbnQgUE9NLjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD54bWwtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmFzc2VtYmxlLWdmLXNyYy16aXA8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wcmVwYXJlLXBhY2thZ2U8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+dHJhbnNmb3JtPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cmFuc2Zvcm1hdGlvblNldHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHJhbnNmb3JtYXRpb25TZXQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpcj4ke3Byb2plY3QuYmFzZWRpcn08L2Rpcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPnBvbS54bWw8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3R5bGVzaGVldD4uLi9ldGMvZ2YtcHJvamVjdC1zcmMtcG9tLnhzbDwvc3R5bGVzaGVldD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyPiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2dmLXBvbS1maWxlPC9vdXRwdXREaXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyYW5zZm9ybWF0aW9uU2V0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyYW5zZm9ybWF0aW9uU2V0cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmFzc2VtYmxlLXdscy1zcmMtemlwPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cHJlcGFyZS1wYWNrYWdlPC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnRyYW5zZm9ybTwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHJhbnNmb3JtYXRpb25TZXRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyYW5zZm9ybWF0aW9uU2V0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXI+JHtwcm9qZWN0LmJhc2VkaXJ9PC9kaXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5wb20ueG1sPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0eWxlc2hlZXQ+Li4vZXRjL3dscy1wcm9qZWN0LXNyYy1wb20ueHNsPC9zdHlsZXNoZWV0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXI+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vd2xzLXBvbS1maWxlPC9vdXRwdXREaXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyYW5zZm9ybWF0aW9uU2V0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRyYW5zZm9ybWF0aW9uU2V0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXI+JHtwcm9qZWN0LmJhc2VkaXJ9PC9kaXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi93ZWIueG1sPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0eWxlc2hlZXQ+Li4vZXRjL3dscy1wcm9qZWN0LXNyYy13ZWIueHNsPC9zdHlsZXNoZWV0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXI+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vd2xzLXdlYi14bWwtZmlsZTwvb3V0cHV0RGlyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cmFuc2Zvcm1hdGlvblNldD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cmFuc2Zvcm1hdGlvblNldHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hc3NlbWJsZS13bHMxMjEzLXNyYy16aXA8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wcmVwYXJlLXBhY2thZ2U8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+dHJhbnNmb3JtPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cmFuc2Zvcm1hdGlvblNldHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHJhbnNmb3JtYXRpb25TZXQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpcj4ke3Byb2plY3QuYmFzZWRpcn08L2Rpcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPnBvbS54bWw8L2luY2x1ZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3R5bGVzaGVldD4uLi9ldGMvd2xzMTIxMy1wcm9qZWN0LXNyYy1wb20ueHNsPC9zdHlsZXNoZWV0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXREaXI+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vd2xzMTIxMy1wb20tZmlsZTwvb3V0cHV0RGlyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC90cmFuc2Zvcm1hdGlvblNldD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0cmFuc2Zvcm1hdGlvblNldD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGlyPiR7cHJvamVjdC5iYXNlZGlyfTwvZGlyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGU+Kiovd2ViLnhtbDwvaW5jbHVkZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2luY2x1ZGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHlsZXNoZWV0Pi4uL2V0Yy93bHMtcHJvamVjdC1zcmMtd2ViLnhzbDwvc3R5bGVzaGVldD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyPiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3dsczEyMTMtd2ViLXhtbC1maWxlPC9vdXRwdXREaXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyYW5zZm9ybWF0aW9uU2V0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyYW5zZm9ybWF0aW9uU2V0cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmFzc2VtYmxlLWdmLXNyYy16aXA8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnNpbmdsZTwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvclJlZnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFJlZmVyZW5jZSB0byBhIGRlc2NyaXB0b3IgaW4gb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXM6YXNzZW1ibGllcyBtb2R1bGUgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvclJlZj5nbGFzc2Zpc2gtc3JjLXppcDwvZGVzY3JpcHRvclJlZj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9yUmVmcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmFzc2VtYmxlLXdscy1zcmMtemlwPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5zaW5nbGU8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3JSZWZzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBSZWZlcmVuY2UgdG8gYSBkZXNjcmlwdG9yIGluIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzOmFzc2VtYmxpZXMgbW9kdWxlIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3JSZWY+d2VibG9naWMtc3JjLXppcDwvZGVzY3JpcHRvclJlZj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9yUmVmcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmFzc2VtYmxlLXdsczEyMTMtc3JjLXppcDwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+c2luZ2xlPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yUmVmcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUmVmZXJlbmNlIHRvIGEgZGVzY3JpcHRvciBpbiBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlczphc3NlbWJsaWVzIG1vZHVsZSAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yUmVmPndlYmxvZ2ljMTIxMy1zcmMtemlwPC9kZXNjcmlwdG9yUmVmPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JSZWZzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWpldHR5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8d2ViQXBwPiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9LyR7cHJvamVjdC5hcnRpZmFjdElkfS53YXI8L3dlYkFwcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb250ZXh0UGF0aD4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2NvbnRleHRQYXRoPgorICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9leGFtcGxlcy94bWwtbW94eS9SRUFETUUuTUQgYi9leGFtcGxlcy94bWwtbW94eS9SRUFETUUuTUQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM2N2UwNAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3htbC1tb3h5L1JFQURNRS5NRApAQCAtMCwwICsxLDExNyBAQAorWy8vXTogIyAiIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAiCitbLy9dOiAjICIgIgorWy8vXTogIyAiIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAiCitbLy9dOiAjICIgdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQgIgorWy8vXTogIyAiIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4gIgorWy8vXTogIyAiICIKK1svL106ICMgIiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlICIKKworTU9YeSBFeGFtcGxlCis9PT09PT09PT09PT0KKworV2hhdCBpcyBNT1h5CistLS0tLS0tLS0tLS0KKworVGhpcyBleGFtcGxlIGRlbW9uc3RyYXRlcyB0aGF0IHlvdSBjYW4gdXRpbGl6ZSBNT1h5IGV4dGVuc2lvbnMgd2hlbgorZGVhbGluZyB3aXRoIFhNTCByZXByZXNlbnRhdGlvbiB3aGVuIGRldmVsb3BpbmcgYSBKZXJzZXkgYmFzZWQgUkVTVGZ1bAorV2ViIGFwcGxpY2F0aW9uCisKK01PWHkgaXMgRWNsaXBzZUxpbmsncyBPYmplY3QgdG8gWE1MIE1hcHBpbmcgc2VydmljZXMuIE1PWHkgYWxsb3dzIGZvciBhCitQT0pPIG9iamVjdCBtb2RlbCB0byBiZSBtYXBwZWQgdG8gYW4gWE1MIHNjaGVtYS4gVGhlIEphdmEgQXJjaGl0ZWN0dXJlCitmb3IgWE1MIEJpbmRpbmcgKEpBWEIpIHByb3ZpZGVzIGEgSmF2YSBzdGFuZGFyZCBmb3Igb2JqZWN0IFhNTCBtYXBwaW5nCisoT1hNKS4gTU9YeSBzdXBwb3J0cyBKQVhCLCBhcyB3ZWxsIGFzIHByb3ZpZGluZyBpdHMnIG93biBuYXRpdmUgQVBJIGFuZAoraW50ZWdyYXRpb24gd2l0aCBXZWIgU2VydmljZXMuCisKK01PWHkgWE1MIFBhdGggTWFwcGluZyBFeHRlbnNpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIE1PWHkgZXh0ZW5zaW9uIHNob3duIGluIHRoaXMgZXhhbXBsZSBpcyBkZXNjcmliZWQgb24gdGhlIEVjbGlwc2UKK1dpa2kgc2l0ZSBhdAorPGh0dHA6Ly93aWtpLmVjbGlwc2Uub3JnL0VjbGlwc2VMaW5rL0V4YW1wbGVzL01PWHkvR2V0dGluZ1N0YXJ0ZWQvTU9YeUV4dGVuc2lvbnM+LgorSXQgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHBhdGggYmFzZWQgbWFwcGluZyB2aWEgQFhtbFBhdGggYW5ub3RhdGlvbi4KKworSWYgdGhlIE1PWHkgZXh0ZW5zaW9uIHdhcyBub3QgdXNlZCwgdGhlIFhNTCByZXByZXNlbmF0aW9uIG9mIHRoZQorY3VzdG9tZXIgZGF0YSB3b3VsZCBsb29rIGxpa2UgZm9sbG93czoKKworYGBgeG1sCis8Y3VzdG9tZXI+CisgIDxuYW1lPkphbmUgRG9lPC9uYW1lPgorICA8YWRkcmVzcz4KKyAgICA8Y2l0eT5NeSBUb3duPC9jaXR5PgorICAgIDxzdHJlZXQ+MTIzIEFueSBTdHJlZXQ8L3N0cmVldD4KKyAgPC9hZGRyZXNzPgorICA8cGhvbmVOdW1iZXJzIHR5cGU9IndvcmsiPjYxMy01NTUtMTExMTwvcGhvbmVOdW1iZXJzPgorICA8cGhvbmVOdW1iZXJzIHR5cGU9ImNlbGwiPjYxMy01NTUtMjIyMjwvcGhvbmVOdW1iZXJzPgorPC9jdXN0b21lcj4KK2BgYAorCitCeSBhZGRpbmcgYEBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5veG0uYW5ub3RhdGlvbnMuWG1sUGF0aGAgYW5ub3RhdGlvbgordG8gdGhlIGJlYW4gZGVmaW5pdGlvbiBjbGFzc2VzLCB5b3Ugd2lsbCBnZXQgdGhlIGZvbGxvd2luZyBYTUwKK3JlcHJlc2VudGF0aW9uIGluc3RlYWQ6CisKK2BgYHhtbAorPGN1c3RvbWVyPgorICA8cGVyc29uYWwtaW5mbz4KKyAgICA8bmFtZT5KYW5lIERvZTwvbmFtZT4KKyAgPC9wZXJzb25hbC1pbmZvPgorICA8Y29udGFjdC1pbmZvPgorICAgIDxhZGRyZXNzPgorICAgICAgPGNpdHk+TXkgVG93bjwvY2l0eT4KKyAgICAgIDxzdHJlZXQ+MTIzIEFueSBTdHJlZXQ8L3N0cmVldD4KKyAgICA8L2FkZHJlc3M+CisgICAgPHBob25lLW51bWJlciB0eXBlPSJ3b3JrIj42MTMtNTU1LTExMTE8L3Bob25lLW51bWJlcj4KKyAgICA8cGhvbmUtbnVtYmVyIHR5cGU9ImNlbGwiPjYxMy01NTUtMjIyMjwvcGhvbmUtbnVtYmVyPgorICA8L2NvbnRhY3QtaW5mbz4KKzwvY3VzdG9tZXI+CitgYGAKKworWE1MIFBhdGggZXhwcmVzc2lvbnMgdXNlZCBhcmU6CisKKy0gICBwZXJzb25hbC1pbmZvL25hbWUvdGV4dCgpCistICAgY29udGFjdC1pbmZvL2FkZHJlc3MKKy0gICBjb250YWN0LWluZm8vcGhvbmUtbnVtYmVyCisKK1BsZWFzZSBjaGVjayBvdXQgdGhlIHNvdXJjZSBjb2RlIGFuZCB0aGUgd2lraSBwYWdlIGxpbmtlZCBhYm92ZSBmb3IgdGhlCitkZXRhaWxlZCBpbmZvcm1hdGlvbiBvbiB0aGUgWE1MIFBhdGggbWFwcGluZyBmZWF0dXJlLgorCitSZXBsYWNpbmcgSW1wbGljaXQgSkFYQiBSdW50aW1lIFdpdGggTU9YeQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworU2luY2UgTU9YeSBpcyBhIEpBWEIgaW1wbGVtZW50YXRpb24sIHRoZSBleGFtcGxlIHN0aWxsIHV0aWxpemVzIHRoZQorc3RhbmRhcmQgSmVyc2V5IEpBWEIgbWVzc2FnZSBib2R5IHJlYWRlci93cml0ZXIgcHJvdmlkZXJzLiBUbyBtYWtlCitKZXJzZXkgdXNlIE1PWHkgcnVudGltZSwgeW91IGp1c3QgbmVlZCB0byBwdXQgYSBgamF4Yi5wcm9wZXJ0aWVzYCBmaWxlCitpbnRvIHRoZSBKYXZhIHBhY2thZ2UgY29udGFpbmluZyB5b3VyIEpBWEIgYmVhbnMuIFRoZSBmaWxlIHNob3VsZCBoYXZlCit0aGUgZm9sbG93aW5nIGNvbnRlbnQ6CisKKyAgICBqYXZheC54bWwuYmluZC5jb250ZXh0LmZhY3Rvcnk9b3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuamF4Yi5KQVhCQ29udGV4dEZhY3RvcnkKKworQ29uY3JldGUgZmlsZSB1c2VkIGluIHRoaXMgZXhhbXBsZSBpcyBwbGFjZWQgdW5kZXIKKworICAgIHNyYy9tYWluL3Jlc291cmNlcy9jb20vc3VuL2plcnNleS9zYW1wbGVzL21veHkvYmVhbnMvamF4Yi5wcm9wZXJ0aWVzCisKK0NvbnRlbnRzCistLS0tLS0tLQorCitUaGUgZXhhbXBsZSBjb25zaXN0cyBvZiBhIHNpbmdsZSBSRVNUIFJlc291cmNlIHJlcHJlc2VudGVkIGJ5IHRoZQorZm9sbG93aW5nIEphdmEgY2xhc3M6CisKKyAgICBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy54bWxtb3h5LkN1c3RvbWVyUmVzb3VyY2UKKworQSByZXNvdXJjZSBjbGFzcyB0aGF0IG1haW50YWlucyBhIHNpbmdsZSBjdXN0b21lciBkYXRhLgorCitUaGUgbWFwcGluZyBvZiB0aGUgVVJJIHBhdGggc3BhY2UgaXMgcHJlc2VudGVkIGluIHRoZSBmb2xsb3dpbmcgdGFibGU6CisKK1VSSSBwYXRoICAgICAgICAgfCBSZXNvdXJjZSBjbGFzcyAgICAgfCBIVFRQIG1ldGhvZHMKKy0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLS0tLS0gfCAtLS0tLS0tLS0tLS0tLQorKipfL2N1c3RvbWVyXyoqICB8IEN1c3RvbWVyUmVzb3VyY2UgICB8IEdFVCwgUFVUCisKK1J1bm5pbmcgdGhlIEV4YW1wbGUKKy0tLS0tLS0tLS0tLS0tLS0tLS0KKworUnVuIHRoZSBleGFtcGxlIGFzIGZvbGxvd3M6CisKKz4gICAgIG12biBjbGVhbiBjb21waWxlIGV4ZWM6amF2YQorCitUaGlzIGRlcGxveXMgdGhlIGV4YW1wbGUgdXNpbmcgW0dyaXp6bHldKGh0dHA6Ly9ncml6emx5LmphdmEubmV0LykgY29udGFpbmVyLiBZb3UgY2FuIGFjY2VzcyB0aGUgYXBwbGljYXRpb24gYXQ6CisKKy0gICBbaHR0cDovL2xvY2FsaG9zdDo4MDgwL21veHkvY3VzdG9tZXJdKGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC94bWwtbW94eS9jdXN0b21lcikKZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3htbC1tb3h5L3BvbS54bWwgYi9leGFtcGxlcy94bWwtbW94eS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZmZkZWYKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy94bWwtbW94eS9wb20ueG1sCkBAIC0wLDAgKzEsNzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+eG1sLW1veHk8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktZXhhbXBsZXMtbW94eTwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgWE1MIE1PWHkgZXhhbXBsZS48L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1ncml6emx5Mi1odHRwPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktaGsyPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1tb3h5PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItYnVuZGxlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHR5cGU+cG9tPC90eXBlPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5leGVjLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPG1haW5DbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy54bWxtb3h5LkFwcDwvbWFpbkNsYXNzPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+cmVsZWFzZTwvaWQ+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICA8L3Byb2ZpbGVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9leGFtcGxlcy94bWwtbW94eS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3htbG1veHkvQXBwLmphdmEgYi9leGFtcGxlcy94bWwtbW94eS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3htbG1veHkvQXBwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZjZDUyYwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3htbC1tb3h5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMveG1sbW94eS9BcHAuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnhtbG1veHk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5Mi5odHRwc2VydmVyLkdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb3h5LnhtbC5Nb3h5WG1sRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmdyaXp6bHkuaHR0cC5zZXJ2ZXIuSHR0cFNlcnZlcjsKKworLyoqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQXBwIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVSSSBCQVNFX1VSSSA9IFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC94bWwtbW94eS8iKTsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiWE1MIHdpdGggTU9YeSBKZXJzZXkgRXhhbXBsZSBBcHAiKTsKKworICAgICAgICAgICAgZmluYWwgSHR0cFNlcnZlciBzZXJ2ZXIgPSBHcml6emx5SHR0cFNlcnZlckZhY3RvcnkuY3JlYXRlSHR0cFNlcnZlcihCQVNFX1VSSSwgY3JlYXRlQXBwKCkpOworICAgICAgICAgICAgUnVudGltZS5nZXRSdW50aW1lKCkuYWRkU2h1dGRvd25Ib29rKG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgc2VydmVyLnNodXRkb3duTm93KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkpOworICAgICAgICAgICAgc2VydmVyLnN0YXJ0KCk7CisKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihTdHJpbmcuZm9ybWF0KCJBcHBsaWNhdGlvbiBzdGFydGVkLiVuVHJ5IG91dCAlcyVuU3RvcCB0aGUgYXBwbGljYXRpb24gdXNpbmcgQ1RSTCtDIiwKKyAgICAgICAgICAgICAgICAgICAgQkFTRV9VUkkgKyAiL2N1c3RvbWVyIikpOworCisgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmpvaW4oKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gfCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihBcHAuY2xhc3MuZ2V0TmFtZSgpKS5sb2coTGV2ZWwuU0VWRVJFLCBudWxsLCBleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlQ29uZmlnIGNyZWF0ZUFwcCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZygpLnBhY2thZ2VzKCJvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy54bWxtb3h5IikucmVnaXN0ZXIobmV3IE1veHlYbWxGZWF0dXJlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3htbC1tb3h5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMveG1sbW94eS9DdXN0b21lclJlc291cmNlLmphdmEgYi9leGFtcGxlcy94bWwtbW94eS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3htbG1veHkvQ3VzdG9tZXJSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYjVlZTAKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy94bWwtbW94eS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3htbG1veHkvQ3VzdG9tZXJSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMueG1sbW94eTsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QVVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnhtbG1veHkuYmVhbnMuQWRkcmVzczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy54bWxtb3h5LmJlYW5zLkN1c3RvbWVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnhtbG1veHkuYmVhbnMuUGhvbmVOdW1iZXI7CisKK0BQYXRoKCIvY3VzdG9tZXIiKQorcHVibGljIGNsYXNzIEN1c3RvbWVyUmVzb3VyY2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgQ3VzdG9tZXIgY3VzdG9tZXIgPSBjcmVhdGVJbml0aWFsQ3VzdG9tZXIoKTsKKworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTCkKKyAgICBwdWJsaWMgQ3VzdG9tZXIgZ2V0Q3VzdG9tZXIoKSB7CisgICAgICAgIHJldHVybiBjdXN0b21lcjsKKyAgICB9CisKKyAgICBAUFVUCisgICAgQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUwpCisgICAgcHVibGljIHZvaWQgc2V0Q3VzdG9tZXIoZmluYWwgQ3VzdG9tZXIgYykgeworICAgICAgICBzZXRDdXN0b21lclRvU3RhdGljKGMpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEN1c3RvbWVyIGNyZWF0ZUluaXRpYWxDdXN0b21lcigpIHsKKyAgICAgICAgZmluYWwgQ3VzdG9tZXIgcmVzdWx0ID0gbmV3IEN1c3RvbWVyKCk7CisKKyAgICAgICAgcmVzdWx0LnNldE5hbWUoIkphbmUgRG9lIik7CisgICAgICAgIHJlc3VsdC5zZXRBZGRyZXNzKG5ldyBBZGRyZXNzKCIxMjMgQW55IFN0cmVldCIsICJNeSBUb3duIikpOworICAgICAgICByZXN1bHQuZ2V0UGhvbmVOdW1iZXJzKCkuYWRkKG5ldyBQaG9uZU51bWJlcigid29yayIsICI2MTMtNTU1LTExMTEiKSk7CisgICAgICAgIHJlc3VsdC5nZXRQaG9uZU51bWJlcnMoKS5hZGQobmV3IFBob25lTnVtYmVyKCJjZWxsIiwgIjYxMy01NTUtMjIyMiIpKTsKKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0Q3VzdG9tZXJUb1N0YXRpYyhmaW5hbCBDdXN0b21lciBjdXN0b21lcikgeworICAgICAgICBDdXN0b21lclJlc291cmNlLmN1c3RvbWVyID0gY3VzdG9tZXI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXhhbXBsZXMveG1sLW1veHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy94bWxtb3h5L2JlYW5zL0FkZHJlc3MuamF2YSBiL2V4YW1wbGVzL3htbC1tb3h5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMveG1sbW94eS9iZWFucy9BZGRyZXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYyMzhmMQotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3htbC1tb3h5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMveG1sbW94eS9iZWFucy9BZGRyZXNzLmphdmEKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgRGlzdHJpYnV0aW9uIExpY2Vuc2Ugdi4gMS4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvb3JnL2RvY3VtZW50cy9lZGwtdjEwLnBocC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQlNELTMtQ2xhdXNlCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy54bWxtb3h5LmJlYW5zOworCisvKioKKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQWRkcmVzcyB7CisKKyAgICBwcml2YXRlIFN0cmluZyBzdHJlZXQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgY2l0eTsKKworICAgIHB1YmxpYyBBZGRyZXNzKCl7fQorCisgICAgcHVibGljIEFkZHJlc3MoU3RyaW5nIHN0cmVldCwgU3RyaW5nIGNpdHkpIHsKKyAgICAgICAgdGhpcy5zdHJlZXQgPSBzdHJlZXQ7CisgICAgICAgIHRoaXMuY2l0eSA9IGNpdHk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTdHJlZXQoKSB7CisgICAgICAgIHJldHVybiBzdHJlZXQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3RyZWV0KFN0cmluZyBzdHJlZXQpIHsKKyAgICAgICAgdGhpcy5zdHJlZXQgPSBzdHJlZXQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDaXR5KCkgeworICAgICAgICByZXR1cm4gY2l0eTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDaXR5KFN0cmluZyBjaXR5KSB7CisgICAgICAgIHRoaXMuY2l0eSA9IGNpdHk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBBZGRyZXNzIG90aGVyID0gKEFkZHJlc3MpIG9iajsKKyAgICAgICAgaWYgKCh0aGlzLnN0cmVldCA9PSBudWxsKSA/IChvdGhlci5zdHJlZXQgIT0gbnVsbCkgOiAhdGhpcy5zdHJlZXQuZXF1YWxzKG90aGVyLnN0cmVldCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHRoaXMuY2l0eSA9PSBudWxsKSA/IChvdGhlci5jaXR5ICE9IG51bGwpIDogIXRoaXMuY2l0eS5lcXVhbHMob3RoZXIuY2l0eSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IDM7CisgICAgICAgIGhhc2ggPSAyOSAqIGhhc2ggKyAodGhpcy5zdHJlZXQgIT0gbnVsbCA/IHRoaXMuc3RyZWV0Lmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgaGFzaCA9IDI5ICogaGFzaCArICh0aGlzLmNpdHkgIT0gbnVsbCA/IHRoaXMuY2l0eS5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIHJldHVybiBoYXNoOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3htbC1tb3h5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMveG1sbW94eS9iZWFucy9DdXN0b21lci5qYXZhIGIvZXhhbXBsZXMveG1sLW1veHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy94bWxtb3h5L2JlYW5zL0N1c3RvbWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFmNmIzMwotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3htbC1tb3h5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMveG1sbW94eS9iZWFucy9DdXN0b21lci5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMueG1sbW94eS5iZWFuczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm94bS5hbm5vdGF0aW9ucy5YbWxQYXRoOworCisvKioKKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAWG1sUm9vdEVsZW1lbnQKK0BYbWxUeXBlKHByb3BPcmRlciA9IHsibmFtZSIsICJhZGRyZXNzIiwgInBob25lTnVtYmVycyJ9KQorcHVibGljIGNsYXNzIEN1c3RvbWVyIHsKKworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisgICAgcHJpdmF0ZSBBZGRyZXNzIGFkZHJlc3M7CisgICAgcHJpdmF0ZSBMaXN0PFBob25lTnVtYmVyPiBwaG9uZU51bWJlcnM7CisKKyAgICBwdWJsaWMgQ3VzdG9tZXIoKSB7CisgICAgICAgIHBob25lTnVtYmVycyA9IG5ldyBBcnJheUxpc3Q8UGhvbmVOdW1iZXI+KCk7CisgICAgfQorCisgICAgQFhtbFBhdGgoInBlcnNvbmFsLWluZm8vbmFtZS90ZXh0KCkiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKworICAgIEBYbWxQYXRoKCJjb250YWN0LWluZm8vYWRkcmVzcyIpCisgICAgcHVibGljIEFkZHJlc3MgZ2V0QWRkcmVzcygpIHsKKyAgICAgICAgcmV0dXJuIGFkZHJlc3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QWRkcmVzcyhBZGRyZXNzIGFkZHJlc3MpIHsKKyAgICAgICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzczsKKyAgICB9CisKKyAgICBAWG1sUGF0aCgiY29udGFjdC1pbmZvL3Bob25lLW51bWJlciIpCisgICAgcHVibGljIExpc3Q8UGhvbmVOdW1iZXI+IGdldFBob25lTnVtYmVycygpIHsKKyAgICAgICAgcmV0dXJuIHBob25lTnVtYmVyczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQaG9uZU51bWJlcnMoTGlzdDxQaG9uZU51bWJlcj4gcGhvbmVOdW1iZXJzKSB7CisgICAgICAgIHRoaXMucGhvbmVOdW1iZXJzID0gcGhvbmVOdW1iZXJzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgQ3VzdG9tZXIgb3RoZXIgPSAoQ3VzdG9tZXIpIG9iajsKKyAgICAgICAgaWYgKCh0aGlzLm5hbWUgPT0gbnVsbCkgPyAob3RoZXIubmFtZSAhPSBudWxsKSA6ICF0aGlzLm5hbWUuZXF1YWxzKG90aGVyLm5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMuYWRkcmVzcyAhPSBvdGhlci5hZGRyZXNzICYmICh0aGlzLmFkZHJlc3MgPT0gbnVsbCB8fCAhdGhpcy5hZGRyZXNzLmVxdWFscyhvdGhlci5hZGRyZXNzKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5waG9uZU51bWJlcnMgIT0gb3RoZXIucGhvbmVOdW1iZXJzICYmICh0aGlzLnBob25lTnVtYmVycyA9PSBudWxsIHx8ICF0aGlzLnBob25lTnVtYmVycworICAgICAgICAgICAgICAgIC5lcXVhbHMob3RoZXIucGhvbmVOdW1iZXJzKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IDc7CisgICAgICAgIGhhc2ggPSA5NyAqIGhhc2ggKyAodGhpcy5uYW1lICE9IG51bGwgPyB0aGlzLm5hbWUuaGFzaENvZGUoKSA6IDApOworICAgICAgICBoYXNoID0gOTcgKiBoYXNoICsgKHRoaXMuYWRkcmVzcyAhPSBudWxsID8gdGhpcy5hZGRyZXNzLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgaGFzaCA9IDk3ICogaGFzaCArICh0aGlzLnBob25lTnVtYmVycyAhPSBudWxsID8gdGhpcy5waG9uZU51bWJlcnMuaGFzaENvZGUoKSA6IDApOworICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leGFtcGxlcy94bWwtbW94eS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3htbG1veHkvYmVhbnMvUGhvbmVOdW1iZXIuamF2YSBiL2V4YW1wbGVzL3htbC1tb3h5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMveG1sbW94eS9iZWFucy9QaG9uZU51bWJlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZjhiMGUKLS0tIC9kZXYvbnVsbAorKysgYi9leGFtcGxlcy94bWwtbW94eS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4YW1wbGVzL3htbG1veHkvYmVhbnMvUGhvbmVOdW1iZXIuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBEaXN0cmlidXRpb24gTGljZW5zZSB2LiAxLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9vcmcvZG9jdW1lbnRzL2VkbC12MTAucGhwLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBCU0QtMy1DbGF1c2UKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzLnhtbG1veHkuYmVhbnM7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFZhbHVlOworCisvKioKKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgUGhvbmVOdW1iZXIgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgdHlwZTsKKyAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworICAgIHB1YmxpYyBQaG9uZU51bWJlcigpIHt9CisKKyAgICBwdWJsaWMgUGhvbmVOdW1iZXIoU3RyaW5nIHR5cGUsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgfQorCisgICAgQFhtbEF0dHJpYnV0ZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgeworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgIH0KKworICAgIEBYbWxWYWx1ZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgUGhvbmVOdW1iZXIgb3RoZXIgPSAoUGhvbmVOdW1iZXIpIG9iajsKKyAgICAgICAgaWYgKCh0aGlzLnR5cGUgPT0gbnVsbCkgPyAob3RoZXIudHlwZSAhPSBudWxsKSA6ICF0aGlzLnR5cGUuZXF1YWxzKG90aGVyLnR5cGUpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh0aGlzLnZhbHVlID09IG51bGwpID8gKG90aGVyLnZhbHVlICE9IG51bGwpIDogIXRoaXMudmFsdWUuZXF1YWxzKG90aGVyLnZhbHVlKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCBoYXNoID0gNzsKKyAgICAgICAgaGFzaCA9IDU5ICogaGFzaCArICh0aGlzLnR5cGUgIT0gbnVsbCA/IHRoaXMudHlwZS5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIGhhc2ggPSA1OSAqIGhhc2ggKyAodGhpcy52YWx1ZSAhPSBudWxsID8gdGhpcy52YWx1ZS5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIHJldHVybiBoYXNoOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4YW1wbGVzL3htbC1tb3h5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMveG1sbW94eS9Nb3h5QXBwVGVzdC5qYXZhIGIvZXhhbXBsZXMveG1sLW1veHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leGFtcGxlcy94bWxtb3h5L01veHlBcHBUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQyMDdhMAotLS0gL2Rldi9udWxsCisrKyBiL2V4YW1wbGVzL3htbC1tb3h5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXhhbXBsZXMveG1sbW94eS9Nb3h5QXBwVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIERpc3RyaWJ1dGlvbiBMaWNlbnNlIHYuIDEuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHAuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0zLUNsYXVzZQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMueG1sbW94eTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcy54bWxtb3h5LmJlYW5zLkN1c3RvbWVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1veHkueG1sLk1veHlYbWxGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgTW94eUFwcFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5EVU1QX0VOVElUWSk7CisKKyAgICAgICAgcmV0dXJuIEFwcC5jcmVhdGVBcHAoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcucmVnaXN0ZXIobmV3IE1veHlYbWxGZWF0dXJlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCB0aGUgZXhwZWN0ZWQgcmVzcG9uc2UgaXMgc2VudCBiYWNrLgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLkV4Y2VwdGlvbgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbWVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB3ZWJUYXJnZXQgPSB0YXJnZXQoKS5wYXRoKCJjdXN0b21lciIpOworCisgICAgICAgIEN1c3RvbWVyIGN1c3RvbWVyID0gd2ViVGFyZ2V0LnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTCkuZ2V0KEN1c3RvbWVyLmNsYXNzKTsKKyAgICAgICAgY3VzdG9tZXIuc2V0TmFtZSgiVG9tIERvb2xleSIpOworICAgICAgICB3ZWJUYXJnZXQucmVxdWVzdChNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MKS5wdXQoRW50aXR5LmVudGl0eShjdXN0b21lciwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTCkpOworCisgICAgICAgIEN1c3RvbWVyIHVwZGF0ZWRDdXN0b21lciA9IHdlYlRhcmdldC5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUwpLmdldChDdXN0b21lci5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhjdXN0b21lciwgdXBkYXRlZEN1c3RvbWVyKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvYmVhbi12YWxpZGF0aW9uL3BvbS54bWwgYi9leHQvYmVhbi12YWxpZGF0aW9uL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWExYjFmNgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9iZWFuLXZhbGlkYXRpb24vcG9tLnhtbApAQCAtMCwwICsxLDExMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LWJlYW4tdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4KKyAgICA8bmFtZT5qZXJzZXktZXh0LWJlYW4tdmFsaWRhdGlvbjwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgSmVyc2V5IGV4dGVuc2lvbiBtb2R1bGUgcHJvdmlkaW5nIHN1cHBvcnQgZm9yIEJlYW4gVmFsaWRhdGlvbiAoSlNSLTM0OSkgQVBJLgorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLmlzdGFjazwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1pc3RhY2stY29tbW9ucy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YnVpbGQtaGVscGVyLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmZlbGl4PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWJ1bmRsZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+CisgICAgICAgICAgICAgICAgPGV4dGVuc2lvbnM+dHJ1ZTwvZXh0ZW5zaW9ucz4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGluc3RydWN0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTm90ZTogV2hlbiB5b3UncmUgY2hhbmdpbmcgdGhlc2UgcHJvcGVydGllcyBjaGFuZ2UgdGhlbSBhbHNvIGluIGJ1bmRsZXMvamF4LXJzLXJpL2J1bmRsZS9wb20ueG1sLiAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFeHBvcnQtUGFja2FnZT5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIudmFsaWRhdGlvbi4qO3ZlcnNpb249JHtwcm9qZWN0LnZlcnNpb259PC9FeHBvcnQtUGFja2FnZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxJbXBvcnQtUGFja2FnZT5qYXZheC52YWxpZGF0aW9uLio7cmVzb2x1dGlvbjo9b3B0aW9uYWw7dmVyc2lvbj0iJHtyYW5nZTtbPT0sMyk7JHtqYXZheC52YWxpZGF0aW9uLmFwaS52ZXJzaW9ufX0iLCAqPC9JbXBvcnQtUGFja2FnZT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbnN0cnVjdGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDx1bnBhY2tCdW5kbGU+dHJ1ZTwvdW5wYWNrQnVuZGxlPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5oazIuZXh0ZXJuYWw8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5pbmplY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbW1vbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktc2VydmVyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC52YWxpZGF0aW9uPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+dmFsaWRhdGlvbi1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuaGliZXJuYXRlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGliZXJuYXRlLXZhbGlkYXRvcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDwhLS0gamF2YS1lbCByZWxhdGVkIGRlcGVuZGVuY2llcyBhcmUgaW4gc2NvcGUgInByb3ZpZGVkIiBpbiBoaWJlcm5hdGUtdmFsaWRhdG9yIC0tPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVsPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguZWwtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLndlYjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LmVsPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItYnVuZGxlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHR5cGU+cG9tPC90eXBlPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4dC9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvdmFsaWRhdGlvbi9WYWxpZGF0aW9uQ29uZmlnLmphdmEgYi9leHQvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3ZhbGlkYXRpb24vVmFsaWRhdGlvbkNvbmZpZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZjg4ODUKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3ZhbGlkYXRpb24vVmFsaWRhdGlvbkNvbmZpZy5qYXZhCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci52YWxpZGF0aW9uOworCitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeTsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLk1lc3NhZ2VJbnRlcnBvbGF0b3I7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXJhbWV0ZXJOYW1lUHJvdmlkZXI7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5UcmF2ZXJzYWJsZVJlc29sdmVyOworCisvKioKKyAqIENvbmZpZ3VyYXRpb24gY2xhc3MgZm9yIEJlYW4gVmFsaWRhdGlvbiBwcm92aWRlci4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFZhbGlkYXRpb25Db25maWcgeworCisgICAgcHJpdmF0ZSBNZXNzYWdlSW50ZXJwb2xhdG9yIG1lc3NhZ2VJbnRlcnBvbGF0b3I7CisgICAgcHJpdmF0ZSBUcmF2ZXJzYWJsZVJlc29sdmVyIHRyYXZlcnNhYmxlUmVzb2x2ZXI7CisgICAgcHJpdmF0ZSBDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSBjb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeTsKKyAgICBwcml2YXRlIFBhcmFtZXRlck5hbWVQcm92aWRlciBwYXJhbWV0ZXJOYW1lUHJvdmlkZXI7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4ge0Bjb2RlIE1lc3NhZ2VJbnRlcnBvbGF0b3J9IGltcGxlbWVudGF0aW9uIHVzZWQgZm9yIGNvbmZpZ3VyYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGluc3RhbmNlIG9mIHtAY29kZSBNZXNzYWdlSW50ZXJwb2xhdG9yfSBvciB7QGNvZGUgbnVsbH0gaWYgbm90IGRlZmluZWQuCisgICAgICovCisgICAgcHVibGljIE1lc3NhZ2VJbnRlcnBvbGF0b3IgZ2V0TWVzc2FnZUludGVycG9sYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2VJbnRlcnBvbGF0b3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHtAY29kZSBUcmF2ZXJzYWJsZVJlc29sdmVyfSBpbXBsZW1lbnRhdGlvbiB1c2VkIGZvciBjb25maWd1cmF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBpbnN0YW5jZSBvZiB7QGNvZGUgVHJhdmVyc2FibGVSZXNvbHZlcn0gb3Ige0Bjb2RlIG51bGx9IGlmIG5vdCBkZWZpbmVkLgorICAgICAqLworICAgIHB1YmxpYyBUcmF2ZXJzYWJsZVJlc29sdmVyIGdldFRyYXZlcnNhYmxlUmVzb2x2ZXIoKSB7CisgICAgICAgIHJldHVybiB0cmF2ZXJzYWJsZVJlc29sdmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB7QGNvZGUgQ29uc3RyYWludFZhbGlkYXRvckZhY3Rvcnl9IGltcGxlbWVudGF0aW9uIHVzZWQgZm9yIGNvbmZpZ3VyYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGluc3RhbmNlIG9mIHtAY29kZSBDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeX0gb3Ige0Bjb2RlIG51bGx9IGlmIG5vdCBkZWZpbmVkLgorICAgICAqLworICAgIHB1YmxpYyBDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSBnZXRDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSgpIHsKKyAgICAgICAgcmV0dXJuIGNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB7QGNvZGUgUGFyYW1ldGVyTmFtZVByb3ZpZGVyfSBpbXBsZW1lbnRhdGlvbiB1c2VkIGZvciBjb25maWd1cmF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBpbnN0YW5jZSBvZiB7QGNvZGUgUGFyYW1ldGVyTmFtZVByb3ZpZGVyfSBvciB7QGNvZGUgbnVsbH0gaWYgbm90IGRlZmluZWQuCisgICAgICovCisgICAgcHVibGljIFBhcmFtZXRlck5hbWVQcm92aWRlciBnZXRQYXJhbWV0ZXJOYW1lUHJvdmlkZXIoKSB7CisgICAgICAgIHJldHVybiBwYXJhbWV0ZXJOYW1lUHJvdmlkZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVmaW5lcyB0aGUgbWVzc2FnZSBpbnRlcnBvbGF0b3IuCisgICAgICogSWYge0Bjb2RlIG51bGx9IGlzIHBhc3NlZCwgdGhlIGRlZmF1bHQgbWVzc2FnZSBpbnRlcnBvbGF0b3IgaXMgdXNlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlSW50ZXJwb2xhdG9yIG1lc3NhZ2UgaW50ZXJwb2xhdG9yIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBWYWxpZGF0aW9uQ29uZmlnIG1lc3NhZ2VJbnRlcnBvbGF0b3IoZmluYWwgTWVzc2FnZUludGVycG9sYXRvciBtZXNzYWdlSW50ZXJwb2xhdG9yKSB7CisgICAgICAgIHRoaXMubWVzc2FnZUludGVycG9sYXRvciA9IG1lc3NhZ2VJbnRlcnBvbGF0b3I7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmluZXMgdGhlIHRyYXZlcnNhYmxlIHJlc29sdmVyLgorICAgICAqIElmIHtAY29kZSBudWxsfSBpcyBwYXNzZWQsIHRoZSBkZWZhdWx0IHRyYXZlcnNhYmxlIHJlc29sdmVyIGlzIHVzZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJhdmVyc2FibGVSZXNvbHZlciB0cmF2ZXJzYWJsZSByZXNvbHZlciBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgVmFsaWRhdGlvbkNvbmZpZyB0cmF2ZXJzYWJsZVJlc29sdmVyKGZpbmFsIFRyYXZlcnNhYmxlUmVzb2x2ZXIgdHJhdmVyc2FibGVSZXNvbHZlcikgeworICAgICAgICB0aGlzLnRyYXZlcnNhYmxlUmVzb2x2ZXIgPSB0cmF2ZXJzYWJsZVJlc29sdmVyOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZpbmVzIHRoZSBjb25zdHJhaW50IHZhbGlkYXRvciBmYWN0b3J5LgorICAgICAqIElmIHtAY29kZSBudWxsfSBpcyBwYXNzZWQsIHRoZSBkZWZhdWx0IGNvbnN0cmFpbnQgdmFsaWRhdG9yIGZhY3RvcnkgaXMgdXNlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSBjb25zdHJhaW50IGZhY3RvcnkgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIFZhbGlkYXRpb25Db25maWcgY29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkoZmluYWwgQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkgY29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkpIHsKKyAgICAgICAgdGhpcy5jb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSA9IGNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5OworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEZWZpbmVzIHRoZSBwYXJhbWV0ZXIgbmFtZSBwcm92aWRlci4KKyAgICAgKiBJZiB7QGNvZGUgbnVsbH0gaXMgcGFzc2VkLCB0aGUgZGVmYXVsdCBwYXJhbWV0ZXIgbmFtZSBwcm92aWRlciBpcyB1c2VkLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmFtZXRlck5hbWVQcm92aWRlciBwYXJhbWV0ZXIgbmFtZSBwcm92aWRlciBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgVmFsaWRhdGlvbkNvbmZpZyBwYXJhbWV0ZXJOYW1lUHJvdmlkZXIoZmluYWwgUGFyYW1ldGVyTmFtZVByb3ZpZGVyIHBhcmFtZXRlck5hbWVQcm92aWRlcikgeworICAgICAgICB0aGlzLnBhcmFtZXRlck5hbWVQcm92aWRlciA9IHBhcmFtZXRlck5hbWVQcm92aWRlcjsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci92YWxpZGF0aW9uL1ZhbGlkYXRpb25FcnJvci5qYXZhIGIvZXh0L2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci92YWxpZGF0aW9uL1ZhbGlkYXRpb25FcnJvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMmYxYzQKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3ZhbGlkYXRpb24vVmFsaWRhdGlvbkVycm9yLmphdmEKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnZhbGlkYXRpb247CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCisvKioKKyAqIERlZmF1bHQgdmFsaWRhdGlvbiBlcnJvciBlbnRpdHkgdG8gYmUgaW5jbHVkZWQgaW4ge0Bjb2RlIFJlc3BvbnNlfS4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFhtbFJvb3RFbGVtZW50CitAU3VwcHJlc3NXYXJuaW5ncygiVW51c2VkRGVjbGFyYXRpb24iKQorcHVibGljIGZpbmFsIGNsYXNzIFZhbGlkYXRpb25FcnJvciB7CisKKyAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZVRlbXBsYXRlOworCisgICAgcHJpdmF0ZSBTdHJpbmcgcGF0aDsKKworICAgIHByaXZhdGUgU3RyaW5nIGludmFsaWRWYWx1ZTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHtAY29kZSBWYWxpZGF0aW9uRXJyb3J9IGluc3RhbmNlLiBDb25zdHJ1Y3RvciBmb3IgSkFYQiBwcm92aWRlcnMuCisgICAgICovCisgICAgcHVibGljIFZhbGlkYXRpb25FcnJvcigpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSB7QGNvZGUgVmFsaWRhdGlvbkVycm9yfSBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIGludGVycG9sYXRlZCBlcnJvciBtZXNzYWdlLgorICAgICAqIEBwYXJhbSBtZXNzYWdlVGVtcGxhdGUgbm9uLWludGVycG9sYXRlZCBlcnJvciBtZXNzYWdlLgorICAgICAqIEBwYXJhbSBwYXRoIHByb3BlcnR5IHBhdGguCisgICAgICogQHBhcmFtIGludmFsaWRWYWx1ZSB2YWx1ZSB0aGF0IGZhaWxlZCB0byBwYXNzIGNvbnN0cmFpbnRzLgorICAgICAqLworICAgIHB1YmxpYyBWYWxpZGF0aW9uRXJyb3IoZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIFN0cmluZyBtZXNzYWdlVGVtcGxhdGUsIGZpbmFsIFN0cmluZyBwYXRoLCBmaW5hbCBTdHJpbmcgaW52YWxpZFZhbHVlKSB7CisgICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgICAgIHRoaXMubWVzc2FnZVRlbXBsYXRlID0gbWVzc2FnZVRlbXBsYXRlOworICAgICAgICB0aGlzLnBhdGggPSBwYXRoOworICAgICAgICB0aGlzLmludmFsaWRWYWx1ZSA9IGludmFsaWRWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGludGVycG9sYXRlZCBlcnJvciBtZXNzYWdlIGZvciB0aGlzIHZhbGlkYXRpb24gZXJyb3IuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBpbnRlcnBvbGF0ZWQgZXJyb3IgbWVzc2FnZSBmb3IgdGhpcyB2YWxpZGF0aW9uIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBpbnRlcnBvbGF0ZWQgZXJyb3IgbWVzc2FnZSBmb3IgdGhpcyB2YWxpZGF0aW9uIGVycm9yLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIGludGVycG9sYXRlZCBlcnJvciBtZXNzYWdlIGZvciB0aGlzIHZhbGlkYXRpb24gZXJyb3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShmaW5hbCBTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwcm9wZXJ0eSBwYXRoIHRvIHRoZSB2YWx1ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHJvcGVydHkgcGF0aCB0byB0aGUgdmFsdWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgeworICAgICAgICByZXR1cm4gcGF0aDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgcHJvcGVydHkgcGF0aCB0byB0aGUgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwcm9wZXJ0eSBwYXRoIHRvIHRoZSB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXRoKGZpbmFsIFN0cmluZyBwYXRoKSB7CisgICAgICAgIHRoaXMucGF0aCA9IHBhdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2YWx1ZSBmYWlsaW5nIHRvIHBhc3MgdGhlIGNvbnN0cmFpbnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSBmYWlsaW5nIHRvIHBhc3MgdGhlIGNvbnN0cmFpbnQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRJbnZhbGlkVmFsdWUoKSB7CisgICAgICAgIHJldHVybiBpbnZhbGlkVmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2YWx1ZSBmYWlsaW5nIHRvIHBhc3MgdGhlIGNvbnN0cmFpbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW52YWxpZFZhbHVlIHRoZSB2YWx1ZSBmYWlsaW5nIHRvIHBhc3MgdGhlIGNvbnN0cmFpbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SW52YWxpZFZhbHVlKGZpbmFsIFN0cmluZyBpbnZhbGlkVmFsdWUpIHsKKyAgICAgICAgdGhpcy5pbnZhbGlkVmFsdWUgPSBpbnZhbGlkVmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBub24taW50ZXJwb2xhdGVkIGVycm9yIG1lc3NhZ2UgZm9yIHRoaXMgdmFsaWRhdGlvbiBlcnJvci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG5vbi1pbnRlcnBvbGF0ZWQgZXJyb3IgbWVzc2FnZSBmb3IgdGhpcyB2YWxpZGF0aW9uIGVycm9yLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZVRlbXBsYXRlKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZVRlbXBsYXRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgbm9uLWludGVycG9sYXRlZCBlcnJvciBtZXNzYWdlIGZvciB0aGlzIHZhbGlkYXRpb24gZXJyb3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZVRlbXBsYXRlIHRoZSBub24taW50ZXJwb2xhdGVkIGVycm9yIG1lc3NhZ2UgZm9yIHRoaXMgdmFsaWRhdGlvbiBlcnJvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlVGVtcGxhdGUoZmluYWwgU3RyaW5nIG1lc3NhZ2VUZW1wbGF0ZSkgeworICAgICAgICB0aGlzLm1lc3NhZ2VUZW1wbGF0ZSA9IG1lc3NhZ2VUZW1wbGF0ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZlYXR1cmUuamF2YSBiL2V4dC9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvdmFsaWRhdGlvbi9WYWxpZGF0aW9uRmVhdHVyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMTI3NTYKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3ZhbGlkYXRpb24vVmFsaWRhdGlvbkZlYXR1cmUuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci52YWxpZGF0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3RyYWluZWRUbzsKK2ltcG9ydCBqYXZheC53cy5ycy5SdW50aW1lVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlByb3BlcnRpZXNIZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdGlvbkJpbmRlcjsKKworLyoqCisgKiB7QGNvZGUgVmFsaWRhdGlvbkZlYXR1cmV9IHVzZWQgdG8gYWRkIEJlYW4gVmFsaWRhdGlvbiAoSlNSLTM0OSkgc3VwcG9ydCB0byB0aGUgc2VydmVyLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAQ29uc3RyYWluZWRUbyhSdW50aW1lVHlwZS5TRVJWRVIpCitwdWJsaWMgZmluYWwgY2xhc3MgVmFsaWRhdGlvbkZlYXR1cmUgaW1wbGVtZW50cyBGZWF0dXJlIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZShmaW5hbCBGZWF0dXJlQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlnID0gY29udGV4dC5nZXRDb25maWd1cmF0aW9uKCk7CisKKyAgICAgICAgLy8gVmFsaWRhdGlvbiBkaXNhYmxlZD8KKyAgICAgICAgaWYgKFByb3BlcnRpZXNIZWxwZXIuaXNQcm9wZXJ0eShjb25maWcuZ2V0UHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5CVl9GRUFUVVJFX0RJU0FCTEUpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgY29udGV4dC5yZWdpc3RlcihuZXcgVmFsaWRhdGlvbkJpbmRlcigpKTsKKworICAgICAgICAvLyBTZXQgU2VydmVyUHJvcGVydGllcy5SRVNQT05TRV9TRVRfU1RBVFVTX09WRVJfU0VORF9FUlJPUiB0byBtYWtlIHN1cmUgbm8gc2VuZEVycm9yIGlzIGNhbGxlZCBvbiBzZXJ2bGV0IGNvbnRhaW5lcgorICAgICAgICAvLyB3aGVuIFNlcnZlclByb3BlcnRpZXMuQlZfU0VORF9FUlJPUl9JTl9SRVNQT05TRSBpcyBlbmFibGVkLgorICAgICAgICBpZiAoUHJvcGVydGllc0hlbHBlci5pc1Byb3BlcnR5KGNvbmZpZy5nZXRQcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLkJWX1NFTkRfRVJST1JfSU5fUkVTUE9OU0UpKQorICAgICAgICAgICAgICAgICYmIGNvbmZpZy5nZXRQcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLlJFU1BPTlNFX1NFVF9TVEFUVVNfT1ZFUl9TRU5EX0VSUk9SKSA9PSBudWxsKSB7CisgICAgICAgICAgICBjb250ZXh0LnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuUkVTUE9OU0VfU0VUX1NUQVRVU19PVkVSX1NFTkRfRVJST1IsIHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci92YWxpZGF0aW9uL2ludGVybmFsL0RlZmF1bHRDb25maWd1cmVkVmFsaWRhdG9yLmphdmEgYi9leHQvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3ZhbGlkYXRpb24vaW50ZXJuYWwvRGVmYXVsdENvbmZpZ3VyZWRWYWxpZGF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGUxODQ1Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci92YWxpZGF0aW9uL2ludGVybmFsL0RlZmF1bHRDb25maWd1cmVkVmFsaWRhdG9yLmphdmEKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnZhbGlkYXRpb24uaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmlvbGF0aW9uOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRvcjsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLmV4ZWN1dGFibGUuRXhlY3V0YWJsZVR5cGU7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5leGVjdXRhYmxlLkV4ZWN1dGFibGVWYWxpZGF0b3I7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5tZXRhZGF0YS5CZWFuRGVzY3JpcHRvcjsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLm1ldGFkYXRhLk1ldGhvZERlc2NyaXB0b3I7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuaW5qZWN0LkNvbmZpZ3VyZWRWYWxpZGF0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLkludm9jYWJsZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLlZhbGlkYXRpb25JbnRlcmNlcHRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLlZhbGlkYXRpb25JbnRlcmNlcHRvckNvbnRleHQ7CisKKy8qKgorICogRGVmYXVsdCB7QGxpbmsgQ29uZmlndXJlZFZhbGlkYXRvcn0gaW1wbGVtZW50YXRpb24gLSBkZWxlZ2F0ZXMgY2FsbHMgdG8gdGhlIHVuZGVybHlpbmcge0BsaW5rIFZhbGlkYXRvcn0uCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitjbGFzcyBEZWZhdWx0Q29uZmlndXJlZFZhbGlkYXRvciBpbXBsZW1lbnRzIENvbmZpZ3VyZWRWYWxpZGF0b3IsIFZhbGlkYXRpb25JbnRlcmNlcHRvciB7CisKKyAgICBwcml2YXRlIGZpbmFsIFZhbGlkYXRvciBkZWxlZ2F0ZTsKKyAgICBwcml2YXRlIGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbjsKKyAgICBwcml2YXRlIGZpbmFsIFZhbGlkYXRlT25FeGVjdXRpb25IYW5kbGVyIHZhbGlkYXRlT25FeGVjdXRpb25IYW5kbGVyOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IGludGVyY2VwdG9yczsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGNvbmZpZ3VyZWQgdmFsaWRhdG9yIGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIGRlbGVnYXRlICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvciB0byBkZWxlZ2F0ZSBjYWxscyB0by4KKyAgICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbiAgICAgICAgICAgICAgY29uZmlndXJhdGlvbiB0byBvYnRhaW4ge0BsaW5rIEV4ZWN1dGFibGVUeXBlIGV4ZWN1dGFibGUgdHlwZXN9IGNvbmZpZ3VyZWQgaW4gZGVzY3JpcHRvcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tLgorICAgICAqIEBwYXJhbSB2YWxpZGF0ZU9uRXhlY3V0aW9uSGFuZGxlciBoYW5kbGVyIGZvciBwcm9jZXNzaW5nIHtAbGluayBqYXZheC52YWxpZGF0aW9uLmV4ZWN1dGFibGUuVmFsaWRhdGVPbkV4ZWN1dGlvbn0KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMuCisgICAgICogQHBhcmFtIGludGVyY2VwdG9ycyAgICAgICAgICAgICAgIGN1c3RvbSB2YWxpZGF0aW9uIGludGVyY2VwdG9ycy4KKyAgICAgKi8KKyAgICBEZWZhdWx0Q29uZmlndXJlZFZhbGlkYXRvcihmaW5hbCBWYWxpZGF0b3IgZGVsZWdhdGUsIGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBWYWxpZGF0ZU9uRXhlY3V0aW9uSGFuZGxlciB2YWxpZGF0ZU9uRXhlY3V0aW9uSGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJdGVyYWJsZTxWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IGludGVyY2VwdG9ycykgeworICAgICAgICB0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7CisgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IGNvbmZpZ3VyYXRpb247CisgICAgICAgIHRoaXMudmFsaWRhdGVPbkV4ZWN1dGlvbkhhbmRsZXIgPSB2YWxpZGF0ZU9uRXhlY3V0aW9uSGFuZGxlcjsKKyAgICAgICAgdGhpcy5pbnRlcmNlcHRvcnMgPSBjcmVhdGVJbnRlcmNlcHRvckxpc3QoaW50ZXJjZXB0b3JzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8VmFsaWRhdGlvbkludGVyY2VwdG9yPiBjcmVhdGVJbnRlcmNlcHRvckxpc3QoSXRlcmFibGU8VmFsaWRhdGlvbkludGVyY2VwdG9yPiBpbnRlcmNlcHRvcnMpIHsKKyAgICAgICAgTGlzdDxWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IHJlc3VsdCA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICAgICAgZm9yIChWYWxpZGF0aW9uSW50ZXJjZXB0b3IgaSA6IGludGVyY2VwdG9ycykgeworICAgICAgICAgICAgcmVzdWx0LmFkZChpKTsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQuYWRkKHRoaXMpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gU2V0PENvbnN0cmFpbnRWaW9sYXRpb248VD4+IHZhbGlkYXRlKGZpbmFsIFQgb2JqZWN0LCBmaW5hbCBDbGFzczw/Pi4uLiBncm91cHMpIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlLnZhbGlkYXRlKG9iamVjdCwgZ3JvdXBzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFQ+IFNldDxDb25zdHJhaW50VmlvbGF0aW9uPFQ+PiB2YWxpZGF0ZVByb3BlcnR5KGZpbmFsIFQgb2JqZWN0LCBmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLCBmaW5hbCBDbGFzczw/Pi4uLiBncm91cHMpIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlLnZhbGlkYXRlUHJvcGVydHkob2JqZWN0LCBwcm9wZXJ0eU5hbWUsIGdyb3Vwcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxUPiBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjxUPj4gdmFsaWRhdGVWYWx1ZShmaW5hbCBDbGFzczxUPiBiZWFuVHlwZSwgZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSwgZmluYWwgQ2xhc3M8Pz4uLi4gZ3JvdXBzKSB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZS52YWxpZGF0ZVZhbHVlKGJlYW5UeXBlLCBwcm9wZXJ0eU5hbWUsIHZhbHVlLCBncm91cHMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCZWFuRGVzY3JpcHRvciBnZXRDb25zdHJhaW50c0ZvckNsYXNzKGZpbmFsIENsYXNzPD8+IGNsYXp6KSB7CisgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5nZXRDb25zdHJhaW50c0ZvckNsYXNzKGNsYXp6KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFQ+IFQgdW53cmFwKGZpbmFsIENsYXNzPFQ+IHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlLnVud3JhcCh0eXBlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRXhlY3V0YWJsZVZhbGlkYXRvciBmb3JFeGVjdXRhYmxlcygpIHsKKyAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmZvckV4ZWN1dGFibGVzKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdmFsaWRhdGVSZXNvdXJjZUFuZElucHV0UGFyYW1zKGZpbmFsIE9iamVjdCByZXNvdXJjZSwgZmluYWwgSW52b2NhYmxlIHJlc291cmNlTWV0aG9kLCBmaW5hbCBPYmplY3RbXSBhcmdzKSB7CisKKyAgICAgICAgVmFsaWRhdGlvbkludGVyY2VwdG9yRXhlY3V0b3IgdmFsaWRhdGlvbkV4ZWN1dG9yID0gbmV3IFZhbGlkYXRpb25JbnRlcmNlcHRvckV4ZWN1dG9yKAorICAgICAgICAgICAgICAgIHJlc291cmNlLAorICAgICAgICAgICAgICAgIHJlc291cmNlTWV0aG9kLAorICAgICAgICAgICAgICAgIGFyZ3MsCisgICAgICAgICAgICAgICAgaW50ZXJjZXB0b3JzLml0ZXJhdG9yKCkpOworCisgICAgICAgIHZhbGlkYXRpb25FeGVjdXRvci5wcm9jZWVkKCk7CisgICAgfQorCisgICAgLy8gSW52b2tlZCBhcyB0aGUgbGFzdCB2YWxpZGF0aW9uIGludGVyY2VwdG9yIG1ldGhvZCBpbiB0aGUgY2hhaW4uCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25WYWxpZGF0ZShmaW5hbCBWYWxpZGF0aW9uSW50ZXJjZXB0b3JDb250ZXh0IGN0eCkgeworCisgICAgICAgIGZpbmFsIE9iamVjdCByZXNvdXJjZSA9IGN0eC5nZXRSZXNvdXJjZSgpOworICAgICAgICBmaW5hbCBJbnZvY2FibGUgcmVzb3VyY2VNZXRob2QgPSBjdHguZ2V0SW52b2NhYmxlKCk7CisgICAgICAgIGZpbmFsIE9iamVjdFtdIGFyZ3MgPSBjdHguZ2V0QXJncygpOworCisgICAgICAgIGZpbmFsIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPE9iamVjdD4+IGNvbnN0cmFpbnRWaW9sYXRpb25zID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICBmaW5hbCBCZWFuRGVzY3JpcHRvciBiZWFuRGVzY3JpcHRvciA9IGdldENvbnN0cmFpbnRzRm9yQ2xhc3MocmVzb3VyY2UuZ2V0Q2xhc3MoKSk7CisKKyAgICAgICAgLy8gUmVzb3VyY2UgdmFsaWRhdGlvbi4KKyAgICAgICAgaWYgKGJlYW5EZXNjcmlwdG9yLmlzQmVhbkNvbnN0cmFpbmVkKCkpIHsKKyAgICAgICAgICAgIGNvbnN0cmFpbnRWaW9sYXRpb25zLmFkZEFsbCh2YWxpZGF0ZShyZXNvdXJjZSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlc291cmNlTWV0aG9kICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBjb25maWd1cmF0aW9uLmdldEJvb3RzdHJhcENvbmZpZ3VyYXRpb24oKS5pc0V4ZWN1dGFibGVWYWxpZGF0aW9uRW5hYmxlZCgpKSB7CisgICAgICAgICAgICBmaW5hbCBNZXRob2QgaGFuZGxpbmdNZXRob2QgPSByZXNvdXJjZU1ldGhvZC5nZXRIYW5kbGluZ01ldGhvZCgpOworCisgICAgICAgICAgICAvLyBSZXNvdXJjZSBtZXRob2QgdmFsaWRhdGlvbiAtIGlucHV0IHBhcmFtZXRlcnMuCisgICAgICAgICAgICBmaW5hbCBNZXRob2REZXNjcmlwdG9yIG1ldGhvZERlc2NyaXB0b3IgPSBiZWFuRGVzY3JpcHRvci5nZXRDb25zdHJhaW50c0Zvck1ldGhvZChoYW5kbGluZ01ldGhvZC5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgIGhhbmRsaW5nTWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkpOworCisgICAgICAgICAgICBpZiAobWV0aG9kRGVzY3JpcHRvciAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgICYmIG1ldGhvZERlc2NyaXB0b3IuaGFzQ29uc3RyYWluZWRQYXJhbWV0ZXJzKCkKKyAgICAgICAgICAgICAgICAgICAgJiYgdmFsaWRhdGVPbkV4ZWN1dGlvbkhhbmRsZXIudmFsaWRhdGVNZXRob2QocmVzb3VyY2UuZ2V0Q2xhc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VNZXRob2QuZ2V0RGVmaW5pdGlvbk1ldGhvZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZU1ldGhvZC5nZXRIYW5kbGluZ01ldGhvZCgpKSkgeworICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRWaW9sYXRpb25zLmFkZEFsbChmb3JFeGVjdXRhYmxlcygpLnZhbGlkYXRlUGFyYW1ldGVycyhyZXNvdXJjZSwgaGFuZGxpbmdNZXRob2QsIGFyZ3MpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghY29uc3RyYWludFZpb2xhdGlvbnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbihjb25zdHJhaW50VmlvbGF0aW9ucyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB2YWxpZGF0ZVJlc3VsdChmaW5hbCBPYmplY3QgcmVzb3VyY2UsIGZpbmFsIEludm9jYWJsZSByZXNvdXJjZU1ldGhvZCwgZmluYWwgT2JqZWN0IHJlc3VsdCkgeworICAgICAgICBpZiAoY29uZmlndXJhdGlvbi5nZXRCb290c3RyYXBDb25maWd1cmF0aW9uKCkuaXNFeGVjdXRhYmxlVmFsaWRhdGlvbkVuYWJsZWQoKSkgeworICAgICAgICAgICAgZmluYWwgU2V0PENvbnN0cmFpbnRWaW9sYXRpb248T2JqZWN0Pj4gY29uc3RyYWludFZpb2xhdGlvbnMgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgICAgICBmaW5hbCBNZXRob2QgaGFuZGxpbmdNZXRob2QgPSByZXNvdXJjZU1ldGhvZC5nZXRIYW5kbGluZ01ldGhvZCgpOworCisgICAgICAgICAgICBmaW5hbCBCZWFuRGVzY3JpcHRvciBiZWFuRGVzY3JpcHRvciA9IGdldENvbnN0cmFpbnRzRm9yQ2xhc3MocmVzb3VyY2UuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICBmaW5hbCBNZXRob2REZXNjcmlwdG9yIG1ldGhvZERlc2NyaXB0b3IgPSBiZWFuRGVzY3JpcHRvci5nZXRDb25zdHJhaW50c0Zvck1ldGhvZChoYW5kbGluZ01ldGhvZC5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgIGhhbmRsaW5nTWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkpOworCisgICAgICAgICAgICBmaW5hbCBNZXRob2QgZGVmaW5pdGlvbk1ldGhvZCA9IHJlc291cmNlTWV0aG9kLmdldERlZmluaXRpb25NZXRob2QoKTsKKworICAgICAgICAgICAgaWYgKG1ldGhvZERlc2NyaXB0b3IgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAmJiBtZXRob2REZXNjcmlwdG9yLmhhc0NvbnN0cmFpbmVkUmV0dXJuVmFsdWUoKQorICAgICAgICAgICAgICAgICAgICAmJiB2YWxpZGF0ZU9uRXhlY3V0aW9uSGFuZGxlci52YWxpZGF0ZU1ldGhvZChyZXNvdXJjZS5nZXRDbGFzcygpLCBkZWZpbml0aW9uTWV0aG9kLCBoYW5kbGluZ01ldGhvZCkpIHsKKyAgICAgICAgICAgICAgICBjb25zdHJhaW50VmlvbGF0aW9ucy5hZGRBbGwoZm9yRXhlY3V0YWJsZXMoKS52YWxpZGF0ZVJldHVyblZhbHVlKHJlc291cmNlLCBoYW5kbGluZ01ldGhvZCwgcmVzdWx0KSk7CisKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUmVzcG9uc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3RyYWludFZpb2xhdGlvbnMuYWRkQWxsKGZvckV4ZWN1dGFibGVzKCkudmFsaWRhdGVSZXR1cm5WYWx1ZShyZXNvdXJjZSwgaGFuZGxpbmdNZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSZXNwb25zZSkgcmVzdWx0KS5nZXRFbnRpdHkoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFjb25zdHJhaW50VmlvbGF0aW9ucy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbihjb25zdHJhaW50VmlvbGF0aW9ucyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3ZhbGlkYXRpb24vaW50ZXJuYWwvSW5qZWN0aW5nQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkuamF2YSBiL2V4dC9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvdmFsaWRhdGlvbi9pbnRlcm5hbC9JbmplY3RpbmdDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ZjJmOGMKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3ZhbGlkYXRpb24vaW50ZXJuYWwvSW5qZWN0aW5nQ29uc3RyYWludFZhbGlkYXRvckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci52YWxpZGF0aW9uLmludGVybmFsOworCitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlJlc291cmNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CisKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3I7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeTsKKworLyoqCisgKiB7QGxpbmsgQ29uc3RyYWludFZhbGlkYXRvckZhY3Rvcnl9IHdpdGggc3VwcG9ydCBvZiBpbmplY3RpbmcgSmVyc2V5IHByb3ZpZGVycy9yZXNvdXJjZXMuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBJbmplY3RpbmdDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSBpbXBsZW1lbnRzIENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5IHsKKworICAgIEBDb250ZXh0CisgICAgcHJpdmF0ZSBSZXNvdXJjZUNvbnRleHQgcmVzb3VyY2VDb250ZXh0OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxUIGV4dGVuZHMgQ29uc3RyYWludFZhbGlkYXRvcjw/LCA/Pj4gVCBnZXRJbnN0YW5jZShmaW5hbCBDbGFzczxUPiBrZXkpIHsKKyAgICAgICAgcmV0dXJuIHJlc291cmNlQ29udGV4dC5nZXRSZXNvdXJjZShrZXkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlbGVhc2VJbnN0YW5jZShmaW5hbCBDb25zdHJhaW50VmFsaWRhdG9yPD8sID8+IGluc3RhbmNlKSB7CisgICAgICAgIC8vIE5PT1AKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdGVPbkV4ZWN1dGlvbkhhbmRsZXIuamF2YSBiL2V4dC9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0ZU9uRXhlY3V0aW9uSGFuZGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMTQ5MzcKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdGVPbkV4ZWN1dGlvbkhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDI2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIudmFsaWRhdGlvbi5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFubm90YXRlZEVsZW1lbnQ7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlEZXF1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5EZXF1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRNYXA7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25maWd1cmF0aW9uOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLmV4ZWN1dGFibGUuRXhlY3V0YWJsZVR5cGU7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5leGVjdXRhYmxlLlZhbGlkYXRlT25FeGVjdXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YS5NdWx0aW1hcDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YS5NdWx0aW1hcHM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5SZWZsZWN0aW9uSGVscGVyOworCisvKioKKyAqIEhhbmRsZXIgcHJvdmlkaW5nIG1ldGhvZHMgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYW4gZXhlY3V0YWJsZSBzaG91bGQgYmUgdmFsaWRhdGVkIGR1cmluZyB0aGUgdmFsaWRhdGlvbiBwcm9jZXNzIGJhc2VkIG9uIHRoZQorICogcHJlc2VuY2Ugb2Yge0BsaW5rIFZhbGlkYXRlT25FeGVjdXRpb259IGFubm90YXRpb24uCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK2NsYXNzIFZhbGlkYXRlT25FeGVjdXRpb25IYW5kbGVyIHsKKworICAgIHByaXZhdGUgZmluYWwgQ29uY3VycmVudE1hcDxNZXRob2QsIEJvb2xlYW4+IHZhbGlkYXRlTWV0aG9kQ2FjaGUgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpOworICAgIHByaXZhdGUgZmluYWwgQ29uY3VycmVudE1hcDxNZXRob2QsIEJvb2xlYW4+IHZhbGlkYXRlR2V0dGVyQ2FjaGUgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpOworCisgICAgcHJpdmF0ZSBmaW5hbCBDb25maWd1cmF0aW9uIGNvbmZpZzsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gY2hlY2tPdmVycmlkZXM7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUge0BsaW5rIFZhbGlkYXRlT25FeGVjdXRpb25IYW5kbGVyfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25maWcgdmFsaWRhdGlvbiBjb25maWd1cmF0aW9uIHRvIG9idGFpbiBib290c3RyYXAgY29uZmlnLgorICAgICAqIEBwYXJhbSBjaGVja092ZXJyaWRlcyBmbGFnIHdoZXRoZXIgb3ZlcnJpZGluZy9pbXBsZW1lbnRpbmcgbWV0aG9kcyBzaG91bGQgYmUgY2hlY2tlZCBpZiB0aGUge0BsaW5rIFZhbGlkYXRlT25FeGVjdXRpb259CisgICAgICogYW5ub3RhdGlvbiBpcyBwcmVzZW50LgorICAgICAqLworICAgIFZhbGlkYXRlT25FeGVjdXRpb25IYW5kbGVyKGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlnLCBmaW5hbCBib29sZWFuIGNoZWNrT3ZlcnJpZGVzKSB7CisgICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnOworICAgICAgICB0aGlzLmNoZWNrT3ZlcnJpZGVzID0gY2hlY2tPdmVycmlkZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGdpdmVuIHtAbGluayBNZXRob2QgZ2V0dGVyfSBvbiB0aGUgZ2l2ZW4ge0BsaW5rIENsYXNzIGNsYXp6fSBzaG91bGQgYmUgdmFsaWRhdGVkIGR1cmluZyB0aGUKKyAgICAgKiByZXNvdXJjZSBjbGFzcyB2YWxpZGF0aW9uLiBTZWUge0Bjb2RlICN2YWxpZGF0ZU1ldGhvZH0gdG8gdW5kZXJzdGFuZCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoaXMgYW5kIHtAY29kZQorICAgICAqICN2YWxpZGF0ZU1ldGhvZH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhenogY2xhc3Mgb24gd2hpY2ggdGhlIGdldHRlciB3aWxsIGJlIGludm9rZWQuCisgICAgICogQHBhcmFtIG1ldGhvZCBtZXRob2QgdG8gYmUgZXhhbWluZWQuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGdldHRlciBzaG91bGQgYmUgdmFsaWRhdGVkLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sZWFuIHZhbGlkYXRlR2V0dGVyKGZpbmFsIENsYXNzPD8+IGNsYXp6LCBmaW5hbCBNZXRob2QgbWV0aG9kKSB7CisgICAgICAgIGlmICghdmFsaWRhdGVHZXR0ZXJDYWNoZS5jb250YWluc0tleShtZXRob2QpKSB7CisgICAgICAgICAgICBwcm9jZXNzTWV0aG9kKGNsYXp6LCBtZXRob2QsIG1ldGhvZCwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHZhbGlkYXRlR2V0dGVyQ2FjaGUuZ2V0KG1ldGhvZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGdpdmVuIHJlc291cmNlIHtAbGluayBNZXRob2QgbWV0aG9kfSB0by1iZS1leGVjdXRlZCBvbiB0aGUgZ2l2ZW4ge0BsaW5rIENsYXNzIGNsYXp6fSBzaG91bGQgYmUKKyAgICAgKiB2YWxpZGF0ZWQuIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBhbmQge0Bjb2RlICN2YWxpZGF0ZUdldHRlcn0gbWV0aG9kIGlzIHRoYXQgdGhpcyBtZXRob2QgcmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhlCisgICAgICoge0Bjb2RlIG1ldGhvZH0gaXMgZ2V0dGVyIGFuZCB2YWxpZGF0aW5nIGdldHRlciBtZXRob2QgaXMgbm90IGV4cGxpY2l0bHkgZGlzYWJsZWQgYnkge0BsaW5rIFZhbGlkYXRlT25FeGVjdXRpb259IGFubm90YXRpb24KKyAgICAgKiBpbiB0aGUgY2xhc3MgaGllcmFyY2h5LgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXp6IGNsYXNzIG9uIHdoaWNoIHRoZSBtZXRob2Qgd2lsbCBiZSBpbnZva2VkLgorICAgICAqIEBwYXJhbSBtZXRob2QgbWV0aG9kIHRvIGJlIGV4YW1pbmVkLgorICAgICAqIEBwYXJhbSB2YWxpZGF0aW9uTWV0aG9kIG1ldGhvZCB1c2VkIGZvciBjYWNoZS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgbWV0aG9kIHNob3VsZCBiZSB2YWxpZGF0ZWQsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2xlYW4gdmFsaWRhdGVNZXRob2QoZmluYWwgQ2xhc3M8Pz4gY2xhenosIGZpbmFsIE1ldGhvZCBtZXRob2QsIGZpbmFsIE1ldGhvZCB2YWxpZGF0aW9uTWV0aG9kKSB7CisgICAgICAgIGlmICghdmFsaWRhdGVNZXRob2RDYWNoZS5jb250YWluc0tleSh2YWxpZGF0aW9uTWV0aG9kKSkgeworICAgICAgICAgICAgcHJvY2Vzc01ldGhvZChjbGF6eiwgbWV0aG9kLCB2YWxpZGF0aW9uTWV0aG9kLCBmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHZhbGlkYXRlTWV0aG9kQ2FjaGUuZ2V0KHZhbGlkYXRpb25NZXRob2QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIGdpdmVuIHtAY29kZSBtZXRob2R9IGFuZCB7QGNvZGUgdmFsaWRhdGlvbk1ldGhvZH0gb24gZ2l2ZW4ge0Bjb2RlIGNsYXp6fSBhbmQgZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBtZXRob2QKKyAgICAgKiBzaG91bGQgYmUgdmFsaWRhdGVkIG9yIG5vdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGF6eiBjbGFzcyBvbiB3aGljaCB0aGUgbWV0aG9kIHdpbGwgYmUgaW52b2tlZC4KKyAgICAgKiBAcGFyYW0gbWV0aG9kIG1ldGhvZCB0byBiZSBleGFtaW5lZC4KKyAgICAgKiBAcGFyYW0gdmFsaWRhdGlvbk1ldGhvZCBtZXRob2QgdXNlZCBmb3IgY2FjaGUuCisgICAgICogQHBhcmFtIGZvcmNlVmFsaWRhdGlvbiBmb3JjZXMgdmFsaWRhdGlvbiBvZiBhIGdldHRlciBpZiBubyB7QGxpbmsgVmFsaWRhdGVPbkV4ZWN1dGlvbn0gYW5ub3RhdGlvbiBpcyBwcmVzZW50LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTWV0aG9kKGZpbmFsIENsYXNzPD8+IGNsYXp6LCBmaW5hbCBNZXRob2QgbWV0aG9kLCBmaW5hbCBNZXRob2QgdmFsaWRhdGlvbk1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGZvcmNlVmFsaWRhdGlvbikgeworICAgICAgICBmaW5hbCBEZXF1ZTxDbGFzczw/Pj4gaGllcmFyY2h5ID0gZ2V0VmFsaWRhdGlvbkNsYXNzSGllcmFyY2h5KGNsYXp6KTsKKyAgICAgICAgQm9vbGVhbiB2YWxpZGF0ZU1ldGhvZCA9IHByb2Nlc3NBbm5vdGF0aW9uKG1ldGhvZCwgaGllcmFyY2h5LCBjaGVja092ZXJyaWRlcyk7CisKKyAgICAgICAgaWYgKHZhbGlkYXRlTWV0aG9kICE9IG51bGwpIHsKKyAgICAgICAgICAgIHZhbGlkYXRlTWV0aG9kQ2FjaGUucHV0SWZBYnNlbnQodmFsaWRhdGlvbk1ldGhvZCwgdmFsaWRhdGVNZXRob2QpOworICAgICAgICAgICAgdmFsaWRhdGVHZXR0ZXJDYWNoZS5wdXRJZkFic2VudCh2YWxpZGF0aW9uTWV0aG9kLCB2YWxpZGF0ZU1ldGhvZCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXR1cm4gdmFsdWUgZnJvbSB2YWxpZGF0aW9uLnhtbC4KKyAgICAgICAgaWYgKCF2YWxpZGF0ZU1ldGhvZENhY2hlLmNvbnRhaW5zS2V5KHZhbGlkYXRpb25NZXRob2QpKSB7CisgICAgICAgICAgICBmaW5hbCBTZXQ8RXhlY3V0YWJsZVR5cGU+IGRlZmF1bHRWYWxpZGF0ZWRFeGVjdXRhYmxlVHlwZXMgPSBjb25maWcuZ2V0Qm9vdHN0cmFwQ29uZmlndXJhdGlvbigpCisgICAgICAgICAgICAgICAgICAgIC5nZXREZWZhdWx0VmFsaWRhdGVkRXhlY3V0YWJsZVR5cGVzKCk7CisgICAgICAgICAgICB2YWxpZGF0ZU1ldGhvZCA9IHZhbGlkYXRlTWV0aG9kKG1ldGhvZCwgZmFsc2UsIGRlZmF1bHRWYWxpZGF0ZWRFeGVjdXRhYmxlVHlwZXMpOworCisgICAgICAgICAgICB2YWxpZGF0ZUdldHRlckNhY2hlLnB1dElmQWJzZW50KHZhbGlkYXRpb25NZXRob2QsIHZhbGlkYXRlTWV0aG9kIHx8IGZvcmNlVmFsaWRhdGlvbik7CisKKyAgICAgICAgICAgIC8vIFdoZW4gdmFsaWRhdGVNZXRob2QgaXMgY2FsbGVkIGFuZCBubyBWYWxpZGF0ZU9uRXhlY3V0aW9uIGFubm90YXRpb24gaXMgcHJlc2VudCB3ZSB3YW50IHRvIHZhbGlkYXRlIGdldHRlciByZXNvdXJjZQorICAgICAgICAgICAgLy8gbWV0aG9kcyBieSBkZWZhdWx0IChzZWUgU1BFQykuCisgICAgICAgICAgICB2YWxpZGF0ZU1ldGhvZENhY2hlLnB1dElmQWJzZW50KHZhbGlkYXRpb25NZXRob2QsIFJlZmxlY3Rpb25IZWxwZXIuaXNHZXR0ZXIodmFsaWRhdGlvbk1ldGhvZCkgfHwgdmFsaWRhdGVNZXRob2QpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvY2VzcyB7QGxpbmsgVmFsaWRhdGVPbkV4ZWN1dGlvbn0gYW5ub3RhdGlvbiBmb3IgZ2l2ZW4gbWV0aG9kIG9uIGEgY2xhc3MgaGllcmFyY2h5LgorICAgICAqCisgICAgICogQHBhcmFtIG1ldGhvZCBtZXRob2QgdG8gYmUgZXhhbWluZWQuCisgICAgICogQHBhcmFtIGhpZXJhcmNoeSBjbGFzcyBoaWVyYXJjaHkgdG8gYmUgZXhhbWluZWQuCisgICAgICogQHBhcmFtIGNoZWNrT3ZlcnJpZGVzIGZsYWcgd2hldGhlciBhIG92ZXJyaWRpbmcvaW1wbGVtZW50aW5nIG1ldGhvZHMgc2hvdWxkIGFsc28gYmUgY2hlY2tlZC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgbWV0aG9kIHNob3VsZCBiZSB2YWxpZGF0ZWQsIHtAY29kZSBmYWxzZX0gaWYgbm90LCB7QGNvZGUgbnVsbH0gaWYgdGhlIGZsYWcgY2Fubm90IGJlCisgICAgICogZGV0ZXJtaW5lZCAobm8gYW5ub3RhdGlvbiBwcmVzZW50KS4KKyAgICAgKi8KKyAgICBwcml2YXRlIEJvb2xlYW4gcHJvY2Vzc0Fubm90YXRpb24oZmluYWwgTWV0aG9kIG1ldGhvZCwgZmluYWwgRGVxdWU8Q2xhc3M8Pz4+IGhpZXJhcmNoeSwgZmluYWwgYm9vbGVhbiBjaGVja092ZXJyaWRlcykgeworICAgICAgICAvLyBPdmVycmlkZGVuIG1ldGhvZHMuCisgICAgICAgIHdoaWxlICghaGllcmFyY2h5LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gb3ZlcnJpZGRlbkNsYXNzID0gaGllcmFyY2h5LnJlbW92ZUZpcnN0KCk7CisgICAgICAgICAgICBmaW5hbCBNZXRob2Qgb3ZlcnJpZGRlbk1ldGhvZCA9CisgICAgICAgICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKFJlZmxlY3Rpb25IZWxwZXIuZmluZE1ldGhvZE9uQ2xhc3NQQShvdmVycmlkZGVuQ2xhc3MsIG1ldGhvZCkpOworCisgICAgICAgICAgICBpZiAob3ZlcnJpZGRlbk1ldGhvZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gTWV0aG9kLgorICAgICAgICAgICAgICAgIFNldDxFeGVjdXRhYmxlVHlwZT4gZXhlY3V0YWJsZVR5cGVzID0gZ2V0RXhlY3V0YWJsZVR5cGVzKG92ZXJyaWRkZW5NZXRob2QpOworICAgICAgICAgICAgICAgIGlmICghZXhlY3V0YWJsZVR5cGVzLmlzRW1wdHkoKSkgeworCisgICAgICAgICAgICAgICAgICAgIC8vIElmIGFuIG92ZXJyaWRpbmcvaW1wbGVtZW50aW5nIG1ldGhvZCBpcyBhbm5vdGF0ZWQgd2l0aCBAVmFsaWRhdGVPbkV4ZWN1dGlvbiwgdGhyb3cgYW4gZXhjZXB0aW9uLgorICAgICAgICAgICAgICAgICAgICBpZiAoY2hlY2tPdmVycmlkZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBwcm9jZXNzQW5ub3RhdGlvbihtZXRob2QsIGhpZXJhcmNoeSwgZmFsc2UpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXRob2ROYW1lID0gbWV0aG9kLmdldERlY2xhcmluZ0NsYXNzKCkuZ2V0TmFtZSgpICsgIiMiICsgbWV0aG9kLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBWYWxpZGF0aW9uRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLk9WRVJSSURFX0NIRUNLX0VSUk9SKG1ldGhvZE5hbWUpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZU1ldGhvZChvdmVycmlkZGVuTWV0aG9kLCB0cnVlLCBleGVjdXRhYmxlVHlwZXMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIENsYXNzLgorICAgICAgICAgICAgICAgIGV4ZWN1dGFibGVUeXBlcyA9IGdldEV4ZWN1dGFibGVUeXBlcyhvdmVycmlkZGVuQ2xhc3MpOworICAgICAgICAgICAgICAgIGlmICghZXhlY3V0YWJsZVR5cGVzLmlzRW1wdHkoKQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXQgc2hvdWxkIGNvbnRhaW4gbm90IG9ubHkgRXhlY3V0YWJsZVR5cGUjSU1QTElDSVQgYnV0IHNvbWV0aGluZyBlbHNlIGFzIHdlbGwuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeGVjdXRhYmxlVHlwZSNJTVBMSUNJVCBvbiBjbGFzcyBpdHNlbGYgZG9lcyBub3RoaW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgJiYgIShleGVjdXRhYmxlVHlwZXMuc2l6ZSgpID09IDEgJiYgZXhlY3V0YWJsZVR5cGVzLmNvbnRhaW5zKEV4ZWN1dGFibGVUeXBlLklNUExJQ0lUKSkpIHsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVNZXRob2Qob3ZlcnJpZGRlbk1ldGhvZCwgZmFsc2UsIGV4ZWN1dGFibGVUeXBlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZSB3aGV0aGVyIHRoZSBnaXZlbiB7QGxpbmsgTWV0aG9kIG1ldGhvZH0gc2hvdWxkIGJlIHZhbGlkYXRlZCBkZXBlbmRpbmcgb24gdGhlIGdpdmVuIHtAY29kZSBleGVjdXRhYmxlVHlwZXN9LgorICAgICAqCisgICAgICogQHBhcmFtIG1ldGhvZCBtZXRob2QgdG8gYmUgZXhhbWluZWQuCisgICAgICogQHBhcmFtIGFsbG93SW1wbGljaXQgYWxsb3dzIGNoZWNrIGZvciB7QGxpbmsgRXhlY3V0YWJsZVR5cGUjSU1QTElDSVR9IHR5cGUuCisgICAgICogQHBhcmFtIGV4ZWN1dGFibGVUeXBlcyBleGVjdXRhYmxlIHR5cGVzIGFzc2lnbmVkIHRvIHRoZSBtZXRob2QuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG1ldGhvZCBzaG91bGQgYmUgdmFsaWRhdGVkLCB7QGNvZGUgZmFsc2Ugb3RoZXJ3aXNlfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gdmFsaWRhdGVNZXRob2QoZmluYWwgTWV0aG9kIG1ldGhvZCwgZmluYWwgYm9vbGVhbiBhbGxvd0ltcGxpY2l0LCBmaW5hbCBTZXQ8RXhlY3V0YWJsZVR5cGU+IGV4ZWN1dGFibGVUeXBlcykgeworICAgICAgICBpZiAoZXhlY3V0YWJsZVR5cGVzLmNvbnRhaW5zKEV4ZWN1dGFibGVUeXBlLkFMTCkKKyAgICAgICAgICAgICAgICB8fCAoYWxsb3dJbXBsaWNpdCAmJiBleGVjdXRhYmxlVHlwZXMuY29udGFpbnMoRXhlY3V0YWJsZVR5cGUuSU1QTElDSVQpKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFJlZmxlY3Rpb25IZWxwZXIuaXNHZXR0ZXIobWV0aG9kKSA/IGV4ZWN1dGFibGVUeXBlcy5jb250YWlucyhFeGVjdXRhYmxlVHlwZS5HRVRURVJfTUVUSE9EUykKKyAgICAgICAgICAgICAgICA6IGV4ZWN1dGFibGVUeXBlcy5jb250YWlucyhFeGVjdXRhYmxlVHlwZS5OT05fR0VUVEVSX01FVEhPRFMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIHNldCBvZiBleGVjdXRhYmxlIHR5cGVzIGNvbnRhaW5lZCBpbiB7QGxpbmsgVmFsaWRhdGVPbkV4ZWN1dGlvbn0gYW5ub3RhdGlvbiBiZWxvbmdpbmcgdG8gdGhlIHtAY29kZSBlbGVtZW50fS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbGVtZW50IGVsZW1lbnQgdG8gYmUgZXhhbWluZWQgZm9yIHtAbGluayBWYWxpZGF0ZU9uRXhlY3V0aW9ufS4KKyAgICAgKiBAcmV0dXJuIHNldCBvZiBleGVjdXRhYmxlIHR5cGVzIG9yIGFuIGVtcHR5IHNldCBpZiB0aGUgZWxlbWVudCBpcyBub3QgYW5ub3RhdGVkIHdpdGgge0BsaW5rIFZhbGlkYXRlT25FeGVjdXRpb259LgorICAgICAqLworICAgIHByaXZhdGUgU2V0PEV4ZWN1dGFibGVUeXBlPiBnZXRFeGVjdXRhYmxlVHlwZXMoZmluYWwgQW5ub3RhdGVkRWxlbWVudCBlbGVtZW50KSB7CisgICAgICAgIGZpbmFsIFZhbGlkYXRlT25FeGVjdXRpb24gdmFsaWRhdGVFeGVjdXRhYmxlID0gZWxlbWVudC5nZXRBbm5vdGF0aW9uKFZhbGlkYXRlT25FeGVjdXRpb24uY2xhc3MpOworICAgICAgICByZXR1cm4gdmFsaWRhdGVFeGVjdXRhYmxlICE9IG51bGwKKyAgICAgICAgICAgICAgICA/IEFycmF5cy5zdHJlYW0odmFsaWRhdGVFeGVjdXRhYmxlLnR5cGUoKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpCisgICAgICAgICAgICAgICAgOiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIGNsYXNzIGhpZXJhcmNoeSBmb3IgdGhlIGdpdmVuIHtAY29kZSBjbGF6en0gc3VpdGFibGUgdG8gYmUgbG9va2VkIGZvciB7QGxpbmsgVmFsaWRhdGVPbkV4ZWN1dGlvbn0gYW5ub3RhdGlvbgorICAgICAqIGluIG9yZGVyIGFjY29yZGluZyB0byB0aGUgcHJpb3JpdHkgZGVmaW5lZCBieSBCZWFuIFZhbGlkYXRpb24gc3BlYyAoc3VwZXJjbGFzc2VzLCBpbnRlcmZhY2VzKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGF6eiBjbGFzcyB0byBvYnRhaW4gaGllcmFyY2h5IGZvci4KKyAgICAgKiBAcmV0dXJuIGNsYXNzIGhpZXJhcmNoeS4KKyAgICAgKi8KKyAgICBwcml2YXRlIERlcXVlPENsYXNzPD8+PiBnZXRWYWxpZGF0aW9uQ2xhc3NIaWVyYXJjaHkoZmluYWwgQ2xhc3M8Pz4gY2xhenopIHsKKyAgICAgICAgZmluYWwgTGlzdDxDbGFzczw/Pj4gaGllcmFyY2h5ID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICAgICAgLy8gR2V0IGFsbCBzdXBlcmNsYXNzZXMuCisgICAgICAgIGZvciAoQ2xhc3M8Pz4gY3VycmVudENsYXNzID0gY2xheno7IGN1cnJlbnRDbGFzcyAhPSBPYmplY3QuY2xhc3M7IGN1cnJlbnRDbGFzcyA9IGN1cnJlbnRDbGFzcy5nZXRTdXBlcmNsYXNzKCkpIHsKKyAgICAgICAgICAgIGhpZXJhcmNoeS5hZGQoY2xhenopOworICAgICAgICB9CisKKyAgICAgICAgaGllcmFyY2h5LmFkZEFsbChnZXRBbGxWYWxpZGF0aW9uSW50ZXJmYWNlcyhjbGF6eikpOworICAgICAgICBDb2xsZWN0aW9ucy5yZXZlcnNlKGhpZXJhcmNoeSk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBBcnJheURlcXVlPD4oaGllcmFyY2h5KTsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8Q2xhc3M8Pz4+IGdldEFsbFZhbGlkYXRpb25JbnRlcmZhY2VzKGZpbmFsIENsYXNzPD8+IGNsYXp6KSB7CisgICAgICAgIGZpbmFsIE11bHRpbWFwPEludGVnZXIsIENsYXNzPD8+PiBtYXAgPSBNdWx0aW1hcHMubmV3TGlzdE11bHRpbWFwKAorICAgICAgICAgICAgICAgIG5ldyBUcmVlTWFwPEludGVnZXIsIENvbGxlY3Rpb248Q2xhc3M8Pz4+PigpLCBBcnJheUxpc3Q6Om5ldyk7CisKKyAgICAgICAgcmV0cmlldmVBbGxWYWxpZGF0aW9uSW50ZXJmYWNlcyhjbGF6eiwgbWFwKTsKKworICAgICAgICBmaW5hbCBMaXN0PENsYXNzPD8+PiBpbnRlcmZhY2VzID0gbmV3IEFycmF5TGlzdDw+KG1hcC52YWx1ZXMoKSk7CisgICAgICAgIENvbGxlY3Rpb25zLnJldmVyc2UoaW50ZXJmYWNlcyk7CisKKyAgICAgICAgcmV0dXJuIGludGVyZmFjZXM7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgcmV0cmlldmVBbGxWYWxpZGF0aW9uSW50ZXJmYWNlcyhDbGFzczw/PiBjbGF6eiwgZmluYWwgTXVsdGltYXA8SW50ZWdlciwgQ2xhc3M8Pz4+IG1hcCkgeworICAgICAgICBpZiAoY2xhenogPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBpbnQgbWluRGVwdGggPSAwOworCisgICAgICAgIHdoaWxlIChjbGF6eiAhPSBudWxsKSB7CisgICAgICAgICAgICBmb3IgKGZpbmFsIENsYXNzPD8+IGlmYWNlIDogY2xhenouZ2V0SW50ZXJmYWNlcygpKSB7CisgICAgICAgICAgICAgICAgaW50IGRlcHRoID0gcmV0cmlldmVBbGxWYWxpZGF0aW9uSW50ZXJmYWNlcyhpZmFjZSwgbWFwKTsKKworICAgICAgICAgICAgICAgIGlmICghbWFwLmNvbnRhaW5zVmFsdWUoaWZhY2UpKSB7CisgICAgICAgICAgICAgICAgICAgIG1hcC5wdXQoZGVwdGgsIGlmYWNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbWluRGVwdGggPSBtaW5EZXB0aCA+IGRlcHRoID8gZGVwdGggOiBtaW5EZXB0aDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2xhenogPSBjbGF6ei5nZXRTdXBlcmNsYXNzKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbWluRGVwdGggKyAxOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0ZU9uRXhlY3V0aW9uVHJhdmVyc2FibGVSZXNvbHZlci5qYXZhIGIvZXh0L2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRlT25FeGVjdXRpb25UcmF2ZXJzYWJsZVJlc29sdmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBhMTMyMQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0ZU9uRXhlY3V0aW9uVHJhdmVyc2FibGVSZXNvbHZlci5qYXZhCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci52YWxpZGF0aW9uLmludGVybmFsOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TWFwOworCitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXRoOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVHJhdmVyc2FibGVSZXNvbHZlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUmVmbGVjdGlvbkhlbHBlcjsKKworLyoqCisgKiB7QGxpbmsgVHJhdmVyc2FibGVSZXNvbHZlciBUcmF2ZXJzYWJsZSByZXNvbHZlcn0gdXNlZCBmb3IgaGFuZGxpbmcge0BsaW5rIGphdmF4LnZhbGlkYXRpb24uZXhlY3V0YWJsZS5WYWxpZGF0ZU9uRXhlY3V0aW9ufQorICogYW5ub3RhdGlvbnMgcHJlc2VudCBvbiBwcm9wZXJ0eSBnZXR0ZXJzIHdoZW4gdmFsaWRhdGluZyByZXNvdXJjZSBjbGFzcy4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworY2xhc3MgVmFsaWRhdGVPbkV4ZWN1dGlvblRyYXZlcnNhYmxlUmVzb2x2ZXIgaW1wbGVtZW50cyBUcmF2ZXJzYWJsZVJlc29sdmVyIHsKKworICAgIHByaXZhdGUgZmluYWwgVHJhdmVyc2FibGVSZXNvbHZlciBkZWxlZ2F0ZTsKKworICAgIHByaXZhdGUgZmluYWwgQ29uY3VycmVudE1hcDxTdHJpbmcsIE1ldGhvZD4gcHJvcGVydHlUb01ldGhvZCA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDw+KCk7CisKKyAgICBwcml2YXRlIGZpbmFsIFZhbGlkYXRlT25FeGVjdXRpb25IYW5kbGVyIHZhbGlkYXRlT25FeGVjdXRpb25IYW5kbGVyOworCisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIHZhbGlkYXRlRXhlY3V0YWJsZTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyB7QGxpbmsgVmFsaWRhdGVPbkV4ZWN1dGlvblRyYXZlcnNhYmxlUmVzb2x2ZXJ9LgorICAgICAqCisgICAgICogQHBhcmFtIGRlbGVnYXRlIGRlbGVnYXRlIHJlcXVlc3RzIHRvIHRoaXMgdW5kZXJseWluZyB0cmF2ZXJzYWJsZSByZXNvbHZlciBpZiB0aGlzIG9uZSBjYW5ub3QgcmVzb2x2ZSBpdC4KKyAgICAgKiBAcGFyYW0gdmFsaWRhdGVPbkV4ZWN1dGlvbkhhbmRsZXIgaGFuZGxlciB0byBkZXRlcm1pbmUgd2hldGhlciBhIGdldHRlciBzaG91bGQgYmUgdmFsaWRhdGVkIG9yIG5vdC4KKyAgICAgKiBAcGFyYW0gdmFsaWRhdGVFeGVjdXRhYmxlIGJvb3RzdHJhcCBmbGFnIHRvIGVuYWJsZS9kaXNhYmxlIGdsb2JhbCB2YWxpZGF0aW9uIG9mIGV4ZWN1dGFibGVzLgorICAgICAqLworICAgIHB1YmxpYyBWYWxpZGF0ZU9uRXhlY3V0aW9uVHJhdmVyc2FibGVSZXNvbHZlcihmaW5hbCBUcmF2ZXJzYWJsZVJlc29sdmVyIGRlbGVnYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBWYWxpZGF0ZU9uRXhlY3V0aW9uSGFuZGxlciB2YWxpZGF0ZU9uRXhlY3V0aW9uSGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiB2YWxpZGF0ZUV4ZWN1dGFibGUpIHsKKyAgICAgICAgdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlOworICAgICAgICB0aGlzLnZhbGlkYXRlRXhlY3V0YWJsZSA9IHZhbGlkYXRlRXhlY3V0YWJsZTsKKyAgICAgICAgdGhpcy52YWxpZGF0ZU9uRXhlY3V0aW9uSGFuZGxlciA9IHZhbGlkYXRlT25FeGVjdXRpb25IYW5kbGVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzUmVhY2hhYmxlKGZpbmFsIE9iamVjdCB0cmF2ZXJzYWJsZU9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBQYXRoLk5vZGUgdHJhdmVyc2FibGVQcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiByb290QmVhblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUGF0aCBwYXRoVG9UcmF2ZXJzYWJsZU9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBFbGVtZW50VHlwZSBlbGVtZW50VHlwZSkgeworICAgICAgICAvLyBNYWtlIHN1cmUgb25seSBnZXR0ZXJzIG9uIGVudGl0aWVzIGFyZSB2YWxpZGF0ZWQgKG5vdCBnZXR0ZXJzIG9uIHJlc291cmNlIGNsYXNzZXMpLgorICAgICAgICBmaW5hbCBDbGFzczw/PiB0cmF2ZXJzYWJsZU9iamVjdENsYXNzID0gdHJhdmVyc2FibGVPYmplY3QuZ2V0Q2xhc3MoKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpc0VudGl0eSA9ICFyb290QmVhblR5cGUuZXF1YWxzKHRyYXZlcnNhYmxlT2JqZWN0Q2xhc3MpOworCisgICAgICAgIGlmIChpc0VudGl0eSAmJiB2YWxpZGF0ZUV4ZWN1dGFibGUgJiYgRWxlbWVudFR5cGUuTUVUSE9ELmVxdWFscyhlbGVtZW50VHlwZSkpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUgPSB0cmF2ZXJzYWJsZVByb3BlcnR5LmdldE5hbWUoKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcm9wZXJ0eUtleSA9IHRyYXZlcnNhYmxlT2JqZWN0Q2xhc3MuZ2V0TmFtZSgpICsgIiMiICsgcHJvcGVydHlOYW1lOworCisgICAgICAgICAgICBpZiAoIXByb3BlcnR5VG9NZXRob2QuY29udGFpbnNLZXkocHJvcGVydHlLZXkpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgTWV0aG9kIGdldHRlciA9IGdldEdldHRlck1ldGhvZCh0cmF2ZXJzYWJsZU9iamVjdENsYXNzLCBwcm9wZXJ0eU5hbWUpOworCisgICAgICAgICAgICAgICAgaWYgKGdldHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VG9NZXRob2QucHV0SWZBYnNlbnQocHJvcGVydHlLZXksIGdldHRlcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBNZXRob2QgZ2V0dGVyID0gcHJvcGVydHlUb01ldGhvZC5nZXQocHJvcGVydHlLZXkpOworICAgICAgICAgICAgcmV0dXJuIGdldHRlciAhPSBudWxsICYmIHZhbGlkYXRlT25FeGVjdXRpb25IYW5kbGVyLnZhbGlkYXRlR2V0dGVyKHRyYXZlcnNhYmxlT2JqZWN0Q2xhc3MsIGdldHRlcik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZGVsZWdhdGUuaXNSZWFjaGFibGUodHJhdmVyc2FibGVPYmplY3QsIHRyYXZlcnNhYmxlUHJvcGVydHksIHJvb3RCZWFuVHlwZSwgcGF0aFRvVHJhdmVyc2FibGVPYmplY3QsIGVsZW1lbnRUeXBlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0Nhc2NhZGFibGUoZmluYWwgT2JqZWN0IHRyYXZlcnNhYmxlT2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBQYXRoLk5vZGUgdHJhdmVyc2FibGVQcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gcm9vdEJlYW5UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBQYXRoIHBhdGhUb1RyYXZlcnNhYmxlT2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBFbGVtZW50VHlwZSBlbGVtZW50VHlwZSkgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUuaXNDYXNjYWRhYmxlKHRyYXZlcnNhYmxlT2JqZWN0LCB0cmF2ZXJzYWJsZVByb3BlcnR5LCByb290QmVhblR5cGUsIHBhdGhUb1RyYXZlcnNhYmxlT2JqZWN0LCBlbGVtZW50VHlwZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGdldHRlciBtZXRob2QgZGVmaW5lZCBvbiB7QGNvZGUgY2xhenp9IG9mIHByb3BlcnR5IHdpdGggZ2l2ZW4ge0Bjb2RlIHByb3BlcnR5TmFtZX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhenogY2xhc3MgdG8gZmluZCBhIGdldHRlciBtZXRob2Qgb24uCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byBmaW5kIGEgZ2V0dGVyIGZvci4KKyAgICAgKiBAcmV0dXJuIGdldHRlciBtZXRob2Qgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBtZXRob2QgY2Fubm90IGJlIGZvdW5kLgorICAgICAqLworICAgIHByaXZhdGUgTWV0aG9kIGdldEdldHRlck1ldGhvZChmaW5hbCBDbGFzczw/PiBjbGF6eiwgZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSkgeworICAgICAgICAvLyBQcm9wZXJ0eSB0eXBlLgorICAgICAgICBDbGFzczw/PiBwcm9wZXJ0eVR5cGUgPSBudWxsOworICAgICAgICBmb3IgKGZpbmFsIEZpZWxkIGZpZWxkIDogQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoUmVmbGVjdGlvbkhlbHBlci5nZXRBbGxGaWVsZHNQQShjbGF6eikpKSB7CisgICAgICAgICAgICBpZiAoZmllbGQuZ2V0TmFtZSgpLmVxdWFscyhwcm9wZXJ0eU5hbWUpKSB7CisgICAgICAgICAgICAgICAgcHJvcGVydHlUeXBlID0gZmllbGQuZ2V0VHlwZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZmluYWwgY2hhcltdIGNoYXJzID0gcHJvcGVydHlOYW1lLnRvQ2hhckFycmF5KCk7CisgICAgICAgIGNoYXJzWzBdID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNoYXJzWzBdKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGdldHRlclByb3BlcnR5TmFtZSA9IG5ldyBTdHJpbmcoY2hhcnMpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBpc0dldHRlciA9ICJpcyIgKyBnZXR0ZXJQcm9wZXJ0eU5hbWU7CisgICAgICAgIGZpbmFsIFN0cmluZyBnZXRHZXR0ZXIgPSAiZ2V0IiArIGdldHRlclByb3BlcnR5TmFtZTsKKworICAgICAgICBmb3IgKGZpbmFsIE1ldGhvZCBtZXRob2QgOiBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChSZWZsZWN0aW9uSGVscGVyLmdldE1ldGhvZHNQQShjbGF6eikpKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWV0aG9kTmFtZSA9IG1ldGhvZC5nZXROYW1lKCk7CisKKyAgICAgICAgICAgIGlmICgobWV0aG9kTmFtZS5lcXVhbHMoaXNHZXR0ZXIpIHx8IG1ldGhvZE5hbWUuZXF1YWxzKGdldEdldHRlcikpCisgICAgICAgICAgICAgICAgICAgICYmIFJlZmxlY3Rpb25IZWxwZXIuaXNHZXR0ZXIobWV0aG9kKQorICAgICAgICAgICAgICAgICAgICAmJiAocHJvcGVydHlUeXBlID09IG51bGwgfHwgcHJvcGVydHlUeXBlLmlzQXNzaWduYWJsZUZyb20obWV0aG9kLmdldFJldHVyblR5cGUoKSkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKFJlZmxlY3Rpb25IZWxwZXIuZmluZE1ldGhvZE9uQ2xhc3NQQShjbGF6eiwgbWV0aG9kKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdGlvbkF1dG9EaXNjb3ZlcmFibGUuamF2YSBiL2V4dC9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0aW9uQXV0b0Rpc2NvdmVyYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiMzczZmMKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdGlvbkF1dG9EaXNjb3ZlcmFibGUuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci52YWxpZGF0aW9uLmludGVybmFsOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qcmlvcml0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdHJhaW5lZFRvOworaW1wb3J0IGphdmF4LndzLnJzLlJ1bnRpbWVUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5zcGkuQXV0b0Rpc2NvdmVyYWJsZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5zcGkuRm9yY2VkQXV0b0Rpc2NvdmVyYWJsZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIudmFsaWRhdGlvbi5WYWxpZGF0aW9uRmVhdHVyZTsKKworLyoqCisgKiB7QGxpbmsgQXV0b0Rpc2NvdmVyYWJsZX0gcmVnaXN0ZXJpbmcge0BsaW5rIFZhbGlkYXRpb25GZWF0dXJlfSBpZiB0aGlzIGZlYXR1cmUgaXMgbm90IGFscmVhZHkgcmVnaXN0ZXJlZC4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQENvbnN0cmFpbmVkVG8oUnVudGltZVR5cGUuU0VSVkVSKQorQFByaW9yaXR5KEF1dG9EaXNjb3ZlcmFibGUuREVGQVVMVF9QUklPUklUWSkKK3B1YmxpYyBmaW5hbCBjbGFzcyBWYWxpZGF0aW9uQXV0b0Rpc2NvdmVyYWJsZSBpbXBsZW1lbnRzIEZvcmNlZEF1dG9EaXNjb3ZlcmFibGUgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY29uZmlndXJlKGZpbmFsIEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgaWYgKCFjb250ZXh0LmdldENvbmZpZ3VyYXRpb24oKS5pc1JlZ2lzdGVyZWQoVmFsaWRhdGlvbkZlYXR1cmUuY2xhc3MpKSB7CisgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKFZhbGlkYXRpb25GZWF0dXJlLmNsYXNzKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0aW9uQmluZGVyLmphdmEgYi9leHQvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdGlvbkJpbmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MGY5MjAKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdGlvbkJpbmRlci5qYXZhCkBAIC0wLDAgKzEsMjk0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci52YWxpZGF0aW9uLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuV2Vha0hhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5SZXNvdXJjZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Db250ZXh0UmVzb2x2ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LkV4Y2VwdGlvbk1hcHBlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyczsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5UcmF2ZXJzYWJsZVJlc29sdmVyOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdGlvbjsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0aW9uUHJvdmlkZXJSZXNvbHZlcjsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRvcjsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRvckNvbnRleHQ7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0b3JGYWN0b3J5OworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uc3BpLlZhbGlkYXRpb25Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLlNlcnZpY2VGaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkFic3RyYWN0QmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUHJvcGVydGllc0hlbHBlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlJlZmxlY3Rpb25IZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW9kZWwuaW50ZXJuYWwuUmFua2VkQ29tcGFyYXRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb2RlbC5pbnRlcm5hbC5SYW5rZWRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuaW5qZWN0LkNvbmZpZ3VyZWRWYWxpZGF0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5WYWxpZGF0aW9uSW50ZXJjZXB0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnZhbGlkYXRpb24uVmFsaWRhdGlvbkNvbmZpZzsKKworLyoqCisgKiBCZWFuIFZhbGlkYXRpb24gcHJvdmlkZXIgaW5qZWN0aW9uIGJpbmRlci4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFZhbGlkYXRpb25CaW5kZXIgZXh0ZW5kcyBBYnN0cmFjdEJpbmRlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihWYWxpZGF0aW9uQmluZGVyLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgIGJpbmRGYWN0b3J5KERlZmF1bHRDb25maWd1cmF0aW9uUHJvdmlkZXIuY2xhc3MsIFNpbmdsZXRvbi5jbGFzcykudG8oQ29uZmlndXJhdGlvbi5jbGFzcykuaW4oU2luZ2xldG9uLmNsYXNzKTsKKworICAgICAgICBiaW5kRmFjdG9yeShEZWZhdWx0VmFsaWRhdG9yRmFjdG9yeVByb3ZpZGVyLmNsYXNzLCBTaW5nbGV0b24uY2xhc3MpLnRvKFZhbGlkYXRvckZhY3RvcnkuY2xhc3MpLmluKFNpbmdsZXRvbi5jbGFzcyk7CisgICAgICAgIGJpbmRGYWN0b3J5KERlZmF1bHRWYWxpZGF0b3JQcm92aWRlci5jbGFzcywgU2luZ2xldG9uLmNsYXNzKS50byhWYWxpZGF0b3IuY2xhc3MpLmluKFNpbmdsZXRvbi5jbGFzcyk7CisKKyAgICAgICAgYmluZEZhY3RvcnkoQ29uZmlndXJlZFZhbGlkYXRvclByb3ZpZGVyLmNsYXNzLCBTaW5nbGV0b24uY2xhc3MpLnRvKENvbmZpZ3VyZWRWYWxpZGF0b3IuY2xhc3MpOworCisgICAgICAgIC8vIEN1c3RvbSBFeGNlcHRpb24gTWFwcGVyIGFuZCBXcml0ZXIgLSByZWdpc3RlcmluZyBpbiBiaW5kZXIgdG8gbWFrZSBwb3NzaWJsZSBmb3IgdXNlcnMgcmVnaXN0ZXIgdGhlaXIgb3duIHByb3ZpZGVycy4KKyAgICAgICAgYmluZChWYWxpZGF0aW9uRXhjZXB0aW9uTWFwcGVyLmNsYXNzKS50byhFeGNlcHRpb25NYXBwZXIuY2xhc3MpLmluKFNpbmdsZXRvbi5jbGFzcyk7CisgICAgICAgIGJpbmQoVmFsaWRhdGlvbkVycm9yTWVzc2FnZUJvZHlXcml0ZXIuY2xhc3MpLnRvKE1lc3NhZ2VCb2R5V3JpdGVyLmNsYXNzKS5pbihTaW5nbGV0b24uY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZhY3RvcnkgcHJvdmlkaW5nIGRlZmF1bHQge0BsaW5rIGphdmF4LnZhbGlkYXRpb24uQ29uZmlndXJhdGlvbn0gaW5zdGFuY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGVmYXVsdENvbmZpZ3VyYXRpb25Qcm92aWRlciBpbXBsZW1lbnRzIFN1cHBsaWVyPENvbmZpZ3VyYXRpb24+IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaW5Pc2dpOworCisgICAgICAgIHB1YmxpYyBEZWZhdWx0Q29uZmlndXJhdGlvblByb3ZpZGVyKCkgeworICAgICAgICAgICAgdGhpcy5pbk9zZ2kgPSBSZWZsZWN0aW9uSGVscGVyLmdldE9zZ2lSZWdpc3RyeUluc3RhbmNlKCkgIT0gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ29uZmlndXJhdGlvbiBnZXQoKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGlmICghaW5Pc2dpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBWYWxpZGF0aW9uLmJ5RGVmYXVsdFByb3ZpZGVyKCkuY29uZmlndXJlKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZhbGlkYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnlEZWZhdWx0UHJvdmlkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wcm92aWRlclJlc29sdmVyKG5ldyBWYWxpZGF0aW9uUHJvdmlkZXJSZXNvbHZlcigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBMaXN0PFZhbGlkYXRpb25Qcm92aWRlcjw/Pj4gZ2V0VmFsaWRhdGlvblByb3ZpZGVycygpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8VmFsaWRhdGlvblByb3ZpZGVyPD8+PiB2YWxpZGF0aW9uUHJvdmlkZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoZmluYWwgVmFsaWRhdGlvblByb3ZpZGVyIHZhbGlkYXRpb25Qcm92aWRlciA6IFNlcnZpY2VGaW5kZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoVmFsaWRhdGlvblByb3ZpZGVyLmNsYXNzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25Qcm92aWRlcnMuYWRkKHZhbGlkYXRpb25Qcm92aWRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0aW9uUHJvdmlkZXJzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29uZmlndXJlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgVmFsaWRhdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gbG9nIGFuZCByZS10cm93CisgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5GSU5FLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5WQUxJREFUSU9OX0VYQ0VQVElPTl9QUk9WSURFUigpLCBlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmFjdG9yeSBwcm92aWRpbmcgZGVmYXVsdCAodW4tY29uZmlndXJlZCkge0BsaW5rIFZhbGlkYXRvckZhY3Rvcnl9IGluc3RhbmNlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIERlZmF1bHRWYWxpZGF0b3JGYWN0b3J5UHJvdmlkZXIgaW1wbGVtZW50cyBTdXBwbGllcjxWYWxpZGF0b3JGYWN0b3J5PiB7CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBwcml2YXRlIENvbmZpZ3VyYXRpb24gY29uZmlnOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVmFsaWRhdG9yRmFjdG9yeSBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gY29uZmlnLmJ1aWxkVmFsaWRhdG9yRmFjdG9yeSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmFjdG9yeSBwcm92aWRpbmcgZGVmYXVsdCAodW4tY29uZmlndXJlZCkge0BsaW5rIFZhbGlkYXRvcn0gaW5zdGFuY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGVmYXVsdFZhbGlkYXRvclByb3ZpZGVyIGltcGxlbWVudHMgU3VwcGxpZXI8VmFsaWRhdG9yPiB7CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBwcml2YXRlIFZhbGlkYXRvckZhY3RvcnkgZmFjdG9yeTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFZhbGlkYXRvciBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gZmFjdG9yeS5nZXRWYWxpZGF0b3IoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZhY3RvcnkgcHJvdmlkaW5nIGNvbmZpZ3VyZWQge0BsaW5rIFZhbGlkYXRvcn0gaW5zdGFuY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ29uZmlndXJlZFZhbGlkYXRvclByb3ZpZGVyIGltcGxlbWVudHMgU3VwcGxpZXI8Q29uZmlndXJlZFZhbGlkYXRvcj4geworCisgICAgICAgIEBJbmplY3QKKyAgICAgICAgcHJpdmF0ZSBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXI7CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBwcml2YXRlIENvbmZpZ3VyYXRpb24gdmFsaWRhdGlvbkNvbmZpZzsKKyAgICAgICAgQEluamVjdAorICAgICAgICBwcml2YXRlIFZhbGlkYXRvckZhY3RvcnkgZmFjdG9yeTsKKworICAgICAgICBAQ29udGV4dAorICAgICAgICBwcml2YXRlIGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbiBqYXhSc0NvbmZpZzsKKyAgICAgICAgQENvbnRleHQKKyAgICAgICAgcHJpdmF0ZSBQcm92aWRlcnMgcHJvdmlkZXJzOworICAgICAgICBAQ29udGV4dAorICAgICAgICBwcml2YXRlIFJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHQ7CisKKyAgICAgICAgcHJpdmF0ZSBDb25maWd1cmVkVmFsaWRhdG9yIGRlZmF1bHRWYWxpZGF0b3I7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBXZWFrSGFzaE1hcDxDb250ZXh0UmVzb2x2ZXI8VmFsaWRhdGlvbkNvbmZpZz4sIENvbmZpZ3VyZWRWYWxpZGF0b3I+IHZhbGlkYXRvckNhY2hlID0KKyAgICAgICAgICAgICAgICBuZXcgV2Vha0hhc2hNYXA8PigpOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ29uZmlndXJlZFZhbGlkYXRvciBnZXQoKSB7CisKKyAgICAgICAgICAgIC8vIEN1c3RvbSBDb25maWd1cmF0aW9uLgorICAgICAgICAgICAgZmluYWwgQ29udGV4dFJlc29sdmVyPFZhbGlkYXRpb25Db25maWc+IGNvbnRleHRSZXNvbHZlciA9CisgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVycy5nZXRDb250ZXh0UmVzb2x2ZXIoVmFsaWRhdGlvbkNvbmZpZy5jbGFzcywgTWVkaWFUeXBlLldJTERDQVJEX1RZUEUpOworCisgICAgICAgICAgICBpZiAoY29udGV4dFJlc29sdmVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RGVmYXVsdFZhbGlkYXRvcigpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoIXZhbGlkYXRvckNhY2hlLmNvbnRhaW5zS2V5KGNvbnRleHRSZXNvbHZlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgVmFsaWRhdGVPbkV4ZWN1dGlvbkhhbmRsZXIgdmFsaWRhdGVPbkV4ZWN1dGlvbkhhbmRsZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBWYWxpZGF0ZU9uRXhlY3V0aW9uSGFuZGxlcih2YWxpZGF0aW9uQ29uZmlnLCAhaXNWYWxpZGF0ZU9uRXhlY3V0YWJsZU92ZXJyaWRlQ2hlY2tEaXNhYmxlZCgpKTsKKworICAgICAgICAgICAgICAgICAgICBmaW5hbCBWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQgPSBnZXREZWZhdWx0VmFsaWRhdG9yQ29udGV4dCh2YWxpZGF0ZU9uRXhlY3V0aW9uSGFuZGxlcik7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFZhbGlkYXRpb25Db25maWcgY29uZmlnID0gY29udGV4dFJlc29sdmVyLmdldENvbnRleHQoVmFsaWRhdGlvbkNvbmZpZy5jbGFzcyk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBNZXNzYWdlSW50ZXJwb2xhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmdldE1lc3NhZ2VJbnRlcnBvbGF0b3IoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5tZXNzYWdlSW50ZXJwb2xhdG9yKGNvbmZpZy5nZXRNZXNzYWdlSW50ZXJwb2xhdG9yKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUcmF2ZXJzYWJsZVJlc29sdmVyCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmdldFRyYXZlcnNhYmxlUmVzb2x2ZXIoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC50cmF2ZXJzYWJsZVJlc29sdmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VHJhdmVyc2FibGVSZXNvbHZlcihjb25maWcuZ2V0VHJhdmVyc2FibGVSZXNvbHZlcigpLCB2YWxpZGF0ZU9uRXhlY3V0aW9uSGFuZGxlcikpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5nZXRDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KGNvbmZpZy5nZXRDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGFyYW1ldGVyTmFtZVByb3ZpZGVyCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmdldFBhcmFtZXRlck5hbWVQcm92aWRlcigpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnBhcmFtZXRlck5hbWVQcm92aWRlcihjb25maWcuZ2V0UGFyYW1ldGVyTmFtZVByb3ZpZGVyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yQ2FjaGUucHV0KGNvbnRleHRSZXNvbHZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdENvbmZpZ3VyZWRWYWxpZGF0b3IoY29udGV4dC5nZXRWYWxpZGF0b3IoKSwgdGhpcy52YWxpZGF0aW9uQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVPbkV4ZWN1dGlvbkhhbmRsZXIsIGdldFZhbGlkYXRpb25JbnRlcmNlcHRvcnMoKSkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiB2YWxpZGF0b3JDYWNoZS5nZXQoY29udGV4dFJlc29sdmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgSXRlcmFibGU8VmFsaWRhdGlvbkludGVyY2VwdG9yPiBnZXRWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCkgeworICAgICAgICAgICAgZmluYWwgSXRlcmFibGU8UmFua2VkUHJvdmlkZXI8VmFsaWRhdGlvbkludGVyY2VwdG9yPj4gdmFsaWRhdGlvbkludGVyY2VwdG9ySXRlcmFibGUgPQorICAgICAgICAgICAgICAgICAgICBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuUHJvdmlkZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEFsbFJhbmtlZFByb3ZpZGVycyhpbmplY3Rpb25NYW5hZ2VyLCBWYWxpZGF0aW9uSW50ZXJjZXB0b3IuY2xhc3MpOworICAgICAgICAgICAgcmV0dXJuIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5Qcm92aWRlcnMuc29ydFJhbmtlZFByb3ZpZGVycygKKyAgICAgICAgICAgICAgICAgICAgbmV3IFJhbmtlZENvbXBhcmF0b3I8VmFsaWRhdGlvbkludGVyY2VwdG9yPigpLCB2YWxpZGF0aW9uSW50ZXJjZXB0b3JJdGVyYWJsZSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIGRlZmF1bHQgdmFsaWRhdG9yLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIGRlZmF1bHQgdmFsaWRhdG9yLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBDb25maWd1cmVkVmFsaWRhdG9yIGdldERlZmF1bHRWYWxpZGF0b3IoKSB7CisgICAgICAgICAgICBpZiAoZGVmYXVsdFZhbGlkYXRvciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgVmFsaWRhdGVPbkV4ZWN1dGlvbkhhbmRsZXIgdmFsaWRhdGVPbkV4ZWN1dGlvbkhhbmRsZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFZhbGlkYXRlT25FeGVjdXRpb25IYW5kbGVyKHZhbGlkYXRpb25Db25maWcsICFpc1ZhbGlkYXRlT25FeGVjdXRhYmxlT3ZlcnJpZGVDaGVja0Rpc2FibGVkKCkpOworICAgICAgICAgICAgICAgIGZpbmFsIFZhbGlkYXRvciB2YWxpZGF0b3IgPSBnZXREZWZhdWx0VmFsaWRhdG9yQ29udGV4dCh2YWxpZGF0ZU9uRXhlY3V0aW9uSGFuZGxlcikuZ2V0VmFsaWRhdG9yKCk7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0VmFsaWRhdG9yID0gbmV3IERlZmF1bHRDb25maWd1cmVkVmFsaWRhdG9yKHZhbGlkYXRvciwgdmFsaWRhdGlvbkNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRlT25FeGVjdXRpb25IYW5kbGVyLCBnZXRWYWxpZGF0aW9uSW50ZXJjZXB0b3JzKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWxpZGF0b3I7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIGRlZmF1bHQge0BsaW5rIFZhbGlkYXRvckNvbnRleHQgdmFsaWRhdG9yIGNvbnRleHR9IGFibGUgdG8gaW5qZWN0IEpBWC1SUyByZXNvdXJjZXMvcHJvdmlkZXJzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gaGFuZGxlciBoYW5kbGVyIHRvIGNyZWF0ZSB0cmF2ZXJzYWJsZSByZXNvbHZlciBmb3IuCisgICAgICAgICAqIEByZXR1cm4gZGVmYXVsdCB2YWxpZGF0b3IgY29udGV4dC4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgVmFsaWRhdG9yQ29udGV4dCBnZXREZWZhdWx0VmFsaWRhdG9yQ29udGV4dChmaW5hbCBWYWxpZGF0ZU9uRXhlY3V0aW9uSGFuZGxlciBoYW5kbGVyKSB7CisgICAgICAgICAgICBmaW5hbCBWYWxpZGF0b3JDb250ZXh0IGNvbnRleHQgPSBmYWN0b3J5LnVzaW5nQ29udGV4dCgpOworCisgICAgICAgICAgICAvLyBEZWZhdWx0IENvbmZpZ3VyYXRpb24uCisgICAgICAgICAgICBjb250ZXh0LmNvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5KHJlc291cmNlQ29udGV4dC5nZXRSZXNvdXJjZShJbmplY3RpbmdDb25zdHJhaW50VmFsaWRhdG9yRmFjdG9yeS5jbGFzcykpOworCisgICAgICAgICAgICAvLyBUcmF2ZXJzYWJsZSBSZXNvbHZlci4KKyAgICAgICAgICAgIGNvbnRleHQudHJhdmVyc2FibGVSZXNvbHZlcihnZXRUcmF2ZXJzYWJsZVJlc29sdmVyKGZhY3RvcnkuZ2V0VHJhdmVyc2FibGVSZXNvbHZlcigpLCBoYW5kbGVyKSk7CisKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSB0cmF2ZXJzYWJsZSByZXNvbHZlciBhYmxlIHRvIHByb2Nlc3Mge0BsaW5rIGphdmF4LnZhbGlkYXRpb24uZXhlY3V0YWJsZS5WYWxpZGF0ZU9uRXhlY3V0aW9ufSBhbm5vdGF0aW9uIG9uCisgICAgICAgICAqIGJlYW5zLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZGVsZWdhdGUgcmVzb2x2ZXIgdG8gYmUgd3JhcHBlZCBpbnRvIHRoZSBjdXN0b20gdHJhdmVyc2FibGUgcmVzb2x2ZXIuCisgICAgICAgICAqIEBwYXJhbSBoYW5kbGVyICBoYW5kbGVyIHRvIGNyZWF0ZSB0cmF2ZXJzYWJsZSByZXNvbHZlciBmb3IuCisgICAgICAgICAqIEByZXR1cm4gY3VzdG9tIHRyYXZlcnNhYmxlIHJlc29sdmVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBWYWxpZGF0ZU9uRXhlY3V0aW9uVHJhdmVyc2FibGVSZXNvbHZlciBnZXRUcmF2ZXJzYWJsZVJlc29sdmVyKFRyYXZlcnNhYmxlUmVzb2x2ZXIgZGVsZWdhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBWYWxpZGF0ZU9uRXhlY3V0aW9uSGFuZGxlciBoYW5kbGVyKSB7CisgICAgICAgICAgICBpZiAoZGVsZWdhdGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGRlbGVnYXRlID0gdmFsaWRhdGlvbkNvbmZpZy5nZXREZWZhdWx0VHJhdmVyc2FibGVSZXNvbHZlcigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBib29sZWFuIHZhbGlkYXRpb25FbmFibGVkID0gdmFsaWRhdGlvbkNvbmZpZy5nZXRCb290c3RyYXBDb25maWd1cmF0aW9uKCkuaXNFeGVjdXRhYmxlVmFsaWRhdGlvbkVuYWJsZWQoKTsKKyAgICAgICAgICAgIGZpbmFsIFZhbGlkYXRlT25FeGVjdXRpb25UcmF2ZXJzYWJsZVJlc29sdmVyIHRyYXZlcnNhYmxlUmVzb2x2ZXIgPSBuZXcKKyAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGVPbkV4ZWN1dGlvblRyYXZlcnNhYmxlUmVzb2x2ZXIoZGVsZWdhdGUsIGhhbmRsZXIsIHZhbGlkYXRpb25FbmFibGVkKTsKKworICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlQ29udGV4dC5pbml0UmVzb3VyY2UodHJhdmVyc2FibGVSZXNvbHZlcik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNWYWxpZGF0ZU9uRXhlY3V0YWJsZU92ZXJyaWRlQ2hlY2tEaXNhYmxlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBQcm9wZXJ0aWVzSGVscGVyLmlzUHJvcGVydHkoCisgICAgICAgICAgICAgICAgICAgIGpheFJzQ29uZmlnLmdldFByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuQlZfRElTQUJMRV9WQUxJREFURV9PTl9FWEVDVVRBQkxFX09WRVJSSURFX0NIRUNLKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdGlvbkVycm9yTWVzc2FnZUJvZHlXcml0ZXIuamF2YSBiL2V4dC9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0aW9uRXJyb3JNZXNzYWdlQm9keVdyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzODMyNDYKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdGlvbkVycm9yTWVzc2FnZUJvZHlXcml0ZXIuamF2YQpAQCAtMCwwICsxLDE0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIudmFsaWRhdGlvbi5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5QYXJhbWV0ZXJpemVkVHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKKworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5NZXNzYWdlVXRpbHM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnZhbGlkYXRpb24uVmFsaWRhdGlvbkVycm9yOworCisvKioKKyAqIHtAbGluayBNZXNzYWdlQm9keVdyaXRlcn0gcHJvdmlkaW5nIHN1cHBvcnQgZm9yIChjb2xsZWN0aW9ucyBvZikge0BsaW5rIFZhbGlkYXRpb25FcnJvcn0KKyAqIHRoYXQgaXMgYWJsZSB0byBvdXRwdXQgaW5zdGFuY2VzIHRvIHtAY29kZSB0ZXh0L3BsYWlufS97QGNvZGUgdGV4dC9odG1sfS4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworZmluYWwgY2xhc3MgVmFsaWRhdGlvbkVycm9yTWVzc2FnZUJvZHlXcml0ZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVdyaXRlcjxPYmplY3Q+IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKGZpbmFsIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICByZXR1cm4gaXNTdXBwb3J0ZWRNZWRpYVR5cGUobWVkaWFUeXBlKSAmJiBpc1N1cHBvcnRlZFR5cGUodHlwZSwgZ2VuZXJpY1R5cGUpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc1N1cHBvcnRlZFR5cGUoZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSkgeworICAgICAgICBpZiAoVmFsaWRhdGlvbkVycm9yLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKENvbGxlY3Rpb24uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0eXBlKSkgeworICAgICAgICAgICAgaWYgKGdlbmVyaWNUeXBlIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFR5cGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVmFsaWRhdGlvbkVycm9yLmNsYXNzCisgICAgICAgICAgICAgICAgICAgICAgICAuaXNBc3NpZ25hYmxlRnJvbSgoQ2xhc3MpICgoUGFyYW1ldGVyaXplZFR5cGUpIGdlbmVyaWNUeXBlKS5nZXRBY3R1YWxUeXBlQXJndW1lbnRzKClbMF0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNTdXBwb3J0ZWRNZWRpYVR5cGUoZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICByZXR1cm4gTWVkaWFUeXBlLlRFWFRfSFRNTF9UWVBFLmVxdWFscyhtZWRpYVR5cGUpIHx8IE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUuZXF1YWxzKG1lZGlhVHlwZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShmaW5hbCBPYmplY3QgdmFsaWRhdGlvbkVycm9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGVUbyhmaW5hbCBPYmplY3QgZW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENvbGxlY3Rpb248VmFsaWRhdGlvbkVycm9yPiBlcnJvcnM7CisKKyAgICAgICAgaWYgKGVudGl0eSBpbnN0YW5jZW9mIFZhbGlkYXRpb25FcnJvcikgeworICAgICAgICAgICAgZXJyb3JzID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uKChWYWxpZGF0aW9uRXJyb3IpIGVudGl0eSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvL25vaW5zcGVjdGlvbiB1bmNoZWNrZWQKKyAgICAgICAgICAgIGVycm9ycyA9IChDb2xsZWN0aW9uPFZhbGlkYXRpb25FcnJvcj4pIGVudGl0eTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNQbGFpbiA9IE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUuZ2V0U3VidHlwZSgpLmVxdWFscyhtZWRpYVR5cGUuZ2V0U3VidHlwZSgpKTsKKworICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisgICAgICAgIC8vIFJvb3QgPGRpdj4KKyAgICAgICAgaWYgKCFpc1BsYWluKSB7CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiPGRpdiBjbGFzcz1cInZhbGlkYXRpb24tZXJyb3JzXCI+Iik7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGZpbmFsIFZhbGlkYXRpb25FcnJvciBlcnJvciA6IGVycm9ycykgeworICAgICAgICAgICAgaWYgKCFpc1BsYWluKSB7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIjxkaXYgY2xhc3M9XCJ2YWxpZGF0aW9uLWVycm9yXCI+Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE1lc3NhZ2UuCisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChpc1BsYWluID8gZXJyb3IuZ2V0TWVzc2FnZSgpIDogIjxzcGFuIGNsYXNzPVwibWVzc2FnZVwiPiIgKyBlcnJvci5nZXRNZXNzYWdlKCkgKyAiPC9zcGFuPiIpOworICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJyAnKTsKKworICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJygnKTsKKworICAgICAgICAgICAgLy8gUGF0aC4KKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGlzUGxhaW4gPyAicGF0aCA9ICIgOiAoIjxzcGFuIGNsYXNzPVwicGF0aFwiPjxzdHJvbmc+cGF0aDwvc3Ryb25nPiA9ICIpKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGlzUGxhaW4gPyBlcnJvci5nZXRQYXRoKCkgOiAoZXJyb3IuZ2V0UGF0aCgpICsgIjwvc3Bhbj4iKSk7CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnLCcpOworICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJyAnKTsKKworICAgICAgICAgICAgLy8gSW52YWxpZCB2YWx1ZS4KKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGlzUGxhaW4gPyAiaW52YWxpZFZhbHVlID0gIiA6ICgiPHNwYW4gY2xhc3M9XCJpbnZhbGlkLXZhbHVlXCI+PHN0cm9uZz5pbnZhbGlkVmFsdWU8L3N0cm9uZz4gPSAiKSk7CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChpc1BsYWluID8gZXJyb3IuZ2V0SW52YWxpZFZhbHVlKCkgOiAoZXJyb3IuZ2V0SW52YWxpZFZhbHVlKCkgKyAiPC9zcGFuPiIpKTsKKworICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJyknKTsKKworICAgICAgICAgICAgaWYgKCFpc1BsYWluKSB7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIjwvZGl2PiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnXG4nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJvb3QgPGRpdj4KKyAgICAgICAgaWYgKCFpc1BsYWluKSB7CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiPC9kaXY+Iik7CisgICAgICAgIH0KKworICAgICAgICBlbnRpdHlTdHJlYW0ud3JpdGUoYnVpbGRlci50b1N0cmluZygpLmdldEJ5dGVzKE1lc3NhZ2VVdGlscy5nZXRDaGFyc2V0KG1lZGlhVHlwZSkpKTsKKyAgICAgICAgZW50aXR5U3RyZWFtLmZsdXNoKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRpb25FeGNlcHRpb25NYXBwZXIuamF2YSBiL2V4dC9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0aW9uRXhjZXB0aW9uTWFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU2OTYwNwotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0aW9uRXhjZXB0aW9uTWFwcGVyLmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnZhbGlkYXRpb24uaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY0VudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkdlbmVyaWNUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVxdWVzdDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVmFyaWFudDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuRXhjZXB0aW9uTWFwcGVyOworCitpbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIudmFsaWRhdGlvbi5WYWxpZGF0aW9uRXJyb3I7CisKKy8qKgorICoge0BsaW5rIEV4Y2VwdGlvbk1hcHBlcn0gZm9yIHtAbGluayBWYWxpZGF0aW9uRXhjZXB0aW9ufS4KKyAqIDxwLz4KKyAqIElmIHtAdmFsdWUgU2VydmVyUHJvcGVydGllcyNCVl9TRU5EX0VSUk9SX0lOX1JFU1BPTlNFfSBwcm9wZXJ0eSBpcyBlbmFibGVkIHRoZW4gYSBsaXN0IG9mIHtAbGluayBWYWxpZGF0aW9uRXJyb3J9CisgKiBpbnN0YW5jZXMgaXMgc2VudCBpbiB7QGxpbmsgUmVzcG9uc2V9IGFzIHdlbGwgKGluIGFkZGl0aW9uIHRvIEhUVFAgNDAwLzUwMCBzdGF0dXMgY29kZSkuIFN1cHBvcnRlZCBtZWRpYSB0eXBlcyBhcmU6CisgKiB7QGNvZGUgYXBwbGljYXRpb24vanNvbn0ve0Bjb2RlIGFwcGxpY2F0aW9uL3htbH0gKGluIGFwcHJvcHJpYXRlIHByb3ZpZGVyIGlzIHJlZ2lzdGVyZWQgb24gc2VydmVyKSBvcgorICoge0Bjb2RlIHRleHQvaHRtbH0ve0Bjb2RlIHRleHQvcGxhaW59ICh2aWEgY3VzdG9tIHtAbGluayBWYWxpZGF0aW9uRXJyb3JNZXNzYWdlQm9keVdyaXRlcn0pLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgZmluYWwgY2xhc3MgVmFsaWRhdGlvbkV4Y2VwdGlvbk1hcHBlciBpbXBsZW1lbnRzIEV4Y2VwdGlvbk1hcHBlcjxWYWxpZGF0aW9uRXhjZXB0aW9uPiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihWYWxpZGF0aW9uRXhjZXB0aW9uTWFwcGVyLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBAQ29udGV4dAorICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbiBjb25maWc7CisgICAgQENvbnRleHQKKyAgICBwcml2YXRlIFByb3ZpZGVyPFJlcXVlc3Q+IHJlcXVlc3Q7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzcG9uc2UgdG9SZXNwb25zZShmaW5hbCBWYWxpZGF0aW9uRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICBpZiAoZXhjZXB0aW9uIGluc3RhbmNlb2YgQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbikgeworICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5GSU5FUiwgTG9jYWxpemF0aW9uTWVzc2FnZXMuQ09OU1RSQUlOVF9WSU9MQVRJT05TX0VOQ09VTlRFUkVEKCksIGV4Y2VwdGlvbik7CisKKyAgICAgICAgICAgIGZpbmFsIENvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24gY3ZlID0gKENvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24pIGV4Y2VwdGlvbjsKKyAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlLlJlc3BvbnNlQnVpbGRlciByZXNwb25zZSA9IFJlc3BvbnNlLnN0YXR1cyhWYWxpZGF0aW9uSGVscGVyLmdldFJlc3BvbnNlU3RhdHVzKGN2ZSkpOworCisgICAgICAgICAgICAvLyBFbnRpdHkuCisgICAgICAgICAgICBmaW5hbCBPYmplY3QgcHJvcGVydHkgPSBjb25maWcuZ2V0UHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5CVl9TRU5EX0VSUk9SX0lOX1JFU1BPTlNFKTsKKyAgICAgICAgICAgIGlmIChwcm9wZXJ0eSAhPSBudWxsICYmIEJvb2xlYW4udmFsdWVPZihwcm9wZXJ0eS50b1N0cmluZygpKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8VmFyaWFudD4gdmFyaWFudHMgPSBWYXJpYW50Lm1lZGlhVHlwZXMoCisgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlLlRFWFRfSFRNTF9UWVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTF9UWVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSkuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBWYXJpYW50IHZhcmlhbnQgPSByZXF1ZXN0LmdldCgpLnNlbGVjdFZhcmlhbnQodmFyaWFudHMpOworICAgICAgICAgICAgICAgIGlmICh2YXJpYW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UudHlwZSh2YXJpYW50LmdldE1lZGlhVHlwZSgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgbWVkaWEgdHlwZSB3aGljaCB3aWxsIGJlIHVzZWQgb25seSB3aGVuIG5vbmUgbWVkaWEgdHlwZSBmcm9tIHtAdmFsdWUgdmFyaWFudHN9IGlzIGluIGFjY2VwdAorICAgICAgICAgICAgICAgICAgICAvLyBoZWFkZXIgb2Ygb3JpZ2luYWwgcmVxdWVzdC4KKyAgICAgICAgICAgICAgICAgICAgLy8gY291bGQgYmUgc2V0dGFibGUgYnkgY29uZmlndXJhdGlvbiBwcm9wZXJ0eS4KKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UudHlwZShNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVzcG9uc2UuZW50aXR5KAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEdlbmVyaWNFbnRpdHk8PigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGlvbkhlbHBlci5jb25zdHJhaW50VmlvbGF0aW9uVG9WYWxpZGF0aW9uRXJyb3JzKGN2ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBHZW5lcmljVHlwZTxMaXN0PFZhbGlkYXRpb25FcnJvcj4+KCkge30uZ2V0VHlwZSgpCisgICAgICAgICAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmJ1aWxkKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLldBUk5JTkcsIExvY2FsaXphdGlvbk1lc3NhZ2VzLlZBTElEQVRJT05fRVhDRVBUSU9OX1JBSVNFRCgpLCBleGNlcHRpb24pOworCisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc2VydmVyRXJyb3IoKS5lbnRpdHkoZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSkuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvdmFsaWRhdGlvbi9pbnRlcm5hbC9WYWxpZGF0aW9uSGVscGVyLmphdmEgYi9leHQvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdGlvbkhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlOTJkZTkKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdGlvbkhlbHBlci5qYXZhCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci52YWxpZGF0aW9uLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmlvbGF0aW9uOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLkVsZW1lbnRLaW5kOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnZhbGlkYXRpb24uVmFsaWRhdGlvbkVycm9yOworCisvKioKKyAqIFV0aWxpdHkgbWV0aG9kcyBmb3IgQmVhbiBWYWxpZGF0aW9uIHByb2Nlc3NpbmcuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKiBAc2luY2UgMi4zCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBWYWxpZGF0aW9uSGVscGVyIHsKKworICAgIC8qKgorICAgICAqIEV4dHJhY3Qge0BsaW5rIENvbnN0cmFpbnRWaW9sYXRpb24gY29uc3RyYWludCB2aW9sYXRpb25zfSBmcm9tIGdpdmVuIGV4Y2VwdGlvbiBhbmQgdHJhbnNmb3JtIHRoZW0gaW50byBhIGxpc3Qgb2YKKyAgICAgKiB7QGxpbmsgVmFsaWRhdGlvbkVycm9yIHZhbGlkYXRpb24gZXJyb3JzfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2aW9sYXRpb24gZXhjZXB0aW9uIGNvbnRhaW5pbmcgY29uc3RyYWludCB2aW9sYXRpb25zLgorICAgICAqIEByZXR1cm4gbGlzdCBvZiB2YWxpZGF0aW9uIGVycm9ycyAobm90IHtAY29kZSBudWxsfSkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0PFZhbGlkYXRpb25FcnJvcj4gY29uc3RyYWludFZpb2xhdGlvblRvVmFsaWRhdGlvbkVycm9ycyhmaW5hbCBDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uIHZpb2xhdGlvbikgeworICAgICAgICByZXR1cm4gdmlvbGF0aW9uLmdldENvbnN0cmFpbnRWaW9sYXRpb25zKCkuc3RyZWFtKCkubWFwKHZpb2xhdGlvbjEgLT4gbmV3IFZhbGlkYXRpb25FcnJvcigKKyAgICAgICAgICAgICAgICB2aW9sYXRpb24xLmdldE1lc3NhZ2UoKSwKKyAgICAgICAgICAgICAgICB2aW9sYXRpb24xLmdldE1lc3NhZ2VUZW1wbGF0ZSgpLAorICAgICAgICAgICAgICAgIGdldFZpb2xhdGlvblBhdGgodmlvbGF0aW9uMSksCisgICAgICAgICAgICAgICAgZ2V0VmlvbGF0aW9uSW52YWxpZFZhbHVlKHZpb2xhdGlvbjEuZ2V0SW52YWxpZFZhbHVlKCkpCisgICAgICAgICkpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvdmlkZSBhIHN0cmluZyB2YWx1ZSBvZiAoaW52YWxpZCkgdmFsdWUgdGhhdCBjYXVzZWQgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnZhbGlkVmFsdWUgaW52YWxpZCB2YWx1ZSBjYXVzaW5nIEJWIGV4Y2VwdGlvbi4KKyAgICAgKiBAcmV0dXJuIHN0cmluZyB2YWx1ZSBvZiBnaXZlbiBvYmplY3Qgb3Ige0Bjb2RlIG51bGx9LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRWaW9sYXRpb25JbnZhbGlkVmFsdWUoZmluYWwgT2JqZWN0IGludmFsaWRWYWx1ZSkgeworICAgICAgICBpZiAoaW52YWxpZFZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGludmFsaWRWYWx1ZS5nZXRDbGFzcygpLmlzQXJyYXkoKSkgeworICAgICAgICAgICAgaWYgKGludmFsaWRWYWx1ZSBpbnN0YW5jZW9mIE9iamVjdFtdKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5cy50b1N0cmluZygoT2JqZWN0W10pIGludmFsaWRWYWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGludmFsaWRWYWx1ZSBpbnN0YW5jZW9mIGJvb2xlYW5bXSkgeworICAgICAgICAgICAgICAgIHJldHVybiBBcnJheXMudG9TdHJpbmcoKGJvb2xlYW5bXSkgaW52YWxpZFZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaW52YWxpZFZhbHVlIGluc3RhbmNlb2YgYnl0ZVtdKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5cy50b1N0cmluZygoYnl0ZVtdKSBpbnZhbGlkVmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChpbnZhbGlkVmFsdWUgaW5zdGFuY2VvZiBjaGFyW10pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXlzLnRvU3RyaW5nKChjaGFyW10pIGludmFsaWRWYWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGludmFsaWRWYWx1ZSBpbnN0YW5jZW9mIGRvdWJsZVtdKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5cy50b1N0cmluZygoZG91YmxlW10pIGludmFsaWRWYWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGludmFsaWRWYWx1ZSBpbnN0YW5jZW9mIGZsb2F0W10pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXlzLnRvU3RyaW5nKChmbG9hdFtdKSBpbnZhbGlkVmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChpbnZhbGlkVmFsdWUgaW5zdGFuY2VvZiBpbnRbXSkgeworICAgICAgICAgICAgICAgIHJldHVybiBBcnJheXMudG9TdHJpbmcoKGludFtdKSBpbnZhbGlkVmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChpbnZhbGlkVmFsdWUgaW5zdGFuY2VvZiBsb25nW10pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXlzLnRvU3RyaW5nKChsb25nW10pIGludmFsaWRWYWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGludmFsaWRWYWx1ZSBpbnN0YW5jZW9mIHNob3J0W10pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXlzLnRvU3RyaW5nKChzaG9ydFtdKSBpbnZhbGlkVmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGludmFsaWRWYWx1ZS50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIHBhdGggdG8gYSBmaWVsZCBjYXVzaW5nIGNvbnN0cmFpbnQgdmlvbGF0aW9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2aW9sYXRpb24gY29uc3RyYWludCB2aW9sYXRpb24uCisgICAgICogQHJldHVybiBwYXRoIHRvIGEgcHJvcGVydHkgdGhhdCBjYXVzZWQgY29uc3RyYWludCB2aW9sYXRpb25zLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRWaW9sYXRpb25QYXRoKGZpbmFsIENvbnN0cmFpbnRWaW9sYXRpb24gdmlvbGF0aW9uKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyByb290QmVhbk5hbWUgPSB2aW9sYXRpb24uZ2V0Um9vdEJlYW4oKS5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHByb3BlcnR5UGF0aCA9IHZpb2xhdGlvbi5nZXRQcm9wZXJ0eVBhdGgoKS50b1N0cmluZygpOworCisgICAgICAgIHJldHVybiByb290QmVhbk5hbWUgKyAoISIiLmVxdWFscyhwcm9wZXJ0eVBhdGgpID8gJy4nICsgcHJvcGVydHlQYXRoIDogIiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZSB0aGUgcmVzcG9uc2Ugc3RhdHVzICg0MDAgb3IgNTAwKSBmcm9tIHRoZSBnaXZlbiBCViBleGNlcHRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmlvbGF0aW9uIEJWIGV4Y2VwdGlvbi4KKyAgICAgKiBAcmV0dXJuIHJlc3BvbnNlIHN0YXR1cyAoNDAwIG9yIDUwMCkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBSZXNwb25zZS5TdGF0dXMgZ2V0UmVzcG9uc2VTdGF0dXMoZmluYWwgQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbiB2aW9sYXRpb24pIHsKKyAgICAgICAgZmluYWwgSXRlcmF0b3I8Q29uc3RyYWludFZpb2xhdGlvbjw/Pj4gaXRlcmF0b3IgPSB2aW9sYXRpb24uZ2V0Q29uc3RyYWludFZpb2xhdGlvbnMoKS5pdGVyYXRvcigpOworCisgICAgICAgIGlmIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIGZvciAoZmluYWwgUGF0aC5Ob2RlIG5vZGUgOiBpdGVyYXRvci5uZXh0KCkuZ2V0UHJvcGVydHlQYXRoKCkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBFbGVtZW50S2luZCBraW5kID0gbm9kZS5nZXRLaW5kKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoRWxlbWVudEtpbmQuUkVUVVJOX1ZBTFVFLmVxdWFscyhraW5kKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2UuU3RhdHVzLklOVEVSTkFMX1NFUlZFUl9FUlJPUjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gUmVzcG9uc2UuU3RhdHVzLkJBRF9SRVFVRVNUOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByZXZlbnQgaW5zdGFudGlhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFZhbGlkYXRpb25IZWxwZXIoKSB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRpb25JbnRlcmNlcHRvckV4ZWN1dG9yLmphdmEgYi9leHQvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3ZhbGlkYXRpb24vaW50ZXJuYWwvVmFsaWRhdGlvbkludGVyY2VwdG9yRXhlY3V0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjBmNzI4Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci92YWxpZGF0aW9uL2ludGVybmFsL1ZhbGlkYXRpb25JbnRlcmNlcHRvckV4ZWN1dG9yLmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIudmFsaWRhdGlvbi5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKKworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdGlvbkV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5JbnZvY2FibGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5WYWxpZGF0aW9uSW50ZXJjZXB0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5WYWxpZGF0aW9uSW50ZXJjZXB0b3JDb250ZXh0OworCisvKioKKyAqIFZhbGlkYXRpb24gZXhlY3V0b3IgZm9yIHJlc291cmNlIG1ldGhvZCB2YWxpZGF0aW9uIHByb2Nlc3NpbmcuIEl0IGlzIGludGVuZGVkIGZvciBhIG9uZS1vZmYgdXNhZ2UKKyAqIHdoZW4gdGhlIGV4ZWN1dG9yIGluc3RhbmNlIHNlcnZlcyBhbHNvIGFzIGEge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuVmFsaWRhdGlvbkludGVyY2VwdG9yQ29udGV4dH0uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworZmluYWwgY2xhc3MgVmFsaWRhdGlvbkludGVyY2VwdG9yRXhlY3V0b3IgaW1wbGVtZW50cyBWYWxpZGF0aW9uSW50ZXJjZXB0b3JDb250ZXh0IHsKKworICAgIHByaXZhdGUgT2JqZWN0IHJlc291cmNlOworICAgIHByaXZhdGUgT2JqZWN0W10gYXJnczsKKyAgICBwcml2YXRlIGZpbmFsIEludm9jYWJsZSBpbnZvY2FibGU7CisKKyAgICBwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPFZhbGlkYXRpb25JbnRlcmNlcHRvcj4gaXRlcmF0b3I7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBvbmUtb2ZmIHZhbGlkYXRpb24gZXhlY3V0b3IgZm9yIGdpdmVuIHJlc291cmNlLCBpbnZvY2FibGUgYW5kIHBhcmFtZXRlciBhbmQgZ2l2ZW4KKyAgICAgKiBpbnRlcmNlcHRvcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgIGFjdHVhbCByZXNvdXJjZSBpbnN0YW5jZSB0byBnZXQgdmFsaWRhdGVkCisgICAgICogQHBhcmFtIGludm9jYWJsZSByZXNvdXJjZSBtZXRob2QKKyAgICAgKiBAcGFyYW0gYXJncyAgICAgIGFjdHVhbCByZXNvdXJjZSBtZXRob2QgcGFyYW1ldGVycworICAgICAqIEBwYXJhbSBpdGVyYXRvciAgdmFsaWRhdG9yIGludGVyY2VwdG9ycyB0byBiZSBpbnZvbHZlZAorICAgICAqLworICAgIHB1YmxpYyBWYWxpZGF0aW9uSW50ZXJjZXB0b3JFeGVjdXRvcigKKyAgICAgICAgICAgIGZpbmFsIE9iamVjdCByZXNvdXJjZSwKKyAgICAgICAgICAgIGZpbmFsIEludm9jYWJsZSBpbnZvY2FibGUsCisgICAgICAgICAgICBmaW5hbCBPYmplY3RbXSBhcmdzLAorICAgICAgICAgICAgZmluYWwgSXRlcmF0b3I8VmFsaWRhdGlvbkludGVyY2VwdG9yPiBpdGVyYXRvcikgeworCisgICAgICAgIHRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsKKyAgICAgICAgdGhpcy5pbnZvY2FibGUgPSBpbnZvY2FibGU7CisgICAgICAgIHRoaXMuYXJncyA9IGFyZ3M7CisgICAgICAgIHRoaXMuaXRlcmF0b3IgPSBpdGVyYXRvcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IGdldFJlc291cmNlKCkgeworICAgICAgICByZXR1cm4gcmVzb3VyY2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0UmVzb3VyY2UoZmluYWwgT2JqZWN0IHJlc291cmNlKSB7CisgICAgICAgIHRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSW52b2NhYmxlIGdldEludm9jYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIGludm9jYWJsZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0W10gZ2V0QXJncygpIHsKKyAgICAgICAgcmV0dXJuIGFyZ3M7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0QXJncyhmaW5hbCBPYmplY3RbXSBhcmdzKSB7CisgICAgICAgIHRoaXMuYXJncyA9IGFyZ3M7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcHJvY2VlZCgpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgVmFsaWRhdGlvbkludGVyY2VwdG9yIHZhbGlkYXRpb25JbnRlcmNlcHRvciA9IGl0ZXJhdG9yLm5leHQoKTsKKyAgICAgICAgdmFsaWRhdGlvbkludGVyY2VwdG9yLm9uVmFsaWRhdGUodGhpcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci92YWxpZGF0aW9uL2ludGVybmFsL3BhY2thZ2UtaW5mby5qYXZhIGIvZXh0L2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci92YWxpZGF0aW9uL2ludGVybmFsL3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNzg0NzgKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3ZhbGlkYXRpb24vaW50ZXJuYWwvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoqCisgKiBKZXJzZXkgc2VydmVyLXNpZGUgYmVhbiB2YWxpZGF0aW9uIGludGVybmFsIGNsYXNzZXMuCisgKi8KK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnZhbGlkYXRpb24uaW50ZXJuYWw7CmRpZmYgLS1naXQgYS9leHQvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3ZhbGlkYXRpb24vcGFja2FnZS1pbmZvLmphdmEgYi9leHQvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3ZhbGlkYXRpb24vcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYzMWY5MAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvdmFsaWRhdGlvbi9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvKioKKyAqIEplcnNleSBzZXJ2ZXItc2lkZSBiZWFuIHZhbGlkYXRpb24gY2xhc3Nlcy4KKyAqLworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIudmFsaWRhdGlvbjsKZGlmZiAtLWdpdCBhL2V4dC9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnNwaS5Gb3JjZWRBdXRvRGlzY292ZXJhYmxlIGIvZXh0L2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuc3BpLkZvcmNlZEF1dG9EaXNjb3ZlcmFibGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFmYzBkOAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnNwaS5Gb3JjZWRBdXRvRGlzY292ZXJhYmxlCkBAIC0wLDAgKzEgQEAKK29yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci52YWxpZGF0aW9uLmludGVybmFsLlZhbGlkYXRpb25BdXRvRGlzY292ZXJhYmxlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXh0L2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3ZhbGlkYXRpb24vaW50ZXJuYWwvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMgYi9leHQvYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvdmFsaWRhdGlvbi9pbnRlcm5hbC9sb2NhbGl6YXRpb24ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzAxOGZhCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2JlYW4tdmFsaWRhdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3ZhbGlkYXRpb24vaW50ZXJuYWwvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyMSBAQAorIworIyBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisjIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyMKKyMgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorIyBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisjIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorIyB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisjCisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorIworCitjb25zdHJhaW50LnZpb2xhdGlvbnMuZW5jb3VudGVyZWQ9Rm9sbG93aW5nIENvbnN0cmFpbnRWaW9sYXRpb25zIGhhcyBiZWVuIGVuY291bnRlcmVkLgorIyB7MH0gLSBDbGFzcyNtZXRob2ROYW1lLCBpLmUuIGphdmEubGFuZy5TdHJpbmcjaW50ZXJuCitvdmVycmlkZS5jaGVjay5lcnJvcj1NdWx0aXBsZSBWYWxpZGF0ZU9uRXhlY3V0aW9uIGFubm90YXRpb24gZGVmaW5pdGlvbnMgYXJlIGhvc3RlZCBpbiB0aGUgaGllcmFyY2h5IG9mIHswfSBtZXRob2QuCit2YWxpZGF0aW9uLmV4Y2VwdGlvbi5yYWlzZWQ9VW5leHBlY3RlZCBCZWFuIFZhbGlkYXRpb24gcHJvYmxlbS4KK3ZhbGlkYXRpb24uZXhjZXB0aW9uLnByb3ZpZGVyPUZhaWxlZCB0byBjb25maWd1cmUgdGhlIGRlZmF1bHQgdmFsaWRhdGlvbiBwcm92aWRlci4KZGlmZiAtLWdpdCBhL2V4dC9jZGkvamVyc2V5LWNkaTF4LWJhbi1jdXN0b20taGsyLWJpbmRpbmcvcG9tLnhtbCBiL2V4dC9jZGkvamVyc2V5LWNkaTF4LWJhbi1jdXN0b20taGsyLWJpbmRpbmcvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Yjc1OThjCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2NkaS9qZXJzZXktY2RpMXgtYmFuLWN1c3RvbS1oazItYmluZGluZy9wb20ueG1sCkBAIC0wLDAgKzEsODYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmplcnNleS1jZGkxeC1iYW4tY3VzdG9tLWhrMi1iaW5kaW5nPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LWV4dC1jZGkxeC1iYW4tY3VzdG9tLWhrMi1iaW5kaW5nPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPkplcnNleSBDREkgaW50ZWdyYXRpb24gLSB0aGlzIG1vZHVsZSBkaXNhYmxlcyBjdXN0b20gSEsyIGJpbmRpbmdzPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jZGkxeDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbW1vbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmhhbWNyZXN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGFtY3Jlc3QtbGlicmFyeTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5idWlsZC1oZWxwZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZmVsaXg8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYnVuZGxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8ZXh0ZW5zaW9ucz50cnVlPC9leHRlbnNpb25zPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8aW5zdHJ1Y3Rpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgPEV4cG9ydC1QYWNrYWdlPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkxeC5oazJiYW48L0V4cG9ydC1QYWNrYWdlPgorICAgICAgICAgICAgICAgICAgICAgICAgPF92ZXJzaW9ucG9saWN5PlskKHZlcnNpb247PT07JChAKSksJCh2ZXJzaW9uOys7JChAKSkpPC9fdmVyc2lvbnBvbGljeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxfbm9kZWZhdWx0dmVyc2lvbj5mYWxzZTwvX25vZGVmYXVsdHZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5vc2dpLWJ1bmRsZTwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+YnVuZGxlPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXh0L2NkaS9qZXJzZXktY2RpMXgtYmFuLWN1c3RvbS1oazItYmluZGluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4dC9jZGkxeC9oazJiYW4vRW1wdHlIazJDdXN0b21JbmplY3Rpb25UeXBlUHJvdmlkZXIuamF2YSBiL2V4dC9jZGkvamVyc2V5LWNkaTF4LWJhbi1jdXN0b20taGsyLWJpbmRpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leHQvY2RpMXgvaGsyYmFuL0VtcHR5SGsyQ3VzdG9tSW5qZWN0aW9uVHlwZVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU0MDhmMAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9jZGkvamVyc2V5LWNkaTF4LWJhbi1jdXN0b20taGsyLWJpbmRpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leHQvY2RpMXgvaGsyYmFuL0VtcHR5SGsyQ3VzdG9tSW5qZWN0aW9uVHlwZVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpMXguaGsyYmFuOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkxeC5zcGkuSGsyQ3VzdG9tQm91bmRUeXBlc1Byb3ZpZGVyOworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgdGhhdCBlZmZlY3RpdmVseSBkaXNhYmxlcyBhbnkgYXR0ZW1wdHMgb2YgSmVyc2V5L0NESSBpbnRlZ3JhdGlvbiBsYXllcgorICogdG8gZGVsZWdhdGUgaW5qZWN0aW9uIGZyb20gQ0RJIHRvIEhLMi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgRW1wdHlIazJDdXN0b21JbmplY3Rpb25UeXBlUHJvdmlkZXIgaW1wbGVtZW50cyBIazJDdXN0b21Cb3VuZFR5cGVzUHJvdmlkZXIgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxUeXBlPiBnZXRIazJUeXBlcygpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L2NkaS9qZXJzZXktY2RpMXgtYmFuLWN1c3RvbS1oazItYmluZGluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4dC9jZGkxeC9oazJiYW4vcGFja2FnZS1pbmZvLmphdmEgYi9leHQvY2RpL2plcnNleS1jZGkxeC1iYW4tY3VzdG9tLWhrMi1iaW5kaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXh0L2NkaTF4L2hrMmJhbi9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2MyMzBlCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2NkaS9qZXJzZXktY2RpMXgtYmFuLWN1c3RvbS1oazItYmluZGluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4dC9jZGkxeC9oazJiYW4vcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoqCisgKiBKZXJzZXkgcGFja2FnZSBzdXBwb3J0aW5nIEplcnNleSBISzIgY3VzdG9tIGluamVjdGlvbiBiaW5kaW5nCisgKiB0byBiZSBkaXNhYmxlZCBpbiBDREkgZW52aXJvbm1lbnQuCisgKi8KK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTF4LmhrMmJhbjsKZGlmZiAtLWdpdCBhL2V4dC9jZGkvamVyc2V5LWNkaTF4LWJhbi1jdXN0b20taGsyLWJpbmRpbmcvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkxeC5zcGkuSGsyQ3VzdG9tQm91bmRUeXBlc1Byb3ZpZGVyIGIvZXh0L2NkaS9qZXJzZXktY2RpMXgtYmFuLWN1c3RvbS1oazItYmluZGluZy9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTF4LnNwaS5IazJDdXN0b21Cb3VuZFR5cGVzUHJvdmlkZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZlNGYwMAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9jZGkvamVyc2V5LWNkaTF4LWJhbi1jdXN0b20taGsyLWJpbmRpbmcvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkxeC5zcGkuSGsyQ3VzdG9tQm91bmRUeXBlc1Byb3ZpZGVyCkBAIC0wLDAgKzEgQEAKK29yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkxeC5oazJiYW4uRW1wdHlIazJDdXN0b21JbmplY3Rpb25UeXBlUHJvdmlkZXIKZGlmZiAtLWdpdCBhL2V4dC9jZGkvamVyc2V5LWNkaTF4LWJhbi1jdXN0b20taGsyLWJpbmRpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leHQvY2RpMXgvaGsyYmFuL0VtcHR5SGsyQ3VzdG9tSW5qZWN0aW9uVHlwZVByb3ZpZGVyVGVzdC5qYXZhIGIvZXh0L2NkaS9qZXJzZXktY2RpMXgtYmFuLWN1c3RvbS1oazItYmluZGluZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4dC9jZGkxeC9oazJiYW4vRW1wdHlIazJDdXN0b21JbmplY3Rpb25UeXBlUHJvdmlkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJjZTY1MAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9jZGkvamVyc2V5LWNkaTF4LWJhbi1jdXN0b20taGsyLWJpbmRpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leHQvY2RpMXgvaGsyYmFuL0VtcHR5SGsyQ3VzdG9tSW5qZWN0aW9uVHlwZVByb3ZpZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTF4LmhrMmJhbjsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpMXguc3BpLkhrMkN1c3RvbUJvdW5kVHlwZXNQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5TZXJ2aWNlRmluZGVyOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5lbXB0eUNvbGxlY3Rpb25PZjsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmluc3RhbmNlT2Y7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLm5vdE51bGxWYWx1ZTsKKworLyoqCisgKiBUZXN0IGZvciB7QGxpbmsgRW1wdHlIazJDdXN0b21JbmplY3Rpb25UeXBlUHJvdmlkZXJ9LgorICogTWFrZSBzdXJlIHRoYXQgdGhlIGVtcHR5IHByb3ZpZGVyIGNvdWxkIGJlIGxvYWRlZCBhbmQgcHJvdmlkZXMgYW4gZW1wdHkgdHlwZSBzZXQuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEVtcHR5SGsyQ3VzdG9tSW5qZWN0aW9uVHlwZVByb3ZpZGVyVGVzdCB7CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHN1Yi1yZXNvdXJjZSBkZXRlY3Rpb24uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlQcm92aWRlckxvb2t1cCgpIHsKKworICAgICAgICBmaW5hbCBIazJDdXN0b21Cb3VuZFR5cGVzUHJvdmlkZXJbXSBwcm92aWRlcnMgPSBTZXJ2aWNlRmluZGVyLmZpbmQoSGsyQ3VzdG9tQm91bmRUeXBlc1Byb3ZpZGVyLmNsYXNzKS50b0FycmF5KCk7CisgICAgICAgIGFzc2VydFRoYXQocHJvdmlkZXJzLCBpcyhub3ROdWxsVmFsdWUoKSkpOworICAgICAgICBhc3NlcnRUaGF0KHByb3ZpZGVycy5sZW5ndGgsIGlzKDEpKTsKKworICAgICAgICBmaW5hbCBIazJDdXN0b21Cb3VuZFR5cGVzUHJvdmlkZXIgdGhlT25seVByb3ZpZGVyID0gcHJvdmlkZXJzWzBdOworICAgICAgICBhc3NlcnRUaGF0KHRoZU9ubHlQcm92aWRlciwgaXMoaW5zdGFuY2VPZihFbXB0eUhrMkN1c3RvbUluamVjdGlvblR5cGVQcm92aWRlci5jbGFzcykpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh0aGVPbmx5UHJvdmlkZXIuZ2V0SGsyVHlwZXMoKSwgaXMoZW1wdHlDb2xsZWN0aW9uT2YoVHlwZS5jbGFzcykpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvY2RpL2plcnNleS1jZGkxeC1zZXJ2bGV0L3BvbS54bWwgYi9leHQvY2RpL2plcnNleS1jZGkxeC1zZXJ2bGV0L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA5Y2ZlNQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9jZGkvamVyc2V5LWNkaTF4LXNlcnZsZXQvcG9tLnhtbApAQCAtMCwwICsxLDExMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNkaTF4LXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktZXh0LWNkaTF4LXNlcnZsZXQ8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+SmVyc2V5IENESSAxLnggU2VydmxldCBTdXBwb3J0PC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtzZXJ2bGV0My52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lbnRlcnByaXNlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2RpLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY2RpMXg8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXNlcnZlcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPCEtLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2x1ZGluZyBvbmx5ICoudGVzdHMuKiBwYWNrYWdlcyBmb3IgdGhpcyBtb2R1bGUuIEF0IGxlYXN0IG9uZSBjbGFzcyBoYXMgdG8gZXhpc3QgaW4gbm9uLWV4Y2x1ZGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZXMgdG8gZ2VuZXJhdGUgcHJvcGVyIC1qYXZhZG9jLmphciBmaWxlLiBTZWUgaHR0cHM6Ly9qaXJhLmNvZGVoYXVzLm9yZy9icm93c2UvTUpBVkFET0MtMzI5CisgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVQYWNrYWdlTmFtZXM+Ki50ZXN0cy4qPC9leGNsdWRlUGFja2FnZU5hbWVzPgorICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4uaXN0YWNrPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWlzdGFjay1jb21tb25zLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5idWlsZC1oZWxwZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZmVsaXg8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYnVuZGxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8ZXh0ZW5zaW9ucz50cnVlPC9leHRlbnNpb25zPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8aW5zdHJ1Y3Rpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgPEV4cG9ydC1QYWNrYWdlPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkxeC5zZXJ2bGV0LmludGVybmFsPC9FeHBvcnQtUGFja2FnZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxfdmVyc2lvbnBvbGljeT5bJCh2ZXJzaW9uOz09OyQoQCkpLCQodmVyc2lvbjsrOyQoQCkpKTwvX3ZlcnNpb25wb2xpY3k+CisgICAgICAgICAgICAgICAgICAgICAgICA8X25vZGVmYXVsdHZlcnNpb24+ZmFsc2U8L19ub2RlZmF1bHR2ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICA8L2luc3RydWN0aW9ucz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+b3NnaS1idW5kbGU8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmJ1bmRsZTwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXh0L2NkaS9qZXJzZXktY2RpMXgtc2VydmxldC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4dC9jZGkxeC9zZXJ2bGV0L2ludGVybmFsL0NkaUV4dGVybmFsUmVxdWVzdFNjb3BlLmphdmEgYi9leHQvY2RpL2plcnNleS1jZGkxeC1zZXJ2bGV0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXh0L2NkaTF4L3NlcnZsZXQvaW50ZXJuYWwvQ2RpRXh0ZXJuYWxSZXF1ZXN0U2NvcGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDIxN2YyCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2NkaS9qZXJzZXktY2RpMXgtc2VydmxldC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4dC9jZGkxeC9zZXJ2bGV0L2ludGVybmFsL0NkaUV4dGVybmFsUmVxdWVzdFNjb3BlLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpMXguc2VydmxldC5pbnRlcm5hbDsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5BcHBsaWNhdGlvblNjb3BlZDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkxeC5pbnRlcm5hbC5KZXJzZXlWZXRvZWQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5FeHRlcm5hbFJlcXVlc3RDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuRXh0ZXJuYWxSZXF1ZXN0U2NvcGU7CisKKy8qKgorICogV2VsZCBzcGVjaWZpYyByZXF1ZXN0IHNjb3BlIHRvIGFsaWduIENESSByZXF1ZXN0IGNvbnRleHQgd2l0aCBKZXJzZXkuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uU2NvcGVkCitASmVyc2V5VmV0b2VkCitwdWJsaWMgY2xhc3MgQ2RpRXh0ZXJuYWxSZXF1ZXN0U2NvcGUgaW1wbGVtZW50cyBFeHRlcm5hbFJlcXVlc3RTY29wZTxPYmplY3Q+IHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVGhyZWFkTG9jYWw8SW5qZWN0aW9uTWFuYWdlcj4gYWN0dWFsSW5qZWN0aW9uTWFuYWdlciA9IG5ldyBUaHJlYWRMb2NhbDw+KCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRXh0ZXJuYWxSZXF1ZXN0Q29udGV4dDxPYmplY3Q+IG9wZW4oSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyKSB7CisgICAgICAgIGFjdHVhbEluamVjdGlvbk1hbmFnZXIuc2V0KGluamVjdGlvbk1hbmFnZXIpOworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsUmVxdWVzdENvbnRleHQ8PihudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZXN1bWUoZmluYWwgRXh0ZXJuYWxSZXF1ZXN0Q29udGV4dDxPYmplY3Q+IGN0eCwgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyKSB7CisgICAgICAgIGFjdHVhbEluamVjdGlvbk1hbmFnZXIuc2V0KGluamVjdGlvbk1hbmFnZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHN1c3BlbmQoZmluYWwgRXh0ZXJuYWxSZXF1ZXN0Q29udGV4dDxPYmplY3Q+IGN0eCwgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyKSB7CisgICAgICAgIGFjdHVhbEluamVjdGlvbk1hbmFnZXIucmVtb3ZlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgIGFjdHVhbEluamVjdGlvbk1hbmFnZXIucmVtb3ZlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L2NkaS9qZXJzZXktY2RpMXgtc2VydmxldC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4dC9jZGkxeC9zZXJ2bGV0L2ludGVybmFsL0NkaUV4dGVybmFsUmVxdWVzdFNjb3BlRXh0ZW5zaW9uLmphdmEgYi9leHQvY2RpL2plcnNleS1jZGkxeC1zZXJ2bGV0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXh0L2NkaTF4L3NlcnZsZXQvaW50ZXJuYWwvQ2RpRXh0ZXJuYWxSZXF1ZXN0U2NvcGVFeHRlbnNpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2ZlMWEwCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2NkaS9qZXJzZXktY2RpMXgtc2VydmxldC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4dC9jZGkxeC9zZXJ2bGV0L2ludGVybmFsL0NkaUV4dGVybmFsUmVxdWVzdFNjb3BlRXh0ZW5zaW9uLmphdmEKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTF4LnNlcnZsZXQuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuRGVwZW5kZW50OworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5zcGkuQ3JlYXRpb25hbENvbnRleHQ7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5ldmVudC5PYnNlcnZlczsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5Bbnk7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3QuRGVmYXVsdDsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuQWZ0ZXJCZWFuRGlzY292ZXJ5OworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5Bbm5vdGF0ZWRUeXBlOworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5CZWFuOworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5CZWFuTWFuYWdlcjsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuQmVmb3JlQmVhbkRpc2NvdmVyeTsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuRXh0ZW5zaW9uOworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5JbmplY3Rpb25Qb2ludDsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuSW5qZWN0aW9uVGFyZ2V0OworaW1wb3J0IGphdmF4LmVudGVycHJpc2UudXRpbC5Bbm5vdGF0aW9uTGl0ZXJhbDsKKworLyoqCisgKiBDREkgZXh0ZW5zaW9uIHRvIHJlZ2lzdGVyIHtAbGluayBDZGlFeHRlcm5hbFJlcXVlc3RTY29wZX0uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIENkaUV4dGVybmFsUmVxdWVzdFNjb3BlRXh0ZW5zaW9uIGltcGxlbWVudHMgRXh0ZW5zaW9uIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkxpdGVyYWw8RGVmYXVsdD4gREVGQVVMVF9BTk5PVEFUSU9OX0xJVEVSQUwgPSBuZXcgQW5ub3RhdGlvbkxpdGVyYWw8RGVmYXVsdD4oKSB7fTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFubm90YXRpb25MaXRlcmFsPEFueT4gQU5ZX0FOTk9UQVRJT05fTElURVJBTCA9IG5ldyBBbm5vdGF0aW9uTGl0ZXJhbDxBbnk+KCkge307CisKKyAgICBwcml2YXRlIEFubm90YXRlZFR5cGU8Q2RpRXh0ZXJuYWxSZXF1ZXN0U2NvcGU+IHJlcXVlc3RTY29wZVR5cGU7CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBvdXIgZXh0ZXJuYWwgcmVxdWVzdCBzY29wZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiZWZvcmVCZWFuRGlzY292ZXJ5RXZlbnQgQ0RJIGJvb3RzdHJhcCBldmVudC4KKyAgICAgKiBAcGFyYW0gYmVhbk1hbmFnZXIgY3VycmVudCBiZWFuIG1hbmFnZXIuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGJlZm9yZUJlYW5EaXNjb3ZlcnkoQE9ic2VydmVzIEJlZm9yZUJlYW5EaXNjb3ZlcnkgYmVmb3JlQmVhbkRpc2NvdmVyeUV2ZW50LCBmaW5hbCBCZWFuTWFuYWdlciBiZWFuTWFuYWdlcikgeworICAgICAgICByZXF1ZXN0U2NvcGVUeXBlID0gYmVhbk1hbmFnZXIuY3JlYXRlQW5ub3RhdGVkVHlwZShDZGlFeHRlcm5hbFJlcXVlc3RTY29wZS5jbGFzcyk7CisgICAgICAgIGJlZm9yZUJlYW5EaXNjb3ZlcnlFdmVudC5hZGRBbm5vdGF0ZWRUeXBlKHJlcXVlc3RTY29wZVR5cGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGEgQ0RJIGJlYW4gZm9yIHRoZSBleHRlcm5hbCBzY29wZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhZnRlckJlYW5EaXNjb3ZlcnkgQ0RJIGJvb3RzdHJhcCBldmVudC4KKyAgICAgKiBAcGFyYW0gYmVhbk1hbmFnZXIgY3VycmVudCBiZWFuIG1hbmFnZXIKKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYWZ0ZXJCZWFuRGlzY292ZXJ5KEBPYnNlcnZlcyBBZnRlckJlYW5EaXNjb3ZlcnkgYWZ0ZXJCZWFuRGlzY292ZXJ5LCBCZWFuTWFuYWdlciBiZWFuTWFuYWdlcikgeworCisgICAgICAgIC8vIHdlIG5lZWQgdGhlIGluamVjdGlvbiB0YXJnZXQgc28gdGhhdCBDREkgY291bGQgaW5zdGFudGlhdGUgdGhlIG9yaWdpbmFsIGludGVyY2VwdG9yIGZvciB1cworICAgICAgICBmaW5hbCBJbmplY3Rpb25UYXJnZXQ8Q2RpRXh0ZXJuYWxSZXF1ZXN0U2NvcGU+IGludGVyY2VwdG9yVGFyZ2V0ID0gYmVhbk1hbmFnZXIuY3JlYXRlSW5qZWN0aW9uVGFyZ2V0KHJlcXVlc3RTY29wZVR5cGUpOworCisKKyAgICAgICAgYWZ0ZXJCZWFuRGlzY292ZXJ5LmFkZEJlYW4obmV3IEJlYW48Q2RpRXh0ZXJuYWxSZXF1ZXN0U2NvcGU+KCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBDbGFzczw/PiBnZXRCZWFuQ2xhc3MoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENkaUV4dGVybmFsUmVxdWVzdFNjb3BlLmNsYXNzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTZXQ8SW5qZWN0aW9uUG9pbnQ+IGdldEluamVjdGlvblBvaW50cygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW50ZXJjZXB0b3JUYXJnZXQuZ2V0SW5qZWN0aW9uUG9pbnRzKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgICAgIHJldHVybiAiQ2RpRXh0ZXJuYWxSZXF1ZXN0U2NvcGUiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTZXQ8QW5ub3RhdGlvbj4gZ2V0UXVhbGlmaWVycygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEhhc2hTZXQ8QW5ub3RhdGlvbj4oKSB7eworICAgICAgICAgICAgICAgICAgICBhZGQoREVGQVVMVF9BTk5PVEFUSU9OX0xJVEVSQUwpOworICAgICAgICAgICAgICAgICAgICBhZGQoQU5ZX0FOTk9UQVRJT05fTElURVJBTCk7CisgICAgICAgICAgICAgICAgfX07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBnZXRTY29wZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRGVwZW5kZW50LmNsYXNzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTZXQ8Q2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+PiBnZXRTdGVyZW90eXBlcygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU2V0PFR5cGU+IGdldFR5cGVzKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSGFzaFNldDxUeXBlPigpIHt7CisgICAgICAgICAgICAgICAgICAgIGFkZChDZGlFeHRlcm5hbFJlcXVlc3RTY29wZS5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIGFkZChPYmplY3QuY2xhc3MpOworICAgICAgICAgICAgICAgIH19OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQWx0ZXJuYXRpdmUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzTnVsbGFibGUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBDZGlFeHRlcm5hbFJlcXVlc3RTY29wZSBjcmVhdGUoQ3JlYXRpb25hbENvbnRleHQ8Q2RpRXh0ZXJuYWxSZXF1ZXN0U2NvcGU+IGN0eCkgeworCisgICAgICAgICAgICAgICAgZmluYWwgQ2RpRXh0ZXJuYWxSZXF1ZXN0U2NvcGUgcmVzdWx0ID0gaW50ZXJjZXB0b3JUYXJnZXQucHJvZHVjZShjdHgpOworICAgICAgICAgICAgICAgIGludGVyY2VwdG9yVGFyZ2V0LmluamVjdChyZXN1bHQsIGN0eCk7CisgICAgICAgICAgICAgICAgaW50ZXJjZXB0b3JUYXJnZXQucG9zdENvbnN0cnVjdChyZXN1bHQpOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBkZXN0cm95KENkaUV4dGVybmFsUmVxdWVzdFNjb3BlIGluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGlvbmFsQ29udGV4dDxDZGlFeHRlcm5hbFJlcXVlc3RTY29wZT4gY3R4KSB7CisKKyAgICAgICAgICAgICAgICBpbnRlcmNlcHRvclRhcmdldC5wcmVEZXN0cm95KGluc3RhbmNlKTsKKyAgICAgICAgICAgICAgICBpbnRlcmNlcHRvclRhcmdldC5kaXNwb3NlKGluc3RhbmNlKTsKKyAgICAgICAgICAgICAgICBjdHgucmVsZWFzZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvY2RpL2plcnNleS1jZGkxeC1zZXJ2bGV0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXh0L2NkaTF4L3NlcnZsZXQvaW50ZXJuYWwvU2VydmxldEluamVjdGlvbk1hbmFnZXJTdG9yZS5qYXZhIGIvZXh0L2NkaS9qZXJzZXktY2RpMXgtc2VydmxldC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4dC9jZGkxeC9zZXJ2bGV0L2ludGVybmFsL1NlcnZsZXRJbmplY3Rpb25NYW5hZ2VyU3RvcmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzZmMTU0Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2NkaS9qZXJzZXktY2RpMXgtc2VydmxldC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4dC9jZGkxeC9zZXJ2bGV0L2ludGVybmFsL1NlcnZsZXRJbmplY3Rpb25NYW5hZ2VyU3RvcmUuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkxeC5zZXJ2bGV0LmludGVybmFsOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTF4LmludGVybmFsLkdlbmVyaWNJbmplY3Rpb25NYW5hZ2VyU3RvcmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTF4LmludGVybmFsLnNwaS5JbmplY3Rpb25NYW5hZ2VyU3RvcmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CisKKy8qKgorICoge0BsaW5rIEluamVjdGlvbk1hbmFnZXJTdG9yZSBpbmplY3Rpb24gbWFuYWdlcn0gZm9yIHNlcnZsZXQgYmFzZWQgY29udGFpbmVycy4gVGhlIHByb3ZpZGVyCisgKiBlbmFibGVzIFdBUiBhbmQgRUFSIHRvIGJlIGRlcGxveWVkIG9uIGEgc2VydmxldCBjb250YWluZXIgYW5kIGJlIHByb3Blcmx5IGluamVjdGVkLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBzaW5jZSAyLjE3CisgKi8KK3B1YmxpYyBjbGFzcyBTZXJ2bGV0SW5qZWN0aW9uTWFuYWdlclN0b3JlIGV4dGVuZHMgR2VuZXJpY0luamVjdGlvbk1hbmFnZXJTdG9yZSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSW5qZWN0aW9uTWFuYWdlciBsb29rdXBJbmplY3Rpb25NYW5hZ2VyKCkgeworICAgICAgICByZXR1cm4gQ2RpRXh0ZXJuYWxSZXF1ZXN0U2NvcGUuYWN0dWFsSW5qZWN0aW9uTWFuYWdlci5nZXQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvY2RpL2plcnNleS1jZGkxeC1zZXJ2bGV0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXh0L2NkaTF4L3NlcnZsZXQvaW50ZXJuYWwvcGFja2FnZS1pbmZvLmphdmEgYi9leHQvY2RpL2plcnNleS1jZGkxeC1zZXJ2bGV0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXh0L2NkaTF4L3NlcnZsZXQvaW50ZXJuYWwvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FkODc3YQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9jZGkvamVyc2V5LWNkaTF4LXNlcnZsZXQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leHQvY2RpMXgvc2VydmxldC9pbnRlcm5hbC9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDIyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvKioKKyAqIEplcnNleSBpbnRlcm5hbCBwYWNrYWdlIHN1cHBvcnRpbmcgSmVyc2V5IENESSBpbnRlZ3JhdGlvbiBpbiBTZXJ2bGV0IGNvbnRhaW5lcnMuCisgKgorICogQHNpbmNlIDIuMTcKKyAqLworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpMXguc2VydmxldC5pbnRlcm5hbDsKZGlmZiAtLWdpdCBhL2V4dC9jZGkvamVyc2V5LWNkaTF4LXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2JlYW5zLnhtbCBiL2V4dC9jZGkvamVyc2V5LWNkaTF4LXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2JlYW5zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWYwNTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2NkaS9qZXJzZXktY2RpMXgtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvYmVhbnMueG1sCkBAIC0wLDAgKzEsMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPGJlYW5zLz4KZGlmZiAtLWdpdCBhL2V4dC9jZGkvamVyc2V5LWNkaTF4LXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL2phdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5FeHRlbnNpb24gYi9leHQvY2RpL2plcnNleS1jZGkxeC1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9qYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuRXh0ZW5zaW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MjAzN2MKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvY2RpL2plcnNleS1jZGkxeC1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9qYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuRXh0ZW5zaW9uCkBAIC0wLDAgKzEgQEAKK29yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkxeC5zZXJ2bGV0LmludGVybmFsLkNkaUV4dGVybmFsUmVxdWVzdFNjb3BlRXh0ZW5zaW9uCmRpZmYgLS1naXQgYS9leHQvY2RpL2plcnNleS1jZGkxeC1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpMXguaW50ZXJuYWwuc3BpLkluamVjdGlvbk1hbmFnZXJTdG9yZSBiL2V4dC9jZGkvamVyc2V5LWNkaTF4LXNlcnZsZXQvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkxeC5pbnRlcm5hbC5zcGkuSW5qZWN0aW9uTWFuYWdlclN0b3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhOTc5YTAKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvY2RpL2plcnNleS1jZGkxeC1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpMXguaW50ZXJuYWwuc3BpLkluamVjdGlvbk1hbmFnZXJTdG9yZQpAQCAtMCwwICsxIEBACitvcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpMXguc2VydmxldC5pbnRlcm5hbC5TZXJ2bGV0SW5qZWN0aW9uTWFuYWdlclN0b3JlCmRpZmYgLS1naXQgYS9leHQvY2RpL2plcnNleS1jZGkxeC1zZXJ2bGV0L3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkV4dGVybmFsUmVxdWVzdFNjb3BlIGIvZXh0L2NkaS9qZXJzZXktY2RpMXgtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5FeHRlcm5hbFJlcXVlc3RTY29wZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDZhYmZjCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2NkaS9qZXJzZXktY2RpMXgtc2VydmxldC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5FeHRlcm5hbFJlcXVlc3RTY29wZQpAQCAtMCwwICsxIEBACitvcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpMXguc2VydmxldC5pbnRlcm5hbC5DZGlFeHRlcm5hbFJlcXVlc3RTY29wZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4dC9jZGkvamVyc2V5LWNkaTF4LXRyYW5zYWN0aW9uL3BvbS54bWwgYi9leHQvY2RpL2plcnNleS1jZGkxeC10cmFuc2FjdGlvbi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYTQyYzEKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvY2RpL2plcnNleS1jZGkxeC10cmFuc2FjdGlvbi9wb20ueG1sCkBAIC0wLDAgKzEsMTA5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGk8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY2RpMXgtdHJhbnNhY3Rpb248L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktZXh0LWNkaTF4LXRyYW5zYWN0aW9uPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPkplcnNleSBDREkgMS54IFRyYW5zYWN0aW9uYWwgU3VwcG9ydDwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXg8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZhZWUtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+Ny4wPC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jZGkxeDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktc2VydmVyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPCEtLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2x1ZGluZyBvbmx5ICoudGVzdHMuKiBwYWNrYWdlcyBmb3IgdGhpcyBtb2R1bGUuIEF0IGxlYXN0IG9uZSBjbGFzcyBoYXMgdG8gZXhpc3QgaW4gbm9uLWV4Y2x1ZGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZXMgdG8gZ2VuZXJhdGUgcHJvcGVyIC1qYXZhZG9jLmphciBmaWxlLiBTZWUgaHR0cHM6Ly9qaXJhLmNvZGVoYXVzLm9yZy9icm93c2UvTUpBVkFET0MtMzI5CisgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVQYWNrYWdlTmFtZXM+Ki50ZXN0cy4qPC9leGNsdWRlUGFja2FnZU5hbWVzPgorICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4uaXN0YWNrPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWlzdGFjay1jb21tb25zLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5idWlsZC1oZWxwZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZmVsaXg8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYnVuZGxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8ZXh0ZW5zaW9ucz50cnVlPC9leHRlbnNpb25zPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8aW5zdHJ1Y3Rpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgPEV4cG9ydC1QYWNrYWdlPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkxeC50cmFuc2FjdGlvbi5pbnRlcm5hbDwvRXhwb3J0LVBhY2thZ2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8X3ZlcnNpb25wb2xpY3k+WyQodmVyc2lvbjs9PTskKEApKSwkKHZlcnNpb247KzskKEApKSk8L192ZXJzaW9ucG9saWN5PgorICAgICAgICAgICAgICAgICAgICAgICAgPF9ub2RlZmF1bHR2ZXJzaW9uPmZhbHNlPC9fbm9kZWZhdWx0dmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9pbnN0cnVjdGlvbnM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlkPm9zZ2ktYnVuZGxlPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5idW5kbGU8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9leHQvY2RpL2plcnNleS1jZGkxeC10cmFuc2FjdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4dC9jZGkxeC90cmFuc2FjdGlvbi9pbnRlcm5hbC9UcmFuc2FjdGlvbmFsRXhjZXB0aW9uSW50ZXJjZXB0b3JQcm92aWRlci5qYXZhIGIvZXh0L2NkaS9qZXJzZXktY2RpMXgtdHJhbnNhY3Rpb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leHQvY2RpMXgvdHJhbnNhY3Rpb24vaW50ZXJuYWwvVHJhbnNhY3Rpb25hbEV4Y2VwdGlvbkludGVyY2VwdG9yUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGFjN2ViCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2NkaS9qZXJzZXktY2RpMXgtdHJhbnNhY3Rpb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leHQvY2RpMXgvdHJhbnNhY3Rpb24vaW50ZXJuYWwvVHJhbnNhY3Rpb25hbEV4Y2VwdGlvbkludGVyY2VwdG9yUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpMXgudHJhbnNhY3Rpb24uaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuRXhjZXB0aW9uTWFwcGVyOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qcmlvcml0eTsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmV2ZW50Lk9ic2VydmVzOworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5BZnRlclR5cGVEaXNjb3Zlcnk7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkJlYW5NYW5hZ2VyOworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5CZWZvcmVCZWFuRGlzY292ZXJ5OworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5FeHRlbnNpb247CitpbXBvcnQgamF2YXguaW5qZWN0LlF1YWxpZmllcjsKK2ltcG9ydCBqYXZheC5pbnRlcmNlcHRvci5JbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTF4LmludGVybmFsLkNkaVV0aWw7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTF4LmludGVybmFsLkdlbmVyaWNDZGlCZWFuU3VwcGxpZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkJpbmRpbmc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkJpbmRpbmdzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29tcG9uZW50UHJvdmlkZXI7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuUEFSQU1FVEVSOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKKworLyoqCisgKiBKZXJzZXkgQ0RJIGV4dGVuc2lvbiB0aGF0IHByb3ZpZGVzIG1lYW5zIHRvIHJldGFpbiB7QGxpbmsgV2ViQXBwbGljYXRpb25FeGNlcHRpb259CisgKiB0aHJvd24gZnJvbSBKQVgtUlMgY29tcG9uZW50cyBpbXBsZW1lbnRlZCBhcyBDREkgdHJhbnNhY3Rpb25hbCBiZWFucy4KKyAqIFRoaXMgaXMgdG8gYXZvaWQgdGhlIHtAbGluayBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbn0gZnJvbSBiZWluZyBtYXNrZWQgd2l0aAorICoge0BsaW5rIFRyYW5zYWN0aW9uYWxFeGNlcHRpb259LiBKZXJzZXkgd2lsbCB0cnkgdG8gcmVzdG9yZSB0aGUgb3JpZ2luYWwKKyAqIEpBWC1SUyBleGNlcHRpb24gdXNpbmcge0BsaW5rIFRyYW5zYWN0aW9uYWxFeGNlcHRpb25NYXBwZXJ9LgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQcmlvcml0eSh2YWx1ZSA9IEludGVyY2VwdG9yLlByaW9yaXR5LlBMQVRGT1JNX0JFRk9SRSArIDE5OSkKK3B1YmxpYyBjbGFzcyBUcmFuc2FjdGlvbmFsRXhjZXB0aW9uSW50ZXJjZXB0b3JQcm92aWRlciBpbXBsZW1lbnRzIENvbXBvbmVudFByb3ZpZGVyLCBFeHRlbnNpb24geworCisgICAgcHJpdmF0ZSBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXI7CisgICAgcHJpdmF0ZSBCZWFuTWFuYWdlciBiZWFuTWFuYWdlcjsKKworICAgIEBRdWFsaWZpZXIKKyAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgQFRhcmdldCh7TUVUSE9ELCBGSUVMRCwgUEFSQU1FVEVSLCBUWVBFfSkKKyAgICBwdWJsaWMgc3RhdGljIEBpbnRlcmZhY2UgV2FlUXVhbGlmaWVyIHsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKGZpbmFsIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlcikgeworICAgICAgICB0aGlzLmluamVjdGlvbk1hbmFnZXIgPSBpbmplY3Rpb25NYW5hZ2VyOworICAgICAgICB0aGlzLmJlYW5NYW5hZ2VyID0gQ2RpVXRpbC5nZXRCZWFuTWFuYWdlcigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGJpbmQoZmluYWwgQ2xhc3M8Pz4gY29tcG9uZW50LCBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IHByb3ZpZGVyQ29udHJhY3RzKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkb25lKCkgeworICAgICAgICBpZiAoYmVhbk1hbmFnZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgYmluZFdhZVJlc3RvcmluZ0V4Y2VwdGlvbk1hcHBlcigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGJpbmRXYWVSZXN0b3JpbmdFeGNlcHRpb25NYXBwZXIoKSB7CisgICAgICAgIEdlbmVyaWNDZGlCZWFuU3VwcGxpZXIgYmVhblN1cHBsaWVyID0KKyAgICAgICAgICAgICAgICBuZXcgR2VuZXJpY0NkaUJlYW5TdXBwbGllcihUcmFuc2FjdGlvbmFsRXhjZXB0aW9uTWFwcGVyLmNsYXNzLCBpbmplY3Rpb25NYW5hZ2VyLCBiZWFuTWFuYWdlciwgdHJ1ZSk7CisgICAgICAgIEJpbmRpbmcgYmluZGluZyA9IEJpbmRpbmdzLnN1cHBsaWVyKGJlYW5TdXBwbGllcikudG8oRXhjZXB0aW9uTWFwcGVyLmNsYXNzKTsKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5yZWdpc3RlcihiaW5kaW5nKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgICBwcml2YXRlIHZvaWQgYWZ0ZXJUeXBlRGlzY292ZXJ5KEBPYnNlcnZlcyBmaW5hbCBBZnRlclR5cGVEaXNjb3ZlcnkgYWZ0ZXJUeXBlRGlzY292ZXJ5KSB7CisgICAgICAgIGZpbmFsIExpc3Q8Q2xhc3M8Pz4+IGludGVyY2VwdG9ycyA9IGFmdGVyVHlwZURpc2NvdmVyeS5nZXRJbnRlcmNlcHRvcnMoKTsKKyAgICAgICAgaW50ZXJjZXB0b3JzLmFkZChXZWJBcHBFeGNlcHRpb25JbnRlcmNlcHRvci5jbGFzcyk7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisgICAgcHJpdmF0ZSB2b2lkIGJlZm9yZUJlYW5EaXNjb3ZlcnkoQE9ic2VydmVzIGZpbmFsIEJlZm9yZUJlYW5EaXNjb3ZlcnkgYmVmb3JlQmVhbkRpc2NvdmVyeSwgZmluYWwgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpCisgICAgICAgICAgICAuQmVhbk1hbmFnZXIgYmVhbk1hbmFnZXIpIHsKKyAgICAgICAgYmVmb3JlQmVhbkRpc2NvdmVyeS5hZGRBbm5vdGF0ZWRUeXBlKGJlYW5NYW5hZ2VyLmNyZWF0ZUFubm90YXRlZFR5cGUoV2ViQXBwRXhjZXB0aW9uSG9sZGVyLmNsYXNzKSk7CisgICAgICAgIGJlZm9yZUJlYW5EaXNjb3ZlcnkuYWRkQW5ub3RhdGVkVHlwZShiZWFuTWFuYWdlci5jcmVhdGVBbm5vdGF0ZWRUeXBlKFdlYkFwcEV4Y2VwdGlvbkludGVyY2VwdG9yLmNsYXNzKSk7CisgICAgICAgIGJlZm9yZUJlYW5EaXNjb3ZlcnkuYWRkQW5ub3RhdGVkVHlwZShiZWFuTWFuYWdlci5jcmVhdGVBbm5vdGF0ZWRUeXBlKFRyYW5zYWN0aW9uYWxFeGNlcHRpb25NYXBwZXIuY2xhc3MpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvY2RpL2plcnNleS1jZGkxeC10cmFuc2FjdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4dC9jZGkxeC90cmFuc2FjdGlvbi9pbnRlcm5hbC9UcmFuc2FjdGlvbmFsRXhjZXB0aW9uTWFwcGVyLmphdmEgYi9leHQvY2RpL2plcnNleS1jZGkxeC10cmFuc2FjdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4dC9jZGkxeC90cmFuc2FjdGlvbi9pbnRlcm5hbC9UcmFuc2FjdGlvbmFsRXhjZXB0aW9uTWFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q5YjIwZQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9jZGkvamVyc2V5LWNkaTF4LXRyYW5zYWN0aW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXh0L2NkaTF4L3RyYW5zYWN0aW9uL2ludGVybmFsL1RyYW5zYWN0aW9uYWxFeGNlcHRpb25NYXBwZXIuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkxeC50cmFuc2FjdGlvbi5pbnRlcm5hbDsKKworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LkV4Y2VwdGlvbk1hcHBlcjsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5BcHBsaWNhdGlvblNjb3BlZDsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuQmVhbk1hbmFnZXI7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CitpbXBvcnQgamF2YXgudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbEV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkxeC5pbnRlcm5hbC5KZXJzZXlWZXRvZWQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLkV4Y2VwdGlvbk1hcHBlcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLkV4dGVuZGVkRXhjZXB0aW9uTWFwcGVyOworCisvKioKKyAqIEhlbHBlciBjbGFzcyB0byBoYW5kbGUgZXhjZXB0aW9ucyB0aHJvd24gYnkgSlRBIGxheWVyLiBJZiB0aGlzIG1hcHBlciB3YXMgbm90CisgKiByZWdpc3RlcmVkLCBubyB7QGxpbmsgV2ViQXBwbGljYXRpb25FeGNlcHRpb259IHRocm93biBmcm9tIGEgdHJhbnNhY3Rpb25hbAorICogQ0RJIGJlYW4gd291bGQgZ2V0IHByb3Blcmx5IG1hcHBlZCB0byBjb3JyZXNwb25kaW5nIHJlc3BvbnNlLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BBcHBsaWNhdGlvblNjb3BlZAorQEplcnNleVZldG9lZAorcHVibGljIGNsYXNzIFRyYW5zYWN0aW9uYWxFeGNlcHRpb25NYXBwZXIgaW1wbGVtZW50cyBFeHRlbmRlZEV4Y2VwdGlvbk1hcHBlcjxUcmFuc2FjdGlvbmFsRXhjZXB0aW9uPiB7CisKKyAgICBASW5qZWN0CisgICAgQFRyYW5zYWN0aW9uYWxFeGNlcHRpb25JbnRlcmNlcHRvclByb3ZpZGVyLldhZVF1YWxpZmllcgorICAgIHByaXZhdGUgV2ViQXBwRXhjZXB0aW9uSG9sZGVyIHdhZUhvbGRlcjsKKworICAgIEBJbmplY3QKKyAgICBwcml2YXRlIEJlYW5NYW5hZ2VyIGJlYW5NYW5hZ2VyOworCisgICAgQEluamVjdAorICAgIHByaXZhdGUgUHJvdmlkZXI8RXhjZXB0aW9uTWFwcGVycz4gbWFwcGVyczsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNwb25zZSB0b1Jlc3BvbnNlKFRyYW5zYWN0aW9uYWxFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgIGZpbmFsIEV4Y2VwdGlvbk1hcHBlciBtYXBwZXIgPSBtYXBwZXJzLmdldCgpLmZpbmRNYXBwaW5nKGV4Y2VwdGlvbik7CisKKyAgICAgICAgaWYgKG1hcHBlciAhPSBudWxsICYmICFUcmFuc2FjdGlvbmFsRXhjZXB0aW9uTWFwcGVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20obWFwcGVyLmdldENsYXNzKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gbWFwcGVyLnRvUmVzcG9uc2UoZXhjZXB0aW9uKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICh3YWVIb2xkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHdhZSA9IHdhZUhvbGRlci5nZXRFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICBpZiAod2FlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdhZS5nZXRSZXNwb25zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzTWFwcGFibGUoVHJhbnNhY3Rpb25hbEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L2NkaS9qZXJzZXktY2RpMXgtdHJhbnNhY3Rpb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leHQvY2RpMXgvdHJhbnNhY3Rpb24vaW50ZXJuYWwvV2ViQXBwRXhjZXB0aW9uSG9sZGVyLmphdmEgYi9leHQvY2RpL2plcnNleS1jZGkxeC10cmFuc2FjdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4dC9jZGkxeC90cmFuc2FjdGlvbi9pbnRlcm5hbC9XZWJBcHBFeGNlcHRpb25Ib2xkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjA1MmRmCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2NkaS9qZXJzZXktY2RpMXgtdHJhbnNhY3Rpb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leHQvY2RpMXgvdHJhbnNhY3Rpb24vaW50ZXJuYWwvV2ViQXBwRXhjZXB0aW9uSG9sZGVyLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpMXgudHJhbnNhY3Rpb24uaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKKworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LlJlcXVlc3RTY29wZWQ7CitpbXBvcnQgamF2YXgudHJhbnNhY3Rpb24uVHJhbnNhY3Rpb25hbDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkxeC5pbnRlcm5hbC5KZXJzZXlWZXRvZWQ7CisKKy8qKgorICogQ0RJIGJlYW4gdG8gc3RvcmUgYW55IHtAbGluayBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbn0KKyAqIHRocm93biBpbiBhIHtAbGluayBUcmFuc2FjdGlvbmFsfSBDREkgYmVhbiBmb3IgbGF0ZXIgdXNlCisgKiBpbiB7QGxpbmsgVHJhbnNhY3Rpb25hbEV4Y2VwdGlvbk1hcHBlcn0uCisgKgorICogQGF1dGhvciBKYWt1Yi5Qb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJlcXVlc3RTY29wZWQKK0BKZXJzZXlWZXRvZWQKK0BUcmFuc2FjdGlvbmFsRXhjZXB0aW9uSW50ZXJjZXB0b3JQcm92aWRlci5XYWVRdWFsaWZpZXIKK3B1YmxpYyBjbGFzcyBXZWJBcHBFeGNlcHRpb25Ib2xkZXIgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzE0MTU5MjY1MzU4NzlMOworCisgICAgcHJpdmF0ZSBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiBleGNlcHRpb247CisKKyAgICAvKiBwYWNrYWdlICovIHZvaWQgc2V0RXhjZXB0aW9uKFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICB0aGlzLmV4Y2VwdGlvbiA9IGV4Y2VwdGlvbjsKKyAgICB9CisKKyAgICAvKiBwYWNrYWdlICovIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIGdldEV4Y2VwdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvY2RpL2plcnNleS1jZGkxeC10cmFuc2FjdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4dC9jZGkxeC90cmFuc2FjdGlvbi9pbnRlcm5hbC9XZWJBcHBFeGNlcHRpb25JbnRlcmNlcHRvci5qYXZhIGIvZXh0L2NkaS9qZXJzZXktY2RpMXgtdHJhbnNhY3Rpb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leHQvY2RpMXgvdHJhbnNhY3Rpb24vaW50ZXJuYWwvV2ViQXBwRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzY4NjE1Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2NkaS9qZXJzZXktY2RpMXgtdHJhbnNhY3Rpb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leHQvY2RpMXgvdHJhbnNhY3Rpb24vaW50ZXJuYWwvV2ViQXBwRXhjZXB0aW9uSW50ZXJjZXB0b3IuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkxeC50cmFuc2FjdGlvbi5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5OworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW50ZXJjZXB0b3IuQXJvdW5kSW52b2tlOworaW1wb3J0IGphdmF4LmludGVyY2VwdG9yLkludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LmludGVyY2VwdG9yLkludm9jYXRpb25Db250ZXh0OworaW1wb3J0IGphdmF4LnRyYW5zYWN0aW9uLlRyYW5zYWN0aW9uYWw7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpMXguaW50ZXJuYWwuSmVyc2V5VmV0b2VkOworCisvKioKKyAqIFRyYW5zYWN0aW9uYWwgaW50ZXJjZXB0b3IgdG8gaGVscCByZXRhaW4ge0BsaW5rIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9ufQorICogdGhyb3duIGJ5IHRyYW5zYWN0aW9uYWwgYmVhbnMuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFByaW9yaXR5KHZhbHVlID0gSW50ZXJjZXB0b3IuUHJpb3JpdHkuUExBVEZPUk1fQkVGT1JFICsgMTk5KQorQEludGVyY2VwdG9yCitAVHJhbnNhY3Rpb25hbAorQEplcnNleVZldG9lZAorcHVibGljIGZpbmFsIGNsYXNzIFdlYkFwcEV4Y2VwdGlvbkludGVyY2VwdG9yIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xTDsKKworICAgIEBJbmplY3QKKyAgICBAVHJhbnNhY3Rpb25hbEV4Y2VwdGlvbkludGVyY2VwdG9yUHJvdmlkZXIuV2FlUXVhbGlmaWVyCisgICAgcHJpdmF0ZSBXZWJBcHBFeGNlcHRpb25Ib2xkZXIgc3RvcmU7CisKKyAgICBAQXJvdW5kSW52b2tlCisgICAgcHVibGljIE9iamVjdCBpbnRlcmNlcHQoZmluYWwgSW52b2NhdGlvbkNvbnRleHQgaWMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGljLnByb2NlZWQoKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24gd2FlKSB7CisgICAgICAgICAgICBpZiAoc3RvcmUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHN0b3JlLnNldEV4Y2VwdGlvbih3YWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgd2FlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L2NkaS9qZXJzZXktY2RpMXgtdHJhbnNhY3Rpb24vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL2phdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5FeHRlbnNpb24gYi9leHQvY2RpL2plcnNleS1jZGkxeC10cmFuc2FjdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkV4dGVuc2lvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDNkMWI4Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2NkaS9qZXJzZXktY2RpMXgtdHJhbnNhY3Rpb24vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL2phdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5FeHRlbnNpb24KQEAgLTAsMCArMSBAQAorb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTF4LnRyYW5zYWN0aW9uLmludGVybmFsLlRyYW5zYWN0aW9uYWxFeGNlcHRpb25JbnRlcmNlcHRvclByb3ZpZGVyCmRpZmYgLS1naXQgYS9leHQvY2RpL2plcnNleS1jZGkxeC10cmFuc2FjdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5Db21wb25lbnRQcm92aWRlciBiL2V4dC9jZGkvamVyc2V5LWNkaTF4LXRyYW5zYWN0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbXBvbmVudFByb3ZpZGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2YjU4NTkKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvY2RpL2plcnNleS1jZGkxeC10cmFuc2FjdGlvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5Db21wb25lbnRQcm92aWRlcgpAQCAtMCwwICsxLDIgQEAKK29yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkxeC50cmFuc2FjdGlvbi5pbnRlcm5hbC5UcmFuc2FjdGlvbmFsRXhjZXB0aW9uSW50ZXJjZXB0b3JQcm92aWRlcgorCmRpZmYgLS1naXQgYS9leHQvY2RpL2plcnNleS1jZGkxeC12YWxpZGF0aW9uL3BvbS54bWwgYi9leHQvY2RpL2plcnNleS1jZGkxeC12YWxpZGF0aW9uL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZkMjA5YQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9jZGkvamVyc2V5LWNkaTF4LXZhbGlkYXRpb24vcG9tLnhtbApAQCAtMCwwICsxLDEwNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNkaTF4LXZhbGlkYXRpb248L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktZXh0LWNkaTF4LXZhbGlkYXRpb248L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+SmVyc2V5IENESSAxLnggQmVhbiBWYWxpZGF0aW9uIFN1cHBvcnQ8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktc2VydmVyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuaGliZXJuYXRlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGliZXJuYXRlLXZhbGlkYXRvci1jZGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lbnRlcnByaXNlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2RpLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjI8L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPCEtLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2x1ZGluZyBvbmx5ICoudGVzdHMuKiBwYWNrYWdlcyBmb3IgdGhpcyBtb2R1bGUuIEF0IGxlYXN0IG9uZSBjbGFzcyBoYXMgdG8gZXhpc3QgaW4gbm9uLWV4Y2x1ZGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZXMgdG8gZ2VuZXJhdGUgcHJvcGVyIC1qYXZhZG9jLmphciBmaWxlLiBTZWUgaHR0cHM6Ly9qaXJhLmNvZGVoYXVzLm9yZy9icm93c2UvTUpBVkFET0MtMzI5CisgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVQYWNrYWdlTmFtZXM+Ki50ZXN0cy4qPC9leGNsdWRlUGFja2FnZU5hbWVzPgorICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4uaXN0YWNrPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWlzdGFjay1jb21tb25zLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5idWlsZC1oZWxwZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZmVsaXg8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYnVuZGxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8ZXh0ZW5zaW9ucz50cnVlPC9leHRlbnNpb25zPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8aW5zdHJ1Y3Rpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgPEV4cG9ydC1QYWNrYWdlPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkxeC52YWxpZGF0aW9uLmludGVybmFsO3ZlcnNpb249JHtwcm9qZWN0LnZlcnNpb259PC9FeHBvcnQtUGFja2FnZT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbnN0cnVjdGlvbnM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGlkPm9zZ2ktYnVuZGxlPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5idW5kbGU8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4dC9jZGkvamVyc2V5LWNkaTF4LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leHQvY2RpMXgvdmFsaWRhdGlvbi9pbnRlcm5hbC9DZGlJbnRlcmNlcHRvcldyYXBwZXIuamF2YSBiL2V4dC9jZGkvamVyc2V5LWNkaTF4LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leHQvY2RpMXgvdmFsaWRhdGlvbi9pbnRlcm5hbC9DZGlJbnRlcmNlcHRvcldyYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmEwOThkCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2NkaS9qZXJzZXktY2RpMXgtdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4dC9jZGkxeC92YWxpZGF0aW9uL2ludGVybmFsL0NkaUludGVyY2VwdG9yV3JhcHBlci5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTF4LnZhbGlkYXRpb24uaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qcmlvcml0eTsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuQmVhbjsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuQmVhbk1hbmFnZXI7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbnRlcmNlcHRvci5Bcm91bmRDb25zdHJ1Y3Q7CitpbXBvcnQgamF2YXguaW50ZXJjZXB0b3IuQXJvdW5kSW52b2tlOworaW1wb3J0IGphdmF4LmludGVyY2VwdG9yLkludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LmludGVyY2VwdG9yLkludm9jYXRpb25Db250ZXh0OworCitpbXBvcnQgb3JnLmhpYmVybmF0ZS52YWxpZGF0b3IuaW50ZXJuYWwuY2RpLmludGVyY2VwdG9yLk1ldGhvZFZhbGlkYXRlZDsKK2ltcG9ydCBvcmcuaGliZXJuYXRlLnZhbGlkYXRvci5pbnRlcm5hbC5jZGkuaW50ZXJjZXB0b3IuVmFsaWRhdGlvbkludGVyY2VwdG9yOworCisvKioKKyAqIEpBWC1SUyB3cmFwcGVyIGZvciBIaWJlcm5hdGUgQ0RJIGJlYW4gdmFsaWRhdGlvbiBpbnRlcmNlcHRvci4KKyAqIFNpbmNlIEplcnNleSBhbHJlYWR5IGV4ZWN1dGVzIHZhbGlkYXRpb24gb24gSkFYLVJTIHJlc291cmNlcywKKyAqIEplcnNleSByZWdpc3RlcnMgdGhpcyB3cmFwcGVyIGludG8gQ0RJIGNvbnRhaW5lciBzbyB0aGF0IEpBWC1SUworICogY29tcG9uZW50cyBkbyBub3QgZ2V0IHZhbGlkYXRlZCB0d2ljZS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitATWV0aG9kVmFsaWRhdGVkCitASW50ZXJjZXB0b3IKK0BQcmlvcml0eShJbnRlcmNlcHRvci5Qcmlvcml0eS5QTEFURk9STV9BRlRFUiArIDgwMCkKK3B1YmxpYyBjbGFzcyBDZGlJbnRlcmNlcHRvcldyYXBwZXIgeworCisgICAgcHJpdmF0ZSBmaW5hbCBWYWxpZGF0aW9uSW50ZXJjZXB0b3IgaW50ZXJjZXB0b3I7CisKKyAgICBASW5qZWN0CisgICAgcHVibGljIENkaUludGVyY2VwdG9yV3JhcHBlcihCZWFuTWFuYWdlciBiZWFuTWFuYWdlcikgeworICAgICAgICAvLyBnZXQgdGhlIG9yaWdpbmFsIGludGVyY2VwdG9yIGZyb20gdGhlIGJlYW4gbWFuYWdlciBkaXJlY3RseQorICAgICAgICAvLyB0byBhdm9pZCBDREkgYm9vdHN0cmFwIGlzc3VlcyBjYXVzZWQgYnkgd3JvbmcgZXh0ZW5zaW9uIG9yZGVyaW5nCisgICAgICAgIGZpbmFsIFNldDxCZWFuPD8+PiBpbnRlcmNlcHRvckJlYW5zID0gYmVhbk1hbmFnZXIuZ2V0QmVhbnMoVmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzKTsKKyAgICAgICAgZmluYWwgQmVhbjw/PiBpbnRlcmNlcHRvckJlYW4gPSBiZWFuTWFuYWdlci5yZXNvbHZlKGludGVyY2VwdG9yQmVhbnMpOworICAgICAgICB0aGlzLmludGVyY2VwdG9yID0gKFZhbGlkYXRpb25JbnRlcmNlcHRvcikgYmVhbk1hbmFnZXIuZ2V0UmVmZXJlbmNlKAorICAgICAgICAgICAgICAgIGludGVyY2VwdG9yQmVhbiwgVmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzLCBiZWFuTWFuYWdlci5jcmVhdGVDcmVhdGlvbmFsQ29udGV4dChpbnRlcmNlcHRvckJlYW4pKTsKKyAgICB9CisKKyAgICBASW5qZWN0CisgICAgcHJpdmF0ZSBDZGlJbnRlcmNlcHRvcldyYXBwZXJFeHRlbnNpb24gZXh0ZW5zaW9uOworCisgICAgQEFyb3VuZEludm9rZQorICAgIHB1YmxpYyBPYmplY3QgdmFsaWRhdGVNZXRob2RJbnZvY2F0aW9uKEludm9jYXRpb25Db250ZXh0IGN0eCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNKYXhSc01ldGhvZCA9IGV4dGVuc2lvbi5qYXhSc1Jlc291cmNlQ2FjaGUuYXBwbHkoY3R4LmdldE1ldGhvZCgpLmdldERlY2xhcmluZ0NsYXNzKCkpOworICAgICAgICByZXR1cm4gaXNKYXhSc01ldGhvZCA/IGN0eC5wcm9jZWVkKCkgOiBpbnRlcmNlcHRvci52YWxpZGF0ZU1ldGhvZEludm9jYXRpb24oY3R4KTsKKyAgICB9CisKKyAgICBAQXJvdW5kQ29uc3RydWN0CisgICAgcHVibGljIHZvaWQgdmFsaWRhdGVDb25zdHJ1Y3Rvckludm9jYXRpb24oSW52b2NhdGlvbkNvbnRleHQgY3R4KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpc0pheFJzQ29uc3RydWN0b3IgPSBleHRlbnNpb24uamF4UnNSZXNvdXJjZUNhY2hlLmFwcGx5KGN0eC5nZXRDb25zdHJ1Y3RvcigpLmdldERlY2xhcmluZ0NsYXNzKCkpOworICAgICAgICBpZiAoIWlzSmF4UnNDb25zdHJ1Y3RvcikgeworICAgICAgICAgICAgaW50ZXJjZXB0b3IudmFsaWRhdGVDb25zdHJ1Y3Rvckludm9jYXRpb24oY3R4KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9jZGkvamVyc2V5LWNkaTF4LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leHQvY2RpMXgvdmFsaWRhdGlvbi9pbnRlcm5hbC9DZGlJbnRlcmNlcHRvcldyYXBwZXJFeHRlbnNpb24uamF2YSBiL2V4dC9jZGkvamVyc2V5LWNkaTF4LXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leHQvY2RpMXgvdmFsaWRhdGlvbi9pbnRlcm5hbC9DZGlJbnRlcmNlcHRvcldyYXBwZXJFeHRlbnNpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDYxMTEwCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2NkaS9qZXJzZXktY2RpMXgtdmFsaWRhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4dC9jZGkxeC92YWxpZGF0aW9uL2ludGVybmFsL0NkaUludGVyY2VwdG9yV3JhcHBlckV4dGVuc2lvbi5qYXZhCkBAIC0wLDAgKzEsMTcwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkxeC52YWxpZGF0aW9uLmludGVybmFsOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qcmlvcml0eTsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuRGVwZW5kZW50OworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5zcGkuQ3JlYXRpb25hbENvbnRleHQ7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5ldmVudC5PYnNlcnZlczsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5Bbnk7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3QuRGVmYXVsdDsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuQWZ0ZXJCZWFuRGlzY292ZXJ5OworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5BZnRlclR5cGVEaXNjb3Zlcnk7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkFubm90YXRlZFR5cGU7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkJlYW47CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkJlYW5NYW5hZ2VyOworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5CZWZvcmVCZWFuRGlzY292ZXJ5OworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5FeHRlbnNpb247CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkluamVjdGlvblBvaW50OworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5JbmplY3Rpb25UYXJnZXQ7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS51dGlsLkFubm90YXRpb25MaXRlcmFsOworaW1wb3J0IGphdmF4LmludGVyY2VwdG9yLkludGVyY2VwdG9yOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLkNhY2hlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZTsKKworaW1wb3J0IG9yZy5oaWJlcm5hdGUudmFsaWRhdG9yLmludGVybmFsLmNkaS5pbnRlcmNlcHRvci5WYWxpZGF0aW9uSW50ZXJjZXB0b3I7CisKKy8qKgorICogQ0RJIGV4dGVuc2lvbiB0byByZWdpc3RlciB7QGxpbmsgQ2RpSW50ZXJjZXB0b3JXcmFwcGVyfS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUHJpb3JpdHkodmFsdWUgPSBJbnRlcmNlcHRvci5Qcmlvcml0eS5QTEFURk9STV9CRUZPUkUgKyAxOTkpCitwdWJsaWMgY2xhc3MgQ2RpSW50ZXJjZXB0b3JXcmFwcGVyRXh0ZW5zaW9uIGltcGxlbWVudHMgRXh0ZW5zaW9uIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbkxpdGVyYWw8RGVmYXVsdD4gREVGQVVMVF9BTk5PVEFUSU9OX0xJVEVSQUwgPSBuZXcgQW5ub3RhdGlvbkxpdGVyYWw8RGVmYXVsdD4oKSB7fTsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEFubm90YXRpb25MaXRlcmFsPEFueT4gQU5ZX0FOTk9UQVRJT05fTElURVJBTCA9IG5ldyBBbm5vdGF0aW9uTGl0ZXJhbDxBbnk+KCkge307CisKKyAgICBmaW5hbCBDYWNoZTxDbGFzczw/PiwgQm9vbGVhbj4gamF4UnNSZXNvdXJjZUNhY2hlID0gbmV3IENhY2hlPD4oY2xhenogLT4gUmVzb3VyY2UuZnJvbShjbGF6eikgIT0gbnVsbCk7CisKKyAgICBwcml2YXRlIEFubm90YXRlZFR5cGU8VmFsaWRhdGlvbkludGVyY2VwdG9yPiBpbnRlcmNlcHRvckFubm90YXRlZFR5cGU7CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBvdXIgdmFsaWRhdGlvbiBpbnRlcmNlcHRvciB3cmFwcGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGJlZm9yZUJlYW5EaXNjb3ZlcnlFdmVudCBDREkgYm9vdHN0cmFwIGV2ZW50LgorICAgICAqIEBwYXJhbSBiZWFuTWFuYWdlciBjdXJyZW50IGJlYW4gbWFuYWdlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYmVmb3JlQmVhbkRpc2NvdmVyeShAT2JzZXJ2ZXMgQmVmb3JlQmVhbkRpc2NvdmVyeSBiZWZvcmVCZWFuRGlzY292ZXJ5RXZlbnQsIGZpbmFsIEJlYW5NYW5hZ2VyIGJlYW5NYW5hZ2VyKSB7CisgICAgICAgIGJlZm9yZUJlYW5EaXNjb3ZlcnlFdmVudC5hZGRBbm5vdGF0ZWRUeXBlKGJlYW5NYW5hZ2VyLmNyZWF0ZUFubm90YXRlZFR5cGUoQ2RpSW50ZXJjZXB0b3JXcmFwcGVyLmNsYXNzKSk7CisgICAgICAgIGludGVyY2VwdG9yQW5ub3RhdGVkVHlwZSA9IGJlYW5NYW5hZ2VyLmNyZWF0ZUFubm90YXRlZFR5cGUoVmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzKTsKKyAgICAgICAgYmVmb3JlQmVhbkRpc2NvdmVyeUV2ZW50LmFkZEFubm90YXRlZFR5cGUoaW50ZXJjZXB0b3JBbm5vdGF0ZWRUeXBlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmUgdGhlIG9yaWdpbmFsIGludGVyY2VwdG9yLCBhcyB3ZSBhcmUgZ29pbmcgdG8gcHJveHkgdGhlIGNhbGxzIHdpdGgge0BsaW5rIENkaUludGVyY2VwdG9yV3JhcHBlcn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWZ0ZXJUeXBlRGlzY292ZXJ5IENESSBib290c3RyYXAgZXZlbnQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFmdGVyVHlwZURpc2NvdmVyeShAT2JzZXJ2ZXMgZmluYWwgQWZ0ZXJUeXBlRGlzY292ZXJ5IGFmdGVyVHlwZURpc2NvdmVyeSkgeworICAgICAgICBhZnRlclR5cGVEaXNjb3ZlcnkuZ2V0SW50ZXJjZXB0b3JzKCkucmVtb3ZlKFZhbGlkYXRpb25JbnRlcmNlcHRvci5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgYSBDREkgYmVhbiBmb3IgdGhlIG9yaWdpbmFsIGludGVyY2VwdG9yIHNvIHRoYXQgd2UgY2FuIGhhdmUgaXQgaW5qZWN0ZWQgaW4gb3VyIHdyYXBwZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWZ0ZXJCZWFuRGlzY292ZXJ5IENESSBib290c3RyYXAgZXZlbnQuCisgICAgICogQHBhcmFtIGJlYW5NYW5hZ2VyIGN1cnJlbnQgYmVhbiBtYW5hZ2VyCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGFmdGVyQmVhbkRpc2NvdmVyeShAT2JzZXJ2ZXMgQWZ0ZXJCZWFuRGlzY292ZXJ5IGFmdGVyQmVhbkRpc2NvdmVyeSwgQmVhbk1hbmFnZXIgYmVhbk1hbmFnZXIpIHsKKworICAgICAgICAvLyB3ZSBuZWVkIHRoZSBpbmplY3Rpb24gdGFyZ2V0IHNvIHRoYXQgQ0RJIGNvdWxkIGluc3RhbnRpYXRlIHRoZSBvcmlnaW5hbCBpbnRlcmNlcHRvciBmb3IgdXMKKyAgICAgICAgZmluYWwgQW5ub3RhdGVkVHlwZTxWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IGludGVyY2VwdG9yVHlwZSA9IGludGVyY2VwdG9yQW5ub3RhdGVkVHlwZTsKKyAgICAgICAgZmluYWwgSW5qZWN0aW9uVGFyZ2V0PFZhbGlkYXRpb25JbnRlcmNlcHRvcj4gaW50ZXJjZXB0b3JUYXJnZXQgPSBiZWFuTWFuYWdlci5jcmVhdGVJbmplY3Rpb25UYXJnZXQoaW50ZXJjZXB0b3JUeXBlKTsKKworCisgICAgICAgIGFmdGVyQmVhbkRpc2NvdmVyeS5hZGRCZWFuKG5ldyBCZWFuPFZhbGlkYXRpb25JbnRlcmNlcHRvcj4oKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIENsYXNzPD8+IGdldEJlYW5DbGFzcygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTZXQ8SW5qZWN0aW9uUG9pbnQ+IGdldEluamVjdGlvblBvaW50cygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW50ZXJjZXB0b3JUYXJnZXQuZ2V0SW5qZWN0aW9uUG9pbnRzKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgICAgIHJldHVybiAiSGliZXJuYXRlVmFsaWRhdGlvbkludGVyY2VwdG9ySW1wbCI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFNldDxBbm5vdGF0aW9uPiBnZXRRdWFsaWZpZXJzKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSGFzaFNldDxBbm5vdGF0aW9uPigpIHt7CisgICAgICAgICAgICAgICAgICAgIGFkZChERUZBVUxUX0FOTk9UQVRJT05fTElURVJBTCk7CisgICAgICAgICAgICAgICAgICAgIGFkZChBTllfQU5OT1RBVElPTl9MSVRFUkFMKTsKKyAgICAgICAgICAgICAgICB9fTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGdldFNjb3BlKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBEZXBlbmRlbnQuY2xhc3M7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFNldDxDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4+IGdldFN0ZXJlb3R5cGVzKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTZXQ8VHlwZT4gZ2V0VHlwZXMoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIYXNoU2V0PFR5cGU+KCkge3sKKyAgICAgICAgICAgICAgICAgICAgYWRkKFZhbGlkYXRpb25JbnRlcmNlcHRvci5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIGFkZChPYmplY3QuY2xhc3MpOworICAgICAgICAgICAgICAgIH19OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQWx0ZXJuYXRpdmUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzTnVsbGFibGUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBWYWxpZGF0aW9uSW50ZXJjZXB0b3IgY3JlYXRlKENyZWF0aW9uYWxDb250ZXh0PFZhbGlkYXRpb25JbnRlcmNlcHRvcj4gY3R4KSB7CisKKyAgICAgICAgICAgICAgICBmaW5hbCBWYWxpZGF0aW9uSW50ZXJjZXB0b3IgcmVzdWx0ID0gaW50ZXJjZXB0b3JUYXJnZXQucHJvZHVjZShjdHgpOworICAgICAgICAgICAgICAgIGludGVyY2VwdG9yVGFyZ2V0LmluamVjdChyZXN1bHQsIGN0eCk7CisgICAgICAgICAgICAgICAgaW50ZXJjZXB0b3JUYXJnZXQucG9zdENvbnN0cnVjdChyZXN1bHQpOworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBkZXN0cm95KFZhbGlkYXRpb25JbnRlcmNlcHRvciBpbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRpb25hbENvbnRleHQ8VmFsaWRhdGlvbkludGVyY2VwdG9yPiBjdHgpIHsKKworICAgICAgICAgICAgICAgIGludGVyY2VwdG9yVGFyZ2V0LnByZURlc3Ryb3koaW5zdGFuY2UpOworICAgICAgICAgICAgICAgIGludGVyY2VwdG9yVGFyZ2V0LmRpc3Bvc2UoaW5zdGFuY2UpOworICAgICAgICAgICAgICAgIGN0eC5yZWxlYXNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9jZGkvamVyc2V5LWNkaTF4LXZhbGlkYXRpb24vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL2phdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5FeHRlbnNpb24gYi9leHQvY2RpL2plcnNleS1jZGkxeC12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9qYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuRXh0ZW5zaW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZGY5ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvY2RpL2plcnNleS1jZGkxeC12YWxpZGF0aW9uL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9qYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuRXh0ZW5zaW9uCkBAIC0wLDAgKzEgQEAKK29yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkxeC52YWxpZGF0aW9uLmludGVybmFsLkNkaUludGVyY2VwdG9yV3JhcHBlckV4dGVuc2lvbgpkaWZmIC0tZ2l0IGEvZXh0L2NkaS9qZXJzZXktY2RpMXgvcG9tLnhtbCBiL2V4dC9jZGkvamVyc2V5LWNkaTF4L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFlZjM2MAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9jZGkvamVyc2V5LWNkaTF4L3BvbS54bWwKQEAgLTAsMCArMSwxMDIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmplcnNleS1jZGkxeDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS1leHQtY2RpMXg8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+SmVyc2V5IENESSAxLjEgaW50ZWdyYXRpb248L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktaGsyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguZW50ZXJwcmlzZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmNkaS1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXNlcnZlcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5qbW9ja2l0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+am1vY2tpdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi5pc3RhY2s8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4taXN0YWNrLWNvbW1vbnMtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJ1aWxkLWhlbHBlci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5mZWxpeDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1idW5kbGUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxleHRlbnNpb25zPnRydWU8L2V4dGVuc2lvbnM+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxpbnN0cnVjdGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8RXhwb3J0LVBhY2thZ2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTF4LnNwaSxvcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpMXguaW50ZXJuYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTF4LmludGVybmFsLnNwaQorICAgICAgICAgICAgICAgICAgICAgICAgPC9FeHBvcnQtUGFja2FnZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxfdmVyc2lvbnBvbGljeT5bJCh2ZXJzaW9uOz09OyQoQCkpLCQodmVyc2lvbjsrOyQoQCkpKTwvX3ZlcnNpb25wb2xpY3k+CisgICAgICAgICAgICAgICAgICAgICAgICA8X25vZGVmYXVsdHZlcnNpb24+ZmFsc2U8L19ub2RlZmF1bHR2ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICA8L2luc3RydWN0aW9ucz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+b3NnaS1idW5kbGU8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmJ1bmRsZTwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXh0L2NkaS9qZXJzZXktY2RpMXgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leHQvY2RpMXgvaW50ZXJuYWwvQWJzdHJhY3RDZGlCZWFuU3VwcGxpZXIuamF2YSBiL2V4dC9jZGkvamVyc2V5LWNkaTF4L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXh0L2NkaTF4L2ludGVybmFsL0Fic3RyYWN0Q2RpQmVhblN1cHBsaWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYyYzZhNQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9jZGkvamVyc2V5LWNkaTF4L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXh0L2NkaTF4L2ludGVybmFsL0Fic3RyYWN0Q2RpQmVhblN1cHBsaWVyLmphdmEKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTF4LmludGVybmFsOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuc3BpLkNyZWF0aW9uYWxDb250ZXh0OworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5Bbm5vdGF0ZWRUeXBlOworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5CZWFuOworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5CZWFuTWFuYWdlcjsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuSW5qZWN0aW9uVGFyZ2V0OworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5JbmplY3Rpb25UYXJnZXRGYWN0b3J5OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkRpc3Bvc2FibGVTdXBwbGllcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKKworLyoqCisgKiBBYnN0cmFjdCBzdXBwbGllciB0byBwcm92aWRlIENESSBjb21wb25lbnRzIG9idGFpbmVkIGZyb20gQ0RJIGJlYW4gbWFuYWdlci4KKyAqIFRoZSBmYWN0b3J5IGhhbmRsZXMgQ0RJIG1hbmFnZWQgY29tcG9uZW50cyBhcyB3ZWxsIGFzIG5vbi1jb250ZXh0dWFsIG1hbmFnZWQgYmVhbnMuCisgKiBUbyBzcGVjaWZ5IHNjb3BlIG9mIHByb3ZpZGVkIENESSBiZWFucywgYW4gZXh0ZW5zaW9uIG9mIHRoaXMgc3VwcGxpZXIKKyAqIHNob3VsZCBpbXBsZW1lbnQgcHJvcGVybHkgYW5ub3RhdGVkIHtAbGluayBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXIjZ2V0KCl9IG1ldGhvZCB0aGF0CisgKiBjb3VsZCBqdXN0IGRlbGVnYXRlIHRvIHRoZSBleGlzdGluZyB7QGxpbmsgI19wcm92aWRlKCl9IG1ldGhvZC4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDZGlCZWFuU3VwcGxpZXI8VD4gaW1wbGVtZW50cyBEaXNwb3NhYmxlU3VwcGxpZXI8VD4geworCisgICAgZmluYWwgQ2xhc3M8VD4gY2xheno7CisgICAgZmluYWwgSW5zdGFuY2VNYW5hZ2VyPFQ+IHJlZmVyZW5jZVByb3ZpZGVyOworICAgIGZpbmFsIEFubm90YXRpb25bXSBxdWFsaWZpZXJzOworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgZmFjdG9yeSBpbnN0YW5jZSBmb3IgZ2l2ZW4gdHlwZSBhbmQgYmVhbiBtYW5hZ2VyLgorICAgICAqCisgICAgICogQHBhcmFtIHJhd1R5cGUgICAgICAgICAgdHlwZSBvZiB0aGUgY29tcG9uZW50cyB0byBwcm92aWRlLgorICAgICAqIEBwYXJhbSBpbmplY3Rpb25NYW5hZ2VyIGFjdHVhbCBpbmplY3Rpb24gbWFuYWdlciBpbnN0YW5jZS4KKyAgICAgKiBAcGFyYW0gYmVhbk1hbmFnZXIgICAgICBjdXJyZW50IGJlYW4gbWFuYWdlciB0byBnZXQgcmVmZXJlbmNlcyBmcm9tLgorICAgICAqIEBwYXJhbSBjZGlNYW5hZ2VkICAgICAgIHNldCB0byB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGNvbXBvbmVudCBzaG91bGQgYmUgbWFuYWdlZCBieSBDREkuCisgICAgICovCisgICAgcHVibGljIEFic3RyYWN0Q2RpQmVhblN1cHBsaWVyKGZpbmFsIENsYXNzPFQ+IHJhd1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEJlYW5NYW5hZ2VyIGJlYW5NYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gY2RpTWFuYWdlZCkgeworCisgICAgICAgIHRoaXMuY2xhenogPSByYXdUeXBlOworICAgICAgICB0aGlzLnF1YWxpZmllcnMgPSBDZGlVdGlsLmdldFF1YWxpZmllcnMoY2xhenouZ2V0QW5ub3RhdGlvbnMoKSk7CisgICAgICAgIHRoaXMucmVmZXJlbmNlUHJvdmlkZXIgPSBjZGlNYW5hZ2VkID8gbmV3IEluc3RhbmNlTWFuYWdlcjxUPigpIHsKKworICAgICAgICAgICAgZmluYWwgSXRlcmF0b3I8QmVhbjw/Pj4gYmVhbnMgPSBiZWFuTWFuYWdlci5nZXRCZWFucyhjbGF6eiwgcXVhbGlmaWVycykuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIGZpbmFsIEJlYW4gYmVhbiA9IGJlYW5zLmhhc05leHQoKSA/IGJlYW5zLm5leHQoKSA6IG51bGw7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFQgZ2V0SW5zdGFuY2UoZmluYWwgQ2xhc3M8VD4gY2xhenopIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGJlYW4gIT0gbnVsbCkgPyBDZGlVdGlsLmdldEJlYW5SZWZlcmVuY2UoY2xhenosIGJlYW4sIGJlYW5NYW5hZ2VyKSA6IG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcHJlRGVzdHJveShmaW5hbCBUIGluc3RhbmNlKSB7CisgICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZworICAgICAgICAgICAgfQorICAgICAgICB9IDogbmV3IEluc3RhbmNlTWFuYWdlcjxUPigpIHsKKworICAgICAgICAgICAgZmluYWwgQW5ub3RhdGVkVHlwZTxUPiBhbm5vdGF0ZWRUeXBlID0gYmVhbk1hbmFnZXIuY3JlYXRlQW5ub3RhdGVkVHlwZShjbGF6eik7CisgICAgICAgICAgICBmaW5hbCBJbmplY3Rpb25UYXJnZXRGYWN0b3J5PFQ+IGluamVjdGlvblRhcmdldEZhY3RvcnkgPSBiZWFuTWFuYWdlci5nZXRJbmplY3Rpb25UYXJnZXRGYWN0b3J5KGFubm90YXRlZFR5cGUpOworICAgICAgICAgICAgZmluYWwgSW5qZWN0aW9uVGFyZ2V0PFQ+IGluamVjdGlvblRhcmdldCA9IGluamVjdGlvblRhcmdldEZhY3RvcnkuY3JlYXRlSW5qZWN0aW9uVGFyZ2V0KG51bGwpOworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBUIGdldEluc3RhbmNlKGZpbmFsIENsYXNzPFQ+IGNsYXp6KSB7CisgICAgICAgICAgICAgICAgZmluYWwgQ3JlYXRpb25hbENvbnRleHQ8VD4gY3JlYXRpb25hbENvbnRleHQgPSBiZWFuTWFuYWdlci5jcmVhdGVDcmVhdGlvbmFsQ29udGV4dChudWxsKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBUIGluc3RhbmNlID0gaW5qZWN0aW9uVGFyZ2V0LnByb2R1Y2UoY3JlYXRpb25hbENvbnRleHQpOworICAgICAgICAgICAgICAgIGluamVjdGlvblRhcmdldC5pbmplY3QoaW5zdGFuY2UsIGNyZWF0aW9uYWxDb250ZXh0KTsKKyAgICAgICAgICAgICAgICBpZiAoaW5qZWN0aW9uTWFuYWdlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGluamVjdGlvbk1hbmFnZXIuaW5qZWN0KGluc3RhbmNlLCBDZGlDb21wb25lbnRQcm92aWRlci5DRElfQ0xBU1NfQU5BTFlaRVIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbmplY3Rpb25UYXJnZXQucG9zdENvbnN0cnVjdChpbnN0YW5jZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByZURlc3Ryb3koZmluYWwgVCBpbnN0YW5jZSkgeworICAgICAgICAgICAgICAgIGluamVjdGlvblRhcmdldC5wcmVEZXN0cm95KGluc3RhbmNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh2YWx1ZSA9ICJ1bmNoZWNrZWQiKQorICAgIC8qIHBhY2thZ2UgKi8gVCBfcHJvdmlkZSgpIHsKKyAgICAgICAgZmluYWwgVCBpbnN0YW5jZSA9IHJlZmVyZW5jZVByb3ZpZGVyLmdldEluc3RhbmNlKGNsYXp6KTsKKyAgICAgICAgaWYgKGluc3RhbmNlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5DRElfTE9PS1VQX0ZBSUxFRChjbGF6eikpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoZmluYWwgVCBpbnN0YW5jZSkgeworICAgICAgICByZWZlcmVuY2VQcm92aWRlci5wcmVEZXN0cm95KGluc3RhbmNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludGVyZmFjZSBJbnN0YW5jZU1hbmFnZXI8VD4geworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgbWUgY29ycmVjdGx5IGluc3RhbnRpYXRlZCBhbmQgaW5qZWN0ZWQgaW5zdGFuY2UuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjbGF6eiB0eXBlIG9mIHRoZSBjb21wb25lbnQgdG8gaW5zdGFudGlhdGUuCisgICAgICAgICAqIEByZXR1cm4gaW5qZWN0ZWQgY29tcG9uZW50IGluc3RhbmNlLgorICAgICAgICAgKi8KKyAgICAgICAgVCBnZXRJbnN0YW5jZShDbGFzczxUPiBjbGF6eik7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIERvIHdoYXRldmVyIG5lZWRzIHRvIGJlIGRvbmUgYmVmb3JlIGdpdmVuIGluc3RhbmNlIGlzIGRlc3Ryb3llZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGluc3RhbmNlIHRvIGJlIGRlc3Ryb3llZC4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgcHJlRGVzdHJveShUIGluc3RhbmNlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvY2RpL2plcnNleS1jZGkxeC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4dC9jZGkxeC9pbnRlcm5hbC9DZGlDb21wb25lbnRQcm92aWRlci5qYXZhIGIvZXh0L2NkaS9qZXJzZXktY2RpMXgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leHQvY2RpMXgvaW50ZXJuYWwvQ2RpQ29tcG9uZW50UHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGIyMTI2Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2NkaS9qZXJzZXktY2RpMXgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leHQvY2RpMXgvaW50ZXJuYWwvQ2RpQ29tcG9uZW50UHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDk0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpMXguaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWVtYmVyOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5QYXJhbWV0ZXJpemVkVHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5NYW5hZ2VkQmVhbjsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5OworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5BcHBsaWNhdGlvblNjb3BlZDsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuRGVwZW5kZW50OworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5SZXF1ZXN0U2NvcGVkOworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5zcGkuQ3JlYXRpb25hbENvbnRleHQ7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5ldmVudC5PYnNlcnZlczsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5EZWZhdWx0OworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5BZnRlckJlYW5EaXNjb3Zlcnk7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkFmdGVyVHlwZURpc2NvdmVyeTsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuQW5ub3RhdGVkOworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5Bbm5vdGF0ZWRDYWxsYWJsZTsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuQW5ub3RhdGVkQ29uc3RydWN0b3I7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkFubm90YXRlZFBhcmFtZXRlcjsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuQW5ub3RhdGVkVHlwZTsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuQmVhbjsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuQmVhbk1hbmFnZXI7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkJlZm9yZUJlYW5EaXNjb3Zlcnk7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkV4dGVuc2lvbjsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuSW5qZWN0aW9uUG9pbnQ7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkluamVjdGlvblRhcmdldDsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuUHJvY2Vzc0Fubm90YXRlZFR5cGU7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLlByb2Nlc3NJbmplY3Rpb25UYXJnZXQ7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS51dGlsLkFubm90YXRpb25MaXRlcmFsOworaW1wb3J0IGphdmF4LmluamVjdC5RdWFsaWZpZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpMXguaW50ZXJuYWwuc3BpLkluamVjdGlvbk1hbmFnZXJJbmplY3RlZFRhcmdldDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpMXguaW50ZXJuYWwuc3BpLkluamVjdGlvbk1hbmFnZXJTdG9yZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpMXguaW50ZXJuYWwuc3BpLkluamVjdGlvblRhcmdldExpc3RlbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkxeC5zcGkuSGsyQ3VzdG9tQm91bmRUeXBlc1Byb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5BYnN0cmFjdEJpbmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5CaW5kaW5nczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuRm9yZWlnblJlcXVlc3RTY29wZUJyaWRnZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5zdGFuY2VCaW5kaW5nOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5Qcm92aWRlcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LlN1cHBsaWVySW5zdGFuY2VCaW5kaW5nOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5DYWNoZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUGFyYW1ldGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbXBvbmVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuaW50ZXJuYWwuVmFsdWVQYXJhbVByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIuYXBpLkNsYXNzQW5hbHl6ZXI7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuUEFSQU1FVEVSOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKKworLyoqCisgKiBKZXJzZXkgQ0RJIGludGVncmF0aW9uIGltcGxlbWVudGF0aW9uLgorICogSW1wbGVtZW50cyB7QGxpbmsgQ29tcG9uZW50UHJvdmlkZXIgSmVyc2V5IGNvbXBvbmVudCBwcm92aWRlcn0gdG8gc2VydmUgQ0RJIGJlYW5zCisgKiBvYnRhaW5lZCBmcm9tIHRoZSBhY3R1YWwgQ0RJIGJlYW4gbWFuYWdlci4KKyAqIFRvIHByb3Blcmx5IGluamVjdCBKQVgtUlMvSmVyc2V5IG1hbmFnZWQgYmVhbnMgaW50byBDREksIGl0IGFsc28KKyAqIHNlcnZlcyBhcyBhIHtAbGluayBFeHRlbnNpb24gQ0RJIEV4dGVuc2lvbn0sIHRoYXQgaW50ZXJjZXB0cyBDREkgaW5qZWN0aW9uIHRhcmdldHMuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFByaW9yaXR5KDIwMCkKK3B1YmxpYyBjbGFzcyBDZGlDb21wb25lbnRQcm92aWRlciBpbXBsZW1lbnRzIENvbXBvbmVudFByb3ZpZGVyLCBFeHRlbnNpb24geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoQ2RpQ29tcG9uZW50UHJvdmlkZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIC8qKgorICAgICAqIGFubm90YXRpb24gdHlwZXMgdGhhdCBkaXN0aW5ndWlzaCB0aGUgY2xhc3NlcyB0byBiZSBhZGRlZCB0byB7QGxpbmsgI2pheHJzSW5qZWN0YWJsZVR5cGVzfQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4+IEpBWF9SU19JTkpFQ1RfQU5OT1RBVElPTlMgPQorICAgICAgICAgICAgbmV3IEhhc2hTZXQ8Q2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+PigpIHt7CisgICAgICAgICAgICAgICAgYWRkQWxsKEpheFJzUGFyYW1Qcm9kdWNlci5KQVhfUlNfU1RSSU5HX1BBUkFNX0FOTk9UQVRJT05TKTsKKyAgICAgICAgICAgICAgICBhZGQoQ29udGV4dC5jbGFzcyk7CisgICAgICAgICAgICB9fTsKKworICAgIC8qKgorICAgICAqIE5hbWUgdG8gYmUgdXNlZCB3aGVuIGJpbmRpbmcgQ0RJIGluamVjdGVlIHNraXBwaW5nIGNsYXNzIGFuYWx5emVyIHRvIEhLMiBzZXJ2aWNlIGluamVjdGlvbiBtYW5hZ2VyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENESV9DTEFTU19BTkFMWVpFUiA9ICJDZGlJbmplY3RlZVNraXBwaW5nQ2xhc3NBbmFseXplciI7CisKKyAgICAvKioKKyAgICAgKiBzZXQgb2Ygbm9uIEpBWC1SUyBjb21wb25lbnRzIGNvbnRhaW5pbmcgSkFYLVJTIGluamVjdGlvbiBwb2ludHMKKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIFNldDxUeXBlPiBqYXhyc0luamVjdGFibGVUeXBlcyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICBwcml2YXRlIGZpbmFsIFNldDxUeXBlPiBoazJQcm92aWRlZFR5cGVzID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkU2V0KG5ldyBIYXNoU2V0PFR5cGU+KCkpOworICAgIHByaXZhdGUgZmluYWwgU2V0PFR5cGU+IGplcnNleVZldG9lZFR5cGVzID0gQ29sbGVjdGlvbnMuc3luY2hyb25pemVkU2V0KG5ldyBIYXNoU2V0PFR5cGU+KCkpOworCisgICAgLyoqCisgICAgICogc2V0IG9mIHJlcXVlc3Qgc2NvcGVkIGNvbXBvbmVudHMKKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIFNldDxDbGFzczw/Pj4gcmVxdWVzdFNjb3BlZENvbXBvbmVudHMgPSBuZXcgSGFzaFNldDw+KCk7CisKKworICAgIHByaXZhdGUgZmluYWwgQ2FjaGU8Q2xhc3M8Pz4sIEJvb2xlYW4+IGpheFJzQ29tcG9uZW50Q2FjaGUgPSBuZXcgQ2FjaGU8PihuZXcgRnVuY3Rpb248Q2xhc3M8Pz4sIEJvb2xlYW4+KCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJvb2xlYW4gYXBwbHkoZmluYWwgQ2xhc3M8Pz4gY2xhenopIHsKKyAgICAgICAgICAgIHJldHVybiBBcHBsaWNhdGlvbi5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNsYXp6KQorICAgICAgICAgICAgICAgICAgICB8fCBQcm92aWRlcnMuaXNKYXhSc1Byb3ZpZGVyKGNsYXp6KQorICAgICAgICAgICAgICAgICAgICB8fCBqYXhSc1Jlc291cmNlQ2FjaGUuYXBwbHkoY2xhenopOworICAgICAgICB9CisgICAgfSk7CisKKyAgICBwcml2YXRlIGZpbmFsIENhY2hlPENsYXNzPD8+LCBCb29sZWFuPiBqYXhSc1Jlc291cmNlQ2FjaGUgPSBuZXcgQ2FjaGU8PihjbGF6eiAtPiBSZXNvdXJjZS5mcm9tKGNsYXp6KSAhPSBudWxsKTsKKworICAgIHByaXZhdGUgZmluYWwgSGsyQ3VzdG9tQm91bmRUeXBlc1Byb3ZpZGVyIGN1c3RvbUhrMlR5cGVzUHJvdmlkZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBJbmplY3Rpb25NYW5hZ2VyU3RvcmUgaW5qZWN0aW9uTWFuYWdlclN0b3JlOworCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXI7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuQmVhbk1hbmFnZXIgYmVhbk1hbmFnZXI7CisKKyAgICBwcml2YXRlIHZvbGF0aWxlIE1hcDxDbGFzczw/PiwgU2V0PE1ldGhvZD4+IG1ldGhvZHNUb1NraXAgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBNYXA8Q2xhc3M8Pz4sIFNldDxGaWVsZD4+IGZpZWxkc1RvU2tpcCA9IG5ldyBIYXNoTWFwPD4oKTsKKworICAgIHB1YmxpYyBDZGlDb21wb25lbnRQcm92aWRlcigpIHsKKyAgICAgICAgY3VzdG9tSGsyVHlwZXNQcm92aWRlciA9IENkaVV0aWwubG9va3VwU2VydmljZShIazJDdXN0b21Cb3VuZFR5cGVzUHJvdmlkZXIuY2xhc3MpOworICAgICAgICBpbmplY3Rpb25NYW5hZ2VyU3RvcmUgPSBDZGlVdGlsLmNyZWF0ZUhrMkluamVjdGlvbk1hbmFnZXJTdG9yZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoZmluYWwgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyKSB7CisgICAgICAgIHRoaXMuaW5qZWN0aW9uTWFuYWdlciA9IGluamVjdGlvbk1hbmFnZXI7CisgICAgICAgIHRoaXMuYmVhbk1hbmFnZXIgPSBDZGlVdGlsLmdldEJlYW5NYW5hZ2VyKCk7CisKKyAgICAgICAgaWYgKGJlYW5NYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIFRyeSB0byBnZXQgQ2RpQ29tcG9uZW50UHJvdmlkZXIgY3JlYXRlZCBieSBDREkuCisgICAgICAgICAgICBmaW5hbCBDZGlDb21wb25lbnRQcm92aWRlciBleHRlbnNpb24gPSBiZWFuTWFuYWdlci5nZXRFeHRlbnNpb24oQ2RpQ29tcG9uZW50UHJvdmlkZXIuY2xhc3MpOworCisgICAgICAgICAgICBpZiAoZXh0ZW5zaW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBleHRlbnNpb24uYWRkSW5qZWN0aW9uTWFuYWdlcih0aGlzLmluamVjdGlvbk1hbmFnZXIpOworCisgICAgICAgICAgICAgICAgdGhpcy5maWVsZHNUb1NraXAgPSBleHRlbnNpb24uZ2V0RmllbGRzVG9Ta2lwKCk7CisgICAgICAgICAgICAgICAgdGhpcy5tZXRob2RzVG9Ta2lwID0gZXh0ZW5zaW9uLmdldE1ldGhvZHNUb1NraXAoKTsKKworICAgICAgICAgICAgICAgIGJpbmRIazJDbGFzc0FuYWx5emVyKCk7CisKKyAgICAgICAgICAgICAgICBMT0dHRVIuY29uZmlnKExvY2FsaXphdGlvbk1lc3NhZ2VzLkNESV9QUk9WSURFUl9JTklUSUFMSVpFRCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENESSBwcm9kdWNlciBmb3IgQ0RJIGJlYW4gY29uc3RydWN0b3IgU3RyaW5nIHBhcmFtZXRlcnMsIHRoYXQgc2hvdWxkIGJlIGluamVjdGVkIGJ5IEpBWC1SUy4KKyAgICAgKi8KKyAgICBAQXBwbGljYXRpb25TY29wZWQKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpheFJzUGFyYW1Qcm9kdWNlciB7CisKKyAgICAgICAgQFF1YWxpZmllcgorICAgICAgICBAUmV0ZW50aW9uKFJVTlRJTUUpCisgICAgICAgIEBUYXJnZXQoe01FVEhPRCwgRklFTEQsIFBBUkFNRVRFUiwgVFlQRX0pCisgICAgICAgIHB1YmxpYyBzdGF0aWMgQGludGVyZmFjZSBKYXhSc1BhcmFtUXVhbGlmaWVyIHsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEpheFJzUGFyYW1RdWFsaWZpZXIgSmF4UnNQYXJhbVFVQUxJRklFUiA9IG5ldyBKYXhSc1BhcmFtUXVhbGlmaWVyKCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gYW5ub3RhdGlvblR5cGUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEpheFJzUGFyYW1RdWFsaWZpZXIuY2xhc3M7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgc3RhdGljIGZpbmFsIFNldDxDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4+IEpBWF9SU19TVFJJTkdfUEFSQU1fQU5OT1RBVElPTlMgPQorICAgICAgICAgICAgICAgIG5ldyBIYXNoU2V0PENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPj4oKSB7eworICAgICAgICAgICAgICAgICAgICBhZGQoamF2YXgud3MucnMuUGF0aFBhcmFtLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgYWRkKGphdmF4LndzLnJzLlF1ZXJ5UGFyYW0uY2xhc3MpOworICAgICAgICAgICAgICAgICAgICBhZGQoamF2YXgud3MucnMuQ29va2llUGFyYW0uY2xhc3MpOworICAgICAgICAgICAgICAgICAgICBhZGQoamF2YXgud3MucnMuSGVhZGVyUGFyYW0uY2xhc3MpOworICAgICAgICAgICAgICAgICAgICBhZGQoamF2YXgud3MucnMuTWF0cml4UGFyYW0uY2xhc3MpOworICAgICAgICAgICAgICAgICAgICBhZGQoamF2YXgud3MucnMuRm9ybVBhcmFtLmNsYXNzKTsKKyAgICAgICAgICAgICAgICB9fTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSW50ZXJuYWwgY2FjaGUgdG8gc3RvcmUgQ0RJIHtAbGluayBJbmplY3Rpb25Qb2ludH0gdG8gSmVyc2V5IHtAbGluayBQYXJhbWV0ZXJ9IG1hcHBpbmcuCisgICAgICAgICAqLworICAgICAgICBmaW5hbCBDYWNoZTxJbmplY3Rpb25Qb2ludCwgUGFyYW1ldGVyPiBwYXJhbWV0ZXJDYWNoZSA9IG5ldyBDYWNoZTw+KGluamVjdGlvblBvaW50IC0+IHsKKyAgICAgICAgICAgIGZpbmFsIEFubm90YXRlZCBhbm5vdGF0ZWQgPSBpbmplY3Rpb25Qb2ludC5nZXRBbm5vdGF0ZWQoKTsKKyAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IGNsYXp6ID0gaW5qZWN0aW9uUG9pbnQuZ2V0TWVtYmVyKCkuZ2V0RGVjbGFyaW5nQ2xhc3MoKTsKKworICAgICAgICAgICAgaWYgKGFubm90YXRlZCBpbnN0YW5jZW9mIEFubm90YXRlZFBhcmFtZXRlcikgeworCisgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGVkUGFyYW1ldGVyIGFubm90YXRlZFBhcmFtZXRlciA9IChBbm5vdGF0ZWRQYXJhbWV0ZXIpIGFubm90YXRlZDsKKyAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0ZWRDYWxsYWJsZSBjYWxsYWJsZSA9IGFubm90YXRlZFBhcmFtZXRlci5nZXREZWNsYXJpbmdDYWxsYWJsZSgpOworCisgICAgICAgICAgICAgICAgaWYgKGNhbGxhYmxlIGluc3RhbmNlb2YgQW5ub3RhdGVkQ29uc3RydWN0b3IpIHsKKworICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0ZWRDb25zdHJ1Y3RvciBhYyA9IChBbm5vdGF0ZWRDb25zdHJ1Y3RvcikgY2FsbGFibGU7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBwb3NpdGlvbiA9IGFubm90YXRlZFBhcmFtZXRlci5nZXRQb3NpdGlvbigpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PFBhcmFtZXRlcj4gcGFyYW1ldGVycyA9IFBhcmFtZXRlci5jcmVhdGUoY2xhenosIGNsYXp6LCBhYy5nZXRKYXZhTWVtYmVyKCksIGZhbHNlKTsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW1ldGVycy5nZXQocG9zaXRpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0pOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBQcm92aWRlIGEgdmFsdWUgZm9yIGdpdmVuIGluamVjdGlvbiBwb2ludC4gSWYgdGhlIGluamVjdGlvbiBwb2ludCBkb2VzIG5vdCByZWZlcgorICAgICAgICAgKiB0byBhIENESSBiZWFuIGNvbnN0cnVjdG9yIHBhcmFtZXRlciwgb3IgdGhlIHZhbHVlIGNvdWxkIG5vdCBiZSBmb3VuZCwgdGhlIG1ldGhvZCB3aWxsIHJldHVybiBudWxsLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gaW5qZWN0aW9uUG9pbnQgYWN0dWFsIGluamVjdGlvbiBwb2ludC4KKyAgICAgICAgICogQHBhcmFtIGJlYW5NYW5hZ2VyICAgIGN1cnJlbnQgYXBwbGljYXRpb24gYmVhbiBtYW5hZ2VyLgorICAgICAgICAgKiBAcmV0dXJuIGNvbmNyZXRlIEpBWC1SUyBwYXJhbWV0ZXIgdmFsdWUgZm9yIGdpdmVuIGluamVjdGlvbiBwb2ludC4KKyAgICAgICAgICovCisgICAgICAgIEBqYXZheC5lbnRlcnByaXNlLmluamVjdC5Qcm9kdWNlcworICAgICAgICBASmF4UnNQYXJhbVF1YWxpZmllcgorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtZXRlclZhbHVlKGZpbmFsIEluamVjdGlvblBvaW50IGluamVjdGlvblBvaW50LCBmaW5hbCBCZWFuTWFuYWdlciBiZWFuTWFuYWdlcikgeworICAgICAgICAgICAgZmluYWwgUGFyYW1ldGVyIHBhcmFtZXRlciA9IHBhcmFtZXRlckNhY2hlLmFwcGx5KGluamVjdGlvblBvaW50KTsKKworICAgICAgICAgICAgaWYgKHBhcmFtZXRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJlYW5NYW5hZ2VyLmdldEV4dGVuc2lvbihDZGlDb21wb25lbnRQcm92aWRlci5jbGFzcykuZ2V0RWZmZWN0aXZlSW5qZWN0aW9uTWFuYWdlcigpOworCisgICAgICAgICAgICAgICAgU2V0PFZhbHVlUGFyYW1Qcm92aWRlcj4gcHJvdmlkZXJzID0gUHJvdmlkZXJzLmdldFByb3ZpZGVycyhpbmplY3Rpb25NYW5hZ2VyLCBWYWx1ZVBhcmFtUHJvdmlkZXIuY2xhc3MpOworICAgICAgICAgICAgICAgIENvbnRhaW5lclJlcXVlc3QgY29udGFpbmVyUmVxdWVzdCA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoQ29udGFpbmVyUmVxdWVzdC5jbGFzcyk7CisgICAgICAgICAgICAgICAgZm9yIChWYWx1ZVBhcmFtUHJvdmlkZXIgdmZwIDogcHJvdmlkZXJzKSB7CisgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uPENvbnRhaW5lclJlcXVlc3QsID8+IHBhcmFtVmFsdWVTdXBwbGllciA9IHZmcC5nZXRWYWx1ZVByb3ZpZGVyKHBhcmFtZXRlcik7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbVZhbHVlU3VwcGxpZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIHBhcmFtVmFsdWVTdXBwbGllci5hcHBseShjb250YWluZXJSZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBiaW5kKGZpbmFsIENsYXNzPD8+IGNsYXp6LCBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IHByb3ZpZGVyQ29udHJhY3RzKSB7CisgICAgICAgIGlmIChMT0dHRVIuaXNMb2dnYWJsZShMZXZlbC5GSU5FKSkgeworICAgICAgICAgICAgTE9HR0VSLmZpbmUoTG9jYWxpemF0aW9uTWVzc2FnZXMuQ0RJX0NMQVNTX0JFSU5HX0NIRUNLRUQoY2xhenopKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChiZWFuTWFuYWdlciA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNKZXJzZXlPckRlcGVuZGVuY3lUeXBlKGNsYXp6KSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpc0NkaU1hbmFnZWQgPSBpc0NkaUNvbXBvbmVudChjbGF6eik7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNNYW5hZ2VkQmVhbiA9IGlzTWFuYWdlZEJlYW4oY2xhenopOworICAgICAgICBmaW5hbCBib29sZWFuIGlzSmF4UnNDb21wb25lbnQgPSBpc0pheFJzQ29tcG9uZW50VHlwZShjbGF6eik7CisKKyAgICAgICAgaWYgKCFpc0NkaU1hbmFnZWQgJiYgIWlzTWFuYWdlZEJlYW4gJiYgIWlzSmF4UnNDb21wb25lbnQpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNKYXhSc1Jlc291cmNlID0gamF4UnNSZXNvdXJjZUNhY2hlLmFwcGx5KGNsYXp6KTsKKworICAgICAgICBmaW5hbCBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gYmVhblNjb3BlQW5ub3RhdGlvbiA9IENkaVV0aWwuZ2V0QmVhblNjb3BlKGNsYXp6LCBiZWFuTWFuYWdlcik7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNSZXF1ZXN0U2NvcGVkID0gYmVhblNjb3BlQW5ub3RhdGlvbiA9PSBSZXF1ZXN0U2NvcGVkLmNsYXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGJlYW5TY29wZUFubm90YXRpb24gPT0gRGVwZW5kZW50LmNsYXNzICYmIGlzSmF4UnNSZXNvdXJjZSk7CisKKyAgICAgICAgU3VwcGxpZXI8QWJzdHJhY3RDZGlCZWFuU3VwcGxpZXI+IGJlYW5GYWN0b3J5ID0gaXNSZXF1ZXN0U2NvcGVkCisgICAgICAgICAgICAgICAgPyBuZXcgUmVxdWVzdFNjb3BlZENkaUJlYW5TdXBwbGllcihjbGF6eiwgaW5qZWN0aW9uTWFuYWdlciwgYmVhbk1hbmFnZXIsIGlzQ2RpTWFuYWdlZCkKKyAgICAgICAgICAgICAgICA6IG5ldyBHZW5lcmljQ2RpQmVhblN1cHBsaWVyKGNsYXp6LCBpbmplY3Rpb25NYW5hZ2VyLCBiZWFuTWFuYWdlciwgaXNDZGlNYW5hZ2VkKTsKKworICAgICAgICBTdXBwbGllckluc3RhbmNlQmluZGluZzxBYnN0cmFjdENkaUJlYW5TdXBwbGllcj4gYnVpbGRlciA9IEJpbmRpbmdzLnN1cHBsaWVyKGJlYW5GYWN0b3J5KS50byhjbGF6eik7CisgICAgICAgIGZvciAoZmluYWwgQ2xhc3MgY29udHJhY3QgOiBwcm92aWRlckNvbnRyYWN0cykgeworICAgICAgICAgICAgYnVpbGRlci50byhjb250cmFjdCk7CisgICAgICAgIH0KKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5yZWdpc3RlcihidWlsZGVyKTsKKworICAgICAgICBpZiAoaXNSZXF1ZXN0U2NvcGVkKSB7CisgICAgICAgICAgICByZXF1ZXN0U2NvcGVkQ29tcG9uZW50cy5hZGQoY2xhenopOworICAgICAgICB9CisKKyAgICAgICAgaWYgKExPR0dFUi5pc0xvZ2dhYmxlKExldmVsLkNPTkZJRykpIHsKKyAgICAgICAgICAgIExPR0dFUi5jb25maWcoTG9jYWxpemF0aW9uTWVzc2FnZXMuQ0RJX0NMQVNTX0JPVU5EX1dJVEhfQ0RJKGNsYXp6KSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkb25lKCkgeworICAgICAgICBpZiAocmVxdWVzdFNjb3BlZENvbXBvbmVudHMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgSW5zdGFuY2VCaW5kaW5nPEZvcmVpZ25SZXF1ZXN0U2NvcGVCcmlkZ2U+IGRlc2NyaXB0b3IgPSBCaW5kaW5ncworICAgICAgICAgICAgICAgICAgICAuc2VydmljZSgoRm9yZWlnblJlcXVlc3RTY29wZUJyaWRnZSkgKCkgLT4gcmVxdWVzdFNjb3BlZENvbXBvbmVudHMpCisgICAgICAgICAgICAgICAgICAgIC50byhGb3JlaWduUmVxdWVzdFNjb3BlQnJpZGdlLmNsYXNzKTsKKworICAgICAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5yZWdpc3RlcihkZXNjcmlwdG9yKTsKKworICAgICAgICAgICAgaWYgKExPR0dFUi5pc0xvZ2dhYmxlKExldmVsLkNPTkZJRykpIHsKKyAgICAgICAgICAgICAgICBMT0dHRVIuY29uZmlnKExvY2FsaXphdGlvbk1lc3NhZ2VzLkNESV9SRVFVRVNUX1NDT1BFRF9DT01QT05FTlRTX1JFQ09HTklaRUQoCisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0RWxlbWVudHMobmV3IFN0cmluZ0J1aWxkZXIoKS5hcHBlbmQoIlxuIiksIHJlcXVlc3RTY29wZWRDb21wb25lbnRzKS50b1N0cmluZygpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNDZGlDb21wb25lbnQoZmluYWwgQ2xhc3M8Pz4gY29tcG9uZW50KSB7CisgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBxdWFsaWZpZXJzID0gQ2RpVXRpbC5nZXRRdWFsaWZpZXJzKGNvbXBvbmVudC5nZXRBbm5vdGF0aW9ucygpKTsKKyAgICAgICAgcmV0dXJuICFiZWFuTWFuYWdlci5nZXRCZWFucyhjb21wb25lbnQsIHF1YWxpZmllcnMpLmlzRW1wdHkoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNNYW5hZ2VkQmVhbihmaW5hbCBDbGFzczw/PiBjb21wb25lbnQpIHsKKyAgICAgICAgcmV0dXJuIGNvbXBvbmVudC5pc0Fubm90YXRpb25QcmVzZW50KE1hbmFnZWRCZWFuLmNsYXNzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBBbm5vdGF0ZWRDb25zdHJ1Y3Rvcjw/PiBlbnJpY2hlZENvbnN0cnVjdG9yKGZpbmFsIEFubm90YXRlZENvbnN0cnVjdG9yPD8+IGN0b3IpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBbm5vdGF0ZWRDb25zdHJ1Y3RvcigpeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBDb25zdHJ1Y3RvciBnZXRKYXZhTWVtYmVyKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBjdG9yLmdldEphdmFNZW1iZXIoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgTGlzdDxBbm5vdGF0ZWRQYXJhbWV0ZXI+IGdldFBhcmFtZXRlcnMoKSB7CisgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxBbm5vdGF0ZWRQYXJhbWV0ZXI+IHBhcmFtZXRlcnMgPSBuZXcgQXJyYXlMaXN0PD4oY3Rvci5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKworICAgICAgICAgICAgICAgIGZvciAoZmluYWwgQW5ub3RhdGVkUGFyYW1ldGVyPD8+IGFwIDogY3Rvci5nZXRQYXJhbWV0ZXJzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycy5hZGQobmV3IEFubm90YXRlZFBhcmFtZXRlcigpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgaW50IGdldFBvc2l0aW9uKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcC5nZXRQb3NpdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBBbm5vdGF0ZWRDYWxsYWJsZSBnZXREZWNsYXJpbmdDYWxsYWJsZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXAuZ2V0RGVjbGFyaW5nQ2FsbGFibGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgVHlwZSBnZXRCYXNlVHlwZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXAuZ2V0QmFzZVR5cGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgU2V0PFR5cGU+IGdldFR5cGVDbG9zdXJlKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcC5nZXRUeXBlQ2xvc3VyZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyA8VCBleHRlbmRzIEFubm90YXRpb24+IFQgZ2V0QW5ub3RhdGlvbihmaW5hbCBDbGFzczxUPiBhbm5vdGF0aW9uVHlwZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uVHlwZSA9PSBKYXhSc1BhcmFtUHJvZHVjZXIuSmF4UnNQYXJhbVF1YWxpZmllci5jbGFzcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFzQW5ub3RhdGlvbihhcCwgSmF4UnNQYXJhbVByb2R1Y2VyLkpBWF9SU19TVFJJTkdfUEFSQU1fQU5OT1RBVElPTlMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAoVCkgSmF4UnNQYXJhbVByb2R1Y2VyLkpheFJzUGFyYW1RVUFMSUZJRVIgOiBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcC5nZXRBbm5vdGF0aW9uKGFubm90YXRpb25UeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFNldDxBbm5vdGF0aW9uPiBnZXRBbm5vdGF0aW9ucygpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZXQ8QW5ub3RhdGlvbj4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoZmluYWwgQW5ub3RhdGlvbiBhIDogYXAuZ2V0QW5ub3RhdGlvbnMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gYW5ub3RhdGlvblR5cGUgPSBhLmFubm90YXRpb25UeXBlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChKYXhSc1BhcmFtUHJvZHVjZXIuSkFYX1JTX1NUUklOR19QQVJBTV9BTk5PVEFUSU9OUy5jb250YWlucyhhbm5vdGF0aW9uVHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoSmF4UnNQYXJhbVByb2R1Y2VyLkpheFJzUGFyYW1RVUFMSUZJRVIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNBbm5vdGF0aW9uUHJlc2VudChmaW5hbCBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gYW5ub3RhdGlvblR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGFubm90YXRpb25UeXBlID09IEpheFJzUGFyYW1Qcm9kdWNlci5KYXhSc1BhcmFtUXVhbGlmaWVyLmNsYXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGhhc0Fubm90YXRpb24oYXAsIEpheFJzUGFyYW1Qcm9kdWNlci5KQVhfUlNfU1RSSU5HX1BBUkFNX0FOTk9UQVRJT05TKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGFwLmlzQW5ub3RhdGlvblByZXNlbnQoYW5ub3RhdGlvblR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTdGF0aWMoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGN0b3IuaXNTdGF0aWMoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgQW5ub3RhdGVkVHlwZSBnZXREZWNsYXJpbmdUeXBlKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBjdG9yLmdldERlY2xhcmluZ1R5cGUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgVHlwZSBnZXRCYXNlVHlwZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY3Rvci5nZXRCYXNlVHlwZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTZXQ8VHlwZT4gZ2V0VHlwZUNsb3N1cmUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGN0b3IuZ2V0VHlwZUNsb3N1cmUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgPFQgZXh0ZW5kcyBBbm5vdGF0aW9uPiBUIGdldEFubm90YXRpb24oZmluYWwgQ2xhc3M8VD4gYW5ub3RhdGlvblR5cGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY3Rvci5nZXRBbm5vdGF0aW9uKGFubm90YXRpb25UeXBlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU2V0PEFubm90YXRpb24+IGdldEFubm90YXRpb25zKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBjdG9yLmdldEFubm90YXRpb25zKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNBbm5vdGF0aW9uUHJlc2VudChmaW5hbCBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gYW5ub3RhdGlvblR5cGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY3Rvci5pc0Fubm90YXRpb25QcmVzZW50KGFubm90YXRpb25UeXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0Fubm90YXRlZFR5cGUoQE9ic2VydmVzCisgICAgLy8gV2UgY2FuIG5vdCBhcHBseSB0aGUgZm9sbG93aW5nIGNvbnN0cmFpbnQKKyAgICAvLyBpZiB3ZSB3YW50IHRvIGZ1bGx5IHN1cHBvcnQge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkxeC5zcGkuSGsyQ3VzdG9tQm91bmRUeXBlc1Byb3ZpZGVyfS4KKyAgICAvLyBDb3ZlcmVkIGJ5IHRlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAgdGVzdCBhcHBsaWNhdGlvbjoKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAV2l0aEFubm90YXRpb25zKHsKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQuY2xhc3MsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcHBsaWNhdGlvblBhdGguY2xhc3MsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIZWFkZXJQYXJhbS5jbGFzcywKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFF1ZXJ5UGFyYW0uY2xhc3MsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JtUGFyYW0uY2xhc3MsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRyaXhQYXJhbS5jbGFzcywKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJlYW5QYXJhbS5jbGFzcywKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGhQYXJhbS5jbGFzc30pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFByb2Nlc3NBbm5vdGF0ZWRUeXBlIHByb2Nlc3NBbm5vdGF0ZWRUeXBlKSB7CisgICAgICAgIGZpbmFsIEFubm90YXRlZFR5cGU8Pz4gYW5ub3RhdGVkVHlwZSA9IHByb2Nlc3NBbm5vdGF0ZWRUeXBlLmdldEFubm90YXRlZFR5cGUoKTsKKworICAgICAgICAvLyBpZiBvbmUgb2YgdGhlIEpBWC1SUyBhbm5vdGF0aW9ucyBpcyBwcmVzZW50IGluIHRoZSBjdXJyZW50bHkgc2VlbiBjbGFzcywgYWRkIGl0IHRvIHRoZSAid2hpdGVsaXN0IgorICAgICAgICBpZiAoY29udGFpbnNKYXhSc0NvbnN0cnVjdG9ySW5qZWN0aW9uKGFubm90YXRlZFR5cGUpCisgICAgICAgICAgICAgICAgfHwgY29udGFpbnNKYXhSc0ZpZWxkSW5qZWN0aW9uKGFubm90YXRlZFR5cGUpCisgICAgICAgICAgICAgICAgfHwgY29udGFpbnNKYXhSc01ldGhvZEluamVjdGlvbihhbm5vdGF0ZWRUeXBlKSkgeworICAgICAgICAgICAgamF4cnNJbmplY3RhYmxlVHlwZXMuYWRkKGFubm90YXRlZFR5cGUuZ2V0QmFzZVR5cGUoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY3VzdG9tSGsyVHlwZXNQcm92aWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBmaW5hbCBUeXBlIGJhc2VUeXBlID0gYW5ub3RhdGVkVHlwZS5nZXRCYXNlVHlwZSgpOworICAgICAgICAgICAgaWYgKGN1c3RvbUhrMlR5cGVzUHJvdmlkZXIuZ2V0SGsyVHlwZXMoKS5jb250YWlucyhiYXNlVHlwZSkpIHsKKyAgICAgICAgICAgICAgICBwcm9jZXNzQW5ub3RhdGVkVHlwZS52ZXRvKCk7CisgICAgICAgICAgICAgICAgamVyc2V5VmV0b2VkVHlwZXMuYWRkKGJhc2VUeXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb250YWluc0pheFJzUGFyYW1ldGVyaXplZEN0b3IoYW5ub3RhdGVkVHlwZSkpIHsKKyAgICAgICAgICAgIHByb2Nlc3NBbm5vdGF0ZWRUeXBlLnNldEFubm90YXRlZFR5cGUobmV3IEFubm90YXRlZFR5cGUoKSB7CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgQ2xhc3MgZ2V0SmF2YUNsYXNzKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYW5ub3RhdGVkVHlwZS5nZXRKYXZhQ2xhc3MoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgU2V0PEFubm90YXRlZENvbnN0cnVjdG9yPiBnZXRDb25zdHJ1Y3RvcnMoKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNldDxBbm5vdGF0ZWRDb25zdHJ1Y3Rvcj4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIEFubm90YXRlZENvbnN0cnVjdG9yIGMgOiBhbm5vdGF0ZWRUeXBlLmdldENvbnN0cnVjdG9ycygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGVucmljaGVkQ29uc3RydWN0b3IoYykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIFNldCBnZXRNZXRob2RzKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYW5ub3RhdGVkVHlwZS5nZXRNZXRob2RzKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIFNldCBnZXRGaWVsZHMoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhbm5vdGF0ZWRUeXBlLmdldEZpZWxkcygpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBUeXBlIGdldEJhc2VUeXBlKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gYW5ub3RhdGVkVHlwZS5nZXRCYXNlVHlwZSgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBTZXQ8VHlwZT4gZ2V0VHlwZUNsb3N1cmUoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhbm5vdGF0ZWRUeXBlLmdldFR5cGVDbG9zdXJlKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIDxUIGV4dGVuZHMgQW5ub3RhdGlvbj4gVCBnZXRBbm5vdGF0aW9uKGZpbmFsIENsYXNzPFQ+IGFubm90YXRpb25UeXBlKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhbm5vdGF0ZWRUeXBlLmdldEFubm90YXRpb24oYW5ub3RhdGlvblR5cGUpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBTZXQ8QW5ub3RhdGlvbj4gZ2V0QW5ub3RhdGlvbnMoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBhbm5vdGF0ZWRUeXBlLmdldEFubm90YXRpb25zKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNBbm5vdGF0aW9uUHJlc2VudChmaW5hbCBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gYW5ub3RhdGlvblR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFubm90YXRlZFR5cGUuaXNBbm5vdGF0aW9uUHJlc2VudChhbm5vdGF0aW9uVHlwZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gY29udGFpbnNKYXhSc1BhcmFtZXRlcml6ZWRDdG9yKGZpbmFsIEFubm90YXRlZFR5cGUgYW5ub3RhdGVkVHlwZSkgeworICAgICAgICByZXR1cm4gY29udGFpbkFubm90YXRlZFBhcmFtZXRlcnMoYW5ub3RhdGVkVHlwZS5nZXRDb25zdHJ1Y3RvcnMoKSwgSmF4UnNQYXJhbVByb2R1Y2VyLkpBWF9SU19TVFJJTkdfUEFSQU1fQU5OT1RBVElPTlMpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBjb250YWluc0pheFJzQ29uc3RydWN0b3JJbmplY3Rpb24oZmluYWwgQW5ub3RhdGVkVHlwZSBhbm5vdGF0ZWRUeXBlKSB7CisgICAgICAgIHJldHVybiBjb250YWluQW5ub3RhdGVkUGFyYW1ldGVycyhhbm5vdGF0ZWRUeXBlLmdldENvbnN0cnVjdG9ycygpLCBKQVhfUlNfSU5KRUNUX0FOTk9UQVRJT05TKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gY29udGFpbnNKYXhSc01ldGhvZEluamVjdGlvbihmaW5hbCBBbm5vdGF0ZWRUeXBlIGFubm90YXRlZFR5cGUpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5Bbm5vdGF0ZWRQYXJhbWV0ZXJzKGFubm90YXRlZFR5cGUuZ2V0TWV0aG9kcygpLCBKQVhfUlNfSU5KRUNUX0FOTk9UQVRJT05TKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gY29udGFpbnNKYXhSc0ZpZWxkSW5qZWN0aW9uKGZpbmFsIEFubm90YXRlZFR5cGUgYW5ub3RhdGVkVHlwZSkgeworICAgICAgICByZXR1cm4gY29udGFpbkFubm90YXRpb24oYW5ub3RhdGVkVHlwZS5nZXRGaWVsZHMoKSwgSkFYX1JTX0lOSkVDVF9BTk5PVEFUSU9OUyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5Bbm5vdGF0ZWRQYXJhbWV0ZXJzKGZpbmFsIENvbGxlY3Rpb248QW5ub3RhdGVkQ2FsbGFibGU+IGFubm90YXRlZENhbGxhYmxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU2V0PENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPj4gYW5ub3RhdGlvblNldCkgeworICAgICAgICBmb3IgKGZpbmFsIEFubm90YXRlZENhbGxhYmxlIGMgOiBhbm5vdGF0ZWRDYWxsYWJsZXMpIHsKKyAgICAgICAgICAgIGlmIChjb250YWluQW5ub3RhdGlvbihjLmdldFBhcmFtZXRlcnMoKSwgYW5ub3RhdGlvblNldCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGNvbnRhaW5Bbm5vdGF0aW9uKGZpbmFsIENvbGxlY3Rpb248QW5ub3RhdGVkPiBlbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU2V0PENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPj4gYW5ub3RhdGlvblNldCkgeworICAgICAgICBmb3IgKGZpbmFsIEFubm90YXRlZCBlbGVtZW50IDogZWxlbWVudHMpIHsKKyAgICAgICAgICAgIGlmIChoYXNBbm5vdGF0aW9uKGVsZW1lbnQsIGFubm90YXRpb25TZXQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaGFzQW5ub3RhdGlvbihmaW5hbCBBbm5vdGF0ZWQgZWxlbWVudCwgZmluYWwgU2V0PENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPj4gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgZm9yIChmaW5hbCBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gYSA6IGFubm90YXRpb25zKSB7CisgICAgICAgICAgICBpZiAoZWxlbWVudC5pc0Fubm90YXRpb25QcmVzZW50KGEpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorICAgIHByaXZhdGUgdm9pZCBhZnRlclR5cGVEaXNjb3ZlcnkoQE9ic2VydmVzIGZpbmFsIEFmdGVyVHlwZURpc2NvdmVyeSBhZnRlclR5cGVEaXNjb3ZlcnkpIHsKKyAgICAgICAgaWYgKExPR0dFUi5pc0xvZ2dhYmxlKExldmVsLkNPTkZJRykgJiYgIWplcnNleVZldG9lZFR5cGVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgTE9HR0VSLmNvbmZpZyhMb2NhbGl6YXRpb25NZXNzYWdlcy5DRElfVFlQRV9WRVRPRUQoY3VzdG9tSGsyVHlwZXNQcm92aWRlciwKKyAgICAgICAgICAgICAgICAgICAgbGlzdEVsZW1lbnRzKG5ldyBTdHJpbmdCdWlsZGVyKCkuYXBwZW5kKCJcbiIpLCBqZXJzZXlWZXRvZWRUeXBlcykudG9TdHJpbmcoKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisgICAgcHJpdmF0ZSB2b2lkIGJlZm9yZUJlYW5EaXNjb3ZlcnkoQE9ic2VydmVzIGZpbmFsIEJlZm9yZUJlYW5EaXNjb3ZlcnkgYmVmb3JlQmVhbkRpc2NvdmVyeSwKKyAgICAgICAgICAgIGZpbmFsIGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5CZWFuTWFuYWdlciBiZWFuTWFuYWdlcikgeworICAgICAgICBiZWZvcmVCZWFuRGlzY292ZXJ5LmFkZEFubm90YXRlZFR5cGUoYmVhbk1hbmFnZXIuY3JlYXRlQW5ub3RhdGVkVHlwZShKYXhSc1BhcmFtUHJvZHVjZXIuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgICBwcml2YXRlIHZvaWQgcHJvY2Vzc0luamVjdGlvblRhcmdldChAT2JzZXJ2ZXMgZmluYWwgUHJvY2Vzc0luamVjdGlvblRhcmdldCBldmVudCkgeworICAgICAgICBmaW5hbCBJbmplY3Rpb25UYXJnZXQgaXQgPSBldmVudC5nZXRJbmplY3Rpb25UYXJnZXQoKTsKKyAgICAgICAgZmluYWwgQ2xhc3M8Pz4gY29tcG9uZW50Q2xhc3MgPSBldmVudC5nZXRBbm5vdGF0ZWRUeXBlKCkuZ2V0SmF2YUNsYXNzKCk7CisKKyAgICAgICAgZmluYWwgU2V0PEluamVjdGlvblBvaW50PiBjZGlJbmplY3Rpb25Qb2ludHMgPSBmaWx0ZXJIazJJbmplY3Rpb25Qb2ludHNPdXQoaXQuZ2V0SW5qZWN0aW9uUG9pbnRzKCkpOworCisgICAgICAgIGZvciAoZmluYWwgSW5qZWN0aW9uUG9pbnQgaW5qZWN0aW9uUG9pbnQgOiBjZGlJbmplY3Rpb25Qb2ludHMpIHsKKyAgICAgICAgICAgIGZpbmFsIE1lbWJlciBtZW1iZXIgPSBpbmplY3Rpb25Qb2ludC5nZXRNZW1iZXIoKTsKKyAgICAgICAgICAgIGlmIChtZW1iZXIgaW5zdGFuY2VvZiBGaWVsZCkgeworICAgICAgICAgICAgICAgIGFkZEluamVjdGVlVG9Ta2lwKGNvbXBvbmVudENsYXNzLCBmaWVsZHNUb1NraXAsIChGaWVsZCkgbWVtYmVyKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobWVtYmVyIGluc3RhbmNlb2YgTWV0aG9kKSB7CisgICAgICAgICAgICAgICAgYWRkSW5qZWN0ZWVUb1NraXAoY29tcG9uZW50Q2xhc3MsIG1ldGhvZHNUb1NraXAsIChNZXRob2QpIG1lbWJlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBJbmplY3Rpb25NYW5hZ2VySW5qZWN0ZWRDZGlUYXJnZXQgdGFyZ2V0ID0gbnVsbDsKKyAgICAgICAgaWYgKGlzSmVyc2V5T3JEZXBlbmRlbmN5VHlwZShjb21wb25lbnRDbGFzcykpIHsKKyAgICAgICAgICAgIHRhcmdldCA9IG5ldyBJbmplY3Rpb25NYW5hZ2VySW5qZWN0ZWRDZGlUYXJnZXQoaXQpIHsKKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBTZXQ8SW5qZWN0aW9uUG9pbnQ+IGdldEluamVjdGlvblBvaW50cygpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGVsbCBDREkgdG8gaWdub3JlIEplcnNleSAob3IgaXQncyBkZXBlbmRlbmNpZXMpIGNsYXNzZXMgd2hlbiBpbmplY3RpbmcuCisgICAgICAgICAgICAgICAgICAgIC8vIENESSB3aWxsIG5vdCB0cmVhdCB0aGVzZSBjbGFzc2VzIGFzIENESSBiZWFucyAoYXMgdGhleSBhcmUgbm90KS4KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfSBlbHNlIGlmIChpc0pheFJzQ29tcG9uZW50VHlwZShjb21wb25lbnRDbGFzcykKKyAgICAgICAgICAgICAgICB8fCBqYXhyc0luamVjdGFibGVUeXBlcy5jb250YWlucyhldmVudC5nZXRBbm5vdGF0ZWRUeXBlKCkuZ2V0QmFzZVR5cGUoKSkpIHsKKyAgICAgICAgICAgIHRhcmdldCA9IG5ldyBJbmplY3Rpb25NYW5hZ2VySW5qZWN0ZWRDZGlUYXJnZXQoaXQpIHsKKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBTZXQ8SW5qZWN0aW9uUG9pbnQ+IGdldEluamVjdGlvblBvaW50cygpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSW5qZWN0IENESSBiZWFucyBpbnRvIEpBWC1SUyByZXNvdXJjZXMvcHJvdmlkZXJzL2FwcGxpY2F0aW9uLgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2RpSW5qZWN0aW9uUG9pbnRzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgICAgICBpZiAodGFyZ2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIG5vdGlmeSh0YXJnZXQpOworICAgICAgICAgICAgLy9ub2luc3BlY3Rpb24gdW5jaGVja2VkCisgICAgICAgICAgICBldmVudC5zZXRJbmplY3Rpb25UYXJnZXQodGFyZ2V0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU2V0PEluamVjdGlvblBvaW50PiBmaWx0ZXJIazJJbmplY3Rpb25Qb2ludHNPdXQoZmluYWwgU2V0PEluamVjdGlvblBvaW50PiBvcmlnaW5hbEluamVjdGlvblBvaW50cykgeworICAgICAgICBmaW5hbCBTZXQ8SW5qZWN0aW9uUG9pbnQ+IGZpbHRlcmVkSW5qZWN0aW9uUG9pbnRzID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICBmb3IgKGZpbmFsIEluamVjdGlvblBvaW50IGlwIDogb3JpZ2luYWxJbmplY3Rpb25Qb2ludHMpIHsKKyAgICAgICAgICAgIGZpbmFsIFR5cGUgaW5qZWN0ZWRUeXBlID0gaXAuZ2V0VHlwZSgpOworICAgICAgICAgICAgaWYgKGN1c3RvbUhrMlR5cGVzUHJvdmlkZXIgIT0gbnVsbCAmJiBjdXN0b21IazJUeXBlc1Byb3ZpZGVyLmdldEhrMlR5cGVzKCkuY29udGFpbnMoaW5qZWN0ZWRUeXBlKSkgeworICAgICAgICAgICAgICAgIC8vcmVtZW1iZXIgdGhlIHR5cGUsIHdlIHdvdWxkIG5lZWQgdG8gbW9jayBpdCdzIENESSBiaW5kaW5nIGF0IHJ1bnRpbWUKKyAgICAgICAgICAgICAgICBoazJQcm92aWRlZFR5cGVzLmFkZChpbmplY3RlZFR5cGUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5qZWN0ZWRUeXBlIGluc3RhbmNlb2YgQ2xhc3M8Pz4pIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gaW5qZWN0ZWRDbGFzcyA9IChDbGFzczw/PikgaW5qZWN0ZWRUeXBlOworICAgICAgICAgICAgICAgICAgICBpZiAoaXNKZXJzZXlPckRlcGVuZGVuY3lUeXBlKGluamVjdGVkQ2xhc3MpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3JlbWVtYmVyIHRoZSB0eXBlLCB3ZSB3b3VsZCBuZWVkIHRvIG1vY2sgaXQncyBDREkgYmluZGluZyBhdCBydW50aW1lCisgICAgICAgICAgICAgICAgICAgICAgICBoazJQcm92aWRlZFR5cGVzLmFkZChpbmplY3RlZFR5cGUpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWRJbmplY3Rpb25Qb2ludHMuYWRkKGlwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIGl0IGlzIG5vdCBhIGNsYXNzLCBtYXliZSBwcm92aWRlciB0eXBlPzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzSW5qZWN0aW9uUHJvdmlkZXIoaW5qZWN0ZWRUeXBlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChpc1Byb3ZpZGVyT2ZKZXJzZXlUeXBlKChQYXJhbWV0ZXJpemVkVHlwZSkgaW5qZWN0ZWRUeXBlKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vcmVtZW1iZXIgdGhlIHR5cGUsIHdlIHdvdWxkIG5lZWQgdG8gbW9jayBpdCdzIENESSBiaW5kaW5nIGF0IHJ1bnRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGhrMlByb3ZpZGVkVHlwZXMuYWRkKCgoUGFyYW1ldGVyaXplZFR5cGUpIGluamVjdGVkVHlwZSkuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkSW5qZWN0aW9uUG9pbnRzLmFkZChpcCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZpbHRlcmVkSW5qZWN0aW9uUG9pbnRzOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc0luamVjdGlvblByb3ZpZGVyKGZpbmFsIFR5cGUgaW5qZWN0ZWRUeXBlKSB7CisgICAgICAgIHJldHVybiBpbmplY3RlZFR5cGUgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkVHlwZQorICAgICAgICAgICAgICAgICYmICgoUGFyYW1ldGVyaXplZFR5cGUpIGluamVjdGVkVHlwZSkuZ2V0UmF3VHlwZSgpID09IGphdmF4LmluamVjdC5Qcm92aWRlci5jbGFzczsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNQcm92aWRlck9mSmVyc2V5VHlwZShmaW5hbCBQYXJhbWV0ZXJpemVkVHlwZSBwcm92aWRlcikgeworICAgICAgICBmaW5hbCBUeXBlIGZpcnN0QXJndW1lbnRUeXBlID0gcHJvdmlkZXIuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpWzBdOworICAgICAgICBpZiAoZmlyc3RBcmd1bWVudFR5cGUgaW5zdGFuY2VvZiBDbGFzcyAmJiBpc0plcnNleU9yRGVwZW5kZW5jeVR5cGUoKENsYXNzPD8+KSBmaXJzdEFyZ3VtZW50VHlwZSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoY3VzdG9tSGsyVHlwZXNQcm92aWRlciAhPSBudWxsICYmIGN1c3RvbUhrMlR5cGVzUHJvdmlkZXIuZ2V0SGsyVHlwZXMoKS5jb250YWlucyhmaXJzdEFyZ3VtZW50VHlwZSkpOworICAgIH0KKworICAgIHByaXZhdGUgPFQ+IHZvaWQgYWRkSW5qZWN0ZWVUb1NraXAoZmluYWwgQ2xhc3M8Pz4gY29tcG9uZW50Q2xhc3MsIGZpbmFsIE1hcDxDbGFzczw/PiwgU2V0PFQ+PiB0b1NraXAsIGZpbmFsIFQgbWVtYmVyKSB7CisgICAgICAgIGlmICghdG9Ta2lwLmNvbnRhaW5zS2V5KGNvbXBvbmVudENsYXNzKSkgeworICAgICAgICAgICAgdG9Ta2lwLnB1dChjb21wb25lbnRDbGFzcywgbmV3IEhhc2hTZXQ8VD4oKSk7CisgICAgICAgIH0KKyAgICAgICAgdG9Ta2lwLmdldChjb21wb25lbnRDbGFzcykuYWRkKG1lbWJlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXV4aWxpYXJ5IGFubm90YXRpb24gZm9yIG1vY2tlZCBiZWFucyB1c2VkIHRvIGNvdmVyIEplcnNleS9ISzIgaW5qZWN0ZWQgaW5qZWN0aW9uIHBvaW50cy4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygic2VyaWFsIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENkaURlZmF1bHRBbm5vdGF0aW9uIGV4dGVuZHMgQW5ub3RhdGlvbkxpdGVyYWw8RGVmYXVsdD4gaW1wbGVtZW50cyBEZWZhdWx0IHsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7InVudXNlZCIsICJ1bmNoZWNrZWQiLCAicmF3dHlwZXMifSkKKyAgICBwcml2YXRlIHZvaWQgYWZ0ZXJEaXNjb3ZlcnlPYnNlcnZlcihAT2JzZXJ2ZXMgZmluYWwgQWZ0ZXJCZWFuRGlzY292ZXJ5IGFiZCkgeworICAgICAgICBpZiAoY3VzdG9tSGsyVHlwZXNQcm92aWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBoazJQcm92aWRlZFR5cGVzLmFkZEFsbChjdXN0b21IazJUeXBlc1Byb3ZpZGVyLmdldEhrMlR5cGVzKCkpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChmaW5hbCBUeXBlIHQgOiBoazJQcm92aWRlZFR5cGVzKSB7CisgICAgICAgICAgICBhYmQuYWRkQmVhbihuZXcgSGsyQmVhbih0KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHlvdSBmaWVsZHMgdG8gc2tpcCBmcm9tIGEgcHJveGllZCBpbnN0YW5jZS4KKyAgICAgKiA8cC8+CisgICAgICogTm90ZTogRG8gTk9UIGxvd2VyIHRoZSB2aXNpYmlsaXR5IG9mIHRoaXMgbWV0aG9kLiBDREkgcHJveGllcyBuZWVkIGF0IGxlYXN0IHRoaXMgdmlzaWJpbGl0eS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gZmllbGRzIHRvIHNraXAgd2hlbiBpbmplY3RpbmcgdmlhIEhLMgorICAgICAqLworICAgIC8qIHBhY2thZ2UgKi8gTWFwPENsYXNzPD8+LCBTZXQ8RmllbGQ+PiBnZXRGaWVsZHNUb1NraXAoKSB7CisgICAgICAgIHJldHVybiBmaWVsZHNUb1NraXA7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB5b3UgbWV0aG9kcyB0byBza2lwIChmcm9tIGEgcHJveGllZCBpbnN0YW5jZSkuCisgICAgICogPHAvPgorICAgICAqIE5vdGU6IERvIE5PVCBsb3dlciB0aGUgdmlzaWJpbGl0eSBvZiB0aGlzIG1ldGhvZC4gQ0RJIHByb3hpZXMgbmVlZCBhdCBsZWFzdCB0aGlzIHZpc2liaWxpdHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIG1ldGhvZHMgdG8gc2tpcCB3aGVuIGluamVjdGluZyB2aWEgSEsyCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBNYXA8Q2xhc3M8Pz4sIFNldDxNZXRob2Q+PiBnZXRNZXRob2RzVG9Ta2lwKCkgeworICAgICAgICByZXR1cm4gbWV0aG9kc1RvU2tpcDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHlvdSBlZmZlY3RpdmUgaW5qZWN0aW9uIG1hbmFnZXIuCisgICAgICogPHAvPgorICAgICAqIE5vdGU6IERvIE5PVCBsb3dlciB0aGUgdmlzaWJpbGl0eSBvZiB0aGlzIG1ldGhvZC4gQ0RJIHByb3hpZXMgbmVlZCBhdCBsZWFzdCB0aGlzIHZpc2liaWxpdHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEhLMiBpbmplY3Rpb24gbWFuYWdlci4KKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIEluamVjdGlvbk1hbmFnZXIgZ2V0RWZmZWN0aXZlSW5qZWN0aW9uTWFuYWdlcigpIHsKKyAgICAgICAgcmV0dXJuIGluamVjdGlvbk1hbmFnZXJTdG9yZS5nZXRFZmZlY3RpdmVJbmplY3Rpb25NYW5hZ2VyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIEhLMiB7QGxpbmsgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb24gbWFuYWdlcn0gKHRvIGEgcHJveGllZCBpbnN0YW5jZSkuCisgICAgICogPHAvPgorICAgICAqIE5vdGU6IERvIE5PVCBsb3dlciB0aGUgdmlzaWJpbGl0eSBvZiB0aGlzIG1ldGhvZC4gQ0RJIHByb3hpZXMgbmVlZCBhdCBsZWFzdCB0aGlzIHZpc2liaWxpdHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb24gbWFuYWdlci4KKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIHZvaWQgYWRkSW5qZWN0aW9uTWFuYWdlcihmaW5hbCBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIpIHsKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlclN0b3JlLnJlZ2lzdGVySW5qZWN0aW9uTWFuYWdlcihpbmplY3Rpb25NYW5hZ2VyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBOb3RpZmllcyB0aGUge0Bjb2RlIEluamVjdGlvblRhcmdldExpc3RlbmVyIGluamVjdGlvbiB0YXJnZXQgbGlzdGVuZXJ9IGFib3V0IG5ldworICAgICAqIHtAbGluayBJbmplY3Rpb25NYW5hZ2VySW5qZWN0ZWRUYXJnZXQgaW5qZWN0ZWQgdGFyZ2V0fS4KKyAgICAgKiA8cC8+CisgICAgICogTm90ZTogRG8gTk9UIGxvd2VyIHRoZSB2aXNpYmlsaXR5IG9mIHRoaXMgbWV0aG9kLiBDREkgcHJveGllcyBuZWVkIGF0IGxlYXN0IHRoaXMgdmlzaWJpbGl0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YXJnZXQgbmV3IGluamVjdGVkIHRhcmdldC4KKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIHZvaWQgbm90aWZ5KGZpbmFsIEluamVjdGlvbk1hbmFnZXJJbmplY3RlZFRhcmdldCB0YXJnZXQpIHsKKyAgICAgICAgaWYgKGluamVjdGlvbk1hbmFnZXJTdG9yZSBpbnN0YW5jZW9mIEluamVjdGlvblRhcmdldExpc3RlbmVyKSB7CisgICAgICAgICAgICAoKEluamVjdGlvblRhcmdldExpc3RlbmVyKSBpbmplY3Rpb25NYW5hZ2VyU3RvcmUpLm5vdGlmeSh0YXJnZXQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50cm9zcGVjdCBnaXZlbiB0eXBlIHRvIGRldGVybWluZSBpZiBpdCByZXByZXNlbnRzIGEgSkFYLVJTIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGF6eiB0eXBlIHRvIGJlIGludHJvc3BlY3RlZC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHR5cGUgcmVwcmVzZW50cyBhIEpBWC1SUyBjb21wb25lbnQgdHlwZS4KKyAgICAgKi8KKyAgICAvKiBwYWNrYWdlICovIGJvb2xlYW4gaXNKYXhSc0NvbXBvbmVudFR5cGUoZmluYWwgQ2xhc3M8Pz4gY2xhenopIHsKKyAgICAgICAgcmV0dXJuIGpheFJzQ29tcG9uZW50Q2FjaGUuYXBwbHkoY2xhenopOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNKZXJzZXlPckRlcGVuZGVuY3lUeXBlKGZpbmFsIENsYXNzPD8+IGNsYXp6KSB7CisgICAgICAgIGlmIChjbGF6ei5pc1ByaW1pdGl2ZSgpIHx8IGNsYXp6LmlzU3ludGhldGljKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFBhY2thZ2UgcGtnID0gY2xhenouZ2V0UGFja2FnZSgpOworICAgICAgICBpZiAocGtnID09IG51bGwpIHsgLy8gQ2xhc3MuZ2V0UGFja2FnZSgpIGNvdWxkIHJldHVybiBudWxsCisgICAgICAgICAgICBMT0dHRVIud2FybmluZyhTdHJpbmcuZm9ybWF0KCJDbGFzcyAlcyBoYXMgbnVsbCBwYWNrYWdlIiwgY2xhenopKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFN0cmluZyBwa2dOYW1lID0gcGtnLmdldE5hbWUoKTsKKyAgICAgICAgcmV0dXJuICFjbGF6ei5pc0Fubm90YXRpb25QcmVzZW50KEplcnNleVZldG9lZC5jbGFzcykKKyAgICAgICAgICAgICAgICAmJiAocGtnTmFtZS5jb250YWlucygib3JnLmdsYXNzZmlzaC5oazIiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHBrZ05hbWUuY29udGFpbnMoImplcnNleS5yZXBhY2thZ2VkIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBwa2dOYW1lLmNvbnRhaW5zKCJvcmcuanZuZXQuaGsyIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAocGtnTmFtZS5zdGFydHNXaXRoKCJvcmcuZ2xhc3NmaXNoLmplcnNleSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIXBrZ05hbWUuc3RhcnRzV2l0aCgib3JnLmdsYXNzZmlzaC5qZXJzZXkuZXhhbXBsZXMiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFwa2dOYW1lLnN0YXJ0c1dpdGgoIm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzIikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHBrZ05hbWUuc3RhcnRzV2l0aCgiY29tLnN1bi5qZXJzZXkiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFwa2dOYW1lLnN0YXJ0c1dpdGgoImNvbS5zdW4uamVyc2V5LmV4YW1wbGVzIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhcGtnTmFtZS5zdGFydHNXaXRoKCJjb20uc3VuLmplcnNleS50ZXN0cyIpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGJpbmRIazJDbGFzc0FuYWx5emVyKCkgeworICAgICAgICBDbGFzc0FuYWx5emVyIGRlZmF1bHRDbGFzc0FuYWx5emVyID0KKyAgICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKENsYXNzQW5hbHl6ZXIuY2xhc3MsIENsYXNzQW5hbHl6ZXIuREVGQVVMVF9JTVBMRU1FTlRBVElPTl9OQU1FKTsKKworICAgICAgICBpbnQgc2tpcHBlZEVsZW1lbnRzID0gbWV0aG9kc1RvU2tpcC5zaXplKCkgKyBmaWVsZHNUb1NraXAuc2l6ZSgpOworCisgICAgICAgIENsYXNzQW5hbHl6ZXIgY3VzdG9taXplZENsYXNzQW5hbHl6ZXIgPSBza2lwcGVkRWxlbWVudHMgPiAwCisgICAgICAgICAgICAgICAgPyBuZXcgSW5qZWN0ZWVTa2lwcGluZ0FuYWx5emVyKGRlZmF1bHRDbGFzc0FuYWx5emVyLCBtZXRob2RzVG9Ta2lwLCBmaWVsZHNUb1NraXApCisgICAgICAgICAgICAgICAgOiBkZWZhdWx0Q2xhc3NBbmFseXplcjsKKworICAgICAgICBCaW5kZXIgYmluZGVyID0gbmV3IEFic3RyYWN0QmluZGVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgICAgICAgICAgYmluZChjdXN0b21pemVkQ2xhc3NBbmFseXplcikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hbmFseXplV2l0aChDbGFzc0FuYWx5emVyLkRFRkFVTFRfSU1QTEVNRU5UQVRJT05fTkFNRSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC50byhDbGFzc0FuYWx5emVyLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWVkKENESV9DTEFTU19BTkFMWVpFUik7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGluamVjdGlvbk1hbmFnZXIucmVnaXN0ZXIoYmluZGVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZ0J1aWxkZXIgbGlzdEVsZW1lbnRzKGZpbmFsIFN0cmluZ0J1aWxkZXIgbG9nTXNnQnVpbGRlciwgZmluYWwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgT2JqZWN0PiBlbGVtZW50cykgeworICAgICAgICBmb3IgKGZpbmFsIE9iamVjdCB0IDogZWxlbWVudHMpIHsKKyAgICAgICAgICAgIGxvZ01zZ0J1aWxkZXIuYXBwZW5kKFN0cmluZy5mb3JtYXQoIiAtICVzJW4iLCB0KSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxvZ01zZ0J1aWxkZXI7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHJpdmF0ZSBhYnN0cmFjdCBjbGFzcyBJbmplY3Rpb25NYW5hZ2VySW5qZWN0ZWRDZGlUYXJnZXQgaW1wbGVtZW50cyBJbmplY3Rpb25NYW5hZ2VySW5qZWN0ZWRUYXJnZXQgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgSW5qZWN0aW9uVGFyZ2V0IGRlbGVnYXRlOworICAgICAgICBwcml2YXRlIHZvbGF0aWxlIEluamVjdGlvbk1hbmFnZXIgZWZmZWN0aXZlSW5qZWN0aW9uTWFuYWdlcjsKKworICAgICAgICBwdWJsaWMgSW5qZWN0aW9uTWFuYWdlckluamVjdGVkQ2RpVGFyZ2V0KEluamVjdGlvblRhcmdldCBkZWxlZ2F0ZSkgeworICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBTZXQ8SW5qZWN0aW9uUG9pbnQ+IGdldEluamVjdGlvblBvaW50cygpOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBpbmplY3QoZmluYWwgT2JqZWN0IHQsIGZpbmFsIENyZWF0aW9uYWxDb250ZXh0IGNjKSB7CisgICAgICAgICAgICBkZWxlZ2F0ZS5pbmplY3QodCwgY2MpOworCisgICAgICAgICAgICBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGluZ01hbmFnZXIgPSBnZXRFZmZlY3RpdmVJbmplY3Rpb25NYW5hZ2VyKCk7CisgICAgICAgICAgICBpZiAoaW5qZWN0aW5nTWFuYWdlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgaW5qZWN0aW5nTWFuYWdlciA9IGVmZmVjdGl2ZUluamVjdGlvbk1hbmFnZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpbmplY3RpbmdNYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbmplY3RpbmdNYW5hZ2VyLmluamVjdCh0LCBDZGlDb21wb25lbnRQcm92aWRlci5DRElfQ0xBU1NfQU5BTFlaRVIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHBvc3RDb25zdHJ1Y3QoZmluYWwgT2JqZWN0IHQpIHsKKyAgICAgICAgICAgIGRlbGVnYXRlLnBvc3RDb25zdHJ1Y3QodCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcHJlRGVzdHJveShmaW5hbCBPYmplY3QgdCkgeworICAgICAgICAgICAgZGVsZWdhdGUucHJlRGVzdHJveSh0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0IHByb2R1Y2UoZmluYWwgQ3JlYXRpb25hbENvbnRleHQgY2MpIHsKKyAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5wcm9kdWNlKGNjKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKGZpbmFsIE9iamVjdCB0KSB7CisgICAgICAgICAgICBkZWxlZ2F0ZS5kaXNwb3NlKHQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEluamVjdGlvbk1hbmFnZXIoZmluYWwgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyKSB7CisgICAgICAgICAgICB0aGlzLmVmZmVjdGl2ZUluamVjdGlvbk1hbmFnZXIgPSBpbmplY3Rpb25NYW5hZ2VyOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBIazJCZWFuIGltcGxlbWVudHMgQmVhbiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBUeXBlIHQ7CisKKyAgICAgICAgcHVibGljIEhrMkJlYW4oZmluYWwgVHlwZSB0KSB7CisgICAgICAgICAgICB0aGlzLnQgPSB0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDbGFzcyBnZXRCZWFuQ2xhc3MoKSB7CisgICAgICAgICAgICByZXR1cm4gKENsYXNzKSB0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTZXQgZ2V0SW5qZWN0aW9uUG9pbnRzKCkgeworICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNOdWxsYWJsZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlKGZpbmFsIENyZWF0aW9uYWxDb250ZXh0IGNyZWF0aW9uYWxDb250ZXh0KSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0RWZmZWN0aXZlSW5qZWN0aW9uTWFuYWdlcigpLmdldEluc3RhbmNlKHQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koZmluYWwgT2JqZWN0IGluc3RhbmNlLCBmaW5hbCBDcmVhdGlvbmFsQ29udGV4dCBjcmVhdGlvbmFsQ29udGV4dCkgeworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTZXQgZ2V0VHlwZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uKHQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTZXQgZ2V0UXVhbGlmaWVycygpIHsKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b24obmV3IENkaURlZmF1bHRBbm5vdGF0aW9uKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDbGFzcyBnZXRTY29wZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBEZXBlbmRlbnQuY2xhc3M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIHQudG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU2V0IGdldFN0ZXJlb3R5cGVzKCkgeworICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNBbHRlcm5hdGl2ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9jZGkvamVyc2V5LWNkaTF4L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXh0L2NkaTF4L2ludGVybmFsL0NkaVV0aWwuamF2YSBiL2V4dC9jZGkvamVyc2V5LWNkaTF4L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXh0L2NkaTF4L2ludGVybmFsL0NkaVV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjEzYmE2Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2NkaS9qZXJzZXktY2RpMXgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leHQvY2RpMXgvaW50ZXJuYWwvQ2RpVXRpbC5qYXZhCkBAIC0wLDAgKzEsMTQ5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkxeC5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5zcGkuQ3JlYXRpb25hbENvbnRleHQ7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkJlYW47CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkJlYW5NYW5hZ2VyOworaW1wb3J0IGphdmF4LmluamVjdC5RdWFsaWZpZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpMXguaW50ZXJuYWwuc3BpLkJlYW5NYW5hZ2VyUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTF4LmludGVybmFsLnNwaS5JbmplY3Rpb25NYW5hZ2VyU3RvcmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuU2VydmljZUZpbmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb2RlbC5pbnRlcm5hbC5SYW5rZWRDb21wYXJhdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1vZGVsLmludGVybmFsLlJhbmtlZFByb3ZpZGVyOworCisvKioKKyAqIENvbW1vbiBDREkgdXRpbGl0eSBtZXRob2RzLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIENkaVV0aWwgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQmVhbk1hbmFnZXJQcm92aWRlciBCRUFOX01BTkFHRVJfUFJPVklERVIgPSBuZXcgRGVmYXVsdEJlYW5NYW5hZ2VyUHJvdmlkZXIoKTsKKworICAgIC8qKgorICAgICAqIFByZXZlbnQgaW5zdGFudGlhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIENkaVV0aWwoKSB7CisgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigiTm8gaW5zdGFuY2VzIGFsbG93ZWQuIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IG1lIGxpc3Qgb2YgcXVhbGlmaWVycyBpbmNsdWRlZCBpbiBnaXZlbiBhbm5vdGF0aW9uIGxpc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbnMgbGlzdCBvZiBhbm5vdGF0aW9ucyB0byBpbnRyb3NwZWN0CisgICAgICogQHJldHVybiBhbm5vdGF0aW9ucyBmcm9tIHRoZSBpbnB1dCBsaXN0IHRoYXQgYXJlIG1hcmtlZCBhcyBxdWFsaWZpZXJzCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uW10gZ2V0UXVhbGlmaWVycyhmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgZmluYWwgTGlzdDxBbm5vdGF0aW9uPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oYW5ub3RhdGlvbnMubGVuZ3RoKTsKKyAgICAgICAgZm9yIChmaW5hbCBBbm5vdGF0aW9uIGEgOiBhbm5vdGF0aW9ucykgeworICAgICAgICAgICAgaWYgKGEuYW5ub3RhdGlvblR5cGUoKS5pc0Fubm90YXRpb25QcmVzZW50KFF1YWxpZmllci5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkKGEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQudG9BcnJheShuZXcgQW5ub3RhdGlvbltyZXN1bHQuc2l6ZSgpXSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IG1lIGN1cnJlbnQgYmVhbiBtYW5hZ2VyLiBNZXRob2QgZmlyc3QgdHJpZXMgdG8gbG9va3VwIGF2YWlsYWJsZSBwcm92aWRlcnMgdmlhIHtAY29kZSBNRVRBLUlORi9zZXJ2aWNlc30uIElmIG5vdCBmb3VuZAorICAgICAqIHRoZSBiZWFuIG1hbmFnZXIgaXMgcmV0dXJuZWQgZnJvbSB0aGUgZGVmYXVsdCBwcm92aWRlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYmVhbiBtYW5hZ2VyCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCZWFuTWFuYWdlciBnZXRCZWFuTWFuYWdlcigpIHsKKyAgICAgICAgZmluYWwgQmVhbk1hbmFnZXJQcm92aWRlciBwcm92aWRlciA9IGxvb2t1cFNlcnZpY2UoQmVhbk1hbmFnZXJQcm92aWRlci5jbGFzcyk7CisgICAgICAgIGlmIChwcm92aWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gcHJvdmlkZXIuZ2V0QmVhbk1hbmFnZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBCRUFOX01BTkFHRVJfUFJPVklERVIuZ2V0QmVhbk1hbmFnZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IGluc3RhbmNlIG9mIHtAbGluayBJbmplY3Rpb25NYW5hZ2VyU3RvcmV9LiBNZXRob2QgZmlyc3QgdHJpZXMgdG8gbG9va3VwCisgICAgICogYXZhaWxhYmxlIG1hbmFnZXIgdmlhIHtAY29kZSBNRVRBLUlORi9zZXJ2aWNlc30gYW5kIGlmIG5vdCBmb3VuZCBhIG5ldyBpbnN0YW5jZSBvZiBkZWZhdWx0IG9uZSBpcyByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgaW5qZWN0aW9uIG1hbmFnZXIgc3RvcmUuCisgICAgICovCisgICAgc3RhdGljIEluamVjdGlvbk1hbmFnZXJTdG9yZSBjcmVhdGVIazJJbmplY3Rpb25NYW5hZ2VyU3RvcmUoKSB7CisgICAgICAgIGZpbmFsIEluamVjdGlvbk1hbmFnZXJTdG9yZSBtYW5hZ2VyID0gbG9va3VwU2VydmljZShJbmplY3Rpb25NYW5hZ2VyU3RvcmUuY2xhc3MpOworICAgICAgICByZXR1cm4gbWFuYWdlciAhPSBudWxsID8gbWFuYWdlciA6IG5ldyBTaW5nbGVJbmplY3Rpb25NYW5hZ2VyU3RvcmUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb29rIGZvciBhIHNlcnZpY2Ugb2YgZ2l2ZW4gdHlwZS4gSWYgbW9yZSB0aGVuIG9uZSBzZXJ2aWNlIGlzIGZvdW5kIHRoZSBtZXRob2Qgc29ydHMgdGhlbSBhcmUgcmV0dXJucyB0aGUgb25lIHdpdGggaGlnaGVzdAorICAgICAqIHByaW9yaXR5LgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXp6IHR5cGUgb2Ygc2VydmljZSB0byBsb29rIGZvci4KKyAgICAgKiBAcGFyYW0gPFQ+ICAgdHlwZSBvZiBzZXJ2aWNlIHRvIGxvb2sgZm9yCisgICAgICogQHJldHVybiBpbnN0YW5jZSBvZiBzZXJ2aWNlIHdpdGggaGlnaGVzdCBwcmlvcml0eSBvciB7QGNvZGUgbnVsbH0gaWYgc2VydmljZSBvZiBnaXZlbiB0eXBlIGNhbm5vdCBiZSBmb3VuZC4KKyAgICAgKiBAc2VlIGphdmF4LmFubm90YXRpb24uUHJpb3JpdHkKKyAgICAgKi8KKyAgICBzdGF0aWMgPFQ+IFQgbG9va3VwU2VydmljZShmaW5hbCBDbGFzczxUPiBjbGF6eikgeworICAgICAgICBmaW5hbCBMaXN0PFJhbmtlZFByb3ZpZGVyPFQ+PiBwcm92aWRlcnMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisKKyAgICAgICAgZm9yIChmaW5hbCBUIHByb3ZpZGVyIDogU2VydmljZUZpbmRlci5maW5kKGNsYXp6KSkgeworICAgICAgICAgICAgcHJvdmlkZXJzLmFkZChuZXcgUmFua2VkUHJvdmlkZXI8Pihwcm92aWRlcikpOworICAgICAgICB9CisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQocHJvdmlkZXJzLCBuZXcgUmFua2VkQ29tcGFyYXRvcjxUPihSYW5rZWRDb21wYXJhdG9yLk9yZGVyLkFTQ0VORElORykpOworCisgICAgICAgIHJldHVybiBwcm92aWRlcnMuaXNFbXB0eSgpID8gbnVsbCA6IHByb3ZpZGVycy5nZXQoMCkuZ2V0UHJvdmlkZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPYnRhaW4gYSBiZWFuIHJlZmVyZW5jZSBvZiBnaXZlbiB0eXBlIGZyb20gdGhlIGJlYW4gbWFuYWdlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGF6eiAgICAgICAgIHR5cGUgb2YgdGhlIGJlYW4gdG8gZ2V0IHJlZmVyZW5jZSB0by4KKyAgICAgKiBAcGFyYW0gYmVhbiAgICAgICAgICB0aGUge0BsaW5rIEJlYW59IG9iamVjdCByZXByZXNlbnRpbmcgdGhlIG1hbmFnZWQgYmVhbi4KKyAgICAgKiBAcGFyYW0gYmVhbk1hbmFnZXIgICBiZWFuIG1hbmFnZXIgdXNlZCB0byBvYnRhaW4gYW4gaW5zdGFuY2Ugb2YgdGhlIHJlcXVlc3RlZCBiZWFuLgorICAgICAqIEBwYXJhbSA8VD4gICAgICAgICAgIHR5cGUgb2YgdGhlIGJlYW4gdG8gYmUgcmV0dXJuZWQuCisgICAgICogQHJldHVybiBhIGJlYW4gcmVmZXJlbmNlIG9yIHtAY29kZSBudWxsfSBpZiBhIGJlYW4gaW5zdGFuY2UgY2Fubm90IGJlIGZvdW5kLgorICAgICAqLworICAgIHN0YXRpYyA8VD4gVCBnZXRCZWFuUmVmZXJlbmNlKGZpbmFsIENsYXNzPFQ+IGNsYXp6LCBmaW5hbCBCZWFuIGJlYW4sIGZpbmFsIEJlYW5NYW5hZ2VyIGJlYW5NYW5hZ2VyKSB7CisgICAgICAgIGZpbmFsIENyZWF0aW9uYWxDb250ZXh0PD8+IGNyZWF0aW9uYWxDb250ZXh0ID0gYmVhbk1hbmFnZXIuY3JlYXRlQ3JlYXRpb25hbENvbnRleHQoYmVhbik7CisgICAgICAgIGZpbmFsIE9iamVjdCByZXN1bHQgPSBiZWFuTWFuYWdlci5nZXRSZWZlcmVuY2UoYmVhbiwgY2xhenosIGNyZWF0aW9uYWxDb250ZXh0KTsKKworICAgICAgICByZXR1cm4gY2xhenouY2FzdChyZXN1bHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBtZSBzY29wZSBvZiBhIGJlYW4gY29ycmVzcG9uZGluZyB0byBnaXZlbiBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiZWFuQ2xhc3MgYmVhbiBjbGFzcyBpbiBxdWVzdGlvbi4KKyAgICAgKiBAcGFyYW0gYmVhbk1hbmFnZXIgYWN0dWFsIGJlYW4gbWFuYWdlci4KKyAgICAgKiBAcmV0dXJuIGFjdHVhbCBiZWFuIHNjb3BlIG9yIG51bGwsIGlmIHRoZSBzY29wZSBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBnZXRCZWFuU2NvcGUoZmluYWwgQ2xhc3M8Pz4gYmVhbkNsYXNzLCBmaW5hbCBCZWFuTWFuYWdlciBiZWFuTWFuYWdlcikgeworICAgICAgICBmaW5hbCBTZXQ8QmVhbjw/Pj4gYmVhbnMgPSBiZWFuTWFuYWdlci5nZXRCZWFucyhiZWFuQ2xhc3MpOworICAgICAgICBpZiAoYmVhbnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKEJlYW4gYiA6IGJlYW5zKSB7CisgICAgICAgICAgICByZXR1cm4gYi5nZXRTY29wZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9jZGkvamVyc2V5LWNkaTF4L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXh0L2NkaTF4L2ludGVybmFsL0RlZmF1bHRCZWFuTWFuYWdlclByb3ZpZGVyLmphdmEgYi9leHQvY2RpL2plcnNleS1jZGkxeC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4dC9jZGkxeC9pbnRlcm5hbC9EZWZhdWx0QmVhbk1hbmFnZXJQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZDgwODcKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvY2RpL2plcnNleS1jZGkxeC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4dC9jZGkxeC9pbnRlcm5hbC9EZWZhdWx0QmVhbk1hbmFnZXJQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTF4LmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkJlYW5NYW5hZ2VyOworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5DREk7CitpbXBvcnQgamF2YXgubmFtaW5nLkluaXRpYWxDb250ZXh0OworaW1wb3J0IGphdmF4Lm5hbWluZy5OYW1pbmdFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpMXguaW50ZXJuYWwuc3BpLkJlYW5NYW5hZ2VyUHJvdmlkZXI7CisKKy8qKgorICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgQmVhbk1hbmFnZXJQcm92aWRlcn0gdGhhdCB3b3JrcyBvbiBtb3N0IGVudmlyb25tZW50cy4KKyAqIEF0IGZpcnN0IHRoZSBpbXBsZW1lbnRhdGlvbiB0cmllcyB0byBsb29rdXAgdGhlIGJlYW4gbWFuYWdlciBpbiBKTkRJLCB0aGVuIHZpYSBDREkgMS4xIEFQSS4gSWYgbm90IGZvdW5kIHtAY29kZSBudWxsfSBpcworICogcmV0dXJuZWQuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKiBAc2luY2UgMi4xNworICovCitmaW5hbCBjbGFzcyBEZWZhdWx0QmVhbk1hbmFnZXJQcm92aWRlciBpbXBsZW1lbnRzIEJlYW5NYW5hZ2VyUHJvdmlkZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoRGVmYXVsdEJlYW5NYW5hZ2VyUHJvdmlkZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBCZWFuTWFuYWdlciBnZXRCZWFuTWFuYWdlcigpIHsKKyAgICAgICAgSW5pdGlhbENvbnRleHQgaW5pdGlhbENvbnRleHQgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW5pdGlhbENvbnRleHQgPSBuZXcgSW5pdGlhbENvbnRleHQoKTsKKyAgICAgICAgICAgIHJldHVybiAoQmVhbk1hbmFnZXIpIGluaXRpYWxDb250ZXh0Lmxvb2t1cCgiamF2YTpjb21wL0JlYW5NYW5hZ2VyIik7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQ0RJLmN1cnJlbnQoKS5nZXRCZWFuTWFuYWdlcigpOworICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMT0dHRVIuY29uZmlnKExvY2FsaXphdGlvbk1lc3NhZ2VzLkNESV9CRUFOX01BTkFHRVJfSk5ESV9MT09LVVBfRkFJTEVEKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKGluaXRpYWxDb250ZXh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBpbml0aWFsQ29udGV4dC5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIE5hbWluZ0V4Y2VwdGlvbiBpZ25vcmVkKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5vLW9wCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L2NkaS9qZXJzZXktY2RpMXgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leHQvY2RpMXgvaW50ZXJuYWwvR2VuZXJpY0NkaUJlYW5TdXBwbGllci5qYXZhIGIvZXh0L2NkaS9qZXJzZXktY2RpMXgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leHQvY2RpMXgvaW50ZXJuYWwvR2VuZXJpY0NkaUJlYW5TdXBwbGllci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiM2QzNzQKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvY2RpL2plcnNleS1jZGkxeC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4dC9jZGkxeC9pbnRlcm5hbC9HZW5lcmljQ2RpQmVhblN1cHBsaWVyLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpMXguaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5WZXRvZWQ7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkJlYW5NYW5hZ2VyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CisKKy8qKgorICogU3VwcGxpZXIgdG8gcHJvdmlkZSBDREkgbWFuYWdlZCBjb21wb25lbnRzIHdoZXJlCisgKiB0aGVyZSBpcyBubyBjbGVhciBtYXBwaW5nIGJldHdlZW4gdGhlIENESSBhbmQgc2NvcGVzLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BWZXRvZWQKK3B1YmxpYyBmaW5hbCBjbGFzcyBHZW5lcmljQ2RpQmVhblN1cHBsaWVyIGV4dGVuZHMgQWJzdHJhY3RDZGlCZWFuU3VwcGxpZXIgeworCisgICAgcHVibGljIEdlbmVyaWNDZGlCZWFuU3VwcGxpZXIoQ2xhc3MgcmF3VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJlYW5NYW5hZ2VyIGJlYW5NYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBjZGlNYW5hZ2VkKSB7CisgICAgICAgIHN1cGVyKHJhd1R5cGUsIGluamVjdGlvbk1hbmFnZXIsIGJlYW5NYW5hZ2VyLCBjZGlNYW5hZ2VkKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IGdldCgpIHsKKyAgICAgICAgcmV0dXJuIF9wcm92aWRlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L2NkaS9qZXJzZXktY2RpMXgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leHQvY2RpMXgvaW50ZXJuYWwvR2VuZXJpY0luamVjdGlvbk1hbmFnZXJTdG9yZS5qYXZhIGIvZXh0L2NkaS9qZXJzZXktY2RpMXgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leHQvY2RpMXgvaW50ZXJuYWwvR2VuZXJpY0luamVjdGlvbk1hbmFnZXJTdG9yZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNzVhNmEKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvY2RpL2plcnNleS1jZGkxeC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4dC9jZGkxeC9pbnRlcm5hbC9HZW5lcmljSW5qZWN0aW9uTWFuYWdlclN0b3JlLmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpMXguaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkxeC5pbnRlcm5hbC5zcGkuSW5qZWN0aW9uTWFuYWdlckluamVjdGVkVGFyZ2V0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkxeC5pbnRlcm5hbC5zcGkuSW5qZWN0aW9uTWFuYWdlclN0b3JlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkxeC5pbnRlcm5hbC5zcGkuSW5qZWN0aW9uVGFyZ2V0TGlzdGVuZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CisKKy8qKgorICogR2VuZXJpYyB7QGxpbmsgSW5qZWN0aW9uTWFuYWdlclN0b3JlIGluamVjdGlvbiBtYW5hZ2VyIHN0b3JlfSB0aGF0IGFsbG93cyBtdWx0aXBsZQorICogaW5qZWN0aW9uIG1hbmFnZXJzIHRvIHJ1biBpbiBwYXJhbGxlbC4ge0BsaW5rICNsb29rdXBJbmplY3Rpb25NYW5hZ2VyKCl9CisgKiBtZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCB0aGF0IHNoYWxsIGJlIHV0aWxpemVkIGF0IHJ1bnRpbWUgaW4gdGhlIGNhc2UgdGhhdCBtb3JlIHRoYW4gYSBzaW5nbGUKKyAqIGluamVjdGlvbiBtYW5hZ2VyIGhhcyBiZWVuIHJlZ2lzdGVyZWQuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBzaW5jZSAyLjIwCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBHZW5lcmljSW5qZWN0aW9uTWFuYWdlclN0b3JlIGltcGxlbWVudHMgSW5qZWN0aW9uTWFuYWdlclN0b3JlLCBJbmplY3Rpb25UYXJnZXRMaXN0ZW5lciB7CisKKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8SW5qZWN0aW9uTWFuYWdlckluamVjdGVkVGFyZ2V0PiBpbmplY3Rpb25UYXJnZXRzOworCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXI7CisKKyAgICBwcml2YXRlIHZvbGF0aWxlIGJvb2xlYW4gbXVsdGlwbGVJbmplY3Rpb25NYW5hZ2VycyA9IGZhbHNlOworCisgICAgcHVibGljIEdlbmVyaWNJbmplY3Rpb25NYW5hZ2VyU3RvcmUoKSB7CisgICAgICAgIGluamVjdGlvblRhcmdldHMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJJbmplY3Rpb25NYW5hZ2VyKGZpbmFsIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlcikgeworICAgICAgICBpZiAoIW11bHRpcGxlSW5qZWN0aW9uTWFuYWdlcnMpIHsKKyAgICAgICAgICAgIGlmICh0aGlzLmluamVjdGlvbk1hbmFnZXIgPT0gbnVsbCkgeyAvLyBmaXJzdCBvbmUKKyAgICAgICAgICAgICAgICB0aGlzLmluamVjdGlvbk1hbmFnZXIgPSBpbmplY3Rpb25NYW5hZ2VyOworICAgICAgICAgICAgfSBlbHNlIHsgLy8gc2Vjb25kIG9uZQorICAgICAgICAgICAgICAgIHRoaXMuaW5qZWN0aW9uTWFuYWdlciA9IG51bGw7CisgICAgICAgICAgICAgICAgbXVsdGlwbGVJbmplY3Rpb25NYW5hZ2VycyA9IHRydWU7CisgICAgICAgICAgICB9IC8vIGZpcnN0IGFuZCBzZWNvbmQgY2FzZQorICAgICAgICB9CisKKyAgICAgICAgLy8gcGFzcyB0aGUgaW5qZWN0aW9uIG1hbmFnZXIgdG8gcmVnaXN0ZXJlZCBpbmplY3Rpb24gdGFyZ2V0cyBhbnl3YXkKKyAgICAgICAgZm9yIChmaW5hbCBJbmplY3Rpb25NYW5hZ2VySW5qZWN0ZWRUYXJnZXQgdGFyZ2V0IDogaW5qZWN0aW9uVGFyZ2V0cykgeworICAgICAgICAgICAgdGFyZ2V0LnNldEluamVjdGlvbk1hbmFnZXIoaW5qZWN0aW9uTWFuYWdlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSW5qZWN0aW9uTWFuYWdlciBnZXRFZmZlY3RpdmVJbmplY3Rpb25NYW5hZ2VyKCkgeworICAgICAgICByZXR1cm4gIW11bHRpcGxlSW5qZWN0aW9uTWFuYWdlcnMgPyBpbmplY3Rpb25NYW5hZ2VyIDogbG9va3VwSW5qZWN0aW9uTWFuYWdlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENESSBjb250YWluZXIgc3BlY2lmaWMgbWV0aG9kIHRvIG9idGFpbiB0aGUgYWN0dWFsIGluamVjdGlvbiBtYW5hZ2VyCisgICAgICogYmVsb25naW5nIHRvIHRoZSBKZXJzZXkgYXBwbGljYXRpb24gd2hlcmUgdGhlIGN1cnJlbnQgSFRUUCByZXF1ZXN0cworICAgICAqIGlzIGJlaW5nIHByb2Nlc3NlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYWN0dWFsIGluamVjdGlvbiBtYW5hZ2VyLgorICAgICAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBJbmplY3Rpb25NYW5hZ2VyIGxvb2t1cEluamVjdGlvbk1hbmFnZXIoKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG5vdGlmeShmaW5hbCBJbmplY3Rpb25NYW5hZ2VySW5qZWN0ZWRUYXJnZXQgdGFyZ2V0KSB7CisKKyAgICAgICAgaW5qZWN0aW9uVGFyZ2V0cy5hZGQodGFyZ2V0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvY2RpL2plcnNleS1jZGkxeC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4dC9jZGkxeC9pbnRlcm5hbC9JbmplY3RlZVNraXBwaW5nQW5hbHl6ZXIuamF2YSBiL2V4dC9jZGkvamVyc2V5LWNkaTF4L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXh0L2NkaTF4L2ludGVybmFsL0luamVjdGVlU2tpcHBpbmdBbmFseXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZjc0NDYKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvY2RpL2plcnNleS1jZGkxeC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4dC9jZGkxeC9pbnRlcm5hbC9JbmplY3RlZVNraXBwaW5nQW5hbHl6ZXIuamF2YQpAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpMXguaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZW1iZXI7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLlZpZXdzOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIuYXBpLkNsYXNzQW5hbHl6ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIuYXBpLk11bHRpRXhjZXB0aW9uOworCisvKioKKyAqIENsYXNzIGFuYWx5emVyIHRoYXQgaWdub3JlcyBnaXZlbiBpbmplY3Rpb24gcG9pbnRzLgorICogVXNlZCBmb3IgQ0RJIGludGVncmF0aW9uLCB3aGVyZSB3ZSBuZWVkIHRvIGF2b2lkIEhLMiByZXBsYWNpbmcgQ0RJIGluamVjdGVkIGVudGl0aWVzLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBJbmplY3RlZVNraXBwaW5nQW5hbHl6ZXIgaW1wbGVtZW50cyBDbGFzc0FuYWx5emVyIHsKKworICAgIHByaXZhdGUgZmluYWwgQ2xhc3NBbmFseXplciBkZWZhdWx0QW5hbHl6ZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8Q2xhc3M8Pz4sIFNldDxNZXRob2Q+PiBtZXRob2RzVG9Ta2lwOworICAgIHByaXZhdGUgZmluYWwgTWFwPENsYXNzPD8+LCBTZXQ8RmllbGQ+PiBmaWVsZHNUb1NraXA7CisKKyAgICBwdWJsaWMgSW5qZWN0ZWVTa2lwcGluZ0FuYWx5emVyKENsYXNzQW5hbHl6ZXIgZGVmYXVsdEFuYWx5emVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPENsYXNzPD8+LCBTZXQ8TWV0aG9kPj4gbWV0aG9kc1RvU2tpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxDbGFzczw/PiwgU2V0PEZpZWxkPj4gZmllbGRzVG9Ta2lwKSB7CisgICAgICAgIHRoaXMuZGVmYXVsdEFuYWx5emVyID0gZGVmYXVsdEFuYWx5emVyOworICAgICAgICB0aGlzLm1ldGhvZHNUb1NraXAgPSBtZXRob2RzVG9Ta2lwOworICAgICAgICB0aGlzLmZpZWxkc1RvU2tpcCA9IGZpZWxkc1RvU2tpcDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFQ+IENvbnN0cnVjdG9yPFQ+IGdldENvbnN0cnVjdG9yKENsYXNzPFQ+IHR5cGUpIHRocm93cyBNdWx0aUV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5DRElfQ0xBU1NfQU5BTFlaRVJfTUlTVVNFRCgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFQ+IFNldDxNZXRob2Q+IGdldEluaXRpYWxpemVyTWV0aG9kcyhDbGFzczxUPiB0eXBlKSB0aHJvd3MgTXVsdGlFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTZXQ8TWV0aG9kPiBvcmlnaW5hbE1ldGhvZHMgPSBkZWZhdWx0QW5hbHl6ZXIuZ2V0SW5pdGlhbGl6ZXJNZXRob2RzKHR5cGUpOworICAgICAgICBmaW5hbCBTZXQ8TWV0aG9kPiBza2lwcGVkTWV0aG9kcyA9IGdldE1lbWJlcnNUb1NraXAodHlwZSwgbWV0aG9kc1RvU2tpcCk7CisgICAgICAgIHJldHVybiBWaWV3cy5zZXREaWZmVmlldyhvcmlnaW5hbE1ldGhvZHMsIHNraXBwZWRNZXRob2RzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFQ+IFNldDxGaWVsZD4gZ2V0RmllbGRzKENsYXNzPFQ+IHR5cGUpIHRocm93cyBNdWx0aUV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFNldDxGaWVsZD4gb3JpZ2luYWxGaWVsZHMgPSBkZWZhdWx0QW5hbHl6ZXIuZ2V0RmllbGRzKHR5cGUpOworICAgICAgICBmaW5hbCBTZXQ8RmllbGQ+IHNraXBwZWRGaWVsZHMgPSBnZXRNZW1iZXJzVG9Ta2lwKHR5cGUsIGZpZWxkc1RvU2tpcCk7CisgICAgICAgIHJldHVybiBWaWV3cy5zZXREaWZmVmlldyhvcmlnaW5hbEZpZWxkcywgc2tpcHBlZEZpZWxkcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxUPiBNZXRob2QgZ2V0UG9zdENvbnN0cnVjdE1ldGhvZChDbGFzczxUPiB0eXBlKSB0aHJvd3MgTXVsdGlFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLkNESV9DTEFTU19BTkFMWVpFUl9NSVNVU0VEKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gTWV0aG9kIGdldFByZURlc3Ryb3lNZXRob2QoQ2xhc3M8VD4gdHlwZSkgdGhyb3dzIE11bHRpRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5DRElfQ0xBU1NfQU5BTFlaRVJfTUlTVVNFRCgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIDxNIGV4dGVuZHMgTWVtYmVyPiBTZXQ8TT4gZ2V0TWVtYmVyc1RvU2tpcChmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBNYXA8Q2xhc3M8Pz4sIFNldDxNPj4gc2tpcHBlZE1lbWJlcnMpIHsKKworICAgICAgICBmaW5hbCBTZXQ8TT4gZGlyZWN0UmVzdWx0ID0gc2tpcHBlZE1lbWJlcnMuZ2V0KHR5cGUpOworCisgICAgICAgIGlmIChkaXJlY3RSZXN1bHQgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGRpcmVjdFJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGZhbGxiYWNrIGZvciBHTEFTU0ZJU0gtMjAyNTUKKyAgICAgICAgZmluYWwgU2V0PE0+IGNvbXBvc2l0ZVJlc3VsdCA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgZm9yIChFbnRyeTxDbGFzczw/PiwgU2V0PE0+PiB0eXBlMk1ldGhvZCA6IHNraXBwZWRNZW1iZXJzLmVudHJ5U2V0KCkpIHsKKworICAgICAgICAgICAgaWYgKHR5cGUyTWV0aG9kLmdldEtleSgpLmlzQXNzaWduYWJsZUZyb20odHlwZSkpIHsKKyAgICAgICAgICAgICAgICBjb21wb3NpdGVSZXN1bHQuYWRkQWxsKHR5cGUyTWV0aG9kLmdldFZhbHVlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZVJlc3VsdDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvY2RpL2plcnNleS1jZGkxeC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4dC9jZGkxeC9pbnRlcm5hbC9KZXJzZXlWZXRvZWQuamF2YSBiL2V4dC9jZGkvamVyc2V5LWNkaTF4L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXh0L2NkaTF4L2ludGVybmFsL0plcnNleVZldG9lZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyOTQxNTUKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvY2RpL2plcnNleS1jZGkxeC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4dC9jZGkxeC9pbnRlcm5hbC9KZXJzZXlWZXRvZWQuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkxeC5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCisvKioKKyAqIFVzZSB0aGlzIHRvIGFubm90YXRlIHR5cGVzIGluY2x1ZGVkIGluIEplcnNleSBsaWJyYXJpZXMKKyAqIHRoYXQgYXJlIHRvIGJlIENESSBtYW5hZ2VkIGFzIGRlZmluZWQgYnkgdGhlIHtAbGluayBDZGlDb21wb25lbnRQcm92aWRlcn0KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAVGFyZ2V0KEVsZW1lbnRUeXBlLlRZUEUpCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorcHVibGljIEBpbnRlcmZhY2UgSmVyc2V5VmV0b2VkIHsKK30KZGlmZiAtLWdpdCBhL2V4dC9jZGkvamVyc2V5LWNkaTF4L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXh0L2NkaTF4L2ludGVybmFsL1JlcXVlc3RTY29wZWRDZGlCZWFuU3VwcGxpZXIuamF2YSBiL2V4dC9jZGkvamVyc2V5LWNkaTF4L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXh0L2NkaTF4L2ludGVybmFsL1JlcXVlc3RTY29wZWRDZGlCZWFuU3VwcGxpZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmUwMzg1Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2NkaS9qZXJzZXktY2RpMXgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leHQvY2RpMXgvaW50ZXJuYWwvUmVxdWVzdFNjb3BlZENkaUJlYW5TdXBwbGllci5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTF4LmludGVybmFsOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3QuVmV0b2VkOworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5CZWFuTWFuYWdlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWwuUmVxdWVzdFNjb3BlZDsKKworLyoqCisgKiBTdXBwbGllciB0byBwcm92aWRlIENESSBtYW5hZ2VkIGNvbXBvbmVudHMKKyAqIHRoYXQgc2hvdWxkIGJlIG1hcHBlZCBpbnRvIEplcnNleSByZXF1ZXN0IHNjb3BlLgorICogRm9yIHRoZXNlIGNvbXBvbmVudHMsIEplcnNleSB3aWxsIGF2b2lkCisgKiBpbmplY3RpbmcgZHluYW1pYyBwcm94aWVzIGZvciBKQVgtUlMgcmVxdWVzdCBzY29wZWQgaW5qZWN0ZWVzLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BWZXRvZWQKK3B1YmxpYyBmaW5hbCBjbGFzcyBSZXF1ZXN0U2NvcGVkQ2RpQmVhblN1cHBsaWVyIGV4dGVuZHMgQWJzdHJhY3RDZGlCZWFuU3VwcGxpZXIgeworCisgICAgcHVibGljIFJlcXVlc3RTY29wZWRDZGlCZWFuU3VwcGxpZXIoQ2xhc3MgcmF3VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluamVjdGlvbk1hbmFnZXIgbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJlYW5NYW5hZ2VyIGJlYW5NYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBjZGlNYW5hZ2VkKSB7CisgICAgICAgIHN1cGVyKHJhd1R5cGUsIGxvY2F0b3IsIGJlYW5NYW5hZ2VyLCBjZGlNYW5hZ2VkKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAUmVxdWVzdFNjb3BlZAorICAgIHB1YmxpYyBPYmplY3QgZ2V0KCkgeworICAgICAgICByZXR1cm4gX3Byb3ZpZGUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvY2RpL2plcnNleS1jZGkxeC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4dC9jZGkxeC9pbnRlcm5hbC9TaW5nbGVJbmplY3Rpb25NYW5hZ2VyU3RvcmUuamF2YSBiL2V4dC9jZGkvamVyc2V5LWNkaTF4L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXh0L2NkaTF4L2ludGVybmFsL1NpbmdsZUluamVjdGlvbk1hbmFnZXJTdG9yZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMWMwMTEKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvY2RpL2plcnNleS1jZGkxeC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4dC9jZGkxeC9pbnRlcm5hbC9TaW5nbGVJbmplY3Rpb25NYW5hZ2VyU3RvcmUuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkxeC5pbnRlcm5hbDsKKworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTF4LmludGVybmFsLnNwaS5JbmplY3Rpb25NYW5hZ2VyU3RvcmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CisKKy8qKgorICogRGVmYXVsdCB7QGxpbmsgSW5qZWN0aW9uTWFuYWdlclN0b3JlIGluamVjdGlvbiBtYW5hZ2VyfSB0aGF0IGFzc3VtZXMgb25seSBvbmUKKyAqIHtAbGluayBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbiBtYW5hZ2VyfSBwZXIgYXBwbGljYXRpb24gaXMgdXNlZC4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqIEBzaW5jZSAyLjE3CisgKi8KK2ZpbmFsIGNsYXNzIFNpbmdsZUluamVjdGlvbk1hbmFnZXJTdG9yZSBpbXBsZW1lbnRzIEluamVjdGlvbk1hbmFnZXJTdG9yZSB7CisKKyAgICBwcml2YXRlIHZvbGF0aWxlIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlcjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVySW5qZWN0aW9uTWFuYWdlcihmaW5hbCBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIpIHsKKyAgICAgICAgaWYgKHRoaXMuaW5qZWN0aW9uTWFuYWdlciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aGlzLmluamVjdGlvbk1hbmFnZXIgPSBpbmplY3Rpb25NYW5hZ2VyOworICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaW5qZWN0aW9uTWFuYWdlciAhPSBpbmplY3Rpb25NYW5hZ2VyKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViQXBwbGljYXRpb25FeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuQ0RJX01VTFRJUExFX0xPQ0FUT1JTX0lOVE9fU0lNUExFX0FQUCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJbmplY3Rpb25NYW5hZ2VyIGdldEVmZmVjdGl2ZUluamVjdGlvbk1hbmFnZXIoKSB7CisgICAgICAgIHJldHVybiBpbmplY3Rpb25NYW5hZ2VyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9jZGkvamVyc2V5LWNkaTF4L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXh0L2NkaTF4L2ludGVybmFsL3BhY2thZ2UtaW5mby5qYXZhIGIvZXh0L2NkaS9qZXJzZXktY2RpMXgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leHQvY2RpMXgvaW50ZXJuYWwvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc5OTA2ZQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9jZGkvamVyc2V5LWNkaTF4L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXh0L2NkaTF4L2ludGVybmFsL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKKy8qKgorICogSmVyc2V5IGludGVybmFsIHBhY2thZ2Ugc3VwcG9ydGluZyBKZXJzZXkgQ0RJIGludGVncmF0aW9uLgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkxeC5pbnRlcm5hbDsKZGlmZiAtLWdpdCBhL2V4dC9jZGkvamVyc2V5LWNkaTF4L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXh0L2NkaTF4L2ludGVybmFsL3NwaS9CZWFuTWFuYWdlclByb3ZpZGVyLmphdmEgYi9leHQvY2RpL2plcnNleS1jZGkxeC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4dC9jZGkxeC9pbnRlcm5hbC9zcGkvQmVhbk1hbmFnZXJQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmOTUzYzQKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvY2RpL2plcnNleS1jZGkxeC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4dC9jZGkxeC9pbnRlcm5hbC9zcGkvQmVhbk1hbmFnZXJQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTF4LmludGVybmFsLnNwaTsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5CZWFuTWFuYWdlcjsKKworLyoqCisgKiBQcm92aWRlciBTUEkgZm9yIENESSB7QGxpbmsgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkJlYW5NYW5hZ2VyfSBmb3IgdGhlIGN1cnJlbnQgY29udGV4dC4KKyAqIEltcGxlbWVudGF0aW9ucyBjYW4gZGVjaWRlIGhvdyB0byBvYnRhaW4gYmVhbiBtYW5hZ2VyIChlLmcuIHtAbGluayBqYXZheC5uYW1pbmcuSW5pdGlhbENvbnRleHR9LCBDREkgMS4xIEFQSSwgLi4uKS4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqIEBzaW5jZSAyLjE3CisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQmVhbk1hbmFnZXJQcm92aWRlciB7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIENESSB7QGxpbmsgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkJlYW5NYW5hZ2VyIGJlYW4gbWFuYWdlcn0gZm9yIHRoZSBjdXJyZW50IGNvbnRleHQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGJlYW4gbWFuYWdlciBmb3IgdGhlIGN1cnJlbnQgY29udGV4dCBvciB7QGNvZGUgbnVsbH0gaWYgbm8gYmVhbiBtYW5hZ2VyIGlzIGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQmVhbk1hbmFnZXIgZ2V0QmVhbk1hbmFnZXIoKTsKK30KZGlmZiAtLWdpdCBhL2V4dC9jZGkvamVyc2V5LWNkaTF4L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXh0L2NkaTF4L2ludGVybmFsL3NwaS9JbmplY3Rpb25NYW5hZ2VySW5qZWN0ZWRUYXJnZXQuamF2YSBiL2V4dC9jZGkvamVyc2V5LWNkaTF4L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXh0L2NkaTF4L2ludGVybmFsL3NwaS9JbmplY3Rpb25NYW5hZ2VySW5qZWN0ZWRUYXJnZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGQyZWE2Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2NkaS9qZXJzZXktY2RpMXgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leHQvY2RpMXgvaW50ZXJuYWwvc3BpL0luamVjdGlvbk1hbmFnZXJJbmplY3RlZFRhcmdldC5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTF4LmludGVybmFsLnNwaTsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5JbmplY3Rpb25UYXJnZXQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKKworLyoqCisgKiBDREkge0BsaW5rIGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5JbmplY3Rpb25UYXJnZXQgaW5qZWN0aW9uIHRhcmdldH0gdGhhdCBpcyBjby1pbmplY3RlZCBieSBpbmplY3Rpb24gbWFuYWdlci4KKyAqIFRoZSBpbmplY3Rpb24gaXMgZG9uZSB2aWEgZ2l2ZW4ge0BsaW5rIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uIG1hbmFnZXJ9LgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgaW50ZXJmYWNlIEluamVjdGlvbk1hbmFnZXJJbmplY3RlZFRhcmdldCBleHRlbmRzIEluamVjdGlvblRhcmdldCB7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGxvY2F0b3IgdG8gYmUgdXNlZCB0byBjby1pbmplY3QgdGhpcyBpbmplY3Rpb24gdGFyZ2V0LgorICAgICAqCisgICAgICogQHBhcmFtIGluamVjdGlvbk1hbmFnZXIgZWZmZWN0aXZlIGluamVjdGlvbiBtYW5hZ2VyLgorICAgICAqLworICAgIHZvaWQgc2V0SW5qZWN0aW9uTWFuYWdlcihJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIpOworfQpkaWZmIC0tZ2l0IGEvZXh0L2NkaS9qZXJzZXktY2RpMXgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leHQvY2RpMXgvaW50ZXJuYWwvc3BpL0luamVjdGlvbk1hbmFnZXJTdG9yZS5qYXZhIGIvZXh0L2NkaS9qZXJzZXktY2RpMXgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leHQvY2RpMXgvaW50ZXJuYWwvc3BpL0luamVjdGlvbk1hbmFnZXJTdG9yZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyODI1NjUKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvY2RpL2plcnNleS1jZGkxeC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4dC9jZGkxeC9pbnRlcm5hbC9zcGkvSW5qZWN0aW9uTWFuYWdlclN0b3JlLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpMXguaW50ZXJuYWwuc3BpOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CisKKy8qKgorICoge0BsaW5rIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uIG1hbmFnZXJ9IGRlc2lnbmVkIGZvciBKZXJzZXkKKyAqIHtAbGluayBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuRXh0ZW5zaW9uIENESSBleHRlbnNpb259LiBUaGlzIFNQSSBpcyBkZXNpZ25lZCB0byBzdXBwb3J0IGRlcGxveW1lbnRzIHRoYXQgY2FuIGNvbnRhaW4KKyAqIG1vcmUgdGhhbiBvbmUgSmVyc2V5L0luamVjdGlvbk1hbmFnZXIgbWFuYWdlZCBDREkge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29tcG9uZW50UHJvdmlkZXIgY29tcG9uZW50IHByb3ZpZGVyfQorICogKG1vcmUgaW5qZWN0aW9uIG1hbmFnZXIpIGJ1dCBvbmx5IHNpbmdsZSBDREkgZXh0ZW5zaW9uIGluc3RhbmNlIChlLmcuIEVBUiB3aXRoIG11bHRpcGxlIFdBUnMpLiBFYWNoIENESSBjb21wb25lbnQgcHJvdmlkZXIKKyAqIGluc3RhbmNlIGFja25vd2xlZGdlcyB0aGUgbWFuYWdlciBhYm91dCBuZXcgaW5qZWN0aW9uIG1hbmFnZXIgYW5kIG1hbmFnZXIgaXMgc3VwcG9zZWQgdG8gcmV0dXJuIHRoZSBlZmZlY3RpdmUgaW5qZWN0aW9uIG1hbmFnZXIKKyAqIGZvciB0aGUgY3VycmVudCBjb250ZXh0IChiYXNlZCBvbiB0aGUgU2VydmxldCBjb250ZXh0LCBmb3IgZXhhbXBsZSkuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKiBAc2luY2UgMi4xNworICovCitwdWJsaWMgaW50ZXJmYWNlIEluamVjdGlvbk1hbmFnZXJTdG9yZSB7CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBhIG5ldyB7QGxpbmsgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb24gbWFuYWdlcn0gd2l0aCB0aGlzIG1hbmFnZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb24gbWFuYWdlciB0byBiZSByZWdpc3RlcmVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVySW5qZWN0aW9uTWFuYWdlcihJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIpOworCisgICAgLyoqCisgICAgICogT2J0YWluIHRoZSBlZmZlY3RpdmUge0BsaW5rIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uIG1hbmFnZXJ9LiBUaGUgaW1wbGVtZW50YXRpb25zIGFyZSBzdXBwb3NlZCB0bworICAgICAqIGRlY2lkZSB3aGljaCBvZiB0aGUgcmVnaXN0ZXJlZCBpbmplY3Rpb24gbWFuYWdlcnMgaXMgdGhlIGN1cnJlbnRseSBlZmZlY3RpdmUgbG9jYXRvci4gVGhlIGRlY2lzaW9uIGNhbiBiZSBiYXNlZCwgZm9yCisgICAgICogZXhhbXBsZSwgb24gY3VycmVudCBTZXJ2bGV0IGNvbnRleHQgKGlmIHRoZSBhcHBsaWNhdGlvbiBpcyBkZXBsb3llZCBvbiBTZXJ2bGV0IGNvbnRhaW5lcikuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGN1cnJlbnRseSBlZmZlY3RpdmUgaW5qZWN0aW9uIG1hbmFnZXIuCisgICAgICovCisgICAgcHVibGljIEluamVjdGlvbk1hbmFnZXIgZ2V0RWZmZWN0aXZlSW5qZWN0aW9uTWFuYWdlcigpOworfQpkaWZmIC0tZ2l0IGEvZXh0L2NkaS9qZXJzZXktY2RpMXgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leHQvY2RpMXgvaW50ZXJuYWwvc3BpL0luamVjdGlvblRhcmdldExpc3RlbmVyLmphdmEgYi9leHQvY2RpL2plcnNleS1jZGkxeC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4dC9jZGkxeC9pbnRlcm5hbC9zcGkvSW5qZWN0aW9uVGFyZ2V0TGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2JkYjcwCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2NkaS9qZXJzZXktY2RpMXgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leHQvY2RpMXgvaW50ZXJuYWwvc3BpL0luamVjdGlvblRhcmdldExpc3RlbmVyLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpMXguaW50ZXJuYWwuc3BpOworCisvKioKKyAqIEFuIGV4dGVuc2lvbiBpbnRlcmZhY2UgZm9yIGltcGxlbWVudGF0aW9ucyBvZiB7QGxpbmsgSW5qZWN0aW9uTWFuYWdlclN0b3JlfS4gSEsyIGxvY2F0b3IKKyAqIG1hbmFnZXJzIGltcGxlbWVudGluZyB0aGlzIGludGVyZmFjZSBhcmUgbm90aWZpZWQgd2hlbiBhbiB7QGxpbmsgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkluamVjdGlvblRhcmdldCBpbmplY3Rpb24gdGFyZ2V0fQorICogaXMgcHJvY2Vzc2VkIGJ5IHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpMXguaW50ZXJuYWwuQ2RpQ29tcG9uZW50UHJvdmlkZXJ9LiBMb2NhdG9yIG1hbmFnZXJzIGNhbiB0aGVuIHNldCB0aGUKKyAqIGVmZmVjdGl2ZSBpbmplY3Rpb24gbWFuYWdlciB0byB0aGUgcHJvY2Vzc2VkIHtAbGluayBJbmplY3Rpb25NYW5hZ2VySW5qZWN0ZWRUYXJnZXQgdGFyZ2V0fS4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGludGVyZmFjZSBJbmplY3Rpb25UYXJnZXRMaXN0ZW5lciB7CisKKyAgICAvKioKKyAgICAgKiBOb3RpZnkgdGhlIEhLMiBsb2NhdG9yIG1hbmFnZXIgYWJvdXQgbmV3IGluamVjdGlvbiB0YXJnZXQgYmVpbmcgcHJvY2Vzc2VkLgorICAgICAqCisgICAgICogQHBhcmFtIHRhcmdldCBwcm9jZXNzZWQgaW5qZWN0aW9uIHRhcmdldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBub3RpZnkoZmluYWwgSW5qZWN0aW9uTWFuYWdlckluamVjdGVkVGFyZ2V0IHRhcmdldCk7Cit9CmRpZmYgLS1naXQgYS9leHQvY2RpL2plcnNleS1jZGkxeC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4dC9jZGkxeC9pbnRlcm5hbC9zcGkvcGFja2FnZS1pbmZvLmphdmEgYi9leHQvY2RpL2plcnNleS1jZGkxeC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4dC9jZGkxeC9pbnRlcm5hbC9zcGkvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhmMDA3OAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9jZGkvamVyc2V5LWNkaTF4L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXh0L2NkaTF4L2ludGVybmFsL3NwaS9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvKioKKyAqIEplcnNleSBpbnRlcm5hbCBTUEkgdG8gc3VwcG9ydCBjdXN0b20gZGVmaW5lZCBISzIgaW5qZWN0aW9uIGJpbmRpbmcgZm9yIEplcnNleS9DREkgYXBwbGljYXRpb25zLgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkxeC5pbnRlcm5hbC5zcGk7CmRpZmYgLS1naXQgYS9leHQvY2RpL2plcnNleS1jZGkxeC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4dC9jZGkxeC9zcGkvSGsyQ3VzdG9tQm91bmRUeXBlc1Byb3ZpZGVyLmphdmEgYi9leHQvY2RpL2plcnNleS1jZGkxeC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4dC9jZGkxeC9zcGkvSGsyQ3VzdG9tQm91bmRUeXBlc1Byb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNkYWQ0YgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9jZGkvamVyc2V5LWNkaTF4L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXh0L2NkaTF4L3NwaS9IazJDdXN0b21Cb3VuZFR5cGVzUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkxeC5zcGk7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogSGVscGVyIFNQSSB0byBoZWxwIHNwZWNpZnkgSmVyc2V5IEhLMiBjdXN0b20gYm91bmQgdHlwZXMgdGhhdCBzaG91bGQKKyAqIGJlIEhLMi1pbmplY3RhYmxlIGludG8gQ0RJIGNvbXBvbmVudHMuCisgKgorICogPHA+SW1wbGVtZW50YXRpb24gb2YgdGhpcyB0eXBlIG11c3QgYmUgcmVnaXN0ZXJlZCB2aWEgTUVUQS1JTkYvc2VydmljZXMKKyAqIG1lY2hhbmlzbS4gSS5lLiBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiBhbiBpbXBsZW1lbnRhdGlvbiBjbGFzcworICogbXVzdCBiZSB3cml0dGVuIGludG8gPGNvZGU+TUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTExLnNwaS5IazJDdXN0b21Cb3VuZFR5cGVzUHJvdmlkZXI8L2NvZGU+CisgKiBmaWxlLgorICoKKyAqIDxwPklmIG1vcmUgdGhhbiBvbmUgaW1wbGVtZW50YXRpb24gaXMgZm91bmQsIG9ubHkgYSBzaW5nbGUgb25lIGlzIHNlbGVjdGVkIHRoYXQgaGFzIHRoZSBoaWdoZXN0IHByaW9yaXR5LgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSGsyQ3VzdG9tQm91bmRUeXBlc1Byb3ZpZGVyIHsKKworICAgIC8qKgorICAgICAqIFByb3ZpZGUgYSBzZXQgb2YgdHlwZXMgdGhhdCBzaG91bGQgYmVjYW1lIGFjY2Vzc2libGUKKyAgICAgKiBieSBDREkgY29udGFpbmVyIGluIGEgZm9ybSBvZiBDREkgYmVhbnMgYmFja2VkIGJ5IEhLMi4KKyAgICAgKgorICAgICAqIDxwPkplcnNleSB3aWxsIGFzayBDREkgY29udGFpbmVyIHRvIHZldG8gdGhlc2UgdHlwZXMKKyAgICAgKiBhbmQgd2lsbCByZWdpc3RlciBISzIgYmFja2VkIGJlYW5zIGludG8gQ0RJLCBzbyB0aGF0IEB7QGxpbmsgamF2YXguaW5qZWN0LkluamVjdH0KKyAgICAgKiBtYXJrZWQgaW5qZWN0aW9uIHBvaW50cyBjb3VsZCBiZSBzYXRpc2ZpZWQuCisgICAgICoKKyAgICAgKiA8cD5UaGUgZW5kIHVzZXIgaXMgcmVzcG9uc2libGUgZm9yIGRlZmluaW5nIG5lY2Vzc2FyeSBISzIgYmluZGluZ3MKKyAgICAgKiB3aXRoaW4gSmVyc2V5IGFwcGxpY2F0aW9uLiBTaG91bGQgYW55IG9mIHN1Y2ggYmluZGluZ3MgcmVtYWluCisgICAgICogdW5kZWZpbmVkLCBydW50aW1lIGVycm9ycyBhcmUgbGlrZWx5IHRvIG9jY3VyLgorICAgICAqCisgICAgICogQHJldHVybiBzZXQgb2YgdHlwZXMgZm9yIHdoaWNoIEhLMiBiYWNrZWQgQ0RJIGJlYW5zIHNoYWxsIGJlIHJlZ2lzdGVyZWQuCisgICAgICovCisgICAgcHVibGljIFNldDxUeXBlPiBnZXRIazJUeXBlcygpOworfQpkaWZmIC0tZ2l0IGEvZXh0L2NkaS9qZXJzZXktY2RpMXgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leHQvY2RpMXgvc3BpL3BhY2thZ2UtaW5mby5qYXZhIGIvZXh0L2NkaS9qZXJzZXktY2RpMXgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leHQvY2RpMXgvc3BpL3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZTBkYmYKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvY2RpL2plcnNleS1jZGkxeC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4dC9jZGkxeC9zcGkvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoqCisgKiBKZXJzZXkgcGFja2FnZSB0byBzdXBwb3J0IGN1c3RvbSBkZWZpbmVkIEhLMiBpbmplY3Rpb24gYmluZGluZworICogZm9yIEplcnNleS9DREkgYXBwbGljYXRpb25zLgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkxeC5zcGk7CmRpZmYgLS1naXQgYS9leHQvY2RpL2plcnNleS1jZGkxeC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkV4dGVuc2lvbiBiL2V4dC9jZGkvamVyc2V5LWNkaTF4L3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9qYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuRXh0ZW5zaW9uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YWRiZmYKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvY2RpL2plcnNleS1jZGkxeC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkV4dGVuc2lvbgpAQCAtMCwwICsxIEBACitvcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpMXguaW50ZXJuYWwuQ2RpQ29tcG9uZW50UHJvdmlkZXIKZGlmZiAtLWdpdCBhL2V4dC9jZGkvamVyc2V5LWNkaTF4L3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbXBvbmVudFByb3ZpZGVyIGIvZXh0L2NkaS9qZXJzZXktY2RpMXgvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29tcG9uZW50UHJvdmlkZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRhZGJmZgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9jZGkvamVyc2V5LWNkaTF4L3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbXBvbmVudFByb3ZpZGVyCkBAIC0wLDAgKzEgQEAKK29yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkxeC5pbnRlcm5hbC5DZGlDb21wb25lbnRQcm92aWRlcgpkaWZmIC0tZ2l0IGEvZXh0L2NkaS9qZXJzZXktY2RpMXgvc3JjL21haW4vcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4dC9jZGkxeC9pbnRlcm5hbC9sb2NhbGl6YXRpb24ucHJvcGVydGllcyBiL2V4dC9jZGkvamVyc2V5LWNkaTF4L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9leHQvY2RpMXgvaW50ZXJuYWwvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJhYzdkZQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9jZGkvamVyc2V5LWNkaTF4L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9leHQvY2RpMXgvaW50ZXJuYWwvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyNiBAQAorIworIyBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisjIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyMKKyMgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorIyBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisjIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorIyB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisjCisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorIworCitjZGkuYmVhbi5tYW5hZ2VyLmpuZGkubG9va3VwLmZhaWxlZD1GYWlsZWQgdG8gb2J0YWluIEJlYW5NYW5hZ2VyIGZyb20gSk5ESSBsb29rdXAuCitjZGkuY2xhc3MuYW5hbHl6ZXIubWlzdXNlZD1KZXJzZXkgQ0RJIGNsYXNzIGFuYWx5emVyIGlzIHN1cHBvc2VkIHRvIGJlIHVzZWQgb25seSBmb3IgZmllbGQgYW5kIG1ldGhvZCBpbnNwZWN0aW9uIHdoZW4gaW5qZWN0aW5nIENESSBiZWFucy4KK2NkaS5jbGFzcy5iZWluZy5jaGVja2VkPUNsYXNzLCB7MH0sIGlzIGJlaW5nIGNoZWNrZWQgd2l0aCBKZXJzZXkgQ0RJIGNvbXBvbmVudCBwcm92aWRlci4KK2NkaS5jbGFzcy5ib3VuZC53aXRoLmNkaT1DbGFzcywgezB9LCBoYXMgYmVlbiBib3VuZCBieSBKZXJzZXkgQ0RJIGNvbXBvbmVudCBwcm92aWRlci4KK2NkaS5oazIuYmVhbi5yZWdpc3RlcmVkPUNESSBiZWFucyBiYWNrZWQgYnkgSEsyIGhhdmUgYmVlbiByZWdpc3RlcmVkIGZvciB0aGUgZm9sbG93aW5nIHR5cGVzOiB7MH0KK2NkaS5sb29rdXAuZmFpbGVkPUVycm9yIHdoZW4gbG9va3VwIGluc3RhbmNlIG9mIGNsYXNzLCB7MH0sIGluIENESS4KK2NkaS5tdWx0aXBsZS5sb2NhdG9ycy5pbnRvLnNpbXBsZS5hcHA9VHJ5aW5nIHRvIHJlZ2lzdGVyIG11bHRpcGxlIHNlcnZpY2UgbG9jYXRvcnMgaW50byBzaW5nbGUgc2VydmljZSBsb2NhdG9yIGFwcGxpY2F0aW9uLgorY2RpLnByb3ZpZGVyLmluaXRpYWxpemVkPUplcnNleSBDREkgY29tcG9uZW50IHByb3ZpZGVyIGluaXRpYWxpemVkLgorY2RpLnJlcXVlc3Quc2NvcGVkLmNvbXBvbmVudHMucmVjb2duaXplZD1UaGUgZm9sbG93aW5nIENESSB0eXBlcyB3ZXJlIHJlY29nbml6ZWQgYXMgcmVxdWVzdCBzY29wZWQgY29tcG9uZW50cyBpbiBKZXJzZXk6IHswfS4KK2NkaS50eXBlLnZldG9lZD1UaGUgZm9sbG93aW5nIHR5cGVzIGhhdmUgYmVlbiB2ZXRvZWQgYnkgSmVyc2V5IGFzIHBlciB7MH0gY29uZmlndXJhdGlvbjogezF9CmRpZmYgLS1naXQgYS9leHQvY2RpL2plcnNleS1jZGkxeC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4dC9jZGkxeC9pbnRlcm5hbC9DZGlDb21wb25lbnRQcm92aWRlclRlc3QuamF2YSBiL2V4dC9jZGkvamVyc2V5LWNkaTF4L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXh0L2NkaTF4L2ludGVybmFsL0NkaUNvbXBvbmVudFByb3ZpZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNDJmODIKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvY2RpL2plcnNleS1jZGkxeC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4dC9jZGkxeC9pbnRlcm5hbC9DZGlDb21wb25lbnRQcm92aWRlclRlc3QuamF2YQpAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpMXguaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLkh0dHBNZXRob2Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogVGVzdCBmb3Ige0BsaW5rIENkaUNvbXBvbmVudFByb3ZpZGVyfS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQ2RpQ29tcG9uZW50UHJvdmlkZXJUZXN0IHsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlNZXNzYWdlQm9keVJlYWRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5UmVhZGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZShmaW5hbCBDbGFzcyB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPYmplY3QgcmVhZEZyb20oZmluYWwgQ2xhc3MgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwIGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeU90aGVyTWVzc2FnZUJvZHlSZWFkZXIgZXh0ZW5kcyBNeU1lc3NhZ2VCb2R5UmVhZGVyIHsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15UG9qbyB7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBMb2NhdG9yU3ViUmVzb3VyY2UgeworCisgICAgICAgIEBQYXRoKCIvIikKKyAgICAgICAgcHVibGljIE9iamVjdCBsb2NhdG9yKCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZU1ldGhvZFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlTWV0aG9kU3ViUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUYXJnZXQoe0VsZW1lbnRUeXBlLk1FVEhPRH0pCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgICBASHR0cE1ldGhvZChIdHRwTWV0aG9kLkRFTEVURSkKKyAgICBwdWJsaWMgQGludGVyZmFjZSBCSU5HTyB7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDdXN0b21SZXNvdXJjZU1ldGhvZFN1YlJlc291cmNlIHsKKworICAgICAgICBAQklOR08KKyAgICAgICAgcHVibGljIE9iamVjdCBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgcHJvdmlkZXIgZGV0ZWN0aW9uLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByb3ZpZGVycygpIHsKKyAgICAgICAgZmluYWwgQ2RpQ29tcG9uZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgQ2RpQ29tcG9uZW50UHJvdmlkZXIoKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocHJvdmlkZXIuaXNKYXhSc0NvbXBvbmVudFR5cGUoTXlQb2pvLmNsYXNzKSk7CisgICAgICAgIGFzc2VydFRydWUocHJvdmlkZXIuaXNKYXhSc0NvbXBvbmVudFR5cGUoTXlNZXNzYWdlQm9keVJlYWRlci5jbGFzcykpOworICAgICAgICBhc3NlcnRUcnVlKHByb3ZpZGVyLmlzSmF4UnNDb21wb25lbnRUeXBlKE15T3RoZXJNZXNzYWdlQm9keVJlYWRlci5jbGFzcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgc3ViLXJlc291cmNlIGRldGVjdGlvbi4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZXMoKSB7CisgICAgICAgIGZpbmFsIENkaUNvbXBvbmVudFByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IENkaUNvbXBvbmVudFByb3ZpZGVyKCk7CisgICAgICAgIGFzc2VydFRydWUocHJvdmlkZXIuaXNKYXhSc0NvbXBvbmVudFR5cGUoTG9jYXRvclN1YlJlc291cmNlLmNsYXNzKSk7CisgICAgICAgIGFzc2VydFRydWUocHJvdmlkZXIuaXNKYXhSc0NvbXBvbmVudFR5cGUoUmVzb3VyY2VNZXRob2RSZXNvdXJjZS5jbGFzcykpOworICAgICAgICBhc3NlcnRUcnVlKHByb3ZpZGVyLmlzSmF4UnNDb21wb25lbnRUeXBlKFJlc291cmNlTWV0aG9kU3ViUmVzb3VyY2UuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwcm92aWRlci5pc0pheFJzQ29tcG9uZW50VHlwZShDdXN0b21SZXNvdXJjZU1ldGhvZFN1YlJlc291cmNlLmNsYXNzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L2NkaS9qZXJzZXktY2RpMXgvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leHQvY2RpMXgvaW50ZXJuYWwvQ2RpVXRpbFRlc3QuamF2YSBiL2V4dC9jZGkvamVyc2V5LWNkaTF4L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXh0L2NkaTF4L2ludGVybmFsL0NkaVV0aWxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNkYWZlMQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9jZGkvamVyc2V5LWNkaTF4L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvZXh0L2NkaTF4L2ludGVybmFsL0NkaVV0aWxUZXN0LmphdmEKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTF4LmludGVybmFsOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qcmlvcml0eTsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuQmVhbk1hbmFnZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpMXguaW50ZXJuYWwuc3BpLkJlYW5NYW5hZ2VyUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTF4LmludGVybmFsLnNwaS5JbmplY3Rpb25NYW5hZ2VyU3RvcmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pbnN0YW5jZU9mOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLm51bGxWYWx1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCitpbXBvcnQgbW9ja2l0Lk1vY2s7CitpbXBvcnQgbW9ja2l0Lk1vY2tVcDsKK2ltcG9ydCBtb2NraXQuTW9ja2VkOworaW1wb3J0IG1vY2tpdC5WZXJpZmljYXRpb25zOworCisvKioKKyAqIFVuaXQgdGVzdHMgZm9yIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpMXguaW50ZXJuYWwuQ2RpVXRpbH0uCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBDZGlVdGlsVGVzdCB7CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RCZWFuTWFuYWdlclByb3ZpZGVyIGltcGxlbWVudHMgQmVhbk1hbmFnZXJQcm92aWRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCZWFuTWFuYWdlciBnZXRCZWFuTWFuYWdlcigpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJCZWFuTWFuYWdlciEiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZ2V0QmVhbk1hbmFnZXJDdXN0b20oQE1vY2tlZCBmaW5hbCBUZXN0QmVhbk1hbmFnZXJQcm92aWRlciBjdXN0b20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE1vY2tlZCBmaW5hbCBEZWZhdWx0QmVhbk1hbmFnZXJQcm92aWRlciBmYWxsYmFjaykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENkaVV0aWwuZ2V0QmVhbk1hbmFnZXIoKTsKKworICAgICAgICBuZXcgVmVyaWZpY2F0aW9ucygpIHt7CisgICAgICAgICAgICBjdXN0b20uZ2V0QmVhbk1hbmFnZXIoKTsgdGltZXMgPSAxOworICAgICAgICAgICAgZmFsbGJhY2suZ2V0QmVhbk1hbmFnZXIoKTsgdGltZXMgPSAwOworICAgICAgICB9fTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGdldERlZmF1bHRCZWFuTWFuYWdlckRlZmF1bHQoQE1vY2tlZCBmaW5hbCBEZWZhdWx0QmVhbk1hbmFnZXJQcm92aWRlciBmYWxsYmFjaykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG5ldyBNb2NrVXA8Q2RpVXRpbD4oKSB7CisgICAgICAgICAgICBATW9jaworICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoIlVudXNlZERlY2xhcmF0aW9uIikKKyAgICAgICAgICAgIDxUPiBUIGxvb2t1cFNlcnZpY2UoZmluYWwgQ2xhc3M8VD4gY2xhenopIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBDZGlVdGlsLmdldEJlYW5NYW5hZ2VyKCk7CisKKyAgICAgICAgbmV3IFZlcmlmaWNhdGlvbnMoKSB7eworICAgICAgICAgICAgZmFsbGJhY2suZ2V0QmVhbk1hbmFnZXIoKTsgdGltZXMgPSAxOworICAgICAgICB9fTsKKyAgICB9CisKKyAgICBAUHJpb3JpdHkoNTAwKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlTZXJ2aWNlT25lIGltcGxlbWVudHMgTXlTZXJ2aWNlIHsKKyAgICB9CisKKyAgICBAUHJpb3JpdHkoMTAwKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlTZXJ2aWNlVHdvIGltcGxlbWVudHMgTXlTZXJ2aWNlIHsKKyAgICB9CisKKyAgICBAUHJpb3JpdHkoMzAwKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlTZXJ2aWNlVGhyZWUgaW1wbGVtZW50cyBNeVNlcnZpY2UgeworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvb2t1cFNlcnZpY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0VGhhdChDZGlVdGlsLmxvb2t1cFNlcnZpY2UoTXlTZXJ2aWNlLmNsYXNzKSwgaW5zdGFuY2VPZihNeVNlcnZpY2VUd28uY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb29rdXBTZXJ2aWNlTmVnYXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0VGhhdChDZGlVdGlsLmxvb2t1cFNlcnZpY2UoQ2RpVXRpbC5jbGFzcyksIG51bGxWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RJbmplY3Rpb25NYW5hZ2VyU3RvcmUgaW1wbGVtZW50cyBJbmplY3Rpb25NYW5hZ2VyU3RvcmUgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCByZWdpc3RlckluamVjdGlvbk1hbmFnZXIoZmluYWwgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyKSB7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEluamVjdGlvbk1hbmFnZXIgZ2V0RWZmZWN0aXZlSW5qZWN0aW9uTWFuYWdlcigpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjcmVhdGVIazJMb2NhdG9yTWFuYWdlckN1c3RvbSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRUaGF0KENkaVV0aWwuY3JlYXRlSGsySW5qZWN0aW9uTWFuYWdlclN0b3JlKCksIGluc3RhbmNlT2YoVGVzdEluamVjdGlvbk1hbmFnZXJTdG9yZS5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgY3JlYXRlSGsyTG9jYXRvck1hbmFnZXJEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG5ldyBNb2NrVXA8Q2RpVXRpbD4oKSB7CisgICAgICAgICAgICBATW9jaworICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoIlVudXNlZERlY2xhcmF0aW9uIikKKyAgICAgICAgICAgIDxUPiBUIGxvb2t1cFNlcnZpY2UoZmluYWwgQ2xhc3M8VD4gY2xhenopIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBhc3NlcnRUaGF0KENkaVV0aWwuY3JlYXRlSGsySW5qZWN0aW9uTWFuYWdlclN0b3JlKCksIGluc3RhbmNlT2YoU2luZ2xlSW5qZWN0aW9uTWFuYWdlclN0b3JlLmNsYXNzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L2NkaS9qZXJzZXktY2RpMXgvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leHQvY2RpMXgvaW50ZXJuYWwvTXlTZXJ2aWNlLmphdmEgYi9leHQvY2RpL2plcnNleS1jZGkxeC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2V4dC9jZGkxeC9pbnRlcm5hbC9NeVNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTQ1YzE1Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2NkaS9qZXJzZXktY2RpMXgvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9leHQvY2RpMXgvaW50ZXJuYWwvTXlTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpMXguaW50ZXJuYWw7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgTXlTZXJ2aWNlIHsKK30KZGlmZiAtLWdpdCBhL2V4dC9jZGkvamVyc2V5LWNkaTF4L3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpMXguaW50ZXJuYWwuTXlTZXJ2aWNlIGIvZXh0L2NkaS9qZXJzZXktY2RpMXgvc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkxeC5pbnRlcm5hbC5NeVNlcnZpY2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQxZjE4NwotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9jZGkvamVyc2V5LWNkaTF4L3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpMXguaW50ZXJuYWwuTXlTZXJ2aWNlCkBAIC0wLDAgKzEsMyBAQAorb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTF4LmludGVybmFsLkNkaVV0aWxUZXN0JE15U2VydmljZU9uZQorb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTF4LmludGVybmFsLkNkaVV0aWxUZXN0JE15U2VydmljZVR3bworb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTF4LmludGVybmFsLkNkaVV0aWxUZXN0JE15U2VydmljZVRocmVlCmRpZmYgLS1naXQgYS9leHQvY2RpL2plcnNleS1jZGkxeC9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTF4LmludGVybmFsLnNwaS5CZWFuTWFuYWdlclByb3ZpZGVyIGIvZXh0L2NkaS9qZXJzZXktY2RpMXgvc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkxeC5pbnRlcm5hbC5zcGkuQmVhbk1hbmFnZXJQcm92aWRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDJlZWE3Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2NkaS9qZXJzZXktY2RpMXgvc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkxeC5pbnRlcm5hbC5zcGkuQmVhbk1hbmFnZXJQcm92aWRlcgpAQCAtMCwwICsxIEBACitvcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpMXguaW50ZXJuYWwuQ2RpVXRpbFRlc3QkVGVzdEJlYW5NYW5hZ2VyUHJvdmlkZXIKZGlmZiAtLWdpdCBhL2V4dC9jZGkvamVyc2V5LWNkaTF4L3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpMXguaW50ZXJuYWwuc3BpLkluamVjdGlvbk1hbmFnZXJTdG9yZSBiL2V4dC9jZGkvamVyc2V5LWNkaTF4L3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpMXguaW50ZXJuYWwuc3BpLkluamVjdGlvbk1hbmFnZXJTdG9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTM3NTZkCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2NkaS9qZXJzZXktY2RpMXgvc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkxeC5pbnRlcm5hbC5zcGkuSW5qZWN0aW9uTWFuYWdlclN0b3JlCkBAIC0wLDAgKzEgQEAKK29yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkxeC5pbnRlcm5hbC5DZGlVdGlsVGVzdCRUZXN0SW5qZWN0aW9uTWFuYWdlclN0b3JlCmRpZmYgLS1naXQgYS9leHQvY2RpL2plcnNleS13ZWxkMi1zZS9wb20ueG1sIGIvZXh0L2NkaS9qZXJzZXktd2VsZDItc2UvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWU4OGM4Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2NkaS9qZXJzZXktd2VsZDItc2UvcG9tLnhtbApAQCAtMCwwICsxLDY2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGk8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktd2VsZDItc2U8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktZXh0LXdlbGQyLXNlPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPldFTEQgMi54IFNFIHN1cHBvcnQ8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuamJvc3Mud2VsZC5zZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPndlbGQtc2UtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktc2VydmVyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jZGkxeDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cmVzb3VyY2VzPgorICAgICAgICAgICAgPHJlc291cmNlPgorICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9qYXZhPC9kaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5NRVRBLUlORi8qKi8qPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgICAgICA8L3Jlc291cmNlPgorICAgICAgICAgICAgPHJlc291cmNlPgorICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICA8ZmlsdGVyaW5nPnRydWU8L2ZpbHRlcmluZz4KKyAgICAgICAgICAgIDwvcmVzb3VyY2U+CisgICAgICAgIDwvcmVzb3VyY2VzPgorICAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXh0L2NkaS9qZXJzZXktd2VsZDItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS93ZWxkL3NlL1dlbGRJbmplY3Rpb25NYW5hZ2VyU3RvcmUuamF2YSBiL2V4dC9jZGkvamVyc2V5LXdlbGQyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvd2VsZC9zZS9XZWxkSW5qZWN0aW9uTWFuYWdlclN0b3JlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhmNTAxZAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9jZGkvamVyc2V5LXdlbGQyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvd2VsZC9zZS9XZWxkSW5qZWN0aW9uTWFuYWdlclN0b3JlLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS53ZWxkLnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTF4LmludGVybmFsLkdlbmVyaWNJbmplY3Rpb25NYW5hZ2VyU3RvcmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTF4LmludGVybmFsLnNwaS5JbmplY3Rpb25NYW5hZ2VyU3RvcmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CisKKy8qKgorICoge0BsaW5rIEluamVjdGlvbk1hbmFnZXJTdG9yZSBJbmplY3Rpb24gbWFuYWdlcn0gZm9yIFdlbGQgU0UgY29udGFpbmVyLiBUaGUgcHJvdmlkZXIKKyAqIGVuYWJsZXMgbXVsdGlwbGUgSmVyc2V5IGFwcGxpY2F0aW9ucyB0byBiZSBkZXBsb3llZCB3aXRoaW4gYSBzaW5nbGUgSFRUUCBjb250YWluZXIuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBzaW5jZSAyLjIwCisgKi8KK3B1YmxpYyBjbGFzcyBXZWxkSW5qZWN0aW9uTWFuYWdlclN0b3JlIGV4dGVuZHMgR2VuZXJpY0luamVjdGlvbk1hbmFnZXJTdG9yZSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSW5qZWN0aW9uTWFuYWdlciBsb29rdXBJbmplY3Rpb25NYW5hZ2VyKCkgeworICAgICAgICByZXR1cm4gV2VsZFJlcXVlc3RTY29wZS5hY3R1YWxJbmplY3Rvck1hbmFnZXIuZ2V0KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L2NkaS9qZXJzZXktd2VsZDItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS93ZWxkL3NlL1dlbGRSZXF1ZXN0U2NvcGUuamF2YSBiL2V4dC9jZGkvamVyc2V5LXdlbGQyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvd2VsZC9zZS9XZWxkUmVxdWVzdFNjb3BlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRmOGM1MgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9jZGkvamVyc2V5LXdlbGQyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvd2VsZC9zZS9XZWxkUmVxdWVzdFNjb3BlLmphdmEKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS53ZWxkLnNlOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5BcHBsaWNhdGlvblNjb3BlZDsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTF4LmludGVybmFsLkplcnNleVZldG9lZDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkV4dGVybmFsUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5FeHRlcm5hbFJlcXVlc3RTY29wZTsKKworaW1wb3J0IG9yZy5qYm9zcy53ZWxkLmNvbnRleHQuYm91bmQuQm91bmRSZXF1ZXN0Q29udGV4dDsKKworLyoqCisgKiBXZWxkIHNwZWNpZmljIHJlcXVlc3Qgc2NvcGUgdG8gYWxpZ24gQ0RJIHJlcXVlc3QgY29udGV4dCB3aXRoIEplcnNleS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAQXBwbGljYXRpb25TY29wZWQKK0BKZXJzZXlWZXRvZWQKK3B1YmxpYyBjbGFzcyBXZWxkUmVxdWVzdFNjb3BlIGltcGxlbWVudHMgRXh0ZXJuYWxSZXF1ZXN0U2NvcGU8TWFwPFN0cmluZywgT2JqZWN0Pj4geworCisgICAgQEluamVjdAorICAgIHByaXZhdGUgQm91bmRSZXF1ZXN0Q29udGV4dCBjb250ZXh0OworCisgICAgcHJpdmF0ZSBmaW5hbCBUaHJlYWRMb2NhbDxNYXA8U3RyaW5nLCBPYmplY3Q+PiBhY3R1YWxNYXAgPSBuZXcgVGhyZWFkTG9jYWw8PigpOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBUaHJlYWRMb2NhbDxJbmplY3Rpb25NYW5hZ2VyPiBhY3R1YWxJbmplY3Rvck1hbmFnZXIgPSBuZXcgVGhyZWFkTG9jYWw8PigpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEV4dGVybmFsUmVxdWVzdENvbnRleHQ8TWFwPFN0cmluZywgT2JqZWN0Pj4gb3BlbihJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIpIHsKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBuZXdNYXAgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpOworICAgICAgICBhY3R1YWxNYXAuc2V0KG5ld01hcCk7CisgICAgICAgIGNvbnRleHQuYXNzb2NpYXRlKG5ld01hcCk7CisgICAgICAgIGNvbnRleHQuYWN0aXZhdGUoKTsKKyAgICAgICAgYWN0dWFsSW5qZWN0b3JNYW5hZ2VyLnNldChpbmplY3Rpb25NYW5hZ2VyKTsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFJlcXVlc3RDb250ZXh0PD4obmV3TWFwKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZXN1bWUoZmluYWwgRXh0ZXJuYWxSZXF1ZXN0Q29udGV4dDxNYXA8U3RyaW5nLCBPYmplY3Q+PiBjdHgsIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlcikgeworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IG5ld01hcCA9IGN0eC5nZXRDb250ZXh0KCk7CisgICAgICAgIGFjdHVhbEluamVjdG9yTWFuYWdlci5zZXQoaW5qZWN0aW9uTWFuYWdlcik7CisgICAgICAgIGFjdHVhbE1hcC5zZXQobmV3TWFwKTsKKyAgICAgICAgY29udGV4dC5hc3NvY2lhdGUobmV3TWFwKTsKKyAgICAgICAgY29udGV4dC5hY3RpdmF0ZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHN1c3BlbmQoZmluYWwgRXh0ZXJuYWxSZXF1ZXN0Q29udGV4dDxNYXA8U3RyaW5nLCBPYmplY3Q+PiBjdHgsIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlcikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBjb250ZXh0TWFwID0gYWN0dWFsTWFwLmdldCgpOworICAgICAgICAgICAgaWYgKGNvbnRleHRNYXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvbnRleHQuZGVhY3RpdmF0ZSgpOworICAgICAgICAgICAgICAgIGNvbnRleHQuZGlzc29jaWF0ZShjb250ZXh0TWFwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGFjdHVhbE1hcC5yZW1vdmUoKTsKKyAgICAgICAgICAgIGFjdHVhbEluamVjdG9yTWFuYWdlci5yZW1vdmUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBjb250ZXh0TWFwID0gYWN0dWFsTWFwLmdldCgpOworICAgICAgICAgICAgaWYgKGNvbnRleHRNYXAgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvbnRleHQuaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgICAgIGNvbnRleHQuZGVhY3RpdmF0ZSgpOworICAgICAgICAgICAgICAgIGNvbnRleHQuZGlzc29jaWF0ZShjb250ZXh0TWFwKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5kZWFjdGl2YXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBhY3R1YWxNYXAucmVtb3ZlKCk7CisgICAgICAgICAgICBhY3R1YWxJbmplY3Rvck1hbmFnZXIucmVtb3ZlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvY2RpL2plcnNleS13ZWxkMi1zZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvYmVhbnMueG1sIGIvZXh0L2NkaS9qZXJzZXktd2VsZDItc2Uvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2JlYW5zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWYwNTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2NkaS9qZXJzZXktd2VsZDItc2Uvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2JlYW5zLnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxiZWFucy8+CmRpZmYgLS1naXQgYS9leHQvY2RpL2plcnNleS13ZWxkMi1zZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTF4LmludGVybmFsLnNwaS5JbmplY3Rpb25NYW5hZ2VyU3RvcmUgYi9leHQvY2RpL2plcnNleS13ZWxkMi1zZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTF4LmludGVybmFsLnNwaS5JbmplY3Rpb25NYW5hZ2VyU3RvcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhkYzVmMQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9jZGkvamVyc2V5LXdlbGQyLXNlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpMXguaW50ZXJuYWwuc3BpLkluamVjdGlvbk1hbmFnZXJTdG9yZQpAQCAtMCwwICsxIEBACitvcmcuZ2xhc3NmaXNoLmplcnNleS53ZWxkLnNlLldlbGRJbmplY3Rpb25NYW5hZ2VyU3RvcmUKZGlmZiAtLWdpdCBhL2V4dC9jZGkvamVyc2V5LXdlbGQyLXNlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkV4dGVybmFsUmVxdWVzdFNjb3BlIGIvZXh0L2NkaS9qZXJzZXktd2VsZDItc2Uvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuRXh0ZXJuYWxSZXF1ZXN0U2NvcGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMwNGVjMgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9jZGkvamVyc2V5LXdlbGQyLXNlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkV4dGVybmFsUmVxdWVzdFNjb3BlCkBAIC0wLDAgKzEgQEAKK29yZy5nbGFzc2Zpc2guamVyc2V5LndlbGQuc2UuV2VsZFJlcXVlc3RTY29wZQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4dC9jZGkvcG9tLnhtbCBiL2V4dC9jZGkvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2M4MjU0Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2NkaS9wb20ueG1sCkBAIC0wLDAgKzEsNDUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LWNkaS1zdXBwb3J0PC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPkplcnNleSBDREkgcHJvdmlkZXJzIHVtYnJlbGxhIHByb2plY3QgbW9kdWxlPC9kZXNjcmlwdGlvbj4KKworICAgIDxtb2R1bGVzPgorICAgICAgICA8bW9kdWxlPmplcnNleS1jZGkxeDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmplcnNleS1jZGkxeC1iYW4tY3VzdG9tLWhrMi1iaW5kaW5nPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+amVyc2V5LWNkaTF4LXNlcnZsZXQ8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5qZXJzZXktY2RpMXgtdHJhbnNhY3Rpb248L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5qZXJzZXktY2RpMXgtdmFsaWRhdGlvbjwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmplcnNleS13ZWxkMi1zZTwvbW9kdWxlPgorICAgIDwvbW9kdWxlcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXh0L2VudGl0eS1maWx0ZXJpbmcvcG9tLnhtbCBiL2V4dC9lbnRpdHktZmlsdGVyaW5nL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU2MTljNQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9lbnRpdHktZmlsdGVyaW5nL3BvbS54bWwKQEAgLTAsMCArMSw4NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LWVudGl0eS1maWx0ZXJpbmc8L2FydGlmYWN0SWQ+CisgICAgPG5hbWU+amVyc2V5LWV4dC1lbnRpdHktZmlsdGVyaW5nPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBKZXJzZXkgZXh0ZW5zaW9uIG1vZHVsZSBwcm92aWRpbmcgc3VwcG9ydCBmb3IgRW50aXR5IERhdGEgRmlsdGVyaW5nLgorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY2xpZW50PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktc2VydmVyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi5pc3RhY2s8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4taXN0YWNrLWNvbW1vbnMtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJ1aWxkLWhlbHBlci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5mZWxpeDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1idW5kbGUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgICAgIDxleHRlbnNpb25zPnRydWU8L2V4dGVuc2lvbnM+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxpbnN0cnVjdGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8RXhwb3J0LVBhY2thZ2U+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuKjt2ZXJzaW9uPSR7cHJvamVjdC52ZXJzaW9ufTwvRXhwb3J0LVBhY2thZ2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8SW1wb3J0LVBhY2thZ2U+KjwvSW1wb3J0LVBhY2thZ2U+CisgICAgICAgICAgICAgICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgorICAgICAgICAgICAgICAgICAgICA8dW5wYWNrQnVuZGxlPnRydWU8L3VucGFja0J1bmRsZT4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL0NvbW1vblNjb3BlUHJvdmlkZXIuamF2YSBiL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvQ29tbW9uU2NvcGVQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMWJiZTgKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL0NvbW1vblNjb3BlUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZzsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlNwbGl0ZXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW1TdXBwb3J0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LlByb3ZpZGVyczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5zcGkuRmlsdGVyaW5nSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLnNwaS5TY29wZVByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLnNwaS5TY29wZVJlc29sdmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1vZGVsLmludGVybmFsLlJhbmtlZENvbXBhcmF0b3I7CisKKy8qKgorICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgU2NvcGVQcm92aWRlciBzY29wZSBwcm92aWRlcn0uIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgb24gY2xpZW50IHRvIHJldHJpZXZlCisgKiBlbnRpdHktZmlsdGVyaW5nIHNjb3BlcyBmcm9tIGdpdmVuIGVudGl0eSBhbm5vdGF0aW9ucyBvciBpbmplY3RlZCB7QGxpbmsgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9ufS4gQ2xhc3MgY2FuIGFsc28gc2VydmUKKyAqIGFzIGEgYmFzZSBjbGFzcyBmb3Igc2VydmVyLXNpZGUgaW1wbGVtZW50YXRpb25zLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICogQHNlZSBTZXJ2ZXJTY29wZVByb3ZpZGVyCisgKi8KK0BTaW5nbGV0b24KK2NsYXNzIENvbW1vblNjb3BlUHJvdmlkZXIgaW1wbGVtZW50cyBTY29wZVByb3ZpZGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKENvbW1vblNjb3BlUHJvdmlkZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIHByaXZhdGUgZmluYWwgTGlzdDxTY29wZVJlc29sdmVyPiByZXNvbHZlcnM7CisgICAgcHJpdmF0ZSBmaW5hbCBDb25maWd1cmF0aW9uIGNvbmZpZzsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgY29tbW9uIHNjb3BlIHByb3ZpZGVyIHdpdGggaW5qZWN0ZWQge0BsaW5rIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbn0gYW5kCisgICAgICoge0BsaW5rIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uIG1hbmFnZXJ9LgorICAgICAqLworICAgIEBJbmplY3QKKyAgICBwdWJsaWMgQ29tbW9uU2NvcGVQcm92aWRlcihmaW5hbCBDb25maWd1cmF0aW9uIGNvbmZpZywgZmluYWwgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyKSB7CisgICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnOworICAgICAgICBTcGxpdGVyYXRvcjxTY29wZVJlc29sdmVyPiByZXNvbHZlclNwbGl0ZXJhdG9yID0KKyAgICAgICAgICAgICAgICBQcm92aWRlcnMuZ2V0QWxsUHJvdmlkZXJzKGluamVjdGlvbk1hbmFnZXIsIFNjb3BlUmVzb2x2ZXIuY2xhc3MsIG5ldyBSYW5rZWRDb21wYXJhdG9yPD4oKSkuc3BsaXRlcmF0b3IoKTsKKyAgICAgICAgdGhpcy5yZXNvbHZlcnMgPSBTdHJlYW1TdXBwb3J0LnN0cmVhbShyZXNvbHZlclNwbGl0ZXJhdG9yLCBmYWxzZSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0RmlsdGVyaW5nU2NvcGVzKGZpbmFsIEFubm90YXRpb25bXSBlbnRpdHlBbm5vdGF0aW9ucywgZmluYWwgYm9vbGVhbiBkZWZhdWx0SWZOb3RGb3VuZCkgeworICAgICAgICBTZXQ8U3RyaW5nPiBmaWx0ZXJpbmdTY29wZXMgPSBuZXcgSGFzaFNldDw+KCk7CisKKyAgICAgICAgLy8gRW50aXR5IEFubm90YXRpb25zLgorICAgICAgICBmaWx0ZXJpbmdTY29wZXMuYWRkQWxsKGdldEZpbHRlcmluZ1Njb3BlcyhlbnRpdHlBbm5vdGF0aW9ucykpOworCisgICAgICAgIGlmIChmaWx0ZXJpbmdTY29wZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAvLyBDb25maWd1cmF0aW9uLgorICAgICAgICAgICAgZmlsdGVyaW5nU2NvcGVzLmFkZEFsbChnZXRGaWx0ZXJpbmdTY29wZXMoY29uZmlnKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBVc2UgZGVmYXVsdCBzY29wZSBpZiBub3QgaW4gb3RoZXIgc2NvcGUuCisgICAgICAgIHJldHVybiByZXR1cm5GaWx0ZXJpbmdTY29wZXMoZmlsdGVyaW5nU2NvcGVzLCBkZWZhdWx0SWZOb3RGb3VuZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBkZWZhdWx0IGVudGl0eS1maWx0ZXJpbmcgc2NvcGUgaWYgdGhlIGdpdmVuIHNldCBvZiBzY29wZXMgaXMgZW1wdHkgYW5kIHRoZSBwcm9jZXNzaW5nIHNob3VsZCBmYWxsYmFjayB0byB0aGUKKyAgICAgKiBkZWZhdWx0LgorICAgICAqCisgICAgICogQHBhcmFtIGZpbHRlcmluZ1Njb3BlcyAgICAgICBlbnRpdHktZmlsdGVyaW5nIHNjb3BlcyB0byBiZSBleGFtaW5lZC4KKyAgICAgKiBAcGFyYW0gcmV0dXJuRGVmYXVsdEZhbGxiYWNrIHtAY29kZSB0cnVlfSBpZiB0aGUgZGVmYXVsdCBlbnRpdHktZmlsdGVyaW5nIHNjb3BlIHNob3VsZCBiZSByZXR1cm5lZCBpZiB0aGUgZ2l2ZW4gc2NvcGVzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmUgZW1wdHksIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqIEByZXR1cm4gZW50aXR5LWZpbHRlcmluZyBzY29wZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIFNldDxTdHJpbmc+IHJldHVybkZpbHRlcmluZ1Njb3BlcyhmaW5hbCBTZXQ8U3RyaW5nPiBmaWx0ZXJpbmdTY29wZXMsIGZpbmFsIGJvb2xlYW4gcmV0dXJuRGVmYXVsdEZhbGxiYWNrKSB7CisgICAgICAgIHJldHVybiByZXR1cm5EZWZhdWx0RmFsbGJhY2sgJiYgZmlsdGVyaW5nU2NvcGVzLmlzRW1wdHkoKSA/IEZpbHRlcmluZ0hlbHBlci5nZXREZWZhdWx0RmlsdGVyaW5nU2NvcGUoKSA6IGZpbHRlcmluZ1Njb3BlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgZW50aXR5LWZpbHRlcmluZyBzY29wZXMgZnJvbSBhbGwgYXZhaWxhYmxlIHtAbGluayBTY29wZVJlc29sdmVyIHNjb3BlIHJlc29sdmVyc30gZm9yIGdpdmVuIGFubm90YXRpb25zLgorICAgICAqCisgICAgICogQHBhcmFtIGFubm90YXRpb25zIGFubm90YXRpb25zIHRvIHJldHJpZXZlIGVudGl0eS1maWx0ZXJpbmcgc2NvcGVzIGZyb20uCisgICAgICogQHJldHVybiBlbnRpdHktZmlsdGVyaW5nIHNjb3BlcyBvciBhbiBlbXB0eSBzZXQgaWYgbm9uZSBzY29wZSBjYW4gYmUgcmVzb2x2ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFNldDxTdHJpbmc+IGdldEZpbHRlcmluZ1Njb3BlcyhmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgU2V0PFN0cmluZz4gZmlsdGVyaW5nU2NvcGVzID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICBmb3IgKGZpbmFsIFNjb3BlUmVzb2x2ZXIgcHJvdmlkZXIgOiByZXNvbHZlcnMpIHsKKyAgICAgICAgICAgIG1lcmdlRmlsdGVyaW5nU2NvcGVzKGZpbHRlcmluZ1Njb3BlcywgcHJvdmlkZXIucmVzb2x2ZShhbm5vdGF0aW9ucykpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmaWx0ZXJpbmdTY29wZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGVudGl0eS1maWx0ZXJpbmcgc2NvcGVzIGZyb20ge0BsaW5rIENvbmZpZ3VyYXRpb259LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZyBjb25maWd1cmF0aW9uIHRoZSBlbnRpdHktZmlsdGVyaW5nIHNjb3BlcyBhcmUgb2J0YWluZWQgZnJvbS4KKyAgICAgKiBAcmV0dXJuIGVudGl0eS1maWx0ZXJpbmcgc2NvcGVzIG9yIGFuIGVtcHR5IHNldCBpZiBub25lIHNjb3BlIGNhbiBiZSByZXNvbHZlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFNldDxTdHJpbmc+IGdldEZpbHRlcmluZ1Njb3BlcyhmaW5hbCBDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICBmaW5hbCBPYmplY3QgcHJvcGVydHkgPSBjb25maWcuZ2V0UHJvcGVydHkoRW50aXR5RmlsdGVyaW5nRmVhdHVyZS5FTlRJVFlfRklMVEVSSU5HX1NDT1BFKTsKKworICAgICAgICBTZXQ8U3RyaW5nPiBmaWx0ZXJpbmdTY29wZXMgPSBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOworICAgICAgICBpZiAocHJvcGVydHkgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKHByb3BlcnR5IGluc3RhbmNlb2YgQW5ub3RhdGlvbikgeworICAgICAgICAgICAgICAgIGZpbHRlcmluZ1Njb3BlcyA9IGdldEZpbHRlcmluZ1Njb3BlcyhuZXcgQW5ub3RhdGlvbltdIHsoQW5ub3RhdGlvbikgcHJvcGVydHl9KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkgaW5zdGFuY2VvZiBBbm5vdGF0aW9uW10pIHsKKyAgICAgICAgICAgICAgICBmaWx0ZXJpbmdTY29wZXMgPSBnZXRGaWx0ZXJpbmdTY29wZXMoKEFubm90YXRpb25bXSkgcHJvcGVydHkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLkNPTkZJRywgTG9jYWxpemF0aW9uTWVzc2FnZXMuRU5USVRZX0ZJTFRFUklOR19TQ09QRV9OT1RfQU5OT1RBVElPTlMocHJvcGVydHkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmlsdGVyaW5nU2NvcGVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1lcmdlIHR3byBzZXRzIG9mIGVudGl0eS1maWx0ZXJpbmcgc2NvcGVzLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbHRlcmluZ1Njb3BlcyBleGlzdGluZyBlbnRpdHktZmlsdGVyaW5nIHNjb3Blcy4KKyAgICAgKiBAcGFyYW0gcmVzb2x2ZWRTY29wZXMgZW50aXR5LWZpbHRlcmluZyBzY29wZXMgdG8gYmUgYWRkZWQgdG8gdGhlIGV4aXN0aW5nIG9uZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgbWVyZ2VGaWx0ZXJpbmdTY29wZXMoZmluYWwgU2V0PFN0cmluZz4gZmlsdGVyaW5nU2NvcGVzLCBmaW5hbCBTZXQ8U3RyaW5nPiByZXNvbHZlZFNjb3BlcykgeworICAgICAgICBpZiAoIWZpbHRlcmluZ1Njb3Blcy5pc0VtcHR5KCkgJiYgIXJlc29sdmVkU2NvcGVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5GSU5FLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5NRVJHSU5HX0ZJTFRFUklOR19TQ09QRVMoKSk7CisgICAgICAgIH0KKworICAgICAgICBmaWx0ZXJpbmdTY29wZXMuYWRkQWxsKHJlc29sdmVkU2NvcGVzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL0RlZmF1bHRFbnRpdHlQcm9jZXNzb3IuamF2YSBiL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvRGVmYXVsdEVudGl0eVByb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5YmE5ODEKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL0RlZmF1bHRFbnRpdHlQcm9jZXNzb3IuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5OworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlJlZmxlY3Rpb25IZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuc3BpLkFic3RyYWN0RW50aXR5UHJvY2Vzc29yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLnNwaS5FbnRpdHlHcmFwaDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5zcGkuRW50aXR5UHJvY2Vzc29yQ29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5zcGkuRmlsdGVyaW5nSGVscGVyOworCisvKioKKyAqIERlZmF1bHQgZW50aXR5IHByb2Nlc3Nvci4gSGFuZGxlcyB1bmFubm90YXRlZCBwcm9wZXJ0aWVzL2FjY2Vzc29ycyBhbmQgYWRkcyB0aGVtIGludG8gZGVmYXVsdCBlbnRpdHktZmlsdGVyaW5nIHNjb3BlLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAU2luZ2xldG9uCitAUHJpb3JpdHkoSW50ZWdlci5NQVhfVkFMVUUgLSAxMDAwKQorZmluYWwgY2xhc3MgRGVmYXVsdEVudGl0eVByb2Nlc3NvciBleHRlbmRzIEFic3RyYWN0RW50aXR5UHJvY2Vzc29yIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXN1bHQgcHJvY2VzcyhmaW5hbCBFbnRpdHlQcm9jZXNzb3JDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3dpdGNoIChjb250ZXh0LmdldFR5cGUoKSkgeworICAgICAgICAgICAgY2FzZSBDTEFTU19SRUFERVI6CisgICAgICAgICAgICBjYXNlIENMQVNTX1dSSVRFUjoKKyAgICAgICAgICAgICAgICBmaW5hbCBFbnRpdHlHcmFwaCBncmFwaCA9IGNvbnRleHQuZ2V0RW50aXR5R3JhcGgoKTsKKyAgICAgICAgICAgICAgICBpZiAoZ3JhcGguZ2V0RmlsdGVyaW5nU2NvcGVzKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGdyYXBoLmFkZEZpbHRlcmluZ1Njb3BlcyhGaWx0ZXJpbmdIZWxwZXIuZ2V0RGVmYXVsdEZpbHRlcmluZ1Njb3BlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0LkFQUExZOworCisgICAgICAgICAgICBjYXNlIFBST1BFUlRZX1JFQURFUjoKKyAgICAgICAgICAgIGNhc2UgUFJPUEVSVFlfV1JJVEVSOgorICAgICAgICAgICAgICAgIGZpbmFsIEZpZWxkIGZpZWxkID0gY29udGV4dC5nZXRGaWVsZCgpOworICAgICAgICAgICAgICAgIHByb2Nlc3MoY29udGV4dC5nZXRFbnRpdHlHcmFwaCgpLCBmaWVsZC5nZXROYW1lKCksIGZpZWxkLmdldEdlbmVyaWNUeXBlKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHQuQVBQTFk7CisKKyAgICAgICAgICAgIGNhc2UgTUVUSE9EX1JFQURFUjoKKyAgICAgICAgICAgIGNhc2UgTUVUSE9EX1dSSVRFUjoKKyAgICAgICAgICAgICAgICBmaW5hbCBNZXRob2QgbWV0aG9kID0gY29udGV4dC5nZXRNZXRob2QoKTsKKyAgICAgICAgICAgICAgICBwcm9jZXNzKGNvbnRleHQuZ2V0RW50aXR5R3JhcGgoKSwgUmVmbGVjdGlvbkhlbHBlci5nZXRQcm9wZXJ0eU5hbWUobWV0aG9kKSwgbWV0aG9kLmdldEdlbmVyaWNSZXR1cm5UeXBlKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHQuQVBQTFk7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLy8gTk9PUC4KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUmVzdWx0LlNLSVA7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3MoZmluYWwgRW50aXR5R3JhcGggZ3JhcGgsIGZpbmFsIFN0cmluZyBmaWVsZE5hbWUsIGZpbmFsIFR5cGUgZmllbGRUeXBlKSB7CisgICAgICAgIGlmICghZ3JhcGgucHJlc2VudEluU2NvcGVzKGZpZWxkTmFtZSkpIHsKKyAgICAgICAgICAgIGFkZEZpbHRlcmluZ1Njb3BlcyhmaWVsZE5hbWUsIEZpbHRlcmluZ0hlbHBlci5nZXRFbnRpdHlDbGFzcyhmaWVsZFR5cGUpLCBncmFwaC5nZXRDbGFzc0ZpbHRlcmluZ1Njb3BlcygpLCBncmFwaCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL0VtcHR5RW50aXR5R3JhcGhJbXBsLmphdmEgYi9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL0VtcHR5RW50aXR5R3JhcGhJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTlkMDc0YgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvRW1wdHlFbnRpdHlHcmFwaEltcGwuamF2YQpAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZzsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5zcGkuRW50aXR5R3JhcGg7CisKKy8qKgorICoge0BsaW5rIEVudGl0eUdyYXBofSBpbXBsZW1lbnRhdGlvbiB0aGF0IGRvZXMgbm90IGNvbnRhaW4gYW55IGZpZWxkcy9zdWJncmFwaHMuIE1ldGhvZHMgdGhhdCBhcmUgc3VwcG9zZWQgdG8gbW9kaWZ5IHRoZSBncmFwaAorICogd291bGQgdGhyb3cgYW4ge0BsaW5rIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufS4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworZmluYWwgY2xhc3MgRW1wdHlFbnRpdHlHcmFwaEltcGwgaW1wbGVtZW50cyBFbnRpdHlHcmFwaCB7CisKKyAgICBwcml2YXRlIGZpbmFsIENsYXNzPD8+IGNsYXp6OworCisgICAgQFN1cHByZXNzV2FybmluZ3MoIkphdmFEb2MiKQorICAgIEVtcHR5RW50aXR5R3JhcGhJbXBsKGZpbmFsIENsYXNzPD8+IGNsYXp6KSB7CisgICAgICAgIHRoaXMuY2xhenogPSBjbGF6ejsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRW50aXR5R3JhcGggYWRkRmllbGQoZmluYWwgU3RyaW5nIGZpZWxkTmFtZSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRW50aXR5R3JhcGggYWRkRmllbGQoZmluYWwgU3RyaW5nIGZpZWxkTmFtZSwgZmluYWwgU3RyaW5nLi4uIGZpbHRlcmluZ1Njb3BlcykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRW50aXR5R3JhcGggYWRkRmllbGQoZmluYWwgU3RyaW5nIGZpZWxkTmFtZSwgZmluYWwgU2V0PFN0cmluZz4gZmlsdGVyaW5nU2NvcGVzKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBFbnRpdHlHcmFwaCBhZGRTdWJncmFwaChmaW5hbCBTdHJpbmcgZmllbGROYW1lLCBmaW5hbCBDbGFzczw/PiBmaWVsZENsYXNzKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBFbnRpdHlHcmFwaCBhZGRTdWJncmFwaChmaW5hbCBTdHJpbmcgZmllbGROYW1lLCBmaW5hbCBDbGFzczw/PiBmaWVsZENsYXNzLCBmaW5hbCBTdHJpbmcuLi4gZmlsdGVyaW5nU2NvcGVzKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBFbnRpdHlHcmFwaCBhZGRTdWJncmFwaChmaW5hbCBTdHJpbmcgZmllbGROYW1lLCBmaW5hbCBDbGFzczw/PiBmaWVsZENsYXNzLCBmaW5hbCBTZXQ8U3RyaW5nPiBmaWx0ZXJpbmdTY29wZXMpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENsYXNzPD8+IGdldEVudGl0eUNsYXNzKCkgeworICAgICAgICByZXR1cm4gY2xheno7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxTdHJpbmc+IGdldEZpZWxkcyhmaW5hbCBTdHJpbmcgZmlsdGVyaW5nU2NvcGUpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxTdHJpbmc+IGdldEZpZWxkcyhmaW5hbCBTdHJpbmcuLi4gZmlsdGVyaW5nU2NvcGVzKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRGaWVsZHMoZmluYWwgU2V0PFN0cmluZz4gZmlsdGVyaW5nU2NvcGVzKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBDbGFzczw/Pj4gZ2V0U3ViZ3JhcGhzKGZpbmFsIFN0cmluZyBmaWx0ZXJpbmdTY29wZSkgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWFwPFN0cmluZywgQ2xhc3M8Pz4+IGdldFN1YmdyYXBocyhmaW5hbCBTdHJpbmcuLi4gZmlsdGVyaW5nU2NvcGVzKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBDbGFzczw/Pj4gZ2V0U3ViZ3JhcGhzKGZpbmFsIFNldDxTdHJpbmc+IGZpbHRlcmluZ1Njb3BlcykgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBwcmVzZW50SW5TY29wZXMoZmluYWwgU3RyaW5nIGZpZWxkKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBwcmVzZW50SW5TY29wZShmaW5hbCBTdHJpbmcgZmllbGQsIFN0cmluZyBmaWx0ZXJpbmdTY29wZSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEVudGl0eUdyYXBoIHJlbW92ZShmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0RmlsdGVyaW5nU2NvcGVzKCkgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0Q2xhc3NGaWx0ZXJpbmdTY29wZXMoKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBFbnRpdHlHcmFwaCBhZGRGaWx0ZXJpbmdTY29wZXMoZmluYWwgU2V0PFN0cmluZz4gZmlsdGVyaW5nU2NvcGVzKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3QgbykgeworICAgICAgICBpZiAodGhpcyA9PSBvKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBFbXB0eUVudGl0eUdyYXBoSW1wbCB0aGF0ID0gKEVtcHR5RW50aXR5R3JhcGhJbXBsKSBvOworCisgICAgICAgIHJldHVybiBjbGF6ei5lcXVhbHModGhhdC5jbGF6eik7CisKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gY2xhenouaGFzaENvZGUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL0VtcHR5T2JqZWN0R3JhcGguamF2YSBiL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvRW1wdHlPYmplY3RHcmFwaC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNzg2NGUKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL0VtcHR5T2JqZWN0R3JhcGguamF2YQpAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLnNwaS5PYmplY3RHcmFwaDsKKworLyoqCisgKiBPYmplY3QgZ3JhcGggcmVwcmVzZW50aW5nIGVtcHR5IGRvbWFpbiBjbGFzc2VzLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitmaW5hbCBjbGFzcyBFbXB0eU9iamVjdEdyYXBoIGltcGxlbWVudHMgT2JqZWN0R3JhcGggeworCisgICAgcHJpdmF0ZSBmaW5hbCBDbGFzczw/PiBlbnRpdHlDbGFzczsKKworICAgIEVtcHR5T2JqZWN0R3JhcGgoZmluYWwgQ2xhc3M8Pz4gZW50aXR5Q2xhc3MpIHsKKyAgICAgICAgdGhpcy5lbnRpdHlDbGFzcyA9IGVudGl0eUNsYXNzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDbGFzczw/PiBnZXRFbnRpdHlDbGFzcygpIHsKKyAgICAgICAgcmV0dXJuIGVudGl0eUNsYXNzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRGaWVsZHMoKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRGaWVsZHMoZmluYWwgU3RyaW5nIHBhcmVudCkgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0R3JhcGg+IGdldFN1YmdyYXBocygpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdEdyYXBoPiBnZXRTdWJncmFwaHMoZmluYWwgU3RyaW5nIHBhcmVudCkgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL0VudGl0eUZpbHRlcmluZy5qYXZhIGIvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9FbnRpdHlGaWx0ZXJpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGQ3ZDdkCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9FbnRpdHlGaWx0ZXJpbmcuamF2YQpAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZzsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKKy8qKgorICogTWV0YS1hbm5vdGF0aW9uIHVzZWQgdG8gY3JlYXRlIGVudGl0eSBmaWx0ZXJpbmcgYW5ub3RhdGlvbnMgZm9yIGVudGl0eSAobW9kZWwpIGNsYXNzZXMgYW5kIHJlc291cmNlIG1ldGhvZHMgYW5kIHJlc291cmNlcy4KKyAqIDxwPgorICogRW50aXR5IERhdGEgRmlsdGVyaW5nIHZpYSBhbm5vdGF0aW9ucyBpcyBzdXBwb3NlZCB0byBiZSB1c2VkIHRvIGFubm90YXRlOgorICogPHVsPgorICogPGxpPmVudGl0eSBjbGFzc2VzIChzdXBwb3J0ZWQgb24gYm90aCwgc2VydmVyIGFuZCBjbGllbnQgc2lkZXMpLCBhbmQ8L2xpPgorICogPGxpPnJlc291cmNlIG1ldGhvZHMgLyByZXNvdXJjZSBjbGFzc2VzIChzZXJ2ZXIgc2lkZSk8L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqIDxwPgorICogSW4gZW50aXR5IGZpbHRlcmluZywgYSA8aT5lbnRpdHktZmlsdGVyaW5nPC9pPiBhbm5vdGF0aW9uIGlzIGZpcnN0IGRlZmluZWQgdXNpbmcgdGhlIHtAY29kZSBARW50aXR5RmlsdGVyaW5nfSBtZXRhLWFubm90YXRpb246CisgKiA8cHJlPgorICogICYjNjQ7VGFyZ2V0KHsgRWxlbWVudFR5cGUuVFlQRSwgRWxlbWVudFR5cGUuTUVUSE9ELCBFbGVtZW50VHlwZS5GSUVMRCB9KQorICogICYjNjQ7UmV0ZW50aW9uKHZhbHVlID0gUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCisgKiAgPGI+JiM2NDtFbnRpdHlGaWx0ZXJpbmc8L2I+CisgKiAgPGI+cHVibGljIEBpbnRlcmZhY2UgRGV0YWlsZWRWaWV3PC9iPiB7CisgKgorICogICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3RvcnkgZXh0ZW5kcyA8Yj5Bbm5vdGF0aW9uTGl0ZXJhbCZsdDtEZXRhaWxlZFZpZXcmZ3Q7PC9iPiBpbXBsZW1lbnRzIDxiPkRldGFpbGVkVmlldzwvYj4geworICoKKyAqICAgICAgICAgcHVibGljIHN0YXRpYyA8Yj5EZXRhaWxlZFZpZXc8L2I+IGdldCgpIHsKKyAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmFjdG9yeSgpOworICAgICAgICAgICB9CisgKiAgICAgIH0KKyAqICB9CisgKiA8L3ByZT4KKyAqIDwvcD4KKyAqIDxwPgorICogRW50aXR5LWZpbHRlcmluZyBhbm5vdGF0aW9uIHNob3VsZCBwcm92aWRlIGEgZmFjdG9yeSBjbGFzcy9tZXRob2QgdG8gY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBhbm5vdGF0aW9uLiBFeGFtcGxlIG9mIHN1Y2gKKyAqIGZhY3RvcnkgY2FuIGJlIHNlZW4gaW4gdGhlIHtAY29kZSBEZXRhaWxlZFZpZXd9IGFib3ZlLiBTdWNoIGluc3RhbmNlcyBjYW4gYmUgdGhlbiBwYXNzZWQgdG8gdGhlIGNsaWVudC9zZXJ2ZXIgcnVudGltZSB0bworICogZGVmaW5lL292ZXJyaWRlIGVudGl0eS1maWx0ZXJpbmcgc2NvcGVzLgorICogPC9wPgorICogPHA+CisgKiBUaGUgZGVmaW5lZCBlbnRpdHktZmlsdGVyaW5nIGFubm90YXRpb24gaXMgdGhlbiB1c2VkIHRvIGRlY29yYXRlIGEgZW50aXR5LCBpdCdzIHByb3BlcnR5IGFjY2Vzc29ycyBvciBmaWVsZHMgKG1vcmUgdGhhbiBvbmUKKyAqIGVudGl0eSBtYXkgYmUgZGVjb3JhdGVkIHdpdGggdGhlIHNhbWUgZW50aXR5LWZpbHRlcmluZyBhbm5vdGF0aW9uKToKKyAqIDxwcmU+CisgKiAgcHVibGljIGNsYXNzIE15RW50aXR5Q2xhc3MgeworICoKKyAqICAgICAgPGI+JiM2NDtEZXRhaWxlZFZpZXc8L2I+CisgKiAgICAgIHByaXZhdGUgU3RyaW5nIG15RmllbGQ7CisgKgorICogICAgICAuLi4KKyAqICB9CisgKiA8L3ByZT4KKyAqIDwvcD4KKyAqIDxwPgorICogQXQgbGFzdCwgb24gdGhlIHNlcnZlci1zaWRlLCB0aGUgZW50aXR5LWZpbHRlcmluZyBhbm5vdGF0aW9ucyBhcmUgYXBwbGllZCB0byB0aGUgcmVzb3VyY2Ugb3IgcmVzb3VyY2UgbWV0aG9kKHMpIHRvIHdoaWNoIHRoZQorICogZW50aXR5LWZpbHRlcmluZyBzaG91bGQgYmUgYXBwbGllZDoKKyAqIDxwcmU+CisgKiAgJiM2NDtQYXRoKCIvIikKKyAqICBwdWJsaWMgY2xhc3MgTXlSZXNvdXJjZUNsYXNzIHsKKyAqCisgKiAgICAgICYjNjQ7R0VUCisgKiAgICAgICYjNjQ7UHJvZHVjZXMoInRleHQvcGxhaW4iKQorICogICAgICAmIzY0O1BhdGgoIntpZH0iKQorICogICAgICA8Yj4mIzY0O0RldGFpbGVkVmlldzwvYj4KKyAqICAgICAgcHVibGljIE15RW50aXR5Q2xhc3MgZ2V0KEBQYXRoUGFyYW0oImlkIikgU3RyaW5nIGlkKSB7CisgKiAgICAgICAgICAvLyBSZXR1cm4gTXlFbnRpdHlDbGFzcy4KKyAqICAgICAgfQorICogIH0KKyAqIDwvcHJlPgorICogPC9wPgorICogPHA+CisgKiBBdCBsYXN0LCBvbiB0aGUgY2xpZW50LXNpZGUsIHRoZSBlbnRpdHktZmlsdGVyaW5nIGFubm90YXRpb25zIGFyZSBwYXNzZWQgdG8gdGhlIHJ1bnRpbWUgdmlhCisgKiB7QGxpbmsgamF2YXgud3MucnMuY2xpZW50LkVudGl0eSNlbnRpdHkoT2JqZWN0LCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZSwgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbltdKSBFbnRpdHkuZW50aXR5KCl9CisgKiBtZXRob2QgYW5kIHRoZSBlbnRpdHktZmlsdGVyaW5nIHNjb3BlcyBhcmUgdGhlbiBkZXJpdmVkIGZyb20gdGhlIGFubm90YXRpb25zOgorICogPHByZT4KKyAqICBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpCisgKiAgICAgIC50YXJnZXQoInJlc291cmNlIikKKyAqICAgICAgLnJlcXVlc3QoKQorICogICAgICAucG9zdChFbnRpdHkuZW50aXR5KG15ZW50aXR5LCAiYXBwbGljYXRpb24vanNvbiIsIDxiPm5ldyBBbm5vdGF0aW9uW10ge015RW50aXR5Q2xhc3MuRmFjdG9yeS5nZXQoKX08L2I+KSk7CisgKiA8L3ByZT4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFRhcmdldChFbGVtZW50VHlwZS5BTk5PVEFUSU9OX1RZUEUpCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorQERvY3VtZW50ZWQKK3B1YmxpYyBAaW50ZXJmYWNlIEVudGl0eUZpbHRlcmluZyB7Cit9CmRpZmYgLS1naXQgYS9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL0VudGl0eUZpbHRlcmluZ0JpbmRlci5qYXZhIGIvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9FbnRpdHlGaWx0ZXJpbmdCaW5kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTkwMjcwCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9FbnRpdHlGaWx0ZXJpbmdCaW5kZXIuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljVHlwZTsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQWJzdHJhY3RCaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuc3BpLkVudGl0eUdyYXBoUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuc3BpLkVudGl0eUluc3BlY3RvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5zcGkuT2JqZWN0R3JhcGg7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuc3BpLk9iamVjdEdyYXBoVHJhbnNmb3JtZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuc3BpLk9iamVjdFByb3ZpZGVyOworCisvKioKKyAqIEJpbmRlciBmb3IgRW50aXR5IERhdGEgRmlsdGVyaW5nIGZlYXR1cmUuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK2ZpbmFsIGNsYXNzIEVudGl0eUZpbHRlcmluZ0JpbmRlciBleHRlbmRzIEFic3RyYWN0QmluZGVyIHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgLy8gRW50aXR5IEluc3BlY3Rvci4KKyAgICAgICAgYmluZChFbnRpdHlJbnNwZWN0b3JJbXBsLmNsYXNzKQorICAgICAgICAgICAgICAgIC50byhFbnRpdHlJbnNwZWN0b3IuY2xhc3MpCisgICAgICAgICAgICAgICAgLmluKFNpbmdsZXRvbi5jbGFzcyk7CisKKyAgICAgICAgLy8gRW50aXR5IEdyYXBoIFByb3ZpZGVyLgorICAgICAgICBiaW5kKEVudGl0eUdyYXBoUHJvdmlkZXJJbXBsLmNsYXNzKQorICAgICAgICAgICAgICAgIC50byhFbnRpdHlHcmFwaFByb3ZpZGVyLmNsYXNzKQorICAgICAgICAgICAgICAgIC5pbihTaW5nbGV0b24uY2xhc3MpOworCisgICAgICAgIC8vIE9iamVjdCBQcm92aWRlciAmIE9iamVjdCBHcmFwaCBUcmFuc2Zvcm1lci4KKyAgICAgICAgYmluZEFzQ29udHJhY3QoT2JqZWN0R3JhcGhQcm92aWRlci5jbGFzcykKKyAgICAgICAgICAgICAgICAvLyBGaWx0ZXJpbmdPYmplY3RQcm92aWRlci4KKyAgICAgICAgICAgICAgICAudG8oT2JqZWN0UHJvdmlkZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgLnRvKG5ldyBHZW5lcmljVHlwZTxPYmplY3RQcm92aWRlcjxPYmplY3Q+PigpIHt9KQorICAgICAgICAgICAgICAgIC50byhuZXcgR2VuZXJpY1R5cGU8T2JqZWN0UHJvdmlkZXI8T2JqZWN0R3JhcGg+PigpIHt9KQorICAgICAgICAgICAgICAgIC8vIEZpbHRlcmluZ0dyYXBoVHJhbnNmb3JtZXIuCisgICAgICAgICAgICAgICAgLnRvKE9iamVjdEdyYXBoVHJhbnNmb3JtZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgLnRvKG5ldyBHZW5lcmljVHlwZTxPYmplY3RHcmFwaFRyYW5zZm9ybWVyPE9iamVjdD4+KCkge30pCisgICAgICAgICAgICAgICAgLnRvKG5ldyBHZW5lcmljVHlwZTxPYmplY3RHcmFwaFRyYW5zZm9ybWVyPE9iamVjdEdyYXBoPj4oKSB7fSkKKyAgICAgICAgICAgICAgICAvLyBTY29wZS4KKyAgICAgICAgICAgICAgICAuaW4oU2luZ2xldG9uLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL0VudGl0eUZpbHRlcmluZ0ZlYXR1cmUuamF2YSBiL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvRW50aXR5RmlsdGVyaW5nRmVhdHVyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNGUxZWIKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL0VudGl0eUZpbHRlcmluZ0ZlYXR1cmUuamF2YQpAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nOworCitpbXBvcnQgamF2YXgud3MucnMuUnVudGltZVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmVDb250ZXh0OworCisvKioKKyAqIHtAbGluayBGZWF0dXJlfSB1c2VkIHRvIGFkZCBzdXBwb3J0IGZvciBFbnRpdHkgRGF0YSBGaWx0ZXJpbmcgZmVhdHVyZSBmb3IgZW50aXR5LWZpbHRlcmluZyBhbm5vdGF0aW9ucyBiYXNlZCBvbgorICoge0BsaW5rIEVudGl0eUZpbHRlcmluZ30gbWV0YS1hbm5vdGF0aW9uLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgZmluYWwgY2xhc3MgRW50aXR5RmlsdGVyaW5nRmVhdHVyZSBpbXBsZW1lbnRzIEZlYXR1cmUgeworCisgICAgLyoqCisgICAgICogRGVmaW5lcyBvbmUgb3IgbW9yZSBhbm5vdGF0aW9ucyB0aGF0IHNob3VsZCBiZSB1c2VkIGFzIGVudGl0eS1maWx0ZXJpbmcgc2NvcGUgd2hlbiByZWFkaW5nL3dyaXRpbmcgYW4gZW50aXR5LgorICAgICAqIDxwPgorICAgICAqIFRoZSBwcm9wZXJ0eSBjYW4gYmUgdXNlZCBvbiBjbGllbnQgdG8gZGVmaW5lIHRoZSBzY29wZSBhcyB3ZWxsIGFzIG9uIHNlcnZlciB0byBvdmVycmlkZSB0aGUgc2NvcGUgZGVyaXZlZCBmcm9tIGN1cnJlbnQKKyAgICAgKiByZXF1ZXN0IHByb2Nlc3NpbmcgY29udGV4dCAocmVzb3VyY2UgbWV0aG9kcyAvIHJlc291cmNlIGNsYXNzZXMpLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiB0aGUgcHJvcGVydHkgaXMgc2V0LCB0aGUgc3BlY2lmaWVkIGFubm90YXRpb25zIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgKG92ZXJyaWRlKSBlbnRpdHktZmlsdGVyaW5nIHNjb3BlLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgcHJvcGVydHkgdmFsdWUgTVVTVCBiZSBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbn0gb3Ige0Bjb2RlIEFubm90YXRpb25bXX0gYXJyYXkuIFRvIG9idGFpbgorICAgICAqIHRoZSBhbm5vdGF0aW9uIGluc3RhbmNlcyByZWZlciB0byB0aGUge0BsaW5rIEVudGl0eUZpbHRlcmluZ30gZm9yIHJlcXVpcmVtZW50cyBvbiBjcmVhdGluZyBlbnRpdHktZmlsdGVyaW5nIGFubm90YXRpb25zLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBBIGRlZmF1bHQgdmFsdWUgaXMgbm90IHNldC4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaXMgPHR0PntAdmFsdWV9PC90dD4uCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHNlZSBFbnRpdHlGaWx0ZXJpbmcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfRklMVEVSSU5HX1NDT1BFID0gImplcnNleS5jb25maWcuZW50aXR5RmlsdGVyaW5nLnNjb3BlIjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZShmaW5hbCBGZWF0dXJlQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlnID0gY29udGV4dC5nZXRDb25maWd1cmF0aW9uKCk7CisKKyAgICAgICAgaWYgKCFjb25maWcuaXNSZWdpc3RlcmVkKEVudGl0eUZpbHRlcmluZ1Byb2Nlc3Nvci5jbGFzcykpIHsKKyAgICAgICAgICAgIC8vIEJpbmRlciAoRmlsdGVyaW5nT2JqZWN0UHJvdmlkZXIvRmlsdGVyaW5nR3JhcGhUcmFuc2Zvcm1lcikuCisgICAgICAgICAgICBpZiAoIWNvbmZpZy5pc1JlZ2lzdGVyZWQoRW50aXR5RmlsdGVyaW5nQmluZGVyLmNsYXNzKSkgeworICAgICAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIobmV3IEVudGl0eUZpbHRlcmluZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRW50aXR5IFByb2Nlc3NvcnMuCisgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKEVudGl0eUZpbHRlcmluZ1Byb2Nlc3Nvci5jbGFzcyk7CisgICAgICAgICAgICBpZiAoIWNvbmZpZy5pc1JlZ2lzdGVyZWQoRGVmYXVsdEVudGl0eVByb2Nlc3Nvci5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKERlZmF1bHRFbnRpdHlQcm9jZXNzb3IuY2xhc3MpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTY29wZSBQcm92aWRlcnMuCisgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKEVudGl0eUZpbHRlcmluZ1Njb3BlUmVzb2x2ZXIuY2xhc3MpOworCisgICAgICAgICAgICAvLyBTY29wZSBSZXNvbHZlci4KKyAgICAgICAgICAgIGlmIChSdW50aW1lVHlwZS5TRVJWRVIgPT0gY29uZmlnLmdldFJ1bnRpbWVUeXBlKCkpIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKFNlcnZlclNjb3BlUHJvdmlkZXIuY2xhc3MpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKENvbW1vblNjb3BlUHJvdmlkZXIuY2xhc3MpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHtAY29kZSB0cnVlfSB3aGV0aGVyIGF0IGxlYXN0IG9uZSBvZiB0aGUgZW50aXR5IGZpbHRlcmluZyBmZWF0dXJlcyBpcyByZWdpc3RlcmVkIGluIHRoZSBnaXZlbiBjb25maWcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uZmlnIGNvbmZpZyB0byBiZSBleGFtaW5lZCBmb3IgcHJlc2VuY2Ugb2YgZW50aXR5IGZpbHRlcmluZyBmZWF0dXJlLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGVudGl0eSBmaWx0ZXJpbmcgaXMgZW5hYmxlZCBmb3IgZ2l2ZW4gY29uZmlnLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZW5hYmxlZChmaW5hbCBDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICByZXR1cm4gY29uZmlnLmlzUmVnaXN0ZXJlZChFbnRpdHlGaWx0ZXJpbmdGZWF0dXJlLmNsYXNzKQorICAgICAgICAgICAgICAgIHx8IGNvbmZpZy5pc1JlZ2lzdGVyZWQoU2VjdXJpdHlFbnRpdHlGaWx0ZXJpbmdGZWF0dXJlLmNsYXNzKQorICAgICAgICAgICAgICAgIHx8IGNvbmZpZy5pc1JlZ2lzdGVyZWQoU2VsZWN0YWJsZUVudGl0eUZpbHRlcmluZ0ZlYXR1cmUuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvRW50aXR5RmlsdGVyaW5nSGVscGVyLmphdmEgYi9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL0VudGl0eUZpbHRlcmluZ0hlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYzE4OGQKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL0VudGl0eUZpbHRlcmluZ0hlbHBlci5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuc3BpLkZpbHRlcmluZ0hlbHBlcjsKKworLyoqCisgKiBVdGlsaXR5IG1ldGhvZHMgZm9yIEVudGl0eSBEYXRhIEZpbHRlcmluZy4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworZmluYWwgY2xhc3MgRW50aXR5RmlsdGVyaW5nSGVscGVyIHsKKworICAgIC8qKgorICAgICAqIEdldCBlbnRpdHktZmlsdGVyaW5nIHNjb3BlcyBmcm9tIGdpdmVuIGFubm90YXRpb25zLiBTY29wZXMgYXJlIG9ubHkgZGVyaXZlZCBmcm9tIGVudGl0eS1maWx0ZXJpbmcgYW5ub3RhdGlvbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbnMgbGlzdCBvZiBhcmJpdHJhcnkgYW5ub3RhdGlvbnMuCisgICAgICogQHJldHVybiBhIHNldCBvZiBlbnRpdHktZmlsdGVyaW5nIHNjb3Blcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNldDxTdHJpbmc+IGdldEZpbHRlcmluZ1Njb3BlcyhmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgcmV0dXJuIGdldEZpbHRlcmluZ1Njb3Blcyhhbm5vdGF0aW9ucywgdHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGVudGl0eS1maWx0ZXJpbmcgc2NvcGVzIGZyb20gZ2l2ZW4gYW5ub3RhdGlvbnMuIFNjb3BlcyBhcmUgb25seSBkZXJpdmVkIGZyb20gZW50aXR5LWZpbHRlcmluZyBhbm5vdGF0aW9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbm5vdGF0aW9ucyBsaXN0IG9mIGFyYml0cmFyeSBhbm5vdGF0aW9ucy4KKyAgICAgKiBAcGFyYW0gZmlsdGVyIHtAY29kZSB0cnVlfSB3aGV0aGVyIHRoZSBnaXZlbiBhbm5vdGF0aW9uIHNob3VsZCBiZSByZWR1Y2VkIHRvIG9ubHkgZW50aXR5LWZpbHRlcmluZyBhbm5vdGF0aW9ucywKKyAgICAgKiB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAcmV0dXJuIGEgc2V0IG9mIGVudGl0eS1maWx0ZXJpbmcgc2NvcGVzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU2V0PFN0cmluZz4gZ2V0RmlsdGVyaW5nU2NvcGVzKEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgZmluYWwgYm9vbGVhbiBmaWx0ZXIpIHsKKyAgICAgICAgaWYgKGFubm90YXRpb25zLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IGNvbnRleHRzID0gbmV3IEhhc2hTZXQ8Pihhbm5vdGF0aW9ucy5sZW5ndGgpOworCisgICAgICAgIGFubm90YXRpb25zID0gZmlsdGVyID8gZ2V0RmlsdGVyaW5nQW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpIDogYW5ub3RhdGlvbnM7CisgICAgICAgIGZvciAoZmluYWwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgICAgIGNvbnRleHRzLmFkZChhbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjb250ZXh0czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaWx0ZXIgZ2l2ZW4gYW5ub3RhdGlvbnMgYW5kIHJldHVybiBvbmx5IGVudGl0eS1maWx0ZXJpbmcgb25lcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbm5vdGF0aW9ucyBsaXN0IG9mIGFyYml0cmFyeSBhbm5vdGF0aW9ucy4KKyAgICAgKiBAcmV0dXJuIGVudGl0eS1maWx0ZXJpbmcgYW5ub3RhdGlvbnMgb3IgYW4gZW1wdHkgYXJyYXkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBBbm5vdGF0aW9uW10gZ2V0RmlsdGVyaW5nQW5ub3RhdGlvbnMoZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zKSB7CisgICAgICAgIGlmIChhbm5vdGF0aW9ucyA9PSBudWxsIHx8IGFubm90YXRpb25zLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gRmlsdGVyaW5nSGVscGVyLkVNUFRZX0FOTk9UQVRJT05TOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgTGlzdDxBbm5vdGF0aW9uPiBmaWx0ZXJpbmdBbm5vdGF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8Pihhbm5vdGF0aW9ucy5sZW5ndGgpOworCisgICAgICAgIGZvciAoZmluYWwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgICAgIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBhbm5vdGF0aW9uVHlwZSA9IGFubm90YXRpb24uYW5ub3RhdGlvblR5cGUoKTsKKworICAgICAgICAgICAgZm9yIChmaW5hbCBBbm5vdGF0aW9uIG1ldGFBbm5vdGF0aW9uIDogYW5ub3RhdGlvblR5cGUuZ2V0RGVjbGFyZWRBbm5vdGF0aW9ucygpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1ldGFBbm5vdGF0aW9uIGluc3RhbmNlb2YgRW50aXR5RmlsdGVyaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcmluZ0Fubm90YXRpb25zLmFkZChhbm5vdGF0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmlsdGVyaW5nQW5ub3RhdGlvbnMudG9BcnJheShuZXcgQW5ub3RhdGlvbltmaWx0ZXJpbmdBbm5vdGF0aW9ucy5zaXplKCldKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgQW5ub3RhdGlvbj4gVCBnZXRBbm5vdGF0aW9uKGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgZmluYWwgQ2xhc3M8VD4gY2xhenopIHsKKyAgICAgICAgZm9yIChmaW5hbCBBbm5vdGF0aW9uIGFubm90YXRpb24gOiBhbm5vdGF0aW9ucykgeworICAgICAgICAgICAgaWYgKGFubm90YXRpb24uYW5ub3RhdGlvblR5cGUoKS5nZXRDbGFzcygpLmlzQXNzaWduYWJsZUZyb20oY2xhenopKSB7CisgICAgICAgICAgICAgICAgLy9ub2luc3BlY3Rpb24gdW5jaGVja2VkCisgICAgICAgICAgICAgICAgcmV0dXJuIChUKSBhbm5vdGF0aW9uOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByZXZlbnQgaW5zdGFudGlhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIEVudGl0eUZpbHRlcmluZ0hlbHBlcigpIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL0VudGl0eUZpbHRlcmluZ1Byb2Nlc3Nvci5qYXZhIGIvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9FbnRpdHlGaWx0ZXJpbmdQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWY1MzExCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9FbnRpdHlGaWx0ZXJpbmdQcm9jZXNzb3IuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qcmlvcml0eTsKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuc3BpLkFic3RyYWN0RW50aXR5UHJvY2Vzc29yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLnNwaS5FbnRpdHlHcmFwaDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5zcGkuRW50aXR5UHJvY2Vzc29yQ29udGV4dDsKKworLyoqCisgKiBFbnRpdHkgcHJvY2Vzc29yIGhhbmRsaW5nIGVudGl0eS1maWx0ZXJpbmcgYW5ub3RhdGlvbnMuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BTaW5nbGV0b24KK0BQcmlvcml0eShJbnRlZ2VyLk1BWF9WQUxVRSAtIDIwMDApCitmaW5hbCBjbGFzcyBFbnRpdHlGaWx0ZXJpbmdQcm9jZXNzb3IgZXh0ZW5kcyBBYnN0cmFjdEVudGl0eVByb2Nlc3NvciB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzdWx0IHByb2Nlc3MoZmluYWwgRW50aXR5UHJvY2Vzc29yQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN3aXRjaCAoY29udGV4dC5nZXRUeXBlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgQ0xBU1NfUkVBREVSOgorICAgICAgICAgICAgY2FzZSBDTEFTU19XUklURVI6CisgICAgICAgICAgICAgICAgYWRkR2xvYmFsU2NvcGVzKEVudGl0eUZpbHRlcmluZ0hlbHBlci5nZXRGaWx0ZXJpbmdTY29wZXMoY29udGV4dC5nZXRFbnRpdHlDbGFzcygpLmdldERlY2xhcmVkQW5ub3RhdGlvbnMoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmdldEVudGl0eUdyYXBoKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvLyBOT09QLgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdXBlci5wcm9jZXNzKGNvbnRleHQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXN1bHQgcHJvY2VzcyhmaW5hbCBTdHJpbmcgZmllbGQsIGZpbmFsIENsYXNzPD8+IGZpZWxkQ2xhc3MsIGZpbmFsIEFubm90YXRpb25bXSBmaWVsZEFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIGZpbmFsIEVudGl0eUdyYXBoIGdyYXBoKSB7CisgICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IGZpbHRlcmluZ1Njb3BlcyA9IG5ldyBIYXNoU2V0PD4oKTsKKworICAgICAgICBpZiAoZmllbGRBbm5vdGF0aW9ucy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBmaWx0ZXJpbmdTY29wZXMuYWRkQWxsKEVudGl0eUZpbHRlcmluZ0hlbHBlci5nZXRGaWx0ZXJpbmdTY29wZXMoZmllbGRBbm5vdGF0aW9ucykpOworICAgICAgICB9CisgICAgICAgIGlmIChhbm5vdGF0aW9ucy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICBmaWx0ZXJpbmdTY29wZXMuYWRkQWxsKEVudGl0eUZpbHRlcmluZ0hlbHBlci5nZXRGaWx0ZXJpbmdTY29wZXMoYW5ub3RhdGlvbnMpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghZmlsdGVyaW5nU2NvcGVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgaWYgKGZpZWxkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhZGRGaWx0ZXJpbmdTY29wZXMoZmllbGQsIGZpZWxkQ2xhc3MsIGZpbHRlcmluZ1Njb3BlcywgZ3JhcGgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhZGRHbG9iYWxTY29wZXMoZmlsdGVyaW5nU2NvcGVzLCBncmFwaCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0LkFQUExZOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdC5TS0lQOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9FbnRpdHlGaWx0ZXJpbmdTY29wZVJlc29sdmVyLmphdmEgYi9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL0VudGl0eUZpbHRlcmluZ1Njb3BlUmVzb2x2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDcxZWM4Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9FbnRpdHlGaWx0ZXJpbmdTY29wZVJlc29sdmVyLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZzsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5zcGkuU2NvcGVSZXNvbHZlcjsKKworLyoqCisgKiB7QGxpbmsgU2NvcGVSZXNvbHZlciBTY29wZSBwcm92aWRlcn0gcHJvY2Vzc2luZyBlbnRpdHktZmlsdGVyaW5nIGFubm90YXRpb25zIGNyZWF0ZWQgdXNpbmcKKyAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5FbnRpdHlGaWx0ZXJpbmcgQEVudGl0eUZpbHRlcmluZ30gbWV0YS1hbm5vdGF0aW9uLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAU2luZ2xldG9uCitmaW5hbCBjbGFzcyBFbnRpdHlGaWx0ZXJpbmdTY29wZVJlc29sdmVyIGltcGxlbWVudHMgU2NvcGVSZXNvbHZlciB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PFN0cmluZz4gcmVzb2x2ZShmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgcmV0dXJuIEVudGl0eUZpbHRlcmluZ0hlbHBlci5nZXRGaWx0ZXJpbmdTY29wZXMoYW5ub3RhdGlvbnMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvRW50aXR5R3JhcGhJbXBsLmphdmEgYi9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL0VudGl0eUdyYXBoSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNDk2MmMKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL0VudGl0eUdyYXBoSW1wbC5qYXZhCkBAIC0wLDAgKzEsMjUwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhLkhhc2hCYXNlZFRhYmxlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhLkhhc2hNdWx0aW1hcDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YS5UYWJsZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5zcGkuRW50aXR5R3JhcGg7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuc3BpLlNjb3BlUHJvdmlkZXI7CisKKy8qKgorICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgRW50aXR5R3JhcGh9LgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitmaW5hbCBjbGFzcyBFbnRpdHlHcmFwaEltcGwgaW1wbGVtZW50cyBFbnRpdHlHcmFwaCB7CisKKyAgICBwcml2YXRlIGZpbmFsIENsYXNzPD8+IGVudGl0eUNsYXNzOworCisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8U3RyaW5nPiBnbG9iYWxTY29wZXM7CisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8U3RyaW5nPiBsb2NhbFNjb3BlczsKKworICAgIC8vIDxGaWx0ZXJpbmdTY29wZSwgRmllbGROYW1lPgorICAgIHByaXZhdGUgZmluYWwgSGFzaE11bHRpbWFwPFN0cmluZywgU3RyaW5nPiBmaWVsZHM7CisgICAgLy8gPEZpbHRlcmluZ1Njb3BlLCBGaWVsZE5hbWUsIENsYXNzPgorICAgIHByaXZhdGUgZmluYWwgVGFibGU8U3RyaW5nLCBTdHJpbmcsIENsYXNzPD8+PiBzdWJncmFwaHM7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gZW50aXR5IGdyYXBoIGZvciBnaXZlbiBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbnRpdHlDbGFzcyBlbnRpdHkgY2xhc3MgdGhlIGdyYXBoIHNob3VsZCBiZSBjcmVhdGVkIGZvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgRW50aXR5R3JhcGhJbXBsKGZpbmFsIENsYXNzPD8+IGVudGl0eUNsYXNzKSB7CisgICAgICAgIHRoaXMuZW50aXR5Q2xhc3MgPSBlbnRpdHlDbGFzczsKKworICAgICAgICB0aGlzLmZpZWxkcyA9IEhhc2hNdWx0aW1hcC5jcmVhdGUoKTsKKyAgICAgICAgdGhpcy5zdWJncmFwaHMgPSBIYXNoQmFzZWRUYWJsZS5jcmVhdGUoKTsKKworICAgICAgICB0aGlzLmdsb2JhbFNjb3BlcyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgdGhpcy5sb2NhbFNjb3BlcyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRW50aXR5R3JhcGhJbXBsIGFkZEZpZWxkKGZpbmFsIFN0cmluZyBmaWVsZE5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGFkZEZpZWxkKGZpZWxkTmFtZSwgZ2xvYmFsU2NvcGVzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRW50aXR5R3JhcGhJbXBsIGFkZEZpZWxkKGZpbmFsIFN0cmluZyBmaWVsZE5hbWUsIGZpbmFsIFN0cmluZy4uLiBmaWx0ZXJpbmdTY29wZXMpIHsKKyAgICAgICAgcmV0dXJuIGFkZEZpZWxkKGZpZWxkTmFtZSwgQXJyYXlzLnN0cmVhbShmaWx0ZXJpbmdTY29wZXMpLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEVudGl0eUdyYXBoSW1wbCBhZGRGaWVsZChmaW5hbCBTdHJpbmcgZmllbGROYW1lLCBmaW5hbCBTZXQ8U3RyaW5nPiBmaWx0ZXJpbmdTY29wZXMpIHsKKyAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgZmlsdGVyaW5nU2NvcGUgOiBmaWx0ZXJpbmdTY29wZXMpIHsKKyAgICAgICAgICAgIGNyZWF0ZUZpbHRlcmluZ1Njb3BlKGZpbHRlcmluZ1Njb3BlKTsKKyAgICAgICAgICAgIGZpZWxkcy5nZXQoZmlsdGVyaW5nU2NvcGUpLmFkZChmaWVsZE5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEVudGl0eUdyYXBoSW1wbCBhZGRGaWx0ZXJpbmdTY29wZXMoZmluYWwgU2V0PFN0cmluZz4gZmlsdGVyaW5nU2NvcGVzKSB7CisgICAgICAgIHRoaXMuZ2xvYmFsU2NvcGVzLmFkZEFsbChmaWx0ZXJpbmdTY29wZXMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRW50aXR5R3JhcGhJbXBsIGFkZFN1YmdyYXBoKGZpbmFsIFN0cmluZyBmaWVsZE5hbWUsIGZpbmFsIENsYXNzPD8+IGZpZWxkQ2xhc3MpIHsKKyAgICAgICAgcmV0dXJuIGFkZFN1YmdyYXBoKGZpZWxkTmFtZSwgZmllbGRDbGFzcywgZ2xvYmFsU2NvcGVzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRW50aXR5R3JhcGhJbXBsIGFkZFN1YmdyYXBoKGZpbmFsIFN0cmluZyBmaWVsZE5hbWUsIGZpbmFsIENsYXNzPD8+IGZpZWxkQ2xhc3MsIGZpbmFsIFN0cmluZy4uLiBmaWx0ZXJpbmdTY29wZXMpIHsKKyAgICAgICAgcmV0dXJuIGFkZFN1YmdyYXBoKGZpZWxkTmFtZSwgZmllbGRDbGFzcywgQXJyYXlzLnN0cmVhbShmaWx0ZXJpbmdTY29wZXMpLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEVudGl0eUdyYXBoSW1wbCBhZGRTdWJncmFwaChmaW5hbCBTdHJpbmcgZmllbGROYW1lLCBmaW5hbCBDbGFzczw/PiBmaWVsZENsYXNzLCBmaW5hbCBTZXQ8U3RyaW5nPiBmaWx0ZXJpbmdTY29wZXMpIHsKKyAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgZmlsdGVyaW5nU2NvcGUgOiBmaWx0ZXJpbmdTY29wZXMpIHsKKyAgICAgICAgICAgIGNyZWF0ZUZpbHRlcmluZ1Njb3BlKGZpbHRlcmluZ1Njb3BlKTsKKyAgICAgICAgICAgIHN1YmdyYXBocy5wdXQoZmlsdGVyaW5nU2NvcGUsIGZpZWxkTmFtZSwgZmllbGRDbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0RW50aXR5Q2xhc3MoKSB7CisgICAgICAgIHJldHVybiBlbnRpdHlDbGFzczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0RmllbGRzKGZpbmFsIFN0cmluZyBmaWx0ZXJpbmdTY29wZSkgeworICAgICAgICByZXR1cm4gZmllbGRzLmNvbnRhaW5zS2V5KGZpbHRlcmluZ1Njb3BlKQorICAgICAgICAgICAgICAgID8gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KGZpZWxkcy5nZXQoZmlsdGVyaW5nU2NvcGUpKSA6IENvbGxlY3Rpb25zLjxTdHJpbmc+ZW1wdHlTZXQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0RmllbGRzKGZpbmFsIFN0cmluZy4uLiBmaWx0ZXJpbmdTY29wZXMpIHsKKyAgICAgICAgcmV0dXJuIGZpbHRlcmluZ1Njb3Blcy5sZW5ndGggPT0gMCA/IENvbGxlY3Rpb25zLjxTdHJpbmc+ZW1wdHlTZXQoKQorICAgICAgICAgICAgICAgIDogKGZpbHRlcmluZ1Njb3Blcy5sZW5ndGggPT0gMQorICAgICAgICAgICAgICAgID8gZ2V0RmllbGRzKGZpbHRlcmluZ1Njb3Blc1swXSkKKyAgICAgICAgICAgICAgICA6IGdldEZpZWxkcyhBcnJheXMuc3RyZWFtKGZpbHRlcmluZ1Njb3BlcykuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxTdHJpbmc+IGdldEZpZWxkcyhmaW5hbCBTZXQ8U3RyaW5nPiBmaWx0ZXJpbmdTY29wZXMpIHsKKyAgICAgICAgZmluYWwgU2V0PFN0cmluZz4gbWF0Y2hlZCA9IG5ldyBIYXNoU2V0PD4oKTsKKworICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBmaWx0ZXJpbmdDb250ZXh0IDogZmlsdGVyaW5nU2NvcGVzKSB7CisgICAgICAgICAgICBtYXRjaGVkLmFkZEFsbChmaWVsZHMuZ2V0KGZpbHRlcmluZ0NvbnRleHQpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtYXRjaGVkOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRGaWx0ZXJpbmdTY29wZXMoKSB7CisgICAgICAgIEhhc2hTZXQ8U3RyaW5nPiBzdHJpbmdzID0gbmV3IEhhc2hTZXQ8PihnbG9iYWxTY29wZXMpOworICAgICAgICBzdHJpbmdzLmFkZEFsbChsb2NhbFNjb3Blcyk7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoc3RyaW5ncyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxTdHJpbmc+IGdldENsYXNzRmlsdGVyaW5nU2NvcGVzKCkgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KGdsb2JhbFNjb3Blcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1hcDxTdHJpbmcsIENsYXNzPD8+PiBnZXRTdWJncmFwaHMoZmluYWwgU3RyaW5nIGZpbHRlcmluZ1Njb3BlKSB7CisgICAgICAgIHJldHVybiBzdWJncmFwaHMuY29udGFpbnNSb3coZmlsdGVyaW5nU2NvcGUpCisgICAgICAgICAgICAgICAgPyBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAoc3ViZ3JhcGhzLnJvdyhmaWx0ZXJpbmdTY29wZSkpIDogQ29sbGVjdGlvbnMuPFN0cmluZywgQ2xhc3M8Pz4+ZW1wdHlNYXAoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWFwPFN0cmluZywgQ2xhc3M8Pz4+IGdldFN1YmdyYXBocyhmaW5hbCBTdHJpbmcuLi4gZmlsdGVyaW5nU2NvcGVzKSB7CisgICAgICAgIHJldHVybiBmaWx0ZXJpbmdTY29wZXMubGVuZ3RoID09IDAKKyAgICAgICAgICAgICAgICA/IENvbGxlY3Rpb25zLjxTdHJpbmcsIENsYXNzPD8+PmVtcHR5TWFwKCkKKyAgICAgICAgICAgICAgICA6IChmaWx0ZXJpbmdTY29wZXMubGVuZ3RoID09IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZ2V0U3ViZ3JhcGhzKGZpbHRlcmluZ1Njb3Blc1swXSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZ2V0U3ViZ3JhcGhzKEFycmF5cy5zdHJlYW0oZmlsdGVyaW5nU2NvcGVzKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSkpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWFwPFN0cmluZywgQ2xhc3M8Pz4+IGdldFN1YmdyYXBocyhmaW5hbCBTZXQ8U3RyaW5nPiBmaWx0ZXJpbmdTY29wZXMpIHsKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgQ2xhc3M8Pz4+IG1hdGNoZWQgPSBuZXcgSGFzaE1hcDw+KCk7CisKKyAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgZmlsdGVyaW5nQ29udGV4dCA6IGZpbHRlcmluZ1Njb3BlcykgeworICAgICAgICAgICAgbWF0Y2hlZC5wdXRBbGwoc3ViZ3JhcGhzLnJvdyhmaWx0ZXJpbmdDb250ZXh0KSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbWF0Y2hlZDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBwcmVzZW50SW5TY29wZXMoZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGZpZWxkcy5jb250YWluc1ZhbHVlKG5hbWUpIHx8IHN1YmdyYXBocy5jb250YWluc0NvbHVtbihuYW1lKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBwcmVzZW50SW5TY29wZShmaW5hbCBTdHJpbmcgZmllbGQsIGZpbmFsIFN0cmluZyBmaWx0ZXJpbmdTY29wZSkgeworICAgICAgICByZXR1cm4gZmllbGRzLmNvbnRhaW5zRW50cnkoZmlsdGVyaW5nU2NvcGUsIGZpZWxkKSB8fCBzdWJncmFwaHMuY29udGFpbnMoZmlsdGVyaW5nU2NvcGUsIGZpZWxkKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRW50aXR5R3JhcGhJbXBsIHJlbW92ZShmaW5hbCBTdHJpbmcgZmllbGROYW1lKSB7CisgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIHNjb3BlIDogZ2V0RmlsdGVyaW5nU2NvcGVzKCkpIHsKKyAgICAgICAgICAgIGlmIChmaWVsZHMuY29udGFpbnNFbnRyeShzY29wZSwgZmllbGROYW1lKSkgeworICAgICAgICAgICAgICAgIGZpZWxkcy5yZW1vdmUoc2NvcGUsIGZpZWxkTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3ViZ3JhcGhzLmNvbnRhaW5zQ29sdW1uKGZpZWxkTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBzdWJncmFwaHMucmVtb3ZlKHNjb3BlLCBmaWVsZE5hbWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBlbnRpdHktZmlsdGVyaW5nIHNjb3BlIGJhc2VkIG9uIHRoZSB7QGxpbmsgU2NvcGVQcm92aWRlciNERUZBVUxUX1NDT1BFIGRlZmF1bHQgb25lfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWx0ZXJpbmdTY29wZSBlbnRpdHktZmlsdGVyaW5nIHNjb3BlIHRvIGJlIGNyZWF0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUZpbHRlcmluZ1Njb3BlKGZpbmFsIFN0cmluZyBmaWx0ZXJpbmdTY29wZSkgeworICAgICAgICAvLyBEbyBub3QgY3JlYXRlIGEgc2NvcGUgaWYgaXQgYWxyZWFkeSBleGlzdHMuCisgICAgICAgIGlmICghZ2V0RmlsdGVyaW5nU2NvcGVzKCkuY29udGFpbnMoZmlsdGVyaW5nU2NvcGUpKSB7CisgICAgICAgICAgICAvLyBDb3B5IGNvbnRlbnRzIG9mIGRlZmF1bHQgc2NvcGUgaW50byB0aGUgbmV3IG9uZS4KKyAgICAgICAgICAgIGlmIChsb2NhbFNjb3Blcy5jb250YWlucyhTY29wZVByb3ZpZGVyLkRFRkFVTFRfU0NPUEUpKSB7CisgICAgICAgICAgICAgICAgZmllbGRzLnB1dEFsbChmaWx0ZXJpbmdTY29wZSwgZmllbGRzLmdldChTY29wZVByb3ZpZGVyLkRFRkFVTFRfU0NPUEUpKTsKKworICAgICAgICAgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIENsYXNzPD8+PiByb3cgPSBzdWJncmFwaHMucm93KFNjb3BlUHJvdmlkZXIuREVGQVVMVF9TQ09QRSk7CisgICAgICAgICAgICAgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8U3RyaW5nLCBDbGFzczw/Pj4gZW50cnkgOiByb3cuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgICAgICBzdWJncmFwaHMucHV0KGZpbHRlcmluZ1Njb3BlLCBlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9jYWxTY29wZXMuYWRkKGZpbHRlcmluZ1Njb3BlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3QgbykgeworICAgICAgICBpZiAodGhpcyA9PSBvKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBFbnRpdHlHcmFwaEltcGwgdGhhdCA9IChFbnRpdHlHcmFwaEltcGwpIG87CisKKyAgICAgICAgcmV0dXJuIGVudGl0eUNsYXNzLmVxdWFscyh0aGF0LmVudGl0eUNsYXNzKQorICAgICAgICAgICAgICAgICYmIGZpZWxkcy5lcXVhbHModGhhdC5maWVsZHMpCisgICAgICAgICAgICAgICAgJiYgZ2xvYmFsU2NvcGVzLmVxdWFscyh0aGF0Lmdsb2JhbFNjb3BlcykKKyAgICAgICAgICAgICAgICAmJiBsb2NhbFNjb3Blcy5lcXVhbHModGhhdC5sb2NhbFNjb3BlcykKKyAgICAgICAgICAgICAgICAmJiBzdWJncmFwaHMuZXF1YWxzKHRoYXQuc3ViZ3JhcGhzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgcmVzdWx0ID0gZW50aXR5Q2xhc3MuaGFzaENvZGUoKTsKKyAgICAgICAgcmVzdWx0ID0gNTMgKiByZXN1bHQgKyBnbG9iYWxTY29wZXMuaGFzaENvZGUoKTsKKyAgICAgICAgcmVzdWx0ID0gNTMgKiByZXN1bHQgKyBsb2NhbFNjb3Blcy5oYXNoQ29kZSgpOworICAgICAgICByZXN1bHQgPSA1MyAqIHJlc3VsdCArIGZpZWxkcy5oYXNoQ29kZSgpOworICAgICAgICByZXN1bHQgPSA1MyAqIHJlc3VsdCArIHN1YmdyYXBocy5oYXNoQ29kZSgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvRW50aXR5R3JhcGhQcm92aWRlckltcGwuamF2YSBiL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvRW50aXR5R3JhcGhQcm92aWRlckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzY3ZTllCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9FbnRpdHlHcmFwaFByb3ZpZGVySW1wbC5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRNYXA7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uRGF0YVN0cnVjdHVyZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuc3BpLkVudGl0eUdyYXBoOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLnNwaS5FbnRpdHlHcmFwaFByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLnNwaS5PYmplY3RHcmFwaDsKKworLyoqCisgKiBQcm92aWRlcyB7QGxpbmsgRW50aXR5R3JhcGggZW50aXR5IGdyYXBofSBhbmQge0BsaW5rIE9iamVjdEdyYXBoIG9iamVjdCBncmFwaH0gaW5zdGFuY2VzLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitmaW5hbCBjbGFzcyBFbnRpdHlHcmFwaFByb3ZpZGVySW1wbCBpbXBsZW1lbnRzIEVudGl0eUdyYXBoUHJvdmlkZXIgeworCisgICAgcHJpdmF0ZSBmaW5hbCBDb25jdXJyZW50TWFwPENsYXNzPD8+LCBFbnRpdHlHcmFwaD4gd3JpdGVyQ2xhc3NUb0dyYXBoID0gRGF0YVN0cnVjdHVyZXMuY3JlYXRlQ29uY3VycmVudE1hcCgpOworICAgIHByaXZhdGUgZmluYWwgQ29uY3VycmVudE1hcDxDbGFzczw/PiwgRW50aXR5R3JhcGg+IHJlYWRlckNsYXNzVG9HcmFwaCA9IERhdGFTdHJ1Y3R1cmVzLmNyZWF0ZUNvbmN1cnJlbnRNYXAoKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBFbnRpdHlHcmFwaCBnZXRPckNyZWF0ZUVudGl0eUdyYXBoKGZpbmFsIENsYXNzPD8+IGVudGl0eUNsYXNzLCBmaW5hbCBib29sZWFuIGZvcldyaXRlcikgeworICAgICAgICBmaW5hbCBDb25jdXJyZW50TWFwPENsYXNzPD8+LCBFbnRpdHlHcmFwaD4gY2xhc3NUb0dyYXBoID0gZm9yV3JpdGVyID8gd3JpdGVyQ2xhc3NUb0dyYXBoIDogcmVhZGVyQ2xhc3NUb0dyYXBoOworCisgICAgICAgIGlmICghY2xhc3NUb0dyYXBoLmNvbnRhaW5zS2V5KGVudGl0eUNsYXNzKSkgeworICAgICAgICAgICAgY2xhc3NUb0dyYXBoLnB1dElmQWJzZW50KGVudGl0eUNsYXNzLCBuZXcgRW50aXR5R3JhcGhJbXBsKGVudGl0eUNsYXNzKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNsYXNzVG9HcmFwaC5nZXQoZW50aXR5Q2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBFbnRpdHlHcmFwaCBnZXRPckNyZWF0ZUVtcHR5RW50aXR5R3JhcGgoZmluYWwgQ2xhc3M8Pz4gZW50aXR5Q2xhc3MsIGZpbmFsIGJvb2xlYW4gZm9yV3JpdGVyKSB7CisgICAgICAgIGZpbmFsIENvbmN1cnJlbnRNYXA8Q2xhc3M8Pz4sIEVudGl0eUdyYXBoPiBjbGFzc1RvR3JhcGggPSBmb3JXcml0ZXIgPyB3cml0ZXJDbGFzc1RvR3JhcGggOiByZWFkZXJDbGFzc1RvR3JhcGg7CisKKyAgICAgICAgaWYgKCFjbGFzc1RvR3JhcGguY29udGFpbnNLZXkoZW50aXR5Q2xhc3MpCisgICAgICAgICAgICAgICAgfHwgIShjbGFzc1RvR3JhcGguZ2V0KGVudGl0eUNsYXNzKSBpbnN0YW5jZW9mIEVtcHR5RW50aXR5R3JhcGhJbXBsKSkgeworICAgICAgICAgICAgY2xhc3NUb0dyYXBoLnB1dChlbnRpdHlDbGFzcywgbmV3IEVtcHR5RW50aXR5R3JhcGhJbXBsKGVudGl0eUNsYXNzKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNsYXNzVG9HcmFwaC5nZXQoZW50aXR5Q2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiB1bm1vZGlmaWFibGUgbWFwIG9mIGVudGl0eSBncmFwaHMgZm9yIHJlYWRlci93cml0ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZm9yV3JpdGVyIGZsYWcgZGV0ZXJtaW5pbmcgd2hldGhlciB0aGUgcmV0dXJuZWQgbWFwIHNob3VsZCBiZSBmb3Igd3JpdGVyL3JlYWRlci4KKyAgICAgKiBAcmV0dXJuIGFuIHVubW9kaWZpYWJsZSBtYXAgb2YgZW50aXR5IGdyYXBocy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwPENsYXNzPD8+LCBFbnRpdHlHcmFwaD4gYXNNYXAoZmluYWwgYm9vbGVhbiBmb3JXcml0ZXIpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChmb3JXcml0ZXIgPyB3cml0ZXJDbGFzc1RvR3JhcGggOiByZWFkZXJDbGFzc1RvR3JhcGgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zRW50aXR5R3JhcGgoZmluYWwgQ2xhc3M8Pz4gZW50aXR5Q2xhc3MsIGZpbmFsIGJvb2xlYW4gZm9yV3JpdGVyKSB7CisgICAgICAgIHJldHVybiBmb3JXcml0ZXIgPyB3cml0ZXJDbGFzc1RvR3JhcGguY29udGFpbnNLZXkoZW50aXR5Q2xhc3MpIDogcmVhZGVyQ2xhc3NUb0dyYXBoLmNvbnRhaW5zS2V5KGVudGl0eUNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0R3JhcGggY3JlYXRlT2JqZWN0R3JhcGgoZmluYWwgQ2xhc3M8Pz4gZW50aXR5Q2xhc3MsIGZpbmFsIFNldDxTdHJpbmc+IGZpbHRlcmluZ1Njb3BlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBmb3JXcml0ZXIpIHsKKyAgICAgICAgZmluYWwgTWFwPENsYXNzPD8+LCBFbnRpdHlHcmFwaD4gY2xhc3NUb0dyYXBoID0gZm9yV3JpdGVyID8gd3JpdGVyQ2xhc3NUb0dyYXBoIDogcmVhZGVyQ2xhc3NUb0dyYXBoOworICAgICAgICBmaW5hbCBFbnRpdHlHcmFwaCBlbnRpdHlHcmFwaCA9IGNsYXNzVG9HcmFwaC5nZXQoZW50aXR5Q2xhc3MpOworCisgICAgICAgIHJldHVybiBlbnRpdHlHcmFwaCA9PSBudWxsCisgICAgICAgICAgICAgICAgPyBuZXcgRW1wdHlPYmplY3RHcmFwaChlbnRpdHlDbGFzcykKKyAgICAgICAgICAgICAgICA6IG5ldyBPYmplY3RHcmFwaEltcGwoY2xhc3NUb0dyYXBoLCBlbnRpdHlHcmFwaCwgZmlsdGVyaW5nU2NvcGVzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL0VudGl0eUluc3BlY3RvckltcGwuamF2YSBiL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvRW50aXR5SW5zcGVjdG9ySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YWY4MzMKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL0VudGl0eUluc3BlY3RvckltcGwuamF2YQpAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZzsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5TcGxpdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5TdHJlYW1TdXBwb3J0OworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LlByb3ZpZGVyczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlJlZmxlY3Rpb25IZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuc3BpLkVudGl0eUdyYXBoOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLnNwaS5FbnRpdHlHcmFwaFByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLnNwaS5FbnRpdHlJbnNwZWN0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuc3BpLkVudGl0eVByb2Nlc3NvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5zcGkuRW50aXR5UHJvY2Vzc29yQ29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5zcGkuRmlsdGVyaW5nSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1vZGVsLmludGVybmFsLlJhbmtlZENvbXBhcmF0b3I7CisKKy8qKgorICogQ2xhc3MgcmVzcG9uc2libGUgZm9yIGluc3BlY3RpbmcgZW50aXR5IGNsYXNzZXMuIFRoaXMgY2xhc3MgaW52b2tlcyBhbGwgYXZhaWxhYmxlIHtAbGluayBFbnRpdHlQcm9jZXNzb3IgZW50aXR5IHByb2Nlc3NvcnN9IGluCisgKiBkaWZmZXJlbnQge0BsaW5rIEVudGl0eVByb2Nlc3NvckNvbnRleHQgY29udGV4dHN9LgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAU2luZ2xldG9uCitmaW5hbCBjbGFzcyBFbnRpdHlJbnNwZWN0b3JJbXBsIGltcGxlbWVudHMgRW50aXR5SW5zcGVjdG9yIHsKKworICAgIHByaXZhdGUgZmluYWwgTGlzdDxFbnRpdHlQcm9jZXNzb3I+IGVudGl0eVByb2Nlc3NvcnM7CisKKyAgICBASW5qZWN0CisgICAgcHJpdmF0ZSBFbnRpdHlHcmFwaFByb3ZpZGVyIGdyYXBoUHJvdmlkZXI7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBleHBlY3Rpbmcge0BsaW5rIEluamVjdGlvbk1hbmFnZXJ9IHRvIGJlIGluamVjdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIGluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uIG1hbmFnZXIgdG8gYmUgaW5qZWN0ZWQuCisgICAgICovCisgICAgQEluamVjdAorICAgIHB1YmxpYyBFbnRpdHlJbnNwZWN0b3JJbXBsKGZpbmFsIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlcikgeworICAgICAgICBTcGxpdGVyYXRvcjxFbnRpdHlQcm9jZXNzb3I+IGVudGl0aWVzID0KKyAgICAgICAgICAgICAgICBQcm92aWRlcnMuZ2V0QWxsUHJvdmlkZXJzKGluamVjdGlvbk1hbmFnZXIsIEVudGl0eVByb2Nlc3Nvci5jbGFzcywgbmV3IFJhbmtlZENvbXBhcmF0b3I8PigpKS5zcGxpdGVyYXRvcigpOworICAgICAgICB0aGlzLmVudGl0eVByb2Nlc3NvcnMgPSBTdHJlYW1TdXBwb3J0LnN0cmVhbShlbnRpdGllcywgZmFsc2UpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaW5zcGVjdChmaW5hbCBDbGFzczw/PiBlbnRpdHlDbGFzcywgZmluYWwgYm9vbGVhbiBmb3JXcml0ZXIpIHsKKyAgICAgICAgaWYgKCFncmFwaFByb3ZpZGVyLmNvbnRhaW5zRW50aXR5R3JhcGgoZW50aXR5Q2xhc3MsIGZvcldyaXRlcikpIHsKKyAgICAgICAgICAgIGZpbmFsIEVudGl0eUdyYXBoIGdyYXBoID0gZ3JhcGhQcm92aWRlci5nZXRPckNyZWF0ZUVudGl0eUdyYXBoKGVudGl0eUNsYXNzLCBmb3JXcml0ZXIpOworICAgICAgICAgICAgZmluYWwgU2V0PENsYXNzPD8+PiBpbnNwZWN0ID0gbmV3IEhhc2hTZXQ8PigpOworCisgICAgICAgICAgICAvLyBDbGFzcy4KKyAgICAgICAgICAgIGlmICghaW5zcGVjdEVudGl0eUNsYXNzKGVudGl0eUNsYXNzLCBncmFwaCwgZm9yV3JpdGVyKSkgeworICAgICAgICAgICAgICAgIC8vIFByb3BlcnRpZXMuCisgICAgICAgICAgICAgICAgZmluYWwgTWFwPFN0cmluZywgTWV0aG9kPiB1bm1hdGNoZWRBY2Nlc3NvcnMgPSBpbnNwZWN0RW50aXR5UHJvcGVydGllcyhlbnRpdHlDbGFzcywgZ3JhcGgsIGluc3BlY3QsIGZvcldyaXRlcik7CisKKyAgICAgICAgICAgICAgICAvLyBTZXR0ZXJzL0dldHRlcnMgd2l0aG91dCBmaWVsZHMuCisgICAgICAgICAgICAgICAgaW5zcGVjdFN0YW5kYWxvbmVBY2Nlc3NvcnModW5tYXRjaGVkQWNjZXNzb3JzLCBncmFwaCwgZm9yV3JpdGVyKTsKKworICAgICAgICAgICAgICAgIC8vIEluc3BlY3QgbmV3IGNsYXNzZXMuCisgICAgICAgICAgICAgICAgZm9yIChmaW5hbCBDbGFzczw/PiBjbGF6eiA6IGluc3BlY3QpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5zcGVjdChjbGF6eiwgZm9yV3JpdGVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZva2UgYXZhaWxhYmxlIHtAbGluayBFbnRpdHlQcm9jZXNzb3J9cyBvbiBnaXZlbiBlbnRpdHkgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW50aXR5Q2xhc3MgZW50aXR5IGNsYXNzIHRvIGJlIGV4YW1pbmVkLgorICAgICAqIEBwYXJhbSBncmFwaCBlbnRpdHkgZ3JhcGggdG8gYmUgbW9kaWZpZWQgYnkgZXhhbWluYXRpb24uCisgICAgICogQHBhcmFtIGZvcldyaXRlciBmbGFnIGRldGVybWluaW5nIHdoZXRoZXIgdGhlIGNsYXNzIHNob3VsZCBiZSBleGFtaW5lZCBmb3IgcmVhZGVyIG9yIHdyaXRlci4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgaW5zcGVjdGluZyBzaG91bGQgYmUgcm9sbC1iYWNrZWQsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpbnNwZWN0RW50aXR5Q2xhc3MoZmluYWwgQ2xhc3M8Pz4gZW50aXR5Q2xhc3MsIGZpbmFsIEVudGl0eUdyYXBoIGdyYXBoLCBmaW5hbCBib29sZWFuIGZvcldyaXRlcikgeworICAgICAgICBmaW5hbCBFbnRpdHlQcm9jZXNzb3JDb250ZXh0SW1wbCBjb250ZXh0ID0gbmV3IEVudGl0eVByb2Nlc3NvckNvbnRleHRJbXBsKAorICAgICAgICAgICAgICAgIGZvcldyaXRlciA/IEVudGl0eVByb2Nlc3NvckNvbnRleHQuVHlwZS5DTEFTU19XUklURVIgOiBFbnRpdHlQcm9jZXNzb3JDb250ZXh0LlR5cGUuQ0xBU1NfUkVBREVSLAorICAgICAgICAgICAgICAgIGVudGl0eUNsYXNzLCBncmFwaCk7CisKKyAgICAgICAgZm9yIChmaW5hbCBFbnRpdHlQcm9jZXNzb3IgcHJvY2Vzc29yIDogZW50aXR5UHJvY2Vzc29ycykgeworICAgICAgICAgICAgZmluYWwgRW50aXR5UHJvY2Vzc29yLlJlc3VsdCByZXN1bHQgPSBwcm9jZXNzb3IucHJvY2Vzcyhjb250ZXh0KTsKKworICAgICAgICAgICAgaWYgKEVudGl0eVByb2Nlc3Nvci5SZXN1bHQuUk9MTEJBQ0sgPT0gcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgZ3JhcGhQcm92aWRlci5nZXRPckNyZWF0ZUVtcHR5RW50aXR5R3JhcGgoZW50aXR5Q2xhc3MsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW52b2tlIGF2YWlsYWJsZSB7QGxpbmsgRW50aXR5UHJvY2Vzc29yfXMgb24gZmllbGRzIG9mIGdpdmVuIGVudGl0eSBjbGFzcy4gTWV0aG9kIHJldHVybnMgYSBtYXAgKHtAY29kZSBmaWVsZE5hbWV9LAorICAgICAqIHtAY29kZSBtZXRob2R9KSBvZiB1bnByb2Nlc3NlZCBwcm9wZXJ0eSBhY2Nlc3NvcnMgKGdldHRlcnMvc2V0dGVycykgYW5kIGZpbGxzIHtAY29kZSBpbnNwZWN0fSBzZXQgd2l0aCBlbnRpdHkgY2xhc3NlcworICAgICAqIHRoYXQgc2hvdWxkIGJlIGZ1cnRoZXIgcHJvY2Vzc2VkLgorICAgICAqCisgICAgICogQHBhcmFtIGVudGl0eUNsYXNzIGVudGl0eSBjbGFzcyB0byBvYnRhaW4gcHJvcGVydGllcyB0byBiZSBleGFtaW5lZC4KKyAgICAgKiBAcGFyYW0gZ3JhcGggZW50aXR5IGdyYXBoIHRvIGJlIG1vZGlmaWVkIGJ5IGV4YW1pbmF0aW9uLgorICAgICAqIEBwYXJhbSBpbnNwZWN0IG5vbi1udWxsIHNldCBvZiBjbGFzc2VzIHRvLWJlLWV4YW1pbmVkLgorICAgICAqIEBwYXJhbSBmb3JXcml0ZXIgZmxhZyBkZXRlcm1pbmluZyB3aGV0aGVyIHRoZSBjbGFzcyBzaG91bGQgYmUgZXhhbWluZWQgZm9yIHJlYWRlciBvciB3cml0ZXIuCisgICAgICogQHJldHVybiBtYXAgb2YgdW5wcm9jZXNzZWQgcHJvcGVydHkgYWNjZXNzb3JzLgorICAgICAqLworICAgIHByaXZhdGUgTWFwPFN0cmluZywgTWV0aG9kPiBpbnNwZWN0RW50aXR5UHJvcGVydGllcyhmaW5hbCBDbGFzczw/PiBlbnRpdHlDbGFzcywgZmluYWwgRW50aXR5R3JhcGggZ3JhcGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNldDxDbGFzczw/Pj4gaW5zcGVjdCwgZmluYWwgYm9vbGVhbiBmb3JXcml0ZXIpIHsKKyAgICAgICAgZmluYWwgRmllbGRbXSBmaWVsZHMgPSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChSZWZsZWN0aW9uSGVscGVyLmdldEFsbEZpZWxkc1BBKGVudGl0eUNsYXNzKSk7CisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE1ldGhvZD4gbWV0aG9kcyA9IEZpbHRlcmluZ0hlbHBlci5nZXRQcm9wZXJ0eU1ldGhvZHMoZW50aXR5Q2xhc3MsIGZvcldyaXRlcik7CisKKyAgICAgICAgZm9yIChmaW5hbCBGaWVsZCBmaWVsZCA6IGZpZWxkcykgeworICAgICAgICAgICAgLy8gSWdub3JlIHN0YXRpYyBmaWVsZHMuCisgICAgICAgICAgICBpZiAoTW9kaWZpZXIuaXNTdGF0aWMoZmllbGQuZ2V0TW9kaWZpZXJzKCkpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gZmllbGQuZ2V0TmFtZSgpOworICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gY2xhenogPSBGaWx0ZXJpbmdIZWxwZXIuZ2V0RW50aXR5Q2xhc3MoZmllbGQuZ2V0R2VuZXJpY1R5cGUoKSk7CisgICAgICAgICAgICBmaW5hbCBNZXRob2QgbWV0aG9kID0gbWV0aG9kcy5yZW1vdmUobmFtZSk7CisKKyAgICAgICAgICAgIGZpbmFsIEVudGl0eVByb2Nlc3NvckNvbnRleHRJbXBsIGNvbnRleHQgPSBuZXcgRW50aXR5UHJvY2Vzc29yQ29udGV4dEltcGwoCisgICAgICAgICAgICAgICAgICAgIGZvcldyaXRlciA/IEVudGl0eVByb2Nlc3NvckNvbnRleHQuVHlwZS5QUk9QRVJUWV9XUklURVIgOiBFbnRpdHlQcm9jZXNzb3JDb250ZXh0LlR5cGUuUFJPUEVSVFlfUkVBREVSLAorICAgICAgICAgICAgICAgICAgICBmaWVsZCwgbWV0aG9kLCBncmFwaCk7CisKKyAgICAgICAgICAgIGJvb2xlYW4gcm9sbGJhY2sgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoZmluYWwgRW50aXR5UHJvY2Vzc29yIHByb2Nlc3NvciA6IGVudGl0eVByb2Nlc3NvcnMpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBFbnRpdHlQcm9jZXNzb3IuUmVzdWx0IHJlc3VsdCA9IHByb2Nlc3Nvci5wcm9jZXNzKGNvbnRleHQpOworCisgICAgICAgICAgICAgICAgaWYgKEVudGl0eVByb2Nlc3Nvci5SZXN1bHQuUk9MTEJBQ0sgPT0gcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgICAgIHJvbGxiYWNrID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgZ3JhcGgucmVtb3ZlKG5hbWUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghcm9sbGJhY2sgJiYgRmlsdGVyaW5nSGVscGVyLmZpbHRlcmFibGVFbnRpdHlDbGFzcyhjbGF6eikpIHsKKyAgICAgICAgICAgICAgICBpbnNwZWN0LmFkZChjbGF6eik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbWV0aG9kczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZva2UgYXZhaWxhYmxlIHtAbGluayBFbnRpdHlQcm9jZXNzb3J9cyBvbiBhY2Nlc3NvcnMgKGdldHRlci9zZXR0ZXIpIHRoYXQgaGFzIG5vIG1hdGNoIGluIGNsYXNzZXMnIGZpZWxkcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1bnByb2Nlc3NlZEFjY2Vzc29ycyBtYXAgb2YgdW5wcm9jZXNzZWQgYWNjZXNzb3JzLgorICAgICAqIEBwYXJhbSBncmFwaCBlbnRpdHkgZ3JhcGggdG8gYmUgbW9kaWZpZWQgYnkgZXhhbWluYXRpb24uCisgICAgICogQHBhcmFtIGZvcldyaXRlciBmbGFnIGRldGVybWluaW5nIHdoZXRoZXIgdGhlIGNsYXNzIHNob3VsZCBiZSBleGFtaW5lZCBmb3IgcmVhZGVyIG9yIHdyaXRlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgaW5zcGVjdFN0YW5kYWxvbmVBY2Nlc3NvcnMoZmluYWwgTWFwPFN0cmluZywgTWV0aG9kPiB1bnByb2Nlc3NlZEFjY2Vzc29ycywgZmluYWwgRW50aXR5R3JhcGggZ3JhcGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gZm9yV3JpdGVyKSB7CisgICAgICAgIGZvciAoZmluYWwgTWFwLkVudHJ5PFN0cmluZywgTWV0aG9kPiBlbnRyeSA6IHVucHJvY2Vzc2VkQWNjZXNzb3JzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIGZpbmFsIEVudGl0eVByb2Nlc3NvckNvbnRleHRJbXBsIGNvbnRleHQgPSBuZXcgRW50aXR5UHJvY2Vzc29yQ29udGV4dEltcGwoCisgICAgICAgICAgICAgICAgICAgIGZvcldyaXRlciA/IEVudGl0eVByb2Nlc3NvckNvbnRleHQuVHlwZS5NRVRIT0RfV1JJVEVSIDogRW50aXR5UHJvY2Vzc29yQ29udGV4dC5UeXBlLk1FVEhPRF9SRUFERVIsCisgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldFZhbHVlKCksIGdyYXBoKTsKKworICAgICAgICAgICAgZm9yIChmaW5hbCBFbnRpdHlQcm9jZXNzb3IgcHJvY2Vzc29yIDogZW50aXR5UHJvY2Vzc29ycykgeworICAgICAgICAgICAgICAgIGZpbmFsIEVudGl0eVByb2Nlc3Nvci5SZXN1bHQgcmVzdWx0ID0gcHJvY2Vzc29yLnByb2Nlc3MoY29udGV4dCk7CisKKyAgICAgICAgICAgICAgICBpZiAoRW50aXR5UHJvY2Vzc29yLlJlc3VsdC5ST0xMQkFDSyA9PSByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICAgICAgZ3JhcGgucmVtb3ZlKGVudHJ5LmdldEtleSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9FbnRpdHlQcm9jZXNzb3JDb250ZXh0SW1wbC5qYXZhIGIvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9FbnRpdHlQcm9jZXNzb3JDb250ZXh0SW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0NzE2MGUKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL0VudGl0eVByb2Nlc3NvckNvbnRleHRJbXBsLmphdmEKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmc7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5zcGkuRW50aXR5R3JhcGg7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuc3BpLkVudGl0eVByb2Nlc3NvckNvbnRleHQ7CisKKy8qKgorICogRGVmYXVsdCB7QGxpbmsgRW50aXR5UHJvY2Vzc29yQ29udGV4dCBlbnRpdHkgcHJvY2Vzc29yIGNvbnRleHR9IGltcGxlbWVudGF0aW9uLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitmaW5hbCBjbGFzcyBFbnRpdHlQcm9jZXNzb3JDb250ZXh0SW1wbCBpbXBsZW1lbnRzIEVudGl0eVByb2Nlc3NvckNvbnRleHQgeworCisgICAgcHJpdmF0ZSBmaW5hbCBUeXBlIHR5cGU7CisKKyAgICBwcml2YXRlIGZpbmFsIENsYXNzPD8+IGNsYXp6OworCisgICAgcHJpdmF0ZSBmaW5hbCBGaWVsZCBmaWVsZDsKKworICAgIHByaXZhdGUgZmluYWwgTWV0aG9kIG1ldGhvZDsKKworICAgIHByaXZhdGUgZmluYWwgRW50aXR5R3JhcGggZ3JhcGg7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgZW50aXR5IHByb2Nlc3NvciBjb250ZXh0IGZvciBwcm9jZXNzaW5nIGVudGl0eSBjbGFzc2VzLgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUge0BsaW5rIFR5cGUjQ0xBU1NfUkVBREVSfSBvciB7QGxpbmsgVHlwZSNDTEFTU19XUklURVJ9LgorICAgICAqIEBwYXJhbSBjbGF6eiBlbnRpdHkgY2xhc3MuCisgICAgICogQHBhcmFtIGdyYXBoIGVudGl0eS1maWx0ZXJpbmcgZ3JhcGggYXNzb2NpYXRlZCB3aXRoIGVudGl0eSBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgRW50aXR5UHJvY2Vzc29yQ29udGV4dEltcGwoZmluYWwgVHlwZSB0eXBlLCBmaW5hbCBDbGFzczw/PiBjbGF6eiwgZmluYWwgRW50aXR5R3JhcGggZ3JhcGgpIHsKKyAgICAgICAgdGhpcyh0eXBlLCBjbGF6eiwgbnVsbCwgbnVsbCwgZ3JhcGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBlbnRpdHkgcHJvY2Vzc29yIGNvbnRleHQgZm9yIHByb2Nlc3NpbmcgZW50aXR5IHByb3BlcnRpZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSB7QGxpbmsgVHlwZSNQUk9QRVJUWV9SRUFERVJ9IG9yIHtAbGluayBUeXBlI1BST1BFUlRZX1dSSVRFUn0uCisgICAgICogQHBhcmFtIGZpZWxkIGVudGl0eSBwcm9wZXJ0eSBmaWVsZC4KKyAgICAgKiBAcGFyYW0gbWV0aG9kIGVudGl0eSBwcm9wZXJ0eSBhY2Nlc3Nvci4KKyAgICAgKiBAcGFyYW0gZ3JhcGggZW50aXR5LWZpbHRlcmluZyBncmFwaCBhc3NvY2lhdGVkIHdpdGggZW50aXR5IGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBFbnRpdHlQcm9jZXNzb3JDb250ZXh0SW1wbChmaW5hbCBUeXBlIHR5cGUsIGZpbmFsIEZpZWxkIGZpZWxkLCBmaW5hbCBNZXRob2QgbWV0aG9kLCBmaW5hbCBFbnRpdHlHcmFwaCBncmFwaCkgeworICAgICAgICB0aGlzKHR5cGUsIG51bGwsIGZpZWxkLCBtZXRob2QsIGdyYXBoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgZW50aXR5IHByb2Nlc3NvciBjb250ZXh0IGZvciBwcm9jZXNzaW5nIGVudGl0eSBhY2Nlc3NvcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSB7QGxpbmsgVHlwZSNNRVRIT0RfUkVBREVSfSBvciB7QGxpbmsgVHlwZSNNRVRIT0RfV1JJVEVSfS4KKyAgICAgKiBAcGFyYW0gbWV0aG9kIGVudGl0eSBwcm9wZXJ0eSBhY2Nlc3Nvci4KKyAgICAgKiBAcGFyYW0gZ3JhcGggZW50aXR5LWZpbHRlcmluZyBncmFwaCBhc3NvY2lhdGVkIHdpdGggZW50aXR5IGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBFbnRpdHlQcm9jZXNzb3JDb250ZXh0SW1wbChmaW5hbCBUeXBlIHR5cGUsIGZpbmFsIE1ldGhvZCBtZXRob2QsIGZpbmFsIEVudGl0eUdyYXBoIGdyYXBoKSB7CisgICAgICAgIHRoaXModHlwZSwgbnVsbCwgbnVsbCwgbWV0aG9kLCBncmFwaCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGVudGl0eSBwcm9jZXNzb3IgY29udGV4dCBmb3IgcHJvY2Vzc2luZyBlbnRpdHkgYWNjZXNzb3JzLgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgdHlwZSBvbiBlbnRpdHkgcHJvY2Vzc29yIGNvbnRleHQuCisgICAgICogQHBhcmFtIGNsYXp6IGVudGl0eSBjbGFzcy4KKyAgICAgKiBAcGFyYW0gZmllbGQgZW50aXR5IHByb3BlcnR5IGZpZWxkLgorICAgICAqIEBwYXJhbSBtZXRob2QgZW50aXR5IHByb3BlcnR5IG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gZ3JhcGggZW50aXR5LWZpbHRlcmluZyBncmFwaCBhc3NvY2lhdGVkIHdpdGggZW50aXR5IGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBFbnRpdHlQcm9jZXNzb3JDb250ZXh0SW1wbChmaW5hbCBUeXBlIHR5cGUsIGZpbmFsIENsYXNzPD8+IGNsYXp6LCBmaW5hbCBGaWVsZCBmaWVsZCwgZmluYWwgTWV0aG9kIG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRW50aXR5R3JhcGggZ3JhcGgpIHsKKyAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgdGhpcy5jbGF6eiA9IGNsYXp6OworICAgICAgICB0aGlzLmZpZWxkID0gZmllbGQ7CisgICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kOworICAgICAgICB0aGlzLmdyYXBoID0gZ3JhcGg7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFR5cGUgZ2V0VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENsYXNzPD8+IGdldEVudGl0eUNsYXNzKCkgeworICAgICAgICByZXR1cm4gY2xheno7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEZpZWxkIGdldEZpZWxkKCkgeworICAgICAgICByZXR1cm4gZmllbGQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1ldGhvZCBnZXRNZXRob2QoKSB7CisgICAgICAgIHJldHVybiBtZXRob2Q7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEVudGl0eUdyYXBoIGdldEVudGl0eUdyYXBoKCkgeworICAgICAgICByZXR1cm4gZ3JhcGg7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9PYmplY3RHcmFwaEltcGwuamF2YSBiL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvT2JqZWN0R3JhcGhJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk4YTc0ZgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvT2JqZWN0R3JhcGhJbXBsLmphdmEKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5WaWV3czsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5zcGkuRW50aXR5R3JhcGg7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuc3BpLk9iamVjdEdyYXBoOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLnNwaS5TY29wZVByb3ZpZGVyOworCisvKioKKyAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIE9iamVjdEdyYXBofS4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworZmluYWwgY2xhc3MgT2JqZWN0R3JhcGhJbXBsIGltcGxlbWVudHMgT2JqZWN0R3JhcGggeworCisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8U3RyaW5nPiBmaWx0ZXJpbmdTY29wZXM7CisKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxDbGFzczw/PiwgRW50aXR5R3JhcGg+IGNsYXNzVG9HcmFwaDsKKyAgICBwcml2YXRlIGZpbmFsIEVudGl0eUdyYXBoIGdyYXBoOworCisgICAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiBmaWVsZHM7CisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3RHcmFwaD4gc3ViZ3JhcGhzOworCisgICAgT2JqZWN0R3JhcGhJbXBsKGZpbmFsIE1hcDxDbGFzczw/PiwgRW50aXR5R3JhcGg+IGNsYXNzVG9HcmFwaCwgZmluYWwgRW50aXR5R3JhcGggZ3JhcGgsIGZpbmFsIFNldDxTdHJpbmc+IGZpbHRlcmluZ1Njb3BlcykgeworICAgICAgICB0aGlzLmZpbHRlcmluZ1Njb3BlcyA9IGZpbHRlcmluZ1Njb3BlczsKKworICAgICAgICB0aGlzLmNsYXNzVG9HcmFwaCA9IGNsYXNzVG9HcmFwaDsKKyAgICAgICAgdGhpcy5ncmFwaCA9IGdyYXBoOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDbGFzczw/PiBnZXRFbnRpdHlDbGFzcygpIHsKKyAgICAgICAgcmV0dXJuIGdyYXBoLmdldEVudGl0eUNsYXNzKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxTdHJpbmc+IGdldEZpZWxkcygpIHsKKyAgICAgICAgcmV0dXJuIGdldEZpZWxkcyhudWxsKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0RmllbGRzKGZpbmFsIFN0cmluZyBwYXJlbnQpIHsKKyAgICAgICAgZmluYWwgU2V0PFN0cmluZz4gY2hpbGRGaWx0ZXJpbmdTY29wZXMgPSBnZXRGaWx0ZXJpbmdTY29wZXMocGFyZW50KTsKKyAgICAgICAgaWYgKGZpZWxkcyA9PSBudWxsKSB7CisgICAgICAgICAgICBmaWVsZHMgPSBncmFwaC5nZXRGaWVsZHMoCisgICAgICAgICAgICAgICAgICAgIFZpZXdzLnNldFVuaW9uVmlldygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZEZpbHRlcmluZ1Njb3BlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zaW5nbGV0b24oU2NvcGVQcm92aWRlci5ERUZBVUxUX1NDT1BFKSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmaWVsZHM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdEdyYXBoPiBnZXRTdWJncmFwaHMoKSB7CisgICAgICAgIHJldHVybiBnZXRTdWJncmFwaHMobnVsbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE1hcDxTdHJpbmcsIE9iamVjdEdyYXBoPiBnZXRTdWJncmFwaHMoZmluYWwgU3RyaW5nIHBhcmVudCkgeworICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiBjaGlsZEZpbHRlcmluZ1Njb3BlcyA9IGdldEZpbHRlcmluZ1Njb3BlcyhwYXJlbnQpOworCisgICAgICAgIGlmIChzdWJncmFwaHMgPT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgTWFwPFN0cmluZywgQ2xhc3M8Pz4+IGNvbnRleHRTdWJncmFwaHMgPSBncmFwaC5nZXRTdWJncmFwaHMoY2hpbGRGaWx0ZXJpbmdTY29wZXMpOworICAgICAgICAgICAgY29udGV4dFN1YmdyYXBocy5wdXRBbGwoZ3JhcGguZ2V0U3ViZ3JhcGhzKFNjb3BlUHJvdmlkZXIuREVGQVVMVF9TQ09QRSkpOworCisgICAgICAgICAgICBzdWJncmFwaHMgPSBWaWV3cy5tYXBWaWV3KGNvbnRleHRTdWJncmFwaHMsIG5ldyBGdW5jdGlvbjxDbGFzczw/PiwgT2JqZWN0R3JhcGg+KCkgeworCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdEdyYXBoIGFwcGx5KGZpbmFsIENsYXNzPD8+IGNsYXp6KSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIEVudGl0eUdyYXBoIGVudGl0eUdyYXBoID0gY2xhc3NUb0dyYXBoLmdldChjbGF6eik7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudGl0eUdyYXBoID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3IEVtcHR5T2JqZWN0R3JhcGgoY2xhenopCisgICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBPYmplY3RHcmFwaEltcGwoY2xhc3NUb0dyYXBoLCBlbnRpdHlHcmFwaCwgZmlsdGVyaW5nU2NvcGVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3ViZ3JhcGhzOworICAgIH0KKworICAgIHByaXZhdGUgU2V0PFN0cmluZz4gZ2V0RmlsdGVyaW5nU2NvcGVzKGZpbmFsIFN0cmluZyBwYXJlbnQpIHsKKyAgICAgICAgU2V0PFN0cmluZz4gY2hpbGRGaWx0ZXJpbmdTY29wZXMgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgIGlmIChmaWx0ZXJpbmdTY29wZXMuY29udGFpbnMoU2VsZWN0YWJsZVNjb3BlUmVzb2x2ZXIuREVGQVVMVF9TQ09QRSkgfHwgcGFyZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIGNoaWxkRmlsdGVyaW5nU2NvcGVzID0gZmlsdGVyaW5nU2NvcGVzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgZmlsdGVyaW5nU2NvcGUgOiBmaWx0ZXJpbmdTY29wZXMpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBQYXR0ZXJuIHAgPSBQYXR0ZXJuLmNvbXBpbGUoU2VsZWN0YWJsZVNjb3BlUmVzb2x2ZXIuUFJFRklYICsgcGFyZW50ICsgIlxcLihcXHcrKShcXC5cXHcrKSokIik7CisgICAgICAgICAgICAgICAgZmluYWwgTWF0Y2hlciBtID0gcC5tYXRjaGVyKGZpbHRlcmluZ1Njb3BlKTsKKyAgICAgICAgICAgICAgICBpZiAobS5tYXRjaGVzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hpbGRGaWx0ZXJpbmdTY29wZXMuYWRkKFNlbGVjdGFibGVTY29wZVJlc29sdmVyLlBSRUZJWCArIG0uZ3JvdXAoMSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNoaWxkRmlsdGVyaW5nU2NvcGVzLmFkZChmaWx0ZXJpbmdTY29wZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBjaGlsZEZpbHRlcmluZ1Njb3BlczsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvT2JqZWN0R3JhcGhQcm92aWRlci5qYXZhIGIvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9PYmplY3RHcmFwaFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY5MTFlMwotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvT2JqZWN0R3JhcGhQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmc7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5zcGkuQWJzdHJhY3RPYmplY3RQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5zcGkuT2JqZWN0R3JhcGg7CisKKy8qKgorICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLnNwaS5PYmplY3RQcm92aWRlciBPYmplY3QgcHJvdmlkZXJ9IGFuZAorICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLnNwaS5PYmplY3RHcmFwaFRyYW5zZm9ybWVyIG9iamVjdCBncmFwaCB0cmFuc2Zvcm1lcn0gaW1wbGVtZW50YXRpb24gZm9yCisgKiB7QGxpbmsgT2JqZWN0R3JhcGggb2JqZWN0IGdyYXBofS4gVGhlc2UgcHJvdmlkZXJzIGFyZSBwcmVzZW50IGluIHJ1bnRpbWUgYnkgZGVmYXVsdC4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworZmluYWwgY2xhc3MgT2JqZWN0R3JhcGhQcm92aWRlciBleHRlbmRzIEFic3RyYWN0T2JqZWN0UHJvdmlkZXI8T2JqZWN0R3JhcGg+IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3RHcmFwaCB0cmFuc2Zvcm0oZmluYWwgT2JqZWN0R3JhcGggZ3JhcGgpIHsKKyAgICAgICAgcmV0dXJuIGdyYXBoOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvU2VjdXJpdHlBbm5vdGF0aW9ucy5qYXZhIGIvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9TZWN1cml0eUFubm90YXRpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVmNTVmZQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvU2VjdXJpdHlBbm5vdGF0aW9ucy5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uc2VjdXJpdHkuRGVueUFsbDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLnNlY3VyaXR5LlBlcm1pdEFsbDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLnNlY3VyaXR5LlJvbGVzQWxsb3dlZDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5Bbm5vdGF0aW9uTGl0ZXJhbDsKKworLyoqCisgKiBDb252ZW5pZW5jZSB1dGlsaXR5IG1ldGhvZHMgZm9yIGNyZWF0aW5nIGluc3RhbmNlcyBvZiBzZWN1cml0eSBhbm5vdGF0aW9ucy4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNlY3VyaXR5QW5ub3RhdGlvbnMgeworCisgICAgLyoqCisgICAgICogQ3JlYXRlIHtAbGluayBSb2xlc0FsbG93ZWR9IGFubm90YXRpb24gaW1wbGVtZW50YXRpb24gZm9yIGdpdmVuIHNldCBvZiByb2xlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb2xlcyByb2xlcyB0byBiZSBwYXJ0IG9mIHRoZSBhbm5vdGF0aW9uLgorICAgICAqIEByZXR1cm4gYW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFJvbGVzQWxsb3dlZCByb2xlc0FsbG93ZWQoZmluYWwgU3RyaW5nLi4uIHJvbGVzKSB7CisgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDw+KHJvbGVzLmxlbmd0aCk7CisgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIHJvbGUgOiByb2xlcykgeworICAgICAgICAgICAgaWYgKHJvbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGxpc3QuYWRkKHJvbGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgUm9sZXNBbGxvd2VkSW1wbChsaXN0LnRvQXJyYXkobmV3IFN0cmluZ1tsaXN0LnNpemUoKV0pKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUge0BsaW5rIFBlcm1pdEFsbH0gYW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFBlcm1pdEFsbCBwZXJtaXRBbGwoKSB7CisgICAgICAgIHJldHVybiBuZXcgUGVybWl0QWxsSW1wbCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSB7QGxpbmsgRGVueUFsbH0gYW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIERlbnlBbGwgZGVueUFsbCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBEZW55QWxsSW1wbCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlbnlBbGwgYW5ub3RhdGlvbiBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiQ2xhc3NFeHBsaWNpdGx5QW5ub3RhdGlvbiIpCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUm9sZXNBbGxvd2VkSW1wbCBleHRlbmRzIEFubm90YXRpb25MaXRlcmFsPFJvbGVzQWxsb3dlZD4gaW1wbGVtZW50cyBSb2xlc0FsbG93ZWQgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nW10gcm9sZXM7CisKKyAgICAgICAgcHJpdmF0ZSBSb2xlc0FsbG93ZWRJbXBsKGZpbmFsIFN0cmluZ1tdIHJvbGVzKSB7CisgICAgICAgICAgICB0aGlzLnJvbGVzID0gcm9sZXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZ1tdIHZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIHJvbGVzOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVueUFsbCBhbm5vdGF0aW9uIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJDbGFzc0V4cGxpY2l0bHlBbm5vdGF0aW9uIikKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBEZW55QWxsSW1wbCBleHRlbmRzIEFubm90YXRpb25MaXRlcmFsPERlbnlBbGw+IGltcGxlbWVudHMgRGVueUFsbCB7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVybWl0QWxsIGFubm90YXRpb24gaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoIkNsYXNzRXhwbGljaXRseUFubm90YXRpb24iKQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFBlcm1pdEFsbEltcGwgZXh0ZW5kcyBBbm5vdGF0aW9uTGl0ZXJhbDxQZXJtaXRBbGw+IGltcGxlbWVudHMgUGVybWl0QWxsIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmV2ZW50IGluc3RhbnRpYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBTZWN1cml0eUFubm90YXRpb25zKCkgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvU2VjdXJpdHlFbnRpdHlGaWx0ZXJpbmdGZWF0dXJlLmphdmEgYi9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL1NlY3VyaXR5RW50aXR5RmlsdGVyaW5nRmVhdHVyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyOTkxN2MKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL1NlY3VyaXR5RW50aXR5RmlsdGVyaW5nRmVhdHVyZS5qYXZhCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmc7CisKK2ltcG9ydCBqYXZheC53cy5ycy5SdW50aW1lVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuZmlsdGVyLlJvbGVzQWxsb3dlZER5bmFtaWNGZWF0dXJlOworCisvKioKKyAqIHtAbGluayBGZWF0dXJlfSB1c2VkIHRvIGFkZCBzdXBwb3J0IGZvciBKYXZhIFNlY3VyaXR5IGFubm90YXRpb25zICg8Y29kZT5qYXZheC5hbm5vdGF0aW9uLnNlY3VyaXR5PC9jb2RlPikgZm9yIEVudGl0eSBEYXRhCisgKiBGaWx0ZXJpbmcgZmVhdHVyZS4KKyAqIDxwPgorICogU3VwcG9ydGVkIGFubm90YXRpb25zIGFyZToKKyAqIDx1bD4KKyAqIDxsaT57QGxpbmsgamF2YXguYW5ub3RhdGlvbi5zZWN1cml0eS5QZXJtaXRBbGx9PC9saT4KKyAqIDxsaT57QGxpbmsgamF2YXguYW5ub3RhdGlvbi5zZWN1cml0eS5Sb2xlc0FsbG93ZWR9PC9saT4KKyAqIDxsaT57QGxpbmsgamF2YXguYW5ub3RhdGlvbi5zZWN1cml0eS5EZW55QWxsfTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICogPHA+CisgKiBJdCBpcyBzdWZmaWNpZW50IHRvIGFubm90YXRlIG9ubHkgcHJvcGVydHkgYWNjZXNzb3JzIG9mIGFuIGVudGl0eSB3aXRob3V0IGFubm90YXRpbmcgcmVzb3VyY2UgbWV0aG9kIC8gcmVzb3VyY2UgY2xhc3MgYWx0aG91Z2gKKyAqIGl0IGlzIG5vdCByZWNvbW1lbmRlZC4KKyAqIDwvcD4KKyAqIE5vdGU6IFRoaXMgZmVhdHVyZSBhbHNvIHJlZ2lzdGVycyB0aGUge0BsaW5rIEVudGl0eUZpbHRlcmluZ0ZlYXR1cmV9LgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICogQHNlZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5FbnRpdHlGaWx0ZXJpbmdGZWF0dXJlCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBTZWN1cml0eUVudGl0eUZpbHRlcmluZ0ZlYXR1cmUgaW1wbGVtZW50cyBGZWF0dXJlIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZShmaW5hbCBGZWF0dXJlQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlnID0gY29udGV4dC5nZXRDb25maWd1cmF0aW9uKCk7CisKKyAgICAgICAgaWYgKCFjb25maWcuaXNSZWdpc3RlcmVkKFNlY3VyaXR5RW50aXR5UHJvY2Vzc29yLmNsYXNzKSkgeworICAgICAgICAgICAgLy8gUm9sZXNBbGxvd2VkIGZlYXR1cmUuCisgICAgICAgICAgICBpZiAoIWNvbmZpZy5pc1JlZ2lzdGVyZWQoUm9sZXNBbGxvd2VkRHluYW1pY0ZlYXR1cmUuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihSb2xlc0FsbG93ZWREeW5hbWljRmVhdHVyZS5jbGFzcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEJpbmRlciAoRmlsdGVyaW5nT2JqZWN0UHJvdmlkZXIvRmlsdGVyaW5nR3JhcGhUcmFuc2Zvcm1lcikuCisgICAgICAgICAgICBpZiAoIWNvbmZpZy5pc1JlZ2lzdGVyZWQoRW50aXR5RmlsdGVyaW5nQmluZGVyLmNsYXNzKSkgeworICAgICAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIobmV3IEVudGl0eUZpbHRlcmluZ0JpbmRlcigpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRW50aXR5IFByb2Nlc3NvcnMuCisgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKFNlY3VyaXR5RW50aXR5UHJvY2Vzc29yLmNsYXNzKTsKKyAgICAgICAgICAgIGlmICghY29uZmlnLmlzUmVnaXN0ZXJlZChEZWZhdWx0RW50aXR5UHJvY2Vzc29yLmNsYXNzKSkgeworICAgICAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoRGVmYXVsdEVudGl0eVByb2Nlc3Nvci5jbGFzcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFNjb3BlIFByb3ZpZGVycy4KKyAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoU2VjdXJpdHlTY29wZVJlc29sdmVyLmNsYXNzKTsKKyAgICAgICAgICAgIGlmIChSdW50aW1lVHlwZS5TRVJWRVIuZXF1YWxzKGNvbmZpZy5nZXRSdW50aW1lVHlwZSgpKSkgeworICAgICAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoU2VjdXJpdHlTZXJ2ZXJTY29wZVJlc29sdmVyLmNsYXNzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU2NvcGUgUmVzb2x2ZXIuCisgICAgICAgICAgICBpZiAoUnVudGltZVR5cGUuU0VSVkVSID09IGNvbmZpZy5nZXRSdW50aW1lVHlwZSgpKSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihTZWN1cml0eVNlcnZlclNjb3BlUHJvdmlkZXIuY2xhc3MpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKENvbW1vblNjb3BlUHJvdmlkZXIuY2xhc3MpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9TZWN1cml0eUVudGl0eVByb2Nlc3Nvci5qYXZhIGIvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9TZWN1cml0eUVudGl0eVByb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NzFiNjcKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL1NlY3VyaXR5RW50aXR5UHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZzsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJpb3JpdHk7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLnNwaS5BYnN0cmFjdEVudGl0eVByb2Nlc3NvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5zcGkuRW50aXR5R3JhcGg7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuc3BpLkVudGl0eVByb2Nlc3NvcjsKKworLyoqCisgKiB7QGxpbmsgRW50aXR5UHJvY2Vzc29yIEVudGl0eSBwcm9jZXNzb3J9IGhhbmRsaW5nIHNlY3VyaXR5IGFubm90YXRpb25zIG9uIG1vZGVsIGVudGl0eSBjbGFzc2VzLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAU2luZ2xldG9uCitAUHJpb3JpdHkoSW50ZWdlci5NQVhfVkFMVUUgLSAzMDAwKQorZmluYWwgY2xhc3MgU2VjdXJpdHlFbnRpdHlQcm9jZXNzb3IgZXh0ZW5kcyBBYnN0cmFjdEVudGl0eVByb2Nlc3NvciB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzdWx0IHByb2Nlc3MoZmluYWwgU3RyaW5nIGZpZWxkTmFtZSwgZmluYWwgQ2xhc3M8Pz4gZmllbGRDbGFzcywgZmluYWwgQW5ub3RhdGlvbltdIGZpZWxkQW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgZmluYWwgRW50aXR5R3JhcGggZ3JhcGgpIHsKKyAgICAgICAgaWYgKGFubm90YXRpb25zLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IGZpbHRlcmluZ1Njb3BlcyA9IFNlY3VyaXR5SGVscGVyLmdldEZpbHRlcmluZ1Njb3Blcyhhbm5vdGF0aW9ucyk7CisKKyAgICAgICAgICAgIGlmIChmaWx0ZXJpbmdTY29wZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBFbnRpdHlQcm9jZXNzb3IuUmVzdWx0LlJPTExCQUNLOworICAgICAgICAgICAgfSBlbHNlIGlmICghZmlsdGVyaW5nU2NvcGVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGlmIChmaWVsZE5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZmllbGQuCisgICAgICAgICAgICAgICAgICAgIGFkZEZpbHRlcmluZ1Njb3BlcyhmaWVsZE5hbWUsIGZpZWxkQ2xhc3MsIGZpbHRlcmluZ1Njb3BlcywgZ3JhcGgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZvciBlbnRpcmUgY2xhc3MgaW50byBncmFwaC4KKyAgICAgICAgICAgICAgICAgICAgYWRkR2xvYmFsU2NvcGVzKGZpbHRlcmluZ1Njb3BlcywgZ3JhcGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBFbnRpdHlQcm9jZXNzb3IuUmVzdWx0LkFQUExZOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvU2VjdXJpdHlIZWxwZXIuamF2YSBiL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvU2VjdXJpdHlIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWZjOTY4Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9TZWN1cml0eUhlbHBlci5qYXZhCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuU2VjdXJpdHlDb250ZXh0OworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5zZWN1cml0eS5EZW55QWxsOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uc2VjdXJpdHkuUGVybWl0QWxsOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uc2VjdXJpdHkuUm9sZXNBbGxvd2VkOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuc3BpLkZpbHRlcmluZ0hlbHBlcjsKKworLyoqCisgKiBVdGlsaXR5IG1ldGhvZHMgZm9yIHNlY3VyaXR5IEVudGl0eSBEYXRhIEZpbHRlcmluZy4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworZmluYWwgY2xhc3MgU2VjdXJpdHlIZWxwZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gcm9sZXMgPSBuZXcgSGFzaFNldDw+KCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgZW50aXR5LWZpbHRlcmluZyBzY29wZXMgb2Ygc2VjdXJpdHkgYW5ub3RhdGlvbnMgcHJlc2VudCBhbW9uZyBnaXZlbiBhbm5vdGF0aW9ucy4KKyAgICAgKiA8cD4KKyAgICAgKiBBIHNjb3BlIGxvb2sgbGlrZToKKyAgICAgKiA8dWw+CisgICAgICogPGxpPiZsdDtmdWxseSBxdWFsaWZpZWQgYW5ub3RhdGlvbiBjbGFzcyBuYW1lJmd0Oywgb3I8L2xpPgorICAgICAqIDxsaT4mbHQ7ZnVsbHkgcXVhbGlmaWVkIGFubm90YXRpb24gY2xhc3MgbmFtZSZndDtfJmx0O3JvbGUmZ3Q7PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbm5vdGF0aW9ucyBhIGxpc3Qgb2YgYW5ub3RhdGlvbnMgKGRvZXNuJ3QgbmVlZCB0byBjb250YWluIG9ubHkgc2VjdXJpdHkgYW5ub3RhdGlvbnMpCisgICAgICogQHJldHVybiBhIHNldCBvZiBlbnRpdHktZmlsdGVyaW5nIHNjb3Blcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgU2V0PFN0cmluZz4gZ2V0RmlsdGVyaW5nU2NvcGVzKGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucykgeworICAgICAgICByZXR1cm4gZ2V0RmlsdGVyaW5nU2NvcGVzKG51bGwsIGFubm90YXRpb25zKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgZW50aXR5LWZpbHRlcmluZyBzY29wZXMgb2Ygc2VjdXJpdHkgYW5ub3RhdGlvbnMgcHJlc2VudCBhbW9uZyBnaXZlbiBhbm5vdGF0aW9ucyB3aXRoIHJlc3BlY3QgdG8gZ2l2ZW4KKyAgICAgKiB7QGxpbmsgU2VjdXJpdHlDb250ZXh0fS4gUmVzdWx0aW5nIHNldCBjb250YWlucyBvbmx5IHNjb3BlcyB0aGF0IHBhc3MgdGhlIHNlY3VyaXR5IGNvbnRleHQgY2hlY2suCisgICAgICogPHA+CisgICAgICogQSBzY29wZSBsb29rIGxpa2U6CisgICAgICogPHVsPgorICAgICAqIDxsaT4mbHQ7ZnVsbHkgcXVhbGlmaWVkIGFubm90YXRpb24gY2xhc3MgbmFtZSZndDssIG9yPC9saT4KKyAgICAgKiA8bGk+Jmx0O2Z1bGx5IHF1YWxpZmllZCBhbm5vdGF0aW9uIGNsYXNzIG5hbWUmZ3Q7XyZsdDtyb2xlJmd0OzwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gc2VjdXJpdHlDb250ZXh0IHNlY3VyaXR5IGNvbnRleHQgdG8gY2hlY2sgd2hldGhlciBhIHVzZXIgaXMgaW4gc3BlY2lmaWVkIGxvZ2ljYWwgcm9sZS4KKyAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbnMgYSBsaXN0IG9mIGFubm90YXRpb25zIChkb2Vzbid0IG5lZWQgdG8gY29udGFpbiBvbmx5IHNlY3VyaXR5IGFubm90YXRpb25zKQorICAgICAqIEByZXR1cm4gYSBzZXQgb2YgZW50aXR5LWZpbHRlcmluZyBzY29wZXMuCisgICAgICovCisgICAgc3RhdGljIFNldDxTdHJpbmc+IGdldEZpbHRlcmluZ1Njb3BlcyhmaW5hbCBTZWN1cml0eUNvbnRleHQgc2VjdXJpdHlDb250ZXh0LCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgaWYgKGFubm90YXRpb25zLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoZmluYWwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgUm9sZXNBbGxvd2VkKSB7CisgICAgICAgICAgICAgICAgZmluYWwgU2V0PFN0cmluZz4gYmluZGluZ3MgPSBuZXcgSGFzaFNldDw+KCk7CisKKyAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyByb2xlIDogKChSb2xlc0FsbG93ZWQpIGFubm90YXRpb24pLnZhbHVlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlY3VyaXR5Q29udGV4dCA9PSBudWxsIHx8IHNlY3VyaXR5Q29udGV4dC5pc1VzZXJJblJvbGUocm9sZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRpbmdzLmFkZChnZXRSb2xlc0FsbG93ZWRTY29wZShyb2xlKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gYmluZGluZ3M7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBQZXJtaXRBbGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRmlsdGVyaW5nSGVscGVyLmdldERlZmF1bHRGaWx0ZXJpbmdTY29wZSgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgRGVueUFsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGVudGl0eS1maWx0ZXJpbmcgc2NvcGUgZm9yIHtAbGluayBSb2xlc0FsbG93ZWR9cyByb2xlLgorICAgICAqCisgICAgICogQHBhcmFtIHJvbGUgcm9sZSB0byByZXRyaWV2ZSBlbnRpdHktZmlsdGVyaW5nIHNjb3BlIGZvci4KKyAgICAgKiBAcmV0dXJuIGVudGl0eS1maWx0ZXJpbmcgc2NvcGUuCisgICAgICovCisgICAgc3RhdGljIFN0cmluZyBnZXRSb2xlc0FsbG93ZWRTY29wZShmaW5hbCBTdHJpbmcgcm9sZSkgeworICAgICAgICByb2xlcy5hZGQocm9sZSk7CisgICAgICAgIHJldHVybiBSb2xlc0FsbG93ZWQuY2xhc3MuZ2V0TmFtZSgpICsgIl8iICsgcm9sZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYXV0aG9yaXphdGlvbiByb2xlcyB0aGF0IGhhcyBiZWVuIGRlcml2ZWQgZnJvbSBleGFtaW5pbmcgZW50aXR5IGNsYXNzZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFscmVhZHkgcHJvY2Vzc2VkIGF1dGhvcml6YXRpb24gcm9sZXMuCisgICAgICovCisgICAgc3RhdGljIFNldDxTdHJpbmc+IGdldFByb2Nlc3NlZFJvbGVzKCkgeworICAgICAgICByZXR1cm4gcm9sZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJldmVudCBpbnN0YW50aWF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgU2VjdXJpdHlIZWxwZXIoKSB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9TZWN1cml0eVNjb3BlUmVzb2x2ZXIuamF2YSBiL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvU2VjdXJpdHlTY29wZVJlc29sdmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk2ZDJlMwotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvU2VjdXJpdHlTY29wZVJlc29sdmVyLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZzsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5zcGkuU2NvcGVSZXNvbHZlcjsKKworLyoqCisgKiB7QGxpbmsgU2NvcGVSZXNvbHZlciBzY29wZSBwcm92aWRlcn0gcmVzb2x2aW5nIGVudGl0eS1maWx0ZXJpbmcgc2NvcGVzIGZyb20gc2VjdXJpdHkgYW5ub3RhdGlvbnMuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BTaW5nbGV0b24KK2ZpbmFsIGNsYXNzIFNlY3VyaXR5U2NvcGVSZXNvbHZlciBpbXBsZW1lbnRzIFNjb3BlUmVzb2x2ZXIgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxTdHJpbmc+IHJlc29sdmUoZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zKSB7CisgICAgICAgIHJldHVybiBTZWN1cml0eUhlbHBlci5nZXRGaWx0ZXJpbmdTY29wZXMoYW5ub3RhdGlvbnMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvU2VjdXJpdHlTZXJ2ZXJTY29wZVByb3ZpZGVyLmphdmEgYi9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL1NlY3VyaXR5U2VydmVyU2NvcGVQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZTA0NDQKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL1NlY3VyaXR5U2VydmVyU2NvcGVQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmc7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdHJhaW5lZFRvOworaW1wb3J0IGphdmF4LndzLnJzLlJ1bnRpbWVUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5TZWN1cml0eUNvbnRleHQ7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFNpbmdsZXRvbgorQENvbnN0cmFpbmVkVG8oUnVudGltZVR5cGUuU0VSVkVSKQorZmluYWwgY2xhc3MgU2VjdXJpdHlTZXJ2ZXJTY29wZVByb3ZpZGVyIGV4dGVuZHMgU2VydmVyU2NvcGVQcm92aWRlciB7CisKKyAgICBAQ29udGV4dAorICAgIHByaXZhdGUgU2VjdXJpdHlDb250ZXh0IHNlY3VyaXR5Q29udGV4dDsKKworICAgIEBJbmplY3QKKyAgICBwdWJsaWMgU2VjdXJpdHlTZXJ2ZXJTY29wZVByb3ZpZGVyKGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlnLCBmaW5hbCBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIpIHsKKyAgICAgICAgc3VwZXIoY29uZmlnLCBpbmplY3Rpb25NYW5hZ2VyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0RmlsdGVyaW5nU2NvcGVzKGZpbmFsIEFubm90YXRpb25bXSBlbnRpdHlBbm5vdGF0aW9ucywgZmluYWwgYm9vbGVhbiBkZWZhdWx0SWZOb3RGb3VuZCkgeworICAgICAgICBTZXQ8U3RyaW5nPiBmaWx0ZXJpbmdTY29wZSA9IHN1cGVyLmdldEZpbHRlcmluZ1Njb3BlcyhlbnRpdHlBbm5vdGF0aW9ucywgZmFsc2UpOworCisgICAgICAgIGlmIChmaWx0ZXJpbmdTY29wZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGZpbHRlcmluZ1Njb3BlID0gbmV3IEhhc2hTZXQ8PigpOworCisgICAgICAgICAgICAvLyBHZXQgYWxsIHJvbGVzIGNvbGxlY3RlZCBmcm9tIGVudGl0aWVzIGFuZCBjaGVjayB3aXRoIGN1cnJlbnQgc2VjdXJpdHkgY29udGV4dC4KKyAgICAgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIHJvbGUgOiBTZWN1cml0eUhlbHBlci5nZXRQcm9jZXNzZWRSb2xlcygpKSB7CisgICAgICAgICAgICAgICAgaWYgKHNlY3VyaXR5Q29udGV4dC5pc1VzZXJJblJvbGUocm9sZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyaW5nU2NvcGUuYWRkKFNlY3VyaXR5SGVscGVyLmdldFJvbGVzQWxsb3dlZFNjb3BlKHJvbGUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBVc2UgZGVmYXVsdCBzY29wZSBpZiBub3QgaW4gb3RoZXIgc2NvcGUuCisgICAgICAgIHJldHVybiByZXR1cm5GaWx0ZXJpbmdTY29wZXMoZmlsdGVyaW5nU2NvcGUsIGRlZmF1bHRJZk5vdEZvdW5kKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL1NlY3VyaXR5U2VydmVyU2NvcGVSZXNvbHZlci5qYXZhIGIvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9TZWN1cml0eVNlcnZlclNjb3BlUmVzb2x2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTA0ZGU1Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9TZWN1cml0eVNlcnZlclNjb3BlUmVzb2x2ZXIuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3RyYWluZWRUbzsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcmlvcml0aWVzOworaW1wb3J0IGphdmF4LndzLnJzLlJ1bnRpbWVUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlNlY3VyaXR5Q29udGV4dDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJpb3JpdHk7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLnNwaS5TY29wZVJlc29sdmVyOworCisvKioKKyAqIFNlcnZlci1zaWRlIHtAbGluayBTY29wZVJlc29sdmVyIHNjb3BlIHByb3ZpZGVyfSByZXNvbHZpbmcgZW50aXR5LWZpbHRlcmluZyBzY29wZXMgZnJvbSBzZWN1cml0eSBhbm5vdGF0aW9ucworICogd2l0aCByZXNwZWN0IHRvIHVzZXIncyByb2xlcyBkZWZpbmVkIGluIHtAbGluayBTZWN1cml0eUNvbnRleHR9LgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAU2luZ2xldG9uCitAUHJpb3JpdHkoUHJpb3JpdGllcy5FTlRJVFlfQ09ERVIgKyAxMDApCitAQ29uc3RyYWluZWRUbyhSdW50aW1lVHlwZS5TRVJWRVIpCitmaW5hbCBjbGFzcyBTZWN1cml0eVNlcnZlclNjb3BlUmVzb2x2ZXIgaW1wbGVtZW50cyBTY29wZVJlc29sdmVyIHsKKworICAgIEBDb250ZXh0CisgICAgcHJpdmF0ZSBTZWN1cml0eUNvbnRleHQgc2VjdXJpdHlDb250ZXh0OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxTdHJpbmc+IHJlc29sdmUoZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zKSB7CisgICAgICAgIHJldHVybiBTZWN1cml0eUhlbHBlci5nZXRGaWx0ZXJpbmdTY29wZXMoc2VjdXJpdHlDb250ZXh0LCBhbm5vdGF0aW9ucyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9TZWxlY3RhYmxlRW50aXR5RmlsdGVyaW5nRmVhdHVyZS5qYXZhIGIvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9TZWxlY3RhYmxlRW50aXR5RmlsdGVyaW5nRmVhdHVyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4OWJlYTEKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL1NlbGVjdGFibGVFbnRpdHlGaWx0ZXJpbmdGZWF0dXJlLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZzsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlQ29udGV4dDsKKworLyoqCisgKiB7QGxpbmsgRmVhdHVyZX0gdXNlZCB0byBhZGQgc3VwcG9ydCBmb3IgY3VzdG9tIHF1ZXJ5IHBhcmFtZXRlciBmaWx0ZXJpbmcgZm9yCisgKiBFbnRpdHkgRGF0YSBGaWx0ZXJpbmcgZmVhdHVyZS4gPC9wPiBOb3RlOiBUaGlzIGZlYXR1cmUgYWxzbyByZWdpc3RlcnMgdGhlCisgKiB7QGxpbmsgRW50aXR5RmlsdGVyaW5nRmVhdHVyZX0uCisgKgorICogQGF1dGhvciBBbmR5IFBlbWJlcnRvbiAocGVtYmVydG9uYSBhdCBnbWFpbC5jb20pCisgKiBAc2VlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLkVudGl0eUZpbHRlcmluZ0ZlYXR1cmUKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFNlbGVjdGFibGVFbnRpdHlGaWx0ZXJpbmdGZWF0dXJlIGltcGxlbWVudHMgRmVhdHVyZSB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWV9QQVJBTV9OQU1FID0gImplcnNleS5jb25maWcuZW50aXR5RmlsdGVyaW5nLnNlbGVjdGFibGUucXVlcnkiOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlKGZpbmFsIEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWcgPSBjb250ZXh0LmdldENvbmZpZ3VyYXRpb24oKTsKKworICAgICAgICBpZiAoIWNvbmZpZy5pc1JlZ2lzdGVyZWQoU2VsZWN0YWJsZUVudGl0eVByb2Nlc3Nvci5jbGFzcykpIHsKKworICAgICAgICAgICAgLy8gcmVnaXN0ZXIgRW50aXR5RmlsdGVyaW5nRmVhdHVyZQorICAgICAgICAgICAgaWYgKCFjb25maWcuaXNSZWdpc3RlcmVkKEVudGl0eUZpbHRlcmluZ0ZlYXR1cmUuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihFbnRpdHlGaWx0ZXJpbmdGZWF0dXJlLmNsYXNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEVudGl0eSBQcm9jZXNzb3JzLgorICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihTZWxlY3RhYmxlRW50aXR5UHJvY2Vzc29yLmNsYXNzKTsKKyAgICAgICAgICAgIC8vIFNjb3BlIFJlc29sdmVyLgorICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihTZWxlY3RhYmxlU2NvcGVSZXNvbHZlci5jbGFzcyk7CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvU2VsZWN0YWJsZUVudGl0eVByb2Nlc3Nvci5qYXZhIGIvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9TZWxlY3RhYmxlRW50aXR5UHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY0NzhhNgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvU2VsZWN0YWJsZUVudGl0eVByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmc7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5OworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5zcGkuQWJzdHJhY3RFbnRpdHlQcm9jZXNzb3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuc3BpLkVudGl0eUdyYXBoOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLnNwaS5FbnRpdHlQcm9jZXNzb3I7CisKK0BTaW5nbGV0b24KK0BQcmlvcml0eShJbnRlZ2VyLk1BWF9WQUxVRSAtIDUwMDApCitwdWJsaWMgY2xhc3MgU2VsZWN0YWJsZUVudGl0eVByb2Nlc3NvciBleHRlbmRzIEFic3RyYWN0RW50aXR5UHJvY2Vzc29yIHsKKworICAgIHByb3RlY3RlZCBSZXN1bHQgcHJvY2VzcyhmaW5hbCBTdHJpbmcgZmllbGROYW1lLCBmaW5hbCBDbGFzczw/PiBmaWVsZENsYXNzLCBmaW5hbCBBbm5vdGF0aW9uW10gZmllbGRBbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBmaW5hbCBFbnRpdHlHcmFwaCBncmFwaCkgeworCisgICAgICAgIGlmIChmaWVsZE5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgU2V0PFN0cmluZz4gc2NvcGVzID0gbmV3IEhhc2hTZXQ8PigpOworCisgICAgICAgICAgICAvLyBhZGQgZGVmYXVsdCBzZWxlY3RhYmxlIHNjb3BlIGluIGNhc2Ugb2Ygbm9uZSByZXF1ZXN0ZWQKKyAgICAgICAgICAgIHNjb3Blcy5hZGQoU2VsZWN0YWJsZVNjb3BlUmVzb2x2ZXIuREVGQVVMVF9TQ09QRSk7CisKKyAgICAgICAgICAgIC8vIGFkZCBzcGVjaWZpYyBzY29wZSBpbiBjYXNlIG9mIHNwZWNpZmljIHJlcXVlc3QKKyAgICAgICAgICAgIHNjb3Blcy5hZGQoU2VsZWN0YWJsZVNjb3BlUmVzb2x2ZXIuUFJFRklYICsgZmllbGROYW1lKTsKKworICAgICAgICAgICAgYWRkRmlsdGVyaW5nU2NvcGVzKGZpZWxkTmFtZSwgZmllbGRDbGFzcywgc2NvcGVzLCBncmFwaCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gRW50aXR5UHJvY2Vzc29yLlJlc3VsdC5BUFBMWTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvU2VsZWN0YWJsZVNjb3BlUmVzb2x2ZXIuamF2YSBiL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvU2VsZWN0YWJsZVNjb3BlUmVzb2x2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTIyYWZiCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9TZWxlY3RhYmxlU2NvcGVSZXNvbHZlci5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmc7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUG9zdENvbnN0cnVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5Ub2tlbml6ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuc3BpLlNjb3BlUmVzb2x2ZXI7CisKK0BTaW5nbGV0b24KK3B1YmxpYyBjbGFzcyBTZWxlY3RhYmxlU2NvcGVSZXNvbHZlciBpbXBsZW1lbnRzIFNjb3BlUmVzb2x2ZXIgeworCisgICAgLyoqCisgICAgICogUHJlZml4IGZvciBhbGwgc2VsZWN0YWJsZSBzY29wZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVggPSBTZWxlY3RhYmxlU2NvcGVSZXNvbHZlci5jbGFzcy5nZXROYW1lKCkgKyAiXyI7CisKKyAgICAvKioKKyAgICAgKiBTY29wZSB1c2VkIGZvciBzZWxlY3RpbmcgYWxsIGZpZWxkcywgaS5lLjogd2hlbiBubyBmaWx0ZXIgaXMgYXBwbGllZAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfU0NPUEUgPSBQUkVGSVggKyAiKiI7CisKKyAgICAvKioKKyAgICAgKiBRdWVyeSBwYXJhbWV0ZXIgbmFtZSBmb3Igc2VsZWN0YWJsZSBmZWF0dXJlLCBzZXQgdG8gZGVmYXVsdCB2YWx1ZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBTRUxFQ1RBQkxFX1BBUkFNX05BTUUgPSAic2VsZWN0IjsKKworICAgIEBDb250ZXh0CisgICAgcHJpdmF0ZSBDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb247CisKKyAgICBAQ29udGV4dAorICAgIHByaXZhdGUgVXJpSW5mbyB1cmlJbmZvOworCisgICAgQFBvc3RDb25zdHJ1Y3QKKyAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHBhcmFtTmFtZSA9IChTdHJpbmcpIGNvbmZpZ3VyYXRpb24uZ2V0UHJvcGVydHkoU2VsZWN0YWJsZUVudGl0eUZpbHRlcmluZ0ZlYXR1cmUuUVVFUllfUEFSQU1fTkFNRSk7CisgICAgICAgIFNFTEVDVEFCTEVfUEFSQU1fTkFNRSA9IHBhcmFtTmFtZSAhPSBudWxsID8gcGFyYW1OYW1lIDogU0VMRUNUQUJMRV9QQVJBTV9OQU1FOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiByZXNvbHZlKGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucykgeworICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiBzY29wZXMgPSBuZXcgSGFzaFNldDw+KCk7CisKKyAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGZpZWxkcyA9IHVyaUluZm8uZ2V0UXVlcnlQYXJhbWV0ZXJzKCkuZ2V0KFNFTEVDVEFCTEVfUEFSQU1fTkFNRSk7CisgICAgICAgIGlmIChmaWVsZHMgIT0gbnVsbCAmJiAhZmllbGRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgZmllbGQgOiBmaWVsZHMpIHsKKyAgICAgICAgICAgICAgICBzY29wZXMuYWRkQWxsKGdldFNjb3Blc0ZvckZpZWxkKGZpZWxkKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzY29wZXMuYWRkKERFRkFVTFRfU0NPUEUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzY29wZXM7CisgICAgfQorCisgICAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiBnZXRTY29wZXNGb3JGaWVsZChmaW5hbCBTdHJpbmcgZmllbGROYW1lKSB7CisgICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IHNjb3BlcyA9IG5ldyBIYXNoU2V0PD4oKTsKKworICAgICAgICAvLyBhZGQgc3BlY2lmaWMgc2NvcGUgaW4gY2FzZSBvZiBzcGVjaWZpYyByZXF1ZXN0CisgICAgICAgIGZpbmFsIFN0cmluZ1tdIGZpZWxkcyA9IFRva2VuaXplci50b2tlbml6ZShmaWVsZE5hbWUsICIsIik7CisgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIGZpZWxkIDogZmllbGRzKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBzdWJmaWVsZHMgPSBUb2tlbml6ZXIudG9rZW5pemUoZmllbGQsICIuIik7CisgICAgICAgICAgICAvLyBpbiBjYXNlIG9mIG5lc3RlZCBwYXRoLCBhZGQgZmlyc3QgbGV2ZWwgYXMgc3RhbmQtYWxvbmUgdG8gZW5zdXJlIHN1YmdyYXBoIGlzIGFkZGVkCisgICAgICAgICAgICBzY29wZXMuYWRkKFNlbGVjdGFibGVTY29wZVJlc29sdmVyLlBSRUZJWCArIHN1YmZpZWxkc1swXSk7CisgICAgICAgICAgICBpZiAoc3ViZmllbGRzLmxlbmd0aCA+IDEpIHsKKyAgICAgICAgICAgICAgICBzY29wZXMuYWRkKFNlbGVjdGFibGVTY29wZVJlc29sdmVyLlBSRUZJWCArIGZpZWxkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzY29wZXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9TZXJ2ZXJTY29wZVByb3ZpZGVyLmphdmEgYi9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL1NlcnZlclNjb3BlUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzIzMTdiCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9TZXJ2ZXJTY29wZVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmc7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudE1hcDsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN0cmFpbmVkVG87CitpbXBvcnQgamF2YXgud3MucnMuUHJpb3JpdGllczsKK2ltcG9ydCBqYXZheC53cy5ycy5SdW50aW1lVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5OworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uRGF0YVN0cnVjdHVyZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkV4dGVuZGVkVXJpSW5mbzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuSW52b2NhYmxlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1ldGhvZDsKKworLyoqCisgKiBTZXJ2ZXItc2lkZSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuc3BpLlNjb3BlUHJvdmlkZXIgc2NvcGUgcHJvdmlkZXJ9LiBJbiBhZGRpdGlvbiB0bworICoge0BsaW5rIENvbW1vblNjb3BlUHJvdmlkZXIgYmFzZSBpbXBsZW1lbnRhdGlvbn0gdGhpcyBjbGFzcyBwcm92aWRlcyBlbnRpdHktZmlsdGVyaW5nIHNjb3BlcyBieSBleGFtaW5pbmcgbWF0Y2hlZCByZXNvdXJjZQorICogbWV0aG9kIGFuZCBzdWItcmVzb3VyY2UgbG9jYXRvcnMuIFRoaXMgZXhhbWluYXRpb24gY29tZXMgaW50byBwbGF5IG9ubHkgaW4gY2FzZSBpZiBlbnRpdHktZmlsdGVyaW5nIHNjb3BlcyBjYW5ub3QgYmUgZm91bmQgaW4KKyAqIGVudGl0eSBhbm5vdGF0aW9ucyBvciBhcHBsaWNhdGlvbiBjb25maWd1cmF0aW9uLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAU2luZ2xldG9uCitAUHJpb3JpdHkoUHJpb3JpdGllcy5FTlRJVFlfQ09ERVIgKyAyMDApCitAQ29uc3RyYWluZWRUbyhSdW50aW1lVHlwZS5TRVJWRVIpCitjbGFzcyBTZXJ2ZXJTY29wZVByb3ZpZGVyIGV4dGVuZHMgQ29tbW9uU2NvcGVQcm92aWRlciB7CisKKyAgICBASW5qZWN0CisgICAgcHJpdmF0ZSBQcm92aWRlcjxFeHRlbmRlZFVyaUluZm8+IHVyaUluZm9Qcm92aWRlcjsKKworICAgIHByaXZhdGUgZmluYWwgQ29uY3VycmVudE1hcDxTdHJpbmcsIFNldDxTdHJpbmc+PiB1cmlUb0NvbnRleHRzOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyBzZXJ2ZXIgc2NvcGUgcHJvdmlkZXIgd2l0aCBpbmplY3RlZCB7QGxpbmsgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9ufSBhbmQKKyAgICAgKiB7QGxpbmsgSW5qZWN0aW9uTWFuYWdlciBqZXJzZXkgaW5qZWN0aW9uIG1hbmFnZXJ9LgorICAgICAqLworICAgIEBJbmplY3QKKyAgICBwdWJsaWMgU2VydmVyU2NvcGVQcm92aWRlcihmaW5hbCBDb25maWd1cmF0aW9uIGNvbmZpZywgZmluYWwgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyKSB7CisgICAgICAgIHN1cGVyKGNvbmZpZywgaW5qZWN0aW9uTWFuYWdlcik7CisgICAgICAgIHRoaXMudXJpVG9Db250ZXh0cyA9IERhdGFTdHJ1Y3R1cmVzLmNyZWF0ZUNvbmN1cnJlbnRNYXAoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0RmlsdGVyaW5nU2NvcGVzKGZpbmFsIEFubm90YXRpb25bXSBlbnRpdHlBbm5vdGF0aW9ucywgZmluYWwgYm9vbGVhbiBkZWZhdWx0SWZOb3RGb3VuZCkgeworICAgICAgICBTZXQ8U3RyaW5nPiBmaWx0ZXJpbmdTY29wZSA9IHN1cGVyLmdldEZpbHRlcmluZ1Njb3BlcyhlbnRpdHlBbm5vdGF0aW9ucywgZmFsc2UpOworCisgICAgICAgIGlmIChmaWx0ZXJpbmdTY29wZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGZpbmFsIEV4dGVuZGVkVXJpSW5mbyB1cmlJbmZvID0gdXJpSW5mb1Byb3ZpZGVyLmdldCgpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBhdGggPSB1cmlJbmZvLmdldFBhdGgoKTsKKworICAgICAgICAgICAgaWYgKHVyaVRvQ29udGV4dHMuY29udGFpbnNLZXkocGF0aCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdXJpVG9Db250ZXh0cy5nZXQocGF0aCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoZmluYWwgUmVzb3VyY2VNZXRob2QgbWV0aG9kIDogU2VydmVyU2NvcGVQcm92aWRlci5nZXRNYXRjaGVkTWV0aG9kcyh1cmlJbmZvKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIEludm9jYWJsZSBpbnZvY2FibGUgPSBtZXRob2QuZ2V0SW52b2NhYmxlKCk7CisKKyAgICAgICAgICAgICAgICBtZXJnZUZpbHRlcmluZ1Njb3BlcyhmaWx0ZXJpbmdTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEZpbHRlcmluZ1Njb3BlcyhpbnZvY2FibGUuZ2V0SGFuZGxpbmdNZXRob2QoKSwgaW52b2NhYmxlLmdldEhhbmRsZXIoKS5nZXRIYW5kbGVyQ2xhc3MoKSkpOworCisgICAgICAgICAgICAgICAgaWYgKCFmaWx0ZXJpbmdTY29wZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdXJpVG9Db250ZXh0cy5wdXRJZkFic2VudChwYXRoLCBmaWx0ZXJpbmdTY29wZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWx0ZXJpbmdTY29wZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBVc2UgZGVmYXVsdCBzY29wZSBpZiBub3QgaW4gb3RoZXIgc2NvcGUuCisgICAgICAgIHJldHVybiByZXR1cm5GaWx0ZXJpbmdTY29wZXMoZmlsdGVyaW5nU2NvcGUsIGRlZmF1bHRJZk5vdEZvdW5kKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgZW50aXR5LWZpbHRlcmluZyBzY29wZXMgZnJvbSBleGFtaW5pbmcgYW5ub3RhdGlvbnMgcHJlc2VudCBvbiByZXNvdXJjZSBtZXRob2QgYW5kIHJlc291cmNlIGNsYXNzLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlTWV0aG9kIG1hdGNoZWQgcmVzb3VyY2UgbWV0aG9kIHRvIGJlIGV4YW1pbmVkLgorICAgICAqIEBwYXJhbSByZXNvdXJjZUNsYXNzIG1hdGNoZWQgcmVzb3VyY2UgY2xhc3MgdG8gYmUgZXhhbWluZWQuCisgICAgICogQHJldHVybiBlbnRpdHktZmlsdGVyaW5nIHNjb3BlcyBvciBhbiBlbXB0eSBzZXQgaWYgdGhlIHNjb3BlcyBjYW5ub3QgYmUgb2J0YWluZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFNldDxTdHJpbmc+IGdldEZpbHRlcmluZ1Njb3BlcyhmaW5hbCBNZXRob2QgcmVzb3VyY2VNZXRob2QsIGZpbmFsIENsYXNzPD8+IHJlc291cmNlQ2xhc3MpIHsKKyAgICAgICAgLy8gTWV0aG9kIGFubm90YXRpb25zIGZpcnN0LgorICAgICAgICBTZXQ8U3RyaW5nPiBzY29wZSA9IGdldEZpbHRlcmluZ1Njb3BlcyhyZXNvdXJjZU1ldGhvZC5nZXRBbm5vdGF0aW9ucygpKTsKKworICAgICAgICAvLyBDbGFzcyBhbm5vdGF0aW9ucyBzZWNvbmQuCisgICAgICAgIGlmIChzY29wZS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHNjb3BlID0gZ2V0RmlsdGVyaW5nU2NvcGVzKHJlc291cmNlQ2xhc3MuZ2V0QW5ub3RhdGlvbnMoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc2NvcGU7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxSZXNvdXJjZU1ldGhvZD4gZ2V0TWF0Y2hlZE1ldGhvZHMoZmluYWwgRXh0ZW5kZWRVcmlJbmZvIHVyaUluZm8pIHsKKyAgICAgICAgZmluYWwgTGlzdDxSZXNvdXJjZU1ldGhvZD4gbWF0Y2hlZFJlc291cmNlTG9jYXRvcnMgPSB1cmlJbmZvLmdldE1hdGNoZWRSZXNvdXJjZUxvY2F0b3JzKCk7CisgICAgICAgIGZpbmFsIExpc3Q8UmVzb3VyY2VNZXRob2Q+IG1ldGhvZHMgPSBuZXcgQXJyYXlMaXN0PD4oMSArIG1hdGNoZWRSZXNvdXJjZUxvY2F0b3JzLnNpemUoKSk7CisKKyAgICAgICAgbWV0aG9kcy5hZGQodXJpSW5mby5nZXRNYXRjaGVkUmVzb3VyY2VNZXRob2QoKSk7CisgICAgICAgIG1ldGhvZHMuYWRkQWxsKG1hdGNoZWRSZXNvdXJjZUxvY2F0b3JzKTsKKworICAgICAgICByZXR1cm4gbWV0aG9kczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL3BhY2thZ2UtaW5mby5qYXZhIGIvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzQxYjQzCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvKioKKyAqIFN1cHBvcnQgZm9yIEVudGl0eSBEYXRhIEZpbHRlcmluZyBpbiBKZXJzZXkuCisgKiA8cC8+CisgKiBUbyB1c2UgRW50aXR5IERhdGEgRmlsdGVyaW5nIG9uZSBvZiB0aGUgcHJvdmlkZWQge0BsaW5rIGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZSBmZWF0dXJlc30gaGFzIHRvIGJlIHJlZ2lzdGVyZWQgaW4gYW4KKyAqIGFwcGxpY2F0aW9uOgorICogPHVsPgorICogICAgIDxsaT57QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuRW50aXR5RmlsdGVyaW5nRmVhdHVyZX0gLSBhZGRzIHN1cHBvcnQgZm9yIGVudGl0eS1maWx0ZXJpbmcKKyAqICAgICBhbm5vdGF0aW9ucyBiYXNlZCBvbiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuRW50aXR5RmlsdGVyaW5nfSBtZXRhLWFubm90YXRpb24uPC9saT4KKyAqICAgICA8bGk+e0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLlNlY3VyaXR5RW50aXR5RmlsdGVyaW5nRmVhdHVyZX0gLSBhZGQgc3VwcG9ydCBmb3IgZW50aXR5LWZpbHRlcmluZyB1c2luZworICogICAgIEphdmEgU2VjdXJpdHkgYW5ub3RhdGlvbnMgKDxjb2RlPmphdmF4LmFubm90YXRpb24uc2VjdXJpdHk8L2NvZGU+KS48L2xpPgorICogPC91bD4KKyAqIDxwLz4KKyAqIFRvIGRlZmluZSBvd24gZW50aXR5LWZpbHRlcmluZyBhbm5vdGF0aW9ucywgcmVmZXIgdG8gdGhlIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5FbnRpdHlGaWx0ZXJpbmd9CisgKiBtZXRhLWFubm90YXRpb24uCisgKgorICogQHNpbmNlIDIuMworICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nOwpkaWZmIC0tZ2l0IGEvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9zcGkvQWJzdHJhY3RFbnRpdHlQcm9jZXNzb3IuamF2YSBiL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvc3BpL0Fic3RyYWN0RW50aXR5UHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ4NjExNAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvc3BpL0Fic3RyYWN0RW50aXR5UHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuc3BpOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BY2Nlc3NpYmxlT2JqZWN0OworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlJlZmxlY3Rpb25IZWxwZXI7CisKKy8qKgorICogQ29tbW9uIHtAbGluayBFbnRpdHlQcm9jZXNzb3IgZW50aXR5IHByb2Nlc3Nvcn0gc3VwcG9zZWQgdG8gYmUgdXNlZCBhcyBhIGJhc2UgY2xhc3MgZm9yIGN1c3RvbSBpbXBsZW1lbnRhdGlvbnMuIFByb3ZpZGVzCisgKiBjb252ZW5pZW50IG1ldGhvZHMgZm9yIGFkZGluZyBlbnRpdHktZmlsdGVyaW5nIHNjb3BlcyB0byB7QGxpbmsgRW50aXR5R3JhcGggZW50aXR5IGdyYXBofSBhcyB3ZWxsIGFzIGEgY29tbW9uIGltcGxlbWVudGF0aW9uCisgKiBvZiB7QGxpbmsgI3Byb2Nlc3Mob3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuc3BpLkVudGl0eVByb2Nlc3NvckNvbnRleHQpfS4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RW50aXR5UHJvY2Vzc29yIGltcGxlbWVudHMgRW50aXR5UHJvY2Vzc29yIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBFbnRpdHlQcm9jZXNzb3IuUmVzdWx0IHByb2Nlc3MoZmluYWwgRW50aXR5UHJvY2Vzc29yQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN3aXRjaCAoY29udGV4dC5nZXRUeXBlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgQ0xBU1NfUkVBREVSOgorICAgICAgICAgICAgY2FzZSBDTEFTU19XUklURVI6CisgICAgICAgICAgICAgICAgcmV0dXJuIHByb2Nlc3MobnVsbCwgbnVsbCwgRmlsdGVyaW5nSGVscGVyLkVNUFRZX0FOTk9UQVRJT05TLCBjb250ZXh0LmdldEVudGl0eUNsYXNzKCkuZ2V0RGVjbGFyZWRBbm5vdGF0aW9ucygpLAorICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5nZXRFbnRpdHlHcmFwaCgpKTsKKworICAgICAgICAgICAgY2FzZSBQUk9QRVJUWV9SRUFERVI6CisgICAgICAgICAgICBjYXNlIFBST1BFUlRZX1dSSVRFUjoKKyAgICAgICAgICAgIGNhc2UgTUVUSE9EX1JFQURFUjoKKyAgICAgICAgICAgIGNhc2UgTUVUSE9EX1dSSVRFUjoKKyAgICAgICAgICAgICAgICBmaW5hbCBGaWVsZCBmaWVsZCA9IGNvbnRleHQuZ2V0RmllbGQoKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBNZXRob2QgbWV0aG9kID0gY29udGV4dC5nZXRNZXRob2QoKTsKKworICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNQcm9wZXJ0eSA9IGZpZWxkICE9IG51bGw7CisgICAgICAgICAgICAgICAgU3RyaW5nIGZpZWxkTmFtZTsKKyAgICAgICAgICAgICAgICBUeXBlIGZpZWxkVHlwZTsKKworICAgICAgICAgICAgICAgIGlmIChpc1Byb3BlcnR5KSB7CisgICAgICAgICAgICAgICAgICAgIGZpZWxkTmFtZSA9IGZpZWxkLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgZmllbGRUeXBlID0gZmllbGQuZ2V0R2VuZXJpY1R5cGUoKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmaWVsZE5hbWUgPSBSZWZsZWN0aW9uSGVscGVyLmdldFByb3BlcnR5TmFtZShtZXRob2QpOworICAgICAgICAgICAgICAgICAgICBmaWVsZFR5cGUgPSBSZWZsZWN0aW9uSGVscGVyLmlzR2V0dGVyKG1ldGhvZCkgPyBtZXRob2QuZ2V0R2VuZXJpY1JldHVyblR5cGUoKSA6IG1ldGhvZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRHZW5lcmljUGFyYW1ldGVyVHlwZXMoKVswXTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gcHJvY2VzcyhmaWVsZE5hbWUsIEZpbHRlcmluZ0hlbHBlci5nZXRFbnRpdHlDbGFzcyhmaWVsZFR5cGUpLCBnZXRBbm5vdGF0aW9ucyhmaWVsZCksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRBbm5vdGF0aW9ucyhtZXRob2QpLCBjb250ZXh0LmdldEVudGl0eUdyYXBoKCkpOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIC8vIE5PT1AuCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEVudGl0eVByb2Nlc3Nvci5SZXN1bHQuU0tJUDsKKyAgICB9CisKKyAgICBwcml2YXRlIEFubm90YXRpb25bXSBnZXRBbm5vdGF0aW9ucyhmaW5hbCBBY2Nlc3NpYmxlT2JqZWN0IGFjY2Vzc2libGVPYmplY3QpIHsKKyAgICAgICAgcmV0dXJuIGFjY2Vzc2libGVPYmplY3QgPT0gbnVsbCA/IEZpbHRlcmluZ0hlbHBlci5FTVBUWV9BTk5PVEFUSU9OUyA6IGFjY2Vzc2libGVPYmplY3QuZ2V0RGVjbGFyZWRBbm5vdGF0aW9ucygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ldGhvZCBpcyBjYWxsZWQgZnJvbSB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZgorICAgICAqIHtAbGluayAjcHJvY2VzcyhvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5zcGkuRW50aXR5UHJvY2Vzc29yQ29udGV4dCl9IGFuZCBpcyBzdXBwb3NlZCB0byBiZSBvdmVycmlkZGVuIGJ5CisgICAgICogY3VzdG9tIGltcGxlbWVudGF0aW9ucyBvZiB0aGlzIGNsYXNzLgorICAgICAqCisgICAgICogQHBhcmFtIGZpZWxkTmFtZSBuYW1lIG9mIHRoZSBmaWVsZCAoY2FuIGJlIHtAY29kZSBudWxsfSkuCisgICAgICogQHBhcmFtIGZpZWxkQ2xhc3MgY2xhc3Mgb2YgdGhlIGZpZWxkIChjYW4gYmUge0Bjb2RlIG51bGx9KS4KKyAgICAgKiBAcGFyYW0gZmllbGRBbm5vdGF0aW9ucyBhbm5vdGF0aW9ucyBhc3NvY2lhdGVkIHdpdGggdGhlIGZpZWxkIChjYW5ub3QgYmUge0Bjb2RlIG51bGx9KS4KKyAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbnMgYW5ub3RhdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGNsYXNzL2FjY2Vzc29yIChjYW5ub3QgYmUge0Bjb2RlIG51bGx9KS4KKyAgICAgKiBAcGFyYW0gZ3JhcGggZW50aXR5IGdyYXBoIHRvIGJlIHByb2Nlc3NlZC4KKyAgICAgKiBAcmV0dXJuIHJlc3VsdCBvZiB0aGUgcHJvY2Vzc2luZyAoZGVmYXVsdCBpcyB7QGxpbmsgUmVzdWx0I1NLSVB9KS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUmVzdWx0IHByb2Nlc3MoZmluYWwgU3RyaW5nIGZpZWxkTmFtZSwgZmluYWwgQ2xhc3M8Pz4gZmllbGRDbGFzcywgZmluYWwgQW5ub3RhdGlvbltdIGZpZWxkQW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgZmluYWwgRW50aXR5R3JhcGggZ3JhcGgpIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdC5TS0lQOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBlbnRpdHktZmlsdGVyaW5nIHNjb3BlcyBvZiBhIGZpZWxkIHRvIGFuIGVudGl0eS1ncmFwaC4gVGhlIG1ldGhvZCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGZpZWxkIHNob3VsZCBiZSBhZGRlZCBhcyBhCisgICAgICogc2ltcGxlIGZpZWxkIG9yIGEgc3ViZ3JhcGguCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmllbGQgbmFtZSBvZiBhIGZpZWxkIHRvIGJlIGFkZGVkIHRvIHRoZSBncmFwaC4KKyAgICAgKiBAcGFyYW0gZmllbGRDbGFzcyBjbGFzcyBvZiB0aGUgZmllbGQuCisgICAgICogQHBhcmFtIGZpbHRlcmluZ1Njb3BlcyBlbnRpdHktZmlsdGVyaW5nIHNjb3BlcyB0aGUgZmllbGQgd2lsbCBiZSBhc3NvY2lhdGVkIHdpdGggaW4gdGhlIGdyYXBoLgorICAgICAqIEBwYXJhbSBncmFwaCBlbnRpdHkgZ3JhcGggdGhlIGZpZWxkIHdpbGwgYmUgYWRkZWQgdG8uCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgYWRkRmlsdGVyaW5nU2NvcGVzKGZpbmFsIFN0cmluZyBmaWVsZCwgZmluYWwgQ2xhc3M8Pz4gZmllbGRDbGFzcywgZmluYWwgU2V0PFN0cmluZz4gZmlsdGVyaW5nU2NvcGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBFbnRpdHlHcmFwaCBncmFwaCkgeworICAgICAgICBpZiAoIWZpbHRlcmluZ1Njb3Blcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGlmIChGaWx0ZXJpbmdIZWxwZXIuZmlsdGVyYWJsZUVudGl0eUNsYXNzKGZpZWxkQ2xhc3MpKSB7CisgICAgICAgICAgICAgICAgZ3JhcGguYWRkU3ViZ3JhcGgoZmllbGQsIGZpZWxkQ2xhc3MsIGZpbHRlcmluZ1Njb3Blcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGdyYXBoLmFkZEZpZWxkKGZpZWxkLCBmaWx0ZXJpbmdTY29wZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGVudGl0eS1maWx0ZXJpbmcgc2NvcGVzIGludG8gZ2l2ZW4gZ3JhcGguIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgb25seSBpbiBjbGFzcy1sZXZlbCBjb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIGZpbHRlcmluZ1Njb3BlcyBlbnRpdHktZmlsdGVyaW5nIHNjb3BlcyB0byBiZSBhZGRlZCB0byBncmFwaC4KKyAgICAgKiBAcGFyYW0gZ3JhcGggZW50aXR5IGdyYXBoIHRvIGJlIGVuaGFuY2VkIGJ5IG5ldyBzY29wZXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgYWRkR2xvYmFsU2NvcGVzKGZpbmFsIFNldDxTdHJpbmc+IGZpbHRlcmluZ1Njb3BlcywgZmluYWwgRW50aXR5R3JhcGggZ3JhcGgpIHsKKyAgICAgICAgZ3JhcGguYWRkRmlsdGVyaW5nU2NvcGVzKGZpbHRlcmluZ1Njb3Blcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9zcGkvQWJzdHJhY3RPYmplY3RQcm92aWRlci5qYXZhIGIvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9zcGkvQWJzdHJhY3RPYmplY3RQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0MTE4Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL3NwaS9BYnN0cmFjdE9iamVjdFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuc3BpOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Qcm94eTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmEuQ2FjaGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmEuQ2FjaGVCdWlsZGVyOworCisvKioKKyAqIENvbW1vbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgT2JqZWN0UHJvdmlkZXIgb2JqZWN0IHByb3ZpZGVyfSBhbmQge0BsaW5rIE9iamVjdEdyYXBoVHJhbnNmb3JtZXIgb2JqZWN0IGdyYXBoIHRyYW5zZm9ybWVyfS4KKyAqIDxwPgorICogRXh0ZW5zaW9ucyBvZiB0aGlzIGNsYXNzIG11c3QgcHJvdmlkZSBhIHR5cGUgb2YgZW50aXR5LWZpbHRlcmluZyBvYmplY3QgKHZpYSBnZW5lcmljIHR5cGUgcGFyYW1ldGVyKSB0aGUgcmVxdWVzdGluZyBwcm92aWRlcgorICogKGUuZy4gbWVzc2FnZSBib2R5IHdvcmtlcikgaXMgZmFtaWxpYXIgd2l0aCBhbmQgYW4gaW1wbGVtZW50YXRpb24gb2YKKyAqIHtAbGluayBPYmplY3RHcmFwaFRyYW5zZm9ybWVyI3RyYW5zZm9ybShPYmplY3RHcmFwaCl9IG1ldGhvZCBmb3IgdGhpcyB0eXBlLgorICogPC9wPgorICoKKyAqIEBwYXJhbSA8VD4gcmVwcmVzZW50YXRpb24gb2YgZW50aXR5IGRhdGEgZmlsdGVyaW5nIHJlcXVlc3RlZCBieSBwcm92aWRlci4KKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RPYmplY3RQcm92aWRlcjxUPiBpbXBsZW1lbnRzIE9iamVjdFByb3ZpZGVyPFQ+LCBPYmplY3RHcmFwaFRyYW5zZm9ybWVyPFQ+IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQUk9WSURFUl9DQUNIRV9TSVpFID0gMTAwMDsKKworICAgIHByaXZhdGUgZmluYWwgQ2FjaGU8RW50aXR5Q29udGV4dCwgVD4gZmlsdGVyaW5nT2JqZWN0cyA9IENhY2hlQnVpbGRlci5uZXdCdWlsZGVyKCkubWF4aW11bVNpemUoUFJPVklERVJfQ0FDSEVfU0laRSkuYnVpbGQoKTsKKworICAgIEBJbmplY3QKKyAgICBwcml2YXRlIFNjb3BlUHJvdmlkZXIgc2NvcGVQcm92aWRlcjsKKworICAgIEBJbmplY3QKKyAgICBwcml2YXRlIEVudGl0eUluc3BlY3RvciBlbnRpdHlJbnNwZWN0b3I7CisKKyAgICBASW5qZWN0CisgICAgcHJpdmF0ZSBFbnRpdHlHcmFwaFByb3ZpZGVyIGdyYXBoUHJvdmlkZXI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgVCBnZXRGaWx0ZXJpbmdPYmplY3QoZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgYm9vbGVhbiBmb3JXcml0ZXIsIGZpbmFsIEFubm90YXRpb24uLi4gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgcmV0dXJuIGdldEZpbHRlcmluZ09iamVjdChGaWx0ZXJpbmdIZWxwZXIuZ2V0RW50aXR5Q2xhc3MoZ2VuZXJpY1R5cGUpLCBmb3JXcml0ZXIsIGFubm90YXRpb25zKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFQgZ2V0RmlsdGVyaW5nT2JqZWN0KGZpbmFsIENsYXNzPD8+IGVudGl0eUNsYXNzLCBmaW5hbCBib29sZWFuIGZvcldyaXRlciwgZmluYWwgQW5ub3RhdGlvbi4uLiBhbm5vdGF0aW9ucykgeworICAgICAgICBpZiAoRmlsdGVyaW5nSGVscGVyLmZpbHRlcmFibGVFbnRpdHlDbGFzcyhlbnRpdHlDbGFzcykpIHsKKyAgICAgICAgICAgIC8vIEluc3BlY3QuCisgICAgICAgICAgICBlbnRpdHlJbnNwZWN0b3IuaW5zcGVjdChlbnRpdHlDbGFzcywgZm9yV3JpdGVyKTsKKworICAgICAgICAgICAgLy8gT2J0YWluIHJ1bnRpbWUvcmVzb3VyY2Ugc2NvcGUuCisgICAgICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiBmaWx0ZXJpbmdTY29wZSA9IHNjb3BlUHJvdmlkZXIuZ2V0RmlsdGVyaW5nU2NvcGVzKGdldEVudGl0eUFubm90YXRpb25zKGFubm90YXRpb25zKSwgdHJ1ZSk7CisKKyAgICAgICAgICAgIC8vIExvb2sgaW50byB0aGUgY2FjaGUuCisgICAgICAgICAgICBmaW5hbCBFbnRpdHlDb250ZXh0IGVudGl0eUNvbnRleHQgPSBuZXcgRW50aXR5Q29udGV4dChlbnRpdHlDbGFzcywgZmlsdGVyaW5nU2NvcGUpOworICAgICAgICAgICAgVCBmaWx0ZXJpbmdPYmplY3QgPSBmaWx0ZXJpbmdPYmplY3RzLmdldElmUHJlc2VudChlbnRpdHlDb250ZXh0KTsKKworICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyBpZiBub3QgYXZhaWxhYmxlLgorICAgICAgICAgICAgaWYgKGZpbHRlcmluZ09iamVjdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmlsdGVyaW5nT2JqZWN0ID0gY3JlYXRlRmlsdGVyaW5nT2JqZWN0KGVudGl0eUNsYXNzLCBmaWx0ZXJpbmdTY29wZSwgZm9yV3JpdGVyKTsKKyAgICAgICAgICAgICAgICBmaWx0ZXJpbmdPYmplY3RzLnB1dChlbnRpdHlDb250ZXh0LCBmaWx0ZXJpbmdPYmplY3QpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZmlsdGVyaW5nT2JqZWN0OworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBlbnRpdHkgYW5ub3RhdGlvbnMgcGFzc2VkIHRvIHJlcXVlc3QvcmVzcG9uc2UuIFRoaXMgbWV0aG9kIGZpbHRlcnMgYW5ub3RhdGlvbnMgdGhhdCBhcmUgcHJveHkgaW5zdGFuY2VzIChwcm94eQorICAgICAqIGFubm90YXRpb25zIGFyZSB0YWtlbiBmcm9tIHJlc291cmNlIG1ldGhvZCBhbmQgcGFzc2VkIGluIHRoaXMgbGlzdCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbnMgYW5ub3RhdGlvbnMgb2J0YWluZWQgZnJvbSBwcm92aWRlci4KKyAgICAgKiBAcmV0dXJuIGFubm9hdGlvbnMgcGFzc2VkIHRvIHJlcXVlc3QvcmVzcG9uc2UuCisgICAgICovCisgICAgcHJpdmF0ZSBBbm5vdGF0aW9uW10gZ2V0RW50aXR5QW5ub3RhdGlvbnMoZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zKSB7CisgICAgICAgIGZpbmFsIEFycmF5TGlzdDxBbm5vdGF0aW9uPiBlbnRpdHlBbm5vdGF0aW9ucyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgICAgIGZvciAoZmluYWwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgICAgIGlmICghKGFubm90YXRpb24gaW5zdGFuY2VvZiBQcm94eSkpIHsKKyAgICAgICAgICAgICAgICBlbnRpdHlBbm5vdGF0aW9ucy5hZGQoYW5ub3RhdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZW50aXR5QW5ub3RhdGlvbnMudG9BcnJheShuZXcgQW5ub3RhdGlvbltlbnRpdHlBbm5vdGF0aW9ucy5zaXplKCldKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgZW50aXR5LWZpbHRlcmluZyBvYmplY3QgYWZ0ZXIgdGhpcyBvYmplY3QgaGFzIG5vdCBiZWVuIGZvdW5kIGluIHRoZSBjYWNoZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbnRpdHlDbGFzcyAgICAgZW50aXR5IGNsYXNzIHRoZSBlbnRpdHktZmlsdGVyaW5nIG9iamVjdCBzaG91bGQgYmUgY3JlYXRlZCBmb3IuCisgICAgICogQHBhcmFtIGZpbHRlcmluZ1Njb3BlcyBlbnRpdHktZmlsdGVyaW5nIHNjb3BlcyB0byBjcmVhdGUgdGhlIGVudGl0eS1maWx0ZXJpbmcgb2JqZWN0IGZvci4KKyAgICAgKiBAcGFyYW0gZm9yV3JpdGVyICAgICAgIGZsYWcgZGV0ZXJtaW5pbmcgd2hldGhlciB0aGUgY2xhc3Mgc2hvdWxkIGJlIGV4YW1pbmVkIGZvciByZWFkZXIgb3Igd3JpdGVyLgorICAgICAqIEByZXR1cm4gZW50aXR5LWZpbHRlcmluZyBvYmplY3QuCisgICAgICovCisgICAgcHJpdmF0ZSBUIGNyZWF0ZUZpbHRlcmluZ09iamVjdChmaW5hbCBDbGFzczw/PiBlbnRpdHlDbGFzcywgZmluYWwgU2V0PFN0cmluZz4gZmlsdGVyaW5nU2NvcGVzLCBmaW5hbCBib29sZWFuIGZvcldyaXRlcikgeworICAgICAgICAvLyBPYnRhaW4gdGhlIGZpbHRlcmluZyBvYmplY3QuCisgICAgICAgIHJldHVybiB0cmFuc2Zvcm0oZ3JhcGhQcm92aWRlci5jcmVhdGVPYmplY3RHcmFwaChlbnRpdHlDbGFzcywgZmlsdGVyaW5nU2NvcGVzLCBmb3JXcml0ZXIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGhlbHBlciBtZXRob2QgZm9yIGEgY3JlYXRpb24gb2YgYW4gaW1tdXRhYmxlIHNldCBiYXNlZCBvbiBhIHByb3ZpZGVkIHNldCB0b2dldGhlciB3aXRoIGEgZ2l2ZW4gaXRlbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXQgIFRoZSBzZXQgdG8gY3JlYXRlIHRoZSBpbW11dGFibGUgc2V0IGZyb20uCisgICAgICogQHBhcmFtIGl0ZW0gVGhlIGl0ZW0gdG8gYWRkIHRvIHRoZSBzZXQgYmVmb3JlIGl0J3MgbWFkZSBpbW11dGFibGUuCisgICAgICogQHJldHVybiBUaGUgaW1tdXRhYmxlIHNldCBmcm9tIGdpdmVuIHNldCBhbmQgaXRlbS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU2V0PFN0cmluZz4gaW1tdXRhYmxlU2V0T2YoZmluYWwgU2V0PFN0cmluZz4gc2V0LCBmaW5hbCBTdHJpbmcgaXRlbSkgeworICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiBkdXBsaWNhdGUgPSBuZXcgSGFzaFNldDw+KHNldCk7CisgICAgICAgIGR1cGxpY2F0ZS5hZGQoaXRlbSk7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoZHVwbGljYXRlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgc3RyaW5nIGlkZW50aWZpZXIgb2YgYSBzdWItZ3JhcGguCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50ICAgICBUaGUgcGFyZW50IGNsYXNzLgorICAgICAqIEBwYXJhbSBmaWVsZCAgICAgIFRoZSBmaWVsZCBuYW1lLgorICAgICAqIEBwYXJhbSBmaWVsZENsYXNzIFRoZSBjbGFzcyBvZiB0aGUgZmllbGQuCisgICAgICogQHJldHVybiBUaGUgc3RyaW5nIGlkZW50aWZpZXIgb2YgdGhlIHN1Yi1ncmFwaC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHN1YmdyYXBoSWRlbnRpZmllcihmaW5hbCBDbGFzczw/PiBwYXJlbnQsIGZpbmFsIFN0cmluZyBmaWVsZCwgZmluYWwgQ2xhc3M8Pz4gZmllbGRDbGFzcykgeworICAgICAgICByZXR1cm4gcGFyZW50LmdldE5hbWUoKSArICJfIiArIGZpZWxkICsgIl8iICsgZmllbGRDbGFzcy5nZXROYW1lKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xhc3MgdG8gYmUgdXNlZCBhcyBhIGtleSBpbiBjYWNoZSAoe0Bjb2RlIEVudGl0eUNvbnRleHR9IC0mZ3Q7IGZpbHRlcmluZyBvYmplY3QpIHdoZW4gcHJvY2Vzc2luZyBzaW1pbGFyIHJlcXVlc3RzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEVudGl0eUNvbnRleHQgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgQ2xhc3M8Pz4gZW50aXR5Q2xhc3M7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8U3RyaW5nPiBmaWx0ZXJpbmdDb250ZXh0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgZW50aXR5IGNvbnRleHQgY2xhc3MgZm9yIGdpdmVuIGVudGl0eSBjbGFzcyBhbmQgc2V0IG9mIGVudGl0eS1maWx0ZXJpbmcgc2NvcGVzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZW50aXR5Q2xhc3MgICAgIGVudGl0eSBjbGFzcy4KKyAgICAgICAgICogQHBhcmFtIGZpbHRlcmluZ1Njb3BlcyBlbnRpdHktZmlsdGVyaW5nIHNjb3Blcy4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgRW50aXR5Q29udGV4dChmaW5hbCBDbGFzczw/PiBlbnRpdHlDbGFzcywgZmluYWwgU2V0PFN0cmluZz4gZmlsdGVyaW5nU2NvcGVzKSB7CisgICAgICAgICAgICB0aGlzLmVudGl0eUNsYXNzID0gZW50aXR5Q2xhc3M7CisgICAgICAgICAgICB0aGlzLmZpbHRlcmluZ0NvbnRleHQgPSBmaWx0ZXJpbmdTY29wZXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvKSB7CisgICAgICAgICAgICBpZiAodGhpcyA9PSBvKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgRW50aXR5Q29udGV4dCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIEVudGl0eUNvbnRleHQgdGhhdCA9IChFbnRpdHlDb250ZXh0KSBvOworCisgICAgICAgICAgICByZXR1cm4gZW50aXR5Q2xhc3MuZXF1YWxzKHRoYXQuZW50aXR5Q2xhc3MpICYmIGZpbHRlcmluZ0NvbnRleHQuZXF1YWxzKHRoYXQuZmlsdGVyaW5nQ29udGV4dCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIGludCByZXN1bHQgPSBlbnRpdHlDbGFzcy5oYXNoQ29kZSgpOworICAgICAgICAgICAgcmVzdWx0ID0gNDcgKiByZXN1bHQgKyBmaWx0ZXJpbmdDb250ZXh0Lmhhc2hDb2RlKCk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9zcGkvRW50aXR5R3JhcGguamF2YSBiL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvc3BpL0VudGl0eUdyYXBoLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRjOTVlMQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvc3BpL0VudGl0eUdyYXBoLmphdmEKQEAgLTAsMCArMSwxOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuc3BpOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIENsYXNzIGF2YWlsYWJsZSB0byB7QGxpbmsgRW50aXR5UHJvY2Vzc29yIGVudGl0eS1maWx0ZXJpbmcgcHJvY2Vzc29yc30gcHJvdmlkaW5nIG1lYW5zIHRvIGFkZC9yZW1vdmUgZW50aXR5LWZpbHRlcmluZyBzY29wZXMKKyAqIChlLmcuIGJhc2VkIG9uIGFubm90YXRpb25zKSBmb3IgZW50aXR5IG1lbWJlcnMuCisgKiA8cC8+CisgKiBEaWZmZXJlbmNlcyBiZXR3ZWVuIHRoaXMgY2xhc3MgYW5kIHtAbGluayBPYmplY3RHcmFwaCBvYmplY3QgZ3JhcGh9OgorICogPHVsPgorICogPGxpPntAY29kZSBFbnRpdHlHcmFwaH0gY2FuIGJlIG1vZGlmaWVkLCB7QGNvZGUgT2JqZWN0R3JhcGh9IGlzIHJlYWQtb25seS48L2xpPgorICogPGxpPntAY29kZSBFbnRpdHlHcmFwaH0gY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgYWxsIGVudGl0eS1maWx0ZXJpbmcgc2NvcGVzIGZvdW5kIGR1cmluZyBpbnNwZWN0aW5nIGFuIGVudGl0eSBjbGFzcywKKyAqIHtAY29kZSBPYmplY3RHcmFwaH0gcHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgZW50aXR5IHRvIGNyZWF0ZSBhIGZpbHRlcmluZyBvYmplY3QgZm9yIGEgc3Vic2V0IG9mIHRoZXNlIHNjb3BlcworICogKHdoaWNoIGFyZSBkZXRlcm1pbmVkIGZyb20gdGhlIGN1cnJlbnQgY29udGV4dCkuPC9saT4KKyAqIDwvdWw+CisgKiA8cC8+CisgKiBOb3RlOiBEZWZpbml0aW9uIG9mIGVudGl0eS1maWx0ZXJpbmcgc2NvcGVzIGNhbiBiZSBmb3VuZCBpbiB7QGxpbmsgU2NvcGVSZXNvbHZlcn0uCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKiBAc2VlIFNjb3BlUmVzb2x2ZXIKKyAqLworcHVibGljIGludGVyZmFjZSBFbnRpdHlHcmFwaCB7CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBmaWVsZCBpbnRvIHRoaXMgZ3JhcGggZm9yIGFsbCBleGlzdGluZyBlbnRpdHktZmlsdGVyaW5nIHNjb3Blcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWVsZE5hbWUgbmFtZSBvZiB0aGUgZmllbGQgdG8gYmUgYWRkZWQuCisgICAgICogQHJldHVybiBhbiBlbnRpdHktZmlsdGVyaW5nIGdyYXBoIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBFbnRpdHlHcmFwaCBhZGRGaWVsZChmaW5hbCBTdHJpbmcgZmllbGROYW1lKTsKKworICAgIC8qKgorICAgICAqIEFkZCBhIGZpZWxkIGludG8gdGhpcyBncmFwaCBmb3IgZ2l2ZW4gbGlzdCBvZiBlbnRpdHktZmlsdGVyaW5nIHNjb3Blcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWVsZE5hbWUgbmFtZSBvZiB0aGUgZmllbGQgdG8gYmUgYWRkZWQuCisgICAgICogQHBhcmFtIGZpbHRlcmluZ1Njb3BlcyBlbnRpdHktZmlsdGVyaW5nIHNjb3BlcyBmb3IgdGhlIGZpZWxkLgorICAgICAqIEByZXR1cm4gYW4gZW50aXR5LWZpbHRlcmluZyBncmFwaCBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRW50aXR5R3JhcGggYWRkRmllbGQoZmluYWwgU3RyaW5nIGZpZWxkTmFtZSwgZmluYWwgU3RyaW5nLi4uIGZpbHRlcmluZ1Njb3Blcyk7CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBmaWVsZCBpbnRvIHRoaXMgZ3JhcGggZm9yIGdpdmVuIHNldCBvZiBlbnRpdHktZmlsdGVyaW5nIHNjb3Blcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWVsZE5hbWUgbmFtZSBvZiB0aGUgZmllbGQgdG8gYmUgYWRkZWQuCisgICAgICogQHBhcmFtIGZpbHRlcmluZ1Njb3BlcyBlbnRpdHktZmlsdGVyaW5nIHNjb3BlcyBmb3IgdGhlIGZpZWxkLgorICAgICAqIEByZXR1cm4gYW4gZW50aXR5LWZpbHRlcmluZyBncmFwaCBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRW50aXR5R3JhcGggYWRkRmllbGQoZmluYWwgU3RyaW5nIGZpZWxkTmFtZSwgZmluYWwgU2V0PFN0cmluZz4gZmlsdGVyaW5nU2NvcGVzKTsKKworICAgIC8qKgorICAgICAqIEFkZCBhIHN1YmdyYXBoIGludG8gdGhpcyBncmFwaCBmb3IgYWxsIGV4aXN0aW5nIGVudGl0eS1maWx0ZXJpbmcgc2NvcGVzLgorICAgICAqCisgICAgICogQHBhcmFtIGZpZWxkTmFtZSBuYW1lIG9mIHRoZSBzdWJncmFwaCBmaWVsZCB0byBiZSBhZGRlZC4KKyAgICAgKiBAcGFyYW0gZmllbGRDbGFzcyBlbnRpdHkgY2xhc3MgcmVwcmVzZW50aW5nIHRoZSBzdWJncmFwaC4KKyAgICAgKiBAcmV0dXJuIGFuIGVudGl0eS1maWx0ZXJpbmcgZ3JhcGggaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIEVudGl0eUdyYXBoIGFkZFN1YmdyYXBoKGZpbmFsIFN0cmluZyBmaWVsZE5hbWUsIGZpbmFsIENsYXNzPD8+IGZpZWxkQ2xhc3MpOworCisgICAgLyoqCisgICAgICogQWRkIGEgc3ViZ3JhcGggaW50byB0aGlzIGdyYXBoIGZvciBnaXZlbiBsaXN0IG9mIGVudGl0eS1maWx0ZXJpbmcgc2NvcGVzLgorICAgICAqCisgICAgICogQHBhcmFtIGZpZWxkTmFtZSBuYW1lIG9mIHRoZSBzdWJncmFwaCBmaWVsZCB0byBiZSBhZGRlZC4KKyAgICAgKiBAcGFyYW0gZmllbGRDbGFzcyBlbnRpdHkgY2xhc3MgcmVwcmVzZW50aW5nIHRoZSBzdWJncmFwaC4KKyAgICAgKiBAcGFyYW0gZmlsdGVyaW5nU2NvcGVzIGVudGl0eS1maWx0ZXJpbmcgc2NvcGVzIGZvciB0aGUgc3ViZ3JhcGguCisgICAgICogQHJldHVybiBhbiBlbnRpdHktZmlsdGVyaW5nIGdyYXBoIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBFbnRpdHlHcmFwaCBhZGRTdWJncmFwaChmaW5hbCBTdHJpbmcgZmllbGROYW1lLCBmaW5hbCBDbGFzczw/PiBmaWVsZENsYXNzLCBmaW5hbCBTdHJpbmcuLi4gZmlsdGVyaW5nU2NvcGVzKTsKKworICAgIC8qKgorICAgICAqIEFkZCBhIHN1YmdyYXBoIGludG8gdGhpcyBncmFwaCBmb3IgZ2l2ZW4gc2V0IG9mIGVudGl0eS1maWx0ZXJpbmcgc2NvcGVzLgorICAgICAqCisgICAgICogQHBhcmFtIGZpZWxkTmFtZSBuYW1lIG9mIHRoZSBzdWJncmFwaCBmaWVsZCB0byBiZSBhZGRlZC4KKyAgICAgKiBAcGFyYW0gZmllbGRDbGFzcyBlbnRpdHkgY2xhc3MgcmVwcmVzZW50aW5nIHRoZSBzdWJncmFwaC4KKyAgICAgKiBAcGFyYW0gZmlsdGVyaW5nU2NvcGVzIGVudGl0eS1maWx0ZXJpbmcgc2NvcGVzIGZvciB0aGUgc3ViZ3JhcGguCisgICAgICogQHJldHVybiBhbiBlbnRpdHktZmlsdGVyaW5nIGdyYXBoIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBFbnRpdHlHcmFwaCBhZGRTdWJncmFwaChmaW5hbCBTdHJpbmcgZmllbGROYW1lLCBmaW5hbCBDbGFzczw/PiBmaWVsZENsYXNzLCBmaW5hbCBTZXQ8U3RyaW5nPiBmaWx0ZXJpbmdTY29wZXMpOworCisgICAgLyoqCisgICAgICogQWRkIGEgc2V0IG9mIGVudGl0eS1maWx0ZXJpbmcgc2NvcGVzIHRvIHRoaXMgZ3JhcGguCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsdGVyaW5nU2NvcGVzIGVudGl0eS1maWx0ZXJpbmcgc2NvcGVzIHRvIGJlIGFkZGVkLgorICAgICAqIEByZXR1cm4gYW4gZW50aXR5LWZpbHRlcmluZyBncmFwaCBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRW50aXR5R3JhcGggYWRkRmlsdGVyaW5nU2NvcGVzKGZpbmFsIFNldDxTdHJpbmc+IGZpbHRlcmluZ1Njb3Blcyk7CisKKyAgICAvKioKKyAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSBmaWVsZC9zdWJncmFwaCBpcyBwcmVzZW50IGluIEFOWSBvZiB0aGUgZ2l2ZW4gc2NvcGVzLiBJZiBubyBzY29wZXMgYXJlIGdpdmVuIHRoZSByZXR1cm4gdmFsdWUKKyAgICAgKiBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGZpZWxkIGlzIHByZXNlbnQgaW4gYW55IHNjb3BlLgorICAgICAqCisgICAgICogQHBhcmFtIGZpZWxkIGZpZWxkIHRvIGJlIGNoZWNrZWQuCisgICAgICogQHBhcmFtIGZpbHRlcmluZ1Njb3BlIGVudGl0eS1maWx0ZXJpbmcgc2NvcGUuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgZmllbGQgaXMgcHJlc2VudCBpbiB0aGUgZ2l2ZW4gc2NvcGUsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHByZXNlbnRJblNjb3BlKGZpbmFsIFN0cmluZyBmaWVsZCwgZmluYWwgU3RyaW5nIGZpbHRlcmluZ1Njb3BlKTsKKworICAgIC8qKgorICAgICAqIERldGVybWluZXMgd2hldGhlciBhIGZpZWxkL3N1YmdyYXBoIGlzIHByZXNlbnQgaW4gQU5ZIG9mIHRoZSBleGlzdGluZyBzY29wZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmllbGQgZmllbGQgdG8gYmUgY2hlY2tlZC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBmaWVsZCBpcyBwcmVzZW50IGluIEFOWSBvZiB0aGUgZXhpc3Rpbmcgc2NvcGVzLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBwcmVzZW50SW5TY29wZXMoZmluYWwgU3RyaW5nIGZpZWxkKTsKKworICAgIC8qKgorICAgICAqIEdldCBhbiBlbnRpdHkgY2xhc3MgdGhpcyBncmFwaCBpcyBjcmVhdGVkIGZvci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYW4gZW50aXR5IGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBDbGFzczw/PiBnZXRFbnRpdHlDbGFzcygpOworCisgICAgLyoqCisgICAgICogR2V0IGZpZWxkcyBmb3IgZ2l2ZW4gZW50aXR5LWZpbHRlcmluZyBzY29wZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWx0ZXJpbmdTY29wZSBzY29wZSB0aGUgcmV0dXJuZWQgZmllbGRzIGhhdmUgdG8gYmUgaW4uCisgICAgICogQHJldHVybiBzZXQgb2YgZmllbGRzIHByZXNlbnQgaW4gZ2l2ZW4gc2NvcGUuCisgICAgICovCisgICAgcHVibGljIFNldDxTdHJpbmc+IGdldEZpZWxkcyhmaW5hbCBTdHJpbmcgZmlsdGVyaW5nU2NvcGUpOworCisgICAgLyoqCisgICAgICogR2V0IGZpZWxkcyBmb3IgZ2l2ZW4gZW50aXR5LWZpbHRlcmluZyBzY29wZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsdGVyaW5nU2NvcGVzIHNjb3BlcyB0aGUgcmV0dXJuZWQgZmllbGRzIGhhdmUgdG8gYmUgaW4uCisgICAgICogQHJldHVybiBzZXQgb2YgZmllbGRzIHByZXNlbnQgaW4gZ2l2ZW4gc2NvcGVzLgorICAgICAqLworICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRGaWVsZHMoZmluYWwgU3RyaW5nLi4uIGZpbHRlcmluZ1Njb3Blcyk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgZmllbGRzIGZvciBnaXZlbiBlbnRpdHktZmlsdGVyaW5nIHNjb3Blcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWx0ZXJpbmdTY29wZXMgc2NvcGVzIHRoZSByZXR1cm5lZCBmaWVsZHMgaGF2ZSB0byBiZSBpbi4KKyAgICAgKiBAcmV0dXJuIHNldCBvZiBmaWVsZHMgcHJlc2VudCBpbiBnaXZlbiBzY29wZXMuCisgICAgICovCisgICAgcHVibGljIFNldDxTdHJpbmc+IGdldEZpZWxkcyhmaW5hbCBTZXQ8U3RyaW5nPiBmaWx0ZXJpbmdTY29wZXMpOworCisgICAgLyoqCisgICAgICogR2V0IGFsbCBhdmFpbGFibGUgZW50aXR5LWZpbHRlcmluZyBzY29wZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFsbCBhdmFpbGFibGUgZW50aXR5LWZpbHRlcmluZyBzY29wZXMuCisgICAgICovCisgICAgcHVibGljIFNldDxTdHJpbmc+IGdldEZpbHRlcmluZ1Njb3BlcygpOworCisgICAgLyoqCisgICAgICogR2V0IGFsbCBhdmFpbGFibGUgZW50aXR5LWZpbHRlcmluZyBzY29wZXMgZGVmaW5lZCBvbiBhIGNsYXNzLgorICAgICAqCisgICAgICogQHJldHVybiBhbGwgYXZhaWxhYmxlIGVudGl0eS1maWx0ZXJpbmcgc2NvcGVzLgorICAgICAqLworICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRDbGFzc0ZpbHRlcmluZ1Njb3BlcygpOworCisgICAgLyoqCisgICAgICogR2V0IHN1YmdyYXBocyBmb3IgZ2l2ZW4gZW50aXR5LWZpbHRlcmluZyBzY29wZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWx0ZXJpbmdTY29wZSBzY29wZSB0aGUgcmV0dXJuZWQgc3ViZ3JhcGhzIGhhdmUgdG8gYmUgaW4uCisgICAgICogQHJldHVybiBtYXAgb2Ygc3ViZ3JhcGhzIHByZXNlbnQgaW4gZ2l2ZW4gc2NvcGUuCisgICAgICovCisgICAgcHVibGljIE1hcDxTdHJpbmcsIENsYXNzPD8+PiBnZXRTdWJncmFwaHMoZmluYWwgU3RyaW5nIGZpbHRlcmluZ1Njb3BlKTsKKworICAgIC8qKgorICAgICAqIEdldCBzdWJncmFwaHMgZm9yIGdpdmVuIGVudGl0eS1maWx0ZXJpbmcgc2NvcGVzLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbHRlcmluZ1Njb3BlcyBzY29wZXMgdGhlIHJldHVybmVkIHN1YmdyYXBocyBoYXZlIHRvIGJlIGluLgorICAgICAqIEByZXR1cm4gbWFwIG9mIHN1YmdyYXBocyBwcmVzZW50IGluIGdpdmVuIHNjb3Blcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwPFN0cmluZywgQ2xhc3M8Pz4+IGdldFN1YmdyYXBocyhmaW5hbCBTdHJpbmcuLi4gZmlsdGVyaW5nU2NvcGVzKTsKKworICAgIC8qKgorICAgICAqIEdldCBzdWJncmFwaHMgZm9yIGdpdmVuIGVudGl0eS1maWx0ZXJpbmcgc2NvcGVzLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbHRlcmluZ1Njb3BlcyBzY29wZXMgdGhlIHJldHVybmVkIHN1YmdyYXBocyBoYXZlIHRvIGJlIGluLgorICAgICAqIEByZXR1cm4gbWFwIG9mIHN1YmdyYXBocyBwcmVzZW50IGluIGdpdmVuIHNjb3Blcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwPFN0cmluZywgQ2xhc3M8Pz4+IGdldFN1YmdyYXBocyhmaW5hbCBTZXQ8U3RyaW5nPiBmaWx0ZXJpbmdTY29wZXMpOworCisgICAgLyoqCisgICAgICogUmVtb3ZlIGEgZmllbGQvc3ViZ3JhcGggZnJvbSB0aGUgZ3JhcGggKGFsbCBlbnRpdHktZmlsdGVyaW5nIHNjb3BlcykuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBuYW1lIG9mIHRoZSBmaWVsZC9zdWJncmFwaCB0byBiZSByZW1vdmVkLgorICAgICAqIEByZXR1cm4gYW4gZW50aXR5LWZpbHRlcmluZyBncmFwaCBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRW50aXR5R3JhcGggcmVtb3ZlKGZpbmFsIFN0cmluZyBuYW1lKTsKK30KZGlmZiAtLWdpdCBhL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvc3BpL0VudGl0eUdyYXBoUHJvdmlkZXIuamF2YSBiL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvc3BpL0VudGl0eUdyYXBoUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjY3MTU5Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9zcGkvRW50aXR5R3JhcGhQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuc3BpOworCitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5Db250cmFjdDsKKworLyoqCisgKiBQcm92aWRlcyB7QGxpbmsgRW50aXR5R3JhcGggZW50aXR5IGdyYXBofSBhbmQge0BsaW5rIE9iamVjdEdyYXBoIG9iamVjdCBncmFwaH0gaW5zdGFuY2VzLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAQ29udHJhY3QKK3B1YmxpYyBpbnRlcmZhY2UgRW50aXR5R3JhcGhQcm92aWRlciB7CisKKyAgICAvKioKKyAgICAgKiBHZXQgYW4gZW50aXR5IGdyYXBoIGZvciBnaXZlbiBjbGFzcy4gTmV3IGdyYXBoIGlzIGNyZWF0ZWQgaWYgbm8gZ3JhcGggZXhpc3RzIGZvciBnaXZlbiBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbnRpdHlDbGFzcyBlbnRpdHkgY2xhc3MgdGhlIGdyYXBoIHNob3VsZCBiZSBjcmVhdGVkIGZvci4KKyAgICAgKiBAcGFyYW0gZm9yV3JpdGVyIGZsYWcgZGV0ZXJtaW5pbmcgd2hldGhlciB0aGUgZ3JhcGggc2hvdWxkIGJlIGNyZWF0ZWQgZm9yIHdyaXRlci9yZWFkZXIuCisgICAgICogQHJldHVybiBhbiBlbnRpdHkgZ3JhcGguCisgICAgICovCisgICAgcHVibGljIEVudGl0eUdyYXBoIGdldE9yQ3JlYXRlRW50aXR5R3JhcGgoZmluYWwgQ2xhc3M8Pz4gZW50aXR5Q2xhc3MsIGZpbmFsIGJvb2xlYW4gZm9yV3JpdGVyKTsKKworICAgIC8qKgorICAgICAqIEdldCBhbiBlbXB0eSBlbnRpdHkgZ3JhcGggZm9yIGdpdmVuIGNsYXNzLiBOZXcgZ3JhcGggaXMgY3JlYXRlZCBpZiB0aGUgc3RvcmVkIG9uZSBpcyBub3QgYW4gZW1wdHkgZW50aXR5IGdyYXBoIG9yIG5vIGdyYXBoCisgICAgICogZXhpc3RzIGZvciBnaXZlbiBjbGFzcy4gVGhpcyBtZXRob2Qgb3ZlcnJpZGVzIHRoZSBncmFwaCBjcmVhdGVkIGJ5IHtAbGluayAjZ2V0T3JDcmVhdGVFbnRpdHlHcmFwaChDbGFzcywgYm9vbGVhbil9IG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbnRpdHlDbGFzcyBlbnRpdHkgY2xhc3MgdGhlIGdyYXBoIHNob3VsZCBiZSBjcmVhdGVkIGZvci4KKyAgICAgKiBAcGFyYW0gZm9yV3JpdGVyIGZsYWcgZGV0ZXJtaW5pbmcgd2hldGhlciB0aGUgZ3JhcGggc2hvdWxkIGJlIGNyZWF0ZWQgZm9yIHdyaXRlci9yZWFkZXIuCisgICAgICogQHJldHVybiBhbiBlbXB0eSBlbnRpdHkgZ3JhcGguCisgICAgICovCisgICAgcHVibGljIEVudGl0eUdyYXBoIGdldE9yQ3JlYXRlRW1wdHlFbnRpdHlHcmFwaChmaW5hbCBDbGFzczw/PiBlbnRpdHlDbGFzcywgZmluYWwgYm9vbGVhbiBmb3JXcml0ZXIpOworCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgYW4gZW50aXR5IGdyYXBoIGZvciBnaXZlbiBlbnRpdHkgY2xhc3MgaGFzIGJlZW4gY3JlYXRlZCBieSB0aGlzIHByb3ZpZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGVudGl0eUNsYXNzIGVudGl0eSBjbGFzcyBmb3Igd2hpY2ggdGhlIGdyYXBoIHNob3VsZCBiZSBjaGVja2VkLgorICAgICAqIEBwYXJhbSBmb3JXcml0ZXIgZmxhZyBkZXRlcm1pbmluZyB3aGV0aGVyIHRoZSBjaGVjayBzaG91bGQgYmUgaW4gd3JpdGVyL3JlYWRlciBncmFwaHMuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGVudGl0eSBncmFwaCBhbHJlYWR5IGV4aXN0cywge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNFbnRpdHlHcmFwaChmaW5hbCBDbGFzczw/PiBlbnRpdHlDbGFzcywgZmluYWwgYm9vbGVhbiBmb3JXcml0ZXIpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIHtAY29kZSBPYmplY3RHcmFwaH0gZm9yIGdpdmVuIHBhcmFtZXRlcnMuIEV2ZXJ5IHRpbWUgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGEgbmV3IGluc3RhbmNlIG9mIG9iamVjdCBncmFwaCBpcworICAgICAqIGNyZWF0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW50aXR5Q2xhc3MgZW50aXR5IGNsYXNzIHdoaWNoIHRoZSBvYmplY3QgZ3JhcGggc2hvdWxkIGJlIGNyZWF0ZWQgZm9yLgorICAgICAqIEBwYXJhbSBmaWx0ZXJpbmdTY29wZXMgZW50aXR5LWZpbHRlcmluZyBzY29wZXMgdGhlIGdyYXBoIHNob3VsZCBiZSBjcmVhdGVkIGZvci4KKyAgICAgKiBAcGFyYW0gZm9yV3JpdGVyIGZsYWcgZGV0ZXJtaW5pbmcgd2hldGhlciB0aGUgZ3JhcGggc2hvdWxkIGJlIGNyZWF0ZWQgZm9yIHdyaXRlci9yZWFkZXIuCisgICAgICogQHJldHVybiBhbiBlbnRpdHktZmlsdGVyaW5nIG9iamVjdCBncmFwaCBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT2JqZWN0R3JhcGggY3JlYXRlT2JqZWN0R3JhcGgoZmluYWwgQ2xhc3M8Pz4gZW50aXR5Q2xhc3MsIGZpbmFsIFNldDxTdHJpbmc+IGZpbHRlcmluZ1Njb3BlcywgZmluYWwgYm9vbGVhbiBmb3JXcml0ZXIpOworfQpkaWZmIC0tZ2l0IGEvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9zcGkvRW50aXR5SW5zcGVjdG9yLmphdmEgYi9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL3NwaS9FbnRpdHlJbnNwZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmNhNzIyCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9zcGkvRW50aXR5SW5zcGVjdG9yLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5zcGk7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuQ29udHJhY3Q7CisKKy8qKgorICogUmVzcG9uc2libGUgZm9yIGluc3BlY3RpbmcgZW50aXR5IGNsYXNzZXMuIFRoaXMgY2xhc3MgaW52b2tlcyBhbGwgYXZhaWxhYmxlIHtAbGluayBFbnRpdHlQcm9jZXNzb3IgZW50aXR5IHByb2Nlc3NvcnN9IHdpdGgKKyAqIGRpZmZlcmVudCB7QGxpbmsgRW50aXR5UHJvY2Vzc29yQ29udGV4dCBjb250ZXh0c30uCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BDb250cmFjdAorcHVibGljIGludGVyZmFjZSBFbnRpdHlJbnNwZWN0b3IgeworCisgICAgLyoqCisgICAgICogSW5zcGVjdCBlbnRpdHkgY2xhc3MgYW5kIGNyZWF0ZS91cGRhdGUge0BsaW5rIEVudGl0eUdyYXBofSBmb3IgcmVhZGVyL3dyaXRlci4gVGhlIGVudGl0eSBncmFwaCB3aWxsIGJlIHVzZWQgdG8gY3JlYXRlCisgICAgICogZW50aXR5LWZpbHRlcmluZyBvYmplY3Qgd2hpY2ggaXMgcmVxdWVzdGVkIGJ5IHtAY29kZSAjY3JlYXRlRmlsdGVyaW5nT2JqZWN0KC4uLil9LgorICAgICAqIDxwPgorICAgICAqIE1ldGhvZCByZWN1cnNpdmVseSBpbnNwZWN0cyBlbnRpdHkgZmllbGRzIGNsYXNzZXMgc3VpdGFibGUgZm9yIGluc3BlY3RpbmcuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIE1ldGhvZCB1c2VzIHtAbGluayBFbnRpdHlQcm9jZXNzb3J9cyBmb3IgaW5zcGVjdGluZy4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gZW50aXR5Q2xhc3MgZW50aXR5IGNsYXNzIHRvIGJlIGV4YW1pbmVkLgorICAgICAqIEBwYXJhbSBmb3JXcml0ZXIgZmxhZyBkZXRlcm1pbmluZyB3aGV0aGVyIHRoZSBjbGFzcyBzaG91bGQgYmUgZXhhbWluZWQgZm9yIHJlYWRlciBvciB3cml0ZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgaW5zcGVjdChmaW5hbCBDbGFzczw/PiBlbnRpdHlDbGFzcywgZmluYWwgYm9vbGVhbiBmb3JXcml0ZXIpOworfQpkaWZmIC0tZ2l0IGEvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9zcGkvRW50aXR5UHJvY2Vzc29yLmphdmEgYi9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL3NwaS9FbnRpdHlQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2E5NDYxCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9zcGkvRW50aXR5UHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5zcGk7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuQ29udHJhY3Q7CisKKy8qKgorICogQ29udHJhY3Qgc3VwcG9zZWQgdG8gcHJvY2VzcyBlbnRpdHkgY2xhc3NlcyBmb3IgRW50aXR5IERhdGEgRmlsdGVyaW5nLiBJbXBsZW1lbnRhdGlvbnMgd2lsbCBiZSBnaXZlbiBhCisgKiB7QGxpbmsgRW50aXR5UHJvY2Vzc29yQ29udGV4dCBjb250ZXh0fSBwcm92aWRpbmcgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIHRvIHByb2Nlc3MgcGFydGljdWxhcgorICoge0BsaW5rIEVudGl0eVByb2Nlc3NvckNvbnRleHQuVHlwZSBjb250ZXh0IHR5cGV9LiBDb250ZXh0cyBhcmUgY3JlYXRlZCBmb3I6IGNsYXNzIC8gcHJvcGVydGllcyAvIGFjY2Vzc29ycy4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQENvbnRyYWN0CitwdWJsaWMgaW50ZXJmYWNlIEVudGl0eVByb2Nlc3NvciB7CisKKyAgICAvKioKKyAgICAgKiBSZXN1bHQgdHlwZSBvZiBwcm9jZXNzaW5nIGFuIGNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIGVudW0gUmVzdWx0IHsKKworICAgICAgICAvKioKKyAgICAgICAgICogUHJvY2Vzc2luZyBvZiBhbiBjb250ZXh0IHJlc3VsdGVkIGluIG1vZGlmaWNhdGlvbiBvZiB0aGUgcHJvdmlkZWQgZW50aXR5IGdyYXBoLgorICAgICAgICAgKi8KKyAgICAgICAgQVBQTFksCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEVudGl0eSBwcm9jZXNzb3IgZGlkbid0IG1vZGlmeSB0aGUgcHJvdmlkZWQgZW50aXR5IGdyYXBoLgorICAgICAgICAgKi8KKyAgICAgICAgU0tJUCwKKworICAgICAgICAvKioKKyAgICAgICAgICogUm9sbGJhY2sgZXZlcnkgZW50aXR5IGdyYXBoIG1vZGlmaWNhdGlvbiBkb25lIGluIGN1cnJlbnQgY29udGV4dC4KKyAgICAgICAgICovCisgICAgICAgIFJPTExCQUNLCisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvY2VzcyBnaXZlbiAoY2xhc3MvcHJvcGVydHkvYWNjZXNzb3IpIHtAbGluayBFbnRpdHlQcm9jZXNzb3JDb250ZXh0IGNvbnRleHR9IGJ5IG1vZGlmeWluZyBwcm92aWRlZCB7QGxpbmsgRW50aXR5R3JhcGh9LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQgY29udGV4dCB0byBiZSBwcm9jZXNzZWQuCisgICAgICogQHJldHVybiByZXN1bHQgb2YgcHJvY2Vzc2luZyBhIGNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIFJlc3VsdCBwcm9jZXNzKGZpbmFsIEVudGl0eVByb2Nlc3NvckNvbnRleHQgY29udGV4dCk7Cit9CmRpZmYgLS1naXQgYS9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL3NwaS9FbnRpdHlQcm9jZXNzb3JDb250ZXh0LmphdmEgYi9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL3NwaS9FbnRpdHlQcm9jZXNzb3JDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDdlZmJkMgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvc3BpL0VudGl0eVByb2Nlc3NvckNvbnRleHQuamF2YQpAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5zcGk7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKKy8qKgorICoge0BsaW5rIEVudGl0eVByb2Nlc3NvciBFbnRpdHkgcHJvY2Vzc29yfSBjb250ZXh0IHByb3ZpZGluZyBkZXRhaWxzIGFib3V0IGVudGl0eSBwcm9jZXNzaW5nLgorICogPHAvPgorICogVGhlIGNvbnRleHQgY29udGFpbnMgdGhlIHtAbGluayBUeXBlfSB3aGljaCBkaXN0aW5ndWlzaGVzIGJldHdlZW4gdHlwZXMgb2YgY29udGV4dC4gVGhlcmUgYXJlIHZhcmlvdXMgcHJvcGVydGllcyBpbiB0aGUKKyAqIGNvbnRleHQgKGFjY2Vzc2libGUgYnkgZ2V0dGVycykgYW5kIHNvbWUgb2YgdGhlbSBtaWdodCBiZSByZWxldmFudCBvbmx5IHRvIHNwZWNpZmljIGNvbnRleHQgdHlwZXMuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRW50aXR5UHJvY2Vzc29yQ29udGV4dCB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdHlwZSBvZiB0aGUgY29udGV4dCB3aGljaCBkZXNjcmliZXMgaW4gd2hpY2ggZW50aXR5IHByb2Nlc3NpbmcgcGhhc2UgdGhlCisgICAgICoge0BsaW5rIEVudGl0eVByb2Nlc3NvciNwcm9jZXNzKEVudGl0eVByb2Nlc3NvckNvbnRleHQpfSBpcyB0cmlnZ2VyZWQuCisgICAgICovCisgICAgcHVibGljIGVudW0gVHlwZSB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnRleHQgY3JlYXRlZCB0byBwcm9jZXNzIGVudGl0eSBjbGFzcyB3aGVuIHJlYWRpbmcgZW50aXR5IGZyb20gYW4gaW5wdXQgc3RyZWFtIGludG8gYW4gSmF2YSBvYmplY3QuIFByb3BlcnRpZXMKKyAgICAgICAgICogYXZhaWxhYmxlIGZvciB0aGlzIHR5cGUgYXJlOiB7QGxpbmsgI2dldEVudGl0eUNsYXNzKCl9LCB7QGxpbmsgI2dldEVudGl0eUdyYXBoKCl9LgorICAgICAgICAgKi8KKyAgICAgICAgQ0xBU1NfUkVBREVSLAorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb250ZXh0IGNyZWF0ZWQgdG8gcHJvY2VzcyBlbnRpdHkgY2xhc3Mgd2hlbiB3cml0aW5nIGVudGl0eSB0byBhbiBvdXRwdXQgc3RyZWFtIGZyb20gYW4gSmF2YSBvYmplY3QuIFByb3BlcnRpZXMKKyAgICAgICAgICogYXZhaWxhYmxlIGZvciB0aGlzIHR5cGUgYXJlOiB7QGxpbmsgI2dldEVudGl0eUNsYXNzKCl9LCB7QGxpbmsgI2dldEVudGl0eUdyYXBoKCl9LgorICAgICAgICAgKi8KKyAgICAgICAgQ0xBU1NfV1JJVEVSLAorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb250ZXh0IGNyZWF0ZWQgdG8gcHJvY2VzcyBlbnRpdHkgcHJvcGVydGllcyB3aGVuIHJlYWRpbmcgZW50aXR5IGZyb20gYW4gaW5wdXQgc3RyZWFtIGludG8gYW4gSmF2YSBvYmplY3QuIFByb3BlcnRpZXMKKyAgICAgICAgICogYXZhaWxhYmxlIGZvciB0aGlzIHR5cGUgYXJlOiB7QGxpbmsgI2dldEZpZWxkKCl9LCB7QGxpbmsgI2dldE1ldGhvZCgpfSwge0BsaW5rICNnZXRFbnRpdHlHcmFwaCgpfS4KKyAgICAgICAgICovCisgICAgICAgIFBST1BFUlRZX1JFQURFUiwKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29udGV4dCBjcmVhdGVkIHRvIHByb2Nlc3MgZW50aXR5IHByb3BlcnRpZXMgd2hlbiB3cml0aW5nIGVudGl0eSB0byBhbiBvdXRwdXQgc3RyZWFtIGZyb20gYW4gSmF2YSBvYmplY3QuIFByb3BlcnRpZXMKKyAgICAgICAgICogYXZhaWxhYmxlIGZvciB0aGlzIHR5cGUgYXJlOiB7QGxpbmsgI2dldEZpZWxkKCl9LCB7QGxpbmsgI2dldE1ldGhvZCgpfSwge0BsaW5rICNnZXRFbnRpdHlHcmFwaCgpfS4KKyAgICAgICAgICovCisgICAgICAgIFBST1BFUlRZX1dSSVRFUiwKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29udGV4dCBjcmVhdGVkIHRvIHByb2Nlc3MgcHJvcGVydHkgYWNjZXNzb3JzIHdoZW4gcmVhZGluZyBlbnRpdHkgZnJvbSBhbiBpbnB1dCBzdHJlYW0gaW50byBhbiBKYXZhIG9iamVjdC4gUHJvcGVydGllcworICAgICAgICAgKiBhdmFpbGFibGUgZm9yIHRoaXMgdHlwZSBhcmU6IHtAbGluayAjZ2V0TWV0aG9kKCl9LCB7QGxpbmsgI2dldEVudGl0eUdyYXBoKCl9LgorICAgICAgICAgKi8KKyAgICAgICAgTUVUSE9EX1JFQURFUiwKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29udGV4dCBjcmVhdGVkIHRvIHByb2Nlc3MgcHJvcGVydHkgYWNjZXNzb3JzIHdoZW4gd3JpdGluZyBlbnRpdHkgdG8gYW4gb3V0cHV0IHN0cmVhbSBmcm9tIGFuIEphdmEgb2JqZWN0LiBQcm9wZXJ0aWVzCisgICAgICAgICAqIGF2YWlsYWJsZSBmb3IgdGhpcyB0eXBlIGFyZToge0BsaW5rICNnZXRNZXRob2QoKX0sIHtAbGluayAjZ2V0RW50aXR5R3JhcGgoKX0uCisgICAgICAgICAqLworICAgICAgICBNRVRIT0RfV1JJVEVSCisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB7QGxpbmsgVHlwZSB0eXBlfSBvZiB0aGlzIGNvbnRleHQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGVudGl0eSBwcm9jZXNzaW5nIGNvbnRleHQgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVHlwZSBnZXRUeXBlKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgZW50aXR5IGNsYXNzIHRvIGJlIHByb2Nlc3NlZC4gVGhlIGVudGl0eSBjbGFzcyBpcyBhdmFpbGFibGUgb25seSBmb3Ige0BsaW5rIFR5cGUjQ0xBU1NfV1JJVEVSfSBhbmQKKyAgICAgKiB7QGxpbmsgVHlwZSNDTEFTU19SRUFERVJ9IGNvbnRleHQgdHlwZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGVudGl0eSBjbGFzcyBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIGNsYXNzIGlzIG5vdCBhdmFpbGFibGUuCisgICAgICovCisgICAgcHVibGljIENsYXNzPD8+IGdldEVudGl0eUNsYXNzKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgZmllbGQgdG8gYmUgcHJvY2Vzc2VkLiBUaGUgZmllbGQgaXMgYXZhaWxhYmxlIG9ubHkgZm9yIHtAbGluayBUeXBlI1BST1BFUlRZX1dSSVRFUn0gYW5kCisgICAgICoge0BsaW5rIFR5cGUjUFJPUEVSVFlfUkVBREVSfSBjb250ZXh0IHR5cGVzLgorICAgICAqCisgICAgICogQHJldHVybiBmaWVsZCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIGZpZWxkIGlzIG5vdCBhdmFpbGFibGUuCisgICAgICovCisgICAgcHVibGljIEZpZWxkIGdldEZpZWxkKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgbWV0aG9kIHRvIGJlIHByb2Nlc3NlZC4gVGhlIG1ldGhvZCBpcyBhdmFpbGFibGUgZm9yIHtAbGluayBUeXBlI1BST1BFUlRZX1dSSVRFUn0sIHtAbGluayBUeXBlI1BST1BFUlRZX1JFQURFUn0sCisgICAgICoge0BsaW5rIFR5cGUjTUVUSE9EX1dSSVRFUn0sIHtAbGluayBUeXBlI01FVEhPRF9SRUFERVJ9IGNvbnRleHQgdHlwZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIG1ldGhvZCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIG1ldGhvZCBpcyBub3QgYXZhaWxhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBNZXRob2QgZ2V0TWV0aG9kKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgZW50aXR5IGdyYXBoIHRvIGJlIG1vZGlmaWVkIGJ5IHRoZSBwcm9jZXNzaW5nLiBUaGUgZW50aXR5IGdyYXBoIGlzIGF2YWlsYWJsZSBmb3IgYWxsIGNvbnRleHQgdHlwZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGVudGl0eSBncmFwaC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRW50aXR5R3JhcGggZ2V0RW50aXR5R3JhcGgoKTsKK30KZGlmZiAtLWdpdCBhL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvc3BpL0ZpbHRlcmluZ0hlbHBlci5qYXZhIGIvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9zcGkvRmlsdGVyaW5nSGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBmMmZhMQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvc3BpL0ZpbHRlcmluZ0hlbHBlci5qYXZhCkBAIC0wLDAgKzEsMTY1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLnNwaTsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuR2VuZXJpY0FycmF5VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUGFyYW1ldGVyaXplZFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlVmFyaWFibGU7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuV2lsZGNhcmRUeXBlOworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRNYXA7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRWxlbWVudDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUmVmbGVjdGlvbkhlbHBlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uRGF0YVN0cnVjdHVyZXM7CisKKy8qKgorICogU1BJIHV0aWxpdHkgbWV0aG9kcyBmb3IgZW50aXR5IGZpbHRlcmluZy4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEZpbHRlcmluZ0hlbHBlciB7CisKKyAgICAvKioKKyAgICAgKiBFbXB0eSBhbm5vdGF0aW9uIGFycmF5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQW5ub3RhdGlvbltdIEVNUFRZX0FOTk9UQVRJT05TID0gbmV3IEFubm90YXRpb25bMF07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb25jdXJyZW50TWFwPFR5cGUsIENsYXNzPD8+PiBFTlRJVFlfQ0xBU1NFUyA9IERhdGFTdHJ1Y3R1cmVzLmNyZWF0ZUNvbmN1cnJlbnRNYXAoKTsKKworICAgIC8qKgorICAgICAqIERldGVybWluZSB3aGV0aGVyIGdpdmVuIGNsYXNzIGlzIGZpbHRlcmFibGUgYnkgZW50aXR5LWZpbHRlcmluZy4gRmlsdGVyYWJsZSBjbGFzc2VzIGFyZSBhbGwgY2xhc3NlcyB0aGF0IGFyZSBub3QgcHJpbWl0aXZlcworICAgICAqIGFuZCBhcmUgbm90IGluIGEgcGFja2FnZSBtYXRjaGluZyA8Y29kZT5qYXZhLio8L2NvZGU+LgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXp6IGVudGl0eSBjbGFzcyB0byBiZSBleGFtaW5lZC4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSB3aGV0aGVyIHRoZSBjbGFzcyBpcyBmaWx0ZXJhYmxlLCB7QGNvZGUgZmFsc2Ugb3RoZXJ3aXNlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZmlsdGVyYWJsZUVudGl0eUNsYXNzKGZpbmFsIENsYXNzPD8+IGNsYXp6KSB7CisgICAgICAgIHJldHVybiAhUmVmbGVjdGlvbkhlbHBlci5pc1ByaW1pdGl2ZShjbGF6eikgJiYgIWNsYXp6LmdldFBhY2thZ2UoKS5nZXROYW1lKCkuc3RhcnRzV2l0aCgiamF2YS4iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIGNvbnZlbmllbmNlIG1ldGhvZCB0byBnZXQgdGhlIGRvbWFpbiBjbGFzcyAoaS5lLiA8aT5DdXN0b21lcjwvaT4pIGZyb20gdGhlIGdlbmVyaWMgdHlwZSAoaS5lLiA8aT5DdXN0b21lcjwvaT4sCisgICAgICogPGk+TGlzdCZsdDtDdXN0b21lcj48L2k+LCA8aT5KQVhCRWxlbWVudCZsdDtDdXN0b21lcj48L2k+LCA8aT5KQVhCRWxlbWVudCZsdDs/IGV4dGVuZHMgQ3VzdG9tZXI+PC9pPiwKKyAgICAgKiA8aT5MaXN0Jmx0O0pBWEJFbGVtZW50Jmx0O0N1c3RvbWVyPj48L2k+LCBvciA8aT5MaXN0Jmx0O0pBWEJFbGVtZW50Jmx0Oz8gZXh0ZW5kcyBDdXN0b21lcj4+PC9pPikuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZ2VuZXJpY1R5cGUgdHlwZSB0byBvYnRhaW4gZW50aXR5IGRvbWFpbiBjbGFzcyBmb3IuCisgICAgICogQHJldHVybiBlbnRpdHkgZG9tYWluIGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ2xhc3M8Pz4gZ2V0RW50aXR5Q2xhc3MoZmluYWwgVHlwZSBnZW5lcmljVHlwZSkgeworICAgICAgICBpZiAoIUVOVElUWV9DTEFTU0VTLmNvbnRhaW5zS2V5KGdlbmVyaWNUeXBlKSkgeworICAgICAgICAgICAgRU5USVRZX0NMQVNTRVMucHV0SWZBYnNlbnQoZ2VuZXJpY1R5cGUsIF9nZXRFbnRpdHlDbGFzcyhnZW5lcmljVHlwZSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBFTlRJVFlfQ0xBU1NFUy5nZXQoZ2VuZXJpY1R5cGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5vdGU6IFRoaXMgbWV0aG9kIHdhcyBjb3BpZWQgZnJvbSB7QGNvZGUgTU9YeUpzb25Qcm92aWRlcn0uCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoIkphdmFEb2MiKQorICAgIHByaXZhdGUgc3RhdGljIENsYXNzPD8+IF9nZXRFbnRpdHlDbGFzcyhmaW5hbCBUeXBlIGdlbmVyaWNUeXBlKSB7CisgICAgICAgIGlmIChudWxsID09IGdlbmVyaWNUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmNsYXNzOworICAgICAgICB9CisgICAgICAgIGlmIChnZW5lcmljVHlwZSBpbnN0YW5jZW9mIENsYXNzICYmIGdlbmVyaWNUeXBlICE9IEpBWEJFbGVtZW50LmNsYXNzKSB7CisgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiBjbGF6eiA9IChDbGFzczw/PikgZ2VuZXJpY1R5cGU7CisgICAgICAgICAgICBpZiAoY2xhenouaXNBcnJheSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9nZXRFbnRpdHlDbGFzcyhjbGF6ei5nZXRDb21wb25lbnRUeXBlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGNsYXp6OworICAgICAgICB9IGVsc2UgaWYgKGdlbmVyaWNUeXBlIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFR5cGUpIHsKKyAgICAgICAgICAgIGZpbmFsIFBhcmFtZXRlcml6ZWRUeXBlIHBhcmFtZXRlcml6ZWRUeXBlID0gKFBhcmFtZXRlcml6ZWRUeXBlKSBnZW5lcmljVHlwZTsKKyAgICAgICAgICAgIGZpbmFsIFR5cGVbXSBhcmd1bWVudHMgPSBwYXJhbWV0ZXJpemVkVHlwZS5nZXRBY3R1YWxUeXBlQXJndW1lbnRzKCk7CisKKyAgICAgICAgICAgIGZpbmFsIFR5cGUgdHlwZSA9IHBhcmFtZXRlcml6ZWRUeXBlLmdldFJhd1R5cGUoKSA9PSBNYXAuY2xhc3MgPyBhcmd1bWVudHNbMV0gOiBhcmd1bWVudHNbMF07CisgICAgICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRUeXBlKSB7CisgICAgICAgICAgICAgICAgZmluYWwgVHlwZSByYXdUeXBlID0gKChQYXJhbWV0ZXJpemVkVHlwZSkgdHlwZSkuZ2V0UmF3VHlwZSgpOworICAgICAgICAgICAgICAgIGlmIChyYXdUeXBlID09IEpBWEJFbGVtZW50LmNsYXNzKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBfZ2V0RW50aXR5Q2xhc3ModHlwZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlIGluc3RhbmNlb2YgV2lsZGNhcmRUeXBlKSB7CisgICAgICAgICAgICAgICAgZmluYWwgVHlwZVtdIHVwcGVyVHlwZXMgPSAoKFdpbGRjYXJkVHlwZSkgdHlwZSkuZ2V0VXBwZXJCb3VuZHMoKTsKKyAgICAgICAgICAgICAgICBpZiAodXBwZXJUeXBlcy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFR5cGUgdXBwZXJUeXBlID0gdXBwZXJUeXBlc1swXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHVwcGVyVHlwZSBpbnN0YW5jZW9mIENsYXNzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKENsYXNzPD8+KSB1cHBlclR5cGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKEpBWEJFbGVtZW50LmNsYXNzID09IHR5cGUKKyAgICAgICAgICAgICAgICAgICAgfHwgdHlwZSBpbnN0YW5jZW9mIFR5cGVWYXJpYWJsZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuY2xhc3M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvL25vaW5zcGVjdGlvbiBDb25zdGFudENvbmRpdGlvbnMKKyAgICAgICAgICAgIHJldHVybiAoQ2xhc3M8Pz4pIHR5cGU7CisgICAgICAgIH0gZWxzZSBpZiAoZ2VuZXJpY1R5cGUgaW5zdGFuY2VvZiBHZW5lcmljQXJyYXlUeXBlKSB7CisgICAgICAgICAgICBmaW5hbCBHZW5lcmljQXJyYXlUeXBlIGdlbmVyaWNBcnJheVR5cGUgPSAoR2VuZXJpY0FycmF5VHlwZSkgZ2VuZXJpY1R5cGU7CisgICAgICAgICAgICByZXR1cm4gX2dldEVudGl0eUNsYXNzKGdlbmVyaWNBcnJheVR5cGUuZ2V0R2VuZXJpY0NvbXBvbmVudFR5cGUoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmNsYXNzOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGFjY2Vzc29yIG1ldGhvZCBtYXBwaW5ncyAoZmllbGQgLT4gZ2V0dGVyL3NldHRlcikgZm9yIGdpdmVuIGNsYXNzLgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXp6IGVudGl0eSBjbGFzcyB0byBvYnRhaW4gcHJvcGVydHkgbWV0aG9kcyBmb3IuCisgICAgICogQHBhcmFtIGlzR2V0dGVyIGZsYWcgZGV0ZXJtaW5pbmcgd2hldGhlciB0byBsb29rIGZvciBnZXR0ZXJzIG9yIHNldHRlcnMuCisgICAgICogQHJldHVybiBub24tbnVsbCBtYXAgb2YgZmllbGQtYWNjZXNzb3IgbWFwcGluZ3MuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBNYXA8U3RyaW5nLCBNZXRob2Q+IGdldFByb3BlcnR5TWV0aG9kcyhmaW5hbCBDbGFzczw/PiBjbGF6eiwgZmluYWwgYm9vbGVhbiBpc0dldHRlcikgeworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBNZXRob2Q+IG1ldGhvZHMgPSBuZXcgSGFzaE1hcDw+KCk7CisKKyAgICAgICAgZm9yIChmaW5hbCBNZXRob2QgbWV0aG9kIDogQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoUmVmbGVjdGlvbkhlbHBlci5nZXREZWNsYXJlZE1ldGhvZHNQQShjbGF6eikpKSB7CisgICAgICAgICAgICBpZiAoKGlzR2V0dGVyICYmIFJlZmxlY3Rpb25IZWxwZXIuaXNHZXR0ZXIobWV0aG9kKSkKKyAgICAgICAgICAgICAgICAgICAgfHwgKCFpc0dldHRlciAmJiBSZWZsZWN0aW9uSGVscGVyLmlzU2V0dGVyKG1ldGhvZCkpKSB7CisKKyAgICAgICAgICAgICAgICBtZXRob2RzLnB1dChSZWZsZWN0aW9uSGVscGVyLmdldFByb3BlcnR5TmFtZShtZXRob2QpLCBtZXRob2QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZmluYWwgQ2xhc3M8Pz4gcGFyZW50ID0gY2xhenouZ2V0U3VwZXJjbGFzcygpOworICAgICAgICAvLyBXZSdyZSBpbnRlcmVzdGVkIGluIGZpZWxkcy9hY2Nlc3NvcnMgaW4gc3VwZXJjbGFzc2VzIGJ1dCBub3QgdGhvc2UgZnJvbSBpLmUuIE9iamVjdC9FbnVtLgorICAgICAgICBpZiAocGFyZW50ICE9IG51bGwgJiYgIXBhcmVudC5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoImphdmEubGFuZyIpKSB7CisgICAgICAgICAgICBtZXRob2RzLnB1dEFsbChnZXRQcm9wZXJ0eU1ldGhvZHMocGFyZW50LCBpc0dldHRlcikpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1ldGhvZHM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgc2V0IGNvbnRhaW5pbmcgZGVmYXVsdCBmaWx0ZXJpbmcgc2NvcGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGRlZmF1bHQgZmlsdGVyaW5nIHNjb3BlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU2V0PFN0cmluZz4gZ2V0RGVmYXVsdEZpbHRlcmluZ1Njb3BlKCkgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uKFNjb3BlUHJvdmlkZXIuREVGQVVMVF9TQ09QRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJldmVudCBpbnN0YW50aWF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgRmlsdGVyaW5nSGVscGVyKCkgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvc3BpL09iamVjdEdyYXBoLmphdmEgYi9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL3NwaS9PYmplY3RHcmFwaC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZjMyNmUKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL3NwaS9PYmplY3RHcmFwaC5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuc3BpOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIFJlYWQtb25seSBncmFwaCBjb250YWluaW5nIHJlcHJlc2VudGF0aW9ucyBvZiBhbiBlbnRpdHkgY2xhc3MgdGhhdCBzaG91bGQgYmUgcHJvY2Vzc2VkIGluIGVudGl0eS1maWx0ZXJpbmcuIFRoZQorICogcmVwcmVzZW50YXRpb25zIGFyZSB0d29mb2xkczogc2ltcGxlIChwcmltaXRpdmUvbm9uLWZpbHRlcmFibGUpIGZpZWxkcyBhbmQgZnVydGhlci1maWx0ZXJhYmxlIGZpZWxkcyAocmVwcmVzZW50ZWQgYnkKKyAqIHN1YmdyYXBocykuCisgKiA8cC8+CisgKiBPYmplY3QgZ3JhcGggaW5zdGFuY2VzIGFyZSBjcmVhdGVkIGZvciBlbnRpdHktZmlsdGVyaW5nIHNjb3BlcyB0aGF0IGFyZSBvYnRhaW5lZCBmcm9tIGVudGl0eSBhbm5vdGF0aW9ucywgY29uZmlndXJhdGlvbiBvcgorICogc2NvcGVzIGRlZmluZWQgb24gcmVzb3VyY2UgbWV0aG9kcyAvIGNsYXNzZXMgKG9uIHNlcnZlcikuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKiBAc2VlIE9iamVjdEdyYXBoVHJhbnNmb3JtZXIKKyAqIEBzZWUgU2NvcGVSZXNvbHZlcgorICovCitwdWJsaWMgaW50ZXJmYWNlIE9iamVjdEdyYXBoIHsKKworICAgIC8qKgorICAgICAqIEdldCBlbnRpdHkgZG9tYWluIGNsYXNzIG9mIHRoaXMgZ3JhcGguCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGVudGl0eSBkb21haW4gY2xhc3MuCisgICAgICovCisgICAgcHVibGljIENsYXNzPD8+IGdldEVudGl0eUNsYXNzKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBzZXQgb2YgYWxsIHNpbXBsZSAobm9uLWZpbHRlcmFibGUpIGZpZWxkcyBvZiBlbnRpdHkgY2xhc3MuIFZhbHVlIG9mIGVhY2ggb2YgdGhlc2UgZmllbGRzIGlzIGVpdGhlciBwcmltaXRpdmUgb3IKKyAgICAgKiB0aGUgZW50aXR5LWZpbHRlcmluZyBmZWF0dXJlIGNhbm5vdCBiZSBhcHBsaWVkIHRvIHRoaXMgZmllbGQuIFZhbHVlcyBvZiB0aGVzZSBmaWVsZHMgY2FuIGJlIGRpcmVjdGx5IHByb2Nlc3NlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbm9uLWZpbHRlcmFibGUgZmllbGRzLgorICAgICAqLworICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRGaWVsZHMoKTsKKworICAgIC8qKgorICAgICAqIEdldCBmaWVsZHMgd2l0aCB0aGUgZ2l2ZW4gcGFyZW50IHBhdGguIFRoZSBwYXJlbnQgcGF0aCwgd2hpY2ggbWF5IGV4aXN0IGluIHRoZSByZXF1ZXN0ZWQgZmlsdGVyaW5nIHNjb3BlcywgaXMKKyAgICAgKiB1c2VkIGZvciBjb250ZXh0IHRvIG1hdGNoIGFnYWluc3QgdGhlIGZpZWxkIGF0IHRoZSBzdWJncmFwaCBsZXZlbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgbmFtZSBvZiBwYXJlbnQgZmllbGQuCisgICAgICogQHJldHVybiBub24tZmlsdGVyYWJsZSBmaWVsZHMuCisgICAgICovCisgICAgcHVibGljIFNldDxTdHJpbmc+IGdldEZpZWxkcyhTdHJpbmcgcGFyZW50KTsKKworICAgIC8qKgorICAgICAqIEdldCBhIG1hcCBvZiBhbGwgZnVydGhlci1maWx0ZXJhYmxlIGZpZWxkcyBvZiBlbnRpdHkgY2xhc3MuIE1hcHBpbmdzIGFyZSByZXByZXNlbnRlZCBhczoKKyAgICAgKiA8cHJlPgorICAgICAqICZsdDtmaWVsZCZndDsgLSZndDsgJmx0O29iamVjdC1ncmFwaCZndDs8L3ByZT4KKyAgICAgKiBJdCBpcyBzdXBwb3NlZCB0aGF0IG9iamVjdCBncmFwaHMgY29udGFpbmVkIGluIHRoaXMgbWFwIHdvdWxkIGJlIHByb2Nlc3NlZCBmdXJ0aGVyLgorICAgICAqCisgICAgICogQHJldHVybiBmdXJ0aGVyLWZpbHRlcmFibGUgbWFwIG9mIGZpZWxkcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0R3JhcGg+IGdldFN1YmdyYXBocygpOworCisgICAgLyoqCisgICAgICogR2V0IHN1YmdyYXBocyB3aXRoIHRoZSBnaXZlbiBwYXJlbnQgcGF0aC4gVGhlIHBhcmVudCBwYXRoLCB3aGljaCBtYXkgZXhpc3QgaW4gdGhlIHJlcXVlc3RlZCBmaWx0ZXJpbmcgc2NvcGVzLCBpcworICAgICAqIHVzZWQgZm9yIGNvbnRleHQgdG8gbWF0Y2ggYWdhaW5zdCB0aGUgc3ViZ3JhcGggbGV2ZWwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50IG5hbWUgb2YgcGFyZW50IGZpZWxkLgorICAgICAqIEByZXR1cm4gZnVydGhlci1maWx0ZXJhYmxlIG1hcCBvZiBmaWVsZHMuCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0R3JhcGg+IGdldFN1YmdyYXBocyhTdHJpbmcgcGFyZW50KTsKK30KZGlmZiAtLWdpdCBhL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvc3BpL09iamVjdEdyYXBoVHJhbnNmb3JtZXIuamF2YSBiL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvc3BpL09iamVjdEdyYXBoVHJhbnNmb3JtZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzI2MWM3Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9zcGkvT2JqZWN0R3JhcGhUcmFuc2Zvcm1lci5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuc3BpOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkFic3RyYWN0QmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5Db250cmFjdDsKKworLyoqCisgKiBUaGlzIGNvbnRyYWN0IGJyaW5ncyBzdXBwb3J0IGZvciB0cmFuc2Zvcm1pbmcgYW4gaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgZW50aXR5IGRhdGEgZmlsdGVyaW5nIGZlYXR1cmUgaW50byBhbiBvYmplY3QKKyAqIGZhbWlsaWFyIHRvIHVuZGVybHlpbmcgcHJvdmlkZXIgKGUuZy4gbWVzc2FnZSBib2R5IHdvcmtlcikuCisgKiA8cD4KKyAqIFRoaXMgaW50ZXJmYWNlIGlzIHN1cHBvc2VkIHRvIGJlIGltcGxlbWVudGVkIGJ5IG1vZHVsZXMgcHJvdmlkaW5nIEpBWC1SUy9KZXJzZXkgcHJvdmlkZXJzIC8gY29uZmlndXJhdGlvbiBvYmplY3QgKGUuZy4gbWVzc2FnZQorICogYm9keSB3b3JrZXJzKSB0aGF0IGNhbiBkaXJlY3RseSBhZmZlY3QgcmVhZGluZy93cml0aW5nIG9mIGFuIGVudGl0eS4KKyAqIDwvcD4KKyAqIDxwPgorICogSW1wbGVtZW50YXRpb25zIHNob3VsZCBiZSByZWdpc3RlcmVkIGludG8gY2xpZW50L3NlcnZlciBydW50aW1lIHZpYQorICoge0BsaW5rIEFic3RyYWN0QmluZGVyIGplcnNleSBiaW5kZXJ9IChmb3IgbW9yZSBpbmZvcm1hdGlvbiBhbmQgY29tbW9uIGltcGxlbWVudGF0aW9uIHNlZQorICoge0BsaW5rIEFic3RyYWN0T2JqZWN0UHJvdmlkZXJ9KToKKyAqIDxwcmU+CisgKiBiaW5kQXNDb250cmFjdChNeU9iamVjdEdyYXBoVHJhbnNmb3JtZXIuY2xhc3MpCisgKiAgICAgICAvLyBGaWx0ZXJpbmdHcmFwaFRyYW5zZm9ybWVyLgorICogICAgICAgLnRvKG5ldyBUeXBlTGl0ZXJhbCZsdDtPYmplY3RHcmFwaFRyYW5zZm9ybWVyJmx0O015RmlsdGVyaW5nT2JqZWN0Jmd0OyZndDsoKSB7fSkKKyAqICAgICAgIC8vIFNjb3BlLgorICogICAgICAgLmluKFNpbmdsZXRvbi5jbGFzcyk7CisgKiA8L3ByZT4KKyAqIFRoZSBjdXN0b20gdHJhbnNmb3JtZXIgY2FuIGJlIHRoZW4ge0BsaW5rIGphdmF4LmluamVjdC5JbmplY3QgaW5qZWN0ZWR9IGFzIG9uZSB0aGVzZSBpbmplY3Rpb24gcG9pbnQgdHlwZXM6CisgKiA8dWw+CisgKiA8bGk+e0Bjb2RlIE15T2JqZWN0R3JhcGhUcmFuc2Zvcm1lcn08L2xpPgorICogPGxpPntAY29kZSBqYXZheC5pbmplY3QuUHJvdmlkZXImbHQ7T2JqZWN0R3JhcGhUcmFuc2Zvcm1lciZsdDtNeUZpbHRlcmluZ09iamVjdCZndDsmZ3Q7fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICogPHA+CisgKiBCeSBkZWZhdWx0IGEge0Bjb2RlIE9iamVjdEdyYXBofSAtJmd0OyB7QGNvZGUgT2JqZWN0R3JhcGh9IHRyYW5zZm9ybWVyIGlzIGF2YWlsYWJsZSBpbiB0aGUgcnVudGltZS4gVGhpcyB0cmFuc2Zvcm1lciBjYW4gYmUKKyAqIGluamVjdGVkICh2aWEge0BsaW5rIGphdmF4LmluamVjdC5JbmplY3QgQEluamVjdH0pIGludG8gdGhlIGZvbGxvd2luZyB0eXBlczoKKyAqIDx1bD4KKyAqIDxsaT57QGNvZGUgT2JqZWN0R3JhcGhUcmFuc2Zvcm1lcn08L2xpPgorICogPGxpPntAY29kZSBqYXZheC5pbmplY3QuUHJvdmlkZXImbHQ7T2JqZWN0R3JhcGhUcmFuc2Zvcm1lciZsdDtPYmplY3QmZ3Q7Jmd0O308L2xpPgorICogPGxpPntAY29kZSBqYXZheC5pbmplY3QuUHJvdmlkZXImbHQ7T2JqZWN0R3JhcGhUcmFuc2Zvcm1lciZsdDtPYmplY3RHcmFwaCZndDsmZ3Q7fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICoKKyAqIEBwYXJhbSA8VD4gcmVwcmVzZW50YXRpb24gb2YgZW50aXR5IGRhdGEgZmlsdGVyaW5nIHJlcXVlc3RlZCBieSBwcm92aWRlci4KKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICogQHNlZSBBYnN0cmFjdE9iamVjdFByb3ZpZGVyCisgKiBAc2VlIE9iamVjdFByb3ZpZGVyCisgKi8KK0BDb250cmFjdAorcHVibGljIGludGVyZmFjZSBPYmplY3RHcmFwaFRyYW5zZm9ybWVyPFQ+IHsKKworICAgIC8qKgorICAgICAqIFRyYW5zZm9ybSBhIGdpdmVuIGdyYXBoIGludG8gYW4gZW50aXR5LWZpbHRlcmluZyBvYmplY3QuIFRoZSBlbnRpcmUgZ3JhcGggKGluY2wuIGl0J3Mgc3ViZ3JhcGhzKSBzaG91bGQgYmUgcHJvY2Vzc2VkIGJ5CisgICAgICogdGhpcyBtZXRob2QgYXMgdGhpcyBtZXRob2QgaXMgaW52b2tlZCBvbmx5IG9uY2UgZm9yIGEgcm9vdCBlbnRpdHkgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZ3JhcGggb2JqZWN0IGdyYXBoIHRvIGJlIHRyYW5zZm9ybWVkLgorICAgICAqIEByZXR1cm4gZW50aXR5LWZpbHRlcmluZyBvYmplY3QgcmVxdWVzdGVkIGJ5IHByb3ZpZGVyLgorICAgICAqLworICAgIHB1YmxpYyBUIHRyYW5zZm9ybShmaW5hbCBPYmplY3RHcmFwaCBncmFwaCk7Cit9CmRpZmYgLS1naXQgYS9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL3NwaS9PYmplY3RQcm92aWRlci5qYXZhIGIvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9zcGkvT2JqZWN0UHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjJlNzdkCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9zcGkvT2JqZWN0UHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDkyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLnNwaTsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5BYnN0cmFjdEJpbmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuQ29udHJhY3Q7CisKKy8qKgorICogRW50cnkgcG9pbnQgb2YgRW50aXR5IERhdGEgRmlsdGVyaW5nIGZlYXR1cmUgZm9yIHByb3ZpZGVycyB3b3JraW5nIHdpdGggY3VzdG9tIGVudGl0aWVzIGFuZCBtZWRpYSB0eXBlcyAocmVhZGluZy93cml0aW5nKS4KKyAqIEV4cG9zZWQgbWV0aG9kcyBhcmUgc3VwcG9zZWQgdG8gcHJvdmlkZSBhbiBlbnRpdHktZmlsdGVyaW5nIG9iamVjdCBvZiBkZWZpbmVkIHR5cGUgKGdlbmVyaWMgcGFyYW1ldGVyIHR5cGUKKyAqIHtAY29kZSAmbHQ7VCZndDt9KSBmb3IgZ2l2ZW4gdHlwZXMvY2xhc3NlcyB0aGF0IGlzIHJlcXVlc3RlZCBieSB1bmRlcmx5aW5nIHByb3ZpZGVyIChlLmcuIG1lc3NhZ2UgYm9keSB3b3JrZXIpLgorICogPHA+CisgKiBNZXRob2RzIGFyZSBhbHNvIGFjY2VwdGluZyBhIGxpc3Qgb2YgZW50aXR5IGFubm90YXRpb25zIHdoaWNoIGVudGl0eS1maWx0ZXJpbmcgc2NvcGVzIGFuZCB0aGVuIHBhcnRpY3VsYXIgZW50aXR5LWZpbHRlcmluZworICogb2JqZWN0IGFyZSBkZXRlcm1pbmVkIGZyb20uIEVudGl0eSBhbm5vdGF0aW9ucyBjYW4gYmUgcGFzc2VkIHRvIHRoZSBydW50aW1lIHZpYToKKyAqIDx1bD4KKyAqIDxsaT57QGxpbmsgamF2YXgud3MucnMuY2xpZW50LkVudGl0eSNlbnRpdHkoT2JqZWN0LCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZSwgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbltdKX0gb24gdGhlCisgKiBjbGllbnQsIG9yPC9saT4KKyAqIDxsaT57QGxpbmsgamF2YXgud3MucnMuY29yZS5SZXNwb25zZS5SZXNwb25zZUJ1aWxkZXIjZW50aXR5KE9iamVjdCwgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbltdKX0gb24gdGhlIHNlcnZlcjwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICogPHA+CisgKiBDdXN0b20gaW1wbGVtZW50YXRpb25zIHNob3VsZCwgZHVyaW5nIHByb2Nlc3NpbmcsIGxvb2sgdXAgZm9yIGF2YWlsYWJsZSB7QGxpbmsgRW50aXR5UHJvY2Vzc29yIGVudGl0eSBwcm9jZXNzb3JzfSB0byBleGFtaW5lCisgKiBnaXZlbiBlbnRpdHkgY2xhc3NlcyBhbmQge0BsaW5rIFNjb3BlUmVzb2x2ZXIgc2NvcGUgcHJvdmlkZXJzfSB0byBkZXRlcm1pbmUgdGhlIGN1cnJlbnQgZW50aXR5LWZpbHRlcmluZyBzY29wZS4gRW50aXR5IGNsYXNzCisgKiBhbmQgZW50aXR5LWZpbHRlcmluZyBzY29wZXMgZGV0ZXJtaW5lIHRoZSB7QGxpbmsgT2JqZWN0R3JhcGggb2JqZWN0IGdyYXBofSBwYXNzZWQgdG8ge0BsaW5rIE9iamVjdEdyYXBoVHJhbnNmb3JtZXIgb2JqZWN0IGdyYXBoCisgKiB0cmFuc2Zvcm1lcn0gYW5kIGhlbmNlIHRoZSByZXN1bHRpbmcgZW50aXR5LWZpbHRlcmluZyBvYmplY3QuCisgKiA8L3A+CisgKiA8cD4KKyAqIEltcGxlbWVudGF0aW9ucyBzaG91bGQgYmUgcmVnaXN0ZXJlZCBpbnRvIGNsaWVudC9zZXJ2ZXIgcnVudGltZSB2aWEKKyAqIHtAbGluayBBYnN0cmFjdEJpbmRlciBqZXJzZXkgYmluZGVyfSAoZm9yIG1vcmUgaW5mb3JtYXRpb24gYW5kIGNvbW1vbiBpbXBsZW1lbnRhdGlvbiBzZWUKKyAqIHtAbGluayBBYnN0cmFjdE9iamVjdFByb3ZpZGVyfSk6CisgKiA8cHJlPgorICogYmluZEFzQ29udHJhY3QoTXlPYmplY3RQcm92aWRlci5jbGFzcykKKyAqICAgICAgIC8vIEZpbHRlcmluZ0dyYXBoVHJhbnNmb3JtZXIuCisgKiAgICAgICAudG8obmV3IFR5cGVMaXRlcmFsJmx0O09iamVjdEdyYXBoVHJhbnNmb3JtZXImbHQ7TXlGaWx0ZXJpbmdPYmplY3QmZ3Q7Jmd0OygpIHt9KQorICogICAgICAgLy8gU2NvcGUuCisgKiAgICAgICAuaW4oU2luZ2xldG9uLmNsYXNzKTsKKyAqIDwvcHJlPgorICogVGhlIGN1c3RvbSBwcm92aWRlciBjYW4gYmUgdGhlbiB7QGxpbmsgamF2YXguaW5qZWN0LkluamVjdCBpbmplY3RlZH0gYXMgb25lIHRoZXNlIGluamVjdGlvbiBwb2ludCB0eXBlczoKKyAqIDx1bD4KKyAqIDxsaT57QGNvZGUgTXlPYmplY3RQcm92aWRlcn08L2xpPgorICogPGxpPntAY29kZSBqYXZheC5pbmplY3QuUHJvdmlkZXImbHQ7T2JqZWN0UHJvdmlkZXImbHQ7TXlGaWx0ZXJpbmdPYmplY3QmZ3Q7Jmd0O308L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqIDxwPgorICogQnkgZGVmYXVsdCBhIHtAY29kZSBPYmplY3RHcmFwaH0gcHJvdmlkZXIgaXMgYXZhaWxhYmxlIGluIHRoZSBydW50aW1lLiBUaGlzIG9iamVjdCBwcm92aWRlciBjYW4gYmUgaW5qZWN0ZWQgKHZpYQorICoge0BsaW5rIGphdmF4LmluamVjdC5JbmplY3QgQEluamVjdH0pIGludG8gdGhlIGZvbGxvd2luZyB0eXBlczoKKyAqIDx1bD4KKyAqIDxsaT57QGNvZGUgT2JqZWN0UHJvdmlkZXJ9PC9saT4KKyAqIDxsaT57QGNvZGUgamF2YXguaW5qZWN0LlByb3ZpZGVyJmx0O09iamVjdFByb3ZpZGVyJmx0O09iamVjdCZndDsmZ3Q7fTwvbGk+CisgKiA8bGk+e0Bjb2RlIGphdmF4LmluamVjdC5Qcm92aWRlciZsdDtPYmplY3RQcm92aWRlciZsdDtPYmplY3RHcmFwaCZndDsmZ3Q7fTwvbGk+CisgKiA8L3VsPgorICogPC9wPgorICogPHA+CisgKiBOb3RlOiBGb3IgbW9zdCBvZiB0aGUgY2FzZXMgaXQgaXMgc3VmZmljaWVudCB0aGF0IHVzZXJzIGltcGxlbWVudCB7QGxpbmsgT2JqZWN0R3JhcGhUcmFuc2Zvcm1lciBvYmplY3QgZ3JhcGggdHJhbnNmb3JtZXJ9IGJ5CisgKiBleHRlbmRpbmcge0BsaW5rIEFic3RyYWN0T2JqZWN0UHJvdmlkZXJ9IGNsYXNzLgorICogPC9wPgorICoKKyAqIEBwYXJhbSA8VD4gcmVwcmVzZW50YXRpb24gb2YgZW50aXR5IGRhdGEgZmlsdGVyaW5nIHJlcXVlc3RlZCBieSBwcm92aWRlci4KKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICogQHNlZSBBYnN0cmFjdE9iamVjdFByb3ZpZGVyCisgKiBAc2VlIE9iamVjdEdyYXBoVHJhbnNmb3JtZXIKKyAqLworQENvbnRyYWN0CitwdWJsaWMgaW50ZXJmYWNlIE9iamVjdFByb3ZpZGVyPFQ+IHsKKworICAgIC8qKgorICAgICAqIEdldCByZWFkZXIvd3JpdGVyIGVudGl0eS1maWx0ZXJpbmcgb2JqZWN0IGZvciBnaXZlbiB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIGdlbmVyaWNUeXBlIHR5cGUgZm9yIHdoaWNoIHRoZSBvYmplY3QgaXMgcmVxdWVzdGVkLgorICAgICAqIEBwYXJhbSBmb3JXcml0ZXIgZmxhZyB0byBkZXRlcm1pbmUgd2hldGhlciB0byBjcmVhdGUgb2JqZWN0IGZvciByZWFkaW5nL3dyaXRpbmcgcHVycG9zZXMuCisgICAgICogQHBhcmFtIGFubm90YXRpb25zIGVudGl0eSBhbm5vdGF0aW9ucyB0byBkZXRlcm1pbmUgdGhlIHJ1bnRpbWUgc2NvcGUuCisgICAgICogQHJldHVybiBlbnRpdHktZmlsdGVyaW5nIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVCBnZXRGaWx0ZXJpbmdPYmplY3QoVHlwZSBnZW5lcmljVHlwZSwgYm9vbGVhbiBmb3JXcml0ZXIsIGZpbmFsIEFubm90YXRpb24uLi4gYW5ub3RhdGlvbnMpOworfQpkaWZmIC0tZ2l0IGEvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9zcGkvU2NvcGVQcm92aWRlci5qYXZhIGIvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9zcGkvU2NvcGVQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZDVjMTEKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL3NwaS9TY29wZVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5zcGk7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5FbnRpdHlGaWx0ZXJpbmc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLkNvbnRyYWN0OworCisvKioKKyAqIEVudHJ5IHBvaW50IGZvciBvYnRhaW5pbmcgZW50aXR5LWZpbHRlcmluZyBzY29wZXMgdXNlZCB0byBwcm9jZXNzIGEgcmVxdWVzdC9yZXNwb25zZSBlbnRpdHkuIEVudGl0eS1maWx0ZXJpbmcgc2NvcGVzIGFyZQorICogb2J0YWluZWQgZnJvbSAoc29ydGVkIGJ5IHByaW9yaXR5KToKKyAqIDx1bD4KKyAqIDxsaT5lbnRpdHkgYW5ub3RhdGlvbnMgLSBwcm92aWRlZCB3aXRoIGVudGl0eSB3aGVuIGNyZWF0aW5nIHJlcXVlc3QvcmVzcG9uc2U8L2xpPgorICogPGxpPmFubm90YXRpb25zIHN0b3JlZCB1bmRlcgorICoge0B2YWx1ZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5FbnRpdHlGaWx0ZXJpbmdGZWF0dXJlI0VOVElUWV9GSUxURVJJTkdfU0NPUEV9IHByb3BlcnR5IG9idGFpbmVkIGZyb20KKyAqIHtAbGluayBqYXZheC5zZWN1cml0eS5hdXRoLmxvZ2luLkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbn0KKyAqIDwvbGk+CisgKiA8bGk+ZW50aXR5LWZpbHRlcmluZyBhbm5vdGF0aW9ucyBwcmVzZW50IG9uIHJlc291cmNlIG1ldGhvZHMvY2xhc3NlcyAob24gc2VydmVyKTwvbGk+CisgKiA8L3VsPgorICogPHAvPgorICogTm90ZTogRGVmaW5pdGlvbiBvZiBlbnRpdHktZmlsdGVyaW5nIHNjb3BlcyBjYW4gYmUgZm91bmQgaW4ge0BsaW5rIFNjb3BlUmVzb2x2ZXJ9LgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICogQHNlZSBTY29wZVJlc29sdmVyCisgKi8KK0BDb250cmFjdAorcHVibGljIGludGVyZmFjZSBTY29wZVByb3ZpZGVyIHsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgZW50aXR5LWZpbHRlcmluZyBzY29wZS4KKyAgICAgKiA8cC8+CisgICAgICogRGVmYXVsdCBzY29wZSBpcyB1c2VkIGluIHtAbGluayBPYmplY3RHcmFwaCBvYmplY3QgZ3JhcGh9IHRvIHJldHJpZXZlIGEgc3ViZ3JhcGggaW5zdGFuY2UgYXQgdGhlIG1vbWVudCBzdWJncmFwaCdzIGVudGl0eQorICAgICAqIGNsYXNzIGRvZXMgbm90IGRlZmluZSBhbnkgZW50aXR5LWZpbHRlcmluZyBzY29wZSB0aGUgb2JqZWN0IGdyYXBoIHdhcyBjcmVhdGVkIGZvci4KKyAgICAgKiA8cC8+CisgICAgICogVGhpcyBzY29wZSBpcyBjcmVhdGVkIGZvciBhbiB7QGxpbmsgRW50aXR5R3JhcGggZW50aXR5IGdyYXBofSBpZiBubyBvdGhlciBlbnRpdHktZmlsdGVyaW5nIC8gc2VjdXJpdHkgYW5ub3RhdGlvbiBpcyBwcmVzZW50CisgICAgICogb24gYSBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1NDT1BFID0gRW50aXR5RmlsdGVyaW5nLmNsYXNzLmdldE5hbWUoKTsKKworICAgIC8qKgorICAgICAqIEdldCBlbnRpdHktZmlsdGVyaW5nIHNjb3BlcyB0byBiZSB1c2VkIHRvIHByb2Nlc3MgYW4gZW50aXR5LgorICAgICAqCisgICAgICogQHBhcmFtIGVudGl0eUFubm90YXRpb25zIGVudGl0eSBhbm5vdGF0aW9ucyBwcm92aWRlZCB3aXRoIGVudGl0eSB3aGVuIGNyZWF0aW5nIHJlcXVlc3QvcmVzcG9uc2UuCisgICAgICogQHBhcmFtIGRlZmF1bHRJZk5vdEZvdW5kIGZsYWcgZGV0ZXJtaW5pbmcgd2hldGhlciB0aGUgZGVmYXVsdCBlbnRpdHktZmlsdGVyaW5nIHNjb3BlIHNob3VsZCBiZSByZXR1cm5lZCBpZiBubyBvdGhlcgorICAgICAqIHNjb3BlIGNhbiBiZSBvYnRhaW5lZC4KKyAgICAgKiBAcmV0dXJuIG5vbi1udWxsIGVudGl0eS1maWx0ZXJpbmcgc2NvcGVzLgorICAgICAqLworICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRGaWx0ZXJpbmdTY29wZXMoZmluYWwgQW5ub3RhdGlvbltdIGVudGl0eUFubm90YXRpb25zLCBmaW5hbCBib29sZWFuIGRlZmF1bHRJZk5vdEZvdW5kKTsKK30KZGlmZiAtLWdpdCBhL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvc3BpL1Njb3BlUmVzb2x2ZXIuamF2YSBiL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvc3BpL1Njb3BlUmVzb2x2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTQwM2QyCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9zcGkvU2NvcGVSZXNvbHZlci5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuc3BpOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLkNvbnRyYWN0OworCisvKioKKyAqIENsYXNzIHVzZWQgdG8gcmVzb2x2ZSBlbnRpdHktZmlsdGVyaW5nIHNjb3BlcyBmcm9tIGFubm90YXRpb25zLiBBbm5vdGF0aW9ucyBwYXNzZWQgdG8ge0Bjb2RlICNyZXNvbHZlKCl9IG1ldGhvZAorICogY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOiBlbnRpdHkgYW5ub3RhdGlvbnMgKHByb3ZpZGVkIHdoZW4gY3JlYXRpbmcgcmVxdWVzdC9yZXNwb25zZSBlbnRpdHkpLAorICogYW5ub3RhdGlvbnMgb2J0YWluZWQgZnJvbSB7QGxpbmsgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb259LCByZXNvdXJjZSBtZXRob2QgLyByZXNvdXJjZSBjbGFzcyBhbm5vdGF0aW9ucy4KKyAqIDxwLz4KKyAqIEVudGl0eS1maWx0ZXJpbmcgc2NvcGUgaXMgc3VwcG9zZWQgdG8gYmUgYW4gdW5pcXVlIHN0cmluZyB0aGF0IGNhbiBiZSBkZXJpdmVkIGZyb20gYW4gYW5ub3RhdGlvbnMgYW5kIHRoYXQgY2FuIGJlIGZ1cnRoZXIgdXNlZAorICogaW4gaW50ZXJuYWwgZW50aXR5IGRhdGEgZmlsdGVyaW5nIHN0cnVjdHVyZXMuIEV4YW1wbGVzIG9mIHN1Y2ggdW5pcXVlIHN0cmluZ3MgYXJlOgorICogPHVsPgorICogPGxpPjxjb2RlPkBNeURldGFpbGVkVmlldzwvY29kZT4gLSZndDsgPGNvZGU+bXkucGFja2FnZS5NeURldGFpbGVkVmlldzwvY29kZT48L2xpPgorICogPGxpPgorICogPGNvZGU+QFJvbGVzQWxsb3dlZCh7Im1hbmFnZXIiLCAidXNlciJ9KTwvY29kZT4gLSZndDsgPGNvZGU+amF2YXguYW5ub3RhdGlvbi5zZWN1cml0eS5Sb2xlc0FsbG93ZWRfbWFuYWdlcjwvY29kZT4gYW5kCisgKiA8Y29kZT5qYXZheC5hbm5vdGF0aW9uLnNlY3VyaXR5LlJvbGVzQWxsb3dlZF91c2VyPC9jb2RlPgorICogPC9saT4KKyAqIDwvdWw+CisgKiA8cC8+CisgKiB7QGxpbmsgU2NvcGVSZXNvbHZlciBTY29wZSByZXNvbHZlcnN9IGFyZSBpbnZva2VkIGZyb20ge0BsaW5rIFNjb3BlUHJvdmlkZXIgc2NvcGUgcHJvdmlkZXJ9IGluc3RhbmNlLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAQ29udHJhY3QKK3B1YmxpYyBpbnRlcmZhY2UgU2NvcGVSZXNvbHZlciB7CisKKyAgICAvKioKKyAgICAgKiBSZXNvbHZlIGVudGl0eS1maWx0ZXJpbmcgc2NvcGVzIGZvciBnaXZlbiBhbm5vdGF0aW9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbm5vdGF0aW9ucyBsaXN0IG9mIGFyYml0cmFyeSBhbm5vdGF0aW9ucy4KKyAgICAgKiBAcmV0dXJuIG5vbi1udWxsIHNldCBvZiBlbnRpdHktZmlsdGVyaW5nIHNjb3Blcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2V0PFN0cmluZz4gcmVzb2x2ZShmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMpOworfQpkaWZmIC0tZ2l0IGEvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9zcGkvcGFja2FnZS1pbmZvLmphdmEgYi9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL3NwaS9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTBkYmE3Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9zcGkvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoqCisgKiBTUEkgZm9yIEVudGl0eSBEYXRhIEZpbHRlcmluZyBpbiBKZXJzZXkuCisgKiA8cC8+CisgKiBUbyBjcmVhdGUgYSBjdXN0b20gZW50aXR5LWZpbHRlcmluZyBhbm5vdGF0aW9uIHdpdGggc3BlY2lhbCBoYW5kbGluZyAoZS5nLiBmaWVsZCBhZ2dyZWdhdG9yIGFubm90YXRpb24gdXNlZCB0byBhbm5vdGF0ZQorICogY2xhc3NlcyksIHJlZmVyIHRvOgorICogPHVsPgorICogPGxpPntAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5zcGkuRW50aXR5UHJvY2Vzc29yfTwvbGk+CisgKiA8bGk+e0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLnNwaS5BYnN0cmFjdEVudGl0eVByb2Nlc3Nvcn08L2xpPgorICogPGxpPntAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5zcGkuU2NvcGVSZXNvbHZlcn08L2xpPgorICogPC91bD4KKyAqIDxwLz4KKyAqIFRvIHN1cHBvcnQgRW50aXR5IERhdGEgRmlsdGVyaW5nIGluIGN1c3RvbSBwcm92aWRlcnMgKGUuZy4gbWVzc2FnZSBib2R5IHdvcmtlcnMpLCByZWZlciB0bzoKKyAqIDx1bD4KKyAqIDxsaT57QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuc3BpLk9iamVjdFByb3ZpZGVyfTwvbGk+CisgKiA8bGk+e0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLnNwaS5PYmplY3RHcmFwaFRyYW5zZm9ybWVyfTwvbGk+CisgKiA8bGk+e0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLnNwaS5BYnN0cmFjdE9iamVjdFByb3ZpZGVyfTwvbGk+CisgKiA8L3VsPgorICogPHAvPgorICoKKyAqIEBzaW5jZSAyLjMKKyAqLworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5zcGk7CmRpZmYgLS1naXQgYS9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvaW50ZXJuYWwvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMgYi9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvaW50ZXJuYWwvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY1NjY5NgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9pbnRlcm5hbC9sb2NhbGl6YXRpb24ucHJvcGVydGllcwpAQCAtMCwwICsxLDE5IEBACisjCisjIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorIworIyBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisjIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyMgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisjIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyMKKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisjCisKKyMgezB9IC0gdmFsdWUgb2YgdGhlIHByb3BlcnR5CitlbnRpdHkuZmlsdGVyaW5nLnNjb3BlLm5vdC5hbm5vdGF0aW9ucz1UaGUgZW50aXR5LWZpbHRlcmluZyBzY29wZSBwcm9wZXJ0eSBkb2VzIG5vdCBjb250YWluIGFuIGluc3RhbmNlIG9mIEFubm90YXRpb24gb3IgQW5ub3RhdGlvbltdICh7MH0pLgorbWVyZ2luZy5maWx0ZXJpbmcuc2NvcGVzPU1lcmdpbmcgdHdvIHNldHMgb2YgZW50aXR5LWZpbHRlcmluZyBzY29wZXMgb2J0YWluZWQgZnJvbSB0d28gZGlmZmVyZW50IHNjb3BlIHJlc29sdmVycy4KZGlmZiAtLWdpdCBhL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvRGVueUFsbEVudGl0eS5qYXZhIGIvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9EZW55QWxsRW50aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ5MjJjNgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvRGVueUFsbEVudGl0eS5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmc7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLnNlY3VyaXR5LkRlbnlBbGw7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BEZW55QWxsCitwdWJsaWMgY2xhc3MgRGVueUFsbEVudGl0eSB7CisKKyAgICBwcml2YXRlIFN0cmluZyBmaWVsZDsKKworICAgIEBEZW55QWxsCisgICAgcHVibGljIFN0cmluZyBnZXRGaWVsZCgpIHsKKyAgICAgICAgcmV0dXJuIGZpZWxkOworICAgIH0KKworICAgIEBEZW55QWxsCisgICAgcHVibGljIHZvaWQgc2V0RmllbGQoZmluYWwgU3RyaW5nIGZpZWxkKSB7CisgICAgICAgIHRoaXMuZmllbGQgPSBmaWVsZDsKKyAgICB9CisKKyAgICBARGVueUFsbAorICAgIHB1YmxpYyBTdWJFbnRpdHkgZ2V0U3ViZ3JhcGgoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBEZW55QWxsCisgICAgcHVibGljIHZvaWQgc2V0U3ViZ3JhcGgoZmluYWwgU3ViRW50aXR5IHN1YmdyYXBoKSB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9QZXJtaXRBbGxFbnRpdHkuamF2YSBiL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvUGVybWl0QWxsRW50aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE5NWFkYgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvUGVybWl0QWxsRW50aXR5LmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZzsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uc2VjdXJpdHkuUGVybWl0QWxsOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUGVybWl0QWxsCitwdWJsaWMgY2xhc3MgUGVybWl0QWxsRW50aXR5IHsKKworICAgIHByaXZhdGUgU3RyaW5nIGZpZWxkOworCisgICAgQFBlcm1pdEFsbAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmllbGQoKSB7CisgICAgICAgIHJldHVybiBmaWVsZDsKKyAgICB9CisKKyAgICBAUGVybWl0QWxsCisgICAgcHVibGljIHZvaWQgc2V0RmllbGQoZmluYWwgU3RyaW5nIGZpZWxkKSB7CisgICAgICAgIHRoaXMuZmllbGQgPSBmaWVsZDsKKyAgICB9CisKKyAgICBAUGVybWl0QWxsCisgICAgcHVibGljIFN1YkVudGl0eSBnZXRTdWJncmFwaCgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQFBlcm1pdEFsbAorICAgIHB1YmxpYyB2b2lkIHNldFN1YmdyYXBoKGZpbmFsIFN1YkVudGl0eSBzdWJncmFwaCkgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvUm9sZXNBbGxvd2VkRW50aXR5LmphdmEgYi9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL1JvbGVzQWxsb3dlZEVudGl0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MmVmOWQKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL1JvbGVzQWxsb3dlZEVudGl0eS5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmc7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLnNlY3VyaXR5LlJvbGVzQWxsb3dlZDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFJvbGVzQWxsb3dlZCh7Im1hbmFnZXIiLCAiY2xpZW50In0pCitwdWJsaWMgY2xhc3MgUm9sZXNBbGxvd2VkRW50aXR5IHsKKworICAgIHByaXZhdGUgU3RyaW5nIGZpZWxkOworCisgICAgQFJvbGVzQWxsb3dlZCgibWFuYWdlciIpCisgICAgcHVibGljIFN0cmluZyBnZXRGaWVsZCgpIHsKKyAgICAgICAgcmV0dXJuIGZpZWxkOworICAgIH0KKworICAgIEBSb2xlc0FsbG93ZWQoImNsaWVudCIpCisgICAgcHVibGljIHZvaWQgc2V0RmllbGQoZmluYWwgU3RyaW5nIGZpZWxkKSB7CisgICAgICAgIHRoaXMuZmllbGQgPSBmaWVsZDsKKyAgICB9CisKKyAgICBAUm9sZXNBbGxvd2VkKCJtYW5hZ2VyIikKKyAgICBwdWJsaWMgU3ViRW50aXR5IGdldFN1YmdyYXBoKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAUm9sZXNBbGxvd2VkKCJjbGllbnQiKQorICAgIHB1YmxpYyB2b2lkIHNldFN1YmdyYXBoKGZpbmFsIFN1YkVudGl0eSBzdWJncmFwaCkgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvU2VjdXJpdHlBbm5vdGF0aW9uc1Rlc3QuamF2YSBiL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvU2VjdXJpdHlBbm5vdGF0aW9uc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzVmYTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9TZWN1cml0eUFubm90YXRpb25zVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmc7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5TZWN1cml0eUFubm90YXRpb25zfSB1bml0IHRlc3RzLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgU2VjdXJpdHlBbm5vdGF0aW9uc1Rlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlUm9sZXNBbGxvd2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFRoYXQobmV3IFN0cmluZ1tdIHsibWFuYWdlciIsICJ1c2VyIn0sIGVxdWFsVG8oU2VjdXJpdHlBbm5vdGF0aW9ucy5yb2xlc0FsbG93ZWQoIm1hbmFnZXIiLCAidXNlciIpLnZhbHVlKCkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVSb2xlc0FsbG93ZWROZWdhdGl2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRUaGF0KG5ldyBTdHJpbmdbXSB7fSwgZXF1YWxUbyhTZWN1cml0eUFubm90YXRpb25zLnJvbGVzQWxsb3dlZCgoU3RyaW5nKSBudWxsKS52YWx1ZSgpKSk7CisgICAgICAgIGFzc2VydFRoYXQobmV3IFN0cmluZ1tdIHsibWFuYWdlciJ9LCBlcXVhbFRvKFNlY3VyaXR5QW5ub3RhdGlvbnMucm9sZXNBbGxvd2VkKCJtYW5hZ2VyIiwgbnVsbCkudmFsdWUoKSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9lbnRpdHktZmlsdGVyaW5nL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9maWx0ZXJpbmcvU2VjdXJpdHlFbnRpdHlQcm9jZXNzb3JUZXN0LmphdmEgYi9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL1NlY3VyaXR5RW50aXR5UHJvY2Vzc29yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZWRkYTQKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL1NlY3VyaXR5RW50aXR5UHJvY2Vzc29yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjI3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuc3BpLkVudGl0eUdyYXBoOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLnNwaS5FbnRpdHlQcm9jZXNzb3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuc3BpLkVudGl0eVByb2Nlc3NvckNvbnRleHQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuc3BpLkZpbHRlcmluZ0hlbHBlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5zcGkuU2NvcGVQcm92aWRlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuU2VjdXJpdHlFbnRpdHlQcm9jZXNzb3J9IHVuaXQgdGVzdHMuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJKYXZhRG9jIikKK3B1YmxpYyBjbGFzcyBTZWN1cml0eUVudGl0eVByb2Nlc3NvclRlc3QgeworCisgICAgcHJpdmF0ZSBTZWN1cml0eUVudGl0eVByb2Nlc3NvciBwcm9jZXNzb3I7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcHJvY2Vzc29yID0gbmV3IFNlY3VyaXR5RW50aXR5UHJvY2Vzc29yKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvY2Vzc1Blcm1pdEFsbENsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEVudGl0eUdyYXBoIGFjdHVhbCA9IG5ldyBFbnRpdHlHcmFwaEltcGwoUGVybWl0QWxsRW50aXR5LmNsYXNzKTsKKworICAgICAgICBmaW5hbCBFbnRpdHlHcmFwaCBleHBlY3RlZCA9IG5ldyBFbnRpdHlHcmFwaEltcGwoUGVybWl0QWxsRW50aXR5LmNsYXNzKTsKKyAgICAgICAgZXhwZWN0ZWQuYWRkRmlsdGVyaW5nU2NvcGVzKEZpbHRlcmluZ0hlbHBlci5nZXREZWZhdWx0RmlsdGVyaW5nU2NvcGUoKSk7CisKKyAgICAgICAgZm9yIChmaW5hbCBib29sZWFuIGZvcldyaXRlciA6IG5ldyBib29sZWFuW10ge3RydWUsIGZhbHNlfSkgeworICAgICAgICAgICAgZmluYWwgRW50aXR5UHJvY2Vzc29yLlJlc3VsdCByZXN1bHQgPSB0ZXN0UHJvY2Vzc0NsYXNzKFBlcm1pdEFsbEVudGl0eS5jbGFzcywgYWN0dWFsLCBmb3JXcml0ZXIpOworCisgICAgICAgICAgICBhc3NlcnRUaGF0KHJlc3VsdCwgZXF1YWxUbyhFbnRpdHlQcm9jZXNzb3IuUmVzdWx0LkFQUExZKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGFjdHVhbCwgZXF1YWxUbyhleHBlY3RlZCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvY2Vzc0RlbnlBbGxDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBFbnRpdHlHcmFwaCBhY3R1YWwgPSBuZXcgRW50aXR5R3JhcGhJbXBsKERlbnlBbGxFbnRpdHkuY2xhc3MpOworICAgICAgICBmaW5hbCBFbnRpdHlHcmFwaCBleHBlY3RlZCA9IG5ldyBFbnRpdHlHcmFwaEltcGwoRGVueUFsbEVudGl0eS5jbGFzcyk7CisKKyAgICAgICAgZm9yIChmaW5hbCBib29sZWFuIGZvcldyaXRlciA6IG5ldyBib29sZWFuW10ge3RydWUsIGZhbHNlfSkgeworICAgICAgICAgICAgZmluYWwgRW50aXR5UHJvY2Vzc29yLlJlc3VsdCByZXN1bHQgPSB0ZXN0UHJvY2Vzc0NsYXNzKERlbnlBbGxFbnRpdHkuY2xhc3MsIGFjdHVhbCwgZm9yV3JpdGVyKTsKKworICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXN1bHQsIGVxdWFsVG8oRW50aXR5UHJvY2Vzc29yLlJlc3VsdC5ST0xMQkFDSykpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChhY3R1YWwsIGVxdWFsVG8oZXhwZWN0ZWQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByb2Nlc3NSb2xlc0FsbG93ZWRDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBFbnRpdHlHcmFwaCBhY3R1YWwgPSBuZXcgRW50aXR5R3JhcGhJbXBsKFJvbGVzQWxsb3dlZEVudGl0eS5jbGFzcyk7CisKKyAgICAgICAgZmluYWwgRW50aXR5R3JhcGggZXhwZWN0ZWQgPSBuZXcgRW50aXR5R3JhcGhJbXBsKFJvbGVzQWxsb3dlZEVudGl0eS5jbGFzcyk7CisgICAgICAgIGV4cGVjdGVkLmFkZEZpbHRlcmluZ1Njb3BlcygKKyAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgICAgICAgICAgICAgU2VjdXJpdHlIZWxwZXIuZ2V0Um9sZXNBbGxvd2VkU2NvcGUoIm1hbmFnZXIiKSwgU2VjdXJpdHlIZWxwZXIuZ2V0Um9sZXNBbGxvd2VkU2NvcGUoImNsaWVudCIpKQorICAgICAgICAgICAgICAgICAgICAgIC5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSkpOworCisgICAgICAgIGZvciAoZmluYWwgYm9vbGVhbiBmb3JXcml0ZXIgOiBuZXcgYm9vbGVhbltdIHt0cnVlLCBmYWxzZX0pIHsKKyAgICAgICAgICAgIGZpbmFsIEVudGl0eVByb2Nlc3Nvci5SZXN1bHQgcmVzdWx0ID0gdGVzdFByb2Nlc3NDbGFzcyhSb2xlc0FsbG93ZWRFbnRpdHkuY2xhc3MsIGFjdHVhbCwgZm9yV3JpdGVyKTsKKworICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXN1bHQsIGVxdWFsVG8oRW50aXR5UHJvY2Vzc29yLlJlc3VsdC5BUFBMWSkpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChhY3R1YWwsIGVxdWFsVG8oZXhwZWN0ZWQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgRW50aXR5UHJvY2Vzc29yLlJlc3VsdCB0ZXN0UHJvY2Vzc0NsYXNzKGZpbmFsIENsYXNzPD8+IGNsYXp6LCBmaW5hbCBFbnRpdHlHcmFwaCBncmFwaCwgZmluYWwgYm9vbGVhbiBmb3JXcml0ZXIpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBmaW5hbCBFbnRpdHlQcm9jZXNzb3JDb250ZXh0IGNvbnRleHQgPSBuZXcgRW50aXR5UHJvY2Vzc29yQ29udGV4dEltcGwoCisgICAgICAgICAgICAgICAgZm9yV3JpdGVyID8gRW50aXR5UHJvY2Vzc29yQ29udGV4dC5UeXBlLkNMQVNTX1dSSVRFUiA6IEVudGl0eVByb2Nlc3NvckNvbnRleHQuVHlwZS5DTEFTU19SRUFERVIsCisgICAgICAgICAgICAgICAgY2xhenosIGdyYXBoKTsKKworICAgICAgICByZXR1cm4gcHJvY2Vzc29yLnByb2Nlc3MoY29udGV4dCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvY2Vzc1Blcm1pdEFsbFByb3BlcnRpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgRW50aXR5R3JhcGggYWN0dWFsID0gbmV3IEVudGl0eUdyYXBoSW1wbChQZXJtaXRBbGxFbnRpdHkuY2xhc3MpOworCisgICAgICAgIGZpbmFsIEVudGl0eUdyYXBoIGV4cGVjdGVkID0gbmV3IEVudGl0eUdyYXBoSW1wbChQZXJtaXRBbGxFbnRpdHkuY2xhc3MpOworICAgICAgICBleHBlY3RlZC5hZGRGaWVsZCgiZmllbGQiLCBTY29wZVByb3ZpZGVyLkRFRkFVTFRfU0NPUEUpOworCisgICAgICAgIGZvciAoZmluYWwgYm9vbGVhbiBmb3JXcml0ZXIgOiBuZXcgYm9vbGVhbltdIHt0cnVlLCBmYWxzZX0pIHsKKyAgICAgICAgICAgIGZpbmFsIEVudGl0eVByb2Nlc3Nvci5SZXN1bHQgcmVzdWx0ID0gdGVzdFByb2Nlc3NQcm9wZXJ0eShQZXJtaXRBbGxFbnRpdHkuY2xhc3MsIGFjdHVhbCwgZm9yV3JpdGVyKTsKKworICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXN1bHQsIGVxdWFsVG8oRW50aXR5UHJvY2Vzc29yLlJlc3VsdC5BUFBMWSkpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChhY3R1YWwsIGVxdWFsVG8oZXhwZWN0ZWQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByb2Nlc3NEZW55QWxsUHJvcGVydGllcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBFbnRpdHlHcmFwaCBhY3R1YWwgPSBuZXcgRW50aXR5R3JhcGhJbXBsKERlbnlBbGxFbnRpdHkuY2xhc3MpOworICAgICAgICBmaW5hbCBFbnRpdHlHcmFwaCBleHBlY3RlZCA9IG5ldyBFbnRpdHlHcmFwaEltcGwoRGVueUFsbEVudGl0eS5jbGFzcyk7CisKKyAgICAgICAgZm9yIChmaW5hbCBib29sZWFuIGZvcldyaXRlciA6IG5ldyBib29sZWFuW10ge3RydWUsIGZhbHNlfSkgeworICAgICAgICAgICAgZmluYWwgRW50aXR5UHJvY2Vzc29yLlJlc3VsdCByZXN1bHQgPSB0ZXN0UHJvY2Vzc1Byb3BlcnR5KERlbnlBbGxFbnRpdHkuY2xhc3MsIGFjdHVhbCwgZm9yV3JpdGVyKTsKKworICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXN1bHQsIGVxdWFsVG8oRW50aXR5UHJvY2Vzc29yLlJlc3VsdC5ST0xMQkFDSykpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChhY3R1YWwsIGVxdWFsVG8oZXhwZWN0ZWQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByb2Nlc3NSb2xlc0FsbG93ZWRQcm9wZXJ0aWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEVudGl0eUdyYXBoIGFjdHVhbCA9IG5ldyBFbnRpdHlHcmFwaEltcGwoUm9sZXNBbGxvd2VkRW50aXR5LmNsYXNzKTsKKyAgICAgICAgZmluYWwgRW50aXR5R3JhcGggZXhwZWN0ZWQgPSBuZXcgRW50aXR5R3JhcGhJbXBsKFJvbGVzQWxsb3dlZEVudGl0eS5jbGFzcyk7CisKKyAgICAgICAgZm9yIChmaW5hbCBib29sZWFuIGZvcldyaXRlciA6IG5ldyBib29sZWFuW10ge3RydWUsIGZhbHNlfSkgeworICAgICAgICAgICAgZmluYWwgRW50aXR5UHJvY2Vzc29yLlJlc3VsdCByZXN1bHQgPSB0ZXN0UHJvY2Vzc1Byb3BlcnR5KFJvbGVzQWxsb3dlZEVudGl0eS5jbGFzcywgYWN0dWFsLCBmb3JXcml0ZXIpOworCisgICAgICAgICAgICBpZiAoZm9yV3JpdGVyKSB7CisgICAgICAgICAgICAgICAgZXhwZWN0ZWQuYWRkRmllbGQoImZpZWxkIiwgU2VjdXJpdHlIZWxwZXIuZ2V0Um9sZXNBbGxvd2VkU2NvcGUoIm1hbmFnZXIiKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGV4cGVjdGVkLmFkZEZpZWxkKCJmaWVsZCIsIFNlY3VyaXR5SGVscGVyLmdldFJvbGVzQWxsb3dlZFNjb3BlKCJjbGllbnQiKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFzc2VydFRoYXQocmVzdWx0LCBlcXVhbFRvKEVudGl0eVByb2Nlc3Nvci5SZXN1bHQuQVBQTFkpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoYWN0dWFsLCBlcXVhbFRvKGV4cGVjdGVkKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIEVudGl0eVByb2Nlc3Nvci5SZXN1bHQgdGVzdFByb2Nlc3NQcm9wZXJ0eShmaW5hbCBDbGFzczw/PiBjbGF6eiwgZmluYWwgRW50aXR5R3JhcGggZ3JhcGgsIGZpbmFsIGJvb2xlYW4gZm9yV3JpdGVyKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgZmluYWwgRmllbGQgZmllbGQgPSBjbGF6ei5nZXREZWNsYXJlZEZpZWxkKCJmaWVsZCIpOworICAgICAgICBmaW5hbCBNZXRob2QgbWV0aG9kID0gZm9yV3JpdGVyID8gY2xhenouZ2V0TWV0aG9kKCJnZXRGaWVsZCIpIDogY2xhenouZ2V0TWV0aG9kKCJzZXRGaWVsZCIsIFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgZmluYWwgRW50aXR5UHJvY2Vzc29yQ29udGV4dCBjb250ZXh0ID0gbmV3IEVudGl0eVByb2Nlc3NvckNvbnRleHRJbXBsKAorICAgICAgICAgICAgICAgIGZvcldyaXRlciA/IEVudGl0eVByb2Nlc3NvckNvbnRleHQuVHlwZS5QUk9QRVJUWV9XUklURVIgOiBFbnRpdHlQcm9jZXNzb3JDb250ZXh0LlR5cGUuUFJPUEVSVFlfV1JJVEVSLAorICAgICAgICAgICAgICAgIGZpZWxkLCBtZXRob2QsIGdyYXBoKTsKKworICAgICAgICByZXR1cm4gcHJvY2Vzc29yLnByb2Nlc3MoY29udGV4dCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvY2Vzc1Blcm1pdEFsbEFjY2Vzc29ycygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBFbnRpdHlHcmFwaCBhY3R1YWwgPSBuZXcgRW50aXR5R3JhcGhJbXBsKFBlcm1pdEFsbEVudGl0eS5jbGFzcyk7CisgICAgICAgIGFjdHVhbC5hZGRGaWx0ZXJpbmdTY29wZXMoRmlsdGVyaW5nSGVscGVyLmdldERlZmF1bHRGaWx0ZXJpbmdTY29wZSgpKTsKKworICAgICAgICBmaW5hbCBFbnRpdHlHcmFwaCBleHBlY3RlZCA9IG5ldyBFbnRpdHlHcmFwaEltcGwoUGVybWl0QWxsRW50aXR5LmNsYXNzKTsKKyAgICAgICAgZXhwZWN0ZWQuYWRkRmlsdGVyaW5nU2NvcGVzKEZpbHRlcmluZ0hlbHBlci5nZXREZWZhdWx0RmlsdGVyaW5nU2NvcGUoKSk7CisgICAgICAgIGV4cGVjdGVkLmFkZFN1YmdyYXBoKCJzdWJncmFwaCIsIFN1YkVudGl0eS5jbGFzcywgU2NvcGVQcm92aWRlci5ERUZBVUxUX1NDT1BFKTsKKworICAgICAgICBmb3IgKGZpbmFsIGJvb2xlYW4gZm9yV3JpdGVyIDogbmV3IGJvb2xlYW5bXSB7dHJ1ZSwgZmFsc2V9KSB7CisgICAgICAgICAgICBmaW5hbCBFbnRpdHlQcm9jZXNzb3IuUmVzdWx0IHJlc3VsdCA9IHRlc3RQcm9jZXNzQWNjZXNzb3IoUGVybWl0QWxsRW50aXR5LmNsYXNzLCBhY3R1YWwsIGZvcldyaXRlcik7CisKKyAgICAgICAgICAgIGFzc2VydFRoYXQocmVzdWx0LCBlcXVhbFRvKEVudGl0eVByb2Nlc3Nvci5SZXN1bHQuQVBQTFkpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoYWN0dWFsLCBlcXVhbFRvKGV4cGVjdGVkKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9jZXNzRGVueUFsbEFjY2Vzc29ycygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBFbnRpdHlHcmFwaCBhY3R1YWwgPSBuZXcgRW50aXR5R3JhcGhJbXBsKERlbnlBbGxFbnRpdHkuY2xhc3MpOworICAgICAgICBmaW5hbCBFbnRpdHlHcmFwaCBleHBlY3RlZCA9IG5ldyBFbnRpdHlHcmFwaEltcGwoRGVueUFsbEVudGl0eS5jbGFzcyk7CisKKyAgICAgICAgZm9yIChmaW5hbCBib29sZWFuIGZvcldyaXRlciA6IG5ldyBib29sZWFuW10ge3RydWUsIGZhbHNlfSkgeworICAgICAgICAgICAgZmluYWwgRW50aXR5UHJvY2Vzc29yLlJlc3VsdCByZXN1bHQgPSB0ZXN0UHJvY2Vzc0FjY2Vzc29yKERlbnlBbGxFbnRpdHkuY2xhc3MsIGFjdHVhbCwgZm9yV3JpdGVyKTsKKworICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXN1bHQsIGVxdWFsVG8oRW50aXR5UHJvY2Vzc29yLlJlc3VsdC5ST0xMQkFDSykpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChhY3R1YWwsIGVxdWFsVG8oZXhwZWN0ZWQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByb2Nlc3NSb2xlc0FsbG93ZWRBY2Nlc3NvcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBFbnRpdHlHcmFwaCBhY3R1YWwgPSBuZXcgRW50aXR5R3JhcGhJbXBsKFJvbGVzQWxsb3dlZEVudGl0eS5jbGFzcyk7CisgICAgICAgIGZpbmFsIEVudGl0eUdyYXBoIGV4cGVjdGVkID0gbmV3IEVudGl0eUdyYXBoSW1wbChSb2xlc0FsbG93ZWRFbnRpdHkuY2xhc3MpOworCisgICAgICAgIGZvciAoZmluYWwgYm9vbGVhbiBmb3JXcml0ZXIgOiBuZXcgYm9vbGVhbltdIHt0cnVlLCBmYWxzZX0pIHsKKyAgICAgICAgICAgIGZpbmFsIEVudGl0eVByb2Nlc3Nvci5SZXN1bHQgcmVzdWx0ID0gdGVzdFByb2Nlc3NBY2Nlc3NvcihSb2xlc0FsbG93ZWRFbnRpdHkuY2xhc3MsIGFjdHVhbCwgZm9yV3JpdGVyKTsKKworICAgICAgICAgICAgaWYgKGZvcldyaXRlcikgeworICAgICAgICAgICAgICAgIGV4cGVjdGVkLmFkZFN1YmdyYXBoKCJzdWJncmFwaCIsIFN1YkVudGl0eS5jbGFzcywgU2VjdXJpdHlIZWxwZXIuZ2V0Um9sZXNBbGxvd2VkU2NvcGUoIm1hbmFnZXIiKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGV4cGVjdGVkLmFkZFN1YmdyYXBoKCJzdWJncmFwaCIsIFN1YkVudGl0eS5jbGFzcywgU2VjdXJpdHlIZWxwZXIuZ2V0Um9sZXNBbGxvd2VkU2NvcGUoImNsaWVudCIpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXN1bHQsIGVxdWFsVG8oRW50aXR5UHJvY2Vzc29yLlJlc3VsdC5BUFBMWSkpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChhY3R1YWwsIGVxdWFsVG8oZXhwZWN0ZWQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgRW50aXR5UHJvY2Vzc29yLlJlc3VsdCB0ZXN0UHJvY2Vzc0FjY2Vzc29yKGZpbmFsIENsYXNzPD8+IGNsYXp6LCBmaW5hbCBFbnRpdHlHcmFwaCBncmFwaCwgZmluYWwgYm9vbGVhbiBmb3JXcml0ZXIpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBmaW5hbCBNZXRob2QgbWV0aG9kID0gZm9yV3JpdGVyID8gY2xhenouZ2V0TWV0aG9kKCJnZXRTdWJncmFwaCIpIDogY2xhenouZ2V0TWV0aG9kKCJzZXRTdWJncmFwaCIsIFN1YkVudGl0eS5jbGFzcyk7CisKKyAgICAgICAgZmluYWwgRW50aXR5UHJvY2Vzc29yQ29udGV4dCBjb250ZXh0ID0gbmV3IEVudGl0eVByb2Nlc3NvckNvbnRleHRJbXBsKAorICAgICAgICAgICAgICAgIGZvcldyaXRlciA/IEVudGl0eVByb2Nlc3NvckNvbnRleHQuVHlwZS5QUk9QRVJUWV9XUklURVIgOiBFbnRpdHlQcm9jZXNzb3JDb250ZXh0LlR5cGUuUFJPUEVSVFlfV1JJVEVSLAorICAgICAgICAgICAgICAgIG1ldGhvZCwgZ3JhcGgpOworCisgICAgICAgIHJldHVybiBwcm9jZXNzb3IucHJvY2Vzcyhjb250ZXh0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL1NlY3VyaXR5SGVscGVyVGVzdC5qYXZhIGIvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9TZWN1cml0eUhlbHBlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODZiMWQzCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9TZWN1cml0eUhlbHBlclRlc3QuamF2YQpAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZzsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlNlY3VyaXR5Q29udGV4dDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uc2VjdXJpdHkuUm9sZXNBbGxvd2VkOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkN1c3RvbUFubm90YXRpb25MaXRlcmFsOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLnNwaS5GaWx0ZXJpbmdIZWxwZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5TZWN1cml0eUhlbHBlcn0gdW5pdCB0ZXN0cy4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIFNlY3VyaXR5SGVscGVyVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJpbmdTY29wZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zOworICAgICAgICBTZXQ8U3RyaW5nPiBleHBlY3RlZDsKKworICAgICAgICAvLyBFbXB0eSBhbm5vdGF0aW9ucy4KKyAgICAgICAgYW5ub3RhdGlvbnMgPSBuZXcgQW5ub3RhdGlvblswXTsKKyAgICAgICAgYXNzZXJ0VGhhdChTZWN1cml0eUhlbHBlci5nZXRGaWx0ZXJpbmdTY29wZXMoYW5ub3RhdGlvbnMpLCBlcXVhbFRvKENvbGxlY3Rpb25zLjxTdHJpbmc+ZW1wdHlTZXQoKSkpOworCisgICAgICAgIC8vIE5vdCBzZWN1cml0eSBhbm5vdGF0aW9ucy4KKyAgICAgICAgYW5ub3RhdGlvbnMgPSBuZXcgQW5ub3RhdGlvbltdIHtDdXN0b21Bbm5vdGF0aW9uTGl0ZXJhbC5JTlNUQU5DRSwgQ3VzdG9tQW5ub3RhdGlvbkxpdGVyYWwuSU5TVEFOQ0V9OworICAgICAgICBhc3NlcnRUaGF0KFNlY3VyaXR5SGVscGVyLmdldEZpbHRlcmluZ1Njb3Blcyhhbm5vdGF0aW9ucyksIGVxdWFsVG8oQ29sbGVjdGlvbnMuPFN0cmluZz5lbXB0eVNldCgpKSk7CisKKyAgICAgICAgLy8gTWl4ZWQuCisgICAgICAgIGFubm90YXRpb25zID0gbmV3IEFubm90YXRpb25bXSB7Q3VzdG9tQW5ub3RhdGlvbkxpdGVyYWwuSU5TVEFOQ0UsIFNlY3VyaXR5QW5ub3RhdGlvbnMKKyAgICAgICAgICAgICAgICAucm9sZXNBbGxvd2VkKCJtYW5hZ2VyIiksIEN1c3RvbUFubm90YXRpb25MaXRlcmFsLklOU1RBTkNFfTsKKyAgICAgICAgZXhwZWN0ZWQgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b24oUm9sZXNBbGxvd2VkLmNsYXNzLmdldE5hbWUoKSArICJfbWFuYWdlciIpOworICAgICAgICBhc3NlcnRUaGF0KFNlY3VyaXR5SGVscGVyLmdldEZpbHRlcmluZ1Njb3Blcyhhbm5vdGF0aW9ucyksIGVxdWFsVG8oZXhwZWN0ZWQpKTsKKworICAgICAgICAvLyBNdWx0aXBsZS4KKyAgICAgICAgYW5ub3RhdGlvbnMgPSBuZXcgQW5ub3RhdGlvbltdIHtTZWN1cml0eUFubm90YXRpb25zLnJvbGVzQWxsb3dlZCgibWFuYWdlciIsICJ1c2VyIil9OworICAgICAgICBleHBlY3RlZCA9IEFycmF5cy5hc0xpc3QoUm9sZXNBbGxvd2VkLmNsYXNzLmdldE5hbWUoKSArICJfbWFuYWdlciIsIFJvbGVzQWxsb3dlZC5jbGFzcy5nZXROYW1lKCkgKyAiX3VzZXIiKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSk7CisgICAgICAgIGFzc2VydFRoYXQoU2VjdXJpdHlIZWxwZXIuZ2V0RmlsdGVyaW5nU2NvcGVzKGFubm90YXRpb25zKSwgZXF1YWxUbyhleHBlY3RlZCkpOworCisgICAgICAgIC8vIFBlcm1pdEFsbCB3ZWlyZG8uCisgICAgICAgIGFubm90YXRpb25zID0gbmV3IEFubm90YXRpb25bXSB7U2VjdXJpdHlBbm5vdGF0aW9ucy5wZXJtaXRBbGwoKX07CisgICAgICAgIGFzc2VydFRoYXQoU2VjdXJpdHlIZWxwZXIuZ2V0RmlsdGVyaW5nU2NvcGVzKGFubm90YXRpb25zKSwgZXF1YWxUbyhGaWx0ZXJpbmdIZWxwZXIuZ2V0RGVmYXVsdEZpbHRlcmluZ1Njb3BlKCkpKTsKKworICAgICAgICAvLyBEZW55QWxsIHdlaXJkby4KKyAgICAgICAgYW5ub3RhdGlvbnMgPSBuZXcgQW5ub3RhdGlvbltdIHtTZWN1cml0eUFubm90YXRpb25zLmRlbnlBbGwoKX07CisgICAgICAgIGFzc2VydFRoYXQoU2VjdXJpdHlIZWxwZXIuZ2V0RmlsdGVyaW5nU2NvcGVzKGFubm90YXRpb25zKSwgZXF1YWxUbyhudWxsKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsdGVyaW5nU2NvcGVzV2l0aENvbnRleHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU2VjdXJpdHlDb250ZXh0IGNvbnRleHQgPSBuZXcgVGVzdFNlY3VyaXR5Q29udGV4dCgpOworCisgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9uczsKKyAgICAgICAgU2V0PFN0cmluZz4gZXhwZWN0ZWQ7CisKKyAgICAgICAgLy8gRW1wdHkgYW5ub3RhdGlvbnMuCisgICAgICAgIGFubm90YXRpb25zID0gbmV3IEFubm90YXRpb25bMF07CisgICAgICAgIGFzc2VydFRoYXQoU2VjdXJpdHlIZWxwZXIuZ2V0RmlsdGVyaW5nU2NvcGVzKGNvbnRleHQsIGFubm90YXRpb25zKSwgZXF1YWxUbyhDb2xsZWN0aW9ucy48U3RyaW5nPmVtcHR5U2V0KCkpKTsKKworICAgICAgICAvLyBOb3Qgc2VjdXJpdHkgYW5ub3RhdGlvbnMuCisgICAgICAgIGFubm90YXRpb25zID0gbmV3IEFubm90YXRpb25bXSB7Q3VzdG9tQW5ub3RhdGlvbkxpdGVyYWwuSU5TVEFOQ0UsIEN1c3RvbUFubm90YXRpb25MaXRlcmFsLklOU1RBTkNFfTsKKyAgICAgICAgYXNzZXJ0VGhhdChTZWN1cml0eUhlbHBlci5nZXRGaWx0ZXJpbmdTY29wZXMoY29udGV4dCwgYW5ub3RhdGlvbnMpLCBlcXVhbFRvKENvbGxlY3Rpb25zLjxTdHJpbmc+ZW1wdHlTZXQoKSkpOworCisgICAgICAgIC8vIE1peGVkLgorICAgICAgICBhbm5vdGF0aW9ucyA9IG5ldyBBbm5vdGF0aW9uW10ge0N1c3RvbUFubm90YXRpb25MaXRlcmFsLklOU1RBTkNFLCBTZWN1cml0eUFubm90YXRpb25zCisgICAgICAgICAgICAgICAgLnJvbGVzQWxsb3dlZCgibWFuYWdlciIpLCBDdXN0b21Bbm5vdGF0aW9uTGl0ZXJhbC5JTlNUQU5DRX07CisgICAgICAgIGV4cGVjdGVkID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uKFJvbGVzQWxsb3dlZC5jbGFzcy5nZXROYW1lKCkgKyAiX21hbmFnZXIiKTsKKyAgICAgICAgYXNzZXJ0VGhhdChTZWN1cml0eUhlbHBlci5nZXRGaWx0ZXJpbmdTY29wZXMoY29udGV4dCwgYW5ub3RhdGlvbnMpLCBlcXVhbFRvKGV4cGVjdGVkKSk7CisKKyAgICAgICAgLy8gTXVsdGlwbGUuCisgICAgICAgIGFubm90YXRpb25zID0gbmV3IEFubm90YXRpb25bXSB7U2VjdXJpdHlBbm5vdGF0aW9ucy5yb2xlc0FsbG93ZWQoImNsaWVudCIsICJ1c2VyIil9OworICAgICAgICBleHBlY3RlZCA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbihSb2xlc0FsbG93ZWQuY2xhc3MuZ2V0TmFtZSgpICsgIl91c2VyIik7CisgICAgICAgIGFzc2VydFRoYXQoU2VjdXJpdHlIZWxwZXIuZ2V0RmlsdGVyaW5nU2NvcGVzKGNvbnRleHQsIGFubm90YXRpb25zKSwgZXF1YWxUbyhleHBlY3RlZCkpOworCisgICAgICAgIC8vIFBlcm1pdEFsbCB3ZWlyZG8uCisgICAgICAgIGFubm90YXRpb25zID0gbmV3IEFubm90YXRpb25bXSB7U2VjdXJpdHlBbm5vdGF0aW9ucy5wZXJtaXRBbGwoKX07CisgICAgICAgIGFzc2VydFRoYXQoU2VjdXJpdHlIZWxwZXIuZ2V0RmlsdGVyaW5nU2NvcGVzKGNvbnRleHQsIGFubm90YXRpb25zKSwgZXF1YWxUbyhGaWx0ZXJpbmdIZWxwZXIuZ2V0RGVmYXVsdEZpbHRlcmluZ1Njb3BlKCkpKTsKKworICAgICAgICAvLyBEZW55QWxsIHdlaXJkby4KKyAgICAgICAgYW5ub3RhdGlvbnMgPSBuZXcgQW5ub3RhdGlvbltdIHtTZWN1cml0eUFubm90YXRpb25zLmRlbnlBbGwoKX07CisgICAgICAgIGFzc2VydFRoYXQoU2VjdXJpdHlIZWxwZXIuZ2V0RmlsdGVyaW5nU2NvcGVzKGNvbnRleHQsIGFubm90YXRpb25zKSwgZXF1YWxUbyhudWxsKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL1N1YkVudGl0eS5qYXZhIGIvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9TdWJFbnRpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODc0ZWI5Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9TdWJFbnRpdHkuamF2YQpAQCAtMCwwICsxLDI0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgU3ViRW50aXR5IHsKKworfQpkaWZmIC0tZ2l0IGEvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9UZXN0U2VjdXJpdHlDb250ZXh0LmphdmEgYi9leHQvZW50aXR5LWZpbHRlcmluZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvZmlsdGVyaW5nL1Rlc3RTZWN1cml0eUNvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTc1MzEyCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L2VudGl0eS1maWx0ZXJpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZXNzYWdlL2ZpbHRlcmluZy9UZXN0U2VjdXJpdHlDb250ZXh0LmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZzsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5TZWN1cml0eUNvbnRleHQ7CisKKy8qKgorKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyovCitjbGFzcyBUZXN0U2VjdXJpdHlDb250ZXh0IGltcGxlbWVudHMgU2VjdXJpdHlDb250ZXh0IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBQcmluY2lwYWwgZ2V0VXNlclByaW5jaXBhbCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQcmluY2lwYWwoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNVc2VySW5Sb2xlKGZpbmFsIFN0cmluZyByb2xlKSB7CisgICAgICAgIHJldHVybiAibWFuYWdlciIuZXF1YWxzKHJvbGUpIHx8ICJ1c2VyIi5lcXVhbHMocm9sZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNTZWN1cmUoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldEF1dGhlbnRpY2F0aW9uU2NoZW1lKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvbWV0YWluZi1zZXJ2aWNlcy9wb20ueG1sIGIvZXh0L21ldGFpbmYtc2VydmljZXMvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWVmNjhhCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L21ldGFpbmYtc2VydmljZXMvcG9tLnhtbApAQCAtMCwwICsxLDEwMiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1ldGFpbmYtc2VydmljZXM8L2FydGlmYWN0SWQ+CisgICAgPG5hbWU+amVyc2V5LWV4dC1tZXRhaW5mLXNlcnZpY2VzPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBKZXJzZXkgZXh0ZW5zaW9uIG1vZHVsZSBlbmFibGluZyBhdXRvbWF0aWMgcmVnaXN0cmF0aW9uIG9mIEpBWC1SUyBwcm92aWRlcnMgKE1CVy9NQlIvRU0pIHZpYSBNRVRBLUlORi9zZXJ2aWNlcyBtZWNoYW5pc20uCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGNsdWRpbmcgb25seSAqLnRlc3RzLiogcGFja2FnZXMgZm9yIHRoaXMgbW9kdWxlLiBBdCBsZWFzdCBvbmUgY2xhc3MgaGFzIHRvIGV4aXN0IGluIG5vbi1leGNsdWRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VzIHRvIGdlbmVyYXRlIHByb3BlciAtamF2YWRvYy5qYXIgZmlsZS4gU2VlIGh0dHBzOi8vamlyYS5jb2RlaGF1cy5vcmcvYnJvd3NlL01KQVZBRE9DLTMyOQorICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlUGFja2FnZU5hbWVzPioudGVzdHMuKjwvZXhjbHVkZVBhY2thZ2VOYW1lcz4KKyAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHNvdXJjZT4ke2phdmEudmVyc2lvbn08L3NvdXJjZT4KKyAgICAgICAgICAgICAgICAgICAgPHRhcmdldD4ke2phdmEudmVyc2lvbn08L3RhcmdldD4KKyAgICAgICAgICAgICAgICAgICAgPGNvbXBpbGVyQXJndW1lbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBEbyBub3Qgd2FybiBhYm91dCB1c2luZyBzdW4ubWlzYy5VbnNhZmUgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8WERpZ25vcmUuc3ltYm9sLmZpbGUgLz4KKyAgICAgICAgICAgICAgICAgICAgPC9jb21waWxlckFyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICAgICAgPHNob3dXYXJuaW5ncz5mYWxzZTwvc2hvd1dhcm5pbmdzPgorICAgICAgICAgICAgICAgICAgICA8Zm9yaz5mYWxzZTwvZm9yaz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi5pc3RhY2s8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4taXN0YWNrLWNvbW1vbnMtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJ1aWxkLWhlbHBlci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5mZWxpeDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1idW5kbGUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgICAgIDxleHRlbnNpb25zPnRydWU8L2V4dGVuc2lvbnM+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29tbW9uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItYnVuZGxlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHR5cGU+cG9tPC90eXBlPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9leHQvbWV0YWluZi1zZXJ2aWNlcy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NwaWRpc2NvdmVyeS9pbnRlcm5hbC9NZXRhSW5mU2VydmljZXNBdXRvRGlzY292ZXJhYmxlLmphdmEgYi9leHQvbWV0YWluZi1zZXJ2aWNlcy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NwaWRpc2NvdmVyeS9pbnRlcm5hbC9NZXRhSW5mU2VydmljZXNBdXRvRGlzY292ZXJhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE4YWNkMwotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9tZXRhaW5mLXNlcnZpY2VzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc3BpZGlzY292ZXJ5L2ludGVybmFsL01ldGFJbmZTZXJ2aWNlc0F1dG9EaXNjb3ZlcmFibGUuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaWRpc2NvdmVyeS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC53cy5ycy5SdW50aW1lVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmVDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5FeGNlcHRpb25NYXBwZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJpb3JpdHk7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5TZXJ2aWNlRmluZGVyQmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5BYnN0cmFjdEJpbmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5zcGkuQXV0b0Rpc2NvdmVyYWJsZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5zcGkuRm9yY2VkQXV0b0Rpc2NvdmVyYWJsZTsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFByaW9yaXR5KEF1dG9EaXNjb3ZlcmFibGUuREVGQVVMVF9QUklPUklUWSkKK3B1YmxpYyBjbGFzcyBNZXRhSW5mU2VydmljZXNBdXRvRGlzY292ZXJhYmxlIGltcGxlbWVudHMgRm9yY2VkQXV0b0Rpc2NvdmVyYWJsZSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoZmluYWwgRmVhdHVyZUNvbnRleHQgY29udGV4dCkgeworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBjb250ZXh0LmdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0aWVzKCk7CisgICAgICAgIGZpbmFsIFJ1bnRpbWVUeXBlIHJ1bnRpbWVUeXBlID0gY29udGV4dC5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UnVudGltZVR5cGUoKTsKKworICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKG5ldyBBYnN0cmFjdEJpbmRlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICAgICAgICAgIC8vIE1lc3NhZ2UgQm9keSBwcm92aWRlcnMuCisgICAgICAgICAgICAgICAgaW5zdGFsbChuZXcgU2VydmljZUZpbmRlckJpbmRlcjxNZXNzYWdlQm9keVJlYWRlcj4oTWVzc2FnZUJvZHlSZWFkZXIuY2xhc3MsIHByb3BlcnRpZXMsIHJ1bnRpbWVUeXBlKSk7CisgICAgICAgICAgICAgICAgaW5zdGFsbChuZXcgU2VydmljZUZpbmRlckJpbmRlcjxNZXNzYWdlQm9keVdyaXRlcj4oTWVzc2FnZUJvZHlXcml0ZXIuY2xhc3MsIHByb3BlcnRpZXMsIHJ1bnRpbWVUeXBlKSk7CisgICAgICAgICAgICAgICAgLy8gRXhjZXB0aW9uIE1hcHBlcnMuCisgICAgICAgICAgICAgICAgaW5zdGFsbChuZXcgU2VydmljZUZpbmRlckJpbmRlcjxFeGNlcHRpb25NYXBwZXI+KEV4Y2VwdGlvbk1hcHBlci5jbGFzcywgcHJvcGVydGllcywgcnVudGltZVR5cGUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L21ldGFpbmYtc2VydmljZXMvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnNwaS5Gb3JjZWRBdXRvRGlzY292ZXJhYmxlIGIvZXh0L21ldGFpbmYtc2VydmljZXMvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnNwaS5Gb3JjZWRBdXRvRGlzY292ZXJhYmxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0YzNlOTkKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvbWV0YWluZi1zZXJ2aWNlcy9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuc3BpLkZvcmNlZEF1dG9EaXNjb3ZlcmFibGUKQEAgLTAsMCArMSBAQAorb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpZGlzY292ZXJ5LmludGVybmFsLk1ldGFJbmZTZXJ2aWNlc0F1dG9EaXNjb3ZlcmFibGUKZGlmZiAtLWdpdCBhL2V4dC9tZXRhaW5mLXNlcnZpY2VzL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVzc2FnZS9NZXRhSW5mU2VydmljZXNUZXN0LmphdmEgYi9leHQvbWV0YWluZi1zZXJ2aWNlcy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvTWV0YUluZlNlcnZpY2VzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NjRlZjUKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvbWV0YWluZi1zZXJ2aWNlcy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lc3NhZ2UvTWV0YUluZlNlcnZpY2VzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTcyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2U7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworCitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLlJlYWRlcldyaXRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlN1aXRlOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUnVuV2l0aChTdWl0ZS5jbGFzcykKK0BTdWl0ZS5TdWl0ZUNsYXNzZXMoe01ldGFJbmZTZXJ2aWNlc1Rlc3QuRW5hYmxlLmNsYXNzLCBNZXRhSW5mU2VydmljZXNUZXN0LkRpc2FibGVTZXJ2ZXIuY2xhc3MsCisgICAgICAgIE1ldGFJbmZTZXJ2aWNlc1Rlc3QuRGlzYWJsZUNsaWVudC5jbGFzc30pCitwdWJsaWMgY2xhc3MgTWV0YUluZlNlcnZpY2VzVGVzdCB7CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1ldGFJbmYgeworCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlOworCisgICAgICAgIHB1YmxpYyBNZXRhSW5mKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1ldGFJbmZTZXJ2aWNlc1Jlc291cmNlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgTWV0YUluZiBwb3N0KGZpbmFsIE1ldGFJbmYgZW50aXR5KSB7CisgICAgICAgICAgICByZXR1cm4gZW50aXR5OworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNZXNzYWdlUHJvdmlkZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVJlYWRlcjxNZXRhSW5mPiwgTWVzc2FnZUJvZHlXcml0ZXI8TWV0YUluZj4geworCisgICAgICAgIEBDb250ZXh0CisgICAgICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbiBjb25maWc7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBNZXRhSW5mIHJlYWRGcm9tKGZpbmFsIENsYXNzPE1ldGFJbmY+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLCBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTWV0YUluZihSZWFkZXJXcml0ZXIucmVhZEZyb21Bc1N0cmluZyhlbnRpdHlTdHJlYW0sIG1lZGlhVHlwZSkKKyAgICAgICAgICAgICAgICAgICAgKyAiX3JlYWRfIiArIGNvbmZpZy5nZXRSdW50aW1lVHlwZSgpLm5hbWUoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKGZpbmFsIE1ldGFJbmYgcywgZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIE1ldGFJbmYgcywgZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUsIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZSgocy52YWx1ZSArICJfd3JpdGVfIiArIGNvbmZpZy5nZXRSdW50aW1lVHlwZSgpLm5hbWUoKSkuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEVuYWJsZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhNZXRhSW5mU2VydmljZXNSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0RW5hYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgicmVzb3VyY2UiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkudGV4dChuZXcgTWV0YUluZigiZm9vIikpKTsKKworICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoTWV0YUluZi5jbGFzcykudmFsdWUsCisgICAgICAgICAgICAgICAgICAgIGlzKCJmb29fd3JpdGVfQ0xJRU5UX3JlYWRfU0VSVkVSX3dyaXRlX1NFUlZFUl9yZWFkX0NMSUVOVCIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGlzYWJsZVNlcnZlciBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhNZXRhSW5mU2VydmljZXNSZXNvdXJjZS5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuRkVBVFVSRV9BVVRPX0RJU0NPVkVSWV9ESVNBQkxFLCB0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhYmxlU2VydmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgicmVzb3VyY2UiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkudGV4dChuZXcgTWV0YUluZigiZm9vIikpKTsKKworICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoTWV0YUluZi5jbGFzcykudmFsdWUsCisgICAgICAgICAgICAgICAgICAgIGlzKCJmb29fd3JpdGVfQ0xJRU5UX3JlYWRfU0VSVkVSX3dyaXRlX1NFUlZFUl9yZWFkX0NMSUVOVCIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGlzYWJsZUNsaWVudCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhNZXRhSW5mU2VydmljZXNSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KGZpbmFsIENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgICAgIGNvbmZpZy5wcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLkZFQVRVUkVfQVVUT19ESVNDT1ZFUllfRElTQUJMRSwgdHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZVNlcnZlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoInJlc291cmNlIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LnRleHQobmV3IE1ldGFJbmYoImZvbyIpKSk7CisKKyAgICAgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KE1ldGFJbmYuY2xhc3MpLnZhbHVlLAorICAgICAgICAgICAgICAgICAgICBpcygiZm9vX3dyaXRlX0NMSUVOVF9yZWFkX1NFUlZFUl93cml0ZV9TRVJWRVJfcmVhZF9DTElFTlQiKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvbWV0YWluZi1zZXJ2aWNlcy9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyIGIvZXh0L21ldGFpbmYtc2VydmljZXMvc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL2phdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmUwY2VlCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L21ldGFpbmYtc2VydmljZXMvc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL2phdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcgpAQCAtMCwwICsxIEBACitvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLk1ldGFJbmZTZXJ2aWNlc1Rlc3QkTWVzc2FnZVByb3ZpZGVyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZXh0L21ldGFpbmYtc2VydmljZXMvc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL2phdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlciBiL2V4dC9tZXRhaW5mLXNlcnZpY2VzL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9qYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJlMGNlZQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9tZXRhaW5mLXNlcnZpY2VzL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9qYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXIKQEAgLTAsMCArMSBAQAorb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5NZXRhSW5mU2VydmljZXNUZXN0JE1lc3NhZ2VQcm92aWRlcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4dC9tdmMtYmVhbi12YWxpZGF0aW9uL3BvbS54bWwgYi9leHQvbXZjLWJlYW4tdmFsaWRhdGlvbi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmYTZmMzUKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvbXZjLWJlYW4tdmFsaWRhdGlvbi9wb20ueG1sCkBAIC0wLDAgKzEsNjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmplcnNleS1tdmMtYmVhbi12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgorICAgIDxuYW1lPmplcnNleS1leHQtbXZjLWJlYW4tdmFsaWRhdGlvbjwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgSmVyc2V5IGV4dGVuc2lvbiBtb2R1bGUgcHJvdmlkaW5nIHN1cHBvcnQgZm9yIEJlYW4gVmFsaWRhdGlvbiBpbiBNVkMuCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZmVsaXg8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYnVuZGxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW12YzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1iZWFuLXZhbGlkYXRpb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lbDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguZWwtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICAgICAgPC9leGNsdXNpb25zPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4dC9tdmMtYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL212Yy9iZWFudmFsaWRhdGlvbi9NdmNCZWFuVmFsaWRhdGlvbkZlYXR1cmUuamF2YSBiL2V4dC9tdmMtYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL212Yy9iZWFudmFsaWRhdGlvbi9NdmNCZWFuVmFsaWRhdGlvbkZlYXR1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTI3NTM2Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L212Yy1iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbXZjL2JlYW52YWxpZGF0aW9uL012Y0JlYW5WYWxpZGF0aW9uRmVhdHVyZS5qYXZhCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5iZWFudmFsaWRhdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN0cmFpbmVkVG87CitpbXBvcnQgamF2YXgud3MucnMuUnVudGltZVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmVDb250ZXh0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5NdmNGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci52YWxpZGF0aW9uLlZhbGlkYXRpb25GZWF0dXJlOworCisvKioKKyAqIHtAbGluayBGZWF0dXJlfSB1c2VkIHRvIGFkZCBzdXBwb3J0IGZvciB7QGxpbmsgTXZjRmVhdHVyZSBNVkN9IGFuZCBCZWFuIFZhbGlkYXRpb24uCisgKiA8cC8+CisgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5WaWV3YWJsZSBWaWV3YWJsZX0gKHRlbXBsYXRlKSBkZWZpbmVkIGJ5CisgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5FcnJvclRlbXBsYXRlIEVycm9yVGVtcGxhdGV9IGFubm90YXRpb24sIHByZXNlbnQgZGlyZWN0bHkgb24gYW4gZXhlY3V0ZWQgcmVzb3VyY2UgbWV0aG9kCisgKiBvciBvbiBhIHJlc291cmNlIGNsYXNzIHRoZSByZXNvdXJjZSBtZXRob2QgaXMgZGVmaW5lZCBpbiwgaXMgcHJvY2Vzc2VkIHRvIGRpc3BsYXkgYW4gZXJyb3IgbWVzc2FnZSBjYXVzZWQgYnkgYW4KKyAqIHtAbGluayBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24gQmVhbiBWYWxpZGF0aW9uIGV4Y2VwdGlvbn0uIE1vZGVsIGlzLCBpbiB0aGlzIGNhc2UsIGEgbGlzdCBvZgorICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci52YWxpZGF0aW9uLlZhbGlkYXRpb25FcnJvciB2YWxpZGF0aW9uIGVycm9yc30uCisgKiA8cC8+CisgKiBOb3RlOiBUaGlzIGZlYXR1cmUgYWxzbyByZWdpc3RlcnMge0BsaW5rIE12Y0ZlYXR1cmV9LgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICogQHNlZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLkVycm9yVGVtcGxhdGUKKyAqIEBzaW5jZSAyLjMKKyAqLworQENvbnN0cmFpbmVkVG8oUnVudGltZVR5cGUuU0VSVkVSKQorcHVibGljIGNsYXNzIE12Y0JlYW5WYWxpZGF0aW9uRmVhdHVyZSBpbXBsZW1lbnRzIEZlYXR1cmUgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlKGZpbmFsIEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWcgPSBjb250ZXh0LmdldENvbmZpZ3VyYXRpb24oKTsKKworICAgICAgICBpZiAoIWNvbmZpZy5pc1JlZ2lzdGVyZWQoVmFsaWRhdGlvbkVycm9yVGVtcGxhdGVFeGNlcHRpb25NYXBwZXIuY2xhc3MpKSB7CisgICAgICAgICAgICAvLyBFeGNlcHRpb24gTWFwcGVyLgorICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihWYWxpZGF0aW9uRXJyb3JUZW1wbGF0ZUV4Y2VwdGlvbk1hcHBlci5jbGFzcyk7CisKKyAgICAgICAgICAgIC8vIEJlYW5WYWxpZGF0aW9uIGZlYXR1cmUuCisgICAgICAgICAgICBpZiAoIWNvbmZpZy5pc1JlZ2lzdGVyZWQoVmFsaWRhdGlvbkZlYXR1cmUuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihWYWxpZGF0aW9uRmVhdHVyZS5jbGFzcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE12YyBmZWF0dXJlLgorICAgICAgICAgICAgaWYgKCFjb25maWcuaXNSZWdpc3RlcmVkKE12Y0ZlYXR1cmUuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihNdmNGZWF0dXJlLmNsYXNzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9tdmMtYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL212Yy9iZWFudmFsaWRhdGlvbi9WYWxpZGF0aW9uRXJyb3JUZW1wbGF0ZUV4Y2VwdGlvbk1hcHBlci5qYXZhIGIvZXh0L212Yy1iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbXZjL2JlYW52YWxpZGF0aW9uL1ZhbGlkYXRpb25FcnJvclRlbXBsYXRlRXhjZXB0aW9uTWFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FiYTljYwotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9tdmMtYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL212Yy9iZWFudmFsaWRhdGlvbi9WYWxpZGF0aW9uRXJyb3JUZW1wbGF0ZUV4Y2VwdGlvbk1hcHBlci5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5iZWFudmFsaWRhdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLnNwaS5BYnN0cmFjdEVycm9yVGVtcGxhdGVNYXBwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnZhbGlkYXRpb24uaW50ZXJuYWwuVmFsaWRhdGlvbkhlbHBlcjsKKworLyoqCisgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLkV4dGVuZGVkRXhjZXB0aW9uTWFwcGVyIEV4Y2VwdGlvbiBtYXBwZXJ9IHByb3ZpZGluZyB2YWxpZGF0aW9uIGVycm9ycyB0aGF0IGFyZSBwYXNzZWQgdG8gYQorICogdmlld2FibGUgaW4gY2FzZSBhIEJlYW4gVmFsaWRhdGlvbiBleGNlcHRpb24gaGFzIGJlZW4gdGhyb3duIGR1cmluZyBwcm9jZXNzaW5nIGFuIHJlcXVlc3QuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKiBAc2luY2UgMi4zCisgKi8KK0BTaW5nbGV0b24KK2ZpbmFsIGNsYXNzIFZhbGlkYXRpb25FcnJvclRlbXBsYXRlRXhjZXB0aW9uTWFwcGVyIGV4dGVuZHMgQWJzdHJhY3RFcnJvclRlbXBsYXRlTWFwcGVyPENvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24+IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNwb25zZS5TdGF0dXMgZ2V0RXJyb3JTdGF0dXMoZmluYWwgQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbiBjdmUpIHsKKyAgICAgICAgcmV0dXJuIFZhbGlkYXRpb25IZWxwZXIuZ2V0UmVzcG9uc2VTdGF0dXMoY3ZlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldEVycm9yTW9kZWwoZmluYWwgQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbiBjdmUpIHsKKyAgICAgICAgcmV0dXJuIFZhbGlkYXRpb25IZWxwZXIuY29uc3RyYWludFZpb2xhdGlvblRvVmFsaWRhdGlvbkVycm9ycyhjdmUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9tdmMtYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL212Yy9iZWFudmFsaWRhdGlvbi9wYWNrYWdlLWluZm8uamF2YSBiL2V4dC9tdmMtYmVhbi12YWxpZGF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL212Yy9iZWFudmFsaWRhdGlvbi9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mjg4YzhlCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L212Yy1iZWFuLXZhbGlkYXRpb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbXZjL2JlYW52YWxpZGF0aW9uL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKKy8qKgorICogSmVyc2V5IHNlcnZlci1zaWRlIGNsYXNzZXMgYWRkaW5nIHN1cHBvcnQgb2YgYmVhbiB2YWxpZGF0aW9uIHRvIE1WQyAoTW9kZWwgVmlldyBDb250cm9sbGVyKS4KKyAqLworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLmJlYW52YWxpZGF0aW9uOwpkaWZmIC0tZ2l0IGEvZXh0L212Yy1mcmVlbWFya2VyL3BvbS54bWwgYi9leHQvbXZjLWZyZWVtYXJrZXIvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2IxNTJkCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L212Yy1mcmVlbWFya2VyL3BvbS54bWwKQEAgLTAsMCArMSw2NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LW12Yy1mcmVlbWFya2VyPC9hcnRpZmFjdElkPgorICAgIDxuYW1lPmplcnNleS1leHQtbXZjLWZyZWVtYXJrZXI8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIEplcnNleSBleHRlbnNpb24gbW9kdWxlIHByb3ZpZGluZyBzdXBwb3J0IGZvciBGcmVlbWFya2VyIHRlbXBsYXRlcy4KKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5mZWxpeDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1idW5kbGUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgICAgIDxleHRlbnNpb25zPnRydWU8L2V4dGVuc2lvbnM+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxpbnN0cnVjdGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8RXhwb3J0LVBhY2thZ2U+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5mcmVlbWFya2VyLio7dmVyc2lvbj0ke3Byb2plY3QudmVyc2lvbn08L0V4cG9ydC1QYWNrYWdlPgorICAgICAgICAgICAgICAgICAgICA8L2luc3RydWN0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPHVucGFja0J1bmRsZT50cnVlPC91bnBhY2tCdW5kbGU+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbXZjPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZnJlZW1hcmtlcjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmZyZWVtYXJrZXI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke2ZyZWVtYXJrZXIudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXh0L212Yy1mcmVlbWFya2VyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL212Yy9mcmVlbWFya2VyL0ZyZWVtYXJrZXJDb25maWd1cmF0aW9uRmFjdG9yeS5qYXZhIGIvZXh0L212Yy1mcmVlbWFya2VyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL212Yy9mcmVlbWFya2VyL0ZyZWVtYXJrZXJDb25maWd1cmF0aW9uRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MmJmMTgKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvbXZjLWZyZWVtYXJrZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbXZjL2ZyZWVtYXJrZXIvRnJlZW1hcmtlckNvbmZpZ3VyYXRpb25GYWN0b3J5LmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLmZyZWVtYXJrZXI7CisKK2ltcG9ydCBmcmVlbWFya2VyLnRlbXBsYXRlLkNvbmZpZ3VyYXRpb247CisKKworLyoqCisgKiBQcm92aWRlcyBsb29rdXAgb2Yge0BsaW5rIGZyZWVtYXJrZXIudGVtcGxhdGUuQ29uZmlndXJhdGlvbiBDb25maWd1cmF0aW9ufQorICogaW5zdGFuY2UgZm9yIEZyZWVtYXJrZXIgdGVtcGxhdGluZy4KKyAqIDwvcD4KKyAqIEluc3RhbnRpYXRpb24gb2YgQ29uZmlndXJhdGlvbiBvYmplY3RzIGlzIHJlbGF0aXZlbHkgaGVhdnktd2VpZ2h0LCBhbmQKKyAqIEZyZWVtYXJrZXIgYmVzdC1wcmFjdGljZXMgZGljdGF0ZSB0aGF0IHRoZXkgYmUgcmV1c2VkIGlmIHBvc3NpYmxlLgorICogVGhlcmVmb3JlLCBtb3N0IGltcGxlbWVudGF0aW9ucyBvZiB0aGlzIGludGVyZmFjZSB3aWxsIG9ubHkgY3JlYXRlIGEKKyAqIHNpbmdsZXRvbiBDb25maWd1cmF0aW9uIGluc3RhbmNlLCBhbmQgcmV0dXJuIGl0IGZvciBldmVyeSBjYWxsIHRvCisgKiB7QGxpbmsgI2dldENvbmZpZ3VyYXRpb24oKX0uIEFsdGhvdWdoIHRoaXMgd2lsbCB1c3VhbGx5IGJlIHRoZSBjYXNlLCBpdCBpcworICogbm90IGEgZ3VhcmFudGVlIG9mIHRoaXMgaW50ZXJmYWNlJ3MgY29udHJhY3QuCisgKgorICogQGF1dGhvciBKZWZmIFdpbGRlIChqZWZmLndpbGRlIGF0IGNvbXBsaWNhdGVkcm9ib3QuY29tKQorICovCitwdWJsaWMgaW50ZXJmYWNlIEZyZWVtYXJrZXJDb25maWd1cmF0aW9uRmFjdG9yeSB7CisKKyAgICBwdWJsaWMgQ29uZmlndXJhdGlvbiBnZXRDb25maWd1cmF0aW9uKCk7CisKK30KZGlmZiAtLWdpdCBhL2V4dC9tdmMtZnJlZW1hcmtlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvZnJlZW1hcmtlci9GcmVlbWFya2VyRGVmYXVsdENvbmZpZ3VyYXRpb25GYWN0b3J5LmphdmEgYi9leHQvbXZjLWZyZWVtYXJrZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbXZjL2ZyZWVtYXJrZXIvRnJlZW1hcmtlckRlZmF1bHRDb25maWd1cmF0aW9uRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYzdmZWQKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvbXZjLWZyZWVtYXJrZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbXZjL2ZyZWVtYXJrZXIvRnJlZW1hcmtlckRlZmF1bHRDb25maWd1cmF0aW9uRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5mcmVlbWFya2VyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CisKK2ltcG9ydCBmcmVlbWFya2VyLmNhY2hlLkNsYXNzVGVtcGxhdGVMb2FkZXI7CitpbXBvcnQgZnJlZW1hcmtlci5jYWNoZS5GaWxlVGVtcGxhdGVMb2FkZXI7CitpbXBvcnQgZnJlZW1hcmtlci5jYWNoZS5NdWx0aVRlbXBsYXRlTG9hZGVyOworaW1wb3J0IGZyZWVtYXJrZXIuY2FjaGUuVGVtcGxhdGVMb2FkZXI7CitpbXBvcnQgZnJlZW1hcmtlci5jYWNoZS5XZWJhcHBUZW1wbGF0ZUxvYWRlcjsKK2ltcG9ydCBmcmVlbWFya2VyLnRlbXBsYXRlLkNvbmZpZ3VyYXRpb247CisKKy8qKgorICogSGFuZHkge0BsaW5rIEZyZWVtYXJrZXJDb25maWd1cmF0aW9uRmFjdG9yeX0gdGhhdCBzdXBwbGllcyBhIG1pbmltYWxseQorICogY29uZmlndXJlZCB7QGxpbmsgZnJlZW1hcmtlci50ZW1wbGF0ZS5Db25maWd1cmF0aW9uIENvbmZpZ3VyYXRpb259IGFibGUgdG8KKyAqIGNyZWF0ZSB7QGxpbmsgZnJlZW1hcmtlci50ZW1wbGF0ZS5UZW1wbGF0ZSBGcmVlbWFya2VyIHRlbXBsYXRlc30uCisgKiBUaGUgcmVjb21tZW5kZWQgbWV0aG9kIHRvIHByb3ZpZGUgY3VzdG9tIEZyZWVtYXJrZXIgY29uZmlndXJhdGlvbiBpcyB0bworICogc3ViLWNsYXNzIHRoaXMgY2xhc3MsIGZ1cnRoZXIgY3VzdG9taXplIHRoZQorICoge0BsaW5rIGZyZWVtYXJrZXIudGVtcGxhdGUuQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9ufSBhcyBkZXNpcmVkIGluIHRoYXQKKyAqIGNsYXNzLCBhbmQgdGhlbiByZWdpc3RlciB0aGUgc3ViLWNsYXNzIHdpdGggdGhlIHtAbGluayBGcmVlbWFya2VyTXZjRmVhdHVyZX0KKyAqIFRFTVBMQVRFX09CSkVDVF9GQUNUT1JZIHByb3BlcnR5LgorICoKKyAqIEBhdXRob3IgSmVmZiBXaWxkZSAoamVmZi53aWxkZSBhdCBjb21wbGljYXRlZHJvYm90LmNvbSkKKyAqLworcHVibGljIGNsYXNzIEZyZWVtYXJrZXJEZWZhdWx0Q29uZmlndXJhdGlvbkZhY3RvcnkgaW1wbGVtZW50cyBGcmVlbWFya2VyQ29uZmlndXJhdGlvbkZhY3RvcnkgeworCisgICAgcHJvdGVjdGVkIGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbjsKKworICAgIHB1YmxpYyBGcmVlbWFya2VyRGVmYXVsdENvbmZpZ3VyYXRpb25GYWN0b3J5KFNlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0KSB7CisgICAgICAgIHN1cGVyKCk7CisKKyAgICAgICAgLy8gQ3JlYXRlIGRpZmZlcmVudCBsb2FkZXJzLgorICAgICAgICBmaW5hbCBMaXN0PFRlbXBsYXRlTG9hZGVyPiBsb2FkZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGlmIChzZXJ2bGV0Q29udGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICBsb2FkZXJzLmFkZChuZXcgV2ViYXBwVGVtcGxhdGVMb2FkZXIoc2VydmxldENvbnRleHQpKTsKKyAgICAgICAgfQorICAgICAgICBsb2FkZXJzLmFkZChuZXcgQ2xhc3NUZW1wbGF0ZUxvYWRlcihGcmVlbWFya2VyRGVmYXVsdENvbmZpZ3VyYXRpb25GYWN0b3J5LmNsYXNzLCAiLyIpKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxvYWRlcnMuYWRkKG5ldyBGaWxlVGVtcGxhdGVMb2FkZXIobmV3IEZpbGUoIi8iKSkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBOT09QCisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgQmFzZSBjb25maWd1cmF0aW9uLgorICAgICAgICBjb25maWd1cmF0aW9uID0gbmV3IENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgY29uZmlndXJhdGlvbi5zZXRUZW1wbGF0ZUxvYWRlcihuZXcgTXVsdGlUZW1wbGF0ZUxvYWRlcihsb2FkZXJzLnRvQXJyYXkobmV3IFRlbXBsYXRlTG9hZGVyW2xvYWRlcnMuc2l6ZSgpXSkpKTsKKworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb25maWd1cmF0aW9uIGdldENvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBjb25maWd1cmF0aW9uOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZXh0L212Yy1mcmVlbWFya2VyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL212Yy9mcmVlbWFya2VyL0ZyZWVtYXJrZXJNdmNGZWF0dXJlLmphdmEgYi9leHQvbXZjLWZyZWVtYXJrZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbXZjL2ZyZWVtYXJrZXIvRnJlZW1hcmtlck12Y0ZlYXR1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGFiNDUxCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L212Yy1mcmVlbWFya2VyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL212Yy9mcmVlbWFya2VyL0ZyZWVtYXJrZXJNdmNGZWF0dXJlLmphdmEKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5mcmVlbWFya2VyOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3RyYWluZWRUbzsKK2ltcG9ydCBqYXZheC53cy5ycy5SdW50aW1lVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLk12Y0ZlYXR1cmU7CisKKy8qKgorICoge0BsaW5rIEZlYXR1cmV9IHVzZWQgdG8gYWRkIHN1cHBvcnQgZm9yIHtAbGluayBNdmNGZWF0dXJlIE1WQ30gYW5kIEZyZWVtYXJrZXIgdGVtcGxhdGVzLgorICogPHAvPgorICogTm90ZTogVGhpcyBmZWF0dXJlIGFsc28gcmVnaXN0ZXJzIHtAbGluayBNdmNGZWF0dXJlfS4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqIEBhdXRob3IgSmVmZiBXaWxkZSAoamVmZi53aWxkZSBhdCBjb21wbGljYXRlZHJvYm90LmNvbSkKKyAqLworQENvbnN0cmFpbmVkVG8oUnVudGltZVR5cGUuU0VSVkVSKQorcHVibGljIGZpbmFsIGNsYXNzIEZyZWVtYXJrZXJNdmNGZWF0dXJlIGltcGxlbWVudHMgRmVhdHVyZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1VGRklYID0gIi5mcmVlbWFya2VyIjsKKworICAgIC8qKgorICAgICAqIHtAbGluayBTdHJpbmd9IHByb3BlcnR5IGRlZmluaW5nIHRoZSBiYXNlIHBhdGggdG8gRnJlZW1hcmtlciB0ZW1wbGF0ZXMuIElmIHNldCwgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBpcyBhZGRlZCBpbiBmcm9udAorICAgICAqIG9mIHRoZSB0ZW1wbGF0ZSBuYW1lIGRlZmluZWQgaW46CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5WaWV3YWJsZSBWaWV3YWJsZX08L2xpPgorICAgICAqIDxsaT57QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5UZW1wbGF0ZSBUZW1wbGF0ZX0sIG9yPC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuRXJyb3JUZW1wbGF0ZSBFcnJvclRlbXBsYXRlfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8cC8+CisgICAgICogVmFsdWUgY2FuIGJlIGFic29sdXRlIHByb3ZpZGluZyBhIGZ1bGwgcGF0aCB0byBhIHN5c3RlbSBkaXJlY3Rvcnkgd2l0aCB0ZW1wbGF0ZXMgb3IgcmVsYXRpdmUgdG8gY3VycmVudAorICAgICAqIHtAbGluayBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0IHNlcnZsZXQgY29udGV4dH0uCisgICAgICogPHAvPgorICAgICAqIFRoZXJlIGlzIG5vIGRlZmF1bHQgdmFsdWUuCisgICAgICogPHAvPgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDx0dD57QHZhbHVlfTwvdHQ+LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFX0JBU0VfUEFUSCA9IE12Y0ZlYXR1cmUuVEVNUExBVEVfQkFTRV9QQVRIICsgU1VGRklYOworCisgICAgLyoqCisgICAgICogSWYge0Bjb2RlIHRydWV9IHRoZW4gZW5hYmxlIGNhY2hpbmcgb2YgRnJlZW1hcmtlciB0ZW1wbGF0ZXMgdG8gYXZvaWQgbXVsdGlwbGUgY29tcGlsYXRpb24uCisgICAgICogPHAvPgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHtAY29kZSBmYWxzZX0uCisgICAgICogPHAvPgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDx0dD57QHZhbHVlfTwvdHQ+LgorICAgICAqCisgICAgICogQHNpbmNlIDIuNQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBQ0hFX1RFTVBMQVRFUyA9IE12Y0ZlYXR1cmUuQ0FDSEVfVEVNUExBVEVTICsgU1VGRklYOworCisgICAgLyoqCisgICAgICogUHJvcGVydHkgdXNlZCB0byBwYXNzIHVzZXItY29uZmlndXJlZCB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5mcmVlbWFya2VyLkZyZWVtYXJrZXJDb25maWd1cmF0aW9uRmFjdG9yeX0uCisgICAgICogPHAvPgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIG5vdCBzZXQuCisgICAgICogPHAvPgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDx0dD57QHZhbHVlfTwvdHQ+LgorICAgICAqIDxwLz4KKyAgICAgKiBUaGlzIHByb3BlcnR5IHdpbGwgYWxzbyBhY2NlcHQgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIGZyZWVtYXJrZXIudGVtcGxhdGUuQ29uZmlndXJhdGlvbiBDb25maWd1cmF0aW9ufSBkaXJlY3RseSwgdG8KKyAgICAgKiBzdXBwb3J0IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBJZiB5b3Ugd2FudCB0byBzZXQgY3VzdG9tIHtAbGluayBmcmVlbWFya2VyLnRlbXBsYXRlLkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbn0gdGhlbiBzZXQKKyAgICAgKiB7QGxpbmsgZnJlZW1hcmtlci5jYWNoZS5UZW1wbGF0ZUxvYWRlciB0ZW1wbGF0ZSBsb2FkZXJ9IHRvIG11bHRpIGxvYWRlciBvZjoKKyAgICAgKiB7QGxpbmsgZnJlZW1hcmtlci5jYWNoZS5XZWJhcHBUZW1wbGF0ZUxvYWRlcn0gKGlmIGFwcGxpY2FibGUpLCB7QGxpbmsgZnJlZW1hcmtlci5jYWNoZS5DbGFzc1RlbXBsYXRlTG9hZGVyfSBhbmQKKyAgICAgKiB7QGxpbmsgZnJlZW1hcmtlci5jYWNoZS5GaWxlVGVtcGxhdGVMb2FkZXJ9IGtlZXAgZnVuY3Rpb25hbGl0eSBvZiByZXNvbHZpbmcgdGVtcGxhdGVzLgorICAgICAqIDxwLz4KKyAgICAgKiBJZiBubyB2YWx1ZSBpcyBzZXQsIGEge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuZnJlZW1hcmtlci5GcmVlbWFya2VyRGVmYXVsdENvbmZpZ3VyYXRpb25GYWN0b3J5IGZhY3Rvcnl9CisgICAgICogd2l0aCB0aGUgYWJvdmUgYmVoYXZpb3VyIGlzIHVzZWQgYnkgZGVmYXVsdCBpbiB0aGUKKyAgICAgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5mcmVlbWFya2VyLkZyZWVtYXJrZXJWaWV3UHJvY2Vzc29yfSBjbGFzcy4KKyAgICAgKiA8cC8+CisgICAgICoKKyAgICAgKiBAc2luY2UgMi41CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVNUExBVEVfT0JKRUNUX0ZBQ1RPUlkgPSBNdmNGZWF0dXJlLlRFTVBMQVRFX09CSkVDVF9GQUNUT1JZICsgU1VGRklYOworCisgICAgLyoqCisgICAgICogUHJvcGVydHkgZGVmaW5lcyBvdXRwdXQgZW5jb2RpbmcgcHJvZHVjZWQgYnkge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuc3BpLlRlbXBsYXRlUHJvY2Vzc29yfS4KKyAgICAgKiBUaGUgdmFsdWUgbXVzdCBiZSBhIHZhbGlkIGVuY29kaW5nIGRlZmluZWQgdGhhdCBjYW4gYmUgcGFzc2VkCisgICAgICogdG8gdGhlIHtAbGluayBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQjZm9yTmFtZShTdHJpbmcpfSBtZXRob2QuCisgICAgICoKKyAgICAgKiA8cC8+CisgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMge0Bjb2RlIFVURi04fS4KKyAgICAgKiA8cC8+CisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaXMgPHR0PntAdmFsdWV9PC90dD4uCisgICAgICogPHAvPgorICAgICAqCisgICAgICogQHNpbmNlIDIuNworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQ09ESU5HID0gTXZjRmVhdHVyZS5FTkNPRElORyArIFNVRkZJWDsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZShmaW5hbCBGZWF0dXJlQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlnID0gY29udGV4dC5nZXRDb25maWd1cmF0aW9uKCk7CisKKyAgICAgICAgaWYgKCFjb25maWcuaXNSZWdpc3RlcmVkKEZyZWVtYXJrZXJWaWV3UHJvY2Vzc29yLmNsYXNzKSkgeworICAgICAgICAgICAgLy8gVGVtcGxhdGUgUHJvY2Vzc29yLgorICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihGcmVlbWFya2VyVmlld1Byb2Nlc3Nvci5jbGFzcyk7CisKKyAgICAgICAgICAgIC8vIE12Y0ZlYXR1cmUuCisgICAgICAgICAgICBpZiAoIWNvbmZpZy5pc1JlZ2lzdGVyZWQoTXZjRmVhdHVyZS5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKE12Y0ZlYXR1cmUuY2xhc3MpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L212Yy1mcmVlbWFya2VyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL212Yy9mcmVlbWFya2VyL0ZyZWVtYXJrZXJTdXBwbGllZENvbmZpZ3VyYXRpb25GYWN0b3J5LmphdmEgYi9leHQvbXZjLWZyZWVtYXJrZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbXZjL2ZyZWVtYXJrZXIvRnJlZW1hcmtlclN1cHBsaWVkQ29uZmlndXJhdGlvbkZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWEyZGNiCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L212Yy1mcmVlbWFya2VyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL212Yy9mcmVlbWFya2VyL0ZyZWVtYXJrZXJTdXBwbGllZENvbmZpZ3VyYXRpb25GYWN0b3J5LmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLmZyZWVtYXJrZXI7CisKKworaW1wb3J0IGZyZWVtYXJrZXIudGVtcGxhdGUuQ29uZmlndXJhdGlvbjsKKworLyoqCisgKiB7QGxpbmsgRnJlZW1hcmtlckNvbmZpZ3VyYXRpb25GYWN0b3J5fSB0aGF0IHN1cHBsaWVzIGFuIHVuY2hhbmdlZAorICoge0BsaW5rIGZyZWVtYXJrZXIudGVtcGxhdGUuQ29uZmlndXJhdGlvbiBDb25maWd1cmF0aW9ufSBhcyBwYXNzZWQtaW4gdG8KKyAqIHRoZSBjb25zdHJ1Y3Rvci4KKyAqIDxwLz4KKyAqIFVzZWQgdG8gc3VwcG9ydCBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBpbiB7QGxpbmsgRnJlZW1hcmtlclZpZXdQcm9jZXNzb3J9CisgKiB0byB3cmFwIGRpcmVjdGx5LWNvbmZpZ3VyZWQge0BsaW5rIGZyZWVtYXJrZXIudGVtcGxhdGUuQ29uZmlndXJhdGlvbiBDb25maWd1cmF0aW9ufQorICogb2JqZWN0cyBpbnN0ZWFkIG9mIHRoZSByZWNvbW1lbmRlZCB7QGxpbmsgRnJlZW1hcmtlckRlZmF1bHRDb25maWd1cmF0aW9uRmFjdG9yeX0KKyAqIG9yIGEgc3ViLWNsYXNzIHRoZXJlb2YuCisgKgorICogQGF1dGhvciBKZWZmIFdpbGRlIChqZWZmLndpbGRlIGF0IGNvbXBsaWNhdGVkcm9ib3QuY29tKQorICovCitmaW5hbCBjbGFzcyBGcmVlbWFya2VyU3VwcGxpZWRDb25maWd1cmF0aW9uRmFjdG9yeSBpbXBsZW1lbnRzIEZyZWVtYXJrZXJDb25maWd1cmF0aW9uRmFjdG9yeSB7CisKKyAgICBwcml2YXRlIGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbjsKKworICAgIHB1YmxpYyBGcmVlbWFya2VyU3VwcGxpZWRDb25maWd1cmF0aW9uRmFjdG9yeShDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29uZmlndXJhdGlvbiBnZXRDb25maWd1cmF0aW9uKCkgeworICAgICAgICByZXR1cm4gY29uZmlndXJhdGlvbjsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2V4dC9tdmMtZnJlZW1hcmtlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvZnJlZW1hcmtlci9GcmVlbWFya2VyVmlld1Byb2Nlc3Nvci5qYXZhIGIvZXh0L212Yy1mcmVlbWFya2VyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL212Yy9mcmVlbWFya2VyL0ZyZWVtYXJrZXJWaWV3UHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY0ZjRhYgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9tdmMtZnJlZW1hcmtlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvZnJlZW1hcmtlci9GcmVlbWFya2VyVmlld1Byb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5mcmVlbWFya2VyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uVmFsdWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5WaWV3YWJsZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLnNwaS5BYnN0cmFjdFRlbXBsYXRlUHJvY2Vzc29yOworCitpbXBvcnQgZnJlZW1hcmtlci50ZW1wbGF0ZS5Db25maWd1cmF0aW9uOworaW1wb3J0IGZyZWVtYXJrZXIudGVtcGxhdGUuVGVtcGxhdGU7CitpbXBvcnQgZnJlZW1hcmtlci50ZW1wbGF0ZS5UZW1wbGF0ZUV4Y2VwdGlvbjsKKworLyoqCisgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5zcGkuVGVtcGxhdGVQcm9jZXNzb3IgVGVtcGxhdGUgcHJvY2Vzc29yfSBwcm92aWRpbmcgc3VwcG9ydCBmb3IgRnJlZW1hcmtlciB0ZW1wbGF0ZXMuCisgKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICogQGF1dGhvciBKZWZmIFdpbGRlIChqZWZmLndpbGRlIGF0IGNvbXBsaWNhdGVkcm9ib3QuY29tKQorICovCitmaW5hbCBjbGFzcyBGcmVlbWFya2VyVmlld1Byb2Nlc3NvciBleHRlbmRzIEFic3RyYWN0VGVtcGxhdGVQcm9jZXNzb3I8VGVtcGxhdGU+IHsKKworICAgIHByaXZhdGUgZmluYWwgRnJlZW1hcmtlckNvbmZpZ3VyYXRpb25GYWN0b3J5IGZhY3Rvcnk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBwcm9jZXNzb3Igd2l0aCBpbmplY3RlZCB7QGxpbmsgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uIGNvbmZpZ30gYW5kCisgICAgICogKG9wdGlvbmFsKSB7QGxpbmsgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dCBzZXJ2bGV0IGNvbnRleHR9LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZyAgICAgICAgICAgY29uZmlnIHRvIGNvbmZpZ3VyZSB0aGlzIHByb2Nlc3NvciBmcm9tLgorICAgICAqIEBwYXJhbSBpbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbiBtYW5hZ2VyLgorICAgICAqLworICAgIEBJbmplY3QKKyAgICBwdWJsaWMgRnJlZW1hcmtlclZpZXdQcm9jZXNzb3IoamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uIGNvbmZpZywgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyKSB7CisgICAgICAgIHN1cGVyKGNvbmZpZywgaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShTZXJ2bGV0Q29udGV4dC5jbGFzcyksICJmcmVlbWFya2VyIiwgImZ0bCIpOworCisgICAgICAgIHRoaXMuZmFjdG9yeSA9IGdldFRlbXBsYXRlT2JqZWN0RmFjdG9yeShpbmplY3Rpb25NYW5hZ2VyOjpjcmVhdGVBbmRJbml0aWFsaXplLCBGcmVlbWFya2VyQ29uZmlndXJhdGlvbkZhY3RvcnkuY2xhc3MsCisgICAgICAgICAgICAgICAgKCkgLT4geworICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRlbXBsYXRlT2JqZWN0RmFjdG9yeShpbmplY3Rpb25NYW5hZ2VyOjpjcmVhdGVBbmRJbml0aWFsaXplLCBDb25maWd1cmF0aW9uLmNsYXNzLCBWYWx1ZXMuZW1wdHkoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb25maWd1cmF0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRnJlZW1hcmtlckRlZmF1bHRDb25maWd1cmF0aW9uRmFjdG9yeShpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKFNlcnZsZXRDb250ZXh0LmNsYXNzKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZyZWVtYXJrZXJTdXBwbGllZENvbmZpZ3VyYXRpb25GYWN0b3J5KGNvbmZpZ3VyYXRpb24pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlbXBsYXRlIHJlc29sdmUoZmluYWwgU3RyaW5nIHRlbXBsYXRlUmVmZXJlbmNlLCBmaW5hbCBSZWFkZXIgcmVhZGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGZhY3RvcnkuZ2V0Q29uZmlndXJhdGlvbigpLmdldFRlbXBsYXRlKHRlbXBsYXRlUmVmZXJlbmNlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIFRlbXBsYXRlIHRlbXBsYXRlLCBmaW5hbCBWaWV3YWJsZSB2aWV3YWJsZSwgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywgZmluYWwgT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE9iamVjdCBtb2RlbCA9IHZpZXdhYmxlLmdldE1vZGVsKCk7CisgICAgICAgICAgICBpZiAoIShtb2RlbCBpbnN0YW5jZW9mIE1hcCkpIHsKKyAgICAgICAgICAgICAgICBtb2RlbCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpIHt7CisgICAgICAgICAgICAgICAgICAgIHB1dCgibW9kZWwiLCB2aWV3YWJsZS5nZXRNb2RlbCgpKTsKKyAgICAgICAgICAgICAgICB9fTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENoYXJzZXQgZW5jb2RpbmcgPSBzZXRDb250ZW50VHlwZShtZWRpYVR5cGUsIGh0dHBIZWFkZXJzKTsKKworICAgICAgICAgICAgdGVtcGxhdGUucHJvY2Vzcyhtb2RlbCwgbmV3IE91dHB1dFN0cmVhbVdyaXRlcihvdXQsIGVuY29kaW5nKSk7CisgICAgICAgIH0gY2F0Y2ggKFRlbXBsYXRlRXhjZXB0aW9uIHRlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQ29udGFpbmVyRXhjZXB0aW9uKHRlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9tdmMtZnJlZW1hcmtlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvZnJlZW1hcmtlci9wYWNrYWdlLWluZm8uamF2YSBiL2V4dC9tdmMtZnJlZW1hcmtlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvZnJlZW1hcmtlci9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjc2MmYzCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L212Yy1mcmVlbWFya2VyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL212Yy9mcmVlbWFya2VyL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKKy8qKgorICogSmVyc2V5IHNlcnZlci1zaWRlIGNsYXNzZXMgYWRkaW5nIHN1cHBvcnQgb2YgRnJlZU1hcmtlciB0byBKZXJzZXkgTVZDIChNb2RlbCBWaWV3IENvbnRyb2xsZXIpLgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuZnJlZW1hcmtlcjsKZGlmZiAtLWdpdCBhL2V4dC9tdmMtanNwL3BvbS54bWwgYi9leHQvbXZjLWpzcC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NmYyZjUKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvbXZjLWpzcC9wb20ueG1sCkBAIC0wLDAgKzEsOTcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmplcnNleS1tdmMtanNwPC9hcnRpZmFjdElkPgorICAgIDxuYW1lPmplcnNleS1leHQtbXZjLWpzcDwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgSmVyc2V5IGV4dGVuc2lvbiBtb2R1bGUgcHJvdmlkaW5nIHN1cHBvcnQgZm9yIEpTUCB0ZW1wbGF0ZXMuCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4uaXN0YWNrPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWlzdGFjay1jb21tb25zLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5idWlsZC1oZWxwZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZmVsaXg8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYnVuZGxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KKyAgICAgICAgICAgICAgICA8ZXh0ZW5zaW9ucz50cnVlPC9leHRlbnNpb25zPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8aW5zdHJ1Y3Rpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgPEltcG9ydC1QYWNrYWdlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmF4LnNlcnZsZXQuanNwLio7dmVyc2lvbj0iJHtyYW5nZTtbPT0sKyk7JHtqc3AudmVyc2lvbn19IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICAgICAgICA8L0ltcG9ydC1QYWNrYWdlPgorICAgICAgICAgICAgICAgICAgICAgICAgPEV4cG9ydC1QYWNrYWdlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuanNwLio7dmVyc2lvbj0ke3Byb2plY3QudmVyc2lvbn08L0V4cG9ydC1QYWNrYWdlPgorICAgICAgICAgICAgICAgICAgICA8L2luc3RydWN0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPHVucGFja0J1bmRsZT50cnVlPC91bnBhY2tCdW5kbGU+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmhrMi5leHRlcm5hbDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LmluamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tdmM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7c2VydmxldDIudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldC5qc3A8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc3AtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtqc3AudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4dC9tdmMtanNwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL212Yy9qc3AvSW5jbHVkZS5qYXZhIGIvZXh0L212Yy1qc3Avc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbXZjL2pzcC9JbmNsdWRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBiNmUxYgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9tdmMtanNwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL212Yy9qc3AvSW5jbHVkZS5qYXZhCkBAIC0wLDAgKzEsMTMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuanNwOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOworCitpbXBvcnQgamF2YXguc2VydmxldC5SZXF1ZXN0RGlzcGF0Y2hlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb25maWc7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuSnNwQ29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5Kc3BFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AuUGFnZUNvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5qc3AudGFnZXh0LlNpbXBsZVRhZ1N1cHBvcnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLmludGVybmFsLlRlbXBsYXRlSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuanNwLmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworCisvKioKKyAqIEluY2x1ZGVzIGEgc2lkZSBKU1AgZmlsZSBmb3IgdGhlIHtAY29kZSByZXNvbHZpbmdDbGFzc30gY2xhc3MuCisgKiA8cC8+CisgKiBUaGlzIHRhZyBsb29rcyBmb3IgYSBzaWRlIEpTUCBmaWxlIG9mIHRoZSBnaXZlbiBuYW1lCisgKiBmcm9tIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkgb2YgdGhlICJyZXNvbHZpbmdDbGFzcyIgY2xhc3MsCisgKiBhbmQgaW5jbHVkZXMgdGhlIGNvbnRlbnRzIG9mIGl0LCBqdXN0IGxpa2UgJmx0O2pzcDppbmNsdWRlPi4KKyAqIDxwLz4KKyAqIEZvciBleGFtcGxlLCBpZiB0aGUge0Bjb2RlIHJlc29sdmluZ0NsYXNzfSBjbGFzcyBpcyB0aGUge0Bjb2RlIEZvb30gY2xhc3MsCisgKiB3aGljaCBsb29rcyBsaWtlIHRoZSBmb2xsb3dpbmc6CisgKiA8cHJlPgorICogY2xhc3MgRm9vIGV4dGVuZHMgQmFyIHsgLi4uIH0KKyAqIGNsYXNzIEJhciBleHRlbmRzIFpvdCB7IC4uLiB9CisgKiA8L3ByZT4KKyAqIDxwLz4KKyAqIEFuZCBpZiB5b3Ugd3JpdGU6CisgKiA8cHJlPgorICogJmx0O3N0OmluY2x1ZGUgcGFnZT0iYWJjLmpzcCIvJmd0OworICogPC9wcmU+CisgKiB0aGVuLCBpdCBsb29rcyBmb3IgdGhlIGZvbGxvd2luZyBmaWxlcyBpbiB0aGlzIG9yZGVyLAorICogYW5kIGluY2x1ZGVzIHRoZSBmaXJzdCBvbmUgZm91bmQuCisgKiA8b2w+CisgKiA8bGk+YSBzaWRlLWZpbGUgb2YgdGhlIHtAY29kZSBGb299IGNsYXNzIG5hbWVkIHtAY29kZSBhYmMuanNwfSAoe0Bjb2RlIC9XRUItSU5GL0Zvby9hYmMuanNwfSkKKyAqIDxsaT5hIHNpZGUtZmlsZSBvZiB0aGUge0Bjb2RlIEJhcn0gY2xhc3MgbmFtZWQge0Bjb2RlIGFiYy5qc3B9ICh7QGNvZGUgL1dFQi1JTkYvQmFyL2FiYy5qc3B9KQorICogPGxpPmEgc2lkZS1maWxlIG9mIHRoZSB7QGNvZGUgWm90fSBjbGFzcyBuYW1lZCB7QGNvZGUgYWJjLmpzcH0gKHtAY29kZSAvV0VCLUlORi9ab3QvYWJjLmpzcH0pCisgKiA8L29sPgorICoKKyAqIEBhdXRob3IgS29oc3VrZSBLYXdhZ3VjaGkKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqLworcHVibGljIGNsYXNzIEluY2x1ZGUgZXh0ZW5kcyBTaW1wbGVUYWdTdXBwb3J0IHsKKworICAgIHByaXZhdGUgU3RyaW5nIHBhZ2U7CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIEpTUCB0byBiZSBpbmNsdWRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYWdlIHBhZ2UgdG8gYmUgaW5jbHVkZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UGFnZShTdHJpbmcgcGFnZSkgeworICAgICAgICB0aGlzLnBhZ2UgPSBwYWdlOworICAgIH0KKworICAgIHByaXZhdGUgT2JqZWN0IGdldFBhZ2VPYmplY3QoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGdldEpzcENvbnRleHQoKS5nZXRBdHRyaWJ1dGUobmFtZSwgUGFnZUNvbnRleHQuUEFHRV9TQ09QRSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgZG9UYWcoKSB0aHJvd3MgSnNwRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEpzcENvbnRleHQganNwQ29udGV4dCA9IGdldEpzcENvbnRleHQoKTsKKyAgICAgICAgZmluYWwgQ2xhc3M8Pz4gcmVzb2x2aW5nQ2xhc3MgPSAoQ2xhc3M8Pz4pIGpzcENvbnRleHQKKyAgICAgICAgICAgICAgICAuZ2V0QXR0cmlidXRlKFJlcXVlc3REaXNwYXRjaGVyV3JhcHBlci5SRVNPTFZJTkdfQ0xBU1NfQVRUUklCVVRFX05BTUUsIFBhZ2VDb250ZXh0LlJFUVVFU1RfU0NPUEUpOworICAgICAgICBmaW5hbCBTdHJpbmcgYmFzZVBhdGggPSAoU3RyaW5nKSBqc3BDb250ZXh0LmdldEF0dHJpYnV0ZShSZXF1ZXN0RGlzcGF0Y2hlcldyYXBwZXIuQkFTRV9QQVRIX0FUVFJJQlVURV9OQU1FLAorICAgICAgICAgICAgICAgIFBhZ2VDb250ZXh0LlJFUVVFU1RfU0NPUEUpOworCisgICAgICAgIGZpbmFsIFNlcnZsZXRDb25maWcgc2VydmxldENvbmZpZyA9IChTZXJ2bGV0Q29uZmlnKSBnZXRQYWdlT2JqZWN0KFBhZ2VDb250ZXh0LkNPTkZJRyk7CisgICAgICAgIGZpbmFsIFNlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0ID0gc2VydmxldENvbmZpZy5nZXRTZXJ2bGV0Q29udGV4dCgpOworCisgICAgICAgIGZvciAoQ2xhc3M8Pz4gY2xhenogPSByZXNvbHZpbmdDbGFzczsgY2xhenogIT0gT2JqZWN0LmNsYXNzOyBjbGF6eiA9IGNsYXp6LmdldFN1cGVyY2xhc3MoKSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRlbXBsYXRlID0gYmFzZVBhdGggKyBUZW1wbGF0ZUhlbHBlci5nZXRBYnNvbHV0ZVBhdGgoY2xhenosIHBhZ2UsICcvJyk7CisKKyAgICAgICAgICAgIGlmIChzZXJ2bGV0Q29udGV4dC5nZXRSZXNvdXJjZSh0ZW1wbGF0ZSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIC8vIFRvbWNhdCByZXR1cm5zIGEgUmVxdWVzdERpc3BhdGNoZXIgZXZlbiBpZiB0aGUgSlNQIGZpbGUgZG9lc24ndCBleGlzdCBzbyBjaGVjayBpZiB0aGUgcmVzb3VyY2UgZXhpc3RzIGZpcnN0LgorICAgICAgICAgICAgICAgIGZpbmFsIFJlcXVlc3REaXNwYXRjaGVyIGRpc3BhdGNoZXIgPSBzZXJ2bGV0Q29udGV4dC5nZXRSZXF1ZXN0RGlzcGF0Y2hlcih0ZW1wbGF0ZSk7CisKKyAgICAgICAgICAgICAgICBpZiAoZGlzcGF0Y2hlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCA9IChIdHRwU2VydmxldFJlcXVlc3QpIGdldFBhZ2VPYmplY3QoUGFnZUNvbnRleHQuUkVRVUVTVCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlID0gKEh0dHBTZXJ2bGV0UmVzcG9uc2UpIGdldFBhZ2VPYmplY3QoUGFnZUNvbnRleHQuUkVTUE9OU0UpOworCisgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaGVyLmluY2x1ZGUocmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFdyYXBwZXIocmVzcG9uc2UsIG5ldyBQcmludFdyaXRlcihqc3BDb250ZXh0LmdldE91dCgpKSkpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChTZXJ2bGV0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBKc3BFeGNlcHRpb24oZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRocm93IG5ldyBKc3BFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuVU5BQkxFX1RPX0ZJTkRfUEFHRV9GT1JfUkVTT0xWSU5HX0NMQVNTKHBhZ2UsIHJlc29sdmluZ0NsYXNzKSk7CisgICAgfQorCisgICAgY2xhc3MgV3JhcHBlciBleHRlbmRzIEh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFByaW50V3JpdGVyIHdyaXRlcjsKKworICAgICAgICBXcmFwcGVyKEh0dHBTZXJ2bGV0UmVzcG9uc2UgaHR0cFNlcnZsZXRSZXNwb25zZSwgUHJpbnRXcml0ZXIgdykgeworICAgICAgICAgICAgc3VwZXIoaHR0cFNlcnZsZXRSZXNwb25zZSk7CisgICAgICAgICAgICB0aGlzLndyaXRlciA9IHc7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUHJpbnRXcml0ZXIgZ2V0V3JpdGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiB3cml0ZXI7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvbXZjLWpzcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvanNwL0pzcE12Y0ZlYXR1cmUuamF2YSBiL2V4dC9tdmMtanNwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL212Yy9qc3AvSnNwTXZjRmVhdHVyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNzA0ODAKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvbXZjLWpzcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvanNwL0pzcE12Y0ZlYXR1cmUuamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuanNwOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3RyYWluZWRUbzsKK2ltcG9ydCBqYXZheC53cy5ycy5SdW50aW1lVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLk12Y0ZlYXR1cmU7CisKKy8qKgorICoge0BsaW5rIEZlYXR1cmV9IHVzZWQgdG8gYWRkIHN1cHBvcnQgZm9yIHtAbGluayBNdmNGZWF0dXJlIE1WQ30gYW5kIEpTUCB0ZW1wbGF0ZXMuCisgKiA8cC8+CisgKiBOb3RlOiBUaGlzIGZlYXR1cmUgYWxzbyByZWdpc3RlcnMge0BsaW5rIE12Y0ZlYXR1cmV9LgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAQ29uc3RyYWluZWRUbyhSdW50aW1lVHlwZS5TRVJWRVIpCitwdWJsaWMgZmluYWwgY2xhc3MgSnNwTXZjRmVhdHVyZSBpbXBsZW1lbnRzIEZlYXR1cmUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNVRkZJWCA9ICIuanNwIjsKKworICAgIC8qKgorICAgICAqIHtAbGluayBTdHJpbmd9IHByb3BlcnR5IGRlZmluaW5nIHRoZSBiYXNlIHBhdGggdG8gSlNQIHRlbXBsYXRlcy4gSWYgc2V0LCB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGlzIGFkZGVkIGluIGZyb250CisgICAgICogb2YgdGhlIHRlbXBsYXRlIG5hbWUgZGVmaW5lZCBpbjoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPntAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLlZpZXdhYmxlIFZpZXdhYmxlfTwvbGk+CisgICAgICogPGxpPntAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLlRlbXBsYXRlIFRlbXBsYXRlfSwgb3I8L2xpPgorICAgICAqIDxsaT57QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5FcnJvclRlbXBsYXRlIEVycm9yVGVtcGxhdGV9PC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDxwLz4KKyAgICAgKiBWYWx1ZSBjYW4gYmUgYWJzb2x1dGUgb3IgcmVsYXRpdmUgdG8gY3VycmVudCB7QGxpbmsgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dCBzZXJ2bGV0IGNvbnRleHR9LgorICAgICAqIDxwLz4KKyAgICAgKiBUaGVyZSBpcyBubyBkZWZhdWx0IHZhbHVlLgorICAgICAqIDxwLz4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QTEFURV9CQVNFX1BBVEggPSBNdmNGZWF0dXJlLlRFTVBMQVRFX0JBU0VfUEFUSCArIFNVRkZJWDsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZShmaW5hbCBGZWF0dXJlQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlnID0gY29udGV4dC5nZXRDb25maWd1cmF0aW9uKCk7CisKKyAgICAgICAgaWYgKCFjb25maWcuaXNSZWdpc3RlcmVkKEpzcFRlbXBsYXRlUHJvY2Vzc29yLmNsYXNzKSkgeworICAgICAgICAgICAgLy8gVGVtcGxhdGUgUHJvY2Vzc29yLgorICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihKc3BUZW1wbGF0ZVByb2Nlc3Nvci5jbGFzcyk7CisKKyAgICAgICAgICAgIC8vIE12Y0ZlYXR1cmUuCisgICAgICAgICAgICBpZiAoIWNvbmZpZy5pc1JlZ2lzdGVyZWQoTXZjRmVhdHVyZS5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKE12Y0ZlYXR1cmUuY2xhc3MpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L212Yy1qc3Avc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbXZjL2pzcC9Kc3BUZW1wbGF0ZVByb2Nlc3Nvci5qYXZhIGIvZXh0L212Yy1qc3Avc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbXZjL2pzcC9Kc3BUZW1wbGF0ZVByb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NTc2MmYKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvbXZjLWpzcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvanNwL0pzcFRlbXBsYXRlUHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5qc3A7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuUmVxdWVzdERpc3BhdGNoZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uUmVmOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuVHJhY2luZ0xvZ2dlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuVmlld2FibGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5qc3AuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5zcGkuQWJzdHJhY3RUZW1wbGF0ZVByb2Nlc3NvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLnNwaS5SZXNvbHZlZFZpZXdhYmxlOworCisvKioKKyAqIEEgSlNQIHRlbXBsYXRlIHByb2Nlc3NvciBhYmxlIHRvIHByb2Nlc3MgcmVzb3VyY2VzIG9idGFpbmVkIHRocm91Z2gge0BsaW5rIFNlcnZsZXRDb250ZXh0IHNlcnZsZXQgY29udGV4dH0uIFRoaXMgdGVtcGxhdGUKKyAqIHByb2Nlc3NvciBkb2VzIG5vdCBzdXBwb3J0IGNhY2hpbmcgb2YgdGVtcGxhdGUgcmVmZXJlbmNlIG9iamVjdHMgKGluIEplcnNleSkgb3IgcGFzc2luZyBjdXN0b20gdGVtcGxhdGUgb2JqZWN0IGZhY3RvcnkuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK2ZpbmFsIGNsYXNzIEpzcFRlbXBsYXRlUHJvY2Vzc29yIGV4dGVuZHMgQWJzdHJhY3RUZW1wbGF0ZVByb2Nlc3NvcjxTdHJpbmc+IHsKKworICAgIEBJbmplY3QKKyAgICBwcml2YXRlIFByb3ZpZGVyPFJlZjxIdHRwU2VydmxldFJlcXVlc3Q+PiByZXF1ZXN0UHJvdmlkZXJSZWY7CisgICAgQEluamVjdAorICAgIHByaXZhdGUgUHJvdmlkZXI8UmVmPEh0dHBTZXJ2bGV0UmVzcG9uc2U+PiByZXNwb25zZVByb3ZpZGVyUmVmOworICAgIEBJbmplY3QKKyAgICBwcml2YXRlIFByb3ZpZGVyPENvbnRhaW5lclJlcXVlc3Q+IGNvbnRhaW5lclJlcXVlc3RQcm92aWRlcjsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIHByb2Nlc3NvciB3aXRoIGluamVjdGVkIHtAbGluayBDb25maWd1cmF0aW9uIGNvbmZpZ30gYW5kCisgICAgICogKG9wdGlvbmFsKSB7QGxpbmsgU2VydmxldENvbnRleHQgc2VydmxldCBjb250ZXh0fS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25maWcgY29uZmlndXJhdGlvbiB0byBjb25maWd1cmUgdGhpcyBwcm9jZXNzb3IgZnJvbS4KKyAgICAgKiBAcGFyYW0gc2VydmxldENvbnRleHQgKG9wdGlvbmFsKSBzZXJ2bGV0IGNvbnRleHQgdG8gb2J0YWluIHRlbXBsYXRlIHJlc291cmNlcyBmcm9tLgorICAgICAqLworICAgIEBJbmplY3QKKyAgICBwdWJsaWMgSnNwVGVtcGxhdGVQcm9jZXNzb3IoZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWcsIGZpbmFsIFNlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0KSB7CisgICAgICAgIHN1cGVyKGNvbmZpZywgc2VydmxldENvbnRleHQsICJqc3AiLCAianNwIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlKGZpbmFsIFN0cmluZyB0ZW1wbGF0ZVBhdGgsIGZpbmFsIFJlYWRlciByZWFkZXIpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXR1cm4gdGVtcGxhdGVQYXRoOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oZmluYWwgU3RyaW5nIHRlbXBsYXRlUmVmZXJlbmNlLCBmaW5hbCBWaWV3YWJsZSB2aWV3YWJsZSwgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywgZmluYWwgT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoISh2aWV3YWJsZSBpbnN0YW5jZW9mIFJlc29sdmVkVmlld2FibGUpKSB7CisgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuIHdpdGggZGVmYXVsdCBNVkMgbWVzc2FnZSBib2R5IHdyaXRlciBpbXBsZW1lbnRhdGlvbgorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9WSUVXQUJMRV9JTkNPUlJFQ1RfSU5TVEFOQ0UoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTUEkgY291bGQgc3VwcGx5IGluc3RhbmNlIG9mIFJlc29sdmVkVmlld2FibGUgYnV0IHdlIHdvdWxkIGxpa2UgdG8ga2VlcCB0aGUgYmFja3dhcmQKKyAgICAgICAgLy8gY29tcGF0aWJpbGl0eSwgc28gdGhlIGNhc3QgaXMgaGVyZS4KKyAgICAgICAgZmluYWwgUmVzb2x2ZWRWaWV3YWJsZSByZXNvbHZlZFZpZXdhYmxlID0gKFJlc29sdmVkVmlld2FibGUpIHZpZXdhYmxlOworCisKKyAgICAgICAgZmluYWwgVHJhY2luZ0xvZ2dlciB0cmFjaW5nTG9nZ2VyID0gVHJhY2luZ0xvZ2dlci5nZXRJbnN0YW5jZShjb250YWluZXJSZXF1ZXN0UHJvdmlkZXIuZ2V0KCkuZ2V0UHJvcGVydGllc0RlbGVnYXRlKCkpOworICAgICAgICBpZiAodHJhY2luZ0xvZ2dlci5pc0xvZ0VuYWJsZWQoTXZjSnNwRXZlbnQuSlNQX0ZPUldBUkQpKSB7CisgICAgICAgICAgICB0cmFjaW5nTG9nZ2VyLmxvZyhNdmNKc3BFdmVudC5KU1BfRk9SV0FSRCwgdGVtcGxhdGVSZWZlcmVuY2UsIHJlc29sdmVkVmlld2FibGUuZ2V0TW9kZWwoKSk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBSZXF1ZXN0RGlzcGF0Y2hlciBkaXNwYXRjaGVyID0gZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZXF1ZXN0RGlzcGF0Y2hlcih0ZW1wbGF0ZVJlZmVyZW5jZSk7CisgICAgICAgIGlmIChkaXNwYXRjaGVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDb250YWluZXJFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuTk9fUkVRVUVTVF9ESVNQQVRDSEVSX0ZPUl9SRVNPTFZFRF9QQVRIKHRlbXBsYXRlUmVmZXJlbmNlKSk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBSZXF1ZXN0RGlzcGF0Y2hlciB3cmFwcGVyID0gbmV3IFJlcXVlc3REaXNwYXRjaGVyV3JhcHBlcihkaXNwYXRjaGVyLCBnZXRCYXNlUGF0aCgpLCByZXNvbHZlZFZpZXdhYmxlKTsKKworICAgICAgICAvLyBPdXRwdXRTdHJlYW0gYW5kIFdyaXRlciBmb3IgSHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIuCisgICAgICAgIGZpbmFsIFNlcnZsZXRPdXRwdXRTdHJlYW0gcmVzcG9uc2VTdHJlYW0gPSBuZXcgU2VydmxldE91dHB1dFN0cmVhbSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoZmluYWwgaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgb3V0LndyaXRlKGIpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBmaW5hbCBQcmludFdyaXRlciByZXNwb25zZVdyaXRlciA9IG5ldyBQcmludFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKHJlc3BvbnNlU3RyZWFtLCBnZXRFbmNvZGluZygpKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdyYXBwZXIuZm9yd2FyZChyZXF1ZXN0UHJvdmlkZXJSZWYuZ2V0KCkuZ2V0KCksIG5ldyBIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlcihyZXNwb25zZVByb3ZpZGVyUmVmLmdldCgpLmdldCgpKSB7CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgU2VydmxldE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VTdHJlYW07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIFByaW50V3JpdGVyIGdldFdyaXRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZVdyaXRlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBDb250YWluZXJFeGNlcHRpb24oZSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICByZXNwb25zZVdyaXRlci5mbHVzaCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTVZDLUpTUCBzaWRlIHRyYWNpbmcgZXZlbnRzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGVudW0gTXZjSnNwRXZlbnQgaW1wbGVtZW50cyBUcmFjaW5nTG9nZ2VyLkV2ZW50IHsKKyAgICAgICAgSlNQX0ZPUldBUkQoVHJhY2luZ0xvZ2dlci5MZXZlbC5TVU1NQVJZLCAiTVZDIiwgIkZvcndhcmRpbmcgdmlldyB0byBKU1AgcGFnZSBbJXNdLCBtb2RlbCAlcyIpOworCisgICAgICAgIHByaXZhdGUgZmluYWwgVHJhY2luZ0xvZ2dlci5MZXZlbCBsZXZlbDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY2F0ZWdvcnk7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1lc3NhZ2VGb3JtYXQ7CisKKyAgICAgICAgcHJpdmF0ZSBNdmNKc3BFdmVudChmaW5hbCBUcmFjaW5nTG9nZ2VyLkxldmVsIGxldmVsLCBmaW5hbCBTdHJpbmcgY2F0ZWdvcnksIGZpbmFsIFN0cmluZyBtZXNzYWdlRm9ybWF0KSB7CisgICAgICAgICAgICB0aGlzLmxldmVsID0gbGV2ZWw7CisgICAgICAgICAgICB0aGlzLmNhdGVnb3J5ID0gY2F0ZWdvcnk7CisgICAgICAgICAgICB0aGlzLm1lc3NhZ2VGb3JtYXQgPSBtZXNzYWdlRm9ybWF0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgY2F0ZWdvcnkoKSB7CisgICAgICAgICAgICByZXR1cm4gY2F0ZWdvcnk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFRyYWNpbmdMb2dnZXIuTGV2ZWwgbGV2ZWwoKSB7CisgICAgICAgICAgICByZXR1cm4gbGV2ZWw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBtZXNzYWdlRm9ybWF0KCkgeworICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VGb3JtYXQ7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2V4dC9tdmMtanNwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL212Yy9qc3AvUmVxdWVzdERpc3BhdGNoZXJXcmFwcGVyLmphdmEgYi9leHQvbXZjLWpzcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvanNwL1JlcXVlc3REaXNwYXRjaGVyV3JhcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MWJhOTAKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvbXZjLWpzcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvanNwL1JlcXVlc3REaXNwYXRjaGVyV3JhcHBlci5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5qc3A7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXguc2VydmxldC5SZXF1ZXN0RGlzcGF0Y2hlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuc3BpLlJlc29sdmVkVmlld2FibGU7CisKKy8qKgorICoge0BsaW5rIFJlcXVlc3REaXNwYXRjaGVyIFJlcXVlc3QgZGlzcGF0Y2hlciB3cmFwcGVyfSBmb3Igc2V0dGluZyBhdHRyaWJ1dGVzIChlLmcuIHtAY29kZSBpdH0pLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitmaW5hbCBjbGFzcyBSZXF1ZXN0RGlzcGF0Y2hlcldyYXBwZXIgaW1wbGVtZW50cyBSZXF1ZXN0RGlzcGF0Y2hlciB7CisKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEJBU0VfUEFUSF9BVFRSSUJVVEVfTkFNRSA9ICJfYmFzZVBhdGgiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0xEX01PREVMX0FUVFJJQlVURV9OQU1FID0gIml0IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIE1PREVMX0FUVFJJQlVURV9OQU1FID0gIm1vZGVsIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU09MVklOR19DTEFTU19BVFRSSUJVVEVfTkFNRSA9ICJyZXNvbHZpbmdDbGFzcyI7CisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVRVNUX0FUVFJJQlVURV9OQU1FID0gIl9yZXF1ZXN0IjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJFU1BPTlNFX0FUVFJJQlVURV9OQU1FID0gIl9yZXNwb25zZSI7CisKKyAgICBwcml2YXRlIGZpbmFsIFJlcXVlc3REaXNwYXRjaGVyIGRpc3BhdGNoZXI7CisKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBiYXNlUGF0aDsKKworICAgIHByaXZhdGUgZmluYWwgUmVzb2x2ZWRWaWV3YWJsZSB2aWV3YWJsZTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgbmV3IHtAY29kZSBSZXF1ZXN0RGlzcGF0Y2hlcldyYXBwZXJ9IHJlc3BvbnNpYmxlIGZvciBzZXR0aW5nIHJlcXVlc3QgYXR0cmlidXRlcyBhbmQgZm9yd2FyZGluZyB0aGUgcHJvY2Vzc2luZyB0bworICAgICAqIHRoZSBnaXZlbiBkaXNwYXRjaGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGRpc3BhdGNoZXIgZGlzcGF0Y2hlciBwcm9jZXNzaW5nIHRoZSByZXF1ZXN0IGFmdGVyIGFsbCB0aGUgcmVxdWVzdCBhdHRyaWJ1dGVzIHdlcmUgc2V0LgorICAgICAqIEBwYXJhbSBiYXNlUGF0aCBiYXNlIHBhdGggb2YgYWxsIEpTUCBzZXQgdG8ge0B2YWx1ZSAjQkFTRV9QQVRIX0FUVFJJQlVURV9OQU1FfSByZXF1ZXN0IGF0dHJpYnV0ZS4KKyAgICAgKiBAcGFyYW0gdmlld2FibGUgdmlld2FibGUgdG8gb2J0YWluIG1vZGVsIGFuZCByZXNvbHZpbmcgY2xhc3MgZnJvbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVxdWVzdERpc3BhdGNoZXJXcmFwcGVyKAorICAgICAgICAgICAgZmluYWwgUmVxdWVzdERpc3BhdGNoZXIgZGlzcGF0Y2hlciwgZmluYWwgU3RyaW5nIGJhc2VQYXRoLCBmaW5hbCBSZXNvbHZlZFZpZXdhYmxlIHZpZXdhYmxlKSB7CisgICAgICAgIHRoaXMuZGlzcGF0Y2hlciA9IGRpc3BhdGNoZXI7CisgICAgICAgIHRoaXMuYmFzZVBhdGggPSBiYXNlUGF0aDsKKyAgICAgICAgdGhpcy52aWV3YWJsZSA9IHZpZXdhYmxlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZvcndhcmQoZmluYWwgU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgZmluYWwgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBPYmplY3Qgb2xkSXQgPSByZXF1ZXN0LmdldEF0dHJpYnV0ZShNT0RFTF9BVFRSSUJVVEVfTkFNRSk7CisgICAgICAgIGZpbmFsIE9iamVjdCBvbGRSZXNvbHZpbmdDbGFzcyA9IHJlcXVlc3QuZ2V0QXR0cmlidXRlKFJFU09MVklOR19DTEFTU19BVFRSSUJVVEVfTkFNRSk7CisKKyAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoUkVTT0xWSU5HX0NMQVNTX0FUVFJJQlVURV9OQU1FLCB2aWV3YWJsZS5nZXRSZXNvbHZpbmdDbGFzcygpKTsKKworICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZShPTERfTU9ERUxfQVRUUklCVVRFX05BTUUsIHZpZXdhYmxlLmdldE1vZGVsKCkpOworICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZShNT0RFTF9BVFRSSUJVVEVfTkFNRSwgdmlld2FibGUuZ2V0TW9kZWwoKSk7CisKKyAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoQkFTRV9QQVRIX0FUVFJJQlVURV9OQU1FLCBiYXNlUGF0aCk7CisgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKFJFUVVFU1RfQVRUUklCVVRFX05BTUUsIHJlcXVlc3QpOworICAgICAgICByZXF1ZXN0LnNldEF0dHJpYnV0ZShSRVNQT05TRV9BVFRSSUJVVEVfTkFNRSwgcmVzcG9uc2UpOworCisgICAgICAgIGRpc3BhdGNoZXIuZm9yd2FyZChyZXF1ZXN0LCByZXNwb25zZSk7CisKKyAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoUkVTT0xWSU5HX0NMQVNTX0FUVFJJQlVURV9OQU1FLCBvbGRSZXNvbHZpbmdDbGFzcyk7CisgICAgICAgIHJlcXVlc3Quc2V0QXR0cmlidXRlKE1PREVMX0FUVFJJQlVURV9OQU1FLCBvbGRJdCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaW5jbHVkZShmaW5hbCBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBmaW5hbCBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZXh0L212Yy1qc3Avc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbXZjL2pzcC9wYWNrYWdlLWluZm8uamF2YSBiL2V4dC9tdmMtanNwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL212Yy9qc3AvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNjNDMyNgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9tdmMtanNwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL212Yy9qc3AvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoqCisgKiBKZXJzZXkgc2VydmVyLXNpZGUgTVZDIHN1cHBvcnQgZm9yIHNlcnZsZXQgY29udGFpbmVycy4KKyAqIDxwLz4KKyAqIE5vdGU6IEplcnNleSBhcHBsaWNhdGlvbnMgdGhhdCB3YW50IHRvIHVzZSBNVkMgZmVhdHVyZXMgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgYXMgZmlsdGVycyBpbnN0ZWFkIG9mIHNlcnZsZXRzIGluIHdlYi54bWwgKHRvCisgKiBmdWxseSB0YWtlIGFkdmFudGFnZSBvZiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5qc3AuSnNwTXZjRmVhdHVyZX0pLiBXZWIueG1sLWxlc3MgZGVwbG95bWVudCBvZiBhbiBhcHBsaWNhdGlvbgorICogdXNpbmcgTVZDIGlzIG5vdCBzdXBwb3J0ZWQgYXQgdGhlIG1vbWVudC4KKyAqCisgKiBAc2VlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuanNwLkpzcFRlbXBsYXRlUHJvY2Vzc29yCisgKi8KK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5qc3A7CmRpZmYgLS1naXQgYS9leHQvbXZjLWpzcC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdGFnbGliLnRsZCBiL2V4dC9tdmMtanNwL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi90YWdsaWIudGxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZTY1ODUKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvbXZjLWpzcC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdGFnbGliLnRsZApAQCAtMCwwICsxLDYxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx0YWdsaWIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKKyAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1qc3B0YWdsaWJyYXJ5XzJfMS54c2QiCisgICAgICAgIHZlcnNpb249IjIuMSI+CisKKyAgICA8ZGVzY3JpcHRpb24+VGhlIHRhZyBsaWJyYXJ5IGNvbnRhaW5zIHRhZ3MgdGhhdCB0YWtlcyBhZHZhbnRhZ2Ugb2YgdGhlIHJlcXVlc3QgZGlzcGF0Y2hpbmcgbWVjaGFuaXNtLjwvZGVzY3JpcHRpb24+CisgICAgPHRsaWItdmVyc2lvbj4xLjA8L3RsaWItdmVyc2lvbj4KKyAgICA8c2hvcnQtbmFtZT5qZXJzZXktbXZjLWpzcDwvc2hvcnQtbmFtZT4KKyAgICA8dXJpPnVybjpvcmc6Z2xhc3NmaXNoOmplcnNleTpzZXJ2bGV0Om12YzwvdXJpPgorCisgICAgPHRhZz4KKyAgICAgICAgPG5hbWU+aW5jbHVkZTwvbmFtZT4KKyAgICAgICAgPHRhZy1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLmpzcC5JbmNsdWRlPC90YWctY2xhc3M+CisgICAgICAgIDxib2R5LWNvbnRlbnQ+ZW1wdHk8L2JvZHktY29udGVudD4KKyAgICAgICAgPGF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDxuYW1lPnBhZ2U8L25hbWU+CisgICAgICAgICAgICA8cmVxdWlyZWQ+eWVzPC9yZXF1aXJlZD4KKyAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT55ZXM8L3J0ZXhwcnZhbHVlPgorICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICAgICAgPGF0dHJpYnV0ZT4KKyAgICAgICAgICAgIDxuYW1lPnJlc291cmNlPC9uYW1lPgorICAgICAgICAgICAgPHJlcXVpcmVkPm5vPC9yZXF1aXJlZD4KKyAgICAgICAgICAgIDxydGV4cHJ2YWx1ZT55ZXM8L3J0ZXhwcnZhbHVlPgorICAgICAgICA8L2F0dHJpYnV0ZT4KKyAgICA8L3RhZz4KKzwvdGFnbGliPgorCisKKworCisKKworCisKKworCisKKworCisKKworCmRpZmYgLS1naXQgYS9leHQvbXZjLWpzcC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5qc3AuaW50ZXJuYWwvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMgYi9leHQvbXZjLWpzcC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5qc3AuaW50ZXJuYWwvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgxY2Q0YwotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9tdmMtanNwL3NyYy9tYWluL3Jlc291cmNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLmpzcC5pbnRlcm5hbC9sb2NhbGl6YXRpb24ucHJvcGVydGllcwpAQCAtMCwwICsxLDIyIEBACisjCisjIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorIworIyBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisjIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyMgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisjIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyMKKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisjCisKKyMgezB9IC0gcGF0aAorZXJyb3Iudmlld2FibGUuaW5jb3JyZWN0Lmluc3RhbmNlPXZpZXdhYmxlIGFyZ3VtZW50IG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgUmVzb2x2ZWRWaWV3YWJsZS4KK25vLnJlcXVlc3QuZGlzcGF0Y2hlci5mb3IucmVzb2x2ZWQucGF0aD1ObyByZXF1ZXN0IGRpc3BhdGNoZXIgZm9yOiB7MH0KKyMgezB9IC0gcGF0aAorcmVzb3VyY2UucGF0aC5ub3QuaW4uY29ycmVjdC5mb3JtPVJlc291cmNlIHBhdGggInswfSIgaXMgbm90IGluIGNvcnJlY3QgZm9ybS4KK3VuYWJsZS50by5maW5kLnBhZ2UuZm9yLnJlc29sdmluZy5jbGFzcz1VbmFibGUgdG8gZmluZCAiezB9IiBmb3IgezF9LgpkaWZmIC0tZ2l0IGEvZXh0L212Yy1tdXN0YWNoZS9wb20ueG1sIGIvZXh0L212Yy1tdXN0YWNoZS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYzc0N2MKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvbXZjLW11c3RhY2hlL3BvbS54bWwKQEAgLTAsMCArMSw3MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LW12Yy1tdXN0YWNoZTwvYXJ0aWZhY3RJZD4KKyAgICA8bmFtZT5qZXJzZXktZXh0LW12Yy1tdXN0YWNoZTwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgSmVyc2V5IGV4dGVuc2lvbiBtb2R1bGUgcHJvdmlkaW5nIHN1cHBvcnQgZm9yIE11c3RhY2hlIHRlbXBsYXRlcy4KKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5mZWxpeDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1idW5kbGUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgICAgIDxleHRlbnNpb25zPnRydWU8L2V4dGVuc2lvbnM+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxpbnN0cnVjdGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8RXhwb3J0LVBhY2thZ2U+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5tdXN0YWNoZS4qO3ZlcnNpb249JHtwcm9qZWN0LnZlcnNpb259PC9FeHBvcnQtUGFja2FnZT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbnN0cnVjdGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDx1bnBhY2tCdW5kbGU+dHJ1ZTwvdW5wYWNrQnVuZGxlPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW12YzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmdpdGh1Yi5zcHVsbGFyYS5tdXN0YWNoZS5qYXZhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tcGlsZXI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke211c3RhY2hlLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3NlcnZsZXQyLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4dC9tdmMtbXVzdGFjaGUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbXZjL211c3RhY2hlL011c3RhY2hlTXZjRmVhdHVyZS5qYXZhIGIvZXh0L212Yy1tdXN0YWNoZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvbXVzdGFjaGUvTXVzdGFjaGVNdmNGZWF0dXJlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY3NzI1MwotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9tdmMtbXVzdGFjaGUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbXZjL211c3RhY2hlL011c3RhY2hlTXZjRmVhdHVyZS5qYXZhCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMubXVzdGFjaGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdHJhaW5lZFRvOworaW1wb3J0IGphdmF4LndzLnJzLlJ1bnRpbWVUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlQ29udGV4dDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuTXZjRmVhdHVyZTsKKworLyoqCisgKiB7QGxpbmsgRmVhdHVyZX0gdXNlZCB0byBhZGQgc3VwcG9ydCBmb3Ige0BsaW5rIE12Y0ZlYXR1cmUgTVZDfSBhbmQgTXVzdGFjaGUgdGVtcGxhdGVzLgorICogPHAvPgorICogTm90ZTogVGhpcyBmZWF0dXJlIGFsc28gcmVnaXN0ZXJzIHtAbGluayBNdmNGZWF0dXJlfS4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqIEBzaW5jZSAyLjMKKyAqLworQENvbnN0cmFpbmVkVG8oUnVudGltZVR5cGUuU0VSVkVSKQorcHVibGljIGNsYXNzIE11c3RhY2hlTXZjRmVhdHVyZSBpbXBsZW1lbnRzIEZlYXR1cmUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNVRkZJWCA9ICIubXVzdGFjaGUiOworCisgICAgLyoqCisgICAgICoge0BsaW5rIFN0cmluZ30gcHJvcGVydHkgZGVmaW5pbmcgdGhlIGJhc2UgcGF0aCB0byBNdXN0YWNoZSB0ZW1wbGF0ZXMuIElmIHNldCwgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBpcyBhZGRlZCBpbiBmcm9udAorICAgICAqIG9mIHRoZSB0ZW1wbGF0ZSBuYW1lIGRlZmluZWQgaW46CisgICAgICogPHVsPgorICAgICAqIDxsaT57QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5WaWV3YWJsZSBWaWV3YWJsZX08L2xpPgorICAgICAqIDxsaT57QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5UZW1wbGF0ZSBUZW1wbGF0ZX0sIG9yPC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuRXJyb3JUZW1wbGF0ZSBFcnJvclRlbXBsYXRlfTwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8cC8+CisgICAgICogVmFsdWUgY2FuIGJlIGFic29sdXRlIHByb3ZpZGluZyBhIGZ1bGwgcGF0aCB0byBhIHN5c3RlbSBkaXJlY3Rvcnkgd2l0aCB0ZW1wbGF0ZXMgb3IgcmVsYXRpdmUgdG8gY3VycmVudAorICAgICAqIHtAbGluayBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0IHNlcnZsZXQgY29udGV4dH0uCisgICAgICogPHAvPgorICAgICAqIFRoZXJlIGlzIG5vIGRlZmF1bHQgdmFsdWUuCisgICAgICogPHAvPgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDx0dD57QHZhbHVlfTwvdHQ+LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFX0JBU0VfUEFUSCA9IE12Y0ZlYXR1cmUuVEVNUExBVEVfQkFTRV9QQVRIICsgU1VGRklYOworCisgICAgLyoqCisgICAgICogSWYge0Bjb2RlIHRydWV9IHRoZW4gZW5hYmxlIGNhY2hpbmcgb2YgTXVzdGFjaGUgdGVtcGxhdGVzIHRvIGF2b2lkIG11bHRpcGxlIGNvbXBpbGF0aW9uLgorICAgICAqIDxwLz4KKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB7QGNvZGUgZmFsc2V9LgorICAgICAqIDxwLz4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKgorICAgICAqIEBzaW5jZSAyLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUNIRV9URU1QTEFURVMgPSBNdmNGZWF0dXJlLkNBQ0hFX1RFTVBMQVRFUyArIFNVRkZJWDsKKworICAgIC8qKgorICAgICAqIFByb3BlcnR5IHVzZWQgdG8gcGFzcyB1c2VyLWNvbmZpZ3VyZWQge0BsaW5rIGNvbS5naXRodWIubXVzdGFjaGVqYXZhLk11c3RhY2hlRmFjdG9yeSBmYWN0b3J5fSBhYmxlIHRvIGNyZWF0ZQorICAgICAqIHtAbGluayBjb20uZ2l0aHViLm11c3RhY2hlamF2YS5NdXN0YWNoZSBNdXN0YWNoZSB0ZW1wbGF0ZXN9LgorICAgICAqIDxwLz4KKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBub3Qgc2V0LgorICAgICAqIDxwLz4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKgorICAgICAqIEBzaW5jZSAyLjUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QTEFURV9PQkpFQ1RfRkFDVE9SWSA9IE12Y0ZlYXR1cmUuVEVNUExBVEVfT0JKRUNUX0ZBQ1RPUlkgKyBTVUZGSVg7CisKKyAgICAvKioKKyAgICAgKiBQcm9wZXJ0eSBkZWZpbmVzIG91dHB1dCBlbmNvZGluZyBwcm9kdWNlZCBieSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5zcGkuVGVtcGxhdGVQcm9jZXNzb3J9LgorICAgICAqIFRoZSB2YWx1ZSBtdXN0IGJlIGEgdmFsaWQgZW5jb2RpbmcgZGVmaW5lZCB0aGF0IGNhbiBiZSBwYXNzZWQKKyAgICAgKiB0byB0aGUge0BsaW5rIGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldCNmb3JOYW1lKFN0cmluZyl9IG1ldGhvZC4KKyAgICAgKgorICAgICAqIDxwLz4KKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB7QGNvZGUgVVRGLTh9LgorICAgICAqIDxwLz4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKiA8cC8+CisgICAgICoKKyAgICAgKiBAc2luY2UgMi43CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5DT0RJTkcgPSBNdmNGZWF0dXJlLkVOQ09ESU5HICsgU1VGRklYOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlKGZpbmFsIEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWcgPSBjb250ZXh0LmdldENvbmZpZ3VyYXRpb24oKTsKKworICAgICAgICBpZiAoIWNvbmZpZy5pc1JlZ2lzdGVyZWQoTXVzdGFjaGVUZW1wbGF0ZVByb2Nlc3Nvci5jbGFzcykpIHsKKyAgICAgICAgICAgIC8vIFRlbXBsYXRlIFByb2Nlc3Nvci4KKyAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoTXVzdGFjaGVUZW1wbGF0ZVByb2Nlc3Nvci5jbGFzcyk7CisKKyAgICAgICAgICAgIC8vIE12Y0ZlYXR1cmUuCisgICAgICAgICAgICBpZiAoIWNvbmZpZy5pc1JlZ2lzdGVyZWQoTXZjRmVhdHVyZS5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKE12Y0ZlYXR1cmUuY2xhc3MpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L212Yy1tdXN0YWNoZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvbXVzdGFjaGUvTXVzdGFjaGVUZW1wbGF0ZVByb2Nlc3Nvci5qYXZhIGIvZXh0L212Yy1tdXN0YWNoZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvbXVzdGFjaGUvTXVzdGFjaGVUZW1wbGF0ZVByb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzOWM1MGIKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvbXZjLW11c3RhY2hlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL212Yy9tdXN0YWNoZS9NdXN0YWNoZVRlbXBsYXRlUHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLm11c3RhY2hlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5WaWV3YWJsZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLnNwaS5BYnN0cmFjdFRlbXBsYXRlUHJvY2Vzc29yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuc3BpLlRlbXBsYXRlUHJvY2Vzc29yOworCitpbXBvcnQgY29tLmdpdGh1Yi5tdXN0YWNoZWphdmEuRGVmYXVsdE11c3RhY2hlRmFjdG9yeTsKK2ltcG9ydCBjb20uZ2l0aHViLm11c3RhY2hlamF2YS5NdXN0YWNoZTsKK2ltcG9ydCBjb20uZ2l0aHViLm11c3RhY2hlamF2YS5NdXN0YWNoZUZhY3Rvcnk7CisKKy8qKgorICoge0BsaW5rIFRlbXBsYXRlUHJvY2Vzc29yIFRlbXBsYXRlIHByb2Nlc3Nvcn0gcHJvdmlkaW5nIHN1cHBvcnQgZm9yIE11c3RhY2hlIHRlbXBsYXRlcy4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqIEBzZWUgTXVzdGFjaGVNdmNGZWF0dXJlCisgKiBAc2luY2UgMi4zCisgKi8KK0BTaW5nbGV0b24KK2ZpbmFsIGNsYXNzIE11c3RhY2hlVGVtcGxhdGVQcm9jZXNzb3IgZXh0ZW5kcyBBYnN0cmFjdFRlbXBsYXRlUHJvY2Vzc29yPE11c3RhY2hlPiB7CisKKyAgICBwcml2YXRlIGZpbmFsIE11c3RhY2hlRmFjdG9yeSBmYWN0b3J5OworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoaXMgcHJvY2Vzc29yIHdpdGggaW5qZWN0ZWQge0BsaW5rIENvbmZpZ3VyYXRpb24gY29uZmlnfSBhbmQgKG51bGxhYmxlKQorICAgICAqIHtAbGluayBTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0IGNvbnRleHR9LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZyAgICAgICAgICAgY29uZmlndXJhdGlvbiB0byBjb25maWd1cmUgdGhpcyBwcm9jZXNzb3IgZnJvbS4KKyAgICAgKiBAcGFyYW0gaW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb24gbWFuYWdlci4KKyAgICAgKi8KKyAgICBASW5qZWN0CisgICAgcHVibGljIE11c3RhY2hlVGVtcGxhdGVQcm9jZXNzb3IoQ29uZmlndXJhdGlvbiBjb25maWcsIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlcikgeworICAgICAgICBzdXBlcihjb25maWcsIGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoU2VydmxldENvbnRleHQuY2xhc3MpLCAibXVzdGFjaGUiLCAibXVzdGFjaGUiKTsKKworICAgICAgICB0aGlzLmZhY3RvcnkgPSBnZXRUZW1wbGF0ZU9iamVjdEZhY3RvcnkoaW5qZWN0aW9uTWFuYWdlcjo6Y3JlYXRlQW5kSW5pdGlhbGl6ZSwgTXVzdGFjaGVGYWN0b3J5LmNsYXNzLAorICAgICAgICAgICAgICAgIERlZmF1bHRNdXN0YWNoZUZhY3Rvcnk6Om5ldyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIE11c3RhY2hlIHJlc29sdmUoZmluYWwgU3RyaW5nIHRlbXBsYXRlUGF0aCwgZmluYWwgUmVhZGVyIHJlYWRlcikgeworICAgICAgICByZXR1cm4gZmFjdG9yeS5jb21waWxlKHJlYWRlciwgdGVtcGxhdGVQYXRoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIE11c3RhY2hlIG11c3RhY2hlLCBmaW5hbCBWaWV3YWJsZSB2aWV3YWJsZSwgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywgZmluYWwgT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQ2hhcnNldCBlbmNvZGluZyA9IHNldENvbnRlbnRUeXBlKG1lZGlhVHlwZSwgaHR0cEhlYWRlcnMpOworICAgICAgICBtdXN0YWNoZS5leGVjdXRlKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIob3V0LCBlbmNvZGluZyksIHZpZXdhYmxlLmdldE1vZGVsKCkpLmZsdXNoKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L212Yy1tdXN0YWNoZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvbXVzdGFjaGUvcGFja2FnZS1pbmZvLmphdmEgYi9leHQvbXZjLW11c3RhY2hlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL212Yy9tdXN0YWNoZS9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTdhYjA5Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L212Yy1tdXN0YWNoZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvbXVzdGFjaGUvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoqCisgKiBKZXJzZXkgc2VydmVyLXNpZGUgY2xhc3NlcyBhZGRpbmcgc3VwcG9ydCBvZiBNdXN0YWNoZSB0byBKZXJzZXkgTVZDIChNb2RlbCBWaWV3IENvbnRyb2xsZXIpLgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMubXVzdGFjaGU7CmRpZmYgLS1naXQgYS9leHQvbXZjL3BvbS54bWwgYi9leHQvbXZjL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEwZmY1ZQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9tdmMvcG9tLnhtbApAQCAtMCwwICsxLDc2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQ8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbXZjPC9hcnRpZmFjdElkPgorICAgIDxuYW1lPmplcnNleS1leHQtbXZjPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBKZXJzZXkgZXh0ZW5zaW9uIG1vZHVsZSBwcm92aWRpbmcgc3VwcG9ydCBmb3IgTVZDLgorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7c2VydmxldDIudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktc2VydmVyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLmlzdGFjazwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1pc3RhY2stY29tbW9ucy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YnVpbGQtaGVscGVyLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmZlbGl4PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWJ1bmRsZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+CisgICAgICAgICAgICAgICAgPGV4dGVuc2lvbnM+dHJ1ZTwvZXh0ZW5zaW9ucz4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGluc3RydWN0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxFeHBvcnQtUGFja2FnZT5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLio7dmVyc2lvbj0ke3Byb2plY3QudmVyc2lvbn08L0V4cG9ydC1QYWNrYWdlPgorICAgICAgICAgICAgICAgICAgICA8L2luc3RydWN0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPHVucGFja0J1bmRsZT50cnVlPC91bnBhY2tCdW5kbGU+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXh0L212Yy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvRXJyb3JUZW1wbGF0ZS5qYXZhIGIvZXh0L212Yy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvRXJyb3JUZW1wbGF0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MDBjOTMKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvbXZjL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL212Yy9FcnJvclRlbXBsYXRlLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworLyoqCisgKiBVc2VkIHRvIGFubm90YXRlIEpBWC1SUyByZXNvdXJjZXMgYW5kIHJlc291cmNlIG1ldGhvZHMgdG8gcHJvdmlkZSByZWZlcmVuY2UgdG8gYW4gZXJyb3IgdGVtcGxhdGUgaWYgYW4gZXhjZXB0aW9uIGhhcyBiZWVuCisgKiByYWlzZWQgZHVyaW5nIHByb2Nlc3NpbmcgYSByZXF1ZXN0IChyZXNvdXJjZSBtZXRob2QgaW52b2NhdGlvbikuCisgKiA8cC8+CisgKiBUaGUgcHJvY2Vzc2luZyBvZiB0aGlzIGFubm90YXRpb24gaXMgc2ltaWxhciB0byB0aGUgcHJvY2Vzc2luZyBvZiB7QGxpbmsgVGVtcGxhdGV9IGFubm90YXRpb24gd2l0aCB0aGUgZGlmZmVyZW5jZSB0aGF0IHRoZQorICogdGhyb3duIGV4Y2VwdGlvbiAob3IgYW4gb2JqZWN0IGRlcml2ZWQgZnJvbSB0aGUgZXhjZXB0aW9uKSBpcyB1c2VkIGFzIGEgbW9kZWwgZm9yIHRoZSBkZWZpbmVkIHRlbXBsYXRlLgorICogPHAvPgorICogQnkgZGVmYXVsdCBldmVyeSB7QGxpbmsgRXhjZXB0aW9uIGV4Y2VwdGlvbn0gaXMgbWFwcGVkIHRvIGEgdmlld2FibGUgYW5kIHBhc3NlZCB0byB0aGUgTVZDIHJ1bnRpbWUgZm9yIGZ1cnRoZXIgcHJvY2Vzc2luZy4KKyAqIDxwLz4KKyAqIE5vdGU6IFRoZSB7QGxpbmsgRXJyb3JUZW1wbGF0ZX0gYW5ub3RhdGlvbiBjYW4gYmUgdXNlZCBldmVuIGluIGNhc2Ugd2hlbiBuZWl0aGVyIHtAbGluayBWaWV3YWJsZSB2aWV3YWJsZX0gaXMgdXNlZCBhcyByZXR1cm4KKyAqIHZhbHVlIG9mIGEgcmVzb3VyY2UgbWV0aG9kIG5vciB7QGxpbmsgVGVtcGxhdGV9IGFubm90YXRpb24gaXMgdXNlZCB0byBhbm5vdGF0ZSB0aGUgcmVzb3VyY2UgbWV0aG9kIG9yIHJlc291cmNlIGNsYXNzLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICogQHNlZSBUZW1wbGF0ZQorICogQHNlZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLnNwaS5BYnN0cmFjdEVycm9yVGVtcGxhdGVNYXBwZXIKKyAqIEBzaW5jZSAyLjMKKyAqLworQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BUYXJnZXQoe0VsZW1lbnRUeXBlLlRZUEUsIEVsZW1lbnRUeXBlLk1FVEhPRH0pCitARG9jdW1lbnRlZAorcHVibGljIEBpbnRlcmZhY2UgRXJyb3JUZW1wbGF0ZSB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGVtcGxhdGUgbmFtZSB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGRpc3BsYXkgYW4gZXJyb3IgcmFpc2VkIGR1cmluZyBwcm9jZXNzaW5nIGEgcmVxdWVzdC4gVGhlIHRlbXBsYXRlIG5hbWUgbWF5IGJlCisgICAgICogZGVjbGFyZWQgYXMgYWJzb2x1dGUgdGVtcGxhdGUgbmFtZSBpZiB0aGUgbmFtZSBiZWdpbnMgd2l0aCBhICcvJywgb3RoZXJ3aXNlIHRoZSB0ZW1wbGF0ZSBuYW1lIGlzIHJlY29nbml6ZWQgdG8gYmUgcmVsYXRpdmUuCisgICAgICovCisgICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOworfQpkaWZmIC0tZ2l0IGEvZXh0L212Yy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvTXZjRmVhdHVyZS5qYXZhIGIvZXh0L212Yy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvTXZjRmVhdHVyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MzM3NmMKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvbXZjL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL212Yy9NdmNGZWF0dXJlLmphdmEKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12YzsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN0cmFpbmVkVG87CitpbXBvcnQgamF2YXgud3MucnMuUnVudGltZVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmVDb250ZXh0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5pbnRlcm5hbC5FcnJvclRlbXBsYXRlRXhjZXB0aW9uTWFwcGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuaW50ZXJuYWwuTXZjQmluZGVyOworCisvKioKKyAqIHtAY29kZSBNdmNGZWF0dXJlfSB1c2VkIHRvIGFkZCBNVkMgc3VwcG9ydCB0byB0aGUgc2VydmVyLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAQ29uc3RyYWluZWRUbyhSdW50aW1lVHlwZS5TRVJWRVIpCitwdWJsaWMgZmluYWwgY2xhc3MgTXZjRmVhdHVyZSBpbXBsZW1lbnRzIEZlYXR1cmUgeworCisgICAgLyoqCisgICAgICoge0BsaW5rIFN0cmluZ30gcHJvcGVydHkgZGVmaW5pbmcgdGhlIGJhc2UgcGF0aCB0byBNVkMgdGVtcGxhdGVzLiBJZiBzZXQsIHRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgaXMgYWRkZWQgaW4gZnJvbnQKKyAgICAgKiBvZiB0aGUgdGVtcGxhdGUgbmFtZSBkZWZpbmVkIGluOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+e0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuVmlld2FibGUgVmlld2FibGV9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuVGVtcGxhdGUgVGVtcGxhdGV9LCBvcjwvbGk+CisgICAgICogPGxpPntAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLkVycm9yVGVtcGxhdGUgRXJyb3JUZW1wbGF0ZX08L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPHAvPgorICAgICAqIFZhbHVlIGNhbiBiZSBhYnNvbHV0ZSBwcm92aWRpbmcgYSBmdWxsIHBhdGggdG8gYSBzeXN0ZW0gZGlyZWN0b3J5IHdpdGggdGVtcGxhdGVzIG9yIHJlbGF0aXZlIHRvIGN1cnJlbnQKKyAgICAgKiB7QGxpbmsgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dCBzZXJ2bGV0IGNvbnRleHR9LgorICAgICAqIDxwLz4KKyAgICAgKiBUaGVyZSBpcyBubyBkZWZhdWx0IHZhbHVlLgorICAgICAqIDxwLz4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QTEFURV9CQVNFX1BBVEggPSAiamVyc2V5LmNvbmZpZy5zZXJ2ZXIubXZjLnRlbXBsYXRlQmFzZVBhdGgiOworCisgICAgLyoqCisgICAgICogSWYge0Bjb2RlIHRydWV9IHRoZW4gZW5hYmxlIGNhY2hpbmcgb2YgdGVtcGxhdGUgb2JqZWN0cywgaS5lLiB0byBhdm9pZCBtdWx0aXBsZSBjb21waWxhdGlvbnMgb2YgYSB0ZW1wbGF0ZS4KKyAgICAgKiA8cC8+CisgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMge0Bjb2RlIGZhbHNlfS4KKyAgICAgKiA8cC8+CisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaXMgPHR0PntAdmFsdWV9PC90dD4uCisgICAgICogPHAvPgorICAgICAqIE5vdGU6IFRoaXMgcHJvcGVydHkgaXMgdXNlZCBhcyBjb21tb24gcHJlZml4IGZvciBzcGVjaWZpYworICAgICAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLnNwaS5UZW1wbGF0ZVByb2Nlc3NvciB0ZW1wbGF0ZSBwcm9jZXNzb3JzfSBwcm9wZXJ0aWVzIGFuZCBtaWdodCBub3QgYmUgc3VwcG9ydGVkIGJ5CisgICAgICogYWxsIHRlbXBsYXRlIHByb2Nlc3NvcnMuCisgICAgICoKKyAgICAgKiBAc2luY2UgMi41CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FDSEVfVEVNUExBVEVTID0gImplcnNleS5jb25maWcuc2VydmVyLm12Yy5jYWNoaW5nIjsKKworICAgIC8qKgorICAgICAqIFByb3BlcnR5IHVzZWQgdG8gcGFzcyB1c2VyLWNvbmZpZ3VyZWQgZmFjdG9yeSBhYmxlIHRvIGNyZWF0ZSB0ZW1wbGF0ZSBvYmplY3RzLiBWYWx1ZSBvZiB0aGUgcHJvcGVydHkgaXMgc3VwcG9zZWQgdG8gYmUgYW4KKyAgICAgKiBpbnN0YW5jZSBvZiAidGVtcGxhdGluZyBlbmdpbmUiLXNwZWNpZmljIGZhY3RvcnksIGEgY2xhc3Mgb2YgdGhlIGZhY3Rvcnkgb3IgY2xhc3MtbmFtZSBvZiB0aGUgZmFjdG9yeS4KKyAgICAgKiA8cC8+CisgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgbm90IHNldC4KKyAgICAgKiA8cC8+CisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaXMgPHR0PntAdmFsdWV9PC90dD4uCisgICAgICogPHAvPgorICAgICAqIE5vdGU6IFRoaXMgcHJvcGVydHkgaXMgdXNlZCBhcyBjb21tb24gcHJlZml4IGZvciBzcGVjaWZpYworICAgICAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLnNwaS5UZW1wbGF0ZVByb2Nlc3NvciB0ZW1wbGF0ZSBwcm9jZXNzb3JzfSBwcm9wZXJ0aWVzIGFuZCBtaWdodCBub3QgYmUgc3VwcG9ydGVkIGJ5CisgICAgICogYWxsIHRlbXBsYXRlIHByb2Nlc3NvcnMuCisgICAgICoKKyAgICAgKiBAc2luY2UgMi41CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVNUExBVEVfT0JKRUNUX0ZBQ1RPUlkgPSAiamVyc2V5LmNvbmZpZy5zZXJ2ZXIubXZjLmZhY3RvcnkiOworCisgICAgLyoqCisgICAgICogUHJvcGVydHkgZGVmaW5lcyBvdXRwdXQgZW5jb2RpbmcgcHJvZHVjZWQgYnkge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuc3BpLlRlbXBsYXRlUHJvY2Vzc29yfS4gVGhlIHZhbHVlCisgICAgICogbXVzdCBiZSBhIHZhbGlkIGVuY29kaW5nIGRlZmluZWQgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRoZSB7QGxpbmsgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0I2Zvck5hbWUoU3RyaW5nKX0gbWV0aG9kLgorICAgICAqIDxwLz4KKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB7QGNvZGUgVVRGLTh9LgorICAgICAqIDxwLz4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKiA8cC8+CisgICAgICogTm90ZTogVGhpcyBwcm9wZXJ0eSBpcyB1c2VkIGFzIGNvbW1vbiBwcmVmaXggZm9yIHNwZWNpZmljCisgICAgICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuc3BpLlRlbXBsYXRlUHJvY2Vzc29yIHRlbXBsYXRlIHByb2Nlc3NvcnN9IHByb3BlcnRpZXMgYW5kIG1pZ2h0IG5vdCBiZSBzdXBwb3J0ZWQgYnkKKyAgICAgKiBhbGwgdGVtcGxhdGUgcHJvY2Vzc29ycy4KKyAgICAgKgorICAgICAqIEBzaW5jZSAyLjcKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTkNPRElORyA9ICJqZXJzZXkuY29uZmlnLnNlcnZlci5tdmMuZW5jb2RpbmciOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlKGZpbmFsIEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWcgPSBjb250ZXh0LmdldENvbmZpZ3VyYXRpb24oKTsKKworICAgICAgICBpZiAoIWNvbmZpZy5pc1JlZ2lzdGVyZWQoRXJyb3JUZW1wbGF0ZUV4Y2VwdGlvbk1hcHBlci5jbGFzcykpIHsKKyAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoRXJyb3JUZW1wbGF0ZUV4Y2VwdGlvbk1hcHBlci5jbGFzcyk7CisgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKG5ldyBNdmNCaW5kZXIoKSk7CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9tdmMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbXZjL1RlbXBsYXRlLmphdmEgYi9leHQvbXZjL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL212Yy9UZW1wbGF0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwYjViZmEKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvbXZjL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL212Yy9UZW1wbGF0ZS5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12YzsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkluaGVyaXRlZDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworLyoqCisgKiBVc2VkIHRvIGFubm90YXRlIEpBWC1SUyByZXNvdXJjZXMgYW5kIHJlc291cmNlIG1ldGhvZHMgdG8gcHJvdmlkZSByZWZlcmVuY2UgdG8gYSB0ZW1wbGF0ZSBmb3IgTVZDIHN1cHBvcnQuCisgKiA8cC8+CisgKiBJbiBjYXNlIGEgcmVzb3VyY2UgY2xhc3MgaXMgYW5ub3RhdGVkIHdpdGgge0BsaW5rIFRlbXBsYXRlfSBhbm5vdGF0aW9uIHRoZW4gYW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBpcyBjb25zaWRlcmVkIHRvIGJlCisgKiB0aGUgbW9kZWwuIFByb2R1Y2libGUge0BsaW5rIGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlIG1lZGlhIHR5cGVzfSBhcmUgZGV0ZXJtaW5lZCBmcm9tIHRoZSByZXNvdXJjZSBjbGFzc2VzCisgKiB7QGxpbmsgamF2YXgud3MucnMuUHJvZHVjZXN9IGFubm90YXRpb24uCisgKiA8cC8+CisgKiBJbiBjYXNlIGEgcmVzb3VyY2UgbWV0aG9kIGlzIGFubm90YXRlZCB3aXRoIHtAbGluayBUZW1wbGF0ZX0gYW5ub3RhdGlvbiB0aGVuIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIG1ldGhvZCBpcyB0aGUgbW9kZWwuCisgKiBPdGhlcndpc2UgdGhlIHByb2Nlc3Npbmcgb2Ygc3VjaCBhIG1ldGhvZCBpcyB0aGUgc2FtZSBhcyBpZiB0aGUgIHJldHVybiB0eXBlIG9mIHRoZSBtZXRob2Qgd2FzIHtAbGluayBWaWV3YWJsZX0gY2xhc3MuCisgKiBQcm9kdWNpYmxlIHtAbGluayBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZSBtZWRpYSB0eXBlc30gYXJlIGRldGVybWluZWQgZnJvbSB0aGUgbWV0aG9kJ3Mge0BsaW5rIGphdmF4LndzLnJzLlByb2R1Y2VzfQorICogYW5ub3RhdGlvbi4KKyAqIDxwLz4KKyAqIFRvIHNlZSBob3cgdGVtcGxhdGVzIGFyZSBiZWluZyByZXNvbHZlZCwgc2VlIHtAbGluayBWaWV3YWJsZSB2aWV3YWJsZX0uCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKiBAc2VlIFZpZXdhYmxlCisgKi8KK0BJbmhlcml0ZWQKK0BUYXJnZXQoe0VsZW1lbnRUeXBlLlRZUEUsIEVsZW1lbnRUeXBlLk1FVEhPRH0pCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorcHVibGljIEBpbnRlcmZhY2UgVGVtcGxhdGUgeworCisgICAgLyoqCisgICAgICogVGhlIHRlbXBsYXRlIG5hbWUgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBvdXRwdXQgdGhlIGVudGl0eS4gVGhlIHRlbXBsYXRlIG5hbWUgbWF5IGJlIGRlY2xhcmVkIGFzIGFic29sdXRlIHRlbXBsYXRlIG5hbWUKKyAgICAgKiBpZiB0aGUgbmFtZSBiZWdpbnMgd2l0aCBhICcvJywgb3RoZXJ3aXNlIHRoZSB0ZW1wbGF0ZSBuYW1lIGlzIGRlY2xhcmVkIGFzIGEgcmVsYXRpdmUgdGVtcGxhdGUgbmFtZS4KKyAgICAgKi8KKyAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Cit9CmRpZmYgLS1naXQgYS9leHQvbXZjL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL212Yy9WaWV3YWJsZS5qYXZhIGIvZXh0L212Yy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvVmlld2FibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjcwM2E0Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L212Yy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvVmlld2FibGUuamF2YQpAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKKworLyoqCisgKiBBIHZpZXdhYmxlIHR5cGUgcmVmZXJlbmNpbmcgYSB0ZW1wbGF0ZSBieSBuYW1lIGFuZCBhIG1vZGVsIHRvIGJlIHBhc3NlZAorICogdG8gdGhlIHRlbXBsYXRlLiBTdWNoIGEgdHlwZSBtYXkgYmUgcmV0dXJuZWQgYnkgYSByZXNvdXJjZSBtZXRob2Qgb2YgYQorICogcmVzb3VyY2UgY2xhc3MuIEluIHRoaXMgcmVzcGVjdCB0aGUgdGVtcGxhdGUgaXMgdGhlIHZpZXcgYW5kIHRoZSBjb250cm9sbGVyCisgKiBpcyB0aGUgcmVzb3VyY2UgY2xhc3MgaW4gdGhlIE1vZGVsIFZpZXcgQ29udHJvbGxlciBwYXR0ZXJuLgorICogPHAvPgorICogVGhlIHRlbXBsYXRlIG5hbWUgbWF5IGJlIGRlY2xhcmVkIGFzIGFic29sdXRlIHRlbXBsYXRlIG5hbWUgaWYgdGhlIG5hbWUKKyAqIGJlZ2lucyB3aXRoIGEgJy8nLCBvdGhlcndpc2UgdGhlIHRlbXBsYXRlIG5hbWUgaXMgZGVjbGFyZWQgYXMgYSByZWxhdGl2ZQorICogdGVtcGxhdGUgbmFtZS4gSWYgdGhlIHRlbXBsYXRlIG5hbWUgaXMgcmVsYXRpdmUgdGhlbiB0aGUgY2xhc3Mgb2YgdGhlCisgKiBsYXN0IG1hdGNoaW5nIHJlc291cmNlIGlzIHV0aWxpemVkIHRvIGNyZWF0ZSBhbiBhYnNvbHV0ZSBwYXRoIGJ5IGRlZmF1bHQuIEhvd2V2ZXIsCisgKiB0aGUgcmVzcG9uc2liaWxpdHkgb2YgcmVzb2x2aW5nIHRoZSBhYnNvbHV0ZSB0ZW1wbGF0ZSBuYW1lIGlzIHVwIHRvCisgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5zcGkuVmlld2FibGVDb250ZXh0fSB3aGljaCBjYW4gb3ZlcnJpZGUgdGhlCisgKiBkZWZhdWx0IHJlc29sdmluZyBiZWhhdmlvdXIuCisgKiA8cC8+CisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKgorICogQHNlZSBUZW1wbGF0ZQorICogQHNlZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLnNwaS5WaWV3YWJsZUNvbnRleHQKKyAqIEBzZWUgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5pbnRlcm5hbC5SZXNvbHZpbmdWaWV3YWJsZUNvbnRleHQKKyAqLworcHVibGljIGNsYXNzIFZpZXdhYmxlIHsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHRlbXBsYXRlTmFtZTsKKworICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1vZGVsOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IHZpZXdhYmxlIHR5cGUgd2l0aCBhIHRlbXBsYXRlIG5hbWUuCisgICAgICogPHAvPgorICAgICAqIFRoZSBtb2RlbCB3aWxsIGJlIHNldCB0byB7QGNvZGUgbnVsbH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGVtcGxhdGVOYW1lIHRoZSB0ZW1wbGF0ZSBuYW1lLCBzaGFsbCBub3QgYmUge0Bjb2RlIG51bGx9LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSB0ZW1wbGF0ZSBuYW1lIGlzIHtAY29kZSBudWxsfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVmlld2FibGUoU3RyaW5nIHRlbXBsYXRlTmFtZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXModGVtcGxhdGVOYW1lLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgdmlld2FibGUgdHlwZSB3aXRoIGEgdGVtcGxhdGUgbmFtZSBhbmQgYSBtb2RlbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0ZW1wbGF0ZU5hbWUgdGhlIHRlbXBsYXRlIG5hbWUsIHNoYWxsIG5vdCBiZSB7QGNvZGUgbnVsbH0uCisgICAgICogQHBhcmFtIG1vZGVsIHRoZSBtb2RlbCwgbWF5IGJlIHtAY29kZSBudWxsfS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgdGVtcGxhdGUgbmFtZSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICovCisgICAgcHVibGljIFZpZXdhYmxlKFN0cmluZyB0ZW1wbGF0ZU5hbWUsIE9iamVjdCBtb2RlbCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICh0ZW1wbGF0ZU5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5URU1QTEFURV9OQU1FX01VU1RfTk9UX0JFX05VTEwoKSk7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLnRlbXBsYXRlTmFtZSA9IHRlbXBsYXRlTmFtZTsKKyAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdGVtcGxhdGUgbmFtZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHRlbXBsYXRlIG5hbWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRUZW1wbGF0ZU5hbWUoKSB7CisgICAgICAgIHJldHVybiB0ZW1wbGF0ZU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBtb2RlbC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG1vZGVsLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0TW9kZWwoKSB7CisgICAgICAgIHJldHVybiBtb2RlbDsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgdGVtcGxhdGUgbmFtZSBpcyByZXByZXNlbnRlZCBieSBhbiBhYnNvbHV0ZSBwYXRoLgorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHRlbXBsYXRlIG5hbWUgaXMgYWJzb2x1dGUsIGFuZCBzdGFydHMgd2l0aCBhCisgICAgICogICAgICAgICAnLycgY2hhcmFjdGVyLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1RlbXBsYXRlTmFtZUFic29sdXRlKCkgeworICAgICAgICByZXR1cm4gdGVtcGxhdGVOYW1lLmxlbmd0aCgpID4gMCAmJiB0ZW1wbGF0ZU5hbWUuY2hhckF0KDApID09ICcvJzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvbXZjL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL212Yy9pbnRlcm5hbC9FcnJvclRlbXBsYXRlRXhjZXB0aW9uTWFwcGVyLmphdmEgYi9leHQvbXZjL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL212Yy9pbnRlcm5hbC9FcnJvclRlbXBsYXRlRXhjZXB0aW9uTWFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYzYzFmZgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9tdmMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbXZjL2ludGVybmFsL0Vycm9yVGVtcGxhdGVFeGNlcHRpb25NYXBwZXIuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuaW50ZXJuYWw7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLnNwaS5BYnN0cmFjdEVycm9yVGVtcGxhdGVNYXBwZXI7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIEFic3RyYWN0RXJyb3JUZW1wbGF0ZU1hcHBlcn0gZm9yIGV2ZXJ5IHRocm93biB7QGxpbmsgRXhjZXB0aW9ufS4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqIEBzaW5jZSAyLjMKKyAqLworcHVibGljIGNsYXNzIEVycm9yVGVtcGxhdGVFeGNlcHRpb25NYXBwZXIgZXh0ZW5kcyBBYnN0cmFjdEVycm9yVGVtcGxhdGVNYXBwZXI8RXhjZXB0aW9uPiB7Cit9CmRpZmYgLS1naXQgYS9leHQvbXZjL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL212Yy9pbnRlcm5hbC9JbXBsaWNpdFZpZXdhYmxlLmphdmEgYi9leHQvbXZjL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL212Yy9pbnRlcm5hbC9JbXBsaWNpdFZpZXdhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJlOTNlZAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9tdmMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbXZjL2ludGVybmFsL0ltcGxpY2l0Vmlld2FibGUuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuVmlld2FibGU7CisKKy8qKgorICoge0BsaW5rIFZpZXdhYmxlfSBpbXBsZW1lbnRhdGlvbiByZXByZXNlbnRpbmcgcmV0dXJuIHZhbHVlIG9mIGVuaGFuY2luZyBtZXRob2RzIGFkZGVkIHRvCisgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlIHJlc291cmNlc30gYW5ub3RhdGVkIHdpdGgge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuVGVtcGxhdGV9LgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICogQHNlZSBUZW1wbGF0ZU1vZGVsUHJvY2Vzc29yCisgKiBAc2VlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuVGVtcGxhdGUKKyAqLworZmluYWwgY2xhc3MgSW1wbGljaXRWaWV3YWJsZSBleHRlbmRzIFZpZXdhYmxlIHsKKworICAgIHByaXZhdGUgZmluYWwgTGlzdDxTdHJpbmc+IHRlbXBsYXRlTmFtZXM7CisKKyAgICBwcml2YXRlIGZpbmFsIENsYXNzPD8+IHJlc29sdmluZ0NsYXNzOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEge0Bjb2RlIEltcGxpY2l0Vmlld2FibGV9LgorICAgICAqCisgICAgICogQHBhcmFtIHRlbXBsYXRlTmFtZXMgYWxsb3dlZCB0ZW1wbGF0ZSBuYW1lcyBmb3Igd2hpY2ggYSB7QGxpbmsgVmlld2FibGUgdmlld2FibGV9IGNhbiBiZSByZXNvbHZlZC4KKyAgICAgKiBAcGFyYW0gbW9kZWwgdGhlIG1vZGVsLCBtYXkgYmUge0Bjb2RlIG51bGx9LgorICAgICAqIEBwYXJhbSByZXNvbHZpbmdDbGFzcyB0aGUgY2xhc3MgdG8gdXNlIHRvIHJlc29sdmUgdGhlIHRlbXBsYXRlIG5hbWUgaWYgdGhlIHRlbXBsYXRlIGlzIG5vdCBhYnNvbHV0ZSwKKyAgICAgKiBpZiB7QGNvZGUgbnVsbH0gdGhlbiB0aGUgcmVzb2x2aW5nIGNsYXNzIHdpbGwgYmUgb2J0YWluZWQgZnJvbSB0aGUgbGFzdCBtYXRjaGluZyByZXNvdXJjZS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgdGVtcGxhdGUgbmFtZSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICovCisgICAgSW1wbGljaXRWaWV3YWJsZShmaW5hbCBMaXN0PFN0cmluZz4gdGVtcGxhdGVOYW1lcywgZmluYWwgT2JqZWN0IG1vZGVsLCBmaW5hbCBDbGFzczw/PiByZXNvbHZpbmdDbGFzcykKKyAgICAgICAgICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgICAgICBzdXBlcigiIiwgbW9kZWwpOworCisgICAgICAgIHRoaXMudGVtcGxhdGVOYW1lcyA9IHRlbXBsYXRlTmFtZXM7CisgICAgICAgIHRoaXMucmVzb2x2aW5nQ2xhc3MgPSByZXNvbHZpbmdDbGFzczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYWxsb3dlZCB0ZW1wbGF0ZSBuYW1lcyBmb3Igd2hpY2ggYSB7QGxpbmsgVmlld2FibGUgdmlld2FibGV9IGNhbiBiZSByZXNvbHZlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYWxsb3dlZCB0ZW1wbGF0ZSBuYW1lcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFRlbXBsYXRlTmFtZXMoKSB7CisgICAgICAgIHJldHVybiB0ZW1wbGF0ZU5hbWVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcmVzb2x2aW5nIGNsYXNzLgorICAgICAqCisgICAgICogQHJldHVybiBSZXNvbHZpbmcgY2xhc3MuCisgICAgICovCisgICAgcHVibGljIENsYXNzPD8+IGdldFJlc29sdmluZ0NsYXNzKCkgeworICAgICAgICByZXR1cm4gcmVzb2x2aW5nQ2xhc3M7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L212Yy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvaW50ZXJuYWwvTXZjQmluZGVyLmphdmEgYi9leHQvbXZjL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL212Yy9pbnRlcm5hbC9NdmNCaW5kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjAzMTc4Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L212Yy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvaW50ZXJuYWwvTXZjQmluZGVyLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLmludGVybmFsOworCitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvcjsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQWJzdHJhY3RCaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLk1vZGVsUHJvY2Vzc29yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuc3BpLlZpZXdhYmxlQ29udGV4dDsKKworLyoqCisgKiBQcm92aWRlcyBNVkMgZnVuY3Rpb25hbGl0eS4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIE12Y0JpbmRlciBleHRlbmRzIEFic3RyYWN0QmluZGVyIHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgYmluZChUZW1wbGF0ZU1ldGhvZEludGVyY2VwdG9yLmNsYXNzKS50byhXcml0ZXJJbnRlcmNlcHRvci5jbGFzcykuaW4oU2luZ2xldG9uLmNsYXNzKTsKKyAgICAgICAgLy9ub2luc3BlY3Rpb24gdW5jaGVja2VkCisgICAgICAgIGJpbmQoVmlld2FibGVNZXNzYWdlQm9keVdyaXRlci5jbGFzcykudG8oTWVzc2FnZUJvZHlXcml0ZXIuY2xhc3MpLmluKFNpbmdsZXRvbi5jbGFzcyk7CisKKyAgICAgICAgYmluZChUZW1wbGF0ZU1vZGVsUHJvY2Vzc29yLmNsYXNzKS50byhNb2RlbFByb2Nlc3Nvci5jbGFzcykuaW4oU2luZ2xldG9uLmNsYXNzKTsKKyAgICAgICAgYmluZEFzQ29udHJhY3QoUmVzb2x2aW5nVmlld2FibGVDb250ZXh0LmNsYXNzKS5pbihTaW5nbGV0b24uY2xhc3MpOworICAgICAgICBiaW5kKFJlc29sdmluZ1ZpZXdhYmxlQ29udGV4dC5jbGFzcykudG8oVmlld2FibGVDb250ZXh0LmNsYXNzKS5pbihTaW5nbGV0b24uY2xhc3MpLnJhbmtlZChJbnRlZ2VyLk1JTl9WQUxVRSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L212Yy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvaW50ZXJuYWwvUmVzb2x2aW5nVmlld2FibGVDb250ZXh0LmphdmEgYi9leHQvbXZjL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL212Yy9pbnRlcm5hbC9SZXNvbHZpbmdWaWV3YWJsZUNvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmU0MDU5Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L212Yy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvaW50ZXJuYWwvUmVzb2x2aW5nVmlld2FibGVDb250ZXh0LmphdmEKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5pbnRlcm5hbDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5WaWV3YWJsZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLnNwaS5SZXNvbHZlZFZpZXdhYmxlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuc3BpLlRlbXBsYXRlUHJvY2Vzc29yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuc3BpLlZpZXdhYmxlQ29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLnNwaS5WaWV3YWJsZUNvbnRleHRFeGNlcHRpb247CisKKy8qKgorICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5zcGkuVmlld2FibGVDb250ZXh0IHZpZXdhYmxlIGNvbnRleHR9LgorICogPHAvPgorICogSWYgdGhlIHRlbXBsYXRlIG5hbWUgb2YgZ2l2ZW4ge0BsaW5rIFZpZXdhYmxlfSBpcyByZXByZXNlbnRlZCBhcyBhIHJlbGF0aXZlIHBhdGggdGhlbiB0aGUgcmVzb2x2aW5nIGNsYXNzLAorICogYW5kIHN1cGVyIGNsYXNzZXMgaW4gdGhlIGluaGVyaXRhbmNlIGhpZXJhcmNoeSwgYXJlIHV0aWxpemVkIHRvIGdlbmVyYXRlIHRoZSBhYnNvbHV0ZSB0ZW1wbGF0ZSBuYW1lIGFzIGZvbGxvd3MuCisgKiA8YnIvPgorICogVGhlIGJhc2UgcGF0aCBzdGFydHMgd2l0aCAnLycgY2hhcmFjdGVyLCBmb2xsb3dlZCBieSB0aGUgZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWUgb2YgdGhlIHJlc29sdmluZyBjbGFzcywKKyAqIHdpdGggYW55ICcuJyBhbmQgJyQnIGNoYXJhY3RlcnMgcmVwbGFjZWQgd2l0aCBhICcvJyBjaGFyYWN0ZXIsIGZvbGxvd2VkIGJ5IGEgJy8nIGNoYXJhY3RlciwKKyAqIGZvbGxvd2VkIGJ5IHRoZSByZWxhdGl2ZSB0ZW1wbGF0ZSBuYW1lLgorICogPGJyLz4KKyAqIElmIHRoZSBhYnNvbHV0ZSB0ZW1wbGF0ZSBuYW1lIGNhbm5vdCBiZSByZXNvbHZlZCBpbnRvIGEgdGVtcGxhdGUgcmVmZXJlbmNlIChzZWUge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuc3BpCisgKiAuVGVtcGxhdGVQcm9jZXNzb3J9IGFuZCB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5zcGkuVmlld2FibGVDb250ZXh0fSkgdGhlbiB0aGUgc3VwZXIgY2xhc3Mgb2YgdGhlIHJlc29sdmluZworICogY2xhc3MgaXMgdXRpbGl6ZWQsIGFuZCBpcyBzZXQgYXMgdGhlIHJlc29sdmluZyBjbGFzcy4gVHJhdmVyc2FsIHVwIHRoZSBpbmhlcml0YW5jZSBoaWVyYXJjaHkgcHJvY2VlZHMgdW50aWwgYW4gYWJzb2x1dGUKKyAqIHRlbXBsYXRlIG5hbWUgY2FuIGJlIHJlc29sdmVkIGludG8gYSB0ZW1wbGF0ZSByZWZlcmVuY2UsIG9yIHRoZSBPYmplY3QgY2xhc3MgaXMgcmVhY2hlZCwKKyAqIHdoaWNoIG1lYW5zIHRoZSBhYnNvbHV0ZSB0ZW1wbGF0ZSBuYW1lIGNvdWxkIG5vdCBiZSByZXNvbHZlZCBhbmQgYW4gZXJyb3Igd2lsbCByZXN1bHQuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK2NsYXNzIFJlc29sdmluZ1ZpZXdhYmxlQ29udGV4dCBpbXBsZW1lbnRzIFZpZXdhYmxlQ29udGV4dCB7CisKKyAgICAvKioKKyAgICAgKiBSZXNvbHZlIGdpdmVuIHtAbGluayBWaWV3YWJsZSB2aWV3YWJsZX0gdXNpbmcge0BsaW5rIE1lZGlhVHlwZSBtZWRpYSB0eXBlfSwge0Bjb2RlIHJlc29sdmluZyBjbGFzc30gYW5kCisgICAgICoge0BsaW5rIFRlbXBsYXRlUHJvY2Vzc29yIHRlbXBsYXRlIHByb2Nlc3Nvcn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmlld2FibGUgdmlld2FibGUgdG8gYmUgcmVzb2x2ZWQuCisgICAgICogQHBhcmFtIG1lZGlhVHlwZSBtZWRpYSB0eXBlIG9mIHRlIG91dHB1dC4KKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VDbGFzcyByZXNvbHZpbmcgY2xhc3MuCisgICAgICogQHBhcmFtIHRlbXBsYXRlUHJvY2Vzc29yIHRlbXBsYXRlIHByb2Nlc3NvciB0byBiZSB1c2VkLgorICAgICAqIEByZXR1cm4gcmVzb2x2ZWQgdmlld2FibGUgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSB2aWV3YWJsZSBjYW5ub3QgYmUgcmVzb2x2ZWQuCisgICAgICovCisgICAgcHVibGljIFJlc29sdmVkVmlld2FibGUgcmVzb2x2ZVZpZXdhYmxlKGZpbmFsIFZpZXdhYmxlIHZpZXdhYmxlLCBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiByZXNvdXJjZUNsYXNzLCBmaW5hbCBUZW1wbGF0ZVByb2Nlc3NvciB0ZW1wbGF0ZVByb2Nlc3NvcikgeworICAgICAgICBpZiAodmlld2FibGUuaXNUZW1wbGF0ZU5hbWVBYnNvbHV0ZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZUFic29sdXRlVmlld2FibGUodmlld2FibGUsIHJlc291cmNlQ2xhc3MsIG1lZGlhVHlwZSwgdGVtcGxhdGVQcm9jZXNzb3IpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHJlc291cmNlQ2xhc3MgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBWaWV3YWJsZUNvbnRleHRFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuVEVNUExBVEVfUkVTT0xWSU5HX0NMQVNTX0NBTk5PVF9CRV9OVUxMKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZVJlbGF0aXZlVmlld2FibGUodmlld2FibGUsIHJlc291cmNlQ2xhc3MsIG1lZGlhVHlwZSwgdGVtcGxhdGVQcm9jZXNzb3IpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzb2x2ZSBnaXZlbiB7QGxpbmsgVmlld2FibGUgdmlld2FibGV9IHdpdGggYWJzb2x1dGUgdGVtcGxhdGUgbmFtZSB1c2luZyB7QGxpbmsgTWVkaWFUeXBlIG1lZGlhIHR5cGV9IGFuZAorICAgICAqIHtAbGluayBUZW1wbGF0ZVByb2Nlc3NvciB0ZW1wbGF0ZSBwcm9jZXNzb3J9LgorICAgICAqCisgICAgICogQHBhcmFtIHZpZXdhYmxlIHZpZXdhYmxlIHRvIGJlIHJlc29sdmVkLgorICAgICAqIEBwYXJhbSBtZWRpYVR5cGUgbWVkaWEgdHlwZSBvZiB0ZSBvdXRwdXQuCisgICAgICogQHBhcmFtIHJlc291cmNlQ2xhc3MgcmVzb3VyY2UgY2xhc3MuCisgICAgICogQHBhcmFtIHRlbXBsYXRlUHJvY2Vzc29yIHRlbXBsYXRlIHByb2Nlc3NvciB0byBiZSB1c2VkLgorICAgICAqIEByZXR1cm4gcmVzb2x2ZWQgdmlld2FibGUgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSB2aWV3YWJsZSBjYW5ub3QgYmUgcmVzb2x2ZWQuCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHJpdmF0ZSBSZXNvbHZlZFZpZXdhYmxlIHJlc29sdmVBYnNvbHV0ZVZpZXdhYmxlKGZpbmFsIFZpZXdhYmxlIHZpZXdhYmxlLCBDbGFzczw/PiByZXNvdXJjZUNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUZW1wbGF0ZVByb2Nlc3NvciB0ZW1wbGF0ZVByb2Nlc3NvcikgeworICAgICAgICBmaW5hbCBPYmplY3QgcmVzb2x2ZWRUZW1wbGF0ZU9iamVjdCA9IHRlbXBsYXRlUHJvY2Vzc29yLnJlc29sdmUodmlld2FibGUuZ2V0VGVtcGxhdGVOYW1lKCksIG1lZGlhVHlwZSk7CisKKyAgICAgICAgaWYgKHJlc29sdmVkVGVtcGxhdGVPYmplY3QgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvbHZlZFZpZXdhYmxlKHRlbXBsYXRlUHJvY2Vzc29yLCByZXNvbHZlZFRlbXBsYXRlT2JqZWN0LCB2aWV3YWJsZSwgcmVzb3VyY2VDbGFzcywgbWVkaWFUeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc29sdmUgZ2l2ZW4ge0BsaW5rIFZpZXdhYmxlIHZpZXdhYmxlfSB3aXRoIHJlbGF0aXZlIHRlbXBsYXRlIG5hbWUgdXNpbmcge0BsaW5rIE1lZGlhVHlwZSBtZWRpYSB0eXBlfSwKKyAgICAgKiB7QGNvZGUgcmVzb2x2aW5nIGNsYXNzfSBhbmQge0BsaW5rIFRlbXBsYXRlUHJvY2Vzc29yIHRlbXBsYXRlIHByb2Nlc3Nvcn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmlld2FibGUgdmlld2FibGUgdG8gYmUgcmVzb2x2ZWQuCisgICAgICogQHBhcmFtIG1lZGlhVHlwZSBtZWRpYSB0eXBlIG9mIHRlIG91dHB1dC4KKyAgICAgKiBAcGFyYW0gcmVzb2x2aW5nQ2xhc3MgcmVzb2x2aW5nIGNsYXNzLgorICAgICAqIEBwYXJhbSB0ZW1wbGF0ZVByb2Nlc3NvciB0ZW1wbGF0ZSBwcm9jZXNzb3IgdG8gYmUgdXNlZC4KKyAgICAgKiBAcmV0dXJuIHJlc29sdmVkIHZpZXdhYmxlIG9yIHtAY29kZSBudWxsfSBpZiB0aGUgdmlld2FibGUgY2Fubm90IGJlIHJlc29sdmVkLgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHByaXZhdGUgUmVzb2x2ZWRWaWV3YWJsZSByZXNvbHZlUmVsYXRpdmVWaWV3YWJsZShmaW5hbCBWaWV3YWJsZSB2aWV3YWJsZSwgZmluYWwgQ2xhc3M8Pz4gcmVzb2x2aW5nQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUsIGZpbmFsIFRlbXBsYXRlUHJvY2Vzc29yIHRlbXBsYXRlUHJvY2Vzc29yKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBwYXRoID0gVGVtcGxhdGVIZWxwZXIuZ2V0VGVtcGxhdGVOYW1lKHZpZXdhYmxlKTsKKworICAgICAgICAvLyBGaW5kIGluIGRpcmVjdG9yaWVzLgorICAgICAgICBmb3IgKENsYXNzIGMgPSByZXNvbHZpbmdDbGFzczsgYyAhPSBPYmplY3QuY2xhc3M7IGMgPSBjLmdldFN1cGVyY2xhc3MoKSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFic29sdXRlUGF0aCA9IFRlbXBsYXRlSGVscGVyLmdldEFic29sdXRlUGF0aChjLCBwYXRoLCAnLycpOworICAgICAgICAgICAgZmluYWwgT2JqZWN0IHJlc29sdmVkVGVtcGxhdGVPYmplY3QgPSB0ZW1wbGF0ZVByb2Nlc3Nvci5yZXNvbHZlKGFic29sdXRlUGF0aCwgbWVkaWFUeXBlKTsKKworICAgICAgICAgICAgaWYgKHJlc29sdmVkVGVtcGxhdGVPYmplY3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb2x2ZWRWaWV3YWJsZSh0ZW1wbGF0ZVByb2Nlc3NvciwgcmVzb2x2ZWRUZW1wbGF0ZU9iamVjdCwgdmlld2FibGUsIGMsIG1lZGlhVHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBGaW5kIGluIGZsYXQgZmlsZXMuCisgICAgICAgIGZvciAoQ2xhc3MgYyA9IHJlc29sdmluZ0NsYXNzOyBjICE9IE9iamVjdC5jbGFzczsgYyA9IGMuZ2V0U3VwZXJjbGFzcygpKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYWJzb2x1dGVQYXRoID0gVGVtcGxhdGVIZWxwZXIuZ2V0QWJzb2x1dGVQYXRoKGMsIHBhdGgsICcuJyk7CisgICAgICAgICAgICBmaW5hbCBPYmplY3QgcmVzb2x2ZWRUZW1wbGF0ZU9iamVjdCA9IHRlbXBsYXRlUHJvY2Vzc29yLnJlc29sdmUoYWJzb2x1dGVQYXRoLCBtZWRpYVR5cGUpOworCisgICAgICAgICAgICBpZiAocmVzb2x2ZWRUZW1wbGF0ZU9iamVjdCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvbHZlZFZpZXdhYmxlKHRlbXBsYXRlUHJvY2Vzc29yLCByZXNvbHZlZFRlbXBsYXRlT2JqZWN0LCB2aWV3YWJsZSwgYywgbWVkaWFUeXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZXh0L212Yy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvaW50ZXJuYWwvVGVtcGxhdGVIZWxwZXIuamF2YSBiL2V4dC9tdmMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbXZjL2ludGVybmFsL1RlbXBsYXRlSGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAxOTBiMAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9tdmMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbXZjL2ludGVybmFsL1RlbXBsYXRlSGVscGVyLmphdmEKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVmFyaWFudDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUHJvcGVydGllc0hlbHBlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uUmVmOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5SZWZzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuTWVkaWFUeXBlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLlZhcmlhbnRTZWxlY3RvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuRXh0ZW5kZWRVcmlJbmZvOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuTXZjRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLlRlbXBsYXRlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuVmlld2FibGU7CisKKy8qKgorICogSGVscGVyIGNsYXNzIHRvIHByb3ZpZGUgc29tZSBjb21tb24gZnVuY3Rpb25hbGl0eSByZWxhdGVkIHRvIE1WQy4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFRlbXBsYXRlSGVscGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENoYXJzZXQgREVGQVVMVF9FTkNPRElORyA9IENoYXJzZXQuZm9yTmFtZSgiVVRGLTgiKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBhYnNvbHV0ZSBwYXRoIHRvIHRoZSBnaXZlbiBjbGFzcyB3aGVyZSBzZWdtZW50cyBhcmUgc2VwYXJhdGVkIHVzaW5nIHtAY29kZSBkZWxpbX0gY2hhcmFjdGVyIGFuZCB7QGNvZGUgcGF0aH0KKyAgICAgKiBpcyBhcHBlbmRlZCB0byB0aGlzIHBhdGguCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VDbGFzcyBjbGFzcyBmb3Igd2hpY2ggYW4gYWJzb2x1dGUgcGF0aCBzaG91bGQgYmUgb2J0YWluZWQuCisgICAgICogQHBhcmFtIHBhdGggc2VnbWVudCB0byBiZSBhcHBlbmRlZCB0byB0aGUgcmVzdWx0aW5nIHBhdGguCisgICAgICogQHBhcmFtIGRlbGltIGNoYXJhY3RlciB1c2VkIGZvciBzZXBhcmF0aW5nIHBhdGggc2VnbWVudHMuCisgICAgICogQHJldHVybiBhbiBhYnNvbHV0ZSBwYXRoIHRvIHRoZSByZXNvdXJjZSBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRBYnNvbHV0ZVBhdGgoQ2xhc3M8Pz4gcmVzb3VyY2VDbGFzcywgU3RyaW5nIHBhdGgsIGNoYXIgZGVsaW0pIHsKKyAgICAgICAgcmV0dXJuICcvJyArIHJlc291cmNlQ2xhc3MuZ2V0TmFtZSgpLnJlcGxhY2UoJy4nLCAnLycpLnJlcGxhY2UoJyQnLCBkZWxpbSkgKyBkZWxpbSArIHBhdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IG1lZGlhIHR5cGVzIGZvciB3aGljaCB0aGUge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuc3BpLlJlc29sdmVkVmlld2FibGUgcmVzb2x2ZWQgdmlld2FibGV9IGNvdWxkIGJlCisgICAgICogcHJvZHVjZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyUmVxdWVzdCByZXF1ZXN0IHRvIG9idGFpbiBhY2NlcHRhYmxlIG1lZGlhIHR5cGVzLgorICAgICAqIEBwYXJhbSBleHRlbmRlZFVyaUluZm8gdXJpIGluZm8gdG8gb2J0YWluIHJlc291cmNlIG1ldGhvZCBmcm9tIGFuZCBpdHMgcHJvZHVjaWJsZSBtZWRpYSB0eXBlcy4KKyAgICAgKiBAcGFyYW0gdmFyeUhlYWRlclZhbHVlIFZhcnkgaGVhZGVyIHJlZmVyZW5jZS4KKyAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgcHJvZHVjaWJsZSBtZWRpYSB0eXBlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8TWVkaWFUeXBlPiBnZXRQcm9kdWNpYmxlTWVkaWFUeXBlcyhmaW5hbCBDb250YWluZXJSZXF1ZXN0IGNvbnRhaW5lclJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRXh0ZW5kZWRVcmlJbmZvIGV4dGVuZGVkVXJpSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZWY8U3RyaW5nPiB2YXJ5SGVhZGVyVmFsdWUpIHsKKyAgICAgICAgZmluYWwgTGlzdDxNZWRpYVR5cGU+IHByb2R1Y2VkVHlwZXMgPSBnZXRSZXNvdXJjZU1ldGhvZFByb2R1Y2libGVUeXBlcyhleHRlbmRlZFVyaUluZm8pOworICAgICAgICBmaW5hbCBNZWRpYVR5cGVbXSBtZWRpYVR5cGVzID0gcHJvZHVjZWRUeXBlcy50b0FycmF5KG5ldyBNZWRpYVR5cGVbcHJvZHVjZWRUeXBlcy5zaXplKCldKTsKKworICAgICAgICBmaW5hbCBMaXN0PFZhcmlhbnQ+IHZhcmlhbnRzID0gVmFyaWFudFNlbGVjdG9yLnNlbGVjdFZhcmlhbnRzKAorICAgICAgICAgICAgICAgIGNvbnRhaW5lclJlcXVlc3QsIFZhcmlhbnQubWVkaWFUeXBlcyhtZWRpYVR5cGVzKS5idWlsZCgpLAorICAgICAgICAgICAgICAgIHZhcnlIZWFkZXJWYWx1ZSA9PSBudWxsID8gUmVmcy48U3RyaW5nPmVtcHR5UmVmKCkgOiB2YXJ5SGVhZGVyVmFsdWUpOworCisgICAgICAgIHJldHVybiB2YXJpYW50cy5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAubWFwKHZhcmlhbnQgLT4gTWVkaWFUeXBlcy5zdHJpcFF1YWxpdHlQYXJhbXModmFyaWFudC5nZXRNZWRpYVR5cGUoKSkpCisgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0ZW1wbGF0ZSBuYW1lIGZyb20gZ2l2ZW4ge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuVmlld2FibGUgdmlld2FibGV9IG9yIHJldHVybiB7QGNvZGUgaW5kZXh9IGlmIHRoZSBnaXZlbgorICAgICAqIHZpZXdhYmxlIGRvZXNuJ3QgY29udGFpbiBhIHZhbGlkIHRlbXBsYXRlIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmlld2FibGUgdmlld2FibGUgdG8gb2J0YWluIHRlbXBsYXRlIG5hbWUgZnJvbS4KKyAgICAgKiBAcmV0dXJuIHtAY29kZSBub24tbnVsbH0sIHtAY29kZSBub24tZW1wdHl9IHRlbXBsYXRlIG5hbWUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0VGVtcGxhdGVOYW1lKGZpbmFsIFZpZXdhYmxlIHZpZXdhYmxlKSB7CisgICAgICAgIHJldHVybiB2aWV3YWJsZS5nZXRUZW1wbGF0ZU5hbWUoKSA9PSBudWxsIHx8IHZpZXdhYmxlLmdldFRlbXBsYXRlTmFtZSgpLmlzRW1wdHkoKSA/ICJpbmRleCIgOiB2aWV3YWJsZS5nZXRUZW1wbGF0ZU5hbWUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBsaXN0IG9mIHByb2R1Y2libGUgbWVkaWEgdHlwZXMgb2YgdGhlIGxhc3QgbWF0Y2hlZCByZXNvdXJjZSBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXh0ZW5kZWRVcmlJbmZvIHVyaSBpbmZvIHRvIG9idGFpbiByZXNvdXJjZSBtZXRob2QgZnJvbS4KKyAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgcHJvZHVjaWJsZSBtZWRpYSB0eXBlcyBvZiB0aGUgbGFzdCBtYXRjaGVkIHJlc291cmNlIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBMaXN0PE1lZGlhVHlwZT4gZ2V0UmVzb3VyY2VNZXRob2RQcm9kdWNpYmxlVHlwZXMoZmluYWwgRXh0ZW5kZWRVcmlJbmZvIGV4dGVuZGVkVXJpSW5mbykgeworICAgICAgICBpZiAoZXh0ZW5kZWRVcmlJbmZvLmdldE1hdGNoZWRSZXNvdXJjZU1ldGhvZCgpICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiAhZXh0ZW5kZWRVcmlJbmZvLmdldE1hdGNoZWRSZXNvdXJjZU1ldGhvZCgpLmdldFByb2R1Y2VkVHlwZXMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBleHRlbmRlZFVyaUluZm8uZ2V0TWF0Y2hlZFJlc291cmNlTWV0aG9kKCkuZ2V0UHJvZHVjZWRUeXBlcygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KE1lZGlhVHlwZS5XSUxEQ0FSRF9UWVBFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFeHRyYWN0IHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLlRlbXBsYXRlIHRlbXBsYXRlfSBhbm5vdGF0aW9uIGZyb20gZ2l2ZW4gbGlzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbm5vdGF0aW9ucyBsaXN0IG9mIGFubm90YXRpb25zLgorICAgICAqIEByZXR1cm4ge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuVGVtcGxhdGUgdGVtcGxhdGV9IGFubm90YXRpb24gb3Ige0Bjb2RlIG51bGx9IGlmIHRoaXMgYW5ub3RhdGlvbiBpcyBub3QgcHJlc2VudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFRlbXBsYXRlIGdldFRlbXBsYXRlQW5ub3RhdGlvbihmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgaWYgKGFubm90YXRpb25zICE9IG51bGwgJiYgYW5ub3RhdGlvbnMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgZm9yIChBbm5vdGF0aW9uIGFubm90YXRpb24gOiBhbm5vdGF0aW9ucykgeworICAgICAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgVGVtcGxhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChUZW1wbGF0ZSkgYW5ub3RhdGlvbjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgb3V0cHV0IGVuY29kaW5nIGZyb20gY29uZmlndXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gY29uZmlndXJhdGlvbiBDb25maWd1cmF0aW9uLgorICAgICAqIEBwYXJhbSBzdWZmaXggVGVtcGxhdGUgcHJvY2Vzc29yIHN1ZmZpeCBvZiB0aGUKKyAgICAgKiAgICAgICAgICAgICAgIHRvIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuTXZjRmVhdHVyZSNFTkNPRElOR30uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEVuY29kaW5nIHJlYWQgZnJvbSBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMgb3IgYSBkZWZhdWx0IGVuY29kaW5nIGlmIG5vIGVuY29kaW5nIGlzIGNvbmZpZ3VyZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDaGFyc2V0IGdldFRlbXBsYXRlT3V0cHV0RW5jb2RpbmcoQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uLCBTdHJpbmcgc3VmZml4KSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBlbmMgPSBQcm9wZXJ0aWVzSGVscGVyLmdldFZhbHVlKGNvbmZpZ3VyYXRpb24uZ2V0UHJvcGVydGllcygpLCBNdmNGZWF0dXJlLkVOQ09ESU5HICsgc3VmZml4LAorICAgICAgICAgICAgICAgIFN0cmluZy5jbGFzcywgbnVsbCk7CisgICAgICAgIGlmIChlbmMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIERFRkFVTFRfRU5DT0RJTkc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gQ2hhcnNldC5mb3JOYW1lKGVuYyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmV2ZW50cyBpbnN0YW50aWF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgVGVtcGxhdGVIZWxwZXIoKSB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L212Yy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvaW50ZXJuYWwvVGVtcGxhdGVJbmZsZWN0b3IuamF2YSBiL2V4dC9tdmMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbXZjL2ludGVybmFsL1RlbXBsYXRlSW5mbGVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY3M2RhZQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9tdmMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbXZjL2ludGVybmFsL1RlbXBsYXRlSW5mbGVjdG9yLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLmludGVybmFsOworCisvKioKKyAqIEludGVyZmFjZSBwcm92aWRpbmcgaW5mb3JtYXRpb24gYWJvdXQgaW1wbGljaXQgdmlld2FibGUgcmVzb3VyY2UgY2xhc3Nlcy4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqIEBzaW5jZSAyLjMKKyAqLworcHVibGljIGludGVyZmFjZSBUZW1wbGF0ZUluZmxlY3RvciB7CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBjbGFzcyBvZiB0aGUgbW9kZWwgdXNlZCBpbiB0ZW1wbGF0ZSBvZiBpbXBsaWNpdCB2aWV3YWJsZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gY2xhc3Mgb2YgbW9kZWwgdXNlZCBpbiB0ZW1wbGF0ZSBvZiBpbXBsaWNpdCB2aWV3YWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0TW9kZWxDbGFzcygpOworfQpkaWZmIC0tZ2l0IGEvZXh0L212Yy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvaW50ZXJuYWwvVGVtcGxhdGVNZXRob2RJbnRlcmNlcHRvci5qYXZhIGIvZXh0L212Yy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvaW50ZXJuYWwvVGVtcGxhdGVNZXRob2RJbnRlcmNlcHRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZGZhY2IKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvbXZjL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL212Yy9pbnRlcm5hbC9UZW1wbGF0ZU1ldGhvZEludGVyY2VwdG9yLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLlByaW9yaXRpZXM7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvckNvbnRleHQ7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5UZW1wbGF0ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLlZpZXdhYmxlOworCisvKioKKyAqIEludGVyY2VwdHMgcmVzb3VyY2UgbWV0aG9kcyB0aGF0IGFyZSBhbm5vdGF0ZWQgYnkge0BsaW5rIFRlbXBsYXRlIHRlbXBsYXRlIGFubm90YXRpb259IGFuZCBkb2VzIG5vdCByZXR1cm4ge0BsaW5rIFZpZXdhYmxlfQorICogaW5zdGFuY2VzLgorICoKKyAqIEBzZWUgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5zcGkuUmVzb2x2ZWRWaWV3YWJsZQorICogQHNlZSBWaWV3YWJsZU1lc3NhZ2VCb2R5V3JpdGVyCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BQcmlvcml0eShQcmlvcml0aWVzLkVOVElUWV9DT0RFUikKK2NsYXNzIFRlbXBsYXRlTWV0aG9kSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBXcml0ZXJJbnRlcmNlcHRvciB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhcm91bmRXcml0ZVRvKGZpbmFsIFdyaXRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgVGVtcGxhdGUgdGVtcGxhdGUgPSBUZW1wbGF0ZUhlbHBlci5nZXRUZW1wbGF0ZUFubm90YXRpb24oY29udGV4dC5nZXRBbm5vdGF0aW9ucygpKTsKKyAgICAgICAgZmluYWwgT2JqZWN0IGVudGl0eSA9IGNvbnRleHQuZ2V0RW50aXR5KCk7CisKKyAgICAgICAgaWYgKHRlbXBsYXRlICE9IG51bGwgJiYgIShlbnRpdHkgaW5zdGFuY2VvZiBWaWV3YWJsZSkpIHsKKyAgICAgICAgICAgIGNvbnRleHQuc2V0VHlwZShWaWV3YWJsZS5jbGFzcyk7CisgICAgICAgICAgICBjb250ZXh0LnNldEVudGl0eShuZXcgVmlld2FibGUodGVtcGxhdGUubmFtZSgpLCBlbnRpdHkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnRleHQucHJvY2VlZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9tdmMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbXZjL2ludGVybmFsL1RlbXBsYXRlTW9kZWxQcm9jZXNzb3IuamF2YSBiL2V4dC9tdmMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbXZjL2ludGVybmFsL1RlbXBsYXRlTW9kZWxQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Zjk2MDA5Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L212Yy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvaW50ZXJuYWwvVGVtcGxhdGVNb2RlbFByb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsMzYyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkh0dHBNZXRob2Q7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5SZXNvdXJjZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkVycm9yczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlByb2R1Y2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUmVmbGVjdGlvbkhlbHBlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLk1lZGlhVHlwZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5JbmZsZWN0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkV4dGVuZGVkVXJpSW5mbzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuaW5qZWN0LkNvbmZpZ3VyZWRWYWxpZGF0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLkludm9jYWJsZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuTW9kZWxQcm9jZXNzb3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1ldGhvZDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNb2RlbDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUnVudGltZVJlc291cmNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5pbnRlcm5hbC5Nb2RlbEhlbHBlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuaW50ZXJuYWwuTW9kZWxQcm9jZXNzb3JVdGlsOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuVGVtcGxhdGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5WaWV3YWJsZTsKKworLyoqCisgKiB7QGxpbmsgTW9kZWxQcm9jZXNzb3IgTW9kZWwgcHJvY2Vzc29yfSBlbmhhbmNpbmcgKHN1Yi0pcmVzb3VyY2VzIHdpdGgge0B2YWx1ZSBIdHRwTWV0aG9kI0dFVH0gbWV0aG9kcyByZXNwb25zaWJsZSBvZiBwcm9kdWNpbmcKKyAqIGltcGxpY2l0IHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLlZpZXdhYmxlIHZpZXdhYmxlc30uCisgKiA8cC8+CisgKiBOb3RlOiBSZXNvdXJjZSBjbGFzc2VzIGhhcyB0byBiZSBhbm5vdGF0ZWQgd2l0aCB7QGxpbmsgVGVtcGxhdGV9IGFubm90YXRpb24gaW4gb3JkZXIgdG8gYmUgZW5oYW5jZWQgYnkgdGhpcyBtb2RlbCBwcm9jZXNzb3IuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKiBAc2VlIFRlbXBsYXRlCisgKi8KK2NsYXNzIFRlbXBsYXRlTW9kZWxQcm9jZXNzb3IgaW1wbGVtZW50cyBNb2RlbFByb2Nlc3NvciB7CisKKyAgICAvKioKKyAgICAgKiBQYXRoIHBhcmFtZXRlciByZXByZXNlbnRpbmcgaW1wbGljaXQgdGVtcGxhdGUgbmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QTElDSVRfVklFV19QQVRIX1BBUkFNRVRFUiA9ICJpbXBsaWNpdC12aWV3LXBhdGgtcGFyYW1ldGVyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU1QTElDSVRfVklFV19QQVRIX1BBUkFNRVRFUl9URU1QTEFURSA9ICJ7IiArIElNUExJQ0lUX1ZJRVdfUEFUSF9QQVJBTUVURVIgKyAifSI7CisKKyAgICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFJlc291cmNlQ29udGV4dD4gcmVzb3VyY2VDb250ZXh0UHJvdmlkZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxFeHRlbmRlZFVyaUluZm8+IGV4dGVuZGVkVXJpSW5mb1Byb3ZpZGVyOworICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8Q29uZmlndXJlZFZhbGlkYXRvcj4gdmFsaWRhdG9yUHJvdmlkZXI7CisKKyAgICAvKioKKyAgICAgKiBJbmZsZWN0b3IgcHJvZHVjaW5nIHJlc3BvbnNlIHdpdGgge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuc3BpLlJlc29sdmVkVmlld2FibGUgcmVzb2x2ZWQgdmlld2FibGV9IHdoZXJlCisgICAgICogbW9kZWwgaXMgdGhlIHJlc291cmNlIGNsYXNzIGFubm90YXRlZCB3aXRoIHtAbGluayBUZW1wbGF0ZX0gb3IgNDA0IGFzIGl0cyBzdGF0dXMgY29kZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIFRlbXBsYXRlSW5mbGVjdG9ySW1wbCBpbXBsZW1lbnRzIFRlbXBsYXRlSW5mbGVjdG9yLCBJbmZsZWN0b3I8Q29udGFpbmVyUmVxdWVzdENvbnRleHQsIFJlc3BvbnNlPiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdGVtcGxhdGVOYW1lOworCisgICAgICAgIHByaXZhdGUgZmluYWwgQ2xhc3M8Pz4gcmVzb3VyY2VDbGFzczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgcmVzb3VyY2VJbnN0YW5jZTsKKworICAgICAgICBwcml2YXRlIENsYXNzPD8+IG1vZGVsQ2xhc3M7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBlbmhhbmNpbmcgdGVtcGxhdGUge0BsaW5rIEluZmxlY3RvciBpbmZsZWN0b3J9IG1ldGhvZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHRlbXBsYXRlTmFtZSAgICAgdGVtcGxhdGUgbmFtZSBmb3IgdGhlIHByb2R1Y2VkIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLlZpZXdhYmxlIHZpZXdhYmxlfS4KKyAgICAgICAgICogQHBhcmFtIHJlc291cmNlQ2xhc3MgICAgbW9kZWwgY2xhc3MgZm9yIHRoZSBwcm9kdWNlZCB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5WaWV3YWJsZSB2aWV3YWJsZX0uCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIFNob3VsZCBub3QgYmUge0Bjb2RlIG51bGx9LgorICAgICAgICAgKiBAcGFyYW0gcmVzb3VyY2VJbnN0YW5jZSBtb2RlbCBmb3IgdGhlIHByb2R1Y2VkIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLlZpZXdhYmxlIHZpZXdhYmxlfS4gTWF5IGJlCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHtAY29kZSBudWxsfS4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgVGVtcGxhdGVJbmZsZWN0b3JJbXBsKGZpbmFsIFN0cmluZyB0ZW1wbGF0ZU5hbWUsIGZpbmFsIENsYXNzPD8+IHJlc291cmNlQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCByZXNvdXJjZUluc3RhbmNlKSB7CisgICAgICAgICAgICB0aGlzLnRlbXBsYXRlTmFtZSA9IHRlbXBsYXRlTmFtZTsKKworICAgICAgICAgICAgdGhpcy5yZXNvdXJjZUNsYXNzID0gcmVzb3VyY2VDbGFzczsKKyAgICAgICAgICAgIHRoaXMucmVzb3VyY2VJbnN0YW5jZSA9IHJlc291cmNlSW5zdGFuY2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGFwcGx5KENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB7CisgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gdGVtcGxhdGVOYW1lcyA9IGdldFRlbXBsYXRlTmFtZXMocmVxdWVzdENvbnRleHQpOworICAgICAgICAgICAgZmluYWwgT2JqZWN0IG1vZGVsID0gZ2V0TW9kZWwoZXh0ZW5kZWRVcmlJbmZvUHJvdmlkZXIuZ2V0KCkpOworCisgICAgICAgICAgICAvLyBWYWxpZGF0ZSByZXNvdXJjZSBjbGFzcy4KKyAgICAgICAgICAgIGZpbmFsIENvbmZpZ3VyZWRWYWxpZGF0b3IgdmFsaWRhdG9yID0gdmFsaWRhdG9yUHJvdmlkZXIuZ2V0KCk7CisgICAgICAgICAgICBpZiAodmFsaWRhdG9yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB2YWxpZGF0b3IudmFsaWRhdGVSZXNvdXJjZUFuZElucHV0UGFyYW1zKG1vZGVsLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCkuZW50aXR5KG5ldyBJbXBsaWNpdFZpZXdhYmxlKHRlbXBsYXRlTmFtZXMsIG1vZGVsLCByZXNvdXJjZUNsYXNzKSkuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0TW9kZWxDbGFzcygpIHsKKyAgICAgICAgICAgIHJldHVybiBtb2RlbENsYXNzOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBPYmplY3Qgc2V0TW9kZWxDbGFzcyhmaW5hbCBPYmplY3QgbW9kZWwpIHsKKyAgICAgICAgICAgIGlmIChtb2RlbENsYXNzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBtb2RlbENsYXNzID0gbW9kZWwuZ2V0Q2xhc3MoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtb2RlbDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBPYnRhaW5zIGEgbW9kZWwgb2JqZWN0IGZvciBhIHZpZXdhYmxlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZXh0ZW5kZWRVcmlJbmZvIHVyaSBpbmZvIHRvIG9idGFpbiBsYXN0IG1hdGNoZWQgcmVzb3VyY2UgZnJvbS4KKyAgICAgICAgICogQHJldHVybiBhIG1vZGVsIG9iamVjdC4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgT2JqZWN0IGdldE1vZGVsKGZpbmFsIEV4dGVuZGVkVXJpSW5mbyBleHRlbmRlZFVyaUluZm8pIHsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8T2JqZWN0PiBtYXRjaGVkUmVzb3VyY2VzID0gZXh0ZW5kZWRVcmlJbmZvLmdldE1hdGNoZWRSZXNvdXJjZXMoKTsKKworICAgICAgICAgICAgaWYgKHJlc291cmNlSW5zdGFuY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBzZXRNb2RlbENsYXNzKHJlc291cmNlSW5zdGFuY2UpOworICAgICAgICAgICAgfSBlbHNlIGlmIChtYXRjaGVkUmVzb3VyY2VzLnNpemUoKSA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2V0TW9kZWxDbGFzcyhtYXRjaGVkUmVzb3VyY2VzLmdldCgxKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBzZXRNb2RlbENsYXNzKHJlc291cmNlQ29udGV4dFByb3ZpZGVyLmdldCgpLmdldFJlc291cmNlKHJlc291cmNlQ2xhc3MpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB0ZW1wbGF0ZSBuYW1lcyB0byBiZSBjb25zaWRlcmVkIGFzIGNhbmRpZGF0ZXMgZm9yIHJlc29sdmluZworICAgICAgICAgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5WaWV3YWJsZSB2aWV3YWJsZX0gaW50bworICAgICAgICAgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5zcGkuUmVzb2x2ZWRWaWV3YWJsZSByZXNvbHZlZCB2aWV3YWJsZX0uCisgICAgICAgICAqIDxwLz4KKyAgICAgICAgICogT3JkZXIgb2YgdGVtcGxhdGUgbmFtZXMgdG8gYmUgcmVzb2x2ZWQgaXMgYXMgZm9sbG93czoKKyAgICAgICAgICogPHVsPgorICAgICAgICAgKiA8bGk+e3tAdmFsdWUgI0lNUExJQ0lUX1ZJRVdfUEFUSF9QQVJBTUVURVJ9fSB2YWx1ZTwvbGk+CisgICAgICAgICAqIDxsaT57QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5UZW1wbGF0ZSNuYW1lKCl9PC9saT4KKyAgICAgICAgICogPGxpPmxhc3Qgc3ViLXJlc291cmNlIGxvY2F0b3IgcGF0aDwvbGk+CisgICAgICAgICAqIDxsaT5pbmRleDwvbGk+CisgICAgICAgICAqIDwvdWw+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSByZXF1ZXN0Q29udGV4dCByZXF1ZXN0IGNvbnRleHQgdG8gb2J0YWluIHtAbGluayAjSU1QTElDSVRfVklFV19QQVRIX1BBUkFNRVRFUn0gdmFsdWUgZnJvbS4KKyAgICAgICAgICogQHJldHVybiBhIG5vbi1lbXB0eSBsaXN0IG9mIHRlbXBsYXRlIG5hbWVzLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gZ2V0VGVtcGxhdGVOYW1lcyhmaW5hbCBDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgeworICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHRlbXBsYXRlTmFtZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgICAgICAgICAgLy8gVGVtcGxhdGUgbmFtZSBleHRyYWN0ZWQgZnJvbSBwYXRoIHBhcmFtLgorICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBhdGhUZW1wbGF0ZSA9IHJlcXVlc3RDb250ZXh0LmdldFVyaUluZm8oKS5nZXRQYXRoUGFyYW1ldGVycygpLmdldEZpcnN0KElNUExJQ0lUX1ZJRVdfUEFUSF9QQVJBTUVURVIpOworICAgICAgICAgICAgaWYgKHBhdGhUZW1wbGF0ZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGVtcGxhdGVOYW1lcy5hZGQocGF0aFRlbXBsYXRlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQW5ub3RhdGlvbi4KKyAgICAgICAgICAgIGlmICh0aGlzLnRlbXBsYXRlTmFtZSAhPSBudWxsICYmICEiIi5lcXVhbHModGhpcy50ZW1wbGF0ZU5hbWUpKSB7CisgICAgICAgICAgICAgICAgdGVtcGxhdGVOYW1lcy5hZGQodGhpcy50ZW1wbGF0ZU5hbWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTdWItcmVzb3VyY2UgcGF0aC4KKyAgICAgICAgICAgIGZpbmFsIEV4dGVuZGVkVXJpSW5mbyB1cmlJbmZvID0gZXh0ZW5kZWRVcmlJbmZvUHJvdmlkZXIuZ2V0KCk7CisgICAgICAgICAgICBmaW5hbCBMaXN0PFJ1bnRpbWVSZXNvdXJjZT4gbWF0Y2hlZFJ1bnRpbWVSZXNvdXJjZXMgPSB1cmlJbmZvLmdldE1hdGNoZWRSdW50aW1lUmVzb3VyY2VzKCk7CisgICAgICAgICAgICBpZiAobWF0Y2hlZFJ1bnRpbWVSZXNvdXJjZXMuc2l6ZSgpID4gMSkgeworICAgICAgICAgICAgICAgIC8vID4gMSB0byBjaGVjayB0aGF0IHdlIG1hdGNoZWQgc3ViLXJlc291cmNlCisgICAgICAgICAgICAgICAgZmluYWwgUnVudGltZVJlc291cmNlIGxhc3RNYXRjaGVkUnVudGltZVJlc291cmNlID0gbWF0Y2hlZFJ1bnRpbWVSZXNvdXJjZXMuZ2V0KDApOworICAgICAgICAgICAgICAgIGZpbmFsIFJlc291cmNlIGxhc3RNYXRjaGVkUmVzb3VyY2UgPSBsYXN0TWF0Y2hlZFJ1bnRpbWVSZXNvdXJjZS5nZXRSZXNvdXJjZXMoKS5nZXQoMCk7CisKKyAgICAgICAgICAgICAgICBTdHJpbmcgcGF0aCA9IGxhc3RNYXRjaGVkUmVzb3VyY2UuZ2V0UGF0aCgpOworCisgICAgICAgICAgICAgICAgaWYgKHBhdGggIT0gbnVsbCAmJiAhSU1QTElDSVRfVklFV19QQVRIX1BBUkFNRVRFUl9URU1QTEFURS5lcXVhbHMocGF0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguY2hhckF0KDApID09ICcvJyA/IHBhdGguc3Vic3RyaW5nKDEsIHBhdGgubGVuZ3RoKCkpIDogcGF0aDsKKyAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVOYW1lcy5hZGQocGF0aCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJbmRleC4KKyAgICAgICAgICAgIGlmICh0ZW1wbGF0ZU5hbWVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHRlbXBsYXRlTmFtZXMuYWRkKCJpbmRleCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdGVtcGxhdGVOYW1lczsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHtAY29kZSBUZW1wbGF0ZU1vZGVsUHJvY2Vzc29yfSBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZUNvbnRleHRQcm92aWRlciAoaW5qZWN0ZWQpIHJlc291cmNlIGNvbnRleHQgcHJvdmlkZXIuCisgICAgICogQHBhcmFtIHZhbGlkYXRvclByb3ZpZGVyICAgICAgIEplcnNleSBleHRlbnNpb24gb2YgQmVhblZhbGlkYXRpb24gVmFsaWRhdG9yLgorICAgICAqIEBwYXJhbSBleHRlbmRlZFVyaUluZm9Qcm92aWRlciAoaW5qZWN0ZWQpIGV4dGVuZGVkIHVyaSBpbmZvIHByb3ZpZGVyLgorICAgICAqLworICAgIEBJbmplY3QKKyAgICBUZW1wbGF0ZU1vZGVsUHJvY2Vzc29yKGZpbmFsIFByb3ZpZGVyPFJlc291cmNlQ29udGV4dD4gcmVzb3VyY2VDb250ZXh0UHJvdmlkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBQcm92aWRlcjxDb25maWd1cmVkVmFsaWRhdG9yPiB2YWxpZGF0b3JQcm92aWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFByb3ZpZGVyPEV4dGVuZGVkVXJpSW5mbz4gZXh0ZW5kZWRVcmlJbmZvUHJvdmlkZXIpIHsKKyAgICAgICAgdGhpcy5yZXNvdXJjZUNvbnRleHRQcm92aWRlciA9IHJlc291cmNlQ29udGV4dFByb3ZpZGVyOworICAgICAgICB0aGlzLnZhbGlkYXRvclByb3ZpZGVyID0gdmFsaWRhdG9yUHJvdmlkZXI7CisgICAgICAgIHRoaXMuZXh0ZW5kZWRVcmlJbmZvUHJvdmlkZXIgPSBleHRlbmRlZFVyaUluZm9Qcm92aWRlcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb3VyY2VNb2RlbCBwcm9jZXNzUmVzb3VyY2VNb2RlbChmaW5hbCBSZXNvdXJjZU1vZGVsIHJlc291cmNlTW9kZWwsIGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgeworICAgICAgICByZXR1cm4gcHJvY2Vzc01vZGVsKHJlc291cmNlTW9kZWwsIGZhbHNlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb3VyY2VNb2RlbCBwcm9jZXNzU3ViUmVzb3VyY2UoZmluYWwgUmVzb3VyY2VNb2RlbCBzdWJSZXNvdXJjZU1vZGVsLCBmaW5hbCBDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgcmV0dXJuIHByb2Nlc3NNb2RlbChzdWJSZXNvdXJjZU1vZGVsLCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmhhbmNlIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUnVudGltZVJlc291cmNlIHJ1bnRpbWUgcmVzb3VyY2VzfSBmcm9tIHRoZSBnaXZlbgorICAgICAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNb2RlbCByZXNvdXJjZSBtb2RlbH0gd2l0aCBtZXRob2RzIG9idGFpbmVkIHZpYQorICAgICAqIHtAbGluayAjZ2V0RW5oYW5jaW5nTWV0aG9kcyhvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUnVudGltZVJlc291cmNlKX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VNb2RlbCAgICByZXNvdXJjZSBtb2RlbCB3aXRoIHJ1bnRpbWUgcmVzb3VyY2VzIHRvIGVuaGFuY2UuCisgICAgICogQHBhcmFtIHN1YlJlc291cmNlTW9kZWwgZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSByZXNvdXJjZSBtb2RlbCByZXByZXNlbnRzIHN1Yi1yZXNvdXJjZS4KKyAgICAgKiBAcmV0dXJuIGVuaGFuY2VkIHJlc291cmNlIG1vZGVsLgorICAgICAqLworICAgIHByaXZhdGUgUmVzb3VyY2VNb2RlbCBwcm9jZXNzTW9kZWwoZmluYWwgUmVzb3VyY2VNb2RlbCByZXNvdXJjZU1vZGVsLCBmaW5hbCBib29sZWFuIHN1YlJlc291cmNlTW9kZWwpIHsKKyAgICAgICAgUmVzb3VyY2VNb2RlbC5CdWlsZGVyIG5ld01vZGVsQnVpbGRlciA9IHByb2Nlc3NUZW1wbGF0ZUFubm90YXRlZEludm9jYWJsZXMocmVzb3VyY2VNb2RlbCwgc3ViUmVzb3VyY2VNb2RlbCk7CisKKyAgICAgICAgZm9yIChSdW50aW1lUmVzb3VyY2UgcmVzb3VyY2UgOiByZXNvdXJjZU1vZGVsLmdldFJ1bnRpbWVSZXNvdXJjZU1vZGVsKCkuZ2V0UnVudGltZVJlc291cmNlcygpKSB7CisgICAgICAgICAgICBNb2RlbFByb2Nlc3NvclV0aWwuZW5oYW5jZVJlc291cmNlKHJlc291cmNlLCBuZXdNb2RlbEJ1aWxkZXIsIGdldEVuaGFuY2luZ01ldGhvZHMocmVzb3VyY2UpLCBmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3TW9kZWxCdWlsZGVyLmJ1aWxkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvY2VzcyBhbGwge0BsaW5rIEludm9jYWJsZSBpbnZvY2FibGVzfSBhbmQgZGVmaW5lcworICAgICAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuSW52b2NhYmxlI2dldFJvdXRpbmdSZXNwb25zZVR5cGUoKSByb3V0aW5nIHJlc3BvbnNlIHR5cGVzfQorICAgICAqIGFzIHtAbGluayBWaWV3YWJsZX0gZm9yIGFsbCBtZXRob2RzIGFubm90YXRlZCB3aXRoIHtAbGluayBUZW1wbGF0ZX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2VNb2RlbCAgICByZXNvdXJjZSBtb2RlbCB0byBwcm9jZXNzLgorICAgICAqIEBwYXJhbSBzdWJSZXNvdXJjZU1vZGVsIGRldGVybWluZXMgd2hldGhlciB0aGUgcmVzb3VyY2UgbW9kZWwgcmVwcmVzZW50cyBzdWItcmVzb3VyY2UuCisgICAgICogQHJldHVybiBNb2RpZmllZCByZXNvdXJjZSBtb2RlbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFJlc291cmNlTW9kZWwuQnVpbGRlciBwcm9jZXNzVGVtcGxhdGVBbm5vdGF0ZWRJbnZvY2FibGVzKFJlc291cmNlTW9kZWwgcmVzb3VyY2VNb2RlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gc3ViUmVzb3VyY2VNb2RlbCkgeworICAgICAgICBSZXNvdXJjZU1vZGVsLkJ1aWxkZXIgbW9kZWxCdWlsZGVyID0gbmV3IFJlc291cmNlTW9kZWwuQnVpbGRlcihzdWJSZXNvdXJjZU1vZGVsKTsKKyAgICAgICAgZm9yIChSZXNvdXJjZSByZXNvdXJjZSA6IHJlc291cmNlTW9kZWwuZ2V0UmVzb3VyY2VzKCkpIHsKKyAgICAgICAgICAgIFJlc291cmNlIG5ld1Jlc291cmNlID0gcHJvY2Vzc1Jlc291cmNlKHJlc291cmNlKTsKKyAgICAgICAgICAgIG1vZGVsQnVpbGRlci5hZGRSZXNvdXJjZShuZXdSZXNvdXJjZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1vZGVsQnVpbGRlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlc291cmNlIHByb2Nlc3NSZXNvdXJjZShSZXNvdXJjZSByZXNvdXJjZSkgeworICAgICAgICBSZXNvdXJjZS5CdWlsZGVyIHJlc291cmNlQnVpbGRlciA9IFJlc291cmNlLmJ1aWxkZXIocmVzb3VyY2UuZ2V0UGF0aCgpKTsKKyAgICAgICAgZm9yIChSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCA6IHJlc291cmNlLmdldFJlc291cmNlTWV0aG9kcygpKSB7CisgICAgICAgICAgICBSZXNvdXJjZU1ldGhvZC5CdWlsZGVyIGJ1aWxkZXIgPSByZXNvdXJjZUJ1aWxkZXIuYWRkTWV0aG9kKHJlc291cmNlTWV0aG9kKTsKKyAgICAgICAgICAgIGlmIChyZXNvdXJjZU1ldGhvZC5nZXRJbnZvY2FibGUoKS5nZXRIYW5kbGluZ01ldGhvZCgpLmlzQW5ub3RhdGlvblByZXNlbnQoVGVtcGxhdGUuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgYnVpbGRlci5yb3V0aW5nUmVzcG9uc2VUeXBlKFZpZXdhYmxlLmNsYXNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocmVzb3VyY2UuZ2V0UmVzb3VyY2VMb2NhdG9yKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVzb3VyY2VCdWlsZGVyLmFkZE1ldGhvZChyZXNvdXJjZS5nZXRSZXNvdXJjZUxvY2F0b3IoKSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKFJlc291cmNlIGNoaWxkIDogcmVzb3VyY2UuZ2V0Q2hpbGRSZXNvdXJjZXMoKSkgeworICAgICAgICAgICAgcmVzb3VyY2VCdWlsZGVyLmFkZENoaWxkUmVzb3VyY2UocHJvY2Vzc1Jlc291cmNlKGNoaWxkKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc291cmNlQnVpbGRlci5idWlsZCgpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgZW5oYW5jaW5nIG1ldGhvZHMgZm9yIGEgZ2l2ZW4ge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SdW50aW1lUmVzb3VyY2UgcnVudGltZQorICAgICAqIHJlc291cmNlfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBydW50aW1lUmVzb3VyY2UgcnVudGltZSByZXNvdXJjZSB0byBjcmVhdGUgZW5oYW5jaW5nIG1ldGhvZHMgZm9yLgorICAgICAqIEByZXR1cm4gbGlzdCBvZiBlbmhhbmNpbmcgbWV0aG9kcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIExpc3Q8TW9kZWxQcm9jZXNzb3JVdGlsLk1ldGhvZD4gZ2V0RW5oYW5jaW5nTWV0aG9kcyhmaW5hbCBSdW50aW1lUmVzb3VyY2UgcnVudGltZVJlc291cmNlKSB7CisgICAgICAgIGZpbmFsIExpc3Q8TW9kZWxQcm9jZXNzb3JVdGlsLk1ldGhvZD4gbmV3TWV0aG9kcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgICAgIGZvciAoZmluYWwgUmVzb3VyY2UgcmVzb3VyY2UgOiBydW50aW1lUmVzb3VyY2UuZ2V0UmVzb3VyY2VzKCkpIHsKKyAgICAgICAgICAgIC8vIEhhbmRsZXIgY2xhc3Nlcy4KKyAgICAgICAgICAgIGZvciAoZmluYWwgQ2xhc3M8Pz4gaGFuZGxlckNsYXNzIDogcmVzb3VyY2UuZ2V0SGFuZGxlckNsYXNzZXMoKSkgeworICAgICAgICAgICAgICAgIGNyZWF0ZUVuaGFuY2luZ01ldGhvZHMoaGFuZGxlckNsYXNzLCBudWxsLCBuZXdNZXRob2RzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gTmFtZXMgLSBpZiB0aGVyZSBhcmUgbm8gaGFuZGxlciBjbGFzc2VzIC8gaW5zdGFuY2VzLgorICAgICAgICAgICAgaWYgKHJlc291cmNlLmdldEhhbmRsZXJDbGFzc2VzKCkuaXNFbXB0eSgpICYmIHJlc291cmNlLmdldEhhbmRsZXJJbnN0YW5jZXMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyByZXNvdXJjZU5hbWUgOiByZXNvdXJjZS5nZXROYW1lcygpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPE9iamVjdD4gcmVzb3VyY2VDbGFzcyA9IEFjY2Vzc0NvbnRyb2xsZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZG9Qcml2aWxlZ2VkKFJlZmxlY3Rpb25IZWxwZXIuY2xhc3NGb3JOYW1lUEEocmVzb3VyY2VOYW1lKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZUNsYXNzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUVuaGFuY2luZ01ldGhvZHMocmVzb3VyY2VDbGFzcywgbnVsbCwgbmV3TWV0aG9kcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEhhbmRsZXIgaW5zdGFuY2VzLgorICAgICAgICAgICAgRXJyb3JzLnByb2Nlc3MobmV3IFByb2R1Y2VyPFZvaWQ+KCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBWb2lkIGNhbGwoKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoZmluYWwgT2JqZWN0IGhhbmRsZXJJbnN0YW5jZSA6IHJlc291cmNlLmdldEhhbmRsZXJJbnN0YW5jZXMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gaGFuZGxlckluc3RhbmNlQ2xhc3MgPSBoYW5kbGVySW5zdGFuY2UuZ2V0Q2xhc3MoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNvdXJjZS5nZXRIYW5kbGVyQ2xhc3NlcygpLmNvbnRhaW5zKGhhbmRsZXJJbnN0YW5jZUNsYXNzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZUVuaGFuY2luZ01ldGhvZHMoaGFuZGxlckluc3RhbmNlQ2xhc3MsIGhhbmRsZXJJbnN0YW5jZSwgbmV3TWV0aG9kcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9ycy53YXJuaW5nKHJlc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jYWxpemF0aW9uTWVzc2FnZXMuVEVNUExBVEVfSEFORExFUl9BTFJFQURZX0VOSEFOQ0VEKGhhbmRsZXJJbnN0YW5jZUNsYXNzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXdNZXRob2RzOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgZW5oYW5jaW5nIG1ldGhvZHMgZm9yIGdpdmVuIHJlc291cmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlQ2xhc3MgICAgcmVzb3VyY2UgY2xhc3MgZm9yIHdoaWNoIGVuaGFuY2luZyBtZXRob2RzIHNob3VsZCBiZSBjcmVhdGVkLgorICAgICAqIEBwYXJhbSByZXNvdXJjZUluc3RhbmNlIHJlc291cmNlIGluc3RhbmNlIGZvciB3aGljaCBlbmhhbmNpbmcgbWV0aG9kcyBzaG91bGQgYmUgY3JlYXRlZC4gTWF5IGJlIHtAY29kZSBudWxsfS4KKyAgICAgKiBAcGFyYW0gbmV3TWV0aG9kcyAgICAgICBsaXN0IHRvIHN0b3JlIG5ldyBtZXRob2RzIGludG8uCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZUVuaGFuY2luZ01ldGhvZHMoZmluYWwgQ2xhc3M8Pz4gcmVzb3VyY2VDbGFzcywgZmluYWwgT2JqZWN0IHJlc291cmNlSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxNb2RlbFByb2Nlc3NvclV0aWwuTWV0aG9kPiBuZXdNZXRob2RzKSB7CisgICAgICAgIGZpbmFsIFRlbXBsYXRlIHRlbXBsYXRlID0gcmVzb3VyY2VDbGFzcy5nZXRBbm5vdGF0aW9uKFRlbXBsYXRlLmNsYXNzKTsKKworICAgICAgICBpZiAodGVtcGxhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gYW5ub3RhdGVkUmVzb3VyY2VDbGFzcyA9IE1vZGVsSGVscGVyLmdldEFubm90YXRlZFJlc291cmNlQ2xhc3MocmVzb3VyY2VDbGFzcyk7CisKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8TWVkaWFUeXBlPiBwcm9kdWNlcyA9IE1lZGlhVHlwZXMKKyAgICAgICAgICAgICAgICAgICAgLmNyZWF0ZVF1YWxpdHlTb3VyY2VNZWRpYVR5cGVzKGFubm90YXRlZFJlc291cmNlQ2xhc3MuZ2V0QW5ub3RhdGlvbihQcm9kdWNlcy5jbGFzcykpOworICAgICAgICAgICAgZmluYWwgTGlzdDxNZWRpYVR5cGU+IGNvbnN1bWVzID0gTWVkaWFUeXBlcy5jcmVhdGVGcm9tKGFubm90YXRlZFJlc291cmNlQ2xhc3MuZ2V0QW5ub3RhdGlvbihDb25zdW1lcy5jbGFzcykpOworCisgICAgICAgICAgICBmaW5hbCBUZW1wbGF0ZUluZmxlY3RvckltcGwgaW5mbGVjdG9yID0gbmV3IFRlbXBsYXRlSW5mbGVjdG9ySW1wbCh0ZW1wbGF0ZS5uYW1lKCksCisgICAgICAgICAgICAgICAgICAgIHJlc291cmNlQ2xhc3MsIHJlc291cmNlSW5zdGFuY2UpOworCisgICAgICAgICAgICBuZXdNZXRob2RzLmFkZChuZXcgTW9kZWxQcm9jZXNzb3JVdGlsLk1ldGhvZChIdHRwTWV0aG9kLkdFVCwgY29uc3VtZXMsIHByb2R1Y2VzLCBpbmZsZWN0b3IpKTsKKyAgICAgICAgICAgIG5ld01ldGhvZHMuYWRkKG5ldyBNb2RlbFByb2Nlc3NvclV0aWwuTWV0aG9kKElNUExJQ0lUX1ZJRVdfUEFUSF9QQVJBTUVURVJfVEVNUExBVEUsIEh0dHBNZXRob2QuR0VULAorICAgICAgICAgICAgICAgICAgICBjb25zdW1lcywgcHJvZHVjZXMsIGluZmxlY3RvcikpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L212Yy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvaW50ZXJuYWwvVmlld2FibGVNZXNzYWdlQm9keVdyaXRlci5qYXZhIGIvZXh0L212Yy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvaW50ZXJuYWwvVmlld2FibGVNZXNzYWdlQm9keVdyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxODIwZWYKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvbXZjL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL212Yy9pbnRlcm5hbC9WaWV3YWJsZU1lc3NhZ2VCb2R5V3JpdGVyLmphdmEKQEAgLTAsMCArMSwyMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdHJhaW5lZFRvOworaW1wb3J0IGphdmF4LndzLnJzLk5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuUnVudGltZVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlJlc291cmNlSW5mbzsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5Qcm92aWRlcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkV4dGVuZGVkVXJpSW5mbzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLlZpZXdhYmxlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuc3BpLlJlc29sdmVkVmlld2FibGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5zcGkuVGVtcGxhdGVQcm9jZXNzb3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5zcGkuVmlld2FibGVDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuc3BpLlZpZXdhYmxlQ29udGV4dEV4Y2VwdGlvbjsKKworLyoqCisgKiB7QGxpbmsgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyIE1lc3NhZ2UgYm9keSB3cml0ZXJ9IGZvciB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5WaWV3YWJsZSB2aWV3YWJsZX0KKyAqIGVudGl0aWVzLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUHJvdmlkZXIKK0BDb25zdHJhaW5lZFRvKFJ1bnRpbWVUeXBlLlNFUlZFUikKK2ZpbmFsIGNsYXNzIFZpZXdhYmxlTWVzc2FnZUJvZHlXcml0ZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVdyaXRlcjxWaWV3YWJsZT4geworCisgICAgQEluamVjdAorICAgIHByaXZhdGUgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyOworCisgICAgQENvbnRleHQKKyAgICBwcml2YXRlIGphdmF4LmluamVjdC5Qcm92aWRlcjxFeHRlbmRlZFVyaUluZm8+IGV4dGVuZGVkVXJpSW5mb1Byb3ZpZGVyOworICAgIEBDb250ZXh0CisgICAgcHJpdmF0ZSBqYXZheC5pbmplY3QuUHJvdmlkZXI8Q29udGFpbmVyUmVxdWVzdD4gcmVxdWVzdFByb3ZpZGVyOworICAgIEBDb250ZXh0CisgICAgcHJpdmF0ZSBqYXZheC5pbmplY3QuUHJvdmlkZXI8UmVzb3VyY2VJbmZvPiByZXNvdXJjZUluZm9Qcm92aWRlcjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFZpZXdhYmxlTWVzc2FnZUJvZHlXcml0ZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIFZpZXdhYmxlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShmaW5hbCBWaWV3YWJsZSB2aWV3YWJsZSwgZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGVUbyhmaW5hbCBWaWV3YWJsZSB2aWV3YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBSZXNvbHZlZFZpZXdhYmxlIHJlc29sdmVkVmlld2FibGUgPSByZXNvbHZlKHZpZXdhYmxlKTsKKyAgICAgICAgICAgIGlmIChyZXNvbHZlZFZpZXdhYmxlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9IExvY2FsaXphdGlvbk1lc3NhZ2VzLlRFTVBMQVRFX05BTUVfQ09VTERfTk9UX0JFX1JFU09MVkVEKHZpZXdhYmxlLmdldFRlbXBsYXRlTmFtZSgpKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViQXBwbGljYXRpb25FeGNlcHRpb24obmV3IFByb2Nlc3NpbmdFeGNlcHRpb24obWVzc2FnZSksIFJlc3BvbnNlLlN0YXR1cy5OT1RfRk9VTkQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBodHRwSGVhZGVycy5wdXRTaW5nbGUoSHR0cEhlYWRlcnMuQ09OVEVOVF9UWVBFLCByZXNvbHZlZFZpZXdhYmxlLmdldE1lZGlhVHlwZSgpKTsKKyAgICAgICAgICAgIHJlc29sdmVkVmlld2FibGUud3JpdGVUbyhlbnRpdHlTdHJlYW0sIGh0dHBIZWFkZXJzKTsKKyAgICAgICAgfSBjYXRjaCAoVmlld2FibGVDb250ZXh0RXhjZXB0aW9uIHZjZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKHZjZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNvbHZlIHRoZSBnaXZlbiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5WaWV3YWJsZSB2aWV3YWJsZX0gdXNpbmcKKyAgICAgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5zcGkuVmlld2FibGVDb250ZXh0fS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2aWV3YWJsZSB2aWV3YWJsZSB0byBiZSByZXNvbHZlZC4KKyAgICAgKiBAcmV0dXJuIHJlc29sdmVkIHZpZXdhYmxlIG9yIHtAY29kZSBudWxsfSwgaWYgdGhlIHZpZXdhYmxlIGNhbm5vdCBiZSByZXNvbHZlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFJlc29sdmVkVmlld2FibGUgcmVzb2x2ZShmaW5hbCBWaWV3YWJsZSB2aWV3YWJsZSkgeworICAgICAgICBpZiAodmlld2FibGUgaW5zdGFuY2VvZiBSZXNvbHZlZFZpZXdhYmxlKSB7CisgICAgICAgICAgICByZXR1cm4gKFJlc29sdmVkVmlld2FibGUpIHZpZXdhYmxlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmluYWwgVmlld2FibGVDb250ZXh0IHZpZXdhYmxlQ29udGV4dCA9IGdldFZpZXdhYmxlQ29udGV4dCgpOworICAgICAgICAgICAgZmluYWwgU2V0PFRlbXBsYXRlUHJvY2Vzc29yPiB0ZW1wbGF0ZVByb2Nlc3NvcnMgPSBnZXRUZW1wbGF0ZVByb2Nlc3NvcnMoKTsKKworICAgICAgICAgICAgZmluYWwgTGlzdDxNZWRpYVR5cGU+IHByb2R1Y2libGVNZWRpYVR5cGVzID0gVGVtcGxhdGVIZWxwZXIKKyAgICAgICAgICAgICAgICAgICAgLmdldFByb2R1Y2libGVNZWRpYVR5cGVzKHJlcXVlc3RQcm92aWRlci5nZXQoKSwgZXh0ZW5kZWRVcmlJbmZvUHJvdmlkZXIuZ2V0KCksIG51bGwpOworCisgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiByZXNvdXJjZUNsYXNzID0gcmVzb3VyY2VJbmZvUHJvdmlkZXIuZ2V0KCkuZ2V0UmVzb3VyY2VDbGFzcygpOworICAgICAgICAgICAgaWYgKHZpZXdhYmxlIGluc3RhbmNlb2YgSW1wbGljaXRWaWV3YWJsZSkgeworICAgICAgICAgICAgICAgIC8vIFRlbXBsYXRlIE5hbWVzLgorICAgICAgICAgICAgICAgIGZpbmFsIEltcGxpY2l0Vmlld2FibGUgaW1wbGljaXRWaWV3YWJsZSA9IChJbXBsaWNpdFZpZXdhYmxlKSB2aWV3YWJsZTsKKworICAgICAgICAgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIHRlbXBsYXRlTmFtZSA6IGltcGxpY2l0Vmlld2FibGUuZ2V0VGVtcGxhdGVOYW1lcygpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFZpZXdhYmxlIHNpbXBsZVZpZXdhYmxlID0gbmV3IFZpZXdhYmxlKHRlbXBsYXRlTmFtZSwgdmlld2FibGUuZ2V0TW9kZWwoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVzb2x2ZWRWaWV3YWJsZSByZXNvbHZlZFZpZXdhYmxlID0gcmVzb2x2ZShzaW1wbGVWaWV3YWJsZSwgcHJvZHVjaWJsZU1lZGlhVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGljaXRWaWV3YWJsZS5nZXRSZXNvbHZpbmdDbGFzcygpLCB2aWV3YWJsZUNvbnRleHQsIHRlbXBsYXRlUHJvY2Vzc29ycyk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkVmlld2FibGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVkVmlld2FibGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHZpZXdhYmxlLCBwcm9kdWNpYmxlTWVkaWFUeXBlcywgcmVzb3VyY2VDbGFzcywgdmlld2FibGVDb250ZXh0LCB0ZW1wbGF0ZVByb2Nlc3NvcnMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc29sdmUgZ2l2ZW4ge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuVmlld2FibGUgdmlld2FibGV9IGZvciBhIGxpc3Qgb2Yge0BsaW5rIGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlIG1lZGlhVHlwZXN9IGFuZCBhIHtAbGluayBDbGFzcyByZXNvbHZpbmdDbGFzc30KKyAgICAgKiB1c2luZyBnaXZlbiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5zcGkuVmlld2FibGVDb250ZXh0IHZpZXdhYmxlQ29udGV4dH0gYW5kIGEgc2V0IG9mIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLnNwaS5UZW1wbGF0ZVByb2Nlc3NvciB0ZW1wbGF0ZVByb2Nlc3NvcnN9CisgICAgICoKKyAgICAgKiBAcGFyYW0gdmlld2FibGUgdmlld2FibGUgdG8gYmUgcmVzb2x2ZWQuCisgICAgICogQHBhcmFtIG1lZGlhVHlwZXMgcHJvZHVjaWJsZSBtZWRpYSB0eXBlcy4KKyAgICAgKiBAcGFyYW0gcmVzb2x2aW5nQ2xhc3Mgbm9uLW51bGwgcmVzb2x2aW5nIGNsYXNzLgorICAgICAqIEBwYXJhbSB2aWV3YWJsZUNvbnRleHQgdmlld2FibGUgY29udGV4dC4KKyAgICAgKiBAcGFyYW0gdGVtcGxhdGVQcm9jZXNzb3JzIGNvbGxlY3Rpb24gb2YgYXZhaWxhYmxlIHRlbXBsYXRlIHByb2Nlc3NvcnMuCisgICAgICogQHJldHVybiByZXNvbHZlZCB2aWV3YWJsZSBvciB7QGNvZGUgbnVsbH0sIGlmIHRoZSB2aWV3YWJsZSBjYW5ub3QgYmUgcmVzb2x2ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBSZXNvbHZlZFZpZXdhYmxlIHJlc29sdmUoZmluYWwgVmlld2FibGUgdmlld2FibGUsIGZpbmFsIExpc3Q8TWVkaWFUeXBlPiBtZWRpYVR5cGVzLCBmaW5hbCBDbGFzczw/PiByZXNvbHZpbmdDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBWaWV3YWJsZUNvbnRleHQgdmlld2FibGVDb250ZXh0LCBmaW5hbCBTZXQ8VGVtcGxhdGVQcm9jZXNzb3I+IHRlbXBsYXRlUHJvY2Vzc29ycykgeworICAgICAgICBmb3IgKFRlbXBsYXRlUHJvY2Vzc29yIHRlbXBsYXRlUHJvY2Vzc29yIDogdGVtcGxhdGVQcm9jZXNzb3JzKSB7CisgICAgICAgICAgICBmb3IgKGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUgOiBtZWRpYVR5cGVzKSB7CisgICAgICAgICAgICAgICAgZmluYWwgUmVzb2x2ZWRWaWV3YWJsZSByZXNvbHZlZFZpZXdhYmxlID0gdmlld2FibGVDb250ZXh0CisgICAgICAgICAgICAgICAgICAgICAgICAucmVzb2x2ZVZpZXdhYmxlKHZpZXdhYmxlLCBtZWRpYVR5cGUsIHJlc29sdmluZ0NsYXNzLCB0ZW1wbGF0ZVByb2Nlc3Nvcik7CisKKyAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRWaWV3YWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlZFZpZXdhYmxlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIHtAbGluayBqYXZhLnV0aWwuTGlua2VkSGFzaFNldCBjb2xsZWN0aW9ufSBvZiBhdmFpbGFibGUgdGVtcGxhdGUgcHJvY2Vzc29ycy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gc2V0IG9mIHRlbXBsYXRlIHByb2Nlc3NvcnMuCisgICAgICovCisgICAgcHJpdmF0ZSBTZXQ8VGVtcGxhdGVQcm9jZXNzb3I+IGdldFRlbXBsYXRlUHJvY2Vzc29ycygpIHsKKyAgICAgICAgZmluYWwgU2V0PFRlbXBsYXRlUHJvY2Vzc29yPiB0ZW1wbGF0ZVByb2Nlc3NvcnMgPSBuZXcgTGlua2VkSGFzaFNldDw+KCk7CisKKyAgICAgICAgdGVtcGxhdGVQcm9jZXNzb3JzLmFkZEFsbChQcm92aWRlcnMuZ2V0Q3VzdG9tUHJvdmlkZXJzKGluamVjdGlvbk1hbmFnZXIsIFRlbXBsYXRlUHJvY2Vzc29yLmNsYXNzKSk7CisgICAgICAgIHRlbXBsYXRlUHJvY2Vzc29ycy5hZGRBbGwoUHJvdmlkZXJzLmdldFByb3ZpZGVycyhpbmplY3Rpb25NYW5hZ2VyLCBUZW1wbGF0ZVByb2Nlc3Nvci5jbGFzcykpOworCisgICAgICAgIHJldHVybiB0ZW1wbGF0ZVByb2Nlc3NvcnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLnNwaS5WaWV3YWJsZUNvbnRleHQgdmlld2FibGUgY29udGV4dH0uIFVzZXIgZGVmaW5lZCAoY3VzdG9tKSBjb250ZXh0cyBoYXZlIGhpZ2hlciBwcmlvcml0eSB0aGFuIHRoZSBkZWZhdWx0IG9uZXMKKyAgICAgKiAoaS5lLiB7QGxpbmsgUmVzb2x2aW5nVmlld2FibGVDb250ZXh0fSkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSBub24tbnVsbH0gdmlld2FibGUgY29udGV4dC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFZpZXdhYmxlQ29udGV4dCBnZXRWaWV3YWJsZUNvbnRleHQoKSB7CisgICAgICAgIGZpbmFsIFNldDxWaWV3YWJsZUNvbnRleHQ+IGN1c3RvbVByb3ZpZGVycyA9IFByb3ZpZGVycy5nZXRDdXN0b21Qcm92aWRlcnMoaW5qZWN0aW9uTWFuYWdlciwgVmlld2FibGVDb250ZXh0LmNsYXNzKTsKKyAgICAgICAgaWYgKCFjdXN0b21Qcm92aWRlcnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gY3VzdG9tUHJvdmlkZXJzLml0ZXJhdG9yKCkubmV4dCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBQcm92aWRlcnMuZ2V0UHJvdmlkZXJzKGluamVjdGlvbk1hbmFnZXIsIFZpZXdhYmxlQ29udGV4dC5jbGFzcykuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L212Yy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvaW50ZXJuYWwvcGFja2FnZS1pbmZvLmphdmEgYi9leHQvbXZjL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL212Yy9pbnRlcm5hbC9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmQxOTUyCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L212Yy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvaW50ZXJuYWwvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoqCisgKiBKZXJzZXkgc2VydmVyLXNpZGUgaW50ZXJuYWwgTVZDIChNb2RlbCBWaWV3IENvbnRyb2xsZXIpIGNsYXNzZXMuCisgKi8KK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5pbnRlcm5hbDsKZGlmZiAtLWdpdCBhL2V4dC9tdmMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbXZjL3BhY2thZ2UtaW5mby5qYXZhIGIvZXh0L212Yy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVjMDE0NQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9tdmMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbXZjL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKKy8qKgorICogUHJvdmlkZXMgc3VwcG9ydCBmb3IgTW9kZWwsIFZpZXcgYW5kIENvbnRyb2xsZXIgKE1WQykuCisgKiA8cC8+CisgKiBHaXZlbiB0aGUgTVZDIHBhdHRlcm4gdGhlIENvbnRyb2xsZXIgY29ycmVzcG9uZHMgdG8gYSByZXNvdXJjZSBjbGFzcywgdGhlIFZpZXcgdG8gYSB0ZW1wbGF0ZSByZWZlcmVuY2VkIGJ5IGEgdGVtcGxhdGUgbmFtZSwKKyAqIGFuZCB0aGUgTW9kZWwgdG8gYSBKYXZhIG9iamVjdCAob3IgYSBKYXZhIGJlYW4pLgorICogPHAvPgorICogQSByZXNvdXJjZSBtZXRob2Qgb2YgYSByZXNvdXJjZSBjbGFzcyBtYXkgcmV0dXJuIGFuIGluc3RhbmNlIG9mIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLlZpZXdhYmxlfSB0aGF0CisgKiBlbmNhcHN1bGF0ZXMgdGhlIHRlbXBsYXRlIG5hbWUgYW5kIHRoZSBtb2RlbC4gSW4gdGhpcyByZXNwZWN0IHRoZSBpbnN0YW5jZSBvZntAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLlZpZXdhYmxlfQorICogaXMgdGhlIHJlc3BvbnNlIGVudGl0eS4gU3VjaCBhIHZpZXdhYmxlIHJlc3BvbnNlIGVudGl0eSBtYXkgYmUgc2V0IGluIGNvbnRleHRzIG90aGVyIHRoYW4gYSByZXNvdXJjZSBtZXRob2QgYnV0IGZvciB0aGUKKyAqIHB1cnBvc2VzIG9mIHRoaXMgc2VjdGlvbiB0aGUgZm9jdXMgaXMgb24gcmVzb3VyY2UgbWV0aG9kcy4KKyAqIDxwLz4KKyAqIFRoZSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5WaWV3YWJsZX0sIHJldHVybmVkIGJ5IGEgcmVzb3VyY2UgbWV0aG9kLAorICogd2lsbCBiZSBwcm9jZXNzZWQgc3VjaCB0aGF0IHRoZSB0ZW1wbGF0ZSBuYW1lIGlzIHJlc29sdmVkIHRvIGEgdGVtcGxhdGUgcmVmZXJlbmNlIHRoYXQgaWRlbnRpZmllcyBhIHRlbXBsYXRlIGNhcGFibGUgb2YKKyAqIGJlaW5nIHByb2Nlc3NlZCBieSBhbiBhcHByb3ByaWF0ZSB2aWV3IHByb2Nlc3Nvci4KKyAqIDxici8+CisgKiBUaGUgdmlldyBwcm9jZXNzb3IgdGhlbiBwcm9jZXNzZXMgdGVtcGxhdGUgZ2l2ZW4gdGhlIG1vZGVsIHRvIHByb2R1Y2UgYSByZXNwb25zZSBlbnRpdHkgdGhhdCBpcyByZXR1cm5lZCB0byB0aGUgY2xpZW50LgorICogPHAvPgorICogRm9yIGV4YW1wbGUsIHRoZSB0ZW1wbGF0ZSBuYW1lIGNvdWxkIHJlZmVyZW5jZSBhIEphdmEgU2VydmVyIFBhZ2UgKEpTUCkgYW5kIHRoZSBtb2RlbCB3aWxsIGJlIGFjY2Vzc2libGUgdG8gdGhhdCBKU1AuIFRoZQorICogSlNQIHZpZXcgcHJvY2Vzc29yIHdpbGwgcHJvY2VzcyB0aGUgSlNQIHJlc3VsdGluZyBpbiBhbiBIVE1MIGRvY3VtZW50IHRoYXQgaXMgcmV0dXJuZWQgYXMgdGhlIHJlc3BvbnNlIGVudGl0eS4gKFNlZSBsYXRlcgorICogZm9yIG1vcmUgZGV0YWlscy4pCisgKiA8cC8+CisgKiBUd28gZm9ybXMgb2YgcmV0dXJuaW5nIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLlZpZXdhYmxlfSBpbnN0YW5jZXMgYXJlIHN1cHBvcnRlZDogZXhwbGljaXQ7IGFuZCBpbXBsaWNpdC4KKyAqLworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjOwpkaWZmIC0tZ2l0IGEvZXh0L212Yy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvc3BpL0Fic3RyYWN0RXJyb3JUZW1wbGF0ZU1hcHBlci5qYXZhIGIvZXh0L212Yy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvc3BpL0Fic3RyYWN0RXJyb3JUZW1wbGF0ZU1hcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MTM0NDUKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvbXZjL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL212Yy9zcGkvQWJzdHJhY3RFcnJvclRlbXBsYXRlTWFwcGVyLmphdmEKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5zcGk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkV4dGVuZGVkVXJpSW5mbzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuSW52b2NhYmxlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1ldGhvZDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLkVycm9yVGVtcGxhdGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5WaWV3YWJsZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLmludGVybmFsLlRlbXBsYXRlSW5mbGVjdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5FeHRlbmRlZEV4Y2VwdGlvbk1hcHBlcjsKKworLyoqCisgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBFeHRlbmRlZEV4Y2VwdGlvbk1hcHBlcn0gdXNlZCB0byBkZWNsYXJlIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGV4Y2VwdGlvbiB0eXBlcyB0aGF0IHNob3VsZCBiZQorICogcHJvY2Vzc2VkIGJ5IE1WQy4KKyAqIDxwLz4KKyAqIEV4dGVuc2lvbnMgc2hvdWxkIG92ZXJyaWRlIHtAbGluayAjZ2V0RXJyb3JTdGF0dXMoVGhyb3dhYmxlKX0gYW5kIHtAbGluayAjZ2V0RXJyb3JNb2RlbChUaHJvd2FibGUpfSB0byBwcm92aWRlIGEgcmVzcG9uc2UKKyAqIHN0YXR1cyBhbmQgbW9kZWwgZGVyaXZlZCBmcm9tIGEgcmFpc2VkIHRocm93YWJsZS4KKyAqIDxwLz4KKyAqIEJ5IGRlZmF1bHQgZXZlcnkge0BsaW5rIEV4Y2VwdGlvbiBleGNlcHRpb259IGlzIG1hcHBlZCBhbmQgdXNlZCBhcyBhIG1vZGVsIGluIGEgdmlld2FibGUgYW5kIHBhc3NlZCB0byB0aGUgTVZDIHJ1bnRpbWUgZm9yCisgKiBmdXJ0aGVyIHByb2Nlc3NpbmcuCisgKgorICogQHBhcmFtIDxUPiBBIHR5cGUgb2YgdGhlIGV4Y2VwdGlvbiBwcm9jZXNzZWQgYnkgdGhlIGV4Y2VwdGlvbiBtYXBwZXIuCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqIEBzaW5jZSAyLjMKKyAqLworQFNpbmdsZXRvbgorcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RXJyb3JUZW1wbGF0ZU1hcHBlcjxUIGV4dGVuZHMgVGhyb3dhYmxlPiBpbXBsZW1lbnRzIEV4dGVuZGVkRXhjZXB0aW9uTWFwcGVyPFQ+IHsKKworICAgIEBJbmplY3QKKyAgICBwcml2YXRlIGphdmF4LmluamVjdC5Qcm92aWRlcjxFeHRlbmRlZFVyaUluZm8+IHVyaUluZm9Qcm92aWRlcjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzTWFwcGFibGUoZmluYWwgVCB0aHJvd2FibGUpIHsKKyAgICAgICAgcmV0dXJuIGdldEVycm9yVGVtcGxhdGUoKSAhPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhbiB7QGxpbmsgRXJyb3JUZW1wbGF0ZX0gYW5ub3RhdGlvbiBmcm9tIHJlc291cmNlIG1ldGhvZCAvIGNsYXNzIHRoZSB0aHJvd2FibGUgd2FzIHJhaXNlZCBmcm9tLgorICAgICAqCisgICAgICogQHJldHVybiBhbiBlcnJvciB0ZW1wbGF0ZSBhbm5vdGF0aW9uIG9yIHtAY29kZSBudWxsfSBpZiB0aGUgbWV0aG9kIGlzIG5vdCBhbm5vdGF0ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBFcnJvclRlbXBsYXRlIGdldEVycm9yVGVtcGxhdGUoKSB7CisgICAgICAgIGZpbmFsIEV4dGVuZGVkVXJpSW5mbyB1cmlJbmZvID0gdXJpSW5mb1Byb3ZpZGVyLmdldCgpOworICAgICAgICBmaW5hbCBSZXNvdXJjZU1ldGhvZCBtYXRjaGVkUmVzb3VyY2VNZXRob2QgPSB1cmlJbmZvLmdldE1hdGNoZWRSZXNvdXJjZU1ldGhvZCgpOworCisgICAgICAgIGlmIChtYXRjaGVkUmVzb3VyY2VNZXRob2QgIT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgSW52b2NhYmxlIGludm9jYWJsZSA9IG1hdGNoZWRSZXNvdXJjZU1ldGhvZC5nZXRJbnZvY2FibGUoKTsKKworICAgICAgICAgICAgRXJyb3JUZW1wbGF0ZSBlcnJvclRlbXBsYXRlID0gaW52b2NhYmxlLmdldEhhbmRsaW5nTWV0aG9kKCkuZ2V0QW5ub3RhdGlvbihFcnJvclRlbXBsYXRlLmNsYXNzKTsKKyAgICAgICAgICAgIGlmIChlcnJvclRlbXBsYXRlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBDbGFzczw/PiBoYW5kbGVyQ2xhc3MgPSBpbnZvY2FibGUuZ2V0SGFuZGxlcigpLmdldEhhbmRsZXJDbGFzcygpOworCisgICAgICAgICAgICAgICAgaWYgKGludm9jYWJsZS5pc0luZmxlY3RvcigpICYmIFRlbXBsYXRlSW5mbGVjdG9yLmNsYXNzCisgICAgICAgICAgICAgICAgICAgICAgICAuaXNBc3NpZ25hYmxlRnJvbShpbnZvY2FibGUuZ2V0SGFuZGxlcigpLmdldEhhbmRsZXJDbGFzcygpKSkgeworCisgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJDbGFzcyA9ICgoVGVtcGxhdGVJbmZsZWN0b3IpIGludm9jYWJsZS5nZXRIYW5kbGVyKCkuZ2V0SW5zdGFuY2UobnVsbCkpLmdldE1vZGVsQ2xhc3MoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBlcnJvclRlbXBsYXRlID0gaGFuZGxlckNsYXNzLmdldEFubm90YXRpb24oRXJyb3JUZW1wbGF0ZS5jbGFzcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBlcnJvclRlbXBsYXRlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZpbmFsIFJlc3BvbnNlIHRvUmVzcG9uc2UoZmluYWwgVCB0aHJvd2FibGUpIHsKKyAgICAgICAgZmluYWwgRXJyb3JUZW1wbGF0ZSBlcnJvciA9IGdldEVycm9yVGVtcGxhdGUoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHRlbXBsYXRlTmFtZSA9ICIiLmVxdWFscyhlcnJvci5uYW1lKCkpID8gImluZGV4IiA6IGVycm9yLm5hbWUoKTsKKworICAgICAgICByZXR1cm4gUmVzcG9uc2UKKyAgICAgICAgICAgICAgICAuc3RhdHVzKGdldEVycm9yU3RhdHVzKHRocm93YWJsZSkpCisgICAgICAgICAgICAgICAgLmVudGl0eShuZXcgVmlld2FibGUodGVtcGxhdGVOYW1lLCBnZXRFcnJvck1vZGVsKHRocm93YWJsZSkpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIG1vZGVsIGZvciBlcnJvciB0ZW1wbGF0ZS4gRGVmYXVsdCB2YWx1ZSBpcyB0aGUge0Bjb2RlIHRocm93YWJsZX0gaXRzZWxmLgorICAgICAqCisgICAgICogQHBhcmFtIHRocm93YWJsZSB0aHJvd2FibGUgcmFpc2VkIGR1cmluZyBwcm9jZXNzaW5nIGEgcmVzb3VyY2UgbWV0aG9kLgorICAgICAqIEByZXR1cm4gYSBtb2RlbCBmb3IgZXJyb3IgdGVtcGxhdGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIE9iamVjdCBnZXRFcnJvck1vZGVsKGZpbmFsIFQgdGhyb3dhYmxlKSB7CisgICAgICAgIHJldHVybiB0aHJvd2FibGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgcmVzcG9uc2Ugc3RhdHVzIG9mIHRvLWJlLXByb2Nlc3NlZCBlcnJvciB0ZW1wbGF0ZS4gRGVmYXVsdCB2YWx1ZSBpcyB7QGxpbmsgUmVzcG9uc2UuU3RhdHVzI09LfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aHJvd2FibGUgdGhyb3dhYmxlIHJhaXNlZCBkdXJpbmcgcHJvY2Vzc2luZyBhIHJlc291cmNlIG1ldGhvZC4KKyAgICAgKiBAcmV0dXJuIHJlc3BvbnNlIHN0YXR1cyBvZiBlcnJvciByZXNwb25zZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgUmVzcG9uc2UuU3RhdHVzIGdldEVycm9yU3RhdHVzKGZpbmFsIFQgdGhyb3dhYmxlKSB7CisgICAgICAgIHJldHVybiBSZXNwb25zZS5TdGF0dXMuT0s7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L212Yy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvc3BpL0Fic3RyYWN0VGVtcGxhdGVQcm9jZXNzb3IuamF2YSBiL2V4dC9tdmMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbXZjL3NwaS9BYnN0cmFjdFRlbXBsYXRlUHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ5ZWE5YQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9tdmMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbXZjL3NwaS9BYnN0cmFjdFRlbXBsYXRlUHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSwzMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5zcGk7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5Qcm9wZXJ0aWVzSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUmVmbGVjdGlvbkhlbHBlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uRGF0YVN0cnVjdHVyZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLlZhbHVlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuTXZjRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuaW50ZXJuYWwuVGVtcGxhdGVIZWxwZXI7CisKKy8qKgorICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5zcGkuVGVtcGxhdGVQcm9jZXNzb3IgdGVtcGxhdGUgcHJvY2Vzc29yfSB0aGF0IGNhbiBiZSB1c2VkIHRvCisgKiBpbXBsZW1lbnQgc3VwcG9ydCBmb3IgY3VzdG9tIHRlbXBsYXRpbmcgZW5naW5lcy4gVGhlIGNsYXNzIGN1cnJlbnRseSByZWNvZ25pemVzIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgorICogPHVsPgorICogPGxpPntAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLk12Y0ZlYXR1cmUjVEVNUExBVEVfQkFTRV9QQVRIfTwvbGk+CisgKiA8bGk+e0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuTXZjRmVhdHVyZSNDQUNIRV9URU1QTEFURVN9PC9saT4KKyAqIDxsaT57QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5NdmNGZWF0dXJlI1RFTVBMQVRFX09CSkVDVF9GQUNUT1JZfTwvbGk+CisgKiA8L3VsPgorICogSWYgYW55IG9mIHRoZSBwcm9wZXJ0aWVzIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHBhcnRpY3VsYXIgdGVtcGxhdGUgcHJvY2Vzc29yIHRoZW4gdGhpcyBmYWN0IHNob3VsZCBiZSBtZW50aW9uZWQgaW4gZG9jdW1lbnRhdGlvbgorICogb2YgdGhlIHRlbXBsYXRlIHByb2Nlc3Nvci4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VGVtcGxhdGVQcm9jZXNzb3I8VD4gaW1wbGVtZW50cyBUZW1wbGF0ZVByb2Nlc3NvcjxUPiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihBYnN0cmFjdFRlbXBsYXRlUHJvY2Vzc29yLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBwcml2YXRlIGZpbmFsIENvbmN1cnJlbnRNYXA8U3RyaW5nLCBUPiBjYWNoZTsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHN1ZmZpeDsKKyAgICBwcml2YXRlIGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlnOworICAgIHByaXZhdGUgZmluYWwgU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQ7CisKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBiYXNlUGF0aDsKKyAgICBwcml2YXRlIGZpbmFsIFNldDxTdHJpbmc+IHN1cHBvcnRlZEV4dGVuc2lvbnM7CisgICAgcHJpdmF0ZSBmaW5hbCBDaGFyc2V0IGVuY29kaW5nOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBwcm9jZXNzb3Igd2l0aCBpbmplY3RlZCB7QGxpbmsgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uIGNvbmZpZ30gYW5kCisgICAgICogKG9wdGlvbmFsKSB7QGxpbmsgU2VydmxldENvbnRleHQgc2VydmxldCBjb250ZXh0fS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25maWcgY29uZmlndXJhdGlvbiB0byBjb25maWd1cmUgdGhpcyBwcm9jZXNzb3IgZnJvbS4KKyAgICAgKiBAcGFyYW0gc2VydmxldENvbnRleHQgKG9wdGlvbmFsKSBzZXJ2bGV0IGNvbnRleHQgdG8gb2J0YWluIHRlbXBsYXRlIHJlc291cmNlcyBmcm9tLgorICAgICAqIEBwYXJhbSBwcm9wZXJ0eVN1ZmZpeCBzdWZmaXggdG8gZGlzdGluZ3Vpc2ggcHJvcGVydGllcyBmb3IgY3VycmVudCB0ZW1wbGF0ZSBwcm9jZXNzb3IuCisgICAgICogQHBhcmFtIHN1cHBvcnRlZEV4dGVuc2lvbnMgc3VwcG9ydGVkIHRlbXBsYXRlIGZpbGUgZXh0ZW5zaW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQWJzdHJhY3RUZW1wbGF0ZVByb2Nlc3NvcihmaW5hbCBDb25maWd1cmF0aW9uIGNvbmZpZywgZmluYWwgU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByb3BlcnR5U3VmZml4LCBmaW5hbCBTdHJpbmcuLi4gc3VwcG9ydGVkRXh0ZW5zaW9ucykgeworICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZzsKKyAgICAgICAgdGhpcy5zdWZmaXggPSAnLicgKyBwcm9wZXJ0eVN1ZmZpeDsKKworICAgICAgICB0aGlzLnNlcnZsZXRDb250ZXh0ID0gc2VydmxldENvbnRleHQ7CisgICAgICAgIHRoaXMuc3VwcG9ydGVkRXh0ZW5zaW9ucyA9CisgICAgICAgICAgICAgICAgQXJyYXlzLnN0cmVhbShzdXBwb3J0ZWRFeHRlbnNpb25zKQorICAgICAgICAgICAgICAgICAgICAgIC5tYXAoaW5wdXQgLT4geworICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCA9IGlucHV0LnRvTG93ZXJDYXNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dC5zdGFydHNXaXRoKCIuIikgPyBpbnB1dCA6ICIuIiArIGlucHV0OworICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKTsKKworICAgICAgICAvLyBSZXNvbHZlIHByb3BlcnR5IHZhbHVlcy4KKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gY29uZmlnLmdldFByb3BlcnRpZXMoKTsKKworICAgICAgICAvLyBCYXNlIFBhdGguCisgICAgICAgIFN0cmluZyBiYXNlUGF0aCA9IFByb3BlcnRpZXNIZWxwZXIuZ2V0VmFsdWUocHJvcGVydGllcywgTXZjRmVhdHVyZS5URU1QTEFURV9CQVNFX1BBVEggKyBzdWZmaXgsIFN0cmluZy5jbGFzcywgbnVsbCk7CisgICAgICAgIGlmIChiYXNlUGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICBiYXNlUGF0aCA9IFByb3BlcnRpZXNIZWxwZXIuZ2V0VmFsdWUocHJvcGVydGllcywgTXZjRmVhdHVyZS5URU1QTEFURV9CQVNFX1BBVEgsICIiLCBudWxsKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLmJhc2VQYXRoID0gYmFzZVBhdGg7CisKKyAgICAgICAgLy8gQ2FjaGUuCisgICAgICAgIEJvb2xlYW4gY2FjaGVFbmFibGVkID0gUHJvcGVydGllc0hlbHBlci5nZXRWYWx1ZShwcm9wZXJ0aWVzLCBNdmNGZWF0dXJlLkNBQ0hFX1RFTVBMQVRFUyArIHN1ZmZpeCwgQm9vbGVhbi5jbGFzcywgbnVsbCk7CisgICAgICAgIGlmIChjYWNoZUVuYWJsZWQgPT0gbnVsbCkgeworICAgICAgICAgICAgY2FjaGVFbmFibGVkID0gUHJvcGVydGllc0hlbHBlci5nZXRWYWx1ZShwcm9wZXJ0aWVzLCBNdmNGZWF0dXJlLkNBQ0hFX1RFTVBMQVRFUywgZmFsc2UsIG51bGwpOworICAgICAgICB9CisgICAgICAgIHRoaXMuY2FjaGUgPSBjYWNoZUVuYWJsZWQgPyBEYXRhU3RydWN0dXJlcy48U3RyaW5nLCBUPmNyZWF0ZUNvbmN1cnJlbnRNYXAoKSA6IG51bGw7CisgICAgICAgIHRoaXMuZW5jb2RpbmcgPSBUZW1wbGF0ZUhlbHBlci5nZXRUZW1wbGF0ZU91dHB1dEVuY29kaW5nKGNvbmZpZywgc3VmZml4KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYmFzZSBwYXRoIGZvciBjdXJyZW50IHRlbXBsYXRlIHByb2Nlc3Nvci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYmFzZSBwYXRoIG9yIGFuIGVtcHR5IHN0cmluZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEJhc2VQYXRoKCkgeworICAgICAgICByZXR1cm4gYmFzZVBhdGg7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGN1cnJlbnQgc2VydmxldCBjb250ZXh0LCBpZiBwcmVzZW50LgorICAgICAqCisgICAgICogQHJldHVybiBzZXJ2bGV0IGNvbnRleHQgaW5zdGFuY2Ugb3Ige0Bjb2RlIG51bGx9LgorICAgICAqLworICAgIHByb3RlY3RlZCBTZXJ2bGV0Q29udGV4dCBnZXRTZXJ2bGV0Q29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIHNlcnZsZXRDb250ZXh0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUIHJlc29sdmUoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgLy8gTG9vayBpbnRvIHRoZSBjYWNoZSBpZiBlbmFibGVkLgorICAgICAgICBpZiAoY2FjaGUgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKCFjYWNoZS5jb250YWluc0tleShuYW1lKSkgeworICAgICAgICAgICAgICAgIGNhY2hlLnB1dElmQWJzZW50KG5hbWUsIHJlc29sdmUobmFtZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGNhY2hlLmdldChuYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXNvbHZlKG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc29sdmUgYSB0ZW1wbGF0ZSBuYW1lIHRvIGEgdGVtcGxhdGUgcmVmZXJlbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIHRlbXBsYXRlIG5hbWUuCisgICAgICogQHJldHVybiB0aGUgdGVtcGxhdGUgcmVmZXJlbmNlLCBvdGhlcndpc2Uge0Bjb2RlIG51bGx9IGlmIHRoZSB0ZW1wbGF0ZSBuYW1lIGNhbm5vdCBiZSByZXNvbHZlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFQgcmVzb2x2ZShmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyB0ZW1wbGF0ZSA6IGdldFRlbXBsYXRlUGF0aHMobmFtZSkpIHsKKyAgICAgICAgICAgIFJlYWRlciByZWFkZXIgPSBudWxsOworCisgICAgICAgICAgICAvLyBTZXJ2bGV0Q29udGV4dC4KKyAgICAgICAgICAgIGlmIChzZXJ2bGV0Q29udGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8iVGhlIHBhdGggbXVzdCBiZWdpbiB3aXRoIGEgIi8iIi4KKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGF0aCA9IHRlbXBsYXRlLnN0YXJ0c1dpdGgoIi8iKSA/IHRlbXBsYXRlIDogIi8iICsgdGVtcGxhdGU7CisgICAgICAgICAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gc3RyZWFtID0gc2VydmxldENvbnRleHQuZ2V0UmVzb3VyY2VBc1N0cmVhbShwYXRoKTsKKyAgICAgICAgICAgICAgICByZWFkZXIgPSBzdHJlYW0gIT0gbnVsbCA/IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihzdHJlYW0pIDogbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ2xhc3Nsb2FkZXIuCisgICAgICAgICAgICBpZiAocmVhZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0odGVtcGxhdGUpOworICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbSh0ZW1wbGF0ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlYWRlciA9IHN0cmVhbSAhPSBudWxsID8gbmV3IElucHV0U3RyZWFtUmVhZGVyKHN0cmVhbSkgOiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBGaWxlLXN5c3RlbSBwYXRoLgorICAgICAgICAgICAgaWYgKHJlYWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKG5ldyBGaWxlSW5wdXRTdHJlYW0odGVtcGxhdGUpLCBlbmNvZGluZyk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGZuZmUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTk9PUC4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChyZWFkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXNvbHZlKHRlbXBsYXRlLCByZWFkZXIpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuV0FSTklORywgTG9jYWxpemF0aW9uTWVzc2FnZXMuVEVNUExBVEVfUkVTT0xWRV9FUlJPUih0ZW1wbGF0ZSksIGUpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5XQVJOSU5HLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5URU1QTEFURV9FUlJPUl9DTE9TSU5HX1JFQURFUigpLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNvbHZlIGdpdmVuIHRlbXBsYXRlIHBhdGggYW5kL29yIHJlYWRlciB0byBhIHRlbXBsYXRlIHJlZmVyZW5jZSBvYmplY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGVtcGxhdGVQYXRoIHJlc29sdmVkIHRlbXBsYXRlIHBhdGggKGluY2wuIGJhc2UgcGF0aCBhbmQgc3VmZml4KS4KKyAgICAgKiBAcGFyYW0gcmVhZGVyIHJlYWRlciBjb250YWluaW5nIHRlbXBsYXRlIGNoYXJhY3RlciBzdHJlYW0uCisgICAgICogQHJldHVybiBub24te0Bjb2RlIG51bGx9IHRlbXBsYXRlIHJlZmVyZW5jZSBvYmplY3QuCisgICAgICogQHRocm93cyBFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIG9jY3VycmVkIGR1cmluZyByZXNvbHZpbmcuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IFQgcmVzb2x2ZShmaW5hbCBTdHJpbmcgdGVtcGxhdGVQYXRoLCBmaW5hbCBSZWFkZXIgcmVhZGVyKSB0aHJvd3MgRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGNvbGxlY3Rpb24gb2YgcG9zc2libGUgdGVtcGxhdGUgcGF0aHMgKGluY2x1ZGVkIGJhc2VQYXRoIGFuZCBzdWZmaXgpLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIHRlbXBsYXRlIG5hbWUuCisgICAgICogQHJldHVybiBjb2xsZWN0aW9uIG9mIHBvc3NpYmxlIHRlbXBsYXRlIHBhdGhzLgorICAgICAqLworICAgIHByaXZhdGUgQ29sbGVjdGlvbjxTdHJpbmc+IGdldFRlbXBsYXRlUGF0aHMoZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGxvd2VyTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHRlbXBsYXRlUGF0aCA9IGJhc2VQYXRoLmVuZHNXaXRoKCIvIikgPyBiYXNlUGF0aCArIG5hbWUuc3Vic3RyaW5nKDEpIDogYmFzZVBhdGggKyBuYW1lOworCisgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIG5hbWUgZW5kcyB3aXRoIHN1cHBvcnRlZCBzdWZmaXguCisgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIGV4dGVuc2lvbiA6IHN1cHBvcnRlZEV4dGVuc2lvbnMpIHsKKyAgICAgICAgICAgIGlmIChsb3dlck5hbWUuZW5kc1dpdGgoZXh0ZW5zaW9uKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b24odGVtcGxhdGVQYXRoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzdXBwb3J0ZWRFeHRlbnNpb25zLnN0cmVhbSgpLm1hcChpbnB1dCAtPiB0ZW1wbGF0ZVBhdGggKyBpbnB1dCkuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHJpZXZlIGEgdGVtcGxhdGUgb2JqZWN0IGZhY3RvcnkuIFRoZSBmYWN0b3J5IGlzLCBhdCBmaXJzdCwgbG9va2VkIGZvciBpbgorICAgICAqIHtAbGluayBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbn0gYW5kIGlmIG5vdCBmb3VuZCwgZ2l2ZW4gZGVmYXVsdCB2YWx1ZSBpcyB1c2VkLgorICAgICAqCisgICAgICogQHBhcmFtIGNyZWF0ZUluc3RhbmNlIGZ1bmN0aW9uIHRoYXQgZGVsZWdhdGVzIGEgY3JlYXRpb24gYW5kIGFuIGluaXRpYWxpemF0aW9uIHRvIGluamVjdGlvbiBtYW5hZ2VyLgorICAgICAqIEBwYXJhbSB0eXBlICAgICAgICAgICB0eXBlIG9mIHJlcXVlc3RlZCB0ZW1wbGF0ZSBvYmplY3QgZmFjdG9yeS4KKyAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlICAgZGVmYXVsdCB2YWx1ZSB0byBiZSB1c2VkIGlmIG5vIGZhY3RvcnkgcmVmZXJlbmNlIGlzIHByZXNlbnQgaW4gY29uZmlndXJhdGlvbi4KKyAgICAgKiBAcGFyYW0gPEY+IHR5cGUgb2YgcmVxdWVzdGVkIHRlbXBsYXRlIG9iamVjdCBmYWN0b3J5LgorICAgICAqIEByZXR1cm4gbm9uLXtAY29kZSBudWxsfSB0ZW1wbGF0ZSBvYmplY3QgZmFjdG9yeS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgPEY+IEYgZ2V0VGVtcGxhdGVPYmplY3RGYWN0b3J5KEZ1bmN0aW9uPENsYXNzPD8+LCA/PiBjcmVhdGVJbnN0YW5jZSwgQ2xhc3M8Rj4gdHlwZSwgVmFsdWU8Rj4gZGVmYXVsdFZhbHVlKSB7CisgICAgICAgIGZpbmFsIE9iamVjdCBvYmplY3RGYWN0b3J5UHJvcGVydHkgPSBjb25maWcuZ2V0UHJvcGVydHkoTXZjRmVhdHVyZS5URU1QTEFURV9PQkpFQ1RfRkFDVE9SWSArIHN1ZmZpeCk7CisKKyAgICAgICAgaWYgKG9iamVjdEZhY3RvcnlQcm9wZXJ0eSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAodHlwZS5pc0Fzc2lnbmFibGVGcm9tKG9iamVjdEZhY3RvcnlQcm9wZXJ0eS5nZXRDbGFzcygpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0eXBlLmNhc3Qob2JqZWN0RmFjdG9yeVByb3BlcnR5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gZmFjdG9yeUNsYXNzID0gbnVsbDsKKworICAgICAgICAgICAgICAgIGlmIChvYmplY3RGYWN0b3J5UHJvcGVydHkgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgZmFjdG9yeUNsYXNzID0gUmVmbGVjdGlvbkhlbHBlci5jbGFzc0Zvck5hbWVQQSgoU3RyaW5nKSBvYmplY3RGYWN0b3J5UHJvcGVydHkpLnJ1bigpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAob2JqZWN0RmFjdG9yeVByb3BlcnR5IGluc3RhbmNlb2YgQ2xhc3M8Pz4pIHsKKyAgICAgICAgICAgICAgICAgICAgZmFjdG9yeUNsYXNzID0gKENsYXNzPD8+KSBvYmplY3RGYWN0b3J5UHJvcGVydHk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGZhY3RvcnlDbGFzcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlLmlzQXNzaWduYWJsZUZyb20oZmFjdG9yeUNsYXNzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGUuY2FzdChjcmVhdGVJbnN0YW5jZS5hcHBseShmYWN0b3J5Q2xhc3MpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuQ09ORklHLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5XUk9OR19URU1QTEFURV9PQkpFQ1RfRkFDVE9SWShmYWN0b3J5Q2xhc3MsIHR5cGUpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBkZWZhdWx0VmFsdWUuZ2V0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSB7QGxpbmsgSHR0cEhlYWRlcnMjQ09OVEVOVF9UWVBFfSBoZWFkZXIgdG8gdGhlIHtAY29kZSBodHRwSGVhZGVyc30gYmFzZWQgb24ge0Bjb2RlIG1lZGlhVHlwZX0gYW5kCisgICAgICoge0BsaW5rICNnZXRFbmNvZGluZygpIGRlZmF1bHQgZW5jb2Rpbmd9IGRlZmluZWQgaW4gdGhpcyBwcm9jZXNzb3IuIElmIHtAY29kZSBtZWRpYVR5cGV9IGRlZmluZXMgZW5jb2RpbmcKKyAgICAgKiB0aGVuIHRoaXMgZW5jb2Rpbmcgd2lsbCBiZSB1c2VkIG90aGVyd2lzZSB0aGUgZGVmYXVsdCBwcm9jZXNzb3IgZW5jb2RpbmcgaXMgdXNlZC4gVGhlIGNob3NlbiBlbmNvZGluZworICAgICAqIGlzIHJldHVybmVkIGZyb20gdGhlIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZWRpYVR5cGUgTWVkaWEgdHlwZSBvZiB0aGUgZW50aXR5LgorICAgICAqIEBwYXJhbSBodHRwSGVhZGVycyBIdHRwIGhlYWRlcnMuCisgICAgICogQHJldHVybiBTZWxlY3RlZCBlbmNvZGluZy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ2hhcnNldCBzZXRDb250ZW50VHlwZShmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLCBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMpIHsKKyAgICAgICAgZmluYWwgQ2hhcnNldCBlbmNvZGluZzsKKworICAgICAgICBmaW5hbCBTdHJpbmcgY2hhcnNldCA9IG1lZGlhVHlwZS5nZXRQYXJhbWV0ZXJzKCkuZ2V0KE1lZGlhVHlwZS5DSEFSU0VUX1BBUkFNRVRFUik7CisgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBmaW5hbE1lZGlhVHlwZTsKKyAgICAgICAgaWYgKGNoYXJzZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgZW5jb2RpbmcgPSBnZXRFbmNvZGluZygpOworICAgICAgICAgICAgZmluYWwgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zID0gbmV3IEhhc2hNYXA8PihtZWRpYVR5cGUuZ2V0UGFyYW1ldGVycygpKTsKKyAgICAgICAgICAgIHBhcmFtcy5wdXQoTWVkaWFUeXBlLkNIQVJTRVRfUEFSQU1FVEVSLCBlbmNvZGluZy5uYW1lKCkpOworICAgICAgICAgICAgZmluYWxNZWRpYVR5cGUgPSBuZXcgTWVkaWFUeXBlKG1lZGlhVHlwZS5nZXRUeXBlKCksIG1lZGlhVHlwZS5nZXRTdWJ0eXBlKCksIHBhcmFtcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBlbmNvZGluZyA9IENoYXJzZXQuZm9yTmFtZShjaGFyc2V0KTsKKyAgICAgICAgICAgIGZpbmFsTWVkaWFUeXBlID0gbWVkaWFUeXBlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIEFycmF5TGlzdDxPYmplY3Q+IHR5cGVMaXN0ID0gbmV3IEFycmF5TGlzdDw+KDEpOworICAgICAgICB0eXBlTGlzdC5hZGQoZmluYWxNZWRpYVR5cGUudG9TdHJpbmcoKSk7CisgICAgICAgIGh0dHBIZWFkZXJzLnB1dChIdHRwSGVhZGVycy5DT05URU5UX1RZUEUsIHR5cGVMaXN0KTsKKyAgICAgICAgcmV0dXJuIGVuY29kaW5nOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgb3V0cHV0IGVuY29kaW5nLgorICAgICAqCisgICAgICogQHJldHVybiBOb3Qte0Bjb2RlIG51bGx9IGVuY29kaW5nLgorICAgICAqLworICAgIHByb3RlY3RlZCBDaGFyc2V0IGdldEVuY29kaW5nKCkgeworICAgICAgICByZXR1cm4gZW5jb2Rpbmc7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L212Yy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvc3BpL1Jlc29sdmVkVmlld2FibGUuamF2YSBiL2V4dC9tdmMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbXZjL3NwaS9SZXNvbHZlZFZpZXdhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY5YjgyMgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9tdmMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbXZjL3NwaS9SZXNvbHZlZFZpZXdhYmxlLmphdmEKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5zcGk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuVmlld2FibGU7CisKKy8qKgorICogQSByZXNvbHZlZCB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5WaWV3YWJsZSB2aWV3YWJsZX0uCisgKiA8cC8+CisgKiBBIHJlc29sdmVkIHZpZXdhYmxlIGlzIG9idGFpbmVkIGZyb20gdGhlIHJlc29sdmluZyBtZXRob2RzIG9uIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLnNwaS5WaWV3YWJsZUNvbnRleHR9CisgKiBhbmQgaGFzIGFzc29jaWF0ZWQgd2l0aCBpdCBhIHtAbGluayBUZW1wbGF0ZVByb2Nlc3Nvcn0gdGhhdCBpcyBjYXBhYmxlIG9mIHByb2Nlc3NpbmcgYSB0ZW1wbGF0ZSBpZGVudGlmaWVkIGJ5IGEgdGVtcGxhdGUKKyAqIHJlZmVyZW5jZS4KKyAqCisgKiBAcGFyYW0gPFQ+IHRoZSB0eXBlIG9mIHRoZSByZXNvbHZlZCB0ZW1wbGF0ZSBvYmplY3QuCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFJlc29sdmVkVmlld2FibGU8VD4gZXh0ZW5kcyBWaWV3YWJsZSB7CisKKyAgICBwcml2YXRlIGZpbmFsIFRlbXBsYXRlUHJvY2Vzc29yPFQ+IHZpZXdQcm9jZXNzb3I7CisKKyAgICBwcml2YXRlIGZpbmFsIFQgdGVtcGxhdGVSZWZlcmVuY2U7CisKKyAgICBwcml2YXRlIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGU7CisKKyAgICBwcml2YXRlIGZpbmFsIENsYXNzPD8+IHJlc29sdmluZ0NsYXNzOworCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSByZXNvbHZlZCB2aWV3YWJsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2aWV3UHJvY2Vzc29yIHRoZSB2aWV3IHByb2Nlc3NvciB0aGF0IHJlc29sdmVkIGEgdGVtcGxhdGUgbmFtZSB0byBhIHRlbXBsYXRlIHJlZmVyZW5jZS4KKyAgICAgKiBAcGFyYW0gdGVtcGxhdGVSZWZlcmVuY2UgdGhlIHRlbXBsYXRlIHJlZmVyZW5jZS4KKyAgICAgKiBAcGFyYW0gdmlld2FibGUgdGhlIHZpZXdhYmxlIHRoYXQgaXMgcmVzb2x2ZWQuCisgICAgICogQHBhcmFtIG1lZGlhVHlwZSBtZWRpYSB0eXBlIHRoZSB7QGNvZGUgdGVtcGxhdGVSZWZlcmVuY2V9IHNob3VsZCBiZSB0cmFuc2Zvcm1lZCBpbnRvLgorICAgICAqLworICAgIHB1YmxpYyBSZXNvbHZlZFZpZXdhYmxlKFRlbXBsYXRlUHJvY2Vzc29yPFQ+IHZpZXdQcm9jZXNzb3IsIFQgdGVtcGxhdGVSZWZlcmVuY2UsIFZpZXdhYmxlIHZpZXdhYmxlLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHRoaXModmlld1Byb2Nlc3NvciwgdGVtcGxhdGVSZWZlcmVuY2UsIHZpZXdhYmxlLCBudWxsLCBtZWRpYVR5cGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIHJlc29sdmVkIHZpZXdhYmxlLgorICAgICAqCisgICAgICogQHBhcmFtIHZpZXdQcm9jZXNzb3IgdGhlIHZpZXcgcHJvY2Vzc29yIHRoYXQgcmVzb2x2ZWQgYSB0ZW1wbGF0ZSBuYW1lIHRvIGEgdGVtcGxhdGUgcmVmZXJlbmNlLgorICAgICAqIEBwYXJhbSB0ZW1wbGF0ZVJlZmVyZW5jZSB0aGUgdGVtcGxhdGUgcmVmZXJlbmNlLgorICAgICAqIEBwYXJhbSB2aWV3YWJsZSB0aGUgdmlld2FibGUgdGhhdCBpcyByZXNvbHZlZC4KKyAgICAgKiBAcGFyYW0gcmVzb2x2aW5nQ2xhc3MgdGhlIHJlc29sdmluZyBjbGFzcyB0aGF0IHdhcyB1c2VkIHRvIHJlc29sdmUgYSByZWxhdGl2ZSB0ZW1wbGF0ZSBuYW1lIGludG8gYW4gYWJzb2x1dGUgdGVtcGxhdGUgbmFtZS4KKyAgICAgKiBAcGFyYW0gbWVkaWFUeXBlIG1lZGlhIHR5cGUgdGhlIHtAY29kZSB0ZW1wbGF0ZVJlZmVyZW5jZX0gc2hvdWxkIGJlIHRyYW5zZm9ybWVkIGludG8uCisgICAgICovCisgICAgcHVibGljIFJlc29sdmVkVmlld2FibGUoVGVtcGxhdGVQcm9jZXNzb3I8VD4gdmlld1Byb2Nlc3NvciwgVCB0ZW1wbGF0ZVJlZmVyZW5jZSwgVmlld2FibGUgdmlld2FibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gcmVzb2x2aW5nQ2xhc3MsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgc3VwZXIodmlld2FibGUuZ2V0VGVtcGxhdGVOYW1lKCksIHZpZXdhYmxlLmdldE1vZGVsKCkpOworCisgICAgICAgIHRoaXMudmlld1Byb2Nlc3NvciA9IHZpZXdQcm9jZXNzb3I7CisgICAgICAgIHRoaXMudGVtcGxhdGVSZWZlcmVuY2UgPSB0ZW1wbGF0ZVJlZmVyZW5jZTsKKyAgICAgICAgdGhpcy5tZWRpYVR5cGUgPSBtZWRpYVR5cGU7CisgICAgICAgIHRoaXMucmVzb2x2aW5nQ2xhc3MgPSByZXNvbHZpbmdDbGFzczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSB0aGUgcmVzb2x2ZWQgdmlld2FibGUuCisgICAgICogPHAvPgorICAgICAqIFRoaXMgbWV0aG9kIGRlZmVycyB0bworICAgICAqIHtAbGluayBUZW1wbGF0ZVByb2Nlc3NvciN3cml0ZVRvKE9iamVjdCwgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5WaWV3YWJsZSwgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGUsCisgICAgICogamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcCwgamF2YS5pby5PdXRwdXRTdHJlYW0pfQorICAgICAqIHRvIHdyaXRlIHRoZSB2aWV3YWJsZSB1dGlsaXppbmcgdGhlIHRlbXBsYXRlIHJlZmVyZW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvdXQgdGhlIG91dHB1dCBzdHJlYW0gdGhhdCB0aGUgdmlldyBwcm9jZXNzb3Igd3JpdGVzIHRvLgorICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgcHJvY2Vzc2luZyB0aGUgdGVtcGxhdGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGVUbyhPdXRwdXRTdHJlYW0gb3V0LCBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHZpZXdQcm9jZXNzb3Iud3JpdGVUbyh0ZW1wbGF0ZVJlZmVyZW5jZSwgdGhpcywgbWVkaWFUeXBlLCBodHRwSGVhZGVycywgb3V0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG1lZGlhIHR5cGUgZm9yIHdoaWNoIHRoZSB7QGxpbmsgVGVtcGxhdGVQcm9jZXNzb3IgdmlldyBwcm9jZXNzb3J9IHJlc29sdmVkIHRoZSB0ZW1wbGF0ZSByZWZlcmVuY2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGZpbmFsIHtAbGluayBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZSBtZWRpYSB0eXBlfSBvZiB0aGUgcmVzb2x2ZWQgdmlld2FibGUuCisgICAgICovCisgICAgcHVibGljIE1lZGlhVHlwZSBnZXRNZWRpYVR5cGUoKSB7CisgICAgICAgIHJldHVybiBtZWRpYVR5cGU7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBHZXQgcmVzb2x2aW5nIGNsYXNzLgorICAgICAqCisgICAgICogQHJldHVybiBSZXNvbHZpbmcgY2xhc3MuCisgICAgICovCisgICAgcHVibGljIENsYXNzPD8+IGdldFJlc29sdmluZ0NsYXNzKCkgeworICAgICAgICByZXR1cm4gcmVzb2x2aW5nQ2xhc3M7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L212Yy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvc3BpL1RlbXBsYXRlUHJvY2Vzc29yLmphdmEgYi9leHQvbXZjL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL212Yy9zcGkvVGVtcGxhdGVQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDMxNzkyCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L212Yy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvc3BpL1RlbXBsYXRlUHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLnNwaTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdHJhaW5lZFRvOworaW1wb3J0IGphdmF4LndzLnJzLlJ1bnRpbWVUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLlZpZXdhYmxlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5Db250cmFjdDsKKworLyoqCisgKiBBIHZpZXcgcHJvY2Vzc29yLgorICogPHAvPgorICogSW1wbGVtZW50YXRpb25zIG9mIHRoaXMgaW50ZXJmYWNlIHNoYWxsIGJlIGNhcGFibGUgb2YgcmVzb2x2aW5nIGEKKyAqIHRlbXBsYXRlIG5hbWUgKCsgbWVkaWEgdHlwZSkgdG8gYSB0ZW1wbGF0ZSByZWZlcmVuY2UgdGhhdCBpZGVudGlmaWVzIGEgdGVtcGxhdGUgc3VwcG9ydGVkCisgKiBieSB0aGUgaW1wbGVtZW50YXRpb24uIEFuZCwgcHJvY2Vzc2luZyB0aGUgdGVtcGxhdGUsIGlkZW50aWZpZWQgYnkgdGVtcGxhdGUKKyAqIHJlZmVyZW5jZSBhbmQgbWVkaWEgdHlwZSwgdGhlIHJlc3VsdHMgb2Ygd2hpY2ggYXJlIHdyaXR0ZW4gdG8gYW4gb3V0cHV0IHN0cmVhbS4KKyAqIDxwLz4KKyAqIEltcGxlbWVudGF0aW9ucyBjYW4gcmVnaXN0ZXIgYSB2aWV3IHByb2Nlc3NvciBhcyBhIHByb3ZpZGVyLCBmb3IKKyAqIGV4YW1wbGUsIGFubm90YXRpbmcgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzIHdpdGgge0BsaW5rIGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcn0KKyAqIG9yIHJlZ2lzdGVyaW5nIGFuIGltcGxlbWVudGluZyBjbGFzcyBvciBpbnN0YW5jZSBhcyBhIHNpbmdsZXRvbiB3aXRoCisgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnfSBvciB7QGxpbmsgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbn0uCisgKiA8cC8+CisgKiBTdWNoIHZpZXcgcHJvY2Vzc29ycyBjb3VsZCBiZSBKU1AgdmlldyBwcm9jZXNzb3JzIChzdXBwb3J0ZWQgYnkgdGhlCisgKiBKZXJzZXkgc2VydmxldCBhbmQgZmlsdGVyIGltcGxlbWVudGF0aW9ucykgb3Igc2F5IEZyZWVtYXJrZXIgb3IgVmVsb2NpdHkKKyAqIHZpZXcgcHJvY2Vzc29ycyAobm90IGltcGxlbWVudGVkKS4KKyAqCisgKiBAcGFyYW0gPFQ+IHRoZSB0eXBlIG9mIHRoZSB0ZW1wbGF0ZSBvYmplY3QuCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQENvbnRyYWN0CitAQ29uc3RyYWluZWRUbyhSdW50aW1lVHlwZS5TRVJWRVIpCitwdWJsaWMgaW50ZXJmYWNlIFRlbXBsYXRlUHJvY2Vzc29yPFQ+IHsKKworICAgIC8qKgorICAgICAqIFJlc29sdmUgYSB0ZW1wbGF0ZSBuYW1lIHRvIGEgdGVtcGxhdGUgcmVmZXJlbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIHRlbXBsYXRlIG5hbWUuCisgICAgICogQHBhcmFtIG1lZGlhVHlwZSByZXF1ZXN0ZWQgbWVkaWEgdHlwZSBvZiB0aGUgdGVtcGxhdGUuCisgICAgICogQHJldHVybiB0aGUgdGVtcGxhdGUgcmVmZXJlbmNlLCBvdGhlcndpc2Uge0Bjb2RlIG51bGx9IGlmIHRoZSB0ZW1wbGF0ZSBuYW1lIGNhbm5vdCBiZSByZXNvbHZlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVCByZXNvbHZlKFN0cmluZyBuYW1lLCBNZWRpYVR5cGUgbWVkaWFUeXBlKTsKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgYSB0ZW1wbGF0ZSBhbmQgd3JpdGUgdGhlIHJlc3VsdCB0byBhbiBvdXRwdXQgc3RyZWFtLgorICAgICAqCisgICAgICogQHBhcmFtIHRlbXBsYXRlUmVmZXJlbmNlIHRoZSB0ZW1wbGF0ZSByZWZlcmVuY2UuIFRoaXMgaXMgb2J0YWluZWQgYnkgY2FsbGluZyB0aGUge0BsaW5rICNyZXNvbHZlKFN0cmluZywKKyAgICAgKiBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZSl9IG1ldGhvZCB3aXRoIGEgdGVtcGxhdGUgbmFtZSBhbmQgbWVkaWEgdHlwZS4KKyAgICAgKiBAcGFyYW0gdmlld2FibGUgdGhlIHZpZXdhYmxlIHRoYXQgY29udGFpbnMgdGhlIG1vZGVsIHRvIGJlIHBhc3NlZCB0byB0aGUgdGVtcGxhdGUuCisgICAgICogQHBhcmFtIG1lZGlhVHlwZSBtZWRpYSB0eXBlIHRoZSB7QGNvZGUgdGVtcGxhdGVSZWZlcmVuY2V9IHNob3VsZCBiZSB0cmFuc2Zvcm1lZCBpbnRvLgorICAgICAqIEBwYXJhbSBodHRwSGVhZGVycyBodHRwIGhlYWRlcnMgdGhhdCB3aWxsIGJlIHNlbmQgaW4gdGhlIHJlc3BvbnNlLiBIZWFkZXJzIGNhbiBiZSBtb2RpZmllZCB0bworICAgICAqICAgICAgICAgICAgICAgICAgICBpbmZsdWVuY2UgcmVzcG9uc2UgaGVhZGVycyBiZWZvcmUgdGhlIHRoZSBmaXJzdCBieXRlIGlzIHdyaXR0ZW4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgdG8gdGhlIHtAY29kZSBvdXR9LiBBZnRlciB0aGUgcmVzcG9uc2UgYnVmZmVyIGlzIGNvbW1pdHRlZCB0aGUgaGVhZGVycyBtb2RpZmljYXRpb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgaGFzIG5vIGVmZmVjdC4gVGVtcGxhdGUgcHJvY2Vzc29yIGNhbiBmb3IgZXhhbXBsZSBzZXQgdGhlIGNvbnRlbnQgdHlwZSBvZgorICAgICAqICAgICAgICAgICAgICAgICAgICB0aGUgcmVzcG9uc2UuCisgICAgICogQHBhcmFtIG91dCB0aGUgb3V0cHV0IHN0cmVhbSB0byB3cml0ZSB0aGUgcmVzdWx0IG9mIHByb2Nlc3NpbmcgdGhlIHRlbXBsYXRlLgorICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiBpZiB0aGVyZSB3YXMgYW4gZXJyb3IgcHJvY2Vzc2luZyB0aGUgdGVtcGxhdGUuCisgICAgICoKKyAgICAgKiBAc2luY2UgMi43CisgICAgICovCisgICAgcHVibGljIHZvaWQgd3JpdGVUbyhUIHRlbXBsYXRlUmVmZXJlbmNlLCBWaWV3YWJsZSB2aWV3YWJsZSwgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywgT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uOworCit9CmRpZmYgLS1naXQgYS9leHQvbXZjL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL212Yy9zcGkvVmlld2FibGVDb250ZXh0LmphdmEgYi9leHQvbXZjL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL212Yy9zcGkvVmlld2FibGVDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZmYzJmYgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9tdmMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbXZjL3NwaS9WaWV3YWJsZUNvbnRleHQuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuc3BpOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3RyYWluZWRUbzsKK2ltcG9ydCBqYXZheC53cy5ycy5SdW50aW1lVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuVmlld2FibGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLkNvbnRyYWN0OworCisvKioKKyAqIFRoZSBjb250ZXh0IGZvciByZXNvbHZpbmcgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuVmlld2FibGV9IHRvIGFuIGluc3RhbmNlIG9mIHtAbGluaworICogUmVzb2x2ZWRWaWV3YWJsZX0uCisgKiA8cC8+CisgKiBOb3RlOgorICoge0BsaW5rIFZpZXdhYmxlQ29udGV4dCNyZXNvbHZlVmlld2FibGUob3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5WaWV3YWJsZSwgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGUsIENsYXNzLCBUZW1wbGF0ZVByb2Nlc3Nvcil9CisgKiBtZXRob2QgbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyAoY29tYmluYXRpb24gb2YgYWxsIHRoZSBjYWxjdWxhdGVkIHBvc3NpYmxlIG1lZGlhIHR5cGVzIG9mIHRoZSByZXNwb25zZSB3aXRoIGFsbCBmb3VuZAorICoge0BsaW5rIFRlbXBsYXRlUHJvY2Vzc29yIHRlbXBsYXRlIHByb2Nlc3NvcnN9KS4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQENvbnRyYWN0CitAQ29uc3RyYWluZWRUbyhSdW50aW1lVHlwZS5TRVJWRVIpCitwdWJsaWMgaW50ZXJmYWNlIFZpZXdhYmxlQ29udGV4dCB7CisKKyAgICAvKioKKyAgICAgKiBSZXNvbHZlIGdpdmVuIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLlZpZXdhYmxlIHZpZXdhYmxlfSB1c2luZyB7QGxpbmsgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGUgbWVkaWFUeXBlfSwKKyAgICAgKiB7QGNvZGUgcmVzb3VyY2VDbGFzc30gYW5kIHtAbGluayBUZW1wbGF0ZVByb2Nlc3NvciB0ZW1wbGF0ZVByb2Nlc3Nvcn0uCisgICAgICogPHAvPgorICAgICAqIElmIHRoZSB0ZW1wbGF0ZSBuYW1lIG9mIHRoZSB2aWV3YWJsZSBpcyBub3QgYWJzb2x1dGUgdGhlbiB0aGUgZ2l2ZW4ge0Bjb2RlIHJlc291cmNlQ2xhc3N9IG1heSBiZSB1dGlsaXplZCB0byByZXNvbHZlCisgICAgICogdGhlIHJlbGF0aXZlIHRlbXBsYXRlIG5hbWUgaW50byBhbiBhYnNvbHV0ZSB0ZW1wbGF0ZSBuYW1lLgorICAgICAqIDxici8+CisgICAgICogPHVsPgorICAgICAqIHtAY29kZSByZXNvdXJjZUNsYXNzfSBjb250YWlucyBjbGFzcyBvZiB0aGUgbWF0Y2hlZCByZXNvdXJjZS4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogQHBhcmFtIHZpZXdhYmxlIHZpZXdhYmxlIHRvIGJlIHJlc29sdmVkLgorICAgICAqIEBwYXJhbSBtZWRpYVR5cGUgbWVkaWEgdHlwZSB0aGUgdmlld2FibGUgbWF5IGJlIHRyYW5zZm9ybWVkIGludG8uCisgICAgICogQHBhcmFtIHJlc291cmNlQ2xhc3MgcmVzb3VyY2UgY2xhc3MuCisgICAgICogQHBhcmFtIHRlbXBsYXRlUHJvY2Vzc29yIHRlbXBsYXRlIHByb2Nlc3NvciB0byBiZSB1c2VkLgorICAgICAqIEByZXR1cm4gcmVzb2x2ZWQgdmlld2FibGUgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSB2aWV3YWJsZSBjYW5ub3QgYmUgcmVzb2x2ZWQuCisgICAgICovCisgICAgcHVibGljIFJlc29sdmVkVmlld2FibGUgcmVzb2x2ZVZpZXdhYmxlKGZpbmFsIFZpZXdhYmxlIHZpZXdhYmxlLCBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLCBmaW5hbCBDbGFzczw/PiByZXNvdXJjZUNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUZW1wbGF0ZVByb2Nlc3NvciB0ZW1wbGF0ZVByb2Nlc3Nvcik7Cit9CmRpZmYgLS1naXQgYS9leHQvbXZjL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL212Yy9zcGkvVmlld2FibGVDb250ZXh0RXhjZXB0aW9uLmphdmEgYi9leHQvbXZjL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL212Yy9zcGkvVmlld2FibGVDb250ZXh0RXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y4YzA5MwotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9tdmMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvbXZjL3NwaS9WaWV3YWJsZUNvbnRleHRFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuc3BpOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lckV4Y2VwdGlvbjsKKworLyoqCisgKiBBIHJ1bnRpbWUgZXhjZXB0aW9uIGFzc29jaWF0ZWQgd2l0aCBlcnJvcnMgd2hlbiByZXNvbHZpbmcgYSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5WaWV3YWJsZX0gdG8gYSB7QGxpbmsKKyAqIFJlc29sdmVkVmlld2FibGV9IGJ5IG1ldGhvZHMgb24ge0BsaW5rIFZpZXdhYmxlQ29udGV4dH0uCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitAU3VwcHJlc3NXYXJuaW5ncygiVW51c2VkRGVjbGFyYXRpb24iKQorcHVibGljIGNsYXNzIFZpZXdhYmxlQ29udGV4dEV4Y2VwdGlvbiBleHRlbmRzIENvbnRhaW5lckV4Y2VwdGlvbiB7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugd2l0aCB0aGUgc3VwcGxpZWQgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlLgorICAgICAqLworICAgIHB1YmxpYyBWaWV3YWJsZUNvbnRleHRFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgc3VwZXIobWVzc2FnZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIHdpdGggdGhlIHN1cHBsaWVkIG1lc3NhZ2UgYW5kIGNhdXNlLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UuCisgICAgICogQHBhcmFtIGNhdXNlIHRoZSBUaHJvd2FibGUgdGhhdCBjYXVzZWQgdGhlIGV4Y2VwdGlvbiB0byBiZSB0aHJvd24uCisgICAgICovCisgICAgcHVibGljIFZpZXdhYmxlQ29udGV4dEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugd2l0aCB0aGUgc3VwcGxpZWQgY2F1c2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2F1c2UgdGhlIFRocm93YWJsZSB0aGF0IGNhdXNlZCB0aGUgZXhjZXB0aW9uIHRvIGJlIHRocm93bi4KKyAgICAgKi8KKyAgICBwdWJsaWMgVmlld2FibGVDb250ZXh0RXhjZXB0aW9uKFRocm93YWJsZSBjYXVzZSkgeworICAgICAgICBzdXBlcihjYXVzZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L212Yy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvc3BpL3BhY2thZ2UtaW5mby5qYXZhIGIvZXh0L212Yy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvc3BpL3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMWQzYTcKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvbXZjL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL212Yy9zcGkvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoqCisgKiBQcm92aWRlcyBzdXBwb3J0IGZvciB2aWV3IGFzcGVjdCBvZiBtb2RlbCB2aWV3IGNvbnRyb2xsZXIgYW5kIHRlbXBsYXRlcyB0aGF0CisgKiBwcm9kdWNlIHZpZXdzLgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuc3BpOwpkaWZmIC0tZ2l0IGEvZXh0L212Yy9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL212Yy9pbnRlcm5hbC9sb2NhbGl6YXRpb24ucHJvcGVydGllcyBiL2V4dC9tdmMvc3JjL21haW4vcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvaW50ZXJuYWwvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIwZWFhMgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9tdmMvc3JjL21haW4vcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvaW50ZXJuYWwvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyOCBAQAorIworIyBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisjIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyMKKyMgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorIyBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisjIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorIyB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisjCisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorIworCit0ZW1wbGF0ZS5oYW5kbGVyLmFscmVhZHkuZW5oYW5jZWQ9SGFuZGxlciBjbGFzcyAiezB9IiBoYXMgYmVlbiBhbHJlYWR5IGVuaGFuY2VkLiBTa2lwcGluZyBlbmhhbmNpbmcgaGFuZGxlciBpbnN0YW5jZS4KK3RlbXBsYXRlLm1vZGVsLm9mLnZpZXcuY2Fubm90LmJlLm51bGw9VGhlIG1vZGVsIG9mIHRoZSB2aWV3IE1VU1Qgbm90IGJlIG51bGwuCit0ZW1wbGF0ZS5uYW1lLmNvdWxkLm5vdC5iZS5yZXNvbHZlZD1UaGUgdGVtcGxhdGUgbmFtZSAiezB9IiBjb3VsZCBub3QgYmUgcmVzb2x2ZWQgdG8gYSBmdWxseSBxdWFsaWZpZWQgdGVtcGxhdGUgbmFtZS4KK3RlbXBsYXRlLm5hbWUubXVzdC5ub3QuYmUubnVsbD1UaGUgdGVtcGxhdGUgbmFtZSBNVVNUIG5vdCBiZSBudWxsLgorIyB7MH0gLSBsaXN0IG9mIHRlbXBsYXRlIG5hbWVzLCBlLmcuIFsic3ViIiwgImluZGV4Il0sIHsxfSAtIGxpc3Qgb2YgcGF0aHMsIGUuZy4gWyIvdmlld3MiLCAiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9tdmMvVGVtcGxhdGVSZXNvdXJjZSJdLCB7Mn0gLSBsaXN0IG9mIG1lZGlhIHR5cGVzLCBlLmcuIFsidGV4dC9wbGFpbiJdCit0ZW1wbGF0ZS5uYW1lcy5jb3VsZC5ub3QuYmUucmVzb2x2ZWQ9TmVpdGhlciBvZiB0aGUgdGVtcGxhdGUgbmFtZXMgKHswfSkgY291bGQgYmUgcmVzb2x2ZWQgdG8gYSBmdWxseSBxdWFsaWZpZWQgdGVtcGxhdGUgbmFtZS4gKHBhdGhzOiB7MX0sIG1lZGlhLXR5cGVzOiB7Mn0pCit0ZW1wbGF0ZS5uby5tYXRjaGluZy5yZXNvdXJjZS5hdmFpbGFibGU9VGhlcmUgaXMgbm8gbGFzdCBtYXRjaGluZyByZXNvdXJjZSBhdmFpbGFibGUuCit0ZW1wbGF0ZS5yZXNvbHZlLmVycm9yPUFuIGV4Y2VwdGlvbiBvY2N1cnJlZCBkdXJpbmcgcmVzb2x2aW5nIHRoZSB7MH0gdGVtcGxhdGUuCit0ZW1wbGF0ZS5yZXNvbHZpbmcuY2xhc3MuY2Fubm90LmJlLm51bGw9UmVzb2x2aW5nIGNsYXNzIE1VU1Qgbm90IGJlIG51bGwuCit0ZW1wbGF0ZS5lcnJvci5jbG9zaW5nLnJlYWRlcj1GaWxlIHJlYWRlciB3YXMgbm90IGNsb3NlZCBwcm9wZXJseS4KK3dyb25nLnRlbXBsYXRlLm9iamVjdC5mYWN0b3J5PVByb3ZpZGVkIHRlbXBsYXRlIG9iamVjdCBmYWN0b3J5IGNsYXNzLCB7MH0sIGlzIG5vdCBhc3NpZ25hYmxlIGZyb20gcmVxdWlyZWQgdHlwZSB7MX0uCisKZGlmZiAtLWdpdCBhL2V4dC9wb20ueG1sIGIvZXh0L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU1NmFiZgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9wb20ueG1sCkBAIC0wLDAgKzEsNzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktZXh0ZW5zaW9uczwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgSmVyc2V5IGV4dGVuc2lvbiBtb2R1bGVzIHByb3ZpZGluZyB1dGlsaXRpZXMsIGZpbHRlcnMgYXMgd2VsbCBhcyBpbnRlZ3JhdGlvbnMKKyAgICAgICAgd2l0aCBleHRlcm5hbCBmcmFtZXdvcmtzIChHdWljZSwgU3ByaW5nLCBGcmVlbWFya2VyLCBldGMuKSBhbmQgbGFuZ3VhZ2VzCisgICAgICAgIChTY2FsYSwgR3Jvb3Z5LCBldGMuKS4KKworICAgICAgICBOT1RFOiBKZXJzZXkgc2VjdXJpdHkgZXh0ZW5zaW9ucyBoYXZlIHRoZWlyIG93biBkZWRpY2F0ZWQgc2VjdXJpdHkgdW1icmVsbGEKKyAgICAgICAgcHJvamVjdC4KKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPG1vZHVsZXM+CisgICAgICAgIDxtb2R1bGU+YmVhbi12YWxpZGF0aW9uPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+Y2RpPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+ZW50aXR5LWZpbHRlcmluZzwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPm1ldGFpbmYtc2VydmljZXM8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5tdmM8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5tdmMtYmVhbi12YWxpZGF0aW9uPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+bXZjLWZyZWVtYXJrZXI8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5tdmMtanNwPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+bXZjLW11c3RhY2hlPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+cHJveHktY2xpZW50PC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+cng8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5zZXJ2bGV0LXBvcnRhYmlsaXR5PC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+c3ByaW5nNDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPndhZGwtZG9jbGV0PC9tb2R1bGU+CisgICAgPC9tb2R1bGVzPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC53cy5yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LndzLnJzLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWhrMjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXh0L3Byb3h5LWNsaWVudC9wb20ueG1sIGIvZXh0L3Byb3h5LWNsaWVudC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NzdiMGYKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvcHJveHktY2xpZW50L3BvbS54bWwKQEAgLTAsMCArMSw2NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LXByb3h5LWNsaWVudDwvYXJ0aWZhY3RJZD4KKyAgICA8bmFtZT5qZXJzZXktZXh0LXByb3h5LWNsaWVudDwvbmFtZT4KKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIEplcnNleSBleHRlbnNpb24gbW9kdWxlIHByb3ZpZGluZyBzdXBwb3J0IGZvciAocHJveHktYmFzZWQpIGhpZ2gtbGV2ZWwgY2xpZW50IEFQSS4KKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5mZWxpeDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1idW5kbGUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgICAgIDxleHRlbnNpb25zPnRydWU8L2V4dGVuc2lvbnM+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxpbnN0cnVjdGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8RXhwb3J0LVBhY2thZ2U+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnByb3h5Lio7dmVyc2lvbj0ke3Byb2plY3QudmVyc2lvbn08L0V4cG9ydC1QYWNrYWdlPgorICAgICAgICAgICAgICAgICAgICA8L2luc3RydWN0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPHVucGFja0J1bmRsZT50cnVlPC91bnBhY2tCdW5kbGU+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbW1vbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1idW5kbGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8dHlwZT5wb208L3R5cGU+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4dC9wcm94eS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvcHJveHkvV2ViUmVzb3VyY2VGYWN0b3J5LmphdmEgYi9leHQvcHJveHktY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L3Byb3h5L1dlYlJlc291cmNlRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0NTdjMGIKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvcHJveHktY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L3Byb3h5L1dlYlJlc291cmNlRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMzY3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5wcm94eTsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQW5ub3RhdGVkRWxlbWVudDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uSGFuZGxlcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUGFyYW1ldGVyaXplZFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUHJveHk7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkNvb2tpZVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLkRlZmF1bHRWYWx1ZTsKK2ltcG9ydCBqYXZheC53cy5ycy5Gb3JtUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuSGVhZGVyUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuSHR0cE1ldGhvZDsKK2ltcG9ydCBqYXZheC53cy5ycy5NYXRyaXhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50Lkludm9jYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvb2tpZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZvcm07CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY1R5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkSGFzaE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5SZWZsZWN0aW9uSGVscGVyOworCisvKioKKyAqIEZhY3RvcnkgZm9yIGNsaWVudC1zaWRlIHJlcHJlc2VudGF0aW9uIG9mIGEgcmVzb3VyY2UuCisgKiBTZWUgdGhlIDxhIGhyZWY9InBhY2thZ2Utc3VtbWFyeS5odG1sIj5wYWNrYWdlIG92ZXJ2aWV3PC9hPgorICogZm9yIGFuIGV4YW1wbGUgb24gaG93IHRvIHVzZSB0aGlzIGNsYXNzLgorICoKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgV2ViUmVzb3VyY2VGYWN0b3J5IGltcGxlbWVudHMgSW52b2NhdGlvbkhhbmRsZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gRU1QVFkgPSB7fTsKKworICAgIHByaXZhdGUgZmluYWwgV2ViVGFyZ2V0IHRhcmdldDsKKyAgICBwcml2YXRlIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBoZWFkZXJzOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxDb29raWU+IGNvb2tpZXM7CisgICAgcHJpdmF0ZSBmaW5hbCBGb3JtIGZvcm07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gRU1QVFlfSEVBREVSUyA9IG5ldyBNdWx0aXZhbHVlZEhhc2hNYXA8PigpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZvcm0gRU1QVFlfRk9STSA9IG5ldyBGb3JtKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGlzdDxDbGFzcz4gUEFSQU1fQU5OT1RBVElPTl9DTEFTU0VTID0gQXJyYXlzLjxDbGFzcz5hc0xpc3QoUGF0aFBhcmFtLmNsYXNzLCBRdWVyeVBhcmFtLmNsYXNzLAorICAgICAgICAgICAgSGVhZGVyUGFyYW0uY2xhc3MsIENvb2tpZVBhcmFtLmNsYXNzLCBNYXRyaXhQYXJhbS5jbGFzcywgRm9ybVBhcmFtLmNsYXNzKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgY2xpZW50LXNpZGUgcmVwcmVzZW50YXRpb24gb2YgYSByZXNvdXJjZSBkZXNjcmliZWQgYnkKKyAgICAgKiB0aGUgaW50ZXJmYWNlIHBhc3NlZCBpbiB0aGUgZmlyc3QgYXJndW1lbnQuCisgICAgICogPHAvPgorICAgICAqIENhbGxpbmcgdGhpcyBtZXRob2QgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyBjYWxsaW5nIHtAY29kZSBXZWJSZXNvdXJjZUZhY3RvcnkubmV3UmVzb3VyY2UocmVzb3VyY2VJbnRlcmZhY2UsIHJvb3RUYXJnZXQsCisgICAgICpmYWxzZSl9LgorICAgICAqCisgICAgICogQHBhcmFtIDxDPiBUeXBlIG9mIHRoZSByZXNvdXJjZSB0byBiZSBjcmVhdGVkLgorICAgICAqIEBwYXJhbSByZXNvdXJjZUludGVyZmFjZSBJbnRlcmZhY2UgZGVzY3JpYmluZyB0aGUgcmVzb3VyY2UgdG8gYmUgY3JlYXRlZC4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0IFdlYlRhcmdldCBwb2ludGluZyB0byB0aGUgcmVzb3VyY2Ugb3IgdGhlIHBhcmVudCBvZiB0aGUgcmVzb3VyY2UuCisgICAgICogQHJldHVybiBJbnN0YW5jZSBvZiBhIGNsYXNzIGltcGxlbWVudGluZyB0aGUgcmVzb3VyY2UgaW50ZXJmYWNlIHRoYXQgY2FuCisgICAgICogYmUgdXNlZCBmb3IgbWFraW5nIHJlcXVlc3RzIHRvIHRoZSBzZXJ2ZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8Qz4gQyBuZXdSZXNvdXJjZShmaW5hbCBDbGFzczxDPiByZXNvdXJjZUludGVyZmFjZSwgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCkgeworICAgICAgICByZXR1cm4gbmV3UmVzb3VyY2UocmVzb3VyY2VJbnRlcmZhY2UsIHRhcmdldCwgZmFsc2UsIEVNUFRZX0hFQURFUlMsIENvbGxlY3Rpb25zLjxDb29raWU+ZW1wdHlMaXN0KCksIEVNUFRZX0ZPUk0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgY2xpZW50LXNpZGUgcmVwcmVzZW50YXRpb24gb2YgYSByZXNvdXJjZSBkZXNjcmliZWQgYnkKKyAgICAgKiB0aGUgaW50ZXJmYWNlIHBhc3NlZCBpbiB0aGUgZmlyc3QgYXJndW1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gPEM+IFR5cGUgb2YgdGhlIHJlc291cmNlIHRvIGJlIGNyZWF0ZWQuCisgICAgICogQHBhcmFtIHJlc291cmNlSW50ZXJmYWNlIEludGVyZmFjZSBkZXNjcmliaW5nIHRoZSByZXNvdXJjZSB0byBiZSBjcmVhdGVkLgorICAgICAqIEBwYXJhbSB0YXJnZXQgV2ViVGFyZ2V0IHBvaW50aW5nIHRvIHRoZSByZXNvdXJjZSBvciB0aGUgcGFyZW50IG9mIHRoZSByZXNvdXJjZS4KKyAgICAgKiBAcGFyYW0gaWdub3JlUmVzb3VyY2VQYXRoIElmIHNldCB0byB0cnVlLCBpZ25vcmVzIHBhdGggYW5ub3RhdGlvbiBvbiB0aGUgcmVzb3VyY2UgaW50ZXJmYWNlICh0aGlzIGlzIHVzZWQgd2hlbiBjcmVhdGluZworICAgICAqIHN1Yi1yZXNvdXJjZXMpCisgICAgICogQHBhcmFtIGhlYWRlcnMgSGVhZGVyIHBhcmFtcyBjb2xsZWN0ZWQgZnJvbSBwYXJlbnQgcmVzb3VyY2VzICh1c2VkIHdoZW4gY3JlYXRpbmcgYSBzdWItcmVzb3VyY2UpCisgICAgICogQHBhcmFtIGNvb2tpZXMgQ29va2llIHBhcmFtcyBjb2xsZWN0ZWQgZnJvbSBwYXJlbnQgcmVzb3VyY2VzICh1c2VkIHdoZW4gY3JlYXRpbmcgYSBzdWItcmVzb3VyY2UpCisgICAgICogQHBhcmFtIGZvcm0gRm9ybSBwYXJhbXMgY29sbGVjdGVkIGZyb20gcGFyZW50IHJlc291cmNlcyAodXNlZCB3aGVuIGNyZWF0aW5nIGEgc3ViLXJlc291cmNlKQorICAgICAqIEByZXR1cm4gSW5zdGFuY2Ugb2YgYSBjbGFzcyBpbXBsZW1lbnRpbmcgdGhlIHJlc291cmNlIGludGVyZmFjZSB0aGF0IGNhbgorICAgICAqIGJlIHVzZWQgZm9yIG1ha2luZyByZXF1ZXN0cyB0byB0aGUgc2VydmVyLgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBzdGF0aWMgPEM+IEMgbmV3UmVzb3VyY2UoZmluYWwgQ2xhc3M8Qz4gcmVzb3VyY2VJbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpZ25vcmVSZXNvdXJjZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8Q29va2llPiBjb29raWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRm9ybSBmb3JtKSB7CisKKyAgICAgICAgcmV0dXJuIChDKSBQcm94eS5uZXdQcm94eUluc3RhbmNlKEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKFJlZmxlY3Rpb25IZWxwZXIuZ2V0Q2xhc3NMb2FkZXJQQShyZXNvdXJjZUludGVyZmFjZSkpLAorICAgICAgICAgICAgICAgIG5ldyBDbGFzc1tdIHtyZXNvdXJjZUludGVyZmFjZX0sCisgICAgICAgICAgICAgICAgbmV3IFdlYlJlc291cmNlRmFjdG9yeShpZ25vcmVSZXNvdXJjZVBhdGggPyB0YXJnZXQgOiBhZGRQYXRoRnJvbUFubm90YXRpb24ocmVzb3VyY2VJbnRlcmZhY2UsIHRhcmdldCksCisgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzLCBjb29raWVzLCBmb3JtKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBXZWJSZXNvdXJjZUZhY3RvcnkoZmluYWwgV2ViVGFyZ2V0IHRhcmdldCwgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxDb29raWU+IGNvb2tpZXMsIGZpbmFsIEZvcm0gZm9ybSkgeworICAgICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDsKKyAgICAgICAgdGhpcy5oZWFkZXJzID0gaGVhZGVyczsKKyAgICAgICAgdGhpcy5jb29raWVzID0gY29va2llczsKKyAgICAgICAgdGhpcy5mb3JtID0gZm9ybTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgT2JqZWN0IGludm9rZShmaW5hbCBPYmplY3QgcHJveHksIGZpbmFsIE1ldGhvZCBtZXRob2QsIGZpbmFsIE9iamVjdFtdIGFyZ3MpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBpZiAoYXJncyA9PSBudWxsICYmIG1ldGhvZC5nZXROYW1lKCkuZXF1YWxzKCJ0b1N0cmluZyIpKSB7CisgICAgICAgICAgICByZXR1cm4gdG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhcmdzID09IG51bGwgJiYgbWV0aG9kLmdldE5hbWUoKS5lcXVhbHMoImhhc2hDb2RlIikpIHsKKyAgICAgICAgICAgIC8vdW5pcXVlIGluc3RhbmNlIGluIHRoZSBKVk0sIGFuZCBubyBuZWVkIHRvIG92ZXJyaWRlCisgICAgICAgICAgICByZXR1cm4gaGFzaENvZGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhcmdzICE9IG51bGwgJiYgYXJncy5sZW5ndGggPT0gMSAmJiBtZXRob2QuZ2V0TmFtZSgpLmVxdWFscygiZXF1YWxzIikpIHsKKyAgICAgICAgICAgIC8vdW5pcXVlIGluc3RhbmNlIGluIHRoZSBKVk0sIGFuZCBubyBuZWVkIHRvIG92ZXJyaWRlCisgICAgICAgICAgICByZXR1cm4gZXF1YWxzKGFyZ3NbMF0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gZ2V0IHRoZSBpbnRlcmZhY2UgZGVzY3JpYmluZyB0aGUgcmVzb3VyY2UKKyAgICAgICAgZmluYWwgQ2xhc3M8Pz4gcHJveHlJZmMgPSBwcm94eS5nZXRDbGFzcygpLmdldEludGVyZmFjZXMoKVswXTsKKworICAgICAgICAvLyByZXNwb25zZSB0eXBlCisgICAgICAgIGZpbmFsIENsYXNzPD8+IHJlc3BvbnNlVHlwZSA9IG1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7CisKKyAgICAgICAgLy8gZGV0ZXJtaW5lIG1ldGhvZCBuYW1lCisgICAgICAgIFN0cmluZyBodHRwTWV0aG9kID0gZ2V0SHR0cE1ldGhvZE5hbWUobWV0aG9kKTsKKyAgICAgICAgaWYgKGh0dHBNZXRob2QgPT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChmaW5hbCBBbm5vdGF0aW9uIGFubiA6IG1ldGhvZC5nZXRBbm5vdGF0aW9ucygpKSB7CisgICAgICAgICAgICAgICAgaHR0cE1ldGhvZCA9IGdldEh0dHBNZXRob2ROYW1lKGFubi5hbm5vdGF0aW9uVHlwZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAoaHR0cE1ldGhvZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBVcmlCdWlsZGVyIGFwcGVuZGluZyB0aGUgQFBhdGggYXR0YWNoZWQgdG8gdGhlIG1ldGhvZAorICAgICAgICBXZWJUYXJnZXQgbmV3VGFyZ2V0ID0gYWRkUGF0aEZyb21Bbm5vdGF0aW9uKG1ldGhvZCwgdGFyZ2V0KTsKKworICAgICAgICBpZiAoaHR0cE1ldGhvZCA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAobmV3VGFyZ2V0ID09IHRhcmdldCkgeworICAgICAgICAgICAgICAgIC8vIG5vIHBhdGggYW5ub3RhdGlvbiBvbiB0aGUgbWV0aG9kIC0+IGZhaWwKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBhIHJlc291cmNlIG1ldGhvZC4iKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIXJlc3BvbnNlVHlwZS5pc0ludGVyZmFjZSgpKSB7CisgICAgICAgICAgICAgICAgLy8gdGhlIG1ldGhvZCBpcyBhIHN1YnJlc291cmNlIGxvY2F0b3IsIGJ1dCByZXR1cm5zIGNsYXNzLAorICAgICAgICAgICAgICAgIC8vIG5vdCBpbnRlcmZhY2UgLSBjYW4ndCBoZWxwIGhlcmUKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlJldHVybiB0eXBlIG5vdCBhbiBpbnRlcmZhY2UiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHByb2Nlc3MgbWV0aG9kIHBhcmFtcyAoYnVpbGQgbWFwcyBvZiAoUGF0aHxGb3JtfENvb2tpZXxNYXRyaXh8SGVhZGVyLi4pUGFyYW1zCisgICAgICAgIC8vIGFuZCBleHRyYWN0IGVudGl0eSB0eXBlCisgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4gaGVhZGVycyA9IG5ldyBNdWx0aXZhbHVlZEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KHRoaXMuaGVhZGVycyk7CisgICAgICAgIGZpbmFsIExpbmtlZExpc3Q8Q29va2llPiBjb29raWVzID0gbmV3IExpbmtlZExpc3Q8Pih0aGlzLmNvb2tpZXMpOworICAgICAgICBmaW5hbCBGb3JtIGZvcm0gPSBuZXcgRm9ybSgpOworICAgICAgICBmb3JtLmFzTWFwKCkucHV0QWxsKHRoaXMuZm9ybS5hc01hcCgpKTsKKyAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdW10gcGFyYW1Bbm5zID0gbWV0aG9kLmdldFBhcmFtZXRlckFubm90YXRpb25zKCk7CisgICAgICAgIE9iamVjdCBlbnRpdHkgPSBudWxsOworICAgICAgICBUeXBlIGVudGl0eVR5cGUgPSBudWxsOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtQW5ucy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgZmluYWwgTWFwPENsYXNzLCBBbm5vdGF0aW9uPiBhbm5zID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICAgICAgZm9yIChmaW5hbCBBbm5vdGF0aW9uIGFubiA6IHBhcmFtQW5uc1tpXSkgeworICAgICAgICAgICAgICAgIGFubnMucHV0KGFubi5hbm5vdGF0aW9uVHlwZSgpLCBhbm4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQW5ub3RhdGlvbiBhbm47CisgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBhcmdzW2ldOworICAgICAgICAgICAgaWYgKCFoYXNBbnlQYXJhbUFubm90YXRpb24oYW5ucykpIHsKKyAgICAgICAgICAgICAgICBlbnRpdHlUeXBlID0gbWV0aG9kLmdldEdlbmVyaWNQYXJhbWV0ZXJUeXBlcygpW2ldOworICAgICAgICAgICAgICAgIGVudGl0eSA9IHZhbHVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCAmJiAoYW5uID0gYW5ucy5nZXQoRGVmYXVsdFZhbHVlLmNsYXNzKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9ICgoRGVmYXVsdFZhbHVlKSBhbm4pLnZhbHVlKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChhbm4gPSBhbm5zLmdldChQYXRoUGFyYW0uY2xhc3MpKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdUYXJnZXQgPSBuZXdUYXJnZXQucmVzb2x2ZVRlbXBsYXRlKCgoUGF0aFBhcmFtKSBhbm4pLnZhbHVlKCksIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoYW5uID0gYW5ucy5nZXQoKFF1ZXJ5UGFyYW0uY2xhc3MpKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQ29sbGVjdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1RhcmdldCA9IG5ld1RhcmdldC5xdWVyeVBhcmFtKCgoUXVlcnlQYXJhbSkgYW5uKS52YWx1ZSgpLCBjb252ZXJ0KChDb2xsZWN0aW9uKSB2YWx1ZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdUYXJnZXQgPSBuZXdUYXJnZXQucXVlcnlQYXJhbSgoKFF1ZXJ5UGFyYW0pIGFubikudmFsdWUoKSwgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChhbm4gPSBhbm5zLmdldCgoSGVhZGVyUGFyYW0uY2xhc3MpKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQ29sbGVjdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcnMuYWRkQWxsKCgoSGVhZGVyUGFyYW0pIGFubikudmFsdWUoKSwgY29udmVydCgoQ29sbGVjdGlvbikgdmFsdWUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycy5hZGRBbGwoKChIZWFkZXJQYXJhbSkgYW5uKS52YWx1ZSgpLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoYW5uID0gYW5ucy5nZXQoKENvb2tpZVBhcmFtLmNsYXNzKSkpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gKChDb29raWVQYXJhbSkgYW5uKS52YWx1ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgQ29va2llIGM7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChmaW5hbCBPYmplY3QgdiA6ICgoQ29sbGVjdGlvbikgdmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHYgaW5zdGFuY2VvZiBDb29raWUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gbmV3IENvb2tpZShuYW1lLCB2LnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IChDb29raWUpIHY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5hbWUuZXF1YWxzKCgoQ29va2llKSB2KS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgdGhpcyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8/IG9yIHNob3VsZCBJIGZhaWw/IG9yIGlnbm9yZSB0aGUgZGlmZmVyZW5jZT8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjID0gbmV3IENvb2tpZShuYW1lLCBjLmdldFZhbHVlKCksIGMuZ2V0UGF0aCgpLCBjLmdldERvbWFpbigpLCBjLmdldFZlcnNpb24oKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2llcy5hZGQoYyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIENvb2tpZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2llcy5hZGQobmV3IENvb2tpZShuYW1lLCB2YWx1ZS50b1N0cmluZygpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9IChDb29raWUpIHZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW5hbWUuZXF1YWxzKCgoQ29va2llKSB2YWx1ZSkuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgdGhpcyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8/IG9yIHNob3VsZCBJIGZhaWw/IG9yIGlnbm9yZSB0aGUgZGlmZmVyZW5jZT8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb2tpZXMuYWRkKG5ldyBDb29raWUobmFtZSwgYy5nZXRWYWx1ZSgpLCBjLmdldFBhdGgoKSwgYy5nZXREb21haW4oKSwgYy5nZXRWZXJzaW9uKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoYW5uID0gYW5ucy5nZXQoKE1hdHJpeFBhcmFtLmNsYXNzKSkpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIENvbGxlY3Rpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdUYXJnZXQgPSBuZXdUYXJnZXQubWF0cml4UGFyYW0oKChNYXRyaXhQYXJhbSkgYW5uKS52YWx1ZSgpLCBjb252ZXJ0KChDb2xsZWN0aW9uKSB2YWx1ZSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdUYXJnZXQgPSBuZXdUYXJnZXQubWF0cml4UGFyYW0oKChNYXRyaXhQYXJhbSkgYW5uKS52YWx1ZSgpLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGFubiA9IGFubnMuZ2V0KChGb3JtUGFyYW0uY2xhc3MpKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQ29sbGVjdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoZmluYWwgT2JqZWN0IHYgOiAoKENvbGxlY3Rpb24pIHZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtLnBhcmFtKCgoRm9ybVBhcmFtKSBhbm4pLnZhbHVlKCksIHYudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtLnBhcmFtKCgoRm9ybVBhcmFtKSBhbm4pLnZhbHVlKCksIHZhbHVlLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGh0dHBNZXRob2QgPT0gbnVsbCkgeworICAgICAgICAgICAgLy8gdGhlIG1ldGhvZCBpcyBhIHN1YnJlc291cmNlIGxvY2F0b3IKKyAgICAgICAgICAgIHJldHVybiBXZWJSZXNvdXJjZUZhY3RvcnkubmV3UmVzb3VyY2UocmVzcG9uc2VUeXBlLCBuZXdUYXJnZXQsIHRydWUsIGhlYWRlcnMsIGNvb2tpZXMsIGZvcm0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gYWNjZXB0ZWQgbWVkaWEgdHlwZXMKKyAgICAgICAgUHJvZHVjZXMgcHJvZHVjZXMgPSBtZXRob2QuZ2V0QW5ub3RhdGlvbihQcm9kdWNlcy5jbGFzcyk7CisgICAgICAgIGlmIChwcm9kdWNlcyA9PSBudWxsKSB7CisgICAgICAgICAgICBwcm9kdWNlcyA9IHByb3h5SWZjLmdldEFubm90YXRpb24oUHJvZHVjZXMuY2xhc3MpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFN0cmluZ1tdIGFjY2VwdHMgPSAocHJvZHVjZXMgPT0gbnVsbCkgPyBFTVBUWSA6IHByb2R1Y2VzLnZhbHVlKCk7CisKKyAgICAgICAgLy8gZGV0ZXJtaW5lIGNvbnRlbnQgdHlwZQorICAgICAgICBTdHJpbmcgY29udGVudFR5cGUgPSBudWxsOworICAgICAgICBpZiAoZW50aXR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8T2JqZWN0PiBjb250ZW50VHlwZUVudHJpZXMgPSBoZWFkZXJzLmdldChIdHRwSGVhZGVycy5DT05URU5UX1RZUEUpOworICAgICAgICAgICAgaWYgKChjb250ZW50VHlwZUVudHJpZXMgIT0gbnVsbCkgJiYgKCFjb250ZW50VHlwZUVudHJpZXMuaXNFbXB0eSgpKSkgeworICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlID0gY29udGVudFR5cGVFbnRyaWVzLmdldCgwKS50b1N0cmluZygpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBDb25zdW1lcyBjb25zdW1lcyA9IG1ldGhvZC5nZXRBbm5vdGF0aW9uKENvbnN1bWVzLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBpZiAoY29uc3VtZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjb25zdW1lcyA9IHByb3h5SWZjLmdldEFubm90YXRpb24oQ29uc3VtZXMuY2xhc3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoY29uc3VtZXMgIT0gbnVsbCAmJiBjb25zdW1lcy52YWx1ZSgpLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGUgPSBjb25zdW1lcy52YWx1ZSgpWzBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEludm9jYXRpb24uQnVpbGRlciBidWlsZGVyID0gbmV3VGFyZ2V0LnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5oZWFkZXJzKGhlYWRlcnMpIC8vIHRoaXMgcmVzZXRzIGFsbCBoZWFkZXJzIHNvIGRvIHRoaXMgZmlyc3QKKyAgICAgICAgICAgICAgICAuYWNjZXB0KGFjY2VwdHMpOyAvLyBpZiBAUHJvZHVjZXMgaXMgZGVmaW5lZCwgcHJvcGFnYXRlIHZhbHVlcyBpbnRvIEFjY2VwdCBoZWFkZXI7IGVtcHR5IGFycmF5IGlzIE5PLU9QCisKKyAgICAgICAgZm9yIChmaW5hbCBDb29raWUgYyA6IGNvb2tpZXMpIHsKKyAgICAgICAgICAgIGJ1aWxkZXIgPSBidWlsZGVyLmNvb2tpZShjKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIE9iamVjdCByZXN1bHQ7CisKKyAgICAgICAgaWYgKGVudGl0eSA9PSBudWxsICYmICFmb3JtLmFzTWFwKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBlbnRpdHkgPSBmb3JtOworICAgICAgICAgICAgY29udGVudFR5cGUgPSBNZWRpYVR5cGUuQVBQTElDQVRJT05fRk9STV9VUkxFTkNPREVEOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGNvbnRlbnRUeXBlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250ZW50VHlwZSA9IE1lZGlhVHlwZS5BUFBMSUNBVElPTl9PQ1RFVF9TVFJFQU07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWZvcm0uYXNNYXAoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZW50aXR5IGluc3RhbmNlb2YgRm9ybSkgeworICAgICAgICAgICAgICAgICAgICAoKEZvcm0pIGVudGl0eSkuYXNNYXAoKS5wdXRBbGwoZm9ybS5hc01hcCgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgYXQgbGVhc3QgbG9nIHNvbWUgd2FybmluZyBoZXJlCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZmluYWwgR2VuZXJpY1R5cGUgcmVzcG9uc2VHZW5lcmljVHlwZSA9IG5ldyBHZW5lcmljVHlwZShtZXRob2QuZ2V0R2VuZXJpY1JldHVyblR5cGUoKSk7CisgICAgICAgIGlmIChlbnRpdHkgIT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKGVudGl0eVR5cGUgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkVHlwZSkgeworICAgICAgICAgICAgICAgIGVudGl0eSA9IG5ldyBHZW5lcmljRW50aXR5KGVudGl0eSwgZW50aXR5VHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQgPSBidWlsZGVyLm1ldGhvZChodHRwTWV0aG9kLCBFbnRpdHkuZW50aXR5KGVudGl0eSwgY29udGVudFR5cGUpLCByZXNwb25zZUdlbmVyaWNUeXBlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGJ1aWxkZXIubWV0aG9kKGh0dHBNZXRob2QsIHJlc3BvbnNlR2VuZXJpY1R5cGUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaGFzQW55UGFyYW1Bbm5vdGF0aW9uKGZpbmFsIE1hcDxDbGFzcywgQW5ub3RhdGlvbj4gYW5ucykgeworICAgICAgICBmb3IgKGZpbmFsIENsYXNzIHBhcmFtQW5ub3RhdGlvbkNsYXNzIDogUEFSQU1fQU5OT1RBVElPTl9DTEFTU0VTKSB7CisgICAgICAgICAgICBpZiAoYW5ucy5jb250YWluc0tleShwYXJhbUFubm90YXRpb25DbGFzcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBPYmplY3RbXSBjb252ZXJ0KGZpbmFsIENvbGxlY3Rpb24gdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlLnRvQXJyYXkoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBXZWJUYXJnZXQgYWRkUGF0aEZyb21Bbm5vdGF0aW9uKGZpbmFsIEFubm90YXRlZEVsZW1lbnQgYWUsIFdlYlRhcmdldCB0YXJnZXQpIHsKKyAgICAgICAgZmluYWwgUGF0aCBwID0gYWUuZ2V0QW5ub3RhdGlvbihQYXRoLmNsYXNzKTsKKyAgICAgICAgaWYgKHAgIT0gbnVsbCkgeworICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhdGgocC52YWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGFyZ2V0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiB0YXJnZXQudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0SHR0cE1ldGhvZE5hbWUoZmluYWwgQW5ub3RhdGVkRWxlbWVudCBhZSkgeworICAgICAgICBmaW5hbCBIdHRwTWV0aG9kIGEgPSBhZS5nZXRBbm5vdGF0aW9uKEh0dHBNZXRob2QuY2xhc3MpOworICAgICAgICByZXR1cm4gYSA9PSBudWxsID8gbnVsbCA6IGEudmFsdWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvcHJveHktY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L3Byb3h5L3BhY2thZ2UtaW5mby5qYXZhIGIvZXh0L3Byb3h5LWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9wcm94eS9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTk1N2RjCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3Byb3h5LWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9wcm94eS9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvKioKKyAqIFRoaXMgcGFja2FnZSBkZWZpbmVzIGEgaGlnaC1sZXZlbCAocHJveHktYmFzZWQpIGNsaWVudCBBUEkuCisgKiBUaGUgQVBJIGVuYWJsZXMgdXRpbGl6YXRpb24gb2YgdGhlIHNlcnZlci1zaWRlIEpBWC1SUyBhbm5vdGF0aW9ucworICogdG8gZGVzY3JpYmUgdGhlIHNlcnZlci1zaWRlIHJlc291cmNlcyBhbmQgZHluYW1pY2FsbHkgZ2VuZXJhdGUgY2xpZW50LXNpZGUKKyAqIHByb3h5IG9iamVjdHMgZm9yIHRoZW0uCisgKiA8cD4KKyAqIENvbnNpZGVyIGEgc2VydmVyIHdoaWNoIGV4cG9zZXMgYSByZXNvdXJjZSBhdCBodHRwOi8vbG9jYWxob3N0OjgwODAuIFRoZSByZXNvdXJjZQorICogY2FuIGJlIGRlc2NyaWJlZCBieSB0aGUgZm9sbG93aW5nIGludGVyZmFjZToKKyAqIDwvcD4KKyAqCisgKiA8cHJlPgorICogJiMwNjQ7UGF0aCgibXlyZXNvdXJjZSIpCisgKiBwdWJsaWMgaW50ZXJmYWNlIE15UmVzb3VyY2VJZmMgeworICogICAgICYjMDY0O0dFVAorICogICAgICYjMDY0O1Byb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAqICAgICBTdHJpbmcgZ2V0KCk7CisgKgorICogICAgICYjMDY0O1BPU1QKKyAqICAgICAmIzA2NDtDb25zdW1lcygiYXBwbGljYXRpb24veG1sIikKKyAqICAgICAmIzA2NDtQcm9kdWNlcygiYXBwbGljYXRpb24veG1sIikKKyAqICAgICBNeUJlYW4gcG9zdEVjaG8oTXlCZWFuIGJlYW4pOworICoKKyAqICAgICAmIzA2NDtQYXRoKCJ7aWR9IikKKyAqICAgICAmIzA2NDtHRVQKKyAqICAgICAmIzA2NDtQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgKiAgICAgU3RyaW5nIGdldEJ5SWQoJiMwNjQ7UGF0aFBhcmFtKCJpZCIpIFN0cmluZyBpZCk7CisgKiB9CisgKiA8L3ByZT4KKyAqCisgKiA8cD4KKyAqIFlvdSBjYW4gdXNlIDxhIGhyZWY9IldlYlJlc291cmNlRmFjdG9yeS5odG1sIj5XZWJSZXNvdXJjZUZhY3Rvcnk8L2E+IGNsYXNzIGRlZmluZWQKKyAqIGluIHRoaXMgcGFja2FnZSB0byBhY2Nlc3MgdGhlIHNlcnZlci1zaWRlIHJlc291cmNlIHVzaW5nIHRoaXMgaW50ZXJmYWNlLgorICogSGVyZSBpcyBhbiBleGFtcGxlOgorICogPC9wPgorICoKKyAqIDxwcmU+CisgKiBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKTsKKyAqIFdlYlRhcmdldCB0YXJnZXQgPSBjbGllbnQudGFyZ2V0KCJodHRwOi8vbG9jYWxob3N0OjgwODAvIik7CisgKiBNeVJlc291cmNlSWZjIHJlc291cmNlID0gV2ViUmVzb3VyY2VGYWN0b3J5Lm5ld1Jlc291cmNlKE15UmVzb3VyY2VJZmMuY2xhc3MsIHRhcmdldCk7CisgKgorICogU3RyaW5nIHJlc3BvbnNlRnJvbUdldCA9IHJlc291cmNlLmdldCgpOworICogTXlCZWFuIHJlc3BvbnNlRnJvbVBvc3QgPSByZXNvdXJjZS5wb3N0RWNobyhteUJlYW5JbnN0YW5jZSk7CisgKiBTdHJpbmcgcmVzcG9uc2VGcm9tR2V0QnlJZCA9IHJlc291cmNlLmdldEJ5SWQoImFiYyIpOworICogPC9wcmU+CisgKi8KK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnByb3h5OwpkaWZmIC0tZ2l0IGEvZXh0L3Byb3h5LWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9wcm94eS9NeUJlYW4uamF2YSBiL2V4dC9wcm94eS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvcHJveHkvTXlCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk5YWViZgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9wcm94eS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvcHJveHkvTXlCZWFuLmphdmEKQEAgLTAsMCArMSwyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQucHJveHk7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCitAWG1sUm9vdEVsZW1lbnQKK3B1YmxpYyBjbGFzcyBNeUJlYW4geworICAgIHB1YmxpYyBTdHJpbmcgbmFtZTsKK30KZGlmZiAtLWdpdCBhL2V4dC9wcm94eS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvcHJveHkvTXlSZXNvdXJjZS5qYXZhIGIvZXh0L3Byb3h5LWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9wcm94eS9NeVJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBmMzkyMgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9wcm94eS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvcHJveHkvTXlSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMTY2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5wcm94eTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU29ydGVkU2V0OworCitwdWJsaWMgY2xhc3MgTXlSZXNvdXJjZSBpbXBsZW1lbnRzIE15UmVzb3VyY2VJZmMgeworCisgICAgQENvbnRleHQgSHR0cEhlYWRlcnMgaGVhZGVyczsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0SXQoKSB7CisgICAgICAgIHJldHVybiAiR290IGl0ISI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8TXlCZWFuPiBwb3N0SXQoTGlzdDxNeUJlYW4+IGVudGl0eSkgeworICAgICAgICByZXR1cm4gZW50aXR5OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNeUJlYW4gcG9zdFZhbGlkKEBWYWxpZCBNeUJlYW4gZW50aXR5KSB7CisgICAgICAgIHJldHVybiBlbnRpdHk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRJZChTdHJpbmcgaWQpIHsKKyAgICAgICAgcmV0dXJuIGlkOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QnlOYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QnlOYW1lQ29va2llKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QnlOYW1lSGVhZGVyKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QnlOYW1lTWF0cml4KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgcG9zdEJ5TmFtZUZvcm1QYXJhbShTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldEJ5TmFtZUxpc3QoTGlzdDxTdHJpbmc+IG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIG5hbWUuc2l6ZSgpICsgIjoiICsgbmFtZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldEJ5TmFtZVNldChTZXQ8U3RyaW5nPiBuYW1lKSB7CisgICAgICAgIHJldHVybiBuYW1lLnNpemUoKSArICI6IiArIG5hbWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRCeU5hbWVTb3J0ZWRTZXQoU29ydGVkU2V0PFN0cmluZz4gbmFtZSkgeworICAgICAgICByZXR1cm4gbmFtZS5zaXplKCkgKyAiOiIgKyBuYW1lOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QnlOYW1lQ29va2llTGlzdChMaXN0PFN0cmluZz4gbmFtZSkgeworICAgICAgICByZXR1cm4gbmFtZS5zaXplKCkgKyAiOiIgKyBuYW1lOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QnlOYW1lQ29va2llU2V0KFNldDxTdHJpbmc+IG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIG5hbWUuc2l6ZSgpICsgIjoiICsgbmFtZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldEJ5TmFtZUNvb2tpZVNvcnRlZFNldChTb3J0ZWRTZXQ8U3RyaW5nPiBuYW1lKSB7CisgICAgICAgIHJldHVybiBuYW1lLnNpemUoKSArICI6IiArIG5hbWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRCeU5hbWVIZWFkZXJMaXN0KExpc3Q8U3RyaW5nPiBuYW1lKSB7CisgICAgICAgIHJldHVybiBuYW1lLnNpemUoKSArICI6IiArIG5hbWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRCeU5hbWVIZWFkZXJTZXQoU2V0PFN0cmluZz4gbmFtZSkgeworICAgICAgICByZXR1cm4gbmFtZS5zaXplKCkgKyAiOiIgKyBuYW1lOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QnlOYW1lSGVhZGVyU29ydGVkU2V0KFNvcnRlZFNldDxTdHJpbmc+IG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIG5hbWUuc2l6ZSgpICsgIjoiICsgbmFtZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldEJ5TmFtZU1hdHJpeExpc3QoTGlzdDxTdHJpbmc+IG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIG5hbWUuc2l6ZSgpICsgIjoiICsgbmFtZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldEJ5TmFtZU1hdHJpeFNldChTZXQ8U3RyaW5nPiBuYW1lKSB7CisgICAgICAgIHJldHVybiBuYW1lLnNpemUoKSArICI6IiArIG5hbWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRCeU5hbWVNYXRyaXhTb3J0ZWRTZXQoU29ydGVkU2V0PFN0cmluZz4gbmFtZSkgeworICAgICAgICByZXR1cm4gbmFtZS5zaXplKCkgKyAiOiIgKyBuYW1lOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgcG9zdEJ5TmFtZUZvcm1MaXN0KExpc3Q8U3RyaW5nPiBuYW1lKSB7CisgICAgICAgIHJldHVybiBuYW1lLnNpemUoKSArICI6IiArIG5hbWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBwb3N0QnlOYW1lRm9ybVNldChTZXQ8U3RyaW5nPiBuYW1lKSB7CisgICAgICAgIHJldHVybiBuYW1lLnNpemUoKSArICI6IiArIG5hbWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBwb3N0QnlOYW1lRm9ybVNvcnRlZFNldChTb3J0ZWRTZXQ8U3RyaW5nPiBuYW1lKSB7CisgICAgICAgIHJldHVybiBuYW1lLnNpemUoKSArICI6IiArIG5hbWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE15U3ViUmVzb3VyY2VJZmMgZ2V0U3ViUmVzb3VyY2UoKSB7CisgICAgICAgIHJldHVybiBuZXcgTXlTdWJSZXNvdXJjZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzQWNjZXB0SGVhZGVyVmFsaWQoSHR0cEhlYWRlcnMgaGVhZGVycykgeworICAgICAgICBMaXN0PE1lZGlhVHlwZT4gYWNjZXB0cyA9IGhlYWRlcnMuZ2V0QWNjZXB0YWJsZU1lZGlhVHlwZXMoKTsKKyAgICAgICAgcmV0dXJuIGFjY2VwdHMuY29udGFpbnMoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkgJiYgYWNjZXB0cy5jb250YWlucyhNZWRpYVR5cGUuVEVYVF9YTUxfVFlQRSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBwdXRJdChNeUJlYW4gZHVtbXlCZWFuKSB7CisgICAgICAgIHJldHVybiBoZWFkZXJzLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5DT05URU5UX1RZUEUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9wcm94eS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvcHJveHkvTXlSZXNvdXJjZUlmYy5qYXZhIGIvZXh0L3Byb3h5LWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9wcm94eS9NeVJlc291cmNlSWZjLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI3ZDZmYQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9wcm94eS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvcHJveHkvTXlSZXNvdXJjZUlmYy5qYXZhCkBAIC0wLDAgKzEsMTc0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5wcm94eTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkNvb2tpZVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLkZvcm1QYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuSGVhZGVyUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuTWF0cml4UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QVVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworQFBhdGgoIm15cmVzb3VyY2UiKQorcHVibGljIGludGVyZmFjZSBNeVJlc291cmNlSWZjIHsKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgIFN0cmluZyBnZXRJdCgpOworCisgICAgQFBPU1QKKyAgICBAQ29uc3VtZXMoe01lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUx9KQorICAgIEBQcm9kdWNlcyh7TWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTH0pCisgICAgTGlzdDxNeUJlYW4+IHBvc3RJdChMaXN0PE15QmVhbj4gZW50aXR5KTsKKworICAgIEBQT1NUCisgICAgQFBhdGgoInZhbGlkIikKKyAgICBAQ29uc3VtZXMoe01lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUx9KQorICAgIEBQcm9kdWNlcyh7TWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTH0pCisgICAgTXlCZWFuIHBvc3RWYWxpZChAVmFsaWQgTXlCZWFuIGVudGl0eSk7CisKKyAgICBAUGF0aCgie2lkfSIpCisgICAgQEdFVAorICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICBTdHJpbmcgZ2V0SWQoQFBhdGhQYXJhbSgiaWQiKSBTdHJpbmcgaWQpOworCisgICAgQFBhdGgoInF1ZXJ5IikKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgIFN0cmluZyBnZXRCeU5hbWUoQFF1ZXJ5UGFyYW0oIm5hbWUiKSBTdHJpbmcgbmFtZSk7CisKKyAgICBAUGF0aCgiY29va2llIikKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgIFN0cmluZyBnZXRCeU5hbWVDb29raWUoQENvb2tpZVBhcmFtKCJjb29raWUtbmFtZSIpIFN0cmluZyBuYW1lKTsKKworICAgIEBQYXRoKCJoZWFkZXIiKQorICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgU3RyaW5nIGdldEJ5TmFtZUhlYWRlcihASGVhZGVyUGFyYW0oImhlYWRlci1uYW1lIikgU3RyaW5nIG5hbWUpOworCisgICAgQFBhdGgoIm1hdHJpeCIpCisgICAgQEdFVAorICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICBTdHJpbmcgZ2V0QnlOYW1lTWF0cml4KEBNYXRyaXhQYXJhbSgibWF0cml4LW5hbWUiKSBTdHJpbmcgbmFtZSk7CisKKyAgICBAUGF0aCgiZm9ybSIpCisgICAgQFBPU1QKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgU3RyaW5nIHBvc3RCeU5hbWVGb3JtUGFyYW0oQEZvcm1QYXJhbSgiZm9ybS1uYW1lIikgU3RyaW5nIG5hbWUpOworCisKKyAgICBAUGF0aCgicXVlcnktbGlzdCIpCisgICAgQEdFVAorICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICBTdHJpbmcgZ2V0QnlOYW1lTGlzdChAUXVlcnlQYXJhbSgibmFtZS1saXN0IikgTGlzdDxTdHJpbmc+IG5hbWUpOworCisgICAgQFBhdGgoInF1ZXJ5LXNldCIpCisgICAgQEdFVAorICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICBTdHJpbmcgZ2V0QnlOYW1lU2V0KEBRdWVyeVBhcmFtKCJuYW1lLXNldCIpIFNldDxTdHJpbmc+IG5hbWUpOworCisgICAgQFBhdGgoInF1ZXJ5LXNvcnRlZHNldCIpCisgICAgQEdFVAorICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICBTdHJpbmcgZ2V0QnlOYW1lU29ydGVkU2V0KEBRdWVyeVBhcmFtKCJuYW1lLXNvcnRlZCIpIFNvcnRlZFNldDxTdHJpbmc+IG5hbWUpOworCisgICAgQFBhdGgoImNvb2tpZS1saXN0IikKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgIFN0cmluZyBnZXRCeU5hbWVDb29raWVMaXN0KEBDb29raWVQYXJhbSgiY29va2llLW5hbWUtbGlzdCIpIExpc3Q8U3RyaW5nPiBuYW1lKTsKKworICAgIEBQYXRoKCJjb29raWUtc2V0IikKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgIFN0cmluZyBnZXRCeU5hbWVDb29raWVTZXQoQENvb2tpZVBhcmFtKCJjb29raWUtbmFtZS1zZXQiKSBTZXQ8U3RyaW5nPiBuYW1lKTsKKworICAgIEBQYXRoKCJjb29raWUtc29ydGVkc2V0IikKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgIFN0cmluZyBnZXRCeU5hbWVDb29raWVTb3J0ZWRTZXQoQENvb2tpZVBhcmFtKCJjb29raWUtbmFtZS1zb3J0ZWQiKSBTb3J0ZWRTZXQ8U3RyaW5nPiBuYW1lKTsKKworICAgIEBQYXRoKCJoZWFkZXItbGlzdCIpCisgICAgQEdFVAorICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICBTdHJpbmcgZ2V0QnlOYW1lSGVhZGVyTGlzdChASGVhZGVyUGFyYW0oImhlYWRlci1uYW1lLWxpc3QiKSBMaXN0PFN0cmluZz4gbmFtZSk7CisKKyAgICBAUGF0aCgiaGVhZGVyLXNldCIpCisgICAgQEdFVAorICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICBTdHJpbmcgZ2V0QnlOYW1lSGVhZGVyU2V0KEBIZWFkZXJQYXJhbSgiaGVhZGVyLW5hbWUtc2V0IikgU2V0PFN0cmluZz4gbmFtZSk7CisKKyAgICBAUGF0aCgiaGVhZGVyLXNvcnRlZHNldCIpCisgICAgQEdFVAorICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICBTdHJpbmcgZ2V0QnlOYW1lSGVhZGVyU29ydGVkU2V0KEBIZWFkZXJQYXJhbSgiaGVhZGVyLW5hbWUtc29ydGVkIikgU29ydGVkU2V0PFN0cmluZz4gbmFtZSk7CisKKyAgICBAUGF0aCgibWF0cml4LWxpc3QiKQorICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgU3RyaW5nIGdldEJ5TmFtZU1hdHJpeExpc3QoQE1hdHJpeFBhcmFtKCJtYXRyaXgtbmFtZS1saXN0IikgTGlzdDxTdHJpbmc+IG5hbWUpOworCisgICAgQFBhdGgoIm1hdHJpeC1zZXQiKQorICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgU3RyaW5nIGdldEJ5TmFtZU1hdHJpeFNldChATWF0cml4UGFyYW0oIm1hdHJpeC1uYW1lLXNldCIpIFNldDxTdHJpbmc+IG5hbWUpOworCisgICAgQFBhdGgoIm1hdHJpeC1zb3J0ZWRzZXQiKQorICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgU3RyaW5nIGdldEJ5TmFtZU1hdHJpeFNvcnRlZFNldChATWF0cml4UGFyYW0oIm1hdHJpeC1uYW1lLXNvcnRlZCIpIFNvcnRlZFNldDxTdHJpbmc+IG5hbWUpOworCisgICAgQFBhdGgoImZvcm0tbGlzdCIpCisgICAgQFBPU1QKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgU3RyaW5nIHBvc3RCeU5hbWVGb3JtTGlzdChARm9ybVBhcmFtKCJmb3JtLW5hbWUtbGlzdCIpIExpc3Q8U3RyaW5nPiBuYW1lKTsKKworICAgIEBQYXRoKCJmb3JtLXNldCIpCisgICAgQFBPU1QKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgU3RyaW5nIHBvc3RCeU5hbWVGb3JtU2V0KEBGb3JtUGFyYW0oImZvcm0tbmFtZS1zZXQiKSBTZXQ8U3RyaW5nPiBuYW1lKTsKKworICAgIEBQYXRoKCJmb3JtLXNvcnRlZHNldCIpCisgICAgQFBPU1QKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgU3RyaW5nIHBvc3RCeU5hbWVGb3JtU29ydGVkU2V0KEBGb3JtUGFyYW0oImZvcm0tbmFtZS1zb3J0ZWQiKSBTb3J0ZWRTZXQ8U3RyaW5nPiBuYW1lKTsKKworICAgIEBQYXRoKCJzdWJyZXNvdXJjZSIpCisgICAgTXlTdWJSZXNvdXJjZUlmYyBnZXRTdWJSZXNvdXJjZSgpOworCisgICAgQFBhdGgoImlzQWNjZXB0SGVhZGVyVmFsaWQiKQorICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoe01lZGlhVHlwZS5URVhUX1BMQUlOLCBNZWRpYVR5cGUuVEVYVF9YTUx9KQorICAgIGJvb2xlYW4gaXNBY2NlcHRIZWFkZXJWYWxpZChAQ29udGV4dCBIdHRwSGVhZGVycyBoZWFkZXJzKTsKKworICAgIEBQYXRoKCJwdXRJdCIpCisgICAgQFBVVAorICAgIEBDb25zdW1lcyh7TWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04sIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUx9KQorICAgIFN0cmluZyBwdXRJdChNeUJlYW4gZHVtbXlCZWFuKTsKK30KZGlmZiAtLWdpdCBhL2V4dC9wcm94eS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvcHJveHkvTXlTdWJSZXNvdXJjZS5qYXZhIGIvZXh0L3Byb3h5LWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9wcm94eS9NeVN1YlJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ3NzJlOQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9wcm94eS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvcHJveHkvTXlTdWJSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnByb3h5OworCisvKioKKyAqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIE15U3ViUmVzb3VyY2UgaW1wbGVtZW50cyBNeVN1YlJlc291cmNlSWZjIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTXlCZWFuIGdldE15QmVhbigpIHsKKyAgICAgICAgTXlCZWFuIGJlYW4gPSBuZXcgTXlCZWFuKCk7CisgICAgICAgIGJlYW4ubmFtZSA9ICJHb3QgaXQhIjsKKyAgICAgICAgcmV0dXJuIGJlYW47CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L3Byb3h5LWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9wcm94eS9NeVN1YlJlc291cmNlSWZjLmphdmEgYi9leHQvcHJveHktY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L3Byb3h5L015U3ViUmVzb3VyY2VJZmMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jY2FhMTZiCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3Byb3h5LWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9wcm94eS9NeVN1YlJlc291cmNlSWZjLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQucHJveHk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKKy8qKgorICoKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitwdWJsaWMgaW50ZXJmYWNlIE15U3ViUmVzb3VyY2VJZmMgeworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTCkKKyAgICBwdWJsaWMgTXlCZWFuIGdldE15QmVhbigpOworfQpkaWZmIC0tZ2l0IGEvZXh0L3Byb3h5LWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9wcm94eS9WYWxpZC5qYXZhIGIvZXh0L3Byb3h5LWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9wcm94eS9WYWxpZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjYzM0M2EKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvcHJveHktY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L3Byb3h5L1ZhbGlkLmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQucHJveHk7CisKK3B1YmxpYyBAaW50ZXJmYWNlIFZhbGlkIHsKK30KZGlmZiAtLWdpdCBhL2V4dC9wcm94eS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvcHJveHkvV2ViUmVzb3VyY2VGYWN0b3J5VGVzdC5qYXZhIGIvZXh0L3Byb3h5LWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9wcm94eS9XZWJSZXNvdXJjZUZhY3RvcnlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY1MWYxNwotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9wcm94eS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvcHJveHkvV2ViUmVzb3VyY2VGYWN0b3J5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMzM4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5wcm94eTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29va2llOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRm9ybTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRIYXNoTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIFdlYlJlc291cmNlRmFjdG9yeVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgTXlSZXNvdXJjZUlmYyByZXNvdXJjZTsKKyAgICBwcml2YXRlIE15UmVzb3VyY2VJZmMgcmVzb3VyY2UyOworICAgIHByaXZhdGUgTXlSZXNvdXJjZUlmYyByZXNvdXJjZVdpdGhYTUw7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICAvLyBtdm4gdGVzdCAtRGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIuZmFjdG9yeT1vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmlubWVtb3J5LkluTWVtb3J5VGVzdENvbnRhaW5lckZhY3RvcnkKKyAgICAgICAgLy8gbXZuIHRlc3QgLURqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk9b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5ncml6emx5LkdyaXp6bHlUZXN0Q29udGFpbmVyRmFjdG9yeQorICAgICAgICAvLyBtdm4gdGVzdCAtRGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIuZmFjdG9yeT1vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0Lmpka2h0dHAuSmRrSHR0cFNlcnZlclRlc3RDb250YWluZXJGYWN0b3J5CisgICAgICAgIC8vIG12biB0ZXN0IC1EamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5mYWN0b3J5PW9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc2ltcGxlLlNpbXBsZVRlc3RDb250YWluZXJGYWN0b3J5CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisgICAgICAgIC8vICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKE15UmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIHJlc291cmNlID0gV2ViUmVzb3VyY2VGYWN0b3J5Lm5ld1Jlc291cmNlKE15UmVzb3VyY2VJZmMuY2xhc3MsIHRhcmdldCgpKTsKKyAgICAgICAgcmVzb3VyY2UyID0gV2ViUmVzb3VyY2VGYWN0b3J5Lm5ld1Jlc291cmNlKE15UmVzb3VyY2VJZmMuY2xhc3MsIHRhcmdldCgpKTsKKworICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaGVhZGVycyA9IG5ldyBNdWx0aXZhbHVlZEhhc2hNYXA8PigxKTsKKyAgICAgICAgaGVhZGVycy5hZGQoSHR0cEhlYWRlcnMuQ09OVEVOVF9UWVBFLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MKTsKKyAgICAgICAgcmVzb3VyY2VXaXRoWE1MID0gV2ViUmVzb3VyY2VGYWN0b3J5CisgICAgICAgICAgICAgICAgLm5ld1Jlc291cmNlKE15UmVzb3VyY2VJZmMuY2xhc3MsIHRhcmdldCgpLCBmYWxzZSwgaGVhZGVycywgQ29sbGVjdGlvbnMuPENvb2tpZT5lbXB0eUxpc3QoKSwgbmV3IEZvcm0oKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SXQoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiR290IGl0ISIsIHJlc291cmNlLmdldEl0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc3RJdCgpIHsKKyAgICAgICAgZmluYWwgTXlCZWFuIGJlYW4gPSBuZXcgTXlCZWFuKCk7CisgICAgICAgIGJlYW4ubmFtZSA9ICJBaG9qIjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBaG9qIiwgcmVzb3VyY2UucG9zdEl0KENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoYmVhbikpLmdldCgwKS5uYW1lKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0VmFsaWQoKSB7CisgICAgICAgIGZpbmFsIE15QmVhbiBiZWFuID0gbmV3IE15QmVhbigpOworICAgICAgICBiZWFuLm5hbWUgPSAiQWhvaiI7CisgICAgICAgIGFzc2VydEVxdWFscygiQWhvaiIsIHJlc291cmNlLnBvc3RWYWxpZChiZWFuKS5uYW1lKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXRoUGFyYW0oKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiam91ZGEiLCByZXNvdXJjZS5nZXRJZCgiam91ZGEiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UXVlcnlQYXJhbSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqaXJpIiwgcmVzb3VyY2UuZ2V0QnlOYW1lKCJqaXJpIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZvcm1QYXJhbSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqaXJpIiwgcmVzb3VyY2UucG9zdEJ5TmFtZUZvcm1QYXJhbSgiamlyaSIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb29raWVQYXJhbSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqaXJpIiwgcmVzb3VyY2UuZ2V0QnlOYW1lQ29va2llKCJqaXJpIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhlYWRlclBhcmFtKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoImppcmkiLCByZXNvdXJjZS5nZXRCeU5hbWVIZWFkZXIoImppcmkiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWF0cml4UGFyYW0oKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiamlyaSIsIHJlc291cmNlLmdldEJ5TmFtZU1hdHJpeCgiamlyaSIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJSZXNvdXJjZSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJHb3QgaXQhIiwgcmVzb3VyY2UuZ2V0U3ViUmVzb3VyY2UoKS5nZXRNeUJlYW4oKS5uYW1lKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RRdWVyeVBhcmFtc0FzTGlzdCgpIHsKKyAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgbGlzdC5hZGQoImEiKTsKKyAgICAgICAgbGlzdC5hZGQoImJiIik7CisgICAgICAgIGxpc3QuYWRkKCJjY2MiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIjM6W2EsIGJiLCBjY2NdIiwgcmVzb3VyY2UuZ2V0QnlOYW1lTGlzdChsaXN0KSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UXVlcnlQYXJhbXNBc1NldCgpIHsKKyAgICAgICAgZmluYWwgU2V0PFN0cmluZz4gc2V0ID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICBzZXQuYWRkKCJhIik7CisgICAgICAgIHNldC5hZGQoImJiIik7CisgICAgICAgIHNldC5hZGQoImNjYyIpOworCisgICAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQgPSByZXNvdXJjZS5nZXRCeU5hbWVTZXQoc2V0KTsKKyAgICAgICAgY2hlY2tTZXQocmVzdWx0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RRdWVyeVBhcmFtc0FzU29ydGVkU2V0KCkgeworICAgICAgICBmaW5hbCBTb3J0ZWRTZXQ8U3RyaW5nPiBzZXQgPSBuZXcgVHJlZVNldDw+KCk7CisgICAgICAgIHNldC5hZGQoImEiKTsKKyAgICAgICAgc2V0LmFkZCgiYmIiKTsKKyAgICAgICAgc2V0LmFkZCgiY2NjIik7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IHJlc291cmNlLmdldEJ5TmFtZVNvcnRlZFNldChzZXQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjM6W2EsIGJiLCBjY2NdIiwgcmVzdWx0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBJZ25vcmUoIlNlZSBpc3N1ZSBKRVJTRVktMjQ0MSIpCisgICAgcHVibGljIHZvaWQgdGVzdEhlYWRlckNvb2tpZUFzTGlzdCgpIHsKKyAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgbGlzdC5hZGQoImEiKTsKKyAgICAgICAgbGlzdC5hZGQoImJiIik7CisgICAgICAgIGxpc3QuYWRkKCJjY2MiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIjM6W2EsIGJiLCBjY2NdIiwgcmVzb3VyY2UuZ2V0QnlOYW1lQ29va2llTGlzdChsaXN0KSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBASWdub3JlKCJTZWUgaXNzdWUgSkVSU0VZLTI0NDEiKQorICAgIHB1YmxpYyB2b2lkIHRlc3RIZWFkZXJDb29raWVBc1NldCgpIHsKKyAgICAgICAgZmluYWwgU2V0PFN0cmluZz4gc2V0ID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICBzZXQuYWRkKCJhIik7CisgICAgICAgIHNldC5hZGQoImJiIik7CisgICAgICAgIHNldC5hZGQoImNjYyIpOworCisgICAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQgPSByZXNvdXJjZS5nZXRCeU5hbWVDb29raWVTZXQoc2V0KTsKKyAgICAgICAgY2hlY2tTZXQocmVzdWx0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBJZ25vcmUoIlNlZSBpc3N1ZSBKRVJTRVktMjQ0MSIpCisgICAgcHVibGljIHZvaWQgdGVzdEhlYWRlckNvb2tpZUFzU29ydGVkU2V0KCkgeworICAgICAgICBmaW5hbCBTb3J0ZWRTZXQ8U3RyaW5nPiBzZXQgPSBuZXcgVHJlZVNldDw+KCk7CisgICAgICAgIHNldC5hZGQoImEiKTsKKyAgICAgICAgc2V0LmFkZCgiYmIiKTsKKyAgICAgICAgc2V0LmFkZCgiY2NjIik7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IHJlc291cmNlLmdldEJ5TmFtZUNvb2tpZVNvcnRlZFNldChzZXQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjM6W2EsIGJiLCBjY2NdIiwgcmVzdWx0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNhbm5vdCB3b3JrIHdpdGggamVyc2V5IG5vdy4gU2VydmVyIHNpZGUgcGFyc2VzIGhlYWRlciBwYXJhbXMgb25seSBpZiB0aGV5IGFyZSBzZW5kIGFzIG1vcmUKKyAgICAgKiBsaW5lcyBpbiB0aGUgcmVxdWVzdC4gSmVyc2V5IGhhcyBjdXJyZW50bHkgbm8gcG9zc2liaWxpdHkgdG8gZG8gc28uIFNlZSBKRVJTRVktMjI2My4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIEBJZ25vcmUoIlNlZSBpc3N1ZSBKRVJTRVktMjI2MyIpCisgICAgcHVibGljIHZvaWQgdGVzdEhlYWRlclBhcmFtc0FzTGlzdCgpIHsKKyAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgbGlzdC5hZGQoImEiKTsKKyAgICAgICAgbGlzdC5hZGQoImJiIik7CisgICAgICAgIGxpc3QuYWRkKCJjY2MiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIjM6W2EsIGJiLCBjY2NdIiwgcmVzb3VyY2UuZ2V0QnlOYW1lSGVhZGVyTGlzdChsaXN0KSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBASWdub3JlKCJTZWUgaXNzdWUgSkVSU0VZLTIyNjMiKQorICAgIHB1YmxpYyB2b2lkIHRlc3RIZWFkZXJQYXJhbXNBc1NldCgpIHsKKyAgICAgICAgZmluYWwgU2V0PFN0cmluZz4gc2V0ID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICBzZXQuYWRkKCJhIik7CisgICAgICAgIHNldC5hZGQoImJiIik7CisgICAgICAgIHNldC5hZGQoImNjYyIpOworCisgICAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQgPSByZXNvdXJjZS5nZXRCeU5hbWVIZWFkZXJTZXQoc2V0KTsKKyAgICAgICAgY2hlY2tTZXQocmVzdWx0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBJZ25vcmUoIlNlZSBpc3N1ZSBKRVJTRVktMjI2MyIpCisgICAgcHVibGljIHZvaWQgdGVzdEhlYWRlclBhcmFtc0FzU29ydGVkU2V0KCkgeworICAgICAgICBmaW5hbCBTb3J0ZWRTZXQ8U3RyaW5nPiBzZXQgPSBuZXcgVHJlZVNldDw+KCk7CisgICAgICAgIHNldC5hZGQoImEiKTsKKyAgICAgICAgc2V0LmFkZCgiYmIiKTsKKyAgICAgICAgc2V0LmFkZCgiY2NjIik7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IHJlc291cmNlLmdldEJ5TmFtZUhlYWRlclNvcnRlZFNldChzZXQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjM6W2EsIGJiLCBjY2NdIiwgcmVzdWx0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXRyaXhQYXJhbXNBc0xpc3QoKSB7CisgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGxpc3QuYWRkKCJhIik7CisgICAgICAgIGxpc3QuYWRkKCJiYiIpOworICAgICAgICBsaXN0LmFkZCgiY2NjIik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIzOlthLCBiYiwgY2NjXSIsIHJlc291cmNlLmdldEJ5TmFtZU1hdHJpeExpc3QobGlzdCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hdHJpeFBhcmFtc0FzU2V0KCkgeworICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiBzZXQgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgIHNldC5hZGQoImEiKTsKKyAgICAgICAgc2V0LmFkZCgiYmIiKTsKKyAgICAgICAgc2V0LmFkZCgiY2NjIik7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IHJlc291cmNlLmdldEJ5TmFtZU1hdHJpeFNldChzZXQpOworICAgICAgICBjaGVja1NldChyZXN1bHQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hdHJpeFBhcmFtc0FzU29ydGVkU2V0KCkgeworICAgICAgICBmaW5hbCBTb3J0ZWRTZXQ8U3RyaW5nPiBzZXQgPSBuZXcgVHJlZVNldDw+KCk7CisgICAgICAgIHNldC5hZGQoImEiKTsKKyAgICAgICAgc2V0LmFkZCgiYmIiKTsKKyAgICAgICAgc2V0LmFkZCgiY2NjIik7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IHJlc291cmNlLmdldEJ5TmFtZU1hdHJpeFNvcnRlZFNldChzZXQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjM6W2EsIGJiLCBjY2NdIiwgcmVzdWx0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tTZXQoZmluYWwgU3RyaW5nIHJlc3VsdCkgeworICAgICAgICBhc3NlcnRUcnVlKCJTZXQgZG9lcyBub3QgY29udGFpbiAzIGl0ZW1zLiIsIHJlc3VsdC5zdGFydHNXaXRoKCIzOlsiKSk7CisgICAgICAgIGFzc2VydFRydWUoIlNldCBkb2VzIG5vdCBjb250YWluICdhJyBpdGVtLiIsIHJlc3VsdC5jb250YWlucygiYSIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU2V0IGRvZXMgbm90IGNvbnRhaW4gJ2JiJyBpdGVtLiIsIHJlc3VsdC5jb250YWlucygiYmIiKSk7CisgICAgICAgIGFzc2VydFRydWUoIlNldCBkb2VzIG5vdCBjb250YWluICdjY2MnIGl0ZW0uIiwgcmVzdWx0LmNvbnRhaW5zKCJjY2MiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9ybVBhcmFtc0FzTGlzdCgpIHsKKyAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgbGlzdC5hZGQoImEiKTsKKyAgICAgICAgbGlzdC5hZGQoImJiIik7CisgICAgICAgIGxpc3QuYWRkKCJjY2MiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIjM6W2EsIGJiLCBjY2NdIiwgcmVzb3VyY2UucG9zdEJ5TmFtZUZvcm1MaXN0KGxpc3QpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JtUGFyYW1zQXNTZXQoKSB7CisgICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IHNldCA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgc2V0LmFkZCgiYSIpOworICAgICAgICBzZXQuYWRkKCJiYiIpOworICAgICAgICBzZXQuYWRkKCJjY2MiKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzdWx0ID0gcmVzb3VyY2UucG9zdEJ5TmFtZUZvcm1TZXQoc2V0KTsKKyAgICAgICAgY2hlY2tTZXQocmVzdWx0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JtUGFyYW1zQXNTb3J0ZWRTZXQoKSB7CisgICAgICAgIGZpbmFsIFNvcnRlZFNldDxTdHJpbmc+IHNldCA9IG5ldyBUcmVlU2V0PD4oKTsKKyAgICAgICAgc2V0LmFkZCgiYSIpOworICAgICAgICBzZXQuYWRkKCJiYiIpOworICAgICAgICBzZXQuYWRkKCJjY2MiKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzdWx0ID0gcmVzb3VyY2UucG9zdEJ5TmFtZUZvcm1Tb3J0ZWRTZXQoc2V0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIzOlthLCBiYiwgY2NjXSIsIHJlc3VsdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWNjZXB0SGVhZGVyKCkgeworICAgICAgICBhc3NlcnRUcnVlKCJBY2NlcHQgSFRUUCBoZWFkZXIgZG9lcyBub3QgbWF0Y2ggQFByb2R1Y2VzIGFubm90YXRpb24iLCByZXNvdXJjZS5pc0FjY2VwdEhlYWRlclZhbGlkKG51bGwpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQdXRXaXRoRXhwbGljaXRDb250ZW50VHlwZSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJDb250ZW50LVR5cGUgSFRUUCBoZWFkZXIgZG9lcyBub3QgbWF0Y2ggZXhwbGljaXRseSBwcm92aWRlZCB0eXBlIiwgcmVzb3VyY2VXaXRoWE1MLnB1dEl0KG5ldyBNeUJlYW4oKSksCisgICAgICAgICAgICAgICAgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGFjdHVhbCA9IHJlc291cmNlLnRvU3RyaW5nKCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZCA9IHRhcmdldCgpLnBhdGgoIm15cmVzb3VyY2UiKS50b1N0cmluZygpOworCisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgYWN0dWFsKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNoQ29kZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbnQgaDEgPSByZXNvdXJjZS5oYXNoQ29kZSgpOworICAgICAgICBpbnQgaDIgPSByZXNvdXJjZTIuaGFzaENvZGUoKTsKKyAgICAgICAgYXNzZXJ0Tm90RXF1YWxzKCJUaGUgaGFzaCBjb2RlcyBzaG91bGQgbm90IG1hdGNoIiwgaDEsIGgyKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7CisgICAgICAgIGFzc2VydEZhbHNlKCJUaGUgdHdvIHJlc291cmNlIGluc3RhbmNlcyBzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQgZXF1YWxzIGFzIHRoZXkgYXJlIHVuaXF1ZSIsIHJlc291cmNlLmVxdWFscyhyZXNvdXJjZTIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvcngvcG9tLnhtbCBiL2V4dC9yeC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MjZjYzcKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvcngvcG9tLnhtbApAQCAtMCwwICsxLDU3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5yeDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LWV4dC1yeDwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgSmVyc2V5IGluY3ViYXRvciBmb3IgUmVhY3RpdmUgKFJ4KSBtb2R1bGVzIHRoYXQgYXJlIGluIGEgcHJvdG90eXBpbmcgb3IgcmVzZWFyY2ggc3RhZ2UsCisgICAgICAgIG5vdCByZWFkeSB0byBiZSByZWxlYXNlZCBhcyBwYXJ0IG9mIEplcnNleSAoeWV0KS4KKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPG1vZHVsZXM+CisgICAgICAgIDxtb2R1bGU+cngtY2xpZW50LWd1YXZhPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+cngtY2xpZW50LXJ4amF2YTwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnJ4LWNsaWVudC1yeGphdmEyPC9tb2R1bGU+CisgICAgPC9tb2R1bGVzPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmhhbWNyZXN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGFtY3Jlc3QtbGlicmFyeTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvZXh0L3J4L3J4LWNsaWVudC1ndWF2YS9wb20ueG1sIGIvZXh0L3J4L3J4LWNsaWVudC1ndWF2YS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNjFkZDEKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvcngvcngtY2xpZW50LWd1YXZhL3BvbS54bWwKQEAgLTAsMCArMSw0NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIj8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LnJ4PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LXJ4LWNsaWVudC1ndWF2YTwvYXJ0aWZhY3RJZD4KKyAgICA8bmFtZT5qZXJzZXktZXh0LXJ4LWNsaWVudC1ndWF2YTwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgUmVhY3RpdmUgQ2xpZW50IC0gR3VhdmEgKExpc3RlbmFibGVGdXR1cmUpIHByb3ZpZGVyLjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY2xpZW50PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmd1YXZhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z3VhdmE8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4dC9yeC9yeC1jbGllbnQtZ3VhdmEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvcngvZ3VhdmEvSmVyc2V5UnhMaXN0ZW5hYmxlRnV0dXJlSW52b2tlci5qYXZhIGIvZXh0L3J4L3J4LWNsaWVudC1ndWF2YS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9yeC9ndWF2YS9KZXJzZXlSeExpc3RlbmFibGVGdXR1cmVJbnZva2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI3YTk4YQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9yeC9yeC1jbGllbnQtZ3VhdmEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvcngvZ3VhdmEvSmVyc2V5UnhMaXN0ZW5hYmxlRnV0dXJlSW52b2tlci5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnJ4Lmd1YXZhOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuU3luY0ludm9rZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljVHlwZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5BYnN0cmFjdFJ4SW52b2tlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uTGF6eVZhbHVlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5WYWx1ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uVmFsdWVzOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50Lkxpc3RlbmFibGVGdXR1cmU7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udXRpbC5jb25jdXJyZW50Lkxpc3RlbmluZ0V4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuTW9yZUV4ZWN1dG9yczsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBSZWFjdGl2ZSBJbnZva2VyIGZvciB7QGNvZGUgTGlzdGVuYWJsZUZ1dHVyZX0uCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICogQHNpbmNlIDIuMTMKKyAqLworZmluYWwgY2xhc3MgSmVyc2V5UnhMaXN0ZW5hYmxlRnV0dXJlSW52b2tlciBleHRlbmRzIEFic3RyYWN0UnhJbnZva2VyPExpc3RlbmFibGVGdXR1cmU+IGltcGxlbWVudHMgUnhMaXN0ZW5hYmxlRnV0dXJlSW52b2tlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMYXp5VmFsdWU8TGlzdGVuaW5nRXhlY3V0b3JTZXJ2aWNlPiBERUZBVUxUX0VYRUNVVE9SX1NFUlZJQ0UgPQorICAgICAgICAgICAgVmFsdWVzLmxhenkobmV3IFZhbHVlPExpc3RlbmluZ0V4ZWN1dG9yU2VydmljZT4oKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIExpc3RlbmluZ0V4ZWN1dG9yU2VydmljZSBnZXQoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBNb3JlRXhlY3V0b3JzLm5ld0RpcmVjdEV4ZWN1dG9yU2VydmljZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0ZW5pbmdFeGVjdXRvclNlcnZpY2Ugc2VydmljZTsKKworICAgIEplcnNleVJ4TGlzdGVuYWJsZUZ1dHVyZUludm9rZXIoZmluYWwgU3luY0ludm9rZXIgc3luY0ludm9rZXIsIGZpbmFsIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvcikgeworICAgICAgICBzdXBlcihzeW5jSW52b2tlciwgZXhlY3V0b3IpOworCisgICAgICAgIGlmIChleGVjdXRvciA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBUT0RPOiB1c2UgSkFYLVJTIGNsaWVudCBzY2hlZHVsZXIKKyAgICAgICAgICAgIC8vIFRPRE86IGh0dHBzOi8vamF2YS5uZXQvamlyYS9icm93c2UvSkFYX1JTX1NQRUMtNTIzCisgICAgICAgICAgICBzZXJ2aWNlID0gREVGQVVMVF9FWEVDVVRPUl9TRVJWSUNFLmdldCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VydmljZSA9IE1vcmVFeGVjdXRvcnMubGlzdGVuaW5nRGVjb3JhdG9yKGV4ZWN1dG9yKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gTGlzdGVuYWJsZUZ1dHVyZTxUPiBtZXRob2QoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIEVudGl0eTw/PiBlbnRpdHksIGZpbmFsIENsYXNzPFQ+IHJlc3BvbnNlVHlwZSkgeworICAgICAgICByZXR1cm4gc2VydmljZS5zdWJtaXQoKCkgLT4gZ2V0U3luY0ludm9rZXIoKS5tZXRob2QobmFtZSwgZW50aXR5LCByZXNwb25zZVR5cGUpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFQ+IExpc3RlbmFibGVGdXR1cmU8VD4gbWV0aG9kKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBFbnRpdHk8Pz4gZW50aXR5LCBmaW5hbCBHZW5lcmljVHlwZTxUPiByZXNwb25zZVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHNlcnZpY2Uuc3VibWl0KCgpIC0+IGdldFN5bmNJbnZva2VyKCkubWV0aG9kKG5hbWUsIGVudGl0eSwgcmVzcG9uc2VUeXBlKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L3J4L3J4LWNsaWVudC1ndWF2YS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9yeC9ndWF2YS9SeExpc3RlbmFibGVGdXR1cmVJbnZva2VyLmphdmEgYi9leHQvcngvcngtY2xpZW50LWd1YXZhL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L3J4L2d1YXZhL1J4TGlzdGVuYWJsZUZ1dHVyZUludm9rZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWIyMGM1Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L3J4L3J4LWNsaWVudC1ndWF2YS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9yeC9ndWF2YS9SeExpc3RlbmFibGVGdXR1cmVJbnZva2VyLmphdmEKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnJ4Lmd1YXZhOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuUnhJbnZva2VyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY1R5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5MaXN0ZW5hYmxlRnV0dXJlOworCisvKioKKyAqIFJlYWN0aXZlIGludm9rZXIgcHJvdmlkaW5nIHN1cHBvcnQgZm9yIHtAbGluayBjb20uZ29vZ2xlLmNvbW1vbi51dGlsLmNvbmN1cnJlbnQuTGlzdGVuYWJsZUZ1dHVyZSBMaXN0ZW5hYmxlRnV0dXJlfSBmcm9tIEd1YXZhLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICogQHNpbmNlIDIuMTMKKyAqLworcHVibGljIGludGVyZmFjZSBSeExpc3RlbmFibGVGdXR1cmVJbnZva2VyIGV4dGVuZHMgUnhJbnZva2VyPExpc3RlbmFibGVGdXR1cmU+IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0ZW5hYmxlRnV0dXJlPFJlc3BvbnNlPiBnZXQoKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gTGlzdGVuYWJsZUZ1dHVyZTxUPiBnZXQoQ2xhc3M8VD4gcmVzcG9uc2VUeXBlKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gTGlzdGVuYWJsZUZ1dHVyZTxUPiBnZXQoR2VuZXJpY1R5cGU8VD4gcmVzcG9uc2VUeXBlKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0ZW5hYmxlRnV0dXJlPFJlc3BvbnNlPiBwdXQoRW50aXR5PD8+IGVudGl0eSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFQ+IExpc3RlbmFibGVGdXR1cmU8VD4gcHV0KEVudGl0eTw/PiBlbnRpdHksIENsYXNzPFQ+IGNsYXp6KTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gTGlzdGVuYWJsZUZ1dHVyZTxUPiBwdXQoRW50aXR5PD8+IGVudGl0eSwgR2VuZXJpY1R5cGU8VD4gdHlwZSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdGVuYWJsZUZ1dHVyZTxSZXNwb25zZT4gcG9zdChFbnRpdHk8Pz4gZW50aXR5KTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gTGlzdGVuYWJsZUZ1dHVyZTxUPiBwb3N0KEVudGl0eTw/PiBlbnRpdHksIENsYXNzPFQ+IGNsYXp6KTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gTGlzdGVuYWJsZUZ1dHVyZTxUPiBwb3N0KEVudGl0eTw/PiBlbnRpdHksIEdlbmVyaWNUeXBlPFQ+IHR5cGUpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3RlbmFibGVGdXR1cmU8UmVzcG9uc2U+IGRlbGV0ZSgpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxUPiBMaXN0ZW5hYmxlRnV0dXJlPFQ+IGRlbGV0ZShDbGFzczxUPiByZXNwb25zZVR5cGUpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxUPiBMaXN0ZW5hYmxlRnV0dXJlPFQ+IGRlbGV0ZShHZW5lcmljVHlwZTxUPiByZXNwb25zZVR5cGUpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3RlbmFibGVGdXR1cmU8UmVzcG9uc2U+IGhlYWQoKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0ZW5hYmxlRnV0dXJlPFJlc3BvbnNlPiBvcHRpb25zKCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFQ+IExpc3RlbmFibGVGdXR1cmU8VD4gb3B0aW9ucyhDbGFzczxUPiByZXNwb25zZVR5cGUpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxUPiBMaXN0ZW5hYmxlRnV0dXJlPFQ+IG9wdGlvbnMoR2VuZXJpY1R5cGU8VD4gcmVzcG9uc2VUeXBlKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0ZW5hYmxlRnV0dXJlPFJlc3BvbnNlPiB0cmFjZSgpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxUPiBMaXN0ZW5hYmxlRnV0dXJlPFQ+IHRyYWNlKENsYXNzPFQ+IHJlc3BvbnNlVHlwZSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFQ+IExpc3RlbmFibGVGdXR1cmU8VD4gdHJhY2UoR2VuZXJpY1R5cGU8VD4gcmVzcG9uc2VUeXBlKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0ZW5hYmxlRnV0dXJlPFJlc3BvbnNlPiBtZXRob2QoU3RyaW5nIG5hbWUpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxUPiBMaXN0ZW5hYmxlRnV0dXJlPFQ+IG1ldGhvZChTdHJpbmcgbmFtZSwgQ2xhc3M8VD4gcmVzcG9uc2VUeXBlKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gTGlzdGVuYWJsZUZ1dHVyZTxUPiBtZXRob2QoU3RyaW5nIG5hbWUsIEdlbmVyaWNUeXBlPFQ+IHJlc3BvbnNlVHlwZSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdGVuYWJsZUZ1dHVyZTxSZXNwb25zZT4gbWV0aG9kKFN0cmluZyBuYW1lLCBFbnRpdHk8Pz4gZW50aXR5KTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gTGlzdGVuYWJsZUZ1dHVyZTxUPiBtZXRob2QoU3RyaW5nIG5hbWUsIEVudGl0eTw/PiBlbnRpdHksIENsYXNzPFQ+IHJlc3BvbnNlVHlwZSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFQ+IExpc3RlbmFibGVGdXR1cmU8VD4gbWV0aG9kKFN0cmluZyBuYW1lLCBFbnRpdHk8Pz4gZW50aXR5LCBHZW5lcmljVHlwZTxUPiByZXNwb25zZVR5cGUpOworfQpkaWZmIC0tZ2l0IGEvZXh0L3J4L3J4LWNsaWVudC1ndWF2YS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9yeC9ndWF2YS9SeExpc3RlbmFibGVGdXR1cmVJbnZva2VyUHJvdmlkZXIuamF2YSBiL2V4dC9yeC9yeC1jbGllbnQtZ3VhdmEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvcngvZ3VhdmEvUnhMaXN0ZW5hYmxlRnV0dXJlSW52b2tlclByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM5N2RkOAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9yeC9yeC1jbGllbnQtZ3VhdmEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvcngvZ3VhdmEvUnhMaXN0ZW5hYmxlRnV0dXJlSW52b2tlclByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQucnguZ3VhdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuUnhJbnZva2VyUHJvdmlkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LlN5bmNJbnZva2VyOworCisvKioKKyAqIEludm9rZXIgcHJvdmlkZXIgZm9yIGludm9rZXJzIGJhc2VkIG9uIEd1YXZhJ3Mge0Bjb2RlIExpc3RlbmFibGVGdXR1cmV9LgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBzaW5jZSAyLjEzCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBSeExpc3RlbmFibGVGdXR1cmVJbnZva2VyUHJvdmlkZXIgaW1wbGVtZW50cyBSeEludm9rZXJQcm92aWRlcjxSeExpc3RlbmFibGVGdXR1cmVJbnZva2VyPiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Byb3ZpZGVyRm9yKENsYXNzIGNsYXp6KSB7CisgICAgICAgIHJldHVybiBSeExpc3RlbmFibGVGdXR1cmVJbnZva2VyLmNsYXNzLmVxdWFscyhjbGF6eik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEplcnNleVJ4TGlzdGVuYWJsZUZ1dHVyZUludm9rZXIgZ2V0UnhJbnZva2VyKFN5bmNJbnZva2VyIHN5bmNJbnZva2VyLCBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlKSB7CisgICAgICAgIHJldHVybiBuZXcgSmVyc2V5UnhMaXN0ZW5hYmxlRnV0dXJlSW52b2tlcihzeW5jSW52b2tlciwgZXhlY3V0b3JTZXJ2aWNlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvcngvcngtY2xpZW50LWd1YXZhL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L3J4L2d1YXZhL3BhY2thZ2UtaW5mby5qYXZhIGIvZXh0L3J4L3J4LWNsaWVudC1ndWF2YS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9yeC9ndWF2YS9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTVlYjFjCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3J4L3J4LWNsaWVudC1ndWF2YS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9yeC9ndWF2YS9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvKioKKyAqIEplcnNleSBSZWFjdGl2ZSBDbGllbnQgLSBHdWF2YSAoTGlzdGVuYWJsZUZ1dHVyZSkgcHJvdmlkZXIuCisgKi8KK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnJ4Lmd1YXZhOwpkaWZmIC0tZ2l0IGEvZXh0L3J4L3J4LWNsaWVudC1ndWF2YS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnJ4LnNwaS5SeEludm9rZXJQcm92aWRlciBiL2V4dC9yeC9yeC1jbGllbnQtZ3VhdmEvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5yeC5zcGkuUnhJbnZva2VyUHJvdmlkZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI0NjY5OQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9yeC9yeC1jbGllbnQtZ3VhdmEvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5yeC5zcGkuUnhJbnZva2VyUHJvdmlkZXIKQEAgLTAsMCArMSBAQAorb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnJ4Lmd1YXZhLlJ4TGlzdGVuYWJsZUZ1dHVyZUludm9rZXJQcm92aWRlcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4dC9yeC9yeC1jbGllbnQtZ3VhdmEvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvcngvZ3VhdmEvUnhMaXN0ZW5hYmxlRnV0dXJlVGVzdC5qYXZhIGIvZXh0L3J4L3J4LWNsaWVudC1ndWF2YS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9yeC9ndWF2YS9SeExpc3RlbmFibGVGdXR1cmVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNhOTdjZgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9yeC9yeC1jbGllbnQtZ3VhdmEvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvcngvZ3VhdmEvUnhMaXN0ZW5hYmxlRnV0dXJlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTYzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5yeC5ndWF2YTsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3I7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Ob3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY1R5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhLlRocmVhZEZhY3RvcnlCdWlsZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuSmVyc2V5UHJvY2Vzc2luZ1VuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcjsKKworaW1wb3J0IG9yZy5oYW1jcmVzdC5NYXRjaGVyOworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuY29udGFpbnNTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5ub3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5jb3JlLklzLmlzOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgUnhMaXN0ZW5hYmxlRnV0dXJlVGVzdCB7CisKKyAgICBwcml2YXRlIENsaWVudCBjbGllbnQ7CisgICAgcHJpdmF0ZSBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3I7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKS5yZWdpc3RlcihUZXJtaW5hbENsaWVudFJlcXVlc3RGaWx0ZXIuY2xhc3MpOworICAgICAgICBleGVjdXRvciA9IG5ldyBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3IoMSwgbmV3IFRocmVhZEZhY3RvcnlCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0TmFtZUZvcm1hdCgiamVyc2V5LXJ4LWNsaWVudC10ZXN0LSVkIikKKyAgICAgICAgICAgICAgICAuc2V0VW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyKG5ldyBKZXJzZXlQcm9jZXNzaW5nVW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyKCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGV4ZWN1dG9yLnNodXRkb3duKCk7CisgICAgICAgIGNsaWVudCA9IG51bGw7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90Rm91bmRSZXNwb25zZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBjbGllbnQucmVnaXN0ZXIoUnhMaXN0ZW5hYmxlRnV0dXJlSW52b2tlclByb3ZpZGVyLmNsYXNzKTsKKworICAgICAgICBmaW5hbCBSeExpc3RlbmFibGVGdXR1cmVJbnZva2VyIGludm9rZXIgPSBjbGllbnQudGFyZ2V0KCJodHRwOi8vamVyc2V5LmphdmEubmV0IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaGVhZGVyKCJSZXNwb25zZS1TdGF0dXMiLCA0MDQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yeChSeExpc3RlbmFibGVGdXR1cmVJbnZva2VyLmNsYXNzKTsKKworICAgICAgICB0ZXN0SW52b2tlcihpbnZva2VyLCA0MDQsIGZhbHNlKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IE5vdEZvdW5kRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RGb3VuZFJlYWRFbnRpdHlWaWFDbGFzcygpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBjbGllbnQucmVnaXN0ZXIoUnhMaXN0ZW5hYmxlRnV0dXJlSW52b2tlclByb3ZpZGVyLmNsYXNzKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2xpZW50LnRhcmdldCgiaHR0cDovL2plcnNleS5qYXZhLm5ldCIpCisgICAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgICAuaGVhZGVyKCJSZXNwb25zZS1TdGF0dXMiLCA0MDQpCisgICAgICAgICAgICAgICAgICAucngoUnhMaXN0ZW5hYmxlRnV0dXJlSW52b2tlci5jbGFzcykKKyAgICAgICAgICAgICAgICAgIC5nZXQoU3RyaW5nLmNsYXNzKQorICAgICAgICAgICAgICAgICAgLmdldCgpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKworICAgICAgICAgICAgLy8gamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uCisgICAgICAgICAgICB0aHJvdyBleHBlY3RlZAorICAgICAgICAgICAgICAgICAgICAvLyBqYXZheC53cy5ycy5Ob3RGb3VuZEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAuZ2V0Q2F1c2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gTm90Rm91bmRFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdE5vdEZvdW5kUmVhZEVudGl0eVZpYUdlbmVyaWNUeXBlKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGNsaWVudC5yZWdpc3RlcihSeExpc3RlbmFibGVGdXR1cmVJbnZva2VyUHJvdmlkZXIuY2xhc3MpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjbGllbnQudGFyZ2V0KCJodHRwOi8vamVyc2V5LmphdmEubmV0IikKKyAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAgIC5oZWFkZXIoIlJlc3BvbnNlLVN0YXR1cyIsIDQwNCkKKyAgICAgICAgICAgICAgICAgIC5yeChSeExpc3RlbmFibGVGdXR1cmVJbnZva2VyLmNsYXNzKQorICAgICAgICAgICAgICAgICAgLmdldChuZXcgR2VuZXJpY1R5cGU8U3RyaW5nPigpIHsKKyAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAuZ2V0KCk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBleHBlY3RlZCkgeworCisgICAgICAgICAgICBleHBlY3RlZC5wcmludFN0YWNrVHJhY2UoKTsKKworICAgICAgICAgICAgLy8gamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uCisgICAgICAgICAgICB0aHJvdyBleHBlY3RlZAorICAgICAgICAgICAgICAgICAgICAvLyBqYXZheC53cy5ycy5Ob3RGb3VuZEV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAuZ2V0Q2F1c2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRFbnRpdHlWaWFDbGFzcygpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBjbGllbnQucmVnaXN0ZXIoUnhMaXN0ZW5hYmxlRnV0dXJlSW52b2tlclByb3ZpZGVyLmNsYXNzKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzcG9uc2UgPSBjbGllbnQudGFyZ2V0KCJodHRwOi8vamVyc2V5LmphdmEubmV0IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucngoUnhMaXN0ZW5hYmxlRnV0dXJlSW52b2tlci5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldChTdHJpbmcuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLCBpcygiTk8tRU5USVRZIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRFbnRpdHlWaWFHZW5lcmljVHlwZSgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBjbGllbnQucmVnaXN0ZXIoUnhMaXN0ZW5hYmxlRnV0dXJlSW52b2tlclByb3ZpZGVyLmNsYXNzKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzcG9uc2UgPSBjbGllbnQudGFyZ2V0KCJodHRwOi8vamVyc2V5LmphdmEubmV0IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucngoUnhMaXN0ZW5hYmxlRnV0dXJlSW52b2tlci5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldChuZXcgR2VuZXJpY1R5cGU8U3RyaW5nPigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldCgpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UsIGlzKCJOTy1FTlRJVFkiKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RJbnZva2VyKGZpbmFsIFJ4TGlzdGVuYWJsZUZ1dHVyZUludm9rZXIgcngsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBleHBlY3RlZFN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiB0ZXN0RGVkaWNhdGVkVGhyZWFkKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdFJlc3BvbnNlKHJ4LmdldCgpLmdldCgpLCBleHBlY3RlZFN0YXR1cywgdGVzdERlZGljYXRlZFRocmVhZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0ZXN0UmVzcG9uc2UoZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UsIGZpbmFsIGludCBleHBlY3RlZFN0YXR1cywgZmluYWwgYm9vbGVhbiB0ZXN0RGVkaWNhdGVkVGhyZWFkKSB7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKGV4cGVjdGVkU3RhdHVzKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBpcygiTk8tRU5USVRZIikpOworCisgICAgICAgIC8vIEV4ZWN1dG9yLgorICAgICAgICBmaW5hbCBNYXRjaGVyPFN0cmluZz4gbWF0Y2hlciA9IGNvbnRhaW5zU3RyaW5nKCJqZXJzZXktcngtY2xpZW50LXRlc3QiKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIlRlc3QtVGhyZWFkIiksIHRlc3REZWRpY2F0ZWRUaHJlYWQgPyBtYXRjaGVyIDogbm90KG1hdGNoZXIpKTsKKworICAgICAgICAvLyBQcm9wZXJ0aWVzLgorICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiVGVzdC1VcmkiKSwgaXMoImh0dHA6Ly9qZXJzZXkuamF2YS5uZXQiKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJUZXN0LU1ldGhvZCIpLCBpcygiR0VUIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9yeC9yeC1jbGllbnQtZ3VhdmEvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvcngvZ3VhdmEvVGVybWluYWxDbGllbnRSZXF1ZXN0RmlsdGVyLmphdmEgYi9leHQvcngvcngtY2xpZW50LWd1YXZhL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L3J4L2d1YXZhL1Rlcm1pbmFsQ2xpZW50UmVxdWVzdEZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxYWRhZWMKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvcngvcngtY2xpZW50LWd1YXZhL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L3J4L2d1YXZhL1Rlcm1pbmFsQ2xpZW50UmVxdWVzdEZpbHRlci5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnJ4Lmd1YXZhOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworY2xhc3MgVGVybWluYWxDbGllbnRSZXF1ZXN0RmlsdGVyIGltcGxlbWVudHMgQ2xpZW50UmVxdWVzdEZpbHRlciB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoZmluYWwgQ2xpZW50UmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIE9idGFpbiBlbnRpdHkgLSBmcm9tIHJlcXVlc3Qgb3IgY3JlYXRlIG5ldy4KKyAgICAgICAgZmluYWwgQnl0ZUFycmF5SW5wdXRTdHJlYW0gZW50aXR5ID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKAorICAgICAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0Lmhhc0VudGl0eSgpID8gcmVxdWVzdENvbnRleHQuZ2V0RW50aXR5KCkudG9TdHJpbmcoKS5nZXRCeXRlcygpIDogIk5PLUVOVElUWSIuZ2V0Qnl0ZXMoKQorICAgICAgICApOworCisgICAgICAgIGZpbmFsIGludCByZXNwb25zZVN0YXR1cyA9IHJlcXVlc3RDb250ZXh0LmdldEhlYWRlcnMoKS5nZXRGaXJzdCgiUmVzcG9uc2UtU3RhdHVzIikgIT0gbnVsbAorICAgICAgICAgICAgICAgID8gKGludCkgcmVxdWVzdENvbnRleHQuZ2V0SGVhZGVycygpLmdldEZpcnN0KCJSZXNwb25zZS1TdGF0dXMiKSA6IDIwMDsKKyAgICAgICAgUmVzcG9uc2UuUmVzcG9uc2VCdWlsZGVyIHJlc3BvbnNlID0gUmVzcG9uc2Uuc3RhdHVzKHJlc3BvbnNlU3RhdHVzKQorICAgICAgICAgICAgICAgIC5lbnRpdHkoZW50aXR5KQorICAgICAgICAgICAgICAgIC50eXBlKCJhcHBsaWNhdGlvbi9qc29uIikKKyAgICAgICAgICAgICAgICAvLyBUZXN0IHByb3BlcnRpZXMuCisgICAgICAgICAgICAgICAgLmhlYWRlcigiVGVzdC1UaHJlYWQiLCBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSkKKyAgICAgICAgICAgICAgICAuaGVhZGVyKCJUZXN0LVVyaSIsIHJlcXVlc3RDb250ZXh0LmdldFVyaSgpLnRvU3RyaW5nKCkpCisgICAgICAgICAgICAgICAgLmhlYWRlcigiVGVzdC1NZXRob2QiLCByZXF1ZXN0Q29udGV4dC5nZXRNZXRob2QoKSk7CisKKyAgICAgICAgLy8gUmVxdWVzdCBoZWFkZXJzIC0+IFJlc3BvbnNlIGhlYWRlcnMgKDxoZWFkZXI+IC0+IFRlc3QtSGVhZGVyLTxoZWFkZXI+KQorICAgICAgICBmb3IgKGZpbmFsIE11bHRpdmFsdWVkTWFwLkVudHJ5PFN0cmluZywgTGlzdDxTdHJpbmc+PiBlbnRyeSA6IHJlcXVlc3RDb250ZXh0LmdldFN0cmluZ0hlYWRlcnMoKS5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICByZXNwb25zZSA9IHJlc3BvbnNlLmhlYWRlcigiVGVzdC1IZWFkZXItIiArIGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlcXVlc3QgcHJvcGVydGllcyAtPiBSZXNwb25zZSBoZWFkZXJzICg8aGVhZGVyPiAtPiBUZXN0LVByb3BlcnR5LTxoZWFkZXI+KQorICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBwcm9wZXJ0eSA6IHJlcXVlc3RDb250ZXh0LmdldFByb3BlcnR5TmFtZXMoKSkgeworICAgICAgICAgICAgcmVzcG9uc2UgPSByZXNwb25zZS5oZWFkZXIoIlRlc3QtUHJvcGVydHktIiArIHByb3BlcnR5LCByZXF1ZXN0Q29udGV4dC5nZXRQcm9wZXJ0eShwcm9wZXJ0eSkpOworICAgICAgICB9CisKKyAgICAgICAgcmVxdWVzdENvbnRleHQuYWJvcnRXaXRoKHJlc3BvbnNlLmJ1aWxkKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9yeC9yeC1jbGllbnQtcnhqYXZhL3BvbS54bWwgYi9leHQvcngvcngtY2xpZW50LXJ4amF2YS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZmVjNjcKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvcngvcngtY2xpZW50LXJ4amF2YS9wb20ueG1sCkBAIC0wLDAgKzEsNDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5yeDwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmplcnNleS1yeC1jbGllbnQtcnhqYXZhPC9hcnRpZmFjdElkPgorICAgIDxuYW1lPmplcnNleS1leHQtcngtY2xpZW50LXJ4amF2YTwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgUmVhY3RpdmUgQ2xpZW50IC0gUnhKYXZhIChPYnNlcnZhYmxlKSBwcm92aWRlci48L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNsaWVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+aW8ucmVhY3RpdmV4PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+cnhqYXZhPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtyeGphdmEudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4dC9yeC9yeC1jbGllbnQtcnhqYXZhL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L3J4L3J4amF2YS9KZXJzZXlSeE9ic2VydmFibGVJbnZva2VyLmphdmEgYi9leHQvcngvcngtY2xpZW50LXJ4amF2YS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9yeC9yeGphdmEvSmVyc2V5UnhPYnNlcnZhYmxlSW52b2tlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYzJiODAKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvcngvcngtY2xpZW50LXJ4amF2YS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9yeC9yeGphdmEvSmVyc2V5UnhPYnNlcnZhYmxlSW52b2tlci5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnJ4LnJ4amF2YTsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LlN5bmNJbnZva2VyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY1R5cGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQWJzdHJhY3RSeEludm9rZXI7CisKK2ltcG9ydCByeC5PYnNlcnZhYmxlOworaW1wb3J0IHJ4LlNjaGVkdWxlcjsKK2ltcG9ydCByeC5zY2hlZHVsZXJzLlNjaGVkdWxlcnM7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgUmVhY3RpdmUgSW52b2tlciBmb3Ige0Bjb2RlIE9ic2VydmFibGV9LiBJZiBubyBleGVjdXRvciBzZXJ2aWNlIGlzIHByb3ZpZGVkIHRoZSBKQVgtUlMgQXN5bmMgY2xpZW50IGlzIHVzZWQKKyAqIHRvIHJldHJpZXZlIGRhdGEgd2hlbiBhIHN1YnNjcmliZXIgaXMgc3Vic2NyaWJlZC4gV2hlbiBhbiBleGVjdXRvciBzZXJ2aWNlIGlzIHByb3ZpZGVkIGEgc3luYyBjYWxsIGlzIGludm9rZWQgb24gYSB0aHJlYWQKKyAqIHByb3ZpZGVkIG9uIGZyb20gdGhpcyBzZXJ2aWNlLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICogQHNpbmNlIDIuMTMKKyAqLworZmluYWwgY2xhc3MgSmVyc2V5UnhPYnNlcnZhYmxlSW52b2tlciBleHRlbmRzIEFic3RyYWN0UnhJbnZva2VyPE9ic2VydmFibGU+IGltcGxlbWVudHMgUnhPYnNlcnZhYmxlSW52b2tlciB7CisKKyAgICBKZXJzZXlSeE9ic2VydmFibGVJbnZva2VyKGZpbmFsIFN5bmNJbnZva2VyIHN5bmNJbnZva2VyLCBmaW5hbCBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3IpIHsKKyAgICAgICAgc3VwZXIoc3luY0ludm9rZXIsIGV4ZWN1dG9yKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFQ+IE9ic2VydmFibGU8VD4gbWV0aG9kKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBFbnRpdHk8Pz4gZW50aXR5LCBmaW5hbCBDbGFzczxUPiByZXNwb25zZVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIG1ldGhvZChuYW1lLCBlbnRpdHksIG5ldyBHZW5lcmljVHlwZTxUPihyZXNwb25zZVR5cGUpIHsgfSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxUPiBPYnNlcnZhYmxlPFQ+IG1ldGhvZChmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgRW50aXR5PD8+IGVudGl0eSwgZmluYWwgR2VuZXJpY1R5cGU8VD4gcmVzcG9uc2VUeXBlKSB7CisgICAgICAgIGZpbmFsIFNjaGVkdWxlciBzY2hlZHVsZXI7CisKKyAgICAgICAgaWYgKGdldEV4ZWN1dG9yU2VydmljZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNjaGVkdWxlciA9IFNjaGVkdWxlcnMuZnJvbShnZXRFeGVjdXRvclNlcnZpY2UoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUT0RPOiB1c2UgSkFYLVJTIGNsaWVudCBzY2hlZHVsZXIKKyAgICAgICAgICAgIC8vIFRPRE86IGh0dHBzOi8vamF2YS5uZXQvamlyYS9icm93c2UvSkFYX1JTX1NQRUMtNTIzCisgICAgICAgICAgICBzY2hlZHVsZXIgPSBTY2hlZHVsZXJzLmlvKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBJbnZva2UgYXMgc3luYyBKQVgtUlMgY2xpZW50IHJlcXVlc3QgYW5kIHN1YnNjcmliZS9vYnNlcnZlIG9uIGEgc2NoZWR1bGVyIGluaXRpYWxpemVkIHdpdGggZXhlY3V0b3Igc2VydmljZS4KKyAgICAgICAgcmV0dXJuIE9ic2VydmFibGUuY3JlYXRlKChPYnNlcnZhYmxlLk9uU3Vic2NyaWJlPFQ+KSBzdWJzY3JpYmVyIC0+IHsKKyAgICAgICAgICAgIGlmICghc3Vic2NyaWJlci5pc1Vuc3Vic2NyaWJlZCgpKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgVCByZXNwb25zZSA9IGdldFN5bmNJbnZva2VyKCkubWV0aG9kKG5hbWUsIGVudGl0eSwgcmVzcG9uc2VUeXBlKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIXN1YnNjcmliZXIuaXNVbnN1YnNjcmliZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5vbk5leHQocmVzcG9uc2UpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghc3Vic2NyaWJlci5pc1Vuc3Vic2NyaWJlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLm9uQ29tcGxldGVkKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghc3Vic2NyaWJlci5pc1Vuc3Vic2NyaWJlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLm9uRXJyb3IodGhyb3dhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSkuc3Vic2NyaWJlT24oc2NoZWR1bGVyKS5vYnNlcnZlT24oc2NoZWR1bGVyKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvcngvcngtY2xpZW50LXJ4amF2YS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9yeC9yeGphdmEvUnhPYnNlcnZhYmxlSW52b2tlci5qYXZhIGIvZXh0L3J4L3J4LWNsaWVudC1yeGphdmEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvcngvcnhqYXZhL1J4T2JzZXJ2YWJsZUludm9rZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGQ2MjQzCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3J4L3J4LWNsaWVudC1yeGphdmEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvcngvcnhqYXZhL1J4T2JzZXJ2YWJsZUludm9rZXIuamF2YQpAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQucngucnhqYXZhOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuUnhJbnZva2VyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY1R5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IHJ4Lk9ic2VydmFibGU7CisKKy8qKgorICogUmVhY3RpdmUgaW52b2tlciBwcm92aWRpbmcgc3VwcG9ydCBmb3Ige0BsaW5rIHJ4Lk9ic2VydmFibGUgb2JzZXJ2YWJsZX0gZnJvbSBSeEphdmEuCisgKiA8cC8+CisgKiBSZXF1ZXN0cyBhcmUgYnkgZGVmYXVsdCBpbnZva2VkIG9uIGEgc2VwYXJhdGUgdGhyZWFkIChhcyBKQVgtUlMgQXN5bmMgY2xpZW50IHJlcXVlc3RzKS4gVGhpcyBiZWhhdmlvciBjYW4gYmUgb3ZlcnJpZGRlbiBieQorICogcHJvdmlkaW5nIGEge0BsaW5rIGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZSBleGVjdXRvciBzZXJ2aWNlfSB3aGVuIGNsaWVudCBleHRlbnNpb24gaXMgYmVpbmcgY3JlYXRlZAorICogKGluIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQucngucnhqYXZhLlJ4T2JzZXJ2YWJsZSBSeE9ic2VydmFibGV9KS4KKyAqIDxwLz4KKyAqIFRoZSBvYnNlcnZhYmxlcyBwcm9kdWNlZCBieSBtZXRob2QgY2FsbHMgYXJlIGNvbGQgb2JzZXJ2YWJsZXMuIFRoYXQgbWVhbnMgdGhhdCByZXF1ZXN0IHRvIHRoZSBzZXJ2aWNlIGlzIGludm9rZWQgb25seSB3aGVuIGEKKyAqIHN1YnNjcmliZXIgaXMgc3Vic2NyaWJlZCB0byB0aGUgb2JzZXJ2YWJsZS4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqIEBzaW5jZSAyLjEzCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgUnhPYnNlcnZhYmxlSW52b2tlciBleHRlbmRzIFJ4SW52b2tlcjxPYnNlcnZhYmxlPiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JzZXJ2YWJsZTxSZXNwb25zZT4gZ2V0KCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFQ+IE9ic2VydmFibGU8VD4gZ2V0KENsYXNzPFQ+IHJlc3BvbnNlVHlwZSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFQ+IE9ic2VydmFibGU8VD4gZ2V0KEdlbmVyaWNUeXBlPFQ+IHJlc3BvbnNlVHlwZSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JzZXJ2YWJsZTxSZXNwb25zZT4gcHV0KEVudGl0eTw/PiBlbnRpdHkpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxUPiBPYnNlcnZhYmxlPFQ+IHB1dChFbnRpdHk8Pz4gZW50aXR5LCBDbGFzczxUPiBjbGF6eik7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFQ+IE9ic2VydmFibGU8VD4gcHV0KEVudGl0eTw/PiBlbnRpdHksIEdlbmVyaWNUeXBlPFQ+IHR5cGUpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9ic2VydmFibGU8UmVzcG9uc2U+IHBvc3QoRW50aXR5PD8+IGVudGl0eSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFQ+IE9ic2VydmFibGU8VD4gcG9zdChFbnRpdHk8Pz4gZW50aXR5LCBDbGFzczxUPiBjbGF6eik7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFQ+IE9ic2VydmFibGU8VD4gcG9zdChFbnRpdHk8Pz4gZW50aXR5LCBHZW5lcmljVHlwZTxUPiB0eXBlKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYnNlcnZhYmxlPFJlc3BvbnNlPiBkZWxldGUoKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gT2JzZXJ2YWJsZTxUPiBkZWxldGUoQ2xhc3M8VD4gcmVzcG9uc2VUeXBlKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gT2JzZXJ2YWJsZTxUPiBkZWxldGUoR2VuZXJpY1R5cGU8VD4gcmVzcG9uc2VUeXBlKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYnNlcnZhYmxlPFJlc3BvbnNlPiBoZWFkKCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JzZXJ2YWJsZTxSZXNwb25zZT4gb3B0aW9ucygpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxUPiBPYnNlcnZhYmxlPFQ+IG9wdGlvbnMoQ2xhc3M8VD4gcmVzcG9uc2VUeXBlKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gT2JzZXJ2YWJsZTxUPiBvcHRpb25zKEdlbmVyaWNUeXBlPFQ+IHJlc3BvbnNlVHlwZSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JzZXJ2YWJsZTxSZXNwb25zZT4gdHJhY2UoKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gT2JzZXJ2YWJsZTxUPiB0cmFjZShDbGFzczxUPiByZXNwb25zZVR5cGUpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxUPiBPYnNlcnZhYmxlPFQ+IHRyYWNlKEdlbmVyaWNUeXBlPFQ+IHJlc3BvbnNlVHlwZSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JzZXJ2YWJsZTxSZXNwb25zZT4gbWV0aG9kKFN0cmluZyBuYW1lKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gT2JzZXJ2YWJsZTxUPiBtZXRob2QoU3RyaW5nIG5hbWUsIENsYXNzPFQ+IHJlc3BvbnNlVHlwZSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFQ+IE9ic2VydmFibGU8VD4gbWV0aG9kKFN0cmluZyBuYW1lLCBHZW5lcmljVHlwZTxUPiByZXNwb25zZVR5cGUpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9ic2VydmFibGU8UmVzcG9uc2U+IG1ldGhvZChTdHJpbmcgbmFtZSwgRW50aXR5PD8+IGVudGl0eSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFQ+IE9ic2VydmFibGU8VD4gbWV0aG9kKFN0cmluZyBuYW1lLCBFbnRpdHk8Pz4gZW50aXR5LCBDbGFzczxUPiByZXNwb25zZVR5cGUpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxUPiBPYnNlcnZhYmxlPFQ+IG1ldGhvZChTdHJpbmcgbmFtZSwgRW50aXR5PD8+IGVudGl0eSwgR2VuZXJpY1R5cGU8VD4gcmVzcG9uc2VUeXBlKTsKK30KZGlmZiAtLWdpdCBhL2V4dC9yeC9yeC1jbGllbnQtcnhqYXZhL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L3J4L3J4amF2YS9SeE9ic2VydmFibGVJbnZva2VyUHJvdmlkZXIuamF2YSBiL2V4dC9yeC9yeC1jbGllbnQtcnhqYXZhL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L3J4L3J4amF2YS9SeE9ic2VydmFibGVJbnZva2VyUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTU5MWVjCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3J4L3J4LWNsaWVudC1yeGphdmEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvcngvcnhqYXZhL1J4T2JzZXJ2YWJsZUludm9rZXJQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnJ4LnJ4amF2YTsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5SeEludm9rZXJQcm92aWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuU3luY0ludm9rZXI7CisKKy8qKgorICogSW52b2tlciBwcm92aWRlciBmb3IgaW52b2tlcnMgYmFzZWQgb24gUnhKYXZhJ3Mge0Bjb2RlIE9ic2VydmFibGV9LgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBzaW5jZSAyLjEzCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBSeE9ic2VydmFibGVJbnZva2VyUHJvdmlkZXIgaW1wbGVtZW50cyBSeEludm9rZXJQcm92aWRlcjxSeE9ic2VydmFibGVJbnZva2VyPiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1Byb3ZpZGVyRm9yKENsYXNzIGNsYXp6KSB7CisgICAgICAgIHJldHVybiBSeE9ic2VydmFibGVJbnZva2VyLmNsYXNzLmVxdWFscyhjbGF6eik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJ4T2JzZXJ2YWJsZUludm9rZXIgZ2V0UnhJbnZva2VyKFN5bmNJbnZva2VyIHN5bmNJbnZva2VyLCBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlKSB7CisgICAgICAgIHJldHVybiBuZXcgSmVyc2V5UnhPYnNlcnZhYmxlSW52b2tlcihzeW5jSW52b2tlciwgZXhlY3V0b3JTZXJ2aWNlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvcngvcngtY2xpZW50LXJ4amF2YS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9yeC9yeGphdmEvcGFja2FnZS1pbmZvLmphdmEgYi9leHQvcngvcngtY2xpZW50LXJ4amF2YS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9yeC9yeGphdmEvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUxYzRhZgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9yeC9yeC1jbGllbnQtcnhqYXZhL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L3J4L3J4amF2YS9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvKioKKyAqIEplcnNleSBSZWFjdGl2ZSBDbGllbnQgLSBSeEphdmEgKE9ic2VydmFibGUpIHByb3ZpZGVyLgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5yeC5yeGphdmE7CmRpZmYgLS1naXQgYS9leHQvcngvcngtY2xpZW50LXJ4amF2YS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnJ4LnNwaS5SeEludm9rZXJQcm92aWRlciBiL2V4dC9yeC9yeC1jbGllbnQtcnhqYXZhL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQucnguc3BpLlJ4SW52b2tlclByb3ZpZGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlODVhZGEKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvcngvcngtY2xpZW50LXJ4amF2YS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnJ4LnNwaS5SeEludm9rZXJQcm92aWRlcgpAQCAtMCwwICsxIEBACitvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQucngucnhqYXZhLlJ4T2JzZXJ2YWJsZUludm9rZXJQcm92aWRlcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2V4dC9yeC9yeC1jbGllbnQtcnhqYXZhL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L3J4L3J4amF2YS9SeE9ic2VydmFibGVUZXN0LmphdmEgYi9leHQvcngvcngtY2xpZW50LXJ4amF2YS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9yeC9yeGphdmEvUnhPYnNlcnZhYmxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjYTEyMWYKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvcngvcngtY2xpZW50LXJ4amF2YS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9yeC9yeGphdmEvUnhPYnNlcnZhYmxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjA4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5yeC5yeGphdmE7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Ob3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY1R5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhLlRocmVhZEZhY3RvcnlCdWlsZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuSmVyc2V5UHJvY2Vzc2luZ1VuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuY29udGFpbnNTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5jb3JlLklzLmlzOworCitpbXBvcnQgcnguU3Vic2NyaWJlcjsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBSeE9ic2VydmFibGVUZXN0IHsKKworICAgIHByaXZhdGUgQ2xpZW50IGNsaWVudDsKKyAgICBwcml2YXRlIENsaWVudCBjbGllbnRXaXRoRXhlY3V0b3I7CisgICAgcHJpdmF0ZSBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3I7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKS5yZWdpc3RlcihUZXJtaW5hbENsaWVudFJlcXVlc3RGaWx0ZXIuY2xhc3MpOworICAgICAgICBjbGllbnQucmVnaXN0ZXIoUnhPYnNlcnZhYmxlSW52b2tlclByb3ZpZGVyLmNsYXNzKTsKKyAgICAgICAgZXhlY3V0b3IgPSBuZXcgU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yKDEsIG5ldyBUaHJlYWRGYWN0b3J5QnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldE5hbWVGb3JtYXQoImplcnNleS1yeC1jbGllbnQtdGVzdC0lZCIpCisgICAgICAgICAgICAgICAgLnNldFVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcihuZXcgSmVyc2V5UHJvY2Vzc2luZ1VuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcigpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBjbGllbnRXaXRoRXhlY3V0b3IgPSBDbGllbnRCdWlsZGVyLm5ld0J1aWxkZXIoKS5leGVjdXRvclNlcnZpY2UoZXhlY3V0b3IpLmJ1aWxkKCk7CisgICAgICAgIGNsaWVudFdpdGhFeGVjdXRvci5yZWdpc3RlcihUZXJtaW5hbENsaWVudFJlcXVlc3RGaWx0ZXIuY2xhc3MpOworICAgICAgICBjbGllbnRXaXRoRXhlY3V0b3IucmVnaXN0ZXIoUnhPYnNlcnZhYmxlSW52b2tlclByb3ZpZGVyLmNsYXNzKTsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBleGVjdXRvci5zaHV0ZG93bigpOworCisgICAgICAgIGNsaWVudC5jbG9zZSgpOworICAgICAgICBjbGllbnQgPSBudWxsOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vdEZvdW5kUmVzcG9uc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUnhPYnNlcnZhYmxlSW52b2tlciBpbnZva2VyID0gY2xpZW50LnRhcmdldCgiaHR0cDovL2plcnNleS5qYXZhLm5ldCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmhlYWRlcigiUmVzcG9uc2UtU3RhdHVzIiwgNDA0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucngoUnhPYnNlcnZhYmxlSW52b2tlci5jbGFzcyk7CisKKyAgICAgICAgdGVzdEludm9rZXIoaW52b2tlciwgNDA0LCBmYWxzZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90Rm91bmRXaXRoQ3VzdG9tRXhlY3V0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUnhPYnNlcnZhYmxlSW52b2tlciBpbnZva2VyID0gY2xpZW50V2l0aEV4ZWN1dG9yLnRhcmdldCgiaHR0cDovL2plcnNleS5qYXZhLm5ldCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmhlYWRlcigiUmVzcG9uc2UtU3RhdHVzIiwgNDA0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucngoUnhPYnNlcnZhYmxlSW52b2tlci5jbGFzcyk7CisKKyAgICAgICAgdGVzdEludm9rZXIoaW52b2tlciwgNDA0LCB0cnVlKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IE5vdEZvdW5kRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RGb3VuZFJlYWRFbnRpdHlWaWFDbGFzcygpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2xpZW50LnRhcmdldCgiaHR0cDovL2plcnNleS5qYXZhLm5ldCIpCisgICAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgICAuaGVhZGVyKCJSZXNwb25zZS1TdGF0dXMiLCA0MDQpCisgICAgICAgICAgICAgICAgICAucngoUnhPYnNlcnZhYmxlSW52b2tlci5jbGFzcykKKyAgICAgICAgICAgICAgICAgIC5nZXQoU3RyaW5nLmNsYXNzKQorICAgICAgICAgICAgICAgICAgLnRvQmxvY2tpbmcoKQorICAgICAgICAgICAgICAgICAgLnRvRnV0dXJlKCkKKyAgICAgICAgICAgICAgICAgIC5nZXQoKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgICAgICAvLyBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb24KKyAgICAgICAgICAgIHRocm93IGV4cGVjdGVkCisgICAgICAgICAgICAgICAgICAgIC8vIGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgLy8gLmdldENhdXNlKCkKKyAgICAgICAgICAgICAgICAgICAgLy8gamF2YXgud3MucnMuTm90Rm91bmRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgLmdldENhdXNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IE5vdEZvdW5kRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RGb3VuZFJlYWRFbnRpdHlWaWFHZW5lcmljVHlwZSgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2xpZW50LnRhcmdldCgiaHR0cDovL2plcnNleS5qYXZhLm5ldCIpCisgICAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgICAuaGVhZGVyKCJSZXNwb25zZS1TdGF0dXMiLCA0MDQpCisgICAgICAgICAgICAgICAgICAucngoUnhPYnNlcnZhYmxlSW52b2tlci5jbGFzcykKKyAgICAgICAgICAgICAgICAgIC5nZXQobmV3IEdlbmVyaWNUeXBlPFN0cmluZz4oKSB7IH0pCisgICAgICAgICAgICAgICAgICAudG9CbG9ja2luZygpCisgICAgICAgICAgICAgICAgICAudG9GdXR1cmUoKQorICAgICAgICAgICAgICAgICAgLmdldCgpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKworICAgICAgICAgICAgZXhwZWN0ZWQucHJpbnRTdGFja1RyYWNlKCk7CisKKyAgICAgICAgICAgIC8vIGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbgorICAgICAgICAgICAgdGhyb3cgZXhwZWN0ZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gamF2YXgud3MucnMuTm90Rm91bmRFeGNlcHRpb24KKyAgICAgICAgICAgICAgICAgICAgLmdldENhdXNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkRW50aXR5VmlhQ2xhc3MoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3BvbnNlID0gY2xpZW50LnRhcmdldCgiaHR0cDovL2plcnNleS5qYXZhLm5ldCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJ4KFJ4T2JzZXJ2YWJsZUludm9rZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoU3RyaW5nLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9CbG9ja2luZygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50b0Z1dHVyZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLCBpcygiTk8tRU5USVRZIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRFbnRpdHlWaWFHZW5lcmljVHlwZSgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzcG9uc2UgPSBjbGllbnQudGFyZ2V0KCJodHRwOi8vamVyc2V5LmphdmEubmV0IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucngoUnhPYnNlcnZhYmxlSW52b2tlci5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldChuZXcgR2VuZXJpY1R5cGU8U3RyaW5nPigpIHsgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvQmxvY2tpbmcoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9GdXR1cmUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZSwgaXMoIk5PLUVOVElUWSIpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdEludm9rZXIoZmluYWwgUnhPYnNlcnZhYmxlSW52b2tlciByeCwgZmluYWwgaW50IGV4cGVjdGVkU3RhdHVzLCBmaW5hbCBib29sZWFuIHRlc3REZWRpY2F0ZWRUaHJlYWQpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgIGZpbmFsIEF0b21pY1JlZmVyZW5jZTxSZXNwb25zZT4gcmVzcG9uc2VSZWYgPSBuZXcgQXRvbWljUmVmZXJlbmNlPD4oKTsKKyAgICAgICAgZmluYWwgQXRvbWljUmVmZXJlbmNlPFRocm93YWJsZT4gZXJyb3JSZWYgPSBuZXcgQXRvbWljUmVmZXJlbmNlPD4oKTsKKworICAgICAgICByeC5nZXQoKS5zdWJzY3JpYmUobmV3IFN1YnNjcmliZXI8UmVzcG9uc2U+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlZCgpIHsKKyAgICAgICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKGZpbmFsIFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICAgICAgZXJyb3JSZWYuc2V0KGUpOworICAgICAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uTmV4dChmaW5hbCBSZXNwb25zZSByZXNwb25zZSkgeworICAgICAgICAgICAgICAgIHJlc3BvbnNlUmVmLnNldChyZXNwb25zZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIGxhdGNoLmF3YWl0KCk7CisKKyAgICAgICAgaWYgKGVycm9yUmVmLmdldCgpID09IG51bGwpIHsKKyAgICAgICAgICAgIHRlc3RSZXNwb25zZShyZXNwb25zZVJlZi5nZXQoKSwgZXhwZWN0ZWRTdGF0dXMsIHRlc3REZWRpY2F0ZWRUaHJlYWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgKEV4Y2VwdGlvbikgZXJyb3JSZWYuZ2V0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHRlc3RSZXNwb25zZShmaW5hbCBSZXNwb25zZSByZXNwb25zZSwgZmluYWwgaW50IGV4cGVjdGVkU3RhdHVzLCBmaW5hbCBib29sZWFuIHRlc3REZWRpY2F0ZWRUaHJlYWQpIHsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoZXhwZWN0ZWRTdGF0dXMpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGlzKCJOTy1FTlRJVFkiKSk7CisKKyAgICAgICAgLy8gRXhlY3V0b3IuCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJUZXN0LVRocmVhZCIpLCB0ZXN0RGVkaWNhdGVkVGhyZWFkCisgICAgICAgICAgICAgICAgPyBjb250YWluc1N0cmluZygiamVyc2V5LXJ4LWNsaWVudC10ZXN0IikgOiBjb250YWluc1N0cmluZygiamVyc2V5LWNsaWVudC1hc3luYy1leGVjdXRvciIpKTsKKworICAgICAgICAvLyBQcm9wZXJ0aWVzLgorICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiVGVzdC1VcmkiKSwgaXMoImh0dHA6Ly9qZXJzZXkuamF2YS5uZXQiKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJUZXN0LU1ldGhvZCIpLCBpcygiR0VUIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9yeC9yeC1jbGllbnQtcnhqYXZhL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L3J4L3J4amF2YS9UZXJtaW5hbENsaWVudFJlcXVlc3RGaWx0ZXIuamF2YSBiL2V4dC9yeC9yeC1jbGllbnQtcnhqYXZhL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L3J4L3J4amF2YS9UZXJtaW5hbENsaWVudFJlcXVlc3RGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTM5NjFmCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3J4L3J4LWNsaWVudC1yeGphdmEvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvcngvcnhqYXZhL1Rlcm1pbmFsQ2xpZW50UmVxdWVzdEZpbHRlci5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnJ4LnJ4amF2YTsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK2NsYXNzIFRlcm1pbmFsQ2xpZW50UmVxdWVzdEZpbHRlciBpbXBsZW1lbnRzIENsaWVudFJlcXVlc3RGaWx0ZXIgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZmlsdGVyKGZpbmFsIENsaWVudFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBPYnRhaW4gZW50aXR5IC0gZnJvbSByZXF1ZXN0IG9yIGNyZWF0ZSBuZXcuCisgICAgICAgIGZpbmFsIEJ5dGVBcnJheUlucHV0U3RyZWFtIGVudGl0eSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5oYXNFbnRpdHkoKSA/IHJlcXVlc3RDb250ZXh0LmdldEVudGl0eSgpLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKSA6ICJOTy1FTlRJVFkiLmdldEJ5dGVzKCkKKyAgICAgICAgKTsKKworICAgICAgICBmaW5hbCBpbnQgcmVzcG9uc2VTdGF0dXMgPSByZXF1ZXN0Q29udGV4dC5nZXRIZWFkZXJzKCkuZ2V0Rmlyc3QoIlJlc3BvbnNlLVN0YXR1cyIpICE9IG51bGwKKyAgICAgICAgICAgICAgICA/IChpbnQpIHJlcXVlc3RDb250ZXh0LmdldEhlYWRlcnMoKS5nZXRGaXJzdCgiUmVzcG9uc2UtU3RhdHVzIikgOiAyMDA7CisgICAgICAgIFJlc3BvbnNlLlJlc3BvbnNlQnVpbGRlciByZXNwb25zZSA9IFJlc3BvbnNlLnN0YXR1cyhyZXNwb25zZVN0YXR1cykKKyAgICAgICAgICAgICAgICAuZW50aXR5KGVudGl0eSkKKyAgICAgICAgICAgICAgICAudHlwZSgidGV4dC9wbGFpbiIpCisgICAgICAgICAgICAgICAgLy8gVGVzdCBwcm9wZXJ0aWVzLgorICAgICAgICAgICAgICAgIC5oZWFkZXIoIlRlc3QtVGhyZWFkIiwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkpCisgICAgICAgICAgICAgICAgLmhlYWRlcigiVGVzdC1VcmkiLCByZXF1ZXN0Q29udGV4dC5nZXRVcmkoKS50b1N0cmluZygpKQorICAgICAgICAgICAgICAgIC5oZWFkZXIoIlRlc3QtTWV0aG9kIiwgcmVxdWVzdENvbnRleHQuZ2V0TWV0aG9kKCkpOworCisgICAgICAgIC8vIFJlcXVlc3QgaGVhZGVycyAtPiBSZXNwb25zZSBoZWFkZXJzICg8aGVhZGVyPiAtPiBUZXN0LUhlYWRlci08aGVhZGVyPikKKyAgICAgICAgZm9yIChmaW5hbCBNdWx0aXZhbHVlZE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZW50cnkgOiByZXF1ZXN0Q29udGV4dC5nZXRTdHJpbmdIZWFkZXJzKCkuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgcmVzcG9uc2UgPSByZXNwb25zZS5oZWFkZXIoIlRlc3QtSGVhZGVyLSIgKyBlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXF1ZXN0IHByb3BlcnRpZXMgLT4gUmVzcG9uc2UgaGVhZGVycyAoPGhlYWRlcj4gLT4gVGVzdC1Qcm9wZXJ0eS08aGVhZGVyPikKKyAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgcHJvcGVydHkgOiByZXF1ZXN0Q29udGV4dC5nZXRQcm9wZXJ0eU5hbWVzKCkpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlID0gcmVzcG9uc2UuaGVhZGVyKCJUZXN0LVByb3BlcnR5LSIgKyBwcm9wZXJ0eSwgcmVxdWVzdENvbnRleHQuZ2V0UHJvcGVydHkocHJvcGVydHkpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlcXVlc3RDb250ZXh0LmFib3J0V2l0aChyZXNwb25zZS5idWlsZCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvcngvcngtY2xpZW50LXJ4amF2YTIvcG9tLnhtbCBiL2V4dC9yeC9yeC1jbGllbnQtcnhqYXZhMi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NjE0Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvcngvcngtY2xpZW50LXJ4amF2YTIvcG9tLnhtbApAQCAtMCwwICsxLDUyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQucng8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktcngtY2xpZW50LXJ4amF2YTI8L2FydGlmYWN0SWQ+CisgICAgPG5hbWU+amVyc2V5LWV4dC1yeC1jbGllbnQtcnhqYXZhMjwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgUmVhY3RpdmUgQ2xpZW50IC0gUnhKYXZhMiAoRmxvd2FibGUpIHByb3ZpZGVyLjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY2xpZW50PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5pby5yZWFjdGl2ZXgucnhqYXZhMjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnJ4amF2YTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cnhqYXZhMi52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5yZWFjdGl2ZXN0cmVhbXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5yZWFjdGl2ZS1zdHJlYW1zPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+MS4wLjA8L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4dC9yeC9yeC1jbGllbnQtcnhqYXZhMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9yeC9yeGphdmEyL0plcnNleVJ4Rmxvd2FibGVJbnZva2VyLmphdmEgYi9leHQvcngvcngtY2xpZW50LXJ4amF2YTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvcngvcnhqYXZhMi9KZXJzZXlSeEZsb3dhYmxlSW52b2tlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNTczMTkKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvcngvcngtY2xpZW50LXJ4amF2YTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvcngvcnhqYXZhMi9KZXJzZXlSeEZsb3dhYmxlSW52b2tlci5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnJ4LnJ4amF2YTI7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5TeW5jSW52b2tlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkdlbmVyaWNUeXBlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkFic3RyYWN0UnhJbnZva2VyOworCitpbXBvcnQgaW8ucmVhY3RpdmV4LkJhY2twcmVzc3VyZVN0cmF0ZWd5OworaW1wb3J0IGlvLnJlYWN0aXZleC5GbG93YWJsZTsKK2ltcG9ydCBpby5yZWFjdGl2ZXguRmxvd2FibGVFbWl0dGVyOworaW1wb3J0IGlvLnJlYWN0aXZleC5GbG93YWJsZU9uU3Vic2NyaWJlOworaW1wb3J0IGlvLnJlYWN0aXZleC5TY2hlZHVsZXI7CitpbXBvcnQgaW8ucmVhY3RpdmV4LnNjaGVkdWxlcnMuU2NoZWR1bGVyczsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBSZWFjdGl2ZSBJbnZva2VyIGZvciB7QGNvZGUgRmxvd2FibGV9LiBJZiBubyBleGVjdXRvciBzZXJ2aWNlIGlzIHByb3ZpZGVkIHRoZSBKQVgtUlMgQXN5bmMgY2xpZW50IGlzIHVzZWQKKyAqIHRvIHJldHJpZXZlIGRhdGEgd2hlbiBhIHN1YnNjcmliZXIgaXMgc3Vic2NyaWJlZC4gV2hlbiBhbiBleGVjdXRvciBzZXJ2aWNlIGlzIHByb3ZpZGVkIGEgc3luYyBjYWxsIGlzIGludm9rZWQgb24gYSB0aHJlYWQKKyAqIHByb3ZpZGVkIG9uIGZyb20gdGhpcyBzZXJ2aWNlLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBzaW5jZSAyLjE2CisgKi8KK2ZpbmFsIGNsYXNzIEplcnNleVJ4Rmxvd2FibGVJbnZva2VyIGV4dGVuZHMgQWJzdHJhY3RSeEludm9rZXI8Rmxvd2FibGU+IGltcGxlbWVudHMgUnhGbG93YWJsZUludm9rZXIgeworCisgICAgSmVyc2V5UnhGbG93YWJsZUludm9rZXIoU3luY0ludm9rZXIgc3luY0ludm9rZXIsIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvcikgeworICAgICAgICBzdXBlcihzeW5jSW52b2tlciwgZXhlY3V0b3IpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gRmxvd2FibGU8VD4gbWV0aG9kKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBFbnRpdHk8Pz4gZW50aXR5LCBmaW5hbCBDbGFzczxUPiByZXNwb25zZVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIG1ldGhvZChuYW1lLCBlbnRpdHksIG5ldyBHZW5lcmljVHlwZTxUPihyZXNwb25zZVR5cGUpIHsgfSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxUPiBGbG93YWJsZTxUPiBtZXRob2QoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIEVudGl0eTw/PiBlbnRpdHksIGZpbmFsIEdlbmVyaWNUeXBlPFQ+IHJlc3BvbnNlVHlwZSkgeworICAgICAgICBmaW5hbCBTY2hlZHVsZXIgc2NoZWR1bGVyOworCisgICAgICAgIGlmIChnZXRFeGVjdXRvclNlcnZpY2UoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBzY2hlZHVsZXIgPSBTY2hlZHVsZXJzLmZyb20oZ2V0RXhlY3V0b3JTZXJ2aWNlKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVE9ETzogdXNlIEpBWC1SUyBjbGllbnQgc2NoZWR1bGVyCisgICAgICAgICAgICAvLyBUT0RPOiBodHRwczovL2phdmEubmV0L2ppcmEvYnJvd3NlL0pBWF9SU19TUEVDLTUyMworICAgICAgICAgICAgc2NoZWR1bGVyID0gU2NoZWR1bGVycy5pbygpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSW52b2tlIGFzIHN5bmMgSkFYLVJTIGNsaWVudCByZXF1ZXN0IGFuZCBzdWJzY3JpYmUvb2JzZXJ2ZSBvbiBhIHNjaGVkdWxlciBpbml0aWFsaXplZCB3aXRoIGV4ZWN1dG9yIHNlcnZpY2UuCisgICAgICAgIHJldHVybiBGbG93YWJsZS5jcmVhdGUobmV3IEZsb3dhYmxlT25TdWJzY3JpYmU8VD4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHN1YnNjcmliZShGbG93YWJsZUVtaXR0ZXI8VD4gZmxvd2FibGVFbWl0dGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFQgcmVzcG9uc2UgPSBnZXRTeW5jSW52b2tlcigpLm1ldGhvZChuYW1lLCBlbnRpdHksIHJlc3BvbnNlVHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG93YWJsZUVtaXR0ZXIub25OZXh0KHJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb3dhYmxlRW1pdHRlci5vbkNvbXBsZXRlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb3dhYmxlRW1pdHRlci5vbkVycm9yKHRocm93YWJsZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwgQmFja3ByZXNzdXJlU3RyYXRlZ3kuRFJPUCkuc3Vic2NyaWJlT24oc2NoZWR1bGVyKS5vYnNlcnZlT24oc2NoZWR1bGVyKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvcngvcngtY2xpZW50LXJ4amF2YTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvcngvcnhqYXZhMi9SeEZsb3dhYmxlSW52b2tlci5qYXZhIGIvZXh0L3J4L3J4LWNsaWVudC1yeGphdmEyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L3J4L3J4amF2YTIvUnhGbG93YWJsZUludm9rZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzkwMjZjCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3J4L3J4LWNsaWVudC1yeGphdmEyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L3J4L3J4amF2YTIvUnhGbG93YWJsZUludm9rZXIuamF2YQpAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQucngucnhqYXZhMjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LlJ4SW52b2tlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkdlbmVyaWNUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBpby5yZWFjdGl2ZXguRmxvd2FibGU7CisKKworLyoqCisgKiBSZWFjdGl2ZSBpbnZva2VyIHByb3ZpZGluZyBzdXBwb3J0IGZvciB7QGxpbmsgRmxvd2FibGUgZmxvd2FibGV9IGZyb20gUnhKYXZhLgorICogPHAvPgorICogUmVxdWVzdHMgYXJlIGJ5IGRlZmF1bHQgaW52b2tlZCBvbiBhIHNlcGFyYXRlIHRocmVhZCAoYXMgSkFYLVJTIEFzeW5jIGNsaWVudCByZXF1ZXN0cykuIFRoaXMgYmVoYXZpb3IgY2FuIGJlIG92ZXJyaWRkZW4gYnkKKyAqIHByb3ZpZGluZyBhIHtAbGluayBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2UgZXhlY3V0b3Igc2VydmljZX0gd2hlbiBjbGllbnQgZXh0ZW5zaW9uIGlzIGJlaW5nIGNyZWF0ZWQuCisgKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICogQHNpbmNlIDIuMjYKKyAqLworcHVibGljIGludGVyZmFjZSBSeEZsb3dhYmxlSW52b2tlciBleHRlbmRzIFJ4SW52b2tlcjxGbG93YWJsZT4geworCisgICAgQE92ZXJyaWRlCisgICAgRmxvd2FibGU8UmVzcG9uc2U+IGdldCgpOworCisgICAgQE92ZXJyaWRlCisgICAgPFI+IEZsb3dhYmxlPFI+IGdldChDbGFzczxSPiByZXNwb25zZVR5cGUpOworCisgICAgQE92ZXJyaWRlCisgICAgPFI+IEZsb3dhYmxlPFI+IGdldChHZW5lcmljVHlwZTxSPiByZXNwb25zZVR5cGUpOworCisgICAgQE92ZXJyaWRlCisgICAgRmxvd2FibGU8UmVzcG9uc2U+IHB1dChFbnRpdHk8Pz4gZW50aXR5KTsKKworICAgIEBPdmVycmlkZQorICAgIDxSPiBGbG93YWJsZTxSPiBwdXQoRW50aXR5PD8+IGVudGl0eSwgQ2xhc3M8Uj4gcmVzcG9uc2VUeXBlKTsKKworICAgIEBPdmVycmlkZQorICAgIDxSPiBGbG93YWJsZTxSPiBwdXQoRW50aXR5PD8+IGVudGl0eSwgR2VuZXJpY1R5cGU8Uj4gcmVzcG9uc2VUeXBlKTsKKworICAgIEBPdmVycmlkZQorICAgIEZsb3dhYmxlPFJlc3BvbnNlPiBwb3N0KEVudGl0eTw/PiBlbnRpdHkpOworCisgICAgQE92ZXJyaWRlCisgICAgPFI+IEZsb3dhYmxlPFI+IHBvc3QoRW50aXR5PD8+IGVudGl0eSwgQ2xhc3M8Uj4gcmVzcG9uc2VUeXBlKTsKKworICAgIEBPdmVycmlkZQorICAgIDxSPiBGbG93YWJsZTxSPiBwb3N0KEVudGl0eTw/PiBlbnRpdHksIEdlbmVyaWNUeXBlPFI+IHJlc3BvbnNlVHlwZSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBGbG93YWJsZTxSZXNwb25zZT4gZGVsZXRlKCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICA8Uj4gRmxvd2FibGU8Uj4gZGVsZXRlKENsYXNzPFI+IHJlc3BvbnNlVHlwZSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICA8Uj4gRmxvd2FibGU8Uj4gZGVsZXRlKEdlbmVyaWNUeXBlPFI+IHJlc3BvbnNlVHlwZSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBGbG93YWJsZTxSZXNwb25zZT4gaGVhZCgpOworCisgICAgQE92ZXJyaWRlCisgICAgRmxvd2FibGU8UmVzcG9uc2U+IG9wdGlvbnMoKTsKKworICAgIEBPdmVycmlkZQorICAgIDxSPiBGbG93YWJsZTxSPiBvcHRpb25zKENsYXNzPFI+IHJlc3BvbnNlVHlwZSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICA8Uj4gRmxvd2FibGU8Uj4gb3B0aW9ucyhHZW5lcmljVHlwZTxSPiByZXNwb25zZVR5cGUpOworCisgICAgQE92ZXJyaWRlCisgICAgRmxvd2FibGU8UmVzcG9uc2U+IHRyYWNlKCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICA8Uj4gRmxvd2FibGU8Uj4gdHJhY2UoQ2xhc3M8Uj4gcmVzcG9uc2VUeXBlKTsKKworICAgIEBPdmVycmlkZQorICAgIDxSPiBGbG93YWJsZTxSPiB0cmFjZShHZW5lcmljVHlwZTxSPiByZXNwb25zZVR5cGUpOworCisgICAgQE92ZXJyaWRlCisgICAgRmxvd2FibGU8UmVzcG9uc2U+IG1ldGhvZChTdHJpbmcgbmFtZSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICA8Uj4gRmxvd2FibGU8Uj4gbWV0aG9kKFN0cmluZyBuYW1lLCBDbGFzczxSPiByZXNwb25zZVR5cGUpOworCisgICAgQE92ZXJyaWRlCisgICAgPFI+IEZsb3dhYmxlPFI+IG1ldGhvZChTdHJpbmcgbmFtZSwgR2VuZXJpY1R5cGU8Uj4gcmVzcG9uc2VUeXBlKTsKKworICAgIEBPdmVycmlkZQorICAgIEZsb3dhYmxlPFJlc3BvbnNlPiBtZXRob2QoU3RyaW5nIG5hbWUsIEVudGl0eTw/PiBlbnRpdHkpOworCisgICAgQE92ZXJyaWRlCisgICAgPFI+IEZsb3dhYmxlPFI+IG1ldGhvZChTdHJpbmcgbmFtZSwgRW50aXR5PD8+IGVudGl0eSwgQ2xhc3M8Uj4gcmVzcG9uc2VUeXBlKTsKKworICAgIEBPdmVycmlkZQorICAgIDxSPiBGbG93YWJsZTxSPiBtZXRob2QoU3RyaW5nIG5hbWUsIEVudGl0eTw/PiBlbnRpdHksIEdlbmVyaWNUeXBlPFI+IHJlc3BvbnNlVHlwZSk7Cit9CmRpZmYgLS1naXQgYS9leHQvcngvcngtY2xpZW50LXJ4amF2YTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvcngvcnhqYXZhMi9SeEZsb3dhYmxlSW52b2tlclByb3ZpZGVyLmphdmEgYi9leHQvcngvcngtY2xpZW50LXJ4amF2YTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvcngvcnhqYXZhMi9SeEZsb3dhYmxlSW52b2tlclByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNhNmU4MAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9yeC9yeC1jbGllbnQtcnhqYXZhMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9yeC9yeGphdmEyL1J4Rmxvd2FibGVJbnZva2VyUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5yeC5yeGphdmEyOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LlJ4SW52b2tlclByb3ZpZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5TeW5jSW52b2tlcjsKKworCisvKioKKyAqIEludm9rZXIgcHJvdmlkZXIgZm9yIGludm9rZXJzIGJhc2VkIG9uIFJ4SmF2YSdzIHtAY29kZSBGbG93YWJsZX0uCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICogQHNpbmNlIDIuMjYKKyAqLworcHVibGljIGNsYXNzIFJ4Rmxvd2FibGVJbnZva2VyUHJvdmlkZXIgaW1wbGVtZW50cyBSeEludm9rZXJQcm92aWRlcjxSeEZsb3dhYmxlSW52b2tlcj4geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNQcm92aWRlckZvcihDbGFzczw/PiBjbGF6eikgeworICAgICAgICByZXR1cm4gUnhGbG93YWJsZUludm9rZXIuY2xhc3MuZXF1YWxzKGNsYXp6KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUnhGbG93YWJsZUludm9rZXIgZ2V0UnhJbnZva2VyKFN5bmNJbnZva2VyIHN5bmNJbnZva2VyLCBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlKSB7CisgICAgICAgIHJldHVybiBuZXcgSmVyc2V5UnhGbG93YWJsZUludm9rZXIoc3luY0ludm9rZXIsIGV4ZWN1dG9yU2VydmljZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L3J4L3J4LWNsaWVudC1yeGphdmEyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L3J4L3J4amF2YTIvUnhGbG93YWJsZVRlc3QuamF2YSBiL2V4dC9yeC9yeC1jbGllbnQtcnhqYXZhMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9yeC9yeGphdmEyL1J4Rmxvd2FibGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVhNzJiMAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9yeC9yeC1jbGllbnQtcnhqYXZhMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9yeC9yeGphdmEyL1J4Rmxvd2FibGVUZXN0LmphdmEKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnJ4LnJ4amF2YTI7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Ob3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY1R5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhLlRocmVhZEZhY3RvcnlCdWlsZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuSmVyc2V5UHJvY2Vzc2luZ1VuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5yZWFjdGl2ZXN0cmVhbXMuU3Vic2NyaWJlcjsKK2ltcG9ydCBvcmcucmVhY3RpdmVzdHJlYW1zLlN1YnNjcmlwdGlvbjsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuY29yZS5Jcy5pczsKKworLyoqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgUnhGbG93YWJsZVRlc3QgeworCisgICAgcHJpdmF0ZSBDbGllbnQgY2xpZW50OworICAgIHByaXZhdGUgQ2xpZW50IGNsaWVudFdpdGhFeGVjdXRvcjsKKyAgICBwcml2YXRlIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvcjsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpLnJlZ2lzdGVyKFRlcm1pbmFsQ2xpZW50UmVxdWVzdEZpbHRlci5jbGFzcyk7CisgICAgICAgIGNsaWVudC5yZWdpc3RlcihSeEZsb3dhYmxlSW52b2tlclByb3ZpZGVyLmNsYXNzKTsKKyAgICAgICAgZXhlY3V0b3IgPSBuZXcgU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yKDEsIG5ldyBUaHJlYWRGYWN0b3J5QnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldE5hbWVGb3JtYXQoImplcnNleS1yeC1jbGllbnQtdGVzdC0lZCIpCisgICAgICAgICAgICAgICAgLnNldFVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcihuZXcgSmVyc2V5UHJvY2Vzc2luZ1VuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcigpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBjbGllbnRXaXRoRXhlY3V0b3IgPSBDbGllbnRCdWlsZGVyLm5ld0J1aWxkZXIoKS5leGVjdXRvclNlcnZpY2UoZXhlY3V0b3IpLmJ1aWxkKCk7CisgICAgICAgIGNsaWVudFdpdGhFeGVjdXRvci5yZWdpc3RlcihUZXJtaW5hbENsaWVudFJlcXVlc3RGaWx0ZXIuY2xhc3MpOworICAgICAgICBjbGllbnRXaXRoRXhlY3V0b3IucmVnaXN0ZXIoUnhGbG93YWJsZUludm9rZXJQcm92aWRlci5jbGFzcyk7CisgICAgfQorCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0b3Iuc2h1dGRvd24oKTsKKworICAgICAgICBjbGllbnQuY2xvc2UoKTsKKyAgICAgICAgY2xpZW50ID0gbnVsbDsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RGb3VuZFJlc3BvbnNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJ4Rmxvd2FibGVJbnZva2VyIGludm9rZXIgPSBjbGllbnQudGFyZ2V0KCJodHRwOi8vamVyc2V5LmphdmEubmV0IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5oZWFkZXIoIlJlc3BvbnNlLVN0YXR1cyIsIDQwNCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yeChSeEZsb3dhYmxlSW52b2tlci5jbGFzcyk7CisKKyAgICAgICAgdGVzdEludm9rZXIoaW52b2tlciwgNDA0LCBmYWxzZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90Rm91bmRXaXRoQ3VzdG9tRXhlY3V0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUnhGbG93YWJsZUludm9rZXIgaW52b2tlciA9IGNsaWVudFdpdGhFeGVjdXRvci50YXJnZXQoImh0dHA6Ly9qZXJzZXkuamF2YS5uZXQiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmhlYWRlcigiUmVzcG9uc2UtU3RhdHVzIiwgNDA0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJ4KFJ4Rmxvd2FibGVJbnZva2VyLmNsYXNzKTsKKworICAgICAgICB0ZXN0SW52b2tlcihpbnZva2VyLCA0MDQsIHRydWUpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gTm90Rm91bmRFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdE5vdEZvdW5kUmVhZEVudGl0eVZpYUNsYXNzKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjbGllbnQudGFyZ2V0KCJodHRwOi8vamVyc2V5LmphdmEubmV0IikKKyAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAgIC5oZWFkZXIoIlJlc3BvbnNlLVN0YXR1cyIsIDQwNCkKKyAgICAgICAgICAgICAgICAgIC5yeChSeEZsb3dhYmxlSW52b2tlci5jbGFzcykKKyAgICAgICAgICAgICAgICAgIC5nZXQoU3RyaW5nLmNsYXNzKQorICAgICAgICAgICAgICAgICAgLmJsb2NraW5nRmlyc3QoKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgICAgICB0aHJvdyBleHBlY3RlZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gTm90Rm91bmRFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdE5vdEZvdW5kUmVhZEVudGl0eVZpYUdlbmVyaWNUeXBlKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjbGllbnQudGFyZ2V0KCJodHRwOi8vamVyc2V5LmphdmEubmV0IikKKyAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAgIC5oZWFkZXIoIlJlc3BvbnNlLVN0YXR1cyIsIDQwNCkKKyAgICAgICAgICAgICAgICAgIC5yeChSeEZsb3dhYmxlSW52b2tlci5jbGFzcykKKyAgICAgICAgICAgICAgICAgIC5nZXQobmV3IEdlbmVyaWNUeXBlPFN0cmluZz4oKSB7CisgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgLmJsb2NraW5nRmlyc3QoKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgICAgICB0aHJvdyBleHBlY3RlZDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRFbnRpdHlWaWFDbGFzcygpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzcG9uc2UgPSBjbGllbnQudGFyZ2V0KCJodHRwOi8vamVyc2V5LmphdmEubmV0IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucngoUnhGbG93YWJsZUludm9rZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXQoU3RyaW5nLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYmxvY2tpbmdGaXJzdCgpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UsIGlzKCJOTy1FTlRJVFkiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEVudGl0eVZpYUdlbmVyaWNUeXBlKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXNwb25zZSA9IGNsaWVudC50YXJnZXQoImh0dHA6Ly9qZXJzZXkuamF2YS5uZXQiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yeChSeEZsb3dhYmxlSW52b2tlci5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldChuZXcgR2VuZXJpY1R5cGU8U3RyaW5nPigpIHsgfSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJsb2NraW5nRmlyc3QoKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLCBpcygiTk8tRU5USVRZIikpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0SW52b2tlcihmaW5hbCBSeEZsb3dhYmxlSW52b2tlciByeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGV4cGVjdGVkU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHRlc3REZWRpY2F0ZWRUaHJlYWQpCisgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgIGZpbmFsIEF0b21pY1JlZmVyZW5jZTxSZXNwb25zZT4gcmVzcG9uc2VSZWYgPSBuZXcgQXRvbWljUmVmZXJlbmNlPD4oKTsKKyAgICAgICAgZmluYWwgQXRvbWljUmVmZXJlbmNlPFRocm93YWJsZT4gZXJyb3JSZWYgPSBuZXcgQXRvbWljUmVmZXJlbmNlPD4oKTsKKworICAgICAgICByeC5nZXQoKS5zdWJzY3JpYmUobmV3IFN1YnNjcmliZXI8UmVzcG9uc2U+KCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3Vic2NyaWJlKFN1YnNjcmlwdGlvbiBzKSB7CisgICAgICAgICAgICAgICAgcy5yZXF1ZXN0KExvbmcuTUFYX1ZBTFVFKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKCkgeworICAgICAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoZmluYWwgVGhyb3dhYmxlIGUpIHsKKyAgICAgICAgICAgICAgICBlcnJvclJlZi5zZXQoZSk7CisgICAgICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25OZXh0KGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgICAgICAgICAgICAgcmVzcG9uc2VSZWYuc2V0KHJlc3BvbnNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgbGF0Y2guYXdhaXQoKTsKKworICAgICAgICBpZiAoZXJyb3JSZWYuZ2V0KCkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGVzdFJlc3BvbnNlKHJlc3BvbnNlUmVmLmdldCgpLCBleHBlY3RlZFN0YXR1cywgdGVzdERlZGljYXRlZFRocmVhZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyAoRXhjZXB0aW9uKSBlcnJvclJlZi5nZXQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGVzdFJlc3BvbnNlKGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlLCBmaW5hbCBpbnQgZXhwZWN0ZWRTdGF0dXMsIGZpbmFsIGJvb2xlYW4gdGVzdERlZGljYXRlZFRocmVhZCkgeworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcyhleHBlY3RlZFN0YXR1cykpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoIk5PLUVOVElUWSIpKTsKKworICAgICAgICAvLyBFeGVjdXRvci4KKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIlRlc3QtVGhyZWFkIiksIHRlc3REZWRpY2F0ZWRUaHJlYWQKKyAgICAgICAgICAgICAgICA/IGNvbnRhaW5zU3RyaW5nKCJqZXJzZXktcngtY2xpZW50LXRlc3QiKSA6IGNvbnRhaW5zU3RyaW5nKCJqZXJzZXktY2xpZW50LWFzeW5jLWV4ZWN1dG9yIikpOworCisgICAgICAgIC8vIFByb3BlcnRpZXMuCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJUZXN0LVVyaSIpLCBpcygiaHR0cDovL2plcnNleS5qYXZhLm5ldCIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIlRlc3QtTWV0aG9kIiksIGlzKCJHRVQiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L3J4L3J4LWNsaWVudC1yeGphdmEyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L3J4L3J4amF2YTIvVGVybWluYWxDbGllbnRSZXF1ZXN0RmlsdGVyLmphdmEgYi9leHQvcngvcngtY2xpZW50LXJ4amF2YTIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvcngvcnhqYXZhMi9UZXJtaW5hbENsaWVudFJlcXVlc3RGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzI0YTQxCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3J4L3J4LWNsaWVudC1yeGphdmEyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L3J4L3J4amF2YTIvVGVybWluYWxDbGllbnRSZXF1ZXN0RmlsdGVyLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQucngucnhqYXZhMjsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK2NsYXNzIFRlcm1pbmFsQ2xpZW50UmVxdWVzdEZpbHRlciBpbXBsZW1lbnRzIENsaWVudFJlcXVlc3RGaWx0ZXIgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZmlsdGVyKGZpbmFsIENsaWVudFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBPYnRhaW4gZW50aXR5IC0gZnJvbSByZXF1ZXN0IG9yIGNyZWF0ZSBuZXcuCisgICAgICAgIGZpbmFsIEJ5dGVBcnJheUlucHV0U3RyZWFtIGVudGl0eSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgKKyAgICAgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5oYXNFbnRpdHkoKSA/IHJlcXVlc3RDb250ZXh0LmdldEVudGl0eSgpLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKSA6ICJOTy1FTlRJVFkiLmdldEJ5dGVzKCkKKyAgICAgICAgKTsKKworICAgICAgICBmaW5hbCBpbnQgcmVzcG9uc2VTdGF0dXMgPSByZXF1ZXN0Q29udGV4dC5nZXRIZWFkZXJzKCkuZ2V0Rmlyc3QoIlJlc3BvbnNlLVN0YXR1cyIpICE9IG51bGwKKyAgICAgICAgICAgICAgICA/IChpbnQpIHJlcXVlc3RDb250ZXh0LmdldEhlYWRlcnMoKS5nZXRGaXJzdCgiUmVzcG9uc2UtU3RhdHVzIikgOiAyMDA7CisgICAgICAgIFJlc3BvbnNlLlJlc3BvbnNlQnVpbGRlciByZXNwb25zZSA9IFJlc3BvbnNlLnN0YXR1cyhyZXNwb25zZVN0YXR1cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZW50aXR5KGVudGl0eSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudHlwZSgidGV4dC9wbGFpbiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGVzdCBwcm9wZXJ0aWVzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5oZWFkZXIoIlRlc3QtVGhyZWFkIiwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmhlYWRlcigiVGVzdC1VcmkiLCByZXF1ZXN0Q29udGV4dC5nZXRVcmkoKS50b1N0cmluZygpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5oZWFkZXIoIlRlc3QtTWV0aG9kIiwgcmVxdWVzdENvbnRleHQuZ2V0TWV0aG9kKCkpOworCisgICAgICAgIC8vIFJlcXVlc3QgaGVhZGVycyAtPiBSZXNwb25zZSBoZWFkZXJzICg8aGVhZGVyPiAtPiBUZXN0LUhlYWRlci08aGVhZGVyPikKKyAgICAgICAgZm9yIChmaW5hbCBNdWx0aXZhbHVlZE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZW50cnkgOiByZXF1ZXN0Q29udGV4dC5nZXRTdHJpbmdIZWFkZXJzKCkuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgcmVzcG9uc2UgPSByZXNwb25zZS5oZWFkZXIoIlRlc3QtSGVhZGVyLSIgKyBlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXF1ZXN0IHByb3BlcnRpZXMgLT4gUmVzcG9uc2UgaGVhZGVycyAoPGhlYWRlcj4gLT4gVGVzdC1Qcm9wZXJ0eS08aGVhZGVyPikKKyAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgcHJvcGVydHkgOiByZXF1ZXN0Q29udGV4dC5nZXRQcm9wZXJ0eU5hbWVzKCkpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlID0gcmVzcG9uc2UuaGVhZGVyKCJUZXN0LVByb3BlcnR5LSIgKyBwcm9wZXJ0eSwgcmVxdWVzdENvbnRleHQuZ2V0UHJvcGVydHkocHJvcGVydHkpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlcXVlc3RDb250ZXh0LmFib3J0V2l0aChyZXNwb25zZS5idWlsZCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvc2VydmxldC1wb3J0YWJpbGl0eS9wb20ueG1sIGIvZXh0L3NlcnZsZXQtcG9ydGFiaWxpdHkvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTBmYWRhCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3NlcnZsZXQtcG9ydGFiaWxpdHkvcG9tLnhtbApAQCAtMCwwICsxLDc3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmplcnNleS1zZXJ2bGV0LXBvcnRhYmlsaXR5PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LWV4dC1zZXJ2bGV0LXBvcnRhYmlsaXR5PC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBMaWJyYXJ5IHRoYXQgZW5hYmxlcyB3cml0aW5nIHdlYiBhcHBsaWNhdGlvbnMgdGhhdCBydW4gd2l0aCBib3RoIEplcnNleSAxLnggYW5kIEplcnNleSAyLnggc2VydmxldCBjb250YWluZXJzLgorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLmlzdGFjazwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1pc3RhY2stY29tbW9ucy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YnVpbGQtaGVscGVyLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgud3MucnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC53cy5ycy1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi5qZXJzZXk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7amVyc2V5MS52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtzZXJ2bGV0Mi52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4dC9zZXJ2bGV0LXBvcnRhYmlsaXR5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmxldC9wb3J0YWJpbGl0eS9Qb3J0YWJsZVNlcnZsZXRDb250YWluZXIuamF2YSBiL2V4dC9zZXJ2bGV0LXBvcnRhYmlsaXR5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmxldC9wb3J0YWJpbGl0eS9Qb3J0YWJsZVNlcnZsZXRDb250YWluZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDZkNDk0Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L3NlcnZsZXQtcG9ydGFiaWxpdHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2bGV0L3BvcnRhYmlsaXR5L1BvcnRhYmxlU2VydmxldENvbnRhaW5lci5qYXZhCkBAIC0wLDAgKzEsMjI4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQucG9ydGFiaWxpdHk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlckNoYWluOworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ29uZmlnOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb25maWc7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZTsKKworLyoqCisgKiBKZXJzZXkgU2VydmxldC9GaWx0ZXIgY2xhc3MgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBpbiB3ZWIueG1sIGluc3RlYWQgb2YgSmVyc2V5IDEueCBzcGVjaWZpYworICoge0Bjb2RlIGNvbS5zdW4uamVyc2V5LnNwaS5jb250YWluZXIuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyfSBhbmQgSmVyc2V5IDIueCBzcGVjaWZpYworICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcn0gdG8gZW5hYmxlIHdlYiBhcHBsaWNhdGlvbiBwb3J0YWJpbGl0eSBiZXR3ZWVuCisgKiBKZXJzZXkgMS54IGFuZCBKZXJzZXkgMi54IHNlcnZsZXQgY29udGFpbmVycy4KKyAqIDxwPgorICogICAgIFNpbmNlIGZvciBzb21lIG9mIHRoZSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0UHJvcGVydGllcyBzZXJ2bGV0IGluaXQgcGFyYW1ldGVyc30gdGhhdCBjYW4gYmUKKyAqICAgICBzcGVjaWZpZWQgaW4gd2ViLnhtbCB5b3UgbWF5IHdhbnQgZGlmZmVyZW50IHZhbHVlcyBkZXBlbmRpbmcgb24gd2hpY2ggdmVyc2lvbiBvZiBKZXJzZXkgY29udGFpbmVyIGlzIHByZXNlbnQsCisgKiAgICAgWW91IGNhbiBwcmVmaXggdGhlIGluaXQgcGFyYW1ldGVyIG5hbWUgZWl0aGVyIHdpdGgge0Bjb2RlIGplcnNleTEjfSBvciB7QGNvZGUgamVyc2V5MiN9IHRvCisgKiAgICAgbWFrZSBpdCBzcGVjaWZpYyB0byBhIGdpdmVuIHZlcnNpb24uIEZvciBleGFtcGxlLCB0byBzcGVjaWZ5IGRpZmZlcmVudCB2YWx1ZXMgZm9yCisgKiAgICAge0Bjb2RlIGphdmF4LndzLnJzLkFwcGxpY2F0aW9ufSBpbml0IHBhcmFtZXRlciBkZXBlbmRpbmcgb24gdGhlIHZlcnNpb24gb2YgSmVyc2V5IHVzZWQsIHlvdSBjYW4gaW5jbHVkZQorICogICAgIHRoZSBmb2xsb3dpbmcgaW4geW91ciB3ZWIueG1sOgorICogICAgIDxwcmU+CisgKiAgICAgJmx0O3NlcnZsZXQmZ3Q7CisgKiAgICAgICAgICZsdDtzZXJ2bGV0LW5hbWUmZ3Q7SmVyc2V5IFdlYiBBcHBsaWNhdGlvbiZsdDsvc2VydmxldC1uYW1lJmd0OworICogICAgICAgICAmbHQ7c2VydmxldC1jbGFzcyZndDtvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LnBvcnRhYmlsaXR5LlBvcnRhYmxlU2VydmxldENvbnRhaW5lciZsdDsvc2VydmxldC1jbGFzcyZndDsKKyAqICAgICAgICAgJmx0O2luaXQtcGFyYW0mZ3Q7CisgKiAgICAgICAgICAgICAmbHQ7cGFyYW0tbmFtZSZndDtqZXJzZXkxI2phdmF4LndzLnJzLkFwcGxpY2F0aW9uJmx0Oy9wYXJhbS1uYW1lJmd0OworICogICAgICAgICAgICAgJmx0O3BhcmFtLXZhbHVlJmd0O215YXBwLmplcnNleTFzcGVjaWZpYy5KZXJzZXkxQXBwbGljYXRpb24mbHQ7L3BhcmFtLXZhbHVlJmd0OworICogICAgICAgICAmbHQ7L2luaXQtcGFyYW0mZ3Q7CisgKiAgICAgICAgICZsdDtpbml0LXBhcmFtJmd0OworICogICAgICAgICAgICAgJmx0O3BhcmFtLW5hbWUmZ3Q7amVyc2V5MiNqYXZheC53cy5ycy5BcHBsaWNhdGlvbiZsdDsvcGFyYW0tbmFtZSZndDsKKyAqICAgICAgICAgICAgICZsdDtwYXJhbS12YWx1ZSZndDtteWFwcC5qZXJzZXkyc3BlY2lmaWMuSmVyc2V5MkFwcGxpY2F0aW9uJmx0Oy9wYXJhbS12YWx1ZSZndDsKKyAqICAgICAgICAgJmx0Oy9pbml0LXBhcmFtJmd0OworICogICAgICZsdDsvc2VydmxldCZndDsKKyAqICAgICA8L3ByZT4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIFBvcnRhYmxlU2VydmxldENvbnRhaW5lciBpbXBsZW1lbnRzIEZpbHRlciwgU2VydmxldCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkVSU0VZXzFfUFJFRklYID0gImplcnNleTEjIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkVSU0VZXzJfUFJFRklYID0gImplcnNleTIjIjsKKworICAgIHByaXZhdGUgZmluYWwgU2VydmxldCB3cmFwcGVkU2VydmxldDsKKyAgICBwcml2YXRlIGZpbmFsIEZpbHRlciB3cmFwcGVkRmlsdGVyOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGluY2x1ZGVQcmVmaXg7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZXhjbHVkZVByZWZpeDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBzZXJ2bGV0IGNvbnRhaW5lci4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgUG9ydGFibGVTZXJ2bGV0Q29udGFpbmVyKCkgeworICAgICAgICBDbGFzczxTZXJ2bGV0PiBzZXJ2bGV0Q2xhc3M7CisgICAgICAgIGJvb2xlYW4gaXNKZXJzZXkxID0gZmFsc2U7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzZXJ2bGV0Q2xhc3MgPSAoQ2xhc3M8U2VydmxldD4pIENsYXNzLmZvck5hbWUoImNvbS5zdW4uamVyc2V5LnNwaS5jb250YWluZXIuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyIik7CisgICAgICAgICAgICBpc0plcnNleTEgPSB0cnVlOworICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIEplcnNleSAxLnggbm90IHByZXNlbnQsIHRyeSBKZXJzZXkgMi54CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNlcnZsZXRDbGFzcyA9IChDbGFzczxTZXJ2bGV0PikgQ2xhc3MuZm9yTmFtZSgib3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyIik7CisgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5KRVJTRVlfTk9UX0FWQUlMQUJMRSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB3cmFwcGVkU2VydmxldCA9IHNlcnZsZXRDbGFzcy5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgd3JhcHBlZEZpbHRlciA9IChGaWx0ZXIpIHdyYXBwZWRTZXJ2bGV0OworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuSkVSU0VZX0NPTlRBSU5FUl9DQU5UX0xPQUQoKSwgZSk7CisgICAgICAgIH0KKyAgICAgICAgaW5jbHVkZVByZWZpeCA9IGlzSmVyc2V5MSA/IEpFUlNFWV8xX1BSRUZJWCA6IEpFUlNFWV8yX1BSRUZJWDsKKyAgICAgICAgZXhjbHVkZVByZWZpeCA9IGlzSmVyc2V5MSA/IEpFUlNFWV8yX1BSRUZJWCA6IEpFUlNFWV8xX1BSRUZJWDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBpbml0KGZpbmFsIEZpbHRlckNvbmZpZyBmaWx0ZXJDb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgd3JhcHBlZEZpbHRlci5pbml0KG5ldyBGaWx0ZXJDb25maWdXcmFwcGVyKGZpbHRlckNvbmZpZykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRvRmlsdGVyKFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwgRmlsdGVyQ2hhaW4gY2hhaW4pCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICB3cmFwcGVkRmlsdGVyLmRvRmlsdGVyKHJlcXVlc3QsIHJlc3BvbnNlLCBjaGFpbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaW5pdChTZXJ2bGV0Q29uZmlnIGNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICB3cmFwcGVkU2VydmxldC5pbml0KG5ldyBTZXJ2bGV0Q29uZmlnV3JhcHBlcihjb25maWcpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2VydmxldENvbmZpZyBnZXRTZXJ2bGV0Q29uZmlnKCkgeworICAgICAgICByZXR1cm4gd3JhcHBlZFNlcnZsZXQuZ2V0U2VydmxldENvbmZpZygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNlcnZpY2UoU2VydmxldFJlcXVlc3QgcmVxLCBTZXJ2bGV0UmVzcG9uc2UgcmVzKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICB3cmFwcGVkU2VydmxldC5zZXJ2aWNlKHJlcSwgcmVzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZsZXRJbmZvKCkgeworICAgICAgICByZXR1cm4gd3JhcHBlZFNlcnZsZXQuZ2V0U2VydmxldEluZm8oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgeworICAgICAgICB3cmFwcGVkU2VydmxldC5kZXN0cm95KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBhYnN0cmFjdCBjbGFzcyBJbml0UGFyYW1zV3JhcHBlciB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBmaWx0ZXJlZEluaXRQYXJhbXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKworICAgICAgICB2b2lkIGluaXQoKSB7CisgICAgICAgICAgICBmb3IgKEVudW1lcmF0aW9uIGUgPSBnZXRJbml0UGFyYW1OYW1lcygpOyBlLmhhc01vcmVFbGVtZW50cygpOyApIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGUubmV4dEVsZW1lbnQoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBnZXRJbml0UGFyYW1WYWx1ZShuYW1lKTsKKyAgICAgICAgICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKGluY2x1ZGVQcmVmaXgpKSB7CisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZyhpbmNsdWRlUHJlZml4Lmxlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWUuc3RhcnRzV2l0aChleGNsdWRlUHJlZml4KSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmlsdGVyZWRJbml0UGFyYW1zLnB1dChuYW1lLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBhYnN0cmFjdCBTdHJpbmcgZ2V0SW5pdFBhcmFtVmFsdWUoU3RyaW5nIG5hbWUpOworCisgICAgICAgIGFic3RyYWN0IEVudW1lcmF0aW9uIGdldEluaXRQYXJhbU5hbWVzKCk7CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRJbml0UGFyYW1ldGVyKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICByZXR1cm4gZmlsdGVyZWRJbml0UGFyYW1zLmdldChuYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRJbml0UGFyYW1ldGVyTmFtZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW51bWVyYXRpb24oZmlsdGVyZWRJbml0UGFyYW1zLmtleVNldCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgRmlsdGVyQ29uZmlnV3JhcHBlciBleHRlbmRzIEluaXRQYXJhbXNXcmFwcGVyIGltcGxlbWVudHMgRmlsdGVyQ29uZmlnIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIEZpbHRlckNvbmZpZyB3cmFwcGVkOworCisgICAgICAgIEZpbHRlckNvbmZpZ1dyYXBwZXIoRmlsdGVyQ29uZmlnIHdyYXBwZWQpIHsKKyAgICAgICAgICAgIHRoaXMud3JhcHBlZCA9IHdyYXBwZWQ7CisgICAgICAgICAgICBpbml0KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRGaWx0ZXJOYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0RmlsdGVyTmFtZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTZXJ2bGV0Q29udGV4dCBnZXRTZXJ2bGV0Q29udGV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiB3cmFwcGVkLmdldFNlcnZsZXRDb250ZXh0KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgU3RyaW5nIGdldEluaXRQYXJhbVZhbHVlKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRJbml0UGFyYW1ldGVyKG5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIEVudW1lcmF0aW9uIGdldEluaXRQYXJhbU5hbWVzKCkgeworICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0SW5pdFBhcmFtZXRlck5hbWVzKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGNsYXNzIFNlcnZsZXRDb25maWdXcmFwcGVyIGV4dGVuZHMgSW5pdFBhcmFtc1dyYXBwZXIgaW1wbGVtZW50cyBTZXJ2bGV0Q29uZmlnIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFNlcnZsZXRDb25maWcgd3JhcHBlZDsKKworICAgICAgICBTZXJ2bGV0Q29uZmlnV3JhcHBlcihTZXJ2bGV0Q29uZmlnIHdyYXBwZWQpIHsKKyAgICAgICAgICAgIHRoaXMud3JhcHBlZCA9IHdyYXBwZWQ7CisgICAgICAgICAgICBpbml0KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgU3RyaW5nIGdldEluaXRQYXJhbVZhbHVlKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICByZXR1cm4gd3JhcHBlZC5nZXRJbml0UGFyYW1ldGVyKG5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIEVudW1lcmF0aW9uIGdldEluaXRQYXJhbU5hbWVzKCkgeworICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0SW5pdFBhcmFtZXRlck5hbWVzKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB3cmFwcGVkLmdldFNlcnZsZXROYW1lKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFNlcnZsZXRDb250ZXh0IGdldFNlcnZsZXRDb250ZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuZ2V0U2VydmxldENvbnRleHQoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9zZXJ2bGV0LXBvcnRhYmlsaXR5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmxldC9wb3J0YWJpbGl0eS9wYWNrYWdlLWluZm8uamF2YSBiL2V4dC9zZXJ2bGV0LXBvcnRhYmlsaXR5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmxldC9wb3J0YWJpbGl0eS9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjI5NjI3Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L3NlcnZsZXQtcG9ydGFiaWxpdHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2bGV0L3BvcnRhYmlsaXR5L3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKKy8qKgorICogUGFja2FnZSBjb250YWluaW5nIHV0aWxpdHkgY2xhc3NlcyBlbmFibGluZyB3ZWIgYXBwbGljYXRpb25zIHRvIGJlIHBvcnRhYmxlIGJldHdlZW4gZGlmZmVyZW50IHZlcnNpb25zIG9mIEplcnNleQorICogcnVudGltZS4KKyAqLworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LnBvcnRhYmlsaXR5OwpkaWZmIC0tZ2l0IGEvZXh0L3NlcnZsZXQtcG9ydGFiaWxpdHkvc3JjL21haW4vcmVzb3VyY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQucG9ydGFiaWxpdHkvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMgYi9leHQvc2VydmxldC1wb3J0YWJpbGl0eS9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5wb3J0YWJpbGl0eS9sb2NhbGl6YXRpb24ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2YwM2E0Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L3NlcnZsZXQtcG9ydGFiaWxpdHkvc3JjL21haW4vcmVzb3VyY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQucG9ydGFiaWxpdHkvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxOCBAQAorIworIyBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisjIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyMKKyMgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorIyBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisjIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorIyB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisjCisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorIworCitqZXJzZXkuY29udGFpbmVyLmNhbnQubG9hZD1VbmFibGUgdG8gaW5zdGFudGlhdGUgSmVyc2V5IFNlcnZsZXRDb250YWluZXIuCitqZXJzZXkubm90LmF2YWlsYWJsZT1ObyBKZXJzZXkgcnVudGltZSBmb3VuZCBvbiB0aGUgYXBwbGljYXRpb24gY2xhc3NwYXRoLgpkaWZmIC0tZ2l0IGEvZXh0L3NwcmluZzMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Njb3BlL0pheHJzU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzLmphdmEgYi9leHQvc3ByaW5nMy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvc2NvcGUvSmF4cnNTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGExMDVmCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3NwcmluZzMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Njb3BlL0pheHJzU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLnNjb3BlOworCitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKKworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmNvbnRleHQucmVxdWVzdC5TZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXM7CisKKy8qKgorICogSkFYLVJTIGJhc2VkIFNwcmluZyBSZXF1ZXN0QXR0cmlidXRlcyBpbXBsZW1lbnRhdGlvbiBmb3IgU2VydmxldC1iYXNlZCBhcHBsaWNhdGlvbnMuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworY2xhc3MgSmF4cnNTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXMgZXh0ZW5kcyBTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXMgeworCisgICAgcHJpdmF0ZSBmaW5hbCBDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBKQVgtUlMgU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzIGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0ICAgICAgICBjdXJyZW50IEhUVFAgcmVxdWVzdAorICAgICAqIEBwYXJhbSByZXF1ZXN0Q29udGV4dCBKQVgtUlMgcmVxdWVzdCBjb250ZXh0CisgICAgICovCisgICAgcHVibGljIEpheHJzU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzKGZpbmFsIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBmaW5hbCBDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgeworICAgICAgICBzdXBlcihyZXF1ZXN0KTsKKyAgICAgICAgdGhpcy5yZXF1ZXN0Q29udGV4dCA9IHJlcXVlc3RDb250ZXh0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgcmVzb2x2ZVJlZmVyZW5jZShTdHJpbmcga2V5KSB7CisgICAgICAgIGlmIChSRUZFUkVOQ0VfUkVRVUVTVC5lcXVhbHMoa2V5KSkgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdENvbnRleHQ7CisgICAgICAgIH0gZWxzZSBpZiAoUkVGRVJFTkNFX1NFU1NJT04uZXF1YWxzKGtleSkpIHsKKyAgICAgICAgICAgIHJldHVybiBzdXBlci5nZXRTZXNzaW9uKHRydWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvc3ByaW5nNC9wb20ueG1sIGIvZXh0L3NwcmluZzQvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTBlYmEzCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3NwcmluZzQvcG9tLnhtbApAQCAtMCwwICsxLDE5NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKworICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmplcnNleS1zcHJpbmc0PC9hcnRpZmFjdElkPgorICAgIDxuYW1lPmplcnNleS1zcHJpbmc0PC9uYW1lPgorCisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKworICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgSmVyc2V5IGV4dGVuc2lvbiBtb2R1bGUgcHJvdmlkaW5nIHN1cHBvcnQgZm9yIFNwcmluZyA0IGludGVncmF0aW9uLgorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktc2VydmVyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktaGsyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1ncml6emx5MjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1sb2dnaW5nPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sb2dnaW5nPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+MS4yPC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmhrMjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmhrMjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7aGsyLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmhrMjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy1icmlkZ2U8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke2hrMi52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxleGNsdXNpb25zPgorICAgICAgICAgICAgICAgIDxleGNsdXNpb24+ICA8IS0tIGFscmVhZHkgcHVsbGVkIGluIGJ5IGplcnNleS1zZXJ2ZXIgLS0+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LmluamVjdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguaW5qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guaGsyPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5oazItYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICAgICAgPC9leGNsdXNpb25zPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nLWJlYW5zPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtzcHJpbmc0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc3ByaW5nZnJhbWV3b3JrPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+c3ByaW5nLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3NwcmluZzQudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWxvZ2dpbmc8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbG9nZ2luZzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNwcmluZ2ZyYW1ld29yazwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnNwcmluZy13ZWI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3NwcmluZzQudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5zcHJpbmdmcmFtZXdvcms8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zcHJpbmctYW9wPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtzcHJpbmc0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguc2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4zLjAuMTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hc3BlY3RqPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXNwZWN0anJ0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+MS42LjExPC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFzcGVjdGo8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hc3BlY3Rqd2VhdmVyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+MS42LjExPC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8c3ByaW5nNC52ZXJzaW9uPjQuMy40LlJFTEVBU0U8L3NwcmluZzQudmVyc2lvbj4KKyAgICA8L3Byb3BlcnRpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLmlzdGFjazwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1pc3RhY2stY29tbW9ucy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YnVpbGQtaGVscGVyLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+ZGVsYXllZC1zdHJhdGVneS1za2lwLXRlc3Q8L2lkPgorICAgICAgICAgICAgPGFjdGl2YXRpb24+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICA8bmFtZT5vcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3Rpb24ubWFuYWdlci5zdHJhdGVneTwvbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgPHZhbHVlPmRlbGF5ZWQ8L3ZhbHVlPgorICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICA8L2FjdGl2YXRpb24+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2tpcFRlc3RzPnRydWU8L3NraXBUZXN0cz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9leHQvc3ByaW5nNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvQXV0b3dpcmVkSW5qZWN0UmVzb2x2ZXIuamF2YSBiL2V4dC9zcHJpbmc0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy9BdXRvd2lyZWRJbmplY3RSZXNvbHZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YjgxNzgKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvc3ByaW5nNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvQXV0b3dpcmVkSW5qZWN0UmVzb2x2ZXIuamF2YQpAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQW5ub3RhdGVkRWxlbWVudDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGVlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25SZXNvbHZlcjsKKworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5Ob1N1Y2hCZWFuRGVmaW5pdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uUXVhbGlmaWVyOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5jb25maWcuRGVwZW5kZW5jeURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LkFwcGxpY2F0aW9uQ29udGV4dDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvcmUuTWV0aG9kUGFyYW1ldGVyOworCisvKioKKyAqIEhLMiBpbmplY3Rpb24gcmVzb2x2ZXIgZm9yIFNwcmluZyBmcmFtZXdvcmsge0BsaW5rIEF1dG93aXJlZH0gYW5ub3RhdGlvbiBpbmplY3Rpb24uCisgKgorICogQGF1dGhvciBNYXJrbyBBc3BsdW5kIChtYXJrby5hc3BsdW5kIGF0IHlhaG9vLmNvbSkKKyAqIEBhdXRob3IgVmV0bGUgTGVpbm9uZW4tUm9laW0gKHZldGxlIGF0IHJvZWltLm5ldCkKKyAqLworQFNpbmdsZXRvbgorcHVibGljIGNsYXNzIEF1dG93aXJlZEluamVjdFJlc29sdmVyIGltcGxlbWVudHMgSW5qZWN0aW9uUmVzb2x2ZXI8QXV0b3dpcmVkPiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihBdXRvd2lyZWRJbmplY3RSZXNvbHZlci5jbGFzcy5nZXROYW1lKCkpOworCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBBcHBsaWNhdGlvbkNvbnRleHQgY3R4OworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIGN0eCBTcHJpbmcgYXBwbGljYXRpb24gY29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQXV0b3dpcmVkSW5qZWN0UmVzb2x2ZXIoQXBwbGljYXRpb25Db250ZXh0IGN0eCkgeworICAgICAgICB0aGlzLmN0eCA9IGN0eDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IHJlc29sdmUoSW5qZWN0ZWUgaW5qZWN0ZWUpIHsKKyAgICAgICAgQW5ub3RhdGVkRWxlbWVudCBwYXJlbnQgPSBpbmplY3RlZS5nZXRQYXJlbnQoKTsKKyAgICAgICAgU3RyaW5nIGJlYW5OYW1lID0gbnVsbDsKKyAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBRdWFsaWZpZXIgYW4gPSBwYXJlbnQuZ2V0QW5ub3RhdGlvbihRdWFsaWZpZXIuY2xhc3MpOworICAgICAgICAgICAgaWYgKGFuICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBiZWFuTmFtZSA9IGFuLnZhbHVlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiByZXF1aXJlZCA9IHBhcmVudCAhPSBudWxsID8gcGFyZW50LmdldEFubm90YXRpb24oQXV0b3dpcmVkLmNsYXNzKS5yZXF1aXJlZCgpIDogZmFsc2U7CisgICAgICAgIHJldHVybiBnZXRCZWFuRnJvbVNwcmluZ0NvbnRleHQoYmVhbk5hbWUsIGluamVjdGVlLCByZXF1aXJlZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBPYmplY3QgZ2V0QmVhbkZyb21TcHJpbmdDb250ZXh0KFN0cmluZyBiZWFuTmFtZSwgSW5qZWN0ZWUgaW5qZWN0ZWUsIGZpbmFsIGJvb2xlYW4gcmVxdWlyZWQpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIERlcGVuZGVuY3lEZXNjcmlwdG9yIGRlcGVuZGVuY3lEZXNjcmlwdG9yID0gY3JlYXRlU3ByaW5nRGVwZW5kZW5jeURlc2NyaXB0b3IoaW5qZWN0ZWUpOworICAgICAgICAgICAgU2V0PFN0cmluZz4gYXV0b3dpcmVkQmVhbk5hbWVzID0gbmV3IEhhc2hTZXQ8PigxKTsKKyAgICAgICAgICAgIGF1dG93aXJlZEJlYW5OYW1lcy5hZGQoYmVhbk5hbWUpOworICAgICAgICAgICAgcmV0dXJuIGN0eC5nZXRBdXRvd2lyZUNhcGFibGVCZWFuRmFjdG9yeSgpLnJlc29sdmVEZXBlbmRlbmN5KGRlcGVuZGVuY3lEZXNjcmlwdG9yLCBudWxsLAorICAgICAgICAgICAgICAgICAgICBhdXRvd2lyZWRCZWFuTmFtZXMsIG51bGwpOworICAgICAgICB9IGNhdGNoIChOb1N1Y2hCZWFuRGVmaW5pdGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBpZiAocmVxdWlyZWQpIHsKKyAgICAgICAgICAgICAgICBMT0dHRVIud2FybmluZyhlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBEZXBlbmRlbmN5RGVzY3JpcHRvciBjcmVhdGVTcHJpbmdEZXBlbmRlbmN5RGVzY3JpcHRvcihmaW5hbCBJbmplY3RlZSBpbmplY3RlZSkgeworICAgICAgICBBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZEVsZW1lbnQgPSBpbmplY3RlZS5nZXRQYXJlbnQoKTsKKworICAgICAgICBpZiAoYW5ub3RhdGVkRWxlbWVudC5nZXRDbGFzcygpLmlzQXNzaWduYWJsZUZyb20oRmllbGQuY2xhc3MpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IERlcGVuZGVuY3lEZXNjcmlwdG9yKChGaWVsZCkgYW5ub3RhdGVkRWxlbWVudCwgIWluamVjdGVlLmlzT3B0aW9uYWwoKSk7CisgICAgICAgIH0gZWxzZSBpZiAoYW5ub3RhdGVkRWxlbWVudC5nZXRDbGFzcygpLmlzQXNzaWduYWJsZUZyb20oTWV0aG9kLmNsYXNzKSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBEZXBlbmRlbmN5RGVzY3JpcHRvcigKKyAgICAgICAgICAgICAgICAgICAgbmV3IE1ldGhvZFBhcmFtZXRlcigoTWV0aG9kKSBhbm5vdGF0ZWRFbGVtZW50LCBpbmplY3RlZS5nZXRQb3NpdGlvbigpKSwgIWluamVjdGVlLmlzT3B0aW9uYWwoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IERlcGVuZGVuY3lEZXNjcmlwdG9yKAorICAgICAgICAgICAgICAgICAgICBuZXcgTWV0aG9kUGFyYW1ldGVyKChDb25zdHJ1Y3RvcikgYW5ub3RhdGVkRWxlbWVudCwgaW5qZWN0ZWUuZ2V0UG9zaXRpb24oKSksICFpbmplY3RlZS5pc09wdGlvbmFsKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNDb25zdHJ1Y3RvclBhcmFtZXRlckluZGljYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzTWV0aG9kUGFyYW1ldGVySW5kaWNhdG9yKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENsYXNzPEF1dG93aXJlZD4gZ2V0QW5ub3RhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIEF1dG93aXJlZC5jbGFzczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvc3ByaW5nNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvU3ByaW5nQ29tcG9uZW50UHJvdmlkZXIuamF2YSBiL2V4dC9zcHJpbmc0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy9TcHJpbmdDb21wb25lbnRQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5ZjQ1YjMKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvc3ByaW5nNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvU3ByaW5nQ29tcG9uZW50UHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nOworCitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5oazIuSW1tZWRpYXRlSGsySW5qZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQmluZGluZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQmluZGluZ3M7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbXBvbmVudFByb3ZpZGVyOworCitpbXBvcnQgb3JnLmp2bmV0LmhrMi5zcHJpbmcuYnJpZGdlLmFwaS5TcHJpbmdCcmlkZ2U7CitpbXBvcnQgb3JnLmp2bmV0LmhrMi5zcHJpbmcuYnJpZGdlLmFwaS5TcHJpbmdJbnRvSEsyQnJpZGdlOworCitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5hb3AuZnJhbWV3b3JrLkFkdmlzZWQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LkFwcGxpY2F0aW9uQ29udGV4dDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuc3VwcG9ydC5DbGFzc1BhdGhYbWxBcHBsaWNhdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb3JlLmFubm90YXRpb24uQW5ub3RhdGlvblV0aWxzOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db21wb25lbnQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuY29udGV4dC5zdXBwb3J0LldlYkFwcGxpY2F0aW9uQ29udGV4dFV0aWxzOworCisvKioKKyAqIEN1c3RvbSBDb21wb25lbnRQcm92aWRlciBjbGFzcy4KKyAqIFJlc3BvbnNpYmxlIGZvciAxKSBib290c3RyYXBwaW5nIEplcnNleSAyIFNwcmluZyBpbnRlZ3JhdGlvbiBhbmQKKyAqIDIpIG1ha2luZyBKZXJzZXkgc2tpcCBKQVgtUlMgU3ByaW5nIGNvbXBvbmVudCBsaWZlLWN5Y2xlIG1hbmFnZW1lbnQgYW5kIGxlYXZlIGl0IHRvIHVzLgorICoKKyAqIEBhdXRob3IgTWFya28gQXNwbHVuZCAobWFya28uYXNwbHVuZCBhdCB5YWhvby5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBTcHJpbmdDb21wb25lbnRQcm92aWRlciBpbXBsZW1lbnRzIENvbXBvbmVudFByb3ZpZGVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFNwcmluZ0NvbXBvbmVudFByb3ZpZGVyLmNsYXNzLmdldE5hbWUoKSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ09OVEVYVF9DT05GSUdfTE9DQVRJT04gPSAiYXBwbGljYXRpb25Db250ZXh0LnhtbCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX0NPTlRFWFRfQ09ORklHX0xPQ0FUSU9OID0gImNvbnRleHRDb25maWdMb2NhdGlvbiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX1NQUklOR19DT05URVhUID0gImNvbnRleHRDb25maWciOworCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXI7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBBcHBsaWNhdGlvbkNvbnRleHQgY3R4OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIpIHsKKyAgICAgICAgdGhpcy5pbmplY3Rpb25NYW5hZ2VyID0gaW5qZWN0aW9uTWFuYWdlcjsKKworICAgICAgICBpZiAoTE9HR0VSLmlzTG9nZ2FibGUoTGV2ZWwuRklORSkpIHsKKyAgICAgICAgICAgIExPR0dFUi5maW5lKExvY2FsaXphdGlvbk1lc3NhZ2VzLkNUWF9MT09LVVBfU1RBUlRFRCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIFNlcnZsZXRDb250ZXh0IHNjID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShTZXJ2bGV0Q29udGV4dC5jbGFzcyk7CisKKyAgICAgICAgaWYgKHNjICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIHNlcnZsZXQgY29udGFpbmVyCisgICAgICAgICAgICBjdHggPSBXZWJBcHBsaWNhdGlvbkNvbnRleHRVdGlscy5nZXRXZWJBcHBsaWNhdGlvbkNvbnRleHQoc2MpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gbm9uLXNlcnZsZXQgY29udGFpbmVyCisgICAgICAgICAgICBjdHggPSBjcmVhdGVTcHJpbmdDb250ZXh0KCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGN0eCA9PSBudWxsKSB7CisgICAgICAgICAgICBMT0dHRVIuc2V2ZXJlKExvY2FsaXphdGlvbk1lc3NhZ2VzLkNUWF9MT09LVVBfRkFJTEVEKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIExPR0dFUi5jb25maWcoTG9jYWxpemF0aW9uTWVzc2FnZXMuQ1RYX0xPT0tVUF9TVUNFU1NGVUwoKSk7CisKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSBISzIgc3ByaW5nLWJyaWRnZQorCisgICAgICAgIEltbWVkaWF0ZUhrMkluamVjdGlvbk1hbmFnZXIgaGsySW5qZWN0aW9uTWFuYWdlciA9IChJbW1lZGlhdGVIazJJbmplY3Rpb25NYW5hZ2VyKSBpbmplY3Rpb25NYW5hZ2VyOworICAgICAgICBTcHJpbmdCcmlkZ2UuZ2V0U3ByaW5nQnJpZGdlKCkuaW5pdGlhbGl6ZVNwcmluZ0JyaWRnZShoazJJbmplY3Rpb25NYW5hZ2VyLmdldFNlcnZpY2VMb2NhdG9yKCkpOworICAgICAgICBTcHJpbmdJbnRvSEsyQnJpZGdlIHNwcmluZ0JyaWRnZSA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoU3ByaW5nSW50b0hLMkJyaWRnZS5jbGFzcyk7CisgICAgICAgIHNwcmluZ0JyaWRnZS5icmlkZ2VTcHJpbmdCZWFuRmFjdG9yeShjdHgpOworCisgICAgICAgIGluamVjdGlvbk1hbmFnZXIucmVnaXN0ZXIoQmluZGluZ3MuaW5qZWN0aW9uUmVzb2x2ZXIobmV3IEF1dG93aXJlZEluamVjdFJlc29sdmVyKGN0eCkpKTsKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5yZWdpc3RlcihCaW5kaW5ncy5zZXJ2aWNlKGN0eCkudG8oQXBwbGljYXRpb25Db250ZXh0LmNsYXNzKS5uYW1lZCgiU3ByaW5nQ29udGV4dCIpKTsKKyAgICAgICAgTE9HR0VSLmNvbmZpZyhMb2NhbGl6YXRpb25NZXNzYWdlcy5TUFJJTkdfQ09NUE9ORU5UX1BST1ZJREVSX0lOSVRJQUxJWkVEKCkpOworICAgIH0KKworICAgIC8vIGRldGVjdCBKQVgtUlMgY2xhc3NlcyB0aGF0IGFyZSBhbHNvIFNwcmluZyBAQ29tcG9uZW50cy4KKyAgICAvLyByZWdpc3RlciB0aGVzZSB3aXRoIEhLMiBTZXJ2aWNlTG9jYXRvciB0byBtYW5hZ2UgdGhlaXIgbGlmZWN5Y2xlIHVzaW5nIFNwcmluZy4KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBiaW5kKENsYXNzPD8+IGNvbXBvbmVudCwgU2V0PENsYXNzPD8+PiBwcm92aWRlckNvbnRyYWN0cykgeworCisgICAgICAgIGlmIChjdHggPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKEFubm90YXRpb25VdGlscy5maW5kQW5ub3RhdGlvbihjb21wb25lbnQsIENvbXBvbmVudC5jbGFzcykgIT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nW10gYmVhbk5hbWVzID0gY3R4LmdldEJlYW5OYW1lc0ZvclR5cGUoY29tcG9uZW50KTsKKyAgICAgICAgICAgIGlmIChiZWFuTmFtZXMgPT0gbnVsbCB8fCBiZWFuTmFtZXMubGVuZ3RoICE9IDEpIHsKKyAgICAgICAgICAgICAgICBMT0dHRVIuc2V2ZXJlKExvY2FsaXphdGlvbk1lc3NhZ2VzLk5PTkVfT1JfTVVMVElQTEVfQkVBTlNfQVZBSUxBQkxFKGNvbXBvbmVudCkpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZyBiZWFuTmFtZSA9IGJlYW5OYW1lc1swXTsKKworICAgICAgICAgICAgQmluZGluZyBiaW5kaW5nID0gQmluZGluZ3Muc3VwcGxpZXIobmV3IFNwcmluZ01hbmFnZWRCZWFuRmFjdG9yeShjdHgsIGluamVjdGlvbk1hbmFnZXIsIGJlYW5OYW1lKSkKKyAgICAgICAgICAgICAgICAgICAgLnRvKGNvbXBvbmVudCkKKyAgICAgICAgICAgICAgICAgICAgLnRvKHByb3ZpZGVyQ29udHJhY3RzKTsKKyAgICAgICAgICAgIGluamVjdGlvbk1hbmFnZXIucmVnaXN0ZXIoYmluZGluZyk7CisKKyAgICAgICAgICAgIExPR0dFUi5jb25maWcoTG9jYWxpemF0aW9uTWVzc2FnZXMuQkVBTl9SRUdJU1RFUkVEKGJlYW5OYW1lc1swXSkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRvbmUoKSB7CisgICAgfQorCisgICAgcHJpdmF0ZSBBcHBsaWNhdGlvbkNvbnRleHQgY3JlYXRlU3ByaW5nQ29udGV4dCgpIHsKKyAgICAgICAgQXBwbGljYXRpb25IYW5kbGVyIGFwcGxpY2F0aW9uSGFuZGxlciA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoQXBwbGljYXRpb25IYW5kbGVyLmNsYXNzKTsKKyAgICAgICAgQXBwbGljYXRpb25Db250ZXh0IHNwcmluZ0NvbnRleHQgPSAoQXBwbGljYXRpb25Db250ZXh0KSBhcHBsaWNhdGlvbkhhbmRsZXIuZ2V0Q29uZmlndXJhdGlvbigpCisgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KFBBUkFNX1NQUklOR19DT05URVhUKTsKKyAgICAgICAgaWYgKHNwcmluZ0NvbnRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgU3RyaW5nIGNvbnRleHRDb25maWdMb2NhdGlvbiA9IChTdHJpbmcpIGFwcGxpY2F0aW9uSGFuZGxlci5nZXRDb25maWd1cmF0aW9uKCkKKyAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KFBBUkFNX0NPTlRFWFRfQ09ORklHX0xPQ0FUSU9OKTsKKyAgICAgICAgICAgIHNwcmluZ0NvbnRleHQgPSBjcmVhdGVYbWxTcHJpbmdDb25maWd1cmF0aW9uKGNvbnRleHRDb25maWdMb2NhdGlvbik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNwcmluZ0NvbnRleHQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBBcHBsaWNhdGlvbkNvbnRleHQgY3JlYXRlWG1sU3ByaW5nQ29uZmlndXJhdGlvbihTdHJpbmcgY29udGV4dENvbmZpZ0xvY2F0aW9uKSB7CisgICAgICAgIGlmIChjb250ZXh0Q29uZmlnTG9jYXRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgY29udGV4dENvbmZpZ0xvY2F0aW9uID0gREVGQVVMVF9DT05URVhUX0NPTkZJR19MT0NBVElPTjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY3R4ID0gbmV3IENsYXNzUGF0aFhtbEFwcGxpY2F0aW9uQ29udGV4dChjb250ZXh0Q29uZmlnTG9jYXRpb24sICJqZXJzZXktc3ByaW5nLWFwcGxpY2F0aW9uQ29udGV4dC54bWwiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTcHJpbmdNYW5hZ2VkQmVhbkZhY3RvcnkgaW1wbGVtZW50cyBTdXBwbGllciB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcHBsaWNhdGlvbkNvbnRleHQgY3R4OworICAgICAgICBwcml2YXRlIGZpbmFsIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgYmVhbk5hbWU7CisKKyAgICAgICAgcHJpdmF0ZSBTcHJpbmdNYW5hZ2VkQmVhbkZhY3RvcnkoQXBwbGljYXRpb25Db250ZXh0IGN0eCwgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyLCBTdHJpbmcgYmVhbk5hbWUpIHsKKyAgICAgICAgICAgIHRoaXMuY3R4ID0gY3R4OworICAgICAgICAgICAgdGhpcy5pbmplY3Rpb25NYW5hZ2VyID0gaW5qZWN0aW9uTWFuYWdlcjsKKyAgICAgICAgICAgIHRoaXMuYmVhbk5hbWUgPSBiZWFuTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0IGdldCgpIHsKKyAgICAgICAgICAgIE9iamVjdCBiZWFuID0gY3R4LmdldEJlYW4oYmVhbk5hbWUpOworICAgICAgICAgICAgaWYgKGJlYW4gaW5zdGFuY2VvZiBBZHZpc2VkKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVW53cmFwIHRoZSBiZWFuIGFuZCBpbmplY3QgdGhlIHZhbHVlcyBpbnNpZGUgb2YgaXQKKyAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGxvY2FsQmVhbiA9ICgoQWR2aXNlZCkgYmVhbikuZ2V0VGFyZ2V0U291cmNlKCkuZ2V0VGFyZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgIGluamVjdGlvbk1hbmFnZXIuaW5qZWN0KGxvY2FsQmVhbik7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSWdub3JlIGFuZCBsZXQgdGhlIGluamVjdGlvbiBoYXBwZW4gYXMgaXQgbm9ybWFsbHkgd291bGQuCisgICAgICAgICAgICAgICAgICAgIGluamVjdGlvbk1hbmFnZXIuaW5qZWN0KGJlYW4pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5pbmplY3QoYmVhbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYmVhbjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9zcHJpbmc0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy9TcHJpbmdMaWZlY3ljbGVMaXN0ZW5lci5qYXZhIGIvZXh0L3NwcmluZzQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL1NwcmluZ0xpZmVjeWNsZUxpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBhNTdhNQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9zcHJpbmc0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy9TcHJpbmdMaWZlY3ljbGVMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZzsKKworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyOworCitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LkFwcGxpY2F0aW9uQ29udGV4dDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuQ29uZmlndXJhYmxlQXBwbGljYXRpb25Db250ZXh0OworCisvKioKKyAqIEpBWC1SUyBQcm92aWRlciBjbGFzcyBmb3IgcHJvY2Vzc2luZyBKZXJzZXkgMiBTcHJpbmcgaW50ZWdyYXRpb24gY29udGFpbmVyIGxpZmUtY3ljbGUgZXZlbnRzLgorICoKKyAqIEBhdXRob3IgTWFya28gQXNwbHVuZCAobWFya28uYXNwbHVuZCBhdCB5YWhvby5jb20pCisgKi8KK0BQcm92aWRlcgorcHVibGljIGNsYXNzIFNwcmluZ0xpZmVjeWNsZUxpc3RlbmVyIGltcGxlbWVudHMgQ29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXIgeworCisgICAgQEluamVjdAorICAgIHByaXZhdGUgQXBwbGljYXRpb25Db250ZXh0IGN0eDsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU3RhcnR1cChDb250YWluZXIgY29udGFpbmVyKSB7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25SZWxvYWQoQ29udGFpbmVyIGNvbnRhaW5lcikgeworICAgICAgICBpZiAoY3R4IGluc3RhbmNlb2YgQ29uZmlndXJhYmxlQXBwbGljYXRpb25Db250ZXh0KSB7CisgICAgICAgICAgICAoKENvbmZpZ3VyYWJsZUFwcGxpY2F0aW9uQ29udGV4dCkgY3R4KS5yZWZyZXNoKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblNodXRkb3duKENvbnRhaW5lciBjb250YWluZXIpIHsKKyAgICAgICAgaWYgKGN0eCBpbnN0YW5jZW9mIENvbmZpZ3VyYWJsZUFwcGxpY2F0aW9uQ29udGV4dCkgeworICAgICAgICAgICAgKChDb25maWd1cmFibGVBcHBsaWNhdGlvbkNvbnRleHQpIGN0eCkuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9zcHJpbmc0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy9TcHJpbmdXZWJBcHBsaWNhdGlvbkluaXRpYWxpemVyLmphdmEgYi9leHQvc3ByaW5nNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvU3ByaW5nV2ViQXBwbGljYXRpb25Jbml0aWFsaXplci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwYTA1NGYKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvc3ByaW5nNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvU3ByaW5nV2ViQXBwbGljYXRpb25Jbml0aWFsaXplci5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZzsKKworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworCitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuV2ViQXBwbGljYXRpb25Jbml0aWFsaXplcjsKKworLyoqCisgKiBTcHJpbmcgV2ViQXBwbGljYXRpb25Jbml0aWFsaXplciBpbXBsZW1lbnRhdGlvbiBpbml0aWFsaXplcyBTcHJpbmcgY29udGV4dCBieQorICogYWRkaW5nIGEgU3ByaW5nIENvbnRleHRMb2FkZXJMaXN0ZW5lciB0byB0aGUgU2VydmxldENvbnRleHQuCisgKgorICogQGF1dGhvciBNYXJrbyBBc3BsdW5kIChtYXJrby5hc3BsdW5kIGF0IHlhaG9vLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFNwcmluZ1dlYkFwcGxpY2F0aW9uSW5pdGlhbGl6ZXIgaW1wbGVtZW50cyBXZWJBcHBsaWNhdGlvbkluaXRpYWxpemVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFNwcmluZ1dlYkFwcGxpY2F0aW9uSW5pdGlhbGl6ZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJfTkFNRV9DVFhfQ09ORklHX0xPQ0FUSU9OID0gImNvbnRleHRDb25maWdMb2NhdGlvbiI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblN0YXJ0dXAoU2VydmxldENvbnRleHQgc2MpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHNjLmdldEluaXRQYXJhbWV0ZXIoUEFSX05BTUVfQ1RYX0NPTkZJR19MT0NBVElPTikgPT0gbnVsbCkgeworICAgICAgICAgICAgTE9HR0VSLmNvbmZpZyhMb2NhbGl6YXRpb25NZXNzYWdlcy5SRUdJU1RFUklOR19DVFhfTE9BREVSX0xJU1RFTkVSKCkpOworICAgICAgICAgICAgc2Muc2V0SW5pdFBhcmFtZXRlcihQQVJfTkFNRV9DVFhfQ09ORklHX0xPQ0FUSU9OLCAiY2xhc3NwYXRoOmFwcGxpY2F0aW9uQ29udGV4dC54bWwiKTsKKyAgICAgICAgICAgIHNjLmFkZExpc3RlbmVyKCJvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5jb250ZXh0LkNvbnRleHRMb2FkZXJMaXN0ZW5lciIpOworICAgICAgICAgICAgc2MuYWRkTGlzdGVuZXIoIm9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmNvbnRleHQucmVxdWVzdC5SZXF1ZXN0Q29udGV4dExpc3RlbmVyIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0dHRVIuY29uZmlnKExvY2FsaXphdGlvbk1lc3NhZ2VzLlNLSVBQSU5HX0NUWF9MT0RBRVJfTElTVEVORVJfUkVHSVNUUkFUSU9OKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L3NwcmluZzQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3BhY2thZ2UtaW5mby5qYXZhIGIvZXh0L3NwcmluZzQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNzY0NzAKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvc3ByaW5nNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoqCisgKiBKZXJzZXkgc2VydmVyLXNpZGUgU3ByaW5nIDQgaW50ZWdyYXRpb24gY2xhc3Nlcy4KKyAqCisgKi8KK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZzsKZGlmZiAtLWdpdCBhL2V4dC9zcHJpbmc0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy9zY29wZS9KYXhyc1JlcXVlc3RBdHRyaWJ1dGVzLmphdmEgYi9leHQvc3ByaW5nNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvc2NvcGUvSmF4cnNSZXF1ZXN0QXR0cmlidXRlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZWIzMjEKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvc3ByaW5nNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvc2NvcGUvSmF4cnNSZXF1ZXN0QXR0cmlidXRlcy5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy5zY29wZTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmcuTG9jYWxpemF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay51dGlsLlN0cmluZ1V0aWxzOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmNvbnRleHQucmVxdWVzdC5BYnN0cmFjdFJlcXVlc3RBdHRyaWJ1dGVzOworCisvKioKKyAqIEpBWC1SUyBiYXNlZCBTcHJpbmcgUmVxdWVzdEF0dHJpYnV0ZXMgaW1wbGVtZW50YXRpb24uCisgKgorICogQGF1dGhvciBNYXJrbyBBc3BsdW5kIChtYXJrby5hc3BsdW5kIGF0IHlhaG9vLmNvbSkKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK2NsYXNzIEpheHJzUmVxdWVzdEF0dHJpYnV0ZXMgZXh0ZW5kcyBBYnN0cmFjdFJlcXVlc3RBdHRyaWJ1dGVzIHsKKworICAgIHByaXZhdGUgZmluYWwgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQ7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdENvbnRleHQgSkFYLVJTIGNvbnRhaW5lciByZXF1ZXN0IGNvbnRleHQKKyAgICAgKi8KKyAgICBwdWJsaWMgSmF4cnNSZXF1ZXN0QXR0cmlidXRlcyhDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgeworICAgICAgICB0aGlzLnJlcXVlc3RDb250ZXh0ID0gcmVxdWVzdENvbnRleHQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlQWNjZXNzZWRTZXNzaW9uQXR0cmlidXRlcygpIHsKKyAgICAgICAgLy8gc2Vzc2lvbnMgbm90IHN1cHBvcnRlZAorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKFN0cmluZyBuYW1lLCBpbnQgc2NvcGUpIHsKKyAgICAgICAgcmV0dXJuIHJlcXVlc3RDb250ZXh0LmdldFByb3BlcnR5KG5hbWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlLCBpbnQgc2NvcGUpIHsKKyAgICAgICAgcmVxdWVzdENvbnRleHQuc2V0UHJvcGVydHkobmFtZSwgdmFsdWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlbW92ZUF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgaW50IHNjb3BlKSB7CisgICAgICAgIHJlcXVlc3RDb250ZXh0LnJlbW92ZVByb3BlcnR5KG5hbWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmdbXSBnZXRBdHRyaWJ1dGVOYW1lcyhpbnQgc2NvcGUpIHsKKyAgICAgICAgaWYgKCFpc1JlcXVlc3RBY3RpdmUoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5OT1RfSU5fUkVRVUVTVF9TQ09QRSgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gU3RyaW5nVXRpbHMudG9TdHJpbmdBcnJheShyZXF1ZXN0Q29udGV4dC5nZXRQcm9wZXJ0eU5hbWVzKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyRGVzdHJ1Y3Rpb25DYWxsYmFjayhTdHJpbmcgbmFtZSwgUnVubmFibGUgY2FsbGJhY2ssIGludCBzY29wZSkgeworICAgICAgICByZWdpc3RlclJlcXVlc3REZXN0cnVjdGlvbkNhbGxiYWNrKG5hbWUsIGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IHJlc29sdmVSZWZlcmVuY2UoU3RyaW5nIGtleSkgeworICAgICAgICBpZiAoUkVGRVJFTkNFX1JFUVVFU1QuZXF1YWxzKGtleSkpIHsKKyAgICAgICAgICAgIHJldHVybiByZXF1ZXN0Q29udGV4dDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldFNlc3Npb25JZCgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdCBnZXRTZXNzaW9uTXV0ZXgoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9zcHJpbmc0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy9zY29wZS9KYXhyc1NlcnZsZXRSZXF1ZXN0QXR0cmlidXRlcy5qYXZhIGIvZXh0L3NwcmluZzQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Njb3BlL0pheHJzU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRhMTA1ZgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9zcHJpbmc0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy9zY29wZS9KYXhyc1NlcnZsZXRSZXF1ZXN0QXR0cmlidXRlcy5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy5zY29wZTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CisKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5jb250ZXh0LnJlcXVlc3QuU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzOworCisvKioKKyAqIEpBWC1SUyBiYXNlZCBTcHJpbmcgUmVxdWVzdEF0dHJpYnV0ZXMgaW1wbGVtZW50YXRpb24gZm9yIFNlcnZsZXQtYmFzZWQgYXBwbGljYXRpb25zLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK2NsYXNzIEpheHJzU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzIGV4dGVuZHMgU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVzIHsKKworICAgIHByaXZhdGUgZmluYWwgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQ7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgSkFYLVJTIFNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlcyBpbnN0YW5jZSBmb3IgdGhlIGdpdmVuIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCAgICAgICAgY3VycmVudCBIVFRQIHJlcXVlc3QKKyAgICAgKiBAcGFyYW0gcmVxdWVzdENvbnRleHQgSkFYLVJTIHJlcXVlc3QgY29udGV4dAorICAgICAqLworICAgIHB1YmxpYyBKYXhyc1NlcnZsZXRSZXF1ZXN0QXR0cmlidXRlcyhmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgZmluYWwgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHsKKyAgICAgICAgc3VwZXIocmVxdWVzdCk7CisgICAgICAgIHRoaXMucmVxdWVzdENvbnRleHQgPSByZXF1ZXN0Q29udGV4dDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IHJlc29sdmVSZWZlcmVuY2UoU3RyaW5nIGtleSkgeworICAgICAgICBpZiAoUkVGRVJFTkNFX1JFUVVFU1QuZXF1YWxzKGtleSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3RDb250ZXh0OworICAgICAgICB9IGVsc2UgaWYgKFJFRkVSRU5DRV9TRVNTSU9OLmVxdWFscyhrZXkpKSB7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuZ2V0U2Vzc2lvbih0cnVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L3NwcmluZzQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Njb3BlL1JlcXVlc3RDb250ZXh0RmlsdGVyLmphdmEgYi9leHQvc3ByaW5nNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvc2NvcGUvUmVxdWVzdENvbnRleHRGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2JjYmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L3NwcmluZzQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Njb3BlL1JlcXVlc3RDb250ZXh0RmlsdGVyLmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy5zY29wZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlc3BvbnNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlByZU1hdGNoaW5nOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworCitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LkFwcGxpY2F0aW9uQ29udGV4dDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5jb250ZXh0LldlYkFwcGxpY2F0aW9uQ29udGV4dDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5jb250ZXh0LnJlcXVlc3QuQWJzdHJhY3RSZXF1ZXN0QXR0cmlidXRlczsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5jb250ZXh0LnJlcXVlc3QuUmVxdWVzdEF0dHJpYnV0ZXM7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay53ZWIuY29udGV4dC5yZXF1ZXN0LlJlcXVlc3RDb250ZXh0SG9sZGVyOworCisvKioKKyAqIFNwcmluZyBmaWx0ZXIgdG8gcHJvdmlkZSBhIGJyaWRnZSBiZXR3ZWVuIEpBWC1SUyBhbmQgU3ByaW5nIHJlcXVlc3QgYXR0cmlidXRlcy4KKyAqCisgKiBAYXV0aG9yIE1hcmtvIEFzcGx1bmQgKG1hcmtvLmFzcGx1bmQgYXQgeWFob28uY29tKQorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQcm92aWRlcgorQFByZU1hdGNoaW5nCitwdWJsaWMgZmluYWwgY2xhc3MgUmVxdWVzdENvbnRleHRGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyLCBDb250YWluZXJSZXNwb25zZUZpbHRlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUVTVF9BVFRSSUJVVEVTX1BST1BFUlRZID0gUmVxdWVzdENvbnRleHRGaWx0ZXIuY2xhc3MuZ2V0TmFtZSgpICsgIi5SRVFVRVNUX0FUVFJJQlVURVMiOworCisgICAgcHJpdmF0ZSBmaW5hbCBTcHJpbmdBdHRyaWJ1dGVDb250cm9sbGVyIGF0dHJpYnV0ZUNvbnRyb2xsZXI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTcHJpbmdBdHRyaWJ1dGVDb250cm9sbGVyIEVNUFRZX0FUVFJJQlVURV9DT05UUk9MTEVSID0gbmV3IFNwcmluZ0F0dHJpYnV0ZUNvbnRyb2xsZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVzKGZpbmFsIENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgcmVzZXRBdHRyaWJ1dGVzKGZpbmFsIENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBpbnRlcmZhY2UgU3ByaW5nQXR0cmlidXRlQ29udHJvbGxlciB7CisKKyAgICAgICAgdm9pZCBzZXRBdHRyaWJ1dGVzKGZpbmFsIENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KTsKKworICAgICAgICB2b2lkIHJlc2V0QXR0cmlidXRlcyhmaW5hbCBDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IHJlcXVlc3QgY29udGV4dCBmaWx0ZXIgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb24gbWFuYWdlci4KKyAgICAgKi8KKyAgICBASW5qZWN0CisgICAgcHVibGljIFJlcXVlc3RDb250ZXh0RmlsdGVyKGZpbmFsIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlcikgeworICAgICAgICBmaW5hbCBBcHBsaWNhdGlvbkNvbnRleHQgYXBwQ3R4ID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShBcHBsaWNhdGlvbkNvbnRleHQuY2xhc3MpOworICAgICAgICBmaW5hbCBib29sZWFuIGlzV2ViQXBwID0gYXBwQ3R4IGluc3RhbmNlb2YgV2ViQXBwbGljYXRpb25Db250ZXh0OworCisgICAgICAgIGF0dHJpYnV0ZUNvbnRyb2xsZXIgPSBhcHBDdHggIT0gbnVsbCA/IG5ldyBTcHJpbmdBdHRyaWJ1dGVDb250cm9sbGVyKCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZXMoZmluYWwgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBSZXF1ZXN0QXR0cmlidXRlcyBhdHRyaWJ1dGVzOworICAgICAgICAgICAgICAgIGlmIChpc1dlYkFwcCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgaHR0cFJlcXVlc3QgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKEh0dHBTZXJ2bGV0UmVxdWVzdC5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMgPSBuZXcgSmF4cnNTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZXMoaHR0cFJlcXVlc3QsIHJlcXVlc3RDb250ZXh0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gbmV3IEpheHJzUmVxdWVzdEF0dHJpYnV0ZXMocmVxdWVzdENvbnRleHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5zZXRQcm9wZXJ0eShSRVFVRVNUX0FUVFJJQlVURVNfUFJPUEVSVFksIGF0dHJpYnV0ZXMpOworICAgICAgICAgICAgICAgIFJlcXVlc3RDb250ZXh0SG9sZGVyLnNldFJlcXVlc3RBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0QXR0cmlidXRlcyhmaW5hbCBDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgeworICAgICAgICAgICAgICAgIGZpbmFsIEFic3RyYWN0UmVxdWVzdEF0dHJpYnV0ZXMgYXR0cmlidXRlcyA9CisgICAgICAgICAgICAgICAgICAgICAgICAoQWJzdHJhY3RSZXF1ZXN0QXR0cmlidXRlcykgcmVxdWVzdENvbnRleHQuZ2V0UHJvcGVydHkoUkVRVUVTVF9BVFRSSUJVVEVTX1BST1BFUlRZKTsKKyAgICAgICAgICAgICAgICBSZXF1ZXN0Q29udGV4dEhvbGRlci5yZXNldFJlcXVlc3RBdHRyaWJ1dGVzKCk7CisgICAgICAgICAgICAgICAgYXR0cmlidXRlcy5yZXF1ZXN0Q29tcGxldGVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gOiBFTVBUWV9BVFRSSUJVVEVfQ09OVFJPTExFUjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoZmluYWwgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGF0dHJpYnV0ZUNvbnRyb2xsZXIuc2V0QXR0cmlidXRlcyhyZXF1ZXN0Q29udGV4dCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZmlsdGVyKGZpbmFsIENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LCBmaW5hbCBDb250YWluZXJSZXNwb25zZUNvbnRleHQgcmVzcG9uc2VDb250ZXh0KQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYXR0cmlidXRlQ29udHJvbGxlci5yZXNldEF0dHJpYnV0ZXMocmVxdWVzdENvbnRleHQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9zcHJpbmc0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy9zY29wZS9wYWNrYWdlLWluZm8uamF2YSBiL2V4dC9zcHJpbmc0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy9zY29wZS9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTViMmM1Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L3NwcmluZzQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Njb3BlL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKKy8qKgorICogSmVyc2V5IHNlcnZlci1zaWRlIFNwcmluZyA0IGludGVncmF0aW9uIGluamVjdGlvbiBzY29wZXMgcmVsYXRlZCBjbGFzc2VzLgorICoKKyAqLworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLnNjb3BlOwpkaWZmIC0tZ2l0IGEvZXh0L3NwcmluZzQvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29tcG9uZW50UHJvdmlkZXIgYi9leHQvc3ByaW5nNC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5Db21wb25lbnRQcm92aWRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWVjMjA3Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L3NwcmluZzQvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29tcG9uZW50UHJvdmlkZXIKQEAgLTAsMCArMSBAQAorb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy5TcHJpbmdDb21wb25lbnRQcm92aWRlcgpkaWZmIC0tZ2l0IGEvZXh0L3NwcmluZzQvc3JjL21haW4vcmVzb3VyY2VzL2plcnNleS1zcHJpbmctYXBwbGljYXRpb25Db250ZXh0LnhtbCBiL2V4dC9zcHJpbmc0L3NyYy9tYWluL3Jlc291cmNlcy9qZXJzZXktc3ByaW5nLWFwcGxpY2F0aW9uQ29udGV4dC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBlNGRkYQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9zcHJpbmc0L3NyYy9tYWluL3Jlc291cmNlcy9qZXJzZXktc3ByaW5nLWFwcGxpY2F0aW9uQ29udGV4dC54bWwKQEAgLTAsMCArMSwzNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8YmVhbnMgeG1sbnM9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMiCisgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMKKwlodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zL3NwcmluZy1iZWFucy0zLjAueHNkIj4KKworICAgIDxiZWFuIGNsYXNzPSJvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuY29uZmlnLkN1c3RvbVNjb3BlQ29uZmlndXJlciI+CisgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJzY29wZXMiPgorICAgICAgICAgICAgPG1hcD4KKyAgICAgICAgICAgICAgICA8ZW50cnkga2V5PSJyZXF1ZXN0Ij4KKyAgICAgICAgICAgICAgICAgICAgPGJlYW4gY2xhc3M9Im9yZy5zcHJpbmdmcmFtZXdvcmsud2ViLmNvbnRleHQucmVxdWVzdC5SZXF1ZXN0U2NvcGUiLz4KKyAgICAgICAgICAgICAgICA8L2VudHJ5PgorICAgICAgICAgICAgPC9tYXA+CisgICAgICAgIDwvcHJvcGVydHk+CisgICAgPC9iZWFuPgorPC9iZWFucz4KZGlmZiAtLWdpdCBhL2V4dC9zcHJpbmc0L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL2xvY2FsaXphdGlvbi5wcm9wZXJ0aWVzIGIvZXh0L3NwcmluZzQvc3JjL21haW4vcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZkMGEwNgotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9zcHJpbmc0L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL2xvY2FsaXphdGlvbi5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjYgQEAKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisjCisjIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyMgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorIyBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyMgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorIworIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyMKKworbm8uYmVhbnMuZm91bmQuZm9yLnR5cGU9Tm8gYmVhbnMgZm91bmQuIFJlc29sdXRpb24gZmFpbGVkIGZvciB0eXBlIHswfS4KK2N0eC5sb29rdXAuc3RhcnRlZD1TcHJpbmcgY29udGV4dCBsb29rdXAgc3RhcnRlZC4KK2N0eC5sb29rdXAuZmFpbGVkPVNwcmluZyBjb250ZXh0IGxvb2t1cCBmYWlsZWQsIHNraXBwaW5nIHNwcmluZyBjb21wb25lbnQgcHJvdmlkZXIgaW5pdGlhbGl6YXRpb24uCitjdHgubG9va3VwLnN1Y2Vzc2Z1bD1TcHJpbmcgY29udGV4dCBsb29rdXAgZG9uZS4KK3NwcmluZy5jb21wb25lbnQucHJvdmlkZXIuaW5pdGlhbGl6ZWQ9U3ByaW5nIGNvbXBvbmVudCBwcm92aWRlciBpbml0aWFsaXplZC4KK25vbmUub3IubXVsdGlwbGUuYmVhbnMuYXZhaWxhYmxlPU5vbmUgb3IgbXVsdGlwbGUgYmVhbnMgZm91bmQgaW4gU3ByaW5nIGNvbnRleHQgZm9yIHR5cGUgezB9LCBza2lwcGluZyB0aGUgdHlwZS4KK2JlYW4ucmVnaXN0ZXJlZD1TcHJpbmcgbWFuYWdlZCBiZWFuLCB7MH0sIHJlZ2lzdGVyZWQgd2l0aCBISzIuCityZWdpc3RlcmluZy5jdHgubG9hZGVyLmxpc3RlbmVyPVJlZ2lzdGVyaW5nIFNwcmluZyBDb250ZXh0TG9hZGVyTGlzdGVuZXIKK3NraXBwaW5nLmN0eC5sb2RhZXIubGlzdGVuZXIucmVnaXN0cmF0aW9uPVByZXN1bWluZyBTcHJpbmcgQ29udGV4dExvYWRlckxpc3RlbmVyIHdhcyBtYW51YWxseSByZWdpc3RlcmVkLiBTa2lwcGluZyBjb250ZXh0IGxvYWRlciByZWdpc3RyYXRpb24uCitub3QuaW4ucmVxdWVzdC5zY29wZT1DYW5ub3QgYXNrIGZvciByZXF1ZXN0IGF0dHJpYnV0ZXMgLSByZXF1ZXN0IGlzIG5vdCBhY3RpdmUgYW55bW9yZSEKZGlmZiAtLWdpdCBhL2V4dC9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy9Ob0NvbXBvbmVudC5qYXZhIGIvZXh0L3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL05vQ29tcG9uZW50LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTExMzYxYwotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy9Ob0NvbXBvbmVudC5qYXZhCkBAIC0wLDAgKzEsMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZzsKKworcHVibGljIGNsYXNzIE5vQ29tcG9uZW50IHsKKworfQpkaWZmIC0tZ2l0IGEvZXh0L3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL1NwcmluZ1Rlc3RDb25maWd1cmF0aW9uLmphdmEgYi9leHQvc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvU3ByaW5nVGVzdENvbmZpZ3VyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTgxMjNjCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL1NwcmluZ1Rlc3RDb25maWd1cmF0aW9uLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nOworCitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LmFubm90YXRpb24uQ29tcG9uZW50U2NhbjsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuYW5ub3RhdGlvbi5Db25maWd1cmF0aW9uOworCitAQ29uZmlndXJhdGlvbgorQENvbXBvbmVudFNjYW4oYmFzZVBhY2thZ2VzID0gIm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmciKQorcHVibGljIGNsYXNzIFNwcmluZ1Rlc3RDb25maWd1cmF0aW9uIHsKK30KZGlmZiAtLWdpdCBhL2V4dC9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy9UZXN0Q29tcG9uZW50MS5qYXZhIGIvZXh0L3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL1Rlc3RDb21wb25lbnQxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EwNjVjMQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy9UZXN0Q29tcG9uZW50MS5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZzsKKworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db21wb25lbnQ7CisKK0BDb21wb25lbnQKK3B1YmxpYyBjbGFzcyBUZXN0Q29tcG9uZW50MSB7CisKKyAgICBwdWJsaWMgU3RyaW5nIHJlc3VsdCgpIHsKKyAgICAgICAgcmV0dXJuICJ0ZXN0IG9rIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvVGVzdENvbXBvbmVudDIuamF2YSBiL2V4dC9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy9UZXN0Q29tcG9uZW50Mi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MmQ5YjgKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvVGVzdENvbXBvbmVudDIuamF2YQpAQCAtMCwwICsxLDIxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmc7CisKK3B1YmxpYyBpbnRlcmZhY2UgVGVzdENvbXBvbmVudDIgeworICAgIFN0cmluZyByZXN1bHQoKTsKK30KZGlmZiAtLWdpdCBhL2V4dC9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy9UZXN0Q29tcG9uZW50MkltcGwxLmphdmEgYi9leHQvc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvVGVzdENvbXBvbmVudDJJbXBsMS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4YzYxZDAKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvVGVzdENvbXBvbmVudDJJbXBsMS5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZzsKKworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db21wb25lbnQ7CisKK0BDb21wb25lbnQKK3B1YmxpYyBjbGFzcyBUZXN0Q29tcG9uZW50MkltcGwxIGltcGxlbWVudHMgVGVzdENvbXBvbmVudDIgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgcmVzdWx0KCkgeworICAgICAgICByZXR1cm4gInRlc3Qgb2siOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy9UZXN0Q29tcG9uZW50MkltcGwyLmphdmEgYi9leHQvc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvVGVzdENvbXBvbmVudDJJbXBsMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MDBjZDQKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvVGVzdENvbXBvbmVudDJJbXBsMi5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZzsKKworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db21wb25lbnQ7CisKK0BDb21wb25lbnQKK3B1YmxpYyBjbGFzcyBUZXN0Q29tcG9uZW50MkltcGwyIGltcGxlbWVudHMgVGVzdENvbXBvbmVudDIgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgcmVzdWx0KCkgeworICAgICAgICByZXR1cm4gInRlc3Qgb2siOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy9hc3BlY3Q0ai9Bc3BlY3Q0SlRlc3QuamF2YSBiL2V4dC9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy9hc3BlY3Q0ai9Bc3BlY3Q0SlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjY0MDM0Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL2FzcGVjdDRqL0FzcGVjdDRKVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy5hc3BlY3Q0ajsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuc3VwcG9ydC5DbGFzc1BhdGhYbWxBcHBsaWNhdGlvbkNvbnRleHQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK3B1YmxpYyBjbGFzcyBBc3BlY3Q0SlRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgQ2xhc3NQYXRoWG1sQXBwbGljYXRpb25Db250ZXh0IGFwcGxpY2F0aW9uQ29udGV4dDsKKworICAgIHByaXZhdGUgVGVzdEFzcGVjdCB0ZXN0QXNwZWN0OworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIGJlZm9yZSgpIHsKKyAgICAgICAgdGVzdEFzcGVjdC5yZXNldCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIGFwcGxpY2F0aW9uQ29udGV4dCA9IG5ldyBDbGFzc1BhdGhYbWxBcHBsaWNhdGlvbkNvbnRleHQoImplcnNleS1zcHJpbmctYXNwZWN0NGotYXBwbGljYXRpb25Db250ZXh0LnhtbCIpOworICAgICAgICB0ZXN0QXNwZWN0ID0gYXBwbGljYXRpb25Db250ZXh0LmdldEJlYW4oVGVzdEFzcGVjdC5jbGFzcyk7CisgICAgICAgIHJldHVybiBuZXcgQXNwZWN0NGpKZXJzZXlDb25maWcoKQorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eSgiY29udGV4dENvbmZpZyIsIGFwcGxpY2F0aW9uQ29udGV4dCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBtZXRob2RDYWxsU2hvdWxkTm90QmVJbnRlcmNlcHRlZCgpIHsKKyAgICAgICAgdGFyZ2V0KCJ0ZXN0MSIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHRlc3RBc3BlY3QuZ2V0SW50ZXJjZXB0aW9ucygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIG1ldGhvZENhbGxTaG91bGRCZUludGVyY2VwdGVkKCkgeworICAgICAgICB0YXJnZXQoInRlc3QyIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYXBwbGljYXRpb25Db250ZXh0LmdldEJlYW4oVGVzdEFzcGVjdC5jbGFzcykuZ2V0SW50ZXJjZXB0aW9ucygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIEpFUlNFWV8zMTI2KCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzdWx0ID0gdGFyZ2V0KCJKRVJTRVktMzEyNiIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0IG9rIiwgcmVzdWx0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvYXNwZWN0NGovQXNwZWN0NGpKZXJzZXlDb25maWcuamF2YSBiL2V4dC9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy9hc3BlY3Q0ai9Bc3BlY3Q0akplcnNleUNvbmZpZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MDZjN2UKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvYXNwZWN0NGovQXNwZWN0NGpKZXJzZXlDb25maWcuamF2YQpAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmcuYXNwZWN0NGo7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy5zY29wZS5SZXF1ZXN0Q29udGV4dEZpbHRlcjsKKworcHVibGljIGNsYXNzIEFzcGVjdDRqSmVyc2V5Q29uZmlnIGV4dGVuZHMgUmVzb3VyY2VDb25maWcgeworCisgICAgcHVibGljIEFzcGVjdDRqSmVyc2V5Q29uZmlnKCkgeworICAgICAgICByZWdpc3RlcihSZXF1ZXN0Q29udGV4dEZpbHRlci5jbGFzcyk7CisgICAgICAgIHJlZ2lzdGVyKE5vQ29tcG9uZW50UmVzb3VyY2UuY2xhc3MpOworICAgICAgICByZWdpc3RlcihDb21wb25lbnRSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL2FzcGVjdDRqL0NvbXBvbmVudFJlc291cmNlLmphdmEgYi9leHQvc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvYXNwZWN0NGovQ29tcG9uZW50UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWIzNTk2Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL2FzcGVjdDRqL0NvbXBvbmVudFJlc291cmNlLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLmFzcGVjdDRqOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmcuVGVzdENvbXBvbmVudDE7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uQXV0b3dpcmVkOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db21wb25lbnQ7CisKK0BQYXRoKCIvIikKK0BDb21wb25lbnQKK3B1YmxpYyBjbGFzcyBDb21wb25lbnRSZXNvdXJjZSB7CisKKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBUZXN0Q29tcG9uZW50MSB0ZXN0Q29tcG9uZW50MTsKKyAgICBAQ29udGV4dAorICAgIHByaXZhdGUgVXJpSW5mbyB1cmlJbmZvOworCisgICAgQFBhdGgoInRlc3QyIikKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyB0ZXN0MigpIHsKKyAgICAgICAgcmV0dXJuIHRlc3RDb21wb25lbnQxLnJlc3VsdCgpOworICAgIH0KKworICAgIEBQYXRoKCJKRVJTRVktMzEyNiIpCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgSkVSU0VZXzMxMjYoKSB7CisgICAgICAgIHJldHVybiB1cmlJbmZvID09IG51bGwgPyAidGVzdCBmYWlsZWQiIDogInRlc3Qgb2siOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZXh0L3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL2FzcGVjdDRqL05vQ29tcG9uZW50UmVzb3VyY2UuamF2YSBiL2V4dC9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy9hc3BlY3Q0ai9Ob0NvbXBvbmVudFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFhMzY0MwotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy9hc3BlY3Q0ai9Ob0NvbXBvbmVudFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLmFzcGVjdDRqOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLlRlc3RDb21wb25lbnQxOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuQ29tcG9uZW50OworCitAUGF0aCgiLyIpCitwdWJsaWMgY2xhc3MgTm9Db21wb25lbnRSZXNvdXJjZSB7CisKKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBUZXN0Q29tcG9uZW50MSB0ZXN0Q29tcG9uZW50MTsKKworICAgIEBQYXRoKCJ0ZXN0MSIpCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgdGVzdDEoKSB7CisgICAgICAgIHJldHVybiB0ZXN0Q29tcG9uZW50MS5yZXN1bHQoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2V4dC9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy9hc3BlY3Q0ai9UZXN0QXNwZWN0LmphdmEgYi9leHQvc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvYXNwZWN0NGovVGVzdEFzcGVjdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhODA2MTQKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvYXNwZWN0NGovVGVzdEFzcGVjdC5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy5hc3BlY3Q0ajsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuYXNwZWN0ai5sYW5nLkpvaW5Qb2ludDsKK2ltcG9ydCBvcmcuYXNwZWN0ai5sYW5nLmFubm90YXRpb24uQXNwZWN0OworaW1wb3J0IG9yZy5hc3BlY3RqLmxhbmcuYW5ub3RhdGlvbi5CZWZvcmU7CisKK0BBc3BlY3QKK0BTaW5nbGV0b24KK3B1YmxpYyBjbGFzcyBUZXN0QXNwZWN0IHsKKworICAgIHByaXZhdGUgaW50IGludGVyY2VwdGlvbnMgPSAwOworCisgICAgQEJlZm9yZSgiZXhlY3V0aW9uKCogb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy5hc3BlY3Q0ai4qLiooKSkiKQorICAgIHB1YmxpYyB2b2lkIGludGVyY2VwdChKb2luUG9pbnQgam9pblBvaW50KSB7CisgICAgICAgIGludGVyY2VwdGlvbnMrKzsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldEludGVyY2VwdGlvbnMoKSB7CisgICAgICAgIHJldHVybiBpbnRlcmNlcHRpb25zOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICBpbnRlcmNlcHRpb25zID0gMDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvZmllbGRpbmplY3Rpb24vU3ByaW5nRmllbGRJbmplY3Rpb25KZXJzZXlUZXN0Q29uZmlnLmphdmEgYi9leHQvc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvZmllbGRpbmplY3Rpb24vU3ByaW5nRmllbGRJbmplY3Rpb25KZXJzZXlUZXN0Q29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYzMDgwNQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy9maWVsZGluamVjdGlvbi9TcHJpbmdGaWVsZEluamVjdGlvbkplcnNleVRlc3RDb25maWcuamF2YQpAQCAtMCwwICsxLDI3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmcuZmllbGRpbmplY3Rpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy5zY29wZS5SZXF1ZXN0Q29udGV4dEZpbHRlcjsKKworcHVibGljIGNsYXNzIFNwcmluZ0ZpZWxkSW5qZWN0aW9uSmVyc2V5VGVzdENvbmZpZyBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKyAgICBwdWJsaWMgU3ByaW5nRmllbGRJbmplY3Rpb25KZXJzZXlUZXN0Q29uZmlnKCkgeworICAgICAgICByZWdpc3RlcihSZXF1ZXN0Q29udGV4dEZpbHRlci5jbGFzcyk7CisgICAgICAgIHJlZ2lzdGVyKFNwcmluZ0ZpZWxkSW5qZWN0aW9uVGVzdFJlc291cmNlLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvZmllbGRpbmplY3Rpb24vU3ByaW5nRmllbGRJbmplY3Rpb25UZXN0LmphdmEgYi9leHQvc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvZmllbGRpbmplY3Rpb24vU3ByaW5nRmllbGRJbmplY3Rpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVjM2E1NAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy9maWVsZGluamVjdGlvbi9TcHJpbmdGaWVsZEluamVjdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmcuZmllbGRpbmplY3Rpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy5TcHJpbmdUZXN0Q29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LkFwcGxpY2F0aW9uQ29udGV4dDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uQ29uZmlnQXBwbGljYXRpb25Db250ZXh0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitwdWJsaWMgY2xhc3MgU3ByaW5nRmllbGRJbmplY3Rpb25UZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBBcHBsaWNhdGlvbkNvbnRleHQgY29udGV4dCA9IG5ldyBBbm5vdGF0aW9uQ29uZmlnQXBwbGljYXRpb25Db250ZXh0KFNwcmluZ1Rlc3RDb25maWd1cmF0aW9uLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIG5ldyBTcHJpbmdGaWVsZEluamVjdGlvbkplcnNleVRlc3RDb25maWcoKQorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eSgiY29udGV4dENvbmZpZyIsIGNvbnRleHQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluamVjdGlvbk9mU2luZ2xlQmVhbigpIHsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHRhcmdldCgidGVzdDEiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdCBvayIsIHJlc3VsdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5qZWN0aW9uT2ZMaXN0T2ZCZWFucygpIHsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHRhcmdldCgidGVzdDIiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdCBvayIsIHJlc3VsdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5qZWN0aW9uT2ZTZXRPZkJlYW5zKCkgeworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gdGFyZ2V0KCJ0ZXN0MyIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0IG9rIiwgcmVzdWx0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIEpFUlNFWV8yNjQzKCkgeworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gdGFyZ2V0KCJKRVJTRVktMjY0MyIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0IG9rIiwgcmVzdWx0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvZmllbGRpbmplY3Rpb24vU3ByaW5nRmllbGRJbmplY3Rpb25UZXN0UmVzb3VyY2UuamF2YSBiL2V4dC9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy9maWVsZGluamVjdGlvbi9TcHJpbmdGaWVsZEluamVjdGlvblRlc3RSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZTZkZTEKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvZmllbGRpbmplY3Rpb24vU3ByaW5nRmllbGRJbmplY3Rpb25UZXN0UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmcuZmllbGRpbmplY3Rpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmcuTm9Db21wb25lbnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy5UZXN0Q29tcG9uZW50MTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLlRlc3RDb21wb25lbnQyOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKKworQFBhdGgoIi8iKQorcHVibGljIGNsYXNzIFNwcmluZ0ZpZWxkSW5qZWN0aW9uVGVzdFJlc291cmNlIHsKKworICAgIEBBdXRvd2lyZWQKKyAgICBwcml2YXRlIFRlc3RDb21wb25lbnQxIHRlc3RDb21wb25lbnQxOworCisgICAgQEF1dG93aXJlZAorICAgIHByaXZhdGUgTGlzdDxUZXN0Q29tcG9uZW50Mj4gdGVzdENvbXBvbmVudDJMaXN0OworCisgICAgQEF1dG93aXJlZAorICAgIFNldDxUZXN0Q29tcG9uZW50Mj4gdGVzdENvbXBvbmVudDJTZXQ7CisKKyAgICBAQXV0b3dpcmVkKHJlcXVpcmVkID0gZmFsc2UpCisgICAgcHJpdmF0ZSBOb0NvbXBvbmVudCBub0NvbXBvbmVudDsKKworICAgIEBQYXRoKCJ0ZXN0MSIpCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgdGVzdDEoKSB7CisgICAgICAgIHJldHVybiB0ZXN0Q29tcG9uZW50MS5yZXN1bHQoKTsKKyAgICB9CisKKyAgICBAUGF0aCgidGVzdDIiKQorICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIHRlc3QyKCkgeworICAgICAgICByZXR1cm4gKHRlc3RDb21wb25lbnQyTGlzdC5zaXplKCkgPT0gMiAmJiAidGVzdCBvayIuZXF1YWxzKHRlc3RDb21wb25lbnQyTGlzdC5nZXQoMCkucmVzdWx0KCkpCisgICAgICAgICAgICAgICAgJiYgInRlc3Qgb2siLmVxdWFscyh0ZXN0Q29tcG9uZW50Mkxpc3QuZ2V0KDEpLnJlc3VsdCgpKSkgPyAidGVzdCBvayIgOiAidGVzdCBmYWlsZWQiOworICAgIH0KKworICAgIEBQYXRoKCJ0ZXN0MyIpCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgdGVzdDMoKSB7CisgICAgICAgIEl0ZXJhdG9yPFRlc3RDb21wb25lbnQyPiBpdGVyYXRvciA9IHRlc3RDb21wb25lbnQyU2V0Lml0ZXJhdG9yKCk7CisgICAgICAgIHJldHVybiAodGVzdENvbXBvbmVudDJTZXQuc2l6ZSgpID09IDIgJiYgInRlc3Qgb2siLmVxdWFscyhpdGVyYXRvci5uZXh0KCkucmVzdWx0KCkpCisgICAgICAgICAgICAgICAgJiYgInRlc3Qgb2siLmVxdWFscyhpdGVyYXRvci5uZXh0KCkucmVzdWx0KCkpKSA/ICJ0ZXN0IG9rIiA6ICJ0ZXN0IGZhaWxlZCI7CisgICAgfQorCisgICAgQFBhdGgoIkpFUlNFWS0yNjQzIikKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBKRVJTRVlfMjY0MygpIHsKKyAgICAgICAgcmV0dXJuIG5vQ29tcG9uZW50ID09IG51bGwgPyAidGVzdCBvayIgOiAidGVzdCBmYWlsZWQiOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZXh0L3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL2ZpbHRlci9Db3VudGVyLmphdmEgYi9leHQvc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvZmlsdGVyL0NvdW50ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGRlMjM3Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL2ZpbHRlci9Db3VudGVyLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLmZpbHRlcjsKKworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db21wb25lbnQ7CisKK0BDb21wb25lbnQKK3B1YmxpYyBjbGFzcyBDb3VudGVyIHsKKworICAgIHByaXZhdGUgaW50IGNvdW50ID0gMDsKKworICAgIHB1YmxpYyB2b2lkIGluYygpIHsKKyAgICAgICAgY291bnQrKzsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldENvdW50KCkgeworICAgICAgICByZXR1cm4gY291bnQ7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9leHQvc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvZmlsdGVyL0ZpbHRlclRlc3QuamF2YSBiL2V4dC9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy9maWx0ZXIvRmlsdGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzOWI2MzMKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvZmlsdGVyL0ZpbHRlclRlc3QuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmcuZmlsdGVyOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmcuU3ByaW5nVGVzdENvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5BcHBsaWNhdGlvbkNvbnRleHQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LmFubm90YXRpb24uQW5ub3RhdGlvbkNvbmZpZ0FwcGxpY2F0aW9uQ29udGV4dDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworcHVibGljIGNsYXNzIEZpbHRlclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgQXBwbGljYXRpb25Db250ZXh0IGNvbnRleHQ7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBjb250ZXh0ID0gbmV3IEFubm90YXRpb25Db25maWdBcHBsaWNhdGlvbkNvbnRleHQoU3ByaW5nVGVzdENvbmZpZ3VyYXRpb24uY2xhc3MpOworICAgICAgICByZXR1cm4gbmV3IEplcnNleVRlc3RDb25maWcoKQorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eSgiY29udGV4dENvbmZpZyIsIGNvbnRleHQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluamVjdGlvbk9mU2luZ2xlQmVhbigpIHsKKyAgICAgICAgdGFyZ2V0KCJ0ZXN0MSIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNvbnRleHQuZ2V0QmVhbihDb3VudGVyLmNsYXNzKS5nZXRDb3VudCgpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2V4dC9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy9maWx0ZXIvSmVyc2V5VGVzdENvbmZpZy5qYXZhIGIvZXh0L3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL2ZpbHRlci9KZXJzZXlUZXN0Q29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZiMzJhOAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy9maWx0ZXIvSmVyc2V5VGVzdENvbmZpZy5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy5maWx0ZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy5zY29wZS5SZXF1ZXN0Q29udGV4dEZpbHRlcjsKKworcHVibGljIGNsYXNzIEplcnNleVRlc3RDb25maWcgZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisKKyAgICBwdWJsaWMgSmVyc2V5VGVzdENvbmZpZygpIHsKKyAgICAgICAgcmVnaXN0ZXIoUmVxdWVzdENvbnRleHRGaWx0ZXIuY2xhc3MpOworICAgICAgICByZWdpc3RlcihUZXN0UmVzb3VyY2UuY2xhc3MpOworICAgICAgICByZWdpc3RlcihUZXN0RmlsdGVyLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvZmlsdGVyL1Rlc3RGaWx0ZXIuamF2YSBiL2V4dC9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy9maWx0ZXIvVGVzdEZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYzRhZmIKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvZmlsdGVyL1Rlc3RGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmcuZmlsdGVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0RmlsdGVyOworCitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLkNvbXBvbmVudDsKKworQENvbXBvbmVudAorQFNpbmdsZXRvbgorcHVibGljIGNsYXNzIFRlc3RGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHsKKworICAgIEBJbmplY3QKKyAgICBwcml2YXRlIENvdW50ZXIgY291bnRlcjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZpbHRlcihmaW5hbCBDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY291bnRlci5pbmMoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2V4dC9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy9maWx0ZXIvVGVzdFJlc291cmNlLmphdmEgYi9leHQvc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvZmlsdGVyL1Rlc3RSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MDE2MjkKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvZmlsdGVyL1Rlc3RSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy5maWx0ZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworQFBhdGgoIi8iKQorcHVibGljIGNsYXNzIFRlc3RSZXNvdXJjZSB7CisKKyAgICBAUGF0aCgidGVzdDEiKQorICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIHRlc3QxKCkgeworICAgICAgICByZXR1cm4gIkhlbGxvLCBUZXN0ISI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL21ldGhvZGluamVjdGlvbi9TcHJpbmdNZXRob2RJbmplY3Rpb25KZXJzZXlUZXN0Q29uZmlnLmphdmEgYi9leHQvc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvbWV0aG9kaW5qZWN0aW9uL1NwcmluZ01ldGhvZEluamVjdGlvbkplcnNleVRlc3RDb25maWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTlkM2I3Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL21ldGhvZGluamVjdGlvbi9TcHJpbmdNZXRob2RJbmplY3Rpb25KZXJzZXlUZXN0Q29uZmlnLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLm1ldGhvZGluamVjdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmcuc2NvcGUuUmVxdWVzdENvbnRleHRGaWx0ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCitwdWJsaWMgY2xhc3MgU3ByaW5nTWV0aG9kSW5qZWN0aW9uSmVyc2V5VGVzdENvbmZpZyBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKyAgICBwdWJsaWMgU3ByaW5nTWV0aG9kSW5qZWN0aW9uSmVyc2V5VGVzdENvbmZpZygpIHsKKyAgICAgICAgcmVnaXN0ZXIoUmVxdWVzdENvbnRleHRGaWx0ZXIuY2xhc3MpOworICAgICAgICByZWdpc3RlcihTcHJpbmdNZXRob2RJbmplY3Rpb25UZXN0UmVzb3VyY2UuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy9tZXRob2RpbmplY3Rpb24vU3ByaW5nTWV0aG9kSW5qZWN0aW9uVGVzdC5qYXZhIGIvZXh0L3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL21ldGhvZGluamVjdGlvbi9TcHJpbmdNZXRob2RJbmplY3Rpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNlNGZlYwotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy9tZXRob2RpbmplY3Rpb24vU3ByaW5nTWV0aG9kSW5qZWN0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy5tZXRob2RpbmplY3Rpb247CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LkFwcGxpY2F0aW9uQ29udGV4dDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uQ29uZmlnQXBwbGljYXRpb25Db250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmcuU3ByaW5nVGVzdENvbmZpZ3VyYXRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitwdWJsaWMgY2xhc3MgU3ByaW5nTWV0aG9kSW5qZWN0aW9uVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgQXBwbGljYXRpb25Db250ZXh0IGNvbnRleHQgPSBuZXcgQW5ub3RhdGlvbkNvbmZpZ0FwcGxpY2F0aW9uQ29udGV4dChTcHJpbmdUZXN0Q29uZmlndXJhdGlvbi5jbGFzcyk7CisgICAgICAgIHJldHVybiBuZXcgU3ByaW5nTWV0aG9kSW5qZWN0aW9uSmVyc2V5VGVzdENvbmZpZygpCisgICAgICAgICAgICAgICAgLnByb3BlcnR5KCJjb250ZXh0Q29uZmlnIiwgY29udGV4dCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5qZWN0aW9uT2ZTaW5nbGVCZWFuKCkgeworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gdGFyZ2V0KCJ0ZXN0MSIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0IG9rIiwgcmVzdWx0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbmplY3Rpb25PZkxpc3RPZkJlYW5zKCkgeworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gdGFyZ2V0KCJ0ZXN0MiIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0IG9rIiwgcmVzdWx0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbmplY3Rpb25PZlNldE9mQmVhbnMoKSB7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSB0YXJnZXQoInRlc3QzIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3Qgb2siLCByZXN1bHQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy9tZXRob2RpbmplY3Rpb24vU3ByaW5nTWV0aG9kSW5qZWN0aW9uVGVzdFJlc291cmNlLmphdmEgYi9leHQvc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvbWV0aG9kaW5qZWN0aW9uL1NwcmluZ01ldGhvZEluamVjdGlvblRlc3RSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjYjNkNjgKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvbWV0aG9kaW5qZWN0aW9uL1NwcmluZ01ldGhvZEluamVjdGlvblRlc3RSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy5tZXRob2RpbmplY3Rpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLk5vQ29tcG9uZW50OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmcuVGVzdENvbXBvbmVudDE7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uQXV0b3dpcmVkOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworQFBhdGgoIi8iKQorcHVibGljIGNsYXNzIFNwcmluZ01ldGhvZEluamVjdGlvblRlc3RSZXNvdXJjZSB7CisKKyAgICBwcml2YXRlIFRlc3RDb21wb25lbnQxIHRlc3RDb21wb25lbnQxOworICAgIHByaXZhdGUgTGlzdDxvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLlRlc3RDb21wb25lbnQyPiB0ZXN0Q29tcG9uZW50Mkxpc3Q7CisgICAgcHJpdmF0ZSBTZXQ8b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy5UZXN0Q29tcG9uZW50Mj4gdGVzdENvbXBvbmVudDJTZXQ7CisgICAgcHJpdmF0ZSBOb0NvbXBvbmVudCBub0NvbXBvbmVudDsKKworICAgIEBBdXRvd2lyZWQKKyAgICBwdWJsaWMgdm9pZCBzZXRUZXN0Q29tcG9uZW50MShUZXN0Q29tcG9uZW50MSB0ZXN0Q29tcG9uZW50MSkgeworICAgICAgICB0aGlzLnRlc3RDb21wb25lbnQxID0gdGVzdENvbXBvbmVudDE7CisgICAgfQorCisgICAgQEF1dG93aXJlZAorICAgIHB1YmxpYyB2b2lkIHNldFRlc3RDb21wb25lbnQyTGlzdChMaXN0PG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmcuVGVzdENvbXBvbmVudDI+IHRlc3RDb21wb25lbnQyTGlzdCkgeworICAgICAgICB0aGlzLnRlc3RDb21wb25lbnQyTGlzdCA9IHRlc3RDb21wb25lbnQyTGlzdDsKKyAgICB9CisKKyAgICBAQXV0b3dpcmVkCisgICAgcHVibGljIHZvaWQgc2V0VGVzdENvbXBvbmVudDJTZXQoU2V0PG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmcuVGVzdENvbXBvbmVudDI+IHRlc3RDb21wb25lbnQyU2V0KSB7CisgICAgICAgIHRoaXMudGVzdENvbXBvbmVudDJTZXQgPSB0ZXN0Q29tcG9uZW50MlNldDsKKyAgICB9CisKKyAgICBAQXV0b3dpcmVkKHJlcXVpcmVkID0gZmFsc2UpCisgICAgcHVibGljIHZvaWQgc2V0Tm9Db21wb25lbnQoTm9Db21wb25lbnQgbm9Db21wb25lbnQpIHsKKyAgICAgICAgdGhpcy5ub0NvbXBvbmVudCA9IG5vQ29tcG9uZW50OworICAgIH0KKworICAgIEBQYXRoKCJ0ZXN0MSIpCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgdGVzdDEoKSB7CisgICAgICAgIHJldHVybiB0ZXN0Q29tcG9uZW50MS5yZXN1bHQoKTsKKyAgICB9CisKKyAgICBAUGF0aCgidGVzdDIiKQorICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIHRlc3QyKCkgeworICAgICAgICByZXR1cm4gKHRlc3RDb21wb25lbnQyTGlzdC5zaXplKCkgPT0gMiAmJiAidGVzdCBvayIuZXF1YWxzKHRlc3RDb21wb25lbnQyTGlzdC5nZXQoMCkucmVzdWx0KCkpCisgICAgICAgICAgICAgICAgJiYgInRlc3Qgb2siLmVxdWFscyh0ZXN0Q29tcG9uZW50Mkxpc3QuZ2V0KDEpLnJlc3VsdCgpKSkgPyAidGVzdCBvayIgOiAidGVzdCBmYWlsZWQiOworICAgIH0KKworICAgIEBQYXRoKCJ0ZXN0MyIpCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgdGVzdDMoKSB7CisgICAgICAgIGphdmEudXRpbC5JdGVyYXRvcjxvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLlRlc3RDb21wb25lbnQyPiBpdGVyYXRvciA9IHRlc3RDb21wb25lbnQyU2V0Lml0ZXJhdG9yKCk7CisgICAgICAgIHJldHVybiAodGVzdENvbXBvbmVudDJTZXQuc2l6ZSgpID09IDIgJiYgInRlc3Qgb2siLmVxdWFscyhpdGVyYXRvci5uZXh0KCkucmVzdWx0KCkpCisgICAgICAgICAgICAgICAgJiYgInRlc3Qgb2siLmVxdWFscyhpdGVyYXRvci5uZXh0KCkucmVzdWx0KCkpKSA/ICJ0ZXN0IG9rIiA6ICJ0ZXN0IGZhaWxlZCI7CisgICAgfQorCisgICAgQFBhdGgoIkpFUlNFWS0yNjQzIikKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBKRVJTRVlfMjY0MygpIHsKKyAgICAgICAgcmV0dXJuIG5vQ29tcG9uZW50ID09IG51bGwgPyAidGVzdCBvayIgOiAidGVzdCBmYWlsZWQiOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZXh0L3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3BhcmFtZXRlcmluamVjdGlvbi9TcHJpbmdQYXJhbWV0ZXJJbmplY3Rpb25KZXJzZXlUZXN0Q29uZmlnLmphdmEgYi9leHQvc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvcGFyYW1ldGVyaW5qZWN0aW9uL1NwcmluZ1BhcmFtZXRlckluamVjdGlvbkplcnNleVRlc3RDb25maWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjdlYmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3BhcmFtZXRlcmluamVjdGlvbi9TcHJpbmdQYXJhbWV0ZXJJbmplY3Rpb25KZXJzZXlUZXN0Q29uZmlnLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLnBhcmFtZXRlcmluamVjdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLnNjb3BlLlJlcXVlc3RDb250ZXh0RmlsdGVyOworCitwdWJsaWMgY2xhc3MgU3ByaW5nUGFyYW1ldGVySW5qZWN0aW9uSmVyc2V5VGVzdENvbmZpZyBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKyAgICBwdWJsaWMgU3ByaW5nUGFyYW1ldGVySW5qZWN0aW9uSmVyc2V5VGVzdENvbmZpZygpIHsKKyAgICAgICAgcmVnaXN0ZXIoUmVxdWVzdENvbnRleHRGaWx0ZXIuY2xhc3MpOworICAgICAgICByZWdpc3RlcihTcHJpbmdQYXJhbWV0ZXJJbmplY3Rpb25UZXN0UmVzb3VyY2UuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy9wYXJhbWV0ZXJpbmplY3Rpb24vU3ByaW5nUGFyYW1ldGVySW5qZWN0aW9uVGVzdC5qYXZhIGIvZXh0L3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3BhcmFtZXRlcmluamVjdGlvbi9TcHJpbmdQYXJhbWV0ZXJJbmplY3Rpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVjYWE5OAotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy9wYXJhbWV0ZXJpbmplY3Rpb24vU3ByaW5nUGFyYW1ldGVySW5qZWN0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy5wYXJhbWV0ZXJpbmplY3Rpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLlNwcmluZ1Rlc3RDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmcuZmllbGRpbmplY3Rpb24uU3ByaW5nRmllbGRJbmplY3Rpb25KZXJzZXlUZXN0Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuQXBwbGljYXRpb25Db250ZXh0OworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuY29udGV4dC5hbm5vdGF0aW9uLkFubm90YXRpb25Db25maWdBcHBsaWNhdGlvbkNvbnRleHQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitwdWJsaWMgY2xhc3MgU3ByaW5nUGFyYW1ldGVySW5qZWN0aW9uVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIEFwcGxpY2F0aW9uQ29udGV4dCBjb250ZXh0ID0gbmV3IEFubm90YXRpb25Db25maWdBcHBsaWNhdGlvbkNvbnRleHQoU3ByaW5nVGVzdENvbmZpZ3VyYXRpb24uY2xhc3MpOworICAgICAgICByZXR1cm4gbmV3IFNwcmluZ1BhcmFtZXRlckluamVjdGlvbkplcnNleVRlc3RDb25maWcoKQorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eSgiY29udGV4dENvbmZpZyIsIGNvbnRleHQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluamVjdGlvbk9mU2luZ2xlQmVhbigpIHsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHRhcmdldCgidGVzdDEiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdCBvayIsIHJlc3VsdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5qZWN0aW9uT2ZMaXN0T2ZCZWFucygpIHsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHRhcmdldCgidGVzdDIiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdCBvayIsIHJlc3VsdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5qZWN0aW9uT2ZTZXRPZkJlYW5zKCkgeworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gdGFyZ2V0KCJ0ZXN0MyIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0IG9rIiwgcmVzdWx0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvcGFyYW1ldGVyaW5qZWN0aW9uL1NwcmluZ1BhcmFtZXRlckluamVjdGlvblRlc3RSZXNvdXJjZS5qYXZhIGIvZXh0L3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3BhcmFtZXRlcmluamVjdGlvbi9TcHJpbmdQYXJhbWV0ZXJJbmplY3Rpb25UZXN0UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWZiMGQxCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3BhcmFtZXRlcmluamVjdGlvbi9TcHJpbmdQYXJhbWV0ZXJJbmplY3Rpb25UZXN0UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmcucGFyYW1ldGVyaW5qZWN0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy5UZXN0Q29tcG9uZW50MTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLlRlc3RDb21wb25lbnQyOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitAUGF0aCgiLyIpCitwdWJsaWMgY2xhc3MgU3ByaW5nUGFyYW1ldGVySW5qZWN0aW9uVGVzdFJlc291cmNlIHsKKworICAgIHByaXZhdGUgZmluYWwgVGVzdENvbXBvbmVudDEgdGVzdENvbXBvbmVudDE7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PFRlc3RDb21wb25lbnQyPiB0ZXN0Q29tcG9uZW50Mkxpc3Q7CisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8VGVzdENvbXBvbmVudDI+IHRlc3RDb21wb25lbnQyU2V0OworCisgICAgQEF1dG93aXJlZAorICAgIHB1YmxpYyBTcHJpbmdQYXJhbWV0ZXJJbmplY3Rpb25UZXN0UmVzb3VyY2UoZmluYWwgVGVzdENvbXBvbmVudDEgdGVzdENvbXBvbmVudDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PFRlc3RDb21wb25lbnQyPiB0ZXN0Q29tcG9uZW50Mkxpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZXQ8VGVzdENvbXBvbmVudDI+IHRlc3RDb21wb25lbnQyU2V0KSB7CisgICAgICAgIHRoaXMudGVzdENvbXBvbmVudDEgPSB0ZXN0Q29tcG9uZW50MTsKKyAgICAgICAgdGhpcy50ZXN0Q29tcG9uZW50Mkxpc3QgPSB0ZXN0Q29tcG9uZW50Mkxpc3Q7CisgICAgICAgIHRoaXMudGVzdENvbXBvbmVudDJTZXQgPSB0ZXN0Q29tcG9uZW50MlNldDsKKyAgICB9CisKKyAgICBAUGF0aCgidGVzdDEiKQorICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIHRlc3QxKCkgeworICAgICAgICByZXR1cm4gdGVzdENvbXBvbmVudDEucmVzdWx0KCk7CisgICAgfQorCisgICAgQFBhdGgoInRlc3QyIikKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyB0ZXN0MigpIHsKKyAgICAgICAgcmV0dXJuICh0ZXN0Q29tcG9uZW50Mkxpc3Quc2l6ZSgpID09IDIgJiYgInRlc3Qgb2siLmVxdWFscyh0ZXN0Q29tcG9uZW50Mkxpc3QuZ2V0KDApLnJlc3VsdCgpKQorICAgICAgICAgICAgICAgICYmICJ0ZXN0IG9rIi5lcXVhbHModGVzdENvbXBvbmVudDJMaXN0LmdldCgxKS5yZXN1bHQoKSkpID8gInRlc3Qgb2siIDogInRlc3QgZmFpbGVkIjsKKyAgICB9CisKKyAgICBAUGF0aCgidGVzdDMiKQorICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIHRlc3QzKCkgeworICAgICAgICBJdGVyYXRvcjxUZXN0Q29tcG9uZW50Mj4gaXRlcmF0b3IgPSB0ZXN0Q29tcG9uZW50MlNldC5pdGVyYXRvcigpOworICAgICAgICByZXR1cm4gKHRlc3RDb21wb25lbnQyU2V0LnNpemUoKSA9PSAyICYmICJ0ZXN0IG9rIi5lcXVhbHMoaXRlcmF0b3IubmV4dCgpLnJlc3VsdCgpKQorICAgICAgICAgICAgICAgICYmICJ0ZXN0IG9rIi5lcXVhbHMoaXRlcmF0b3IubmV4dCgpLnJlc3VsdCgpKSkgPyAidGVzdCBvayIgOiAidGVzdCBmYWlsZWQiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy9wcm9maWxlcy9EZWZhdWx0VGVzdFNlcnZpY2UuamF2YSBiL2V4dC9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy9wcm9maWxlcy9EZWZhdWx0VGVzdFNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDBkMDUzCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Byb2ZpbGVzL0RlZmF1bHRUZXN0U2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy5wcm9maWxlczsKKworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db21wb25lbnQ7CisKK0BDb21wb25lbnQKK3B1YmxpYyBjbGFzcyBEZWZhdWx0VGVzdFNlcnZpY2UgaW1wbGVtZW50cyBUZXN0U2VydmljZSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRlc3QoKSB7CisgICAgICAgIHJldHVybiAiZGVmYXVsdCI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvZXh0L3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Byb2ZpbGVzL0RldlRlc3RTZXJ2aWNlLmphdmEgYi9leHQvc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvcHJvZmlsZXMvRGV2VGVzdFNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzNjOTk1Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Byb2ZpbGVzL0RldlRlc3RTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLnByb2ZpbGVzOworCitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LmFubm90YXRpb24uUHJpbWFyeTsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuYW5ub3RhdGlvbi5Qcm9maWxlOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db21wb25lbnQ7CisKK0BDb21wb25lbnQKK0BQcmltYXJ5CitAUHJvZmlsZSgiZGV2IikKK3B1YmxpYyBjbGFzcyBEZXZUZXN0U2VydmljZSBpbXBsZW1lbnRzIFRlc3RTZXJ2aWNlIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdGVzdCgpIHsKKyAgICAgICAgcmV0dXJuICJkZXYiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy9wcm9maWxlcy9TcHJpbmdEZWZhdWx0UHJvZmlsZVJlc291cmNlVGVzdC5qYXZhIGIvZXh0L3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Byb2ZpbGVzL1NwcmluZ0RlZmF1bHRQcm9maWxlUmVzb3VyY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM5MGM1YwotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy9wcm9maWxlcy9TcHJpbmdEZWZhdWx0UHJvZmlsZVJlc291cmNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy5wcm9maWxlczsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLnNjb3BlLlJlcXVlc3RDb250ZXh0RmlsdGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LkFwcGxpY2F0aW9uQ29udGV4dDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uQ29uZmlnQXBwbGljYXRpb25Db250ZXh0OworCitwdWJsaWMgY2xhc3MgU3ByaW5nRGVmYXVsdFByb2ZpbGVSZXNvdXJjZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgic3ByaW5nLnByb2ZpbGVzLmFjdGl2ZSIsICIiKTsKKyAgICAgICAgQXBwbGljYXRpb25Db250ZXh0IGNvbnRleHQgPSBuZXcgQW5ub3RhdGlvbkNvbmZpZ0FwcGxpY2F0aW9uQ29udGV4dCgib3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy5wcm9maWxlcyIpOworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKCkKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoUmVxdWVzdENvbnRleHRGaWx0ZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKExvZ2dpbmdGZWF0dXJlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5wYWNrYWdlcygib3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy5wcm9maWxlcyIpCisgICAgICAgICAgICAgICAgLnByb3BlcnR5KCJjb250ZXh0Q29uZmlnIiwgY29udGV4dCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRVc2VEZWZhdWx0Q29tcG9uZW50KCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzdWx0ID0gdGFyZ2V0KCJzcHJpbmctcmVzb3VyY2UiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImRlZmF1bHQiLCByZXN1bHQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy9wcm9maWxlcy9TcHJpbmdEZXZQcm9maWxlUmVzb3VyY2VUZXN0LmphdmEgYi9leHQvc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvcHJvZmlsZXMvU3ByaW5nRGV2UHJvZmlsZVJlc291cmNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjODQ1MGMKLS0tIC9kZXYvbnVsbAorKysgYi9leHQvc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvcHJvZmlsZXMvU3ByaW5nRGV2UHJvZmlsZVJlc291cmNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy5wcm9maWxlczsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLnNjb3BlLlJlcXVlc3RDb250ZXh0RmlsdGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5jb250ZXh0LmFubm90YXRpb24uQW5ub3RhdGlvbkNvbmZpZ0FwcGxpY2F0aW9uQ29udGV4dDsKKworcHVibGljIGNsYXNzIFNwcmluZ0RldlByb2ZpbGVSZXNvdXJjZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgic3ByaW5nLnByb2ZpbGVzLmFjdGl2ZSIsICJkZXYiKTsKKyAgICAgICAgQW5ub3RhdGlvbkNvbmZpZ0FwcGxpY2F0aW9uQ29udGV4dCBjb250ZXh0ID0gbmV3IEFubm90YXRpb25Db25maWdBcHBsaWNhdGlvbkNvbnRleHQoCisgICAgICAgICAgICAgICAgIm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmcucHJvZmlsZXMiKTsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZygpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKFJlcXVlc3RDb250ZXh0RmlsdGVyLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcykKKyAgICAgICAgICAgICAgICAucGFja2FnZXMoIm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmcucHJvZmlsZXMiKQorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eSgiY29udGV4dENvbmZpZyIsIGNvbnRleHQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkVXNlRGV2UHJvZmlsZUJlYW4oKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQgPSB0YXJnZXQoInNwcmluZy1yZXNvdXJjZSIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiZGV2IiwgcmVzdWx0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9leHQvc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvcHJvZmlsZXMvU3ByaW5nUHJvZmlsZXNUZXN0LmphdmEgYi9leHQvc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvcHJvZmlsZXMvU3ByaW5nUHJvZmlsZXNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJjY2JlMwotLS0gL2Rldi9udWxsCisrKyBiL2V4dC9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy9wcm9maWxlcy9TcHJpbmdQcm9maWxlc1Rlc3QuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmcucHJvZmlsZXM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmNvbnRleHQuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uQ29uZmlnQXBwbGljYXRpb25Db250ZXh0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworcHVibGljIGNsYXNzIFNwcmluZ1Byb2ZpbGVzVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNob3VsZEdldERlZmF1bHRCZWFuKCkgeworICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoInNwcmluZy5wcm9maWxlcy5hY3RpdmUiLCAiIik7CisgICAgICAgIEFubm90YXRpb25Db25maWdBcHBsaWNhdGlvbkNvbnRleHQgY29udGV4dCA9IG5ldyBBbm5vdGF0aW9uQ29uZmlnQXBwbGljYXRpb25Db250ZXh0KAorICAgICAgICAgICAgICAgICJvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLnByb2ZpbGVzIik7CisgICAgICAgIGFzc2VydEVxdWFscygiZGVmYXVsdCIsIGNvbnRleHQuZ2V0QmVhbihUZXN0U2VydmljZS5jbGFzcykudGVzdCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNob3VsZEdldERldlByb2ZpbGVCZWFuKCkgeworICAgICAgICBTeXN0ZW0uc2V0UHJvcGVydHkoInNwcmluZy5wcm9maWxlcy5hY3RpdmUiLCAiZGV2Iik7CisgICAgICAgIEFubm90YXRpb25Db25maWdBcHBsaWNhdGlvbkNvbnRleHQgY29udGV4dCA9IG5ldyBBbm5vdGF0aW9uQ29uZmlnQXBwbGljYXRpb25Db250ZXh0KAorICAgICAgICAgICAgICAgICJvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLnByb2ZpbGVzIik7CisgICAgICAgIGFzc2VydEVxdWFscygiZGV2IiwgY29udGV4dC5nZXRCZWFuKFRlc3RTZXJ2aWNlLmNsYXNzKS50ZXN0KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2V4dC9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy9wcm9maWxlcy9TcHJpbmdSZXF1ZXN0UmVzb3VyY2UuamF2YSBiL2V4dC9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy9wcm9maWxlcy9TcHJpbmdSZXF1ZXN0UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWY4YmY3Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Byb2ZpbGVzL1NwcmluZ1JlcXVlc3RSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy5wcm9maWxlczsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWQ7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLlNlcnZpY2U7CisKKworQFNpbmdsZXRvbgorQFBhdGgoInNwcmluZy1yZXNvdXJjZSIpCitAU2VydmljZQorcHVibGljIGNsYXNzIFNwcmluZ1JlcXVlc3RSZXNvdXJjZSB7CisKKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBUZXN0U2VydmljZSB0ZXN0U2VydmljZTsKKworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgcHVibGljIFN0cmluZyBnZXRHb29kYnllKCkgeworICAgICAgICByZXR1cm4gdGVzdFNlcnZpY2UudGVzdCgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvZXh0L3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Byb2ZpbGVzL1Rlc3RTZXJ2aWNlLmphdmEgYi9leHQvc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvcHJvZmlsZXMvVGVzdFNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDVkM2UyCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Byb2ZpbGVzL1Rlc3RTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLnByb2ZpbGVzOworCitwdWJsaWMgaW50ZXJmYWNlIFRlc3RTZXJ2aWNlIHsKKworICAgIFN0cmluZyB0ZXN0KCk7Cit9CmRpZmYgLS1naXQgYS9leHQvc3ByaW5nNC9zcmMvdGVzdC9yZXNvdXJjZXMvamVyc2V5LXNwcmluZy1hc3BlY3Q0ai1hcHBsaWNhdGlvbkNvbnRleHQueG1sIGIvZXh0L3NwcmluZzQvc3JjL3Rlc3QvcmVzb3VyY2VzL2plcnNleS1zcHJpbmctYXNwZWN0NGotYXBwbGljYXRpb25Db250ZXh0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODBjMTU1Ci0tLSAvZGV2L251bGwKKysrIGIvZXh0L3NwcmluZzQvc3JjL3Rlc3QvcmVzb3VyY2VzL2plcnNleS1zcHJpbmctYXNwZWN0NGotYXBwbGljYXRpb25Db250ZXh0LnhtbApAQCAtMCwwICsxLDMzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxiZWFucyB4bWxucz0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyIKKyAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgIHhtbG5zOmFvcD0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9hb3AiIHhtbG5zOmNvbnRleHQ9Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvY29udGV4dCIKKyAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMKKyAgICBodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zL3NwcmluZy1iZWFucy0zLjAueHNkCisgICAgaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9hb3AKKyAgICBodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2FvcC9zcHJpbmctYW9wLTMuMC54c2QgaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9jb250ZXh0IGh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvY29udGV4dC9zcHJpbmctY29udGV4dC54c2QiPgorCisgICAgPGFvcDphc3BlY3RqLWF1dG9wcm94eS8+CisKKyAgICA8Y29udGV4dDpjb21wb25lbnQtc2NhbiBiYXNlLXBhY2thZ2U9Im9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmciLz4KKworICAgIDxiZWFuIGlkPSJzb21lQXNwZWN0IiBjbGFzcz0ib3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy5hc3BlY3Q0ai5UZXN0QXNwZWN0Ii8+Cis8L2JlYW5zPgpkaWZmIC0tZ2l0IGEvZXh0L3dhZGwtZG9jbGV0L3BvbS54bWwgYi9leHQvd2FkbC1kb2NsZXQvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTBkYTcxCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3dhZGwtZG9jbGV0L3BvbS54bWwKQEAgLTAsMCArMSwxMDEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPHBhcmVudD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktd2FkbC1kb2NsZXQ8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktd2FkbC1kb2NsZXQ8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+QSBkb2NsZXQgdGhhdCBnZW5lcmF0ZXMgYSByZXNvdXJjZWRvYyB4bWwgZmlsZTogdGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBqYXZhZG9jIGRvY3VtZW50YXRpb24KKyAgICAgICAgb2YgcmVzb3VyY2UgY2xhc3Nlcywgc28gdGhhdCB0aGlzIGNhbiBiZSB1c2VkIGZvciBleHRlbmRpbmcgZ2VuZXJhdGVkIHdhZGwgd2l0aCB1c2VmdWwKKyAgICAgICAgZG9jdW1lbnRhdGlvbi4KKyAgICA8L2Rlc2NyaXB0aW9uPgorCisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPmpkazEuNzwvaWQ+CisgICAgICAgICAgICA8YWN0aXZhdGlvbj4KKyAgICAgICAgICAgICAgICA8amRrPjEuNzwvamRrPgorICAgICAgICAgICAgPC9hY3RpdmF0aW9uPgorICAgICAgICAgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+dG9vbHM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuNy4wPC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICA8c2NvcGU+c3lzdGVtPC9zY29wZT4KKyAgICAgICAgICAgICAgICAgICAgPHN5c3RlbVBhdGg+JHtqYXZhLmhvbWV9Ly4uL2xpYi90b29scy5qYXI8L3N5c3RlbVBhdGg+CisgICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+amRrMS44PC9pZD4KKyAgICAgICAgICAgIDxhY3RpdmF0aW9uPgorICAgICAgICAgICAgICAgIDxqZGs+MS44PC9qZGs+CisgICAgICAgICAgICA8L2FjdGl2YXRpb24+CisgICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD50b29sczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+MS44LjA8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgIDxzY29wZT5zeXN0ZW08L3Njb3BlPgorICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUGF0aD4ke2phdmEuaG9tZX0vLi4vbGliL3Rvb2xzLmphcjwvc3lzdGVtUGF0aD4KKyAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8L2RlcGVuZGVuY2llcz4KKyAgICAgICAgPC9wcm9maWxlPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD50b29scy5qYXI8L2lkPgorICAgICAgICAgICAgPGFjdGl2YXRpb24+CisgICAgICAgICAgICAgICAgPCEtLSBBY3RpdmF0aW9uIHNob3VsZCBiZSBkb25lIHdpdGggPGZpbGU+JHtqYXZhLmhvbWV9Ly4uL2xpYi90b29scy5qYXI8L2ZpbGUgQnV0IHRoaXMgaXMgbm90IHdvcmtpbmcgd2l0aCBtYXZlbiBhcyB0aGUgcHJvcGVydHkgaXMgbm90IGV4cGFuc2VkLiAtLT4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgIDxuYW1lPmphdmEudmVuZG9yPC9uYW1lPgorICAgICAgICAgICAgICAgICAgICA8dmFsdWU+U3VuIE1pY3Jvc3lzdGVtcyBJbmMuPC92YWx1ZT4KKyAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgICAgPC9hY3RpdmF0aW9uPgorICAgICAgICAgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+dG9vbHM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuNjwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPHNjb3BlPnN5c3RlbTwvc2NvcGU+CisgICAgICAgICAgICAgICAgICAgIDxzeXN0ZW1QYXRoPiR7amF2YS5ob21lfS8uLi9saWIvdG9vbHMuamFyPC9zeXN0ZW1QYXRoPgorICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+eGVyY2VzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+eGVyY2VzSW1wbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktc2VydmVyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2V4dC93YWRsLWRvY2xldC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3dhZGwvZG9jbGV0L0RvY1Byb2Nlc3Nvci5qYXZhIGIvZXh0L3dhZGwtZG9jbGV0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvd2FkbC9kb2NsZXQvRG9jUHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFkODMyZQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC93YWRsLWRvY2xldC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3dhZGwvZG9jbGV0L0RvY1Byb2Nlc3Nvci5qYXZhCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkud2FkbC5kb2NsZXQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5pbnRlcm5hbC5nZW5lcmF0b3JzLnJlc291cmNlZG9jLm1vZGVsLkNsYXNzRG9jVHlwZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5pbnRlcm5hbC5nZW5lcmF0b3JzLnJlc291cmNlZG9jLm1vZGVsLk1ldGhvZERvY1R5cGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuaW50ZXJuYWwuZ2VuZXJhdG9ycy5yZXNvdXJjZWRvYy5tb2RlbC5QYXJhbURvY1R5cGU7CisKK2ltcG9ydCBjb20uc3VuLmphdmFkb2MuQ2xhc3NEb2M7CitpbXBvcnQgY29tLnN1bi5qYXZhZG9jLk1ldGhvZERvYzsKK2ltcG9ydCBjb20uc3VuLmphdmFkb2MuUGFyYW1UYWc7CitpbXBvcnQgY29tLnN1bi5qYXZhZG9jLlBhcmFtZXRlcjsKKworLyoqCisgKiBBIGRvYyBwcm9jZXNzb3IgaXMgaGFuZGVkIG92ZXIgamF2YWRvYyBlbGVtZW50cyBzbyB0aGF0IGl0IGNhbiB0dXJuIHRoaXMgaW50bworICogcmVzb3VyY2UgZG9jIGVsZW1lbnRzLCBldmVuIHNlbGYgZGVmaW5lZC4KKyAqCisgKiBAYXV0aG9yIE1hcnRpbiBHcm90emtlIChtYXJ0aW4uZ3JvdHprZSBhdCBmcmVpaGVpdC5jb20pCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRG9jUHJvY2Vzc29yIHsKKworICAgIC8qKgorICAgICAqIFNwZWNpZnkgamF4YiBjbGFzc2VzIG9mIGluc3RhbmNlcyB0aGF0IHlvdSBhZGQgdG8gdGhlIHtAY29kZSByZXNvdXJjZWRvY30gbW9kZWwuCisgICAgICogVGhlc2UgY2xhc3NlcyBhcmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgY2xhc3NlcyB3aGVuIGNyZWF0aW5nIHRoZSBqYXhiIGNvbnRleHQKKyAgICAgKiB3aXRoIHtAY29kZSBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZSggY2xhenplcyApO30uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgbGlzdCBvZiBjbGFzc2VzIG9yIHtAY29kZSBudWxsfQorICAgICAqLworICAgIENsYXNzPD8+W10gZ2V0UmVxdWlyZWRKYXhiQ29udGV4dENsYXNzZXMoKTsKKworICAgIC8qKgorICAgICAqIHNwZWNpZnkgd2hpY2ggb2YgeW91ciBlbGVtZW50cyB5b3Ugd2FudCB0byBiZSBoYW5kbGVkIGFzIENEQVRBLgorICAgICAqIFRoZSB1c2Ugb2YgdGhlICdeJyBiZXR3ZWVuIHRoZSB7QGNvZGUgbmFtZXNwYWNlVVJJfSBhbmQgdGhlIHtAY29kZSBsb2NhbG5hbWV9CisgICAgICogc2VlbXMgdG8gYmUgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsIG9mIHRoZSB4ZXJjZXMgY29kZS4KKyAgICAgKiBXaGVuIHByb2Nlc3NpbmcgeG1sIHRoYXQgZG9lc24ndCB1c2UgbmFtZXNwYWNlcywgc2ltcGx5IG9taXQgdGhlCisgICAgICogbmFtZXNwYWNlIHByZWZpeCBhcyBzaG93biBpbiB0aGUgdGhpcmQgQ0RhdGFFbGVtZW50IGJlbG93LgorICAgICAqCisgICAgICogQHJldHVybiBhbiBBcnJheSBvZiBlbGVtZW50IGRlc2NyaXB0b3JzIG9yIHtAY29kZSBudWxsfQorICAgICAqLworICAgIFN0cmluZ1tdIGdldENEYXRhRWxlbWVudHMoKTsKKworICAgIC8qKgorICAgICAqIFVzZSB0aGlzIG1ldGhvZCB0byBleHRlbmQgdGhlIHByb3ZpZGVkIHtAbGluayBDbGFzc0RvY1R5cGV9IHdpdGggdGhlIGluZm9ybWF0aW9uIGZyb20KKyAgICAgKiB0aGUgZ2l2ZW4ge0BsaW5rIENsYXNzRG9jfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGFzc0RvYyAgICAgdGhlIGNsYXNzIGphdmFkb2MKKyAgICAgKiBAcGFyYW0gY2xhc3NEb2NUeXBlIHRoZSB7QGxpbmsgQ2xhc3NEb2NUeXBlfSB0byBleHRlbmQuIFRoaXMgd2lsbCBsYXRlciBiZSBwcm9jZXNzZWQgYnkgdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgICB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuV2FkbEdlbmVyYXRvcn1zLgorICAgICAqLworICAgIHZvaWQgcHJvY2Vzc0NsYXNzRG9jKENsYXNzRG9jIGNsYXNzRG9jLCBDbGFzc0RvY1R5cGUgY2xhc3NEb2NUeXBlKTsKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIHByb3ZpZGVkIG1ldGhvZERvYyBhbmQgYWRkIHlvdXIgY3VzdG9tIGluZm9ybWF0aW9uIHRvIHRoZSBtZXRob2REb2NUeXBlLjxicj4KKyAgICAgKiBVc2UgZS5nLiB7QGxpbmsgTWV0aG9kRG9jVHlwZSNnZXRBbnkoKX0gdG8gc3RvcmUgY3VzdG9tIGVsZW1lbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIG1ldGhvZERvYyAgICAgdGhlIHtAbGluayBNZXRob2REb2N9IHJlcHJlc2VudGluZyB0aGUgZG9jcyBvZiB5b3VyIG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gbWV0aG9kRG9jVHlwZSB0aGUgcmVsYXRlZCB7QGxpbmsgTWV0aG9kRG9jVHlwZX0gdGhhdCB3aWxsIGxhdGVyIGJlIHByb2Nlc3NlZCBieSB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuV2FkbEdlbmVyYXRvcn1zLgorICAgICAqLworICAgIHZvaWQgcHJvY2Vzc01ldGhvZERvYyhNZXRob2REb2MgbWV0aG9kRG9jLCBNZXRob2REb2NUeXBlIG1ldGhvZERvY1R5cGUpOworCisgICAgLyoqCisgICAgICogVXNlIHRoaXMgbWV0aG9kIHRvIGV4dGVuZCB0aGUgcHJvdmlkZWQge0BsaW5rIFBhcmFtRG9jVHlwZX0gd2l0aCB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUKKyAgICAgKiBnaXZlbiB7QGxpbmsgUGFyYW1UYWd9IGFuZCB7QGxpbmsgUGFyYW1ldGVyfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJhbVRhZyAgICAgdGhlIHBhcmFtZXRlciBqYXZhZG9jCisgICAgICogQHBhcmFtIHBhcmFtZXRlciAgICB0aGUgcGFyYW1ldGVyICh0aGF0IGlzIGRvY3VtZW50ZWQgb3Igbm90KQorICAgICAqIEBwYXJhbSBwYXJhbURvY1R5cGUgdGhlIHtAbGluayBQYXJhbURvY1R5cGV9IHRvIGV4dGVuZC4gVGhpcyB3aWxsIGxhdGVyIGJlIHByb2Nlc3NlZCBieSB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5XYWRsR2VuZXJhdG9yfXMuCisgICAgICovCisgICAgdm9pZCBwcm9jZXNzUGFyYW1UYWcoUGFyYW1UYWcgcGFyYW1UYWcsIFBhcmFtZXRlciBwYXJhbWV0ZXIsIFBhcmFtRG9jVHlwZSBwYXJhbURvY1R5cGUpOworCit9CmRpZmYgLS1naXQgYS9leHQvd2FkbC1kb2NsZXQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS93YWRsL2RvY2xldC9Eb2NQcm9jZXNzb3JXcmFwcGVyLmphdmEgYi9leHQvd2FkbC1kb2NsZXQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS93YWRsL2RvY2xldC9Eb2NQcm9jZXNzb3JXcmFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRlYzNiNQotLS0gL2Rldi9udWxsCisrKyBiL2V4dC93YWRsLWRvY2xldC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3dhZGwvZG9jbGV0L0RvY1Byb2Nlc3NvcldyYXBwZXIuamF2YQpAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS53YWRsLmRvY2xldDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLmludGVybmFsLmdlbmVyYXRvcnMucmVzb3VyY2Vkb2MubW9kZWwuQ2xhc3NEb2NUeXBlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLmludGVybmFsLmdlbmVyYXRvcnMucmVzb3VyY2Vkb2MubW9kZWwuTWV0aG9kRG9jVHlwZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5pbnRlcm5hbC5nZW5lcmF0b3JzLnJlc291cmNlZG9jLm1vZGVsLlBhcmFtRG9jVHlwZTsKKworaW1wb3J0IGNvbS5zdW4uamF2YWRvYy5DbGFzc0RvYzsKK2ltcG9ydCBjb20uc3VuLmphdmFkb2MuTWV0aG9kRG9jOworaW1wb3J0IGNvbS5zdW4uamF2YWRvYy5QYXJhbVRhZzsKK2ltcG9ydCBjb20uc3VuLmphdmFkb2MuUGFyYW1ldGVyOworCisvKioKKyAqIFRoaXMge0BsaW5rIERvY1Byb2Nlc3Nvcn0gd3JhcHMgbXVsdGlwbGUge0Bjb2RlIERvY1Byb2Nlc3Nvcn1zLgorICoKKyAqIEBhdXRob3IgTWFydGluIEdyb3R6a2UgKG1hcnRpbi5ncm90emtlIGF0IGZyZWloZWl0LmNvbSkKKyAqLworcHVibGljIGNsYXNzIERvY1Byb2Nlc3NvcldyYXBwZXIgaW1wbGVtZW50cyBEb2NQcm9jZXNzb3IgeworCisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PERvY1Byb2Nlc3Nvcj4gX2RvY1Byb2Nlc3NvcnM7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IHtAY29kZSBEb2NQcm9jZXNzb3JXcmFwcGVyfSBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRG9jUHJvY2Vzc29yV3JhcHBlcigpIHsKKyAgICAgICAgX2RvY1Byb2Nlc3NvcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgYSBuZXcgIHtAY29kZSBEb2NQcm9jZXNzb3J9IGluc3RhbmNlIHRvIHRoZSBsaXN0IG9mIHdyYXBwZWQgaW5zdGFuY2VzLgorICAgICAqCisgICAgICogQHBhcmFtIGRvY1Byb2Nlc3NvciAge0Bjb2RlIERvY1Byb2Nlc3Nvcn0gaW5zdGFuY2UgdG8gd3JhcC4KKyAgICAgKi8KKyAgICB2b2lkIGFkZChEb2NQcm9jZXNzb3IgZG9jUHJvY2Vzc29yKSB7CisgICAgICAgIF9kb2NQcm9jZXNzb3JzLmFkZChkb2NQcm9jZXNzb3IpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDbGFzczw/PltdIGdldFJlcXVpcmVkSmF4YkNvbnRleHRDbGFzc2VzKCkgeworICAgICAgICBmaW5hbCBMaXN0PENsYXNzPD8+PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgZm9yIChEb2NQcm9jZXNzb3IgZG9jUHJvY2Vzc29yIDogX2RvY1Byb2Nlc3NvcnMpIHsKKyAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+W10gcmVxdWlyZWRKYXhiQ29udGV4dENsYXNzZXMgPSBkb2NQcm9jZXNzb3IuZ2V0UmVxdWlyZWRKYXhiQ29udGV4dENsYXNzZXMoKTsKKyAgICAgICAgICAgIGlmIChyZXF1aXJlZEpheGJDb250ZXh0Q2xhc3NlcyAhPSBudWxsICYmIHJlcXVpcmVkSmF4YkNvbnRleHRDbGFzc2VzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKEFycmF5cy5hc0xpc3QocmVxdWlyZWRKYXhiQ29udGV4dENsYXNzZXMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0LnRvQXJyYXkobmV3IENsYXNzPD8+W3Jlc3VsdC5zaXplKCldKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nW10gZ2V0Q0RhdGFFbGVtZW50cygpIHsKKyAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb3IgKERvY1Byb2Nlc3NvciBkb2NQcm9jZXNzb3IgOiBfZG9jUHJvY2Vzc29ycykgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gY2RhdGFFbGVtZW50cyA9IGRvY1Byb2Nlc3Nvci5nZXRDRGF0YUVsZW1lbnRzKCk7CisgICAgICAgICAgICBpZiAoY2RhdGFFbGVtZW50cyAhPSBudWxsICYmIGNkYXRhRWxlbWVudHMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgIHJlc3VsdC5hZGRBbGwoQXJyYXlzLmFzTGlzdChjZGF0YUVsZW1lbnRzKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC50b0FycmF5KG5ldyBTdHJpbmdbcmVzdWx0LnNpemUoKV0pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NDbGFzc0RvYyhDbGFzc0RvYyBjbGFzc0RvYywgQ2xhc3NEb2NUeXBlIGNsYXNzRG9jVHlwZSkgeworICAgICAgICBmb3IgKERvY1Byb2Nlc3NvciBkb2NQcm9jZXNzb3IgOiBfZG9jUHJvY2Vzc29ycykgeworICAgICAgICAgICAgZG9jUHJvY2Vzc29yLnByb2Nlc3NDbGFzc0RvYyhjbGFzc0RvYywgY2xhc3NEb2NUeXBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NNZXRob2REb2MoTWV0aG9kRG9jIG1ldGhvZERvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZERvY1R5cGUgbWV0aG9kRG9jVHlwZSkgeworICAgICAgICBmb3IgKERvY1Byb2Nlc3NvciBkb2NQcm9jZXNzb3IgOiBfZG9jUHJvY2Vzc29ycykgeworICAgICAgICAgICAgZG9jUHJvY2Vzc29yLnByb2Nlc3NNZXRob2REb2MobWV0aG9kRG9jLCBtZXRob2REb2NUeXBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NQYXJhbVRhZyhQYXJhbVRhZyBwYXJhbVRhZywgUGFyYW1ldGVyIHBhcmFtZXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1Eb2NUeXBlIHBhcmFtRG9jVHlwZSkgeworICAgICAgICBmb3IgKERvY1Byb2Nlc3NvciBkb2NQcm9jZXNzb3IgOiBfZG9jUHJvY2Vzc29ycykgeworICAgICAgICAgICAgZG9jUHJvY2Vzc29yLnByb2Nlc3NQYXJhbVRhZyhwYXJhbVRhZywgcGFyYW1ldGVyLCBwYXJhbURvY1R5cGUpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9leHQvd2FkbC1kb2NsZXQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS93YWRsL2RvY2xldC9SZXNvdXJjZURvY2xldC5qYXZhIGIvZXh0L3dhZGwtZG9jbGV0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvd2FkbC9kb2NsZXQvUmVzb3VyY2VEb2NsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmI0NzJkCi0tLSAvZGV2L251bGwKKysrIGIvZXh0L3dhZGwtZG9jbGV0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvd2FkbC9kb2NsZXQvUmVzb3VyY2VEb2NsZXQuamF2YQpAQCAtMCwwICsxLDY0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS53YWRsLmRvY2xldDsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEubmV0LlVSTENsYXNzTG9hZGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLk1hcnNoYWxsZXI7CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLmludGVybmFsLmdlbmVyYXRvcnMucmVzb3VyY2Vkb2MubW9kZWwuQW5ub3RhdGlvbkRvY1R5cGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuaW50ZXJuYWwuZ2VuZXJhdG9ycy5yZXNvdXJjZWRvYy5tb2RlbC5DbGFzc0RvY1R5cGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuaW50ZXJuYWwuZ2VuZXJhdG9ycy5yZXNvdXJjZWRvYy5tb2RlbC5NZXRob2REb2NUeXBlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLmludGVybmFsLmdlbmVyYXRvcnMucmVzb3VyY2Vkb2MubW9kZWwuTmFtZWRWYWx1ZVR5cGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuaW50ZXJuYWwuZ2VuZXJhdG9ycy5yZXNvdXJjZWRvYy5tb2RlbC5QYXJhbURvY1R5cGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuaW50ZXJuYWwuZ2VuZXJhdG9ycy5yZXNvdXJjZWRvYy5tb2RlbC5SZXByZXNlbnRhdGlvbkRvY1R5cGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuaW50ZXJuYWwuZ2VuZXJhdG9ycy5yZXNvdXJjZWRvYy5tb2RlbC5SZXF1ZXN0RG9jVHlwZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5pbnRlcm5hbC5nZW5lcmF0b3JzLnJlc291cmNlZG9jLm1vZGVsLlJlc291cmNlRG9jVHlwZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5pbnRlcm5hbC5nZW5lcmF0b3JzLnJlc291cmNlZG9jLm1vZGVsLlJlc3BvbnNlRG9jVHlwZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5pbnRlcm5hbC5nZW5lcmF0b3JzLnJlc291cmNlZG9jLm1vZGVsLldhZGxQYXJhbVR5cGU7CisKK2ltcG9ydCBvcmcuYXBhY2hlLnhtbC5zZXJpYWxpemUuT3V0cHV0Rm9ybWF0OworaW1wb3J0IG9yZy5hcGFjaGUueG1sLnNlcmlhbGl6ZS5YTUxTZXJpYWxpemVyOworCitpbXBvcnQgY29tLnN1bi5qYXZhZG9jLkFubm90YXRpb25EZXNjOworaW1wb3J0IGNvbS5zdW4uamF2YWRvYy5Bbm5vdGF0aW9uRGVzYy5FbGVtZW50VmFsdWVQYWlyOworaW1wb3J0IGNvbS5zdW4uamF2YWRvYy5DbGFzc0RvYzsKK2ltcG9ydCBjb20uc3VuLmphdmFkb2MuRG9jRXJyb3JSZXBvcnRlcjsKK2ltcG9ydCBjb20uc3VuLmphdmFkb2MuTWVtYmVyRG9jOworaW1wb3J0IGNvbS5zdW4uamF2YWRvYy5NZXRob2REb2M7CitpbXBvcnQgY29tLnN1bi5qYXZhZG9jLlBhcmFtVGFnOworaW1wb3J0IGNvbS5zdW4uamF2YWRvYy5QYXJhbWV0ZXI7CitpbXBvcnQgY29tLnN1bi5qYXZhZG9jLlJvb3REb2M7CitpbXBvcnQgY29tLnN1bi5qYXZhZG9jLlNlZVRhZzsKK2ltcG9ydCBjb20uc3VuLmphdmFkb2MuVGFnOworCisvKioKKyAqIENyZWF0ZXMgYSByZXNvdXJjZWRvYyBYTUwgZmlsZS4KKyAqIDxwLz4KKyAqIDxwPgorICogVGhlIFJlc291cmNlRG9jIGZpbGUgY29udGFpbnMgdGhlIGphdmFkb2MgZG9jdW1lbnRhdGlvbgorICogb2YgcmVzb3VyY2UgY2xhc3Nlcywgc28gdGhhdCB0aGlzIGNhbiBiZSB1c2VkIGZvciBleHRlbmRpbmcgZ2VuZXJhdGVkIHdhZGwgd2l0aCB1c2VmdWwKKyAqIGRvY3VtZW50YXRpb24uCisgKiA8L3A+CisgKgorICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86bWFydGluLmdyb3R6a2VAZnJlaWhlaXQuY29tIj5NYXJ0aW4gR3JvdHprZTwvYT4KKyAqLworcHVibGljIGNsYXNzIFJlc291cmNlRG9jbGV0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gUEFUVEVSTl9SRVNQT05TRV9SRVBSRVNFTlRBVElPTiA9IFBhdHRlcm4uY29tcGlsZSgiQHJlc3BvbnNlXFwucmVwcmVzZW50YXRpb25cXC4oW1xcZF0rKVxcLi4qIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9PVVRQVVQgPSAiLW91dHB1dCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9DTEFTU1BBVEggPSAiLWNsYXNzcGF0aCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE9QVElPTl9ET0NfUFJPQ0VTU09SUyA9ICItcHJvY2Vzc29ycyI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HID0gTG9nZ2VyLmdldExvZ2dlcihSZXNvdXJjZURvY2xldC5jbGFzcy5nZXROYW1lKCkpOworCisgICAgLyoqCisgICAgICogU3RhcnQgdGhlIGRvY2xldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb290IHRoZSByb290IEphdmFEb2MgZG9jdW1lbnQuCisgICAgICogQHJldHVybiB0cnVlIGlmIG5vIGV4Y2VwdGlvbiBpcyB0aHJvd24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHN0YXJ0KGZpbmFsIFJvb3REb2Mgcm9vdCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgb3V0cHV0ID0gZ2V0T3B0aW9uQXJnKHJvb3Qub3B0aW9ucygpLCBPUFRJT05fT1VUUFVUKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgY2xhc3NwYXRoID0gZ2V0T3B0aW9uQXJnKHJvb3Qub3B0aW9ucygpLCBPUFRJT05fQ0xBU1NQQVRIKTsKKyAgICAgICAgLy8gTE9HLmluZm8oICJIYXZlIGNsYXNzcGF0aDogIiArIGNsYXNzcGF0aCApOworICAgICAgICBmaW5hbCBTdHJpbmdbXSBjbGFzc3BhdGhFbGVtZW50cyA9IGNsYXNzcGF0aC5zcGxpdChGaWxlLnBhdGhTZXBhcmF0b3IpOworCisgICAgICAgIGZpbmFsIENsYXNzTG9hZGVyIGNsID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgZmluYWwgQ2xhc3NMb2FkZXIgbmNsID0gbmV3IExvYWRlcihjbGFzc3BhdGhFbGVtZW50cywKKyAgICAgICAgICAgICAgICBSZXNvdXJjZURvY2xldC5jbGFzcy5nZXRDbGFzc0xvYWRlcigpKTsKKyAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIobmNsKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgZG9jUHJvY2Vzc29yT3B0aW9uID0gZ2V0T3B0aW9uQXJnKHJvb3Qub3B0aW9ucygpLCBPUFRJT05fRE9DX1BST0NFU1NPUlMpOworICAgICAgICBmaW5hbCBTdHJpbmdbXSBkb2NQcm9jZXNzb3JzID0gZG9jUHJvY2Vzc29yT3B0aW9uICE9IG51bGwgPyBkb2NQcm9jZXNzb3JPcHRpb24uc3BsaXQoIjoiKSA6IG51bGw7CisgICAgICAgIGZpbmFsIERvY1Byb2Nlc3NvcldyYXBwZXIgZG9jUHJvY2Vzc29yID0gbmV3IERvY1Byb2Nlc3NvcldyYXBwZXIoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChkb2NQcm9jZXNzb3JzICE9IG51bGwgJiYgZG9jUHJvY2Vzc29ycy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gY2xhenogPSBDbGFzcy5mb3JOYW1lKGRvY1Byb2Nlc3NvcnNbMF0sIHRydWUsIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkpOworICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBEb2NQcm9jZXNzb3I+IGRwQ2xhenogPSBjbGF6ei5hc1N1YmNsYXNzKERvY1Byb2Nlc3Nvci5jbGFzcyk7CisgICAgICAgICAgICAgICAgZG9jUHJvY2Vzc29yLmFkZChkcENsYXp6Lm5ld0luc3RhbmNlKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsICJDb3VsZCBub3QgbG9hZCBkb2NQcm9jZXNzb3JzICIgKyBkb2NQcm9jZXNzb3JPcHRpb24sIGUpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIFJlc291cmNlRG9jVHlwZSByZXN1bHQgPSBuZXcgUmVzb3VyY2VEb2NUeXBlKCk7CisKKyAgICAgICAgICAgIGZpbmFsIENsYXNzRG9jW10gY2xhc3NlcyA9IHJvb3QuY2xhc3NlcygpOworICAgICAgICAgICAgZm9yIChmaW5hbCBDbGFzc0RvYyBjbGFzc0RvYyA6IGNsYXNzZXMpIHsKKyAgICAgICAgICAgICAgICBMT0cuZmluZSgiV3JpdGluZyBjbGFzcyAiICsgY2xhc3NEb2MucXVhbGlmaWVkVHlwZU5hbWUoKSk7CisgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3NEb2NUeXBlIGNsYXNzRG9jVHlwZSA9IG5ldyBDbGFzc0RvY1R5cGUoKTsKKyAgICAgICAgICAgICAgICBjbGFzc0RvY1R5cGUuc2V0Q2xhc3NOYW1lKGNsYXNzRG9jLnF1YWxpZmllZFR5cGVOYW1lKCkpOworICAgICAgICAgICAgICAgIGNsYXNzRG9jVHlwZS5zZXRDb21tZW50VGV4dChjbGFzc0RvYy5jb21tZW50VGV4dCgpKTsKKyAgICAgICAgICAgICAgICBkb2NQcm9jZXNzb3IucHJvY2Vzc0NsYXNzRG9jKGNsYXNzRG9jLCBjbGFzc0RvY1R5cGUpOworCisgICAgICAgICAgICAgICAgZm9yIChmaW5hbCBNZXRob2REb2MgbWV0aG9kRG9jIDogY2xhc3NEb2MubWV0aG9kcygpKSB7CisKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgTWV0aG9kRG9jVHlwZSBtZXRob2REb2NUeXBlID0gbmV3IE1ldGhvZERvY1R5cGUoKTsKKyAgICAgICAgICAgICAgICAgICAgbWV0aG9kRG9jVHlwZS5zZXRNZXRob2ROYW1lKG1ldGhvZERvYy5uYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBtZXRob2REb2NUeXBlLnNldE1ldGhvZFNpZ25hdHVyZShtZXRob2REb2Muc2lnbmF0dXJlKCkpOworICAgICAgICAgICAgICAgICAgICBtZXRob2REb2NUeXBlLnNldENvbW1lbnRUZXh0KG1ldGhvZERvYy5jb21tZW50VGV4dCgpKTsKKyAgICAgICAgICAgICAgICAgICAgZG9jUHJvY2Vzc29yLnByb2Nlc3NNZXRob2REb2MobWV0aG9kRG9jLCBtZXRob2REb2NUeXBlKTsKKworICAgICAgICAgICAgICAgICAgICBhZGRQYXJhbURvY3MobWV0aG9kRG9jLCBtZXRob2REb2NUeXBlLCBkb2NQcm9jZXNzb3IpOworCisgICAgICAgICAgICAgICAgICAgIGFkZFJlcXVlc3RSZXByZXNlbnRhdGlvbkRvYyhtZXRob2REb2MsIG1ldGhvZERvY1R5cGUpOworCisgICAgICAgICAgICAgICAgICAgIGFkZFJlc3BvbnNlRG9jKG1ldGhvZERvYywgbWV0aG9kRG9jVHlwZSk7CisKKyAgICAgICAgICAgICAgICAgICAgY2xhc3NEb2NUeXBlLmdldE1ldGhvZERvY3MoKS5hZGQobWV0aG9kRG9jVHlwZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmVzdWx0LmdldERvY3MoKS5hZGQoY2xhc3NEb2NUeXBlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/PltdIGNsYXp6ZXMgPSBnZXRKQVhCQ29udGV4dENsYXNzZXMocmVzdWx0LCBkb2NQcm9jZXNzb3IpOworICAgICAgICAgICAgICAgIGZpbmFsIEpBWEJDb250ZXh0IGMgPSBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZShjbGF6emVzKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBNYXJzaGFsbGVyIG0gPSBjLmNyZWF0ZU1hcnNoYWxsZXIoKTsKKyAgICAgICAgICAgICAgICBtLnNldFByb3BlcnR5KE1hcnNoYWxsZXIuSkFYQl9GT1JNQVRURURfT1VUUFVULCB0cnVlKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dHB1dCkpOworCisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gY2RhdGFFbGVtZW50cyA9IGdldENEYXRhRWxlbWVudHMoZG9jUHJvY2Vzc29yKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBYTUxTZXJpYWxpemVyIHNlcmlhbGl6ZXIgPSBnZXRYTUxTZXJpYWxpemVyKG91dCwgY2RhdGFFbGVtZW50cyk7CisKKyAgICAgICAgICAgICAgICBtLm1hcnNoYWwocmVzdWx0LCBzZXJpYWxpemVyKTsKKyAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKKworICAgICAgICAgICAgICAgIExPRy5pbmZvKCJXcm90ZSAiICsgb3V0cHV0KTsKKworICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwgIkNvdWxkIG5vdCBzZXJpYWxpemUgUmVzb3VyY2VEb2MuIiwgZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIoY2wpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gZ2V0Q0RhdGFFbGVtZW50cyhmaW5hbCBEb2NQcm9jZXNzb3IgZG9jUHJvY2Vzc29yKSB7CisgICAgICAgIGZpbmFsIFN0cmluZ1tdIG9yaWdpbmFsID0gbmV3IFN0cmluZ1tdIHsibnMxXmNvbW1lbnRUZXh0IiwgIm5zMl5jb21tZW50VGV4dCIsICJeY29tbWVudFRleHQifTsKKyAgICAgICAgaWYgKGRvY1Byb2Nlc3NvciA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBjZGF0YUVsZW1lbnRzID0gZG9jUHJvY2Vzc29yLmdldENEYXRhRWxlbWVudHMoKTsKKyAgICAgICAgICAgIGlmIChjZGF0YUVsZW1lbnRzID09IG51bGwgfHwgY2RhdGFFbGVtZW50cy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSByZXN1bHQgPSBjb3B5T2Yob3JpZ2luYWwsIG9yaWdpbmFsLmxlbmd0aCArIGNkYXRhRWxlbWVudHMubGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNkYXRhRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0W29yaWdpbmFsLmxlbmd0aCArIGldID0gY2RhdGFFbGVtZW50c1tpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHByaXZhdGUgc3RhdGljIDxULCBVPiBUW10gY29weU9mKGZpbmFsIFVbXSBvcmlnaW5hbCwgZmluYWwgaW50IG5ld0xlbmd0aCkgeworICAgICAgICBmaW5hbCBUW10gY29weSA9IChvcmlnaW5hbC5nZXRDbGFzcygpID09IE9iamVjdFtdLmNsYXNzKQorICAgICAgICAgICAgICAgID8gKFRbXSkgbmV3IE9iamVjdFtuZXdMZW5ndGhdCisgICAgICAgICAgICAgICAgOiAoVFtdKSBBcnJheS5uZXdJbnN0YW5jZShvcmlnaW5hbC5nZXRDbGFzcygpLmdldENvbXBvbmVudFR5cGUoKSwgbmV3TGVuZ3RoKTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShvcmlnaW5hbCwgMCwgY29weSwgMCwKKyAgICAgICAgICAgICAgICBNYXRoLm1pbihvcmlnaW5hbC5sZW5ndGgsIG5ld0xlbmd0aCkpOworICAgICAgICByZXR1cm4gY29weTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBDbGFzczw/PltdIGdldEpBWEJDb250ZXh0Q2xhc3NlcygKKyAgICAgICAgICAgIGZpbmFsIFJlc291cmNlRG9jVHlwZSByZXN1bHQsIGZpbmFsIERvY1Byb2Nlc3NvciBkb2NQcm9jZXNzb3IpIHsKKyAgICAgICAgZmluYWwgQ2xhc3M8Pz5bXSBjbGF6emVzOworICAgICAgICBpZiAoZG9jUHJvY2Vzc29yID09IG51bGwpIHsKKyAgICAgICAgICAgIGNsYXp6ZXMgPSBuZXcgQ2xhc3M8Pz5bMV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaW5hbCBDbGFzczw/PltdIHJlcXVpcmVkSmF4YkNvbnRleHRDbGFzc2VzID0gZG9jUHJvY2Vzc29yLmdldFJlcXVpcmVkSmF4YkNvbnRleHRDbGFzc2VzKCk7CisgICAgICAgICAgICBpZiAocmVxdWlyZWRKYXhiQ29udGV4dENsYXNzZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNsYXp6ZXMgPSBuZXcgQ2xhc3M8Pz5bMSArIHJlcXVpcmVkSmF4YkNvbnRleHRDbGFzc2VzLmxlbmd0aF07CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXF1aXJlZEpheGJDb250ZXh0Q2xhc3Nlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBjbGF6emVzW2kgKyAxXSA9IHJlcXVpcmVkSmF4YkNvbnRleHRDbGFzc2VzW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY2xhenplcyA9IG5ldyBDbGFzczw/PlsxXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjbGF6emVzWzBdID0gcmVzdWx0LmdldENsYXNzKCk7CisgICAgICAgIHJldHVybiBjbGF6emVzOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFhNTFNlcmlhbGl6ZXIgZ2V0WE1MU2VyaWFsaXplcihmaW5hbCBPdXRwdXRTdHJlYW0gb3MsIGZpbmFsIFN0cmluZ1tdIGNkYXRhRWxlbWVudHMpCisgICAgICAgICAgICB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwKKyAgICAgICAgICAgIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24geworICAgICAgICAvLyBjb25maWd1cmUgYW4gT3V0cHV0Rm9ybWF0IHRvIGhhbmRsZSBDREFUQQorICAgICAgICBmaW5hbCBPdXRwdXRGb3JtYXQgb2YgPSBuZXcgT3V0cHV0Rm9ybWF0KCk7CisKKyAgICAgICAgLy8gc3BlY2lmeSB3aGljaCBvZiB5b3VyIGVsZW1lbnRzIHlvdSB3YW50IHRvIGJlIGhhbmRsZWQgYXMgQ0RBVEEuCisgICAgICAgIC8vIFRoZSB1c2Ugb2YgdGhlICdeJyBiZXR3ZWVuIHRoZSBuYW1lc3BhY2VVUkkgYW5kIHRoZSBsb2NhbG5hbWUKKyAgICAgICAgLy8gc2VlbXMgdG8gYmUgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsIG9mIHRoZSB4ZXJjZXMgY29kZS4KKyAgICAgICAgLy8gV2hlbiBwcm9jZXNzaW5nIHhtbCB0aGF0IGRvZXNuJ3QgdXNlIG5hbWVzcGFjZXMsIHNpbXBseSBvbWl0IHRoZQorICAgICAgICAvLyBuYW1lc3BhY2UgcHJlZml4IGFzIHNob3duIGluIHRoZSB0aGlyZCBDRGF0YUVsZW1lbnQgYmVsb3cuCisgICAgICAgIG9mLnNldENEYXRhRWxlbWVudHMoY2RhdGFFbGVtZW50cyk7CisKKyAgICAgICAgLy8gc2V0IGFueSBvdGhlciBvcHRpb25zIHlvdSdkIGxpa2UKKyAgICAgICAgb2Yuc2V0UHJlc2VydmVTcGFjZSh0cnVlKTsKKyAgICAgICAgb2Yuc2V0SW5kZW50aW5nKHRydWUpOworCisgICAgICAgIC8vIGNyZWF0ZSB0aGUgc2VyaWFsaXplcgorICAgICAgICBmaW5hbCBYTUxTZXJpYWxpemVyIHNlcmlhbGl6ZXIgPSBuZXcgWE1MU2VyaWFsaXplcihvZik7CisKKyAgICAgICAgc2VyaWFsaXplci5zZXRPdXRwdXRCeXRlU3RyZWFtKG9zKTsKKworICAgICAgICByZXR1cm4gc2VyaWFsaXplcjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFkZFJlc3BvbnNlRG9jKGZpbmFsIE1ldGhvZERvYyBtZXRob2REb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZXRob2REb2NUeXBlIG1ldGhvZERvY1R5cGUpIHsKKworICAgICAgICBmaW5hbCBSZXNwb25zZURvY1R5cGUgcmVzcG9uc2VEb2MgPSBuZXcgUmVzcG9uc2VEb2NUeXBlKCk7CisKKyAgICAgICAgZmluYWwgVGFnIHJldHVyblRhZyA9IGdldFNpbmdsZVRhZ09yTnVsbChtZXRob2REb2MsICJyZXR1cm4iKTsKKyAgICAgICAgaWYgKHJldHVyblRhZyAhPSBudWxsKSB7CisgICAgICAgICAgICByZXNwb25zZURvYy5zZXRSZXR1cm5Eb2MocmV0dXJuVGFnLnRleHQoKSk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBUYWdbXSByZXNwb25zZVBhcmFtVGFncyA9IG1ldGhvZERvYy50YWdzKCJyZXNwb25zZS5wYXJhbSIpOworICAgICAgICBmb3IgKGZpbmFsIFRhZyByZXNwb25zZVBhcmFtVGFnIDogcmVzcG9uc2VQYXJhbVRhZ3MpIHsKKyAgICAgICAgICAgIC8vIExPRy5pbmZvKCAiSGF2ZSByZXNwb25zZXBhcmFtIHRhZzogIiArIHByaW50KCByZXNwb25zZVBhcmFtVGFnICkgKTsKKyAgICAgICAgICAgIGZpbmFsIFdhZGxQYXJhbVR5cGUgd2FkbFBhcmFtID0gbmV3IFdhZGxQYXJhbVR5cGUoKTsKKyAgICAgICAgICAgIGZvciAoZmluYWwgVGFnIGlubGluZVRhZyA6IHJlc3BvbnNlUGFyYW1UYWcuaW5saW5lVGFncygpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHRhZ05hbWUgPSBpbmxpbmVUYWcubmFtZSgpOworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0YWdUZXh0ID0gaW5saW5lVGFnLnRleHQoKTsKKyAgICAgICAgICAgICAgICAvKiBza2lwIGVtcHR5IHRhZ3MKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAoaXNFbXB0eSh0YWdUZXh0KSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoTE9HLmlzTG9nZ2FibGUoTGV2ZWwuRklORSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRy5maW5lKCJTa2lwcGluZyBlbXB0eSBpbmxpbmUgdGFnIG9mIEByZXNwb25zZS5wYXJhbSBpbiBtZXRob2QgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1ldGhvZERvYy5xdWFsaWZpZWROYW1lKCkgKyAiOiAiICsgdGFnTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN3aXRjaCAodGFnTmFtZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlICJAbmFtZSI6CisgICAgICAgICAgICAgICAgICAgICAgICB3YWRsUGFyYW0uc2V0TmFtZSh0YWdUZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICJAc3R5bGUiOgorICAgICAgICAgICAgICAgICAgICAgICAgd2FkbFBhcmFtLnNldFN0eWxlKHRhZ1RleHQpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgIkB0eXBlIjoKKyAgICAgICAgICAgICAgICAgICAgICAgIHdhZGxQYXJhbS5zZXRUeXBlKFFOYW1lLnZhbHVlT2YodGFnVGV4dCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgIkBkb2MiOgorICAgICAgICAgICAgICAgICAgICAgICAgd2FkbFBhcmFtLnNldERvYyh0YWdUZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgTE9HLndhcm5pbmcoIlVua25vd24gaW5saW5lIHRhZyBvZiBAcmVzcG9uc2UucGFyYW0gaW4gbWV0aG9kICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtZXRob2REb2MucXVhbGlmaWVkTmFtZSgpICsgIjogIiArIHRhZ05hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiICh2YWx1ZTogIiArIHRhZ1RleHQgKyAiKSIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzcG9uc2VEb2MuZ2V0V2FkbFBhcmFtcygpLmFkZCh3YWRsUGFyYW0pOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgTGlzdDxUYWc+PiB0YWdzQnlTdGF0dXMgPSBnZXRSZXNwb25zZVJlcHJlc2VudGF0aW9uVGFncyhtZXRob2REb2MpOworICAgICAgICBmb3IgKGZpbmFsIEVudHJ5PFN0cmluZywgTGlzdDxUYWc+PiBlbnRyeSA6IHRhZ3NCeVN0YXR1cy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBmaW5hbCBSZXByZXNlbnRhdGlvbkRvY1R5cGUgcmVwcmVzZW50YXRpb25Eb2MgPSBuZXcgUmVwcmVzZW50YXRpb25Eb2NUeXBlKCk7CisgICAgICAgICAgICByZXByZXNlbnRhdGlvbkRvYy5zZXRTdGF0dXMoTG9uZy52YWx1ZU9mKGVudHJ5LmdldEtleSgpKSk7CisgICAgICAgICAgICBmb3IgKGZpbmFsIFRhZyB0YWcgOiBlbnRyeS5nZXRWYWx1ZSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKHRhZy5uYW1lKCkuZW5kc1dpdGgoIi5xbmFtZSIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcHJlc2VudGF0aW9uRG9jLnNldEVsZW1lbnQoUU5hbWUudmFsdWVPZih0YWcudGV4dCgpKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0YWcubmFtZSgpLmVuZHNXaXRoKCIubWVkaWFUeXBlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVwcmVzZW50YXRpb25Eb2Muc2V0TWVkaWFUeXBlKHRhZy50ZXh0KCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGFnLm5hbWUoKS5lbmRzV2l0aCgiLmV4YW1wbGUiKSkgeworICAgICAgICAgICAgICAgICAgICByZXByZXNlbnRhdGlvbkRvYy5zZXRFeGFtcGxlKGdldFNlcmlhbGl6ZWRFeGFtcGxlKHRhZykpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGFnLm5hbWUoKS5lbmRzV2l0aCgiLmRvYyIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcHJlc2VudGF0aW9uRG9jLnNldERvYyh0YWcudGV4dCgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBMT0cud2FybmluZygiVW5rbm93biByZXNwb25zZSByZXByZXNlbnRhdGlvbiB0YWcgIiArIHRhZy5uYW1lKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3BvbnNlRG9jLmdldFJlcHJlc2VudGF0aW9ucygpLmFkZChyZXByZXNlbnRhdGlvbkRvYyk7CisgICAgICAgIH0KKworICAgICAgICBtZXRob2REb2NUeXBlLnNldFJlc3BvbnNlRG9jKHJlc3BvbnNlRG9jKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRW1wdHkoZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHJldHVybiB2YWx1ZSA9PSBudWxsIHx8IHZhbHVlLmlzRW1wdHkoKSB8fCB2YWx1ZS50cmltKCkuaXNFbXB0eSgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkUmVxdWVzdFJlcHJlc2VudGF0aW9uRG9jKGZpbmFsIE1ldGhvZERvYyBtZXRob2REb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWV0aG9kRG9jVHlwZSBtZXRob2REb2NUeXBlKSB7CisgICAgICAgIGZpbmFsIFRhZyByZXF1ZXN0RWxlbWVudCA9IGdldFNpbmdsZVRhZ09yTnVsbChtZXRob2REb2MsICJyZXF1ZXN0LnJlcHJlc2VudGF0aW9uLnFuYW1lIik7CisgICAgICAgIGZpbmFsIFRhZyByZXF1ZXN0RXhhbXBsZSA9IGdldFNpbmdsZVRhZ09yTnVsbChtZXRob2REb2MsICJyZXF1ZXN0LnJlcHJlc2VudGF0aW9uLmV4YW1wbGUiKTsKKyAgICAgICAgaWYgKHJlcXVlc3RFbGVtZW50ICE9IG51bGwgfHwgcmVxdWVzdEV4YW1wbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgUmVxdWVzdERvY1R5cGUgcmVxdWVzdERvYyA9IG5ldyBSZXF1ZXN0RG9jVHlwZSgpOworICAgICAgICAgICAgZmluYWwgUmVwcmVzZW50YXRpb25Eb2NUeXBlIHJlcHJlc2VudGF0aW9uRG9jID0gbmV3IFJlcHJlc2VudGF0aW9uRG9jVHlwZSgpOworCisgICAgICAgICAgICAvKiByZXF1ZXN0RWxlbWVudCBleGlzdHMKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHJlcXVlc3RFbGVtZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXByZXNlbnRhdGlvbkRvYy5zZXRFbGVtZW50KFFOYW1lLnZhbHVlT2YocmVxdWVzdEVsZW1lbnQudGV4dCgpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIHJlcXVlc3RFeGFtcGxlIGV4aXN0cworICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAocmVxdWVzdEV4YW1wbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBleGFtcGxlID0gZ2V0U2VyaWFsaXplZEV4YW1wbGUocmVxdWVzdEV4YW1wbGUpOworICAgICAgICAgICAgICAgIGlmICghaXNFbXB0eShleGFtcGxlKSkgeworICAgICAgICAgICAgICAgICAgICByZXByZXNlbnRhdGlvbkRvYy5zZXRFeGFtcGxlKGV4YW1wbGUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIExPRy53YXJuaW5nKCJDb3VsZCBub3QgZ2V0IHNlcmlhbGl6ZWQgZXhhbXBsZSBmb3IgbWV0aG9kICIgKyBtZXRob2REb2MucXVhbGlmaWVkTmFtZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlcXVlc3REb2Muc2V0UmVwcmVzZW50YXRpb25Eb2MocmVwcmVzZW50YXRpb25Eb2MpOworICAgICAgICAgICAgbWV0aG9kRG9jVHlwZS5zZXRSZXF1ZXN0RG9jKHJlcXVlc3REb2MpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgTGlzdDxUYWc+PiBnZXRSZXNwb25zZVJlcHJlc2VudGF0aW9uVGFncyhmaW5hbCBNZXRob2REb2MgbWV0aG9kRG9jKSB7CisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIExpc3Q8VGFnPj4gdGFnc0J5U3RhdHVzID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBmb3IgKGZpbmFsIFRhZyB0YWcgOiBtZXRob2REb2MudGFncygpKSB7CisgICAgICAgICAgICBmaW5hbCBNYXRjaGVyIG1hdGNoZXIgPSBQQVRURVJOX1JFU1BPTlNFX1JFUFJFU0VOVEFUSU9OLm1hdGNoZXIodGFnLm5hbWUoKSk7CisgICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzKCkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc3RhdHVzID0gbWF0Y2hlci5ncm91cCgxKTsKKyAgICAgICAgICAgICAgICBMaXN0PFRhZz4gdGFncyA9IHRhZ3NCeVN0YXR1cy5nZXQoc3RhdHVzKTsKKyAgICAgICAgICAgICAgICBpZiAodGFncyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRhZ3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgICAgICAgICAgICAgdGFnc0J5U3RhdHVzLnB1dChzdGF0dXMsIHRhZ3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0YWdzLmFkZCh0YWcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0YWdzQnlTdGF0dXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VhcmNoZXMgYW4gPGNvZGU+QGxpbms8L2NvZGU+IHRhZyB3aXRoaW4gdGhlIGlubGluZSB0YWdzIG9mIHRoZSBzcGVjaWZpZWQgdGFnCisgICAgICogYW5kIHNlcmlhbGl6ZXMgdGhlIHJlZmVyZW5jZWQgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGFnIHRoZSB0YWcgY29udGFpbmluZyB0aGUgaW5saW5lIHRhZ3MgdG8gYmUgc2VhcmNoZWQuCisgICAgICogQHJldHVybiB0aGUge0Bjb2RlIFN0cmluZ30gcmVwcmVzZW50YXRpb24gb2YgdGhlIHtAbGluayBjb20uc3VuLmphdmFkb2MuVGFnfSBvciBudWxsIGlmIHRoZSBwYXJhbWV0ZXIgaXMgbnVsbC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U2VyaWFsaXplZEV4YW1wbGUoZmluYWwgVGFnIHRhZykgeworICAgICAgICBpZiAodGFnICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIFRhZ1tdIGlubGluZVRhZ3MgPSB0YWcuaW5saW5lVGFncygpOworICAgICAgICAgICAgaWYgKGlubGluZVRhZ3MgIT0gbnVsbCAmJiBpbmxpbmVUYWdzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIFRhZyBpbmxpbmVUYWcgOiBpbmxpbmVUYWdzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChMT0cuaXNMb2dnYWJsZShMZXZlbC5GSU5FKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HLmZpbmUoIkhhdmUgaW5saW5lIHRhZzogIiArIHByaW50KGlubGluZVRhZykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICgiQGxpbmsiLmVxdWFscyhpbmxpbmVUYWcubmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKExPRy5pc0xvZ2dhYmxlKExldmVsLkZJTkUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HLmZpbmUoIkhhdmUgbGluazogIiArIHByaW50KGlubGluZVRhZykpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU2VlVGFnIGxpbmtUYWcgPSAoU2VlVGFnKSBpbmxpbmVUYWc7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U2VyaWFsaXplZExpbmtGcm9tVGFnKGxpbmtUYWcpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc0VtcHR5KGlubGluZVRhZy50ZXh0KCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5saW5lVGFnLnRleHQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HLmZpbmUoIkhhdmUgZXhhbXBsZTogIiArIHByaW50KHRhZykpOworICAgICAgICAgICAgICAgIHJldHVybiB0YWcudGV4dCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFRhZyBnZXRTaW5nbGVUYWdPck51bGwoZmluYWwgTWV0aG9kRG9jIG1ldGhvZERvYywgZmluYWwgU3RyaW5nIHRhZ05hbWUpIHsKKyAgICAgICAgZmluYWwgVGFnW10gdGFncyA9IG1ldGhvZERvYy50YWdzKHRhZ05hbWUpOworICAgICAgICBpZiAodGFncyAhPSBudWxsICYmIHRhZ3MubGVuZ3RoID09IDEpIHsKKyAgICAgICAgICAgIHJldHVybiB0YWdzWzBdOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkUGFyYW1Eb2NzKGZpbmFsIE1ldGhvZERvYyBtZXRob2REb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWV0aG9kRG9jVHlwZSBtZXRob2REb2NUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIERvY1Byb2Nlc3NvciBkb2NQcm9jZXNzb3IpIHsKKyAgICAgICAgZmluYWwgUGFyYW1ldGVyW10gcGFyYW1ldGVycyA9IG1ldGhvZERvYy5wYXJhbWV0ZXJzKCk7CisgICAgICAgIGZpbmFsIFBhcmFtVGFnW10gcGFyYW1UYWdzID0gbWV0aG9kRG9jLnBhcmFtVGFncygpOworCisgICAgICAgIC8qIG9ubHkgdXNlIGJvdGggamF2YWRvYyBhbmQgcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiB3aGVuIHRoZSBudW1iZXIKKyAgICAgICAgICogb2YgcGFyYW1zIGFyZSB0aGUgc2FtZQorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHBhcmFtZXRlcnMgIT0gbnVsbCAmJiBwYXJhbVRhZ3MgIT0gbnVsbAorICAgICAgICAgICAgICAgICYmIHBhcmFtZXRlcnMubGVuZ3RoID09IHBhcmFtVGFncy5sZW5ndGgpIHsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICAgICAgZmluYWwgUGFyYW1ldGVyIHBhcmFtZXRlciA9IHBhcmFtZXRlcnNbaV07CisKKyAgICAgICAgICAgICAgICAvKiBUT0RPOiB0aGlzIG9ubHkgd29ya3MgaWYgdGhlIHBhcmFtcyBhbmQgdGFncyBhcmUgaW4gdGhlIHNhbWUKKyAgICAgICAgICAgICAgICAgKiBvcmRlci4gSWYgdGhlIHBhcmFtIHRhZ3MgYXJlIG1peGVkIHVwLCB0aGUgY29tbWVudHMgZm9yIHBhcmFtZXRlcnMKKyAgICAgICAgICAgICAgICAgKiB3aWxsIGJlIHdyb25nLgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGZpbmFsIFBhcmFtVGFnIHBhcmFtVGFnID0gcGFyYW1UYWdzW2ldOworCisgICAgICAgICAgICAgICAgZmluYWwgUGFyYW1Eb2NUeXBlIHBhcmFtRG9jVHlwZSA9IG5ldyBQYXJhbURvY1R5cGUoKTsKKyAgICAgICAgICAgICAgICBwYXJhbURvY1R5cGUuc2V0UGFyYW1OYW1lKHBhcmFtVGFnLnBhcmFtZXRlck5hbWUoKSk7CisgICAgICAgICAgICAgICAgcGFyYW1Eb2NUeXBlLnNldENvbW1lbnRUZXh0KHBhcmFtVGFnLnBhcmFtZXRlckNvbW1lbnQoKSk7CisgICAgICAgICAgICAgICAgZG9jUHJvY2Vzc29yLnByb2Nlc3NQYXJhbVRhZyhwYXJhbVRhZywgcGFyYW1ldGVyLCBwYXJhbURvY1R5cGUpOworCisgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbkRlc2NbXSBhbm5vdGF0aW9ucyA9IHBhcmFtZXRlci5hbm5vdGF0aW9ucygpOworICAgICAgICAgICAgICAgIGlmIChhbm5vdGF0aW9ucyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoZmluYWwgQW5ub3RhdGlvbkRlc2MgYW5ub3RhdGlvbkRlc2MgOiBhbm5vdGF0aW9ucykgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbkRvY1R5cGUgYW5ub3RhdGlvbkRvY1R5cGUgPSBuZXcgQW5ub3RhdGlvbkRvY1R5cGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB0eXBlTmFtZSA9IGFubm90YXRpb25EZXNjLmFubm90YXRpb25UeXBlKCkucXVhbGlmaWVkTmFtZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkRvY1R5cGUuc2V0QW5ub3RhdGlvblR5cGVOYW1lKHR5cGVOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoZmluYWwgRWxlbWVudFZhbHVlUGFpciBlbGVtZW50VmFsdWVQYWlyIDogYW5ub3RhdGlvbkRlc2MuZWxlbWVudFZhbHVlcygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTmFtZWRWYWx1ZVR5cGUgbmFtZWRWYWx1ZVR5cGUgPSBuZXcgTmFtZWRWYWx1ZVR5cGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lZFZhbHVlVHlwZS5zZXROYW1lKGVsZW1lbnRWYWx1ZVBhaXIuZWxlbWVudCgpLm5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZWRWYWx1ZVR5cGUuc2V0VmFsdWUoZWxlbWVudFZhbHVlUGFpci52YWx1ZSgpLnZhbHVlKCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbkRvY1R5cGUuZ2V0QXR0cmlidXRlRG9jcygpLmFkZChuYW1lZFZhbHVlVHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbURvY1R5cGUuZ2V0QW5ub3RhdGlvbkRvY3MoKS5hZGQoYW5ub3RhdGlvbkRvY1R5cGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbWV0aG9kRG9jVHlwZS5nZXRQYXJhbURvY3MoKS5hZGQocGFyYW1Eb2NUeXBlKTsKKworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U2VyaWFsaXplZExpbmtGcm9tVGFnKGZpbmFsIFNlZVRhZyBsaW5rVGFnKSB7CisgICAgICAgIGZpbmFsIE1lbWJlckRvYyByZWZlcmVuY2VkTWVtYmVyID0gbGlua1RhZy5yZWZlcmVuY2VkTWVtYmVyKCk7CisKKyAgICAgICAgaWYgKHJlZmVyZW5jZWRNZW1iZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJSZWZlcmVuY2VkIG1lbWJlciBvZiBAbGluayAiICsgcHJpbnQobGlua1RhZykgKyAiIGNhbm5vdCBiZSByZXNvbHZlZC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghcmVmZXJlbmNlZE1lbWJlci5pc1N0YXRpYygpKSB7CisgICAgICAgICAgICBMT0cud2FybmluZygiUmVmZXJlbmNlZCBtZW1iZXIgb2YgQGxpbmsgIiArIHByaW50KGxpbmtUYWcpICsgIiBpcyBub3Qgc3RhdGljLiIKKyAgICAgICAgICAgICAgICAgICAgKyAiIFJpZ2h0IG5vdyBvbmx5IHJlZmVyZW5jZXMgdG8gc3RhdGljIG1lbWJlcnMgYXJlIHN1cHBvcnRlZC4iKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgLyogR2V0IHJlZmVyZW5jZWQgZXhhbXBsZSBiZWFuCisgICAgICAgICAqLworICAgICAgICBmaW5hbCBDbGFzc0RvYyBjb250YWluaW5nQ2xhc3MgPSByZWZlcmVuY2VkTWVtYmVyLmNvbnRhaW5pbmdDbGFzcygpOworICAgICAgICBmaW5hbCBPYmplY3Qgb2JqZWN0OworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgRmllbGQgZGVjbGFyZWRGaWVsZCA9IENsYXNzLmZvck5hbWUoY29udGFpbmluZ0NsYXNzLnF1YWxpZmllZE5hbWUoKSwgZmFsc2UsIFRocmVhZC5jdXJyZW50VGhyZWFkKCkKKyAgICAgICAgICAgICAgICAgICAgLmdldENvbnRleHRDbGFzc0xvYWRlcigpKS5nZXREZWNsYXJlZEZpZWxkKHJlZmVyZW5jZWRNZW1iZXIubmFtZSgpKTsKKyAgICAgICAgICAgIGlmIChyZWZlcmVuY2VkTWVtYmVyLmlzRmluYWwoKSkgeworICAgICAgICAgICAgICAgIGRlY2xhcmVkRmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9iamVjdCA9IGRlY2xhcmVkRmllbGQuZ2V0KG51bGwpOworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5GSU5FLCAiR290IG9iamVjdCAiICsgb2JqZWN0KTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy5pbmZvKCJIYXZlIGNsYXNzbG9hZGVyOiAiICsgUmVzb3VyY2VEb2NsZXQuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKS5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIExPRy5pbmZvKCJIYXZlIHRocmVhZCBjbGFzc2xvYWRlciAiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKS5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIExPRy5pbmZvKCJIYXZlIHN5c3RlbSBjbGFzc2xvYWRlciAiICsgQ2xhc3NMb2FkZXIuZ2V0U3lzdGVtQ2xhc3NMb2FkZXIoKS5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLCAiQ291bGQgbm90IGdldCBmaWVsZCAiICsgcmVmZXJlbmNlZE1lbWJlci5xdWFsaWZpZWROYW1lKCksIGUpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvKiBtYXJzaGFsIHRoZSBiZWFuIHRvIHhtbAorICAgICAgICAgKi8KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIEpBWEJDb250ZXh0IGpheGJDb250ZXh0ID0gSkFYQkNvbnRleHQubmV3SW5zdGFuY2Uob2JqZWN0LmdldENsYXNzKCkpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nV3JpdGVyIHN0cmluZ1dyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgICAgIGZpbmFsIE1hcnNoYWxsZXIgbWFyc2hhbGxlciA9IGpheGJDb250ZXh0LmNyZWF0ZU1hcnNoYWxsZXIoKTsKKyAgICAgICAgICAgIG1hcnNoYWxsZXIuc2V0UHJvcGVydHkoTWFyc2hhbGxlci5KQVhCX0ZPUk1BVFRFRF9PVVRQVVQsIHRydWUpOworICAgICAgICAgICAgbWFyc2hhbGxlci5tYXJzaGFsKG9iamVjdCwgc3RyaW5nV3JpdGVyKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQgPSBzdHJpbmdXcml0ZXIuZ2V0QnVmZmVyKCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuRklORSwgIkdvdCBtYXJzaGFsbGVkIG91dHB1dDpcbiIgKyByZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPRy5sb2coTGV2ZWwuU0VWRVJFLCAiQ291bGQgc2VyaWFsaXplIGJlYW4gdG8geG1sOiAiICsgb2JqZWN0LCBlKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHByaW50KGZpbmFsIFRhZyB0YWcpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKHRhZy5nZXRDbGFzcygpKSArICJbIgorICAgICAgICAgICAgICAgICsgImZpcnN0U2VudGVuY2VUYWdzPSIgKyB0b0NTVih0YWcuZmlyc3RTZW50ZW5jZVRhZ3MoKSkKKyAgICAgICAgICAgICAgICArICIsIGlubGluZVRhZ3M9IiArIHRvQ1NWKHRhZy5pbmxpbmVUYWdzKCkpCisgICAgICAgICAgICAgICAgKyAiLCBraW5kPSIgKyB0YWcua2luZCgpCisgICAgICAgICAgICAgICAgKyAiLCBuYW1lPSIgKyB0YWcubmFtZSgpCisgICAgICAgICAgICAgICAgKyAiLCB0ZXh0PSIgKyB0YWcudGV4dCgpCisgICAgICAgICAgICAgICAgKyAiXSI7CisgICAgfQorCisgICAgc3RhdGljIFN0cmluZyB0b0NTVihmaW5hbCBUYWdbXSBpdGVtcykgeworICAgICAgICBpZiAoaXRlbXMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRvQ1NWKEFycmF5cy5hc0xpc3QoaXRlbXMpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgU3RyaW5nIHRvQ1NWKGZpbmFsIENvbGxlY3Rpb248VGFnPiBpdGVtcykgeworICAgICAgICByZXR1cm4gdG9DU1YoaXRlbXMsICIsICIsIG51bGwpOworICAgIH0KKworICAgIHN0YXRpYyBTdHJpbmcgdG9DU1YoZmluYWwgQ29sbGVjdGlvbjxUYWc+IGl0ZW1zLCBmaW5hbCBTdHJpbmcgc2VwYXJhdG9yLCBmaW5hbCBTdHJpbmcgZGVsaW1pdGVyKSB7CisgICAgICAgIGlmIChpdGVtcyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXRlbXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGZvciAoZmluYWwgSXRlcmF0b3I8VGFnPiBpdGVyID0gaXRlbXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgaWYgKGRlbGltaXRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGRlbGltaXRlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBUYWcgaXRlbSA9IGl0ZXIubmV4dCgpOworICAgICAgICAgICAgc2IuYXBwZW5kKGl0ZW0ubmFtZSgpKTsKKyAgICAgICAgICAgIGlmIChkZWxpbWl0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChkZWxpbWl0ZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGl0ZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKHNlcGFyYXRvcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGFycmF5IGxlbmd0aCBmb3IgZ2l2ZW4gb3B0aW9uOiAxICsgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgdGhhdAorICAgICAqIHRoZSBvcHRpb24gdGFrZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3B0aW9uIG9wdGlvbgorICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBhcmdzIGZvciB0aGUgc3BlY2lmaWVkIG9wdGlvbgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50IG9wdGlvbkxlbmd0aChmaW5hbCBTdHJpbmcgb3B0aW9uKSB7CisgICAgICAgIExPRy5maW5lKCJJbnZva2VkIHdpdGggb3B0aW9uICIgKyBvcHRpb24pOworCisgICAgICAgIGlmIChPUFRJT05fT1VUUFVULmVxdWFscyhvcHRpb24pCisgICAgICAgICAgICAgICAgfHwgT1BUSU9OX0NMQVNTUEFUSC5lcXVhbHMob3B0aW9uKQorICAgICAgICAgICAgICAgIHx8IE9QVElPTl9ET0NfUFJPQ0VTU09SUy5lcXVhbHMob3B0aW9uKSkgeworICAgICAgICAgICAgcmV0dXJuIDI7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBWYWxpZGF0ZSBvcHRpb25zLgorICAgICAqCisgICAgICogQHBhcmFtIG9wdGlvbnMgIG9wdGlvbnMgdG8gYmUgdmFsaWRhdGVkCisgICAgICogQHBhcmFtIHJlcG9ydGVyIHtAbGluayBjb20uc3VuLmphdmFkb2MuRG9jRXJyb3JSZXBvcnRlcn0gZm9yIGNvbGxlY3RpbmcgZXZlbnR1YWwgZXJyb3JzCisgICAgICogQHJldHVybiBpZiB0aGUgc3BlY2lmaWVkIG9wdGlvbnMgYXJlIHZhbGlkCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHZhbGlkT3B0aW9ucyhmaW5hbCBTdHJpbmdbXVtdIG9wdGlvbnMsIGZpbmFsIERvY0Vycm9yUmVwb3J0ZXIgcmVwb3J0ZXIpIHsKKyAgICAgICAgcmV0dXJuIHZhbGlkT3B0aW9uKE9QVElPTl9PVVRQVVQsICI8cGF0aC10by1maWxlPiIsIG9wdGlvbnMsIHJlcG9ydGVyKQorICAgICAgICAgICAgICAgICYmIHZhbGlkT3B0aW9uKE9QVElPTl9DTEFTU1BBVEgsICI8cGF0aD4iLCBvcHRpb25zLCByZXBvcnRlcik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB2YWxpZE9wdGlvbihmaW5hbCBTdHJpbmcgb3B0aW9uTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZXBvcnRPcHRpb25OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nW11bXSBvcHRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRG9jRXJyb3JSZXBvcnRlciByZXBvcnRlcikgeworICAgICAgICBmaW5hbCBTdHJpbmcgb3B0aW9uID0gZ2V0T3B0aW9uQXJnKG9wdGlvbnMsIG9wdGlvbk5hbWUpOworCisgICAgICAgIGZpbmFsIGJvb2xlYW4gZm91bmRPcHRpb24gPSBvcHRpb24gIT0gbnVsbCAmJiAhb3B0aW9uLnRyaW0oKS5pc0VtcHR5KCk7CisgICAgICAgIGlmICghZm91bmRPcHRpb24pIHsKKyAgICAgICAgICAgIHJlcG9ydGVyLnByaW50RXJyb3Iob3B0aW9uTmFtZSArICIgIiArIHJlcG9ydE9wdGlvbk5hbWUgKyAiIG11c3QgYmUgc3BlY2lmaWVkLiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmb3VuZE9wdGlvbjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0T3B0aW9uQXJnKGZpbmFsIFN0cmluZ1tdW10gb3B0aW9ucywgZmluYWwgU3RyaW5nIG9wdGlvbikgeworCisgICAgICAgIGZvciAoZmluYWwgU3RyaW5nW10gb3B0IDogb3B0aW9ucykgeworICAgICAgICAgICAgaWYgKG9wdFswXS5lcXVhbHMob3B0aW9uKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBvcHRbMV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBzdGF0aWMgY2xhc3MgTG9hZGVyIGV4dGVuZHMgVVJMQ2xhc3NMb2FkZXIgeworCisgICAgICAgIHB1YmxpYyBMb2FkZXIoZmluYWwgU3RyaW5nW10gcGF0aHMsIGZpbmFsIENsYXNzTG9hZGVyIHBhcmVudCkgeworICAgICAgICAgICAgc3VwZXIoZ2V0VVJMcyhwYXRocyksIHBhcmVudCk7CisgICAgICAgIH0KKworICAgICAgICBMb2FkZXIoZmluYWwgU3RyaW5nW10gcGF0aHMpIHsKKyAgICAgICAgICAgIHN1cGVyKGdldFVSTHMocGF0aHMpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIFVSTFtdIGdldFVSTHMoZmluYWwgU3RyaW5nW10gcGF0aHMpIHsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8VVJMPiB1cmxzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBwYXRoIDogcGF0aHMpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB1cmxzLmFkZChuZXcgRmlsZShwYXRoKS50b1VSSSgpLnRvVVJMKCkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB1cmxzLnRvQXJyYXkobmV3IFVSTFt1cmxzLnNpemUoKV0pOworICAgICAgICB9CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2V4dC93YWRsLWRvY2xldC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3dhZGwvZG9jbGV0L3BhY2thZ2UtaW5mby5qYXZhIGIvZXh0L3dhZGwtZG9jbGV0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvd2FkbC9kb2NsZXQvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzI0YjhmYwotLS0gL2Rldi9udWxsCisrKyBiL2V4dC93YWRsLWRvY2xldC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3dhZGwvZG9jbGV0L3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKKy8qKgorICogSmVyc2V5IGNsYXNzZXMgdXNlZCBmb3IgZG9jbGV0IGdlbmVyYXRpb24gZm9yIFdBREwgcHVycG9zZXMuIENsYXNzZXMgYXJlIHVzZWQgZHVyaW5nIHRoZSBjb21waWxlIHRpbWUKKyAqIHdoZW4gZG9jbGV0IGlzIGdlbmVyYXRlZC4gTGF0ZXIgdGhlIHJlc3VsdCBpcyB1c2VkIGZvciBXQURMIGdlbmVyYXRpb24uCisgKgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LndhZGwuZG9jbGV0OwpkaWZmIC0tZ2l0IGEvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvcG9tLnhtbCBiL2luY3ViYXRvci9kZWNsYXJhdGl2ZS1saW5raW5nL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkyY2IyYQotLS0gL2Rldi9udWxsCisrKyBiL2luY3ViYXRvci9kZWNsYXJhdGl2ZS1saW5raW5nL3BvbS54bWwKQEAgLTAsMCArMSwxNjcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmluY3ViYXRvcjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktZGVjbGFyYXRpdmUtbGlua2luZzwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorCisgICAgPG5hbWU+amVyc2V5LWRlY2xhcmF0aXZlLWxpbmtpbmc8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIEplcnNleSBzdXBwb3J0IGZvciBkZWNsYXJhdGl2ZSBoeXBlcmxpbmtpbmcuCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb21tb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktc2VydmVyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lbDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LmVsLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLndlYjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LmVsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1ncml6emx5MjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLWpzb24tamFja3NvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7amVyc2V5LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNreXNjcmVhbWVyPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNvbmFzc2VydDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjEuNC4wPC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnJlbGVhc2U8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGlua3M+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaW5rPmh0dHBzOi8vanNyMzExLmphdmEubmV0L25vbmF2L3JlbGVhc2VzLzEuMTwvbGluaz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpbms+aHR0cHM6Ly9qZXJzZXkuamF2YS5uZXQvbm9uYXYvYXBpZG9jcy9sYXRlc3QvamVyc2V5LzwvbGluaz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xpbmtzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxub3RpbWVzdGFtcD50cnVlPC9ub3RpbWVzdGFtcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5jb2JlcnR1cmE8L2lkPgorICAgICAgICAgICAgPGFjdGl2YXRpb24+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICA8bmFtZT5jb2JlcnR1cmE8L25hbWU+CisgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KKyAgICAgICAgICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb21tb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+Y29iZXJ0dXJhPC9jbGFzc2lmaWVyPgorICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPmRlZmF1bHQ8L2lkPgorICAgICAgICAgICAgPGFjdGl2YXRpb24+CisgICAgICAgICAgICAgICAgPGFjdGl2ZUJ5RGVmYXVsdD50cnVlPC9hY3RpdmVCeURlZmF1bHQ+CisgICAgICAgICAgICA8L2FjdGl2YXRpb24+CisgICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29tbW9uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICA8L3Byb2ZpbGVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cmVzb3VyY2VzPgorICAgICAgICAgICAgPHJlc291cmNlPgorICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9qYXZhPC9kaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgICAgICAgICAgICA8aW5jbHVkZT5NRVRBLUlORi8qKi8qPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgICAgICA8L3Jlc291cmNlPgorICAgICAgICA8L3Jlc291cmNlcz4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKworICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL0JpbmRpbmcuamF2YSBiL2luY3ViYXRvci9kZWNsYXJhdGl2ZS1saW5raW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbGlua2luZy9CaW5kaW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRiNWJmMgotLS0gL2Rldi9udWxsCisrKyBiL2luY3ViYXRvci9kZWNsYXJhdGl2ZS1saW5raW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbGlua2luZy9CaW5kaW5nLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5saW5raW5nOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5CZXRhOworCisvKioKKyAqIFNwZWNpZmllcyB0aGUgYmluZGluZyBiZXR3ZWVuIGEgVVJJIHRlbXBsYXRlIHBhcmFtZXRlciBhbmQgYSBiZWFuIHByb3BlcnR5LgorICogQHNlZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5saW5raW5nLkluamVjdExpbmsjYmluZGluZ3MoKQorICoKKyAqIEBhdXRob3IgTWFyayBIYWRsZXkKKyAqIEBhdXRob3IgR2VyYXJkIERhdmlzb24gKGdlcmFyZC5kYXZpc29uIGF0IG9yYWNsZS5jb20pCisgKi8KK0BUYXJnZXQoe30pCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorQEJldGEKK3B1YmxpYyBAaW50ZXJmYWNlIEJpbmRpbmcgeworCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIHRoZSBuYW1lIG9mIHRoZSBVUkkgdGVtcGxhdGUgcGFyYW1ldGVyLCBkZWZhdWx0cyB0bworICAgICAqICJ2YWx1ZSIgZm9yIGNvbnZlbmllbmNlLgorICAgICAqLworICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAidmFsdWUiOworCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIHRoZSB2YWx1ZSBvZiBhIFVSSSB0ZW1wbGF0ZSBwYXJhbWV0ZXIuIFRoZSB2YWx1ZSBpcyBhbiBFTAorICAgICAqIGV4cHJlc3Npb24gdXNpbmcgaW1tZWRpYXRlIGV2YWx1YXRpb24gc3ludGF4LiBFLmcuOgorICAgICAqIDxwcmU+JHtpbnN0YW5jZS53aWRnZXRJZH08L3ByZT4KKyAgICAgKiBJbiB0aGUgYWJvdmUgZXhhbXBsZSB0aGUgdmFsdWUgaXMgdGFrZW4gZnJvbSB0aGUgPGNvZGU+d2lkZ2V0SWQ8L2NvZGU+CisgICAgICogcHJvcGVydHkgb2YgdGhlIGltcGxpY2l0IDxjb2RlPmluc3RhbmNlPC9jb2RlPiBiZWFuLgorICAgICAqIDxwPlRocmVlIGltcGxpY2l0IGJlYW5zIGFyZSBzdXBwb3J0ZWQ6PC9wPgorICAgICAqIDxkbD4KKyAgICAgKiA8ZHQ+PGNvZGU+aW5zdGFuY2U8L2NvZGU+PC9kdD48ZGQ+VGhlIG9iamVjdCB3aG9zZSBjbGFzcyBjb250YWlucyB0aGUKKyAgICAgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkubGlua2luZy5JbmplY3RMaW5rfSBhbm5vdGF0aW9uLjwvZGQ+CisgICAgICogPGR0Pjxjb2RlPmVudGl0eTwvY29kZT48L2R0PjxkZD5UaGUgZW50aXR5IHJldHVybmVkIGJ5IHRoZSByZXNvdXJjZQorICAgICAqIGNsYXNzIG1ldGhvZC4gVGhpcyBpcyBlaXRoZXIgdGhlIHJlc291cmNlIG1ldGhvZCByZXR1cm4gdmFsdWUKKyAgICAgKiBvciB0aGUgZW50aXR5IHByb3BlcnR5IGZvciBhIHJlc291cmNlIG1ldGhvZCB0aGF0IHJldHVybnMgUmVzcG9uc2UuPC9kZD4KKyAgICAgKiA8ZHQ+PGNvZGU+cmVzb3VyY2U8L2NvZGU+PC9kdD48ZGQ+VGhlIHJlc291cmNlIGNsYXNzIGluc3RhbmNlIHRoYXQKKyAgICAgKiByZXR1cm5lZCB0aGUgb2JqZWN0IHRoYXQgY29udGFpbnMgdGhlIHtAY29kZSBJbmplY3RMaW5rfSBhbm5vdGF0aW9uLjwvZGQ+CisgICAgICogPC9kZD4KKyAgICAgKiA8L2RsPgorICAgICAqLworICAgIFN0cmluZyB2YWx1ZSgpOworfQpkaWZmIC0tZ2l0IGEvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL0RlY2xhcmF0aXZlTGlua2luZ0ZlYXR1cmUuamF2YSBiL2luY3ViYXRvci9kZWNsYXJhdGl2ZS1saW5raW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbGlua2luZy9EZWNsYXJhdGl2ZUxpbmtpbmdGZWF0dXJlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIxNTQ2NAotLS0gL2Rldi9udWxsCisrKyBiL2luY3ViYXRvci9kZWNsYXJhdGl2ZS1saW5raW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbGlua2luZy9EZWNsYXJhdGl2ZUxpbmtpbmdGZWF0dXJlLmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5saW5raW5nOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmVDb250ZXh0OworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LkJldGE7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkFic3RyYWN0QmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxpbmtpbmcuY29udHJpYnV0aW5nLk5haXZlUmVzb3VyY2VMaW5rQ29udHJpYnV0aW9uQ29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5saW5raW5nLmNvbnRyaWJ1dGluZy5SZXNvdXJjZUxpbmtDb250cmlidXRpb25Db250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxpbmtpbmcubWFwcGluZy5OYWl2ZVJlc291cmNlTWFwcGluZ0NvbnRleHQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubGlua2luZy5tYXBwaW5nLlJlc291cmNlTWFwcGluZ0NvbnRleHQ7CisKKy8qKgorICogQSBmZWF0dXJlIHRvIGVuYWJsZSB0aGUgZGVjbGFyYXRpdmUgbGlua2luZyBmdW5jdGlvbmFsaXR5LgorICoKKyAqIEBhdXRob3IgTWFyayBIYWRsZXkKKyAqIEBhdXRob3IgR2VyYXJkIERhdmlzb24gKGdlcmFyZC5kYXZpc29uIGF0IG9yYWNsZS5jb20pCisgKi8KK0BCZXRhCitwdWJsaWMgY2xhc3MgRGVjbGFyYXRpdmVMaW5raW5nRmVhdHVyZSBpbXBsZW1lbnRzIEZlYXR1cmUgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlKEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKworICAgICAgICBDb25maWd1cmF0aW9uIGNvbmZpZyA9IGNvbnRleHQuZ2V0Q29uZmlndXJhdGlvbigpOworICAgICAgICBpZiAoIWNvbmZpZy5pc1JlZ2lzdGVyZWQoUmVzcG9uc2VMaW5rRmlsdGVyLmNsYXNzKSkgeworICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihuZXcgQWJzdHJhY3RCaW5kZXIoKSB7CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgICAgICAgICAgICAgIGJpbmRBc0NvbnRyYWN0KE5haXZlUmVzb3VyY2VNYXBwaW5nQ29udGV4dC5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG8oUmVzb3VyY2VNYXBwaW5nQ29udGV4dC5jbGFzcykuaW4oU2luZ2xldG9uLmNsYXNzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIobmV3IEFic3RyYWN0QmluZGVyKCkgeworCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICAgICAgICAgICAgICBiaW5kQXNDb250cmFjdChOYWl2ZVJlc291cmNlTGlua0NvbnRyaWJ1dGlvbkNvbnRleHQuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvKFJlc291cmNlTGlua0NvbnRyaWJ1dGlvbkNvbnRleHQuY2xhc3MpLmluKFNpbmdsZXRvbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoUmVzcG9uc2VMaW5rRmlsdGVyLmNsYXNzKTsKKworICAgICAgICAgICAgLy8gVE9ETzogbWFwIHZhbHVlcyBiYWNrPworICAgICAgICAgICAgLy8gY29udGV4dC5yZWdpc3RlcihSZXF1ZXN0TGlua0ZpbHRlci5jbGFzcyk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL0VMTGlua0J1aWxkZXIuamF2YSBiL2luY3ViYXRvci9kZWNsYXJhdGl2ZS1saW5raW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbGlua2luZy9FTExpbmtCdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU3NzdiZQotLS0gL2Rldi9udWxsCisrKyBiL2luY3ViYXRvci9kZWNsYXJhdGl2ZS1saW5raW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbGlua2luZy9FTExpbmtCdWlsZGVyLmphdmEKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubGlua2luZzsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKKworaW1wb3J0IGphdmF4LmVsLkV4cHJlc3Npb25GYWN0b3J5OworaW1wb3J0IGphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxpbmtpbmcubWFwcGluZy5SZXNvdXJjZU1hcHBpbmdDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnVyaS5pbnRlcm5hbC5VcmlUZW1wbGF0ZVBhcnNlcjsKKworLyoqCisgKiBBIGhlbHBlciBjbGFzcyB0byBidWlsZCBsaW5rcyBmcm9tIEVMIGV4cHJlc3Npb25zLgorICoKKyAqIEBhdXRob3IgTWFyayBIYWRsZXkKKyAqIEBhdXRob3IgR2VyYXJkIERhdmlzb24gKGdlcmFyZC5kYXZpc29uIGF0IG9yYWNsZS5jb20pCisgKi8KK2ZpbmFsIGNsYXNzIEVMTGlua0J1aWxkZXIgeworCisgICAgcHJpdmF0ZSBFTExpbmtCdWlsZGVyKCkgeworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEV4cHJlc3Npb25GYWN0b3J5IGV4cHJlc3Npb25GYWN0b3J5ID0KKyAgICAgICAgICAgIEV4cHJlc3Npb25GYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisKKyAgICAvKioKKyAgICAgKiBFdmFsdWF0ZXMgdGhlIGNvbmRpdGlvbgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmRpdGlvbiB0aGUgY29uZGl0aW9uIGV4cHJlc3Npb24KKyAgICAgKiBAcGFyYW0gZW50aXR5ICAgIHRoZSBlbnRpdHkgcmV0dXJuZWQgZnJvbSB0aGUgcmVzb3VyY2UgbWV0aG9kCisgICAgICogQHBhcmFtIHJlc291cmNlICB0aGUgcmVzb3VyY2UgY2xhc3MgaW5zdGFuY2UgdGhhdCByZXR1cm5lZCB0aGUgZW50aXR5CisgICAgICogQHBhcmFtIGluc3RhbmNlICB0aGUgaW5zdGFuY2UgdGhhdCBjb250YWlucyB0aGUgZW50aXR5LCBlLmcuIHRoZSB2YWx1ZSBvZiBhIGZpZWxkIHdpdGhpbiBhbiBlbnRpdHkgY2xhc3MuCisgICAgICogQHJldHVybiB0aGUgcmVzdWx0IG9mIHRoZSBjb25kaXRpb24KKyAgICAgKi8KKyAgICBzdGF0aWMgYm9vbGVhbiBldmFsdWF0ZUNvbmRpdGlvbihTdHJpbmcgY29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBlbnRpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHJlc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdCBpbnN0YW5jZSkgeworCisgICAgICAgIGlmIChjb25kaXRpb24gPT0gbnVsbCB8fCBjb25kaXRpb24uaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBMaW5rRUxDb250ZXh0IGNvbnRleHQgPSBuZXcgTGlua0VMQ29udGV4dChlbnRpdHksIHJlc291cmNlLCBpbnN0YW5jZSk7CisgICAgICAgIFZhbHVlRXhwcmVzc2lvbiBleHByID0gZXhwcmVzc2lvbkZhY3RvcnkuY3JlYXRlVmFsdWVFeHByZXNzaW9uKGNvbnRleHQsIGNvbmRpdGlvbiwgYm9vbGVhbi5jbGFzcyk7CisKKyAgICAgICAgT2JqZWN0IHJlc3VsdCA9IGV4cHIuZ2V0VmFsdWUoY29udGV4dCkudG9TdHJpbmcoKTsKKyAgICAgICAgcmV0dXJuICJ0cnVlIi5lcXVhbHMocmVzdWx0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIHRoZSBVUkkgdXNpbmcgdGhlIGxpbmsgZGVzY3JpcHRvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaW5rIHRoZSBsaW5rIGRlc2NyaXB0b3IKKyAgICAgKiBAcGFyYW0gZW50aXR5IHRoZSBlbnRpdHkgcmV0dXJuZWQgZnJvbSB0aGUgcmVzb3VyY2UgbWV0aG9kCisgICAgICogQHBhcmFtIHJlc291cmNlIHRoZSByZXNvdXJjZSBjbGFzcyBpbnN0YW5jZSB0aGF0IHJldHVybmVkIHRoZSBlbnRpdHkKKyAgICAgKiBAcGFyYW0gaW5zdGFuY2UgdGhlIGluc3RhbmNlIHRoYXQgY29udGFpbnMgdGhlIGVudGl0eSwgZS5nLiB0aGUgdmFsdWUgb2YgYSBmaWVsZCB3aXRoaW4gYW4gZW50aXR5IGNsYXNzLgorICAgICAqIEBwYXJhbSB1cmlJbmZvIEpBWC1SUyB7QGxpbmsgVXJpSW5mb30KKyAgICAgKiBAcGFyYW0gcm1jIHRoZSB7QGxpbmsgUmVzb3VyY2VNYXBwaW5nQ29udGV4dH0KKyAgICAgKiBAcmV0dXJuIHRoZSBVUkkKKyAgICAgKi8KKyAgICBzdGF0aWMgVVJJIGJ1aWxkVVJJKEluamVjdExpbmtEZXNjcmlwdG9yIGxpbmssCisgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgZW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IHJlc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgVXJpSW5mbyB1cmlJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VNYXBwaW5nQ29udGV4dCBybWMpIHsKKworICAgICAgICBTdHJpbmcgdGVtcGxhdGUgPSBsaW5rLmdldExpbmtUZW1wbGF0ZShybWMpOworCisgICAgICAgIC8vIGZpcnN0IHByb2Nlc3MgYW55IGVtYmVkZGVkIEVMIGV4cHJlc3Npb25zCisgICAgICAgIExpbmtFTENvbnRleHQgY29udGV4dCA9IG5ldyBMaW5rRUxDb250ZXh0KGVudGl0eSwgcmVzb3VyY2UsIGluc3RhbmNlKTsKKyAgICAgICAgVmFsdWVFeHByZXNzaW9uIGV4cHIgPSBleHByZXNzaW9uRmFjdG9yeS5jcmVhdGVWYWx1ZUV4cHJlc3Npb24oY29udGV4dCwKKyAgICAgICAgICAgICAgICB0ZW1wbGF0ZSwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgdGVtcGxhdGUgPSBleHByLmdldFZhbHVlKGNvbnRleHQpLnRvU3RyaW5nKCk7CisKKyAgICAgICAgLy8gbm93IHByb2Nlc3MgYW55IGVtYmVkZGVkIFVSSSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzCisgICAgICAgIFVyaUJ1aWxkZXIgdWIgPSBhcHBseUxpbmtTdHlsZSh0ZW1wbGF0ZSwgbGluay5nZXRMaW5rU3R5bGUoKSwgdXJpSW5mbyk7CisgICAgICAgIFVyaVRlbXBsYXRlUGFyc2VyIHBhcnNlciA9IG5ldyBVcmlUZW1wbGF0ZVBhcnNlcih0ZW1wbGF0ZSk7CisgICAgICAgIExpc3Q8U3RyaW5nPiBwYXJhbWV0ZXJOYW1lcyA9IHBhcnNlci5nZXROYW1lcygpOworICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHZhbHVlTWFwID0gZ2V0UGFyYW1ldGVyVmFsdWVzKHBhcmFtZXRlck5hbWVzLCBsaW5rLCBjb250ZXh0LCB1cmlJbmZvKTsKKyAgICAgICAgcmV0dXJuIHViLmJ1aWxkRnJvbU1hcCh2YWx1ZU1hcCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgVXJpQnVpbGRlciBhcHBseUxpbmtTdHlsZShTdHJpbmcgdGVtcGxhdGUsIEluamVjdExpbmsuU3R5bGUgc3R5bGUsIFVyaUluZm8gdXJpSW5mbykgeworICAgICAgICBVcmlCdWlsZGVyIHViID0gbnVsbDsKKyAgICAgICAgc3dpdGNoIChzdHlsZSkgeworICAgICAgICAgICAgY2FzZSBBQlNPTFVURToKKyAgICAgICAgICAgICAgICB1YiA9IHVyaUluZm8uZ2V0QmFzZVVyaUJ1aWxkZXIoKS5wYXRoKHRlbXBsYXRlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQUJTT0xVVEVfUEFUSDoKKyAgICAgICAgICAgICAgICBTdHJpbmcgYmFzZVBhdGggPSB1cmlJbmZvLmdldEJhc2VVcmkoKS5nZXRQYXRoKCk7CisgICAgICAgICAgICAgICAgdWIgPSBVcmlCdWlsZGVyLmZyb21QYXRoKGJhc2VQYXRoKS5wYXRoKHRlbXBsYXRlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUkVMQVRJVkVfUEFUSDoKKyAgICAgICAgICAgICAgICB1YiA9IFVyaUJ1aWxkZXIuZnJvbVBhdGgodGVtcGxhdGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiB1YjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFBhcmFtZXRlclZhbHVlcyhMaXN0PFN0cmluZz4gcGFyYW1ldGVyTmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5qZWN0TGlua0Rlc2NyaXB0b3IgbGlua0ZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbmtFTENvbnRleHQgY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcmlJbmZvIHVyaUluZm8pIHsKKyAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiB2YWx1ZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIGZvciAoU3RyaW5nIG5hbWUgOiBwYXJhbWV0ZXJOYW1lcykgeworICAgICAgICAgICAgU3RyaW5nIGVsRXhwcmVzc2lvbiA9IGxpbmtGaWVsZC5nZXRCaW5kaW5nKG5hbWUpOworICAgICAgICAgICAgaWYgKGVsRXhwcmVzc2lvbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gdXJpSW5mby5nZXRQYXRoUGFyYW1ldGVycygpLmdldEZpcnN0KG5hbWUpOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdXJpSW5mby5nZXRRdWVyeVBhcmFtZXRlcnMoKS5nZXRGaXJzdChuYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVzLnB1dChuYW1lLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbEV4cHJlc3Npb24gPSAiJHsiICsgUmVzcG9uc2VDb250ZXh0UmVzb2x2ZXIuSU5TVEFOQ0VfT0JKRUNUICsgIi4iICsgbmFtZSArICJ9IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFZhbHVlRXhwcmVzc2lvbiBleHByID0gZXhwcmVzc2lvbkZhY3RvcnkuY3JlYXRlVmFsdWVFeHByZXNzaW9uKGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICBlbEV4cHJlc3Npb24sIFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IGV4cHIuZ2V0VmFsdWUoY29udGV4dCk7CisgICAgICAgICAgICB2YWx1ZXMucHV0KG5hbWUsIHZhbHVlICE9IG51bGwgPyB2YWx1ZS50b1N0cmluZygpIDogbnVsbCk7CisgICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWx1ZXM7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xpbmtpbmcvRW50aXR5RGVzY3JpcHRvci5qYXZhIGIvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL0VudGl0eURlc2NyaXB0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTRjODM5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL0VudGl0eURlc2NyaXB0b3IuamF2YQpAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5saW5raW5nOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkxpbms7CisKKy8qKgorICogRGVzY3JpYmVzIGFuIGVudGl0eSBpbiB0ZXJtcyBvZiBpdHMgZmllbGRzLCBiZWFuIHByb3BlcnRpZXMgYW5kIHtAbGluayBJbmplY3RMaW5rfQorICogYW5ub3RhdGVkIGZpZWxkcy4KKyAqCisgKiBAYXV0aG9yIE1hcmsgSGFkbGV5CisgKiBAYXV0aG9yIEdlcmFyZCBEYXZpc29uIChnZXJhcmQuZGF2aXNvbiBhdCBvcmFjbGUuY29tKQorICovCitjbGFzcyBFbnRpdHlEZXNjcmlwdG9yIHsKKworICAgIC8vIE1haW50YWlucyBhbiBpbnRlcm5hbCBzdGF0aWMgY2FjaGUgdG8gb3B0aW1pemUgcHJvY2Vzc2luZworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxDbGFzczw/PiwgRW50aXR5RGVzY3JpcHRvcj4gZGVzY3JpcHRvcnMgPSBuZXcgSGFzaE1hcDw+KCk7CisKKyAgICBzdGF0aWMgc3luY2hyb25pemVkIEVudGl0eURlc2NyaXB0b3IgZ2V0SW5zdGFuY2UoQ2xhc3M8Pz4gZW50aXR5Q2xhc3MpIHsKKyAgICAgICAgaWYgKGRlc2NyaXB0b3JzLmNvbnRhaW5zS2V5KGVudGl0eUNsYXNzKSkgeworICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3JzLmdldChlbnRpdHlDbGFzcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBFbnRpdHlEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBuZXcgRW50aXR5RGVzY3JpcHRvcihlbnRpdHlDbGFzcyk7CisgICAgICAgICAgICBkZXNjcmlwdG9ycy5wdXQoZW50aXR5Q2xhc3MsIGRlc2NyaXB0b3IpOworICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBpbnN0YW5jZQorCisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBGaWVsZERlc2NyaXB0b3I+IG5vbkxpbmtGaWVsZHM7CisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBGaWVsZERlc2NyaXB0b3I+IGxpbmtGaWVsZHM7CisgICAgcHJpdmF0ZSBMaXN0PExpbmtIZWFkZXJEZXNjcmlwdG9yPiBsaW5rSGVhZGVyczsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhbiBuZXcgZGVzY3JpcHRvciBieSBpbnNwZWN0aW5nIHRoZSBzdXBwbGllZCBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbnRpdHlDbGFzcworICAgICAqLworICAgIHByaXZhdGUgRW50aXR5RGVzY3JpcHRvcihDbGFzczw/PiBlbnRpdHlDbGFzcykgeworICAgICAgICAvLyBjcmVhdGUgYSBsaXN0IG9mIGxpbmsgaGVhZGVycworICAgICAgICB0aGlzLmxpbmtIZWFkZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZpbmRMaW5rSGVhZGVycyhlbnRpdHlDbGFzcyk7CisgICAgICAgIHRoaXMubGlua0hlYWRlcnMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KGxpbmtIZWFkZXJzKTsKKworICAgICAgICAvLyBjcmVhdGUgYSBsaXN0IG9mIGZpZWxkIG5hbWVzCisgICAgICAgIHRoaXMubm9uTGlua0ZpZWxkcyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgdGhpcy5saW5rRmllbGRzID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBmaW5kRmllbGRzKGVudGl0eUNsYXNzKTsKKyAgICAgICAgdGhpcy5ub25MaW5rRmllbGRzID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHRoaXMubm9uTGlua0ZpZWxkcyk7CisgICAgICAgIHRoaXMubGlua0ZpZWxkcyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcCh0aGlzLmxpbmtGaWVsZHMpOworICAgIH0KKworICAgIENvbGxlY3Rpb248RmllbGREZXNjcmlwdG9yPiBnZXRMaW5rRmllbGRzKCkgeworICAgICAgICByZXR1cm4gbGlua0ZpZWxkcy52YWx1ZXMoKTsKKyAgICB9CisKKyAgICBDb2xsZWN0aW9uPEZpZWxkRGVzY3JpcHRvcj4gZ2V0Tm9uTGlua0ZpZWxkcygpIHsKKyAgICAgICAgcmV0dXJuIG5vbkxpbmtGaWVsZHMudmFsdWVzKCk7CisgICAgfQorCisgICAgTGlzdDxMaW5rSGVhZGVyRGVzY3JpcHRvcj4gZ2V0TGlua0hlYWRlcnMoKSB7CisgICAgICAgIHJldHVybiBsaW5rSGVhZGVyczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaW5kIGFuZCBjYWNoZSB0aGUgZmllbGRzIG9mIHRoZSBzdXBwbGllZCBjbGFzcyBhbmQgaXRzIHN1cGVyY2xhc3NlcyBhbmQKKyAgICAgKiBpbnRlcmZhY2VzLgorICAgICAqCisgICAgICogQHBhcmFtIGVudGl0eUNsYXNzIHRoZSBjbGFzcworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBmaW5kRmllbGRzKENsYXNzPD8+IGVudGl0eUNsYXNzKSB7CisgICAgICAgIGZvciAoRmllbGQgZiA6IGVudGl0eUNsYXNzLmdldERlY2xhcmVkRmllbGRzKCkpIHsKKyAgICAgICAgICAgIEluamVjdExpbmsgYSA9IGYuZ2V0QW5ub3RhdGlvbihJbmplY3RMaW5rLmNsYXNzKTsKKyAgICAgICAgICAgIENsYXNzPD8+IHQgPSBmLmdldFR5cGUoKTsKKyAgICAgICAgICAgIGlmIChhICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpZiAodC5lcXVhbHMoU3RyaW5nLmNsYXNzKSB8fCB0LmVxdWFscyhVUkkuY2xhc3MpIHx8IExpbmsuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0KSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIWxpbmtGaWVsZHMuY29udGFpbnNLZXkoZi5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5rRmllbGRzLnB1dChmLmdldE5hbWUoKSwgbmV3IEluamVjdExpbmtGaWVsZERlc2NyaXB0b3IoZiwgYSwgdCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyB1bnN1cHBvcnRlZCB0eXBlCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChmLmlzQW5ub3RhdGlvblByZXNlbnQoSW5qZWN0TGlua3MuY2xhc3MpKSB7CisKKyAgICAgICAgICAgICAgICBpZiAoTGlzdC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHQpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCB0LmlzQXJyYXkoKSAmJiBMaW5rLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odC5nZXRDb21wb25lbnRUeXBlKCkpKSB7CisKKyAgICAgICAgICAgICAgICAgICAgSW5qZWN0TGlua3MgYTIgPSBmLmdldEFubm90YXRpb24oSW5qZWN0TGlua3MuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICBsaW5rRmllbGRzLnB1dChmLmdldE5hbWUoKSwgbmV3IEluamVjdExpbmtzRmllbGREZXNjcmlwdG9yKGYsIGEyLCB0KSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2FuIG9ubHkgaW5qZWN0IGxpbmtzIG9udG8gYSBMaXN0PExpbms+IG9yIExpbmtbXSBvYmplY3QiKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gc2VlIGlzc3VlIGh0dHA6Ly9qYXZhLm5ldC9qaXJhL2Jyb3dzZS9KRVJTRVktNjI1CisgICAgICAgICAgICAgICAgaWYgKChmLmdldE1vZGlmaWVycygpICYgTW9kaWZpZXIuU1RBVElDKSA+IDAKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGYuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoImphdmEuIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGYuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoImphdmF4LiIpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBub25MaW5rRmllbGRzLnB1dChmLmdldE5hbWUoKSwgbmV3IEZpZWxkRGVzY3JpcHRvcihmKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBsb29rIGZvciBub25MaW5rRmllbGRzIGluIHN1cGVyY2xhc3NlcworICAgICAgICBDbGFzczw/PiBzYyA9IGVudGl0eUNsYXNzLmdldFN1cGVyY2xhc3MoKTsKKyAgICAgICAgaWYgKHNjICE9IG51bGwgJiYgc2MgIT0gT2JqZWN0LmNsYXNzKSB7CisgICAgICAgICAgICBmaW5kRmllbGRzKHNjKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGxvb2sgZm9yIG5vbkxpbmtGaWVsZHMgaW4gaW50ZXJmYWNlcworICAgICAgICBmb3IgKENsYXNzPD8+IGljIDogZW50aXR5Q2xhc3MuZ2V0SW50ZXJmYWNlcygpKSB7CisgICAgICAgICAgICBmaW5kRmllbGRzKGljKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBmaW5kTGlua0hlYWRlcnMoQ2xhc3M8Pz4gZW50aXR5Q2xhc3MpIHsKKyAgICAgICAgSW5qZWN0TGluayBsaW5rSGVhZGVyQW5ub3RhdGlvbiA9IGVudGl0eUNsYXNzLmdldEFubm90YXRpb24oSW5qZWN0TGluay5jbGFzcyk7CisgICAgICAgIGlmIChsaW5rSGVhZGVyQW5ub3RhdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICBsaW5rSGVhZGVycy5hZGQobmV3IExpbmtIZWFkZXJEZXNjcmlwdG9yKGxpbmtIZWFkZXJBbm5vdGF0aW9uKSk7CisgICAgICAgIH0KKyAgICAgICAgSW5qZWN0TGlua3MgbGlua0hlYWRlcnNBbm5vdGF0aW9uID0gZW50aXR5Q2xhc3MuZ2V0QW5ub3RhdGlvbihJbmplY3RMaW5rcy5jbGFzcyk7CisgICAgICAgIGlmIChsaW5rSGVhZGVyc0Fubm90YXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChJbmplY3RMaW5rIGxpbmtIZWFkZXIgOiBsaW5rSGVhZGVyc0Fubm90YXRpb24udmFsdWUoKSkgeworICAgICAgICAgICAgICAgIGxpbmtIZWFkZXJzLmFkZChuZXcgTGlua0hlYWRlckRlc2NyaXB0b3IobGlua0hlYWRlcikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gbG9vayBpbiBzdXBlcmNsYXNzZXMKKyAgICAgICAgQ2xhc3M8Pz4gc2MgPSBlbnRpdHlDbGFzcy5nZXRTdXBlcmNsYXNzKCk7CisgICAgICAgIGlmIChzYyAhPSBudWxsICYmIHNjICE9IE9iamVjdC5jbGFzcykgeworICAgICAgICAgICAgZmluZExpbmtIZWFkZXJzKHNjKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGxvb2sgaW4gaW50ZXJmYWNlcworICAgICAgICBmb3IgKENsYXNzPD8+IGljIDogZW50aXR5Q2xhc3MuZ2V0SW50ZXJmYWNlcygpKSB7CisgICAgICAgICAgICBmaW5kTGlua0hlYWRlcnMoaWMpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL0ZpZWxkRGVzY3JpcHRvci5qYXZhIGIvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL0ZpZWxkRGVzY3JpcHRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNDRiNjgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xpbmtpbmcvRmllbGREZXNjcmlwdG9yLmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5saW5raW5nOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyBmb3Igd29ya2luZyB3aXRoIGNsYXNzIGZpZWxkcworICoKKyAqIEBhdXRob3IgTWFyayBIYWRsZXkKKyAqIEBhdXRob3IgR2VyYXJkIERhdmlzb24gKGdlcmFyZC5kYXZpc29uIGF0IG9yYWNsZS5jb20pCisgKi8KK2NsYXNzIEZpZWxkRGVzY3JpcHRvciB7CisKKyAgICBwcm90ZWN0ZWQgRmllbGQgZmllbGQ7CisKKyAgICBGaWVsZERlc2NyaXB0b3IoRmllbGQgZikgeworICAgICAgICB0aGlzLmZpZWxkID0gZjsKKyAgICB9CisKKyAgICBPYmplY3QgZ2V0RmllbGRWYWx1ZShPYmplY3QgaW5zdGFuY2UpIHsKKyAgICAgICAgc2V0QWNjZXNzaWJsZUZpZWxkKGZpZWxkKTsKKyAgICAgICAgT2JqZWN0IHZhbHVlID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHZhbHVlID0gZmllbGQuZ2V0KGluc3RhbmNlKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihGaWVsZERlc2NyaXB0b3IuY2xhc3MuZ2V0TmFtZSgpKS5sb2coTGV2ZWwuRklORSwgbnVsbCwgZXgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpZWxkTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGZpZWxkLmdldE5hbWUoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBzZXRBY2Nlc3NpYmxlRmllbGQoZmluYWwgRmllbGQgZikgeworICAgICAgICBpZiAoTW9kaWZpZXIuaXNQdWJsaWMoZi5nZXRNb2RpZmllcnMoKSkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKG5ldyBQcml2aWxlZ2VkQWN0aW9uPE9iamVjdD4oKSB7CisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHJ1bigpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWYuaXNBY2Nlc3NpYmxlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZi5zZXRBY2Nlc3NpYmxlKHRydWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBGaWVsZERlc2NyaXB0b3Igb3RoZXIgPSAoRmllbGREZXNjcmlwdG9yKSBvYmo7CisgICAgICAgIGlmICh0aGlzLmZpZWxkICE9IG90aGVyLmZpZWxkICYmICh0aGlzLmZpZWxkID09IG51bGwgfHwgIXRoaXMuZmllbGQuZXF1YWxzKG90aGVyLmZpZWxkKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IDc7CisgICAgICAgIGhhc2ggPSA4MyAqIGhhc2ggKyAodGhpcy5maWVsZCAhPSBudWxsID8gdGhpcy5maWVsZC5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIHJldHVybiBoYXNoOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL0ZpZWxkUHJvY2Vzc29yLmphdmEgYi9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xpbmtpbmcvRmllbGRQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjg1MmRkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL0ZpZWxkUHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSwxNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubGlua2luZzsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkxpbms7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUcmFuc2llbnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5saW5raW5nLmNvbnRyaWJ1dGluZy5SZXNvdXJjZUxpbmtDb250cmlidXRpb25Db250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxpbmtpbmcubWFwcGluZy5SZXNvdXJjZU1hcHBpbmdDb250ZXh0OworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgdGhhdCBjYW4gaW5qZWN0IGxpbmtzIGludG8ge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmxpbmtpbmcuSW5qZWN0TGlua30gYW5ub3RhdGVkIGZpZWxkcyBpbgorICogYW4gZW50aXR5LgorICoKKyAqIEBhdXRob3IgTWFyayBIYWRsZXkKKyAqIEBhdXRob3IgR2VyYXJkIERhdmlzb24gKGdlcmFyZC5kYXZpc29uIGF0IG9yYWNsZS5jb20pCisgKi8KK2NsYXNzIEZpZWxkUHJvY2Vzc29yPFQ+IHsKKworICAgIHByaXZhdGUgRW50aXR5RGVzY3JpcHRvciBpbnN0YW5jZURlc2NyaXB0b3I7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlci5nZXRMb2dnZXIoRmllbGRQcm9jZXNzb3IuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIEZpZWxkUHJvY2Vzc29yKENsYXNzPFQ+IGMpIHsKKyAgICAgICAgaW5zdGFuY2VEZXNjcmlwdG9yID0gRW50aXR5RGVzY3JpcHRvci5nZXRJbnN0YW5jZShjKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmplY3QgYW55IHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5saW5raW5nLkluamVjdExpbmt9IGFubm90YXRlZCBmaWVsZHMgaW4gdGhlIHN1cHBsaWVkIGVudGl0eSBhbmQKKyAgICAgKiByZWN1cnNpdmVseSBwcm9jZXNzIGl0cyBmaWVsZHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW50aXR5ICB0aGUgZW50aXR5IG9iamVjdCByZXR1cm5lZCBieSB0aGUgcmVzb3VyY2UgbWV0aG9kCisgICAgICogQHBhcmFtIHVyaUluZm8gdGhlIHVyaUluZm8gZm9yIHRoZSByZXF1ZXN0CisgICAgICogQHBhcmFtIHJtYyAgICAgdGhlIFJlc291cmNlTWFwcGluZ0NvbnRleHQgdXNlZCBmb3IgYnVpbGRpbmcgVVJJcworICAgICAqIEBwYXJhbSBybGNjICAgIHRoZSBSZXNvdXJjZUxpbmtDb250cmlidXRpb25Db250ZXh0IHVzZWQgdG8gZmluZCBsaW5rIGNvbnRyaWJ1dG9ycworICAgICAqLworICAgIHZvaWQgcHJvY2Vzc0xpbmtzKFQgZW50aXR5LCBVcmlJbmZvIHVyaUluZm8sIFJlc291cmNlTWFwcGluZ0NvbnRleHQgcm1jLCBSZXNvdXJjZUxpbmtDb250cmlidXRpb25Db250ZXh0IHJsY2MpIHsKKyAgICAgICAgU2V0PE9iamVjdD4gcHJvY2Vzc2VkID0gbmV3IEhhc2hTZXQ8T2JqZWN0PigpOworICAgICAgICBPYmplY3QgcmVzb3VyY2UgPSB1cmlJbmZvLmdldE1hdGNoZWRSZXNvdXJjZXMoKS5nZXQoMCk7CisgICAgICAgIHByb2Nlc3NMaW5rcyhlbnRpdHksIHJlc291cmNlLCBlbnRpdHksIHByb2Nlc3NlZCwgdXJpSW5mbywgcm1jLCBybGNjKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmplY3QgYW55IHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5saW5raW5nLkluamVjdExpbmt9IGFubm90YXRlZCBmaWVsZHMgaW4gdGhlIHN1cHBsaWVkIGluc3RhbmNlLiBDYWxsZWQKKyAgICAgKiBvbmNlIGZvciB0aGUgZW50aXR5IGFuZCB0aGVuIHJlY3Vyc2l2ZWx5IGZvciBlYWNoIG1lbWJlciBhbmQgZmllbGQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW50aXR5ICAgIHRoZSBlbnRpdHkgb2JqZWN0IHJldHVybmVkIGJ5IHRoZSByZXNvdXJjZSBtZXRob2QKKyAgICAgKiBAcGFyYW0gcHJvY2Vzc2VkIGEgbGlzdCBvZiBhbHJlYWR5IHByb2Nlc3NlZCBvYmplY3RzLCB1c2VkIHRvIGJyZWFrCisgICAgICogICAgICAgICAgICAgICAgICByZWN1cnNpb24gd2hlbiBwcm9jZXNzaW5nIGNpcmN1bGFyIHJlZmVyZW5jZXMuCisgICAgICogQHBhcmFtIHVyaUluZm8gICB0aGUgdXJpSW5mbyBmb3IgdGhlIHJlcXVlc3QKKyAgICAgKiBAcGFyYW0gcm1jICAgICAgIHRoZSBSZXNvdXJjZU1hcHBpbmdDb250ZXh0IHVzZWQgZm9yIGJ1aWxkaW5nIFVSSXMKKyAgICAgKiBAcGFyYW0gcmxjYyAgICAgIHRoZSBSZXNvdXJjZUxpbmtDb250cmlidXRpb25Db250ZXh0IHVzZWQgdG8gZmluZCBsaW5rIGNvbnRyaWJ1dG9ycworICAgICAqLworICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzTGlua3MoT2JqZWN0IGVudGl0eSwgT2JqZWN0IHJlc291cmNlLCBPYmplY3QgaW5zdGFuY2UsCisgICAgICAgICAgICBTZXQ8T2JqZWN0PiBwcm9jZXNzZWQsIFVyaUluZm8gdXJpSW5mbywKKyAgICAgICAgICAgIFJlc291cmNlTWFwcGluZ0NvbnRleHQgcm1jLCBSZXNvdXJjZUxpbmtDb250cmlidXRpb25Db250ZXh0IHJsY2MpIHsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaWYgKGluc3RhbmNlID09IG51bGwgfHwgcHJvY2Vzc2VkLmNvbnRhaW5zKGluc3RhbmNlKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsgLy8gaWdub3JlIG51bGwgcHJvcGVydGllcyBhbmQgZGVmZWF0IGNpcmN1bGFyIHJlZmVyZW5jZXMKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpbnN0YW5jZS5nZXRDbGFzcygpLmdldE5hbWUoKS5zdGFydHNXaXRoKCJqYXZhLmxhbmciKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByb2Nlc3NlZC5hZGQoaW5zdGFuY2UpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGZpeCBmb3IgSkVSU0VZLTE2NTYKKyAgICAgICAgICAgIGxvZy5sb2coTGV2ZWwuSU5GTywgTGlua01lc3NhZ2VzLldBUk5JTkdfTElOS0ZJTFRFUl9QUk9DRVNTSU5HKGluc3RhbmNlLmdldENsYXNzKCkuZ2V0TmFtZSgpKSwgZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBQcm9jZXNzIGFueSBATGluayBhbm5vdGF0ZWQgZmllbGRzIGluIGVudGl0eQorICAgICAgICBmb3IgKEZpZWxkRGVzY3JpcHRvciBmaWVsZCA6IGluc3RhbmNlRGVzY3JpcHRvci5nZXRMaW5rRmllbGRzKCkpIHsKKworICAgICAgICAgICAgLy8gVE9ETyByZXBsYWNlIHdpdGggcHJvcGVybHkgcG9seS1tb3JwaGljIGNvZGUKKyAgICAgICAgICAgIGlmIChmaWVsZCBpbnN0YW5jZW9mIEluamVjdExpbmtGaWVsZERlc2NyaXB0b3IpIHsKKyAgICAgICAgICAgICAgICBJbmplY3RMaW5rRmllbGREZXNjcmlwdG9yIGxpbmtGaWVsZCA9IChJbmplY3RMaW5rRmllbGREZXNjcmlwdG9yKSBmaWVsZDsKKyAgICAgICAgICAgICAgICBpZiAoRUxMaW5rQnVpbGRlci5ldmFsdWF0ZUNvbmRpdGlvbihsaW5rRmllbGQuZ2V0Q29uZGl0aW9uKCksIGVudGl0eSwgcmVzb3VyY2UsIGluc3RhbmNlKSkgeworICAgICAgICAgICAgICAgICAgICBVUkkgdXJpID0gRUxMaW5rQnVpbGRlci5idWlsZFVSSShsaW5rRmllbGQsIGVudGl0eSwgcmVzb3VyY2UsIGluc3RhbmNlLCB1cmlJbmZvLCBybWMpOworICAgICAgICAgICAgICAgICAgICBsaW5rRmllbGQuc2V0UHJvcGVydHlWYWx1ZShpbnN0YW5jZSwgdXJpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkIGluc3RhbmNlb2YgSW5qZWN0TGlua3NGaWVsZERlc2NyaXB0b3IpIHsKKworICAgICAgICAgICAgICAgIEluamVjdExpbmtzRmllbGREZXNjcmlwdG9yIGxpbmtzRmllbGQgPSAoSW5qZWN0TGlua3NGaWVsZERlc2NyaXB0b3IpIGZpZWxkOworICAgICAgICAgICAgICAgIExpc3Q8TGluaz4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgICAgIGZvciAoSW5qZWN0TGlua0ZpZWxkRGVzY3JpcHRvciBsaW5rRmllbGQgOiBsaW5rc0ZpZWxkLmdldExpbmtzVG9JbmplY3QoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoRUxMaW5rQnVpbGRlci5ldmFsdWF0ZUNvbmRpdGlvbihsaW5rRmllbGQuZ2V0Q29uZGl0aW9uKCksIGVudGl0eSwgcmVzb3VyY2UsIGluc3RhbmNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICBVUkkgdXJpID0gRUxMaW5rQnVpbGRlci5idWlsZFVSSShsaW5rRmllbGQsIGVudGl0eSwgcmVzb3VyY2UsIGluc3RhbmNlLCB1cmlJbmZvLCBybWMpOworICAgICAgICAgICAgICAgICAgICAgICBMaW5rIGxpbmsgPSBsaW5rRmllbGQuZ2V0TGluayh1cmkpOworICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChsaW5rKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBMaXN0PFByb3ZpZGVMaW5rRGVzY3JpcHRvcj4gbGlua0NvbnRyaWJ1dG9ycyA9IHJsY2MuZ2V0Q29udHJpYnV0b3JzRm9yKGluc3RhbmNlLmdldENsYXNzKCkpOworICAgICAgICAgICAgICAgIGZvciAoUHJvdmlkZUxpbmtEZXNjcmlwdG9yIGxpbmtDb250cmlidXRvciA6IGxpbmtDb250cmlidXRvcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEVMTGlua0J1aWxkZXIuZXZhbHVhdGVDb25kaXRpb24obGlua0NvbnRyaWJ1dG9yLmdldENvbmRpdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eSwgbGlua0NvbnRyaWJ1dG9yLmdldFJlc291cmNlKCksIGluc3RhbmNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgVVJJIHVyaSA9IEVMTGlua0J1aWxkZXIuYnVpbGRVUkkobGlua0NvbnRyaWJ1dG9yLCBlbnRpdHksIHJlc291cmNlLCBpbnN0YW5jZSwgdXJpSW5mbywgcm1jKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExpbmsgbGluayA9IGxpbmtDb250cmlidXRvci5nZXRMaW5rKHVyaSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChsaW5rKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGxpbmtzRmllbGQuc2V0UHJvcGVydHlWYWx1ZShpbnN0YW5jZSwgbGlzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiBlbnRpdHkgaXMgYW4gYXJyYXksIGNvbGxlY3Rpb24sIG9yIG1hcCB0aGVuIHByb2Nlc3MgbWVtYmVycworICAgICAgICBDbGFzczw/PiBpbnN0YW5jZUNsYXNzID0gaW5zdGFuY2UuZ2V0Q2xhc3MoKTsKKyAgICAgICAgaWYgKGluc3RhbmNlQ2xhc3MuaXNBcnJheSgpICYmIE9iamVjdFtdLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oaW5zdGFuY2VDbGFzcykpIHsKKyAgICAgICAgICAgIE9iamVjdCBhcnJheVtdID0gKE9iamVjdFtdKSBpbnN0YW5jZTsKKyAgICAgICAgICAgIGZvciAoT2JqZWN0IG1lbWJlciA6IGFycmF5KSB7CisgICAgICAgICAgICAgICAgcHJvY2Vzc01lbWJlcihlbnRpdHksIHJlc291cmNlLCBtZW1iZXIsIHByb2Nlc3NlZCwgdXJpSW5mbywgcm1jLCBybGNjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChpbnN0YW5jZSBpbnN0YW5jZW9mIEl0ZXJhYmxlKSB7CisgICAgICAgICAgICBJdGVyYWJsZSBpdGVyYWJsZSA9IChJdGVyYWJsZSkgaW5zdGFuY2U7CisgICAgICAgICAgICBmb3IgKE9iamVjdCBtZW1iZXIgOiBpdGVyYWJsZSkgeworICAgICAgICAgICAgICAgIHByb2Nlc3NNZW1iZXIoZW50aXR5LCByZXNvdXJjZSwgbWVtYmVyLCBwcm9jZXNzZWQsIHVyaUluZm8sIHJtYywgcmxjYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoaW5zdGFuY2UgaW5zdGFuY2VvZiBNYXApIHsKKyAgICAgICAgICAgIE1hcCBtYXAgPSAoTWFwKSBpbnN0YW5jZTsKKyAgICAgICAgICAgIGZvciAoT2JqZWN0IG1lbWJlciA6IG1hcC5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgcHJvY2Vzc01lbWJlcihlbnRpdHksIHJlc291cmNlLCBtZW1iZXIsIHByb2Nlc3NlZCwgdXJpSW5mbywgcm1jLCBybGNjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IHByb2Nlc3MgYWxsIG1lbWJlciBmaWVsZHMKKyAgICAgICAgZm9yIChGaWVsZERlc2NyaXB0b3IgbWVtYmVyIDogaW5zdGFuY2VEZXNjcmlwdG9yLmdldE5vbkxpbmtGaWVsZHMoKSkgeworCisgICAgICAgICAgICBpZiAoZmllbGRTdWl0YWJsZUZvckludHJvc3BlY3Rpb24obWVtYmVyKSkgeworICAgICAgICAgICAgICAgIHByb2Nlc3NNZW1iZXIoZW50aXR5LCByZXNvdXJjZSwgbWVtYmVyLmdldEZpZWxkVmFsdWUoaW5zdGFuY2UpLCBwcm9jZXNzZWQsIHVyaUluZm8sIHJtYywgcmxjYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBmaWVsZFN1aXRhYmxlRm9ySW50cm9zcGVjdGlvbihGaWVsZERlc2NyaXB0b3IgbWVtYmVyKSB7CisgICAgICAgIHJldHVybiBtZW1iZXIuZmllbGQgPT0gbnVsbAorICAgICAgICAgICAgICAgIHx8ICghbWVtYmVyLmZpZWxkLmlzU3ludGhldGljKCkKKyAgICAgICAgICAgICAgICAgICAgJiYgIU1vZGlmaWVyLmlzVHJhbnNpZW50KG1lbWJlci5maWVsZC5nZXRNb2RpZmllcnMoKSkKKyAgICAgICAgICAgICAgICAgICAgJiYgIW1lbWJlci5maWVsZC5nZXRUeXBlKCkuaXNQcmltaXRpdmUoKQorICAgICAgICAgICAgICAgICAgICAmJiBtZW1iZXIuZmllbGQuZ2V0VHlwZSgpICE9IFN0cmluZy5jbGFzcworICAgICAgICAgICAgICAgICAgICAmJiAhbWVtYmVyLmZpZWxkLmlzQW5ub3RhdGlvblByZXNlbnQoSW5qZWN0TGlua05vRm9sbG93LmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAmJiAhbWVtYmVyLmZpZWxkLmlzQW5ub3RhdGlvblByZXNlbnQoWG1sVHJhbnNpZW50LmNsYXNzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NNZW1iZXIoT2JqZWN0IGVudGl0eSwgT2JqZWN0IHJlc291cmNlLCBPYmplY3QgbWVtYmVyLCBTZXQ8T2JqZWN0PiBwcm9jZXNzZWQsIFVyaUluZm8gdXJpSW5mbywKKyAgICAgICAgICAgIFJlc291cmNlTWFwcGluZ0NvbnRleHQgcm1jLCBSZXNvdXJjZUxpbmtDb250cmlidXRpb25Db250ZXh0IHJsY2MpIHsKKyAgICAgICAgaWYgKG1lbWJlciAhPSBudWxsKSB7CisgICAgICAgICAgICBGaWVsZFByb2Nlc3Nvcjw/PiBwcm9jID0gbmV3IEZpZWxkUHJvY2Vzc29yKG1lbWJlci5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIHByb2MucHJvY2Vzc0xpbmtzKGVudGl0eSwgcmVzb3VyY2UsIG1lbWJlciwgcHJvY2Vzc2VkLCB1cmlJbmZvLCBybWMsIHJsY2MpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xpbmtpbmcvSGVhZGVyUHJvY2Vzc29yLmphdmEgYi9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xpbmtpbmcvSGVhZGVyUHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcwZmFkYQotLS0gL2Rldi9udWxsCisrKyBiL2luY3ViYXRvci9kZWNsYXJhdGl2ZS1saW5raW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbGlua2luZy9IZWFkZXJQcm9jZXNzb3IuamF2YQpAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lmxpbmtpbmc7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxpbmtpbmcubWFwcGluZy5SZXNvdXJjZU1hcHBpbmdDb250ZXh0OworCisvKioKKyAqIFByb2Nlc3NlcyBATGluayBhbmQgQExpbmtIZWFkZXJzIGFubm90YXRpb25zIG9uIGVudGl0eSBjbGFzc2VzIGFuZAorICogYWRkcyBhcHByb3ByaWF0ZSBIVFRQIExpbmsgaGVhZGVycy4KKyAqCisgKiBAYXV0aG9yIE1hcmsgSGFkbGV5CisgKiBAYXV0aG9yIEdlcmFyZCBEYXZpc29uIChnZXJhcmQuZGF2aXNvbiBhdCBvcmFjbGUuY29tKQorICovCitjbGFzcyBIZWFkZXJQcm9jZXNzb3I8VD4geworCisgICAgcHJpdmF0ZSBFbnRpdHlEZXNjcmlwdG9yIGluc3RhbmNlRGVzY3JpcHRvcjsKKworICAgIEhlYWRlclByb2Nlc3NvcihDbGFzczxUPiBjKSB7CisgICAgICAgIGluc3RhbmNlRGVzY3JpcHRvciA9IEVudGl0eURlc2NyaXB0b3IuZ2V0SW5zdGFuY2UoYyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvY2VzcyBhbnkge0BsaW5rIEluamVjdExpbmt9IGFubm90YXRpb25zIG9uIHRoZSBzdXBwbGllZCBlbnRpdHkuCisgICAgICogQHBhcmFtIGVudGl0eSB0aGUgZW50aXR5IG9iamVjdCByZXR1cm5lZCBieSB0aGUgcmVzb3VyY2UgbWV0aG9kCisgICAgICogQHBhcmFtIHVyaUluZm8gdGhlIHVyaUluZm8gZm9yIHRoZSByZXF1ZXN0CisgICAgICogQHBhcmFtIGhlYWRlcnMgdGhlIG1hcCBpbnRvIHdoaWNoIHRoZSBoZWFkZXJzIHdpbGwgYmUgYWRkZWQKKyAgICAgKi8KKyAgICB2b2lkIHByb2Nlc3NMaW5rSGVhZGVycyhUIGVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVcmlJbmZvIHVyaUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VNYXBwaW5nQ29udGV4dCBybWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGhlYWRlcnMpIHsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGhlYWRlclZhbHVlcyA9IGdldExpbmtIZWFkZXJWYWx1ZXMoZW50aXR5LCB1cmlJbmZvLCBybWMpOworICAgICAgICBmb3IgKFN0cmluZyBoZWFkZXJWYWx1ZSA6IGhlYWRlclZhbHVlcykgeworICAgICAgICAgICAgaGVhZGVycy5hZGQoIkxpbmsiLCBoZWFkZXJWYWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBMaXN0PFN0cmluZz4gZ2V0TGlua0hlYWRlclZhbHVlcyhPYmplY3QgZW50aXR5LCBVcmlJbmZvIHVyaUluZm8sIFJlc291cmNlTWFwcGluZ0NvbnRleHQgcm1jKSB7CisgICAgICAgIGZpbmFsIExpc3Q8T2JqZWN0PiBtYXRjaGVkUmVzb3VyY2VzID0gdXJpSW5mby5nZXRNYXRjaGVkUmVzb3VyY2VzKCk7CisKKyAgICAgICAgaWYgKCFtYXRjaGVkUmVzb3VyY2VzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgZmluYWwgT2JqZWN0IHJlc291cmNlID0gbWF0Y2hlZFJlc291cmNlcy5nZXQoMCk7CisgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gaGVhZGVyVmFsdWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICAgICAgICAgIGZvciAoTGlua0hlYWRlckRlc2NyaXB0b3IgZGVzYyA6IGluc3RhbmNlRGVzY3JpcHRvci5nZXRMaW5rSGVhZGVycygpKSB7CisgICAgICAgICAgICAgICAgaWYgKEVMTGlua0J1aWxkZXIuZXZhbHVhdGVDb25kaXRpb24oZGVzYy5nZXRDb25kaXRpb24oKSwgZW50aXR5LCByZXNvdXJjZSwgZW50aXR5KSkgeworICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaGVhZGVyVmFsdWUgPSBnZXRMaW5rSGVhZGVyVmFsdWUoZGVzYywgZW50aXR5LCByZXNvdXJjZSwgdXJpSW5mbywgcm1jKTsKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVyVmFsdWVzLmFkZChoZWFkZXJWYWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGhlYWRlclZhbHVlczsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0TGlua0hlYWRlclZhbHVlKExpbmtIZWFkZXJEZXNjcmlwdG9yIGRlc2MsIE9iamVjdCBlbnRpdHksIE9iamVjdCByZXNvdXJjZSwgVXJpSW5mbyB1cmlJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VNYXBwaW5nQ29udGV4dCBybWMpIHsKKyAgICAgICAgVVJJIHVyaSA9IEVMTGlua0J1aWxkZXIuYnVpbGRVUkkoZGVzYywgZW50aXR5LCByZXNvdXJjZSwgZW50aXR5LCB1cmlJbmZvLCBybWMpOworICAgICAgICBJbmplY3RMaW5rIGxpbmsgPSBkZXNjLmdldExpbmtIZWFkZXIoKTsKKyAgICAgICAgcmV0dXJuIEluamVjdExpbmsuVXRpbC5idWlsZExpbmtGcm9tVXJpKHVyaSwgbGluaykudG9TdHJpbmcoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2luY3ViYXRvci9kZWNsYXJhdGl2ZS1saW5raW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbGlua2luZy9JbmplY3RMaW5rLmphdmEgYi9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xpbmtpbmcvSW5qZWN0TGluay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MmIzZTkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xpbmtpbmcvSW5qZWN0TGluay5qYXZhCkBAIC0wLDAgKzEsMjI0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lmxpbmtpbmc7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkxpbms7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5CZXRhOworCisvKioKKyAqIFNwZWNpZmllcyBhIGxpbmsgaW5qZWN0aW9uIHRhcmdldCBpbiBhIHJldHVybmVkIHJlcHJlc2VudGF0aW9uIGJlYW4uIE1heSBiZQorICogdXNlZCBvbiBmaWVsZHMgb2YgdHlwZSBTdHJpbmcgb3IgVVJJLiBPbmUgb2Yge0BsaW5rICN2YWx1ZSgpfSBvcgorICoge0BsaW5rICNyZXNvdXJjZSgpfSBtdXN0IGJlIHNwZWNpZmllZC4KKyAqCisgKiBAYXV0aG9yIE1hcmsgSGFkbGV5CisgKiBAYXV0aG9yIEdlcmFyZCBEYXZpc29uIChnZXJhcmQuZGF2aXNvbiBhdCBvcmFjbGUuY29tKQorICovCitAVGFyZ2V0KHtFbGVtZW50VHlwZS5GSUVMRCwgRWxlbWVudFR5cGUuVFlQRX0pCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorQEJldGEKK3B1YmxpYyBAaW50ZXJmYWNlIEluamVjdExpbmsgeworCisgICAgLyoqCisgICAgICogU3R5bGVzIG9mIFVSSSBzdXBwb3J0ZWQKKyAgICAgKi8KKyAgICBlbnVtIFN0eWxlIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogQW4gYWJzb2x1dGUgVVJJLiBUaGUgVVJJIHRlbXBsYXRlIHdpbGwgYmUgcHJlZml4ZWQgd2l0aCB0aGUgYWJzb2x1dGUKKyAgICAgICAgICogYmFzZSBVUkkgb2YgdGhlIGFwcGxpY2F0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgQUJTT0xVVEUsCisgICAgICAgIC8qKgorICAgICAgICAgKiBBbiBhYnNvbHV0ZSBwYXRoLiBUaGUgVVJJIHRlbXBsYXRlIHdpbGwgYmUgcHJlZml4ZWQgd2l0aCB0aGUgYWJzb2x1dGUKKyAgICAgICAgICogYmFzZSBwYXRoIG9mIHRoZSBhcHBsaWNhdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIEFCU09MVVRFX1BBVEgsCisgICAgICAgIC8qKgorICAgICAgICAgKiBBIHJlbGF0aXZlIHBhdGguIFRoZSBVUkkgdGVtcGxhdGUgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSByZWxhdGl2ZQorICAgICAgICAgKiBwYXRoIHdpdGggbm8gcHJlZml4LgorICAgICAgICAgKi8KKyAgICAgICAgUkVMQVRJVkVfUEFUSAorCisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHN0eWxlIG9mIFVSSSB0byBpbmplY3QKKyAgICAgKi8KKyAgICBTdHlsZSBzdHlsZSgpIGRlZmF1bHQgU3R5bGUuQUJTT0xVVEVfUEFUSDsKKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyBhIFVSSSB0ZW1wbGF0ZSB0aGF0IHdpbGwgYmUgdXNlZCB0byBidWlsZCB0aGUgaW5qZWN0ZWQgVVJJLiBUaGUKKyAgICAgKiB0ZW1wbGF0ZSBtYXkgY29udGFpbiBib3RoIFVSSSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIChlLmcuIHtpZH0pIGFuZCBFTAorICAgICAqIGV4cHJlc3Npb25zIChlLmcuICR7aW5zdGFuY2UuaWR9KSB1c2luZyB0aGUgc2FtZSBpbXBsaWNpdCBiZWFucyBhcworICAgICAqIHtAbGluayBCaW5kaW5nI3ZhbHVlKCl9LiBVUkkgdGVtcGxhdGUgcGFyYW1ldGVyIHZhbHVlcyBhcmUgcmVzb2x2ZWQgYXMKKyAgICAgKiBkZXNjcmliZWQgaW4ge0BsaW5rICNyZXNvdXJjZSgpfS4gRS5nLiB0aGUgZm9sbG93aW5nIHRocmVlIGFsdGVybmF0aXZlcworICAgICAqIGFyZSBlcXVpdmFsZW50OgorICAgICAqIDxwcmU+CisgICAgICogJiM2NDtSZWYoIntpZH0iKQorICAgICAqICYjNjQ7UmVmKHZhbHVlPSJ7aWR9IiwgYmluZGluZ3M9eworICAgICAqICAgJiM2NDtCaW5kaW5nKG5hbWU9ImlkIiB2YWx1ZT0iJHtpbnN0YW5jZS5pZH0ifQorICAgICAqICkKKyAgICAgKiAmIzY0O1JlZigiJHtpbnN0YW5jZS5pZH0iKQorICAgICAqIDwvcHJlPgorICAgICAqLworICAgIFN0cmluZyB2YWx1ZSgpIGRlZmF1bHQgIiI7CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgYSByZXNvdXJjZSBjbGFzcyB3aG9zZSBAUGF0aCBVUkkgdGVtcGxhdGUgd2lsbCBiZSB1c2VkIHRvIGJ1aWxkCisgICAgICogdGhlIGluamVjdGVkIFVSSS4gRW1iZWRkZWQgVVJJIHRlbXBsYXRlIHBhcmFtZXRlciB2YWx1ZXMgYXJlIHJlc29sdmVkIGFzCisgICAgICogZm9sbG93czoKKyAgICAgKiA8b2w+CisgICAgICogPGxpPklmIHRoZSB7QGxpbmsgI2JpbmRpbmdzKCl9IHByb3BlcnR5IGNvbnRhaW5zIGEgYmluZGluZyBzcGVjaWZpY2F0aW9uCisgICAgICogZm9yIHRoZSBwYXJhbWV0ZXIgdGhlbiB0aGF0IGlzIHVzZWQ8L2xpPgorICAgICAqIDxsaT5PdGhlcndpc2UgYW4gaW1wbGljaXQgYmluZGluZyBpcyB1c2VkIHRoYXQgZXh0cmFjdHMgdGhlIHZhbHVlIG9mIGEKKyAgICAgKiBiZWFuIHByb3BlcnR5IGJ5IHRoZSBzYW1lIG5hbWUgYXMgdGhlIFVSSSB0ZW1wbGF0ZSBmcm9tIHRoZSBpbXBsaWNpdAorICAgICAqIHtAY29kZSBpbnN0YW5jZX0gYmVhbiAoc2VlIHtAbGluayBCaW5kaW5nfSkuPC9saT4KKyAgICAgKiA8L29sPgorICAgICAqIDxwPgorICAgICAqIEUuZy4gYXNzdW1pbmcgYSByZXNvdXJjZSBjbGFzcyB7QGNvZGUgU29tZVJlc291cmNlfSB3aXRoIHRoZQorICAgICAqIGZvbGxvd2luZyB7QGNvZGUgQFBhdGgoIntpZH0iKX0gYW5ub3RhdGlvbiwgdGhlIGZvbGxvd2luZyB0d28KKyAgICAgKiBhbHRlcm5hdGl2ZXMgYXJlIHRoZXJlZm9yZSBlcXVpdmFsZW50OjwvcD4KKyAgICAgKiA8cHJlPgorICAgICAqICYjNjQ7UmVmKHJlc291cmNlPVNvbWVSZXNvdXJjZS5jbGFzcykKKyAgICAgKiAmIzY0O1JlZihyZXNvdXJjZT1Tb21lUmVzb3VyY2UuY2xhc3MsIGJpbmRpbmdzPXsKKyAgICAgKiAgICYjNjQ7QmluZGluZyhuYW1lPSJpZCIgdmFsdWU9IiR7aW5zdGFuY2UuaWR9In0KKyAgICAgKiApCisgICAgICogPC9wcmU+CisgICAgICovCisgICAgQ2xhc3M8Pz4gcmVzb3VyY2UoKSBkZWZhdWx0IENsYXNzLmNsYXNzOworCisgICAgLyoqCisgICAgICogVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHtAbGluayAjcmVzb3VyY2UoKX0gdG8gc3BlY2lmeSBhIHN1YnJlc291cmNlCisgICAgICogbG9jYXRvciBvciBtZXRob2QuIFRoZSB2YWx1ZSBpcyB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kLiBUaGUgdmFsdWUgb2YgdGhlCisgICAgICogbWV0aG9kJ3MgQFBhdGggYW5ub3RhdGlvbiB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSB2YWx1ZSBvZiB0aGUKKyAgICAgKiBjbGFzcy1sZXZlbCBAUGF0aCBhbm5vdGF0aW9uIHNlcGFyYXRlZCBieSAnLycgaWYgbmVjZXNzYXJ5LgorICAgICAqLworICAgIFN0cmluZyBtZXRob2QoKSBkZWZhdWx0ICIiOworCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIHRoZSBiaW5kaW5ncyBmb3IgZW1iZWRkZWQgVVJJIHRlbXBsYXRlIHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiBAc2VlIEJpbmRpbmcKKyAgICAgKi8KKyAgICBCaW5kaW5nW10gYmluZGluZ3MoKSBkZWZhdWx0IHt9OworCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIGEgYm9vbGVhbiBFTCBleHByZXNzaW9uIHdob3NlIHZhbHVlIGRldGVybWluZXMgd2hldGhlciBhIFJlZiBpcworICAgICAqIHNldCAodHJ1ZSkgb3Igbm90IChmYWxzZSkuIE9taXNzaW9uIG9mIGEgY29uZGl0aW9uIHdpbGwgYWx3YXlzIGluc2VydCBhCisgICAgICogcmVmLgorICAgICAqLworICAgIFN0cmluZyBjb25kaXRpb24oKSBkZWZhdWx0ICIiOworCisgICAgLy8gTGluayBwcm9wZXJ0aWVzCisgICAgLy8KKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB0aGUgcmVsYXRpb25zaGlwLgorICAgICAqLworICAgIFN0cmluZyByZWwoKSBkZWZhdWx0ICIiOworCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIHRoZSByZXZlcnNlIHJlbGF0aW9uc2hpcC4KKyAgICAgKi8KKyAgICBTdHJpbmcgcmV2KCkgZGVmYXVsdCAiIjsKKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB0aGUgbWVkaWEgdHlwZS4KKyAgICAgKi8KKyAgICBTdHJpbmcgdHlwZSgpIGRlZmF1bHQgIiI7CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgdGhlIHRpdGxlLgorICAgICAqLworICAgIFN0cmluZyB0aXRsZSgpIGRlZmF1bHQgIiI7CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgdGhlIGFuY2hvcgorICAgICAqLworICAgIFN0cmluZyBhbmNob3IoKSBkZWZhdWx0ICIiOworCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIHRoZSBtZWRpYQorICAgICAqLworICAgIFN0cmluZyBtZWRpYSgpIGRlZmF1bHQgIiI7CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgdGhlIGxhbmcgb2YgdGhlIHJlZmVyZW5jZWQgcmVzb3VyY2UKKyAgICAgKi8KKyAgICBTdHJpbmcgaHJlZmxhbmcoKSBkZWZhdWx0ICIiOworCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIGV4dGVuc2lvbiBwYXJhbWV0ZXJzIGFzIG5hbWUtdmFsdWUgcGFpcnMuCisgICAgICovCisgICAgRXh0ZW5zaW9uW10gZXh0ZW5zaW9ucygpIGRlZmF1bHQge307CisKKyAgICBAVGFyZ2V0KHtFbGVtZW50VHlwZS5UWVBFLCBFbGVtZW50VHlwZS5GSUVMRH0pCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgICBAaW50ZXJmYWNlIEV4dGVuc2lvbiB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgZXh0ZW5zaW9uIHBhcmFtZXRlcgorICAgICAgICAgKi8KKyAgICAgICAgU3RyaW5nIG5hbWUoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU3BlY2lmaWVzIHRoZSB2YWx1ZSBvZiB0aGUgZXh0ZW5zaW9uIHBhcmFtZXRlcgorICAgICAgICAgKi8KKyAgICAgICAgU3RyaW5nIHZhbHVlKCk7CisgICAgfQorCisgICAgY2xhc3MgVXRpbCB7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBMaW5rIGJ1aWxkTGlua0Zyb21VcmkoVVJJIHVyaSwgSW5qZWN0TGluayBsaW5rKSB7CisKKyAgICAgICAgICAgIGphdmF4LndzLnJzLmNvcmUuTGluay5CdWlsZGVyIGJ1aWxkZXIgPSBqYXZheC53cy5ycy5jb3JlLkxpbmsuZnJvbVVyaSh1cmkpOworICAgICAgICAgICAgaWYgKCFsaW5rLnJlbCgpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBidWlsZGVyLnJlbChsaW5rLnJlbCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbGluay5yZXYoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyID0gYnVpbGRlci5wYXJhbSgicmV2IiwgbGluay5yZXYoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWxpbmsudHlwZSgpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBidWlsZGVyLnR5cGUobGluay50eXBlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFsaW5rLnRpdGxlKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgYnVpbGRlciA9IGJ1aWxkZXIucGFyYW0oInRpdGxlIiwgbGluay50aXRsZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbGluay5hbmNob3IoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyID0gYnVpbGRlci5wYXJhbSgiYW5jaG9yIiwgbGluay5hbmNob3IoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWxpbmsubWVkaWEoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyID0gYnVpbGRlci5wYXJhbSgibWVkaWEiLCBsaW5rLm1lZGlhKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFsaW5rLmhyZWZsYW5nKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgYnVpbGRlciA9IGJ1aWxkZXIucGFyYW0oImhyZWZsYW5nIiwgbGluay5ocmVmbGFuZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoSW5qZWN0TGluay5FeHRlbnNpb24gZXh0IDogbGluay5leHRlbnNpb25zKCkpIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyID0gYnVpbGRlci5wYXJhbShleHQubmFtZSgpLCBleHQudmFsdWUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xpbmtpbmcvSW5qZWN0TGlua0Rlc2NyaXB0b3IuamF2YSBiL2luY3ViYXRvci9kZWNsYXJhdGl2ZS1saW5raW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbGlua2luZy9JbmplY3RMaW5rRGVzY3JpcHRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlZTA2ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xpbmtpbmcvSW5qZWN0TGlua0Rlc2NyaXB0b3IuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lmxpbmtpbmc7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5saW5raW5nLm1hcHBpbmcuUmVzb3VyY2VNYXBwaW5nQ29udGV4dDsKKworLyoqCisgKiBVdGlsaXR5IGZvciB3b3JraW5nIHdpdGggQFJlZiBhbm5vdGF0aW9ucworICoKKyAqIEBhdXRob3IgTWFyayBIYWRsZXkKKyAqIEBhdXRob3IgR2VyYXJkIERhdmlzb24gKGdlcmFyZC5kYXZpc29uIGF0IG9yYWNsZS5jb20pCisgKi8KK2ludGVyZmFjZSBJbmplY3RMaW5rRGVzY3JpcHRvciB7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHN0eWxlCisgICAgICogQHJldHVybiB0aGUgc3R5bGUKKyAgICAgKi8KKyAgICBJbmplY3RMaW5rLlN0eWxlIGdldExpbmtTdHlsZSgpOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsaW5rIHRlbXBsYXRlLCBlaXRoZXIgZGlyZWN0bHkgZnJvbSB0aGUgdmFsdWUoKSBvciBmcm9tIHRoZQorICAgICAqIEBQYXRoIG9mIHRoZSBjbGFzcyByZWZlcmVuY2VkIGluIHJlc291cmNlKCkKKyAgICAgKiBAcmV0dXJuIHRoZSBsaW5rIHRlbXBsYXRlCisgICAgICovCisgICAgU3RyaW5nIGdldExpbmtUZW1wbGF0ZShSZXNvdXJjZU1hcHBpbmdDb250ZXh0IHJtYyk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGJpbmRpbmcgYXMgYW4gRUwgZXhwcmVzc2lvbiBmb3IgYSBwYXJ0aWN1bGFyIFVSSSB0ZW1wbGF0ZSBwYXJhbWV0ZXIKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqIEByZXR1cm4gdGhlIEVMIGJpbmRpbmcKKyAgICAgKi8KKyAgICBTdHJpbmcgZ2V0QmluZGluZyhTdHJpbmcgbmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGNvbmRpdGlvbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBjb25kaXRpb24KKyAgICAgKi8KKyAgICBTdHJpbmcgZ2V0Q29uZGl0aW9uKCk7Cit9CmRpZmYgLS1naXQgYS9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xpbmtpbmcvSW5qZWN0TGlua0ZpZWxkRGVzY3JpcHRvci5qYXZhIGIvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL0luamVjdExpbmtGaWVsZERlc2NyaXB0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmUzNmY2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL0luamVjdExpbmtGaWVsZERlc2NyaXB0b3IuamF2YQpAQCAtMCwwICsxLDI0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5saW5raW5nOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworaW1wb3J0IGphdmF4LndzLnJzLkJlYW5QYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5IdHRwTWV0aG9kOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkxpbms7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5saW5raW5nLm1hcHBpbmcuUmVzb3VyY2VNYXBwaW5nQ29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuQW5ub3RhdGVkTWV0aG9kOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5NZXRob2RMaXN0OworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgZm9yIHdvcmtpbmcgd2l0aCB7QGxpbmsgSW5qZWN0TGlua30gYW5ub3RhdGVkIGZpZWxkcy4KKyAqCisgKiBAYXV0aG9yIE1hcmsgSGFkbGV5CisgKiBAYXV0aG9yIEdlcmFyZCBEYXZpc29uIChnZXJhcmQuZGF2aXNvbiBhdCBvcmFjbGUuY29tKQorICovCitjbGFzcyBJbmplY3RMaW5rRmllbGREZXNjcmlwdG9yIGV4dGVuZHMgRmllbGREZXNjcmlwdG9yIGltcGxlbWVudHMgSW5qZWN0TGlua0Rlc2NyaXB0b3IgeworCisgICAgcHJpdmF0ZSBJbmplY3RMaW5rIGxpbms7CisgICAgcHJpdmF0ZSBDbGFzczw/PiB0eXBlOworICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBiaW5kaW5nczsKKworICAgIC8qKgorICAgICAqIEMndG9yCisgICAgICoKKyAgICAgKiBAcGFyYW0gZiB0aGUgZmllbGQgdG8gaW5qZWN0CisgICAgICogQHBhcmFtIGwgdGhlIEluamVjdExpbmsgYW5ub3RhdGlvbgorICAgICAqIEBwYXJhbSB0IHRoZSBjbGFzcyB0aGF0IGNvbnRhaW5zIGZpZWxkIGYKKyAgICAgKi8KKyAgICBJbmplY3RMaW5rRmllbGREZXNjcmlwdG9yKEZpZWxkIGYsIEluamVjdExpbmsgbCwgQ2xhc3M8Pz4gdCkgeworICAgICAgICBzdXBlcihmKTsKKyAgICAgICAgbGluayA9IGw7CisgICAgICAgIHR5cGUgPSB0OworICAgICAgICBiaW5kaW5ncyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgZm9yIChCaW5kaW5nIGJpbmRpbmcgOiBsLmJpbmRpbmdzKCkpIHsKKyAgICAgICAgICAgIGJpbmRpbmdzLnB1dChiaW5kaW5nLm5hbWUoKSwgYmluZGluZy52YWx1ZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEluamVjdHMgdGhlIHVyaSBpbnRvIHRoZSBmaWVsZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbnN0YW5jZSB0aGUgdGFyZ2V0IGZvciB0aGUgaW5qZWN0aW9uCisgICAgICogQHBhcmFtIHVyaSB0aGUgdmFsdWUgdG8gaW5qZWN0CisgICAgICovCisgICAgdm9pZCBzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBpbnN0YW5jZSwgVVJJIHVyaSkgeworICAgICAgICBzZXRBY2Nlc3NpYmxlRmllbGQoZmllbGQpOworICAgICAgICB0cnkgeworCisgICAgICAgICAgICBPYmplY3QgdmFsdWU7CisgICAgICAgICAgICBpZiAoT2JqZWN0cy5lcXVhbHMoVVJJLmNsYXNzLCB0eXBlKSkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gdXJpOworICAgICAgICAgICAgfSBlbHNlIGlmIChMaW5rLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSkpIHsKKworICAgICAgICAgICAgICAgIC8vIE1ha2UgYSBsaW5rIHdpdGggdGhlIGNvcnJlY3QgYmluZGluZ3MKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IGdldExpbmsodXJpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoT2JqZWN0cy5lcXVhbHMoU3RyaW5nLmNsYXNzLCB0eXBlKSkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gdXJpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkZpZWxkIHR5cGUgIiArIHR5cGUgKyAiIG5vdCBvbmUgb2Ygc3VwcG9ydGVkIFN0cmluZyxVUkkgYW5kIExpbmsiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmllbGQuc2V0KGluc3RhbmNlLCB2YWx1ZSk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB8IElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoSW5qZWN0TGlua0ZpZWxkRGVzY3JpcHRvci5jbGFzcy5nZXROYW1lKCkpLmxvZyhMZXZlbC5TRVZFUkUsIG51bGwsIGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNpbXBsZSBkZWxlZ2F0ZSB0byB7QGxpbmsgSW5qZWN0TGluayNzdHlsZSgpfQorICAgICAqIEByZXR1cm4ge0BsaW5rIEluamVjdExpbmsjc3R5bGUoKX0KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSW5qZWN0TGluay5TdHlsZSBnZXRMaW5rU3R5bGUoKSB7CisgICAgICAgIHJldHVybiBsaW5rLnN0eWxlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdGVtcGxhdGUgYmFzZWQgb24gdGhlIHtAbGluayBSZXNvdXJjZU1hcHBpbmdDb250ZXh0fQorICAgICAqCisgICAgICogQHBhcmFtIHJtYyB0aGUgY29udGV4dAorICAgICAqIEByZXR1cm4gdGhlIGxpbmsgdGVtcGxhdGUKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldExpbmtUZW1wbGF0ZShSZXNvdXJjZU1hcHBpbmdDb250ZXh0IHJtYykgeworICAgICAgICByZXR1cm4gZ2V0TGlua1RlbXBsYXRlKHJtYywgbGluayk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0ZW1wbGF0ZSBiYXNlZCBvbiB0aGUge0BsaW5rIFJlc291cmNlTWFwcGluZ0NvbnRleHR9CisgICAgICoKKyAgICAgKiBAcGFyYW0gcm1jIHRoZSBjb250ZXh0CisgICAgICogQHBhcmFtIGxpbmsgdGhlIGxpbmsKKyAgICAgKiBAcmV0dXJuIHRoZSBsaW5rIHRlbXBsYXRlCisgICAgICovCisgICAgc3RhdGljIFN0cmluZyBnZXRMaW5rVGVtcGxhdGUoUmVzb3VyY2VNYXBwaW5nQ29udGV4dCBybWMsIEluamVjdExpbmsgbGluaykgeworICAgICAgICBTdHJpbmcgdGVtcGxhdGUgPSBudWxsOworICAgICAgICBpZiAoT2JqZWN0cy5lcXVhbHMobGluay5yZXNvdXJjZSgpLCBDbGFzcy5jbGFzcykpIHsKKyAgICAgICAgICAgIHRlbXBsYXRlID0gbGluay52YWx1ZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUmVzb3VyY2VNYXBwaW5nQ29udGV4dC5NYXBwaW5nIG1hcCA9IHJtYy5nZXRNYXBwaW5nKGxpbmsucmVzb3VyY2UoKSk7CisgICAgICAgICAgICBpZiAobWFwICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IG1hcC5nZXRUZW1wbGF0ZSgpLmdldFRlbXBsYXRlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGV4dHJhY3QgdGVtcGxhdGUgZnJvbSBzcGVjaWZpZWQgY2xhc3MnIEBQYXRoIGFubm90YXRpb24KKyAgICAgICAgICAgICAgICBQYXRoIHBhdGggPSBsaW5rLnJlc291cmNlKCkuZ2V0QW5ub3RhdGlvbihQYXRoLmNsYXNzKTsKKyAgICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IHBhdGggPT0gbnVsbCA/ICIiIDogcGF0aC52YWx1ZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBleHRyYWN0IHRlbXBsYXRlIGZyb20gc3BlY2lmaWVkIGNsYXNzJyBAUGF0aCBhbm5vdGF0aW9uCisgICAgICAgICAgICBpZiAoIWxpbmsubWV0aG9kKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgLy8gYXBwZW5kIHZhbHVlIG9mIG1ldGhvZCdzIEBQYXRoIGFubm90YXRpb24KKyAgICAgICAgICAgICAgICBNZXRob2RMaXN0IG1ldGhvZHMgPSBuZXcgTWV0aG9kTGlzdChsaW5rLnJlc291cmNlKCkpOworICAgICAgICAgICAgICAgIG1ldGhvZHMgPSBtZXRob2RzLndpdGhNZXRhQW5ub3RhdGlvbihIdHRwTWV0aG9kLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBmb3IgKEFubm90YXRlZE1ldGhvZCBtZXRob2QgOiBtZXRob2RzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghT2JqZWN0cy5lcXVhbHMobWV0aG9kLmdldE1ldGhvZCgpLmdldE5hbWUoKSwgbGluay5tZXRob2QoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKHRlbXBsYXRlKTsKKworICAgICAgICAgICAgICAgICAgICBQYXRoIG1ldGhvZFBhdGggPSBtZXRob2QuZ2V0QW5ub3RhdGlvbihQYXRoLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZFBhdGggIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1ldGhvZFRlbXBsYXRlID0gbWV0aG9kUGF0aC52YWx1ZSgpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0ZW1wbGF0ZS5lbmRzV2l0aCgiLyIpIHx8IG1ldGhvZFRlbXBsYXRlLnN0YXJ0c1dpdGgoIi8iKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgiLyIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQobWV0aG9kVGVtcGxhdGUpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHF1ZXJ5U3ViU3RyaW5nID0gZXh0cmFjdFF1ZXJ5UGFyYW1zKG1ldGhvZCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXJ5U3ViU3RyaW5nLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIns/Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChxdWVyeVN1YlN0cmluZyk7CisgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgifSIpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUgPSBidWlsZGVyLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0ZW1wbGF0ZTsKKyAgICB9CisKKyAgICBzdGF0aWMgU3RyaW5nQnVpbGRlciBleHRyYWN0UXVlcnlQYXJhbXMoQW5ub3RhdGVkTWV0aG9kIG1ldGhvZCkgdGhyb3dzIFNlY3VyaXR5RXhjZXB0aW9uIHsKKyAgICAgICAgLy8gYXBwZW5kIHF1ZXJ5IHBhcmFtZXRlcnMKKyAgICAgICAgU3RyaW5nQnVpbGRlciBxdWVyeVN1YlN0cmluZyA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGludCBwYXJhbWV0ZXJJbmRleCA9IDA7CisgICAgICAgIGZvciAoQW5ub3RhdGlvbltdIHBhcmFtQW5ucyA6IG1ldGhvZC5nZXRQYXJhbWV0ZXJBbm5vdGF0aW9ucygpKSB7CisgICAgICAgICAgICBmb3IgKEFubm90YXRpb24gYW5uIDogcGFyYW1Bbm5zKSB7CisgICAgICAgICAgICAgICAgaWYgKE9iamVjdHMuZXF1YWxzKGFubi5hbm5vdGF0aW9uVHlwZSgpLCBRdWVyeVBhcmFtLmNsYXNzKSkgeworICAgICAgICAgICAgICAgICAgICBxdWVyeVN1YlN0cmluZy5hcHBlbmQoKChRdWVyeVBhcmFtKSBhbm4pLnZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICBxdWVyeVN1YlN0cmluZy5hcHBlbmQoJywnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKE9iamVjdHMuZXF1YWxzKGFubi5hbm5vdGF0aW9uVHlwZSgpLCBCZWFuUGFyYW0uY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IGJlYW5QYXJhbVR5cGUgPSBtZXRob2QuZ2V0UGFyYW1ldGVyVHlwZXMoKVtwYXJhbWV0ZXJJbmRleF07CisgICAgICAgICAgICAgICAgICAgIEZpZWxkW10gZmllbGRzID0gYmVhblBhcmFtVHlwZS5nZXRGaWVsZHMoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChGaWVsZCBmaWVsZCA6IGZpZWxkcykgeworICAgICAgICAgICAgICAgICAgICAgICAgUXVlcnlQYXJhbSBxdWVyeVBhcmFtID0gZmllbGQuZ2V0QW5ub3RhdGlvbihRdWVyeVBhcmFtLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxdWVyeVBhcmFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVN1YlN0cmluZy5hcHBlbmQocXVlcnlQYXJhbS52YWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVN1YlN0cmluZy5hcHBlbmQoJywnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBNZXRob2RbXSBiZWFuTWV0aG9kcyA9IGJlYW5QYXJhbVR5cGUuZ2V0TWV0aG9kcygpOworICAgICAgICAgICAgICAgICAgICBmb3IgKE1ldGhvZCBiZWFuTWV0aG9kIDogYmVhbk1ldGhvZHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFF1ZXJ5UGFyYW0gcXVlcnlQYXJhbSA9IGJlYW5NZXRob2QuZ2V0QW5ub3RhdGlvbihRdWVyeVBhcmFtLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxdWVyeVBhcmFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVN1YlN0cmluZy5hcHBlbmQocXVlcnlQYXJhbS52YWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWVyeVN1YlN0cmluZy5hcHBlbmQoJywnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhcmFtZXRlckluZGV4Kys7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcXVlcnlTdWJTdHJpbmc7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGxpbmsgZnJvbSB1cmkgY29tYmluZWQgd2l0aCB7QGxpbmsgSW5qZWN0TGlua30uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdXJpIHVyaSBmb3IgdGhlIGxpbmsKKyAgICAgKiBAcmV0dXJuIExpbmsgaW5zdGFuY2UKKyAgICAgKi8KKyAgICBMaW5rIGdldExpbmsoVVJJIHVyaSkgeworICAgICAgICByZXR1cm4gSW5qZWN0TGluay5VdGlsLmJ1aWxkTGlua0Zyb21VcmkodXJpLCBsaW5rKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBiaW5kaW5nIGJ5IG5hbWUKKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIG5hbWUgb2YgdGhlIGJpbmRpbmcKKyAgICAgKiBAcmV0dXJuIHRoZSBiaW5kaW5nCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRCaW5kaW5nKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBiaW5kaW5ncy5nZXQobmFtZSk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjb25kaXRpb24gb2Yge0BsaW5rIEluamVjdExpbmt9LgorICAgICAqIEByZXR1cm4ge0BsaW5rIEluamVjdExpbmsjY29uZGl0aW9uKCl9CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb25kaXRpb24oKSB7CisgICAgICAgIHJldHVybiBsaW5rLmNvbmRpdGlvbigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2luY3ViYXRvci9kZWNsYXJhdGl2ZS1saW5raW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbGlua2luZy9JbmplY3RMaW5rTm9Gb2xsb3cuamF2YSBiL2luY3ViYXRvci9kZWNsYXJhdGl2ZS1saW5raW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbGlua2luZy9JbmplY3RMaW5rTm9Gb2xsb3cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjgzYzU2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL0luamVjdExpbmtOb0ZvbGxvdy5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubGlua2luZzsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LkJldGE7CisKKy8qKgorICogU3BlY2lmaWVzIG9uIGEgZmllbGQgdGhhdCBzaG91bGQgYmUgaWdub3JlZCBieSBMaW5rIHJlY3Vyc2l2ZSBpbnRyb3NwZWN0aW9uLgorICoKKyAqIEluIHNvbWUgc2NlbmFyaW9zIGxpa2Ugd2l0aCBmcmFtZXdvcmsgY29udGV4dHMgb3IgZm9yIG1vcmUgY29udHJvbCwKKyAqIGl0IGlzIG5vdCB3YW50ZWQgdG8gdHJ5IHRvIGZpbmQgbmVzdGVkIGxpbmtzIGludG8gZW50aXRpZXMgb3IgY29sbGVjdGlvbnMuCisgKgorICogQGF1dGhvciBBdXJlbGllbiBUaGllcmlvdAorICovCitAVGFyZ2V0KHtFbGVtZW50VHlwZS5GSUVMRCwgRWxlbWVudFR5cGUuVFlQRX0pCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorQEJldGEKK3B1YmxpYyBAaW50ZXJmYWNlIEluamVjdExpbmtOb0ZvbGxvdyB7CisKK30KZGlmZiAtLWdpdCBhL2luY3ViYXRvci9kZWNsYXJhdGl2ZS1saW5raW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbGlua2luZy9JbmplY3RMaW5rcy5qYXZhIGIvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL0luamVjdExpbmtzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI1NzUzNwotLS0gL2Rldi9udWxsCisrKyBiL2luY3ViYXRvci9kZWNsYXJhdGl2ZS1saW5raW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbGlua2luZy9JbmplY3RMaW5rcy5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubGlua2luZzsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuQmV0YTsKKworLyoqCisgKiBVc2VkIHRvIHJlcXVlc3QgdGhlIGFkZGl0aW9uIG9mIGEgc2V0IG9mIGxpbmtzLCBjYW4gYmUgdXNlZCBmb3IgYm90aAorICogbGluayBoZWFkZXJzIG9uIGEgQ2xhc3Mgb3IgaW5qZWN0aW9uIGludG8gYSBMaXN0PExpbms+IG9yIExpbmtbXSBwcm9wZXJ0eS4KKyAqCisgKiBAYXV0aG9yIE1hcmsgSGFkbGV5CisgKiBAYXV0aG9yIEdlcmFyZCBEYXZpc29uIChnZXJhcmQuZGF2aXNvbiBhdCBvcmFjbGUuY29tKQorICovCitAVGFyZ2V0KHtFbGVtZW50VHlwZS5UWVBFLCBFbGVtZW50VHlwZS5GSUVMRH0pCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorQEJldGEKK3B1YmxpYyBAaW50ZXJmYWNlIEluamVjdExpbmtzIHsKKworICAgIC8qKgorICAgICAqIENvbnRhaW5lciBmb3IgYSBzZXQgb2Yge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmxpbmtpbmcuSW5qZWN0TGlua30gYW5ub3RhdGlvbnMKKyAgICAgKiBAcmV0dXJuIGFycmF5IG9mIHtAY29kZSBJbmplY3RMaW5rfSBlbGVtZW50cworICAgICAqLworICAgIEluamVjdExpbmtbXSB2YWx1ZSgpIGRlZmF1bHQge307CisKK30KZGlmZiAtLWdpdCBhL2luY3ViYXRvci9kZWNsYXJhdGl2ZS1saW5raW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbGlua2luZy9JbmplY3RMaW5rc0ZpZWxkRGVzY3JpcHRvci5qYXZhIGIvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL0luamVjdExpbmtzRmllbGREZXNjcmlwdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y0OTI1YwotLS0gL2Rldi9udWxsCisrKyBiL2luY3ViYXRvci9kZWNsYXJhdGl2ZS1saW5raW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbGlua2luZy9JbmplY3RMaW5rc0ZpZWxkRGVzY3JpcHRvci5qYXZhCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lmxpbmtpbmc7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5MaW5rOworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgZm9yIHdvcmtpbmcgd2l0aCB7QGxpbmsgSW5qZWN0TGlua3N9IGFubm90YXRlZCBmaWVsZHMuCisgKgorICogQGF1dGhvciBNYXJrIEhhZGxleQorICogQGF1dGhvciBHZXJhcmQgRGF2aXNvbiAoZ2VyYXJkLmRhdmlzb24gYXQgb3JhY2xlLmNvbSkKKyAqLworY2xhc3MgSW5qZWN0TGlua3NGaWVsZERlc2NyaXB0b3IgZXh0ZW5kcyBGaWVsZERlc2NyaXB0b3IgeworCisgICAgcHJpdmF0ZSBmaW5hbCBJbmplY3RMaW5rcyBsaW5rOworICAgIHByaXZhdGUgZmluYWwgQ2xhc3M8Pz4gdHlwZTsKKworICAgIC8qKgorICAgICAqIEMndG9yCisgICAgICoKKyAgICAgKiBAcGFyYW0gZiB0aGUgZmllbGQgdG8gaW5qZWN0CisgICAgICogQHBhcmFtIGwgdGhlIEluamVjdExpbmtzIGFubm90YXRpb24KKyAgICAgKiBAcGFyYW0gdCB0aGUgY2xhc3MgdGhhdCBjb250YWlucyBmaWVsZCBmCisgICAgICovCisgICAgSW5qZWN0TGlua3NGaWVsZERlc2NyaXB0b3IoRmllbGQgZiwgSW5qZWN0TGlua3MgbCwgQ2xhc3M8Pz4gdCkgeworICAgICAgICBzdXBlcihmKTsKKyAgICAgICAgbGluayA9IGw7CisgICAgICAgIHR5cGUgPSB0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEluamVjdHMgdGhlIExpbmsgbGlzdCBpbnRvIHRoZSBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIElmIHRoZSBmaWVsZCBpcyB7QGNvZGUgbnVsbH0gdGhlbiBpdCBpcyByZXBsYWNlZCB3aXRoIHRoZSBsaXN0LgorICAgICAqIElmIHRoZSBmaWVsZCBhbHJlYWR5IGNvbnRhaW5zIGxpbmtzLCB0aGVuIHRoZSBjb250ZW50IGlzIG1lcmdlZAorICAgICAqIHdpdGggdGhpcyBsaXN0IGludG8gYSBuZXcgbGlzdCBhbmQgaW5qZWN0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5zdGFuY2UgdGhlIGluc3RhbmNlIHRoYXQgY29udGFpbnMgdGhlIGZpZWxkIGYKKyAgICAgKiBAcGFyYW0gbGlzdCB0aGUgbGlzdCBvZiBsaW5rcyB0byBpbmplY3QKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVZhbHVlKE9iamVjdCBpbnN0YW5jZSwgTGlzdDxMaW5rPiBsaXN0KSB7CisgICAgICAgIHNldEFjY2Vzc2libGVGaWVsZChmaWVsZCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBMaXN0PExpbms+IG1lcmdlZCA9IG1lcmdlV2l0aEV4aXN0aW5nRmllbGQoaW5zdGFuY2UsIGxpc3QpOworCisgICAgICAgICAgICBPYmplY3QgdmFsdWU7CisgICAgICAgICAgICBpZiAoT2JqZWN0cy5lcXVhbHMoTGlzdC5jbGFzcywgdHlwZSkpIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IG1lcmdlZDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZS5pc0FycmF5KCkpIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IG1lcmdlZC50b0FycmF5KChPYmplY3RbXSkgQXJyYXkubmV3SW5zdGFuY2UodHlwZS5nZXRDb21wb25lbnRUeXBlKCksIG1lcmdlZC5zaXplKCkpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRmllbGQgdHlwZSAiICsgdHlwZSArICIgbm90IG9uZSBvZiBzdXBwb3J0ZWQgTGlzdDxMaW5rPiBvciBMaW5rW10iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmllbGQuc2V0KGluc3RhbmNlLCB2YWx1ZSk7CisKKworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gfCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKEluamVjdExpbmtzRmllbGREZXNjcmlwdG9yLmNsYXNzLmdldE5hbWUoKSkubG9nKExldmVsLlNFVkVSRSwgbnVsbCwgZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBMaXN0PExpbms+IG1lcmdlV2l0aEV4aXN0aW5nRmllbGQoT2JqZWN0IGluc3RhbmNlLCBMaXN0PExpbms+IGxpc3QpIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKKyAgICAgICAgT2JqZWN0IGV4aXN0aW5nID0gZmllbGQuZ2V0KGluc3RhbmNlKTsKKyAgICAgICAgaWYgKGV4aXN0aW5nICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChDb2xsZWN0aW9uLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oZXhpc3RpbmcuZ2V0Q2xhc3MoKSkgJiYgISgoQ29sbGVjdGlvbikgZXhpc3RpbmcpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIExpc3Q8TGluaz4gbWVyZ2VkICA9IG5ldyBBcnJheUxpc3Q8PihsaXN0KTsKKyAgICAgICAgICAgICAgICBtZXJnZWQuYWRkQWxsKChDb2xsZWN0aW9uPExpbms+KSBleGlzdGluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1lcmdlZDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZXhpc3RpbmcuZ2V0Q2xhc3MoKS5pc0FycmF5KCkgJiYgZXhpc3RpbmcuZ2V0Q2xhc3MoKS5pc0Fzc2lnbmFibGVGcm9tKExpbmtbXS5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICBMaXN0PExpbms+IG1lcmdlZCA9IG5ldyBBcnJheUxpc3Q8PihsaXN0KTsKKyAgICAgICAgICAgICAgICBtZXJnZWQuYWRkQWxsKEFycmF5cy5hc0xpc3QoKExpbmtbXSkgZXhpc3RpbmcpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbWVyZ2VkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBsaXN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMge0BsaW5rIEluamVjdExpbmtGaWVsZERlc2NyaXB0b3J9IGZvciBlYWNoIGxpbmsgdG8gaW5qZWN0LgorICAgICAqLworICAgIEluamVjdExpbmtGaWVsZERlc2NyaXB0b3JbXSBnZXRMaW5rc1RvSW5qZWN0KCkgeworICAgICAgICBmaW5hbCBJbmplY3RMaW5rW10gbGlzdE9mTGlua3MgPSBsaW5rLnZhbHVlKCk7CisgICAgICAgIEluamVjdExpbmtGaWVsZERlc2NyaXB0b3JbXSBmaWVsZHMgPSBuZXcgSW5qZWN0TGlua0ZpZWxkRGVzY3JpcHRvcltsaXN0T2ZMaW5rcy5sZW5ndGhdOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgZmllbGRzW2ldID0gbmV3IEluamVjdExpbmtGaWVsZERlc2NyaXB0b3IoZmllbGQsIGxpc3RPZkxpbmtzW2ldLCBMaW5rLmNsYXNzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmllbGRzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2luY3ViYXRvci9kZWNsYXJhdGl2ZS1saW5raW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbGlua2luZy9MaW5rRUxDb250ZXh0LmphdmEgYi9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xpbmtpbmcvTGlua0VMQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZjk5MTYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xpbmtpbmcvTGlua0VMQ29udGV4dC5qYXZhCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubGlua2luZzsKKworaW1wb3J0IGphdmF4LmVsLkJlYW5FTFJlc29sdmVyOworaW1wb3J0IGphdmF4LmVsLkNvbXBvc2l0ZUVMUmVzb2x2ZXI7CitpbXBvcnQgamF2YXguZWwuRUxDb250ZXh0OworaW1wb3J0IGphdmF4LmVsLkVMUmVzb2x2ZXI7CitpbXBvcnQgamF2YXguZWwuRnVuY3Rpb25NYXBwZXI7CitpbXBvcnQgamF2YXguZWwuVmFyaWFibGVNYXBwZXI7CisKKy8qKgorICogQW4gRUxDb250ZXh0IHRoYXQgZW5jYXBzdWxhdGVzIHRoZSByZXNwb25zZSBpbmZvcm1hdGlvbiBmb3IgdXNlIGJ5IHRoZQorICogZXhwcmVzc2lvbiBldmFsdWF0b3IuCisgKgorICogQGF1dGhvciBNYXJrIEhhZGxleQorICogQGF1dGhvciBHZXJhcmQgRGF2aXNvbiAoZ2VyYXJkLmRhdmlzb24gYXQgb3JhY2xlLmNvbSkKKyAqLworY2xhc3MgTGlua0VMQ29udGV4dCBleHRlbmRzIEVMQ29udGV4dCB7CisKKyAgICBwcml2YXRlIE9iamVjdCBlbnRpdHk7CisgICAgcHJpdmF0ZSBPYmplY3QgcmVzb3VyY2U7CisgICAgcHJpdmF0ZSBPYmplY3QgaW5zdGFuY2U7CisKKyAgICAvKioKKyAgICAgKiBDb252ZW5pZW5jZSBjb25zdHJ1Y3RvciBmb3IgdGhlIGNvbW1vbiBjYXNlIHdoZXJlIGEgY29udGV4dCB3aGVyZQorICAgICAqIHRoZSBlbnRpdHkgYW5kIGluc3RhbmNlIGFyZSB0aGUgc2FtZS4gRXF1aXZhbGVudCB0bworICAgICAqIHtAbGluayAjTGlua0VMQ29udGV4dChPYmplY3QsIE9iamVjdCwgT2JqZWN0KX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW50aXR5CisgICAgICogQHBhcmFtIHJlc291cmNlCisgICAgICovCisgICAgTGlua0VMQ29udGV4dChPYmplY3QgZW50aXR5LCBPYmplY3QgcmVzb3VyY2UpIHsKKyAgICAgICAgdGhpcy5lbnRpdHkgPSBlbnRpdHk7CisgICAgICAgIHRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsKKyAgICAgICAgdGhpcy5pbnN0YW5jZSA9IGVudGl0eTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgY29udGV4dAorICAgICAqIEBwYXJhbSBlbnRpdHkgdGhlIGVudGl0eSByZXR1cm5lZCBmcm9tIHRoZSByZXNvdXJjZSBtZXRob2QKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgdGhlIHJlc291cmNlIGNsYXNzIGluc3RhbmNlIHRoYXQgcmV0dXJuZWQgdGhlIGVudGl0eQorICAgICAqIEBwYXJhbSBpbnN0YW5jZSB0aGUgaW5zdGFuY2UgdGhhdCBjb250YWlucyB0aGUgZW50aXR5LCBlLmcuIHRoZSB2YWx1ZSBvZgorICAgICAqIGEgZmllbGQgd2l0aGluIGFuIGVudGl0eSBjbGFzcy4KKyAgICAgKi8KKyAgICBMaW5rRUxDb250ZXh0KE9iamVjdCBlbnRpdHksIE9iamVjdCByZXNvdXJjZSwgT2JqZWN0IGluc3RhbmNlKSB7CisgICAgICAgIHRoaXMuZW50aXR5ID0gZW50aXR5OworICAgICAgICB0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7CisgICAgICAgIHRoaXMuaW5zdGFuY2UgPSBpbnN0YW5jZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRUxSZXNvbHZlciBnZXRFTFJlc29sdmVyKCkgeworICAgICAgICBDb21wb3NpdGVFTFJlc29sdmVyIHJlc29sdmVyID0gbmV3IENvbXBvc2l0ZUVMUmVzb2x2ZXIoKTsKKyAgICAgICAgcmVzb2x2ZXIuYWRkKG5ldyBSZXNwb25zZUNvbnRleHRSZXNvbHZlcihlbnRpdHksIHJlc291cmNlLCBpbnN0YW5jZSkpOworICAgICAgICByZXNvbHZlci5hZGQobmV3IEJlYW5FTFJlc29sdmVyKHRydWUpKTsKKyAgICAgICAgcmV0dXJuIHJlc29sdmVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBGdW5jdGlvbk1hcHBlciBnZXRGdW5jdGlvbk1hcHBlcigpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFZhcmlhYmxlTWFwcGVyIGdldFZhcmlhYmxlTWFwcGVyKCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2luY3ViYXRvci9kZWNsYXJhdGl2ZS1saW5raW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbGlua2luZy9MaW5rSGVhZGVyRGVzY3JpcHRvci5qYXZhIGIvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL0xpbmtIZWFkZXJEZXNjcmlwdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U2MjFhZAotLS0gL2Rldi9udWxsCisrKyBiL2luY3ViYXRvci9kZWNsYXJhdGl2ZS1saW5raW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbGlua2luZy9MaW5rSGVhZGVyRGVzY3JpcHRvci5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubGlua2luZzsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5saW5raW5nLkluamVjdExpbmsuU3R5bGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubGlua2luZy5tYXBwaW5nLlJlc291cmNlTWFwcGluZ0NvbnRleHQ7CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyBmb3Igd29ya2luZyB3aXRoIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5saW5raW5nLkluamVjdExpbmt9IGFubm90YXRpb25zLgorICoKKyAqIEBhdXRob3IgTWFyayBIYWRsZXkKKyAqIEBhdXRob3IgR2VyYXJkIERhdmlzb24gKGdlcmFyZC5kYXZpc29uIGF0IG9yYWNsZS5jb20pCisgKi8KK2NsYXNzIExpbmtIZWFkZXJEZXNjcmlwdG9yIGltcGxlbWVudHMgSW5qZWN0TGlua0Rlc2NyaXB0b3IgeworCisgICAgcHJpdmF0ZSBJbmplY3RMaW5rIGxpbmtIZWFkZXI7CisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGJpbmRpbmdzOworCisgICAgTGlua0hlYWRlckRlc2NyaXB0b3IoSW5qZWN0TGluayBsaW5rSGVhZGVyKSB7CisgICAgICAgIHRoaXMubGlua0hlYWRlciA9IGxpbmtIZWFkZXI7CisgICAgICAgIGJpbmRpbmdzID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBmb3IgKEJpbmRpbmcgYmluZGluZyA6IGxpbmtIZWFkZXIuYmluZGluZ3MoKSkgeworICAgICAgICAgICAgYmluZGluZ3MucHV0KGJpbmRpbmcubmFtZSgpLCBiaW5kaW5nLnZhbHVlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgSW5qZWN0TGluayBnZXRMaW5rSGVhZGVyKCkgeworICAgICAgICByZXR1cm4gbGlua0hlYWRlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldExpbmtUZW1wbGF0ZShSZXNvdXJjZU1hcHBpbmdDb250ZXh0IHJtYykgeworICAgICAgICByZXR1cm4gSW5qZWN0TGlua0ZpZWxkRGVzY3JpcHRvci5nZXRMaW5rVGVtcGxhdGUocm1jLCBsaW5rSGVhZGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3R5bGUgZ2V0TGlua1N0eWxlKCkgeworICAgICAgICByZXR1cm4gbGlua0hlYWRlci5zdHlsZSgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QmluZGluZyhTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gYmluZGluZ3MuZ2V0KG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29uZGl0aW9uKCkgeworICAgICAgICByZXR1cm4gbGlua0hlYWRlci5jb25kaXRpb24oKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2luY3ViYXRvci9kZWNsYXJhdGl2ZS1saW5raW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbGlua2luZy9MaW5rTWVzc2FnZXMuamF2YSBiL2luY3ViYXRvci9kZWNsYXJhdGl2ZS1saW5raW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbGlua2luZy9MaW5rTWVzc2FnZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGZhZTk1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL0xpbmtNZXNzYWdlcy5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubGlua2luZzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmwxMG4uTG9jYWxpemFibGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwubDEwbi5Mb2NhbGl6YWJsZU1lc3NhZ2VGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmwxMG4uTG9jYWxpemVyOworCisvKioKKyAqIE1lc3NhZ2UgZm9yIGRlY2xhcmF0aXZlIGxpbmtpbmcKKyAqCisgKiBAYXV0aG9yIE1hcmsgSGFkbGV5CisgKiBAYXV0aG9yIEdlcmFyZCBEYXZpc29uIChnZXJhcmQuZGF2aXNvbiBhdCBvcmFjbGUuY29tKQorICovCitjbGFzcyBMaW5rTWVzc2FnZXMgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9jYWxpemFibGVNZXNzYWdlRmFjdG9yeSBtZXNzYWdlRmFjdG9yeSA9IG5ldyBMb2NhbGl6YWJsZU1lc3NhZ2VGYWN0b3J5KAorICAgICAgICAgICAgIm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLmxpbmtpbmcuaW50ZXJuYWwiKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2NhbGl6ZXIgbG9jYWxpemVyID0gbmV3IExvY2FsaXplcigpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9jYWxpemFibGUgbG9jYWxpemFibGVXQVJOSU5HX0xJTktGSUxURVJfUFJPQ0VTU0lORyhPYmplY3QgYXJnMCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZUZhY3RvcnkuZ2V0TWVzc2FnZSgid2FybmluZy5saW5rZmlsdGVyLnByb2Nlc3NpbmciLCBhcmcwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMaW5rRmlsdGVyIGNhbm5vdCBwcm9jZXNzIGNsYXNzIHswfSwgZXhjZXB0aW9uIG9jY3VycmVkIGR1cmluZyBwcm9jZXNzaW5nLiBDbGFzcyB3aWxsIGJlIGlnbm9yZWQgaW4gdGhlIExpbmtGaWx0ZXIuCisgICAgICoKKyAgICAgKi8KKyAgICBzdGF0aWMgU3RyaW5nIFdBUk5JTkdfTElOS0ZJTFRFUl9QUk9DRVNTSU5HKE9iamVjdCBhcmcwKSB7CisgICAgICAgIHJldHVybiBsb2NhbGl6ZXIubG9jYWxpemUobG9jYWxpemFibGVXQVJOSU5HX0xJTktGSUxURVJfUFJPQ0VTU0lORyhhcmcwKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL1Byb3ZpZGVMaW5rLmphdmEgYi9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xpbmtpbmcvUHJvdmlkZUxpbmsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzAwYmEwCi0tLSAvZGV2L251bGwKKysrIGIvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL1Byb3ZpZGVMaW5rLmphdmEKQEAgLTAsMCArMSwxODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubGlua2luZzsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJlcGVhdGFibGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CitpbXBvcnQgamF2YS5uZXQuVVJJOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5MaW5rOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuQmV0YTsKKworLyoqCisgKiBVc2UgdGhpcyBvbiByZXNvdXJjZSBtZXRob2RzIHRvIGNvbnRyaWJ1dGUgbGlua3MgdG8gYSByZXByZXNlbnRhdGlvbi4KKyAqCisgKiBJdCBpcyB0aGUgaW52ZXJzZSBvZiB7QGxpbmsgSW5qZWN0TGlua30gaW5zdGVhZCBvZiBhbm5vdGF0aW5nIHRoZSB0YXJnZXQgeW91IGFubm90YXRlIHRoZSBzb3VyY2Ugb2YgdGhlIGxpbmtzLgorICogVGhlIGFkZGVkIGJlbmVmaXQgaXMgdGhhdCBzaW5jZSB5b3UgYW5ub3RhdGUgdGhlIG1ldGhvZCB5b3UgZG9uJ3QgbmVlZCB0byBzcGVjaWZ5IHRoZSBwYXRoIHRvIGl0LgorICoKKyAqIDxwPgorICogPHByZT4KKyAqICYjNjQ7UHJvdmlkZUxpbmsodmFsdWUgPSBPcmRlci5jbGFzcywgcmVsID0gInNlbGYiLCBiaW5kaW5ncyA9IEBCaW5kaW5nKG5hbWUgPSAib3JkZXJJZCIsIHZhbHVlID0gIiR7aW5zdGFuY2UuaWR9IikpCisgKiAmIzY0O1Byb3ZpZGVMaW5rKHZhbHVlID0gUGF5bWVudENvbmZpcm1hdGlvbi5jbGFzcywgcmVsID0gIm9yZGVyIiwKKyAqICAgICAgICAgICAgICAgICAgYmluZGluZ3MgPSBAQmluZGluZyhuYW1lID0gIm9yZGVySWQiLCB2YWx1ZSA9ICIke2luc3RhbmNlLm9yZGVySWR9IikpCisgKiBwdWJsaWMgUmVzcG9uc2UgZ2V0KEBQYXRoUGFyYW0oIm9yZGVySWQiKSBTdHJpbmcgb3JkZXJJZCkgeyAuLi4KKyAqIDwvcHJlPgorICogPC9wPgorICoKKyAqIEl0IGNhbiBhbHNvIGJlIHVzZWQgYXMgYSBtZXRhIGFubm90YXRpb24sIHNlZSB0aGUgSmF2YWRvYyBvZiB7QGxpbmsgSW5oZXJpdEZyb21Bbm5vdGF0aW9ufSBmb3IgZGV0YWlscy4KKyAqCisgKiBAYXV0aG9yIExlb25hcmQgQnLDvG5pbmdzCisgKi8KK0BUYXJnZXQoeyBFbGVtZW50VHlwZS5NRVRIT0QsIEVsZW1lbnRUeXBlLlRZUEV9KQorQFJlcGVhdGFibGUoUHJvdmlkZUxpbmtzLmNsYXNzKQorQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BCZXRhCitwdWJsaWMgQGludGVyZmFjZSBQcm92aWRlTGluayB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgc3R5bGUgb2YgVVJJIHRvIGluamVjdAorICAgICAqLworICAgIEluamVjdExpbmsuU3R5bGUgc3R5bGUoKSBkZWZhdWx0IEluamVjdExpbmsuU3R5bGUuQUJTT0xVVEVfUEFUSDsKKworICAgIC8qKgorICAgICAqIFByb3ZpZGUgbGlua3MgZm9yIHJlcHJlc2VudGF0aW9uIGNsYXNzZXMgbGlzdGVkIGhlcmUuCisgICAgICoKKyAgICAgKiBNYXkgdXNlIHtAbGluayBJbmhlcml0RnJvbUFubm90YXRpb259IGZvciBNZXRhLUFubm90YXRpb25zCisgICAgICovCisgICAgQ2xhc3M8Pz5bXSB2YWx1ZSgpOworCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIHRoZSBiaW5kaW5ncyBmb3IgZW1iZWRkZWQgVVJJIHRlbXBsYXRlIHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiBAc2VlIEJpbmRpbmcKKyAgICAgKi8KKyAgICBCaW5kaW5nW10gYmluZGluZ3MoKSBkZWZhdWx0IHt9OworCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIGEgYm9vbGVhbiBFTCBleHByZXNzaW9uIHdob3NlIHZhbHVlIGRldGVybWluZXMgd2hldGhlciBhIFJlZiBpcworICAgICAqIHNldCAodHJ1ZSkgb3Igbm90IChmYWxzZSkuIE9taXNzaW9uIG9mIGEgY29uZGl0aW9uIHdpbGwgYWx3YXlzIGluc2VydCBhCisgICAgICogcmVmLgorICAgICAqLworICAgIFN0cmluZyBjb25kaXRpb24oKSBkZWZhdWx0ICIiOworCisgICAgLy8KKyAgICAvLyBMaW5rIHByb3BlcnRpZXMKKyAgICAvLworCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIHRoZSByZWxhdGlvbnNoaXAuCisgICAgICovCisgICAgU3RyaW5nIHJlbCgpIGRlZmF1bHQgIiI7CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgdGhlIHJldmVyc2UgcmVsYXRpb25zaGlwLgorICAgICAqLworICAgIFN0cmluZyByZXYoKSBkZWZhdWx0ICIiOworCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIHRoZSBtZWRpYSB0eXBlLgorICAgICAqLworICAgIFN0cmluZyB0eXBlKCkgZGVmYXVsdCAiIjsKKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB0aGUgdGl0bGUuCisgICAgICovCisgICAgU3RyaW5nIHRpdGxlKCkgZGVmYXVsdCAiIjsKKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB0aGUgYW5jaG9yCisgICAgICovCisgICAgU3RyaW5nIGFuY2hvcigpIGRlZmF1bHQgIiI7CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgdGhlIG1lZGlhCisgICAgICovCisgICAgU3RyaW5nIG1lZGlhKCkgZGVmYXVsdCAiIjsKKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB0aGUgbGFuZyBvZiB0aGUgcmVmZXJlbmNlZCByZXNvdXJjZQorICAgICAqLworICAgIFN0cmluZyBocmVmbGFuZygpIGRlZmF1bHQgIiI7CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgZXh0ZW5zaW9uIHBhcmFtZXRlcnMgYXMgbmFtZS12YWx1ZSBwYWlycy4KKyAgICAgKi8KKyAgICBJbmplY3RMaW5rLkV4dGVuc2lvbltdIGV4dGVuc2lvbnMoKSBkZWZhdWx0IHt9OworCisKKyAgICBjbGFzcyBVdGlsIHsKKworICAgICAgICBzdGF0aWMgTGluayBidWlsZExpbmtGcm9tVXJpKFVSSSB1cmksIFByb3ZpZGVMaW5rIGxpbmspIHsKKworICAgICAgICAgICAgamF2YXgud3MucnMuY29yZS5MaW5rLkJ1aWxkZXIgYnVpbGRlciA9IGphdmF4LndzLnJzLmNvcmUuTGluay5mcm9tVXJpKHVyaSk7CisgICAgICAgICAgICBpZiAoIWxpbmsucmVsKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgYnVpbGRlciA9IGJ1aWxkZXIucmVsKGxpbmsucmVsKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFsaW5rLnJldigpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBidWlsZGVyLnBhcmFtKCJyZXYiLCBsaW5rLnJldigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbGluay50eXBlKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgYnVpbGRlciA9IGJ1aWxkZXIudHlwZShsaW5rLnR5cGUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWxpbmsudGl0bGUoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyID0gYnVpbGRlci5wYXJhbSgidGl0bGUiLCBsaW5rLnRpdGxlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFsaW5rLmFuY2hvcigpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBidWlsZGVyLnBhcmFtKCJhbmNob3IiLCBsaW5rLmFuY2hvcigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbGluay5tZWRpYSgpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBidWlsZGVyLnBhcmFtKCJtZWRpYSIsIGxpbmsubWVkaWEoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWxpbmsuaHJlZmxhbmcoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyID0gYnVpbGRlci5wYXJhbSgiaHJlZmxhbmciLCBsaW5rLmhyZWZsYW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChJbmplY3RMaW5rLkV4dGVuc2lvbiBleHQgOiBsaW5rLmV4dGVuc2lvbnMoKSkgeworICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBidWlsZGVyLnBhcmFtKGV4dC5uYW1lKCksIGV4dC52YWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWFsIGludGVyZmFjZSB0byBpbmRpY2F0ZSB0aGF0IHRoZSB0YXJnZXQgc2hvdWxkIGJlIGluaGVyaXRlZCBmcm9tIHRoZSBhbm5vdGF0ZWQgYW5ub3RhdGlvbi4KKyAgICAgKiA8cD4KKyAgICAgKiA8cHJlPgorICAgICAqICYjNjQ7UHJvdmlkZUxpbmtzKHsKKyAgICAgKiAgICYjNjQ7UHJvdmlkZUxpbmsodmFsdWUgPSBQcm92aWRlTGluay5Jbmhlcml0RnJvbUFubm90YXRpb24uY2xhc3MsIHJlbCA9ICJuZXh0IiwgYmluZGluZ3MgPSB7CisgICAgICogICAgICAgJiM2NDtCaW5kaW5nKG5hbWUgPSAicGFnZSIsIHZhbHVlID0gIiR7aW5zdGFuY2UubnVtYmVyICsgMX0iKSwKKyAgICAgKiAgICAgICAmIzY0O0JpbmRpbmcobmFtZSA9JiM2NDsgInNpemUiLCB2YWx1ZSA9ICIke2luc3RhbmNlLnNpemV9IiksCisgICAgICogICAgIH0sCisgICAgICogICAgIGNvbmRpdGlvbiA9ICIke2luc3RhbmNlLm5leHRQYWdlQXZhaWxhYmxlfSIpLAorICAgICAqICAgJiM2NDtQcm92aWRlTGluayh2YWx1ZSA9IFByb3ZpZGVMaW5rLkluaGVyaXRGcm9tQW5ub3RhdGlvbi5jbGFzcywgcmVsID0gInByZXYiLCBiaW5kaW5ncyA9IHsKKyAgICAgKiAgICAgICAmIzY0O0JpbmRpbmcobmFtZSA9ICJwYWdlIiwgdmFsdWUgPSAiJHtpbnN0YW5jZS5udW1iZXIgLSAxfSIpLAorICAgICAqICAgICAgICYjNjQ7QmluZGluZyhuYW1lID0gInNpemUiLCB2YWx1ZSA9ICIke2luc3RhbmNlLnNpemV9IiksCisgICAgICogICAgIH0sCisgICAgICogICAgIGNvbmRpdGlvbiA9ICIke2luc3RhbmNlLnByZXZpb3VzUGFnZUF2YWlsYWJsZX0iKQorICAgICAqIH0pCisgICAgICogJiM2NDtUYXJnZXQoe0VsZW1lbnRUeXBlLk1FVEhPRH0pCisgICAgICogJiM2NDtSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCisgICAgICogJiM2NDtEb2N1bWVudGVkCisgICAgICogcHVibGljICYjNjQ7aW50ZXJmYWNlIFBhZ2VMaW5rcyB7CisgICAgICogQ2xhc3M8Pz4gdmFsdWUoKTsKKyAgICAgKiB9CisgICAgICogPC9wcmU+CisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIEluIHRoaXMgY2FzZSB0aGUgdmFsdWUgb2YgZWFjaCB7QGxpbmsgUHJvdmlkZUxpbmt9IHdpbGwgYmUgdGhlIHNhbWUgYXMge0Bjb2RlIFBhZ2VMaW5rc30gdmFsdWUuCisgICAgICogPC9wPgorICAgICAqLworICAgIGludGVyZmFjZSBJbmhlcml0RnJvbUFubm90YXRpb257fQorfQpkaWZmIC0tZ2l0IGEvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL1Byb3ZpZGVMaW5rRGVzY3JpcHRvci5qYXZhIGIvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL1Byb3ZpZGVMaW5rRGVzY3JpcHRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YjYzNTYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xpbmtpbmcvUHJvdmlkZUxpbmtEZXNjcmlwdG9yLmphdmEKQEAgLTAsMCArMSwxNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubGlua2luZzsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTGluazsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxpbmtpbmcubWFwcGluZy5SZXNvdXJjZU1hcHBpbmdDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5Bbm5vdGF0ZWRNZXRob2Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTWV0aG9kOworCisvKioKKyAqIFV0aWxpdHkgdG8gd29yayB3aXRoIHtAbGluayBQcm92aWRlTGlua30gYW5ub3RhdGlvbnMuCisgKgorICogQGF1dGhvciBMZW9uYXJkIEJyw7xuaW5ncworICovCitwdWJsaWMgY2xhc3MgUHJvdmlkZUxpbmtEZXNjcmlwdG9yIGltcGxlbWVudHMgSW5qZWN0TGlua0Rlc2NyaXB0b3IgeworICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZUxpbmsgcHJvdmlkZUxpbms7CisgICAgcHJpdmF0ZSBmaW5hbCBSZXNvdXJjZU1ldGhvZCByZXNvdXJjZTsKKworICAgIHByaXZhdGUgZmluYWwgQW5ub3RhdGlvbiBwYXJlbnRBbm5vdGF0aW9uOworCisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IGJpbmRpbmdzOworCisgICAgLyoqCisgICAgICogYyd0b3IKKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZSB0aGUgYW5ub3RhdGVkIHJlc291cmNlIG1ldGhvZAorICAgICAqIEBwYXJhbSBwcm92aWRlTGluayB0aGUgYW5ub3RhaW9uCisgICAgICogQHBhcmFtIHBhcmVudEFubm90YXRpb24gdGhlIHBhcmVudCBhbm5vdGF0aW9uIGlmIHByZXNlbnQgb3Ige0Bjb2RlIG51bGx9CisgICAgICovCisgICAgcHVibGljIFByb3ZpZGVMaW5rRGVzY3JpcHRvcihSZXNvdXJjZU1ldGhvZCByZXNvdXJjZSwgUHJvdmlkZUxpbmsgcHJvdmlkZUxpbmssIEFubm90YXRpb24gcGFyZW50QW5ub3RhdGlvbikgeworICAgICAgICB0aGlzLnByb3ZpZGVMaW5rID0gcHJvdmlkZUxpbms7CisgICAgICAgIHRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsKKyAgICAgICAgdGhpcy5wYXJlbnRBbm5vdGF0aW9uID0gcGFyZW50QW5ub3RhdGlvbjsKKyAgICAgICAgYmluZGluZ3MgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIGZvciAoQmluZGluZyBiaW5kaW5nIDogcHJvdmlkZUxpbmsuYmluZGluZ3MoKSkgeworICAgICAgICAgICAgYmluZGluZ3MucHV0KGJpbmRpbmcubmFtZSgpLCBiaW5kaW5nLnZhbHVlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiB0aGUgYW5ub3RhdGlvbgorICAgICAqLworICAgIHB1YmxpYyBQcm92aWRlTGluayBnZXRQcm92aWRlTGluaygpIHsKKyAgICAgICAgcmV0dXJuIHByb3ZpZGVMaW5rOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIGFubm90YXRlZCByZXNvdXJjZSBtZXRob2QKKyAgICAgKi8KKyAgICBwdWJsaWMgUmVzb3VyY2VNZXRob2QgZ2V0UmVzb3VyY2UoKSB7CisgICAgICAgIHJldHVybiByZXNvdXJjZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHN0eWxlCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBzdHlsZQorICAgICAqLworICAgIHB1YmxpYyBJbmplY3RMaW5rLlN0eWxlIGdldExpbmtTdHlsZSgpIHsKKyAgICAgICAgcmV0dXJuIHByb3ZpZGVMaW5rLnN0eWxlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsaW5rIHRlbXBsYXRlLCBlaXRoZXIgZGlyZWN0bHkgZnJvbSB0aGUgdmFsdWUoKSBvciBmcm9tIHRoZQorICAgICAqIHtAY29kZSBAUGF0aH0gb2YgdGhlIGNsYXNzIHJlZmVyZW5jZWQgaW4gcmVzb3VyY2UoKQorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbGluayB0ZW1wbGF0ZQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGlua1RlbXBsYXRlKFJlc291cmNlTWFwcGluZ0NvbnRleHQgcm1jKSB7CisgICAgICAgIFN0cmluZyB0ZW1wbGF0ZSA9IG51bGw7CisgICAgICAgIFJlc291cmNlTWFwcGluZ0NvbnRleHQuTWFwcGluZyBtYXAgPSBybWMuZ2V0TWFwcGluZyhyZXNvdXJjZS5nZXRJbnZvY2FibGUoKS5nZXRIYW5kbGVyKCkuZ2V0SGFuZGxlckNsYXNzKCkpOworICAgICAgICBpZiAobWFwICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRlbXBsYXRlID0gbWFwLmdldFRlbXBsYXRlKCkuZ2V0VGVtcGxhdGUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGV4dHJhY3QgdGVtcGxhdGUgZnJvbSBzcGVjaWZpZWQgY2xhc3MnIEBQYXRoIGFubm90YXRpb24KKyAgICAgICAgICAgIFBhdGggcGF0aCA9IHJlc291cmNlLmdldEludm9jYWJsZSgpLmdldEhhbmRsZXIoKS5nZXRIYW5kbGVyQ2xhc3MoKS5nZXRBbm5vdGF0aW9uKFBhdGguY2xhc3MpOworICAgICAgICAgICAgdGVtcGxhdGUgPSBwYXRoID09IG51bGwgPyAiIiA6IHBhdGgudmFsdWUoKTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcih0ZW1wbGF0ZSk7CisKKyAgICAgICAgUGF0aCBtZXRob2RQYXRoID0gcmVzb3VyY2UuZ2V0SW52b2NhYmxlKCkuZ2V0RGVmaW5pdGlvbk1ldGhvZCgpLmdldEFubm90YXRpb24oUGF0aC5jbGFzcyk7CisgICAgICAgIGlmIChtZXRob2RQYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN0cmluZyBtZXRob2RUZW1wbGF0ZSA9IG1ldGhvZFBhdGgudmFsdWUoKTsKKworICAgICAgICAgICAgaWYgKCEodGVtcGxhdGUuZW5kc1dpdGgoIi8iKSB8fCBtZXRob2RUZW1wbGF0ZS5zdGFydHNXaXRoKCIvIikpKSB7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIi8iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKG1ldGhvZFRlbXBsYXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIENoYXJTZXF1ZW5jZSBxdWVyeVN1YlN0cmluZyA9IEluamVjdExpbmtGaWVsZERlc2NyaXB0b3IuZXh0cmFjdFF1ZXJ5UGFyYW1zKAorICAgICAgICAgICAgICAgIG5ldyBBbm5vdGF0ZWRNZXRob2QocmVzb3VyY2UuZ2V0SW52b2NhYmxlKCkuZ2V0RGVmaW5pdGlvbk1ldGhvZCgpKSk7CisKKyAgICAgICAgaWYgKHF1ZXJ5U3ViU3RyaW5nLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoIns/Iik7CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChxdWVyeVN1YlN0cmluZyk7CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgifSIpOworICAgICAgICB9CisKKyAgICAgICAgdGVtcGxhdGUgPSBidWlsZGVyLnRvU3RyaW5nKCk7CisKKyAgICAgICAgcmV0dXJuIHRlbXBsYXRlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgYmluZGluZyBhcyBhbiBFTCBleHByZXNzaW9uIGZvciBhIHBhcnRpY3VsYXIgVVJJIHRlbXBsYXRlIHBhcmFtZXRlcgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgYmluZGluZyBuYW1lLgorICAgICAqIEByZXR1cm4gdGhlIEVMIGJpbmRpbmcuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRCaW5kaW5nKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBiaW5kaW5ncy5nZXQobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjb25kaXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjb25kaXRpb24KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbmRpdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIHByb3ZpZGVMaW5rLmNvbmRpdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJ1aWxkcyBhIGxpbmsgZnJvbSBhIHtAbGluayBVUkl9LgorICAgICAqCisgICAgICogQHBhcmFtIHVyaSBiYXNlIFVSSQorICAgICAqIEByZXR1cm4gdGhlIHtAbGluayBMaW5rfSBpbnN0YW5jZQorICAgICAqLworICAgIHB1YmxpYyBMaW5rIGdldExpbmsoVVJJIHVyaSkgeworICAgICAgICByZXR1cm4gUHJvdmlkZUxpbmsuVXRpbC5idWlsZExpbmtGcm9tVXJpKHVyaSwgcHJvdmlkZUxpbmspOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gdGhlIHBhcmVudCBhbm5vdGF0aW9uIG9yIHtAY29kZSBudWxsfQorICAgICAqLworICAgIHB1YmxpYyBBbm5vdGF0aW9uIGdldFBhcmVudEFubm90YXRpb24oKSB7CisgICAgICAgIHJldHVybiBwYXJlbnRBbm5vdGF0aW9uOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2luY3ViYXRvci9kZWNsYXJhdGl2ZS1saW5raW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbGlua2luZy9Qcm92aWRlTGlua3MuamF2YSBiL2luY3ViYXRvci9kZWNsYXJhdGl2ZS1saW5raW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbGlua2luZy9Qcm92aWRlTGlua3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTc1MmVlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL1Byb3ZpZGVMaW5rcy5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubGlua2luZzsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuQmV0YTsKKworLyoqCisgKiBDb250YWluZXIgZm9yIHJlcGVhdGFibGUgYW5ub3RhdGlvbiwgc2VlIHtAbGluayBQcm92aWRlTGlua30gZm9yIGRldGFpbHMuCisgKgorICogQGF1dGhvciBMZW9uYXJkIEJyw7xuaW5ncworICovCitAVGFyZ2V0KHtFbGVtZW50VHlwZS5NRVRIT0QsIEVsZW1lbnRUeXBlLlRZUEV9KQorQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BCZXRhCitwdWJsaWMgQGludGVyZmFjZSBQcm92aWRlTGlua3MgeworCisgICAgLyoqCisgICAgICogQ29udGFpbmVyIGZvciBhIHNldCBvZiB7QGxpbmsgUHJvdmlkZUxpbmt9IGFubm90YXRpb25zCisgICAgICogQHJldHVybiBhcnJheSBvZiB7QGNvZGUgUHJvdmlkZUxpbmt9IGVsZW1lbnRzCisgICAgICovCisgICAgUHJvdmlkZUxpbmtbXSB2YWx1ZSgpIGRlZmF1bHQge307Cit9CmRpZmYgLS1naXQgYS9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xpbmtpbmcvUmVxdWVzdExpbmtGaWx0ZXIuamF2YSBiL2luY3ViYXRvci9kZWNsYXJhdGl2ZS1saW5raW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbGlua2luZy9SZXF1ZXN0TGlua0ZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMjM0ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xpbmtpbmcvUmVxdWVzdExpbmtGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lmxpbmtpbmc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkxpbms7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuRXh0ZW5kZWRVcmlJbmZvOworCisvKioKKyAqIEZpbHRlciB0aGF0IHByb2Nlc3NlcyB7QGxpbmsgTGlua30gYW5ub3RhdGVkIGZpZWxkcyBpbiByZXR1cm5lZCByZXNwb25zZQorICogZW50aXRpZXMuCisgKgorICogQGF1dGhvciBNYXJrIEhhZGxleQorICogQGF1dGhvciBHZXJhcmQgRGF2aXNvbiAoZ2VyYXJkLmRhdmlzb24gYXQgb3JhY2xlLmNvbSkKKyAqIEBzZWUgTGluaworICovCitjbGFzcyBSZXF1ZXN0TGlua0ZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIgeworCisgICAgQENvbnRleHQKKyAgICBwcml2YXRlIEV4dGVuZGVkVXJpSW5mbyB1cmlJbmZvOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL1Jlc3BvbnNlQ29udGV4dFJlc29sdmVyLmphdmEgYi9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xpbmtpbmcvUmVzcG9uc2VDb250ZXh0UmVzb2x2ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGY4NTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL1Jlc3BvbnNlQ29udGV4dFJlc29sdmVyLmphdmEKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5saW5raW5nOworCitpbXBvcnQgamF2YS5iZWFucy5GZWF0dXJlRGVzY3JpcHRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LmVsLkVMQ29udGV4dDsKK2ltcG9ydCBqYXZheC5lbC5FTFJlc29sdmVyOworaW1wb3J0IGphdmF4LmVsLlByb3BlcnR5Tm90V3JpdGFibGVFeGNlcHRpb247CisKKy8qKgorICogVGhlIGluaXRpYWwgY29udGV4dCByZXNvbHZlciB0aGF0IHJlc29sdmVzIHRoZSBlbnRpdHkgYW5kIHJlc291cmNlCisgKiBvYmplY3RzIHVzZWQgYXQgdGhlIHN0YXJ0IG9mIGFuIEVMIGV4cHJlc3Npb24uCisgKgorICogQGF1dGhvciBNYXJrIEhhZGxleQorICogQGF1dGhvciBHZXJhcmQgRGF2aXNvbiAoZ2VyYXJkLmRhdmlzb24gYXQgb3JhY2xlLmNvbSkKKyAqLworY2xhc3MgUmVzcG9uc2VDb250ZXh0UmVzb2x2ZXIgZXh0ZW5kcyBFTFJlc29sdmVyIHsKKworICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiByZXNwb25zZU9iamVjdHM7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWV9PQkpFQ1QgPSAiZW50aXR5IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfT0JKRUNUID0gInJlc291cmNlIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIElOU1RBTkNFX09CSkVDVCA9ICJpbnN0YW5jZSI7CisKKyAgICBSZXNwb25zZUNvbnRleHRSZXNvbHZlcihPYmplY3QgZW50aXR5LCBPYmplY3QgcmVzb3VyY2UsIE9iamVjdCBpbnN0YW5jZSkgeworICAgICAgICByZXNwb25zZU9iamVjdHMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIHJlc3BvbnNlT2JqZWN0cy5wdXQoRU5USVRZX09CSkVDVCwgZW50aXR5KTsKKyAgICAgICAgcmVzcG9uc2VPYmplY3RzLnB1dChSRVNPVVJDRV9PQkpFQ1QsIHJlc291cmNlKTsKKyAgICAgICAgcmVzcG9uc2VPYmplY3RzLnB1dChJTlNUQU5DRV9PQkpFQ1QsIGluc3RhbmNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNIYW5kbGVkKEVMQ29udGV4dCBlbGMsIE9iamVjdCBiYXNlLCBPYmplY3QgcHJvcGVydHkpIHsKKyAgICAgICAgaWYgKGJhc2UgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChyZXNwb25zZU9iamVjdHMuY29udGFpbnNLZXkocHJvcGVydHkudG9TdHJpbmcoKSkpIHsKKyAgICAgICAgICAgIGVsYy5zZXRQcm9wZXJ0eVJlc29sdmVkKHRydWUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoRUxDb250ZXh0IGVsYywgT2JqZWN0IGJhc2UsIE9iamVjdCBwcm9wZXJ0eSkgeworICAgICAgICBpZiAoaXNIYW5kbGVkKGVsYywgYmFzZSwgcHJvcGVydHkpKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2VPYmplY3RzLmdldChwcm9wZXJ0eS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0VHlwZShFTENvbnRleHQgZWxjLCBPYmplY3QgbywgT2JqZWN0IG8xKSB7CisgICAgICAgIGlmIChpc0hhbmRsZWQoZWxjLCBvLCBvMSkpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZShlbGMsIG8sIG8xKS5nZXRDbGFzcygpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKEVMQ29udGV4dCBlbGMsIE9iamVjdCBvLCBPYmplY3QgbzEsIE9iamVjdCBvMikgeworICAgICAgICB0aHJvdyBuZXcgUHJvcGVydHlOb3RXcml0YWJsZUV4Y2VwdGlvbihvMi50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRPbmx5KEVMQ29udGV4dCBlbGMsIE9iamVjdCBvLCBPYmplY3QgbzEpIHsKKyAgICAgICAgaWYgKGlzSGFuZGxlZChlbGMsIG8sIG8xKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJdGVyYXRvcjxGZWF0dXJlRGVzY3JpcHRvcj4gZ2V0RmVhdHVyZURlc2NyaXB0b3JzKEVMQ29udGV4dCBlbGMsIE9iamVjdCBvKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDbGFzczw/PiBnZXRDb21tb25Qcm9wZXJ0eVR5cGUoRUxDb250ZXh0IGVsYywgT2JqZWN0IG8pIHsKKyAgICAgICAgcmV0dXJuIE9iamVjdC5jbGFzczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xpbmtpbmcvUmVzcG9uc2VMaW5rRmlsdGVyLmphdmEgYi9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xpbmtpbmcvUmVzcG9uc2VMaW5rRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRkODNkNgotLS0gL2Rldi9udWxsCisrKyBiL2luY3ViYXRvci9kZWNsYXJhdGl2ZS1saW5raW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbGlua2luZy9SZXNwb25zZUxpbmtGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lmxpbmtpbmc7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlc3BvbnNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTGluazsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5saW5raW5nLmNvbnRyaWJ1dGluZy5SZXNvdXJjZUxpbmtDb250cmlidXRpb25Db250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxpbmtpbmcubWFwcGluZy5SZXNvdXJjZU1hcHBpbmdDb250ZXh0OworCisvKioKKyAqIEZpbHRlciB0aGF0IHByb2Nlc3NlcyB7QGxpbmsgTGlua30gYW5ub3RhdGVkIGZpZWxkcyBpbiByZXR1cm5lZCByZXNwb25zZQorICogZW50aXRpZXMuCisgKgorICogQGF1dGhvciBNYXJrIEhhZGxleQorICogQGF1dGhvciBHZXJhcmQgRGF2aXNvbiAoZ2VyYXJkLmRhdmlzb24gYXQgb3JhY2xlLmNvbSkKKyAqIEBzZWUgTGluaworICovCitjbGFzcyBSZXNwb25zZUxpbmtGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXNwb25zZUZpbHRlciB7CisKKyAgICBAQ29udGV4dAorICAgIHByaXZhdGUgVXJpSW5mbyB1cmlJbmZvOworCisgICAgQENvbnRleHQKKyAgICBwcml2YXRlIFJlc291cmNlTWFwcGluZ0NvbnRleHQgcm1jOworCisgICAgQENvbnRleHQKKyAgICBwcml2YXRlIFJlc291cmNlTGlua0NvbnRyaWJ1dGlvbkNvbnRleHQgcmxjYzsKKworICAgIEBPdmVycmlkZQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0LCBDb250YWluZXJSZXNwb25zZUNvbnRleHQgcmVzcG9uc2UpIHsKKyAgICAgICAgZmluYWwgT2JqZWN0IGVudGl0eSA9IHJlc3BvbnNlLmdldEVudGl0eSgpOworCisgICAgICAgIGlmIChlbnRpdHkgIT0gbnVsbCAmJiAhdXJpSW5mby5nZXRNYXRjaGVkUmVzb3VyY2VzKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBDbGFzczw/PiBlbnRpdHlDbGFzcyA9IGVudGl0eS5nZXRDbGFzcygpOworICAgICAgICAgICAgSGVhZGVyUHJvY2Vzc29yIGxocCA9IG5ldyBIZWFkZXJQcm9jZXNzb3IoZW50aXR5Q2xhc3MpOworICAgICAgICAgICAgbGhwLnByb2Nlc3NMaW5rSGVhZGVycyhlbnRpdHksIHVyaUluZm8sIHJtYywgcmVzcG9uc2UuZ2V0SGVhZGVycygpKTsKKyAgICAgICAgICAgIEZpZWxkUHJvY2Vzc29yIGxwID0gbmV3IEZpZWxkUHJvY2Vzc29yKGVudGl0eUNsYXNzKTsKKyAgICAgICAgICAgIGxwLnByb2Nlc3NMaW5rcyhlbnRpdHksIHVyaUluZm8sIHJtYywgcmxjYyk7CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL2luY3ViYXRvci9kZWNsYXJhdGl2ZS1saW5raW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbGlua2luZy9jb250cmlidXRpbmcvTmFpdmVSZXNvdXJjZUxpbmtDb250cmlidXRpb25Db250ZXh0LmphdmEgYi9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xpbmtpbmcvY29udHJpYnV0aW5nL05haXZlUmVzb3VyY2VMaW5rQ29udHJpYnV0aW9uQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNDkyYjEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xpbmtpbmcvY29udHJpYnV0aW5nL05haXZlUmVzb3VyY2VMaW5rQ29udHJpYnV0aW9uQ29udGV4dC5qYXZhCkBAIC0wLDAgKzEsMjM4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmxpbmtpbmcuY29udHJpYnV0aW5nOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Bbm5vdGF0ZWRFbGVtZW50OworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubGlua2luZy5Qcm92aWRlTGluazsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5saW5raW5nLlByb3ZpZGVMaW5rRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5saW5raW5nLlByb3ZpZGVMaW5rczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuRXh0ZW5kZWRSZXNvdXJjZUNvbnRleHQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLkhhbmRsZXJDb25zdHJ1Y3RvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuSW52b2NhYmxlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5NZXRob2RIYW5kbGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNZXRob2Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTW9kZWw7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTW9kZWxDb21wb25lbnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTW9kZWxWaXNpdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SdW50aW1lUmVzb3VyY2U7CisKKy8qKgorICogU2ltcGxlIG1hcCBiYXNlZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUmVzb3VyY2VMaW5rQ29udHJpYnV0aW9uQ29udGV4dC4KKyAqCisgKiBAYXV0aG9yIExlb25hcmQgQnLDvG5pbmdzCisgKi8KK3B1YmxpYyBjbGFzcyBOYWl2ZVJlc291cmNlTGlua0NvbnRyaWJ1dGlvbkNvbnRleHQgaW1wbGVtZW50cyBSZXNvdXJjZUxpbmtDb250cmlidXRpb25Db250ZXh0IHsKKworICAgIHByaXZhdGUgZmluYWwgRXh0ZW5kZWRSZXNvdXJjZUNvbnRleHQgZXJjOworCisgICAgLyoqCisgICAgICogTWFwcGluZ3MgaG9sZHMgYSBzaW5nbGUtbGV2ZWwgbWFwcGluZyBiZXR3ZWVuIGEgY2xhc3MsIGFuZCBpdCdzIHtAbGluayBQcm92aWRlTGlua0Rlc2NyaXB0b3J9cworICAgICAqLworICAgIHByaXZhdGUgTWFwPENsYXNzPD8+LCBMaXN0PFByb3ZpZGVMaW5rRGVzY3JpcHRvcj4+IG1hcHBpbmdzOworCisgICAgLyoqCisgICAgICogQ29udHJpYnV0aW9ucyBob2xkcyBhbGwgY29udHJpYnV0aW9ucyBmb3IgYSBjbGFzcywgdGhpcyBpbmNsdWRlcyBhbGwgY29udHJpYnV0aW9ucyBmcm9tIGl0J3MgYW5jZXN0b3JzLgorICAgICAqLworICAgIHByaXZhdGUgTWFwPENsYXNzPD8+LCBMaXN0PFByb3ZpZGVMaW5rRGVzY3JpcHRvcj4+IGNvbnRyaWJ1dGlvbnMgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpOworCisgICAgLyoqCisgICAgICogQyd0b3IKKyAgICAgKiBAcGFyYW0gZXJjIHRoZSBFeHRlbmRlZFJlc291cmNlQ29udGV4dAorICAgICAqLworICAgIHB1YmxpYyBOYWl2ZVJlc291cmNlTGlua0NvbnRyaWJ1dGlvbkNvbnRleHQoQENvbnRleHQgZmluYWwgRXh0ZW5kZWRSZXNvdXJjZUNvbnRleHQgZXJjKSB7CisgICAgICAgIHRoaXMuZXJjID0gZXJjOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0PFByb3ZpZGVMaW5rRGVzY3JpcHRvcj4gZ2V0Q29udHJpYnV0b3JzRm9yKENsYXNzPD8+IGVudGl0eUNsYXNzKSB7CisgICAgICAgIGJ1aWxkTWFwcGluZ3MoKTsKKyAgICAgICAgcmV0dXJuIGNvbnRyaWJ1dGlvbnMuY29tcHV0ZUlmQWJzZW50KGVudGl0eUNsYXNzLAorICAgICAgICAgICAgICAgIGFDbGFzcyAtPiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KGNvbGxlY3RDb250cmlidXRvcnMoYUNsYXNzLCBuZXcgQXJyYXlMaXN0PD4oKSkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb2xsZWN0cyBjb250cmlidXRvcnMgZm9yIGEgY2xhc3MgcmVjdXJzaXZlbHkgdXAgdGhlIGFuY2VzdG9ycyBjaGFpbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbnRpdHlDbGFzcyB0aGUgY2xhc3MgdG8KKyAgICAgKiBAcGFyYW0gY29udHJpYnV0b3JzIGNvbGxlY3RvciBsaXN0CisgICAgICogQHJldHVybiBjb250cmlidXRvcnMgbGlzdCBmb3IgZWFzaWVyIHVzZSBpbiBsYW1iZGFzCisgICAgICovCisgICAgcHJpdmF0ZSBMaXN0PFByb3ZpZGVMaW5rRGVzY3JpcHRvcj4gY29sbGVjdENvbnRyaWJ1dG9ycyhDbGFzczw/PiBlbnRpdHlDbGFzcywgTGlzdDxQcm92aWRlTGlua0Rlc2NyaXB0b3I+IGNvbnRyaWJ1dG9ycykgeworICAgICAgICBjb250cmlidXRvcnMuYWRkQWxsKG1hcHBpbmdzLmdldE9yRGVmYXVsdChlbnRpdHlDbGFzcywgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpKTsKKyAgICAgICAgQ2xhc3M8Pz4gc2MgPSBlbnRpdHlDbGFzcy5nZXRTdXBlcmNsYXNzKCk7CisgICAgICAgIGlmIChzYyAhPSBudWxsICYmIHNjICE9IE9iamVjdC5jbGFzcykgeworICAgICAgICAgICAgY29sbGVjdENvbnRyaWJ1dG9ycyhzYywgY29udHJpYnV0b3JzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29udHJpYnV0b3JzOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBidWlsZE1hcHBpbmdzKCkgeworICAgICAgICBpZiAobWFwcGluZ3MgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZpbmFsIE1hcDxDbGFzczw/PiwgTGlzdDxQcm92aWRlTGlua0Rlc2NyaXB0b3I+PiBuZXdNYXBwaW5ncyA9IG5ldyBIYXNoTWFwPD4oKTsKKworICAgICAgICBlcmMuZ2V0UmVzb3VyY2VNb2RlbCgpLmFjY2VwdChuZXcgUmVzb3VyY2VNb2RlbFZpc2l0b3IoKSB7CisKKyAgICAgICAgICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzQ29tcG9uZW50cyhmaW5hbCBSZXNvdXJjZU1vZGVsQ29tcG9uZW50IGNvbXBvbmVudCkgeworCisgICAgICAgICAgICAgICAgZmluYWwgTGlzdDw/IGV4dGVuZHMgUmVzb3VyY2VNb2RlbENvbXBvbmVudD4gY29tcG9uZW50cyA9IGNvbXBvbmVudC5nZXRDb21wb25lbnRzKCk7CisgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudHMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIFJlc291cmNlTW9kZWxDb21wb25lbnQgcmMgOiBjb21wb25lbnRzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByYy5hY2NlcHQodGhpcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgdmlzaXRJbnZvY2FibGUoZmluYWwgSW52b2NhYmxlIGludm9jYWJsZSkgeworICAgICAgICAgICAgICAgIHByb2Nlc3NDb21wb25lbnRzKGludm9jYWJsZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgdmlzaXRSdW50aW1lUmVzb3VyY2UoZmluYWwgUnVudGltZVJlc291cmNlIHJ1bnRpbWVSZXNvdXJjZSkgeworICAgICAgICAgICAgICAgIHByb2Nlc3NDb21wb25lbnRzKHJ1bnRpbWVSZXNvdXJjZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgdmlzaXRSZXNvdXJjZU1vZGVsKGZpbmFsIFJlc291cmNlTW9kZWwgcmVzb3VyY2VNb2RlbCkgeworICAgICAgICAgICAgICAgIHByb2Nlc3NDb21wb25lbnRzKHJlc291cmNlTW9kZWwpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0UmVzb3VyY2VIYW5kbGVyQ29uc3RydWN0b3IoZmluYWwgSGFuZGxlckNvbnN0cnVjdG9yIGhhbmRsZXJDb25zdHJ1Y3RvcikgeworICAgICAgICAgICAgICAgIHByb2Nlc3NDb21wb25lbnRzKGhhbmRsZXJDb25zdHJ1Y3Rvcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgdmlzaXRNZXRob2RIYW5kbGVyKGZpbmFsIE1ldGhvZEhhbmRsZXIgbWV0aG9kSGFuZGxlcikgeworICAgICAgICAgICAgICAgIHByb2Nlc3NDb21wb25lbnRzKG1ldGhvZEhhbmRsZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0Q2hpbGRSZXNvdXJjZShmaW5hbCBSZXNvdXJjZSByZXNvdXJjZSkgeworICAgICAgICAgICAgICAgIHByb2Nlc3NDb21wb25lbnRzKHJlc291cmNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdFJlc291cmNlKGZpbmFsIFJlc291cmNlIHJlc291cmNlKSB7CisgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbXBvbmVudHMocmVzb3VyY2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0UmVzb3VyY2VNZXRob2QoZmluYWwgUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QpIHsKKworICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZU1ldGhvZC5pc0V4dGVuZGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZU1ldGhvZC5nZXRJbnZvY2FibGUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIEludm9jYWJsZSBpID0gcmVzb3VyY2VNZXRob2QuZ2V0SW52b2NhYmxlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IGkuZ2V0RGVmaW5pdGlvbk1ldGhvZCgpOworCisgICAgICAgICAgICAgICAgICAgIExpc3Q8UHJvdmlkZUxpbmtEZXNjcmlwdG9yPiBsaW5rRGVzY3JpcHRvcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgICAgICAgICAgICAgICAgICBoYW5kbGVNZXRhQW5ub3RhdGlvbnMocmVzb3VyY2VNZXRob2QsIG1ldGhvZCwgbGlua0Rlc2NyaXB0b3JzKTsKKworICAgICAgICAgICAgICAgICAgICBoYW5kbGVBbm5vdGF0aW9ucyhyZXNvdXJjZU1ldGhvZCwgbGlua0Rlc2NyaXB0b3JzLCBtZXRob2QsIG51bGwpOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoUHJvdmlkZUxpbmtEZXNjcmlwdG9yIGxpbmtEZXNjcmlwdG9yIDogbGlua0Rlc2NyaXB0b3JzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKENsYXNzPD8+IHRhcmdldCA6IGxpbmtEZXNjcmlwdG9yLmdldFByb3ZpZGVMaW5rKCkudmFsdWUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IGhhbmRsZUluaGVyaXRlZFRhcmdldChsaW5rRGVzY3JpcHRvciwgdGFyZ2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdNYXBwaW5ncy5jb21wdXRlSWZBYnNlbnQodGFyZ2V0LCBhQ2xhc3MgLT4gbmV3IEFycmF5TGlzdDw+KCkpLmFkZChsaW5rRGVzY3JpcHRvcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcm9jZXNzQ29tcG9uZW50cyhyZXNvdXJjZU1ldGhvZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgQ2xhc3M8Pz4gaGFuZGxlSW5oZXJpdGVkVGFyZ2V0KFByb3ZpZGVMaW5rRGVzY3JpcHRvciBsaW5rRGVzY3JpcHRvciwgQ2xhc3M8Pz4gdGFyZ2V0KSB7CisgICAgICAgICAgICAgICAgaWYgKE9iamVjdHMuZXF1YWxzKFByb3ZpZGVMaW5rLkluaGVyaXRGcm9tQW5ub3RhdGlvbi5jbGFzcywgdGFyZ2V0KSkgeworICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uIHBhcmVudEFubm90YXRpb24gPSBsaW5rRGVzY3JpcHRvci5nZXRQYXJlbnRBbm5vdGF0aW9uKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRBbm5vdGF0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkluaGVyaXRGcm9tQW5ub3RhdGlvbiBjYW4gb25seSBiZSB1c2VkIGZvciBBbm5vdGF0aW9ucyIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaW5kVGFyZ2V0KHBhcmVudEFubm90YXRpb24pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIENsYXNzPD8+IGZpbmRUYXJnZXQoQW5ub3RhdGlvbiBwYXJlbnRBbm5vdGF0aW9uKSB7CisgICAgICAgICAgICAgICAgTWV0aG9kW10gbWV0aG9kcyA9IHBhcmVudEFubm90YXRpb24uYW5ub3RhdGlvblR5cGUoKS5nZXREZWNsYXJlZE1ldGhvZHMoKTsKKyAgICAgICAgICAgICAgICBmb3IgKE1ldGhvZCBtZXRob2QgOiBtZXRob2RzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2QuaXNBY2Nlc3NpYmxlKCkgfHwgQ2xhc3MuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShtZXRob2QuZ2V0UmV0dXJuVHlwZSgpKSkgeworCisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoQ2xhc3M8Pz4pIG1ldGhvZC5pbnZva2UocGFyZW50QW5ub3RhdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gfCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoTmFpdmVSZXNvdXJjZUxpbmtDb250cmlidXRpb25Db250ZXh0LmNsYXNzLmdldE5hbWUoKSkubG9nKExldmVsLkZJTkUsIG51bGwsIGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5vIHN1aXRhYmxlIGVsZW1lbnQgb2YgdHlwZSBDbGFzczw/PiBmb3VuZCBvbjogIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBwYXJlbnRBbm5vdGF0aW9uLmdldENsYXNzKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlTWV0YUFubm90YXRpb25zKFJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kLCBNZXRob2QgbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICBMaXN0PFByb3ZpZGVMaW5rRGVzY3JpcHRvcj4gbGlua0Rlc2NyaXB0b3JzKSB7CisgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zID0gbWV0aG9kLmdldERlY2xhcmVkQW5ub3RhdGlvbnMoKTsKKyAgICAgICAgICAgICAgICBmb3IgKEFubm90YXRpb24gYW5ub3RhdGlvbiA6IGFubm90YXRpb25zKSB7CisgICAgICAgICAgICAgICAgICAgIGhhbmRsZUFubm90YXRpb25zKHJlc291cmNlTWV0aG9kLCBsaW5rRGVzY3JpcHRvcnMsIGFubm90YXRpb24uYW5ub3RhdGlvblR5cGUoKSwgYW5ub3RhdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIHZvaWQgaGFuZGxlQW5ub3RhdGlvbnMoUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QsIExpc3Q8UHJvdmlkZUxpbmtEZXNjcmlwdG9yPiBsaW5rRGVzY3JpcHRvcnMsCisgICAgICAgICAgICAgICAgICAgIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCwgQW5ub3RhdGlvbiBwYXJlbnRBbm5vdGF0aW9uKSB7CisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuaXNBbm5vdGF0aW9uUHJlc2VudChQcm92aWRlTGluay5jbGFzcykgfHwgZWxlbWVudC5pc0Fubm90YXRpb25QcmVzZW50KFByb3ZpZGVMaW5rcy5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICAgICAgUHJvdmlkZUxpbmsgcHJvdmlkZUxpbmsgPSBlbGVtZW50LmdldEFubm90YXRpb24oUHJvdmlkZUxpbmsuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICBpZiAocHJvdmlkZUxpbmsgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGlua0Rlc2NyaXB0b3JzLmFkZChuZXcgUHJvdmlkZUxpbmtEZXNjcmlwdG9yKHJlc291cmNlTWV0aG9kLCBwcm92aWRlTGluaywgcGFyZW50QW5ub3RhdGlvbikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIFByb3ZpZGVMaW5rcyBwcm92aWRlTGlua3MgPSBlbGVtZW50LmdldEFubm90YXRpb24oUHJvdmlkZUxpbmtzLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVMaW5rcyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFByb3ZpZGVMaW5rIGxpbmsgOiBwcm92aWRlTGlua3MudmFsdWUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtEZXNjcmlwdG9ycy5hZGQobmV3IFByb3ZpZGVMaW5rRGVzY3JpcHRvcihyZXNvdXJjZU1ldGhvZCwgbGluaywgcGFyZW50QW5ub3RhdGlvbikpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSk7CisKKyAgICAgICAgbWFwcGluZ3MgPSBuZXdNYXBwaW5nczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xpbmtpbmcvY29udHJpYnV0aW5nL1Jlc291cmNlTGlua0NvbnRyaWJ1dGlvbkNvbnRleHQuamF2YSBiL2luY3ViYXRvci9kZWNsYXJhdGl2ZS1saW5raW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbGlua2luZy9jb250cmlidXRpbmcvUmVzb3VyY2VMaW5rQ29udHJpYnV0aW9uQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNGFhZjUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xpbmtpbmcvY29udHJpYnV0aW5nL1Jlc291cmNlTGlua0NvbnRyaWJ1dGlvbkNvbnRleHQuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmxpbmtpbmcuY29udHJpYnV0aW5nOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5saW5raW5nLlByb3ZpZGVMaW5rRGVzY3JpcHRvcjsKKworLyoqCisgKiBUaGUgUmVzb3VyY2VMaW5rQ29udHJpYnV0aW9uQ29udGV4dCBwcm92aWRlcyBhY2Nlc3MgZm9yIGxpbmsgY29udHJpYnV0aW9ucyBmcm9tIG90aGVyIHNvdXJjZXMgdG8gYW4gZW50aXR5LgorICoKKyAqIEBhdXRob3IgTGVvbmFyZCBCcsO8bmluZ3MKKyAqLworcHVibGljIGludGVyZmFjZSBSZXNvdXJjZUxpbmtDb250cmlidXRpb25Db250ZXh0IHsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYWxsIGxpbmsgY29udHJpYnV0aW9ucyBmb3IgYW4gZW50aXR5IGNsYXNzLgorICAgICAqCisgICAgICogSXQgYWxzbyBpbmNsdWRlcyBjb250cmlidXRpb25zIGZvciBldmVyeSBhbmNlc3RvciBvZiBlbnRpdHlDbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbnRpdHlDbGFzcyB0aGUgZW50aXR5Q2xhc3MKKyAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgbGluayBjb250cmlidXRpb25zIHRvIGFkZCB0byB0aGUgY2xhc3MKKyAgICAgKi8KKyAgICBMaXN0PFByb3ZpZGVMaW5rRGVzY3JpcHRvcj4gZ2V0Q29udHJpYnV0b3JzRm9yKENsYXNzPD8+IGVudGl0eUNsYXNzKTsKK30KZGlmZiAtLWdpdCBhL2luY3ViYXRvci9kZWNsYXJhdGl2ZS1saW5raW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbGlua2luZy9tYXBwaW5nL05haXZlUmVzb3VyY2VNYXBwaW5nQ29udGV4dC5qYXZhIGIvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL21hcHBpbmcvTmFpdmVSZXNvdXJjZU1hcHBpbmdDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZmNzYxNwotLS0gL2Rldi9udWxsCisrKyBiL2luY3ViYXRvci9kZWNsYXJhdGl2ZS1saW5raW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbGlua2luZy9tYXBwaW5nL05haXZlUmVzb3VyY2VNYXBwaW5nQ29udGV4dC5qYXZhCkBAIC0wLDAgKzEsMjE5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmxpbmtpbmcubWFwcGluZzsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLkRlcXVlOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLkluZmxlY3RvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuRXh0ZW5kZWRSZXNvdXJjZUNvbnRleHQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLkhhbmRsZXJDb25zdHJ1Y3RvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuSW52b2NhYmxlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5NZXRob2RIYW5kbGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNZXRob2Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTW9kZWw7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTW9kZWxDb21wb25lbnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTW9kZWxWaXNpdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SdW50aW1lUmVzb3VyY2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudXJpLlBhdGhQYXR0ZXJuOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnVyaS5VcmlUZW1wbGF0ZTsKKworLyoqCisgKiBUaGlzIGltcGxlbWVudGF0aW9uIG9mIHRoZSByZXNvdXJjZSBtYXBwaW5nIGNvbnRleHQgYXNzdW1lZCByZXNvdXJjZXMgYXJlCisgKiBvZiBhIHNpbXBsZSB0eXBlIHdpdGggYSBzdGF0aWNhbGx5IGRlZmluZWQgc3RydWN0dXJlLgorICoKKyAqIEBhdXRob3IgR2VyYXJkIERhdmlzb24gKGdlcmFyZC5kYXZpc29uIGF0IG9yYWNsZS5jb20pCisgKi8KKworcHVibGljIGNsYXNzIE5haXZlUmVzb3VyY2VNYXBwaW5nQ29udGV4dCBpbXBsZW1lbnRzIFJlc291cmNlTWFwcGluZ0NvbnRleHQgeworCisgICAgcHJpdmF0ZSBmaW5hbCBFeHRlbmRlZFJlc291cmNlQ29udGV4dCBlcmM7CisKKyAgICBwcml2YXRlIE1hcDxDbGFzczw/PiwgUmVzb3VyY2VNYXBwaW5nQ29udGV4dC5NYXBwaW5nPiBtYXBwaW5nczsKKworICAgIHB1YmxpYyBOYWl2ZVJlc291cmNlTWFwcGluZ0NvbnRleHQoQENvbnRleHQgZmluYWwgRXh0ZW5kZWRSZXNvdXJjZUNvbnRleHQgZXJjKSB7CisgICAgICAgIHRoaXMuZXJjID0gZXJjOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNYXBwaW5nIGdldE1hcHBpbmcoZmluYWwgQ2xhc3M8Pz4gcmVzb3VyY2UpIHsKKyAgICAgICAgYnVpbGRNYXBwaW5ncygpOworICAgICAgICByZXR1cm4gbWFwcGluZ3MuZ2V0KHJlc291cmNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYnVpbGRNYXBwaW5ncygpIHsKKyAgICAgICAgaWYgKG1hcHBpbmdzICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtYXBwaW5ncyA9IG5ldyBIYXNoTWFwPD4oKTsKKworICAgICAgICBlcmMuZ2V0UmVzb3VyY2VNb2RlbCgpLmFjY2VwdChuZXcgUmVzb3VyY2VNb2RlbFZpc2l0b3IoKSB7CisKKyAgICAgICAgICAgIERlcXVlPFBhdGhQYXR0ZXJuPiBzdGFjayA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKworICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NDb21wb25lbnRzKGZpbmFsIFJlc291cmNlTW9kZWxDb21wb25lbnQgY29tcG9uZW50KSB7CisKKyAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PD8gZXh0ZW5kcyBSZXNvdXJjZU1vZGVsQ29tcG9uZW50PiBjb21wb25lbnRzID0gY29tcG9uZW50LmdldENvbXBvbmVudHMoKTsKKyAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50cyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoZmluYWwgUmVzb3VyY2VNb2RlbENvbXBvbmVudCByYyA6IGNvbXBvbmVudHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJjLmFjY2VwdCh0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdEludm9jYWJsZShmaW5hbCBJbnZvY2FibGUgaW52b2NhYmxlKSB7CisgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbXBvbmVudHMoaW52b2NhYmxlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdFJ1bnRpbWVSZXNvdXJjZShmaW5hbCBSdW50aW1lUmVzb3VyY2UgcnVudGltZVJlc291cmNlKSB7CisgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbXBvbmVudHMocnVudGltZVJlc291cmNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdFJlc291cmNlTW9kZWwoZmluYWwgUmVzb3VyY2VNb2RlbCByZXNvdXJjZU1vZGVsKSB7CisgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbXBvbmVudHMocmVzb3VyY2VNb2RlbCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgdmlzaXRSZXNvdXJjZUhhbmRsZXJDb25zdHJ1Y3RvcihmaW5hbCBIYW5kbGVyQ29uc3RydWN0b3IgaGFuZGxlckNvbnN0cnVjdG9yKSB7CisgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbXBvbmVudHMoaGFuZGxlckNvbnN0cnVjdG9yKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdE1ldGhvZEhhbmRsZXIoZmluYWwgTWV0aG9kSGFuZGxlciBtZXRob2RIYW5kbGVyKSB7CisgICAgICAgICAgICAgICAgcHJvY2Vzc0NvbXBvbmVudHMobWV0aG9kSGFuZGxlcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgdmlzaXRDaGlsZFJlc291cmNlKGZpbmFsIFJlc291cmNlIHJlc291cmNlKSB7CisgICAgICAgICAgICAgICAgdmlzaXRSZXNvdXJjZUludGwocmVzb3VyY2UsIGZhbHNlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdFJlc291cmNlKGZpbmFsIFJlc291cmNlIHJlc291cmNlKSB7CisKKyAgICAgICAgICAgICAgICB2aXNpdFJlc291cmNlSW50bChyZXNvdXJjZSwgdHJ1ZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgdm9pZCB2aXNpdFJlc291cmNlSW50bChmaW5hbCBSZXNvdXJjZSByZXNvdXJjZSwgZmluYWwgYm9vbGVhbiBpc1Jvb3QpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzdGFjay5hZGRMYXN0KHJlc291cmNlLmdldFBhdGhQYXR0ZXJuKCkpOworICAgICAgICAgICAgICAgICAgICBwcm9jZXNzQ29tcG9uZW50cyhyZXNvdXJjZSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzUm9vdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgbGlrZWx5VG9CZVJvb3QgPSBudWxsOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChmaW5hbCBDbGFzcyBuZXh0IDogcmVzb3VyY2UuZ2V0SGFuZGxlckNsYXNzZXMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKEluZmxlY3Rvci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKG5leHQpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaWtlbHlUb0JlUm9vdCA9IG5leHQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGlrZWx5VG9CZVJvb3QgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmdzLnB1dChsaWtlbHlUb0JlUm9vdCwgZ2V0TWFwcGluZyhnZXRUZW1wbGF0ZSgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBzdGFjay5yZW1vdmVMYXN0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0UmVzb3VyY2VNZXRob2QoZmluYWwgUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QpIHsKKworICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZU1ldGhvZC5pc0V4dGVuZGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChSZXNvdXJjZU1ldGhvZC5KYXhyc1R5cGUuU1VCX1JFU09VUkNFX0xPQ0FUT1IuZXF1YWxzKHJlc291cmNlTWV0aG9kLmdldFR5cGUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlTWV0aG9kLmdldEludm9jYWJsZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEludm9jYWJsZSBpID0gcmVzb3VyY2VNZXRob2QuZ2V0SW52b2NhYmxlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFR5cGUgdHlwZSA9IGkuZ2V0UmVzcG9uc2VUeXBlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHRlbXBsYXRlID0gZ2V0VGVtcGxhdGUoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZ3MucHV0KChDbGFzcykgdHlwZSwgZ2V0TWFwcGluZyh0ZW1wbGF0ZSkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcm9jZXNzIHN1YiByZXNvdXJjZXMgPworCisgICAgICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZS5CdWlsZGVyIGJ1aWxkZXIgPSBSZXNvdXJjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGRlcihpLmdldFJhd1Jlc3BvbnNlVHlwZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidWlsZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgZXhhbXBsZSBpbiB0aGUgY2FzZSB0aGUgcmV0dXJuIHR5cGUgb2YgdGhlIHN1YiByZXNvdXJjZSBsb2NhdG9yIGlzIE9iamVjdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIgPSBSZXNvdXJjZS5idWlsZGVyKCkucGF0aChyZXNvdXJjZU1ldGhvZC5nZXRQYXJlbnQoKS5nZXRQYXRoKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVzb3VyY2Ugc3ViUmVzb3VyY2UgPSBidWlsZGVyLmJ1aWxkKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpc2l0Q2hpbGRSZXNvdXJjZShzdWJSZXNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcm9jZXNzQ29tcG9uZW50cyhyZXNvdXJjZU1ldGhvZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgU3RyaW5nQnVpbGRlciBnZXRUZW1wbGF0ZSgpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHRlbXBsYXRlID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIFBhdGhQYXR0ZXJuIHBwIDogc3RhY2spIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBwVGVtcGxhdGUgPSBwcC5nZXRUZW1wbGF0ZSgpLmdldFRlbXBsYXRlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHRsZW5ndGggPSB0ZW1wbGF0ZS5sZW5ndGgoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRsZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGVtcGxhdGUuY2hhckF0KHRsZW5ndGggLSAxKSA9PSAnLycpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHBUZW1wbGF0ZS5zdGFydHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUuYXBwZW5kKHBwVGVtcGxhdGUsIDEsIHBwVGVtcGxhdGUubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLmFwcGVuZChwcFRlbXBsYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcFRlbXBsYXRlLnN0YXJ0c1dpdGgoIi8iKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZS5hcHBlbmQocHBUZW1wbGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUuYXBwZW5kKCIvIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLmFwcGVuZChwcFRlbXBsYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZS5hcHBlbmQocHBUZW1wbGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gdGVtcGxhdGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgfQorCisgICAgcHJpdmF0ZSBNYXBwaW5nIGdldE1hcHBpbmcoZmluYWwgU3RyaW5nQnVpbGRlciB0ZW1wbGF0ZSkgeworICAgICAgICByZXR1cm4gbmV3IE1hcHBpbmcoKSB7CisgICAgICAgICAgICBVcmlUZW1wbGF0ZSB1cmlUZW1wbGF0ZSA9IG5ldyBVcmlUZW1wbGF0ZSh0ZW1wbGF0ZS50b1N0cmluZygpKTsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgVXJpVGVtcGxhdGUgZ2V0VGVtcGxhdGUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHVyaVRlbXBsYXRlOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL21hcHBpbmcvUmVzb3VyY2VNYXBwaW5nQ29udGV4dC5qYXZhIGIvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL21hcHBpbmcvUmVzb3VyY2VNYXBwaW5nQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMDRkODkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xpbmtpbmcvbWFwcGluZy9SZXNvdXJjZU1hcHBpbmdDb250ZXh0LmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5saW5raW5nLm1hcHBpbmc7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS51cmkuVXJpVGVtcGxhdGU7CisKKy8qKgorICogVGhpcyBzZXJ2aWNlIHRyaWVzIHRvIHdvcmsgb3V0IHRoZSBVcmlUZW1wbGF0ZSByZXF1aXJlZCBmb3IgYSBwYXJ0aWN1bGFyCisgKiByZXNvdXJjZSBjbGFzcy4KKyAqCisgKiBAYXV0aG9yIEdlcmFyZCBEYXZpc29uIChnZXJhcmQuZGF2aXNvbiBhdCBvcmFjbGUuY29tKQorICovCisKK3B1YmxpYyBpbnRlcmZhY2UgUmVzb3VyY2VNYXBwaW5nQ29udGV4dCB7CisKKyAgICBwdWJsaWMgaW50ZXJmYWNlIE1hcHBpbmcgeworCisgICAgICAgIHB1YmxpYyBVcmlUZW1wbGF0ZSBnZXRUZW1wbGF0ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBNYXBwaW5nIGdldE1hcHBpbmcoQ2xhc3M8Pz4gcmVzb3VyY2UpOworfQpkaWZmIC0tZ2l0IGEvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL21haW4vcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL2xpbmtpbmcvaW50ZXJuYWwvbGlua01lc3NhZ2VzLnByb3BlcnRpZXMgYi9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvbGlua2luZy9pbnRlcm5hbC9saW5rTWVzc2FnZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODFlMTkzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL21haW4vcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL2xpbmtpbmcvaW50ZXJuYWwvbGlua01lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxOCBAQAorIworIyBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisjIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyMKKyMgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorIyBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisjIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorIyB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisjCisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorIworCit3YXJuaW5nLmxpbmtmaWx0ZXIucHJvY2Vzc2luZz1MaW5rRmlsdGVyIGNhbm5vdCBwcm9jZXNzIGNsYXNzIHswfSwgZXhjZXB0aW9uIG9jY3VycmVkIGR1cmluZyBwcm9jZXNzaW5nLiBDbGFzcyB3aWxsIGJlIGlnbm9yZWQgXAorICBpbiB0aGUgTGlua0ZpbHRlci4KZGlmZiAtLWdpdCBhL2luY3ViYXRvci9kZWNsYXJhdGl2ZS1saW5raW5nL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbGlua2luZy9FbnRpdHlEZXNjcmlwdG9yVGVzdC5qYXZhIGIvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL0VudGl0eURlc2NyaXB0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVkNjNmZAotLS0gL2Rldi9udWxsCisrKyBiL2luY3ViYXRvci9kZWNsYXJhdGl2ZS1saW5raW5nL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbGlua2luZy9FbnRpdHlEZXNjcmlwdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lmxpbmtpbmc7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOworCitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5saW5raW5nLm1hcHBpbmcuUmVzb3VyY2VNYXBwaW5nQ29udGV4dDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKgorICogQGF1dGhvciBNYXJrIEhhZGxleQorICogQGF1dGhvciBHZXJhcmQgRGF2aXNvbiAoZ2VyYXJkLmRhdmlzb24gYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEVudGl0eURlc2NyaXB0b3JUZXN0IHsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdENsYXNzQSB7CisKKyAgICAgICAgQEluamVjdExpbmsKKyAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBmb287CisKKyAgICAgICAgQEluamVjdExpbmsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgYmFyOworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgYmF6OworICAgIH0KKworICAgIFJlc291cmNlTWFwcGluZ0NvbnRleHQgbW9ja1JtYyA9IG5ldyBSZXNvdXJjZU1hcHBpbmdDb250ZXh0KCkgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzb3VyY2VNYXBwaW5nQ29udGV4dC5NYXBwaW5nIGdldE1hcHBpbmcoQ2xhc3M8Pz4gcmVzb3VyY2UpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfTsKKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIGRlY2xhcmVkIHByb3BlcnRpZXMKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZWNsYXJlZFByb3BlcnRpZXMoKSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRGVjbGFyZWQgcHJvcGVydGllcyIpOworICAgICAgICBFbnRpdHlEZXNjcmlwdG9yIGluc3RhbmNlID0gRW50aXR5RGVzY3JpcHRvci5nZXRJbnN0YW5jZShUZXN0Q2xhc3NBLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGluc3RhbmNlLmdldExpbmtGaWVsZHMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgaW5zdGFuY2UuZ2V0Tm9uTGlua0ZpZWxkcygpLnNpemUoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0Q2xhc3NCIGV4dGVuZHMgVGVzdENsYXNzQSB7CisKKyAgICAgICAgQEluamVjdExpbmsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgYmFyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIGluaGVyaXRlZCBwcm9wZXJ0aWVzCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5oZXJpdGVkUHJvcGVydGllcygpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJbmhlcml0ZWQgcHJvcGVydGllcyIpOworICAgICAgICBFbnRpdHlEZXNjcmlwdG9yIGluc3RhbmNlID0gRW50aXR5RGVzY3JpcHRvci5nZXRJbnN0YW5jZShUZXN0Q2xhc3NCLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGluc3RhbmNlLmdldExpbmtGaWVsZHMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgaW5zdGFuY2UuZ2V0Tm9uTGlua0ZpZWxkcygpLnNpemUoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFX0EgPSAiZm9vIjsKKworICAgIEBQYXRoKFRFTVBMQVRFX0EpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0UmVzb3VyY2VBIHsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RDbGFzc0MgeworCisgICAgICAgIEBJbmplY3RMaW5rKHJlc291cmNlID0gVGVzdFJlc291cmNlQS5jbGFzcywgYmluZGluZ3MgPSB7QEJpbmRpbmcobmFtZSA9ICJiYXIiLCB2YWx1ZSA9ICJiYXoiKX0pCisgICAgICAgIFN0cmluZyByZXM7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VMaW5rKCkgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJlc291cmNlIGNsYXNzIGxpbmsiKTsKKyAgICAgICAgRW50aXR5RGVzY3JpcHRvciBpbnN0YW5jZSA9IEVudGl0eURlc2NyaXB0b3IuZ2V0SW5zdGFuY2UoVGVzdENsYXNzQy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBpbnN0YW5jZS5nZXRMaW5rRmllbGRzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGluc3RhbmNlLmdldE5vbkxpbmtGaWVsZHMoKS5zaXplKCkpOworICAgICAgICBJbmplY3RMaW5rRmllbGREZXNjcmlwdG9yIGxpbmtEZXNjID0gKEluamVjdExpbmtGaWVsZERlc2NyaXB0b3IpIGluc3RhbmNlLmdldExpbmtGaWVsZHMoKS5pdGVyYXRvcigpLm5leHQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRFTVBMQVRFX0EsIGxpbmtEZXNjLmdldExpbmtUZW1wbGF0ZShtb2NrUm1jKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYmF6IiwgbGlua0Rlc2MuZ2V0QmluZGluZygiYmFyIikpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdENsYXNzRCB7CisKKyAgICAgICAgQEluamVjdExpbmsodmFsdWUgPSBURU1QTEFURV9BLCBzdHlsZSA9IEluamVjdExpbmsuU3R5bGUuUkVMQVRJVkVfUEFUSCkKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcmVzMTsKKworICAgICAgICBASW5qZWN0TGluayh2YWx1ZSA9IFRFTVBMQVRFX0EsIHN0eWxlID0gSW5qZWN0TGluay5TdHlsZS5SRUxBVElWRV9QQVRIKQorICAgICAgICBwcml2YXRlIFVSSSByZXMyOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ0xpbmsoKSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiU3RyaW5nIGxpbmsiKTsKKyAgICAgICAgRW50aXR5RGVzY3JpcHRvciBpbnN0YW5jZSA9IEVudGl0eURlc2NyaXB0b3IuZ2V0SW5zdGFuY2UoVGVzdENsYXNzRC5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBpbnN0YW5jZS5nZXRMaW5rRmllbGRzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGluc3RhbmNlLmdldE5vbkxpbmtGaWVsZHMoKS5zaXplKCkpOworICAgICAgICBJdGVyYXRvcjxGaWVsZERlc2NyaXB0b3I+IGkgPSBpbnN0YW5jZS5nZXRMaW5rRmllbGRzKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgd2hpbGUgKGkuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICBJbmplY3RMaW5rRmllbGREZXNjcmlwdG9yIGxpbmtEZXNjID0gKEluamVjdExpbmtGaWVsZERlc2NyaXB0b3IpIGkubmV4dCgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFRFTVBMQVRFX0EsIGxpbmtEZXNjLmdldExpbmtUZW1wbGF0ZShtb2NrUm1jKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRMaW5rKCkgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNldCBsaW5rIik7CisgICAgICAgIEVudGl0eURlc2NyaXB0b3IgaW5zdGFuY2UgPSBFbnRpdHlEZXNjcmlwdG9yLmdldEluc3RhbmNlKFRlc3RDbGFzc0QuY2xhc3MpOworICAgICAgICBJdGVyYXRvcjxGaWVsZERlc2NyaXB0b3I+IGkgPSBpbnN0YW5jZS5nZXRMaW5rRmllbGRzKCkuaXRlcmF0b3IoKTsKKyAgICAgICAgVGVzdENsYXNzRCB0ZXN0Q2xhc3MgPSBuZXcgVGVzdENsYXNzRCgpOworICAgICAgICB3aGlsZSAoaS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIEluamVjdExpbmtGaWVsZERlc2NyaXB0b3IgbGlua0Rlc2MgPSAoSW5qZWN0TGlua0ZpZWxkRGVzY3JpcHRvcikgaS5uZXh0KCk7CisgICAgICAgICAgICBVUkkgdmFsdWUgPSBVcmlCdWlsZGVyLmZyb21QYXRoKGxpbmtEZXNjLmdldExpbmtUZW1wbGF0ZShtb2NrUm1jKSkuYnVpbGQoKTsKKyAgICAgICAgICAgIGxpbmtEZXNjLnNldFByb3BlcnR5VmFsdWUodGVzdENsYXNzLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRFTVBMQVRFX0EsIHRlc3RDbGFzcy5yZXMxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRFTVBMQVRFX0EsIHRlc3RDbGFzcy5yZXMyLnRvU3RyaW5nKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL0ZpZWxkUHJvY2Vzc29yVGVzdC5qYXZhIGIvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL0ZpZWxkUHJvY2Vzc29yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYWZlYmEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xpbmtpbmcvRmllbGRQcm9jZXNzb3JUZXN0LmphdmEKQEAgLTAsMCArMSw4NTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubGlua2luZzsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5GaWx0ZXI7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hSZXN1bHQ7CitpbXBvcnQgamF2YS51dGlsLnppcC5aaXBFbnRyeTsKK2ltcG9ydCBqYXZheC53cy5ycy5CZWFuUGFyYW07CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTGluazsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUGF0aFNlZ21lbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUcmFuc2llbnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uTXVsdGl2YWx1ZWRTdHJpbmdNYXA7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubGlua2luZy5jb250cmlidXRpbmcuUmVzb3VyY2VMaW5rQ29udHJpYnV0aW9uQ29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5saW5raW5nLm1hcHBpbmcuUmVzb3VyY2VNYXBwaW5nQ29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuRXh0ZW5kZWRVcmlJbmZvOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNZXRob2Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJ1bnRpbWVSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS51cmkuVXJpVGVtcGxhdGU7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBAYXV0aG9yIE1hcmsgSGFkbGV5CisgKiBAYXV0aG9yIEdlcmFyZCBEYXZpc29uIChnZXJhcmQuZGF2aXNvbiBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgRmllbGRQcm9jZXNzb3JUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKEZpZWxkUHJvY2Vzc29yLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBFeHRlbmRlZFVyaUluZm8gbW9ja1VyaUluZm8gPSBuZXcgRXh0ZW5kZWRVcmlJbmZvKCkgeworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBiYXNlVVJJID0gImh0dHA6Ly9leGFtcGxlLmNvbS9hcHBsaWNhdGlvbi9yZXNvdXJjZXMiOworCisgICAgICAgIHByaXZhdGUgTXVsdGl2YWx1ZWRNYXAgcXVlcnlQYXJhbXMgPSBuZXcgTXVsdGl2YWx1ZWRTdHJpbmdNYXAoKTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIHlldC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoYm9vbGVhbiBkZWNvZGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCB5ZXQuIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIExpc3Q8UGF0aFNlZ21lbnQ+IGdldFBhdGhTZWdtZW50cygpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCB5ZXQuIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIExpc3Q8UGF0aFNlZ21lbnQ+IGdldFBhdGhTZWdtZW50cyhib29sZWFuIGRlY29kZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIHlldC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVVJJIGdldFJlcXVlc3RVcmkoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgeWV0LiIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBVcmlCdWlsZGVyIGdldFJlcXVlc3RVcmlCdWlsZGVyKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIHlldC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVVJJIGdldEFic29sdXRlUGF0aCgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCB5ZXQuIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFVyaUJ1aWxkZXIgZ2V0QWJzb2x1dGVQYXRoQnVpbGRlcigpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCB5ZXQuIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFVSSSBnZXRCYXNlVXJpKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEJhc2VVcmlCdWlsZGVyKCkuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVXJpQnVpbGRlciBnZXRCYXNlVXJpQnVpbGRlcigpIHsKKyAgICAgICAgICAgIHJldHVybiBVcmlCdWlsZGVyLmZyb21VcmkoYmFzZVVSSSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBnZXRQYXRoUGFyYW1ldGVycygpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTXVsdGl2YWx1ZWRTdHJpbmdNYXAoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFBhdGhQYXJhbWV0ZXJzKGJvb2xlYW4gZGVjb2RlKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE11bHRpdmFsdWVkU3RyaW5nTWFwKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBnZXRRdWVyeVBhcmFtZXRlcnMoKSB7CisgICAgICAgICAgICByZXR1cm4gcXVlcnlQYXJhbXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBnZXRRdWVyeVBhcmFtZXRlcnMoYm9vbGVhbiBkZWNvZGUpIHsKKyAgICAgICAgICAgIHJldHVybiBxdWVyeVBhcmFtczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldE1hdGNoZWRVUklzKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIHlldC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldE1hdGNoZWRVUklzKGJvb2xlYW4gZGVjb2RlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgeWV0LiIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBMaXN0PE9iamVjdD4gZ2V0TWF0Y2hlZFJlc291cmNlcygpIHsKKyAgICAgICAgICAgIE9iamVjdCBkdW1teVJlc291cmNlID0gbmV3IE9iamVjdCgpIHsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChkdW1teVJlc291cmNlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVGhyb3dhYmxlIGdldE1hcHBlZFRocm93YWJsZSgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCB5ZXQuIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIExpc3Q8TWF0Y2hSZXN1bHQ+IGdldE1hdGNoZWRSZXN1bHRzKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIHlldC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTGlzdDxVcmlUZW1wbGF0ZT4gZ2V0TWF0Y2hlZFRlbXBsYXRlcygpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCB5ZXQuIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIExpc3Q8UGF0aFNlZ21lbnQ+IGdldFBhdGhTZWdtZW50cyhTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIHlldC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTGlzdDxQYXRoU2VnbWVudD4gZ2V0UGF0aFNlZ21lbnRzKFN0cmluZyBuYW1lLCBib29sZWFuIGRlY29kZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIHlldC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTGlzdDxSdW50aW1lUmVzb3VyY2U+IGdldE1hdGNoZWRSdW50aW1lUmVzb3VyY2VzKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIHlldC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzb3VyY2VNZXRob2QgZ2V0TWF0Y2hlZFJlc291cmNlTWV0aG9kKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIHlldC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzb3VyY2UgZ2V0TWF0Y2hlZE1vZGVsUmVzb3VyY2UoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgeWV0LiIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBMaXN0PFJlc291cmNlTWV0aG9kPiBnZXRNYXRjaGVkUmVzb3VyY2VMb2NhdG9ycygpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCB5ZXQuIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIExpc3Q8UmVzb3VyY2U+IGdldExvY2F0b3JTdWJSZXNvdXJjZXMoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgeWV0LiIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBVUkkgcmVzb2x2ZShVUkkgdXJpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgeWV0LiIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBVUkkgcmVsYXRpdml6ZShVUkkgdXJpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgeWV0LiIpOworICAgICAgICB9CisgICAgfTsKKworICAgIHByaXZhdGUgZmluYWwgUmVzb3VyY2VNYXBwaW5nQ29udGV4dCBtb2NrUm1jID0gbmV3IFJlc291cmNlTWFwcGluZ0NvbnRleHQoKSB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNvdXJjZU1hcHBpbmdDb250ZXh0Lk1hcHBpbmcgZ2V0TWFwcGluZyhDbGFzczw/PiByZXNvdXJjZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJvdGVjdGVkIGZpbmFsIFJlc291cmNlTGlua0NvbnRyaWJ1dGlvbkNvbnRleHQgbW9ja1JsY2MgPSBuZXcgUmVzb3VyY2VMaW5rQ29udHJpYnV0aW9uQ29udGV4dCgpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBMaXN0PFByb3ZpZGVMaW5rRGVzY3JpcHRvcj4gZ2V0Q29udHJpYnV0b3JzRm9yKENsYXNzPD8+IGVudGl0eUNsYXNzKSB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFTVBMQVRFX0EgPSAiZm9vIjsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdENsYXNzRCB7CisKKyAgICAgICAgQEluamVjdExpbmsodmFsdWUgPSBURU1QTEFURV9BLCBzdHlsZSA9IEluamVjdExpbmsuU3R5bGUuUkVMQVRJVkVfUEFUSCkKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcmVzMTsKKworICAgICAgICBASW5qZWN0TGluayh2YWx1ZSA9IFRFTVBMQVRFX0EsIHN0eWxlID0gSW5qZWN0TGluay5TdHlsZS5SRUxBVElWRV9QQVRIKQorICAgICAgICBwcml2YXRlIFVSSSByZXMyOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByb2Nlc3NMaW5rcygpIHsKKyAgICAgICAgTE9HLmluZm8oIkxpbmtzIik7CisKKyAgICAgICAgRmllbGRQcm9jZXNzb3I8VGVzdENsYXNzRD4gaW5zdGFuY2UgPSBuZXcgRmllbGRQcm9jZXNzb3IoVGVzdENsYXNzRC5jbGFzcyk7CisgICAgICAgIFRlc3RDbGFzc0QgdGVzdENsYXNzID0gbmV3IFRlc3RDbGFzc0QoKTsKKyAgICAgICAgaW5zdGFuY2UucHJvY2Vzc0xpbmtzKHRlc3RDbGFzcywgbW9ja1VyaUluZm8sIG1vY2tSbWMsIG1vY2tSbGNjKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRFTVBMQVRFX0EsIHRlc3RDbGFzcy5yZXMxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRFTVBMQVRFX0EsIHRlc3RDbGFzcy5yZXMyLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QTEFURV9CID0gIndpZGdldHMve2lkfSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RDbGFzc0UgeworCisgICAgICAgIEBJbmplY3RMaW5rKHZhbHVlID0gVEVNUExBVEVfQiwgc3R5bGUgPSBJbmplY3RMaW5rLlN0eWxlLlJFTEFUSVZFX1BBVEgpCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGxpbms7CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgaWQ7CisKKyAgICAgICAgcHVibGljIFRlc3RDbGFzc0UoU3RyaW5nIGlkKSB7CisgICAgICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgeworICAgICAgICAgICAgcmV0dXJuIGlkOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvY2Vzc0xpbmtzV2l0aEZpZWxkcygpIHsKKyAgICAgICAgTE9HLmluZm8oIkxpbmtzIGZyb20gZmllbGQgdmFsdWVzIik7CisgICAgICAgIEZpZWxkUHJvY2Vzc29yPFRlc3RDbGFzc0U+IGluc3RhbmNlID0gbmV3IEZpZWxkUHJvY2Vzc29yKFRlc3RDbGFzc0UuY2xhc3MpOworICAgICAgICBUZXN0Q2xhc3NFIHRlc3RDbGFzcyA9IG5ldyBUZXN0Q2xhc3NFKCIxMCIpOworICAgICAgICBpbnN0YW5jZS5wcm9jZXNzTGlua3ModGVzdENsYXNzLCBtb2NrVXJpSW5mbywgbW9ja1JtYywgbW9ja1JsY2MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIndpZGdldHMvMTAiLCB0ZXN0Q2xhc3MubGluayk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0Q2xhc3NGIHsKKworICAgICAgICBASW5qZWN0TGluayh2YWx1ZSA9IFRFTVBMQVRFX0IsIHN0eWxlID0gSW5qZWN0TGluay5TdHlsZS5SRUxBVElWRV9QQVRIKQorICAgICAgICBwcml2YXRlIFN0cmluZyB0aGVsaW5rOworCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGlkOworICAgICAgICBwcml2YXRlIFRlc3RDbGFzc0UgbmVzdGVkOworCisgICAgICAgIHB1YmxpYyBUZXN0Q2xhc3NGKFN0cmluZyBpZCwgVGVzdENsYXNzRSBlKSB7CisgICAgICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgICAgICAgICB0aGlzLm5lc3RlZCA9IGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgeworICAgICAgICAgICAgcmV0dXJuIGlkOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmVzdGluZygpIHsKKyAgICAgICAgTE9HLmluZm8oIk5lc3RpbmciKTsKKyAgICAgICAgRmllbGRQcm9jZXNzb3I8VGVzdENsYXNzRj4gaW5zdGFuY2UgPSBuZXcgRmllbGRQcm9jZXNzb3IoVGVzdENsYXNzRi5jbGFzcyk7CisgICAgICAgIFRlc3RDbGFzc0UgbmVzdGVkID0gbmV3IFRlc3RDbGFzc0UoIjEwIik7CisgICAgICAgIFRlc3RDbGFzc0YgdGVzdENsYXNzID0gbmV3IFRlc3RDbGFzc0YoIjIwIiwgbmVzdGVkKTsKKyAgICAgICAgaW5zdGFuY2UucHJvY2Vzc0xpbmtzKHRlc3RDbGFzcywgbW9ja1VyaUluZm8sIG1vY2tSbWMsIG1vY2tSbGNjKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3aWRnZXRzLzIwIiwgdGVzdENsYXNzLnRoZWxpbmspOworICAgICAgICBhc3NlcnRFcXVhbHMoIndpZGdldHMvMTAiLCB0ZXN0Q2xhc3MubmVzdGVkLmxpbmspOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFycmF5KCkgeworICAgICAgICBMT0cuaW5mbygiQXJyYXkiKTsKKyAgICAgICAgRmllbGRQcm9jZXNzb3I8VGVzdENsYXNzRVtdPiBpbnN0YW5jZSA9IG5ldyBGaWVsZFByb2Nlc3NvcihUZXN0Q2xhc3NFW10uY2xhc3MpOworICAgICAgICBUZXN0Q2xhc3NFIGl0ZW0xID0gbmV3IFRlc3RDbGFzc0UoIjEwIik7CisgICAgICAgIFRlc3RDbGFzc0UgaXRlbTIgPSBuZXcgVGVzdENsYXNzRSgiMjAiKTsKKyAgICAgICAgVGVzdENsYXNzRSBhcnJheVtdID0ge2l0ZW0xLCBpdGVtMn07CisgICAgICAgIGluc3RhbmNlLnByb2Nlc3NMaW5rcyhhcnJheSwgbW9ja1VyaUluZm8sIG1vY2tSbWMsIG1vY2tSbGNjKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3aWRnZXRzLzEwIiwgYXJyYXlbMF0ubGluayk7CisgICAgICAgIGFzc2VydEVxdWFscygid2lkZ2V0cy8yMCIsIGFycmF5WzFdLmxpbmspOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbGxlY3Rpb24oKSB7CisgICAgICAgIExPRy5pbmZvKCJDb2xsZWN0aW9uIik7CisgICAgICAgIEZpZWxkUHJvY2Vzc29yPExpc3Q+IGluc3RhbmNlID0gbmV3IEZpZWxkUHJvY2Vzc29yKExpc3QuY2xhc3MpOworICAgICAgICBUZXN0Q2xhc3NFIGl0ZW0xID0gbmV3IFRlc3RDbGFzc0UoIjEwIik7CisgICAgICAgIFRlc3RDbGFzc0UgaXRlbTIgPSBuZXcgVGVzdENsYXNzRSgiMjAiKTsKKyAgICAgICAgTGlzdDxUZXN0Q2xhc3NFPiBsaXN0ID0gQXJyYXlzLmFzTGlzdChpdGVtMSwgaXRlbTIpOworICAgICAgICBpbnN0YW5jZS5wcm9jZXNzTGlua3MobGlzdCwgbW9ja1VyaUluZm8sIG1vY2tSbWMsIG1vY2tSbGNjKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3aWRnZXRzLzEwIiwgbGlzdC5nZXQoMCkubGluayk7CisgICAgICAgIGFzc2VydEVxdWFscygid2lkZ2V0cy8yMCIsIGxpc3QuZ2V0KDEpLmxpbmspOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hcCgpIHsKKyAgICAgICAgTE9HLmluZm8oIk1hcCIpOworICAgICAgICBGaWVsZFByb2Nlc3NvcjxNYXA+IGluc3RhbmNlID0gbmV3IEZpZWxkUHJvY2Vzc29yKE1hcC5jbGFzcyk7CisgICAgICAgIFRlc3RDbGFzc0UgaXRlbTEgPSBuZXcgVGVzdENsYXNzRSgiMTAiKTsKKyAgICAgICAgVGVzdENsYXNzRSBpdGVtMiA9IG5ldyBUZXN0Q2xhc3NFKCIyMCIpOworICAgICAgICBNYXA8U3RyaW5nLCBUZXN0Q2xhc3NFPiBtYXAgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIGZvciAoVGVzdENsYXNzRSBpdGVtIDogQXJyYXlzLmFzTGlzdChpdGVtMSwgaXRlbTIpKSB7CisgICAgICAgICAgICBtYXAucHV0KGl0ZW0uZ2V0SWQoKSwgaXRlbSk7CisgICAgICAgIH0KKyAgICAgICAgaW5zdGFuY2UucHJvY2Vzc0xpbmtzKG1hcCwgbW9ja1VyaUluZm8sIG1vY2tSbWMsIG1vY2tSbGNjKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3aWRnZXRzLzEwIiwgbWFwLmdldCgiMTAiKS5saW5rKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3aWRnZXRzLzIwIiwgbWFwLmdldCgiMjAiKS5saW5rKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RDbGFzc0cgeworCisgICAgICAgIEBJbmplY3RMaW5rKHZhbHVlID0gVEVNUExBVEVfQiwgc3R5bGUgPSBJbmplY3RMaW5rLlN0eWxlLlJFTEFUSVZFX1BBVEgpCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHJlbGF0aXZlUGF0aDsKKworICAgICAgICBASW5qZWN0TGluayh2YWx1ZSA9IFRFTVBMQVRFX0IsIHN0eWxlID0gSW5qZWN0TGluay5TdHlsZS5BQlNPTFVURV9QQVRIKQorICAgICAgICBwcml2YXRlIFN0cmluZyBhYnNvbHV0ZVBhdGg7CisKKyAgICAgICAgQEluamVjdExpbmsodmFsdWUgPSBURU1QTEFURV9CLCBzdHlsZSA9IEluamVjdExpbmsuU3R5bGUuQUJTT0xVVEUpCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGFic29sdXRlOworCisgICAgICAgIEBJbmplY3RMaW5rKFRFTVBMQVRFX0IpCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGRlZmF1bHRTdHlsZTsKKworICAgICAgICBwcml2YXRlIFN0cmluZyBpZDsKKworICAgICAgICBwdWJsaWMgVGVzdENsYXNzRyhTdHJpbmcgaWQpIHsKKyAgICAgICAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisgICAgICAgICAgICByZXR1cm4gaWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMaW5rU3R5bGVzKCkgeworICAgICAgICBMT0cuaW5mbygiTGluayBzdHlsZXMiKTsKKyAgICAgICAgRmllbGRQcm9jZXNzb3I8VGVzdENsYXNzRz4gaW5zdGFuY2UgPSBuZXcgRmllbGRQcm9jZXNzb3IoVGVzdENsYXNzRy5jbGFzcyk7CisgICAgICAgIFRlc3RDbGFzc0cgdGVzdENsYXNzID0gbmV3IFRlc3RDbGFzc0coIjEwIik7CisgICAgICAgIGluc3RhbmNlLnByb2Nlc3NMaW5rcyh0ZXN0Q2xhc3MsIG1vY2tVcmlJbmZvLCBtb2NrUm1jLCBtb2NrUmxjYyk7CisgICAgICAgIGFzc2VydEVxdWFscygid2lkZ2V0cy8xMCIsIHRlc3RDbGFzcy5yZWxhdGl2ZVBhdGgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9hcHBsaWNhdGlvbi9yZXNvdXJjZXMvd2lkZ2V0cy8xMCIsIHRlc3RDbGFzcy5hYnNvbHV0ZVBhdGgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9hcHBsaWNhdGlvbi9yZXNvdXJjZXMvd2lkZ2V0cy8xMCIsIHRlc3RDbGFzcy5kZWZhdWx0U3R5bGUpOworICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9leGFtcGxlLmNvbS9hcHBsaWNhdGlvbi9yZXNvdXJjZXMvd2lkZ2V0cy8xMCIsIHRlc3RDbGFzcy5hYnNvbHV0ZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0Q2xhc3NIIHsKKworICAgICAgICBASW5qZWN0TGluayhURU1QTEFURV9CKQorICAgICAgICBwcml2YXRlIFN0cmluZyBsaW5rOworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisgICAgICAgICAgICByZXR1cm4gIjEwIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbXB1dGVkUHJvcGVydHkoKSB7CisgICAgICAgIExPRy5pbmZvKCJDb21wdXRlZCBwcm9wZXJ0eSIpOworICAgICAgICBGaWVsZFByb2Nlc3NvcjxUZXN0Q2xhc3NIPiBpbnN0YW5jZSA9IG5ldyBGaWVsZFByb2Nlc3NvcihUZXN0Q2xhc3NILmNsYXNzKTsKKyAgICAgICAgVGVzdENsYXNzSCB0ZXN0Q2xhc3MgPSBuZXcgVGVzdENsYXNzSCgpOworICAgICAgICBpbnN0YW5jZS5wcm9jZXNzTGlua3ModGVzdENsYXNzLCBtb2NrVXJpSW5mbywgbW9ja1JtYywgbW9ja1JsY2MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9hcHBsaWNhdGlvbi9yZXNvdXJjZXMvd2lkZ2V0cy8xMCIsIHRlc3RDbGFzcy5saW5rKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RDbGFzc0kgeworCisgICAgICAgIEBJbmplY3RMaW5rKCJ3aWRnZXRzLyR7ZW50aXR5LmlkfSIpCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGxpbms7CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiMTAiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RUwoKSB7CisgICAgICAgIExPRy5pbmZvKCJFbCBsaW5rIik7CisgICAgICAgIEZpZWxkUHJvY2Vzc29yPFRlc3RDbGFzc0k+IGluc3RhbmNlID0gbmV3IEZpZWxkUHJvY2Vzc29yKFRlc3RDbGFzc0kuY2xhc3MpOworICAgICAgICBUZXN0Q2xhc3NJIHRlc3RDbGFzcyA9IG5ldyBUZXN0Q2xhc3NJKCk7CisgICAgICAgIGluc3RhbmNlLnByb2Nlc3NMaW5rcyh0ZXN0Q2xhc3MsIG1vY2tVcmlJbmZvLCBtb2NrUm1jLCBtb2NrUmxjYyk7CisgICAgICAgIGFzc2VydEVxdWFscygiL2FwcGxpY2F0aW9uL3Jlc291cmNlcy93aWRnZXRzLzEwIiwgdGVzdENsYXNzLmxpbmspOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdENsYXNzSiB7CisKKyAgICAgICAgQEluamVjdExpbmsoIndpZGdldHMvJHtlbnRpdHkuaWR9L3dpZGdldC97aWR9IikKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbGluazsKKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgeworICAgICAgICAgICAgcmV0dXJuICIxMCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNaXhlZCgpIHsKKyAgICAgICAgTE9HLmluZm8oIk1peGVkIEVMIGFuZCB0ZW1wbGF0ZSB2YXJzIGxpbmsiKTsKKyAgICAgICAgRmllbGRQcm9jZXNzb3I8VGVzdENsYXNzSj4gaW5zdGFuY2UgPSBuZXcgRmllbGRQcm9jZXNzb3IoVGVzdENsYXNzSi5jbGFzcyk7CisgICAgICAgIFRlc3RDbGFzc0ogdGVzdENsYXNzID0gbmV3IFRlc3RDbGFzc0ooKTsKKyAgICAgICAgaW5zdGFuY2UucHJvY2Vzc0xpbmtzKHRlc3RDbGFzcywgbW9ja1VyaUluZm8sIG1vY2tSbWMsIG1vY2tSbGNjKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvYXBwbGljYXRpb24vcmVzb3VyY2VzL3dpZGdldHMvMTAvd2lkZ2V0LzEwIiwgdGVzdENsYXNzLmxpbmspOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGVwZW5kZW50SW5uZXJCZWFuIHsKKworICAgICAgICBASW5qZWN0TGluaygiJHtlbnRpdHkuaWR9IikKKyAgICAgICAgcHVibGljIFN0cmluZyBvdXRlclVyaTsKKyAgICAgICAgQEluamVjdExpbmsoIiR7aW5zdGFuY2UuaWR9IikKKyAgICAgICAgcHVibGljIFN0cmluZyBpbm5lclVyaTsKKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgeworICAgICAgICAgICAgcmV0dXJuICJpbm5lciI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE91dGVyQmVhbiB7CisKKyAgICAgICAgcHVibGljIERlcGVuZGVudElubmVyQmVhbiBpbm5lciA9IG5ldyBEZXBlbmRlbnRJbm5lckJlYW4oKTsKKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgeworICAgICAgICAgICAgcmV0dXJuICJvdXRlciI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFTFNjb3BlcygpIHsKKyAgICAgICAgTE9HLmluZm8oIkVMIHNjb3BlcyIpOworICAgICAgICBGaWVsZFByb2Nlc3NvcjxPdXRlckJlYW4+IGluc3RhbmNlID0gbmV3IEZpZWxkUHJvY2Vzc29yKE91dGVyQmVhbi5jbGFzcyk7CisgICAgICAgIE91dGVyQmVhbiB0ZXN0Q2xhc3MgPSBuZXcgT3V0ZXJCZWFuKCk7CisgICAgICAgIGluc3RhbmNlLnByb2Nlc3NMaW5rcyh0ZXN0Q2xhc3MsIG1vY2tVcmlJbmZvLCBtb2NrUm1jLCBtb2NrUmxjYyk7CisgICAgICAgIGFzc2VydEVxdWFscygiL2FwcGxpY2F0aW9uL3Jlc291cmNlcy9pbm5lciIsIHRlc3RDbGFzcy5pbm5lci5pbm5lclVyaSk7CisgICAgICAgIGFzc2VydEVxdWFscygiL2FwcGxpY2F0aW9uL3Jlc291cmNlcy9vdXRlciIsIHRlc3RDbGFzcy5pbm5lci5vdXRlclVyaSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCb3VuZExpbmtCZWFuIHsKKworICAgICAgICBASW5qZWN0TGluayh2YWx1ZSA9ICJ7aWR9IiwgYmluZGluZ3MgPSB7QEJpbmRpbmcobmFtZSA9ICJpZCIsIHZhbHVlID0gIiR7aW5zdGFuY2UubmFtZX0iKX0pCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdXJpOworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAibmFtZSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFTEJpbmRpbmcoKSB7CisgICAgICAgIExPRy5pbmZvKCJFTCBiaW5kaW5nIik7CisgICAgICAgIEZpZWxkUHJvY2Vzc29yPEJvdW5kTGlua0JlYW4+IGluc3RhbmNlID0gbmV3IEZpZWxkUHJvY2Vzc29yKEJvdW5kTGlua0JlYW4uY2xhc3MpOworICAgICAgICBCb3VuZExpbmtCZWFuIHRlc3RDbGFzcyA9IG5ldyBCb3VuZExpbmtCZWFuKCk7CisgICAgICAgIGluc3RhbmNlLnByb2Nlc3NMaW5rcyh0ZXN0Q2xhc3MsIG1vY2tVcmlJbmZvLCBtb2NrUm1jLCBtb2NrUmxjYyk7CisgICAgICAgIGFzc2VydEVxdWFscygiL2FwcGxpY2F0aW9uL3Jlc291cmNlcy9uYW1lIiwgdGVzdENsYXNzLnVyaSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCb3VuZExpbmtPbkxpbmtCZWFuIHsKKworICAgICAgICBASW5qZWN0TGluayh2YWx1ZSA9ICJ7aWR9IiwKKyAgICAgICAgICAgICAgICBiaW5kaW5ncyA9IHtAQmluZGluZyhuYW1lID0gImlkIiwgdmFsdWUgPSAiJHtpbnN0YW5jZS5uYW1lfSIpfSwKKyAgICAgICAgICAgICAgICByZWwgPSAic2VsZiIpCisgICAgICAgIHB1YmxpYyBMaW5rIGxpbms7CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuICJuYW1lIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVMQmluZGluZ09uTGluaygpIHsKKyAgICAgICAgTE9HLmluZm8oIkVMIGJpbmRpbmciKTsKKyAgICAgICAgRmllbGRQcm9jZXNzb3I8Qm91bmRMaW5rT25MaW5rQmVhbj4gaW5zdGFuY2UgPSBuZXcgRmllbGRQcm9jZXNzb3IoQm91bmRMaW5rT25MaW5rQmVhbi5jbGFzcyk7CisgICAgICAgIEJvdW5kTGlua09uTGlua0JlYW4gdGVzdENsYXNzID0gbmV3IEJvdW5kTGlua09uTGlua0JlYW4oKTsKKyAgICAgICAgaW5zdGFuY2UucHJvY2Vzc0xpbmtzKHRlc3RDbGFzcywgbW9ja1VyaUluZm8sIG1vY2tSbWMsIG1vY2tSbGNjKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvYXBwbGljYXRpb24vcmVzb3VyY2VzL25hbWUiLCB0ZXN0Q2xhc3MubGluay5nZXRVcmkoKS50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzZWxmIiwgdGVzdENsYXNzLmxpbmsuZ2V0UmVsKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQm91bmRMaW5rT25MaW5rc0JlYW4geworCisgICAgICAgIEBJbmplY3RMaW5rcyh7CisgICAgICAgICAgICAgICAgQEluamVjdExpbmsodmFsdWUgPSAie2lkfSIsCisgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5ncyA9IHtAQmluZGluZyhuYW1lID0gImlkIiwgdmFsdWUgPSAiJHtpbnN0YW5jZS5uYW1lfSIpfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbCA9ICJzZWxmIiksCisgICAgICAgICAgICAgICAgQEluamVjdExpbmsodmFsdWUgPSAie2lkfSIsCisgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5ncyA9IHtAQmluZGluZyhuYW1lID0gImlkIiwgdmFsdWUgPSAiJHtpbnN0YW5jZS5uYW1lfSIpfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbCA9ICJvdGhlciIpLAorCisgICAgICAgIH0pCisgICAgICAgIHB1YmxpYyBMaXN0PExpbms+IGxpbmtzOworCisgICAgICAgIEBJbmplY3RMaW5rcyh7CisgICAgICAgICAgICAgICAgQEluamVjdExpbmsodmFsdWUgPSAie2lkfSIsCisgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5ncyA9IHtAQmluZGluZyhuYW1lID0gImlkIiwgdmFsdWUgPSAiJHtpbnN0YW5jZS5uYW1lfSIpfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbCA9ICJzZWxmIiksCisgICAgICAgICAgICAgICAgQEluamVjdExpbmsodmFsdWUgPSAie2lkfSIsCisgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5ncyA9IHtAQmluZGluZyhuYW1lID0gImlkIiwgdmFsdWUgPSAiJHtpbnN0YW5jZS5uYW1lfSIpfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbCA9ICJvdGhlciIpLAorCisgICAgICAgIH0pCisgICAgICAgIHB1YmxpYyBMaW5rW10gbGlua3NBcnJheTsKKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gIm5hbWUiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RUxCaW5kaW5nT25MaW5rcygpIHsKKyAgICAgICAgTE9HLmluZm8oIkVMIGJpbmRpbmciKTsKKyAgICAgICAgRmllbGRQcm9jZXNzb3I8Qm91bmRMaW5rT25MaW5rc0JlYW4+IGluc3RhbmNlID0gbmV3IEZpZWxkUHJvY2Vzc29yKEJvdW5kTGlua09uTGlua3NCZWFuLmNsYXNzKTsKKyAgICAgICAgQm91bmRMaW5rT25MaW5rc0JlYW4gdGVzdENsYXNzID0gbmV3IEJvdW5kTGlua09uTGlua3NCZWFuKCk7CisgICAgICAgIGluc3RhbmNlLnByb2Nlc3NMaW5rcyh0ZXN0Q2xhc3MsIG1vY2tVcmlJbmZvLCBtb2NrUm1jLCBtb2NrUmxjYyk7CisgICAgICAgIGFzc2VydEVxdWFscygiL2FwcGxpY2F0aW9uL3Jlc291cmNlcy9uYW1lIiwgdGVzdENsYXNzLmxpbmtzLmdldCgwKS5nZXRVcmkoKS50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzZWxmIiwgdGVzdENsYXNzLmxpbmtzLmdldCgwKS5nZXRSZWwoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygib3RoZXIiLCB0ZXN0Q2xhc3MubGlua3MuZ2V0KDEpLmdldFJlbCgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIi9hcHBsaWNhdGlvbi9yZXNvdXJjZXMvbmFtZSIsIHRlc3RDbGFzcy5saW5rc0FycmF5WzBdLmdldFVyaSgpLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInNlbGYiLCB0ZXN0Q2xhc3MubGlua3NBcnJheVswXS5nZXRSZWwoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygib3RoZXIiLCB0ZXN0Q2xhc3MubGlua3NBcnJheVsxXS5nZXRSZWwoKSk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbmRpdGlvbmFsTGlua0JlYW4geworCisgICAgICAgIEBJbmplY3RMaW5rKHZhbHVlID0gIntpZH0iLCBjb25kaXRpb24gPSAiJHtlbnRpdHkudXJpMUVuYWJsZWR9IikKKyAgICAgICAgcHVibGljIFN0cmluZyB1cmkxOworCisgICAgICAgIEBJbmplY3RMaW5rKHZhbHVlID0gIntpZH0iLCBjb25kaXRpb24gPSAiJHtlbnRpdHkudXJpMkVuYWJsZWR9IikKKyAgICAgICAgcHVibGljIFN0cmluZyB1cmkyOworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisgICAgICAgICAgICByZXR1cm4gIm5hbWUiOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNVcmkxRW5hYmxlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNVcmkyRW5hYmxlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbmRpdGlvbigpIHsKKyAgICAgICAgTE9HLmluZm8oIkNvbmRpdGlvbiIpOworICAgICAgICBGaWVsZFByb2Nlc3NvcjxDb25kaXRpb25hbExpbmtCZWFuPiBpbnN0YW5jZSA9IG5ldyBGaWVsZFByb2Nlc3NvcihDb25kaXRpb25hbExpbmtCZWFuLmNsYXNzKTsKKyAgICAgICAgQ29uZGl0aW9uYWxMaW5rQmVhbiB0ZXN0Q2xhc3MgPSBuZXcgQ29uZGl0aW9uYWxMaW5rQmVhbigpOworICAgICAgICBpbnN0YW5jZS5wcm9jZXNzTGlua3ModGVzdENsYXNzLCBtb2NrVXJpSW5mbywgbW9ja1JtYywgbW9ja1JsY2MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9hcHBsaWNhdGlvbi9yZXNvdXJjZXMvbmFtZSIsIHRlc3RDbGFzcy51cmkxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIHRlc3RDbGFzcy51cmkyKTsKKyAgICB9CisKKyAgICBAUGF0aCgiYSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdWJSZXNvdXJjZSB7CisKKyAgICAgICAgQFBhdGgoImIiKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QigpIHsKKyAgICAgICAgICAgIHJldHVybiAiaGVsbG8gd29ybGQiOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdWJSZXNvdXJjZUJlYW4geworCisgICAgICAgIEBJbmplY3RMaW5rKHJlc291cmNlID0gU3ViUmVzb3VyY2UuY2xhc3MsIG1ldGhvZCA9ICJnZXRCIikKKyAgICAgICAgcHVibGljIFN0cmluZyB1cmk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3VicmVzb3VyY2UoKSB7CisgICAgICAgIExPRy5pbmZvKCJTdWJyZXNvdXJjZSIpOworICAgICAgICBGaWVsZFByb2Nlc3NvcjxTdWJSZXNvdXJjZUJlYW4+IGluc3RhbmNlID0gbmV3IEZpZWxkUHJvY2Vzc29yKFN1YlJlc291cmNlQmVhbi5jbGFzcyk7CisgICAgICAgIFN1YlJlc291cmNlQmVhbiB0ZXN0Q2xhc3MgPSBuZXcgU3ViUmVzb3VyY2VCZWFuKCk7CisgICAgICAgIGluc3RhbmNlLnByb2Nlc3NMaW5rcyh0ZXN0Q2xhc3MsIG1vY2tVcmlJbmZvLCBtb2NrUm1jLCBtb2NrUmxjYyk7CisgICAgICAgIGFzc2VydEVxdWFscygiL2FwcGxpY2F0aW9uL3Jlc291cmNlcy9hL2IiLCB0ZXN0Q2xhc3MudXJpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiYSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBRdWVyeVJlc291cmNlIHsKKworICAgICAgICBAUGF0aCgiYiIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRCKEBRdWVyeVBhcmFtKCJxdWVyeSIpIFN0cmluZyBxdWVyeSwgQFF1ZXJ5UGFyYW0oInF1ZXJ5MiIpIFN0cmluZyBxdWVyeTIpIHsKKyAgICAgICAgICAgIHJldHVybiAiaGVsbG8gd29ybGQiOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBRdWVyeVJlc291cmNlQmVhbiB7CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRRdWVyeVBhcmFtKCkgeworICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5RXhhbXBsZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHF1ZXJ5RXhhbXBsZTsKKworICAgICAgICBwdWJsaWMgUXVlcnlSZXNvdXJjZUJlYW4oU3RyaW5nIHF1ZXJ5RXhhbXBsZSwgU3RyaW5nIHF1ZXJ5RXhhbXBsZTIpIHsKKyAgICAgICAgICAgIHRoaXMucXVlcnlFeGFtcGxlID0gcXVlcnlFeGFtcGxlOworICAgICAgICAgICAgdGhpcy5xdWVyeUV4YW1wbGUyID0gcXVlcnlFeGFtcGxlMjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UXVlcnlQYXJhbTIoKSB7CisgICAgICAgICAgICByZXR1cm4gcXVlcnlFeGFtcGxlMjsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHF1ZXJ5RXhhbXBsZTI7CisKKyAgICAgICAgQEluamVjdExpbmsocmVzb3VyY2UgPSBRdWVyeVJlc291cmNlLmNsYXNzLCBtZXRob2QgPSAiZ2V0QiIsCisgICAgICAgICAgICAgICAgYmluZGluZ3MgPSB7CisgICAgICAgICAgICAgICAgICAgICAgICBAQmluZGluZyhuYW1lID0gInF1ZXJ5IiwgdmFsdWUgPSAiJHtpbnN0YW5jZS5xdWVyeVBhcmFtfSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgQEJpbmRpbmcobmFtZSA9ICJxdWVyeTIiLCB2YWx1ZSA9ICIke2luc3RhbmNlLnF1ZXJ5UGFyYW0yfSIpCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgcHVibGljIFN0cmluZyB1cmk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBRdWVyeVJlc291cmNlQmVhbk5vQmluZGluZ3MgeworICAgICAgICAvL3F1ZXJ5IHBhcmFtZXRlcnMgd2lsbCBiZSBwb3B1bGF0ZWQgZnJvbSB1cmlJbmZvCisgICAgICAgIC8vSkVSU0VZLTI4NjMKKyAgICAgICAgQEluamVjdExpbmsocmVzb3VyY2UgPSBRdWVyeVJlc291cmNlLmNsYXNzLCBtZXRob2QgPSAiZ2V0QiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdXJpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFF1ZXJ5UmVzb3VyY2UoKSB7CisgICAgICAgIExPRy5pbmZvKCJRdWVyeVJlc291cmNlIik7CisgICAgICAgIEZpZWxkUHJvY2Vzc29yPFF1ZXJ5UmVzb3VyY2VCZWFuPiBpbnN0YW5jZSA9IG5ldyBGaWVsZFByb2Nlc3NvcihRdWVyeVJlc291cmNlQmVhbi5jbGFzcyk7CisgICAgICAgIFF1ZXJ5UmVzb3VyY2VCZWFuIHRlc3RDbGFzcyA9IG5ldyBRdWVyeVJlc291cmNlQmVhbigicXVlcnlFeGFtcGxlIiwgbnVsbCk7CisgICAgICAgIGluc3RhbmNlLnByb2Nlc3NMaW5rcyh0ZXN0Q2xhc3MsIG1vY2tVcmlJbmZvLCBtb2NrUm1jLCBtb2NrUmxjYyk7CisgICAgICAgIGFzc2VydEVxdWFscygiL2FwcGxpY2F0aW9uL3Jlc291cmNlcy9hL2I/cXVlcnk9cXVlcnlFeGFtcGxlJnF1ZXJ5Mj0iLCB0ZXN0Q2xhc3MudXJpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REb3VibGVRdWVyeVJlc291cmNlKCkgeworICAgICAgICBMT0cuaW5mbygiUXVlcnlSZXNvdXJjZSIpOworICAgICAgICBGaWVsZFByb2Nlc3NvcjxRdWVyeVJlc291cmNlQmVhbj4gaW5zdGFuY2UgPSBuZXcgRmllbGRQcm9jZXNzb3IoUXVlcnlSZXNvdXJjZUJlYW4uY2xhc3MpOworICAgICAgICBRdWVyeVJlc291cmNlQmVhbiB0ZXN0Q2xhc3MgPSBuZXcgUXVlcnlSZXNvdXJjZUJlYW4oInF1ZXJ5RXhhbXBsZSIsICJxdWVyeUV4YW1wbGUyIik7CisgICAgICAgIGluc3RhbmNlLnByb2Nlc3NMaW5rcyh0ZXN0Q2xhc3MsIG1vY2tVcmlJbmZvLCBtb2NrUm1jLCBtb2NrUmxjYyk7CisgICAgICAgIGFzc2VydEVxdWFscygiL2FwcGxpY2F0aW9uL3Jlc291cmNlcy9hL2I/cXVlcnk9cXVlcnlFeGFtcGxlJnF1ZXJ5Mj1xdWVyeUV4YW1wbGUyIiwgdGVzdENsYXNzLnVyaSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UXVlcnlSZXNvdXJjZVdpdGhvdXRCaW5kaW5ncygpIHsKKyAgICAgICAgTE9HLmluZm8oIlF1ZXJ5UmVzb3VyY2UiKTsKKyAgICAgICAgRmllbGRQcm9jZXNzb3I8UXVlcnlSZXNvdXJjZUJlYW5Ob0JpbmRpbmdzPiBpbnN0YW5jZSA9IG5ldyBGaWVsZFByb2Nlc3NvcihRdWVyeVJlc291cmNlQmVhbk5vQmluZGluZ3MuY2xhc3MpOworICAgICAgICBRdWVyeVJlc291cmNlQmVhbk5vQmluZGluZ3MgdGVzdENsYXNzID0gbmV3IFF1ZXJ5UmVzb3VyY2VCZWFuTm9CaW5kaW5ncygpOworICAgICAgICBtb2NrVXJpSW5mby5nZXRRdWVyeVBhcmFtZXRlcnMoKS5wdXRTaW5nbGUoInF1ZXJ5IiwgInF1ZXJ5RXhhbXBsZSIpOworICAgICAgICBtb2NrVXJpSW5mby5nZXRRdWVyeVBhcmFtZXRlcnMoKS5wdXRTaW5nbGUoInF1ZXJ5MiIsICJxdWVyeUV4YW1wbGUyIik7CisgICAgICAgIGFzc2VydEVxdWFscygicXVlcnlFeGFtcGxlIiwgbW9ja1VyaUluZm8uZ2V0UXVlcnlQYXJhbWV0ZXJzKCkuZ2V0Rmlyc3QoInF1ZXJ5IikpOworICAgICAgICBpbnN0YW5jZS5wcm9jZXNzTGlua3ModGVzdENsYXNzLCBtb2NrVXJpSW5mbywgbW9ja1JtYywgbW9ja1JsY2MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9hcHBsaWNhdGlvbi9yZXNvdXJjZXMvYS9iP3F1ZXJ5PXF1ZXJ5RXhhbXBsZSZxdWVyeTI9cXVlcnlFeGFtcGxlMiIsIHRlc3RDbGFzcy51cmkpOworICAgICAgICAvL2NsZWFuIG1vY2sKKyAgICAgICAgbW9ja1VyaUluZm8uZ2V0UXVlcnlQYXJhbWV0ZXJzKCkuY2xlYXIoKTsKKyAgICB9CisKKyAgICAvKiogQmVhbiBwYXJhbSB3aXRoIG1ldGhvZCBzZXR0ZXIgUXVlcnlQYXJhbS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJlYW5QYXJhbUJlYW5BIHsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcXBhcmFtOworICAgICAgICBAUXVlcnlQYXJhbSgicXBhcmFtIikKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UVBhcmFtKFN0cmluZyBxcGFyYW0pIHsKKyAgICAgICAgICAgIHRoaXMucXBhcmFtID0gcXBhcmFtOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqIEJlYW4gcGFyYW0gd2l0aCBmaWVsZCBRdWVyeVBhcmFtLiAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQmVhblBhcmFtQmVhbkIgeworICAgICAgICBAUXVlcnlQYXJhbSgicXVlcnkiKSBwdWJsaWMgU3RyaW5nIHF1ZXJ5OworICAgIH0KKworICAgIEBQYXRoKCJhIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJlYW5QYXJhbVF1ZXJ5UmVzb3VyY2UgeworCisgICAgICAgIEBQYXRoKCJiIikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEIoQEJlYW5QYXJhbSBCZWFuUGFyYW1CZWFuQSBiZWFuUGFyYW1CZWFuQSwgQEJlYW5QYXJhbSBCZWFuUGFyYW1CZWFuQiBiZWFuUGFyYW1CZWFuQikgeworICAgICAgICAgICAgcmV0dXJuICJoZWxsbyB3b3JsZCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJlYW5QYXJhbVJlc291cmNlQmVhbiB7CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRRdWVyeVBhcmFtKCkgeworICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5RXhhbXBsZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHF1ZXJ5RXhhbXBsZTsKKworICAgICAgICBwdWJsaWMgQmVhblBhcmFtUmVzb3VyY2VCZWFuKFN0cmluZyBxdWVyeUV4YW1wbGUpIHsKKyAgICAgICAgICAgIHRoaXMucXVlcnlFeGFtcGxlID0gcXVlcnlFeGFtcGxlOworICAgICAgICB9CisKKyAgICAgICAgQEluamVjdExpbmsocmVzb3VyY2UgPSBCZWFuUGFyYW1RdWVyeVJlc291cmNlLmNsYXNzLCBtZXRob2QgPSAiZ2V0QiIsCisgICAgICAgICAgICAgICAgYmluZGluZ3MgPSB7CisgICAgICAgICAgICAgICAgICAgICAgICBAQmluZGluZyhuYW1lID0gInF1ZXJ5IiwgdmFsdWUgPSAiJHtpbnN0YW5jZS5xdWVyeVBhcmFtfSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgQEJpbmRpbmcobmFtZSA9ICJxcGFyYW0iLCB2YWx1ZSA9ICJmb28iKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdXJpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJlYW5QYXJhbVJlc291cmNlKCkgeworICAgICAgICBMT0cuaW5mbygiQmVhblBhcmFtUmVzb3VyY2UiKTsKKyAgICAgICAgRmllbGRQcm9jZXNzb3I8QmVhblBhcmFtUmVzb3VyY2VCZWFuPiBpbnN0YW5jZSA9IG5ldyBGaWVsZFByb2Nlc3NvcihCZWFuUGFyYW1SZXNvdXJjZUJlYW4uY2xhc3MpOworICAgICAgICBCZWFuUGFyYW1SZXNvdXJjZUJlYW4gdGVzdENsYXNzID0gbmV3IEJlYW5QYXJhbVJlc291cmNlQmVhbigicXVlcnlFeGFtcGxlIik7CisgICAgICAgIGluc3RhbmNlLnByb2Nlc3NMaW5rcyh0ZXN0Q2xhc3MsIG1vY2tVcmlJbmZvLCBtb2NrUm1jLCBtb2NrUmxjYyk7CisgICAgICAgIGFzc2VydEVxdWFscygiL2FwcGxpY2F0aW9uL3Jlc291cmNlcy9hL2I/cXBhcmFtPWZvbyZxdWVyeT1xdWVyeUV4YW1wbGUiLCB0ZXN0Q2xhc3MudXJpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RDbGFzc0sgeworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgWmlwRW50cnkgemlwRW50cnkgPSBuZXcgWmlwRW50cnkoImVudHJ5Iik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0Q2xhc3NMIHsKKworICAgICAgICBwdWJsaWMgZmluYWwgWmlwRW50cnkgemlwRW50cnkgPSBuZXcgWmlwRW50cnkoImVudHJ5Iik7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBMb2dnaW5nRmlsdGVyIGltcGxlbWVudHMgRmlsdGVyIHsKKworICAgICAgICBwcml2YXRlIGludCBjb3VudCA9IDA7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0xvZ2dhYmxlKExvZ1JlY29yZCBsb2dSZWNvcmQpIHsKKyAgICAgICAgICAgIGlmIChsb2dSZWNvcmQuZ2V0VGhyb3duKCkgaW5zdGFuY2VvZiBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7CisgICAgICAgICAgICByZXR1cm4gY291bnQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RLTCgpIHsKKyAgICAgICAgZmluYWwgTG9nZ2luZ0ZpbHRlciBsZiA9IG5ldyBMb2dnaW5nRmlsdGVyKCk7CisKKyAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihGaWVsZERlc2NyaXB0b3IuY2xhc3MuZ2V0TmFtZSgpKS5zZXRGaWx0ZXIobGYpOworICAgICAgICBhc3NlcnRUcnVlKGxmLmdldENvdW50KCkgPT0gMCk7CisKKyAgICAgICAgRmllbGRQcm9jZXNzb3I8VGVzdENsYXNzSz4gaW5zdGFuY2VLID0gbmV3IEZpZWxkUHJvY2Vzc29yKFRlc3RDbGFzc0suY2xhc3MpOworICAgICAgICBUZXN0Q2xhc3NLIHRlc3RDbGFzc0sgPSBuZXcgVGVzdENsYXNzSygpOworICAgICAgICBpbnN0YW5jZUsucHJvY2Vzc0xpbmtzKHRlc3RDbGFzc0ssIG1vY2tVcmlJbmZvLCBtb2NrUm1jLCBtb2NrUmxjYyk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShsZi5nZXRDb3VudCgpID09IDApOworCisgICAgICAgIEZpZWxkUHJvY2Vzc29yPFRlc3RDbGFzc0w+IGluc3RhbmNlTCA9IG5ldyBGaWVsZFByb2Nlc3NvcihUZXN0Q2xhc3NMLmNsYXNzKTsKKyAgICAgICAgVGVzdENsYXNzTCB0ZXN0Q2xhc3NMID0gbmV3IFRlc3RDbGFzc0woKTsKKyAgICAgICAgaW5zdGFuY2VMLnByb2Nlc3NMaW5rcyh0ZXN0Q2xhc3NMLCBtb2NrVXJpSW5mbywgbW9ja1JtYywgbW9ja1JsY2MpOworCisgICAgICAgIGFzc2VydFRydWUobGYuZ2V0Q291bnQoKSA9PSAwKTsKKworICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKEZpZWxkRGVzY3JpcHRvci5jbGFzcy5nZXROYW1lKCkpLnNldEZpbHRlcihudWxsKTsKKworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdENsYXNzTSB7CisKKyAgICAgICAgQEluamVjdExpbmsodmFsdWUgPSBURU1QTEFURV9CLCBzdHlsZSA9IEluamVjdExpbmsuU3R5bGUuUkVMQVRJVkVfUEFUSCkKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdGhlbGluazsKKworICAgICAgICBwcml2YXRlIFN0cmluZyBpZDsKKworICAgICAgICBASW5qZWN0TGlua05vRm9sbG93CisgICAgICAgIHByaXZhdGUgVGVzdENsYXNzRSBuZXN0ZWQ7CisKKyAgICAgICAgQFhtbFRyYW5zaWVudAorICAgICAgICBwcml2YXRlIFRlc3RDbGFzc0UgdHJhbnNpZW50TmVzdGVkOworCisgICAgICAgIHB1YmxpYyBUZXN0Q2xhc3NNKFN0cmluZyBpZCwgVGVzdENsYXNzRSBlLCBUZXN0Q2xhc3NFIHRyYW5zaWVudE5lc3RlZCkgeworICAgICAgICAgICAgdGhpcy5pZCA9IGlkOworICAgICAgICAgICAgdGhpcy5uZXN0ZWQgPSBlOworICAgICAgICAgICAgdGhpcy50cmFuc2llbnROZXN0ZWQgPSB0cmFuc2llbnROZXN0ZWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgeworICAgICAgICAgICAgcmV0dXJuIGlkOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9SZWN1cnNpdmVOZXN0aW5nKCkgeworICAgICAgICBMT0cuaW5mbygiTm8gUmVjdXJzaXZlIE5lc3RpbmciKTsKKyAgICAgICAgRmllbGRQcm9jZXNzb3I8VGVzdENsYXNzTT4gaW5zdGFuY2UgPSBuZXcgRmllbGRQcm9jZXNzb3IoVGVzdENsYXNzTS5jbGFzcyk7CisgICAgICAgIFRlc3RDbGFzc0UgbmVzdGVkID0gbmV3IFRlc3RDbGFzc0UoIjEwIik7CisgICAgICAgIFRlc3RDbGFzc0UgdHJhbnNpZW50TmVzdGVkID0gbmV3IFRlc3RDbGFzc0UoIjMwIik7CisgICAgICAgIFRlc3RDbGFzc00gdGVzdENsYXNzID0gbmV3IFRlc3RDbGFzc00oIjIwIiwgbmVzdGVkLCB0cmFuc2llbnROZXN0ZWQpOworICAgICAgICBpbnN0YW5jZS5wcm9jZXNzTGlua3ModGVzdENsYXNzLCBtb2NrVXJpSW5mbywgbW9ja1JtYywgbW9ja1JsY2MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIndpZGdldHMvMjAiLCB0ZXN0Q2xhc3MudGhlbGluayk7CisgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCB0ZXN0Q2xhc3MubmVzdGVkLmxpbmspOworICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgdGVzdENsYXNzLnRyYW5zaWVudE5lc3RlZC5saW5rKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RDbGFzc04geworICAgICAgICAvLyBTaW11bGF0ZSBvYmplY3QgaW5qZWN0ZWQgYnkgSlBBCisgICAgICAgIC8vIGluIG9yZGVyIHRvIHRlc3QgYSBmaXggZm9yIEpFUlNFWS0yNjI1CisgICAgICAgIHByaXZhdGUgdHJhbnNpZW50IEl0ZXJhYmxlIHJlczEgPSBuZXcgSXRlcmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBJdGVyYXRvciBpdGVyYXRvcigpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRGVjbGFyYXRpdmUgbGlua2luZyBmZWF0dXJlIGlzIGluY29ycmVjdGx5IHByb2Nlc3NpbmcgYSB0cmFuc2llbnQgaXRlcmF0b3IiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9OworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElnbm9yZVRyYW5zaWVudCgpIHsKKyAgICAgICAgVGVzdENsYXNzTiB0ZXN0Q2xhc3MgPSBuZXcgVGVzdENsYXNzTigpOworICAgICAgICBGaWVsZFByb2Nlc3NvcjxUZXN0Q2xhc3NOPiBpbnN0YW5jZSA9IG5ldyBGaWVsZFByb2Nlc3NvcihUZXN0Q2xhc3NOLmNsYXNzKTsKKyAgICAgICAgaW5zdGFuY2UucHJvY2Vzc0xpbmtzKHRlc3RDbGFzcywgbW9ja1VyaUluZm8sIG1vY2tSbWMsIG1vY2tSbGNjKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2luY3ViYXRvci9kZWNsYXJhdGl2ZS1saW5raW5nL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbGlua2luZy9IZWFkZXJQcm9jZXNzb3JUZXN0LmphdmEgYi9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xpbmtpbmcvSGVhZGVyUHJvY2Vzc29yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMzYwYWIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xpbmtpbmcvSGVhZGVyUHJvY2Vzc29yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzQ5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lmxpbmtpbmc7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaFJlc3VsdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5QYXRoU2VnbWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uTXVsdGl2YWx1ZWRTdHJpbmdNYXA7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubGlua2luZy5JbmplY3RMaW5rLkV4dGVuc2lvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5saW5raW5nLm1hcHBpbmcuUmVzb3VyY2VNYXBwaW5nQ29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuRXh0ZW5kZWRVcmlJbmZvOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNZXRob2Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJ1bnRpbWVSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS51cmkuVXJpVGVtcGxhdGU7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKgorICoKKyAqIEBhdXRob3IgTWFyayBIYWRsZXkKKyAqIEBhdXRob3IgR2VyYXJkIERhdmlzb24gKGdlcmFyZC5kYXZpc29uIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBIZWFkZXJQcm9jZXNzb3JUZXN0IHsKKworICAgIEV4dGVuZGVkVXJpSW5mbyBtb2NrVXJpSW5mbyA9IG5ldyBFeHRlbmRlZFVyaUluZm8oKSB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGJhc2VVUkkgPSAiaHR0cDovL2V4YW1wbGUuY29tL2FwcGxpY2F0aW9uL3Jlc291cmNlcyI7CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIHlldC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aChib29sZWFuIGRlY29kZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIHlldC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBMaXN0PFBhdGhTZWdtZW50PiBnZXRQYXRoU2VnbWVudHMoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgeWV0LiIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIExpc3Q8UGF0aFNlZ21lbnQ+IGdldFBhdGhTZWdtZW50cyhib29sZWFuIGRlY29kZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIHlldC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBVUkkgZ2V0UmVxdWVzdFVyaSgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCB5ZXQuIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVXJpQnVpbGRlciBnZXRSZXF1ZXN0VXJpQnVpbGRlcigpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCB5ZXQuIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVVJJIGdldEFic29sdXRlUGF0aCgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCB5ZXQuIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVXJpQnVpbGRlciBnZXRBYnNvbHV0ZVBhdGhCdWlsZGVyKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIHlldC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBVUkkgZ2V0QmFzZVVyaSgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRCYXNlVXJpQnVpbGRlcigpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVXJpQnVpbGRlciBnZXRCYXNlVXJpQnVpbGRlcigpIHsKKyAgICAgICAgICAgIHJldHVybiBVcmlCdWlsZGVyLmZyb21VcmkoYmFzZVVSSSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFBhdGhQYXJhbWV0ZXJzKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBNdWx0aXZhbHVlZFN0cmluZ01hcCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBnZXRQYXRoUGFyYW1ldGVycyhib29sZWFuIGRlY29kZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBNdWx0aXZhbHVlZFN0cmluZ01hcCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBnZXRRdWVyeVBhcmFtZXRlcnMoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE11bHRpdmFsdWVkU3RyaW5nTWFwKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFF1ZXJ5UGFyYW1ldGVycyhib29sZWFuIGRlY29kZSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBNdWx0aXZhbHVlZFN0cmluZ01hcCgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRNYXRjaGVkVVJJcygpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCB5ZXQuIik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldE1hdGNoZWRVUklzKGJvb2xlYW4gZGVjb2RlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgeWV0LiIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIExpc3Q8T2JqZWN0PiBnZXRNYXRjaGVkUmVzb3VyY2VzKCkgeworICAgICAgICAgICAgT2JqZWN0IGR1bW15UmVzb3VyY2UgPSBuZXcgT2JqZWN0KCkge307CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChkdW1teVJlc291cmNlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVVJJIHJlc29sdmUoVVJJIHVyaSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiTm90IHN1cHBvcnRlZCB5ZXQuIik7IC8vVG8gY2hhbmdlIGJvZHkgb2YgZ2VuZXJhdGVkIG1ldGhvZHMsIGNob29zZSBUb29scyB8IFRlbXBsYXRlcy4KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVVJJIHJlbGF0aXZpemUoVVJJIHVyaSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiTm90IHN1cHBvcnRlZCB5ZXQuIik7IC8vVG8gY2hhbmdlIGJvZHkgb2YgZ2VuZXJhdGVkIG1ldGhvZHMsIGNob29zZSBUb29scyB8IFRlbXBsYXRlcy4KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVGhyb3dhYmxlIGdldE1hcHBlZFRocm93YWJsZSgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIk5vdCBzdXBwb3J0ZWQgeWV0LiIpOyAvL1RvIGNoYW5nZSBib2R5IG9mIGdlbmVyYXRlZCBtZXRob2RzLCBjaG9vc2UgVG9vbHMgfCBUZW1wbGF0ZXMuCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIExpc3Q8TWF0Y2hSZXN1bHQ+IGdldE1hdGNoZWRSZXN1bHRzKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiTm90IHN1cHBvcnRlZCB5ZXQuIik7IC8vVG8gY2hhbmdlIGJvZHkgb2YgZ2VuZXJhdGVkIG1ldGhvZHMsIGNob29zZSBUb29scyB8IFRlbXBsYXRlcy4KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTGlzdDxVcmlUZW1wbGF0ZT4gZ2V0TWF0Y2hlZFRlbXBsYXRlcygpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIk5vdCBzdXBwb3J0ZWQgeWV0LiIpOyAvL1RvIGNoYW5nZSBib2R5IG9mIGdlbmVyYXRlZCBtZXRob2RzLCBjaG9vc2UgVG9vbHMgfCBUZW1wbGF0ZXMuCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIExpc3Q8UGF0aFNlZ21lbnQ+IGdldFBhdGhTZWdtZW50cyhTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiTm90IHN1cHBvcnRlZCB5ZXQuIik7IC8vVG8gY2hhbmdlIGJvZHkgb2YgZ2VuZXJhdGVkIG1ldGhvZHMsIGNob29zZSBUb29scyB8IFRlbXBsYXRlcy4KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTGlzdDxQYXRoU2VnbWVudD4gZ2V0UGF0aFNlZ21lbnRzKFN0cmluZyBuYW1lLCBib29sZWFuIGRlY29kZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiTm90IHN1cHBvcnRlZCB5ZXQuIik7IC8vVG8gY2hhbmdlIGJvZHkgb2YgZ2VuZXJhdGVkIG1ldGhvZHMsIGNob29zZSBUb29scyB8IFRlbXBsYXRlcy4KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTGlzdDxSdW50aW1lUmVzb3VyY2U+IGdldE1hdGNoZWRSdW50aW1lUmVzb3VyY2VzKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiTm90IHN1cHBvcnRlZCB5ZXQuIik7IC8vVG8gY2hhbmdlIGJvZHkgb2YgZ2VuZXJhdGVkIG1ldGhvZHMsIGNob29zZSBUb29scyB8IFRlbXBsYXRlcy4KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzb3VyY2VNZXRob2QgZ2V0TWF0Y2hlZFJlc291cmNlTWV0aG9kKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiTm90IHN1cHBvcnRlZCB5ZXQuIik7IC8vVG8gY2hhbmdlIGJvZHkgb2YgZ2VuZXJhdGVkIG1ldGhvZHMsIGNob29zZSBUb29scyB8IFRlbXBsYXRlcy4KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzb3VyY2UgZ2V0TWF0Y2hlZE1vZGVsUmVzb3VyY2UoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJOb3Qgc3VwcG9ydGVkIHlldC4iKTsgLy9UbyBjaGFuZ2UgYm9keSBvZiBnZW5lcmF0ZWQgbWV0aG9kcywgY2hvb3NlIFRvb2xzIHwgVGVtcGxhdGVzLgorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBMaXN0PFJlc291cmNlTWV0aG9kPiBnZXRNYXRjaGVkUmVzb3VyY2VMb2NhdG9ycygpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgIk5vdCBzdXBwb3J0ZWQgeWV0LiIpOyAvL1RvIGNoYW5nZSBib2R5IG9mIGdlbmVyYXRlZCBtZXRob2RzLCBjaG9vc2UgVG9vbHMgfCBUZW1wbGF0ZXMuCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIExpc3Q8UmVzb3VyY2U+IGdldExvY2F0b3JTdWJSZXNvdXJjZXMoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJOb3Qgc3VwcG9ydGVkIHlldC4iKTsgLy9UbyBjaGFuZ2UgYm9keSBvZiBnZW5lcmF0ZWQgbWV0aG9kcywgY2hvb3NlIFRvb2xzIHwgVGVtcGxhdGVzLgorICAgICAgICB9CisKKyAgICB9OworCisgICAgUmVzb3VyY2VNYXBwaW5nQ29udGV4dCBtb2NrUm1jID0gbmV3IFJlc291cmNlTWFwcGluZ0NvbnRleHQoKSB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNvdXJjZU1hcHBpbmdDb250ZXh0Lk1hcHBpbmcgZ2V0TWFwcGluZyhDbGFzczw/PiByZXNvdXJjZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9OworCisgICAgQEluamVjdExpbmsodmFsdWUgPSAiQSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFbnRpdHlBIHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMaXRlcmFsKCkgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkxpdGVyYWwiKTsKKyAgICAgICAgSGVhZGVyUHJvY2Vzc29yPEVudGl0eUE+IGluc3RhbmNlID0gbmV3IEhlYWRlclByb2Nlc3NvcihFbnRpdHlBLmNsYXNzKTsKKyAgICAgICAgRW50aXR5QSB0ZXN0Q2xhc3MgPSBuZXcgRW50aXR5QSgpOworICAgICAgICBMaXN0PFN0cmluZz4gaGVhZGVyVmFsdWVzID0gaW5zdGFuY2UuZ2V0TGlua0hlYWRlclZhbHVlcyh0ZXN0Q2xhc3MsIG1vY2tVcmlJbmZvLCBtb2NrUm1jKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGhlYWRlclZhbHVlcy5zaXplKCkpOworICAgICAgICBTdHJpbmcgaGVhZGVyVmFsdWUgPSBoZWFkZXJWYWx1ZXMuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoIjwvYXBwbGljYXRpb24vcmVzb3VyY2VzL0E+IiwgaGVhZGVyVmFsdWUpOworICAgIH0KKworICAgIEBJbmplY3RMaW5rKHZhbHVlID0gIiR7ZW50aXR5LmlkfSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFbnRpdHlCIHsKKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgeworICAgICAgICAgICAgcmV0dXJuICJCIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVMKCkgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVMIik7CisgICAgICAgIEhlYWRlclByb2Nlc3NvcjxFbnRpdHlCPiBpbnN0YW5jZSA9IG5ldyBIZWFkZXJQcm9jZXNzb3IoRW50aXR5Qi5jbGFzcyk7CisgICAgICAgIEVudGl0eUIgdGVzdENsYXNzID0gbmV3IEVudGl0eUIoKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGhlYWRlclZhbHVlcyA9IGluc3RhbmNlLmdldExpbmtIZWFkZXJWYWx1ZXModGVzdENsYXNzLCBtb2NrVXJpSW5mbywgbW9ja1JtYyk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBoZWFkZXJWYWx1ZXMuc2l6ZSgpKTsKKyAgICAgICAgU3RyaW5nIGhlYWRlclZhbHVlID0gaGVhZGVyVmFsdWVzLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI8L2FwcGxpY2F0aW9uL3Jlc291cmNlcy9CPiIsIGhlYWRlclZhbHVlKTsKKyAgICB9CisKKyAgICBASW5qZWN0TGluayh2YWx1ZSA9ICJ7aWR9IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEVudGl0eUMgeworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisgICAgICAgICAgICByZXR1cm4gIkMiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGVtcGxhdGVMaXRlcmFsKCkgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRlbXBsYXRlIExpdGVyYWwiKTsKKyAgICAgICAgSGVhZGVyUHJvY2Vzc29yPEVudGl0eUM+IGluc3RhbmNlID0gbmV3IEhlYWRlclByb2Nlc3NvcihFbnRpdHlDLmNsYXNzKTsKKyAgICAgICAgRW50aXR5QyB0ZXN0Q2xhc3MgPSBuZXcgRW50aXR5QygpOworICAgICAgICBMaXN0PFN0cmluZz4gaGVhZGVyVmFsdWVzID0gaW5zdGFuY2UuZ2V0TGlua0hlYWRlclZhbHVlcyh0ZXN0Q2xhc3MsIG1vY2tVcmlJbmZvLCBtb2NrUm1jKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGhlYWRlclZhbHVlcy5zaXplKCkpOworICAgICAgICBTdHJpbmcgaGVhZGVyVmFsdWUgPSBoZWFkZXJWYWx1ZXMuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoIjwvYXBwbGljYXRpb24vcmVzb3VyY2VzL0M+IiwgaGVhZGVyVmFsdWUpOworICAgIH0KKworICAgIEBJbmplY3RMaW5rcyh7CisgICAgICAgICAgICBASW5qZWN0TGluayh2YWx1ZSA9ICJBIiksCisgICAgICAgICAgICBASW5qZWN0TGluayh2YWx1ZSA9ICJCIikKKyAgICB9KQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRW50aXR5RCB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGUoKSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTXVsdGlwbGUgTGl0ZXJhbCIpOworICAgICAgICBIZWFkZXJQcm9jZXNzb3I8RW50aXR5RD4gaW5zdGFuY2UgPSBuZXcgSGVhZGVyUHJvY2Vzc29yKEVudGl0eUQuY2xhc3MpOworICAgICAgICBFbnRpdHlEIHRlc3RDbGFzcyA9IG5ldyBFbnRpdHlEKCk7CisgICAgICAgIExpc3Q8U3RyaW5nPiBoZWFkZXJWYWx1ZXMgPSBpbnN0YW5jZS5nZXRMaW5rSGVhZGVyVmFsdWVzKHRlc3RDbGFzcywgbW9ja1VyaUluZm8sIG1vY2tSbWMpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgaGVhZGVyVmFsdWVzLnNpemUoKSk7CisgICAgICAgIC8vIG5vdCBzdXJlIGlmIGFubm90YXRpb24gb3JkZXIgaXMgc3VwcG9zZWQgdG8gYmUgcHJlc2VydmVkIGJ1dCBpdCBzZWVtcworICAgICAgICAvLyB0byB3b3JrIGFzIGV4cGVjdGVkCisgICAgICAgIFN0cmluZyBoZWFkZXJWYWx1ZSA9IGhlYWRlclZhbHVlcy5nZXQoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiPC9hcHBsaWNhdGlvbi9yZXNvdXJjZXMvQT4iLCBoZWFkZXJWYWx1ZSk7CisgICAgICAgIGhlYWRlclZhbHVlID0gaGVhZGVyVmFsdWVzLmdldCgxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI8L2FwcGxpY2F0aW9uL3Jlc291cmNlcy9CPiIsIGhlYWRlclZhbHVlKTsKKyAgICB9CisKKyAgICBASW5qZWN0TGluayh2YWx1ZSA9ICJFIiwKKyAgICAgICAgICAgIHJlbCA9ICJyZWxFIiwKKyAgICAgICAgICAgIHJldiA9ICJyZXZFIiwKKyAgICAgICAgICAgIHR5cGUgPSAidHlwZS9lIiwKKyAgICAgICAgICAgIHRpdGxlID0gInRpdGxlRSIsCisgICAgICAgICAgICBhbmNob3IgPSAiYW5jaG9yRSIsCisgICAgICAgICAgICBtZWRpYSA9ICJtZWRpYUUiLAorICAgICAgICAgICAgaHJlZmxhbmcgPSAiZW4tRSIsCisgICAgICAgICAgICBleHRlbnNpb25zID0geworICAgICAgICAgICAgICAgICAgICBARXh0ZW5zaW9uKG5hbWUgPSAiZTEiLCB2YWx1ZSA9ICJ2MSIpLAorICAgICAgICAgICAgICAgICAgICBARXh0ZW5zaW9uKG5hbWUgPSAiZTIiLCB2YWx1ZSA9ICJ2MiIpCisgICAgICAgICAgICB9CisgICAgKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRW50aXR5RSB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyYW1ldGVycygpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQYXJhbWV0ZXJzIik7CisgICAgICAgIEhlYWRlclByb2Nlc3NvcjxFbnRpdHlFPiBpbnN0YW5jZSA9IG5ldyBIZWFkZXJQcm9jZXNzb3IoRW50aXR5RS5jbGFzcyk7CisgICAgICAgIEVudGl0eUUgdGVzdENsYXNzID0gbmV3IEVudGl0eUUoKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGhlYWRlclZhbHVlcyA9IGluc3RhbmNlLmdldExpbmtIZWFkZXJWYWx1ZXModGVzdENsYXNzLCBtb2NrVXJpSW5mbywgbW9ja1JtYyk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBoZWFkZXJWYWx1ZXMuc2l6ZSgpKTsKKyAgICAgICAgU3RyaW5nIGhlYWRlclZhbHVlID0gaGVhZGVyVmFsdWVzLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShoZWFkZXJWYWx1ZS5jb250YWlucygiPC9hcHBsaWNhdGlvbi9yZXNvdXJjZXMvRT4iKSk7CisgICAgICAgIGFzc2VydFRydWUoaGVhZGVyVmFsdWUuY29udGFpbnMoIjsgcmVsPVwicmVsRVwiIikpOworICAgICAgICBhc3NlcnRUcnVlKGhlYWRlclZhbHVlLmNvbnRhaW5zKCI7IHJldj1cInJldkVcIiIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShoZWFkZXJWYWx1ZS5jb250YWlucygiOyB0eXBlPVwidHlwZS9lXCIiKSk7CisgICAgICAgIGFzc2VydFRydWUoaGVhZGVyVmFsdWUuY29udGFpbnMoIjsgdGl0bGU9XCJ0aXRsZUVcIiIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShoZWFkZXJWYWx1ZS5jb250YWlucygiOyBhbmNob3I9XCJhbmNob3JFXCIiKSk7CisgICAgICAgIGFzc2VydFRydWUoaGVhZGVyVmFsdWUuY29udGFpbnMoIjsgbWVkaWE9XCJtZWRpYUVcIiIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShoZWFkZXJWYWx1ZS5jb250YWlucygiOyBocmVmbGFuZz1cImVuLUVcIiIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShoZWFkZXJWYWx1ZS5jb250YWlucygiOyBlMT1cInYxXCIiKSk7CisgICAgICAgIGFzc2VydFRydWUoaGVhZGVyVmFsdWUuY29udGFpbnMoIjsgZTI9XCJ2MlwiIikpOworICAgIH0KKworICAgIEBJbmplY3RMaW5rcyh7CisgICAgICAgICAgICBASW5qZWN0TGluayh2YWx1ZSA9ICIke2VudGl0eS5pZDF9IiwgY29uZGl0aW9uID0gIiR7ZW50aXR5LmlkMUVuYWJsZWR9IiksCisgICAgICAgICAgICBASW5qZWN0TGluayh2YWx1ZSA9ICIke2VudGl0eS5pZDJ9IiwgY29uZGl0aW9uID0gIiR7ZW50aXR5LmlkMkVuYWJsZWR9IikKKyAgICB9KQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRW50aXR5RiB7CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNJZDFFbmFibGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldElkMSgpIHsKKyAgICAgICAgICAgIHJldHVybiAiMSI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0lkMkVuYWJsZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldElkMigpIHsKKyAgICAgICAgICAgIHJldHVybiAiMiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25kaXRpb25hbCgpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFTCIpOworICAgICAgICBIZWFkZXJQcm9jZXNzb3I8RW50aXR5Rj4gaW5zdGFuY2UgPSBuZXcgSGVhZGVyUHJvY2Vzc29yKEVudGl0eUYuY2xhc3MpOworICAgICAgICBFbnRpdHlGIHRlc3RDbGFzcyA9IG5ldyBFbnRpdHlGKCk7CisgICAgICAgIExpc3Q8U3RyaW5nPiBoZWFkZXJWYWx1ZXMgPSBpbnN0YW5jZS5nZXRMaW5rSGVhZGVyVmFsdWVzKHRlc3RDbGFzcywgbW9ja1VyaUluZm8sIG1vY2tSbWMpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgaGVhZGVyVmFsdWVzLnNpemUoKSk7CisgICAgICAgIFN0cmluZyBoZWFkZXJWYWx1ZSA9IGhlYWRlclZhbHVlcy5nZXQoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiPC9hcHBsaWNhdGlvbi9yZXNvdXJjZXMvMT4iLCBoZWFkZXJWYWx1ZSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xpbmtpbmcvTGlua0VMQ29udGV4dFRlc3QuamF2YSBiL2luY3ViYXRvci9kZWNsYXJhdGl2ZS1saW5raW5nL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbGlua2luZy9MaW5rRUxDb250ZXh0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YmYzZjQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xpbmtpbmcvTGlua0VMQ29udGV4dFRlc3QuamF2YQpAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5saW5raW5nOworCitpbXBvcnQgamF2YXguZWwuRXhwcmVzc2lvbkZhY3Rvcnk7CitpbXBvcnQgamF2YXguZWwuVmFsdWVFeHByZXNzaW9uOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CisKKy8qKgorICoKKyAqIEBhdXRob3IgTWFyayBIYWRsZXkKKyAqIEBhdXRob3IgR2VyYXJkIERhdmlzb24gKGdlcmFyZC5kYXZpc29uIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBMaW5rRUxDb250ZXh0VGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeHByZXNzaW9uRmFjdG9yeSgpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDcmVhdGUgZXhwcmVzc2lvbiBmYWN0b3J5Iik7CisgICAgICAgIEV4cHJlc3Npb25GYWN0b3J5IGZhY3RvcnkgPSBFeHByZXNzaW9uRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICBhc3NlcnROb3ROdWxsKGZhY3RvcnkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExpdGVyYWxFeHByZXNzaW9uKCkgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkxpdGVyYWwgZXhwcmVzc2lvbiIpOworICAgICAgICBFeHByZXNzaW9uRmFjdG9yeSBmYWN0b3J5ID0gRXhwcmVzc2lvbkZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgTGlua0VMQ29udGV4dCBjb250ZXh0ID0gbmV3IExpbmtFTENvbnRleHQobmV3IEJvb2xlYW5CZWFuKCksIG51bGwpOworICAgICAgICBWYWx1ZUV4cHJlc3Npb24gZXhwciA9IGZhY3RvcnkuY3JlYXRlVmFsdWVFeHByZXNzaW9uKGNvbnRleHQsCisgICAgICAgICAgICAgICAgIiR7MSsyfSIsIGludC5jbGFzcyk7CisgICAgICAgIE9iamVjdCB2YWx1ZSA9IGV4cHIuZ2V0VmFsdWUoY29udGV4dCk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSUQgPSAiMTAiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAiVGhlTmFtZSI7CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEVudGl0eUJlYW4geworCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGlkID0gSUQ7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG5hbWUgPSBOQU1FOworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisgICAgICAgICAgICByZXR1cm4gaWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEV4cHJlc3Npb24oKSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmF3IGV4cHJlc3Npb24iKTsKKyAgICAgICAgRXhwcmVzc2lvbkZhY3RvcnkgZmFjdG9yeSA9IEV4cHJlc3Npb25GYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIExpbmtFTENvbnRleHQgY29udGV4dCA9IG5ldyBMaW5rRUxDb250ZXh0KG5ldyBFbnRpdHlCZWFuKCksIG51bGwpOworICAgICAgICBWYWx1ZUV4cHJlc3Npb24gZXhwciA9IGZhY3RvcnkuY3JlYXRlVmFsdWVFeHByZXNzaW9uKGNvbnRleHQsCisgICAgICAgICAgICAgICAgIiR7ZW50aXR5LmlkfSIsIFN0cmluZy5jbGFzcyk7CisgICAgICAgIE9iamVjdCB2YWx1ZSA9IGV4cHIuZ2V0VmFsdWUoY29udGV4dCk7CisgICAgICAgIGFzc2VydEVxdWFscyhJRCwgdmFsdWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVtYmVkZGVkRXhwcmVzc2lvbigpIHsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFbWJlZGRlZCBleHByZXNzaW9uIik7CisgICAgICAgIEV4cHJlc3Npb25GYWN0b3J5IGZhY3RvcnkgPSBFeHByZXNzaW9uRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICBMaW5rRUxDb250ZXh0IGNvbnRleHQgPSBuZXcgTGlua0VMQ29udGV4dChuZXcgRW50aXR5QmVhbigpLCBudWxsKTsKKyAgICAgICAgVmFsdWVFeHByZXNzaW9uIGV4cHIgPSBmYWN0b3J5LmNyZWF0ZVZhbHVlRXhwcmVzc2lvbihjb250ZXh0LAorICAgICAgICAgICAgICAgICJmb28vJHtlbnRpdHkuaWR9L2JhciIsIFN0cmluZy5jbGFzcyk7CisgICAgICAgIE9iamVjdCB2YWx1ZSA9IGV4cHIuZ2V0VmFsdWUoY29udGV4dCk7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9vLyIgKyBJRCArICIvYmFyIiwgdmFsdWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlRXhwcmVzc2lvbnMoKSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTXVsdGlwbGUgZXhwcmVzc2lvbnMiKTsKKyAgICAgICAgRXhwcmVzc2lvbkZhY3RvcnkgZmFjdG9yeSA9IEV4cHJlc3Npb25GYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIExpbmtFTENvbnRleHQgY29udGV4dCA9IG5ldyBMaW5rRUxDb250ZXh0KG5ldyBFbnRpdHlCZWFuKCksIG51bGwpOworICAgICAgICBWYWx1ZUV4cHJlc3Npb24gZXhwciA9IGZhY3RvcnkuY3JlYXRlVmFsdWVFeHByZXNzaW9uKGNvbnRleHQsCisgICAgICAgICAgICAgICAgImZvby8ke2VudGl0eS5pZH0vYmFyLyR7ZW50aXR5Lm5hbWV9IiwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgT2JqZWN0IHZhbHVlID0gZXhwci5nZXRWYWx1ZShjb250ZXh0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28vIiArIElEICsgIi9iYXIvIiArIE5BTUUsIHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE91dGVyRW50aXR5QmVhbiB7CisKKyAgICAgICAgcHJpdmF0ZSBFbnRpdHlCZWFuIGlubmVyID0gbmV3IEVudGl0eUJlYW4oKTsKKworICAgICAgICBwdWJsaWMgRW50aXR5QmVhbiBnZXRJbm5lcigpIHsKKyAgICAgICAgICAgIHJldHVybiBpbm5lcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5lc3RlZEV4cHJlc3Npb24oKSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTmVzdGVkIGV4cHJlc3Npb24iKTsKKyAgICAgICAgRXhwcmVzc2lvbkZhY3RvcnkgZmFjdG9yeSA9IEV4cHJlc3Npb25GYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIExpbmtFTENvbnRleHQgY29udGV4dCA9IG5ldyBMaW5rRUxDb250ZXh0KG5ldyBPdXRlckVudGl0eUJlYW4oKSwgbnVsbCk7CisgICAgICAgIFZhbHVlRXhwcmVzc2lvbiBleHByID0gZmFjdG9yeS5jcmVhdGVWYWx1ZUV4cHJlc3Npb24oY29udGV4dCwKKyAgICAgICAgICAgICAgICAiJHtlbnRpdHkuaW5uZXIuaWR9IiwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgT2JqZWN0IHZhbHVlID0gZXhwci5nZXRWYWx1ZShjb250ZXh0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKElELCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCb29sZWFuQmVhbiB7CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZ2V0RW5hYmxlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZ2V0VmFsdWUoYm9vbGVhbiB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Qm9vbGVhbkV4cHJlc3Npb24oKSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQm9vbGVhbiBleHByZXNzaW9uIik7CisgICAgICAgIEV4cHJlc3Npb25GYWN0b3J5IGZhY3RvcnkgPSBFeHByZXNzaW9uRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICBMaW5rRUxDb250ZXh0IGNvbnRleHQgPSBuZXcgTGlua0VMQ29udGV4dChuZXcgQm9vbGVhbkJlYW4oKSwgbnVsbCk7CisgICAgICAgIFZhbHVlRXhwcmVzc2lvbiBleHByID0gZmFjdG9yeS5jcmVhdGVWYWx1ZUV4cHJlc3Npb24oY29udGV4dCwKKyAgICAgICAgICAgICAgICAiJHtlbnRpdHkuZW5hYmxlZH0iLCBib29sZWFuLmNsYXNzKTsKKyAgICAgICAgT2JqZWN0IHZhbHVlID0gZXhwci5nZXRWYWx1ZShjb250ZXh0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHRydWUsIHZhbHVlKTsKKyAgICAgICAgZXhwciA9IGZhY3RvcnkuY3JlYXRlVmFsdWVFeHByZXNzaW9uKGNvbnRleHQsCisgICAgICAgICAgICAgICAgIiR7ZW50aXR5LmdldFZhbHVlKHRydWUpfSIsIGJvb2xlYW4uY2xhc3MpOworICAgICAgICB2YWx1ZSA9IGV4cHIuZ2V0VmFsdWUoY29udGV4dCk7CisgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCB2YWx1ZSk7CisgICAgICAgIGV4cHIgPSBmYWN0b3J5LmNyZWF0ZVZhbHVlRXhwcmVzc2lvbihjb250ZXh0LAorICAgICAgICAgICAgICAgICIke2VudGl0eS5nZXRWYWx1ZShmYWxzZSl9IiwgYm9vbGVhbi5jbGFzcyk7CisgICAgICAgIHZhbHVlID0gZXhwci5nZXRWYWx1ZShjb250ZXh0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCB2YWx1ZSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xpbmtpbmcvaW50ZWdyYXRpb24vTGlua2luZ01hbnVhbFRlc3QuamF2YSBiL2luY3ViYXRvci9kZWNsYXJhdGl2ZS1saW5raW5nL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbGlua2luZy9pbnRlZ3JhdGlvbi9MaW5raW5nTWFudWFsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNzUwNDIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xpbmtpbmcvaW50ZWdyYXRpb24vTGlua2luZ01hbnVhbFRlc3QuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmxpbmtpbmcuaW50ZWdyYXRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubGlua2luZy5pbnRlZ3JhdGlvbi5hcHAuTGlua2luZ01hbnVhbEFwcGxpY2F0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxpbmtpbmcuaW50ZWdyYXRpb24ucmVwcmVzZW50YXRpb25zLk9yZGVyUmVxdWVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLnNreXNjcmVhbWVyLmpzb25hc3NlcnQuSlNPTkFzc2VydDsKKworcHVibGljIGNsYXNzIExpbmtpbmdNYW51YWxUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IExpbmtpbmdNYW51YWxBcHBsaWNhdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIG9yZGVyQ29udGFpbnNNYW51YWxMaW5rKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE9yZGVyUmVxdWVzdCByZXF1ZXN0ID0gbmV3IE9yZGVyUmVxdWVzdCgpOworICAgICAgICByZXF1ZXN0LnNldERyaW5rKCJDb2ZmZWUiKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCIvb3JkZXJzIikucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eShyZXF1ZXN0LCBNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFKSk7CisKKyAgICAgICAgU3RyaW5nIG9yZGVyID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBKU09OQXNzZXJ0LmFzc2VydEVxdWFscygie2lkOicxMjMnLHByaWNlOicxLjk5JyxsaW5rczpbIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAie3VyaTonLycscGFyYW1zOntyZWw6J3Jvb3QnfSx1cmlCdWlsZGVyOnthYnNvbHV0ZTpmYWxzZX0scmVsOidyb290JyxyZWxzOlsncm9vdCddfSIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIl19IiwKKyAgICAgICAgICAgICAgICBvcmRlciwgdHJ1ZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL2ludGVncmF0aW9uL0xpbmtpbmdUZXN0LmphdmEgYi9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xpbmtpbmcvaW50ZWdyYXRpb24vTGlua2luZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTI1ZmFmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL2ludGVncmF0aW9uL0xpbmtpbmdUZXN0LmphdmEKQEAgLTAsMCArMSwxNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubGlua2luZy5pbnRlZ3JhdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5saW5raW5nLmludGVncmF0aW9uLmFwcC5MaW5raW5nQXBwbGljYXRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubGlua2luZy5pbnRlZ3JhdGlvbi5yZXByZXNlbnRhdGlvbnMuT3JkZXJSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuc2t5c2NyZWFtZXIuanNvbmFzc2VydC5KU09OQXNzZXJ0OworCitwdWJsaWMgY2xhc3MgTGlua2luZ1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgTGlua2luZ0FwcGxpY2F0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgb3JkZXJDb250YWluc1Byb3ZpZGVkTGlua3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgT3JkZXJSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgT3JkZXJSZXF1ZXN0KCk7CisgICAgICAgIHJlcXVlc3Quc2V0RHJpbmsoIkNvZmZlZSIpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoIi9vcmRlcnMiKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KHJlcXVlc3QsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUpKTsKKworICAgICAgICBTdHJpbmcgb3JkZXIgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIEpTT05Bc3NlcnQuYXNzZXJ0RXF1YWxzKCJ7aWQ6JzEyMycscHJpY2U6JzEuOTknLGxpbmtzOlsiCisgICAgICAgICAgICAgICAgICAgICsgInt1cmk6Jy9vcmRlcnMvMTIzJyxwYXJhbXM6e3JlbDonc2VsZid9LHVyaUJ1aWxkZXI6e2Fic29sdXRlOmZhbHNlfSxyZWw6J3NlbGYnLHJlbHM6WydzZWxmJ119LCIKKyAgICAgICAgICAgICAgICAgICAgKyAie3VyaTonL3BheW1lbnRzL29yZGVyLzEyMycscGFyYW1zOntyZWw6J3BheSd9LHVyaUJ1aWxkZXI6e2Fic29sdXRlOmZhbHNlfSxyZWw6J3BheScscmVsczpbJ3BheSddfSwiCisgICAgICAgICAgICAgICAgICAgICsgInt1cmk6Jy8nLHBhcmFtczp7cmVsOidyb290J30sdXJpQnVpbGRlcjp7YWJzb2x1dGU6ZmFsc2V9LHJlbDoncm9vdCcscmVsczpbJ3Jvb3QnXX0iCisgICAgICAgICAgICAgICAgICAgICsgIl19IiwKKyAgICAgICAgICAgICAgICBvcmRlciwgdHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwcm92aWRlZExpbmtzU3VwcG9ydENvbmRpdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgT3JkZXJSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgT3JkZXJSZXF1ZXN0KCk7CisgICAgICAgIHJlcXVlc3Quc2V0RHJpbmsoIldhdGVyIik7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiL29yZGVycyIpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkocmVxdWVzdCwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSkpOworCisgICAgICAgIFN0cmluZyBvcmRlciA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgSlNPTkFzc2VydC5hc3NlcnRFcXVhbHMoIntpZDonMTIzJyxwcmljZTonMC4wJyxsaW5rczpbIgorICAgICAgICAgICAgICAgICAgICArICJ7dXJpOicvb3JkZXJzLzEyMycscGFyYW1zOntyZWw6J3NlbGYnfSx1cmlCdWlsZGVyOnthYnNvbHV0ZTpmYWxzZX0scmVsOidzZWxmJyxyZWxzOlsnc2VsZiddfSwiCisgICAgICAgICAgICAgICAgICAgICsgInt1cmk6Jy8nLHBhcmFtczp7cmVsOidyb290J30sdXJpQnVpbGRlcjp7YWJzb2x1dGU6ZmFsc2V9LHJlbDoncm9vdCcscmVsczpbJ3Jvb3QnXX0iCisgICAgICAgICAgICAgICAgICAgICsgIl19IiwKKyAgICAgICAgICAgICAgICBvcmRlciwgdHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBtZXRhQW5ub3RhdGlvbnNDYW5CZVVzZWRUb0Fic3RyYWN0Q29tbW9uQmVoYXZpb3JfMSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoIi9vcmRlcnMiKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAuZ2V0KCk7CisKKyAgICAgICAgU3RyaW5nIG9yZGVyID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBKU09OQXNzZXJ0LmFzc2VydEVxdWFscygie251bWJlcjowLHNpemU6Mix0b3RhbFBhZ2VzOjMsbnVtYmVyT2ZFbGVtZW50czowLHRvdGFsRWxlbWVudHM6NixsaW5rczpbIgorICAgICAgICAgICAgICAgICAgICArICJ7dXJpOicvb3JkZXJzJyxwYXJhbXM6e3JlbDonY3JlYXRlJ30sdXJpQnVpbGRlcjp7YWJzb2x1dGU6ZmFsc2V9LHJlbHM6WydjcmVhdGUnXSxyZWw6J2NyZWF0ZSd9LCIKKyAgICAgICAgICAgICAgICAgICAgKyAie3VyaTonL29yZGVycz9wYWdlPTEmc2l6ZT0yJyxwYXJhbXM6e3JlbDonbmV4dCd9LHVyaUJ1aWxkZXI6e2Fic29sdXRlOmZhbHNlfSxyZWxzOlsnbmV4dCddLHJlbDonbmV4dCd9IgorICAgICAgICAgICAgICAgICAgICArICJdLG9yZGVyczpbIgorICAgICAgICAgICAgICAgICAgICArICJ7aWQ6JzEnLHByaWNlOicxLjk5JyxsaW5rczpbIgorICAgICAgICAgICAgICAgICAgICArICJ7dXJpOicvb3JkZXJzLzEnLHBhcmFtczp7cmVsOidzZWxmJ30sdXJpQnVpbGRlcjp7YWJzb2x1dGU6ZmFsc2V9LHJlbHM6WydzZWxmJ10scmVsOidzZWxmJ30sIgorICAgICAgICAgICAgICAgICAgICArICJ7dXJpOicvcGF5bWVudHMvb3JkZXIvMScscGFyYW1zOntyZWw6J3BheSd9LHVyaUJ1aWxkZXI6e2Fic29sdXRlOmZhbHNlfSxyZWxzOlsncGF5J10scmVsOidwYXknfV19LCIKKyAgICAgICAgICAgICAgICAgICAgKyAie2lkOicyJyxwcmljZTonMC4wJyxsaW5rczpbIgorICAgICAgICAgICAgICAgICAgICArICJ7dXJpOicvb3JkZXJzLzInLHBhcmFtczp7cmVsOidzZWxmJ30sdXJpQnVpbGRlcjp7YWJzb2x1dGU6ZmFsc2V9LHJlbHM6WydzZWxmJ10scmVsOidzZWxmJ31dfSIKKyAgICAgICAgICAgICAgICAgICAgKyAiXSxmaXJzdFBhZ2U6dHJ1ZSxwcmV2aW91c1BhZ2VBdmFpbGFibGU6ZmFsc2UsbmV4dFBhZ2VBdmFpbGFibGU6dHJ1ZSxsYXN0UGFnZTpmYWxzZX0iLAorICAgICAgICAgICAgICAgIG9yZGVyLCB0cnVlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIG1ldGFBbm5vdGF0aW9uc0NhbkJlVXNlZFRvQWJzdHJhY3RDb21tb25CZWhhdmlvcl8yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiL29yZGVycyIpLnF1ZXJ5UGFyYW0oInBhZ2UiLCAiMSIpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5nZXQoKTsKKworICAgICAgICBTdHJpbmcgb3JkZXIgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIEpTT05Bc3NlcnQuYXNzZXJ0RXF1YWxzKCJ7bnVtYmVyOjEsc2l6ZToyLHRvdGFsUGFnZXM6MyxudW1iZXJPZkVsZW1lbnRzOjAsdG90YWxFbGVtZW50czo2LGxpbmtzOlsiCisgICAgICAgICAgICAgICAgICAgICsgInt1cmk6Jy9vcmRlcnMnLHBhcmFtczp7cmVsOidjcmVhdGUnfSx1cmlCdWlsZGVyOnthYnNvbHV0ZTpmYWxzZX0scmVsczpbJ2NyZWF0ZSddLHJlbDonY3JlYXRlJ30sIgorICAgICAgICAgICAgICAgICAgICArICJ7dXJpOicvb3JkZXJzP3BhZ2U9MiZzaXplPTInLHBhcmFtczp7cmVsOiduZXh0J30sdXJpQnVpbGRlcjp7YWJzb2x1dGU6ZmFsc2V9LHJlbHM6WyduZXh0J10scmVsOiduZXh0J30sIgorICAgICAgICAgICAgICAgICAgICArICJ7dXJpOicvb3JkZXJzP3BhZ2U9MCZzaXplPTInLHBhcmFtczp7cmVsOidwcmV2J30sdXJpQnVpbGRlcjp7YWJzb2x1dGU6ZmFsc2V9LHJlbHM6WydwcmV2J10scmVsOidwcmV2J30iCisgICAgICAgICAgICAgICAgICAgICsgIl0sb3JkZXJzOlsiCisgICAgICAgICAgICAgICAgICAgICsgIntpZDonMycscHJpY2U6JzEuOTknLGxpbmtzOlsiCisgICAgICAgICAgICAgICAgICAgICsgInt1cmk6Jy9vcmRlcnMvMycscGFyYW1zOntyZWw6J3NlbGYnfSx1cmlCdWlsZGVyOnthYnNvbHV0ZTpmYWxzZX0scmVsczpbJ3NlbGYnXSxyZWw6J3NlbGYnfSwiCisgICAgICAgICAgICAgICAgICAgICsgInt1cmk6Jy9wYXltZW50cy9vcmRlci8zJyxwYXJhbXM6e3JlbDoncGF5J30sdXJpQnVpbGRlcjp7YWJzb2x1dGU6ZmFsc2V9LHJlbHM6WydwYXknXSxyZWw6J3BheSd9XX0sIgorICAgICAgICAgICAgICAgICAgICArICJ7aWQ6JzQnLHByaWNlOicwLjAnLGxpbmtzOlsiCisgICAgICAgICAgICAgICAgICAgICsgInt1cmk6Jy9vcmRlcnMvNCcscGFyYW1zOntyZWw6J3NlbGYnfSx1cmlCdWlsZGVyOnthYnNvbHV0ZTpmYWxzZX0scmVsczpbJ3NlbGYnXSxyZWw6J3NlbGYnfV19IgorICAgICAgICAgICAgICAgICAgICArICJdLGZpcnN0UGFnZTpmYWxzZSxwcmV2aW91c1BhZ2VBdmFpbGFibGU6dHJ1ZSxuZXh0UGFnZUF2YWlsYWJsZTp0cnVlLGxhc3RQYWdlOmZhbHNlfSIsCisgICAgICAgICAgICAgICAgb3JkZXIsIHRydWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgbWV0YUFubm90YXRpb25zQ2FuQmVVc2VkVG9BYnN0cmFjdENvbW1vbkJlaGF2aW9yXzMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCIvb3JkZXJzIikucXVlcnlQYXJhbSgicGFnZSIsICIyIikucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLmdldCgpOworCisgICAgICAgIFN0cmluZyBvcmRlciA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgSlNPTkFzc2VydC5hc3NlcnRFcXVhbHMoIntudW1iZXI6MixzaXplOjIsdG90YWxQYWdlczozLG51bWJlck9mRWxlbWVudHM6MCx0b3RhbEVsZW1lbnRzOjYsbGlua3M6WyIKKyAgICAgICAgICAgICAgICAgICAgKyAie3VyaTonL29yZGVycycscGFyYW1zOntyZWw6J2NyZWF0ZSd9LHVyaUJ1aWxkZXI6e2Fic29sdXRlOmZhbHNlfSxyZWxzOlsnY3JlYXRlJ10scmVsOidjcmVhdGUnfSwiCisgICAgICAgICAgICAgICAgICAgICsgInt1cmk6Jy9vcmRlcnM/cGFnZT0xJnNpemU9MicscGFyYW1zOntyZWw6J3ByZXYnfSx1cmlCdWlsZGVyOnthYnNvbHV0ZTpmYWxzZX0scmVsczpbJ3ByZXYnXSxyZWw6J3ByZXYnfSIKKyAgICAgICAgICAgICAgICAgICAgKyAiXSxvcmRlcnM6WyIKKyAgICAgICAgICAgICAgICAgICAgKyAie2lkOic1JyxwcmljZTonMS45OScsbGlua3M6WyIKKyAgICAgICAgICAgICAgICAgICAgKyAie3VyaTonL29yZGVycy81JyxwYXJhbXM6e3JlbDonc2VsZid9LHVyaUJ1aWxkZXI6e2Fic29sdXRlOmZhbHNlfSxyZWxzOlsnc2VsZiddLHJlbDonc2VsZid9LCIKKyAgICAgICAgICAgICAgICAgICAgKyAie3VyaTonL3BheW1lbnRzL29yZGVyLzUnLHBhcmFtczp7cmVsOidwYXknfSx1cmlCdWlsZGVyOnthYnNvbHV0ZTpmYWxzZX0scmVsczpbJ3BheSddLHJlbDoncGF5J31dfSwiCisgICAgICAgICAgICAgICAgICAgICsgIntpZDonNicscHJpY2U6JzAuMCcsbGlua3M6WyIKKyAgICAgICAgICAgICAgICAgICAgKyAie3VyaTonL29yZGVycy82JyxwYXJhbXM6e3JlbDonc2VsZid9LHVyaUJ1aWxkZXI6e2Fic29sdXRlOmZhbHNlfSxyZWxzOlsnc2VsZiddLHJlbDonc2VsZid9XX0iCisgICAgICAgICAgICAgICAgICAgICsgIl0sZmlyc3RQYWdlOmZhbHNlLHByZXZpb3VzUGFnZUF2YWlsYWJsZTp0cnVlLG5leHRQYWdlQXZhaWxhYmxlOmZhbHNlLGxhc3RQYWdlOnRydWV9IiwKKyAgICAgICAgICAgICAgICBvcmRlciwgdHJ1ZSk7CisgICAgfQorCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHByb3ZpZGVDYW5CZVVzZWRJbkNvbmp1bmN0aW9uV2l0aEluamVjdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoIi9wYXltZW50cy9wLTEiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIFN0cmluZyBvcmRlciA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgSlNPTkFzc2VydC5hc3NlcnRFcXVhbHMoIntpZDoncC0xJyxvcmRlcklkOicxJyxsaW5rczpbIgorICAgICAgICAgICAgICAgICAgICArICJ7dXJpOicvcGF5bWVudHMvcC0xJyxwYXJhbXM6e3JlbDonc2VsZid9LHVyaUJ1aWxkZXI6e2Fic29sdXRlOmZhbHNlfSxyZWw6J3NlbGYnLHJlbHM6WydzZWxmJ119LCIKKyAgICAgICAgICAgICAgICAgICAgKyAie3VyaTonL29yZGVycy8xJyxwYXJhbXM6e3JlbDonb3JkZXInfSx1cmlCdWlsZGVyOnthYnNvbHV0ZTpmYWxzZX0scmVsOidvcmRlcicscmVsczpbJ29yZGVyJ119XX0iLAorICAgICAgICAgICAgICAgIG9yZGVyLCB0cnVlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xpbmtpbmcvaW50ZWdyYXRpb24vYXBwL0xpbmtpbmdBcHBsaWNhdGlvbi5qYXZhIGIvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL2ludGVncmF0aW9uL2FwcC9MaW5raW5nQXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzAxMGMyCi0tLSAvZGV2L251bGwKKysrIGIvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL2ludGVncmF0aW9uL2FwcC9MaW5raW5nQXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmxpbmtpbmcuaW50ZWdyYXRpb24uYXBwOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubGlua2luZy5EZWNsYXJhdGl2ZUxpbmtpbmdGZWF0dXJlOworCitwdWJsaWMgY2xhc3MgTGlua2luZ0FwcGxpY2F0aW9uIGV4dGVuZHMgTGlua2luZ01hbnVhbEFwcGxpY2F0aW9uIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxPYmplY3Q+IHNpbmdsZXRvbnMgPSBuZXcgSGFzaFNldDw+KEFycmF5cy5hc0xpc3QoCisgICAgICAgICAgICBuZXcgRGVjbGFyYXRpdmVMaW5raW5nRmVhdHVyZSgpLAorICAgICAgICAgICAgbmV3IE9iamVjdE1hcHBlckNvbnRleHRSZXNvbHZlcigpKSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PE9iamVjdD4gZ2V0U2luZ2xldG9ucygpIHsKKyAgICAgICAgcmV0dXJuIHNpbmdsZXRvbnM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL2ludGVncmF0aW9uL2FwcC9MaW5raW5nTWFudWFsQXBwbGljYXRpb24uamF2YSBiL2luY3ViYXRvci9kZWNsYXJhdGl2ZS1saW5raW5nL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbGlua2luZy9pbnRlZ3JhdGlvbi9hcHAvTGlua2luZ01hbnVhbEFwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVhNDk4YQotLS0gL2Rldi9udWxsCisrKyBiL2luY3ViYXRvci9kZWNsYXJhdGl2ZS1saW5raW5nL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbGlua2luZy9pbnRlZ3JhdGlvbi9hcHAvTGlua2luZ01hbnVhbEFwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5saW5raW5nLmludGVncmF0aW9uLmFwcDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworcHVibGljIGNsYXNzIExpbmtpbmdNYW51YWxBcHBsaWNhdGlvbiBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxDbGFzczw/Pj4gY2xhc3NlcyA9IG5ldyBIYXNoU2V0PD4oQXJyYXlzLmFzTGlzdChPcmRlcnNSZXNvdXJjZS5jbGFzcywgUGF5bWVudFJlc291cmNlLmNsYXNzKSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICByZXR1cm4gY2xhc3NlczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PE9iamVjdD4gZ2V0U2luZ2xldG9ucygpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbihuZXcgT2JqZWN0TWFwcGVyQ29udGV4dFJlc29sdmVyKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2luY3ViYXRvci9kZWNsYXJhdGl2ZS1saW5raW5nL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbGlua2luZy9pbnRlZ3JhdGlvbi9hcHAvT2JqZWN0TWFwcGVyQ29udGV4dFJlc29sdmVyLmphdmEgYi9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xpbmtpbmcvaW50ZWdyYXRpb24vYXBwL09iamVjdE1hcHBlckNvbnRleHRSZXNvbHZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMmUzNjkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xpbmtpbmcvaW50ZWdyYXRpb24vYXBwL09iamVjdE1hcHBlckNvbnRleHRSZXNvbHZlci5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubGlua2luZy5pbnRlZ3JhdGlvbi5hcHA7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuQ29udGV4dFJlc29sdmVyOworCitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmFubm90YXRpb24uSnNvbkluY2x1ZGU7CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLk9iamVjdE1hcHBlcjsKKworcHVibGljIGNsYXNzIE9iamVjdE1hcHBlckNvbnRleHRSZXNvbHZlciBpbXBsZW1lbnRzIENvbnRleHRSZXNvbHZlcjxPYmplY3RNYXBwZXI+IHsKKyAgICBAQ29udGV4dAorICAgIHByaXZhdGUgSHR0cEhlYWRlcnMgaGVhZGVyczsKKworICAgIHByaXZhdGUgZmluYWwgT2JqZWN0TWFwcGVyIG1hcHBlcjsKKworICAgIHB1YmxpYyBPYmplY3RNYXBwZXJDb250ZXh0UmVzb2x2ZXIoKSB7CisgICAgICAgIG1hcHBlciA9IG5ldyBPYmplY3RNYXBwZXIoKTsKKworICAgICAgICAvLyBzZXJpYWxpemF0aW9uIGJlaGF2aW91cgorICAgICAgICBtYXBwZXIuc2V0U2VyaWFsaXphdGlvbkluY2x1c2lvbihKc29uSW5jbHVkZS5JbmNsdWRlLk5PTl9FTVBUWSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdE1hcHBlciBnZXRDb250ZXh0KENsYXNzPD8+IHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIG1hcHBlcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xpbmtpbmcvaW50ZWdyYXRpb24vYXBwL09yZGVyc1Jlc291cmNlLmphdmEgYi9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xpbmtpbmcvaW50ZWdyYXRpb24vYXBwL09yZGVyc1Jlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdkNTU5ZAotLS0gL2Rldi9udWxsCisrKyBiL2luY3ViYXRvci9kZWNsYXJhdGl2ZS1saW5raW5nL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbGlua2luZy9pbnRlZ3JhdGlvbi9hcHAvT3JkZXJzUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDEyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5saW5raW5nLmludGVncmF0aW9uLmFwcDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkludFN0cmVhbTsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkRFTEVURTsKK2ltcG9ydCBqYXZheC53cy5ycy5EZWZhdWx0VmFsdWU7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5MaW5rOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubGlua2luZy5CaW5kaW5nOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxpbmtpbmcuUHJvdmlkZUxpbms7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubGlua2luZy5pbnRlZ3JhdGlvbi5yZXByZXNlbnRhdGlvbnMuRXh0ZW5kZWRPcmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5saW5raW5nLmludGVncmF0aW9uLnJlcHJlc2VudGF0aW9ucy5PcmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5saW5raW5nLmludGVncmF0aW9uLnJlcHJlc2VudGF0aW9ucy5PcmRlclBhZ2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubGlua2luZy5pbnRlZ3JhdGlvbi5yZXByZXNlbnRhdGlvbnMuT3JkZXJSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxpbmtpbmcuaW50ZWdyYXRpb24ucmVwcmVzZW50YXRpb25zLlBhZ2VMaW5rczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5saW5raW5nLmludGVncmF0aW9uLnJlcHJlc2VudGF0aW9ucy5QYXltZW50Q29uZmlybWF0aW9uOworCisKK0BQYXRoKCIvb3JkZXJzIikKK3B1YmxpYyBjbGFzcyBPcmRlcnNSZXNvdXJjZSB7CisKKyAgICBAQ29udGV4dAorICAgIHByaXZhdGUgVXJpSW5mbyB1cmlJbmZvOworCisKKyAgICBAUHJvdmlkZUxpbmsodmFsdWUgPSBPcmRlclBhZ2UuY2xhc3MsIHJlbCA9ICJjcmVhdGUiKQorICAgIEBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisgICAgQFBPU1QKKyAgICBwdWJsaWMgUmVzcG9uc2UgY3JlYXRlKE9yZGVyUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIE9yZGVyIG9yZGVyID0gbmV3IE9yZGVyKCk7CisgICAgICAgIG9yZGVyLnNldElkKCIxMjMiKTsKKyAgICAgICAgaWYgKCJ3YXRlciIuZXF1YWxzSWdub3JlQ2FzZShyZXF1ZXN0LmdldERyaW5rKCkpKSB7CisgICAgICAgICAgICBvcmRlci5zZXRQcmljZSgiMC4wIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvcmRlci5zZXRQcmljZSgiMS45OSIpOworICAgICAgICB9CisKKyAgICAgICAgb3JkZXIuZ2V0TGlua3MoKS5hZGQoTGluay5mcm9tVXJpKCIvIikucmVsKCJyb290IikuYnVpbGQoKSk7CisgICAgICAgIHJldHVybiBSZXNwb25zZS5vayhvcmRlcikuYnVpbGQoKTsKKyAgICB9CisKKyAgICBAUHJvdmlkZUxpbmsodmFsdWUgPSBPcmRlci5jbGFzcywgcmVsID0gInNlbGYiLCBiaW5kaW5ncyA9IEBCaW5kaW5nKG5hbWUgPSAib3JkZXJJZCIsIHZhbHVlID0gIiR7aW5zdGFuY2UuaWR9IikpCisgICAgQFByb3ZpZGVMaW5rKHZhbHVlID0gUGF5bWVudENvbmZpcm1hdGlvbi5jbGFzcywgcmVsID0gIm9yZGVyIiwKKyAgICAgICAgICAgICAgICAgYmluZGluZ3MgPSBAQmluZGluZyhuYW1lID0gIm9yZGVySWQiLCB2YWx1ZSA9ICIke2luc3RhbmNlLm9yZGVySWR9IikpCisgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorICAgIEBHRVQKKyAgICBAUGF0aCgiL3tvcmRlcklkfSIpCisgICAgcHVibGljIFJlc3BvbnNlIGdldChAUGF0aFBhcmFtKCJvcmRlcklkIikgU3RyaW5nIG9yZGVySWQpIHsKKyAgICAgICAgRXh0ZW5kZWRPcmRlciBvcmRlciA9IG5ldyBFeHRlbmRlZE9yZGVyKCk7CisgICAgICAgIG9yZGVyLnNldElkKCIxMjMiKTsKKyAgICAgICAgb3JkZXIuc2V0UHJpY2UoIjEuOTkiKTsKKyAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKG9yZGVyKS5idWlsZCgpOworICAgIH0KKworCisgICAgQFByb3ZpZGVMaW5rKHZhbHVlID0gRXh0ZW5kZWRPcmRlci5jbGFzcywgcmVsID0gImRlbGV0ZSIsCisgICAgICAgICAgICAgICAgIGJpbmRpbmdzID0gQEJpbmRpbmcobmFtZSA9ICJvcmRlcklkIiwgdmFsdWUgPSAiJHtpbnN0YW5jZS5pZH0iKSkKKyAgICBAREVMRVRFCisgICAgQFBhdGgoIi97b3JkZXJJZH0iKQorICAgIHB1YmxpYyBSZXNwb25zZSBkZWxldGUoQFBhdGhQYXJhbSgib3JkZXJJZCIpIFN0cmluZyBvcmRlcklkKSB7CisgICAgICAgIHJldHVybiBSZXNwb25zZS5ub0NvbnRlbnQoKS5idWlsZCgpOworICAgIH0KKworCisgICAgQFBhZ2VMaW5rcyhPcmRlclBhZ2UuY2xhc3MpCisgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorICAgIEBHRVQKKyAgICBwdWJsaWMgUmVzcG9uc2UgbGlzdChAUXVlcnlQYXJhbSgicGFnZSIpIEBEZWZhdWx0VmFsdWUoIjAiKSBpbnQgcGFnZSwgQFF1ZXJ5UGFyYW0oInNpemUiKSBARGVmYXVsdFZhbHVlKCIyIikgIGludCBzaXplKSB7CisgICAgICAgIE9yZGVyUGFnZSBvcmRlclBhZ2UgPSBuZXcgT3JkZXJQYWdlKCk7CisKKyAgICAgICAgb3JkZXJQYWdlLnNldEZpcnN0UGFnZShwYWdlID09IDApOworICAgICAgICBvcmRlclBhZ2Uuc2V0TGFzdFBhZ2UocGFnZSA9PSAyKTsKKyAgICAgICAgb3JkZXJQYWdlLnNldFByZXZpb3VzUGFnZUF2YWlsYWJsZShwYWdlID4gMCk7CisgICAgICAgIG9yZGVyUGFnZS5zZXROZXh0UGFnZUF2YWlsYWJsZShwYWdlIDwgMik7CisgICAgICAgIG9yZGVyUGFnZS5zZXROdW1iZXIocGFnZSk7CisgICAgICAgIG9yZGVyUGFnZS5zZXRTaXplKHNpemUpOworICAgICAgICBvcmRlclBhZ2Uuc2V0VG90YWxFbGVtZW50cyg2KTsKKyAgICAgICAgb3JkZXJQYWdlLnNldFRvdGFsUGFnZXMoMyk7CisKKyAgICAgICAgb3JkZXJQYWdlLnNldE9yZGVycyhnZW5lcmF0ZU9yZGVycyhwYWdlLCBzaXplKSk7CisKKyAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKG9yZGVyUGFnZSkuYnVpbGQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8T3JkZXI+IGdlbmVyYXRlT3JkZXJzKGludCBwYWdlLCBpbnQgc2l6ZSkgeworICAgICAgICBmaW5hbCBpbnQgYmFzZSA9IHBhZ2UgKiBzaXplOworICAgICAgICByZXR1cm4gSW50U3RyZWFtLnJhbmdlKDEsIHNpemUgKyAxKS5tYXAoeCAtPiB4ICsgYmFzZSkubWFwVG9PYmooaWQgLT4geworICAgICAgICAgICAgT3JkZXIgb3JkZXIgPSBuZXcgT3JkZXIoKTsKKyAgICAgICAgICAgIG9yZGVyLnNldElkKEludGVnZXIudG9TdHJpbmcoaWQpKTsKKyAgICAgICAgICAgIG9yZGVyLnNldFByaWNlKCgoaWQgJiAxKSA9PSAxKSA/ICIxLjk5IiA6ICIwLjAiKTsKKyAgICAgICAgICAgIHJldHVybiBvcmRlcjsKKyAgICAgICAgfSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xpbmtpbmcvaW50ZWdyYXRpb24vYXBwL1BheW1lbnRSZXNvdXJjZS5qYXZhIGIvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL2ludGVncmF0aW9uL2FwcC9QYXltZW50UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGQzM2E1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL2ludGVncmF0aW9uL2FwcC9QYXltZW50UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmxpbmtpbmcuaW50ZWdyYXRpb24uYXBwOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBVVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubGlua2luZy5CaW5kaW5nOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxpbmtpbmcuUHJvdmlkZUxpbms7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubGlua2luZy5pbnRlZ3JhdGlvbi5yZXByZXNlbnRhdGlvbnMuT3JkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubGlua2luZy5pbnRlZ3JhdGlvbi5yZXByZXNlbnRhdGlvbnMuUGF5bWVudENvbmZpcm1hdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5saW5raW5nLmludGVncmF0aW9uLnJlcHJlc2VudGF0aW9ucy5QYXltZW50RGV0YWlsczsKKworCitAUGF0aCgiL3BheW1lbnRzIikKK3B1YmxpYyBjbGFzcyBQYXltZW50UmVzb3VyY2UgeworCisKKyAgICBAUHJvdmlkZUxpbmsodmFsdWUgPSBPcmRlci5jbGFzcywgcmVsID0gInBheSIsIGJpbmRpbmdzID0geworICAgICAgICAgICAgQEJpbmRpbmcobmFtZSA9ICJvcmRlcklkIiwgdmFsdWUgPSAiJHtpbnN0YW5jZS5pZH0iKX0sIGNvbmRpdGlvbiA9ICIke2luc3RhbmNlLnByaWNlICE9ICcwLjAnfSIpCisgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorICAgIEBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKyAgICBAUFVUCisgICAgQFBhdGgoIi9vcmRlci97b3JkZXJJZH0iKQorICAgIHB1YmxpYyBSZXNwb25zZSBwYXkoQFBhdGhQYXJhbSgib3JkZXJJZCIpIFN0cmluZyBvcmRlcklkLCBQYXltZW50RGV0YWlscyBwYXltZW50RGV0YWlscykgeworICAgICAgICBQYXltZW50Q29uZmlybWF0aW9uIHBheW1lbnRDb25maXJtYXRpb24gPSBuZXcgUGF5bWVudENvbmZpcm1hdGlvbigpOworICAgICAgICBwYXltZW50Q29uZmlybWF0aW9uLnNldE9yZGVySWQob3JkZXJJZCk7CisgICAgICAgIHBheW1lbnRDb25maXJtYXRpb24uc2V0SWQoInAtIiArIG9yZGVySWQpOworICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2socGF5bWVudENvbmZpcm1hdGlvbikuYnVpbGQoKTsKKyAgICB9CisKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisgICAgQEdFVAorICAgIEBQYXRoKCJ7aWR9IikKKyAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0Q29uZmlybWF0aW9uKEBQYXRoUGFyYW0oImlkIikgU3RyaW5nIGlkKSB7CisgICAgICAgIFBheW1lbnRDb25maXJtYXRpb24gcGF5bWVudENvbmZpcm1hdGlvbiA9IG5ldyBQYXltZW50Q29uZmlybWF0aW9uKCk7CisgICAgICAgIHBheW1lbnRDb25maXJtYXRpb24uc2V0SWQoaWQpOworICAgICAgICBwYXltZW50Q29uZmlybWF0aW9uLnNldE9yZGVySWQoaWQuc3Vic3RyaW5nKDIpKTsKKyAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKHBheW1lbnRDb25maXJtYXRpb24pLmJ1aWxkKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL2ludGVncmF0aW9uL3JlcHJlc2VudGF0aW9ucy9FeHRlbmRlZE9yZGVyLmphdmEgYi9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xpbmtpbmcvaW50ZWdyYXRpb24vcmVwcmVzZW50YXRpb25zL0V4dGVuZGVkT3JkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzRmMThmCi0tLSAvZGV2L251bGwKKysrIGIvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL2ludGVncmF0aW9uL3JlcHJlc2VudGF0aW9ucy9FeHRlbmRlZE9yZGVyLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5saW5raW5nLmludGVncmF0aW9uLnJlcHJlc2VudGF0aW9uczsKKworcHVibGljIGNsYXNzIEV4dGVuZGVkT3JkZXIgZXh0ZW5kcyBPcmRlciB7CisKKyAgICBwcml2YXRlIFN0cmluZyBkZXRhaWxzOworCisgICAgcHVibGljIFN0cmluZyBnZXREZXRhaWxzKCkgeworICAgICAgICByZXR1cm4gZGV0YWlsczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZXRhaWxzKFN0cmluZyBkZXRhaWxzKSB7CisgICAgICAgIHRoaXMuZGV0YWlscyA9IGRldGFpbHM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL2ludGVncmF0aW9uL3JlcHJlc2VudGF0aW9ucy9PcmRlci5qYXZhIGIvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL2ludGVncmF0aW9uL3JlcHJlc2VudGF0aW9ucy9PcmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYWYyN2QKLS0tIC9kZXYvbnVsbAorKysgYi9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xpbmtpbmcvaW50ZWdyYXRpb24vcmVwcmVzZW50YXRpb25zL09yZGVyLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5saW5raW5nLmludGVncmF0aW9uLnJlcHJlc2VudGF0aW9uczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5MaW5rOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubGlua2luZy5JbmplY3RMaW5rczsKKworcHVibGljIGNsYXNzIE9yZGVyIHsKKworICAgIHByaXZhdGUgU3RyaW5nIGlkOworCisgICAgcHJpdmF0ZSBTdHJpbmcgZHJpbms7CisKKyAgICBwcml2YXRlIFN0cmluZyBwcmljZTsKKworICAgIEBJbmplY3RMaW5rcworICAgIHByaXZhdGUgTGlzdDxMaW5rPiBsaW5rcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIGlkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldElkKFN0cmluZyBpZCkgeworICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXREcmluaygpIHsKKyAgICAgICAgcmV0dXJuIGRyaW5rOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERyaW5rKFN0cmluZyBkcmluaykgeworICAgICAgICB0aGlzLmRyaW5rID0gZHJpbms7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRQcmljZSgpIHsKKyAgICAgICAgcmV0dXJuIHByaWNlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByaWNlKFN0cmluZyBwcmljZSkgeworICAgICAgICB0aGlzLnByaWNlID0gcHJpY2U7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8TGluaz4gZ2V0TGlua3MoKSB7CisgICAgICAgIHJldHVybiBsaW5rczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRMaW5rcyhMaXN0PExpbms+IGxpbmtzKSB7CisgICAgICAgIHRoaXMubGlua3MgPSBsaW5rczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xpbmtpbmcvaW50ZWdyYXRpb24vcmVwcmVzZW50YXRpb25zL09yZGVyUGFnZS5qYXZhIGIvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL2ludGVncmF0aW9uL3JlcHJlc2VudGF0aW9ucy9PcmRlclBhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWVmMzdjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL2ludGVncmF0aW9uL3JlcHJlc2VudGF0aW9ucy9PcmRlclBhZ2UuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmxpbmtpbmcuaW50ZWdyYXRpb24ucmVwcmVzZW50YXRpb25zOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworcHVibGljIGNsYXNzIE9yZGVyUGFnZSBleHRlbmRzIFBhZ2UgeworCisgICAgcHJpdmF0ZSBMaXN0PE9yZGVyPiBvcmRlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgIHB1YmxpYyBMaXN0PE9yZGVyPiBnZXRPcmRlcnMoKSB7CisgICAgICAgIHJldHVybiBvcmRlcnM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0T3JkZXJzKExpc3Q8T3JkZXI+IG9yZGVycykgeworICAgICAgICB0aGlzLm9yZGVycyA9IG9yZGVyczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xpbmtpbmcvaW50ZWdyYXRpb24vcmVwcmVzZW50YXRpb25zL09yZGVyUmVxdWVzdC5qYXZhIGIvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL2ludGVncmF0aW9uL3JlcHJlc2VudGF0aW9ucy9PcmRlclJlcXVlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWYwYTlkCi0tLSAvZGV2L251bGwKKysrIGIvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL2ludGVncmF0aW9uL3JlcHJlc2VudGF0aW9ucy9PcmRlclJlcXVlc3QuamF2YQpAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmxpbmtpbmcuaW50ZWdyYXRpb24ucmVwcmVzZW50YXRpb25zOworCitwdWJsaWMgY2xhc3MgT3JkZXJSZXF1ZXN0IHsKKyAgICBwcml2YXRlIFN0cmluZyBkcmluazsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RHJpbmsoKSB7CisgICAgICAgIHJldHVybiBkcmluazsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREcmluayhTdHJpbmcgZHJpbmspIHsKKyAgICAgICAgdGhpcy5kcmluayA9IGRyaW5rOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2luY3ViYXRvci9kZWNsYXJhdGl2ZS1saW5raW5nL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbGlua2luZy9pbnRlZ3JhdGlvbi9yZXByZXNlbnRhdGlvbnMvUGFnZS5qYXZhIGIvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL2ludGVncmF0aW9uL3JlcHJlc2VudGF0aW9ucy9QYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUxZjFiYQotLS0gL2Rldi9udWxsCisrKyBiL2luY3ViYXRvci9kZWNsYXJhdGl2ZS1saW5raW5nL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbGlua2luZy9pbnRlZ3JhdGlvbi9yZXByZXNlbnRhdGlvbnMvUGFnZS5qYXZhCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmxpbmtpbmcuaW50ZWdyYXRpb24ucmVwcmVzZW50YXRpb25zOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkxpbms7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5saW5raW5nLkluamVjdExpbmtzOworCitwdWJsaWMgY2xhc3MgUGFnZSB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIHRoZSBjdXJyZW50IHBhZ2UuIElzIGFsd2F5cyBub24tbmVnYXRpdmUgYW5kIGxlc3MgdGhhdCB7QGNvZGUgUGFnZSNnZXRUb3RhbFBhZ2VzKCl9LgorICAgICAqLworICAgIHByaXZhdGUgaW50IG51bWJlcjsKKworICAgIC8qKgorICAgICAqIFRoZSBzaXplIG9mIHRoZSBwYWdlLgorICAgICAqLworICAgIHByaXZhdGUgaW50IHNpemU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIHRvdGFsIHBhZ2VzLgorICAgICAqLworICAgIHByaXZhdGUgaW50IHRvdGFsUGFnZXM7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGN1cnJlbnRseSBvbiB0aGlzIHBhZ2UuCisgICAgICovCisgICAgcHJpdmF0ZSBpbnQgbnVtYmVyT2ZFbGVtZW50czsKKworICAgIC8qKgorICAgICAqIFRoZSB0b3RhbCBhbW91bnQgb2YgZWxlbWVudHMuCisgICAgICovCisgICAgcHJpdmF0ZSBsb25nIHRvdGFsRWxlbWVudHM7CisKKyAgICAvKioKKyAgICAgKiBJZiB0aGVyZSBpcyBhIHByZXZpb3VzIHBhZ2UuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzUHJldmlvdXNQYWdlQXZhaWxhYmxlOworCisgICAgLyoqCisgICAgICogV2hldGhlciB0aGUgY3VycmVudCBwYWdlIGlzIHRoZSBmaXJzdCBvbmUuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzRmlyc3RQYWdlOworCisgICAgLyoqCisgICAgICogSWYgdGhlcmUgaXMgYSBuZXh0IHBhZ2UuCisgICAgICovCisgICAgcHJpdmF0ZSBib29sZWFuIGlzTmV4dFBhZ2VBdmFpbGFibGU7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHRoZSBjdXJyZW50IHBhZ2UgaXMgdGhlIGxhc3Qgb25lLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpc0xhc3RQYWdlOworCisgICAgQEluamVjdExpbmtzCisgICAgcHJpdmF0ZSBMaXN0PExpbms+IGxpbmtzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICBwdWJsaWMgaW50IGdldE51bWJlcigpIHsKKyAgICAgICAgcmV0dXJuIG51bWJlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROdW1iZXIoaW50IG51bWJlcikgeworICAgICAgICB0aGlzLm51bWJlciA9IG51bWJlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFNpemUoKSB7CisgICAgICAgIHJldHVybiBzaXplOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFNpemUoaW50IHNpemUpIHsKKyAgICAgICAgdGhpcy5zaXplID0gc2l6ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldFRvdGFsUGFnZXMoKSB7CisgICAgICAgIHJldHVybiB0b3RhbFBhZ2VzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRvdGFsUGFnZXMoaW50IHRvdGFsUGFnZXMpIHsKKyAgICAgICAgdGhpcy50b3RhbFBhZ2VzID0gdG90YWxQYWdlczsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50IGdldE51bWJlck9mRWxlbWVudHMoKSB7CisgICAgICAgIHJldHVybiBudW1iZXJPZkVsZW1lbnRzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE51bWJlck9mRWxlbWVudHMoaW50IG51bWJlck9mRWxlbWVudHMpIHsKKyAgICAgICAgdGhpcy5udW1iZXJPZkVsZW1lbnRzID0gbnVtYmVyT2ZFbGVtZW50czsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRUb3RhbEVsZW1lbnRzKCkgeworICAgICAgICByZXR1cm4gdG90YWxFbGVtZW50czsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUb3RhbEVsZW1lbnRzKGxvbmcgdG90YWxFbGVtZW50cykgeworICAgICAgICB0aGlzLnRvdGFsRWxlbWVudHMgPSB0b3RhbEVsZW1lbnRzOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzUHJldmlvdXNQYWdlQXZhaWxhYmxlKCkgeworICAgICAgICByZXR1cm4gaXNQcmV2aW91c1BhZ2VBdmFpbGFibGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UHJldmlvdXNQYWdlQXZhaWxhYmxlKGJvb2xlYW4gcHJldmlvdXNQYWdlQXZhaWxhYmxlKSB7CisgICAgICAgIGlzUHJldmlvdXNQYWdlQXZhaWxhYmxlID0gcHJldmlvdXNQYWdlQXZhaWxhYmxlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzRmlyc3RQYWdlKCkgeworICAgICAgICByZXR1cm4gaXNGaXJzdFBhZ2U7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Rmlyc3RQYWdlKGJvb2xlYW4gZmlyc3RQYWdlKSB7CisgICAgICAgIGlzRmlyc3RQYWdlID0gZmlyc3RQYWdlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzTmV4dFBhZ2VBdmFpbGFibGUoKSB7CisgICAgICAgIHJldHVybiBpc05leHRQYWdlQXZhaWxhYmxlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5leHRQYWdlQXZhaWxhYmxlKGJvb2xlYW4gbmV4dFBhZ2VBdmFpbGFibGUpIHsKKyAgICAgICAgaXNOZXh0UGFnZUF2YWlsYWJsZSA9IG5leHRQYWdlQXZhaWxhYmxlOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzTGFzdFBhZ2UoKSB7CisgICAgICAgIHJldHVybiBpc0xhc3RQYWdlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldExhc3RQYWdlKGJvb2xlYW4gbGFzdFBhZ2UpIHsKKyAgICAgICAgaXNMYXN0UGFnZSA9IGxhc3RQYWdlOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PExpbms+IGdldExpbmtzKCkgeworICAgICAgICByZXR1cm4gbGlua3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TGlua3MoTGlzdDxMaW5rPiBsaW5rcykgeworICAgICAgICB0aGlzLmxpbmtzID0gbGlua3M7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL2ludGVncmF0aW9uL3JlcHJlc2VudGF0aW9ucy9QYWdlTGlua3MuamF2YSBiL2luY3ViYXRvci9kZWNsYXJhdGl2ZS1saW5raW5nL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbGlua2luZy9pbnRlZ3JhdGlvbi9yZXByZXNlbnRhdGlvbnMvUGFnZUxpbmtzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIxYmE1MgotLS0gL2Rldi9udWxsCisrKyBiL2luY3ViYXRvci9kZWNsYXJhdGl2ZS1saW5raW5nL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbGlua2luZy9pbnRlZ3JhdGlvbi9yZXByZXNlbnRhdGlvbnMvUGFnZUxpbmtzLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5saW5raW5nLmludGVncmF0aW9uLnJlcHJlc2VudGF0aW9uczsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5saW5raW5nLkJpbmRpbmc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubGlua2luZy5Qcm92aWRlTGluazsKKworQFByb3ZpZGVMaW5rKHZhbHVlID0gUHJvdmlkZUxpbmsuSW5oZXJpdEZyb21Bbm5vdGF0aW9uLmNsYXNzLCByZWwgPSAibmV4dCIsIGJpbmRpbmdzID0geworICAgICAgICBAQmluZGluZyhuYW1lID0gInBhZ2UiLCB2YWx1ZSA9ICIke2luc3RhbmNlLm51bWJlciArIDF9IiksCisgICAgICAgIEBCaW5kaW5nKG5hbWUgPSAic2l6ZSIsIHZhbHVlID0gIiR7aW5zdGFuY2Uuc2l6ZX0iKSwKK30sIGNvbmRpdGlvbiA9ICIke2luc3RhbmNlLm5leHRQYWdlQXZhaWxhYmxlfSIpCitAUHJvdmlkZUxpbmsodmFsdWUgPSBQcm92aWRlTGluay5Jbmhlcml0RnJvbUFubm90YXRpb24uY2xhc3MsIHJlbCA9ICJwcmV2IiwgYmluZGluZ3MgPSB7CisgICAgICAgIEBCaW5kaW5nKG5hbWUgPSAicGFnZSIsIHZhbHVlID0gIiR7aW5zdGFuY2UubnVtYmVyIC0gMX0iKSwKKyAgICAgICAgQEJpbmRpbmcobmFtZSA9ICJzaXplIiwgdmFsdWUgPSAiJHtpbnN0YW5jZS5zaXplfSIpLAorfSwgY29uZGl0aW9uID0gIiR7aW5zdGFuY2UucHJldmlvdXNQYWdlQXZhaWxhYmxlfSIpCitAVGFyZ2V0KHtFbGVtZW50VHlwZS5NRVRIT0R9KQorQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BEb2N1bWVudGVkCitwdWJsaWMgQGludGVyZmFjZSBQYWdlTGlua3MgeworICAgIENsYXNzPD8+IHZhbHVlKCk7Cit9CmRpZmYgLS1naXQgYS9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xpbmtpbmcvaW50ZWdyYXRpb24vcmVwcmVzZW50YXRpb25zL1BheW1lbnRDb25maXJtYXRpb24uamF2YSBiL2luY3ViYXRvci9kZWNsYXJhdGl2ZS1saW5raW5nL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbGlua2luZy9pbnRlZ3JhdGlvbi9yZXByZXNlbnRhdGlvbnMvUGF5bWVudENvbmZpcm1hdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2OWRkOTAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xpbmtpbmcvaW50ZWdyYXRpb24vcmVwcmVzZW50YXRpb25zL1BheW1lbnRDb25maXJtYXRpb24uamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmxpbmtpbmcuaW50ZWdyYXRpb24ucmVwcmVzZW50YXRpb25zOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkxpbms7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5saW5raW5nLkluamVjdExpbms7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubGlua2luZy5JbmplY3RMaW5rczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5saW5raW5nLmludGVncmF0aW9uLmFwcC5QYXltZW50UmVzb3VyY2U7CisKK3B1YmxpYyBjbGFzcyBQYXltZW50Q29uZmlybWF0aW9uIHsKKworICAgIHByaXZhdGUgU3RyaW5nIGlkOworCisgICAgcHJpdmF0ZSBTdHJpbmcgb3JkZXJJZDsKKworICAgIEBJbmplY3RMaW5rcygKKyAgICAgICAgICAgIEBJbmplY3RMaW5rKHJlc291cmNlID0gUGF5bWVudFJlc291cmNlLmNsYXNzLCBtZXRob2QgPSAiZ2V0Q29uZmlybWF0aW9uIiwgcmVsID0gInNlbGYiKQorICAgICkKKyAgICBwcml2YXRlIExpc3Q8TGluaz4gbGlua3MgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiBpZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRJZChTdHJpbmcgaWQpIHsKKyAgICAgICAgdGhpcy5pZCA9IGlkOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3JkZXJJZCgpIHsKKyAgICAgICAgcmV0dXJuIG9yZGVySWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0T3JkZXJJZChTdHJpbmcgb3JkZXJJZCkgeworICAgICAgICB0aGlzLm9yZGVySWQgPSBvcmRlcklkOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PExpbms+IGdldExpbmtzKCkgeworICAgICAgICByZXR1cm4gbGlua3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TGlua3MoTGlzdDxMaW5rPiBsaW5rcykgeworICAgICAgICB0aGlzLmxpbmtzID0gbGlua3M7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL2ludGVncmF0aW9uL3JlcHJlc2VudGF0aW9ucy9QYXltZW50RGV0YWlscy5qYXZhIGIvaW5jdWJhdG9yL2RlY2xhcmF0aXZlLWxpbmtpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9saW5raW5nL2ludGVncmF0aW9uL3JlcHJlc2VudGF0aW9ucy9QYXltZW50RGV0YWlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NGYyMDQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmN1YmF0b3IvZGVjbGFyYXRpdmUtbGlua2luZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2xpbmtpbmcvaW50ZWdyYXRpb24vcmVwcmVzZW50YXRpb25zL1BheW1lbnREZXRhaWxzLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5saW5raW5nLmludGVncmF0aW9uLnJlcHJlc2VudGF0aW9uczsKKworcHVibGljIGNsYXNzIFBheW1lbnREZXRhaWxzIHsKKyAgICBwcml2YXRlIFN0cmluZyBjcmVkaXRDYXJkTnVtYmVyOworICAgIHByaXZhdGUgU3RyaW5nIGN2ZTsKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworICAgIHByaXZhdGUgU3RyaW5nIGV4cGlyYXRpb247CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldENyZWRpdENhcmROdW1iZXIoKSB7CisgICAgICAgIHJldHVybiBjcmVkaXRDYXJkTnVtYmVyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENyZWRpdENhcmROdW1iZXIoU3RyaW5nIGNyZWRpdENhcmROdW1iZXIpIHsKKyAgICAgICAgdGhpcy5jcmVkaXRDYXJkTnVtYmVyID0gY3JlZGl0Q2FyZE51bWJlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEN2ZSgpIHsKKyAgICAgICAgcmV0dXJuIGN2ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDdmUoU3RyaW5nIGN2ZSkgeworICAgICAgICB0aGlzLmN2ZSA9IGN2ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEV4cGlyYXRpb24oKSB7CisgICAgICAgIHJldHVybiBleHBpcmF0aW9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEV4cGlyYXRpb24oU3RyaW5nIGV4cGlyYXRpb24pIHsKKyAgICAgICAgdGhpcy5leHBpcmF0aW9uID0gZXhwaXJhdGlvbjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9pbmN1YmF0b3IvZ2FlLWludGVncmF0aW9uL3BvbS54bWwgYi9pbmN1YmF0b3IvZ2FlLWludGVncmF0aW9uL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY5MmM5MAotLS0gL2Rldi9udWxsCisrKyBiL2luY3ViYXRvci9nYWUtaW50ZWdyYXRpb24vcG9tLnhtbApAQCAtMCwwICsxLDUyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5pbmN1YmF0b3I8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktZ2FlLWludGVncmF0aW9uPC9hcnRpZmFjdElkPgorICAgIDxuYW1lPmplcnNleS1leHQtZ2FlLWludGVncmF0aW9uPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBKZXJzZXkgZXh0ZW5zaW9uIG1vZHVsZSBwcm92aWRpbmcgc3VwcG9ydCBmb3IgR29vZ2xlIEFwcCBFbmdpbmUgaW50ZWdyYXRpb24uCisgICAgICAgIE5PVEU6IElUIERPRVMgTk9UIFdPUksgWUVUIEJFQ0FVU0UgT0YgR0FFIFNFUlZMRVQgMi41IChzZWUgaHR0cHM6Ly9qYXZhLm5ldC9qaXJhL2Jyb3dzZS9KRVJTRVktMTg1MykhISEKKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXNlcnZlcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5hcHBlbmdpbmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5hcHBlbmdpbmUtYXBpLTEuMC1zZGs8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke2dhZS52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvaW5jdWJhdG9yL2dhZS1pbnRlZ3JhdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9nYWUvR2FlQmFja2dyb3VuZEV4ZWN1dG9yUHJvdmlkZXIuamF2YSBiL2luY3ViYXRvci9nYWUtaW50ZWdyYXRpb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvZ2FlL0dhZUJhY2tncm91bmRFeGVjdXRvclByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMzODcyNQotLS0gL2Rldi9udWxsCisrKyBiL2luY3ViYXRvci9nYWUtaW50ZWdyYXRpb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvZ2FlL0dhZUJhY2tncm91bmRFeGVjdXRvclByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuZ2FlOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkRmFjdG9yeTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5CYWNrZ3JvdW5kU2NoZWR1bGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5TY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3JQcm92aWRlcjsKKworLyoqCisgKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgSmVyc2V5J3MgU1BJIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXJ9IHRvIHByb3ZpZGUgYQorICoge0BsaW5rIGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZX0gaW5zdGFuY2VzIHdpdGggYSBHQUUgc3BlY2lmaWMge0BsaW5rIFRocmVhZEZhY3Rvcnl9IHByb3ZpZGVyCisgKiAtIHtAbGluayBjb20uZ29vZ2xlLmFwcGVuZ2luZS5hcGkuVGhyZWFkTWFuYWdlcn0uCisgKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK0BCYWNrZ3JvdW5kU2NoZWR1bGVyCitjbGFzcyBHYWVCYWNrZ3JvdW5kRXhlY3V0b3JQcm92aWRlciBleHRlbmRzIFNjaGVkdWxlZFRocmVhZFBvb2xFeGVjdXRvclByb3ZpZGVyIHsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgaW5zdGFuY2Ugb2YgR0FFLXNwZWNpZmljIGJhY2tncm91bmQgc2NoZWR1bGVkIGV4ZWN1dG9yIHNlcnZpY2UgcHJvdmlkZXIuCisgICAgICovCisgICAgcHVibGljIEdhZUJhY2tncm91bmRFeGVjdXRvclByb3ZpZGVyKCkgeworICAgICAgICBzdXBlcigiZ2FlLWplcnNleS1iYWNrZ3JvdW5kLXRhc2stc2NoZWR1bGVyIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRocmVhZEZhY3RvcnkgZ2V0QmFja2luZ1RocmVhZEZhY3RvcnkoKSB7CisgICAgICAgIHJldHVybiBjb20uZ29vZ2xlLmFwcGVuZ2luZS5hcGkuVGhyZWFkTWFuYWdlci5iYWNrZ3JvdW5kVGhyZWFkRmFjdG9yeSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBpbnQgZ2V0Q29yZVBvb2xTaXplKCkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9pbmN1YmF0b3IvZ2FlLWludGVncmF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2dhZS9HYWVGZWF0dXJlLmphdmEgYi9pbmN1YmF0b3IvZ2FlLWludGVncmF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2dhZS9HYWVGZWF0dXJlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M5OWY4NAotLS0gL2Rldi9udWxsCisrKyBiL2luY3ViYXRvci9nYWUtaW50ZWdyYXRpb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvZ2FlL0dhZUZlYXR1cmUuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5nYWU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdHJhaW5lZFRvOworaW1wb3J0IGphdmF4LndzLnJzLlJ1bnRpbWVUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmVDb250ZXh0OworCisvKioKKyAqIEdvb2dsZSBBcHAgRW5naW5lIGludGVncmF0aW9uIGZvciBKZXJzZXkgc2VydmVyIHJ1bnRpbWUuCisgKiA8cD4KKyAqIFJlZ2lzdGVyIHRoaXMgZmVhdHVyZSBpbiB5b3VyIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWd9IHN1YmNsYXNzIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gcnVuCisgKiB5b3VyIEplcnNleSBhcHBsaWNhdGlvbiBvbiBHb29nbGUgQXBwIEVuZ2luZS4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQENvbnN0cmFpbmVkVG8oUnVudGltZVR5cGUuU0VSVkVSKQorcHVibGljIGZpbmFsIGNsYXNzIEdhZUZlYXR1cmUgaW1wbGVtZW50cyBGZWF0dXJlIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZShmaW5hbCBGZWF0dXJlQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGlmICghY29udGV4dC5nZXRDb25maWd1cmF0aW9uKCkuaXNSZWdpc3RlcmVkKEdhZUJhY2tncm91bmRFeGVjdXRvclByb3ZpZGVyLmNsYXNzKSkgeworICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihuZXcgR2FlQmFja2dyb3VuZEV4ZWN1dG9yUHJvdmlkZXIoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9pbmN1YmF0b3IvZ2FlLWludGVncmF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2dhZS9wYWNrYWdlLWluZm8uamF2YSBiL2luY3ViYXRvci9nYWUtaW50ZWdyYXRpb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvZ2FlL3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNDM5MTYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmN1YmF0b3IvZ2FlLWludGVncmF0aW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2dhZS9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDIzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvKioKKyAqIFB1YmxpYyBBUEkgb2YgR29vZ2xlIEFwcCBFbmdpbmUgaW50ZWdyYXRpb24gc3VwcG9ydC4KKyAqCisgKiBSZWdpc3RlciB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmdhZS5HYWVGZWF0dXJlfSBpbiB5b3VyIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWd9CisgKiBzdWJjbGFzcyB0byBlbmFibGUgdGhlIHN1cHBvcnQuCisgKi8KK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmdhZTsKZGlmZiAtLWdpdCBhL2luY3ViYXRvci9odG1sLWpzb24vcG9tLnhtbCBiL2luY3ViYXRvci9odG1sLWpzb24vcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODJiYjQ2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jdWJhdG9yL2h0bWwtanNvbi9wb20ueG1sCkBAIC0wLDAgKzEsMTE3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5pbmN1YmF0b3I8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjYtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5odG1sLWpzb248L2FydGlmYWN0SWQ+CisKKyAgICA8bmFtZT5qZXJzZXktbWVkaWEtaHRtbC1qc29uPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBKQVgtUlMgUmVhZGVyL1dyaXRlciB2aWEgbmV0LmphdmEuaHRtbC5qc29uIGxpYnJhcnkgdGhhdCBwcm92aWRlcworICAgICAgICBKU09OIHNlcmlhbGl6YXRpb24gYW5kIGRlc2VyaWFsaXphdGlvbiB1c2luZyBsaWdodHdlaWdodCAobm8gcmVmbGVjdGlvbikKKyAgICAgICAgbmV0LmphdmEuaHRtbC5qc29uIGxpYnJhcnkuIERlZmluZSB5b3VyIG9iamVjdHMgdmlhIEBNb2RlbCBhbm5vdGF0aW9uLgorICAgICAgICBVc2UgdGhlbSBpbiBKZXJzZXkuCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8bmV0LmphdmEuaHRtbC52ZXJzaW9uPjEuMDwvbmV0LmphdmEuaHRtbC52ZXJzaW9uPgorICAgIDwvcHJvcGVydGllcz4KKworICAgIDxyZXBvc2l0b3JpZXM+CisgICAgICAgIDxyZXBvc2l0b3J5PgorICAgICAgICAgICAgPGlkPm5ldGJlYW5zPC9pZD4KKyAgICAgICAgICAgIDxuYW1lPk5ldEJlYW5zPC9uYW1lPgorICAgICAgICAgICAgPHVybD5odHRwOi8vYml0cy5uZXRiZWFucy5vcmcvbWF2ZW4yLzwvdXJsPgorICAgICAgICA8L3JlcG9zaXRvcnk+CisgICAgPC9yZXBvc2l0b3JpZXM+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LndzLnJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXgud3MucnMtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm5ldGJlYW5zLmh0bWw8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5uZXQuamF2YS5odG1sLmpzb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke25ldC5qYXZhLmh0bWwudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubmV0YmVhbnMuYXBpPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLW9wZW5pZGUtdXRpbC1sb29rdXA8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj5SRUxFQVNFODA8L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jbGllbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5hbm5vdGF0aW9uPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguYW5ub3RhdGlvbi1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yazwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29ubmVjdG9yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1hcGFjaGUtY29ubmVjdG9yPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5uZXRiZWFucy5odG1sPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+a28td3MtdHlydXM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke25ldC5qYXZhLmh0bWwudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPCEtLSBPdmVyd3JpdGUgR3JpenpseSBkZXBlbmRlbmN5IGRlZmluZWQgaW4ga28td3MtdHlydXMgLS0+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5ncml6emx5PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z3JpenpseS1mcmFtZXdvcms8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke2dyaXp6bHkyLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9pbmN1YmF0b3IvaHRtbC1qc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvaHRtbGpzb24vSHRtbEpzb25Qcm92aWRlci5qYXZhIGIvaW5jdWJhdG9yL2h0bWwtanNvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL2h0bWxqc29uL0h0bWxKc29uUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjIwZWRhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jdWJhdG9yL2h0bWwtanNvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL2h0bWxqc29uL0h0bWxKc29uUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5odG1sanNvbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFycmF5OworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlBhcmFtZXRlcml6ZWRUeXBlOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworCitpbXBvcnQgb3JnLm9wZW5pZGUudXRpbC5sb29rdXAuU2VydmljZVByb3ZpZGVyOworaW1wb3J0IG9yZy5vcGVuaWRlLnV0aWwubG9va3VwLlNlcnZpY2VQcm92aWRlcnM7CisKK2ltcG9ydCBuZXQuamF2YS5odG1sLkJyd3NyQ3R4OworaW1wb3J0IG5ldC5qYXZhLmh0bWwuanNvbi5Nb2RlbDsKK2ltcG9ydCBuZXQuamF2YS5odG1sLmpzb24uTW9kZWxzOworaW1wb3J0IG5ldC5qYXZhLmh0bWwuanNvbi5Qcm9wZXJ0eTsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBKZXJzZXkncyBtZXNzYWdlIGJvZHkgcmVhZGVyIGFuZCB3cml0ZXIgdGhhdAorICogY2FuIGhhbmRsZSByZWFkaW5nIGFuZCB3cml0aW5nIG9mIEpTT04gbW9kZWxzIGdlbmVyYXRlZCBieSB7QGxpbmsgTW9kZWx9CisgKiBhbm5vdGF0aW9uIHByb3ZpZGVkIGJ5CisgKiA8YSB0YXJnZXQ9Il9ibGFuayIgaHJlZj0iaHR0cDovL2JjazJicndzci5hcGlkZXNpZ24ub3JnL2phdmFkb2MvbmV0LmphdmEuaHRtbC5qc29uLyI+bmV0LmphdmEuaHRtbC5qc29uPC9hPgorICogbGlicmFyeS4gSW5jbHVkZQorICogdGhpcyBKQVIgaW4geW91ciBwcm9qZWN0IGFuZCB5b3UgY2FuIHRoZW4gdXNlIHlvdXIKKyAqIG1vZGVsIGNsYXNzZXMgYXMgSmVyc2V5J3MgZW50aXRpZXMuCisgKiA8cD4KKyAqIDxwcmU+CisgKiB7QGxpbmsgTW9kZWwgQE1vZGVsfShjbGFzc05hbWU9IlF1ZXJ5IiwgcHJvcGVydGllcz17CisgKiAgIHtAbGluayBQcm9wZXJ0eSBAUHJvcGVydHl9KG5hbWU9Iml0ZW1zIiwgdHlwZT1JdGVtLjxiPmNsYXNzPC9iPiwgYXJyYXk9dHJ1ZSkKKyAqIH0pCisgKiA8Yj5jbGFzczwvYj4gUXVlcnlJbXBsIHsKKyAqCisgKiAgIHtAbGluayBNb2RlbCBATW9kZWx9KGNsYXNzTmFtZT0iSXRlbSIsIHByb3BlcnRpZXM9eworICogICAgIHtAbGluayBQcm9wZXJ0eSBAUHJvcGVydHl9KG5hbWU9ImlkIiwgdHlwZT1TdHJpbmcuPGI+Y2xhc3M8L2I+KSwKKyAqICAgICB7QGxpbmsgUHJvcGVydHkgQFByb3BlcnR5fShuYW1lPSJraW5kIiwgdHlwZT1LaW5kLjxiPmNsYXNzPC9iPikKKyAqICAgfSkKKyAqICAgPGI+Y2xhc3M8L2I+IEl0ZW1JbXBsIHsKKyAqICAgfQorICoKKyAqICAgPGI+ZW51bTwvYj4gS2luZCB7CisgKiAgICAgR09PRCwgQkFECisgKiAgIH0KKyAqCisgKiAgIDxiPnB1YmxpYyBzdGF0aWM8L2I+IExpc3R7QGNvZGUgPEl0ZW0+fSBkb1F1ZXJ5KCkgeworICogICAgIHtAbGluayBXZWJUYXJnZXR9IHRhcmdldCA9IC4uLjsKKyAqICAgICBRdWVyeSBxID0gdGFyZ2V0LnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pLmdldCgpLnJlYWRFbnRpdHkoUXVlcnkuPGI+Y2xhc3M8L2I+KTsKKyAqICAgICByZXR1cm4gcS5nZXRJdGVtcygpOworICogICB9CisgKiB9CisgKiA8L3ByZT4KKyAqCisgKiBAYXV0aG9yIEphcm9zbGF2IFR1bGFjaCAoanR1bGFjaCBhdCBuZXRiZWFucy5vcmcpCisgKi8KK0BTZXJ2aWNlUHJvdmlkZXJzKHsKKyAgICAgICAgQFNlcnZpY2VQcm92aWRlcihzZXJ2aWNlID0gTWVzc2FnZUJvZHlXcml0ZXIuY2xhc3MpLAorICAgICAgICBAU2VydmljZVByb3ZpZGVyKHNlcnZpY2UgPSBNZXNzYWdlQm9keVJlYWRlci5jbGFzcykKK30pCitwdWJsaWMgZmluYWwgY2xhc3MgSHRtbEpzb25Qcm92aWRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5V3JpdGVyPE9iamVjdD4sIE1lc3NhZ2VCb2R5UmVhZGVyPE9iamVjdD4geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoQ2xhc3MgY2xhenosIFR5cGUgdHlwZSwgQW5ub3RhdGlvbltdIGFudG5zLCBNZWRpYVR5cGUgbXQpIHsKKyAgICAgICAgaWYgKCFtdC5pc0NvbXBhdGlibGUoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2xhenouaXNBcnJheSgpKSB7CisgICAgICAgICAgICByZXR1cm4gTW9kZWxzLmlzTW9kZWwoY2xhenouZ2V0Q29tcG9uZW50VHlwZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoamF2YS51dGlsLkxpc3QuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjbGF6eikpIHsKKyAgICAgICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFR5cGUpIHsKKyAgICAgICAgICAgICAgICBQYXJhbWV0ZXJpemVkVHlwZSBwdCA9IChQYXJhbWV0ZXJpemVkVHlwZSkgdHlwZTsKKyAgICAgICAgICAgICAgICBUeXBlW10gYXJncyA9IHB0LmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKTsKKyAgICAgICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPT0gMSAmJiBhcmdzWzBdIGluc3RhbmNlb2YgQ2xhc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1vZGVscy5pc01vZGVsKChDbGFzczw/PikgYXJnc1swXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBNb2RlbHMuaXNNb2RlbChjbGF6eik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShPYmplY3QgdCwgQ2xhc3MgdHlwZSwgVHlwZSB0eXBlMSwgQW5ub3RhdGlvbltdIGFudG5zLCBNZWRpYVR5cGUgbXQpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oT2JqZWN0IHQsIENsYXNzIHR5cGUsIFR5cGUgdHlwZTEsIEFubm90YXRpb25bXSBhbnRucywgTWVkaWFUeXBlIG10LCBNdWx0aXZhbHVlZE1hcCBtbSwgT3V0cHV0U3RyZWFtIG91dCkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICBkdW1wKHQsIG91dCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGR1bXAoT2JqZWN0IHQsIE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICh0IGluc3RhbmNlb2YgT2JqZWN0W10pIHsKKyAgICAgICAgICAgIE9iamVjdFtdIGFyciA9IChPYmplY3RbXSkgdDsKKyAgICAgICAgICAgIG91dC53cml0ZSgnWycpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKCcsJyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGR1bXAoYXJyW2ldLCBvdXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0LndyaXRlKCddJyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXQud3JpdGUodC50b1N0cmluZygpLmdldEJ5dGVzKCJVVEYtOCIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSB0eXBlMSwgQW5ub3RhdGlvbltdIGFudG5zLCBNZWRpYVR5cGUgbXQpIHsKKyAgICAgICAgcmV0dXJuIGlzV3JpdGVhYmxlKHR5cGUsIHR5cGUxLCBhbnRucywgbXQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgcmVhZEZyb20oQ2xhc3M8T2JqZWN0PiBjbGF6eiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgdHlwZSwgQW5ub3RhdGlvbltdIGFudG5zLCBNZWRpYVR5cGUgbXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gbW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEJyd3NyQ3R4IGRlZiA9IEJyd3NyQ3R4LmZpbmREZWZhdWx0KEh0bWxKc29uUHJvdmlkZXIuY2xhc3MpOworICAgICAgICBpZiAoY2xhenouaXNBcnJheSgpKSB7CisgICAgICAgICAgICBMaXN0PE9iamVjdD4gcmVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiBjbXAgPSBjbGF6ei5nZXRDb21wb25lbnRUeXBlKCk7CisgICAgICAgICAgICBNb2RlbHMucGFyc2UoZGVmLCBjbXAsIGluLCByZXMpOworICAgICAgICAgICAgT2JqZWN0W10gYXJyID0gKE9iamVjdFtdKSBBcnJheS5uZXdJbnN0YW5jZShjbXAsIHJlcy5zaXplKCkpOworICAgICAgICAgICAgcmV0dXJuIHJlcy50b0FycmF5KGFycik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNsYXp6LmlzQXNzaWduYWJsZUZyb20oamF2YS51dGlsLkxpc3QuY2xhc3MpCisgICAgICAgICAgICAgICAgJiYgdHlwZSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRUeXBlCisgICAgICAgICAgICAgICAgJiYgKChQYXJhbWV0ZXJpemVkVHlwZSkgdHlwZSkuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpLmxlbmd0aCA9PSAxCisgICAgICAgICAgICAgICAgJiYgKChQYXJhbWV0ZXJpemVkVHlwZSkgdHlwZSkuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpWzBdIGluc3RhbmNlb2YgQ2xhc3MpIHsKKyAgICAgICAgICAgIExpc3Q8T2JqZWN0PiByZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IGNtcCA9IChDbGFzczw/PikgKChQYXJhbWV0ZXJpemVkVHlwZSkgdHlwZSkuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpWzBdOworICAgICAgICAgICAgTW9kZWxzLnBhcnNlKGRlZiwgY21wLCBpbiwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE1vZGVscy5wYXJzZShkZWYsIGNsYXp6LCBpbik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaW5jdWJhdG9yL2h0bWwtanNvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL2h0bWxqc29uL2ludGVybmFsL0h0bWxKc29uQXV0b0Rpc2NvdmVyYWJsZS5qYXZhIGIvaW5jdWJhdG9yL2h0bWwtanNvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL2h0bWxqc29uL2ludGVybmFsL0h0bWxKc29uQXV0b0Rpc2NvdmVyYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiM2I1NmEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmN1YmF0b3IvaHRtbC1qc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvaHRtbGpzb24vaW50ZXJuYWwvSHRtbEpzb25BdXRvRGlzY292ZXJhYmxlLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5odG1sanNvbi5pbnRlcm5hbDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJpb3JpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5zcGkuQXV0b0Rpc2NvdmVyYWJsZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5odG1sanNvbi5IdG1sSnNvblByb3ZpZGVyOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUHJpb3JpdHkoQXV0b0Rpc2NvdmVyYWJsZS5ERUZBVUxUX1BSSU9SSVRZKQorcHVibGljIGNsYXNzIEh0bWxKc29uQXV0b0Rpc2NvdmVyYWJsZSBpbXBsZW1lbnRzIEF1dG9EaXNjb3ZlcmFibGUgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY29uZmlndXJlKGZpbmFsIEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWcgPSBjb250ZXh0LmdldENvbmZpZ3VyYXRpb24oKTsKKworICAgICAgICBpZiAoIWNvbmZpZy5pc1JlZ2lzdGVyZWQoSHRtbEpzb25Qcm92aWRlci5jbGFzcykpIHsKKyAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoSHRtbEpzb25Qcm92aWRlci5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9pbmN1YmF0b3IvaHRtbC1qc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvaHRtbGpzb24vcGFja2FnZS1pbmZvLmphdmEgYi9pbmN1YmF0b3IvaHRtbC1qc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvaHRtbGpzb24vcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE4Y2Y3NAotLS0gL2Rldi9udWxsCisrKyBiL2luY3ViYXRvci9odG1sLWpzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9odG1sanNvbi9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvKioKKyAqIEplcnNleSBwYWNrYWdlIHdpdGggZW50aXR5IHByb3ZpZGVyIHRoYXQgYWxsb3dzIHVzYWdlIG9mIHtAY29kZSBuZXQuamF2YS5odG1sLmpzb259LgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLmh0bWxqc29uOwpkaWZmIC0tZ2l0IGEvaW5jdWJhdG9yL2h0bWwtanNvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuc3BpLkF1dG9EaXNjb3ZlcmFibGUgYi9pbmN1YmF0b3IvaHRtbC1qc29uL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5zcGkuQXV0b0Rpc2NvdmVyYWJsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzA5Yjc0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jdWJhdG9yL2h0bWwtanNvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuc3BpLkF1dG9EaXNjb3ZlcmFibGUKQEAgLTAsMCArMSBAQAorb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuaHRtbGpzb24uaW50ZXJuYWwuSHRtbEpzb25BdXRvRGlzY292ZXJhYmxlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jdWJhdG9yL2h0bWwtanNvbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL2h0bWxqc29uL0Fic3RyYWN0VHlwZVRlc3Rlci5qYXZhIGIvaW5jdWJhdG9yL2h0bWwtanNvbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL2h0bWxqc29uL0Fic3RyYWN0VHlwZVRlc3Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyMTNhODAKLS0tIC9kZXYvbnVsbAorKysgYi9pbmN1YmF0b3IvaHRtbC1qc29uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvaHRtbGpzb24vQWJzdHJhY3RUeXBlVGVzdGVyLmphdmEKQEAgLTAsMCArMSwxNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuaHRtbGpzb247CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdHJhaW5lZFRvOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5SdW50aW1lVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yQ29udGV4dDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5SZWFkZXJXcml0ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBBYnN0cmFjdCBlbnRpdHkgdHlwZSB0ZXN0ZXIgYmFzZSBjbGFzcy4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFR5cGVUZXN0ZXIgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByb3RlY3RlZCBzdGF0aWMgYnl0ZVtdIHJlcXVlc3RFbnRpdHk7CisKKyAgICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIEFSZXNvdXJjZTxUPiB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFQgcG9zdChUIHQpIHsKKyAgICAgICAgICAgIHJldHVybiB0OworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXF1ZXN0RW50aXR5SW50ZXJjZXB0b3IgaW1wbGVtZW50cyBXcml0ZXJJbnRlcmNlcHRvciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGFyb3VuZFdyaXRlVG8oV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0IHdyaXRlckludGVyY2VwdG9yQ29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gb3JpZ2luYWwgPSB3cml0ZXJJbnRlcmNlcHRvckNvbnRleHQuZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIHdyaXRlckludGVyY2VwdG9yQ29udGV4dC5zZXRPdXRwdXRTdHJlYW0oYmFvcyk7CisgICAgICAgICAgICB3cml0ZXJJbnRlcmNlcHRvckNvbnRleHQucHJvY2VlZCgpOworICAgICAgICAgICAgcmVxdWVzdEVudGl0eSA9IGJhb3MudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgICAgIG9yaWdpbmFsLndyaXRlKHJlcXVlc3RFbnRpdHkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9va3MgZm9yIGFsbCByZXNvdXJjZXMgYW5kIHByb3ZpZGVycyBkZWNsYXJlZCBhcyBpbm5lciBjbGFzc2VzIG9mIHRoZSBzdWJjbGFzcyBvZiB0aGlzIGNsYXNzCisgICAgICogYW5kIGFkZHMgdGhlbSB0byB0aGUgcmV0dXJuZWQgUmVzb3VyY2VDb25maWcgKHVubGVzcyBjb25zdHJhaW5lZCB0byBjbGllbnQgc2lkZSkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFJlc291cmNlQ29uZmlnIGluc3RhbmNlCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgSGFzaFNldDxDbGFzczw/Pj4gY2xhc3NlcyA9IG5ldyBIYXNoU2V0PENsYXNzPD8+PigpOworCisgICAgICAgIGZvciAoQ2xhc3M8Pz4gY2xzIDogZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZENsYXNzZXMoKSkgeworICAgICAgICAgICAgaWYgKGNscy5nZXRBbm5vdGF0aW9uKFBhdGguY2xhc3MpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjbGFzc2VzLmFkZChjbHMpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjbHMuZ2V0QW5ub3RhdGlvbihQcm92aWRlci5jbGFzcykgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIENvbnN0cmFpbmVkVG8gY29uc3RyYWluZWRUbyA9IGNscy5nZXRBbm5vdGF0aW9uKENvbnN0cmFpbmVkVG8uY2xhc3MpOworICAgICAgICAgICAgICAgIGlmIChjb25zdHJhaW5lZFRvID09IG51bGwgfHwgY29uc3RyYWluZWRUby52YWx1ZSgpID09IFJ1bnRpbWVUeXBlLlNFUlZFUikgeworICAgICAgICAgICAgICAgICAgICBjbGFzc2VzLmFkZChjbHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoY2xhc3Nlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9va3MgZm9yIGFsbCBwcm92aWRlcnMgZGVjbGFyZWQgYXMgaW5uZXIgY2xhc3NlcyBvZiB0aGUgc3ViY2xhc3Mgb2YgdGhpcyBjbGFzcworICAgICAqIGFuZCBhZGRzIHRoZW0gdG8gdGhlIGNsaWVudCBjb25maWd1cmF0aW9uICh1bmxlc3MgY29uc3RyYWluZWQgdG8gc2VydmVyIHNpZGUpLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihSZXF1ZXN0RW50aXR5SW50ZXJjZXB0b3IuY2xhc3MpOworCisgICAgICAgIGZvciAoQ2xhc3M8Pz4gY2xzIDogZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZENsYXNzZXMoKSkgeworICAgICAgICAgICAgaWYgKGNscy5nZXRBbm5vdGF0aW9uKFByb3ZpZGVyLmNsYXNzKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgQ29uc3RyYWluZWRUbyBjb25zdHJhaW5lZFRvID0gY2xzLmdldEFubm90YXRpb24oQ29uc3RyYWluZWRUby5jbGFzcyk7CisgICAgICAgICAgICAgICAgaWYgKGNvbnN0cmFpbmVkVG8gPT0gbnVsbCB8fCBjb25zdHJhaW5lZFRvLnZhbHVlKCkgPT0gUnVudGltZVR5cGUuQ0xJRU5UKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5yZWdpc3RlcihjbHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCA8VD4gdm9pZCBfdGVzdChUIGluLCBDbGFzcyByZXNvdXJjZSkgeworICAgICAgICBfdGVzdChpbiwgcmVzb3VyY2UsIHRydWUpOworICAgIH0KKworICAgIHByb3RlY3RlZCA8VD4gdm9pZCBfdGVzdChUIGluLCBDbGFzcyByZXNvdXJjZSwgTWVkaWFUeXBlIG0pIHsKKyAgICAgICAgX3Rlc3QoaW4sIHJlc291cmNlLCBtLCB0cnVlKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgPFQ+IHZvaWQgX3Rlc3QoVCBpbiwgQ2xhc3MgcmVzb3VyY2UsIGJvb2xlYW4gdmVyaWZ5KSB7CisgICAgICAgIF90ZXN0KGluLCByZXNvdXJjZSwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSwgdmVyaWZ5KTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgPFQ+IHZvaWQgX3Rlc3QoVCBpbiwgQ2xhc3MgcmVzb3VyY2UsIE1lZGlhVHlwZSBtLCBib29sZWFuIHZlcmlmeSkgeworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KHJlc291cmNlLmdldFNpbXBsZU5hbWUoKSk7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoaW4sIG0pKTsKKworICAgICAgICBieXRlW10gaW5CeXRlcyA9IHJlcXVlc3RFbnRpdHk7CisgICAgICAgIGJ5dGVbXSBvdXRCeXRlcyA9IGdldEVudGl0eUFzQnl0ZUFycmF5KHJlc3BvbnNlKTsKKworICAgICAgICBpZiAodmVyaWZ5KSB7CisgICAgICAgICAgICBfdmVyaWZ5KGluQnl0ZXMsIG91dEJ5dGVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgdm9pZCBfdmVyaWZ5KGJ5dGVbXSBpbiwgYnl0ZVtdIG91dCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoaW4ubGVuZ3RoLCBvdXQubGVuZ3RoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbi5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgaWYgKGluW2ldICE9IG91dFtpXSkgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5kZXg6ICIgKyBpLCBpbltpXSwgb3V0W2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBzdGF0aWMgYnl0ZVtdIGdldEVudGl0eUFzQnl0ZUFycmF5KFJlc3BvbnNlIHIpIHsKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBSZWFkZXJXcml0ZXIud3JpdGVUbyhyLnJlYWRFbnRpdHkoSW5wdXRTdHJlYW0uY2xhc3MpLCBiYW9zKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYmFvcy50b0J5dGVBcnJheSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2luY3ViYXRvci9odG1sLWpzb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9odG1sanNvbi9Db21wdXRlZFByb3BlcnR5VGVzdC5qYXZhIGIvaW5jdWJhdG9yL2h0bWwtanNvbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL2h0bWxqc29uL0NvbXB1dGVkUHJvcGVydHlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI1YTgzOQotLS0gL2Rldi9udWxsCisrKyBiL2luY3ViYXRvci9odG1sLWpzb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9odG1sanNvbi9Db21wdXRlZFByb3BlcnR5VGVzdC5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuaHRtbGpzb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5QVVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworaW1wb3J0IG5ldC5qYXZhLmh0bWwuanNvbi5Db21wdXRlZFByb3BlcnR5OworaW1wb3J0IG5ldC5qYXZhLmh0bWwuanNvbi5Nb2RlbDsKK2ltcG9ydCBuZXQuamF2YS5odG1sLmpzb24uUHJvcGVydHk7CisKKy8qKiBDYW4gdXNlIHRoZSBzYW1lIGNvZGUgb24gc2VydmVyIGFzIHdlbGwgYXMgY2xpZW50LgorICoKKyAqIEBhdXRob3IgSmFyb3NsYXYgVHVsYWNoCisgKi8KK0BNb2RlbChjbGFzc05hbWUgPSAiUGVyc29uIiwgcHJvcGVydGllcyA9IHsKKyAgICAgICAgQFByb3BlcnR5KG5hbWUgPSAiZmlyc3ROYW1lIiwgdHlwZSA9IFN0cmluZy5jbGFzcyksCisgICAgICAgIEBQcm9wZXJ0eShuYW1lID0gImxhc3ROYW1lIiwgdHlwZSA9IFN0cmluZy5jbGFzcykKK30pCitwdWJsaWMgY2xhc3MgQ29tcHV0ZWRQcm9wZXJ0eVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFR5cGVUZXN0ZXIgeworCisgICAgQENvbXB1dGVkUHJvcGVydHkKKyAgICBzdGF0aWMgU3RyaW5nIGZ1bGxOYW1lKFN0cmluZyBmaXJzdE5hbWUsIFN0cmluZyBsYXN0TmFtZSkgeworICAgICAgICByZXR1cm4gZmlyc3ROYW1lICsgIiAiICsgbGFzdE5hbWU7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBzZXJ2ZXIgc2lkZQorICAgIC8vCisgICAgQFBhdGgoImVtcHR5IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RSZXNvdXJjZSB7CisKKyAgICAgICAgQFBVVAorICAgICAgICBAUGF0aCgiZnVsbE5hbWUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIG15QmVhbihQZXJzb24gcCkgeworICAgICAgICAgICAgcmV0dXJuIHAuZ2V0RnVsbE5hbWUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vCisgICAgLy8gQ2xpZW50IHVzaW5nIHRoZSBtb2RlbCB0byBjb25uZWN0IHRvIHNlcnZlcgorICAgIC8vCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGFza0ZvckZ1bGxOYW1lKCkgeworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJlbXB0eS9mdWxsTmFtZSIpOworCisgICAgICAgIFBlcnNvbiBwID0gbmV3IFBlcnNvbigpOworICAgICAgICBwLnNldEZpcnN0TmFtZSgiSmFyb3NsYXYiKTsKKyAgICAgICAgcC5zZXRMYXN0TmFtZSgiVHVsYWNoIik7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLnB1dChFbnRpdHkuZW50aXR5KHAsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiSmFyb3NsYXYgVHVsYWNoIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9pbmN1YmF0b3IvaHRtbC1qc29uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvaHRtbGpzb24vTW9kZWxFbnRpdHlPbkFycmF5VGVzdC5qYXZhIGIvaW5jdWJhdG9yL2h0bWwtanNvbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL2h0bWxqc29uL01vZGVsRW50aXR5T25BcnJheVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWUwMWM3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jdWJhdG9yL2h0bWwtanNvbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL2h0bWxqc29uL01vZGVsRW50aXR5T25BcnJheVRlc3QuamF2YQpAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5odG1sanNvbjsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgbmV0LmphdmEuaHRtbC5qc29uLk1vZGVsOworCisvKioKKyAqIFJlYWRpbmcgYW5kIHdyaXRpbmcgY2xhc3MgZ2VuZXJhdGVkIGJ5IHtAbGluayBNb2RlbH0gYXMKKyAqIGFycmF5cy4KKyAqCisgKiBAYXV0aG9yIEphcm9zbGF2IFR1bGFjaAorICovCitwdWJsaWMgY2xhc3MgTW9kZWxFbnRpdHlPbkFycmF5VGVzdCBleHRlbmRzIEFic3RyYWN0VHlwZVRlc3RlciB7CisKKyAgICBAUGF0aCgiZW1wdHkiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFJlc291cmNlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgibXliZWFuIikKKyAgICAgICAgcHVibGljIFN0cmluZyBteUJlYW4oTXlCZWFuW10gYmVhbikgeworICAgICAgICAgICAgaWYgKGJlYW4ubGVuZ3RoICE9IDIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIkVSUk9SLCBsZW5ndGg6ICIgKyBiZWFuLmxlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghYmVhblswXS5nZXRWYWx1ZSgpLmVxdWFscygiSGVsbG8iKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAiRVJST1IsIFswXS52YWx1ZSA9ICIgKyBiZWFuWzBdLmdldFZhbHVlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWJlYW5bMV0uZ2V0VmFsdWUoKS5lcXVhbHMoIkFob3kiKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAiRVJST1IsIFsxXS52YWx1ZSA9ICIgKyBiZWFuWzFdLmdldFZhbHVlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gIlBBU1NFRCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJnZXRiZWFuIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldEJlYW4oQENvbnRleHQgSHR0cEhlYWRlcnMgaGVhZGVycykgeworICAgICAgICAgICAgTXlCZWFuIHRlYiA9IG5ldyBNeUJlYW4oKTsKKyAgICAgICAgICAgIHRlYi5zZXRWYWx1ZSgiaGVsbG8iKTsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygpLnR5cGUoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSkuZW50aXR5KG5ldyBNeUJlYW5bXSB7dGVifSkuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBNb2RlbEVudGl0eU9uQXJyYXlUZXN0KCkgeworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgbXlCZWFuQW5kUHV0KCkgeworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJlbXB0eS9teWJlYW4iKTsKKworICAgICAgICBNeUJlYW4gbWIgPSBuZXcgTXlCZWFuKCk7CisgICAgICAgIG1iLnNldFZhbHVlKCJIZWxsbyIpOworICAgICAgICBNeUJlYW4gYWggPSBuZXcgTXlCZWFuKCk7CisgICAgICAgIGFoLnNldFZhbHVlKCJBaG95Iik7CisgICAgICAgIE15QmVhbltdIGFyciA9IG5ldyBNeUJlYW5bXSB7bWIsIGFofTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KGFyciwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSkpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJQQVNTRUQiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZG9SZWFkV3JpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTXlCZWFuIG1iID0gbmV3IE15QmVhbigpOworICAgICAgICBtYi5zZXRWYWx1ZSgiSGVsbG8iKTsKKyAgICAgICAgTXlCZWFuIGFoID0gbmV3IE15QmVhbigpOworICAgICAgICBhaC5zZXRWYWx1ZSgiQWhveSIpOworICAgICAgICBNeUJlYW5bXSBhcnIgPSBuZXcgTXlCZWFuW10ge21iLCBhaH07CisKKyAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBvcy53cml0ZSgnWycpOworICAgICAgICBvcy53cml0ZShhcnJbMF0udG9TdHJpbmcoKS5nZXRCeXRlcygiVVRGLTgiKSk7CisgICAgICAgIG9zLndyaXRlKCcsJyk7CisgICAgICAgIG9zLndyaXRlKGFyclsxXS50b1N0cmluZygpLmdldEJ5dGVzKCJVVEYtOCIpKTsKKyAgICAgICAgb3Mud3JpdGUoJ10nKTsKKyAgICAgICAgb3MuY2xvc2UoKTsKKworICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvcy50b0J5dGVBcnJheSgpKTsKKworICAgICAgICBmaW5hbCBDbGFzcyBjID0gYXJyLmdldENsYXNzKCk7CisgICAgICAgIE9iamVjdCByZXQgPSBuZXcgSHRtbEpzb25Qcm92aWRlcigpLnJlYWRGcm9tKGMsIG51bGwsIG51bGwsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUsIG51bGwsIGlzKTsKKworICAgICAgICBhc3NlcnRUcnVlKCJJdCBpcyBhcnJheTogIiArIHJldCwgcmV0IGluc3RhbmNlb2YgTXlCZWFuW10pOworICAgICAgICBNeUJlYW5bXSByZXMgPSAoTXlCZWFuW10pIHJldDsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUd28gaXRlbXM6ICIsIDIsIHJlcy5sZW5ndGgpOworICAgICAgICBhc3NlcnRFcXVhbHMoYXJyWzBdLCByZXNbMF0pOworICAgICAgICBhc3NlcnRFcXVhbHMoYXJyWzFdLCByZXNbMV0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgbXlCZWFuQW5kR2V0KCkgeworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJlbXB0eS9nZXRiZWFuIik7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGZpbmFsIE15QmVhbltdIHRlYiA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoTXlCZWFuW10uY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscygidmFsdWUiLCAiaGVsbG8iLCB0ZWJbMF0uZ2V0VmFsdWUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaW5jdWJhdG9yL2h0bWwtanNvbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL2h0bWxqc29uL01vZGVsRW50aXR5T25MaXN0VGVzdC5qYXZhIGIvaW5jdWJhdG9yL2h0bWwtanNvbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL2h0bWxqc29uL01vZGVsRW50aXR5T25MaXN0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZmZkYjcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmN1YmF0b3IvaHRtbC1qc29uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvaHRtbGpzb24vTW9kZWxFbnRpdHlPbkxpc3RUZXN0LmphdmEKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuaHRtbGpzb247CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY1R5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworaW1wb3J0IG5ldC5qYXZhLmh0bWwuanNvbi5Nb2RlbDsKKworLyoqCisgKiBSZWFkaW5nIGFuZCB3cml0aW5nIGNsYXNzIGdlbmVyYXRlZCBieSB7QGxpbmsgTW9kZWx9IGFzCisgKiB7QGxpbmsgTGlzdH0uCisgKgorICogQGF1dGhvciBKYXJvc2xhdiBUdWxhY2gKKyAqLworcHVibGljIGNsYXNzIE1vZGVsRW50aXR5T25MaXN0VGVzdCBleHRlbmRzIEFic3RyYWN0VHlwZVRlc3RlciB7CisKKyAgICBAUGF0aCgiZW1wdHkiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFJlc291cmNlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgibXliZWFuIikKKyAgICAgICAgcHVibGljIFN0cmluZyBteUJlYW4oTGlzdDxNeUJlYW4+IGJlYW4pIHsKKyAgICAgICAgICAgIGlmIChiZWFuLnNpemUoKSAhPSAyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJFUlJPUiwgbGVuZ3RoOiAiICsgYmVhbi5zaXplKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWJlYW4uZ2V0KDApLmdldFZhbHVlKCkuZXF1YWxzKCJIZWxsbyIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJFUlJPUiwgWzBdLnZhbHVlID0gIiArIGJlYW4uZ2V0KDApLmdldFZhbHVlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWJlYW4uZ2V0KDEpLmdldFZhbHVlKCkuZXF1YWxzKCJBaG95IikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIkVSUk9SLCBbMV0udmFsdWUgPSAiICsgYmVhbi5nZXQoMSkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAiUEFTU0VEIjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImdldGJlYW4iKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0QmVhbihAQ29udGV4dCBIdHRwSGVhZGVycyBoZWFkZXJzKSB7CisgICAgICAgICAgICBNeUJlYW4gdGViID0gbmV3IE15QmVhbigpOworICAgICAgICAgICAgdGViLnNldFZhbHVlKCJoZWxsbyIpOworICAgICAgICAgICAgTGlzdDxNeUJlYW4+IGwgPSBuZXcgQXJyYXlMaXN0PE15QmVhbj4oKTsKKyAgICAgICAgICAgIGwuYWRkKHRlYik7CisgICAgICAgICAgICBHZW5lcmljRW50aXR5PExpc3Q8TXlCZWFuPj4gZ2UgPSBuZXcgR2VuZXJpY0VudGl0eTxMaXN0PE15QmVhbj4+KGwpIHt9OworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCkudHlwZShNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFKS5lbnRpdHkoZ2UpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgTW9kZWxFbnRpdHlPbkxpc3RUZXN0KCkgeworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgbXlCZWFuQW5kUHV0KCkgeworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJlbXB0eS9teWJlYW4iKTsKKworICAgICAgICBNeUJlYW4gbWIgPSBuZXcgTXlCZWFuKCk7CisgICAgICAgIG1iLnNldFZhbHVlKCJIZWxsbyIpOworICAgICAgICBNeUJlYW4gYWggPSBuZXcgTXlCZWFuKCk7CisgICAgICAgIGFoLnNldFZhbHVlKCJBaG95Iik7CisgICAgICAgIEdlbmVyaWNFbnRpdHk8TGlzdDxNeUJlYW4+PiBnZSA9IG5ldyBHZW5lcmljRW50aXR5PExpc3Q8TXlCZWFuPj4oQXJyYXlzLmFzTGlzdChtYiwgYWgpKSB7fTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShnZSwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSkpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJQQVNTRUQiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgbXlCZWFuQW5kR2V0KCkgeworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJlbXB0eS9nZXRiZWFuIik7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEdlbmVyaWNUeXBlPExpc3Q8TXlCZWFuPj4gZ2UgPSBuZXcgR2VuZXJpY1R5cGU8TGlzdDxNeUJlYW4+PigpIHt9OworICAgICAgICBMaXN0PE15QmVhbj4gdGViID0gcmVzcG9uc2UucmVhZEVudGl0eShnZSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJvbmUgZWxlbWVudCBpbiBsaXN0OiAiICsgdGViLCAxLCB0ZWIuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZSIsICJoZWxsbyIsIHRlYi5nZXQoMCkuZ2V0VmFsdWUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaW5jdWJhdG9yL2h0bWwtanNvbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL2h0bWxqc29uL01vZGVsRW50aXR5VGVzdC5qYXZhIGIvaW5jdWJhdG9yL2h0bWwtanNvbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL2h0bWxqc29uL01vZGVsRW50aXR5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmYzk5NmYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmN1YmF0b3IvaHRtbC1qc29uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvaHRtbGpzb24vTW9kZWxFbnRpdHlUZXN0LmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5odG1sanNvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitpbXBvcnQgbmV0LmphdmEuaHRtbC5qc29uLk1vZGVsOworaW1wb3J0IG5ldC5qYXZhLmh0bWwuanNvbi5Qcm9wZXJ0eTsKKworLyoqCisgKiBSZWFkaW5nIGFuZCB3cml0aW5nIGNsYXNzIGdlbmVyYXRlZCBieSB7QGxpbmsgTW9kZWx9LgorICoKKyAqIEBhdXRob3IgSmFyb3NsYXYgVHVsYWNoCisgKi8KK3B1YmxpYyBjbGFzcyBNb2RlbEVudGl0eVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFR5cGVUZXN0ZXIgeworCisgICAgQE1vZGVsKGNsYXNzTmFtZSA9ICJNeUJlYW4iLCBwcm9wZXJ0aWVzID0geworICAgICAgICAgICAgQFByb3BlcnR5KG5hbWUgPSAidmFsdWUiLCB0eXBlID0gU3RyaW5nLmNsYXNzKQorICAgIH0pCisgICAgc3RhdGljIGNsYXNzIE1CIHsKKyAgICB9CisKKyAgICBAUGF0aCgiZW1wdHkiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFJlc291cmNlIHsKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoIm15YmVhbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgbXlCZWFuKE15QmVhbiBiZWFuKSB7CisgICAgICAgICAgICByZXR1cm4gKGJlYW4uZ2V0VmFsdWUoKS5lcXVhbHMoIkhlbGxvIikpID8gIlBBU1NFRCIgOiAiRVJST1IiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiZ2V0YmVhbiIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXRCZWFuKEBDb250ZXh0IEh0dHBIZWFkZXJzIGhlYWRlcnMpIHsKKyAgICAgICAgICAgIE15QmVhbiB0ZWIgPSBuZXcgTXlCZWFuKCk7CisgICAgICAgICAgICB0ZWIuc2V0VmFsdWUoImhlbGxvIik7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soKS50eXBlKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUpLmVudGl0eSh0ZWIpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgTW9kZWxFbnRpdHlUZXN0KCkgeworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgbXlCZWFuQW5kUHV0KCkgeworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJlbXB0eS9teWJlYW4iKTsKKworICAgICAgICBNeUJlYW4gbWIgPSBuZXcgTXlCZWFuKCk7CisgICAgICAgIG1iLnNldFZhbHVlKCJIZWxsbyIpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobWIsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiUEFTU0VEIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIG15QmVhbkFuZEdldCgpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiZW1wdHkvZ2V0YmVhbiIpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBmaW5hbCBNeUJlYW4gdGViID0gcmVzcG9uc2UucmVhZEVudGl0eShNeUJlYW4uY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscygidmFsdWUiLCAiaGVsbG8iLCB0ZWIuZ2V0VmFsdWUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaW5jdWJhdG9yL2tyeW8vUkVBRE1FLm1kIGIvaW5jdWJhdG9yL2tyeW8vUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMTA2NzgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmN1YmF0b3Iva3J5by9SRUFETUUubWQKQEAgLTAsMCArMSwzNiBAQAorWy8vXTogIyAiIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLiAiCitbLy9dOiAjICIgICIKK1svL106ICMgIiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgIgorWy8vXTogIyAiIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0ICIKK1svL106ICMgIiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuICIKK1svL106ICMgIiAgIgorWy8vXTogIyAiIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkgIgorWy8vXTogIyAiIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUgIgorWy8vXTogIyAiIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCAiCitbLy9dOiAjICIgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQgIgorWy8vXTogIyAiIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4gIgorWy8vXTogIyAiICAiCitbLy9dOiAjICIgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wICIKKworVGhpcyBpcyBleHBlcmltZW50YWwgbW9kdWxlIHRoYXQgcHJvdmlkZXMgSkFYLVJTIE1lc3NhZ2UgQm9keSBXcml0ZXIgJiBSZWFkZXIgdXNpbmcgS3J5byBzZXJpYWxpemF0aW9uIGZyYW1ld29yay4KKworIyBIb3cgdG8gdXNlIGl0CisKK0FkZCBkZXBlbmRlbmN5IHRvIHRoZSBtb2R1bGU6CisKK2BgYHhtbAorPGRlcGVuZGVuY3k+CisgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLWtyeW88L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+JHtqZXJzZXkudmVyc2lvbn08L3ZlcnNpb24+Cis8L2RlcGVuZGVuY3k+CitgYGAKKworQW5kIG5vdyB5b3UgY2FuIGNvbnN1bWUgb3IgcHJvZHVjZSBlbnRpdGllcyAoZGUpc2VyaWFsaXplZCBieSBLcnlvLiBKdXN0IHVzZSBgYXBwbGljYXRpb24veC1rcnlvYCBNSU1FIHR5cGUsIGUuZy46CisKK2BgYGphdmEKK0BQYXRoKCIvcmVzdCIpCitAQ29uc3VtZXMoImFwcGxpY2F0aW9uL3gta3J5byIpCitAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3gta3J5byIpCitwdWJsaWMgY2xhc3MgTXlSZXNvdXJjZSB7IC4uLiB9CitgYGAKZGlmZiAtLWdpdCBhL2luY3ViYXRvci9rcnlvL3BvbS54bWwgYi9pbmN1YmF0b3Iva3J5by9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2YTc3NTcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmN1YmF0b3Iva3J5by9wb20ueG1sCkBAIC0wLDAgKzEsNjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5jdWJhdG9yPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLWtyeW88L2FydGlmYWN0SWQ+CisgICAgPG5hbWU+amVyc2V5LW1lZGlhLWtyeW88L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIEplcnNleS9KQVgtUlMgTWVzc2FnZSBCb2R5IFdyaXRlciBhbmQgUmVhZGVyIHVzaW5nIEtyeW8gc2VyaWFsaXphdGlvbiBmcmFtZXdvcmsKKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC53cy5yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LndzLnJzLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbW1vbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS5lc290ZXJpY3NvZnR3YXJlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+a3J5bzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWdyaXp6bHkyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9pbmN1YmF0b3Iva3J5by9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2tyeW8vS3J5b0ZlYXR1cmUuamF2YSBiL2luY3ViYXRvci9rcnlvL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkva3J5by9LcnlvRmVhdHVyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNTQ1ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmN1YmF0b3Iva3J5by9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2tyeW8vS3J5b0ZlYXR1cmUuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmtyeW87CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5CZXRhOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmtyeW8uaW50ZXJuYWwuS3J5b01lc3NhZ2VCb2R5UHJvdmlkZXI7CisKKy8qKgorICogRmVhdHVyZSB1c2VkIHRvIHJlZ2lzdGVyIEtyeW8gcHJvdmlkZXJzLgorICoKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BCZXRhCitwdWJsaWMgY2xhc3MgS3J5b0ZlYXR1cmUgaW1wbGVtZW50cyBGZWF0dXJlIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZShmaW5hbCBGZWF0dXJlQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlnID0gY29udGV4dC5nZXRDb25maWd1cmF0aW9uKCk7CisKKyAgICAgICAgaWYgKCFjb25maWcuaXNSZWdpc3RlcmVkKEtyeW9NZXNzYWdlQm9keVByb3ZpZGVyLmNsYXNzKSkgeworICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihLcnlvTWVzc2FnZUJvZHlQcm92aWRlci5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2luY3ViYXRvci9rcnlvL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkva3J5by9pbnRlcm5hbC9LcnlvQXV0b0Rpc2NvdmVyYWJsZS5qYXZhIGIvaW5jdWJhdG9yL2tyeW8vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9rcnlvL2ludGVybmFsL0tyeW9BdXRvRGlzY292ZXJhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMxMDdjYQotLS0gL2Rldi9udWxsCisrKyBiL2luY3ViYXRvci9rcnlvL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkva3J5by9pbnRlcm5hbC9LcnlvQXV0b0Rpc2NvdmVyYWJsZS5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkua3J5by5pbnRlcm5hbDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuc3BpLkF1dG9EaXNjb3ZlcmFibGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkua3J5by5LcnlvRmVhdHVyZTsKKworLyoqCisgKiB7QGxpbmsgQXV0b0Rpc2NvdmVyYWJsZX0gcmVnaXN0ZXJpbmcge0BsaW5rIEtyeW9GZWF0dXJlfSBpZiB0aGUgZmVhdHVyZSBpcyBub3QgYWxyZWFkeSByZWdpc3RlcmVkLgorICoKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQcmlvcml0eShBdXRvRGlzY292ZXJhYmxlLkRFRkFVTFRfUFJJT1JJVFkpCitwdWJsaWMgY2xhc3MgS3J5b0F1dG9EaXNjb3ZlcmFibGUgaW1wbGVtZW50cyBBdXRvRGlzY292ZXJhYmxlIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShmaW5hbCBGZWF0dXJlQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGlmICghY29udGV4dC5nZXRDb25maWd1cmF0aW9uKCkuaXNSZWdpc3RlcmVkKEtyeW9GZWF0dXJlLmNsYXNzKSkgeworICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihLcnlvRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2luY3ViYXRvci9rcnlvL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkva3J5by9pbnRlcm5hbC9LcnlvTWVzc2FnZUJvZHlQcm92aWRlci5qYXZhIGIvaW5jdWJhdG9yL2tyeW8vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9rcnlvL2ludGVybmFsL0tyeW9NZXNzYWdlQm9keVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU1YzI5MAotLS0gL2Rldi9udWxsCisrKyBiL2luY3ViYXRvci9rcnlvL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkva3J5by9pbnRlcm5hbC9LcnlvTWVzc2FnZUJvZHlQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmtyeW8uaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IGNvbS5lc290ZXJpY3NvZnR3YXJlLmtyeW8uS3J5bzsKK2ltcG9ydCBjb20uZXNvdGVyaWNzb2Z0d2FyZS5rcnlvLmlvLklucHV0OworaW1wb3J0IGNvbS5lc290ZXJpY3NvZnR3YXJlLmtyeW8uaW8uT3V0cHV0OworaW1wb3J0IGNvbS5lc290ZXJpY3NvZnR3YXJlLmtyeW8ucG9vbC5LcnlvQ2FsbGJhY2s7CitpbXBvcnQgY29tLmVzb3Rlcmljc29mdHdhcmUua3J5by5wb29sLktyeW9GYWN0b3J5OworaW1wb3J0IGNvbS5lc290ZXJpY3NvZnR3YXJlLmtyeW8ucG9vbC5LcnlvUG9vbDsKKworLyoqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitAUHJvdmlkZXIKK0BDb25zdW1lcygiYXBwbGljYXRpb24veC1rcnlvIikKK0BQcm9kdWNlcygiYXBwbGljYXRpb24veC1rcnlvIikKK3B1YmxpYyBjbGFzcyBLcnlvTWVzc2FnZUJvZHlQcm92aWRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5V3JpdGVyPE9iamVjdD4sIE1lc3NhZ2VCb2R5UmVhZGVyPE9iamVjdD4geworCisgICAgcHJpdmF0ZSBmaW5hbCBLcnlvUG9vbCBrcnlvUG9vbDsKKworICAgIHB1YmxpYyBLcnlvTWVzc2FnZUJvZHlQcm92aWRlcigpIHsKKyAgICAgICAgZmluYWwgS3J5b0ZhY3Rvcnkga3J5b0ZhY3RvcnkgPSBuZXcgS3J5b0ZhY3RvcnkoKSB7CisgICAgICAgICAgICBwdWJsaWMgS3J5byBjcmVhdGUoKSB7CisgICAgICAgICAgICAgICAgZmluYWwgS3J5byBrcnlvID0gbmV3IEtyeW8oKTsKKyAgICAgICAgICAgICAgICAvL1RPRE86IGNvbmZpZ3VyZSBrcnlvIGluc3RhbmNlLCBjdXN0b21pemUgc2V0dGluZ3MKKyAgICAgICAgICAgICAgICAvL1RPRE86IGUuZy4gbG9va2luZyBmb3IgS3J5byB2aWEgQ29udGV4dFJlc29sdmVyIChsaWtlIEphY2tzb24pCisgICAgICAgICAgICAgICAgcmV0dXJuIGtyeW87CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGtyeW9Qb29sID0gbmV3IEtyeW9Qb29sLkJ1aWxkZXIoa3J5b0ZhY3RvcnkpLnNvZnRSZWZlcmVuY2VzKCkuYnVpbGQoKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIE1lc3NhZ2VCb2R5V3JpdGVyCisgICAgLy8KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGdldFNpemUoZmluYWwgT2JqZWN0IG9iamVjdCwgZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGVUbyhmaW5hbCBPYmplY3Qgb2JqZWN0LCBmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLCBmaW5hbCBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIE91dHB1dCBvdXRwdXQgPSBuZXcgT3V0cHV0KGVudGl0eVN0cmVhbSk7CisgICAgICAgIGtyeW9Qb29sLnJ1bihuZXcgS3J5b0NhbGxiYWNrKCkgeworICAgICAgICAgICAgcHVibGljIE9iamVjdCBleGVjdXRlKEtyeW8ga3J5bykgeworICAgICAgICAgICAgICAgIGtyeW8ud3JpdGVPYmplY3Qob3V0cHV0LCBvYmplY3QpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgb3V0cHV0LmZsdXNoKCk7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBNZXNzYWdlQm9keVJlYWRlcgorICAgIC8vCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdCByZWFkRnJvbShmaW5hbCBDbGFzczxPYmplY3Q+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICBmaW5hbCBJbnB1dCBpbnB1dCA9IG5ldyBJbnB1dChlbnRpdHlTdHJlYW0pOworCisgICAgICAgIHJldHVybiBrcnlvUG9vbC5ydW4obmV3IEtyeW9DYWxsYmFjaygpIHsKKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZXhlY3V0ZShLcnlvIGtyeW8pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4ga3J5by5yZWFkT2JqZWN0KGlucHV0LCB0eXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9pbmN1YmF0b3Iva3J5by9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuc3BpLkF1dG9EaXNjb3ZlcmFibGUgYi9pbmN1YmF0b3Iva3J5by9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuc3BpLkF1dG9EaXNjb3ZlcmFibGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcwNjMwZAotLS0gL2Rldi9udWxsCisrKyBiL2luY3ViYXRvci9rcnlvL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5zcGkuQXV0b0Rpc2NvdmVyYWJsZQpAQCAtMCwwICsxIEBACitvcmcuZ2xhc3NmaXNoLmplcnNleS5rcnlvLmludGVybmFsLktyeW9BdXRvRGlzY292ZXJhYmxlCmRpZmYgLS1naXQgYS9pbmN1YmF0b3Iva3J5by9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2tyeW8vSmF4UnNBcHBsaWNhdGlvbi5qYXZhIGIvaW5jdWJhdG9yL2tyeW8vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9rcnlvL0pheFJzQXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWU2YTRjCi0tLSAvZGV2L251bGwKKysrIGIvaW5jdWJhdG9yL2tyeW8vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9rcnlvL0pheFJzQXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmtyeW87CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworLyoqCisgKiBUZXN0IGNhc2UgSkFYLVJTIGFwcGxpY2F0aW9uLgorICoKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBKYXhSc0FwcGxpY2F0aW9uIGV4dGVuZHMgQXBwbGljYXRpb24geworCisgICAgc3RhdGljIGZpbmFsIFNldDxDbGFzczw/Pj4gQVBQX0NMQVNTRVMgPSBuZXcgSGFzaFNldDxDbGFzczw/Pj4oKSB7eworICAgICAgICBhZGQoUGVyc29uUmVzb3VyY2UuY2xhc3MpOworICAgIH19OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgcmV0dXJuIEFQUF9DTEFTU0VTOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvaW5jdWJhdG9yL2tyeW8vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9rcnlvL1BlcnNvbi5qYXZhIGIvaW5jdWJhdG9yL2tyeW8vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9rcnlvL1BlcnNvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMTc4ODkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmN1YmF0b3Iva3J5by9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2tyeW8vUGVyc29uLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5rcnlvOworCitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CisKKy8qKgorICogVGVzdCBkYXRhIGJlYW4uCisgKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFBlcnNvbiB7CisKKyAgICBwdWJsaWMgU3RyaW5nIG5hbWU7CisgICAgcHVibGljIGludCBhZ2U7CisgICAgcHVibGljIFN0cmluZyBhZGRyZXNzOworCisgICAgcHVibGljIFBlcnNvbihTdHJpbmcgbmFtZSwgaW50IGFnZSwgU3RyaW5nIGFkZHJlc3MpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5hZ2UgPSBhZ2U7CisgICAgICAgIHRoaXMuYWRkcmVzcyA9IGFkZHJlc3M7CisgICAgfQorCisgICAgcHVibGljIFBlcnNvbigpIHsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IDc7CisgICAgICAgIGhhc2ggPSAxOSAqIGhhc2ggKyBPYmplY3RzLmhhc2hDb2RlKHRoaXMubmFtZSk7CisgICAgICAgIGhhc2ggPSAxOSAqIGhhc2ggKyB0aGlzLmFnZTsKKyAgICAgICAgaGFzaCA9IDE5ICogaGFzaCArIE9iamVjdHMuaGFzaENvZGUodGhpcy5hZGRyZXNzKTsKKyAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBQZXJzb24gb3RoZXIgPSAoUGVyc29uKSBvYmo7CisgICAgICAgIGlmICghT2JqZWN0cy5lcXVhbHModGhpcy5uYW1lLCBvdGhlci5uYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLmFnZSAhPSBvdGhlci5hZ2UpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKE9iamVjdHMuZXF1YWxzKHRoaXMuYWRkcmVzcywgb3RoZXIuYWRkcmVzcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2luY3ViYXRvci9rcnlvL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkva3J5by9QZXJzb25SZXNvdXJjZS5qYXZhIGIvaW5jdWJhdG9yL2tyeW8vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9rcnlvL1BlcnNvblJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg5ODFhOAotLS0gL2Rldi9udWxsCisrKyBiL2luY3ViYXRvci9rcnlvL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkva3J5by9QZXJzb25SZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkua3J5bzsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBVVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCisvKioKKyAqIFRlc3QgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIi8iKQorQENvbnN1bWVzKCJhcHBsaWNhdGlvbi94LWtyeW8iKQorQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi94LWtyeW8iKQorcHVibGljIGNsYXNzIFBlcnNvblJlc291cmNlIHsKKworICAgIEBQT1NUCisgICAgcHVibGljIFBlcnNvbiBlY2hvKGZpbmFsIFBlcnNvbiBwZXJzb24pIHsKKyAgICAgICAgcmV0dXJuIHBlcnNvbjsKKyAgICB9CisKKyAgICBAUFVUCisgICAgcHVibGljIHZvaWQgcHV0KGZpbmFsIFBlcnNvbiBwZXJzb24pIHsKKyAgICB9CisKKyAgICBAR0VUCisgICAgcHVibGljIFBlcnNvbiBnZXQoKSB7CisgICAgICAgIHJldHVybiBuZXcgUGVyc29uKCJXb2xmZ2FuZyIsIDIxLCAiU2FsemJ1cmciKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2luY3ViYXRvci9rcnlvL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkva3J5by9QZXJzb25SZXNvdXJjZVRlc3QuamF2YSBiL2luY3ViYXRvci9rcnlvL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkva3J5by9QZXJzb25SZXNvdXJjZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDRlYWVhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jdWJhdG9yL2tyeW8vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9rcnlvL1BlcnNvblJlc291cmNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkua3J5bzsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0IGZvciBrcnlvIHJlc291cmNlLgorICoKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBQZXJzb25SZXNvdXJjZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5EVU1QX0VOVElUWSk7CisgICAgICAgIHJldHVybiBuZXcgSmF4UnNBcHBsaWNhdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChmaW5hbCBDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgeworICAgICAgICBmaW5hbCBQZXJzb24gZ2V0UmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkuZ2V0KFBlcnNvbi5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiV29sZmdhbmciLCBnZXRSZXNwb25zZS5uYW1lKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIxLCBnZXRSZXNwb25zZS5hZ2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlNhbHpidXJnIiwgZ2V0UmVzcG9uc2UuYWRkcmVzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdCgpIHsKKyAgICAgICAgZmluYWwgUGVyc29uW10gdGVzdERhdGEgPSBuZXcgUGVyc29uW10ge25ldyBQZXJzb24oIkpvc2VwaCIsIDIzLCAiTmF6YXJldGgiKSwgbmV3IFBlcnNvbigiTWFyeSIsIDE4LCAiTmF6YXJldGgiKX07CisgICAgICAgIGZvciAoUGVyc29uIG9yaWdpbmFsIDogdGVzdERhdGEpIHsKKyAgICAgICAgICAgIGZpbmFsIFBlcnNvbiBwb3N0UmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eShvcmlnaW5hbCwgImFwcGxpY2F0aW9uL3gta3J5byIpLCBQZXJzb24uY2xhc3MpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLCBwb3N0UmVzcG9uc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0KCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSBwdXRSZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5wdXQoRW50aXR5LmVudGl0eShuZXcgUGVyc29uKCJKdWxlcyIsIDEyLCAiUGFyaXMiKSwKKyAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24veC1rcnlvIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjA0LCBwdXRSZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9pbmN1YmF0b3Ivb3Blbi10cmFjaW5nL3BvbS54bWwgYi9pbmN1YmF0b3Ivb3Blbi10cmFjaW5nL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk2NzcxZQotLS0gL2Rldi9udWxsCisrKyBiL2luY3ViYXRvci9vcGVuLXRyYWNpbmcvcG9tLnhtbApAQCAtMCwwICsxLDk1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5pbmN1YmF0b3I8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5pbmN1YmF0b3I8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+amVyc2V5LW9wZW4tdHJhY2luZzwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorCisgICAgPG5hbWU+amVyc2V5LW9wZW4tdHJhY2luZzwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgSmVyc2V5IHN1cHBvcnQgZm9yIE9wZW5UcmFjaW5nLgorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmlvLm9wZW50cmFjaW5nPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3BlbnRyYWNpbmctYXBpPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5pby5vcGVudHJhY2luZzwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm9wZW50cmFjaW5nLXV0aWw8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29tbW9uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXNlcnZlcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZ3JpenpseTI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4uaXN0YWNrPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWlzdGFjay1jb21tb25zLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5idWlsZC1oZWxwZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZmVsaXg8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYnVuZGxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2luY3ViYXRvci9vcGVuLXRyYWNpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vcGVudHJhY2luZy9PcGVuVHJhY2luZ0FwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lci5qYXZhIGIvaW5jdWJhdG9yL29wZW4tdHJhY2luZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29wZW50cmFjaW5nL09wZW5UcmFjaW5nQXBwbGljYXRpb25FdmVudExpc3RlbmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE1NTc2MAotLS0gL2Rldi9udWxsCisrKyBiL2luY3ViYXRvci9vcGVuLXRyYWNpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vcGVudHJhY2luZy9PcGVuVHJhY2luZ0FwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsMjcyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9wZW50cmFjaW5nOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUZpbHRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5BcHBsaWNhdGlvbkV2ZW50OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLkFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5SZXF1ZXN0RXZlbnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuUmVxdWVzdEV2ZW50TGlzdGVuZXI7CisKK2ltcG9ydCBpby5vcGVudHJhY2luZy5TcGFuOworaW1wb3J0IGlvLm9wZW50cmFjaW5nLlNwYW5Db250ZXh0OworaW1wb3J0IGlvLm9wZW50cmFjaW5nLlRyYWNlcjsKK2ltcG9ydCBpby5vcGVudHJhY2luZy5wcm9wYWdhdGlvbi5Gb3JtYXQ7CitpbXBvcnQgaW8ub3BlbnRyYWNpbmcucHJvcGFnYXRpb24uVGV4dE1hcEV4dHJhY3RBZGFwdGVyOworaW1wb3J0IGlvLm9wZW50cmFjaW5nLnRhZy5UYWdzOworaW1wb3J0IGlvLm9wZW50cmFjaW5nLnV0aWwuR2xvYmFsVHJhY2VyOworCisvKioKKyAqIEFwcGxpY2F0aW9uIGV2ZW50IGxpc3RlbmVyIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBhbmQgcHJvcGFnYXRpbmcgc2VydmVyLXNpZGUgcmVxdWVzdCB7QGxpbmsgaW8ub3BlbnRyYWNpbmcuU3Bhbn0uCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICogQHNpbmNlIDIuMjYKKyAqLworY2xhc3MgT3BlblRyYWNpbmdBcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXIgaW1wbGVtZW50cyBBcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXIgeworICAgIHByaXZhdGUgZmluYWwgVHJhY2VyIGdsb2JhbFRyYWNlciA9IEdsb2JhbFRyYWNlci5nZXQoKTsKKyAgICBwcml2YXRlIGZpbmFsIE9wZW5UcmFjaW5nRmVhdHVyZS5WZXJib3NpdHkgdmVyYm9zaXR5OworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBldmVudCBsaXN0ZW5lciBpbnN0YW5jZSB3aXRoIGdpdmVuIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5vcGVudHJhY2luZy5PcGVuVHJhY2luZ0ZlYXR1cmUuVmVyYm9zaXR5fS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2ZXJib3NpdHkgZGVzaXJlZCB2ZXJib3NpdHkgbGV2ZWwKKyAgICAgKi8KKyAgICBwdWJsaWMgT3BlblRyYWNpbmdBcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXIoT3BlblRyYWNpbmdGZWF0dXJlLlZlcmJvc2l0eSB2ZXJib3NpdHkpIHsKKyAgICAgICAgdGhpcy52ZXJib3NpdHkgPSB2ZXJib3NpdHk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25FdmVudChBcHBsaWNhdGlvbkV2ZW50IGV2ZW50KSB7CisgICAgICAgIC8vIHdlIGRvbid0IGNhcmUgYWJvdXQgdGhlIHNlcnZlciBsaWZlY3ljbGUKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVxdWVzdEV2ZW50TGlzdGVuZXIgb25SZXF1ZXN0KFJlcXVlc3RFdmVudCByZXF1ZXN0RXZlbnQpIHsKKyAgICAgICAgaWYgKHJlcXVlc3RFdmVudC5nZXRUeXBlKCkgPT0gUmVxdWVzdEV2ZW50LlR5cGUuU1RBUlQpIHsKKyAgICAgICAgICAgIFNwYW4gcmVxdWVzdFNwYW4gPSBoYW5kbGVSZXF1ZXN0U3RhcnQocmVxdWVzdEV2ZW50LmdldENvbnRhaW5lclJlcXVlc3QoKSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IE9wZW5UcmFjaW5nUmVxdWVzdEV2ZW50TGlzdGVuZXIocmVxdWVzdFNwYW4pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgU3BhbiBoYW5kbGVSZXF1ZXN0U3RhcnQoQ29udGFpbmVyUmVxdWVzdCByZXF1ZXN0KSB7CisKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBtYXBwZWRIZWFkZXJzID0gcmVxdWVzdAorICAgICAgICAgICAgICAgIC5nZXRIZWFkZXJzKCkKKyAgICAgICAgICAgICAgICAuZW50cnlTZXQoKQorICAgICAgICAgICAgICAgIC5zdHJlYW0oKQorICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9NYXAoCisgICAgICAgICAgICAgICAgICAgICAgICBNYXAuRW50cnk6OmdldEtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChlbnRyeSkgLT4gT3BlblRyYWNpbmdVdGlscy5mb3JtYXRMaXN0KGVudHJ5LmdldFZhbHVlKCkpKSk7CisKKyAgICAgICAgZmluYWwgU3BhbkNvbnRleHQgZXh0cmFjdGVkQ29udGV4dCA9CisgICAgICAgICAgICAgICAgZ2xvYmFsVHJhY2VyLmV4dHJhY3QoRm9ybWF0LkJ1aWx0aW4uSFRUUF9IRUFERVJTLCBuZXcgVGV4dE1hcEV4dHJhY3RBZGFwdGVyKG1hcHBlZEhlYWRlcnMpKTsKKworICAgICAgICBUcmFjZXIuU3BhbkJ1aWxkZXIgc3BhbkJ1aWxkZXIgPSBnbG9iYWxUcmFjZXIKKyAgICAgICAgICAgICAgICAuYnVpbGRTcGFuKE9wZW5UcmFjaW5nRmVhdHVyZS5ERUZBVUxUX1JFUVVFU1RfU1BBTl9OQU1FKQorICAgICAgICAgICAgICAgIC53aXRoVGFnKFRhZ3MuU1BBTl9LSU5ELmdldEtleSgpLCBUYWdzLlNQQU5fS0lORF9TRVJWRVIpCisgICAgICAgICAgICAgICAgLndpdGhUYWcoVGFncy5IVFRQX01FVEhPRC5nZXRLZXkoKSwgcmVxdWVzdC5nZXRNZXRob2QoKSkKKyAgICAgICAgICAgICAgICAud2l0aFRhZyhUYWdzLkhUVFBfVVJMLmdldEtleSgpLCByZXF1ZXN0LmdldFJlcXVlc3RVcmkoKS50b0FTQ0lJU3RyaW5nKCkpCisgICAgICAgICAgICAgICAgLndpdGhUYWcoTG9jYWxpemF0aW9uTWVzc2FnZXMuT1BFTlRSQUNJTkdfVEFHX1JFUVVFU1RfSEVBREVSUygpLAorICAgICAgICAgICAgICAgICAgICAgICAgT3BlblRyYWNpbmdVdGlscy5oZWFkZXJzQXNTdHJpbmcocmVxdWVzdC5nZXRIZWFkZXJzKCkpKQorICAgICAgICAgICAgICAgIC53aXRoVGFnKExvY2FsaXphdGlvbk1lc3NhZ2VzLk9QRU5UUkFDSU5HX1RBR19IQVNfUkVRVUVTVF9FTlRJVFkoKSwgcmVxdWVzdC5oYXNFbnRpdHkoKSk7CisKKyAgICAgICAgaWYgKGV4dHJhY3RlZENvbnRleHQgIT0gbnVsbCkgeworICAgICAgICAgICAgc3BhbkJ1aWxkZXIgPSBzcGFuQnVpbGRlci5hc0NoaWxkT2YoZXh0cmFjdGVkQ29udGV4dCk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBTcGFuIHNwYW4gPSBzcGFuQnVpbGRlci5zdGFydE1hbnVhbCgpOworICAgICAgICByZXF1ZXN0LnNldFByb3BlcnR5KE9wZW5UcmFjaW5nRmVhdHVyZS5TUEFOX0NPTlRFWFRfUFJPUEVSVFksIHNwYW4pOworICAgICAgICBzcGFuLmxvZyhMb2NhbGl6YXRpb25NZXNzYWdlcy5PUEVOVFJBQ0lOR19MT0dfUkVRVUVTVF9TVEFSVEVEKCkpOworICAgICAgICByZXR1cm4gc3BhbjsKKyAgICB9CisKKyAgICBjbGFzcyBPcGVuVHJhY2luZ1JlcXVlc3RFdmVudExpc3RlbmVyIGltcGxlbWVudHMgUmVxdWVzdEV2ZW50TGlzdGVuZXIgeworICAgICAgICBwcml2YXRlIFNwYW4gcmVxdWVzdFNwYW47CisgICAgICAgIHByaXZhdGUgU3BhbiByZXNvdXJjZVNwYW4gPSBudWxsOworCisgICAgICAgIE9wZW5UcmFjaW5nUmVxdWVzdEV2ZW50TGlzdGVuZXIoZmluYWwgU3BhbiByZXF1ZXN0U3BhbikgeworICAgICAgICAgICAgdGhpcy5yZXF1ZXN0U3BhbiA9IHJlcXVlc3RTcGFuOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRXZlbnQoUmVxdWVzdEV2ZW50IGV2ZW50KSB7CisKKyAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQuZ2V0VHlwZSgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBNQVRDSElOR19TVEFSVDoKKyAgICAgICAgICAgICAgICAgICAgbG9nVmVyYm9zZShMb2NhbGl6YXRpb25NZXNzYWdlcy5PUEVOVFJBQ0lOR19MT0dfTUFUQ0hJTkdfU1RBUlRFRCgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIExPQ0FUT1JfTUFUQ0hFRDoKKyAgICAgICAgICAgICAgICAgICAgbG9nVmVyYm9zZShMb2NhbGl6YXRpb25NZXNzYWdlcy5PUEVOVFJBQ0lOR19MT0dfTE9DQVRPUl9NQVRDSEVEKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZW5UcmFjaW5nVXRpbHMuZm9ybWF0TGlzdChldmVudC5nZXRVcmlJbmZvKCkuZ2V0TWF0Y2hlZFJlc291cmNlTG9jYXRvcnMoKSkpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFNVQlJFU09VUkNFX0xPQ0FURUQ6CisgICAgICAgICAgICAgICAgICAgIGxvZ1ZlcmJvc2UoTG9jYWxpemF0aW9uTWVzc2FnZXMuT1BFTlRSQUNJTkdfTE9HX1NVQlJFU09VUkNFX0xPQ0FURUQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlblRyYWNpbmdVdGlscy5mb3JtYXRMaXN0KGV2ZW50LmdldFVyaUluZm8oKS5nZXRMb2NhdG9yU3ViUmVzb3VyY2VzKCkpKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgICAgICAgICBjYXNlIFJFUVVFU1RfTUFUQ0hFRDoKKyAgICAgICAgICAgICAgICAgICAgbG9nVmVyYm9zZShMb2NhbGl6YXRpb25NZXNzYWdlcy5PUEVOVFJBQ0lOR19MT0dfUkVRVUVTVF9NQVRDSEVEKGV2ZW50LmdldFVyaUluZm8oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRNYXRjaGVkUmVzb3VyY2VNZXRob2QoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRJbnZvY2FibGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXREZWZpbml0aW9uTWV0aG9kKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgbG9nKExvY2FsaXphdGlvbk1lc3NhZ2VzLk9QRU5UUkFDSU5HX0xPR19SRVFVRVNUX0ZJTFRFUklOR19TVEFSVEVEKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgUkVRVUVTVF9GSUxURVJFRDoKKyAgICAgICAgICAgICAgICAgICAgTGlzdDxDb250YWluZXJSZXF1ZXN0RmlsdGVyPiByZXF1ZXN0RmlsdGVycyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgICAgICAgICBldmVudC5nZXRDb250YWluZXJSZXF1ZXN0RmlsdGVycygpLmZvckVhY2gocmVxdWVzdEZpbHRlcnM6OmFkZCk7CisKKyAgICAgICAgICAgICAgICAgICAgbG9nVmVyYm9zZShMb2NhbGl6YXRpb25NZXNzYWdlcy5PUEVOVFJBQ0lOR19MT0dfUkVRVUVTVF9GSUxURVJJTkdfRklOSVNIRUQocmVxdWVzdEZpbHRlcnMuc2l6ZSgpKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0RmlsdGVycy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2coTG9jYWxpemF0aW9uTWVzc2FnZXMuT1BFTlRSQUNJTkdfTE9HX0FQUExJRURfUkVRVUVTVF9GSUxURVJTKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVuVHJhY2luZ1V0aWxzLmZvcm1hdFByb3ZpZGVycyhyZXF1ZXN0RmlsdGVycykpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgUkVTT1VSQ0VfTUVUSE9EX1NUQVJUOgorICAgICAgICAgICAgICAgICAgICBsb2dWZXJib3NlKExvY2FsaXphdGlvbk1lc3NhZ2VzLk9QRU5UUkFDSU5HX0xPR19SRVNPVVJDRV9NRVRIT0RfU1RBUlRFRCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5nZXRVcmlJbmZvKCkuZ2V0TWF0Y2hlZFJlc291cmNlTWV0aG9kKCkuZ2V0SW52b2NhYmxlKCkuZ2V0RGVmaW5pdGlvbk1ldGhvZCgpKSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VTcGFuID0gZ2xvYmFsVHJhY2VyLmJ1aWxkU3BhbihPcGVuVHJhY2luZ0ZlYXR1cmUuREVGQVVMVF9SRVNPVVJDRV9TUEFOX05BTUUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hc0NoaWxkT2YocmVxdWVzdFNwYW4pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdGFydE1hbnVhbCgpOworCisgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldENvbnRhaW5lclJlcXVlc3QoKS5zZXRQcm9wZXJ0eShPcGVuVHJhY2luZ0ZlYXR1cmUuU1BBTl9DT05URVhUX1BST1BFUlRZLCByZXNvdXJjZVNwYW4pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgUkVTT1VSQ0VfTUVUSE9EX0ZJTklTSEVEOgorICAgICAgICAgICAgICAgICAgICBsb2coTG9jYWxpemF0aW9uTWVzc2FnZXMuT1BFTlRSQUNJTkdfTE9HX1JFU09VUkNFX01FVEhPRF9GSU5JU0hFRCgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIFJFU1BfRklMVEVSU19TVEFSVDoKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgZmlyc3QgZXZlbnQgYWZ0ZXIgcmVzb3VyY2UgbWV0aG9kIGlzIGd1YXJhbnRlZWQgdG8gaGF2ZSBmaW5pc2hlZCwgZXZlbiBmb3IgYXN5bmNocm9ub3VzCisgICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3Npbmc7IHJlc291cmNlU3BhbiB3aWxsIGJlIGZpbmlzaGVkIGFuZCB0aGUgc3BhbiBpbiB0aGUgY29udGV4dCB3aWxsIGJlIHN3aXRjaGVkIGJhY2sgdG8gdGhlCisgICAgICAgICAgICAgICAgICAgIC8vIHJlc291cmNlIHNwYW4gYmVmb3JlIGFueSBmdXJ0aGVyIHRyYWNpbmcgY2FuIG9jY3VyLgorICAgICAgICAgICAgICAgICAgICBldmVudC5nZXRDb250YWluZXJSZXF1ZXN0KCkuc2V0UHJvcGVydHkoT3BlblRyYWNpbmdGZWF0dXJlLlNQQU5fQ09OVEVYVF9QUk9QRVJUWSwgcmVxdWVzdFNwYW4pOworICAgICAgICAgICAgICAgICAgICByZXNvdXJjZVNwYW4uZmluaXNoKCk7CisgICAgICAgICAgICAgICAgICAgIGxvZ1ZlcmJvc2UoTG9jYWxpemF0aW9uTWVzc2FnZXMuT1BFTlRSQUNJTkdfTE9HX1JFU1BPTlNFX0ZJTFRFUklOR19TVEFSVEVEKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgUkVTUF9GSUxURVJTX0ZJTklTSEVEOgorICAgICAgICAgICAgICAgICAgICBMaXN0PENvbnRhaW5lclJlc3BvbnNlRmlsdGVyPiByZXNwb25zZUZpbHRlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0Q29udGFpbmVyUmVzcG9uc2VGaWx0ZXJzKCkuZm9yRWFjaChyZXNwb25zZUZpbHRlcnM6OmFkZCk7CisgICAgICAgICAgICAgICAgICAgIGxvZ1ZlcmJvc2UoTG9jYWxpemF0aW9uTWVzc2FnZXMuT1BFTlRSQUNJTkdfTE9HX1JFU1BPTlNFX0ZJTFRFUklOR19GSU5JU0hFRChyZXNwb25zZUZpbHRlcnMuc2l6ZSgpKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZUZpbHRlcnMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbG9nKExvY2FsaXphdGlvbk1lc3NhZ2VzLk9QRU5UUkFDSU5HX0xPR19BUFBMSUVEX1JFU1BPTlNFX0ZJTFRFUlMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZW5UcmFjaW5nVXRpbHMuZm9ybWF0UHJvdmlkZXJzKHJlc3BvbnNlRmlsdGVycykpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgT05fRVhDRVBUSU9OOgorICAgICAgICAgICAgICAgICAgICBpZiAocmVzb3VyY2VTcGFuICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlU3Bhbi5zZXRUYWcoVGFncy5FUlJPUi5nZXRLZXkoKSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZVNwYW4uZmluaXNoKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFNwYW4uc2V0VGFnKFRhZ3MuRVJST1IuZ2V0S2V5KCksIHRydWUpOworICAgICAgICAgICAgICAgICAgICBsb2dFcnJvcihldmVudC5nZXRFeGNlcHRpb24oKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBFWENFUFRJT05fTUFQUEVSX0ZPVU5EOgorICAgICAgICAgICAgICAgICAgICBsb2coTG9jYWxpemF0aW9uTWVzc2FnZXMuT1BFTlRSQUNJTkdfTE9HX0VYQ0VQVElPTl9NQVBQRVJfRk9VTkQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZ2V0RXhjZXB0aW9uTWFwcGVyKCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIEVYQ0VQVElPTl9NQVBQSU5HX0ZJTklTSEVEOgorICAgICAgICAgICAgICAgICAgICBsb2coTG9jYWxpemF0aW9uTWVzc2FnZXMuT1BFTlRSQUNJTkdfTE9HX0VYQ0VQVElPTl9NQVBQSU5HX0ZJTklTSEVEKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChldmVudC5pc1Jlc3BvbnNlU3VjY2Vzc2Z1bGx5TWFwcGVkKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IExvY2FsaXphdGlvbk1lc3NhZ2VzLk9QRU5UUkFDSU5HX0xPR19FWENFUFRJT05fTUFQUElOR19TVUNDRVNTKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IExvY2FsaXphdGlvbk1lc3NhZ2VzLk9QRU5UUkFDSU5HX0xPR19FWENFUFRJT05fTUFQUElOR19OT0VYQ0VQVElPTl9PUl9GQUlMRUQoKSkpOworCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisKKyAgICAgICAgICAgICAgICBjYXNlIEZJTklTSEVEOgorICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWVzdFNwYW4gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBldmVudC5nZXRDb250YWluZXJSZXNwb25zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdHVzID0gcmVzcG9uc2UuZ2V0U3RhdHVzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFNwYW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRUYWcoVGFncy5IVFRQX1NUQVRVUy5nZXRLZXkoKSwgc3RhdHVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFRhZyhMb2NhbGl6YXRpb25NZXNzYWdlcy5PUEVOVFJBQ0lOR19UQUdfSEFTX1JFU1BPTlNFX0VOVElUWSgpLCByZXNwb25zZS5oYXNFbnRpdHkoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRUYWcoTG9jYWxpemF0aW9uTWVzc2FnZXMuT1BFTlRSQUNJTkdfVEFHX1JFU1BPTlNFX0xFTkdUSCgpLCByZXNwb25zZS5nZXRMZW5ndGgoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoNDAwIDw9IHN0YXR1cykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0U3Bhbi5zZXRUYWcoVGFncy5FUlJPUi5nZXRLZXkoKSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFNwYW4uZmluaXNoKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkcyBhIHtAbGluayBPcGVuVHJhY2luZ0ZlYXR1cmUuVmVyYm9zaXR5I1RSQUNFfS1sZXZlbCBsb2cgZW50cnkgaW50byB0aGUgcmVxdWVzdCBzcGFuLgorICAgICAgICAgKiBAcGFyYW0gcyBsb2cgbWVzc2FnZQorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSB2b2lkIGxvZ1ZlcmJvc2UoU3RyaW5nIHMpIHsKKyAgICAgICAgICAgIGxvZyhPcGVuVHJhY2luZ0ZlYXR1cmUuVmVyYm9zaXR5LlRSQUNFLCBzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGRzIGEge0BsaW5rIE9wZW5UcmFjaW5nRmVhdHVyZS5WZXJib3NpdHkjSU5GT30tbGV2ZWwgbG9nIGVudHJ5IGludG8gdGhlIHJlcXVlc3Qgc3Bhbi4KKyAgICAgICAgICogQHBhcmFtIHMgbG9nIG1lc3NhZ2UKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCBsb2coU3RyaW5nIHMpIHsKKyAgICAgICAgICAgIGxvZyhPcGVuVHJhY2luZ0ZlYXR1cmUuVmVyYm9zaXR5LklORk8sIHMpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZHMgYSBsb2cgZW50cnkgd2l0aCBnaXZlbiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkub3BlbnRyYWNpbmcuT3BlblRyYWNpbmdGZWF0dXJlLlZlcmJvc2l0eX0tbGV2ZWwgaW50byB0aGUKKyAgICAgICAgICogcmVxdWVzdCBzcGFuLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbGV2ZWwgZGVzaXJlZCB2ZXJib3NpdHkgbGV2ZWwKKyAgICAgICAgICogQHBhcmFtIHMgbG9nIG1lc3NhZ2UKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgdm9pZCBsb2coT3BlblRyYWNpbmdGZWF0dXJlLlZlcmJvc2l0eSBsZXZlbCwgU3RyaW5nIHMpIHsKKyAgICAgICAgICAgIGlmIChsZXZlbC5vcmRpbmFsKCkgPD0gdmVyYm9zaXR5Lm9yZGluYWwoKSkgeworICAgICAgICAgICAgICAgIHJlcXVlc3RTcGFuLmxvZyhzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGRzIGFuIGVycm9yIGxvZyBpbnRvIHRoZSByZXF1ZXN0IHNwYW4uCisgICAgICAgICAqIEBwYXJhbSB0IGV4Y2VwdGlvbiB0byBiZSBsb2dnZWQuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIHZvaWQgbG9nRXJyb3IoZmluYWwgVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gZXJyb3JNYXAgPSBuZXcgSGFzaE1hcDw+KDIpOworICAgICAgICAgICAgZXJyb3JNYXAucHV0KCJldmVudCIsICJlcnJvciIpOworICAgICAgICAgICAgZXJyb3JNYXAucHV0KCJlcnJvci5vYmplY3QiLCB0KTsKKyAgICAgICAgICAgIHJlcXVlc3RTcGFuLmxvZyhlcnJvck1hcCk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2luY3ViYXRvci9vcGVuLXRyYWNpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vcGVudHJhY2luZy9PcGVuVHJhY2luZ0NsaWVudFJlcXVlc3RGaWx0ZXIuamF2YSBiL2luY3ViYXRvci9vcGVuLXRyYWNpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vcGVudHJhY2luZy9PcGVuVHJhY2luZ0NsaWVudFJlcXVlc3RGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTM0NDg4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jdWJhdG9yL29wZW4tdHJhY2luZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29wZW50cmFjaW5nL09wZW5UcmFjaW5nQ2xpZW50UmVxdWVzdEZpbHRlci5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkub3BlbnRyYWNpbmc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgaW8ub3BlbnRyYWNpbmcuU3BhbjsKK2ltcG9ydCBpby5vcGVudHJhY2luZy5TcGFuQ29udGV4dDsKK2ltcG9ydCBpby5vcGVudHJhY2luZy5UcmFjZXI7CitpbXBvcnQgaW8ub3BlbnRyYWNpbmcucHJvcGFnYXRpb24uRm9ybWF0OworaW1wb3J0IGlvLm9wZW50cmFjaW5nLnByb3BhZ2F0aW9uLlRleHRNYXBJbmplY3RBZGFwdGVyOworaW1wb3J0IGlvLm9wZW50cmFjaW5nLnRhZy5UYWdzOworaW1wb3J0IGlvLm9wZW50cmFjaW5nLnV0aWwuR2xvYmFsVHJhY2VyOworCisvKioKKyAqIENsaWVudC1zaWRlIHJlcXVlc3QgZmlsdGVyLCB0aGF0IGNyZWF0ZXMgdGhlIGNsaWVudCByZXF1ZXN0IHtAY29kZSBTcGFufS4KKyAqIDxwPgorICogU3RvcmVzIHJlcXVlc3QtcmVsYXRlZCBtZXRhZGF0YSBpbnRvIHRoZSB7QGNvZGUgU3Bhbn0gYXMge0Bjb2RlIFRhZ3N9CisgKiBhbmQge0BsaW5rIEdsb2JhbFRyYWNlciNpbmplY3QoU3BhbkNvbnRleHQsIEZvcm1hdCwgT2JqZWN0KSBpbmplY3RzfSBpdCBpbnRvIGh0dHAgaGVhZGVycy4KKyAqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKiBAc2luY2UgMi4yNgorICovCitjbGFzcyBPcGVuVHJhY2luZ0NsaWVudFJlcXVlc3RGaWx0ZXIgaW1wbGVtZW50cyBDbGllbnRSZXF1ZXN0RmlsdGVyIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDbGllbnRSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgVHJhY2VyLlNwYW5CdWlsZGVyIHNwYW5CdWlsZGVyID0gR2xvYmFsVHJhY2VyLmdldCgpCisgICAgICAgICAgICAgICAgLmJ1aWxkU3BhbihMb2NhbGl6YXRpb25NZXNzYWdlcy5PUEVOVFJBQ0lOR19TUEFOX1BSRUZJWF9DTElFTlQoKSArIHJlcXVlc3RDb250ZXh0LmdldE1ldGhvZCgpKQorICAgICAgICAgICAgICAgIC53aXRoVGFnKFRhZ3MuU1BBTl9LSU5ELmdldEtleSgpLCBUYWdzLlNQQU5fS0lORF9DTElFTlQpCisgICAgICAgICAgICAgICAgLndpdGhUYWcoVGFncy5TUEFOX0tJTkQuZ2V0S2V5KCksIFRhZ3MuU1BBTl9LSU5EX0NMSUVOVCkKKyAgICAgICAgICAgICAgICAud2l0aFRhZyhUYWdzLkhUVFBfVVJMLmdldEtleSgpLCByZXF1ZXN0Q29udGV4dC5nZXRVcmkoKS50b0FTQ0lJU3RyaW5nKCkpCisgICAgICAgICAgICAgICAgLndpdGhUYWcoVGFncy5IVFRQX01FVEhPRC5nZXRLZXkoKSwgcmVxdWVzdENvbnRleHQuZ2V0TWV0aG9kKCkpCisgICAgICAgICAgICAgICAgLndpdGhUYWcoTG9jYWxpemF0aW9uTWVzc2FnZXMuT1BFTlRSQUNJTkdfVEFHX0hBU19SRVFVRVNUX0VOVElUWSgpLCByZXF1ZXN0Q29udGV4dC5oYXNFbnRpdHkoKSkKKyAgICAgICAgICAgICAgICAud2l0aFRhZyhMb2NhbGl6YXRpb25NZXNzYWdlcy5PUEVOVFJBQ0lOR19UQUdfQUNDRVBUQUJMRV9NRURJQV9UWVBFUygpLCByZXF1ZXN0Q29udGV4dC5nZXRBY2NlcHRhYmxlTWVkaWFUeXBlcygpCisgICAgICAgICAgICAgICAgICAgICAgICAuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoTWVkaWFUeXBlOjp0b1N0cmluZykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiLCAiKSkpCisgICAgICAgICAgICAgICAgLndpdGhUYWcoTG9jYWxpemF0aW9uTWVzc2FnZXMuT1BFTlRSQUNJTkdfVEFHX1JFUVVFU1RfSEVBREVSUygpLAorICAgICAgICAgICAgICAgICAgICAgICAgT3BlblRyYWNpbmdVdGlscy5oZWFkZXJzQXNTdHJpbmcocmVxdWVzdENvbnRleHQuZ2V0SGVhZGVycygpKSk7CisKKyAgICAgICAgLy8gaWYgcHJlLXN0b3JlZCAic3BhbiIgcHJvcGVydHkgaXMgZm91bmQsIHByb3BhZ2F0ZSB0aGUgc3RvcmVkIGNvbnRleHQKKyAgICAgICAgZmluYWwgT2JqZWN0IHByb3BlcnR5ID0gcmVxdWVzdENvbnRleHQuZ2V0UHJvcGVydHkoT3BlblRyYWNpbmdGZWF0dXJlLlNQQU5fQ09OVEVYVF9QUk9QRVJUWSk7CisgICAgICAgIGlmIChwcm9wZXJ0eSAhPSBudWxsICYmIHByb3BlcnR5IGluc3RhbmNlb2YgU3BhbkNvbnRleHQpIHsKKyAgICAgICAgICAgIHNwYW5CdWlsZGVyID0gc3BhbkJ1aWxkZXIuYXNDaGlsZE9mKChTcGFuQ29udGV4dCkgcHJvcGVydHkpOworICAgICAgICB9CisgICAgICAgIFNwYW4gc3BhbiA9IHNwYW5CdWlsZGVyLnN0YXJ0TWFudWFsKCk7CisKKyAgICAgICAgcmVxdWVzdENvbnRleHQuc2V0UHJvcGVydHkoT3BlblRyYWNpbmdGZWF0dXJlLlNQQU5fQ09OVEVYVF9QUk9QRVJUWSwgc3Bhbik7CisgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gYWRkZWRIZWFkZXJzID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBHbG9iYWxUcmFjZXIuZ2V0KCkuaW5qZWN0KHNwYW4uY29udGV4dCgpLCBGb3JtYXQuQnVpbHRpbi5IVFRQX0hFQURFUlMsIG5ldyBUZXh0TWFwSW5qZWN0QWRhcHRlcihhZGRlZEhlYWRlcnMpKTsKKyAgICAgICAgYWRkZWRIZWFkZXJzLmZvckVhY2goKGtleSwgdmFsdWUpIC0+IHJlcXVlc3RDb250ZXh0LmdldEhlYWRlcnMoKS5hZGQoa2V5LCB2YWx1ZSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2luY3ViYXRvci9vcGVuLXRyYWNpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vcGVudHJhY2luZy9PcGVuVHJhY2luZ0NsaWVudFJlc3BvbnNlRmlsdGVyLmphdmEgYi9pbmN1YmF0b3Ivb3Blbi10cmFjaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3BlbnRyYWNpbmcvT3BlblRyYWNpbmdDbGllbnRSZXNwb25zZUZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYWU0OGYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmN1YmF0b3Ivb3Blbi10cmFjaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3BlbnRyYWNpbmcvT3BlblRyYWNpbmdDbGllbnRSZXNwb25zZUZpbHRlci5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkub3BlbnRyYWNpbmc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXNwb25zZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlc3BvbnNlRmlsdGVyOworCitpbXBvcnQgaW8ub3BlbnRyYWNpbmcuU3BhbjsKK2ltcG9ydCBpby5vcGVudHJhY2luZy50YWcuVGFnczsKKworLyoqCisgKiBSZXRyaWV2ZXMgc3RvcmVkIHNwYW4gZnJvbSB0aGUge0BsaW5rIENsaWVudFJlcXVlc3RDb250ZXh0fSBhbmQgYWRkcyByZXNwb25zZSBkZXRhaWxzIHRvIHRoZSB0cmFjaW5nIGluZm8uCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICogQHNpbmNlIDIuMjYKKyAqLworcHVibGljIGNsYXNzIE9wZW5UcmFjaW5nQ2xpZW50UmVzcG9uc2VGaWx0ZXIgaW1wbGVtZW50cyBDbGllbnRSZXNwb25zZUZpbHRlciB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ2xpZW50UmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsIENsaWVudFJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIE9iamVjdCBzcGFuUHJvcGVydHkgPSByZXF1ZXN0Q29udGV4dC5nZXRQcm9wZXJ0eShPcGVuVHJhY2luZ0ZlYXR1cmUuU1BBTl9DT05URVhUX1BST1BFUlRZKTsKKyAgICAgICAgaWYgKHNwYW5Qcm9wZXJ0eSAhPSBudWxsICYmIHNwYW5Qcm9wZXJ0eSBpbnN0YW5jZW9mIFNwYW4pIHsKKyAgICAgICAgICAgICgoU3Bhbikgc3BhblByb3BlcnR5KQorICAgICAgICAgICAgICAgICAgICAuc2V0VGFnKFRhZ3MuSFRUUF9TVEFUVVMuZ2V0S2V5KCksIHJlc3BvbnNlQ29udGV4dC5nZXRTdGF0dXMoKSkKKyAgICAgICAgICAgICAgICAgICAgLnNldFRhZyhMb2NhbGl6YXRpb25NZXNzYWdlcy5PUEVOVFJBQ0lOR19UQUdfSEFTX1JFU1BPTlNFX0VOVElUWSgpLCByZXNwb25zZUNvbnRleHQuaGFzRW50aXR5KCkpCisgICAgICAgICAgICAgICAgICAgIC5zZXRUYWcoTG9jYWxpemF0aW9uTWVzc2FnZXMuT1BFTlRSQUNJTkdfVEFHX1JFU1BPTlNFX0xFTkdUSCgpLCByZXNwb25zZUNvbnRleHQuZ2V0TGVuZ3RoKCkpCisgICAgICAgICAgICAgICAgICAgIC5zZXRUYWcoTG9jYWxpemF0aW9uTWVzc2FnZXMuT1BFTlRSQUNJTkdfVEFHX1JFU1BPTlNFX0hFQURFUlMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVuVHJhY2luZ1V0aWxzLmhlYWRlcnNBc1N0cmluZyhyZXNwb25zZUNvbnRleHQuZ2V0SGVhZGVycygpKSkKKyAgICAgICAgICAgICAgICAgICAgLmZpbmlzaCgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaW5jdWJhdG9yL29wZW4tdHJhY2luZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29wZW50cmFjaW5nL09wZW5UcmFjaW5nRmVhdHVyZS5qYXZhIGIvaW5jdWJhdG9yL29wZW4tdHJhY2luZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29wZW50cmFjaW5nL09wZW5UcmFjaW5nRmVhdHVyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhZmIxZjkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmN1YmF0b3Ivb3Blbi10cmFjaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3BlbnRyYWNpbmcvT3BlblRyYWNpbmdGZWF0dXJlLmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkub3BlbnRyYWNpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5CZXRhOworCitpbXBvcnQgaW8ub3BlbnRyYWNpbmcudXRpbC5HbG9iYWxUcmFjZXI7CisKKy8qKgorICogQSBmZWF0dXJlIHRoYXQgZW5hYmxlcyBPcGVuVHJhY2luZyBzdXBwb3J0IG9uIHNlcnZlciBhbmQgY2xpZW50LgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqIEBzaW5jZSAyLjI2CisgKi8KK0BCZXRhCitwdWJsaWMgY2xhc3MgT3BlblRyYWNpbmdGZWF0dXJlIGltcGxlbWVudHMgRmVhdHVyZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoT3BlblRyYWNpbmdGZWF0dXJlLmNsYXNzLmdldE5hbWUoKSk7CisgICAgcHJpdmF0ZSBmaW5hbCBWZXJib3NpdHkgdmVyYm9zaXR5OworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBmZWF0dXJlIGluc3RhbmNlIHdpdGggZGVmYXVsdCAoe0BsaW5rIFZlcmJvc2l0eSNJTkZPfSB2ZXJib3NpdHkgbGV2ZWwuCisgICAgICovCisgICAgcHVibGljIE9wZW5UcmFjaW5nRmVhdHVyZSgpIHsKKyAgICAgICAgdmVyYm9zaXR5ID0gVmVyYm9zaXR5LklORk87CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBmZWF0dXJlIGluc3RhbmNlIHdpdGggZ2l2ZW4gKHtAbGluayBWZXJib3NpdHl9IGxldmVsLgorICAgICAqIEBwYXJhbSB2ZXJib3NpdHkgZGVzaXJlZCBsZXZlbCBvZiBsb2dnaW5nIHZlcmJvc2l0eQorICAgICAqLworICAgIHB1YmxpYyBPcGVuVHJhY2luZ0ZlYXR1cmUoVmVyYm9zaXR5IHZlcmJvc2l0eSkgeworICAgICAgICB0aGlzLnZlcmJvc2l0eSA9IHZlcmJvc2l0eTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9yZWQgc3BhbidzIHtAbGluayBDb250YWluZXJSZXF1ZXN0Q29udGV4dH0gcHJvcGVydHkga2V5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNQQU5fQ09OVEVYVF9QUk9QRVJUWSA9ICJzcGFuIjsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgcmVzb3VyY2Ugc3BhbiBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUkVTT1VSQ0VfU1BBTl9OQU1FID0gImplcnNleS1yZXNvdXJjZSI7CisKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGNoaWxkIHNwYW4gbmFtZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NISUxEX1NQQU5fTkFNRSA9ICJqZXJzZXktcmVzb3VyY2UtYXBwIjsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgcmVxdWVzdCAicm9vdCIgc3BhbiBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUkVRVUVTVF9TUEFOX05BTUUgPSAiamVyc2V5LXNlcnZlciI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmUoRmVhdHVyZUNvbnRleHQgY29udGV4dCkgeworICAgICAgICBpZiAoIUdsb2JhbFRyYWNlci5pc1JlZ2lzdGVyZWQoKSkgeworICAgICAgICAgICAgTE9HR0VSLndhcm5pbmcoTG9jYWxpemF0aW9uTWVzc2FnZXMuT1BFTlRSQUNJTkdfVFJBQ0VSX05PVF9SRUdJU1RFUkVEKCkpOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChjb250ZXh0LmdldENvbmZpZ3VyYXRpb24oKS5nZXRSdW50aW1lVHlwZSgpKSB7CisgICAgICAgICAgICBjYXNlIENMSUVOVDoKKyAgICAgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKE9wZW5UcmFjaW5nQ2xpZW50UmVxdWVzdEZpbHRlci5jbGFzcykucmVnaXN0ZXIoT3BlblRyYWNpbmdDbGllbnRSZXNwb25zZUZpbHRlci5jbGFzcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNFUlZFUjoKKyAgICAgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKG5ldyBPcGVuVHJhY2luZ0FwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lcih2ZXJib3NpdHkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcGVuVHJhY2luZyBKZXJzZXkgZXZlbnQgbG9nZ2luZyB2ZXJib3NpdHkuCisgICAgICovCisgICAgcHVibGljIGVudW0gVmVyYm9zaXR5IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIE9ubHkgbG9ncyBiYXNpYyBKZXJzZXkgcHJvY2Vzc2luZyByZWxhdGVkIGV2ZW50cy4KKyAgICAgICAgICovCisgICAgICAgIElORk8sCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIExvZ3MgbW9yZSBmaW5lIGdyYWluZWQgZXZlbnRzIHJlbGF0ZWQgdG8gSmVyc2V5IHByb2Nlc3NpbmcuCisgICAgICAgICAqLworICAgICAgICBUUkFDRQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvaW5jdWJhdG9yL29wZW4tdHJhY2luZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29wZW50cmFjaW5nL09wZW5UcmFjaW5nVXRpbHMuamF2YSBiL2luY3ViYXRvci9vcGVuLXRyYWNpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vcGVudHJhY2luZy9PcGVuVHJhY2luZ1V0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJjM2FkMAotLS0gL2Rldi9udWxsCisrKyBiL2luY3ViYXRvci9vcGVuLXRyYWNpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vcGVudHJhY2luZy9PcGVuVHJhY2luZ1V0aWxzLmphdmEKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkub3BlbnRyYWNpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT3B0aW9uYWw7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtU3VwcG9ydDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworCitpbXBvcnQgaW8ub3BlbnRyYWNpbmcuU3BhbjsKK2ltcG9ydCBpby5vcGVudHJhY2luZy5UcmFjZXI7CitpbXBvcnQgaW8ub3BlbnRyYWNpbmcudXRpbC5HbG9iYWxUcmFjZXI7CisKKy8qKgorICogVXRpbGl0eSBtZXRob2RzIGZvciBKZXJzZXkgT3BlblRyYWNpbmcgaW50ZWdyYXRpb24uCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICogQHNpbmNlIDIuMjYKKyAqLworcHVibGljIGNsYXNzIE9wZW5UcmFjaW5nVXRpbHMgeworCisgICAgcHJpdmF0ZSBPcGVuVHJhY2luZ1V0aWxzKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc29sdmUgcmVzb3VyY2UtbGV2ZWwgc3Bhbi4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiBvcGVuIHRyYWNpbmcgaXMgZW5hYmxlZCBhbmQge0BsaW5rIEdsb2JhbFRyYWNlcn0gaXMgcmVnaXN0ZXJlZCwgcmVzb3VyY2UtbGV2ZWwgc3BhbiBzaG91bGQgYmUgc3RvcmVkIGluIHRoZQorICAgICAqIHtAbGluayBPcGVuVHJhY2luZ0ZlYXR1cmUjU1BBTl9DT05URVhUX1BST1BFUlRZfS4gVGhpcyBzcGFuIGlzIHJlc29sdmVkIGFuZCByZXR1cm5lZCBhcyBhbiB7QGxpbmsgT3B0aW9uYWx9LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRleHQge0BsaW5rIENvbnRhaW5lclJlcXVlc3RDb250ZXh0fSBpbnN0YW5jZSwgY2FuIGJlIG9idGFpbmVkIHZpYSB7QGNvZGUgQENvbnRleHR9IGluamVjdGlvbgorICAgICAqIEByZXR1cm4ge0BsaW5rIE9wdGlvbmFsfSBvZiB0aGUgcmVzb2x2ZWQgc3BhbiwgaWYgZm91bmQ7IGVtcHR5IG9wdGlvbmFsIGlmIG5vdAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uYWw8U3Bhbj4gZ2V0UmVxdWVzdFNwYW4oZmluYWwgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgY29udGV4dCkgeworICAgICAgICBpZiAoY29udGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICBmaW5hbCBPYmplY3Qgc3BhblByb3BlcnR5ID0gY29udGV4dC5nZXRQcm9wZXJ0eShPcGVuVHJhY2luZ0ZlYXR1cmUuU1BBTl9DT05URVhUX1BST1BFUlRZKTsKKyAgICAgICAgICAgIGlmIChzcGFuUHJvcGVydHkgIT0gbnVsbCAmJiBzcGFuUHJvcGVydHkgaW5zdGFuY2VvZiBTcGFuKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9wdGlvbmFsLm9mKChTcGFuKSBzcGFuUHJvcGVydHkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBPcHRpb25hbC5lbXB0eSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhbmQgc3RhcnQgYWQtaG9jIGN1c3RvbSBzcGFuIHdpdGggdGhlIGRlZmF1bHQgbmFtZSBhcyBhIGNoaWxkIHNwYW4gb2YgdGhlIHJlcXVlc3Qgc3BhbiAoaWYgYXZhaWxhYmxlKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0IHtAbGluayBDb250YWluZXJSZXF1ZXN0Q29udGV4dH0gaW5zdGFuY2UsIGNhbiBiZSBvYnRhaW5lZCB2aWEge0Bjb2RlIEBDb250ZXh0fSBpbmplY3Rpb24KKyAgICAgKiBAcmV0dXJuIElmIHBhcmVudCBzcGFuICgicmVxdWVzdCBzcGFuIikgaW5zdGFuY2UgaXMgc3RvcmVkIGluIHRoZSB7QGNvZGUgQ29udGFpbmVyUmVxdWVzdENvbnRleHR9LCBuZXcgc3BhbiBpcyBjcmVhdGVkCisgICAgICogYXMgYSBjaGlsZCBzcGFuIG9mIHRoZSBmb3VuZCBzcGFuLiBJZiBubyBwYXJlbnQgc3BhbiBmb3VuZCwgbmV3ICJyb290IiBzcGFuIGlzIGNyZWF0ZWQuIEluIGJvdGggY2FzZXMsIHRoZSByZXR1cm5lZCBzcGFuCisgICAgICogaXMgYWxyZWFkeSBzdGFydGVkLiBJbiBvcmRlciB0byBzdWNjZXNzZnVsbHkgc3RvcmUgdGhlIHRyYWNpbmcsIHtAbGluayBTcGFuI2ZpbmlzaCgpfSBuZWVkcyB0byBiZSBpbnZva2VkIGV4cGxpY2l0bHksCisgICAgICogYWZ0ZXIgdGhlIHRyYWNlZCBjb2RlIGZpbmlzaGVzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3BhbiBnZXRSZXF1ZXN0Q2hpbGRTcGFuKGZpbmFsIENvbnRhaW5lclJlcXVlc3RDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIGdldFJlcXVlc3RDaGlsZFNwYW4oY29udGV4dCwgT3BlblRyYWNpbmdGZWF0dXJlLkRFRkFVTFRfQ0hJTERfU1BBTl9OQU1FKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW5kIHN0YXJ0IGFkLWhvYyBjdXN0b20gc3BhbiB3aXRoIGEgY3VzdG9tIG5hbWUgYXMgYSBjaGlsZCBzcGFuIG9mIHRoZSByZXF1ZXN0IHNwYW4gKGlmIGF2YWlsYWJsZSkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCAge0BsaW5rIENvbnRhaW5lclJlcXVlc3RDb250ZXh0fSBpbnN0YW5jZSwgY2FuIGJlIG9idGFpbmVkIHZpYSB7QGNvZGUgQENvbnRleHR9IGluamVjdGlvbgorICAgICAqIEBwYXJhbSBzcGFuTmFtZSBuYW1lIHRvIGJlIHVzZWQgZm9yIHRoZSBjcmVhdGVkIHNwYW4KKyAgICAgKiBAcmV0dXJuIElmIHBhcmVudCBzcGFuICgicmVxdWVzdCBzcGFuIikgaW5zdGFuY2UgaXMgc3RvcmVkIGluIHRoZSB7QGNvZGUgQ29udGFpbmVyUmVxdWVzdENvbnRleHR9LCBuZXcgc3BhbiBpcyBjcmVhdGVkCisgICAgICogYXMgYSBjaGlsZCBzcGFuIG9mIHRoZSBmb3VuZCBzcGFuLiBJZiBubyBwYXJlbnQgc3BhbiBmb3VuZCwgbmV3ICJyb290IiBzcGFuIGlzIGNyZWF0ZWQuIEluIGJvdGggY2FzZXMsIHRoZSByZXR1cm5lZCBzcGFuCisgICAgICogaXMgYWxyZWFkeSBzdGFydGVkLiBJbiBvcmRlciB0byBzdWNjZXNzZnVsbHkgc3RvcmUgdGhlIHRyYWNpbmcsIHtAbGluayBTcGFuI2ZpbmlzaCgpfSBuZWVkcyB0byBiZSBpbnZva2VkIGV4cGxpY2l0bHksCisgICAgICogYWZ0ZXIgdGhlIHRyYWNlZCBjb2RlIGZpbmlzaGVzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3BhbiBnZXRSZXF1ZXN0Q2hpbGRTcGFuKGZpbmFsIENvbnRhaW5lclJlcXVlc3RDb250ZXh0IGNvbnRleHQsIGZpbmFsIFN0cmluZyBzcGFuTmFtZSkgeworICAgICAgICBUcmFjZXIuU3BhbkJ1aWxkZXIgc3BhbkJ1aWxkZXIgPSBHbG9iYWxUcmFjZXIuZ2V0KCkuYnVpbGRTcGFuKHNwYW5OYW1lKTsKKyAgICAgICAgaWYgKGNvbnRleHQgIT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgT2JqZWN0IHNwYW5Qcm9wZXJ0eSA9IGNvbnRleHQuZ2V0UHJvcGVydHkoT3BlblRyYWNpbmdGZWF0dXJlLlNQQU5fQ09OVEVYVF9QUk9QRVJUWSk7CisgICAgICAgICAgICBpZiAoc3BhblByb3BlcnR5ICE9IG51bGwgJiYgc3BhblByb3BlcnR5IGluc3RhbmNlb2YgU3BhbikgeworICAgICAgICAgICAgICAgIHNwYW5CdWlsZGVyID0gc3BhbkJ1aWxkZXIuYXNDaGlsZE9mKChTcGFuKSBzcGFuUHJvcGVydHkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBzcGFuQnVpbGRlci5zdGFydE1hbnVhbCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnQgcmVxdWVzdC9yZXNwb25zZSBoZWFkZXJzIGZyb20ge0BsaW5rIE11bHRpdmFsdWVkTWFwfSBpbnRvIHByaW50YWJsZSBmb3JtLgorICAgICAqCisgICAgICogQHBhcmFtIGhlYWRlcnMgbXVsdGktdmFsdWVkIG1hcCBvZiByZXF1ZXN0IG9yIHJlc3BvbnNlIGhlYWRlcnMKKyAgICAgKiBAcmV0dXJuIHtAY29kZSBTdHJpbmd9IHJlcHJlc2VudGF0aW9uLCBlLmcuICJbaGVhZGVyMT1mb29dOyBbaGVhZGVyMj1iYXIsIGJhel0iCisgICAgICovCisgICAgc3RhdGljIFN0cmluZyBoZWFkZXJzQXNTdHJpbmcoZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCA/PiBoZWFkZXJzKSB7CisgICAgICAgIHJldHVybiBoZWFkZXJzLmVudHJ5U2V0KCkKKyAgICAgICAgICAgICAgICAuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAubWFwKChlbnRyeSkgLT4gIlsiCisgICAgICAgICAgICAgICAgICAgICAgICArIGVudHJ5LmdldEtleSgpICsgIj0iCisgICAgICAgICAgICAgICAgICAgICAgICArIGVudHJ5LmdldFZhbHVlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChPYmplY3Q6OnRvU3RyaW5nKQorICAgICAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKCIsICIpKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiXSIpCisgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKCI7ICIpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgU3RyaW5nIGZvcm1hdExpc3QoTGlzdDw/PiBsaXN0KSB7CisgICAgICAgIHJldHVybiBsaXN0LnN0cmVhbSgpLm1hcChPYmplY3Q6OnRvU3RyaW5nKS5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiLCAiKSk7CisgICAgfQorCisgICAgc3RhdGljIFN0cmluZyBmb3JtYXRQcm92aWRlcnMoSXRlcmFibGU8Pz4gcHJvdmlkZXJzKSB7CisgICAgICAgIHJldHVybiBTdHJlYW1TdXBwb3J0LnN0cmVhbShwcm92aWRlcnMuc3BsaXRlcmF0b3IoKSwgZmFsc2UpCisgICAgICAgICAgICAgICAgLm1hcCgocHJvdmlkZXIpIC0+IHByb3ZpZGVyLmdldENsYXNzKCkuZ2V0TmFtZSgpKQorICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMuam9pbmluZygiLCAiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaW5jdWJhdG9yL29wZW4tdHJhY2luZy9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3BlbnRyYWNpbmcvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMgYi9pbmN1YmF0b3Ivb3Blbi10cmFjaW5nL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9vcGVudHJhY2luZy9sb2NhbGl6YXRpb24ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2Y4NTA4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jdWJhdG9yL29wZW4tdHJhY2luZy9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3BlbnRyYWNpbmcvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMKQEAgLTAsMCArMSw0NCBAQAorIworIyBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisjIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyMKKyMgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorIyBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisjIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorIyB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisjCisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorIworCitvcGVudHJhY2luZy50cmFjZXIubm90LnJlZ2lzdGVyZWQ9T3BlblRyYWNpbmcgZmVhdHVyZSBpcyBlbmFibGVkLCBidXQgbm8gVHJhY2VyIGhhcyBiZWVuIHJlZ2lzdGVyZWQuIERlZmF1bHQgbm8tb3AgdHJhY2VyIHdpbGwgXAorICBiZSB1c2VkLgorb3BlbnRyYWNpbmcubG9nLnJlcXVlc3Quc3RhcnRlZD1SZXF1ZXN0IHN0YXJ0ZWQuCitvcGVudHJhY2luZy5sb2cubWF0Y2hpbmcuc3RhcnRlZD1SZXNvdXJjZSBtYXRjaGluZyBzdGFydGVkLgorb3BlbnRyYWNpbmcubG9nLnJlcXVlc3QubWF0Y2hlZD1SZXF1ZXN0IG1hdGNoZWQsIG1ldGhvZDogezB9CitvcGVudHJhY2luZy5sb2cubG9jYXRvci5tYXRjaGVkPUxvY2F0b3IgbWF0Y2hlZC4gTWF0Y2hlZCBsb2NhdG9yczogezB9CitvcGVudHJhY2luZy5sb2cuc3VicmVzb3VyY2UubG9jYXRlZD1TdWJyZXNvdXJjZSBsb2NhdGVkOiB7MH0KK29wZW50cmFjaW5nLmxvZy5yZXF1ZXN0LmZpbHRlcmluZy5zdGFydGVkPVJlcXVlc3QgZmlsdGVyaW5nIHN0YXJ0ZWQuCitvcGVudHJhY2luZy5sb2cucmVxdWVzdC5maWx0ZXJpbmcuZmluaXNoZWQ9UmVxdWVzdCBmaWx0ZXJpbmcgZmluaXNoZWQsIHswfSBmaWx0ZXIocykgYXBwbGllZC4KK29wZW50cmFjaW5nLmxvZy5hcHBsaWVkLnJlcXVlc3QuZmlsdGVycz1BcHBsaWVkIHJlcXVlc3QgZmlsdGVyczogezB9Lgorb3BlbnRyYWNpbmcubG9nLnJlc291cmNlLm1ldGhvZC5zdGFydGVkPVJlc291cmNlIG1ldGhvZCB7MH0gc3RhcnRlZC4KK29wZW50cmFjaW5nLmxvZy5yZXNwb25zZS5maWx0ZXJpbmcuc3RhcnRlZD1SZXNwb25zZSBmaWx0ZXJpbmcgc3RhcnRlZC4KK29wZW50cmFjaW5nLmxvZy5yZXNvdXJjZS5tZXRob2QuZmluaXNoZWQ9UmVzb3VyY2UgbWV0aG9kIGZpbmlzaGVkLgorb3BlbnRyYWNpbmcubG9nLnJlc3BvbnNlLmZpbHRlcmluZy5maW5pc2hlZD1SZXNwb25zZSBmaWx0ZXJpbmcgZmluaXNoZWQsIHswfSBmaWx0ZXIocykgYXBwbGllZC4KK29wZW50cmFjaW5nLmxvZy5hcHBsaWVkLnJlc3BvbnNlLmZpbHRlcnM9QXBwbGllZCByZXFzcG9uc2UgZmlsdGVyczogezB9Lgorb3BlbnRyYWNpbmcubG9nLmV4Y2VwdGlvbj1FeGNlcHRpb24gd2hpbGUgcHJvY2Vzc2luZyB0aGUgcmVxdWVzdDogezB9Lgorb3BlbnRyYWNpbmcubG9nLmV4Y2VwdGlvbi5tYXBwZXIuZm91bmQ9RXhjZXB0aW9uIG1hcHBlciBmb3VuZDogezB9Lgorb3BlbnRyYWNpbmcubG9nLmV4Y2VwdGlvbi5tYXBwaW5nLmZpbmlzaGVkPUV4Y2VwdGlvbiBtYXBwaW5nIGZpbmlzaGVkOiAKK29wZW50cmFjaW5nLmxvZy5leGNlcHRpb24ubWFwcGluZy5zdWNjZXNzPXN1Y2Nlc3NmdWxseSBtYXBwZWQKK29wZW50cmFjaW5nLmxvZy5leGNlcHRpb24ubWFwcGluZy5ub2V4Y2VwdGlvbi5vci5mYWlsZWQ9bm8gZXhjZXB0aW9uIG9yIG1hcHBpbmcgZmFpbGVkLgorb3BlbnRyYWNpbmcudGFnLnJlcXVlc3QuaGVhZGVycz1yZXF1ZXN0SGVhZGVycworb3BlbnRyYWNpbmcudGFnLnJlc3BvbnNlLmhlYWRlcnM9cmVzcG9uc2VIZWFkZXJzCitvcGVudHJhY2luZy50YWcuaGFzLnJlcXVlc3QuZW50aXR5PWhhc1JlcXVlc3RFbnRpdHkKK29wZW50cmFjaW5nLnRhZy5oYXMucmVzcG9uc2UuZW50aXR5PWhhc1Jlc3BvbnNlRW50aXR5CitvcGVudHJhY2luZy50YWcucmVzcG9uc2UubGVuZ3RoPXJlc3BvbnNlTGVuZ3RoCitvcGVudHJhY2luZy50YWcuYWNjZXB0YWJsZS5tZWRpYS50eXBlcz1hY2NlcHRhYmxlTWVkaWFUeXBlcworb3BlbnRyYWNpbmcuc3Bhbi5wcmVmaXguY2xpZW50PWplcnNleS1jbGllbnQtCisKZGlmZiAtLWdpdCBhL2luY3ViYXRvci9wb20ueG1sIGIvaW5jdWJhdG9yL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg0ZWRjYgotLS0gL2Rldi9udWxsCisrKyBiL2luY3ViYXRvci9wb20ueG1sCkBAIC0wLDAgKzEsNTQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5jdWJhdG9yPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktaW5jdWJhdG9yPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBKZXJzZXkgaW5jdWJhdG9yIGZvciBleHBlcmltZW50YWwgbW9kdWxlcyB0aGF0IGFyZSBpbiBhIHByb3RvdHlwaW5nIG9yIHJlc2VhcmNoIHN0YWdlLAorICAgICAgICBub3QgcmVhZHkgdG8gYmUgcmVsZWFzZWQgYXMgcGFydCBvZiBKZXJzZXkgKHlldCkuCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxtb2R1bGVzPgorICAgICAgICA8bW9kdWxlPmRlY2xhcmF0aXZlLWxpbmtpbmc8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5nYWUtaW50ZWdyYXRpb248L21vZHVsZT4KKyAgICAgICAgPCEtLTxtb2R1bGU+aHRtbC1qc29uPC9tb2R1bGU+LS0+CisgICAgICAgIDxtb2R1bGU+a3J5bzwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPm9wZW4tdHJhY2luZzwvbW9kdWxlPgorICAgIDwvbW9kdWxlcz4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWhrMjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvaW5qZWN0L2NkaTItc2UvcG9tLnhtbCBiL2luamVjdC9jZGkyLXNlL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNlNzMyYQotLS0gL2Rldi9udWxsCisrKyBiL2luamVjdC9jZGkyLXNlL3BvbS54bWwKQEAgLTAsMCArMSwxMTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNkaTItc2U8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktaW5qZWN0LWNkaTItc2U8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+Q0RJIDIgU0UgSW5qZWN0aW9uTWFuYWdlciBpbXBsZW1lbnRhdGlvbjwvZGVzY3JpcHRpb24+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPGNkaS5hcGkudmVyc2lvbj4yLjA8L2NkaS5hcGkudmVyc2lvbj4KKyAgICA8L3Byb3BlcnRpZXM+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29tbW9uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuamJvc3Mud2VsZC5zZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPndlbGQtc2UtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7d2VsZDMudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHJlc291cmNlcz4KKyAgICAgICAgICAgIDxyZXNvdXJjZT4KKyAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgPGZpbHRlcmluZz50cnVlPC9maWx0ZXJpbmc+CisgICAgICAgICAgICA8L3Jlc291cmNlPgorICAgICAgICA8L3Jlc291cmNlcz4KKworICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi5pc3RhY2s8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4taXN0YWNrLWNvbW1vbnMtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJ1aWxkLWhlbHBlci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5mZWxpeDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1idW5kbGUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgICAgIDxleHRlbnNpb25zPnRydWU8L2V4dGVuc2lvbnM+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxpbnN0cnVjdGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8RXhwb3J0LVBhY2thZ2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0LmNkaS5zZS4qO3ZlcnNpb249JHtwcm9qZWN0LnZlcnNpb259CisgICAgICAgICAgICAgICAgICAgICAgICA8L0V4cG9ydC1QYWNrYWdlPgorICAgICAgICAgICAgICAgICAgICAgICAgPEltcG9ydC1QYWNrYWdlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bi5taXNjLio7cmVzb2x1dGlvbjo9b3B0aW9uYWwsICoKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvSW1wb3J0LVBhY2thZ2U+CisgICAgICAgICAgICAgICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgorICAgICAgICAgICAgICAgICAgICA8dW5wYWNrQnVuZGxlPnRydWU8L3VucGFja0J1bmRsZT4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+ZGVmYXVsdC1qYXI8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL2luamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9DZGlSZXF1ZXN0Q29udGV4dC5qYXZhIGIvaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL0NkaVJlcXVlc3RDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlmYWFiMwotLS0gL2Rldi9udWxsCisrKyBiL2luamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9DZGlSZXF1ZXN0Q29udGV4dC5qYXZhCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5jZGkuc2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuRXh0ZW5kZWRMb2dnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5MYXp5VWlkOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWwuUmVxdWVzdENvbnRleHQ7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIHJlcXVlc3QgY29udGV4dC4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIENkaVJlcXVlc3RDb250ZXh0IGltcGxlbWVudHMgUmVxdWVzdENvbnRleHQgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXh0ZW5kZWRMb2dnZXIgbG9nZ2VyID0KKyAgICAgICAgICAgIG5ldyBFeHRlbmRlZExvZ2dlcihMb2dnZXIuZ2V0TG9nZ2VyKENkaVJlcXVlc3RDb250ZXh0LmNsYXNzLmdldE5hbWUoKSksIExldmVsLkZJTkVTVCk7CisKKyAgICAvKgorICAgICAqIFNjb3BlIGluc3RhbmNlIFVVSUQuCisgICAgICoKKyAgICAgKiBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgaXQncyBvbmx5IGdlbmVyYXRlZCBpZiB0b1N0cmluZygpIG1ldGhvZCBpcyBpbnZva2VkLAorICAgICAqIGUuZy4gYXMgcGFydCBvZiBzb21lIGxvdy1sZXZlbCBsb2dnaW5nLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgTGF6eVVpZCBpZCA9IG5ldyBMYXp5VWlkKCk7CisKKyAgICAvKioKKyAgICAgKiBIb2xkcyB0aGUgbnVtYmVyIG9mIHNuYXBzaG90cyBvZiB0aGlzIHNjb3BlLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgQXRvbWljSW50ZWdlciByZWZlcmVuY2VDb3VudGVyOworCisgICAgLyoqCisgICAgICogQSBtYXAgb2YgaW5qZWN0YWJsZSBpbnN0YW5jZXMgaW4gdGhpcyBzY29wZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gc3RvcmU7CisKKyAgICBDZGlSZXF1ZXN0Q29udGV4dCgpIHsKKyAgICAgICAgdGhpcy5zdG9yZSA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgdGhpcy5yZWZlcmVuY2VDb3VudGVyID0gbmV3IEF0b21pY0ludGVnZXIoMSk7CisgICAgfQorCisgICAgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRTdG9yZSgpIHsKKyAgICAgICAgcmV0dXJuIHN0b3JlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhICJuZXciIHJlZmVyZW5jZSBvZiB0aGUgc2NvcGUgaW5zdGFuY2UuIFRoaXMgd2lsbCBpbmNyZWFzZQorICAgICAqIHRoZSBpbnRlcm5hbCByZWZlcmVuY2UgY291bnRlciB3aGljaCBwcmV2ZW50cyB0aGUgc2NvcGUgaW5zdGFuY2UKKyAgICAgKiB0byBiZSBkZXN0cm95ZWQgdW50aWwgYSB7QGxpbmsgI3JlbGVhc2UoKX0gbWV0aG9kIGlzIGV4cGxpY2l0bHkKKyAgICAgKiBjYWxsZWQgKG9uY2UgcGVyIGVhY2gge0Bjb2RlIGdldFJlZmVyZW5jZSgpfSBtZXRob2QgY2FsbCkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHJlZmVyZW5jZWQgc2NvcGUgaW5zdGFuY2UuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlcXVlc3RDb250ZXh0IGdldFJlZmVyZW5jZSgpIHsKKyAgICAgICAgLy8gVE9ETzogcmVwbGFjZSBjb3VudGVyIHdpdGggYSBwaGFudG9tIHJlZmVyZW5jZSArIHJlZmVyZW5jZSBxdWV1ZS1iYXNlZCBzb2x1dGlvbgorICAgICAgICByZWZlcmVuY2VDb3VudGVyLmluY3JlbWVudEFuZEdldCgpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIGEgc2luZ2xlIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCByZXF1ZXN0IHNjb3BlIGluc3RhbmNlLgorICAgICAqIDxwPgorICAgICAqIE9uY2UgYWxsIGluc3RhbmNlIHJlZmVyZW5jZXMgYXJlIHJlbGVhc2VkLCB0aGUgaW5zdGFuY2Ugd2lsbCBiZSByZWN5Y2xlZC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlKCkgeworICAgICAgICBpZiAocmVmZXJlbmNlQ291bnRlci5kZWNyZW1lbnRBbmRHZXQoKSA8IDEpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3RvcmUuY2xlYXIoKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnTG9nKCJSZWxlYXNlZCBzY29wZSBpbnN0YW5jZSB7MH0iLCB0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiSW5zdGFuY2V7IgorICAgICAgICAgICAgICAgICsgImlkPSIgKyBpZAorICAgICAgICAgICAgICAgICsgIiwgcmVmZXJlbmNlQ291bnRlcj0iICsgcmVmZXJlbmNlQ291bnRlcgorICAgICAgICAgICAgICAgICsgIiwgc3RvcmUgc2l6ZT0iICsgc3RvcmUuc2l6ZSgpCisgICAgICAgICAgICAgICAgKyAnfSc7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL0NkaVJlcXVlc3RTY29wZS5qYXZhIGIvaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL0NkaVJlcXVlc3RTY29wZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYzUyZTUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvQ2RpUmVxdWVzdFNjb3BlLmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuY2RpLnNlOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWwuUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5pbnRlcm5hbC5SZXF1ZXN0U2NvcGU7CisKK2ltcG9ydCBvcmcuamJvc3Mud2VsZC5jb250ZXh0LmJvdW5kLkJvdW5kUmVxdWVzdENvbnRleHQ7CisKKy8qKgorICogQ0RJIFJlcXVlc3Qgc2NvcGUgaW1wbGVtZW50YXRpb24gdXNpbmcgV2VsZC1zcGVjaWZpYyB7QGxpbmsgQm91bmRSZXF1ZXN0Q29udGV4dH0gd2hpY2ggYWxsb3dzIHBhc3Mgb24gc3RvcmFnZSBmb3IKKyAqIHJlcXVlc3Qtc2NvcGVkIG9iamVjdHMuCisgKi8KK3B1YmxpYyBjbGFzcyBDZGlSZXF1ZXN0U2NvcGUgZXh0ZW5kcyBSZXF1ZXN0U2NvcGUgeworCisgICAgQEluamVjdAorICAgIHByaXZhdGUgQm91bmRSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dENvbnRyb2xsZXI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVxdWVzdENvbnRleHQgY3JlYXRlQ29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDZGlSZXF1ZXN0Q29udGV4dCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGFjdGl2YXRlKFJlcXVlc3RDb250ZXh0IGNvbnRleHQsIFJlcXVlc3RDb250ZXh0IG9sZENvbnRleHQpIHsKKyAgICAgICAgc3VwZXIuYWN0aXZhdGUoY29udGV4dCwgb2xkQ29udGV4dCk7CisKKyAgICAgICAgaWYgKG9sZENvbnRleHQgIT0gbnVsbCkgeworICAgICAgICAgICAgQ2RpUmVxdWVzdENvbnRleHQgb2xkUmVxdWVzdENvbnRleHQgPSAoQ2RpUmVxdWVzdENvbnRleHQpIG9sZENvbnRleHQ7CisgICAgICAgICAgICByZXF1ZXN0Q29udGV4dENvbnRyb2xsZXIuZGVhY3RpdmF0ZSgpOworICAgICAgICAgICAgcmVxdWVzdENvbnRleHRDb250cm9sbGVyLmRpc3NvY2lhdGUob2xkUmVxdWVzdENvbnRleHQuZ2V0U3RvcmUoKSk7CisgICAgICAgIH0KKworICAgICAgICBDZGlSZXF1ZXN0Q29udGV4dCBjZGlSZXF1ZXN0Q29udGV4dCA9IChDZGlSZXF1ZXN0Q29udGV4dCkgY29udGV4dDsKKyAgICAgICAgcmVxdWVzdENvbnRleHRDb250cm9sbGVyLmFzc29jaWF0ZShjZGlSZXF1ZXN0Q29udGV4dC5nZXRTdG9yZSgpKTsKKyAgICAgICAgcmVxdWVzdENvbnRleHRDb250cm9sbGVyLmFjdGl2YXRlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgcmVzdW1lKFJlcXVlc3RDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgc3VwZXIucmVzdW1lKGNvbnRleHQpOworCisgICAgICAgIGlmIChjb250ZXh0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIENkaVJlcXVlc3RDb250ZXh0IGNkaVJlcXVlc3RDb250ZXh0ID0gKENkaVJlcXVlc3RDb250ZXh0KSBjb250ZXh0OworICAgICAgICAgICAgcmVxdWVzdENvbnRleHRDb250cm9sbGVyLmFzc29jaWF0ZShjZGlSZXF1ZXN0Q29udGV4dC5nZXRTdG9yZSgpKTsKKyAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0Q29udHJvbGxlci5hY3RpdmF0ZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgcmVsZWFzZShSZXF1ZXN0Q29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIHN1cGVyLnJlbGVhc2UoY29udGV4dCk7CisKKyAgICAgICAgQ2RpUmVxdWVzdENvbnRleHQgY2RpUmVxdWVzdENvbnRleHQgPSAoQ2RpUmVxdWVzdENvbnRleHQpIGNvbnRleHQ7CisgICAgICAgIHJlcXVlc3RDb250ZXh0Q29udHJvbGxlci5pbnZhbGlkYXRlKCk7CisgICAgICAgIHJlcXVlc3RDb250ZXh0Q29udHJvbGxlci5kZWFjdGl2YXRlKCk7CisgICAgICAgIHJlcXVlc3RDb250ZXh0Q29udHJvbGxlci5kaXNzb2NpYXRlKGNkaVJlcXVlc3RDb250ZXh0LmdldFN0b3JlKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHN1c3BlbmQoUmVxdWVzdENvbnRleHQgY29udGV4dCkgeworICAgICAgICBpZiAoY29udGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICBDZGlSZXF1ZXN0Q29udGV4dCBjZGlSZXF1ZXN0Q29udGV4dCA9IChDZGlSZXF1ZXN0Q29udGV4dCkgY29udGV4dDsKKyAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0Q29udHJvbGxlci5kZWFjdGl2YXRlKCk7CisgICAgICAgICAgICByZXF1ZXN0Q29udGV4dENvbnRyb2xsZXIuZGlzc29jaWF0ZShjZGlSZXF1ZXN0Q29udGV4dC5nZXRTdG9yZSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2luamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9DZGlTZUluamVjdGlvbk1hbmFnZXIuamF2YSBiL2luamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9DZGlTZUluamVjdGlvbk1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzVmOTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL0NkaVNlSW5qZWN0aW9uTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMjcxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5jZGkuc2U7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuc3BpLkNyZWF0aW9uYWxDb250ZXh0OworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNlLlNlQ29udGFpbmVyOworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNlLlNlQ29udGFpbmVySW5pdGlhbGl6ZXI7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkFubm90YXRlZFR5cGU7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkJlYW47CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkJlYW5NYW5hZ2VyOworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5JbmplY3Rpb25UYXJnZXQ7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLlVubWFuYWdlZDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5jZGkuc2UuYmVhbi5KZXJzZXlCZWFuOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5jZGkuc2UuaW5qZWN0b3IuQ29udGV4dEluamVjdGlvblJlc29sdmVySW1wbDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQWJzdHJhY3RCaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkJpbmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQmluZGluZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQmluZGluZ3M7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkNsYXNzQmluZGluZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuRm9yZWlnbkRlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0Lkluc3RhbmNlQmluZGluZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuU2VydmljZUhvbGRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuU2VydmljZUhvbGRlckltcGw7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIEluamVjdGlvbk1hbmFnZXJ9IHRoYXQgc3RhcnRzIENESSBTRSBjb250YWluZXIsIHNjYW5zIGFsbCB1c2VycyBiZWFuIGFjY29yZGluZyB0byBiZWFucy54bWwgZmlsZSBhbmQKKyAqIHJlZ2lzdGVyIEplcnNleSdzIGludGVybmFsIGJlYW5zIHVzaW5nIHtAbGluayBTZUJlYW5SZWdpc3RlckV4dGVuc2lvbn0gZXh0ZW5zaW9uLgorICoKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitwdWJsaWMgY2xhc3MgQ2RpU2VJbmplY3Rpb25NYW5hZ2VyIGltcGxlbWVudHMgSW5qZWN0aW9uTWFuYWdlciB7CisKKyAgICAvLyBLZWVwcyBhbGwgYmluZGVycyBhbmQgYmluZGluZ3MgYWRkZWQgdG8gdGhlIEluamVjdGlvbk1hbmFnZXIgZHVyaW5nIHRoZSBib290c3RyYXAuCisgICAgcHJpdmF0ZSBmaW5hbCBBYnN0cmFjdEJpbmRlciBiaW5kaW5ncyA9IG5ldyBBYnN0cmFjdEJpbmRlcigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwcml2YXRlIFNlQ29udGFpbmVyIGNvbnRhaW5lcjsKKworICAgIHByaXZhdGUgQmVhbk1hbmFnZXIgYmVhbk1hbmFnZXI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlcihCaW5kaW5nIGJpbmRpbmcpIHsKKyAgICAgICAgYmluZGluZ3MuYmluZChiaW5kaW5nKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlcihJdGVyYWJsZTxCaW5kaW5nPiBiaW5kaW5ncykgeworICAgICAgICBmb3IgKEJpbmRpbmcgYmluZGluZyA6IGJpbmRpbmdzKSB7CisgICAgICAgICAgICB0aGlzLmJpbmRpbmdzLmJpbmQoYmluZGluZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlcihCaW5kZXIgYmluZGVyKSB7CisgICAgICAgIGZvciAoQmluZGluZyBiaW5kaW5nIDogQmluZGluZ3MuZ2V0QmluZGluZ3ModGhpcywgYmluZGVyKSkgeworICAgICAgICAgICAgYmluZGluZ3MuYmluZChiaW5kaW5nKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyKE9iamVjdCBwcm92aWRlcikgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuQ0RJXzJfUFJPVklERVJfTk9UX1JFR0lTVFJBQkxFKHByb3ZpZGVyLmdldENsYXNzKCkpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlZ2lzdHJhYmxlKENsYXNzPD8+IGNsYXp6KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFQ+IFQgY3JlYXRlQW5kSW5pdGlhbGl6ZShDbGFzczxUPiBjcmVhdGVNZSkgeworICAgICAgICBpZiAoY29udGFpbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIFVubWFuYWdlZC5Vbm1hbmFnZWRJbnN0YW5jZTxUPiB1bm1hbmFnZWQgPSBuZXcgVW5tYW5hZ2VkPD4oY3JlYXRlTWUpLm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICByZXR1cm4gdW5tYW5hZ2VkLnByb2R1Y2UoKQorICAgICAgICAgICAgICAgICAgICAuaW5qZWN0KCkKKyAgICAgICAgICAgICAgICAgICAgLnBvc3RDb25zdHJ1Y3QoKQorICAgICAgICAgICAgICAgICAgICAuZ2V0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUT0RPOiBtZXRob2QgaXMgaW52b2tlZCBiZWZvcmUgI2NvbXBsZXRlUmVnaXN0cmF0aW9uIC0gY3JlYXRlcyBBdXRvRGlzY292ZXJhYmxlLCBGb3JjZWRBdXRvRGlzY292ZXJhYmxlLgorICAgICAgICAgICAgLy8gSGFjazogY3JlYXRlcyBhbiBvYmplY3Qgd2l0aCBkZWZhdWx0IGNvbnN0cnVjdG9yIGFuZCB3aXRob3V0IGFuIGluamVjdGlvbi4KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgQ29uc3RydWN0b3I8VD4gY29uc3RydWN0b3IgPSBjcmVhdGVNZS5nZXRDb25zdHJ1Y3RvcigpOworICAgICAgICAgICAgICAgIHJldHVybiBjb25zdHJ1Y3Rvci5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB8IEluc3RhbnRpYXRpb25FeGNlcHRpb24gfCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2Fubm90IGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzOiAiICsgY3JlYXRlTWUsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIDxUPiBMaXN0PFNlcnZpY2VIb2xkZXI8VD4+IGdldEFsbFNlcnZpY2VIb2xkZXJzKENsYXNzPFQ+IGNvbnRyYWN0T3JJbXBsLCBBbm5vdGF0aW9uLi4uIHF1YWxpZmllcnMpIHsKKyAgICAgICAgTGlzdDxTZXJ2aWNlSG9sZGVyPFQ+PiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgZm9yIChCZWFuPD8+IGJlYW4gOiBiZWFuTWFuYWdlci5nZXRCZWFucyhjb250cmFjdE9ySW1wbCwgcXVhbGlmaWVycykpIHsKKyAgICAgICAgICAgIENyZWF0aW9uYWxDb250ZXh0PD8+IGN0eCA9IGJlYW5NYW5hZ2VyLmNyZWF0ZUNyZWF0aW9uYWxDb250ZXh0KGJlYW4pOworICAgICAgICAgICAgVCByZWZlcmVuY2UgPSAoVCkgYmVhbk1hbmFnZXIuZ2V0UmVmZXJlbmNlKGJlYW4sIGNvbnRyYWN0T3JJbXBsLCBjdHgpOworCisgICAgICAgICAgICBpbnQgcmFuayA9IDE7CisgICAgICAgICAgICBpZiAoYmVhbiBpbnN0YW5jZW9mIEplcnNleUJlYW4pIHsKKyAgICAgICAgICAgICAgICByYW5rID0gKChKZXJzZXlCZWFuKSBiZWFuKS5nZXRSYW5rKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlc3VsdC5hZGQobmV3IFNlcnZpY2VIb2xkZXJJbXBsPD4ocmVmZXJlbmNlLCAoQ2xhc3M8VD4pIGJlYW4uZ2V0QmVhbkNsYXNzKCksIGJlYW4uZ2V0VHlwZXMoKSwgcmFuaykpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxUPiBUIGdldEluc3RhbmNlKENsYXNzPFQ+IGNvbnRyYWN0T3JJbXBsLCBBbm5vdGF0aW9uLi4uIHF1YWxpZmllcnMpIHsKKyAgICAgICAgcmV0dXJuIGdldEluc3RhbmNlSW50ZXJuYWwoY29udHJhY3RPckltcGwsIHF1YWxpZmllcnMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gVCBnZXRJbnN0YW5jZShDbGFzczxUPiBjb250cmFjdE9ySW1wbCkgeworICAgICAgICByZXR1cm4gZ2V0SW5zdGFuY2VJbnRlcm5hbChjb250cmFjdE9ySW1wbCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxUPiBUIGdldEluc3RhbmNlKFR5cGUgY29udHJhY3RPckltcGwpIHsKKyAgICAgICAgcmV0dXJuIGdldEluc3RhbmNlSW50ZXJuYWwoY29udHJhY3RPckltcGwpOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHByaXZhdGUgPFQ+IFQgZ2V0SW5zdGFuY2VJbnRlcm5hbChUeXBlIGNvbnRyYWN0T3JJbXBsLCBBbm5vdGF0aW9uLi4uIHF1YWxpZmllcnMpIHsKKyAgICAgICAgU2V0PEJlYW48Pz4+IGJlYW5zID0gYmVhbk1hbmFnZXIuZ2V0QmVhbnMoY29udHJhY3RPckltcGwsIHF1YWxpZmllcnMpOworICAgICAgICBpZiAoYmVhbnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEJlYW48Pz4gYmVhbiA9IGJlYW5zLml0ZXJhdG9yKCkubmV4dCgpOworICAgICAgICBDcmVhdGlvbmFsQ29udGV4dDw/PiBjdHggPSBiZWFuTWFuYWdlci5jcmVhdGVDcmVhdGlvbmFsQ29udGV4dChiZWFuKTsKKyAgICAgICAgcmV0dXJuIChUKSBiZWFuTWFuYWdlci5nZXRSZWZlcmVuY2UoYmVhbiwgY29udHJhY3RPckltcGwsIGN0eCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIE9iamVjdCBnZXRJbnN0YW5jZShGb3JlaWduRGVzY3JpcHRvciBmb3JlaWduRGVzY3JpcHRvcikgeworICAgICAgICBCZWFuIGJlYW4gPSAoQmVhbikgZm9yZWlnbkRlc2NyaXB0b3IuZ2V0KCk7CisgICAgICAgIENyZWF0aW9uYWxDb250ZXh0IGN0eCA9IGJlYW5NYW5hZ2VyLmNyZWF0ZUNyZWF0aW9uYWxDb250ZXh0KGJlYW4pOworICAgICAgICByZXR1cm4gYmVhbi5jcmVhdGUoY3R4KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgRm9yZWlnbkRlc2NyaXB0b3IgY3JlYXRlRm9yZWlnbkRlc2NyaXB0b3IoQmluZGluZyBiaW5kaW5nKSB7CisgICAgICAgIENsYXNzPD8+IGNsYXp6OworICAgICAgICBpZiAoQ2xhc3NCaW5kaW5nLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oYmluZGluZy5nZXRDbGFzcygpKSkgeworICAgICAgICAgICAgY2xhenogPSAoKENsYXNzQmluZGluZzw/PikgYmluZGluZykuZ2V0U2VydmljZSgpOworICAgICAgICB9IGVsc2UgaWYgKEluc3RhbmNlQmluZGluZy5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGJpbmRpbmcuZ2V0Q2xhc3MoKSkpIHsKKyAgICAgICAgICAgIGNsYXp6ID0gKChJbnN0YW5jZUJpbmRpbmc8Pz4pIGJpbmRpbmcpLmdldFNlcnZpY2UoKS5nZXRDbGFzcygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzCisgICAgICAgICAgICAgICAgICAgIC5VTktOT1dOX0RFU0NSSVBUT1JfVFlQRShiaW5kaW5nLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKSk7CisgICAgICAgIH0KKworICAgICAgICBTZXQ8QmVhbjw/Pj4gYmVhbnMgPSBiZWFuTWFuYWdlci5nZXRCZWFucyhjbGF6eik7CisgICAgICAgIGlmIChiZWFucy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQmVhbiBiZWFuID0gYmVhbnMuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgICAgIENyZWF0aW9uYWxDb250ZXh0IGN0eCA9IGJlYW5NYW5hZ2VyLmNyZWF0ZUNyZWF0aW9uYWxDb250ZXh0KGJlYW4pOworICAgICAgICByZXR1cm4gRm9yZWlnbkRlc2NyaXB0b3Iud3JhcChiZWFuLCBpbnN0YW5jZSAtPiBiZWFuLmRlc3Ryb3koaW5zdGFuY2UsIGN0eCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyA8VD4gTGlzdDxUPiBnZXRBbGxJbnN0YW5jZXMoVHlwZSBjb250cmFjdE9ySW1wbCkgeworICAgICAgICBMaXN0PFQ+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb3IgKEJlYW48Pz4gYmVhbiA6IGJlYW5NYW5hZ2VyLmdldEJlYW5zKGNvbnRyYWN0T3JJbXBsKSkgeworICAgICAgICAgICAgQ3JlYXRpb25hbENvbnRleHQ8Pz4gY3R4ID0gYmVhbk1hbmFnZXIuY3JlYXRlQ3JlYXRpb25hbENvbnRleHQoYmVhbik7CisgICAgICAgICAgICBPYmplY3QgcmVmZXJlbmNlID0gYmVhbk1hbmFnZXIuZ2V0UmVmZXJlbmNlKGJlYW4sIGNvbnRyYWN0T3JJbXBsLCBjdHgpOworICAgICAgICAgICAgcmVzdWx0LmFkZCgoVCkgcmVmZXJlbmNlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyB2b2lkIGluamVjdChPYmplY3QgaW5zdGFuY2UpIHsKKyAgICAgICAgaWYgKGJlYW5NYW5hZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgIEFubm90YXRlZFR5cGUgYW5ub3RhdGVkVHlwZSA9IGJlYW5NYW5hZ2VyLmNyZWF0ZUFubm90YXRlZFR5cGUoKENsYXNzKSBpbnN0YW5jZS5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIEluamVjdGlvblRhcmdldCBpbmplY3Rpb25UYXJnZXQgPSBiZWFuTWFuYWdlci5jcmVhdGVJbmplY3Rpb25UYXJnZXQoYW5ub3RhdGVkVHlwZSk7CisgICAgICAgICAgICBDcmVhdGlvbmFsQ29udGV4dCBjb250ZXh0ID0gYmVhbk1hbmFnZXIuY3JlYXRlQ3JlYXRpb25hbENvbnRleHQobnVsbCk7CisgICAgICAgICAgICBpbmplY3Rpb25UYXJnZXQuaW5qZWN0KGluc3RhbmNlLCBjb250ZXh0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHByZURlc3Ryb3koT2JqZWN0IHByZURlc3Ryb3lNZSkgeworICAgICAgICB0aGlzLmNvbnRhaW5lci5kZXN0cm95KHByZURlc3Ryb3lNZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY29tcGxldGVSZWdpc3RyYXRpb24oKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgYmluZGluZ3MuYmluZChCaW5kaW5ncy5zZXJ2aWNlKHRoaXMpLnRvKEluamVjdGlvbk1hbmFnZXIuY2xhc3MpKTsKKyAgICAgICAgYmluZGluZ3MuaW5zdGFsbChuZXcgQ29udGV4dEluamVjdGlvblJlc29sdmVySW1wbC5CaW5kZXIodGhpczo6Z2V0QmVhbk1hbmFnZXIpKTsKKworICAgICAgICBTZUNvbnRhaW5lckluaXRpYWxpemVyIGNvbnRhaW5lckluaXRpYWxpemVyID0gU2VDb250YWluZXJJbml0aWFsaXplci5uZXdJbnN0YW5jZSgpOworICAgICAgICBjb250YWluZXJJbml0aWFsaXplci5hZGRFeHRlbnNpb25zKG5ldyBTZUJlYW5SZWdpc3RlckV4dGVuc2lvbihiaW5kaW5ncykpOworICAgICAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lckluaXRpYWxpemVyLmluaXRpYWxpemUoKTsKKyAgICAgICAgdGhpcy5iZWFuTWFuYWdlciA9IGNvbnRhaW5lci5nZXRCZWFuTWFuYWdlcigpOworICAgIH0KKworICAgIHByb3RlY3RlZCBBYnN0cmFjdEJpbmRlciBnZXRCaW5kaW5ncygpIHsKKyAgICAgICAgcmV0dXJuIGJpbmRpbmdzOworICAgIH0KKworICAgIHB1YmxpYyBTZUNvbnRhaW5lciBnZXRDb250YWluZXIoKSB7CisgICAgICAgIHJldHVybiBjb250YWluZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29udGFpbmVyKFNlQ29udGFpbmVyIGNvbnRhaW5lcikgeworICAgICAgICB0aGlzLmNvbnRhaW5lciA9IGNvbnRhaW5lcjsKKyAgICB9CisKKyAgICBwdWJsaWMgQmVhbk1hbmFnZXIgZ2V0QmVhbk1hbmFnZXIoKSB7CisgICAgICAgIHJldHVybiBiZWFuTWFuYWdlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRCZWFuTWFuYWdlcihCZWFuTWFuYWdlciBiZWFuTWFuYWdlcikgeworICAgICAgICB0aGlzLmJlYW5NYW5hZ2VyID0gYmVhbk1hbmFnZXI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2h1dGRvd24oKSB7CisgICAgICAgIGlmIChjb250YWluZXIgIT0gbnVsbCAmJiBjb250YWluZXIuaXNSdW5uaW5nKCkpIHsKKyAgICAgICAgICAgIGNvbnRhaW5lci5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaW5qZWN0KE9iamVjdCBpbmplY3RNZSwgU3RyaW5nIGNsYXNzQW5hbHl6ZXIpIHsKKyAgICAgICAgLy8gVE9ETzogVXNlZCBvbmx5IGluIGxlZ2FjeSBDREkgaW50ZWdyYXRpb24uCisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gVCBnZXRJbnN0YW5jZShDbGFzczxUPiBjb250cmFjdE9ySW1wbCwgU3RyaW5nIGNsYXNzQW5hbHl6ZXIpIHsKKyAgICAgICAgLy8gVE9ETzogVXNlZCBvbmx5IGluIGxlZ2FjeSBDREkgaW50ZWdyYXRpb24uCisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2luamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9DZGlTZUluamVjdGlvbk1hbmFnZXJGYWN0b3J5LmphdmEgYi9pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvQ2RpU2VJbmplY3Rpb25NYW5hZ2VyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmNDViOGQyCi0tLSAvZGV2L251bGwKKysrIGIvaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL0NkaVNlSW5qZWN0aW9uTWFuYWdlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5jZGkuc2U7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXJGYWN0b3J5OworCisvKioKKyAqIFNQSSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSW5qZWN0aW9uTWFuYWdlckZhY3Rvcnl9IHdoaWNoIHByb3ZpZGVzIGEgbmV3IGluc3RhbmNlIG9mIENESSB7QGxpbmsgSW5qZWN0aW9uTWFuYWdlcn0uCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK0BQcmlvcml0eSgyMCkKK3B1YmxpYyBjbGFzcyBDZGlTZUluamVjdGlvbk1hbmFnZXJGYWN0b3J5IGltcGxlbWVudHMgSW5qZWN0aW9uTWFuYWdlckZhY3RvcnkgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEluamVjdGlvbk1hbmFnZXIgY3JlYXRlKE9iamVjdCBwYXJlbnQpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDZGlTZUluamVjdGlvbk1hbmFnZXIoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvR2VuZXJpY0FycmF5VHlwZUltcGwuamF2YSBiL2luamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9HZW5lcmljQXJyYXlUeXBlSW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZDFjNmYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvR2VuZXJpY0FycmF5VHlwZUltcGwuamF2YQpAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5jZGkuc2U7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5HZW5lcmljQXJyYXlUeXBlOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CisKKy8qKgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgR2VuZXJpY0FycmF5VHlwZSBmb3IgdGhvc2UgdGltZXMgd2UgbmVlZCB0byBjcmVhdGUgdGhpcyBvbiB0aGUgZmx5LgorICoKKyAqIEBhdXRob3IgSm9obiBXZWxscyAoam9obi53ZWxscyBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgR2VuZXJpY0FycmF5VHlwZUltcGwgaW1wbGVtZW50cyBHZW5lcmljQXJyYXlUeXBlIHsKKyAgICBwcml2YXRlIGZpbmFsIFR5cGUgZ2VuZXJpY0NvbXBvbmVudFR5cGU7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIHRoZSBHZW5lcmljQXJyYXlUeXBlIHdpdGggdGhlIGdpdmVuIGFycmF5IHR5cGUKKyAgICAgKgorICAgICAqIEBwYXJhbSBnY3QgdGhlIG5vbi1udWxsIHR5cGUgZm9yIHRoaXMgR2VuZXJpY0FycmF5VHlwZQorICAgICAqLworICAgIHB1YmxpYyBHZW5lcmljQXJyYXlUeXBlSW1wbChUeXBlIGdjdCkgeworICAgICAgICBnZW5lcmljQ29tcG9uZW50VHlwZSA9IGdjdDsKKyAgICB9CisKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBqYXZhLmxhbmcucmVmbGVjdC5HZW5lcmljQXJyYXlUeXBlI2dldEdlbmVyaWNDb21wb25lbnRUeXBlKCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVHlwZSBnZXRHZW5lcmljQ29tcG9uZW50VHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIGdlbmVyaWNDb21wb25lbnRUeXBlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIHJldHVybiBnZW5lcmljQ29tcG9uZW50VHlwZS5oYXNoQ29kZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiBhIGlzIGVxdWFscyB0byBiLCBvciBib3RoCisgICAgICogYW5kIGFuZCBiIGFyZSBudWxsLiAgSXMgc2FmZSBldmVuIGlmCisgICAgICogYSBvciBiIGlzIG51bGwuICBJZiBhIG9yIGIgaXMgbnVsbCBidXQKKyAgICAgKiB0aGUgb3RoZXIgaXMgbm90IG51bGwsIHRoaXMgcmV0dXJucyBmYWxzZQorICAgICAqCisgICAgICogQHBhcmFtIGEgQSBwb3NzaWJseSBudWxsIG9iamVjdCB0byBjb21wYXJlCisgICAgICogQHBhcmFtIGIgQSBwb3NzaWJseSBudWxsIG9iamVjdCB0byBjb21wYXJlCisgICAgICogQHJldHVybiB0cnVlIGlmIGVxdWFsLCBmYWxzZSBpZiBub3QKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHNhZmVFcXVhbHMoT2JqZWN0IGEsIE9iamVjdCBiKSB7CisgICAgICAgIGlmIChhID09IGIpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChhID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYS5lcXVhbHMoYik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmIChvID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgR2VuZXJpY0FycmF5VHlwZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEdlbmVyaWNBcnJheVR5cGUgb3RoZXIgPSAoR2VuZXJpY0FycmF5VHlwZSkgbzsKKworICAgICAgICByZXR1cm4gc2FmZUVxdWFscyhnZW5lcmljQ29tcG9uZW50VHlwZSwgb3RoZXIuZ2V0R2VuZXJpY0NvbXBvbmVudFR5cGUoKSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJHZW5lcmljQXJyYXlUeXBlSW1wbCgiICsgZ2VuZXJpY0NvbXBvbmVudFR5cGUgKyAiKSI7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvUGFyYW1ldGVyaXplZFR5cGVJbXBsLmphdmEgYi9pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvUGFyYW1ldGVyaXplZFR5cGVJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk3MDRiOAotLS0gL2Rldi9udWxsCisrKyBiL2luamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9QYXJhbWV0ZXJpemVkVHlwZUltcGwuamF2YQpAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuY2RpLnNlOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUGFyYW1ldGVyaXplZFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCisvKioKKyAqIFNpbXBsZSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgUGFyYW1ldGVyaXplZFR5cGV9LgorICogPHA+CisgKiBKb2huIFdlbGxzIChqb2huLndlbGxzIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBQYXJhbWV0ZXJpemVkVHlwZUltcGwgaW1wbGVtZW50cyBQYXJhbWV0ZXJpemVkVHlwZSB7CisKKyAgICBwcml2YXRlIGZpbmFsIFR5cGUgcmF3VHlwZTsKKyAgICBwcml2YXRlIGZpbmFsIFR5cGUgYWN0dWFsVHlwZUFyZ3VtZW50c1tdOworCisgICAgLyoqCisgICAgICogQSBuZXcgcGFyYW1ldGVyaXplZCB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIHJhd1R5cGUgICAgICAgICAgICAgVGhlIHJhdyB0eXBlIG9mIHRoaXMgdHlwZS4KKyAgICAgKiBAcGFyYW0gYWN0dWFsVHlwZUFyZ3VtZW50cyBUaGUgYWN0dWFsIHR5cGUgYXJndW1lbnRzLgorICAgICAqLworICAgIHB1YmxpYyBQYXJhbWV0ZXJpemVkVHlwZUltcGwoVHlwZSByYXdUeXBlLCBUeXBlLi4uIGFjdHVhbFR5cGVBcmd1bWVudHMpIHsKKyAgICAgICAgdGhpcy5yYXdUeXBlID0gcmF3VHlwZTsKKyAgICAgICAgdGhpcy5hY3R1YWxUeXBlQXJndW1lbnRzID0gYWN0dWFsVHlwZUFyZ3VtZW50czsKKyAgICB9CisKKyAgICAvKiAobm9uLUphdmFkb2MpCisgICAgICogQHNlZSBqYXZhLmxhbmcucmVmbGVjdC5QYXJhbWV0ZXJpemVkVHlwZSNnZXRBY3R1YWxUeXBlQXJndW1lbnRzKCkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVHlwZVtdIGdldEFjdHVhbFR5cGVBcmd1bWVudHMoKSB7CisgICAgICAgIHJldHVybiBhY3R1YWxUeXBlQXJndW1lbnRzOworICAgIH0KKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIGphdmEubGFuZy5yZWZsZWN0LlBhcmFtZXRlcml6ZWRUeXBlI2dldFJhd1R5cGUoKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUeXBlIGdldFJhd1R5cGUoKSB7CisgICAgICAgIHJldHVybiByYXdUeXBlOworICAgIH0KKworICAgIC8qIChub24tSmF2YWRvYykKKyAgICAgKiBAc2VlIGphdmEubGFuZy5yZWZsZWN0LlBhcmFtZXRlcml6ZWRUeXBlI2dldE93bmVyVHlwZSgpCisgICAgICogVGhpcyBpcyBvbmx5IHVzZWQgZm9yIHRvcCBsZXZlbCB0eXBlcworICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUeXBlIGdldE93bmVyVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IHJldFZhbCA9IEFycmF5cy5oYXNoQ29kZShhY3R1YWxUeXBlQXJndW1lbnRzKTsKKyAgICAgICAgaWYgKHJhd1R5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0VmFsIF4gcmF3VHlwZS5oYXNoQ29kZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICBpZiAobyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRUeXBlKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgUGFyYW1ldGVyaXplZFR5cGUgb3RoZXIgPSAoUGFyYW1ldGVyaXplZFR5cGUpIG87CisKKyAgICAgICAgaWYgKCFyYXdUeXBlLmVxdWFscyhvdGhlci5nZXRSYXdUeXBlKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBUeXBlIG90aGVyQWN0dWFsc1tdID0gb3RoZXIuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpOworCisgICAgICAgIGlmIChvdGhlckFjdHVhbHMubGVuZ3RoICE9IGFjdHVhbFR5cGVBcmd1bWVudHMubGVuZ3RoKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBsY3YgPSAwOyBsY3YgPCBvdGhlckFjdHVhbHMubGVuZ3RoOyBsY3YrKykgeworICAgICAgICAgICAgaWYgKCFhY3R1YWxUeXBlQXJndW1lbnRzW2xjdl0uZXF1YWxzKG90aGVyQWN0dWFsc1tsY3ZdKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2luamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9SZXF1ZXN0U2NvcGVCZWFuLmphdmEgYi9pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvUmVxdWVzdFNjb3BlQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMjU0MWIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvUmVxdWVzdFNjb3BlQmVhbi5qYXZhCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5jZGkuc2U7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuc3BpLkNyZWF0aW9uYWxDb250ZXh0OworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LkFueTsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5EZWZhdWx0OworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5Bbm5vdGF0ZWRUeXBlOworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5CZWFuOworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5CZWFuTWFuYWdlcjsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuSW5qZWN0aW9uUG9pbnQ7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkluamVjdGlvblRhcmdldDsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLnV0aWwuQW5ub3RhdGlvbkxpdGVyYWw7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWwuUmVxdWVzdFNjb3BlOworCisvKioKKyAqIENESSBDbGFzcyBCZWFuIHJlcHJlc2VudHMge0BsaW5rIENkaVJlcXVlc3RTY29wZX0uCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK3B1YmxpYyBjbGFzcyBSZXF1ZXN0U2NvcGVCZWFuIGltcGxlbWVudHMgQmVhbjxDZGlSZXF1ZXN0U2NvcGU+IHsKKworICAgIHByaXZhdGUgZmluYWwgSW5qZWN0aW9uVGFyZ2V0PENkaVJlcXVlc3RTY29wZT4gaW5qZWN0aW9uVGFyZ2V0OworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBKZXJzZXktc3BlY2lmaWMge0BsaW5rIGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5CZWFufSBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVxdWVzdFNjb3BlQmVhbihCZWFuTWFuYWdlciBiZWFuTWFuYWdlcikgeworICAgICAgICBBbm5vdGF0ZWRUeXBlPENkaVJlcXVlc3RTY29wZT4gYW5ub3RhdGVkVHlwZSA9IGJlYW5NYW5hZ2VyLmNyZWF0ZUFubm90YXRlZFR5cGUoQ2RpUmVxdWVzdFNjb3BlLmNsYXNzKTsKKyAgICAgICAgdGhpcy5pbmplY3Rpb25UYXJnZXQgPSBiZWFuTWFuYWdlci5jcmVhdGVJbmplY3Rpb25UYXJnZXQoYW5ub3RhdGVkVHlwZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNOdWxsYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBDZGlSZXF1ZXN0U2NvcGUgY3JlYXRlKENyZWF0aW9uYWxDb250ZXh0PENkaVJlcXVlc3RTY29wZT4gY29udGV4dCkgeworICAgICAgICBDZGlSZXF1ZXN0U2NvcGUgaW5zdGFuY2UgPSBpbmplY3Rpb25UYXJnZXQucHJvZHVjZShjb250ZXh0KTsKKyAgICAgICAgaW5qZWN0aW9uVGFyZ2V0LmluamVjdChpbnN0YW5jZSwgY29udGV4dCk7CisgICAgICAgIGluamVjdGlvblRhcmdldC5wb3N0Q29uc3RydWN0KGluc3RhbmNlKTsKKyAgICAgICAgcmV0dXJuIGluc3RhbmNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koQ2RpUmVxdWVzdFNjb3BlIGluc3RhbmNlLCBDcmVhdGlvbmFsQ29udGV4dDxDZGlSZXF1ZXN0U2NvcGU+IGNvbnRleHQpIHsKKyAgICAgICAgaW5qZWN0aW9uVGFyZ2V0LnByZURlc3Ryb3koaW5zdGFuY2UpOworICAgICAgICBpbmplY3Rpb25UYXJnZXQuZGlzcG9zZShpbnN0YW5jZSk7CisgICAgICAgIGNvbnRleHQucmVsZWFzZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8VHlwZT4gZ2V0VHlwZXMoKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b24oUmVxdWVzdFNjb3BlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PEluamVjdGlvblBvaW50PiBnZXRJbmplY3Rpb25Qb2ludHMoKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8QW5ub3RhdGlvbj4gZ2V0UXVhbGlmaWVycygpIHsKKyAgICAgICAgU2V0PEFubm90YXRpb24+IHF1YWxpZmllcnMgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgIHF1YWxpZmllcnMuYWRkKG5ldyBBbm5vdGF0aW9uTGl0ZXJhbDxEZWZhdWx0PigpIHt9KTsKKyAgICAgICAgcXVhbGlmaWVycy5hZGQobmV3IEFubm90YXRpb25MaXRlcmFsPEFueT4oKSB7fSk7CisgICAgICAgIHJldHVybiBxdWFsaWZpZXJzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gZ2V0U2NvcGUoKSB7CisgICAgICAgIHJldHVybiBTaW5nbGV0b24uY2xhc3M7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gQ2RpUmVxdWVzdFNjb3BlLmNsYXNzLmdldE5hbWUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPj4gZ2V0U3RlcmVvdHlwZXMoKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzQWx0ZXJuYXRpdmUoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0QmVhbkNsYXNzKCkgeworICAgICAgICByZXR1cm4gQ2RpUmVxdWVzdFNjb3BlLmNsYXNzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2luamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9TZUJlYW5SZWdpc3RlckV4dGVuc2lvbi5qYXZhIGIvaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL1NlQmVhblJlZ2lzdGVyRXh0ZW5zaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYwNmY5MgotLS0gL2Rldi9udWxsCisrKyBiL2luamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9TZUJlYW5SZWdpc3RlckV4dGVuc2lvbi5qYXZhCkBAIC0wLDAgKzEsMTYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5jZGkuc2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmV2ZW50Lk9ic2VydmVzOworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5BZnRlckJlYW5EaXNjb3Zlcnk7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkJlYW5NYW5hZ2VyOworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5FeHRlbnNpb247CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLlByb2Nlc3NBbm5vdGF0ZWRUeXBlOworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5Qcm9jZXNzSW5qZWN0aW9uVGFyZ2V0OworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5XaXRoQW5ub3RhdGlvbnM7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuY2RpLnNlLmJlYW4uQmVhbkhlbHBlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuY2RpLnNlLmluamVjdG9yLkplcnNleUluamVjdGlvblRhcmdldDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQWJzdHJhY3RCaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkJpbmRpbmc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkNsYXNzQmluZGluZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uUmVzb2x2ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvblJlc29sdmVyQmluZGluZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5zdGFuY2VCaW5kaW5nOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5TdXBwbGllckNsYXNzQmluZGluZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuU3VwcGxpZXJJbnN0YW5jZUJpbmRpbmc7CisKK2ltcG9ydCBvcmcuamJvc3Mud2VsZC5pbmplY3Rpb24ucHJvZHVjZXIuQmFzaWNJbmplY3Rpb25UYXJnZXQ7CisKKy8qKgorICogQ0RJIGV4dGVuc2lvbiB0aGF0IGhhbmRsZXMgQ0RJIGJvb3RzdHJhcCBldmVudHMgYW5kIHJlZ2lzdGVycyBKZXJzZXkncyBpbnRlcm5hbGx5IHVzZWQgY29tcG9uZW50cyBhbmQgY29tcG9uZW50cyByZWdpc3RlcmVkCisgKiB1c2luZyB7QGxpbmsgQXBwbGljYXRpb259LgorICoKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitjbGFzcyBTZUJlYW5SZWdpc3RlckV4dGVuc2lvbiBpbXBsZW1lbnRzIEV4dGVuc2lvbiB7CisKKyAgICBwcml2YXRlIGZpbmFsIEFic3RyYWN0QmluZGVyIGJpbmRpbmdzOworCisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEplcnNleUluamVjdGlvblRhcmdldD4gamVyc2V5SW5qZWN0aW9uVGFyZ2V0cyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBleHRlbnNpb24gdGhhdCByZWdpc3RlcnMgSmVyc2V5J3MgaW50ZXJuYWxseSB1c2VkIGNvbXBvbmVudHMgYW5kIGNvbXBvbmVudHMgcmVnaXN0ZXJlZCB1c2luZworICAgICAqIHtAbGluayBBcHBsaWNhdGlvbn0uCisgICAgICogPHA+CisgICAgICogVE9ETzogUHJvYmFibHkgd2lsbCBiZSBjaGFuZ2VkIGR1cmluZyB0aGUgbWlncmF0aW9uIGZyb20gQ0RJIFNFIHRvIEpBVkEgRUUgZW52aXJvbm1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmluZGluZ3MgYWxsIHJlZ2lzdGVyIGJlYW5zIHVzaW5nIEplcnNleS4KKyAgICAgKi8KKyAgICBTZUJlYW5SZWdpc3RlckV4dGVuc2lvbihBYnN0cmFjdEJpbmRlciBiaW5kaW5ncykgeworICAgICAgICB0aGlzLmJpbmRpbmdzID0gYmluZGluZ3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogSWdub3JlcyB0aGUgY2xhc3NlcyB3aGljaCBhcmUgbWFudWFsbHkgYWRkZWQgdXNpbmcgYmluZGluZ3MgKHRocm91Z2gge0BsaW5rIEFwcGxpY2F0aW9ufSBjbGFzcykgYW5kIHNjYW5uZWQgYnkgQ0RJLgorICAgICAqIFRoZSBtYW51YWwgYWRkaW5nIGlzIHByaXZpbGVnZWQgYW5kIHRoZSBiZWFucyBzY2FubmVkIHVzaW5nIENESSBhcmUgaWdub3JlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUT0RPOiBUaGUgbWV0aG9kIGNvdW50cyB3aXRoIHRoZSBjb25kaXRpb24gdGhhdCB0aGUgYWxsIGJpbmRpbmdzIGFyZSBrbm93biBiZWZvcmUgdGhlIENESSBzY2FubmluZyBoYXMgYmVlbiBzdGFydGVkLAorICAgICAqIGNhbiBiZSBjaGFuZ2VkIGR1cmluZyB0aGUgbWlncmF0aW9uIGZyb20gQ0RJIFNFIHRvIEpBVkEgRUUgZW52aXJvbm1lbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0IHByb2Nlc3NlZCB0eXBlLgorICAgICAqIEBwYXJhbSA8VD4gdHlwZSBvZiB0aGUgc2Nhbm5lZCBiZWFuLgorICAgICAqLworICAgIHB1YmxpYyA8VD4gdm9pZCBpZ25vcmVNYW51YWxseVJlZ2lzdGVyZWRDb21wb25lbnRzKAorICAgICAgICAgICAgQE9ic2VydmVzIEBXaXRoQW5ub3RhdGlvbnMoeyBQYXRoLmNsYXNzLCBQcm92aWRlci5jbGFzcyB9KSBQcm9jZXNzQW5ub3RhdGVkVHlwZTxUPiBwYXQpIHsKKyAgICAgICAgZm9yIChCaW5kaW5nIGJpbmRpbmcgOiBiaW5kaW5ncy5nZXRCaW5kaW5ncygpKSB7CisgICAgICAgICAgICBpZiAoQ2xhc3NCaW5kaW5nLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oYmluZGluZy5nZXRDbGFzcygpKSkgeworICAgICAgICAgICAgICAgIENsYXNzQmluZGluZzw/PiBjbGFzc0JpbmRpbmcgPSAoQ2xhc3NCaW5kaW5nPD8+KSBiaW5kaW5nOworICAgICAgICAgICAgICAgIGlmIChwYXQuZ2V0QW5ub3RhdGVkVHlwZSgpLmdldEphdmFDbGFzcygpID09IGNsYXNzQmluZGluZy5nZXRTZXJ2aWNlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0LnZldG8oKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoSW5zdGFuY2VCaW5kaW5nLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oYmluZGluZy5nZXRDbGFzcygpKSkgeworICAgICAgICAgICAgICAgIEluc3RhbmNlQmluZGluZzw/PiBpbnN0YW5jZUJpbmRpbmcgPSAoSW5zdGFuY2VCaW5kaW5nPD8+KSBiaW5kaW5nOworICAgICAgICAgICAgICAgIGlmIChwYXQuZ2V0QW5ub3RhdGVkVHlwZSgpLmdldEphdmFDbGFzcygpID09IGluc3RhbmNlQmluZGluZy5nZXRTZXJ2aWNlKCkuZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgICAgICAgICBwYXQudmV0bygpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JhcHMgYWxsIEpBUi1SUyBjb21wb25lbnRzIGJ5IEplcnNleS1zcGVjaWZpYyBpbmplY3Rpb24gdGFyZ2V0LgorICAgICAqCisgICAgICogQHBhcmFtIHBpdCBwcm9jZXNzIGluamVjdGlvbiB0YXJnZXQuCisgICAgICogQHBhcmFtIDxUPiB0eXBlIG9mIHRoZSBwcm9jZXNzZWQgaW5qZWN0aW9uIHRhcmdldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgPFQ+IHZvaWQgb2JzZXJ2ZUluamVjdGlvblRhcmdldChAT2JzZXJ2ZXMgUHJvY2Vzc0luamVjdGlvblRhcmdldDxUPiBwaXQpIHsKKyAgICAgICAgQmFzaWNJbmplY3Rpb25UYXJnZXQ8VD4gaXQgPSAoQmFzaWNJbmplY3Rpb25UYXJnZXQ8VD4pIHBpdC5nZXRJbmplY3Rpb25UYXJnZXQoKTsKKyAgICAgICAgSmVyc2V5SW5qZWN0aW9uVGFyZ2V0PFQ+IGplcnNleUluamVjdGlvblRhcmdldCA9CisgICAgICAgICAgICAgICAgbmV3IEplcnNleUluamVjdGlvblRhcmdldDw+KGl0LCBwaXQuZ2V0QW5ub3RhdGVkVHlwZSgpLmdldEphdmFDbGFzcygpKTsKKyAgICAgICAgamVyc2V5SW5qZWN0aW9uVGFyZ2V0cy5hZGQoamVyc2V5SW5qZWN0aW9uVGFyZ2V0KTsKKyAgICAgICAgcGl0LnNldEluamVjdGlvblRhcmdldChqZXJzZXlJbmplY3Rpb25UYXJnZXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRha2VzIGFsbCByZWdpc3RlcmVkIGJpbmRpbmdzIGFuZCByZWdpc3RlcnMgdGhlbSBpbiB7QGxpbmsgQmVhbk1hbmFnZXJ9LgorICAgICAqIDxwPgorICAgICAqIE1ldGhvZCBzaG91bGQgcmVnaXN0ZXIgb25seSBKZXJzZXkgaW50ZXJuYWwgY29tcG9uZW50cyBhbmQgY2xhc3MvaW5zdGFuY2VzIHJlZ2lzdGVyZWQgdXNpbmcge0BsaW5rIEFwcGxpY2F0aW9ufS4gUmVnaXN0ZXJlZAorICAgICAqIGNsYXNzZXMvaW5zdGFuY2VzIGhhdmUgcHJpb3JpdHkgdGhlcmVmb3JlIENESSBzY2FubmluZyBzaG91bGQgdmV0byB0aGVzZSBjbGFzc2VzL2luc3RhbmNlcyBkdXJpbmcgeworICAgICAqCisgICAgICogQHBhcmFtIGFiZCAgICAgICAgIHtAY29kZSBBZnRlckJlYW5EaXNjb3Zlcnl9IGV2ZW50LgorICAgICAqIEBwYXJhbSBiZWFuTWFuYWdlciBjdXJyZW50IHtAY29kZSBCZWFuTWFuYWdlcn0uCisgICAgICogQGxpbmsgUHJvY2Vzc0Fubm90YXRlZFR5cGV9IGJvb3RzdHJhcCBwaGFzZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlckJlYW5zKEBPYnNlcnZlcyBBZnRlckJlYW5EaXNjb3ZlcnkgYWJkLCBCZWFuTWFuYWdlciBiZWFuTWFuYWdlcikgeworICAgICAgICBDb2xsZWN0aW9uPEJpbmRpbmc+IGJpbmRpbmdzID0gdGhpcy5iaW5kaW5ncy5nZXRCaW5kaW5ncygpOworCisgICAgICAgIC8qCisgICAgICAgICAqIEZpbHRlcnMgb3V0IG9ubHkgcmVnaXN0ZXJlZCBJbmplY3Rpb25SZXNvbHZlcnMuCisgICAgICAgICAqLworICAgICAgICBMaXN0PEluamVjdGlvblJlc29sdmVyPiBpbmplY3Rpb25SZXNvbHZlcnMgPSBiaW5kaW5ncy5zdHJlYW0oKQorICAgICAgICAgICAgICAgIC5maWx0ZXIoYmluZGluZyAtPiBJbmplY3Rpb25SZXNvbHZlckJpbmRpbmcuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShiaW5kaW5nLmdldENsYXNzKCkpKQorICAgICAgICAgICAgICAgIC5tYXAoSW5qZWN0aW9uUmVzb2x2ZXJCaW5kaW5nLmNsYXNzOjpjYXN0KQorICAgICAgICAgICAgICAgIC5tYXAoSW5qZWN0aW9uUmVzb2x2ZXJCaW5kaW5nOjpnZXRSZXNvbHZlcikKKyAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBQcm92aWRlIHJlZ2lzdGVyZWQgSW5qZWN0aW9uUmVzb2x2ZXJzIHRvIEplcnNleSdzIGNvbXBvbmVudHMgd2hpY2ggaGFzIGJlZW4gZGlzY292ZXJlZCBieSBDREkgaW4KKyAgICAgICAgICogUHJvY2Vzc0luamVjdGlvblRhcmdldCBib290c3RyYXAgcGhhc2UuCisgICAgICAgICAqLworICAgICAgICBqZXJzZXlJbmplY3Rpb25UYXJnZXRzLmZvckVhY2goaW5qZWN0aW9uVGFyZ2V0IC0+IGluamVjdGlvblRhcmdldC5zZXRJbmplY3Rpb25SZXNvbHZlcnMoaW5qZWN0aW9uUmVzb2x2ZXJzKSk7CisKKyAgICAgICAgZm9yIChCaW5kaW5nIGJpbmRpbmcgOiBiaW5kaW5ncykgeworICAgICAgICAgICAgaWYgKENsYXNzQmluZGluZy5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGJpbmRpbmcuZ2V0Q2xhc3MoKSkpIHsKKyAgICAgICAgICAgICAgICBCZWFuSGVscGVyLnJlZ2lzdGVyQmVhbigoQ2xhc3NCaW5kaW5nPD8+KSBiaW5kaW5nLCBhYmQsIGluamVjdGlvblJlc29sdmVycywgYmVhbk1hbmFnZXIpOworCisgICAgICAgICAgICB9IGVsc2UgaWYgKEluc3RhbmNlQmluZGluZy5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGJpbmRpbmcuZ2V0Q2xhc3MoKSkpIHsKKyAgICAgICAgICAgICAgICBCZWFuSGVscGVyLnJlZ2lzdGVyQmVhbigoSW5zdGFuY2VCaW5kaW5nPD8+KSBiaW5kaW5nLCBhYmQsIGluamVjdGlvblJlc29sdmVycyk7CisKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoU3VwcGxpZXJDbGFzc0JpbmRpbmcuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShiaW5kaW5nLmdldENsYXNzKCkpKSB7CisgICAgICAgICAgICAgICAgQmVhbkhlbHBlci5yZWdpc3RlclN1cHBsaWVyKChTdXBwbGllckNsYXNzQmluZGluZzw/PikgYmluZGluZywgYWJkLCBpbmplY3Rpb25SZXNvbHZlcnMsIGJlYW5NYW5hZ2VyKTsKKworICAgICAgICAgICAgfSBlbHNlIGlmIChTdXBwbGllckluc3RhbmNlQmluZGluZy5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGJpbmRpbmcuZ2V0Q2xhc3MoKSkpIHsKKyAgICAgICAgICAgICAgICBCZWFuSGVscGVyLnJlZ2lzdGVyU3VwcGxpZXIoKFN1cHBsaWVySW5zdGFuY2VCaW5kaW5nPD8+KSBiaW5kaW5nLCBhYmQsIGJlYW5NYW5hZ2VyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGFiZC5hZGRCZWFuKG5ldyBSZXF1ZXN0U2NvcGVCZWFuKGJlYW5NYW5hZ2VyKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL2JlYW4vQmVhbkhlbHBlci5qYXZhIGIvaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL2JlYW4vQmVhbkhlbHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZDQ3MmMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvYmVhbi9CZWFuSGVscGVyLmphdmEKQEAgLTAsMCArMSwyOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0LmNkaS5zZS5iZWFuOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkFmdGVyQmVhbkRpc2NvdmVyeTsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuQW5ub3RhdGVkVHlwZTsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuQmVhbjsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuQmVhbk1hbmFnZXI7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkluamVjdGlvblRhcmdldDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5jZGkuc2UuaW5qZWN0b3IuQ2FjaGVkQ29uc3RydWN0b3JBbmFseXplcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuY2RpLnNlLmluamVjdG9yLkluamVjdGlvblV0aWxzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5jZGkuc2UuaW5qZWN0b3IuSmVyc2V5Q29uc3RydWN0b3JJbmplY3Rpb25Qb2ludDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuY2RpLnNlLmluamVjdG9yLkplcnNleUluamVjdGlvblRhcmdldDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuY2RpLnNlLmluamVjdG9yLldyYXBwaW5nSmVyc2V5SW5qZWN0aW9uVGFyZ2V0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5DbGFzc0JpbmRpbmc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvblJlc29sdmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbnN0YW5jZUJpbmRpbmc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LlBlclRocmVhZDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuU3VwcGxpZXJDbGFzc0JpbmRpbmc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LlN1cHBsaWVySW5zdGFuY2VCaW5kaW5nOworCitpbXBvcnQgb3JnLmpib3NzLndlbGQuYW5ub3RhdGVkLmVuaGFuY2VkLkVuaGFuY2VkQW5ub3RhdGVkQ29uc3RydWN0b3I7CitpbXBvcnQgb3JnLmpib3NzLndlbGQuYW5ub3RhdGVkLmVuaGFuY2VkLkVuaGFuY2VkQW5ub3RhdGVkVHlwZTsKK2ltcG9ydCBvcmcuamJvc3Mud2VsZC5hbm5vdGF0ZWQuZW5oYW5jZWQuamxyLkNvbnN0cnVjdG9yU2lnbmF0dXJlSW1wbDsKK2ltcG9ydCBvcmcuamJvc3Mud2VsZC5hbm5vdGF0ZWQuZW5oYW5jZWQuamxyLkVuaGFuY2VkQW5ub3RhdGVkVHlwZUltcGw7CitpbXBvcnQgb3JnLmpib3NzLndlbGQuYW5ub3RhdGVkLnNsaW0uU2xpbUFubm90YXRlZFR5cGU7CitpbXBvcnQgb3JnLmpib3NzLndlbGQuYmVhbi5idWlsdGluLkJlYW5NYW5hZ2VyUHJveHk7CitpbXBvcnQgb3JnLmpib3NzLndlbGQuaW5qZWN0aW9uLkNvbnN0cnVjdG9ySW5qZWN0aW9uUG9pbnQ7CitpbXBvcnQgb3JnLmpib3NzLndlbGQuaW5qZWN0aW9uLnByb2R1Y2VyLkFic3RyYWN0SW5zdGFudGlhdG9yOworaW1wb3J0IG9yZy5qYm9zcy53ZWxkLmluamVjdGlvbi5wcm9kdWNlci5CYXNpY0luamVjdGlvblRhcmdldDsKK2ltcG9ydCBvcmcuamJvc3Mud2VsZC5pbmplY3Rpb24ucHJvZHVjZXIuQmVhbkluamVjdGlvblRhcmdldDsKK2ltcG9ydCBvcmcuamJvc3Mud2VsZC5pbmplY3Rpb24ucHJvZHVjZXIuSW5qZWN0aW9uVGFyZ2V0U2VydmljZTsKK2ltcG9ydCBvcmcuamJvc3Mud2VsZC5pbmplY3Rpb24ucHJvZHVjZXIuSW5zdGFudGlhdG9yOworaW1wb3J0IG9yZy5qYm9zcy53ZWxkLmluamVjdGlvbi5wcm9kdWNlci5Ob25Qcm9kdWNpYmxlSW5qZWN0aW9uVGFyZ2V0OworaW1wb3J0IG9yZy5qYm9zcy53ZWxkLm1hbmFnZXIuQmVhbk1hbmFnZXJJbXBsOworaW1wb3J0IG9yZy5qYm9zcy53ZWxkLnJlc291cmNlcy5DbGFzc1RyYW5zZm9ybWVyOworCisvKioKKyAqIEhlbHBlciBjbGFzcyB0byByZWdpc3RlciBhIHtAbGluayBCZWFufSBpbnRvIENESSB7QGxpbmsgQmVhbk1hbmFnZXJ9LgorICoKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitwdWJsaWMgY2xhc3MgQmVhbkhlbHBlciB7CisKKyAgICAvKioKKyAgICAgKiBGb3JiaWRzIHRoZSBjcmVhdGlvbiBvZiB7QGxpbmsgQmVhbkhlbHBlcn0gaW5zdGFuY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBCZWFuSGVscGVyKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVycyBhbiBpbnN0YW5jZSBhcyB7QGxpbmsgSmVyc2V5QmVhbn0gaW50byB7QGxpbmsgQmVhbk1hbmFnZXJ9LgorICAgICAqCisgICAgICogQHBhcmFtIGJpbmRpbmcgICBvYmplY3QgY29udGFpbmluZyB7QGxpbmsgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkJlYW5BdHRyaWJ1dGVzfSBpbmZvcm1hdGlvbi4KKyAgICAgKiBAcGFyYW0gYWJkICAgICAgIHtAbGluayBBZnRlckJlYW5EaXNjb3Zlcnl9IGV2ZW50LgorICAgICAqIEBwYXJhbSByZXNvbHZlcnMgYWxsIHJlZ2lzdGVyZWQgaW5qZWN0aW9uIHJlc29sdmVycy4KKyAgICAgKiBAcGFyYW0gPFQ+ICAgICAgIHR5cGUgb2YgdGhlIGluc3RhbmNlIHdoaWNoIGlzIHJlZ2lzdGVyZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8VD4gdm9pZCByZWdpc3RlckJlYW4oSW5zdGFuY2VCaW5kaW5nPFQ+IGJpbmRpbmcsIEFmdGVyQmVhbkRpc2NvdmVyeSBhYmQsIExpc3Q8SW5qZWN0aW9uUmVzb2x2ZXI+IHJlc29sdmVycykgeworICAgICAgICBJbnN0YW5jZUJlYW48VD4gYmVhbiA9IG5ldyBJbnN0YW5jZUJlYW48PihiaW5kaW5nKTsKKyAgICAgICAgLyoKKyAgICAgICAgICogV3JhcCBpbnRvIGN1c3RvbSBpbmplY3Rpb24gdGFyZ2V0IHRoYXQgaXMgYWJsZSB0byBpbmplY3QgdGhlIGFkZGl0aW9uYWwgQEluamVjdCwgQENvbnRleHQsIEAqUGFyYW0gZmllbGRzIGludG8KKyAgICAgICAgICogdGhlIGdpdmVuIHNlcnZpY2UuCisgICAgICAgICAqLworICAgICAgICBJbmplY3Rpb25UYXJnZXQ8VD4gaW5qZWN0aW9uVGFyZ2V0ID0gbmV3IFdyYXBwaW5nSmVyc2V5SW5qZWN0aW9uVGFyZ2V0PD4oYmVhbiwgcmVzb2x2ZXJzKTsKKyAgICAgICAgYmVhbi5zZXRJbmplY3Rpb25UYXJnZXQoaW5qZWN0aW9uVGFyZ2V0KTsKKyAgICAgICAgYWJkLmFkZEJlYW4oYmVhbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGEgY2xhc3MgYXMge0BsaW5rIEplcnNleUJlYW59IGludG8ge0BsaW5rIEJlYW5NYW5hZ2VyfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiaW5kaW5nICAgICBvYmplY3QgY29udGFpbmluZyB7QGxpbmsgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkJlYW5BdHRyaWJ1dGVzfSBpbmZvcm1hdGlvbi4KKyAgICAgKiBAcGFyYW0gYWJkICAgICAgICAge0BsaW5rIEFmdGVyQmVhbkRpc2NvdmVyeX0gZXZlbnQuCisgICAgICogQHBhcmFtIHJlc29sdmVycyAgIGFsbCByZWdpc3RlcmVkIGluamVjdGlvbiByZXNvbHZlcnMuCisgICAgICogQHBhcmFtIGJlYW5NYW5hZ2VyIGN1cnJlbnRseSB1c2VkIGJlYW4gbWFuYWdlci4KKyAgICAgKiBAcGFyYW0gPFQ+ICAgICAgICAgdHlwZSBvZiB0aGUgY2xhc3Mgd2hpY2ggaXMgcmVnaXN0ZXJlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUPiB2b2lkIHJlZ2lzdGVyQmVhbihDbGFzc0JpbmRpbmc8VD4gYmluZGluZywgQWZ0ZXJCZWFuRGlzY292ZXJ5IGFiZCwgQ29sbGVjdGlvbjxJbmplY3Rpb25SZXNvbHZlcj4gcmVzb2x2ZXJzLAorICAgICAgICAgICAgQmVhbk1hbmFnZXIgYmVhbk1hbmFnZXIpIHsKKyAgICAgICAgQW5ub3RhdGVkVHlwZTxUPiBhbm5vdGF0ZWRUeXBlID0gYmVhbk1hbmFnZXIuY3JlYXRlQW5ub3RhdGVkVHlwZShiaW5kaW5nLmdldFNlcnZpY2UoKSk7CisgICAgICAgIEluamVjdGlvblRhcmdldDxUPiBpbmplY3Rpb25UYXJnZXQgPSBiZWFuTWFuYWdlci5jcmVhdGVJbmplY3Rpb25UYXJnZXQoYW5ub3RhdGVkVHlwZSk7CisKKyAgICAgICAgQ2xhc3NCZWFuPFQ+IGJlYW4gPSBuZXcgQ2xhc3NCZWFuPD4oYmluZGluZyk7CisgICAgICAgIGJlYW4uc2V0SW5qZWN0aW9uVGFyZ2V0KGdldEplcnNleUluamVjdGlvblRhcmdldChiaW5kaW5nLmdldFNlcnZpY2UoKSwgaW5qZWN0aW9uVGFyZ2V0LCBiZWFuLCByZXNvbHZlcnMpKTsKKyAgICAgICAgYWJkLmFkZEJlYW4oYmVhbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGFuIGluc3RhbmNlIHN1cHBsaWVyIGFuZCBpdHMgcHJvdmlkZWQgdmFsdWUgYXMge0BsaW5rIEplcnNleUJlYW59cyBpbnRvIHtAbGluayBCZWFuTWFuYWdlcn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmluZGluZyBvYmplY3QgY29udGFpbmluZyB7QGxpbmsgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkJlYW5BdHRyaWJ1dGVzfSBpbmZvcm1hdGlvbi4KKyAgICAgKiBAcGFyYW0gYWJkICAgICB7QGxpbmsgQWZ0ZXJCZWFuRGlzY292ZXJ5fSBldmVudC4KKyAgICAgKiBAcGFyYW0gPFQ+ICAgICB0eXBlIG9mIHRoZSBpbnN0YW5jZSB3aGljaCBpcyByZWdpc3RlcmVkLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IHZvaWQgcmVnaXN0ZXJTdXBwbGllcihTdXBwbGllckluc3RhbmNlQmluZGluZzxUPiBiaW5kaW5nLCBBZnRlckJlYW5EaXNjb3ZlcnkgYWJkLCBCZWFuTWFuYWdlciBiZWFuTWFuYWdlcikgeworICAgICAgICBCZWFuTWFuYWdlckltcGwgbWFuYWdlcjsKKyAgICAgICAgaWYgKGJlYW5NYW5hZ2VyIGluc3RhbmNlb2YgQmVhbk1hbmFnZXJQcm94eSkgeworICAgICAgICAgICAgbWFuYWdlciA9ICgoQmVhbk1hbmFnZXJQcm94eSkgYmVhbk1hbmFnZXIpLnVud3JhcCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWFuYWdlciA9IChCZWFuTWFuYWdlckltcGwpIGJlYW5NYW5hZ2VyOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ0RJIGRvZXMgbm90IHByb3ZpZGUgc3VmZmljaWVudCBzdXBwb3J0IGZvciBUaHJlYWRTY29wZWQgU3VwcGxpZXIKKyAgICAgICAgICovCisgICAgICAgIGlmIChiaW5kaW5nLmdldFNjb3BlKCkgPT0gUGVyVGhyZWFkLmNsYXNzKSB7CisgICAgICAgICAgICBhYmQuYWRkQmVhbihuZXcgU3VwcGxpZXJUaHJlYWRTY29wZUJlYW4oYmluZGluZywgbWFuYWdlcikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWJkLmFkZEJlYW4obmV3IFN1cHBsaWVySW5zdGFuY2VCZWFuPD4oYmluZGluZykpOworICAgICAgICAgICAgYWJkLmFkZEJlYW4obmV3IFN1cHBsaWVySW5zdGFuY2VCZWFuQnJpZGdlPD4oYmluZGluZykpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGEgY2xhc3Mgc3VwcGxpZXIgYW5kIGl0cyBwcm92aWRlZCB2YWx1ZSBhcyB7QGxpbmsgSmVyc2V5QmVhbn1zIGludG8ge0BsaW5rIEJlYW5NYW5hZ2VyfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiaW5kaW5nICAgICBvYmplY3QgY29udGFpbmluZyB7QGxpbmsgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkJlYW5BdHRyaWJ1dGVzfSBpbmZvcm1hdGlvbi4KKyAgICAgKiBAcGFyYW0gYWJkICAgICAgICAge0BsaW5rIEFmdGVyQmVhbkRpc2NvdmVyeX0gZXZlbnQuCisgICAgICogQHBhcmFtIHJlc29sdmVycyAgIGFsbCByZWdpc3RlcmVkIGluamVjdGlvbiByZXNvbHZlcnMuCisgICAgICogQHBhcmFtIGJlYW5NYW5hZ2VyIGN1cnJlbnRseSB1c2VkIGJlYW4gbWFuYWdlci4KKyAgICAgKiBAcGFyYW0gPFQ+ICAgICAgICAgdHlwZSBvZiB0aGUgY2xhc3Mgd2hpY2ggaXMgcmVnaXN0ZXJlZC4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgc3RhdGljIDxUPiB2b2lkIHJlZ2lzdGVyU3VwcGxpZXIoU3VwcGxpZXJDbGFzc0JpbmRpbmc8VD4gYmluZGluZywgQWZ0ZXJCZWFuRGlzY292ZXJ5IGFiZCwKKyAgICAgICAgICAgIENvbGxlY3Rpb248SW5qZWN0aW9uUmVzb2x2ZXI+IHJlc29sdmVycywgQmVhbk1hbmFnZXIgYmVhbk1hbmFnZXIpIHsKKworICAgICAgICBDbGFzczxTdXBwbGllcjxUPj4gc3VwcGxpZXJDbGFzcyA9IChDbGFzczxTdXBwbGllcjxUPj4pIGJpbmRpbmcuZ2V0U3VwcGxpZXJDbGFzcygpOworICAgICAgICBBbm5vdGF0ZWRUeXBlPFN1cHBsaWVyPFQ+PiBhbm5vdGF0ZWRUeXBlID0gYmVhbk1hbmFnZXIuY3JlYXRlQW5ub3RhdGVkVHlwZShzdXBwbGllckNsYXNzKTsKKyAgICAgICAgSW5qZWN0aW9uVGFyZ2V0PFN1cHBsaWVyPFQ+PiBpbmplY3Rpb25UYXJnZXQgPSBiZWFuTWFuYWdlci5jcmVhdGVJbmplY3Rpb25UYXJnZXQoYW5ub3RhdGVkVHlwZSk7CisKKyAgICAgICAgU3VwcGxpZXJDbGFzc0JlYW48VD4gc3VwcGxpZXJCZWFuID0gbmV3IFN1cHBsaWVyQ2xhc3NCZWFuPD4oYmluZGluZyk7CisgICAgICAgIEluamVjdGlvblRhcmdldDxTdXBwbGllcjxUPj4gaml0ID0gZ2V0SmVyc2V5SW5qZWN0aW9uVGFyZ2V0KHN1cHBsaWVyQ2xhc3MsIGluamVjdGlvblRhcmdldCwgc3VwcGxpZXJCZWFuLCByZXNvbHZlcnMpOworICAgICAgICBzdXBwbGllckJlYW4uc2V0SW5qZWN0aW9uVGFyZ2V0KGppdCk7CisKKyAgICAgICAgYWJkLmFkZEJlYW4oc3VwcGxpZXJCZWFuKTsKKyAgICAgICAgYWJkLmFkZEJlYW4obmV3IFN1cHBsaWVyQmVhbkJyaWRnZShiaW5kaW5nLCBiZWFuTWFuYWdlcikpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIDxUPiBJbmplY3Rpb25UYXJnZXQ8VD4gZ2V0SmVyc2V5SW5qZWN0aW9uVGFyZ2V0KENsYXNzPFQ+IGNsYXp6LCBJbmplY3Rpb25UYXJnZXQ8VD4gaW5qZWN0aW9uVGFyZ2V0LAorICAgICAgICAgICAgQmVhbjxUPiBiZWFuLCBDb2xsZWN0aW9uPEluamVjdGlvblJlc29sdmVyPiByZXNvbHZlcnMpIHsKKyAgICAgICAgQmFzaWNJbmplY3Rpb25UYXJnZXQ8VD4gaXQgPSAoQmFzaWNJbmplY3Rpb25UYXJnZXQ8VD4pIGluamVjdGlvblRhcmdldDsKKworICAgICAgICAvKgorICAgICAgICAgKiBMb29rcyBhdCB3aGV0aGVyIHRoZSBEZWZhdWx0SW5zdGFudGlhdG9yIHJlc29sdmluZyBhIHZhbGlkIGNvbnN0cnVjdG9yIGRvZXMgbm90IG1ldCB0aGlzIGNhc2U6CisgICAgICAgICAqIC0gTm8gY29uc3RydWN0b3Igd2l0aCBASW5qZWN0IGFubm90YXRpb24gaXMgZGVmaW5lZAorICAgICAgICAgKiAtIE5vQXJncyBjb25zdHJ1Y3RvciBpcyBkZWZpbmVkCisgICAgICAgICAqIC0gSW5zdGFudGlhdG9yIGlnbm9yZXMgSkFYLVJTIHZhbGlkIGNvbnN0cnVjdG9yIHdpdGggbXVsdGlwbGUgcGFyYW1zCisgICAgICAgICAqLworICAgICAgICBib29sZWFuIG5vQXJnQ29uc3RydWN0b3IgPSBpc05vQXJnQ29uc3RydWN0b3JDYXNlKGl0LCBjbGF6eik7CisKKyAgICAgICAgSmVyc2V5SW5qZWN0aW9uVGFyZ2V0PFQ+IGppdDsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ0RJIGlzIGFibGUgdG8gZmluZCBhIGNvbnN0cnVjdG9yIHRoYXQgbWVhbnMgdGhhdCB0aGUgY2xhc3MgY29udGFpbnMgb25seSBvbmUgY29uc3RydWN0b3Igb2YgdGhpcyB0eXBlOgorICAgICAgICAgKiAtIGRlZmF1bHQgY29uc3RydWN0b3IKKyAgICAgICAgICogLSBub24tYXJndW1lbnQgY29uc3RydWN0b3IKKyAgICAgICAgICogLSBtdWx0aS1wYXJhbSBjb25zdHJ1Y3RvciBhbm5vdGF0ZWQgYnkgQEluamVjdCBhbm5vdGF0aW9uIGFuZCBhYmxlIHRvIGluamVjdCBhbGwgcGFyYW1ldGVycy4KKyAgICAgICAgICovCisgICAgICAgIGlmICghbm9BcmdDb25zdHJ1Y3RvciAmJiBpbmplY3Rpb25UYXJnZXQgaW5zdGFuY2VvZiBCZWFuSW5qZWN0aW9uVGFyZ2V0KSB7CisgICAgICAgICAgICBqaXQgPSBuZXcgSmVyc2V5SW5qZWN0aW9uVGFyZ2V0PD4oaXQsIGJlYW4sIGNsYXp6LCByZXNvbHZlcnMpOworCisgICAgICAgIC8qCisgICAgICAgICAqIENESSBmYWlsZWQgZHVyaW5nIHRoZSBsb29raW5nIGZvciBhIHByb3BlciBjb25zdHJ1Y3RvciBiZWNhdXNlIG9mIHRoZXNlIHJlYXNvbnM6CisgICAgICAgICAqIC0gbXVsdGktcGFyYW0gY29uc3RydWN0b3Igbm90IGFubm90YXRlZCBieSBASW5qZWN0IGFubm90YXRpb24KKyAgICAgICAgICogLSBtdWx0aXBsZSBjb25zdHJ1Y3RvcnMgYW5ub3RhdGVkIGJ5IEBJbmplY3QgYW5ub3RhdGlvbgorICAgICAgICAgKiAtIGlzIG5vdCBhYmxlIHRvIHNhdGlzZmllZCBzaW5nbGUgY29uc3RydWN0b3IgYW5ub3RhdGVkIGJ5IEBJbmplY3QgYW5ub3RhdGlvbgorICAgICAgICAgKgorICAgICAgICAgKiBUaGVyZWZvcmUgcHJvZHVjZWQgTm9uUHJvZHVjaWJsZUluamVjdGlvblRhcmdldCBjYW5ub3QgY3JlYXRlIGFuZCBpbnN0YW5jZSwgd2UgdHJ5IHRvIGZpbmQgdGhlIHByb3BlciBjb25zdHJ1Y3RvcgorICAgICAgICAgKiB1c2luZyBKQVgtUlMgcnVsZXM6CisgICAgICAgICAqIC0gbGFyZ2VzdCBjb25zdHJ1Y3RvciB3aXRoIGFsbCBhbm5vdGF0ZWQgcGFyYW1ldGVycworICAgICAgICAgKgorICAgICAgICAgKiBJZiBKQVgtUlMgdmFsaWQgY29uc3RydWN0b3IgaXMgbm90IGZpbmQgLSBJbmplY3Rpb25FeGNlcHRpb24gaXMgdGhyb3duCisgICAgICAgICAqLworICAgICAgICB9IGVsc2UgaWYgKG5vQXJnQ29uc3RydWN0b3IgfHwgaW5qZWN0aW9uVGFyZ2V0IGluc3RhbmNlb2YgTm9uUHJvZHVjaWJsZUluamVjdGlvblRhcmdldCkgeworICAgICAgICAgICAgQ2FjaGVkQ29uc3RydWN0b3JBbmFseXplcjxUPiBhbmFseXplciA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBDYWNoZWRDb25zdHJ1Y3RvckFuYWx5emVyPD4oY2xhenosIEluamVjdGlvblV0aWxzLmdldEluamVjdEFubm90YXRpb25zKHJlc29sdmVycykpOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQ29udGFpbnMgdGhlIGFuYWx5emVkIGNsYXNzIGFueSBjb25zdHJ1Y3RvciB0aGF0IGNhbiBiZSBpbmplY3RlZCBieSBKZXJzZXk/CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChhbmFseXplci5oYXNDb21wYXRpYmxlQ29uc3RydWN0b3IoKSkgeworICAgICAgICAgICAgICAgIEVuaGFuY2VkQW5ub3RhdGVkQ29uc3RydWN0b3I8VD4gY29uc3RydWN0b3IgPSBjcmVhdGVFbmhhbmNlZEFubm90YXRlZFR5cGUoaXQpCisgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RGVjbGFyZWRFbmhhbmNlZENvbnN0cnVjdG9yKG5ldyBDb25zdHJ1Y3RvclNpZ25hdHVyZUltcGwoYW5hbHl6ZXIuZ2V0Q29uc3RydWN0b3IoKSkpOworCisgICAgICAgICAgICAgICAgSmVyc2V5Q29uc3RydWN0b3JJbmplY3Rpb25Qb2ludDxUPiBjb25zdHJ1Y3RvckluamVjdGlvblBvaW50ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBKZXJzZXlDb25zdHJ1Y3RvckluamVjdGlvblBvaW50PD4oY29uc3RydWN0b3IsIGJlYW4sIGl0LmdldEJlYW5NYW5hZ2VyKCksIHJlc29sdmVycyk7CisKKyAgICAgICAgICAgICAgICBJbnN0YW50aWF0b3I8VD4gaW5zdGFudGlhdG9yID0gbmV3IEplcnNleUluc3RhbnRpYXRvcjw+KGNvbnN0cnVjdG9ySW5qZWN0aW9uUG9pbnQpOworICAgICAgICAgICAgICAgIGppdCA9IG5ldyBKZXJzZXlJbmplY3Rpb25UYXJnZXQ8PihjcmVhdGVFbmhhbmNlZEFubm90YXRlZFR5cGUoaXQpLCBpdCwgYmVhbiwgY2xhenosIHJlc29sdmVycywgaW5zdGFudGlhdG9yKTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEluc3RhbmNlIG9mIHRoaXMgY2xhc3MgY2Fubm90IGJlIGNyZWF0ZWQgbmVpdGhlciBDREkgbm9yIEplcnNleSB0aGVyZWZvcmUgbWFyayBpdCBhcyBub24tcHJvZHVjaWJsZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdyYXBwaW5nSmVyc2V5SW5qZWN0aW9uVGFyZ2V0PD4oaXQsIGJlYW4sIHJlc29sdmVycyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5rbm93biBJbmplY3Rpb25UYXJnZXQgZm9yIHRoZSBjbGFzczogIiArIGNsYXp6LmdldFR5cGVOYW1lKCkpOworICAgICAgICB9CisKKyAgICAgICAgSW5qZWN0aW9uVGFyZ2V0U2VydmljZSBpbmplY3Rpb25UYXJnZXRTZXJ2aWNlID0gaXQuZ2V0QmVhbk1hbmFnZXIoKS5nZXRTZXJ2aWNlcygpLmdldChJbmplY3Rpb25UYXJnZXRTZXJ2aWNlLmNsYXNzKTsKKyAgICAgICAgaW5qZWN0aW9uVGFyZ2V0U2VydmljZS5hZGRJbmplY3Rpb25UYXJnZXRUb0JlSW5pdGlhbGl6ZWQoaml0LmdldEVuaGFuY2VkQW5ub3RhdGVkVHlwZSgpLCBqaXQpOworICAgICAgICByZXR1cm4gaml0OworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IEVuaGFuY2VkQW5ub3RhdGVkVHlwZTxUPiBjcmVhdGVFbmhhbmNlZEFubm90YXRlZFR5cGUoQmFzaWNJbmplY3Rpb25UYXJnZXQ8VD4gaXQpIHsKKyAgICAgICAgcmV0dXJuIEVuaGFuY2VkQW5ub3RhdGVkVHlwZUltcGwub2YoCisgICAgICAgICAgICAgICAgKFNsaW1Bbm5vdGF0ZWRUeXBlPFQ+KSBpdC5nZXRBbm5vdGF0ZWRUeXBlKCksIENsYXNzVHJhbnNmb3JtZXIuaW5zdGFuY2UoaXQuZ2V0QmVhbk1hbmFnZXIoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExvb2tzIGF0IHdoZXRoZXIgdGhlIERlZmF1bHRJbnN0YW50aWF0b3IgcmVzb2x2aW5nIGEgdmFsaWQgY29uc3RydWN0b3IgZG9lcyBub3QgbWV0IHRoaXMgY2FzZToKKyAgICAgKiAtIE5vIGNvbnN0cnVjdG9yIHdpdGggQEluamVjdCBhbm5vdGF0aW9uIGlzIGRlZmluZWQKKyAgICAgKiAtIE5vQXJncyBjb25zdHJ1Y3RvciBpcyBkZWZpbmVkCisgICAgICogLSBJbnN0YW50aWF0b3IgaWdub3JlcyBKQVgtUlMgdmFsaWQgY29uc3RydWN0b3Igd2l0aCBtdWx0aXBsZSBwYXJhbXMKKyAgICAgKgorICAgICAqIEBwYXJhbSBpdCAgICBpbmplY3Rpb24gdGFyZ2V0IGNvbnRhaW5pbmcgaW5zdGFudGlhdG9yIHdpdGggcmVzb2x2ZWQgY29uc3RydWN0b3IuCisgICAgICogQHBhcmFtIGNsYXp6IGNsYXNzIHdoaWNoIGFuYWx5emVkIGNvbnN0cnVjdG9yIGJlbG9uZ3MgdG8uCisgICAgICogQHBhcmFtIDxUPiAgIHR5cGUgb2YgdGhlIGFuYWx5emVkIGNsYXNzLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIG5vLWFyZyBjb25zdHJ1Y3RvciB3YXMgc2VsZWN0ZWQgd2hpbGUgbXVsdGktcGFyYW1zIGNvbnN0cnVjdG9yIGV4aXN0cy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyA8VD4gYm9vbGVhbiBpc05vQXJnQ29uc3RydWN0b3JDYXNlKEJhc2ljSW5qZWN0aW9uVGFyZ2V0PFQ+IGl0LCBDbGFzczxUPiBjbGF6eikgeworICAgICAgICBpZiAoIShpdCBpbnN0YW5jZW9mIE5vblByb2R1Y2libGVJbmplY3Rpb25UYXJnZXQpKSB7CisgICAgICAgICAgICBJbnN0YW50aWF0b3I8VD4gaW5zdGFudGlhdG9yID0gaXQuZ2V0SW5zdGFudGlhdG9yKCk7CisgICAgICAgICAgICBDb25zdHJ1Y3RvcjxUPiBjb25zdHJ1Y3RvciA9IGluc3RhbnRpYXRvci5nZXRDb25zdHJ1Y3RvcigpOworICAgICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yLmdldFBhcmFtZXRlckNvdW50KCkgPT0gMCAmJiBjbGF6ei5nZXRDb25zdHJ1Y3RvcnMoKS5sZW5ndGggPiAxOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyYXBwZXIgY2xhc3MgdG8gcHJvdmlkZSBKZXJzZXkgaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIEluc3RhbnRpYXRvcn0gaW50ZXJmYWNlLgorICAgICAqCisgICAgICogQHBhcmFtIDxUPiB0eXBlIHdoaWNoIGlzIGNyZWF0ZWQgYnkgaW5zdGFudGlhdG9yLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEplcnNleUluc3RhbnRpYXRvcjxUPiBleHRlbmRzIEFic3RyYWN0SW5zdGFudGlhdG9yPFQ+IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIENvbnN0cnVjdG9ySW5qZWN0aW9uUG9pbnQ8VD4gaW5qZWN0aW9uUG9pbnQ7CisKKyAgICAgICAgcHJpdmF0ZSBKZXJzZXlJbnN0YW50aWF0b3IoQ29uc3RydWN0b3JJbmplY3Rpb25Qb2ludDxUPiBpbmplY3Rpb25Qb2ludCkgeworICAgICAgICAgICAgdGhpcy5pbmplY3Rpb25Qb2ludCA9IGluamVjdGlvblBvaW50OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDb25zdHJ1Y3RvckluamVjdGlvblBvaW50PFQ+IGdldENvbnN0cnVjdG9ySW5qZWN0aW9uUG9pbnQoKSB7CisgICAgICAgICAgICByZXR1cm4gaW5qZWN0aW9uUG9pbnQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENvbnN0cnVjdG9yPFQ+IGdldENvbnN0cnVjdG9yKCkgeworICAgICAgICAgICAgcmV0dXJuIGluamVjdGlvblBvaW50LmdldEFubm90YXRlZCgpLmdldEphdmFNZW1iZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJKZXJzZXlJbnN0YW50aWF0b3IgW2NvbnN0cnVjdG9yPSIgKyBpbmplY3Rpb25Qb2ludC5nZXRNZW1iZXIoKSArICJdIjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNJbnRlcmNlcHRvclN1cHBvcnQoKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzRGVjb3JhdG9yU3VwcG9ydCgpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2luamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9iZWFuL0NsYXNzQmVhbi5qYXZhIGIvaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL2JlYW4vQ2xhc3NCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRlMWEwZQotLS0gL2Rldi9udWxsCisrKyBiL2luamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9iZWFuL0NsYXNzQmVhbi5qYXZhCkBAIC0wLDAgKzEsMTY5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5jZGkuc2UuYmVhbjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuSHR0cE1ldGhvZDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LkRlcGVuZGVudDsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuUmVxdWVzdFNjb3BlZDsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuc3BpLkNyZWF0aW9uYWxDb250ZXh0OworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5JbmplY3Rpb25Qb2ludDsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuSW5qZWN0aW9uVGFyZ2V0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0LmNkaS5zZS5pbmplY3Rvci5KZXJzZXlJbmplY3Rpb25UYXJnZXQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkNsYXNzQmluZGluZzsKKworLyoqCisgKiBDcmVhdGVzIGFuIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuQmVhbn0gaW50ZXJmYWNlIHVzaW5nIEplcnNleSdzIHtAbGluayBDbGFzc0JpbmRpbmd9LiBCaW5kaW5nCisgKiBwcm92aWRlcyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJlYW4gYWxzbyBjYWxsZWQge0BsaW5rIGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5CZWFuQXR0cmlidXRlc30gaW5mb3JtYXRpb24gYW5kCisgKiB7QGxpbmsgSmVyc2V5SW5qZWN0aW9uVGFyZ2V0fSBwcm92aWRlcyB0aGUgY29udGV4dHVhbCBwYXJ0IG9mIHRoZSBiZWFuIGJlY2F1c2UgaW1wbGVtZW50cworICoge0BsaW5rIGphdmF4LmVudGVycHJpc2UuY29udGV4dC5zcGkuQ29udGV4dHVhbH0gd2l0aCBKZXJzZXkgaW5qZWN0aW9uIGV4dGVuc2lvbiAoaXMgYWJsZSB0byBpbmplY3QgaW50byBKQVgtUlMvSmVyc2V5IHNwZWNpZmllZAorICogYW5ub3RhdGlvbikuCisgKiA8cD4KKyAqIEluamVjdCBleGFtcGxlOgorICogPHByZT4KKyAqIEFic3RyYWN0QmluZGVyIHsKKyAqICAgICAmIzY0O092ZXJyaWRlCisgKiAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICogICAgICAgICBiaW5kKE15QmVhbi5jbGFzcykKKyAqICAgICAgICAgICAgICAudG8oTXlCZWFuLmNsYXNzKQorICogICAgICAgICAgICAgIC5pbihTaW5nbGV0b24uY2xhc3MpJiM1OTsKKyAqICAgICB9CisgKiB9CisgKiA8L3ByZT4KKyAqIFJlZ2lzdGVyIGV4YW1wbGU6CisgKiA8cHJlPgorICogICYjNjQ7UGF0aCgiLyIpCisgKiAgcHVibGljIGNsYXNzIE15UmVzb3VyY2UgeworICogICAgJiM2NDtJbmplY3QKKyAqICAgIHByaXZhdGUgTXlCZWFuIG15QmVhbiYjNTk7CisgKiAgfQorICogPC9wcmU+CisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK2NsYXNzIENsYXNzQmVhbjxUPiBleHRlbmRzIEplcnNleUJlYW48VD4geworCisgICAgcHJpdmF0ZSBmaW5hbCBDbGFzc0JpbmRpbmc8VD4gYmluZGluZzsKKyAgICBwcml2YXRlIEluamVjdGlvblRhcmdldDxUPiBpbmplY3Rpb25UYXJnZXQ7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IEplcnNleS1zcGVjaWZpYyB7QGxpbmsgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkJlYW59IGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIGJpbmRpbmcge0BsaW5rIGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5CZWFuQXR0cmlidXRlc30gcGFydCBvZiB0aGUgYmVhbi4KKyAgICAgKi8KKyAgICBDbGFzc0JlYW4oQ2xhc3NCaW5kaW5nPFQ+IGJpbmRpbmcpIHsKKyAgICAgICAgc3VwZXIoYmluZGluZyk7CisgICAgICAgIHRoaXMuYmluZGluZyA9IGJpbmRpbmc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBnZXRTY29wZSgpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogUmVzb3VyY2UgY2xhc3Mgd2l0aG91dCB0aGUgU2NvcGUgYW5ub3RhdGlvbiBzaG91bGQgcmVnaXN0ZXJlZCBhcyBhIFJlcXVlc3RTY29wZWQuCisgICAgICAgICAqLworICAgICAgICBpZiAoaXNSZXNvdXJjZUNsYXNzKGJpbmRpbmcuZ2V0U2VydmljZSgpKSAmJiBiaW5kaW5nLmdldFNjb3BlKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIFJlcXVlc3RTY29wZWQuY2xhc3M7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYmluZGluZy5nZXRTY29wZSgpID09IG51bGwgPyBEZXBlbmRlbnQuY2xhc3MgOiB0cmFuc2Zvcm1TY29wZShiaW5kaW5nLmdldFNjb3BlKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBUIGNyZWF0ZShDcmVhdGlvbmFsQ29udGV4dDxUPiBjb250ZXh0KSB7CisgICAgICAgIFQgaW5zdGFuY2UgPSBpbmplY3Rpb25UYXJnZXQucHJvZHVjZShjb250ZXh0KTsKKyAgICAgICAgaW5qZWN0aW9uVGFyZ2V0LmluamVjdChpbnN0YW5jZSwgY29udGV4dCk7CisgICAgICAgIGluamVjdGlvblRhcmdldC5wb3N0Q29uc3RydWN0KGluc3RhbmNlKTsKKyAgICAgICAgcmV0dXJuIGluc3RhbmNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koVCBpbnN0YW5jZSwgQ3JlYXRpb25hbENvbnRleHQ8VD4gY29udGV4dCkgeworICAgICAgICBpbmplY3Rpb25UYXJnZXQucHJlRGVzdHJveShpbnN0YW5jZSk7CisgICAgICAgIGluamVjdGlvblRhcmdldC5kaXNwb3NlKGluc3RhbmNlKTsKKyAgICAgICAgY29udGV4dC5yZWxlYXNlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxUeXBlPiBnZXRUeXBlcygpIHsKKyAgICAgICAgU2V0PFR5cGU+IGNvbnRyYWN0cyA9IHN1cGVyLmdldFR5cGVzKCk7CisgICAgICAgIGNvbnRyYWN0cy5hZGRBbGwoQXJyYXlzLmFzTGlzdChiaW5kaW5nLmdldFNlcnZpY2UoKS5nZXRJbnRlcmZhY2VzKCkpKTsKKyAgICAgICAgcmV0dXJuIGNvbnRyYWN0czsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0QmVhbkNsYXNzKCkgeworICAgICAgICByZXR1cm4gYmluZGluZy5nZXRTZXJ2aWNlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxJbmplY3Rpb25Qb2ludD4gZ2V0SW5qZWN0aW9uUG9pbnRzKCkgeworICAgICAgICByZXR1cm4gaW5qZWN0aW9uVGFyZ2V0LmdldEluamVjdGlvblBvaW50cygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExhenkgc2V0IG9mIGFuIGluamVjdGlvbiB0YXJnZXQgYmVjYXVzZSB0byBjcmVhdGUgZnVsbHkgZnVuY3Rpb25hbCBpbmplY3Rpb24gdGFyZ2V0IG5lZWRzIGFscmVhZHkgY3JlYXRlZCBiZWFuLgorICAgICAqCisgICAgICogQHBhcmFtIGluamVjdGlvblRhcmdldCB7QGxpbmsgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LnNwaS5Db250ZXh0dWFsfSBpbmZvcm1hdGlvbiBiZWxvbmdpbmcgdG8gdGhpcyBiZWFuLgorICAgICAqLworICAgIHZvaWQgc2V0SW5qZWN0aW9uVGFyZ2V0KEluamVjdGlvblRhcmdldDxUPiBpbmplY3Rpb25UYXJnZXQpIHsKKyAgICAgICAgdGhpcy5pbmplY3Rpb25UYXJnZXQgPSBpbmplY3Rpb25UYXJnZXQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1Jlc291cmNlQ2xhc3MoQ2xhc3M8Pz4gY2xhenopIHsKKyAgICAgICAgaWYgKGlzSmF4cnNSZXNvdXJjZShjbGF6eikpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChDbGFzczw/PiBpZmFjZSA6IGNsYXp6LmdldEludGVyZmFjZXMoKSkgeworICAgICAgICAgICAgaWYgKGlzSmF4cnNSZXNvdXJjZShpZmFjZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSmF4cnNSZXNvdXJjZShDbGFzczw/PiBjbGF6eikgeworICAgICAgICBpZiAoY2xhenouaXNBbm5vdGF0aW9uUHJlc2VudChQYXRoLmNsYXNzKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKE1ldGhvZCBtZXRob2QgOiBjbGF6ei5nZXRNZXRob2RzKCkpIHsKKyAgICAgICAgICAgIGlmIChtZXRob2QuaXNBbm5vdGF0aW9uUHJlc2VudChQYXRoLmNsYXNzKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKEFubm90YXRpb24gYW5ub3RhdGlvbiA6IG1ldGhvZC5nZXRBbm5vdGF0aW9ucygpKSB7CisgICAgICAgICAgICAgICAgaWYgKGFubm90YXRpb24uYW5ub3RhdGlvblR5cGUoKS5pc0Fubm90YXRpb25QcmVzZW50KEh0dHBNZXRob2QuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2luamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9iZWFuL0luc3RhbmNlQmVhbi5qYXZhIGIvaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL2JlYW4vSW5zdGFuY2VCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU1MGM1YwotLS0gL2Rldi9udWxsCisrKyBiL2luamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9iZWFuL0luc3RhbmNlQmVhbi5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0LmNkaS5zZS5iZWFuOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5zcGkuQ3JlYXRpb25hbENvbnRleHQ7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkluamVjdGlvblRhcmdldDsKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0Lkluc3RhbmNlQmluZGluZzsKKworLyoqCisgKiBDcmVhdGVzIGFuIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuQmVhbn0gaW50ZXJmYWNlIHVzaW5nIEplcnNleSdzIHtAbGluayBJbnN0YW5jZUJpbmRpbmd9LiBCaW5kaW5nCisgKiBwcm92aWRlcyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJlYW4gYWxzbyBjYWxsZWQge0BsaW5rIGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5CZWFuQXR0cmlidXRlc30gaW5mb3JtYXRpb24uCisgKiBUaGUge0Bjb2RlIEJlYW59IGRvZXMgbm90IHVzZSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0LmNkaS5zZS5pbmplY3Rvci5KZXJzZXlJbmplY3Rpb25UYXJnZXR9IGJlY2F1c2Ugc2VydmVzIGFscmVhZHkKKyAqIGNyZWF0ZWQgaW5zdGFuY2VzLCB0aGVyZWZvcmUgdGhlIGNyZWF0ZSBvcGVyYXRpb24ganVzdCByZXR1cm4gdGhlIHByb3ZpZGVkIGluc3RhbmNlIGFuZCBhdHRlbXB0IHRvIGluamVjdCB0aGUgcmVzdCBvZiB0aGUKKyAqIGZpZWxkcyBidXQgb21pdCBjb250ZXh0dWFsIG9wZXJhdGlvbnMgUHJvZHVjZSBhbmQgRGVzdHJveS4gQ2xpZW50IGhhcyB0byBtYW5hZ2UgdGhlIGluc3RhbmNlIGFsb25lLgorICogPHA+CisgKiBSZWdpc3RlciBleGFtcGxlOgorICogPHByZT4KKyAqIEFic3RyYWN0QmluZGVyIHsKKyAqICAgICAmIzY0O092ZXJyaWRlCisgKiAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICogICAgICAgICBiaW5kKG5ldyBNeUJlYW4oKSkKKyAqICAgICAgICAgICAgICAudG8oTXlCZWFuLmNsYXNzKSYjNTk7CisgKiAgICAgfQorICogfQorICogPC9wcmU+CisgKiBJbmplY3QgZXhhbXBsZToKKyAqIDxwcmU+CisgKiAgJiM2NDtQYXRoKCIvIikKKyAqICBwdWJsaWMgY2xhc3MgTXlSZXNvdXJjZSB7CisgKiAgICAmIzY0O0luamVjdAorICogICAgcHJpdmF0ZSBNeUJlYW4gbXlCZWFuJiM1OTsKKyAqICB9CisgKiA8L3ByZT4KKyAqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworY2xhc3MgSW5zdGFuY2VCZWFuPFQ+IGV4dGVuZHMgSmVyc2V5QmVhbjxUPiB7CisKKyAgICBwcml2YXRlIGZpbmFsIEluc3RhbmNlQmluZGluZzxUPiBiaW5kaW5nOworICAgIHByaXZhdGUgSW5qZWN0aW9uVGFyZ2V0PFQ+IGluamVjdGlvblRhcmdldDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgSmVyc2V5LXNwZWNpZmljIHtAbGluayBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuQmVhbn0gaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmluZGluZyB7QGxpbmsgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkJlYW5BdHRyaWJ1dGVzfSBwYXJ0IG9mIHRoZSBiZWFuLgorICAgICAqLworICAgIEluc3RhbmNlQmVhbihJbnN0YW5jZUJpbmRpbmc8VD4gYmluZGluZykgeworICAgICAgICBzdXBlcihiaW5kaW5nKTsKKyAgICAgICAgdGhpcy5iaW5kaW5nID0gYmluZGluZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGdldFNjb3BlKCkgeworICAgICAgICByZXR1cm4gU2luZ2xldG9uLmNsYXNzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUIGNyZWF0ZShDcmVhdGlvbmFsQ29udGV4dDxUPiBjb250ZXh0KSB7CisgICAgICAgIFQgc2VydmljZSA9IGJpbmRpbmcuZ2V0U2VydmljZSgpOworICAgICAgICB0aGlzLmluamVjdGlvblRhcmdldC5pbmplY3Qoc2VydmljZSwgY29udGV4dCk7CisgICAgICAgIHJldHVybiBzZXJ2aWNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDbGFzczw/PiBnZXRCZWFuQ2xhc3MoKSB7CisgICAgICAgIHJldHVybiBiaW5kaW5nLmdldFNlcnZpY2UoKS5nZXRDbGFzcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIExhenkgc2V0IG9mIGFuIGluamVjdGlvbiB0YXJnZXQgYmVjYXVzZSB0byBjcmVhdGUgZnVsbHkgZnVuY3Rpb25hbCBpbmplY3Rpb24gdGFyZ2V0IG5lZWRzIGFscmVhZHkgY3JlYXRlZCBiZWFuLgorICAgICAqCisgICAgICogQHBhcmFtIGluamVjdGlvblRhcmdldCB7QGxpbmsgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LnNwaS5Db250ZXh0dWFsfSBpbmZvcm1hdGlvbiBiZWxvbmdpbmcgdG8gdGhpcyBiZWFuLgorICAgICAqLworICAgIHZvaWQgc2V0SW5qZWN0aW9uVGFyZ2V0KEluamVjdGlvblRhcmdldDxUPiBpbmplY3Rpb25UYXJnZXQpIHsKKyAgICAgICAgdGhpcy5pbmplY3Rpb25UYXJnZXQgPSBpbmplY3Rpb25UYXJnZXQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL2JlYW4vSmVyc2V5QmVhbi5qYXZhIGIvaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL2JlYW4vSmVyc2V5QmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZDU3ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvYmVhbi9KZXJzZXlCZWFuLmphdmEKQEAgLTAsMCArMSwxNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0LmNkaS5zZS5iZWFuOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qcmlvcml0eTsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuRGVwZW5kZW50OworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5SZXF1ZXN0U2NvcGVkOworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5zcGkuQ3JlYXRpb25hbENvbnRleHQ7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3QuQW55OworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LkRlZmF1bHQ7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkJlYW47CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkluamVjdGlvblBvaW50OworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5QYXNzaXZhdGlvbkNhcGFibGU7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS51dGlsLkFubm90YXRpb25MaXRlcmFsOworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQmluZGluZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuUGVyTG9va3VwOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5QZXJUaHJlYWQ7CisKK2ltcG9ydCBvcmcuamJvc3Mud2VsZC5lbnZpcm9ubWVudC5zZS5jb250ZXh0cy5UaHJlYWRTY29wZWQ7CisKKy8qKgorICogSmVyc2V5LXNwZWNpZmljIGFic3RyYWN0IGNsYXNzIHdoaWNoIGltcGxlbWVudHMge0BsaW5rIEJlYW59IGludGVyZmFjZS4gQ2xhc3MgcGFydGljdWxhcmx5IGNvbnRhaW5zIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zCisgKiBvZiB7QGxpbmsgQmVhbn0gaW50ZXJmYWNlLgorICoKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgSmVyc2V5QmVhbjxUPiBpbXBsZW1lbnRzIEJlYW48VD4sIFBhc3NpdmF0aW9uQ2FwYWJsZSB7CisKKyAgICBzdGF0aWMgZmluYWwgU2V0PEFubm90YXRpb24+IERFRkFVTFRfUVVBTElGSUVSUzsKKworICAgIHN0YXRpYyB7CisgICAgICAgIERFRkFVTFRfUVVBTElGSUVSUyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgREVGQVVMVF9RVUFMSUZJRVJTLmFkZChuZXcgQW5ub3RhdGlvbkxpdGVyYWw8RGVmYXVsdD4oKSB7fSk7CisgICAgICAgIERFRkFVTFRfUVVBTElGSUVSUy5hZGQobmV3IEFubm90YXRpb25MaXRlcmFsPEFueT4oKSB7fSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBCaW5kaW5nPFQsID8+IGJpbmRpbmc7CisKKyAgICAvKioKKyAgICAgKiBKZXJzZXlCZWFuIGNvbnN0cnVjdG9yIHdpdGgge0BsaW5rIEJpbmRpbmd9IHdoaWNoIHJlcHJlc2VudHMge0BsaW5rIGphdmF4LmVudGVycHJpc2UuY29udGV4dC5zcGkuQ29udGV4dHVhbH0gcGFydCBvZiB0aGUKKyAgICAgKiBiZWFuLgorICAgICAqCisgICAgICogQHBhcmFtIGJpbmRpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJlYW4uCisgICAgICovCisgICAgSmVyc2V5QmVhbihCaW5kaW5nPFQsID8+IGJpbmRpbmcpIHsKKyAgICAgICAgdGhpcy5iaW5kaW5nID0gYmluZGluZzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2Zvcm1zIEplcnNleSBzY29wZXMvYW5ub3RhdGlvbnMgdG8gSEsyIGVxdWl2YWxlbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIHNjb3BlIEplcnNleSBzY29wZS9hbm5vdGF0aW9uLgorICAgICAqIEByZXR1cm4gSEsyIGVxdWl2YWxlbnQgc2NvcGUvYW5ub3RhdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiB0cmFuc2Zvcm1TY29wZShDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gc2NvcGUpIHsKKyAgICAgICAgaWYgKHNjb3BlID09IFBlckxvb2t1cC5jbGFzcykgeworICAgICAgICAgICAgcmV0dXJuIERlcGVuZGVudC5jbGFzczsKKyAgICAgICAgfSBlbHNlIGlmIChzY29wZSA9PSBQZXJUaHJlYWQuY2xhc3MpIHsKKyAgICAgICAgICAgIHJldHVybiBUaHJlYWRTY29wZWQuY2xhc3M7CisgICAgICAgIH0gZWxzZSBpZiAoc2NvcGUgPT0gb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5pbnRlcm5hbC5SZXF1ZXN0U2NvcGVkLmNsYXNzKSB7CisgICAgICAgICAgICByZXR1cm4gUmVxdWVzdFNjb3BlZC5jbGFzczsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2NvcGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxUeXBlPiBnZXRUeXBlcygpIHsKKyAgICAgICAgU2V0PFR5cGU+IGNvbnRyYWN0cyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgY29udHJhY3RzLmFkZEFsbChiaW5kaW5nLmdldENvbnRyYWN0cygpKTsKKworICAgICAgICAvLyBNZXJnZSBhbGlhc2VzIHdpdGggdGhlIG1haW4gYmVhbgorICAgICAgICBpZiAoIWJpbmRpbmcuZ2V0QWxpYXNlcygpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgYmluZGluZy5nZXRBbGlhc2VzKCkuZm9yRWFjaChhbGlhcyAtPiBjb250cmFjdHMuYWRkKGFsaWFzLmdldENvbnRyYWN0KCkpKTsKKyAgICAgICAgfQorICAgICAgICBjb250cmFjdHMuYWRkKE9iamVjdC5jbGFzcyk7CisgICAgICAgIHJldHVybiBjb250cmFjdHM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxBbm5vdGF0aW9uPiBnZXRRdWFsaWZpZXJzKCkgeworICAgICAgICBTZXQ8QW5ub3RhdGlvbj4gcXVhbGlmaWVycyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgcXVhbGlmaWVycy5hZGRBbGwoREVGQVVMVF9RVUFMSUZJRVJTKTsKKyAgICAgICAgaWYgKGJpbmRpbmcuZ2V0UXVhbGlmaWVycygpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHF1YWxpZmllcnMuYWRkQWxsKGJpbmRpbmcuZ2V0UXVhbGlmaWVycygpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE1lcmdlIGFsaWFzZXMgd2l0aCB0aGUgbWFpbiBiZWFuCisgICAgICAgIGlmICghYmluZGluZy5nZXRBbGlhc2VzKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBiaW5kaW5nLmdldEFsaWFzZXMoKS5mb3JFYWNoKGFsaWFzIC0+IHF1YWxpZmllcnMuYWRkQWxsKGFsaWFzLmdldFF1YWxpZmllcnMoKSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBxdWFsaWZpZXJzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGJpbmRpbmcuZ2V0TmFtZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gZ2V0U2NvcGUoKSB7CisgICAgICAgIHJldHVybiBTaW5nbGV0b24uY2xhc3M7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4+IGdldFN0ZXJlb3R5cGVzKCkgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FsdGVybmF0aXZlKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNOdWxsYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koVCBpbnN0YW5jZSwgQ3JlYXRpb25hbENvbnRleHQ8VD4gY3JlYXRpb25hbENvbnRleHQpIHsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PEluamVjdGlvblBvaW50PiBnZXRJbmplY3Rpb25Qb2ludHMoKSB7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0UmFuaygpIHsKKyAgICAgICAgaWYgKGJpbmRpbmcuZ2V0UmFuaygpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBiaW5kaW5nLmdldFJhbmsoKTsKKyAgICAgICAgfQorCisgICAgICAgIENsYXNzPFQ+IHR5cGUgPSBiaW5kaW5nLmdldEltcGxlbWVudGF0aW9uVHlwZSgpOworICAgICAgICBpZiAodHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICBQcmlvcml0eSBwcmlvcml0eSA9IHR5cGUuZ2V0QW5ub3RhdGlvbihQcmlvcml0eS5jbGFzcyk7CisgICAgICAgICAgICBpZiAocHJpb3JpdHkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBwcmlvcml0eS52YWx1ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENsYXNzPD8+IGdldEJlYW5DbGFzcygpIHsKKyAgICAgICAgcmV0dXJuIE9iamVjdC5jbGFzczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgeworICAgICAgICByZXR1cm4gZ2V0QmVhbkNsYXNzKCkuZ2V0VHlwZU5hbWUoKSArICIjamVyc2V5IjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvYmVhbi9TdXBwbGllckJlYW5CcmlkZ2UuamF2YSBiL2luamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9iZWFuL1N1cHBsaWVyQmVhbkJyaWRnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMDg0NzgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvYmVhbi9TdXBwbGllckJlYW5CcmlkZ2UuamF2YQpAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuY2RpLnNlLmJlYW47CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlBhcmFtZXRlcml6ZWRUeXBlOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLklkZW50aXR5SGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LkRlcGVuZGVudDsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuc3BpLkNyZWF0aW9uYWxDb250ZXh0OworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5CZWFuOworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5CZWFuTWFuYWdlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5jZGkuc2UuUGFyYW1ldGVyaXplZFR5cGVJbXBsOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5EaXNwb3NhYmxlU3VwcGxpZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LlN1cHBsaWVyQ2xhc3NCaW5kaW5nOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5TdXBwbGllckluc3RhbmNlQmluZGluZzsKKworLyoqCisgKiBDcmVhdGVzIGFuIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuQmVhbn0gaW50ZXJmYWNlIHVzaW5nIEplcnNleSdzIHtAbGluayBTdXBwbGllckluc3RhbmNlQmluZGluZ30uCisgKiBCaW5kaW5nIHByb3ZpZGVzIHRoZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYmVhbiBhbHNvIGNhbGxlZCB7QGxpbmsgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkJlYW5BdHRyaWJ1dGVzfSBpbmZvcm1hdGlvbi4KKyAqIFRoZSB7QGNvZGUgQmVhbn0gZG9lcyBub3QgdXNlIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuY2RpLnNlLmluamVjdG9yLkplcnNleUluamVjdGlvblRhcmdldH0gYmVjYXVzZSBzZXJ2ZXMgYWxyZWFkeQorICogdGhlIGluc3RhbmNlcyBjcmVhdGVkIGJ5IHVuZGVybHlpbmcge0BsaW5rIFN1cHBsaWVyfSBpbmplY3RlZCB0YXJnZXQgb24gd2hpY2ggdGhlIGNhbGwgaXMgZGVsZWdhdGVkLgorICogPHA+CisgKiBUaGlzIGltcGxlbWVudGF0aW9uIHdvcmtzIGFzIGJyaWRnZSBiZXR3ZWVuIHtAbGluayBTdXBwbGllcn0gYW5kIGl0cyBwcm92aWRlZCB2YWx1ZS4gVGhpcyBzb2x2ZXMgdGhlIGNhc2Ugd2hlbiB0aGUgY29uY3JldGUKKyAqIHR5cGUgb2Ygc3VwcGxpZXIgdmFsdWUgaXMgZmV0Y2hlZCBmcm9tIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcn0gdGhlbiB0aGlzCisgKiB7QGxpbmsgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkJlYW59IGltcGxlbWVudGF0aW9uIGp1c3QgaW52b2tlcyB7QGxpbmsgU3VwcGxpZXIjZ2V0fSBtZXRob2Qgb24gdW5kZXJseWluZy9yZWdpc3RlcmVkCisgKiBzdXBwbGllci4KKyAqIDxwPgorICogSW5qZWN0IGV4YW1wbGU6CisgKiA8cHJlPgorICogQWJzdHJhY3RCaW5kZXIgeworICogICAgICYjNjQ7T3ZlcnJpZGUKKyAqICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgKiAgICAgICAgIGJpbmRGYWN0b3J5KE15QmVhbkZhY3RvcnkuY2xhc3MpCisgKiAgICAgICAgICAgICAgLnRvKE15QmVhbi5jbGFzcykKKyAqICAgICAgICAgICAgICAuaW4oU2luZ2xldG9uLmNsYXNzKSYjNTk7CisgKiAgICAgfQorICogfQorICogPC9wcmU+CisgKiBSZWdpc3RlciBleGFtcGxlOgorICogPHByZT4KKyAqICAmIzY0O1BhdGgoIi8iKQorICogIHB1YmxpYyBjbGFzcyBNeVJlc291cmNlIHsKKyAqICAgICYjNjQ7SW5qZWN0CisgKiAgICBwcml2YXRlIE15QmVhbiBteUJlYW4mIzU5OworICogIH0KKyAqIDwvcHJlPgorICoKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitjbGFzcyBTdXBwbGllckJlYW5CcmlkZ2UgZXh0ZW5kcyBKZXJzZXlCZWFuPE9iamVjdD4geworCisgICAgcHJpdmF0ZSBmaW5hbCBCZWFuTWFuYWdlciBiZWFuTWFuYWdlcjsKKyAgICBwcml2YXRlIFBhcmFtZXRlcml6ZWRUeXBlIHR5cGU7CisgICAgcHJpdmF0ZSBib29sZWFuIGRpc3Bvc2FibGU7CisgICAgcHJpdmF0ZSBTdXBwbGllckNsYXNzQmluZGluZyBiaW5kaW5nOworCisgICAgLy8gVGhpcyBicmlkZ2UgY2FuIGNyZWF0ZSBtdWx0aXBsZSBpbnN0YW5jZXMgdXNpbmcgdGhlIG1ldGhvZCAncHJvdmlkZScgdGhlcmVmb3JlIG11c3QgbWFwIGNyZWF0ZWQgc3VwcGxpZXJzIGJlY2F1c2Ugb2YKKyAgICAvLyAnZGlzcG9zZScgaW52b2NhdGlvbiBsYXRlciBvbi4KKyAgICAvLyBUT0RPOiBLZXkgYXMgYSBXZWFrUmVmZXJlbmNlIC0gcHJldmVudCBvYmplY3RzIGluIHNjb3BlIHdoaWNoIG5ldmVyIGRpc3Bvc2UgdGhlIG9iamVjdHMgc3VjaCBhcyBQZXJMb29rdXAuCisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8T2JqZWN0LCBEaXNwb3NhYmxlU3VwcGxpZXI8T2JqZWN0Pj4gZGlzcG9zYWJsZVN1cHBsaWVycyA9IG5ldyBJZGVudGl0eUhhc2hNYXA8PigpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBKZXJzZXktc3BlY2lmaWMge0BsaW5rIGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5CZWFufSBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiaW5kaW5nIHtAbGluayBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuQmVhbkF0dHJpYnV0ZXN9IHBhcnQgb2YgdGhlIGJlYW4uCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgU3VwcGxpZXJCZWFuQnJpZGdlKFN1cHBsaWVyQ2xhc3NCaW5kaW5nIGJpbmRpbmcsIEJlYW5NYW5hZ2VyIGJlYW5NYW5hZ2VyKSB7CisgICAgICAgIHN1cGVyKGJpbmRpbmcpOworCisgICAgICAgIC8vIFJlZ2lzdGVyIHdyYXBwZXIgZm9yIGZhY3RvcnkgZnVuY3Rpb25hbGl0eSwgd3JhcHBlciBhdXRvbWF0aWNhbGx5IGNhbGwgc2VydmljZSBsb2NhdG9yIHdoaWNoIGlzIGFibGUgdG8gcmV0cmlldmUKKyAgICAgICAgLy8gdGhlIHNlcnZpY2UgaW4gdGhlIHByb3BlciBjb250ZXh0IGFuZCBzY29wZS4gQnJpZGdlIGlzIHJlZ2lzdGVyZWQgZm9yIGFsbCBjb250cmFjdHMgYnV0IGlzIGFibGUgdG8gbG9va3VwIGZyb20KKyAgICAgICAgLy8gc2VydmljZSBsb2NhdG9yIG9ubHkgdXNpbmcgdGhlIGZpcnN0IGNvbnRyYWN0LgorICAgICAgICBUeXBlIGNvbnRyYWN0ID0gbnVsbDsKKyAgICAgICAgaWYgKGJpbmRpbmcuZ2V0Q29udHJhY3RzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIGNvbnRyYWN0ID0gKFR5cGUpIGJpbmRpbmcuZ2V0Q29udHJhY3RzKCkuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmJpbmRpbmcgPSBiaW5kaW5nOworICAgICAgICB0aGlzLmJlYW5NYW5hZ2VyID0gYmVhbk1hbmFnZXI7CisgICAgICAgIHRoaXMuZGlzcG9zYWJsZSA9IERpc3Bvc2FibGVTdXBwbGllci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGJpbmRpbmcuZ2V0U3VwcGxpZXJDbGFzcygpKTsKKyAgICAgICAgdGhpcy50eXBlID0gbmV3IFBhcmFtZXRlcml6ZWRUeXBlSW1wbChTdXBwbGllci5jbGFzcywgY29udHJhY3QpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlKENyZWF0aW9uYWxDb250ZXh0IGNyZWF0aW9uYWxDb250ZXh0KSB7CisgICAgICAgIGlmICh0eXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN1cHBsaWVyPD8+IHN1cHBsaWVyID0gZ2V0U3VwcGxpZXIoYmVhbk1hbmFnZXIsIHR5cGUpOworICAgICAgICAgICAgT2JqZWN0IGluc3RhbmNlID0gc3VwcGxpZXIuZ2V0KCk7CisgICAgICAgICAgICBpZiAoZGlzcG9zYWJsZSkgeworICAgICAgICAgICAgICAgIGRpc3Bvc2FibGVTdXBwbGllcnMucHV0KGluc3RhbmNlLCAoRGlzcG9zYWJsZVN1cHBsaWVyKSBzdXBwbGllcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koT2JqZWN0IGluc3RhbmNlLCBDcmVhdGlvbmFsQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGlmIChkaXNwb3NhYmxlKSB7CisgICAgICAgICAgICBEaXNwb3NhYmxlU3VwcGxpZXIgZGlzcG9zYWJsZVN1cHBsaWVyID0gZGlzcG9zYWJsZVN1cHBsaWVycy5nZXQoaW5zdGFuY2UpOworICAgICAgICAgICAgZGlzcG9zYWJsZVN1cHBsaWVyLmRpc3Bvc2UoaW5zdGFuY2UpOworICAgICAgICAgICAgZGlzcG9zYWJsZVN1cHBsaWVycy5yZW1vdmUoaW5zdGFuY2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3VwcGxpZXI8Pz4gZ2V0U3VwcGxpZXIoQmVhbk1hbmFnZXIgYmVhbk1hbmFnZXIsIFBhcmFtZXRlcml6ZWRUeXBlIHN1cHBsaWVyVHlwZSkgeworICAgICAgICBTZXQ8QmVhbjw/Pj4gYmVhbnMgPSBiZWFuTWFuYWdlci5nZXRCZWFucyhzdXBwbGllclR5cGUpOworICAgICAgICBpZiAoYmVhbnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEJlYW48Pz4gYmVhbiA9IGJlYW5zLml0ZXJhdG9yKCkubmV4dCgpOworICAgICAgICBDcmVhdGlvbmFsQ29udGV4dDw/PiBjdHggPSBiZWFuTWFuYWdlci5jcmVhdGVDcmVhdGlvbmFsQ29udGV4dChiZWFuKTsKKyAgICAgICAgcmV0dXJuIChTdXBwbGllcjw/PikgYmVhbk1hbmFnZXIuZ2V0UmVmZXJlbmNlKGJlYW4sIHN1cHBsaWVyVHlwZSwgY3R4KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGdldFNjb3BlKCkgeworICAgICAgICByZXR1cm4gYmluZGluZy5nZXRTY29wZSgpID09IG51bGwgPyBEZXBlbmRlbnQuY2xhc3MgOiB0cmFuc2Zvcm1TY29wZShiaW5kaW5nLmdldFNjb3BlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2luamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9iZWFuL1N1cHBsaWVyQ2xhc3NCZWFuLmphdmEgYi9pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvYmVhbi9TdXBwbGllckNsYXNzQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiOTQ2NGUKLS0tIC9kZXYvbnVsbAorKysgYi9pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvYmVhbi9TdXBwbGllckNsYXNzQmVhbi5qYXZhCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5jZGkuc2UuYmVhbjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5EZXBlbmRlbnQ7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LnNwaS5DcmVhdGlvbmFsQ29udGV4dDsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuSW5qZWN0aW9uVGFyZ2V0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0LmNkaS5zZS5QYXJhbWV0ZXJpemVkVHlwZUltcGw7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0LmNkaS5zZS5pbmplY3Rvci5KZXJzZXlJbmplY3Rpb25UYXJnZXQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkRpc3Bvc2FibGVTdXBwbGllcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuU3VwcGxpZXJDbGFzc0JpbmRpbmc7CisKKy8qKgorICogQ3JlYXRlcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkJlYW59IGludGVyZmFjZSB1c2luZyBKZXJzZXkncyB7QGxpbmsgU3VwcGxpZXJDbGFzc0JpbmRpbmd9LgorICogQmluZGluZyBwcm92aWRlcyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJlYW4gYWxzbyBjYWxsZWQge0BsaW5rIGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5CZWFuQXR0cmlidXRlc30gaW5mb3JtYXRpb24gYW5kCisgKiB7QGxpbmsgSmVyc2V5SW5qZWN0aW9uVGFyZ2V0fSBwcm92aWRlcyB0aGUgY29udGV4dHVhbCBwYXJ0IG9mIHRoZSBiZWFuIGJlY2F1c2UgaW1wbGVtZW50cworICoge0BsaW5rIGphdmF4LmVudGVycHJpc2UuY29udGV4dC5zcGkuQ29udGV4dHVhbH0gd2l0aCBKZXJzZXkgaW5qZWN0aW9uIGV4dGVuc2lvbiAoaXMgYWJsZSB0byBpbmplY3QgaW50byBKQVgtUlMvSmVyc2V5IHNwZWNpZmllZAorICogYW5ub3RhdGlvbikuCisgKiA8cD4KKyAqIEJlYW4ncyBpbXBsZW1lbnRhdGlvbiBwcm92aWRlcyBwb3NzaWJpbGl0eSB0byByZWdpc3RlciB7QGxpbmsgU3VwcGxpZXJ9IGFuZCB7QGxpbmsgRGlzcG9zYWJsZVN1cHBsaWVyfS4KKyAqIDxwPgorICogSW5qZWN0IGV4YW1wbGU6CisgKiA8cHJlPgorICogQWJzdHJhY3RCaW5kZXIgeworICogICAgICYjNjQ7T3ZlcnJpZGUKKyAqICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgKiAgICAgICAgIGJpbmRGYWN0b3J5KE15QmVhblN1cHBsaWVyLmNsYXNzKQorICogICAgICAgICAgICAgIC50byhNeUJlYW4uY2xhc3MpCisgKiAgICAgICAgICAgICAgLmluKFNpbmdsZXRvbi5jbGFzcykmIzU5OworICogICAgIH0KKyAqIH0KKyAqIDwvcHJlPgorICogUmVnaXN0ZXIgZXhhbXBsZToKKyAqIDxwcmU+CisgKiAgJiM2NDtQYXRoKCIvIikKKyAqICBwdWJsaWMgY2xhc3MgTXlSZXNvdXJjZSB7CisgKiAgICAmIzY0O0luamVjdAorICogICAgcHJpdmF0ZSBTdXBwbGllciZsdDtNeUJlYW4mZ3Q7IG15QmVhbiYjNTk7CisgKiAgfQorICogPC9wcmU+CisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK2NsYXNzIFN1cHBsaWVyQ2xhc3NCZWFuPFQ+IGV4dGVuZHMgSmVyc2V5QmVhbjxTdXBwbGllcjxUPj4geworCisgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8VHlwZT4gY29udHJhY3RzID0gbmV3IEhhc2hTZXQ8PigpOworICAgIHByaXZhdGUgZmluYWwgQ2xhc3M8PyBleHRlbmRzIFN1cHBsaWVyPFQ+PiBzdXBwbGllckNsYXNzOworICAgIHByaXZhdGUgZmluYWwgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IHN1cHBsaWVyU2NvcGU7CisgICAgcHJpdmF0ZSBJbmplY3Rpb25UYXJnZXQ8U3VwcGxpZXI8VD4+IGluamVjdGlvblRhcmdldDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgSmVyc2V5LXNwZWNpZmljIHtAbGluayBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuQmVhbn0gaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmluZGluZyB7QGxpbmsgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkJlYW5BdHRyaWJ1dGVzfSBwYXJ0IG9mIHRoZSBiZWFuLgorICAgICAqLworICAgIFN1cHBsaWVyQ2xhc3NCZWFuKFN1cHBsaWVyQ2xhc3NCaW5kaW5nPFQ+IGJpbmRpbmcpIHsKKyAgICAgICAgc3VwZXIoYmluZGluZyk7CisgICAgICAgIHRoaXMuc3VwcGxpZXJDbGFzcyA9IGJpbmRpbmcuZ2V0U3VwcGxpZXJDbGFzcygpOworICAgICAgICB0aGlzLnN1cHBsaWVyU2NvcGUgPSBiaW5kaW5nLmdldFN1cHBsaWVyU2NvcGUoKTsKKworICAgICAgICBmb3IgKFR5cGUgY29udHJhY3QgOiBiaW5kaW5nLmdldENvbnRyYWN0cygpKSB7CisgICAgICAgICAgICB0aGlzLmNvbnRyYWN0cy5hZGQobmV3IFBhcmFtZXRlcml6ZWRUeXBlSW1wbChTdXBwbGllci5jbGFzcywgY29udHJhY3QpKTsKKyAgICAgICAgICAgIGlmIChEaXNwb3NhYmxlU3VwcGxpZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShzdXBwbGllckNsYXNzKSkgeworICAgICAgICAgICAgICAgIHRoaXMuY29udHJhY3RzLmFkZChuZXcgUGFyYW1ldGVyaXplZFR5cGVJbXBsKERpc3Bvc2FibGVTdXBwbGllci5jbGFzcywgY29udHJhY3QpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gZ2V0U2NvcGUoKSB7CisgICAgICAgIHJldHVybiBzdXBwbGllclNjb3BlID09IG51bGwgPyBEZXBlbmRlbnQuY2xhc3MgOiB0cmFuc2Zvcm1TY29wZShzdXBwbGllclNjb3BlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PFR5cGU+IGdldFR5cGVzKCkgeworICAgICAgICByZXR1cm4gY29udHJhY3RzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdXBwbGllcjxUPiBjcmVhdGUoQ3JlYXRpb25hbENvbnRleHQ8U3VwcGxpZXI8VD4+IGNvbnRleHQpIHsKKyAgICAgICAgU3VwcGxpZXI8VD4gaW5zdGFuY2UgPSBpbmplY3Rpb25UYXJnZXQucHJvZHVjZShjb250ZXh0KTsKKyAgICAgICAgaW5qZWN0aW9uVGFyZ2V0LmluamVjdChpbnN0YW5jZSwgY29udGV4dCk7CisgICAgICAgIGluamVjdGlvblRhcmdldC5wb3N0Q29uc3RydWN0KGluc3RhbmNlKTsKKyAgICAgICAgcmV0dXJuIGluc3RhbmNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koU3VwcGxpZXI8VD4gaW5zdGFuY2UsIENyZWF0aW9uYWxDb250ZXh0PFN1cHBsaWVyPFQ+PiBjb250ZXh0KSB7CisgICAgICAgIGluamVjdGlvblRhcmdldC5wcmVEZXN0cm95KGluc3RhbmNlKTsKKyAgICAgICAgaW5qZWN0aW9uVGFyZ2V0LmRpc3Bvc2UoaW5zdGFuY2UpOworICAgICAgICBjb250ZXh0LnJlbGVhc2UoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0QmVhbkNsYXNzKCkgeworICAgICAgICByZXR1cm4gc3VwcGxpZXJDbGFzczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMYXp5IHNldCBvZiBhbiBpbmplY3Rpb24gdGFyZ2V0IGJlY2F1c2UgdG8gY3JlYXRlIGZ1bGx5IGZ1bmN0aW9uYWwgaW5qZWN0aW9uIHRhcmdldCBuZWVkcyBhbHJlYWR5IGNyZWF0ZWQgYmVhbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmplY3Rpb25UYXJnZXQge0BsaW5rIGphdmF4LmVudGVycHJpc2UuY29udGV4dC5zcGkuQ29udGV4dHVhbH0gaW5mb3JtYXRpb24gYmVsb25naW5nIHRvIHRoaXMgYmVhbi4KKyAgICAgKi8KKyAgICB2b2lkIHNldEluamVjdGlvblRhcmdldChJbmplY3Rpb25UYXJnZXQ8U3VwcGxpZXI8VD4+IGluamVjdGlvblRhcmdldCkgeworICAgICAgICB0aGlzLmluamVjdGlvblRhcmdldCA9IGluamVjdGlvblRhcmdldDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvYmVhbi9TdXBwbGllckluc3RhbmNlQmVhbi5qYXZhIGIvaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL2JlYW4vU3VwcGxpZXJJbnN0YW5jZUJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODRjZjI4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL2JlYW4vU3VwcGxpZXJJbnN0YW5jZUJlYW4uamF2YQpAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuY2RpLnNlLmJlYW47CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuc3BpLkNyZWF0aW9uYWxDb250ZXh0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0LmNkaS5zZS5QYXJhbWV0ZXJpemVkVHlwZUltcGw7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkRpc3Bvc2FibGVTdXBwbGllcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuU3VwcGxpZXJJbnN0YW5jZUJpbmRpbmc7CisKKy8qKgorICogQ3JlYXRlcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkJlYW59IGludGVyZmFjZSB1c2luZyBKZXJzZXkncyB7QGxpbmsgU3VwcGxpZXJJbnN0YW5jZUJpbmRpbmd9LgorICogQmluZGluZyBwcm92aWRlcyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJlYW4gYWxzbyBjYWxsZWQge0BsaW5rIGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5CZWFuQXR0cmlidXRlc30gaW5mb3JtYXRpb24uCisgKiBUaGUge0Bjb2RlIEJlYW59IGRvZXMgbm90IHVzZSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0LmNkaS5zZS5pbmplY3Rvci5KZXJzZXlJbmplY3Rpb25UYXJnZXR9IGJlY2F1c2Ugc2VydmVzIGFscmVhZHkKKyAqIGNyZWF0ZWQgc3VwcGxpZXIgaW5zdGFuY2UsIHRoZXJlZm9yZSB0aGUgY3JlYXRlIG9wZXJhdGlvbiBqdXN0IHJldHVybiBwcm92aWRlZCBpbnN0YW5jZSB3aXRob3V0IGFueSBvdGhlciBjb250ZXh0dWFsIG9wZXJhdGlvbgorICogKHByb2R1Y2UsIGluamVjdCwgZGVzdHJveSkuIENsaWVudCBoYXMgdG8gbWFuYWdlIHRoZSBpbnN0YW5jZSBhbG9uZS4KKyAqIDxwPgorICogSW5qZWN0IGV4YW1wbGU6CisgKiA8cHJlPgorICogQWJzdHJhY3RCaW5kZXIgeworICogICAgICYjNjQ7T3ZlcnJpZGUKKyAqICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgKiAgICAgICAgIGJpbmRGYWN0b3J5KG5ldyBNeUJlYW5GYWN0b3J5KCkpCisgKiAgICAgICAgICAgICAgLnRvKE15QmVhbi5jbGFzcykKKyAqICAgICAgICAgICAgICAuaW4oU2luZ2xldG9uLmNsYXNzKSYjNTk7CisgKiAgICAgfQorICogfQorICogPC9wcmU+CisgKiBSZWdpc3RlciBleGFtcGxlOgorICogPHByZT4KKyAqICAmIzY0O1BhdGgoIi8iKQorICogIHB1YmxpYyBjbGFzcyBNeVJlc291cmNlIHsKKyAqICAgICYjNjQ7SW5qZWN0CisgKiAgICBwcml2YXRlIFN1cHBsaWVyJmx0O015QmVhbiZndDsgbXlCZWFuJiM1OTsKKyAqICB9CisgKiA8L3ByZT4KKyAqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworY2xhc3MgU3VwcGxpZXJJbnN0YW5jZUJlYW48VD4gZXh0ZW5kcyBKZXJzZXlCZWFuPFN1cHBsaWVyPFQ+PiB7CisKKyAgICBwcml2YXRlIGZpbmFsIFNldDxUeXBlPiBjb250cmFjdHMgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBTdXBwbGllcjxUPiBzdXBwbGllcjsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgSmVyc2V5LXNwZWNpZmljIHtAbGluayBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuQmVhbn0gaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmluZGluZyB7QGxpbmsgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkJlYW5BdHRyaWJ1dGVzfSBwYXJ0IG9mIHRoZSBiZWFuLgorICAgICAqLworICAgIFN1cHBsaWVySW5zdGFuY2VCZWFuKFN1cHBsaWVySW5zdGFuY2VCaW5kaW5nPFQ+IGJpbmRpbmcpIHsKKyAgICAgICAgc3VwZXIoYmluZGluZyk7CisgICAgICAgIHRoaXMuc3VwcGxpZXIgPSBiaW5kaW5nLmdldFN1cHBsaWVyKCk7CisKKyAgICAgICAgZm9yIChUeXBlIGNvbnRyYWN0OiBiaW5kaW5nLmdldENvbnRyYWN0cygpKSB7CisgICAgICAgICAgICB0aGlzLmNvbnRyYWN0cy5hZGQobmV3IFBhcmFtZXRlcml6ZWRUeXBlSW1wbChTdXBwbGllci5jbGFzcywgY29udHJhY3QpKTsKKyAgICAgICAgICAgIGlmIChEaXNwb3NhYmxlU3VwcGxpZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShiaW5kaW5nLmdldFN1cHBsaWVyKCkuZ2V0Q2xhc3MoKSkpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmNvbnRyYWN0cy5hZGQobmV3IFBhcmFtZXRlcml6ZWRUeXBlSW1wbChEaXNwb3NhYmxlU3VwcGxpZXIuY2xhc3MsIGNvbnRyYWN0KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PFR5cGU+IGdldFR5cGVzKCkgeworICAgICAgICByZXR1cm4gY29udHJhY3RzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8QW5ub3RhdGlvbj4gZ2V0UXVhbGlmaWVycygpIHsKKyAgICAgICAgcmV0dXJuIERFRkFVTFRfUVVBTElGSUVSUzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3VwcGxpZXI8VD4gY3JlYXRlKENyZWF0aW9uYWxDb250ZXh0PFN1cHBsaWVyPFQ+PiBjb250ZXh0KSB7CisgICAgICAgIHJldHVybiBzdXBwbGllcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0QmVhbkNsYXNzKCkgeworICAgICAgICByZXR1cm4gc3VwcGxpZXIuZ2V0Q2xhc3MoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvYmVhbi9TdXBwbGllckluc3RhbmNlQmVhbkJyaWRnZS5qYXZhIGIvaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL2JlYW4vU3VwcGxpZXJJbnN0YW5jZUJlYW5CcmlkZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDU2ODJlCi0tLSAvZGV2L251bGwKKysrIGIvaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL2JlYW4vU3VwcGxpZXJJbnN0YW5jZUJlYW5CcmlkZ2UuamF2YQpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuY2RpLnNlLmJlYW47CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5EZXBlbmRlbnQ7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LnNwaS5DcmVhdGlvbmFsQ29udGV4dDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5EaXNwb3NhYmxlU3VwcGxpZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LlN1cHBsaWVySW5zdGFuY2VCaW5kaW5nOworCisvKioKKyAqIENyZWF0ZXMgYW4gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5CZWFufSBpbnRlcmZhY2UgdXNpbmcgSmVyc2V5J3Mge0BsaW5rIFN1cHBsaWVySW5zdGFuY2VCaW5kaW5nfS4KKyAqIEJpbmRpbmcgcHJvdmlkZXMgdGhlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBiZWFuIGFsc28gY2FsbGVkIHtAbGluayBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuQmVhbkF0dHJpYnV0ZXN9IGluZm9ybWF0aW9uLgorICogVGhlIHtAY29kZSBCZWFufSBkb2VzIG5vdCB1c2Uge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5jZGkuc2UuaW5qZWN0b3IuSmVyc2V5SW5qZWN0aW9uVGFyZ2V0fSBiZWNhdXNlIHNlcnZlcyBhbHJlYWR5CisgKiBjcmVhdGVkIGluc3RhbmNlcywgdGhlcmVmb3JlIHRoZSBjcmVhdGUgb3BlcmF0aW9uIGp1c3QgcmV0dXJuIHByb3ZpZGVkIGluc3RhbmNlIHdpdGhvdXQgYW55IG90aGVyIGNvbnRleHR1YWwgb3BlcmF0aW9uCisgKiAocHJvZHVjZSwgaW5qZWN0LCBkZXN0cm95KS4gQ2xpZW50IGhhcyB0byBtYW5hZ2UgdGhlIGluc3RhbmNlIGFsb25lLgorICogPHA+CisgKiBUaGlzIGltcGxlbWVudGF0aW9uIHdvcmtzIGFzIGJyaWRnZSBiZXR3ZWVuIHtAbGluayBTdXBwbGllcn0gYW5kIGl0cyBwcm92aWRlZCB2YWx1ZS4gVGhpcyBzb2x2ZXMgdGhlIGNhc2Ugd2hlbiB0aGUgY29uY3JldGUKKyAqIHR5cGUgb2Ygc3VwcGxpZXIgdmFsdWUgaXMgZmV0Y2hlZCBmcm9tIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcn0gdGhlbiB0aGlzCisgKiB7QGxpbmsgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkJlYW59IGltcGxlbWVudGF0aW9uIGp1c3QgaW52b2tlcyB7QGxpbmsgU3VwcGxpZXIjZ2V0fSBtZXRob2Qgb24gdW5kZXJseWluZy9yZWdpc3RlcmVkCisgKiBzdXBwbGllci4KKyAqIDxwPgorICogSW5qZWN0IGV4YW1wbGU6CisgKiA8cHJlPgorICogQWJzdHJhY3RCaW5kZXIgeworICogICAgICYjNjQ7T3ZlcnJpZGUKKyAqICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgKiAgICAgICAgIGJpbmRGYWN0b3J5KG5ldyBNeUJlYW5GYWN0b3J5KCkpCisgKiAgICAgICAgICAgICAgLnRvKE15QmVhbi5jbGFzcykKKyAqICAgICAgICAgICAgICAuaW4oU2luZ2xldG9uLmNsYXNzKSYjNTk7CisgKiAgICAgfQorICogfQorICogPC9wcmU+CisgKiBSZWdpc3RlciBleGFtcGxlOgorICogPHByZT4KKyAqICAmIzY0O1BhdGgoIi8iKQorICogIHB1YmxpYyBjbGFzcyBNeVJlc291cmNlIHsKKyAqICAgICYjNjQ7SW5qZWN0CisgKiAgICBwcml2YXRlIE15QmVhbiBteUJlYW4mIzU5OworICogIH0KKyAqIDwvcHJlPgorICoKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitjbGFzcyBTdXBwbGllckluc3RhbmNlQmVhbkJyaWRnZTxUPiBleHRlbmRzIEplcnNleUJlYW48T2JqZWN0PiB7CisKKyAgICBwcml2YXRlIGZpbmFsIFN1cHBsaWVyPFQ+IHN1cHBsaWVyOworICAgIHByaXZhdGUgZmluYWwgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IHNjb3BlOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBKZXJzZXktc3BlY2lmaWMge0BsaW5rIGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5CZWFufSBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiaW5kaW5nIHtAbGluayBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuQmVhbkF0dHJpYnV0ZXN9IHBhcnQgb2YgdGhlIGJlYW4uCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgU3VwcGxpZXJJbnN0YW5jZUJlYW5CcmlkZ2UoU3VwcGxpZXJJbnN0YW5jZUJpbmRpbmcgYmluZGluZykgeworICAgICAgICBzdXBlcihiaW5kaW5nKTsKKworICAgICAgICBTdXBwbGllckluc3RhbmNlQmluZGluZzxUPiBjYXN0ZWQgPSAoU3VwcGxpZXJJbnN0YW5jZUJpbmRpbmc8VD4pIGJpbmRpbmc7CisgICAgICAgIHRoaXMuc3VwcGxpZXIgPSBjYXN0ZWQuZ2V0U3VwcGxpZXIoKTsKKyAgICAgICAgdGhpcy5zY29wZSA9IGNhc3RlZC5nZXRTY29wZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlKENyZWF0aW9uYWxDb250ZXh0IGNyZWF0aW9uYWxDb250ZXh0KSB7CisgICAgICAgIHJldHVybiBzdXBwbGllci5nZXQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95KE9iamVjdCBpbnN0YW5jZSwgQ3JlYXRpb25hbENvbnRleHQ8T2JqZWN0PiBjb250ZXh0KSB7CisgICAgICAgIGlmIChEaXNwb3NhYmxlU3VwcGxpZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShzdXBwbGllci5nZXRDbGFzcygpKSkgeworICAgICAgICAgICAgKChEaXNwb3NhYmxlU3VwcGxpZXI8T2JqZWN0Pikgc3VwcGxpZXIpLmRpc3Bvc2UoaW5zdGFuY2UpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICoge0BsaW5rIFN1cHBsaWVySW5zdGFuY2VCZWFuQnJpZGdlfSBuZWVkcyBoYXZlIHRoZSBzYW1lIHNjb3BlIGFzIGEga2VlcGluZyB2YWx1ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gc2NvcGUgb2YgdGhlIHN1cHBsaWVyIGJlYW4uCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBnZXRTY29wZSgpIHsKKyAgICAgICAgcmV0dXJuIHNjb3BlID09IG51bGwgPyBEZXBlbmRlbnQuY2xhc3MgOiB0cmFuc2Zvcm1TY29wZShzY29wZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL2JlYW4vU3VwcGxpZXJUaHJlYWRTY29wZUJlYW4uamF2YSBiL2luamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9iZWFuL1N1cHBsaWVyVGhyZWFkU2NvcGVCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdjY2RlZAotLS0gL2Rldi9udWxsCisrKyBiL2luamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9iZWFuL1N1cHBsaWVyVGhyZWFkU2NvcGVCZWFuLmphdmEKQEAgLTAsMCArMSwxMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0LmNkaS5zZS5iZWFuOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5EZXBlbmRlbnQ7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LnNwaS5DcmVhdGlvbmFsQ29udGV4dDsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuQmVhbjsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuUGFzc2l2YXRpb25DYXBhYmxlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LlN1cHBsaWVySW5zdGFuY2VCaW5kaW5nOworCitpbXBvcnQgb3JnLmpib3NzLndlbGQuYmVhbi5TdHJpbmdCZWFuSWRlbnRpZmllcjsKK2ltcG9ydCBvcmcuamJvc3Mud2VsZC5iZWFuLnByb3h5LkJlYW5JbnN0YW5jZTsKK2ltcG9ydCBvcmcuamJvc3Mud2VsZC5iZWFuLnByb3h5LkNvbnRleHRCZWFuSW5zdGFuY2U7CitpbXBvcnQgb3JnLmpib3NzLndlbGQuYmVhbi5wcm94eS5Qcm94eUZhY3Rvcnk7CitpbXBvcnQgb3JnLmpib3NzLndlbGQubWFuYWdlci5CZWFuTWFuYWdlckltcGw7CisKKy8qKgorICogQ3JlYXRlcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkJlYW59IGludGVyZmFjZSB1c2luZyBKZXJzZXkncyB7QGxpbmsgU3VwcGxpZXJJbnN0YW5jZUJpbmRpbmd9LgorICogQmluZGluZyBwcm92aWRlcyB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGJlYW4gYWxzbyBjYWxsZWQge0BsaW5rIGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5CZWFuQXR0cmlidXRlc30gaW5mb3JtYXRpb24uCisgKiBUaGUge0Bjb2RlIEJlYW59IGRvZXMgbm90IHVzZSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0LmNkaS5zZS5pbmplY3Rvci5KZXJzZXlJbmplY3Rpb25UYXJnZXR9IGJlY2F1c2Ugc2VydmVzIGFscmVhZHkKKyAqIGNyZWF0ZWQgcHJveHksIHRoZXJlZm9yZSB0aGUgY3JlYXRlIG9wZXJhdGlvbiBqdXN0IHJldHVybiBwcm92aWRlZCBpbnN0YW5jZSB3aXRob3V0IGFueSBvdGhlciBjb250ZXh0dWFsIG9wZXJhdGlvbgorICogKHByb2R1Y2UsIGluamVjdCwgZGVzdHJveSkuCisgKiA8cD4KKyAqIFRoaXMgYmVhbiBpcyBzcGVjaWFsIGFuZCBpcyB1c2VkIG9ubHkgZm9yIHNlcnZpY2UgcmVnaXN0ZXJlZCBhcyBhIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuUGVyVGhyZWFkfSBhbmQKKyAqIHdvcmtzIHRocm91Z2ggdGhlIHByb3h5IHdoaWNoIHNlcnZlcyB0aGUgY29ycmVjdCBpbnN0YW5jZSBwZXIgdGhlIGdpdmVuIHRocmVhZC4KKyAqIDxwPgorICogUmVnaXN0ZXIgZXhhbXBsZToKKyAqIDxwcmU+CisgKiBBYnN0cmFjdEJpbmRlciB7CisgKiAgICAgJiM2NDtPdmVycmlkZQorICogICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAqICAgICAgICAgYmluZEZhY3RvcnkobmV3IE15RmFjdG9yeUluamVjdGlvblByb3ZpZGVyKCkpCisgKiAgICAgICAgICAgICAgLnRvKE15QmVhbi5jbGFzcykKKyAqICAgICAgICAgICAgICAuaW4oUGVyVGhyZWFkLmNsYXNzKTsKKyAqICAgICB9CisgKiB9CisgKiA8L3ByZT4KKyAqIEluamVjdCBleGFtcGxlOgorICogPHByZT4KKyAqICYjNjQ7UGF0aCgiLyIpCisgKiBwdWJsaWMgY2xhc3MgTXlSZXNvdXJjZSB7CisgKiAgICYjNjQ7SW5qZWN0CisgKiAgIHByaXZhdGUgTXlCZWFuIG15QmVhbiYjNTk7CisgKiB9CisgKiA8L3ByZT4KKyAqLworcHVibGljIGNsYXNzIFN1cHBsaWVyVGhyZWFkU2NvcGVCZWFuIGV4dGVuZHMgSmVyc2V5QmVhbjxPYmplY3Q+IHsKKworICAgIHByaXZhdGUgZmluYWwgVGhyZWFkU2NvcGVCZWFuSW5zdGFuY2U8T2JqZWN0PiBiZWFuSW5zdGFuY2U7CisgICAgcHJpdmF0ZSBmaW5hbCBTdXBwbGllckluc3RhbmNlQmluZGluZyBiaW5kaW5nOworICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IHByb3h5OworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBKZXJzZXktc3BlY2lmaWMge0BsaW5rIGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5CZWFufSBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiaW5kaW5nIHtAbGluayBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuQmVhbkF0dHJpYnV0ZXN9IHBhcnQgb2YgdGhlIGJlYW4uCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgU3VwcGxpZXJUaHJlYWRTY29wZUJlYW4oU3VwcGxpZXJJbnN0YW5jZUJpbmRpbmcgYmluZGluZywgQmVhbk1hbmFnZXJJbXBsIG1hbmFnZXIpIHsKKyAgICAgICAgc3VwZXIoYmluZGluZyk7CisgICAgICAgIHRoaXMuYmluZGluZyA9IGJpbmRpbmc7CisgICAgICAgIHRoaXMuYmVhbkluc3RhbmNlID0gbmV3IFRocmVhZFNjb3BlQmVhbkluc3RhbmNlPD4oYmluZGluZy5nZXRTdXBwbGllcigpLCB0aGlzLCBtYW5hZ2VyLmdldENvbnRleHRJZCgpKTsKKyAgICAgICAgdGhpcy5wcm94eSA9IGNyZWF0ZUNsaWVudFByb3h5KGJlYW5JbnN0YW5jZSwgbWFuYWdlci5nZXRDb250ZXh0SWQoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBnZXRTY29wZSgpIHsKKyAgICAgICAgcmV0dXJuIERlcGVuZGVudC5jbGFzczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZShDcmVhdGlvbmFsQ29udGV4dDxPYmplY3Q+IGN0eCkgeworICAgICAgICByZXR1cm4gcHJveHk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZGVzdHJveShPYmplY3QgaW5zdGFuY2UsIENyZWF0aW9uYWxDb250ZXh0PE9iamVjdD4gY3JlYXRpb25hbENvbnRleHQpIHsKKyAgICAgICAgdGhpcy5iZWFuSW5zdGFuY2UuZGlzcG9zZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDbGFzczw/PiBnZXRCZWFuQ2xhc3MoKSB7CisgICAgICAgIHJldHVybiAoQ2xhc3M8Pz4pIHRoaXMuYmluZGluZy5nZXRDb250cmFjdHMoKS5pdGVyYXRvcigpLm5leHQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIDxUPiBUIGNyZWF0ZUNsaWVudFByb3h5KEJlYW5JbnN0YW5jZSBiZWFuSW5zdGFuY2UsIFN0cmluZyBjb250ZXh0SWQpIHsKKyAgICAgICAgUHJveHlGYWN0b3J5PFQ+IGZhY3RvcnkgPSBuZXcgUHJveHlGYWN0b3J5PD4oY29udGV4dElkLCBnZXRCZWFuQ2xhc3MoKSwgZ2V0VHlwZXMoKSwgdGhpcyk7CisgICAgICAgIHJldHVybiBmYWN0b3J5LmNyZWF0ZShiZWFuSW5zdGFuY2UpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRocmVhZFNjb3BlQmVhbkluc3RhbmNlPFQ+IGV4dGVuZHMgQ29udGV4dEJlYW5JbnN0YW5jZTxUPiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBXZWFrSGFzaE1hcDxUaHJlYWQsIE9iamVjdD4gaW5zdGFuY2VzID0gbmV3IFdlYWtIYXNoTWFwPD4oKTsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFN1cHBsaWVyPFQ+IHN1cHBsaWVyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IGludm9jYXRpb24gaGFuZGxlciB3aXRoIHN1cHBsaWVyIHdoaWNoIHByb3ZpZGVzIGEgY3VycmVudCBpbmplY3RlZCB2YWx1ZSBpbiBwcm9wZXIgc2NvcGUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzdXBwbGllciBwcm92aWRlciBvZiB0aGUgdmFsdWUuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIFRocmVhZFNjb3BlQmVhbkluc3RhbmNlKFN1cHBsaWVyPFQ+IHN1cHBsaWVyLCBCZWFuPFQ+IGJlYW4sIFN0cmluZyBjb250ZXh0SWQpIHsKKyAgICAgICAgICAgIHN1cGVyKGJlYW4sIG5ldyBTdHJpbmdCZWFuSWRlbnRpZmllcigoKFBhc3NpdmF0aW9uQ2FwYWJsZSkgYmVhbikuZ2V0SWQoKSksIGNvbnRleHRJZCk7CisgICAgICAgICAgICB0aGlzLnN1cHBsaWVyID0gc3VwcGxpZXI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE9iamVjdCBpbnZva2UoT2JqZWN0IG9iaiwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0Li4uIGFyZ3VtZW50cykgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgICAgICBPYmplY3QgaW5zdGFuY2UgPSBpbnN0YW5jZXMuY29tcHV0ZUlmQWJzZW50KFRocmVhZC5jdXJyZW50VGhyZWFkKCksIHRocmVhZCAtPiBzdXBwbGllci5nZXQoKSk7CisgICAgICAgICAgICByZXR1cm4gc3VwZXIuaW52b2tlKGluc3RhbmNlLCBtZXRob2QsIGFyZ3VtZW50cyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgeworICAgICAgICAgICAgdGhpcy5pbnN0YW5jZXMuY2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2luamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9pbmplY3Rvci9BYnN0cmFjdEluamVjdGlvblRhcmdldC5qYXZhIGIvaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL2luamVjdG9yL0Fic3RyYWN0SW5qZWN0aW9uVGFyZ2V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI4ODQwYgotLS0gL2Rldi9udWxsCisrKyBiL2luamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9pbmplY3Rvci9BYnN0cmFjdEluamVjdGlvblRhcmdldC5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0LmNkaS5zZS5pbmplY3RvcjsKKworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuc3BpLkNyZWF0aW9uYWxDb250ZXh0OworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5JbmplY3Rpb25Qb2ludDsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuSW5qZWN0aW9uVGFyZ2V0OworCisvKioKKyAqIEFic3RyYWN0IGNsYXNzIHdoaWNoIGltcGxlbWVudHMgYWxsIG1ldGhvZHMgZnJvbSB7QGxpbmsgSW5qZWN0aW9uVGFyZ2V0fSBieSBpbnZva2luZyB0aGUgc2FtZSBtZXRob2RzIG9uIHRoZSBkZWxlZ2F0ZSBvYmplY3QuCisgKiBVc2VmdWwgc3VwZXIgY2xhc3MgdG8gZXh0ZW5kIGFuZCBvdmVycmlkZSBvbmx5IHRoZSBuZWVkZWQgbWV0aG9kLgorICoKKyAqIEBwYXJhbSA8VD4gdHlwZSBvZiB0aGUgaW5qZWN0aW9uIHRhcmdldC4KKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCithYnN0cmFjdCBjbGFzcyBBYnN0cmFjdEluamVjdGlvblRhcmdldDxUPiBpbXBsZW1lbnRzIEluamVjdGlvblRhcmdldDxUPiB7CisKKyAgICAvKioKKyAgICAgKiBPYmplY3Qgb24gd2hpY2ggYWxsIGNhbGxzIHdpbGwgYmUgZGVsZWdhdGVkLgorICAgICAqCisgICAgICogQHJldHVybiBpbmplY3Rpb24gdGFyZ2V0LgorICAgICAqLworICAgIGFic3RyYWN0IEluamVjdGlvblRhcmdldDxUPiBkZWxlZ2F0ZSgpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaW5qZWN0KGZpbmFsIFQgaW5zdGFuY2UsIGZpbmFsIENyZWF0aW9uYWxDb250ZXh0PFQ+IGN0eCkgeworICAgICAgICBkZWxlZ2F0ZSgpLmluamVjdChpbnN0YW5jZSwgY3R4KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwb3N0Q29uc3RydWN0KGZpbmFsIFQgaW5zdGFuY2UpIHsKKyAgICAgICAgZGVsZWdhdGUoKS5wb3N0Q29uc3RydWN0KGluc3RhbmNlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwcmVEZXN0cm95KGZpbmFsIFQgaW5zdGFuY2UpIHsKKyAgICAgICAgZGVsZWdhdGUoKS5wcmVEZXN0cm95KGluc3RhbmNlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVCBwcm9kdWNlKGZpbmFsIENyZWF0aW9uYWxDb250ZXh0PFQ+IGN0eCkgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS5wcm9kdWNlKGN0eCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZGlzcG9zZShmaW5hbCBUIGluc3RhbmNlKSB7CisgICAgICAgIGRlbGVnYXRlKCkuZGlzcG9zZShpbnN0YW5jZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxJbmplY3Rpb25Qb2ludD4gZ2V0SW5qZWN0aW9uUG9pbnRzKCkgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUoKS5nZXRJbmplY3Rpb25Qb2ludHMoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvaW5qZWN0b3IvQ2FjaGVkQ29uc3RydWN0b3JBbmFseXplci5qYXZhIGIvaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL2luamVjdG9yL0NhY2hlZENvbnN0cnVjdG9yQW5hbHl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDE0OTE4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL2luamVjdG9yL0NhY2hlZENvbnN0cnVjdG9yQW5hbHl6ZXIuamF2YQpAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuY2RpLnNlLmluamVjdG9yOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LkluamVjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLkxhenlWYWx1ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uVmFsdWU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLlZhbHVlczsKKworLyoqCisgKiBQcm9jZXNzZXMgYSBwcm92aWRlZCBjbGFzcyBhbmQgc2VsZWN0cyB0aGUgdmFsaWQgY29uc3RydWN0b3Igd2l0aCB0aGUgbGFyZ2VzdCBudW1iZXIgb2YgcGFyYW1ldGVycy4gQ29uc3RydWN0b3IgaXMgY2FjaGVkCisgKiBmb3IgYSBsYXRlciByZXRyaWV2ZS4KKyAqLworcHVibGljIGNsYXNzIENhY2hlZENvbnN0cnVjdG9yQW5hbHl6ZXI8VD4geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoQ2FjaGVkQ29uc3RydWN0b3JBbmFseXplci5jbGFzcy5nZXROYW1lKCkpOworCisgICAgcHJpdmF0ZSBmaW5hbCBMYXp5VmFsdWU8Q29uc3RydWN0b3I8VD4+IGNvbnN0cnVjdG9yOworICAgIHByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4+IHJlc29sdmVyQW5ub3RhdGlvbnM7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGNvbnN0cnVjdG9yIGFuYWx5emVyIHdoaWNoIGFjY2VwdHMgdGhlIGNsYXNzIHRoYXQgaXMgYW5hbHl6ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhenogICAgICAgYW5hbHl6ZWQgY2xhc3MuCisgICAgICogQHBhcmFtIGFubm90YXRpb25zIGFsbCBhbm5vdGF0aW9ucyB1c2VkIGZvciBhbiBpbmplY3RpbmcuCisgICAgICovCisgICAgcHVibGljIENhY2hlZENvbnN0cnVjdG9yQW5hbHl6ZXIoQ2xhc3M8VD4gY2xhenosIENvbGxlY3Rpb248Q2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+PiBhbm5vdGF0aW9ucykgeworICAgICAgICB0aGlzLnJlc29sdmVyQW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uczsKKyAgICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9IFZhbHVlcy5sYXp5KChWYWx1ZTxDb25zdHJ1Y3RvcjxUPj4pICgpIC0+IGdldENvbnN0cnVjdG9ySW50ZXJuYWwoY2xhenopKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29uc3RydWN0b3I8VD4gZ2V0Q29uc3RydWN0b3IoKSB7CisgICAgICAgIHJldHVybiBjb25zdHJ1Y3Rvci5nZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNDb21wYXRpYmxlQ29uc3RydWN0b3IoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gY29uc3RydWN0b3IuZ2V0KCkgIT0gbnVsbDsKKyAgICAgICAgfSBjYXRjaCAoSW5qZWN0aW9uRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBDb21wYXRpYmxlIGNvbnN0cnVjdG9yIHdhcyBub3QgZm91bmQuCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZWxlY3QgdGhlIHByb3BlciBjb25zdHJ1Y3RvciBvZiB0aGUgZ2l2ZW4ge0Bjb2RlIGNsYXp6fS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gY29tcGF0aWJsZSBhbmQgbGFyZ2VzdCBjb25zdHJ1Y3Rvci4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwcml2YXRlIENvbnN0cnVjdG9yPFQ+IGdldENvbnN0cnVjdG9ySW50ZXJuYWwoQ2xhc3M8VD4gY2xhenopIHsKKyAgICAgICAgaWYgKGNsYXp6LmlzTG9jYWxDbGFzcygpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5qZWN0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBMb2NhbGl6YXRpb25NZXNzYWdlcy5JTkpFQ1RJT05fRVJST1JfTE9DQUxfQ0xBU1NfTk9UX1NVUFBPUlRFRChjbGF6ei5nZXROYW1lKCkpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2xhenouaXNNZW1iZXJDbGFzcygpICYmICFNb2RpZmllci5pc1N0YXRpYyhjbGF6ei5nZXRNb2RpZmllcnMoKSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmplY3Rpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIExvY2FsaXphdGlvbk1lc3NhZ2VzLklOSkVDVElPTl9FUlJPUl9OT05TVEFUSUNfTUVNQkVSX0NMQVNTX05PVF9TVVBQT1JURUQoY2xhenouZ2V0TmFtZSgpKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCB3ZSBzaW1wbHkgbmVlZCB0byBmaW5kIHRoZSBjb25zdHJ1Y3RvciB3aXRoIHRoZSBsYXJnZXN0IG51bWJlciBvZiBwYXJhbWV0ZXJzCisgICAgICAgIENvbnN0cnVjdG9yPD8+W10gY29uc3RydWN0b3JzID0gQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoCisgICAgICAgICAgICAgICAgKFByaXZpbGVnZWRBY3Rpb248Q29uc3RydWN0b3I8Pz5bXT4pIGNsYXp6OjpnZXREZWNsYXJlZENvbnN0cnVjdG9ycyk7CisgICAgICAgIENvbnN0cnVjdG9yPD8+IHNlbGVjdGVkID0gbnVsbDsKKyAgICAgICAgaW50IHNlbGVjdGVkU2l6ZSA9IDA7CisgICAgICAgIGludCBtYXhQYXJhbXMgPSAtMTsKKworICAgICAgICBmb3IgKENvbnN0cnVjdG9yPD8+IGNvbnN0cnVjdG9yIDogY29uc3RydWN0b3JzKSB7CisgICAgICAgICAgICBDbGFzczw/PltdIHBhcmFtcyA9IGNvbnN0cnVjdG9yLmdldFBhcmFtZXRlclR5cGVzKCk7CisgICAgICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCA+PSBtYXhQYXJhbXMgJiYgaXNDb21wYXRpYmxlKGNvbnN0cnVjdG9yKSkgeworICAgICAgICAgICAgICAgIGlmIChwYXJhbXMubGVuZ3RoID4gbWF4UGFyYW1zKSB7CisgICAgICAgICAgICAgICAgICAgIG1heFBhcmFtcyA9IHBhcmFtcy5sZW5ndGg7CisgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkU2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc2VsZWN0ZWQgPSBjb25zdHJ1Y3RvcjsKKyAgICAgICAgICAgICAgICBzZWxlY3RlZFNpemUrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZWxlY3RlZFNpemUgPT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEluamVjdGlvbkV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5JTkpFQ1RJT05fRVJST1JfU1VJVEFCTEVfQ09OU1RSVUNUT1JfTk9UX0ZPVU5EKGNsYXp6LmdldE5hbWUoKSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlbGVjdGVkU2l6ZSA+IDEpIHsKKyAgICAgICAgICAgIC8vIEZvdW5kIHswfSBjb25zdHJ1Y3RvcnMgd2l0aCB7MX0gcGFyYW1ldGVycyBpbiB7Mn0gY2xhc3MuIFNlbGVjdGluZyB0aGUgZmlyc3QgZm91bmQgY29uc3RydWN0b3I6IHszfQorICAgICAgICAgICAgTE9HR0VSLndhcm5pbmcoTG9jYWxpemF0aW9uTWVzc2FnZXMuTVVMVElQTEVfTUFUQ0hJTkdfQ09OU1RSVUNUT1JTX0ZPVU5EKAorICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFNpemUsIG1heFBhcmFtcywgY2xhenouZ2V0TmFtZSgpLCBzZWxlY3RlZC50b0dlbmVyaWNTdHJpbmcoKSkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChDb25zdHJ1Y3RvcjxUPikgc2VsZWN0ZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGNvbnN0cnVjdG9yIGlzIHZhbGlkIGZvciBpbmplY3Rpb24gdGhhdCBtZWFucyB0aGF0IGFsbCBwYXJhbWV0ZXJzIGhhcyBhbiBpbmplY3Rpb24gYW5ub3RhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25zdHJ1Y3RvciBjb25zdHJ1Y3RvciB0byBpbmplY3QuCisgICAgICogQHJldHVybiBUcnVlIGlmIGVsZW1lbnQgY29udGFpbnMgYXQgbGVhc3Qgb25lIGluamVjdCBhbm5vdGF0aW9uLgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJNYWdpY0NvbnN0YW50IikKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNDb21wYXRpYmxlKENvbnN0cnVjdG9yPD8+IGNvbnN0cnVjdG9yKSB7CisgICAgICAgIGlmIChjb25zdHJ1Y3Rvci5nZXRBbm5vdGF0aW9uKEluamVjdC5jbGFzcykgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gSlNSLTMzMCBhcHBsaWNhYmxlCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBwYXJhbVNpemUgPSBjb25zdHJ1Y3Rvci5nZXRQYXJhbWV0ZXJUeXBlcygpLmxlbmd0aDsKKyAgICAgICAgaWYgKHBhcmFtU2l6ZSAhPSAwICYmIHJlc29sdmVyQW5ub3RhdGlvbnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIU1vZGlmaWVyLmlzUHVibGljKGNvbnN0cnVjdG9yLmdldE1vZGlmaWVycygpKSkgeworICAgICAgICAgICAgLy8gcmV0dXJuIHRydWUgZm9yIGEgZGVmYXVsdCBjb25zdHJ1Y3RvciwgcmV0dXJuIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgICAgICAgIHJldHVybiBwYXJhbVNpemUgPT0gMAorICAgICAgICAgICAgICAgICAgICAmJiAoY29uc3RydWN0b3IuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5nZXRNb2RpZmllcnMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIChNb2RpZmllci5QVUJMSUMgfCBNb2RpZmllci5QUk9URUNURUQgfCBNb2RpZmllci5QUklWQVRFKSkgPT0gY29uc3RydWN0b3IuZ2V0TW9kaWZpZXJzKCk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKEFubm90YXRpb25bXSBwYXJhbUFubm90YXRpb25zIDogY29uc3RydWN0b3IuZ2V0UGFyYW1ldGVyQW5ub3RhdGlvbnMoKSkgeworICAgICAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChBbm5vdGF0aW9uIHBhcmFtQW5ub3RhdGlvbiA6IHBhcmFtQW5ub3RhdGlvbnMpIHsKKyAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZXJBbm5vdGF0aW9ucy5jb250YWlucyhwYXJhbUFubm90YXRpb24uYW5ub3RhdGlvblR5cGUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL2luamVjdG9yL0NvbGxlY3Rvci5qYXZhIGIvaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL2luamVjdG9yL0NvbGxlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljYjhjYTgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvaW5qZWN0b3IvQ29sbGVjdG9yLmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuY2RpLnNlLmluamVjdG9yOworCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CisKKy8qKgorICogVGhpcyBjbGFzcyBjb2xsZWN0cyBlcnJvcnMsIGFuZCBjYW4gdGhlbiBhbHNvIHByb2R1Y2UgYSBNdWx0aUV4Y2VwdGlvbiBmcm9tIHRob3NlIGVycm9ycyBpZiBuZWNlc3NhcnkuCisgKgorICogQGF1dGhvciBKb2huIFdlbGxzIChqb2huLndlbGxzIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBDb2xsZWN0b3IgeworCisgICAgcHJpdmF0ZSBMaW5rZWRIYXNoU2V0PFRocm93YWJsZT4gdGhyb3dhYmxlczsKKworICAgIC8qKgorICAgICAqIE1lcmdlcyB7QGxpbmsgTXVsdGlFeGNlcHRpb259IHdpdGggYWxsIHtAY29kZSB0aHJvd2FibGVzfSByZWdpc3RlcmVkIGluIGl0LgorICAgICAqCisgICAgICogQHBhcmFtIG1lIHtAY29kZSBNdWx0aUV4Y2VwdGlvbn0gdG8gbWVyZ2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkTXVsdGlFeGNlcHRpb24oTXVsdGlFeGNlcHRpb24gbWUpIHsKKyAgICAgICAgaWYgKG1lID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhyb3dhYmxlcyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvd2FibGVzID0gbmV3IExpbmtlZEhhc2hTZXQ8PigpOworICAgICAgICB9CisKKyAgICAgICAgdGhyb3dhYmxlcy5hZGRBbGwobWUuZ2V0RXJyb3JzKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSB0aHJvd2FibGUgdG8gdGhlIGxpc3Qgb2YgdGhyb3dhYmxlcyBpbiB0aGlzIGNvbGxlY3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aCBUaGUgdGhyb3dhYmxlIHRvIGFkZCB0byB0aGUgbGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRUaHJvd2FibGUoVGhyb3dhYmxlIHRoKSB7CisgICAgICAgIGlmICh0aCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRocm93YWJsZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3dhYmxlcyA9IG5ldyBMaW5rZWRIYXNoU2V0PD4oKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0aCBpbnN0YW5jZW9mIE11bHRpRXhjZXB0aW9uKSB7CisgICAgICAgICAgICB0aHJvd2FibGVzLmFkZEFsbCgoKE11bHRpRXhjZXB0aW9uKSB0aCkuZ2V0RXJyb3JzKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3dhYmxlcy5hZGQodGgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2Qgd2lsbCB0aHJvdyBpZiB0aGUgbGlzdCBvZiB0aHJvd2FibGVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbGxlY3RvciBpcyBub3QgZW1wdHkuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIE11bHRpRXhjZXB0aW9uIEFuIGV4Y2VwdGlvbiB3aXRoIGFsbCB0aGUgdGhyb3dhYmxlcyBmb3VuZCBpbiB0aGlzIGNvbGxlY3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0aHJvd0lmRXJyb3JzKCkgdGhyb3dzIE11bHRpRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHRocm93YWJsZXMgPT0gbnVsbCB8fCB0aHJvd2FibGVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdGhyb3cgbmV3IE11bHRpRXhjZXB0aW9uKG5ldyBMaW5rZWRMaXN0PD4odGhyb3dhYmxlcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGNvbGxlY3RvciBoYXMgZXJyb3JzLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBjb2xsZWN0b3IgaGFzIGVycm9ycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBoYXNFcnJvcnMoKSB7CisgICAgICAgIHJldHVybiAoKHRocm93YWJsZXMgIT0gbnVsbCkgJiYgKCF0aHJvd2FibGVzLmlzRW1wdHkoKSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2luamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9pbmplY3Rvci9Db250ZXh0SW5qZWN0aW9uUmVzb2x2ZXJJbXBsLmphdmEgYi9pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvaW5qZWN0b3IvQ29udGV4dEluamVjdGlvblJlc29sdmVySW1wbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZjdkNTQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvaW5qZWN0b3IvQ29udGV4dEluamVjdGlvblJlc29sdmVySW1wbC5qYXZhCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5jZGkuc2UuaW5qZWN0b3I7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY1R5cGU7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuc3BpLkNyZWF0aW9uYWxDb250ZXh0OworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5CZWFuOworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5CZWFuTWFuYWdlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5BYnN0cmFjdEJpbmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQmluZGluZ3M7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkNvbnRleHRJbmplY3Rpb25SZXNvbHZlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0ZWU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGVlSW1wbDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uUmVzb2x2ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5SZWZsZWN0aW9uSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5DYWNoZTsKKworLyoqCisgKiBJbmplY3Rpb24gcmVzb2x2ZXIgZm9yIHtAbGluayBDb250ZXh0IEBDb250ZXh0fSBpbmplY3Rpb24gYW5ub3RhdGlvbi4KKyAqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworcHVibGljIGNsYXNzIENvbnRleHRJbmplY3Rpb25SZXNvbHZlckltcGwgaW1wbGVtZW50cyBJbmplY3Rpb25SZXNvbHZlcjxDb250ZXh0PiwgQ29udGV4dEluamVjdGlvblJlc29sdmVyIHsKKworICAgIHByaXZhdGUgU3VwcGxpZXI8QmVhbk1hbmFnZXI+IGJlYW5NYW5hZ2VyOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgQ29udGV4dEluamVjdGlvblJlc29sdmVyfSB3aXRoIHtAbGluayBCZWFuTWFuYWdlcn0gdG8gZmV0Y2ggQmVhbiBkZXNjcmlwdG9ycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiZWFuTWFuYWdlciBjdXJyZW50IGJlYW4gbWFuYWdlci4KKyAgICAgKi8KKyAgICBDb250ZXh0SW5qZWN0aW9uUmVzb2x2ZXJJbXBsKFN1cHBsaWVyPEJlYW5NYW5hZ2VyPiBiZWFuTWFuYWdlcikgeworICAgICAgICB0aGlzLmJlYW5NYW5hZ2VyID0gYmVhbk1hbmFnZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBDYWNoZTxUeXBlLCBCZWFuPD8+PiBkZXNjcmlwdG9yQ2FjaGUgPSBuZXcgQ2FjaGU8PihrZXkgLT4geworICAgICAgICBTZXQ8QmVhbjw/Pj4gYmVhbnMgPSBiZWFuTWFuYWdlci5nZXQoKS5nZXRCZWFucyhrZXkpOworICAgICAgICBpZiAoYmVhbnMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYmVhbnMuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgfSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IHJlc29sdmUoSW5qZWN0ZWUgaW5qZWN0ZWUpIHsKKyAgICAgICAgSW5qZWN0ZWUgbmV3SW5qZWN0ZWUgPSBpbmplY3RlZTsKKyAgICAgICAgaWYgKGluamVjdGVlLmlzRmFjdG9yeSgpKSB7CisgICAgICAgICAgICBuZXdJbmplY3RlZSA9IGdldEZhY3RvcnlJbmplY3RlZShpbmplY3RlZSwgUmVmbGVjdGlvbkhlbHBlci5nZXRUeXBlQXJndW1lbnQoaW5qZWN0ZWUuZ2V0UmVxdWlyZWRUeXBlKCksIDApKTsKKyAgICAgICAgfQorCisgICAgICAgIEJlYW48Pz4gYmVhbiA9IGRlc2NyaXB0b3JDYWNoZS5hcHBseShuZXdJbmplY3RlZS5nZXRSZXF1aXJlZFR5cGUoKSk7CisKKyAgICAgICAgaWYgKGJlYW4gIT0gbnVsbCkgeworICAgICAgICAgICAgQ3JlYXRpb25hbENvbnRleHQgY3R4ID0gYmVhbk1hbmFnZXIuZ2V0KCkuY3JlYXRlQ3JlYXRpb25hbENvbnRleHQoYmVhbik7CisgICAgICAgICAgICBPYmplY3QgcmVzdWx0ID0gYmVhbi5jcmVhdGUoY3R4KTsKKworICAgICAgICAgICAgaWYgKGluamVjdGVlLmlzRmFjdG9yeSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChTdXBwbGllcjxPYmplY3Q+KSAoKSAtPiByZXN1bHQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNDb25zdHJ1Y3RvclBhcmFtZXRlckluZGljYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNNZXRob2RQYXJhbWV0ZXJJbmRpY2F0b3IoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2xhc3M8Q29udGV4dD4gZ2V0QW5ub3RhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIENvbnRleHQuY2xhc3M7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udGV4dCBpbmplY3Rpb24gcmVzb2x2ZXIgYmluZGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQmluZGVyIGV4dGVuZHMgQWJzdHJhY3RCaW5kZXIgeworCisgICAgICAgIHByaXZhdGUgU3VwcGxpZXI8QmVhbk1hbmFnZXI+IGJlYW5NYW5hZ2VyOworCisgICAgICAgIHB1YmxpYyBCaW5kZXIoU3VwcGxpZXI8QmVhbk1hbmFnZXI+IGJlYW5NYW5hZ2VyKSB7CisgICAgICAgICAgICB0aGlzLmJlYW5NYW5hZ2VyID0gYmVhbk1hbmFnZXI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIENvbnRleHRJbmplY3Rpb25SZXNvbHZlckltcGwgcmVzb2x2ZXIgPSBuZXcgQ29udGV4dEluamVjdGlvblJlc29sdmVySW1wbChiZWFuTWFuYWdlcik7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBCaW5kaW5nIGZvciBDREksIHdpdGhvdXQgdGhpcyBiaW5kaW5nIEplcnNleUluamVjdGlvblRhcmdldCB3b3VsZG4ndCBrbm93IGFib3V0IHRoZSBDb250ZXh0SW5qZWN0aW9uVGFyZ2V0IGFuZAorICAgICAgICAgICAgICogaW5qZWN0aW9uIGludG8gZmllbGRzIHdvdWxkIGJlIGRpc2FibGVkLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBiaW5kKHJlc29sdmVyKQorICAgICAgICAgICAgICAgICAgICAudG8obmV3IEdlbmVyaWNUeXBlPEluamVjdGlvblJlc29sdmVyPENvbnRleHQ+PigpIHt9KQorICAgICAgICAgICAgICAgICAgICAudG8oQ29udGV4dEluamVjdGlvblJlc29sdmVyLmNsYXNzKTsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEJpbmRpbmcgZm9yIEplcnNleSwgd2l0aG91dCB0aGlzIGJpbmRpbmcgSmVyc2V5IHdvdWxkbid0IHB1dCB0b2dldGhlciBDb250ZXh0SW5qZWN0aW9uUmVzb2x2ZXIgYW5kCisgICAgICAgICAgICAgKiBEZWxlZ2F0ZWRJbmplY3Rpb25WYWx1ZVBhcmFtUHJvdmlkZXIgYW5kIHRoZXJlZm9yZSBpbmplY3Rpb24gaW50byByZXNvdXJjZSBtZXRob2Qgd291bGQgYmUgZGlzYWJsZWQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGJpbmQoQmluZGluZ3Muc2VydmljZShyZXNvbHZlcikpCisgICAgICAgICAgICAgICAgICAgIC50byhuZXcgR2VuZXJpY1R5cGU8SW5qZWN0aW9uUmVzb2x2ZXI8Q29udGV4dD4+KCkge30pCisgICAgICAgICAgICAgICAgICAgIC50byhDb250ZXh0SW5qZWN0aW9uUmVzb2x2ZXIuY2xhc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBJbmplY3RlZSBnZXRGYWN0b3J5SW5qZWN0ZWUoSW5qZWN0ZWUgaW5qZWN0ZWUsIFR5cGUgcmVxdWlyZWRUeXBlKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVxdWlyZWRUeXBlT3ZlcnJpZGluZ0luamVjdGVlKGluamVjdGVlLCByZXF1aXJlZFR5cGUpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJlcXVpcmVkVHlwZU92ZXJyaWRpbmdJbmplY3RlZSBleHRlbmRzIEluamVjdGVlSW1wbCB7CisgICAgICAgIHByaXZhdGUgUmVxdWlyZWRUeXBlT3ZlcnJpZGluZ0luamVjdGVlKEluamVjdGVlIGluamVjdGVlLCBUeXBlIHJlcXVpcmVkVHlwZSkgeworICAgICAgICAgICAgc2V0RmFjdG9yeShpbmplY3RlZS5pc0ZhY3RvcnkoKSk7CisgICAgICAgICAgICBzZXRJbmplY3RlZUNsYXNzKGluamVjdGVlLmdldEluamVjdGVlQ2xhc3MoKSk7CisgICAgICAgICAgICBzZXRJbmplY3RlZURlc2NyaXB0b3IoaW5qZWN0ZWUuZ2V0SW5qZWN0ZWVEZXNjcmlwdG9yKCkpOworICAgICAgICAgICAgc2V0T3B0aW9uYWwoaW5qZWN0ZWUuaXNPcHRpb25hbCgpKTsKKyAgICAgICAgICAgIHNldFBhcmVudChpbmplY3RlZS5nZXRQYXJlbnQoKSk7CisgICAgICAgICAgICBzZXRQb3NpdGlvbihpbmplY3RlZS5nZXRQb3NpdGlvbigpKTsKKyAgICAgICAgICAgIHNldFJlcXVpcmVkUXVhbGlmaWVycyhpbmplY3RlZS5nZXRSZXF1aXJlZFF1YWxpZmllcnMoKSk7CisgICAgICAgICAgICBzZXRSZXF1aXJlZFR5cGUocmVxdWlyZWRUeXBlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2luamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9pbmplY3Rvci9JbmplY3Rpb25VdGlscy5qYXZhIGIvaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL2luamVjdG9yL0luamVjdGlvblV0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNmZjg2YgotLS0gL2Rldi9udWxsCisrKyBiL2luamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9pbmplY3Rvci9JbmplY3Rpb25VdGlscy5qYXZhCkBAIC0wLDAgKzEsMzExIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5jZGkuc2UuaW5qZWN0b3I7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFubm90YXRlZEVsZW1lbnQ7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWVtYmVyOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlBhcmFtZXRlcml6ZWRUeXBlOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5CZWFuOworaW1wb3J0IGphdmF4LmluamVjdC5OYW1lZDsKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0ZWU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGVlSW1wbDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uUmVzb2x2ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5QcmV0dHk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLkltbXV0YWJsZUNvbGxlY3RvcnM7CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyBmb3IgcHJvY2Vzc2luZyBvZiBhbiBpbmplY3Rpb24uCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK3B1YmxpYyBjbGFzcyBJbmplY3Rpb25VdGlscyB7CisKKyAgICAvKioKKyAgICAgKiBGb3JiaWRzIHRoZSBjcmVhdGlvbiBvZiB7QGxpbmsgSW5qZWN0aW9uVXRpbHN9IGluc3RhbmNlLgorICAgICAqLworICAgIHByaXZhdGUgSW5qZWN0aW9uVXRpbHMoKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogSnVzdCBpbmplY3RzIHRoZSB0aGluZywgZG9lc24ndCB0cnkgdG8gZG8gYW55dGhpbmcgZWxzZQorICAgICAqCisgICAgICogQHBhcmFtIGluamVjdE1lICAgICAgdGhlIG9iamVjdCB0byBpbmplY3QgaW50by4KKyAgICAgKiBAcGFyYW0gYmVhbiAgICAgICAgICBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW5qZWN0ZWQgaW5zdGFuY2UuCisgICAgICogQHBhcmFtIHJlc29sdmVycyAgICAgYWxsIGluamVjdGlvbiByZXNvbHZlcnMgcmVnaXN0ZXJlZCBpbiB0aGUgYXBwbGljYXRpb24uCisgICAgICogQHBhcmFtIHByb3h5UmVzb2x2ZXIgb2JqZWN0IHdoaWNoIGlzIGFibGUgdG8gY3JlYXRlIGEgcHJveHkuCisgICAgICogQHBhcmFtIDxUPiAgICAgICAgICAgdHlwZSBvZiB0aGUgaW5qZWN0ZWQgaW5zdGFuY2UuCisgICAgICovCisgICAgc3RhdGljIDxUPiB2b2lkIGp1c3RJbmplY3QoVCBpbmplY3RNZSwgQmVhbjxUPiBiZWFuLCBNYXA8RmllbGQsIEluamVjdGlvblJlc29sdmVyPiByZXNvbHZlcnMsCisgICAgICAgICAgICBKZXJzZXlQcm94eVJlc29sdmVyIHByb3h5UmVzb2x2ZXIpIHsKKyAgICAgICAgaWYgKGluamVjdE1lID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoTWFwLkVudHJ5PEZpZWxkLCBJbmplY3Rpb25SZXNvbHZlcj4gZW50cnkgOiByZXNvbHZlcnMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgRmllbGQgZmllbGQgPSBlbnRyeS5nZXRLZXkoKTsKKyAgICAgICAgICAgIEluamVjdGlvblJlc29sdmVyIHJlc29sdmVyID0gZW50cnkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIEluamVjdGVlIGluamVjdGVlID0gSW5qZWN0aW9uVXRpbHMuZ2V0RmllbGRJbmplY3RlZShiZWFuLCBmaWVsZCk7CisKKyAgICAgICAgICAgIE9iamVjdCByZXNvbHZlZFZhbHVlOworICAgICAgICAgICAgaWYgKGluamVjdGVlLmlzUHJvdmlkZXIoKSkgeworICAgICAgICAgICAgICAgIHJlc29sdmVkVmFsdWUgPSAoUHJvdmlkZXI8T2JqZWN0PikgKCkgLT4gcmVzb2x2ZXIucmVzb2x2ZShpbmplY3RlZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3h5UmVzb2x2ZXIuaXNQcml4aWFibGUoaW5qZWN0ZWUpKSB7CisgICAgICAgICAgICAgICAgcmVzb2x2ZWRWYWx1ZSA9IHByb3h5UmVzb2x2ZXIucHJveHkoaW5qZWN0ZWUsIHJlc29sdmVyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzb2x2ZWRWYWx1ZSA9IHJlc29sdmVyLnJlc29sdmUoaW5qZWN0ZWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFJlZmxlY3Rpb25VdGlscy5zZXRGaWVsZChmaWVsZCwgaW5qZWN0TWUsIHJlc29sdmVkVmFsdWUpOworICAgICAgICAgICAgfSBjYXRjaCAoTXVsdGlFeGNlcHRpb24gbWUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBtZTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0aCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBNdWx0aUV4Y2VwdGlvbih0aCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBpbmplY3RlZSBmb3IgYSBmaWVsZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiZWFuIGJlYW4gaW4gd2hpY2ggdGhlIGZpZWxkIGlzIHBsYWNlZC4KKyAgICAgKiBAcGFyYW0gZmllbGQgICAgICB0aGUgZmllbGQgdG8gYW5hbHl6ZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IChpbiBvcmRlcikgb2YgcGFyYW1ldGVycyB0byB0aGUgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgSW5qZWN0ZWUgZ2V0RmllbGRJbmplY3RlZShCZWFuPD8+IGJlYW4sIEZpZWxkIGZpZWxkKSB7CisgICAgICAgIFNldDxBbm5vdGF0aW9uPiBhbm5vdGF0aW9ucyA9IEFycmF5cy5zdHJlYW0oZmllbGQuZ2V0QW5ub3RhdGlvbnMoKSkKKyAgICAgICAgICAgICAgICAuY29sbGVjdChJbW11dGFibGVDb2xsZWN0b3JzLnRvSW1tdXRhYmxlU2V0KCkpOworCisgICAgICAgIFR5cGUgYWRqdXN0ZWRUeXBlID0gUmVmbGVjdGlvblV0aWxzLnJlc29sdmVGaWVsZChiZWFuLmdldEJlYW5DbGFzcygpLCBmaWVsZCk7CisKKyAgICAgICAgSW5qZWN0ZWVJbXBsIGluamVjdGVlID0gbmV3IEluamVjdGVlSW1wbCgpOworICAgICAgICBpbmplY3RlZS5zZXRQYXJlbnRDbGFzc1Njb3BlKGJlYW4uZ2V0U2NvcGUoKSk7CisKKyAgICAgICAgaWYgKGlzUHJvdmlkZXIoYWRqdXN0ZWRUeXBlKSkgeworICAgICAgICAgICAgUGFyYW1ldGVyaXplZFR5cGUgcGFyYW1UeXBlID0gKFBhcmFtZXRlcml6ZWRUeXBlKSBhZGp1c3RlZFR5cGU7CisgICAgICAgICAgICBpbmplY3RlZS5zZXRSZXF1aXJlZFR5cGUocGFyYW1UeXBlLmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKVswXSk7CisgICAgICAgICAgICBpbmplY3RlZS5zZXRQcm92aWRlcih0cnVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGluamVjdGVlLnNldFJlcXVpcmVkVHlwZShhZGp1c3RlZFR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgaW5qZWN0ZWUuc2V0UGFyZW50KGZpZWxkKTsKKyAgICAgICAgaW5qZWN0ZWUuc2V0UmVxdWlyZWRRdWFsaWZpZXJzKGdldEZpZWxkQWRqdXN0ZWRRdWFsaWZpZXJBbm5vdGF0aW9ucyhmaWVsZCwgYW5ub3RhdGlvbnMpKTsKKyAgICAgICAgcmV0dXJuIGluamVjdGVlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1Byb3ZpZGVyKFR5cGUgdHlwZSkgeworICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRUeXBlKSB7CisgICAgICAgICAgICBQYXJhbWV0ZXJpemVkVHlwZSBwYXJhbVR5cGUgPSAoUGFyYW1ldGVyaXplZFR5cGUpIHR5cGU7CisgICAgICAgICAgICByZXR1cm4gUHJvdmlkZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSgoQ2xhc3M8Pz4pIHBhcmFtVHlwZS5nZXRSYXdUeXBlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFNldDxBbm5vdGF0aW9uPiBnZXRGaWVsZEFkanVzdGVkUXVhbGlmaWVyQW5ub3RhdGlvbnMoRmllbGQgZmllbGQsIFNldDxBbm5vdGF0aW9uPiBxdWFsaWZpZXJzKSB7CisgICAgICAgIE5hbWVkIG4gPSBmaWVsZC5nZXRBbm5vdGF0aW9uKE5hbWVkLmNsYXNzKTsKKyAgICAgICAgaWYgKG4gPT0gbnVsbCB8fCAhIiIuZXF1YWxzKG4udmFsdWUoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBxdWFsaWZpZXJzOworICAgICAgICB9CisKKyAgICAgICAgSGFzaFNldDxBbm5vdGF0aW9uPiByZXRWYWwgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgIGZvciAoQW5ub3RhdGlvbiBxdWFsaWZpZXIgOiBxdWFsaWZpZXJzKSB7CisgICAgICAgICAgICBpZiAocXVhbGlmaWVyLmFubm90YXRpb25UeXBlKCkuZXF1YWxzKE5hbWVkLmNsYXNzKSkgeworICAgICAgICAgICAgICAgIHJldFZhbC5hZGQobmV3IE5hbWVkSW1wbChmaWVsZC5nZXROYW1lKCkpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0VmFsLmFkZChxdWFsaWZpZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBmaWVsZHMgZnJvbSB0aGUgZ2l2ZW4gY2xhc3MgYW5kIGFuYWx5emVyLiBDaGVja3Mgc2VydmljZSBvdXRwdXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhenogICAgICAgICAgICAgdGhlIG5vbi1udWxsIGltcGwgY2xhc3MuCisgICAgICogQHBhcmFtIGluamVjdEFubm90YXRpb25zIGFsbCBhbm5vdGF0aW9ucyB3aGljaCBjYW4gYmUgdXNlZCB0byBpbmplY3QgYSB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gZXJyb3JzICAgICAgICAgICAgZm9yIGdhdGhlcmluZyBlcnJvcnMuICBAcmV0dXJuIGEgbm9uLW51bGwgc2V0IChldmVuIGluIGVycm9yIGNhc2VzLCBjaGVjayB0aGUgY29sbGVjdG9yKS4KKyAgICAgKi8KKyAgICBzdGF0aWMgU2V0PEZpZWxkPiBnZXRGaWVsZHMoQ2xhc3M8Pz4gY2xhenosIFNldDw/IGV4dGVuZHMgQ2xhc3M8Pz4+IGluamVjdEFubm90YXRpb25zLCBDb2xsZWN0b3IgZXJyb3JzKSB7CisgICAgICAgIFNldDxGaWVsZD4gcmV0VmFsOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXRWYWwgPSBnZXRGaWVsZHNJbnRlcm5hbChjbGF6eiwgaW5qZWN0QW5ub3RhdGlvbnMsIGVycm9ycyk7CisgICAgICAgIH0gY2F0Y2ggKE11bHRpRXhjZXB0aW9uIG1lKSB7CisgICAgICAgICAgICBlcnJvcnMuYWRkTXVsdGlFeGNlcHRpb24obWUpOworICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0aCkgeworICAgICAgICAgICAgZXJyb3JzLmFkZFRocm93YWJsZSh0aCk7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXRWYWw7CisgICAgfQorCisgICAgLyoqCisgICAgICogV2lsbCBmaW5kIGFsbCB0aGUgaW5pdGlhbGl6ZSBmaWVsZHMgaW4gdGhlIGNsYXNzLgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXp6ICAgICAgICAgICAgIHRoZSBjbGFzcyB0byBzZWFyY2ggZm9yIGZpZWxkcworICAgICAqIEBwYXJhbSBpbmplY3RBbm5vdGF0aW9ucyBhbGwgYW5ub3RhdGlvbnMgd2hpY2ggY2FuIGJlIHVzZWQgdG8gaW5qZWN0IGEgdmFsdWUuCisgICAgICogQHBhcmFtIGVycm9ycyAgICAgICAgICAgIHRoZSBlcnJvciBjb2xsZWN0b3IKKyAgICAgKiBAcmV0dXJuIEEgbm9uLW51bGwgYnV0IHBvc3NpYmx5IGVtcHR5IHNldCBvZiBpbml0aWFsaXplciBmaWVsZHMKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTZXQ8RmllbGQ+IGdldEZpZWxkc0ludGVybmFsKENsYXNzPD8+IGNsYXp6LCBTZXQ8PyBleHRlbmRzIENsYXNzPD8+PiBpbmplY3RBbm5vdGF0aW9ucywgQ29sbGVjdG9yIGVycm9ycykgeworICAgICAgICBTZXQ8RmllbGQ+IHJldFZhbCA9IG5ldyBMaW5rZWRIYXNoU2V0PD4oKTsKKworICAgICAgICBmb3IgKEZpZWxkIGZpZWxkIDogUmVmbGVjdGlvblV0aWxzLmdldEFsbEZpZWxkcyhjbGF6eikpIHsKKyAgICAgICAgICAgIGlmICghaGFzSW5qZWN0QW5ub3RhdGlvbihmaWVsZCwgaW5qZWN0QW5ub3RhdGlvbnMpKSB7CisgICAgICAgICAgICAgICAgLy8gTm90IGFuIGluaXRpYWxpemVyIGZpZWxkCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghaXNQcm9wZXJGaWVsZChmaWVsZCkpIHsKKyAgICAgICAgICAgICAgICBlcnJvcnMuYWRkVGhyb3dhYmxlKG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBmaWVsZCAiICsgUHJldHR5LmZpZWxkKGZpZWxkKQorICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG1heSBub3QgYmUgc3RhdGljLCBmaW5hbCBvciBoYXZlIGFuIEFubm90YXRpb24gdHlwZSIpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0VmFsLmFkZChmaWVsZCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmV0VmFsOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyB3aGV0aGVyIGFuIGFubm90YXRlZCBlbGVtZW50IGhhcyBhbnkgYW5ub3RhdGlvbiB0aGF0IHdhcyB1c2VkIGZvciB0aGUgaW5qZWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGFubm90YXRlZCAgICAgICAgIHRoZSBhbm5vdGF0ZWQgZWxlbWVudC4KKyAgICAgKiBAcGFyYW0gaW5qZWN0QW5ub3RhdGlvbnMgYWxsIGFubm90YXRpb25zIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGluamVjdCBhIHZhbHVlLgorICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBlbGVtZW50IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBpbmplY3QgYW5ub3RhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGhhc0luamVjdEFubm90YXRpb24oQW5ub3RhdGVkRWxlbWVudCBhbm5vdGF0ZWQsIFNldDw/IGV4dGVuZHMgQ2xhc3M8Pz4+IGluamVjdEFubm90YXRpb25zKSB7CisgICAgICAgIGZvciAoQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogYW5ub3RhdGVkLmdldEFubm90YXRpb25zKCkpIHsKKyAgICAgICAgICAgIGlmIChpbmplY3RBbm5vdGF0aW9ucy5jb250YWlucyhhbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1Byb3BlckZpZWxkKEZpZWxkIGZpZWxkKSB7CisgICAgICAgIGlmIChpc1N0YXRpYyhmaWVsZCkgfHwgaXNGaW5hbChmaWVsZCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIENsYXNzPD8+IHR5cGUgPSBmaWVsZC5nZXRUeXBlKCk7CisgICAgICAgIHJldHVybiAhdHlwZS5pc0Fubm90YXRpb24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHVuZGVybHlpbmcgbWVtYmVyIGlzIHN0YXRpYy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZW1iZXIgVGhlIG5vbi1udWxsIG1lbWJlciB0byB0ZXN0LgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWVtYmVyIGlzIHN0YXRpYy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU3RhdGljKE1lbWJlciBtZW1iZXIpIHsKKyAgICAgICAgaW50IG1vZGlmaWVycyA9IG1lbWJlci5nZXRNb2RpZmllcnMoKTsKKyAgICAgICAgcmV0dXJuICgobW9kaWZpZXJzICYgTW9kaWZpZXIuU1RBVElDKSAhPSAwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHVuZGVybHlpbmcgbWVtYmVyIGlzIGFic3RyYWN0LgorICAgICAqCisgICAgICogQHBhcmFtIG1lbWJlciBUaGUgbm9uLW51bGwgbWVtYmVyIHRvIHRlc3QuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBtZW1iZXIgaXMgYWJzdHJhY3QuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0ZpbmFsKE1lbWJlciBtZW1iZXIpIHsKKyAgICAgICAgaW50IG1vZGlmaWVycyA9IG1lbWJlci5nZXRNb2RpZmllcnMoKTsKKyAgICAgICAgcmV0dXJuICgobW9kaWZpZXJzICYgTW9kaWZpZXIuRklOQUwpICE9IDApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYWxsIGFubm90YXRpb25zIHRoYXQgY2FuIGJlIG1hbmFnZWQgdXNpbmcgcmVnaXN0ZXJlZCBhbmQgcHJvdmlkZWQge0BsaW5rIEluamVjdGlvblJlc29sdmVyIGluamVjdGlvbiByZXNvbHZlcnN9LgorICAgICAqCisgICAgICogQHBhcmFtIHJlc29sdmVycyBhbGwgcmVnaXN0ZXJlZCByZXNvbHZlcnMuCisgICAgICogQHJldHVybiBhbGwgcG9zc2libGUgaW5qZWN0aW9uIGFubm90YXRpb25zLgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4+IGdldEluamVjdEFubm90YXRpb25zKENvbGxlY3Rpb248SW5qZWN0aW9uUmVzb2x2ZXI+IHJlc29sdmVycykgeworICAgICAgICBMaXN0PENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPj4gYW5ub3RhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgZm9yIChJbmplY3Rpb25SZXNvbHZlciByZXNvbHZlciA6IHJlc29sdmVycykgeworICAgICAgICAgICAgYW5ub3RhdGlvbnMuYWRkKHJlc29sdmVyLmdldEFubm90YXRpb24oKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFubm90YXRpb25zOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFzc2lnbnMge0BsaW5rIEluamVjdGlvblJlc29sdmVyfSB0byBldmVyeSB7QGxpbmsgQW5ub3RhdGVkRWxlbWVudH0gcHJvdmlkZWQgYXMgYSBtZXRob2QgcGFyYW1ldGVyLiBJbmplY3Rpb24gcmVzb2x2ZXIKKyAgICAgKiB3aWxsIGJlIHVzZWQgZm9yIGZldGNoaW5nIHRoZSBwcm9wZXIgdmFsdWUgZHVyaW5nIHRoZSBpbmplY3Rpb24gcHJvY2Vzc2luZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbm5vdGF0ZWRFbGVtZW50cyBhbGwgYW5ub3RhdGVkIGVsZW1lbnRzIGZyb20gdGhlIGNsYXNzIHdoaWNoIHRoaXMgaW5qZWN0b3IgYmVsb25ncyB0by4KKyAgICAgKiBAcGFyYW0gcmVzb2x2ZXJzICAgICAgICAgYWxsIHJlZ2lzdGVyZWQgaW5qZWN0aW9uIHJlc29sdmVycy4KKyAgICAgKiBAcGFyYW0gPEE+ICAgICAgICAgICAgICAgdHlwZSBvZiB0aGUgYW5ub3RhdGVkIGVsZW1lbnRzLgorICAgICAqIEByZXR1cm4gaW1tdXRhYmxlIG1hcCBvZiBhbGwgZmllbGRzIGFsb25nIHdpdGggaW5qZWN0aW9uIHJlc29sdmVycyB1c2luZyB0aGF0IGNhbiBiZSBpbmplY3RlZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgPEEgZXh0ZW5kcyBBbm5vdGF0ZWRFbGVtZW50PiBNYXA8QSwgSW5qZWN0aW9uUmVzb2x2ZXI+IG1hcEVsZW1lbnRUb1Jlc29sdmVyKFNldDxBPiBhbm5vdGF0ZWRFbGVtZW50cywKKyAgICAgICAgICAgIE1hcDw/IGV4dGVuZHMgQ2xhc3M8Pz4sIEluamVjdGlvblJlc29sdmVyPiByZXNvbHZlcnMpIHsKKworICAgICAgICBNYXA8QSwgSW5qZWN0aW9uUmVzb2x2ZXI+IG1hcHBlZEVsZW1lbnRzID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBmb3IgKEEgZWxlbWVudCA6IGFubm90YXRlZEVsZW1lbnRzKSB7CisgICAgICAgICAgICBtYXBwZWRFbGVtZW50cy5wdXQoZWxlbWVudCwgZmluZFJlc29sdmVyKHJlc29sdmVycywgZWxlbWVudCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtYXBwZWRFbGVtZW50czsKKyAgICB9CisKKyAgICBzdGF0aWMgSW5qZWN0aW9uUmVzb2x2ZXIgZmluZFJlc29sdmVyKE1hcDw/IGV4dGVuZHMgQ2xhc3M8Pz4sIEluamVjdGlvblJlc29sdmVyPiByZXNvbHZlcnMsIEFubm90YXRlZEVsZW1lbnQgZWxlbWVudCkgeworICAgICAgICBmb3IgKEFubm90YXRpb24gYW5ub3RhdGlvbiA6IGVsZW1lbnQuZ2V0QW5ub3RhdGlvbnMoKSkgeworICAgICAgICAgICAgSW5qZWN0aW9uUmVzb2x2ZXIgaW5qZWN0aW9uUmVzb2x2ZXIgPSByZXNvbHZlcnMuZ2V0KGFubm90YXRpb24uYW5ub3RhdGlvblR5cGUoKSk7CisgICAgICAgICAgICBpZiAoaW5qZWN0aW9uUmVzb2x2ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBpbmplY3Rpb25SZXNvbHZlcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBtYXAgZnJvbSByZXNvbHZlcnMgd2hlcmUgdGhlIGFubm90YXRpb24gdGhhdCBpcyBoYW5kbGVkIGJ5IHJlc29sdmVyIGlzIGEga2V5IGFuZCByZXNvbHZlciBpdHNlbGYgaXMgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb2x2ZXJzIGNvbGxlY3Rpb24gb2YgcmVzb2x2ZXJzLgorICAgICAqIEByZXR1cm4gbWFwIHJlc29sdmVyIGFubm90YXRpb24gdG8gcmVzb2x2ZXIuCisgICAgICovCisgICAgc3RhdGljIE1hcDw/IGV4dGVuZHMgQ2xhc3M8Pz4sIEluamVjdGlvblJlc29sdmVyPiBtYXBBbm5vdGF0aW9uVG9SZXNvbHZlcihDb2xsZWN0aW9uPEluamVjdGlvblJlc29sdmVyPiByZXNvbHZlcnMpIHsKKyAgICAgICAgcmV0dXJuIHJlc29sdmVycy5zdHJlYW0oKS5jb2xsZWN0KENvbGxlY3RvcnMudG9NYXAoSW5qZWN0aW9uUmVzb2x2ZXI6OmdldEFubm90YXRpb24sIEZ1bmN0aW9uLmlkZW50aXR5KCkpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvaW5qZWN0b3IvSmVyc2V5Q29uc3RydWN0b3JJbmplY3Rpb25Qb2ludC5qYXZhIGIvaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL2luamVjdG9yL0plcnNleUNvbnN0cnVjdG9ySW5qZWN0aW9uUG9pbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDI5OWYxCi0tLSAvZGV2L251bGwKKysrIGIvaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL2luamVjdG9yL0plcnNleUNvbnN0cnVjdG9ySW5qZWN0aW9uUG9pbnQuamF2YQpAQCAtMCwwICsxLDE3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuY2RpLnNlLmluamVjdG9yOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQ29uc3RydWN0b3I7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUGFyYW1ldGVyOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlBhcmFtZXRlcml6ZWRUeXBlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LnNwaS5DcmVhdGlvbmFsQ29udGV4dDsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuQmVhbjsKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0ZWU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGVlSW1wbDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uUmVzb2x2ZXI7CisKK2ltcG9ydCBvcmcuamJvc3Mud2VsZC5hbm5vdGF0ZWQuZW5oYW5jZWQuRW5oYW5jZWRBbm5vdGF0ZWRDb25zdHJ1Y3RvcjsKK2ltcG9ydCBvcmcuamJvc3Mud2VsZC5pbmplY3Rpb24uQ29uc3RydWN0b3JJbmplY3Rpb25Qb2ludDsKK2ltcG9ydCBvcmcuamJvc3Mud2VsZC5pbmplY3Rpb24uSW5qZWN0aW9uUG9pbnRGYWN0b3J5OworaW1wb3J0IG9yZy5qYm9zcy53ZWxkLmluamVjdGlvbi5QYXJhbWV0ZXJJbmplY3Rpb25Qb2ludDsKK2ltcG9ydCBvcmcuamJvc3Mud2VsZC5tYW5hZ2VyLkJlYW5NYW5hZ2VySW1wbDsKKworLyoqCisgKiBDbGFzcyB0aGF0IGNyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgdXNpbmcgdGhlIHByb3ZpZGVkIGNvbnN0cnVjdG9yLCBzZWxlY3RzIGFuZCBpbmplY3RzIHRoZSB2YWx1ZXMuCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXlDb25zdHJ1Y3RvckluamVjdGlvblBvaW50PFQ+IGV4dGVuZHMgQ29uc3RydWN0b3JJbmplY3Rpb25Qb2ludDxUPiB7CisKKyAgICBwcml2YXRlIGZpbmFsIEplcnNleVByb3h5UmVzb2x2ZXIgcHJveHlSZXNvbHZlciA9IG5ldyBKZXJzZXlQcm94eVJlc29sdmVyKCk7CisKKyAgICBwcml2YXRlIExpc3Q8U3VwcGxpZXI8T2JqZWN0Pj4gY2FjaGVkU3VwcGxpZXJzOworCisgICAgcHJpdmF0ZSBPYmplY3RbXSBjYWNoZWRQcm94aWVzOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBjb25zdHJ1Y3RvciBpbmplY3Rpb24gcG9pbnQgc3VpdGFibGUgZm9yIEplcnNleSBjb21wb25lbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnN0cnVjdG9yIHJlc29sdmVkIGNvbnN0cnVjdG9yIHRoYXQgY2FuIGJlIGluamVjdGVkIHVzaW5nIEplcnNleS4KKyAgICAgKiBAcGFyYW0gYmVhbiAgICAgICAgYmVhbiBkZXNjcmlwdG9yIGRlZGljYXRlZCB0byB0aGUgcGFyZW50IGNsYXNzLgorICAgICAqIEBwYXJhbSBtYW5hZ2VyICAgICBjdXJyZW50IGJlYW4gbWFuYWdlci4KKyAgICAgKiBAcGFyYW0gcmVzb2x2ZXJzICAgYWxsIHJlZ2lzdGVyZWQgcmVzb2x2ZXJzLgorICAgICAqLworICAgIHB1YmxpYyBKZXJzZXlDb25zdHJ1Y3RvckluamVjdGlvblBvaW50KEVuaGFuY2VkQW5ub3RhdGVkQ29uc3RydWN0b3I8VD4gY29uc3RydWN0b3IsIEJlYW48VD4gYmVhbiwgQmVhbk1hbmFnZXJJbXBsIG1hbmFnZXIsCisgICAgICAgICAgICBDb2xsZWN0aW9uPEluamVjdGlvblJlc29sdmVyPiByZXNvbHZlcnMpIHsKKyAgICAgICAgc3VwZXIoY29uc3RydWN0b3IsIG51bGwsIGNvbnN0cnVjdG9yLmdldEphdmFDbGFzcygpLCBJbmplY3Rpb25Qb2ludEZhY3RvcnkuaW5zdGFuY2UoKSwgbWFuYWdlcik7CisKKyAgICAgICAgTGlzdDxJbmplY3RlZVRvU3VwcGxpZXI+IHZhbHVlU3VwcGxpZXJzID0KKyAgICAgICAgICAgICAgICBjcmVhdGVWYWx1ZVN1cHBsaWVycyhjb25zdHJ1Y3Rvci5nZXRKYXZhTWVtYmVyKCksIGdldFBhcmFtZXRlckluamVjdGlvblBvaW50cygpLCByZXNvbHZlcnMpOworCisgICAgICAgIC8qCisgICAgICAgICAqIENhY2hlcyBlaXRoZXIgY3JlYXRlZCBwcm94aWVzIGlmIHRoZSBjb21wb25lbnQgY2xhc3MgaXMgbm90IFJlcXVlc3RTY29wZWQgb3IgY2FjaGVzIHRoZSBzdXBwbGllciB0aGF0IGp1c3QgY3JlYXRlCisgICAgICAgICAqIHZhbHVlcyBldmVyeSBjb21wb25lbnQgY3JlYXRlcy4KKyAgICAgICAgICovCisgICAgICAgIGlmIChwcm94eVJlc29sdmVyLmlzUHJpeGlhYmxlKGJlYW4uZ2V0U2NvcGUoKSkpIHsKKyAgICAgICAgICAgIHRoaXMuY2FjaGVkUHJveGllcyA9IGdlbmVyYXRlUHJveGllcyh2YWx1ZVN1cHBsaWVycyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aGlzLmNhY2hlZFN1cHBsaWVycyA9IHZhbHVlU3VwcGxpZXJzLnN0cmVhbSgpCisgICAgICAgICAgICAgICAgICAgIC5tYXAoaXMgLT4gaXMuc3VwcGxpZXIpCisgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSGVscGVyIG1ldGhvZCBmb3IgZ2V0dGluZyB0aGUgY3VycmVudCBwYXJhbWV0ZXIgdmFsdWVzIGZyb20gYSBsaXN0IG9mIGFubm90YXRlZCBwYXJhbWV0ZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIG1hbmFnZXIgVGhlIEJlYW4gbWFuYWdlcgorICAgICAqIEByZXR1cm4gVGhlIG9iamVjdCBhcnJheSBvZiBsb29rZWQgdXAgdmFsdWVzCisgICAgICovCisgICAgcHVibGljIE9iamVjdFtdIGdldFBhcmFtZXRlclZhbHVlcyhCZWFuTWFuYWdlckltcGwgbWFuYWdlciwgQ3JlYXRpb25hbENvbnRleHQ8Pz4gY3R4LCBDcmVhdGlvbmFsQ29udGV4dDw/PiBjdHhUcmFuc2llbnQpIHsKKyAgICAgICAgaWYgKGNhY2hlZFByb3hpZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGdlbmVyYXRlVmFsdWVzKGNhY2hlZFN1cHBsaWVycyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gY2FjaGVkUHJveGllczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgT2JqZWN0W10gZ2VuZXJhdGVWYWx1ZXMoTGlzdDxTdXBwbGllcjxPYmplY3Q+PiBzdXBwbGllcnMpIHsKKyAgICAgICAgT2JqZWN0W10gcGFyYW1ldGVyVmFsdWVzID0gbmV3IE9iamVjdFtnZXRQYXJhbWV0ZXJJbmplY3Rpb25Qb2ludHMoKS5zaXplKCldOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcmFtZXRlclZhbHVlcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgcGFyYW1ldGVyVmFsdWVzW2ldID0gc3VwcGxpZXJzLmdldChpKS5nZXQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcGFyYW1ldGVyVmFsdWVzOworICAgIH0KKworICAgIHByaXZhdGUgT2JqZWN0W10gZ2VuZXJhdGVQcm94aWVzKExpc3Q8SW5qZWN0ZWVUb1N1cHBsaWVyPiBzdXBwbGllcnMpIHsKKyAgICAgICAgT2JqZWN0W10gcHJveGllcyA9IG5ldyBPYmplY3Rbc3VwcGxpZXJzLnNpemUoKV07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJveGllcy5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgSW5qZWN0ZWVUb1N1cHBsaWVyIGluamVjdGVlVG9TdXBwbGllciA9IHN1cHBsaWVycy5nZXQoaSk7CisgICAgICAgICAgICBpZiAoaW5qZWN0ZWVUb1N1cHBsaWVyLmluamVjdGVlLmlzUHJvdmlkZXIoKSkgeworICAgICAgICAgICAgICAgIHByb3hpZXNbaV0gPSBuZXcgUHJvdmlkZXI8T2JqZWN0PigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0KCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluamVjdGVlVG9TdXBwbGllci5zdXBwbGllci5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByb3hpZXNbaV0gPSBwcm94eVJlc29sdmVyLm5vQ2FjaGVkUHJveHkoaW5qZWN0ZWVUb1N1cHBsaWVyLmluamVjdGVlLCBpbmplY3RlZVRvU3VwcGxpZXIuc3VwcGxpZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBwcm94aWVzOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1hcHMgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIHNlbGVjdGVkIGNvbnN0cnVjdG9yIHRvIHRoZSBpbmplY3Rpb24gcmVzb2x2ZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyYW1zICAgIGFsbCBwYXJhbWV0ZXJzIG9mIGEgY29uc3RydWN0b3IuCisgICAgICogQHBhcmFtIHJlc29sdmVycyByZWdpc3RlcmVkIGluamVjdGlvbiByZXNvbHZlcnMuCisgICAgICogQHJldHVybiBtYXAgb2YgdGhlIHBhcmFtZXRlciB0byBpbmplY3Rpb24gcmVzb2x2ZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBMaXN0PEluamVjdGVlVG9TdXBwbGllcj4gY3JlYXRlVmFsdWVTdXBwbGllcnMoQ29uc3RydWN0b3I8VD4gY29uc3RydWN0b3IsCisgICAgICAgICAgICBMaXN0PFBhcmFtZXRlckluamVjdGlvblBvaW50PD8sIFQ+PiBwYXJhbXMsIENvbGxlY3Rpb248SW5qZWN0aW9uUmVzb2x2ZXI+IHJlc29sdmVycykgeworCisgICAgICAgIExpc3Q8SW5qZWN0ZWVUb1N1cHBsaWVyPiBzdXBwbGllcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTWFwPD8gZXh0ZW5kcyBDbGFzczw/PiwgSW5qZWN0aW9uUmVzb2x2ZXI+IGluamVjdEFubm90YXRpb25zID0gSW5qZWN0aW9uVXRpbHMubWFwQW5ub3RhdGlvblRvUmVzb2x2ZXIocmVzb2x2ZXJzKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIFBhcmFtZXRlciBwYXJhbWV0ZXIgPSBwYXJhbXMuZ2V0KGkpLmdldEFubm90YXRlZCgpLmdldEphdmFQYXJhbWV0ZXIoKTsKKyAgICAgICAgICAgIEluamVjdGlvblJlc29sdmVyIHJlc29sdmVyID0gSW5qZWN0aW9uVXRpbHMuZmluZFJlc29sdmVyKGluamVjdEFubm90YXRpb25zLCBwYXJhbWV0ZXIpOworICAgICAgICAgICAgSW5qZWN0ZWUgaW5qZWN0ZWUgPSBwYXJhbWV0ZXJUb0luamVjdGVlKGNvbnN0cnVjdG9yLCBwYXJhbWV0ZXIsIGkpOworICAgICAgICAgICAgc3VwcGxpZXJzLmFkZChuZXcgSW5qZWN0ZWVUb1N1cHBsaWVyKGluamVjdGVlLCAoKSAtPiByZXNvbHZlci5yZXNvbHZlKGluamVjdGVlKSkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHN1cHBsaWVyczsKKyAgICB9CisKKyAgICBwcml2YXRlIEluamVjdGVlIHBhcmFtZXRlclRvSW5qZWN0ZWUoQ29uc3RydWN0b3I8VD4gY29uc3RydWN0b3IsIFBhcmFtZXRlciBwYXJhbWV0ZXIsIGludCBwb3NpdGlvbikgeworICAgICAgICBJbmplY3RlZUltcGwgaW5qZWN0ZWUgPSBuZXcgSW5qZWN0ZWVJbXBsKCk7CisgICAgICAgIGluamVjdGVlLnNldFBhcmVudChjb25zdHJ1Y3Rvcik7CisgICAgICAgIGlmIChwYXJhbWV0ZXIuZ2V0UGFyYW1ldGVyaXplZFR5cGUoKSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRUeXBlCisgICAgICAgICAgICAgICAgJiYgSW5qZWN0aW9uVXRpbHMuaXNQcm92aWRlcihwYXJhbWV0ZXIuZ2V0UGFyYW1ldGVyaXplZFR5cGUoKSkpIHsKKyAgICAgICAgICAgIFBhcmFtZXRlcml6ZWRUeXBlIHBhcmFtVHlwZSA9IChQYXJhbWV0ZXJpemVkVHlwZSkgcGFyYW1ldGVyLmdldFBhcmFtZXRlcml6ZWRUeXBlKCk7CisgICAgICAgICAgICBpbmplY3RlZS5zZXRSZXF1aXJlZFR5cGUocGFyYW1UeXBlLmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKVswXSk7CisgICAgICAgICAgICBpbmplY3RlZS5zZXRQcm92aWRlcih0cnVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGluamVjdGVlLnNldFJlcXVpcmVkVHlwZShwYXJhbWV0ZXIuZ2V0VHlwZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpbmplY3RlZS5zZXRQb3NpdGlvbihwb3NpdGlvbik7CisgICAgICAgIHJldHVybiBpbmplY3RlZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIb2xkZXIgZm9yIEluamVjdGVlIGFuZCBTdXBwbGllciB0eXBlcy4gSW50ZXJuYWwgY2xhc3MuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSW5qZWN0ZWVUb1N1cHBsaWVyIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIEluamVjdGVlIGluamVjdGVlOworICAgICAgICBwcml2YXRlIGZpbmFsIFN1cHBsaWVyPE9iamVjdD4gc3VwcGxpZXI7CisKKyAgICAgICAgcHJpdmF0ZSBJbmplY3RlZVRvU3VwcGxpZXIoSW5qZWN0ZWUgaW5qZWN0ZWUsIFN1cHBsaWVyPE9iamVjdD4gc3VwcGxpZXIpIHsKKyAgICAgICAgICAgIHRoaXMuaW5qZWN0ZWUgPSBpbmplY3RlZTsKKyAgICAgICAgICAgIHRoaXMuc3VwcGxpZXIgPSBzdXBwbGllcjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2luamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9pbmplY3Rvci9KZXJzZXlJbmplY3Rpb25UYXJnZXQuamF2YSBiL2luamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9pbmplY3Rvci9KZXJzZXlJbmplY3Rpb25UYXJnZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTlmNjRkCi0tLSAvZGV2L251bGwKKysrIGIvaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL2luamVjdG9yL0plcnNleUluamVjdGlvblRhcmdldC5qYXZhCkBAIC0wLDAgKzEsMjkzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5jZGkuc2UuaW5qZWN0b3I7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LnNwaS5DcmVhdGlvbmFsQ29udGV4dDsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5JbmplY3Rpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkJlYW47CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkRlY29yYXRvcjsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuSW5qZWN0aW9uVGFyZ2V0OworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5JbnRlcmNlcHRvcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5jZGkuc2UuYmVhbi5CZWFuSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25SZXNvbHZlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uTGF6eVZhbHVlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5WYWx1ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uVmFsdWVzOworCitpbXBvcnQgb3JnLmpib3NzLndlbGQuYW5ub3RhdGVkLmVuaGFuY2VkLkVuaGFuY2VkQW5ub3RhdGVkQ29uc3RydWN0b3I7CitpbXBvcnQgb3JnLmpib3NzLndlbGQuYW5ub3RhdGVkLmVuaGFuY2VkLkVuaGFuY2VkQW5ub3RhdGVkTWV0aG9kOworaW1wb3J0IG9yZy5qYm9zcy53ZWxkLmFubm90YXRlZC5lbmhhbmNlZC5FbmhhbmNlZEFubm90YXRlZFR5cGU7CitpbXBvcnQgb3JnLmpib3NzLndlbGQuYmVhbi5DdXN0b21EZWNvcmF0b3JXcmFwcGVyOworaW1wb3J0IG9yZy5qYm9zcy53ZWxkLmJlYW4uRGVjb3JhdG9ySW1wbDsKK2ltcG9ydCBvcmcuamJvc3Mud2VsZC5iZWFuLnByb3h5LlByb3h5SW5zdGFudGlhdG9yOworaW1wb3J0IG9yZy5qYm9zcy53ZWxkLmluamVjdGlvbi5wcm9kdWNlci5BYnN0cmFjdEluc3RhbnRpYXRvcjsKK2ltcG9ydCBvcmcuamJvc3Mud2VsZC5pbmplY3Rpb24ucHJvZHVjZXIuQmFzaWNJbmplY3Rpb25UYXJnZXQ7CitpbXBvcnQgb3JnLmpib3NzLndlbGQuaW5qZWN0aW9uLnByb2R1Y2VyLkNvbnN0cnVjdG9ySW50ZXJjZXB0aW9uSW5zdGFudGlhdG9yOworaW1wb3J0IG9yZy5qYm9zcy53ZWxkLmluamVjdGlvbi5wcm9kdWNlci5EZWZhdWx0SW5zdGFudGlhdG9yOworaW1wb3J0IG9yZy5qYm9zcy53ZWxkLmluamVjdGlvbi5wcm9kdWNlci5JbnN0YW50aWF0b3I7CitpbXBvcnQgb3JnLmpib3NzLndlbGQuaW5qZWN0aW9uLnByb2R1Y2VyLkludGVyY2VwdGlvbk1vZGVsSW5pdGlhbGl6ZXI7CitpbXBvcnQgb3JnLmpib3NzLndlbGQuaW5qZWN0aW9uLnByb2R1Y2VyLkludGVyY2VwdG9yQXBwbHlpbmdJbnN0YW50aWF0b3I7CitpbXBvcnQgb3JnLmpib3NzLndlbGQuaW5qZWN0aW9uLnByb2R1Y2VyLlN1YmNsYXNzRGVjb3JhdG9yQXBwbHlpbmdJbnN0YW50aWF0b3I7CitpbXBvcnQgb3JnLmpib3NzLndlbGQuaW5qZWN0aW9uLnByb2R1Y2VyLlN1YmNsYXNzZWRDb21wb25lbnRJbnN0YW50aWF0b3I7CitpbXBvcnQgb3JnLmpib3NzLndlbGQuaW50ZXJjZXB0b3Iuc3BpLm1vZGVsLkludGVyY2VwdGlvbk1vZGVsOworaW1wb3J0IG9yZy5qYm9zcy53ZWxkLmxvZ2dpbmcuQmVhbkxvZ2dlcjsKK2ltcG9ydCBvcmcuamJvc3Mud2VsZC5yZXNvdXJjZXMuQ2xhc3NUcmFuc2Zvcm1lcjsKK2ltcG9ydCBvcmcuamJvc3Mud2VsZC51dGlsLnJlZmxlY3Rpb24uRm9ybWF0czsKKworLyoqCisgKiBXcmFwcGVyIGZvciB7QGxpbmsgSW5qZWN0aW9uVGFyZ2V0fSB0aGF0IGltcGxlbWVudHMgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgaW5qZWN0aW5nIHVzaW5nIEpBWC1SUyBhbm5vdGF0aW9ucyBpbnRvIHByb3ZpZGVkCisgKiBpbnN0YW5jZXMuIHtAY29kZSBEZWxlZ2F0ZX0gaXMgYSBvcmlnaW5hbCB7QGNvZGUgSW5qZWN0aW9uVGFyZ2V0fSB3aGljaCBpcyBhYmxlIHRvIGluamVjdCBvdGhlciBmaWVsZHMvcGFyYW1ldGVycyB3aGljaAorICogYXJlIG1hbmFnZWQgYnkgQ0RJLgorICogPHA+CisgKiBJbXBsZW1lbnRhdGlvbiBpcyBhbHNvIGFibGUgY3JlYXRlIHdpdGggY3VzdG9tIHtAY29kZSBqZXJzZXlDb25zdHJ1Y3Rvcn0gaWYgaXQgaXMgcHJvdmlkZWQuIFRoaXMgZnVuY3Rpb25hbGl0eSBhbGxvd3Mgb3ZlcnJpZGUKKyAqIGRlZmF1bHQgaW5zdGFudGlhdG9yIGFuZCB1c2UgdGhlIEplcnNleS1zcGVjaWZpYyBvbmUuCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXlJbmplY3Rpb25UYXJnZXQ8VD4gZXh0ZW5kcyBCYXNpY0luamVjdGlvblRhcmdldDxUPiB7CisKKyAgICBwcml2YXRlIGZpbmFsIEJlYW48VD4gYmVhbjsKKyAgICBwcml2YXRlIGZpbmFsIENsYXNzPFQ+IGNsYXp6OworICAgIHByaXZhdGUgZmluYWwgTGF6eVZhbHVlPEplcnNleUluc3RhbmNlSW5qZWN0b3I8VD4+IGluamVjdG9yOworICAgIHByaXZhdGUgZmluYWwgRW5oYW5jZWRBbm5vdGF0ZWRUeXBlPFQ+IGVuaGFuY2VkQW5ub3RhdGVkVHlwZTsKKyAgICBwcml2YXRlIENvbGxlY3Rpb248SW5qZWN0aW9uUmVzb2x2ZXI+IHJlc29sdmVyczsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgaW5qZWN0aW9uIHRhcmdldCB3aGljaCBpcyBhYmxlIHRvIGRlbGVnYXRlIGFuIGluamVjdGlvbiB0byB7QGNvZGUgZGVsZWdhdGUgaW5qZWN0aW9uIHRhcmdldH0gYW5kIGluamVjdAorICAgICAqIHRoZSBmaWVsZHMgdGhhdCBhcmUgSmVyc2V5LXNwZWNpZmljLiBUaGUgcmVzb2x2ZXJzIG11c3QgYmUgc2V0IGxhdGVyIG9uLiBDREkgd2lsbCBzZWxlY3QgaXRzIG93biBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZWxlZ2F0ZSBDREkgc3BlY2lmaWMgaW5qZWN0aW9uIHRhcmdldC4KKyAgICAgKiBAcGFyYW0gY2xhenogICAgY2xhc3MgdGhhdCB3aWxsIGJlIHNjYW5uZWQgYW5kIGluamVjdGVkLgorICAgICAqLworICAgIHB1YmxpYyBKZXJzZXlJbmplY3Rpb25UYXJnZXQoQmFzaWNJbmplY3Rpb25UYXJnZXQ8VD4gZGVsZWdhdGUsIENsYXNzPFQ+IGNsYXp6KSB7CisgICAgICAgIHRoaXMoZGVsZWdhdGUsIGRlbGVnYXRlLmdldEJlYW4oKSwgY2xhenosIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcgaW5qZWN0aW9uIHRhcmdldCB3aGljaCBpcyBhYmxlIHRvIGRlbGVnYXRlIGFuIGluamVjdGlvbiB0byB7QGNvZGUgZGVsZWdhdGUgaW5qZWN0aW9uIHRhcmdldH0gYW5kIGluamVjdAorICAgICAqIHRoZSBmaWVsZHMgdGhhdCBhcmUgSmVyc2V5LXNwZWNpZmljLiBDREkgd2lsbCBzZWxlY3QgaXRzIG93biBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZWxlZ2F0ZSAgQ0RJIHNwZWNpZmljIGluamVjdGlvbiB0YXJnZXQuCisgICAgICogQHBhcmFtIGJlYW4gICAgICBiZWFuIHdoaWNoIHRoaXMgaW5qZWN0aW9uIHRhcmdldCBiZWxvbmdzIHRvLgorICAgICAqIEBwYXJhbSBjbGF6eiAgICAgY2xhc3MgdGhhdCB3aWxsIGJlIHNjYW5uZWQgYW5kIGluamVjdGVkLgorICAgICAqIEBwYXJhbSByZXNvbHZlcnMgYWxsIHJlc29sdmVycyB0aGF0IGNhbiBwcm92aWRlIGEgdmFsdWVkIGZvciBKZXJzZXktc3BlY2lmaWMgaW5qZWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBKZXJzZXlJbmplY3Rpb25UYXJnZXQoQmFzaWNJbmplY3Rpb25UYXJnZXQ8VD4gZGVsZWdhdGUsIEJlYW48VD4gYmVhbiwgQ2xhc3M8VD4gY2xhenosCisgICAgICAgICAgICBDb2xsZWN0aW9uPEluamVjdGlvblJlc29sdmVyPiByZXNvbHZlcnMpIHsKKyAgICAgICAgdGhpcyhCZWFuSGVscGVyLmNyZWF0ZUVuaGFuY2VkQW5ub3RhdGVkVHlwZShkZWxlZ2F0ZSksIGRlbGVnYXRlLCBiZWFuLCBjbGF6eiwgcmVzb2x2ZXJzLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluamVjdGlvbiB0YXJnZXQgd2hpY2ggaXMgYWJsZSB0byBkZWxlZ2F0ZSBhbiBpbmplY3Rpb24gdG8ge0Bjb2RlIGRlbGVnYXRlIGluamVjdGlvbiB0YXJnZXR9IGFuZCBpbmplY3QKKyAgICAgKiB0aGUgZmllbGRzIHRoYXQgYXJlIEplcnNleS1zcGVjaWZpYy4gVGhpcyBtZXRob2QgYWNjZXB0cyBjdXN0b20gaW5zdGFudGlhdG9yLCBpZiB0aGUgaW5zdGFudGlhdG9yIGlzIHtAY29kZSBudWxsfQorICAgICAqIGRlZmF1bHQgb25lIGlzIGNyZWF0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYW5ub3RhdGVkVHlwZSByZXNvbHZlZCB0eXBlIG9mIHRoZSByZWdpc3RlcmVkIGJlYW4uCisgICAgICogQHBhcmFtIGRlbGVnYXRlICAgICAgQ0RJIHNwZWNpZmljIGluamVjdGlvbiB0YXJnZXQuCisgICAgICogQHBhcmFtIGJlYW4gICAgICAgICAgYmVhbiB3aGljaCB0aGlzIGluamVjdGlvbiB0YXJnZXQgYmVsb25ncyB0by4KKyAgICAgKiBAcGFyYW0gY2xhenogICAgICAgICBjbGFzcyB0aGF0IHdpbGwgYmUgc2Nhbm5lZCBhbmQgaW5qZWN0ZWQuCisgICAgICogQHBhcmFtIHJlc29sdmVycyAgICAgYWxsIHJlc29sdmVycyB0aGF0IGNhbiBwcm92aWRlIGEgdmFsdWVkIGZvciBKZXJzZXktc3BlY2lmaWMgaW5qZWN0aW9uLgorICAgICAqIEBwYXJhbSBpbnN0YW50aWF0b3IgIGRlZmF1bHQgaW5zdGFudGlhdG9yLgorICAgICAqLworICAgIHB1YmxpYyBKZXJzZXlJbmplY3Rpb25UYXJnZXQoRW5oYW5jZWRBbm5vdGF0ZWRUeXBlPFQ+IGFubm90YXRlZFR5cGUsIEJhc2ljSW5qZWN0aW9uVGFyZ2V0PFQ+IGRlbGVnYXRlLCBCZWFuPFQ+IGJlYW4sCisgICAgICAgICAgICBDbGFzczxUPiBjbGF6eiwgQ29sbGVjdGlvbjxJbmplY3Rpb25SZXNvbHZlcj4gcmVzb2x2ZXJzLCBJbnN0YW50aWF0b3I8VD4gaW5zdGFudGlhdG9yKSB7CisgICAgICAgIHN1cGVyKGFubm90YXRlZFR5cGUsCisgICAgICAgICAgICAgICAgYmVhbiwKKyAgICAgICAgICAgICAgICBkZWxlZ2F0ZS5nZXRCZWFuTWFuYWdlcigpLAorICAgICAgICAgICAgICAgIGRlbGVnYXRlLmdldEluamVjdG9yKCksCisgICAgICAgICAgICAgICAgZGVsZWdhdGUuZ2V0TGlmZWN5Y2xlQ2FsbGJhY2tJbnZva2VyKCksCisgICAgICAgICAgICAgICAgaW5zdGFudGlhdG9yKTsKKworICAgICAgICB0aGlzLmJlYW4gPSBiZWFuOworICAgICAgICB0aGlzLmVuaGFuY2VkQW5ub3RhdGVkVHlwZSA9IGFubm90YXRlZFR5cGU7CisgICAgICAgIHRoaXMuY2xhenogPSBjbGF6ejsKKyAgICAgICAgdGhpcy5yZXNvbHZlcnMgPSByZXNvbHZlcnM7CisgICAgICAgIHRoaXMuaW5qZWN0b3IgPSBWYWx1ZXMubGF6eSgoVmFsdWU8SmVyc2V5SW5zdGFuY2VJbmplY3RvcjxUPj4pICgpIC0+IG5ldyBKZXJzZXlJbnN0YW5jZUluamVjdG9yPD4oYmVhbiwgdGhpcy5yZXNvbHZlcnMpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBpbmplY3QoVCBpbnN0YW5jZSwgQ3JlYXRpb25hbENvbnRleHQ8VD4gY3R4KSB7CisgICAgICAgIC8qCisgICAgICAgICAqIElmIGFuIGluc3RhbmNlIGNvbnRhaW5zIGFueSBmaWVsZHMgd2hpY2ggYmUgaW5qZWN0ZWQgYnkgSmVyc2V5IHRoZW4gSmVyc2V5IGF0dGVtcHRzIHRvIGluamVjdCB0aGVtIHVzaW5nIGFubm90YXRpb25zCisgICAgICAgICAqIHJldHJpZXZlcyBmcm9tIHJlZ2lzdGVyZWQgSW5qZWN0aW9uUmVzb2x2ZXJzLgorICAgICAgICAgKi8KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGluamVjdG9yLmdldCgpLmluamVjdChpbnN0YW5jZSk7CisgICAgICAgIH0gY2F0Y2ggKFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHdhZSkgeworICAgICAgICAgICAgdGhyb3cgd2FlOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbmplY3Rpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICJFeGNlcHRpb24gb2NjdXJyZWQgZHVyaW5nIEplcnNleS9KQVgtUlMgYW5ub3RhdGlvbnMgcHJvY2Vzc2luZyBpbiB0aGUgY2xhc3M6ICIgKyBjbGF6eiwgY2F1c2UpOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlIHJlc3Qgb2YgdGhlIGZpZWxkcyAoYW5ub3RhdGVkIGJ5IEBJbmplY3QpIGFyZSBpbmplY3RlZCB1c2luZyBDREkuCisgICAgICAgICAqLworICAgICAgICBzdXBlci5pbmplY3QoaW5zdGFuY2UsIGN0eCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29waWVkIG1ldGhvZCBmcm9tIHRoZSBwYXJlbnQgY2xhc3MgYmVjYXVzZSBvZiBhIGN1c3RvbSB0eXBlIG9mIHtAbGluayBJbnN0YW50aWF0b3J9IGlzIHVzZWQgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbm5vdGF0ZWRUeXBlIHByb2Nlc3NlZCBjbGFzcy4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplQWZ0ZXJCZWFuRGlzY292ZXJ5KEVuaGFuY2VkQW5ub3RhdGVkVHlwZTxUPiBhbm5vdGF0ZWRUeXBlKSB7CisgICAgICAgIGluaXRpYWxpemVJbnRlcmNlcHRpb25Nb2RlbChhbm5vdGF0ZWRUeXBlKTsKKworICAgICAgICBJbnRlcmNlcHRpb25Nb2RlbCBpbnRlcmNlcHRpb25Nb2RlbCA9IG51bGw7CisgICAgICAgIGlmIChpc0ludGVyY2VwdGlvbkNhbmRpZGF0ZSgpKSB7CisgICAgICAgICAgICBpbnRlcmNlcHRpb25Nb2RlbCA9IGJlYW5NYW5hZ2VyLmdldEludGVyY2VwdG9yTW9kZWxSZWdpc3RyeSgpLmdldChnZXRUeXBlKCkpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gaGFzTm9uQ29uc3RydWN0b3JJbnRlcmNlcHRvcnMgPSBpbnRlcmNlcHRpb25Nb2RlbCAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgKGludGVyY2VwdGlvbk1vZGVsLmhhc0V4dGVybmFsTm9uQ29uc3RydWN0b3JJbnRlcmNlcHRvcnMoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGludGVyY2VwdGlvbk1vZGVsLmhhc1RhcmdldENsYXNzSW50ZXJjZXB0b3JzKCkpOworCisgICAgICAgIExpc3Q8RGVjb3JhdG9yPD8+PiBkZWNvcmF0b3JzID0gbnVsbDsKKyAgICAgICAgaWYgKGdldEJlYW4oKSAhPSBudWxsICYmIGlzSW50ZXJjZXB0aW9uQ2FuZGlkYXRlKCkpIHsKKyAgICAgICAgICAgIGRlY29yYXRvcnMgPSBiZWFuTWFuYWdlci5yZXNvbHZlRGVjb3JhdG9ycyhnZXRCZWFuKCkuZ2V0VHlwZXMoKSwgZ2V0QmVhbigpLmdldFF1YWxpZmllcnMoKSk7CisgICAgICAgIH0KKyAgICAgICAgYm9vbGVhbiBoYXNEZWNvcmF0b3JzID0gZGVjb3JhdG9ycyAhPSBudWxsICYmICFkZWNvcmF0b3JzLmlzRW1wdHkoKTsKKyAgICAgICAgaWYgKGhhc0RlY29yYXRvcnMpIHsKKyAgICAgICAgICAgIGNoZWNrRGVjb3JhdGVkTWV0aG9kcyhhbm5vdGF0ZWRUeXBlLCBkZWNvcmF0b3JzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChoYXNOb25Db25zdHJ1Y3RvckludGVyY2VwdG9ycyB8fCBoYXNEZWNvcmF0b3JzKSB7CisgICAgICAgICAgICBpZiAoIShnZXRJbnN0YW50aWF0b3IoKSBpbnN0YW5jZW9mIERlZmF1bHRJbnN0YW50aWF0b3I8Pz4pKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBpbnN0YW50aWF0b3IgIiArIGdldEluc3RhbnRpYXRvcigpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENhc3RpbmcgY2hhbmdlZCBmcm9tIERlZmF1bHRJbnN0YW50aWF0b3IgdG8gYSBtb3JlIGFic3RyYWN0IG9uZSBiZWNhdXNlIG9mIHVzaW5nIG91ciBjdXN0b20gSmVyc2V5SW5zdGFudGlhdG9yLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBBYnN0cmFjdEluc3RhbnRpYXRvcjxUPiBkZWxlZ2F0ZSA9IChBYnN0cmFjdEluc3RhbnRpYXRvcjxUPikgZ2V0SW5zdGFudGlhdG9yKCk7CisgICAgICAgICAgICBzZXRJbnN0YW50aWF0b3IoCisgICAgICAgICAgICAgICAgICAgIFN1YmNsYXNzZWRDb21wb25lbnRJbnN0YW50aWF0b3IuZm9ySW50ZXJjZXB0ZWREZWNvcmF0ZWRCZWFuKGFubm90YXRlZFR5cGUsIGdldEJlYW4oKSwgZGVsZWdhdGUsIGJlYW5NYW5hZ2VyKSk7CisKKyAgICAgICAgICAgIGlmIChoYXNEZWNvcmF0b3JzKSB7CisgICAgICAgICAgICAgICAgc2V0SW5zdGFudGlhdG9yKG5ldyBTdWJjbGFzc0RlY29yYXRvckFwcGx5aW5nSW5zdGFudGlhdG9yPD4oCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRCZWFuTWFuYWdlcigpLmdldENvbnRleHRJZCgpLCBnZXRJbnN0YW50aWF0b3IoKSwgZ2V0QmVhbigpLCBkZWNvcmF0b3JzKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChoYXNOb25Db25zdHJ1Y3RvckludGVyY2VwdG9ycykgeworICAgICAgICAgICAgICAgIHNldEluc3RhbnRpYXRvcihuZXcgSW50ZXJjZXB0b3JBcHBseWluZ0luc3RhbnRpYXRvcjw+KAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SW5zdGFudGlhdG9yKCksIGludGVyY2VwdGlvbk1vZGVsLCBnZXRUeXBlKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChpc0ludGVyY2VwdGlvbkNhbmRpZGF0ZSgpKSB7CisgICAgICAgICAgICBzZXR1cENvbnN0cnVjdG9ySW50ZXJjZXB0aW9uSW5zdGFudGlhdG9yKGludGVyY2VwdGlvbk1vZGVsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXR1cENvbnN0cnVjdG9ySW50ZXJjZXB0aW9uSW5zdGFudGlhdG9yKEludGVyY2VwdGlvbk1vZGVsIGludGVyY2VwdGlvbk1vZGVsKSB7CisgICAgICAgIGlmIChpbnRlcmNlcHRpb25Nb2RlbCAhPSBudWxsICYmIGludGVyY2VwdGlvbk1vZGVsLmhhc0V4dGVybmFsQ29uc3RydWN0b3JJbnRlcmNlcHRvcnMoKSkgeworICAgICAgICAgICAgc2V0SW5zdGFudGlhdG9yKG5ldyBDb25zdHJ1Y3RvckludGVyY2VwdGlvbkluc3RhbnRpYXRvcjw+KGdldEluc3RhbnRpYXRvcigpLCBpbnRlcmNlcHRpb25Nb2RlbCwgZ2V0VHlwZSgpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tOb0FyZ3NDb25zdHJ1Y3RvcihFbmhhbmNlZEFubm90YXRlZFR5cGU8VD4gdHlwZSkgeworICAgICAgICBpZiAoIWJlYW5NYW5hZ2VyLmdldFNlcnZpY2VzKCkuZ2V0KFByb3h5SW5zdGFudGlhdG9yLmNsYXNzKS5pc1VzaW5nQ29uc3RydWN0b3IoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEVuaGFuY2VkQW5ub3RhdGVkQ29uc3RydWN0b3I8VD4gY29uc3RydWN0b3IgPSB0eXBlLmdldE5vQXJnc0VuaGFuY2VkQ29uc3RydWN0b3IoKTsKKyAgICAgICAgaWYgKGNvbnN0cnVjdG9yID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IEJlYW5Mb2dnZXIuTE9HLmRlY29yYXRlZEhhc05vTm9hcmdzQ29uc3RydWN0b3IodGhpcyk7CisgICAgICAgIH0gZWxzZSBpZiAoY29uc3RydWN0b3IuaXNQcml2YXRlKCkpIHsKKyAgICAgICAgICAgIHRocm93IEJlYW5Mb2dnZXIuTE9HCisgICAgICAgICAgICAgICAgICAgIC5kZWNvcmF0ZWROb2FyZ3NDb25zdHJ1Y3RvcklzUHJpdmF0ZSh0aGlzLCBGb3JtYXRzLmZvcm1hdEFzU3RhY2tUcmFjZUVsZW1lbnQoY29uc3RydWN0b3IuZ2V0SmF2YU1lbWJlcigpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tEZWNvcmF0ZWRNZXRob2RzKEVuaGFuY2VkQW5ub3RhdGVkVHlwZTxUPiB0eXBlLCBMaXN0PERlY29yYXRvcjw/Pj4gZGVjb3JhdG9ycykgeworICAgICAgICBpZiAodHlwZS5pc0ZpbmFsKCkpIHsKKyAgICAgICAgICAgIHRocm93IEJlYW5Mb2dnZXIuTE9HLmZpbmFsQmVhbkNsYXNzV2l0aERlY29yYXRvcnNOb3RBbGxvd2VkKHRoaXMpOworICAgICAgICB9CisgICAgICAgIGNoZWNrTm9BcmdzQ29uc3RydWN0b3IodHlwZSk7CisgICAgICAgIGZvciAoRGVjb3JhdG9yPD8+IGRlY29yYXRvciA6IGRlY29yYXRvcnMpIHsKKyAgICAgICAgICAgIEVuaGFuY2VkQW5ub3RhdGVkVHlwZTw/PiBkZWNvcmF0b3JDbGFzczsKKyAgICAgICAgICAgIGlmIChkZWNvcmF0b3IgaW5zdGFuY2VvZiBEZWNvcmF0b3JJbXBsPD8+KSB7CisgICAgICAgICAgICAgICAgRGVjb3JhdG9ySW1wbDw/PiBkZWNvcmF0b3JCZWFuID0gKERlY29yYXRvckltcGw8Pz4pIGRlY29yYXRvcjsKKyAgICAgICAgICAgICAgICBkZWNvcmF0b3JDbGFzcyA9IGRlY29yYXRvckJlYW4uZ2V0QmVhbk1hbmFnZXIoKS5nZXRTZXJ2aWNlcygpLmdldChDbGFzc1RyYW5zZm9ybWVyLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldEVuaGFuY2VkQW5ub3RhdGVkVHlwZShkZWNvcmF0b3JCZWFuLmdldEFubm90YXRlZCgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVjb3JhdG9yIGluc3RhbmNlb2YgQ3VzdG9tRGVjb3JhdG9yV3JhcHBlcjw/PikgeworICAgICAgICAgICAgICAgIGRlY29yYXRvckNsYXNzID0gKChDdXN0b21EZWNvcmF0b3JXcmFwcGVyPD8+KSBkZWNvcmF0b3IpLmdldEVuaGFuY2VkQW5ub3RhdGVkKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IEJlYW5Mb2dnZXIuTE9HLm5vbkNvbnRhaW5lckRlY29yYXRvcihkZWNvcmF0b3IpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKEVuaGFuY2VkQW5ub3RhdGVkTWV0aG9kPD8sID8+IGRlY29yYXRvck1ldGhvZCA6IGRlY29yYXRvckNsYXNzLmdldEVuaGFuY2VkTWV0aG9kcygpKSB7CisgICAgICAgICAgICAgICAgRW5oYW5jZWRBbm5vdGF0ZWRNZXRob2Q8PywgPz4gbWV0aG9kID0gdHlwZS5nZXRFbmhhbmNlZE1ldGhvZChkZWNvcmF0b3JNZXRob2QuZ2V0U2lnbmF0dXJlKCkpOworICAgICAgICAgICAgICAgIGlmIChtZXRob2QgIT0gbnVsbCAmJiAhbWV0aG9kLmlzU3RhdGljKCkgJiYgIW1ldGhvZC5pc1ByaXZhdGUoKSAmJiBtZXRob2QuaXNGaW5hbCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IEJlYW5Mb2dnZXIuTE9HLmZpbmFsQmVhbkNsYXNzV2l0aEludGVyY2VwdG9yc05vdEFsbG93ZWQodGhpcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVJbnRlcmNlcHRpb25Nb2RlbChFbmhhbmNlZEFubm90YXRlZFR5cGU8VD4gYW5ub3RhdGVkVHlwZSkgeworICAgICAgICBBYnN0cmFjdEluc3RhbnRpYXRvcjxUPiBpbnN0YW50aWF0b3IgPSAoQWJzdHJhY3RJbnN0YW50aWF0b3I8VD4pIGdldEluc3RhbnRpYXRvcigpOworICAgICAgICBpZiAoaW5zdGFudGlhdG9yLmdldENvbnN0cnVjdG9ySW5qZWN0aW9uUG9pbnQoKSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47IC8vIHRoaXMgaXMgYSBub24tcHJvZHVjaWJsZSBJbmplY3Rpb25UYXJnZXQgKG9ubHkgY3JlYXRlZCB0byBpbmplY3QgZXhpc3RpbmcgaW5zdGFuY2VzKQorICAgICAgICB9CisgICAgICAgIGlmIChpc0ludGVyY2VwdGlvbkNhbmRpZGF0ZSgpICYmICFiZWFuTWFuYWdlci5nZXRJbnRlcmNlcHRvck1vZGVsUmVnaXN0cnkoKS5jb250YWluc0tleShnZXRUeXBlKCkpKSB7CisgICAgICAgICAgICBidWlsZEludGVyY2VwdGlvbk1vZGVsKGFubm90YXRlZFR5cGUsIGluc3RhbnRpYXRvcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYnVpbGRJbnRlcmNlcHRpb25Nb2RlbChFbmhhbmNlZEFubm90YXRlZFR5cGU8VD4gYW5ub3RhdGVkVHlwZSwgQWJzdHJhY3RJbnN0YW50aWF0b3I8VD4gaW5zdGFudGlhdG9yKSB7CisgICAgICAgIG5ldyBJbnRlcmNlcHRpb25Nb2RlbEluaXRpYWxpemVyPD4oYmVhbk1hbmFnZXIsIGFubm90YXRlZFR5cGUsIGFubm90YXRlZFR5cGUuZ2V0RGVjbGFyZWRFbmhhbmNlZENvbnN0cnVjdG9yKAorICAgICAgICAgICAgICAgIGluc3RhbnRpYXRvci5nZXRDb25zdHJ1Y3RvckluamVjdGlvblBvaW50KCkuZ2V0U2lnbmF0dXJlKCkpLCBnZXRCZWFuKCkpLmluaXQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gaXNJbnRlcmNlcHRvcigpIHsKKyAgICAgICAgcmV0dXJuIChnZXRCZWFuKCkgaW5zdGFuY2VvZiBJbnRlcmNlcHRvcjw/PikgfHwgZ2V0VHlwZSgpLmlzQW5ub3RhdGlvblByZXNlbnQoamF2YXguaW50ZXJjZXB0b3IuSW50ZXJjZXB0b3IuY2xhc3MpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc0RlY29yYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIChnZXRCZWFuKCkgaW5zdGFuY2VvZiBEZWNvcmF0b3I8Pz4pIHx8IGdldFR5cGUoKS5pc0Fubm90YXRpb25QcmVzZW50KGphdmF4LmRlY29yYXRvci5EZWNvcmF0b3IuY2xhc3MpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc0ludGVyY2VwdGlvbkNhbmRpZGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuICFpc0ludGVyY2VwdG9yKCkgJiYgIWlzRGVjb3JhdG9yKCkgJiYgIU1vZGlmaWVyLmlzQWJzdHJhY3QoZ2V0VHlwZSgpLmdldEphdmFDbGFzcygpLmdldE1vZGlmaWVycygpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQmVhbjxUPiBnZXRCZWFuKCkgeworICAgICAgICByZXR1cm4gdGhpcy5iZWFuOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluIHNvbWUgY2FzZXMgSW5qZWN0aW9uIFJlc29sdmVycyBjYW5ub3QgYmUgcHJvdmlkZWQgZHVyaW5nIHRoIGNyZWF0aW9uIG9mIHRoZSBvYmplY3QgdGhlcmVmb3JlIG11c3QgYmUgc2V0IGxhdGVyIG9uLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc29sdmVycyBhbGwgcmVnaXN0ZXJlZCBpbmplY3Rpb24gcmVzb2x2ZXJzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEluamVjdGlvblJlc29sdmVycyhDb2xsZWN0aW9uPEluamVjdGlvblJlc29sdmVyPiByZXNvbHZlcnMpIHsKKyAgICAgICAgdGhpcy5yZXNvbHZlcnMgPSByZXNvbHZlcnM7CisgICAgfQorCisgICAgcHVibGljIEVuaGFuY2VkQW5ub3RhdGVkVHlwZTxUPiBnZXRFbmhhbmNlZEFubm90YXRlZFR5cGUoKSB7CisgICAgICAgIHJldHVybiBlbmhhbmNlZEFubm90YXRlZFR5cGU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL2luamVjdG9yL0plcnNleUluc3RhbmNlSW5qZWN0b3IuamF2YSBiL2luamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9pbmplY3Rvci9KZXJzZXlJbnN0YW5jZUluamVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJhN2NjNwotLS0gL2Rldi9udWxsCisrKyBiL2luamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9pbmplY3Rvci9KZXJzZXlJbnN0YW5jZUluamVjdG9yLmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuY2RpLnNlLmluamVjdG9yOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkJlYW47CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uUmVzb2x2ZXI7CisKKy8qKgorICogQ2xhc3MgdGhhdCBhY2NlcHRzIGFsbCByZWdpc3RlcmVkIHtAbGluayBJbmplY3Rpb25SZXNvbHZlcn0gYW5kIGluamVjdCBhbGwgcG9zc2libGUgdmFsdWVzIGFubm90YXRlZCBieSBKQVgtUlMgYW5ub3RhdGlvbnMKKyAqIGludG8gcHJvdmlkZWQgaW5zdGFuY2UgaW4ge0BsaW5rICNpbmplY3QoT2JqZWN0KX0uCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK2NsYXNzIEplcnNleUluc3RhbmNlSW5qZWN0b3I8VD4geworCisgICAgcHJpdmF0ZSBmaW5hbCBCZWFuPFQ+IGJlYW47CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8RmllbGQsIEluamVjdGlvblJlc29sdmVyPiBjYWNoZWRGaWVsZHM7CisKKyAgICBwcml2YXRlIGZpbmFsIEplcnNleVByb3h5UmVzb2x2ZXIgcHJveHlSZXNvbHZlciA9IG5ldyBKZXJzZXlQcm94eVJlc29sdmVyKCk7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciB0aGF0IGNyZWF0ZXMgYSBuZXcgY2xhc3MgaW5qZWN0b3IgZm9yIHRoZSBnaXZlbiBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiZWFuICAgICAgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGluamVjdGVkIGNsYXNzLgorICAgICAqIEBwYXJhbSByZXNvbHZlcnMgYWxsIHJlc29sdmVycyB3aGljaCBhcmUgcmVnaXN0ZXJlZCBpbiB0aGUgYXBwbGljYXRpb24uCisgICAgICovCisgICAgSmVyc2V5SW5zdGFuY2VJbmplY3RvcihCZWFuPFQ+IGJlYW4sIENvbGxlY3Rpb248SW5qZWN0aW9uUmVzb2x2ZXI+IHJlc29sdmVycykgeworICAgICAgICB0aGlzLmJlYW4gPSBiZWFuOworICAgICAgICB0aGlzLmNhY2hlZEZpZWxkcyA9IGFuYWx5emVGaWVsZHMoYmVhbi5nZXRCZWFuQ2xhc3MoKSwgcmVzb2x2ZXJzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUYWtlcyBhbiBpbnN0YW5jZSBhbiBpbmplY3QgdGhlIGFubm90YXRlZCBmaWVsZCB3aGljaCB3ZXJlIGFuYWx5emVkIGR1cmluZyB0aGUgaW5qZWN0b3IgY29uc3RydWN0aW9uIGluIG1ldGhvZAorICAgICAqIHtAbGluayAjYW5hbHl6ZUZpZWxkcyhDbGFzcywgQ29sbGVjdGlvbil9LgorICAgICAqCisgICAgICogQHBhcmFtIGluamVjdE1lIGFuIGluc3RhbmNlIGludG8gd2hpY2ggdGhlIHZhbHVlcyB3aWxsIGJlIGluamVjdGVkLgorICAgICAqLworICAgIHZvaWQgaW5qZWN0KFQgaW5qZWN0TWUpIHsKKyAgICAgICAgSW5qZWN0aW9uVXRpbHMuanVzdEluamVjdChpbmplY3RNZSwgYmVhbiwgY2FjaGVkRmllbGRzLCBwcm94eVJlc29sdmVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUYWtlcyBhIGNsYXNzIGFuZCByZXR1cm5zIGFsbCBmaWVsZHMgYWxvbmcgd2l0aCB7QGxpbmsgSW5qZWN0aW9uUmVzb2x2ZXJ9IHdoaWNoIHdpbGwgYmUgdXNlZCBmb3IgaW5qZWN0aW9uIGR1cmluZyBpbmplY3Rpb24KKyAgICAgKiBwcm9jZXNzLgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXp6ICAgICBjbGFzcyB0byBiZSBhbmFseXplZC4KKyAgICAgKiBAcGFyYW0gcmVzb2x2ZXJzIGFsbCByZWdpc3RlcmVkIGluamVjdGlvbiByZXNvbHZlcnMuCisgICAgICogQHJldHVybiBpbW11dGFibGUgbWFwIG9mIGFsbCBmaWVsZHMgYWxvbmcgd2l0aCBpbmplY3Rpb24gcmVzb2x2ZXJzIHVzaW5nIHRoYXQgY2FuIGJlIGluamVjdGVkLgorICAgICAqLworICAgIHByaXZhdGUgTWFwPEZpZWxkLCBJbmplY3Rpb25SZXNvbHZlcj4gYW5hbHl6ZUZpZWxkcyhDbGFzczw/PiBjbGF6eiwgQ29sbGVjdGlvbjxJbmplY3Rpb25SZXNvbHZlcj4gcmVzb2x2ZXJzKSB7CisgICAgICAgIE1hcDw/IGV4dGVuZHMgQ2xhc3M8Pz4sIEluamVjdGlvblJlc29sdmVyPiBpbmplY3RBbm5vdGF0aW9ucyA9IEluamVjdGlvblV0aWxzLm1hcEFubm90YXRpb25Ub1Jlc29sdmVyKHJlc29sdmVycyk7CisKKyAgICAgICAgQ29sbGVjdG9yIGNvbGxlY3RvciA9IG5ldyBDb2xsZWN0b3IoKTsKKyAgICAgICAgU2V0PEZpZWxkPiBmaWVsZHMgPSBJbmplY3Rpb25VdGlscy5nZXRGaWVsZHMoY2xhenosIGluamVjdEFubm90YXRpb25zLmtleVNldCgpLCBjb2xsZWN0b3IpOworICAgICAgICBjb2xsZWN0b3IudGhyb3dJZkVycm9ycygpOworICAgICAgICByZXR1cm4gSW5qZWN0aW9uVXRpbHMubWFwRWxlbWVudFRvUmVzb2x2ZXIoZmllbGRzLCBpbmplY3RBbm5vdGF0aW9ucyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL2luamVjdG9yL0plcnNleVByb3h5UmVzb2x2ZXIuamF2YSBiL2luamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9pbmplY3Rvci9KZXJzZXlQcm94eVJlc29sdmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU4OGVjMwotLS0gL2Rldi9udWxsCisrKyBiL2luamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9pbmplY3Rvci9KZXJzZXlQcm94eVJlc29sdmVyLmphdmEKQEAgLTAsMCArMSwxOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0LmNkaS5zZS5pbmplY3RvcjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQW5ub3RhdGVkRWxlbWVudDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uSGFuZGxlcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUGFyYW1ldGVyaXplZFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuUHJveHk7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LlJlcXVlc3RTY29wZWQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0ZWU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvblJlc29sdmVyOworCisvKioKKyAqIENsYXNzIHdvcmtpbmcgd2l0aCBKQVgtUlMvSmVyc2V5IHR5cGVzIGluamVjdGVkIHVzaW5nIHtAbGluayBqYXZheC53cy5ycy5jb3JlLkNvbnRleHR9IGFubm90YXRpb24gYW5kIGFsbCBvdGhlciB0eXBlcyB3aGljaAorICogY2FuIGJlIGluamVjdGVkIHVzaW5nIHVzaW5nIG90aGVyIHtAY29kZSAqUGFyYW19IGFubm90YXRpb25zLgorICogPHA+CisgKiBQcm9jZXNzZWQgSkFYLVJTIGludGVyZmFjZXM6CisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKiBAc2VlIGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbworICogQHNlZSBqYXZheC53cy5ycy5jb3JlLlJlcXVlc3QKKyAqIEBzZWUgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVycworICogQHNlZSBqYXZheC53cy5ycy5jb3JlLlNlY3VyaXR5Q29udGV4dAorICogQHNlZSBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb24KKyAqIEBzZWUgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbiBub3QgcHJveGlhYmxlIGJlY2F1c2UgaXMgcmVnaXN0ZXJlZCBhcyBhIHNpbmdsZXRvbi4KKyAqIEBzZWUgamF2YXgud3MucnMuZXh0LlByb3ZpZGVycworICovCitwdWJsaWMgY2xhc3MgSmVyc2V5UHJveHlSZXNvbHZlciB7CisKKyAgICAvKioKKyAgICAgKiBDb250YWlucyBhbHJlYWR5IGNyZWF0ZWQgcHJveGllcyBmb3IgdGhlIGdpdmVuIHR5cGUuCisgICAgICogZS5nLiBpZiB0aGUgcHJveHkgaGFzIGJlZW4gYWxyZWFkeSBjcmVhdGVkIGZvciB7QGNvZGUgVXJpSW5mb30gZG9uJ3QgY3JlYXRlIGEgbmV3IG9uZSBhbmQgcmV1c2UgdGhlIGV4aXN0aW5nIG9uZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIENvbmN1cnJlbnRIYXNoTWFwPEFubm90YXRlZEVsZW1lbnQsIE9iamVjdD4gY2FjaGVkUHJveGllcyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDw+KCk7CisKKyAgICAvKioKKyAgICAgKiBDbGFzc2VzIGluIHdoaWNoIGlzIG5vdCBuZWVkZWQgdG8gdXNlIGEgcHJveHkgYmVjYXVzZSB0aGV5IGFyZSBzaW5nbGV0b25zLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3Q8Q2xhc3M8Pz4+IElHTk9SRURfQ0xBU1NFUyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoQXBwbGljYXRpb24uY2xhc3MpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgb25lIG9mIHRoZSBwcm94aWFibGUgYW5ub3RhdGlvbnMgaXMgcHJlc2VudCBvbiB0aGUgY2xhenogaW50byB3aGljaCB2YWx1ZXMgYXJlIGluamVjdGVkLgorICAgICAqIDxwPgorICAgICAqIEluIHRoZXNlIGNhc2VzIHRoZSB2YWx1ZSBpcyBub3QgcHJveGlhYmxlOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+Q2xhc3Mgd2l0aG91dCB0aGUgYW5ub3RhdGlvbjwvbGk+CisgICAgICogPGxpPkNsYXNzIGFubm90YXRlZCBieSB7QGxpbmsgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LlJlcXVlc3RTY29wZWR9PC9saT4KKyAgICAgKiA8bGk+Q2xhc3MgYW5ub3RhdGVkIGJ5IHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLmludGVybmFsLlJlcXVlc3RTY29wZWR9PC9saT4KKyAgICAgKiA8dWwvPgorICAgICAqCisgICAgICogQHBhcmFtIGluamVjdGVlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBpbmplY3Rpb24gcG9pbnQuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgY29udGFpbnMgb25lIHByb3hpYWJsZSBhbm5vdGF0aW9uIGF0IGxlYXN0LgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUHJpeGlhYmxlKEluamVjdGVlIGluamVjdGVlKSB7CisgICAgICAgIHJldHVybiAhaWdub3JlZENsYXNzKGluamVjdGVlLmdldFJlcXVpcmVkVHlwZSgpKSAmJiBpc1ByaXhpYWJsZShpbmplY3RlZS5nZXRQYXJlbnRDbGFzc1Njb3BlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIG9uZSBvZiB0aGUgcHJveGlhYmxlIGFubm90YXRpb25zIGlzIHByZXNlbnQgb24gdGhlIGNsYXp6LgorICAgICAqIDxwPgorICAgICAqIEluIHRoZXNlIGNhc2VzIHRoZSB2YWx1ZSBpcyBub3QgcHJveGlhYmxlOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+Q2xhc3Mgd2l0aG91dCB0aGUgYW5ub3RhdGlvbjwvbGk+CisgICAgICogPGxpPkNsYXNzIGFubm90YXRlZCBieSB7QGxpbmsgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LlJlcXVlc3RTY29wZWR9PC9saT4KKyAgICAgKiA8bGk+Q2xhc3MgYW5ub3RhdGVkIGJ5IHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLmludGVybmFsLlJlcXVlc3RTY29wZWR9PC9saT4KKyAgICAgKiA8dWwvPgorICAgICAqCisgICAgICogQHBhcmFtIHNjb3BlQW5ub3RhdGlvbiBhbm5vdGF0aW9uIGJlbG9uZ2luZyB0byB0aGUgc2NvcGUgb2YgdGhlIGNsYXNzLgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGNvbnRhaW5zIG9uZSBwcm94aWFibGUgYW5ub3RhdGlvbiBhdCBsZWFzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ByaXhpYWJsZShDbGFzczw/IGV4dGVuZHMgQW5ub3RhdGlvbj4gc2NvcGVBbm5vdGF0aW9uKSB7CisgICAgICAgIHJldHVybiBpZ25vcmVQcm94eSgpLnN0cmVhbSgpLm5vbmVNYXRjaChpZ25vcmVkQW5ub3RhdGlvbiAtPiBpZ25vcmVkQW5ub3RhdGlvbiA9PSBzY29wZUFubm90YXRpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBwcm94eSAobmV3bHkgY3JlYXRlZCBvciBjYWNoZWQpIHdoaWNoIGlzIGFibGUgdG8gY2FsbCB7QGxpbmsgSW5qZWN0aW9uUmVzb2x2ZXJ9IHdpdGggdGhlIGdpdmVuIHtAbGluayBJbmplY3RlZX0KKyAgICAgKiB0byBnZXQgdGhlIHZhbHVlIGluIHByb3BlciBzY29wZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmplY3RlZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW5qZWN0aW9uIHBvaW50LgorICAgICAqIEBwYXJhbSByZXNvbHZlciBkZWRpY2F0ZWQgcmVzb2x2ZXIgd2hpY2ggZmluZCB0aGUgdmFsdWUuCisgICAgICogQHJldHVybiBjcmVhdGVkIHByb3h5IHdoaWNoIHJlc29sdmUgdGhlIHZhbHVlIGluIHRoZSBwcm9wZXIgc2NvcGUuCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBwcm94eShJbmplY3RlZSBpbmplY3RlZSwgSW5qZWN0aW9uUmVzb2x2ZXIgcmVzb2x2ZXIpIHsKKyAgICAgICAgcmV0dXJuIGNhY2hlZFByb3hpZXMuY29tcHV0ZUlmQWJzZW50KGluamVjdGVlLmdldFBhcmVudCgpLCB0eXBlIC0+IGNyZWF0ZVByb3h5KGluamVjdGVlLCByZXNvbHZlcikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBwcm94eSAobmV3bHkgY3JlYXRlZCBvciBjYWNoZWQpIHdoaWNoIGlzIGFibGUgdG8gY2FsbCB0aGUgZ2l2ZW4ge0BsaW5rIFN1cHBsaWVyfS4gVGhpcyBtZXRob2QgZG9lcyBub3QgY2FjaGUKKyAgICAgKiBhIHJlc3VsdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmplY3RlZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW5qZWN0aW9uIHBvaW50LgorICAgICAqIEBwYXJhbSBzdXBwbGllciBzdXBwbGllciBjYWxsZWQgdXNpbmcgdGhlIHByb3h5LgorICAgICAqIEByZXR1cm4gY3JlYXRlZCBwcm94eSB3aGljaCByZXNvbHZlIHRoZSB2YWx1ZSBpbiB0aGUgcHJvcGVyIHNjb3BlLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3Qgbm9DYWNoZWRQcm94eShJbmplY3RlZSBpbmplY3RlZSwgU3VwcGxpZXI8T2JqZWN0PiBzdXBwbGllcikgeworICAgICAgICByZXR1cm4gY3JlYXRlUHJveHkoZ2V0Q2xhc3MoaW5qZWN0ZWUuZ2V0UmVxdWlyZWRUeXBlKCkpLCBzdXBwbGllcik7CisgICAgfQorCisgICAgcHJpdmF0ZSBPYmplY3QgY3JlYXRlUHJveHkoSW5qZWN0ZWUgaW5qZWN0ZWUsIEluamVjdGlvblJlc29sdmVyIHJlc29sdmVyKSB7CisgICAgICAgIHJldHVybiBjcmVhdGVQcm94eShnZXRDbGFzcyhpbmplY3RlZS5nZXRSZXF1aXJlZFR5cGUoKSksICgpIC0+IHJlc29sdmVyLnJlc29sdmUoaW5qZWN0ZWUpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIE9iamVjdCBjcmVhdGVQcm94eShDbGFzczw/PiByZXF1aXJlZENsYXNzLCBTdXBwbGllcjxPYmplY3Q+IHN1cHBsaWVyKSB7CisgICAgICAgIHJldHVybiBQcm94eS5uZXdQcm94eUluc3RhbmNlKAorICAgICAgICAgICAgICAgIHJlcXVpcmVkQ2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSwKKyAgICAgICAgICAgICAgICBuZXcgQ2xhc3M8Pz5bXSB7cmVxdWlyZWRDbGFzc30sCisgICAgICAgICAgICAgICAgbmV3IEplcnNleUludm9jYXRpb25IYW5kbGVyKHN1cHBsaWVyKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBDbGFzczw/PiBnZXRDbGFzcyhUeXBlIHR5cGUpIHsKKyAgICAgICAgaWYgKHR5cGUgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkVHlwZSkgeworICAgICAgICAgICAgUGFyYW1ldGVyaXplZFR5cGUgcGFyYW1UeXBlID0gKFBhcmFtZXRlcml6ZWRUeXBlKSB0eXBlOworICAgICAgICAgICAgcmV0dXJuIChDbGFzczw/PikgcGFyYW1UeXBlLmdldFJhd1R5cGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAoQ2xhc3M8Pz4pIHR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbGwgYW5ub3RhdGlvbnMgZm9yIHdoaWNoIHByb3h5IHdpbGwgYmUgY3JlYXRlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYWxsIHByb3h5YWJsZSBhbm5vdGF0aW9ucy4KKyAgICAgKi8KKyAgICBwcml2YXRlIENvbGxlY3Rpb248Q2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+PiBpZ25vcmVQcm94eSgpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QoUmVxdWVzdFNjb3BlZC5jbGFzcywgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5pbnRlcm5hbC5SZXF1ZXN0U2NvcGVkLmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGFzc2VzIGluIHdoaWNoIGlzIG5vdCBuZWVkZWQgdG8gdXNlIGEgcHJveHkgYmVjYXVzZSB0aGV5IGFyZSBzaW5nbGV0b25zLgorICAgICAqCisgICAgICogQHJldHVybiBjbGFzc2VzIG9taXR0ZWQgZHVyaW5nIHByb3h5aW5nLgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBpZ25vcmVkQ2xhc3MoVHlwZSB0eXBlKSB7CisgICAgICAgIENsYXNzPD8+IGNsYXp6OworICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRUeXBlKSB7CisgICAgICAgICAgICBQYXJhbWV0ZXJpemVkVHlwZSBwYXJhbVR5cGUgPSAoUGFyYW1ldGVyaXplZFR5cGUpIHR5cGU7CisgICAgICAgICAgICBjbGF6eiA9IChDbGFzczw/PikgcGFyYW1UeXBlLmdldFJhd1R5cGUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNsYXp6ID0gKENsYXNzPD8+KSB0eXBlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIElHTk9SRURfQ0xBU1NFUy5jb250YWlucyhjbGF6eik7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0BsaW5rIEludm9jYXRpb25IYW5kbGVyfSB0byBpbnRlcmNlcHQgYSBjYWxsaW5nIHVzaW5nIGEgcHJveHkgYnkgcHJvdmlkaW5nIGEgdmFsdWUgb2YgdGhlIGdpdmVuIGluamVjdGVkIHR5cGUgaW4gYSBwcm9wZXIKKyAgICAgKiBzY29wZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBKZXJzZXlJbnZvY2F0aW9uSGFuZGxlciBpbXBsZW1lbnRzIEludm9jYXRpb25IYW5kbGVyIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFN1cHBsaWVyPE9iamVjdD4gc3VwcGxpZXI7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBuZXcgaW52b2NhdGlvbiBoYW5kbGVyIHdpdGggc3VwcGxpZXIgd2hpY2ggcHJvdmlkZXMgYSBjdXJyZW50IGluamVjdGVkIHZhbHVlIGluIHByb3BlciBzY29wZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHN1cHBsaWVyIHByb3ZpZGVyIG9mIHRoZSB2YWx1ZS4KKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgSmVyc2V5SW52b2NhdGlvbkhhbmRsZXIoU3VwcGxpZXI8T2JqZWN0PiBzdXBwbGllcikgeworICAgICAgICAgICAgdGhpcy5zdXBwbGllciA9IHN1cHBsaWVyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPYmplY3QgaW52b2tlKE9iamVjdCBwcm94eSwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gYXJncykgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgICAgICBPYmplY3QgdGFyZ2V0ID0gc3VwcGxpZXIuZ2V0KCk7CisgICAgICAgICAgICByZXR1cm4gbWV0aG9kLmludm9rZSh0YXJnZXQsIGFyZ3MpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL2luamVjdG9yL011bHRpRXhjZXB0aW9uLmphdmEgYi9pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvaW5qZWN0b3IvTXVsdGlFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjI4ZTEwCi0tLSAvZGV2L251bGwKKysrIGIvaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL2luamVjdG9yL011bHRpRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0LmNkaS5zZS5pbmplY3RvcjsKKworaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBUaGlzIGV4Y2VwdGlvbiBjYW4gY29udGFpbiBtdWx0aXBsZSBvdGhlciBleGNlcHRpb25zLgorICogSG93ZXZlciwgaXQgd2lsbCBhbHNvIGhhdmUgdGhlIGNhdXNhbCBjaGFpbiBvZiB0aGUKKyAqIGZpcnN0IGV4Y2VwdGlvbiBhZGRlZCB0byB0aGUgbGlzdCBvZiBleGNlcHRpb25zLgorICoKKyAqIEBhdXRob3IgSm9obiBXZWxscyAoam9obi53ZWxscyBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgTXVsdGlFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKyAgICAvKioKKyAgICAgKiBGb3Igc2VyaWFsaXphdGlvbgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDIxMTI0MzI2OTc4NTg2MjEwNDRMOworICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IGxvY2sgPSBuZXcgYnl0ZVswXTsgLy8gYnl0ZVswXSBpcyBhbiBhcmJpdHJhcnkgdHlwZSB0aGF0IGlzIFNlcmlhbGl6YWJsZQorICAgIHByaXZhdGUgZmluYWwgTGlzdDxUaHJvd2FibGU+IHRocm93YWJsZXMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgcHJpdmF0ZSBib29sZWFuIHJlcG9ydFRvRXJyb3JTZXJ2aWNlID0gdHJ1ZTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gZW1wdHkgTXVsdGlFeGNlcHRpb24uCisgICAgICovCisgICAgcHVibGljIE11bHRpRXhjZXB0aW9uKCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgbGlzdCBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGVsZW1lbnQgaW4gaXQuCisgICAgICogVGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIGxpc3Qgd2lsbCBiZWNvbWUgdGhlCisgICAgICogY2F1c2Ugb2YgdGhpcyBleGNlcHRpb24sIGFuZCBpdHMgbWVzc2FnZSB3aWxsIGJlY29tZQorICAgICAqIHRoZSBtZXNzYWdlIG9mIHRoaXMgZXhjZXB0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHRocyBBIG5vbi1udWxsLCBub24tZW1wdHkgbGlzdCBvZiBleGNlcHRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBNdWx0aUV4Y2VwdGlvbihMaXN0PFRocm93YWJsZT4gdGhzKSB7CisgICAgICAgIHN1cGVyKHRocy5nZXQoMCkuZ2V0TWVzc2FnZSgpLCB0aHMuZ2V0KDApKTsKKworICAgICAgICBmb3IgKFRocm93YWJsZSB0aCA6IHRocykgeworICAgICAgICAgICAgaWYgKHRoIGluc3RhbmNlb2YgTXVsdGlFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICBNdWx0aUV4Y2VwdGlvbiBtZSA9IChNdWx0aUV4Y2VwdGlvbikgdGg7CisKKyAgICAgICAgICAgICAgICB0aHJvd2FibGVzLmFkZEFsbChtZS50aHJvd2FibGVzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3dhYmxlcy5hZGQodGgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBhbGxvd3MgZm9yIGNvbnN0cnVjdGlvbiBvZiBhIE11bHRpRXhjZXB0aW9uCisgICAgICogd2l0aCBvbmUgZWxlbWVudCBpbiBpdHMgbGlzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aCBNYXkgbm90IGJlIG51bGwuCisgICAgICovCisgICAgcHVibGljIE11bHRpRXhjZXB0aW9uKFRocm93YWJsZSB0aCwgYm9vbGVhbiByZXBvcnRUb0Vycm9yU2VydmljZSkgeworICAgICAgICBzdXBlcih0aC5nZXRNZXNzYWdlKCksIHRoKTsKKworICAgICAgICBpZiAodGggaW5zdGFuY2VvZiBNdWx0aUV4Y2VwdGlvbikgeworICAgICAgICAgICAgTXVsdGlFeGNlcHRpb24gbWUgPSAoTXVsdGlFeGNlcHRpb24pIHRoOworCisgICAgICAgICAgICB0aHJvd2FibGVzLmFkZEFsbChtZS50aHJvd2FibGVzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93YWJsZXMuYWRkKHRoKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMucmVwb3J0VG9FcnJvclNlcnZpY2UgPSByZXBvcnRUb0Vycm9yU2VydmljZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGFsbG93cyBmb3IgY29uc3RydWN0aW9uIG9mIGEgTXVsdGlFeGNlcHRpb24KKyAgICAgKiB3aXRoIG9uZSBlbGVtZW50IGluIGl0cyBsaXN0LgorICAgICAqCisgICAgICogQHBhcmFtIHRoIE1heSBub3QgYmUgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTXVsdGlFeGNlcHRpb24oVGhyb3dhYmxlIHRoKSB7CisgICAgICAgIHRoaXModGgsIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgYWxsIHRoZSBlcnJvcnMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgTXVsdGlFeGNlcHRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEFsbCB0aGUgZXJyb3JzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIE11bHRpRXhjZXB0aW9uLiBXaWxsCisgICAgICogbm90IHJldHVybiBudWxsLCBidXQgbWF5IHJldHVybiBhbiBlbXB0eSBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIExpc3Q8VGhyb3dhYmxlPiBnZXRFcnJvcnMoKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAobG9jaykgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBMaW5rZWRMaXN0PD4odGhyb3dhYmxlcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGFuIGVycm9yIHRvIGFuIGV4aXN0aW5nIGV4Y2VwdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlcnJvciBUaGUgZXhjZXB0aW9uIHRvIGFkZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRFcnJvcihUaHJvd2FibGUgZXJyb3IpIHsKKyAgICAgICAgc3luY2hyb25pemVkIChsb2NrKSB7CisgICAgICAgICAgICB0aHJvd2FibGVzLmFkZChlcnJvcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBtZXNzYWdlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CisgICAgICAgIExpc3Q8VGhyb3dhYmxlPiBsaXN0Q29weSA9IGdldEVycm9ycygpOworICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCJBIE11bHRpRXhjZXB0aW9uIGhhcyAiICsgbGlzdENvcHkuc2l6ZSgpICsgIiBleGNlcHRpb25zLiAgVGhleSBhcmU6XG4iKTsKKworICAgICAgICBpbnQgbGN2ID0gMTsKKyAgICAgICAgZm9yIChUaHJvd2FibGUgdGggOiBsaXN0Q29weSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKGxjdisrICsgIi4gIiArIHRoLmdldENsYXNzKCkuZ2V0TmFtZSgpICsgKCh0aC5nZXRNZXNzYWdlKCkgIT0gbnVsbCkgPyAiOiAiICsgdGguZ2V0TWVzc2FnZSgpIDogIiIpICsgIlxuIik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmludHMgdGhlIHN0YWNrIHRyYWNlIG9mIHRoaXMgZXhjZXB0aW9uIHRvIHRoZSBnaXZlbiBQcmludFN0cmVhbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoUHJpbnRTdHJlYW0gcykgeworICAgICAgICBMaXN0PFRocm93YWJsZT4gbGlzdENvcHkgPSBnZXRFcnJvcnMoKTsKKworICAgICAgICBpZiAobGlzdENvcHkuc2l6ZSgpIDw9IDApIHsKKyAgICAgICAgICAgIHN1cGVyLnByaW50U3RhY2tUcmFjZShzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGludCBsY3YgPSAxOworICAgICAgICBmb3IgKFRocm93YWJsZSB0aCA6IGxpc3RDb3B5KSB7CisgICAgICAgICAgICBzLnByaW50bG4oIk11bHRpRXhjZXB0aW9uIHN0YWNrICIgKyBsY3YrKyArICIgb2YgIiArIGxpc3RDb3B5LnNpemUoKSk7CisgICAgICAgICAgICB0aC5wcmludFN0YWNrVHJhY2Uocyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmludHMgdGhlIHN0YWNrIHRyYWNlIG9mIHRoaXMgZXhjZXB0aW9uIHRvIHRoZSBnaXZlbiBQcmludFdyaXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBwcmludFN0YWNrVHJhY2UoUHJpbnRXcml0ZXIgcykgeworICAgICAgICBMaXN0PFRocm93YWJsZT4gbGlzdENvcHkgPSBnZXRFcnJvcnMoKTsKKworICAgICAgICBpZiAobGlzdENvcHkuc2l6ZSgpIDw9IDApIHsKKyAgICAgICAgICAgIHN1cGVyLnByaW50U3RhY2tUcmFjZShzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGludCBsY3YgPSAxOworICAgICAgICBmb3IgKFRocm93YWJsZSB0aCA6IGxpc3RDb3B5KSB7CisgICAgICAgICAgICBzLnByaW50bG4oIk11bHRpRXhjZXB0aW9uIHN0YWNrICIgKyBsY3YrKyArICIgb2YgIiArIGxpc3RDb3B5LnNpemUoKSk7CisgICAgICAgICAgICB0aC5wcmludFN0YWNrVHJhY2Uocyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBleGNlcHRpb24gc2hvdWxkIGJlIHJlcG9ydGVkCisgICAgICogdG8gdGhlIGVycm9yIHNlcnZpY2Ugd2hlbiB0aHJvd24gZHVyaW5nIGEgY3JlYXRpb24KKyAgICAgKiBvciBkZWxldGlvbiBvZiBhIHNlcnZpY2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBleGNlcHRpb24gc2hvdWxkIGJlIHJlcG9ydGVkIHRvCisgICAgICogdGhlIGVycm9yIHNlcnZpY2Ugd2hlbiBjcmVhdGluZyBvciBkZWxldGluZyBhIHNlcnZpY2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gZ2V0UmVwb3J0VG9FcnJvclNlcnZpY2UoKSB7CisgICAgICAgIHJldHVybiByZXBvcnRUb0Vycm9yU2VydmljZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIGlmIHRoaXMgZXhjZXB0aW9uIHNob3VsZCBiZSByZXBvcnRlZAorICAgICAqIHRvIHRoZSBlcnJvciBzZXJ2aWNlIHdoZW4gdGhyb3duIGR1cmluZyBhIGNyZWF0aW9uCisgICAgICogb3IgZGVsZXRpb24gb2YgYSBzZXJ2aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcG9ydCB0cnVlIGlmIHRoaXMgZXhjZXB0aW9uIHNob3VsZCBiZSByZXBvcnRlZCB0bworICAgICAqICAgICAgICAgICAgICAgdGhlIGVycm9yIHNlcnZpY2Ugd2hlbiBjcmVhdGluZyBvciBkZWxldGluZyBhIHNlcnZpY2UuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0UmVwb3J0VG9FcnJvclNlcnZpY2UoYm9vbGVhbiByZXBvcnQpIHsKKyAgICAgICAgcmVwb3J0VG9FcnJvclNlcnZpY2UgPSByZXBvcnQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIGdldE1lc3NhZ2UoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2luamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9pbmplY3Rvci9OYW1lZEltcGwuamF2YSBiL2luamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9pbmplY3Rvci9OYW1lZEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDBkMmY0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL2luamVjdG9yL05hbWVkSW1wbC5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0LmNkaS5zZS5pbmplY3RvcjsKKworaW1wb3J0IGphdmF4LmluamVjdC5OYW1lZDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5Bbm5vdGF0aW9uTGl0ZXJhbDsKKworLyoqCisgKiBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgTmFtZWR9IGFubm90YXRpb24uCisgKgorICogQGF1dGhvciBKb2huIFdlbGxzIChqb2huLndlbGxzIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBOYW1lZEltcGwgZXh0ZW5kcyBBbm5vdGF0aW9uTGl0ZXJhbDxOYW1lZD4gaW1wbGVtZW50cyBOYW1lZCB7CisKKyAgICAvKioKKyAgICAgKiBGb3Igc2VyaWFsaXphdGlvbgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDkxMTAzMjUxMTIwMDg5NjMxNTVMOworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgTmFtZWR9IGFubm90YXRpb24gd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIFRoZSBub24tbnVsbCBuYW1lIHRvIGdpdmUgdGhlIGFubm90YXRpb24uCisgICAgICovCisgICAgTmFtZWRJbXBsKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB2YWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJATmFtZWQoIiArIG5hbWUgKyAiKSI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL2luamVjdG9yL1JlZmxlY3Rpb25VdGlscy5qYXZhIGIvaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL2luamVjdG9yL1JlZmxlY3Rpb25VdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NTliN2UKLS0tIC9kZXYvbnVsbAorKysgYi9pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvaW5qZWN0b3IvUmVmbGVjdGlvblV0aWxzLmphdmEKQEAgLTAsMCArMSw0MjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0LmNkaS5zZS5pbmplY3RvcjsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkFjY2Vzc2libGVPYmplY3Q7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuR2VuZXJpY0FycmF5VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5QYXJhbWV0ZXJpemVkVHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGVWYXJpYWJsZTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuY2RpLnNlLkdlbmVyaWNBcnJheVR5cGVJbXBsOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5jZGkuc2UuUGFyYW1ldGVyaXplZFR5cGVJbXBsOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5JbW11dGFibGVDb2xsZWN0b3JzOworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgZm9yIGdldHRpbmcgdGhlIGluZm9ybWF0aW9uIGZyb20gY2xhc3MgdXNpbmcgUmVmbGVjdGlvbiBBUEkuCisgKgorICogQGF1dGhvciBKb2huIFdlbGxzIChqb2huLndlbGxzIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworY2xhc3MgUmVmbGVjdGlvblV0aWxzIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFJlZmxlY3Rpb25VdGlscy5jbGFzcy5nZXROYW1lKCkpOworCisgICAgc3RhdGljIFNldDxGaWVsZD4gZ2V0QWxsRmllbGRzKENsYXNzPD8+IGNsYXp6KSB7CisgICAgICAgIGlmIChjbGF6eiA9PSBudWxsIHx8IE9iamVjdC5jbGFzcy5lcXVhbHMoY2xhenopKSB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2xhenouaXNJbnRlcmZhY2UoKSkgeworICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBTZXQ8RmllbGQ+IHJldFZhbCA9IG5ldyBMaW5rZWRIYXNoU2V0PD4oKTsKKyAgICAgICAgcmV0VmFsLmFkZEFsbChnZXREZWNsYXJlZEZpZWxkKGNsYXp6KSk7CisgICAgICAgIHJldFZhbC5hZGRBbGwoZ2V0QWxsRmllbGRzKGNsYXp6LmdldFN1cGVyY2xhc3MoKSkpOworICAgICAgICByZXR1cm4gcmV0VmFsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIEVYQUNUIHNldCBvZiBmaWVsZHMgb24gdGhpcyBjbGFzcyBvbmx5LiBObyBzdWJjbGFzc2VzLiBTbyB0aGlzIHNldCBzaG91bGQgYmUgY29uc2lkZXJlZCBSQVcgYW5kIGhhcyBub3QgdGFrZW4gaW50bworICAgICAqIGFjY291bnQgYW55IHN1YmNsYXNzZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhenogVGhlIGNsYXNzIHRvIGV4YW1pbmUuCisgICAgICogQHJldHVybiBhbGwgZGVjbGFyZWQgZmllbGRzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFNldDxGaWVsZD4gZ2V0RGVjbGFyZWRGaWVsZChmaW5hbCBDbGFzczw/PiBjbGF6eikgeworICAgICAgICByZXR1cm4gQXJyYXlzLnN0cmVhbShzZWN1cmVHZXREZWNsYXJlZEZpZWxkcyhjbGF6eikpLmNvbGxlY3QoSW1tdXRhYmxlQ29sbGVjdG9ycy50b0ltbXV0YWJsZUxpbmtlZFNldCgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBGaWVsZFtdIHNlY3VyZUdldERlY2xhcmVkRmllbGRzKGZpbmFsIENsYXNzPD8+IGNsYXp6KSB7CisgICAgICAgIHJldHVybiBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgoUHJpdmlsZWdlZEFjdGlvbjxGaWVsZFtdPikgY2xheno6OmdldERlY2xhcmVkRmllbGRzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNvbHZlcyB0aGUgZ2VuZXJpYyB0eXBlIG9mIGEgZmllbGQgZ2l2ZW4gdGhlIGFjdHVhbCBjbGFzcyBiZWluZyBpbnN0YW50aWF0ZWQKKyAgICAgKgorICAgICAqIEBwYXJhbSB0b3BjbGFzcyBUaGUgaW5zdGFudGlhdGlvbiBjbGFzcy4gIE11c3Qgbm90IGJlIG51bGwKKyAgICAgKiBAcGFyYW0gZmllbGQgICAgVGhlIG5vbi1udWxsIGZpZWxkIHdob3NlIHR5cGUgdG8gcmVzb2x2ZQorICAgICAqIEByZXR1cm4gVGhlIHJlc29sdmVkIGZpZWxkIHR5cGUgYnkgd2F5IG9mIGl0cyBzdWJjbGFzc2VzLiAgV2lsbCBub3QgcmV0dXJuCisgICAgICogbnVsbCwgYnV0IG1heSByZXR1cm4gdGhlIG9yaWdpbmFsIGZpZWxkcyBnZW5lcmljIHR5cGUKKyAgICAgKi8KKyAgICBzdGF0aWMgVHlwZSByZXNvbHZlRmllbGQoQ2xhc3M8Pz4gdG9wY2xhc3MsIEZpZWxkIGZpZWxkKSB7CisgICAgICAgIHJldHVybiByZXNvbHZlTWVtYmVyKHRvcGNsYXNzLCBmaWVsZC5nZXRHZW5lcmljVHlwZSgpLCBmaWVsZC5nZXREZWNsYXJpbmdDbGFzcygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNvbHZlcyB0aGUgZ2VuZXJpYyB0eXBlIG9mIGEgdHlwZSBhbmQgZGVjbGFyaW5nIGNsYXNzIGdpdmVuIHRoZSBhY3R1YWwgY2xhc3MgYmVpbmcgaW5zdGFudGlhdGVkCisgICAgICoKKyAgICAgKiBAcGFyYW0gdG9wY2xhc3MgICAgICAgVGhlIGluc3RhbnRpYXRpb24gY2xhc3MuICBNdXN0IG5vdCBiZSBudWxsCisgICAgICogQHBhcmFtIGxvb2tpbmdGb3JUeXBlIFRoZSB0eXBlIHRvIHJlc29sdmUuICBNdXN0IG5vdCBiZSBudWxsCisgICAgICogQHBhcmFtIGRlY2xhcmluZ0NsYXNzIFRoZSBjbGFzcyBvZiB0aGUgZW50aXR5IGRlY2xhcmluZyB0aGUgbG9va2luZ0ZvclR5cGUuIE11c3Qgbm90IGJlIG51bGwKKyAgICAgKiBAcmV0dXJuIFRoZSByZXNvbHZlZCB0eXBlIGJ5IHdheSBvZiBpdHMgc3ViY2xhc3Nlcy4gIFdpbGwgbm90IHJldHVybiBudWxsIGJ1dCBtYXkKKyAgICAgKiByZXR1cm4gbG9va2luZ0ZvclR5cGUgaWYgaXQgY291bGQgbm90IGJlIGZ1cnRoZXIgcmVzb2x2ZWQKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBUeXBlIHJlc29sdmVNZW1iZXIoQ2xhc3M8Pz4gdG9wY2xhc3MsIFR5cGUgbG9va2luZ0ZvclR5cGUsIENsYXNzPD8+IGRlY2xhcmluZ0NsYXNzKSB7CisgICAgICAgIE1hcDxTdHJpbmcsIFR5cGU+IHR5cGVBcmd1bWVudHMgPSB0eXBlc0Zyb21TdWJDbGFzc1RvRGVjbGFyaW5nQ2xhc3ModG9wY2xhc3MsIGRlY2xhcmluZ0NsYXNzKTsKKyAgICAgICAgaWYgKHR5cGVBcmd1bWVudHMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGxvb2tpbmdGb3JUeXBlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxvb2tpbmdGb3JUeXBlIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmaXhUeXBlVmFyaWFibGVzKChQYXJhbWV0ZXJpemVkVHlwZSkgbG9va2luZ0ZvclR5cGUsIHR5cGVBcmd1bWVudHMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGxvb2tpbmdGb3JUeXBlIGluc3RhbmNlb2YgR2VuZXJpY0FycmF5VHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIGZpeEdlbmVyaWNBcnJheVR5cGVWYXJpYWJsZXMoKEdlbmVyaWNBcnJheVR5cGUpIGxvb2tpbmdGb3JUeXBlLCB0eXBlQXJndW1lbnRzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghKGxvb2tpbmdGb3JUeXBlIGluc3RhbmNlb2YgVHlwZVZhcmlhYmxlKSkgeworICAgICAgICAgICAgcmV0dXJuIGxvb2tpbmdGb3JUeXBlOworICAgICAgICB9CisKKyAgICAgICAgVHlwZVZhcmlhYmxlPD8+IHR2ID0gKFR5cGVWYXJpYWJsZTw/PikgbG9va2luZ0ZvclR5cGU7CisgICAgICAgIFN0cmluZyB0eXBlVmFyaWFibGVOYW1lID0gdHYuZ2V0TmFtZSgpOworCisgICAgICAgIFR5cGUgcmV0VmFsID0gdHlwZUFyZ3VtZW50cy5nZXQodHlwZVZhcmlhYmxlTmFtZSk7CisgICAgICAgIGlmIChyZXRWYWwgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGxvb2tpbmdGb3JUeXBlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJldFZhbCBpbnN0YW5jZW9mIENsYXNzKSB7CisgICAgICAgICAgICByZXR1cm4gcmV0VmFsOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJldFZhbCBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gZml4VHlwZVZhcmlhYmxlcygoUGFyYW1ldGVyaXplZFR5cGUpIHJldFZhbCwgdHlwZUFyZ3VtZW50cyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmV0VmFsIGluc3RhbmNlb2YgR2VuZXJpY0FycmF5VHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIGZpeEdlbmVyaWNBcnJheVR5cGVWYXJpYWJsZXMoKEdlbmVyaWNBcnJheVR5cGUpIHJldFZhbCwgdHlwZUFyZ3VtZW50cyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmV0VmFsOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFR5cGU+IHR5cGVzRnJvbVN1YkNsYXNzVG9EZWNsYXJpbmdDbGFzcyhDbGFzczw/PiB0b3BDbGFzcywgQ2xhc3M8Pz4gZGVjbGFyaW5nQ2xhc3MpIHsKKyAgICAgICAgaWYgKHRvcENsYXNzLmVxdWFscyhkZWNsYXJpbmdDbGFzcykpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgVHlwZSBzdXBlclR5cGUgPSB0b3BDbGFzcy5nZXRHZW5lcmljU3VwZXJjbGFzcygpOworICAgICAgICBDbGFzczw/PiBzdXBlckNsYXNzID0gZ2V0UmF3Q2xhc3Moc3VwZXJUeXBlKTsKKworICAgICAgICB3aGlsZSAoc3VwZXJUeXBlICE9IG51bGwgJiYgc3VwZXJDbGFzcyAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoIShzdXBlclR5cGUgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkVHlwZSkpIHsKKyAgICAgICAgICAgICAgICAvLyBzdXBlclR5cGUgTVVTVCBiZSBhIENsYXNzIGluIHRoaXMgY2FzZQorICAgICAgICAgICAgICAgIGlmIChzdXBlckNsYXNzLmVxdWFscyhkZWNsYXJpbmdDbGFzcykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3VwZXJUeXBlID0gc3VwZXJDbGFzcy5nZXRHZW5lcmljU3VwZXJjbGFzcygpOworICAgICAgICAgICAgICAgIHN1cGVyQ2xhc3MgPSBnZXRSYXdDbGFzcyhzdXBlclR5cGUpOworCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFBhcmFtZXRlcml6ZWRUeXBlIHN1cGVyUFQgPSAoUGFyYW1ldGVyaXplZFR5cGUpIHN1cGVyVHlwZTsKKworICAgICAgICAgICAgTWFwPFN0cmluZywgVHlwZT4gdHlwZUFyZ3VtZW50cyA9IGdldFR5cGVBcmd1bWVudHMoc3VwZXJDbGFzcywgc3VwZXJQVCk7CisKKyAgICAgICAgICAgIGlmIChzdXBlckNsYXNzLmVxdWFscyhkZWNsYXJpbmdDbGFzcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHlwZUFyZ3VtZW50czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3VwZXJUeXBlID0gc3VwZXJDbGFzcy5nZXRHZW5lcmljU3VwZXJjbGFzcygpOworICAgICAgICAgICAgc3VwZXJDbGFzcyA9IGdldFJhd0NsYXNzKHN1cGVyVHlwZSk7CisKKyAgICAgICAgICAgIGlmIChzdXBlclR5cGUgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkVHlwZSkgeworICAgICAgICAgICAgICAgIHN1cGVyVHlwZSA9IGZpeFR5cGVWYXJpYWJsZXMoKFBhcmFtZXRlcml6ZWRUeXBlKSBzdXBlclR5cGUsIHR5cGVBcmd1bWVudHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKHRvcENsYXNzLmdldE5hbWUoKSArICIgaXMgbm90IHRoZSBzYW1lIGFzIG9yIGEgc3ViY2xhc3Mgb2YgIiArIGRlY2xhcmluZ0NsYXNzLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyBhIG1hcHBpbmcgb2YgdHlwZSB2YXJpYWJsZSBuYW1lcyBvZiB0aGUgcmF3IGNsYXNzIHRvIHR5cGUgYXJndW1lbnRzIG9mIHRoZSBwYXJhbWV0ZXJpemVkIHR5cGUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgTWFwPFN0cmluZywgVHlwZT4gZ2V0VHlwZUFyZ3VtZW50cyhDbGFzczw/PiByYXdDbGFzcywgUGFyYW1ldGVyaXplZFR5cGUgdHlwZSkgeworICAgICAgICBNYXA8U3RyaW5nLCBUeXBlPiB0eXBlTWFwID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBUeXBlW10gdHlwZUFyZ3VtZW50cyA9IHR5cGUuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpOworCisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgZm9yIChUeXBlVmFyaWFibGU8Pz4gdHlwZVZhcmlhYmxlIDogcmF3Q2xhc3MuZ2V0VHlwZVBhcmFtZXRlcnMoKSkgeworICAgICAgICAgICAgdHlwZU1hcC5wdXQodHlwZVZhcmlhYmxlLmdldE5hbWUoKSwgdHlwZUFyZ3VtZW50c1tpKytdKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHlwZU1hcDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXBsYWNlIGFueSBUeXBlVmFyaWFibGVzIGluIHRoZSBnaXZlbiB0eXBlJ3MgYXJndW1lbnRzIHdpdGgKKyAgICAgKiB0aGUgYWN0dWFsIGFyZ3VtZW50IHR5cGVzLiAgUmV0dXJuIHRoZSBnaXZlbiB0eXBlIGlmIG5vIHJlcGxhY2luZworICAgICAqIGlzIHJlcXVpcmVkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFR5cGUgZml4VHlwZVZhcmlhYmxlcyhQYXJhbWV0ZXJpemVkVHlwZSB0eXBlLCBNYXA8U3RyaW5nLCBUeXBlPiB0eXBlQXJndW1lbnRzTWFwKSB7CisgICAgICAgIFR5cGVbXSBuZXdUeXBlQXJndW1lbnRzID0gZ2V0TmV3VHlwZUFyZ3VtZW50cyh0eXBlLCB0eXBlQXJndW1lbnRzTWFwKTsKKyAgICAgICAgaWYgKG5ld1R5cGVBcmd1bWVudHMgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBQYXJhbWV0ZXJpemVkVHlwZUltcGwodHlwZS5nZXRSYXdUeXBlKCksIG5ld1R5cGVBcmd1bWVudHMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0eXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIG5ldyBhcnJheSBvZiB0eXBlIGFyZ3VtZW50cyBmb3IgdGhlIGdpdmVuIFBhcmFtZXRlcml6ZWRUeXBlLCByZXBsYWNpbmcgYW55IFR5cGVWYXJpYWJsZXMgd2l0aAorICAgICAqIGFjdHVhbCB0eXBlcy4gIFRoZSB0eXBlcyBzaG91bGQgYmUgZm91bmQgaW4gdGhlIGdpdmVuIGFyZ3VtZW50cyBtYXAsIGtleWVkIGJ5IHZhcmlhYmxlIG5hbWUuICBSZXR1cm4KKyAgICAgKiBudWxsIGlmIG5vIGFyZ3VtZW50cyBuZWVkZWQgdG8gYmUgcmVwbGFjZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgVHlwZVtdIGdldE5ld1R5cGVBcmd1bWVudHMoZmluYWwgUGFyYW1ldGVyaXplZFR5cGUgdHlwZSwKKyAgICAgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIFR5cGU+IHR5cGVBcmd1bWVudHNNYXApIHsKKworICAgICAgICBUeXBlW10gdHlwZUFyZ3VtZW50cyA9IHR5cGUuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpOworICAgICAgICBUeXBlW10gbmV3VHlwZUFyZ3VtZW50cyA9IG5ldyBUeXBlW3R5cGVBcmd1bWVudHMubGVuZ3RoXTsKKyAgICAgICAgYm9vbGVhbiBuZXdBcmdzTmVlZGVkID0gZmFsc2U7CisKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBmb3IgKFR5cGUgYXJnVHlwZSA6IHR5cGVBcmd1bWVudHMpIHsKKyAgICAgICAgICAgIGlmIChhcmdUeXBlIGluc3RhbmNlb2YgVHlwZVZhcmlhYmxlKSB7CisgICAgICAgICAgICAgICAgbmV3VHlwZUFyZ3VtZW50c1tpXSA9IHR5cGVBcmd1bWVudHNNYXAuZ2V0KCgoVHlwZVZhcmlhYmxlPD8+KSBhcmdUeXBlKS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIG5ld0FyZ3NOZWVkZWQgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdUeXBlIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFR5cGUpIHsKKyAgICAgICAgICAgICAgICBQYXJhbWV0ZXJpemVkVHlwZSBvcmlnaW5hbCA9IChQYXJhbWV0ZXJpemVkVHlwZSkgYXJnVHlwZTsKKworICAgICAgICAgICAgICAgIFR5cGVbXSBpbnRlcm5hbFR5cGVBcmdzID0gZ2V0TmV3VHlwZUFyZ3VtZW50cyhvcmlnaW5hbCwgdHlwZUFyZ3VtZW50c01hcCk7CisgICAgICAgICAgICAgICAgaWYgKGludGVybmFsVHlwZUFyZ3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBuZXdUeXBlQXJndW1lbnRzW2ldID0gbmV3IFBhcmFtZXRlcml6ZWRUeXBlSW1wbChvcmlnaW5hbC5nZXRSYXdUeXBlKCksIGludGVybmFsVHlwZUFyZ3MpOworICAgICAgICAgICAgICAgICAgICBuZXdBcmdzTmVlZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBuZXdUeXBlQXJndW1lbnRzW2ldID0gYXJnVHlwZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ1R5cGUgaW5zdGFuY2VvZiBHZW5lcmljQXJyYXlUeXBlKSB7CisgICAgICAgICAgICAgICAgR2VuZXJpY0FycmF5VHlwZSBnYXQgPSAoR2VuZXJpY0FycmF5VHlwZSkgYXJnVHlwZTsKKworICAgICAgICAgICAgICAgIFR5cGUgaW50ZXJuYWxUeXBlQXJnID0gZ2V0TmV3VHlwZUFycmF5QXJndW1lbnRzKGdhdCwgdHlwZUFyZ3VtZW50c01hcCk7CisgICAgICAgICAgICAgICAgaWYgKGludGVybmFsVHlwZUFyZyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbnRlcm5hbFR5cGVBcmcgaW5zdGFuY2VvZiBDbGFzczw/PikgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV3VHlwZUFyZ3VtZW50c1tpXSA9IGdldEFycmF5T2ZUeXBlKChDbGFzczw/PikgaW50ZXJuYWxUeXBlQXJnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0FyZ3NOZWVkZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChpbnRlcm5hbFR5cGVBcmcgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkVHlwZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoKChQYXJhbWV0ZXJpemVkVHlwZSkgaW50ZXJuYWxUeXBlQXJnKS5nZXRSYXdUeXBlKCkgaW5zdGFuY2VvZiBDbGFzczw/PikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlcml6ZWRUeXBlIHB0ID0gKFBhcmFtZXRlcml6ZWRUeXBlKSBpbnRlcm5hbFR5cGVBcmc7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1R5cGVBcmd1bWVudHNbaV0gPSBnZXRBcnJheU9mVHlwZSgoQ2xhc3M8Pz4pIHB0LmdldFJhd1R5cGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdBcmdzTmVlZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1R5cGVBcmd1bWVudHNbaV0gPSBuZXcgR2VuZXJpY0FycmF5VHlwZUltcGwoaW50ZXJuYWxUeXBlQXJnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0FyZ3NOZWVkZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3VHlwZUFyZ3VtZW50c1tpXSA9IGFyZ1R5cGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBuZXdUeXBlQXJndW1lbnRzW2ldID0gYXJnVHlwZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaSsrOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ld0FyZ3NOZWVkZWQgPyBuZXdUeXBlQXJndW1lbnRzIDogbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBuZXcgVHlwZSBmb3IgYSBHZW5lcmljQXJyYXlUeXBlLCByZXBsYWNpbmcgYW55IFR5cGVWYXJpYWJsZXMgd2l0aAorICAgICAqIGFjdHVhbCB0eXBlcy4gIFRoZSB0eXBlcyBzaG91bGQgYmUgZm91bmQgaW4gdGhlIGdpdmVuIGFyZ3VtZW50cyBtYXAsIGtleWVkIGJ5IHZhcmlhYmxlIG5hbWUuICBSZXR1cm4KKyAgICAgKiBudWxsIGlmIG5vIGFyZ3VtZW50cyBuZWVkZWQgdG8gYmUgcmVwbGFjZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgVHlwZSBnZXROZXdUeXBlQXJyYXlBcmd1bWVudHMoZmluYWwgR2VuZXJpY0FycmF5VHlwZSBnYXQsCisgICAgICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBUeXBlPiB0eXBlQXJndW1lbnRzTWFwKSB7CisKKyAgICAgICAgVHlwZSB0eXBlQXJndW1lbnQgPSBnYXQuZ2V0R2VuZXJpY0NvbXBvbmVudFR5cGUoKTsKKworICAgICAgICBpZiAodHlwZUFyZ3VtZW50IGluc3RhbmNlb2YgVHlwZVZhcmlhYmxlKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZUFyZ3VtZW50c01hcC5nZXQoKChUeXBlVmFyaWFibGU8Pz4pIHR5cGVBcmd1bWVudCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0eXBlQXJndW1lbnQgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkVHlwZSkgeworICAgICAgICAgICAgUGFyYW1ldGVyaXplZFR5cGUgb3JpZ2luYWwgPSAoUGFyYW1ldGVyaXplZFR5cGUpIHR5cGVBcmd1bWVudDsKKworICAgICAgICAgICAgVHlwZVtdIGludGVybmFsVHlwZUFyZ3MgPSBnZXROZXdUeXBlQXJndW1lbnRzKG9yaWdpbmFsLCB0eXBlQXJndW1lbnRzTWFwKTsKKyAgICAgICAgICAgIGlmIChpbnRlcm5hbFR5cGVBcmdzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBhcmFtZXRlcml6ZWRUeXBlSW1wbChvcmlnaW5hbC5nZXRSYXdUeXBlKCksIGludGVybmFsVHlwZUFyZ3MpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWw7CisgICAgICAgIH0KKworICAgICAgICBpZiAodHlwZUFyZ3VtZW50IGluc3RhbmNlb2YgR2VuZXJpY0FycmF5VHlwZSkgeworICAgICAgICAgICAgR2VuZXJpY0FycmF5VHlwZSBvcmlnaW5hbCA9IChHZW5lcmljQXJyYXlUeXBlKSB0eXBlQXJndW1lbnQ7CisKKyAgICAgICAgICAgIFR5cGUgaW50ZXJuYWxUeXBlQXJnID0gZ2V0TmV3VHlwZUFycmF5QXJndW1lbnRzKG9yaWdpbmFsLCB0eXBlQXJndW1lbnRzTWFwKTsKKyAgICAgICAgICAgIGlmIChpbnRlcm5hbFR5cGVBcmcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChpbnRlcm5hbFR5cGVBcmcgaW5zdGFuY2VvZiBDbGFzczw/PikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QXJyYXlPZlR5cGUoKENsYXNzPD8+KSBpbnRlcm5hbFR5cGVBcmcpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChpbnRlcm5hbFR5cGVBcmcgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkVHlwZSkgeworICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJpemVkVHlwZSBwdCA9IChQYXJhbWV0ZXJpemVkVHlwZSkgaW50ZXJuYWxUeXBlQXJnOworCisgICAgICAgICAgICAgICAgICAgIGlmIChwdC5nZXRSYXdUeXBlKCkgaW5zdGFuY2VvZiBDbGFzczw/PikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldEFycmF5T2ZUeXBlKChDbGFzczw/PikgcHQuZ2V0UmF3VHlwZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgR2VuZXJpY0FycmF5VHlwZUltcGwoaW50ZXJuYWxUeXBlQXJnKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXBsYWNlIGFueSBUeXBlVmFyaWFibGVzIGluIHRoZSBnaXZlbiB0eXBlJ3MgYXJndW1lbnRzIHdpdGgKKyAgICAgKiB0aGUgYWN0dWFsIGFyZ3VtZW50IHR5cGVzLiAgUmV0dXJuIHRoZSBnaXZlbiB0eXBlIGlmIG5vIHJlcGxhY2luZworICAgICAqIGlzIHJlcXVpcmVkLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIFR5cGUgZml4R2VuZXJpY0FycmF5VHlwZVZhcmlhYmxlcyhHZW5lcmljQXJyYXlUeXBlIHR5cGUsIE1hcDxTdHJpbmcsIFR5cGU+IHR5cGVBcmd1bWVudHNNYXApIHsKKyAgICAgICAgVHlwZSBuZXdUeXBlQXJndW1lbnQgPSBnZXROZXdUeXBlQXJyYXlBcmd1bWVudHModHlwZSwgdHlwZUFyZ3VtZW50c01hcCk7CisKKyAgICAgICAgaWYgKG5ld1R5cGVBcmd1bWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAobmV3VHlwZUFyZ3VtZW50IGluc3RhbmNlb2YgQ2xhc3M8Pz4pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QXJyYXlPZlR5cGUoKENsYXNzPD8+KSBuZXdUeXBlQXJndW1lbnQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobmV3VHlwZUFyZ3VtZW50IGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFR5cGUpIHsKKyAgICAgICAgICAgICAgICBQYXJhbWV0ZXJpemVkVHlwZSBwdCA9IChQYXJhbWV0ZXJpemVkVHlwZSkgbmV3VHlwZUFyZ3VtZW50OworICAgICAgICAgICAgICAgIGlmIChwdC5nZXRSYXdUeXBlKCkgaW5zdGFuY2VvZiBDbGFzczw/PikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QXJyYXlPZlR5cGUoKENsYXNzPD8+KSBwdC5nZXRSYXdUeXBlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ldyBHZW5lcmljQXJyYXlUeXBlSW1wbChuZXdUeXBlQXJndW1lbnQpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHR5cGU7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3M8Pz4gZ2V0QXJyYXlPZlR5cGUoQ2xhc3M8Pz4gdHlwZSkgeworICAgICAgICByZXR1cm4gQXJyYXkubmV3SW5zdGFuY2UodHlwZSwgMCkuZ2V0Q2xhc3MoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHaXZlbiB0aGUgdHlwZSBwYXJhbWV0ZXIgZ2V0cyB0aGUgcmF3IHR5cGUgcmVwcmVzZW50ZWQKKyAgICAgKiBieSB0aGUgdHlwZSwgb3IgbnVsbCBpZiB0aGlzIGhhcyBubyBhc3NvY2lhdGVkIHJhdyBjbGFzcworICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgdG8gZmluZCB0aGUgcmF3IGNsYXNzIG9uCisgICAgICogQHJldHVybiBUaGUgcmF3IGNsYXNzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHR5cGUKKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBDbGFzczw/PiBnZXRSYXdDbGFzcyhUeXBlIHR5cGUpIHsKKyAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIEdlbmVyaWNBcnJheVR5cGUpIHsKKyAgICAgICAgICAgIFR5cGUgY29tcG9uZW50VHlwZSA9ICgoR2VuZXJpY0FycmF5VHlwZSkgdHlwZSkuZ2V0R2VuZXJpY0NvbXBvbmVudFR5cGUoKTsKKworICAgICAgICAgICAgaWYgKCEoY29tcG9uZW50VHlwZSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRUeXBlKSAmJiAhKGNvbXBvbmVudFR5cGUgaW5zdGFuY2VvZiBDbGFzcykpIHsKKyAgICAgICAgICAgICAgICAvLyB0eXBlIHZhcmlhYmxlIGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ2xhc3M8Pz4gcmF3Q29tcG9uZW50Q2xhc3MgPSBnZXRSYXdDbGFzcyhjb21wb25lbnRUeXBlKTsKKworICAgICAgICAgICAgU3RyaW5nIGZvck5hbWVOYW1lID0gIltMIiArIHJhd0NvbXBvbmVudENsYXNzLmdldE5hbWUoKSArICI7IjsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIENsYXNzLmZvck5hbWUoZm9yTmFtZU5hbWUpOworICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIHRoKSB7CisgICAgICAgICAgICAgICAgLy8gaWdub3JlLCBidXQgcmV0dXJuIG51bGwKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICh0eXBlIGluc3RhbmNlb2YgQ2xhc3MpIHsKKyAgICAgICAgICAgIHJldHVybiAoQ2xhc3M8Pz4pIHR5cGU7CisgICAgICAgIH0KKworICAgICAgICBpZiAodHlwZSBpbnN0YW5jZW9mIFBhcmFtZXRlcml6ZWRUeXBlKSB7CisgICAgICAgICAgICBUeXBlIHJhd1R5cGUgPSAoKFBhcmFtZXRlcml6ZWRUeXBlKSB0eXBlKS5nZXRSYXdUeXBlKCk7CisgICAgICAgICAgICBpZiAocmF3VHlwZSBpbnN0YW5jZW9mIENsYXNzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChDbGFzczw/PikgcmF3VHlwZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGdpdmVuIGZpZWxkIHRvIHRoZSBnaXZlbiB2YWx1ZQorICAgICAqCisgICAgICogQHBhcmFtIGZpZWxkICAgIFRoZSBub24tbnVsbCBmaWVsZCB0byBzZXQKKyAgICAgKiBAcGFyYW0gaW5zdGFuY2UgVGhlIG5vbi1udWxsIGluc3RhbmNlIHRvIHNldCBpbnRvCisgICAgICogQHBhcmFtIHZhbHVlICAgIFRoZSB2YWx1ZSB0byB3aGljaCB0aGUgZmllbGQgc2hvdWxkIGJlIHNldAorICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlIElmIHRoZXJlIHdhcyBzb21lIGV4Y2VwdGlvbiB3aGlsZSBzZXR0aW5nIHRoZSBmaWVsZAorICAgICAqLworICAgIHN0YXRpYyB2b2lkIHNldEZpZWxkKEZpZWxkIGZpZWxkLCBPYmplY3QgaW5zdGFuY2UsIE9iamVjdCB2YWx1ZSkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHNldEFjY2Vzc2libGUoZmllbGQpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaWVsZC5zZXQoaW5zdGFuY2UsIHZhbHVlKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTE9HR0VSLndhcm5pbmcoU3RyaW5nLmZvcm1hdCgiRmFpbGVkIGR1cmluZyBzZXR0aW5nIGEgdmFsdWUgaW50byBDbGFzczogJXMsIEZpZWxkOiAlcyIsCisgICAgICAgICAgICAgICAgICAgIGZpZWxkLmdldERlY2xhcmluZ0NsYXNzKCkuZ2V0TmFtZSgpLCBmaWVsZC5nZXROYW1lKCkpKTsKKyAgICAgICAgICAgIHRocm93IGV4OworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGlzIGFjY2Vzc2libGUgb2JqZWN0IHRvIGJlIGFjY2Vzc2libGUgdXNpbmcgdGhlIHBlcm1pc3Npb25zIG9mCisgICAgICogdGhlIGhrMi1sb2NhdG9yIGJ1bmRsZSAod2hpY2ggd2lsbCBuZWVkIHRoZSByZXF1aXJlZCBncmFudCkKKyAgICAgKgorICAgICAqIEBwYXJhbSBhbyBUaGUgb2JqZWN0IHRvIGNoYW5nZQorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2V0QWNjZXNzaWJsZShmaW5hbCBBY2Nlc3NpYmxlT2JqZWN0IGFvKSB7CisgICAgICAgIGlmIChhby5pc0FjY2Vzc2libGUoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoKFByaXZpbGVnZWRBY3Rpb248T2JqZWN0PikgKCkgLT4geworICAgICAgICAgICAgYW8uc2V0QWNjZXNzaWJsZSh0cnVlKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvaW5qZWN0b3IvV3JhcHBpbmdKZXJzZXlJbmplY3Rpb25UYXJnZXQuamF2YSBiL2luamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9pbmplY3Rvci9XcmFwcGluZ0plcnNleUluamVjdGlvblRhcmdldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMTY0OWYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvaW5qZWN0b3IvV3JhcHBpbmdKZXJzZXlJbmplY3Rpb25UYXJnZXQuamF2YQpAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuY2RpLnNlLmluamVjdG9yOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuc3BpLkNyZWF0aW9uYWxDb250ZXh0OworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LkluamVjdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuQmVhbjsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuSW5qZWN0aW9uUG9pbnQ7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkluamVjdGlvblRhcmdldDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25SZXNvbHZlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uTGF6eVZhbHVlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5WYWx1ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uVmFsdWVzOworCisvKioKKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJbmplY3Rpb25UYXJnZXR9IHRoYXQganVzdCB3cmFwcyB0aGUgcHJvdmlkZWQge0Bjb2RlIEluamVjdGlvblRhcmdldH0gYmVjYXVzZSBvZiBhZGRpdGlvbmFsCisgKiBmZWF0dXJlcyBpbiBhbiBpbmplY3Rpb24gcGhhc2UuCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK3B1YmxpYyBjbGFzcyBXcmFwcGluZ0plcnNleUluamVjdGlvblRhcmdldDxUPiBleHRlbmRzIEFic3RyYWN0SW5qZWN0aW9uVGFyZ2V0PFQ+IHsKKworICAgIHByaXZhdGUgc3RhdGljIEluamVjdGlvblRhcmdldCBOT09QX0lOSkVDVElPTl9UQVJHRVQgPSBuZXcgTm9PcEluamVjdGlvblRhcmdldCgpOworCisgICAgcHJpdmF0ZSBmaW5hbCBCZWFuPFQ+IGJlYW47CisgICAgcHJpdmF0ZSBmaW5hbCBMYXp5VmFsdWU8SmVyc2V5SW5zdGFuY2VJbmplY3RvcjxUPj4gaW5qZWN0b3I7CisgICAgcHJpdmF0ZSBmaW5hbCBJbmplY3Rpb25UYXJnZXQ8VD4gZGVsZWdhdGU7CisgICAgcHJpdmF0ZSBDb2xsZWN0aW9uPEluamVjdGlvblJlc29sdmVyPiByZXNvbHZlcnM7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGplcnNleSBpbmplY3Rpb24gdGFyZ2V0IHdpdGggZGVsZWdhdGUgYXMgYSB7QGxpbmsgTm9PcEluamVjdGlvblRhcmdldH0gdGhhdCBjcmVhdGVzIG5vIG9wZXJhdGlvbiB0aGF0CisgICAgICogbWVhbnMgdGhhdCBvbmx5IGplcnNleSBpbmplY3Rpb24gaXMgYXZhaWxhYmxlIGFzIGEgYWRkaXRpb25hbCBmZWF0dXJlLgorICAgICAqCisgICAgICogQHBhcmFtIGJlYW4gICAgICBiZWFuIGFzIGRlc2NyaXB0b3Igb2YgdGhlIGNsYXNzIHdoaWNoIHdpbGwgYmUgaW5qZWN0ZWQuCisgICAgICogQHBhcmFtIHJlc29sdmVycyBhbGwgcmVzb2x2ZXJzIHRoYXQgY2FuIHByb3ZpZGUgYSB2YWx1ZWQgZm9yIEplcnNleS1zcGVjaWZpYyBpbmplY3Rpb24uCisgICAgICovCisgICAgcHVibGljIFdyYXBwaW5nSmVyc2V5SW5qZWN0aW9uVGFyZ2V0KEJlYW48VD4gYmVhbiwgQ29sbGVjdGlvbjxJbmplY3Rpb25SZXNvbHZlcj4gcmVzb2x2ZXJzKSB7CisgICAgICAgIHRoaXMoTk9PUF9JTkpFQ1RJT05fVEFSR0VULCBiZWFuLCByZXNvbHZlcnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFuIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBJbmplY3Rpb25UYXJnZXR9IGZvciBjbGFzc2VzIHRoYXQgZG8gbm90IGZ1bGZpbGwgYmVhbiBjbGFzcyByZXF1aXJlbWVudHMKKyAgICAgKiAoZS5nLiBhcmUgYWJzdHJhY3Qgb3Igbm9uLXN0YXRpYyBpbm5lciBjbGFzc2VzKS4gSW5zdGFuY2VzIG9mIHRoZXNlIGNsYXNzIGNhbiBiZSBpbmplY3RlZCB1c2luZyB0aGlzIGltcGxlbWVudGF0aW9uLiBJZiB0aGUKKyAgICAgKiBhcHBsaWNhdGlvbiBhdHRlbXB0cyB0byB7QGxpbmsgI3Byb2R1Y2UoQ3JlYXRpb25hbENvbnRleHQpfSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgY2xhc3MsIHtAY29kZSBDcmVhdGlvbkV4Y2VwdGlvbn0gaXMKKyAgICAgKiB0aHJvd24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGVsZWdhdGUgIENESSBzcGVjaWZpYyBpbmplY3Rpb24gdGFyZ2V0LgorICAgICAqIEBwYXJhbSBiZWFuICAgICAgYmVhbiBhcyBkZXNjcmlwdG9yIG9mIHRoZSBjbGFzcyB3aGljaCB3aWxsIGJlIGluamVjdGVkLgorICAgICAqIEBwYXJhbSByZXNvbHZlcnMgYWxsIHJlc29sdmVycyB0aGF0IGNhbiBwcm92aWRlIGEgdmFsdWVkIGZvciBKZXJzZXktc3BlY2lmaWMgaW5qZWN0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBXcmFwcGluZ0plcnNleUluamVjdGlvblRhcmdldChJbmplY3Rpb25UYXJnZXQ8VD4gZGVsZWdhdGUsIEJlYW48VD4gYmVhbiwgQ29sbGVjdGlvbjxJbmplY3Rpb25SZXNvbHZlcj4gcmVzb2x2ZXJzKSB7CisgICAgICAgIHRoaXMuYmVhbiA9IGJlYW47CisgICAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKKyAgICAgICAgdGhpcy5yZXNvbHZlcnMgPSByZXNvbHZlcnM7CisgICAgICAgIHRoaXMuaW5qZWN0b3IgPSBWYWx1ZXMubGF6eSgoVmFsdWU8SmVyc2V5SW5zdGFuY2VJbmplY3RvcjxUPj4pCisgICAgICAgICAgICAgICAgKCkgLT4gbmV3IEplcnNleUluc3RhbmNlSW5qZWN0b3I8PihiZWFuLCB0aGlzLnJlc29sdmVycykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGluamVjdChUIGluc3RhbmNlLCBDcmVhdGlvbmFsQ29udGV4dDxUPiBjdHgpIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogSWYgYW4gaW5zdGFuY2UgY29udGFpbnMgYW55IGZpZWxkcyB3aGljaCBiZSBpbmplY3RlZCBieSBKZXJzZXkgdGhlbiBKZXJzZXkgYXR0ZW1wdHMgdG8gaW5qZWN0IHRoZW0gdXNpbmcgYW5ub3RhdGlvbnMKKyAgICAgICAgICogcmV0cmlldmVzIGZyb20gcmVnaXN0ZXJlZCBJbmplY3Rpb25SZXNvbHZlcnMuCisgICAgICAgICAqLworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW5qZWN0b3IuZ2V0KCkuaW5qZWN0KGluc3RhbmNlKTsKKyAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW5qZWN0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiRXhjZXB0aW9uIG9jY3VycmVkIGR1cmluZyBKZXJzZXkvSkFYLVJTIGFubm90YXRpb25zIHByb2Nlc3NpbmcgaW4gdGhlIGNsYXNzOiAiICsgYmVhbi5nZXRCZWFuQ2xhc3MoKSwgY2F1c2UpOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlIHJlc3Qgb2YgdGhlIGZpZWxkcyAoYW5ub3RhdGVkIGJ5IEBJbmplY3QpIGFyZSBpbmplY3RlZCB1c2luZyBDREkuCisgICAgICAgICAqLworICAgICAgICBzdXBlci5pbmplY3QoaW5zdGFuY2UsIGN0eCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgSW5qZWN0aW9uVGFyZ2V0PFQ+IGRlbGVnYXRlKCkgeworICAgICAgICByZXR1cm4gZGVsZWdhdGU7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm9PcEluamVjdGlvblRhcmdldCBpbXBsZW1lbnRzIEluamVjdGlvblRhcmdldDxPYmplY3Q+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgaW5qZWN0KE9iamVjdCBpbnN0YW5jZSwgQ3JlYXRpb25hbENvbnRleHQ8T2JqZWN0PiBjdHgpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBwb3N0Q29uc3RydWN0KE9iamVjdCBpbnN0YW5jZSkgeworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHByZURlc3Ryb3koT2JqZWN0IGluc3RhbmNlKSB7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE9iamVjdCBwcm9kdWNlKENyZWF0aW9uYWxDb250ZXh0PE9iamVjdD4gY3R4KSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKE9iamVjdCBpbnN0YW5jZSkgeworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTZXQ8SW5qZWN0aW9uUG9pbnQ+IGdldEluamVjdGlvblBvaW50cygpIHsKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyRmFjdG9yeSBiL2luamVjdC9jZGkyLXNlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlckZhY3RvcnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFmYWY4NwotLS0gL2Rldi9udWxsCisrKyBiL2luamVjdC9jZGkyLXNlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlckZhY3RvcnkKQEAgLTAsMCArMSwxNyBAQAorIworIyBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisjIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyMKKyMgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorIyBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisjIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorIyB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisjCisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorIworCitvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuY2RpLnNlLkNkaVNlSW5qZWN0aW9uTWFuYWdlckZhY3RvcnkKZGlmZiAtLWdpdCBhL2luamVjdC9jZGkyLXNlL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL2xvY2FsaXphdGlvbi5wcm9wZXJ0aWVzIGIvaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQyMjY5NwotLS0gL2Rldi9udWxsCisrKyBiL2luamVjdC9jZGkyLXNlL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL2xvY2FsaXphdGlvbi5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMTggQEAKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisjCisjIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyMgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorIyBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyMgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorIworIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyMKKworIyB7MH0gLSBmdWxsIGNsYXNzbmFtZQorY2RpMi5wcm92aWRlci5ub3QucmVnaXN0cmFibGU9UHJvdmlkZXIgcmVnaXN0ZXJlZCB0byBDZGlJbmplY3Rpb25NYW5hZ2VyIGNhbm5vdCBiZSBwcm9jZXNzIGJlY2F1c2Ugb2YgaW5jb21wYXRpYmxlIHR5cGU6IHswfS4KZGlmZiAtLWdpdCBhL2luamVjdC9jZGkyLXNlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9CaW5kaW5nVGVzdEhlbHBlci5qYXZhIGIvaW5qZWN0L2NkaTItc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL0JpbmRpbmdUZXN0SGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA0OTQzOQotLS0gL2Rldi9udWxsCisrKyBiL2luamVjdC9jZGkyLXNlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9CaW5kaW5nVGVzdEhlbHBlci5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0LmNkaS5zZTsKKworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5BYnN0cmFjdEJpbmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uczsKKworLyoqCisgKiBIZWxwZXIgY2xhc3MgdG8gbWluaW1pemUgdGhlIGNvZGUgaW4gdGVzdGVkIGNsYXNzZXMuCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK2NsYXNzIEJpbmRpbmdUZXN0SGVscGVyIHsKKworICAgIC8qKgorICAgICAqIEFjY2VwdHMgdGhlIHByb3ZpZGVkIGNvbnN1bWVyIHRvIGNyZWF0ZWQgYW5kIHJlZ2lzdGVyIHRoZSBiaW5kZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb24gbWFuYWdlciB3aGljaCBhY2NlcHRzIHRoZSBjb25zdW1lci4KKyAgICAgKiBAcGFyYW0gYmluZENvbnN1bWVyICAgICBjb25zdW1lciB0byBwb3B1bGF0ZSBhIGJpbmRlci4KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBiaW5kKEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciwgQ29uc3VtZXI8QWJzdHJhY3RCaW5kZXI+IGJpbmRDb25zdW1lcikgeworICAgICAgICBBYnN0cmFjdEJpbmRlciBiaW5kZXIgPSBuZXcgQWJzdHJhY3RCaW5kZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgICAgICBiaW5kQ29uc3VtZXIuYWNjZXB0KHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIGluamVjdGlvbk1hbmFnZXIucmVnaXN0ZXIoYmluZGVyKTsKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5jb21wbGV0ZVJlZ2lzdHJhdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIEluamVjdGlvbk1hbmFnZXJ9LgorICAgICAqCisgICAgICogQHJldHVybiBuZXdseSBjcmVhdGVkIHtAY29kZSBJbmplY3Rpb25NYW5hZ2VyfS4KKyAgICAgKi8KKyAgICBzdGF0aWMgSW5qZWN0aW9uTWFuYWdlciBjcmVhdGVJbmplY3Rpb25NYW5hZ2VyKCkgeworICAgICAgICByZXR1cm4gSW5qZWN0aW9ucy5jcmVhdGVJbmplY3Rpb25NYW5hZ2VyKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaW5qZWN0L2NkaTItc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL0NvbnZlcnNhdGlvbi5qYXZhIGIvaW5qZWN0L2NkaTItc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL0NvbnZlcnNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhN2YwMWMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmplY3QvY2RpMi1zZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvQ29udmVyc2F0aW9uLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuY2RpLnNlOworCitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3QuVmV0b2VkOworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CisKKy8qKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK0BWZXRvZWQKK2NsYXNzIENvbnZlcnNhdGlvbiB7CisKKyAgICBASW5qZWN0CisgICAgR3JlZXRpbmcgZ3JlZXRpbmc7CisKKyAgICBASW5qZWN0CisgICAgU3VwcGxpZXI8R3JlZXRpbmc+IGdyZWV0aW5nU3VwcGxpZXI7CisKK30KZGlmZiAtLWdpdCBhL2luamVjdC9jZGkyLXNlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9DemVjaENvbnZlcnNhdGlvbi5qYXZhIGIvaW5qZWN0L2NkaTItc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL0N6ZWNoQ29udmVyc2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA1YzQ4NAotLS0gL2Rldi9udWxsCisrKyBiL2luamVjdC9jZGkyLXNlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9DemVjaENvbnZlcnNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0LmNkaS5zZTsKKworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LlZldG9lZDsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworCisvKioKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitAVmV0b2VkCitjbGFzcyBDemVjaENvbnZlcnNhdGlvbiB7CisKKyAgICBASW5qZWN0CisgICAgQ3plY2hHcmVldGluZyBncmVldGluZzsKKworICAgIEBJbmplY3QKKyAgICBTdXBwbGllcjxDemVjaEdyZWV0aW5nPiBncmVldGluZ1N1cHBsaWVyOworCit9CmRpZmYgLS1naXQgYS9pbmplY3QvY2RpMi1zZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvQ3plY2hHcmVldGluZy5qYXZhIGIvaW5qZWN0L2NkaTItc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL0N6ZWNoR3JlZXRpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzdiOWU4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5qZWN0L2NkaTItc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL0N6ZWNoR3JlZXRpbmcuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5jZGkuc2U7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5WZXRvZWQ7CisKKy8qKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK0BWZXRvZWQKK3B1YmxpYyBjbGFzcyBDemVjaEdyZWV0aW5nIGltcGxlbWVudHMgR3JlZXRpbmcsIFByaW50YWJsZSB7CisKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEdSRUVUSU5HID0gIkFob2oiOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRHcmVldGluZygpIHsKKyAgICAgICAgcmV0dXJuIEdSRUVUSU5HICsgIiMiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcHJpbnQoKSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihHUkVFVElORyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJDemVjaEdyZWV0aW5nIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9pbmplY3QvY2RpMi1zZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvRGlzcG9zYWJsZVN1cHBsaWVySW1wbC5qYXZhIGIvaW5qZWN0L2NkaTItc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL0Rpc3Bvc2FibGVTdXBwbGllckltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Mzc2Y2UyCi0tLSAvZGV2L251bGwKKysrIGIvaW5qZWN0L2NkaTItc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL0Rpc3Bvc2FibGVTdXBwbGllckltcGwuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5jZGkuc2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LlZldG9lZDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5EaXNwb3NhYmxlU3VwcGxpZXI7CisKK0BWZXRvZWQKK3B1YmxpYyBjbGFzcyBEaXNwb3NhYmxlU3VwcGxpZXJJbXBsIGltcGxlbWVudHMgRGlzcG9zYWJsZVN1cHBsaWVyPFN0cmluZz4geworICAgIHByaXZhdGUgZmluYWwgQXRvbWljSW50ZWdlciBjb3VudGVyID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAvLyBDcmVhdGUgYSBuZXcgc3RyaW5nIC0gZG9uJ3Qgc2hhcmUgdGhlIGluc3RhbmNlcyBpbiB0aGUgc3RyaW5nIHBvb2wuCisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGNvdW50ZXIuaW5jcmVtZW50QW5kR2V0KCkgKyAiIik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZGlzcG9zZShmaW5hbCBTdHJpbmcgaW5zdGFuY2UpIHsKKyAgICAgICAgY291bnRlci5kZWNyZW1lbnRBbmRHZXQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9pbmplY3QvY2RpMi1zZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvRGlzcG9zYWJsZVN1cHBsaWVyVGVzdC5qYXZhIGIvaW5qZWN0L2NkaTItc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL0Rpc3Bvc2FibGVTdXBwbGllclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDgyMTU4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5qZWN0L2NkaTItc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL0Rpc3Bvc2FibGVTdXBwbGllclRlc3QuamF2YQpAQCAtMCwwICsxLDQ1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuY2RpLnNlOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljUmVmZXJlbmNlOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY1R5cGU7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5WZXRvZWQ7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0LmNkaS5zZS5iZWFuLkJlYW5IZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkRpc3Bvc2FibGVTdXBwbGllcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLmludGVybmFsLlJlcXVlc3RTY29wZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLmludGVybmFsLlJlcXVlc3RTY29wZWQ7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RTYW1lOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKKworLyoqCisgKiBUZXN0cyB0aGF0IHtAbGluayBEaXNwb3NhYmxlU3VwcGxpZXJ9IGlzIHByb3Blcmx5IHByb2Nlc3NlZCBieSB7QGxpbmsgQmVhbkhlbHBlcn0uCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK0BWZXRvZWQKK3B1YmxpYyBjbGFzcyBEaXNwb3NhYmxlU3VwcGxpZXJUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFR5cGUgRElTUE9TQUJMRV9TVVBQTElFUl9UWVBFID0KKyAgICAgICAgICAgIG5ldyBHZW5lcmljVHlwZTxEaXNwb3NhYmxlU3VwcGxpZXI8U3RyaW5nPj4oKSB7fS5nZXRUeXBlKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHlwZSBQUk9YSUFCTEVfRElTUE9TQUJMRV9TVVBQTElFUl9UWVBFID0KKyAgICAgICAgICAgIG5ldyBHZW5lcmljVHlwZTxEaXNwb3NhYmxlU3VwcGxpZXI8UHJveGlhYmxlSG9sZGVyPj4oKSB7fS5nZXRUeXBlKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHlwZSBTVVBQTElFUl9UWVBFID0gbmV3IEdlbmVyaWNUeXBlPFN1cHBsaWVyPFN0cmluZz4+KCkge30uZ2V0VHlwZSgpOworCisgICAgcHJpdmF0ZSBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXI7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXAoKSB7CisgICAgICAgIGluamVjdGlvbk1hbmFnZXIgPSBCaW5kaW5nVGVzdEhlbHBlci5jcmVhdGVJbmplY3Rpb25NYW5hZ2VyKCk7CisgICAgfQorCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgdGVhcmRvd24oKSB7CisgICAgICAgIGluamVjdGlvbk1hbmFnZXIuc2h1dGRvd24oKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCaW5kU2luZ2xldG9uQ2xhc3NEaXNwb3NhYmxlU3VwcGxpZXIoKSB7CisgICAgICAgIEJpbmRpbmdUZXN0SGVscGVyLmJpbmQoCisgICAgICAgICAgICAgICAgaW5qZWN0aW9uTWFuYWdlciwgYmluZGVyIC0+ICBiaW5kZXIuYmluZEZhY3RvcnkoRGlzcG9zYWJsZVN1cHBsaWVySW1wbC5jbGFzcywgU2luZ2xldG9uLmNsYXNzKS50byhTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICBPYmplY3Qgc3VwcGxpZXIgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKFNVUFBMSUVSX1RZUEUpOworICAgICAgICBPYmplY3QgZGlzcG9zYWJsZVN1cHBsaWVyID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShESVNQT1NBQkxFX1NVUFBMSUVSX1RZUEUpOworICAgICAgICBhc3NlcnROb3ROdWxsKHN1cHBsaWVyKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChkaXNwb3NhYmxlU3VwcGxpZXIpOworICAgICAgICBhc3NlcnRTYW1lKHN1cHBsaWVyLCBkaXNwb3NhYmxlU3VwcGxpZXIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJpbmRQZXJMb29rdXBDbGFzc0Rpc3Bvc2FibGVTdXBwbGllcigpIHsKKyAgICAgICAgQmluZGluZ1Rlc3RIZWxwZXIuYmluZChpbmplY3Rpb25NYW5hZ2VyLCBiaW5kZXIgLT4gYmluZGVyLmJpbmRGYWN0b3J5KERpc3Bvc2FibGVTdXBwbGllckltcGwuY2xhc3MpLnRvKFN0cmluZy5jbGFzcykpOworCisgICAgICAgIE9iamVjdCBzdXBwbGllciA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoU1VQUExJRVJfVFlQRSk7CisgICAgICAgIE9iamVjdCBkaXNwb3NhYmxlU3VwcGxpZXIgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKERJU1BPU0FCTEVfU1VQUExJRVJfVFlQRSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoc3VwcGxpZXIpOworICAgICAgICBhc3NlcnROb3ROdWxsKGRpc3Bvc2FibGVTdXBwbGllcik7CisgICAgICAgIGFzc2VydE5vdFNhbWUoc3VwcGxpZXIsIGRpc3Bvc2FibGVTdXBwbGllcik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmluZEluc3RhbmNlRGlzcG9zYWJsZVN1cHBsaWVyKCkgeworICAgICAgICBCaW5kaW5nVGVzdEhlbHBlci5iaW5kKGluamVjdGlvbk1hbmFnZXIsIGJpbmRlciAtPiBiaW5kZXIuYmluZEZhY3RvcnkobmV3IERpc3Bvc2FibGVTdXBwbGllckltcGwoKSkudG8oU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgT2JqZWN0IHN1cHBsaWVyID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShTVVBQTElFUl9UWVBFKTsKKyAgICAgICAgT2JqZWN0IGRpc3Bvc2FibGVTdXBwbGllciA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoRElTUE9TQUJMRV9TVVBQTElFUl9UWVBFKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChzdXBwbGllcik7CisgICAgICAgIGFzc2VydE5vdE51bGwoZGlzcG9zYWJsZVN1cHBsaWVyKTsKKyAgICAgICAgYXNzZXJ0U2FtZShzdXBwbGllciwgZGlzcG9zYWJsZVN1cHBsaWVyKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RCaW5kQ2xhc3NEaXNwb3NhYmxlU3VwcGxpZXIoKSB7CisgICAgICAgIEJpbmRpbmdUZXN0SGVscGVyLmJpbmQoaW5qZWN0aW9uTWFuYWdlciwgYmluZGVyIC0+IGJpbmRlci5iaW5kRmFjdG9yeShTdXBwbGllckdyZWV0aW5nLmNsYXNzKS50byhTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKERJU1BPU0FCTEVfU1VQUExJRVJfVFlQRSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vdEJpbmRJbnN0YW5jZURpc3Bvc2FibGVTdXBwbGllcigpIHsKKyAgICAgICAgQmluZGluZ1Rlc3RIZWxwZXIuYmluZChpbmplY3Rpb25NYW5hZ2VyLCBiaW5kZXIgLT4gYmluZGVyLmJpbmRGYWN0b3J5KG5ldyBTdXBwbGllckdyZWV0aW5nKCkpLnRvKFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnROdWxsKGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoRElTUE9TQUJMRV9TVVBQTElFUl9UWVBFKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25seUluY3JlbWVudFNpbmdsZXRvblN1cHBsaWVyKCkgeworICAgICAgICBCaW5kaW5nVGVzdEhlbHBlci5iaW5kKGluamVjdGlvbk1hbmFnZXIsIGJpbmRlciAtPiBiaW5kZXIuYmluZEZhY3RvcnkoRGlzcG9zYWJsZVN1cHBsaWVySW1wbC5jbGFzcywgU2luZ2xldG9uLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgLnRvKFN0cmluZy5jbGFzcykpOworCisgICAgICAgIE9iamVjdCBpbnN0YW5jZTEgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKERJU1BPU0FCTEVfU1VQUExJRVJfVFlQRSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMSIsICgoRGlzcG9zYWJsZVN1cHBsaWVyPD8+KSBpbnN0YW5jZTEpLmdldCgpKTsKKyAgICAgICAgT2JqZWN0IGluc3RhbmNlMiA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoRElTUE9TQUJMRV9TVVBQTElFUl9UWVBFKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIyIiwgKChEaXNwb3NhYmxlU3VwcGxpZXI8Pz4pIGluc3RhbmNlMikuZ2V0KCkpOworICAgICAgICBPYmplY3QgaW5zdGFuY2UzID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShESVNQT1NBQkxFX1NVUFBMSUVSX1RZUEUpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjMiLCAoKERpc3Bvc2FibGVTdXBwbGllcjw/PikgaW5zdGFuY2UzKS5nZXQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25seUluY3JlbWVudEluc3RhbmNlU3VwcGxpZXIoKSB7CisgICAgICAgIEJpbmRpbmdUZXN0SGVscGVyLmJpbmQoaW5qZWN0aW9uTWFuYWdlciwgYmluZGVyIC0+IGJpbmRlci5iaW5kRmFjdG9yeShuZXcgRGlzcG9zYWJsZVN1cHBsaWVySW1wbCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgLnRvKFN0cmluZy5jbGFzcykpOworCisgICAgICAgIE9iamVjdCBpbnN0YW5jZTEgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKERJU1BPU0FCTEVfU1VQUExJRVJfVFlQRSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMSIsICgoRGlzcG9zYWJsZVN1cHBsaWVyPD8+KSBpbnN0YW5jZTEpLmdldCgpKTsKKyAgICAgICAgT2JqZWN0IGluc3RhbmNlMiA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoRElTUE9TQUJMRV9TVVBQTElFUl9UWVBFKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIyIiwgKChEaXNwb3NhYmxlU3VwcGxpZXI8Pz4pIGluc3RhbmNlMikuZ2V0KCkpOworICAgICAgICBPYmplY3QgaW5zdGFuY2UzID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShESVNQT1NBQkxFX1NVUFBMSUVSX1RZUEUpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjMiLCAoKERpc3Bvc2FibGVTdXBwbGllcjw/PikgaW5zdGFuY2UzKS5nZXQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25seUluY3JlbWVudFBlckxvb2t1cFN1cHBsaWVyKCkgeworICAgICAgICBCaW5kaW5nVGVzdEhlbHBlci5iaW5kKGluamVjdGlvbk1hbmFnZXIsIGJpbmRlciAtPiBiaW5kZXIuYmluZEZhY3RvcnkoRGlzcG9zYWJsZVN1cHBsaWVySW1wbC5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgIC50byhTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICBPYmplY3QgaW5zdGFuY2UxID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShESVNQT1NBQkxFX1NVUFBMSUVSX1RZUEUpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCAoKERpc3Bvc2FibGVTdXBwbGllcjw/PikgaW5zdGFuY2UxKS5nZXQoKSk7CisgICAgICAgIE9iamVjdCBpbnN0YW5jZTIgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKERJU1BPU0FCTEVfU1VQUExJRVJfVFlQRSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMSIsICgoRGlzcG9zYWJsZVN1cHBsaWVyPD8+KSBpbnN0YW5jZTIpLmdldCgpKTsKKyAgICAgICAgT2JqZWN0IGluc3RhbmNlMyA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoRElTUE9TQUJMRV9TVVBQTElFUl9UWVBFKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgKChEaXNwb3NhYmxlU3VwcGxpZXI8Pz4pIGluc3RhbmNlMykuZ2V0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9ubHlJbmNyZW1lbnRTaW5nbGV0b25JbnN0YW5jZXMoKSB7CisgICAgICAgIEJpbmRpbmdUZXN0SGVscGVyLmJpbmQoaW5qZWN0aW9uTWFuYWdlciwgYmluZGVyIC0+IGJpbmRlci5iaW5kRmFjdG9yeShEaXNwb3NhYmxlU3VwcGxpZXJJbXBsLmNsYXNzLCBTaW5nbGV0b24uY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAudG8oU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgT2JqZWN0IGluc3RhbmNlMSA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgaW5zdGFuY2UxKTsKKyAgICAgICAgT2JqZWN0IGluc3RhbmNlMiA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIyIiwgaW5zdGFuY2UyKTsKKyAgICAgICAgT2JqZWN0IGluc3RhbmNlMyA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIzIiwgaW5zdGFuY2UzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPbmx5SW5jcmVtZW50SW5zdGFuY2VJbnN0YW5jZSgpIHsKKyAgICAgICAgQmluZGluZ1Rlc3RIZWxwZXIuYmluZChpbmplY3Rpb25NYW5hZ2VyLCBiaW5kZXIgLT4gYmluZGVyLmJpbmRGYWN0b3J5KG5ldyBEaXNwb3NhYmxlU3VwcGxpZXJJbXBsKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAudG8oU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgT2JqZWN0IGluc3RhbmNlMSA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgaW5zdGFuY2UxKTsKKyAgICAgICAgT2JqZWN0IGluc3RhbmNlMiA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIyIiwgaW5zdGFuY2UyKTsKKyAgICAgICAgT2JqZWN0IGluc3RhbmNlMyA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIzIiwgaW5zdGFuY2UzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPbmx5SW5jcmVtZW50UGVyTG9va3VwSW5zdGFuY2UoKSB7CisgICAgICAgIEJpbmRpbmdUZXN0SGVscGVyCisgICAgICAgICAgICAgICAgLmJpbmQoaW5qZWN0aW9uTWFuYWdlciwgYmluZGVyIC0+IGJpbmRlci5iaW5kRmFjdG9yeShEaXNwb3NhYmxlU3VwcGxpZXJJbXBsLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgLnRvKFN0cmluZy5jbGFzcykpOworCisgICAgICAgIE9iamVjdCBpbnN0YW5jZTEgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiMSIsIGluc3RhbmNlMSk7CisgICAgICAgIE9iamVjdCBpbnN0YW5jZTIgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiMSIsIGluc3RhbmNlMik7CisgICAgICAgIE9iamVjdCBpbnN0YW5jZTMgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiMSIsIGluc3RhbmNlMyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzcG9zZVNpbmdsZXRvblN1cHBsaWVyKCkgeworICAgICAgICBCaW5kaW5nVGVzdEhlbHBlci5iaW5kKGluamVjdGlvbk1hbmFnZXIsIGJpbmRlciAtPiBiaW5kZXIuYmluZEZhY3RvcnkoRGlzcG9zYWJsZVN1cHBsaWVySW1wbC5jbGFzcywgU2luZ2xldG9uLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgLnRvKFN0cmluZy5jbGFzcykpOworCisgICAgICAgIC8vIDEtMQorICAgICAgICBEaXNwb3NhYmxlU3VwcGxpZXI8U3RyaW5nPiBzdXBwbGllcjEgPQorICAgICAgICAgICAgICAgIGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoRElTUE9TQUJMRV9TVVBQTElFUl9UWVBFKTsKKyAgICAgICAgU3RyaW5nIGluc3RhbmNlMSA9IHN1cHBsaWVyMS5nZXQoKTsKKyAgICAgICAgLy8gMi0yCisgICAgICAgIERpc3Bvc2FibGVTdXBwbGllcjxTdHJpbmc+IHN1cHBsaWVyMiA9CisgICAgICAgICAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShESVNQT1NBQkxFX1NVUFBMSUVSX1RZUEUpOworICAgICAgICBTdHJpbmcgaW5zdGFuY2UyID0gc3VwcGxpZXIyLmdldCgpOworICAgICAgICAvLyAzLTMKKyAgICAgICAgRGlzcG9zYWJsZVN1cHBsaWVyPFN0cmluZz4gc3VwcGxpZXIzID0KKyAgICAgICAgICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKERJU1BPU0FCTEVfU1VQUExJRVJfVFlQRSk7CisgICAgICAgIHN1cHBsaWVyMy5nZXQoKTsKKyAgICAgICAgLy8gMi0yCisgICAgICAgIHN1cHBsaWVyMS5kaXNwb3NlKGluc3RhbmNlMSk7CisgICAgICAgIC8vIDEtMQorICAgICAgICBzdXBwbGllcjIuZGlzcG9zZShpbnN0YW5jZTIpOworICAgICAgICAvLyAyLTIKKyAgICAgICAgU3VwcGxpZXI8U3RyaW5nPiBzdXBwbGllcjQgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKERJU1BPU0FCTEVfU1VQUExJRVJfVFlQRSk7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSBzdXBwbGllcjQuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiMiIsIHJlc3VsdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzcG9zZVBlckxvb2t1cFN1cHBsaWVyKCkgeworICAgICAgICBCaW5kaW5nVGVzdEhlbHBlci5iaW5kKGluamVjdGlvbk1hbmFnZXIsIGJpbmRlciAtPiBiaW5kZXIuYmluZEZhY3RvcnkoRGlzcG9zYWJsZVN1cHBsaWVySW1wbC5jbGFzcykKKyAgICAgICAgICAgICAgICAudG8oU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgLy8gMQorICAgICAgICBEaXNwb3NhYmxlU3VwcGxpZXI8U3RyaW5nPiBzdXBwbGllcjEgPQorICAgICAgICAgICAgICAgIGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoRElTUE9TQUJMRV9TVVBQTElFUl9UWVBFKTsKKyAgICAgICAgU3RyaW5nIGluc3RhbmNlMSA9IHN1cHBsaWVyMS5nZXQoKTsKKyAgICAgICAgLy8gMQorICAgICAgICBEaXNwb3NhYmxlU3VwcGxpZXI8U3RyaW5nPiBzdXBwbGllcjIgPQorICAgICAgICAgICAgICAgIGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoRElTUE9TQUJMRV9TVVBQTElFUl9UWVBFKTsKKyAgICAgICAgU3RyaW5nIGluc3RhbmNlMiA9IHN1cHBsaWVyMi5nZXQoKTsKKyAgICAgICAgLy8gMQorICAgICAgICBEaXNwb3NhYmxlU3VwcGxpZXI8U3RyaW5nPiBzdXBwbGllcjMgPQorICAgICAgICAgICAgICAgIGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoRElTUE9TQUJMRV9TVVBQTElFUl9UWVBFKTsKKyAgICAgICAgc3VwcGxpZXIzLmdldCgpOworICAgICAgICAvLyAwCisgICAgICAgIHN1cHBsaWVyMS5kaXNwb3NlKGluc3RhbmNlMSk7CisgICAgICAgIC8vIDAKKyAgICAgICAgc3VwcGxpZXIyLmRpc3Bvc2UoaW5zdGFuY2UyKTsKKyAgICAgICAgLy8gMQorICAgICAgICBTdXBwbGllcjxTdHJpbmc+IHN1cHBsaWVyNCA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoRElTUE9TQUJMRV9TVVBQTElFUl9UWVBFKTsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHN1cHBsaWVyNC5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgcmVzdWx0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REaXNwb3NlU2luZ2xldG9uU3VwcGxpZXJSZXF1ZXN0U2NvcGVkSW5zdGFuY2UoKSB7CisgICAgICAgIEJpbmRpbmdUZXN0SGVscGVyLmJpbmQoaW5qZWN0aW9uTWFuYWdlciwgYmluZGVyIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgYmluZGVyLmJpbmRGYWN0b3J5KFByb3hpYWJsZURpc3Bvc2FibGVTdXBwbGllckltcGwuY2xhc3MsIFNpbmdsZXRvbi5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG8oUHJveGlhYmxlSG9sZGVyLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbihSZXF1ZXN0U2NvcGVkLmNsYXNzKTsKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICBSZXF1ZXN0U2NvcGUgcmVxdWVzdCA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoUmVxdWVzdFNjb3BlLmNsYXNzKTsKKyAgICAgICAgQXRvbWljUmVmZXJlbmNlPFN1cHBsaWVyPFByb3hpYWJsZUhvbGRlcj4+IGF0b21pY1N1cHBsaWVyID0gbmV3IEF0b21pY1JlZmVyZW5jZTw+KCk7CisgICAgICAgIHJlcXVlc3QucnVuSW5TY29wZSgoKSAtPiB7CisgICAgICAgICAgICAvLyBTYXZlIFNpbmdsZXRvbiBTdXBwbGllciBmb3IgbGF0ZXIgY2hlY2sgdGhhdCB0aGUgaW5zdGFuY2Ugd2FzIGRpc3Bvc2VkLgorICAgICAgICAgICAgU3VwcGxpZXI8UHJveGlhYmxlSG9sZGVyPiBzdXBwbGllciA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoUFJPWElBQkxFX0RJU1BPU0FCTEVfU1VQUExJRVJfVFlQRSk7CisgICAgICAgICAgICBhdG9taWNTdXBwbGllci5zZXQoc3VwcGxpZXIpOworCisgICAgICAgICAgICAvLyBBbGwgaW5zdGFuY2VzIHNob3VsZCBiZSB0aGUgc2FtZSBiZWNhdXNlIHRoZXkgYXJlIHJlcXVlc3Qgc2NvcGVkLgorICAgICAgICAgICAgUHJveGlhYmxlSG9sZGVyIGluc3RhbmNlMSA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoUHJveGlhYmxlSG9sZGVyLmNsYXNzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMSIsIGluc3RhbmNlMS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIFByb3hpYWJsZUhvbGRlciBpbnN0YW5jZTIgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKFByb3hpYWJsZUhvbGRlci5jbGFzcyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCBpbnN0YW5jZTIuZ2V0VmFsdWUoKSk7CisgICAgICAgIH0pOworCisgICAgICAgIFN1cHBsaWVyPFByb3hpYWJsZUhvbGRlcj4gY2xlYW5lZFN1cHBsaWVyID0gYXRvbWljU3VwcGxpZXIuZ2V0KCk7CisgICAgICAgIC8vIE5leHQgc2hvdWxkIGJlIDEtMQorICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCBjbGVhbmVkU3VwcGxpZXIuZ2V0KCkuZ2V0VmFsdWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCBvYmplY3QgY3JlYXRlZCBpbiByZXF1ZXN0IHNjb3BlIGlzIGRpc3Bvc2luZyBhdCB0aGUgdGltZSBvZiBlbmRpbmcgdGhlIHNjb3BlLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERpc3Bvc2VQZXJMb29rdXBTdXBwbGllclJlcXVlc3RTY29wZWRJbnN0YW5jZSgpIHsKKyAgICAgICAgQmluZGluZ1Rlc3RIZWxwZXIuYmluZChpbmplY3Rpb25NYW5hZ2VyLCBiaW5kZXIgLT4geworICAgICAgICAgICAgICAgICAgICBiaW5kZXIuYmluZEZhY3RvcnkoUHJveGlhYmxlRGlzcG9zYWJsZVN1cHBsaWVySW1wbC5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG8oUHJveGlhYmxlSG9sZGVyLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbihSZXF1ZXN0U2NvcGVkLmNsYXNzKTsKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICBSZXF1ZXN0U2NvcGUgcmVxdWVzdCA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoUmVxdWVzdFNjb3BlLmNsYXNzKTsKKyAgICAgICAgQXRvbWljUmVmZXJlbmNlPFN1cHBsaWVyPFByb3hpYWJsZUhvbGRlcj4+IGF0b21pY1N1cHBsaWVyID0gbmV3IEF0b21pY1JlZmVyZW5jZTw+KCk7CisgICAgICAgIHJlcXVlc3QucnVuSW5TY29wZSgoKSAtPiB7CisgICAgICAgICAgICAvLyBTYXZlIFNpbmdsZXRvbiBTdXBwbGllciBmb3IgbGF0ZXIgY2hlY2sgdGhhdCB0aGUgaW5zdGFuY2Ugd2FzIGRpc3Bvc2VkLgorICAgICAgICAgICAgU3VwcGxpZXI8UHJveGlhYmxlSG9sZGVyPiBzdXBwbGllciA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoUFJPWElBQkxFX0RJU1BPU0FCTEVfU1VQUExJRVJfVFlQRSk7CisgICAgICAgICAgICBhdG9taWNTdXBwbGllci5zZXQoc3VwcGxpZXIpOworCisgICAgICAgICAgICAvLyBBbGwgaW5zdGFuY2VzIHNob3VsZCBiZSB0aGUgc2FtZSBiZWNhdXNlIHRoZXkgYXJlIHJlcXVlc3Qgc2NvcGVkLgorICAgICAgICAgICAgUHJveGlhYmxlSG9sZGVyIGluc3RhbmNlMSA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoUHJveGlhYmxlSG9sZGVyLmNsYXNzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMSIsIGluc3RhbmNlMS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIFByb3hpYWJsZUhvbGRlciBpbnN0YW5jZTIgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKFByb3hpYWJsZUhvbGRlci5jbGFzcyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCBpbnN0YW5jZTIuZ2V0VmFsdWUoKSk7CisgICAgICAgIH0pOworCisgICAgICAgIFN1cHBsaWVyPFByb3hpYWJsZUhvbGRlcj4gY2xlYW5lZFN1cHBsaWVyID0gYXRvbWljU3VwcGxpZXIuZ2V0KCk7CisgICAgICAgIC8vIE5leHQgc2hvdWxkIGJlIDEKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgY2xlYW5lZFN1cHBsaWVyLmdldCgpLmdldFZhbHVlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQgaW5oZXJpdGVkIHJlcXVlc3Qgc2NvcGVkIGlzIGFsc28gY2xlYW5lZCBieSBkaXNwb3NpbmcgdGhlIG9iamVjdHMuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzcG9zZVNpbmdsZXRvblN1cHBsaWVyTXVsdGlSZXF1ZXN0U2NvcGVkKCkgeworICAgICAgICBCaW5kaW5nVGVzdEhlbHBlci5iaW5kKGluamVjdGlvbk1hbmFnZXIsIGJpbmRlciAtPiB7CisgICAgICAgICAgICAgICAgICAgIGJpbmRlci5iaW5kRmFjdG9yeShQcm94aWFibGVEaXNwb3NhYmxlU3VwcGxpZXJJbXBsLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50byhQcm94aWFibGVIb2xkZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmluKFJlcXVlc3RTY29wZWQuY2xhc3MpOworICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgIFJlcXVlc3RTY29wZSByZXF1ZXN0ID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShSZXF1ZXN0U2NvcGUuY2xhc3MpOworICAgICAgICBBdG9taWNSZWZlcmVuY2U8U3VwcGxpZXI8UHJveGlhYmxlSG9sZGVyPj4gZmlyc3RTdXBwbGllciA9IG5ldyBBdG9taWNSZWZlcmVuY2U8PigpOworICAgICAgICBBdG9taWNSZWZlcmVuY2U8U3VwcGxpZXI8UHJveGlhYmxlSG9sZGVyPj4gc2Vjb25kU3VwcGxpZXIgPSBuZXcgQXRvbWljUmVmZXJlbmNlPD4oKTsKKworICAgICAgICByZXF1ZXN0LnJ1bkluU2NvcGUoKCkgLT4geworICAgICAgICAgICAgU3VwcGxpZXI8UHJveGlhYmxlSG9sZGVyPiBzdXBwbGllcjEgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKFBST1hJQUJMRV9ESVNQT1NBQkxFX1NVUFBMSUVSX1RZUEUpOworICAgICAgICAgICAgZmlyc3RTdXBwbGllci5zZXQoc3VwcGxpZXIxKTsKKworICAgICAgICAgICAgUHJveGlhYmxlSG9sZGVyIGluc3RhbmNlMSA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoUHJveGlhYmxlSG9sZGVyLmNsYXNzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMSIsIGluc3RhbmNlMS5nZXRWYWx1ZSgpKTsKKworICAgICAgICAgICAgcmVxdWVzdC5ydW5JblNjb3BlKCgpIC0+IHsKKyAgICAgICAgICAgICAgICAvLyBTYXZlIFNpbmdsZXRvbiBTdXBwbGllciBmb3IgbGF0ZXIgY2hlY2sgdGhhdCB0aGUgaW5zdGFuY2Ugd2FzIGRpc3Bvc2VkLgorICAgICAgICAgICAgICAgIFN1cHBsaWVyPFByb3hpYWJsZUhvbGRlcj4gc3VwcGxpZXIyID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShQUk9YSUFCTEVfRElTUE9TQUJMRV9TVVBQTElFUl9UWVBFKTsKKyAgICAgICAgICAgICAgICBzZWNvbmRTdXBwbGllci5zZXQoc3VwcGxpZXIyKTsKKworICAgICAgICAgICAgICAgIFByb3hpYWJsZUhvbGRlciBpbnN0YW5jZTIgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKFByb3hpYWJsZUhvbGRlci5jbGFzcyk7CisgICAgICAgICAgICAgICAgLy8gMS0yIGJlY2F1c2UgdGhlIHNhbWUgc3RhdGljIGNsYXNzIGlzIHVzZWQgaW4gaW5oZXJpdGVkIHJ1bkluU2NvcGUKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCBpbnN0YW5jZTIuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgU3VwcGxpZXI8UHJveGlhYmxlSG9sZGVyPiBjbGVhbmVkU3VwcGxpZXIxID0gZmlyc3RTdXBwbGllci5nZXQoKTsKKyAgICAgICAgU3VwcGxpZXI8UHJveGlhYmxlSG9sZGVyPiBjbGVhbmVkU3VwcGxpZXIyID0gc2Vjb25kU3VwcGxpZXIuZ2V0KCk7CisgICAgICAgIC8vIE5leHQgc2hvdWxkIGJlIDEtMQorICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCBjbGVhbmVkU3VwcGxpZXIxLmdldCgpLmdldFZhbHVlKCkpOworICAgICAgICAvLyAxLTIgYmVjYXVzZSB0aGUgc2FtZSBzdGF0aWMgY2xhc3MgaXMgdXNlZCBidXQgdGhlIGluc3RhbmNlIGlzIGNsZWFuZWQuCisgICAgICAgIGFzc2VydEVxdWFscygiMSIsIGNsZWFuZWRTdXBwbGllcjIuZ2V0KCkuZ2V0VmFsdWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyTG9va3VwIGZpZWxkcyBhcmUgbm90IGRpc3Bvc2VkIHRoZXJlZm9yZSB0aGV5IHNob3VsZCBuZXZlciBiZSB1c2VkIGFzIGEgRGlzcG9zZWRTdXBwbGllciBiZWNhdXNlIHRoZSBmaWVsZCBzdGF5IGluCisgICAgICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5jZGkuc2UuYmVhbi5TdXBwbGllckNsYXNzQmVhbn0gZm9yZXZlci4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REaXNwb3NlQ29tcG9zZWRPYmplY3RXaXRoUGVyTG9va3VwRmllbGRzKCkgeworICAgICAgICBCaW5kaW5nVGVzdEhlbHBlci5iaW5kKGluamVjdGlvbk1hbmFnZXIsIGJpbmRlciAtPiB7CisgICAgICAgICAgICAgICAgICAgIGJpbmRlci5iaW5kRmFjdG9yeShEaXNwb3NhYmxlU3VwcGxpZXJJbXBsLmNsYXNzLCBTaW5nbGV0b24uY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvKFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgICAgICAgICAgICAgYmluZGVyLmJpbmRBc0NvbnRyYWN0KENvbXBvc2VkT2JqZWN0LmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbihSZXF1ZXN0U2NvcGVkLmNsYXNzKTsKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICBSZXF1ZXN0U2NvcGUgcmVxdWVzdCA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoUmVxdWVzdFNjb3BlLmNsYXNzKTsKKyAgICAgICAgQXRvbWljUmVmZXJlbmNlPFN1cHBsaWVyPFN0cmluZz4+IGF0b21pY1N1cHBsaWVyID0gbmV3IEF0b21pY1JlZmVyZW5jZTw+KCk7CisgICAgICAgIHJlcXVlc3QucnVuSW5TY29wZSgoKSAtPiB7CisgICAgICAgICAgICAvLyBTYXZlIFNpbmdsZXRvbiBTdXBwbGllciBmb3IgbGF0ZXIgY2hlY2sgdGhhdCB0aGUgaW5zdGFuY2Ugd2FzIGRpc3Bvc2VkLgorICAgICAgICAgICAgU3VwcGxpZXI8U3RyaW5nPiBzdXBwbGllciA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoRElTUE9TQUJMRV9TVVBQTElFUl9UWVBFKTsKKyAgICAgICAgICAgIGF0b21pY1N1cHBsaWVyLnNldChzdXBwbGllcik7CisKKyAgICAgICAgICAgIC8vIEFsbCBpbnN0YW5jZXMgc2hvdWxkIGJlIHRoZSBzYW1lIGJlY2F1c2UgdGhleSBhcmUgcmVxdWVzdCBzY29wZWQuCisgICAgICAgICAgICBDb21wb3NlZE9iamVjdCBpbnN0YW5jZSA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoQ29tcG9zZWRPYmplY3QuY2xhc3MpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgaW5zdGFuY2UuZ2V0Rmlyc3QoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjIiLCBpbnN0YW5jZS5nZXRTZWNvbmQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjMiLCBpbnN0YW5jZS5nZXRUaGlyZCgpKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgU3VwcGxpZXI8U3RyaW5nPiBjbGVhbmVkU3VwcGxpZXIgPSBhdG9taWNTdXBwbGllci5nZXQoKTsKKyAgICAgICAgLy8gTmV4dCBzaG91bGQgYmUgMSAtIGFsbCBpbnN0YW5jZXMgYXJlIGRpc3Bvc2VkIGFuZCBkZWNyZW1lbnRlZCBiYWNrCisgICAgICAgIGFzc2VydEVxdWFscygiMSIsIGNsZWFuZWRTdXBwbGllci5nZXQoKSk7CisgICAgfQorCisgICAgQFZldG9lZAorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENvbXBvc2VkT2JqZWN0IHsKKworICAgICAgICBASW5qZWN0CisgICAgICAgIFN0cmluZyBmaXJzdDsKKworICAgICAgICBASW5qZWN0CisgICAgICAgIFN0cmluZyBzZWNvbmQ7CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBTdHJpbmcgdGhpcmQ7CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRGaXJzdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBmaXJzdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2Vjb25kKCkgeworICAgICAgICAgICAgcmV0dXJuIHNlY29uZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGhpcmQoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcmQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVmV0b2VkCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGlzcG9zYWJsZVN1cHBsaWVySW1wbCBpbXBsZW1lbnRzIERpc3Bvc2FibGVTdXBwbGllcjxTdHJpbmc+IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNJbnRlZ2VyIGNvdW50ZXIgPSBuZXcgQXRvbWljSW50ZWdlcigpOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBzdHJpbmcgLSBkb24ndCBzaGFyZSB0aGUgaW5zdGFuY2VzIGluIHRoZSBzdHJpbmcgcG9vbC4KKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGNvdW50ZXIuaW5jcmVtZW50QW5kR2V0KCkgKyAiIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZShmaW5hbCBTdHJpbmcgaW5zdGFuY2UpIHsKKyAgICAgICAgICAgIGNvdW50ZXIuZGVjcmVtZW50QW5kR2V0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVmV0b2VkCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJveGlhYmxlRGlzcG9zYWJsZVN1cHBsaWVySW1wbCBpbXBsZW1lbnRzIERpc3Bvc2FibGVTdXBwbGllcjxQcm94aWFibGVIb2xkZXI+IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNJbnRlZ2VyIGNvdW50ZXIgPSBuZXcgQXRvbWljSW50ZWdlcigpOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUHJveGlhYmxlSG9sZGVyIGdldCgpIHsKKyAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBzdHJpbmcgLSBkb24ndCBzaGFyZSB0aGUgaW5zdGFuY2VzIGluIHRoZSBzdHJpbmcgcG9vbC4KKyAgICAgICAgICAgIHJldHVybiBuZXcgUHJveGlhYmxlSG9sZGVyKGNvdW50ZXIuaW5jcmVtZW50QW5kR2V0KCkgKyAiIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZShQcm94aWFibGVIb2xkZXIgaW5zdGFuY2UpIHsKKyAgICAgICAgICAgIGNvdW50ZXIuZGVjcmVtZW50QW5kR2V0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVmV0b2VkCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUHJveGlhYmxlSG9sZGVyIHsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKyAgICAgICAgcHVibGljIFByb3hpYWJsZUhvbGRlcihTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9pbmplY3QvY2RpMi1zZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvRW5nbGlzaEdyZWV0aW5nLmphdmEgYi9pbmplY3QvY2RpMi1zZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvRW5nbGlzaEdyZWV0aW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EyMWVhOAotLS0gL2Rldi9udWxsCisrKyBiL2luamVjdC9jZGkyLXNlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9FbmdsaXNoR3JlZXRpbmcuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5jZGkuc2U7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5WZXRvZWQ7CisKKy8qKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK0BWZXRvZWQKK3B1YmxpYyBjbGFzcyBFbmdsaXNoR3JlZXRpbmcgaW1wbGVtZW50cyBHcmVldGluZywgUHJpbnRhYmxlIHsKKworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JFRVRJTkcgPSAiSGVsbG8iOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRHcmVldGluZygpIHsKKyAgICAgICAgcmV0dXJuIEdSRUVUSU5HICsgIiMiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcHJpbnQoKSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihHUkVFVElORyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJFbmdsaXNoR3JlZXRpbmciOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2luamVjdC9jZGkyLXNlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9HcmVldGluZy5qYXZhIGIvaW5qZWN0L2NkaTItc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL0dyZWV0aW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhjMjhhZQotLS0gL2Rldi9udWxsCisrKyBiL2luamVjdC9jZGkyLXNlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9HcmVldGluZy5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0LmNkaS5zZTsKKworLyoqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworQEZ1bmN0aW9uYWxJbnRlcmZhY2UKK3B1YmxpYyBpbnRlcmZhY2UgR3JlZXRpbmcgeworCisgICAgLyoqCisgICAgICogUmV0dXJucyBncmVldGluZyBpbiBhIHNwZWNpZmljIGxhbmd1YWdlLgorICAgICAqCisgICAgICogQHJldHVybiB0eXBlIG9mIHRoZSBncmVldGluZy4KKyAgICAgKi8KKyAgICBTdHJpbmcgZ2V0R3JlZXRpbmcoKTsKKworfQpkaWZmIC0tZ2l0IGEvaW5qZWN0L2NkaTItc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL015U3VwcGxpZXIuamF2YSBiL2luamVjdC9jZGkyLXNlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9NeVN1cHBsaWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM1YjNjMgotLS0gL2Rldi9udWxsCisrKyBiL2luamVjdC9jZGkyLXNlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9NeVN1cHBsaWVyLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuY2RpLnNlOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOworCitwdWJsaWMgY2xhc3MgTXlTdXBwbGllciBpbXBsZW1lbnRzIFN1cHBsaWVyPEludGVnZXI+IHsKKworICAgIHByaXZhdGUgZmluYWwgQXRvbWljSW50ZWdlciBjb3VudGVyID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBJbnRlZ2VyIGdldCgpIHsKKyAgICAgICAgcmV0dXJuIGNvdW50ZXIuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaW5qZWN0L2NkaTItc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL015VmV0b2VkTG9uZ1N1cHBsaWVyLmphdmEgYi9pbmplY3QvY2RpMi1zZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvTXlWZXRvZWRMb25nU3VwcGxpZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzdmMzE2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5qZWN0L2NkaTItc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL015VmV0b2VkTG9uZ1N1cHBsaWVyLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuY2RpLnNlOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0xvbmc7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3QuVmV0b2VkOworCitAVmV0b2VkCitwdWJsaWMgY2xhc3MgTXlWZXRvZWRMb25nU3VwcGxpZXIgaW1wbGVtZW50cyBTdXBwbGllcjxMb25nPiB7CisKKyAgICBwcml2YXRlIGZpbmFsIEF0b21pY0xvbmcgY291bnRlciA9IG5ldyBBdG9taWNMb25nKCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTG9uZyBnZXQoKSB7CisgICAgICAgIHJldHVybiBjb3VudGVyLmluY3JlbWVudEFuZEdldCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2luamVjdC9jZGkyLXNlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9QcmludGFibGUuamF2YSBiL2luamVjdC9jZGkyLXNlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9QcmludGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDhiZTFhCi0tLSAvZGV2L251bGwKKysrIGIvaW5qZWN0L2NkaTItc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL1ByaW50YWJsZS5qYXZhCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0LmNkaS5zZTsKKworLyoqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworQEZ1bmN0aW9uYWxJbnRlcmZhY2UKK3B1YmxpYyBpbnRlcmZhY2UgUHJpbnRhYmxlIHsKKworICAgIHZvaWQgcHJpbnQoKTsKKworfQpkaWZmIC0tZ2l0IGEvaW5qZWN0L2NkaTItc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL1ByaW50YWJsZUNvbnZlcnNhdGlvbi5qYXZhIGIvaW5qZWN0L2NkaTItc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL1ByaW50YWJsZUNvbnZlcnNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzN2E0N2QKLS0tIC9kZXYvbnVsbAorKysgYi9pbmplY3QvY2RpMi1zZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvUHJpbnRhYmxlQ29udmVyc2F0aW9uLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuY2RpLnNlOworCitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3QuVmV0b2VkOworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CisKKy8qKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK0BWZXRvZWQKK2NsYXNzIFByaW50YWJsZUNvbnZlcnNhdGlvbiB7CisKKyAgICBASW5qZWN0CisgICAgR3JlZXRpbmcgZ3JlZXRpbmc7CisKKyAgICBASW5qZWN0CisgICAgU3VwcGxpZXI8R3JlZXRpbmc+IGdyZWV0aW5nU3VwcGxpZXI7CisKKyAgICBASW5qZWN0CisgICAgUHJpbnRhYmxlIHByaW50YWJsZTsKKworICAgIEBJbmplY3QKKyAgICBTdXBwbGllcjxQcmludGFibGU+IHByaW50YWJsZVN1cHBsaWVyOworCit9CmRpZmYgLS1naXQgYS9pbmplY3QvY2RpMi1zZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvUHJvdmlkZXJJbmplY3Rpb25UZXN0LmphdmEgYi9pbmplY3QvY2RpMi1zZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvUHJvdmlkZXJJbmplY3Rpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBjZDRiMgotLS0gL2Rldi9udWxsCisrKyBiL2luamVjdC9jZGkyLXNlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9Qcm92aWRlckluamVjdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuY2RpLnNlOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKKworaW1wb3J0IG9yZy5oYW1jcmVzdC5jb3JlLlN0cmluZ1N0YXJ0c1dpdGg7CitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworcHVibGljIGNsYXNzIFByb3ZpZGVySW5qZWN0aW9uVGVzdCB7CisKKyAgICBwcml2YXRlIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlcjsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXR1cCgpIHsKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlciA9IEJpbmRpbmdUZXN0SGVscGVyLmNyZWF0ZUluamVjdGlvbk1hbmFnZXIoKTsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCB0ZWFyZG93bigpIHsKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5zaHV0ZG93bigpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByb3ZpZGVySW5qZWN0KCkgeworICAgICAgICBCaW5kaW5nVGVzdEhlbHBlci5iaW5kKGluamVjdGlvbk1hbmFnZXIsIGJpbmRlciAtPiB7CisgICAgICAgICAgICBiaW5kZXIuYmluZChDemVjaEdyZWV0aW5nLmNsYXNzKS50byhHcmVldGluZy5jbGFzcyk7CisgICAgICAgICAgICBiaW5kZXIuYmluZEFzQ29udHJhY3QoUHJvdmlkZXJJbmplY3QuY2xhc3MpOworICAgICAgICB9KTsKKworICAgICAgICBQcm92aWRlckluamVjdCBpbnN0YW5jZSA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoUHJvdmlkZXJJbmplY3QuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KGluc3RhbmNlLmdyZWV0aW5nLmdldCgpLmdldEdyZWV0aW5nKCksIFN0cmluZ1N0YXJ0c1dpdGguc3RhcnRzV2l0aChDemVjaEdyZWV0aW5nLkdSRUVUSU5HKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvdmlkZXJDb250ZXh0KCkgeworICAgICAgICBCaW5kaW5nVGVzdEhlbHBlci5iaW5kKGluamVjdGlvbk1hbmFnZXIsIGJpbmRlciAtPiB7CisgICAgICAgICAgICBiaW5kZXIuYmluZChDemVjaEdyZWV0aW5nLmNsYXNzKS50byhHcmVldGluZy5jbGFzcyk7CisgICAgICAgICAgICBiaW5kZXIuYmluZEFzQ29udHJhY3QoUHJvdmlkZXJDb250ZXh0LmNsYXNzKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgUHJvdmlkZXJDb250ZXh0IGluc3RhbmNlID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShQcm92aWRlckNvbnRleHQuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KGluc3RhbmNlLmdyZWV0aW5nLmdldCgpLmdldEdyZWV0aW5nKCksIFN0cmluZ1N0YXJ0c1dpdGguc3RhcnRzV2l0aChDemVjaEdyZWV0aW5nLkdSRUVUSU5HKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvdmlkZXJGYWN0b3J5SW5qZWN0KCkgeworICAgICAgICBCaW5kaW5nVGVzdEhlbHBlci5iaW5kKGluamVjdGlvbk1hbmFnZXIsIGJpbmRlciAtPiB7CisgICAgICAgICAgICBiaW5kZXIuYmluZEZhY3RvcnkoU3VwcGxpZXJHcmVldGluZy5jbGFzcykudG8oR3JlZXRpbmcuY2xhc3MpOworICAgICAgICAgICAgYmluZGVyLmJpbmRBc0NvbnRyYWN0KFByb3ZpZGVySW5qZWN0LmNsYXNzKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgUHJvdmlkZXJJbmplY3QgY29udmVyc2F0aW9uID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShQcm92aWRlckluamVjdC5jbGFzcyk7CisgICAgICAgIGFzc2VydFRoYXQoY29udmVyc2F0aW9uLmdyZWV0aW5nLmdldCgpLmdldEdyZWV0aW5nKCksIFN0cmluZ1N0YXJ0c1dpdGguc3RhcnRzV2l0aChDemVjaEdyZWV0aW5nLkdSRUVUSU5HKSk7CisgICAgfQorCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm92aWRlckZhY3RvcnlDb250ZXh0KCkgeworICAgICAgICBCaW5kaW5nVGVzdEhlbHBlci5iaW5kKGluamVjdGlvbk1hbmFnZXIsIGJpbmRlciAtPiB7CisgICAgICAgICAgICBiaW5kZXIuYmluZEZhY3RvcnkoU3VwcGxpZXJHcmVldGluZy5jbGFzcykudG8oR3JlZXRpbmcuY2xhc3MpOworICAgICAgICAgICAgYmluZGVyLmJpbmRBc0NvbnRyYWN0KFByb3ZpZGVyQ29udGV4dC5jbGFzcyk7CisgICAgICAgIH0pOworCisgICAgICAgIFByb3ZpZGVyQ29udGV4dCBjb252ZXJzYXRpb24gPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKFByb3ZpZGVyQ29udGV4dC5jbGFzcyk7CisgICAgICAgIGFzc2VydFRoYXQoY29udmVyc2F0aW9uLmdyZWV0aW5nLmdldCgpLmdldEdyZWV0aW5nKCksIFN0cmluZ1N0YXJ0c1dpdGguc3RhcnRzV2l0aChDemVjaEdyZWV0aW5nLkdSRUVUSU5HKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQcm92aWRlckluamVjdCB7CisgICAgICAgIEBJbmplY3QKKyAgICAgICAgUHJvdmlkZXI8R3JlZXRpbmc+IGdyZWV0aW5nOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHJvdmlkZXJDb250ZXh0IHsKKyAgICAgICAgQENvbnRleHQKKyAgICAgICAgUHJvdmlkZXI8R3JlZXRpbmc+IGdyZWV0aW5nOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvaW5qZWN0L2NkaTItc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL1N1cHBsaWVyQ2xhc3NCaW5kaW5nVGVzdC5qYXZhIGIvaW5qZWN0L2NkaTItc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL1N1cHBsaWVyQ2xhc3NCaW5kaW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NWE1NTgKLS0tIC9kZXYvbnVsbAorKysgYi9pbmplY3QvY2RpMi1zZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvU3VwcGxpZXJDbGFzc0JpbmRpbmdUZXN0LmphdmEKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0LmNkaS5zZTsKKworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LlZldG9lZDsKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CisKK2ltcG9ydCBvcmcuaGFtY3Jlc3QuY29yZS5TdHJpbmdTdGFydHNXaXRoOworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdFNhbWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIFRlc3RzIHRoYXQge0BsaW5rIFN1cHBsaWVyfSBjYW4gYmUgcmVnaXN0ZXJlZCBhcyBhIGNsYXNzLWZhY3RvcnkuCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK0BWZXRvZWQKK3B1YmxpYyBjbGFzcyBTdXBwbGllckNsYXNzQmluZGluZ1Rlc3QgeworCisgICAgcHJpdmF0ZSBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXI7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXAoKSB7CisgICAgICAgIGluamVjdGlvbk1hbmFnZXIgPSBCaW5kaW5nVGVzdEhlbHBlci5jcmVhdGVJbmplY3Rpb25NYW5hZ2VyKCk7CisgICAgfQorCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgdGVhcmRvd24oKSB7CisgICAgICAgIGluamVjdGlvbk1hbmFnZXIuc2h1dGRvd24oKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNZXNzYWdlcygpIHsKKyAgICAgICAgQmluZGluZ1Rlc3RIZWxwZXIuYmluZChpbmplY3Rpb25NYW5hZ2VyLCBiaW5kZXIgLT4geworICAgICAgICAgICAgYmluZGVyLmJpbmRGYWN0b3J5KFN1cHBsaWVyR3JlZXRpbmcuY2xhc3MpLnRvKEdyZWV0aW5nLmNsYXNzKTsKKyAgICAgICAgICAgIGJpbmRlci5iaW5kQXNDb250cmFjdChDb252ZXJzYXRpb24uY2xhc3MpOworICAgICAgICB9KTsKKworICAgICAgICBDb252ZXJzYXRpb24gY29udmVyc2F0aW9uID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShDb252ZXJzYXRpb24uY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KGNvbnZlcnNhdGlvbi5ncmVldGluZy5nZXRHcmVldGluZygpLCBTdHJpbmdTdGFydHNXaXRoLnN0YXJ0c1dpdGgoQ3plY2hHcmVldGluZy5HUkVFVElORykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN1cHBsaWVyUGVyTG9va3VwSW5zdGFuY2VQZXJMb29rdXAoKSB7CisgICAgICAgIEJpbmRpbmdUZXN0SGVscGVyLmJpbmQoaW5qZWN0aW9uTWFuYWdlciwgYmluZGVyIC0+IHsKKyAgICAgICAgICAgIGJpbmRlci5iaW5kRmFjdG9yeShTdXBwbGllckdyZWV0aW5nLmNsYXNzKS50byhHcmVldGluZy5jbGFzcyk7CisgICAgICAgICAgICBiaW5kZXIuYmluZEFzQ29udHJhY3QoQ29udmVyc2F0aW9uLmNsYXNzKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgQ29udmVyc2F0aW9uIGNvbnZlcnNhdGlvbjEgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKENvbnZlcnNhdGlvbi5jbGFzcyk7CisgICAgICAgIEdyZWV0aW5nIGdyZWV0aW5nMSA9IGNvbnZlcnNhdGlvbjEuZ3JlZXRpbmc7CisgICAgICAgIENvbnZlcnNhdGlvbiBjb252ZXJzYXRpb24yID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShDb252ZXJzYXRpb24uY2xhc3MpOworICAgICAgICBHcmVldGluZyBncmVldGluZzIgPSBjb252ZXJzYXRpb24yLmdyZWV0aW5nOworICAgICAgICBDb252ZXJzYXRpb24gY29udmVyc2F0aW9uMyA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoQ29udmVyc2F0aW9uLmNsYXNzKTsKKyAgICAgICAgR3JlZXRpbmcgZ3JlZXRpbmczID0gY29udmVyc2F0aW9uMy5ncmVldGluZzsKKworICAgICAgICBhc3NlcnROb3RTYW1lKGdyZWV0aW5nMSwgZ3JlZXRpbmcyKTsKKyAgICAgICAgYXNzZXJ0Tm90U2FtZShncmVldGluZzIsIGdyZWV0aW5nMyk7CisKKyAgICAgICAgU3VwcGxpZXI8R3JlZXRpbmc+IHN1cHBsaWVyMSA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoQ29udmVyc2F0aW9uLmNsYXNzKS5ncmVldGluZ1N1cHBsaWVyOworICAgICAgICBTdXBwbGllcjxHcmVldGluZz4gc3VwcGxpZXIyID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShDb252ZXJzYXRpb24uY2xhc3MpLmdyZWV0aW5nU3VwcGxpZXI7CisgICAgICAgIFN1cHBsaWVyPEdyZWV0aW5nPiBzdXBwbGllcjMgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKENvbnZlcnNhdGlvbi5jbGFzcykuZ3JlZXRpbmdTdXBwbGllcjsKKworICAgICAgICBhc3NlcnROb3RTYW1lKHN1cHBsaWVyMSwgc3VwcGxpZXIyKTsKKyAgICAgICAgYXNzZXJ0Tm90U2FtZShzdXBwbGllcjIsIHN1cHBsaWVyMyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3VwcGxpZXJTaW5nbGV0b25JbnN0YW5jZVBlckxvb2t1cCgpIHsKKyAgICAgICAgQmluZGluZ1Rlc3RIZWxwZXIuYmluZChpbmplY3Rpb25NYW5hZ2VyLCBiaW5kZXIgLT4geworICAgICAgICAgICAgYmluZGVyLmJpbmRGYWN0b3J5KFN1cHBsaWVyR3JlZXRpbmcuY2xhc3MsIFNpbmdsZXRvbi5jbGFzcykudG8oR3JlZXRpbmcuY2xhc3MpOworICAgICAgICAgICAgYmluZGVyLmJpbmRBc0NvbnRyYWN0KENvbnZlcnNhdGlvbi5jbGFzcyk7CisgICAgICAgIH0pOworCisgICAgICAgIEdyZWV0aW5nIGdyZWV0aW5nMSA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoQ29udmVyc2F0aW9uLmNsYXNzKS5ncmVldGluZzsKKyAgICAgICAgR3JlZXRpbmcgZ3JlZXRpbmcyID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShDb252ZXJzYXRpb24uY2xhc3MpLmdyZWV0aW5nOworICAgICAgICBHcmVldGluZyBncmVldGluZzMgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKENvbnZlcnNhdGlvbi5jbGFzcykuZ3JlZXRpbmc7CisKKyAgICAgICAgYXNzZXJ0Tm90U2FtZShncmVldGluZzEsIGdyZWV0aW5nMik7CisgICAgICAgIGFzc2VydE5vdFNhbWUoZ3JlZXRpbmcyLCBncmVldGluZzMpOworCisgICAgICAgIFN1cHBsaWVyPEdyZWV0aW5nPiBzdXBwbGllcjEgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKENvbnZlcnNhdGlvbi5jbGFzcykuZ3JlZXRpbmdTdXBwbGllcjsKKyAgICAgICAgU3VwcGxpZXI8R3JlZXRpbmc+IHN1cHBsaWVyMiA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoQ29udmVyc2F0aW9uLmNsYXNzKS5ncmVldGluZ1N1cHBsaWVyOworICAgICAgICBTdXBwbGllcjxHcmVldGluZz4gc3VwcGxpZXIzID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShDb252ZXJzYXRpb24uY2xhc3MpLmdyZWV0aW5nU3VwcGxpZXI7CisKKyAgICAgICAgYXNzZXJ0U2FtZShzdXBwbGllcjEsIHN1cHBsaWVyMik7CisgICAgICAgIGFzc2VydFNhbWUoc3VwcGxpZXIyLCBzdXBwbGllcjMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN1cHBsaWVyUGVyTG9va3VwSW5zdGFuY2VTaW5nbGV0b24oKSB7CisgICAgICAgIEJpbmRpbmdUZXN0SGVscGVyLmJpbmQoaW5qZWN0aW9uTWFuYWdlciwgYmluZGVyIC0+IHsKKyAgICAgICAgICAgIGJpbmRlci5iaW5kRmFjdG9yeShTdXBwbGllckdyZWV0aW5nLmNsYXNzKS50byhHcmVldGluZy5jbGFzcykuaW4oU2luZ2xldG9uLmNsYXNzKTsKKyAgICAgICAgICAgIGJpbmRlci5iaW5kQXNDb250cmFjdChDb252ZXJzYXRpb24uY2xhc3MpOworICAgICAgICB9KTsKKworICAgICAgICBHcmVldGluZyBncmVldGluZzEgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKENvbnZlcnNhdGlvbi5jbGFzcykuZ3JlZXRpbmc7CisgICAgICAgIEdyZWV0aW5nIGdyZWV0aW5nMiA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoQ29udmVyc2F0aW9uLmNsYXNzKS5ncmVldGluZzsKKyAgICAgICAgR3JlZXRpbmcgZ3JlZXRpbmczID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShDb252ZXJzYXRpb24uY2xhc3MpLmdyZWV0aW5nOworCisgICAgICAgIGFzc2VydFNhbWUoZ3JlZXRpbmcxLCBncmVldGluZzIpOworICAgICAgICBhc3NlcnRTYW1lKGdyZWV0aW5nMiwgZ3JlZXRpbmczKTsKKworICAgICAgICBTdXBwbGllcjxHcmVldGluZz4gc3VwcGxpZXIxID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShDb252ZXJzYXRpb24uY2xhc3MpLmdyZWV0aW5nU3VwcGxpZXI7CisgICAgICAgIFN1cHBsaWVyPEdyZWV0aW5nPiBzdXBwbGllcjIgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKENvbnZlcnNhdGlvbi5jbGFzcykuZ3JlZXRpbmdTdXBwbGllcjsKKyAgICAgICAgU3VwcGxpZXI8R3JlZXRpbmc+IHN1cHBsaWVyMyA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoQ29udmVyc2F0aW9uLmNsYXNzKS5ncmVldGluZ1N1cHBsaWVyOworCisgICAgICAgIGFzc2VydE5vdFNhbWUoc3VwcGxpZXIxLCBzdXBwbGllcjIpOworICAgICAgICBhc3NlcnROb3RTYW1lKHN1cHBsaWVyMiwgc3VwcGxpZXIzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdXBwbGllclNpbmdsZXRvbkluc3RhbmNlU2luZ2xldG9uKCkgeworICAgICAgICBCaW5kaW5nVGVzdEhlbHBlci5iaW5kKGluamVjdGlvbk1hbmFnZXIsIGJpbmRlciAtPiB7CisgICAgICAgICAgICBiaW5kZXIuYmluZEZhY3RvcnkoU3VwcGxpZXJHcmVldGluZy5jbGFzcywgU2luZ2xldG9uLmNsYXNzKS50byhHcmVldGluZy5jbGFzcykuaW4oU2luZ2xldG9uLmNsYXNzKTsKKyAgICAgICAgICAgIGJpbmRlci5iaW5kQXNDb250cmFjdChDb252ZXJzYXRpb24uY2xhc3MpOworICAgICAgICB9KTsKKworICAgICAgICBHcmVldGluZyBncmVldGluZzEgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKENvbnZlcnNhdGlvbi5jbGFzcykuZ3JlZXRpbmc7CisgICAgICAgIEdyZWV0aW5nIGdyZWV0aW5nMiA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoQ29udmVyc2F0aW9uLmNsYXNzKS5ncmVldGluZzsKKyAgICAgICAgR3JlZXRpbmcgZ3JlZXRpbmczID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShDb252ZXJzYXRpb24uY2xhc3MpLmdyZWV0aW5nOworCisgICAgICAgIGFzc2VydFNhbWUoZ3JlZXRpbmcxLCBncmVldGluZzIpOworICAgICAgICBhc3NlcnRTYW1lKGdyZWV0aW5nMiwgZ3JlZXRpbmczKTsKKworICAgICAgICBTdXBwbGllcjxHcmVldGluZz4gc3VwcGxpZXIxID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShDb252ZXJzYXRpb24uY2xhc3MpLmdyZWV0aW5nU3VwcGxpZXI7CisgICAgICAgIFN1cHBsaWVyPEdyZWV0aW5nPiBzdXBwbGllcjIgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKENvbnZlcnNhdGlvbi5jbGFzcykuZ3JlZXRpbmdTdXBwbGllcjsKKyAgICAgICAgU3VwcGxpZXI8R3JlZXRpbmc+IHN1cHBsaWVyMyA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoQ29udmVyc2F0aW9uLmNsYXNzKS5ncmVldGluZ1N1cHBsaWVyOworCisgICAgICAgIGFzc2VydFNhbWUoc3VwcGxpZXIxLCBzdXBwbGllcjIpOworICAgICAgICBhc3NlcnRTYW1lKHN1cHBsaWVyMiwgc3VwcGxpZXIzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9pbmplY3QvY2RpMi1zZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvU3VwcGxpZXJDb250cmFjdHNUZXN0LmphdmEgYi9pbmplY3QvY2RpMi1zZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvU3VwcGxpZXJDb250cmFjdHNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgzMWU4NgotLS0gL2Rldi9udWxsCisrKyBiL2luamVjdC9jZGkyLXNlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9TdXBwbGllckNvbnRyYWN0c1Rlc3QuamF2YQpAQCAtMCwwICsxLDIyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuY2RpLnNlOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3QuVmV0b2VkOworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKKworaW1wb3J0IG9yZy5qYm9zcy53ZWxkLmV4Y2VwdGlvbnMuRGVwbG95bWVudEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdFNhbWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKKworLyoqCisgKiBUZXN0cyB0aGF0IHtAbGluayBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXJ9IGNhbiBjb250YWluIG11bHRpcGxlIGNvbnRyYWN0cy4KKyAqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworQFZldG9lZAorcHVibGljIGNsYXNzIFN1cHBsaWVyQ29udHJhY3RzVGVzdCB7CisKKyAgICBwcml2YXRlIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlcjsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXR1cCgpIHsKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlciA9IEJpbmRpbmdUZXN0SGVscGVyLmNyZWF0ZUluamVjdGlvbk1hbmFnZXIoKTsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCB0ZWFyZG93bigpIHsKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5zaHV0ZG93bigpOworICAgIH0KKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NGYWN0b3J5SW5zdGFuY2VJbnRlcmZhY2UoKSB7CisgICAgICAgIEJpbmRpbmdUZXN0SGVscGVyLmJpbmQoaW5qZWN0aW9uTWFuYWdlciwgYmluZGVyIC0+IHsKKyAgICAgICAgICAgIGJpbmRlci5iaW5kRmFjdG9yeShTdXBwbGllckdyZWV0aW5nLmNsYXNzKS50byhHcmVldGluZy5jbGFzcyk7CisgICAgICAgICAgICBiaW5kZXIuYmluZEFzQ29udHJhY3QoQ29udmVyc2F0aW9uLmNsYXNzKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgQ29udmVyc2F0aW9uIGNvbnZlcnNhdGlvbiA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoQ29udmVyc2F0aW9uLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjb252ZXJzYXRpb24uZ3JlZXRpbmcpOworICAgICAgICBhc3NlcnROb3ROdWxsKGNvbnZlcnNhdGlvbi5ncmVldGluZ1N1cHBsaWVyLmdldCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbGFzc0ZhY3RvcnlJbnN0YW5jZUltcGxlbWVudGF0aW9uKCkgeworICAgICAgICBCaW5kaW5nVGVzdEhlbHBlci5iaW5kKGluamVjdGlvbk1hbmFnZXIsIGJpbmRlciAtPiB7CisgICAgICAgICAgICBiaW5kZXIuYmluZEZhY3RvcnkoU3VwcGxpZXJHcmVldGluZy5jbGFzcykudG8oQ3plY2hHcmVldGluZy5jbGFzcyk7CisgICAgICAgICAgICBiaW5kZXIuYmluZEFzQ29udHJhY3QoQ3plY2hDb252ZXJzYXRpb24uY2xhc3MpOworICAgICAgICB9KTsKKworICAgICAgICBDemVjaENvbnZlcnNhdGlvbiBjb252ZXJzYXRpb24gPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKEN6ZWNoQ29udmVyc2F0aW9uLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjb252ZXJzYXRpb24uZ3JlZXRpbmcpOworICAgICAgICBhc3NlcnROb3ROdWxsKGNvbnZlcnNhdGlvbi5ncmVldGluZ1N1cHBsaWVyLmdldCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YW5jZUZhY3RvcnlJbnN0YW5jZUludGVyZmFjZSgpIHsKKyAgICAgICAgQmluZGluZ1Rlc3RIZWxwZXIuYmluZChpbmplY3Rpb25NYW5hZ2VyLCBiaW5kZXIgLT4geworICAgICAgICAgICAgYmluZGVyLmJpbmRGYWN0b3J5KG5ldyBTdXBwbGllckdyZWV0aW5nKCkpLnRvKEdyZWV0aW5nLmNsYXNzKTsKKyAgICAgICAgICAgIGJpbmRlci5iaW5kQXNDb250cmFjdChDb252ZXJzYXRpb24uY2xhc3MpOworICAgICAgICB9KTsKKworICAgICAgICBDb252ZXJzYXRpb24gY29udmVyc2F0aW9uID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShDb252ZXJzYXRpb24uY2xhc3MpOworICAgICAgICBhc3NlcnROb3ROdWxsKGNvbnZlcnNhdGlvbi5ncmVldGluZyk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY29udmVyc2F0aW9uLmdyZWV0aW5nU3VwcGxpZXIuZ2V0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbmNlRmFjdG9yeUluc3RhbmNlSW1wbGVtZW50YXRpb24oKSB7CisgICAgICAgIEJpbmRpbmdUZXN0SGVscGVyLmJpbmQoaW5qZWN0aW9uTWFuYWdlciwgYmluZGVyIC0+IHsKKyAgICAgICAgICAgIGJpbmRlci5iaW5kRmFjdG9yeShuZXcgU3VwcGxpZXJHcmVldGluZygpKS50byhDemVjaEdyZWV0aW5nLmNsYXNzKTsKKyAgICAgICAgICAgIGJpbmRlci5iaW5kQXNDb250cmFjdChDemVjaENvbnZlcnNhdGlvbi5jbGFzcyk7CisgICAgICAgIH0pOworCisgICAgICAgIEN6ZWNoQ29udmVyc2F0aW9uIGNvbnZlcnNhdGlvbiA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoQ3plY2hDb252ZXJzYXRpb24uY2xhc3MpOworICAgICAgICBhc3NlcnROb3ROdWxsKGNvbnZlcnNhdGlvbi5ncmVldGluZyk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY29udmVyc2F0aW9uLmdyZWV0aW5nU3VwcGxpZXIuZ2V0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsYXNzRmFjdG9yeU11bHRpcGxlQ29udHJhY3RzKCkgeworICAgICAgICBCaW5kaW5nVGVzdEhlbHBlci5iaW5kKGluamVjdGlvbk1hbmFnZXIsIGJpbmRlciAtPiB7CisgICAgICAgICAgICBiaW5kZXIuYmluZEZhY3RvcnkoU3VwcGxpZXJHcmVldGluZy5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgLnRvKEdyZWV0aW5nLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAudG8oUHJpbnRhYmxlLmNsYXNzKTsKKyAgICAgICAgICAgIGJpbmRlci5iaW5kQXNDb250cmFjdChQcmludGFibGVDb252ZXJzYXRpb24uY2xhc3MpOworICAgICAgICB9KTsKKworICAgICAgICBQcmludGFibGVDb252ZXJzYXRpb24gY29udmVyc2F0aW9uID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShQcmludGFibGVDb252ZXJzYXRpb24uY2xhc3MpOworICAgICAgICBhc3NlcnROb3ROdWxsKGNvbnZlcnNhdGlvbi5ncmVldGluZyk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY29udmVyc2F0aW9uLnByaW50YWJsZSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY29udmVyc2F0aW9uLmdyZWV0aW5nU3VwcGxpZXIpOworICAgICAgICBhc3NlcnROb3ROdWxsKGNvbnZlcnNhdGlvbi5wcmludGFibGVTdXBwbGllcik7CisKKyAgICAgICAgYXNzZXJ0Tm90U2FtZShjb252ZXJzYXRpb24uZ3JlZXRpbmcsIGNvbnZlcnNhdGlvbi5wcmludGFibGUpOworICAgICAgICBhc3NlcnROb3RTYW1lKGNvbnZlcnNhdGlvbi5ncmVldGluZ1N1cHBsaWVyLCBjb252ZXJzYXRpb24ucHJpbnRhYmxlU3VwcGxpZXIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsYXNzRmFjdG9yeVNpbmdsZXRvbk11bHRpcGxlQ29udHJhY3RzKCkgeworICAgICAgICBCaW5kaW5nVGVzdEhlbHBlci5iaW5kKGluamVjdGlvbk1hbmFnZXIsIGJpbmRlciAtPiB7CisgICAgICAgICAgICBiaW5kZXIuYmluZEZhY3RvcnkoU3VwcGxpZXJHcmVldGluZy5jbGFzcywgU2luZ2xldG9uLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAudG8oR3JlZXRpbmcuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIC50byhQcmludGFibGUuY2xhc3MpOworICAgICAgICAgICAgYmluZGVyLmJpbmRBc0NvbnRyYWN0KFByaW50YWJsZUNvbnZlcnNhdGlvbi5jbGFzcyk7CisgICAgICAgIH0pOworCisgICAgICAgIFByaW50YWJsZUNvbnZlcnNhdGlvbiBjb252ZXJzYXRpb24gPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKFByaW50YWJsZUNvbnZlcnNhdGlvbi5jbGFzcyk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY29udmVyc2F0aW9uLmdyZWV0aW5nKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjb252ZXJzYXRpb24ucHJpbnRhYmxlKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjb252ZXJzYXRpb24uZ3JlZXRpbmdTdXBwbGllcik7CisgICAgICAgIGFzc2VydE5vdE51bGwoY29udmVyc2F0aW9uLnByaW50YWJsZVN1cHBsaWVyKTsKKworICAgICAgICBhc3NlcnROb3RTYW1lKGNvbnZlcnNhdGlvbi5ncmVldGluZywgY29udmVyc2F0aW9uLnByaW50YWJsZSk7CisgICAgICAgIGFzc2VydFNhbWUoY29udmVyc2F0aW9uLmdyZWV0aW5nU3VwcGxpZXIsIGNvbnZlcnNhdGlvbi5wcmludGFibGVTdXBwbGllcik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NGYWN0b3J5TXVsdGlwbGVDb250cmFjdHNTaW5nbGV0b24oKSB7CisgICAgICAgIEJpbmRpbmdUZXN0SGVscGVyLmJpbmQoaW5qZWN0aW9uTWFuYWdlciwgYmluZGVyIC0+IHsKKyAgICAgICAgICAgIGJpbmRlci5iaW5kRmFjdG9yeShTdXBwbGllckdyZWV0aW5nLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAudG8oR3JlZXRpbmcuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIC50byhQcmludGFibGUuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIC5pbihTaW5nbGV0b24uY2xhc3MpOworICAgICAgICAgICAgYmluZGVyLmJpbmRBc0NvbnRyYWN0KFByaW50YWJsZUNvbnZlcnNhdGlvbi5jbGFzcyk7CisgICAgICAgIH0pOworCisgICAgICAgIFByaW50YWJsZUNvbnZlcnNhdGlvbiBjb252ZXJzYXRpb24gPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKFByaW50YWJsZUNvbnZlcnNhdGlvbi5jbGFzcyk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY29udmVyc2F0aW9uLmdyZWV0aW5nKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjb252ZXJzYXRpb24ucHJpbnRhYmxlKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjb252ZXJzYXRpb24uZ3JlZXRpbmdTdXBwbGllcik7CisgICAgICAgIGFzc2VydE5vdE51bGwoY29udmVyc2F0aW9uLnByaW50YWJsZVN1cHBsaWVyKTsKKworICAgICAgICBhc3NlcnRTYW1lKGNvbnZlcnNhdGlvbi5ncmVldGluZywgY29udmVyc2F0aW9uLnByaW50YWJsZSk7CisgICAgICAgIGFzc2VydE5vdFNhbWUoY29udmVyc2F0aW9uLmdyZWV0aW5nU3VwcGxpZXIsIGNvbnZlcnNhdGlvbi5wcmludGFibGVTdXBwbGllcik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFuY2VGYWN0b3J5TXVsdGlwbGVDb250cmFjdHMoKSB7CisgICAgICAgIEJpbmRpbmdUZXN0SGVscGVyLmJpbmQoaW5qZWN0aW9uTWFuYWdlciwgYmluZGVyIC0+IHsKKyAgICAgICAgICAgIGJpbmRlci5iaW5kRmFjdG9yeShuZXcgU3VwcGxpZXJHcmVldGluZygpKQorICAgICAgICAgICAgICAgICAgICAudG8oR3JlZXRpbmcuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIC50byhQcmludGFibGUuY2xhc3MpOworICAgICAgICAgICAgYmluZGVyLmJpbmRBc0NvbnRyYWN0KFByaW50YWJsZUNvbnZlcnNhdGlvbi5jbGFzcyk7CisgICAgICAgIH0pOworCisgICAgICAgIFByaW50YWJsZUNvbnZlcnNhdGlvbiBjb252ZXJzYXRpb24gPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKFByaW50YWJsZUNvbnZlcnNhdGlvbi5jbGFzcyk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY29udmVyc2F0aW9uLmdyZWV0aW5nKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjb252ZXJzYXRpb24ucHJpbnRhYmxlKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjb252ZXJzYXRpb24uZ3JlZXRpbmdTdXBwbGllcik7CisgICAgICAgIGFzc2VydE5vdE51bGwoY29udmVyc2F0aW9uLnByaW50YWJsZVN1cHBsaWVyKTsKKworICAgICAgICBhc3NlcnROb3RTYW1lKGNvbnZlcnNhdGlvbi5ncmVldGluZywgY29udmVyc2F0aW9uLnByaW50YWJsZSk7CisgICAgICAgIGFzc2VydFNhbWUoY29udmVyc2F0aW9uLmdyZWV0aW5nU3VwcGxpZXIsIGNvbnZlcnNhdGlvbi5wcmludGFibGVTdXBwbGllcik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFuY2VGYWN0b3J5TXVsdGlwbGVDb250cmFjdHNTaW5nbGV0b24oKSB7CisgICAgICAgIEJpbmRpbmdUZXN0SGVscGVyLmJpbmQoaW5qZWN0aW9uTWFuYWdlciwgYmluZGVyIC0+IHsKKyAgICAgICAgICAgIGJpbmRlci5iaW5kRmFjdG9yeShuZXcgU3VwcGxpZXJHcmVldGluZygpKQorICAgICAgICAgICAgICAgICAgICAudG8oR3JlZXRpbmcuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIC50byhQcmludGFibGUuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIC5pbihTaW5nbGV0b24uY2xhc3MpOworICAgICAgICAgICAgYmluZGVyLmJpbmRBc0NvbnRyYWN0KFByaW50YWJsZUNvbnZlcnNhdGlvbi5jbGFzcyk7CisgICAgICAgIH0pOworCisgICAgICAgIFByaW50YWJsZUNvbnZlcnNhdGlvbiBjb252ZXJzYXRpb24gPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKFByaW50YWJsZUNvbnZlcnNhdGlvbi5jbGFzcyk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY29udmVyc2F0aW9uLmdyZWV0aW5nKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjb252ZXJzYXRpb24ucHJpbnRhYmxlKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjb252ZXJzYXRpb24uZ3JlZXRpbmdTdXBwbGllcik7CisgICAgICAgIGFzc2VydE5vdE51bGwoY29udmVyc2F0aW9uLnByaW50YWJsZVN1cHBsaWVyKTsKKworICAgICAgICBhc3NlcnRTYW1lKGNvbnZlcnNhdGlvbi5ncmVldGluZywgY29udmVyc2F0aW9uLnByaW50YWJsZSk7CisgICAgICAgIGFzc2VydFNhbWUoY29udmVyc2F0aW9uLmdyZWV0aW5nU3VwcGxpZXIsIGNvbnZlcnNhdGlvbi5wcmludGFibGVTdXBwbGllcik7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBEZXBsb3ltZW50RXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RDbGFzc0ZhY3RvcnlGYWlsZWRXcm9uZ0ltcGxlbWVudGF0aW9uKCkgeworICAgICAgICBCaW5kaW5nVGVzdEhlbHBlci5iaW5kKGluamVjdGlvbk1hbmFnZXIsIGJpbmRlciAtPiB7CisgICAgICAgICAgICBiaW5kZXIuYmluZEZhY3RvcnkoU3VwcGxpZXJHcmVldGluZy5jbGFzcykudG8oRW5nbGlzaEdyZWV0aW5nLmNsYXNzKTsKKyAgICAgICAgICAgIGJpbmRlci5iaW5kQXNDb250cmFjdChDb252ZXJzYXRpb24uY2xhc3MpOworICAgICAgICB9KTsKKworICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKENvbnZlcnNhdGlvbi5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBEZXBsb3ltZW50RXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YW5jZUZhY3RvcnlGYWlsc1dyb25nSW1wbGVtZW50YXRpb24oKSB7CisgICAgICAgIEJpbmRpbmdUZXN0SGVscGVyLmJpbmQoaW5qZWN0aW9uTWFuYWdlciwgYmluZGVyIC0+IHsKKyAgICAgICAgICAgIGJpbmRlci5iaW5kRmFjdG9yeShuZXcgU3VwcGxpZXJHcmVldGluZygpKS50byhFbmdsaXNoR3JlZXRpbmcuY2xhc3MpOworICAgICAgICAgICAgYmluZGVyLmJpbmRBc0NvbnRyYWN0KENvbnZlcnNhdGlvbi5jbGFzcyk7CisgICAgICAgIH0pOworCisgICAgICAgIGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoQ29udmVyc2F0aW9uLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IERlcGxveW1lbnRFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdEZhaWxzSW1wbGVtZW50YXRpb25CdXRJbnRlcmZhY2VFeHBlY3RlZCgpIHsKKyAgICAgICAgQmluZGluZ1Rlc3RIZWxwZXIuYmluZChpbmplY3Rpb25NYW5hZ2VyLCBiaW5kZXIgLT4geworICAgICAgICAgICAgYmluZGVyLmJpbmRGYWN0b3J5KG5ldyBTdXBwbGllckdyZWV0aW5nKCkpLnRvKEN6ZWNoR3JlZXRpbmcuY2xhc3MpOworICAgICAgICAgICAgYmluZGVyLmJpbmRBc0NvbnRyYWN0KENvbnZlcnNhdGlvbi5jbGFzcyk7CisgICAgICAgIH0pOworCisgICAgICAgIGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoQ29udmVyc2F0aW9uLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9pbmplY3QvY2RpMi1zZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvU3VwcGxpZXJHcmVldGluZy5qYXZhIGIvaW5qZWN0L2NkaTItc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL1N1cHBsaWVyR3JlZXRpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmUwOGJjCi0tLSAvZGV2L251bGwKKysrIGIvaW5qZWN0L2NkaTItc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL1N1cHBsaWVyR3JlZXRpbmcuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5jZGkuc2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5WZXRvZWQ7CisKKy8qKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK0BWZXRvZWQKK3B1YmxpYyBjbGFzcyBTdXBwbGllckdyZWV0aW5nIGltcGxlbWVudHMgU3VwcGxpZXI8R3JlZXRpbmc+IHsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGdyZWV0aW5nVHlwZTsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHVibGljIFN1cHBsaWVyR3JlZXRpbmcoKSB7CisgICAgICAgIHRoaXMoQ3plY2hHcmVldGluZy5HUkVFVElORyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3VwcGxpZXIncyBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBncmVldGluZ1R5cGUgZ3JlZXRpbmdUeXBlIGluIGEgc3BlY2lmaWMgbGFuZ3VhZ2UuCisgICAgICovCisgICAgcHVibGljIFN1cHBsaWVyR3JlZXRpbmcoU3RyaW5nIGdyZWV0aW5nVHlwZSkgeworICAgICAgICB0aGlzLmdyZWV0aW5nVHlwZSA9IGdyZWV0aW5nVHlwZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgR3JlZXRpbmcgZ2V0KCkgeworICAgICAgICBpZiAoQ3plY2hHcmVldGluZy5HUkVFVElORy5lcXVhbHMoZ3JlZXRpbmdUeXBlKSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDemVjaEdyZWV0aW5nKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEVuZ2xpc2hHcmVldGluZygpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaW5qZWN0L2NkaTItc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL1N1cHBsaWVySW5zdGFuY2VCaW5kaW5nVGVzdC5qYXZhIGIvaW5qZWN0L2NkaTItc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvY2RpL3NlL1N1cHBsaWVySW5zdGFuY2VCaW5kaW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljMjU3NWQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmplY3QvY2RpMi1zZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvU3VwcGxpZXJJbnN0YW5jZUJpbmRpbmdUZXN0LmphdmEKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0LmNkaS5zZTsKKworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY1R5cGU7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5WZXRvZWQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKKworaW1wb3J0IG9yZy5oYW1jcmVzdC5jb3JlLlN0cmluZ1N0YXJ0c1dpdGg7CitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdFNhbWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIFRlc3RzIHRoYXQge0BsaW5rIFN1cHBsaWVyfSBjYW4gYmUgcmVnaXN0ZXJlZCBhcyBhIGluc3RhbmNlLWZhY3RvcnkuCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK0BWZXRvZWQKK3B1YmxpYyBjbGFzcyBTdXBwbGllckluc3RhbmNlQmluZGluZ1Rlc3QgeworCisgICAgcHJpdmF0ZSBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXI7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXAoKSB7CisgICAgICAgIGluamVjdGlvbk1hbmFnZXIgPSBCaW5kaW5nVGVzdEhlbHBlci5jcmVhdGVJbmplY3Rpb25NYW5hZ2VyKCk7CisgICAgfQorCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgdGVhcmRvd24oKSB7CisgICAgICAgIGluamVjdGlvbk1hbmFnZXIuc2h1dGRvd24oKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YW5jZUZhY3RvcnlTdXBwbGVyT25seSgpIHsKKyAgICAgICAgTXlWZXRvZWRMb25nU3VwcGxpZXIgc3VwcGxpZXIgPSBuZXcgTXlWZXRvZWRMb25nU3VwcGxpZXIoKTsKKyAgICAgICAgc3VwcGxpZXIuZ2V0KCk7CisgICAgICAgIHN1cHBsaWVyLmdldCgpOworCisgICAgICAgIEJpbmRpbmdUZXN0SGVscGVyLmJpbmQoaW5qZWN0aW9uTWFuYWdlciwgYmluZGVyIC0+CisgICAgICAgICAgICAgICAgYmluZGVyLmJpbmRGYWN0b3J5KHN1cHBsaWVyKS50byhMb25nLmNsYXNzKSk7CisKKyAgICAgICAgU3VwcGxpZXI8TG9uZz4gaW5zdGFuY2UgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKG5ldyBHZW5lcmljVHlwZTxTdXBwbGllcjxMb25nPj4oKSB7fS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoKExvbmcpIDNMLCBpbnN0YW5jZS5nZXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygoTG9uZykgNEwsIGluc3RhbmNlLmdldCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YW5jZUZhY3RvcnlWYWx1ZXNPbmx5KCkgeworICAgICAgICBNeVZldG9lZExvbmdTdXBwbGllciBzdXBwbGllciA9IG5ldyBNeVZldG9lZExvbmdTdXBwbGllcigpOworICAgICAgICBzdXBwbGllci5nZXQoKTsKKyAgICAgICAgc3VwcGxpZXIuZ2V0KCk7CisKKyAgICAgICAgQmluZGluZ1Rlc3RIZWxwZXIuYmluZChpbmplY3Rpb25NYW5hZ2VyLCBiaW5kZXIgLT4KKyAgICAgICAgICAgICAgICBiaW5kZXIuYmluZEZhY3Rvcnkoc3VwcGxpZXIpLnRvKExvbmcuY2xhc3MpKTsKKworICAgICAgICBMb25nIGluc3RhbmNlMyA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoTG9uZy5jbGFzcyk7CisgICAgICAgIExvbmcgaW5zdGFuY2U0ID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShMb25nLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoKExvbmcpIDNMLCBpbnN0YW5jZTMpOworICAgICAgICBhc3NlcnRFcXVhbHMoKExvbmcpIDRMLCBpbnN0YW5jZTQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1lc3NhZ2VzKCkgeworICAgICAgICBCaW5kaW5nVGVzdEhlbHBlci5iaW5kKGluamVjdGlvbk1hbmFnZXIsIGJpbmRlciAtPiB7CisgICAgICAgICAgICBiaW5kZXIuYmluZEZhY3RvcnkobmV3IFN1cHBsaWVyR3JlZXRpbmcoKSkudG8oR3JlZXRpbmcuY2xhc3MpOworICAgICAgICAgICAgYmluZGVyLmJpbmRBc0NvbnRyYWN0KENvbnZlcnNhdGlvbi5jbGFzcyk7CisgICAgICAgIH0pOworCisgICAgICAgIENvbnZlcnNhdGlvbiBjb252ZXJzYXRpb24gPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKENvbnZlcnNhdGlvbi5jbGFzcyk7CisgICAgICAgIGFzc2VydFRoYXQoY29udmVyc2F0aW9uLmdyZWV0aW5nLmdldEdyZWV0aW5nKCksIFN0cmluZ1N0YXJ0c1dpdGguc3RhcnRzV2l0aChDemVjaEdyZWV0aW5nLkdSRUVUSU5HKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3VwcGxpZXJTaW5nbGV0b25JbnN0YW5jZVBlckxvb2t1cCgpIHsKKyAgICAgICAgQmluZGluZ1Rlc3RIZWxwZXIuYmluZChpbmplY3Rpb25NYW5hZ2VyLCBiaW5kZXIgLT4geworICAgICAgICAgICAgYmluZGVyLmJpbmRGYWN0b3J5KG5ldyBTdXBwbGllckdyZWV0aW5nKCkpLnRvKEdyZWV0aW5nLmNsYXNzKTsKKyAgICAgICAgICAgIGJpbmRlci5iaW5kQXNDb250cmFjdChDb252ZXJzYXRpb24uY2xhc3MpOworICAgICAgICB9KTsKKworICAgICAgICBHcmVldGluZyBncmVldGluZzEgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKENvbnZlcnNhdGlvbi5jbGFzcykuZ3JlZXRpbmc7CisgICAgICAgIEdyZWV0aW5nIGdyZWV0aW5nMiA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoQ29udmVyc2F0aW9uLmNsYXNzKS5ncmVldGluZzsKKyAgICAgICAgR3JlZXRpbmcgZ3JlZXRpbmczID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShDb252ZXJzYXRpb24uY2xhc3MpLmdyZWV0aW5nOworCisgICAgICAgIGFzc2VydE5vdFNhbWUoZ3JlZXRpbmcxLCBncmVldGluZzIpOworICAgICAgICBhc3NlcnROb3RTYW1lKGdyZWV0aW5nMiwgZ3JlZXRpbmczKTsKKworICAgICAgICBTdXBwbGllcjxHcmVldGluZz4gc3VwcGxpZXIxID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShDb252ZXJzYXRpb24uY2xhc3MpLmdyZWV0aW5nU3VwcGxpZXI7CisgICAgICAgIFN1cHBsaWVyPEdyZWV0aW5nPiBzdXBwbGllcjIgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKENvbnZlcnNhdGlvbi5jbGFzcykuZ3JlZXRpbmdTdXBwbGllcjsKKyAgICAgICAgU3VwcGxpZXI8R3JlZXRpbmc+IHN1cHBsaWVyMyA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoQ29udmVyc2F0aW9uLmNsYXNzKS5ncmVldGluZ1N1cHBsaWVyOworCisgICAgICAgIGFzc2VydFNhbWUoc3VwcGxpZXIxLCBzdXBwbGllcjIpOworICAgICAgICBhc3NlcnRTYW1lKHN1cHBsaWVyMiwgc3VwcGxpZXIzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9pbmplY3QvY2RpMi1zZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvVGhyZWFkU2NvcGVUZXN0LmphdmEgYi9pbmplY3QvY2RpMi1zZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvVGhyZWFkU2NvcGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE2NjdiYgotLS0gL2Rldi9udWxsCisrKyBiL2luamVjdC9jZGkyLXNlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9UaHJlYWRTY29wZVRlc3QuamF2YQpAQCAtMCwwICsxLDI0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuY2RpLnNlOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuUmVxdWVzdFNjb3BlZDsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LmluamVjdC5Qcm92aWRlcjsKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuUGVyVGhyZWFkOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWwuUmVxdWVzdFNjb3BlOworCitpbXBvcnQgb3JnLmhhbWNyZXN0LmNvcmUuU3RyaW5nU3RhcnRzV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90U2FtZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIFRlc3RpbmcgdGhyZWFkIHNjb3BlIGludGVncmF0aW9uLgorICoKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitwdWJsaWMgY2xhc3MgVGhyZWFkU2NvcGVUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRocmVhZFNjb3BlZEluRGlmZmVyZW50VGhyZWFkKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyID0gQmluZGluZ1Rlc3RIZWxwZXIuY3JlYXRlSW5qZWN0aW9uTWFuYWdlcigpOworICAgICAgICBCaW5kaW5nVGVzdEhlbHBlci5iaW5kKGluamVjdGlvbk1hbmFnZXIsIGJpbmRlciAtPiB7CisgICAgICAgICAgICBiaW5kZXIuYmluZEFzQ29udHJhY3QoU2luZ2xldG9uT2JqZWN0LmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAuaW4oU2luZ2xldG9uLmNsYXNzKTsKKworICAgICAgICAgICAgYmluZGVyLmJpbmRGYWN0b3J5KG5ldyBTdXBwbGllckdyZWV0aW5nKCkpCisgICAgICAgICAgICAgICAgICAgIC50byhHcmVldGluZy5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgLmluKFBlclRocmVhZC5jbGFzcyk7CisgICAgICAgIH0pOworCisgICAgICAgIFNpbmdsZXRvbk9iamVjdCBpbnN0YW5jZTEgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKFNpbmdsZXRvbk9iamVjdC5jbGFzcyk7CisgICAgICAgIEdyZWV0aW5nIGdyZWV0aW5nMSA9IGluc3RhbmNlMS5nZXRHcmVldGluZygpOworICAgICAgICBTdHJpbmcgZ3JlZXRpbmdTdHJpbmcxID0gZ3JlZXRpbmcxLmdldEdyZWV0aW5nKCk7CisgICAgICAgIGFzc2VydFRoYXQoZ3JlZXRpbmdTdHJpbmcxLCBTdHJpbmdTdGFydHNXaXRoLnN0YXJ0c1dpdGgoQ3plY2hHcmVldGluZy5HUkVFVElORykpOworCisgICAgICAgIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgICBuZXcgVGhyZWFkKCgpIC0+IHsKKyAgICAgICAgICAgIC8vIFByZWNpc2VseSB0aGUgc2FtZSBvYmplY3QKKyAgICAgICAgICAgIFNpbmdsZXRvbk9iamVjdCBpbnN0YW5jZTIgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKFNpbmdsZXRvbk9iamVjdC5jbGFzcyk7CisgICAgICAgICAgICBHcmVldGluZyBncmVldGluZzIgPSBpbnN0YW5jZTIuZ2V0R3JlZXRpbmcoKTsKKyAgICAgICAgICAgIFN0cmluZyBncmVldGluZ1N0cmluZzIgPSBncmVldGluZzIuZ2V0R3JlZXRpbmcoKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoZ3JlZXRpbmdTdHJpbmcyLCBTdHJpbmdTdGFydHNXaXRoLnN0YXJ0c1dpdGgoQ3plY2hHcmVldGluZy5HUkVFVElORykpOworCisgICAgICAgICAgICBhc3NlcnROb3RFcXVhbHMoZ3JlZXRpbmdTdHJpbmcxLCBncmVldGluZ1N0cmluZzIpOworICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7CisgICAgICAgIH0pLnN0YXJ0KCk7CisKKyAgICAgICAgbGF0Y2guYXdhaXQoKTsKKworICAgICAgICBTaW5nbGV0b25PYmplY3QgaW5zdGFuY2UzID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShTaW5nbGV0b25PYmplY3QuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoaW5zdGFuY2UzLmdldEdyZWV0aW5nKCkuZ2V0R3JlZXRpbmcoKSwgZ3JlZXRpbmdTdHJpbmcxKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUaHJlYWRTY29wZWRJblJlcXVlc3RTY29wZSgpIHsKKyAgICAgICAgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyID0gQmluZGluZ1Rlc3RIZWxwZXIuY3JlYXRlSW5qZWN0aW9uTWFuYWdlcigpOworICAgICAgICBCaW5kaW5nVGVzdEhlbHBlci5iaW5kKGluamVjdGlvbk1hbmFnZXIsIGJpbmRlciAtPiB7CisgICAgICAgICAgICBiaW5kZXIuYmluZEFzQ29udHJhY3QoUmVxdWVzdFNjb3BlZEludGVyZmFjZS5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgLmluKFJlcXVlc3RTY29wZWQuY2xhc3MpOworCisgICAgICAgICAgICBiaW5kZXIuYmluZEZhY3RvcnkobmV3IFN1cHBsaWVyR3JlZXRpbmcoKSkKKyAgICAgICAgICAgICAgICAgICAgLnRvKEdyZWV0aW5nLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAuaW4oUGVyVGhyZWFkLmNsYXNzKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgUmVxdWVzdFNjb3BlIHJlcXVlc3QgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKFJlcXVlc3RTY29wZS5jbGFzcyk7CisgICAgICAgIHJlcXVlc3QucnVuSW5TY29wZSgoKSAtPiB7CisgICAgICAgICAgICBSZXF1ZXN0U2NvcGVkSW50ZXJmYWNlIGluc3RhbmNlMSA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoUmVxdWVzdFNjb3BlZEludGVyZmFjZS5jbGFzcyk7CisgICAgICAgICAgICBHcmVldGluZyBncmVldGluZzEgPSBpbnN0YW5jZTEuZ2V0R3JlZXRpbmcoKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZ3JlZXRpbmcxKTsKKworICAgICAgICAgICAgLy8gUHJlY2lzZWx5IHRoZSBzYW1lIG9iamVjdAorICAgICAgICAgICAgUmVxdWVzdFNjb3BlZEludGVyZmFjZSBpbnN0YW5jZTIgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKFJlcXVlc3RTY29wZWRJbnRlcmZhY2UuY2xhc3MpOworICAgICAgICAgICAgR3JlZXRpbmcgZ3JlZXRpbmcyID0gaW5zdGFuY2UyLmdldEdyZWV0aW5nKCk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGdyZWV0aW5nMik7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhncmVldGluZzEsIGdyZWV0aW5nMik7CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRocmVhZFNjb3BlZEluUmVxdWVzdFNjb3BlSW1wbGVtZW50YXRpb24oKSB7CisgICAgICAgIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciA9IEJpbmRpbmdUZXN0SGVscGVyLmNyZWF0ZUluamVjdGlvbk1hbmFnZXIoKTsKKyAgICAgICAgQmluZGluZ1Rlc3RIZWxwZXIuYmluZChpbmplY3Rpb25NYW5hZ2VyLCBiaW5kZXIgLT4geworICAgICAgICAgICAgYmluZGVyLmJpbmRBc0NvbnRyYWN0KFJlcXVlc3RTY29wZWRDemVjaC5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgLmluKFJlcXVlc3RTY29wZWQuY2xhc3MpOworCisgICAgICAgICAgICBiaW5kZXIuYmluZEZhY3RvcnkobmV3IFN1cHBsaWVyR3JlZXRpbmcoKSkKKyAgICAgICAgICAgICAgICAgICAgLnRvKEN6ZWNoR3JlZXRpbmcuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIC5pbihQZXJUaHJlYWQuY2xhc3MpOworICAgICAgICB9KTsKKworICAgICAgICBSZXF1ZXN0U2NvcGUgcmVxdWVzdCA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoUmVxdWVzdFNjb3BlLmNsYXNzKTsKKyAgICAgICAgcmVxdWVzdC5ydW5JblNjb3BlKCgpIC0+IHsKKyAgICAgICAgICAgIFJlcXVlc3RTY29wZWRDemVjaCBpbnN0YW5jZTEgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKFJlcXVlc3RTY29wZWRDemVjaC5jbGFzcyk7CisgICAgICAgICAgICBDemVjaEdyZWV0aW5nIGdyZWV0aW5nMSA9IGluc3RhbmNlMS5nZXRHcmVldGluZygpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChncmVldGluZzEpOworCisgICAgICAgICAgICAvLyBQcmVjaXNlbHkgdGhlIHNhbWUgb2JqZWN0CisgICAgICAgICAgICBSZXF1ZXN0U2NvcGVkQ3plY2ggaW5zdGFuY2UyID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShSZXF1ZXN0U2NvcGVkQ3plY2guY2xhc3MpOworICAgICAgICAgICAgQ3plY2hHcmVldGluZyBncmVldGluZzIgPSBpbnN0YW5jZTIuZ2V0R3JlZXRpbmcoKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZ3JlZXRpbmcyKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGdyZWV0aW5nMSwgZ3JlZXRpbmcyKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGhyZWFkU2NvcGVkSW5SZXF1ZXN0VHdvVHlwZXMoKSB7CisgICAgICAgIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciA9IEJpbmRpbmdUZXN0SGVscGVyLmNyZWF0ZUluamVjdGlvbk1hbmFnZXIoKTsKKyAgICAgICAgQmluZGluZ1Rlc3RIZWxwZXIuYmluZChpbmplY3Rpb25NYW5hZ2VyLCBiaW5kZXIgLT4geworICAgICAgICAgICAgYmluZGVyLmJpbmRBc0NvbnRyYWN0KFJlcXVlc3RTY29wZWRDemVjaC5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgLmluKFJlcXVlc3RTY29wZWQuY2xhc3MpOworCisgICAgICAgICAgICBiaW5kZXIuYmluZEFzQ29udHJhY3QoUmVxdWVzdFNjb3BlZEVuZ2xpc2guY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIC5pbihSZXF1ZXN0U2NvcGVkLmNsYXNzKTsKKworICAgICAgICAgICAgYmluZGVyLmJpbmRGYWN0b3J5KG5ldyBTdXBwbGllckdyZWV0aW5nKEN6ZWNoR3JlZXRpbmcuR1JFRVRJTkcpKQorICAgICAgICAgICAgICAgICAgICAudG8oQ3plY2hHcmVldGluZy5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgLmluKFBlclRocmVhZC5jbGFzcyk7CisKKyAgICAgICAgICAgIGJpbmRlci5iaW5kRmFjdG9yeShuZXcgU3VwcGxpZXJHcmVldGluZyhFbmdsaXNoR3JlZXRpbmcuR1JFRVRJTkcpKQorICAgICAgICAgICAgICAgICAgICAudG8oRW5nbGlzaEdyZWV0aW5nLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAuaW4oUGVyVGhyZWFkLmNsYXNzKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgUmVxdWVzdFNjb3BlIHJlcXVlc3QgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKFJlcXVlc3RTY29wZS5jbGFzcyk7CisgICAgICAgIHJlcXVlc3QucnVuSW5TY29wZSgoKSAtPiB7CisgICAgICAgICAgICBSZXF1ZXN0U2NvcGVkQ3plY2ggaW5zdGFuY2UxID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShSZXF1ZXN0U2NvcGVkQ3plY2guY2xhc3MpOworICAgICAgICAgICAgQ3plY2hHcmVldGluZyBncmVldGluZzEgPSBpbnN0YW5jZTEuZ2V0R3JlZXRpbmcoKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZ3JlZXRpbmcxKTsKKworICAgICAgICAgICAgLy8gUHJlY2lzZWx5IHRoZSBzYW1lIG9iamVjdAorICAgICAgICAgICAgUmVxdWVzdFNjb3BlZEVuZ2xpc2ggaW5zdGFuY2UyID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShSZXF1ZXN0U2NvcGVkRW5nbGlzaC5jbGFzcyk7CisgICAgICAgICAgICBFbmdsaXNoR3JlZXRpbmcgZ3JlZXRpbmcyID0gaW5zdGFuY2UyLmdldEdyZWV0aW5nKCk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGdyZWV0aW5nMik7CisKKyAgICAgICAgICAgIGFzc2VydE5vdFNhbWUoZ3JlZXRpbmcxLCBncmVldGluZzIpOworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUaHJlYWRTY29wZWRJblNpbmdsZXRvblNjb3BlKCkgeworICAgICAgICBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIgPSBCaW5kaW5nVGVzdEhlbHBlci5jcmVhdGVJbmplY3Rpb25NYW5hZ2VyKCk7CisgICAgICAgIEJpbmRpbmdUZXN0SGVscGVyLmJpbmQoaW5qZWN0aW9uTWFuYWdlciwgYmluZGVyIC0+IHsKKyAgICAgICAgICAgIGJpbmRlci5iaW5kQXNDb250cmFjdChTaW5nbGV0b25PYmplY3QuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIC5pbihTaW5nbGV0b24uY2xhc3MpOworCisgICAgICAgICAgICBiaW5kZXIuYmluZEZhY3RvcnkobmV3IFN1cHBsaWVyR3JlZXRpbmcoKSkKKyAgICAgICAgICAgICAgICAgICAgLnRvKEdyZWV0aW5nLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAuaW4oUGVyVGhyZWFkLmNsYXNzKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgU2luZ2xldG9uT2JqZWN0IGluc3RhbmNlMSA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoU2luZ2xldG9uT2JqZWN0LmNsYXNzKTsKKyAgICAgICAgR3JlZXRpbmcgZ3JlZXRpbmcxID0gaW5zdGFuY2UxLmdldEdyZWV0aW5nKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoZ3JlZXRpbmcxKTsKKworICAgICAgICAvLyBQcmVjaXNlbHkgdGhlIHNhbWUgb2JqZWN0CisgICAgICAgIFNpbmdsZXRvbk9iamVjdCBpbnN0YW5jZTIgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKFNpbmdsZXRvbk9iamVjdC5jbGFzcyk7CisgICAgICAgIEdyZWV0aW5nIGdyZWV0aW5nMiA9IGluc3RhbmNlMi5nZXRHcmVldGluZygpOworICAgICAgICBhc3NlcnROb3ROdWxsKGdyZWV0aW5nMik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGdyZWV0aW5nMSwgZ3JlZXRpbmcyKTsKKyAgICB9CisKKyAgICBAUmVxdWVzdFNjb3BlZAorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVxdWVzdFNjb3BlZFByb3ZpZGVyIHsKKworICAgICAgICBASW5qZWN0CisgICAgICAgIFByb3ZpZGVyPFNBWFBhcnNlckZhY3Rvcnk+IGdyZWV0aW5nOworCisgICAgICAgIHB1YmxpYyBQcm92aWRlcjxTQVhQYXJzZXJGYWN0b3J5PiBwcm92aWRlcigpIHsKKyAgICAgICAgICAgIHJldHVybiBncmVldGluZzsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBSZXF1ZXN0U2NvcGVkCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXF1ZXN0U2NvcGVkSW50ZXJmYWNlIHsKKworICAgICAgICBASW5qZWN0CisgICAgICAgIEdyZWV0aW5nIGdyZWV0aW5nOworCisgICAgICAgIHB1YmxpYyBHcmVldGluZyBnZXRHcmVldGluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBncmVldGluZzsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBSZXF1ZXN0U2NvcGVkCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXF1ZXN0U2NvcGVkQ3plY2ggeworCisgICAgICAgIEBJbmplY3QKKyAgICAgICAgQ3plY2hHcmVldGluZyBncmVldGluZzsKKworICAgICAgICBwdWJsaWMgQ3plY2hHcmVldGluZyBnZXRHcmVldGluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBncmVldGluZzsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBSZXF1ZXN0U2NvcGVkCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXF1ZXN0U2NvcGVkRW5nbGlzaCB7CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBFbmdsaXNoR3JlZXRpbmcgZ3JlZXRpbmc7CisKKyAgICAgICAgcHVibGljIEVuZ2xpc2hHcmVldGluZyBnZXRHcmVldGluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBncmVldGluZzsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBTaW5nbGV0b24KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNpbmdsZXRvbk9iamVjdCB7CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBHcmVldGluZyBncmVldGluZzsKKworICAgICAgICBwdWJsaWMgR3JlZXRpbmcgZ2V0R3JlZXRpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gZ3JlZXRpbmc7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9pbmplY3QvY2RpMi1zZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvaW5qZWN0b3IvQ2FjaGVkQ29uc3RydWN0b3JBbmFseXplclRlc3QuamF2YSBiL2luamVjdC9jZGkyLXNlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9pbmplY3Rvci9DYWNoZWRDb25zdHJ1Y3RvckFuYWx5emVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNWU4NjMKLS0tIC9kZXYvbnVsbAorKysgYi9pbmplY3QvY2RpMi1zZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvaW5qZWN0b3IvQ2FjaGVkQ29uc3RydWN0b3JBbmFseXplclRlc3QuamF2YQpAQCAtMCwwICsxLDIyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuY2RpLnNlLmluamVjdG9yOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Db25zdHJ1Y3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuTWF0cml4UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LkluamVjdGlvbkV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0cyB7QGxpbmsgQ2FjaGVkQ29uc3RydWN0b3JBbmFseXplcn0uCisgKi8KK3B1YmxpYyBjbGFzcyBDYWNoZWRDb25zdHJ1Y3RvckFuYWx5emVyVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb2xsZWN0aW9uPENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPj4gQU5OT1RBVElPTlMgPQorICAgICAgICAgICAgQXJyYXlzLmFzTGlzdChDb250ZXh0LmNsYXNzLCBQYXRoUGFyYW0uY2xhc3MpOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdENvbnN0cnVjdG9yKCkgeworICAgICAgICBDYWNoZWRDb25zdHJ1Y3RvckFuYWx5emVyPERlZmF1bHRDb25zdHJ1Y3Rvcj4gYW5hbHl6ZXIgPQorICAgICAgICAgICAgICAgIG5ldyBDYWNoZWRDb25zdHJ1Y3RvckFuYWx5emVyPD4oRGVmYXVsdENvbnN0cnVjdG9yLmNsYXNzLCBBTk5PVEFUSU9OUyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGFuYWx5emVyLmdldENvbnN0cnVjdG9yKCkuZ2V0UGFyYW1ldGVyQ291bnQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9BcmdzQ29uc3RydWN0b3IoKSB7CisgICAgICAgIENhY2hlZENvbnN0cnVjdG9yQW5hbHl6ZXI8Tm9BcmdzQ29uc3RydWN0b3I+IGFuYWx5emVyID0KKyAgICAgICAgICAgICAgICBuZXcgQ2FjaGVkQ29uc3RydWN0b3JBbmFseXplcjw+KE5vQXJnc0NvbnN0cnVjdG9yLmNsYXNzLCBBTk5PVEFUSU9OUyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGFuYWx5emVyLmdldENvbnN0cnVjdG9yKCkuZ2V0UGFyYW1ldGVyQ291bnQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlQW5ub3RhdGVkQ29uc3RydWN0b3IoKSB7CisgICAgICAgIENhY2hlZENvbnN0cnVjdG9yQW5hbHl6ZXI8U2luZ2xlQW5ub3RhdGVkQ29uc3RydWN0b3I+IGFuYWx5emVyID0KKyAgICAgICAgICAgICAgICBuZXcgQ2FjaGVkQ29uc3RydWN0b3JBbmFseXplcjw+KFNpbmdsZUFubm90YXRlZENvbnN0cnVjdG9yLmNsYXNzLCBBTk5PVEFUSU9OUyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFuYWx5emVyLmdldENvbnN0cnVjdG9yKCkuZ2V0UGFyYW1ldGVyQ291bnQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlTXVsdGlBbm5vdGF0ZWRDb25zdHJ1Y3RvcigpIHsKKyAgICAgICAgQ2FjaGVkQ29uc3RydWN0b3JBbmFseXplcjxTaW5nbGVNdWx0aUFubm90YXRlZENvbnN0cnVjdG9yPiBhbmFseXplciA9CisgICAgICAgICAgICAgICAgbmV3IENhY2hlZENvbnN0cnVjdG9yQW5hbHl6ZXI8PihTaW5nbGVNdWx0aUFubm90YXRlZENvbnN0cnVjdG9yLmNsYXNzLCBBTk5PVEFUSU9OUyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGFuYWx5emVyLmdldENvbnN0cnVjdG9yKCkuZ2V0UGFyYW1ldGVyQ291bnQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGFyZ2VzdEFubm90YXRlZENvbnN0cnVjdG9yKCkgeworICAgICAgICBDYWNoZWRDb25zdHJ1Y3RvckFuYWx5emVyPExhcmdlc3RBbm5vdGF0ZWRDb25zdHJ1Y3Rvcj4gYW5hbHl6ZXIgPQorICAgICAgICAgICAgICAgIG5ldyBDYWNoZWRDb25zdHJ1Y3RvckFuYWx5emVyPD4oTGFyZ2VzdEFubm90YXRlZENvbnN0cnVjdG9yLmNsYXNzLCBBTk5PVEFUSU9OUyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGFuYWx5emVyLmdldENvbnN0cnVjdG9yKCkuZ2V0UGFyYW1ldGVyQ291bnQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNTbWFsbGVyTm9uQW5ub3RhdGVkQ29uc3RydWN0b3IoKSB7CisgICAgICAgIENhY2hlZENvbnN0cnVjdG9yQW5hbHl6ZXI8Q29udGFpbnNTbWFsbGVyTm9uQW5ub3RhdGVkQ29uc3RydWN0b3I+IGFuYWx5emVyID0KKyAgICAgICAgICAgICAgICBuZXcgQ2FjaGVkQ29uc3RydWN0b3JBbmFseXplcjw+KENvbnRhaW5zU21hbGxlck5vbkFubm90YXRlZENvbnN0cnVjdG9yLmNsYXNzLCBBTk5PVEFUSU9OUyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGFuYWx5emVyLmdldENvbnN0cnVjdG9yKCkuZ2V0UGFyYW1ldGVyQ291bnQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGFpbnNMYXJnZXJOb25Bbm5vdGF0ZWRDb25zdHJ1Y3RvcigpIHsKKyAgICAgICAgQ2FjaGVkQ29uc3RydWN0b3JBbmFseXplcjxDb250YWluc0xhcmdlck5vbkFubm90YXRlZENvbnN0cnVjdG9yPiBhbmFseXplciA9CisgICAgICAgICAgICAgICAgbmV3IENhY2hlZENvbnN0cnVjdG9yQW5hbHl6ZXI8PihDb250YWluc0xhcmdlck5vbkFubm90YXRlZENvbnN0cnVjdG9yLmNsYXNzLCBBTk5PVEFUSU9OUyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFuYWx5emVyLmdldENvbnN0cnVjdG9yKCkuZ2V0UGFyYW1ldGVyQ291bnQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2FtZU5vbkFubm90YXRlZENvbnN0cnVjdG9yKCkgeworICAgICAgICBDYWNoZWRDb25zdHJ1Y3RvckFuYWx5emVyPFNhbWVOb25Bbm5vdGF0ZWRDb25zdHJ1Y3Rvcj4gYW5hbHl6ZXIgPQorICAgICAgICAgICAgICAgIG5ldyBDYWNoZWRDb25zdHJ1Y3RvckFuYWx5emVyPD4oU2FtZU5vbkFubm90YXRlZENvbnN0cnVjdG9yLmNsYXNzLCBBTk5PVEFUSU9OUyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGFuYWx5emVyLmdldENvbnN0cnVjdG9yKCkuZ2V0UGFyYW1ldGVyQ291bnQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Qm90aEFubm90YXRlZENvbnN0cnVjdG9yKCkgeworICAgICAgICBDYWNoZWRDb25zdHJ1Y3RvckFuYWx5emVyPEJvdGhBbm5vdGF0ZWRDb25zdHJ1Y3Rvcj4gYW5hbHl6ZXIgPQorICAgICAgICAgICAgICAgIG5ldyBDYWNoZWRDb25zdHJ1Y3RvckFuYWx5emVyPD4oQm90aEFubm90YXRlZENvbnN0cnVjdG9yLmNsYXNzLCBBTk5PVEFUSU9OUyk7CisKKyAgICAgICAgQ29uc3RydWN0b3I8Qm90aEFubm90YXRlZENvbnN0cnVjdG9yPiBjb25zdHJ1Y3RvciA9IGFuYWx5emVyLmdldENvbnN0cnVjdG9yKCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjb25zdHJ1Y3Rvci5nZXRQYXJhbWV0ZXJDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIuY2xhc3MsIGNvbnN0cnVjdG9yLmdldFBhcmFtZXRlclR5cGVzKClbMF0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uZU5vbkFubm90YXRlZENvbnN0cnVjdG9yKCkgeworICAgICAgICBDYWNoZWRDb25zdHJ1Y3RvckFuYWx5emVyPE9uZU5vbkFubm90YXRlZENvbnN0cnVjdG9yPiBhbmFseXplciA9CisgICAgICAgICAgICAgICAgbmV3IENhY2hlZENvbnN0cnVjdG9yQW5hbHl6ZXI8PihPbmVOb25Bbm5vdGF0ZWRDb25zdHJ1Y3Rvci5jbGFzcywgQU5OT1RBVElPTlMpOworCisgICAgICAgIGFzc2VydEVxdWFscygxLCBhbmFseXplci5nZXRDb25zdHJ1Y3RvcigpLmdldFBhcmFtZXRlckNvdW50KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpQW5ub3RhdGVkQ29uc3RydWN0b3IoKSB7CisgICAgICAgIENhY2hlZENvbnN0cnVjdG9yQW5hbHl6ZXI8TXVsdGlBbm5vdGF0ZWRDb25zdHJ1Y3Rvcj4gYW5hbHl6ZXIgPQorICAgICAgICAgICAgICAgIG5ldyBDYWNoZWRDb25zdHJ1Y3RvckFuYWx5emVyPD4oTXVsdGlBbm5vdGF0ZWRDb25zdHJ1Y3Rvci5jbGFzcywgQU5OT1RBVElPTlMpOworCisgICAgICAgIGFzc2VydEVxdWFscygyLCBhbmFseXplci5nZXRDb25zdHJ1Y3RvcigpLmdldFBhcmFtZXRlckNvdW50KCkpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gSW5qZWN0aW9uRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RVbmtub3duQW5ub3RhdGVkQ29uc3RydWN0b3IoKSB7CisgICAgICAgIG5ldyBDYWNoZWRDb25zdHJ1Y3RvckFuYWx5emVyPD4oVW5rbm93bkFubm90YXRlZENvbnN0cnVjdG9yLmNsYXNzLCBBTk5PVEFUSU9OUykuZ2V0Q29uc3RydWN0b3IoKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IEluamVjdGlvbkV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlTm9uQW5ub3RhdGVkQ29uc3RydWN0b3IoKSB7CisgICAgICAgIG5ldyBDYWNoZWRDb25zdHJ1Y3RvckFuYWx5emVyPD4oU2luZ2xlTm9uQW5ub3RhdGVkQ29uc3RydWN0b3IuY2xhc3MsIEFOTk9UQVRJT05TKS5nZXRDb25zdHJ1Y3RvcigpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGVmYXVsdENvbnN0cnVjdG9yIHsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5vQXJnc0NvbnN0cnVjdG9yIHsKKyAgICAgICAgcHVibGljIE5vQXJnc0NvbnN0cnVjdG9yKCkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTaW5nbGVOb25Bbm5vdGF0ZWRDb25zdHJ1Y3RvciB7CisgICAgICAgIHB1YmxpYyBTaW5nbGVOb25Bbm5vdGF0ZWRDb25zdHJ1Y3RvcihTdHJpbmcgc3RyKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNpbmdsZUFubm90YXRlZENvbnN0cnVjdG9yIHsKKyAgICAgICAgcHVibGljIFNpbmdsZUFubm90YXRlZENvbnN0cnVjdG9yKEBDb250ZXh0IFN0cmluZyBzdHIpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2luZ2xlTXVsdGlBbm5vdGF0ZWRDb25zdHJ1Y3RvciB7CisgICAgICAgIHB1YmxpYyBTaW5nbGVNdWx0aUFubm90YXRlZENvbnN0cnVjdG9yKEBDb250ZXh0IFN0cmluZyBzdHIsIEBQYXRoUGFyYW0oIm5hbWUiKSBTdHJpbmcgbmFtZSkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBMYXJnZXN0QW5ub3RhdGVkQ29uc3RydWN0b3IgeworICAgICAgICBwdWJsaWMgTGFyZ2VzdEFubm90YXRlZENvbnN0cnVjdG9yKEBDb250ZXh0IFN0cmluZyBzdHIsIEBQYXRoUGFyYW0oIm5hbWUiKSBTdHJpbmcgbmFtZSwgQENvbnRleHQgU3RyaW5nIHN0cjIpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBMYXJnZXN0QW5ub3RhdGVkQ29uc3RydWN0b3IoQENvbnRleHQgU3RyaW5nIHN0cikgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIExhcmdlc3RBbm5vdGF0ZWRDb25zdHJ1Y3RvcihAQ29udGV4dCBTdHJpbmcgc3RyLCBAUGF0aFBhcmFtKCJuYW1lIikgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29udGFpbnNTbWFsbGVyTm9uQW5ub3RhdGVkQ29uc3RydWN0b3IgeworICAgICAgICBwdWJsaWMgQ29udGFpbnNTbWFsbGVyTm9uQW5ub3RhdGVkQ29uc3RydWN0b3IoU3RyaW5nIHN0cikgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvbnRhaW5zU21hbGxlck5vbkFubm90YXRlZENvbnN0cnVjdG9yKEBDb250ZXh0IFN0cmluZyBzdHIsIEBQYXRoUGFyYW0oIm5hbWUiKSBTdHJpbmcgbmFtZSkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb250YWluc0xhcmdlck5vbkFubm90YXRlZENvbnN0cnVjdG9yIHsKKyAgICAgICAgcHVibGljIENvbnRhaW5zTGFyZ2VyTm9uQW5ub3RhdGVkQ29uc3RydWN0b3IoQENvbnRleHQgU3RyaW5nIHN0cikgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvbnRhaW5zTGFyZ2VyTm9uQW5ub3RhdGVkQ29uc3RydWN0b3IoU3RyaW5nIHN0ciwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2FtZU5vbkFubm90YXRlZENvbnN0cnVjdG9yIHsKKyAgICAgICAgcHVibGljIFNhbWVOb25Bbm5vdGF0ZWRDb25zdHJ1Y3RvcihAQ29udGV4dCBTdHJpbmcgc3RyKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU2FtZU5vbkFubm90YXRlZENvbnN0cnVjdG9yKEludGVnZXIgbmFtZSkgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCb3RoQW5ub3RhdGVkQ29uc3RydWN0b3IgeworICAgICAgICBwdWJsaWMgQm90aEFubm90YXRlZENvbnN0cnVjdG9yKEBDb250ZXh0IFN0cmluZyBzdHIpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCb3RoQW5ub3RhdGVkQ29uc3RydWN0b3IoQENvbnRleHQgSW50ZWdlciBuYW1lKSB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE9uZU5vbkFubm90YXRlZENvbnN0cnVjdG9yIHsKKyAgICAgICAgcHVibGljIE9uZU5vbkFubm90YXRlZENvbnN0cnVjdG9yKEBDb250ZXh0IFN0cmluZyBzdHIpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBPbmVOb25Bbm5vdGF0ZWRDb25zdHJ1Y3RvcihAQ29udGV4dCBJbnRlZ2VyIG5hbWUsIFN0cmluZyBzdHIpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXVsdGlBbm5vdGF0ZWRDb25zdHJ1Y3RvciB7CisgICAgICAgIHB1YmxpYyBNdWx0aUFubm90YXRlZENvbnN0cnVjdG9yKEBDb250ZXh0IEludGVnZXIgbmFtZSwgQFBhdGhQYXJhbSgic3RyIikgQENvbnRleHQgU3RyaW5nIHN0cikgeworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBVbmtub3duQW5ub3RhdGVkQ29uc3RydWN0b3IgeworICAgICAgICBwdWJsaWMgVW5rbm93bkFubm90YXRlZENvbnN0cnVjdG9yKEBDb250ZXh0IEludGVnZXIgbmFtZSwgQE1hdHJpeFBhcmFtKCJtYXRyaXgiKSBTdHJpbmcgc3RyKSB7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9pbmplY3QvY2RpMi1zZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvaW5qZWN0b3IvSmVyc2V5UHJveHlSZXNvbHZlclRlc3QuamF2YSBiL2luamVjdC9jZGkyLXNlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2NkaS9zZS9pbmplY3Rvci9KZXJzZXlQcm94eVJlc29sdmVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MjZjOGEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmplY3QvY2RpMi1zZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9jZGkvc2UvaW5qZWN0b3IvSmVyc2V5UHJveHlSZXNvbHZlclRlc3QuamF2YQpAQCAtMCwwICsxLDE5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuY2RpLnNlLmluamVjdG9yOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcnM7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuQXBwbGljYXRpb25TY29wZWQ7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LlJlcXVlc3RTY29wZWQ7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkpheHJzUHJvdmlkZXJzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3RlZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0ZWVJbXBsOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25SZXNvbHZlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdFNhbWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIFRlc3RzIEplcnNleSBQcm94eSBSZXNvbHZlci4KKyAqLworcHVibGljIGNsYXNzIEplcnNleVByb3h5UmVzb2x2ZXJUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIEZpZWxkW10gRklFTERTID0gU3R1YkZvckZpZWxkcy5jbGFzcy5nZXREZWNsYXJlZEZpZWxkcygpOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2lnbmxldG9uSXNQcm94aWFibGUoKSB7CisgICAgICAgIEluamVjdGVlSW1wbCBpbmplY3RlZSA9IG5ldyBJbmplY3RlZUltcGwoKTsKKyAgICAgICAgaW5qZWN0ZWUuc2V0SW5qZWN0ZWVDbGFzcyhUZXN0U2luZ2xldG9uLmNsYXNzKTsKKyAgICAgICAgaW5qZWN0ZWUuc2V0UGFyZW50Q2xhc3NTY29wZShTaW5nbGV0b24uY2xhc3MpOworCisgICAgICAgIEplcnNleVByb3h5UmVzb2x2ZXIgcmVzb2x2ZXIgPSBuZXcgSmVyc2V5UHJveHlSZXNvbHZlcigpOworICAgICAgICBhc3NlcnRUcnVlKHJlc29sdmVyLmlzUHJpeGlhYmxlKGluamVjdGVlKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwbGljYXRpb25TY29wZUlzUHJveGlhYmxlKCkgeworICAgICAgICBJbmplY3RlZUltcGwgaW5qZWN0ZWUgPSBuZXcgSW5qZWN0ZWVJbXBsKCk7CisgICAgICAgIGluamVjdGVlLnNldEluamVjdGVlQ2xhc3MoVGVzdEFwcGxpY2F0aW9uU2NvcGUuY2xhc3MpOworICAgICAgICBpbmplY3RlZS5zZXRQYXJlbnRDbGFzc1Njb3BlKEFwcGxpY2F0aW9uU2NvcGVkLmNsYXNzKTsKKworICAgICAgICBKZXJzZXlQcm94eVJlc29sdmVyIHJlc29sdmVyID0gbmV3IEplcnNleVByb3h5UmVzb2x2ZXIoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXNvbHZlci5pc1ByaXhpYWJsZShpbmplY3RlZSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcXVlc3RTY29wZUZyb21Ob25Bbm5vdGF0ZWRJc05vdFByb3hpYWJsZSgpIHsKKyAgICAgICAgSW5qZWN0ZWVJbXBsIGluamVjdGVlID0gbmV3IEluamVjdGVlSW1wbCgpOworICAgICAgICBpbmplY3RlZS5zZXRJbmplY3RlZUNsYXNzKFRlc3ROb25Bbm5vdGF0ZWRSZXF1ZXN0U2NvcGUuY2xhc3MpOworICAgICAgICBpbmplY3RlZS5zZXRQYXJlbnRDbGFzc1Njb3BlKFJlcXVlc3RTY29wZWQuY2xhc3MpOworCisgICAgICAgIEplcnNleVByb3h5UmVzb2x2ZXIgcmVzb2x2ZXIgPSBuZXcgSmVyc2V5UHJveHlSZXNvbHZlcigpOworICAgICAgICBhc3NlcnRGYWxzZShyZXNvbHZlci5pc1ByaXhpYWJsZShpbmplY3RlZSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcXVlc3RTY29wZUlzTm90UHJveGlhYmxlKCkgeworICAgICAgICBJbmplY3RlZUltcGwgaW5qZWN0ZWUgPSBuZXcgSW5qZWN0ZWVJbXBsKCk7CisgICAgICAgIGluamVjdGVlLnNldEluamVjdGVlQ2xhc3MoVGVzdFJlcXVlc3RTY29wZS5jbGFzcyk7CisgICAgICAgIGluamVjdGVlLnNldFBhcmVudENsYXNzU2NvcGUoUmVxdWVzdFNjb3BlZC5jbGFzcyk7CisKKyAgICAgICAgSmVyc2V5UHJveHlSZXNvbHZlciByZXNvbHZlciA9IG5ldyBKZXJzZXlQcm94eVJlc29sdmVyKCk7CisgICAgICAgIGFzc2VydEZhbHNlKHJlc29sdmVyLmlzUHJpeGlhYmxlKGluamVjdGVlKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwbGljYXRpb25Jc05vdFByb3hpYWJsZSgpIHsKKyAgICAgICAgSW5qZWN0ZWVJbXBsIGluamVjdGVlID0gbmV3IEluamVjdGVlSW1wbCgpOworICAgICAgICBpbmplY3RlZS5zZXRSZXF1aXJlZFR5cGUoQXBwbGljYXRpb24uY2xhc3MpOworCisgICAgICAgIEplcnNleVByb3h5UmVzb2x2ZXIgcmVzb2x2ZXIgPSBuZXcgSmVyc2V5UHJveHlSZXNvbHZlcigpOworICAgICAgICBhc3NlcnRGYWxzZShyZXNvbHZlci5pc1ByaXhpYWJsZShpbmplY3RlZSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByb3h5Q3JlYXRlZCgpIHsKKyAgICAgICAgTXlJbmplY3Rpb25SZXNvbHZlciBpbmplY3Rpb25SZXNvbHZlciA9IG5ldyBNeUluamVjdGlvblJlc29sdmVyKG5ldyBKYXhyc1Byb3ZpZGVycygpKTsKKyAgICAgICAgSW5qZWN0ZWVJbXBsIGluamVjdGVlID0gbmV3IEluamVjdGVlSW1wbCgpOworICAgICAgICBpbmplY3RlZS5zZXRSZXF1aXJlZFR5cGUoUHJvdmlkZXJzLmNsYXNzKTsKKyAgICAgICAgaW5qZWN0ZWUuc2V0UGFyZW50KEZJRUxEU1swXSk7CisKKyAgICAgICAgSmVyc2V5UHJveHlSZXNvbHZlciByZXNvbHZlciA9IG5ldyBKZXJzZXlQcm94eVJlc29sdmVyKCk7CisgICAgICAgIE9iamVjdCBwcm94eSA9IHJlc29sdmVyLnByb3h5KGluamVjdGVlLCBpbmplY3Rpb25SZXNvbHZlcik7CisgICAgICAgIGFzc2VydFRydWUocHJveHkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkuY29udGFpbnMoIlByb3h5IikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByb3h5Q2FjaGVkKCkgeworICAgICAgICBNeUluamVjdGlvblJlc29sdmVyIGluamVjdGlvblJlc29sdmVyID0gbmV3IE15SW5qZWN0aW9uUmVzb2x2ZXIobmV3IEpheHJzUHJvdmlkZXJzKCkpOworICAgICAgICBJbmplY3RlZUltcGwgaW5qZWN0ZWUxID0gbmV3IEluamVjdGVlSW1wbCgpOworICAgICAgICBpbmplY3RlZTEuc2V0UmVxdWlyZWRUeXBlKFByb3ZpZGVycy5jbGFzcyk7CisgICAgICAgIGluamVjdGVlMS5zZXRQYXJlbnQoRklFTERTWzBdKTsKKworICAgICAgICBJbmplY3RlZUltcGwgaW5qZWN0ZWUyID0gbmV3IEluamVjdGVlSW1wbCgpOworICAgICAgICBpbmplY3RlZTIuc2V0UmVxdWlyZWRUeXBlKFByb3ZpZGVycy5jbGFzcyk7CisgICAgICAgIGluamVjdGVlMi5zZXRQYXJlbnQoRklFTERTWzFdKTsKKworICAgICAgICBKZXJzZXlQcm94eVJlc29sdmVyIHJlc29sdmVyID0gbmV3IEplcnNleVByb3h5UmVzb2x2ZXIoKTsKKyAgICAgICAgT2JqZWN0IHByb3h5MSA9IHJlc29sdmVyLnByb3h5KGluamVjdGVlMSwgaW5qZWN0aW9uUmVzb2x2ZXIpOworICAgICAgICBPYmplY3QgcHJveHkyID0gcmVzb2x2ZXIucHJveHkoaW5qZWN0ZWUyLCBpbmplY3Rpb25SZXNvbHZlcik7CisgICAgICAgIGFzc2VydFNhbWUocHJveHkxLmdldENsYXNzKCksIHByb3h5Mi5nZXRDbGFzcygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm94eUNhY2hlTm90TWlzbWF0Y2hlZCgpIHsKKyAgICAgICAgTXlJbmplY3Rpb25SZXNvbHZlciBpbmplY3Rpb25SZXNvbHZlcjEgPSBuZXcgTXlJbmplY3Rpb25SZXNvbHZlcihuZXcgSmF4cnNQcm92aWRlcnMoKSk7CisgICAgICAgIEluamVjdGVlSW1wbCBpbmplY3RlZTEgPSBuZXcgSW5qZWN0ZWVJbXBsKCk7CisgICAgICAgIGluamVjdGVlMS5zZXRSZXF1aXJlZFR5cGUoUHJvdmlkZXJzLmNsYXNzKTsKKyAgICAgICAgaW5qZWN0ZWUxLnNldFBhcmVudChGSUVMRFNbMF0pOworCisgICAgICAgIE15SW5qZWN0aW9uUmVzb2x2ZXIgaW5qZWN0aW9uUmVzb2x2ZXIyID0gbmV3IE15SW5qZWN0aW9uUmVzb2x2ZXIobmV3IEFycmF5TGlzdDw+KCkpOworICAgICAgICBJbmplY3RlZUltcGwgaW5qZWN0ZWUyID0gbmV3IEluamVjdGVlSW1wbCgpOworICAgICAgICBpbmplY3RlZTIuc2V0UmVxdWlyZWRUeXBlKExpc3QuY2xhc3MpOworICAgICAgICBpbmplY3RlZTIuc2V0UGFyZW50KEZJRUxEU1sxXSk7CisKKyAgICAgICAgSmVyc2V5UHJveHlSZXNvbHZlciByZXNvbHZlciA9IG5ldyBKZXJzZXlQcm94eVJlc29sdmVyKCk7CisgICAgICAgIE9iamVjdCBwcm94eTEgPSByZXNvbHZlci5wcm94eShpbmplY3RlZTEsIGluamVjdGlvblJlc29sdmVyMSk7CisgICAgICAgIE9iamVjdCBwcm94eTIgPSByZXNvbHZlci5wcm94eShpbmplY3RlZTIsIGluamVjdGlvblJlc29sdmVyMik7CisgICAgICAgIGFzc2VydE5vdFNhbWUocHJveHkxLmdldENsYXNzKCksIHByb3h5Mi5nZXRDbGFzcygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTdHViRm9yRmllbGRzIHsKKyAgICAgICAgcHJpdmF0ZSBPYmplY3QgZmllbGQxOworICAgICAgICBwcml2YXRlIE9iamVjdCBmaWVsZDI7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTXlJbmplY3Rpb25SZXNvbHZlciBpbXBsZW1lbnRzIEluamVjdGlvblJlc29sdmVyIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBpbnN0YW5jZTsKKworICAgICAgICBwcml2YXRlIE15SW5qZWN0aW9uUmVzb2x2ZXIoT2JqZWN0IGluc3RhbmNlKSB7CisgICAgICAgICAgICB0aGlzLmluc3RhbmNlID0gaW5zdGFuY2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE9iamVjdCByZXNvbHZlKEluamVjdGVlIGluamVjdGVlKSB7CisgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDb25zdHJ1Y3RvclBhcmFtZXRlckluZGljYXRvcigpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzTWV0aG9kUGFyYW1ldGVySW5kaWNhdG9yKCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDbGFzcyBnZXRBbm5vdGF0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIENvbnRleHQuY2xhc3M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUZXN0Tm9uQW5ub3RhdGVkUmVxdWVzdFNjb3BlIHsKKyAgICB9CisKKyAgICBAUmVxdWVzdFNjb3BlZAorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRlc3RSZXF1ZXN0U2NvcGUgeworICAgIH0KKworICAgIEBTaW5nbGV0b24KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUZXN0U2luZ2xldG9uIHsKKyAgICB9CisKKyAgICBAQXBwbGljYXRpb25TY29wZWQKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUZXN0QXBwbGljYXRpb25TY29wZSB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaW5qZWN0L2NkaTItc2Uvc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL2JlYW5zLnhtbCBiL2luamVjdC9jZGkyLXNlL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9iZWFucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q5YzY3YwotLS0gL2Rldi9udWxsCisrKyBiL2luamVjdC9jZGkyLXNlL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9iZWFucy54bWwKQEAgLTAsMCArMSwyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8YmVhbnMgIGJlYW4tZGlzY292ZXJ5LW1vZGU9Im5vbmUiIC8+CmRpZmYgLS1naXQgYS9pbmplY3QvaGsyL3BvbS54bWwgYi9pbmplY3QvaGsyL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlhYzQ4YwotLS0gL2Rldi9udWxsCisrKyBiL2luamVjdC9oazIvcG9tLnhtbApAQCAtMCwwICsxLDExMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3Q8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktaGsyPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LWluamVjdC1oazI8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+SEsyIEluamVjdGlvbk1hbmFnZXIgaW1wbGVtZW50YXRpb248L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbW1vbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5oazI8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5oazItbG9jYXRvcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5oYW1jcmVzdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmhhbWNyZXN0LWxpYnJhcnk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHJlc291cmNlcz4KKyAgICAgICAgICAgIDxyZXNvdXJjZT4KKyAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PiR7YmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgPGZpbHRlcmluZz50cnVlPC9maWx0ZXJpbmc+CisgICAgICAgICAgICA8L3Jlc291cmNlPgorICAgICAgICA8L3Jlc291cmNlcz4KKworICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi5pc3RhY2s8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4taXN0YWNrLWNvbW1vbnMtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJ1aWxkLWhlbHBlci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5mZWxpeDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1idW5kbGUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgICAgIDxleHRlbnNpb25zPnRydWU8L2V4dGVuc2lvbnM+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxpbnN0cnVjdGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8RXhwb3J0LVBhY2thZ2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0LmhrMi4qO3ZlcnNpb249JHtwcm9qZWN0LnZlcnNpb259CisgICAgICAgICAgICAgICAgICAgICAgICA8L0V4cG9ydC1QYWNrYWdlPgorICAgICAgICAgICAgICAgICAgICAgICAgPEltcG9ydC1QYWNrYWdlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1bi5taXNjLio7cmVzb2x1dGlvbjo9b3B0aW9uYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgorICAgICAgICAgICAgICAgICAgICAgICAgPC9JbXBvcnQtUGFja2FnZT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbnN0cnVjdGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDx1bnBhY2tCdW5kbGU+dHJ1ZTwvdW5wYWNrQnVuZGxlPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5kZWZhdWx0LWphcjwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvaW5qZWN0L2hrMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9oazIvQWJzdHJhY3RIazJJbmplY3Rpb25NYW5hZ2VyLmphdmEgYi9pbmplY3QvaGsyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2hrMi9BYnN0cmFjdEhrMkluamVjdGlvbk1hbmFnZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDNmNjYyCi0tLSAvZGV2L251bGwKKysrIGIvaW5qZWN0L2hrMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9oazIvQWJzdHJhY3RIazJJbmplY3Rpb25NYW5hZ2VyLmphdmEKQEAgLTAsMCArMSwyMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0LmhrMjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkJpbmRpbmc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkNsYXNzQmluZGluZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuRm9yZWlnbkRlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0Lkluc3RhbmNlQmluZGluZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuU2VydmljZUhvbGRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuU2VydmljZUhvbGRlckltcGw7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi5hcGkuQWN0aXZlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi5hcGkuRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi5hcGkuU2VydmljZUxvY2F0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIuYXBpLlNlcnZpY2VMb2NhdG9yRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi51dGlsaXRpZXMuU2VydmljZUxvY2F0b3JVdGlsaXRpZXM7CisKK2ltcG9ydCBvcmcuanZuZXQuaGsyLmV4dGVybmFsLnJ1bnRpbWUuU2VydmljZUxvY2F0b3JSdW50aW1lQmVhbjsKKworLyoqCisgKiBBYnN0cmFjdCBjbGFzcyBkZWRpY2F0ZWQgdG8gaW1wbGVtZW50YXRpb25zIG9mIHtAbGluayBJbmplY3Rpb25NYW5hZ2VyfSBwcm92aWRpbmcgc2V2ZXJhbCBjb252ZW5pZW50IG1ldGhvZHMuCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK2Fic3RyYWN0IGNsYXNzIEFic3RyYWN0SGsySW5qZWN0aW9uTWFuYWdlciBpbXBsZW1lbnRzIEluamVjdGlvbk1hbmFnZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoQWJzdHJhY3RIazJJbmplY3Rpb25NYW5hZ2VyLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXJ2aWNlTG9jYXRvckZhY3RvcnkgZmFjdG9yeSA9IFNlcnZpY2VMb2NhdG9yRmFjdG9yeS5nZXRJbnN0YW5jZSgpOworCisgICAgcHJpdmF0ZSBTZXJ2aWNlTG9jYXRvciBsb2NhdG9yOworCisgICAgLyoqCisgICAgICogUHJpdmF0ZSBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJlbnQgcGFyZW50IG9mIHR5cGUge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyfSBvciB7QGxpbmsgU2VydmljZUxvY2F0b3J9LgorICAgICAqLworICAgIEFic3RyYWN0SGsySW5qZWN0aW9uTWFuYWdlcihPYmplY3QgcGFyZW50KSB7CisgICAgICAgIFNlcnZpY2VMb2NhdG9yIHBhcmVudExvY2F0b3IgPSByZXNvbHZlU2VydmljZUxvY2F0b3JQYXJlbnQocGFyZW50KTsKKyAgICAgICAgdGhpcy5sb2NhdG9yID0gY3JlYXRlTG9jYXRvcihwYXJlbnRMb2NhdG9yKTsKKworICAgICAgICAvLyBSZWdpc3RlciBhbGwgY29tcG9uZW50cyBuZWVkZWQgZm9yIHByb3BlciBISzIgbG9jYXRvciBib290c3RyYXAKKyAgICAgICAgU2VydmljZUxvY2F0b3JVdGlsaXRpZXMuYmluZChsb2NhdG9yLCBuZXcgSGsyQm9vdHN0cmFwQmluZGVyKGxvY2F0b3IpKTsKKworICAgICAgICB0aGlzLmxvY2F0b3Iuc2V0RGVmYXVsdENsYXNzQW5hbHl6ZXJOYW1lKEplcnNleUNsYXNzQW5hbHl6ZXIuTkFNRSk7CisKKyAgICAgICAgLy8gY2xlYXIgSEsyIGNhY2hlcworICAgICAgICBTZXJ2aWNlTG9jYXRvclJ1bnRpbWVCZWFuIHNlcnZpY2VMb2NhdG9yUnVudGltZUJlYW4gPSBsb2NhdG9yLmdldFNlcnZpY2UoU2VydmljZUxvY2F0b3JSdW50aW1lQmVhbi5jbGFzcyk7CisgICAgICAgIGlmIChzZXJ2aWNlTG9jYXRvclJ1bnRpbWVCZWFuICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChMT0dHRVIuaXNMb2dnYWJsZShMZXZlbC5GSU5FKSkgeworICAgICAgICAgICAgICAgIExPR0dFUi5maW5lKExvY2FsaXphdGlvbk1lc3NhZ2VzLkhLXzJfQ0xFQVJJTkdfQ0FDSEUoc2VydmljZUxvY2F0b3JSdW50aW1lQmVhbi5nZXRTZXJ2aWNlQ2FjaGVTaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlTG9jYXRvclJ1bnRpbWVCZWFuLmdldFJlZmxlY3Rpb25DYWNoZVNpemUoKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2VydmljZUxvY2F0b3JSdW50aW1lQmVhbi5jbGVhclJlZmxlY3Rpb25DYWNoZSgpOworICAgICAgICAgICAgc2VydmljZUxvY2F0b3JSdW50aW1lQmVhbi5jbGVhclNlcnZpY2VDYWNoZSgpOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBTZXJ2aWNlTG9jYXRvcn0gaW5zdGFuY2UgZnJvbSBzdGF0aWMge0BsaW5rIFNlcnZpY2VMb2NhdG9yRmFjdG9yeX0gYW5kIGFkZHMgdGhlIHByb3ZpZGVkIHBhcmVudAorICAgICAqIGxvY2F0b3IgaWYgdGhlIGluc3RhbmNlIGlzIG5vdCBudWxsLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudExvY2F0b3IgcGFyZW50IGxvY2F0b3IsIGNhbiBiZSB7QGNvZGUgbnVsbH0uCisgICAgICogQHJldHVybiBuZXcgaW5zdGFuY2Ugb2YgaW5qZWN0aW9uIG1hbmFnZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgU2VydmljZUxvY2F0b3IgY3JlYXRlTG9jYXRvcihTZXJ2aWNlTG9jYXRvciBwYXJlbnRMb2NhdG9yKSB7CisgICAgICAgIFNlcnZpY2VMb2NhdG9yIHJlc3VsdCA9IGZhY3RvcnkuY3JlYXRlKG51bGwsIHBhcmVudExvY2F0b3IsIG51bGwsIFNlcnZpY2VMb2NhdG9yRmFjdG9yeS5DcmVhdGVQb2xpY3kuREVTVFJPWSk7CisgICAgICAgIHJlc3VsdC5zZXROZXV0cmFsQ29udGV4dENsYXNzTG9hZGVyKGZhbHNlKTsKKyAgICAgICAgU2VydmljZUxvY2F0b3JVdGlsaXRpZXMuZW5hYmxlUGVyVGhyZWFkU2NvcGUocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTZXJ2aWNlTG9jYXRvciByZXNvbHZlU2VydmljZUxvY2F0b3JQYXJlbnQoT2JqZWN0IHBhcmVudCkgeworICAgICAgICBhc3NlcnRQYXJlbnRMb2NhdG9yVHlwZShwYXJlbnQpOworCisgICAgICAgIFNlcnZpY2VMb2NhdG9yIHBhcmVudExvY2F0b3IgPSBudWxsOworICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChwYXJlbnQgaW5zdGFuY2VvZiBTZXJ2aWNlTG9jYXRvcikgeworICAgICAgICAgICAgICAgIHBhcmVudExvY2F0b3IgPSAoU2VydmljZUxvY2F0b3IpIHBhcmVudDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyZW50IGluc3RhbmNlb2YgQWJzdHJhY3RIazJJbmplY3Rpb25NYW5hZ2VyKSB7CisgICAgICAgICAgICAgICAgcGFyZW50TG9jYXRvciA9ICgoQWJzdHJhY3RIazJJbmplY3Rpb25NYW5hZ2VyKSBwYXJlbnQpLmdldFNlcnZpY2VMb2NhdG9yKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhcmVudExvY2F0b3I7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIHRoZSBwYXJlbnQgaXMgbnVsbCB0aGVuIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFNlcnZpY2VMb2NhdG9yfSBvciB7QGxpbmsgSW5qZWN0aW9uTWFuYWdlcn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50IG9iamVjdCByZXByZXNlbnRlZCBieSB7QGNvZGUgU2VydmljZUxvY2F0b3J9IG9yIHtAY29kZSBISzJJbmplY3Rpb25NYW5hZ2VyfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydFBhcmVudExvY2F0b3JUeXBlKE9iamVjdCBwYXJlbnQpIHsKKyAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsICYmICEocGFyZW50IGluc3RhbmNlb2YgU2VydmljZUxvY2F0b3IgfHwgcGFyZW50IGluc3RhbmNlb2YgQWJzdHJhY3RIazJJbmplY3Rpb25NYW5hZ2VyKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgTG9jYWxpemF0aW9uTWVzc2FnZXMuSEtfMl9VTktOT1dOX1BBUkVOVF9JTkpFQ1RJT05fTUFOQUdFUihwYXJlbnQuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBTZXJ2aWNlTG9jYXRvciBnZXRTZXJ2aWNlTG9jYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIGxvY2F0b3I7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNSZWdpc3RyYWJsZShDbGFzczw/PiBjbGF6eikgeworICAgICAgICByZXR1cm4gb3JnLmdsYXNzZmlzaC5oazIudXRpbGl0aWVzLkJpbmRlci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNsYXp6KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgPFQ+IExpc3Q8U2VydmljZUhvbGRlcjxUPj4gZ2V0QWxsU2VydmljZUhvbGRlcnMoQ2xhc3M8VD4gY29udHJhY3QsIEFubm90YXRpb24uLi4gcXVhbGlmaWVycykgeworICAgICAgICByZXR1cm4gZ2V0U2VydmljZUxvY2F0b3IoKS5nZXRBbGxTZXJ2aWNlSGFuZGxlcyhjb250cmFjdCwgcXVhbGlmaWVycykuc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAubWFwKHNoIC0+IG5ldyBTZXJ2aWNlSG9sZGVySW1wbDw+KAorICAgICAgICAgICAgICAgICAgICAgICAgc2guZ2V0U2VydmljZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgKENsYXNzPFQ+KSBzaC5nZXRBY3RpdmVEZXNjcmlwdG9yKCkuZ2V0SW1wbGVtZW50YXRpb25DbGFzcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgc2guZ2V0QWN0aXZlRGVzY3JpcHRvcigpLmdldENvbnRyYWN0VHlwZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoLmdldEFjdGl2ZURlc2NyaXB0b3IoKS5nZXRSYW5raW5nKCkpKQorICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gVCBnZXRJbnN0YW5jZShDbGFzczxUPiBjbGF6eiwgQW5ub3RhdGlvbi4uLiBhbm5vdGF0aW9ucykgeworICAgICAgICByZXR1cm4gZ2V0U2VydmljZUxvY2F0b3IoKS5nZXRTZXJ2aWNlKGNsYXp6LCBhbm5vdGF0aW9ucyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxUPiBUIGdldEluc3RhbmNlKFR5cGUgY2xhenopIHsKKyAgICAgICAgcmV0dXJuIGdldFNlcnZpY2VMb2NhdG9yKCkuZ2V0U2VydmljZShjbGF6eik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdCBnZXRJbnN0YW5jZShGb3JlaWduRGVzY3JpcHRvciBmb3JlaWduRGVzY3JpcHRvcikgeworICAgICAgICByZXR1cm4gZ2V0U2VydmljZUxvY2F0b3IoKS5nZXRTZXJ2aWNlSGFuZGxlKChBY3RpdmVEZXNjcmlwdG9yPD8+KSBmb3JlaWduRGVzY3JpcHRvci5nZXQoKSkuZ2V0U2VydmljZSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gVCBnZXRJbnN0YW5jZShDbGFzczxUPiBjbGF6eikgeworICAgICAgICByZXR1cm4gZ2V0U2VydmljZUxvY2F0b3IoKS5nZXRTZXJ2aWNlKGNsYXp6KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFQ+IFQgZ2V0SW5zdGFuY2UoQ2xhc3M8VD4gY2xhenosIFN0cmluZyBjbGFzc0FuYWx5emVyKSB7CisgICAgICAgIHJldHVybiBnZXRTZXJ2aWNlTG9jYXRvcigpLmdldFNlcnZpY2UoY2xhenosIGNsYXNzQW5hbHl6ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gTGlzdDxUPiBnZXRBbGxJbnN0YW5jZXMoVHlwZSBjbGF6eikgeworICAgICAgICByZXR1cm4gZ2V0U2VydmljZUxvY2F0b3IoKS5nZXRBbGxTZXJ2aWNlcyhjbGF6eik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcHJlRGVzdHJveShPYmplY3QgcHJlRGVzdHJveU1lKSB7CisgICAgICAgIGdldFNlcnZpY2VMb2NhdG9yKCkucHJlRGVzdHJveShwcmVEZXN0cm95TWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNodXRkb3duKCkgeworICAgICAgICBpZiAoZmFjdG9yeS5maW5kKGdldFNlcnZpY2VMb2NhdG9yKCkuZ2V0TmFtZSgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICBmYWN0b3J5LmRlc3Ryb3koZ2V0U2VydmljZUxvY2F0b3IoKS5nZXROYW1lKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ2V0U2VydmljZUxvY2F0b3IoKS5zaHV0ZG93bigpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxVPiBVIGNyZWF0ZUFuZEluaXRpYWxpemUoQ2xhc3M8VT4gY2xhenopIHsKKyAgICAgICAgcmV0dXJuIGdldFNlcnZpY2VMb2NhdG9yKCkuY3JlYXRlQW5kSW5pdGlhbGl6ZShjbGF6eik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEZvcmVpZ25EZXNjcmlwdG9yIGNyZWF0ZUZvcmVpZ25EZXNjcmlwdG9yKEJpbmRpbmcgYmluZGluZykgeworICAgICAgICBGb3JlaWduRGVzY3JpcHRvciBmb3JlaWduRGVzY3JpcHRvciA9IGNyZWF0ZUFuZFRyYW5zbGF0ZUZvcmVpZ25EZXNjcmlwdG9yKGJpbmRpbmcpOworICAgICAgICBBY3RpdmVEZXNjcmlwdG9yPE9iamVjdD4gYWN0aXZlRGVzY3JpcHRvciA9IFNlcnZpY2VMb2NhdG9yVXRpbGl0aWVzCisgICAgICAgICAgICAgICAgLmFkZE9uZURlc2NyaXB0b3IoZ2V0U2VydmljZUxvY2F0b3IoKSwgKERlc2NyaXB0b3IpIGZvcmVpZ25EZXNjcmlwdG9yLmdldCgpLCBmYWxzZSk7CisgICAgICAgIHJldHVybiBGb3JlaWduRGVzY3JpcHRvci53cmFwKGFjdGl2ZURlc2NyaXB0b3IsIGFjdGl2ZURlc2NyaXB0b3I6OmRpc3Bvc2UpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGluamVjdChPYmplY3QgaW5qZWN0TWUpIHsKKyAgICAgICAgZ2V0U2VydmljZUxvY2F0b3IoKS5pbmplY3QoaW5qZWN0TWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGluamVjdChPYmplY3QgaW5qZWN0TWUsIFN0cmluZyBjbGFzc0FuYWx5emVyKSB7CisgICAgICAgIGdldFNlcnZpY2VMb2NhdG9yKCkuaW5qZWN0KGluamVjdE1lLCBjbGFzc0FuYWx5emVyKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwcml2YXRlIEZvcmVpZ25EZXNjcmlwdG9yIGNyZWF0ZUFuZFRyYW5zbGF0ZUZvcmVpZ25EZXNjcmlwdG9yKEJpbmRpbmcgYmluZGluZykgeworICAgICAgICBBY3RpdmVEZXNjcmlwdG9yIGFjdGl2ZURlc2NyaXB0b3I7CisgICAgICAgIGlmIChDbGFzc0JpbmRpbmcuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShiaW5kaW5nLmdldENsYXNzKCkpKSB7CisgICAgICAgICAgICBhY3RpdmVEZXNjcmlwdG9yID0gSGsySGVscGVyLnRyYW5zbGF0ZVRvQWN0aXZlRGVzY3JpcHRvcigoQ2xhc3NCaW5kaW5nPD8+KSBiaW5kaW5nKTsKKyAgICAgICAgfSBlbHNlIGlmIChJbnN0YW5jZUJpbmRpbmcuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShiaW5kaW5nLmdldENsYXNzKCkpKSB7CisgICAgICAgICAgICBhY3RpdmVEZXNjcmlwdG9yID0gSGsySGVscGVyLnRyYW5zbGF0ZVRvQWN0aXZlRGVzY3JpcHRvcigoSW5zdGFuY2VCaW5kaW5nPD8+KSBiaW5kaW5nKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzCisgICAgICAgICAgICAgICAgICAgIC5VTktOT1dOX0RFU0NSSVBUT1JfVFlQRShiaW5kaW5nLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gRm9yZWlnbkRlc2NyaXB0b3Iud3JhcChhY3RpdmVEZXNjcmlwdG9yLCBhY3RpdmVEZXNjcmlwdG9yOjpkaXNwb3NlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9pbmplY3QvaGsyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2hrMi9Db250ZXh0SW5qZWN0aW9uUmVzb2x2ZXJJbXBsLmphdmEgYi9pbmplY3QvaGsyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2hrMi9Db250ZXh0SW5qZWN0aW9uUmVzb2x2ZXJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmYzYjJiZAotLS0gL2Rldi9udWxsCisrKyBiL2luamVjdC9oazIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvaGsyL0NvbnRleHRJbmplY3Rpb25SZXNvbHZlckltcGwuamF2YQpAQCAtMCwwICsxLDI2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuaGsyOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5Db250ZXh0SW5qZWN0aW9uUmVzb2x2ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkZvcmVpZ25SZXF1ZXN0U2NvcGVCcmlkZ2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5SZWZsZWN0aW9uSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5DYWNoZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uTGF6eVZhbHVlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5WYWx1ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uVmFsdWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWwuUmVxdWVzdFNjb3BlZDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLmFwaS5BY3RpdmVEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLmFwaS5GYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLmFwaS5JbmplY3RlZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi5hcGkuSW5qZWN0aW9uUmVzb2x2ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIuYXBpLlNlcnZpY2VIYW5kbGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIuYXBpLlNlcnZpY2VMb2NhdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLmFwaS5UeXBlTGl0ZXJhbDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi51dGlsaXRpZXMuQWJzdHJhY3RBY3RpdmVEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLnV0aWxpdGllcy5CdWlsZGVySGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLnV0aWxpdGllcy5JbmplY3RlZUltcGw7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIudXRpbGl0aWVzLmJpbmRpbmcuQWJzdHJhY3RCaW5kZXI7CisKKy8qKgorICogSW5qZWN0aW9uIHJlc29sdmVyIGZvciB7QGxpbmsgQ29udGV4dCBAQ29udGV4dH0gaW5qZWN0aW9uIGFubm90YXRpb24uCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTaW5nbGV0b24KK3B1YmxpYyBjbGFzcyBDb250ZXh0SW5qZWN0aW9uUmVzb2x2ZXJJbXBsIGltcGxlbWVudHMgSW5qZWN0aW9uUmVzb2x2ZXI8Q29udGV4dD4sIENvbnRleHRJbmplY3Rpb25SZXNvbHZlciB7CisKKyAgICAvKioKKyAgICAgKiBDb250ZXh0IGluamVjdGlvbiByZXNvbHZlciBiaW5kZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCaW5kZXIgZXh0ZW5kcyBBYnN0cmFjdEJpbmRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIGJpbmQoQ29udGV4dEluamVjdGlvblJlc29sdmVySW1wbC5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgLnRvKG5ldyBUeXBlTGl0ZXJhbDxJbmplY3Rpb25SZXNvbHZlcjxDb250ZXh0Pj4oKSB7fSkKKyAgICAgICAgICAgICAgICAgICAgLnRvKG5ldyBUeXBlTGl0ZXJhbDxvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uUmVzb2x2ZXI8Q29udGV4dD4+KCkge30pCisgICAgICAgICAgICAgICAgICAgIC50byhDb250ZXh0SW5qZWN0aW9uUmVzb2x2ZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIC5pbihTaW5nbGV0b24uY2xhc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgQEluamVjdAorICAgIHByaXZhdGUgU2VydmljZUxvY2F0b3Igc2VydmljZUxvY2F0b3I7CisKKyAgICBwcml2YXRlIGZpbmFsIENhY2hlPENhY2hlS2V5LCBBY3RpdmVEZXNjcmlwdG9yPD8+PiBkZXNjcmlwdG9yQ2FjaGUKKyAgICAgICAgICAgID0gbmV3IENhY2hlPD4oY2FjaGVLZXkgLT4gc2VydmljZUxvY2F0b3IuZ2V0SW5qZWN0ZWVEZXNjcmlwdG9yKGNhY2hlS2V5LmluamVjdGVlKSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IHJlc29sdmUoSW5qZWN0ZWUgaW5qZWN0ZWUsIFNlcnZpY2VIYW5kbGU8Pz4gcm9vdCkgeworICAgICAgICBUeXBlIHJlcXVpcmVkVHlwZSA9IGluamVjdGVlLmdldFJlcXVpcmVkVHlwZSgpOworICAgICAgICBib29sZWFuIGlzSGsyRmFjdG9yeSA9IFJlZmxlY3Rpb25IZWxwZXIuaXNTdWJDbGFzc09mKHJlcXVpcmVkVHlwZSwgRmFjdG9yeS5jbGFzcyk7CisgICAgICAgIEluamVjdGVlIG5ld0luamVjdGVlOworCisgICAgICAgIGlmIChpc0hrMkZhY3RvcnkpIHsKKyAgICAgICAgICAgIG5ld0luamVjdGVlID0gZ2V0RmFjdG9yeUluamVjdGVlKGluamVjdGVlLCBSZWZsZWN0aW9uSGVscGVyLmdldFR5cGVBcmd1bWVudChyZXF1aXJlZFR5cGUsIDApKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5ld0luamVjdGVlID0gZm9yZWlnblJlcXVlc3RTY29wZWRJbmplY3RlZUNhY2hlLmFwcGx5KG5ldyBDYWNoZUtleShpbmplY3RlZSkpOworICAgICAgICB9CisKKyAgICAgICAgQWN0aXZlRGVzY3JpcHRvcjw/PiBhZCA9IGRlc2NyaXB0b3JDYWNoZS5hcHBseShuZXcgQ2FjaGVLZXkobmV3SW5qZWN0ZWUpKTsKKworICAgICAgICBpZiAoYWQgIT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgU2VydmljZUhhbmRsZSBoYW5kbGUgPSBzZXJ2aWNlTG9jYXRvci5nZXRTZXJ2aWNlSGFuZGxlKGFkLCBuZXdJbmplY3RlZSk7CisKKyAgICAgICAgICAgIGlmIChpc0hrMkZhY3RvcnkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYXNGYWN0b3J5KGhhbmRsZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGUuZ2V0U2VydmljZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIEplcnNleSBJbmplY3Rpb24gUmVzb2x2ZXIgbWV0aG9kIHRoYXQganVzdCBwb3B1bGF0ZSBISzIgaW5qZWN0ZWUgb2JqZWN0IGFuZCBkZWxlZ2F0ZXMgdGhlIHByb2Nlc3NpbmcgdG8gSEsyIEluamVjdGlvbgorICAgICAqIFJlc29sdmVyLgorICAgICAqCisgICAgICogQHBhcmFtIGluamVjdGVlIFRoZSBpbmplY3Rpb24gcG9pbnQgdGhpcyB2YWx1ZSBpcyBiZWluZyBpbmplY3RlZCBpbnRvCisgICAgICogQHJldHVybiByZXN1bHQgb2YgdGhlIGluamVjdGlvbiBwcm9jZXNzaW5nLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgcmVzb2x2ZShvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0ZWUgaW5qZWN0ZWUpIHsKKyAgICAgICAgSW5qZWN0ZWVJbXBsIGhrMmluamVjdGVlID0gdG9JbmplY3RlZUltcGwoaW5qZWN0ZWUpOworCisgICAgICAgIC8vIERlbGVnYXRlIHRoZSBjYWxsIHRvIEhLMiBSZXNvbHZlciwgU2VydmljZSBIYW5kbGUgaXMgbm90IG5lZWQgaW4gdGhlIGRlbGVnYXRlZCBwcm9jZXNzaW5nLgorICAgICAgICByZXR1cm4gcmVzb2x2ZShoazJpbmplY3RlZSwgbnVsbCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgSW5qZWN0ZWVJbXBsIHRvSW5qZWN0ZWVJbXBsKG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3RlZSBpbmplY3RlZSkgeworICAgICAgICBJbmplY3RlZUltcGwgaGsyaW5qZWN0ZWUgPSBuZXcgSW5qZWN0ZWVJbXBsKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0SW5qZWN0ZWVDbGFzcygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5qZWN0ZWUuZ2V0SW5qZWN0ZWVDbGFzcygpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBoazJpbmplY3RlZS5zZXRSZXF1aXJlZFR5cGUoaW5qZWN0ZWUuZ2V0UmVxdWlyZWRUeXBlKCkpOworICAgICAgICBoazJpbmplY3RlZS5zZXRSZXF1aXJlZFF1YWxpZmllcnMoaW5qZWN0ZWUuZ2V0UmVxdWlyZWRRdWFsaWZpZXJzKCkpOworICAgICAgICBoazJpbmplY3RlZS5zZXRQYXJlbnQoaW5qZWN0ZWUuZ2V0UGFyZW50KCkpOworICAgICAgICBpZiAoaW5qZWN0ZWUuZ2V0SW5qZWN0ZWVEZXNjcmlwdG9yKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgaGsyaW5qZWN0ZWUuc2V0SW5qZWN0ZWVEZXNjcmlwdG9yKChBY3RpdmVEZXNjcmlwdG9yPD8+KSBpbmplY3RlZS5nZXRJbmplY3RlZURlc2NyaXB0b3IoKS5nZXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGhrMmluamVjdGVlOworICAgIH0KKworICAgIHByaXZhdGUgRmFjdG9yeSBhc0ZhY3RvcnkoZmluYWwgU2VydmljZUhhbmRsZSBoYW5kbGUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBGYWN0b3J5KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IHByb3ZpZGUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZS5nZXRTZXJ2aWNlKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZShmaW5hbCBPYmplY3QgaW5zdGFuY2UpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBwcml2YXRlIEluamVjdGVlIGdldEZhY3RvcnlJbmplY3RlZShmaW5hbCBJbmplY3RlZSBpbmplY3RlZSwgZmluYWwgVHlwZSByZXF1aXJlZFR5cGUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXF1aXJlZFR5cGVPdmVycmlkaW5nSW5qZWN0ZWUoaW5qZWN0ZWUsIHJlcXVpcmVkVHlwZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVxdWlyZWRUeXBlT3ZlcnJpZGluZ0luamVjdGVlIGV4dGVuZHMgSW5qZWN0ZWVJbXBsIHsKKyAgICAgICAgcHJpdmF0ZSBSZXF1aXJlZFR5cGVPdmVycmlkaW5nSW5qZWN0ZWUoZmluYWwgSW5qZWN0ZWUgaW5qZWN0ZWUsIGZpbmFsIFR5cGUgcmVxdWlyZWRUeXBlKSB7CisgICAgICAgICAgICBzdXBlcihpbmplY3RlZSk7CisgICAgICAgICAgICBzZXRSZXF1aXJlZFR5cGUocmVxdWlyZWRUeXBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIERlc2NyaXB0b3JPdmVycmlkaW5nSW5qZWN0ZWUgZXh0ZW5kcyBJbmplY3RlZUltcGwgeworICAgICAgICBwcml2YXRlIERlc2NyaXB0b3JPdmVycmlkaW5nSW5qZWN0ZWUoZmluYWwgSW5qZWN0ZWUgaW5qZWN0ZWUsIGZpbmFsIEFjdGl2ZURlc2NyaXB0b3IgZGVzY3JpcHRvcikgeworICAgICAgICAgICAgc3VwZXIoaW5qZWN0ZWUpOworICAgICAgICAgICAgc2V0SW5qZWN0ZWVEZXNjcmlwdG9yKGRlc2NyaXB0b3IpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNDb25zdHJ1Y3RvclBhcmFtZXRlckluZGljYXRvcigpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNNZXRob2RQYXJhbWV0ZXJJbmRpY2F0b3IoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2xhc3M8Q29udGV4dD4gZ2V0QW5ub3RhdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIENvbnRleHQuY2xhc3M7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBDYWNoZTxDYWNoZUtleSwgSW5qZWN0ZWU+IGZvcmVpZ25SZXF1ZXN0U2NvcGVkSW5qZWN0ZWVDYWNoZSA9IG5ldyBDYWNoZTw+KG5ldyBGdW5jdGlvbjxDYWNoZUtleSwgSW5qZWN0ZWU+KCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEluamVjdGVlIGFwcGx5KENhY2hlS2V5IGNhY2hlS2V5KSB7CisgICAgICAgICAgICBJbmplY3RlZSBpbmplY3RlZSA9IGNhY2hlS2V5LmdldEluamVjdGVlKCk7CisgICAgICAgICAgICBpZiAoaW5qZWN0ZWUuZ2V0UGFyZW50KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChGaWVsZC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGluamVjdGVlLmdldFBhcmVudCgpLmdldENsYXNzKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIEZpZWxkIGYgPSAoRmllbGQpIGluamVjdGVlLmdldFBhcmVudCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoZm9yZWlnblJlcXVlc3RTY29wZWRDb21wb25lbnRzLmdldCgpLmNvbnRhaW5zKGYuZ2V0RGVjbGFyaW5nQ2xhc3MoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IGNsYXp6ID0gZi5nZXRUeXBlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmljZUxvY2F0b3IuZ2V0U2VydmljZUhhbmRsZShjbGF6eikuZ2V0QWN0aXZlRGVzY3JpcHRvcigpLmdldFNjb3BlQW5ub3RhdGlvbigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IFJlcXVlc3RTY29wZWQuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBYnN0cmFjdEFjdGl2ZURlc2NyaXB0b3I8T2JqZWN0PiBkZXNjcmlwdG9yID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWxkZXJIZWxwZXIuYWN0aXZlTGluayhjbGF6eikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvKGNsYXp6KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW4oUmVxdWVzdFNjb3BlZC5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEZXNjcmlwdG9yT3ZlcnJpZGluZ0luamVjdGVlKGluamVjdGVlLCBkZXNjcmlwdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBpbmplY3RlZTsKKyAgICAgICAgfQorICAgIH0pOworCisgICAgcHJpdmF0ZSBMYXp5VmFsdWU8U2V0PENsYXNzPD8+Pj4gZm9yZWlnblJlcXVlc3RTY29wZWRDb21wb25lbnRzID0gVmFsdWVzLmxhenkoCisgICAgICAgICAgICAoVmFsdWU8U2V0PENsYXNzPD8+Pj4pIHRoaXM6OmdldEZvcmVpZ25SZXF1ZXN0U2NvcGVkQ29tcG9uZW50cyk7CisKKyAgICBwcml2YXRlIFNldDxDbGFzczw/Pj4gZ2V0Rm9yZWlnblJlcXVlc3RTY29wZWRDb21wb25lbnRzKCkgeworICAgICAgICBmaW5hbCBMaXN0PEZvcmVpZ25SZXF1ZXN0U2NvcGVCcmlkZ2U+IHNjb3BlQnJpZGdlcyA9IHNlcnZpY2VMb2NhdG9yLmdldEFsbFNlcnZpY2VzKEZvcmVpZ25SZXF1ZXN0U2NvcGVCcmlkZ2UuY2xhc3MpOworICAgICAgICBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IHJlc3VsdCA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgZm9yIChGb3JlaWduUmVxdWVzdFNjb3BlQnJpZGdlIGJyaWRnZSA6IHNjb3BlQnJpZGdlcykgeworICAgICAgICAgICAgZmluYWwgU2V0PENsYXNzPD8+PiByZXF1ZXN0U2NvcGVkQ29tcG9uZW50cyA9IGJyaWRnZS5nZXRSZXF1ZXN0U2NvcGVkQ29tcG9uZW50cygpOworICAgICAgICAgICAgaWYgKHJlcXVlc3RTY29wZWRDb21wb25lbnRzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQuYWRkQWxsKHJlcXVlc3RTY29wZWRDb21wb25lbnRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEtleSBkZWRpY2F0ZWQgZm9yIGludGVybmFsIGNhY2hlIG1lY2hhbmlzbSBiZWNhdXNlIHR3byBkaWZmZXJlbnQge0BsaW5rIEluamVjdGVlfSBIazIgaW1wbGVtZW50YXRpb25zIGNvbWVzIGZyb20KKyAgICAgKiBKZXJzZXkgc2lkZSBhbmQgSEsyIHNpZGUgaW5qZWN0aW9uIHJlc29sdmVyLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENhY2hlS2V5IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIEluamVjdGVlIGluamVjdGVlOworCisgICAgICAgIHByaXZhdGUgZmluYWwgaW50IGhhc2g7CisKKyAgICAgICAgcHJpdmF0ZSBDYWNoZUtleShJbmplY3RlZSBpbmplY3RlZSkgeworICAgICAgICAgICAgdGhpcy5pbmplY3RlZSA9IGluamVjdGVlOworCisgICAgICAgICAgICB0aGlzLmhhc2ggPSBPYmplY3RzLmhhc2goaW5qZWN0ZWUuZ2V0SW5qZWN0ZWVDbGFzcygpLAorICAgICAgICAgICAgICAgICAgICBpbmplY3RlZS5nZXRJbmplY3RlZURlc2NyaXB0b3IoKSwKKyAgICAgICAgICAgICAgICAgICAgaW5qZWN0ZWUuZ2V0UGFyZW50KCksCisgICAgICAgICAgICAgICAgICAgIGluamVjdGVlLmdldFJlcXVpcmVkUXVhbGlmaWVycygpLAorICAgICAgICAgICAgICAgICAgICBpbmplY3RlZS5nZXRSZXF1aXJlZFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgaW5qZWN0ZWUuZ2V0UG9zaXRpb24oKSk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEluamVjdGVlIGdldEluamVjdGVlKCkgeworICAgICAgICAgICAgcmV0dXJuIGluamVjdGVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICAgICAgaWYgKHRoaXMgPT0gbykgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIENhY2hlS2V5KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENhY2hlS2V5IGNhY2hlS2V5ID0gKENhY2hlS2V5KSBvOworICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFzaCA9PSBjYWNoZUtleS5oYXNoOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gaGFzaDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2luamVjdC9oazIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvaGsyL0RlbGF5ZWRIazJJbmplY3Rpb25NYW5hZ2VyLmphdmEgYi9pbmplY3QvaGsyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2hrMi9EZWxheWVkSGsySW5qZWN0aW9uTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmOTgxZDIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmplY3QvaGsyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2hrMi9EZWxheWVkSGsySW5qZWN0aW9uTWFuYWdlci5qYXZhCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5oazI7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5BYnN0cmFjdEJpbmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5CaW5kaW5nOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5CaW5kaW5nczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5zdGFuY2VCaW5kaW5nOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIuYXBpLlNlcnZpY2VMb2NhdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLnV0aWxpdGllcy5TZXJ2aWNlTG9jYXRvclV0aWxpdGllczsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXJ9IHRoYXQgaXMgYWJsZSB0byBkZWxheSBzZXJ2aWNlJ3MgcmVnaXN0cmF0aW9uCisgKiBhbmQgaW5qZWN0aW9uIHRvIHtAbGluayAjY29tcGxldGVSZWdpc3RyYXRpb24oKX0gcGhhc2UuIER1cmluZyB0aGUgSmVyc2V5IGJvb3RzdHJhcCBqdXN0IGtlZXAgdGhlIGJpbmRpbmdzIGFuZCBvdGhlcgorICogb3BlcmF0aW9uIGZvciBhIGxhdGVyIHVzZS4KKyAqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworcHVibGljIGNsYXNzIERlbGF5ZWRIazJJbmplY3Rpb25NYW5hZ2VyIGV4dGVuZHMgQWJzdHJhY3RIazJJbmplY3Rpb25NYW5hZ2VyIHsKKworICAgIC8vIEtlZXBzIGFsbCBiaW5kZXJzIGFuZCBiaW5kaW5ncyBhZGRlZCB0byB0aGUgSW5qZWN0aW9uTWFuYWdlciBkdXJpbmcgdGhlIGJvb3RzdHJhcC4KKyAgICBwcml2YXRlIGZpbmFsIEFic3RyYWN0QmluZGVyIGJpbmRpbmdzID0gbmV3IEFic3RyYWN0QmluZGVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICB9CisgICAgfTsKKworICAgIC8vIEtlZXBzIERJIHByb3ZpZGVyIHNwZWNpZmljIG9iamVjdCBmb3IgcmVnaXN0cmF0aW9uLgorICAgIHByaXZhdGUgZmluYWwgTGlzdDxvcmcuZ2xhc3NmaXNoLmhrMi51dGlsaXRpZXMuQmluZGVyPiBwcm92aWRlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgIHByaXZhdGUgYm9vbGVhbiBjb21wbGV0ZWQgPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIHdpdGggcGFyZW50LgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudCBwYXJlbnQgb2YgdHlwZSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXJ9IG9yIHtAbGluayBTZXJ2aWNlTG9jYXRvcn0uCisgICAgICovCisgICAgRGVsYXllZEhrMkluamVjdGlvbk1hbmFnZXIoT2JqZWN0IHBhcmVudCkgeworICAgICAgICBzdXBlcihwYXJlbnQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyKEJpbmRpbmcgYmluZGluZykgeworICAgICAgICAvLyBUT0RPOiBSZW1vdmUgdGhpcyB0ZW1wb3JhcnkgaGFjayBhbmQgcmVwbGFjZSBpdCB1c2luZyBkaWZmZXJlbnQgU2luZ2xldG9uIFN1YlJlc291cmNlL0VuaGFuY2VkU3ViUmVzb3VyY2UgcmVnaXN0cmF0aW9uLgorICAgICAgICAvLyBBZnRlciB0aGUgY29tcGxldGVkIHJlZ2lzdHJhdGlvbiBpcyBhYmxlIHRvIHJlZ2lzdGVyIENsYXNzQmluZGluZyBTaW5nbGV0b24gYW5kIEluc3RhbmNlQmluZGluZy4KKyAgICAgICAgLy8gVW5mb3J0dW5hdGVseSwgdGhlcmUgaXMgbm8gb3RoZXIgc2ltcGxlIHdheSBob3cgdG8gcmVjb2duaXplIGFuZCBhbGxvdyBvbmx5IFN1YlJlc291cmNlIHJlZ2lzdHJhdGlvbiBhZnRlciB0aGUKKyAgICAgICAgLy8gY29tcGxldGVkIHJlZ2lzdHJhdGlvbi4KKyAgICAgICAgaWYgKGNvbXBsZXRlZCAmJiAoYmluZGluZy5nZXRTY29wZSgpID09IFNpbmdsZXRvbi5jbGFzcyB8fCBiaW5kaW5nIGluc3RhbmNlb2YgSW5zdGFuY2VCaW5kaW5nKSkgeworICAgICAgICAgICAgSGsySGVscGVyLmJpbmQoZ2V0U2VydmljZUxvY2F0b3IoKSwgYmluZGluZyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBiaW5kaW5ncy5iaW5kKGJpbmRpbmcpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXIoSXRlcmFibGU8QmluZGluZz4gYmluZGluZ3MpIHsKKyAgICAgICAgZm9yIChCaW5kaW5nIGJpbmRpbmcgOiBiaW5kaW5ncykgeworICAgICAgICAgICAgdGhpcy5iaW5kaW5ncy5iaW5kKGJpbmRpbmcpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXIoQmluZGVyIGJpbmRlcikgeworICAgICAgICBmb3IgKEJpbmRpbmcgYmluZGluZyA6IEJpbmRpbmdzLmdldEJpbmRpbmdzKHRoaXMsIGJpbmRlcikpIHsKKyAgICAgICAgICAgIGJpbmRpbmdzLmJpbmQoYmluZGluZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlcihPYmplY3QgcHJvdmlkZXIpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgICAgICBpZiAoaXNSZWdpc3RyYWJsZShwcm92aWRlci5nZXRDbGFzcygpKSkgeworICAgICAgICAgICAgcHJvdmlkZXJzLmFkZCgob3JnLmdsYXNzZmlzaC5oazIudXRpbGl0aWVzLkJpbmRlcikgcHJvdmlkZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5IS18yX1BST1ZJREVSX05PVF9SRUdJU1RSQUJMRShwcm92aWRlci5nZXRDbGFzcygpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjb21wbGV0ZVJlZ2lzdHJhdGlvbigpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgICAgICBIazJIZWxwZXIuYmluZCh0aGlzLCBiaW5kaW5ncyk7CisgICAgICAgIFNlcnZpY2VMb2NhdG9yVXRpbGl0aWVzLmJpbmQoZ2V0U2VydmljZUxvY2F0b3IoKSwgcHJvdmlkZXJzLnRvQXJyYXkobmV3IG9yZy5nbGFzc2Zpc2guaGsyLnV0aWxpdGllcy5CaW5kZXJbXXt9KSk7CisgICAgICAgIGNvbXBsZXRlZCA9IHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaW5qZWN0L2hrMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9oazIvSGsyQm9vdHN0cmFwQmluZGVyLmphdmEgYi9pbmplY3QvaGsyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2hrMi9IazJCb290c3RyYXBCaW5kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGI2ZTE2Ci0tLSAvZGV2L251bGwKKysrIGIvaW5qZWN0L2hrMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9oazIvSGsyQm9vdHN0cmFwQmluZGVyLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuaGsyOworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWwuUmVxdWVzdFNjb3BlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIuYXBpLlNlcnZpY2VMb2NhdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLnV0aWxpdGllcy5iaW5kaW5nLkFic3RyYWN0QmluZGVyOworCisvKioKKyAqIHtAbGluayBBYnN0cmFjdEJpbmRlcn0gdGhhdCByZWdpc3RlcnMgYWxsIGNvbXBvbmVudHMgbmVlZGVkIGZvciBhIHByb3BlciBib290c3RyYXAgb2YgSmVyc2V5IGJhc2VkIG9uIEhLMiBmcmFtZXdvcmsuCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK3B1YmxpYyBjbGFzcyBIazJCb290c3RyYXBCaW5kZXIgZXh0ZW5kcyBBYnN0cmFjdEJpbmRlciB7CisKKyAgICBwcml2YXRlIGZpbmFsIFNlcnZpY2VMb2NhdG9yIHNlcnZpY2VMb2NhdG9yOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgYm9vdHN0cmFwIHdoaWNoIGlzIHNwZWNpZmljIGZvciBISzIgbW9kdWxlIGFuZCBhdXRvbWF0aWNhbGx5IGluc3RhbGwge0Bjb2RlIGV4dGVybmFsQmluZGVyfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2aWNlTG9jYXRvciBISzIgc2VydmljZSBsb2NhdG9yLgorICAgICAqLworICAgIEhrMkJvb3RzdHJhcEJpbmRlcihTZXJ2aWNlTG9jYXRvciBzZXJ2aWNlTG9jYXRvcikgeworICAgICAgICB0aGlzLnNlcnZpY2VMb2NhdG9yID0gc2VydmljZUxvY2F0b3I7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICBpbnN0YWxsKAorICAgICAgICAgICAgICAgIC8vIEplcnNleS1saWtlIGNsYXNzIGFuYWx5emVyIHRoYXQgaXMgYWJsZSB0byBjaG9vc2UgdGhlIHJpZ2h0IHNlcnZpY2VzJyBjb25zdHJ1Y3Rvci4KKyAgICAgICAgICAgICAgICBuZXcgSmVyc2V5Q2xhc3NBbmFseXplci5CaW5kZXIoc2VydmljZUxvY2F0b3IpLAorICAgICAgICAgICAgICAgIC8vIEFjdGl2YXRlIHBvc3NpYmlsaXR5IHRvIHN0YXJ0IFJlcXVlc3QgU2NvcGUuCisgICAgICAgICAgICAgICAgbmV3IFJlcXVlc3RDb250ZXh0LkJpbmRlcigpLAorICAgICAgICAgICAgICAgIC8vIEFkZCBzdXBwb3J0IGZvciBDb250ZXh0IGFubm90YXRpb24uCisgICAgICAgICAgICAgICAgbmV3IENvbnRleHRJbmplY3Rpb25SZXNvbHZlckltcGwuQmluZGVyKCksCisgICAgICAgICAgICAgICAgLy8gSW1wcm92ZWQgSEsyIEVycm9yIHJlcG9ydGluZy4KKyAgICAgICAgICAgICAgICBuZXcgSmVyc2V5RXJyb3JTZXJ2aWNlLkJpbmRlcigpKTsKKworICAgICAgICAvLyBSZWdpc3RlciBSZXF1ZXN0IHNjb3BlIHdpdGggSEsyIGluc3RhbmNlLgorICAgICAgICBiaW5kKEhrMlJlcXVlc3RTY29wZS5jbGFzcykudG8oUmVxdWVzdFNjb3BlLmNsYXNzKS5pbihTaW5nbGV0b24uY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2luamVjdC9oazIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvaGsyL0hrMkhlbHBlci5qYXZhIGIvaW5qZWN0L2hrMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9oazIvSGsySGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY3MzFmNgotLS0gL2Rldi9udWxsCisrKyBiL2luamVjdC9oazIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvaGsyL0hrMkhlbHBlci5qYXZhCkBAIC0wLDAgKzEsNDAxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5oazI7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQ29uc3VtZXI7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkFsaWFzQmluZGluZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQmluZGluZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQmluZGluZ3M7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkNsYXNzQmluZGluZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuRGlzcG9zYWJsZVN1cHBsaWVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25SZXNvbHZlckJpbmRpbmc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0Lkluc3RhbmNlQmluZGluZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuUGVyTG9va3VwOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5QZXJUaHJlYWQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LlN1cHBsaWVyQ2xhc3NCaW5kaW5nOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5TdXBwbGllckluc3RhbmNlQmluZGluZzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLmFwaS5BY3RpdmVEZXNjcmlwdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLmFwaS5EeW5hbWljQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi5hcGkuRHluYW1pY0NvbmZpZ3VyYXRpb25TZXJ2aWNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLmFwaS5JbmplY3Rpb25SZXNvbHZlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi5hcGkuU2VydmljZUxvY2F0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIudXRpbGl0aWVzLkFic3RyYWN0QWN0aXZlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi51dGlsaXRpZXMuQWN0aXZlRGVzY3JpcHRvckJ1aWxkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIudXRpbGl0aWVzLkJpbmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi51dGlsaXRpZXMuQnVpbGRlckhlbHBlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi51dGlsaXRpZXMuU2VydmljZUxvY2F0b3JVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIudXRpbGl0aWVzLmJpbmRpbmcuQWJzdHJhY3RCaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIudXRpbGl0aWVzLmJpbmRpbmcuU2VydmljZUJpbmRpbmdCdWlsZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLnV0aWxpdGllcy5yZWZsZWN0aW9uLlBhcmFtZXRlcml6ZWRUeXBlSW1wbDsKKworLyoqCisgKiBUaGlzIGNsYXNzIGNvbnRhaW5zIHRoZSBjb252ZW5pZW50IG1ldGhvZHMgZm9yIHRyYW5zbGF0aW9uIGZyb20gamVyc2V5IGNsYXNzZXMgdG8gSEsyIGFuZCB2aXNhIHZlcnNhLCB0aGVuIGNvbnRhaW5zIG1ldGhvZHMKKyAqIGZvciBiaW5kaW5nIHN0cnVjdHVyZXMgc3VjaCBhcyB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkJpbmRlcn0gb3Ige0BsaW5rIEJpbmRpbmd9IHRvIGEgcHJvdmlkZWQgc2VydmljZQorICogbG9jYXRvci4KKyAqLworY2xhc3MgSGsySGVscGVyIHsKKworICAgIC8qKgorICAgICAqIEJpbmQgYSB0cmFuc2xhdGVkIEplcnNleS1saWtlIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQmluZGVyfSB0byBISzItbGlrZSB7QGxpbmsgQmluZGVyfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmplY3Rpb25NYW5hZ2VyIEhLMiBpbmplY3Rpb24gbWFuYWdlci4KKyAgICAgKiBAcGFyYW0gamVyc2V5QmluZGVyICAgICBKZXJzZXktbGlrZSBiaW5kZXIuCisgICAgICovCisgICAgc3RhdGljIHZvaWQgYmluZChBYnN0cmFjdEhrMkluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciwgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkJpbmRlciBqZXJzZXlCaW5kZXIpIHsKKyAgICAgICAgYmluZChpbmplY3Rpb25NYW5hZ2VyLmdldFNlcnZpY2VMb2NhdG9yKCksIEJpbmRpbmdzLmdldEJpbmRpbmdzKGluamVjdGlvbk1hbmFnZXIsIGplcnNleUJpbmRlcikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJpbmQgZGVzY3JpcHRvcnMgdG8gSGsyLWxpa2Uge0BsaW5rIEJpbmRlcn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9jYXRvciBISzIgbG9jYXRvci4KKyAgICAgKiBAcGFyYW0gYmluZGluZyBzaW5nbGUgZGVzY3JpcHRvci4KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBiaW5kKFNlcnZpY2VMb2NhdG9yIGxvY2F0b3IsIEJpbmRpbmcgYmluZGluZykgeworICAgICAgICBiaW5kQmluZGluZyhsb2NhdG9yLCBiaW5kaW5nKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCaW5kIGRlc2NyaXB0b3JzIHRvIEhrMi1saWtlIHtAbGluayBCaW5kZXJ9LgorICAgICAqCisgICAgICogQHBhcmFtIGxvY2F0b3IgICAgIEhLMiBsb2NhdG9yLgorICAgICAqIEBwYXJhbSBkZXNjcmlwdG9ycyBjb2xsZWN0aW9uIG9mIGRlc2NyaXB0b3JzLgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIGJpbmQoU2VydmljZUxvY2F0b3IgbG9jYXRvciwgSXRlcmFibGU8QmluZGluZz4gZGVzY3JpcHRvcnMpIHsKKyAgICAgICAgRHluYW1pY0NvbmZpZ3VyYXRpb24gZGMgPSBnZXREeW5hbWljQ29uZmlndXJhdGlvbihsb2NhdG9yKTsKKyAgICAgICAgZm9yIChCaW5kaW5nIGJpbmRpbmcgOiBkZXNjcmlwdG9ycykgeworICAgICAgICAgICAgYmluZEJpbmRpbmcobG9jYXRvciwgZGMsIGJpbmRpbmcpOworICAgICAgICB9CisgICAgICAgIGRjLmNvbW1pdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMge0BsaW5rIER5bmFtaWNDb25maWd1cmF0aW9uU2VydmljZX0gb2JqZWN0IGZyb20ge0BsaW5rIFNlcnZpY2VMb2NhdG9yIEhLMiBMb2NhdG9yfSBhbmQgY3JlYXRlcyBhIG5ldyBvYmplY3Qgb2YKKyAgICAgKiB7QGxpbmsgRHluYW1pY0NvbmZpZ3VyYXRpb259IHRvIGJpbmQgbmV3IHNlcnZpY2VzLgorICAgICAqCisgICAgICogQHBhcmFtIGxvY2F0b3IgSEsyIGxvY2F0b3IuCisgICAgICogQHJldHVybiBuZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIER5bmFtaWNDb25maWd1cmF0aW9ufSB0byBiaW5kIG5ldyBzZXJ2aWNlcy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBEeW5hbWljQ29uZmlndXJhdGlvbiBnZXREeW5hbWljQ29uZmlndXJhdGlvbihTZXJ2aWNlTG9jYXRvciBsb2NhdG9yKSB7CisgICAgICAgIER5bmFtaWNDb25maWd1cmF0aW9uU2VydmljZSBkY3MgPSBsb2NhdG9yLmdldFNlcnZpY2UoRHluYW1pY0NvbmZpZ3VyYXRpb25TZXJ2aWNlLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIGRjcy5jcmVhdGVEeW5hbWljQ29uZmlndXJhdGlvbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJpbmRzIHRoZSBzaW5nbGUgZGVzY3JpcHRvciB1c2luZyBhIHNpbmdsZSB7QGxpbmsgRHluYW1pY0NvbmZpZ3VyYXRpb259LgorICAgICAqCisgICAgICogQHBhcmFtIGxvY2F0b3IgSEsyIGluamVjdGlvbiBtYW5hZ2VyLgorICAgICAqIEBwYXJhbSBiaW5kaW5nIEplcnNleSBkZXNjcmlwdG9yIGFzIGEgaG9sZGVyIG9mIGluZm9ybWF0aW9uIGFib3V0IGFuIGluamVjdGlvbiBwb2ludC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGJpbmRCaW5kaW5nKFNlcnZpY2VMb2NhdG9yIGxvY2F0b3IsIEJpbmRpbmc8PywgPz4gYmluZGluZykgeworICAgICAgICBEeW5hbWljQ29uZmlndXJhdGlvbiBkYyA9IGdldER5bmFtaWNDb25maWd1cmF0aW9uKGxvY2F0b3IpOworICAgICAgICBiaW5kQmluZGluZyhsb2NhdG9yLCBkYywgYmluZGluZyk7CisgICAgICAgIGRjLmNvbW1pdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJpbmRzIHRoZSBzaW5nbGUgZGVzY3JpcHRvciB1c2luZyBhbiBleHRlcm5hbCB7QGxpbmsgRHluYW1pY0NvbmZpZ3VyYXRpb259LgorICAgICAqCisgICAgICogQHBhcmFtIGxvY2F0b3IgSEsyIGluamVjdGlvbiBtYW5hZ2VyLgorICAgICAqIEBwYXJhbSBkYyAgICAgIEhLMiBEeW5hbWljIGNvbmZpZ3VyYXRpb24gdG8gYmluZCB0aGUgb2JqZWN0LgorICAgICAqIEBwYXJhbSBiaW5kaW5nIEplcnNleSBkZXNjcmlwdG9yIGFzIGEgaG9sZGVyIG9mIGluZm9ybWF0aW9uIGFib3V0IGFuIGluamVjdGlvbiBwb2ludC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGJpbmRCaW5kaW5nKFNlcnZpY2VMb2NhdG9yIGxvY2F0b3IsIER5bmFtaWNDb25maWd1cmF0aW9uIGRjLCBCaW5kaW5nPD8sID8+IGJpbmRpbmcpIHsKKyAgICAgICAgaWYgKENsYXNzQmluZGluZy5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGJpbmRpbmcuZ2V0Q2xhc3MoKSkpIHsKKyAgICAgICAgICAgIEFjdGl2ZURlc2NyaXB0b3I8Pz4gYWN0aXZlRGVzY3JpcHRvciA9IHRyYW5zbGF0ZVRvQWN0aXZlRGVzY3JpcHRvcigoQ2xhc3NCaW5kaW5nPD8+KSBiaW5kaW5nKTsKKyAgICAgICAgICAgIGJpbmRCaW5kaW5nKGxvY2F0b3IsIGRjLCBhY3RpdmVEZXNjcmlwdG9yLCBiaW5kaW5nLmdldEFsaWFzZXMoKSk7CisKKyAgICAgICAgfSBlbHNlIGlmIChJbnN0YW5jZUJpbmRpbmcuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShiaW5kaW5nLmdldENsYXNzKCkpKSB7CisgICAgICAgICAgICBBY3RpdmVEZXNjcmlwdG9yPD8+IGFjdGl2ZURlc2NyaXB0b3IgPSB0cmFuc2xhdGVUb0FjdGl2ZURlc2NyaXB0b3IoKEluc3RhbmNlQmluZGluZzw/PikgYmluZGluZyk7CisgICAgICAgICAgICBiaW5kQmluZGluZyhsb2NhdG9yLCBkYywgYWN0aXZlRGVzY3JpcHRvciwgYmluZGluZy5nZXRBbGlhc2VzKCkpOworCisgICAgICAgIH0gZWxzZSBpZiAoSW5qZWN0aW9uUmVzb2x2ZXJCaW5kaW5nLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oYmluZGluZy5nZXRDbGFzcygpKSkgeworICAgICAgICAgICAgSW5qZWN0aW9uUmVzb2x2ZXJCaW5kaW5nIHJlc29sdmVyRGVzY3JpcHRvciA9IChJbmplY3Rpb25SZXNvbHZlckJpbmRpbmcpIGJpbmRpbmc7CisgICAgICAgICAgICBiaW5kQmluZGluZyhsb2NhdG9yLCBkYywgd3JhcEluamVjdGlvblJlc29sdmVyKHJlc29sdmVyRGVzY3JpcHRvciksIGJpbmRpbmcuZ2V0QWxpYXNlcygpKTsKKyAgICAgICAgICAgIGJpbmRCaW5kaW5nKGxvY2F0b3IsIGRjLCB0cmFuc2xhdGVUb0FjdGl2ZURlc2NyaXB0b3IocmVzb2x2ZXJEZXNjcmlwdG9yKSwgYmluZGluZy5nZXRBbGlhc2VzKCkpOworCisgICAgICAgIH0gZWxzZSBpZiAoU3VwcGxpZXJDbGFzc0JpbmRpbmcuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShiaW5kaW5nLmdldENsYXNzKCkpKSB7CisgICAgICAgICAgICBiaW5kU3VwcGxpZXJDbGFzc0JpbmRpbmcobG9jYXRvciwgKFN1cHBsaWVyQ2xhc3NCaW5kaW5nPD8+KSBiaW5kaW5nKTsKKworICAgICAgICB9IGVsc2UgaWYgKFN1cHBsaWVySW5zdGFuY2VCaW5kaW5nLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oYmluZGluZy5nZXRDbGFzcygpKSkgeworICAgICAgICAgICAgYmluZFN1cHBsaWVySW5zdGFuY2VCaW5kaW5nKGxvY2F0b3IsIChTdXBwbGllckluc3RhbmNlQmluZGluZzw/PikgYmluZGluZyk7CisKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlVOS05PV05fREVTQ1JJUFRPUl9UWVBFKGJpbmRpbmcuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHByaXZhdGUgc3RhdGljIEFjdGl2ZURlc2NyaXB0b3I8Pz4gd3JhcEluamVjdGlvblJlc29sdmVyKEluamVjdGlvblJlc29sdmVyQmluZGluZyByZXNvbHZlckRlc2NyaXB0b3IpIHsKKyAgICAgICAgSW5qZWN0aW9uUmVzb2x2ZXJXcmFwcGVyPD8+IHdyYXBwZWRSZXNvbHZlciA9IG5ldyBJbmplY3Rpb25SZXNvbHZlcldyYXBwZXI8PihyZXNvbHZlckRlc2NyaXB0b3IuZ2V0UmVzb2x2ZXIoKSk7CisgICAgICAgIHJldHVybiB0cmFuc2xhdGVUb0FjdGl2ZURlc2NyaXB0b3IoQmluZGluZ3Muc2VydmljZSh3cmFwcGVkUmVzb2x2ZXIpLAorICAgICAgICAgICAgICAgIG5ldyBQYXJhbWV0ZXJpemVkVHlwZUltcGwoSW5qZWN0aW9uUmVzb2x2ZXIuY2xhc3MsIHJlc29sdmVyRGVzY3JpcHRvci5nZXRSZXNvbHZlcigpLmdldEFubm90YXRpb24oKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVycyBhIG5ldyBpbnN0YW5jZSB7QGxpbmsgQmluZGVyfSB1c2luZyB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgSmVyc2V5IGJpbmRpbmcge0BsaW5rIFN1cHBsaWVySW5zdGFuY2VCaW5kaW5nfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2NhdG9yIEhLMiBpbnN0YW5jZSBtYW5hZ2VyLgorICAgICAqIEBwYXJhbSBiaW5kaW5nIEplcnNleSBkZXNjcmlwdG9yIGFzIGEgaG9sZGVyIG9mIGluZm9ybWF0aW9uIGFib3V0IGFuIGluamVjdGlvbiBwb2ludC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGJpbmRTdXBwbGllckluc3RhbmNlQmluZGluZyhTZXJ2aWNlTG9jYXRvciBsb2NhdG9yLCBTdXBwbGllckluc3RhbmNlQmluZGluZzw/PiBiaW5kaW5nKSB7CisgICAgICAgIENvbnN1bWVyPEFic3RyYWN0QmluZGVyPiBiaW5kQ29uc3VtZXIgPSBiaW5kZXIgLT4geworICAgICAgICAgICAgU3VwcGxpZXI8Pz4gc3VwcGxpZXIgPSBiaW5kaW5nLmdldFN1cHBsaWVyKCk7CisgICAgICAgICAgICBib29sZWFuIGRpc3Bvc2FibGUgPSBEaXNwb3NhYmxlU3VwcGxpZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShzdXBwbGllci5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIC8vIEJpbmQgdGhlIFN1cHBsaWVyIGl0c2VsZiB0byBiZSBhYmxlIHRvIGluamVjdCAtIFN1cHBsaWVyPFQ+IG9yIERpc3Bvc2FibGVTdXBwbGllcjxUPjsKKyAgICAgICAgICAgIC8vIFRoZSBjb250cmFjdCBvZiB0aGUgc3VwcGxpZXIgaXMgbm90IHJlZ2lzdGVyZWQgdGhhdCBtZWFucyB0aGF0IHRoZSBpbnN0YW5jZSBvZiB0aGUgc3VwcGxpZXIgY2FuIGJlIHJldHJpZXZlZAorICAgICAgICAgICAgLy8gb25seSB1c2luZyBTdXBwbGllciBpbnRlcmZhY2UgYW5kIG5vdCB1c2luZyBpbXBsZW1lbnRhdGlvbiBjbGFzcyBpdHNlbGYuIFN1cHBsaWVyIGNhbiBiZSByZWdpc3RlcmVkIG9ubHkgb25jZSB3aXRoCisgICAgICAgICAgICAvLyBhbGwgcHJvdmlkZWQgY29udHJhY3RzLgorICAgICAgICAgICAgQWJzdHJhY3RBY3RpdmVEZXNjcmlwdG9yPD8gZXh0ZW5kcyBTdXBwbGllcjw/Pj4gc3VwcGxpZXJCdWlsZGVyID0gQnVpbGRlckhlbHBlci5jcmVhdGVDb25zdGFudERlc2NyaXB0b3Ioc3VwcGxpZXIpOworICAgICAgICAgICAgYmluZGluZy5nZXRDb250cmFjdHMoKS5mb3JFYWNoKGNvbnRyYWN0IC0+IHsKKyAgICAgICAgICAgICAgICBzdXBwbGllckJ1aWxkZXIuYWRkQ29udHJhY3RUeXBlKG5ldyBQYXJhbWV0ZXJpemVkVHlwZUltcGwoU3VwcGxpZXIuY2xhc3MsIGNvbnRyYWN0KSk7CisgICAgICAgICAgICAgICAgaWYgKGRpc3Bvc2FibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgc3VwcGxpZXJCdWlsZGVyLmFkZENvbnRyYWN0VHlwZShuZXcgUGFyYW1ldGVyaXplZFR5cGVJbXBsKERpc3Bvc2FibGVTdXBwbGllci5jbGFzcywgY29udHJhY3QpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIC8vIEFsd2F5cyBjYWxsIFN1cHBsaWVyRmFjdG9yeUJyaWRnZS4KKyAgICAgICAgICAgIHN1cHBsaWVyQnVpbGRlci5zZXROYW1lKGJpbmRpbmcuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGJpbmRpbmcuZ2V0UXVhbGlmaWVycygpLmZvckVhY2goc3VwcGxpZXJCdWlsZGVyOjphZGRRdWFsaWZpZXJBbm5vdGF0aW9uKTsKKyAgICAgICAgICAgIGJpbmRlci5iaW5kKHN1cHBsaWVyQnVpbGRlcik7CisKKyAgICAgICAgICAgIC8vIFJlZ2lzdGVyIHdyYXBwZXIgZm9yIGZhY3RvcnkgZnVuY3Rpb25hbGl0eSwgd3JhcHBlciBhdXRvbWF0aWNhbGx5IGNhbGwgc2VydmljZSBsb2NhdG9yIHdoaWNoIGlzIGFibGUgdG8gcmV0cmlldmUKKyAgICAgICAgICAgIC8vIHRoZSBzZXJ2aWNlIGluIHRoZSBwcm9wZXIgY29udGV4dCBhbmQgc2NvcGUuIEJyaWRnZSBpcyByZWdpc3RlcmVkIGZvciBhbGwgY29udHJhY3RzIGJ1dCBpcyBhYmxlIHRvIGxvb2t1cCBmcm9tCisgICAgICAgICAgICAvLyBzZXJ2aWNlIGxvY2F0b3Igb25seSB1c2luZyB0aGUgZmlyc3QgY29udHJhY3QuCisgICAgICAgICAgICBTZXJ2aWNlQmluZGluZ0J1aWxkZXI8Pz4gYnVpbGRlciA9IGJpbmRlci5iaW5kRmFjdG9yeShuZXcgSW5zdGFuY2VTdXBwbGllckZhY3RvcnlCcmlkZ2U8PihzdXBwbGllciwgZGlzcG9zYWJsZSkpOworICAgICAgICAgICAgc2V0dXBTdXBwbGllckZhY3RvcnlCcmlkZ2UoYmluZGluZywgYnVpbGRlcik7CisgICAgICAgIH07CisKKyAgICAgICAgU2VydmljZUxvY2F0b3JVdGlsaXRpZXMuYmluZChsb2NhdG9yLCBjcmVhdGVCaW5kZXIoYmluZENvbnN1bWVyKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGEgbmV3IGluc3RhbmNlIHtAbGluayBCaW5kZXJ9IHVzaW5nIHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBKZXJzZXkgYmluZGluZyB7QGxpbmsgU3VwcGxpZXJDbGFzc0JpbmRpbmd9LgorICAgICAqCisgICAgICogQHBhcmFtIGxvY2F0b3IgSEsyIGluc3RhbmNlIG1hbmFnZXIuCisgICAgICogQHBhcmFtIGJpbmRpbmcgSmVyc2V5IGRlc2NyaXB0b3IgYXMgYSBob2xkZXIgb2YgaW5mb3JtYXRpb24gYWJvdXQgYW4gaW5qZWN0aW9uIHBvaW50LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYmluZFN1cHBsaWVyQ2xhc3NCaW5kaW5nKFNlcnZpY2VMb2NhdG9yIGxvY2F0b3IsIFN1cHBsaWVyQ2xhc3NCaW5kaW5nPD8+IGJpbmRpbmcpIHsKKyAgICAgICAgQ29uc3VtZXI8QWJzdHJhY3RCaW5kZXI+IGJpbmRDb25zdW1lciA9IGJpbmRlciAtPiB7CisgICAgICAgICAgICBib29sZWFuIGRpc3Bvc2FibGUgPSBEaXNwb3NhYmxlU3VwcGxpZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShiaW5kaW5nLmdldFN1cHBsaWVyQ2xhc3MoKSk7CisKKyAgICAgICAgICAgIC8vIEJpbmQgdGhlIFN1cHBsaWVyIGl0c2VsZiB0byBiZSBhYmxlIHRvIGluamVjdCAtIFN1cHBsaWVyPFQ+IHN1cHBsaWVyOworICAgICAgICAgICAgLy8gVGhlIGNvbnRyYWN0IG9mIHRoZSBzdXBwbGllciBpcyBub3QgcmVnaXN0ZXJlZCB0aGF0IG1lYW5zIHRoYXQgdGhlIGluc3RhbmNlIG9mIHRoZSBzdXBwbGllciBjYW4gYmUgcmV0cmlldmVkCisgICAgICAgICAgICAvLyBvbmx5IHVzaW5nIFN1cHBsaWVyIGludGVyZmFjZSBhbmQgbm90IHVzaW5nIGltcGxlbWVudGF0aW9uIGNsYXNzIGl0c2VsZi4gU3VwcGxpZXIgY2FuIGJlIHJlZ2lzdGVyZWQgb25seSBvbmNlIHdpdGgKKyAgICAgICAgICAgIC8vIGFsbCBwcm92aWRlZCBjb250cmFjdHMuCisgICAgICAgICAgICBTZXJ2aWNlQmluZGluZ0J1aWxkZXI8Pz4gc3VwcGxpZXJCdWlsZGVyID0gYmluZGVyLmJpbmQoYmluZGluZy5nZXRTdXBwbGllckNsYXNzKCkpOworICAgICAgICAgICAgYmluZGluZy5nZXRDb250cmFjdHMoKS5mb3JFYWNoKGNvbnRyYWN0IC0+IHsKKyAgICAgICAgICAgICAgICBzdXBwbGllckJ1aWxkZXIudG8obmV3IFBhcmFtZXRlcml6ZWRUeXBlSW1wbChTdXBwbGllci5jbGFzcywgY29udHJhY3QpKTsKKyAgICAgICAgICAgICAgICBpZiAoZGlzcG9zYWJsZSkgeworICAgICAgICAgICAgICAgICAgICBzdXBwbGllckJ1aWxkZXIudG8obmV3IFBhcmFtZXRlcml6ZWRUeXBlSW1wbChEaXNwb3NhYmxlU3VwcGxpZXIuY2xhc3MsIGNvbnRyYWN0KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBiaW5kaW5nLmdldFF1YWxpZmllcnMoKS5mb3JFYWNoKHN1cHBsaWVyQnVpbGRlcjo6cXVhbGlmaWVkQnkpOworICAgICAgICAgICAgc3VwcGxpZXJCdWlsZGVyLm5hbWVkKGJpbmRpbmcuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIHN1cHBsaWVyQnVpbGRlci5pbih0cmFuc2Zvcm1TY29wZShiaW5kaW5nLmdldFN1cHBsaWVyU2NvcGUoKSkpOworICAgICAgICAgICAgYmluZGVyLmJpbmQoc3VwcGxpZXJCdWlsZGVyKTsKKworICAgICAgICAgICAgLy8gUmVnaXN0ZXIgd3JhcHBlciBmb3IgZmFjdG9yeSBmdW5jdGlvbmFsaXR5LCB3cmFwcGVyIGF1dG9tYXRpY2FsbHkgY2FsbCBzZXJ2aWNlIGxvY2F0b3Igd2hpY2ggaXMgYWJsZSB0byByZXRyaWV2ZQorICAgICAgICAgICAgLy8gdGhlIHNlcnZpY2UgaW4gdGhlIHByb3BlciBjb250ZXh0IGFuZCBzY29wZS4gQnJpZGdlIGlzIHJlZ2lzdGVyZWQgZm9yIGFsbCBjb250cmFjdHMgYnV0IGlzIGFibGUgdG8gbG9va3VwIGZyb20KKyAgICAgICAgICAgIC8vIHNlcnZpY2UgbG9jYXRvciBvbmx5IHVzaW5nIHRoZSBmaXJzdCBjb250cmFjdC4KKyAgICAgICAgICAgIFR5cGUgY29udHJhY3QgPSBudWxsOworICAgICAgICAgICAgaWYgKGJpbmRpbmcuZ2V0Q29udHJhY3RzKCkuaXRlcmF0b3IoKS5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICBjb250cmFjdCA9IGJpbmRpbmcuZ2V0Q29udHJhY3RzKCkuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFNlcnZpY2VCaW5kaW5nQnVpbGRlcjw/PiBidWlsZGVyID0gYmluZGVyLmJpbmRGYWN0b3J5KAorICAgICAgICAgICAgICAgICAgICBuZXcgU3VwcGxpZXJGYWN0b3J5QnJpZGdlPD4obG9jYXRvciwgY29udHJhY3QsIGJpbmRpbmcuZ2V0TmFtZSgpLCBkaXNwb3NhYmxlKSk7CisgICAgICAgICAgICBzZXR1cFN1cHBsaWVyRmFjdG9yeUJyaWRnZShiaW5kaW5nLCBidWlsZGVyKTsKKyAgICAgICAgICAgIGlmIChiaW5kaW5nLmdldEltcGxlbWVudGF0aW9uVHlwZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFzVHlwZShiaW5kaW5nLmdldEltcGxlbWVudGF0aW9uVHlwZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBTZXJ2aWNlTG9jYXRvclV0aWxpdGllcy5iaW5kKGxvY2F0b3IsIGNyZWF0ZUJpbmRlcihiaW5kQ29uc3VtZXIpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldHVwU3VwcGxpZXJGYWN0b3J5QnJpZGdlKEJpbmRpbmc8PywgPz4gYmluZGluZywgU2VydmljZUJpbmRpbmdCdWlsZGVyPD8+IGJ1aWxkZXIpIHsKKyAgICAgICAgYnVpbGRlci5uYW1lZChiaW5kaW5nLmdldE5hbWUoKSk7CisgICAgICAgIGJpbmRpbmcuZ2V0Q29udHJhY3RzKCkuZm9yRWFjaChidWlsZGVyOjp0byk7CisgICAgICAgIGJpbmRpbmcuZ2V0UXVhbGlmaWVycygpLmZvckVhY2goYnVpbGRlcjo6cXVhbGlmaWVkQnkpOworICAgICAgICBidWlsZGVyLmluKHRyYW5zZm9ybVNjb3BlKGJpbmRpbmcuZ2V0U2NvcGUoKSkpOworCisgICAgICAgIGlmIChiaW5kaW5nLmdldFJhbmsoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBidWlsZGVyLnJhbmtlZChiaW5kaW5nLmdldFJhbmsoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYmluZGluZy5pc1Byb3hpYWJsZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJ1aWxkZXIucHJveHkoYmluZGluZy5pc1Byb3hpYWJsZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChiaW5kaW5nLmlzUHJveGllZEZvclNhbWVTY29wZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJ1aWxkZXIucHJveHlGb3JTYW1lU2NvcGUoYmluZGluZy5pc1Byb3hpZWRGb3JTYW1lU2NvcGUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgQWN0aXZlRGVzY3JpcHRvcjw/PiB0cmFuc2xhdGVUb0FjdGl2ZURlc2NyaXB0b3IoQ2xhc3NCaW5kaW5nPD8+IGRlc2MpIHsKKyAgICAgICAgQWN0aXZlRGVzY3JpcHRvckJ1aWxkZXIgYmluZGluZyA9IEJ1aWxkZXJIZWxwZXIuYWN0aXZlTGluayhkZXNjLmdldFNlcnZpY2UoKSkubmFtZWQoZGVzYy5nZXROYW1lKCkpCisgICAgICAgICAgICAgICAgLmFuYWx5emVXaXRoKGRlc2MuZ2V0QW5hbHl6ZXIoKSk7CisKKyAgICAgICAgaWYgKGRlc2MuZ2V0U2NvcGUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBiaW5kaW5nLmluKHRyYW5zZm9ybVNjb3BlKGRlc2MuZ2V0U2NvcGUoKSkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRlc2MuZ2V0UmFuaygpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJpbmRpbmcub2ZSYW5rKGRlc2MuZ2V0UmFuaygpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogZGVzYy5nZXRRdWFsaWZpZXJzKCkpIHsKKyAgICAgICAgICAgIGJpbmRpbmcucXVhbGlmaWVkQnkoYW5ub3RhdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKFR5cGUgY29udHJhY3QgOiBkZXNjLmdldENvbnRyYWN0cygpKSB7CisgICAgICAgICAgICBiaW5kaW5nLnRvKGNvbnRyYWN0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZXNjLmlzUHJveGlhYmxlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgYmluZGluZy5wcm94eShkZXNjLmlzUHJveGlhYmxlKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRlc2MuaXNQcm94aWVkRm9yU2FtZVNjb3BlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgYmluZGluZy5wcm94eUZvclNhbWVTY29wZShkZXNjLmlzUHJveGllZEZvclNhbWVTY29wZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZXNjLmdldEltcGxlbWVudGF0aW9uVHlwZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJpbmRpbmcuYXNUeXBlKGRlc2MuZ2V0SW1wbGVtZW50YXRpb25UeXBlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGJpbmRpbmcuYnVpbGQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCaW5kcyBhIG5ldyBpbnN0YW5jZSB7QGxpbmsgQmluZGluZ30gdXNpbmcgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIEplcnNleSBkZXNjcmlwdG9yIHtAbGluayBJbnN0YW5jZUJpbmRpbmd9LgorICAgICAqIDxwPgorICAgICAqIEFsb25nIHdpdGggYSBuZXcgaW5zdGFuY2UsIHRoZSBtZXRob2QgaXMgYWJsZSB0byByZWdpc3RlciBhbGlhc2VzIGJlbG9uZ2luZyB0byB0aGUgbmV3IHNlcnZpY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbG9jYXRvciAgICAgICAgICBISzIgaW5qZWN0aW9uIG1hbmFnZXIuCisgICAgICogQHBhcmFtIGRjICAgICAgICAgICAgICAgSEsyIER5bmFtaWMgY29uZmlndXJhdGlvbiB0byBiaW5kIHRoZSBvYmplY3QuCisgICAgICogQHBhcmFtIGFjdGl2ZURlc2NyaXB0b3IgSEsyIGFjdGl2ZSBkZXNjcmlwdG9yLgorICAgICAqIEBwYXJhbSBhbGlhc2VzICAgICAgICAgIGFsaWFzZXMgYmVsb25naW5nIHRvIHRoZSBnaXZlbiBkZXNjcmlwdG9yLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYmluZEJpbmRpbmcoU2VydmljZUxvY2F0b3IgbG9jYXRvciwgRHluYW1pY0NvbmZpZ3VyYXRpb24gZGMsIEFjdGl2ZURlc2NyaXB0b3I8Pz4gYWN0aXZlRGVzY3JpcHRvciwKKyAgICAgICAgICAgIFNldDxBbGlhc0JpbmRpbmc+IGFsaWFzZXMpIHsKKyAgICAgICAgQWN0aXZlRGVzY3JpcHRvcjxPYmplY3Q+IGJvdW5kRGVzY3JpcHRvciA9IGRjLmJpbmQoYWN0aXZlRGVzY3JpcHRvcik7CisgICAgICAgIGZvciAoQWxpYXNCaW5kaW5nIGFsaWFzIDogYWxpYXNlcykgeworICAgICAgICAgICAgZGMuYmluZChjcmVhdGVBbGlhcyhsb2NhdG9yLCBib3VuZERlc2NyaXB0b3IsIGFsaWFzKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0aWMgQWN0aXZlRGVzY3JpcHRvcjw/PiB0cmFuc2xhdGVUb0FjdGl2ZURlc2NyaXB0b3IoSW5zdGFuY2VCaW5kaW5nPD8+IGRlc2MsIFR5cGUuLi4gY29udHJhY3RzKSB7CisgICAgICAgIEFic3RyYWN0QWN0aXZlRGVzY3JpcHRvcjw/PiBiaW5kaW5nOworICAgICAgICBpZiAoY29udHJhY3RzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICBiaW5kaW5nID0gQnVpbGRlckhlbHBlci5jcmVhdGVDb25zdGFudERlc2NyaXB0b3IoZGVzYy5nZXRTZXJ2aWNlKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYmluZGluZyA9IEJ1aWxkZXJIZWxwZXIuY3JlYXRlQ29uc3RhbnREZXNjcmlwdG9yKGRlc2MuZ2V0U2VydmljZSgpLCBudWxsLCBjb250cmFjdHMpOworICAgICAgICB9CisKKyAgICAgICAgYmluZGluZy5zZXROYW1lKGRlc2MuZ2V0TmFtZSgpKTsKKyAgICAgICAgYmluZGluZy5zZXRDbGFzc0FuYWx5c2lzTmFtZShkZXNjLmdldEFuYWx5emVyKCkpOworCisgICAgICAgIGlmIChkZXNjLmdldFNjb3BlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgYmluZGluZy5zZXRTY29wZShkZXNjLmdldFNjb3BlKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZXNjLmdldFJhbmsoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBiaW5kaW5nLnNldFJhbmtpbmcoZGVzYy5nZXRSYW5rKCkpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChBbm5vdGF0aW9uIGFubm90YXRpb24gOiBkZXNjLmdldFF1YWxpZmllcnMoKSkgeworICAgICAgICAgICAgYmluZGluZy5hZGRRdWFsaWZpZXJBbm5vdGF0aW9uKGFubm90YXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChUeXBlIGNvbnRyYWN0IDogZGVzYy5nZXRDb250cmFjdHMoKSkgeworICAgICAgICAgICAgYmluZGluZy5hZGRDb250cmFjdFR5cGUoY29udHJhY3QpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRlc2MuaXNQcm94aWFibGUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBiaW5kaW5nLnNldFByb3hpYWJsZShkZXNjLmlzUHJveGlhYmxlKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRlc2MuaXNQcm94aWVkRm9yU2FtZVNjb3BlKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgYmluZGluZy5zZXRQcm94eUZvclNhbWVTY29wZShkZXNjLmlzUHJveGllZEZvclNhbWVTY29wZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBiaW5kaW5nOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEFjdGl2ZURlc2NyaXB0b3I8Pz4gdHJhbnNsYXRlVG9BY3RpdmVEZXNjcmlwdG9yKEluamVjdGlvblJlc29sdmVyQmluZGluZzw/PiBkZXNjKSB7CisgICAgICAgIFBhcmFtZXRlcml6ZWRUeXBlSW1wbCBwYXJhbWV0ZXJpemVkVHlwZSA9IG5ldyBQYXJhbWV0ZXJpemVkVHlwZUltcGwoCisgICAgICAgICAgICAgICAgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvblJlc29sdmVyLmNsYXNzLCBkZXNjLmdldFJlc29sdmVyKCkuZ2V0QW5ub3RhdGlvbigpKTsKKworICAgICAgICByZXR1cm4gQnVpbGRlckhlbHBlci5jcmVhdGVDb25zdGFudERlc2NyaXB0b3IoZGVzYy5nZXRSZXNvbHZlcigpLCBudWxsLCBwYXJhbWV0ZXJpemVkVHlwZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyB0aGUgYWxpYXMgb2JqZWN0IHRvIGEgcHJvdmlkZWQgZGVzY3JpcHRvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsb2NhdG9yICAgIGxvY2F0b3IgdXNlZCB0byBjcmVhdGUgYW4gYWxpYXMuCisgICAgICogQHBhcmFtIGRlc2NyaXB0b3IgZGVzY3JpcHRvciB3aGljaCB0aGUgYWxpYXMgYmVsb25ncyB0by4KKyAgICAgKiBAcGFyYW0gYWxpYXMgICAgICBzb3VyY2Ugb2YgdGhlIGFsaWFzIGluZm9ybWF0aW9uLgorICAgICAqIEByZXR1cm4gcG9wdWxhdGVkIGFsaWFzIG9iamVjdCwgcmVhZHkgdG8gYmluZEJpbmRlciB1c2luZyB7QGxpbmsgRHluYW1pY0NvbmZpZ3VyYXRpb259LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIG9yZy5nbGFzc2Zpc2guaGsyLnV0aWxpdGllcy5BbGlhc0Rlc2NyaXB0b3I8Pz4gY3JlYXRlQWxpYXMoU2VydmljZUxvY2F0b3IgbG9jYXRvciwKKyAgICAgICAgICAgIEFjdGl2ZURlc2NyaXB0b3I8Pz4gZGVzY3JpcHRvciwgQWxpYXNCaW5kaW5nIGFsaWFzKSB7CisgICAgICAgIG9yZy5nbGFzc2Zpc2guaGsyLnV0aWxpdGllcy5BbGlhc0Rlc2NyaXB0b3I8Pz4gaGsyQWxpYXMgPSBuZXcgb3JnLmdsYXNzZmlzaC5oazIudXRpbGl0aWVzLkFsaWFzRGVzY3JpcHRvcjw+KGxvY2F0b3IsCisgICAgICAgICAgICAgICAgZGVzY3JpcHRvciwgYWxpYXMuZ2V0Q29udHJhY3QoKS5nZXROYW1lKCksIG51bGwpOworICAgICAgICBhbGlhcy5nZXRRdWFsaWZpZXJzKCkuZm9yRWFjaChoazJBbGlhczo6YWRkUXVhbGlmaWVyQW5ub3RhdGlvbik7CisgICAgICAgIGFsaWFzLmdldFNjb3BlKCkuaWZQcmVzZW50KGhrMkFsaWFzOjpzZXRTY29wZSk7CisgICAgICAgIGFsaWFzLmdldFJhbmsoKS5pZlByZXNlbnQoaGsyQWxpYXM6OnNldFJhbmtpbmcpOworICAgICAgICByZXR1cm4gaGsyQWxpYXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyBiaW5kZXIgYW5kIGF1dG9tYXRpY2FsbHkgdXNlIGl0IHRvIGJpbmQgdGhlIHRoZSBkZXNjcmlwdG9ycyBpbiB7QGNvZGUgYmluZENvbnN1bWVyfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiaW5kQ29uc3VtZXIgY29uc3VtZXIgdXNlZCB0byBwcm9jZXNzIHRoZSBkZWZpbmVkIG9wZXJhdGlvbiB3aXRoIGEgYmluZGVyLgorICAgICAqIEByZXR1cm4gcG9wdWxhdGVkIGJpbmRlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBCaW5kZXIgY3JlYXRlQmluZGVyKENvbnN1bWVyPEFic3RyYWN0QmluZGVyPiBiaW5kQ29uc3VtZXIpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBYnN0cmFjdEJpbmRlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICAgICAgICAgIGJpbmRDb25zdW1lci5hY2NlcHQodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgLyoqCisgICAgICogVHJhbnNmb3JtcyBKZXJzZXkgc2NvcGVzL2Fubm90YXRpb25zIHRvIEhLMiBlcXVpdmFsZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzY29wZSBKZXJzZXkgc2NvcGUvYW5ub3RhdGlvbi4KKyAgICAgKiBAcmV0dXJuIEhLMiBlcXVpdmFsZW50IHNjb3BlL2Fubm90YXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IHRyYW5zZm9ybVNjb3BlKENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiBzY29wZSkgeworICAgICAgICBpZiAoc2NvcGUgPT0gUGVyTG9va3VwLmNsYXNzKSB7CisgICAgICAgICAgICByZXR1cm4gb3JnLmdsYXNzZmlzaC5oazIuYXBpLlBlckxvb2t1cC5jbGFzczsKKyAgICAgICAgfSBlbHNlIGlmIChzY29wZSA9PSBQZXJUaHJlYWQuY2xhc3MpIHsKKyAgICAgICAgICAgIHJldHVybiBvcmcuZ2xhc3NmaXNoLmhrMi5hcGkuUGVyVGhyZWFkLmNsYXNzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzY29wZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9pbmplY3QvaGsyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2hrMi9IazJJbmplY3Rpb25NYW5hZ2VyRmFjdG9yeS5qYXZhIGIvaW5qZWN0L2hrMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9oazIvSGsySW5qZWN0aW9uTWFuYWdlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTgwNjJmCi0tLSAvZGV2L251bGwKKysrIGIvaW5qZWN0L2hrMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9oazIvSGsySW5qZWN0aW9uTWFuYWdlckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuaGsyOworCitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qcmlvcml0eTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5CaW5kaW5nczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5Qcm9wZXJ0aWVzSGVscGVyOworCisvKioKKyAqIEZhY3Rvcnkgd2hpY2ggaXMgYWJsZSB0byBjcmVhdGUge0BsaW5rIEluamVjdGlvbk1hbmFnZXJ9IGluc3RhbmNlIHVzaW5nIHNlcnZpY2UgbG9hZGluZyBhbmQgYXV0b21hdGljYWxseSBpbml0aWFsaXplIGluamVjdGlvbgorICogbWFuYWdlciB1c2luZyB7QGNvZGUgcGFyZW50fSBvciBpbW1lZGlhdGVseSByZWdpc3RlcnMgYmluZGVyLgorICovCitAUHJpb3JpdHkoMTApCitwdWJsaWMgY2xhc3MgSGsySW5qZWN0aW9uTWFuYWdlckZhY3RvcnkgaW1wbGVtZW50cyBJbmplY3Rpb25NYW5hZ2VyRmFjdG9yeSB7CisKKyAgICAvKioKKyAgICAgKiBIazIgSW5qZWN0aW9uIG1hbmFnZXIgc3RyYXRlZ3kuCisgICAgICogPHA+CisgICAgICogVmFsdWUgY2FuIGJlIHN1cHBsaWVkIG9ubHkgdmlhIGphdmEgcHJvcGVydGllcywgd2hpY2ggd291bGQgdHlwaWNhbGx5IGJlIGRvbmUgdXNpbmcgJy1EJyBwYXJhbWV0ZXIsCisgICAgICogZm9yIGV4YW1wbGU6IHtAY29kZSBqYXZhIC1Eb3JnLmdsYXNzZmlzaC5qZXJzZXkuaGsyLmluamVjdGlvbi5tYW5hZ2VyLnN0cmF0ZWd5PWRlbGF5ZWQgLi4ufQorICAgICAqIDxwPgorICAgICAqIFZhbGlkIHZhbHVlcyBhcmUgImltbWVkaWF0ZSIgYW5kICJkZWxheWVkIiBhbmQgdmFsdWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlLgorICAgICAqIDxwPgorICAgICAqIERlZmF1bHQgdmFsdWUgaXMgImltbWVkaWF0ZSIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEsyX0lOSkVDVElPTl9NQU5BR0VSX1NUUkFURUdZID0gIm9yZy5nbGFzc2Zpc2guamVyc2V5LmhrMi5pbmplY3Rpb24ubWFuYWdlci5zdHJhdGVneSI7CisKKyAgICBwcml2YXRlIGVudW0gSGsySW5qZWN0aW9uTWFuYWdlclN0cmF0ZWd5IHsKKworICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBJbW1lZGlhdGVIazJJbmplY3Rpb25NYW5hZ2VyCisgICAgICAgICAqLworICAgICAgICBJTU1FRElBVEUgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBJbmplY3Rpb25NYW5hZ2VyIGNyZWF0ZUluamVjdGlvbk1hbmFnZXIoZmluYWwgT2JqZWN0IHBhcmVudCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW1tZWRpYXRlSGsySW5qZWN0aW9uTWFuYWdlcihwYXJlbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9LAorICAgICAgICAvKioKKyAgICAgICAgICogQHNlZSBEZWxheWVkSGsySW5qZWN0aW9uTWFuYWdlcgorICAgICAgICAgKi8KKyAgICAgICAgREVMQVlFRCB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIEluamVjdGlvbk1hbmFnZXIgY3JlYXRlSW5qZWN0aW9uTWFuYWdlcihmaW5hbCBPYmplY3QgcGFyZW50KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEZWxheWVkSGsySW5qZWN0aW9uTWFuYWdlcihwYXJlbnQpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIGFic3RyYWN0IEluamVjdGlvbk1hbmFnZXIgY3JlYXRlSW5qZWN0aW9uTWFuYWdlcihPYmplY3QgcGFyZW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSW5qZWN0aW9uTWFuYWdlciBjcmVhdGUoT2JqZWN0IHBhcmVudCkgeworICAgICAgICByZXR1cm4gaW5pdEluamVjdGlvbk1hbmFnZXIoZ2V0U3RyYXRlZ3koKS5jcmVhdGVJbmplY3Rpb25NYW5hZ2VyKHBhcmVudCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIEhLMiBTdHJhdGVneSBwcm9wZXJ0eSB7QGxpbmsgI0hLMl9JTkpFQ1RJT05fTUFOQUdFUl9TVFJBVEVHWX0gYW5kIHJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoZSBjdXJyZW50IEhLMiBTdHJhdGVneSBpcworICAgICAqICJpbW1lZGlhdGUiLgorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIGN1cnJlbnQgSEsyIFN0cmF0ZWd5IGlzICJpbW1lZGlhdGUiLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0ltbWVkaWF0ZVN0cmF0ZWd5KCkgeworICAgICAgICByZXR1cm4gZ2V0U3RyYXRlZ3koKSA9PSBIazJJbmplY3Rpb25NYW5hZ2VyU3RyYXRlZ3kuSU1NRURJQVRFOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEhrMkluamVjdGlvbk1hbmFnZXJTdHJhdGVneSBnZXRTdHJhdGVneSgpIHsKKyAgICAgICAgU3RyaW5nIHZhbHVlID0gQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoUHJvcGVydGllc0hlbHBlci5nZXRTeXN0ZW1Qcm9wZXJ0eShISzJfSU5KRUNUSU9OX01BTkFHRVJfU1RSQVRFR1kpKTsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gSGsySW5qZWN0aW9uTWFuYWdlclN0cmF0ZWd5LklNTUVESUFURTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgiaW1tZWRpYXRlIi5lcXVhbHNJZ25vcmVDYXNlKHZhbHVlKSkgeworICAgICAgICAgICAgcmV0dXJuIEhrMkluamVjdGlvbk1hbmFnZXJTdHJhdGVneS5JTU1FRElBVEU7CisgICAgICAgIH0gZWxzZSBpZiAoImRlbGF5ZWQiLmVxdWFsc0lnbm9yZUNhc2UodmFsdWUpKSB7CisgICAgICAgICAgICByZXR1cm4gSGsySW5qZWN0aW9uTWFuYWdlclN0cmF0ZWd5LkRFTEFZRUQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJbGxlZ2FsIHZhbHVlIG9mICIgKyBISzJfSU5KRUNUSU9OX01BTkFHRVJfU1RSQVRFR1kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLiBFeHBlY3RlZCBcImltbWVkaWF0ZVwiIG9yIFwiZGVsYXllZFwiLCB0aGUgYWN0dWFsIHZhbHVlIGlzOiAiICsgdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBJbmplY3Rpb25NYW5hZ2VyIGluaXRJbmplY3Rpb25NYW5hZ2VyKEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlcikgeworICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyKEJpbmRpbmdzLnNlcnZpY2UoaW5qZWN0aW9uTWFuYWdlcikudG8oSW5qZWN0aW9uTWFuYWdlci5jbGFzcykpOworICAgICAgICByZXR1cm4gaW5qZWN0aW9uTWFuYWdlcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9pbmplY3QvaGsyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2hrMi9IazJSZWZlcmVuY2luZ0ZhY3RvcnkuamF2YSBiL2luamVjdC9oazIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvaGsyL0hrMlJlZmVyZW5jaW5nRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MmFiM2EKLS0tIC9kZXYvbnVsbAorKysgYi9pbmplY3QvaGsyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2hrMi9IazJSZWZlcmVuY2luZ0ZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuaGsyOworCitpbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLlJlZjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uUmVmczsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLmFwaS5GYWN0b3J5OworCisvKioKKyAqIEZhY3RvcnkgdGhhdCBwcm92aWRlcyBpbmplY3Rpb24gb2YgdGhlIHJlZmVyZW5jZWQgaW5zdGFuY2UuCisgKgorICogQHBhcmFtIDxUPgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEhrMlJlZmVyZW5jaW5nRmFjdG9yeTxUPiBpbXBsZW1lbnRzIEZhY3Rvcnk8VD4geworCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRW1wdHlSZWZlcmVuY2VGYWN0b3J5PFQ+IGltcGxlbWVudHMgRmFjdG9yeTxSZWY8VD4+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlZjxUPiBwcm92aWRlKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlZnMuZW1wdHlSZWYoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKFJlZjxUPiBpbnN0YW5jZSkgeworICAgICAgICAgICAgLy9ub3QgdXNlZAorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSW5pdGlhbGl6ZWRSZWZlcmVuY2VGYWN0b3J5PFQ+IGltcGxlbWVudHMgRmFjdG9yeTxSZWY8VD4+IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFQgaW5pdGlhbFZhbHVlOworCisgICAgICAgIHB1YmxpYyBJbml0aWFsaXplZFJlZmVyZW5jZUZhY3RvcnkoVCBpbml0aWFsVmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMuaW5pdGlhbFZhbHVlID0gaW5pdGlhbFZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZWY8VD4gcHJvdmlkZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZWZzLm9mKGluaXRpYWxWYWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZShSZWY8VD4gaW5zdGFuY2UpIHsKKyAgICAgICAgICAgIC8vbm90IHVzZWQKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8UmVmPFQ+PiByZWZlcmVuY2VGYWN0b3J5OworCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyByZWZlcmVuY2luZyBpbmplY3Rpb24gZmFjdG9yeS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWZlcmVuY2VGYWN0b3J5IHJlZmVyZW5jZSBwcm92aWRlciBiYWNraW5nIHRoZSBmYWN0b3J5LgorICAgICAqLworICAgIHB1YmxpYyBIazJSZWZlcmVuY2luZ0ZhY3RvcnkoUHJvdmlkZXI8UmVmPFQ+PiByZWZlcmVuY2VGYWN0b3J5KSB7CisgICAgICAgIHRoaXMucmVmZXJlbmNlRmFjdG9yeSA9IHJlZmVyZW5jZUZhY3Rvcnk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFQgcHJvdmlkZSgpIHsKKyAgICAgICAgcmV0dXJuIHJlZmVyZW5jZUZhY3RvcnkuZ2V0KCkuZ2V0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZGlzcG9zZShUIGluc3RhbmNlKSB7CisgICAgICAgIC8vbm90IHVzZWQKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSByZWZlcmVuY2UgZmFjdG9yeSBwcm92aWRpbmcgYW4gZW1wdHkgcmVmZXJlbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIDxUPiByZWZlcmVuY2UgdHlwZS4KKyAgICAgKiBAcmV0dXJuIHJlZmVyZW5jZSBmYWN0b3J5IHByb3ZpZGluZyBhbiBlbXB0eSByZWZlcmVuY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8VD4gRmFjdG9yeTxSZWY8VD4+IHJlZmVyZW5jZUZhY3RvcnkoKSB7CisgICAgICAgIHJldHVybiBuZXcgRW1wdHlSZWZlcmVuY2VGYWN0b3J5PFQ+KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgcmVmZXJlbmNlIGZhY3RvcnkgcHJvdmlkaW5nIGFuIGluaXRpYWxpemVkIHJlZmVyZW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSA8VD4gICAgICAgICAgcmVmZXJlbmNlIHR5cGUuCisgICAgICogQHBhcmFtIGluaXRpYWxWYWx1ZSBpbml0aWFsIHZhbHVlIHN0b3JlZCBpbiB0aGUgcmVmZXJlbmNlIHByb3ZpZGVkCisgICAgICogICAgICAgICAgICAgICAgICAgICBieSB0aGUgcmV0dXJuZWQgZmFjdG9yeS4KKyAgICAgKiBAcmV0dXJuIHJlZmVyZW5jZSBmYWN0b3J5IHByb3ZpZGluZyBhIHJlZmVyZW5jZSBpbml0aWFsaXplZCB3aXRoIGFuCisgICAgICogICAgICAgICB7QGNvZGUgaW5pdGlhbFZhbHVlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUPiBGYWN0b3J5PFJlZjxUPj4gcmVmZXJlbmNlRmFjdG9yeShUIGluaXRpYWxWYWx1ZSkgeworICAgICAgICBpZiAoaW5pdGlhbFZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRW1wdHlSZWZlcmVuY2VGYWN0b3J5PFQ+KCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3IEluaXRpYWxpemVkUmVmZXJlbmNlRmFjdG9yeTxUPihpbml0aWFsVmFsdWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2luamVjdC9oazIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvaGsyL0hrMlJlcXVlc3RTY29wZS5qYXZhIGIvaW5qZWN0L2hrMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9oazIvSGsyUmVxdWVzdFNjb3BlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI5ZmIyNAotLS0gL2Rldi9udWxsCisrKyBiL2luamVjdC9oazIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvaGsyL0hrMlJlcXVlc3RTY29wZS5qYXZhCkBAIC0wLDAgKzEsMTYwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5oazI7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5Gb3JlaWduRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLkV4dGVuZGVkTG9nZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuTGF6eVVpZDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLmludGVybmFsLlJlcXVlc3RTY29wZTsKKworaW1wb3J0IHN0YXRpYyBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YS5QcmVjb25kaXRpb25zLmNoZWNrU3RhdGU7CisKK3B1YmxpYyBjbGFzcyBIazJSZXF1ZXN0U2NvcGUgZXh0ZW5kcyBSZXF1ZXN0U2NvcGUgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWwuUmVxdWVzdENvbnRleHQgY3JlYXRlQ29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJbnN0YW5jZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSByZXF1ZXN0IHNjb3BlIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgSW5zdGFuY2UgaW1wbGVtZW50cyBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLmludGVybmFsLlJlcXVlc3RDb250ZXh0IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIEV4dGVuZGVkTG9nZ2VyIGxvZ2dlciA9IG5ldyBFeHRlbmRlZExvZ2dlcihMb2dnZXIuZ2V0TG9nZ2VyKEluc3RhbmNlLmNsYXNzLmdldE5hbWUoKSksIExldmVsLkZJTkVTVCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2NvcGUgaW5zdGFuY2UgVVVJRC4KKyAgICAgICAgICoKKyAgICAgICAgICogRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIGl0J3Mgb25seSBnZW5lcmF0ZWQgaWYgdG9TdHJpbmcoKSBtZXRob2QgaXMgaW52b2tlZCwKKyAgICAgICAgICogZS5nLiBhcyBwYXJ0IG9mIHNvbWUgbG93LWxldmVsIGxvZ2dpbmcuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGZpbmFsIExhenlVaWQgaWQgPSBuZXcgTGF6eVVpZCgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBIG1hcCBvZiBpbmplY3RhYmxlIGluc3RhbmNlcyBpbiB0aGlzIHNjb3BlLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBNYXA8Rm9yZWlnbkRlc2NyaXB0b3IsIE9iamVjdD4gc3RvcmU7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhvbGRzIHRoZSBudW1iZXIgb2Ygc25hcHNob3RzIG9mIHRoaXMgc2NvcGUuCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIGZpbmFsIEF0b21pY0ludGVnZXIgcmVmZXJlbmNlQ291bnRlcjsKKworICAgICAgICBwcml2YXRlIEluc3RhbmNlKCkgeworICAgICAgICAgICAgdGhpcy5zdG9yZSA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgICAgIHRoaXMucmVmZXJlbmNlQ291bnRlciA9IG5ldyBBdG9taWNJbnRlZ2VyKDEpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBhICJuZXciIHJlZmVyZW5jZSBvZiB0aGUgc2NvcGUgaW5zdGFuY2UuIFRoaXMgd2lsbCBpbmNyZWFzZQorICAgICAgICAgKiB0aGUgaW50ZXJuYWwgcmVmZXJlbmNlIGNvdW50ZXIgd2hpY2ggcHJldmVudHMgdGhlIHNjb3BlIGluc3RhbmNlCisgICAgICAgICAqIHRvIGJlIGRlc3Ryb3llZCB1bnRpbCBhIHtAbGluayAjcmVsZWFzZSgpfSBtZXRob2QgaXMgZXhwbGljaXRseQorICAgICAgICAgKiBjYWxsZWQgKG9uY2UgcGVyIGVhY2gge0Bjb2RlIGdldFJlZmVyZW5jZSgpfSBtZXRob2QgY2FsbCkuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gcmVmZXJlbmNlZCBzY29wZSBpbnN0YW5jZS4KKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSGsyUmVxdWVzdFNjb3BlLkluc3RhbmNlIGdldFJlZmVyZW5jZSgpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IHJlcGxhY2UgY291bnRlciB3aXRoIGEgcGhhbnRvbSByZWZlcmVuY2UgKyByZWZlcmVuY2UgcXVldWUtYmFzZWQgc29sdXRpb24KKyAgICAgICAgICAgIHJlZmVyZW5jZUNvdW50ZXIuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgYW4gaW5oYWJpdGFudCBzdG9yZWQgaW4gdGhlIHNjb3BlIGluc3RhbmNlIHRoYXQgbWF0Y2hlcyB0aGUgYWN0aXZlIGRlc2NyaXB0b3IgLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gPFQ+ICAgICAgICBpbmhhYml0YW50IHR5cGUuCisgICAgICAgICAqIEBwYXJhbSBkZXNjcmlwdG9yIGluaGFiaXRhbnQgZGVzY3JpcHRvci4KKyAgICAgICAgICogQHJldHVybiBtYXRjaGVkIGluaGFiaXRhbnQgc3RvcmVkIGluIHRoZSBzY29wZSBpbnN0YW5jZSBvciB7QGNvZGUgbnVsbH0gaWYgbm90IG1hdGNoZWQuCisgICAgICAgICAqLworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgcHVibGljIDxUPiBUIGdldChGb3JlaWduRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7CisgICAgICAgICAgICByZXR1cm4gKFQpIHN0b3JlLmdldChkZXNjcmlwdG9yKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTdG9yZSBhIG5ldyBpbmhhYml0YW50IGZvciB0aGUgZ2l2ZW4gZGVzY3JpcHRvci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIDxUPiAgICAgICAgaW5oYWJpdGFudCB0eXBlLgorICAgICAgICAgKiBAcGFyYW0gZGVzY3JpcHRvciBpbmhhYml0YW50IGRlc2NyaXB0b3IuCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSAgICAgIGluaGFiaXRhbnQgdmFsdWUuCisgICAgICAgICAqIEByZXR1cm4gb2xkIGluaGFiaXRhbnQgcHJldmlvdXNseSBzdG9yZWQgZm9yIHRoZSBnaXZlbiBkZXNjcmlwdG9yIG9yCisgICAgICAgICAqIHtAY29kZSBudWxsfSBpZiBub25lIHN0b3JlZC4KKyAgICAgICAgICovCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICBwdWJsaWMgPFQ+IFQgcHV0KEZvcmVpZ25EZXNjcmlwdG9yIGRlc2NyaXB0b3IsIFQgdmFsdWUpIHsKKyAgICAgICAgICAgIGNoZWNrU3RhdGUoIXN0b3JlLmNvbnRhaW5zS2V5KGRlc2NyaXB0b3IpLAorICAgICAgICAgICAgICAgICAgICAiQW4gaW5zdGFuY2UgZm9yIHRoZSBkZXNjcmlwdG9yICVzIHdhcyBhbHJlYWR5IHNlZWRlZCBpbiB0aGlzIHNjb3BlLiBPbGQgaW5zdGFuY2U6ICVzIE5ldyBpbnN0YW5jZTogJXMiLAorICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICBzdG9yZS5nZXQoZGVzY3JpcHRvciksCisgICAgICAgICAgICAgICAgICAgIHZhbHVlKTsKKworICAgICAgICAgICAgcmV0dXJuIChUKSBzdG9yZS5wdXQoZGVzY3JpcHRvciwgdmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlbW92ZSBhIHZhbHVlIGZvciB0aGUgZGVzY3JpcHRvciBpZiBwcmVzZW50IGluIHRoZSBzY29wZSBpbnN0YW5jZSBzdG9yZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGRlc2NyaXB0b3Iga2V5IGZvciB0aGUgdmFsdWUgdG8gYmUgcmVtb3ZlZC4KKyAgICAgICAgICovCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICBwdWJsaWMgPFQ+IHZvaWQgcmVtb3ZlKEZvcmVpZ25EZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKKyAgICAgICAgICAgIGZpbmFsIFQgcmVtb3ZlZCA9IChUKSBzdG9yZS5yZW1vdmUoZGVzY3JpcHRvcik7CisgICAgICAgICAgICBpZiAocmVtb3ZlZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5kaXNwb3NlKHJlbW92ZWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoRm9yZWlnbkRlc2NyaXB0b3IgcHJvdmlkZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBzdG9yZS5jb250YWluc0tleShwcm92aWRlcik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVsZWFzZSBhIHNpbmdsZSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgcmVxdWVzdCBzY29wZSBpbnN0YW5jZS4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIE9uY2UgYWxsIGluc3RhbmNlIHJlZmVyZW5jZXMgYXJlIHJlbGVhc2VkLCB0aGUgaW5zdGFuY2Ugd2lsbCBiZSByZWN5Y2xlZC4KKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCByZWxlYXNlKCkgeworICAgICAgICAgICAgaWYgKHJlZmVyZW5jZUNvdW50ZXIuZGVjcmVtZW50QW5kR2V0KCkgPCAxKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbmV3IEhhc2hTZXQ8PihzdG9yZS5rZXlTZXQoKSkuZm9yRWFjaCh0aGlzOjpyZW1vdmUpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1Z0xvZygiUmVsZWFzZWQgc2NvcGUgaW5zdGFuY2UgezB9IiwgdGhpcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIkluc3RhbmNleyIKKyAgICAgICAgICAgICAgICAgICAgKyAiaWQ9IiArIGlkCisgICAgICAgICAgICAgICAgICAgICsgIiwgcmVmZXJlbmNlQ291bnRlcj0iICsgcmVmZXJlbmNlQ291bnRlcgorICAgICAgICAgICAgICAgICAgICArICIsIHN0b3JlIHNpemU9IiArIHN0b3JlLnNpemUoKQorICAgICAgICAgICAgICAgICAgICArICd9JzsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvaW5qZWN0L2hrMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9oazIvSW1tZWRpYXRlSGsySW5qZWN0aW9uTWFuYWdlci5qYXZhIGIvaW5qZWN0L2hrMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9oazIvSW1tZWRpYXRlSGsySW5qZWN0aW9uTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNjljYTQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmplY3QvaGsyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2hrMi9JbW1lZGlhdGVIazJJbmplY3Rpb25NYW5hZ2VyLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuaGsyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkJpbmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQmluZGluZzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLmFwaS5TZXJ2aWNlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi51dGlsaXRpZXMuU2VydmljZUxvY2F0b3JVdGlsaXRpZXM7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyfSB0aGF0IGlzIGFibGUgdG8gcmVnaXN0ZXIgYW5kIGluamVjdCBzZXJ2aWNlcy4KKyAqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworcHVibGljIGNsYXNzIEltbWVkaWF0ZUhrMkluamVjdGlvbk1hbmFnZXIgZXh0ZW5kcyBBYnN0cmFjdEhrMkluamVjdGlvbk1hbmFnZXIgeworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3Igd2l0aCBwYXJlbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyZW50IHBhcmVudCBvZiB0eXBlIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcn0gb3Ige0BsaW5rIFNlcnZpY2VMb2NhdG9yfS4KKyAgICAgKi8KKyAgICBJbW1lZGlhdGVIazJJbmplY3Rpb25NYW5hZ2VyKE9iamVjdCBwYXJlbnQpIHsKKyAgICAgICAgc3VwZXIocGFyZW50KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjb21wbGV0ZVJlZ2lzdHJhdGlvbigpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgICAgICAvLyBOby1vcCBtZXRob2QuCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXIoQmluZGluZyBiaW5kaW5nKSB7CisgICAgICAgIEhrMkhlbHBlci5iaW5kKGdldFNlcnZpY2VMb2NhdG9yKCksIGJpbmRpbmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyKEl0ZXJhYmxlPEJpbmRpbmc+IGRlc2NyaXB0b3JzKSB7CisgICAgICAgIEhrMkhlbHBlci5iaW5kKGdldFNlcnZpY2VMb2NhdG9yKCksIGRlc2NyaXB0b3JzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlcihCaW5kZXIgYmluZGVyKSB7CisgICAgICAgIEhrMkhlbHBlci5iaW5kKHRoaXMsIGJpbmRlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXIoT2JqZWN0IHByb3ZpZGVyKSB7CisgICAgICAgIGlmIChpc1JlZ2lzdHJhYmxlKHByb3ZpZGVyLmdldENsYXNzKCkpKSB7CisgICAgICAgICAgICBTZXJ2aWNlTG9jYXRvclV0aWxpdGllcy5iaW5kKGdldFNlcnZpY2VMb2NhdG9yKCksIChvcmcuZ2xhc3NmaXNoLmhrMi51dGlsaXRpZXMuQmluZGVyKSBwcm92aWRlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLkhLXzJfUFJPVklERVJfTk9UX1JFR0lTVFJBQkxFKHByb3ZpZGVyLmdldENsYXNzKCkpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2luamVjdC9oazIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvaGsyL0luamVjdGlvblJlc29sdmVyV3JhcHBlci5qYXZhIGIvaW5qZWN0L2hrMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9oazIvSW5qZWN0aW9uUmVzb2x2ZXJXcmFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM0NDVmYgotLS0gL2Rldi9udWxsCisrKyBiL2luamVjdC9oazIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvaGsyL0luamVjdGlvblJlc29sdmVyV3JhcHBlci5qYXZhCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0LmhrMjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkZvcmVpZ25EZXNjcmlwdG9ySW1wbDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0ZWVJbXBsOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUmVmbGVjdGlvbkhlbHBlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLmFwaS5GYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLmFwaS5JbmplY3RlZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi5hcGkuSW5qZWN0aW9uUmVzb2x2ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIuYXBpLlNlcnZpY2VIYW5kbGU7CisKKy8qKgorICogVGhpcyBjbGFzcyB3cmFwcyB0aGUgamVyc2V5IGNsYXNzIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uUmVzb2x2ZXJ9IHRvIG1ha2UgSEsyIHZlcnNpb24gb2YgdGhpcworICogcHJvdmlkZWQgZnVuY3Rpb25hbGl0eS4gSEsyIHtAbGluayBJbmplY3Rpb25SZXNvbHZlcn0gY2FuIGJlIHRoZW4gcmVnaXN0ZXIgaW4ge0BsaW5rIG9yZy5nbGFzc2Zpc2guaGsyLmFwaS5TZXJ2aWNlTG9jYXRvcn0gYW5kCisgKiBISzIgY2FuIGhhbmRsZSB0aGUgYW5ub3RhdGlvbiB3aGljaCBpcyByZWdpc3RlciBhbG9uZyB3aXRoIHRoZSBpbnRlcmZhY2UuCisgKi8KK0BTaW5nbGV0b24KK3B1YmxpYyBjbGFzcyBJbmplY3Rpb25SZXNvbHZlcldyYXBwZXI8VCBleHRlbmRzIEFubm90YXRpb24+IGltcGxlbWVudHMgSW5qZWN0aW9uUmVzb2x2ZXI8VD4geworCisgICAgcHJpdmF0ZSBmaW5hbCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uUmVzb2x2ZXIgamVyc2V5UmVzb2x2ZXI7CisKKyAgICAvKioKKyAgICAgKiBDJ3RvciBhY2NlcHRzIGplcnNleS1saWtlIHtAY29kZSBJbmplY3Rpb25SZXNvbHZlcn0gb24gd2hpY2ggdGhlIHRoZSBwcm9jZXNzaW5nIGlzIGRlbGVnYXRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBqZXJzZXlSZXNvbHZlciBqZXJzZXkgaW5qZWN0aW9uIHJlc29sdmVyLgorICAgICAqLworICAgIEluamVjdGlvblJlc29sdmVyV3JhcHBlcihvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uUmVzb2x2ZXI8VD4gamVyc2V5UmVzb2x2ZXIpIHsKKyAgICAgICAgdGhpcy5qZXJzZXlSZXNvbHZlciA9IGplcnNleVJlc29sdmVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgcmVzb2x2ZShJbmplY3RlZSBpbmplY3RlZSwgU2VydmljZUhhbmRsZSByb290KSB7CisgICAgICAgIEluamVjdGVlSW1wbCBpbmplY3RlZVdyYXBwZXIgPSBuZXcgSW5qZWN0ZWVJbXBsKCk7CisgICAgICAgIGluamVjdGVlV3JhcHBlci5zZXRSZXF1aXJlZFR5cGUoaW5qZWN0ZWUuZ2V0UmVxdWlyZWRUeXBlKCkpOworICAgICAgICBpbmplY3RlZVdyYXBwZXIuc2V0UGFyZW50KGluamVjdGVlLmdldFBhcmVudCgpKTsKKyAgICAgICAgaW5qZWN0ZWVXcmFwcGVyLnNldFJlcXVpcmVkUXVhbGlmaWVycyhpbmplY3RlZS5nZXRSZXF1aXJlZFF1YWxpZmllcnMoKSk7CisgICAgICAgIGluamVjdGVlV3JhcHBlci5zZXRPcHRpb25hbChpbmplY3RlZS5pc09wdGlvbmFsKCkpOworICAgICAgICBpbmplY3RlZVdyYXBwZXIuc2V0UG9zaXRpb24oaW5qZWN0ZWUuZ2V0UG9zaXRpb24oKSk7CisgICAgICAgIGluamVjdGVlV3JhcHBlci5zZXRGYWN0b3J5KFJlZmxlY3Rpb25IZWxwZXIuaXNTdWJDbGFzc09mKGluamVjdGVlLmdldFJlcXVpcmVkVHlwZSgpLCBGYWN0b3J5LmNsYXNzKSk7CisgICAgICAgIGluamVjdGVlV3JhcHBlci5zZXRJbmplY3RlZURlc2NyaXB0b3IobmV3IEZvcmVpZ25EZXNjcmlwdG9ySW1wbChpbmplY3RlZS5nZXRJbmplY3RlZURlc2NyaXB0b3IoKSkpOworCisgICAgICAgIE9iamVjdCBpbnN0YW5jZSA9IGplcnNleVJlc29sdmVyLnJlc29sdmUoaW5qZWN0ZWVXcmFwcGVyKTsKKyAgICAgICAgaWYgKGluamVjdGVlV3JhcHBlci5pc0ZhY3RvcnkoKSkgeworICAgICAgICAgICAgcmV0dXJuIGFzRmFjdG9yeShpbnN0YW5jZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIEZhY3RvcnkgYXNGYWN0b3J5KE9iamVjdCBpbnN0YW5jZSkgeworICAgICAgICByZXR1cm4gbmV3IEZhY3RvcnkoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgcHJvdmlkZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZShmaW5hbCBPYmplY3QgaW5zdGFuY2UpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbnN0cnVjdG9yUGFyYW1ldGVySW5kaWNhdG9yKCkgeworICAgICAgICByZXR1cm4gamVyc2V5UmVzb2x2ZXIuaXNDb25zdHJ1Y3RvclBhcmFtZXRlckluZGljYXRvcigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzTWV0aG9kUGFyYW1ldGVySW5kaWNhdG9yKCkgeworICAgICAgICByZXR1cm4gamVyc2V5UmVzb2x2ZXIuaXNNZXRob2RQYXJhbWV0ZXJJbmRpY2F0b3IoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9pbmplY3QvaGsyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2hrMi9JbnN0YW5jZVN1cHBsaWVyRmFjdG9yeUJyaWRnZS5qYXZhIGIvaW5qZWN0L2hrMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9oazIvSW5zdGFuY2VTdXBwbGllckZhY3RvcnlCcmlkZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTE5NDI3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5qZWN0L2hrMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9oazIvSW5zdGFuY2VTdXBwbGllckZhY3RvcnlCcmlkZ2UuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5oazI7CisKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuRGlzcG9zYWJsZVN1cHBsaWVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIuYXBpLkZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIuYXBpLlNlcnZpY2VMb2NhdG9yOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgdXNlZCBhcyBhIGJyaWRnZSBiZXR3ZWVuIHtAbGluayBGYWN0b3J5IEhLMiBGYWN0b3J5fSBhbmQgSkRLIHtAbGluayBTdXBwbGllcn0uIFVzaW5nIHRoaXMgY2xhc3Mge0BsaW5rIFN1cHBsaWVyfQorICogaXMgYWJsZSB0byBiZWhhdmUgYXMgYSBmYWN0b3J5IGluIHNlcnZpY2UgbG9jYXRvci4gVGhlIGJyaWRnZSBqdXN0IGRlbGVnYXRlcyBhbGwgaW52b2NhdGlvbnMgdG8gcHJvdmlkZWQge0BsaW5rIFNlcnZpY2VMb2NhdG9yfQorICogYW5kIHRoZXJlZm9yZSBhbGwgb3BlcmF0aW9uIHNob3VsZCBiZSBpbiBwcm9wZXIgc2NvcGUgYW5kIGNvbnRleHQuCisgKiA8cD4KKyAqIFRoaXMgYnJpZGdlIGlzIGRlZGljYXRlZCB0byBpbnN0YW5jZSBiaW5kaW5nIHRoZXJlZm9yZSB1bmRlcmx5aW5nIHtAY29kZSBzdXBwbGllcn0gaXMgYWx3YXlzIG9ubHkgc2luZ2xlIGluc3RhbmNlLgorICoKKyAqIEBwYXJhbSA8VD4gdHlwZSB3aGljaCBjb3VsZCBiZSBoYW5kbGVkIGJ5IHtAY29kZSBTdXBwbGllcn0gYW5kIHRoaXMgYnJpZGdlLgorICovCitwdWJsaWMgY2xhc3MgSW5zdGFuY2VTdXBwbGllckZhY3RvcnlCcmlkZ2U8VD4gaW1wbGVtZW50cyBGYWN0b3J5PFQ+IHsKKworICAgIHByaXZhdGUgU3VwcGxpZXI8VD4gc3VwcGxpZXI7CisgICAgcHJpdmF0ZSBib29sZWFuIGRpc3Bvc2FibGU7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYSBuZXcgYnJpZGdlLgorICAgICAqCisgICAgICogQHBhcmFtIHN1cHBsaWVyICAgdHlwZSB3aGljaCB3aWxsIGJlIGxvb2tlZCBmb3IgaW4gbG9jYXRvci4KKyAgICAgKiBAcGFyYW0gZGlzcG9zYWJsZSBmbGFnIHdoZXRoZXIgdGhlIGJyaWRnZSBpcyBzZXQgdXAgZm9yIGRpc3Bvc2luZyB0aGUgY3JlYXRlZCBvYmplY3QuCisgICAgICovCisgICAgSW5zdGFuY2VTdXBwbGllckZhY3RvcnlCcmlkZ2UoU3VwcGxpZXI8VD4gc3VwcGxpZXIsIGJvb2xlYW4gZGlzcG9zYWJsZSkgeworICAgICAgICB0aGlzLnN1cHBsaWVyID0gc3VwcGxpZXI7CisgICAgICAgIHRoaXMuZGlzcG9zYWJsZSA9IGRpc3Bvc2FibGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFQgcHJvdmlkZSgpIHsKKyAgICAgICAgcmV0dXJuIHN1cHBsaWVyLmdldCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoVCBpbnN0YW5jZSkgeworICAgICAgICBpZiAoZGlzcG9zYWJsZSkgeworICAgICAgICAgICAgKChEaXNwb3NhYmxlU3VwcGxpZXI8VD4pIHN1cHBsaWVyKS5kaXNwb3NlKGluc3RhbmNlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2luamVjdC9oazIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvaGsyL0plcnNleUNsYXNzQW5hbHl6ZXIuamF2YSBiL2luamVjdC9oazIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvaGsyL0plcnNleUNsYXNzQW5hbHl6ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjBlMjhjCi0tLSAvZGV2L251bGwKKysrIGIvaW5qZWN0L2hrMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9oazIvSmVyc2V5Q2xhc3NBbmFseXplci5qYXZhCkBAIC0wLDAgKzEsMjM2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5oazI7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS5zZWN1cml0eS5Qcml2aWxlZ2VkQWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuTmFtZWQ7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkVycm9yczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uUmVzb2x2ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLkltbXV0YWJsZUNvbGxlY3RvcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLkxhenlWYWx1ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uVmFsdWU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLlZhbHVlczsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLmFwaS5DbGFzc0FuYWx5emVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLmFwaS5NdWx0aUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi5hcGkuU2VydmljZUxvY2F0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIudXRpbGl0aWVzLmJpbmRpbmcuQWJzdHJhY3RCaW5kZXI7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBDbGFzc0FuYWx5emVyfSB0aGF0IHN1cHBvcnRzIHNlbGVjdGlvbgorICogb2YgdGhlIGNvbnN0cnVjdG9yIHdpdGggbGFyZ2VzdCBudW1iZXIgb2YgcGFyYW1ldGVycyBhcyBkZWZpbmVkIGluCisgKiBhbmQgcmVxdWlyZWQgYnkgSkFYLVJTIHNwZWNpZmljYXRpb24uCisgKgorICogQGF1dGhvciBKb2huIFdlbGxzIChqb2huLndlbGxzIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitAU2luZ2xldG9uCitATmFtZWQoSmVyc2V5Q2xhc3NBbmFseXplci5OQU1FKQorcHVibGljIGZpbmFsIGNsYXNzIEplcnNleUNsYXNzQW5hbHl6ZXIgaW1wbGVtZW50cyBDbGFzc0FuYWx5emVyIHsKKworICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhlIGFuYWx5emVyIHNlcnZpY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJKZXJzZXlDbGFzc0FuYWx5emVyIjsKKworICAgIC8qKgorICAgICAqIEJpbmRlciBmb3IgdGhlIEpBWC1SUyBjb21wbGlhbnQgY2xhc3MgYW5hbHl6ZXIgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCaW5kZXIgZXh0ZW5kcyBBYnN0cmFjdEJpbmRlciB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZXJ2aWNlTG9jYXRvciBzZXJ2aWNlTG9jYXRvcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0b3IgZm9yIHtAY29kZSBKZXJzZXlDbGFzc0FuYWx5emVyfS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHNlcnZpY2VMb2NhdG9yIGN1cnJlbnQgaW5qZWN0aW9uIG1hbmFnZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQmluZGVyKFNlcnZpY2VMb2NhdG9yIHNlcnZpY2VMb2NhdG9yKSB7CisgICAgICAgICAgICB0aGlzLnNlcnZpY2VMb2NhdG9yID0gc2VydmljZUxvY2F0b3I7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICAgICAgQ2xhc3NBbmFseXplciBkZWZhdWx0QW5hbHl6ZXIgPQorICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlTG9jYXRvci5nZXRTZXJ2aWNlKENsYXNzQW5hbHl6ZXIuY2xhc3MsIENsYXNzQW5hbHl6ZXIuREVGQVVMVF9JTVBMRU1FTlRBVElPTl9OQU1FKTsKKworICAgICAgICAgICAgU3VwcGxpZXI8TGlzdDxJbmplY3Rpb25SZXNvbHZlcj4+IHJlc29sdmVycyA9ICgpIC0+IHNlcnZpY2VMb2NhdG9yLmdldEFsbFNlcnZpY2VzKEluamVjdGlvblJlc29sdmVyLmNsYXNzKTsKKworICAgICAgICAgICAgYmluZChuZXcgSmVyc2V5Q2xhc3NBbmFseXplcihkZWZhdWx0QW5hbHl6ZXIsIHJlc29sdmVycykpCisgICAgICAgICAgICAgICAgICAgIC5hbmFseXplV2l0aChDbGFzc0FuYWx5emVyLkRFRkFVTFRfSU1QTEVNRU5UQVRJT05fTkFNRSkKKyAgICAgICAgICAgICAgICAgICAgLm5hbWVkKEplcnNleUNsYXNzQW5hbHl6ZXIuTkFNRSkKKyAgICAgICAgICAgICAgICAgICAgLnRvKENsYXNzQW5hbHl6ZXIuY2xhc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBDbGFzc0FuYWx5emVyIGRlZmF1bHRBbmFseXplcjsKKyAgICBwcml2YXRlIGZpbmFsIExhenlWYWx1ZTxTZXQ8Q2xhc3M+PiByZXNvbHZlckFubm90YXRpb25zOworICAgIC8qKgorICAgICAqIEluamVjdGlvbiBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZWZhdWx0QW5hbHl6ZXIgICBkZWZhdWx0IEhLMiBjbGFzcyBhbmFseXplci4KKyAgICAgKiBAcGFyYW0gc3VwcGxpZXJSZXNvbHZlcnMgY29uZmlndXJlZCBpbmplY3Rpb24gcmVzb2x2ZXJzLgorICAgICAqLworICAgIHByaXZhdGUgSmVyc2V5Q2xhc3NBbmFseXplcihDbGFzc0FuYWx5emVyIGRlZmF1bHRBbmFseXplciwgU3VwcGxpZXI8TGlzdDxJbmplY3Rpb25SZXNvbHZlcj4+IHN1cHBsaWVyUmVzb2x2ZXJzKSB7CisgICAgICAgIHRoaXMuZGVmYXVsdEFuYWx5emVyID0gZGVmYXVsdEFuYWx5emVyOworICAgICAgICBWYWx1ZTxTZXQ8Q2xhc3M+PiByZXNvbHZlcnMgPSAoKSAtPiBzdXBwbGllclJlc29sdmVycy5nZXQoKS5zdHJlYW0oKQorICAgICAgICAgICAgICAgIC5maWx0ZXIoSW5qZWN0aW9uUmVzb2x2ZXI6OmlzQ29uc3RydWN0b3JQYXJhbWV0ZXJJbmRpY2F0b3IpCisgICAgICAgICAgICAgICAgLm1hcChJbmplY3Rpb25SZXNvbHZlcjo6Z2V0QW5ub3RhdGlvbikKKyAgICAgICAgICAgICAgICAuY29sbGVjdChJbW11dGFibGVDb2xsZWN0b3JzLnRvSW1tdXRhYmxlU2V0KCkpOworICAgICAgICB0aGlzLnJlc29sdmVyQW5ub3RhdGlvbnMgPSBWYWx1ZXMubGF6eShyZXNvbHZlcnMpOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gQ29uc3RydWN0b3I8VD4gZ2V0Q29uc3RydWN0b3IoZmluYWwgQ2xhc3M8VD4gY2xhenopIHRocm93cyBNdWx0aUV4Y2VwdGlvbiwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGNsYXp6LmlzTG9jYWxDbGFzcygpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoTWV0aG9kRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLklOSkVDVElPTl9FUlJPUl9MT0NBTF9DTEFTU19OT1RfU1VQUE9SVEVEKGNsYXp6LmdldE5hbWUoKSkpOworICAgICAgICB9CisgICAgICAgIGlmIChjbGF6ei5pc01lbWJlckNsYXNzKCkgJiYgIU1vZGlmaWVyLmlzU3RhdGljKGNsYXp6LmdldE1vZGlmaWVycygpKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaE1ldGhvZEV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgTG9jYWxpemF0aW9uTWVzc2FnZXMuSU5KRUNUSU9OX0VSUk9SX05PTlNUQVRJQ19NRU1CRVJfQ0xBU1NfTk9UX1NVUFBPUlRFRChjbGF6ei5nZXROYW1lKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIENvbnN0cnVjdG9yPFQ+IHJldFZhbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldFZhbCA9IGRlZmF1bHRBbmFseXplci5nZXRDb25zdHJ1Y3RvcihjbGF6eik7CisKKyAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+W10gYXJncyA9IHJldFZhbC5nZXRQYXJhbWV0ZXJUeXBlcygpOworICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0VmFsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJcyB6ZXJvIGxlbmd0aCwgYnV0IGlzIGl0IHNwZWNpZmljYWxseSBtYXJrZWQ/CisgICAgICAgICAgICBmaW5hbCBJbmplY3QgaSA9IHJldFZhbC5nZXRBbm5vdGF0aW9uKEluamVjdC5jbGFzcyk7CisgICAgICAgICAgICBpZiAoaSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldFZhbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCB0aGUgZGVmYXVsdCBjaG9zZSBhIHplcm8tYXJnIGNvbnN0cnVjdG9yIHNpbmNlIGl0IGNvdWxkIGZpbmQgbm8gb3RoZXIKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGlnbm9yZWQpIHsKKyAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgdGhlIGRlZmF1bHQgZmFpbGVkIGJlY2F1c2UgaXQgZm91bmQgbm8gY29uc3RydWN0b3IgaXQgY291bGQgdXNlCisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIE11bHRpRXhjZXB0aW9uIG1lKSB7CisgICAgICAgICAgICBpZiAobWUuZ2V0RXJyb3JzKCkuc2l6ZSgpICE9IDEgJiYgIShtZS5nZXRFcnJvcnMoKS5nZXQoMCkgaW5zdGFuY2VvZiBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24pKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHRoZSBkZWZhdWx0IGZhaWxlZCBiZWNhdXNlIGl0IGZvdW5kIG1vcmUgdGhhbiBvbmUgY29uc3RydWN0b3IKKyAgICAgICAgfQorCisgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIHdlIHNpbXBseSBuZWVkIHRvIGZpbmQgdGhlIGNvbnN0cnVjdG9yIHdpdGggdGhlIGxhcmdlc3QgbnVtYmVyIG9mIHBhcmFtZXRlcnMKKyAgICAgICAgZmluYWwgQ29uc3RydWN0b3I8Pz5bXSBjb25zdHJ1Y3RvcnMgPSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZCgKKyAgICAgICAgICAgICAgICAoUHJpdmlsZWdlZEFjdGlvbjxDb25zdHJ1Y3Rvcjw/PltdPikgY2xheno6OmdldERlY2xhcmVkQ29uc3RydWN0b3JzKTsKKyAgICAgICAgQ29uc3RydWN0b3I8Pz4gc2VsZWN0ZWQgPSBudWxsOworICAgICAgICBpbnQgc2VsZWN0ZWRTaXplID0gMDsKKyAgICAgICAgaW50IG1heFBhcmFtcyA9IC0xOworCisgICAgICAgIGZvciAoZmluYWwgQ29uc3RydWN0b3I8Pz4gY29uc3RydWN0b3IgOiBjb25zdHJ1Y3RvcnMpIHsKKyAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+W10gcGFyYW1zID0gY29uc3RydWN0b3IuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKKyAgICAgICAgICAgIGlmIChwYXJhbXMubGVuZ3RoID49IG1heFBhcmFtcyAmJiBpc0NvbXBhdGlibGUoY29uc3RydWN0b3IpKSB7CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPiBtYXhQYXJhbXMpIHsKKyAgICAgICAgICAgICAgICAgICAgbWF4UGFyYW1zID0gcGFyYW1zLmxlbmd0aDsKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRTaXplID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzZWxlY3RlZCA9IGNvbnN0cnVjdG9yOworICAgICAgICAgICAgICAgIHNlbGVjdGVkU2l6ZSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlbGVjdGVkU2l6ZSA9PSAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoTWV0aG9kRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLklOSkVDVElPTl9FUlJPUl9TVUlUQUJMRV9DT05TVFJVQ1RPUl9OT1RfRk9VTkQoY2xhenouZ2V0TmFtZSgpKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2VsZWN0ZWRTaXplID4gMSkgeworICAgICAgICAgICAgLy8gRm91bmQgezB9IGNvbnN0cnVjdG9ycyB3aXRoIHsxfSBwYXJhbWV0ZXJzIGluIHsyfSBjbGFzcy4gU2VsZWN0aW5nIHRoZSBmaXJzdCBmb3VuZCBjb25zdHJ1Y3RvcjogezN9CisgICAgICAgICAgICBFcnJvcnMud2FybmluZyhjbGF6eiwgTG9jYWxpemF0aW9uTWVzc2FnZXMuTVVMVElQTEVfTUFUQ0hJTkdfQ09OU1RSVUNUT1JTX0ZPVU5EKAorICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFNpemUsIG1heFBhcmFtcywgY2xhenouZ2V0TmFtZSgpLCBzZWxlY3RlZC50b0dlbmVyaWNTdHJpbmcoKSkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChDb25zdHJ1Y3RvcjxUPikgc2VsZWN0ZWQ7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoIk1hZ2ljQ29uc3RhbnQiKQorICAgIHByaXZhdGUgYm9vbGVhbiBpc0NvbXBhdGlibGUoZmluYWwgQ29uc3RydWN0b3I8Pz4gY29uc3RydWN0b3IpIHsKKyAgICAgICAgaWYgKGNvbnN0cnVjdG9yLmdldEFubm90YXRpb24oSW5qZWN0LmNsYXNzKSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBKU1ItMzMwIGFwcGxpY2FibGUKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgaW50IHBhcmFtU2l6ZSA9IGNvbnN0cnVjdG9yLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoOworCisgICAgICAgIGlmIChwYXJhbVNpemUgIT0gMCAmJiByZXNvbHZlckFubm90YXRpb25zLmdldCgpLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFNb2RpZmllci5pc1B1YmxpYyhjb25zdHJ1Y3Rvci5nZXRNb2RpZmllcnMoKSkpIHsKKyAgICAgICAgICAgIC8vIHJldHVybiB0cnVlIGZvciBhIGRlZmF1bHQgY29uc3RydWN0b3IsIHJldHVybiBmYWxzZSBvdGhlcndpc2UuCisgICAgICAgICAgICByZXR1cm4gcGFyYW1TaXplID09IDAKKyAgICAgICAgICAgICAgICAgICAgJiYgKGNvbnN0cnVjdG9yLmdldERlY2xhcmluZ0NsYXNzKCkuZ2V0TW9kaWZpZXJzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiAoTW9kaWZpZXIuUFVCTElDIHwgTW9kaWZpZXIuUFJPVEVDVEVEIHwgTW9kaWZpZXIuUFJJVkFURSkpID09IGNvbnN0cnVjdG9yLmdldE1vZGlmaWVycygpOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChmaW5hbCBBbm5vdGF0aW9uW10gcGFyYW1Bbm5vdGF0aW9ucyA6IGNvbnN0cnVjdG9yLmdldFBhcmFtZXRlckFubm90YXRpb25zKCkpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoZmluYWwgQW5ub3RhdGlvbiBwYXJhbUFubm90YXRpb24gOiBwYXJhbUFubm90YXRpb25zKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlc29sdmVyQW5ub3RhdGlvbnMuZ2V0KCkuY29udGFpbnMocGFyYW1Bbm5vdGF0aW9uLmFubm90YXRpb25UeXBlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gU2V0PE1ldGhvZD4gZ2V0SW5pdGlhbGl6ZXJNZXRob2RzKGZpbmFsIENsYXNzPFQ+IGNsYXp6KSB0aHJvd3MgTXVsdGlFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZGVmYXVsdEFuYWx5emVyLmdldEluaXRpYWxpemVyTWV0aG9kcyhjbGF6eik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxUPiBTZXQ8RmllbGQ+IGdldEZpZWxkcyhmaW5hbCBDbGFzczxUPiBjbGF6eikgdGhyb3dzIE11bHRpRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRBbmFseXplci5nZXRGaWVsZHMoY2xhenopOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gTWV0aG9kIGdldFBvc3RDb25zdHJ1Y3RNZXRob2QoZmluYWwgQ2xhc3M8VD4gY2xhenopIHRocm93cyBNdWx0aUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBkZWZhdWx0QW5hbHl6ZXIuZ2V0UG9zdENvbnN0cnVjdE1ldGhvZChjbGF6eik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxUPiBNZXRob2QgZ2V0UHJlRGVzdHJveU1ldGhvZChmaW5hbCBDbGFzczxUPiBjbGF6eikgdGhyb3dzIE11bHRpRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGRlZmF1bHRBbmFseXplci5nZXRQcmVEZXN0cm95TWV0aG9kKGNsYXp6KTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL2luamVjdC9oazIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvaGsyL0plcnNleUVycm9yU2VydmljZS5qYXZhIGIvaW5qZWN0L2hrMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9oazIvSmVyc2V5RXJyb3JTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJhZGEzNwotLS0gL2Rldi9udWxsCisrKyBiL2luamVjdC9oazIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvaGsyL0plcnNleUVycm9yU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0LmhrMjsKKworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuRXJyb3JzOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIuYXBpLkVycm9ySW5mb3JtYXRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIuYXBpLkVycm9yU2VydmljZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi5hcGkuTXVsdGlFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIudXRpbGl0aWVzLmJpbmRpbmcuQWJzdHJhY3RCaW5kZXI7CisKKy8qKgorICogSmVyc2V5IGltcGxlbWVudGF0aW9uIG9mIEhLMiBFcnJvciBTZXJ2aWNlIHRvIHByb3ZpZGUgaW1wcm92ZWQgcmVwb3J0aW5nCisgKiBvZiBISzIgaXNzdWVzLCB0aGF0IG1heSBiZSBvdGhlcndpc2UgaGlkZGVuIChpZ25vcmVkKS4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgZmluYWwgY2xhc3MgSmVyc2V5RXJyb3JTZXJ2aWNlIGltcGxlbWVudHMgRXJyb3JTZXJ2aWNlIHsKKworICAgIC8qKgorICAgICAqIEJpbmRlciBmb3IgdGhlIEplcnNleSBpbXBsZW1lbnRhdGlvbiBvZiBISzIge0BsaW5rIEVycm9yU2VydmljZX0gY29udHJhY3QuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCaW5kZXIgZXh0ZW5kcyBBYnN0cmFjdEJpbmRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIGJpbmQoSmVyc2V5RXJyb3JTZXJ2aWNlLmNsYXNzKS50byhFcnJvclNlcnZpY2UuY2xhc3MpLmluKFNpbmdsZXRvbi5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkZhaWx1cmUoZmluYWwgRXJyb3JJbmZvcm1hdGlvbiBlcnJvcikgdGhyb3dzIE11bHRpRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIG1zZzsKKworICAgICAgICBzd2l0Y2ggKGVycm9yLmdldEVycm9yVHlwZSgpKSB7CisgICAgICAgICAgICBjYXNlIEZBSUxVUkVfVE9fUkVJRlk6CisgICAgICAgICAgICAgICAgbXNnID0gTG9jYWxpemF0aW9uTWVzc2FnZXMuSEtfMl9SRUlGSUNBVElPTl9FUlJPUigKKyAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLmdldERlc2NyaXB0b3IoKS5nZXRJbXBsZW1lbnRhdGlvbigpLCBwcmludFN0YWNrVHJhY2UoZXJyb3IuZ2V0QXNzb2NpYXRlZEV4Y2VwdGlvbigpKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIG1zZyA9IExvY2FsaXphdGlvbk1lc3NhZ2VzLkhLXzJfVU5LTk9XTl9FUlJPUihwcmludFN0YWNrVHJhY2UoZXJyb3IuZ2V0QXNzb2NpYXRlZEV4Y2VwdGlvbigpKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgRXJyb3JzLndhcm5pbmcoZXJyb3IuZ2V0SW5qZWN0ZWUoKSwgbXNnKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBFcnJvcnMucHJvY2VzcyhuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBFcnJvcnMud2FybmluZyh0aGlzLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5IS18yX0ZBSUxVUkVfT1VUU0lERV9FUlJPUl9TQ09QRSgpKTsKKyAgICAgICAgICAgICAgICAgICAgRXJyb3JzLndhcm5pbmcoZXJyb3IuZ2V0SW5qZWN0ZWUoKSwgbXNnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHByaW50U3RhY2tUcmFjZShUaHJvd2FibGUgdCkgeworICAgICAgICBmaW5hbCBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIHQucHJpbnRTdGFja1RyYWNlKG5ldyBQcmludFdyaXRlcihzdykpOworICAgICAgICByZXR1cm4gc3cudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9pbmplY3QvaGsyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2hrMi9SZXF1ZXN0Q29udGV4dC5qYXZhIGIvaW5qZWN0L2hrMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9oazIvUmVxdWVzdENvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmJhOGExCi0tLSAvZGV2L251bGwKKysrIGIvaW5qZWN0L2hrMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9oazIvUmVxdWVzdENvbnRleHQuamF2YQpAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuaGsyOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5Gb3JlaWduRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLmludGVybmFsLlJlcXVlc3RTY29wZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLmludGVybmFsLlJlcXVlc3RTY29wZWQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi5hcGkuQWN0aXZlRGVzY3JpcHRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi5hcGkuQ29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi5hcGkuU2VydmljZUhhbmRsZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi5hcGkuVHlwZUxpdGVyYWw7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIudXRpbGl0aWVzLmJpbmRpbmcuQWJzdHJhY3RCaW5kZXI7CisKKy8qKgorICogQ2xhc3MgaXMgYWJsZSB0byBjb21tdW5pY2F0ZSB3aXRoIHtAbGluayBSZXF1ZXN0U2NvcGV9IGFuZCBwcm92aWRlIHJlcXVlc3Qtc2NvcGVkIGRlc2NyaXB0b3JzIHRvIEhLMiBESSBwcm92aWRlciB0byBjcmVhdGUgb3IKKyAqIGRlc3Ryb3kgaW5zdGFuY2VzLgorICovCitAU2luZ2xldG9uCitwdWJsaWMgY2xhc3MgUmVxdWVzdENvbnRleHQgaW1wbGVtZW50cyBDb250ZXh0PFJlcXVlc3RTY29wZWQ+IHsKKworICAgIHByaXZhdGUgZmluYWwgUmVxdWVzdFNjb3BlIHJlcXVlc3RTY29wZTsKKworICAgIEBJbmplY3QKKyAgICBwdWJsaWMgUmVxdWVzdENvbnRleHQoUmVxdWVzdFNjb3BlIHJlcXVlc3RTY29wZSkgeworICAgICAgICB0aGlzLnJlcXVlc3RTY29wZSA9IHJlcXVlc3RTY29wZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGdldFNjb3BlKCkgeworICAgICAgICByZXR1cm4gUmVxdWVzdFNjb3BlZC5jbGFzczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFU+IFUgZmluZE9yQ3JlYXRlKEFjdGl2ZURlc2NyaXB0b3I8VT4gYWN0aXZlRGVzY3JpcHRvciwgU2VydmljZUhhbmRsZTw/PiByb290KSB7CisgICAgICAgIEhrMlJlcXVlc3RTY29wZS5JbnN0YW5jZSBpbnN0YW5jZSA9IChIazJSZXF1ZXN0U2NvcGUuSW5zdGFuY2UpIHJlcXVlc3RTY29wZS5jdXJyZW50KCk7CisKKyAgICAgICAgVSByZXRWYWwgPSBpbnN0YW5jZS5nZXQoRm9yZWlnbkRlc2NyaXB0b3Iud3JhcChhY3RpdmVEZXNjcmlwdG9yKSk7CisgICAgICAgIGlmIChyZXRWYWwgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0VmFsID0gYWN0aXZlRGVzY3JpcHRvci5jcmVhdGUocm9vdCk7CisgICAgICAgICAgICBpbnN0YW5jZS5wdXQoRm9yZWlnbkRlc2NyaXB0b3Iud3JhcChhY3RpdmVEZXNjcmlwdG9yLCBvYmogLT4gYWN0aXZlRGVzY3JpcHRvci5kaXNwb3NlKChVKSBvYmopKSwgcmV0VmFsKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0VmFsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KEFjdGl2ZURlc2NyaXB0b3I8Pz4gZGVzY3JpcHRvcikgeworICAgICAgICBIazJSZXF1ZXN0U2NvcGUuSW5zdGFuY2UgaW5zdGFuY2UgPSAoSGsyUmVxdWVzdFNjb3BlLkluc3RhbmNlKSByZXF1ZXN0U2NvcGUuY3VycmVudCgpOworICAgICAgICByZXR1cm4gaW5zdGFuY2UuY29udGFpbnMoRm9yZWlnbkRlc2NyaXB0b3Iud3JhcChkZXNjcmlwdG9yKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNOdWxsQ3JlYXRpb24oKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzQWN0aXZlKCkgeworICAgICAgICByZXR1cm4gcmVxdWVzdFNjb3BlLmlzQWN0aXZlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZGVzdHJveU9uZShBY3RpdmVEZXNjcmlwdG9yPD8+IGRlc2NyaXB0b3IpIHsKKyAgICAgICAgSGsyUmVxdWVzdFNjb3BlLkluc3RhbmNlIGluc3RhbmNlID0gKEhrMlJlcXVlc3RTY29wZS5JbnN0YW5jZSkgcmVxdWVzdFNjb3BlLmN1cnJlbnQoKTsKKyAgICAgICAgaW5zdGFuY2UucmVtb3ZlKEZvcmVpZ25EZXNjcmlwdG9yLndyYXAoZGVzY3JpcHRvcikpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNodXRkb3duKCkgeworICAgICAgICByZXF1ZXN0U2NvcGUuc2h1dGRvd24oKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXF1ZXN0IHNjb3BlIGluamVjdGlvbiBiaW5kZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCaW5kZXIgZXh0ZW5kcyBBYnN0cmFjdEJpbmRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIGJpbmRBc0NvbnRyYWN0KFJlcXVlc3RDb250ZXh0LmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAudG8obmV3IFR5cGVMaXRlcmFsPENvbnRleHQ8UmVxdWVzdFNjb3BlZD4+KCkge30uZ2V0VHlwZSgpKQorICAgICAgICAgICAgICAgICAgICAuaW4oU2luZ2xldG9uLmNsYXNzKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2luamVjdC9oazIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvaGsyL1N1cHBsaWVyRmFjdG9yeUJyaWRnZS5qYXZhIGIvaW5qZWN0L2hrMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9oazIvU3VwcGxpZXJGYWN0b3J5QnJpZGdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE5NTBiMQotLS0gL2Rldi9udWxsCisrKyBiL2luamVjdC9oazIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvaGsyL1N1cHBsaWVyRmFjdG9yeUJyaWRnZS5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0LmhrMjsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlBhcmFtZXRlcml6ZWRUeXBlOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLklkZW50aXR5SGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5EaXNwb3NhYmxlU3VwcGxpZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi5hcGkuRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi5hcGkuU2VydmljZUxvY2F0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIudXRpbGl0aWVzLnJlZmxlY3Rpb24uUGFyYW1ldGVyaXplZFR5cGVJbXBsOworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgYWJsZSB0byBmaW5kIHRoZSB7QGxpbmsgU3VwcGxpZXJ9IG9mIHRoZSBwYXJ0aWN1bGFyIHR5cGUgYW5kIHVzZSB0aGlzIHtAY29kZSBTdXBwbGllcn0gdG8gY3JlYXRlIGEgbmV3CisgKiBpbnN0YW5jZS4gSWYgdGhlIHtAY29kZSBTdXBwbGllcn0gaXMgbm90IGZvdW5kIHRoZW4ge0Bjb2RlIG51bGx9IGlzIHJldHVybmVkLgorICogPGE+CisgKiBJZiB0aGUgZm91bmQge0Bjb2RlIFN1cHBsaWVyfSBpcyBhIHR5cGUgb2Yge0BsaW5rIERpc3Bvc2FibGVTdXBwbGllcn0gdGhlbiB0aGlzIGJyaWRnZSBjYW4gZGVsZWdhdGUKKyAqIHtAbGluayBGYWN0b3J5I2Rpc3Bvc2UoT2JqZWN0KX0gaW52b2NhdGlvbiB0byB7QGxpbmsgRGlzcG9zYWJsZVN1cHBsaWVyI2Rpc3Bvc2UoT2JqZWN0KX0uCisgKiA8cD4KKyAqIEl0J3MgcmVjb21tZW5kZWQgdG8gcmVnaXN0ZXIgdGhlIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYXMgYSBzaW5nbGV0b24gYW5kIHRoZW4gdGhlIHtAbGluayAjcHJvdmlkZSgpfSBpcyBjYWxsZWQgYWNjb3JkaW5nIHRvCisgKiBhIHByb3ZpZGVkIHNjb3BlIChmb3IgdGhlIGNyZWF0ZWQgaW5zdGFuY2UpIGR1cmluZyB0aGUgYmluZGluZyBwcm9jZXNzLgorICoKKyAqIEBwYXJhbSA8VD4gdHlwZSB3aGljaCBjb3VsZCBiZSBoYW5kbGVkIGJ5IHtAY29kZSBTdXBwbGllcn0gYW5kIHRoaXMgYnJpZGdlLgorICovCitwdWJsaWMgY2xhc3MgU3VwcGxpZXJGYWN0b3J5QnJpZGdlPFQ+IGltcGxlbWVudHMgRmFjdG9yeTxUPiB7CisKKyAgICBwcml2YXRlIFNlcnZpY2VMb2NhdG9yIGxvY2F0b3I7CisgICAgcHJpdmF0ZSBQYXJhbWV0ZXJpemVkVHlwZSBiZWFuVHlwZTsKKyAgICBwcml2YXRlIFN0cmluZyBiZWFuTmFtZTsKKyAgICBwcml2YXRlIGJvb2xlYW4gZGlzcG9zYWJsZTsKKworICAgIC8vIFRoaXMgYnJpZGdlIGNhbiBjcmVhdGUgbXVsdGlwbGUgaW5zdGFuY2VzIHVzaW5nIHRoZSBtZXRob2QgJ3Byb3ZpZGUnIHRoZXJlZm9yZSBtdXN0IG1hcCBjcmVhdGVkIHN1cHBsaWVycyBiZWNhdXNlIG9mCisgICAgLy8gJ2Rpc3Bvc2UnIGludm9jYXRpb24gbGF0ZXIgb24uCisgICAgLy8gVE9ETzogS2V5IGFzIGEgV2Vha1JlZmVyZW5jZSAtIHByZXZlbnQgb2JqZWN0cyBpbiBzY29wZSB3aGljaCBuZXZlciBkaXNwb3NlIHRoZSBvYmplY3RzIHN1Y2ggYXMgUGVyTG9va3VwLgorICAgIHByaXZhdGUgTWFwPE9iamVjdCwgRGlzcG9zYWJsZVN1cHBsaWVyPFQ+PiBkaXNwb3NhYmxlU3VwcGxpZXJzID0gbmV3IElkZW50aXR5SGFzaE1hcDw+KCk7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciBmb3IgYSBuZXcgYnJpZGdlLgorICAgICAqCisgICAgICogQHBhcmFtIGxvY2F0b3IgICAgY3VycmVudGx5IHVzZWQgbG9jYXRvciwgYWxsIGZhY3RvcnkgaW52b2NhdGlvbnMgd2lsbCBiZSBkZWxlZ2F0ZWQgdG8gdGhpcyBsb2NhdG9yLgorICAgICAqIEBwYXJhbSBiZWFuVHlwZSAgIGdlbmVyaWMgdHlwZSBvZiBhIHtAbGluayBTdXBwbGllcn0gd2hpY2ggaXMgbG9va2VkIGZvciBpbiBsb2NhdG9yIGFuZCBvbiB3aGljaCB0aGUgY3JlYXRpb24gb2YKKyAgICAgKiAgICAgICAgICAgICAgICAgICB0aGUgbmV3IGluc3RhbmNlIGlzIGRlbGVnYXRlZC4KKyAgICAgKiBAcGFyYW0gYmVhbk5hbWUgICBuYW1lIG9mIHRoZSBiZWFuIHRoYXQgaXMgcHJvdmlkZWQgYnkgc3VwcGxpZXIuCisgICAgICogQHBhcmFtIGRpc3Bvc2FibGUgZmxhZyB3aGV0aGVyIHRoZSBicmlkZ2UgaXMgc2V0IHVwIGZvciBkaXNwb3NpbmcgdGhlIGNyZWF0ZWQgb2JqZWN0LgorICAgICAqLworICAgIFN1cHBsaWVyRmFjdG9yeUJyaWRnZShTZXJ2aWNlTG9jYXRvciBsb2NhdG9yLCBUeXBlIGJlYW5UeXBlLCBTdHJpbmcgYmVhbk5hbWUsIGJvb2xlYW4gZGlzcG9zYWJsZSkgeworICAgICAgICB0aGlzLmxvY2F0b3IgPSBsb2NhdG9yOworICAgICAgICB0aGlzLmJlYW5UeXBlID0gbmV3IFBhcmFtZXRlcml6ZWRUeXBlSW1wbChTdXBwbGllci5jbGFzcywgYmVhblR5cGUpOworICAgICAgICB0aGlzLmJlYW5OYW1lID0gYmVhbk5hbWU7CisgICAgICAgIHRoaXMuZGlzcG9zYWJsZSA9IGRpc3Bvc2FibGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFQgcHJvdmlkZSgpIHsKKyAgICAgICAgaWYgKGJlYW5UeXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgIFN1cHBsaWVyPFQ+IHN1cHBsaWVyID0gbG9jYXRvci5nZXRTZXJ2aWNlKGJlYW5UeXBlLCBiZWFuTmFtZSk7CisgICAgICAgICAgICBUIGluc3RhbmNlID0gc3VwcGxpZXIuZ2V0KCk7CisgICAgICAgICAgICBpZiAoZGlzcG9zYWJsZSkgeworICAgICAgICAgICAgICAgIGRpc3Bvc2FibGVTdXBwbGllcnMucHV0KGluc3RhbmNlLCAoRGlzcG9zYWJsZVN1cHBsaWVyPFQ+KSBzdXBwbGllcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gaW5zdGFuY2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoVCBpbnN0YW5jZSkgeworICAgICAgICBpZiAoZGlzcG9zYWJsZSkgeworICAgICAgICAgICAgRGlzcG9zYWJsZVN1cHBsaWVyPFQ+IGRpc3Bvc2FibGVTdXBwbGllciA9IGRpc3Bvc2FibGVTdXBwbGllcnMuZ2V0KGluc3RhbmNlKTsKKyAgICAgICAgICAgIGRpc3Bvc2FibGVTdXBwbGllci5kaXNwb3NlKGluc3RhbmNlKTsKKyAgICAgICAgICAgIGRpc3Bvc2FibGVTdXBwbGllcnMucmVtb3ZlKGluc3RhbmNlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2luamVjdC9oazIvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyRmFjdG9yeSBiL2luamVjdC9oazIvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyRmFjdG9yeQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDZmMGI0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5qZWN0L2hrMi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXJGYWN0b3J5CkBAIC0wLDAgKzEgQEAKK29yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5oazIuSGsySW5qZWN0aW9uTWFuYWdlckZhY3RvcnkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmplY3QvaGsyL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvaGsyL2xvY2FsaXphdGlvbi5wcm9wZXJ0aWVzIGIvaW5qZWN0L2hrMi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2hrMi9sb2NhbGl6YXRpb24ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmNkMWQyCi0tLSAvZGV2L251bGwKKysrIGIvaW5qZWN0L2hrMi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2hrMi9sb2NhbGl6YXRpb24ucHJvcGVydGllcwpAQCAtMCwwICsxLDIzIEBACisjCisjIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorIworIyBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisjIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyMgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisjIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyMKKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisjCisKKyMgezB9IC0gZnVsbCBjbGFzc25hbWUKK2hrMi5jbGVhcmluZy5jYWNoZT1DbGVhcmluZyBKZXJzZXkgSEsyIGNhY2hlcy4gU2VydmljZSBjYWNoZSBzaXplOiB7MH0sIHJlZmxlY3Rpb24gY2FjaGUgc2l6ZTogezF9LgoraGsyLnJlaWZpY2F0aW9uLmVycm9yPUhLMiBzZXJ2aWNlIHJlaWZpY2F0aW9uIGZhaWxlZCBmb3IgW3swfV0gd2l0aCBhbiBleGNlcHRpb246XG57MX0KK2hrMi51bmtub3duLmVycm9yPVVua25vd24gSEsyIGZhaWx1cmUgZGV0ZWN0ZWQ6XG57MH0KK2hrMi51bmtub3duLnBhcmVudC5pbmplY3Rpb24ubWFuYWdlcj1Vbmtub3duIHBhcmVudCBvZiBJbmplY3Rpb25NYW5hZ2VyLCBTZXJ2aWNlTG9jYXRvciBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mOiB7MH0uCitoazIuZmFpbHVyZS5vdXRzaWRlLmVycm9yLnNjb3BlPUhLMiBmYWlsdXJlIGhhcyBiZWVuIGRldGVjdGVkIGluIGEgY29kZSB0aGF0IGRvZXMgbm90IHJ1biBpbiBhbiBhY3RpdmUgSmVyc2V5IEVycm9yIHNjb3BlLgoraGsyLnByb3ZpZGVyLm5vdC5yZWdpc3RyYWJsZT1Qcm92aWRlciByZWdpc3RlcmVkIHRvIEhrMkluamVjdGlvbk1hbmFnZXIgY2Fubm90IGJlIHByb2Nlc3MgYmVjYXVzZSBvZiBpbmNvbXBhdGlibGUgdHlwZTogezB9LgpkaWZmIC0tZ2l0IGEvaW5qZWN0L2hrMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9oazIvQmluZGluZ1Rlc3RIZWxwZXIuamF2YSBiL2luamVjdC9oazIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvaGsyL0JpbmRpbmdUZXN0SGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU0MmE2MwotLS0gL2Rldi9udWxsCisrKyBiL2luamVjdC9oazIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvaGsyL0JpbmRpbmdUZXN0SGVscGVyLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuaGsyOworCitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkFic3RyYWN0QmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25zOworCisvKioKKyAqIEhlbHBlciBjbGFzcyB0byBtaW5pbWl6ZSB0aGUgY29kZSBpbiB0ZXN0ZWQgY2xhc3Nlcy4KKyAqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworY2xhc3MgQmluZGluZ1Rlc3RIZWxwZXIgeworCisgICAgLyoqCisgICAgICogQWNjZXB0cyB0aGUgcHJvdmlkZWQgY29uc3VtZXIgdG8gY3JlYXRlZCBhbmQgcmVnaXN0ZXIgdGhlIGJpbmRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbiBtYW5hZ2VyIHdoaWNoIGFjY2VwdHMgdGhlIGNvbnN1bWVyLgorICAgICAqIEBwYXJhbSBiaW5kQ29uc3VtZXIgICAgIGNvbnN1bWVyIHRvIHBvcHVsYXRlIGEgYmluZGVyLgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIGJpbmQoSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyLCBDb25zdW1lcjxBYnN0cmFjdEJpbmRlcj4gYmluZENvbnN1bWVyKSB7CisgICAgICAgIEFic3RyYWN0QmluZGVyIGJpbmRlciA9IG5ldyBBYnN0cmFjdEJpbmRlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICAgICAgICAgIGJpbmRDb25zdW1lci5hY2NlcHQodGhpcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5yZWdpc3RlcihiaW5kZXIpOworICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLmNvbXBsZXRlUmVnaXN0cmF0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgSW5qZWN0aW9uTWFuYWdlcn0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIG5ld2x5IGNyZWF0ZWQge0Bjb2RlIEluamVjdGlvbk1hbmFnZXJ9LgorICAgICAqLworICAgIHN0YXRpYyBJbmplY3Rpb25NYW5hZ2VyIGNyZWF0ZUluamVjdGlvbk1hbmFnZXIoKSB7CisgICAgICAgIHJldHVybiBJbmplY3Rpb25zLmNyZWF0ZUluamVjdGlvbk1hbmFnZXIoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9pbmplY3QvaGsyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2hrMi9Db252ZXJzYXRpb24uamF2YSBiL2luamVjdC9oazIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvaGsyL0NvbnZlcnNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMTgzNWQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmplY3QvaGsyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2hrMi9Db252ZXJzYXRpb24uamF2YQpAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5oazI7CisKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworCisvKioKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitjbGFzcyBDb252ZXJzYXRpb24geworCisgICAgQEluamVjdAorICAgIEdyZWV0aW5nIGdyZWV0aW5nOworCisgICAgQEluamVjdAorICAgIFN1cHBsaWVyPEdyZWV0aW5nPiBncmVldGluZ1N1cHBsaWVyOworCit9CmRpZmYgLS1naXQgYS9pbmplY3QvaGsyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2hrMi9DemVjaENvbnZlcnNhdGlvbi5qYXZhIGIvaW5qZWN0L2hrMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9oazIvQ3plY2hDb252ZXJzYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2Y4OTk5Ci0tLSAvZGV2L251bGwKKysrIGIvaW5qZWN0L2hrMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9oazIvQ3plY2hDb252ZXJzYXRpb24uamF2YQpAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5oazI7CisKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworCisvKioKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitjbGFzcyBDemVjaENvbnZlcnNhdGlvbiB7CisKKyAgICBASW5qZWN0CisgICAgQ3plY2hHcmVldGluZyBncmVldGluZzsKKworICAgIEBJbmplY3QKKyAgICBTdXBwbGllcjxDemVjaEdyZWV0aW5nPiBncmVldGluZ1N1cHBsaWVyOworCit9CmRpZmYgLS1naXQgYS9pbmplY3QvaGsyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2hrMi9DemVjaEdyZWV0aW5nLmphdmEgYi9pbmplY3QvaGsyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2hrMi9DemVjaEdyZWV0aW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYyMTA1NQotLS0gL2Rldi9udWxsCisrKyBiL2luamVjdC9oazIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvaGsyL0N6ZWNoR3JlZXRpbmcuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5oazI7CisKKy8qKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK3B1YmxpYyBjbGFzcyBDemVjaEdyZWV0aW5nIGltcGxlbWVudHMgR3JlZXRpbmcsIFByaW50YWJsZSB7CisKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEdSRUVUSU5HID0gIkFob2oiOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRHcmVldGluZygpIHsKKyAgICAgICAgcmV0dXJuIEdSRUVUSU5HOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHByaW50KCkgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oR1JFRVRJTkcpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2luamVjdC9oazIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvaGsyL0Rpc3Bvc2FibGVTdXBwbGllclRlc3QuamF2YSBiL2luamVjdC9oazIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvaGsyL0Rpc3Bvc2FibGVTdXBwbGllclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2JiNTA3Ci0tLSAvZGV2L251bGwKKysrIGIvaW5qZWN0L2hrMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9oazIvRGlzcG9zYWJsZVN1cHBsaWVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDEzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5oazI7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljVHlwZTsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5EaXNwb3NhYmxlU3VwcGxpZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5pbnRlcm5hbC5SZXF1ZXN0U2NvcGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5pbnRlcm5hbC5SZXF1ZXN0U2NvcGVkOworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90U2FtZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7CisKKy8qKgorICogVGVzdHMgdGhhdCB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkRpc3Bvc2FibGVTdXBwbGllcn0gaXMgcHJvcGVybHkgcHJvY2Vzc2VkIGJ5IHtAbGluayBIazJIZWxwZXJ9LgorICoKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitwdWJsaWMgY2xhc3MgRGlzcG9zYWJsZVN1cHBsaWVyVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUeXBlIERJU1BPU0FCTEVfU1VQUExJRVJfVFlQRSA9IG5ldyBHZW5lcmljVHlwZTxEaXNwb3NhYmxlU3VwcGxpZXI8U3RyaW5nPj4oKSB7fS5nZXRUeXBlKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVHlwZSBTVVBQTElFUl9UWVBFID0gbmV3IEdlbmVyaWNUeXBlPFN1cHBsaWVyPFN0cmluZz4+KCkge30uZ2V0VHlwZSgpOworCisgICAgcHJpdmF0ZSBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXI7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXAoKSB7CisgICAgICAgIGluamVjdGlvbk1hbmFnZXIgPSBCaW5kaW5nVGVzdEhlbHBlci5jcmVhdGVJbmplY3Rpb25NYW5hZ2VyKCk7CisgICAgfQorCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgdGVhcmRvd24oKSB7CisgICAgICAgIGluamVjdGlvbk1hbmFnZXIuc2h1dGRvd24oKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCaW5kU2luZ2xldG9uQ2xhc3NEaXNwb3NhYmxlU3VwcGxpZXIoKSB7CisgICAgICAgIEJpbmRpbmdUZXN0SGVscGVyLmJpbmQoCisgICAgICAgICAgICAgICAgaW5qZWN0aW9uTWFuYWdlciwgYmluZGVyIC0+ICBiaW5kZXIuYmluZEZhY3RvcnkoRGlzcG9zYWJsZVN1cHBsaWVySW1wbC5jbGFzcywgU2luZ2xldG9uLmNsYXNzKS50byhTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICBPYmplY3Qgc3VwcGxpZXIgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKFNVUFBMSUVSX1RZUEUpOworICAgICAgICBPYmplY3QgZGlzcG9zYWJsZVN1cHBsaWVyID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShESVNQT1NBQkxFX1NVUFBMSUVSX1RZUEUpOworICAgICAgICBhc3NlcnROb3ROdWxsKHN1cHBsaWVyKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChkaXNwb3NhYmxlU3VwcGxpZXIpOworICAgICAgICBhc3NlcnRTYW1lKHN1cHBsaWVyLCBkaXNwb3NhYmxlU3VwcGxpZXIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJpbmRQZXJMb29rdXBDbGFzc0Rpc3Bvc2FibGVTdXBwbGllcigpIHsKKyAgICAgICAgQmluZGluZ1Rlc3RIZWxwZXIuYmluZChpbmplY3Rpb25NYW5hZ2VyLCBiaW5kZXIgLT4gYmluZGVyLmJpbmRGYWN0b3J5KERpc3Bvc2FibGVTdXBwbGllckltcGwuY2xhc3MpLnRvKFN0cmluZy5jbGFzcykpOworCisgICAgICAgIE9iamVjdCBzdXBwbGllciA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoU1VQUExJRVJfVFlQRSk7CisgICAgICAgIE9iamVjdCBkaXNwb3NhYmxlU3VwcGxpZXIgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKERJU1BPU0FCTEVfU1VQUExJRVJfVFlQRSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoc3VwcGxpZXIpOworICAgICAgICBhc3NlcnROb3ROdWxsKGRpc3Bvc2FibGVTdXBwbGllcik7CisgICAgICAgIGFzc2VydE5vdFNhbWUoc3VwcGxpZXIsIGRpc3Bvc2FibGVTdXBwbGllcik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmluZEluc3RhbmNlRGlzcG9zYWJsZVN1cHBsaWVyKCkgeworICAgICAgICBCaW5kaW5nVGVzdEhlbHBlci5iaW5kKGluamVjdGlvbk1hbmFnZXIsIGJpbmRlciAtPiBiaW5kZXIuYmluZEZhY3RvcnkobmV3IERpc3Bvc2FibGVTdXBwbGllckltcGwoKSkudG8oU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgT2JqZWN0IHN1cHBsaWVyID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShTVVBQTElFUl9UWVBFKTsKKyAgICAgICAgT2JqZWN0IGRpc3Bvc2FibGVTdXBwbGllciA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoRElTUE9TQUJMRV9TVVBQTElFUl9UWVBFKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChzdXBwbGllcik7CisgICAgICAgIGFzc2VydE5vdE51bGwoZGlzcG9zYWJsZVN1cHBsaWVyKTsKKyAgICAgICAgYXNzZXJ0U2FtZShzdXBwbGllciwgZGlzcG9zYWJsZVN1cHBsaWVyKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RCaW5kQ2xhc3NEaXNwb3NhYmxlU3VwcGxpZXIoKSB7CisgICAgICAgIEJpbmRpbmdUZXN0SGVscGVyLmJpbmQoaW5qZWN0aW9uTWFuYWdlciwgYmluZGVyIC0+IGJpbmRlci5iaW5kRmFjdG9yeShTdXBwbGllckdyZWV0aW5nLmNsYXNzKS50byhTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKERJU1BPU0FCTEVfU1VQUExJRVJfVFlQRSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vdEJpbmRJbnN0YW5jZURpc3Bvc2FibGVTdXBwbGllcigpIHsKKyAgICAgICAgQmluZGluZ1Rlc3RIZWxwZXIuYmluZChpbmplY3Rpb25NYW5hZ2VyLCBiaW5kZXIgLT4gYmluZGVyLmJpbmRGYWN0b3J5KG5ldyBTdXBwbGllckdyZWV0aW5nKCkpLnRvKFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnROdWxsKGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoRElTUE9TQUJMRV9TVVBQTElFUl9UWVBFKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25seUluY3JlbWVudFNpbmdsZXRvblN1cHBsaWVyKCkgeworICAgICAgICBCaW5kaW5nVGVzdEhlbHBlci5iaW5kKGluamVjdGlvbk1hbmFnZXIsIGJpbmRlciAtPiBiaW5kZXIuYmluZEZhY3RvcnkoRGlzcG9zYWJsZVN1cHBsaWVySW1wbC5jbGFzcywgU2luZ2xldG9uLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgLnRvKFN0cmluZy5jbGFzcykpOworCisgICAgICAgIE9iamVjdCBpbnN0YW5jZTEgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKERJU1BPU0FCTEVfU1VQUExJRVJfVFlQRSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMSIsICgoRGlzcG9zYWJsZVN1cHBsaWVyPD8+KSBpbnN0YW5jZTEpLmdldCgpKTsKKyAgICAgICAgT2JqZWN0IGluc3RhbmNlMiA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoRElTUE9TQUJMRV9TVVBQTElFUl9UWVBFKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIyIiwgKChEaXNwb3NhYmxlU3VwcGxpZXI8Pz4pIGluc3RhbmNlMikuZ2V0KCkpOworICAgICAgICBPYmplY3QgaW5zdGFuY2UzID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShESVNQT1NBQkxFX1NVUFBMSUVSX1RZUEUpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjMiLCAoKERpc3Bvc2FibGVTdXBwbGllcjw/PikgaW5zdGFuY2UzKS5nZXQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25seUluY3JlbWVudEluc3RhbmNlU3VwcGxpZXIoKSB7CisgICAgICAgIEJpbmRpbmdUZXN0SGVscGVyLmJpbmQoaW5qZWN0aW9uTWFuYWdlciwgYmluZGVyIC0+IGJpbmRlci5iaW5kRmFjdG9yeShuZXcgRGlzcG9zYWJsZVN1cHBsaWVySW1wbCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgLnRvKFN0cmluZy5jbGFzcykpOworCisgICAgICAgIE9iamVjdCBpbnN0YW5jZTEgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKERJU1BPU0FCTEVfU1VQUExJRVJfVFlQRSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMSIsICgoRGlzcG9zYWJsZVN1cHBsaWVyPD8+KSBpbnN0YW5jZTEpLmdldCgpKTsKKyAgICAgICAgT2JqZWN0IGluc3RhbmNlMiA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoRElTUE9TQUJMRV9TVVBQTElFUl9UWVBFKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIyIiwgKChEaXNwb3NhYmxlU3VwcGxpZXI8Pz4pIGluc3RhbmNlMikuZ2V0KCkpOworICAgICAgICBPYmplY3QgaW5zdGFuY2UzID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShESVNQT1NBQkxFX1NVUFBMSUVSX1RZUEUpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjMiLCAoKERpc3Bvc2FibGVTdXBwbGllcjw/PikgaW5zdGFuY2UzKS5nZXQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25seUluY3JlbWVudFBlckxvb2t1cFN1cHBsaWVyKCkgeworICAgICAgICBCaW5kaW5nVGVzdEhlbHBlci5iaW5kKGluamVjdGlvbk1hbmFnZXIsIGJpbmRlciAtPiBiaW5kZXIuYmluZEZhY3RvcnkoRGlzcG9zYWJsZVN1cHBsaWVySW1wbC5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgIC50byhTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICBPYmplY3QgaW5zdGFuY2UxID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShESVNQT1NBQkxFX1NVUFBMSUVSX1RZUEUpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCAoKERpc3Bvc2FibGVTdXBwbGllcjw/PikgaW5zdGFuY2UxKS5nZXQoKSk7CisgICAgICAgIE9iamVjdCBpbnN0YW5jZTIgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKERJU1BPU0FCTEVfU1VQUExJRVJfVFlQRSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMSIsICgoRGlzcG9zYWJsZVN1cHBsaWVyPD8+KSBpbnN0YW5jZTIpLmdldCgpKTsKKyAgICAgICAgT2JqZWN0IGluc3RhbmNlMyA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoRElTUE9TQUJMRV9TVVBQTElFUl9UWVBFKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgKChEaXNwb3NhYmxlU3VwcGxpZXI8Pz4pIGluc3RhbmNlMykuZ2V0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9ubHlJbmNyZW1lbnRTaW5nbGV0b25JbnN0YW5jZXMoKSB7CisgICAgICAgIEJpbmRpbmdUZXN0SGVscGVyLmJpbmQoaW5qZWN0aW9uTWFuYWdlciwgYmluZGVyIC0+IGJpbmRlci5iaW5kRmFjdG9yeShEaXNwb3NhYmxlU3VwcGxpZXJJbXBsLmNsYXNzLCBTaW5nbGV0b24uY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAudG8oU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgT2JqZWN0IGluc3RhbmNlMSA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgaW5zdGFuY2UxKTsKKyAgICAgICAgT2JqZWN0IGluc3RhbmNlMiA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIyIiwgaW5zdGFuY2UyKTsKKyAgICAgICAgT2JqZWN0IGluc3RhbmNlMyA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIzIiwgaW5zdGFuY2UzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPbmx5SW5jcmVtZW50SW5zdGFuY2VJbnN0YW5jZSgpIHsKKyAgICAgICAgQmluZGluZ1Rlc3RIZWxwZXIuYmluZChpbmplY3Rpb25NYW5hZ2VyLCBiaW5kZXIgLT4gYmluZGVyLmJpbmRGYWN0b3J5KG5ldyBEaXNwb3NhYmxlU3VwcGxpZXJJbXBsKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAudG8oU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgT2JqZWN0IGluc3RhbmNlMSA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgaW5zdGFuY2UxKTsKKyAgICAgICAgT2JqZWN0IGluc3RhbmNlMiA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIyIiwgaW5zdGFuY2UyKTsKKyAgICAgICAgT2JqZWN0IGluc3RhbmNlMyA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIzIiwgaW5zdGFuY2UzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPbmx5SW5jcmVtZW50UGVyTG9va3VwSW5zdGFuY2UoKSB7CisgICAgICAgIEJpbmRpbmdUZXN0SGVscGVyCisgICAgICAgICAgICAgICAgLmJpbmQoaW5qZWN0aW9uTWFuYWdlciwgYmluZGVyIC0+IGJpbmRlci5iaW5kRmFjdG9yeShEaXNwb3NhYmxlU3VwcGxpZXJJbXBsLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgLnRvKFN0cmluZy5jbGFzcykpOworCisgICAgICAgIE9iamVjdCBpbnN0YW5jZTEgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiMSIsIGluc3RhbmNlMSk7CisgICAgICAgIE9iamVjdCBpbnN0YW5jZTIgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiMSIsIGluc3RhbmNlMik7CisgICAgICAgIE9iamVjdCBpbnN0YW5jZTMgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiMSIsIGluc3RhbmNlMyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzcG9zZVNpbmdsZXRvblN1cHBsaWVyKCkgeworICAgICAgICBCaW5kaW5nVGVzdEhlbHBlci5iaW5kKGluamVjdGlvbk1hbmFnZXIsIGJpbmRlciAtPiBiaW5kZXIuYmluZEZhY3RvcnkoRGlzcG9zYWJsZVN1cHBsaWVySW1wbC5jbGFzcywgU2luZ2xldG9uLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgLnRvKFN0cmluZy5jbGFzcykpOworCisgICAgICAgIC8vIDEtMQorICAgICAgICBEaXNwb3NhYmxlU3VwcGxpZXI8U3RyaW5nPiBzdXBwbGllcjEgPQorICAgICAgICAgICAgICAgIGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoRElTUE9TQUJMRV9TVVBQTElFUl9UWVBFKTsKKyAgICAgICAgU3RyaW5nIGluc3RhbmNlMSA9IHN1cHBsaWVyMS5nZXQoKTsKKyAgICAgICAgLy8gMi0yCisgICAgICAgIERpc3Bvc2FibGVTdXBwbGllcjxTdHJpbmc+IHN1cHBsaWVyMiA9CisgICAgICAgICAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShESVNQT1NBQkxFX1NVUFBMSUVSX1RZUEUpOworICAgICAgICBTdHJpbmcgaW5zdGFuY2UyID0gc3VwcGxpZXIyLmdldCgpOworICAgICAgICAvLyAzLTMKKyAgICAgICAgRGlzcG9zYWJsZVN1cHBsaWVyPFN0cmluZz4gc3VwcGxpZXIzID0KKyAgICAgICAgICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKERJU1BPU0FCTEVfU1VQUExJRVJfVFlQRSk7CisgICAgICAgIHN1cHBsaWVyMy5nZXQoKTsKKyAgICAgICAgLy8gMi0yCisgICAgICAgIHN1cHBsaWVyMS5kaXNwb3NlKGluc3RhbmNlMSk7CisgICAgICAgIC8vIDEtMQorICAgICAgICBzdXBwbGllcjIuZGlzcG9zZShpbnN0YW5jZTIpOworICAgICAgICAvLyAyLTIKKyAgICAgICAgU3VwcGxpZXI8U3RyaW5nPiBzdXBwbGllcjQgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKERJU1BPU0FCTEVfU1VQUExJRVJfVFlQRSk7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSBzdXBwbGllcjQuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiMiIsIHJlc3VsdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzcG9zZVBlckxvb2t1cFN1cHBsaWVyKCkgeworICAgICAgICBCaW5kaW5nVGVzdEhlbHBlci5iaW5kKGluamVjdGlvbk1hbmFnZXIsIGJpbmRlciAtPiBiaW5kZXIuYmluZEZhY3RvcnkoRGlzcG9zYWJsZVN1cHBsaWVySW1wbC5jbGFzcykKKyAgICAgICAgICAgICAgICAudG8oU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgLy8gMQorICAgICAgICBEaXNwb3NhYmxlU3VwcGxpZXI8U3RyaW5nPiBzdXBwbGllcjEgPQorICAgICAgICAgICAgICAgIGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoRElTUE9TQUJMRV9TVVBQTElFUl9UWVBFKTsKKyAgICAgICAgU3RyaW5nIGluc3RhbmNlMSA9IHN1cHBsaWVyMS5nZXQoKTsKKyAgICAgICAgLy8gMQorICAgICAgICBEaXNwb3NhYmxlU3VwcGxpZXI8U3RyaW5nPiBzdXBwbGllcjIgPQorICAgICAgICAgICAgICAgIGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoRElTUE9TQUJMRV9TVVBQTElFUl9UWVBFKTsKKyAgICAgICAgU3RyaW5nIGluc3RhbmNlMiA9IHN1cHBsaWVyMi5nZXQoKTsKKyAgICAgICAgLy8gMQorICAgICAgICBEaXNwb3NhYmxlU3VwcGxpZXI8U3RyaW5nPiBzdXBwbGllcjMgPQorICAgICAgICAgICAgICAgIGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoRElTUE9TQUJMRV9TVVBQTElFUl9UWVBFKTsKKyAgICAgICAgc3VwcGxpZXIzLmdldCgpOworICAgICAgICAvLyAwCisgICAgICAgIHN1cHBsaWVyMS5kaXNwb3NlKGluc3RhbmNlMSk7CisgICAgICAgIC8vIDAKKyAgICAgICAgc3VwcGxpZXIyLmRpc3Bvc2UoaW5zdGFuY2UyKTsKKyAgICAgICAgLy8gMQorICAgICAgICBTdXBwbGllcjxTdHJpbmc+IHN1cHBsaWVyNCA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoRElTUE9TQUJMRV9TVVBQTElFUl9UWVBFKTsKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHN1cHBsaWVyNC5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgcmVzdWx0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REaXNwb3NlU2luZ2xldG9uU3VwcGxpZXJSZXF1ZXN0U2NvcGVkSW5zdGFuY2UoKSB7CisgICAgICAgIEJpbmRpbmdUZXN0SGVscGVyLmJpbmQoaW5qZWN0aW9uTWFuYWdlciwgYmluZGVyIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgYmluZGVyLmJpbmRGYWN0b3J5KERpc3Bvc2FibGVTdXBwbGllckltcGwuY2xhc3MsIFNpbmdsZXRvbi5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG8oU3RyaW5nLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbihSZXF1ZXN0U2NvcGVkLmNsYXNzKTsKKworICAgICAgICAgICAgICAgICAgICBiaW5kZXIuYmluZChIazJSZXF1ZXN0U2NvcGUuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvKFJlcXVlc3RTY29wZS5jbGFzcyk7CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgUmVxdWVzdFNjb3BlIHJlcXVlc3QgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKFJlcXVlc3RTY29wZS5jbGFzcyk7CisgICAgICAgIEF0b21pY1JlZmVyZW5jZTxTdXBwbGllcjxTdHJpbmc+PiBhdG9taWNTdXBwbGllciA9IG5ldyBBdG9taWNSZWZlcmVuY2U8PigpOworICAgICAgICByZXF1ZXN0LnJ1bkluU2NvcGUoKCkgLT4geworICAgICAgICAgICAgLy8gU2F2ZSBTaW5nbGV0b24gU3VwcGxpZXIgZm9yIGxhdGVyIGNoZWNrIHRoYXQgdGhlIGluc3RhbmNlIHdhcyBkaXNwb3NlZC4KKyAgICAgICAgICAgIFN1cHBsaWVyPFN0cmluZz4gc3VwcGxpZXIgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKERJU1BPU0FCTEVfU1VQUExJRVJfVFlQRSk7CisgICAgICAgICAgICBhdG9taWNTdXBwbGllci5zZXQoc3VwcGxpZXIpOworCisgICAgICAgICAgICAvLyBBbGwgaW5zdGFuY2VzIHNob3VsZCBiZSB0aGUgc2FtZSBiZWNhdXNlIHRoZXkgYXJlIHJlcXVlc3Qgc2NvcGVkLgorICAgICAgICAgICAgT2JqZWN0IGluc3RhbmNlMSA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMSIsIGluc3RhbmNlMSk7CisgICAgICAgICAgICBPYmplY3QgaW5zdGFuY2UyID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgaW5zdGFuY2UyKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgU3VwcGxpZXI8U3RyaW5nPiBjbGVhbmVkU3VwcGxpZXIgPSBhdG9taWNTdXBwbGllci5nZXQoKTsKKyAgICAgICAgLy8gTmV4dCBzaG91bGQgYmUgMS0xCisgICAgICAgIGFzc2VydEVxdWFscygiMSIsIGNsZWFuZWRTdXBwbGllci5nZXQoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCBvYmplY3QgY3JlYXRlZCBpbiByZXF1ZXN0IHNjb3BlIGlzIGRpc3Bvc2luZyBhdCB0aGUgdGltZSBvZiBlbmRpbmcgdGhlIHNjb3BlLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERpc3Bvc2VQZXJMb29rdXBTdXBwbGllclJlcXVlc3RTY29wZWRJbnN0YW5jZSgpIHsKKyAgICAgICAgQmluZGluZ1Rlc3RIZWxwZXIuYmluZChpbmplY3Rpb25NYW5hZ2VyLCBiaW5kZXIgLT4geworICAgICAgICAgICAgICAgICAgICBiaW5kZXIuYmluZEZhY3RvcnkoRGlzcG9zYWJsZVN1cHBsaWVySW1wbC5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG8oU3RyaW5nLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbihSZXF1ZXN0U2NvcGVkLmNsYXNzKTsKKworICAgICAgICAgICAgICAgICAgICBiaW5kZXIuYmluZChIazJSZXF1ZXN0U2NvcGUuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvKFJlcXVlc3RTY29wZS5jbGFzcyk7CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgUmVxdWVzdFNjb3BlIHJlcXVlc3QgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKFJlcXVlc3RTY29wZS5jbGFzcyk7CisgICAgICAgIEF0b21pY1JlZmVyZW5jZTxTdXBwbGllcjxTdHJpbmc+PiBhdG9taWNTdXBwbGllciA9IG5ldyBBdG9taWNSZWZlcmVuY2U8PigpOworICAgICAgICByZXF1ZXN0LnJ1bkluU2NvcGUoKCkgLT4geworICAgICAgICAgICAgLy8gU2F2ZSBTaW5nbGV0b24gU3VwcGxpZXIgZm9yIGxhdGVyIGNoZWNrIHRoYXQgdGhlIGluc3RhbmNlIHdhcyBkaXNwb3NlZC4KKyAgICAgICAgICAgIFN1cHBsaWVyPFN0cmluZz4gc3VwcGxpZXIgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKERJU1BPU0FCTEVfU1VQUExJRVJfVFlQRSk7CisgICAgICAgICAgICBhdG9taWNTdXBwbGllci5zZXQoc3VwcGxpZXIpOworCisgICAgICAgICAgICAvLyBBbGwgaW5zdGFuY2VzIHNob3VsZCBiZSB0aGUgc2FtZSBiZWNhdXNlIHRoZXkgYXJlIHJlcXVlc3Qgc2NvcGVkLgorICAgICAgICAgICAgT2JqZWN0IGluc3RhbmNlMSA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMSIsIGluc3RhbmNlMSk7CisgICAgICAgICAgICBPYmplY3QgaW5zdGFuY2UyID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgaW5zdGFuY2UyKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgU3VwcGxpZXI8U3RyaW5nPiBjbGVhbmVkU3VwcGxpZXIgPSBhdG9taWNTdXBwbGllci5nZXQoKTsKKyAgICAgICAgLy8gTmV4dCBzaG91bGQgYmUgMQorICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCBjbGVhbmVkU3VwcGxpZXIuZ2V0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQgaW5oZXJpdGVkIHJlcXVlc3Qgc2NvcGVkIGlzIGFsc28gY2xlYW5lZCBieSBkaXNwb3NpbmcgdGhlIG9iamVjdHMuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzcG9zZVNpbmdsZXRvblN1cHBsaWVyTXVsdGlSZXF1ZXN0U2NvcGVkKCkgeworICAgICAgICBCaW5kaW5nVGVzdEhlbHBlci5iaW5kKGluamVjdGlvbk1hbmFnZXIsIGJpbmRlciAtPiB7CisgICAgICAgICAgICAgICAgICAgIGJpbmRlci5iaW5kRmFjdG9yeShEaXNwb3NhYmxlU3VwcGxpZXJJbXBsLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50byhTdHJpbmcuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmluKFJlcXVlc3RTY29wZWQuY2xhc3MpOworCisgICAgICAgICAgICAgICAgICAgIGJpbmRlci5iaW5kKEhrMlJlcXVlc3RTY29wZS5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG8oUmVxdWVzdFNjb3BlLmNsYXNzKTsKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICBSZXF1ZXN0U2NvcGUgcmVxdWVzdCA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoUmVxdWVzdFNjb3BlLmNsYXNzKTsKKyAgICAgICAgQXRvbWljUmVmZXJlbmNlPFN1cHBsaWVyPFN0cmluZz4+IGZpcnN0U3VwcGxpZXIgPSBuZXcgQXRvbWljUmVmZXJlbmNlPD4oKTsKKyAgICAgICAgQXRvbWljUmVmZXJlbmNlPFN1cHBsaWVyPFN0cmluZz4+IHNlY29uZFN1cHBsaWVyID0gbmV3IEF0b21pY1JlZmVyZW5jZTw+KCk7CisgICAgICAgIHJlcXVlc3QucnVuSW5TY29wZSgoKSAtPiB7CisgICAgICAgICAgICBTdXBwbGllcjxTdHJpbmc+IHN1cHBsaWVyMSA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoRElTUE9TQUJMRV9TVVBQTElFUl9UWVBFKTsKKyAgICAgICAgICAgIGZpcnN0U3VwcGxpZXIuc2V0KHN1cHBsaWVyMSk7CisKKyAgICAgICAgICAgIE9iamVjdCBpbnN0YW5jZTEgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCBpbnN0YW5jZTEpOworCisgICAgICAgICAgICByZXF1ZXN0LnJ1bkluU2NvcGUoKCkgLT4geworICAgICAgICAgICAgICAgIC8vIFNhdmUgU2luZ2xldG9uIFN1cHBsaWVyIGZvciBsYXRlciBjaGVjayB0aGF0IHRoZSBpbnN0YW5jZSB3YXMgZGlzcG9zZWQuCisgICAgICAgICAgICAgICAgU3VwcGxpZXI8U3RyaW5nPiBzdXBwbGllcjIgPQorICAgICAgICAgICAgICAgICAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShESVNQT1NBQkxFX1NVUFBMSUVSX1RZUEUpOworICAgICAgICAgICAgICAgIHNlY29uZFN1cHBsaWVyLnNldChzdXBwbGllcjIpOworCisgICAgICAgICAgICAgICAgT2JqZWN0IGluc3RhbmNlMiA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAvLyAxLTIgYmVjYXVzZSB0aGUgc2FtZSBzdGF0aWMgY2xhc3MgaXMgdXNlZCBpbiBpbmhlcml0ZWQgcnVuSW5TY29wZQorICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiMSIsIGluc3RhbmNlMik7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgU3VwcGxpZXI8U3RyaW5nPiBjbGVhbmVkU3VwcGxpZXIxID0gZmlyc3RTdXBwbGllci5nZXQoKTsKKyAgICAgICAgU3VwcGxpZXI8U3RyaW5nPiBjbGVhbmVkU3VwcGxpZXIyID0gc2Vjb25kU3VwcGxpZXIuZ2V0KCk7CisgICAgICAgIC8vIE5leHQgc2hvdWxkIGJlIDEtMQorICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCBjbGVhbmVkU3VwcGxpZXIxLmdldCgpKTsKKyAgICAgICAgLy8gMS0yIGJlY2F1c2UgdGhlIHNhbWUgc3RhdGljIGNsYXNzIGlzIHVzZWQgYnV0IHRoZSBpbnN0YW5jZSBpcyBjbGVhbmVkLgorICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCBjbGVhbmVkU3VwcGxpZXIyLmdldCgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJMb29rdXAgZmllbGRzIGFyZSBub3QgZGlzcG9zZWQgdGhlcmVmb3JlIHRoZXkgc2hvdWxkIG5ldmVyIGJlIHVzZWQgYXMgYSBEaXNwb3NlZFN1cHBsaWVyIGJlY2F1c2UgdGhlIGZpZWxkIHN0YXkgaW4KKyAgICAgKiB7QGxpbmsgU3VwcGxpZXJGYWN0b3J5QnJpZGdlfSBmb3JldmVyLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERpc3Bvc2VDb21wb3NlZE9iamVjdFdpdGhQZXJMb29rdXBGaWVsZHMoKSB7CisgICAgICAgIEJpbmRpbmdUZXN0SGVscGVyLmJpbmQoaW5qZWN0aW9uTWFuYWdlciwgYmluZGVyIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgYmluZGVyLmJpbmRGYWN0b3J5KERpc3Bvc2FibGVTdXBwbGllckltcGwuY2xhc3MsIFNpbmdsZXRvbi5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG8oU3RyaW5nLmNsYXNzKTsKKworICAgICAgICAgICAgICAgICAgICBiaW5kZXIuYmluZEFzQ29udHJhY3QoQ29tcG9zZWRPYmplY3QuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmluKFJlcXVlc3RTY29wZWQuY2xhc3MpOworCisgICAgICAgICAgICAgICAgICAgIGJpbmRlci5iaW5kKEhrMlJlcXVlc3RTY29wZS5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG8oUmVxdWVzdFNjb3BlLmNsYXNzKTsKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICBSZXF1ZXN0U2NvcGUgcmVxdWVzdCA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoUmVxdWVzdFNjb3BlLmNsYXNzKTsKKyAgICAgICAgQXRvbWljUmVmZXJlbmNlPFN1cHBsaWVyPFN0cmluZz4+IGF0b21pY1N1cHBsaWVyID0gbmV3IEF0b21pY1JlZmVyZW5jZTw+KCk7CisgICAgICAgIHJlcXVlc3QucnVuSW5TY29wZSgoKSAtPiB7CisgICAgICAgICAgICAvLyBTYXZlIFNpbmdsZXRvbiBTdXBwbGllciBmb3IgbGF0ZXIgY2hlY2sgdGhhdCB0aGUgaW5zdGFuY2Ugd2FzIGRpc3Bvc2VkLgorICAgICAgICAgICAgU3VwcGxpZXI8U3RyaW5nPiBzdXBwbGllciA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoRElTUE9TQUJMRV9TVVBQTElFUl9UWVBFKTsKKyAgICAgICAgICAgIGF0b21pY1N1cHBsaWVyLnNldChzdXBwbGllcik7CisKKyAgICAgICAgICAgIC8vIEFsbCBpbnN0YW5jZXMgc2hvdWxkIGJlIHRoZSBzYW1lIGJlY2F1c2UgdGhleSBhcmUgcmVxdWVzdCBzY29wZWQuCisgICAgICAgICAgICBDb21wb3NlZE9iamVjdCBpbnN0YW5jZSA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoQ29tcG9zZWRPYmplY3QuY2xhc3MpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgaW5zdGFuY2UuZmlyc3QpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIyIiwgaW5zdGFuY2Uuc2Vjb25kKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMyIsIGluc3RhbmNlLnRoaXJkKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgU3VwcGxpZXI8U3RyaW5nPiBjbGVhbmVkU3VwcGxpZXIgPSBhdG9taWNTdXBwbGllci5nZXQoKTsKKyAgICAgICAgLy8gTmV4dCBzaG91bGQgYmUgNAorICAgICAgICBhc3NlcnRFcXVhbHMoIjQiLCBjbGVhbmVkU3VwcGxpZXIuZ2V0KCkpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENvbXBvc2VkT2JqZWN0IHsKKworICAgICAgICBASW5qZWN0CisgICAgICAgIFN0cmluZyBmaXJzdDsKKworICAgICAgICBASW5qZWN0CisgICAgICAgIFN0cmluZyBzZWNvbmQ7CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBTdHJpbmcgdGhpcmQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRGlzcG9zYWJsZVN1cHBsaWVySW1wbCBpbXBsZW1lbnRzIERpc3Bvc2FibGVTdXBwbGllcjxTdHJpbmc+IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNJbnRlZ2VyIGNvdW50ZXIgPSBuZXcgQXRvbWljSW50ZWdlcigpOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBzdHJpbmcgLSBkb24ndCBzaGFyZSB0aGUgaW5zdGFuY2VzIGluIHRoZSBzdHJpbmcgcG9vbC4KKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGNvdW50ZXIuaW5jcmVtZW50QW5kR2V0KCkgKyAiIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZShmaW5hbCBTdHJpbmcgaW5zdGFuY2UpIHsKKyAgICAgICAgICAgIGNvdW50ZXIuZGVjcmVtZW50QW5kR2V0KCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9pbmplY3QvaGsyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2hrMi9FbmdsaXNoR3JlZXRpbmcuamF2YSBiL2luamVjdC9oazIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvaGsyL0VuZ2xpc2hHcmVldGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MjBmOWIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmplY3QvaGsyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2hrMi9FbmdsaXNoR3JlZXRpbmcuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5oazI7CisKKy8qKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK3B1YmxpYyBjbGFzcyBFbmdsaXNoR3JlZXRpbmcgaW1wbGVtZW50cyBHcmVldGluZywgUHJpbnRhYmxlIHsKKworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgR1JFRVRJTkcgPSAiSGVsbG8iOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRHcmVldGluZygpIHsKKyAgICAgICAgcmV0dXJuIEdSRUVUSU5HOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHByaW50KCkgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oR1JFRVRJTkcpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2luamVjdC9oazIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvaGsyL0dyZWV0aW5nLmphdmEgYi9pbmplY3QvaGsyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2hrMi9HcmVldGluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMjhmZTYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmplY3QvaGsyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2hrMi9HcmVldGluZy5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0LmhrMjsKKworLyoqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworQEZ1bmN0aW9uYWxJbnRlcmZhY2UKK3B1YmxpYyBpbnRlcmZhY2UgR3JlZXRpbmcgeworCisgICAgLyoqCisgICAgICogUmV0dXJucyBncmVldGluZyBpbiBhIHNwZWNpZmljIGxhbmd1YWdlLgorICAgICAqCisgICAgICogQHJldHVybiB0eXBlIG9mIHRoZSBncmVldGluZy4KKyAgICAgKi8KKyAgICBTdHJpbmcgZ2V0R3JlZXRpbmcoKTsKKworfQpkaWZmIC0tZ2l0IGEvaW5qZWN0L2hrMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9oazIvSW5qZWN0aW9uTWFuYWdlclRlc3QuamF2YSBiL2luamVjdC9oazIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvaGsyL0luamVjdGlvbk1hbmFnZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJiZTQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL2luamVjdC9oazIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvaGsyL0luamVjdGlvbk1hbmFnZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0LmhrMjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5CaW5kaW5nczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQ2xhc3NCaW5kaW5nOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25zOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIuYXBpLlNlcnZpY2VMb2NhdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLnV0aWxpdGllcy5CaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIudXRpbGl0aWVzLlNlcnZpY2VMb2NhdG9yVXRpbGl0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLnV0aWxpdGllcy5iaW5kaW5nLkFic3RyYWN0QmluZGVyOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitwdWJsaWMgY2xhc3MgSW5qZWN0aW9uTWFuYWdlclRlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VydmljZUxvY2F0b3JQYXJlbnQoKSB7CisgICAgICAgIEFic3RyYWN0QmluZGVyIGJpbmRlciA9IG5ldyBBYnN0cmFjdEJpbmRlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICAgICAgICAgIGJpbmRBc0NvbnRyYWN0KEVuZ2xpc2hHcmVldGluZy5jbGFzcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIFNlcnZpY2VMb2NhdG9yIHBhcmVudExvY2F0b3IgPSBTZXJ2aWNlTG9jYXRvclV0aWxpdGllcy5iaW5kKGJpbmRlcik7CisKKyAgICAgICAgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyID0gSW5qZWN0aW9ucy5jcmVhdGVJbmplY3Rpb25NYW5hZ2VyKHBhcmVudExvY2F0b3IpOworICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLmNvbXBsZXRlUmVnaXN0cmF0aW9uKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShFbmdsaXNoR3JlZXRpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbmplY3Rpb25NYW5hZ2VyUGFyZW50KCkgeworICAgICAgICBDbGFzc0JpbmRpbmc8RW5nbGlzaEdyZWV0aW5nPiBncmVldGluZ0JpbmRpbmcgPSBCaW5kaW5ncy5zZXJ2aWNlQXNDb250cmFjdChFbmdsaXNoR3JlZXRpbmcuY2xhc3MpOworICAgICAgICBJbmplY3Rpb25NYW5hZ2VyIHBhcmVudEluamVjdGlvbk1hbmFnZXIgPSBJbmplY3Rpb25zLmNyZWF0ZUluamVjdGlvbk1hbmFnZXIoKTsKKyAgICAgICAgcGFyZW50SW5qZWN0aW9uTWFuYWdlci5yZWdpc3RlcihncmVldGluZ0JpbmRpbmcpOworICAgICAgICBwYXJlbnRJbmplY3Rpb25NYW5hZ2VyLmNvbXBsZXRlUmVnaXN0cmF0aW9uKCk7CisKKyAgICAgICAgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyID0gSW5qZWN0aW9ucy5jcmVhdGVJbmplY3Rpb25NYW5hZ2VyKHBhcmVudEluamVjdGlvbk1hbmFnZXIpOworICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLmNvbXBsZXRlUmVnaXN0cmF0aW9uKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShFbmdsaXNoR3JlZXRpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5rbm93blBhcmVudCgpIHsKKyAgICAgICAgSW5qZWN0aW9ucy5jcmVhdGVJbmplY3Rpb25NYW5hZ2VyKG5ldyBPYmplY3QoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNSZWdpc3RyYWJsZSgpIHsKKyAgICAgICAgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyID0gSW5qZWN0aW9ucy5jcmVhdGVJbmplY3Rpb25NYW5hZ2VyKCk7CisgICAgICAgIGFzc2VydFRydWUoaW5qZWN0aW9uTWFuYWdlci5pc1JlZ2lzdHJhYmxlKEJpbmRlci5jbGFzcykpOworICAgICAgICBhc3NlcnRUcnVlKGluamVjdGlvbk1hbmFnZXIuaXNSZWdpc3RyYWJsZShBYnN0cmFjdEJpbmRlci5jbGFzcykpOworICAgICAgICBhc3NlcnRGYWxzZShpbmplY3Rpb25NYW5hZ2VyLmlzUmVnaXN0cmFibGUob3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkFic3RyYWN0QmluZGVyLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGluamVjdGlvbk1hbmFnZXIuaXNSZWdpc3RyYWJsZShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWdpc3RlckJpbmRlcigpIHsKKyAgICAgICAgQWJzdHJhY3RCaW5kZXIgYmluZGVyID0gbmV3IEFic3RyYWN0QmluZGVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgICAgICAgICAgYmluZEFzQ29udHJhY3QoRW5nbGlzaEdyZWV0aW5nLmNsYXNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIgPSBJbmplY3Rpb25zLmNyZWF0ZUluamVjdGlvbk1hbmFnZXIoKTsKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5yZWdpc3RlcihiaW5kZXIpOworICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLmNvbXBsZXRlUmVnaXN0cmF0aW9uKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShFbmdsaXNoR3JlZXRpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVnaXN0ZXJVbmtub3duUHJvdmlkZXIoKSB7CisgICAgICAgIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciA9IEluamVjdGlvbnMuY3JlYXRlSW5qZWN0aW9uTWFuYWdlcigpOworICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyKG5ldyBPYmplY3QoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaW5qZWN0L2hrMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9oazIvUHJpbnRhYmxlLmphdmEgYi9pbmplY3QvaGsyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2hrMi9QcmludGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWYzZDVkCi0tLSAvZGV2L251bGwKKysrIGIvaW5qZWN0L2hrMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9oazIvUHJpbnRhYmxlLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuaGsyOworCisvKioKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitARnVuY3Rpb25hbEludGVyZmFjZQorcHVibGljIGludGVyZmFjZSBQcmludGFibGUgeworCisgICAgdm9pZCBwcmludCgpOworCit9CmRpZmYgLS1naXQgYS9pbmplY3QvaGsyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2hrMi9QcmludGFibGVDb252ZXJzYXRpb24uamF2YSBiL2luamVjdC9oazIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvaGsyL1ByaW50YWJsZUNvbnZlcnNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMzVhOTIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmplY3QvaGsyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2hrMi9QcmludGFibGVDb252ZXJzYXRpb24uamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5oazI7CisKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworCisvKioKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitjbGFzcyBQcmludGFibGVDb252ZXJzYXRpb24geworCisgICAgQEluamVjdAorICAgIEdyZWV0aW5nIGdyZWV0aW5nOworCisgICAgQEluamVjdAorICAgIFN1cHBsaWVyPEdyZWV0aW5nPiBncmVldGluZ1N1cHBsaWVyOworCisgICAgQEluamVjdAorICAgIFByaW50YWJsZSBwcmludGFibGU7CisKKyAgICBASW5qZWN0CisgICAgU3VwcGxpZXI8UHJpbnRhYmxlPiBwcmludGFibGVTdXBwbGllcjsKKworfQpkaWZmIC0tZ2l0IGEvaW5qZWN0L2hrMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9oazIvUHJveGlhYmxlU2luZ2xldG9uLmphdmEgYi9pbmplY3QvaGsyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2hrMi9Qcm94aWFibGVTaW5nbGV0b24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDk5N2FiCi0tLSAvZGV2L251bGwKKysrIGIvaW5qZWN0L2hrMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9oazIvUHJveGlhYmxlU2luZ2xldG9uLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuaGsyOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworaW1wb3J0IGphdmF4LmluamVjdC5TY29wZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLmFwaS5Qcm94aWFibGU7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKKworLyoqCisgKiBUaGlzIHdpbGwgYmUgYSBzY29wZSBmb3IgcHJveGlhYmxlIHNpbmdsZXRvbnMuIE9uZSBvZiB0aG9zZSBzaW5nbGV0b25zIHdpbGwgYmUgYSBmYWN0b3J5LgorICovCitAU2NvcGUKK0BQcm94aWFibGUKK0BSZXRlbnRpb24oUlVOVElNRSkKK0BUYXJnZXQoeyBUWVBFLCBNRVRIT0QgfSkKK3B1YmxpYyBAaW50ZXJmYWNlIFByb3hpYWJsZVNpbmdsZXRvbiB7CisKK30KZGlmZiAtLWdpdCBhL2luamVjdC9oazIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvaGsyL1Byb3hpYWJsZVNpbmdsZXRvbkNvbnRleHQuamF2YSBiL2luamVjdC9oazIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvaGsyL1Byb3hpYWJsZVNpbmdsZXRvbkNvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNWNmMjcxCi0tLSAvZGV2L251bGwKKysrIGIvaW5qZWN0L2hrMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9oazIvUHJveGlhYmxlU2luZ2xldG9uQ29udGV4dC5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0LmhrMjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIuYXBpLkFjdGl2ZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIuYXBpLkNvbnRleHQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIuYXBpLlNlcnZpY2VIYW5kbGU7CisKKy8qKgorICogVGhlIGNvbnRleHQga2VlcGluZyB0aGUgb2JqZWN0cyBjcmVhdGVkIGluIHtAbGluayBQcm94aWFibGVTaW5nbGV0b259IHNjb3BlLgorICovCitAU2luZ2xldG9uCitwdWJsaWMgY2xhc3MgUHJveGlhYmxlU2luZ2xldG9uQ29udGV4dCBpbXBsZW1lbnRzIENvbnRleHQ8UHJveGlhYmxlU2luZ2xldG9uPiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IGdldFNjb3BlKCkgeworICAgICAgICByZXR1cm4gUHJveGlhYmxlU2luZ2xldG9uLmNsYXNzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VT4gVSBmaW5kT3JDcmVhdGUoQWN0aXZlRGVzY3JpcHRvcjxVPiBhY3RpdmVEZXNjcmlwdG9yLCBTZXJ2aWNlSGFuZGxlPD8+IHJvb3QpIHsKKyAgICAgICAgVSBjYWNoZWQgPSBhY3RpdmVEZXNjcmlwdG9yLmdldENhY2hlKCk7CisgICAgICAgIGlmIChjYWNoZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGNhY2hlZDsKKyAgICAgICAgfQorCisgICAgICAgIGNhY2hlZCA9IGFjdGl2ZURlc2NyaXB0b3IuY3JlYXRlKHJvb3QpOworICAgICAgICBhY3RpdmVEZXNjcmlwdG9yLnNldENhY2hlKGNhY2hlZCk7CisgICAgICAgIHJldHVybiBjYWNoZWQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoQWN0aXZlRGVzY3JpcHRvcjw/PiBkZXNjcmlwdG9yKSB7CisgICAgICAgIHJldHVybiBkZXNjcmlwdG9yLmlzQ2FjaGVTZXQoKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95T25lKEFjdGl2ZURlc2NyaXB0b3I8Pz4gZGVzY3JpcHRvcikgeworICAgICAgICBpZiAoIWRlc2NyaXB0b3IuaXNDYWNoZVNldCgpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBPYmplY3QgdmFsdWUgPSBkZXNjcmlwdG9yLmdldENhY2hlKCk7CisgICAgICAgIGRlc2NyaXB0b3IucmVsZWFzZUNhY2hlKCk7CisKKyAgICAgICAgKChBY3RpdmVEZXNjcmlwdG9yPE9iamVjdD4pIGRlc2NyaXB0b3IpLmRpc3Bvc2UodmFsdWUpOworCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNOdWxsQ3JlYXRpb24oKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0FjdGl2ZSgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2h1dGRvd24oKSB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaW5qZWN0L2hrMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9oazIvU3VwcGxpZXJDbGFzc0JpbmRpbmdUZXN0LmphdmEgYi9pbmplY3QvaGsyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2hrMi9TdXBwbGllckNsYXNzQmluZGluZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMmE3OTM4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5qZWN0L2hrMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9oazIvU3VwcGxpZXJDbGFzc0JpbmRpbmdUZXN0LmphdmEKQEAgLTAsMCArMSwxNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0LmhrMjsKKworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RTYW1lOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7CisKKy8qKgorICogVGVzdHMgdGhhdCB7QGxpbmsgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyfSBjYW4gYmUgcmVnaXN0ZXJlZCBhcyBhIGNsYXNzLWZhY3RvcnkuCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK3B1YmxpYyBjbGFzcyBTdXBwbGllckNsYXNzQmluZGluZ1Rlc3QgeworCisgICAgcHJpdmF0ZSBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXI7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXAoKSB7CisgICAgICAgIGluamVjdGlvbk1hbmFnZXIgPSBCaW5kaW5nVGVzdEhlbHBlci5jcmVhdGVJbmplY3Rpb25NYW5hZ2VyKCk7CisgICAgfQorCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgdGVhcmRvd24oKSB7CisgICAgICAgIGluamVjdGlvbk1hbmFnZXIuc2h1dGRvd24oKTsKKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1lc3NhZ2VzKCkgeworICAgICAgICBCaW5kaW5nVGVzdEhlbHBlci5iaW5kKGluamVjdGlvbk1hbmFnZXIsIGJpbmRlciAtPiB7CisgICAgICAgICAgICBiaW5kZXIuYmluZEZhY3RvcnkoU3VwcGxpZXJHcmVldGluZy5jbGFzcykudG8oR3JlZXRpbmcuY2xhc3MpOworICAgICAgICAgICAgYmluZGVyLmJpbmRBc0NvbnRyYWN0KENvbnZlcnNhdGlvbi5jbGFzcyk7CisgICAgICAgIH0pOworCisgICAgICAgIENvbnZlcnNhdGlvbiBjb252ZXJzYXRpb24gPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKENvbnZlcnNhdGlvbi5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhDemVjaEdyZWV0aW5nLkdSRUVUSU5HLCBjb252ZXJzYXRpb24uZ3JlZXRpbmcuZ2V0R3JlZXRpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhDemVjaEdyZWV0aW5nLkdSRUVUSU5HLCBjb252ZXJzYXRpb24uZ3JlZXRpbmdTdXBwbGllci5nZXQoKS5nZXRHcmVldGluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdXBwbGllclBlckxvb2t1cEluc3RhbmNlUGVyTG9va3VwKCkgeworICAgICAgICBCaW5kaW5nVGVzdEhlbHBlci5iaW5kKGluamVjdGlvbk1hbmFnZXIsIGJpbmRlciAtPiB7CisgICAgICAgICAgICBiaW5kZXIuYmluZEZhY3RvcnkoU3VwcGxpZXJHcmVldGluZy5jbGFzcykudG8oR3JlZXRpbmcuY2xhc3MpOworICAgICAgICAgICAgYmluZGVyLmJpbmRBc0NvbnRyYWN0KENvbnZlcnNhdGlvbi5jbGFzcyk7CisgICAgICAgIH0pOworCisgICAgICAgIEdyZWV0aW5nIGdyZWV0aW5nMSA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoQ29udmVyc2F0aW9uLmNsYXNzKS5ncmVldGluZzsKKyAgICAgICAgR3JlZXRpbmcgZ3JlZXRpbmcyID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShDb252ZXJzYXRpb24uY2xhc3MpLmdyZWV0aW5nOworICAgICAgICBHcmVldGluZyBncmVldGluZzMgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKENvbnZlcnNhdGlvbi5jbGFzcykuZ3JlZXRpbmc7CisKKyAgICAgICAgYXNzZXJ0Tm90U2FtZShncmVldGluZzEsIGdyZWV0aW5nMik7CisgICAgICAgIGFzc2VydE5vdFNhbWUoZ3JlZXRpbmcyLCBncmVldGluZzMpOworCisgICAgICAgIFN1cHBsaWVyPEdyZWV0aW5nPiBzdXBwbGllcjEgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKENvbnZlcnNhdGlvbi5jbGFzcykuZ3JlZXRpbmdTdXBwbGllcjsKKyAgICAgICAgU3VwcGxpZXI8R3JlZXRpbmc+IHN1cHBsaWVyMiA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoQ29udmVyc2F0aW9uLmNsYXNzKS5ncmVldGluZ1N1cHBsaWVyOworICAgICAgICBTdXBwbGllcjxHcmVldGluZz4gc3VwcGxpZXIzID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShDb252ZXJzYXRpb24uY2xhc3MpLmdyZWV0aW5nU3VwcGxpZXI7CisKKyAgICAgICAgYXNzZXJ0Tm90U2FtZShzdXBwbGllcjEsIHN1cHBsaWVyMik7CisgICAgICAgIGFzc2VydE5vdFNhbWUoc3VwcGxpZXIyLCBzdXBwbGllcjMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN1cHBsaWVyU2luZ2xldG9uSW5zdGFuY2VQZXJMb29rdXAoKSB7CisgICAgICAgIEJpbmRpbmdUZXN0SGVscGVyLmJpbmQoaW5qZWN0aW9uTWFuYWdlciwgYmluZGVyIC0+IHsKKyAgICAgICAgICAgIGJpbmRlci5iaW5kRmFjdG9yeShTdXBwbGllckdyZWV0aW5nLmNsYXNzLCBTaW5nbGV0b24uY2xhc3MpLnRvKEdyZWV0aW5nLmNsYXNzKTsKKyAgICAgICAgICAgIGJpbmRlci5iaW5kQXNDb250cmFjdChDb252ZXJzYXRpb24uY2xhc3MpOworICAgICAgICB9KTsKKworICAgICAgICBHcmVldGluZyBncmVldGluZzEgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKENvbnZlcnNhdGlvbi5jbGFzcykuZ3JlZXRpbmc7CisgICAgICAgIEdyZWV0aW5nIGdyZWV0aW5nMiA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoQ29udmVyc2F0aW9uLmNsYXNzKS5ncmVldGluZzsKKyAgICAgICAgR3JlZXRpbmcgZ3JlZXRpbmczID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShDb252ZXJzYXRpb24uY2xhc3MpLmdyZWV0aW5nOworCisgICAgICAgIGFzc2VydE5vdFNhbWUoZ3JlZXRpbmcxLCBncmVldGluZzIpOworICAgICAgICBhc3NlcnROb3RTYW1lKGdyZWV0aW5nMiwgZ3JlZXRpbmczKTsKKworICAgICAgICBTdXBwbGllcjxHcmVldGluZz4gc3VwcGxpZXIxID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShDb252ZXJzYXRpb24uY2xhc3MpLmdyZWV0aW5nU3VwcGxpZXI7CisgICAgICAgIFN1cHBsaWVyPEdyZWV0aW5nPiBzdXBwbGllcjIgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKENvbnZlcnNhdGlvbi5jbGFzcykuZ3JlZXRpbmdTdXBwbGllcjsKKyAgICAgICAgU3VwcGxpZXI8R3JlZXRpbmc+IHN1cHBsaWVyMyA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoQ29udmVyc2F0aW9uLmNsYXNzKS5ncmVldGluZ1N1cHBsaWVyOworCisgICAgICAgIGFzc2VydFNhbWUoc3VwcGxpZXIxLCBzdXBwbGllcjIpOworICAgICAgICBhc3NlcnRTYW1lKHN1cHBsaWVyMiwgc3VwcGxpZXIzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdXBwbGllclBlckxvb2t1cEluc3RhbmNlU2luZ2xldG9uKCkgeworICAgICAgICBCaW5kaW5nVGVzdEhlbHBlci5iaW5kKGluamVjdGlvbk1hbmFnZXIsIGJpbmRlciAtPiB7CisgICAgICAgICAgICBiaW5kZXIuYmluZEZhY3RvcnkoU3VwcGxpZXJHcmVldGluZy5jbGFzcykudG8oR3JlZXRpbmcuY2xhc3MpLmluKFNpbmdsZXRvbi5jbGFzcyk7CisgICAgICAgICAgICBiaW5kZXIuYmluZEFzQ29udHJhY3QoQ29udmVyc2F0aW9uLmNsYXNzKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgR3JlZXRpbmcgZ3JlZXRpbmcxID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShDb252ZXJzYXRpb24uY2xhc3MpLmdyZWV0aW5nOworICAgICAgICBHcmVldGluZyBncmVldGluZzIgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKENvbnZlcnNhdGlvbi5jbGFzcykuZ3JlZXRpbmc7CisgICAgICAgIEdyZWV0aW5nIGdyZWV0aW5nMyA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoQ29udmVyc2F0aW9uLmNsYXNzKS5ncmVldGluZzsKKworICAgICAgICBhc3NlcnRTYW1lKGdyZWV0aW5nMSwgZ3JlZXRpbmcyKTsKKyAgICAgICAgYXNzZXJ0U2FtZShncmVldGluZzIsIGdyZWV0aW5nMyk7CisKKyAgICAgICAgU3VwcGxpZXI8R3JlZXRpbmc+IHN1cHBsaWVyMSA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoQ29udmVyc2F0aW9uLmNsYXNzKS5ncmVldGluZ1N1cHBsaWVyOworICAgICAgICBTdXBwbGllcjxHcmVldGluZz4gc3VwcGxpZXIyID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShDb252ZXJzYXRpb24uY2xhc3MpLmdyZWV0aW5nU3VwcGxpZXI7CisgICAgICAgIFN1cHBsaWVyPEdyZWV0aW5nPiBzdXBwbGllcjMgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKENvbnZlcnNhdGlvbi5jbGFzcykuZ3JlZXRpbmdTdXBwbGllcjsKKworICAgICAgICBhc3NlcnROb3RTYW1lKHN1cHBsaWVyMSwgc3VwcGxpZXIyKTsKKyAgICAgICAgYXNzZXJ0Tm90U2FtZShzdXBwbGllcjIsIHN1cHBsaWVyMyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3VwcGxpZXJTaW5nbGV0b25JbnN0YW5jZVNpbmdsZXRvbigpIHsKKyAgICAgICAgQmluZGluZ1Rlc3RIZWxwZXIuYmluZChpbmplY3Rpb25NYW5hZ2VyLCBiaW5kZXIgLT4geworICAgICAgICAgICAgYmluZGVyLmJpbmRGYWN0b3J5KFN1cHBsaWVyR3JlZXRpbmcuY2xhc3MsIFNpbmdsZXRvbi5jbGFzcykudG8oR3JlZXRpbmcuY2xhc3MpLmluKFNpbmdsZXRvbi5jbGFzcyk7CisgICAgICAgICAgICBiaW5kZXIuYmluZEFzQ29udHJhY3QoQ29udmVyc2F0aW9uLmNsYXNzKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgR3JlZXRpbmcgZ3JlZXRpbmcxID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShDb252ZXJzYXRpb24uY2xhc3MpLmdyZWV0aW5nOworICAgICAgICBHcmVldGluZyBncmVldGluZzIgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKENvbnZlcnNhdGlvbi5jbGFzcykuZ3JlZXRpbmc7CisgICAgICAgIEdyZWV0aW5nIGdyZWV0aW5nMyA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoQ29udmVyc2F0aW9uLmNsYXNzKS5ncmVldGluZzsKKworICAgICAgICBhc3NlcnRTYW1lKGdyZWV0aW5nMSwgZ3JlZXRpbmcyKTsKKyAgICAgICAgYXNzZXJ0U2FtZShncmVldGluZzIsIGdyZWV0aW5nMyk7CisKKyAgICAgICAgU3VwcGxpZXI8R3JlZXRpbmc+IHN1cHBsaWVyMSA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoQ29udmVyc2F0aW9uLmNsYXNzKS5ncmVldGluZ1N1cHBsaWVyOworICAgICAgICBTdXBwbGllcjxHcmVldGluZz4gc3VwcGxpZXIyID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShDb252ZXJzYXRpb24uY2xhc3MpLmdyZWV0aW5nU3VwcGxpZXI7CisgICAgICAgIFN1cHBsaWVyPEdyZWV0aW5nPiBzdXBwbGllcjMgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKENvbnZlcnNhdGlvbi5jbGFzcykuZ3JlZXRpbmdTdXBwbGllcjsKKworICAgICAgICBhc3NlcnRTYW1lKHN1cHBsaWVyMSwgc3VwcGxpZXIyKTsKKyAgICAgICAgYXNzZXJ0U2FtZShzdXBwbGllcjIsIHN1cHBsaWVyMyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3VwcGxpZXJCZWFuTmFtZWQoKSB7CisgICAgICAgIEJpbmRpbmdUZXN0SGVscGVyLmJpbmQoaW5qZWN0aW9uTWFuYWdlciwgYmluZGVyIC0+IHsKKyAgICAgICAgICAgIGJpbmRlci5iaW5kRmFjdG9yeShUZXN0U3VwcGxpZXJzLlRlc3RTdXBwbGllci5jbGFzcykubmFtZWQoVGVzdFN1cHBsaWVycy5URVNUKS50byhTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgYmluZGVyLmJpbmRGYWN0b3J5KFRlc3RTdXBwbGllcnMuT3RoZXJUZXN0U3VwcGxpZXIuY2xhc3MpLm5hbWVkKFRlc3RTdXBwbGllcnMuT1RIRVJfVEVTVCkudG8oU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgIGJpbmRlci5iaW5kQXNDb250cmFjdChUZXN0U3VwcGxpZXJzLlRhcmdldFN1cHBsaWVyQmVhbi5jbGFzcyk7CisgICAgICAgIH0pOworCisgICAgICAgIFRlc3RTdXBwbGllcnMuVGFyZ2V0U3VwcGxpZXJCZWFuIGluc3RhbmNlID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShUZXN0U3VwcGxpZXJzLlRhcmdldFN1cHBsaWVyQmVhbi5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhUZXN0U3VwcGxpZXJzLk9USEVSX1RFU1QsIGluc3RhbmNlLm9iaik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3VwcGxpZXJOYW1lZCgpIHsKKyAgICAgICAgQmluZGluZ1Rlc3RIZWxwZXIuYmluZChpbmplY3Rpb25NYW5hZ2VyLCBiaW5kZXIgLT4geworICAgICAgICAgICAgYmluZGVyLmJpbmRGYWN0b3J5KFRlc3RTdXBwbGllcnMuVGVzdFN1cHBsaWVyLmNsYXNzKS5uYW1lZChUZXN0U3VwcGxpZXJzLlRFU1QpLnRvKFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICBiaW5kZXIuYmluZEZhY3RvcnkoVGVzdFN1cHBsaWVycy5PdGhlclRlc3RTdXBwbGllci5jbGFzcykubmFtZWQoVGVzdFN1cHBsaWVycy5PVEhFUl9URVNUKS50byhTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgYmluZGVyLmJpbmRBc0NvbnRyYWN0KFRlc3RTdXBwbGllcnMuVGFyZ2V0U3VwcGxpZXIuY2xhc3MpOworICAgICAgICB9KTsKKworICAgICAgICBUZXN0U3VwcGxpZXJzLlRhcmdldFN1cHBsaWVyIGluc3RhbmNlID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShUZXN0U3VwcGxpZXJzLlRhcmdldFN1cHBsaWVyLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRlc3RTdXBwbGllcnMuT1RIRVJfVEVTVCwgaW5zdGFuY2Uuc3VwcGxpZXIuZ2V0KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2luamVjdC9oazIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvaGsyL1N1cHBsaWVyQ29udHJhY3RzVGVzdC5qYXZhIGIvaW5qZWN0L2hrMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9oazIvU3VwcGxpZXJDb250cmFjdHNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQzYzA0ZQotLS0gL2Rldi9udWxsCisrKyBiL2luamVjdC9oazIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvaGsyL1N1cHBsaWVyQ29udHJhY3RzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjI2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5oazI7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi5hcGkuTXVsdGlFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdFNhbWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKKworLyoqCisgKiBUZXN0cyB0aGF0IHtAbGluayBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXJ9IGNhbiBjb250YWluIG11bHRpcGxlIGNvbnRyYWN0cy4KKyAqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworcHVibGljIGNsYXNzIFN1cHBsaWVyQ29udHJhY3RzVGVzdCB7CisKKyAgICBwcml2YXRlIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlcjsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXR1cCgpIHsKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlciA9IEJpbmRpbmdUZXN0SGVscGVyLmNyZWF0ZUluamVjdGlvbk1hbmFnZXIoKTsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCB0ZWFyZG93bigpIHsKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5zaHV0ZG93bigpOworICAgIH0KKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NGYWN0b3J5SW5zdGFuY2VJbnRlcmZhY2UoKSB7CisgICAgICAgIEJpbmRpbmdUZXN0SGVscGVyLmJpbmQoaW5qZWN0aW9uTWFuYWdlciwgYmluZGVyIC0+IHsKKyAgICAgICAgICAgIGJpbmRlci5iaW5kRmFjdG9yeShTdXBwbGllckdyZWV0aW5nLmNsYXNzKS50byhHcmVldGluZy5jbGFzcyk7CisgICAgICAgICAgICBiaW5kZXIuYmluZEFzQ29udHJhY3QoQ29udmVyc2F0aW9uLmNsYXNzKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgQ29udmVyc2F0aW9uIGNvbnZlcnNhdGlvbiA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoQ29udmVyc2F0aW9uLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjb252ZXJzYXRpb24uZ3JlZXRpbmcpOworICAgICAgICBhc3NlcnROb3ROdWxsKGNvbnZlcnNhdGlvbi5ncmVldGluZ1N1cHBsaWVyLmdldCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbGFzc0ZhY3RvcnlJbnN0YW5jZUltcGxlbWVudGF0aW9uKCkgeworICAgICAgICBCaW5kaW5nVGVzdEhlbHBlci5iaW5kKGluamVjdGlvbk1hbmFnZXIsIGJpbmRlciAtPiB7CisgICAgICAgICAgICBiaW5kZXIuYmluZEZhY3RvcnkoU3VwcGxpZXJHcmVldGluZy5jbGFzcykudG8oQ3plY2hHcmVldGluZy5jbGFzcyk7CisgICAgICAgICAgICBiaW5kZXIuYmluZEFzQ29udHJhY3QoQ3plY2hDb252ZXJzYXRpb24uY2xhc3MpOworICAgICAgICB9KTsKKworICAgICAgICBDemVjaENvbnZlcnNhdGlvbiBjb252ZXJzYXRpb24gPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKEN6ZWNoQ29udmVyc2F0aW9uLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjb252ZXJzYXRpb24uZ3JlZXRpbmcpOworICAgICAgICBhc3NlcnROb3ROdWxsKGNvbnZlcnNhdGlvbi5ncmVldGluZ1N1cHBsaWVyLmdldCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YW5jZUZhY3RvcnlJbnN0YW5jZUludGVyZmFjZSgpIHsKKyAgICAgICAgQmluZGluZ1Rlc3RIZWxwZXIuYmluZChpbmplY3Rpb25NYW5hZ2VyLCBiaW5kZXIgLT4geworICAgICAgICAgICAgYmluZGVyLmJpbmRGYWN0b3J5KG5ldyBTdXBwbGllckdyZWV0aW5nKCkpLnRvKEdyZWV0aW5nLmNsYXNzKTsKKyAgICAgICAgICAgIGJpbmRlci5iaW5kQXNDb250cmFjdChDb252ZXJzYXRpb24uY2xhc3MpOworICAgICAgICB9KTsKKworICAgICAgICBDb252ZXJzYXRpb24gY29udmVyc2F0aW9uID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShDb252ZXJzYXRpb24uY2xhc3MpOworICAgICAgICBhc3NlcnROb3ROdWxsKGNvbnZlcnNhdGlvbi5ncmVldGluZyk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY29udmVyc2F0aW9uLmdyZWV0aW5nU3VwcGxpZXIuZ2V0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbmNlRmFjdG9yeUluc3RhbmNlSW1wbGVtZW50YXRpb24oKSB7CisgICAgICAgIEJpbmRpbmdUZXN0SGVscGVyLmJpbmQoaW5qZWN0aW9uTWFuYWdlciwgYmluZGVyIC0+IHsKKyAgICAgICAgICAgIGJpbmRlci5iaW5kRmFjdG9yeShuZXcgU3VwcGxpZXJHcmVldGluZygpKS50byhDemVjaEdyZWV0aW5nLmNsYXNzKTsKKyAgICAgICAgICAgIGJpbmRlci5iaW5kQXNDb250cmFjdChDemVjaENvbnZlcnNhdGlvbi5jbGFzcyk7CisgICAgICAgIH0pOworCisgICAgICAgIEN6ZWNoQ29udmVyc2F0aW9uIGNvbnZlcnNhdGlvbiA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoQ3plY2hDb252ZXJzYXRpb24uY2xhc3MpOworICAgICAgICBhc3NlcnROb3ROdWxsKGNvbnZlcnNhdGlvbi5ncmVldGluZyk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY29udmVyc2F0aW9uLmdyZWV0aW5nU3VwcGxpZXIuZ2V0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsYXNzRmFjdG9yeU11bHRpcGxlQ29udHJhY3RzKCkgeworICAgICAgICBCaW5kaW5nVGVzdEhlbHBlci5iaW5kKGluamVjdGlvbk1hbmFnZXIsIGJpbmRlciAtPiB7CisgICAgICAgICAgICBiaW5kZXIuYmluZEZhY3RvcnkoU3VwcGxpZXJHcmVldGluZy5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgLnRvKEdyZWV0aW5nLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAudG8oUHJpbnRhYmxlLmNsYXNzKTsKKyAgICAgICAgICAgIGJpbmRlci5iaW5kQXNDb250cmFjdChQcmludGFibGVDb252ZXJzYXRpb24uY2xhc3MpOworICAgICAgICB9KTsKKworICAgICAgICBQcmludGFibGVDb252ZXJzYXRpb24gY29udmVyc2F0aW9uID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShQcmludGFibGVDb252ZXJzYXRpb24uY2xhc3MpOworICAgICAgICBhc3NlcnROb3ROdWxsKGNvbnZlcnNhdGlvbi5ncmVldGluZyk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY29udmVyc2F0aW9uLnByaW50YWJsZSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY29udmVyc2F0aW9uLmdyZWV0aW5nU3VwcGxpZXIpOworICAgICAgICBhc3NlcnROb3ROdWxsKGNvbnZlcnNhdGlvbi5wcmludGFibGVTdXBwbGllcik7CisKKyAgICAgICAgYXNzZXJ0Tm90U2FtZShjb252ZXJzYXRpb24uZ3JlZXRpbmcsIGNvbnZlcnNhdGlvbi5wcmludGFibGUpOworICAgICAgICBhc3NlcnROb3RTYW1lKGNvbnZlcnNhdGlvbi5ncmVldGluZ1N1cHBsaWVyLCBjb252ZXJzYXRpb24ucHJpbnRhYmxlU3VwcGxpZXIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsYXNzRmFjdG9yeVNpbmdsZXRvbk11bHRpcGxlQ29udHJhY3RzKCkgeworICAgICAgICBCaW5kaW5nVGVzdEhlbHBlci5iaW5kKGluamVjdGlvbk1hbmFnZXIsIGJpbmRlciAtPiB7CisgICAgICAgICAgICBiaW5kZXIuYmluZEZhY3RvcnkoU3VwcGxpZXJHcmVldGluZy5jbGFzcywgU2luZ2xldG9uLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAudG8oR3JlZXRpbmcuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIC50byhQcmludGFibGUuY2xhc3MpOworICAgICAgICAgICAgYmluZGVyLmJpbmRBc0NvbnRyYWN0KFByaW50YWJsZUNvbnZlcnNhdGlvbi5jbGFzcyk7CisgICAgICAgIH0pOworCisgICAgICAgIFByaW50YWJsZUNvbnZlcnNhdGlvbiBjb252ZXJzYXRpb24gPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKFByaW50YWJsZUNvbnZlcnNhdGlvbi5jbGFzcyk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY29udmVyc2F0aW9uLmdyZWV0aW5nKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjb252ZXJzYXRpb24ucHJpbnRhYmxlKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjb252ZXJzYXRpb24uZ3JlZXRpbmdTdXBwbGllcik7CisgICAgICAgIGFzc2VydE5vdE51bGwoY29udmVyc2F0aW9uLnByaW50YWJsZVN1cHBsaWVyKTsKKworICAgICAgICBhc3NlcnROb3RTYW1lKGNvbnZlcnNhdGlvbi5ncmVldGluZywgY29udmVyc2F0aW9uLnByaW50YWJsZSk7CisgICAgICAgIGFzc2VydFNhbWUoY29udmVyc2F0aW9uLmdyZWV0aW5nU3VwcGxpZXIsIGNvbnZlcnNhdGlvbi5wcmludGFibGVTdXBwbGllcik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NGYWN0b3J5TXVsdGlwbGVDb250cmFjdHNTaW5nbGV0b24oKSB7CisgICAgICAgIEJpbmRpbmdUZXN0SGVscGVyLmJpbmQoaW5qZWN0aW9uTWFuYWdlciwgYmluZGVyIC0+IHsKKyAgICAgICAgICAgIGJpbmRlci5iaW5kRmFjdG9yeShTdXBwbGllckdyZWV0aW5nLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAudG8oR3JlZXRpbmcuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIC50byhQcmludGFibGUuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIC5pbihTaW5nbGV0b24uY2xhc3MpOworICAgICAgICAgICAgYmluZGVyLmJpbmRBc0NvbnRyYWN0KFByaW50YWJsZUNvbnZlcnNhdGlvbi5jbGFzcyk7CisgICAgICAgIH0pOworCisgICAgICAgIFByaW50YWJsZUNvbnZlcnNhdGlvbiBjb252ZXJzYXRpb24gPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKFByaW50YWJsZUNvbnZlcnNhdGlvbi5jbGFzcyk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY29udmVyc2F0aW9uLmdyZWV0aW5nKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjb252ZXJzYXRpb24ucHJpbnRhYmxlKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjb252ZXJzYXRpb24uZ3JlZXRpbmdTdXBwbGllcik7CisgICAgICAgIGFzc2VydE5vdE51bGwoY29udmVyc2F0aW9uLnByaW50YWJsZVN1cHBsaWVyKTsKKworICAgICAgICBhc3NlcnRTYW1lKGNvbnZlcnNhdGlvbi5ncmVldGluZywgY29udmVyc2F0aW9uLnByaW50YWJsZSk7CisgICAgICAgIGFzc2VydE5vdFNhbWUoY29udmVyc2F0aW9uLmdyZWV0aW5nU3VwcGxpZXIsIGNvbnZlcnNhdGlvbi5wcmludGFibGVTdXBwbGllcik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFuY2VGYWN0b3J5TXVsdGlwbGVDb250cmFjdHMoKSB7CisgICAgICAgIEJpbmRpbmdUZXN0SGVscGVyLmJpbmQoaW5qZWN0aW9uTWFuYWdlciwgYmluZGVyIC0+IHsKKyAgICAgICAgICAgIGJpbmRlci5iaW5kRmFjdG9yeShuZXcgU3VwcGxpZXJHcmVldGluZygpKQorICAgICAgICAgICAgICAgICAgICAudG8oR3JlZXRpbmcuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIC50byhQcmludGFibGUuY2xhc3MpOworICAgICAgICAgICAgYmluZGVyLmJpbmRBc0NvbnRyYWN0KFByaW50YWJsZUNvbnZlcnNhdGlvbi5jbGFzcyk7CisgICAgICAgIH0pOworCisgICAgICAgIFByaW50YWJsZUNvbnZlcnNhdGlvbiBjb252ZXJzYXRpb24gPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKFByaW50YWJsZUNvbnZlcnNhdGlvbi5jbGFzcyk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY29udmVyc2F0aW9uLmdyZWV0aW5nKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjb252ZXJzYXRpb24ucHJpbnRhYmxlKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjb252ZXJzYXRpb24uZ3JlZXRpbmdTdXBwbGllcik7CisgICAgICAgIGFzc2VydE5vdE51bGwoY29udmVyc2F0aW9uLnByaW50YWJsZVN1cHBsaWVyKTsKKworICAgICAgICBhc3NlcnROb3RTYW1lKGNvbnZlcnNhdGlvbi5ncmVldGluZywgY29udmVyc2F0aW9uLnByaW50YWJsZSk7CisgICAgICAgIGFzc2VydFNhbWUoY29udmVyc2F0aW9uLmdyZWV0aW5nU3VwcGxpZXIsIGNvbnZlcnNhdGlvbi5wcmludGFibGVTdXBwbGllcik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFuY2VGYWN0b3J5TXVsdGlwbGVDb250cmFjdHNTaW5nbGV0b24oKSB7CisgICAgICAgIEJpbmRpbmdUZXN0SGVscGVyLmJpbmQoaW5qZWN0aW9uTWFuYWdlciwgYmluZGVyIC0+IHsKKyAgICAgICAgICAgIGJpbmRlci5iaW5kRmFjdG9yeShuZXcgU3VwcGxpZXJHcmVldGluZygpKQorICAgICAgICAgICAgICAgICAgICAudG8oR3JlZXRpbmcuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIC50byhQcmludGFibGUuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIC5pbihTaW5nbGV0b24uY2xhc3MpOworICAgICAgICAgICAgYmluZGVyLmJpbmRBc0NvbnRyYWN0KFByaW50YWJsZUNvbnZlcnNhdGlvbi5jbGFzcyk7CisgICAgICAgIH0pOworCisgICAgICAgIFByaW50YWJsZUNvbnZlcnNhdGlvbiBjb252ZXJzYXRpb24gPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKFByaW50YWJsZUNvbnZlcnNhdGlvbi5jbGFzcyk7CisgICAgICAgIGFzc2VydE5vdE51bGwoY29udmVyc2F0aW9uLmdyZWV0aW5nKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjb252ZXJzYXRpb24ucHJpbnRhYmxlKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChjb252ZXJzYXRpb24uZ3JlZXRpbmdTdXBwbGllcik7CisgICAgICAgIGFzc2VydE5vdE51bGwoY29udmVyc2F0aW9uLnByaW50YWJsZVN1cHBsaWVyKTsKKworICAgICAgICBhc3NlcnRTYW1lKGNvbnZlcnNhdGlvbi5ncmVldGluZywgY29udmVyc2F0aW9uLnByaW50YWJsZSk7CisgICAgICAgIGFzc2VydFNhbWUoY29udmVyc2F0aW9uLmdyZWV0aW5nU3VwcGxpZXIsIGNvbnZlcnNhdGlvbi5wcmludGFibGVTdXBwbGllcik7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBNdWx0aUV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NGYWN0b3J5RmFpbGVkV3JvbmdJbXBsZW1lbnRhdGlvbigpIHsKKyAgICAgICAgQmluZGluZ1Rlc3RIZWxwZXIuYmluZChpbmplY3Rpb25NYW5hZ2VyLCBiaW5kZXIgLT4geworICAgICAgICAgICAgYmluZGVyLmJpbmRGYWN0b3J5KFN1cHBsaWVyR3JlZXRpbmcuY2xhc3MpLnRvKEVuZ2xpc2hHcmVldGluZy5jbGFzcyk7CisgICAgICAgICAgICBiaW5kZXIuYmluZEFzQ29udHJhY3QoQ29udmVyc2F0aW9uLmNsYXNzKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShDb252ZXJzYXRpb24uY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gTXVsdGlFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbmNlRmFjdG9yeUZhaWxzV3JvbmdJbXBsZW1lbnRhdGlvbigpIHsKKyAgICAgICAgQmluZGluZ1Rlc3RIZWxwZXIuYmluZChpbmplY3Rpb25NYW5hZ2VyLCBiaW5kZXIgLT4geworICAgICAgICAgICAgYmluZGVyLmJpbmRGYWN0b3J5KG5ldyBTdXBwbGllckdyZWV0aW5nKCkpLnRvKEVuZ2xpc2hHcmVldGluZy5jbGFzcyk7CisgICAgICAgICAgICBiaW5kZXIuYmluZEFzQ29udHJhY3QoQ29udmVyc2F0aW9uLmNsYXNzKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShDb252ZXJzYXRpb24uY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gTXVsdGlFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdEZhaWxzSW1wbGVtZW50YXRpb25CdXRJbnRlcmZhY2VFeHBlY3RlZCgpIHsKKyAgICAgICAgQmluZGluZ1Rlc3RIZWxwZXIuYmluZChpbmplY3Rpb25NYW5hZ2VyLCBiaW5kZXIgLT4geworICAgICAgICAgICAgYmluZGVyLmJpbmRGYWN0b3J5KG5ldyBTdXBwbGllckdyZWV0aW5nKCkpLnRvKEN6ZWNoR3JlZXRpbmcuY2xhc3MpOworICAgICAgICAgICAgYmluZGVyLmJpbmRBc0NvbnRyYWN0KENvbnZlcnNhdGlvbi5jbGFzcyk7CisgICAgICAgIH0pOworCisgICAgICAgIGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoQ29udmVyc2F0aW9uLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9pbmplY3QvaGsyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2hrMi9TdXBwbGllckdyZWV0aW5nLmphdmEgYi9pbmplY3QvaGsyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2hrMi9TdXBwbGllckdyZWV0aW5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ4MDI1MwotLS0gL2Rldi9udWxsCisrKyBiL2luamVjdC9oazIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvaGsyL1N1cHBsaWVyR3JlZXRpbmcuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5oazI7CisKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CisKKy8qKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK3B1YmxpYyBjbGFzcyBTdXBwbGllckdyZWV0aW5nIGltcGxlbWVudHMgU3VwcGxpZXI8R3JlZXRpbmc+IHsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGdyZWV0aW5nVHlwZTsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgICovCisgICAgcHVibGljIFN1cHBsaWVyR3JlZXRpbmcoKSB7CisgICAgICAgIHRoaXMoQ3plY2hHcmVldGluZy5HUkVFVElORyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3VwcGxpZXIncyBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBncmVldGluZ1R5cGUgZ3JlZXRpbmdUeXBlIGluIGEgc3BlY2lmaWMgbGFuZ3VhZ2UuCisgICAgICovCisgICAgcHVibGljIFN1cHBsaWVyR3JlZXRpbmcoU3RyaW5nIGdyZWV0aW5nVHlwZSkgeworICAgICAgICB0aGlzLmdyZWV0aW5nVHlwZSA9IGdyZWV0aW5nVHlwZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgR3JlZXRpbmcgZ2V0KCkgeworICAgICAgICBpZiAoQ3plY2hHcmVldGluZy5HUkVFVElORy5lcXVhbHMoZ3JlZXRpbmdUeXBlKSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDemVjaEdyZWV0aW5nKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEVuZ2xpc2hHcmVldGluZygpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaW5qZWN0L2hrMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9oazIvU3VwcGxpZXJJbnN0YW5jZUJpbmRpbmdUZXN0LmphdmEgYi9pbmplY3QvaGsyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2hrMi9TdXBwbGllckluc3RhbmNlQmluZGluZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2NjYzEwCi0tLSAvZGV2L251bGwKKysrIGIvaW5qZWN0L2hrMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2luamVjdC9oazIvU3VwcGxpZXJJbnN0YW5jZUJpbmRpbmdUZXN0LmphdmEKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0LmhrMjsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5TdXBwbGllcjsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RTYW1lOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7CisKKy8qKgorICogVGVzdHMgdGhhdCB7QGxpbmsgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyfSBjYW4gYmUgcmVnaXN0ZXJlZCBhcyBhIGluc3RhbmNlLWZhY3RvcnkuCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK3B1YmxpYyBjbGFzcyBTdXBwbGllckluc3RhbmNlQmluZGluZ1Rlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTXlTdXBwbGllciBpbXBsZW1lbnRzIFN1cHBsaWVyPEludGVnZXI+IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIEF0b21pY0ludGVnZXIgY291bnRlciA9IG5ldyBBdG9taWNJbnRlZ2VyKCk7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBJbnRlZ2VyIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBjb3VudGVyLmluY3JlbWVudEFuZEdldCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXI7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXAoKSB7CisgICAgICAgIGluamVjdGlvbk1hbmFnZXIgPSBCaW5kaW5nVGVzdEhlbHBlci5jcmVhdGVJbmplY3Rpb25NYW5hZ2VyKCk7CisgICAgfQorCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgdGVhcmRvd24oKSB7CisgICAgICAgIGluamVjdGlvbk1hbmFnZXIuc2h1dGRvd24oKTsKKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluc3RhbmNlRmFjdG9yeSgpIHsKKyAgICAgICAgTXlTdXBwbGllciBzdXBwbGllciA9IG5ldyBNeVN1cHBsaWVyKCk7CisgICAgICAgIHN1cHBsaWVyLmdldCgpOworICAgICAgICBzdXBwbGllci5nZXQoKTsKKworICAgICAgICBCaW5kaW5nVGVzdEhlbHBlci5iaW5kKGluamVjdGlvbk1hbmFnZXIsIGJpbmRlciAtPgorICAgICAgICAgICAgICAgIGJpbmRlci5iaW5kRmFjdG9yeShzdXBwbGllcikudG8oSW50ZWdlci5jbGFzcykpOworCisgICAgICAgIGFzc2VydEVxdWFscygoSW50ZWdlcikgMywgaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShJbnRlZ2VyLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygoSW50ZWdlcikgNCwgaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShJbnRlZ2VyLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWVzc2FnZXMoKSB7CisgICAgICAgIEJpbmRpbmdUZXN0SGVscGVyLmJpbmQoaW5qZWN0aW9uTWFuYWdlciwgYmluZGVyIC0+IHsKKyAgICAgICAgICAgIGJpbmRlci5iaW5kRmFjdG9yeShuZXcgU3VwcGxpZXJHcmVldGluZygpKS50byhHcmVldGluZy5jbGFzcyk7CisgICAgICAgICAgICBiaW5kZXIuYmluZEFzQ29udHJhY3QoQ29udmVyc2F0aW9uLmNsYXNzKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgQ29udmVyc2F0aW9uIGNvbnZlcnNhdGlvbiA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoQ29udmVyc2F0aW9uLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEN6ZWNoR3JlZXRpbmcuR1JFRVRJTkcsIGNvbnZlcnNhdGlvbi5ncmVldGluZy5nZXRHcmVldGluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEN6ZWNoR3JlZXRpbmcuR1JFRVRJTkcsIGNvbnZlcnNhdGlvbi5ncmVldGluZ1N1cHBsaWVyLmdldCgpLmdldEdyZWV0aW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN1cHBsaWVyU2luZ2xldG9uSW5zdGFuY2VQZXJMb29rdXAoKSB7CisgICAgICAgIEJpbmRpbmdUZXN0SGVscGVyLmJpbmQoaW5qZWN0aW9uTWFuYWdlciwgYmluZGVyIC0+IHsKKyAgICAgICAgICAgIGJpbmRlci5iaW5kRmFjdG9yeShuZXcgU3VwcGxpZXJHcmVldGluZygpKS50byhHcmVldGluZy5jbGFzcyk7CisgICAgICAgICAgICBiaW5kZXIuYmluZEFzQ29udHJhY3QoQ29udmVyc2F0aW9uLmNsYXNzKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgR3JlZXRpbmcgZ3JlZXRpbmcxID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShDb252ZXJzYXRpb24uY2xhc3MpLmdyZWV0aW5nOworICAgICAgICBHcmVldGluZyBncmVldGluZzIgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKENvbnZlcnNhdGlvbi5jbGFzcykuZ3JlZXRpbmc7CisgICAgICAgIEdyZWV0aW5nIGdyZWV0aW5nMyA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoQ29udmVyc2F0aW9uLmNsYXNzKS5ncmVldGluZzsKKworICAgICAgICBhc3NlcnROb3RTYW1lKGdyZWV0aW5nMSwgZ3JlZXRpbmcyKTsKKyAgICAgICAgYXNzZXJ0Tm90U2FtZShncmVldGluZzIsIGdyZWV0aW5nMyk7CisKKyAgICAgICAgU3VwcGxpZXI8R3JlZXRpbmc+IHN1cHBsaWVyMSA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoQ29udmVyc2F0aW9uLmNsYXNzKS5ncmVldGluZ1N1cHBsaWVyOworICAgICAgICBTdXBwbGllcjxHcmVldGluZz4gc3VwcGxpZXIyID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShDb252ZXJzYXRpb24uY2xhc3MpLmdyZWV0aW5nU3VwcGxpZXI7CisgICAgICAgIFN1cHBsaWVyPEdyZWV0aW5nPiBzdXBwbGllcjMgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKENvbnZlcnNhdGlvbi5jbGFzcykuZ3JlZXRpbmdTdXBwbGllcjsKKworICAgICAgICBhc3NlcnRTYW1lKHN1cHBsaWVyMSwgc3VwcGxpZXIyKTsKKyAgICAgICAgYXNzZXJ0U2FtZShzdXBwbGllcjIsIHN1cHBsaWVyMyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3VwcGxpZXJTaW5nbGV0b25JbnN0YW5jZVNpbmdsZXRvbigpIHsKKyAgICAgICAgQmluZGluZ1Rlc3RIZWxwZXIuYmluZChpbmplY3Rpb25NYW5hZ2VyLCBiaW5kZXIgLT4geworICAgICAgICAgICAgYmluZGVyLmJpbmRGYWN0b3J5KFN1cHBsaWVyR3JlZXRpbmcuY2xhc3MsIFNpbmdsZXRvbi5jbGFzcykudG8oR3JlZXRpbmcuY2xhc3MpLmluKFNpbmdsZXRvbi5jbGFzcyk7CisgICAgICAgICAgICBiaW5kZXIuYmluZEFzQ29udHJhY3QoQ29udmVyc2F0aW9uLmNsYXNzKTsKKyAgICAgICAgfSk7CisKKyAgICAgICAgR3JlZXRpbmcgZ3JlZXRpbmcxID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShDb252ZXJzYXRpb24uY2xhc3MpLmdyZWV0aW5nOworICAgICAgICBHcmVldGluZyBncmVldGluZzIgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKENvbnZlcnNhdGlvbi5jbGFzcykuZ3JlZXRpbmc7CisgICAgICAgIEdyZWV0aW5nIGdyZWV0aW5nMyA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoQ29udmVyc2F0aW9uLmNsYXNzKS5ncmVldGluZzsKKworICAgICAgICBhc3NlcnRTYW1lKGdyZWV0aW5nMSwgZ3JlZXRpbmcyKTsKKyAgICAgICAgYXNzZXJ0U2FtZShncmVldGluZzIsIGdyZWV0aW5nMyk7CisKKyAgICAgICAgU3VwcGxpZXI8R3JlZXRpbmc+IHN1cHBsaWVyMSA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoQ29udmVyc2F0aW9uLmNsYXNzKS5ncmVldGluZ1N1cHBsaWVyOworICAgICAgICBTdXBwbGllcjxHcmVldGluZz4gc3VwcGxpZXIyID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShDb252ZXJzYXRpb24uY2xhc3MpLmdyZWV0aW5nU3VwcGxpZXI7CisgICAgICAgIFN1cHBsaWVyPEdyZWV0aW5nPiBzdXBwbGllcjMgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKENvbnZlcnNhdGlvbi5jbGFzcykuZ3JlZXRpbmdTdXBwbGllcjsKKworICAgICAgICBhc3NlcnRTYW1lKHN1cHBsaWVyMSwgc3VwcGxpZXIyKTsKKyAgICAgICAgYXNzZXJ0U2FtZShzdXBwbGllcjIsIHN1cHBsaWVyMyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3VwcGxpZXJCZWFuTmFtZWQoKSB7CisgICAgICAgIEJpbmRpbmdUZXN0SGVscGVyLmJpbmQoaW5qZWN0aW9uTWFuYWdlciwgYmluZGVyIC0+IHsKKyAgICAgICAgICAgIGJpbmRlci5iaW5kRmFjdG9yeShuZXcgVGVzdFN1cHBsaWVycy5UZXN0U3VwcGxpZXIoKSkubmFtZWQoVGVzdFN1cHBsaWVycy5URVNUKS50byhTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgYmluZGVyLmJpbmRGYWN0b3J5KG5ldyBUZXN0U3VwcGxpZXJzLk90aGVyVGVzdFN1cHBsaWVyKCkpLm5hbWVkKFRlc3RTdXBwbGllcnMuT1RIRVJfVEVTVCkudG8oU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgIGJpbmRlci5iaW5kQXNDb250cmFjdChUZXN0U3VwcGxpZXJzLlRhcmdldFN1cHBsaWVyQmVhbi5jbGFzcyk7CisgICAgICAgIH0pOworCisgICAgICAgIFRlc3RTdXBwbGllcnMuVGFyZ2V0U3VwcGxpZXJCZWFuIGluc3RhbmNlID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShUZXN0U3VwcGxpZXJzLlRhcmdldFN1cHBsaWVyQmVhbi5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhUZXN0U3VwcGxpZXJzLk9USEVSX1RFU1QsIGluc3RhbmNlLm9iaik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3VwcGxpZXJOYW1lZCgpIHsKKyAgICAgICAgQmluZGluZ1Rlc3RIZWxwZXIuYmluZChpbmplY3Rpb25NYW5hZ2VyLCBiaW5kZXIgLT4geworICAgICAgICAgICAgYmluZGVyLmJpbmRGYWN0b3J5KG5ldyBUZXN0U3VwcGxpZXJzLlRlc3RTdXBwbGllcigpKS5uYW1lZChUZXN0U3VwcGxpZXJzLlRFU1QpLnRvKFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICBiaW5kZXIuYmluZEZhY3RvcnkobmV3IFRlc3RTdXBwbGllcnMuT3RoZXJUZXN0U3VwcGxpZXIoKSkubmFtZWQoVGVzdFN1cHBsaWVycy5PVEhFUl9URVNUKS50byhTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgYmluZGVyLmJpbmRBc0NvbnRyYWN0KFRlc3RTdXBwbGllcnMuVGFyZ2V0U3VwcGxpZXIuY2xhc3MpOworICAgICAgICB9KTsKKworICAgICAgICBUZXN0U3VwcGxpZXJzLlRhcmdldFN1cHBsaWVyIGluc3RhbmNlID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShUZXN0U3VwcGxpZXJzLlRhcmdldFN1cHBsaWVyLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFRlc3RTdXBwbGllcnMuT1RIRVJfVEVTVCwgaW5zdGFuY2Uuc3VwcGxpZXIuZ2V0KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2luamVjdC9oazIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvaGsyL1N1cHBsaWVyUHJveHlUZXN0LmphdmEgYi9pbmplY3QvaGsyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2hrMi9TdXBwbGllclByb3h5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3OTc3NWQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmplY3QvaGsyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2hrMi9TdXBwbGllclByb3h5VGVzdC5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0LmhrMjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBUZXN0cyB0aGF0IHtAbGluayBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXJ9IGNhbiBjb250YWluIHByb3hpZXMuCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK3B1YmxpYyBjbGFzcyBTdXBwbGllclByb3h5VGVzdCB7CisKKyAgICBwcml2YXRlIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlcjsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXR1cCgpIHsKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlciA9IEJpbmRpbmdUZXN0SGVscGVyLmNyZWF0ZUluamVjdGlvbk1hbmFnZXIoKTsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCB0ZWFyZG93bigpIHsKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5zaHV0ZG93bigpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsYXNzU3VwcGxpZXJQcm94eSgpIHsKKyAgICAgICAgQmluZGluZ1Rlc3RIZWxwZXIuYmluZChpbmplY3Rpb25NYW5hZ2VyLCBiaW5kZXIgLT4geworICAgICAgICAgICAgYmluZGVyLmJpbmRGYWN0b3J5KFN1cHBsaWVyR3JlZXRpbmcuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIC50byhHcmVldGluZy5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgLnByb3h5KHRydWUpCisgICAgICAgICAgICAgICAgICAgIC5pbihQcm94aWFibGVTaW5nbGV0b24uY2xhc3MpOworCisgICAgICAgICAgICBiaW5kZXIuYmluZChuZXcgUHJveGlhYmxlU2luZ2xldG9uQ29udGV4dCgpKQorICAgICAgICAgICAgICAgICAgICAudG8oUHJveGlhYmxlU2luZ2xldG9uQ29udGV4dC5jbGFzcyk7CisKKyAgICAgICAgICAgIGJpbmRlci5iaW5kQXNDb250cmFjdChDb252ZXJzYXRpb24uY2xhc3MpOworICAgICAgICB9KTsKKworICAgICAgICBDb252ZXJzYXRpb24gY29udmVyc2F0aW9uID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShDb252ZXJzYXRpb24uY2xhc3MpOworICAgICAgICBhc3NlcnRUcnVlKGNvbnZlcnNhdGlvbi5ncmVldGluZy5nZXRDbGFzcygpLmdldE5hbWUoKS5zdGFydHNXaXRoKCJjb20uc3VuLnByb3h5IikpOworICAgICAgICBhc3NlcnRGYWxzZShjb252ZXJzYXRpb24uZ3JlZXRpbmdTdXBwbGllci5nZXRDbGFzcygpLmdldE5hbWUoKS5zdGFydHNXaXRoKCJjb20uc3VuLnByb3h5IikpOworICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLnNodXRkb3duKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFuY2VTdXBwbGllclByb3h5KCkgeworICAgICAgICBCaW5kaW5nVGVzdEhlbHBlci5iaW5kKGluamVjdGlvbk1hbmFnZXIsIGJpbmRlciAtPiB7CisgICAgICAgICAgICBiaW5kZXIuYmluZEZhY3RvcnkobmV3IFN1cHBsaWVyR3JlZXRpbmcoKSkKKyAgICAgICAgICAgICAgICAgICAgLnRvKEdyZWV0aW5nLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAucHJveHkodHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgLmluKFByb3hpYWJsZVNpbmdsZXRvbi5jbGFzcyk7CisKKyAgICAgICAgICAgIGJpbmRlci5iaW5kKG5ldyBQcm94aWFibGVTaW5nbGV0b25Db250ZXh0KCkpCisgICAgICAgICAgICAgICAgICAgIC50byhQcm94aWFibGVTaW5nbGV0b25Db250ZXh0LmNsYXNzKTsKKworICAgICAgICAgICAgYmluZGVyLmJpbmRBc0NvbnRyYWN0KENvbnZlcnNhdGlvbi5jbGFzcyk7CisgICAgICAgIH0pOworCisgICAgICAgIENvbnZlcnNhdGlvbiBjb252ZXJzYXRpb24gPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKENvbnZlcnNhdGlvbi5jbGFzcyk7CisgICAgICAgIGFzc2VydFRydWUoY29udmVyc2F0aW9uLmdyZWV0aW5nLmdldENsYXNzKCkuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoImNvbS5zdW4ucHJveHkiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGNvbnZlcnNhdGlvbi5ncmVldGluZ1N1cHBsaWVyLmdldENsYXNzKCkuZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoImNvbS5zdW4ucHJveHkiKSk7CisgICAgICAgIGluamVjdGlvbk1hbmFnZXIuc2h1dGRvd24oKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9pbmplY3QvaGsyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2hrMi9UZXN0U3VwcGxpZXJzLmphdmEgYi9pbmplY3QvaGsyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvaW5qZWN0L2hrMi9UZXN0U3VwcGxpZXJzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg3YWM0NgotLS0gL2Rldi9udWxsCisrKyBiL2luamVjdC9oazIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9pbmplY3QvaGsyL1Rlc3RTdXBwbGllcnMuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5oazI7CisKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LmluamVjdC5OYW1lZDsKKworLyoqCisgKiBTZXQgb2Ygc3VwcGxpZXJzIHRvIGluamVjdC4KKyAqLworcHVibGljIGNsYXNzIFRlc3RTdXBwbGllcnMgeworCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUID0gIlRlc3QiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1RIRVJfVEVTVCA9ICJPdGhlclRlc3QiOworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUYXJnZXRTdXBwbGllckJlYW4geworICAgICAgICBASW5qZWN0CisgICAgICAgIEBOYW1lZChPVEhFUl9URVNUKQorICAgICAgICBwdWJsaWMgU3RyaW5nIG9iajsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRhcmdldFN1cHBsaWVyIHsKKyAgICAgICAgQEluamVjdAorICAgICAgICBATmFtZWQoT1RIRVJfVEVTVCkKKyAgICAgICAgcHVibGljIFN1cHBsaWVyPFN0cmluZz4gc3VwcGxpZXI7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0U3VwcGxpZXIgaW1wbGVtZW50cyBTdXBwbGllcjxTdHJpbmc+IHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIFRFU1Q7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE90aGVyVGVzdFN1cHBsaWVyIGltcGxlbWVudHMgU3VwcGxpZXI8U3RyaW5nPiB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBPVEhFUl9URVNUOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvaW5qZWN0L3BvbS54bWwgYi9pbmplY3QvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTVjMTRiCi0tLSAvZGV2L251bGwKKysrIGIvaW5qZWN0L3BvbS54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleTwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdDwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LWluamVjdDwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5Db250YWlucyBJbmplY3Rpb25NYW5hZ2VyIGltcGxlbWVudGF0aW9uczwvZGVzY3JpcHRpb24+CisKKyAgICA8bW9kdWxlcz4KKyAgICAgICAgPG1vZHVsZT5jZGkyLXNlPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+aGsyPC9tb2R1bGU+CisgICAgPC9tb2R1bGVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWVkaWEvamF4Yi9wb20ueG1sIGIvbWVkaWEvamF4Yi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1YzMwOWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXhiL3BvbS54bWwKQEAgLTAsMCArMSwxNDMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtamF4YjwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS1tZWRpYS1qYXhiPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBKQVgtUlMgZmVhdHVyZXMgYmFzZWQgdXBvbiBKQVgtQi4KKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cmVzb3VyY2VzPgorICAgICAgICAgICAgPHJlc291cmNlPgorICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICA8ZmlsdGVyaW5nPnRydWU8L2ZpbHRlcmluZz4KKyAgICAgICAgICAgIDwvcmVzb3VyY2U+CisgICAgICAgIDwvcmVzb3VyY2VzPgorICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPCEtLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4Y2x1ZGluZyBvbmx5ICoudGVzdHMuKiBwYWNrYWdlcyBmb3IgdGhpcyBtb2R1bGUuIEF0IGxlYXN0IG9uZSBjbGFzcyBoYXMgdG8gZXhpc3QgaW4gbm9uLWV4Y2x1ZGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZXMgdG8gZ2VuZXJhdGUgcHJvcGVyIC1qYXZhZG9jLmphciBmaWxlLiBTZWUgaHR0cHM6Ly9qaXJhLmNvZGVoYXVzLm9yZy9icm93c2UvTUpBVkFET0MtMzI5CisgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVQYWNrYWdlTmFtZXM+Ki50ZXN0cy4qPC9leGNsdWRlUGFja2FnZU5hbWVzPgorICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c291cmNlPiR7amF2YS52ZXJzaW9ufTwvc291cmNlPgorICAgICAgICAgICAgICAgICAgICA8dGFyZ2V0PiR7amF2YS52ZXJzaW9ufTwvdGFyZ2V0PgorICAgICAgICAgICAgICAgICAgICA8Y29tcGlsZXJBcmd1bWVudHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIERvIG5vdCB3YXJuIGFib3V0IHVzaW5nIHN1bi5taXNjLlVuc2FmZSAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxYRGlnbm9yZS5zeW1ib2wuZmlsZSAvPgorICAgICAgICAgICAgICAgICAgICA8L2NvbXBpbGVyQXJndW1lbnRzPgorICAgICAgICAgICAgICAgICAgICA8c2hvd1dhcm5pbmdzPmZhbHNlPC9zaG93V2FybmluZ3M+CisgICAgICAgICAgICAgICAgICAgIDxmb3JrPmZhbHNlPC9mb3JrPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLmlzdGFjazwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1pc3RhY2stY29tbW9ucy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YnVpbGQtaGVscGVyLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5kZS5qZmxleDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qZmxleC1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+MS40LjM8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+Z2VuZXJhdGU8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9nZW5lcmF0ZWQtc291cmNlcy9yc3JjLWdlbjwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5mZWxpeDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1idW5kbGUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgICAgIDxleHRlbnNpb25zPnRydWU8L2V4dGVuc2lvbnM+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxpbnN0cnVjdGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8RXhwb3J0LVBhY2thZ2U+b3JnLmdsYXNzZmlzaC5qZXJzZXkuamF4Yi4qO3ZlcnNpb249JHtwcm9qZWN0LnZlcnNpb259PC9FeHBvcnQtUGFja2FnZT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbnN0cnVjdGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDx1bnBhY2tCdW5kbGU+dHJ1ZTwvdW5wYWNrQnVuZGxlPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworICAgIDxkZXBlbmRlbmNpZXM+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbW1vbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgueG1sLmJpbmQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXhiLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmhrMi5leHRlcm5hbDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LmluamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guaGsyPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3NnaS1yZXNvdXJjZS1sb2NhdG9yPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tZWRpYS9qYXhiL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamF4Yi9pbnRlcm5hbC9BYnN0cmFjdENvbGxlY3Rpb25KYXhiUHJvdmlkZXIuamF2YSBiL21lZGlhL2pheGIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYXhiL2ludGVybmFsL0Fic3RyYWN0Q29sbGVjdGlvbkpheGJQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3NWU4NjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXhiL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamF4Yi9pbnRlcm5hbC9BYnN0cmFjdENvbGxlY3Rpb25KYXhiUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDQ0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYXhiLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuR2VuZXJpY0FycmF5VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5QYXJhbWV0ZXJpemVkVHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkJhZFJlcXVlc3RFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTm9Db250ZW50RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcnM7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLk1hcnNoYWxsZXI7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuVW5tYXJzaGFsRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLlVubWFyc2hhbGxlcjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuRW50aXR5SW5wdXRTdHJlYW07CisKKy8qKgorICogQW4gYWJzdHJhY3QgcHJvdmlkZXIgZm9yIHtAY29kZSBUW119LCB7QGNvZGUgQ29sbGVjdGlvbiZsdDtUJmd0O30sCisgKiBhbmQgaXRzIHN1YnR5cGVzIGFzIGxvbmcgYXMgdGhleSBoYXZlIHRoZSBwdWJsaWMgZGVmYXVsdCBjb25zdHJ1Y3RvciBvcgorICogYXJlIGludGVyZmFjZXMgaW1wbGVtZW50ZWQgYnkgb25lIHRoZSBmb2xsb3dpbmcgY2xhc3NlczoKKyAqIDx1bD4KKyAqIDxsaT57QGxpbmsgQXJyYXlMaXN0fTwvbGk+CisgKiA8bGk+e0BsaW5rIExpbmtlZExpc3R9PC9saT4KKyAqIDxsaT57QGxpbmsgSGFzaFNldH08L2xpPgorICogPGxpPntAbGluayBUcmVlU2V0fTwvbGk+CisgKiA8bGk+e0BsaW5rIFN0YWNrfTwvbGk+CisgKiA8L3VsPgorICoge0Bjb2RlIFR9IG11c3QgYmUgYSBKQVhCIHR5cGUgYW5ub3RhdGVkIHdpdGgge0BsaW5rIFhtbFJvb3RFbGVtZW50fS4KKyAqIDxwPgorICogSW1wbGVtZW50aW5nIGNsYXNzZXMgbWF5IGV4dGVuZCB0aGlzIGNsYXNzIHRvIHByb3ZpZGUgc3BlY2lmaWMgbWFyc2hhbGxpbmcKKyAqIGFuZCB1bm1hcnNoYWxsaW5nIGJlaGF2aW91ci4KKyAqIDwvcD4KKyAqIDxwPgorICogV2hlbiB1bm1hcnNoYWxsaW5nIGEge0BsaW5rIFVubWFyc2hhbEV4Y2VwdGlvbn0gd2lsbCByZXN1bHQgaW4gYQorICoge0BsaW5rIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9ufSBiZWluZyB0aHJvd24gd2l0aCBhIHN0YXR1cyBvZiA0MDAKKyAqIChDbGllbnQgZXJyb3IpLCBhbmQgYSB7QGxpbmsgSkFYQkV4Y2VwdGlvbn0gd2lsbCByZXN1bHQgaW4gYQorICoge0BsaW5rIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9ufSBiZWluZyB0aHJvd24gd2l0aCBhIHN0YXR1cyBvZiA1MDAKKyAqIChJbnRlcm5hbCBTZXJ2ZXIgZXJyb3IpLgorICogPC9wPgorICogPHA+CisgKiBXaGVuIG1hcnNoYWxsaW5nIGEge0BsaW5rIEpBWEJFeGNlcHRpb259IHdpbGwgcmVzdWx0IGluIGEKKyAqIHtAbGluayBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbn0gYmVpbmcgdGhyb3duIHdpdGggYSBzdGF0dXMgb2YgNTAwCisgKiAoSW50ZXJuYWwgU2VydmVyIGVycm9yKS4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29sbGVjdGlvbkpheGJQcm92aWRlciBleHRlbmRzIEFic3RyYWN0SmF4YlByb3ZpZGVyPE9iamVjdD4geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoQWJzdHJhY3RDb2xsZWN0aW9uSmF4YlByb3ZpZGVyLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDbGFzczw/PltdIERFRkFVTFRfSU1QTFMgPSBuZXcgQ2xhc3NbXSB7CisgICAgICAgICAgICBBcnJheUxpc3QuY2xhc3MsCisgICAgICAgICAgICBMaW5rZWRMaXN0LmNsYXNzLAorICAgICAgICAgICAgSGFzaFNldC5jbGFzcywKKyAgICAgICAgICAgIFRyZWVTZXQuY2xhc3MsCisgICAgICAgICAgICBTdGFjay5jbGFzcworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHRvIGFsbG93IGN1c3RvbWl6ZWQgSkFYQiBjb2xsZWN0aW9ucyBjaGVja2luZy4KKyAgICAgKgorICAgICAqIEBzZWUgQWJzdHJhY3RDb2xsZWN0aW9uSmF4YlByb3ZpZGVyI3ZlcmlmeUFycmF5VHlwZQorICAgICAqIEBzZWUgQWJzdHJhY3RDb2xsZWN0aW9uSmF4YlByb3ZpZGVyI3ZlcmlmeUdlbmVyaWNUeXBlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgSmF4YlR5cGVDaGVja2VyIHsKKworICAgICAgICBib29sZWFuIGlzSmF4YlR5cGUoQ2xhc3M8Pz4gdHlwZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSmF4YlR5cGVDaGVja2VyIERlZmF1bHRKYXhiVHlwZUNIRUNLRVIgPSBuZXcgSmF4YlR5cGVDaGVja2VyKCkgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0pheGJUeXBlKENsYXNzPD8+IHR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlLmlzQW5ub3RhdGlvblByZXNlbnQoWG1sUm9vdEVsZW1lbnQuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIHx8IHR5cGUuaXNBbm5vdGF0aW9uUHJlc2VudChYbWxUeXBlLmNsYXNzKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBwdWJsaWMgQWJzdHJhY3RDb2xsZWN0aW9uSmF4YlByb3ZpZGVyKFByb3ZpZGVycyBwcykgeworICAgICAgICBzdXBlcihwcyk7CisgICAgfQorCisgICAgcHVibGljIEFic3RyYWN0Q29sbGVjdGlvbkpheGJQcm92aWRlcihQcm92aWRlcnMgcHMsIE1lZGlhVHlwZSBtdCkgeworICAgICAgICBzdXBlcihwcywgbXQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIGlmICh2ZXJpZnlDb2xsZWN0aW9uU3ViY2xhc3ModHlwZSkpIHsKKyAgICAgICAgICAgIHJldHVybiB2ZXJpZnlHZW5lcmljVHlwZShnZW5lcmljVHlwZSkgJiYgaXNTdXBwb3J0ZWQobWVkaWFUeXBlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlLmlzQXJyYXkoKSAmJiB2ZXJpZnlBcnJheVR5cGUodHlwZSkgJiYgaXNTdXBwb3J0ZWQobWVkaWFUeXBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICBpZiAoQ29sbGVjdGlvbi5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpKSB7CisgICAgICAgICAgICByZXR1cm4gdmVyaWZ5R2VuZXJpY1R5cGUoZ2VuZXJpY1R5cGUpICYmIGlzU3VwcG9ydGVkKG1lZGlhVHlwZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZS5pc0FycmF5KCkgJiYgdmVyaWZ5QXJyYXlUeXBlKHR5cGUpICYmIGlzU3VwcG9ydGVkKG1lZGlhVHlwZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmVyaWZ5Q29sbGVjdGlvblN1YmNsYXNzKENsYXNzPD8+IHR5cGUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChDb2xsZWN0aW9uLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKENsYXNzIGMgOiBERUZBVUxUX0lNUExTKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlLmlzQXNzaWduYWJsZUZyb20oYykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiAhTW9kaWZpZXIuaXNBYnN0cmFjdCh0eXBlLmdldE1vZGlmaWVycygpKSAmJiBNb2RpZmllci5pc1B1YmxpYyh0eXBlLmdldENvbnN0cnVjdG9yKCkuZ2V0TW9kaWZpZXJzKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuV0FSTklORywgTG9jYWxpemF0aW9uTWVzc2FnZXMuTk9fUEFSQU1fQ09OU1RSVUNUT1JfTUlTU0lORyh0eXBlLmdldE5hbWUoKSksIGV4KTsKKyAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuV0FSTklORywgTG9jYWxpemF0aW9uTWVzc2FnZXMuVU5BQkxFX1RPX0FDQ0VTU19NRVRIT0RTX09GX0NMQVNTKHR5cGUuZ2V0TmFtZSgpKSwgZXgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHZlcmlmeUFycmF5VHlwZShDbGFzcyB0eXBlKSB7CisgICAgICAgIHJldHVybiB2ZXJpZnlBcnJheVR5cGUodHlwZSwgRGVmYXVsdEpheGJUeXBlQ0hFQ0tFUik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG1ldGhvZCBjb3VsZCBiZSB1c2VkIHRvIGNoZWNrIGlmIGdpdmVuIHR5cGUgaXMgYW4gYXJyYXkgb2YgSkFYQiBiZWFucy4KKyAgICAgKiBJdCBhbGxvd3MgY3VzdG9taXppbmcgdGhlICJpcyB0aGlzIGEgSkFYQiBiZWFuPyIgcGFydC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlICAgIHRoZSBhcnJheSB0byBiZSBjaGVja2VkCisgICAgICogQHBhcmFtIGNoZWNrZXIgYWxsb3dzIEpBWEIgYmVhbiBjaGVjayBjdXN0b21pemF0aW9uCisgICAgICogQHJldHVybiB0cnVlIGlmIGdpdmVuIHR5cGUgaXMgYW4gYXJyYXkgb2YgSkFYQiBiZWFucworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB2ZXJpZnlBcnJheVR5cGUoQ2xhc3MgdHlwZSwgSmF4YlR5cGVDaGVja2VyIGNoZWNrZXIpIHsKKyAgICAgICAgdHlwZSA9IHR5cGUuZ2V0Q29tcG9uZW50VHlwZSgpOworCisgICAgICAgIHJldHVybiBjaGVja2VyLmlzSmF4YlR5cGUodHlwZSkKKyAgICAgICAgICAgICAgICB8fCBKQVhCRWxlbWVudC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gdmVyaWZ5R2VuZXJpY1R5cGUoVHlwZSBnZW5lcmljVHlwZSkgeworICAgICAgICByZXR1cm4gdmVyaWZ5R2VuZXJpY1R5cGUoZ2VuZXJpY1R5cGUsIERlZmF1bHRKYXhiVHlwZUNIRUNLRVIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBtZXRob2QgY291bGQgYmUgdXNlZCB0byBjaGVjayBpZiBnaXZlbiB0eXBlIGlzIGEgY29sbGVjdGlvbiBvZiBKQVhCIGJlYW5zLgorICAgICAqIEl0IGFsbG93cyBjdXN0b21pemluZyB0aGUgImlzIHRoaXMgYSBKQVhCIGJlYW4/IiBwYXJ0LgorICAgICAqCisgICAgICogQHBhcmFtIGdlbmVyaWNUeXBlIHRoZSB0eXBlIHRvIGJlIGNoZWNrZWQKKyAgICAgKiBAcGFyYW0gY2hlY2tlciAgICAgYWxsb3dzIEpBWEIgYmVhbiBjaGVjayBjdXN0b21pemF0aW9uCisgICAgICogQHJldHVybiB0cnVlIGlmIGdpdmVuIHR5cGUgaXMgYSBjb2xsZWN0aW9uIG9mIEpBWEIgYmVhbnMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmVyaWZ5R2VuZXJpY1R5cGUoVHlwZSBnZW5lcmljVHlwZSwgSmF4YlR5cGVDaGVja2VyIGNoZWNrZXIpIHsKKyAgICAgICAgaWYgKCEoZ2VuZXJpY1R5cGUgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkVHlwZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFBhcmFtZXRlcml6ZWRUeXBlIHB0ID0gKFBhcmFtZXRlcml6ZWRUeXBlKSBnZW5lcmljVHlwZTsKKworICAgICAgICBpZiAocHQuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpLmxlbmd0aCA+IDEpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFR5cGUgdGEgPSBwdC5nZXRBY3R1YWxUeXBlQXJndW1lbnRzKClbMF07CisKKyAgICAgICAgaWYgKHRhIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFR5cGUpIHsKKyAgICAgICAgICAgIFBhcmFtZXRlcml6ZWRUeXBlIGxwdCA9IChQYXJhbWV0ZXJpemVkVHlwZSkgdGE7CisgICAgICAgICAgICByZXR1cm4gKGxwdC5nZXRSYXdUeXBlKCkgaW5zdGFuY2VvZiBDbGFzcykKKyAgICAgICAgICAgICAgICAgICAgJiYgSkFYQkVsZW1lbnQuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSgoQ2xhc3MpIGxwdC5nZXRSYXdUeXBlKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCEocHQuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpWzBdIGluc3RhbmNlb2YgQ2xhc3MpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBDbGFzcyBsaXN0Q2xhc3MgPSAoQ2xhc3MpIHB0LmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKVswXTsKKworICAgICAgICByZXR1cm4gY2hlY2tlci5pc0pheGJUeXBlKGxpc3RDbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVUbygKKyAgICAgICAgICAgIE9iamVjdCB0LAorICAgICAgICAgICAgQ2xhc3M8Pz4gdHlwZSwKKyAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIENvbGxlY3Rpb24gYyA9ICh0eXBlLmlzQXJyYXkoKSkKKyAgICAgICAgICAgICAgICAgICAgPyBBcnJheXMuYXNMaXN0KChPYmplY3RbXSkgdCkKKyAgICAgICAgICAgICAgICAgICAgOiAoQ29sbGVjdGlvbikgdDsKKyAgICAgICAgICAgIGZpbmFsIENsYXNzIGVsZW1lbnRUeXBlID0gZ2V0RWxlbWVudENsYXNzKHR5cGUsIGdlbmVyaWNUeXBlKTsKKyAgICAgICAgICAgIGZpbmFsIENoYXJzZXQgY2hhcnNldCA9IGdldENoYXJzZXQobWVkaWFUeXBlKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjaGFyc2V0TmFtZSA9IGNoYXJzZXQubmFtZSgpOworCisgICAgICAgICAgICBmaW5hbCBNYXJzaGFsbGVyIG0gPSBnZXRNYXJzaGFsbGVyKGVsZW1lbnRUeXBlLCBtZWRpYVR5cGUpOworICAgICAgICAgICAgbS5zZXRQcm9wZXJ0eShNYXJzaGFsbGVyLkpBWEJfRlJBR01FTlQsIHRydWUpOworICAgICAgICAgICAgaWYgKGNoYXJzZXQgIT0gVVRGOCkgeworICAgICAgICAgICAgICAgIG0uc2V0UHJvcGVydHkoTWFyc2hhbGxlci5KQVhCX0VOQ09ESU5HLCBjaGFyc2V0TmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRIZWFkZXIobSwgYW5ub3RhdGlvbnMpOworICAgICAgICAgICAgd3JpdGVDb2xsZWN0aW9uKGVsZW1lbnRUeXBlLCBjLCBtZWRpYVR5cGUsIGNoYXJzZXQsIG0sIGVudGl0eVN0cmVhbSk7CisgICAgICAgIH0gY2F0Y2ggKEpBWEJFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlIGEgY29sbGVjdGlvbiBvZiBKQVhCIG9iamVjdHMgYXMgY2hpbGQgZWxlbWVudHMgb2YgdGhlIHJvb3QgZWxlbWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbGVtZW50VHlwZSAgdGhlIGVsZW1lbnQgdHlwZSBpbiB0aGUgY29sbGVjdGlvbi4KKyAgICAgKiBAcGFyYW0gdCAgICAgICAgICAgIHRoZSBjb2xsZWN0aW9uIHRvIG1hcnNoYWxsCisgICAgICogQHBhcmFtIG1lZGlhVHlwZSAgICB0aGUgbWVkaWEgdHlwZQorICAgICAqIEBwYXJhbSBjICAgICAgICAgICAgdGhlIGNoYXJzZXQKKyAgICAgKiBAcGFyYW0gbSAgICAgICAgICAgIHRoZSBtYXJzaGFsbGVyCisgICAgICogQHBhcmFtIGVudGl0eVN0cmVhbSB0aGUgb3V0cHV0IHN0cmVhbSB0byBtYXJzaGFsbCB0aGUgY29sbGVjdGlvbgorICAgICAqIEB0aHJvd3MgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbiBpbiBjYXNlIHRoZSBtYXJzaGFsbGluZyBvZiBlbGVtZW50IGNvbGxlY3Rpb24gZmFpbHMuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAgICAgICAgICAgICAgICAgIGluIGNhc2Ugb2YgYW55IG90aGVyIEkvTyBlcnJvciB3aGlsZSBtYXJzaGFsbGluZyB0aGUgY29sbGVjdGlvbiBvZiBKQVhCIG9iamVjdHMuCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVDb2xsZWN0aW9uKENsYXNzPD8+IGVsZW1lbnRUeXBlLCBDb2xsZWN0aW9uPD8+IHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsIENoYXJzZXQgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFyc2hhbGxlciBtLCBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKQorICAgICAgICAgICAgdGhyb3dzIEpBWEJFeGNlcHRpb24sIElPRXhjZXB0aW9uOworCisgICAgQE92ZXJyaWRlCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIGZpbmFsIE9iamVjdCByZWFkRnJvbSgKKyAgICAgICAgICAgIENsYXNzPE9iamVjdD4gdHlwZSwKKyAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgZmluYWwgRW50aXR5SW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtID0gRW50aXR5SW5wdXRTdHJlYW0uY3JlYXRlKGlucHV0U3RyZWFtKTsKKyAgICAgICAgaWYgKGVudGl0eVN0cmVhbS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOb0NvbnRlbnRFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfUkVBRElOR19FTlRJVFlfTUlTU0lORygpKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiBlbGVtZW50VHlwZSA9IGdldEVsZW1lbnRDbGFzcyh0eXBlLCBnZW5lcmljVHlwZSk7CisgICAgICAgICAgICBmaW5hbCBVbm1hcnNoYWxsZXIgdSA9IGdldFVubWFyc2hhbGxlcihlbGVtZW50VHlwZSwgbWVkaWFUeXBlKTsKKyAgICAgICAgICAgIGZpbmFsIFhNTFN0cmVhbVJlYWRlciByID0gZ2V0WE1MU3RyZWFtUmVhZGVyKGVsZW1lbnRUeXBlLCBtZWRpYVR5cGUsIHUsIGVudGl0eVN0cmVhbSk7CisgICAgICAgICAgICBib29sZWFuIGpheGJFbGVtZW50ID0gZmFsc2U7CisKKyAgICAgICAgICAgIENvbGxlY3Rpb248T2JqZWN0PiBsID0gbnVsbDsKKyAgICAgICAgICAgIGlmICh0eXBlLmlzQXJyYXkoKSkgeworICAgICAgICAgICAgICAgIGwgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgbCA9IChDb2xsZWN0aW9uPE9iamVjdD4pIHR5cGUubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKENsYXNzPD8+IGMgOiBERUZBVUxUX0lNUExTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5pc0Fzc2lnbmFibGVGcm9tKGMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbCA9IChDb2xsZWN0aW9uPE9iamVjdD4pIGMubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLldBUk5JTkcsIExvY2FsaXphdGlvbk1lc3NhZ2VzLlVOQUJMRV9UT19JTlNUQU5USUFURV9DTEFTUyhjLmdldE5hbWUoKSksIGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuV0FSTklORywgTG9jYWxpemF0aW9uTWVzc2FnZXMuVU5BQkxFX1RPX0lOU1RBTlRJQVRFX0NMQVNTKGMuZ2V0TmFtZSgpKSwgZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuV0FSTklORywgTG9jYWxpemF0aW9uTWVzc2FnZXMuVU5BQkxFX1RPX0lOU1RBTlRJQVRFX0NMQVNTKGMuZ2V0TmFtZSgpKSwgZXgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBsID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE1vdmUgdG8gcm9vdCBlbGVtZW50CisgICAgICAgICAgICBpbnQgZXZlbnQgPSByLm5leHQoKTsKKyAgICAgICAgICAgIHdoaWxlIChldmVudCAhPSBYTUxTdHJlYW1SZWFkZXIuU1RBUlRfRUxFTUVOVCkgeworICAgICAgICAgICAgICAgIGV2ZW50ID0gci5uZXh0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE1vdmUgdG8gZmlyc3QgY2hpbGQgKGlmIGFueSkKKyAgICAgICAgICAgIGV2ZW50ID0gci5uZXh0KCk7CisgICAgICAgICAgICB3aGlsZSAoZXZlbnQgIT0gWE1MU3RyZWFtUmVhZGVyLlNUQVJUX0VMRU1FTlQKKyAgICAgICAgICAgICAgICAgICAgJiYgZXZlbnQgIT0gWE1MU3RyZWFtUmVhZGVyLkVORF9ET0NVTUVOVCkgeworICAgICAgICAgICAgICAgIGV2ZW50ID0gci5uZXh0KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdoaWxlIChldmVudCAhPSBYTUxTdHJlYW1SZWFkZXIuRU5EX0RPQ1VNRU5UKSB7CisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnRUeXBlLmlzQW5ub3RhdGlvblByZXNlbnQoWG1sUm9vdEVsZW1lbnQuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgICAgIGwuYWRkKHUudW5tYXJzaGFsKHIpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGVsZW1lbnRUeXBlLmlzQW5ub3RhdGlvblByZXNlbnQoWG1sVHlwZS5jbGFzcykpIHsKKyAgICAgICAgICAgICAgICAgICAgbC5hZGQodS51bm1hcnNoYWwociwgZWxlbWVudFR5cGUpLmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGwuYWRkKHUudW5tYXJzaGFsKHIsIGVsZW1lbnRUeXBlKSk7CisgICAgICAgICAgICAgICAgICAgIGpheGJFbGVtZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBNb3ZlIHRvIG5leHQgcGVlciAoaWYgYW55KQorICAgICAgICAgICAgICAgIGV2ZW50ID0gci5nZXRFdmVudFR5cGUoKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoZXZlbnQgIT0gWE1MU3RyZWFtUmVhZGVyLlNUQVJUX0VMRU1FTlQKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGV2ZW50ICE9IFhNTFN0cmVhbVJlYWRlci5FTkRfRE9DVU1FTlQpIHsKKyAgICAgICAgICAgICAgICAgICAgZXZlbnQgPSByLm5leHQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiAodHlwZS5pc0FycmF5KCkpCisgICAgICAgICAgICAgICAgICAgID8gY3JlYXRlQXJyYXkobCwgamF4YkVsZW1lbnQgPyBKQVhCRWxlbWVudC5jbGFzcyA6IGVsZW1lbnRUeXBlKQorICAgICAgICAgICAgICAgICAgICA6IGw7CisgICAgICAgIH0gY2F0Y2ggKFVubWFyc2hhbEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oZXgpOworICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKGV4KTsKKyAgICAgICAgfSBjYXRjaCAoSkFYQkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24oZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGNyZWF0ZUFycmF5KENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiwgQ2xhc3MgY29tcG9uZW50VHlwZSkgeworICAgICAgICBPYmplY3QgYXJyYXkgPSBBcnJheS5uZXdJbnN0YW5jZShjb21wb25lbnRUeXBlLCBjb2xsZWN0aW9uLnNpemUoKSk7CisgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgZm9yIChPYmplY3QgdmFsdWUgOiBjb2xsZWN0aW9uKSB7CisgICAgICAgICAgICBBcnJheS5zZXQoYXJyYXksIGkrKywgdmFsdWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhcnJheTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHtAbGluayBYTUxTdHJlYW1SZWFkZXJ9IGZvciB1bm1hcnNoYWxsaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGVsZW1lbnRUeXBlICB0aGUgaW5kaXZpZHVhbCBlbGVtZW50IHR5cGUuCisgICAgICogQHBhcmFtIG1lZGlhVHlwZSAgICB0aGUgbWVkaWEgdHlwZS4KKyAgICAgKiBAcGFyYW0gdW5tYXJzaGFsbGVyIHRoZSB1bm1hcnNoYWxsZXIgYXMgYSBjYXJyaWVyIG9mIHBvc3NpYmxlIGNvbmZpZyBvcHRpb25zLgorICAgICAqIEBwYXJhbSBlbnRpdHlTdHJlYW0gdGhlIGlucHV0IHN0cmVhbS4KKyAgICAgKiBAcmV0dXJuIHRoZSBYTUxTdHJlYW1SZWFkZXIuCisgICAgICogQHRocm93cyBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbiBpbiBjYXNlIHtAY29kZSBYTUxTdHJlYW1SZWFkZXJ9IHJldHJpZXZhbCBmYWlscy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgWE1MU3RyZWFtUmVhZGVyIGdldFhNTFN0cmVhbVJlYWRlcihDbGFzczw/PiBlbGVtZW50VHlwZSwgTWVkaWFUeXBlIG1lZGlhVHlwZSwgVW5tYXJzaGFsbGVyIHVubWFyc2hhbGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pCisgICAgICAgICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uOworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBDbGFzcyBnZXRFbGVtZW50Q2xhc3MoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSkgeworICAgICAgICBUeXBlIHRhOworICAgICAgICBpZiAoZ2VuZXJpY1R5cGUgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkVHlwZSkgeworICAgICAgICAgICAgLy8gQ29sbGVjdGlvbiBjYXNlCisgICAgICAgICAgICB0YSA9ICgoUGFyYW1ldGVyaXplZFR5cGUpIGdlbmVyaWNUeXBlKS5nZXRBY3R1YWxUeXBlQXJndW1lbnRzKClbMF07CisgICAgICAgIH0gZWxzZSBpZiAoZ2VuZXJpY1R5cGUgaW5zdGFuY2VvZiBHZW5lcmljQXJyYXlUeXBlKSB7CisgICAgICAgICAgICAvLyBHZW5lcmljQXJyYXkgY2FzZQorICAgICAgICAgICAgdGEgPSAoKEdlbmVyaWNBcnJheVR5cGUpIGdlbmVyaWNUeXBlKS5nZXRHZW5lcmljQ29tcG9uZW50VHlwZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gQXJyYXkgY2FzZQorICAgICAgICAgICAgdGEgPSB0eXBlLmdldENvbXBvbmVudFR5cGUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGEgaW5zdGFuY2VvZiBQYXJhbWV0ZXJpemVkVHlwZSkgeworICAgICAgICAgICAgLy8gSkFYQkVsZW1lbnQgY2FzZQorICAgICAgICAgICAgdGEgPSAoKFBhcmFtZXRlcml6ZWRUeXBlKSB0YSkuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpWzBdOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoQ2xhc3MpIHRhOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgTm91bkluZmxlY3RvciBpbmZsZWN0b3IgPSBOb3VuSW5mbGVjdG9yLmdldEluc3RhbmNlKCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgY29udmVydFRvWG1sTmFtZShmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gbmFtZS5yZXBsYWNlKCIkIiwgIl8iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgdGhlIG5hbWUgb2YgdGhlIHJvb3QgZWxlbWVudCBmcm9tIGl0J3MgSmF2YSB0eXBlIG5hbWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZWxlbWVudFR5cGUgZWxlbWVudCBKYXZhIHR5cGUuCisgICAgICogQHJldHVybiBjb25zdHJ1Y3RlZCByb290IGVsZW1lbnQgbmFtZSBmb3IgYSBnaXZlbiBlbGVtZW50IEphdmEgdHlwZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIGdldFJvb3RFbGVtZW50TmFtZShDbGFzczw/PiBlbGVtZW50VHlwZSkgeworICAgICAgICBpZiAoaXNYbWxSb290RWxlbWVudFByb2Nlc3NpbmcoKSkgeworICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRUb1htbE5hbWUoaW5mbGVjdG9yLnBsdXJhbGl6ZShpbmZsZWN0b3IuZGVtb2R1bGl6ZShnZXRFbGVtZW50TmFtZShlbGVtZW50VHlwZSkpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gY29udmVydFRvWG1sTmFtZShpbmZsZWN0b3IuZGVjYXBpdGFsaXplKGluZmxlY3Rvci5wbHVyYWxpemUoaW5mbGVjdG9yLmRlbW9kdWxpemUoZWxlbWVudFR5cGUuZ2V0TmFtZSgpKSkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZWxlbWVudCBuYW1lIGZvciBhIGdpdmVuIEphdmEgdHlwZS4KKyAgICAgKiA8cD4KKyAgICAgKiBJbiBjYXNlIHRoZSBlbGVtZW50IGlzIGFubm90YXRlZCB3aXRoIGEge0BsaW5rIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnR9IGFubm90YXRpb24KKyAgICAgKiBhbmQgdGhlIHtAbGluayBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50I25hbWUoKSBzcGVjaWZpZWQgZWxlbWVudCBuYW1lfSBpcyBub3QgZGVmYXVsdCwKKyAgICAgKiB0aGUgbWV0aG9kIHJldHVybnMgdGhlIHNwZWNpZmllZCBlbGVtZW50IG5hbWUgaW4gdGhlIGFubm90YXRpb24uIE90aGVyd2lzZSwgdGhlIG1ldGhvZCByZXR1cm5zIHRoZSBuYW1lIG9mCisgICAgICogdGhlIGVsZW1lbnQgY2xhc3MgaW5zdGVhZC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gZWxlbWVudFR5cGUgZWxlbWVudCBKYXZhIHR5cGUuCisgICAgICogQHJldHVybiBlbGVtZW50IG5hbWUgZm9yIGEgZ2l2ZW4gZWxlbWVudCBKYXZhIHR5cGUuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0RWxlbWVudE5hbWUoQ2xhc3M8Pz4gZWxlbWVudFR5cGUpIHsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSBlbGVtZW50VHlwZS5nZXROYW1lKCk7CisgICAgICAgIFhtbFJvb3RFbGVtZW50IHhyZSA9IGVsZW1lbnRUeXBlLmdldEFubm90YXRpb24oWG1sUm9vdEVsZW1lbnQuY2xhc3MpOworICAgICAgICBpZiAoeHJlICE9IG51bGwgJiYgISIjI2RlZmF1bHQiLmVxdWFscyh4cmUubmFtZSgpKSkgeworICAgICAgICAgICAgbmFtZSA9IHhyZS5uYW1lKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF4Yi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pheGIvaW50ZXJuYWwvQWJzdHJhY3RKYXhiRWxlbWVudFByb3ZpZGVyLmphdmEgYi9tZWRpYS9qYXhiL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamF4Yi9pbnRlcm5hbC9BYnN0cmFjdEpheGJFbGVtZW50UHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWY0NDc3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamF4Yi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pheGIvaW50ZXJuYWwvQWJzdHJhY3RKYXhiRWxlbWVudFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamF4Yi5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlBhcmFtZXRlcml6ZWRUeXBlOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OworCitpbXBvcnQgamF2YXgud3MucnMuQmFkUmVxdWVzdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5JbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Ob0NvbnRlbnRFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyczsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLmJpbmQuTWFyc2hhbGxlcjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5Vbm1hcnNoYWxFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLmJpbmQuVW5tYXJzaGFsbGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5FbnRpdHlJbnB1dFN0cmVhbTsKKworLyoqCisgKiBBbiBhYnN0cmFjdCBwcm92aWRlciBmb3Ige0BsaW5rIEpBWEJFbGVtZW50fS4KKyAqIDxwLz4KKyAqIEltcGxlbWVudGluZyBjbGFzc2VzIG1heSBleHRlbmQgdGhpcyBjbGFzcyB0byBwcm92aWRlIHNwZWNpZmljIG1hcnNoYWxsaW5nCisgKiBhbmQgdW5tYXJzaGFsbGluZyBiZWhhdmlvdXIuCisgKiA8cC8+CisgKiBXaGVuIHVubWFyc2hhbGxpbmcgYSB7QGxpbmsgVW5tYXJzaGFsRXhjZXB0aW9ufSB3aWxsIHJlc3VsdCBpbiBhCisgKiB7QGxpbmsgV2ViQXBwbGljYXRpb25FeGNlcHRpb259IGJlaW5nIHRocm93biB3aXRoIGEgc3RhdHVzIG9mIDQwMAorICogKENsaWVudCBlcnJvciksIGFuZCBhIHtAbGluayBKQVhCRXhjZXB0aW9ufSB3aWxsIHJlc3VsdCBpbiBhCisgKiB7QGxpbmsgV2ViQXBwbGljYXRpb25FeGNlcHRpb259IGJlaW5nIHRocm93biB3aXRoIGEgc3RhdHVzIG9mIDUwMAorICogKEludGVybmFsIFNlcnZlciBlcnJvcikuCisgKiA8cC8+CisgKiBXaGVuIG1hcnNoYWxsaW5nIGEge0BsaW5rIEpBWEJFeGNlcHRpb259IHdpbGwgcmVzdWx0IGluIGEKKyAqIHtAbGluayBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbn0gYmVpbmcgdGhyb3duIHdpdGggYSBzdGF0dXMgb2YgNTAwCisgKiAoSW50ZXJuYWwgU2VydmVyIGVycm9yKS4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RKYXhiRWxlbWVudFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RKYXhiUHJvdmlkZXI8SkFYQkVsZW1lbnQ8Pz4+IHsKKworICAgIC8qKgorICAgICAqIEluaGVyaXRhbmNlIGNvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIHByb3ZpZGVycyBKQVgtUlMgcHJvdmlkZXJzLgorICAgICAqLworICAgIHB1YmxpYyBBYnN0cmFjdEpheGJFbGVtZW50UHJvdmlkZXIoUHJvdmlkZXJzIHByb3ZpZGVycykgeworICAgICAgICBzdXBlcihwcm92aWRlcnMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaGVyaXRhbmNlIGNvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIHByb3ZpZGVycyAgICAgICAgIEpBWC1SUyBwcm92aWRlcnMuCisgICAgICogQHBhcmFtIHJlc29sdmVyTWVkaWFUeXBlIEpBWEIgY29tcG9uZW50IGNvbnRleHQgcmVzb2x2ZXIgbWVkaWEgdHlwZSB0byBiZSB1c2VkLgorICAgICAqLworICAgIHB1YmxpYyBBYnN0cmFjdEpheGJFbGVtZW50UHJvdmlkZXIoUHJvdmlkZXJzIHByb3ZpZGVycywgTWVkaWFUeXBlIHJlc29sdmVyTWVkaWFUeXBlKSB7CisgICAgICAgIHN1cGVyKHByb3ZpZGVycywgcmVzb2x2ZXJNZWRpYVR5cGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiB0eXBlID09IEpBWEJFbGVtZW50LmNsYXNzICYmIGdlbmVyaWNUeXBlIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFR5cGUgJiYgaXNTdXBwb3J0ZWQobWVkaWFUeXBlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIEpBWEJFbGVtZW50LmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSkgJiYgaXNTdXBwb3J0ZWQobWVkaWFUeXBlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgSkFYQkVsZW1lbnQ8Pz4gcmVhZEZyb20oCisgICAgICAgICAgICBDbGFzczxKQVhCRWxlbWVudDw/Pj4gdHlwZSwKKyAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgZmluYWwgRW50aXR5SW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtID0gRW50aXR5SW5wdXRTdHJlYW0uY3JlYXRlKGlucHV0U3RyZWFtKTsKKyAgICAgICAgaWYgKGVudGl0eVN0cmVhbS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOb0NvbnRlbnRFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfUkVBRElOR19FTlRJVFlfTUlTU0lORygpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFBhcmFtZXRlcml6ZWRUeXBlIHB0ID0gKFBhcmFtZXRlcml6ZWRUeXBlKSBnZW5lcmljVHlwZTsKKyAgICAgICAgZmluYWwgQ2xhc3MgdGEgPSAoQ2xhc3MpIHB0LmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKVswXTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIHJlYWRGcm9tKHRhLCBtZWRpYVR5cGUsIGdldFVubWFyc2hhbGxlcih0YSwgbWVkaWFUeXBlKSwgZW50aXR5U3RyZWFtKTsKKyAgICAgICAgfSBjYXRjaCAoVW5tYXJzaGFsRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbihleCk7CisgICAgICAgIH0gY2F0Y2ggKEpBWEJFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgSkFYQiBlbGVtZW50IGZyb20gYW4gZW50aXR5IHN0cmVhbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlICAgICAgICAgdGhlIHR5cGUgdGhhdCBpcyB0byBiZSByZWFkIGZyb20gdGhlIGVudGl0eSBzdHJlYW0uCisgICAgICogQHBhcmFtIG1lZGlhVHlwZSAgICB0aGUgbWVkaWEgdHlwZSBvZiB0aGUgSFRUUCBlbnRpdHkuCisgICAgICogQHBhcmFtIHVubWFyc2hhbGxlciBKQVhCIHVubWFyc2hhbGxlciB0byBiZSB1c2VkLgorICAgICAqIEBwYXJhbSBlbnRpdHlTdHJlYW0gdGhlIHtAbGluayBJbnB1dFN0cmVhbX0gb2YgdGhlIEhUVFAgZW50aXR5LiBUaGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgdGhhdCB0aGUgaW5wdXQgc3RyZWFtIGVuZHMgd2hlbiB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIGVudGl0eSBoYXMgYmVlbiBjb25zdW1lZC4gVGhlIGltcGxlbWVudGF0aW9uIHNob3VsZCBub3QgY2xvc2UgdGhlIGlucHV0CisgICAgICogICAgICAgICAgICAgICAgICAgICBzdHJlYW0uCisgICAgICogQHJldHVybiBKQVhCIGVsZW1lbnQgcmVwcmVzZW50aW5nIHRoZSBlbnRpdHkuCisgICAgICogQHRocm93cyBKQVhCRXhjZXB0aW9uIGluIGNhc2UgZW50aXR5IHVubWFyc2hhbGxpbmcgZmFpbHMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IEpBWEJFbGVtZW50PD8+IHJlYWRGcm9tKAorICAgICAgICAgICAgQ2xhc3M8Pz4gdHlwZSwgTWVkaWFUeXBlIG1lZGlhVHlwZSwgVW5tYXJzaGFsbGVyIHVubWFyc2hhbGxlciwgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlVG8oCisgICAgICAgICAgICBKQVhCRWxlbWVudDw/PiB0LAorICAgICAgICAgICAgQ2xhc3M8Pz4gdHlwZSwKKyAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIE1hcnNoYWxsZXIgbSA9IGdldE1hcnNoYWxsZXIodC5nZXREZWNsYXJlZFR5cGUoKSwgbWVkaWFUeXBlKTsKKyAgICAgICAgICAgIGZpbmFsIENoYXJzZXQgYyA9IGdldENoYXJzZXQobWVkaWFUeXBlKTsKKyAgICAgICAgICAgIGlmIChjICE9IFVURjgpIHsKKyAgICAgICAgICAgICAgICBtLnNldFByb3BlcnR5KE1hcnNoYWxsZXIuSkFYQl9FTkNPRElORywgYy5uYW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0SGVhZGVyKG0sIGFubm90YXRpb25zKTsKKyAgICAgICAgICAgIHdyaXRlVG8odCwgbWVkaWFUeXBlLCBjLCBtLCBlbnRpdHlTdHJlYW0pOworICAgICAgICB9IGNhdGNoIChKQVhCRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbihleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSBKQVhCIGVsZW1lbnQgdG8gYW4gZW50aXR5IHN0cmVhbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbGVtZW50ICAgICAgSkFYQiBlbGVtZW50IHRvIGJlIHdyaXR0ZW4gdG8gYW4gZW50aXR5IHN0cmVhbS4KKyAgICAgKiBAcGFyYW0gbWVkaWFUeXBlICAgIHRoZSBtZWRpYSB0eXBlIG9mIHRoZSBIVFRQIGVudGl0eS4KKyAgICAgKiBAcGFyYW0gY2hhcnNldCAgICAgIGNoYXJhY3RlciBzZXQgdG8gYmUgdXNlZC4KKyAgICAgKiBAcGFyYW0gbWFyc2hhbGxlciAgIEpBWEIgdW5tYXJzaGFsbGVyIHRvIGJlIHVzZWQuCisgICAgICogQHBhcmFtIGVudGl0eVN0cmVhbSB0aGUge0BsaW5rIElucHV0U3RyZWFtfSBvZiB0aGUgSFRUUCBlbnRpdHkuIFRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0IHRoZSBpbnB1dCBzdHJlYW0gZW5kcyB3aGVuIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgZW50aXR5IGhhcyBiZWVuIGNvbnN1bWVkLiBUaGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIG5vdCBjbG9zZSB0aGUgaW5wdXQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS4KKyAgICAgKiBAdGhyb3dzIEpBWEJFeGNlcHRpb24gaW4gY2FzZSBlbnRpdHkgbWFyc2hhbGxpbmcgZmFpbHMuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgd3JpdGVUbyhKQVhCRWxlbWVudDw/PiBlbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJzZXQgY2hhcnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcnNoYWxsZXIgbWFyc2hhbGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBKQVhCRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF4Yi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pheGIvaW50ZXJuYWwvQWJzdHJhY3RKYXhiUHJvdmlkZXIuamF2YSBiL21lZGlhL2pheGIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYXhiL2ludGVybmFsL0Fic3RyYWN0SmF4YlByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA2MWE2YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2pheGIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYXhiL2ludGVybmFsL0Fic3RyYWN0SmF4YlByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwzNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamF4Yi5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuV2Vha0hhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuQ29udGV4dFJlc29sdmVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcnM7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLk1hcnNoYWxsZXI7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuUHJvcGVydHlFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLmJpbmQuVW5tYXJzaGFsbGVyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYU291cmNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5Qcm9wZXJ0aWVzSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5WYWx1ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uVmFsdWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuTWVzc2FnZVByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5YbWxIZWFkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5BYnN0cmFjdE1lc3NhZ2VSZWFkZXJXcml0ZXJQcm92aWRlcjsKKworaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOworCisvKioKKyAqIEEgYmFzZSBjbGFzcyBmb3IgaW1wbGVtZW50aW5nIEpBWEItYmFzZWQgcmVhZGVycyBhbmQgd3JpdGVycy4KKyAqCisgKiBAcGFyYW0gPFQ+IEphdmEgdHlwZSBzdXBwb3J0ZWQgYnkgdGhlIHByb3ZpZGVyLgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmF4YlByb3ZpZGVyPFQ+IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlUmVhZGVyV3JpdGVyUHJvdmlkZXI8VD4geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPENsYXNzPD8+LCBXZWFrUmVmZXJlbmNlPEpBWEJDb250ZXh0Pj4gamF4YkNvbnRleHRzID0KKyAgICAgICAgICAgIG5ldyBXZWFrSGFzaE1hcDxDbGFzczw/PiwgV2Vha1JlZmVyZW5jZTxKQVhCQ29udGV4dD4+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcnMgamF4cnNQcm92aWRlcnM7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGZpeGVkUmVzb2x2ZXJNZWRpYVR5cGU7CisgICAgcHJpdmF0ZSBmaW5hbCBWYWx1ZTxDb250ZXh0UmVzb2x2ZXI8SkFYQkNvbnRleHQ+PiBtdENvbnRleHQ7CisgICAgcHJpdmF0ZSBmaW5hbCBWYWx1ZTxDb250ZXh0UmVzb2x2ZXI8VW5tYXJzaGFsbGVyPj4gbXRVbm1hcnNoYWxsZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBWYWx1ZTxDb250ZXh0UmVzb2x2ZXI8TWFyc2hhbGxlcj4+IG10TWFyc2hhbGxlcjsKKyAgICBwcml2YXRlIFZhbHVlPEJvb2xlYW4+IGZvcm1hdHRlZE91dHB1dCA9IFZhbHVlcy5vZihCb29sZWFuLkZBTFNFKTsKKyAgICBwcml2YXRlIFZhbHVlPEJvb2xlYW4+IHhtbFJvb3RFbGVtZW50UHJvY2Vzc2luZyA9IFZhbHVlcy5vZihCb29sZWFuLkZBTFNFKTsKKworICAgIC8qKgorICAgICAqIEluaGVyaXRhbmNlIGNvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIHByb3ZpZGVycyBKQVgtUlMgcHJvdmlkZXJzLgorICAgICAqLworICAgIHB1YmxpYyBBYnN0cmFjdEpheGJQcm92aWRlcihmaW5hbCBQcm92aWRlcnMgcHJvdmlkZXJzKSB7CisgICAgICAgIHRoaXMocHJvdmlkZXJzLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmhlcml0YW5jZSBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm92aWRlcnMgICAgICAgICBKQVgtUlMgcHJvdmlkZXJzLgorICAgICAqIEBwYXJhbSByZXNvbHZlck1lZGlhVHlwZSBKQVhCIGNvbXBvbmVudCBjb250ZXh0IHJlc29sdmVyIG1lZGlhIHR5cGUgdG8gYmUgdXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQWJzdHJhY3RKYXhiUHJvdmlkZXIoZmluYWwgUHJvdmlkZXJzIHByb3ZpZGVycywgZmluYWwgTWVkaWFUeXBlIHJlc29sdmVyTWVkaWFUeXBlKSB7CisgICAgICAgIHRoaXMuamF4cnNQcm92aWRlcnMgPSBwcm92aWRlcnM7CisKKyAgICAgICAgZml4ZWRSZXNvbHZlck1lZGlhVHlwZSA9IHJlc29sdmVyTWVkaWFUeXBlICE9IG51bGw7CisgICAgICAgIGlmIChmaXhlZFJlc29sdmVyTWVkaWFUeXBlKSB7CisgICAgICAgICAgICB0aGlzLm10Q29udGV4dCA9IFZhbHVlcy5sYXp5KG5ldyBWYWx1ZTxDb250ZXh0UmVzb2x2ZXI8SkFYQkNvbnRleHQ+PigpIHsKKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBDb250ZXh0UmVzb2x2ZXI8SkFYQkNvbnRleHQ+IGdldCgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVycy5nZXRDb250ZXh0UmVzb2x2ZXIoSkFYQkNvbnRleHQuY2xhc3MsIHJlc29sdmVyTWVkaWFUeXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHRoaXMubXRVbm1hcnNoYWxsZXIgPSBWYWx1ZXMubGF6eShuZXcgVmFsdWU8Q29udGV4dFJlc29sdmVyPFVubWFyc2hhbGxlcj4+KCkgeworCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIENvbnRleHRSZXNvbHZlcjxVbm1hcnNoYWxsZXI+IGdldCgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVycy5nZXRDb250ZXh0UmVzb2x2ZXIoVW5tYXJzaGFsbGVyLmNsYXNzLCByZXNvbHZlck1lZGlhVHlwZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB0aGlzLm10TWFyc2hhbGxlciA9IFZhbHVlcy5sYXp5KG5ldyBWYWx1ZTxDb250ZXh0UmVzb2x2ZXI8TWFyc2hhbGxlcj4+KCkgeworCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIENvbnRleHRSZXNvbHZlcjxNYXJzaGFsbGVyPiBnZXQoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm92aWRlcnMuZ2V0Q29udGV4dFJlc29sdmVyKE1hcnNoYWxsZXIuY2xhc3MsIHJlc29sdmVyTWVkaWFUeXBlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRoaXMubXRDb250ZXh0ID0gbnVsbDsKKyAgICAgICAgICAgIHRoaXMubXRVbm1hcnNoYWxsZXIgPSBudWxsOworICAgICAgICAgICAgdGhpcy5tdE1hcnNoYWxsZXIgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVE9ETyBUaGlzIHByb3ZpZGVyIHNob3VsZCBiZSByZWdpc3RlcmVkIGFuZCBjb25maWd1cmVkIHZpYSBhIGZlYXR1cmUuCisgICAgQENvbnRleHQKKyAgICBwdWJsaWMgdm9pZCBzZXRDb25maWd1cmF0aW9uKGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlnKSB7CisgICAgICAgIGZvcm1hdHRlZE91dHB1dCA9IFZhbHVlcy5sYXp5KG5ldyBWYWx1ZTxCb29sZWFuPigpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgQm9vbGVhbiBnZXQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFByb3BlcnRpZXNIZWxwZXIuaXNQcm9wZXJ0eShjb25maWcuZ2V0UHJvcGVydHkoTWVzc2FnZVByb3BlcnRpZXMuWE1MX0ZPUk1BVF9PVVRQVVQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgeG1sUm9vdEVsZW1lbnRQcm9jZXNzaW5nID0gVmFsdWVzLmxhenkobmV3IFZhbHVlPEJvb2xlYW4+KCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBCb29sZWFuIGdldCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUHJvcGVydGllc0hlbHBlci5pc1Byb3BlcnR5KGNvbmZpZy5nZXRQcm9wZXJ0eShNZXNzYWdlUHJvcGVydGllcy5KQVhCX1BST0NFU1NfWE1MX1JPT1RfRUxFTUVOVCkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gbWVkaWEgdHlwZSBpcyBzdXBwb3J0ZWQgYnkgdGhpcyBKQVhCIGVudGl0eSBwcm92aWRlci4KKyAgICAgKiA8cD4KKyAgICAgKiBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZC4gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBhbHdheXMgcmV0dXJucyB7QGNvZGUgdHJ1ZX0uCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIG1lZGlhVHlwZSBtZWRpYSB0eXBlIHRvIGJlIGNoZWNrZWQgZm9yIHN1cHBvcnQuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIG1lZGlhIHR5cGUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBlbnRpdHkgcHJvdmlkZXIsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGlzU3VwcG9ydGVkKE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBKQVhCIHVubWFyc2hhbGxlciBmb3IgdGhlIGdpdmVuIGNsYXNzIGFuZCBtZWRpYSB0eXBlLgorICAgICAqIDxwPgorICAgICAqIEluIGNhc2UgdGhpcyBwcm92aWRlciBpbnN0YW5jZSBoYXMgYmVlbiB7QGxpbmsgI0Fic3RyYWN0SmF4YlByb3ZpZGVyKFByb3ZpZGVycywgTWVkaWFUeXBlKQorICAgICAqIGNyZWF0ZWQgd2l0aCBhIGZpeGVkIHJlc29sdmVyIG1lZGlhIHR5cGV9LCB0aGUgc3VwcGxpZWQgbWVkaWEgdHlwZSBhcmd1bWVudCB3aWxsIGJlIGlnbm9yZWQuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgICAgICBKYXZhIHR5cGUgdG8gYmUgdW5tYXJzaGFsbGVkLgorICAgICAqIEBwYXJhbSBtZWRpYVR5cGUgZW50aXR5IG1lZGlhIHR5cGUuCisgICAgICogQHJldHVybiBKQVhCIHVubWFyc2hhbGxlciBmb3IgdGhlIHJlcXVlc3RlZCBKYXZhIHR5cGUsIG1lZGlhIHR5cGUgY29tYmluYXRpb24uCisgICAgICogQHRocm93cyBKQVhCRXhjZXB0aW9uIGluIGNhc2UgcmV0cmlldmluZyB0aGUgdW5tYXJzaGFsbGVyIGZhaWxzIHdpdGggYSBKQVhCIGV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgVW5tYXJzaGFsbGVyIGdldFVubWFyc2hhbGxlcihDbGFzcyB0eXBlLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChmaXhlZFJlc29sdmVyTWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VW5tYXJzaGFsbGVyKHR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgQ29udGV4dFJlc29sdmVyPFVubWFyc2hhbGxlcj4gdW5tYXJzaGFsbGVyUmVzb2x2ZXIgPQorICAgICAgICAgICAgICAgIGpheHJzUHJvdmlkZXJzLmdldENvbnRleHRSZXNvbHZlcihVbm1hcnNoYWxsZXIuY2xhc3MsIG1lZGlhVHlwZSk7CisgICAgICAgIGlmICh1bm1hcnNoYWxsZXJSZXNvbHZlciAhPSBudWxsKSB7CisgICAgICAgICAgICBVbm1hcnNoYWxsZXIgdSA9IHVubWFyc2hhbGxlclJlc29sdmVyLmdldENvbnRleHQodHlwZSk7CisgICAgICAgICAgICBpZiAodSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBKQVhCQ29udGV4dCBjdHggPSBnZXRKQVhCQ29udGV4dCh0eXBlLCBtZWRpYVR5cGUpOworICAgICAgICByZXR1cm4gKGN0eCA9PSBudWxsKSA/IG51bGwgOiBjdHguY3JlYXRlVW5tYXJzaGFsbGVyKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBVbm1hcnNoYWxsZXIgZ2V0VW5tYXJzaGFsbGVyKENsYXNzIHR5cGUpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ29udGV4dFJlc29sdmVyPFVubWFyc2hhbGxlcj4gcmVzb2x2ZXIgPSBtdFVubWFyc2hhbGxlci5nZXQoKTsKKyAgICAgICAgaWYgKHJlc29sdmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIFVubWFyc2hhbGxlciB1ID0gcmVzb2x2ZXIuZ2V0Q29udGV4dCh0eXBlKTsKKyAgICAgICAgICAgIGlmICh1ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIEpBWEJDb250ZXh0IGN0eCA9IGdldEpBWEJDb250ZXh0KHR5cGUpOworICAgICAgICByZXR1cm4gKGN0eCA9PSBudWxsKSA/IG51bGwgOiBjdHguY3JlYXRlVW5tYXJzaGFsbGVyKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBKQVhCIG1hcnNoYWxsZXIgZm9yIHRoZSBnaXZlbiBjbGFzcyBhbmQgbWVkaWEgdHlwZS4KKyAgICAgKiA8cD4KKyAgICAgKiBJbiBjYXNlIHRoaXMgcHJvdmlkZXIgaW5zdGFuY2UgaGFzIGJlZW4ge0BsaW5rICNBYnN0cmFjdEpheGJQcm92aWRlcihQcm92aWRlcnMsIE1lZGlhVHlwZSkKKyAgICAgKiBjcmVhdGVkIHdpdGggYSBmaXhlZCByZXNvbHZlciBtZWRpYSB0eXBlfSwgdGhlIHN1cHBsaWVkIG1lZGlhIHR5cGUgYXJndW1lbnQgd2lsbCBiZSBpZ25vcmVkLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlICAgICAgSmF2YSB0eXBlIHRvIGJlIG1hcnNoYWxsZWQuCisgICAgICogQHBhcmFtIG1lZGlhVHlwZSBlbnRpdHkgbWVkaWEgdHlwZS4KKyAgICAgKiBAcmV0dXJuIEpBWEIgbWFyc2hhbGxlciBmb3IgdGhlIHJlcXVlc3RlZCBKYXZhIHR5cGUsIG1lZGlhIHR5cGUgY29tYmluYXRpb24uCisgICAgICogQHRocm93cyBKQVhCRXhjZXB0aW9uIGluIGNhc2UgcmV0cmlldmluZyB0aGUgbWFyc2hhbGxlciBmYWlscyB3aXRoIGEgSkFYQiBleGNlcHRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIE1hcnNoYWxsZXIgZ2V0TWFyc2hhbGxlcihDbGFzcyB0eXBlLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChmaXhlZFJlc29sdmVyTWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0TWFyc2hhbGxlcih0eXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIENvbnRleHRSZXNvbHZlcjxNYXJzaGFsbGVyPiBtY3IgPSBqYXhyc1Byb3ZpZGVycy5nZXRDb250ZXh0UmVzb2x2ZXIoTWFyc2hhbGxlci5jbGFzcywgbWVkaWFUeXBlKTsKKyAgICAgICAgaWYgKG1jciAhPSBudWxsKSB7CisgICAgICAgICAgICBNYXJzaGFsbGVyIG0gPSBtY3IuZ2V0Q29udGV4dCh0eXBlKTsKKyAgICAgICAgICAgIGlmIChtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIEpBWEJDb250ZXh0IGN0eCA9IGdldEpBWEJDb250ZXh0KHR5cGUsIG1lZGlhVHlwZSk7CisgICAgICAgIGlmIChjdHggPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBNYXJzaGFsbGVyIG0gPSBjdHguY3JlYXRlTWFyc2hhbGxlcigpOworICAgICAgICBpZiAoZm9ybWF0dGVkT3V0cHV0LmdldCgpKSB7CisgICAgICAgICAgICBtLnNldFByb3BlcnR5KE1hcnNoYWxsZXIuSkFYQl9GT1JNQVRURURfT1VUUFVULCBmb3JtYXR0ZWRPdXRwdXQuZ2V0KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtOworCisgICAgfQorCisgICAgcHJpdmF0ZSBNYXJzaGFsbGVyIGdldE1hcnNoYWxsZXIoQ2xhc3MgdHlwZSkgdGhyb3dzIEpBWEJFeGNlcHRpb24geworICAgICAgICBmaW5hbCBDb250ZXh0UmVzb2x2ZXI8TWFyc2hhbGxlcj4gcmVzb2x2ZXIgPSBtdE1hcnNoYWxsZXIuZ2V0KCk7CisgICAgICAgIGlmIChyZXNvbHZlciAhPSBudWxsKSB7CisgICAgICAgICAgICBNYXJzaGFsbGVyIHUgPSByZXNvbHZlci5nZXRDb250ZXh0KHR5cGUpOworICAgICAgICAgICAgaWYgKHUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiB1OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZmluYWwgSkFYQkNvbnRleHQgY3R4ID0gZ2V0SkFYQkNvbnRleHQodHlwZSk7CisgICAgICAgIGlmIChjdHggPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBNYXJzaGFsbGVyIG0gPSBjdHguY3JlYXRlTWFyc2hhbGxlcigpOworICAgICAgICBpZiAoZm9ybWF0dGVkT3V0cHV0LmdldCgpKSB7CisgICAgICAgICAgICBtLnNldFByb3BlcnR5KE1hcnNoYWxsZXIuSkFYQl9GT1JNQVRURURfT1VUUFVULCBmb3JtYXR0ZWRPdXRwdXQuZ2V0KCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtOworICAgIH0KKworICAgIHByaXZhdGUgSkFYQkNvbnRleHQgZ2V0SkFYQkNvbnRleHQoQ2xhc3MgdHlwZSwgTWVkaWFUeXBlIG10KSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENvbnRleHRSZXNvbHZlcjxKQVhCQ29udGV4dD4gY3IgPSBqYXhyc1Byb3ZpZGVycy5nZXRDb250ZXh0UmVzb2x2ZXIoSkFYQkNvbnRleHQuY2xhc3MsIG10KTsKKyAgICAgICAgaWYgKGNyICE9IG51bGwpIHsKKyAgICAgICAgICAgIEpBWEJDb250ZXh0IGMgPSBjci5nZXRDb250ZXh0KHR5cGUpOworICAgICAgICAgICAgaWYgKGMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBjOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGdldFN0b3JlZEpheGJDb250ZXh0KHR5cGUpOworICAgIH0KKworICAgIHByaXZhdGUgSkFYQkNvbnRleHQgZ2V0SkFYQkNvbnRleHQoQ2xhc3MgdHlwZSkgdGhyb3dzIEpBWEJFeGNlcHRpb24geworICAgICAgICBmaW5hbCBDb250ZXh0UmVzb2x2ZXI8SkFYQkNvbnRleHQ+IHJlc29sdmVyID0gbXRDb250ZXh0LmdldCgpOworICAgICAgICBpZiAocmVzb2x2ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgSkFYQkNvbnRleHQgYyA9IHJlc29sdmVyLmdldENvbnRleHQodHlwZSk7CisgICAgICAgICAgICBpZiAoYyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZ2V0U3RvcmVkSmF4YkNvbnRleHQodHlwZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmUgY2FjaGVkIEpBWEIgY29udGV4dCBjYXBhYmxlIG9mIGhhbmRsaW5nIHRoZSBnaXZlbiBKYXZhIHR5cGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSBKYXZhIHR5cGUgLgorICAgICAqIEByZXR1cm4gSkFYQiBjb250ZXh0IGFzc29jaWF0ZWQgd2l0aCB0aGUgSmF2YSB0eXBlLgorICAgICAqIEB0aHJvd3MgSkFYQkV4Y2VwdGlvbiBpbiBjYXNlIHRoZSBKQVhCIGNvbnRleHQgcmV0cmlldmFsIGZhaWxzLgorICAgICAqLworICAgIHByb3RlY3RlZCBKQVhCQ29udGV4dCBnZXRTdG9yZWRKYXhiQ29udGV4dChDbGFzcyB0eXBlKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgIHN5bmNocm9uaXplZCAoamF4YkNvbnRleHRzKSB7CisgICAgICAgICAgICBmaW5hbCBXZWFrUmVmZXJlbmNlPEpBWEJDb250ZXh0PiByZWYgPSBqYXhiQ29udGV4dHMuZ2V0KHR5cGUpOworICAgICAgICAgICAgSkFYQkNvbnRleHQgYyA9IChyZWYgIT0gbnVsbCkgPyByZWYuZ2V0KCkgOiBudWxsOworICAgICAgICAgICAgaWYgKGMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGMgPSBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZSh0eXBlKTsKKyAgICAgICAgICAgICAgICBqYXhiQ29udGV4dHMucHV0KHR5cGUsIG5ldyBXZWFrUmVmZXJlbmNlPEpBWEJDb250ZXh0PihjKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcge0BsaW5rIGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlNBWFNvdXJjZX0gZm9yIGEgZ2l2ZW4gZW50aXR5IGlucHV0IHN0cmVhbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzcGYgICAgICAgICAgU0FYIHBhcnNlciBmYWN0b3J5IHRvIGJlIHVzZWQgdG8gY3JlYXRlIHRoZSBTQVggc291cmNlLgorICAgICAqIEBwYXJhbSBlbnRpdHlTdHJlYW0gZW50aXR5IGlucHV0IHN0cmVhbS4KKyAgICAgKiBAcmV0dXJuIG5ldyB7QGxpbmsgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYU291cmNlfSByZXByZXNlbnRpbmcgdGhlIGVudGl0eSBpbnB1dCBzdHJlYW0uCisgICAgICogQHRocm93cyBKQVhCRXhjZXB0aW9uIGluIGNhc2UgU0FYIHNvdXJjZSBjcmVhdGlvbiBmYWlscy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIFNBWFNvdXJjZSBnZXRTQVhTb3VyY2UoU0FYUGFyc2VyRmFjdG9yeSBzcGYsIElucHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIEpBWEJFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTQVhTb3VyY2Uoc3BmLm5ld1NBWFBhcnNlcigpLmdldFhNTFJlYWRlcigpLCBuZXcgSW5wdXRTb3VyY2UoZW50aXR5U3RyZWFtKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEpBWEJFeGNlcHRpb24oIkVycm9yIGNyZWF0aW5nIFNBWFNvdXJjZSIsIGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGlzRm9ybWF0dGVkT3V0cHV0KCkgeworICAgICAgICByZXR1cm4gZm9ybWF0dGVkT3V0cHV0LmdldCgpOworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGlzWG1sUm9vdEVsZW1lbnRQcm9jZXNzaW5nKCkgeworICAgICAgICByZXR1cm4geG1sUm9vdEVsZW1lbnRQcm9jZXNzaW5nLmdldCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY3VzdG9tIFhNTCBoZWFkZXIgb24gYSBKQVhCIG1hcnNoYWxsZXIgaWYgc3BlY2lmaWVkIHZpYSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5YbWxIZWFkZXJ9IGFubm90YXRpb24sCisgICAgICogcHJlc2VudCBpbiB0aGUgc3VwcGxpZWQgYXJyYXkgb2YgYW5ub3RhdGlvbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFyc2hhbGxlciAgSkFYQiBtYXJzaGFsbGVyLgorICAgICAqIEBwYXJhbSBhbm5vdGF0aW9ucyBhcnJheSBvZiBhbm5vdGF0aW9ucyB0aGF0IE1BWSBjb250YWluIGEge0Bjb2RlIFhtbEhlYWRlcn0gYW5ub3RhdGlvbiBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRIZWFkZXIoTWFyc2hhbGxlciBtYXJzaGFsbGVyLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgZm9yIChBbm5vdGF0aW9uIGEgOiBhbm5vdGF0aW9ucykgeworICAgICAgICAgICAgaWYgKGEgaW5zdGFuY2VvZiBYbWxIZWFkZXIpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAvLyBzdGFuZGFsb25lIGpheGIgcmkKKyAgICAgICAgICAgICAgICAgICAgbWFyc2hhbGxlci5zZXRQcm9wZXJ0eSgiY29tLnN1bi54bWwuYmluZC54bWxIZWFkZXJzIiwgKChYbWxIZWFkZXIpIGEpLnZhbHVlKCkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFByb3BlcnR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGpheGIgcmkgZnJvbSBqZGsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hcnNoYWxsZXIuc2V0UHJvcGVydHkoImNvbS5zdW4ueG1sLmludGVybmFsLmJpbmQueG1sSGVhZGVycyIsICgoWG1sSGVhZGVyKSBhKS52YWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUHJvcGVydHlFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyIGpheGIgaW1wbGVtZW50YXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoQWJzdHJhY3RKYXhiUHJvdmlkZXIuY2xhc3MuZ2V0TmFtZSgpKS5sb2coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExldmVsLldBUk5JTkcsICJAWG1sSGVhZGVyIGFubm90YXRpb24gaXMgbm90IHN1cHBvcnRlZCB3aXRoIHRoaXMgSkFYQiBpbXBsZW1lbnRhdGlvbi4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIFBsZWFzZSB1c2UgSkFYQiBSSSBpZiB5b3UgbmVlZCB0aGlzIGZlYXR1cmUuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9qYXhiL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamF4Yi9pbnRlcm5hbC9BYnN0cmFjdFJvb3RFbGVtZW50SmF4YlByb3ZpZGVyLmphdmEgYi9tZWRpYS9qYXhiL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamF4Yi9pbnRlcm5hbC9BYnN0cmFjdFJvb3RFbGVtZW50SmF4YlByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIwMjRlZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2pheGIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYXhiL2ludGVybmFsL0Fic3RyYWN0Um9vdEVsZW1lbnRKYXhiUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYXhiLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5CYWRSZXF1ZXN0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLkludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk5vQ29udGVudEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXJzOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5NYXJzaGFsbGVyOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLlVubWFyc2hhbEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5Vbm1hcnNoYWxsZXI7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5FbnRpdHlJbnB1dFN0cmVhbTsKKworLyoqCisgKiBBbiBhYnN0cmFjdCBwcm92aWRlciBmb3IgSkFYQiB0eXBlcyB0aGF0IGFyZSBhbm5vdGF0ZWQgd2l0aAorICoge0BsaW5rIFhtbFJvb3RFbGVtZW50fSBvciB7QGxpbmsgWG1sVHlwZX0uCisgKiA8cD4KKyAqIEltcGxlbWVudGluZyBjbGFzc2VzIG1heSBleHRlbmQgdGhpcyBjbGFzcyB0byBwcm92aWRlIHNwZWNpZmljIG1hcnNoYWxsaW5nCisgKiBhbmQgdW5tYXJzaGFsbGluZyBiZWhhdmlvdXIuCisgKiA8cD4KKyAqIFdoZW4gdW5tYXJzaGFsbGluZyBhIHtAbGluayBVbm1hcnNoYWxFeGNlcHRpb259IHdpbGwgcmVzdWx0IGluIGEKKyAqIHtAbGluayBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbn0gYmVpbmcgdGhyb3duIHdpdGggYSBzdGF0dXMgb2YgNDAwCisgKiAoQ2xpZW50IGVycm9yKSwgYW5kIGEge0BsaW5rIEpBWEJFeGNlcHRpb259IHdpbGwgcmVzdWx0IGluIGEKKyAqIHtAbGluayBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbn0gYmVpbmcgdGhyb3duIHdpdGggYSBzdGF0dXMgb2YgNTAwCisgKiAoSW50ZXJuYWwgU2VydmVyIGVycm9yKS4KKyAqIDxwPgorICogV2hlbiBtYXJzaGFsbGluZyBhIHtAbGluayBKQVhCRXhjZXB0aW9ufSB3aWxsIHJlc3VsdCBpbiBhCisgKiB7QGxpbmsgV2ViQXBwbGljYXRpb25FeGNlcHRpb259IGJlaW5nIHRocm93biB3aXRoIGEgc3RhdHVzIG9mIDUwMAorICogKEludGVybmFsIFNlcnZlciBlcnJvcikuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Um9vdEVsZW1lbnRKYXhiUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEpheGJQcm92aWRlcjxPYmplY3Q+IHsKKworICAgIC8qKgorICAgICAqIEluaGVyaXRhbmNlIGNvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIHByb3ZpZGVycyBKQVgtUlMgcHJvdmlkZXJzLgorICAgICAqLworICAgIHB1YmxpYyBBYnN0cmFjdFJvb3RFbGVtZW50SmF4YlByb3ZpZGVyKFByb3ZpZGVycyBwcm92aWRlcnMpIHsKKyAgICAgICAgc3VwZXIocHJvdmlkZXJzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmhlcml0YW5jZSBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm92aWRlcnMgSkFYLVJTIHByb3ZpZGVycy4KKyAgICAgKiBAcGFyYW0gcmVzb2x2ZXJNZWRpYVR5cGUgSkFYQiBjb21wb25lbnQgY29udGV4dCByZXNvbHZlciBtZWRpYSB0eXBlIHRvIGJlIHVzZWQuCisgICAgICovCisgICAgcHVibGljIEFic3RyYWN0Um9vdEVsZW1lbnRKYXhiUHJvdmlkZXIoUHJvdmlkZXJzIHByb3ZpZGVycywgTWVkaWFUeXBlIHJlc29sdmVyTWVkaWFUeXBlKSB7CisgICAgICAgIHN1cGVyKHByb3ZpZGVycywgcmVzb2x2ZXJNZWRpYVR5cGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiAodHlwZS5nZXRBbm5vdGF0aW9uKFhtbFJvb3RFbGVtZW50LmNsYXNzKSAhPSBudWxsCisgICAgICAgICAgICAgICAgfHwgdHlwZS5nZXRBbm5vdGF0aW9uKFhtbFR5cGUuY2xhc3MpICE9IG51bGwpICYmIGlzU3VwcG9ydGVkKG1lZGlhVHlwZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiB0eXBlLmdldEFubm90YXRpb24oWG1sUm9vdEVsZW1lbnQuY2xhc3MpICE9IG51bGwgJiYgaXNTdXBwb3J0ZWQobWVkaWFUeXBlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgT2JqZWN0IHJlYWRGcm9tKAorICAgICAgICAgICAgQ2xhc3M8T2JqZWN0PiB0eXBlLAorICAgICAgICAgICAgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgRW50aXR5SW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtID0gRW50aXR5SW5wdXRTdHJlYW0uY3JlYXRlKGlucHV0U3RyZWFtKTsKKyAgICAgICAgICAgIGlmIChlbnRpdHlTdHJlYW0uaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vQ29udGVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9SRUFESU5HX0VOVElUWV9NSVNTSU5HKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlYWRGcm9tKHR5cGUsIG1lZGlhVHlwZSwgZ2V0VW5tYXJzaGFsbGVyKHR5cGUsIG1lZGlhVHlwZSksIGVudGl0eVN0cmVhbSk7CisgICAgICAgIH0gY2F0Y2ggKFVubWFyc2hhbEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oZXgpOworICAgICAgICB9IGNhdGNoIChKQVhCRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbihleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVbm1hcnNoYWwgYSBKQVhCIHR5cGUuCisgICAgICogPHA+CisgICAgICogSW1wbGVtZW50aW5nIGNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgICAgICAgICB0aGUgSkFYQiB0eXBlCisgICAgICogQHBhcmFtIG1lZGlhVHlwZSAgICB0aGUgbWVkaWEgdHlwZQorICAgICAqIEBwYXJhbSB1ICAgICAgICAgICAgdGhlIHVubWFyc2hhbGxlciB0byB1c2UgZm9yIHVubWFyc2hhbGxpbmcuCisgICAgICogQHBhcmFtIGVudGl0eVN0cmVhbSB0aGUgaW5wdXQgc3RyZWFtIHRvIHVubWFyc2hhbCBmcm9tLgorICAgICAqIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgdGhlIEpBWEIgdHlwZS4KKyAgICAgKiBAdGhyb3dzIGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb24gaW4gY2FzZSB0aGUgSkFYQiB1bm1hcnNoYWxsaW5nIGZhaWxzLgorICAgICAqLworICAgIHByb3RlY3RlZCBPYmplY3QgcmVhZEZyb20oQ2xhc3M8T2JqZWN0PiB0eXBlLCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5tYXJzaGFsbGVyIHUsIElucHV0U3RyZWFtIGVudGl0eVN0cmVhbSkKKyAgICAgICAgICAgIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHR5cGUuaXNBbm5vdGF0aW9uUHJlc2VudChYbWxSb290RWxlbWVudC5jbGFzcykpIHsKKyAgICAgICAgICAgIHJldHVybiB1LnVubWFyc2hhbChlbnRpdHlTdHJlYW0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIHUudW5tYXJzaGFsKG5ldyBTdHJlYW1Tb3VyY2UoZW50aXR5U3RyZWFtKSwgdHlwZSkuZ2V0VmFsdWUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlVG8oCisgICAgICAgICAgICBPYmplY3QgdCwKKyAgICAgICAgICAgIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBNYXJzaGFsbGVyIG0gPSBnZXRNYXJzaGFsbGVyKHR5cGUsIG1lZGlhVHlwZSk7CisgICAgICAgICAgICBmaW5hbCBDaGFyc2V0IGMgPSBnZXRDaGFyc2V0KG1lZGlhVHlwZSk7CisgICAgICAgICAgICBpZiAoYyAhPSBVVEY4KSB7CisgICAgICAgICAgICAgICAgbS5zZXRQcm9wZXJ0eShNYXJzaGFsbGVyLkpBWEJfRU5DT0RJTkcsIGMubmFtZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldEhlYWRlcihtLCBhbm5vdGF0aW9ucyk7CisgICAgICAgICAgICB3cml0ZVRvKHQsIG1lZGlhVHlwZSwgYywgbSwgZW50aXR5U3RyZWFtKTsKKyAgICAgICAgfSBjYXRjaCAoSkFYQkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24oZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFyc2hhbCBhbiBpbnN0YW5jZSBvZiBhIEpBWEIgdHlwZS4KKyAgICAgKiA8cD4KKyAgICAgKiBJbXBsZW1lbnRpbmcgY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdCAgICAgICAgICAgIHRoZSBpbnN0YW5jZSBvZiB0aGUgSkFYQiB0eXBlLgorICAgICAqIEBwYXJhbSBtZWRpYVR5cGUgICAgdGhlIG1lZGlhIHR5cGUuCisgICAgICogQHBhcmFtIGMgICAgICAgICAgICB0aGUgY2hhcmFjdGVyIHNldCB0byBzZXJpYWxpemUgY2hhcmFjdGVycyB0by4KKyAgICAgKiBAcGFyYW0gbSAgICAgICAgICAgIHRoZSBtYXJzaGFsbGVyIHRvIG1hcnNoYWxsZXIgdGhlIGluc3RhbmNlIG9mIHRoZSBKQVhCIHR5cGUuCisgICAgICogQHBhcmFtIGVudGl0eVN0cmVhbSB0aGUgb3V0cHV0IHN0cmVhbSB0byBtYXJzaGFsIHRvLgorICAgICAqIEB0aHJvd3MgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbiBpbiBjYXNlIHRoZSBKQVhCIG1hcnNoYWxsaW5nIGZhaWxzLgorICAgICAqLworICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlVG8oT2JqZWN0IHQsIE1lZGlhVHlwZSBtZWRpYVR5cGUsIENoYXJzZXQgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcnNoYWxsZXIgbSwgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkKKyAgICAgICAgICAgIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKKyAgICAgICAgbS5tYXJzaGFsKHQsIGVudGl0eVN0cmVhbSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF4Yi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pheGIvaW50ZXJuYWwvQWJzdHJhY3RYbWxGYWN0b3J5LmphdmEgYi9tZWRpYS9qYXhiL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamF4Yi9pbnRlcm5hbC9BYnN0cmFjdFhtbEZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzU4YWY4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamF4Yi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pheGIvaW50ZXJuYWwvQWJzdHJhY3RYbWxGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYXhiLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5Qcm9wZXJ0aWVzSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuTWVzc2FnZVByb3BlcnRpZXM7CisKKy8qKgorICogR2F0aGVycyBjb21tb24gZnVuY3Rpb25hbGl0eSBmb3Ige0BsaW5rIFN1cHBsaWVyfSBpbnN0YW5jZXMgaGFuZGxpbmcgWE1MIGRhdGEuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK2Fic3RyYWN0IGNsYXNzIEFic3RyYWN0WG1sRmFjdG9yeTxUPiBpbXBsZW1lbnRzIFN1cHBsaWVyPFQ+IHsKKworICAgIHByaXZhdGUgZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWc7CisKKyAgICBwcm90ZWN0ZWQgQWJzdHJhY3RYbWxGYWN0b3J5KGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlnKSB7CisgICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUge0B2YWx1ZSBNZXNzYWdlUHJvcGVydGllcyNYTUxfU0VDVVJJVFlfRElTQUJMRX0gcHJvcGVydHkgaXMgZGlzYWJsZWQgZm9yIHRoaXMgZmFjdG9yeS4KKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSB4bWwgc2VjdXJpdHkgaXMgZGlzYWJsZWQgZm9yIHRoaXMgZmFjdG9yeSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbGVhbiBpc1htbFNlY3VyaXR5RGlzYWJsZWQoKSB7CisgICAgICAgIHJldHVybiBQcm9wZXJ0aWVzSGVscGVyLmlzUHJvcGVydHkoY29uZmlnLmdldFByb3BlcnR5KE1lc3NhZ2VQcm9wZXJ0aWVzLlhNTF9TRUNVUklUWV9ESVNBQkxFKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF4Yi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pheGIvaW50ZXJuYWwvRG9jdW1lbnRCdWlsZGVyRmFjdG9yeUluamVjdGlvblByb3ZpZGVyLmphdmEgYi9tZWRpYS9qYXhiL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamF4Yi9pbnRlcm5hbC9Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5SW5qZWN0aW9uUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTA2MzA4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamF4Yi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pheGIvaW50ZXJuYWwvRG9jdW1lbnRCdWlsZGVyRmFjdG9yeUluamVjdGlvblByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYXhiLmludGVybmFsOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworCisvKioKKyAqIFRocmVhZC1zY29wZWQgaW5qZWN0aW9uIHByb3ZpZGVyIG9mIHtAbGluayBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRvY3VtZW50CisgKiBidWlsZGVyIGZhY3Rvcmllc30uCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIERvY3VtZW50QnVpbGRlckZhY3RvcnlJbmplY3Rpb25Qcm92aWRlciBleHRlbmRzIEFic3RyYWN0WG1sRmFjdG9yeTxEb2N1bWVudEJ1aWxkZXJGYWN0b3J5PiB7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IGRvY3VtZW50IGJ1aWxkZXIgZmFjdG9yeSBwcm92aWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25maWcgSmVyc2V5IGNvbmZpZ3VyYXRpb24gcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICAvLyBUT0RPIFRoaXMgcHJvdmlkZXIgc2hvdWxkIGJlIHJlZ2lzdGVyZWQgYW5kIGNvbmZpZ3VyZWQgdmlhIGEgZmVhdHVyZS4KKyAgICBASW5qZWN0CisgICAgcHVibGljIERvY3VtZW50QnVpbGRlckZhY3RvcnlJbmplY3Rpb25Qcm92aWRlcihmaW5hbCBDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICBzdXBlcihjb25maWcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGdldCgpIHsKKyAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBmID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworCisgICAgICAgIGYuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7CisKKyAgICAgICAgaWYgKCFpc1htbFNlY3VyaXR5RGlzYWJsZWQoKSkgeworICAgICAgICAgICAgZi5zZXRFeHBhbmRFbnRpdHlSZWZlcmVuY2VzKGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF4Yi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pheGIvaW50ZXJuYWwvRG9jdW1lbnRQcm92aWRlci5qYXZhIGIvbWVkaWEvamF4Yi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pheGIvaW50ZXJuYWwvRG9jdW1lbnRQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NTY2NWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXhiL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamF4Yi9pbnRlcm5hbC9Eb2N1bWVudFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamF4Yi5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5CYWRSZXF1ZXN0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuQWJzdHJhY3RNZXNzYWdlUmVhZGVyV3JpdGVyUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CisKKy8qKgorICogUHJvdmlkZXIgZm9yIG1hcnNoYWxsaW5nL3VuLW1hcnNoYWxsaW5nIHtAbGluayBEb2N1bWVudCBYTUwgZG9jdW1lbnR9IGluc3RhbmNlcy4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitAUHJvZHVjZXMoeyJhcHBsaWNhdGlvbi94bWwiLCAidGV4dC94bWwiLCAiKi8qIn0pCitAQ29uc3VtZXMoeyJhcHBsaWNhdGlvbi94bWwiLCAidGV4dC94bWwiLCAiKi8qIn0pCitAU2luZ2xldG9uCitwdWJsaWMgZmluYWwgY2xhc3MgRG9jdW1lbnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVJlYWRlcldyaXRlclByb3ZpZGVyPERvY3VtZW50PiB7CisKKyAgICBASW5qZWN0CisgICAgcHJpdmF0ZSBQcm92aWRlcjxEb2N1bWVudEJ1aWxkZXJGYWN0b3J5PiBkYmY7CisgICAgQEluamVjdAorICAgIHByaXZhdGUgUHJvdmlkZXI8VHJhbnNmb3JtZXJGYWN0b3J5PiB0ZjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiBEb2N1bWVudC5jbGFzcyA9PSB0eXBlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBEb2N1bWVudCByZWFkRnJvbSgKKyAgICAgICAgICAgIENsYXNzPERvY3VtZW50PiB0eXBlLAorICAgICAgICAgICAgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICBJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gZGJmLmdldCgpLm5ld0RvY3VtZW50QnVpbGRlcigpLnBhcnNlKGVudGl0eVN0cmVhbSk7CisgICAgICAgIH0gY2F0Y2ggKFNBWEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oZXgpOworICAgICAgICB9IGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbihleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIERvY3VtZW50LmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGVUbygKKyAgICAgICAgICAgIERvY3VtZW50IHQsCisgICAgICAgICAgICBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgU3RyZWFtUmVzdWx0IHNyID0gbmV3IFN0cmVhbVJlc3VsdChlbnRpdHlTdHJlYW0pOworICAgICAgICAgICAgdGYuZ2V0KCkubmV3VHJhbnNmb3JtZXIoKS50cmFuc2Zvcm0obmV3IERPTVNvdXJjZSh0KSwgc3IpOworICAgICAgICB9IGNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24oZXgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF4Yi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pheGIvaW50ZXJuYWwvSmF4YkF1dG9EaXNjb3ZlcmFibGUuamF2YSBiL21lZGlhL2pheGIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYXhiL2ludGVybmFsL0pheGJBdXRvRGlzY292ZXJhYmxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNkNGI4YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2pheGIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYXhiL2ludGVybmFsL0pheGJBdXRvRGlzY292ZXJhYmxlLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYXhiLmludGVybmFsOworCitpbXBvcnQgamF2YXgud3MucnMuUnVudGltZVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlQ29udGV4dDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnNwaS5Gb3JjZWRBdXRvRGlzY292ZXJhYmxlOworCisvKioKKyAqIEpBWEIge0BsaW5rIEZvcmNlZEF1dG9EaXNjb3ZlcmFibGV9IHRoYXQgcmVnaXN0ZXJzIGFsbCBuZWNlc3NhcnkgSkFYQiBmZWF0dXJlcworICogaW50byB0aGUgaW5qZWN0aW9uIG1hbmFnZXIgZGlyZWN0bHkuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEpheGJBdXRvRGlzY292ZXJhYmxlIGltcGxlbWVudHMgRm9yY2VkQXV0b0Rpc2NvdmVyYWJsZSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoZmluYWwgRmVhdHVyZUNvbnRleHQgY29udGV4dCkgeworICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKG5ldyBKYXhiTWVzc2FnaW5nQmluZGVyKCkpOworCisgICAgICAgIGlmIChSdW50aW1lVHlwZS5TRVJWRVIgPT0gY29udGV4dC5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UnVudGltZVR5cGUoKSkgeworICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihuZXcgSmF4YlBhcmFtQ29udmVydGVyQmluZGVyKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF4Yi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pheGIvaW50ZXJuYWwvSmF4Yk1lc3NhZ2luZ0JpbmRlci5qYXZhIGIvbWVkaWEvamF4Yi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pheGIvaW50ZXJuYWwvSmF4Yk1lc3NhZ2luZ0JpbmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZTEwNTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXhiL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamF4Yi9pbnRlcm5hbC9KYXhiTWVzc2FnaW5nQmluZGVyLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYXhiLmludGVybmFsOworCitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MSW5wdXRGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkFic3RyYWN0QmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5QZXJUaHJlYWQ7CisKKy8qKgorICogQmluZGVyIGZvciBKQVgtQiBtZXNzYWdlIGJvZHkgd29ya2Vycy4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSmF4Yk1lc3NhZ2luZ0JpbmRlciBleHRlbmRzIEFic3RyYWN0QmluZGVyIHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgYmluZFNpbmdsZXRvbldvcmtlcihEb2N1bWVudFByb3ZpZGVyLmNsYXNzKTsKKyAgICAgICAgYmluZFNpbmdsZXRvbldvcmtlcihYbWxKYXhiRWxlbWVudFByb3ZpZGVyLkFwcC5jbGFzcyk7CisgICAgICAgIGJpbmRTaW5nbGV0b25Xb3JrZXIoWG1sSmF4YkVsZW1lbnRQcm92aWRlci5UZXh0LmNsYXNzKTsKKyAgICAgICAgYmluZFNpbmdsZXRvbldvcmtlcihYbWxKYXhiRWxlbWVudFByb3ZpZGVyLkdlbmVyYWwuY2xhc3MpOworCisgICAgICAgIGJpbmRTaW5nbGV0b25Xb3JrZXIoWG1sQ29sbGVjdGlvbkpheGJQcm92aWRlci5BcHAuY2xhc3MpOworICAgICAgICBiaW5kU2luZ2xldG9uV29ya2VyKFhtbENvbGxlY3Rpb25KYXhiUHJvdmlkZXIuVGV4dC5jbGFzcyk7CisgICAgICAgIGJpbmRTaW5nbGV0b25Xb3JrZXIoWG1sQ29sbGVjdGlvbkpheGJQcm92aWRlci5HZW5lcmFsLmNsYXNzKTsKKworICAgICAgICBiaW5kU2luZ2xldG9uV29ya2VyKFhtbFJvb3RFbGVtZW50SmF4YlByb3ZpZGVyLkFwcC5jbGFzcyk7CisgICAgICAgIGJpbmRTaW5nbGV0b25Xb3JrZXIoWG1sUm9vdEVsZW1lbnRKYXhiUHJvdmlkZXIuVGV4dC5jbGFzcyk7CisgICAgICAgIGJpbmRTaW5nbGV0b25Xb3JrZXIoWG1sUm9vdEVsZW1lbnRKYXhiUHJvdmlkZXIuR2VuZXJhbC5jbGFzcyk7CisKKyAgICAgICAgYmluZChYbWxSb290T2JqZWN0SmF4YlByb3ZpZGVyLkFwcC5jbGFzcykudG8oTWVzc2FnZUJvZHlSZWFkZXIuY2xhc3MpLmluKFNpbmdsZXRvbi5jbGFzcyk7CisgICAgICAgIGJpbmQoWG1sUm9vdE9iamVjdEpheGJQcm92aWRlci5UZXh0LmNsYXNzKS50byhNZXNzYWdlQm9keVJlYWRlci5jbGFzcykuaW4oU2luZ2xldG9uLmNsYXNzKTsKKyAgICAgICAgYmluZChYbWxSb290T2JqZWN0SmF4YlByb3ZpZGVyLkdlbmVyYWwuY2xhc3MpLnRvKE1lc3NhZ2VCb2R5UmVhZGVyLmNsYXNzKS5pbihTaW5nbGV0b24uY2xhc3MpOworCisgICAgICAgIC8vIFhNTCBmYWN0b3J5IGluamVjdGlvbiBwb2ludHM6CisgICAgICAgIGJpbmRGYWN0b3J5KERvY3VtZW50QnVpbGRlckZhY3RvcnlJbmplY3Rpb25Qcm92aWRlci5jbGFzcykudG8oRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5jbGFzcykuaW4oUGVyVGhyZWFkLmNsYXNzKTsKKyAgICAgICAgYmluZEZhY3RvcnkoU2F4UGFyc2VyRmFjdG9yeUluamVjdGlvblByb3ZpZGVyLmNsYXNzKS50byhTQVhQYXJzZXJGYWN0b3J5LmNsYXNzKS5pbihQZXJUaHJlYWQuY2xhc3MpOworICAgICAgICBiaW5kRmFjdG9yeShYbWxJbnB1dEZhY3RvcnlJbmplY3Rpb25Qcm92aWRlci5jbGFzcykudG8oWE1MSW5wdXRGYWN0b3J5LmNsYXNzKS5pbihQZXJUaHJlYWQuY2xhc3MpOworICAgICAgICBiaW5kRmFjdG9yeShUcmFuc2Zvcm1lckZhY3RvcnlJbmplY3Rpb25Qcm92aWRlci5jbGFzcykudG8oVHJhbnNmb3JtZXJGYWN0b3J5LmNsYXNzKS5pbihQZXJUaHJlYWQuY2xhc3MpOworICAgIH0KKworICAgIHByaXZhdGUgPFQgZXh0ZW5kcyBNZXNzYWdlQm9keVJlYWRlciAmIE1lc3NhZ2VCb2R5V3JpdGVyPiB2b2lkIGJpbmRTaW5nbGV0b25Xb3JrZXIoQ2xhc3M8VD4gd29ya2VyKSB7CisgICAgICAgIGJpbmQod29ya2VyKS50byhNZXNzYWdlQm9keVJlYWRlci5jbGFzcykudG8oTWVzc2FnZUJvZHlXcml0ZXIuY2xhc3MpLmluKFNpbmdsZXRvbi5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF4Yi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pheGIvaW50ZXJuYWwvSmF4YlBhcmFtQ29udmVydGVyQmluZGVyLmphdmEgYi9tZWRpYS9qYXhiL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamF4Yi9pbnRlcm5hbC9KYXhiUGFyYW1Db252ZXJ0ZXJCaW5kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2I2MWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamF4Yi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pheGIvaW50ZXJuYWwvSmF4YlBhcmFtQ29udmVydGVyQmluZGVyLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYXhiLmludGVybmFsOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3RyYWluZWRUbzsKK2ltcG9ydCBqYXZheC53cy5ycy5SdW50aW1lVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUGFyYW1Db252ZXJ0ZXJQcm92aWRlcjsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQWJzdHJhY3RCaW5kZXI7CisKKy8qKgorICogQmluZGVyIGZvciBKQVhCIHBhcmFtZXRlciBjb252ZXJ0ZXIuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQENvbnN0cmFpbmVkVG8oUnVudGltZVR5cGUuU0VSVkVSKQorcHVibGljIGNsYXNzIEpheGJQYXJhbUNvbnZlcnRlckJpbmRlciBleHRlbmRzIEFic3RyYWN0QmluZGVyIHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgYmluZChKYXhiU3RyaW5nUmVhZGVyUHJvdmlkZXIuUm9vdEVsZW1lbnRQcm92aWRlci5jbGFzcykudG8oUGFyYW1Db252ZXJ0ZXJQcm92aWRlci5jbGFzcykuaW4oU2luZ2xldG9uLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9qYXhiL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamF4Yi9pbnRlcm5hbC9KYXhiU3RyaW5nUmVhZGVyUHJvdmlkZXIuamF2YSBiL21lZGlhL2pheGIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYXhiL2ludGVybmFsL0pheGJTdHJpbmdSZWFkZXJQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNjY0YmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXhiL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamF4Yi9pbnRlcm5hbC9KYXhiU3RyaW5nUmVhZGVyUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYXhiLmludGVybmFsOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLldlYWtIYXNoTWFwOworCitpbXBvcnQgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LkNvbnRleHRSZXNvbHZlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUGFyYW1Db252ZXJ0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlBhcmFtQ29udmVydGVyUHJvdmlkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyczsKKworaW1wb3J0IGphdmF4LmluamVjdC5Qcm92aWRlcjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLlVubWFyc2hhbEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5Vbm1hcnNoYWxsZXI7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhTb3VyY2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuRXh0cmFjdG9yRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5WYWx1ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uVmFsdWVzOworCitpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CisKKy8qKgorICogU3RyaW5nIHJlYWRlciBwcm92aWRlciBwcm9kdWNpbmcge0BsaW5rIFBhcmFtQ29udmVydGVyUHJvdmlkZXIgcGFyYW0gY29udmVydGVyIHByb3ZpZGVyfSB0aGF0CisgKiBzdXBwb3J0IGNvbnZlcnNpb24gb2YgYSBzdHJpbmcgdmFsdWUgaW50byBhIEpBWEIgaW5zdGFuY2UuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEpheGJTdHJpbmdSZWFkZXJQcm92aWRlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8Q2xhc3MsIEpBWEJDb250ZXh0PiBqYXhiQ29udGV4dHMgPSBuZXcgV2Vha0hhc2hNYXA8Q2xhc3MsIEpBWEJDb250ZXh0PigpOworICAgIHByaXZhdGUgZmluYWwgVmFsdWU8Q29udGV4dFJlc29sdmVyPEpBWEJDb250ZXh0Pj4gbXRDb250ZXh0OworICAgIHByaXZhdGUgZmluYWwgVmFsdWU8Q29udGV4dFJlc29sdmVyPFVubWFyc2hhbGxlcj4+IG10VW5tYXJzaGFsbGVyOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIEpBWEIgc3RyaW5nIHJlYWRlciBwcm92aWRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcyB1c2VkIHRvIG9idGFpbiB7QGxpbmsgSkFYQkNvbnRleHR9IGFuZCB7QGxpbmsgVW5tYXJzaGFsbGVyfSB7QGxpbmsgQ29udGV4dFJlc29sdmVyIENvbnRleHRSZXNvbHZlcnN9CisgICAgICovCisgICAgcHVibGljIEpheGJTdHJpbmdSZWFkZXJQcm92aWRlcihmaW5hbCBQcm92aWRlcnMgcHMpIHsKKyAgICAgICAgdGhpcy5tdENvbnRleHQgPSBWYWx1ZXMubGF6eShuZXcgVmFsdWU8Q29udGV4dFJlc29sdmVyPEpBWEJDb250ZXh0Pj4oKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIENvbnRleHRSZXNvbHZlcjxKQVhCQ29udGV4dD4gZ2V0KCkgeworICAgICAgICAgICAgICAgIHJldHVybiBwcy5nZXRDb250ZXh0UmVzb2x2ZXIoSkFYQkNvbnRleHQuY2xhc3MsIG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICB0aGlzLm10VW5tYXJzaGFsbGVyID0gVmFsdWVzLmxhenkobmV3IFZhbHVlPENvbnRleHRSZXNvbHZlcjxVbm1hcnNoYWxsZXI+PigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIENvbnRleHRSZXNvbHZlcjxVbm1hcnNoYWxsZXI+IGdldCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcHMuZ2V0Q29udGV4dFJlc29sdmVyKFVubWFyc2hhbGxlci5jbGFzcywgbnVsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBKQVhCIHVubWFyc2hhbGxlciBmb3IgdGhlIHR5cGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHlwZSBKYXZhIHR5cGUgdG8gYmUgdW5tYXJzaGFsbGVkLgorICAgICAqIEByZXR1cm4gSkFYQiB1bm1hcnNoYWxsZXIgZm9yIHRoZSBnaXZlbiB0eXBlLgorICAgICAqIEB0aHJvd3MgSkFYQkV4Y2VwdGlvbiBpbiBjYXNlIHRoZXJlJ3MgYW4gZXJyb3IgcmV0cmlldmluZyB0aGUgdW5tYXJzaGFsbGVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCBVbm1hcnNoYWxsZXIgZ2V0VW5tYXJzaGFsbGVyKENsYXNzIHR5cGUpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ29udGV4dFJlc29sdmVyPFVubWFyc2hhbGxlcj4gdW5tYXJzaGFsbGVyQ29udGV4dFJlc29sdmVyID0gbXRVbm1hcnNoYWxsZXIuZ2V0KCk7CisgICAgICAgIGlmICh1bm1hcnNoYWxsZXJDb250ZXh0UmVzb2x2ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgVW5tYXJzaGFsbGVyIHUgPSB1bm1hcnNoYWxsZXJDb250ZXh0UmVzb2x2ZXIuZ2V0Q29udGV4dCh0eXBlKTsKKyAgICAgICAgICAgIGlmICh1ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZ2V0SkFYQkNvbnRleHQodHlwZSkuY3JlYXRlVW5tYXJzaGFsbGVyKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBKQVhCQ29udGV4dCBnZXRKQVhCQ29udGV4dChDbGFzcyB0eXBlKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENvbnRleHRSZXNvbHZlcjxKQVhCQ29udGV4dD4gamF4YkNvbnRleHRDb250ZXh0UmVzb2x2ZXIgPSBtdENvbnRleHQuZ2V0KCk7CisgICAgICAgIGlmIChqYXhiQ29udGV4dENvbnRleHRSZXNvbHZlciAhPSBudWxsKSB7CisgICAgICAgICAgICBKQVhCQ29udGV4dCBjID0gamF4YkNvbnRleHRDb250ZXh0UmVzb2x2ZXIuZ2V0Q29udGV4dCh0eXBlKTsKKyAgICAgICAgICAgIGlmIChjICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZ2V0U3RvcmVkSkFYQkNvbnRleHQodHlwZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBzdG9yZWQgSkFYQiBjb250ZXh0IHN1cHBvcnRpbmcgdGhlIEphdmEgdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIEphdmEgdHlwZSBzdXBwb3J0ZWQgYnkgdGhlIHN0b3JlZCBKQVhCIGNvbnRleHQuCisgICAgICogQHJldHVybiBzdG9yZWQgSkFYQiBjb250ZXh0IHN1cHBvcnRpbmcgdGhlIEphdmEgdHlwZS4KKyAgICAgKiBAdGhyb3dzIEpBWEJFeGNlcHRpb24gaW4gY2FzZSBKQVhCIGNvbnRleHQgcmV0cmlldmFsIGZhaWxzLgorICAgICAqLworICAgIHByb3RlY3RlZCBKQVhCQ29udGV4dCBnZXRTdG9yZWRKQVhCQ29udGV4dChDbGFzcyB0eXBlKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgIHN5bmNocm9uaXplZCAoamF4YkNvbnRleHRzKSB7CisgICAgICAgICAgICBKQVhCQ29udGV4dCBjID0gamF4YkNvbnRleHRzLmdldCh0eXBlKTsKKyAgICAgICAgICAgIGlmIChjID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjID0gSkFYQkNvbnRleHQubmV3SW5zdGFuY2UodHlwZSk7CisgICAgICAgICAgICAgICAgamF4YkNvbnRleHRzLnB1dCh0eXBlLCBjKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUm9vdCBlbGVtZW50IEpBWEIge0BsaW5rIFBhcmFtQ29udmVydGVyIHBhcmFtIGNvbnZlcnRlcn0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSb290RWxlbWVudFByb3ZpZGVyIGV4dGVuZHMgSmF4YlN0cmluZ1JlYWRlclByb3ZpZGVyIGltcGxlbWVudHMgUGFyYW1Db252ZXJ0ZXJQcm92aWRlciB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxTQVhQYXJzZXJGYWN0b3J5PiBzcGZQcm92aWRlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBuZXcgaW5zdGFuY2UuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzcGZQcm92aWRlciB7QGxpbmsgU0FYUGFyc2VyRmFjdG9yeSBTQVggcGFyc2VyIGZhY3Rvcnl9IGluamVjdGlvbiBwcm92aWRlci4KKyAgICAgICAgICogQHBhcmFtIHBzIHVzZWQgdG8gb2J0YWluIHtAbGluayBKQVhCQ29udGV4dH0gYW5kIHtAbGluayBVbm1hcnNoYWxsZXJ9IHtAbGluayBDb250ZXh0UmVzb2x2ZXIgQ29udGV4dFJlc29sdmVyc30KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBSb290RWxlbWVudFByb3ZpZGVyKEBDb250ZXh0IFByb3ZpZGVyPFNBWFBhcnNlckZhY3Rvcnk+IHNwZlByb3ZpZGVyLCBAQ29udGV4dCBQcm92aWRlcnMgcHMpIHsKKyAgICAgICAgICAgIHN1cGVyKHBzKTsKKyAgICAgICAgICAgIHRoaXMuc3BmUHJvdmlkZXIgPSBzcGZQcm92aWRlcjsKKyAgICAgICAgfQorCisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyA8VD4gUGFyYW1Db252ZXJ0ZXI8VD4gZ2V0Q29udmVydGVyKGZpbmFsIENsYXNzPFQ+IHJhd1R5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucykgeworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBzdXBwb3J0ZWQgPSAocmF3VHlwZS5nZXRBbm5vdGF0aW9uKFhtbFJvb3RFbGVtZW50LmNsYXNzKSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgIHx8IHJhd1R5cGUuZ2V0QW5ub3RhdGlvbihYbWxUeXBlLmNsYXNzKSAhPSBudWxsKTsKKyAgICAgICAgICAgIGlmICghc3VwcG9ydGVkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgUGFyYW1Db252ZXJ0ZXI8VD4oKSB7CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgVCBmcm9tU3RyaW5nKFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU0FYU291cmNlIHNvdXJjZSA9IG5ldyBTQVhTb3VyY2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwZlByb3ZpZGVyLmdldCgpLm5ld1NBWFBhcnNlcigpLmdldFhNTFJlYWRlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSW5wdXRTb3VyY2UobmV3IGphdmEuaW8uU3RyaW5nUmVhZGVyKHZhbHVlKSkpOworCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBVbm1hcnNoYWxsZXIgdSA9IGdldFVubWFyc2hhbGxlcihyYXdUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyYXdUeXBlLmlzQW5ub3RhdGlvblByZXNlbnQoWG1sUm9vdEVsZW1lbnQuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJhd1R5cGUuY2FzdCh1LnVubWFyc2hhbChzb3VyY2UpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHUudW5tYXJzaGFsKHNvdXJjZSwgcmF3VHlwZSkuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVW5tYXJzaGFsRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXh0cmFjdG9yRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX1VOTUFSU0hBTExJTkdfSkFYQihyYXdUeXBlKSwgZXgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChKQVhCRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9VTk1BUlNIQUxMSU5HX0pBWEIocmF3VHlwZSksIGV4KTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9VTk1BUlNIQUxMSU5HX0pBWEIocmF3VHlwZSksIGV4KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoVCB2YWx1ZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IEpFUlNFWS0xMzg1CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAidGVzdCI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2pheGIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYXhiL2ludGVybmFsL05vdW5JbmZsZWN0b3IuamF2YSBiL21lZGlhL2pheGIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYXhiL2ludGVybmFsL05vdW5JbmZsZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTIzZWM5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamF4Yi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pheGIvaW50ZXJuYWwvTm91bkluZmxlY3Rvci5qYXZhCkBAIC0wLDAgKzEsODIzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmpheGIuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCisvKioKKyAqIDxwPkFQSSBmb3IgcGVyZm9ybWluZyBpbmZsZWN0aW9ucyAocGx1cmFsaXphdGlvbiwgc2luZ3VsYXJpemF0aW9uLCBhbmQgc28gb24pCisgKiBvbiB2YXJpb3VzIHN0cmluZ3MuICBUaGVzZSBpbmZsZWN0aW9ucyB3aWxsIGJlIHVzZWZ1bCBpbiBjb2RlIGdlbmVyYXRvcnMgdGhhdAorICogY29udmVydCB0aGluZ3MgbGlrZSBkYXRhYmFzZSB0YWJsZSBuYW1lcyBpbnRvIEphdmEgY2xhc3MgbmFtZXMuPC9wPgorICoKKyAqIDxwPlRoZSB7QGNvZGUgZ2V0SW5zdGFuY2UoKX0gbWV0aG9kIHJldHVybnMgYSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YKKyAqIHRoaXMgY2xhc3Mgd2l0aCBhIGRlZmF1bHQgc2V0IG9mIHJ1bGVzLCB3aGljaCBjYW4gdGhlbiBiZSBjdXN0b21pemVkLgorICogUnVsZXMgYWRkZWQgZHVyaW5nIGN1c3RvbWl6YXRpb24gd2lsbCB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGUgc3RhbmRhcmQgb25lcy4KKyAqIFVzZSB0aGUge0Bjb2RlIGFkZElycmVndWxhcigpfSwge0Bjb2RlIGFkZFBsdXJhbCgpfSwge0Bjb2RlIGFkZFNpbmd1bGFyKCl9LAorICogYW5kIHtAY29kZSBhZGRVbmNvdW50YWJsZSgpfSBtZXRob2RzIHRvIGFkZCBhZGRpdGlvbmFsIHJ1bGVzIG90IHRoZSBkZWZhdWx0CisgKiBvbmVzLjwvcD4KKyAqCisgKiA8cD48c3Ryb25nPklNUExFTUVOVEFUSU9OIE5PVEU8L3N0cm9uZz4gLSBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcworICogaW50ZW5kZWQgdG8gYmUgZnVuY3Rpb25hbGx5IGNvbXBhdGlibGUgd2l0aCB0aGUge0Bjb2RlIEluZmxlY3Rvcjo6aW5mbGVjdGlvbnN9CisgKiBjbGFzcyBpbiBSdWJ5IG9uIFJhaWxzLiAgVGhlIHtAY29kZSBnc3ViKCl9IG1ldGhvZCBvbiBSdWJ5IHN0cmluZ3MKKyAqIG1hdGNoZXMgcmVndWxhciBleHByZXNzaW9ucyBhbnl3aGVyZSBpbiB0aGUgaW5wdXQuICBIb3dldmVyLCBuZWFybHkgYWxsIG9mCisgKiB0aGUgYWN0dWFsIHBhdHRlcm5zIHVzZWQgaW4gdGhpcyBjb21wb25lbnQgdXNlIHtAY29kZSAkfSBhdCB0aGUgZW5kIHRvCisgKiBtYXRjaCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBzdHJpbmcgKHNvIHRoYXQgb25seSB0aGUgbGFzdCB3b3JkIGluIGEgbXVsdGlwbGUKKyAqIHdvcmQgcGhyYXNlIHdpbGwgYmUgc2luZ3VsYXJpemVkIG9yIHBsdXJhbGl6ZWQpLiAgVGhlcmVmb3JlLCB0aGUgSmF2YSB2ZXJzaW9ucworICogb2YgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgaGF2ZSBiZWVuIG1vZGlmaWVkIHRvIGNhcHR1cmUgYWxsIHRleHQgYmVmb3JlIHRoZQorICogaW50ZXJlc3RpbmcgY2hhcmFjdGVycyBhdCB0aGUgZW5kLCBhbmQgZW1pdCB0aGVtIGFzIHBhcnQgb2YgdGhlIHJlc3VsdCwgc28KKyAqIHRoYXQgdGhlIGVudGlyZSBzdHJpbmcgY2FuIGJlIG1hdGNoZWQgYWdhaW5zdCBhIHBhdHRlcm4gb25jZS48L3A+CisgKgorICogQGF1dGhvciBGbG9yaWFuIFJvc2VuYmVyZworICovCitmaW5hbCBjbGFzcyBOb3VuSW5mbGVjdG9yIHsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcnMKKworICAgIC8qKgorICAgICAqIDxwPlByaXZhdGUgY29uc3RydWN0b3IgdG8gYXZvaWQgaW5zdGFudGlhdGlvbi48L3A+CisgICAgICovCisgICAgcHJpdmF0ZSBOb3VuSW5mbGVjdG9yKCkgeworCisgICAgICAgIGFkZFBsdXJhbCgiJCIsICJzIiwgZmFsc2UpOworICAgICAgICBhZGRQbHVyYWwoIiguKikkIiwgIlxcMXMiKTsKKyAgICAgICAgYWRkUGx1cmFsKCIoLiopKGF4fHRlc3QpaXMkIiwgIlxcMVxcMmVzIik7CisgICAgICAgIGFkZFBsdXJhbCgiKC4qKShvY3RvcHx2aXIpdXMkIiwgIlxcMVxcMmkiKTsKKyAgICAgICAgYWRkUGx1cmFsKCIoLiopKGFsaWFzfHN0YXR1cykkIiwgIlxcMVxcMmVzIik7CisgICAgICAgIGFkZFBsdXJhbCgiKC4qKShidSlzJCIsICJcXDFcXDJzZXMiKTsKKyAgICAgICAgYWRkUGx1cmFsKCIoLiopKGJ1ZmZhbHx0b21hdClvJCIsICJcXDFcXDJvZXMiKTsKKyAgICAgICAgYWRkUGx1cmFsKCIoLiopKFt0aV0pdW0kIiwgIlxcMVxcMmEiKTsKKyAgICAgICAgYWRkUGx1cmFsKCIoLiopc2lzJCIsICJcXDFzZXMiKTsKKyAgICAgICAgYWRkUGx1cmFsKCIoLiopKD86KFteZl0pZmV8KFtscl0pZikkIiwgIlxcMVxcM3ZlcyIpOworICAgICAgICBhZGRQbHVyYWwoIiguKikoaGl2ZSkkIiwgIlxcMVxcMnMiKTsKKyAgICAgICAgYWRkUGx1cmFsKCIoLiopKHRpdmUpJCIsICJcXDFcXDJzIik7IC8vIEFkZGVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHNpbmd1bGFyIHJ1bGVzCisgICAgICAgIGFkZFBsdXJhbCgiKC4qKShbXmFlaW91eV18cXUpeSQiLCAiXFwxXFwyaWVzIik7CisgICAgICAgIGFkZFBsdXJhbCgiKC4qKShzZXJpZXMpJCIsICJcXDFcXDIiKTsgLy8gQWRkZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggc2luZ3VsYXIgcnVsZXMKKyAgICAgICAgYWRkUGx1cmFsKCIoLiopKG1vdmllKSQiLCAiXFwxXFwycyIpOyAvLyBBZGRlZCBmb3IgY29uc2lzdGVuY3kgd2l0aCBzaW5ndWxhciBydWxlcworICAgICAgICBhZGRQbHVyYWwoIiguKikoeHxjaHxzc3xzaCkkIiwgIlxcMVxcMmVzIik7CisgICAgICAgIGFkZFBsdXJhbCgiKC4qKShtYXRyfHZlcnR8aW5kKWl4fGV4JCIsICJcXDFcXDJpY2VzIik7CisgICAgICAgIGFkZFBsdXJhbCgiKC4qKShvKSQiLCAiXFwxXFwyZXMiKTsgLy8gQWRkZWQgZm9yIGNvbnNpc3RlbmN5IHdpdGggc2luZ3VsYXIgcnVsZXMKKyAgICAgICAgYWRkUGx1cmFsKCIoLiopKHNob2UpJCIsICJcXDFcXDJzIik7IC8vIEFkZGVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHNpbmd1bGFyIHJ1bGVzCisgICAgICAgIGFkZFBsdXJhbCgiKC4qKShbbXxsXSlvdXNlJCIsICJcXDFcXDJpY2UiKTsKKyAgICAgICAgYWRkUGx1cmFsKCJeKG94KSQiLCAiXFwxZW4iKTsKKyAgICAgICAgYWRkUGx1cmFsKCIoLiopKHZlcnR8aW5kKWV4JCIsICJcXDFcXDJpY2VzIik7IC8vIEFkZGVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHNpbmd1bGFyIHJ1bGVzCisgICAgICAgIGFkZFBsdXJhbCgiKC4qKShtYXRyKWl4JCIsICJcXDFcXDJpY2VzIik7IC8vIEFkZGVkIGZvciBjb25zaXN0ZW5jeSB3aXRoIHNpbmd1bGFyIHJ1bGVzCisgICAgICAgIGFkZFBsdXJhbCgiKC4qKShxdWl6KSQiLCAiXFwxXFwyemVzIik7CisKKyAgICAgICAgYWRkU2luZ3VsYXIoIiguKilzJCIsICJcXDEiKTsKKyAgICAgICAgYWRkU2luZ3VsYXIoIiguKikobilld3MkIiwgIlxcMVxcMmV3cyIpOworICAgICAgICBhZGRTaW5ndWxhcigiKC4qKShbdGldKWEkIiwgIlxcMVxcMnVtIik7CisgICAgICAgIGFkZFNpbmd1bGFyKCIoLiopKChhKW5hbHl8KGIpYXwoZClpYWdub3wocClhcmVudGhlfChwKXJvZ25vfChzKXlub3B8KHQpaGUpc2VzJCIsICJcXDFcXDJzaXMiKTsKKyAgICAgICAgYWRkU2luZ3VsYXIoIiguKikoXmFuYWx5KXNlcyQiLCAiXFwxXFwyc2lzIik7CisgICAgICAgIGFkZFNpbmd1bGFyKCIoLiopKFteZl0pdmVzJCIsICJcXDFcXDJmZSIpOworICAgICAgICBhZGRTaW5ndWxhcigiKC4qKShoaXZlKXMkIiwgIlxcMVxcMiIpOworICAgICAgICBhZGRTaW5ndWxhcigiKC4qKSh0aXZlKXMkIiwgIlxcMVxcMiIpOworICAgICAgICBhZGRTaW5ndWxhcigiKC4qKShbbHJdKXZlcyQiLCAiXFwxXFwyZiIpOworICAgICAgICBhZGRTaW5ndWxhcigiKC4qKShbXmFlaW91eV18cXUpaWVzJCIsICJcXDFcXDJ5Iik7CisgICAgICAgIGFkZFNpbmd1bGFyKCIoLiopKHMpZXJpZXMkIiwgIlxcMVxcMmVyaWVzIik7CisgICAgICAgIGFkZFNpbmd1bGFyKCIoLiopKG0pb3ZpZXMkIiwgIlxcMVxcMm92aWUiKTsKKyAgICAgICAgYWRkU2luZ3VsYXIoIiguKikoeHxjaHxzc3xzaCllcyQiLCAiXFwxXFwyIik7CisgICAgICAgIGFkZFNpbmd1bGFyKCIoLiopKFttfGxdKWljZSQiLCAiXFwxXFwyb3VzZSIpOworICAgICAgICBhZGRTaW5ndWxhcigiKC4qKShidXMpZXMkIiwgIlxcMVxcMiIpOworICAgICAgICBhZGRTaW5ndWxhcigiKC4qKShvKWVzJCIsICJcXDFcXDIiKTsKKyAgICAgICAgYWRkU2luZ3VsYXIoIiguKikoc2hvZSlzJCIsICJcXDFcXDIiKTsKKyAgICAgICAgYWRkU2luZ3VsYXIoIiguKikoY3Jpc3xheHx0ZXN0KWVzJCIsICJcXDFcXDJpcyIpOworICAgICAgICBhZGRTaW5ndWxhcigiKC4qKShvY3RvcHx2aXIpaSQiLCAiXFwxXFwydXMiKTsKKyAgICAgICAgYWRkU2luZ3VsYXIoIiguKikoYWxpYXN8c3RhdHVzKWVzJCIsICJcXDFcXDIiKTsKKyAgICAgICAgYWRkU2luZ3VsYXIoIl4ob3gpZW4iLCAiXFwxIik7CisgICAgICAgIGFkZFNpbmd1bGFyKCIoLiopKHZlcnR8aW5kKWljZXMkIiwgIlxcMVxcMmV4Iik7CisgICAgICAgIGFkZFNpbmd1bGFyKCIoLiopKG1hdHIpaWNlcyQiLCAiXFwxXFwyaXgiKTsKKyAgICAgICAgYWRkU2luZ3VsYXIoIiguKikocXVpeil6ZXMkIiwgIlxcMVxcMiIpOworCisgICAgICAgIGFkZElycmVndWxhcigiY2hpbGQiLCAiY2hpbGRyZW4iKTsKKyAgICAgICAgYWRkSXJyZWd1bGFyKCJtYW4iLCAibWVuIik7CisgICAgICAgIGFkZElycmVndWxhcigibW92ZSIsICJtb3ZlcyIpOworICAgICAgICBhZGRJcnJlZ3VsYXIoInBlcnNvbiIsICJwZW9wbGUiKTsKKyAgICAgICAgYWRkSXJyZWd1bGFyKCJzZXgiLCAic2V4ZXMiKTsKKworICAgICAgICBhZGRVbmNvdW50YWJsZSgiZXF1aXBtZW50Iik7CisgICAgICAgIGFkZFVuY291bnRhYmxlKCJmaXNoIik7CisgICAgICAgIGFkZFVuY291bnRhYmxlKCJpbmZvcm1hdGlvbiIpOworICAgICAgICBhZGRVbmNvdW50YWJsZSgibW9uZXkiKTsKKyAgICAgICAgYWRkVW5jb3VudGFibGUoInJpY2UiKTsKKyAgICAgICAgYWRkVW5jb3VudGFibGUoInNlcmllcyIpOworICAgICAgICBhZGRVbmNvdW50YWJsZSgic2hlZXAiKTsKKyAgICAgICAgYWRkVW5jb3VudGFibGUoInNwZWNpZXMiKTsKKworICAgIH0KKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTdGF0aWMgVmFyaWFibGVzCisgICAgLyoqCisgICAgICogPHA+VGhlIHNpbmdsZXRvbiBpbnN0YW5jZSByZXR1cm5lZCBieSB0aGUgZGVmYXVsdCA8Y29kZT5nZXRJbnN0YW5jZSgpPC9jb2RlPgorICAgICAqIG1ldGhvZC48L3A+CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgdHJhbnNpZW50IE5vdW5JbmZsZWN0b3IgaW5zdGFuY2UgPSBudWxsOworICAgIC8qKgorICAgICAqIDxwPkxpc3Qgb2YgPGNvZGU+UmVwbGFjZXI8L2NvZGU+cyBmb3IgcGVyZm9ybWluZyByZXBsYWNlbWVudCBvcGVyYXRpb25zCisgICAgICogb24gbWF0Y2hlcyBmb3IgcGx1cmFsIHdvcmRzLjwvcD4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8UmVwbGFjZXI+IHBsdXJhbHMgPSBuZXcgTGlua2VkTGlzdDxSZXBsYWNlcj4oKTsKKyAgICAvKioKKyAgICAgKiA8cD5MaXN0IG9mIDxjb2RlPlJlcGxhY2VyPC9jb2RlPnMgZm9yIHBlcmZvcm1pbmcgcmVwbGFjZW1lbnQgb3BlcmF0aW9ucworICAgICAqIG9uIG1hdGNoZXMgZm9yIGFkZFNpbmd1bGFyIHdvcmRzLjwvcD4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8UmVwbGFjZXI+IHNpbmd1bGFycyA9IG5ldyBBcnJheUxpc3Q8UmVwbGFjZXI+KCk7CisgICAgLyoqCisgICAgICogPHA+TGlzdCBvZiB3b3JkcyB0aGF0IHJlcHJlc2VudCBhZGRVbmNvdW50YWJsZSBjb25jZXB0cyB0aGF0IGNhbm5vdCBiZQorICAgICAqIHBsdXJhbGl6ZWQgb3Igc2luZ3VsYXJpemVkLjwvcD4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8U3RyaW5nPiB1bmNvdW50YWJsZXMgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCk7CisKKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTdGF0aWMgTWV0aG9kcworCisgICAgLyoqCisgICAgICogPHA+UmV0dXJuIGEgZnVsbHkgY29uZmlndXJlZCB7QGxpbmsgTm91bkluZmxlY3Rvcn0gaW5zdGFuY2UgdGhhdCBjYW4gYmUgdXNlZAorICAgICAqIGZvciBwZXJmb3JtaW5nIHRyYW5zZm9ybWF0aW9ucy48L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBOb3VuSW5mbGVjdG9yIGdldEluc3RhbmNlKCkgeworCisgICAgICAgIGlmIChpbnN0YW5jZSA9PSBudWxsKSB7CisgICAgICAgICAgICBpbnN0YW5jZSA9IG5ldyBOb3VuSW5mbGVjdG9yKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGluc3RhbmNlOworCisgICAgfQorCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQdWJsaWMgTWV0aG9kcworCisgICAgLyoqCisgICAgICogPHA+Q29udmVydCBzdHJpbmdzIHRvIDxjb2RlPkVtYmVkZGVkQ2FtZWxDYXNlPC9jb2RlPi4gIEVtYmVkZGVkCisgICAgICogdW5kZXJzY29yZXMgd2lsbCBiZSByZW1vdmVkLjwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3b3JkIFdvcmQgdG8gYmUgY29udmVydGVkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBjYW1lbGl6ZShmaW5hbCBTdHJpbmcgd29yZCkgeworCisgICAgICAgIHJldHVybiBjYW1lbGl6ZSh3b3JkLCBmYWxzZSk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5Db252ZXJ0IHdvcmQgc3RyaW5ncyBjb25zaXN0aW5nIG9mIGxvd2VyIGNhc2UgbGV0dGVycyBhbmQKKyAgICAgKiB1bmRlcnNjb3JlIGNoYXJhY3RlcnMgYmV0d2VlbiB3b3JkcyBpbnRvIDxjb2RlPmVtYmVkZGVkQ2FtZWxDYXNlPC9jb2RlPgorICAgICAqIG9yIDxjb2RlPkVtYmVkZGVkQ2FtZWxDYXNlPC9jb2RlPiwgZGVwZW5kaW5nIG9uIHRoZSA8Y29kZT5sb3dlcjwvY29kZT4KKyAgICAgKiBmbGFnLiAgRW1iZWRkZWQgdW5kZXJzY29yZXMgd2lsbCBiZSByZW1vdmVkLiAgRW1iZWRkZWQgJy8nCisgICAgICogY2hhcmFjdGVycyB3aWxsIGJlIHJlcGxhY2VkIGJ5ICcuJywgbWFraW5nIHRoaXMgbWV0aG9kIHVzZWZ1bAorICAgICAqIGluIGNvbnZlcnRpbmcgcGF0aC1saWtlIG5hbWVzIGludG8gZnVsbHkgcXVhbGlmaWVkIGNsYXNzbmFtZXMuPC9wPgorICAgICAqCisgICAgICogPHA+PHN0cm9uZz5JTVBMRU1FTlRBVElPTiBESUZGRVJFTkNFPC9zdHJvbmc+IC0gVGhlIFJhaWxzIHZlcnNpb24gb2YgdGhpcworICAgICAqIG1ldGhvZCBhbHNvIGNvbnZlcnRzICcvJyBjaGFyYWN0ZXJzIHRvICc6OicgYmVjYXVzZSB0aGF0IHJlZmxlY3RzCisgICAgICogdGhlIG5vcm1hbCBzeW50YXggZm9yIGZ1bGx5IHF1YWxpZmllZCBuYW1lcyBpbiBSdWJ5LjwvcD4KKyAgICAgKgorICAgICAqIDx0YWJsZSBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIj4KKyAgICAgKiAgIDx0cj4KKyAgICAgKiAgICAgPHRoPklucHV0PC90aD4KKyAgICAgKiAgICAgPHRoPk91dHB1dDwvdGg+CisgICAgICogICA8L3RyPgorICAgICAqICAgPHRyPgorICAgICAqICAgICA8dGQ+ImZvb19iYXIiLCBmYWxzZTwvdGQ+CisgICAgICogICAgIDx0ZD4iRm9vQmFyIjwvdGQ+CisgICAgICogICA8L3RyPgorICAgICAqICAgPHRyPgorICAgICAqICAgICA8dGQ+ImZvb19iYXIiLCB0cnVlPC90ZD4KKyAgICAgKiAgICAgPHRkPiJmb29CYXIiPC90ZD4KKyAgICAgKiAgIDwvdHI+CisgICAgICogICA8dHI+CisgICAgICogICAgIDx0ZD4iZm9vX2Jhci9iYXoiLCBmYWxzZTwvdGQ+CisgICAgICogICAgIDx0ZD4iRm9vQmFyLkJheiI8L3RkPgorICAgICAqICAgPC90cj4KKyAgICAgKiAgIDx0cj4KKyAgICAgKiAgICAgPHRkPiJmb29fYmFyL2JheiIsIHRydWU8L3RkPgorICAgICAqICAgICA8dGQ+ImZvb0Jhci5CYXoiPC90ZD4KKyAgICAgKiAgIDwvdHI+CisgICAgICogPC90YWJsZT4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3b3JkIFdvcmQgdG8gYmUgY29udmVydGVkCisgICAgICogQHBhcmFtIGZsYWcgRmxhZyBpbmRpY2F0aW5nIHRoYXQgdGhlIGluaXRpYWwgY2hhcmFjdGVyIHNob3VsZAorICAgICAqICBiZSBsb3dlciBjYXNlZCBpbnN0ZWFkIG9mIHVwcGVyIGNhc2VkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBjYW1lbGl6ZShmaW5hbCBTdHJpbmcgd29yZCwgZmluYWwgYm9vbGVhbiBmbGFnKSB7CisgICAgICAgIGlmICh3b3JkLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiB3b3JkOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKHdvcmQubGVuZ3RoKCkpOworICAgICAgICBpZiAoZmxhZykgeworICAgICAgICAgICAgc2IuYXBwZW5kKENoYXJhY3Rlci50b0xvd2VyQ2FzZSh3b3JkLmNoYXJBdCgwKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2IuYXBwZW5kKENoYXJhY3Rlci50b1VwcGVyQ2FzZSh3b3JkLmNoYXJBdCgwKSkpOworICAgICAgICB9CisgICAgICAgIGJvb2xlYW4gY2FwaXRhbGl6ZSA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IHdvcmQubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgZmluYWwgY2hhciBjaCA9IHdvcmQuY2hhckF0KGkpOworICAgICAgICAgICAgaWYgKGNhcGl0YWxpemUpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNoKSk7CisgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZSA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnXycpIHsKKyAgICAgICAgICAgICAgICBjYXBpdGFsaXplID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJy8nKSB7CisgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZSA9IHRydWU7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCcuJyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChjaCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5DcmVhdGUgYW5kIHJldHVybiBhIHNpbXBsZSBjbGFzcyBuYW1lIHRoYXQgY29ycmVzcG9uZHMgdG8gYQorICAgICAqIGFkZFBsdXJhbCB0YWJsZSBuYW1lLiAgQW55IGxlYWRpbmcgc2NoZW1hIG5hbWUgd2lsbCBiZSB0cmltbWVkLjwvcD4KKyAgICAgKgorICAgICAqIDx0YWJsZSBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIj4KKyAgICAgKiAgIDx0cj4KKyAgICAgKiAgICAgPHRoPklucHV0PC90aD4KKyAgICAgKiAgICAgPHRoPk91dHB1dDwvdGg+CisgICAgICogICA8L3RyPgorICAgICAqICAgPHRyPgorICAgICAqICAgICA8dGQ+ImZvb19iYXJzIjwvdGQ+CisgICAgICogICAgIDx0ZD4iRm9vQmFyIjwvdGQ+CisgICAgICogICA8L3RyPgorICAgICAqICAgPHRyPgorICAgICAqICAgICA8dGQ+ImJheiI8L3RkPgorICAgICAqICAgICA8dGQ+IkJheiI8L3RkPgorICAgICAqICAgPC90cj4KKyAgICAgKiA8L3RhYmxlPgorICAgICAqCisgICAgICogQHBhcmFtIHRhYmxlTmFtZSBUYWJsZSBuYW1lIHRvIGJlIGNvbnZlcnRlZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgY2xhc3NpZnkoU3RyaW5nIHRhYmxlTmFtZSkgeworCisgICAgICAgIGZpbmFsIGludCBwZXJpb2QgPSB0YWJsZU5hbWUubGFzdEluZGV4T2YoJy4nKTsKKyAgICAgICAgaWYgKHBlcmlvZCA+PSAwKSB7CisgICAgICAgICAgICB0YWJsZU5hbWUgPSB0YWJsZU5hbWUuc3Vic3RyaW5nKHBlcmlvZCArIDEpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjYW1lbGl6ZShzaW5ndWxhcml6ZSh0YWJsZU5hbWUpKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIDxwPlJlcGxhY2UgdW5kZXJzY29yZXMgaW4gdGhlIHNwZWNpZmllZCB3b3JkIHdpdGggZGFzaGVzLjwvcD4KKyAgICAgKgorICAgICAqIDx0YWJsZSBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIj4KKyAgICAgKiAgIDx0cj4KKyAgICAgKiAgICAgPHRoPklucHV0PC90aD4KKyAgICAgKiAgICAgPHRoPk91dHB1dDwvdGg+CisgICAgICogICA8L3RyPgorICAgICAqICAgPHRyPgorICAgICAqICAgICA8dGQ+ImZvb19iYXIiPC90ZD4KKyAgICAgKiAgICAgPHRkPiJmb28tYmFyIjwvdGQ+CisgICAgICogICA8L3RyPgorICAgICAqICAgPHRyPgorICAgICAqICAgICA8dGQ+ImJheiI8L3RkPgorICAgICAqICAgICA8dGQ+ImJheiI8L3RkPgorICAgICAqICAgPC90cj4KKyAgICAgKiA8L3RhYmxlPgorICAgICAqCisgICAgICogQHBhcmFtIHdvcmQgV29yZCB0byBiZSBjb252ZXJ0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGRhc2hlcml6ZShmaW5hbCBTdHJpbmcgd29yZCkgeworCisgICAgICAgIHJldHVybiB3b3JkLnJlcGxhY2UoJ18nLCAnLScpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+UmVtb3ZlIGFueSBwYWNrYWdlIG5hbWUgZnJvbSBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lLAorICAgICAqIHJldHVybmluZyBvbmx5IHRoZSBzaW1wbGUgY2xhc3NuYW1lLjwvcD4KKyAgICAgKgorICAgICAqIDx0YWJsZSBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIj4KKyAgICAgKiAgIDx0cj4KKyAgICAgKiAgICAgPHRoPklucHV0PC90aD4KKyAgICAgKiAgICAgPHRoPk91dHB1dDwvdGg+CisgICAgICogICA8L3RyPgorICAgICAqICAgPHRyPgorICAgICAqICAgICA8dGQ+ImphdmEudXRpbC5NYXAiPC90ZD4KKyAgICAgKiAgICAgPHRkPiJNYXAiPC90ZD4KKyAgICAgKiAgIDwvdHI+CisgICAgICogICA8dHI+CisgICAgICogICAgIDx0ZD4iU3RyaW5nIjwvdGQ+CisgICAgICogICAgIDx0ZD4iU3RyaW5nIjwvdGQ+CisgICAgICogICA8L3RyPgorICAgICAqIDwvdGFibGU+CisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIEZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIHRvIGJlIGNvbnZlcnRlZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZGVtb2R1bGl6ZShmaW5hbCBTdHJpbmcgY2xhc3NOYW1lKSB7CisKKyAgICAgICAgZmluYWwgaW50IHBlcmlvZCA9IGNsYXNzTmFtZS5sYXN0SW5kZXhPZignLicpOworICAgICAgICBpZiAocGVyaW9kID49IDApIHsKKyAgICAgICAgICAgIHJldHVybiBjbGFzc05hbWUuc3Vic3RyaW5nKHBlcmlvZCArIDEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+Q3JlYXRlIGFuZCByZXR1cm4gYSBmb3JlaWduIGtleSBuYW1lIGZyb20gYSBjbGFzcyBuYW1lLAorICAgICAqIHNlcGFyYXRpbmcgdGhlICJpZCIgc3VmZml4IHdpdGggYW4gdW5kZXJzY29yZS48L3A+CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBmb3JlaWduS2V5KGZpbmFsIFN0cmluZyBjbGFzc05hbWUpIHsKKworICAgICAgICByZXR1cm4gZm9yZWlnbktleShjbGFzc05hbWUsIHRydWUpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+Q3JlYXRlIGFuZCByZXR1cm4gYSBmb3JlaWduIGtleSBuYW1lIGZyb20gYSBjbGFzcyBuYW1lLAorICAgICAqIG9wdGlvbmFsbHkgaW5zZXJ0aW5nIGFuIHVuZGVyc2NvcmUgYmVmb3JlIHRoZSAiaWQiIHBvcnRpb24uPC9wPgorICAgICAqCisgICAgICogPHRhYmxlIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiPgorICAgICAqICAgPHRyPgorICAgICAqICAgICA8dGg+SW5wdXQ8L3RoPgorICAgICAqICAgICA8dGg+T3V0cHV0PC90aD4KKyAgICAgKiAgIDwvdHI+CisgICAgICogICA8dHI+CisgICAgICogICAgIDx0ZD4iY29tLm15bW9kZWwuT3JkZXIiLCBmYWxzZTwvdGQ+CisgICAgICogICAgIDx0ZD4ib3JkZXJpZCI8L3RkPgorICAgICAqICAgPC90cj4KKyAgICAgKiAgIDx0cj4KKyAgICAgKiAgICAgPHRkPiJjb20ubXltb2RlbC5PcmRlciIsIHRydWU8L3RkPgorICAgICAqICAgICA8dGQ+Im9yZGVyX2lkIjwvdGQ+CisgICAgICogICA8L3RyPgorICAgICAqICAgPHRyPgorICAgICAqICAgICA8dGQ+Ik1lc3NhZ2UiLCBmYWxzZTwvdGQ+CisgICAgICogICAgIDx0ZD4ibWVzc2FnZWlkIjwvdGQ+CisgICAgICogICA8L3RyPgorICAgICAqICAgPHRyPgorICAgICAqICAgICA8dGQ+Ik1lc3NhZ2UiLCB0cnVlPC90ZD4KKyAgICAgKiAgICAgPHRkPiJtZXNzYWdlX2lkIjwvdGQ+CisgICAgICogICA8L3RyPgorICAgICAqIDwvdGFibGU+CisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIENsYXNzIG5hbWUgZm9yIHdoaWNoIHRvIGNyZWF0ZSBhIGZvcmVpZ24ga2V5CisgICAgICogQHBhcmFtIHVuZGVyc2NvcmUgRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgYW4gdW5kZXJzY29yZSBzaG91bGQKKyAgICAgKiAgYmUgZW1pdHRlZCBiZXR3ZWVuIHRoZSBjbGFzcyBuYW1lIGFuZCB0aGUgImlkIiBzdWZmaXgKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGZvcmVpZ25LZXkoZmluYWwgU3RyaW5nIGNsYXNzTmFtZSwgZmluYWwgYm9vbGVhbiB1bmRlcnNjb3JlKSB7CisKKyAgICAgICAgcmV0dXJuIHVuZGVyc2NvcmUoZGVtb2R1bGl6ZShjbGFzc05hbWUpICsgKHVuZGVyc2NvcmUgPyAiX2lkIiA6ICJpZCIpKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIDxwPkNhcGl0YWxpemUgdGhlIGZpcnN0IHdvcmQgaW4gYSBsb3dlciBjYXNlZCBhbmQgdW5kZXJzY29yZWQgc3RyaW5nLAorICAgICAqIHR1cm4gdW5kZXJzY29yZXMgaW50byBzcGFjZXMsIGFuZCBzdHJpbmcgYW55IHRyYWlsaW5nICJfaWQiLiAgTGlrZQorICAgICAqIDxjb2RlPnRpdGxlaXplKCk8L2NvZGU+LCB0aGlzIGlzIG1lYW50IGZvciBjcmVhdGluZyBwcmV0dHkgb3V0cHV0LAorICAgICAqIGFuZCBpcyBub3QgaW50ZW5kZWQgZm9yIGNvZGUgZ2VuZXJhdGlvbi48L3A+CisgICAgICoKKyAgICAgKiA8dGFibGUgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSI+CisgICAgICogICA8dHI+CisgICAgICogICAgIDx0aD5JbnB1dDwvdGg+CisgICAgICogICAgIDx0aD5PdXRwdXQ8L3RoPgorICAgICAqICAgPC90cj4KKyAgICAgKiAgIDx0cj4KKyAgICAgKiAgICAgPHRkPiJlbXBsb3llZV9zYWxhcnkiPC90ZD4KKyAgICAgKiAgICAgPHRkPiJFbXBsb3llZSBzYWxhcnkiPC90ZD4KKyAgICAgKiAgIDwvdHI+CisgICAgICogICA8dHI+CisgICAgICogICAgIDx0ZD4iYXV0aG9yX2lkIjwvdGQ+CisgICAgICogICAgIDx0ZD4iQXV0aG9yIjwvdGQ+CisgICAgICogICA8L3RyPgorICAgICAqIDwvdGFibGU+CisgICAgICoKKyAgICAgKiBAcGFyYW0gd29yZHMgV29yZCBzdHJpbmcgdG8gYmUgY29udmVydGVkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBodW1hbml6ZShTdHJpbmcgd29yZHMpIHsKKworICAgICAgICBpZiAod29yZHMuZW5kc1dpdGgoIl9pZCIpKSB7CisgICAgICAgICAgICB3b3JkcyA9IHdvcmRzLnN1YnN0cmluZygwLCB3b3Jkcy5sZW5ndGgoKSAtIDMpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcih3b3Jkcy5sZW5ndGgoKSk7CisgICAgICAgIHNiLmFwcGVuZChDaGFyYWN0ZXIudG9VcHBlckNhc2Uod29yZHMuY2hhckF0KDApKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgd29yZHMubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgZmluYWwgY2hhciBjaCA9IHdvcmRzLmNoYXJBdChpKTsKKyAgICAgICAgICAgIGlmIChjaCA9PSAnXycpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJyAnKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGNoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIDxwPlR1cm4gYSBudW1iZXIgaW50byBhIGNvcnJlc3BvbmRpbmcgb3JkaW5hbCBzdHJpbmcgdXNlZCB0bworICAgICAqIGRlbm90ZSB0aGUgcG9zaXRpb24gaW4gYW4gb3JkZXJlZCBzZXF1ZW5jZS48L3A+CisgICAgICoKKyAgICAgKiA8dGFibGUgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSI+CisgICAgICogICA8dHI+CisgICAgICogICAgIDx0aD5JbnB1dDwvdGg+CisgICAgICogICAgIDx0aD5PdXRwdXQ8L3RoPgorICAgICAqICAgPC90cj4KKyAgICAgKiAgIDx0cj4KKyAgICAgKiAgICAgPHRkPjE8L3RkPgorICAgICAqICAgICA8dGQ+IjFzdCI8L3RkPgorICAgICAqICAgPC90cj4KKyAgICAgKiAgIDx0cj4KKyAgICAgKiAgICAgPHRkPjI8L3RkPgorICAgICAqICAgICA8dGQ+IjJuZCI8L3RkPgorICAgICAqICAgPC90cj4KKyAgICAgKiAgIDx0cj4KKyAgICAgKiAgICAgPHRkPjM8L3RkPgorICAgICAqICAgICA8dGQ+IjNyZCI8L3RkPgorICAgICAqICAgPC90cj4KKyAgICAgKiAgIDx0cj4KKyAgICAgKiAgICAgPHRkPjQ8L3RkPgorICAgICAqICAgICA8dGQ+InJ0aCI8L3RkPgorICAgICAqICAgPC90cj4KKyAgICAgKiAgIDx0cj4KKyAgICAgKiAgICAgPHRkPjEwMDI8L3RkPgorICAgICAqICAgICA8dGQ+IjEwMDJuZCI8L3RkPgorICAgICAqICAgPC90cj4KKyAgICAgKiAgIDx0cj4KKyAgICAgKiAgICAgPHRkPjIwMTI8L3RkPgorICAgICAqICAgICA8dGQ+IjIwMTJ0aCI8L3RkPgorICAgICAqICAgPC90cj4KKyAgICAgKiA8L3RhYmxlPgorICAgICAqCisgICAgICogQHBhcmFtIG51bWJlciBOdW1iZXIgdG8gYmUgY29udmVydGVkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBvcmRpbmFsaXplKGZpbmFsIGludCBudW1iZXIpIHsKKworICAgICAgICBmaW5hbCBpbnQgbW9kdWxvID0gbnVtYmVyICUgMTAwOworICAgICAgICBpZiAoKG1vZHVsbyA+PSAxMSkgJiYgKG1vZHVsbyA8PSAxMykpIHsKKyAgICAgICAgICAgIHJldHVybiAiIiArIG51bWJlciArICJ0aCI7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChudW1iZXIgJSAxMCkgeworICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgIHJldHVybiAiIiArIG51bWJlciArICJzdCI7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgcmV0dXJuICIiICsgbnVtYmVyICsgIm5kIjsKKyAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICByZXR1cm4gIiIgKyBudW1iZXIgKyAicmQiOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIiIgKyBudW1iZXIgKyAidGgiOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5SZXR1cm4gYSBhZGRQbHVyYWwgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWVkIChhZGRTaW5ndWxhcikgd29yZC48L3A+CisgICAgICoKKyAgICAgKgorICAgICAqIEBwYXJhbSB3b3JkIFNpbmd1bGFyIHdvcmQgdG8gYmUgY29udmVydGVkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBwbHVyYWxpemUoZmluYWwgU3RyaW5nIHdvcmQpIHsKKworICAgICAgICAvLyBTY2FuIHVuY291bnRhYmxlcyBhbmQgbGVhdmUgYWxvbmUKKyAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgdW5jb3VudGFibGUgOiB1bmNvdW50YWJsZXMpIHsKKyAgICAgICAgICAgIGlmICh1bmNvdW50YWJsZS5lcXVhbHMod29yZCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gd29yZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFNjYW4gb3VyIHBhdHRlcm5zIGZvciBhIG1hdGNoIGFuZCByZXR1cm4gdGhlIGNvcnJlY3QgcmVwbGFjZW1lbnQKKyAgICAgICAgZm9yIChmaW5hbCBSZXBsYWNlciBwbHVyYWwgOiBwbHVyYWxzKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVwbGFjZW1lbnQgPSBwbHVyYWwucmVwbGFjZW1lbnQod29yZCk7CisgICAgICAgICAgICBpZiAocmVwbGFjZW1lbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXBsYWNlbWVudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFJldHVybiB0aGUgb3JpZ2luYWwgc3RyaW5nIHVuY2hhbmdlZAorICAgICAgICByZXR1cm4gd29yZDsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIDxwPlJldHVybiBhIGFkZFNpbmd1bGFyIHZlcnNpb24gb2YgdGhlIHNwZWNpZmllZCAoYWRkUGx1cmFsKSB3b3JkLjwvcD4KKyAgICAgKgorICAgICAqCisgICAgICogQHBhcmFtIHdvcmQgUGx1cmFsIHdvcmQgdG8gYmUgY29udmVydGVkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBzaW5ndWxhcml6ZShmaW5hbCBTdHJpbmcgd29yZCkgeworCisgICAgICAgIC8vIFNjYW4gdW5jb3VudGFibGVzIGFuZCBsZWF2ZSBhbG9uZQorICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyB1bmNvdW50YWJsZSA6IHVuY291bnRhYmxlcykgeworICAgICAgICAgICAgaWYgKHVuY291bnRhYmxlLmVxdWFscyh3b3JkKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB3b3JkOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gU2NhbiBvdXIgcGF0dGVybnMgZm9yIGEgbWF0Y2ggYW5kIHJldHVybiB0aGUgY29ycmVjdCByZXBsYWNlbWVudAorICAgICAgICBmb3IgKGZpbmFsIFJlcGxhY2VyIHNpbmd1bGFyIDogc2luZ3VsYXJzKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVwbGFjZW1lbnQgPSBzaW5ndWxhci5yZXBsYWNlbWVudCh3b3JkKTsKKyAgICAgICAgICAgIGlmIChyZXBsYWNlbWVudCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VtZW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmV0dXJuIHRoZSBvcmlnaW5hbCBzdHJpbmcgdW5jaGFuZ2VkCisgICAgICAgIHJldHVybiB3b3JkOworCisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+Q29udmVydCB0aGUgc2ltcGxlIG5hbWUgb2YgYSBtb2RlbCBjbGFzcyBpbnRvIHRoZSBjb3JyZXNwb25kaW5nCisgICAgICogbmFtZSBvZiBhIGRhdGFiYXNlIHRhYmxlLCBieSB1bmNhbWVsaXppbmcsIGluc2VydGluZyB1bmRlcnNjb3JlcywKKyAgICAgKiBhbmQgcGx1cmFsaXppbmcgdGhlIGxhc3Qgd29yZC48L3A+CisgICAgICoKKyAgICAgKiA8dGFibGUgYm9yZGVyPSIxIiB3aWR0aD0iMTAwJSI+CisgICAgICogICA8dHI+CisgICAgICogICAgIDx0aD5JbnB1dDwvdGg+CisgICAgICogICAgIDx0aD5PdXRwdXQ8L3RoPgorICAgICAqICAgPC90cj4KKyAgICAgKiAgIDx0cj4KKyAgICAgKiAgICAgPHRkPiJSYXdTY2FsZWRTY29yZXIiPC90ZD4KKyAgICAgKiAgICAgPHRkPiJyYXdfc2NhbGVkX3Njb3JlcnMiPC90ZD4KKyAgICAgKiAgIDwvdHI+CisgICAgICogICA8dHI+CisgICAgICogICAgIDx0ZD4iZmFuY3lDYXRlZ29yeSI8L3RkPgorICAgICAqICAgICA8dGQ+ImZhbmN5X2NhdGVnb3JpZXMiPC90ZD4KKyAgICAgKiAgIDwvdHI+CisgICAgICogPC90YWJsZT4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGFzc05hbWUgQ2xhc3MgbmFtZSB0byBiZSBjb252ZXJ0ZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHRhYmxlaXplKGZpbmFsIFN0cmluZyBjbGFzc05hbWUpIHsKKworICAgICAgICByZXR1cm4gcGx1cmFsaXplKHVuZGVyc2NvcmUoY2xhc3NOYW1lKSk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5DYXBpdGFsaXplIGFsbCB0aGUgd29yZHMsIGFuZCByZXBsYWNlIHNvbWUgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nCisgICAgICogdG8gY3JlYXRlIGEgbmljZXIgbG9va2luZyB0aXRsZS4gIFRoaXMgaXMgbWVhbnQgZm9yIGNyZWF0aW5nIHByZXR0eQorICAgICAqIG91dHB1dCwgYW5kIGlzIG5vdCBpbnRlbmRlZCBmb3IgY29kZSBnZW5lcmF0aW9uLjwvcD4KKyAgICAgKgorICAgICAqIDx0YWJsZSBib3JkZXI9IjEiIHdpZHRoPSIxMDAlIj4KKyAgICAgKiAgIDx0cj4KKyAgICAgKiAgICAgPHRoPklucHV0PC90aD4KKyAgICAgKiAgICAgPHRoPk91dHB1dDwvdGg+CisgICAgICogICA8L3RyPgorICAgICAqICAgPHRyPgorICAgICAqICAgICA8dGQ+InRoZSBob25leW1vb25lcnMiPC90ZD4KKyAgICAgKiAgICAgPHRkPiJUaGUgSG9uZXltb29uZXJzIjwvdGQ+CisgICAgICogICA8L3RyPgorICAgICAqICAgPHRyPgorICAgICAqICAgICA8dGQ+IngtbWVuOiB0aGUgbGFzdCBzdGFuZCI8L3RkPgorICAgICAqICAgICA8dGQ+IlggTWVuOiBUaGUgTGFzdCBTdGFuZCI8L3RkPgorICAgICAqICAgPC90cj4KKyAgICAgKiA8L3RhYmxlPgorICAgICAqCisgICAgICogQHBhcmFtIHdvcmRzIFdvcmQgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZAorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgdGl0bGVpemUoZmluYWwgU3RyaW5nIHdvcmRzKSB7CisKKyAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKHdvcmRzLmxlbmd0aCgpKTsKKyAgICAgICAgYm9vbGVhbiBjYXBpdGFsaXplID0gdHJ1ZTsgLy8gVG8gZ2V0IHRoZSBmaXJzdCBjaGFyYWN0ZXIgcmlnaHQKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBjaGFyIGNoID0gd29yZHMuY2hhckF0KGkpOworICAgICAgICAgICAgaWYgKENoYXJhY3Rlci5pc1doaXRlc3BhY2UoY2gpKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCcgJyk7CisgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZSA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICctJykgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnICcpOworICAgICAgICAgICAgICAgIGNhcGl0YWxpemUgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmIChjYXBpdGFsaXplKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKENoYXJhY3Rlci50b1VwcGVyQ2FzZShjaCkpOworICAgICAgICAgICAgICAgIGNhcGl0YWxpemUgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGNoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZGVjYXBpdGFsaXplKGZpbmFsIFN0cmluZyB3b3JkKSB7CisgICAgICAgIC8vIGRvIG5vdGhpbmcgaWYgbnVsbCBvciBlbXB0eQorICAgICAgICBpZiAoKHdvcmQgPT0gbnVsbCkgfHwgKHdvcmQubGVuZ3RoKCkgPCAxKSkgeworICAgICAgICAgICAgcmV0dXJuIHdvcmQ7CisgICAgICAgIH0KKyAgICAgICAgLy8gb3IgaWYgYWxyZWFkeSBkZWNhcGl0YWxpemVkCisgICAgICAgIGZpbmFsIGNoYXIgZmlyc3QgPSB3b3JkLmNoYXJBdCgwKTsKKyAgICAgICAgaWYgKENoYXJhY3Rlci5pc0xvd2VyQ2FzZShmaXJzdCkpIHsKKyAgICAgICAgICAgIHJldHVybiB3b3JkOworICAgICAgICB9CisgICAgICAgIC8vIG90aGVyd2lzZSB0dXJuIHRoZSBmaXJzdCBjaGFyYWN0ZXIgdG8gbG93ZXIgY2FzZSBhbmQgYXR0YWNoIHRoZSByZXN0CisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcih3b3JkLmxlbmd0aCgpKTsKKyAgICAgICAgc2IuYXBwZW5kKENoYXJhY3Rlci50b0xvd2VyQ2FzZShmaXJzdCkpOworICAgICAgICBzYi5hcHBlbmQod29yZC5zdWJzdHJpbmcoMSkpOworICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5UaGUgcmV2ZXJzZSBvZiA8Y29kZT5jYW1lbGl6ZSgpPC9jb2RlPiwgbWFrZXMgYW4gdW5kZXJzY29yZWQgZm9ybQorICAgICAqIGZyb20gdGhlIGV4cHJlc3Npb24gaW4gdGhlIHN0cmluZy4gIENoYW5nZXMgIi4iIHRvICIvIiB0byBjb252ZXJ0CisgICAgICogZnVsbHkgcXVhbGlmaWVkIGNsYXNzIG5hbWVzIGludG8gcGF0aHMuPC9wPgorICAgICAqCisgICAgICogPHRhYmxlIGJvcmRlcj0iMSIgd2lkdGg9IjEwMCUiPgorICAgICAqICAgPHRyPgorICAgICAqICAgICA8dGg+SW5wdXQ8L3RoPgorICAgICAqICAgICA8dGg+T3V0cHV0PC90aD4KKyAgICAgKiAgIDwvdHI+CisgICAgICogICA8dHI+CisgICAgICogICAgIDx0ZD4iRm9vQmFyIjwvdGQ+CisgICAgICogICAgIDx0ZD4iZm9vX2JhciI8L3RkPgorICAgICAqICAgPC90cj4KKyAgICAgKiAgIDx0cj4KKyAgICAgKiAgICAgPHRkPiJmb29CYXIiPC90ZD4KKyAgICAgKiAgICAgPHRkPiJmb29fYmFyIjwvdGQ+CisgICAgICogICA8L3RyPgorICAgICAqICAgPHRyPgorICAgICAqICAgICA8dGQ+IkZvb0Jhci5CYXoiPC90ZD4KKyAgICAgKiAgICAgPHRkPiJmb29fYmFyL2JheiI8L3RkPgorICAgICAqICAgPC90cj4KKyAgICAgKiAgIDx0cj4KKyAgICAgKiAgICAgPHRkPiJGb29CYXIuQmF6IjwvdGQ+CisgICAgICogICAgIDx0ZD4iZm9vX2Jhci9iYXoiPC90ZD4KKyAgICAgKiAgIDwvdHI+CisgICAgICogPC90YWJsZT4KKyAgICAgKgorICAgICAqIEBwYXJhbSB3b3JkIENhbWVsIGNhc2VkIHdvcmQgdG8gYmUgY29udmVydGVkCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB1bmRlcnNjb3JlKGZpbmFsIFN0cmluZyB3b3JkKSB7CisKKyAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKHdvcmQubGVuZ3RoKCkgKyA1KTsKKyAgICAgICAgYm9vbGVhbiB1bmNhcGl0YWxpemUgPSBmYWxzZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3b3JkLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIGNoYXIgY2ggPSB3b3JkLmNoYXJBdChpKTsKKyAgICAgICAgICAgIGlmICh1bmNhcGl0YWxpemUpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGNoKSk7CisgICAgICAgICAgICAgICAgdW5jYXBpdGFsaXplID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICcuJykgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgnLycpOworICAgICAgICAgICAgICAgIHVuY2FwaXRhbGl6ZSA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKENoYXJhY3Rlci5pc1VwcGVyQ2FzZShjaCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCdfJyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNiLmFwcGVuZChDaGFyYWN0ZXIudG9Mb3dlckNhc2UoY2gpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGNoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDdXN0b21pemF0aW9uIE1ldGhvZHMKKworICAgIC8qKgorICAgICAqIDxwPkFkZCB0aGUgYWRkU2luZ3VsYXIgYW5kIGFkZFBsdXJhbCBmb3JtcyBvZiB3b3JkcyB0aGF0IGNhbm5vdCBiZQorICAgICAqIGNvbnZlcnRlZCB1c2luZyB0aGUgbm9ybWFsIHJ1bGVzLjwvcD4KKyAgICAgKgorICAgICAqCisgICAgICogQHBhcmFtIHNpbmd1bGFyIFNpbmd1bGFyIGZvcm0gb2YgdGhlIHdvcmQKKyAgICAgKiBAcGFyYW0gcGx1cmFsIFBsdXJhbCBmb3JtIG9mIHRoZSB3b3JkCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkSXJyZWd1bGFyKGZpbmFsIFN0cmluZyBzaW5ndWxhciwgZmluYWwgU3RyaW5nIHBsdXJhbCkgeworCisgICAgICAgIGFkZFBsdXJhbCgiKC4qKSgiICsgc2luZ3VsYXIuc3Vic3RyaW5nKDAsIDEpICsgIikiICsgc2luZ3VsYXIuc3Vic3RyaW5nKDEpICsgIiQiLAorICAgICAgICAgICAgICAgICJcXDFcXDIiICsgcGx1cmFsLnN1YnN0cmluZygxKSk7CisgICAgICAgIGFkZFNpbmd1bGFyKCIoLiopKCIgKyBwbHVyYWwuc3Vic3RyaW5nKDAsIDEpICsgIikiICsgcGx1cmFsLnN1YnN0cmluZygxKSArICIkIiwKKyAgICAgICAgICAgICAgICAiXFwxXFwyIiArIHNpbmd1bGFyLnN1YnN0cmluZygxKSk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5BZGQgYSBtYXRjaCBwYXR0ZXJuIGFuZCByZXBsYWNlbWVudCBydWxlIGZvciBjb252ZXJ0aW5nIGFkZFBsdXJhbAorICAgICAqIGZvcm1zIHRvIGFkZFNpbmd1bGFyIGZvcm1zLiAgQnkgZGVmYXVsdCwgbWF0Y2hlcyB3aWxsIGJlIGNhc2UKKyAgICAgKiBpbnNlbnNpdGl2ZS48L3A+CisgICAgICoKKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXRjaCBNYXRjaCBwYXR0ZXJuIHJlZ3VsYXIgZXhwcmVzc2lvbgorICAgICAqIEBwYXJhbSBydWxlIFJlcGxhY2VtZW50IHJ1bGUKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRQbHVyYWwoZmluYWwgU3RyaW5nIG1hdGNoLCBmaW5hbCBTdHJpbmcgcnVsZSkgeworCisgICAgICAgIGFkZFBsdXJhbChtYXRjaCwgcnVsZSwgdHJ1ZSk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5BZGQgYSBtYXRjaCBwYXR0ZXJuIGFuZCByZXBsYWNlbWVudCBydWxlIGZvciBjb252ZXJ0aW5nIGFkZFBsdXJhbAorICAgICAqIGZvcm1zIHRvIGFkZFNpbmd1bGFyIGZvcm1zLjwvcD4KKyAgICAgKgorICAgICAqCisgICAgICogQHBhcmFtIG1hdGNoIE1hdGNoIHBhdHRlcm4gcmVndWxhciBleHByZXNzaW9uCisgICAgICogQHBhcmFtIHJ1bGUgUmVwbGFjZW1lbnQgcnVsZQorICAgICAqIEBwYXJhbSBpbnNlbnNpdGl2ZSBGbGFnIGluZGljYXRpbmcgdGhpcyBtYXRjaCBzaG91bGQgYmUgY2FzZSBpbnNlbnNpdGl2ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFBsdXJhbChmaW5hbCBTdHJpbmcgbWF0Y2gsIGZpbmFsIFN0cmluZyBydWxlLCBmaW5hbCBib29sZWFuIGluc2Vuc2l0aXZlKSB7CisKKyAgICAgICAgcGx1cmFscy5hZGQoMCwgbmV3IFJlcGxhY2VyKG1hdGNoLCBydWxlLCBpbnNlbnNpdGl2ZSkpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogPHA+QWRkIGEgbWF0Y2ggcGF0dGVybiBhbmQgcmVwbGFjZW1lbnQgcnVsZSBmb3IgY29udmVydGluZyBhZGRTaW5ndWxhcgorICAgICAqIGZvcm1zIHRvIGFkZFBsdXJhbCBmb3Jtcy4gIEJ5IGRlZmF1bHQsIG1hdGNoZXMgd2lsbCBiZSBjYXNlIGluc2Vuc2l0aXZlLjwvcD4KKyAgICAgKgorICAgICAqCisgICAgICogQHBhcmFtIG1hdGNoIE1hdGNoIHBhdHRlcm4gcmVndWxhciBleHByZXNzaW9uCisgICAgICogQHBhcmFtIHJ1bGUgUmVwbGFjZW1lbnQgcnVsZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFNpbmd1bGFyKGZpbmFsIFN0cmluZyBtYXRjaCwgZmluYWwgU3RyaW5nIHJ1bGUpIHsKKworICAgICAgICBhZGRTaW5ndWxhcihtYXRjaCwgcnVsZSwgdHJ1ZSk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiA8cD5BZGQgYSBtYXRjaCBwYXR0ZXJuIGFuZCByZXBsYWNlbWVudCBydWxlIGZvciBjb252ZXJ0aW5nIGFkZFNpbmd1bGFyCisgICAgICogZm9ybXMgdG8gYWRkUGx1cmFsIGZvcm1zLjwvcD4KKyAgICAgKgorICAgICAqCisgICAgICogQHBhcmFtIG1hdGNoIE1hdGNoIHBhdHRlcm4gcmVndWxhciBleHByZXNzaW9uCisgICAgICogQHBhcmFtIHJ1bGUgUmVwbGFjZW1lbnQgcnVsZQorICAgICAqIEBwYXJhbSBpbnNlbnNpdGl2ZSBGbGFnIGluZGljYXRpbmcgdGhpcyBtYXRjaCBzaG91bGQgYmUgY2FzZSBpbnNlbnNpdGl2ZQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGFkZFNpbmd1bGFyKGZpbmFsIFN0cmluZyBtYXRjaCwgZmluYWwgU3RyaW5nIHJ1bGUsIGZpbmFsIGJvb2xlYW4gaW5zZW5zaXRpdmUpIHsKKworICAgICAgICBzaW5ndWxhcnMuYWRkKDAsIG5ldyBSZXBsYWNlcihtYXRjaCwgcnVsZSwgaW5zZW5zaXRpdmUpKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIDxwPkFkZCBhIHdvcmQgdGhhdCBjYW5ub3QgYmUgY29udmVydGVkIGJldHdlZW4gYWRkU2luZ3VsYXIgYW5kIGFkZFBsdXJhbC48L3A+CisgICAgICoKKyAgICAgKgorICAgICAqIEBwYXJhbSB3b3JkIFdvcmQgdG8gYmUgYWRkZWQKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRVbmNvdW50YWJsZShmaW5hbCBTdHJpbmcgd29yZCkgeworCisgICAgICAgIHVuY291bnRhYmxlcy5hZGQoMCwgd29yZC50b0xvd2VyQ2FzZSgpKTsKKworICAgIH0KKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQcml2YXRlIENsYXNzZXMKKworICAgIC8qKgorICAgICAqIDxwPkludGVybmFsIGNsYXNzIHRoYXQgdXNlcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGVyIHRvIGJvdGgKKyAgICAgKiBtYXRjaCB0aGUgc3BlY2lmaWVkIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBhIHNwZWNpZmllZCB3b3JkLCBhbmQKKyAgICAgKiAoaWYgc3VjY2Vzc2Z1bCkgcGVyZm9ybSB0aGUgYXBwcm9wcmlhdGUgc3Vic3RpdHV0aW9ucy48L3A+CisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVwbGFjZXIgeworCisgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb25zdHJ1Y3RvcgorICAgICAgICBwdWJsaWMgUmVwbGFjZXIoZmluYWwgU3RyaW5nIG1hdGNoLCBmaW5hbCBTdHJpbmcgcnVsZSwgZmluYWwgYm9vbGVhbiBpbnNlbnNpdGl2ZSkgeworCisgICAgICAgICAgICBwYXR0ZXJuID0gUGF0dGVybi5jb21waWxlKG1hdGNoLAorICAgICAgICAgICAgICAgICAgICBpbnNlbnNpdGl2ZSA/IFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSA6IDApOworICAgICAgICAgICAgdGhpcy5ydWxlID0gcnVsZTsKKworICAgICAgICB9CisKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSW5zdGFuY2UgVmFyaWFibGVzCisgICAgICAgIHByaXZhdGUgUGF0dGVybiBwYXR0ZXJuID0gbnVsbDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcnVsZSA9IG51bGw7CisKKyAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFB1YmxpYyBNZXRob2RzCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlcGxhY2UgdGhlIGlucHV0IGlmIGl0IG1hdGNoZXMgdGhlIHBhdHRlcm4uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBpbnB1dCB0aGUgaW5wdXQgc3RyaW5nLgorICAgICAgICAgKiBAcmV0dXJuIHRoZSByZXBsYWNlbWVudCwgaWYgdGhlIGlucHV0IG1hdGNoZXMsIG90aGVyd2lzZSBudWxsLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyByZXBsYWNlbWVudChmaW5hbCBTdHJpbmcgaW5wdXQpIHsKKyAgICAgICAgICAgIGZpbmFsIE1hdGNoZXIgbWF0Y2hlciA9IHBhdHRlcm4ubWF0Y2hlcihpbnB1dCk7CisgICAgICAgICAgICBpZiAobWF0Y2hlci5tYXRjaGVzKCkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICBib29sZWFuIGdyb3VwID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBydWxlLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgY2hhciBjaCA9IHJ1bGUuY2hhckF0KGkpOworICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChtYXRjaGVyLmdyb3VwKENoYXJhY3Rlci5kaWdpdChjaCwgMTApKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBncm91cCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdcXCcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChjaCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF4Yi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pheGIvaW50ZXJuYWwvU2F4UGFyc2VyRmFjdG9yeUluamVjdGlvblByb3ZpZGVyLmphdmEgYi9tZWRpYS9qYXhiL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamF4Yi9pbnRlcm5hbC9TYXhQYXJzZXJGYWN0b3J5SW5qZWN0aW9uUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGJjMWYyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamF4Yi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pheGIvaW50ZXJuYWwvU2F4UGFyc2VyRmFjdG9yeUluamVjdGlvblByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYXhiLmludGVybmFsOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OworCisvKioKKyAqIFRocmVhZC1zY29wZWQgaW5qZWN0aW9uIHByb3ZpZGVyIG9mIHtAbGluayBTQVhQYXJzZXJGYWN0b3J5IFNBWCBwYXJzZXIgZmFjdG9yaWVzfS4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK3B1YmxpYyBjbGFzcyBTYXhQYXJzZXJGYWN0b3J5SW5qZWN0aW9uUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFhtbEZhY3Rvcnk8U0FYUGFyc2VyRmFjdG9yeT4geworCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyBTQVggcGFyc2VyIGZhY3RvcnkgcHJvdmlkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uZmlnIEplcnNleSBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMuCisgICAgICovCisgICAgLy8gVE9ETyBUaGlzIHByb3ZpZGVyIHNob3VsZCBiZSByZWdpc3RlcmVkIGFuZCBjb25maWd1cmVkIHZpYSBhIGZlYXR1cmUuCisgICAgQEluamVjdAorICAgIHB1YmxpYyBTYXhQYXJzZXJGYWN0b3J5SW5qZWN0aW9uUHJvdmlkZXIoZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWcpIHsKKyAgICAgICAgc3VwZXIoY29uZmlnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU0FYUGFyc2VyRmFjdG9yeSBnZXQoKSB7CisgICAgICAgIFNBWFBhcnNlckZhY3RvcnkgZmFjdG9yeSA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKworICAgICAgICBmYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOworCisgICAgICAgIGlmICghaXNYbWxTZWN1cml0eURpc2FibGVkKCkpIHsKKyAgICAgICAgICAgIGZhY3RvcnkgPSBuZXcgU2VjdXJlU2F4UGFyc2VyRmFjdG9yeShmYWN0b3J5KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWN0b3J5OworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2pheGIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYXhiL2ludGVybmFsL1NlY3VyZVNheFBhcnNlckZhY3RvcnkuamF2YSBiL21lZGlhL2pheGIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYXhiL2ludGVybmFsL1NlY3VyZVNheFBhcnNlckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2I5Mzk3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamF4Yi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pheGIvaW50ZXJuYWwvU2VjdXJlU2F4UGFyc2VyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMjc2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvKgorICogUG9ydGlvbnMgY29udHJpYnV0ZWQgYnkgSm9zZXBoIFdhbHRvbiAoQXRsYXNzaWFuKQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamF4Yi5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC54bWwuWE1MQ29uc3RhbnRzOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnZhbGlkYXRpb24uU2NoZW1hOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5TYXhIZWxwZXI7CisKK2ltcG9ydCBvcmcueG1sLnNheC5FbnRpdHlSZXNvbHZlcjsKK2ltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcueG1sLnNheC5TQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb247CitpbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOworaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7CisKKy8qKgorICogU2VjdXJlIFNBWCBwYXJzZXIgZmFjdG9yeSB3cmFwcGVyLgorICoKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBTZWN1cmVTYXhQYXJzZXJGYWN0b3J5IGV4dGVuZHMgU0FYUGFyc2VyRmFjdG9yeSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihTZWN1cmVTYXhQYXJzZXJGYWN0b3J5LmNsYXNzLmdldE5hbWUoKSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRW50aXR5UmVzb2x2ZXIgRU1QVFlfRU5USVRZX1JFU09MVkVSID0gbmV3IEVudGl0eVJlc29sdmVyKCkgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSW5wdXRTb3VyY2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlWzBdKSk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVSTkFMX0dFTkVSQUxfRU5USVRJRVNfRkVBVFVSRSA9ICJodHRwOi8veG1sLm9yZy9zYXgvZmVhdHVyZXMvZXh0ZXJuYWwtZ2VuZXJhbC1lbnRpdGllcyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVEVSTkFMX1BBUkFNRVRFUl9FTlRJVElFU19GRUFUVVJFID0gImh0dHA6Ly94bWwub3JnL3NheC9mZWF0dXJlcy9leHRlcm5hbC1wYXJhbWV0ZXItZW50aXRpZXMiOworCisgICAgcHJpdmF0ZSBmaW5hbCBTQVhQYXJzZXJGYWN0b3J5IHNwZjsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgc2VjdXJlIFNBWCBwYXJzZXIgZmFjdG9yeSB3cmFwcGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHNwZiBTQVggcGFyc2VyIGZhY3RvcnkuCisgICAgICovCisgICAgcHVibGljIFNlY3VyZVNheFBhcnNlckZhY3RvcnkoU0FYUGFyc2VyRmFjdG9yeSBzcGYpIHsKKyAgICAgICAgdGhpcy5zcGYgPSBzcGY7CisKKyAgICAgICAgaWYgKFNheEhlbHBlci5pc1hka1BhcnNlckZhY3Rvcnkoc3BmKSkgeworICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5XQVJOSU5HLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5TQVhfWERLX05PX1NFQ1VSSVRZX0ZFQVRVUkVTKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzcGYuc2V0RmVhdHVyZShFWFRFUk5BTF9HRU5FUkFMX0VOVElUSUVTX0ZFQVRVUkUsIEJvb2xlYW4uRkFMU0UpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmxvZygKKyAgICAgICAgICAgICAgICAgICAgICAgIExldmVsLkNPTkZJRywKKyAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsaXphdGlvbk1lc3NhZ2VzLlNBWF9DQU5OT1RfRElTQUJMRV9HRU5FUkFMX0VOVElUWV9QUk9DRVNTSU5HX0ZFQVRVUkUoc3BmLmdldENsYXNzKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgZXgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNwZi5zZXRGZWF0dXJlKEVYVEVSTkFMX1BBUkFNRVRFUl9FTlRJVElFU19GRUFUVVJFLCBCb29sZWFuLkZBTFNFKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIExPR0dFUi5sb2coCisgICAgICAgICAgICAgICAgICAgICAgICBMZXZlbC5DT05GSUcsCisgICAgICAgICAgICAgICAgICAgICAgICBMb2NhbGl6YXRpb25NZXNzYWdlcy5TQVhfQ0FOTk9UX0RJU0FCTEVfUEFSQU1FVEVSX0VOVElUWV9QUk9DRVNTSU5HX0ZFQVRVUkUoc3BmLmdldENsYXNzKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgZXgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHNwZi5zZXRGZWF0dXJlKFhNTENvbnN0YW50cy5GRUFUVVJFX1NFQ1VSRV9QUk9DRVNTSU5HLCBCb29sZWFuLlRSVUUpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmxvZygKKyAgICAgICAgICAgICAgICAgICAgICAgIExldmVsLkNPTkZJRywKKyAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsaXphdGlvbk1lc3NhZ2VzLlNBWF9DQU5OT1RfRU5BQkxFX1NFQ1VSRV9QUk9DRVNTSU5HX0ZFQVRVUkUoc3BmLmdldENsYXNzKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0TmFtZXNwYWNlQXdhcmUoYm9vbGVhbiBiKSB7CisgICAgICAgIHNwZi5zZXROYW1lc3BhY2VBd2FyZShiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW5nKGJvb2xlYW4gYikgeworICAgICAgICBzcGYuc2V0VmFsaWRhdGluZyhiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc05hbWVzcGFjZUF3YXJlKCkgeworICAgICAgICByZXR1cm4gc3BmLmlzTmFtZXNwYWNlQXdhcmUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkYXRpbmcoKSB7CisgICAgICAgIHJldHVybiBzcGYuaXNWYWxpZGF0aW5nKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNjaGVtYSBnZXRTY2hlbWEoKSB7CisgICAgICAgIHJldHVybiBzcGYuZ2V0U2NoZW1hKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0U2NoZW1hKFNjaGVtYSBzY2hlbWEpIHsKKyAgICAgICAgc3BmLnNldFNjaGVtYShzY2hlbWEpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFhJbmNsdWRlQXdhcmUoYm9vbGVhbiBiKSB7CisgICAgICAgIHNwZi5zZXRYSW5jbHVkZUF3YXJlKGIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzWEluY2x1ZGVBd2FyZSgpIHsKKyAgICAgICAgcmV0dXJuIHNwZi5pc1hJbmNsdWRlQXdhcmUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU0FYUGFyc2VyIG5ld1NBWFBhcnNlcigpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IFdyYXBwaW5nU0FYUGFyc2VyKHNwZi5uZXdTQVhQYXJzZXIoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0RmVhdHVyZShTdHJpbmcgcywgYm9vbGVhbiBiKQorICAgICAgICAgICAgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24sIFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7CisgICAgICAgIHNwZi5zZXRGZWF0dXJlKHMsIGIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGdldEZlYXR1cmUoU3RyaW5nIHMpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhOb3RSZWNvZ25pemVkRXhjZXB0aW9uLCBTQVhOb3RTdXBwb3J0ZWRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gc3BmLmdldEZlYXR1cmUocyk7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBXcmFwcGluZ1NBWFBhcnNlciBleHRlbmRzIFNBWFBhcnNlciB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTQVhQYXJzZXIgc3A7CisKKyAgICAgICAgcHJvdGVjdGVkIFdyYXBwaW5nU0FYUGFyc2VyKFNBWFBhcnNlciBzcCkgeworICAgICAgICAgICAgdGhpcy5zcCA9IHNwOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICAgICAgc3AucmVzZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQorICAgICAgICBwdWJsaWMgdm9pZCBwYXJzZShJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgb3JnLnhtbC5zYXguSGFuZGxlckJhc2UgaGFuZGxlckJhc2UpIHRocm93cyBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHNwLnBhcnNlKGlucHV0U3RyZWFtLCBoYW5kbGVyQmFzZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKKyAgICAgICAgcHVibGljIHZvaWQgcGFyc2UoSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0sIG9yZy54bWwuc2F4LkhhbmRsZXJCYXNlIGhhbmRsZXJCYXNlLCBTdHJpbmcgcykKKyAgICAgICAgICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBzcC5wYXJzZShpbnB1dFN0cmVhbSwgaGFuZGxlckJhc2UsIHMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHBhcnNlKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBEZWZhdWx0SGFuZGxlciBkZWZhdWx0SGFuZGxlcikgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICAgICAgc3AucGFyc2UoaW5wdXRTdHJlYW0sIGRlZmF1bHRIYW5kbGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBwYXJzZShJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgRGVmYXVsdEhhbmRsZXIgZGVmYXVsdEhhbmRsZXIsIFN0cmluZyBzKSB0aHJvd3MgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBzcC5wYXJzZShpbnB1dFN0cmVhbSwgZGVmYXVsdEhhbmRsZXIsIHMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCisgICAgICAgIHB1YmxpYyB2b2lkIHBhcnNlKFN0cmluZyBzLCBvcmcueG1sLnNheC5IYW5kbGVyQmFzZSBoYW5kbGVyQmFzZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICAgICAgc3AucGFyc2UocywgaGFuZGxlckJhc2UpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHBhcnNlKFN0cmluZyBzLCBEZWZhdWx0SGFuZGxlciBkZWZhdWx0SGFuZGxlcikgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICAgICAgc3AucGFyc2UocywgZGVmYXVsdEhhbmRsZXIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCisgICAgICAgIHB1YmxpYyB2b2lkIHBhcnNlKEZpbGUgZmlsZSwgb3JnLnhtbC5zYXguSGFuZGxlckJhc2UgaGFuZGxlckJhc2UpIHRocm93cyBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHNwLnBhcnNlKGZpbGUsIGhhbmRsZXJCYXNlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBwYXJzZShGaWxlIGZpbGUsIERlZmF1bHRIYW5kbGVyIGRlZmF1bHRIYW5kbGVyKSB0aHJvd3MgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBzcC5wYXJzZShmaWxlLCBkZWZhdWx0SGFuZGxlcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKKyAgICAgICAgcHVibGljIHZvaWQgcGFyc2UoSW5wdXRTb3VyY2UgaW5wdXRTb3VyY2UsIG9yZy54bWwuc2F4LkhhbmRsZXJCYXNlIGhhbmRsZXJCYXNlKSB0aHJvd3MgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBzcC5wYXJzZShpbnB1dFNvdXJjZSwgaGFuZGxlckJhc2UpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHBhcnNlKElucHV0U291cmNlIGlucHV0U291cmNlLCBEZWZhdWx0SGFuZGxlciBkZWZhdWx0SGFuZGxlcikgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICAgICAgc3AucGFyc2UoaW5wdXRTb3VyY2UsIGRlZmF1bHRIYW5kbGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQorICAgICAgICBwdWJsaWMgb3JnLnhtbC5zYXguUGFyc2VyIGdldFBhcnNlcigpIHRocm93cyBTQVhFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIHNwLmdldFBhcnNlcigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBYTUxSZWFkZXIgZ2V0WE1MUmVhZGVyKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBYTUxSZWFkZXIgciA9IHNwLmdldFhNTFJlYWRlcigpOworICAgICAgICAgICAgci5zZXRFbnRpdHlSZXNvbHZlcihFTVBUWV9FTlRJVFlfUkVTT0xWRVIpOworICAgICAgICAgICAgcmV0dXJuIHI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNOYW1lc3BhY2VBd2FyZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBzcC5pc05hbWVzcGFjZUF3YXJlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZGF0aW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIHNwLmlzVmFsaWRhdGluZygpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBzLCBPYmplY3QgbykgdGhyb3dzIFNBWE5vdFJlY29nbml6ZWRFeGNlcHRpb24sIFNBWE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBzcC5zZXRQcm9wZXJ0eShzLCBvKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBzKSB0aHJvd3MgU0FYTm90UmVjb2duaXplZEV4Y2VwdGlvbiwgU0FYTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBzcC5nZXRQcm9wZXJ0eShzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU2NoZW1hIGdldFNjaGVtYSgpIHsKKyAgICAgICAgICAgIHJldHVybiBzcC5nZXRTY2hlbWEoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1hJbmNsdWRlQXdhcmUoKSB7CisgICAgICAgICAgICByZXR1cm4gc3AuaXNYSW5jbHVkZUF3YXJlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9qYXhiL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamF4Yi9pbnRlcm5hbC9UcmFuc2Zvcm1lckZhY3RvcnlJbmplY3Rpb25Qcm92aWRlci5qYXZhIGIvbWVkaWEvamF4Yi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pheGIvaW50ZXJuYWwvVHJhbnNmb3JtZXJGYWN0b3J5SW5qZWN0aW9uUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmQxNjUzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamF4Yi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pheGIvaW50ZXJuYWwvVHJhbnNmb3JtZXJGYWN0b3J5SW5qZWN0aW9uUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmpheGIuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LnhtbC5YTUxDb25zdGFudHM7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7CisKKy8qKgorICogVGhyZWFkLXNjb3BlZCBpbmplY3Rpb24gcHJvdmlkZXIgb2Yge0BsaW5rIFRyYW5zZm9ybWVyRmFjdG9yeSB0cmFuc2Zvcm1lciBmYWN0b3JpZXN9LgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBUcmFuc2Zvcm1lckZhY3RvcnlJbmplY3Rpb25Qcm92aWRlciBleHRlbmRzIEFic3RyYWN0WG1sRmFjdG9yeTxUcmFuc2Zvcm1lckZhY3Rvcnk+IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFRyYW5zZm9ybWVyRmFjdG9yeUluamVjdGlvblByb3ZpZGVyLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IHRyYW5zZm9ybWVyIGZhY3RvcnkgcHJvdmlkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uZmlnIEplcnNleSBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMuCisgICAgICovCisgICAgLy8gVE9ETyBUaGlzIHByb3ZpZGVyIHNob3VsZCBiZSByZWdpc3RlcmVkIGFuZCBjb25maWd1cmVkIHZpYSBhIGZlYXR1cmUuCisgICAgQEluamVjdAorICAgIHB1YmxpYyBUcmFuc2Zvcm1lckZhY3RvcnlJbmplY3Rpb25Qcm92aWRlcihmaW5hbCBDb25maWd1cmF0aW9uIGNvbmZpZykgeworICAgICAgICBzdXBlcihjb25maWcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUcmFuc2Zvcm1lckZhY3RvcnkgZ2V0KCkgeworICAgICAgICBUcmFuc2Zvcm1lckZhY3RvcnkgdHJhbnNmb3JtZXJGYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisKKyAgICAgICAgaWYgKCFpc1htbFNlY3VyaXR5RGlzYWJsZWQoKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB0cmFuc2Zvcm1lckZhY3Rvcnkuc2V0RmVhdHVyZShYTUxDb25zdGFudHMuRkVBVFVSRV9TRUNVUkVfUFJPQ0VTU0lORywgdHJ1ZSk7CisgICAgICAgICAgICB9IGNhdGNoIChUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuQ09ORklHLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5VTkFCTEVfVE9fU0VDVVJFX1hNTF9UUkFOU0ZPUk1FUl9QUk9DRVNTSU5HKCksIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVyRmFjdG9yeTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9qYXhiL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamF4Yi9pbnRlcm5hbC9YbWxDb2xsZWN0aW9uSmF4YlByb3ZpZGVyLmphdmEgYi9tZWRpYS9qYXhiL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamF4Yi9pbnRlcm5hbC9YbWxDb2xsZWN0aW9uSmF4YlByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIwZGVhNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2pheGIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYXhiL2ludGVybmFsL1htbENvbGxlY3Rpb25KYXhiUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDE2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYXhiLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyczsKKworaW1wb3J0IGphdmF4LmluamVjdC5Qcm92aWRlcjsKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLmJpbmQuTWFyc2hhbGxlcjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5Qcm9wZXJ0eUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5Vbm1hcnNoYWxsZXI7CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxJbnB1dEZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7CisKKy8qKgorICogQmFzZSBYTUwtYmFzZWQgbWVzc2FnZSBib2R5IHByb3ZpZGVyIGZvciBjb2xsZWN0aW9ucyBvZiBKQVhCIGJlYW5zLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBYbWxDb2xsZWN0aW9uSmF4YlByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RDb2xsZWN0aW9uSmF4YlByb3ZpZGVyIHsKKworICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8WE1MSW5wdXRGYWN0b3J5PiB4aWY7CisKKyAgICBYbWxDb2xsZWN0aW9uSmF4YlByb3ZpZGVyKFByb3ZpZGVyPFhNTElucHV0RmFjdG9yeT4geGlmLCBQcm92aWRlcnMgcHMpIHsKKyAgICAgICAgc3VwZXIocHMpOworCisgICAgICAgIHRoaXMueGlmID0geGlmOworICAgIH0KKworICAgIFhtbENvbGxlY3Rpb25KYXhiUHJvdmlkZXIoUHJvdmlkZXI8WE1MSW5wdXRGYWN0b3J5PiB4aWYsIFByb3ZpZGVycyBwcywgTWVkaWFUeXBlIG10KSB7CisgICAgICAgIHN1cGVyKHBzLCBtdCk7CisKKyAgICAgICAgdGhpcy54aWYgPSB4aWY7CisgICAgfQorCisgICAgLyoqCisgICAgICogSkFYQiAgcHJvdmlkZXIgZm9yIG1hcnNoYWxsaW5nL3VuLW1hcnNoYWxsaW5nIGNvbGxlY3Rpb25zCisgICAgICogZnJvbS90byBlbnRpdGllcyBvZiB7QGNvZGUgYXBwbGljYXRpb24veG1sfSBtZWRpYSB0eXBlLgorICAgICAqLworICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24veG1sIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL3htbCIpCisgICAgQFNpbmdsZXRvbgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQXBwIGV4dGVuZHMgWG1sQ29sbGVjdGlvbkpheGJQcm92aWRlciB7CisKKyAgICAgICAgcHVibGljIEFwcChAQ29udGV4dCBQcm92aWRlcjxYTUxJbnB1dEZhY3Rvcnk+IHhpZiwgQENvbnRleHQgUHJvdmlkZXJzIHBzKSB7CisgICAgICAgICAgICBzdXBlcih4aWYsIHBzLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MX1RZUEUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSkFYQiAgcHJvdmlkZXIgZm9yIG1hcnNoYWxsaW5nL3VuLW1hcnNoYWxsaW5nIGNvbGxlY3Rpb25zCisgICAgICogZnJvbS90byBlbnRpdGllcyBvZiB7QGNvZGUgdGV4dC94bWx9IG1lZGlhIHR5cGUuCisgICAgICovCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3htbCIpCisgICAgQENvbnN1bWVzKCJ0ZXh0L3htbCIpCisgICAgQFNpbmdsZXRvbgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgVGV4dCBleHRlbmRzIFhtbENvbGxlY3Rpb25KYXhiUHJvdmlkZXIgeworCisgICAgICAgIHB1YmxpYyBUZXh0KEBDb250ZXh0IFByb3ZpZGVyPFhNTElucHV0RmFjdG9yeT4geGlmLCBAQ29udGV4dCBQcm92aWRlcnMgcHMpIHsKKyAgICAgICAgICAgIHN1cGVyKHhpZiwgcHMsIE1lZGlhVHlwZS5URVhUX1hNTF9UWVBFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEpBWEIgcHJvdmlkZXIgZm9yIG1hcnNoYWxsaW5nL3VuLW1hcnNoYWxsaW5nIGNvbGxlY3Rpb25zCisgICAgICogZnJvbS90byBlbnRpdGllcyBvZiB7QGNvZGUgPHR5cGU+LzxzdWItdHlwZT4reG1sfSBtZWRpYSB0eXBlcy4KKyAgICAgKi8KKyAgICBAUHJvZHVjZXMoIiovKiIpCisgICAgQENvbnN1bWVzKCIqLyoiKQorICAgIEBTaW5nbGV0b24KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEdlbmVyYWwgZXh0ZW5kcyBYbWxDb2xsZWN0aW9uSmF4YlByb3ZpZGVyIHsKKworICAgICAgICBwdWJsaWMgR2VuZXJhbChAQ29udGV4dCBQcm92aWRlcjxYTUxJbnB1dEZhY3Rvcnk+IHhpZiwgQENvbnRleHQgUHJvdmlkZXJzIHBzKSB7CisgICAgICAgICAgICBzdXBlcih4aWYsIHBzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1N1cHBvcnRlZChNZWRpYVR5cGUgbSkgeworICAgICAgICAgICAgcmV0dXJuIG0uZ2V0U3VidHlwZSgpLmVuZHNXaXRoKCIreG1sIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgZmluYWwgWE1MU3RyZWFtUmVhZGVyIGdldFhNTFN0cmVhbVJlYWRlcihDbGFzczw/PiBlbGVtZW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVubWFyc2hhbGxlciB1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGVudGl0eVN0cmVhbSkKKyAgICAgICAgICAgIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24geworICAgICAgICByZXR1cm4geGlmLmdldCgpLmNyZWF0ZVhNTFN0cmVhbVJlYWRlcihlbnRpdHlTdHJlYW0pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlQ29sbGVjdGlvbihDbGFzczw/PiBlbGVtZW50VHlwZSwgQ29sbGVjdGlvbjw/PiB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLCBDaGFyc2V0IGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcnNoYWxsZXIgbSwgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkKKyAgICAgICAgICAgIHRocm93cyBKQVhCRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyByb290RWxlbWVudCA9IGdldFJvb3RFbGVtZW50TmFtZShlbGVtZW50VHlwZSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBjTmFtZSA9IGMubmFtZSgpOworCisgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZSgKKyAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCIlc1wiIHN0YW5kYWxvbmU9XCJ5ZXNcIj8+IiwgY05hbWUpLmdldEJ5dGVzKGNOYW1lKSk7CisgICAgICAgIFN0cmluZyBwcm9wZXJ0eSA9ICJjb20uc3VuLnhtbC5iaW5kLnhtbEhlYWRlcnMiOworICAgICAgICBTdHJpbmcgaGVhZGVyOworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gc3RhbmRhbG9uZSBqYXhiIHJpPworICAgICAgICAgICAgaGVhZGVyID0gKFN0cmluZykgbS5nZXRQcm9wZXJ0eShwcm9wZXJ0eSk7CisgICAgICAgIH0gY2F0Y2ggKFByb3BlcnR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIGpheGIgcmkgZnJvbSBqZGs/CisgICAgICAgICAgICBwcm9wZXJ0eSA9ICJjb20uc3VuLnhtbC5pbnRlcm5hbC5iaW5kLnhtbEhlYWRlcnMiOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBoZWFkZXIgPSAoU3RyaW5nKSBtLmdldFByb3BlcnR5KHByb3BlcnR5KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFByb3BlcnR5RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgLy8gb3RoZXIgamF4YiBpbXBsZW1lbnRhdGlvbgorICAgICAgICAgICAgICAgIGhlYWRlciA9IG51bGw7CisgICAgICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihYbWxDb2xsZWN0aW9uSmF4YlByb3ZpZGVyLmNsYXNzLmdldE5hbWUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkBYbWxIZWFkZXIgYW5ub3RhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIHdpdGggdGhpcyBKQVhCIGltcGxlbWVudGF0aW9uLiBQbGVhc2UgdXNlIEpBWEIgUkkgaWYgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgInlvdSBuZWVkIHRoaXMgZmVhdHVyZS4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaGVhZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIG0uc2V0UHJvcGVydHkocHJvcGVydHksICIiKTsKKyAgICAgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZShoZWFkZXIuZ2V0Qnl0ZXMoY05hbWUpKTsKKyAgICAgICAgfQorICAgICAgICBlbnRpdHlTdHJlYW0ud3JpdGUoU3RyaW5nLmZvcm1hdCgiPCVzPiIsIHJvb3RFbGVtZW50KS5nZXRCeXRlcyhjTmFtZSkpOworICAgICAgICBmb3IgKE9iamVjdCBvIDogdCkgeworICAgICAgICAgICAgbS5tYXJzaGFsKG8sIGVudGl0eVN0cmVhbSk7CisgICAgICAgIH0KKworICAgICAgICBlbnRpdHlTdHJlYW0ud3JpdGUoU3RyaW5nLmZvcm1hdCgiPC8lcz4iLCByb290RWxlbWVudCkuZ2V0Qnl0ZXMoY05hbWUpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9qYXhiL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamF4Yi9pbnRlcm5hbC9YbWxJbnB1dEZhY3RvcnlJbmplY3Rpb25Qcm92aWRlci5qYXZhIGIvbWVkaWEvamF4Yi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pheGIvaW50ZXJuYWwvWG1sSW5wdXRGYWN0b3J5SW5qZWN0aW9uUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjVkOWJlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamF4Yi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pheGIvaW50ZXJuYWwvWG1sSW5wdXRGYWN0b3J5SW5qZWN0aW9uUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmpheGIuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MSW5wdXRGYWN0b3J5OworCisvKioKKyAqIFRocmVhZC1zY29wZWQgaW5qZWN0aW9uIHByb3ZpZGVyIG9mIHtAbGluayBYTUxJbnB1dEZhY3RvcnkgdHJhbnNmb3JtZXIgZmFjdG9yaWVzfS4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgWG1sSW5wdXRGYWN0b3J5SW5qZWN0aW9uUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFhtbEZhY3Rvcnk8WE1MSW5wdXRGYWN0b3J5PiB7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IFhNTCBpbnB1dCBmYWN0b3J5IHByb3ZpZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZyBKZXJzZXkgY29uZmlndXJhdGlvbiBwcm9wZXJ0aWVzLgorICAgICAqLworICAgIC8vIFRPRE8gVGhpcyBwcm92aWRlciBzaG91bGQgYmUgcmVnaXN0ZXJlZCBhbmQgY29uZmlndXJlZCB2aWEgYSBmZWF0dXJlLgorICAgIEBJbmplY3QKKyAgICBwdWJsaWMgWG1sSW5wdXRGYWN0b3J5SW5qZWN0aW9uUHJvdmlkZXIoZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWcpIHsKKyAgICAgICAgc3VwZXIoY29uZmlnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgWE1MSW5wdXRGYWN0b3J5IGdldCgpIHsKKyAgICAgICAgWE1MSW5wdXRGYWN0b3J5IGZhY3RvcnkgPSBYTUxJbnB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKworICAgICAgICBpZiAoIWlzWG1sU2VjdXJpdHlEaXNhYmxlZCgpKSB7CisgICAgICAgICAgICBmYWN0b3J5LnNldFByb3BlcnR5KFhNTElucHV0RmFjdG9yeS5JU19SRVBMQUNJTkdfRU5USVRZX1JFRkVSRU5DRVMsIEJvb2xlYW4uRkFMU0UpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhY3Rvcnk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF4Yi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pheGIvaW50ZXJuYWwvWG1sSmF4YkVsZW1lbnRQcm92aWRlci5qYXZhIGIvbWVkaWEvamF4Yi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pheGIvaW50ZXJuYWwvWG1sSmF4YkVsZW1lbnRQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MTM1ODIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXhiL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamF4Yi9pbnRlcm5hbC9YbWxKYXhiRWxlbWVudFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamF4Yi5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcnM7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLk1hcnNoYWxsZXI7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuVW5tYXJzaGFsbGVyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlckZhY3Rvcnk7CisKKy8qKgorICogQmFzZSBYTUwtYmFzZWQgbWVzc2FnZSBib2R5IHByb3ZpZGVyIGZvciB7QGxpbmsgSkFYQkVsZW1lbnQgSkFYQiBlbGVtZW50fSBpbnN0YW5jZXMuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFhtbEpheGJFbGVtZW50UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEpheGJFbGVtZW50UHJvdmlkZXIgeworCisgICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxTQVhQYXJzZXJGYWN0b3J5PiBzcGY7CisKKyAgICBwdWJsaWMgWG1sSmF4YkVsZW1lbnRQcm92aWRlcihQcm92aWRlcjxTQVhQYXJzZXJGYWN0b3J5PiBzcGYsIFByb3ZpZGVycyBwcykgeworICAgICAgICBzdXBlcihwcyk7CisKKyAgICAgICAgdGhpcy5zcGYgPSBzcGY7CisgICAgfQorCisgICAgcHVibGljIFhtbEpheGJFbGVtZW50UHJvdmlkZXIoUHJvdmlkZXI8U0FYUGFyc2VyRmFjdG9yeT4gc3BmLCBQcm92aWRlcnMgcHMsIE1lZGlhVHlwZSBtdCkgeworICAgICAgICBzdXBlcihwcywgbXQpOworCisgICAgICAgIHRoaXMuc3BmID0gc3BmOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb3ZpZGVyIGZvciBtYXJzaGFsbGluZy91bi1tYXJzaGFsbGluZyB7QGxpbmsgSkFYQkVsZW1lbnQgSkFYQiBlbGVtZW50c30KKyAgICAgKiBmcm9tL3RvIGVudGl0aWVzIG9mIHtAY29kZSBhcHBsaWNhdGlvbi94bWx9IG1lZGlhIHR5cGUuCisgICAgICovCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi94bWwiKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24veG1sIikKKyAgICBAU2luZ2xldG9uCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBBcHAgZXh0ZW5kcyBYbWxKYXhiRWxlbWVudFByb3ZpZGVyIHsKKworICAgICAgICBwdWJsaWMgQXBwKEBDb250ZXh0IFByb3ZpZGVyPFNBWFBhcnNlckZhY3Rvcnk+IHNwZiwgQENvbnRleHQgUHJvdmlkZXJzIHBzKSB7CisgICAgICAgICAgICBzdXBlcihzcGYsIHBzLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MX1RZUEUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvdmlkZXIgZm9yIG1hcnNoYWxsaW5nL3VuLW1hcnNoYWxsaW5nIHtAbGluayBKQVhCRWxlbWVudCBKQVhCIGVsZW1lbnRzfQorICAgICAqIGZyb20vdG8gZW50aXRpZXMgb2Yge0Bjb2RlIHRleHQveG1sfSBtZWRpYSB0eXBlLgorICAgICAqLworICAgIEBQcm9kdWNlcygidGV4dC94bWwiKQorICAgIEBDb25zdW1lcygidGV4dC94bWwiKQorICAgIEBTaW5nbGV0b24KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFRleHQgZXh0ZW5kcyBYbWxKYXhiRWxlbWVudFByb3ZpZGVyIHsKKworICAgICAgICBwdWJsaWMgVGV4dChAQ29udGV4dCBQcm92aWRlcjxTQVhQYXJzZXJGYWN0b3J5PiBzcGYsIEBDb250ZXh0IFByb3ZpZGVycyBwcykgeworICAgICAgICAgICAgc3VwZXIoc3BmLCBwcywgTWVkaWFUeXBlLlRFWFRfWE1MX1RZUEUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvdmlkZXIgZm9yIG1hcnNoYWxsaW5nL3VuLW1hcnNoYWxsaW5nIHtAbGluayBKQVhCRWxlbWVudCBKQVhCIGVsZW1lbnRzfQorICAgICAqIGZyb20vdG8gZW50aXRpZXMgb2Yge0Bjb2RlIDx0eXBlPi88c3ViLXR5cGU+K3htbH0gbWVkaWEgdHlwZXMuCisgICAgICovCisgICAgQFByb2R1Y2VzKCIqLyosKi8qK3htbCIpCisgICAgQENvbnN1bWVzKCIqLyosKi8qK3htbCIpCisgICAgQFNpbmdsZXRvbgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgR2VuZXJhbCBleHRlbmRzIFhtbEpheGJFbGVtZW50UHJvdmlkZXIgeworCisgICAgICAgIHB1YmxpYyBHZW5lcmFsKEBDb250ZXh0IFByb3ZpZGVyPFNBWFBhcnNlckZhY3Rvcnk+IHNwZiwgQENvbnRleHQgUHJvdmlkZXJzIHBzKSB7CisgICAgICAgICAgICBzdXBlcihzcGYsIHBzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1N1cHBvcnRlZChNZWRpYVR5cGUgbSkgeworICAgICAgICAgICAgcmV0dXJuIG0uZ2V0U3VidHlwZSgpLmVuZHNXaXRoKCIreG1sIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgZmluYWwgSkFYQkVsZW1lbnQ8Pz4gcmVhZEZyb20oQ2xhc3M8Pz4gdHlwZSwgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5tYXJzaGFsbGVyIHVubWFyc2hhbGxlciwgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiB1bm1hcnNoYWxsZXIudW5tYXJzaGFsKGdldFNBWFNvdXJjZShzcGYuZ2V0KCksIGVudGl0eVN0cmVhbSksIHR5cGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHdyaXRlVG8oSkFYQkVsZW1lbnQ8Pz4gdCwgTWVkaWFUeXBlIG1lZGlhVHlwZSwgQ2hhcnNldCBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFyc2hhbGxlciBtLCBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgIG0ubWFyc2hhbCh0LCBlbnRpdHlTdHJlYW0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2pheGIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYXhiL2ludGVybmFsL1htbFJvb3RFbGVtZW50SmF4YlByb3ZpZGVyLmphdmEgYi9tZWRpYS9qYXhiL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamF4Yi9pbnRlcm5hbC9YbWxSb290RWxlbWVudEpheGJQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MzgxYzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXhiL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamF4Yi9pbnRlcm5hbC9YbWxSb290RWxlbWVudEpheGJQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmpheGIuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcnM7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLlVubWFyc2hhbGxlcjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlNBWFNvdXJjZTsKKworLyoqCisgKiBCYXNlIFhNTC1iYXNlZCBtZXNzYWdlIGJvZHkgcHJvdmlkZXIgZm9yIEpBWEIge0BsaW5rIFhtbFJvb3RFbGVtZW50IHJvb3QgZWxlbWVudHN9CisgKiBhbmQge0BsaW5rIFhtbFR5cGUgdHlwZXN9LgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBYbWxSb290RWxlbWVudEpheGJQcm92aWRlciBleHRlbmRzIEFic3RyYWN0Um9vdEVsZW1lbnRKYXhiUHJvdmlkZXIgeworCisgICAgLy8gRGVsYXkgY29uc3RydWN0aW9uIG9mIGZhY3RvcnkKKyAgICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPFNBWFBhcnNlckZhY3Rvcnk+IHNwZjsKKworICAgIFhtbFJvb3RFbGVtZW50SmF4YlByb3ZpZGVyKFByb3ZpZGVyPFNBWFBhcnNlckZhY3Rvcnk+IHNwZiwgUHJvdmlkZXJzIHBzKSB7CisgICAgICAgIHN1cGVyKHBzKTsKKworICAgICAgICB0aGlzLnNwZiA9IHNwZjsKKyAgICB9CisKKyAgICBYbWxSb290RWxlbWVudEpheGJQcm92aWRlcihQcm92aWRlcjxTQVhQYXJzZXJGYWN0b3J5PiBzcGYsIFByb3ZpZGVycyBwcywgTWVkaWFUeXBlIG10KSB7CisgICAgICAgIHN1cGVyKHBzLCBtdCk7CisKKyAgICAgICAgdGhpcy5zcGYgPSBzcGY7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvdmlkZXIgZm9yIG1hcnNoYWxsaW5nL3VuLW1hcnNoYWxsaW5nIEpBWEIge0BsaW5rIFhtbFJvb3RFbGVtZW50IHJvb3QgZWxlbWVudH0KKyAgICAgKiBhbmQge0BsaW5rIFhtbFR5cGUgdHlwZX0gaW5zdGFuY2VzIGZyb20vdG8gZW50aXRpZXMgb2Yge0Bjb2RlIGFwcGxpY2F0aW9uL3htbH0KKyAgICAgKiBtZWRpYSB0eXBlLgorICAgICAqLworICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24veG1sIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL3htbCIpCisgICAgQFNpbmdsZXRvbgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQXBwIGV4dGVuZHMgWG1sUm9vdEVsZW1lbnRKYXhiUHJvdmlkZXIgeworCisgICAgICAgIHB1YmxpYyBBcHAoQENvbnRleHQgUHJvdmlkZXI8U0FYUGFyc2VyRmFjdG9yeT4gc3BmLCBAQ29udGV4dCBQcm92aWRlcnMgcHMpIHsKKyAgICAgICAgICAgIHN1cGVyKHNwZiwgcHMsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUxfVFlQRSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlciBmb3IgbWFyc2hhbGxpbmcvdW4tbWFyc2hhbGxpbmcgSkFYQiB7QGxpbmsgWG1sUm9vdEVsZW1lbnQgcm9vdCBlbGVtZW50fQorICAgICAqIGFuZCB7QGxpbmsgWG1sVHlwZSB0eXBlfSBpbnN0YW5jZXMgZnJvbS90byBlbnRpdGllcyBvZiB7QGNvZGUgdGV4dC94bWx9CisgICAgICogbWVkaWEgdHlwZS4KKyAgICAgKi8KKyAgICBAUHJvZHVjZXMoInRleHQveG1sIikKKyAgICBAQ29uc3VtZXMoInRleHQveG1sIikKKyAgICBAU2luZ2xldG9uCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBUZXh0IGV4dGVuZHMgWG1sUm9vdEVsZW1lbnRKYXhiUHJvdmlkZXIgeworCisgICAgICAgIHB1YmxpYyBUZXh0KEBDb250ZXh0IFByb3ZpZGVyPFNBWFBhcnNlckZhY3Rvcnk+IHNwZiwgQENvbnRleHQgUHJvdmlkZXJzIHBzKSB7CisgICAgICAgICAgICBzdXBlcihzcGYsIHBzLCBNZWRpYVR5cGUuVEVYVF9YTUxfVFlQRSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlciBmb3IgbWFyc2hhbGxpbmcvdW4tbWFyc2hhbGxpbmcgSkFYQiB7QGxpbmsgWG1sUm9vdEVsZW1lbnQgcm9vdCBlbGVtZW50fQorICAgICAqIGFuZCB7QGxpbmsgWG1sVHlwZSB0eXBlfSBpbnN0YW5jZXMgZnJvbS90byBlbnRpdGllcyBvZiB7QGNvZGUgPHR5cGU+LzxzdWItdHlwZT4reG1sfQorICAgICAqIG1lZGlhIHR5cGVzLgorICAgICAqLworICAgIEBQcm9kdWNlcygiKi8qIikKKyAgICBAQ29uc3VtZXMoIiovKiIpCisgICAgQFNpbmdsZXRvbgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgR2VuZXJhbCBleHRlbmRzIFhtbFJvb3RFbGVtZW50SmF4YlByb3ZpZGVyIHsKKworICAgICAgICBwdWJsaWMgR2VuZXJhbChAQ29udGV4dCBQcm92aWRlcjxTQVhQYXJzZXJGYWN0b3J5PiBzcGYsIEBDb250ZXh0IFByb3ZpZGVycyBwcykgeworICAgICAgICAgICAgc3VwZXIoc3BmLCBwcyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNTdXBwb3J0ZWQoTWVkaWFUeXBlIG0pIHsKKyAgICAgICAgICAgIHJldHVybiBtLmdldFN1YnR5cGUoKS5lbmRzV2l0aCgiK3htbCIpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIE9iamVjdCByZWFkRnJvbShDbGFzczxPYmplY3Q+IHR5cGUsIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICBVbm1hcnNoYWxsZXIgdSwgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKQorICAgICAgICAgICAgdGhyb3dzIEpBWEJFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTQVhTb3VyY2UgcyA9IGdldFNBWFNvdXJjZShzcGYuZ2V0KCksIGVudGl0eVN0cmVhbSk7CisgICAgICAgIGlmICh0eXBlLmlzQW5ub3RhdGlvblByZXNlbnQoWG1sUm9vdEVsZW1lbnQuY2xhc3MpKSB7CisgICAgICAgICAgICByZXR1cm4gdS51bm1hcnNoYWwocyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gdS51bm1hcnNoYWwocywgdHlwZSkuZ2V0VmFsdWUoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2pheGIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYXhiL2ludGVybmFsL1htbFJvb3RPYmplY3RKYXhiUHJvdmlkZXIuamF2YSBiL21lZGlhL2pheGIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYXhiL2ludGVybmFsL1htbFJvb3RPYmplY3RKYXhiUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2NiYTcyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamF4Yi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pheGIvaW50ZXJuYWwvWG1sUm9vdE9iamVjdEpheGJQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTY0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmpheGIuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworCitpbXBvcnQgamF2YXgud3MucnMuQmFkUmVxdWVzdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5JbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTm9Db250ZW50RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcnM7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLlVubWFyc2hhbEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5Vbm1hcnNoYWxsZXI7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuRW50aXR5SW5wdXRTdHJlYW07CisKKy8qKgorICogQmFzZSBYTUwtYmFzZWQgbWVzc2FnZSBib2R5IHJlYWRlciBmb3IgSkFYQiBiZWFucy4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgWG1sUm9vdE9iamVjdEpheGJQcm92aWRlciBleHRlbmRzIEFic3RyYWN0SmF4YlByb3ZpZGVyPE9iamVjdD4geworCisgICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxTQVhQYXJzZXJGYWN0b3J5PiBzcGY7CisKKyAgICBYbWxSb290T2JqZWN0SmF4YlByb3ZpZGVyKFByb3ZpZGVyPFNBWFBhcnNlckZhY3Rvcnk+IHNwZiwgUHJvdmlkZXJzIHBzKSB7CisgICAgICAgIHN1cGVyKHBzKTsKKworICAgICAgICB0aGlzLnNwZiA9IHNwZjsKKyAgICB9CisKKyAgICBYbWxSb290T2JqZWN0SmF4YlByb3ZpZGVyKFByb3ZpZGVyPFNBWFBhcnNlckZhY3Rvcnk+IHNwZiwgUHJvdmlkZXJzIHBzLCBNZWRpYVR5cGUgbXQpIHsKKyAgICAgICAgc3VwZXIocHMsIG10KTsKKworICAgICAgICB0aGlzLnNwZiA9IHNwZjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgSkFYQkNvbnRleHQgZ2V0U3RvcmVkSmF4YkNvbnRleHQoQ2xhc3MgdHlwZSkgdGhyb3dzIEpBWEJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlciBmb3IgdW4tbWFyc2hhbGxpbmcgZW50aXRpZXMgb2Yge0Bjb2RlIGFwcGxpY2F0aW9uL3htbH0gbWVkaWEgdHlwZQorICAgICAqIGludG8gSkFYQiBiZWFucyB1c2luZyB7QGxpbmsgVW5tYXJzaGFsbGVyIEpBWEIgdW5tYXJzaGFsbGVyfS4KKyAgICAgKi8KKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3htbCIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi94bWwiKQorICAgIEBTaW5nbGV0b24KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEFwcCBleHRlbmRzIFhtbFJvb3RPYmplY3RKYXhiUHJvdmlkZXIgeworCisgICAgICAgIHB1YmxpYyBBcHAoQENvbnRleHQgUHJvdmlkZXI8U0FYUGFyc2VyRmFjdG9yeT4gc3BmLCBAQ29udGV4dCBQcm92aWRlcnMgcHMpIHsKKyAgICAgICAgICAgIHN1cGVyKHNwZiwgcHMsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUxfVFlQRSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlciBmb3IgdW4tbWFyc2hhbGxpbmcgZW50aXRpZXMgb2Yge0Bjb2RlIHRleHQveG1sfSBtZWRpYSB0eXBlCisgICAgICogaW50byBKQVhCIGJlYW5zIHVzaW5nIHtAbGluayBVbm1hcnNoYWxsZXIgSkFYQiB1bm1hcnNoYWxsZXJ9LgorICAgICAqLworICAgIEBQcm9kdWNlcygidGV4dC94bWwiKQorICAgIEBDb25zdW1lcygidGV4dC94bWwiKQorICAgIEBTaW5nbGV0b24KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFRleHQgZXh0ZW5kcyBYbWxSb290T2JqZWN0SmF4YlByb3ZpZGVyIHsKKworICAgICAgICBwdWJsaWMgVGV4dChAQ29udGV4dCBQcm92aWRlcjxTQVhQYXJzZXJGYWN0b3J5PiBzcGYsIEBDb250ZXh0IFByb3ZpZGVycyBwcykgeworICAgICAgICAgICAgc3VwZXIoc3BmLCBwcywgTWVkaWFUeXBlLlRFWFRfWE1MX1RZUEUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvdmlkZXIgZm9yIHVuLW1hcnNoYWxsaW5nIGVudGl0aWVzIG9mIHtAY29kZSA8dHlwZT4vPHN1Yi10eXBlPit4bWx9IG1lZGlhIHR5cGVzCisgICAgICogaW50byBKQVhCIGJlYW5zIHVzaW5nIHtAbGluayBVbm1hcnNoYWxsZXIgSkFYQiB1bm1hcnNoYWxsZXJ9LgorICAgICAqLworICAgIEBQcm9kdWNlcygiKi8qIikKKyAgICBAQ29uc3VtZXMoIiovKiIpCisgICAgQFNpbmdsZXRvbgorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgR2VuZXJhbCBleHRlbmRzIFhtbFJvb3RPYmplY3RKYXhiUHJvdmlkZXIgeworCisgICAgICAgIHB1YmxpYyBHZW5lcmFsKEBDb250ZXh0IFByb3ZpZGVyPFNBWFBhcnNlckZhY3Rvcnk+IHNwZiwgQENvbnRleHQgUHJvdmlkZXJzIHBzKSB7CisgICAgICAgICAgICBzdXBlcihzcGYsIHBzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1N1cHBvcnRlZChNZWRpYVR5cGUgbSkgeworICAgICAgICAgICAgcmV0dXJuIG0uZ2V0U3VidHlwZSgpLmVuZHNXaXRoKCIreG1sIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5jbGFzcyA9PSB0eXBlICYmIGlzU3VwcG9ydGVkKG1lZGlhVHlwZSkgJiYgZ2V0VW5tYXJzaGFsbGVyKHR5cGUsIG1lZGlhVHlwZSkgIT0gbnVsbDsKKyAgICAgICAgfSBjYXRjaCAoSkFYQkV4Y2VwdGlvbiBjYXVzZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfVU5NQVJTSEFMTElOR19KQVhCKHR5cGUpLCBjYXVzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZmluYWwgT2JqZWN0IHJlYWRGcm9tKAorICAgICAgICAgICAgQ2xhc3M8T2JqZWN0PiB0eXBlLAorICAgICAgICAgICAgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBmaW5hbCBFbnRpdHlJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0gPSBFbnRpdHlJbnB1dFN0cmVhbS5jcmVhdGUoaW5wdXRTdHJlYW0pOworICAgICAgICBpZiAoZW50aXR5U3RyZWFtLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5vQ29udGVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9SRUFESU5HX0VOVElUWV9NSVNTSU5HKCkpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBnZXRVbm1hcnNoYWxsZXIodHlwZSwgbWVkaWFUeXBlKQorICAgICAgICAgICAgICAgICAgICAudW5tYXJzaGFsKGdldFNBWFNvdXJjZShzcGYuZ2V0KCksIGVudGl0eVN0cmVhbSkpOworICAgICAgICB9IGNhdGNoIChVbm1hcnNoYWxFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKGV4KTsKKyAgICAgICAgfSBjYXRjaCAoSkFYQkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24oZXgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoQ2xhc3M8Pz4gYXJnMCwgVHlwZSBhcmcxLCBBbm5vdGF0aW9uW10gYXJnMiwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGVUbyhPYmplY3QgYXJnMCwgQ2xhc3M8Pz4gYXJnMSwgVHlwZSBhcmcyLCBBbm5vdGF0aW9uW10gYXJnMywKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBhcmc0LCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gYXJnNSwgT3V0cHV0U3RyZWFtIGFyZzYpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2pheGIvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnNwaS5Gb3JjZWRBdXRvRGlzY292ZXJhYmxlIGIvbWVkaWEvamF4Yi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuc3BpLkZvcmNlZEF1dG9EaXNjb3ZlcmFibGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYzMjdhOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2pheGIvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnNwaS5Gb3JjZWRBdXRvRGlzY292ZXJhYmxlCkBAIC0wLDAgKzEgQEAKK29yZy5nbGFzc2Zpc2guamVyc2V5LmpheGIuaW50ZXJuYWwuSmF4YkF1dG9EaXNjb3ZlcmFibGUKZGlmZiAtLWdpdCBhL21lZGlhL2pheGIvc3JjL21haW4vcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pheGIvaW50ZXJuYWwvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMgYi9tZWRpYS9qYXhiL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYXhiL2ludGVybmFsL2xvY2FsaXphdGlvbi5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NTcwOTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXhiL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYXhiL2ludGVybmFsL2xvY2FsaXphdGlvbi5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMzAgQEAKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisjCisjIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyMgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorIyBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyMgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorIworIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyMKKworZXJyb3IudW5tYXJzaGFsbGluZy5qYXhiPUVycm9yIHVuLW1hcnNoYWxsaW5nIEpBWEIgb2JqZWN0IG9mIHR5cGU6IHswfS4KK2Vycm9yLnJlYWRpbmcuZW50aXR5Lm1pc3Npbmc9TWlzc2luZyBlbnRpdHkuCituby5wYXJhbS5jb25zdHJ1Y3Rvci5taXNzaW5nPU5vLXBhcmFtIGNvbnN0cnVjdG9yIG5vdCBmb3VuZCBpbiB0aGUgY2xhc3MgW3swfV0uCitzYXguY2Fubm90LmVuYWJsZS5zZWN1cmUucHJvY2Vzc2luZy5mZWF0dXJlPUpBWFAgZmVhdHVyZSBYTUxDb25zdGFudHMuRkVBVFVSRV9TRUNVUkVfUFJPQ0VTU0lORyBjYW5ub3QgYmUgc2V0IFwKKyAgb24gYSBTQVggcGFyc2VyIGZhY3RvcnkgW3swfV0uCitzYXguY2Fubm90LmRpc2FibGUuZ2VuZXJhbC5lbnRpdHkucHJvY2Vzc2luZy5mZWF0dXJlPSBDYW5ub3QgZGlzYWJsZSBleHRlcm5hbCBnZW5lcmFsIGVudGl0eSBwcm9jZXNzaW5nIGZlYXR1cmUgXAorICBvbiBTQVggcGFyc2VyIGZhY3RvcnkgW3swfV0uCitzYXguY2Fubm90LmRpc2FibGUucGFyYW1ldGVyLmVudGl0eS5wcm9jZXNzaW5nLmZlYXR1cmU9IENhbm5vdCBkaXNhYmxlIGV4dGVybmFsIHBhcmFtZXRlciBlbnRpdHkgcHJvY2Vzc2luZyBmZWF0dXJlIFwKKyAgb24gU0FYIHBhcnNlciBmYWN0b3J5IFt7MH1dLgorc2F4Lnhkay5uby5zZWN1cml0eS5mZWF0dXJlcz1Vc2luZyBYREsuIE5vIHNlY3VyaXR5IGZlYXR1cmVzIHdpbGwgYmUgZW5hYmxlZCBmb3IgdGhlIFNBWCBwYXJzZXIuCit1bmFibGUudG8uYWNjZXNzLm1ldGhvZHMub2YuY2xhc3M9VW5hYmxlIHRvIGFjY2VzcyB0aGUgbWV0aG9kcyBvZiB0aGUgY2xhc3MgW3swfV0uIFwKKyAgQ2FsbGVyJ3MgY2xhc3MtbG9hZGVyIGhpZXJhcmNoeSBmb3Igbm90IGluIHRoZSBhbmNlc3RvciBjaGFpbiBvZiB0aGUgY2xhc3MuCit1bmFibGUudG8uaW5zdGFudGlhdGUuY2xhc3M9VW5hYmxlIHRvIGluc3RhbnRpYXRlIHRoZSBjbGFzcyBbezB9XS4KK3VuYWJsZS50by5zZWN1cmUueG1sLnRyYW5zZm9ybWVyLnByb2Nlc3Npbmc9VW5hYmxlIHRvIGNvbmZpZ3VyZSBzZWN1cmUgWE1MIHByb2Nlc3NpbmcgZmVhdHVyZSBvbiB0aGUgWE1MIHRyYW5zZm9ybWVyIGZhY3RvcnkuCmRpZmYgLS1naXQgYS9tZWRpYS9qYXhiL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamF4Yi9pbnRlcm5hbC9BYnN0cmFjdEpheGJQcm92aWRlclRlc3QuamF2YSBiL21lZGlhL2pheGIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYXhiL2ludGVybmFsL0Fic3RyYWN0SmF4YlByb3ZpZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMmM5ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qYXhiL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamF4Yi9pbnRlcm5hbC9BYnN0cmFjdEpheGJQcm92aWRlclRlc3QuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvKgorICogUG9ydGlvbnMgY29udHJpYnV0ZWQgYnkgSm9zZXBoIFdhbHRvbiAoQXRsYXNzaWFuKQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamF4Yi5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CisKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlNBWFNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK3B1YmxpYyBjbGFzcyBBYnN0cmFjdEpheGJQcm92aWRlclRlc3QgeworICAgIHByaXZhdGUgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBpbmplY3Rpb25NYW5hZ2VyID0gU2F4UGFyc2VyRmFjdG9yeUluamVjdGlvblByb3ZpZGVyVGVzdC5jcmVhdGVJbmplY3Rpb25NYW5hZ2VyKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBhYnN0cmFjdEpheGJQcm92aWRlckRvZXNOb3RSZWFkRXh0ZXJuYWxEdGRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFNBWFBhcnNlckZhY3Rvcnkgc3BmID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShTQVhQYXJzZXJGYWN0b3J5LmNsYXNzKTsKKworICAgICAgICBTdHJpbmcgdXJsID0gImZpbGU6Ly8vbm8tc3VjaC1maWxlIjsKKyAgICAgICAgU3RyaW5nIHMgPSAiPCFET0NUWVBFIHggU1lTVEVNICciICsgdXJsICsgIic+PHgvPiI7CisgICAgICAgIFNBWFNvdXJjZSBzYXhTb3VyY2UgPSBBYnN0cmFjdEpheGJQcm92aWRlci5nZXRTQVhTb3VyY2Uoc3BmLCBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocy5nZXRCeXRlcygidXMtYXNjaWkiKSkpOworCisgICAgICAgIFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCkudHJhbnNmb3JtKHNheFNvdXJjZSwgbmV3IFN0cmVhbVJlc3VsdChuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9qYXhiL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamF4Yi9pbnRlcm5hbC9KYXhiU3RyaW5nUmVhZGVyUHJvdmlkZXJUZXN0LmphdmEgYi9tZWRpYS9qYXhiL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamF4Yi9pbnRlcm5hbC9KYXhiU3RyaW5nUmVhZGVyUHJvdmlkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzkyYzcxOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2pheGIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYXhiL2ludGVybmFsL0pheGJTdHJpbmdSZWFkZXJQcm92aWRlclRlc3QuamF2YQpAQCAtMCwwICsxLDk1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvKgorICogUG9ydGlvbnMgY29udHJpYnV0ZWQgYnkgSm9zZXBoIFdhbHRvbiAoQXRsYXNzaWFuKQorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamF4Yi5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKKworaW1wb3J0IGphdmF4LndzLnJzLlJ1bnRpbWVUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Db250ZXh0UmVzb2x2ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LkV4Y2VwdGlvbk1hcHBlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcnM7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW9kZWwuaW50ZXJuYWwuQ29tbW9uQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1vZGVsLmludGVybmFsLkNvbXBvbmVudEJhZzsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitwdWJsaWMgY2xhc3MgSmF4YlN0cmluZ1JlYWRlclByb3ZpZGVyVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHN0cmluZ1JlYWRlckRvZXNOb3RSZWFkRXh0ZXJuYWxEdGRzKCkgeworCisgICAgICAgIFByb3ZpZGVyPFNBWFBhcnNlckZhY3Rvcnk+IHNheFBhcnNlckZhY3RvcnlQcm92aWRlciA9IG5ldyBQcm92aWRlcjxTQVhQYXJzZXJGYWN0b3J5PigpIHsKKyAgICAgICAgICAgIGZpbmFsIFNheFBhcnNlckZhY3RvcnlJbmplY3Rpb25Qcm92aWRlciBzcGYgPSBuZXcgU2F4UGFyc2VyRmFjdG9yeUluamVjdGlvblByb3ZpZGVyKAorICAgICAgICAgICAgICAgICAgICBuZXcgQ29tbW9uQ29uZmlnKFJ1bnRpbWVUeXBlLlNFUlZFUiwgQ29tcG9uZW50QmFnLklOQ0xVREVfQUxMKSk7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFNBWFBhcnNlckZhY3RvcnkgZ2V0KCkgeworICAgICAgICAgICAgICAgIHJldHVybiBzcGYuZ2V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgSmF4YlN0cmluZ1JlYWRlclByb3ZpZGVyLlJvb3RFbGVtZW50UHJvdmlkZXIgcHJvdmlkZXIgPSBuZXcgSmF4YlN0cmluZ1JlYWRlclByb3ZpZGVyLlJvb3RFbGVtZW50UHJvdmlkZXIoCisgICAgICAgICAgICAgICAgc2F4UGFyc2VyRmFjdG9yeVByb3ZpZGVyLCBuZXcgUHJvdmlkZXJzKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgPFQ+IE1lc3NhZ2VCb2R5UmVhZGVyPFQ+IGdldE1lc3NhZ2VCb2R5UmVhZGVyKENsYXNzPFQ+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyA8VD4gTWVzc2FnZUJvZHlXcml0ZXI8VD4gZ2V0TWVzc2FnZUJvZHlXcml0ZXIoQ2xhc3M8VD4gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIDxUIGV4dGVuZHMgVGhyb3dhYmxlPiBFeGNlcHRpb25NYXBwZXI8VD4gZ2V0RXhjZXB0aW9uTWFwcGVyKENsYXNzPFQ+IHR5cGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgPFQ+IENvbnRleHRSZXNvbHZlcjxUPiBnZXRDb250ZXh0UmVzb2x2ZXIoQ2xhc3M8VD4gY29udGV4dFR5cGUsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgU3RyaW5nIGNvbnRlbnQgPSAiPCFET0NUWVBFIHggU1lTVEVNICdmaWxlOi8vL25vLXN1Y2gtZmlsZSc+IDxyb290T2JqZWN0Lz4iOworCisgICAgICAgIHByb3ZpZGVyLmdldENvbnZlcnRlcihSb290T2JqZWN0LmNsYXNzLCBudWxsLCBudWxsKS5mcm9tU3RyaW5nKGNvbnRlbnQpOworICAgIH0KKworICAgIEBYbWxSb290RWxlbWVudAorICAgIHN0YXRpYyBjbGFzcyBSb290T2JqZWN0IHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9qYXhiL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamF4Yi9pbnRlcm5hbC9TYXhQYXJzZXJGYWN0b3J5SW5qZWN0aW9uUHJvdmlkZXJUZXN0LmphdmEgYi9tZWRpYS9qYXhiL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamF4Yi9pbnRlcm5hbC9TYXhQYXJzZXJGYWN0b3J5SW5qZWN0aW9uUHJvdmlkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMzMGNjZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2pheGIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYXhiL2ludGVybmFsL1NheFBhcnNlckZhY3RvcnlJbmplY3Rpb25Qcm92aWRlclRlc3QuamF2YQpAQCAtMCwwICsxLDIzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoKKyAqIFBvcnRpb25zIGNvbnRyaWJ1dGVkIGJ5IEpvc2VwaCBXYWx0b24gKEF0bGFzc2lhbikKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmpheGIuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5SdW50aW1lVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkFic3RyYWN0QmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5CaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkNvbXBvc2l0ZUJpbmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuUGVyVGhyZWFkOworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdFNhbWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKKworLyoqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIFNheFBhcnNlckZhY3RvcnlJbmplY3Rpb25Qcm92aWRlclRlc3QgeworICAgIHByaXZhdGUgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyOworICAgIHByaXZhdGUgU0FYUGFyc2VyRmFjdG9yeSBmMTsKKyAgICBwcml2YXRlIFNBWFBhcnNlckZhY3RvcnkgZjI7CisgICAgcHJpdmF0ZSBTQVhQYXJzZXJGYWN0b3J5IGZmMTsKKyAgICBwcml2YXRlIFNBWFBhcnNlckZhY3RvcnkgZmYyOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBpbmplY3Rpb25NYW5hZ2VyID0gY3JlYXRlSW5qZWN0aW9uTWFuYWdlcigpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbmZpZ3VyYXRpb24gRU1QVFlfQ09ORklHID0gbmV3IENvbmZpZ3VyYXRpb24oKSB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSdW50aW1lVHlwZSBnZXRSdW50aW1lVHlwZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIHByb3BlcnR5TmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENvbGxlY3Rpb248U3RyaW5nPiBnZXRQcm9wZXJ0eU5hbWVzKCkgeworICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChGZWF0dXJlIGZlYXR1cmUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoQ2xhc3M8PyBleHRlbmRzIEZlYXR1cmU+IGZlYXR1cmVDbGFzcykgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmVnaXN0ZXJlZChPYmplY3QgcHJvdmlkZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlZ2lzdGVyZWQoQ2xhc3M8Pz4gcHJvdmlkZXJDbGFzcykgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFByb3BlcnRpZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTWFwPENsYXNzPD8+LCBJbnRlZ2VyPiBnZXRDb250cmFjdHMoQ2xhc3M8Pz4gY29tcG9uZW50Q2xhc3MpIHsKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlTZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU2V0PE9iamVjdD4gZ2V0SW5zdGFuY2VzKCkgeworICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5U2V0KCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHVibGljIHN0YXRpYyBJbmplY3Rpb25NYW5hZ2VyIGNyZWF0ZUluamVjdGlvbk1hbmFnZXIoQmluZGVyLi4uIGN1c3RvbUJpbmRlcnMpIHsKKyAgICAgICAgQmluZGVyW10gYmluZGVycyA9IG5ldyBCaW5kZXJbY3VzdG9tQmluZGVycy5sZW5ndGggKyAyXTsKKworICAgICAgICBiaW5kZXJzWzBdID0gbmV3IEFic3RyYWN0QmluZGVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgICAgICAgICAgYmluZEZhY3RvcnkoKCkgLT4gRU1QVFlfQ09ORklHKS50byhDb25maWd1cmF0aW9uLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBiaW5kRmFjdG9yeShTYXhQYXJzZXJGYWN0b3J5SW5qZWN0aW9uUHJvdmlkZXIuY2xhc3MsIFNpbmdsZXRvbi5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgIC50byhTQVhQYXJzZXJGYWN0b3J5LmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgLmluKFBlclRocmVhZC5jbGFzcyk7CisgICAgICAgICAgICAgICAgYmluZEFzQ29udHJhY3QoTXlTUEZQcm92aWRlci5jbGFzcykuaW4oU2luZ2xldG9uLmNsYXNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgU3lzdGVtLmFycmF5Y29weShjdXN0b21CaW5kZXJzLCAwLCBiaW5kZXJzLCAyLCBjdXN0b21CaW5kZXJzLmxlbmd0aCk7CisgICAgICAgIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciA9IEluamVjdGlvbnMuY3JlYXRlSW5qZWN0aW9uTWFuYWdlcihDb21wb3NpdGVCaW5kZXIud3JhcChiaW5kZXJzKSk7CisgICAgICAgIGluamVjdGlvbk1hbmFnZXIuY29tcGxldGVSZWdpc3RyYXRpb24oKTsKKyAgICAgICAgcmV0dXJuIGluamVjdGlvbk1hbmFnZXI7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB4bWxSZWFkZXJEb2VzTm90UmVzb2x2ZUV4dGVybmFsUGFyYW1ldGVyRW50aXRpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHVybCA9ICJmaWxlOi8vL25vLXN1Y2gtZmlsZSI7CisgICAgICAgIFN0cmluZyBjb250ZW50ID0gIjwhRE9DVFlQRSB4IFs8IUVOVElUWSAlIHBlIFNZU1RFTSAnIiArIHVybCArICInPiAlcGU7XT48eC8+IjsKKyAgICAgICAgZ2V0U1BGKCkubmV3U0FYUGFyc2VyKCkuZ2V0WE1MUmVhZGVyKCkucGFyc2UobmV3IElucHV0U291cmNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjb250ZW50LmdldEJ5dGVzKCJ1cy1hc2NpaSIpKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ha2luZyBzdXJlIHRoYXQgdGhlIHNhbWUgaW5zdGFuY2Ugb2YgU0FYUGFyc2VyRmFjdG9yeSBpcyB1c2VkIGlmIGluamVjdGVkIG11bHRpcGxlIHRpbWVzIGluIHRoZSBzYW1lIHRocmVhZC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTYW1lRm9yU2FtZVRocmVhZHMoKSB7CisgICAgICAgIGYxID0gZ2V0U1BGKCk7CisgICAgICAgIGYyID0gZ2V0U1BGKCk7CisgICAgICAgIGZmMSA9IGdldFNQRlZpYVByb3ZpZGVyKCk7CisgICAgICAgIGZmMiA9IGdldFNQRlZpYVByb3ZpZGVyKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoZjEpOworICAgICAgICBhc3NlcnROb3ROdWxsKGYyKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChmZjEpOworICAgICAgICBhc3NlcnROb3ROdWxsKGZmMik7CisKKy8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImYxICA6ICIgKyBmMS50b1N0cmluZygpKTsKKy8vICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImZmMSA6ICIgKyBmZjEudG9TdHJpbmcoKSk7CisvLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJmMiAgOiAiICsgZjIudG9TdHJpbmcoKSk7CisvLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJmZjIgOiAiICsgZmYyLnRvU3RyaW5nKCkpOworCisgICAgICAgIGFzc2VydFNhbWUoZjEsIGYyKTsKKyAgICAgICAgYXNzZXJ0U2FtZShmMiwgZmYxKTsKKyAgICAgICAgYXNzZXJ0U2FtZShmZjEsIGZmMik7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFraW5nIHN1cmUgdGhhdCBhIGRpZmZlcmVudCBpbnN0YW5jZSBvZiBTQVhQYXJzZXJGYWN0b3J5IGlzIHVzZWQgZm9yIGVhY2ggZGlmZmVyZW50IHRocmVhZC4KKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlmZmVyZW50Rm9yRGlmZmVyZW50VGhyZWFkcygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIFRocmVhZCB0ID0gbmV3IFRocmVhZChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBmMSA9IGdldFNQRigpOworICAgICAgICAgICAgICAgIGZmMSA9IGdldFNQRlZpYVByb3ZpZGVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgIGYyID0gZ2V0U1BGKCk7CisgICAgICAgIGZmMiA9IGdldFNQRlZpYVByb3ZpZGVyKCk7CisgICAgICAgIHQuam9pbigpOworICAgICAgICBhc3NlcnROb3ROdWxsKGYxKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChmMik7CisgICAgICAgIGFzc2VydE5vdE51bGwoZmYxKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChmZjIpOworCisvLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJmMSAgOiAiICsgZjEudG9TdHJpbmcoKSk7CisvLyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJmZjEgOiAiICsgZmYxLnRvU3RyaW5nKCkpOworLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZjIgIDogIiArIGYyLnRvU3RyaW5nKCkpOworLy8gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiZmYyIDogIiArIGZmMi50b1N0cmluZygpKTsKKworICAgICAgICBhc3NlcnROb3RTYW1lKGYxLCBmMik7CisgICAgICAgIGFzc2VydE5vdFNhbWUoZmYxLCBmZjIpOworICAgICAgICBhc3NlcnRTYW1lKGYxLCBmZjEpOworICAgICAgICBhc3NlcnRTYW1lKGYyLCBmZjIpOworICAgIH0KKworICAgIHByaXZhdGUgU0FYUGFyc2VyRmFjdG9yeSBnZXRTUEYoKSB7CisgICAgICAgIHJldHVybiBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKFNBWFBhcnNlckZhY3RvcnkuY2xhc3MpOworICAgIH0KKworICAgIHByaXZhdGUgU0FYUGFyc2VyRmFjdG9yeSBnZXRTUEZWaWFQcm92aWRlcigpIHsKKyAgICAgICAgcmV0dXJuIGluamVjdGlvbk1hbmFnZXIuPE15U1BGUHJvdmlkZXI+Z2V0SW5zdGFuY2UoTXlTUEZQcm92aWRlci5jbGFzcykuZ2V0U1BGKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xhc3MgdG8gZW11bGF0ZSBpbmplY3RpbmcgYSBGYWN0b3J5Jmx0O1NBWFBhcnNlckZhY3RvcnkmZ3Q7CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVNQRlByb3ZpZGVyIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxTQVhQYXJzZXJGYWN0b3J5PiBmOworCisgICAgICAgIEBJbmplY3QKKyAgICAgICAgcHVibGljIE15U1BGUHJvdmlkZXIoUHJvdmlkZXI8U0FYUGFyc2VyRmFjdG9yeT4gZikgeworICAgICAgICAgICAgdGhpcy5mID0gZjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTQVhQYXJzZXJGYWN0b3J5IGdldFNQRigpIHsKKyAgICAgICAgICAgIHJldHVybiBmLmdldCgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvamF4Yi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pheGIvaW50ZXJuYWwvU291cmNlUHJvdmlkZXJUZXN0LmphdmEgYi9tZWRpYS9qYXhiL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamF4Yi9pbnRlcm5hbC9Tb3VyY2VQcm92aWRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWU5Y2ZlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvamF4Yi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pheGIvaW50ZXJuYWwvU291cmNlUHJvdmlkZXJUZXN0LmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoKKyAqIFBvcnRpb25zIGNvbnRyaWJ1dGVkIGJ5IEpvc2VwaCBXYWx0b24gKEF0bGFzc2lhbikKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmpheGIuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhTb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkFic3RyYWN0QmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuU291cmNlUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitwdWJsaWMgY2xhc3MgU291cmNlUHJvdmlkZXJUZXN0IHsKKworICAgIHByaXZhdGUgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgeworICAgICAgICBpbmplY3Rpb25NYW5hZ2VyID0gU2F4UGFyc2VyRmFjdG9yeUluamVjdGlvblByb3ZpZGVyVGVzdC5jcmVhdGVJbmplY3Rpb25NYW5hZ2VyKG5ldyBBYnN0cmFjdEJpbmRlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICAgICAgICAgIGJpbmRBc0NvbnRyYWN0KFNvdXJjZVByb3ZpZGVyLlNheFNvdXJjZVJlYWRlci5jbGFzcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2F4U291cmNlUmVhZGVyRG9lc05vdFJlYWRFeHRlcm5hbER0ZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU291cmNlUHJvdmlkZXIuU2F4U291cmNlUmVhZGVyIHJlYWRlciA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoU291cmNlUHJvdmlkZXIuU2F4U291cmNlUmVhZGVyLmNsYXNzKTsKKyAgICAgICAgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKAorICAgICAgICAgICAgICAgICI8IURPQ1RZUEUgeCBTWVNURU0gJ2ZpbGU6Ly8vbm8tc3VjaC1maWxlJz4gPHJvb3RPYmplY3QvPiIuZ2V0Qnl0ZXMoInVzLWFzY2lpIikpOworICAgICAgICBTQVhTb3VyY2Ugc3MgPSByZWFkZXIucmVhZEZyb20obnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgZW50aXR5U3RyZWFtKTsKKworICAgICAgICBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdUcmFuc2Zvcm1lcigpLnRyYW5zZm9ybShzcywgbmV3IFN0cmVhbVJlc3VsdChuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9qc29uLWJpbmRpbmcvcG9tLnhtbCBiL21lZGlhL2pzb24tYmluZGluZy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2Y2I3OTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qc29uLWJpbmRpbmcvcG9tLnhtbApAQCAtMCwwICsxLDkzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLWpzb24tYmluZGluZzwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS1tZWRpYS1qc29uLWJpbmRpbmc8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIEplcnNleSBKU09OLUIgc3VwcG9ydCBtb2R1bGUuCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4uaXN0YWNrPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWlzdGFjay1jb21tb25zLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5idWlsZC1oZWxwZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZmVsaXg8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYnVuZGxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KKyAgICAgICAgICAgICAgICA8ZXh0ZW5zaW9ucz50cnVlPC9leHRlbnNpb25zPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8aW5zdHJ1Y3Rpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgPEV4cG9ydC1QYWNrYWdlPm9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uKjwvRXhwb3J0LVBhY2thZ2U+CisgICAgICAgICAgICAgICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgorICAgICAgICAgICAgICAgICAgICA8dW5wYWNrQnVuZGxlPnRydWU8L3VucGFja0J1bmRsZT4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29tbW9uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguanNvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDwhLS0gVE9ETyAtIHJlbW92ZSBzbmFwc2hvdCBkZXBlbmRlbmNpZXMgKHdpbGwgbmVlZCB5YXNzb24gJiBBUEkgcmVsZWFzZSwgYXMgdGhlcmUgb25seSBpcyAyIG1vbnRoIG9sZCBNMSB2ZXJzaW9uIC0tPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+eWFzc29uPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5qc29uLmJpbmQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5qc29uLmJpbmQtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tZWRpYS9qc29uLWJpbmRpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qc29uYi9Kc29uQmluZGluZ0ZlYXR1cmUuamF2YSBiL21lZGlhL2pzb24tYmluZGluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pzb25iL0pzb25CaW5kaW5nRmVhdHVyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NDQ1ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qc29uLWJpbmRpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qc29uYi9Kc29uQmluZGluZ0ZlYXR1cmUuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lmpzb25iOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmVDb250ZXh0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuQ29tbW9uUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5JbnRlcm5hbFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5Qcm9wZXJ0aWVzSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lmpzb25iLmludGVybmFsLkpzb25CaW5kaW5nQXV0b0Rpc2NvdmVyYWJsZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qc29uYi5pbnRlcm5hbC5Kc29uQmluZGluZ1Byb3ZpZGVyOworCisvKioKKyAqIEZlYXR1cmUgdXNlZCB0byByZWdpc3RlciBKYWNrc29uIEpTT04gcHJvdmlkZXJzLgorICogPHA+CisgKiBUaGUgRmVhdHVyZSBpcyBhdXRvbWF0aWNhbGx5IGVuYWJsZWQgd2hlbiB7QGxpbmsgSnNvbkJpbmRpbmdBdXRvRGlzY292ZXJhYmxlfSBpcyBvbiBjbGFzc3BhdGguCisgKiBEZWZhdWx0IEpTT04tQiBjb25maWd1cmF0aW9uIG9idGFpbmVkIGJ5IGNhbGxpbmcge0Bjb2RlIEpzb25iQnVpbGRlci5jcmVhdGUoKX0gaXMgdXNlZC4KKyAqIDxwPgorICogQ3VzdG9tIGNvbmZpZ3VyYXRpb24sIGlmIHJlcXVpcmVkLCBjYW4gYmUgYWNoaWV2ZWQgYnkgaW1wbGVtZW50aW5nIGN1c3RvbSB7QGxpbmsgamF2YXgud3MucnMuZXh0LkNvbnRleHRSZXNvbHZlcn0gYW5kCisgKiByZWdpc3RlcmluZyBpdCBhcyBhIHByb3ZpZGVyIGludG8gSkFYLVJTIHJ1bnRpbWU6CisgKiA8cHJlPgorICogJiM2NDtQcm92aWRlcgorICogJiM2NDtjbGFzcyBKc29uYkNvbnRleHRSZXNvbHZlciBpbXBsZW1lbnRzIENvbnRleHRSZXNvbHZlciZsdDtKc29uYiZndDsgeworICogICAgICAmIzY0O092ZXJyaWRlCisgKiAgICAgIHB1YmxpYyBKc29uYiBnZXRDb250ZXh0KENsYXNzPD8+IHR5cGUpIHsKKyAqICAgICAgICAgIEpzb25iQ29uZmlnIGNvbmZpZyA9IG5ldyBKc29uYkNvbmZpZygpOworICogICAgICAgICAgLy8gYWRkIGN1c3RvbSBjb25maWd1cmF0aW9uCisgKiAgICAgICAgICByZXR1cm4gSnNvbmJCdWlsZGVyLmNyZWF0ZShjb25maWcpOworICogICAgICB9CisgKiB9CisgKiA8L3ByZT4KKyAqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBKc29uQmluZGluZ0ZlYXR1cmUgaW1wbGVtZW50cyBGZWF0dXJlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX0ZFQVRVUkUgPSBKc29uQmluZGluZ0ZlYXR1cmUuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlKGZpbmFsIEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWcgPSBjb250ZXh0LmdldENvbmZpZ3VyYXRpb24oKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcganNvbkZlYXR1cmUgPSBDb21tb25Qcm9wZXJ0aWVzLmdldFZhbHVlKAorICAgICAgICAgICAgICAgIGNvbmZpZy5nZXRQcm9wZXJ0aWVzKCksCisgICAgICAgICAgICAgICAgY29uZmlnLmdldFJ1bnRpbWVUeXBlKCksCisgICAgICAgICAgICAgICAgSW50ZXJuYWxQcm9wZXJ0aWVzLkpTT05fRkVBVFVSRSwgSlNPTl9GRUFUVVJFLCBTdHJpbmcuY2xhc3MpOworCisgICAgICAgIC8vIE90aGVyIEpTT04gcHJvdmlkZXJzIHJlZ2lzdGVyZWQuCisgICAgICAgIGlmICghSlNPTl9GRUFUVVJFLmVxdWFsc0lnbm9yZUNhc2UoanNvbkZlYXR1cmUpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBEaXNhYmxlIG90aGVyIEpTT04gcHJvdmlkZXJzLgorICAgICAgICBjb250ZXh0LnByb3BlcnR5KFByb3BlcnRpZXNIZWxwZXIuZ2V0UHJvcGVydHlOYW1lRm9yUnVudGltZSgKKyAgICAgICAgICAgICAgICBJbnRlcm5hbFByb3BlcnRpZXMuSlNPTl9GRUFUVVJFLCBjb25maWcuZ2V0UnVudGltZVR5cGUoKSksIEpTT05fRkVBVFVSRSk7CisKKyAgICAgICAgY29udGV4dC5yZWdpc3RlcihKc29uQmluZGluZ1Byb3ZpZGVyLmNsYXNzKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9qc29uLWJpbmRpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qc29uYi9pbnRlcm5hbC9Kc29uQmluZGluZ0F1dG9EaXNjb3ZlcmFibGUuamF2YSBiL21lZGlhL2pzb24tYmluZGluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pzb25iL2ludGVybmFsL0pzb25CaW5kaW5nQXV0b0Rpc2NvdmVyYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYTdjMGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qc29uLWJpbmRpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qc29uYi9pbnRlcm5hbC9Kc29uQmluZGluZ0F1dG9EaXNjb3ZlcmFibGUuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lmpzb25iLmludGVybmFsOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlQ29udGV4dDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJpb3JpdHk7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5zcGkuQXV0b0Rpc2NvdmVyYWJsZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5zcGkuRm9yY2VkQXV0b0Rpc2NvdmVyYWJsZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qc29uYi5Kc29uQmluZGluZ0ZlYXR1cmU7CisKKy8qKgorICoge0BsaW5rIEZvcmNlZEF1dG9EaXNjb3ZlcmFibGV9IHJlZ2lzdGVyaW5nIHtAbGluayBKc29uQmluZGluZ0ZlYXR1cmV9IGlmIHRoZSBmZWF0dXJlIGlzIG5vdCBhbHJlYWR5IHJlZ2lzdGVyZWQuCisgKiA8cD4KKyAqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKiBAc2VlIEpzb25CaW5kaW5nRmVhdHVyZQorICovCitAUHJpb3JpdHkoQXV0b0Rpc2NvdmVyYWJsZS5ERUZBVUxUX1BSSU9SSVRZIC0gMjAwKQorcHVibGljIGNsYXNzIEpzb25CaW5kaW5nQXV0b0Rpc2NvdmVyYWJsZSBpbXBsZW1lbnRzIEZvcmNlZEF1dG9EaXNjb3ZlcmFibGUgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY29uZmlndXJlKGZpbmFsIEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgaWYgKCFjb250ZXh0LmdldENvbmZpZ3VyYXRpb24oKS5pc1JlZ2lzdGVyZWQoSnNvbkJpbmRpbmdGZWF0dXJlLmNsYXNzKSkgeworICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihKc29uQmluZGluZ0ZlYXR1cmUuY2xhc3MpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvanNvbi1iaW5kaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvanNvbmIvaW50ZXJuYWwvSnNvbkJpbmRpbmdQcm92aWRlci5qYXZhIGIvbWVkaWEvanNvbi1iaW5kaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvanNvbmIvaW50ZXJuYWwvSnNvbkJpbmRpbmdQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZGM5YmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qc29uLWJpbmRpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qc29uYi9pbnRlcm5hbC9Kc29uQmluZGluZ1Byb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuanNvbmIuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuQ29udGV4dFJlc29sdmVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXJzOworCitpbXBvcnQgamF2YXguanNvbi5iaW5kLkpzb25iOworaW1wb3J0IGphdmF4Lmpzb24uYmluZC5Kc29uYkJ1aWxkZXI7CitpbXBvcnQgamF2YXguanNvbi5iaW5kLkpzb25iRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuanNvbmIuTG9jYWxpemF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5BYnN0cmFjdE1lc3NhZ2VSZWFkZXJXcml0ZXJQcm92aWRlcjsKKworLyoqCisgKiBFbnRpdHkgcHJvdmlkZXIgKHJlYWRlciBhbmQgd3JpdGVyKSBmb3IgSlNPTkIuCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitAUHJvdmlkZXIKK0BQcm9kdWNlcyh7ImFwcGxpY2F0aW9uL2pzb24iLCAidGV4dC9qc29uIiwgIiovKiJ9KQorQENvbnN1bWVzKHsiYXBwbGljYXRpb24vanNvbiIsICJ0ZXh0L2pzb24iLCAiKi8qIn0pCitwdWJsaWMgY2xhc3MgSnNvbkJpbmRpbmdQcm92aWRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVJlYWRlcldyaXRlclByb3ZpZGVyPE9iamVjdD4geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT04gPSAianNvbiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBMVVNfSlNPTiA9ICIranNvbiI7CisKKyAgICBwcml2YXRlIFByb3ZpZGVycyBwcm92aWRlcnM7CisKKyAgICBwdWJsaWMgSnNvbkJpbmRpbmdQcm92aWRlcihAQ29udGV4dCBQcm92aWRlcnMgcHJvdmlkZXJzKSB7CisgICAgICAgIHRoaXMucHJvdmlkZXJzID0gcHJvdmlkZXJzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiBzdXBwb3J0c01lZGlhVHlwZShtZWRpYVR5cGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgcmVhZEZyb20oQ2xhc3M8T2JqZWN0PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIEpzb25iIGpzb25iID0gZ2V0SnNvbmIodHlwZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4ganNvbmIuZnJvbUpzb24oZW50aXR5U3RyZWFtLCBnZW5lcmljVHlwZSk7CisgICAgICAgIH0gY2F0Y2ggKEpzb25iRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX0pTT05CX0RFU0VSSUFMSVpBVElPTigpLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICByZXR1cm4gc3VwcG9ydHNNZWRpYVR5cGUobWVkaWFUeXBlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKE9iamVjdCBvLCBDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICBKc29uYiBqc29uYiA9IGdldEpzb25iKHR5cGUpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZW50aXR5U3RyZWFtLndyaXRlKGpzb25iLnRvSnNvbihvKS5nZXRCeXRlcyhBYnN0cmFjdE1lc3NhZ2VSZWFkZXJXcml0ZXJQcm92aWRlci5nZXRDaGFyc2V0KG1lZGlhVHlwZSkpKTsKKyAgICAgICAgICAgIGVudGl0eVN0cmVhbS5mbHVzaCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9KU09OQl9TRVJJQUxJWkFUSU9OKCksIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBKc29uYiBnZXRKc29uYihDbGFzczw/PiB0eXBlKSB7CisgICAgICAgIGZpbmFsIENvbnRleHRSZXNvbHZlcjxKc29uYj4gY29udGV4dFJlc29sdmVyID0gcHJvdmlkZXJzLmdldENvbnRleHRSZXNvbHZlcihKc29uYi5jbGFzcywgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSk7CisgICAgICAgIGlmIChjb250ZXh0UmVzb2x2ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGNvbnRleHRSZXNvbHZlci5nZXRDb250ZXh0KHR5cGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIEpzb25iU2luZ2xldG9uLklOU1RBTkNFLmdldEluc3RhbmNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRydWUgZm9yIGFsbCBtZWRpYSB0eXBlcyBvZiB0aGUgcGF0dGVybiAqJiM0Nztqc29uIGFuZAorICAgICAqIComIzQ3OyoranNvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHN1cHBvcnRzTWVkaWFUeXBlKGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIG1lZGlhVHlwZS5nZXRTdWJ0eXBlKCkuZXF1YWxzKEpTT04pIHx8IG1lZGlhVHlwZS5nZXRTdWJ0eXBlKCkuZW5kc1dpdGgoUExVU19KU09OKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGVudW0gSnNvbmJTaW5nbGV0b24geworICAgICAgICBJTlNUQU5DRTsKKworICAgICAgICBwcml2YXRlIEpzb25iIGpzb25iSW5zdGFuY2U7CisKKyAgICAgICAgSnNvbmIgZ2V0SW5zdGFuY2UoKSB7CisgICAgICAgICAgICByZXR1cm4ganNvbmJJbnN0YW5jZTsKKyAgICAgICAgfQorCisgICAgICAgIEpzb25iU2luZ2xldG9uKCkgeworICAgICAgICAgICAgdGhpcy5qc29uYkluc3RhbmNlID0gSnNvbmJCdWlsZGVyLmNyZWF0ZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvanNvbi1iaW5kaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvanNvbmIvcGFja2FnZS1pbmZvLmphdmEgYi9tZWRpYS9qc29uLWJpbmRpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qc29uYi9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzFlMjM5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvanNvbi1iaW5kaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvanNvbmIvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoqCisgKiBKZXJzZXkgY2xhc3NlcyBzdXBwb3J0aW5nIEpTT04gbWFyc2hhbGxpbmcgYW5kIHVubWFyc2hhbGxpbmcgdXNpbmcgSlNPTi1CLgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lmpzb25iOwpkaWZmIC0tZ2l0IGEvbWVkaWEvanNvbi1iaW5kaW5nL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5zcGkuRm9yY2VkQXV0b0Rpc2NvdmVyYWJsZSBiL21lZGlhL2pzb24tYmluZGluZy9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuc3BpLkZvcmNlZEF1dG9EaXNjb3ZlcmFibGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRmZWQ2NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2pzb24tYmluZGluZy9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuc3BpLkZvcmNlZEF1dG9EaXNjb3ZlcmFibGUKQEAgLTAsMCArMSBAQAorb3JnLmdsYXNzZmlzaC5qZXJzZXkuanNvbmIuaW50ZXJuYWwuSnNvbkJpbmRpbmdBdXRvRGlzY292ZXJhYmxlCmRpZmYgLS1naXQgYS9tZWRpYS9qc29uLWJpbmRpbmcvc3JjL21haW4vcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pzb25iL2xvY2FsaXphdGlvbi5wcm9wZXJ0aWVzIGIvbWVkaWEvanNvbi1iaW5kaW5nL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9qc29uYi9sb2NhbGl6YXRpb24ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2I1YTk0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvanNvbi1iaW5kaW5nL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9qc29uYi9sb2NhbGl6YXRpb24ucHJvcGVydGllcwpAQCAtMCwwICsxLDE4IEBACisjCisjIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorIworIyBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisjIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyMgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisjIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyMKKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisjCisKK2Vycm9yLmpzb25iLnNlcmlhbGl6YXRpb249RXJyb3Igd3JpdGluZyBKU09OLUIgc2VyaWFsaXplZCBvYmplY3QuCitlcnJvci5qc29uYi5kZXNlcmlhbGl6YXRpb249RXJyb3IgZGVzZXJpYWxpemluZyBvYmplY3QgZnJvbSBlbnRpdHkgc3RyZWFtLgpkaWZmIC0tZ2l0IGEvbWVkaWEvanNvbi1qYWNrc29uL3BvbS54bWwgYi9tZWRpYS9qc29uLWphY2tzb24vcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTFiZmYyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvanNvbi1qYWNrc29uL3BvbS54bWwKQEAgLTAsMCArMSwxMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtanNvbi1qYWNrc29uPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LW1lZGlhLWpzb24tamFja3NvbjwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgSmVyc2V5IEpTT04gSmFja3NvbiAoMi54KSBlbnRpdHkgcHJvdmlkZXJzIHN1cHBvcnQgbW9kdWxlLgorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8bGljZW5zZXM+CisgICAgICAgIDxsaWNlbnNlPgorICAgICAgICAgICAgPG5hbWU+RVBMIDIuMDwvbmFtZT4KKyAgICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wPC91cmw+CisgICAgICAgICAgICA8ZGlzdHJpYnV0aW9uPnJlcG88L2Rpc3RyaWJ1dGlvbj4KKyAgICAgICAgICAgIDxjb21tZW50cz5FeGNlcHQgZm9yIEd1YXZhLCBKU1ItMTY2IGZpbGVzLCBEcm9wd2l6YXJkIE1vbml0b3JpbmcgaW5zcGlyZWQgY2xhc3NlcywgQVNNIGFuZCBKYWNrc29uIEpBWC1SUyBQcm92aWRlcnMuCisgICAgICAgICAgICAgICAgU2VlIGFsc28gaHR0cHM6Ly9naXRodWIuY29tL2VjbGlwc2UtZWU0ai9qZXJzZXkvYmxvYi9tYXN0ZXIvTk9USUNFLm1kPC9jb21tZW50cz4KKyAgICAgICAgPC9saWNlbnNlPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICAgIDxuYW1lPlRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwgVmVyc2lvbiAyLCBXaXRoIENsYXNzcGF0aCBFeGNlcHRpb248L25hbWU+CisgICAgICAgICAgICA8dXJsPmh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbDwvdXJsPgorICAgICAgICAgICAgPGRpc3RyaWJ1dGlvbj5yZXBvPC9kaXN0cmlidXRpb24+CisgICAgICAgICAgICA8Y29tbWVudHM+RXhjZXB0IGZvciBKYWNrc29uIEpBWC1SUyBQcm92aWRlcnMuCisgICAgICAgICAgICAgICAgU2VlIGFsc28gaHR0cHM6Ly9naXRodWIuY29tL2plcnNleS9qZXJzZXkvYmxvYi9tYXN0ZXIvTk9USUNFLm1kPC9jb21tZW50cz4KKyAgICAgICAgPC9saWNlbnNlPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICAgIDxuYW1lPkFwYWNoZSBMaWNlbnNlLCAyLjA8L25hbWU+CisgICAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMC5odG1sPC91cmw+CisgICAgICAgICAgICA8ZGlzdHJpYnV0aW9uPnJlcG88L2Rpc3RyaWJ1dGlvbj4KKyAgICAgICAgICAgIDxjb21tZW50cz5KYWNrc29uIEpBWC1SUyBQcm92aWRlcnMgQCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uLmludGVybmFsLmphY2tzb24uamF4cnM8L2NvbW1lbnRzPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgPC9saWNlbnNlcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4uaXN0YWNrPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWlzdGFjay1jb21tb25zLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5idWlsZC1oZWxwZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZmVsaXg8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYnVuZGxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KKyAgICAgICAgICAgICAgICA8ZXh0ZW5zaW9ucz50cnVlPC9leHRlbnNpb25zPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8aW5zdHJ1Y3Rpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgPEV4cG9ydC1QYWNrYWdlPm9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uKjwvRXhwb3J0LVBhY2thZ2U+CisgICAgICAgICAgICAgICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgorICAgICAgICAgICAgICAgICAgICA8dW5wYWNrQnVuZGxlPnRydWU8L3VucGFja0J1bmRsZT4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29tbW9uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWVudGl0eS1maWx0ZXJpbmc8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8IS0tPGRlcGVuZGVuY3k+LS0+CisgICAgICAgICAgICA8IS0tPGdyb3VwSWQ+Y29tLmZhc3RlcnhtbC5qYWNrc29uLmpheHJzPC9ncm91cElkPi0tPgorICAgICAgICAgICAgPCEtLTxhcnRpZmFjdElkPmphY2tzb24tamF4cnMtYmFzZTwvYXJ0aWZhY3RJZD4tLT4KKyAgICAgICAgPCEtLTwvZGVwZW5kZW5jeT4tLT4KKyAgICAgICAgPCEtLTxkZXBlbmRlbmN5Pi0tPgorICAgICAgICAgICAgPCEtLTxncm91cElkPmNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5qYXhyczwvZ3JvdXBJZD4tLT4KKyAgICAgICAgICAgIDwhLS08YXJ0aWZhY3RJZD5qYWNrc29uLWpheHJzLWpzb24tcHJvdmlkZXI8L2FydGlmYWN0SWQ+LS0+CisgICAgICAgIDwhLS08L2RlcGVuZGVuY3k+LS0+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmZhc3RlcnhtbC5qYWNrc29uLmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYWNrc29uLWFubm90YXRpb25zPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmZhc3RlcnhtbC5qYWNrc29uLmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYWNrc29uLWRhdGFiaW5kPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmZhc3RlcnhtbC5qYWNrc29uLm1vZHVsZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphY2tzb24tbW9kdWxlLWpheGItYW5ub3RhdGlvbnM8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21lZGlhL2pzb24tamFja3Nvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2phY2tzb24vSmFja3NvbkZlYXR1cmUuamF2YSBiL21lZGlhL2pzb24tamFja3Nvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2phY2tzb24vSmFja3NvbkZlYXR1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODVjYzBhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamFja3Nvbi9KYWNrc29uRmVhdHVyZS5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamFja3NvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuQ29tbW9uUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5JbnRlcm5hbFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5Qcm9wZXJ0aWVzSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uaW50ZXJuYWwuRmlsdGVyaW5nSmFja3NvbkpheGJKc29uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamFja3Nvbi5pbnRlcm5hbC5KYWNrc29uRmlsdGVyaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uLmludGVybmFsLmphY2tzb24uamF4cnMuYmFzZS5Kc29uTWFwcGluZ0V4Y2VwdGlvbk1hcHBlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uLmludGVybmFsLmphY2tzb24uamF4cnMuYmFzZS5Kc29uUGFyc2VFeGNlcHRpb25NYXBwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamFja3Nvbi5pbnRlcm5hbC5qYWNrc29uLmpheHJzLmpzb24uSmFja3NvbkpheGJKc29uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuRW50aXR5RmlsdGVyaW5nRmVhdHVyZTsKKworLyoqCisgKiBGZWF0dXJlIHVzZWQgdG8gcmVnaXN0ZXIgSmFja3NvbiBKU09OIHByb3ZpZGVycy4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBLb3ByaXZhCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEphY2tzb25GZWF0dXJlIGltcGxlbWVudHMgRmVhdHVyZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9GRUFUVVJFID0gSmFja3NvbkZlYXR1cmUuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlKGZpbmFsIEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWcgPSBjb250ZXh0LmdldENvbmZpZ3VyYXRpb24oKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcganNvbkZlYXR1cmUgPSBDb21tb25Qcm9wZXJ0aWVzLmdldFZhbHVlKGNvbmZpZy5nZXRQcm9wZXJ0aWVzKCksIGNvbmZpZy5nZXRSdW50aW1lVHlwZSgpLAorICAgICAgICAgICAgICAgIEludGVybmFsUHJvcGVydGllcy5KU09OX0ZFQVRVUkUsIEpTT05fRkVBVFVSRSwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgLy8gT3RoZXIgSlNPTiBwcm92aWRlcnMgcmVnaXN0ZXJlZC4KKyAgICAgICAgaWYgKCFKU09OX0ZFQVRVUkUuZXF1YWxzSWdub3JlQ2FzZShqc29uRmVhdHVyZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIERpc2FibGUgb3RoZXIgSlNPTiBwcm92aWRlcnMuCisgICAgICAgIGNvbnRleHQucHJvcGVydHkoUHJvcGVydGllc0hlbHBlci5nZXRQcm9wZXJ0eU5hbWVGb3JSdW50aW1lKEludGVybmFsUHJvcGVydGllcy5KU09OX0ZFQVRVUkUsIGNvbmZpZy5nZXRSdW50aW1lVHlwZSgpKSwKKyAgICAgICAgICAgICAgICBKU09OX0ZFQVRVUkUpOworCisgICAgICAgIC8vIFJlZ2lzdGVyIEphY2tzb24uCisgICAgICAgIGlmICghY29uZmlnLmlzUmVnaXN0ZXJlZChKYWNrc29uSmF4Ykpzb25Qcm92aWRlci5jbGFzcykpIHsKKyAgICAgICAgICAgIC8vIGFkZCB0aGUgZGVmYXVsdCBKYWNrc29uIGV4Y2VwdGlvbiBtYXBwZXJzCisgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKEpzb25QYXJzZUV4Y2VwdGlvbk1hcHBlci5jbGFzcyk7CisgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKEpzb25NYXBwaW5nRXhjZXB0aW9uTWFwcGVyLmNsYXNzKTsKKworICAgICAgICAgICAgaWYgKEVudGl0eUZpbHRlcmluZ0ZlYXR1cmUuZW5hYmxlZChjb25maWcpKSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihKYWNrc29uRmlsdGVyaW5nRmVhdHVyZS5jbGFzcyk7CisgICAgICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihGaWx0ZXJpbmdKYWNrc29uSmF4Ykpzb25Qcm92aWRlci5jbGFzcywgTWVzc2FnZUJvZHlSZWFkZXIuY2xhc3MsIE1lc3NhZ2VCb2R5V3JpdGVyLmNsYXNzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihKYWNrc29uSmF4Ykpzb25Qcm92aWRlci5jbGFzcywgTWVzc2FnZUJvZHlSZWFkZXIuY2xhc3MsIE1lc3NhZ2VCb2R5V3JpdGVyLmNsYXNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2pzb24tamFja3Nvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2phY2tzb24vaW50ZXJuYWwvRmlsdGVyaW5nSmFja3NvbkpheGJKc29uUHJvdmlkZXIuamF2YSBiL21lZGlhL2pzb24tamFja3Nvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2phY2tzb24vaW50ZXJuYWwvRmlsdGVyaW5nSmFja3NvbkpheGJKc29uUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGYyNWY4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamFja3Nvbi9pbnRlcm5hbC9GaWx0ZXJpbmdKYWNrc29uSmF4Ykpzb25Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTU0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUmVmbGVjdGlvbkhlbHBlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uLmludGVybmFsLmphY2tzb24uamF4cnMuY2ZnLkVuZHBvaW50Q29uZmlnQmFzZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uLmludGVybmFsLmphY2tzb24uamF4cnMuY2ZnLk9iamVjdFdyaXRlckluamVjdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uaW50ZXJuYWwuamFja3Nvbi5qYXhycy5jZmcuT2JqZWN0V3JpdGVyTW9kaWZpZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamFja3Nvbi5pbnRlcm5hbC5qYWNrc29uLmpheHJzLmpzb24uSmFja3NvbkpheGJKc29uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamFja3Nvbi5pbnRlcm5hbC5qYWNrc29uLmpheHJzLmpzb24uSnNvbkVuZHBvaW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLnNwaS5PYmplY3RQcm92aWRlcjsKKworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5jb3JlLkpzb25HZW5lcmF0b3I7CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLkFubm90YXRpb25JbnRyb3NwZWN0b3I7CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLk9iamVjdE1hcHBlcjsKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuT2JqZWN0V3JpdGVyOworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5pbnRyb3NwZWN0LkFubm90YXRlZDsKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuaW50cm9zcGVjdC5Bbm5vdGF0ZWRDbGFzczsKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuaW50cm9zcGVjdC5Bbm5vdGF0ZWRGaWVsZDsKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuaW50cm9zcGVjdC5Bbm5vdGF0ZWRNZXRob2Q7CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLmludHJvc3BlY3QuSmFja3NvbkFubm90YXRpb25JbnRyb3NwZWN0b3I7CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLnNlci5CZWFuUHJvcGVydHlGaWx0ZXI7CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLnNlci5GaWx0ZXJQcm92aWRlcjsKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuc2VyLlByb3BlcnR5RmlsdGVyOworCisvKioKKyAqIEVudGl0eSBEYXRhIEZpbHRlcmluZyBwcm92aWRlciBiYXNlZCBvbiBKYWNrc29uIEpTT04gcHJvdmlkZXIuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BTaW5nbGV0b24KK3B1YmxpYyBmaW5hbCBjbGFzcyBGaWx0ZXJpbmdKYWNrc29uSmF4Ykpzb25Qcm92aWRlciBleHRlbmRzIEphY2tzb25KYXhiSnNvblByb3ZpZGVyIHsKKworICAgIEBJbmplY3QKKyAgICBwcml2YXRlIFByb3ZpZGVyPE9iamVjdFByb3ZpZGVyPEZpbHRlclByb3ZpZGVyPj4gcHJvdmlkZXI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgSnNvbkVuZHBvaW50Q29uZmlnIF9jb25maWdGb3JXcml0aW5nKGZpbmFsIE9iamVjdE1hcHBlciBtYXBwZXIsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IGRlZmF1bHRWaWV3KSB7CisgICAgICAgIGZpbmFsIEFubm90YXRpb25JbnRyb3NwZWN0b3IgY3VzdG9tSW50cm9zcGVjdG9yID0gbWFwcGVyLmdldFNlcmlhbGl6YXRpb25Db25maWcoKS5nZXRBbm5vdGF0aW9uSW50cm9zcGVjdG9yKCk7CisgICAgICAgIC8vIFNldCB0aGUgY3VzdG9tICh1c2VyKSBpbnRyb3NwZWN0b3IgdG8gYmUgdGhlIHByaW1hcnkgb25lLgorICAgICAgICBmaW5hbCBPYmplY3RNYXBwZXIgZmlsdGVyaW5nTWFwcGVyID0gbWFwcGVyLnNldEFubm90YXRpb25JbnRyb3NwZWN0b3IoQW5ub3RhdGlvbkludHJvc3BlY3Rvci5wYWlyKGN1c3RvbUludHJvc3BlY3RvciwKKyAgICAgICAgICAgICAgICBuZXcgSmFja3NvbkFubm90YXRpb25JbnRyb3NwZWN0b3IoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGZpbmRGaWx0ZXJJZChmaW5hbCBBbm5vdGF0ZWQgYSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IGZpbHRlcklkID0gc3VwZXIuZmluZEZpbHRlcklkKGEpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVySWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWx0ZXJJZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGEgaW5zdGFuY2VvZiBBbm5vdGF0ZWRNZXRob2QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZXRob2QgbWV0aG9kID0gKChBbm5vdGF0ZWRNZXRob2QpIGEpLmdldEFubm90YXRlZCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJlc3RlZCBvbmx5IGluIGdldHRlcnMgLSB0cnlpbmcgdG8gb2J0YWluICJmaWVsZCIgbmFtZSBmcm9tIHRoZW0uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJlZmxlY3Rpb25IZWxwZXIuaXNHZXR0ZXIobWV0aG9kKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVmbGVjdGlvbkhlbHBlci5nZXRQcm9wZXJ0eU5hbWUobWV0aG9kKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYSBpbnN0YW5jZW9mIEFubm90YXRlZEZpZWxkIHx8IGEgaW5zdGFuY2VvZiBBbm5vdGF0ZWRDbGFzcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KSk7CisKKyAgICAgICAgcmV0dXJuIHN1cGVyLl9jb25maWdGb3JXcml0aW5nKGZpbHRlcmluZ01hcHBlciwgYW5ub3RhdGlvbnMsIGRlZmF1bHRWaWV3KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIE9iamVjdCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEZpbHRlclByb3ZpZGVyIGZpbHRlclByb3ZpZGVyID0gcHJvdmlkZXIuZ2V0KCkuZ2V0RmlsdGVyaW5nT2JqZWN0KGdlbmVyaWNUeXBlLCB0cnVlLCBhbm5vdGF0aW9ucyk7CisgICAgICAgIGlmIChmaWx0ZXJQcm92aWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBPYmplY3RXcml0ZXJJbmplY3Rvci5zZXQobmV3IEZpbHRlcmluZ09iamVjdFdyaXRlck1vZGlmaWVyKGZpbHRlclByb3ZpZGVyLCBPYmplY3RXcml0ZXJJbmplY3Rvci5nZXRBbmRDbGVhcigpKSk7CisgICAgICAgIH0KKworICAgICAgICBzdXBlci53cml0ZVRvKHZhbHVlLCB0eXBlLCBnZW5lcmljVHlwZSwgYW5ub3RhdGlvbnMsIG1lZGlhVHlwZSwgaHR0cEhlYWRlcnMsIGVudGl0eVN0cmVhbSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgRmlsdGVyaW5nT2JqZWN0V3JpdGVyTW9kaWZpZXIgZXh0ZW5kcyBPYmplY3RXcml0ZXJNb2RpZmllciB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3RXcml0ZXJNb2RpZmllciBvcmlnaW5hbDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBGaWx0ZXJQcm92aWRlciBmaWx0ZXJQcm92aWRlcjsKKworICAgICAgICBwcml2YXRlIEZpbHRlcmluZ09iamVjdFdyaXRlck1vZGlmaWVyKGZpbmFsIEZpbHRlclByb3ZpZGVyIGZpbHRlclByb3ZpZGVyLCBmaW5hbCBPYmplY3RXcml0ZXJNb2RpZmllciBvcmlnaW5hbCkgeworICAgICAgICAgICAgdGhpcy5vcmlnaW5hbCA9IG9yaWdpbmFsOworICAgICAgICAgICAgdGhpcy5maWx0ZXJQcm92aWRlciA9IGZpbHRlclByb3ZpZGVyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPYmplY3RXcml0ZXIgbW9kaWZ5KGZpbmFsIEVuZHBvaW50Q29uZmlnQmFzZTw/PiBlbmRwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc3BvbnNlSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlVG9Xcml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0V3JpdGVyIHcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEpzb25HZW5lcmF0b3IgZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIE9iamVjdFdyaXRlciB3cml0ZXIgPSBvcmlnaW5hbCA9PSBudWxsID8gdyA6IG9yaWdpbmFsLm1vZGlmeShlbmRwb2ludCwgcmVzcG9uc2VIZWFkZXJzLCB2YWx1ZVRvV3JpdGUsIHcsIGcpOworICAgICAgICAgICAgZmluYWwgRmlsdGVyUHJvdmlkZXIgY3VzdG9tRmlsdGVyUHJvdmlkZXIgPSB3cml0ZXIuZ2V0Q29uZmlnKCkuZ2V0RmlsdGVyUHJvdmlkZXIoKTsKKworICAgICAgICAgICAgLy8gVHJ5IHRoZSBjdXN0b20gKHVzZXIpIGZpbHRlciBwcm92aWRlciBmaXJzdC4KKyAgICAgICAgICAgIHJldHVybiBjdXN0b21GaWx0ZXJQcm92aWRlciA9PSBudWxsCisgICAgICAgICAgICAgICAgICAgID8gd3JpdGVyLndpdGgoZmlsdGVyUHJvdmlkZXIpCisgICAgICAgICAgICAgICAgICAgIDogd3JpdGVyLndpdGgobmV3IEZpbHRlclByb3ZpZGVyKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgQmVhblByb3BlcnR5RmlsdGVyIGZpbmRGaWx0ZXIoZmluYWwgT2JqZWN0IGZpbHRlcklkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1c3RvbUZpbHRlclByb3ZpZGVyLmZpbmRGaWx0ZXIoZmlsdGVySWQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBQcm9wZXJ0eUZpbHRlciBmaW5kUHJvcGVydHlGaWx0ZXIoZmluYWwgT2JqZWN0IGZpbHRlcklkLCBmaW5hbCBPYmplY3QgdmFsdWVUb0ZpbHRlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFByb3BlcnR5RmlsdGVyIGZpbHRlciA9IGN1c3RvbUZpbHRlclByb3ZpZGVyLmZpbmRQcm9wZXJ0eUZpbHRlcihmaWx0ZXJJZCwgdmFsdWVUb0ZpbHRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWx0ZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlclByb3ZpZGVyLmZpbmRQcm9wZXJ0eUZpbHRlcihmaWx0ZXJJZCwgdmFsdWVUb0ZpbHRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamFja3Nvbi9pbnRlcm5hbC9KYWNrc29uQXV0b0Rpc2NvdmVyYWJsZS5qYXZhIGIvbWVkaWEvanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamFja3Nvbi9pbnRlcm5hbC9KYWNrc29uQXV0b0Rpc2NvdmVyYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMDMwODEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYWNrc29uL2ludGVybmFsL0phY2tzb25BdXRvRGlzY292ZXJhYmxlLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uLmludGVybmFsOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlQ29udGV4dDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJpb3JpdHk7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5zcGkuQXV0b0Rpc2NvdmVyYWJsZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uLkphY2tzb25GZWF0dXJlOworCisvKioKKyAqIHtAbGluayBBdXRvRGlzY292ZXJhYmxlfSByZWdpc3RlcmluZyB7QGxpbmsgSmFja3NvbkZlYXR1cmV9IGlmIHRoZSBmZWF0dXJlIGlzIG5vdCBhbHJlYWR5IHJlZ2lzdGVyZWQuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BQcmlvcml0eShBdXRvRGlzY292ZXJhYmxlLkRFRkFVTFRfUFJJT1JJVFkpCitwdWJsaWMgY2xhc3MgSmFja3NvbkF1dG9EaXNjb3ZlcmFibGUgaW1wbGVtZW50cyBBdXRvRGlzY292ZXJhYmxlIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShmaW5hbCBGZWF0dXJlQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGlmICghY29udGV4dC5nZXRDb25maWd1cmF0aW9uKCkuaXNSZWdpc3RlcmVkKEphY2tzb25GZWF0dXJlLmNsYXNzKSkgeworICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihKYWNrc29uRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYWNrc29uL2ludGVybmFsL0phY2tzb25GaWx0ZXJpbmdGZWF0dXJlLmphdmEgYi9tZWRpYS9qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYWNrc29uL2ludGVybmFsL0phY2tzb25GaWx0ZXJpbmdGZWF0dXJlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmEwZTg2YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2pzb24tamFja3Nvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2phY2tzb24vaW50ZXJuYWwvSmFja3NvbkZpbHRlcmluZ0ZlYXR1cmUuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljVHlwZTsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQWJzdHJhY3RCaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuc3BpLk9iamVjdEdyYXBoVHJhbnNmb3JtZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuc3BpLk9iamVjdFByb3ZpZGVyOworCitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLnNlci5GaWx0ZXJQcm92aWRlcjsKKworLyoqCisgKiB7QGxpbmsgRmVhdHVyZX0gYWRkaW5nIHN1cHBvcnQgZm9yIEVudGl0eSBEYXRhIEZpbHRlcmluZyBpbnRvIEphY2tzb24gbWVkaWEgbW9kdWxlLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgZmluYWwgY2xhc3MgSmFja3NvbkZpbHRlcmluZ0ZlYXR1cmUgaW1wbGVtZW50cyBGZWF0dXJlIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZShmaW5hbCBGZWF0dXJlQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlnID0gY29udGV4dC5nZXRDb25maWd1cmF0aW9uKCk7CisKKyAgICAgICAgaWYgKCFjb25maWcuaXNSZWdpc3RlcmVkKEphY2tzb25GaWx0ZXJpbmdGZWF0dXJlLkJpbmRlci5jbGFzcykpIHsKKyAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIobmV3IEJpbmRlcigpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBCaW5kZXIgZXh0ZW5kcyBBYnN0cmFjdEJpbmRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIGJpbmRBc0NvbnRyYWN0KEphY2tzb25PYmplY3RQcm92aWRlci5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgLy8gRmlsdGVyaW5nT2JqZWN0UHJvdmlkZXIuCisgICAgICAgICAgICAgICAgICAgIC50byhuZXcgR2VuZXJpY1R5cGU8T2JqZWN0UHJvdmlkZXI8RmlsdGVyUHJvdmlkZXI+PigpIHt9KQorICAgICAgICAgICAgICAgICAgICAvLyBGaWx0ZXJpbmdHcmFwaFRyYW5zZm9ybWVyLgorICAgICAgICAgICAgICAgICAgICAudG8obmV3IEdlbmVyaWNUeXBlPE9iamVjdEdyYXBoVHJhbnNmb3JtZXI8RmlsdGVyUHJvdmlkZXI+PigpIHt9KQorICAgICAgICAgICAgICAgICAgICAvLyBTY29wZS4KKyAgICAgICAgICAgICAgICAgICAgLmluKFNpbmdsZXRvbi5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYWNrc29uL2ludGVybmFsL0phY2tzb25PYmplY3RQcm92aWRlci5qYXZhIGIvbWVkaWEvanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamFja3Nvbi9pbnRlcm5hbC9KYWNrc29uT2JqZWN0UHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzQxNDg2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamFja3Nvbi9pbnRlcm5hbC9KYWNrc29uT2JqZWN0UHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDIyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5zcGkuQWJzdHJhY3RPYmplY3RQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5zcGkuT2JqZWN0R3JhcGg7CisKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uY29yZS5Kc29uR2VuZXJhdG9yOworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5Kc29uTWFwcGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuU2VyaWFsaXplclByb3ZpZGVyOworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5qc29uRm9ybWF0VmlzaXRvcnMuSnNvbk9iamVjdEZvcm1hdFZpc2l0b3I7CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLm5vZGUuT2JqZWN0Tm9kZTsKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuc2VyLkJlYW5Qcm9wZXJ0eUZpbHRlcjsKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuc2VyLkZpbHRlclByb3ZpZGVyOworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5zZXIuUHJvcGVydHlGaWx0ZXI7CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLnNlci5Qcm9wZXJ0eVdyaXRlcjsKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuc2VyLmltcGwuU2ltcGxlQmVhblByb3BlcnR5RmlsdGVyOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitmaW5hbCBjbGFzcyBKYWNrc29uT2JqZWN0UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdE9iamVjdFByb3ZpZGVyPEZpbHRlclByb3ZpZGVyPiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRmlsdGVyUHJvdmlkZXIgdHJhbnNmb3JtKGZpbmFsIE9iamVjdEdyYXBoIGdyYXBoKSB7CisgICAgICAgIC8vIFJvb3QgZW50aXR5LgorICAgICAgICBmaW5hbCBGaWx0ZXJpbmdQcm9wZXJ0eUZpbHRlciByb290ID0gbmV3IEZpbHRlcmluZ1Byb3BlcnR5RmlsdGVyKGdyYXBoLmdldEVudGl0eUNsYXNzKCksCisgICAgICAgICAgICAgICAgZ3JhcGguZ2V0RmllbGRzKCksCisgICAgICAgICAgICAgICAgY3JlYXRlU3ViZmlsdGVycyhncmFwaC5nZXRFbnRpdHlDbGFzcygpLCBncmFwaC5nZXRTdWJncmFwaHMoKSkpOworCisgICAgICAgIHJldHVybiBuZXcgRmlsdGVyaW5nRmlsdGVyUHJvdmlkZXIocm9vdCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBGaWx0ZXJpbmdQcm9wZXJ0eUZpbHRlcj4gY3JlYXRlU3ViZmlsdGVycyhmaW5hbCBDbGFzczw/PiBlbnRpdHlDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdEdyYXBoPiBlbnRpdHlTdWJncmFwaHMpIHsKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgRmlsdGVyaW5nUHJvcGVydHlGaWx0ZXI+IHN1YmZpbHRlcnMgPSBuZXcgSGFzaE1hcDw+KCk7CisKKyAgICAgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8U3RyaW5nLCBPYmplY3RHcmFwaD4gZW50cnkgOiBlbnRpdHlTdWJncmFwaHMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZpZWxkTmFtZSA9IGVudHJ5LmdldEtleSgpOworICAgICAgICAgICAgZmluYWwgT2JqZWN0R3JhcGggZ3JhcGggPSBlbnRyeS5nZXRWYWx1ZSgpOworCisgICAgICAgICAgICAvLyBTdWJncmFwaCBGaWVsZHMuCisgICAgICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3RHcmFwaD4gc3ViZ3JhcGhzID0gZ3JhcGguZ2V0U3ViZ3JhcGhzKGZpZWxkTmFtZSk7CisKKyAgICAgICAgICAgIE1hcDxTdHJpbmcsIEZpbHRlcmluZ1Byb3BlcnR5RmlsdGVyPiBzdWJTdWJmaWx0ZXJzID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICAgICAgaWYgKCFzdWJncmFwaHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gc3ViRW50aXR5Q2xhc3MgPSBncmFwaC5nZXRFbnRpdHlDbGFzcygpOworICAgICAgICAgICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IHByb2Nlc3NlZCA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbihzdWJncmFwaElkZW50aWZpZXIoZW50aXR5Q2xhc3MsIGZpZWxkTmFtZSwgc3ViRW50aXR5Q2xhc3MpKTsKKworICAgICAgICAgICAgICAgIHN1YlN1YmZpbHRlcnMgPSBjcmVhdGVTdWJmaWx0ZXJzKGZpZWxkTmFtZSwgc3ViRW50aXR5Q2xhc3MsIHN1YmdyYXBocywgcHJvY2Vzc2VkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgRmlsdGVyaW5nUHJvcGVydHlGaWx0ZXIgZmlsdGVyID0gbmV3IEZpbHRlcmluZ1Byb3BlcnR5RmlsdGVyKGdyYXBoLmdldEVudGl0eUNsYXNzKCksCisgICAgICAgICAgICAgICAgICAgIGdyYXBoLmdldEZpZWxkcyhmaWVsZE5hbWUpLCBzdWJTdWJmaWx0ZXJzKTsKKworICAgICAgICAgICAgc3ViZmlsdGVycy5wdXQoZmllbGROYW1lLCBmaWx0ZXIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHN1YmZpbHRlcnM7CisgICAgfQorCisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBGaWx0ZXJpbmdQcm9wZXJ0eUZpbHRlcj4gY3JlYXRlU3ViZmlsdGVycyhmaW5hbCBTdHJpbmcgcGFyZW50LCBmaW5hbCBDbGFzczw/PiBlbnRpdHlDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdEdyYXBoPiBlbnRpdHlTdWJncmFwaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiBwcm9jZXNzZWQpIHsKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgRmlsdGVyaW5nUHJvcGVydHlGaWx0ZXI+IHN1YmZpbHRlcnMgPSBuZXcgSGFzaE1hcDw+KCk7CisKKyAgICAgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8U3RyaW5nLCBPYmplY3RHcmFwaD4gZW50cnkgOiBlbnRpdHlTdWJncmFwaHMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZpZWxkTmFtZSA9IGVudHJ5LmdldEtleSgpOworICAgICAgICAgICAgZmluYWwgT2JqZWN0R3JhcGggZ3JhcGggPSBlbnRyeS5nZXRWYWx1ZSgpOworCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGF0aCA9IHBhcmVudCArICIuIiArIGZpZWxkTmFtZTsKKworICAgICAgICAgICAgLy8gU3ViZ3JhcGggRmllbGRzLgorICAgICAgICAgICAgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0R3JhcGg+IHN1YmdyYXBocyA9IGdyYXBoLmdldFN1YmdyYXBocyhwYXRoKTsKKworICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gc3ViRW50aXR5Q2xhc3MgPSBncmFwaC5nZXRFbnRpdHlDbGFzcygpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByb2Nlc3NlZFN1YmdyYXBoID0gc3ViZ3JhcGhJZGVudGlmaWVyKGVudGl0eUNsYXNzLCBmaWVsZE5hbWUsIHN1YkVudGl0eUNsYXNzKTsKKworICAgICAgICAgICAgTWFwPFN0cmluZywgRmlsdGVyaW5nUHJvcGVydHlGaWx0ZXI+IHN1YlN1YmZpbHRlcnMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgICAgICBpZiAoIXN1YmdyYXBocy5pc0VtcHR5KCkgJiYgIXByb2Nlc3NlZC5jb250YWlucyhwcm9jZXNzZWRTdWJncmFwaCkpIHsKKyAgICAgICAgICAgICAgICAvLyBkdXBsaWNhdGUgcHJvY2Vzc2VkIHNldCBzbyB0aGF0IGVsZW1lbnRzIGluIGRpZmZlcmVudCBzdWJ0cmVlcyBhcmVuJ3Qgc2tpcHBlZCAoSkVSU0VZLTI4OTIpCisgICAgICAgICAgICAgICAgZmluYWwgU2V0PFN0cmluZz4gc3ViUHJvY2Vzc2VkID0gaW1tdXRhYmxlU2V0T2YocHJvY2Vzc2VkLCBwcm9jZXNzZWRTdWJncmFwaCk7CisKKyAgICAgICAgICAgICAgICBzdWJTdWJmaWx0ZXJzID0gY3JlYXRlU3ViZmlsdGVycyhwYXRoLCBzdWJFbnRpdHlDbGFzcywgc3ViZ3JhcGhzLCBzdWJQcm9jZXNzZWQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdWJmaWx0ZXJzLnB1dChmaWVsZE5hbWUsIG5ldyBGaWx0ZXJpbmdQcm9wZXJ0eUZpbHRlcihncmFwaC5nZXRFbnRpdHlDbGFzcygpLCBncmFwaC5nZXRGaWVsZHMocGF0aCksIHN1YlN1YmZpbHRlcnMpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBzdWJmaWx0ZXJzOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEZpbHRlcmluZ0ZpbHRlclByb3ZpZGVyIGV4dGVuZHMgRmlsdGVyUHJvdmlkZXIgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgRmlsdGVyaW5nUHJvcGVydHlGaWx0ZXIgcm9vdDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdGFjazxGaWx0ZXJpbmdQcm9wZXJ0eUZpbHRlcj4gc3RhY2sgPSBuZXcgU3RhY2s8PigpOworCisgICAgICAgIHB1YmxpYyBGaWx0ZXJpbmdGaWx0ZXJQcm92aWRlcihmaW5hbCBGaWx0ZXJpbmdQcm9wZXJ0eUZpbHRlciByb290KSB7CisgICAgICAgICAgICB0aGlzLnJvb3QgPSByb290OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCZWFuUHJvcGVydHlGaWx0ZXIgZmluZEZpbHRlcihmaW5hbCBPYmplY3QgZmlsdGVySWQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiQWNjZXNzIHRvIGRlcHJlY2F0ZWQgZmlsdGVycyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFByb3BlcnR5RmlsdGVyIGZpbmRQcm9wZXJ0eUZpbHRlcihmaW5hbCBPYmplY3QgZmlsdGVySWQsIGZpbmFsIE9iamVjdCB2YWx1ZVRvRmlsdGVyKSB7CisgICAgICAgICAgICBpZiAoZmlsdGVySWQgaW5zdGFuY2VvZiBTdHJpbmcpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaWQgPSAoU3RyaW5nKSBmaWx0ZXJJZDsKKworICAgICAgICAgICAgICAgIC8vIEZpbHRlcklkIHNob3VsZCByZXByZXNlbnQgYSBjbGFzcyBvbmx5IGluIGNhc2Ugb2Ygcm9vdCBlbnRpdHkgaXMgbWFyc2hhbGxlZC4KKyAgICAgICAgICAgICAgICBpZiAoaWQuZXF1YWxzKHJvb3QuZ2V0RW50aXR5Q2xhc3MoKS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YWNrLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGFjay5wdXNoKHJvb3QpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHdoaWxlICghc3RhY2suaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIEZpbHRlcmluZ1Byb3BlcnR5RmlsdGVyIHBlZWsgPSBzdGFjay5wZWVrKCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIEZpbHRlcmluZ1Byb3BlcnR5RmlsdGVyIHN1YmZpbHRlciA9IHBlZWsuZmluZFN1YmZpbHRlcihpZCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN1YmZpbHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFjay5wdXNoKHN1YmZpbHRlcik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5lZWQgc3BlY2lhbCBoYW5kbGluZyBmb3IgbWFwcyBoZXJlIC0gbWFwIGtleXMgY2FuIGJlIGZpbHRlcmVkIGFzIHdlbGwgc28gd2UganVzdCBzYXkgdGhhdCBldmVyeSBrZXkgaXMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG93ZWQuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWVUb0ZpbHRlciBpbnN0YW5jZW9mIE1hcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsID8+IG1hcCA9IChNYXA8U3RyaW5nLCA/PikgdmFsdWVUb0ZpbHRlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZpbHRlcmluZ1Byb3BlcnR5RmlsdGVyKE1hcC5jbGFzcywgbWFwLmtleVNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuPFN0cmluZywgRmlsdGVyaW5nUHJvcGVydHlGaWx0ZXI+ZW1wdHlNYXAoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3ViZmlsdGVyOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2sucG9wKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gU2ltcGxlQmVhblByb3BlcnR5RmlsdGVyLmZpbHRlck91dEFsbEV4Y2VwdCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgRmlsdGVyaW5nUHJvcGVydHlGaWx0ZXIgaW1wbGVtZW50cyBQcm9wZXJ0eUZpbHRlciB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDbGFzczw/PiBlbnRpdHlDbGFzczsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFNldDxTdHJpbmc+IGZpZWxkczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBGaWx0ZXJpbmdQcm9wZXJ0eUZpbHRlcj4gc3ViZmlsdGVyczsKKworICAgICAgICBwcml2YXRlIEZpbHRlcmluZ1Byb3BlcnR5RmlsdGVyKGZpbmFsIENsYXNzPD8+IGVudGl0eUNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IGZpZWxkcywgZmluYWwgTWFwPFN0cmluZywgRmlsdGVyaW5nUHJvcGVydHlGaWx0ZXI+IHN1YmZpbHRlcnMpIHsKKyAgICAgICAgICAgIHRoaXMuZW50aXR5Q2xhc3MgPSBlbnRpdHlDbGFzczsKKworICAgICAgICAgICAgdGhpcy5maWVsZHMgPSBmaWVsZHM7CisgICAgICAgICAgICB0aGlzLnN1YmZpbHRlcnMgPSBzdWJmaWx0ZXJzOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGluY2x1ZGUoZmluYWwgU3RyaW5nIGZpZWxkTmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIGZpZWxkcy5jb250YWlucyhmaWVsZE5hbWUpIHx8IHN1YmZpbHRlcnMuY29udGFpbnNLZXkoZmllbGROYW1lKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemVBc0ZpZWxkKGZpbmFsIE9iamVjdCBwb2pvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEpzb25HZW5lcmF0b3IgamdlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZXJpYWxpemVyUHJvdmlkZXIgcHJvdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBQcm9wZXJ0eVdyaXRlciB3cml0ZXIpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgaWYgKGluY2x1ZGUod3JpdGVyLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIuc2VyaWFsaXplQXNGaWVsZChwb2pvLCBqZ2VuLCBwcm92KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXJpYWxpemVBc0VsZW1lbnQoZmluYWwgT2JqZWN0IGVsZW1lbnRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEpzb25HZW5lcmF0b3IgamdlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNlcmlhbGl6ZXJQcm92aWRlciBwcm92LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUHJvcGVydHlXcml0ZXIgd3JpdGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChpbmNsdWRlKHdyaXRlci5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgd3JpdGVyLnNlcmlhbGl6ZUFzRWxlbWVudChlbGVtZW50VmFsdWUsIGpnZW4sIHByb3YpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGRlcG9zaXRTY2hlbWFQcm9wZXJ0eShmaW5hbCBQcm9wZXJ0eVdyaXRlciB3cml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3ROb2RlIHByb3BlcnRpZXNOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU2VyaWFsaXplclByb3ZpZGVyIHByb3ZpZGVyKSB0aHJvd3MgSnNvbk1hcHBpbmdFeGNlcHRpb24geworICAgICAgICAgICAgaWYgKGluY2x1ZGUod3JpdGVyLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIuZGVwb3NpdFNjaGVtYVByb3BlcnR5KHByb3BlcnRpZXNOb2RlLCBwcm92aWRlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZGVwb3NpdFNjaGVtYVByb3BlcnR5KGZpbmFsIFByb3BlcnR5V3JpdGVyIHdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEpzb25PYmplY3RGb3JtYXRWaXNpdG9yIG9iamVjdFZpc2l0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZXJpYWxpemVyUHJvdmlkZXIgcHJvdmlkZXIpIHRocm93cyBKc29uTWFwcGluZ0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoaW5jbHVkZSh3cml0ZXIuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgIHdyaXRlci5kZXBvc2l0U2NoZW1hUHJvcGVydHkob2JqZWN0VmlzaXRvciwgcHJvdmlkZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEZpbHRlcmluZ1Byb3BlcnR5RmlsdGVyIGZpbmRTdWJmaWx0ZXIoZmluYWwgU3RyaW5nIGZpZWxkTmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIHN1YmZpbHRlcnMuZ2V0KGZpZWxkTmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ2xhc3M8Pz4gZ2V0RW50aXR5Q2xhc3MoKSB7CisgICAgICAgICAgICByZXR1cm4gZW50aXR5Q2xhc3M7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYWNrc29uL2ludGVybmFsL2phY2tzb24vamF4cnMvYW5ub3RhdGlvbi9KYWNrc29uRmVhdHVyZXMuamF2YSBiL21lZGlhL2pzb24tamFja3Nvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2phY2tzb24vaW50ZXJuYWwvamFja3Nvbi9qYXhycy9hbm5vdGF0aW9uL0phY2tzb25GZWF0dXJlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNzkzMTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYWNrc29uL2ludGVybmFsL2phY2tzb24vamF4cnMvYW5ub3RhdGlvbi9KYWNrc29uRmVhdHVyZXMuamF2YQpAQCAtMCwwICsxLDM5IEBACitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uaW50ZXJuYWwuamFja3Nvbi5qYXhycy5hbm5vdGF0aW9uOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuRGVzZXJpYWxpemF0aW9uRmVhdHVyZTsKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuU2VyaWFsaXphdGlvbkZlYXR1cmU7CisKKy8qKgorICogQW5ub3RhdGlvbiB0aGF0IGNhbiBiZSB1c2VkIGVuYWJsZSBhbmQvb3IgZGlzYWJsZSB2YXJpb3VzCisgKiBmZWF0dXJlcyBmb3IgPGNvZGU+T2JqZWN0UmVhZGVyPC9jb2RlPnMgYW5kIDxjb2RlPk9iamVjdFdyaXRlcjwvY29kZT5zLgorICovCitAVGFyZ2V0KHtFbGVtZW50VHlwZS5BTk5PVEFUSU9OX1RZUEUsIEVsZW1lbnRUeXBlLk1FVEhPRCB9KQorQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0Bjb20uZmFzdGVyeG1sLmphY2tzb24uYW5ub3RhdGlvbi5KYWNrc29uQW5ub3RhdGlvbgorcHVibGljIEBpbnRlcmZhY2UgSmFja3NvbkZlYXR1cmVzCit7CisgICAgLyoqCisgICAgICogRGVzZXJpYWxpemF0aW9uIGZlYXR1cmVzIHRvIGVuYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRGVzZXJpYWxpemF0aW9uRmVhdHVyZVtdIGRlc2VyaWFsaXphdGlvbkVuYWJsZSgpIGRlZmF1bHQgeyB9OworCisgICAgLyoqCisgICAgICogRGVzZXJpYWxpemF0aW9uIGZlYXR1cmVzIHRvIGRpc2FibGUuCisgICAgICovCisgICAgcHVibGljIERlc2VyaWFsaXphdGlvbkZlYXR1cmVbXSBkZXNlcmlhbGl6YXRpb25EaXNhYmxlKCkgZGVmYXVsdCB7IH07CisgICAgCisgICAgLyoqCisgICAgICogU2VyaWFsaXphdGlvbiBmZWF0dXJlcyB0byBlbmFibGUuCisgICAgICovCisgICAgcHVibGljIFNlcmlhbGl6YXRpb25GZWF0dXJlW10gc2VyaWFsaXphdGlvbkVuYWJsZSgpIGRlZmF1bHQgeyB9OworCisgICAgLyoqCisgICAgICogU2VyaWFsaXphdGlvbiBmZWF0dXJlcyB0byBkaXNhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBTZXJpYWxpemF0aW9uRmVhdHVyZVtdIHNlcmlhbGl6YXRpb25EaXNhYmxlKCkgZGVmYXVsdCB7IH07Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYWNrc29uL2ludGVybmFsL2phY2tzb24vamF4cnMvYmFzZS9Kc29uTWFwcGluZ0V4Y2VwdGlvbk1hcHBlci5qYXZhIGIvbWVkaWEvanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamFja3Nvbi9pbnRlcm5hbC9qYWNrc29uL2pheHJzL2Jhc2UvSnNvbk1hcHBpbmdFeGNlcHRpb25NYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2NmZDNkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamFja3Nvbi9pbnRlcm5hbC9qYWNrc29uL2pheHJzL2Jhc2UvSnNvbk1hcHBpbmdFeGNlcHRpb25NYXBwZXIuamF2YQpAQCAtMCwwICsxLDIyIEBACitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uaW50ZXJuYWwuamFja3Nvbi5qYXhycy5iYXNlOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuRXhjZXB0aW9uTWFwcGVyOworCitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLkpzb25NYXBwaW5nRXhjZXB0aW9uOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIGlmIHtAbGluayBFeGNlcHRpb25NYXBwZXJ9IHRvIHNlbmQgZG93biBhICI0MDAgQmFkIFJlcXVlc3QiCisgKiByZXNwb25zZSBpbiB0aGUgZXZlbnQgdGhhdCB1bm1hcHBhYmxlIEpTT04gaXMgcmVjZWl2ZWQuCisgKjxwPgorICogTm90ZSB0aGF0IHtAbGluayBqYXZheC53cy5ycy5leHQuUHJvdmlkZXJ9IGFubm90YXRpb24gd2FzIGluY2x1ZGUgdXAgdG8KKyAqIEphY2tzb24gMi43LCBidXQgcmVtb3ZlZCBmcm9tIDIuOCAoYXMgcGVyIFtqYXhycy1wcm92aWRlcnMjMjJdCisgKgorICogQHNpbmNlIDIuMgorICovCitwdWJsaWMgY2xhc3MgSnNvbk1hcHBpbmdFeGNlcHRpb25NYXBwZXIgaW1wbGVtZW50cyBFeGNlcHRpb25NYXBwZXI8SnNvbk1hcHBpbmdFeGNlcHRpb24+IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzcG9uc2UgdG9SZXNwb25zZShKc29uTWFwcGluZ0V4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyhSZXNwb25zZS5TdGF0dXMuQkFEX1JFUVVFU1QpLmVudGl0eShleGNlcHRpb24uZ2V0TWVzc2FnZSgpKS50eXBlKCJ0ZXh0L3BsYWluIikuYnVpbGQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYWNrc29uL2ludGVybmFsL2phY2tzb24vamF4cnMvYmFzZS9Kc29uUGFyc2VFeGNlcHRpb25NYXBwZXIuamF2YSBiL21lZGlhL2pzb24tamFja3Nvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2phY2tzb24vaW50ZXJuYWwvamFja3Nvbi9qYXhycy9iYXNlL0pzb25QYXJzZUV4Y2VwdGlvbk1hcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmOGQ1NWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYWNrc29uL2ludGVybmFsL2phY2tzb24vamF4cnMvYmFzZS9Kc29uUGFyc2VFeGNlcHRpb25NYXBwZXIuamF2YQpAQCAtMCwwICsxLDIyIEBACitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uaW50ZXJuYWwuamFja3Nvbi5qYXhycy5iYXNlOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuRXhjZXB0aW9uTWFwcGVyOworCitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmNvcmUuSnNvblBhcnNlRXhjZXB0aW9uOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHtAbGluayBFeGNlcHRpb25NYXBwZXJ9IHRvIHNlbmQgZG93biBhICI0MDAgQmFkIFJlcXVlc3QiCisgKiBpbiB0aGUgZXZlbnQgdW5wYXJzYWJsZSBKU09OIGlzIHJlY2VpdmVkLgorICo8cD4KKyAqIE5vdGUgdGhhdCB7QGxpbmsgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyfSBhbm5vdGF0aW9uIHdhcyBpbmNsdWRlIHVwIHRvCisgKiBKYWNrc29uIDIuNywgYnV0IHJlbW92ZWQgZnJvbSAyLjggKGFzIHBlciBbamF4cnMtcHJvdmlkZXJzIzIyXQorICoKKyAqIEBzaW5jZSAyLjIKKyAqLworcHVibGljIGNsYXNzIEpzb25QYXJzZUV4Y2VwdGlvbk1hcHBlciBpbXBsZW1lbnRzIEV4Y2VwdGlvbk1hcHBlcjxKc29uUGFyc2VFeGNlcHRpb24+IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzcG9uc2UgdG9SZXNwb25zZShKc29uUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoUmVzcG9uc2UuU3RhdHVzLkJBRF9SRVFVRVNUKS5lbnRpdHkoZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSkudHlwZSgidGV4dC9wbGFpbiIpLmJ1aWxkKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamFja3Nvbi9pbnRlcm5hbC9qYWNrc29uL2pheHJzL2Jhc2UvUHJvdmlkZXJCYXNlLmphdmEgYi9tZWRpYS9qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYWNrc29uL2ludGVybmFsL2phY2tzb24vamF4cnMvYmFzZS9Qcm92aWRlckJhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzBlMGY4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamFja3Nvbi9pbnRlcm5hbC9qYWNrc29uL2pheHJzL2Jhc2UvUHJvdmlkZXJCYXNlLmphdmEKQEAgLTAsMCArMSwxMDc5IEBACitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uaW50ZXJuYWwuamFja3Nvbi5qYXhycy5iYXNlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTm9Db250ZW50RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5TdHJlYW1pbmdPdXRwdXQ7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uaW50ZXJuYWwuamFja3Nvbi5qYXhycy5jZmcuQW5ub3RhdGlvbkJ1bmRsZUtleTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uLmludGVybmFsLmphY2tzb24uamF4cnMuY2ZnLkFubm90YXRpb25zOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uaW50ZXJuYWwuamFja3Nvbi5qYXhycy5jZmcuRW5kcG9pbnRDb25maWdCYXNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uaW50ZXJuYWwuamFja3Nvbi5qYXhycy5jZmcuSmF4UlNGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uaW50ZXJuYWwuamFja3Nvbi5qYXhycy5jZmcuTWFwcGVyQ29uZmlndXJhdG9yQmFzZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uLmludGVybmFsLmphY2tzb24uamF4cnMuY2ZnLk9iamVjdFJlYWRlckluamVjdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uaW50ZXJuYWwuamFja3Nvbi5qYXhycy5jZmcuT2JqZWN0UmVhZGVyTW9kaWZpZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamFja3Nvbi5pbnRlcm5hbC5qYWNrc29uLmpheHJzLmNmZy5PYmplY3RXcml0ZXJJbmplY3RvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uLmludGVybmFsLmphY2tzb24uamF4cnMuY2ZnLk9iamVjdFdyaXRlck1vZGlmaWVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uaW50ZXJuYWwuamFja3Nvbi5qYXhycy51dGlsLkNsYXNzS2V5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uaW50ZXJuYWwuamFja3Nvbi5qYXhycy51dGlsLkxSVU1hcDsKKworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5jb3JlLkpzb25FbmNvZGluZzsKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uY29yZS5Kc29uR2VuZXJhdG9yOworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5jb3JlLkpzb25QYXJzZXI7CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmNvcmUuVmVyc2lvbmVkOworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5EZXNlcmlhbGl6YXRpb25GZWF0dXJlOworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5KYXZhVHlwZTsKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuTWFwcGluZ0l0ZXJhdG9yOworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5PYmplY3RNYXBwZXI7CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLk9iamVjdFJlYWRlcjsKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuT2JqZWN0V3JpdGVyOworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5TZXJpYWxpemF0aW9uRmVhdHVyZTsKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQudHlwZS5UeXBlRmFjdG9yeTsKKworcHVibGljIGFic3RyYWN0IGNsYXNzIFByb3ZpZGVyQmFzZTwKKyAgICBUSElTIGV4dGVuZHMgUHJvdmlkZXJCYXNlPFRISVMsIE1BUFBFUiwgRVBfQ09ORklHLCBNQVBQRVJfQ09ORklHPiwKKyAgICBNQVBQRVIgZXh0ZW5kcyBPYmplY3RNYXBwZXIsCisgICAgRVBfQ09ORklHIGV4dGVuZHMgRW5kcG9pbnRDb25maWdCYXNlPEVQX0NPTkZJRz4sCisgICAgTUFQUEVSX0NPTkZJRyBleHRlbmRzIE1hcHBlckNvbmZpZ3VyYXRvckJhc2U8TUFQUEVSX0NPTkZJRyxNQVBQRVI+Cis+CisgICAgaW1wbGVtZW50cworICAgICAgICBNZXNzYWdlQm9keVJlYWRlcjxPYmplY3Q+LAorICAgICAgICBNZXNzYWdlQm9keVdyaXRlcjxPYmplY3Q+LAorICAgICAgICBWZXJzaW9uZWQKK3sKKyAgICAvKioKKyAgICAgKiBUaGlzIGhlYWRlciBpcyB1c2VmdWwgb24gV2luZG93cywgdHJ5aW5nIHRvIGRlYWwgd2l0aCBwb3RlbnRpYWwgWFNTIGF0dGFja3MuCisgICAgICovCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgSEVBREVSX0NPTlRFTlRfVFlQRV9PUFRJT05TID0gIlgtQ29udGVudC1UeXBlLU9wdGlvbnMiOworCisgICAgLyoqCisgICAgICogTG9va3MgbGlrZSB3ZSBuZWVkIHRvIHdvcnJ5IGFib3V0IGFjY2lkZW50YWwKKyAgICAgKiAgIGRhdGEgYmluZGluZyBmb3IgdHlwZXMgd2Ugc2hvdWxkbid0IGJlIGhhbmRsaW5nLiBUaGlzIGlzCisgICAgICogICBwcm9iYWJseSBub3QgYSB2ZXJ5IGdvb2Qgd2F5IHRvIGRvIGl0LCBidXQgbGV0J3Mgc3RhcnQgYnkKKyAgICAgKiAgIGJsYWNrbGlzdGluZyB0aGluZ3Mgd2UgYXJlIG5vdCB0byBoYW5kbGUuCisgICAgICo8cD4KKyAgICAgKiAgKHdoeSBDbGFzc0tleT8gc2luY2UgcGxhaW4gb2xkIENsYXNzIGhhcyBubyBoYXNoQ29kZSgpIGRlZmluZWQsCisgICAgICogIGxvb2t1cHMgYXJlIHBhaW5mdWxseSBzbG93KQorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgSGFzaFNldDxDbGFzc0tleT4gREVGQVVMVF9VTlRPVUNIQUJMRVMgPSBuZXcgSGFzaFNldDxDbGFzc0tleT4oKTsKKyAgICBzdGF0aWMgeworICAgICAgICAvLyBGaXJzdCwgSS9PIHRoaW5ncyAoZGlyZWN0IG1hdGNoZXMpCisgICAgICAgIERFRkFVTFRfVU5UT1VDSEFCTEVTLmFkZChuZXcgQ2xhc3NLZXkoSW5wdXRTdHJlYW0uY2xhc3MpKTsKKyAgICAgICAgREVGQVVMVF9VTlRPVUNIQUJMRVMuYWRkKG5ldyBDbGFzc0tleShSZWFkZXIuY2xhc3MpKTsKKyAgICAgICAgREVGQVVMVF9VTlRPVUNIQUJMRVMuYWRkKG5ldyBDbGFzc0tleShPdXRwdXRTdHJlYW0uY2xhc3MpKTsKKyAgICAgICAgREVGQVVMVF9VTlRPVUNIQUJMRVMuYWRkKG5ldyBDbGFzc0tleShXcml0ZXIuY2xhc3MpKTsKKworICAgICAgICAvLyB0aGVuIHNvbWUgcHJpbWl0aXZlIHR5cGVzCisgICAgICAgIERFRkFVTFRfVU5UT1VDSEFCTEVTLmFkZChuZXcgQ2xhc3NLZXkoY2hhcltdLmNsYXNzKSk7CisKKyAgICAgICAgLyogMjctQXByLTIwMTIsIHRhdHU6IFVnaC4gQXMgcGVyCisgICAgICAgICAqICAgW2h0dHBzOi8vZ2l0aHViLmNvbS9GYXN0ZXJYTUwvamFja3Nvbi1qYXhycy1qc29uLXByb3ZpZGVyL2lzc3Vlcy8xMl0KKyAgICAgICAgICogIGJldHRlciByZXZlcnQgdGhpcyBiYWNrLCB0byBtYWtlIHRoZW0gdW50b3VjaGFibGUgYWdhaW4uCisgICAgICAgICAqLworICAgICAgICBERUZBVUxUX1VOVE9VQ0hBQkxFUy5hZGQobmV3IENsYXNzS2V5KFN0cmluZy5jbGFzcykpOworICAgICAgICBERUZBVUxUX1VOVE9VQ0hBQkxFUy5hZGQobmV3IENsYXNzS2V5KGJ5dGVbXS5jbGFzcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZXNlIGFyZSBjbGFzc2VzIHRoYXQgd2UgbmV2ZXIgdXNlIGZvciByZWFkaW5nCisgICAgICogKG5ldmVyIHRyeSB0byBkZXNlcmlhbGl6ZSBpbnN0YW5jZXMgb2YgdGhlc2UgdHlwZXMpLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgQ2xhc3M8Pz5bXSBERUZBVUxUX1VOUkVBREFCTEVTID0gbmV3IENsYXNzPD8+W10geworICAgICAgICBJbnB1dFN0cmVhbS5jbGFzcywgUmVhZGVyLmNsYXNzCisgICAgfTsKKworICAgIC8qKgorICAgICAqIFRoZXNlIGFyZSBjbGFzc2VzIHRoYXQgd2UgbmV2ZXIgdXNlIGZvciB3cml0aW5nCisgICAgICogKG5ldmVyIHRyeSB0byBzZXJpYWxpemUgaW5zdGFuY2VzIG9mIHRoZXNlIHR5cGVzKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIENsYXNzPD8+W10gREVGQVVMVF9VTldSSVRBQkxFUyA9IG5ldyBDbGFzczw/PltdIHsKKyAgICAgICAgSW5wdXRTdHJlYW0uY2xhc3MsIC8vIGFzIHBlciBbSXNzdWUjMTldCisgICAgICAgIE91dHB1dFN0cmVhbS5jbGFzcywgV3JpdGVyLmNsYXNzLAorICAgICAgICBTdHJlYW1pbmdPdXRwdXQuY2xhc3MsIFJlc3BvbnNlLmNsYXNzCisgICAgfTsKKworICAgIHByb3RlY3RlZCBmaW5hbCBzdGF0aWMgaW50IEpBWFJTX0ZFQVRVUkVfREVGQVVMVFMgPSBKYXhSU0ZlYXR1cmUuY29sbGVjdERlZmF1bHRzKCk7CisgICAgCisgICAgLyoKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIC8qIEdlbmVyYWwgY29uZmlndXJhdGlvbgorICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgb2JqZWN0IHVzZWQgZm9yIGVuY2Fwc3VsYXRpbmcgY29uZmlndXJhdGlvbiBhc3BlY3RzCisgICAgICogb2Yge0BsaW5rIE9iamVjdE1hcHBlcn0KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgTUFQUEVSX0NPTkZJRyBfbWFwcGVyQ29uZmlnOworICAgIAorICAgIC8qKgorICAgICAqIE1hcCB0aGF0IGNvbnRhaW5zIG92ZXJyaWRlcyB0byBkZWZhdWx0IGxpc3Qgb2YgdW50b3VjaGFibGUKKyAgICAgKiB0eXBlczogPGNvZGU+dHJ1ZTwvY29kZT4gbWVhbmluZyB0aGF0IGVudHJ5IGlzIHVudG91Y2hhYmxlLAorICAgICAqIDxjb2RlPmZhbHNlPC9jb2RlPiB0aGF0IGlzIGlzIG5vdC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSGFzaE1hcDxDbGFzc0tleSxCb29sZWFuPiBfY2ZnQ3VzdG9tVW50b3VjaGFibGVzOworCisgICAgLyoqCisgICAgICogV2hldGhlciB3ZSB3YW50IHRvIGFjdHVhbGx5IGNoZWNrIHRoYXQgSmFja3NvbiBoYXMKKyAgICAgKiBhIHNlcmlhbGl6ZXIgZm9yIGdpdmVuIHR5cGUuIFNpbmNlIHRoaXMgc2hvdWxkIGdlbmVyYWxseQorICAgICAqIGJlIHRoZSBjYXNlIChkdWUgdG8gYXV0by1kaXNjb3ZlcnkpIGFuZCBzaW5jZSB0aGUgY2FsbAorICAgICAqIHRvIGNoZWNrIGF2YWlsYWJpbGl0eSBjYW4gYmUgYml0IGV4cGVuc2l2ZSwgZGVmYXVsdHMgdG8gZmFsc2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gX2NmZ0NoZWNrQ2FuU2VyaWFsaXplID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBXaGV0aGVyIHdlIHdhbnQgdG8gYWN0dWFsbHkgY2hlY2sgdGhhdCBKYWNrc29uIGhhcworICAgICAqIGEgZGVzZXJpYWxpemVyIGZvciBnaXZlbiB0eXBlLiBTaW5jZSB0aGlzIHNob3VsZCBnZW5lcmFsbHkKKyAgICAgKiBiZSB0aGUgY2FzZSAoZHVlIHRvIGF1dG8tZGlzY292ZXJ5KSBhbmQgc2luY2UgdGhlIGNhbGwKKyAgICAgKiB0byBjaGVjayBhdmFpbGFiaWxpdHkgY2FuIGJlIGJpdCBleHBlbnNpdmUsIGRlZmF1bHRzIHRvIGZhbHNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIF9jZmdDaGVja0NhbkRlc2VyaWFsaXplID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBGZWF0dXJlIGZsYWdzIHNldC4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgMi4zCisgICAgICovCisgICAgcHJvdGVjdGVkIGludCBfamF4UlNGZWF0dXJlczsKKworICAgIC8qKgorICAgICAqIFZpZXcgdG8gdXNlIGZvciByZWFkaW5nIGlmIG5vbmUgZGVmaW5lZCBmb3IgdGhlIGVuZCBwb2ludC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ2xhc3M8Pz4gX2RlZmF1bHRSZWFkVmlldzsKKworICAgIC8qKgorICAgICAqIFZpZXcgdG8gdXNlIGZvciB3cml0aW5nIGlmIG5vbmUgZGVmaW5lZCBmb3IgdGhlIGVuZCBwb2ludC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgQ2xhc3M8Pz4gX2RlZmF1bHRXcml0ZVZpZXc7CisgICAgCisgICAgLyoKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIC8qIEV4Y2x1ZGVkIHR5cGVzCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKi8KKworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgSGFzaFNldDxDbGFzc0tleT4gX3VudG91Y2hhYmxlcyA9IERFRkFVTFRfVU5UT1VDSEFCTEVTOworCisgICAgcHVibGljIGZpbmFsIHN0YXRpYyBDbGFzczw/PltdIF91bnJlYWRhYmxlQ2xhc3NlcyA9IERFRkFVTFRfVU5SRUFEQUJMRVM7CisKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIENsYXNzPD8+W10gX3Vud3JpdGFibGVDbGFzc2VzID0gREVGQVVMVF9VTldSSVRBQkxFUzsKKworICAgIC8qCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAvKiBCaXQgb2YgY2FjaGluZworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBDYWNoZSBmb3IgcmVzb2x2ZWQgZW5kcG9pbnQgY29uZmlndXJhdGlvbnMgd2hlbiByZWFkaW5nIEpTT04gZGF0YQorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCBMUlVNYXA8QW5ub3RhdGlvbkJ1bmRsZUtleSwgRVBfQ09ORklHPiBfcmVhZGVycworICAgICAgICA9IG5ldyBMUlVNYXA8QW5ub3RhdGlvbkJ1bmRsZUtleSwgRVBfQ09ORklHPigxNiwgMTIwKTsKKworICAgIC8qKgorICAgICAqIENhY2hlIGZvciByZXNvbHZlZCBlbmRwb2ludCBjb25maWd1cmF0aW9ucyB3aGVuIHdyaXRpbmcgSlNPTiBkYXRhCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIExSVU1hcDxBbm5vdGF0aW9uQnVuZGxlS2V5LCBFUF9DT05GSUc+IF93cml0ZXJzCisgICAgICAgID0gbmV3IExSVU1hcDxBbm5vdGF0aW9uQnVuZGxlS2V5LCBFUF9DT05GSUc+KDE2LCAxMjApOworCisgICAgcHJvdGVjdGVkIGZpbmFsIEF0b21pY1JlZmVyZW5jZTxJT0V4Y2VwdGlvbj4gX25vQ29udGVudEV4Y2VwdGlvblJlZgorICAgICAgICA9IG5ldyBBdG9taWNSZWZlcmVuY2U8SU9FeGNlcHRpb24+KCk7CisKKyAgICAvKgorICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgLyogTGlmZS1jeWNsZQorICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICovCisKKyAgICBwcm90ZWN0ZWQgUHJvdmlkZXJCYXNlKE1BUFBFUl9DT05GSUcgbWNvbmZpZykgeworICAgICAgICBfbWFwcGVyQ29uZmlnID0gbWNvbmZpZzsKKyAgICAgICAgX2pheFJTRmVhdHVyZXMgPSBKQVhSU19GRUFUVVJFX0RFRkFVTFRTOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIHRoYXQgaXMgb25seSBhZGRlZCB0byByZXNvbHZlCisgICAgICogaXNzdWUgIzEwOyBwcm9ibGVtcyB3aXRoIGNvbWJpbmF0aW9uIG9mCisgICAgICogUkVTVGVhc3kgYW5kIENESS4KKyAgICAgKiBTaG91bGQgTk9UIGJlIHVzZWQgYnkgYW55IGNvZGUgZXhwbGljaXRseTsgb25seSBleGlzdHMKKyAgICAgKiBmb3IgcHJveHkgc3VwcG9ydC4KKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZCAvLyBqdXN0IHRvIGRlbm90ZSBpdCBzaG91bGQgTk9UIGJlIGRpcmVjdGx5IGNhbGxlZDsgd2lsbCBOT1QgYmUgcmVtb3ZlZAorICAgIHByb3RlY3RlZCBQcm92aWRlckJhc2UoKSB7CisgICAgICAgIF9tYXBwZXJDb25maWcgPSBudWxsOworICAgICAgICBfamF4UlNGZWF0dXJlcyA9IEpBWFJTX0ZFQVRVUkVfREVGQVVMVFM7CisgICAgfQorICAgIAorICAgIC8qCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAvKiBDb25maWd1cmluZworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgZm9yIGRlZmluaW5nIHdoZXRoZXIgYWN0dWFsIGRldGVjdGlvbiBmb3IgZXhpc3RlbmNlIG9mCisgICAgICogYSBkZXNlcmlhbGl6ZXIgZm9yIHR5cGUgc2hvdWxkIGJlIGRvbmUgd2hlbiB7QGxpbmsgI2lzUmVhZGFibGV9CisgICAgICogaXMgY2FsbGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNoZWNrQ2FuRGVzZXJpYWxpemUoYm9vbGVhbiBzdGF0ZSkgeyBfY2ZnQ2hlY2tDYW5EZXNlcmlhbGl6ZSA9IHN0YXRlOyB9CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgZm9yIGRlZmluaW5nIHdoZXRoZXIgYWN0dWFsIGRldGVjdGlvbiBmb3IgZXhpc3RlbmNlIG9mCisgICAgICogYSBzZXJpYWxpemVyIGZvciB0eXBlIHNob3VsZCBiZSBkb25lIHdoZW4ge0BsaW5rICNpc1dyaXRlYWJsZX0KKyAgICAgKiBpcyBjYWxsZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2hlY2tDYW5TZXJpYWxpemUoYm9vbGVhbiBzdGF0ZSkgeyBfY2ZnQ2hlY2tDYW5TZXJpYWxpemUgPSBzdGF0ZTsgfQorCisgICAgLyoqCisgICAgICogTWV0aG9kIGZvciBtYXJraW5nIHNwZWNpZmllZCB0eXBlIGFzICJ1bnRvdWNoYWJsZSIsIG1lYW5pbmcgdGhhdCBwcm92aWRlcgorICAgICAqIHdpbGwgbm90IHRyeSB0byByZWFkIG9yIHdyaXRlIHZhbHVlcyBvZiB0aGlzIHR5cGUgKG9yIGl0cyBzdWJ0eXBlcykuCisgICAgICogCisgICAgICogQHBhcmFtIHR5cGUgVHlwZSB0byBjb25zaWRlciB1bnRvdWNoYWJsZTsgY2FuIGJlIGFueSBraW5kIG9mIGNsYXNzLAorICAgICAqICAgaW5jbHVkaW5nIGFic3RyYWN0IGNsYXNzIG9yIGludGVyZmFjZS4gTm8gaW5zdGFuY2Ugb2YgdGhpcyB0eXBlCisgICAgICogICAoaW5jbHVkaW5nIHN1YnR5cGVzLCBpLmUuIHR5cGVzIGFzc2lnbmFibGUgdG8gdGhpcyB0eXBlKSB3aWxsCisgICAgICogICBiZSByZWFkIG9yIHdyaXR0ZW4gYnkgcHJvdmlkZXIKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhZGRVbnRvdWNoYWJsZShDbGFzczw/PiB0eXBlKQorICAgIHsKKyAgICAgICAgaWYgKF9jZmdDdXN0b21VbnRvdWNoYWJsZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgX2NmZ0N1c3RvbVVudG91Y2hhYmxlcyA9IG5ldyBIYXNoTWFwPENsYXNzS2V5LEJvb2xlYW4+KCk7CisgICAgICAgIH0KKyAgICAgICAgX2NmZ0N1c3RvbVVudG91Y2hhYmxlcy5wdXQobmV3IENsYXNzS2V5KHR5cGUpLCBCb29sZWFuLlRSVUUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ldGhvZCBmb3IgcmVtb3ZpbmcgZGVmaW5pdGlvbiBvZiBzcGVjaWZpZWQgdHlwZSBhcyB1bnRvdWNoYWJsZToKKyAgICAgKiB1c3VhbGx5IG9ubHkgCisgICAgICogCisgICAgICogQHNpbmNlIDIuMgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHJlbW92ZVVudG91Y2hhYmxlKENsYXNzPD8+IHR5cGUpCisgICAgeworICAgICAgICBpZiAoX2NmZ0N1c3RvbVVudG91Y2hhYmxlcyA9PSBudWxsKSB7CisgICAgICAgICAgICBfY2ZnQ3VzdG9tVW50b3VjaGFibGVzID0gbmV3IEhhc2hNYXA8Q2xhc3NLZXksQm9vbGVhbj4oKTsKKyAgICAgICAgfQorICAgICAgICBfY2ZnQ3VzdG9tVW50b3VjaGFibGVzLnB1dChuZXcgQ2xhc3NLZXkodHlwZSksIEJvb2xlYW4uRkFMU0UpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBNZXRob2QgZm9yIGNvbmZpZ3VyaW5nIHdoaWNoIGFubm90YXRpb24gc2V0cyB0byB1c2UgKGluY2x1ZGluZyBub25lKS4KKyAgICAgKiBBbm5vdGF0aW9uIHNldHMgYXJlIGRlZmluZWQgaW4gb3JkZXIgZGVjcmVhc2luZyBwcmVjZWRlbmNlOyB0aGF0IGlzLAorICAgICAqIGZpcnN0IG9uZSBoYXMgdGhlIHByaW9yaXR5IG92ZXIgZm9sbG93aW5nIG9uZXMuCisgICAgICogCisgICAgICogQHBhcmFtIGFubm90YXRpb25zVG9Vc2UgT3JkZXJlZCBsaXN0IG9mIGFubm90YXRpb24gc2V0cyB0byB1c2U7IGlmIG51bGwsCisgICAgICogICAgZGVmYXVsdAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEFubm90YXRpb25zVG9Vc2UoQW5ub3RhdGlvbnNbXSBhbm5vdGF0aW9uc1RvVXNlKSB7CisgICAgICAgIF9tYXBwZXJDb25maWcuc2V0QW5ub3RhdGlvbnNUb1VzZShhbm5vdGF0aW9uc1RvVXNlKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogTWV0aG9kIHRoYXQgY2FuIGJlIHVzZWQgdG8gZGlyZWN0bHkgZGVmaW5lIHtAbGluayBPYmplY3RNYXBwZXJ9IHRvIHVzZQorICAgICAqIGZvciBzZXJpYWxpemF0aW9uIGFuZCBkZXNlcmlhbGl6YXRpb247IGlmIG51bGwsIHdpbGwgdXNlIHRoZSBzdGFuZGFyZAorICAgICAqIHByb3ZpZGVyIGRpc2NvdmVyeSBmcm9tIGNvbnRleHQgaW5zdGVhZC4gRGVmYXVsdCBzZXR0aW5nIGlzIG51bGwuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TWFwcGVyKE1BUFBFUiBtKSB7CisgICAgICAgIF9tYXBwZXJDb25maWcuc2V0TWFwcGVyKG0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ldGhvZCBmb3Igc3BlY2lmeWluZyBKU09OIFZpZXcgdG8gdXNlIGZvciByZWFkaW5nIGNvbnRlbnQKKyAgICAgKiB3aGVuIGVuZCBwb2ludCBkb2VzIG5vdCBoYXZlIGV4cGxpY2l0IFZpZXcgYW5ub3RhdGlvbnMuCisgICAgICogCisgICAgICogQHNpbmNlIDIuMworICAgICAqLworICAgIHB1YmxpYyBUSElTIHNldERlZmF1bHRSZWFkVmlldyhDbGFzczw/PiB2aWV3KSB7CisgICAgICAgIF9kZWZhdWx0UmVhZFZpZXcgPSB2aWV3OworICAgICAgICByZXR1cm4gX3RoaXMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgZm9yIHNwZWNpZnlpbmcgSlNPTiBWaWV3IHRvIHVzZSBmb3IgcmVhZGluZyBjb250ZW50CisgICAgICogd2hlbiBlbmQgcG9pbnQgZG9lcyBub3QgaGF2ZSBleHBsaWNpdCBWaWV3IGFubm90YXRpb25zLgorICAgICAqIAorICAgICAqIEBzaW5jZSAyLjMKKyAgICAgKi8KKyAgICBwdWJsaWMgVEhJUyBzZXREZWZhdWx0V3JpdGVWaWV3KENsYXNzPD8+IHZpZXcpIHsKKyAgICAgICAgX2RlZmF1bHRXcml0ZVZpZXcgPSB2aWV3OworICAgICAgICByZXR1cm4gX3RoaXMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgZm9yIHNwZWNpZnlpbmcgSlNPTiBWaWV3IHRvIHVzZSBmb3IgcmVhZGluZyBhbmQgd3JpdGluZyBjb250ZW50CisgICAgICogd2hlbiBlbmQgcG9pbnQgZG9lcyBub3QgaGF2ZSBleHBsaWNpdCBWaWV3IGFubm90YXRpb25zLgorICAgICAqIEZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvOgorICAgICAqPGNvZGU+CisgICAgICogIHNldERlZmF1bHRSZWFkVmlldyh2aWV3KTsKKyAgICAgKiAgc2V0RGVmYXVsdFdyaXRlVmlldyh2aWV3KTsKKyAgICAgKjwvY29kZT4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgMi4zCisgICAgICovCisgICAgcHVibGljIFRISVMgc2V0RGVmYXVsdFZpZXcoQ2xhc3M8Pz4gdmlldykgeworICAgICAgICBfZGVmYXVsdFJlYWRWaWV3ID0gX2RlZmF1bHRXcml0ZVZpZXcgPSB2aWV3OworICAgICAgICByZXR1cm4gX3RoaXMoKTsKKyAgICB9CisgICAgCisgICAgLy8gLy8gLy8gSmF4UlNGZWF0dXJlIGNvbmZpZworICAgIAorICAgIHB1YmxpYyBUSElTIGNvbmZpZ3VyZShKYXhSU0ZlYXR1cmUgZmVhdHVyZSwgYm9vbGVhbiBzdGF0ZSkgeworICAgICAgICByZXR1cm4gc3RhdGUgPyBlbmFibGUoZmVhdHVyZSkgOiBkaXNhYmxlKGZlYXR1cmUpOworICAgIH0KKworICAgIHB1YmxpYyBUSElTIGVuYWJsZShKYXhSU0ZlYXR1cmUgZmVhdHVyZSkgeworICAgICAgICBfamF4UlNGZWF0dXJlcyB8PSBmZWF0dXJlLmdldE1hc2soKTsKKyAgICAgICAgcmV0dXJuIF90aGlzKCk7CisgICAgfQorCisgICAgcHVibGljIFRISVMgZW5hYmxlKEpheFJTRmVhdHVyZSBmaXJzdCwgSmF4UlNGZWF0dXJlLi4uIGYyKSB7CisgICAgICAgIF9qYXhSU0ZlYXR1cmVzIHw9IGZpcnN0LmdldE1hc2soKTsKKyAgICAgICAgZm9yIChKYXhSU0ZlYXR1cmUgZiA6IGYyKSB7CisgICAgICAgICAgICBfamF4UlNGZWF0dXJlcyB8PSBmLmdldE1hc2soKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX3RoaXMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVEhJUyBkaXNhYmxlKEpheFJTRmVhdHVyZSBmZWF0dXJlKSB7CisgICAgICAgIF9qYXhSU0ZlYXR1cmVzICY9IH5mZWF0dXJlLmdldE1hc2soKTsKKyAgICAgICAgcmV0dXJuIF90aGlzKCk7CisgICAgfQorCisgICAgcHVibGljIFRISVMgZGlzYWJsZShKYXhSU0ZlYXR1cmUgZmlyc3QsIEpheFJTRmVhdHVyZS4uLiBmMikgeworICAgICAgICBfamF4UlNGZWF0dXJlcyAmPSB+Zmlyc3QuZ2V0TWFzaygpOworICAgICAgICBmb3IgKEpheFJTRmVhdHVyZSBmIDogZjIpIHsKKyAgICAgICAgICAgIF9qYXhSU0ZlYXR1cmVzICY9IH5mLmdldE1hc2soKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX3RoaXMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoSmF4UlNGZWF0dXJlIGYpIHsKKyAgICAgICAgcmV0dXJuIChfamF4UlNGZWF0dXJlcyAmIGYuZ2V0TWFzaygpKSAhPSAwOworICAgIH0KKyAgICAKKyAgICAvLyAvLyAvLyBEZXNlcmlhbGl6YXRpb25GZWF0dXJlCisKKyAgICBwdWJsaWMgVEhJUyBjb25maWd1cmUoRGVzZXJpYWxpemF0aW9uRmVhdHVyZSBmLCBib29sZWFuIHN0YXRlKSB7CisgICAgICAgIF9tYXBwZXJDb25maWcuY29uZmlndXJlKGYsIHN0YXRlKTsKKyAgICAgICAgcmV0dXJuIF90aGlzKCk7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBUSElTIGVuYWJsZShEZXNlcmlhbGl6YXRpb25GZWF0dXJlIGYpIHsKKyAgICAgICAgX21hcHBlckNvbmZpZy5jb25maWd1cmUoZiwgdHJ1ZSk7CisgICAgICAgIHJldHVybiBfdGhpcygpOworICAgIH0KKworICAgIHB1YmxpYyBUSElTIGRpc2FibGUoRGVzZXJpYWxpemF0aW9uRmVhdHVyZSBmKSB7CisgICAgICAgIF9tYXBwZXJDb25maWcuY29uZmlndXJlKGYsIGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIF90aGlzKCk7CisgICAgfQorICAgIAorICAgIC8vIC8vIC8vIFNlcmlhbGl6YXRpb25GZWF0dXJlCisKKyAgICBwdWJsaWMgVEhJUyBjb25maWd1cmUoU2VyaWFsaXphdGlvbkZlYXR1cmUgZiwgYm9vbGVhbiBzdGF0ZSkgeworICAgICAgICBfbWFwcGVyQ29uZmlnLmNvbmZpZ3VyZShmLCBzdGF0ZSk7CisgICAgICAgIHJldHVybiBfdGhpcygpOworICAgIH0KKworICAgIHB1YmxpYyBUSElTIGVuYWJsZShTZXJpYWxpemF0aW9uRmVhdHVyZSBmKSB7CisgICAgICAgIF9tYXBwZXJDb25maWcuY29uZmlndXJlKGYsIHRydWUpOworICAgICAgICByZXR1cm4gX3RoaXMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVEhJUyBkaXNhYmxlKFNlcmlhbGl6YXRpb25GZWF0dXJlIGYpIHsKKyAgICAgICAgX21hcHBlckNvbmZpZy5jb25maWd1cmUoZiwgZmFsc2UpOworICAgICAgICByZXR1cm4gX3RoaXMoKTsKKyAgICB9CisgICAgCisgICAgLy8gLy8gLy8gSnNvblBhcnNlci9Kc29uR2VuZXJhdG9yCisgICAgCisgICAgcHVibGljIFRISVMgZW5hYmxlKEpzb25QYXJzZXIuRmVhdHVyZSBmKSB7CisgICAgICAgIF9tYXBwZXJDb25maWcuY29uZmlndXJlKGYsIHRydWUpOworICAgICAgICByZXR1cm4gX3RoaXMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVEhJUyBlbmFibGUoSnNvbkdlbmVyYXRvci5GZWF0dXJlIGYpIHsKKyAgICAgICAgX21hcHBlckNvbmZpZy5jb25maWd1cmUoZiwgdHJ1ZSk7CisgICAgICAgIHJldHVybiBfdGhpcygpOworICAgIH0KKworICAgIHB1YmxpYyBUSElTIGRpc2FibGUoSnNvblBhcnNlci5GZWF0dXJlIGYpIHsKKyAgICAgICAgX21hcHBlckNvbmZpZy5jb25maWd1cmUoZiwgZmFsc2UpOworICAgICAgICByZXR1cm4gX3RoaXMoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgVEhJUyBkaXNhYmxlKEpzb25HZW5lcmF0b3IuRmVhdHVyZSBmKSB7CisgICAgICAgIF9tYXBwZXJDb25maWcuY29uZmlndXJlKGYsIGZhbHNlKTsKKyAgICAgICAgcmV0dXJuIF90aGlzKCk7CisgICAgfQorCisgICAgcHVibGljIFRISVMgY29uZmlndXJlKEpzb25QYXJzZXIuRmVhdHVyZSBmLCBib29sZWFuIHN0YXRlKSB7CisgICAgICAgIF9tYXBwZXJDb25maWcuY29uZmlndXJlKGYsIHN0YXRlKTsKKyAgICAgICAgcmV0dXJuIF90aGlzKCk7CisgICAgfQorCisgICAgcHVibGljIFRISVMgY29uZmlndXJlKEpzb25HZW5lcmF0b3IuRmVhdHVyZSBmLCBib29sZWFuIHN0YXRlKSB7CisgICAgICAgIF9tYXBwZXJDb25maWcuY29uZmlndXJlKGYsIHN0YXRlKTsKKyAgICAgICAgcmV0dXJuIF90aGlzKCk7CisgICAgfQorCisgICAgLyoKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIC8qIEFic3RyYWN0IG1ldGhvZHMgc3ViLWNsYXNzZXMgbmVlZCB0byBpbXBsZW1lbnQKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqLworCisgICAgLyoqCisgICAgICogSGVscGVyIG1ldGhvZCB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgZ2l2ZW4gbWVkaWEgdHlwZQorICAgICAqIGlzIHN1cHBvcnRlZCBieSB0aGlzIHByb3ZpZGVyIGZvciByZWFkIG9wZXJhdGlvbnMKKyAgICAgKiAod2hlbiBiaW5kaW5nIGlucHV0IGRhdGEgc3VjaCBhcyBQT1NUIGJvZHkpLgorICAgICAqPHA+CisgICAgICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgY2FsbHMge0BsaW5rICNoYXNNYXRjaGluZ01lZGlhVHlwZX0uCisgICAgICogCisgICAgICogQHNpbmNlIDIuMworICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIGhhc01hdGNoaW5nTWVkaWFUeXBlRm9yUmVhZGluZyhNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiBoYXNNYXRjaGluZ01lZGlhVHlwZShtZWRpYVR5cGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhlbHBlciBtZXRob2QgdXNlZCB0byBjaGVjayB3aGV0aGVyIGdpdmVuIG1lZGlhIHR5cGUKKyAgICAgKiBpcyBzdXBwb3J0ZWQgYnkgdGhpcyBwcm92aWRlciBmb3Igd3JpdGluZyBvcGVyYXRpb25zLAorICAgICAqIHN1Y2ggYXMgd2hlbiBjb252ZXJ0aW5nIHJlc3BvbnNlIG9iamVjdCB0byByZXNwb25zZQorICAgICAqIGJvZHkgb2YgcmVxdWVzdCAobGlrZSBHRVQgb3IgUE9TVCkuCisgICAgICo8cD4KKyAgICAgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHNpbXBseSBjYWxscyB7QGxpbmsgI2hhc01hdGNoaW5nTWVkaWFUeXBlfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgMi4zCisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gaGFzTWF0Y2hpbmdNZWRpYVR5cGVGb3JXcml0aW5nKE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIGhhc01hdGNoaW5nTWVkaWFUeXBlKG1lZGlhVHlwZSk7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIEhlbHBlciBtZXRob2QgdXNlZCB0byBjaGVjayB3aGV0aGVyIGdpdmVuIG1lZGlhIHR5cGUKKyAgICAgKiBpcyBzdXBwb3J0ZWQgYnkgdGhpcyBwcm92aWRlci4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgMi4yCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IGJvb2xlYW4gaGFzTWF0Y2hpbmdNZWRpYVR5cGUoTWVkaWFUeXBlIG1lZGlhVHlwZSk7CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgbWV0aG9kIHRoYXQgaXMgY2FsbGVkIGlmIG5vIG1hcHBlciBoYXMgYmVlbiBleHBsaWNpdGx5IGNvbmZpZ3VyZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IE1BUFBFUiBfbG9jYXRlTWFwcGVyVmlhUHJvdmlkZXIoQ2xhc3M8Pz4gdHlwZSwgTWVkaWFUeXBlIG1lZGlhVHlwZSk7CisgICAgCisgICAgcHJvdGVjdGVkIEVQX0NPTkZJRyBfY29uZmlnRm9yUmVhZGluZyhNQVBQRVIgbWFwcGVyLAorICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIENsYXNzPD8+IGRlZmF1bHRWaWV3KQorICAgIHsKKy8vICAgICAgICBPYmplY3RSZWFkZXIgciA9IF9yZWFkZXJJbmplY3Rvci5nZXRBbmRDbGVhcigpOworICAgICAgICBPYmplY3RSZWFkZXIgcjsKKyAgICAgICAgaWYgKGRlZmF1bHRWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHIgPSBtYXBwZXIucmVhZGVyV2l0aFZpZXcoZGVmYXVsdFZpZXcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgciA9IG1hcHBlci5yZWFkZXIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX2NvbmZpZ0ZvclJlYWRpbmcociwgYW5ub3RhdGlvbnMpOworICAgIH0KKworICAgIHByb3RlY3RlZCBFUF9DT05GSUcgX2NvbmZpZ0ZvcldyaXRpbmcoTUFQUEVSIG1hcHBlciwKKyAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBDbGFzczw/PiBkZWZhdWx0VmlldykKKyAgICB7CisvLyAgICAgICAgT2JqZWN0V3JpdGVyIHcgPSBfd3JpdGVySW5qZWN0b3IuZ2V0QW5kQ2xlYXIoKTsKKyAgICAgICAgT2JqZWN0V3JpdGVyIHc7CisgICAgICAgIGlmIChkZWZhdWx0VmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICB3ID0gbWFwcGVyLndyaXRlcldpdGhWaWV3KGRlZmF1bHRWaWV3KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHcgPSBtYXBwZXIud3JpdGVyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9jb25maWdGb3JXcml0aW5nKHcsIGFubm90YXRpb25zKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgRVBfQ09ORklHIF9jb25maWdGb3JSZWFkaW5nKE9iamVjdFJlYWRlciByZWFkZXIsCisgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMpOworCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IEVQX0NPTkZJRyBfY29uZmlnRm9yV3JpdGluZyhPYmplY3RXcml0ZXIgd3JpdGVyLAorICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMpOworCisgICAgLyoKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIC8qIFBhcnRpYWwgTWVzc2FnZUJvZHlXcml0ZXIgaW1wbAorICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgdGhhdCBKQVgtUlMgY29udGFpbmVyIGNhbGxzIHRvIHRyeSB0byBmaWd1cmUgb3V0CisgICAgICogc2VyaWFsaXplZCBsZW5ndGggb2YgZ2l2ZW4gdmFsdWUuIFNpbmNlIGNvbXB1dGF0aW9uIG9mCisgICAgICogdGhpcyBsZW5ndGggaXMgYWJvdXQgYXMgZXhwZW5zaXZlIGFzIHNlcmlhbGl6YXRpb24gaXRzZWxmLAorICAgICAqIGltcGxlbWVudGF0aW9uIHdpbGwgcmV0dXJuIC0xIHRvIGRlbm90ZSAibm90IGtub3duIiwgc28KKyAgICAgKiB0aGF0IGNvbnRhaW5lciB3aWxsIGRldGVybWluZSBsZW5ndGggZnJvbSBhY3R1YWwgc2VyaWFsaXplZAorICAgICAqIG91dHB1dCAoaWYgbmVlZGVkKS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBnZXRTaXplKE9iamVjdCB2YWx1ZSwgQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKQorICAgIHsKKyAgICAgICAgLyogSW4gZ2VuZXJhbCBmaWd1cmluZyBvdXRwdXQgc2l6ZSByZXF1aXJlcyBhY3R1YWwgd3JpdGluZzsgdXN1YWxseSBub3QKKyAgICAgICAgICogd29ydGggaXQgdG8gd3JpdGUgZXZlcnl0aGluZyB0d2ljZS4KKyAgICAgICAgICovCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogTWV0aG9kIHRoYXQgSkFYLVJTIGNvbnRhaW5lciBjYWxscyB0byB0cnkgdG8gY2hlY2sgd2hldGhlcgorICAgICAqIGdpdmVuIHZhbHVlIChvZiBzcGVjaWZpZWQgdHlwZSkgY2FuIGJlIHNlcmlhbGl6ZWQgYnkKKyAgICAgKiB0aGlzIHByb3ZpZGVyLgorICAgICAqIEltcGxlbWVudGF0aW9uIHdpbGwgZmlyc3QgY2hlY2sgdGhhdCBleHBlY3RlZCBtZWRpYSB0eXBlIGlzCisgICAgICogZXhwZWN0ZWQgb25lIChieSBjYWxsIHRvIHtAbGluayAjaGFzTWF0Y2hpbmdNZWRpYVR5cGV9KTsgdGhlbiB2ZXJpZnkKKyAgICAgKiB0aGF0IHR5cGUgaXMgbm90IG9uZSBvZiAidW50b3VjaGFibGUiIHR5cGVzICh0eXBlcyB3ZSB3aWxsIG5ldmVyCisgICAgICogYXV0b21hdGljYWxseSBoYW5kbGUpLCBhbmQgZmluYWxseSB0aGF0IHRoZXJlIGlzIGEgc2VyaWFsaXplcgorICAgICAqIGZvciB0eXBlIChpZmYge0BsaW5rICNjaGVja0NhblNlcmlhbGl6ZX0gaGFzIGJlZW4gY2FsbGVkIHdpdGgKKyAgICAgKiB0cnVlIGFyZ3VtZW50IC0tIG90aGVyd2lzZSBhc3N1bXB0aW9uIGlzIHRoZXJlIHdpbGwgYmUgYSBoYW5kbGVyKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkKKyAgICB7CisgICAgICAgIGlmICghaGFzTWF0Y2hpbmdNZWRpYVR5cGUobWVkaWFUeXBlKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIEJvb2xlYW4gY3VzdG9tVW50b3VjaGFibGUgPSBfZmluZEN1c3RvbVVudG91Y2hhYmxlKHR5cGUpOworICAgICAgICBpZiAoY3VzdG9tVW50b3VjaGFibGUgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gbmVnYXRpb246IEJvb2xlYW4uVFJVRSBtZWFucyB1bnRvdWNoYWJsZSAtPiBjYW4gbm90IHdyaXRlCisgICAgICAgICAgICByZXR1cm4gIWN1c3RvbVVudG91Y2hhYmxlLmJvb2xlYW5WYWx1ZSgpOworICAgICAgICB9CisgICAgICAgIC8qIE9rOiBsb29rcyBsaWtlIHdlIG11c3Qgd2VlZCBvdXQgc29tZSBjb3JlIHR5cGVzIGhlcmU7IG9uZXMgdGhhdAorICAgICAgICAgKiBtYWtlIG5vIHNlbnNlIHRvIHRyeSB0byBiaW5kIGZyb20gSlNPTjoKKyAgICAgICAgICovCisgICAgICAgIGlmIChfaXNJZ25vcmFibGVGb3JXcml0aW5nKG5ldyBDbGFzc0tleSh0eXBlKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAvLyBidXQgc29tZSBhcmUgaW50ZXJmYWNlL2Fic3RyYWN0IGNsYXNzZXMsIHNvCisgICAgICAgIGZvciAoQ2xhc3M8Pz4gY2xzIDogX3Vud3JpdGFibGVDbGFzc2VzKSB7CisgICAgICAgICAgICBpZiAoY2xzLmlzQXNzaWduYWJsZUZyb20odHlwZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gQWxzbzogaWYgd2UgcmVhbGx5IHdhbnQgdG8gdmVyaWZ5IHRoYXQgd2UgY2FuIGRlc2VyaWFsaXplLCB3ZSdsbCBjaGVjazoKKyAgICAgICAgaWYgKF9jZmdDaGVja0NhblNlcmlhbGl6ZSkgeworICAgICAgICAgICAgaWYgKCFsb2NhdGVNYXBwZXIodHlwZSwgbWVkaWFUeXBlKS5jYW5TZXJpYWxpemUodHlwZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWV0aG9kIHRoYXQgSkFYLVJTIGNvbnRhaW5lciBjYWxscyB0byBzZXJpYWxpemUgZ2l2ZW4gdmFsdWUuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGVUbyhPYmplY3QgdmFsdWUsIENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsT2JqZWN0PiBodHRwSGVhZGVycywgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgorICAgIHsKKyAgICAgICAgRVBfQ09ORklHIGVuZHBvaW50ID0gX2VuZHBvaW50Rm9yV3JpdGluZyh2YWx1ZSwgdHlwZSwgZ2VuZXJpY1R5cGUsIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgIG1lZGlhVHlwZSwgaHR0cEhlYWRlcnMpOworCisgICAgICAgIC8vIEFueSBoZWFkZXJzIHdlIHNob3VsZCB3cml0ZT8KKyAgICAgICAgX21vZGlmeUhlYWRlcnModmFsdWUsIHR5cGUsIGdlbmVyaWNUeXBlLCBhbm5vdGF0aW9ucywgaHR0cEhlYWRlcnMsIGVuZHBvaW50KTsKKyAgICAgICAgCisgICAgICAgIE9iamVjdFdyaXRlciB3cml0ZXIgPSBlbmRwb2ludC5nZXRXcml0ZXIoKTsKKworICAgICAgICAvLyBXaGVyZSBjYW4gd2UgZmluZCBkZXNpcmVkIGVuY29kaW5nPyBXaXRoaW4gSFRUUCBoZWFkZXJzPworICAgICAgICBKc29uRW5jb2RpbmcgZW5jID0gZmluZEVuY29kaW5nKG1lZGlhVHlwZSwgaHR0cEhlYWRlcnMpOworICAgICAgICBKc29uR2VuZXJhdG9yIGcgPSBfY3JlYXRlR2VuZXJhdG9yKHdyaXRlciwgZW50aXR5U3RyZWFtLCBlbmMpOworICAgICAgICBib29sZWFuIG9rID0gZmFsc2U7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIFdhbnQgaW5kZW50YXRpb24/CisgICAgICAgICAgICBpZiAod3JpdGVyLmlzRW5hYmxlZChTZXJpYWxpemF0aW9uRmVhdHVyZS5JTkRFTlRfT1VUUFVUKSkgeworICAgICAgICAgICAgICAgIGcudXNlRGVmYXVsdFByZXR0eVByaW50ZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEphdmFUeXBlIHJvb3RUeXBlID0gbnVsbDsKKworICAgICAgICAgICAgaWYgKChnZW5lcmljVHlwZSAhPSBudWxsKSAmJiAodmFsdWUgIT0gbnVsbCkpIHsKKyAgICAgICAgICAgICAgICAvLyAxMC1KYW4tMjAxMSwgdGF0dTogYXMgcGVyIFtKQUNLU09OLTQ1Nl0sIGl0J3Mgbm90IHNhZmUgdG8ganVzdCBmb3JjZSByb290CisgICAgICAgICAgICAgICAgLy8gICAgdHlwZSBzaW5jZSBpdCBwcmV2ZW50cyBwb2x5bW9ycGhpYyB0eXBlIHNlcmlhbGl6YXRpb24uIFNpbmNlIHdlIHJlYWxseQorICAgICAgICAgICAgICAgIC8vICAgIGp1c3QgbmVlZCB0aGlzIGZvciBnZW5lcmljcywgbGV0J3Mgb25seSB1c2UgZ2VuZXJpYyB0eXBlIGlmIGl0J3MgdHJ1bHkgZ2VuZXJpYy4KKworICAgICAgICAgICAgICAgIGlmICghKGdlbmVyaWNUeXBlIGluc3RhbmNlb2YgQ2xhc3M8Pz4pKSB7IC8vIGdlbmVyaWMgdHlwZXMgYXJlIG90aGVyIGltcGxzIG9mICdqYXZhLmxhbmcucmVmbGVjdC5UeXBlJworICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHN0aWxsIG5vdCBleGFjdGx5IHJpZ2h0OyBzaG91bGQgcm9vdCB0eXBlIGJlIGZ1cnRoZXIKKyAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lhbGl6ZWQgd2l0aCAndmFsdWUuZ2V0Q2xhc3MoKSc/IExldCdzIHNlZSBob3cgd2VsbCB0aGlzIHdvcmtzIGJlZm9yZQorICAgICAgICAgICAgICAgICAgICAvLyB0cnlpbmcgdG8gY29tZSB1cCB3aXRoIG1vcmUgY29tcGxldGUgc29sdXRpb24uCisKKyAgICAgICAgICAgICAgICAgICAgLy8gMTgtTWFyLTIwMTUsIHRhdHU6IEFzIHBlciBbIzYwXSwgdGhlcmUgaXMgbm93IGEgcHJvYmxlbSB3aXRoIG5vbi1wb2x5bW9ycGhpYyBsaXN0cywKKyAgICAgICAgICAgICAgICAgICAgLy8gICAgc2luY2UgZm9yY2luZyBvZiB0eXBlIHdpbGwgdGhlbiBmb3JjZSB1c2Ugb2YgY29udGVudCBzZXJpYWxpemVyLCB3aGljaCBpcworICAgICAgICAgICAgICAgICAgICAvLyAgICBnZW5lcmFsbHkgbm90IHRoZSBpbnRlbnQuIEZpeCBtYXkgcmVxdWlyZSBhZGRpdGlvbiBvZiBmdW5jdGlvbmFsaXR5IGluIGRhdGFiaW5kCisKKyAgICAgICAgICAgICAgICAgICAgVHlwZUZhY3RvcnkgdHlwZUZhY3RvcnkgPSB3cml0ZXIuZ2V0VHlwZUZhY3RvcnkoKTsKKyAgICAgICAgICAgICAgICAgICAgSmF2YVR5cGUgYmFzZVR5cGUgPSB0eXBlRmFjdG9yeS5jb25zdHJ1Y3RUeXBlKGdlbmVyaWNUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgcm9vdFR5cGUgPSB0eXBlRmFjdG9yeS5jb25zdHJ1Y3RTcGVjaWFsaXplZFR5cGUoYmFzZVR5cGUsIHR5cGUpOworICAgICAgICAgICAgICAgICAgICAvKiAyNi1GZWItMjAxMSwgdGF0dTogVG8gaGVscCB3aXRoIFtKQUNLU09OLTUxOF0sIHdlIGJldHRlciByZWNvZ25pemUgY2FzZXMgd2hlcmUKKyAgICAgICAgICAgICAgICAgICAgICogICAgdHlwZSBkZWdlbmVyYXRlcyBiYWNrIGludG8gIk9iamVjdC5jbGFzcyIgKGFzIGlzIHRoZSBjYXNlIHdpdGggcGxhaW4gVHlwZVZhcmlhYmxlLAorICAgICAgICAgICAgICAgICAgICAgKiAgICBmb3IgZXhhbXBsZSksIGFuZCBub3QgdXNlIHRoYXQuCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBpZiAocm9vdFR5cGUuZ2V0UmF3Q2xhc3MoKSA9PSBPYmplY3QuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RUeXBlID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gTW9zdCBvZiB0aGUgY29uZmlndXJhdGlvbiBub3cgaGFuZGxlZCB0aHJvdWdoIEVuZHBvaW50Q29uZmlnLCBPYmplY3RXcml0ZXIKKyAgICAgICAgICAgIC8vIGJ1dCB3ZSBtYXkgbmVlZCB0byBmb3JjZSByb290IHR5cGU6CisgICAgICAgICAgICBpZiAocm9vdFR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdyaXRlciA9IHdyaXRlci5mb3JUeXBlKHJvb3RUeXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZhbHVlID0gZW5kcG9pbnQubW9kaWZ5QmVmb3JlV3JpdGUodmFsdWUpOworCisgICAgICAgICAgICAvLyBbSXNzdWUjMzJdOiBhbGxvdyBtb2RpZmljYXRpb24gYnkgZmlsdGVyLWluamVjdGlibGUgdGhpbmcKKyAgICAgICAgICAgIE9iamVjdFdyaXRlck1vZGlmaWVyIG1vZCA9IE9iamVjdFdyaXRlckluamVjdG9yLmdldEFuZENsZWFyKCk7CisgICAgICAgICAgICBpZiAobW9kICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB3cml0ZXIgPSBtb2QubW9kaWZ5KGVuZHBvaW50LCBodHRwSGVhZGVycywgdmFsdWUsIHdyaXRlciwgZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdyaXRlci53cml0ZVZhbHVlKGcsIHZhbHVlKTsKKyAgICAgICAgICAgIG9rID0gdHJ1ZTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmIChvaykgeworICAgICAgICAgICAgICAgIGcuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZy5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7IH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEhlbHBlciBtZXRob2QgdG8gdXNlIGZvciBkZXRlcm1pbmluZyBkZXNpcmVkIG91dHB1dCBlbmNvZGluZy4KKyAgICAgKiBGb3Igbm93LCB3aWxsIGFsd2F5cyBqdXN0IHVzZSBVVEYtOC4uLgorICAgICAqLworICAgIHByb3RlY3RlZCBKc29uRW5jb2RpbmcgZmluZEVuY29kaW5nKE1lZGlhVHlwZSBtZWRpYVR5cGUsIE11bHRpdmFsdWVkTWFwPFN0cmluZyxPYmplY3Q+IGh0dHBIZWFkZXJzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIEpzb25FbmNvZGluZy5VVEY4OworICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJyaWRhYmxlIG1ldGhvZCB1c2VkIGZvciBhZGRpbmcgb3B0aW9uYWwgcmVzcG9uc2UgaGVhZGVycyBiZWZvcmUKKyAgICAgKiBzZXJpYWxpemluZyByZXNwb25zZSBvYmplY3QuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgX21vZGlmeUhlYWRlcnMoT2JqZWN0IHZhbHVlLCBDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsT2JqZWN0PiBodHRwSGVhZGVycywKKyAgICAgICAgICAgIEVQX0NPTkZJRyBlbmRwb2ludCkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICAvLyBBZGQgIm5vc25pZmYiIGhlYWRlcj8KKyAgICAgICAgaWYgKGlzRW5hYmxlZChKYXhSU0ZlYXR1cmUuQUREX05PX1NOSUZGX0hFQURFUikpIHsKKyAgICAgICAgICAgIGh0dHBIZWFkZXJzLmFkZChIRUFERVJfQ09OVEVOVF9UWVBFX09QVElPTlMsICJub3NuaWZmIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkYWJsZSBoZWxwZXIgbWV0aG9kIGNhbGxlZCB0byBjcmVhdGUgYSB7QGxpbmsgSnNvbkdlbmVyYXRvcn0gZm9yIHdyaXRpbmcKKyAgICAgKiBjb250ZW50cyBpbnRvIGdpdmVuIHJhdyB7QGxpbmsgT3V0cHV0U3RyZWFtfS4KKyAgICAgKiAKKyAgICAgKiBAc2luY2UgMi4zCisgICAgICovCisgICAgcHJvdGVjdGVkIEpzb25HZW5lcmF0b3IgX2NyZWF0ZUdlbmVyYXRvcihPYmplY3RXcml0ZXIgd3JpdGVyLCBPdXRwdXRTdHJlYW0gcmF3U3RyZWFtLCBKc29uRW5jb2RpbmcgZW5jKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICB7CisgICAgICAgIEpzb25HZW5lcmF0b3IgZyA9IHdyaXRlci5nZXRGYWN0b3J5KCkuY3JlYXRlR2VuZXJhdG9yKHJhd1N0cmVhbSwgZW5jKTsKKyAgICAgICAgLy8gSW1wb3J0YW50OiB3ZSBhcmUgTk9UIHRvIGNsb3NlIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSBhZnRlcgorICAgICAgICAvLyBtYXBwaW5nLCBzbyB3ZSBuZWVkIHRvIGluc3RydWN0IGdlbmVyYXRvcgorICAgICAgICBnLmRpc2FibGUoSnNvbkdlbmVyYXRvci5GZWF0dXJlLkFVVE9fQ0xPU0VfVEFSR0VUKTsKKyAgICAgICAgcmV0dXJuIGc7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEVQX0NPTkZJRyBfZW5kcG9pbnRGb3JXcml0aW5nKE9iamVjdCB2YWx1ZSwgQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLE9iamVjdD4gaHR0cEhlYWRlcnMpCisgICAgeworICAgICAgICAvLyAyOS1KdW4tMjAxNiwgdGF0dTogQXMgcGVyIFtqYXhycy1wcm92aWRlcnMjODZdIGFsbG93IHNraXBwaW5nIGNhY2hpbmcKKyAgICAgICAgaWYgKCFpc0VuYWJsZWQoSmF4UlNGZWF0dXJlLkNBQ0hFX0VORFBPSU5UX1dSSVRFUlMpKSB7CisgICAgICAgICAgICByZXR1cm4gX2NvbmZpZ0ZvcldyaXRpbmcobG9jYXRlTWFwcGVyKHR5cGUsIG1lZGlhVHlwZSksIGFubm90YXRpb25zLCBfZGVmYXVsdFdyaXRlVmlldyk7CisgICAgICAgIH0KKworICAgICAgICBFUF9DT05GSUcgZW5kcG9pbnQ7CisgICAgICAgIEFubm90YXRpb25CdW5kbGVLZXkga2V5ID0gbmV3IEFubm90YXRpb25CdW5kbGVLZXkoYW5ub3RhdGlvbnMsIHR5cGUpOworICAgICAgICBzeW5jaHJvbml6ZWQgKF93cml0ZXJzKSB7CisgICAgICAgICAgICBlbmRwb2ludCA9IF93cml0ZXJzLmdldChrZXkpOworICAgICAgICB9CisgICAgICAgIC8vIG5vdCB5ZXQgcmVzb2x2ZWQgKG9yIG5vdCBjYWNoZWQgYW55IG1vcmUpPyBSZXNvbHZlIQorICAgICAgICBpZiAoZW5kcG9pbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgTUFQUEVSIG1hcHBlciA9IGxvY2F0ZU1hcHBlcih0eXBlLCBtZWRpYVR5cGUpOworICAgICAgICAgICAgZW5kcG9pbnQgPSBfY29uZmlnRm9yV3JpdGluZyhtYXBwZXIsIGFubm90YXRpb25zLCBfZGVmYXVsdFdyaXRlVmlldyk7CisgICAgICAgICAgICAvLyBhbmQgY2FjaGUgZm9yIGZ1dHVyZSByZXVzZQorICAgICAgICAgICAgc3luY2hyb25pemVkIChfd3JpdGVycykgeworICAgICAgICAgICAgICAgIF93cml0ZXJzLnB1dChrZXkuaW1tdXRhYmxlS2V5KCksIGVuZHBvaW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZW5kcG9pbnQ7CisgICAgfQorCisgICAgLyoKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIC8qIE1lc3NhZ2VCb2R5UmVhZGVyIGltcGwKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqLworICAgIAorICAgIC8qKgorICAgICAqIE1ldGhvZCB0aGF0IEpBWC1SUyBjb250YWluZXIgY2FsbHMgdG8gdHJ5IHRvIGNoZWNrIHdoZXRoZXIKKyAgICAgKiB2YWx1ZXMgb2YgZ2l2ZW4gdHlwZSAoYW5kIG1lZGlhIHR5cGUpIGNhbiBiZSBkZXNlcmlhbGl6ZWQgYnkKKyAgICAgKiB0aGlzIHByb3ZpZGVyLgorICAgICAqIEltcGxlbWVudGF0aW9uIHdpbGwgZmlyc3QgY2hlY2sgdGhhdCBleHBlY3RlZCBtZWRpYSB0eXBlIGlzCisgICAgICogYSBKU09OIHR5cGUgKHZpYSBjYWxsIHRvIHtAbGluayAjaGFzTWF0Y2hpbmdNZWRpYVR5cGV9KTsKKyAgICAgKiB0aGVuIHZlcmlmeQorICAgICAqIHRoYXQgdHlwZSBpcyBub3Qgb25lIG9mICJ1bnRvdWNoYWJsZSIgdHlwZXMgKHR5cGVzIHdlIHdpbGwgbmV2ZXIKKyAgICAgKiBhdXRvbWF0aWNhbGx5IGhhbmRsZSksIGFuZCBmaW5hbGx5IHRoYXQgdGhlcmUgaXMgYSBkZXNlcmlhbGl6ZXIKKyAgICAgKiBmb3IgdHlwZSAoaWZmIHtAbGluayAjY2hlY2tDYW5EZXNlcmlhbGl6ZX0gaGFzIGJlZW4gY2FsbGVkIHdpdGgKKyAgICAgKiB0cnVlIGFyZ3VtZW50IC0tIG90aGVyd2lzZSBhc3N1bXB0aW9uIGlzIHRoZXJlIHdpbGwgYmUgYSBoYW5kbGVyKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKQorICAgIHsKKyAgICAgICAgaWYgKCFoYXNNYXRjaGluZ01lZGlhVHlwZShtZWRpYVR5cGUpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgQm9vbGVhbiBjdXN0b21VbnRvdWNoYWJsZSA9IF9maW5kQ3VzdG9tVW50b3VjaGFibGUodHlwZSk7CisgICAgICAgIGlmIChjdXN0b21VbnRvdWNoYWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBuZWdhdGlvbjogQm9vbGVhbi5UUlVFIG1lYW5zIHVudG91Y2hhYmxlIC0+IGNhbiBub3Qgd3JpdGUKKyAgICAgICAgICAgIHJldHVybiAhY3VzdG9tVW50b3VjaGFibGUuYm9vbGVhblZhbHVlKCk7CisgICAgICAgIH0KKyAgICAgICAgLyogT2s6IGxvb2tzIGxpa2Ugd2UgbXVzdCB3ZWVkIG91dCBzb21lIGNvcmUgdHlwZXMgaGVyZTsgb25lcyB0aGF0CisgICAgICAgICAqIG1ha2Ugbm8gc2Vuc2UgdG8gdHJ5IHRvIGJpbmQgZnJvbSBKU09OOgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKF9pc0lnbm9yYWJsZUZvclJlYWRpbmcobmV3IENsYXNzS2V5KHR5cGUpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIC8vIGFuZCB0aGVyZSBhcmUgc29tZSBvdGhlciBhYnN0cmFjdC9pbnRlcmZhY2UgdHlwZXMgdG8gZXhjbHVkZSB0b286CisgICAgICAgIGZvciAoQ2xhc3M8Pz4gY2xzIDogX3VucmVhZGFibGVDbGFzc2VzKSB7CisgICAgICAgICAgICBpZiAoY2xzLmlzQXNzaWduYWJsZUZyb20odHlwZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gRmluYWxseTogaWYgd2UgcmVhbGx5IHdhbnQgdG8gdmVyaWZ5IHRoYXQgd2UgY2FuIHNlcmlhbGl6ZSwgd2UnbGwgY2hlY2s6CisgICAgICAgIGlmIChfY2ZnQ2hlY2tDYW5EZXNlcmlhbGl6ZSkgeworICAgICAgICAgICAgaWYgKF9pc1NwZWNpYWxSZWFkYWJsZSh0eXBlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgT2JqZWN0TWFwcGVyIG1hcHBlciA9IGxvY2F0ZU1hcHBlcih0eXBlLCBtZWRpYVR5cGUpOworICAgICAgICAgICAgaWYgKCFtYXBwZXIuY2FuRGVzZXJpYWxpemUobWFwcGVyLmNvbnN0cnVjdFR5cGUodHlwZSkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ldGhvZCB0aGF0IEpBWC1SUyBjb250YWluZXIgY2FsbHMgdG8gZGVzZXJpYWxpemUgZ2l2ZW4gdmFsdWUuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdCByZWFkRnJvbShDbGFzczxPYmplY3Q+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsIE11bHRpdmFsdWVkTWFwPFN0cmluZyxTdHJpbmc+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKSAKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBFUF9DT05GSUcgZW5kcG9pbnQgPSBfZW5kcG9pbnRGb3JSZWFkaW5nKHR5cGUsIGdlbmVyaWNUeXBlLCBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICBtZWRpYVR5cGUsIGh0dHBIZWFkZXJzKTsKKyAgICAgICAgCisgICAgICAgIE9iamVjdFJlYWRlciByZWFkZXIgPSBlbmRwb2ludC5nZXRSZWFkZXIoKTsKKyAgICAgICAgSnNvblBhcnNlciBwID0gX2NyZWF0ZVBhcnNlcihyZWFkZXIsIGVudGl0eVN0cmVhbSk7CisgICAgICAgIAorICAgICAgICAvLyBJZiBudWxsIGlzIHJldHVybmVkLCBjb25zaWRlcmVkIHRvIGJlIGVtcHR5IHN0cmVhbQorICAgICAgICAvLyAwNS1BcHItMjAxNCwgdGF0dTogQXMgcGVyIFtJc3N1ZSM0OV0sIGJlaGF2aW9yIGhlcmUgaXMgY29uZmlndXJhYmxlLgorICAgICAgICBpZiAocCA9PSBudWxsIHx8IHAubmV4dFRva2VuKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgaWYgKEpheFJTRmVhdHVyZS5BTExPV19FTVBUWV9JTlBVVC5lbmFibGVkSW4oX2pheFJTRmVhdHVyZXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiAwNS1BcHItMjAxNCwgdGF0dTogVHJpY2stZWUuIE5vQ29udGVudEZvdW5kRXhjZXB0aW9uIG9ubHkgYXZhaWxhYmxlIGluIEpBWC1SUyAyLjAuLi4KKyAgICAgICAgICAgICAqICAgc28gbmVlZCBiaXQgb2Ygb2JmdXNjYXRlZCBjb2RlIHRvIHJlYWNoIGl0LgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBJT0V4Y2VwdGlvbiBmYWlsID0gX25vQ29udGVudEV4Y2VwdGlvblJlZi5nZXQoKTsKKyAgICAgICAgICAgIGlmIChmYWlsID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmYWlsID0gX2NyZWF0ZU5vQ29udGVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyb3cgZmFpbDsKKyAgICAgICAgfQorICAgICAgICBDbGFzczw/PiByYXdUeXBlID0gdHlwZTsKKyAgICAgICAgaWYgKHJhd1R5cGUgPT0gSnNvblBhcnNlci5jbGFzcykgeworICAgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgVHlwZUZhY3RvcnkgdGYgPSByZWFkZXIuZ2V0VHlwZUZhY3RvcnkoKTsKKyAgICAgICAgZmluYWwgSmF2YVR5cGUgcmVzb2x2ZWRUeXBlID0gdGYuY29uc3RydWN0VHlwZShnZW5lcmljVHlwZSk7CisKKyAgICAgICAgLy8gMDktSnVsLTIwMTUsIHRhdHU6IEFzIHBlciBbamF4cnMtcHJvdmlkZXJzIzY5XSwgaGFuZGxlIE1hcHBpbmdJdGVyYXRvciB0b28KKyAgICAgICAgYm9vbGVhbiBtdWx0aVZhbHVlZCA9IChyYXdUeXBlID09IE1hcHBpbmdJdGVyYXRvci5jbGFzcyk7CisgICAgICAgIAorICAgICAgICBpZiAobXVsdGlWYWx1ZWQpIHsKKyAgICAgICAgICAgIEphdmFUeXBlW10gY29udGVudHMgPSB0Zi5maW5kVHlwZVBhcmFtZXRlcnMocmVzb2x2ZWRUeXBlLCBNYXBwaW5nSXRlcmF0b3IuY2xhc3MpOworICAgICAgICAgICAgSmF2YVR5cGUgdmFsdWVUeXBlID0gKGNvbnRlbnRzID09IG51bGwgfHwgY29udGVudHMubGVuZ3RoID09IDApCisgICAgICAgICAgICAgICAgICAgID8gdGYuY29uc3RydWN0VHlwZShPYmplY3QuY2xhc3MpIDogY29udGVudHNbMF07CisgICAgICAgICAgICByZWFkZXIgPSByZWFkZXIuZm9yVHlwZSh2YWx1ZVR5cGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVhZGVyID0gcmVhZGVyLmZvclR5cGUocmVzb2x2ZWRUeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFtJc3N1ZSMzMl06IGFsbG93IG1vZGlmaWNhdGlvbiBieSBmaWx0ZXItaW5qZWN0YWJsZSB0aGluZworICAgICAgICBPYmplY3RSZWFkZXJNb2RpZmllciBtb2QgPSBPYmplY3RSZWFkZXJJbmplY3Rvci5nZXRBbmRDbGVhcigpOworICAgICAgICBpZiAobW9kICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlYWRlciA9IG1vZC5tb2RpZnkoZW5kcG9pbnQsIGh0dHBIZWFkZXJzLCByZXNvbHZlZFR5cGUsIHJlYWRlciwgcCk7CisgICAgICAgIH0KKyAgICAgICAgCisgICAgICAgIGlmIChtdWx0aVZhbHVlZCkgeworICAgICAgICAgICAgcmV0dXJuIHJlYWRlci5yZWFkVmFsdWVzKHApOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZWFkZXIucmVhZFZhbHVlKHApOworICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJyaWRhYmxlIGhlbHBlciBtZXRob2QgY2FsbGVkIHRvIGNyZWF0ZSBhIHtAbGluayBKc29uUGFyc2VyfSBmb3IgcmVhZGluZworICAgICAqIGNvbnRlbnRzIG9mIGdpdmVuIHJhdyB7QGxpbmsgSW5wdXRTdHJlYW19LgorICAgICAqIE1heSByZXR1cm4gbnVsbCB0byBpbmRpY2F0ZSB0aGF0IFN0cmVhbSBpcyBlbXB0eTsgdGhhdCBpcywgY29udGFpbnMgbm8KKyAgICAgKiBjb250ZW50LgorICAgICAqIAorICAgICAqIEBzaW5jZSAyLjIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgSnNvblBhcnNlciBfY3JlYXRlUGFyc2VyKE9iamVjdFJlYWRlciByZWFkZXIsIElucHV0U3RyZWFtIHJhd1N0cmVhbSkKKyAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uCisgICAgeworICAgICAgICBKc29uUGFyc2VyIHAgPSByZWFkZXIuZ2V0RmFjdG9yeSgpLmNyZWF0ZVBhcnNlcihyYXdTdHJlYW0pOworICAgICAgICAvLyBJbXBvcnRhbnQ6IHdlIGFyZSBOT1QgdG8gY2xvc2UgdGhlIHVuZGVybHlpbmcgc3RyZWFtIGFmdGVyCisgICAgICAgIC8vIG1hcHBpbmcsIHNvIHdlIG5lZWQgdG8gaW5zdHJ1Y3QgcGFyc2VyOgorICAgICAgICBwLmRpc2FibGUoSnNvblBhcnNlci5GZWF0dXJlLkFVVE9fQ0xPU0VfU09VUkNFKTsKKyAgICAgICAgcmV0dXJuIHA7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3ZlcnJpZGFibGUgaGVscGVyIG1ldGhvZCB0aGF0IHdpbGwgYmFzaWNhbGx5IGZldGNoIHJlcHJlc2VudGF0aW9uIG9mIHRoZQorICAgICAqIGVuZHBvaW50IHRoYXQgY2FuIGJlIHVzZWQgdG8gZ2V0IHtAbGluayBPYmplY3RSZWFkZXJ9IHRvIHVzZSBmb3IgZGVzZXJpYWxpemluZworICAgICAqIGNvbnRlbnQKKyAgICAgKgorICAgICAqIEBzaW5jZSAyLjgKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgRVBfQ09ORklHIF9lbmRwb2ludEZvclJlYWRpbmcoQ2xhc3M8T2JqZWN0PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsU3RyaW5nPiBodHRwSGVhZGVycykKKyAgICB7CisgICAgICAgIC8vIDI5LUp1bi0yMDE2LCB0YXR1OiBBcyBwZXIgW2pheHJzLXByb3ZpZGVycyM4Nl0gYWxsb3cgc2tpcHBpbmcgY2FjaGluZworICAgICAgICBpZiAoIWlzRW5hYmxlZChKYXhSU0ZlYXR1cmUuQ0FDSEVfRU5EUE9JTlRfUkVBREVSUykpIHsKKyAgICAgICAgICAgIHJldHVybiBfY29uZmlnRm9yUmVhZGluZyhsb2NhdGVNYXBwZXIodHlwZSwgbWVkaWFUeXBlKSwgYW5ub3RhdGlvbnMsIF9kZWZhdWx0UmVhZFZpZXcpOworICAgICAgICB9CisKKyAgICAgICAgRVBfQ09ORklHIGVuZHBvaW50OworICAgICAgICBBbm5vdGF0aW9uQnVuZGxlS2V5IGtleSA9IG5ldyBBbm5vdGF0aW9uQnVuZGxlS2V5KGFubm90YXRpb25zLCB0eXBlKTsKKyAgICAgICAgc3luY2hyb25pemVkIChfcmVhZGVycykgeworICAgICAgICAgICAgZW5kcG9pbnQgPSBfcmVhZGVycy5nZXQoa2V5KTsKKyAgICAgICAgfQorICAgICAgICAvLyBub3QgeWV0IHJlc29sdmVkIChvciBub3QgY2FjaGVkIGFueSBtb3JlKT8gUmVzb2x2ZSEKKyAgICAgICAgaWYgKGVuZHBvaW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIE1BUFBFUiBtYXBwZXIgPSBsb2NhdGVNYXBwZXIodHlwZSwgbWVkaWFUeXBlKTsKKyAgICAgICAgICAgIGVuZHBvaW50ID0gX2NvbmZpZ0ZvclJlYWRpbmcobWFwcGVyLCBhbm5vdGF0aW9ucywgX2RlZmF1bHRSZWFkVmlldyk7CisgICAgICAgICAgICAvLyBhbmQgY2FjaGUgZm9yIGZ1dHVyZSByZXVzZQorICAgICAgICAgICAgc3luY2hyb25pemVkIChfcmVhZGVycykgeworICAgICAgICAgICAgICAgIF9yZWFkZXJzLnB1dChrZXkuaW1tdXRhYmxlS2V5KCksIGVuZHBvaW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZW5kcG9pbnQ7CisgICAgfQorCisgICAgLyoKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIC8qIE92ZXJyaWRhYmxlIGhlbHBlciBtZXRob2RzCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKi8KKworICAgIC8qKgorICAgICAqIE1ldGhvZCBjYWxsZWQgdG8gbG9jYXRlIHtAbGluayBPYmplY3RNYXBwZXJ9IHRvIHVzZSBmb3Igc2VyaWFsaXphdGlvbgorICAgICAqIGFuZCBkZXNlcmlhbGl6YXRpb24uIEV4YWN0IGxvZ2ljIGRlcGVuZHMgb24gc2V0dGluZyBvZgorICAgICAqIHtAbGluayBKYXhSU0ZlYXR1cmUjRFlOQU1JQ19PQkpFQ1RfTUFQUEVSX0xPT0tVUH0uCisgICAgICogCisgICAgICo8cD4KKyAgICAgKiBJZiB7QGxpbmsgSmF4UlNGZWF0dXJlI0RZTkFNSUNfT0JKRUNUX01BUFBFUl9MT09LVVB9IGlzIGRpc2FibGVkIChkZWZhdWx0CisgICAgICogc2V0dGluZyB1bmxlc3MgY2hhbmdlZCksIGJlaGF2aW9yIGlzIGFzIGZvbGxvd3M6CisgICAgICo8b2w+CisgICAgICogPGxpPklmIGFuIGluc3RhbmNlIGhhcyBiZWVuIGV4cGxpY2l0bHkgZGVmaW5lZCBieQorICAgICAqIHtAbGluayAjc2V0TWFwcGVyfSAob3Igbm9uLW51bGwgaW5zdGFuY2UgcGFzc2VkIGluIGNvbnN0cnVjdG9yKSwgdGhhdAorICAgICAqIHdpbGwgYmUgdXNlZC4KKyAgICAgKiAgPC9saT4KKyAgICAgKiA8bGk+SWYgbm90LCB3aWxsIHRyeSB0byBsb2NhdGUgaXQgdXNpbmcgc3RhbmRhcmQgSkFYLVJTCisgICAgICogPGNvZGU+Q29udGV4dFJlc29sdmVyPC9jb2RlPiBtZWNoYW5pc20sIGlmIGl0IGhhcyBiZWVuIHByb3Blcmx5IGNvbmZpZ3VyZWQKKyAgICAgKiB0byBhY2Nlc3MgaXQgKGJ5IEpBWC1SUyBydW50aW1lKS4KKyAgICAgKiAgPC9saT4KKyAgICAgKiA8bGk+RmluYWxseSwgaWYgbm8gbWFwcGVyIGlzIGZvdW5kLCB3aWxsIHJldHVybiBhIGRlZmF1bHQgdW5jb25maWd1cmVkCisgICAgICoge0BsaW5rIE9iamVjdE1hcHBlcn0gaW5zdGFuY2UgKG9uZSBjb25zdHJ1Y3RlZCB3aXRoIGRlZmF1bHQgY29uc3RydWN0b3IKKyAgICAgKiBhbmQgbm90IG1vZGlmaWVkIGluIGFueSB3YXkpCisgICAgICogICA8L2xpPgorICAgICAqPC9vbD4KKyAgICAgKjxwPgorICAgICAqIElmIHtAbGluayBKYXhSU0ZlYXR1cmUjRFlOQU1JQ19PQkpFQ1RfTUFQUEVSX0xPT0tVUH0gaXMgZW5hYmxlZCwgc3RlcHMKKyAgICAgKiAxIGFuZCAyIGFyZSByZXZlcnNlZCwgc3VjaCB0aGF0IEpBWC1SUyA8Y29kZT5Db250ZXh0UmVzb2x2ZXI8L2NvZGU+CisgICAgICogaXMgZmlyc3QgdXNlZCwgYW5kIG9ubHkgaWYgbm9uZSBpcyBkZWZpbmVkIHdpbGwgY29uZmlndXJlZCBtYXBwZXIgYmUgdXNlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIENsYXNzIG9mIG9iamVjdCBiZWluZyBzZXJpYWxpemVkIG9yIGRlc2VyaWFsaXplZDsKKyAgICAgKiAgIG5vdCBjaGVja2VkIGF0IHRoaXMgcG9pbnQsIHNpbmNlIGl0IGlzIGFzc3VtZWQgdGhhdCB1bnByb2Nlc3NhYmxlCisgICAgICogICBjbGFzc2VzIGhhdmUgYmVlbiBhbHJlYWR5IHdlZWRlZCBvdXQsCisgICAgICogICBidXQgd2lsbCBiZSBwYXNzZWQgdG8gPGNvZGU+Q29udGV4dFJlc29sdmVyPC9jb2RlPiBhcyBpcy4KKyAgICAgKiBAcGFyYW0gbWVkaWFUeXBlIERlY2xhcmVkIG1lZGlhIHR5cGUgZm9yIHRoZSBpbnN0YW5jZSB0byBwcm9jZXNzOgorICAgICAqICAgbm90IHVzZWQgYnkgdGhpcyBtZXRob2QsCisgICAgICogICBidXQgd2lsbCBiZSBwYXNzZWQgdG8gPGNvZGU+Q29udGV4dFJlc29sdmVyPC9jb2RlPiBhcyBpcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTUFQUEVSIGxvY2F0ZU1hcHBlcihDbGFzczw/PiB0eXBlLCBNZWRpYVR5cGUgbWVkaWFUeXBlKQorICAgIHsKKyAgICAgICAgLy8gMjktSnVuLTIwMTYsIHRhdHU6IEFzIHBlciBbamF4cnMtcHJvdmlkZXJzIzg2XSBtYXkgd2FudCB0byBkbyBwcm92aWRlciBsb29rdXAgZmlyc3QKKyAgICAgICAgaWYgKGlzRW5hYmxlZChKYXhSU0ZlYXR1cmUuRFlOQU1JQ19PQkpFQ1RfTUFQUEVSX0xPT0tVUCkpIHsKKyAgICAgICAgICAgIE1BUFBFUiBtID0gX2xvY2F0ZU1hcHBlclZpYVByb3ZpZGVyKHR5cGUsIG1lZGlhVHlwZSk7CisgICAgICAgICAgICBpZiAobSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgbSA9IF9tYXBwZXJDb25maWcuZ2V0Q29uZmlndXJlZE1hcHBlcigpOworICAgICAgICAgICAgICAgIGlmIChtID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbSA9IF9tYXBwZXJDb25maWcuZ2V0RGVmYXVsdE1hcHBlcigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtOworICAgICAgICB9CisKKyAgICAgICAgLy8gT3RoZXJ3aXNlIHN0YXJ0IHdpdGggKHByZS0pY29uZmlndXJlZCBNYXBwZXIgYW5kIG9ubHkgY2hlY2sgcHJvdmlkZXIKKyAgICAgICAgLy8gaWYgbm90IGZvdW5kCisgICAgICAgIAorICAgICAgICBNQVBQRVIgbSA9IF9tYXBwZXJDb25maWcuZ2V0Q29uZmlndXJlZE1hcHBlcigpOworICAgICAgICBpZiAobSA9PSBudWxsKSB7CisgICAgICAgICAgICAvLyBJZiBub3QsIG1heWJlIHdlIGNhbiBnZXQgb25lIGNvbmZpZ3VyZWQgdmlhIGNvbnRleHQ/CisgICAgICAgICAgICBtID0gX2xvY2F0ZU1hcHBlclZpYVByb3ZpZGVyKHR5cGUsIG1lZGlhVHlwZSk7CisgICAgICAgICAgICBpZiAobSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgbm90LCBsZXQncyBnZXQgdGhlIGZhbGxiYWNrIGRlZmF1bHQgaW5zdGFuY2UKKyAgICAgICAgICAgICAgICBtID0gX21hcHBlckNvbmZpZy5nZXREZWZhdWx0TWFwcGVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG07CisgICAgfQorCisgICAgLyoqCisgICAgICogT3ZlcnJpZGFibGUgaGVscGVyIG1ldGhvZCB1c2VkIHRvIGFsbG93IGhhbmRsaW5nIG9mIHNvbWV3aGF0IHNwZWNpYWwKKyAgICAgKiB0eXBlcyBmb3IgcmVhZGluZworICAgICAqIAorICAgICAqIEBzaW5jZSAyLjIKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBfaXNTcGVjaWFsUmVhZGFibGUoQ2xhc3M8Pz4gdHlwZSkgeworICAgICAgICByZXR1cm4gSnNvblBhcnNlci5jbGFzcyA9PSB0eXBlOworICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJyaWRhYmxlIGhlbHBlciBtZXRob2QgY2FsbGVkIHRvIGNoZWNrIHdoZXRoZXIgZ2l2ZW4gdHlwZSBpcyBhIGtub3duCisgICAgICogImlnbm9yYWJsZSB0eXBlIiAoaW4gY29udGV4dCBvZiByZWFkaW5nKSwgdmFsdWVzIG9mIHdoaWNoIGFyZSBub3QgYm91bmQKKyAgICAgKiBmcm9tIGNvbnRlbnQuCisgICAgICoKKyAgICAgKiBAc2luY2UgMi42CisgICAgICovCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gX2lzSWdub3JhYmxlRm9yUmVhZGluZyhDbGFzc0tleSB0eXBlS2V5KQorICAgIHsKKyAgICAgICAgcmV0dXJuIF91bnRvdWNoYWJsZXMuY29udGFpbnModHlwZUtleSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3ZlcnJpZGFibGUgaGVscGVyIG1ldGhvZCBjYWxsZWQgdG8gY2hlY2sgd2hldGhlciBnaXZlbiB0eXBlIGlzIGEga25vd24KKyAgICAgKiAiaWdub3JhYmxlIHR5cGUiIChpbiBjb250ZXh0IG9mIHJlYWRpbmcpLCB2YWx1ZXMgb2Ygd2hpY2gKKyAgICAgKiBjYW4gbm90IGJlIHdyaXR0ZW4gb3V0LgorICAgICAqCisgICAgICogQHNpbmNlIDIuNgorICAgICAqLworICAgIHByb3RlY3RlZCBib29sZWFuIF9pc0lnbm9yYWJsZUZvcldyaXRpbmcoQ2xhc3NLZXkgdHlwZUtleSkKKyAgICB7CisgICAgICAgIHJldHVybiBfdW50b3VjaGFibGVzLmNvbnRhaW5zKHR5cGVLZXkpOworICAgIH0KKyAgICAKKyAgICAvKioKKyAgICAgKiBAc2luY2UgMi40CisgICAgICovCisgICAgcHJvdGVjdGVkIElPRXhjZXB0aW9uIF9jcmVhdGVOb0NvbnRlbnRFeGNlcHRpb24oKQorICAgIHsKKyAgICAgICAgLy8gMjktSnVuLTIwMTYsIHRhdHU6IFdpdGggSmFja3NvbiAyLjggd2UgcmVxdWlyZSBKQVgtUlMgMi4wIHNvIHRoaXMKKyAgICAgICAgLy8gICAgaXMgZmluZTsgZWFybGllciBoYWQgY29tcGxpY2F0ZWQgUmVmbGVjdGlvbi1iYXNlZCBhY2Nlc3MKKyAgICAgICAgcmV0dXJuIG5ldyBOb0NvbnRlbnRFeGNlcHRpb24oIk5vIGNvbnRlbnQgKGVtcHR5IGlucHV0IHN0cmVhbSkiKTsKKyAgICB9CisKKyAgICAvKgorICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgLyogUHJpdmF0ZS9zdWItY2xhc3MgaGVscGVyIG1ldGhvZHMKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqLworCisgICAgcHJvdGVjdGVkIHN0YXRpYyBib29sZWFuIF9jb250YWluZWRJbihDbGFzczw/PiBtYWluVHlwZSwgSGFzaFNldDxDbGFzc0tleT4gc2V0KQorICAgIHsKKyAgICAgICAgaWYgKHNldCAhPSBudWxsKSB7CisgICAgICAgICAgICBDbGFzc0tleSBrZXkgPSBuZXcgQ2xhc3NLZXkobWFpblR5cGUpOworICAgICAgICAgICAgLy8gRmlyc3Q6IHR5cGUgaXRzZWxmPworICAgICAgICAgICAgaWYgKHNldC5jb250YWlucyhrZXkpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIC8vIFRoZW4gc3VwZXJ0eXBlcyAobm90ZTogd2lsbCBub3QgY29udGFpbiBPYmplY3QuY2xhc3MpCisgICAgICAgICAgICBmb3IgKENsYXNzPD8+IGNscyA6IGZpbmRTdXBlclR5cGVzKG1haW5UeXBlLCBudWxsKSkgeworICAgICAgICAgICAgICAgIGtleS5yZXNldChjbHMpOworICAgICAgICAgICAgICAgIGlmIChzZXQuY29udGFpbnMoa2V5KSkgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByb3RlY3RlZCBCb29sZWFuIF9maW5kQ3VzdG9tVW50b3VjaGFibGUoQ2xhc3M8Pz4gbWFpblR5cGUpCisgICAgeworICAgICAgICBpZiAoX2NmZ0N1c3RvbVVudG91Y2hhYmxlcyAhPSBudWxsKSB7CisgICAgICAgICAgICBDbGFzc0tleSBrZXkgPSBuZXcgQ2xhc3NLZXkobWFpblR5cGUpOworICAgICAgICAgICAgLy8gRmlyc3Q6IHR5cGUgaXRzZWxmPworICAgICAgICAgICAgQm9vbGVhbiBiID0gX2NmZ0N1c3RvbVVudG91Y2hhYmxlcy5nZXQoa2V5KTsKKyAgICAgICAgICAgIGlmIChiICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFRoZW4gc3VwZXJ0eXBlcyAobm90ZTogd2lsbCBub3QgY29udGFpbiBPYmplY3QuY2xhc3MpCisgICAgICAgICAgICBmb3IgKENsYXNzPD8+IGNscyA6IGZpbmRTdXBlclR5cGVzKG1haW5UeXBlLCBudWxsKSkgeworICAgICAgICAgICAgICAgIGtleS5yZXNldChjbHMpOworICAgICAgICAgICAgICAgIGIgPSBfY2ZnQ3VzdG9tVW50b3VjaGFibGVzLmdldChrZXkpOworICAgICAgICAgICAgICAgIGlmIChiICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgc3RhdGljIExpc3Q8Q2xhc3M8Pz4+IGZpbmRTdXBlclR5cGVzKENsYXNzPD8+IGNscywgQ2xhc3M8Pz4gZW5kQmVmb3JlKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGZpbmRTdXBlclR5cGVzKGNscywgZW5kQmVmb3JlLCBuZXcgQXJyYXlMaXN0PENsYXNzPD8+Pig4KSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHN0YXRpYyBMaXN0PENsYXNzPD8+PiBmaW5kU3VwZXJUeXBlcyhDbGFzczw/PiBjbHMsIENsYXNzPD8+IGVuZEJlZm9yZSwgTGlzdDxDbGFzczw/Pj4gcmVzdWx0KQorICAgIHsKKyAgICAgICAgX2FkZFN1cGVyVHlwZXMoY2xzLCBlbmRCZWZvcmUsIHJlc3VsdCwgZmFsc2UpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICAKKyAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX2FkZFN1cGVyVHlwZXMoQ2xhc3M8Pz4gY2xzLCBDbGFzczw/PiBlbmRCZWZvcmUsIENvbGxlY3Rpb248Q2xhc3M8Pz4+IHJlc3VsdCwgYm9vbGVhbiBhZGRDbGFzc0l0c2VsZikKKyAgICB7CisgICAgICAgIGlmIChjbHMgPT0gZW5kQmVmb3JlIHx8IGNscyA9PSBudWxsIHx8IGNscyA9PSBPYmplY3QuY2xhc3MpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoYWRkQ2xhc3NJdHNlbGYpIHsKKyAgICAgICAgICAgIGlmIChyZXN1bHQuY29udGFpbnMoY2xzKSkgeyAvLyBhbHJlYWR5IGFkZGVkLCBubyBuZWVkIHRvIGNoZWNrIHN1cGVycworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdC5hZGQoY2xzKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKENsYXNzPD8+IGludENscyA6IGNscy5nZXRJbnRlcmZhY2VzKCkpIHsKKyAgICAgICAgICAgIF9hZGRTdXBlclR5cGVzKGludENscywgZW5kQmVmb3JlLCByZXN1bHQsIHRydWUpOworICAgICAgICB9CisgICAgICAgIF9hZGRTdXBlclR5cGVzKGNscy5nZXRTdXBlcmNsYXNzKCksIGVuZEJlZm9yZSwgcmVzdWx0LCB0cnVlKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwcml2YXRlIGZpbmFsIFRISVMgX3RoaXMoKSB7CisgICAgICAgIHJldHVybiAoVEhJUykgdGhpczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYWNrc29uL2ludGVybmFsL2phY2tzb24vamF4cnMvY2ZnL0Fubm90YXRpb25CdW5kbGVLZXkuamF2YSBiL21lZGlhL2pzb24tamFja3Nvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2phY2tzb24vaW50ZXJuYWwvamFja3Nvbi9qYXhycy9jZmcvQW5ub3RhdGlvbkJ1bmRsZUtleS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NGE3ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYWNrc29uL2ludGVybmFsL2phY2tzb24vamF4cnMvY2ZnL0Fubm90YXRpb25CdW5kbGVLZXkuamF2YQpAQCAtMCwwICsxLDEzMiBAQAorcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uLmludGVybmFsLmphY2tzb24uamF4cnMuY2ZnOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKKworLyoqCisgKiBIZWxwZXIgY2xhc3MgdXNlZCB0byBhbGxvdyBlZmZpY2llbnQgY2FjaGluZyBvZiBpbmZvcm1hdGlvbiwKKyAqIGdpdmVuIGEgc2VxdWVuY2Ugb2YgQW5ub3RhdGlvbnMuCisgKiBUaGlzIGlzIG1vc3RseSB1c2VkIGZvciByZXVzaW5nIGludHJvc3BlY3RlZCBpbmZvcm1hdGlvbiBvbgorICogSkFYLVJTIGVuZCBwb2ludHMuCisgKgorICogQHNpbmNlIDIuMgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgQW5ub3RhdGlvbkJ1bmRsZUtleQoreworICAgIHByaXZhdGUgZmluYWwgc3RhdGljIEFubm90YXRpb25bXSBOT19BTk5PVEFUSU9OUyA9IG5ldyBBbm5vdGF0aW9uWzBdOworICAgIAorICAgIHByaXZhdGUgZmluYWwgQW5ub3RhdGlvbltdIF9hbm5vdGF0aW9uczsKKworICAgIC8qKgorICAgICAqIFdlIGFsc28gc2VlbSB0byBuZWVkIHRoZSB0eXBlIGFzIHBhcnQgb2YgdGhlIGtleSAoYXMgcGVyIFtJc3N1ZSMxMV0pOworICAgICAqIGhvcGVmdWxseSB0aGF0IGFuZCBhbm5vdGF0aW9ucyBhcmUgZW5vdWdoIChpZiBub3QsIG1heSBuZWVkIHRvIHJlY29uc2lkZXIKKyAgICAgKiB0aGUgd2F5IGNhY2hpbmcgaXMgZG9uZSwgYW5kIHBvc3NpYmx5IG9ubHkgY2FjaGUgZGVyaXZhdGlvbiBvZiBhbm5vdGF0aW9ucywKKyAgICAgKiBub3QgbWFwcGVyIG9yIHJlYWRlci93cml0ZXIpLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgQ2xhc3M8Pz4gX3R5cGU7CisgICAgCisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIF9hbm5vdGF0aW9uc0NvcGllZDsKKworICAgIHByaXZhdGUgZmluYWwgaW50IF9oYXNoQ29kZTsKKyAgICAKKyAgICAvKgorICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgLyogQ29uc3RydWN0aW9uCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKi8KKworICAgIHB1YmxpYyBBbm5vdGF0aW9uQnVuZGxlS2V5KEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgQ2xhc3M8Pz4gdHlwZSkKKyAgICB7CisgICAgICAgIF90eXBlID0gdHlwZTsKKyAgICAgICAgLy8gZ2V0dGluZyBoYXNoIG9mIG5hbWUgaXMgZmFzdGVyIHRoYW4gQ2xhc3MuaGFzaENvZGUoKSBqdXN0IGJlY2F1c2UgbGF0dGVyIHVzZXMgc3lzdGVtIGlkZW50aXR5IGhhc2g6CisgICAgICAgIGZpbmFsIGludCB0eXBlSGFzaCA9IHR5cGUuZ2V0TmFtZSgpLmhhc2hDb2RlKCk7CisgICAgICAgIGlmIChhbm5vdGF0aW9ucyA9PSBudWxsIHx8IGFubm90YXRpb25zLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICBhbm5vdGF0aW9ucyA9IE5PX0FOTk9UQVRJT05TOworICAgICAgICAgICAgX2Fubm90YXRpb25zQ29waWVkID0gdHJ1ZTsKKyAgICAgICAgICAgIF9oYXNoQ29kZSA9IHR5cGVIYXNoOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX2Fubm90YXRpb25zQ29waWVkID0gZmFsc2U7CisgICAgICAgICAgICBfaGFzaENvZGUgPSBjYWxjSGFzaChhbm5vdGF0aW9ucykgXiB0eXBlSGFzaDsKKyAgICAgICAgfQorICAgICAgICBfYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uczsKKyAgICB9CisKKyAgICBwcml2YXRlIEFubm90YXRpb25CdW5kbGVLZXkoQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBDbGFzczw/PiB0eXBlLCBpbnQgaGFzaENvZGUpCisgICAgeworICAgICAgICBfYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uczsKKyAgICAgICAgX2Fubm90YXRpb25zQ29waWVkID0gdHJ1ZTsKKyAgICAgICAgX3R5cGUgPSB0eXBlOworICAgICAgICBfaGFzaENvZGUgPSBoYXNoQ29kZTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBpbnQgY2FsY0hhc2goQW5ub3RhdGlvbltdIGFubm90YXRpb25zKQorICAgIHsKKyAgICAgICAgLyogaG1taC4gQ2FuJ3QganVzdCBiYXNlIG9uIEFubm90YXRpb24gdHlwZTsgY2hhbmNlcyBhcmUgdGhhdCBBbm5vdGF0aW9uCisgICAgICAgICAqIGluc3RhbmNlcyB1c2UgaWRlbnRpdHkgaGFzaCwgd2hpY2ggaGFzIHRvIGRvLgorICAgICAgICAgKi8KKyAgICAgICAgZmluYWwgaW50IGxlbiA9IGFubm90YXRpb25zLmxlbmd0aDsKKyAgICAgICAgaW50IGhhc2ggPSBsZW47CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKKyAgICAgICAgICAgIGhhc2ggPSAoaGFzaCAqIDMxKSArIGFubm90YXRpb25zW2ldLmhhc2hDb2RlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorICAgIAorICAgIC8qKgorICAgICAqIE1ldGhvZCBjYWxsZWQgdG8gY3JlYXRlIGEgc2FmZSBpbW11dGFibGUgY29weSBvZiB0aGUga2V5OyB1c2VkIHdoZW4KKyAgICAgKiBhZGRpbmcgZW50cnkgd2l0aCB0aGlzIGtleSAtLSBsb29rdXBzIGFyZSBvayB3aXRob3V0IGNhbGxpbmcgdGhlIG1ldGhvZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQW5ub3RhdGlvbkJ1bmRsZUtleSBpbW11dGFibGVLZXkoKSB7CisgICAgICAgIGlmIChfYW5ub3RhdGlvbnNDb3BpZWQpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisgICAgICAgIGludCBsZW4gPSBfYW5ub3RhdGlvbnMubGVuZ3RoOworICAgICAgICBBbm5vdGF0aW9uW10gbmV3QW5ub3RhdGlvbnMgPSBuZXcgQW5ub3RhdGlvbltsZW5dOworICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KF9hbm5vdGF0aW9ucywgMCwgbmV3QW5ub3RhdGlvbnMsIDAsIGxlbik7CisgICAgICAgIHJldHVybiBuZXcgQW5ub3RhdGlvbkJ1bmRsZUtleShuZXdBbm5vdGF0aW9ucywgX3R5cGUsIF9oYXNoQ29kZSk7CisgICAgfQorICAgIAorICAgIC8qCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAvKiBPdmVycmlkZGVuIG1ldGhvZHMKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqLworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgcmV0dXJuIF9oYXNoQ29kZTsKKyAgICB9CisgICAgCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJbQW5ub3RhdGlvbnM6ICIrX2Fubm90YXRpb25zLmxlbmd0aCsiLCB0eXBlOiAiCisgICAgICAgICAgICAgICAgK190eXBlLmdldE5hbWUoKSsiLCBoYXNoIDB4IitJbnRlZ2VyLnRvSGV4U3RyaW5nKF9oYXNoQ29kZSkKKyAgICAgICAgICAgICAgICArIiwgY29waWVkOiAiK19hbm5vdGF0aW9uc0NvcGllZCsiXSI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKQorICAgIHsKKyAgICAgICAgaWYgKG8gPT0gdGhpcykgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChvID09IG51bGwpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKG8uZ2V0Q2xhc3MoKSAhPSBnZXRDbGFzcygpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIEFubm90YXRpb25CdW5kbGVLZXkgb3RoZXIgPSAoQW5ub3RhdGlvbkJ1bmRsZUtleSkgbzsKKyAgICAgICAgaWYgKChvdGhlci5faGFzaENvZGUgIT0gX2hhc2hDb2RlKSB8fCAob3RoZXIuX3R5cGUgIT0gX3R5cGUpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9lcXVhbHMob3RoZXIuX2Fubm90YXRpb25zKTsKKyAgICB9CisgICAgCisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIF9lcXVhbHMoQW5ub3RhdGlvbltdIG90aGVyQW5uKQorICAgIHsKKyAgICAgICAgZmluYWwgaW50IGxlbiA9IF9hbm5vdGF0aW9ucy5sZW5ndGg7CisgICAgICAgIGlmIChvdGhlckFubi5sZW5ndGggIT0gbGVuKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47ICsraSkgeworICAgICAgICAgICAgaWYgKF9hbm5vdGF0aW9uc1tpXSAhPSBvdGhlckFubltpXSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYWNrc29uL2ludGVybmFsL2phY2tzb24vamF4cnMvY2ZnL0Fubm90YXRpb25zLmphdmEgYi9tZWRpYS9qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYWNrc29uL2ludGVybmFsL2phY2tzb24vamF4cnMvY2ZnL0Fubm90YXRpb25zLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYxMjI4YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2pzb24tamFja3Nvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2phY2tzb24vaW50ZXJuYWwvamFja3Nvbi9qYXhycy9jZmcvQW5ub3RhdGlvbnMuamF2YQpAQCAtMCwwICsxLDIzIEBACitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uaW50ZXJuYWwuamFja3Nvbi5qYXhycy5jZmc7CisKKy8qKgorICogRW51bWVyYXRpb24gdGhhdCBkZWZpbmVzIHN0YW5kYXJkIGFubm90YXRpb24gc2V0cyBhdmFpbGFibGUgZm9yIGNvbmZpZ3VyaW5nCisgKiBkYXRhIGJpbmRpbmcgYXNwZWN0cy4KKyAqIAorICogQHNpbmNlIDIuMiAoZWFybGllciBsb2NhdGVkIGluIGFjdHVhbCBkYXRhdHlwZS1zcGVjaWZpYyBtb2R1bGVzKQorICovCitwdWJsaWMgZW51bSBBbm5vdGF0aW9ucyB7CisgICAgLyoqCisgICAgICogU3RhbmRhcmQgSmFja3NvbiBhbm5vdGF0aW9ucywgZGVmaW5lZCBpbiBKYWNrc29uIGNvcmUgYW5kIGRhdGFiaW5kCisgICAgICogcGFja2FnZXMKKyAgICAgKi8KKyAgICBKQUNLU09OLAorCisgICAgLyoqCisgICAgICogU3RhbmRhcmQgSkFYQiBhbm5vdGF0aW9ucywgdXNlZCBpbiBhIHdheSB0aGF0IGFwcHJveGltYXRlcyBleHBlY3RlZAorICAgICAqIGRlZmluaXRpb25zIChzaW5jZSBKQVhCIGRlZmluZXMgWE1MIGFzcGVjdHMsIG5vdCBhbGwgZmVhdHVyZXMgbWFwCisgICAgICogd2VsbCB0byBKU09OIGhhbmRsaW5nKQorICAgICAqLworICAgIEpBWEIKKyAgICA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYWNrc29uL2ludGVybmFsL2phY2tzb24vamF4cnMvY2ZnL0VuZHBvaW50Q29uZmlnQmFzZS5qYXZhIGIvbWVkaWEvanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamFja3Nvbi9pbnRlcm5hbC9qYWNrc29uL2pheHJzL2NmZy9FbmRwb2ludENvbmZpZ0Jhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmM4ZTFhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamFja3Nvbi9pbnRlcm5hbC9qYWNrc29uL2pheHJzL2NmZy9FbmRwb2ludENvbmZpZ0Jhc2UuamF2YQpAQCAtMCwwICsxLDE5NiBAQAorcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uLmludGVybmFsLmphY2tzb24uamF4cnMuY2ZnOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uaW50ZXJuYWwuamFja3Nvbi5qYXhycy5hbm5vdGF0aW9uLkphY2tzb25GZWF0dXJlczsKKworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5hbm5vdGF0aW9uLkphY2tzb25Bbm5vdGF0aW9uc0luc2lkZTsKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uYW5ub3RhdGlvbi5Kc29uUm9vdE5hbWU7CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmFubm90YXRpb24uSnNvblZpZXc7CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLkRlc2VyaWFsaXphdGlvbkZlYXR1cmU7CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLk9iamVjdFJlYWRlcjsKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuT2JqZWN0V3JpdGVyOworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5TZXJpYWxpemF0aW9uRmVhdHVyZTsKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuY2ZnLk1hcHBlckNvbmZpZzsKKworLyoqCisgKiBDb250YWluZXIgY2xhc3MgZm9yIGZpZ3VyaW5nIG91dCBhbm5vdGF0aW9uLWJhc2VkIGNvbmZpZ3VyYXRpb24KKyAqIGZvciBKQVgtUlMgZW5kIHBvaW50cy4KKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEVuZHBvaW50Q29uZmlnQmFzZTxUSElTIGV4dGVuZHMgRW5kcG9pbnRDb25maWdCYXNlPFRISVM+PgoreworICAgIC8vIC8vIEdlbmVyYWwgY29uZmlndXJhdGlvbgorCisgICAgLyoqCisgICAgICogQHNpbmNlIDIuNgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCBNYXBwZXJDb25maWc8Pz4gX2NvbmZpZzsKKworICAgIHByb3RlY3RlZCBDbGFzczw/PiBfYWN0aXZlVmlldzsKKworICAgIHByb3RlY3RlZCBTdHJpbmcgX3Jvb3ROYW1lOworCisgICAgLy8gLy8gRGVzZXJpYWxpemF0aW9uLW9ubHkgY29uZmlnCisKKyAgICBwcm90ZWN0ZWQgRGVzZXJpYWxpemF0aW9uRmVhdHVyZVtdIF9kZXNlckVuYWJsZTsKKyAgICBwcm90ZWN0ZWQgRGVzZXJpYWxpemF0aW9uRmVhdHVyZVtdIF9kZXNlckRpc2FibGU7CisKKyAgICBwcm90ZWN0ZWQgT2JqZWN0UmVhZGVyIF9yZWFkZXI7CisKKyAgICAvLyAvLyBTZXJpYWxpemF0aW9uLW9ubHkgY29uZmlnCisKKyAgICBwcm90ZWN0ZWQgU2VyaWFsaXphdGlvbkZlYXR1cmVbXSBfc2VyRW5hYmxlOworICAgIHByb3RlY3RlZCBTZXJpYWxpemF0aW9uRmVhdHVyZVtdIF9zZXJEaXNhYmxlOworCisgICAgcHJvdGVjdGVkIE9iamVjdFdyaXRlciBfd3JpdGVyOworCisgICAgLyoKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIC8qIENvbnN0cnVjdGlvbgorICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICovCisKKyAgICBwcm90ZWN0ZWQgRW5kcG9pbnRDb25maWdCYXNlKE1hcHBlckNvbmZpZzw/PiBjb25maWcpIHsKKyAgICAgICAgX2NvbmZpZyA9IGNvbmZpZzsKKyAgICB9CisgICAgCisgICAgQERlcHJlY2F0ZWQgLy8gc2luY2UgMi42CisgICAgcHJvdGVjdGVkIEVuZHBvaW50Q29uZmlnQmFzZSgpIHsKKyAgICAgICAgX2NvbmZpZyA9IG51bGw7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHJvdGVjdGVkIFRISVMgYWRkKEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgYm9vbGVhbiBmb3JXcml0aW5nKQorICAgIHsKKyAgICAgICAgaWYgKGFubm90YXRpb25zICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZvciAoQW5ub3RhdGlvbiBhbm5vdGF0aW9uIDogYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgICAgICAgICBhZGRBbm5vdGF0aW9uKGFubm90YXRpb24uYW5ub3RhdGlvblR5cGUoKSwgYW5ub3RhdGlvbiwgZm9yV3JpdGluZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChUSElTKSB0aGlzOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFkZEFubm90YXRpb24oQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IHR5cGUsCisgICAgICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb24sIGJvb2xlYW4gZm9yV3JpdGluZykKKyAgICB7CisgICAgICAgIGlmICh0eXBlID09IEpzb25WaWV3LmNsYXNzKSB7CisgICAgICAgICAgICAvLyBDYW4gb25seSB1c2Ugb25lIHZpZXc7IGJ1dCBpZiBtdWx0aXBsZSBkZWZpbmVkLCB1c2UgZmlyc3QgKG5vIGV4Y2VwdGlvbikKKyAgICAgICAgICAgIENsYXNzPD8+W10gdmlld3MgPSAoKEpzb25WaWV3KSBhbm5vdGF0aW9uKS52YWx1ZSgpOworICAgICAgICAgICAgX2FjdGl2ZVZpZXcgPSAodmlld3MubGVuZ3RoID4gMCkgPyB2aWV3c1swXSA6IG51bGw7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBKYWNrc29uRmVhdHVyZXMuY2xhc3MpIHsKKyAgICAgICAgICAgIEphY2tzb25GZWF0dXJlcyBmZWF0cyA9IChKYWNrc29uRmVhdHVyZXMpIGFubm90YXRpb247CisgICAgICAgICAgICBpZiAoZm9yV3JpdGluZykgeworICAgICAgICAgICAgICAgIF9zZXJFbmFibGUgPSBudWxsSWZFbXB0eShmZWF0cy5zZXJpYWxpemF0aW9uRW5hYmxlKCkpOworICAgICAgICAgICAgICAgIF9zZXJEaXNhYmxlID0gbnVsbElmRW1wdHkoZmVhdHMuc2VyaWFsaXphdGlvbkRpc2FibGUoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIF9kZXNlckVuYWJsZSA9IG51bGxJZkVtcHR5KGZlYXRzLmRlc2VyaWFsaXphdGlvbkVuYWJsZSgpKTsKKyAgICAgICAgICAgICAgICBfZGVzZXJEaXNhYmxlID0gbnVsbElmRW1wdHkoZmVhdHMuZGVzZXJpYWxpemF0aW9uRGlzYWJsZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IEpzb25Sb290TmFtZS5jbGFzcykgeworICAgICAgICAgICAgX3Jvb3ROYW1lID0gKChKc29uUm9vdE5hbWUpIGFubm90YXRpb24pLnZhbHVlKCk7CisgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBKYWNrc29uQW5ub3RhdGlvbnNJbnNpZGUuY2xhc3MpIHsKKyAgICAgICAgICAgIC8vIHNraXA7IHByb2Nlc3NlZCBiZWxvdyAoaW4gcGFyZW50KSwgc28gZW5jb3VudGVyaW5nIGhlcmUgaXMgb2Ygbm8gdXNlCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBGb3IgYWxsIHVucmVjb2duaXplZCB0eXBlcywgY2hlY2sgbWV0YS1hbm5vdGF0aW9uKHMpIHRvIHNlZSBpZiB0aGV5IGFyZSBidW5kbGVzCisgICAgICAgICAgICBKYWNrc29uQW5ub3RhdGlvbnNJbnNpZGUgaW5zaWRlID0gdHlwZS5nZXRBbm5vdGF0aW9uKEphY2tzb25Bbm5vdGF0aW9uc0luc2lkZS5jbGFzcyk7CisgICAgICAgICAgICBpZiAoaW5zaWRlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhZGQodHlwZS5nZXRBbm5vdGF0aW9ucygpLCBmb3JXcml0aW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHByb3RlY3RlZCBUSElTIGluaXRSZWFkZXIoT2JqZWN0UmVhZGVyIHJlYWRlcikKKyAgICB7CisgICAgICAgIGlmIChfYWN0aXZlVmlldyAhPSBudWxsKSB7CisgICAgICAgICAgICByZWFkZXIgPSByZWFkZXIud2l0aFZpZXcoX2FjdGl2ZVZpZXcpOworICAgICAgICB9CisgICAgICAgIGlmIChfcm9vdE5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVhZGVyID0gcmVhZGVyLndpdGhSb290TmFtZShfcm9vdE5hbWUpOworICAgICAgICB9CisgICAgICAgIC8vIFRoZW4gZGVzZXIgZmVhdHVyZXMKKyAgICAgICAgaWYgKF9kZXNlckVuYWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZWFkZXIgPSByZWFkZXIud2l0aEZlYXR1cmVzKF9kZXNlckVuYWJsZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9kZXNlckRpc2FibGUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVhZGVyID0gcmVhZGVyLndpdGhvdXRGZWF0dXJlcyhfZGVzZXJEaXNhYmxlKTsKKyAgICAgICAgfQorICAgICAgICBfcmVhZGVyID0gcmVhZGVyOworICAgICAgICByZXR1cm4gKFRISVMpIHRoaXM7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHJvdGVjdGVkIFRISVMgaW5pdFdyaXRlcihPYmplY3RXcml0ZXIgd3JpdGVyKQorICAgIHsKKyAgICAgICAgaWYgKF9hY3RpdmVWaWV3ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHdyaXRlciA9IHdyaXRlci53aXRoVmlldyhfYWN0aXZlVmlldyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9yb290TmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIgPSB3cml0ZXIud2l0aFJvb3ROYW1lKF9yb290TmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhlbiBmZWF0dXJlcworICAgICAgICBpZiAoX3NlckVuYWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIgPSB3cml0ZXIud2l0aEZlYXR1cmVzKF9zZXJFbmFibGUpOworICAgICAgICB9CisgICAgICAgIGlmIChfc2VyRGlzYWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICB3cml0ZXIgPSB3cml0ZXIud2l0aG91dEZlYXR1cmVzKF9zZXJEaXNhYmxlKTsKKyAgICAgICAgfQorICAgICAgICBfd3JpdGVyID0gd3JpdGVyOworICAgICAgICByZXR1cm4gKFRISVMpIHRoaXM7CisgICAgfQorICAgIAorICAgIC8qCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAvKiBBY2Nlc3NvcnMKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqLworCisgICAgLyoqCisgICAgICogQHNpbmNlIDIuMworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Um9vdE5hbWUoKSB7CisgICAgICAgIHJldHVybiBfcm9vdE5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNpbmNlIDIuMworICAgICAqLworICAgIHB1YmxpYyBDbGFzczw/PiBnZXRBY3RpdmVWaWV3KCkgeworICAgICAgICByZXR1cm4gX2FjdGl2ZVZpZXc7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBmaW5hbCBPYmplY3RSZWFkZXIgZ2V0UmVhZGVyKCkgeworICAgICAgICBpZiAoX3JlYWRlciA9PSBudWxsKSB7IC8vIHNhbml0eSBjaGVjaywgc2hvdWxkIG5ldmVyIGhhcHBlbgorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfcmVhZGVyOworICAgIH0KKworICAgIHB1YmxpYyBmaW5hbCBPYmplY3RXcml0ZXIgZ2V0V3JpdGVyKCkgeworICAgICAgICBpZiAoX3dyaXRlciA9PSBudWxsKSB7IC8vIHNhbml0eSBjaGVjaywgc2hvdWxkIG5ldmVyIGhhcHBlbgorICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfd3JpdGVyOworICAgIH0KKworICAgIC8qCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAvKiBWYWx1ZSBtb2RpZmljYXRpb25zCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKi8KKworICAgIHB1YmxpYyBhYnN0cmFjdCBPYmplY3QgbW9kaWZ5QmVmb3JlV3JpdGUoT2JqZWN0IHZhbHVlKTsKKworICAgIC8qCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAvKiBIZWxwZXIgbWV0aG9kcworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICovCisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIDxUPiBUW10gbnVsbElmRW1wdHkoVFtdIGFyZykgeworICAgICAgICBpZiAoYXJnID09IG51bGwgfHwgYXJnLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYXJnOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2pzb24tamFja3Nvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2phY2tzb24vaW50ZXJuYWwvamFja3Nvbi9qYXhycy9jZmcvSmF4UlNGZWF0dXJlLmphdmEgYi9tZWRpYS9qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYWNrc29uL2ludGVybmFsL2phY2tzb24vamF4cnMvY2ZnL0pheFJTRmVhdHVyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZWM0YTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYWNrc29uL2ludGVybmFsL2phY2tzb24vamF4cnMvY2ZnL0pheFJTRmVhdHVyZS5qYXZhCkBAIC0wLDAgKzEsMTIzIEBACitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uaW50ZXJuYWwuamFja3Nvbi5qYXhycy5jZmc7CisKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuY2ZnLkNvbmZpZ0ZlYXR1cmU7CisKKy8qKgorICogRW51bWVyYXRpb24gdGhhdCBkZWZpbmVzIHNpbXBsZSBvbi9vZmYgZmVhdHVyZXMgdGhhdCBjYW4gYmUKKyAqIHVzZWQgb24gYWxsIEphY2tzb24gSkFYLVJTIHByb3ZpZGVycywgcmVnYXJkbGVzcyBvZgorICogdW5kZXJseWluZyBkYXRhIGZvcm1hdC4KKyAqLworcHVibGljIGVudW0gSmF4UlNGZWF0dXJlIGltcGxlbWVudHMgQ29uZmlnRmVhdHVyZQoreworICAgIC8qCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAvKiBJbnB1dCBoYW5kbGluZworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBGZWF0dXJlIHJlbGF0ZWQgdG8KKyAgICAgKiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vRmFzdGVyWE1ML2phY2tzb24tamF4cnMtcHJvdmlkZXJzL2lzc3Vlcy80OSI+SXNzdWUgIzQ5PC9hPjoKKyAgICAgKiB3aGV0aGVyIGVtcHR5IGlucHV0IGlzIGNvbnNpZGVyZWQgbGVnYWwgb3Igbm90LgorICAgICAqIElmIHNldCB0byB0cnVlLCBlbXB0eSBjb250ZW50IGlzIGFsbG93ZWQgYW5kIHdpbGwgYmUgcmVhZCBhcyBKYXZhICdudWxsJzogaWYgZmFsc2UsCisgICAgICogYW4ge0BsaW5rIGphdmEuaW8uSU9FeGNlcHRpb259IHdpbGwgYmUgdGhyb3duLgorICAgICAqPHA+CisgICAgICogTk9URTogaW4gY2FzZSBvZiBKQVgtUlMgMi4wLCBzcGVjaWZpYyBleGNlcHRpb24gd2lsbCBiZSA8Y29kZT5qYXZheC53cy5ycy5jb3JlLk5vQ29udGVudEV4Y2VwdGlvbjwvY29kZT47CisgICAgICogYnV0IHRoaXMgaXMgbm90IGRlZmluZWQgaW4gSkFYLVJTIDEueC4KKyAgICAgKi8KKyAgICBBTExPV19FTVBUWV9JTlBVVCh0cnVlKSwKKworICAgIC8qCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAvKiBIVFRQIGhlYWRlcnMKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqLworICAgIAorICAgIC8qKgorICAgICAqIEZlYXR1cmUgdGhhdCBjYW4gYmUgZW5hYmxlZCB0byBtYWtlIHByb3ZpZGVyIGF1dG9tYXRpY2FsbHkKKyAgICAgKiBhZGQgIm5vc25pZmYiIChzZWUKKyAgICAgKiA8YSBocmVmPSJodHRwOi8vc2VjdXJpdHkuc3RhY2tleGNoYW5nZS5jb20vcXVlc3Rpb25zLzIwNDEzL2hvdy1jYW4taS1wcmV2ZW50LXJlZmxlY3RlZC14c3MtaW4tbXktanNvbi13ZWItc2VydmljZXMiPnRoaXMgZW50cnk8L2E+CisgICAgICogZm9yIGRldGFpbHMKKyAgICAgKjxwPgorICAgICAqIEZlYXR1cmUgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4KKyAgICAgKi8KKyAgICBBRERfTk9fU05JRkZfSEVBREVSKGZhbHNlKSwKKworICAgIC8qCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAvKiBDYWNoaW5nLCByZWxhdGVkCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKi8KKworICAgIC8qKgorICAgICAqIEZlYXR1cmUgdGhhdCBtYXkgYmUgZW5hYmxlZCB0byBmb3JjZSBkeW5hbWljIGxvb2t1cCBvZiA8Y29kZT5PYmplY3RNYXBwZXI8L2NvZGU+CisgICAgICogdmlhIEpBWC1SUyBQcm92aWRlciBpbnRlcmZhY2UsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciA8Y29kZT5NYXBwZXJDb25maWd1cmF0b3I8Y29kZT4KKyAgICAgKiBoYXMgZXhwbGljaXRseSBjb25maWd1cmVkIG1hcHBlciBvciBub3Q7IGlmIGRpc2FibGVkLCBzdGF0aWMgY29uZmlndXJhdGlvbiB3aWxsCisgICAgICogdGFrZSBwcmVjZWRlbmNlLgorICAgICAqIE5vdGUgdGhhdCBpZiB0aGlzIGZlYXR1cmUgaXMgZW5hYmxlZCwgaXQgdHlwaWNhbGx5IG1ha2VzIHNlbnNlIHRvIGFsc28gZGlzYWJsZQorICAgICAqIHtAbGluayBKYXhSU0ZlYXR1cmUjQ0FDSEVfRU5EUE9JTlRfUkVBREVSU30gYW5kIHtAbGluayBKYXhSU0ZlYXR1cmUjQ0FDSEVfRU5EUE9JTlRfV1JJVEVSU30KKyAgICAgKiBzaW5jZSBjYWNoaW5nIHdvdWxkIHByZXZlbnQgbG9va3Vwcy4KKyAgICAgKjxwPgorICAgICAqIEZlYXR1cmUgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4KKyAgICAgKgorICAgICAqIEBzaW5jZSAyLjgKKyAgICAgKi8KKyAgICBEWU5BTUlDX09CSkVDVF9NQVBQRVJfTE9PS1VQKGZhbHNlKSwKKyAgICAKKyAgICAvKioKKyAgICAgKiBbamF4cnMtcHJvdmlkZXJzIzg2XTogRmVhdHVyZSB0aGF0IGRldGVybWluZXMgd2hldGhlciBwcm92aWRlciB3aWxsIGNhY2hlIGVuZHBvaW50CisgICAgICogZGVmaW5pdGlvbnMgZm9yIHJlYWRpbmcgb3Igbm90IChpbmNsdWRpbmcgY2FjaGluZyBvZiBhY3R1YWwgPGNvZGU+T2JqZWN0UmVhZGVyPC9jb2RlPiB0byB1c2UpLgorICAgICAqIEZlYXR1cmUgbWF5IGJlIGRpc2FibGVkIGlmIHJlY29uZmlndXJhdGlvbiBvciBhbHRlcm5hdGUgaXNudGFuY2Ugb2YgPGNvZGU+T2JqZWN0TWFwcGVyPC9jb2RlPiBpcyBuZWVkZWQuCisgICAgICo8cD4KKyAgICAgKiBOb3RlIHRoYXQgZGlzYWJsaW5nIG9mIHRoZSBmZWF0dXJlIG1heSBhZGQgc2lnbmlmaWNhbnQgYW1vdW50IG9mIG92ZXJoZWFkIGZvciBwcm9jZXNzaW5nLgorICAgICAqPHA+CisgICAgICogRmVhdHVyZSBpcyBlbmFibGVkIGJ5IGRlZmF1bHQuCisgICAgICoKKyAgICAgKiBAc2luY2UgMi44CisgICAgICovCisgICAgQ0FDSEVfRU5EUE9JTlRfUkVBREVSUyh0cnVlKSwKKworICAgIC8qKgorICAgICAqIFtqYXhycy1wcm92aWRlcnMjODZdOiBGZWF0dXJlIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIHByb3ZpZGVyIHdpbGwgY2FjaGUgZW5kcG9pbnQKKyAgICAgKiBkZWZpbml0aW9ucyBmb3Igd3JpdGluZyBvciBub3QgKGluY2x1ZGluZyBjYWNoaW5nIG9mIGFjdHVhbCA8Y29kZT5PYmplY3RXcml0ZXI8L2NvZGU+IHRvIHVzZSkuCisgICAgICogRmVhdHVyZSBtYXkgYmUgZGlzYWJsZWQgaWYgcmVjb25maWd1cmF0aW9uIG9yIGFsdGVybmF0ZSBpc250YW5jZSBvZiA8Y29kZT5PYmplY3RNYXBwZXI8L2NvZGU+IGlzIG5lZWRlZC4KKyAgICAgKjxwPgorICAgICAqIE5vdGUgdGhhdCBkaXNhYmxpbmcgb2YgdGhlIGZlYXR1cmUgbWF5IGFkZCBzaWduaWZpY2FudCBhbW91bnQgb2Ygb3ZlcmhlYWQgZm9yIHByb2Nlc3NpbmcuCisgICAgICo8cD4KKyAgICAgKiBGZWF0dXJlIGlzIGVuYWJsZWQgYnkgZGVmYXVsdC4KKyAgICAgKgorICAgICAqIEBzaW5jZSAyLjgKKyAgICAgKi8KKyAgICBDQUNIRV9FTkRQT0lOVF9XUklURVJTKHRydWUpLAorCisgICAgLyoKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIC8qIE90aGVyCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKi8KKyAgICAKKyAgICA7CisKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gX2RlZmF1bHRTdGF0ZTsKKyAgICAKKyAgICBwcml2YXRlIEpheFJTRmVhdHVyZShib29sZWFuIGRlZmF1bHRTdGF0ZSkgeworICAgICAgICBfZGVmYXVsdFN0YXRlID0gZGVmYXVsdFN0YXRlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGNvbGxlY3REZWZhdWx0cygpIHsKKyAgICAgICAgaW50IGZsYWdzID0gMDsKKyAgICAgICAgZm9yIChKYXhSU0ZlYXR1cmUgZiA6IHZhbHVlcygpKSB7CisgICAgICAgICAgICBpZiAoZi5lbmFibGVkQnlEZWZhdWx0KCkpIHsgZmxhZ3MgfD0gZi5nZXRNYXNrKCk7IH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmxhZ3M7CisgICAgfQorICAgIAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZWRCeURlZmF1bHQoKSB7IHJldHVybiBfZGVmYXVsdFN0YXRlOyB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldE1hc2soKSB7IHJldHVybiAoMSA8PCBvcmRpbmFsKCkpOyB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVkSW4oaW50IGZsYWdzKSB7IHJldHVybiAoZmxhZ3MgJiBnZXRNYXNrKCkpICE9IDA7IH0gICAgCit9CmRpZmYgLS1naXQgYS9tZWRpYS9qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYWNrc29uL2ludGVybmFsL2phY2tzb24vamF4cnMvY2ZnL01hcHBlckNvbmZpZ3VyYXRvckJhc2UuamF2YSBiL21lZGlhL2pzb24tamFja3Nvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2phY2tzb24vaW50ZXJuYWwvamFja3Nvbi9qYXhycy9jZmcvTWFwcGVyQ29uZmlndXJhdG9yQmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YmM2NmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYWNrc29uL2ludGVybmFsL2phY2tzb24vamF4cnMvY2ZnL01hcHBlckNvbmZpZ3VyYXRvckJhc2UuamF2YQpAQCAtMCwwICsxLDEyNyBAQAorcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uLmludGVybmFsLmphY2tzb24uamF4cnMuY2ZnOworCitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmNvcmUuSnNvbkdlbmVyYXRvcjsKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uY29yZS5Kc29uUGFyc2VyOworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5Bbm5vdGF0aW9uSW50cm9zcGVjdG9yOworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5EZXNlcmlhbGl6YXRpb25GZWF0dXJlOworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5PYmplY3RNYXBwZXI7CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLlNlcmlhbGl6YXRpb25GZWF0dXJlOworCisvKioKKyAqIEhlbHBlciBjbGFzcyB1c2VkIHRvIGVuY2Fwc3VsYXRlIGRldGFpbHMgb2YgY29uZmlndXJpbmcgYW4KKyAqIHtAbGluayBPYmplY3RNYXBwZXJ9IGluc3RhbmNlIHRvIGJlIHVzZWQgZm9yIGRhdGEgYmluZGluZywgYXMKKyAqIHdlbGwgYXMgYWNjZXNzaW5nIGl0LgorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWFwcGVyQ29uZmlndXJhdG9yQmFzZTxJTVBMIGV4dGVuZHMgTWFwcGVyQ29uZmlndXJhdG9yQmFzZTxJTVBMLE1BUFBFUj4sCisgICAgTUFQUEVSIGV4dGVuZHMgT2JqZWN0TWFwcGVyCis+Cit7CisgICAgLyoqCisgICAgICogTWFwcGVyIHByb3ZpZGVyIHdhcyBjb25zdHJ1Y3RlZCB3aXRoIGlmIGFueSwgb3IgdGhhdCB3YXMgY29uc3RydWN0ZWQKKyAgICAgKiBkdWUgdG8gYSBjYWxsIHRvIGV4cGxpY2l0bHkgY29uZmlndXJlIG1hcHBlci4KKyAgICAgKiBJZiBkZWZpbmVkIChleHBsaWNpdGx5IG9yIGltcGxpY2l0bHkpIGl0IHdpbGwgYmUgdXNlZCwgaW5zdGVhZAorICAgICAqIG9mIHVzaW5nIHByb3ZpZGVyLWJhc2VkIGxvb2t1cC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgTUFQUEVSIF9tYXBwZXI7CisKKyAgICAvKioKKyAgICAgKiBJZiBubyBtYXBwZXIgd2FzIHNwZWNpZmllZCB3aGVuIGNvbnN0cnVjdGVkLCBhbmQgbm8gY29uZmlndXJhdGlvbgorICAgICAqIGNhbGxzIGFyZSBtYWRlLCBhIGRlZmF1bHQgbWFwcGVyIGlzIGNvbnN0cnVjdGVkLiBUaGUgZGlmZmVyZW5jZQorICAgICAqIGJldHdlZW4gZGVmYXVsdCBtYXBwZXIgYW5kIHJlZ3VsYXIgb25lIGlzIHRoYXQgZGVmYXVsdCBtYXBwZXIKKyAgICAgKiBpcyBvbmx5IHVzZWQgaWYgbm8gbWFwcGVyIGlzIGZvdW5kIHZpYSBwcm92aWRlciBsb29rdXAuCisgICAgICovCisgICAgcHJvdGVjdGVkIE1BUFBFUiBfZGVmYXVsdE1hcHBlcjsKKworICAgIC8qKgorICAgICAqIEFubm90YXRpb25zIHNldCB0byB1c2UgYnkgZGVmYXVsdDsgb3ZlcnJpZGRlbiBieSBleHBsaWNpdCBjYWxsCisgICAgICogdG8ge0BsaW5rICNzZXRBbm5vdGF0aW9uc1RvVXNlfQorICAgICAqLworICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uc1tdIF9kZWZhdWx0QW5ub3RhdGlvbnNUb1VzZTsKKyAgICAKKyAgICAvKioKKyAgICAgKiBUbyBzdXBwb3J0IG9wdGlvbmFsIGRlcGVuZGVuY3kgdG8gSmFja3NvbiBKQVhCIGFubm90YXRpb25zIG1vZHVsZQorICAgICAqIChuZWVkZWQgaWZmIEpBWEIgYW5ub3RhdGlvbnMgYXJlIHVzZWQgZm9yIGNvbmZpZ3VyYXRpb24pCisgICAgICovCisgICAgcHJvdGVjdGVkIENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uSW50cm9zcGVjdG9yPiBfamF4YkludHJvc3BlY3RvckNsYXNzOworICAgIAorICAgIC8qCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAvKiBDb25zdHJ1Y3Rpb24KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqLworICAgIAorICAgIHB1YmxpYyBNYXBwZXJDb25maWd1cmF0b3JCYXNlKE1BUFBFUiBtYXBwZXIsIEFubm90YXRpb25zW10gZGVmYXVsdEFubm90YXRpb25zKQorICAgIHsKKyAgICAgICAgX21hcHBlciA9IG1hcHBlcjsKKyAgICAgICAgX2RlZmF1bHRBbm5vdGF0aW9uc1RvVXNlID0gZGVmYXVsdEFubm90YXRpb25zOworICAgIH0KKworICAgIC8qCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAvKiBBYnN0cmFjdCBtZXRob2RzIHRvIGltcGxlbWVudAorICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqLworICAgIAorICAgIC8qKgorICAgICAqIE1ldGhvZCB0aGF0IGxvY2F0ZXMsIGNvbmZpZ3VyZXMgYW5kIHJldHVybnMge0BsaW5rIE9iamVjdE1hcHBlcn0gdG8gdXNlCisgICAgICovCisgICAgcHVibGljIGFic3RyYWN0IE1BUFBFUiBnZXRDb25maWd1cmVkTWFwcGVyKCk7CisKKyAgICBwdWJsaWMgYWJzdHJhY3QgTUFQUEVSIGdldERlZmF1bHRNYXBwZXIoKTsKKworICAgIC8qKgorICAgICAqIEhlbHBlciBtZXRob2QgdGhhdCB3aWxsIGVuc3VyZSB0aGF0IHRoZXJlIGlzIGEgY29uZmlndXJhYmxlIG5vbi1kZWZhdWx0CisgICAgICogbWFwcGVyIChjb25zdHJ1Y3RpbmcgYW4gaW5zdGFuY2UgaWYgb25lIGRpZG4ndCB5ZXQgZXhpdCksIGFuZCByZXR1cm4KKyAgICAgKiB0aGF0IG1hcHBlci4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgTUFQUEVSIG1hcHBlcigpOworCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IEFubm90YXRpb25JbnRyb3NwZWN0b3IgX3Jlc29sdmVJbnRyb3NwZWN0b3JzKEFubm90YXRpb25zW10gYW5ub3RhdGlvbnNUb1VzZSk7CisgICAgCisgICAgLyoKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAvKiBDb25maWd1cmF0aW9uIG1ldGhvZHMKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKi8KKworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgZmluYWwgdm9pZCBzZXRNYXBwZXIoTUFQUEVSIG0pIHsKKyAgICAgICAgX21hcHBlciA9IG07CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBmaW5hbCB2b2lkIHNldEFubm90YXRpb25zVG9Vc2UoQW5ub3RhdGlvbnNbXSBhbm5vdGF0aW9uc1RvVXNlKSB7CisgICAgICAgIF9zZXRBbm5vdGF0aW9ucyhtYXBwZXIoKSwgYW5ub3RhdGlvbnNUb1VzZSk7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBmaW5hbCB2b2lkIGNvbmZpZ3VyZShEZXNlcmlhbGl6YXRpb25GZWF0dXJlIGYsIGJvb2xlYW4gc3RhdGUpIHsKKyAgICAgICAgbWFwcGVyKCkuY29uZmlndXJlKGYsIHN0YXRlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGZpbmFsIHZvaWQgY29uZmlndXJlKFNlcmlhbGl6YXRpb25GZWF0dXJlIGYsIGJvb2xlYW4gc3RhdGUpIHsKKyAgICAgICAgbWFwcGVyKCkuY29uZmlndXJlKGYsIHN0YXRlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIGZpbmFsIHZvaWQgY29uZmlndXJlKEpzb25QYXJzZXIuRmVhdHVyZSBmLCBib29sZWFuIHN0YXRlKSB7CisgICAgICAgIG1hcHBlcigpLmNvbmZpZ3VyZShmLCBzdGF0ZSk7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCBmaW5hbCB2b2lkIGNvbmZpZ3VyZShKc29uR2VuZXJhdG9yLkZlYXR1cmUgZiwgYm9vbGVhbiBzdGF0ZSkgeworICAgICAgICBtYXBwZXIoKS5jb25maWd1cmUoZiwgc3RhdGUpOworICAgIH0KKworICAgIC8qCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgLyogSGVscGVyIG1ldGhvZHMgZm9yIHN1Yi1jbGFzc2VzCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICovCisKKyAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBfc2V0QW5ub3RhdGlvbnMoT2JqZWN0TWFwcGVyIG1hcHBlciwgQW5ub3RhdGlvbnNbXSBhbm5vdGF0aW9uc1RvVXNlKQorICAgIHsKKyAgICAgICAgQW5ub3RhdGlvbkludHJvc3BlY3RvciBpbnRyOworICAgICAgICBpZiAoYW5ub3RhdGlvbnNUb1VzZSA9PSBudWxsIHx8IGFubm90YXRpb25zVG9Vc2UubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIGludHIgPSBBbm5vdGF0aW9uSW50cm9zcGVjdG9yLm5vcEluc3RhbmNlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnRyID0gX3Jlc29sdmVJbnRyb3NwZWN0b3JzKGFubm90YXRpb25zVG9Vc2UpOworICAgICAgICB9CisgICAgICAgIG1hcHBlci5zZXRBbm5vdGF0aW9uSW50cm9zcGVjdG9yKGludHIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2pzb24tamFja3Nvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2phY2tzb24vaW50ZXJuYWwvamFja3Nvbi9qYXhycy9jZmcvT2JqZWN0UmVhZGVySW5qZWN0b3IuamF2YSBiL21lZGlhL2pzb24tamFja3Nvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2phY2tzb24vaW50ZXJuYWwvamFja3Nvbi9qYXhycy9jZmcvT2JqZWN0UmVhZGVySW5qZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTAwOGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamFja3Nvbi9pbnRlcm5hbC9qYWNrc29uL2pheHJzL2NmZy9PYmplY3RSZWFkZXJJbmplY3Rvci5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamFja3Nvbi5pbnRlcm5hbC5qYWNrc29uLmpheHJzLmNmZzsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOworCitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLk9iamVjdFJlYWRlcjsKKworLyoqCisgKiBCYXNlZCBvbiBpZGVhcyBmcm9tIFtJc3N1ZSMzMl0sIHRoaXMgY2xhc3MgYWxsb3dzIHJlZ2lzdGVyaW5nIGEKKyAqIG1vZGlmaWVyICh7QGxpbmsgT2JqZWN0UmVhZGVyTW9kaWZpZXJ9KSB0aGF0IGNhbiBiZSB1c2VkIHRvCisgKiByZWNvbmZpZ3VyZSB7QGxpbmsgT2JqZWN0UmVhZGVyfQorICogdGhhdCBKQVgtUlMgUmVzb3VyY2Ugd2lsbCB1c2UgZm9yIHJlYWRpbmcgaW5wdXQgaW50byBKYXZhIE9iamVjdHMuCisgKiBVc3VhbGx5IHRoaXMgY2xhc3MgaXMgYWNjZXNzZWQgZnJvbSBhIFNlcnZsZXQgb3IgSkFYLVJTIGZpbHRlcgorICogYmVmb3JlIGV4ZWN1dGlvbiByZWFjaGVzIHJlc291cmNlLgorICogCisgKiBAc2luY2UgMi4zCisgKi8KK3B1YmxpYyBjbGFzcyBPYmplY3RSZWFkZXJJbmplY3RvcgoreworICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgVGhyZWFkTG9jYWw8T2JqZWN0UmVhZGVyTW9kaWZpZXI+IF90aHJlYWRMb2NhbCA9IG5ldyBUaHJlYWRMb2NhbDxPYmplY3RSZWFkZXJNb2RpZmllcj4oKTsKKworICAgIC8qKgorICAgICAqIFNpbXBsZSBtYXJrZXIgdXNlZCB0byBvcHRpbWl6ZSBvdXQge0BsaW5rIFRocmVhZExvY2FsfSBhY2Nlc3MgaW4gY2FzZXMKKyAgICAgKiB3aGVyZSB0aGlzIGZlYXR1cmUgaXMgbm90IGJlaW5nIHVzZWQKKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIEF0b21pY0Jvb2xlYW4gX2hhc0JlZW5TZXQgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CisKKyAgICBwcml2YXRlIE9iamVjdFJlYWRlckluamVjdG9yKCkgeyB9CisgICAgCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldChPYmplY3RSZWFkZXJNb2RpZmllciBtb2QpIHsKKyAgICAgICAgX2hhc0JlZW5TZXQuc2V0KHRydWUpOworICAgICAgICBfdGhyZWFkTG9jYWwuc2V0KG1vZCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3RSZWFkZXJNb2RpZmllciBnZXQoKSB7CisgICAgICAgIHJldHVybiBfaGFzQmVlblNldC5nZXQoKSA/IF90aHJlYWRMb2NhbC5nZXQoKSA6IG51bGw7CisgICAgfQorICAgIAorICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0UmVhZGVyTW9kaWZpZXIgZ2V0QW5kQ2xlYXIoKSB7CisgICAgICAgIE9iamVjdFJlYWRlck1vZGlmaWVyIG1vZCA9IGdldCgpOworICAgICAgICBpZiAobW9kICE9IG51bGwpIHsKKyAgICAgICAgICAgIF90aHJlYWRMb2NhbC5yZW1vdmUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbW9kOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2pzb24tamFja3Nvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2phY2tzb24vaW50ZXJuYWwvamFja3Nvbi9qYXhycy9jZmcvT2JqZWN0UmVhZGVyTW9kaWZpZXIuamF2YSBiL21lZGlhL2pzb24tamFja3Nvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2phY2tzb24vaW50ZXJuYWwvamFja3Nvbi9qYXhycy9jZmcvT2JqZWN0UmVhZGVyTW9kaWZpZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDc4YjM1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamFja3Nvbi9pbnRlcm5hbC9qYWNrc29uL2pheHJzL2NmZy9PYmplY3RSZWFkZXJNb2RpZmllci5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamFja3Nvbi5pbnRlcm5hbC5qYWNrc29uLmpheHJzLmNmZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworCitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmNvcmUuSnNvblBhcnNlcjsKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuSmF2YVR5cGU7CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLk9iamVjdFJlYWRlcjsKKworLyoqCisgKiBAc2luY2UgMi4zCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBPYmplY3RSZWFkZXJNb2RpZmllcgoreworICAgIC8qKgorICAgICAqIE1ldGhvZCBjYWxsZWQgdG8gbGV0IG1vZGlmaWVyIG1ha2UgYW55IGNoYW5nZXMgaXQgd2FudHMgdG8gdG8gb2JqZWN0cworICAgICAqIHVzZWQgZm9yIHJlYWRpbmcgcmVxdWVzdCBvYmplY3RzIGZvciBzcGVjaWZpZWQgZW5kcG9pbnQuCisgICAgICogCisgICAgICogQHBhcmFtIGVuZHBvaW50IEVuZCBwb2ludCBmb3Igd2hpY2ggcmVhZGVyIGlzIHVzZWQKKyAgICAgKiBAcGFyYW0gaHR0cEhlYWRlcnMgSFRUUCBoZWFkZXJzIHNlbnQgd2l0aCByZXF1ZXN0IChyZWFkLW9ubHkpCisgICAgICogQHBhcmFtIHJlc3VsdFR5cGUgVHlwZSB0aGF0IGlucHV0IGlzIHRvIGJlIGJvdW5kIHRvCisgICAgICogQHBhcmFtIHIgT2JqZWN0UmVhZGVyIGFzIGNvbnN0cnVjdGVkIGZvciBlbmRwb2ludCwgdHlwZSB0byBoYW5kbGUKKyAgICAgKiBAcGFyYW0gcCBQYXJzZXIgdG8gdXNlIGZvciByZWFkaW5nIGNvbnRlbnQKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0UmVhZGVyIG1vZGlmeShFbmRwb2ludENvbmZpZ0Jhc2U8Pz4gZW5kcG9pbnQsCisgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsU3RyaW5nPiBodHRwSGVhZGVycywKKyAgICAgICAgICAgIEphdmFUeXBlIHJlc3VsdFR5cGUsIE9iamVjdFJlYWRlciByLCBKc29uUGFyc2VyIHApCisgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2pzb24tamFja3Nvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2phY2tzb24vaW50ZXJuYWwvamFja3Nvbi9qYXhycy9jZmcvT2JqZWN0V3JpdGVySW5qZWN0b3IuamF2YSBiL21lZGlhL2pzb24tamFja3Nvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2phY2tzb24vaW50ZXJuYWwvamFja3Nvbi9qYXhycy9jZmcvT2JqZWN0V3JpdGVySW5qZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2EzMDUwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamFja3Nvbi9pbnRlcm5hbC9qYWNrc29uL2pheHJzL2NmZy9PYmplY3RXcml0ZXJJbmplY3Rvci5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamFja3Nvbi5pbnRlcm5hbC5qYWNrc29uLmpheHJzLmNmZzsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOworCitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLk9iamVjdFdyaXRlcjsKKworLyoqCisgKiBCYXNlZCBvbiBpZGVhcyBmcm9tIFtJc3N1ZSMzMl0sIHRoaXMgY2xhc3MgYWxsb3dzICJvdmVycmlkaW5nIiBvZiB7QGxpbmsgT2JqZWN0V3JpdGVyfQorICogdGhhdCBKQVgtUlMgUmVzb3VyY2Ugd2lsbCB1c2U7IHVzdWFsbHkgdGhpcyBpcyBkb25lIGZyb20gYSBTZXJ2bGV0IG9yIEpBWC1SUyBmaWx0ZXIKKyAqIGJlZm9yZSBleGVjdXRpb24gcmVhY2hlcyByZXNvdXJjZS4KKyAqIAorICogQHNpbmNlIDIuMworICovCitwdWJsaWMgY2xhc3MgT2JqZWN0V3JpdGVySW5qZWN0b3IKK3sKKyAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgVGhyZWFkTG9jYWw8T2JqZWN0V3JpdGVyTW9kaWZpZXI+IF90aHJlYWRMb2NhbCA9IG5ldyBUaHJlYWRMb2NhbDxPYmplY3RXcml0ZXJNb2RpZmllcj4oKTsKKworICAgLyoqCisgICAgKiBTaW1wbGUgbWFya2VyIHVzZWQgdG8gb3B0aW1pemUgb3V0IHtAbGluayBUaHJlYWRMb2NhbH0gYWNjZXNzIGluIGNhc2VzCisgICAgKiB3aGVyZSB0aGlzIGZlYXR1cmUgaXMgbm90IGJlaW5nIHVzZWQKKyAgICAqLworICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBBdG9taWNCb29sZWFuIF9oYXNCZWVuU2V0ID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOworCisgICBwcml2YXRlIE9iamVjdFdyaXRlckluamVjdG9yKCkgeyB9CisgICAKKyAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXQoT2JqZWN0V3JpdGVyTW9kaWZpZXIgbW9kKSB7CisgICAgICAgX2hhc0JlZW5TZXQuc2V0KHRydWUpOworICAgICAgIF90aHJlYWRMb2NhbC5zZXQobW9kKTsKKyAgIH0KKworICAgcHVibGljIHN0YXRpYyBPYmplY3RXcml0ZXJNb2RpZmllciBnZXQoKSB7CisgICAgICAgcmV0dXJuIF9oYXNCZWVuU2V0LmdldCgpID8gX3RocmVhZExvY2FsLmdldCgpIDogbnVsbDsKKyAgIH0KKyAgIAorICAgcHVibGljIHN0YXRpYyBPYmplY3RXcml0ZXJNb2RpZmllciBnZXRBbmRDbGVhcigpIHsKKyAgICAgICBPYmplY3RXcml0ZXJNb2RpZmllciBtb2QgPSBnZXQoKTsKKyAgICAgICBpZiAobW9kICE9IG51bGwpIHsKKyAgICAgICAgICAgX3RocmVhZExvY2FsLnJlbW92ZSgpOworICAgICAgIH0KKyAgICAgICByZXR1cm4gbW9kOworICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamFja3Nvbi9pbnRlcm5hbC9qYWNrc29uL2pheHJzL2NmZy9PYmplY3RXcml0ZXJNb2RpZmllci5qYXZhIGIvbWVkaWEvanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamFja3Nvbi9pbnRlcm5hbC9qYWNrc29uL2pheHJzL2NmZy9PYmplY3RXcml0ZXJNb2RpZmllci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYzhmMWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYWNrc29uL2ludGVybmFsL2phY2tzb24vamF4cnMvY2ZnL09iamVjdFdyaXRlck1vZGlmaWVyLmphdmEKQEAgLTAsMCArMSwyNSBAQAorcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uLmludGVybmFsLmphY2tzb24uamF4cnMuY2ZnOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CisKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uY29yZS5Kc29uR2VuZXJhdG9yOworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5PYmplY3RXcml0ZXI7CisKKy8qKgorICogQHNpbmNlIDIuMworICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgT2JqZWN0V3JpdGVyTW9kaWZpZXIKK3sKKyAgICAvKioKKyAgICAgKiBNZXRob2QgY2FsbGVkIHRvIGxldCBtb2RpZmllciBtYWtlIGFueSBjaGFuZ2VzIGl0IHdhbnRzIHRvIHRvIG9iamVjdHMKKyAgICAgKiB1c2VkIGZvciB3cml0aW5nIHJlc3BvbnNlIGZvciBzcGVjaWZpZWQgZW5kcG9pbnQuCisgICAgICogCisgICAgICogQHBhcmFtIHJlc3BvbnNlSGVhZGVycyBIVFRQIGhlYWRlcnMgYmVpbmcgcmV0dXJuZWQgd2l0aCByZXNwb25zZSAobXV0YWJsZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgT2JqZWN0V3JpdGVyIG1vZGlmeShFbmRwb2ludENvbmZpZ0Jhc2U8Pz4gZW5kcG9pbnQsCisgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsT2JqZWN0PiByZXNwb25zZUhlYWRlcnMsCisgICAgICAgICAgICBPYmplY3QgdmFsdWVUb1dyaXRlLCBPYmplY3RXcml0ZXIgdywgSnNvbkdlbmVyYXRvciBnKQorICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYWNrc29uL2ludGVybmFsL2phY2tzb24vamF4cnMvanNvbi9KYWNrc29uSmF4Ykpzb25Qcm92aWRlci5qYXZhIGIvbWVkaWEvanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamFja3Nvbi9pbnRlcm5hbC9qYWNrc29uL2pheHJzL2pzb24vSmFja3NvbkpheGJKc29uUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjNlYWU4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamFja3Nvbi9pbnRlcm5hbC9qYWNrc29uL2pheHJzL2pzb24vSmFja3NvbkpheGJKc29uUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDY2IEBACitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uaW50ZXJuYWwuamFja3Nvbi5qYXhycy5qc29uOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamFja3Nvbi5pbnRlcm5hbC5qYWNrc29uLmpheHJzLmNmZy5Bbm5vdGF0aW9uczsKKworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5PYmplY3RNYXBwZXI7CisKKy8qKgorICogSlNPTiBjb250ZW50IHR5cGUgcHJvdmlkZXIgYXV0b21hdGljYWxseSBjb25maWd1cmVkIHRvIHVzZSBib3RoIEphY2tzb24KKyAqIGFuZCBKQVhCIGFubm90YXRpb25zIChpbiB0aGF0IG9yZGVyIG9mIHByaW9yaXR5KS4gT3RoZXJ3aXNlIGZ1bmN0aW9uYWxseQorICogc2FtZSBhcyB7QGxpbmsgSmFja3Nvbkpzb25Qcm92aWRlcn0uCisgKjxwPgorICogVHlwaWNhbCB1c2FnZSBwYXR0ZXJuIGlzIHRvIGp1c3QgaW5zdGFudGlhdGUgaW5zdGFuY2Ugb2YgdGhpcworICogcHJvdmlkZXIgZm9yIEpBWC1SUyBhbmQgdXNlIGFzIGlzOiB0aGlzIHdpbGwgdXNlIGJvdGggSmFja3NvbiBhbmQKKyAqIEpBWEIgYW5ub3RhdGlvbnMgKHdpdGggSmFja3NvbiBhbm5vdGF0aW9ucyBoYXZpbmcgcHJpb3JpdHkpLgorICo8cD4KKyAqIE5vdGU6IGNsYXNzIGFubm90YXRpb25zIGFyZSBkdXBsaWNhdGVkIGZyb20gc3VwZXIgY2xhc3MsIHNpbmNlIGl0CisgKiBpcyBub3QgY2xlYXIgd2hldGhlciBKQVgtUlMgaW1wbGVtZW50YXRpb25zIGFyZSByZXF1aXJlZCB0bworICogY2hlY2sgc2V0dGluZ3Mgb2Ygc3VwZXItY2xhc3Nlcy4gSXQgaXMgaW1wb3J0YW50IHRvIGtlZXAgYW5ub3RhdGlvbnMKKyAqIGluIHN5bmMgaWYgY2hhbmdlZC4KKyAqLworQFByb3ZpZGVyCitAQ29uc3VtZXMoTWVkaWFUeXBlLldJTERDQVJEKSAvLyBOT1RFOiByZXF1aXJlZCB0byBzdXBwb3J0ICJub24tc3RhbmRhcmQiIEpTT04gdmFyaWFudHMKK0BQcm9kdWNlcyhNZWRpYVR5cGUuV0lMRENBUkQpCitwdWJsaWMgY2xhc3MgSmFja3NvbkpheGJKc29uUHJvdmlkZXIgZXh0ZW5kcyBKYWNrc29uSnNvblByb3ZpZGVyIHsKKyAgICAvKioKKyAgICAgKiBEZWZhdWx0IGFubm90YXRpb24gc2V0cyB0byB1c2UsIGlmIG5vdCBleHBsaWNpdGx5IGRlZmluZWQgZHVyaW5nCisgICAgICogY29uc3RydWN0aW9uOiB1c2UgSmFja3NvbiBhbm5vdGF0aW9ucyBpZiBmb3VuZDsgaWYgbm90LCB1c2UKKyAgICAgKiBKQVhCIGFubm90YXRpb25zIGFzIGZhbGxiYWNrLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgQW5ub3RhdGlvbnNbXSBERUZBVUxUX0FOTk9UQVRJT05TID0geworICAgICAgICBBbm5vdGF0aW9ucy5KQUNLU09OLCBBbm5vdGF0aW9ucy5KQVhCCisgICAgfTsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3IsIHVzdWFsbHkgdXNlZCB3aGVuIHByb3ZpZGVyIGlzIGF1dG9tYXRpY2FsbHkKKyAgICAgKiBjb25maWd1cmVkIHRvIGJlIHVzZWQgd2l0aCBKQVgtUlMgaW1wbGVtZW50YXRpb24uCisgICAgICovCisgICAgcHVibGljIEphY2tzb25KYXhiSnNvblByb3ZpZGVyKCkKKyAgICB7CisgICAgICAgIHRoaXMobnVsbCwgREVGQVVMVF9BTk5PVEFUSU9OUyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGFubm90YXRpb25zVG9Vc2UgQW5ub3RhdGlvbiBzZXQocykgdG8gdXNlIGZvciBjb25maWd1cmluZworICAgICAqICAgIGRhdGEgYmluZGluZworICAgICAqLworICAgIHB1YmxpYyBKYWNrc29uSmF4Ykpzb25Qcm92aWRlcihBbm5vdGF0aW9ucy4uLiBhbm5vdGF0aW9uc1RvVXNlKQorICAgIHsKKyAgICAgICAgdGhpcyhudWxsLCBhbm5vdGF0aW9uc1RvVXNlKTsKKyAgICB9CisgICAgCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgdG8gdXNlIHdoZW4gYSBjdXN0b20gbWFwcGVyICh1c3VhbGx5IGNvbXBvbmVudHMKKyAgICAgKiBsaWtlIHNlcmlhbGl6ZXIvZGVzZXJpYWxpemVyIGZhY3RvcmllcyB0aGF0IGhhdmUgYmVlbiBjb25maWd1cmVkKQorICAgICAqIGlzIHRvIGJlIHVzZWQuCisgICAgICovCisgICAgcHVibGljIEphY2tzb25KYXhiSnNvblByb3ZpZGVyKE9iamVjdE1hcHBlciBtYXBwZXIsIEFubm90YXRpb25zW10gYW5ub3RhdGlvbnNUb1VzZSkKKyAgICB7CisgICAgICAgIHN1cGVyKG1hcHBlciwgYW5ub3RhdGlvbnNUb1VzZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamFja3Nvbi9pbnRlcm5hbC9qYWNrc29uL2pheHJzL2pzb24vSmFja3Nvbkpzb25Qcm92aWRlci5qYXZhIGIvbWVkaWEvanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamFja3Nvbi9pbnRlcm5hbC9qYWNrc29uL2pheHJzL2pzb24vSmFja3Nvbkpzb25Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3NjY0OTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYWNrc29uL2ludGVybmFsL2phY2tzb24vamF4cnMvanNvbi9KYWNrc29uSnNvblByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwyNDIgQEAKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamFja3Nvbi5pbnRlcm5hbC5qYWNrc29uLmpheHJzLmpzb247CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Db250ZXh0UmVzb2x2ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyczsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uaW50ZXJuYWwuamFja3Nvbi5qYXhycy5iYXNlLlByb3ZpZGVyQmFzZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uLmludGVybmFsLmphY2tzb24uamF4cnMuY2ZnLkFubm90YXRpb25zOworCitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmNvcmUuVmVyc2lvbjsKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuT2JqZWN0TWFwcGVyOworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5PYmplY3RSZWFkZXI7CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLk9iamVjdFdyaXRlcjsKKworLyoqCisgKiBCYXNpYyBpbXBsZW1lbnRhdGlvbiBvZiBKQVgtUlMgYWJzdHJhY3Rpb25zICh7QGxpbmsgTWVzc2FnZUJvZHlSZWFkZXJ9LAorICoge0BsaW5rIE1lc3NhZ2VCb2R5V3JpdGVyfSkgbmVlZGVkIGZvciBiaW5kaW5nCisgKiBKU09OICgiYXBwbGljYXRpb24vanNvbiIpIGNvbnRlbnQgdG8gYW5kIGZyb20gSmF2YSBPYmplY3RzICgiUE9KTyJzKS4KKyAqPHA+CisgKiBBY3R1YWwgZGF0YSBiaW5kaW5nIGZ1bmN0aW9uYWxpdHkgaXMgaW1wbGVtZW50ZWQgYnkge0BsaW5rIE9iamVjdE1hcHBlcn06CisgKiBtYXBwZXIgdG8gdXNlIGNhbiBiZSBjb25maWd1cmVkIGluIG11bHRpcGxlIHdheXM6CisgKiA8dWw+CisgKiAgPGxpPkJ5IGV4cGxpY2l0bHkgcGFzc2luZyBtYXBwZXIgdG8gdXNlIGluIGNvbnN0cnVjdG9yCisgKiAgPGxpPkJ5IGV4cGxpY3RseSBzZXR0aW5nIG1hcHBlciB0byB1c2UgYnkge0BsaW5rICNzZXRNYXBwZXJ9CisgKiAgPGxpPkJ5IGRlZmluaW5nIEpBWC1SUyA8Y29kZT5Qcm92aWRlcjwvY29kZT4gdGhhdCByZXR1cm5zIHtAbGluayBPYmplY3RNYXBwZXJ9cy4KKyAqICA8bGk+QnkgZG9pbmcgbm9uZSBvZiBhYm92ZSwgaW4gd2hpY2ggY2FzZSBhIGRlZmF1bHQgbWFwcGVyIGluc3RhbmNlIGlzCisgKiAgICAgY29uc3RydWN0ZWQgKGFuZCBjb25maWd1cmVkIGlmIGNvbmZpZ3VyYXRpb24gbWV0aG9kcyBhcmUgY2FsbGVkKQorICogPC91bD4KKyAqIFRoZSBsYXN0IG1ldGhvZCAoImRvIG5vdGhpbmcgc3BlY2lmaWMiKSBpcyBvZnRlbiBnb29kIGVub3VnaDsgZXhwbGljaXQgcGFzc2luZworICogb2YgTWFwcGVyIGlzIHNpbXBsZSBhbmQgZXhwbGljaXQ7IGFuZCBQcm92aWRlci1iYXNlZCBtZXRob2QgbWF5IG1ha2Ugc2Vuc2UKKyAqIHdpdGggRGVwZWRlbmN5IEluamVjdGlvbiBmcmFtZXdvcmtzLCBvciBpZiBNYXBwZXIgaGFzIHRvIGJlIGNvbmZpZ3VyZWQgZGlmZmVyZW50bHkKKyAqIGZvciBkaWZmZXJlbnQgbWVkaWEgdHlwZXMuCisgKjxwPgorICogTm90ZSB0aGF0IHRoZSBkZWZhdWx0IG1hcHBlciBpbnN0YW5jZSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBpZgorICogb25lIG9mIGV4cGxpY2l0IGNvbmZpZ3VyYXRpb24gbWV0aG9kcyAobGlrZSB7QGxpbmsgI2NvbmZpZ3VyZX0pCisgKiBpcyBjYWxsZWQ6IGlmIHNvLCBQcm92aWRlci1iYXNlZCBpbnRyb3NwZWN0aW9uIGlzIDxiPk5PVDwvYj4gdXNlZCwgYnV0IHRoZQorICogcmVzdWx0aW5nIE1hcHBlciBpcyB1c2VkIGFzIGNvbmZpZ3VyZWQuCisgKjxwPgorICogTm90ZTogdmVyc2lvbiAxLjMgYWRkZWQgYSBzdWItY2xhc3MgKHtAbGluayBKYWNrc29uSmF4Ykpzb25Qcm92aWRlcn0pIHdoaWNoCisgKiBpcyBjb25maWd1cmVkIGJ5IGRlZmF1bHQgdG8gdXNlIGJvdGggSmFja3NvbiBhbmQgSkFYQiBhbm5vdGF0aW9ucyBmb3IgY29uZmlndXJhdGlvbgorICogKGJhc2UgY2xhc3Mgd2hlbiB1c2VkIGFzLWlzIGRlZmF1bHRzIHRvIHVzaW5nIGp1c3QgSmFja3NvbiBhbm5vdGF0aW9ucykKKyAqCisgKiBAYXV0aG9yIFRhdHUgU2Fsb3JhbnRhCisgKi8KK0BQcm92aWRlcgorQENvbnN1bWVzKE1lZGlhVHlwZS5XSUxEQ0FSRCkgLy8gTk9URTogcmVxdWlyZWQgdG8gc3VwcG9ydCAibm9uLXN0YW5kYXJkIiBKU09OIHZhcmlhbnRzCitAUHJvZHVjZXMoTWVkaWFUeXBlLldJTERDQVJEKQorcHVibGljIGNsYXNzIEphY2tzb25Kc29uUHJvdmlkZXIKKyAgICBleHRlbmRzIFByb3ZpZGVyQmFzZTxKYWNrc29uSnNvblByb3ZpZGVyLAorICAgICAgICAgICAgT2JqZWN0TWFwcGVyLAorICAgICAgICAgICAgSnNvbkVuZHBvaW50Q29uZmlnLCBKc29uTWFwcGVyQ29uZmlndXJhdG9yPgoreworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1JTUVfSkFWQVNDUklQVCA9ICJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0IjsKKworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgU3RyaW5nIE1JTUVfSkFWQVNDUklQVF9NUyA9ICJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiOworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBhbm5vdGF0aW9uIHNldHMgdG8gdXNlLCBpZiBub3QgZXhwbGljaXRseSBkZWZpbmVkIGR1cmluZworICAgICAqIGNvbnN0cnVjdGlvbjogb25seSBKYWNrc29uIGFubm90YXRpb25zIGFyZSB1c2VkIGZvciB0aGUgYmFzZQorICAgICAqIGNsYXNzLiBTdWItY2xhc3NlcyBjYW4gdXNlIG90aGVyIHNldHRpbmdzLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgQW5ub3RhdGlvbnNbXSBCQVNJQ19BTk5PVEFUSU9OUyA9IHsKKyAgICAgICAgQW5ub3RhdGlvbnMuSkFDS1NPTgorICAgIH07CisKKyAgICAvKgorICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgLyogR2VuZXJhbCBjb25maWd1cmF0aW9uCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKi8KKworICAgIC8qKgorICAgICAqIEpTT05QIGZ1bmN0aW9uIG5hbWUgdG8gdXNlIGZvciBhdXRvbWF0aWMgSlNPTlAgd3JhcHBpbmcsIGlmIGFueTsKKyAgICAgKiBpZiBudWxsLCBubyBKU09OUCB3cmFwcGluZyBpcyBkb25lLgorICAgICAqIE5vdGUgdGhhdCB0aGlzIGlzIHRoZSBkZWZhdWx0IHZhbHVlIHRoYXQgY2FuIGJlIG92ZXJyaWRkZW4gb24KKyAgICAgKiBwZXItZW5kcG9pbnQgYmFzaXMuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBfanNvbnBGdW5jdGlvbk5hbWU7CisKKyAgICAvKgorICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgLyogQ29udGV4dCBjb25maWd1cmF0aW9uCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKi8KKworICAgIC8qKgorICAgICAqIEluamVjdGFibGUgY29udGV4dCBvYmplY3QgdXNlZCB0byBsb2NhdGUgY29uZmlndXJlZAorICAgICAqIGluc3RhbmNlIG9mIHtAbGluayBPYmplY3RNYXBwZXJ9IHRvIHVzZSBmb3IgYWN0dWFsCisgICAgICogc2VyaWFsaXphdGlvbi4KKyAgICAgKi8KKyAgICBAQ29udGV4dAorICAgIHByb3RlY3RlZCBQcm92aWRlcnMgX3Byb3ZpZGVyczsKKworICAgIC8qCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAvKiBDb25zdHJ1Y3Rpb24KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqLworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBjb25zdHJ1Y3RvciwgdXN1YWxseSB1c2VkIHdoZW4gcHJvdmlkZXIgaXMgYXV0b21hdGljYWxseQorICAgICAqIGNvbmZpZ3VyZWQgdG8gYmUgdXNlZCB3aXRoIEpBWC1SUyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgSmFja3Nvbkpzb25Qcm92aWRlcigpIHsKKyAgICAgICAgdGhpcyhudWxsLCBCQVNJQ19BTk5PVEFUSU9OUyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHBhcmFtIGFubm90YXRpb25zVG9Vc2UgQW5ub3RhdGlvbiBzZXQocykgdG8gdXNlIGZvciBjb25maWd1cmluZworICAgICAqICAgIGRhdGEgYmluZGluZworICAgICAqLworICAgIHB1YmxpYyBKYWNrc29uSnNvblByb3ZpZGVyKEFubm90YXRpb25zLi4uIGFubm90YXRpb25zVG9Vc2UpIHsKKyAgICAgICAgdGhpcyhudWxsLCBhbm5vdGF0aW9uc1RvVXNlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgSmFja3Nvbkpzb25Qcm92aWRlcihPYmplY3RNYXBwZXIgbWFwcGVyKSB7CisgICAgICAgIHRoaXMobWFwcGVyLCBCQVNJQ19BTk5PVEFUSU9OUyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgdG8gdXNlIHdoZW4gYSBjdXN0b20gbWFwcGVyICh1c3VhbGx5IGNvbXBvbmVudHMKKyAgICAgKiBsaWtlIHNlcmlhbGl6ZXIvZGVzZXJpYWxpemVyIGZhY3RvcmllcyB0aGF0IGhhdmUgYmVlbiBjb25maWd1cmVkKQorICAgICAqIGlzIHRvIGJlIHVzZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbnNUb1VzZSBTZXRzIG9mIGFubm90YXRpb25zIChKYWNrc29uLCBKQVhCKSB0aGF0IHByb3ZpZGVyIHNob3VsZAorICAgICAqICAgc3VwcG9ydAorICAgICAqLworICAgIHB1YmxpYyBKYWNrc29uSnNvblByb3ZpZGVyKE9iamVjdE1hcHBlciBtYXBwZXIsIEFubm90YXRpb25zW10gYW5ub3RhdGlvbnNUb1VzZSkgeworICAgICAgICBzdXBlcihuZXcgSnNvbk1hcHBlckNvbmZpZ3VyYXRvcihtYXBwZXIsIGFubm90YXRpb25zVG9Vc2UpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZXRob2QgdGhhdCB3aWxsIHJldHVybiB2ZXJzaW9uIGluZm9ybWF0aW9uIHN0b3JlZCBpbiBhbmQgcmVhZCBmcm9tIGphcgorICAgICAqIHRoYXQgY29udGFpbnMgdGhpcyBjbGFzcy4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVmVyc2lvbiB2ZXJzaW9uKCkgeworICAgICAgICByZXR1cm4gUGFja2FnZVZlcnNpb24uVkVSU0lPTjsKKyAgICB9CisgICAgCisgICAgLyoKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIC8qIEpTT04tc3BlY2lmaWMgY29uZmlndXJhdGlvbgorICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICovCisKKyAgICBwdWJsaWMgdm9pZCBzZXRKU09OUEZ1bmN0aW9uTmFtZShTdHJpbmcgZm5hbWUpIHsKKyAgICAgICAgX2pzb25wRnVuY3Rpb25OYW1lID0gZm5hbWU7CisgICAgfQorCisgICAgLyoKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgIC8qIEFic3RyYWN0IG1ldGhvZCBpbXBscworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgbWV0aG9kIHVzZWQgdG8gY2hlY2sgd2hldGhlciBnaXZlbiBtZWRpYSB0eXBlCisgICAgICogaXMgc3VwcG9ydGVkIGJ5IHRoaXMgcHJvdmlkZXIuCisgICAgICogQ3VycmVudCBpbXBsZW1lbnRhdGlvbiBlc3NlbnRpYWxseSBjaGVja3MgdG8gc2VlIHdoZXRoZXIKKyAgICAgKiB7QGxpbmsgTWVkaWFUeXBlI2dldFN1YnR5cGV9IHJldHVybnMgImpzb24iIG9yIHNvbWV0aGluZworICAgICAqIGVuZGluZyB3aXRoICIranNvbiIuCisgICAgICogT3IgInRleHQveC1qc29uIiAoc2luY2UgMi4zKQorICAgICAqIAorICAgICAqIEBzaW5jZSAyLjIKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiBoYXNNYXRjaGluZ01lZGlhVHlwZShNZWRpYVR5cGUgbWVkaWFUeXBlKQorICAgIHsKKyAgICAgICAgLyogQXMgc3VnZ2VzdGVkIGJ5IFN0ZXBoZW4gRCwgdGhlcmUgYXJlIDIgd2F5cyB0byBjaGVjazogZWl0aGVyCisgICAgICAgICAqIGJlaW5nIGFzIGluY2x1c2l2ZSBhcyBwb3NzaWJsZSAoaWYgc3VidHlwZSBpcyAianNvbiIpLCBvcgorICAgICAgICAgKiBleGNsdXNpdmUgKG1ham9yIHR5cGUgImFwcGxpY2F0aW9uIiwgbWlub3IgdHlwZSAianNvbiIpLgorICAgICAgICAgKiBMZXQncyBzdGFydCB3aXRoIGluY2x1c2l2ZSBvbmUsIGhhcmQgdG8ga25vdyB3aGljaCBtYWpvcgorICAgICAgICAgKiB0eXBlcyB3ZSBzaG91bGQgY292ZXIgYXNpZGUgZnJvbSAiYXBwbGljYXRpb24iLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKG1lZGlhVHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBPazogdGhlcmUgYXJlIGFsc28gInh4eCtqc29uIiBzdWJ0eXBlcywgd2hpY2ggY291bnQgYXMgd2VsbAorICAgICAgICAgICAgU3RyaW5nIHN1YnR5cGUgPSBtZWRpYVR5cGUuZ2V0U3VidHlwZSgpOworCisgICAgICAgICAgICAvLyBbSXNzdWUjMTRdOiBhbHNvIGFsbG93ICdhcHBsaWNhdGlvbi9qYXZhc2NyaXB0JworICAgICAgICAgICAgcmV0dXJuICJqc29uIi5lcXVhbHNJZ25vcmVDYXNlKHN1YnR5cGUpIHx8IHN1YnR5cGUuZW5kc1dpdGgoIitqc29uIikKKyAgICAgICAgICAgICAgICAgICB8fCAiamF2YXNjcmlwdCIuZXF1YWxzKHN1YnR5cGUpCisgICAgICAgICAgICAgICAgICAgLy8gYXBwYXJlbnRseSBNaWNyb3NvZnQgb25jZSBhZ2FpbiBoYXMgaW50ZXJlc3RpbmcgYWx0ZXJuYXRpdmUgdHlwZXM/CisgICAgICAgICAgICAgICAgICAgfHwgIngtamF2YXNjcmlwdCIuZXF1YWxzKHN1YnR5cGUpCisgICAgICAgICAgICAgICAgICAgfHwgIngtanNvbiIuZXF1YWxzKHN1YnR5cGUpIC8vIFtJc3N1ZSM0MF0KKyAgICAgICAgICAgICAgICAgICA7CisgICAgICAgIH0KKyAgICAgICAgLyogTm90IHN1cmUgaWYgdGhpcyBjYW4gaGFwcGVuOyBidXQgaXQgc2VlbXMgcmVhc29uYWJsZQorICAgICAgICAgKiB0aGF0IHdlIGNhbiBhdCBsZWFzdCBwcm9kdWNlIEpTT04gd2l0aG91dCBtZWRpYSB0eXBlPworICAgICAgICAgKi8KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIE9iamVjdE1hcHBlciBfbG9jYXRlTWFwcGVyVmlhUHJvdmlkZXIoQ2xhc3M8Pz4gdHlwZSwgTWVkaWFUeXBlIG1lZGlhVHlwZSkKKyAgICB7CisgICAgICAgIGlmIChfcHJvdmlkZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIENvbnRleHRSZXNvbHZlcjxPYmplY3RNYXBwZXI+IHJlc29sdmVyID0gX3Byb3ZpZGVycy5nZXRDb250ZXh0UmVzb2x2ZXIoT2JqZWN0TWFwcGVyLmNsYXNzLCBtZWRpYVR5cGUpOworICAgICAgICAgICAgLyogQWJvdmUgc2hvdWxkIHdvcmsgYXMgaXMsIGJ1dCBkdWUgdG8gdGhpcyBidWcKKyAgICAgICAgICAgICAqICAgW2h0dHBzOi8vamVyc2V5LmRldi5qYXZhLm5ldC9pc3N1ZXMvc2hvd19idWcuY2dpP2lkPTI4OF0KKyAgICAgICAgICAgICAqIGluIEplcnNleSwgaXQgZG9lc24ndC4gQnV0IHRoaXMgd29ya3MgdW50aWwgcmVzb2x1dGlvbiBvZgorICAgICAgICAgICAgICogdGhlIGlzc3VlOgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAocmVzb2x2ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJlc29sdmVyID0gX3Byb3ZpZGVycy5nZXRDb250ZXh0UmVzb2x2ZXIoT2JqZWN0TWFwcGVyLmNsYXNzLCBudWxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZXNvbHZlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVyLmdldENvbnRleHQodHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEpzb25FbmRwb2ludENvbmZpZyBfY29uZmlnRm9yUmVhZGluZyhPYmplY3RSZWFkZXIgcmVhZGVyLAorICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgcmV0dXJuIEpzb25FbmRwb2ludENvbmZpZy5mb3JSZWFkaW5nKHJlYWRlciwgYW5ub3RhdGlvbnMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBKc29uRW5kcG9pbnRDb25maWcgX2NvbmZpZ0ZvcldyaXRpbmcoT2JqZWN0V3JpdGVyIHdyaXRlciwKKyAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zKSB7CisgICAgICAgIHJldHVybiBKc29uRW5kcG9pbnRDb25maWcuZm9yV3JpdGluZyh3cml0ZXIsIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgIF9qc29ucEZ1bmN0aW9uTmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGRlcHJlY2F0ZWQgU2luY2UgMi4yIHVzZSB7QGxpbmsgI2hhc01hdGNoaW5nTWVkaWFUeXBlKE1lZGlhVHlwZSl9IGluc3RlYWQKKyAgICAgKi8KKyAgICBARGVwcmVjYXRlZAorICAgIHByb3RlY3RlZCBib29sZWFuIGlzSnNvblR5cGUoTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICByZXR1cm4gaGFzTWF0Y2hpbmdNZWRpYVR5cGUobWVkaWFUeXBlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYWNrc29uL2ludGVybmFsL2phY2tzb24vamF4cnMvanNvbi9Kc29uRW5kcG9pbnRDb25maWcuamF2YSBiL21lZGlhL2pzb24tamFja3Nvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2phY2tzb24vaW50ZXJuYWwvamFja3Nvbi9qYXhycy9qc29uL0pzb25FbmRwb2ludENvbmZpZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNGQ5YTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYWNrc29uL2ludGVybmFsL2phY2tzb24vamF4cnMvanNvbi9Kc29uRW5kcG9pbnRDb25maWcuamF2YQpAQCAtMCwwICsxLDExNSBAQAorcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uLmludGVybmFsLmphY2tzb24uamF4cnMuanNvbjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uLmludGVybmFsLmphY2tzb24uamF4cnMuY2ZnLkVuZHBvaW50Q29uZmlnQmFzZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uLmludGVybmFsLmphY2tzb24uamF4cnMuanNvbi5hbm5vdGF0aW9uLkpTT05QOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uaW50ZXJuYWwuamFja3Nvbi5qYXhycy5qc29uLmFubm90YXRpb24uSmFja3NvbkZlYXR1cmVzOworCitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLk9iamVjdFJlYWRlcjsKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuT2JqZWN0V3JpdGVyOworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5jZmcuTWFwcGVyQ29uZmlnOworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC51dGlsLkpTT05QT2JqZWN0OworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC51dGlsLkpTT05XcmFwcGVkT2JqZWN0OworCisvKioKKyAqIENvbnRhaW5lciBjbGFzcyBmb3IgZmlndXJpbmcgb3V0IGFubm90YXRpb24tYmFzZWQgY29uZmlndXJhdGlvbgorICogZm9yIEpBWC1SUyBlbmQgcG9pbnRzLgorICovCitwdWJsaWMgY2xhc3MgSnNvbkVuZHBvaW50Q29uZmlnCisgICAgZXh0ZW5kcyBFbmRwb2ludENvbmZpZ0Jhc2U8SnNvbkVuZHBvaW50Q29uZmlnPgoreworICAgIC8vIC8vIFNlcmlhbGl6YXRpb24tb25seSBjb25maWcKKworICAgIHByb3RlY3RlZCBKU09OUC5EZWYgX2pzb25wOworICAgIAorICAgIC8qCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAvKiBDb25zdHJ1Y3Rpb24KKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqLworCisgICAgcHJvdGVjdGVkIEpzb25FbmRwb2ludENvbmZpZyhNYXBwZXJDb25maWc8Pz4gY29uZmlnKSB7CisgICAgICAgIHN1cGVyKGNvbmZpZyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBKc29uRW5kcG9pbnRDb25maWcgZm9yUmVhZGluZyhPYmplY3RSZWFkZXIgcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKc29uRW5kcG9pbnRDb25maWcocmVhZGVyLmdldENvbmZpZygpKQorICAgICAgICAgICAgLmFkZChhbm5vdGF0aW9ucywgZmFsc2UpCisgICAgICAgICAgICAuaW5pdFJlYWRlcihyZWFkZXIpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgSnNvbkVuZHBvaW50Q29uZmlnIGZvcldyaXRpbmcoT2JqZWN0V3JpdGVyIHdyaXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBkZWZhdWx0SnNvbnBNZXRob2QpCisgICAgeworICAgICAgICBKc29uRW5kcG9pbnRDb25maWcgY29uZmlnID0gIG5ldyBKc29uRW5kcG9pbnRDb25maWcod3JpdGVyLmdldENvbmZpZygpKTsKKyAgICAgICAgaWYgKGRlZmF1bHRKc29ucE1ldGhvZCAhPSBudWxsKSB7CisgICAgICAgICAgICBjb25maWcuX2pzb25wID0gbmV3IEpTT05QLkRlZihkZWZhdWx0SnNvbnBNZXRob2QpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb25maWcKKyAgICAgICAgICAgIC5hZGQoYW5ub3RhdGlvbnMsIHRydWUpCisgICAgICAgICAgICAuaW5pdFdyaXRlcih3cml0ZXIpCisgICAgICAgIDsKKyAgICB9CisKKyAgICAvKgorICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgLyogQWJzdHJhY3QgbWV0aG9kIGltcGxzLCBvdmVycmlkZXMKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqLworCisgICAgQFN1cHByZXNzV2FybmluZ3MoImRlcHJlY2F0aW9uIikKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBhZGRBbm5vdGF0aW9uKENsYXNzPD8gZXh0ZW5kcyBBbm5vdGF0aW9uPiB0eXBlLAorICAgICAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uLCBib29sZWFuIGZvcldyaXRpbmcpCisgICAgeworICAgICAgICBpZiAodHlwZSA9PSBKU09OUC5jbGFzcykgeworICAgICAgICAgICAgaWYgKGZvcldyaXRpbmcpIHsKKyAgICAgICAgICAgICAgICBfanNvbnAgPSBuZXcgSlNPTlAuRGVmKChKU09OUCkgYW5ub3RhdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBKYWNrc29uRmVhdHVyZXMuY2xhc3MpIHsKKyAgICAgICAgICAgIEphY2tzb25GZWF0dXJlcyBmZWF0cyA9IChKYWNrc29uRmVhdHVyZXMpIGFubm90YXRpb247CisgICAgICAgICAgICBpZiAoZm9yV3JpdGluZykgeworICAgICAgICAgICAgICAgIF9zZXJFbmFibGUgPSBudWxsSWZFbXB0eShmZWF0cy5zZXJpYWxpemF0aW9uRW5hYmxlKCkpOworICAgICAgICAgICAgICAgIF9zZXJEaXNhYmxlID0gbnVsbElmRW1wdHkoZmVhdHMuc2VyaWFsaXphdGlvbkRpc2FibGUoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIF9kZXNlckVuYWJsZSA9IG51bGxJZkVtcHR5KGZlYXRzLmRlc2VyaWFsaXphdGlvbkVuYWJsZSgpKTsKKyAgICAgICAgICAgICAgICBfZGVzZXJEaXNhYmxlID0gbnVsbElmRW1wdHkoZmVhdHMuZGVzZXJpYWxpemF0aW9uRGlzYWJsZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN1cGVyLmFkZEFubm90YXRpb24odHlwZSwgYW5ub3RhdGlvbiwgZm9yV3JpdGluZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IG1vZGlmeUJlZm9yZVdyaXRlKE9iamVjdCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gYXBwbHlKU09OUCh2YWx1ZSk7CisgICAgfQorICAgIAorICAgIC8qCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAvKiBBY2Nlc3NvcnMKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqLworCisgICAgLyoqCisgICAgICogTWV0aG9kIHRoYXQgd2lsbCBhZGQgSlNPTlAgd3JhcHBlciBvYmplY3QsIGlmIGFuZCBhcworICAgICAqIGNvbmZpZ3VyZWQgYnkgY29sbGVjdGVkIGFubm90YXRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgYXBwbHlKU09OUChPYmplY3QgdmFsdWUpCisgICAgeworICAgICAgICBpZiAoX2pzb25wICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIGZ1bGwgcHJlZml4K3N1ZmZpeD8KKyAgICAgICAgICAgIGlmIChfanNvbnAucHJlZml4ICE9IG51bGwgfHwgX2pzb25wLnN1ZmZpeCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBKU09OV3JhcHBlZE9iamVjdChfanNvbnAucHJlZml4LCBfanNvbnAuc3VmZml4LCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoX2pzb25wLm1ldGhvZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBKU09OUE9iamVjdChfanNvbnAubWV0aG9kLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2pzb24tamFja3Nvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2phY2tzb24vaW50ZXJuYWwvamFja3Nvbi9qYXhycy9qc29uL0pzb25NYXBwZXJDb25maWd1cmF0b3IuamF2YSBiL21lZGlhL2pzb24tamFja3Nvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2phY2tzb24vaW50ZXJuYWwvamFja3Nvbi9qYXhycy9qc29uL0pzb25NYXBwZXJDb25maWd1cmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTljNzcwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamFja3Nvbi9pbnRlcm5hbC9qYWNrc29uL2pheHJzL2pzb24vSnNvbk1hcHBlckNvbmZpZ3VyYXRvci5qYXZhCkBAIC0wLDAgKzEsMTIxIEBACitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uaW50ZXJuYWwuamFja3Nvbi5qYXhycy5qc29uOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uaW50ZXJuYWwuamFja3Nvbi5qYXhycy5jZmcuQW5ub3RhdGlvbnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamFja3Nvbi5pbnRlcm5hbC5qYWNrc29uLmpheHJzLmNmZy5NYXBwZXJDb25maWd1cmF0b3JCYXNlOworCitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLkFubm90YXRpb25JbnRyb3NwZWN0b3I7CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLk9iamVjdE1hcHBlcjsKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuaW50cm9zcGVjdC5KYWNrc29uQW5ub3RhdGlvbkludHJvc3BlY3RvcjsKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24ubW9kdWxlLmpheGIuSmF4YkFubm90YXRpb25JbnRyb3NwZWN0b3I7CisKKy8qKgorICogSGVscGVyIGNsYXNzIHVzZWQgdG8gZW5jYXBzdWxhdGUgZGV0YWlscyBvZiBjb25maWd1cmluZyBhbgorICoge0BsaW5rIE9iamVjdE1hcHBlcn0gaW5zdGFuY2UgdG8gYmUgdXNlZCBmb3IgZGF0YSBiaW5kaW5nLCBhcworICogd2VsbCBhcyBhY2Nlc3NpbmcgaXQuCisgKi8KK3B1YmxpYyBjbGFzcyBKc29uTWFwcGVyQ29uZmlndXJhdG9yCisgICAgZXh0ZW5kcyBNYXBwZXJDb25maWd1cmF0b3JCYXNlPEpzb25NYXBwZXJDb25maWd1cmF0b3IsIE9iamVjdE1hcHBlcj4KK3sKKyAgICAvKgorICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgLyogQ29uc3RydWN0aW9uCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKi8KKyAgICAKKyAgICBwdWJsaWMgSnNvbk1hcHBlckNvbmZpZ3VyYXRvcihPYmplY3RNYXBwZXIgbWFwcGVyLCBBbm5vdGF0aW9uc1tdIGRlZkFubm90YXRpb25zKQorICAgIHsKKyAgICAgICAgc3VwZXIobWFwcGVyLCBkZWZBbm5vdGF0aW9ucyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWV0aG9kIHRoYXQgbG9jYXRlcywgY29uZmlndXJlcyBhbmQgcmV0dXJucyB7QGxpbmsgT2JqZWN0TWFwcGVyfSB0byB1c2UKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdE1hcHBlciBnZXRDb25maWd1cmVkTWFwcGVyKCkgeworICAgICAgICAvKiBpbXBvcnRhbnQ6IHNob3VsZCBOT1QgY2FsbCBtYXBwZXIoKTsgbmVlZHMgdG8gcmV0dXJuIG51bGwKKyAgICAgICAgICogaWYgbm8gaW5zdGFuY2UgaGFzIGJlZW4gcGFzc2VkIG9yIGNvbnN0cnVjdGVkCisgICAgICAgICAqLworICAgICAgICByZXR1cm4gX21hcHBlcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIE9iamVjdE1hcHBlciBnZXREZWZhdWx0TWFwcGVyKCkgeworICAgICAgICBpZiAoX2RlZmF1bHRNYXBwZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgX2RlZmF1bHRNYXBwZXIgPSBuZXcgT2JqZWN0TWFwcGVyKCk7CisgICAgICAgICAgICBfc2V0QW5ub3RhdGlvbnMoX2RlZmF1bHRNYXBwZXIsIF9kZWZhdWx0QW5ub3RhdGlvbnNUb1VzZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9kZWZhdWx0TWFwcGVyOworICAgIH0KKworICAgIC8qCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAvKiBBYnN0cmFjdCBtZXRob2QgaW1wbAorICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgbWV0aG9kIHRoYXQgd2lsbCBlbnN1cmUgdGhhdCB0aGVyZSBpcyBhIGNvbmZpZ3VyYWJsZSBub24tZGVmYXVsdAorICAgICAqIG1hcHBlciAoY29uc3RydWN0aW5nIGFuIGluc3RhbmNlIGlmIG9uZSBkaWRuJ3QgeWV0IGV4aXQpLCBhbmQgcmV0dXJuCisgICAgICogdGhhdCBtYXBwZXIuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIE9iamVjdE1hcHBlciBtYXBwZXIoKQorICAgIHsKKyAgICAgICAgaWYgKF9tYXBwZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgX21hcHBlciA9IG5ldyBPYmplY3RNYXBwZXIoKTsKKyAgICAgICAgICAgIF9zZXRBbm5vdGF0aW9ucyhfbWFwcGVyLCBfZGVmYXVsdEFubm90YXRpb25zVG9Vc2UpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfbWFwcGVyOworICAgIH0KKworICAgIC8qCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAvKiBJbnRlcm5hbCBtZXRob2RzCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKi8KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uSW50cm9zcGVjdG9yIF9yZXNvbHZlSW50cm9zcGVjdG9ycyhBbm5vdGF0aW9uc1tdIGFubm90YXRpb25zVG9Vc2UpCisgICAgeworICAgICAgICAvLyBMZXQncyBlbnN1cmUgdGhlcmUgYXJlIG5vIGR1cHMgdGhlcmUgZmlyc3QsIGZpbHRlciBvdXQgbnVsbHMKKyAgICAgICAgQXJyYXlMaXN0PEFubm90YXRpb25JbnRyb3NwZWN0b3I+IGludHIgPSBuZXcgQXJyYXlMaXN0PEFubm90YXRpb25JbnRyb3NwZWN0b3I+KCk7CisgICAgICAgIGZvciAoQW5ub3RhdGlvbnMgYSA6IGFubm90YXRpb25zVG9Vc2UpIHsKKyAgICAgICAgICAgIGlmIChhICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBpbnRyLmFkZChfcmVzb2x2ZUludHJvc3BlY3RvcihhKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50IGNvdW50ID0gaW50ci5zaXplKCk7CisgICAgICAgIGlmIChjb3VudCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gQW5ub3RhdGlvbkludHJvc3BlY3Rvci5ub3BJbnN0YW5jZSgpOworICAgICAgICB9CisgICAgICAgIEFubm90YXRpb25JbnRyb3NwZWN0b3IgY3VyciA9IGludHIuZ2V0KDApOworICAgICAgICBmb3IgKGludCBpID0gMSwgbGVuID0gaW50ci5zaXplKCk7IGkgPCBsZW47ICsraSkgeworICAgICAgICAgICAgY3VyciA9IEFubm90YXRpb25JbnRyb3NwZWN0b3IucGFpcihjdXJyLCBpbnRyLmdldChpKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGN1cnI7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEFubm90YXRpb25JbnRyb3NwZWN0b3IgX3Jlc29sdmVJbnRyb3NwZWN0b3IoQW5ub3RhdGlvbnMgYW5uKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChhbm4pIHsKKyAgICAgICAgY2FzZSBKQUNLU09OOgorICAgICAgICAgICAgcmV0dXJuIG5ldyBKYWNrc29uQW5ub3RhdGlvbkludHJvc3BlY3RvcigpOworICAgICAgICBjYXNlIEpBWEI6CisgICAgICAgICAgICAvKiBGb3IgdGhpcywgbmVlZCB0byB1c2UgaW5kaXJlY3Rpb24ganVzdCBzbyB0aGF0IGVycm9yIG9jY3VycworICAgICAgICAgICAgICogd2hlbiB3ZSBnZXQgaGVyZSwgYW5kIG5vdCB3aGVuIHRoaXMgY2xhc3MgaXMgYmVpbmcgbG9hZGVkCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgaWYgKF9qYXhiSW50cm9zcGVjdG9yQ2xhc3MgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBfamF4YkludHJvc3BlY3RvckNsYXNzID0gSmF4YkFubm90YXRpb25JbnRyb3NwZWN0b3IuY2xhc3M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBfamF4YkludHJvc3BlY3RvckNsYXNzLm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkZhaWxlZCB0byBpbnN0YW50aWF0ZSBKYXhiQW5ub3RhdGlvbkludHJvc3BlY3RvcjogIitlLmdldE1lc3NhZ2UoKSwgZSk7CisgICAgICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7IAorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamFja3Nvbi9pbnRlcm5hbC9qYWNrc29uL2pheHJzL2pzb24vUGFja2FnZVZlcnNpb24uamF2YSBiL21lZGlhL2pzb24tamFja3Nvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2phY2tzb24vaW50ZXJuYWwvamFja3Nvbi9qYXhycy9qc29uL1BhY2thZ2VWZXJzaW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVkNzViOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2pzb24tamFja3Nvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2phY2tzb24vaW50ZXJuYWwvamFja3Nvbi9qYXhycy9qc29uL1BhY2thZ2VWZXJzaW9uLmphdmEKQEAgLTAsMCArMSwyMCBAQAorcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uLmludGVybmFsLmphY2tzb24uamF4cnMuanNvbjsKKworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5jb3JlLlZlcnNpb247CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmNvcmUuVmVyc2lvbmVkOworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5jb3JlLnV0aWwuVmVyc2lvblV0aWw7CisKKy8qKgorICogQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZnJvbSBQYWNrYWdlVmVyc2lvbi5qYXZhLmluIGR1cmluZworICogcGFja2FnZVZlcnNpb24tZ2VuZXJhdGUgZXhlY3V0aW9uIG9mIG1hdmVuLXJlcGxhY2VyLXBsdWdpbiBpbgorICogcG9tLnhtbC4KKyAqLworcHVibGljIGZpbmFsIGNsYXNzIFBhY2thZ2VWZXJzaW9uIGltcGxlbWVudHMgVmVyc2lvbmVkIHsKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFZlcnNpb24gVkVSU0lPTiA9IFZlcnNpb25VdGlsLnBhcnNlVmVyc2lvbigKKyAgICAgICAgIjIuOC40IiwgImNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5qYXhycyIsICJqYWNrc29uLWpheHJzLWpzb24tcHJvdmlkZXIiKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBWZXJzaW9uIHZlcnNpb24oKSB7CisgICAgICAgIHJldHVybiBWRVJTSU9OOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2pzb24tamFja3Nvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2phY2tzb24vaW50ZXJuYWwvamFja3Nvbi9qYXhycy9qc29uL2Fubm90YXRpb24vSlNPTlAuamF2YSBiL21lZGlhL2pzb24tamFja3Nvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2phY2tzb24vaW50ZXJuYWwvamFja3Nvbi9qYXhycy9qc29uL2Fubm90YXRpb24vSlNPTlAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjBkOGU5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamFja3Nvbi9pbnRlcm5hbC9qYWNrc29uL2pheHJzL2pzb24vYW5ub3RhdGlvbi9KU09OUC5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamFja3Nvbi5pbnRlcm5hbC5qYWNrc29uLmpheHJzLmpzb24uYW5ub3RhdGlvbjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCisvKiBOb3RlOiBhcHBsaWNhYmxlIHRvIGFubm90YXRpb25zIHRvIGFsbG93IGJ1bmRsaW5nIChpZiBzdXBwb3J0IGFkZGVkCisgKiB0byBKQVgtUlMgYnVuZGxlIGl0c2VsZiksIGFzIHdlbGwgYXMgbWV0aG9kcyB0byBpbmRpY2F0ZSB0aGF0IHJldHVybgorICogdHlwZSBpcyB0byBiZSB3cmFwcGVkLgorICogT3RoZXIgdHlwZXMgYXJlIG5vdCBhbGxvd2VkLCBzaW5jZSB0aGVyZSBpcyBubyBjdXJyZW50IHVzYWdlIGZvciB0aG9zZTsKKyAqIGlucHV0IGNhbid0IGJlIHdyYXBwZWQgKHNvIG5vIG5lZWQgZm9yIHBhcmFtZXRlcnMpOyBmaWVsZHMgYXJlIG5vdAorICogZXhwb3NlZCB0aHJvdWdoIEpBWC1SUzsgYW5kIHdlIGRvIG5vdCBhbGxvdyAnZGVmYXVsdCB3cmFwcGluZycgZm9yCisgKiB0eXBlcy4KKyAqPHA+CisgKiBOb3RlIG9uIHByb3BlcnRpZXM6IGlmIGVpdGhlciB7QGxpbmsgI3ByZWZpeCgpfSBvciB7QGxpbmsgI3N1ZmZpeCgpfQorICogaXMgbm9uLWVtcHR5LCB0aGV5IGFyZSB1c2VkIGFzIGxpdGVyYWwgcHJlZml4IGFuZCBzdWZmaXggdG8gdXNlLgorICogT3RoZXJ3aXNlIHtAbGluayAjdmFsdWUoKX0gaXMgdXNlZCBhcyB0aGUgZnVuY3Rpb24gbmFtZSwgZm9sbG93ZWQKKyAqIGJ5IG9wZW5pbmcgcGFyZW50aGVzaXMsIHZhbHVlLCBhbmQgY2xvc2luZyBwYXJlbnRoZXNpcy4KKyAqPHA+CisgKiBFeGFtcGxlIHVzYWdlOgorICo8cHJlPgorICogIGNsYXNzIFdyYXBwZXIgeworICogICAgIEBKU09OUCgibXlGdW5jIikgcHVibGljIGludCB2YWx1ZSA9IDM7CisgKiAgfQorICo8L3ByZT4KKyAqICB3b3VsZCBzZXJpYWxpemUgYXM6CisgKjxwcmU+CisgKiAgbXlGdW5jKHsidmFsdWUiOjN9KQorICo8cHJlPgorICogIHdoZXJlYXMKKyAqPC9wcmU+CisgKjxwcmU+CisgKiAgY2xhc3MgV3JhcHBlciB7CisgKiAgICAgQEpTT05QKHByZWZpeD0iY2FsbCgiLCBzdWZmaXg9IikrMyIpIHB1YmxpYyBpbnQgdmFsdWUgPSAxOworICogIH0KKyAqPC9wcmU+CisgKiAgd291bGQgc2VyaWFsaXplIGFzOgorICo8cHJlPgorICogIGNhbGwoeyJ2YWx1ZSI6MX0pKzMKKyAqPHByZT4KKyAqLworQFRhcmdldCh7RWxlbWVudFR5cGUuQU5OT1RBVElPTl9UWVBFLCBFbGVtZW50VHlwZS5NRVRIT0QgfSkKK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitAY29tLmZhc3RlcnhtbC5qYWNrc29uLmFubm90YXRpb24uSmFja3NvbkFubm90YXRpb24KK3B1YmxpYyBAaW50ZXJmYWNlIEpTT05QCit7CisgICAgLyoqCisgICAgICogTWV0aG9kIHVzZWQgZm9yIEpTT05QLCB1bmxlc3Mge0BsaW5rICNwcmVmaXgoKX0gb3IKKyAgICAgKiB7QGxpbmsgI3N1ZmZpeCgpfSByZXR1cm4gbm9uLWVtcHR5IFN0cmluZ3MuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyB2YWx1ZSgpIGRlZmF1bHQgIiI7CisgICAgCisgICAgLyoqCisgICAgICogUHJlZml4IFN0cmluZyB1c2VkIGZvciBKU09OUCBpZiBub3QgZW1wdHk6IHdpbGwgYmUgaW5jbHVkZWQKKyAgICAgKiB2ZXJiYXRpbSBiZWZvcmUgSlNPTiB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHByZWZpeCgpIGRlZmF1bHQgIiI7CisKKyAgICAvKioKKyAgICAgKiBTdWZmaXggU3RyaW5nIHVzZWQgZm9yIEpTT05QIGlmIG5vdCBlbXB0eTogd2lsbCBiZSBpbmNsdWRlZAorICAgICAqIHZlcmJhdGltIGFmdGVyIEpTT04gdmFsdWUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBzdWZmaXgoKSBkZWZhdWx0ICIiOworCisgICAgLyoqCisgICAgICogSGVscGVyIGNsYXNzIGZvciBlbmNhcHN1bGF0aW5nIGluZm9ybWF0aW9uIGZyb20ge0BsaW5rIEpTT05QfQorICAgICAqIGFubm90YXRpb24gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEZWYgeworICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIG1ldGhvZDsKKyAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBwcmVmaXg7CisgICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgc3VmZml4OworCisgICAgICAgIHB1YmxpYyBEZWYoU3RyaW5nIG0pIHsKKyAgICAgICAgICAgIG1ldGhvZCA9IG07CisgICAgICAgICAgICBwcmVmaXggPSBudWxsOworICAgICAgICAgICAgc3VmZml4ID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICAKKyAgICAgICAgcHVibGljIERlZihKU09OUCBqc29uKSB7CisgICAgICAgICAgICBtZXRob2QgPSBlbXB0eUFzTnVsbChqc29uLnZhbHVlKCkpOworICAgICAgICAgICAgcHJlZml4ID0gZW1wdHlBc051bGwoanNvbi5wcmVmaXgoKSk7CisgICAgICAgICAgICBzdWZmaXggPSBlbXB0eUFzTnVsbChqc29uLnN1ZmZpeCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBlbXB0eUFzTnVsbChTdHJpbmcgc3RyKSB7CisgICAgICAgICAgICBpZiAoc3RyID09IG51bGwgfHwgc3RyLmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBzdHI7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYWNrc29uL2ludGVybmFsL2phY2tzb24vamF4cnMvanNvbi9hbm5vdGF0aW9uL0phY2tzb25GZWF0dXJlcy5qYXZhIGIvbWVkaWEvanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamFja3Nvbi9pbnRlcm5hbC9qYWNrc29uL2pheHJzL2pzb24vYW5ub3RhdGlvbi9KYWNrc29uRmVhdHVyZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODMxMDdhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamFja3Nvbi9pbnRlcm5hbC9qYWNrc29uL2pheHJzL2pzb24vYW5ub3RhdGlvbi9KYWNrc29uRmVhdHVyZXMuamF2YQpAQCAtMCwwICsxLDQyIEBACitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uaW50ZXJuYWwuamFja3Nvbi5qYXhycy5qc29uLmFubm90YXRpb247CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5EZXNlcmlhbGl6YXRpb25GZWF0dXJlOworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5TZXJpYWxpemF0aW9uRmVhdHVyZTsKKworLyoqCisgKiBBbm5vdGF0aW9uIHRoYXQgY2FuIGJlIHVzZWQgZW5hYmxlIGFuZC9vciBkaXNhYmxlIHZhcmlvdXMKKyAqIGZlYXR1cmVzIGZvciA8Y29kZT5PYmplY3RSZWFkZXI8L2NvZGU+cyBhbmQgPGNvZGU+T2JqZWN0V3JpdGVyPC9jb2RlPnMuCisgKiAKKyAqIEBkZXByZWNhdGVkIFNpbmNlIDIuMiwgdXNlIHNoYXJlZCB7QGxpbmsgY29tLmZhc3RlcnhtbC5qYWNrc29uLmpheHJzLmFubm90YXRpb24uSmFja3NvbkZlYXR1cmVzfSBpbnN0ZWFkCisgKi8KK0BUYXJnZXQoe0VsZW1lbnRUeXBlLkFOTk9UQVRJT05fVFlQRSwgRWxlbWVudFR5cGUuTUVUSE9EIH0pCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorQGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5hbm5vdGF0aW9uLkphY2tzb25Bbm5vdGF0aW9uCitARGVwcmVjYXRlZCAvLyBzaW5jZSAyLjIKK3B1YmxpYyBAaW50ZXJmYWNlIEphY2tzb25GZWF0dXJlcworeworICAgIC8qKgorICAgICAqIERlc2VyaWFsaXphdGlvbiBmZWF0dXJlcyB0byBlbmFibGUuCisgICAgICovCisgICAgcHVibGljIERlc2VyaWFsaXphdGlvbkZlYXR1cmVbXSBkZXNlcmlhbGl6YXRpb25FbmFibGUoKSBkZWZhdWx0IHsgfTsKKworICAgIC8qKgorICAgICAqIERlc2VyaWFsaXphdGlvbiBmZWF0dXJlcyB0byBkaXNhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBEZXNlcmlhbGl6YXRpb25GZWF0dXJlW10gZGVzZXJpYWxpemF0aW9uRGlzYWJsZSgpIGRlZmF1bHQgeyB9OworICAgIAorICAgIC8qKgorICAgICAqIFNlcmlhbGl6YXRpb24gZmVhdHVyZXMgdG8gZW5hYmxlLgorICAgICAqLworICAgIHB1YmxpYyBTZXJpYWxpemF0aW9uRmVhdHVyZVtdIHNlcmlhbGl6YXRpb25FbmFibGUoKSBkZWZhdWx0IHsgfTsKKworICAgIC8qKgorICAgICAqIFNlcmlhbGl6YXRpb24gZmVhdHVyZXMgdG8gZGlzYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2VyaWFsaXphdGlvbkZlYXR1cmVbXSBzZXJpYWxpemF0aW9uRGlzYWJsZSgpIGRlZmF1bHQgeyB9OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamFja3Nvbi9pbnRlcm5hbC9qYWNrc29uL2pheHJzL3V0aWwvQ2xhc3NLZXkuamF2YSBiL21lZGlhL2pzb24tamFja3Nvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2phY2tzb24vaW50ZXJuYWwvamFja3Nvbi9qYXhycy91dGlsL0NsYXNzS2V5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNmYjllOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2pzb24tamFja3Nvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2phY2tzb24vaW50ZXJuYWwvamFja3Nvbi9qYXhycy91dGlsL0NsYXNzS2V5LmphdmEKQEAgLTAsMCArMSw5MSBAQAorcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uLmludGVybmFsLmphY2tzb24uamF4cnMudXRpbDsKKworLyoqCisgKiBFZmZpY2llbnQga2V5IGNsYXNzLCB1c2VkIGluc3RlYWQgb2YgdXNpbmcgPGNvZGU+Q2xhc3M8L2NvZGU+LgorICogVGhlIHJlYXNvbiBmb3IgaGF2aW5nIGEgc2VwYXJhdGUga2V5IGNsYXNzIGluc3RlYWQgb2YKKyAqIGRpcmVjdGx5IHVzaW5nIHtAbGluayBDbGFzc30gYXMga2V5IGlzIG1vc3RseQorICogdG8gYWxsb3cgZm9yIHJlZGVmaW5pbmcgPGNvZGU+aGFzaENvZGU8L2NvZGU+IG1ldGhvZCAtLQorICogZm9yIHNvbWUgc3RyYW5nZSByZWFzb24sIHtAbGluayBDbGFzc30gZG9lcyBub3QKKyAqIHJlZGVmaW5lIHtAbGluayBPYmplY3QjaGFzaENvZGV9IGFuZCB0aHVzIHVzZXMgaWRlbnRpdHkKKyAqIGhhc2gsIHdoaWNoIGlzIHByZXR0eSBzbG93LiBUaGlzIG1ha2VzIGtleSBhY2Nlc3MgdXNpbmcKKyAqIHtAbGluayBDbGFzc30gdW5uZWNlc3NhcmlseSBzbG93LgorICo8cD4KKyAqIE5vdGU6IHNpbmNlIGNsYXNzIGlzIG5vdCBzdHJpY3RseSBpbW11dGFibGUsIGNhbGxlciBtdXN0CisgKiBrbm93IHdoYXQgaXQgaXMgZG9pbmcsIGlmIGNoYW5naW5nIGZpZWxkIHZhbHVlcy4KKyAqCisgKiBAc2luY2UgMi4yCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBDbGFzc0tleQorICAgIGltcGxlbWVudHMgQ29tcGFyYWJsZTxDbGFzc0tleT4KK3sKKyAgICBwcml2YXRlIFN0cmluZyBfY2xhc3NOYW1lOworCisgICAgcHJpdmF0ZSBDbGFzczw/PiBfY2xhc3M7CisKKyAgICAvKioKKyAgICAgKiBMZXQncyBjYWNoZSBoYXNoIGNvZGUgc3RyYWlnaHQgYXdheSwgc2luY2Ugd2UgYXJlCisgICAgICogYWxtb3N0IGNlcnRhaW4gdG8gbmVlZCBpdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGludCBfaGFzaENvZGU7CisKKyAgICBwdWJsaWMgQ2xhc3NLZXkoKSAKKyAgICB7CisgICAgICAgIF9jbGFzcyA9IG51bGw7CisgICAgICAgIF9jbGFzc05hbWUgPSBudWxsOworICAgICAgICBfaGFzaENvZGUgPSAwOworICAgIH0KKworICAgIHB1YmxpYyBDbGFzc0tleShDbGFzczw/PiBjbHopCisgICAgeworICAgICAgICBfY2xhc3MgPSBjbHo7CisgICAgICAgIF9jbGFzc05hbWUgPSBjbHouZ2V0TmFtZSgpOworICAgICAgICBfaGFzaENvZGUgPSBfY2xhc3NOYW1lLmhhc2hDb2RlKCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgcmVzZXQoQ2xhc3M8Pz4gY2x6KQorICAgIHsKKyAgICAgICAgX2NsYXNzID0gY2x6OworICAgICAgICBfY2xhc3NOYW1lID0gY2x6LmdldE5hbWUoKTsKKyAgICAgICAgX2hhc2hDb2RlID0gX2NsYXNzTmFtZS5oYXNoQ29kZSgpOworICAgIH0KKworICAgIC8qCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAvKiBDb21wYXJhYmxlCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKi8KKworICAgIC8vIEp1c3QgbmVlZCB0byBzb3J0IGJ5IG5hbWUsIG9rIHRvIGNvbGxpZGUgKHVubGVzcyB1c2VkIGluIFRyZWVNYXAvU2V0ISkKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhDbGFzc0tleSBvdGhlcikgeworICAgICAgICByZXR1cm4gX2NsYXNzTmFtZS5jb21wYXJlVG8ob3RoZXIuX2NsYXNzTmFtZSk7CisgICAgfQorICAgIAorICAgIC8qCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAvKiBTdGFuZGFyZCBtZXRob2RzCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKi8KKworICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pCisgICAgeworICAgICAgICBpZiAobyA9PSB0aGlzKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKG8gPT0gbnVsbCkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoby5nZXRDbGFzcygpICE9IGdldENsYXNzKCkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgQ2xhc3NLZXkgb3RoZXIgPSAoQ2xhc3NLZXkpIG87CisKKyAgICAgICAgLyogSXMgaXQgcG9zc2libGUgdG8gaGF2ZSBkaWZmZXJlbnQgQ2xhc3Mgb2JqZWN0IGZvciBzYW1lIG5hbWUgKyBjbGFzcyBsb2FkZXIgY29tYm8/CisgICAgICAgICAqIExldCdzIGFzc3VtZSBhbnN3ZXIgaXMgbm86IGlmIHRoaXMgaXMgd3JvbmcsIHdpbGwgbmVlZCB0byB1bmNvbW1lbnQgZm9sbG93aW5nIGZ1bmN0aW9uYWxpdHkKKyAgICAgICAgICovCisgICAgICAgIC8qCisgICAgICAgIHJldHVybiAob3RoZXIuX2NsYXNzTmFtZS5lcXVhbHMoX2NsYXNzTmFtZSkpCisgICAgICAgICAgICAmJiAob3RoZXIuX2NsYXNzLmdldENsYXNzTG9hZGVyKCkgPT0gX2NsYXNzLmdldENsYXNzTG9hZGVyKCkpOworICAgICAgICAqLworICAgICAgICByZXR1cm4gb3RoZXIuX2NsYXNzID09IF9jbGFzczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUgcHVibGljIGludCBoYXNoQ29kZSgpIHsgcmV0dXJuIF9oYXNoQ29kZTsgfQorCisgICAgQE92ZXJyaWRlIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7IHJldHVybiBfY2xhc3NOYW1lOyB9ICAgIAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamFja3Nvbi9pbnRlcm5hbC9qYWNrc29uL2pheHJzL3V0aWwvRW5kcG9pbnRBc0JlYW5Qcm9wZXJ0eS5qYXZhIGIvbWVkaWEvanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamFja3Nvbi9pbnRlcm5hbC9qYWNrc29uL2pheHJzL3V0aWwvRW5kcG9pbnRBc0JlYW5Qcm9wZXJ0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkODcwZDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYWNrc29uL2ludGVybmFsL2phY2tzb24vamF4cnMvdXRpbC9FbmRwb2ludEFzQmVhblByb3BlcnR5LmphdmEKQEAgLTAsMCArMSw3NyBAQAorcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uLmludGVybmFsLmphY2tzb24uamF4cnMudXRpbDsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CisKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuQmVhblByb3BlcnR5OworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5KYXZhVHlwZTsKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuUHJvcGVydHlNZXRhZGF0YTsKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuUHJvcGVydHlOYW1lOworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5pbnRyb3NwZWN0LkFubm90YXRpb25NYXA7CisKKy8qKgorICoge0BsaW5rIEJlYW5Qcm9wZXJ0eX0gaW1wbGVtZW50YXRpb24gdXNlZCBmb3IgcGFzc2luZyBhbm5vdGF0aW9ucworICogZnJvbSBKQVgtUlMgZW5kcG9pbnQgaW50byBKYWNrc29uLiBUaGlzIHRyaWVzIHRvIGltaXRhdGUgYmVoYXZpb3IKKyAqIG9uZSB3b3VsZCBnZXQgaWYgYWN0dWFsIHJlc291cmNlIG1ldGhvZCB3YXMgdXNlZCBhcyBQT0pPIHByb3BlcnR5OworICogaWRlYWxseSB0aGlzIHdvdWxkIGJlIGhvdyBpbXBsZW1lbnRhdGlvbiB3b3JrcyBidXQgZHVlIEpBWC1SUyBBUEkKKyAqIGxpbWl0YXRpb25zLCB3ZSBhcmUgb25seSBnaXZlbiBhbm5vdGF0aW9ucyBhc3NvY2lhdGVkLCBhbmQgdGhhdAorICogaGFzIHRvIGRvLgorICo8cD4KKyAqIE5PVEU6IG5vdCB5ZXQgdXNlZCBieSBKQVgtUlMgcHJvdmlkZXIsIGRpcmVjdGx5LCBhcyBvZiBKYWNrc29uIDIuNi4KKyAqLworcHVibGljIGNsYXNzIEVuZHBvaW50QXNCZWFuUHJvcGVydHkKKyAgICBleHRlbmRzIEJlYW5Qcm9wZXJ0eS5TdGQKK3sKKyAgICBwdWJsaWMgZmluYWwgc3RhdGljIFByb3BlcnR5TmFtZSBFTkRQT0lOVF9OQU1FID0gbmV3IFByb3BlcnR5TmFtZSgiSkFYLVJTL2VuZHBvaW50Iik7CisKKyAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBBbm5vdGF0aW9uTWFwIE5PX0FOTk9UQVRJT05TID0gbmV3IEFubm90YXRpb25NYXAoKTsKKworICAgIHByb3RlY3RlZCB0cmFuc2llbnQgQW5ub3RhdGlvbltdIF9yYXdBbm5vdGF0aW9uczsKKyAgICAKKyAgICBwdWJsaWMgQW5ub3RhdGlvbk1hcCBfYW5ub3RhdGlvbnM7CisKKyAgICBwdWJsaWMgRW5kcG9pbnRBc0JlYW5Qcm9wZXJ0eShQcm9wZXJ0eU5hbWUgbmFtZSwgSmF2YVR5cGUgdHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zKQorICAgIHsKKyAgICAgICAgLy8gVE9ETzogZmluZCBhbmQgcGFzcyB3cmFwcGVyOyBpc1JlcXVpcmVkIG1hcmtlcj8KKyAgICAgICAgc3VwZXIobmFtZSwgdHlwZSwgLypQcm9wZXJ0eU5hbWUgd3JhcHBlck5hbWUqLyBudWxsLAorICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIFByb3BlcnR5TWV0YWRhdGEuU1REX09QVElPTkFMKTsKKyAgICAgICAgX3Jhd0Fubm90YXRpb25zID0gYW5ub3RhdGlvbnM7CisgICAgICAgIF9hbm5vdGF0aW9ucyA9IG51bGw7CisgICAgfQorCisgICAgcHJvdGVjdGVkIEVuZHBvaW50QXNCZWFuUHJvcGVydHkoRW5kcG9pbnRBc0JlYW5Qcm9wZXJ0eSBiYXNlLCBKYXZhVHlwZSBuZXdUeXBlKQorICAgIHsKKyAgICAgICAgc3VwZXIoYmFzZSwgbmV3VHlwZSk7CisgICAgICAgIF9yYXdBbm5vdGF0aW9ucyA9IGJhc2UuX3Jhd0Fubm90YXRpb25zOworICAgICAgICBfYW5ub3RhdGlvbnMgPSBiYXNlLl9hbm5vdGF0aW9uczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RkIHdpdGhUeXBlKEphdmFUeXBlIHR5cGUpIHsKKyAgICAgICAgaWYgKF90eXBlID09IHR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgU3RkKF9uYW1lLCB0eXBlLCBfd3JhcHBlck5hbWUsIF9jb250ZXh0QW5ub3RhdGlvbnMsIF9tZW1iZXIsIF9tZXRhZGF0YSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxBIGV4dGVuZHMgQW5ub3RhdGlvbj4gQSBnZXRBbm5vdGF0aW9uKENsYXNzPEE+IGFjbHMpIHsKKyAgICAgICAgcmV0dXJuIGFubm90YXRpb25zKCkuZ2V0KGFjbHMpOworICAgIH0KKworICAgIHByb3RlY3RlZCBBbm5vdGF0aW9uTWFwIGFubm90YXRpb25zKCkgeworICAgICAgICBBbm5vdGF0aW9uTWFwIGFtID0gX2Fubm90YXRpb25zOworICAgICAgICBpZiAoYW0gPT0gbnVsbCkgeworICAgICAgICAgICAgQW5ub3RhdGlvbltdIHJhdyA9IF9yYXdBbm5vdGF0aW9uczsKKyAgICAgICAgICAgIGlmIChyYXcgPT0gbnVsbCB8fCByYXcubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICBhbSA9IE5PX0FOTk9UQVRJT05TOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhbSA9IG5ldyBBbm5vdGF0aW9uTWFwKCk7CisgICAgICAgICAgICAgICAgZm9yIChBbm5vdGF0aW9uIGEgOiByYXcpIHsKKyAgICAgICAgICAgICAgICAgICAgYW0uYWRkKGEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9hbm5vdGF0aW9ucyA9IGFtOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYWNrc29uL2ludGVybmFsL2phY2tzb24vamF4cnMvdXRpbC9MUlVNYXAuamF2YSBiL21lZGlhL2pzb24tamFja3Nvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2phY2tzb24vaW50ZXJuYWwvamFja3Nvbi9qYXhycy91dGlsL0xSVU1hcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNTJjZDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYWNrc29uL2ludGVybmFsL2phY2tzb24vamF4cnMvdXRpbC9MUlVNYXAuamF2YQpAQCAtMCwwICsxLDI4IEBACitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uaW50ZXJuYWwuamFja3Nvbi5qYXhycy51dGlsOworCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworLyoqCisgKiBIZWxwZXIgZm9yIHNpbXBsZSBib3VuZGVkIExSVSBtYXBzIHVzZWQgZm9yIHJldXNpbmcgbG9va3VwIHZhbHVlcy4KKyAqCisgKiBAc2luY2UgMi4yCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJzZXJpYWwiKQorcHVibGljIGNsYXNzIExSVU1hcDxLLFY+IGV4dGVuZHMgTGlua2VkSGFzaE1hcDxLLFY+Cit7CisgICAgcHJvdGVjdGVkIGZpbmFsIGludCBfbWF4RW50cmllczsKKyAgICAKKyAgICBwdWJsaWMgTFJVTWFwKGludCBpbml0aWFsRW50cmllcywgaW50IG1heEVudHJpZXMpCisgICAgeworICAgICAgICBzdXBlcihpbml0aWFsRW50cmllcywgMC44ZiwgdHJ1ZSk7CisgICAgICAgIF9tYXhFbnRyaWVzID0gbWF4RW50cmllczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgYm9vbGVhbiByZW1vdmVFbGRlc3RFbnRyeShNYXAuRW50cnk8SyxWPiBlbGRlc3QpCisgICAgeworICAgICAgICByZXR1cm4gc2l6ZSgpID4gX21heEVudHJpZXM7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9tZWRpYS9qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYWNrc29uL3BhY2thZ2UtaW5mby5qYXZhIGIvbWVkaWEvanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamFja3Nvbi9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODkwOTg1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamFja3Nvbi9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvKioKKyAqIEplcnNleSBjbGFzc2VzIHN1cHBvcnRpbmcgSlNPTiBtZWRpYSB0eXBlIHByb2Nlc3NpbmcgYmFzZWQgb24gSmFja3Nvbi4KKyAqLworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uOwpkaWZmIC0tZ2l0IGEvbWVkaWEvanNvbi1qYWNrc29uL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UubWQgYi9tZWRpYS9qc29uLWphY2tzb24vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL05PVElDRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDYyZDllCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvanNvbi1qYWNrc29uL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UubWQKQEAgLTAsMCArMSwzNyBAQAorIyBOb3RpY2UgZm9yIEplcnNleSBKc29uIEphY2tzb24gbW9kdWxlIA0KK1RoaXMgY29udGVudCBpcyBwcm9kdWNlZCBhbmQgbWFpbnRhaW5lZCBieSB0aGUgRWNsaXBzZSBKZXJzZXkgcHJvamVjdC4NCisNCisqIGh0dHBzOi8vcHJvamVjdHMuZWNsaXBzZS5vcmcvcHJvamVjdHMvZWU0ai5qZXJzZXkNCisNCisjIyBUcmFkZW1hcmtzDQorRWNsaXBzZSBKZXJzZXkgaXMgYSB0cmFkZW1hcmsgb2YgdGhlIEVjbGlwc2UgRm91bmRhdGlvbi4NCisNCisjIyBDb3B5cmlnaHQNCisNCitBbGwgY29udGVudCBpcyB0aGUgcHJvcGVydHkgb2YgdGhlIHJlc3BlY3RpdmUgYXV0aG9ycyBvciB0aGVpciBlbXBsb3llcnMuIEZvcg0KK21vcmUgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGF1dGhvcnNoaXAgb2YgY29udGVudCwgcGxlYXNlIGNvbnN1bHQgdGhlIGxpc3RlZA0KK3NvdXJjZSBjb2RlIHJlcG9zaXRvcnkgbG9ncy4NCisNCisjIyBEZWNsYXJlZCBQcm9qZWN0IExpY2Vuc2VzDQorDQorVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIHRlcm1zDQorb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIHdoaWNoIGlzIGF2YWlsYWJsZSBhdA0KK2h0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4gVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlDQorYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5IExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2gNCithdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUNCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24gd2hpY2ggaXMNCithdmFpbGFibGUgYXQgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLg0KKw0KK1NQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMA0KKw0KKyMjIFNvdXJjZSBDb2RlDQorVGhlIHByb2plY3QgbWFpbnRhaW5zIHRoZSBmb2xsb3dpbmcgc291cmNlIGNvZGUgcmVwb3NpdG9yaWVzOg0KKw0KKyogaHR0cHM6Ly9naXRodWIuY29tL2VjbGlwc2UtZWU0ai9qZXJzZXkNCisNCisjIyBUaGlyZC1wYXJ0eSBDb250ZW50DQorDQorSmFja3NvbiBKQVgtUlMgUHJvdmlkZXJzIHZlcnNpb24gMi44LjEwDQorKiBMaWNlbnNlOiBBcGFjaGUgTGljZW5zZSwgMi4wDQorKiBQcm9qZWN0OiBodHRwczovL2dpdGh1Yi5jb20vRmFzdGVyWE1ML2phY2tzb24tamF4cnMtcHJvdmlkZXJzDQorKiBDb3B5cmlnaHQ6IChjKSAyMDA5LTIwMTEgRmFzdGVyWE1MLCBMTEMuIEFsbCByaWdodHMgcmVzZXJ2ZWQgdW5sZXNzIG90aGVyd2lzZSBpbmRpY2F0ZWQuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvanNvbi1qYWNrc29uL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5zcGkuQXV0b0Rpc2NvdmVyYWJsZSBiL21lZGlhL2pzb24tamFja3Nvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuc3BpLkF1dG9EaXNjb3ZlcmFibGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgzNjY2NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2pzb24tamFja3Nvbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuc3BpLkF1dG9EaXNjb3ZlcmFibGUKQEAgLTAsMCArMSBAQAorb3JnLmdsYXNzZmlzaC5qZXJzZXkuamFja3Nvbi5pbnRlcm5hbC5KYWNrc29uQXV0b0Rpc2NvdmVyYWJsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvanNvbi1qYWNrc29uMS9wb20ueG1sIGIvbWVkaWEvanNvbi1qYWNrc29uMS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljZDM3MmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qc29uLWphY2tzb24xL3BvbS54bWwKQEAgLTAsMCArMSw5NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1qc29uLWphY2tzb24xPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LW1lZGlhLWpzb24tamFja3NvbjE8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIEplcnNleSBKU09OIEphY2tzb24gKDEueCkgZW50aXR5IHByb3ZpZGVycyBzdXBwb3J0IG1vZHVsZS4KKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi5pc3RhY2s8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4taXN0YWNrLWNvbW1vbnMtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJ1aWxkLWhlbHBlci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5mZWxpeDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1idW5kbGUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgICAgIDxleHRlbnNpb25zPnRydWU8L2V4dGVuc2lvbnM+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxpbnN0cnVjdGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8RXhwb3J0LVBhY2thZ2U+b3JnLmdsYXNzZmlzaC5qZXJzZXkuamFja3NvbjEuKjwvRXhwb3J0LVBhY2thZ2U+CisgICAgICAgICAgICAgICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgorICAgICAgICAgICAgICAgICAgICA8dW5wYWNrQnVuZGxlPnRydWU8L3VucGFja0J1bmRsZT4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29tbW9uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMuamFja3NvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphY2tzb24tY29yZS1hc2w8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMuamFja3NvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphY2tzb24tbWFwcGVyLWFzbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5qYWNrc29uPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amFja3Nvbi1qYXhyczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5qYWNrc29uPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amFja3Nvbi14YzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWVkaWEvanNvbi1qYWNrc29uMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2phY2tzb24xL0phY2tzb24xRmVhdHVyZS5qYXZhIGIvbWVkaWEvanNvbi1qYWNrc29uMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2phY2tzb24xL0phY2tzb24xRmVhdHVyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNDE4NDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qc29uLWphY2tzb24xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamFja3NvbjEvSmFja3NvbjFGZWF0dXJlLmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uMTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuQ29tbW9uUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5JbnRlcm5hbFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5Qcm9wZXJ0aWVzSGVscGVyOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmphY2tzb24uamF4cnMuSmFja3NvbkpheGJKc29uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmphY2tzb24uamF4cnMuSnNvbk1hcHBpbmdFeGNlcHRpb25NYXBwZXI7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmphY2tzb24uamF4cnMuSnNvblBhcnNlRXhjZXB0aW9uTWFwcGVyOworCisvKioKKyAqIEZlYXR1cmUgdXNlZCB0byByZWdpc3RlciBKYWNrc29uICgxLngpIEpTT04gcHJvdmlkZXJzLgorICoKKyAqIEBhdXRob3IgU3RlcGFuIEtvcHJpdmEKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgZmluYWwgY2xhc3MgSmFja3NvbjFGZWF0dXJlIGltcGxlbWVudHMgRmVhdHVyZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9GRUFUVVJFID0gSmFja3NvbjFGZWF0dXJlLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZShmaW5hbCBGZWF0dXJlQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlnID0gY29udGV4dC5nZXRDb25maWd1cmF0aW9uKCk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGpzb25GZWF0dXJlID0gQ29tbW9uUHJvcGVydGllcy5nZXRWYWx1ZShjb25maWcuZ2V0UHJvcGVydGllcygpLCBjb25maWcuZ2V0UnVudGltZVR5cGUoKSwKKyAgICAgICAgICAgICAgICBJbnRlcm5hbFByb3BlcnRpZXMuSlNPTl9GRUFUVVJFLCBKU09OX0ZFQVRVUkUsIFN0cmluZy5jbGFzcyk7CisgICAgICAgIC8vIE90aGVyIEpTT04gcHJvdmlkZXJzIHJlZ2lzdGVyZWQuCisgICAgICAgIGlmICghSlNPTl9GRUFUVVJFLmVxdWFsc0lnbm9yZUNhc2UoanNvbkZlYXR1cmUpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBEaXNhYmxlIG90aGVyIEpTT04gcHJvdmlkZXJzLgorICAgICAgICBjb250ZXh0LnByb3BlcnR5KFByb3BlcnRpZXNIZWxwZXIuZ2V0UHJvcGVydHlOYW1lRm9yUnVudGltZShJbnRlcm5hbFByb3BlcnRpZXMuSlNPTl9GRUFUVVJFLCBjb25maWcuZ2V0UnVudGltZVR5cGUoKSksCisgICAgICAgICAgICAgICAgSlNPTl9GRUFUVVJFKTsKKworICAgICAgICAvLyBhZGQgdGhlIGRlZmF1bHQgSmFja3NvbiBleGNlcHRpb24gbWFwcGVycworICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKEpzb25QYXJzZUV4Y2VwdGlvbk1hcHBlci5jbGFzcyk7CisgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoSnNvbk1hcHBpbmdFeGNlcHRpb25NYXBwZXIuY2xhc3MpOworICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKEphY2tzb25KYXhiSnNvblByb3ZpZGVyLmNsYXNzLCBNZXNzYWdlQm9keVJlYWRlci5jbGFzcywgTWVzc2FnZUJvZHlXcml0ZXIuY2xhc3MpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9qc29uLWphY2tzb24xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamFja3NvbjEvcGFja2FnZS1pbmZvLmphdmEgYi9tZWRpYS9qc29uLWphY2tzb24xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamFja3NvbjEvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA2MDU1ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2pzb24tamFja3NvbjEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qYWNrc29uMS9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvKioKKyAqIEplcnNleSBjbGFzc2VzIHN1cHBvcnRpbmcgSlNPTiBtZWRpYSB0eXBlIHByb2Nlc3NpbmcgYmFzZWQgb24gSmFja3NvbiAxLnguCisgKi8KK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamFja3NvbjE7CmRpZmYgLS1naXQgYS9tZWRpYS9qc29uLWpldHRpc29uL3BvbS54bWwgYi9tZWRpYS9qc29uLWpldHRpc29uL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVhZGZjMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2pzb24tamV0dGlzb24vcG9tLnhtbApAQCAtMCwwICsxLDkxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLWpzb24tamV0dGlzb248L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktbWVkaWEtanNvbi1qZXR0aXNvbjwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgSmVyc2V5IEpTT04gSmV0dGlzb24gZW50aXR5IHByb3ZpZGVycyBzdXBwb3J0IG1vZHVsZS4KKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi5pc3RhY2s8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4taXN0YWNrLWNvbW1vbnMtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJ1aWxkLWhlbHBlci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5mZWxpeDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1idW5kbGUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgICAgIDxleHRlbnNpb25zPnRydWU8L2V4dGVuc2lvbnM+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxpbnN0cnVjdGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8RXhwb3J0LVBhY2thZ2U+b3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dGlzb24uKjwvRXhwb3J0LVBhY2thZ2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8IS0tPEltcG9ydC1QYWNrYWdlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5zdW4ueG1sLmJpbmQuYW5ub3RhdGlvbjtyZXNvbHV0aW9uOj1vcHRpb25hbCxjb20uc3VuLnhtbC5iaW5kLnYyLio7cmVzb2x1dGlvbjo9b3B0aW9uYWwsICoKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvSW1wb3J0LVBhY2thZ2U+LS0+CisgICAgICAgICAgICAgICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgorICAgICAgICAgICAgICAgICAgICA8dW5wYWNrQnVuZGxlPnRydWU8L3VucGFja0J1bmRsZT4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29tbW9uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1qYXhiPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMuamV0dGlzb248L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0aXNvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWVkaWEvanNvbi1qZXR0aXNvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHRpc29uL0pldHRpc29uQ29uZmlnLmphdmEgYi9tZWRpYS9qc29uLWpldHRpc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamV0dGlzb24vSmV0dGlzb25Db25maWcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzY4NzVjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvanNvbi1qZXR0aXNvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHRpc29uL0pldHRpc29uQ29uZmlnLmphdmEKQEAgLTAsMCArMSwyNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dGlzb247CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCisvKioKKyAqIEFuIGltbXV0YWJsZSBjb25maWd1cmF0aW9uIG9mIEpTT04gbm90YXRpb24gYW5kIG9wdGlvbnMuIHtAY29kZSBKZXR0aXNvbkNvbmZpZ30KKyAqIGluc3RhbmNlIGNhbiBiZSB1c2VkIGZvciBjb25maWd1cmluZyB0aGUgSlNPTiBub3RhdGlvbiBvbiB7QGxpbmsgSmV0dGlzb25KYXhiQ29udGV4dH0uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEpldHRpc29uQ29uZmlnIHsKKworICAgIC8qKgorICAgICAqIEVudW1lcmF0aW9uIG9mIHN1cHBvcnRlZCBKU09OIG5vdGF0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgZW51bSBOb3RhdGlvbiB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbWFwcGVkIEpldHRpc29uIEpTT04gbm90YXRpb24uCisgICAgICAgICAqIDxwPkV4YW1wbGUgSlNPTiBleHByZXNzaW9uOjxwcmU+CisgICAgICAgICAqIHsidXNlclRhYmxlIjp7ImNvbHVtbnMiOlt7ImlkIjoidXNlcmlkIiwibGFiZWwiOiJVc2VySUQifSx7ImlkIjoibmFtZSIsImxhYmVsIjoiVXNlciBOYW1lIn1dLCJyb3dzIjp7InVzZXJpZCI6MTYyMSwibmFtZSI6Ikdyb3RlZmVuZCJ9fX0KKyAgICAgICAgICogPC9wcmU+CisgICAgICAgICAqLworICAgICAgICBNQVBQRURfSkVUVElTT04sCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgbWFwcGVkIEJhZGdlcmZpc2ggSlNPTiBub3RhdGlvbi4KKyAgICAgICAgICogPHA+RXhhbXBsZSBKU09OIGV4cHJlc3Npb246PHByZT4KKyAgICAgICAgICogeyJ1c2VyVGFibGUiOnsiY29sdW1ucyI6W3siaWQiOnsiJCI6InVzZXJpZCJ9LCJsYWJlbCI6eyIkIjoiVXNlcklEIn19LHsiaWQiOnsiJCI6Im5hbWUifSwibGFiZWwiOnsiJCI6IlVzZXIgTmFtZSJ9fV0sInJvd3MiOnsidXNlcmlkIjp7IiQiOiIxNjIxIn0sIm5hbWUiOnsiJCI6Ikdyb3RlZmVuZCJ9fX19CisgICAgICAgICAqIDwvcHJlPgorICAgICAgICAgKi8KKyAgICAgICAgQkFER0VSRklTSAorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgTm90YXRpb24gbm90YXRpb247CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IGpzb25YbWwySnNvbk5zOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxTdHJpbmc+IHNlcmlhbGl6ZUFzQXJyYXk7CisKKyAgICAvKioKKyAgICAgKiBCdWlsZGVyIGNsYXNzIGZvciBjb25zdHJ1Y3Rpbmcge0BsaW5rIEpldHRpc29uQ29uZmlnfSBvcHRpb25zCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIE5vdGF0aW9uIG5vdGF0aW9uOworICAgICAgICBwcm90ZWN0ZWQgTWFwPFN0cmluZywgU3RyaW5nPiBqc29uWG1sMkpzb25OcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigwKTsKKyAgICAgICAgcHJvdGVjdGVkIExpc3Q8U3RyaW5nPiBzZXJpYWxpemVBc0FycmF5ID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPigpOworCisgICAgICAgIHByaXZhdGUgQnVpbGRlcihmaW5hbCBOb3RhdGlvbiBub3RhdGlvbikgeworICAgICAgICAgICAgdGhpcy5ub3RhdGlvbiA9IG5vdGF0aW9uOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW1tdXRhYmxlIHtAbGluayBKZXR0aXNvbkNvbmZpZ30gb2JqZWN0IGJhc2VkIG9uIG9wdGlvbnMgc2V0IG9uIHRoaXMgQnVpbGRlcgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIGEgbm9uLW51bGwge0BsaW5rIEpldHRpc29uQ29uZmlnfSBpbnN0YW5jZQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEpldHRpc29uQ29uZmlnIGJ1aWxkKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBKZXR0aXNvbkNvbmZpZyh0aGlzKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBjb3B5QXR0cmlidXRlcyhmaW5hbCBKZXR0aXNvbkNvbmZpZyBqYykgeworICAgICAgICAgICAganNvblhtbDJKc29uTnMucHV0QWxsKGpjLmdldFhtbDJKc29uTnMoKSk7CisgICAgICAgICAgICBzZXJpYWxpemVBc0FycmF5LmFkZEFsbChqYy5nZXRBcnJheUVsZW1lbnRzKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQnVpbGRlciBjbGFzcyBmb3IgY29uc3RydWN0aW5nIHtAbGluayBKZXR0aXNvbkNvbmZpZ30gb3B0aW9ucworICAgICAqIGZvciB0aGUge0BsaW5rIEpldHRpc29uQ29uZmlnLk5vdGF0aW9uI01BUFBFRF9KRVRUSVNPTn0gY29udmVudGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1hcHBlZEpldHRpc29uQnVpbGRlciBleHRlbmRzIEJ1aWxkZXIgeworCisgICAgICAgIHByaXZhdGUgTWFwcGVkSmV0dGlzb25CdWlsZGVyKGZpbmFsIE5vdGF0aW9uIG5vdGF0aW9uKSB7CisgICAgICAgICAgICBzdXBlcihub3RhdGlvbik7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0dGVyIGZvciBYTUwgdG8gSlNPTiBuYW1lc3BhY2UgbWFwcGluZy4KKyAgICAgICAgICogVGhpcyBwcm9wZXJ0eSBpcyB2YWxpZCBmb3IgdGhlIHtAbGluayBKZXR0aXNvbkNvbmZpZy5Ob3RhdGlvbiNNQVBQRURfSkVUVElTT059CisgICAgICAgICAqIG5vdGF0aW9uIG9ubHkuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGUgdmFsdWUgaXMgYSBtYXAgd2l0aCB6ZXJvIG9yIG1vcmUKKyAgICAgICAgICoga2V5L3ZhbHVlIHBhaXJzLCB3aGVyZSB0aGUga2V5IGlzIGFuIFhNTCBuYW1lc3BhY2UgYW5kIHRoZSB2YWx1ZQorICAgICAgICAgKiBpcyB0aGUgcHJlZml4IHRvIHVzZSBhcyB0aGUgcmVwbGFjZW1lbnQgZm9yIHRoZSBYTUwgbmFtZXNwYWNlLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgYSBtYXAgd2l0aCB6ZXJvIGtleS92YWx1ZSBwYWlycy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGpzb25YbWwySnNvbk5zIFhNTCB0byBKU09OIG5hbWVzcGFjZSBtYXAuCisgICAgICAgICAqIEByZXR1cm4gdXBkYXRlZCBidWlsZGVyIGluc3RhbmNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE1hcHBlZEpldHRpc29uQnVpbGRlciB4bWwySnNvbk5zKGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4ganNvblhtbDJKc29uTnMpIHsKKyAgICAgICAgICAgIHRoaXMuanNvblhtbDJKc29uTnMgPSBqc29uWG1sMkpzb25OczsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBlbGVtZW50IG5hbWVzIHRvIGJlIHRyZWF0ZWQgYXMgYXJyYXlzLgorICAgICAgICAgKiBUaGlzIHByb3BlcnR5IGlzIHZhbGlkIGZvciB0aGUge0BsaW5rIEpldHRpc29uQ29uZmlnLk5vdGF0aW9uI01BUFBFRF9KRVRUSVNPTn0KKyAgICAgICAgICogbm90YXRpb24gb25seS4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFByb3BlcnR5IHZhbHVlIGlzIGEgbGlzdCBvZiBlbGVtZW50IG5hbWVzIHRoYXQgc2hvdWxkIGJlIHRyZWF0ZWQKKyAgICAgICAgICogYXMgYXJyYXlzIGV2ZW4gaWYgb25seSBhIHNpbmdsZSBpdGVtIGlzIHByZXNlbnQuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBhbiBlbXB0eSBsaXN0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYXJyYXlzIG5hbWVzIHRvIGJlIHNlcmlhbGl6ZWQgYXMgYXJyYXlzLgorICAgICAgICAgKiBAcmV0dXJuIHVwZGF0ZWQgYnVpbGRlciBpbnN0YW5jZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBNYXBwZWRKZXR0aXNvbkJ1aWxkZXIgc2VyaWFsaXplQXNBcnJheShmaW5hbCBTdHJpbmcuLi4gYXJyYXlzKSB7CisgICAgICAgICAgICByZXR1cm4gc2VyaWFsaXplQXNBcnJheShBcnJheXMuYXNMaXN0KGFycmF5cykpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBlbGVtZW50IG5hbWVzIHRvIGJlIHRyZWF0ZWQgYXMgYXJyYXlzLgorICAgICAgICAgKiBUaGlzIHByb3BlcnR5IGlzIHZhbGlkIGZvciB0aGUge0BsaW5rIEpldHRpc29uQ29uZmlnLk5vdGF0aW9uI01BUFBFRF9KRVRUSVNPTn0KKyAgICAgICAgICogbm90YXRpb24gb25seS4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFByb3BlcnR5IHZhbHVlIGlzIGEgbGlzdCBvZiBlbGVtZW50IG5hbWVzIHRoYXQgc2hvdWxkIGJlIHRyZWF0ZWQKKyAgICAgICAgICogYXMgYXJyYXlzIGV2ZW4gaWYgb25seSBhIHNpbmdsZSBpdGVtIGlzIHByZXNlbnQuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBhbiBlbXB0eSBsaXN0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYXJyYXlzIG9mIGVsZW1lbnQgbmFtZXMgdG8gYmUgc2VyaWFsaXplZCBhcyBhcnJheXMuCisgICAgICAgICAqIEByZXR1cm4gdXBkYXRlZCBidWlsZGVyIGluc3RhbmNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE1hcHBlZEpldHRpc29uQnVpbGRlciBzZXJpYWxpemVBc0FycmF5KGZpbmFsIExpc3Q8U3RyaW5nPiBhcnJheXMpIHsKKyAgICAgICAgICAgIHRoaXMuc2VyaWFsaXplQXNBcnJheS5hZGRBbGwoYXJyYXlzKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBKZXR0aXNvbkNvbmZpZyhmaW5hbCBCdWlsZGVyIGIpIHsKKyAgICAgICAgbm90YXRpb24gPSBiLm5vdGF0aW9uOworICAgICAgICBqc29uWG1sMkpzb25OcyA9IGIuanNvblhtbDJKc29uTnM7CisgICAgICAgIHNlcmlhbGl6ZUFzQXJyYXkgPSBiLnNlcmlhbGl6ZUFzQXJyYXk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQSBzdGF0aWMgbWV0aG9kIGZvciBvYnRhaW5pbmcge0BsaW5rIEpldHRpc29uQ29uZmlnfSBpbnN0YW5jZSB3aXRoIGh1bWFuUmVhZGFibGVGb3JtYXR0aW5nCisgICAgICogc2V0IGFjY29yZGluZyB0byBmb3JtYXR0ZWQgcGFyYW1ldGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGMgb3JpZ2luYWwgaW5zdGFuY2Ugb2Yge0BsaW5rIEpldHRpc29uQ29uZmlnfSwgY2FuJ3QgYmUgbnVsbAorICAgICAqIEByZXR1cm4gY29weSBvZiBwcm92aWRlZCB7QGxpbmsgSmV0dGlzb25Db25maWd9IHdpdGggaHVtYW5SZWFkYWJsZUZvcm1hdHRpbmcgc2V0IHRvIGZvcm1hdHRlZC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB3aGVuIHByb3ZpZGVkIHtAY29kZSBKZXR0aXNvbkNvbmZpZ30gaXMgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEpldHRpc29uQ29uZmlnIGNyZWF0ZUpTT05Db25maWd1cmF0aW9uKGZpbmFsIEpldHRpc29uQ29uZmlnIGMpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgICAgICBpZiAoYyA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJKZXR0aXNvbkNvbmZpZyBjYW4ndCBiZSBudWxsIik7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBCdWlsZGVyIGIgPSBjb3B5QnVpbGRlcihjKTsKKworICAgICAgICByZXR1cm4gYi5idWlsZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IHtAY29kZSBKZXR0aXNvbkNvbmZpZ30gdXNlcyB7QGxpbmsgSmV0dGlzb25Db25maWcuTm90YXRpb24jTUFQUEVEX0pFVFRJU09OfQorICAgICAqIG5vdGF0aW9uIHdpdGggcm9vdCB1bndyYXBwaW5nIG9wdGlvbiBzZXQgdG8gdHJ1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEpldHRpc29uQ29uZmlnIERFRkFVTFQgPSBtYXBwZWRKZXR0aXNvbigpLmJ1aWxkKCk7CisKKyAgICAvKioKKyAgICAgKiBBIHN0YXRpYyBtZXRob2QgZm9yIG9idGFpbmluZyBhIGJ1aWxkZXIgb2Yge0BsaW5rIEpldHRpc29uQ29uZmlnfSBpbnN0YW5jZSwgd2hpY2ggd2lsbCB1c2Uge0BsaW5rIEpldHRpc29uQ29uZmlnLk5vdGF0aW9uI01BUFBFRF9KRVRUSVNPTn0gSlNPTiBub3RhdGlvbi4KKyAgICAgKiBBZnRlciBnZXR0aW5nIHRoZSBidWlsZGVyLCB5b3UgY2FuIHNldCBjb25maWd1cmF0aW9uIG9wdGlvbnMgb24gaXQgYW5kIGZpbmFsbHkgZ2V0IGFuIGltbXV0YWJsZSB7QGNvZGUgSmV0dGlzb25Db25maWd9CisgICAgICogaW5zdGFuY2UgdXNpbmcgdGhlIHtAbGluayBKZXR0aXNvbkNvbmZpZy5CdWlsZGVyI2J1aWxkKCkgfSBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgYnVpbGRlciBmb3Ige0Bjb2RlIEpldHRpc29uQ29uZmlnfSBpbnN0YW5jZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTWFwcGVkSmV0dGlzb25CdWlsZGVyIG1hcHBlZEpldHRpc29uKCkgeworICAgICAgICByZXR1cm4gbmV3IE1hcHBlZEpldHRpc29uQnVpbGRlcihOb3RhdGlvbi5NQVBQRURfSkVUVElTT04pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEEgc3RhdGljIG1ldGhvZCBmb3Igb2J0YWluaW5nIGEgYnVpbGRlciBvZiB7QGxpbmsgSmV0dGlzb25Db25maWd9IGluc3RhbmNlLCB3aGljaCB3aWxsIHVzZSB7QGxpbmsgSmV0dGlzb25Db25maWcuTm90YXRpb24jQkFER0VSRklTSH0gSlNPTiBub3RhdGlvbi4KKyAgICAgKiBBZnRlciBnZXR0aW5nIHRoZSBidWlsZGVyLCB5b3UgY2FuIHNldCBjb25maWd1cmF0aW9uIG9wdGlvbnMgb24gaXQgYW5kIGZpbmFsbHkgZ2V0IGFuIGltbXV0YWJsZSB7QGNvZGUgSmV0dGlzb25Db25maWd9CisgICAgICogaW5zdGFuY2UgdXNpbmcgdGhlIHtAbGluayBKZXR0aXNvbkNvbmZpZy5CdWlsZGVyI2J1aWxkKCkgfSBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgYnVpbGRlciBmb3Ige0Bjb2RlIEpldHRpc29uQ29uZmlnfSBpbnN0YW5jZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBiYWRnZXJGaXNoKCkgeworICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoTm90YXRpb24uQkFER0VSRklTSCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIGNvcHlCdWlsZGVyKGZpbmFsIEpldHRpc29uQ29uZmlnIGpjKSB7CisKKyAgICAgICAgQnVpbGRlciByZXN1bHQgPSBuZXcgQnVpbGRlcihqYy5nZXROb3RhdGlvbigpKTsKKworICAgICAgICBzd2l0Y2ggKGpjLm5vdGF0aW9uKSB7CisgICAgICAgICAgICBjYXNlIEJBREdFUkZJU0g6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEJ1aWxkZXIoamMuZ2V0Tm90YXRpb24oKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIE1BUFBFRF9KRVRUSVNPTjoKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgTWFwcGVkSmV0dGlzb25CdWlsZGVyKGpjLmdldE5vdGF0aW9uKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgcmVzdWx0LmNvcHlBdHRyaWJ1dGVzKGpjKTsKKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgSlNPTiBub3RhdGlvbiBzZWxlY3RlZCBmb3IgdGhpcyBjb25maWd1cmF0aW9uCisgICAgICogQHJldHVybiBKU09OIG5vdGF0aW9uCisgICAgICovCisgICAgcHVibGljIE5vdGF0aW9uIGdldE5vdGF0aW9uKCkgeworICAgICAgICByZXR1cm4gbm90YXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIG1hcCBmb3IgWE1MIHRvIEpTT04gbmFtZXNwYWNlIG1hcHBpbmcKKyAgICAgKiBUaGlzIHByb3BlcnR5IGlzIHZhbGlkIGZvciB0aGUge0BsaW5rIEpldHRpc29uQ29uZmlnLk5vdGF0aW9uI01BUFBFRF9KRVRUSVNPTn0KKyAgICAgKiBub3RhdGlvbiBvbmx5LgorICAgICAqIEByZXR1cm4gYSBtYXAgZm9yIFhNTCB0byBKU09OIG5hbWVzcGFjZSBtYXBwaW5nLgorICAgICAqIEBzZWUgSmV0dGlzb25Db25maWcuTWFwcGVkSmV0dGlzb25CdWlsZGVyI3htbDJKc29uTnMoamF2YS51dGlsLk1hcCkKKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRYbWwySnNvbk5zKCkgeworICAgICAgICByZXR1cm4gKGpzb25YbWwySnNvbk5zICE9IG51bGwpID8gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKGpzb25YbWwySnNvbk5zKSA6IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgZWxlbWVudHMgdG8gYmUgdHJlYXRlZCBhcyBhcnJheXMuIEkuZS4gdGhlc2UgZWxlbWVudHMgd2lsbCBiZSBzZXJpYWxpemVkCisgICAgICogYXMgYXJyYXlzIGV2ZW4gaWYgb25seSBhIHNpbmdsZSBlbGVtZW50IGlzIGluY2x1ZGVkLgorICAgICAqIFRoaXMgcHJvcGVydHkgaXMgdmFsaWQgZm9yIHRoZSB7QGxpbmsgSmV0dGlzb25Db25maWcuTm90YXRpb24jTUFQUEVEX0pFVFRJU09OfQorICAgICAqIG5vdGF0aW9uIG9ubHkuCisgICAgICogQHJldHVybiBhIGxpc3Qgb2YgZWxlbWVudHMgcmVwcmVzZW50aW5nIGFycmF5cy4KKyAgICAgKiBAc2VlIEpldHRpc29uQ29uZmlnLk1hcHBlZEpldHRpc29uQnVpbGRlciNzZXJpYWxpemVBc0FycmF5KGphdmEudXRpbC5MaXN0KQorICAgICAqLworICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0QXJyYXlFbGVtZW50cygpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3Qoc2VyaWFsaXplQXNBcnJheSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIntub3RhdGlvbjolc30iLCBub3RhdGlvbik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvanNvbi1qZXR0aXNvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHRpc29uL0pldHRpc29uQ29uZmlndXJlZC5qYXZhIGIvbWVkaWEvanNvbi1qZXR0aXNvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHRpc29uL0pldHRpc29uQ29uZmlndXJlZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZGM4YTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qc29uLWpldHRpc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamV0dGlzb24vSmV0dGlzb25Db25maWd1cmVkLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0aXNvbjsKKworLyoqCisgKiBBbiBpbnRlcmZhY2UgZGVjbGFyaW5nIGEgSlNPTiBjb25maWd1cmF0aW9uIGlzIGF2YWlsYWJsZS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgaW50ZXJmYWNlIEpldHRpc29uQ29uZmlndXJlZCB7CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlcyBpbmZvcm1hdGlvbiBvbiBjdXJyZW50IEpTT04gY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGlzIG9iamVjdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSBub24tbnVsbCB7QGxpbmsgSmV0dGlzb25Db25maWd9IGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBKZXR0aXNvbkNvbmZpZyBnZXRKU09OQ29uZmlndXJhdGlvbigpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvanNvbi1qZXR0aXNvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHRpc29uL0pldHRpc29uRmVhdHVyZS5qYXZhIGIvbWVkaWEvanNvbi1qZXR0aXNvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHRpc29uL0pldHRpc29uRmVhdHVyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4YzFjOTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qc29uLWpldHRpc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamV0dGlzb24vSmV0dGlzb25GZWF0dXJlLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0aXNvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuQ29tbW9uUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5JbnRlcm5hbFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5Qcm9wZXJ0aWVzSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHRpc29uLmludGVybmFsLmVudGl0eS5KZXR0aXNvbkFycmF5UHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dGlzb24uaW50ZXJuYWwuZW50aXR5LkpldHRpc29uSmF4YkVsZW1lbnRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0aXNvbi5pbnRlcm5hbC5lbnRpdHkuSmV0dGlzb25MaXN0RWxlbWVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHRpc29uLmludGVybmFsLmVudGl0eS5KZXR0aXNvbk9iamVjdFByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHRpc29uLmludGVybmFsLmVudGl0eS5KZXR0aXNvblJvb3RFbGVtZW50UHJvdmlkZXI7CisKKy8qKgorICogRmVhdHVyZSB1c2VkIHRvIHJlZ2lzdGVyIEpldHRpc29uIEpTT04gcHJvdmlkZXJzLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgSmV0dGlzb25GZWF0dXJlIGltcGxlbWVudHMgRmVhdHVyZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9GRUFUVVJFID0gSmV0dGlzb25GZWF0dXJlLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKworICAgIHByaXZhdGUgc3RhdGljIENsYXNzW10gUFJPVklERVJTID0gbmV3IENsYXNzW10geworICAgICAgICAgICAgSmV0dGlzb25BcnJheVByb3ZpZGVyLkFwcC5jbGFzcywKKyAgICAgICAgICAgIEpldHRpc29uQXJyYXlQcm92aWRlci5HZW5lcmFsLmNsYXNzLAorCisgICAgICAgICAgICBKZXR0aXNvbk9iamVjdFByb3ZpZGVyLkFwcC5jbGFzcywKKyAgICAgICAgICAgIEpldHRpc29uT2JqZWN0UHJvdmlkZXIuR2VuZXJhbC5jbGFzcywKKworICAgICAgICAgICAgSmV0dGlzb25Sb290RWxlbWVudFByb3ZpZGVyLkFwcC5jbGFzcywKKyAgICAgICAgICAgIEpldHRpc29uUm9vdEVsZW1lbnRQcm92aWRlci5HZW5lcmFsLmNsYXNzLAorCisgICAgICAgICAgICBKZXR0aXNvbkpheGJFbGVtZW50UHJvdmlkZXIuQXBwLmNsYXNzLAorICAgICAgICAgICAgSmV0dGlzb25KYXhiRWxlbWVudFByb3ZpZGVyLkdlbmVyYWwuY2xhc3MsCisKKyAgICAgICAgICAgIEpldHRpc29uTGlzdEVsZW1lbnRQcm92aWRlci5BcHAuY2xhc3MsCisgICAgICAgICAgICBKZXR0aXNvbkxpc3RFbGVtZW50UHJvdmlkZXIuR2VuZXJhbC5jbGFzcworICAgIH07CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmUoZmluYWwgRmVhdHVyZUNvbnRleHQgY29udGV4dCkgeworICAgICAgICBmaW5hbCBDb25maWd1cmF0aW9uIGNvbmZpZyA9IGNvbnRleHQuZ2V0Q29uZmlndXJhdGlvbigpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBqc29uRmVhdHVyZSA9IENvbW1vblByb3BlcnRpZXMuZ2V0VmFsdWUoY29uZmlnLmdldFByb3BlcnRpZXMoKSwgY29uZmlnLmdldFJ1bnRpbWVUeXBlKCksCisgICAgICAgICAgICAgICAgSW50ZXJuYWxQcm9wZXJ0aWVzLkpTT05fRkVBVFVSRSwgSlNPTl9GRUFUVVJFLCBTdHJpbmcuY2xhc3MpOworICAgICAgICAvLyBPdGhlciBKU09OIHByb3ZpZGVycyByZWdpc3RlcmVkLgorICAgICAgICBpZiAoIUpTT05fRkVBVFVSRS5lcXVhbHNJZ25vcmVDYXNlKGpzb25GZWF0dXJlKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgLy8gRGlzYWJsZSBvdGhlciBKU09OIHByb3ZpZGVycy4KKyAgICAgICAgY29udGV4dC5wcm9wZXJ0eShQcm9wZXJ0aWVzSGVscGVyLmdldFByb3BlcnR5TmFtZUZvclJ1bnRpbWUoSW50ZXJuYWxQcm9wZXJ0aWVzLkpTT05fRkVBVFVSRSwgY29uZmlnLmdldFJ1bnRpbWVUeXBlKCkpLAorICAgICAgICAgICAgICAgIEpTT05fRkVBVFVSRSk7CisKKyAgICAgICAgZm9yIChmaW5hbCBDbGFzczw/PiBwcm92aWRlciA6IFBST1ZJREVSUykgeworICAgICAgICAgICAgY29udGV4dC5yZWdpc3Rlcihwcm92aWRlciwgTWVzc2FnZUJvZHlSZWFkZXIuY2xhc3MsIE1lc3NhZ2VCb2R5V3JpdGVyLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2pzb24tamV0dGlzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0aXNvbi9KZXR0aXNvbkpheGJDb250ZXh0LmphdmEgYi9tZWRpYS9qc29uLWpldHRpc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamV0dGlzb24vSmV0dGlzb25KYXhiQ29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlZDYxMjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qc29uLWpldHRpc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamV0dGlzb24vSmV0dGlzb25KYXhiQ29udGV4dC5qYXZhCkBAIC0wLDAgKzEsMzE0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHRpc29uOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLmJpbmQuTWFyc2hhbGxlcjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5Vbm1hcnNoYWxsZXI7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuVmFsaWRhdG9yOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dGlzb24uaW50ZXJuYWwuQmFzZUpzb25NYXJzaGFsbGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHRpc29uLmludGVybmFsLkJhc2VKc29uVW5tYXJzaGFsbGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHRpc29uLmludGVybmFsLkpldHRpc29uSmF4Yk1hcnNoYWxsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dGlzb24uaW50ZXJuYWwuSmV0dGlzb25KYXhiVW5tYXJzaGFsbGVyOworCisvKioKKyAqIEFuIGFkYXB0aW9uIG9mIHtAbGluayBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dH0gdGhhdCBzdXBwb3J0cyBtYXJzaGFsbGluZworICogYW5kIHVubWFyc2hhbGxpbmcgb2YgSkFYQiBiZWFucyB1c2luZyB0aGUgSlNPTiBmb3JtYXQuCisgKiA8cD4KKyAqIFRoZSBKU09OIGZvcm1hdCBtYXkgYmUgY29uZmlndXJlZCBieSB1c2luZyBhIHtAbGluayBKZXR0aXNvbkNvbmZpZ30gb2JqZWN0CisgKiBhcyBhIGNvbnN0cnVjdG9yIHBhcmFtZXRlciBvZiB0aGlzIGNsYXNzLgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgSmV0dGlzb25KYXhiQ29udGV4dCBleHRlbmRzIEpBWEJDb250ZXh0IGltcGxlbWVudHMgSmV0dGlzb25Db25maWd1cmVkIHsKKworICAgIHByaXZhdGUgSmV0dGlzb25Db25maWcganNvbkNvbmZpZ3VyYXRpb247CisgICAgcHJpdmF0ZSBmaW5hbCBKQVhCQ29udGV4dCBqYXhiQ29udGV4dDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugd2l0aCBkZWZhdWx0IHtAbGluayBKZXR0aXNvbkNvbmZpZ30uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhc3Nlc1RvQmVCb3VuZCBsaXN0IG9mIGphdmEgY2xhc3NlcyB0byBiZSByZWNvZ25pemVkIGJ5IHRoZQorICAgICAqICAgICAgICBuZXcgSnNvbkpheGJDb250ZXh0LiBDYW4gYmUgZW1wdHksIGluIHdoaWNoIGNhc2UgYSBKc29uSmF4YkNvbnRleHQKKyAgICAgKiAgICAgICAgdGhhdCBvbmx5IGtub3dzIGFib3V0IHNwZWMtZGVmaW5lZCBjbGFzc2VzIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgICogQHRocm93cyBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uIGlmIGFuIGVycm9yIHdhcyBlbmNvdW50ZXJlZCB3aGlsZSBjcmVhdGluZyB0aGUKKyAgICAgKiAgICAgICAgIHVuZGVybHlpbmcgSkFYQkNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIEpldHRpc29uSmF4YkNvbnRleHQoQ2xhc3MuLi4gY2xhc3Nlc1RvQmVCb3VuZCkgdGhyb3dzIEpBWEJFeGNlcHRpb24geworICAgICAgICB0aGlzKEpldHRpc29uQ29uZmlnLkRFRkFVTFQsIGNsYXNzZXNUb0JlQm91bmQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcgaW5zdGFuY2Ugd2l0aCBnaXZlbiB7QGxpbmsgSmV0dGlzb25Db25maWd9LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZyB7QGxpbmsgSmV0dGlzb25Db25maWd9LCBjYW4gbm90IGJlIG51bGwKKyAgICAgKiBAcGFyYW0gY2xhc3Nlc1RvQmVCb3VuZCBsaXN0IG9mIGphdmEgY2xhc3NlcyB0byBiZSByZWNvZ25pemVkIGJ5IHRoZQorICAgICAqICAgICAgICBuZXcgSnNvbkpheGJDb250ZXh0LiBDYW4gYmUgZW1wdHksIGluIHdoaWNoIGNhc2UgYSBKc29uSmF4YkNvbnRleHQKKyAgICAgKiAgICAgICAgdGhhdCBvbmx5IGtub3dzIGFib3V0IHNwZWMtZGVmaW5lZCBjbGFzc2VzIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgICogQHRocm93cyBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uIGlmIGFuIGVycm9yIHdhcyBlbmNvdW50ZXJlZCB3aGlsZSBjcmVhdGluZyB0aGUKKyAgICAgKiAgICAgICAgIHVuZGVybHlpbmcgSkFYQkNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIEpldHRpc29uSmF4YkNvbnRleHQoZmluYWwgSmV0dGlzb25Db25maWcgY29uZmlnLCBmaW5hbCBDbGFzcy4uLiBjbGFzc2VzVG9CZUJvdW5kKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjb25maWcgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSlNPTkNvbmZpZ3VyYXRpb24gTVVTVCBub3QgYmUgbnVsbCIpOworICAgICAgICB9CisKKyAgICAgICAganNvbkNvbmZpZ3VyYXRpb24gPSBjb25maWc7CisgICAgICAgIGpheGJDb250ZXh0ID0gSkFYQkNvbnRleHQubmV3SW5zdGFuY2UoY2xhc3Nlc1RvQmVCb3VuZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBpbnN0YW5jZSB3aXRoIGEgY3VzdG9tIHNldCBvZiBwcm9wZXJ0aWVzLgorICAgICAqIFRoZSBkZWZhdWx0IHtAbGluayBKZXR0aXNvbkNvbmZpZ30gaXMgdXNlZCBpZiBubyAobm93IGRlcHJlY2F0ZWQpCisgICAgICogSlNPTiByZWxhdGVkIHByb3BlcnRpZXMgYXJlIHNwZWNpZmllZAorICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzZXNUb0JlQm91bmQgbGlzdCBvZiBqYXZhIGNsYXNzZXMgdG8gYmUgcmVjb2duaXplZCBieSB0aGUKKyAgICAgKiAgICAgICAgbmV3IEpzb25KYXhiQ29udGV4dC4gQ2FuIGJlIGVtcHR5LCBpbiB3aGljaCBjYXNlIGEgSnNvbkpheGJDb250ZXh0CisgICAgICogICAgICAgIHRoYXQgb25seSBrbm93cyBhYm91dCBzcGVjLWRlZmluZWQgY2xhc3NlcyB3aWxsIGJlIHJldHVybmVkLgorICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzIHRoZSBjdXN0b20gc2V0IG9mIHByb3BlcnRpZXMuIElmIGl0IGNvbnRhaW5zKG5vdyBkZXByZWNhdGVkKSBKU09OIHJlbGF0ZWQgcHJvcGVydGllcywKKyAgICAgKiAgICAgICAgICAgICAgICAgIHRoZW4gYSBub24tZGVmYXVsdCB7QGxpbmsgSmV0dGlzb25Db25maWd9IGlzIHVzZWQgcmVmbGVjdGluZyB0aGUgSlNPTiBwcm9wZXJ0aWVzCisgICAgICogQHRocm93cyBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uIGlmIGFuIGVycm9yIHdhcyBlbmNvdW50ZXJlZCB3aGlsZSBjcmVhdGluZyB0aGUKKyAgICAgKiAgICAgICAgIHVuZGVybHlpbmcgSkFYQkNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIEpldHRpc29uSmF4YkNvbnRleHQoQ2xhc3NbXSBjbGFzc2VzVG9CZUJvdW5kLCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMpCisgICAgICAgICAgICB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgIGpheGJDb250ZXh0ID0gSkFYQkNvbnRleHQubmV3SW5zdGFuY2UoY2xhc3Nlc1RvQmVCb3VuZCwgcHJvcGVydGllcyk7CisgICAgICAgIGlmIChqc29uQ29uZmlndXJhdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICBqc29uQ29uZmlndXJhdGlvbiA9IEpldHRpc29uQ29uZmlnLkRFRkFVTFQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGluc3RhbmNlIHdpdGggYSBjdXN0b20gc2V0IG9mIHByb3BlcnRpZXMuCisgICAgICogSWYgbm8gKG5vdyBkZXByZWNhdGVkKSBKU09OIHJlbGF0ZWQgcHJvcGVydGllcyBhcmUgc3BlY2lmaWVkLAorICAgICAqIHRoZSB7QGxpbmsgSmV0dGlzb25Db25maWcjREVGQVVMVH0gaXMgdXNlZCBhcworICAgICAqIHtAbGluayBKZXR0aXNvbkNvbmZpZ30KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25maWcge0BsaW5rIEpldHRpc29uQ29uZmlnfSwgY2FuIG5vdCBiZSBudWxsCisgICAgICogQHBhcmFtIGNsYXNzZXNUb0JlQm91bmQgbGlzdCBvZiBqYXZhIGNsYXNzZXMgdG8gYmUgcmVjb2duaXplZCBieSB0aGUKKyAgICAgKiAgICAgICAgbmV3IEpzb25KYXhiQ29udGV4dC4gQ2FuIGJlIGVtcHR5LCBpbiB3aGljaCBjYXNlIGEgSnNvbkpheGJDb250ZXh0CisgICAgICogICAgICAgIHRoYXQgb25seSBrbm93cyBhYm91dCBzcGVjLWRlZmluZWQgY2xhc3NlcyB3aWxsIGJlIHJldHVybmVkLgorICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzIHRoZSBjdXN0b20gc2V0IG9mIHByb3BlcnRpZXMuCisgICAgICogQHRocm93cyBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uIGlmIGFuIGVycm9yIHdhcyBlbmNvdW50ZXJlZCB3aGlsZSBjcmVhdGluZyB0aGUKKyAgICAgKiAgICAgICAgIHVuZGVybHlpbmcgSkFYQkNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIEpldHRpc29uSmF4YkNvbnRleHQoZmluYWwgSmV0dGlzb25Db25maWcgY29uZmlnLCBmaW5hbCBDbGFzc1tdIGNsYXNzZXNUb0JlQm91bmQsIGZpbmFsIE1hcDxTdHJpbmcsCisgICAgICAgICAgICBPYmplY3Q+IHByb3BlcnRpZXMpCisgICAgICAgICAgICB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjb25maWcgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSlNPTkNvbmZpZ3VyYXRpb24gTVVTVCBub3QgYmUgbnVsbCIpOworICAgICAgICB9CisKKyAgICAgICAganNvbkNvbmZpZ3VyYXRpb24gPSBjb25maWc7CisgICAgICAgIGpheGJDb250ZXh0ID0gSkFYQkNvbnRleHQubmV3SW5zdGFuY2UoY2xhc3Nlc1RvQmVCb3VuZCwgcHJvcGVydGllcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHVzaW5nIGNvbnRleHQgY2xhc3MgbG9hZGVyIG9mIHRoZSB0aHJlYWQKKyAgICAgKiB3aXRoIGRlZmF1bHQge0BsaW5rIEpldHRpc29uQ29uZmlnfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0UGF0aCBsaXN0IG9mIGphdmEgcGFja2FnZSBuYW1lcyB0aGF0IGNvbnRhaW4gc2NoZW1hCisgICAgICogICAgICAgIGRlcml2ZWQgY2xhc3MgYW5kL29yIGphdmEgdG8gc2NoZW1hIChKQVhCLWFubm90YXRlZCkgbWFwcGVkCisgICAgICogICAgICAgIGNsYXNzZXMKKyAgICAgKiBAdGhyb3dzIGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb24gaWYgYW4gZXJyb3Igd2FzIGVuY291bnRlcmVkIHdoaWxlIGNyZWF0aW5nIHRoZQorICAgICAqICAgICAgICAgdW5kZXJseWluZyBKQVhCQ29udGV4dC4KKyAgICAgKi8KKyAgICBwdWJsaWMgSmV0dGlzb25KYXhiQ29udGV4dChTdHJpbmcgY29udGV4dFBhdGgpCisgICAgICAgICAgICB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMoSmV0dGlzb25Db25maWcuREVGQVVMVCwgY29udGV4dFBhdGgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSBvZiB1c2luZyBjb250ZXh0IGNsYXNzIGxvYWRlciBvZiB0aGUgdGhyZWFkCisgICAgICogd2l0aCBnaXZlbiB7QGxpbmsgSmV0dGlzb25Db25maWd9LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbmZpZyB7QGxpbmsgSmV0dGlzb25Db25maWd9LCBjYW4gbm90IGJlIG51bGwKKyAgICAgKiBAcGFyYW0gY29udGV4dFBhdGggbGlzdCBvZiBqYXZhIHBhY2thZ2UgbmFtZXMgdGhhdCBjb250YWluIHNjaGVtYQorICAgICAqICAgICAgICBkZXJpdmVkIGNsYXNzIGFuZC9vciBqYXZhIHRvIHNjaGVtYSAoSkFYQi1hbm5vdGF0ZWQpIG1hcHBlZAorICAgICAqICAgICAgICBjbGFzc2VzCisgICAgICogQHRocm93cyBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uIGlmIGFuIGVycm9yIHdhcyBlbmNvdW50ZXJlZCB3aGlsZSBjcmVhdGluZyB0aGUKKyAgICAgKiAgICAgICAgIHVuZGVybHlpbmcgSkFYQkNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIEpldHRpc29uSmF4YkNvbnRleHQoSmV0dGlzb25Db25maWcgY29uZmlnLCBTdHJpbmcgY29udGV4dFBhdGgpCisgICAgICAgICAgICB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChjb25maWcgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSlNPTkNvbmZpZ3VyYXRpb24gTVVTVCBub3QgYmUgbnVsbCIpOworICAgICAgICB9CisKKyAgICAgICAgamF4YkNvbnRleHQgPSBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZShjb250ZXh0UGF0aCwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSk7CisgICAgICAgIGpzb25Db25maWd1cmF0aW9uID0gY29uZmlnOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSB1c2luZyBhIHNwZWNpZmllZCBjbGFzcyBsb2FkZXIgd2l0aAorICAgICAqIGRlZmF1bHQgIHtAbGluayBKZXR0aXNvbkNvbmZpZ30uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dFBhdGggbGlzdCBvZiBqYXZhIHBhY2thZ2UgbmFtZXMgdGhhdCBjb250YWluIHNjaGVtYQorICAgICAqICAgICAgICBkZXJpdmVkIGNsYXNzIGFuZC9vciBqYXZhIHRvIHNjaGVtYSAoSkFYQi1hbm5vdGF0ZWQpIG1hcHBlZAorICAgICAqICAgICAgICBjbGFzc2VzCisgICAgICogQHBhcmFtIGNsYXNzTG9hZGVyCisgICAgICogQHRocm93cyBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uIGlmIGFuIGVycm9yIHdhcyBlbmNvdW50ZXJlZCB3aGlsZSBjcmVhdGluZyB0aGUKKyAgICAgKiAgICAgICAgIHVuZGVybHlpbmcgSkFYQkNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIEpldHRpc29uSmF4YkNvbnRleHQoU3RyaW5nIGNvbnRleHRQYXRoLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcikKKyAgICAgICAgICAgIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKKyAgICAgICAgamF4YkNvbnRleHQgPSBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZShjb250ZXh0UGF0aCwgY2xhc3NMb2FkZXIpOworICAgICAgICBqc29uQ29uZmlndXJhdGlvbiA9IEpldHRpc29uQ29uZmlnLkRFRkFVTFQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIHVzaW5nIGEgc3BlY2lmaWVkIGNsYXNzIGxvYWRlciBhbmQKKyAgICAgKiBhIGN1c3RvbSBzZXQgb2YgcHJvcGVydGllcy4ge0BsaW5rIEpldHRpc29uQ29uZmlnfSBpcyBzZXQgdG8gZGVmYXVsdCwKKyAgICAgKiBpZiB1c2VyIGRvZXMgbm90IHNwZWNpZnkgYW55IChub3cgZGVwcmVjYXRlZCkgSlNPTiByZWxhdGVkIHByb3BlcnRpZXMKKyAgICAgKgorICAgICAqIEBwYXJhbSBjb250ZXh0UGF0aCBsaXN0IG9mIGphdmEgcGFja2FnZSBuYW1lcyB0aGF0IGNvbnRhaW4gc2NoZW1hCisgICAgICogICAgICAgIGRlcml2ZWQgY2xhc3MgYW5kL29yIGphdmEgdG8gc2NoZW1hIChKQVhCLWFubm90YXRlZCkgbWFwcGVkCisgICAgICogICAgICAgIGNsYXNzZXMKKyAgICAgKiBAcGFyYW0gY2xhc3NMb2FkZXIKKyAgICAgKiBAcGFyYW0gcHJvcGVydGllcyB0aGUgY3VzdG9tIHNldCBvZiBwcm9wZXJ0aWVzLgorICAgICAqIEB0aHJvd3MgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbiBpZiBhbiBlcnJvciB3YXMgZW5jb3VudGVyZWQgd2hpbGUgY3JlYXRpbmcgdGhlCisgICAgICogICAgICAgICB1bmRlcmx5aW5nIEpBWEJDb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBKZXR0aXNvbkpheGJDb250ZXh0KFN0cmluZyBjb250ZXh0UGF0aCwgQ2xhc3NMb2FkZXIgY2xhc3NMb2FkZXIsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcykKKyAgICAgICAgICAgIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKKyAgICAgICAgamF4YkNvbnRleHQgPSBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZShjb250ZXh0UGF0aCwgY2xhc3NMb2FkZXIsIHByb3BlcnRpZXMpOworICAgICAgICBpZiAoanNvbkNvbmZpZ3VyYXRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAganNvbkNvbmZpZ3VyYXRpb24gPSBKZXR0aXNvbkNvbmZpZy5ERUZBVUxUOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIHVzaW5nIGEgc3BlY2lmaWVkIGNsYXNzIGxvYWRlciwKKyAgICAgKiBzZXQgb2YgcHJvcGVydGllcyBhbmQge0BsaW5rIEpldHRpc29uQ29uZmlnfSAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uZmlnIHtAbGluayBKZXR0aXNvbkNvbmZpZ30sIGNhbiBub3QgYmUgbnVsbAorICAgICAqIEBwYXJhbSBjb250ZXh0UGF0aCBsaXN0IG9mIGphdmEgcGFja2FnZSBuYW1lcyB0aGF0IGNvbnRhaW4gc2NoZW1hCisgICAgICogICAgICAgIGRlcml2ZWQgY2xhc3MgYW5kL29yIGphdmEgdG8gc2NoZW1hIChKQVhCLWFubm90YXRlZCkgbWFwcGVkCisgICAgICogICAgICAgIGNsYXNzZXMKKyAgICAgKiBAcGFyYW0gY2xhc3NMb2FkZXIKKyAgICAgKiBAcGFyYW0gcHJvcGVydGllcyB0aGUgY3VzdG9tIHNldCBvZiBwcm9wZXJ0aWVzLgorICAgICAqIEB0aHJvd3MgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbiBpZiBhbiBlcnJvciB3YXMgZW5jb3VudGVyZWQgd2hpbGUgY3JlYXRpbmcgdGhlCisgICAgICogICAgICAgICB1bmRlcmx5aW5nIEpBWEJDb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBKZXR0aXNvbkpheGJDb250ZXh0KEpldHRpc29uQ29uZmlnIGNvbmZpZywgU3RyaW5nIGNvbnRleHRQYXRoLCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlciwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKQorICAgICAgICAgICAgdGhyb3dzIEpBWEJFeGNlcHRpb24geworICAgICAgICBpZiAoY29uZmlnID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkpTT05Db25maWd1cmF0aW9uIE1VU1Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgfQorCisgICAgICAgIGpheGJDb250ZXh0ID0gSkFYQkNvbnRleHQubmV3SW5zdGFuY2UoY29udGV4dFBhdGgsIGNsYXNzTG9hZGVyLCBwcm9wZXJ0aWVzKTsKKyAgICAgICAganNvbkNvbmZpZ3VyYXRpb24gPSBjb25maWc7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHRpc29uLkpldHRpc29uTWFyc2hhbGxlcn0gZnJvbSBhIHtAbGluayBqYXZheC54bWwuYmluZC5NYXJzaGFsbGVyfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXJzaGFsbGVyIHRoZSBKQVhCIG1hcnNoYWxsZXIuCisgICAgICogQHJldHVybiB0aGUgSlNPTiBtYXJzaGFsbGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dGlzb24uSmV0dGlzb25NYXJzaGFsbGVyIGdldEpTT05NYXJzaGFsbGVyKE1hcnNoYWxsZXIgbWFyc2hhbGxlcikgeworICAgICAgICBpZiAobWFyc2hhbGxlciBpbnN0YW5jZW9mIG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHRpc29uLkpldHRpc29uTWFyc2hhbGxlcikgeworICAgICAgICAgICAgcmV0dXJuIChvcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0aXNvbi5KZXR0aXNvbk1hcnNoYWxsZXIpIG1hcnNoYWxsZXI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEJhc2VKc29uTWFyc2hhbGxlcihtYXJzaGFsbGVyLCBKZXR0aXNvbkNvbmZpZy5ERUZBVUxUKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHRpc29uLkpldHRpc29uVW5tYXJzaGFsbGVyfSBmcm9tIGEge0BsaW5rIGphdmF4LnhtbC5iaW5kLlVubWFyc2hhbGxlcn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdW5tYXJzaGFsbGVyIHRoZSBKQVhCIHVubWFyc2hhbGxlci4KKyAgICAgKiBAcmV0dXJuIHRoZSBKU09OIHVubWFyc2hhbGxlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHRpc29uLkpldHRpc29uVW5tYXJzaGFsbGVyIGdldEpTT05Vbm1hcnNoYWxsZXIoVW5tYXJzaGFsbGVyIHVubWFyc2hhbGxlcikgeworICAgICAgICBpZiAodW5tYXJzaGFsbGVyIGluc3RhbmNlb2Ygb3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dGlzb24uSmV0dGlzb25Vbm1hcnNoYWxsZXIpIHsKKyAgICAgICAgICAgIHJldHVybiAob3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dGlzb24uSmV0dGlzb25Vbm1hcnNoYWxsZXIpIHVubWFyc2hhbGxlcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQmFzZUpzb25Vbm1hcnNoYWxsZXIodW5tYXJzaGFsbGVyLCBKZXR0aXNvbkNvbmZpZy5ERUZBVUxUKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBKU09OIGNvbmZpZ3VyYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBKU09OIGNvbmZpZ3VyYXRpb24uCisgICAgICovCisgICAgcHVibGljIEpldHRpc29uQ29uZmlnIGdldEpTT05Db25maWd1cmF0aW9uKCkgeworICAgICAgICByZXR1cm4ganNvbkNvbmZpZ3VyYXRpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgSlNPTiB1bm1hcnNoYWxsZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBKU09OIHVubWFyc2hhbGxlcgorICAgICAqCisgICAgICogQHRocm93cyBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uIGlmIHRoZXJlIGlzIGFuIGVycm9yIGNyZWF0aW5nIHRoZSB1bm1hcnNoYWxsZXIuCisgICAgICovCisgICAgcHVibGljIG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHRpc29uLkpldHRpc29uVW5tYXJzaGFsbGVyIGNyZWF0ZUpzb25Vbm1hcnNoYWxsZXIoKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgSmV0dGlzb25KYXhiVW5tYXJzaGFsbGVyKHRoaXMsIGdldEpTT05Db25maWd1cmF0aW9uKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIEpTT04gbWFyc2hhbGxlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIEpTT04gbWFyc2hhbGxlci4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvciBjcmVhdGluZyB0aGUgbWFyc2hhbGxlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dGlzb24uSmV0dGlzb25NYXJzaGFsbGVyIGNyZWF0ZUpzb25NYXJzaGFsbGVyKCkgdGhyb3dzIEpBWEJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEpldHRpc29uSmF4Yk1hcnNoYWxsZXIodGhpcywgZ2V0SlNPTkNvbmZpZ3VyYXRpb24oKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3ZlcnJpZGVzIHVuZGVybHlpbmcgY3JlYXRlVW5tYXJzaGFsbGVyIG1ldGhvZCBhbmQgcmV0dXJucworICAgICAqIGFuIHVubWFyc2hhbGxlciB3aGljaCBpcyBjYXBhYmxlIG9mIEpTT04gZGVzZXJpYWxpemF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiB1bm1hcnNoYWxsZXIgaW5zdGFuY2Ugd2l0aCBKU09OIGNhcGFiaWxpdGllcworICAgICAqIEB0aHJvd3MgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBVbm1hcnNoYWxsZXIgY3JlYXRlVW5tYXJzaGFsbGVyKCkgdGhyb3dzIEpBWEJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEpldHRpc29uSmF4YlVubWFyc2hhbGxlcihqYXhiQ29udGV4dCwgZ2V0SlNPTkNvbmZpZ3VyYXRpb24oKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3ZlcnJpZGVzIHVuZGVybGF5aW5nIGNyZWF0ZU1hcnNoYWxsZXIgbWV0aG9kIGFuZCByZXR1cm5zCisgICAgICogYSBtYXJzaGFsbGVyIHdoaWNoIGlzIGNhcGFibGUgb2YgSlNPTiBzZXJpYWxpemF0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBtYXJzaGFsbGVyIGluc3RhbmNlIHdpdGggSlNPTiBjYXBhYmlsaXRpZXMKKyAgICAgKiBAdGhyb3dzIGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWFyc2hhbGxlciBjcmVhdGVNYXJzaGFsbGVyKCkgdGhyb3dzIEpBWEJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEpldHRpc29uSmF4Yk1hcnNoYWxsZXIoamF4YkNvbnRleHQsIGdldEpTT05Db25maWd1cmF0aW9uKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNpbXBseSBkZWxlZ2F0ZXMgdG8gdW5kZXJseWluZyBKQVhCQ29udGV4dCBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gd2hhdCB1bmRlcmx5aW5nIEpBWEJDb250ZXh0IHJldHVybnMKKyAgICAgKiBAdGhyb3dzIGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVmFsaWRhdG9yIGNyZWF0ZVZhbGlkYXRvcigpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGpheGJDb250ZXh0LmNyZWF0ZVZhbGlkYXRvcigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2pzb24tamV0dGlzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0aXNvbi9KZXR0aXNvbk1hcnNoYWxsZXIuamF2YSBiL21lZGlhL2pzb24tamV0dGlzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0aXNvbi9KZXR0aXNvbk1hcnNoYWxsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTVkMWY4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvanNvbi1qZXR0aXNvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHRpc29uL0pldHRpc29uTWFyc2hhbGxlci5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dGlzb247CisKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLmJpbmQuUHJvcGVydHlFeGNlcHRpb247CisKKy8qKgorICogQSBKU09OIG1hcnNoYWxsZXIgcmVzcG9uc2libGUgZm9yIHNlcmlhbGl6aW5nIEphdmEgY29udGVudCB0cmVlcywgZGVmaW5lZAorICogYnkgSkFYQiwgdG8gSlNPTiBkYXRhLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSmV0dGlzb25NYXJzaGFsbGVyIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVFRFRCA9ICJvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5qc29uLkpzb25NYXJzaGFsbGVyLmZvcm1hdHRlZCI7CisKKyAgICAvKioKKyAgICAgKiBNYXJzaGFsbCB0aGUgY29udGVudCB0cmVlIHJvb3RlZCBhdCA8Y29kZT5qYXhiRWxlbWVudDwvY29kZT4gaW50byBhbgorICAgICAqIG91dHB1dCBzdHJlYW0uIFRoZSBjb250ZW50IHRyZWUgbWF5IGJlIGFuIGluc3RhbmNlIG9mIGEgY2xhc3MgdGhhdCBpcworICAgICAqIG1hcHBlZCB0byBhIFhNTCByb290IGVsZW1lbnQgKGZvciBleGFtcGxlLCBhbm5vdGF0ZWQgd2l0aAorICAgICAqIHtAbGluayBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50fSkgb3IgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIGphdmF4LnhtbC5iaW5kLkpBWEJFbGVtZW50fS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgVVRGLTggY2hhcmFjdGVyIGVuY29kaW5nIHNjaGVtZSB3aWxsIGJlIHVzZWQgdG8gZW5jb2RlIHRoZSBjaGFyYWN0ZXJzCisgICAgICogb2YgdGhlIEpTT04gZGF0YS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBqYXhiRWxlbWVudCB0aGUgcm9vdCBvZiB0aGUgY29udGVudCB0cmVlIHRvIGJlIG1hcnNoYWxsZWQuCisgICAgICogQHBhcmFtIG9zIHRoZSBKU09OIHdpbGwgYmUgYWRkZWQgdG8gdGhpcyBzdHJlYW0uCisgICAgICogQHRocm93cyBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uIGlmIGFueSB1bmV4cGVjdGVkIHByb2JsZW0gb2NjdXJzIGR1cmluZyB0aGUKKyAgICAgKiAgICAgICAgIG1hcnNoYWxsaW5nLgorICAgICAqIEB0aHJvd3MgamF2YXgueG1sLmJpbmQuTWFyc2hhbEV4Y2VwdGlvbiBpZiB0aGUgPGNvZGU+SnNvbk1hcnNoYWxsZXI8L2NvZGU+IGlzIHVuYWJsZSB0bworICAgICAqICAgICAgICAgbWFyc2hhbCA8Y29kZT5qYXhiRWxlbWVudDwvY29kZT4gKG9yIGFueSBvYmplY3QgcmVhY2hhYmxlIGZyb20gb2JqKQorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFueSBvZiB0aGUgbWV0aG9kIHBhcmFtZXRlcnMgYXJlIG51bGwuCisgICAgICoKKyAgICAgKi8KKyAgICB2b2lkIG1hcnNoYWxsVG9KU09OKE9iamVjdCBqYXhiRWxlbWVudCwgT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIE1hcnNoYWxsIHRoZSBjb250ZW50IHRyZWUgcm9vdGVkIGF0IDxjb2RlPmpheGJFbGVtZW50PC9jb2RlPiBpbnRvIGFuCisgICAgICogb3V0cHV0IHN0cmVhbS4gVGhlIGNvbnRlbnQgdHJlZSBtYXkgYmUgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcyB0aGF0IGlzCisgICAgICogbWFwcGVkIHRvIGEgWE1MIHJvb3QgZWxlbWVudCAoZm9yIGV4YW1wbGUsIGFubm90YXRlZCB3aXRoCisgICAgICoge0BsaW5rIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnR9KSBvciBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgamF2YXgueG1sLmJpbmQuSkFYQkVsZW1lbnR9LgorICAgICAqIDxwPgorICAgICAqIFRoZSBjaGFyYWN0ZXIgZW5jb2Rpbmcgc2NoZW1lIG9mIHRoZSA8Y29kZT53cml0ZXI8L2NvZGU+IHdpbGwgYmUgdXNlZCB0bworICAgICAqIGVuY29kZSB0aGUgY2hhcmFjdGVycyBvZiB0aGUgSlNPTiBkYXRhLgorICAgICAqCisgICAgICogQHBhcmFtIGpheGJFbGVtZW50IHRoZSByb290IG9mIHRoZSBjb250ZW50IHRyZWUgdG8gYmUgbWFyc2hhbGxlZC4KKyAgICAgKiBAcGFyYW0gd3JpdGVyIHRoZSBKU09OIHdpbGwgYmUgYWRkZWQgdG8gdGhpcyB3cml0ZXIuCisgICAgICogQHRocm93cyBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uIGlmIGFueSB1bmV4cGVjdGVkIHByb2JsZW0gb2NjdXJzIGR1cmluZyB0aGUKKyAgICAgKiAgICAgICAgIG1hcnNoYWxsaW5nLgorICAgICAqIEB0aHJvd3MgamF2YXgueG1sLmJpbmQuTWFyc2hhbEV4Y2VwdGlvbiBpZiB0aGUgPGNvZGU+SnNvbk1hcnNoYWxsZXI8L2NvZGU+IGlzIHVuYWJsZSB0bworICAgICAqICAgICAgICAgbWFyc2hhbCA8Y29kZT5qYXhiRWxlbWVudDwvY29kZT4gKG9yIGFueSBvYmplY3QgcmVhY2hhYmxlIGZyb20gb2JqKQorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIElmIGFueSBvZiB0aGUgbWV0aG9kIHBhcmFtZXRlcnMgYXJlIG51bGwuCisgICAgICovCisgICAgdm9pZCBtYXJzaGFsbFRvSlNPTihPYmplY3QgamF4YkVsZW1lbnQsIFdyaXRlciB3cml0ZXIpIHRocm93cyBKQVhCRXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwYXJ0aWN1bGFyIHByb3BlcnR5IGluIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIG9mCisgICAgICoge0BsaW5rIEpldHRpc29uTWFyc2hhbGxlcn0uIEF0dGVtcHRpbmcgdG8gc2V0IGFuIHVuZGVmaW5lZCBwcm9wZXJ0eQorICAgICAqIHdpbGwgcmVzdWx0IGluIGEgUHJvcGVydHlFeGNlcHRpb24gYmVpbmcgdGhyb3duLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIGJlIHNldC4gVGhpcyB2YWx1ZSBjYW4gZWl0aGVyCisgICAgICogICAgICAgICAgICAgIGJlIHNwZWNpZmllZCB1c2luZyBvbmUgb2YgdGhlIGNvbnN0YW50IGZpZWxkcyBvciBhIHVzZXIKKyAgICAgKiAgICAgICAgICAgICAgc3VwcGxpZWQgc3RyaW5nLgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IHRvIGJlIHNldAorICAgICAqCisgICAgICogQHRocm93cyBqYXZheC54bWwuYmluZC5Qcm9wZXJ0eUV4Y2VwdGlvbiB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIHByb2Nlc3NpbmcgdGhlIGdpdmVuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkgb3IgdmFsdWUKKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgorICAgICAqICAgICAgSWYgdGhlIG5hbWUgcGFyYW1ldGVyIGlzIG51bGwKKyAgICAgKi8KKyAgICB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHRocm93cyBQcm9wZXJ0eUV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2pzb24tamV0dGlzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0aXNvbi9KZXR0aXNvblVubWFyc2hhbGxlci5qYXZhIGIvbWVkaWEvanNvbi1qZXR0aXNvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHRpc29uL0pldHRpc29uVW5tYXJzaGFsbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ2YjVmNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2pzb24tamV0dGlzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0aXNvbi9KZXR0aXNvblVubWFyc2hhbGxlci5qYXZhCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHRpc29uOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247CisKKy8qKgorICogQSBKU09OIHVubWFyc2hhbGxlciByZXNwb25zaWJsZSBmb3IgZGVzZXJpYWxpemluZyBKU09OIGRhdGEgdG8gYSBKYXZhCisgKiBjb250ZW50IHRyZWUsIGRlZmluZWQgYnkgSkFYQi4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgaW50ZXJmYWNlIEpldHRpc29uVW5tYXJzaGFsbGVyIHsKKworICAgIC8qKgorICAgICAqIFVubWFyc2hhbCBKU09OIGRhdGEgZnJvbSB0aGUgc3BlY2lmaWVkIDxjb2RlPklucHV0U3RyZWFtPC9jb2RlPiBhbmQKKyAgICAgKiByZXR1cm4gdGhlIHJlc3VsdGluZyBKYXZhIGNvbnRlbnQgdHJlZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgVVRGLTggY2hhcmFjdGVyIGVuY29kaW5nIHNjaGVtZSB3aWxsIGJlIHVzZWQgdG8gZGVjb2RlIHRoZSBlbmNvZGVkCisgICAgICogY2hhcmFjdGVycyBvZiB0aGUgSlNPTiBkYXRhLgorICAgICAqCisgICAgICogQHBhcmFtIDxUPiB0aGUgdHlwZSBvZiB0aGUgSmF2YSBjb250ZW50IHRyZWUuCisgICAgICogQHBhcmFtIGlzIHRoZSBJbnB1dFN0cmVhbSB0byB1bm1hcnNoYWwgSlNPTiBkYXRhIGZyb20uCisgICAgICogQHBhcmFtIGV4cGVjdGVkVHlwZSB0aGUgZXhwZWN0ZWQgdHlwZSBvZiB0aGUgSmF2YSBjb250ZW50IHRyZWUuCisgICAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCByb290IG9iamVjdCBvZiB0aGUgSmF2YSBjb250ZW50IHRyZWUuIFRoZQorICAgICAqICAgICAgICAgY29udGVudCB0cmVlIG1heSBiZSBhbiBpbnN0YW5jZSBvZiBhIGNsYXNzIHRoYXQgaXMKKyAgICAgKiAgICAgICAgIG1hcHBlZCB0byBhIFhNTCByb290IGVsZW1lbnQgKGZvciBleGFtcGxlLCBhbm5vdGF0ZWQgd2l0aAorICAgICAqICAgICAgICAge0BsaW5rIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnR9KSBvciBtYXBwZWQgdG8gYW4gWE1MIHR5cGUgKGZvciBleGFtcGxlLAorICAgICAqICAgICAgICAgYW5ub3RhdGVkIHdpdGgge0BsaW5rIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZX0pLgorICAgICAqIEB0aHJvd3MgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbiBpZiBhbnkgdW5leHBlY3RlZCBlcnJvcnMgb2NjdXIgd2hpbGUgdW5tYXJzaGFsbGluZy4KKyAgICAgKiBAdGhyb3dzIGphdmF4LnhtbC5iaW5kLlVubWFyc2hhbEV4Y2VwdGlvbiBpZiB0aGUgPGNvZGU+SnNvblVubWFyc2hhbGxlcjwvY29kZT4gaXMgdW5hYmxlCisgICAgICogICAgICAgICB0byBwZXJmb3JtIHRoZSBKU09OIHRvIEphdmEgYmluZGluZy4KKyAgICAgKi8KKyAgICA8VD4gVCB1bm1hcnNoYWxGcm9tSlNPTihJbnB1dFN0cmVhbSBpcywgQ2xhc3M8VD4gZXhwZWN0ZWRUeXBlKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFVubWFyc2hhbCBKU09OIGRhdGEgZnJvbSB0aGUgc3BlY2lmaWVkIDxjb2RlPlJlYWRlcjwvY29kZT4gYW5kCisgICAgICogcmV0dXJuIHRoZSByZXN1bHRpbmcgSmF2YSBjb250ZW50IHRyZWUuCisgICAgICogPHA+CisgICAgICogVGhlIGNoYXJhY3RlciBlbmNvZGluZyBzY2hlbWUgb2YgdGhlIDxjb2RlPnJlYWRlcjwvY29kZT4gd2lsbCBiZSB1c2VkIHRvCisgICAgICogZW5jb2RlIHRoZSBjaGFyYWN0ZXJzIG9mIHRoZSBKU09OIGRhdGEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gPFQ+IHRoZSB0eXBlIG9mIHRoZSBKYXZhIGNvbnRlbnQgdHJlZS4KKyAgICAgKiBAcGFyYW0gcmVhZGVyIHRoZSBSZWFkZXIgdG8gdW5tYXJzaGFsIEpTT04gZGF0YSBmcm9tLgorICAgICAqIEBwYXJhbSBleHBlY3RlZFR5cGUgdGhlIGV4cGVjdGVkIHR5cGUgb2YgdGhlIEphdmEgY29udGVudCB0cmVlLgorICAgICAqIEByZXR1cm4gdGhlIG5ld2x5IGNyZWF0ZWQgcm9vdCBvYmplY3Qgb2YgdGhlIEphdmEgY29udGVudCB0cmVlLiBUaGUKKyAgICAgKiAgICAgICAgIGNvbnRlbnQgdHJlZSBtYXkgYmUgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcyB0aGF0IGlzCisgICAgICogICAgICAgICBtYXBwZWQgdG8gYSBYTUwgcm9vdCBlbGVtZW50IChmb3IgZXhhbXBsZSwgYW5ub3RhdGVkIHdpdGgKKyAgICAgKiAgICAgICAgIHtAbGluayBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50fSkgb3IgbWFwcGVkIHRvIGFuIFhNTCB0eXBlIChmb3IgZXhhbXBsZSwKKyAgICAgKiAgICAgICAgIGFubm90YXRlZCB3aXRoIHtAbGluayBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGV9KS4KKyAgICAgKiBAdGhyb3dzIGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb24gaWYgYW55IHVuZXhwZWN0ZWQgZXJyb3JzIG9jY3VyIHdoaWxlIHVubWFyc2hhbGxpbmcuCisgICAgICogQHRocm93cyBqYXZheC54bWwuYmluZC5Vbm1hcnNoYWxFeGNlcHRpb24gaWYgdGhlIDxjb2RlPkpzb25Vbm1hcnNoYWxsZXI8L2NvZGU+IGlzIHVuYWJsZQorICAgICAqICAgICAgICAgdG8gcGVyZm9ybSB0aGUgSlNPTiB0byBKYXZhIGJpbmRpbmcuCisgICAgICovCisgICAgPFQ+IFQgdW5tYXJzaGFsRnJvbUpTT04oUmVhZGVyIHJlYWRlciwgQ2xhc3M8VD4gZXhwZWN0ZWRUeXBlKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbjsKKworICAgIC8qKgorICAgICAqIFVubWFyc2hhbCBKU09OIGRhdGEgZnJvbSB0aGUgPGNvZGU+SW5wdXRTdHJlYW08L2NvZGU+IGJ5CisgICAgICogPGNvZGU+ZGVjbGFyZWRUeXBlPC9jb2RlPiBhbmQgcmV0dXJuIHRoZSByZXN1bHRpbmcgY29udGVudCB0cmVlLgorICAgICAqIDxwPgorICAgICAqIFRoZSBVVEYtOCBjaGFyYWN0ZXIgZW5jb2Rpbmcgc2NoZW1lIHdpbGwgYmUgdXNlZCB0byBkZWNvZGUgdGhlIGVuY29kZWQKKyAgICAgKiBjaGFyYWN0ZXJzIG9mIHRoZSBKU09OIGRhdGEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gPFQ+IHRoZSB0eXBlIG9mIHRoZSBKYXZhIGNvbnRlbnQgdHJlZS4KKyAgICAgKiBAcGFyYW0gaXMgdGhlIElucHV0U3RyZWFtIHRvIHVubWFyc2hhbCBKU09OIGRhdGEgZnJvbS4KKyAgICAgKiBAcGFyYW0gZGVjbGFyZWRUeXBlIGEgY2xhc3MgdGhhdCBpcyBtYXBwZWQgdG8gYSBYTUwgcm9vdCBlbGVtZW50CisgICAgICogICAgICAgIChmb3IgZXhhbXBsZSwgYW5ub3RhdGVkIHdpdGgge0BsaW5rIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnR9KSBvciBtYXBwZWQgdG8KKyAgICAgKiAgICAgICAgYW4gWE1MIHR5cGUgKGZvciBleGFtcGxlLCBhbm5vdGF0ZWQgd2l0aCB7QGxpbmsgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlfSkuCisgICAgICogQHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCByb290IG9iamVjdCBvZiB0aGUgSmF2YSBjb250ZW50IHRyZWUsIHJvb3QKKyAgICAgKiAgICAgICAgIGJ5IGEge0BsaW5rIGphdmF4LnhtbC5iaW5kLkpBWEJFbGVtZW50fSBpbnN0YW5jZS4KKyAgICAgKiBAdGhyb3dzIGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb24gaWYgYW55IHVuZXhwZWN0ZWQgZXJyb3JzIG9jY3VyIHdoaWxlIHVubWFyc2hhbGxpbmcuCisgICAgICogQHRocm93cyBqYXZheC54bWwuYmluZC5Vbm1hcnNoYWxFeGNlcHRpb24gaWYgdGhlIDxjb2RlPkpzb25Vbm1hcnNoYWxsZXI8L2NvZGU+IGlzIHVuYWJsZQorICAgICAqICAgICAgICAgdG8gcGVyZm9ybSB0aGUgSlNPTiB0byBKYXZhIGJpbmRpbmcuCisgICAgICovCisgICAgPFQ+IEpBWEJFbGVtZW50PFQ+IHVubWFyc2hhbEpBWEJFbGVtZW50RnJvbUpTT04oSW5wdXRTdHJlYW0gaXMsIENsYXNzPFQ+IGRlY2xhcmVkVHlwZSkgdGhyb3dzIEpBWEJFeGNlcHRpb247CisKKyAgICAvKioKKyAgICAgKiBVbm1hcnNoYWwgSlNPTiBkYXRhIGZyb20gdGhlIDxjb2RlPlJlYWRlcjwvY29kZT4gYnkKKyAgICAgKiA8Y29kZT5kZWNsYXJlZFR5cGU8L2NvZGU+IGFuZCByZXR1cm4gdGhlIHJlc3VsdGluZyBjb250ZW50IHRyZWUuCisgICAgICogPHA+CisgICAgICogVGhlIGNoYXJhY3RlciBlbmNvZGluZyBzY2hlbWUgb2YgdGhlIDxjb2RlPnJlYWRlcjwvY29kZT4gd2lsbCBiZSB1c2VkIHRvCisgICAgICogZW5jb2RlIHRoZSBjaGFyYWN0ZXJzIG9mIHRoZSBKU09OIGRhdGEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gPFQ+IHRoZSB0eXBlIG9mIHRoZSBKYXZhIGNvbnRlbnQgdHJlZS4KKyAgICAgKiBAcGFyYW0gcmVhZGVyIHRoZSBSZWFkZXIgdG8gdW5tYXJzaGFsIEpTT04gZGF0YSBmcm9tLgorICAgICAqIEBwYXJhbSBkZWNsYXJlZFR5cGUgYSBjbGFzcyB0aGF0IGlzIG1hcHBlZCB0byBhIFhNTCByb290IGVsZW1lbnQKKyAgICAgKiAgICAgICAgKGZvciBleGFtcGxlLCBhbm5vdGF0ZWQgd2l0aCB7QGxpbmsgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudH0pIG9yIG1hcHBlZCB0bworICAgICAqICAgICAgICBhbiBYTUwgdHlwZSAoZm9yIGV4YW1wbGUsIGFubm90YXRlZCB3aXRoIHtAbGluayBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGV9KS4KKyAgICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIHJvb3Qgb2JqZWN0IG9mIHRoZSBKYXZhIGNvbnRlbnQgdHJlZSwgcm9vdAorICAgICAqICAgICAgICAgYnkgYSB7QGxpbmsgamF2YXgueG1sLmJpbmQuSkFYQkVsZW1lbnR9IGluc3RhbmNlLgorICAgICAqIEB0aHJvd3MgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbiBpZiBhbnkgdW5leHBlY3RlZCBlcnJvcnMgb2NjdXIgd2hpbGUgdW5tYXJzaGFsbGluZy4KKyAgICAgKiBAdGhyb3dzIGphdmF4LnhtbC5iaW5kLlVubWFyc2hhbEV4Y2VwdGlvbiBpZiB0aGUgPGNvZGU+SnNvblVubWFyc2hhbGxlcjwvY29kZT4gaXMgdW5hYmxlCisgICAgICogICAgICAgICB0byBwZXJmb3JtIHRoZSBKU09OIHRvIEphdmEgYmluZGluZy4KKyAgICAgKi8KKyAgICA8VD4gSkFYQkVsZW1lbnQ8VD4gdW5tYXJzaGFsSkFYQkVsZW1lbnRGcm9tSlNPTihSZWFkZXIgcmVhZGVyLCBDbGFzczxUPiBkZWNsYXJlZFR5cGUpIHRocm93cyBKQVhCRXhjZXB0aW9uOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvanNvbi1qZXR0aXNvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHRpc29uL2ludGVybmFsL0Jhc2VKc29uTWFyc2hhbGxlci5qYXZhIGIvbWVkaWEvanNvbi1qZXR0aXNvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHRpc29uL2ludGVybmFsL0Jhc2VKc29uTWFyc2hhbGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNTRkOGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qc29uLWpldHRpc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamV0dGlzb24vaW50ZXJuYWwvQmFzZUpzb25NYXJzaGFsbGVyLmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0aXNvbi5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5NYXJzaGFsbGVyOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLlByb3BlcnR5RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dGlzb24uSmV0dGlzb25Db25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dGlzb24uSmV0dGlzb25Db25maWd1cmVkOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHRpc29uLkpldHRpc29uTWFyc2hhbGxlcjsKKworLyoqCisgKiBCYXNlIEpTT04gbWFyc2hhbGxlciBpbXBsZW1lbnRhdGlvbiBjbGFzcy4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBCYXNlSnNvbk1hcnNoYWxsZXIgaW1wbGVtZW50cyBKZXR0aXNvbk1hcnNoYWxsZXIsIEpldHRpc29uQ29uZmlndXJlZCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDaGFyc2V0IFVURjggPSBDaGFyc2V0LmZvck5hbWUoIlVURi04Iik7CisKKyAgICBwcm90ZWN0ZWQgZmluYWwgTWFyc2hhbGxlciBqYXhiTWFyc2hhbGxlcjsKKyAgICBwcm90ZWN0ZWQgSmV0dGlzb25Db25maWcganNvbkNvbmZpZzsKKworICAgIHB1YmxpYyBCYXNlSnNvbk1hcnNoYWxsZXIoSkFYQkNvbnRleHQgamF4YkNvbnRleHQsIEpldHRpc29uQ29uZmlnIGpzb25Db25maWcpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcyhqYXhiQ29udGV4dC5jcmVhdGVNYXJzaGFsbGVyKCksIGpzb25Db25maWcpOworICAgIH0KKworICAgIHB1YmxpYyBCYXNlSnNvbk1hcnNoYWxsZXIoTWFyc2hhbGxlciBqYXhiTWFyc2hhbGxlciwgSmV0dGlzb25Db25maWcganNvbkNvbmZpZykgeworICAgICAgICB0aGlzLmpzb25Db25maWcgPSBqc29uQ29uZmlnOworICAgICAgICB0aGlzLmpheGJNYXJzaGFsbGVyID0gamF4Yk1hcnNoYWxsZXI7CisgICAgfQorCisgICAgLy8gSlNPTkNvbmZpZ3VyYXRlZAorCisgICAgcHVibGljIEpldHRpc29uQ29uZmlnIGdldEpTT05Db25maWd1cmF0aW9uKCkgeworICAgICAgICByZXR1cm4ganNvbkNvbmZpZzsKKyAgICB9CisKKyAgICAvLyBKU09OTWFyc2hhbGxlcgorCisgICAgcHVibGljIHZvaWQgbWFyc2hhbGxUb0pTT04oT2JqZWN0IG8sIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG91dHB1dFN0cmVhbSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgb3V0cHV0IHN0cmVhbSBpcyBudWxsIik7CisgICAgICAgIH0KKworICAgICAgICBtYXJzaGFsbFRvSlNPTihvLCBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG91dHB1dFN0cmVhbSwgVVRGOCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIG1hcnNoYWxsVG9KU09OKE9iamVjdCBvLCBXcml0ZXIgd3JpdGVyKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChvID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBKQVhCIGVsZW1lbnQgaXMgbnVsbCIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHdyaXRlciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgd3JpdGVyIGlzIG51bGwiKTsKKyAgICAgICAgfQorCisgICAgICAgIGpheGJNYXJzaGFsbGVyLm1hcnNoYWwobywgZ2V0WE1MU3RyZWFtV3JpdGVyKHdyaXRlcikpOworICAgIH0KKworICAgIHByaXZhdGUgWE1MU3RyZWFtV3JpdGVyIGdldFhNTFN0cmVhbVdyaXRlcihXcml0ZXIgd3JpdGVyKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gU3RheDJKZXR0aXNvbkZhY3RvcnkuY3JlYXRlV3JpdGVyKHdyaXRlciwganNvbkNvbmZpZyk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSkFYQkV4Y2VwdGlvbihleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShTdHJpbmcga2V5LCBPYmplY3QgdmFsdWUpIHRocm93cyBQcm9wZXJ0eUV4Y2VwdGlvbiB7CisgICAgICAgIC8vIGRvIG5vdGhpbmcKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9qc29uLWpldHRpc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamV0dGlzb24vaW50ZXJuYWwvQmFzZUpzb25Vbm1hcnNoYWxsZXIuamF2YSBiL21lZGlhL2pzb24tamV0dGlzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0aXNvbi9pbnRlcm5hbC9CYXNlSnNvblVubWFyc2hhbGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyOWI4N2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qc29uLWpldHRpc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamV0dGlzb24vaW50ZXJuYWwvQmFzZUpzb25Vbm1hcnNoYWxsZXIuamF2YQpAQCAtMCwwICsxLDkyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHRpc29uLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLmJpbmQuVW5tYXJzaGFsRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLlVubWFyc2hhbGxlcjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtUmVhZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dGlzb24uSmV0dGlzb25Db25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dGlzb24uSmV0dGlzb25Db25maWd1cmVkOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHRpc29uLkpldHRpc29uVW5tYXJzaGFsbGVyOworCisvKioKKyAqIEJhc2UgSlNPTiBtYXJzaGFsbGVyIGltcGxlbWVudGF0aW9uIGNsYXNzLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBCYXNlSnNvblVubWFyc2hhbGxlciBpbXBsZW1lbnRzIEpldHRpc29uVW5tYXJzaGFsbGVyLCBKZXR0aXNvbkNvbmZpZ3VyZWQgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2hhcnNldCBVVEY4ID0gQ2hhcnNldC5mb3JOYW1lKCJVVEYtOCIpOworCisgICAgcHJvdGVjdGVkIGZpbmFsIFVubWFyc2hhbGxlciBqYXhiVW5tYXJzaGFsbGVyOworICAgIHByb3RlY3RlZCBmaW5hbCBKZXR0aXNvbkNvbmZpZyBqc29uQ29uZmlnOworCisgICAgcHVibGljIEJhc2VKc29uVW5tYXJzaGFsbGVyKEpBWEJDb250ZXh0IGpheGJDb250ZXh0LCBKZXR0aXNvbkNvbmZpZyBqc29uQ29uZmlnKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMoamF4YkNvbnRleHQuY3JlYXRlVW5tYXJzaGFsbGVyKCksIGpzb25Db25maWcpOworICAgIH0KKworICAgIHB1YmxpYyBCYXNlSnNvblVubWFyc2hhbGxlcihVbm1hcnNoYWxsZXIgamF4YlVubWFyc2hhbGxlciwgSmV0dGlzb25Db25maWcganNvbkNvbmZpZykgeworICAgICAgICB0aGlzLmpheGJVbm1hcnNoYWxsZXIgPSBqYXhiVW5tYXJzaGFsbGVyOworICAgICAgICB0aGlzLmpzb25Db25maWcgPSBqc29uQ29uZmlnOworICAgIH0KKworICAgIC8vIEpzb25Db25maWd1cmVkCisgICAgcHVibGljIEpldHRpc29uQ29uZmlnIGdldEpTT05Db25maWd1cmF0aW9uKCkgeworICAgICAgICByZXR1cm4ganNvbkNvbmZpZzsKKyAgICB9CisKKyAgICAvLyBKc29uVW5tYXJzaGFsbGVyCisgICAgcHVibGljIDxUPiBUIHVubWFyc2hhbEZyb21KU09OKElucHV0U3RyZWFtIGlucHV0U3RyZWFtLCBDbGFzczxUPiBleHBlY3RlZFR5cGUpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHVubWFyc2hhbEZyb21KU09OKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbnB1dFN0cmVhbSwgVVRGOCksIGV4cGVjdGVkVHlwZSk7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIDxUPiBUIHVubWFyc2hhbEZyb21KU09OKFJlYWRlciByZWFkZXIsIENsYXNzPFQ+IGV4cGVjdGVkVHlwZSkgdGhyb3dzIEpBWEJFeGNlcHRpb24geworICAgICAgICBpZiAoIWV4cGVjdGVkVHlwZS5pc0Fubm90YXRpb25QcmVzZW50KFhtbFJvb3RFbGVtZW50LmNsYXNzKSkgeworICAgICAgICAgICAgcmV0dXJuIHVubWFyc2hhbEpBWEJFbGVtZW50RnJvbUpTT04ocmVhZGVyLCBleHBlY3RlZFR5cGUpLmdldFZhbHVlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gKFQpIGpheGJVbm1hcnNoYWxsZXIudW5tYXJzaGFsKGNyZWF0ZVhtbFN0cmVhbVJlYWRlcihyZWFkZXIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyA8VD4gSkFYQkVsZW1lbnQ8VD4gdW5tYXJzaGFsSkFYQkVsZW1lbnRGcm9tSlNPTihJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwgQ2xhc3M8VD4gZGVjbGFyZWRUeXBlKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiB1bm1hcnNoYWxKQVhCRWxlbWVudEZyb21KU09OKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihpbnB1dFN0cmVhbSwgVVRGOCksIGRlY2xhcmVkVHlwZSk7CisgICAgfQorCisgICAgcHVibGljIDxUPiBKQVhCRWxlbWVudDxUPiB1bm1hcnNoYWxKQVhCRWxlbWVudEZyb21KU09OKFJlYWRlciByZWFkZXIsIENsYXNzPFQ+IGRlY2xhcmVkVHlwZSkgdGhyb3dzIEpBWEJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gamF4YlVubWFyc2hhbGxlci51bm1hcnNoYWwoY3JlYXRlWG1sU3RyZWFtUmVhZGVyKHJlYWRlciksIGRlY2xhcmVkVHlwZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBYTUxTdHJlYW1SZWFkZXIgY3JlYXRlWG1sU3RyZWFtUmVhZGVyKFJlYWRlciByZWFkZXIpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBTdGF4MkpldHRpc29uRmFjdG9yeS5jcmVhdGVSZWFkZXIocmVhZGVyLCBqc29uQ29uZmlnKTsKKyAgICAgICAgfSBjYXRjaCAoWE1MU3RyZWFtRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5tYXJzaGFsRXhjZXB0aW9uKCJFcnJvciBjcmVhdGluZyBKU09OLWJhc2VkIFhNTFN0cmVhbVJlYWRlciIsIGV4KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2pzb24tamV0dGlzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0aXNvbi9pbnRlcm5hbC9KZXR0aXNvbkpheGJNYXJzaGFsbGVyLmphdmEgYi9tZWRpYS9qc29uLWpldHRpc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamV0dGlzb24vaW50ZXJuYWwvSmV0dGlzb25KYXhiTWFyc2hhbGxlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzYWNiYmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qc29uLWpldHRpc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamV0dGlzb24vaW50ZXJuYWwvSmV0dGlzb25KYXhiTWFyc2hhbGxlci5qYXZhCkBAIC0wLDAgKzEsMTc0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHRpc29uLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5NYXJzaGFsbGVyOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLlByb3BlcnR5RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLlZhbGlkYXRpb25FdmVudEhhbmRsZXI7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5hZGFwdGVycy5YbWxBZGFwdGVyOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmF0dGFjaG1lbnQuQXR0YWNobWVudE1hcnNoYWxsZXI7CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxFdmVudFdyaXRlcjsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlJlc3VsdDsKK2ltcG9ydCBqYXZheC54bWwudmFsaWRhdGlvbi5TY2hlbWE7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0aXNvbi5KZXR0aXNvbkNvbmZpZzsKKworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CitpbXBvcnQgb3JnLnhtbC5zYXguQ29udGVudEhhbmRsZXI7CisKKy8qKgorICogSlNPTiBKQVhCIG1hcnNoYWxsZXIuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEpldHRpc29uSmF4Yk1hcnNoYWxsZXIgZXh0ZW5kcyBCYXNlSnNvbk1hcnNoYWxsZXIgaW1wbGVtZW50cyBNYXJzaGFsbGVyIHsKKworICAgIHB1YmxpYyBKZXR0aXNvbkpheGJNYXJzaGFsbGVyKEpBWEJDb250ZXh0IGpheGJDb250ZXh0LCBKZXR0aXNvbkNvbmZpZyBqc29uQ29uZmlnKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyKGpheGJDb250ZXh0LCBqc29uQ29uZmlnKTsKKyAgICB9CisKKyAgICAvLyBNYXJzaGFsbGVyCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgbWFyc2hhbChPYmplY3QgamF4Yk9iamVjdCwgUmVzdWx0IHJlc3VsdCkgdGhyb3dzIEpBWEJFeGNlcHRpb24geworICAgICAgICBqYXhiTWFyc2hhbGxlci5tYXJzaGFsKGpheGJPYmplY3QsIHJlc3VsdCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgbWFyc2hhbChPYmplY3QgamF4Yk9iamVjdCwgT3V0cHV0U3RyZWFtIG9zKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgIGpheGJNYXJzaGFsbGVyLm1hcnNoYWwoamF4Yk9iamVjdCwgb3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG1hcnNoYWwoT2JqZWN0IGpheGJPYmplY3QsIEZpbGUgZmlsZSkgdGhyb3dzIEpBWEJFeGNlcHRpb24geworICAgICAgICBqYXhiTWFyc2hhbGxlci5tYXJzaGFsKGpheGJPYmplY3QsIGZpbGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG1hcnNoYWwoT2JqZWN0IGpheGJPYmplY3QsIFdyaXRlciB3cml0ZXIpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKKyAgICAgICAgamF4Yk1hcnNoYWxsZXIubWFyc2hhbChqYXhiT2JqZWN0LCB3cml0ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG1hcnNoYWwoT2JqZWN0IGpheGJPYmplY3QsIENvbnRlbnRIYW5kbGVyIGhhbmRsZXIpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKKyAgICAgICAgamF4Yk1hcnNoYWxsZXIubWFyc2hhbChqYXhiT2JqZWN0LCBoYW5kbGVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBtYXJzaGFsKE9iamVjdCBqYXhiT2JqZWN0LCBOb2RlIG5vZGUpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKKyAgICAgICAgamF4Yk1hcnNoYWxsZXIubWFyc2hhbChqYXhiT2JqZWN0LCBub2RlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBtYXJzaGFsKE9iamVjdCBqYXhiT2JqZWN0LCBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgIGpheGJNYXJzaGFsbGVyLm1hcnNoYWwoamF4Yk9iamVjdCwgd3JpdGVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBtYXJzaGFsKE9iamVjdCBqYXhiT2JqZWN0LCBYTUxFdmVudFdyaXRlciB3cml0ZXIpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKKyAgICAgICAgamF4Yk1hcnNoYWxsZXIubWFyc2hhbChqYXhiT2JqZWN0LCB3cml0ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBOb2RlIGdldE5vZGUoT2JqZWN0IGpheGJPYmplY3QpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGpheGJNYXJzaGFsbGVyLmdldE5vZGUoamF4Yk9iamVjdCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgdGhyb3dzIFByb3BlcnR5RXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTmFtZSBjYW4ndCBiZSBudWxsLiIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG5hbWUuZXF1YWxzKG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHRpc29uLkpldHRpc29uTWFyc2hhbGxlci5GT1JNQVRURUQpKSB7CisgICAgICAgICAgICBpZiAoISh2YWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4pKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb3BlcnR5RXhjZXB0aW9uKCJwcm9wZXJ0eSAiICsgbmFtZSArICIgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiB0eXBlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgImJvb2xlYW4sIG5vdCAiICsgdmFsdWUuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBqc29uQ29uZmlnID0gSmV0dGlzb25Db25maWcuY3JlYXRlSlNPTkNvbmZpZ3VyYXRpb24oanNvbkNvbmZpZyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBqYXhiTWFyc2hhbGxlci5zZXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IGdldFByb3BlcnR5KFN0cmluZyBrZXkpIHRocm93cyBQcm9wZXJ0eUV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBqYXhiTWFyc2hhbGxlci5nZXRQcm9wZXJ0eShrZXkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEV2ZW50SGFuZGxlcihWYWxpZGF0aW9uRXZlbnRIYW5kbGVyIGhhbmRsZXIpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKKyAgICAgICAgamF4Yk1hcnNoYWxsZXIuc2V0RXZlbnRIYW5kbGVyKGhhbmRsZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBWYWxpZGF0aW9uRXZlbnRIYW5kbGVyIGdldEV2ZW50SGFuZGxlcigpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGpheGJNYXJzaGFsbGVyLmdldEV2ZW50SGFuZGxlcigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEFkYXB0ZXIoWG1sQWRhcHRlciBhZGFwdGVyKSB7CisgICAgICAgIGpheGJNYXJzaGFsbGVyLnNldEFkYXB0ZXIoYWRhcHRlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxBIGV4dGVuZHMgWG1sQWRhcHRlcj4gdm9pZCBzZXRBZGFwdGVyKENsYXNzPEE+IHR5cGUsIEEgYWRhcHRlcikgeworICAgICAgICBqYXhiTWFyc2hhbGxlci5zZXRBZGFwdGVyKHR5cGUsIGFkYXB0ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8QSBleHRlbmRzIFhtbEFkYXB0ZXI+IEEgZ2V0QWRhcHRlcihDbGFzczxBPiB0eXBlKSB7CisgICAgICAgIHJldHVybiBqYXhiTWFyc2hhbGxlci5nZXRBZGFwdGVyKHR5cGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEF0dGFjaG1lbnRNYXJzaGFsbGVyKEF0dGFjaG1lbnRNYXJzaGFsbGVyIG1hcnNoYWxsZXIpIHsKKyAgICAgICAgamF4Yk1hcnNoYWxsZXIuc2V0QXR0YWNobWVudE1hcnNoYWxsZXIobWFyc2hhbGxlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEF0dGFjaG1lbnRNYXJzaGFsbGVyIGdldEF0dGFjaG1lbnRNYXJzaGFsbGVyKCkgeworICAgICAgICByZXR1cm4gamF4Yk1hcnNoYWxsZXIuZ2V0QXR0YWNobWVudE1hcnNoYWxsZXIoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRTY2hlbWEoU2NoZW1hIHNjaGVtYSkgeworICAgICAgICBqYXhiTWFyc2hhbGxlci5zZXRTY2hlbWEoc2NoZW1hKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2NoZW1hIGdldFNjaGVtYSgpIHsKKyAgICAgICAgcmV0dXJuIGpheGJNYXJzaGFsbGVyLmdldFNjaGVtYSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldExpc3RlbmVyKExpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIGpheGJNYXJzaGFsbGVyLnNldExpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdGVuZXIgZ2V0TGlzdGVuZXIoKSB7CisgICAgICAgIHJldHVybiBqYXhiTWFyc2hhbGxlci5nZXRMaXN0ZW5lcigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2pzb24tamV0dGlzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0aXNvbi9pbnRlcm5hbC9KZXR0aXNvbkpheGJVbm1hcnNoYWxsZXIuamF2YSBiL21lZGlhL2pzb24tamV0dGlzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0aXNvbi9pbnRlcm5hbC9KZXR0aXNvbkpheGJVbm1hcnNoYWxsZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzY0YTBlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvanNvbi1qZXR0aXNvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHRpc29uL2ludGVybmFsL0pldHRpc29uSmF4YlVubWFyc2hhbGxlci5qYXZhCkBAIC0wLDAgKzEsMTk5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHRpc29uLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5uZXQuVVJMOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5Qcm9wZXJ0eUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5Vbm1hcnNoYWxsZXI7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuVW5tYXJzaGFsbGVySGFuZGxlcjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5WYWxpZGF0aW9uRXZlbnRIYW5kbGVyOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uYWRhcHRlcnMuWG1sQWRhcHRlcjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hdHRhY2htZW50LkF0dGFjaG1lbnRVbm1hcnNoYWxsZXI7CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxFdmVudFJlYWRlcjsKK2ltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudmFsaWRhdGlvbi5TY2hlbWE7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0aXNvbi5KZXR0aXNvbkNvbmZpZzsKKworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CitpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CisKKy8qKgorICogSlNPTiBKQVhCIHVubWFyc2hhbGxlci4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSmV0dGlzb25KYXhiVW5tYXJzaGFsbGVyIGV4dGVuZHMgQmFzZUpzb25Vbm1hcnNoYWxsZXIgaW1wbGVtZW50cyBVbm1hcnNoYWxsZXIgeworCisgICAgcHVibGljIEpldHRpc29uSmF4YlVubWFyc2hhbGxlcihKQVhCQ29udGV4dCBqYXhiQ29udGV4dCwgSmV0dGlzb25Db25maWcganNvbkNvbmZpZykgdGhyb3dzIEpBWEJFeGNlcHRpb24geworICAgICAgICBzdXBlcihqYXhiQ29udGV4dCwganNvbkNvbmZpZyk7CisgICAgfQorCisgICAgLy8gVW5tYXJzaGFsbGVyCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdCB1bm1hcnNoYWwoRmlsZSBmaWxlKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiB0aGlzLmpheGJVbm1hcnNoYWxsZXIudW5tYXJzaGFsKGZpbGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgdW5tYXJzaGFsKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiB0aGlzLmpheGJVbm1hcnNoYWxsZXIudW5tYXJzaGFsKGlucHV0U3RyZWFtKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IHVubWFyc2hhbChSZWFkZXIgcmVhZGVyKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiB0aGlzLmpheGJVbm1hcnNoYWxsZXIudW5tYXJzaGFsKHJlYWRlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdCB1bm1hcnNoYWwoVVJMIHVybCkgdGhyb3dzIEpBWEJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gdGhpcy5qYXhiVW5tYXJzaGFsbGVyLnVubWFyc2hhbCh1cmwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgdW5tYXJzaGFsKElucHV0U291cmNlIGlucHV0U291cmNlKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiB0aGlzLmpheGJVbm1hcnNoYWxsZXIudW5tYXJzaGFsKGlucHV0U291cmNlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IHVubWFyc2hhbChOb2RlIG5vZGUpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuamF4YlVubWFyc2hhbGxlci51bm1hcnNoYWwobm9kZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxUPiBKQVhCRWxlbWVudDxUPiB1bm1hcnNoYWwoTm9kZSBub2RlLCBDbGFzczxUPiB0eXBlKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiB0aGlzLmpheGJVbm1hcnNoYWxsZXIudW5tYXJzaGFsKG5vZGUsIHR5cGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgdW5tYXJzaGFsKFNvdXJjZSBzb3VyY2UpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuamF4YlVubWFyc2hhbGxlci51bm1hcnNoYWwoc291cmNlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPFQ+IEpBWEJFbGVtZW50PFQ+IHVubWFyc2hhbChTb3VyY2Ugc291cmNlLCBDbGFzczxUPiB0eXBlKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiB0aGlzLmpheGJVbm1hcnNoYWxsZXIudW5tYXJzaGFsKHNvdXJjZSwgdHlwZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdCB1bm1hcnNoYWwoWE1MU3RyZWFtUmVhZGVyIHhtbFN0cmVhbVJlYWRlcikgdGhyb3dzIEpBWEJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gdGhpcy5qYXhiVW5tYXJzaGFsbGVyLnVubWFyc2hhbCh4bWxTdHJlYW1SZWFkZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gSkFYQkVsZW1lbnQ8VD4gdW5tYXJzaGFsKFhNTFN0cmVhbVJlYWRlciB4bWxTdHJlYW1SZWFkZXIsIENsYXNzPFQ+IHR5cGUpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuamF4YlVubWFyc2hhbGxlci51bm1hcnNoYWwoeG1sU3RyZWFtUmVhZGVyLCB0eXBlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IHVubWFyc2hhbChYTUxFdmVudFJlYWRlciB4bWxFdmVudFJlYWRlcikgdGhyb3dzIEpBWEJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gdGhpcy5qYXhiVW5tYXJzaGFsbGVyLnVubWFyc2hhbCh4bWxFdmVudFJlYWRlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxUPiBKQVhCRWxlbWVudDxUPiB1bm1hcnNoYWwoWE1MRXZlbnRSZWFkZXIgeG1sRXZlbnRSZWFkZXIsIENsYXNzPFQ+IHR5cGUpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuamF4YlVubWFyc2hhbGxlci51bm1hcnNoYWwoeG1sRXZlbnRSZWFkZXIsIHR5cGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBVbm1hcnNoYWxsZXJIYW5kbGVyIGdldFVubWFyc2hhbGxlckhhbmRsZXIoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmpheGJVbm1hcnNoYWxsZXIuZ2V0VW5tYXJzaGFsbGVySGFuZGxlcigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRpbmcoYm9vbGVhbiB2YWxpZGF0aW5nKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMuamF4YlVubWFyc2hhbGxlci5zZXRWYWxpZGF0aW5nKHZhbGlkYXRpbmcpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWRhdGluZygpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuamF4YlVubWFyc2hhbGxlci5pc1ZhbGlkYXRpbmcoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRFdmVudEhhbmRsZXIoVmFsaWRhdGlvbkV2ZW50SGFuZGxlciB2YWxpZGF0aW9uRXZlbnRIYW5kbGVyKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMuamF4YlVubWFyc2hhbGxlci5zZXRFdmVudEhhbmRsZXIodmFsaWRhdGlvbkV2ZW50SGFuZGxlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFZhbGlkYXRpb25FdmVudEhhbmRsZXIgZ2V0RXZlbnRIYW5kbGVyKCkgdGhyb3dzIEpBWEJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gdGhpcy5qYXhiVW5tYXJzaGFsbGVyLmdldEV2ZW50SGFuZGxlcigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KFN0cmluZyBrZXksIE9iamVjdCB2YWx1ZSkgdGhyb3dzIFByb3BlcnR5RXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcy5qYXhiVW5tYXJzaGFsbGVyLnNldFByb3BlcnR5KGtleSwgdmFsdWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgZ2V0UHJvcGVydHkoU3RyaW5nIGtleSkgdGhyb3dzIFByb3BlcnR5RXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuamF4YlVubWFyc2hhbGxlci5nZXRQcm9wZXJ0eShrZXkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFNjaGVtYShTY2hlbWEgc2NoZW1hKSB7CisgICAgICAgIHRoaXMuamF4YlVubWFyc2hhbGxlci5zZXRTY2hlbWEoc2NoZW1hKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2NoZW1hIGdldFNjaGVtYSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuamF4YlVubWFyc2hhbGxlci5nZXRTY2hlbWEoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRBZGFwdGVyKFhtbEFkYXB0ZXIgeG1sQWRhcHRlcikgeworICAgICAgICB0aGlzLmpheGJVbm1hcnNoYWxsZXIuc2V0QWRhcHRlcih4bWxBZGFwdGVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgPEEgZXh0ZW5kcyBYbWxBZGFwdGVyPiB2b2lkIHNldEFkYXB0ZXIoQ2xhc3M8QT4gdHlwZSwgQSBhZGFwdGVyKSB7CisgICAgICAgIHRoaXMuamF4YlVubWFyc2hhbGxlci5zZXRBZGFwdGVyKHR5cGUsIGFkYXB0ZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8QSBleHRlbmRzIFhtbEFkYXB0ZXI+IEEgZ2V0QWRhcHRlcihDbGFzczxBPiB0eXBlKSB7CisgICAgICAgIHJldHVybiB0aGlzLmpheGJVbm1hcnNoYWxsZXIuZ2V0QWRhcHRlcih0eXBlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRBdHRhY2htZW50VW5tYXJzaGFsbGVyKEF0dGFjaG1lbnRVbm1hcnNoYWxsZXIgYXR0YWNobWVudFVubWFyc2hhbGxlcikgeworICAgICAgICB0aGlzLmpheGJVbm1hcnNoYWxsZXIuc2V0QXR0YWNobWVudFVubWFyc2hhbGxlcihhdHRhY2htZW50VW5tYXJzaGFsbGVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQXR0YWNobWVudFVubWFyc2hhbGxlciBnZXRBdHRhY2htZW50VW5tYXJzaGFsbGVyKCkgeworICAgICAgICByZXR1cm4gdGhpcy5qYXhiVW5tYXJzaGFsbGVyLmdldEF0dGFjaG1lbnRVbm1hcnNoYWxsZXIoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRMaXN0ZW5lcihMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICB0aGlzLmpheGJVbm1hcnNoYWxsZXIuc2V0TGlzdGVuZXIobGlzdGVuZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBMaXN0ZW5lciBnZXRMaXN0ZW5lcigpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuamF4YlVubWFyc2hhbGxlci5nZXRMaXN0ZW5lcigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2pzb24tamV0dGlzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0aXNvbi9pbnRlcm5hbC9TdGF4MkpldHRpc29uRmFjdG9yeS5qYXZhIGIvbWVkaWEvanNvbi1qZXR0aXNvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHRpc29uL2ludGVybmFsL1N0YXgySmV0dGlzb25GYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQyNDVlOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2pzb24tamV0dGlzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0aXNvbi9pbnRlcm5hbC9TdGF4MkpldHRpc29uRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHRpc29uLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEuaW8uV3JpdGVyOworCitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0aXNvbi5KZXR0aXNvbkNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLlJlYWRlcldyaXRlcjsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5qZXR0aXNvbi5iYWRnZXJmaXNoLkJhZGdlckZpc2hYTUxTdHJlYW1SZWFkZXI7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmpldHRpc29uLmJhZGdlcmZpc2guQmFkZ2VyRmlzaFhNTFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuamV0dGlzb24uanNvbi5KU09OT2JqZWN0OworaW1wb3J0IG9yZy5jb2RlaGF1cy5qZXR0aXNvbi5qc29uLkpTT05Ub2tlbmVyOworaW1wb3J0IG9yZy5jb2RlaGF1cy5qZXR0aXNvbi5tYXBwZWQuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcuY29kZWhhdXMuamV0dGlzb24ubWFwcGVkLk1hcHBlZE5hbWVzcGFjZUNvbnZlbnRpb247CitpbXBvcnQgb3JnLmNvZGVoYXVzLmpldHRpc29uLm1hcHBlZC5NYXBwZWRYTUxTdHJlYW1SZWFkZXI7CitpbXBvcnQgb3JnLmNvZGVoYXVzLmpldHRpc29uLm1hcHBlZC5NYXBwZWRYTUxTdHJlYW1Xcml0ZXI7CisKKy8qKgorICogRmFjdG9yeSBmb3IgY3JlYXRpbmcgSlNPTi1lbmFibGVkIFN0QVggcmVhZGVycyBhbmQgd3JpdGVycy4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBTdGF4MkpldHRpc29uRmFjdG9yeSB7CisKKyAgICBwcml2YXRlIFN0YXgySmV0dGlzb25GYWN0b3J5KCkgeworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgWE1MU3RyZWFtV3JpdGVyIGNyZWF0ZVdyaXRlcihmaW5hbCBXcml0ZXIgd3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBKZXR0aXNvbkNvbmZpZyBjb25maWcpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHN3aXRjaCAoY29uZmlnLmdldE5vdGF0aW9uKCkpIHsKKyAgICAgICAgICAgIGNhc2UgQkFER0VSRklTSDoKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJhZGdlckZpc2hYTUxTdHJlYW1Xcml0ZXIod3JpdGVyKTsKKyAgICAgICAgICAgIGNhc2UgTUFQUEVEX0pFVFRJU09OOgorICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24gam1Db25maWc7CisgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gY29uZmlnLmdldFhtbDJKc29uTnMoKSkgeworICAgICAgICAgICAgICAgICAgICBqbUNvbmZpZyA9IG5ldyBDb25maWd1cmF0aW9uKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgam1Db25maWcgPSBuZXcgQ29uZmlndXJhdGlvbihjb25maWcuZ2V0WG1sMkpzb25OcygpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmaW5hbCBNYXBwZWRYTUxTdHJlYW1Xcml0ZXIgcmVzdWx0ID0gbmV3IE1hcHBlZFhNTFN0cmVhbVdyaXRlcihuZXcgTWFwcGVkTmFtZXNwYWNlQ29udmVudGlvbihqbUNvbmZpZyksIHdyaXRlcik7CisKKyAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBhcnJheSA6IGNvbmZpZy5nZXRBcnJheUVsZW1lbnRzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnNlcmlhbGl6ZUFzQXJyYXkoYXJyYXkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBYTUxTdHJlYW1SZWFkZXIgY3JlYXRlUmVhZGVyKGZpbmFsIFJlYWRlciByZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEpldHRpc29uQ29uZmlnIGNvbmZpZykgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIFJlYWRlciBub25FbXB0eVJlYWRlciA9IGVuc3VyZU5vbkVtcHR5UmVhZGVyKHJlYWRlcik7CisKKyAgICAgICAgc3dpdGNoIChjb25maWcuZ2V0Tm90YXRpb24oKSkgeworICAgICAgICAgICAgY2FzZSBNQVBQRURfSkVUVElTT046CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBqbUNvbmZpZzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG51bGwgPT0gY29uZmlnLmdldFhtbDJKc29uTnMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgam1Db25maWcgPSBuZXcgQ29uZmlndXJhdGlvbigpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgam1Db25maWcgPSBuZXcgQ29uZmlndXJhdGlvbihjb25maWcuZ2V0WG1sMkpzb25OcygpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1hcHBlZFhNTFN0cmVhbVJlYWRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSlNPTk9iamVjdChuZXcgSlNPTlRva2VuZXIoUmVhZGVyV3JpdGVyLnJlYWRGcm9tQXNTdHJpbmcobm9uRW1wdHlSZWFkZXIpKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE1hcHBlZE5hbWVzcGFjZUNvbnZlbnRpb24oam1Db25maWcpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFhNTFN0cmVhbUV4Y2VwdGlvbihleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBCQURHRVJGSVNIOgorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQmFkZ2VyRmlzaFhNTFN0cmVhbVJlYWRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgSlNPTk9iamVjdChuZXcgSlNPTlRva2VuZXIoUmVhZGVyV3JpdGVyLnJlYWRGcm9tQXNTdHJpbmcobm9uRW1wdHlSZWFkZXIpKSkpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgWE1MU3RyZWFtRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IG9jY3VyCisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gSlNPTiBjb25maWciKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBSZWFkZXIgZW5zdXJlTm9uRW1wdHlSZWFkZXIoUmVhZGVyIHJlYWRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBSZWFkZXIgbXIgPSByZWFkZXIubWFya1N1cHBvcnRlZCgpID8gcmVhZGVyIDogbmV3IEJ1ZmZlcmVkUmVhZGVyKHJlYWRlcik7CisgICAgICAgICAgICBtci5tYXJrKDEpOworICAgICAgICAgICAgaWYgKG1yLnJlYWQoKSA9PSAtMSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oIkpTT04gZXhwcmVzc2lvbiBjYW4gbm90IGJlIGVtcHR5ISIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbXIucmVzZXQoKTsKKyAgICAgICAgICAgIHJldHVybiBtcjsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBYTUxTdHJlYW1FeGNlcHRpb24oZXgpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9tZWRpYS9qc29uLWpldHRpc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamV0dGlzb24vaW50ZXJuYWwvZW50aXR5L0pldHRpc29uQXJyYXlQcm92aWRlci5qYXZhIGIvbWVkaWEvanNvbi1qZXR0aXNvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHRpc29uL2ludGVybmFsL2VudGl0eS9KZXR0aXNvbkFycmF5UHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjRmMGUzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvanNvbi1qZXR0aXNvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHRpc29uL2ludGVybmFsL2VudGl0eS9KZXR0aXNvbkFycmF5UHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0aXNvbi5pbnRlcm5hbC5lbnRpdHk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHRpc29uLmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmpldHRpc29uLmpzb24uSlNPTkFycmF5OworaW1wb3J0IG9yZy5jb2RlaGF1cy5qZXR0aXNvbi5qc29uLkpTT05FeGNlcHRpb247CisKKy8qKgorICogTG93LWxldmVsIEpTT04gbWVkaWEgdHlwZSBtZXNzYWdlIGVudGl0eSBwcm92aWRlciAocmVhZGVyICYgd3JpdGVyKSBmb3IKKyAqIHtAbGluayBKU09OQXJyYXl9LgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBKZXR0aXNvbkFycmF5UHJvdmlkZXIgZXh0ZW5kcyBKZXR0aXNvbkxvd0xldmVsUHJvdmlkZXI8SlNPTkFycmF5PiB7CisKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBBcHAgZXh0ZW5kcyBKZXR0aXNvbkFycmF5UHJvdmlkZXIgeworICAgIH0KKworICAgIEBQcm9kdWNlcygiKi8qIikKKyAgICBAQ29uc3VtZXMoIiovKiIpCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBHZW5lcmFsIGV4dGVuZHMgSmV0dGlzb25BcnJheVByb3ZpZGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNTdXBwb3J0ZWQoTWVkaWFUeXBlIG0pIHsKKyAgICAgICAgICAgIHJldHVybiBtLmdldFN1YnR5cGUoKS5lbmRzV2l0aCgiK2pzb24iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEpldHRpc29uQXJyYXlQcm92aWRlcigpIHsKKyAgICAgICAgc3VwZXIoSlNPTkFycmF5LmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgSlNPTkFycmF5IHJlYWRGcm9tKAorICAgICAgICAgICAgQ2xhc3M8SlNPTkFycmF5PiB0eXBlLAorICAgICAgICAgICAgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbnNbXSwKKyAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICBJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEpTT05BcnJheShyZWFkRnJvbUFzU3RyaW5nKGVudGl0eVN0cmVhbSwgbWVkaWFUeXBlKSk7CisgICAgICAgIH0gY2F0Y2ggKEpTT05FeGNlcHRpb24gamUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgbmV3IEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9QQVJTSU5HX0pTT05fQVJSQVkoKSwgamUpLAorICAgICAgICAgICAgICAgICAgICA0MDApOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGVUbygKKyAgICAgICAgICAgIEpTT05BcnJheSB0LAorICAgICAgICAgICAgQ2xhc3M8Pz4gdHlwZSwKKyAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb25zW10sCisgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbVdyaXRlciB3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGVudGl0eVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgZ2V0Q2hhcnNldChtZWRpYVR5cGUpKTsKKyAgICAgICAgICAgIHQud3JpdGUod3JpdGVyKTsKKyAgICAgICAgICAgIHdyaXRlci53cml0ZSgiXG4iKTsKKyAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOworICAgICAgICB9IGNhdGNoIChKU09ORXhjZXB0aW9uIGplKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViQXBwbGljYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIG5ldyBFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfV1JJVElOR19KU09OX0FSUkFZKCksIGplKSwKKyAgICAgICAgICAgICAgICAgICAgNTAwKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2pzb24tamV0dGlzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0aXNvbi9pbnRlcm5hbC9lbnRpdHkvSmV0dGlzb25KYXhiRWxlbWVudFByb3ZpZGVyLmphdmEgYi9tZWRpYS9qc29uLWpldHRpc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamV0dGlzb24vaW50ZXJuYWwvZW50aXR5L0pldHRpc29uSmF4YkVsZW1lbnRQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyNjg0OTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qc29uLWpldHRpc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamV0dGlzb24vaW50ZXJuYWwvZW50aXR5L0pldHRpc29uSmF4YkVsZW1lbnRQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHRpc29uLmludGVybmFsLmVudGl0eTsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcnM7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLk1hcnNoYWxsZXI7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuVW5tYXJzaGFsbGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamF4Yi5pbnRlcm5hbC5BYnN0cmFjdEpheGJFbGVtZW50UHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dGlzb24uSmV0dGlzb25KYXhiQ29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0aXNvbi5KZXR0aXNvbk1hcnNoYWxsZXI7CisKKy8qKgorICogSlNPTiBtZXNzYWdlIGVudGl0eSBtZWRpYSB0eXBlIHByb3ZpZGVyIChyZWFkZXIgJiB3cml0ZXIpIGZvciB7QGxpbmsgamF2YXgueG1sLmJpbmQuSkFYQkVsZW1lbnR9CisgKiB0eXBlLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBKZXR0aXNvbkpheGJFbGVtZW50UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdEpheGJFbGVtZW50UHJvdmlkZXIgeworCisgICAgSmV0dGlzb25KYXhiRWxlbWVudFByb3ZpZGVyKFByb3ZpZGVycyBwcykgeworICAgICAgICBzdXBlcihwcyk7CisgICAgfQorCisgICAgSmV0dGlzb25KYXhiRWxlbWVudFByb3ZpZGVyKFByb3ZpZGVycyBwcywgTWVkaWFUeXBlIG10KSB7CisgICAgICAgIHN1cGVyKHBzLCBtdCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmlzUmVhZGFibGUodHlwZSwgZ2VuZXJpY1R5cGUsIGFubm90YXRpb25zLCBtZWRpYVR5cGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICByZXR1cm4gc3VwZXIuaXNXcml0ZWFibGUodHlwZSwgZ2VuZXJpY1R5cGUsIGFubm90YXRpb25zLCBtZWRpYVR5cGUpOworICAgIH0KKworICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9qc29uIikKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEFwcCBleHRlbmRzIEpldHRpc29uSmF4YkVsZW1lbnRQcm92aWRlciB7CisKKyAgICAgICAgcHVibGljIEFwcChAQ29udGV4dCBQcm92aWRlcnMgcHMpIHsKKyAgICAgICAgICAgIHN1cGVyKHBzLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm9kdWNlcygiKi8qIikKKyAgICBAQ29uc3VtZXMoIiovKiIpCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBHZW5lcmFsIGV4dGVuZHMgSmV0dGlzb25KYXhiRWxlbWVudFByb3ZpZGVyIHsKKworICAgICAgICBwdWJsaWMgR2VuZXJhbChAQ29udGV4dCBQcm92aWRlcnMgcHMpIHsKKyAgICAgICAgICAgIHN1cGVyKHBzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1N1cHBvcnRlZChNZWRpYVR5cGUgbSkgeworICAgICAgICAgICAgcmV0dXJuIG0uZ2V0U3VidHlwZSgpLmVuZHNXaXRoKCIranNvbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGZpbmFsIEpBWEJFbGVtZW50PD8+IHJlYWRGcm9tKENsYXNzPD8+IHR5cGUsIE1lZGlhVHlwZSBtZWRpYVR5cGUsIFVubWFyc2hhbGxlciB1bm1hcnNoYWxsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIEpBWEJFeGNlcHRpb24geworICAgICAgICBmaW5hbCBDaGFyc2V0IGMgPSBnZXRDaGFyc2V0KG1lZGlhVHlwZSk7CisKKyAgICAgICAgcmV0dXJuIEpldHRpc29uSmF4YkNvbnRleHQuZ2V0SlNPTlVubWFyc2hhbGxlcih1bm1hcnNoYWxsZXIpCisgICAgICAgICAgICAgICAgLnVubWFyc2hhbEpBWEJFbGVtZW50RnJvbUpTT04obmV3IElucHV0U3RyZWFtUmVhZGVyKGVudGl0eVN0cmVhbSwgYyksIHR5cGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHdyaXRlVG8oSkFYQkVsZW1lbnQ8Pz4gdCwgTWVkaWFUeXBlIG1lZGlhVHlwZSwgQ2hhcnNldCBjLCBNYXJzaGFsbGVyIG0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisKKyAgICAgICAgSmV0dGlzb25NYXJzaGFsbGVyIGpzb25NYXJzaGFsbGVyID0gSmV0dGlzb25KYXhiQ29udGV4dC5nZXRKU09OTWFyc2hhbGxlcihtKTsKKyAgICAgICAgaWYgKGlzRm9ybWF0dGVkT3V0cHV0KCkpIHsKKyAgICAgICAgICAgIGpzb25NYXJzaGFsbGVyLnNldFByb3BlcnR5KEpldHRpc29uTWFyc2hhbGxlci5GT1JNQVRURUQsIHRydWUpOworICAgICAgICB9CisgICAgICAgIGpzb25NYXJzaGFsbGVyLm1hcnNoYWxsVG9KU09OKHQsIG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoZW50aXR5U3RyZWFtLCBjKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvanNvbi1qZXR0aXNvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHRpc29uL2ludGVybmFsL2VudGl0eS9KZXR0aXNvbkxpc3RFbGVtZW50UHJvdmlkZXIuamF2YSBiL21lZGlhL2pzb24tamV0dGlzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0aXNvbi9pbnRlcm5hbC9lbnRpdHkvSmV0dGlzb25MaXN0RWxlbWVudFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZhYWQ5NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2pzb24tamV0dGlzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0aXNvbi9pbnRlcm5hbC9lbnRpdHkvSmV0dGlzb25MaXN0RWxlbWVudFByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dGlzb24uaW50ZXJuYWwuZW50aXR5OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyczsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLmJpbmQuTWFyc2hhbGxlcjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5Vbm1hcnNoYWxsZXI7CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYXhiLmludGVybmFsLkFic3RyYWN0Q29sbGVjdGlvbkpheGJQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0aXNvbi5KZXR0aXNvbkNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0aXNvbi5KZXR0aXNvbkNvbmZpZ3VyZWQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dGlzb24uaW50ZXJuYWwuU3RheDJKZXR0aXNvbkZhY3Rvcnk7CisKKy8qKgorICogSlNPTiBtZXNzYWdlIGVudGl0eSBtZWRpYSB0eXBlIHByb3ZpZGVyIChyZWFkZXIgJiB3cml0ZXIpIGZvciBjb2xsZWN0aW9uCisgKiB0eXBlcy4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSmV0dGlzb25MaXN0RWxlbWVudFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RDb2xsZWN0aW9uSmF4YlByb3ZpZGVyIHsKKworICAgIEpldHRpc29uTGlzdEVsZW1lbnRQcm92aWRlcihQcm92aWRlcnMgcHMpIHsKKyAgICAgICAgc3VwZXIocHMpOworICAgIH0KKworICAgIEpldHRpc29uTGlzdEVsZW1lbnRQcm92aWRlcihQcm92aWRlcnMgcHMsIE1lZGlhVHlwZSBtdCkgeworICAgICAgICBzdXBlcihwcywgbXQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiBzdXBlci5pc1JlYWRhYmxlKHR5cGUsIGdlbmVyaWNUeXBlLCBhbm5vdGF0aW9ucywgbWVkaWFUeXBlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmlzV3JpdGVhYmxlKHR5cGUsIGdlbmVyaWNUeXBlLCBhbm5vdGF0aW9ucywgbWVkaWFUeXBlKTsKKyAgICB9CisKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBBcHAgZXh0ZW5kcyBKZXR0aXNvbkxpc3RFbGVtZW50UHJvdmlkZXIgeworCisgICAgICAgIHB1YmxpYyBBcHAoQENvbnRleHQgUHJvdmlkZXJzIHBzKSB7CisgICAgICAgICAgICBzdXBlcihwcywgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvZHVjZXMoIiovKiIpCisgICAgQENvbnN1bWVzKCIqLyoiKQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgR2VuZXJhbCBleHRlbmRzIEpldHRpc29uTGlzdEVsZW1lbnRQcm92aWRlciB7CisKKyAgICAgICAgcHVibGljIEdlbmVyYWwoQENvbnRleHQgUHJvdmlkZXJzIHBzKSB7CisgICAgICAgICAgICBzdXBlcihwcyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNTdXBwb3J0ZWQoTWVkaWFUeXBlIG0pIHsKKyAgICAgICAgICAgIHJldHVybiBtLmdldFN1YnR5cGUoKS5lbmRzV2l0aCgiK2pzb24iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlQ29sbGVjdGlvbihDbGFzczw/PiBlbGVtZW50VHlwZSwgQ29sbGVjdGlvbjw/PiB0LCBNZWRpYVR5cGUgbWVkaWFUeXBlLCBDaGFyc2V0IGMsIE1hcnNoYWxsZXIgbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIEpBWEJFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtV3JpdGVyIG9zdyA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoZW50aXR5U3RyZWFtLCBjKTsKKworICAgICAgICBKZXR0aXNvbkNvbmZpZyBvcmlnSnNvbkNvbmZpZyA9IEpldHRpc29uQ29uZmlnLkRFRkFVTFQ7CisgICAgICAgIGlmIChtIGluc3RhbmNlb2YgSmV0dGlzb25Db25maWd1cmVkKSB7CisgICAgICAgICAgICBvcmlnSnNvbkNvbmZpZyA9ICgoSmV0dGlzb25Db25maWd1cmVkKSBtKS5nZXRKU09OQ29uZmlndXJhdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgSmV0dGlzb25Db25maWcgdW53cmFwcGluZ0pzb25Db25maWcgPSBKZXR0aXNvbkNvbmZpZy5jcmVhdGVKU09OQ29uZmlndXJhdGlvbihvcmlnSnNvbkNvbmZpZyk7CisKKyAgICAgICAgZmluYWwgWE1MU3RyZWFtV3JpdGVyIGp4c3cgPSBTdGF4MkpldHRpc29uRmFjdG9yeS5jcmVhdGVXcml0ZXIob3N3LCB1bndyYXBwaW5nSnNvbkNvbmZpZyk7CisgICAgICAgIGZpbmFsIFN0cmluZyBpbnZpc2libGVSb290TmFtZSA9IGdldFJvb3RFbGVtZW50TmFtZShlbGVtZW50VHlwZSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGp4c3cud3JpdGVTdGFydERvY3VtZW50KCk7CisgICAgICAgICAgICBqeHN3LndyaXRlU3RhcnRFbGVtZW50KGludmlzaWJsZVJvb3ROYW1lKTsKKyAgICAgICAgICAgIGZvciAoT2JqZWN0IG8gOiB0KSB7CisgICAgICAgICAgICAgICAgbS5tYXJzaGFsKG8sIGp4c3cpOworICAgICAgICAgICAgfQorICAgICAgICAgICAganhzdy53cml0ZUVuZEVsZW1lbnQoKTsKKyAgICAgICAgICAgIGp4c3cud3JpdGVFbmREb2N1bWVudCgpOworICAgICAgICAgICAganhzdy5mbHVzaCgpOworICAgICAgICB9IGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoSmV0dGlzb25MaXN0RWxlbWVudFByb3ZpZGVyLmNsYXNzLmdldE5hbWUoKSkubG9nKExldmVsLlNFVkVSRSwgbnVsbCwgZXgpOworICAgICAgICAgICAgdGhyb3cgbmV3IEpBWEJFeGNlcHRpb24oZXguZ2V0TWVzc2FnZSgpLCBleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgZmluYWwgWE1MU3RyZWFtUmVhZGVyIGdldFhNTFN0cmVhbVJlYWRlcihDbGFzczw/PiBlbGVtZW50VHlwZSwgTWVkaWFUeXBlIG1lZGlhVHlwZSwgVW5tYXJzaGFsbGVyIHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uIHsKKyAgICAgICAgSmV0dGlzb25Db25maWcgYyA9IEpldHRpc29uQ29uZmlnLkRFRkFVTFQ7CisgICAgICAgIGZpbmFsIENoYXJzZXQgY2hhcnNldCA9IGdldENoYXJzZXQobWVkaWFUeXBlKTsKKyAgICAgICAgaWYgKHUgaW5zdGFuY2VvZiBKZXR0aXNvbkNvbmZpZ3VyZWQpIHsKKyAgICAgICAgICAgIGMgPSAoKEpldHRpc29uQ29uZmlndXJlZCkgdSkuZ2V0SlNPTkNvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBTdGF4MkpldHRpc29uRmFjdG9yeS5jcmVhdGVSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGVudGl0eVN0cmVhbSwgY2hhcnNldCksIGMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2pzb24tamV0dGlzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0aXNvbi9pbnRlcm5hbC9lbnRpdHkvSmV0dGlzb25Mb3dMZXZlbFByb3ZpZGVyLmphdmEgYi9tZWRpYS9qc29uLWpldHRpc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamV0dGlzb24vaW50ZXJuYWwvZW50aXR5L0pldHRpc29uTG93TGV2ZWxQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNDRlMjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qc29uLWpldHRpc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamV0dGlzb24vaW50ZXJuYWwvZW50aXR5L0pldHRpc29uTG93TGV2ZWxQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dGlzb24uaW50ZXJuYWwuZW50aXR5OworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkFic3RyYWN0TWVzc2FnZVJlYWRlcldyaXRlclByb3ZpZGVyOworCisvKioKKyAqIEFic3RyYWN0LCBsb3ctbGV2ZWwgSlNPTiBtZWRpYSB0eXBlIG1lc3NhZ2UgZW50aXR5IHByb3ZpZGVyIChyZWFkZXIgJiB3cml0ZXIpLgorICoKKyAqIEBwYXJhbSA8VD4gc3VwcG9ydGVkIEphdmEgdHlwZS4KKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBKZXR0aXNvbkxvd0xldmVsUHJvdmlkZXI8VD4gZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VSZWFkZXJXcml0ZXJQcm92aWRlcjxUPiB7CisKKyAgICBwcml2YXRlIGZpbmFsIENsYXNzPFQ+IGM7CisKKyAgICAvLyBKYXZhUmViZWwgbmVlZHMgdGhpcyBjdG9yCisgICAgcHJvdGVjdGVkIEpldHRpc29uTG93TGV2ZWxQcm92aWRlcihDbGFzczxUPiBjKSB7CisgICAgICAgIHRoaXMuYyA9IGM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uIGFubm90YXRpb25zW10sIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuICh0eXBlID09IGMpICYmIGlzU3VwcG9ydGVkKG1lZGlhVHlwZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uc1tdLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiAodHlwZSA9PSBjKSAmJiBpc1N1cHBvcnRlZChtZWRpYVR5cGUpOworICAgIH0KKworICAgIHByb3RlY3RlZCBib29sZWFuIGlzU3VwcG9ydGVkKE1lZGlhVHlwZSBtKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2pzb24tamV0dGlzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0aXNvbi9pbnRlcm5hbC9lbnRpdHkvSmV0dGlzb25PYmplY3RQcm92aWRlci5qYXZhIGIvbWVkaWEvanNvbi1qZXR0aXNvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHRpc29uL2ludGVybmFsL2VudGl0eS9KZXR0aXNvbk9iamVjdFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMwYWZjMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2pzb24tamV0dGlzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0aXNvbi9pbnRlcm5hbC9lbnRpdHkvSmV0dGlzb25PYmplY3RQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHRpc29uLmludGVybmFsLmVudGl0eTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dGlzb24uaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CisKK2ltcG9ydCBvcmcuY29kZWhhdXMuamV0dGlzb24uanNvbi5KU09ORXhjZXB0aW9uOworaW1wb3J0IG9yZy5jb2RlaGF1cy5qZXR0aXNvbi5qc29uLkpTT05PYmplY3Q7CisKKy8qKgorICogTG93LWxldmVsIEpTT04gbWVkaWEgdHlwZSBtZXNzYWdlIGVudGl0eSBwcm92aWRlciAocmVhZGVyICYgd3JpdGVyKSBmb3IKKyAqIHtAbGluayBKU09OT2JqZWN0fS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSmV0dGlzb25PYmplY3RQcm92aWRlciBleHRlbmRzIEpldHRpc29uTG93TGV2ZWxQcm92aWRlcjxKU09OT2JqZWN0PiB7CisKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBBcHAgZXh0ZW5kcyBKZXR0aXNvbk9iamVjdFByb3ZpZGVyIHsKKyAgICB9CisKKyAgICBAUHJvZHVjZXMoIiovKiIpCisgICAgQENvbnN1bWVzKCIqLyoiKQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgR2VuZXJhbCBleHRlbmRzIEpldHRpc29uT2JqZWN0UHJvdmlkZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1N1cHBvcnRlZChNZWRpYVR5cGUgbSkgeworICAgICAgICAgICAgcmV0dXJuIG0uZ2V0U3VidHlwZSgpLmVuZHNXaXRoKCIranNvbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgSmV0dGlzb25PYmplY3RQcm92aWRlcigpIHsKKyAgICAgICAgc3VwZXIoSlNPTk9iamVjdC5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEpTT05PYmplY3QgcmVhZEZyb20oCisgICAgICAgICAgICBDbGFzczxKU09OT2JqZWN0PiB0eXBlLAorICAgICAgICAgICAgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbnNbXSwKKyAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICBJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEpTT05PYmplY3QocmVhZEZyb21Bc1N0cmluZyhlbnRpdHlTdHJlYW0sIG1lZGlhVHlwZSkpOworICAgICAgICB9IGNhdGNoIChKU09ORXhjZXB0aW9uIGplKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViQXBwbGljYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIG5ldyBFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfUEFSU0lOR19KU09OX09CSkVDVCgpLCBqZSksCisgICAgICAgICAgICAgICAgICAgIDQwMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKAorICAgICAgICAgICAgSlNPTk9iamVjdCB0LAorICAgICAgICAgICAgQ2xhc3M8Pz4gdHlwZSwKKyAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb25zW10sCisgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbVdyaXRlciB3cml0ZXIgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGVudGl0eVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgZ2V0Q2hhcnNldChtZWRpYVR5cGUpKTsKKyAgICAgICAgICAgIHQud3JpdGUod3JpdGVyKTsKKyAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOworICAgICAgICB9IGNhdGNoIChKU09ORXhjZXB0aW9uIGplKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViQXBwbGljYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIG5ldyBFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfV1JJVElOR19KU09OX09CSkVDVCgpLCBqZSksCisgICAgICAgICAgICAgICAgICAgIDUwMCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9qc29uLWpldHRpc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamV0dGlzb24vaW50ZXJuYWwvZW50aXR5L0pldHRpc29uUm9vdEVsZW1lbnRQcm92aWRlci5qYXZhIGIvbWVkaWEvanNvbi1qZXR0aXNvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHRpc29uL2ludGVybmFsL2VudGl0eS9KZXR0aXNvblJvb3RFbGVtZW50UHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2U5OTA1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvanNvbi1qZXR0aXNvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHRpc29uL2ludGVybmFsL2VudGl0eS9KZXR0aXNvblJvb3RFbGVtZW50UHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0aXNvbi5pbnRlcm5hbC5lbnRpdHk7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXJzOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5NYXJzaGFsbGVyOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLlVubWFyc2hhbGxlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmpheGIuaW50ZXJuYWwuQWJzdHJhY3RSb290RWxlbWVudEpheGJQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0aXNvbi5KZXR0aXNvbkpheGJDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHRpc29uLkpldHRpc29uTWFyc2hhbGxlcjsKKworLyoqCisgKiBKU09OIG1lc3NhZ2UgZW50aXR5IG1lZGlhIHR5cGUgcHJvdmlkZXIgKHJlYWRlciAmIHdyaXRlcikgZm9yIEpBWEIgdHlwZXMgdGhhdAorICogYXJlIGFubm90YXRlZCB3aXRoIHtAbGluayBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50ICYjNjQ7WG1sUm9vdEVsZW1lbnR9CisgKiBvciB7QGxpbmsgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlICYjNjQ7WG1sVHlwZX0uCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEpldHRpc29uUm9vdEVsZW1lbnRQcm92aWRlciBleHRlbmRzIEFic3RyYWN0Um9vdEVsZW1lbnRKYXhiUHJvdmlkZXIgeworCisgICAgSmV0dGlzb25Sb290RWxlbWVudFByb3ZpZGVyKFByb3ZpZGVycyBwcykgeworICAgICAgICBzdXBlcihwcyk7CisgICAgfQorCisgICAgSmV0dGlzb25Sb290RWxlbWVudFByb3ZpZGVyKFByb3ZpZGVycyBwcywgTWVkaWFUeXBlIG10KSB7CisgICAgICAgIHN1cGVyKHBzLCBtdCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHN1cGVyLmlzUmVhZGFibGUodHlwZSwgZ2VuZXJpY1R5cGUsIGFubm90YXRpb25zLCBtZWRpYVR5cGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICByZXR1cm4gc3VwZXIuaXNXcml0ZWFibGUodHlwZSwgZ2VuZXJpY1R5cGUsIGFubm90YXRpb25zLCBtZWRpYVR5cGUpOworICAgIH0KKworICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9qc29uIikKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEFwcCBleHRlbmRzIEpldHRpc29uUm9vdEVsZW1lbnRQcm92aWRlciB7CisKKyAgICAgICAgcHVibGljIEFwcChAQ29udGV4dCBQcm92aWRlcnMgcHMpIHsKKyAgICAgICAgICAgIHN1cGVyKHBzLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm9kdWNlcygiKi8qIikKKyAgICBAQ29uc3VtZXMoIiovKiIpCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBHZW5lcmFsIGV4dGVuZHMgSmV0dGlzb25Sb290RWxlbWVudFByb3ZpZGVyIHsKKworICAgICAgICBwdWJsaWMgR2VuZXJhbChAQ29udGV4dCBQcm92aWRlcnMgcHMpIHsKKyAgICAgICAgICAgIHN1cGVyKHBzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc1N1cHBvcnRlZChNZWRpYVR5cGUgbSkgeworICAgICAgICAgICAgcmV0dXJuIG0uZ2V0U3VidHlwZSgpLmVuZHNXaXRoKCIranNvbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGZpbmFsIE9iamVjdCByZWFkRnJvbShDbGFzczxPYmplY3Q+IHR5cGUsIE1lZGlhVHlwZSBtZWRpYVR5cGUsIFVubWFyc2hhbGxlciB1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENoYXJzZXQgYyA9IGdldENoYXJzZXQobWVkaWFUeXBlKTsKKworICAgICAgICByZXR1cm4gSmV0dGlzb25KYXhiQ29udGV4dC5nZXRKU09OVW5tYXJzaGFsbGVyKHUpCisgICAgICAgICAgICAgICAgLnVubWFyc2hhbEZyb21KU09OKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihlbnRpdHlTdHJlYW0sIGMpLCB0eXBlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVRvKE9iamVjdCB0LCBNZWRpYVR5cGUgbWVkaWFUeXBlLCBDaGFyc2V0IGMsIE1hcnNoYWxsZXIgbSwgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzCisgICAgICAgICAgICBKQVhCRXhjZXB0aW9uIHsKKyAgICAgICAgSmV0dGlzb25NYXJzaGFsbGVyIGpzb25NYXJzaGFsbGVyID0gSmV0dGlzb25KYXhiQ29udGV4dC5nZXRKU09OTWFyc2hhbGxlcihtKTsKKyAgICAgICAgaWYgKGlzRm9ybWF0dGVkT3V0cHV0KCkpIHsKKyAgICAgICAgICAgIGpzb25NYXJzaGFsbGVyLnNldFByb3BlcnR5KEpldHRpc29uTWFyc2hhbGxlci5GT1JNQVRURUQsIHRydWUpOworICAgICAgICB9CisgICAgICAgIGpzb25NYXJzaGFsbGVyLm1hcnNoYWxsVG9KU09OKHQsIG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoZW50aXR5U3RyZWFtLCBjKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvanNvbi1qZXR0aXNvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHRpc29uL2ludGVybmFsL2VudGl0eS9wYWNrYWdlLWluZm8uamF2YSBiL21lZGlhL2pzb24tamV0dGlzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0aXNvbi9pbnRlcm5hbC9lbnRpdHkvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMwODg2ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2pzb24tamV0dGlzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0aXNvbi9pbnRlcm5hbC9lbnRpdHkvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoqCisgKiBKZXJzZXkgSlNPTiBKZXR0aXNvbiBwcm92aWRlciBpbnRlcm5hbCBtZXNzYWdlIGVudGl0eSBwcm9jZXNzaW5nIHV0aWxpdHkgY2xhc3Nlcy4KKyAqLworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0aXNvbi5pbnRlcm5hbC5lbnRpdHk7CmRpZmYgLS1naXQgYS9tZWRpYS9qc29uLWpldHRpc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamV0dGlzb24vaW50ZXJuYWwvcGFja2FnZS1pbmZvLmphdmEgYi9tZWRpYS9qc29uLWpldHRpc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamV0dGlzb24vaW50ZXJuYWwvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM4M2UwMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2pzb24tamV0dGlzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0aXNvbi9pbnRlcm5hbC9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvKioKKyAqIEplcnNleSBpbnRlcm5hbCBjbGFzc2VzIHN1cHBvcnRpbmcgSlNPTiBwcm9jZXNzaW5nIGJhc2VkIG9uIEpldHRpc29uLgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHRpc29uLmludGVybmFsOwpkaWZmIC0tZ2l0IGEvbWVkaWEvanNvbi1qZXR0aXNvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHRpc29uL3BhY2thZ2UtaW5mby5qYXZhIGIvbWVkaWEvanNvbi1qZXR0aXNvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pldHRpc29uL3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NWQyM2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qc29uLWpldHRpc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamV0dGlzb24vcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoqCisgKiBKZXJzZXkgY2xhc3NlcyBzdXBwb3J0aW5nIEpTT04gbWVkaWEgdHlwZSBwcm9jZXNzaW5nIGJhc2VkIG9uIEpldHRpc29uLgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHRpc29uOwpkaWZmIC0tZ2l0IGEvbWVkaWEvanNvbi1qZXR0aXNvbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamV0dGlzb24vaW50ZXJuYWwvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMgYi9tZWRpYS9qc29uLWpldHRpc29uL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9qZXR0aXNvbi9pbnRlcm5hbC9sb2NhbGl6YXRpb24ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTVlM2NmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvanNvbi1qZXR0aXNvbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvamV0dGlzb24vaW50ZXJuYWwvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMKQEAgLTAsMCArMSwyMCBAQAorIworIyBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisjIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyMKKyMgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorIyBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisjIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorIyB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisjCisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorIworCitlcnJvci5wYXJzaW5nLmpzb24ub2JqZWN0PUVycm9yIHBhcnNpbmcgSlNPTiBvYmplY3QuCitlcnJvci5wYXJzaW5nLmpzb24uYXJyYXk9RXJyb3IgcGFyc2luZyBKU09OIGFycmF5LgorZXJyb3Iud3JpdGluZy5qc29uLm9iamVjdD1FcnJvciB3cml0aW5nIEpTT04gb2JqZWN0LgorZXJyb3Iud3JpdGluZy5qc29uLmFycmF5PUVycm9yIHdyaXRpbmcgSlNPTiBhcnJheS4KZGlmZiAtLWdpdCBhL21lZGlhL2pzb24tcHJvY2Vzc2luZy9wb20ueG1sIGIvbWVkaWEvanNvbi1wcm9jZXNzaW5nL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAwMjJlOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2pzb24tcHJvY2Vzc2luZy9wb20ueG1sCkBAIC0wLDAgKzEsMTA1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLWpzb24tcHJvY2Vzc2luZzwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS1tZWRpYS1qc29uLXByb2Nlc3Npbmc8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIEplcnNleSBKU09OLVAgKEpTUiAzNTMpIGVudGl0eSBwcm92aWRlcnMgc3VwcG9ydCBwcm94eSBtb2R1bGUuCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4uaXN0YWNrPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWlzdGFjay1jb21tb25zLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5idWlsZC1oZWxwZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZmVsaXg8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYnVuZGxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KKyAgICAgICAgICAgICAgICA8ZXh0ZW5zaW9ucz50cnVlPC9leHRlbnNpb25zPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8aW5zdHJ1Y3Rpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgPEV4cG9ydC1QYWNrYWdlPm9yZy5nbGFzc2Zpc2guamVyc2V5Lmpzb25wLio7dmVyc2lvbj0ke3Byb2plY3QudmVyc2lvbn08L0V4cG9ydC1QYWNrYWdlPgorICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBUT0RPOiBjaGFuZ2UgdG8gJHtyYW5nZTtbPT0sKyk7JHtqc29ucC5hcGkudmVyc2lvbn19IG9uY2UgdGhlIHZlcnNpb24gaXMgZmluYWwtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxJbXBvcnQtUGFja2FnZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZheC5qc29uLio7dmVyc2lvbj0iWzAsMikiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yZy5nbGFzc2Zpc2guanNvbi4qO3ZlcnNpb249IlswLDIpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICAgICAgICAgICAgICAgICAgICA8L0ltcG9ydC1QYWNrYWdlPgorICAgICAgICAgICAgICAgICAgICA8L2luc3RydWN0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPHVucGFja0J1bmRsZT50cnVlPC91bnBhY2tCdW5kbGU+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbW1vbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDwhLS0gSlNPTi1QIEFQSSArIFJJICsgSkFYLVJTIFByb3ZpZGVycyAtLT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguanNvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2g8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc29ucC1qYXhyczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktc2VydmVyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jbGllbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21lZGlhL2pzb24tcHJvY2Vzc2luZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pzb25wL0pzb25Qcm9jZXNzaW5nRmVhdHVyZS5qYXZhIGIvbWVkaWEvanNvbi1wcm9jZXNzaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvanNvbnAvSnNvblByb2Nlc3NpbmdGZWF0dXJlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA2NTc3MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2pzb24tcHJvY2Vzc2luZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pzb25wL0pzb25Qcm9jZXNzaW5nRmVhdHVyZS5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuanNvbnA7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcmlvcml0aWVzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmVDb250ZXh0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuQ29tbW9uUHJvcGVydGllczsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guanNvbi5qYXhycy5Kc29uVmFsdWVCb2R5UmVhZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guanNvbi5qYXhycy5Kc29uVmFsdWVCb2R5V3JpdGVyOworCisvKioKKyAqIHtAbGluayBGZWF0dXJlfSB1c2VkIHRvIHJlZ2lzdGVyIEpTT04tUCBwcm92aWRlcnMuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBKc29uUHJvY2Vzc2luZ0ZlYXR1cmUgaW1wbGVtZW50cyBGZWF0dXJlIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZShmaW5hbCBGZWF0dXJlQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGlmIChDb21tb25Qcm9wZXJ0aWVzLmdldFZhbHVlKGNvbnRleHQuZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnRpZXMoKSwgY29udGV4dC5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UnVudGltZVR5cGUoKSwKKyAgICAgICAgICAgICAgICBDb21tb25Qcm9wZXJ0aWVzLkpTT05fUFJPQ0VTU0lOR19GRUFUVVJFX0RJU0FCTEUsIEJvb2xlYW4uRkFMU0UsIEJvb2xlYW4uY2xhc3MpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBNYWtlIHN1cmUgSlNPTi1QIHdvcmtlcnMgaGF2ZSBoaWdoZXIgcHJpb3JpdHkgdGhhbiBvdGhlciBKc29uIHByb3ZpZGVycyAoaW4gY2FzZSB0aGVyZSBpcyBhIG5lZWQgdG8gdXNlIEpTT04tUCBhbmQgc29tZQorICAgICAgICAvLyBvdGhlciBwcm92aWRlciBpbiBhbiBhcHBsaWNhdGlvbikuCisgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoSnNvblZhbHVlQm9keVJlYWRlci5jbGFzcywgUHJpb3JpdGllcy5VU0VSICsgMTAwMCk7CisgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoSnNvblZhbHVlQm9keVdyaXRlci5jbGFzcywgUHJpb3JpdGllcy5VU0VSICsgMTAwMCk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvanNvbi1wcm9jZXNzaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvanNvbnAvaW50ZXJuYWwvSnNvblByb2Nlc3NpbmdBdXRvRGlzY292ZXJhYmxlLmphdmEgYi9tZWRpYS9qc29uLXByb2Nlc3Npbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qc29ucC9pbnRlcm5hbC9Kc29uUHJvY2Vzc2luZ0F1dG9EaXNjb3ZlcmFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzcwNDNkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvanNvbi1wcm9jZXNzaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvanNvbnAvaW50ZXJuYWwvSnNvblByb2Nlc3NpbmdBdXRvRGlzY292ZXJhYmxlLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qc29ucC5pbnRlcm5hbDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJpb3JpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlQ29udGV4dDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnNwaS5BdXRvRGlzY292ZXJhYmxlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnNwaS5Gb3JjZWRBdXRvRGlzY292ZXJhYmxlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lmpzb25wLkpzb25Qcm9jZXNzaW5nRmVhdHVyZTsKKworLyoqCisgKiB7QGxpbmsgQXV0b0Rpc2NvdmVyYWJsZX0gcmVnaXN0ZXJpbmcge0BsaW5rIEpzb25Qcm9jZXNzaW5nRmVhdHVyZX0gaWYgdGhpcyBmZWF0dXJlIGlzIG5vdCBhbHJlYWR5IHJlZ2lzdGVyZWQuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BQcmlvcml0eShBdXRvRGlzY292ZXJhYmxlLkRFRkFVTFRfUFJJT1JJVFkpCitwdWJsaWMgY2xhc3MgSnNvblByb2Nlc3NpbmdBdXRvRGlzY292ZXJhYmxlIGltcGxlbWVudHMgRm9yY2VkQXV0b0Rpc2NvdmVyYWJsZSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoZmluYWwgRmVhdHVyZUNvbnRleHQgY29udGV4dCkgeworICAgICAgICBpZiAoIWNvbnRleHQuZ2V0Q29uZmlndXJhdGlvbigpLmlzUmVnaXN0ZXJlZChKc29uUHJvY2Vzc2luZ0ZlYXR1cmUuY2xhc3MpKSB7CisgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKEpzb25Qcm9jZXNzaW5nRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9qc29uLXByb2Nlc3Npbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qc29ucC9pbnRlcm5hbC9wYWNrYWdlLWluZm8uamF2YSBiL21lZGlhL2pzb24tcHJvY2Vzc2luZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pzb25wL2ludGVybmFsL3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZDEyODUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qc29uLXByb2Nlc3Npbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qc29ucC9pbnRlcm5hbC9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvKioKKyAqIEplcnNleSBpbnRlcm5hbCBjbGFzc2VzIHN1cHBvcnRpbmcgSlNPTiBwcm9jZXNzaW5nIChKU09OLVApIG1lZGlhIHByb3ZpZGVycy4KKyAqLworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5qc29ucC5pbnRlcm5hbDsKZGlmZiAtLWdpdCBhL21lZGlhL2pzb24tcHJvY2Vzc2luZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pzb25wL3BhY2thZ2UtaW5mby5qYXZhIGIvbWVkaWEvanNvbi1wcm9jZXNzaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvanNvbnAvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU4Yjc0ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2pzb24tcHJvY2Vzc2luZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pzb25wL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKKy8qKgorICogSmVyc2V5IGNsYXNzZXMgc3VwcG9ydGluZyBKU09OIHByb2Nlc3NpbmcgKEpTT04tUCkgbWVkaWEgcHJvdmlkZXJzLgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lmpzb25wOwpkaWZmIC0tZ2l0IGEvbWVkaWEvanNvbi1wcm9jZXNzaW5nL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5zcGkuRm9yY2VkQXV0b0Rpc2NvdmVyYWJsZSBiL21lZGlhL2pzb24tcHJvY2Vzc2luZy9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuc3BpLkZvcmNlZEF1dG9EaXNjb3ZlcmFibGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FjNTI5YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2pzb24tcHJvY2Vzc2luZy9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuc3BpLkZvcmNlZEF1dG9EaXNjb3ZlcmFibGUKQEAgLTAsMCArMSBAQAorb3JnLmdsYXNzZmlzaC5qZXJzZXkuanNvbnAuaW50ZXJuYWwuSnNvblByb2Nlc3NpbmdBdXRvRGlzY292ZXJhYmxlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvanNvbi1wcm9jZXNzaW5nL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvanNvbnAvSnNvblByb2Nlc3NpbmdBdXRvRGlzY292ZXJhYmxlQ2xpZW50VGVzdC5qYXZhIGIvbWVkaWEvanNvbi1wcm9jZXNzaW5nL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvanNvbnAvSnNvblByb2Nlc3NpbmdBdXRvRGlzY292ZXJhYmxlQ2xpZW50VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmY2RlODkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9qc29uLXByb2Nlc3Npbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9qc29ucC9Kc29uUHJvY2Vzc2luZ0F1dG9EaXNjb3ZlcmFibGVDbGllbnRUZXN0LmphdmEKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuanNvbnA7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50Lkludm9jYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LkNvbW1vblByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllczsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEpzb25Qcm9jZXNzaW5nQXV0b0Rpc2NvdmVyYWJsZUNsaWVudFRlc3QgeworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGaWx0ZXIgaW1wbGVtZW50cyBDbGllbnRSZXF1ZXN0RmlsdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKGZpbmFsIENsaWVudFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSBSZXNwb25zZQorICAgICAgICAgICAgICAgICAgICAuc3RhdHVzKDQwMCkKKyAgICAgICAgICAgICAgICAgICAgLmVudGl0eShyZXF1ZXN0Q29udGV4dC5nZXRDb25maWd1cmF0aW9uKCkuaXNFbmFibGVkKEpzb25Qcm9jZXNzaW5nRmVhdHVyZS5jbGFzcykgPyAiRW5hYmxlZCIgOiAiRGlzYWJsZWQiKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuYWJvcnRXaXRoKHJlc3BvbnNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEF1dG9EaXNjb3ZlcmFibGVHbG9iYWxEZWZhdWx0U2VydmVyRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgiRW5hYmxlZCIsIG51bGwsIG51bGwpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEF1dG9EaXNjb3ZlcmFibGVHbG9iYWxEZWZhdWx0U2VydmVyRW5hYmxlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgiRW5hYmxlZCIsIG51bGwsIGZhbHNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvRGlzY292ZXJhYmxlR2xvYmFsRGVmYXVsdFNlcnZlckRpc2FibGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJEaXNhYmxlZCIsIG51bGwsIHRydWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEF1dG9EaXNjb3ZlcmFibGVHbG9iYWxEaXNhYmxlZFNlcnZlckRlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoIkRpc2FibGVkIiwgdHJ1ZSwgbnVsbCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0b0Rpc2NvdmVyYWJsZUdsb2JhbERpc2FibGVkU2VydmVyRW5hYmxlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgiRW5hYmxlZCIsIHRydWUsIGZhbHNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvRGlzY292ZXJhYmxlR2xvYmFsRGlzYWJsZWRTZXJ2ZXJEaXNhYmxlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgiRGlzYWJsZWQiLCB0cnVlLCB0cnVlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvRGlzY292ZXJhYmxlR2xvYmFsRW5hYmxlZFNlcnZlckRlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoIkVuYWJsZWQiLCBmYWxzZSwgbnVsbCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0b0Rpc2NvdmVyYWJsZUdsb2JhbEVuYWJsZWRTZXJ2ZXJFbmFibGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJFbmFibGVkIiwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvRGlzY292ZXJhYmxlR2xvYmFsRW5hYmxlZFNlcnZlckRpc2FibGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJEaXNhYmxlZCIsIGZhbHNlLCB0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3QoZmluYWwgU3RyaW5nIHJlc3BvbnNlLCBmaW5hbCBCb29sZWFuIGdsb2JhbERpc2FibGUsIGZpbmFsIEJvb2xlYW4gY2xpZW50RGlzYWJsZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENsaWVudENvbmZpZyBjb25maWcgPSBuZXcgQ2xpZW50Q29uZmlnKCk7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihGaWx0ZXIuY2xhc3MpOworCisgICAgICAgIGlmIChnbG9iYWxEaXNhYmxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbmZpZy5wcm9wZXJ0eShDb21tb25Qcm9wZXJ0aWVzLkpTT05fUFJPQ0VTU0lOR19GRUFUVVJFX0RJU0FCTEUsIGdsb2JhbERpc2FibGUpOworICAgICAgICB9CisgICAgICAgIGlmIChjbGllbnREaXNhYmxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNvbmZpZy5wcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLkpTT05fUFJPQ0VTU0lOR19GRUFUVVJFX0RJU0FCTEUsIGNsaWVudERpc2FibGUpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KGNvbmZpZyk7CisgICAgICAgIGZpbmFsIEludm9jYXRpb24uQnVpbGRlciByZXF1ZXN0ID0gY2xpZW50LnRhcmdldCgiIikucmVxdWVzdCgpOworCisgICAgICAgIGFzc2VydEVxdWFscyhyZXNwb25zZSwgcmVxdWVzdC5nZXQoKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2pzb24tcHJvY2Vzc2luZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pzb25wL0pzb25Qcm9jZXNzaW5nQXV0b0Rpc2NvdmVyYWJsZVNlcnZlclRlc3QuamF2YSBiL21lZGlhL2pzb24tcHJvY2Vzc2luZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2pzb25wL0pzb25Qcm9jZXNzaW5nQXV0b0Rpc2NvdmVyYWJsZVNlcnZlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGYyNDg1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvanNvbi1wcm9jZXNzaW5nL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvanNvbnAvSnNvblByb2Nlc3NpbmdBdXRvRGlzY292ZXJhYmxlU2VydmVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lmpzb25wOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5Db21tb25Qcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLk1hcFByb3BlcnRpZXNEZWxlZ2F0ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEpzb25Qcm9jZXNzaW5nQXV0b0Rpc2NvdmVyYWJsZVNlcnZlclRlc3QgeworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHsKKworICAgICAgICBAQ29udGV4dAorICAgICAgICBwdWJsaWMgQ29uZmlndXJhdGlvbiBjb25maWc7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihmaW5hbCBDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gUmVzcG9uc2UKKyAgICAgICAgICAgICAgICAgICAgLnN0YXR1cyg0MDApCisgICAgICAgICAgICAgICAgICAgIC5lbnRpdHkoY29uZmlnLmlzRW5hYmxlZChKc29uUHJvY2Vzc2luZ0ZlYXR1cmUuY2xhc3MpID8gIkVuYWJsZWQiIDogIkRpc2FibGVkIikKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LmFib3J0V2l0aChyZXNwb25zZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0Rm9vKEBDb250ZXh0IEh0dHBIZWFkZXJzIGhlYWRlcnMpIHsKKyAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKGhlYWRlcnMuZ2V0TGVuZ3RoKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0b0Rpc2NvdmVyYWJsZUdsb2JhbERlZmF1bHRTZXJ2ZXJEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJFbmFibGVkIiwgbnVsbCwgbnVsbCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0b0Rpc2NvdmVyYWJsZUdsb2JhbERlZmF1bHRTZXJ2ZXJFbmFibGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJFbmFibGVkIiwgbnVsbCwgZmFsc2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEF1dG9EaXNjb3ZlcmFibGVHbG9iYWxEZWZhdWx0U2VydmVyRGlzYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoIkRpc2FibGVkIiwgbnVsbCwgdHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0b0Rpc2NvdmVyYWJsZUdsb2JhbERpc2FibGVkU2VydmVyRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgiRGlzYWJsZWQiLCB0cnVlLCBudWxsKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvRGlzY292ZXJhYmxlR2xvYmFsRGlzYWJsZWRTZXJ2ZXJFbmFibGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJFbmFibGVkIiwgdHJ1ZSwgZmFsc2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEF1dG9EaXNjb3ZlcmFibGVHbG9iYWxEaXNhYmxlZFNlcnZlckRpc2FibGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJEaXNhYmxlZCIsIHRydWUsIHRydWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEF1dG9EaXNjb3ZlcmFibGVHbG9iYWxFbmFibGVkU2VydmVyRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgiRW5hYmxlZCIsIGZhbHNlLCBudWxsKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdXRvRGlzY292ZXJhYmxlR2xvYmFsRW5hYmxlZFNlcnZlckVuYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoIkVuYWJsZWQiLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEF1dG9EaXNjb3ZlcmFibGVHbG9iYWxFbmFibGVkU2VydmVyRGlzYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoIkRpc2FibGVkIiwgZmFsc2UsIHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfdGVzdChmaW5hbCBTdHJpbmcgcmVzcG9uc2UsIGZpbmFsIEJvb2xlYW4gZ2xvYmFsRGlzYWJsZSwgZmluYWwgQm9vbGVhbiBzZXJ2ZXJEaXNhYmxlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MsIEZpbHRlci5jbGFzcyk7CisKKyAgICAgICAgaWYgKGdsb2JhbERpc2FibGUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVzb3VyY2VDb25maWcucHJvcGVydHkoQ29tbW9uUHJvcGVydGllcy5KU09OX1BST0NFU1NJTkdfRkVBVFVSRV9ESVNBQkxFLCBnbG9iYWxEaXNhYmxlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2VydmVyRGlzYWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXNvdXJjZUNvbmZpZy5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLkpTT05fUFJPQ0VTU0lOR19GRUFUVVJFX0RJU0FCTEUsIHNlcnZlckRpc2FibGUpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgQXBwbGljYXRpb25IYW5kbGVyIGFwcCA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIocmVzb3VyY2VDb25maWcpOworCisgICAgICAgIGZpbmFsIFVSSSBiYXNlVXJpID0gVVJJLmNyZWF0ZSgiLyIpOworICAgICAgICBhc3NlcnRFcXVhbHMocmVzcG9uc2UsIGFwcC5hcHBseShuZXcgQ29udGFpbmVyUmVxdWVzdChiYXNlVXJpLCBiYXNlVXJpLCAiR0VUIiwgbnVsbCwgbmV3IE1hcFByb3BlcnRpZXNEZWxlZ2F0ZSgpKSkuZ2V0KCkKKyAgICAgICAgICAgICAgICAuZ2V0RW50aXR5KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL21veHkvcG9tLnhtbCBiL21lZGlhL21veHkvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmJiOGYzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbW94eS9wb20ueG1sCkBAIC0wLDAgKzEsMTE1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLW1veHk8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktbWVkaWEtbW94eTwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgSmVyc2V5IEpTT04gZW50aXR5IHByb3ZpZGVycyBzdXBwb3J0IG1vZHVsZSBiYXNlZCBvbiBFY2xpcHNlTGluayBNT1h5LgorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLmlzdGFjazwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1pc3RhY2stY29tbW9ucy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKworICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5idWlsZC1oZWxwZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisKKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5mZWxpeDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1idW5kbGUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgICAgIDxleHRlbnNpb25zPnRydWU8L2V4dGVuc2lvbnM+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxpbnN0cnVjdGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8RXhwb3J0LVBhY2thZ2U+b3JnLmdsYXNzZmlzaC5qZXJzZXkubW94eS4qPC9FeHBvcnQtUGFja2FnZT4KKyAgICAgICAgICAgICAgICAgICAgPC9pbnN0cnVjdGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDx1bnBhY2tCdW5kbGU+dHJ1ZTwvdW5wYWNrQnVuZGxlPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorCisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPmRlLmpmbGV4PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWpmbGV4LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjQuMzwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5nZW5lcmF0ZTwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2dlbmVyYXRlZC1zb3VyY2VzL3JzcmMtZ2VuPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb21tb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktZW50aXR5LWZpbHRlcmluZzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UucGVyc2lzdGVuY2U8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tb3h5PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8cmVwb3NpdG9yaWVzPgorICAgICAgICA8cmVwb3NpdG9yeT4KKyAgICAgICAgICAgIDxpZD5lY2xpcHNlbGluay5yZXBvc2l0b3J5PC9pZD4KKyAgICAgICAgICAgIDxuYW1lPkVjbGlwc2UgTWF2ZW4gUmVwb3NpdG9yeTwvbmFtZT4KKyAgICAgICAgICAgIDx1cmw+aHR0cDovL2Rvd25sb2FkLmVjbGlwc2Uub3JnL3J0L2VjbGlwc2VsaW5rL21hdmVuLnJlcG88L3VybD4KKyAgICAgICAgICAgIDxsYXlvdXQ+ZGVmYXVsdDwvbGF5b3V0PgorICAgICAgICA8L3JlcG9zaXRvcnk+CisgICAgPC9yZXBvc2l0b3JpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21lZGlhL21veHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tb3h5L2ludGVybmFsL01veHlGaWx0ZXJpbmdGZWF0dXJlLmphdmEgYi9tZWRpYS9tb3h5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbW94eS9pbnRlcm5hbC9Nb3h5RmlsdGVyaW5nRmVhdHVyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZjlmMDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tb3h5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbW94eS9pbnRlcm5hbC9Nb3h5RmlsdGVyaW5nRmVhdHVyZS5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubW94eS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkdlbmVyaWNUeXBlOworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5BYnN0cmFjdEJpbmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5zcGkuT2JqZWN0R3JhcGhUcmFuc2Zvcm1lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5zcGkuT2JqZWN0UHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qYXhiLk9iamVjdEdyYXBoOworCisvKioKKyAqIHtAbGluayBGZWF0dXJlfSBhZGRpbmcgc3VwcG9ydCBmb3IgRW50aXR5IERhdGEgRmlsdGVyaW5nIGludG8gTU9YeSBtZWRpYSBtb2R1bGUuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBNb3h5RmlsdGVyaW5nRmVhdHVyZSBpbXBsZW1lbnRzIEZlYXR1cmUgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlKGZpbmFsIEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWcgPSBjb250ZXh0LmdldENvbmZpZ3VyYXRpb24oKTsKKworICAgICAgICBpZiAoIWNvbmZpZy5pc1JlZ2lzdGVyZWQoTW94eUZpbHRlcmluZ0ZlYXR1cmUuQmluZGVyLmNsYXNzKSkgeworICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihuZXcgQmluZGVyKCkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEJpbmRlciBleHRlbmRzIEFic3RyYWN0QmluZGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICAgICAgYmluZEFzQ29udHJhY3QoTW94eU9iamVjdFByb3ZpZGVyLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAvLyBGaWx0ZXJpbmdPYmplY3RQcm92aWRlci4KKyAgICAgICAgICAgICAgICAgICAgLnRvKG5ldyBHZW5lcmljVHlwZTxPYmplY3RQcm92aWRlcjxPYmplY3RHcmFwaD4+KCkge30pCisgICAgICAgICAgICAgICAgICAgIC8vIEZpbHRlcmluZ0dyYXBoVHJhbnNmb3JtZXIuCisgICAgICAgICAgICAgICAgICAgIC50byhuZXcgR2VuZXJpY1R5cGU8T2JqZWN0R3JhcGhUcmFuc2Zvcm1lcjxPYmplY3RHcmFwaD4+KCkge30pCisgICAgICAgICAgICAgICAgICAgIC8vIFNjb3BlLgorICAgICAgICAgICAgICAgICAgICAuaW4oU2luZ2xldG9uLmNsYXNzKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL21veHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tb3h5L2ludGVybmFsL01veHlPYmplY3RQcm92aWRlci5qYXZhIGIvbWVkaWEvbW94eS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21veHkvaW50ZXJuYWwvTW94eU9iamVjdFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZkODNmMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL21veHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tb3h5L2ludGVybmFsL01veHlPYmplY3RQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1veHkuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLnNwaS5BYnN0cmFjdE9iamVjdFByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLnNwaS5PYmplY3RHcmFwaDsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpheGIuSkFYQkNvbnRleHQ7CitpbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuamF4Yi5KQVhCQ29udGV4dEZhY3Rvcnk7CitpbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuamF4Yi5KQVhCSGVscGVyOworaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpheGIuU3ViZ3JhcGg7CitpbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuamF4Yi5UeXBlTWFwcGluZ0luZm87CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK2ZpbmFsIGNsYXNzIE1veHlPYmplY3RQcm92aWRlciBleHRlbmRzIEFic3RyYWN0T2JqZWN0UHJvdmlkZXI8b3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuamF4Yi5PYmplY3RHcmFwaD4geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSkFYQkNvbnRleHQgSkFYQl9DT05URVhUOworCisgICAgc3RhdGljIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEpBWEJfQ09OVEVYVCA9IEpBWEJIZWxwZXIuZ2V0SkFYQkNvbnRleHQoCisgICAgICAgICAgICAgICAgICAgIEpBWEJDb250ZXh0RmFjdG9yeS5jcmVhdGVDb250ZXh0KG5ldyBUeXBlTWFwcGluZ0luZm9bXXt9LCBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpLCBudWxsKSk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEpBWEJFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuamF4Yi5PYmplY3RHcmFwaCB0cmFuc2Zvcm0oZmluYWwgT2JqZWN0R3JhcGggZ3JhcGgpIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0ZU9iamVjdEdyYXBoKGdyYXBoLmdldEVudGl0eUNsYXNzKCksIGdyYXBoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpheGIuT2JqZWN0R3JhcGggY3JlYXRlT2JqZWN0R3JhcGgoZmluYWwgQ2xhc3M8Pz4gZW50aXR5Q2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdEdyYXBoIG9iamVjdEdyYXBoKSB7CisgICAgICAgIGZpbmFsIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpheGIuT2JqZWN0R3JhcGggZ3JhcGggPSBKQVhCX0NPTlRFWFQuY3JlYXRlT2JqZWN0R3JhcGgoZW50aXR5Q2xhc3MpOworICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiBmaWVsZHMgPSBvYmplY3RHcmFwaC5nZXRGaWVsZHMoKTsKKworICAgICAgICBpZiAoIWZpZWxkcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGdyYXBoLmFkZEF0dHJpYnV0ZU5vZGVzKGZpZWxkcy50b0FycmF5KG5ldyBTdHJpbmdbZmllbGRzLnNpemUoKV0pKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdEdyYXBoPiBzdWJncmFwaHMgPSBvYmplY3RHcmFwaC5nZXRTdWJncmFwaHMoKTsKKyAgICAgICAgaWYgKCFzdWJncmFwaHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBjcmVhdGVTdWJncmFwaHMoZ3JhcGgsIG9iamVjdEdyYXBoLmdldEVudGl0eUNsYXNzKCksIHN1YmdyYXBocyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZ3JhcGg7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNyZWF0ZVN1YmdyYXBocyhmaW5hbCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qYXhiLk9iamVjdEdyYXBoIGdyYXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gZW50aXR5Q2xhc3MsIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdEdyYXBoPiBlbnRpdHlTdWJncmFwaHMpIHsKKyAgICAgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8U3RyaW5nLCBPYmplY3RHcmFwaD4gZW50cnkgOiBlbnRpdHlTdWJncmFwaHMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZpZWxkTmFtZSA9IGVudHJ5LmdldEtleSgpOworCisgICAgICAgICAgICBmaW5hbCBTdWJncmFwaCBzdWJncmFwaCA9IGdyYXBoLmFkZFN1YmdyYXBoKGZpZWxkTmFtZSk7CisgICAgICAgICAgICBmaW5hbCBPYmplY3RHcmFwaCBlbnRpdHlHcmFwaCA9IGVudHJ5LmdldFZhbHVlKCk7CisKKyAgICAgICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IGZpZWxkcyA9IGVudGl0eUdyYXBoLmdldEZpZWxkcyhmaWVsZE5hbWUpOworICAgICAgICAgICAgaWYgKCFmaWVsZHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgc3ViZ3JhcGguYWRkQXR0cmlidXRlTm9kZXMoZmllbGRzLnRvQXJyYXkobmV3IFN0cmluZ1tmaWVsZHMuc2l6ZSgpXSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3RHcmFwaD4gc3ViZ3JhcGhzID0gZW50aXR5R3JhcGguZ2V0U3ViZ3JhcGhzKGZpZWxkTmFtZSk7CisgICAgICAgICAgICBpZiAoIXN1YmdyYXBocy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiBzdWJFbnRpdHlDbGFzcyA9IGVudGl0eUdyYXBoLmdldEVudGl0eUNsYXNzKCk7CisKKyAgICAgICAgICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiBwcm9jZXNzZWQgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b24oc3ViZ3JhcGhJZGVudGlmaWVyKGVudGl0eUNsYXNzLCBmaWVsZE5hbWUsIHN1YkVudGl0eUNsYXNzKSk7CisgICAgICAgICAgICAgICAgY3JlYXRlU3ViZ3JhcGhzKGZpZWxkTmFtZSwgc3ViZ3JhcGgsIHN1YkVudGl0eUNsYXNzLCBzdWJncmFwaHMsIHByb2Nlc3NlZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlU3ViZ3JhcGhzKGZpbmFsIFN0cmluZyBwYXJlbnQsIGZpbmFsIFN1YmdyYXBoIGdyYXBoLCBmaW5hbCBDbGFzczw/PiBlbnRpdHlDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdEdyYXBoPiBlbnRpdHlTdWJncmFwaHMsIGZpbmFsIFNldDxTdHJpbmc+IHByb2Nlc3NlZCkgeworICAgICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdEdyYXBoPiBlbnRyeSA6IGVudGl0eVN1YmdyYXBocy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZmllbGROYW1lID0gZW50cnkuZ2V0S2V5KCk7CisKKyAgICAgICAgICAgIGZpbmFsIFN1YmdyYXBoIHN1YmdyYXBoID0gZ3JhcGguYWRkU3ViZ3JhcGgoZmllbGROYW1lKTsKKyAgICAgICAgICAgIGZpbmFsIE9iamVjdEdyYXBoIGVudGl0eUdyYXBoID0gZW50cnkuZ2V0VmFsdWUoKTsKKworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBhdGggPSBwYXJlbnQgKyAiLiIgKyBmaWVsZE5hbWU7CisKKyAgICAgICAgICAgIGZpbmFsIFNldDxTdHJpbmc+IGZpZWxkcyA9IGVudGl0eUdyYXBoLmdldEZpZWxkcyhwYXRoKTsKKyAgICAgICAgICAgIGlmICghZmllbGRzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHN1YmdyYXBoLmFkZEF0dHJpYnV0ZU5vZGVzKGZpZWxkcy50b0FycmF5KG5ldyBTdHJpbmdbZmllbGRzLnNpemUoKV0pKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0R3JhcGg+IHN1YmdyYXBocyA9IGVudGl0eUdyYXBoLmdldFN1YmdyYXBocyhwYXRoKTsKKyAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IHN1YkVudGl0eUNsYXNzID0gZW50aXR5R3JhcGguZ2V0RW50aXR5Q2xhc3MoKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcm9jZXNzZWRTdWJncmFwaCA9IHN1YmdyYXBoSWRlbnRpZmllcihlbnRpdHlDbGFzcywgZmllbGROYW1lLCBzdWJFbnRpdHlDbGFzcyk7CisKKyAgICAgICAgICAgIGlmICghc3ViZ3JhcGhzLmlzRW1wdHkoKSAmJiAhcHJvY2Vzc2VkLmNvbnRhaW5zKHByb2Nlc3NlZFN1YmdyYXBoKSkgeworICAgICAgICAgICAgICAgIC8vIGR1cGxpY2F0ZSBwcm9jZXNzZWQgc2V0IHNvIHRoYXQgZWxlbWVudHMgaW4gZGlmZmVyZW50IHN1YnRyZWVzIGFyZW4ndCBza2lwcGVkIChKLTYwNSkKKyAgICAgICAgICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiBzdWJQcm9jZXNzZWQgPSBpbW11dGFibGVTZXRPZihwcm9jZXNzZWQsIHByb2Nlc3NlZFN1YmdyYXBoKTsKKyAgICAgICAgICAgICAgICBjcmVhdGVTdWJncmFwaHMocGF0aCwgc3ViZ3JhcGgsIHN1YkVudGl0eUNsYXNzLCBzdWJncmFwaHMsIHN1YlByb2Nlc3NlZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9tb3h5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbW94eS9pbnRlcm5hbC9wYWNrYWdlLWluZm8uamF2YSBiL21lZGlhL21veHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tb3h5L2ludGVybmFsL3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4MzVkMmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tb3h5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbW94eS9pbnRlcm5hbC9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvKioKKyAqIEplcnNleSBpbnRlcm5hbCBjbGFzc2VzIHN1cHBvcnRpbmcgSlNPTiBhbmQgWE1MIG1lZGlhIHR5cGUgcHJvY2Vzc2luZyBiYXNlZCBvbiBNb3h5LgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1veHkuaW50ZXJuYWw7CmRpZmYgLS1naXQgYS9tZWRpYS9tb3h5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbW94eS9qc29uL01veHlKc29uQ29uZmlnLmphdmEgYi9tZWRpYS9tb3h5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbW94eS9qc29uL01veHlKc29uQ29uZmlnLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ1ZDMzNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL21veHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tb3h5L2pzb24vTW94eUpzb25Db25maWcuamF2YQpAQCAtMCwwICsxLDMwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb3h5Lmpzb247CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXgud3MucnMuZXh0LkNvbnRleHRSZXNvbHZlcjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5NYXJzaGFsbGVyOworCitpbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuamF4Yi5NYXJzaGFsbGVyUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qYXhiLlVubWFyc2hhbGxlclByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2Uub3htLlhNTENvbnN0YW50czsKKworLyoqCisgKiBDb25maWd1cmF0aW9uIGNsYXNzIGZvciBNT1h5IEpTT04gcHJvdmlkZXIuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBNb3h5SnNvbkNvbmZpZyB7CisKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWFyc2hhbGxlclByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IHVubWFyc2hhbGxlclByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgY29uZmlndXJhdGlvbiBmb3Ige0BsaW5rIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpheGIucnMuTU9YeUpzb25Qcm92aWRlcn0gYW5kIGluaXRpYWxpemUgZGVmYXVsdCBwcm9wZXJ0aWVzLgorICAgICAqCisgICAgICogQHNlZSAjTW94eUpzb25Db25maWcoYm9vbGVhbikKKyAgICAgKi8KKyAgICBwdWJsaWMgTW94eUpzb25Db25maWcoKSB7CisgICAgICAgIHRoaXModHJ1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGNvbmZpZ3VyYXRpb24gZm9yIHtAbGluayBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qYXhiLnJzLk1PWHlKc29uUHJvdmlkZXJ9LiBJZiB0aGUKKyAgICAgKiB7QGNvZGUgaW5pdERlZmF1bHRQcm9wZXJ0aWVzfSBpcyBzZXQgdG8ge0Bjb2RlIHRydWV9IHRoZW4gdGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIHNldDoKKyAgICAgKiA8dWw+CisgICAgICogICAgIDxsaT57QGxpbmsgamF2YXgueG1sLmJpbmQuTWFyc2hhbGxlciNKQVhCX0ZPUk1BVFRFRF9PVVRQVVR9IC0ge0Bjb2RlIGZhbHNlfTwvbGk+CisgICAgICogICAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuamF4Yi5KQVhCQ29udGV4dFByb3BlcnRpZXMjSlNPTl9JTkNMVURFX1JPT1R9IC0ge0Bjb2RlIGZhbHNlfTwvbGk+CisgICAgICogICAgIDxsaT57QGxpbmsgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuamF4Yi5NYXJzaGFsbGVyUHJvcGVydGllcyNKU09OX01BUlNIQUxfRU1QVFlfQ09MTEVDVElPTlN9IC0ge0Bjb2RlIHRydWV9PC9saT4KKyAgICAgKiAgICAgPGxpPntAbGluayBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qYXhiLkpBWEJDb250ZXh0UHJvcGVydGllcyNKU09OX05BTUVTUEFDRV9TRVBBUkFUT1J9IC0KKyAgICAgKiAgICAgICAgIHtAbGluayBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5veG0uWE1MQ29uc3RhbnRzI0RPVH08L2xpPgorICAgICAqIDwvdWw+CisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5pdERlZmF1bHRQcm9wZXJ0aWVzIGZsYWcgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGRlZmF1bHQgdmFsdWVzIG9mIHByb3BlcnRpZXMgbWVudGlvbmVkIGFib3ZlIHNob3VsZCBiZSBzZXQgb3IKKyAgICAgKiBub3QuCisgICAgICovCisgICAgcHVibGljIE1veHlKc29uQ29uZmlnKGZpbmFsIGJvb2xlYW4gaW5pdERlZmF1bHRQcm9wZXJ0aWVzKSB7CisgICAgICAgIGlmIChpbml0RGVmYXVsdFByb3BlcnRpZXMpIHsKKyAgICAgICAgICAgIC8vIGphdmF4LnhtbC5iaW5kLk1hcnNoYWxsZXIuSkFYQl9GT1JNQVRURURfT1VUUFVUCisgICAgICAgICAgICBzZXRGb3JtYXR0ZWRPdXRwdXQoZmFsc2UpOworCisgICAgICAgICAgICAvLyBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qYXhiLkpBWEJDb250ZXh0UHJvcGVydGllcy5KU09OX0lOQ0xVREVfUk9PVAorICAgICAgICAgICAgc2V0SW5jbHVkZVJvb3QoZmFsc2UpOworCisgICAgICAgICAgICAvLyBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qYXhiLk1hcnNoYWxsZXJQcm9wZXJ0aWVzLkpTT05fTUFSU0hBTF9FTVBUWV9DT0xMRUNUSU9OUworICAgICAgICAgICAgc2V0TWFyc2hhbEVtcHR5Q29sbGVjdGlvbnModHJ1ZSk7CisKKyAgICAgICAgICAgIC8vIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpheGIuSkFYQkNvbnRleHRQcm9wZXJ0aWVzLkpTT05fTkFNRVNQQUNFX1NFUEFSQVRPUgorICAgICAgICAgICAgc2V0TmFtZXNwYWNlU2VwYXJhdG9yKFhNTENvbnN0YW50cy5ET1QpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29weSBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aGF0IGNvbmZpZyB0byBtYWtlIGEgY29weSBvZi4KKyAgICAgKi8KKyAgICBwcml2YXRlIE1veHlKc29uQ29uZmlnKGZpbmFsIE1veHlKc29uQ29uZmlnIHRoYXQpIHsKKyAgICAgICAgdGhpcy5tYXJzaGFsbGVyUHJvcGVydGllcy5wdXRBbGwodGhhdC5tYXJzaGFsbGVyUHJvcGVydGllcyk7CisgICAgICAgIHRoaXMudW5tYXJzaGFsbGVyUHJvcGVydGllcy5wdXRBbGwodGhhdC51bm1hcnNoYWxsZXJQcm9wZXJ0aWVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBmb3IgYm90aCB7QGNvZGUgTWFyc2hhbGxlcn0gLyB7QGNvZGUgVW5tYXJzaGFsbGVyfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIG5hbWUgb2YgdGhlIHByb3BlcnR5LgorICAgICAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCisgICAgICogQHJldHVybiBhIHtAY29kZSBNb3h5SnNvbkNvbmZpZ30gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIE1veHlKc29uQ29uZmlnIHByb3BlcnR5KGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgbWFyc2hhbGxlclByb3BlcnR5KG5hbWUsIHZhbHVlKTsKKyAgICAgICAgdW5tYXJzaGFsbGVyUHJvcGVydHkobmFtZSwgdmFsdWUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBmb3IgdXNlZCB7QGNvZGUgTWFyc2hhbGxlcn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS4KKyAgICAgKiBAcGFyYW0gdmFsdWUgdmFsdWUgb2YgdGhlIHByb3BlcnR5LgorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgTW94eUpzb25Db25maWd9IGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBNb3h5SnNvbkNvbmZpZyBtYXJzaGFsbGVyUHJvcGVydHkoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBtYXJzaGFsbGVyUHJvcGVydGllcy5wdXQobmFtZSwgdmFsdWUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBmb3IgdXNlZCB7QGNvZGUgVW5tYXJzaGFsbGVyfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIG5hbWUgb2YgdGhlIHByb3BlcnR5LgorICAgICAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkuCisgICAgICogQHJldHVybiBhIHtAY29kZSBNb3h5SnNvbkNvbmZpZ30gaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIE1veHlKc29uQ29uZmlnIHVubWFyc2hhbGxlclByb3BlcnR5KGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgdW5tYXJzaGFsbGVyUHJvcGVydGllcy5wdXQobmFtZSwgdmFsdWUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgcHJvcGVydGllcyBmcm9tIHRoZSBnaXZlbiBtYXAgdG8gdGhlIGV4aXN0aW5nIG1hcnNoYWxsZXIgcHJvcGVydGllcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXJzaGFsbGVyUHJvcGVydGllcyBtYXAgb2YgbWFyc2hhbGxlciBwcm9wZXJ0aWVzLgorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgTW94eUpzb25Db25maWd9IGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBNb3h5SnNvbkNvbmZpZyBzZXRNYXJzaGFsbGVyUHJvcGVydGllcyhmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcnNoYWxsZXJQcm9wZXJ0aWVzKSB7CisgICAgICAgIHRoaXMubWFyc2hhbGxlclByb3BlcnRpZXMucHV0QWxsKG1hcnNoYWxsZXJQcm9wZXJ0aWVzKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIHByb3BlcnRpZXMgZnJvbSB0aGUgZ2l2ZW4gbWFwIHRvIHRoZSBleGlzdGluZyB1bm1hcnNoYWxsZXIgcHJvcGVydGllcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1bm1hcnNoYWxsZXJQcm9wZXJ0aWVzIG1hcCBvZiB1bm1hcnNoYWxsZXIgcHJvcGVydGllcy4KKyAgICAgKiBAcmV0dXJuIGEge0Bjb2RlIE1veHlKc29uQ29uZmlnfSBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTW94eUpzb25Db25maWcgc2V0VW5tYXJzaGFsbGVyUHJvcGVydGllcyhmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IHVubWFyc2hhbGxlclByb3BlcnRpZXMpIHsKKyAgICAgICAgdGhpcy51bm1hcnNoYWxsZXJQcm9wZXJ0aWVzLnB1dEFsbCh1bm1hcnNoYWxsZXJQcm9wZXJ0aWVzKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IG1hcnNoYWxsZXIgcHJvcGVydGllcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbXV0YWJsZSBtYXAgb2YgbWFyc2hhbGxlciBwcm9wZXJ0aWVzLgorICAgICAqLworICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldE1hcnNoYWxsZXJQcm9wZXJ0aWVzKCkgeworICAgICAgICByZXR1cm4gbWFyc2hhbGxlclByb3BlcnRpZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHVubWFyc2hhbGxlciBwcm9wZXJ0aWVzLgorICAgICAqCisgICAgICogQHJldHVybiBtdXRhYmxlIG1hcCBvZiB1bm1hcnNoYWxsZXIgcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRVbm1hcnNoYWxsZXJQcm9wZXJ0aWVzKCkgeworICAgICAgICByZXR1cm4gdW5tYXJzaGFsbGVyUHJvcGVydGllczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpheGIucnMuTU9YeUpzb25Qcm92aWRlciNnZXRBdHRyaWJ1dGVQcmVmaXgoKQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlUHJlZml4KCkgeworICAgICAgICByZXR1cm4gKFN0cmluZykgbWFyc2hhbGxlclByb3BlcnRpZXMuZ2V0KE1hcnNoYWxsZXJQcm9wZXJ0aWVzLkpTT05fQVRUUklCVVRFX1BSRUZJWCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qYXhiLnJzLk1PWHlKc29uUHJvdmlkZXIjc2V0QXR0cmlidXRlUHJlZml4KFN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgTW94eUpzb25Db25maWcgc2V0QXR0cmlidXRlUHJlZml4KGZpbmFsIFN0cmluZyBhdHRyaWJ1dGVQcmVmaXgpIHsKKyAgICAgICAgaWYgKGF0dHJpYnV0ZVByZWZpeCAhPSBudWxsKSB7CisgICAgICAgICAgICBtYXJzaGFsbGVyUHJvcGVydGllcy5wdXQoTWFyc2hhbGxlclByb3BlcnRpZXMuSlNPTl9BVFRSSUJVVEVfUFJFRklYLCBhdHRyaWJ1dGVQcmVmaXgpOworICAgICAgICAgICAgdW5tYXJzaGFsbGVyUHJvcGVydGllcy5wdXQoVW5tYXJzaGFsbGVyUHJvcGVydGllcy5KU09OX0FUVFJJQlVURV9QUkVGSVgsIGF0dHJpYnV0ZVByZWZpeCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtYXJzaGFsbGVyUHJvcGVydGllcy5yZW1vdmUoTWFyc2hhbGxlclByb3BlcnRpZXMuSlNPTl9BVFRSSUJVVEVfUFJFRklYKTsKKyAgICAgICAgICAgIHVubWFyc2hhbGxlclByb3BlcnRpZXMucmVtb3ZlKFVubWFyc2hhbGxlclByb3BlcnRpZXMuSlNPTl9BVFRSSUJVVEVfUFJFRklYKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpheGIucnMuTU9YeUpzb25Qcm92aWRlciNpc0Zvcm1hdHRlZE91dHB1dCgpCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNGb3JtYXR0ZWRPdXRwdXQoKSB7CisgICAgICAgIHJldHVybiAoQm9vbGVhbikgbWFyc2hhbGxlclByb3BlcnRpZXMuZ2V0KE1hcnNoYWxsZXIuSkFYQl9GT1JNQVRURURfT1VUUFVUKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpheGIucnMuTU9YeUpzb25Qcm92aWRlciNzZXRGb3JtYXR0ZWRPdXRwdXQoYm9vbGVhbikKKyAgICAgKi8KKyAgICBwdWJsaWMgTW94eUpzb25Db25maWcgc2V0Rm9ybWF0dGVkT3V0cHV0KGZpbmFsIGJvb2xlYW4gZm9ybWF0dGVkT3V0cHV0KSB7CisgICAgICAgIG1hcnNoYWxsZXJQcm9wZXJ0aWVzLnB1dChNYXJzaGFsbGVyLkpBWEJfRk9STUFUVEVEX09VVFBVVCwgZm9ybWF0dGVkT3V0cHV0KTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qYXhiLnJzLk1PWHlKc29uUHJvdmlkZXIjaXNJbmNsdWRlUm9vdCgpCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNJbmNsdWRlUm9vdCgpIHsKKyAgICAgICAgcmV0dXJuIChCb29sZWFuKSBtYXJzaGFsbGVyUHJvcGVydGllcy5nZXQoTWFyc2hhbGxlclByb3BlcnRpZXMuSlNPTl9JTkNMVURFX1JPT1QpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBzZWUgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuamF4Yi5ycy5NT1h5SnNvblByb3ZpZGVyI3NldEluY2x1ZGVSb290KGJvb2xlYW4pCisgICAgICovCisgICAgcHVibGljIE1veHlKc29uQ29uZmlnIHNldEluY2x1ZGVSb290KGZpbmFsIGJvb2xlYW4gaW5jbHVkZVJvb3QpIHsKKyAgICAgICAgbWFyc2hhbGxlclByb3BlcnRpZXMucHV0KE1hcnNoYWxsZXJQcm9wZXJ0aWVzLkpTT05fSU5DTFVERV9ST09ULCBpbmNsdWRlUm9vdCk7CisgICAgICAgIHVubWFyc2hhbGxlclByb3BlcnRpZXMucHV0KFVubWFyc2hhbGxlclByb3BlcnRpZXMuSlNPTl9JTkNMVURFX1JPT1QsIGluY2x1ZGVSb290KTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qYXhiLnJzLk1PWHlKc29uUHJvdmlkZXIjaXNNYXJzaGFsRW1wdHlDb2xsZWN0aW9ucygpCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNNYXJzaGFsRW1wdHlDb2xsZWN0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIChCb29sZWFuKSBtYXJzaGFsbGVyUHJvcGVydGllcy5nZXQoTWFyc2hhbGxlclByb3BlcnRpZXMuSlNPTl9NQVJTSEFMX0VNUFRZX0NPTExFQ1RJT05TKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpheGIucnMuTU9YeUpzb25Qcm92aWRlciNzZXRNYXJzaGFsRW1wdHlDb2xsZWN0aW9ucyhib29sZWFuKQorICAgICAqLworICAgIHB1YmxpYyBNb3h5SnNvbkNvbmZpZyBzZXRNYXJzaGFsRW1wdHlDb2xsZWN0aW9ucyhmaW5hbCBib29sZWFuIG1hcnNoYWxFbXB0eUNvbGxlY3Rpb25zKSB7CisgICAgICAgIG1hcnNoYWxsZXJQcm9wZXJ0aWVzLnB1dChNYXJzaGFsbGVyUHJvcGVydGllcy5KU09OX01BUlNIQUxfRU1QVFlfQ09MTEVDVElPTlMsIG1hcnNoYWxFbXB0eUNvbGxlY3Rpb25zKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qYXhiLnJzLk1PWHlKc29uUHJvdmlkZXIjZ2V0TmFtZXNwYWNlUHJlZml4TWFwcGVyKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXROYW1lc3BhY2VQcmVmaXhNYXBwZXIoKSB7CisgICAgICAgIHJldHVybiAoTWFwPFN0cmluZywgU3RyaW5nPikgbWFyc2hhbGxlclByb3BlcnRpZXMuZ2V0KE1hcnNoYWxsZXJQcm9wZXJ0aWVzLk5BTUVTUEFDRV9QUkVGSVhfTUFQUEVSKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpheGIucnMuTU9YeUpzb25Qcm92aWRlciNzZXROYW1lc3BhY2VQcmVmaXhNYXBwZXIoamF2YS51dGlsLk1hcCkKKyAgICAgKi8KKyAgICBwdWJsaWMgTW94eUpzb25Db25maWcgc2V0TmFtZXNwYWNlUHJlZml4TWFwcGVyKGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gbmFtZXNwYWNlUHJlZml4TWFwcGVyKSB7CisgICAgICAgIGlmIChuYW1lc3BhY2VQcmVmaXhNYXBwZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbWFyc2hhbGxlclByb3BlcnRpZXMucHV0KE1hcnNoYWxsZXJQcm9wZXJ0aWVzLk5BTUVTUEFDRV9QUkVGSVhfTUFQUEVSLCBuYW1lc3BhY2VQcmVmaXhNYXBwZXIpOworICAgICAgICAgICAgdW5tYXJzaGFsbGVyUHJvcGVydGllcy5wdXQoVW5tYXJzaGFsbGVyUHJvcGVydGllcy5KU09OX05BTUVTUEFDRV9QUkVGSVhfTUFQUEVSLCBuYW1lc3BhY2VQcmVmaXhNYXBwZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWFyc2hhbGxlclByb3BlcnRpZXMucmVtb3ZlKE1hcnNoYWxsZXJQcm9wZXJ0aWVzLk5BTUVTUEFDRV9QUkVGSVhfTUFQUEVSKTsKKyAgICAgICAgICAgIHVubWFyc2hhbGxlclByb3BlcnRpZXMucmVtb3ZlKFVubWFyc2hhbGxlclByb3BlcnRpZXMuSlNPTl9OQU1FU1BBQ0VfUFJFRklYX01BUFBFUik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qYXhiLnJzLk1PWHlKc29uUHJvdmlkZXIjZ2V0TmFtZXNwYWNlU2VwYXJhdG9yKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgY2hhciBnZXROYW1lc3BhY2VTZXBhcmF0b3IoKSB7CisgICAgICAgIHJldHVybiAoQ2hhcmFjdGVyKSBtYXJzaGFsbGVyUHJvcGVydGllcy5nZXQoTWFyc2hhbGxlclByb3BlcnRpZXMuSlNPTl9OQU1FU1BBQ0VfU0VQQVJBVE9SKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpheGIucnMuTU9YeUpzb25Qcm92aWRlciNzZXROYW1lc3BhY2VTZXBhcmF0b3IoY2hhcikKKyAgICAgKi8KKyAgICBwdWJsaWMgTW94eUpzb25Db25maWcgc2V0TmFtZXNwYWNlU2VwYXJhdG9yKGZpbmFsIGNoYXIgbmFtZXNwYWNlU2VwYXJhdG9yKSB7CisgICAgICAgIG1hcnNoYWxsZXJQcm9wZXJ0aWVzLnB1dChNYXJzaGFsbGVyUHJvcGVydGllcy5KU09OX05BTUVTUEFDRV9TRVBBUkFUT1IsIG5hbWVzcGFjZVNlcGFyYXRvcik7CisgICAgICAgIHVubWFyc2hhbGxlclByb3BlcnRpZXMucHV0KFVubWFyc2hhbGxlclByb3BlcnRpZXMuSlNPTl9OQU1FU1BBQ0VfU0VQQVJBVE9SLCBuYW1lc3BhY2VTZXBhcmF0b3IpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAc2VlIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpheGIucnMuTU9YeUpzb25Qcm92aWRlciNnZXRWYWx1ZVdyYXBwZXIoKQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWVXcmFwcGVyKCkgeworICAgICAgICByZXR1cm4gKFN0cmluZykgbWFyc2hhbGxlclByb3BlcnRpZXMuZ2V0KE1hcnNoYWxsZXJQcm9wZXJ0aWVzLkpTT05fVkFMVUVfV1JBUFBFUik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHNlZSBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qYXhiLnJzLk1PWHlKc29uUHJvdmlkZXIjc2V0VmFsdWVXcmFwcGVyKFN0cmluZykKKyAgICAgKi8KKyAgICBwdWJsaWMgTW94eUpzb25Db25maWcgc2V0VmFsdWVXcmFwcGVyKGZpbmFsIFN0cmluZyB2YWx1ZVdyYXBwZXIpIHsKKyAgICAgICAgaWYgKHZhbHVlV3JhcHBlciAhPSBudWxsKSB7CisgICAgICAgICAgICBtYXJzaGFsbGVyUHJvcGVydGllcy5wdXQoTWFyc2hhbGxlclByb3BlcnRpZXMuSlNPTl9WQUxVRV9XUkFQUEVSLCB2YWx1ZVdyYXBwZXIpOworICAgICAgICAgICAgdW5tYXJzaGFsbGVyUHJvcGVydGllcy5wdXQoVW5tYXJzaGFsbGVyUHJvcGVydGllcy5KU09OX1ZBTFVFX1dSQVBQRVIsIHZhbHVlV3JhcHBlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtYXJzaGFsbGVyUHJvcGVydGllcy5yZW1vdmUoTWFyc2hhbGxlclByb3BlcnRpZXMuSlNPTl9WQUxVRV9XUkFQUEVSKTsKKyAgICAgICAgICAgIHVubWFyc2hhbGxlclByb3BlcnRpZXMucmVtb3ZlKFVubWFyc2hhbGxlclByb3BlcnRpZXMuSlNPTl9WQUxVRV9XUkFQUEVSKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSB7QGxpbmsgQ29udGV4dFJlc29sdmVyIGNvbnRleHQgcmVzb2x2ZXJ9IGZvciBhIGN1cnJlbnQgc3RhdGUgb2YgdGhpcyB7QGNvZGUgTW94eUpzb25Db25maWd9LgorICAgICAqCisgICAgICogQHJldHVybiBjb250ZXh0IHJlc29sdmVyIGZvciB0aGlzIGNvbmZpZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGV4dFJlc29sdmVyPE1veHlKc29uQ29uZmlnPiByZXNvbHZlcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDb250ZXh0UmVzb2x2ZXI8TW94eUpzb25Db25maWc+KCkgeworCisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIE1veHlKc29uQ29uZmlnIGNvbmZpZyA9IG5ldyBNb3h5SnNvbkNvbmZpZyhNb3h5SnNvbkNvbmZpZy50aGlzKTsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgTW94eUpzb25Db25maWcgZ2V0Q29udGV4dChmaW5hbCBDbGFzczw/PiB0eXBlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9tb3h5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbW94eS9qc29uL01veHlKc29uRmVhdHVyZS5qYXZhIGIvbWVkaWEvbW94eS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21veHkvanNvbi9Nb3h5SnNvbkZlYXR1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzNiNzI1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbW94eS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21veHkvanNvbi9Nb3h5SnNvbkZlYXR1cmUuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1veHkuanNvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLlByaW9yaXRpZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmVDb250ZXh0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuQ29tbW9uUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5JbnRlcm5hbFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5Qcm9wZXJ0aWVzSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLkVudGl0eUZpbHRlcmluZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW94eS5pbnRlcm5hbC5Nb3h5RmlsdGVyaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb3h5Lmpzb24uaW50ZXJuYWwuQ29uZmlndXJhYmxlTW94eUpzb25Qcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb3h5Lmpzb24uaW50ZXJuYWwuRmlsdGVyaW5nTW94eUpzb25Qcm92aWRlcjsKKworLyoqCisgKiBGZWF0dXJlIHVzZWQgdG8gcmVnaXN0ZXIgTU9YeSBKU09OIHByb3ZpZGVycy4KKyAqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBNb3h5SnNvbkZlYXR1cmUgaW1wbGVtZW50cyBGZWF0dXJlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX0ZFQVRVUkUgPSBNb3h5SnNvbkZlYXR1cmUuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlKGZpbmFsIEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWcgPSBjb250ZXh0LmdldENvbmZpZ3VyYXRpb24oKTsKKworICAgICAgICBpZiAoQ29tbW9uUHJvcGVydGllcy5nZXRWYWx1ZShjb25maWcuZ2V0UHJvcGVydGllcygpLCBjb25maWcuZ2V0UnVudGltZVR5cGUoKSwKKyAgICAgICAgICAgICAgICBDb21tb25Qcm9wZXJ0aWVzLk1PWFlfSlNPTl9GRUFUVVJFX0RJU0FCTEUsIEJvb2xlYW4uRkFMU0UsIEJvb2xlYW4uY2xhc3MpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBTdHJpbmcganNvbkZlYXR1cmUgPSBDb21tb25Qcm9wZXJ0aWVzLmdldFZhbHVlKGNvbmZpZy5nZXRQcm9wZXJ0aWVzKCksIGNvbmZpZy5nZXRSdW50aW1lVHlwZSgpLAorICAgICAgICAgICAgICAgIEludGVybmFsUHJvcGVydGllcy5KU09OX0ZFQVRVUkUsIEpTT05fRkVBVFVSRSwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgLy8gT3RoZXIgSlNPTiBwcm92aWRlcnMgcmVnaXN0ZXJlZC4KKyAgICAgICAgaWYgKCFKU09OX0ZFQVRVUkUuZXF1YWxzSWdub3JlQ2FzZShqc29uRmVhdHVyZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIERpc2FibGUgb3RoZXIgSlNPTiBwcm92aWRlcnMuCisgICAgICAgIGNvbnRleHQucHJvcGVydHkoUHJvcGVydGllc0hlbHBlci5nZXRQcm9wZXJ0eU5hbWVGb3JSdW50aW1lKEludGVybmFsUHJvcGVydGllcy5KU09OX0ZFQVRVUkUsIGNvbmZpZy5nZXRSdW50aW1lVHlwZSgpKSwKKyAgICAgICAgICAgICAgICBKU09OX0ZFQVRVUkUpOworCisgICAgICAgIC8vIFNldCBhIHNsaWdodGx5IGxvd2VyIHByaW9yaXR5IG9mIHdvcmtlcnMgdGhhbiBKU09OLVAgc28gTU9YeSBpcyBub3QgcGljay1lZCB1cCBmb3IgSnNvblN0cnVjdHVyZXMgKGlmIGJvdGggYXJlIHVzZWQpLgorICAgICAgICBmaW5hbCBpbnQgd29ya2VyUHJpb3JpdHkgPSBQcmlvcml0aWVzLlVTRVIgKyAyMDAwOworCisgICAgICAgIGlmIChFbnRpdHlGaWx0ZXJpbmdGZWF0dXJlLmVuYWJsZWQoY29uZmlnKSkgeworICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihNb3h5RmlsdGVyaW5nRmVhdHVyZS5jbGFzcyk7CisgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKEZpbHRlcmluZ01veHlKc29uUHJvdmlkZXIuY2xhc3MsIHdvcmtlclByaW9yaXR5KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoQ29uZmlndXJhYmxlTW94eUpzb25Qcm92aWRlci5jbGFzcywgd29ya2VyUHJpb3JpdHkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbW94eS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21veHkvanNvbi9pbnRlcm5hbC9Db25maWd1cmFibGVNb3h5SnNvblByb3ZpZGVyLmphdmEgYi9tZWRpYS9tb3h5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbW94eS9qc29uL2ludGVybmFsL0NvbmZpZ3VyYWJsZU1veHlKc29uUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWE5MTkyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbW94eS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21veHkvanNvbi9pbnRlcm5hbC9Db25maWd1cmFibGVNb3h5SnNvblByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubW94eS5qc29uLmludGVybmFsOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuQ29udGV4dFJlc29sdmVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcnM7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5NYXJzaGFsbGVyOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLlByb3BlcnR5RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLlVubWFyc2hhbGxlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmludGVybmFsLmNvcmUuaGVscGVyLkNvcmVDbGFzc0NvbnN0YW50czsKK2ltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qYXhiLk1hcnNoYWxsZXJQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpheGIuVW5tYXJzaGFsbGVyUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qYXhiLnJzLk1PWHlKc29uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5SZWZsZWN0aW9uSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1veHkuanNvbi5Nb3h5SnNvbkNvbmZpZzsKKworLyoqCisgKiBKZXJzZXkgc3BlY2lmaWMge0BsaW5rIE1PWHlKc29uUHJvdmlkZXJ9IHRoYXQgY2FuIGJlIGNvbmZpZ3VyZWQgdmlhIHtAY29kZSBDb250ZXh0UmVzb2x2ZXI8SnNvbk1veHlDb25maWd1cmF0aW9uPn0gaW5zdGFuY2UuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BTaW5nbGV0b24KK3B1YmxpYyBjbGFzcyBDb25maWd1cmFibGVNb3h5SnNvblByb3ZpZGVyIGV4dGVuZHMgTU9YeUpzb25Qcm92aWRlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBNQVJTSEFMTEVSX1BST1BFUlRZX05BTUVTOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IFVOTUFSU0hBTExFUl9QUk9QRVJUWV9OQU1FUzsKKworICAgIHN0YXRpYyB7CisgICAgICAgIE1BUlNIQUxMRVJfUFJPUEVSVFlfTkFNRVMgPSBnZXRQcm9wZXJ0eU5hbWVzKE1hcnNoYWxsZXJQcm9wZXJ0aWVzLmNsYXNzKTsKKyAgICAgICAgVU5NQVJTSEFMTEVSX1BST1BFUlRZX05BTUVTID0gZ2V0UHJvcGVydHlOYW1lcyhVbm1hcnNoYWxsZXJQcm9wZXJ0aWVzLmNsYXNzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTZXQ8U3RyaW5nPiBnZXRQcm9wZXJ0eU5hbWVzKGZpbmFsIENsYXNzPD8+IHByb3BlcnRpZXNDbGFzcykgeworICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiBwcm9wZXJ0eU5hbWVzID0gbmV3IEhhc2hTZXQ8PigpOworCisgICAgICAgIGZvciAoZmluYWwgRmllbGQgZmllbGQgOiBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChSZWZsZWN0aW9uSGVscGVyLmdldERlY2xhcmVkRmllbGRzUEEocHJvcGVydGllc0NsYXNzKSkpIHsKKyAgICAgICAgICAgIGlmIChTdHJpbmcuY2xhc3MgPT0gZmllbGQuZ2V0VHlwZSgpICYmIE1vZGlmaWVyLmlzU3RhdGljKGZpZWxkLmdldE1vZGlmaWVycygpKSkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZXMuYWRkKChTdHJpbmcpIGZpZWxkLmdldChudWxsKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE5PT1AuCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHByb3BlcnR5TmFtZXM7CisgICAgfQorCisgICAgQENvbnRleHQKKyAgICBwcml2YXRlIFByb3ZpZGVycyBwcm92aWRlcnM7CisKKyAgICBAQ29udGV4dAorICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbiBjb25maWc7CisKKyAgICBwcml2YXRlIE1veHlKc29uQ29uZmlnIGdsb2JhbENvbmZpZzsKKworICAgIHByaXZhdGUgTW94eUpzb25Db25maWcgZ2V0R2xvYmFsQ29uZmlnKCkgeworICAgICAgICBpZiAoZ2xvYmFsQ29uZmlnID09IG51bGwpIHsKKyAgICAgICAgICAgIGdsb2JhbENvbmZpZyA9IG5ldyBNb3h5SnNvbkNvbmZpZygpCisgICAgICAgICAgICAgICAgICAgIC5zZXRNYXJzaGFsbGVyUHJvcGVydGllcyhnZXRDb25maWdQcm9wZXJ0aWVzKGNvbmZpZywgTUFSU0hBTExFUl9QUk9QRVJUWV9OQU1FUykpCisgICAgICAgICAgICAgICAgICAgIC5zZXRVbm1hcnNoYWxsZXJQcm9wZXJ0aWVzKGdldENvbmZpZ1Byb3BlcnRpZXMoY29uZmlnLCBVTk1BUlNIQUxMRVJfUFJPUEVSVFlfTkFNRVMpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZ2xvYmFsQ29uZmlnOworICAgIH0KKworICAgIHByaXZhdGUgTWFwPFN0cmluZywgT2JqZWN0PiBnZXRDb25maWdQcm9wZXJ0aWVzKGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlnLCBmaW5hbCBTZXQ8U3RyaW5nPiBwcm9wZXJ0eU5hbWVzKSB7CisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPD4oKTsKKworICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUgOiBwcm9wZXJ0eU5hbWVzKSB7CisgICAgICAgICAgICBmaW5hbCBPYmplY3QgcHJvcGVydHkgPSBjb25maWcuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKKyAgICAgICAgICAgIGlmIChwcm9wZXJ0eSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcHJvcGVydGllcy5wdXQocHJvcGVydHlOYW1lLCBwcm9wZXJ0eSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcHJvcGVydGllczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBwcmVSZWFkRnJvbShmaW5hbCBDbGFzczxPYmplY3Q+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLCBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVW5tYXJzaGFsbGVyIHVubWFyc2hhbGxlcikgdGhyb3dzIEpBWEJFeGNlcHRpb24geworICAgICAgICBzdXBlci5wcmVSZWFkRnJvbSh0eXBlLCBnZW5lcmljVHlwZSwgYW5ub3RhdGlvbnMsIG1lZGlhVHlwZSwgaHR0cEhlYWRlcnMsIHVubWFyc2hhbGxlcik7CisKKyAgICAgICAgaW5pdGlhbGl6ZVVubWFyc2hhbGxlcih1bm1hcnNoYWxsZXIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHByZVdyaXRlVG8oZmluYWwgT2JqZWN0IG9iamVjdCwgZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWFyc2hhbGxlciBtYXJzaGFsbGVyKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnByZVdyaXRlVG8ob2JqZWN0LCB0eXBlLCBnZW5lcmljVHlwZSwgYW5ub3RhdGlvbnMsIG1lZGlhVHlwZSwgaHR0cEhlYWRlcnMsIG1hcnNoYWxsZXIpOworCisgICAgICAgIGluaXRpYWxpemVNYXJzaGFsbGVyKG1hcnNoYWxsZXIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplVW5tYXJzaGFsbGVyKGZpbmFsIFVubWFyc2hhbGxlciB1bm1hcnNoYWxsZXIpIHRocm93cyBQcm9wZXJ0eUV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoZmluYWwgTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0eSA6IGdldFByb3BlcnRpZXMoZmFsc2UpLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIHVubWFyc2hhbGxlci5zZXRQcm9wZXJ0eShwcm9wZXJ0eS5nZXRLZXkoKSwgcHJvcGVydHkuZ2V0VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZU1hcnNoYWxsZXIoZmluYWwgTWFyc2hhbGxlciBtYXJzaGFsbGVyKSB0aHJvd3MgUHJvcGVydHlFeGNlcHRpb24geworICAgICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxTdHJpbmcsIE9iamVjdD4gcHJvcGVydHkgOiBnZXRQcm9wZXJ0aWVzKHRydWUpLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIG1hcnNoYWxsZXIuc2V0UHJvcGVydHkocHJvcGVydHkuZ2V0S2V5KCksIHByb3BlcnR5LmdldFZhbHVlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFByb3BlcnRpZXMoZmluYWwgYm9vbGVhbiBmb3JNYXJzaGFsbGVyKSB7CisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPD4oZm9yTWFyc2hhbGxlcgorICAgICAgICAgICAgICAgID8gZ2V0R2xvYmFsQ29uZmlnKCkuZ2V0TWFyc2hhbGxlclByb3BlcnRpZXMoKQorICAgICAgICAgICAgICAgIDogZ2V0R2xvYmFsQ29uZmlnKCkuZ2V0VW5tYXJzaGFsbGVyUHJvcGVydGllcygpKTsKKworICAgICAgICBmaW5hbCBDb250ZXh0UmVzb2x2ZXI8TW94eUpzb25Db25maWc+IGNvbnRleHRSZXNvbHZlciA9CisgICAgICAgICAgICAgICAgcHJvdmlkZXJzLmdldENvbnRleHRSZXNvbHZlcihNb3h5SnNvbkNvbmZpZy5jbGFzcywgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSk7CisgICAgICAgIGlmIChjb250ZXh0UmVzb2x2ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgTW94eUpzb25Db25maWcganNvbkNvbmZpZ3VyYXRpb24gPSBjb250ZXh0UmVzb2x2ZXIuZ2V0Q29udGV4dChNb3h5SnNvbkNvbmZpZy5jbGFzcyk7CisKKyAgICAgICAgICAgIGlmIChqc29uQ29uZmlndXJhdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcHJvcGVydGllcy5wdXRBbGwoZm9yTWFyc2hhbGxlcgorICAgICAgICAgICAgICAgICAgICAgICAgPyBqc29uQ29uZmlndXJhdGlvbi5nZXRNYXJzaGFsbGVyUHJvcGVydGllcygpIDoganNvbkNvbmZpZ3VyYXRpb24uZ2V0VW5tYXJzaGFsbGVyUHJvcGVydGllcygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBwcm9wZXJ0aWVzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoZmluYWwgQ2xhc3M8Pz4gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiAhaXNQcmltaXRpdmVUeXBlKHR5cGUpCisgICAgICAgICAgICAgICAgJiYgc3VwZXIuaXNSZWFkYWJsZSh0eXBlLCBnZW5lcmljVHlwZSwgYW5ub3RhdGlvbnMsIG1lZGlhVHlwZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoZmluYWwgQ2xhc3M8Pz4gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiAhaXNQcmltaXRpdmVUeXBlKHR5cGUpCisgICAgICAgICAgICAgICAgJiYgc3VwZXIuaXNXcml0ZWFibGUodHlwZSwgZ2VuZXJpY1R5cGUsIGFubm90YXRpb25zLCBtZWRpYVR5cGUpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc1ByaW1pdGl2ZVR5cGUoZmluYWwgQ2xhc3M8Pz4gdHlwZSkgeworICAgICAgICByZXR1cm4gQ29yZUNsYXNzQ29uc3RhbnRzLlNUUklORyA9PSB0eXBlCisgICAgICAgICAgICAgICAgfHwgQ29yZUNsYXNzQ29uc3RhbnRzLlBDSEFSID09IHR5cGUgfHwgQ29yZUNsYXNzQ29uc3RhbnRzLkNIQVIgPT0gdHlwZQorICAgICAgICAgICAgICAgIHx8IENvcmVDbGFzc0NvbnN0YW50cy5QU0hPUlQgPT0gdHlwZSB8fCBDb3JlQ2xhc3NDb25zdGFudHMuU0hPUlQgPT0gdHlwZQorICAgICAgICAgICAgICAgIHx8IENvcmVDbGFzc0NvbnN0YW50cy5QSU5UID09IHR5cGUgfHwgQ29yZUNsYXNzQ29uc3RhbnRzLklOVEVHRVIgPT0gdHlwZQorICAgICAgICAgICAgICAgIHx8IENvcmVDbGFzc0NvbnN0YW50cy5QTE9ORyA9PSB0eXBlIHx8IENvcmVDbGFzc0NvbnN0YW50cy5MT05HID09IHR5cGUKKyAgICAgICAgICAgICAgICB8fCBDb3JlQ2xhc3NDb25zdGFudHMuUEZMT0FUID09IHR5cGUgfHwgQ29yZUNsYXNzQ29uc3RhbnRzLkZMT0FUID09IHR5cGUKKyAgICAgICAgICAgICAgICB8fCBDb3JlQ2xhc3NDb25zdGFudHMuUERPVUJMRSA9PSB0eXBlIHx8IENvcmVDbGFzc0NvbnN0YW50cy5ET1VCTEUgPT0gdHlwZQorICAgICAgICAgICAgICAgIHx8IENvcmVDbGFzc0NvbnN0YW50cy5QQk9PTEVBTiA9PSB0eXBlIHx8IENvcmVDbGFzc0NvbnN0YW50cy5CT09MRUFOID09IHR5cGUKKyAgICAgICAgICAgICAgICB8fCBDb3JlQ2xhc3NDb25zdGFudHMuUEJZVEUgPT0gdHlwZSB8fCBDb3JlQ2xhc3NDb25zdGFudHMuQllURSA9PSB0eXBlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL21veHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tb3h5L2pzb24vaW50ZXJuYWwvRmlsdGVyaW5nTW94eUpzb25Qcm92aWRlci5qYXZhIGIvbWVkaWEvbW94eS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21veHkvanNvbi9pbnRlcm5hbC9GaWx0ZXJpbmdNb3h5SnNvblByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZlZDg1YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL21veHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tb3h5L2pzb24vaW50ZXJuYWwvRmlsdGVyaW5nTW94eUpzb25Qcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubW94eS5qc29uLmludGVybmFsOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5NYXJzaGFsbGVyOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLlVubWFyc2hhbGxlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLnNwaS5PYmplY3RQcm92aWRlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpheGIuTWFyc2hhbGxlclByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuamF4Yi5PYmplY3RHcmFwaDsKKworLyoqCisgKiBFbnRpdHkgRGF0YSBGaWx0ZXJpbmcgcHJvdmlkZXIgYmFzZWQgb24gTU9YeSBKU09OIHByb3ZpZGVyLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAU2luZ2xldG9uCitwdWJsaWMgY2xhc3MgRmlsdGVyaW5nTW94eUpzb25Qcm92aWRlciBleHRlbmRzIENvbmZpZ3VyYWJsZU1veHlKc29uUHJvdmlkZXIgeworCisgICAgQEluamVjdAorICAgIHByaXZhdGUgUHJvdmlkZXI8T2JqZWN0UHJvdmlkZXI8T2JqZWN0R3JhcGg+PiBwcm92aWRlcjsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHByZVdyaXRlVG8oZmluYWwgT2JqZWN0IG9iamVjdCwgZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWFyc2hhbGxlciBtYXJzaGFsbGVyKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnByZVdyaXRlVG8ob2JqZWN0LCB0eXBlLCBnZW5lcmljVHlwZSwgYW5ub3RhdGlvbnMsIG1lZGlhVHlwZSwgaHR0cEhlYWRlcnMsIG1hcnNoYWxsZXIpOworCisgICAgICAgIC8vIEVudGl0eSBGaWx0ZXJpbmcuCisgICAgICAgIGlmIChtYXJzaGFsbGVyLmdldFByb3BlcnR5KE1hcnNoYWxsZXJQcm9wZXJ0aWVzLk9CSkVDVF9HUkFQSCkgPT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgT2JqZWN0IG9iamVjdEdyYXBoID0gcHJvdmlkZXIuZ2V0KCkuZ2V0RmlsdGVyaW5nT2JqZWN0KGdlbmVyaWNUeXBlLCB0cnVlLCBhbm5vdGF0aW9ucyk7CisKKyAgICAgICAgICAgIGlmIChvYmplY3RHcmFwaCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbWFyc2hhbGxlci5zZXRQcm9wZXJ0eShNYXJzaGFsbGVyUHJvcGVydGllcy5PQkpFQ1RfR1JBUEgsIG9iamVjdEdyYXBoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHByZVJlYWRGcm9tKGZpbmFsIENsYXNzPE9iamVjdD4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUsIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBVbm1hcnNoYWxsZXIgdW5tYXJzaGFsbGVyKSB0aHJvd3MgSkFYQkV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnByZVJlYWRGcm9tKHR5cGUsIGdlbmVyaWNUeXBlLCBhbm5vdGF0aW9ucywgbWVkaWFUeXBlLCBodHRwSGVhZGVycywgdW5tYXJzaGFsbGVyKTsKKworICAgICAgICAvLyBFbnRpdHkgRmlsdGVyaW5nLgorICAgICAgICBpZiAodW5tYXJzaGFsbGVyLmdldFByb3BlcnR5KE1hcnNoYWxsZXJQcm9wZXJ0aWVzLk9CSkVDVF9HUkFQSCkgPT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgT2JqZWN0IG9iamVjdEdyYXBoID0gcHJvdmlkZXIuZ2V0KCkuZ2V0RmlsdGVyaW5nT2JqZWN0KGdlbmVyaWNUeXBlLCBmYWxzZSwgYW5ub3RhdGlvbnMpOworCisgICAgICAgICAgICBpZiAob2JqZWN0R3JhcGggIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHVubWFyc2hhbGxlci5zZXRQcm9wZXJ0eShNYXJzaGFsbGVyUHJvcGVydGllcy5PQkpFQ1RfR1JBUEgsIG9iamVjdEdyYXBoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL21veHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tb3h5L2pzb24vaW50ZXJuYWwvTW94eUpzb25BdXRvRGlzY292ZXJhYmxlLmphdmEgYi9tZWRpYS9tb3h5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbW94eS9qc29uL2ludGVybmFsL01veHlKc29uQXV0b0Rpc2NvdmVyYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlY2JhNGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tb3h5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbW94eS9qc29uL2ludGVybmFsL01veHlKc29uQXV0b0Rpc2NvdmVyYWJsZS5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubW94eS5qc29uLmludGVybmFsOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlQ29udGV4dDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJpb3JpdHk7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5zcGkuQXV0b0Rpc2NvdmVyYWJsZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb3h5Lmpzb24uTW94eUpzb25GZWF0dXJlOworCisvKioKKyAqIHtAbGluayBBdXRvRGlzY292ZXJhYmxlfSByZWdpc3RlcmluZyB7QGxpbmsgTW94eUpzb25GZWF0dXJlfSBpZiB0aGlzIGZlYXR1cmUgaXMgbm90IGFscmVhZHkgcmVnaXN0ZXJlZC4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFByaW9yaXR5KEF1dG9EaXNjb3ZlcmFibGUuREVGQVVMVF9QUklPUklUWSAtIDEwMCkKK3B1YmxpYyBmaW5hbCBjbGFzcyBNb3h5SnNvbkF1dG9EaXNjb3ZlcmFibGUgaW1wbGVtZW50cyBBdXRvRGlzY292ZXJhYmxlIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShmaW5hbCBGZWF0dXJlQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGlmICghY29udGV4dC5nZXRDb25maWd1cmF0aW9uKCkuaXNSZWdpc3RlcmVkKE1veHlKc29uRmVhdHVyZS5jbGFzcykpIHsKKyAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoTW94eUpzb25GZWF0dXJlLmNsYXNzKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL21veHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tb3h5L2pzb24vaW50ZXJuYWwvcGFja2FnZS1pbmZvLmphdmEgYi9tZWRpYS9tb3h5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbW94eS9qc29uL2ludGVybmFsL3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkY2Y1MzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tb3h5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbW94eS9qc29uL2ludGVybmFsL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKKy8qKgorICogSmVyc2V5IGludGVybmFsIGNsYXNzZXMgc3VwcG9ydGluZyBKU09OIG1lZGlhIHR5cGUgcHJvY2Vzc2luZyBiYXNlZCBvbiBNb3h5LgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1veHkuanNvbi5pbnRlcm5hbDsKZGlmZiAtLWdpdCBhL21lZGlhL21veHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tb3h5L2pzb24vcGFja2FnZS1pbmZvLmphdmEgYi9tZWRpYS9tb3h5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbW94eS9qc29uL3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3YWVjZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tb3h5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbW94eS9qc29uL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKKy8qKgorICogSmVyc2V5IGNsYXNzZXMgc3VwcG9ydGluZyBKU09OIG1lZGlhIHR5cGUgcHJvY2Vzc2luZyBiYXNlZCBvbiBNb3h5LgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1veHkuanNvbjsKZGlmZiAtLWdpdCBhL21lZGlhL21veHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tb3h5L3htbC9Nb3h5Q29udGV4dFJlc29sdmVyLmphdmEgYi9tZWRpYS9tb3h5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbW94eS94bWwvTW94eUNvbnRleHRSZXNvbHZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MWQwMzQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tb3h5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbW94eS94bWwvTW94eUNvbnRleHRSZXNvbHZlci5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1veHkueG1sOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuQ29udGV4dFJlc29sdmVyOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpheGIuSkFYQkNvbnRleHRGYWN0b3J5OworaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpheGIuSkFYQkNvbnRleHRQcm9wZXJ0aWVzOworCisvKioKKyAqIHtAbGluayBDb250ZXh0UmVzb2x2ZXJ9IGltcGxlbWVudGF0aW9uIHdoaWNoIGNyZWF0ZXMgTU9YeSB7QGxpbmsgSkFYQkNvbnRleHR9LgorICoKKyAqIFRPRE86IGRlYWwgd2l0aCBjbGFzc2VzIE5PVCBhbm5vdGF0ZWQgd2l0aCBAWG1sUm9vdEVsZW1lbnQvQFhtbFR5cGUKKyAqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitjbGFzcyBNb3h5Q29udGV4dFJlc29sdmVyIGltcGxlbWVudHMgQ29udGV4dFJlc29sdmVyPEpBWEJDb250ZXh0PiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihNb3h5Q29udGV4dFJlc29sdmVyLmNsYXNzLmdldE5hbWUoKSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1PWFlfT1hNX01BUFBJTkdfRklMRV9OQU1FID0gImVjbGlwc2VsaW5rLW94bS54bWwiOworCisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG94bU1hcHBpbmdMb29rdXA7CisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXM7CisgICAgcHJpdmF0ZSBmaW5hbCBDbGFzc0xvYWRlciBjbGFzc0xvYWRlcjsKKyAgICBwcml2YXRlIGZpbmFsIENsYXNzW10gY2xhc3NlczsKKworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBjb25zdHJ1Y3RvciBjcmVhdGVzIHN0YW5kYXJkIHtAbGluayBKQVhCQ29udGV4dH0gd2l0aG91dCBhbnkgYWN0aXZhdGVkIGZlYXR1cmVzCisgICAgICogYW5kIHByb3BlcnRpZXMuIEN1cnJlbnQgY29udGV4dCB7QGxpbmsgQ2xhc3NMb2FkZXJ9IHdpbGwgYmUgdXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTW94eUNvbnRleHRSZXNvbHZlcigpIHsKKyAgICAgICAgdGhpcyhDb2xsZWN0aW9ucy48U3RyaW5nLCBPYmplY3Q+ZW1wdHlNYXAoKSwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIHdoaWNoIGFsbG93cyBNT1h5IHtAbGluayBKQVhCQ29udGV4dH0gY3VzdG9taXphdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzICAgICAgIHByb3BlcnRpZXMgdG8gYmUgcGFzc2VkIHRvCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAge0BsaW5rIEpBWEJDb250ZXh0RmFjdG9yeSNjcmVhdGVDb250ZXh0KENsYXNzW10sIGphdmEudXRpbC5NYXAsIENsYXNzTG9hZGVyKX0uIE1heSBiZSB7QGNvZGUgbnVsbH0uCisgICAgICogQHBhcmFtIGNsYXNzTG9hZGVyICAgICAgd2lsbCBiZSB1c2VkIHRvIGxvYWQgY2xhc3Nlcy4gSWYge0Bjb2RlIG51bGx9LCBjdXJyZW50IGNvbnRleHQge0BsaW5rIENsYXNzTG9hZGVyfSB3aWxsIGJlIHVzZWQuCisgICAgICogQHBhcmFtIG94bU1hcHBpbmdMb29rdXAgaWYge0Bjb2RlIHRydWV9LCBsb29rdXAgZm9yIGZpbGUgd2l0aCBjdXN0b20gbWFwcGluZ3Mgd2lsbCBiZSBwZXJmb3JtZWQuCisgICAgICogQHBhcmFtIGNsYXNzZXMgICAgICAgICAgYWRkaXRpb25hbCBjbGFzc2VzIHVzZWQgZm9yIGNyZWF0aW5nIHtAbGluayBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qYXhiLkpBWEJDb250ZXh0fS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTW94eUNvbnRleHRSZXNvbHZlcigKKyAgICAgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcywKKyAgICAgICAgICAgIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyLAorICAgICAgICAgICAgYm9vbGVhbiBveG1NYXBwaW5nTG9va3VwLAorICAgICAgICAgICAgQ2xhc3MuLi4gY2xhc3NlcykgeworICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzID09IG51bGwgPyBDb2xsZWN0aW9ucy48U3RyaW5nLCBPYmplY3Q+ZW1wdHlNYXAoKSA6IHByb3BlcnRpZXM7CisgICAgICAgIHRoaXMuY2xhc3NMb2FkZXIgPSAoY2xhc3NMb2FkZXIgPT0gbnVsbCA/IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkgOiBjbGFzc0xvYWRlcik7CisgICAgICAgIHRoaXMub3htTWFwcGluZ0xvb2t1cCA9IG94bU1hcHBpbmdMb29rdXA7CisgICAgICAgIHRoaXMuY2xhc3NlcyA9IGNsYXNzZXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEpBWEJDb250ZXh0IGdldENvbnRleHQoQ2xhc3M8Pz4gdHlwZSkgeworICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXNDb3B5ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KHByb3BlcnRpZXMpOworCisgICAgICAgIGlmIChveG1NYXBwaW5nTG9va3VwKSB7CisgICAgICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBlY2xpcHNlTGlua094bSA9IHR5cGUuZ2V0UmVzb3VyY2VBc1N0cmVhbShNT1hZX09YTV9NQVBQSU5HX0ZJTEVfTkFNRSk7CisgICAgICAgICAgICBpZiAoZWNsaXBzZUxpbmtPeG0gIT0gbnVsbCAmJiAhcHJvcGVydGllc0NvcHkuY29udGFpbnNLZXkoSkFYQkNvbnRleHRQcm9wZXJ0aWVzLk9YTV9NRVRBREFUQV9TT1VSQ0UpKSB7CisgICAgICAgICAgICAgICAgcHJvcGVydGllc0NvcHkucHV0KEpBWEJDb250ZXh0UHJvcGVydGllcy5PWE1fTUVUQURBVEFfU09VUkNFLCBlY2xpcHNlTGlua094bSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBDbGFzc1tdIHR5cGVBcnJheTsKKyAgICAgICAgaWYgKGNsYXNzZXMgIT0gbnVsbCAmJiBjbGFzc2VzLmxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIHR5cGVBcnJheSA9IG5ldyBDbGFzc1sxICsgY2xhc3Nlcy5sZW5ndGhdOworICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShjbGFzc2VzLCAwLCB0eXBlQXJyYXksIDAsIGNsYXNzZXMubGVuZ3RoKTsKKyAgICAgICAgICAgIHR5cGVBcnJheVt0eXBlQXJyYXkubGVuZ3RoIC0gMV0gPSB0eXBlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdHlwZUFycmF5ID0gbmV3IENsYXNzW117dHlwZX07CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgSkFYQkNvbnRleHQgY29udGV4dCA9IEpBWEJDb250ZXh0RmFjdG9yeS5jcmVhdGVDb250ZXh0KHR5cGVBcnJheSwgcHJvcGVydGllc0NvcHksIGNsYXNzTG9hZGVyKTsKKyAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuRklORSwgIlVzaW5nIEpBWEIgY29udGV4dCAiICsgY29udGV4dCk7CisgICAgICAgICAgICByZXR1cm4gY29udGV4dDsKKyAgICAgICAgfSBjYXRjaCAoSkFYQkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0dHRVIuZmluZSgiVW5hYmxlIHRvIGNyZWF0ZSBKQVhCIGNvbnRleHQuIik7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL21veHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tb3h5L3htbC9Nb3h5WG1sRmVhdHVyZS5qYXZhIGIvbWVkaWEvbW94eS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21veHkveG1sL01veHlYbWxGZWF0dXJlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk5NTYzMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL21veHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tb3h5L3htbC9Nb3h5WG1sRmVhdHVyZS5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubW94eS54bWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmVDb250ZXh0OworCisvKioKKyAqIEZlYXR1cmUgdXNlZCB0byByZWdpc3RlciBNT1h5IFhNTCBwcm92aWRlcnMuCisgKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIE1veHlYbWxGZWF0dXJlIGltcGxlbWVudHMgRmVhdHVyZSB7CisKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllczsKKyAgICBwcml2YXRlIGZpbmFsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyOworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBveG1NYXBwaW5nTG9va3VwOworICAgIHByaXZhdGUgZmluYWwgQ2xhc3NbXSBjbGFzc2VzOworCisgICAgLyoqCisgICAgICogRGVmYXVsdCBjb25zdHJ1Y3RvciBjcmVhdGVzIHN0YW5kYXJkIHtAbGluayBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qYXhiLkpBWEJDb250ZXh0fSB3aXRob3V0IGFueSBhY3RpdmF0ZWQgZmVhdHVyZXMKKyAgICAgKiBhbmQgcHJvcGVydGllcy4gQ3VycmVudCBjb250ZXh0IHtAbGluayBDbGFzc0xvYWRlcn0gd2lsbCBiZSB1c2VkLgorICAgICAqLworICAgIHB1YmxpYyBNb3h5WG1sRmVhdHVyZSgpIHsKKyAgICAgICAgdGhpcyhDb2xsZWN0aW9ucy48U3RyaW5nLCBPYmplY3Q+ZW1wdHlNYXAoKSwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKSwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIHdoaWNoIGFsbG93cyBNT1h5IHtAbGluayBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qYXhiLkpBWEJDb250ZXh0fSBjdXN0b21pemF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXNzZXMgYWRkaXRpb25hbCBjbGFzc2VzIHVzZWQgZm9yIGNyZWF0aW5nIHtAbGluayBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qYXhiLkpBWEJDb250ZXh0fS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTW94eVhtbEZlYXR1cmUoQ2xhc3M8Pz4uLi4gY2xhc3NlcykgeworICAgICAgICB0aGlzKENvbGxlY3Rpb25zLjxTdHJpbmcsIE9iamVjdD5lbXB0eU1hcCgpLCBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpLCBmYWxzZSwgY2xhc3Nlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3Igd2hpY2ggYWxsb3dzIE1PWHkge0BsaW5rIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpheGIuSkFYQkNvbnRleHR9IGN1c3RvbWl6YXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvcGVydGllcyAgICAgICBwcm9wZXJ0aWVzIHRvIGJlIHBhc3NlZCB0bworICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIHtAbGluayBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qYXhiLkpBWEJDb250ZXh0RmFjdG9yeSNjcmVhdGVDb250ZXh0KENsYXNzW10sIGphdmEudXRpbC5NYXAsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NMb2FkZXIpfS4gTWF5IGJlIHtAY29kZSBudWxsfS4KKyAgICAgKiBAcGFyYW0gY2xhc3NMb2FkZXIgICAgICB3aWxsIGJlIHVzZWQgdG8gbG9hZCBjbGFzc2VzLiBJZiB7QGNvZGUgbnVsbH0sIGN1cnJlbnQgY29udGV4dCB7QGxpbmsgQ2xhc3NMb2FkZXJ9IHdpbGwgYmUgdXNlZC4KKyAgICAgKiBAcGFyYW0gb3htTWFwcGluZ0xvb2t1cCBpZiB7QGNvZGUgdHJ1ZX0sIGxvb2t1cCBmb3IgZmlsZSB3aXRoIGN1c3RvbSBtYXBwaW5ncyB3aWxsIGJlIHBlcmZvcm1lZC4KKyAgICAgKiBAcGFyYW0gY2xhc3NlcyAgICAgICAgICBhZGRpdGlvbmFsIGNsYXNzZXMgdXNlZCBmb3IgY3JlYXRpbmcge0BsaW5rIG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpheGIuSkFYQkNvbnRleHR9LgorICAgICAqLworICAgIHB1YmxpYyBNb3h5WG1sRmVhdHVyZShNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMsIENsYXNzTG9hZGVyIGNsYXNzTG9hZGVyLCBib29sZWFuIG94bU1hcHBpbmdMb29rdXAsIENsYXNzLi4uIGNsYXNzZXMpIHsKKyAgICAgICAgdGhpcy5wcm9wZXJ0aWVzID0gKHByb3BlcnRpZXMgPT0gbnVsbCA/IENvbGxlY3Rpb25zLjxTdHJpbmcsIE9iamVjdD5lbXB0eU1hcCgpIDogcHJvcGVydGllcyk7CisgICAgICAgIHRoaXMuY2xhc3NMb2FkZXIgPSAoY2xhc3NMb2FkZXIgPT0gbnVsbCA/IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkgOiBjbGFzc0xvYWRlcik7CisgICAgICAgIHRoaXMub3htTWFwcGluZ0xvb2t1cCA9IG94bU1hcHBpbmdMb29rdXA7CisgICAgICAgIHRoaXMuY2xhc3NlcyA9IGNsYXNzZXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlKEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgY29udGV4dC5yZWdpc3RlcihuZXcgTW94eUNvbnRleHRSZXNvbHZlcihwcm9wZXJ0aWVzLCBjbGFzc0xvYWRlciwgb3htTWFwcGluZ0xvb2t1cCwgY2xhc3NlcykpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9tb3h5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbW94eS94bWwvcGFja2FnZS1pbmZvLmphdmEgYi9tZWRpYS9tb3h5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbW94eS94bWwvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JhZDRhMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL21veHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tb3h5L3htbC9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvKioKKyAqIEplcnNleSBjbGFzc2VzIHN1cHBvcnRpbmcgWE1MIG1lZGlhIHR5cGUgcHJvY2Vzc2luZyBiYXNlZCBvbiBNb3h5LgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1veHkueG1sOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbW94eS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuc3BpLkF1dG9EaXNjb3ZlcmFibGUgYi9tZWRpYS9tb3h5L3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5zcGkuQXV0b0Rpc2NvdmVyYWJsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmJmMjJkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbW94eS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuc3BpLkF1dG9EaXNjb3ZlcmFibGUKQEAgLTAsMCArMSBAQAorb3JnLmdsYXNzZmlzaC5qZXJzZXkubW94eS5qc29uLmludGVybmFsLk1veHlKc29uQXV0b0Rpc2NvdmVyYWJsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbXVsdGlwYXJ0L3BvbS54bWwgYi9tZWRpYS9tdWx0aXBhcnQvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWZjNDdmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXVsdGlwYXJ0L3BvbS54bWwKQEAgLTAsMCArMSwxMTIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtbXVsdGlwYXJ0PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LW1lZGlhLW11bHRpcGFydDwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgSmVyc2V5IE11bHRpcGFydCBlbnRpdHkgcHJvdmlkZXJzIHN1cHBvcnQgbW9kdWxlLgorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLmlzdGFjazwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1pc3RhY2stY29tbW9ucy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YnVpbGQtaGVscGVyLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmZlbGl4PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWJ1bmRsZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29tbW9uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1zZXJ2ZXI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8b3B0aW9uYWw+dHJ1ZTwvb3B0aW9uYWw+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5qdm5ldC5taW1lcHVsbDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm1pbWVwdWxsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHttaW1lcHVsbC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbm5lY3RvcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktYXBhY2hlLWNvbm5lY3RvcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbm5lY3RvcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktZ3JpenpseS1jb25uZWN0b3I8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb25uZWN0b3JzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWpldHR5LWNvbm5lY3RvcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmptb2NraXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qbW9ja2l0PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tZWRpYS9tdWx0aXBhcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9tdWx0aXBhcnQvQm9keVBhcnQuamF2YSBiL21lZGlhL211bHRpcGFydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9Cb2R5UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmOTg4NzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdWx0aXBhcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9tdWx0aXBhcnQvQm9keVBhcnQuamF2YQpAQCAtMCwwICsxLDMxNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXJzOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLkltbXV0YWJsZU11bHRpdmFsdWVkTWFwOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLk1lc3NhZ2VCb2R5V29ya2VyczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkhlYWRlclV0aWxzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuUGFyYW1ldGVyaXplZEhlYWRlcjsKKworLyoqCisgKiBBIG11dGFibGUgbW9kZWwgcmVwcmVzZW50aW5nIGEgYm9keSBwYXJ0IG5lc3RlZCBpbnNpZGUgYSBNSU1FIE11bHRpUGFydCBlbnRpdHkuCisgKgorICogQGF1dGhvciBDcmFpZyBNY0NsYW5haGFuCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEJvZHlQYXJ0IHsKKworICAgIHByb3RlY3RlZCBDb250ZW50RGlzcG9zaXRpb24gY29udGVudERpc3Bvc2l0aW9uID0gbnVsbDsKKworICAgIHByaXZhdGUgT2JqZWN0IGVudGl0eTsKKworICAgIHByaXZhdGUgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMgPSBIZWFkZXJVdGlscy5jcmVhdGVJbmJvdW5kKCk7CisKKyAgICAvKioKKyAgICAgKiBNZWRpYSB0eXBlIG9mIHRoaXMgYm9keSBwYXJ0LgorICAgICAqLworICAgIHByaXZhdGUgTWVkaWFUeXBlIG1lZGlhVHlwZSA9IG51bGw7CisKKyAgICBwdWJsaWMgTWVzc2FnZUJvZHlXb3JrZXJzIG1lc3NhZ2VCb2R5V29ya2VyczsKKworICAgIC8qKgorICAgICAqIFBhcmVudCBvZiB0aGlzIGJvZHkgcGFydC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE11bHRpUGFydCBwYXJlbnQgPSBudWxsOworCisgICAgcHJpdmF0ZSBQcm92aWRlcnMgcHJvdmlkZXJzID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyB7QGNvZGUgQm9keVBhcnR9IHdpdGggYSB7QGNvZGUgbWVkaWFUeXBlfSBvZgorICAgICAqIHtAY29kZSB0ZXh0L3BsYWlufS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQm9keVBhcnQoKSB7CisgICAgICAgIHRoaXMoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IHtAY29kZSBCb2R5UGFydH0gd2l0aCB0aGUgc3BlY2lmaWVkIGNoYXJhY3RlcmlzdGljcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZWRpYVR5cGUge0BsaW5rIE1lZGlhVHlwZX0gZm9yIHRoaXMgYm9keSBwYXJ0LgorICAgICAqLworICAgIHB1YmxpYyBCb2R5UGFydChmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHNldE1lZGlhVHlwZShtZWRpYVR5cGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyB7QGNvZGUgQm9keVBhcnR9IHdpdGggdGhlIHNwZWNpZmllZCBjaGFyYWN0ZXJpc3RpY3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW50aXR5IGVudGl0eSBmb3IgdGhpcyBib2R5IHBhcnQuCisgICAgICogQHBhcmFtIG1lZGlhVHlwZSB7QGxpbmsgTWVkaWFUeXBlfSBmb3IgdGhpcyBib2R5IHBhcnQuCisgICAgICovCisgICAgcHVibGljIEJvZHlQYXJ0KGZpbmFsIE9iamVjdCBlbnRpdHksIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgc2V0RW50aXR5KGVudGl0eSk7CisgICAgICAgIHNldE1lZGlhVHlwZShtZWRpYVR5cGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGVudGl0eSBvYmplY3QgdG8gYmUgdW5tYXJzaGFsbGVkIGZyb20gYSByZXF1ZXN0LCBvciB0byBiZQorICAgICAqIG1hcnNoYWxsZWQgb24gYSByZXNwb25zZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYW4gZW50aXR5IG9mIHRoaXMgYm9keSBwYXJ0LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBhIHtAbGluayBNdWx0aVBhcnR9IGluc3RhbmNlOyBhY2Nlc3MgdGhlIHVuZGVybHlpbmcKKyAgICAgKiB7QGNvZGUgQm9keVBhcnR9cyBpbnN0ZWFkCisgICAgICovCisgICAgcHVibGljIE9iamVjdCBnZXRFbnRpdHkoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmVudGl0eTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGVudGl0eSBvYmplY3QgdG8gYmUgdW5tYXJzaGFsbGVkIGZyb20gYSByZXF1ZXN0LCBvciB0byBiZSBtYXJzaGFsbGVkIG9uIGEgcmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW50aXR5IHRoZSBuZXcgZW50aXR5IG9iamVjdC4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgb24gYSB7QGxpbmsgTXVsdGlQYXJ0fSBpbnN0YW5jZTsgYWNjZXNzIHRoZSB1bmRlcmx5aW5nCisgICAgICoge0Bjb2RlIEJvZHlQYXJ0fXMgaW5zdGVhZAorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEVudGl0eShmaW5hbCBPYmplY3QgZW50aXR5KSB7CisgICAgICAgIHRoaXMuZW50aXR5ID0gZW50aXR5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBtdXRhYmxlIG1hcCBvZiBIVFRQIGhlYWRlciB2YWx1ZShzKSBmb3IgdGhpcyB7QGNvZGUgQm9keVBhcnR9LCBrZXllZCBieSB0aGUgaGVhZGVyIG5hbWUuIEtleSBjb21wYXJpc29ucyBpbgorICAgICAqIHRoZSByZXR1cm5lZCBtYXAgbXVzdCBiZSBjYXNlLWluc2Vuc2l0aXZlLgorICAgICAqIDxwLz4KKyAgICAgKiBOb3RlOiBNSU1FIHNwZWNpZmljYXRpb25zIHNheXMgb25seSBoZWFkZXJzIHRoYXQgbWF0Y2gge0Bjb2RlIENvbnRlbnQtKn0gc2hvdWxkIGJlIGluY2x1ZGVkIG9uIGEge0Bjb2RlIEJvZHlQYXJ0fS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbXV0YWJsZSBtYXAgb2YgSFRUUCBoZWFkZXIgdmFsdWVzLgorICAgICAqLworICAgIHB1YmxpYyBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gZ2V0SGVhZGVycygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuaGVhZGVyczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFuIGltbXV0YWJsZSBtYXAgb2YgcGFyYW1ldGVyaXplZCBIVFRQIGhlYWRlciB2YWx1ZShzKSBmb3IgdGhpcyB7QGNvZGUgQm9keVBhcnR9LAorICAgICAqIGtleWVkIGJ5IGhlYWRlciBuYW1lLiBLZXkgY29tcGFyaXNvbnMgaW4gdGhlIHJldHVybmVkIG1hcCBtdXN0IGJlIGNhc2UtaW5zZW5zaXRpdmUuIElmIHlvdSB3aXNoIHRvIG1vZGlmeSB0aGUgaGVhZGVycworICAgICAqIG1hcCBmb3IgdGhpcyB7QGNvZGUgQm9keVBhcnR9LCBtb2RpZnkgdGhlIG1hcCByZXR1cm5lZCBieSB7QGNvZGUgZ2V0SGVhZGVycygpfSBpbnN0ZWFkLgorICAgICAqCisgICAgICogQHJldHVybiBpbW11dGFibGUgbWFwIG9mIEhUVFAgaGVhZGVyIHZhbHVlcy4KKyAgICAgKiBAdGhyb3dzIFBhcnNlRXhjZXB0aW9uIGlmIGFuIHVuLWV4cGVjdGVkL2luLWNvcnJlY3QgdmFsdWUgaXMgZm91bmQgZHVyaW5nIHBhcnNpbmcgdGhlIGhlYWRlcnMuCisgICAgICovCisgICAgcHVibGljIE11bHRpdmFsdWVkTWFwPFN0cmluZywgUGFyYW1ldGVyaXplZEhlYWRlcj4gZ2V0UGFyYW1ldGVyaXplZEhlYWRlcnMoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEltbXV0YWJsZU11bHRpdmFsdWVkTWFwPD4obmV3IFBhcmFtZXRlcml6ZWRIZWFkZXJzTWFwKGhlYWRlcnMpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBjb250ZW50IGRpc3Bvc2l0aW9uLgorICAgICAqIDxwLz4KKyAgICAgKiBUaGUgIkNvbnRlbnQtRGlzcG9zaXRpb24iIGhlYWRlciwgaWYgcHJlc2VudCwgd2lsbCBiZSBwYXJzZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjb250ZW50IGRpc3Bvc2l0aW9uLCB3aWxsIGJlIG51bGwgaWYgbm90IHByZXNlbnQuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGNvbnRlbnQgZGlzcG9zaXRpb24gaGVhZGVyIGNhbm5vdCBiZSBwYXJzZWQuCisgICAgICovCisgICAgcHVibGljIENvbnRlbnREaXNwb3NpdGlvbiBnZXRDb250ZW50RGlzcG9zaXRpb24oKSB7CisgICAgICAgIGlmIChjb250ZW50RGlzcG9zaXRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHNjZCA9IGhlYWRlcnMuZ2V0Rmlyc3QoIkNvbnRlbnQtRGlzcG9zaXRpb24iKTsKKworICAgICAgICAgICAgaWYgKHNjZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgY29udGVudERpc3Bvc2l0aW9uID0gbmV3IENvbnRlbnREaXNwb3NpdGlvbihzY2QpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFBhcnNlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkVycm9yIHBhcnNpbmcgY29udGVudCBkaXNwb3NpdGlvbjogIiArIHNjZCwgZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29udGVudERpc3Bvc2l0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGNvbnRlbnQgZGlzcG9zaXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGVudERpc3Bvc2l0aW9uIHRoZSBjb250ZW50IGRpc3Bvc2l0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnREaXNwb3NpdGlvbihmaW5hbCBDb250ZW50RGlzcG9zaXRpb24gY29udGVudERpc3Bvc2l0aW9uKSB7CisgICAgICAgIHRoaXMuY29udGVudERpc3Bvc2l0aW9uID0gY29udGVudERpc3Bvc2l0aW9uOworICAgICAgICBoZWFkZXJzLnJlbW92ZSgiQ29udGVudC1EaXNwb3NpdGlvbiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHtAbGluayBNZWRpYVR5cGV9IGZvciB0aGlzIHtAY29kZSBCb2R5UGFydH0uIElmIG5vdAorICAgICAqIHNldCwgdGhlIGRlZmF1bHQge0BsaW5rIE1lZGlhVHlwZX0gTVVTVCBiZSB7QGNvZGUgdGV4dC9wbGFpbn0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIG1lZGlhIHR5cGUgZm9yIHRoaXMgYm9keSBwYXJ0LgorICAgICAqLworICAgIHB1YmxpYyBNZWRpYVR5cGUgZ2V0TWVkaWFUeXBlKCkgeworICAgICAgICByZXR1cm4gdGhpcy5tZWRpYVR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUge0BsaW5rIE1lZGlhVHlwZX0gZm9yIHRoaXMge0Bjb2RlIEJvZHlQYXJ0fS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZWRpYVR5cGUgdGhlIG5ldyB7QGxpbmsgTWVkaWFUeXBlfS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUge0Bjb2RlIG1lZGlhVHlwZX0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhVHlwZShmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIGlmIChtZWRpYVR5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWVkaWFUeXBlIGNhbm5vdCBiZSBudWxsIik7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLm1lZGlhVHlwZSA9IG1lZGlhVHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBwYXJlbnQge0BsaW5rIE11bHRpUGFydH0gKGlmIGFueSkgZm9yIHRoaXMge0Bjb2RlIEJvZHlQYXJ0fS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gcGFyZW50IG9mIHRoaXMgYm9keSB0eXBlLCB7QGNvZGUgbnVsbH0gaWYgbm90IHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTXVsdGlQYXJ0IGdldFBhcmVudCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucGFyZW50OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHBhcmVudCB7QGxpbmsgTXVsdGlQYXJ0fSAoaWYgYW55KSBmb3IgdGhpcyB7QGNvZGUgQm9keVBhcnR9LgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmVudCB0aGUgbmV3IHBhcmVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQYXJlbnQoZmluYWwgTXVsdGlQYXJ0IHBhcmVudCkgeworICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjb25maWd1cmVkIHtAbGluayBQcm92aWRlcnN9IGZvciB0aGlzIHtAY29kZSBCb2R5UGFydH0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHByb3ZpZGVycyBvZiB0aGlzIGJvZHkgcGFydC4KKyAgICAgKi8KKyAgICBwdWJsaWMgUHJvdmlkZXJzIGdldFByb3ZpZGVycygpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucHJvdmlkZXJzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGNvbmZpZ3VyZWQge0BsaW5rIFByb3ZpZGVyc30gZm9yIHRoaXMge0Bjb2RlIEJvZHlQYXJ0fS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm92aWRlcnMgdGhlIG5ldyB7QGxpbmsgUHJvdmlkZXJzfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRQcm92aWRlcnMoZmluYWwgUHJvdmlkZXJzIHByb3ZpZGVycykgeworICAgICAgICB0aGlzLnByb3ZpZGVycyA9IHByb3ZpZGVyczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtIGFueSBuZWNlc3NhcnkgY2xlYW51cCBhdCB0aGUgZW5kIG9mIHByb2Nlc3NpbmcgdGhpcworICAgICAqIHtAY29kZSBCb2R5UGFydH0uCisgICAgICovCisgICAgcHVibGljIHZvaWQgY2xlYW51cCgpIHsKKyAgICAgICAgaWYgKChnZXRFbnRpdHkoKSAhPSBudWxsKSAmJiAoZ2V0RW50aXR5KCkgaW5zdGFuY2VvZiBCb2R5UGFydEVudGl0eSkpIHsKKyAgICAgICAgICAgICgoQm9keVBhcnRFbnRpdHkpIGdldEVudGl0eSgpKS5jbGVhbnVwKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCdWlsZGVyIHBhdHRlcm4gbWV0aG9kIHRvIHJldHVybiB0aGlzIHtAY29kZSBCb2R5UGFydH0gYWZ0ZXIgYWRkaXRpb25hbCBjb25maWd1cmF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGVudGl0eSBlbnRpdHkgdG8gc2V0IGZvciB0aGlzIHtAY29kZSBCb2R5UGFydH0uCisgICAgICogQHJldHVybiBib2R5LXBhcnQgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIEJvZHlQYXJ0IGVudGl0eShmaW5hbCBPYmplY3QgZW50aXR5KSB7CisgICAgICAgIHNldEVudGl0eShlbnRpdHkpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBlbnRpdHkgYWZ0ZXIgYXBwcm9wcmlhdGUgY29udmVyc2lvbiB0byB0aGUgcmVxdWVzdGVkIHR5cGUuIFRoaXMgaXMgdXNlZnVsIG9ubHkgd2hlbiB0aGUgY29udGFpbmluZworICAgICAqIHtAbGluayBNdWx0aVBhcnR9IGluc3RhbmNlIGhhcyBiZWVuIHJlY2VpdmVkLCB3aGljaCBjYXVzZXMgdGhlIHtAY29kZSBwcm92aWRlcnN9IHByb3BlcnR5IHRvIGhhdmUgYmVlbiBzZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhenogZGVzaXJlZCBjbGFzcyBpbnRvIHdoaWNoIHRoZSBlbnRpdHkgc2hvdWxkIGJlIGNvbnZlcnRlZC4KKyAgICAgKiBAcmV0dXJuIGVudGl0eSBhZnRlciBhcHByb3ByaWF0ZSBjb252ZXJzaW9uIHRvIHRoZSByZXF1ZXN0ZWQgdHlwZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgUHJvY2Vzc2luZ0V4Y2VwdGlvbiBpZiBhbiBJTyBlcnJvciBhcmlzZXMgZHVyaW5nIHJlYWRpbmcgYW4gZW50aXR5LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIG5vIHtAbGluayBNZXNzYWdlQm9keVJlYWRlcn0gY2FuIGJlIGZvdW5kIHRvIHBlcmZvcm0gdGhlIHJlcXVlc3RlZCBjb252ZXJzaW9uLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHRoZSB7QGNvZGUgcHJvdmlkZXJzfSBwcm9wZXJ0eSBoYXMgbm90IGJlZW4gc2V0IG9yIHdoZW4gdGhlCisgICAgICogZW50aXR5IGluc3RhbmNlIGlzIG5vdCB0aGUgdW5jb252ZXJ0ZWQgY29udGVudCBvZiB0aGUgYm9keSBwYXJ0IGVudGl0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgPFQ+IFQgZ2V0RW50aXR5QXMoZmluYWwgQ2xhc3M8VD4gY2xhenopIHsKKyAgICAgICAgaWYgKGVudGl0eSA9PSBudWxsIHx8ICEoZW50aXR5IGluc3RhbmNlb2YgQm9keVBhcnRFbnRpdHkpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLkVOVElUWV9IQVNfV1JPTkdfVFlQRSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY2xhenogPT0gQm9keVBhcnRFbnRpdHkuY2xhc3MpIHsKKyAgICAgICAgICAgIHJldHVybiBjbGF6ei5jYXN0KGVudGl0eSk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMgPSBuZXcgQW5ub3RhdGlvblswXTsKKyAgICAgICAgZmluYWwgTWVzc2FnZUJvZHlSZWFkZXI8VD4gcmVhZGVyID0gbWVzc2FnZUJvZHlXb3JrZXJzLmdldE1lc3NhZ2VCb2R5UmVhZGVyKGNsYXp6LCBjbGF6eiwgYW5ub3RhdGlvbnMsIG1lZGlhVHlwZSk7CisgICAgICAgIGlmIChyZWFkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5OT19BVkFJTEFCTEVfTUJSKGNsYXp6LCBtZWRpYVR5cGUpKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gcmVhZGVyLnJlYWRGcm9tKGNsYXp6LCBjbGF6eiwgYW5ub3RhdGlvbnMsIG1lZGlhVHlwZSwgaGVhZGVycywgKChCb2R5UGFydEVudGl0eSkgZW50aXR5KS5nZXRJbnB1dFN0cmVhbSgpKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9SRUFESU5HX0VOVElUWShTdHJpbmcuY2xhc3MpLCBpb2UpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQnVpbGRlciBwYXR0ZXJuIG1ldGhvZCB0byByZXR1cm4gdGhpcyB7QGNvZGUgQm9keVBhcnR9IGFmdGVyIGFkZGl0aW9uYWwgY29uZmlndXJhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIG1lZGlhIHR5cGUgdG8gc2V0IGZvciB0aGlzIHtAY29kZSBCb2R5UGFydH0uCisgICAgICogQHJldHVybiBib2R5LXBhcnQgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIEJvZHlQYXJ0IHR5cGUoZmluYWwgTWVkaWFUeXBlIHR5cGUpIHsKKyAgICAgICAgc2V0TWVkaWFUeXBlKHR5cGUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCdWlsZGVyIHBhdHRlcm4gbWV0aG9kIHRvIHJldHVybiB0aGlzIHtAY29kZSBCb2R5UGFydH0gYWZ0ZXIKKyAgICAgKiBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGVudERpc3Bvc2l0aW9uIGNvbnRlbnQgZGlzcG9zaXRpb24gdG8gc2V0IGZvciB0aGlzIHtAY29kZSBCb2R5UGFydH0uCisgICAgICogQHJldHVybiBib2R5LXBhcnQgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIEJvZHlQYXJ0IGNvbnRlbnREaXNwb3NpdGlvbihmaW5hbCBDb250ZW50RGlzcG9zaXRpb24gY29udGVudERpc3Bvc2l0aW9uKSB7CisgICAgICAgIHNldENvbnRlbnREaXNwb3NpdGlvbihjb250ZW50RGlzcG9zaXRpb24pOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgbWVzc2FnZSBib2R5IHdvcmtlcnMgdXNlZCB0byB0cmFuc2Zvcm0gYW4gZW50aXR5IHN0cmVhbSBpbnRvIHBhcnRpY3VsYXIgSmF2YSB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2VCb2R5V29ya2VycyBtZXNzYWdlIGJvZHkgd29ya2Vycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRNZXNzYWdlQm9keVdvcmtlcnMoZmluYWwgTWVzc2FnZUJvZHlXb3JrZXJzIG1lc3NhZ2VCb2R5V29ya2VycykgeworICAgICAgICB0aGlzLm1lc3NhZ2VCb2R5V29ya2VycyA9IG1lc3NhZ2VCb2R5V29ya2VyczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9tdWx0aXBhcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9tdWx0aXBhcnQvQm9keVBhcnRFbnRpdHkuamF2YSBiL21lZGlhL211bHRpcGFydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9Cb2R5UGFydEVudGl0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMzQ5YmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdWx0aXBhcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9tdWx0aXBhcnQvQm9keVBhcnRFbnRpdHkuamF2YQpAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQ7CisKK2ltcG9ydCBqYXZhLmlvLkNsb3NlYWJsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKKworaW1wb3J0IG9yZy5qdm5ldC5taW1lcHVsbC5NSU1FUGFydDsKKworLyoqCisgKiBQcm94eSBjbGFzcyByZXByZXNlbnRpbmcgdGhlIGVudGl0eSBvZiBhIHtAbGluayBCb2R5UGFydH0gd2hlbiBhCisgKiB7QGxpbmsgTXVsdGlQYXJ0fSBlbnRpdHkgaXMgcmVjZWl2ZWQgYW5kIHBhcnNlZC4KKyAqIDxwLz4KKyAqIEl0cyBwcmltYXJ5IHB1cnBvc2UgaXMgdG8gcHJvdmlkZSBhbiBpbnB1dCBzdHJlYW0gdG8gcmV0cmlldmUgdGhlIGFjdHVhbCBkYXRhLgorICogSG93ZXZlciwgaXQgYWxzbyB0cmFuc3BhcmVudGx5IGRlYWxzIHdpdGggc3RvcmluZyB0aGUgZGF0YSBpbiBhIHRlbXBvcmFyeSBkaXNrCisgKiBmaWxlLCBpZiBpdCBpcyBsYXJnZXIgdGhhbiBhIGNvbmZpZ3VyYWJsZSBzaXplOyBvdGhlcndpc2UsIHRoZSBkYXRhIGlzIHN0b3JlZAorICogaW4gbWVtb3J5IGZvciBmYXN0ZXIgcHJvY2Vzc2luZy4KKyAqCisgKiBAYXV0aG9yIENyYWlnIE1jQ2xhbmFoYW4KKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgQm9keVBhcnRFbnRpdHkgaW1wbGVtZW50cyBDbG9zZWFibGUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoQm9keVBhcnRFbnRpdHkuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIHByaXZhdGUgZmluYWwgTUlNRVBhcnQgbWltZVBhcnQ7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBGaWxlIGZpbGU7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBCb2R5UGFydEVudGl0eX0gd2l0aCBhIHtAbGluayBNSU1FUGFydH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWltZVBhcnQgTUlNRVBhcnQgY29udGFpbmluZyB0aGUgaW5wdXQgc3RyZWFtIG9mIHRoaXMgYm9keSBwYXJ0IGVudGl0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQm9keVBhcnRFbnRpdHkoZmluYWwgTUlNRVBhcnQgbWltZVBhcnQpIHsKKyAgICAgICAgdGhpcy5taW1lUGFydCA9IG1pbWVQYXJ0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGlucHV0IHN0cmVhbSBvZiB0aGUgcmF3IGJ5dGVzIG9mIHRoaXMgYm9keSBwYXJ0IGVudGl0eS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGlucHV0IHN0cmVhbSBvZiB0aGUgYm9keSBwYXJ0IGVudGl0eS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB7CisgICAgICAgIHJldHVybiBtaW1lUGFydC5yZWFkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xlYW5zIHVwIHRlbXBvcmFyeSBmaWxlKHMpLCBpZiBhbnkgd2VyZSB1dGlsaXplZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBjbGVhbnVwKCkgeworICAgICAgICBtaW1lUGFydC5jbG9zZSgpOworCisgICAgICAgIGlmIChmaWxlICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gZGVsZXRlZCA9IGZpbGUuZGVsZXRlKCk7CisgICAgICAgICAgICBpZiAoIWRlbGV0ZWQpIHsKKyAgICAgICAgICAgICAgICBpZiAoTE9HR0VSLmlzTG9nZ2FibGUoTGV2ZWwuRklORSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5GSU5FLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5URU1QX0ZJTEVfTk9UX0RFTEVURUQoZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERlZmVycyB0byB7QGxpbmsgI2NsZWFudXB9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY2xlYW51cCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1vdmUgdGhlIGNvbnRlbnRzIG9mIHRoZSB1bmRlcmx5aW5nIHtAbGluayBqYXZhLmlvLklucHV0U3RyZWFtfSBvciB7QGxpbmsgamF2YS5pby5GaWxlfSB0byB0aGUgZ2l2ZW4gZmlsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlIGRlc3RpbmF0aW9uIGZpbGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgbW92ZVRvKGZpbmFsIEZpbGUgZmlsZSkgeworICAgICAgICBtaW1lUGFydC5tb3ZlVG8oZmlsZSk7CisKKyAgICAgICAgLy8gUmVtZW1iZXIgdGhlIGZpbGUgd2hlcmUgdGhlIG1pbWUtcGFydCBvYmplY3Qgc2hvdWxkIGJlIHN0b3JlZC4gTWltZXB1bGwgd291bGQgbm90IGJlIGFibGUgdG8gZGVsZXRlIGl0IGFmdGVyCisgICAgICAgIC8vIGl0J3MgbW92ZWQuCisgICAgICAgIHRoaXMuZmlsZSA9IGZpbGU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbXVsdGlwYXJ0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvbXVsdGlwYXJ0L0JvZHlQYXJ0c0xpc3QuamF2YSBiL21lZGlhL211bHRpcGFydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9Cb2R5UGFydHNMaXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAzYmUyZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL211bHRpcGFydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9Cb2R5UGFydHNMaXN0LmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworLyoqCisgKiBDdXN0b20ge0BsaW5rIGphdmEudXRpbC5MaXN0fSBpbXBsZW1lbnRhdGlvbiB0aGF0IG1haW50YWlucyBwYXJlbnRhZ2UgaW5mb3JtYXRpb24gYXV0b21hdGljYWxseS4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworY2xhc3MgQm9keVBhcnRzTGlzdCBleHRlbmRzIEFycmF5TGlzdDxCb2R5UGFydD4geworCisgICAgTXVsdGlQYXJ0IHBhcmVudCA9IG51bGw7CisKKyAgICBCb2R5UGFydHNMaXN0KE11bHRpUGFydCBwYXJlbnQpIHsKKyAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gYWRkKEJvZHlQYXJ0IGJwKSB7CisgICAgICAgIHN1cGVyLmFkZChicCk7CisgICAgICAgIGJwLnNldFBhcmVudChwYXJlbnQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZGQoaW50IGluZGV4LCBCb2R5UGFydCBicCkgeworICAgICAgICBzdXBlci5hZGQoaW5kZXgsIGJwKTsKKyAgICAgICAgYnAuc2V0UGFyZW50KHBhcmVudCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIEJvZHlQYXJ0PiBicHMpIHsKKyAgICAgICAgaWYgKHN1cGVyLmFkZEFsbChicHMpKSB7CisgICAgICAgICAgICBmb3IgKEJvZHlQYXJ0IGJwIDogYnBzKSB7CisgICAgICAgICAgICAgICAgYnAuc2V0UGFyZW50KHBhcmVudCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChpbnQgaW5kZXgsIENvbGxlY3Rpb248PyBleHRlbmRzIEJvZHlQYXJ0PiBicHMpIHsKKyAgICAgICAgaWYgKHN1cGVyLmFkZEFsbChpbmRleCwgYnBzKSkgeworICAgICAgICAgICAgZm9yIChCb2R5UGFydCBicCA6IGJwcykgeworICAgICAgICAgICAgICAgIGJwLnNldFBhcmVudChwYXJlbnQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgQm9keVBhcnQgYnBzW10gPSBzdXBlci50b0FycmF5KG5ldyBCb2R5UGFydFtzdXBlci5zaXplKCldKTsKKyAgICAgICAgc3VwZXIuY2xlYXIoKTsKKyAgICAgICAgZm9yIChCb2R5UGFydCBicCA6IGJwcykgeworICAgICAgICAgICAgYnAuc2V0UGFyZW50KG51bGwpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJvZHlQYXJ0IHJlbW92ZShpbnQgaW5kZXgpIHsKKyAgICAgICAgQm9keVBhcnQgYnAgPSBzdXBlci5yZW1vdmUoaW5kZXgpOworICAgICAgICBpZiAoYnAgIT0gbnVsbCkgeworICAgICAgICAgICAgYnAuc2V0UGFyZW50KG51bGwpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBicDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IGJwKSB7CisgICAgICAgIGlmIChzdXBlci5yZW1vdmUoYnApKSB7CisgICAgICAgICAgICAoKEJvZHlQYXJ0KSBicCkuc2V0UGFyZW50KG51bGwpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL21lZGlhL211bHRpcGFydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9Cb3VuZGFyeS5qYXZhIGIvbWVkaWEvbXVsdGlwYXJ0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvbXVsdGlwYXJ0L0JvdW5kYXJ5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIzNmZlNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL211bHRpcGFydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9Cb3VuZGFyeS5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0OworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCisvKioKKyAqIFV0aWxpdHkgZm9yIGNyZWF0aW5nIGJvdW5kYXJ5IHBhcmFtZXRlcnMuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBCb3VuZGFyeSB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCT1VOREFSWV9QQVJBTUVURVIgPSAiYm91bmRhcnkiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXRvbWljSW50ZWdlciBib3VuZGFyeUNvdW50ZXIgPSBuZXcgQXRvbWljSW50ZWdlcigpOworCisgICAgLyoqCisgICAgICogVHJhbnNmb3JtcyBhIG1lZGlhIHR5cGUgYW5kIGFkZCBhIGJvdW5kYXJ5IHBhcmFtZXRlciB3aXRoIGEgdW5pcXVlIHZhbHVlCisgICAgICogaWYgb25lIGlzIG5vdCBhbHJlYWR5IHByZXNlbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVkaWFUeXBlIGlmIHtAY29kZSBudWxsfSB0aGVuIGEgbWVkaWEgdHlwZSBvZiAibXVsdGlwYXJ0L21peGVkIiB3aXRoIGEgYm91bmRhcnkgcGFyYW1ldGVyIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgICogQHJldHVybiB0aGUgbWVkaWEgdHlwZSB3aXRoIGEgYm91bmRhcnkgcGFyYW1ldGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFUeXBlIGFkZEJvdW5kYXJ5KE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgaWYgKG1lZGlhVHlwZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gTXVsdGlQYXJ0TWVkaWFUeXBlcy5jcmVhdGVNaXhlZCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtZWRpYVR5cGUuZ2V0UGFyYW1ldGVycygpLmNvbnRhaW5zS2V5KEJPVU5EQVJZX1BBUkFNRVRFUikpIHsKKyAgICAgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigKKyAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlLmdldFBhcmFtZXRlcnMoKSk7CisgICAgICAgICAgICBwYXJhbWV0ZXJzLnB1dChCT1VOREFSWV9QQVJBTUVURVIsIGNyZWF0ZUJvdW5kYXJ5KCkpOworCisgICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhVHlwZShtZWRpYVR5cGUuZ2V0VHlwZSgpLCBtZWRpYVR5cGUuZ2V0U3VidHlwZSgpLAorICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBtZWRpYVR5cGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHVuaXF1ZSBib3VuZGFyeS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGJvdW5kYXJ5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGNyZWF0ZUJvdW5kYXJ5KCkgeworICAgICAgICByZXR1cm4gbmV3IFN0cmluZ0J1aWxkZXIoIkJvdW5kYXJ5XyIpCisgICAgICAgICAgICAgICAgLmFwcGVuZChib3VuZGFyeUNvdW50ZXIuaW5jcmVtZW50QW5kR2V0KCkpCisgICAgICAgICAgICAgICAgLmFwcGVuZCgnXycpCisgICAgICAgICAgICAgICAgLmFwcGVuZChuZXcgT2JqZWN0KCkuaGFzaENvZGUoKSkKKyAgICAgICAgICAgICAgICAuYXBwZW5kKCdfJykKKyAgICAgICAgICAgICAgICAuYXBwZW5kKFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpKQorICAgICAgICAgICAgICAgIC50b1N0cmluZygpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbXVsdGlwYXJ0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvbXVsdGlwYXJ0L0NvbnRlbnREaXNwb3NpdGlvbi5qYXZhIGIvbWVkaWEvbXVsdGlwYXJ0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvbXVsdGlwYXJ0L0NvbnRlbnREaXNwb3NpdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMmYyYWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdWx0aXBhcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9tdWx0aXBhcnQvQ29udGVudERpc3Bvc2l0aW9uLmphdmEKQEAgLTAsMCArMSwzMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0OworCitpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5IdHRwRGF0ZUZvcm1hdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkh0dHBIZWFkZXJSZWFkZXI7CisKKy8qKgorICogQSBjb250ZW50IGRpc3Bvc2l0aW9uIGhlYWRlci4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIGltcmFuQHNtYXJ0aXRlbmdpbmVlcmluZy5jb20KKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBDb250ZW50RGlzcG9zaXRpb24geworCisgICAgcHJpdmF0ZSBmaW5hbCBDaGFyU2VxdWVuY2UgdHlwZTsKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVyczsKKyAgICBwcml2YXRlIFN0cmluZyBmaWxlTmFtZTsKKyAgICBwcml2YXRlIERhdGUgY3JlYXRpb25EYXRlOworICAgIHByaXZhdGUgRGF0ZSBtb2RpZmljYXRpb25EYXRlOworICAgIHByaXZhdGUgRGF0ZSByZWFkRGF0ZTsKKyAgICBwcml2YXRlIGxvbmcgc2l6ZTsKKworICAgIHByb3RlY3RlZCBDb250ZW50RGlzcG9zaXRpb24oZmluYWwgU3RyaW5nIHR5cGUsIGZpbmFsIFN0cmluZyBmaWxlTmFtZSwgZmluYWwgRGF0ZSBjcmVhdGlvbkRhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBEYXRlIG1vZGlmaWNhdGlvbkRhdGUsIGZpbmFsIERhdGUgcmVhZERhdGUsIGZpbmFsIGxvbmcgc2l6ZSkgeworICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOworICAgICAgICB0aGlzLmZpbGVOYW1lID0gZmlsZU5hbWU7CisgICAgICAgIHRoaXMuY3JlYXRpb25EYXRlID0gY3JlYXRpb25EYXRlOworICAgICAgICB0aGlzLm1vZGlmaWNhdGlvbkRhdGUgPSBtb2RpZmljYXRpb25EYXRlOworICAgICAgICB0aGlzLnJlYWREYXRlID0gcmVhZERhdGU7CisgICAgICAgIHRoaXMuc2l6ZSA9IHNpemU7CisgICAgICAgIHRoaXMucGFyYW1ldGVycyA9IENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7CisgICAgfQorCisgICAgcHVibGljIENvbnRlbnREaXNwb3NpdGlvbihmaW5hbCBTdHJpbmcgaGVhZGVyKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICB0aGlzKGhlYWRlciwgZmFsc2UpOworICAgIH0KKworICAgIHB1YmxpYyBDb250ZW50RGlzcG9zaXRpb24oZmluYWwgU3RyaW5nIGhlYWRlciwgZmluYWwgYm9vbGVhbiBmaWxlTmFtZUZpeCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgdGhpcyhIdHRwSGVhZGVyUmVhZGVyLm5ld0luc3RhbmNlKGhlYWRlciksIGZpbGVOYW1lRml4KTsKKyAgICB9CisKKyAgICBwdWJsaWMgQ29udGVudERpc3Bvc2l0aW9uKGZpbmFsIEh0dHBIZWFkZXJSZWFkZXIgcmVhZGVyLCBmaW5hbCBib29sZWFuIGZpbGVOYW1lRml4KSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICByZWFkZXIuaGFzTmV4dCgpOworCisgICAgICAgIHR5cGUgPSByZWFkZXIubmV4dFRva2VuKCk7CisKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbXNPck51bGwgPSByZWFkZXIuaGFzTmV4dCgpCisgICAgICAgICAgICAgICAgPyBIdHRwSGVhZGVyUmVhZGVyLnJlYWRQYXJhbWV0ZXJzKHJlYWRlciwgZmlsZU5hbWVGaXgpCisgICAgICAgICAgICAgICAgOiBudWxsOworCisgICAgICAgIHBhcmFtZXRlcnMgPSBwYXJhbXNPck51bGwgPT0gbnVsbAorICAgICAgICAgICAgICAgID8gQ29sbGVjdGlvbnMuPFN0cmluZywgU3RyaW5nPmVtcHR5TWFwKCkKKyAgICAgICAgICAgICAgICA6IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChwYXJhbXNPck51bGwpOworCisgICAgICAgIGNyZWF0ZVBhcmFtZXRlcnMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHR5cGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSB0eXBlCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRUeXBlKCkgeworICAgICAgICByZXR1cm4gKHR5cGUgPT0gbnVsbCkgPyBudWxsIDogdHlwZS50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRQYXJhbWV0ZXJzKCkgeworICAgICAgICByZXR1cm4gcGFyYW1ldGVyczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGZpbGVuYW1lIHBhcmFtZXRlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHNpemUKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpbGVOYW1lKCkgeworICAgICAgICByZXR1cm4gZmlsZU5hbWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjcmVhdGlvbi1kYXRlIHBhcmFtZXRlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGNyZWF0aW9uRGF0ZQorICAgICAqLworICAgIHB1YmxpYyBEYXRlIGdldENyZWF0aW9uRGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIGNyZWF0aW9uRGF0ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG1vZGlmaWNhdGlvbi1kYXRlIHBhcmFtZXRlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIG1vZGlmaWNhdGlvbkRhdGUKKyAgICAgKi8KKyAgICBwdWJsaWMgRGF0ZSBnZXRNb2RpZmljYXRpb25EYXRlKCkgeworICAgICAgICByZXR1cm4gbW9kaWZpY2F0aW9uRGF0ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHJlYWQtZGF0ZSBwYXJhbWV0ZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSByZWFkRGF0ZQorICAgICAqLworICAgIHB1YmxpYyBEYXRlIGdldFJlYWREYXRlKCkgeworICAgICAgICByZXR1cm4gcmVhZERhdGU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBzaXplIHBhcmFtZXRlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHNpemUKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRTaXplKCkgeworICAgICAgICByZXR1cm4gc2l6ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IHRoZSBkaXNwb3NpdGlvbiB0byBhICJDb250ZW50LURpc3Bvc2l0aW9uIiBoZWFkZXIgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSAiQ29udGVudC1EaXNwb3NpdGlvbiIgdmFsdWUuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIHRvU3RyaW5nQnVmZmVyKCkudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nQnVpbGRlciB0b1N0cmluZ0J1ZmZlcigpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKyAgICAgICAgc2IuYXBwZW5kKHR5cGUpOworICAgICAgICBhZGRTdHJpbmdQYXJhbWV0ZXIoc2IsICJmaWxlbmFtZSIsIGZpbGVOYW1lKTsKKyAgICAgICAgYWRkRGF0ZVBhcmFtZXRlcihzYiwgImNyZWF0aW9uLWRhdGUiLCBjcmVhdGlvbkRhdGUpOworICAgICAgICBhZGREYXRlUGFyYW1ldGVyKHNiLCAibW9kaWZpY2F0aW9uLWRhdGUiLCBtb2RpZmljYXRpb25EYXRlKTsKKyAgICAgICAgYWRkRGF0ZVBhcmFtZXRlcihzYiwgInJlYWQtZGF0ZSIsIHJlYWREYXRlKTsKKyAgICAgICAgYWRkTG9uZ1BhcmFtZXRlcihzYiwgInNpemUiLCBzaXplKTsKKworICAgICAgICByZXR1cm4gc2I7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYWRkU3RyaW5nUGFyYW1ldGVyKGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IsIGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgcCkgeworICAgICAgICBpZiAocCAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIjsgIikuYXBwZW5kKG5hbWUpLmFwcGVuZCgiPVwiIikuYXBwZW5kKHApLmFwcGVuZCgiXCIiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFkZERhdGVQYXJhbWV0ZXIoZmluYWwgU3RyaW5nQnVpbGRlciBzYiwgZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIERhdGUgcCkgeworICAgICAgICBpZiAocCAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoIjsgIikuYXBwZW5kKG5hbWUpLmFwcGVuZCgiPVwiIikuYXBwZW5kKEh0dHBEYXRlRm9ybWF0LmdldFByZWZlcnJlZERhdGVGb3JtYXQoKS5mb3JtYXQocCkpLmFwcGVuZCgiXCIiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFkZExvbmdQYXJhbWV0ZXIoZmluYWwgU3RyaW5nQnVpbGRlciBzYiwgZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIExvbmcgcCkgeworICAgICAgICBpZiAocCAhPSAtMSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCI7ICIpLmFwcGVuZChuYW1lKS5hcHBlbmQoJz0nKS5hcHBlbmQoTG9uZy50b1N0cmluZyhwKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY3JlYXRlUGFyYW1ldGVycygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIGZpbGVOYW1lID0gcGFyYW1ldGVycy5nZXQoImZpbGVuYW1lIik7CisKKyAgICAgICAgY3JlYXRpb25EYXRlID0gY3JlYXRlRGF0ZSgiY3JlYXRpb24tZGF0ZSIpOworCisgICAgICAgIG1vZGlmaWNhdGlvbkRhdGUgPSBjcmVhdGVEYXRlKCJtb2RpZmljYXRpb24tZGF0ZSIpOworCisgICAgICAgIHJlYWREYXRlID0gY3JlYXRlRGF0ZSgicmVhZC1kYXRlIik7CisKKyAgICAgICAgc2l6ZSA9IGNyZWF0ZUxvbmcoInNpemUiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIERhdGUgY3JlYXRlRGF0ZShmaW5hbCBTdHJpbmcgbmFtZSkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlID0gcGFyYW1ldGVycy5nZXQobmFtZSk7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gSHR0cERhdGVGb3JtYXQuZ2V0UHJlZmVycmVkRGF0ZUZvcm1hdCgpLnBhcnNlKHZhbHVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGxvbmcgY3JlYXRlTG9uZyhmaW5hbCBTdHJpbmcgbmFtZSkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlID0gcGFyYW1ldGVycy5nZXQobmFtZSk7CisgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBMb25nLnBhcnNlTG9uZyh2YWx1ZSk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIkVycm9yIHBhcnNpbmcgc2l6ZSBwYXJhbWV0ZXIgb2YgdmFsdWUsICIgKyB2YWx1ZSwgMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBidWlsZGluZyBjb250ZW50IGRpc3Bvc2l0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgdGhlIGRpc3Bvc2l0aW9uIHR5cGUuCisgICAgICogQHJldHVybiB0aGUgY29udGVudCBkaXNwb3NpdGlvbiBidWlsZGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ29udGVudERpc3Bvc2l0aW9uQnVpbGRlciB0eXBlKGZpbmFsIFN0cmluZyB0eXBlKSB7CisgICAgICAgIHJldHVybiBuZXcgQ29udGVudERpc3Bvc2l0aW9uQnVpbGRlcih0eXBlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCdWlsZGVyIHRvIGJ1aWxkIGNvbnRlbnQgZGlzcG9zaXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gPFQ+IHRoZSBidWlsZGVyIHR5cGUuCisgICAgICogQHBhcmFtIDxWPiB0aGUgY29udGVudCBkaXNwb3NpdGlvbiB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29udGVudERpc3Bvc2l0aW9uQnVpbGRlcjxUIGV4dGVuZHMgQ29udGVudERpc3Bvc2l0aW9uQnVpbGRlciwgViBleHRlbmRzIENvbnRlbnREaXNwb3NpdGlvbj4geworCisgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgdHlwZTsKKyAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBmaWxlTmFtZTsKKyAgICAgICAgcHJvdGVjdGVkIERhdGUgY3JlYXRpb25EYXRlOworICAgICAgICBwcm90ZWN0ZWQgRGF0ZSBtb2RpZmljYXRpb25EYXRlOworICAgICAgICBwcm90ZWN0ZWQgRGF0ZSByZWFkRGF0ZTsKKyAgICAgICAgcHJvdGVjdGVkIGxvbmcgc2l6ZSA9IC0xOworCisgICAgICAgIENvbnRlbnREaXNwb3NpdGlvbkJ1aWxkZXIoZmluYWwgU3RyaW5nIHR5cGUpIHsKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIHRoZSAiZmlsZS1uYW1lIiBwYXJhbWV0ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBmaWxlTmFtZSB0aGUgImZpbGUtbmFtZSIgcGFyYW1ldGVyLiBJZiBudWxsIHRoZSB2YWx1ZQorICAgICAgICAgKiAgICAgICAgaXMgcmVtb3ZlZAorICAgICAgICAgKiBAcmV0dXJuIHRoaXMgYnVpbGRlci4KKyAgICAgICAgICovCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICBwdWJsaWMgVCBmaWxlTmFtZShmaW5hbCBTdHJpbmcgZmlsZU5hbWUpIHsKKyAgICAgICAgICAgIHRoaXMuZmlsZU5hbWUgPSBmaWxlTmFtZTsKKyAgICAgICAgICAgIHJldHVybiAoVCkgdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgdGhlICJjcmVhdGlvbi1kYXRlIiBwYXJhbWV0ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjcmVhdGlvbkRhdGUgdGhlICJjcmVhdGlvbi1kYXRlIiBwYXJhbWV0ZXIuIElmIG51bGwgdGhlIHZhbHVlCisgICAgICAgICAqICAgICAgICBpcyByZW1vdmVkCisgICAgICAgICAqIEByZXR1cm4gdGhpcyBidWlsZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgIHB1YmxpYyBUIGNyZWF0aW9uRGF0ZShmaW5hbCBEYXRlIGNyZWF0aW9uRGF0ZSkgeworICAgICAgICAgICAgdGhpcy5jcmVhdGlvbkRhdGUgPSBjcmVhdGlvbkRhdGU7CisgICAgICAgICAgICByZXR1cm4gKFQpIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIHRoZSAibW9kaWZpY2F0aW9uLWRhdGUiIHBhcmFtZXRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG1vZGlmaWNhdGlvbkRhdGUgdGhlICJtb2RpZmljYXRpb24tZGF0ZSIgcGFyYW1ldGVyLiBJZiBudWxsIHRoZSB2YWx1ZQorICAgICAgICAgKiAgICAgICAgaXMgcmVtb3ZlZAorICAgICAgICAgKiBAcmV0dXJuIHRoaXMgYnVpbGRlci4KKyAgICAgICAgICovCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICBwdWJsaWMgVCBtb2RpZmljYXRpb25EYXRlKGZpbmFsIERhdGUgbW9kaWZpY2F0aW9uRGF0ZSkgeworICAgICAgICAgICAgdGhpcy5tb2RpZmljYXRpb25EYXRlID0gbW9kaWZpY2F0aW9uRGF0ZTsKKyAgICAgICAgICAgIHJldHVybiAoVCkgdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgdGhlICJyZWFkLWRhdGUiIHBhcmFtZXRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHJlYWREYXRlIHRoZSAicmVhZC1kYXRlIiBwYXJhbWV0ZXIuIElmIG51bGwgdGhlIHZhbHVlCisgICAgICAgICAqICAgICAgICBpcyByZW1vdmVkCisgICAgICAgICAqIEByZXR1cm4gdGhpcyBidWlsZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgIHB1YmxpYyBUIHJlYWREYXRlKGZpbmFsIERhdGUgcmVhZERhdGUpIHsKKyAgICAgICAgICAgIHRoaXMucmVhZERhdGUgPSByZWFkRGF0ZTsKKyAgICAgICAgICAgIHJldHVybiAoVCkgdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgdGhlICJzaXplIiBwYXJhbWV0ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzaXplIHRoZSAic2l6ZSIgcGFyYW1ldGVyLiBJZiAtMSB0aGUgdmFsdWUgaXMgcmVtb3ZlZC4KKyAgICAgICAgICogQHJldHVybiB0aGlzIGJ1aWxkZXIuCisgICAgICAgICAqLworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgcHVibGljIFQgc2l6ZShmaW5hbCBsb25nIHNpemUpIHsKKyAgICAgICAgICAgIHRoaXMuc2l6ZSA9IHNpemU7CisgICAgICAgICAgICByZXR1cm4gKFQpIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQnVpbGQgdGhlIGNvbnRlbnQgZGlzcG9zaXRpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gdGhlIGNvbnRlbnQgZGlzcG9zaXRpb24uCisgICAgICAgICAqLworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgcHVibGljIFYgYnVpbGQoKSB7CisgICAgICAgICAgICBmaW5hbCBDb250ZW50RGlzcG9zaXRpb24gY2QgPSBuZXcgQ29udGVudERpc3Bvc2l0aW9uKHR5cGUsIGZpbGVOYW1lLCBjcmVhdGlvbkRhdGUsIG1vZGlmaWNhdGlvbkRhdGUsIHJlYWREYXRlLCBzaXplKTsKKyAgICAgICAgICAgIHJldHVybiAoVikgY2Q7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9tdWx0aXBhcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9tdWx0aXBhcnQvRm9ybURhdGFCb2R5UGFydC5qYXZhIGIvbWVkaWEvbXVsdGlwYXJ0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvbXVsdGlwYXJ0L0Zvcm1EYXRhQm9keVBhcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjNmOTA5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXVsdGlwYXJ0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvbXVsdGlwYXJ0L0Zvcm1EYXRhQm9keVBhcnQuamF2YQpAQCAtMCwwICsxLDMyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQ7CisKK2ltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuTWVkaWFUeXBlczsKKworLyoqCisgKiBTdWJjbGFzcyBvZiB7QGxpbmsgQm9keVBhcnR9IHdpdGggc3BlY2lhbGl6ZWQgc3VwcG9ydCBmb3IgbWVkaWEgdHlwZQorICoge0Bjb2RlIG11bHRpcGFydC9mb3JtLWRhdGF9LiAgU2VlCisgKiA8YSBocmVmPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyMzg4LnR4dCI+UkZDIDIzODg8L2E+CisgKiBmb3IgdGhlIGZvcm1hbCBkZWZpbml0aW9uIG9mIHRoaXMgbWVkaWEgdHlwZS4KKyAqIDxwLz4KKyAqIEZvciBhIHNlcnZlciBzaWRlIGFwcGxpY2F0aW9uIHdpc2hpbmcgdG8gcHJvY2VzcyBhbiBpbmNvbWluZworICoge0Bjb2RlIG11bHRpcGFydC9mb3JtLWRhdGF9IG1lc3NhZ2UsIHRoZSBmb2xsb3dpbmcgZmVhdHVyZXMKKyAqIGFyZSBwcm92aWRlZDoKKyAqIDx1bD4KKyAqIDxsaT5Qcm9wZXJ0eSBhY2Nlc3NvciB0byByZXRyaWV2ZSB0aGUgY29udHJvbCBuYW1lLjwvbGk+CisgKiA8bGk+UHJvcGVydHkgYWNjZXNzb3IgdG8gcmV0cmlldmUgdGhlIGZpZWxkIHZhbHVlIGZvciBhIHNpbXBsZQorICogU3RyaW5nIGZpZWxkLjwvbGk+CisgKiA8bGk+Q29udmVuaWVuY2UgYWNjZXNzb3IgdG8gcmV0cmlldmUgdGhlIGZpZWxkIHZhbHVlIGFmdGVyIGNvbnZlcnNpb24KKyAqIHRocm91Z2ggYW4gYXBwcm9wcmlhdGUge0Bjb2RlIE1lc3NhZ2VCb2R5UmVhZGVyfS48L2xpPgorICogPC91bD4KKyAqIDxwLz4KKyAqIEZvciBhIGNsaWVudCBzaWRlIGFwcGxpY2F0aW9uIHdpc2hpbmcgdG8gY29uc3RydWN0IGFuIG91dGdvaW5nCisgKiB7QGNvZGUgbXVsdGlwYXJ0L2Zvcm0tZGF0YX0gbWVzc2FnZSwgdGhlIGZvbGxvd2luZyBmZWF0dXJlcworICogYXJlIHByb3ZpZGVkOgorICogPHVsPgorICogPGxpPkNvbnZlbmllbmNlIGNvbnN0cnVjdG9ycyBmb3IgbmFtZWQgZmllbGRzIHdpdGggZWl0aGVyCisgKiBzaW1wbGUgc3RyaW5nIHZhbHVlcywgb3IgYXJiaXRyYXJ5IGVudGl0aWVzIGFuZCBtZWRpYSB0eXBlcy48L2xpPgorICogPGxpPlByb3BlcnR5IGFjY2Vzc29yIHRvIHNldCB0aGUgY29udHJvbCBuYW1lLjwvbGk+CisgKiA8bGk+UHJvcGVydHkgYWNjZXNzb3IgdG8gc2V0IHRoZSBmaWVsZCB2YWx1ZSBmb3IgYSBzaW1wbGUKKyAqIFN0cmluZyBmaWVsZC48L2xpPgorICogPGxpPkNvbnZlbmllbmNlIGFjY2Vzc29yIHRvIHNldCB0aGUgbWVkaWEgdHlwZSBhbmQgdmFsdWUgb2YgYQorICogImZpbGUiIGZpZWxkLjwvbGk+CisgKiA8L3VsPgorICoKKyAqIEBhdXRob3IgQ3JhaWcgTWNDbGFuYWhhbgorICogQGF1dGhvciBJbXJhbiBNIFlvdXN1ZiAoaW1yYW4gYXQgc21hcnRpdGVuZ2luZWVyaW5nLmNvbSkKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgRm9ybURhdGFCb2R5UGFydCBleHRlbmRzIEJvZHlQYXJ0IHsKKworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBmaWxlTmFtZUZpeDsKKworICAgIC8qKgorICAgICAqIEluc3RhbnRpYXRlcyBhbiB1bm5hbWVkIG5ldyB7QGxpbmsgRm9ybURhdGFCb2R5UGFydH0gd2l0aCBhCisgICAgICoge0Bjb2RlIG1lZGlhVHlwZX0gb2Yge0Bjb2RlIHRleHQvcGxhaW59LgorICAgICAqLworICAgIHB1YmxpYyBGb3JtRGF0YUJvZHlQYXJ0KCkgeworICAgICAgICB0aGlzKGZhbHNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnN0YW50aWF0ZXMgYW4gdW5uYW1lZCBuZXcge0BsaW5rIEZvcm1EYXRhQm9keVBhcnR9IHdpdGgge0Bjb2RlIG1lZGlhVHlwZX0gb2Yge0Bjb2RlIHRleHQvcGxhaW59CisgICAgICogYW5kIHNldHRpbmcgdGhlIGZsYWcgZm9yIGFwcGx5aW5nIHRoZSBmaXggZm9yIGVycm9uZW91cyBmaWxlIG5hbWUgdmFsdWUgaWYgY29udGVudCBkaXNwb3NpdGlvbiBoZWFkZXIgb2YKKyAgICAgKiBtZXNzYWdlcyBjb21pbmcgZnJvbSBNUyBJbnRlcm5ldCBFeHBsb3JlciAoc2VlIDxhIGhyZWY9Imh0dHA6Ly9qYXZhLm5ldC9qaXJhL2Jyb3dzZS9KRVJTRVktNzU5Ij5KRVJTRVktNzU5PC9hPikuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZU5hbWVGaXggSWYgc2V0IHRvIHtAY29kZSB0cnVlfSwgaGVhZGVyIHBhcnNlciB3aWxsIG5vdCB0cmVhdCBiYWNrc2xhc2ggYXMgYW4gZXNjYXBlIGNoYXJhY3RlciB3aGVuIHJldHJpZXZpbmcKKyAgICAgKiB0aGUgdmFsdWUgb2Yge0Bjb2RlIGZpbGVuYW1lfSBwYXJhbWV0ZXIgb2Yge0Bjb2RlIENvbnRlbnQtRGlzcG9zaXRpb259IGhlYWRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgRm9ybURhdGFCb2R5UGFydChib29sZWFuIGZpbGVOYW1lRml4KSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgICAgIHRoaXMuZmlsZU5hbWVGaXggPSBmaWxlTmFtZUZpeDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnN0YW50aWF0ZXMgYW4gdW5uYW1lZCB7QGxpbmsgRm9ybURhdGFCb2R5UGFydH0gd2l0aCB0aGUKKyAgICAgKiBzcGVjaWZpZWQgY2hhcmFjdGVyaXN0aWNzLgorICAgICAqCisgICAgICogQHBhcmFtIG1lZGlhVHlwZSB0aGUge0BsaW5rIE1lZGlhVHlwZX0gZm9yIHRoaXMgYm9keSBwYXJ0LgorICAgICAqLworICAgIHB1YmxpYyBGb3JtRGF0YUJvZHlQYXJ0KE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgc3VwZXIobWVkaWFUeXBlKTsKKyAgICAgICAgdGhpcy5maWxlTmFtZUZpeCA9IGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluc3RhbnRpYXRlcyBhbiB1bm5hbWVkIHtAbGluayBGb3JtRGF0YUJvZHlQYXJ0fSB3aXRoIHRoZQorICAgICAqIHNwZWNpZmllZCBjaGFyYWN0ZXJpc3RpY3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW50aXR5IHRoZSBlbnRpdHkgZm9yIHRoaXMgYm9keSBwYXJ0LgorICAgICAqIEBwYXJhbSBtZWRpYVR5cGUgdGhlIHtAbGluayBNZWRpYVR5cGV9IGZvciB0aGlzIGJvZHkgcGFydC4KKyAgICAgKi8KKyAgICBwdWJsaWMgRm9ybURhdGFCb2R5UGFydChPYmplY3QgZW50aXR5LCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHN1cGVyKGVudGl0eSwgbWVkaWFUeXBlKTsKKyAgICAgICAgdGhpcy5maWxlTmFtZUZpeCA9IGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5hbWVkIHtAbGluayBGb3JtRGF0YUJvZHlQYXJ0fSB3aXRoIGEKKyAgICAgKiBtZWRpYSB0eXBlIG9mIHtAY29kZSB0ZXh0L3BsYWlufSBhbmQgU3RyaW5nIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIGNvbnRyb2wgbmFtZSBmb3IgdGhpcyBib2R5IHBhcnQuCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBmb3IgdGhpcyBib2R5IHBhcnQuCisgICAgICovCisgICAgcHVibGljIEZvcm1EYXRhQm9keVBhcnQoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBzdXBlcih2YWx1ZSwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSk7CisgICAgICAgIHRoaXMuZmlsZU5hbWVGaXggPSBmYWxzZTsKKyAgICAgICAgc2V0TmFtZShuYW1lKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuYW1lZCB7QGxpbmsgRm9ybURhdGFCb2R5UGFydH0gd2l0aCB0aGUKKyAgICAgKiBzcGVjaWZpZWQgY2hhcmFjdGVyaXN0aWNzLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIGNvbnRyb2wgbmFtZSBmb3IgdGhpcyBib2R5IHBhcnQuCisgICAgICogQHBhcmFtIGVudGl0eSB0aGUgZW50aXR5IGZvciB0aGlzIGJvZHkgcGFydC4KKyAgICAgKiBAcGFyYW0gbWVkaWFUeXBlIHRoZSB7QGxpbmsgTWVkaWFUeXBlfSBmb3IgdGhpcyBib2R5IHBhcnQuCisgICAgICovCisgICAgcHVibGljIEZvcm1EYXRhQm9keVBhcnQoU3RyaW5nIG5hbWUsIE9iamVjdCBlbnRpdHksIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgc3VwZXIoZW50aXR5LCBtZWRpYVR5cGUpOworICAgICAgICB0aGlzLmZpbGVOYW1lRml4ID0gZmFsc2U7CisgICAgICAgIHNldE5hbWUobmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5zdGFudGlhdGVzIGEgbmFtZWQge0BsaW5rIEZvcm1EYXRhQm9keVBhcnR9IHdpdGggdGhlCisgICAgICogc3BlY2lmaWVkIGNoYXJhY3RlcmlzdGljcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbiB0aGUgY29udGVudCBkaXNwb3NpdGlvbiBoZWFkZXIgZm9yIHRoaXMgYm9keSBwYXJ0LgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgZm9yIHRoaXMgYm9keSBwYXJ0LgorICAgICAqLworICAgIHB1YmxpYyBGb3JtRGF0YUJvZHlQYXJ0KEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uIGZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgc3VwZXIodmFsdWUsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpOworICAgICAgICB0aGlzLmZpbGVOYW1lRml4ID0gZmFsc2U7CisgICAgICAgIHNldEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uKGZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnN0YW50aWF0ZXMgYSBuYW1lZCB7QGxpbmsgRm9ybURhdGFCb2R5UGFydH0gd2l0aCB0aGUKKyAgICAgKiBzcGVjaWZpZWQgY2hhcmFjdGVyaXN0aWNzLgorICAgICAqCisgICAgICogQHBhcmFtIGZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uIHRoZSBjb250ZW50IGRpc3Bvc2l0aW9uIGhlYWRlciBmb3IgdGhpcyBib2R5IHBhcnQuCisgICAgICogQHBhcmFtIGVudGl0eSB0aGUgZW50aXR5IGZvciB0aGlzIGJvZHkgcGFydC4KKyAgICAgKiBAcGFyYW0gbWVkaWFUeXBlIHRoZSB7QGxpbmsgTWVkaWFUeXBlfSBmb3IgdGhpcyBib2R5IHBhcnQuCisgICAgICovCisgICAgcHVibGljIEZvcm1EYXRhQm9keVBhcnQoRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24gZm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24sIE9iamVjdCBlbnRpdHksIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgc3VwZXIoZW50aXR5LCBtZWRpYVR5cGUpOworICAgICAgICB0aGlzLmZpbGVOYW1lRml4ID0gZmFsc2U7CisgICAgICAgIHNldEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uKGZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBmb3JtIGRhdGEgY29udGVudCBkaXNwb3NpdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIGZvcm0gZGF0YSBjb250ZW50IGRpc3Bvc2l0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbiBnZXRGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIChGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbikgZ2V0Q29udGVudERpc3Bvc2l0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZm9ybSBkYXRhIGNvbnRlbnQgZGlzcG9zaXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24gdGhlIGZvcm0gZGF0YSBjb250ZW50IGRpc3Bvc2l0aW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uKEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uIGZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uKSB7CisgICAgICAgIHN1cGVyLnNldENvbnRlbnREaXNwb3NpdGlvbihmb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3ZlcnJpZGVzIHRoZSBiZWhhdmlvdXIgb24ge0BsaW5rIEJvZHlQYXJ0fSB0byBlbnN1cmUgdGhhdAorICAgICAqIG9ubHkgaW5zdGFuY2VzIG9mIHtAbGluayBGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbn0gY2FuIGJlIG9idGFpbmVkLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgY29udGVudCBkaXNwb3NpdGlvbi4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgY29udGVudCBkaXNwb3NpdGlvbiBoZWFkZXIgY2Fubm90IGJlIHBhcnNlZC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29udGVudERpc3Bvc2l0aW9uIGdldENvbnRlbnREaXNwb3NpdGlvbigpIHsKKyAgICAgICAgaWYgKGNvbnRlbnREaXNwb3NpdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICBTdHJpbmcgc2NkID0gZ2V0SGVhZGVycygpLmdldEZpcnN0KCJDb250ZW50LURpc3Bvc2l0aW9uIik7CisgICAgICAgICAgICBpZiAoc2NkICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBjb250ZW50RGlzcG9zaXRpb24gPSBuZXcgRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24oc2NkLCBmaWxlTmFtZUZpeCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9QQVJTSU5HX0NPTlRFTlRfRElTUE9TSVRJT04oc2NkKSwgZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29udGVudERpc3Bvc2l0aW9uOworICAgIH0KKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlcyB0aGUgYmVoYXZpb3VyIG9uIHtAbGluayBCb2R5UGFydH0gdG8gZW5zdXJlIHRoYXQKKyAgICAgKiBvbmx5IGluc3RhbmNlcyBvZiB7QGxpbmsgRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb259IGNhbiBiZSBzZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGVudERpc3Bvc2l0aW9uIHRoZSBjb250ZW50IGRpc3Bvc2l0aW9uIHdoaWNoIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9ufS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgY29udGVudCBkaXNwb3NpdGlvbiBpcyBub3QgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9ufS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50RGlzcG9zaXRpb24oQ29udGVudERpc3Bvc2l0aW9uIGNvbnRlbnREaXNwb3NpdGlvbikgeworICAgICAgICBpZiAoY29udGVudERpc3Bvc2l0aW9uIGluc3RhbmNlb2YgRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24pIHsKKyAgICAgICAgICAgIHN1cGVyLnNldENvbnRlbnREaXNwb3NpdGlvbihjb250ZW50RGlzcG9zaXRpb24pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgY29udHJvbCBuYW1lLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgY29udHJvbCBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24gZm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24gPSBnZXRGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbigpOworICAgICAgICBpZiAoZm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24uZ2V0TmFtZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGNvbnRyb2wgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBjb250cm9sIG5hbWUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICBpZiAobmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLkNPTlRST0xfTkFNRV9DQU5OT1RfQkVfTlVMTCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChnZXRGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbigpID09IG51bGwpIHsKKyAgICAgICAgICAgIEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uIGNvbnRlbnREaXNwb3NpdGlvbjsKKyAgICAgICAgICAgIGNvbnRlbnREaXNwb3NpdGlvbiA9IEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uLm5hbWUobmFtZSkuYnVpbGQoKTsKKyAgICAgICAgICAgIHN1cGVyLnNldENvbnRlbnREaXNwb3NpdGlvbihjb250ZW50RGlzcG9zaXRpb24pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24gZm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24gPSBGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbi5uYW1lKG5hbWUpCisgICAgICAgICAgICAgICAgICAgIC5maWxlTmFtZShjb250ZW50RGlzcG9zaXRpb24uZ2V0RmlsZU5hbWUoKSkKKyAgICAgICAgICAgICAgICAgICAgLmNyZWF0aW9uRGF0ZShjb250ZW50RGlzcG9zaXRpb24uZ2V0Q3JlYXRpb25EYXRlKCkpCisgICAgICAgICAgICAgICAgICAgIC5tb2RpZmljYXRpb25EYXRlKGNvbnRlbnREaXNwb3NpdGlvbi5nZXRNb2RpZmljYXRpb25EYXRlKCkpCisgICAgICAgICAgICAgICAgICAgIC5yZWFkRGF0ZShjb250ZW50RGlzcG9zaXRpb24uZ2V0UmVhZERhdGUoKSkKKyAgICAgICAgICAgICAgICAgICAgLnNpemUoY29udGVudERpc3Bvc2l0aW9uLmdldFNpemUoKSkuYnVpbGQoKTsKKyAgICAgICAgICAgIHN1cGVyLnNldENvbnRlbnREaXNwb3NpdGlvbihmb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBmaWVsZCB2YWx1ZSBmb3IgdGhpcyBib2R5IHBhcnQuIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IG9uIGJvZHkgcGFydHMgcmVwcmVzZW50aW5nIHNpbXBsZSBmaWVsZCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBzaW1wbGUgZmllbGQgdmFsdWUuCisgICAgICogQHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uIGlmIGFuIElPIGVycm9yIGFyaXNlcyBkdXJpbmcgcmVhZGluZyB0aGUgdmFsdWUuCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgY2FsbGVkIG9uIGEgYm9keSBwYXJ0IHdpdGggYSBtZWRpYSB0eXBlIG90aGVyIHRoYW4ge0Bjb2RlIHRleHQvcGxhaW59CisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKyAgICAgICAgaWYgKCFNZWRpYVR5cGVzLnR5cGVFcXVhbChNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFLCBnZXRNZWRpYVR5cGUoKSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuTUVESUFfVFlQRV9OT1RfVEVYVF9QTEFJTigpKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChnZXRFbnRpdHkoKSBpbnN0YW5jZW9mIEJvZHlQYXJ0RW50aXR5KSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VmFsdWVBcyhTdHJpbmcuY2xhc3MpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIChTdHJpbmcpIGdldEVudGl0eSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgZmllbGQgdmFsdWUgYWZ0ZXIgYXBwcm9wcmlhdGUgY29udmVyc2lvbiB0byB0aGUgcmVxdWVzdGVkIHR5cGUuIFRoaXMgaXMgdXNlZnVsIG9ubHkgd2hlbiB0aGUgY29udGFpbmluZyB7QGxpbmsKKyAgICAgKiBGb3JtRGF0YU11bHRpUGFydH0gaW5zdGFuY2UgaGFzIGJlZW4gcmVjZWl2ZWQsIHdoaWNoIGNhdXNlcyB0aGUge0Bjb2RlIHByb3ZpZGVyc30gcHJvcGVydHkgdG8gaGF2ZSBiZWVuIHNldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSA8VD4gdGhlIHR5cGUgb2YgdGhlIGZpZWxkIHZhbHVlLgorICAgICAqIEBwYXJhbSBjbGF6eiBEZXNpcmVkIGNsYXNzIGludG8gd2hpY2ggdGhlIGZpZWxkIHZhbHVlIHNob3VsZCBiZSBjb252ZXJ0ZWQuCisgICAgICogQHJldHVybiB0aGUgZmllbGQgdmFsdWUuCisgICAgICogQHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uIGlmIGFuIElPIGVycm9yIGFyaXNlcyBkdXJpbmcgcmVhZGluZyBhbiBlbnRpdHkuCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgbm8ge0Bjb2RlIE1lc3NhZ2VCb2R5UmVhZGVyfSBjYW4gYmUgZm91bmQgdG8gcGVyZm9ybSB0aGUgcmVxdWVzdGVkIGNvbnZlcnNpb24uCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gdGhlIHtAY29kZSBwcm92aWRlcnN9IHByb3BlcnR5IGhhcyBub3QgYmVlbiBzZXQgb3Igd2hlbgorICAgICAqIHRoZSBlbnRpdHkgaW5zdGFuY2UgaXMgbm90IHRoZSB1bmNvbnZlcnRlZCBjb250ZW50IG9mIHRoZSBib2R5IHBhcnQgZW50aXR5LgorICAgICAqLworICAgIHB1YmxpYyA8VD4gVCBnZXRWYWx1ZUFzKENsYXNzPFQ+IGNsYXp6KSB7CisgICAgICAgIHJldHVybiBnZXRFbnRpdHlBcyhjbGF6eik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZmllbGQgdmFsdWUgZm9yIHRoaXMgYm9keSBwYXJ0LiBUaGlzIHNob3VsZCBiZSBjYWxsZWQKKyAgICAgKiBvbmx5IG9uIGJvZHkgcGFydHMgcmVwcmVzZW50aW5nIHNpbXBsZSBmaWVsZCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGZpZWxkIHZhbHVlLgorICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIGNhbGxlZCBvbiBhIGJvZHkgcGFydCB3aXRoIGEgbWVkaWEgdHlwZSBvdGhlciB0aGFuIHtAY29kZSB0ZXh0L3BsYWlufS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgaWYgKCFNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFLmVxdWFscyhnZXRNZWRpYVR5cGUoKSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuTUVESUFfVFlQRV9OT1RfVEVYVF9QTEFJTigpKTsKKyAgICAgICAgfQorICAgICAgICBzZXRFbnRpdHkodmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGZpZWxkIG1lZGlhIHR5cGUgYW5kIHZhbHVlIGZvciB0aGlzIGJvZHkgcGFydC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZWRpYVR5cGUgdGhlIG1lZGlhIHR5cGUgZm9yIHRoaXMgZmllbGQgdmFsdWUuCisgICAgICogQHBhcmFtIHZhbHVlIHRoZSBmaWVsZCB2YWx1ZSBhcyBhIEphdmEgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKE1lZGlhVHlwZSBtZWRpYVR5cGUsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBzZXRNZWRpYVR5cGUobWVkaWFUeXBlKTsKKyAgICAgICAgc2V0RW50aXR5KHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIGJvZHkgcGFydCByZXByZXNlbnRzIGEgc2ltcGxlLCBzdHJpbmctYmFzZWQsIGZpZWxkIHZhbHVlLCBvdGhlcndpc2Uge0Bjb2RlIGZhbHNlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBpc1NpbXBsZSgpIHsKKyAgICAgICAgcmV0dXJuIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUuZXF1YWxzKGdldE1lZGlhVHlwZSgpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL21lZGlhL211bHRpcGFydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9Gb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbi5qYXZhIGIvbWVkaWEvbXVsdGlwYXJ0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvbXVsdGlwYXJ0L0Zvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYwZTU5YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL211bHRpcGFydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9Gb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbi5qYXZhCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydDsKKworaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuSHR0cEhlYWRlclJlYWRlcjsKKworLyoqCisgKiBBIGZvcm0tZGF0YSBjb250ZW50IGRpc3Bvc2l0aW9uIGhlYWRlci4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIGltcmFuQHNtYXJ0aXRlbmdpbmVlcmluZy5jb20KKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbiBleHRlbmRzIENvbnRlbnREaXNwb3NpdGlvbiB7CisKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgZm9yIHRoZSBidWlsZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgdGhlIGRpc3Bvc2l0aW9uIHR5cGUuIHdpbGwgYmUgImZvcm0tZGF0YSIuCisgICAgICogQHBhcmFtIG5hbWUgdGhlIGNvbnRyb2wgbmFtZS4KKyAgICAgKiBAcGFyYW0gZmlsZU5hbWUgdGhlIGZpbGUgbmFtZS4KKyAgICAgKiBAcGFyYW0gY3JlYXRpb25EYXRlIHRoZSBjcmVhdGlvbiBkYXRlLgorICAgICAqIEBwYXJhbSBtb2RpZmljYXRpb25EYXRlIHRoZSBtb2RpZmljYXRpb24gZGF0ZS4KKyAgICAgKiBAcGFyYW0gcmVhZERhdGUgdGhlIHJlYWQgZGF0ZS4KKyAgICAgKiBAcGFyYW0gc2l6ZSB0aGUgc2l6ZS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgdHlwZSBpcyBub3QgZXF1YWwgdG8gImZvcm0tZGF0YSIKKyAgICAgKiAgICAgICAgIG9yIHRoZSBuYW1lIGlzIHtAY29kZSBudWxsfQorICAgICAqLworICAgIHByb3RlY3RlZCBGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbihTdHJpbmcgdHlwZSwgU3RyaW5nIG5hbWUsIFN0cmluZyBmaWxlTmFtZSwKKyAgICAgICAgICAgIERhdGUgY3JlYXRpb25EYXRlLCBEYXRlIG1vZGlmaWNhdGlvbkRhdGUsIERhdGUgcmVhZERhdGUsCisgICAgICAgICAgICBsb25nIHNpemUpIHsKKyAgICAgICAgc3VwZXIodHlwZSwgZmlsZU5hbWUsIGNyZWF0aW9uRGF0ZSwgbW9kaWZpY2F0aW9uRGF0ZSwgcmVhZERhdGUsIHNpemUpOworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworCisgICAgICAgIGlmICghImZvcm0tZGF0YSIuZXF1YWxzSWdub3JlQ2FzZShnZXRUeXBlKCkpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgY29udGVudCBkaXNwb3NpdGlvbiB0eXBlIGlzIG5vdCBlcXVhbCB0byBmb3JtLWRhdGEiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBuYW1lIHBhcmFtZXRlciBpcyBub3QgcHJlc2VudCIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uKFN0cmluZyBoZWFkZXIpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMoaGVhZGVyLCBmYWxzZSk7CisgICAgfQorCisgICAgcHVibGljIEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uKFN0cmluZyBoZWFkZXIsIGJvb2xlYW4gZmlsZU5hbWVGaXgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMoSHR0cEhlYWRlclJlYWRlci5uZXdJbnN0YW5jZShoZWFkZXIpLCBmaWxlTmFtZUZpeCk7CisgICAgfQorCisgICAgcHVibGljIEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uKEh0dHBIZWFkZXJSZWFkZXIgcmVhZGVyLCBib29sZWFuIGZpbGVOYW1lRml4KSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICBzdXBlcihyZWFkZXIsIGZpbGVOYW1lRml4KTsKKyAgICAgICAgaWYgKCEiZm9ybS1kYXRhIi5lcXVhbHNJZ25vcmVDYXNlKGdldFR5cGUoKSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBjb250ZW50IGRpc3Bvc2l0aW9uIHR5cGUgaXMgbm90IGVxdWFsIHRvIGZvcm0tZGF0YSIpOworICAgICAgICB9CisKKyAgICAgICAgbmFtZSA9IGdldFBhcmFtZXRlcnMoKS5nZXQoIm5hbWUiKTsKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlIG5hbWUgcGFyYW1ldGVyIGlzIG5vdCBwcmVzZW50Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG5hbWUgcGFyYW1ldGVyLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbmFtZQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmluZ0J1aWxkZXIgdG9TdHJpbmdCdWZmZXIoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBzdXBlci50b1N0cmluZ0J1ZmZlcigpOworCisgICAgICAgIGFkZFN0cmluZ1BhcmFtZXRlcihzYiwgIm5hbWUiLCBuYW1lKTsKKworICAgICAgICByZXR1cm4gc2I7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RhcnQgYnVpbGRpbmcgYSBmb3JtIGRhdGEgY29udGVudCBkaXNwb3NpdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBjb250cm9sIG5hbWUuCisgICAgICogQHJldHVybiB0aGUgZm9ybSBkYXRhIGNvbnRlbnQgZGlzcG9zaXRpb24gYnVpbGRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uQnVpbGRlciBuYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBuZXcgRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb25CdWlsZGVyKG5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJ1aWxkZXIgdG8gYnVpbGQgZm9ybSBkYXRhIGNvbnRlbnQgZGlzcG9zaXRpb24uCisgICAgICoKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uQnVpbGRlcgorICAgICAgICAgICAgZXh0ZW5kcyBDb250ZW50RGlzcG9zaXRpb25CdWlsZGVyPEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uQnVpbGRlciwgRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24+IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisgICAgICAgIEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uQnVpbGRlcihTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgc3VwZXIoImZvcm0tZGF0YSIpOworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24gYnVpbGQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uKHR5cGUsIG5hbWUsIGZpbGVOYW1lLCBjcmVhdGlvbkRhdGUsIG1vZGlmaWNhdGlvbkRhdGUsIHJlYWREYXRlLCBzaXplKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL211bHRpcGFydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9Gb3JtRGF0YU11bHRpUGFydC5qYXZhIGIvbWVkaWEvbXVsdGlwYXJ0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvbXVsdGlwYXJ0L0Zvcm1EYXRhTXVsdGlQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZjMDc2NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL211bHRpcGFydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9Gb3JtRGF0YU11bHRpUGFydC5qYXZhCkBAIC0wLDAgKzEsMTc1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuTWVkaWFUeXBlczsKKworLyoqCisgKiBTdWJjbGFzcyBvZiB7QGxpbmsgTXVsdGlQYXJ0fSB3aXRoIHNwZWNpYWxpemVkIHN1cHBvcnQgZm9yIG1lZGlhIHR5cGUge0Bjb2RlIG11bHRpcGFydC9mb3JtLWRhdGF9LiBTZWUKKyAqIDxhIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzIzODgudHh0Ij5SRkMgMjM4ODwvYT4gZm9yIHRoZSBmb3JtYWwgZGVmaW5pdGlvbiBvZiB0aGlzIG1lZGlhIHR5cGUuCisgKiA8cC8+CisgKiBGb3IgYSBzZXJ2ZXIgc2lkZSBhcHBsaWNhdGlvbiB3aXNoaW5nIHRvIHByb2Nlc3MgYW4gaW5jb21pbmcge0Bjb2RlIG11bHRpcGFydC9mb3JtLWRhdGF9IG1lc3NhZ2UsIHRoZSBmb2xsb3dpbmcgZmVhdHVyZXMKKyAqIGFyZSBwcm92aWRlZDoKKyAqIDx1bD4KKyAqIDxsaT5JbmNvbWluZyBlbnRpdGllcyB3aWxsIGJlIG9mIHR5cGUge0BsaW5rIEZvcm1EYXRhTXVsdGlQYXJ0fSwgZW5hYmxpbmcgYWNjZXNzIHRvIHRoZSBzcGVjaWFsaXplZCBtZXRob2RzLjwvbGk+CisgKiA8bGk+SW5jb21pbmcgYm9keSBwYXJ0cyB3aWxsIGJlIG9mIHR5cGUge0BsaW5rIEZvcm1EYXRhQm9keVBhcnR9LCBlbmFibGluZyBhY2Nlc3MgdG8gaXRzIHNwZWNpYWxpemVkIG1ldGhvZHMuPC9saT4KKyAqIDxsaT5Db252ZW5pZW5jZSBtZXRob2QgdG8gcmV0dXJuIHRoZSB7QGxpbmsgRm9ybURhdGFCb2R5UGFydH0gZm9yIGEgc3BlY2lmaWVkIGNvbnRyb2wgbmFtZS48L2xpPgorICogPGxpPkNvbnZlbmllbmNlIG1ldGhvZCB0byByZXR1cm4gYSB7QGNvZGUgTWFwfSBvZiB7QGxpbmsgRm9ybURhdGFCb2R5UGFydH1zIGZvciBhbGwgZmllbGRzLCBrZXllZCBieSBmaWVsZCBuYW1lLjwvbGk+CisgKiA8L3VsPgorICogPHAvPgorICogRm9yIGEgY2xpZW50IHNpZGUgYXBwbGljYXRpb24gd2lzaGluZyB0byBjb25zdHJ1Y3QgYW4gb3V0Z29pbmcKKyAqIHtAY29kZSBtdWx0aXBhcnQvZm9ybS1kYXRhfSBtZXNzYWdlLCB0aGUgZm9sbG93aW5nIGZlYXR1cmVzCisgKiBhcmUgcHJvdmlkZWQ6CisgKiA8dWw+CisgKiA8bGk+TWVkaWEgdHlwZSBvZiB0aGUge0BsaW5rIEZvcm1EYXRhTXVsdGlQYXJ0fSBpbnN0YW5jZSB3aWxsIGF1dG9tYXRpY2FsbHkgc2V0IHRvIHtAY29kZSBtdWx0aXBhcnQvZm9ybS1kYXRhfS48L2xpPgorICogPGxpPkJ1aWxkZXIgcGF0dGVybiBtZXRob2QgdG8gYWRkIHNpbXBsZSBmaWVsZCB2YWx1ZXMgYXMgYm9keSBwYXJ0cyBvZiB0eXBlIHtAY29kZSB0ZXh0L3BsYWlufS48L2xpPgorICogPGxpPkJ1aWxkZXIgcGF0dGVybiBtZXRob2QgdG8gYWRkIG5hbWVkICJmaWxlIiBmaWVsZCB2YWx1ZXMgd2l0aCBhcmJpdHJhcnkgbWVkaWEgdHlwZXMuPC9saT4KKyAqIDwvdWw+CisgKiA8cC8+CisgKiBUT0RPIENvbnNpZGVyIHN1cHBvcnRpbmcgdGhlIHVzZSBjYXNlIG9mIGEgbmVzdGVkIHtAY29kZSBtdWx0aXBhcnQvbWl4ZWR9IGJvZHkgcGFydCB0byBjb250YWluIG11bHRpcGxlIHVwbG9hZGVkIGZpbGVzLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgTWNDbGFuYWhhbgorICogQGF1dGhvciBJbXJhbiBNIFlvdXN1ZiAoaW1yYW4gYXQgc21hcnRpdGVuZ2luZWVyaW5nLmNvbSkKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgRm9ybURhdGFNdWx0aVBhcnQgZXh0ZW5kcyBNdWx0aVBhcnQgeworCisgICAgLyoqCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IHtAY29kZSBGb3JtRGF0YU11bHRpUGFydH0gaW5zdGFuY2Ugd2l0aAorICAgICAqIGRlZmF1bHQgY2hhcmFjdGVyaXN0aWNzLgorICAgICAqLworICAgIHB1YmxpYyBGb3JtRGF0YU11bHRpUGFydCgpIHsKKyAgICAgICAgc3VwZXIoTWVkaWFUeXBlLk1VTFRJUEFSVF9GT1JNX0RBVEFfVFlQRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQnVpbGRlciBwYXR0ZXJuIG1ldGhvZCB0byBhZGQgYSBuYW1lZCBmaWVsZCB3aXRoIGEgdGV4dCB2YWx1ZSwKKyAgICAgKiBhbmQgcmV0dXJuIHRoaXMgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgY29udHJvbCBuYW1lLgorICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgdGV4dCB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIHRoaXMgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIEZvcm1EYXRhTXVsdGlQYXJ0IGZpZWxkKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgZ2V0Qm9keVBhcnRzKCkuYWRkKG5ldyBGb3JtRGF0YUJvZHlQYXJ0KG5hbWUsIHZhbHVlKSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJ1aWxkZXIgcGF0dGVybiBtZXRob2QgdG8gYWRkIGEgbmFtZWQgZmllbGQgd2l0aCBhbiBhcmJpdHJhcnkKKyAgICAgKiBtZWRpYSB0eXBlIGFuZCBlbnRpdHksIGFuZCByZXR1cm4gdGhpcyBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBjb250cm9sIG5hbWUuCisgICAgICogQHBhcmFtIGVudGl0eSBlbnRpdHkgdmFsdWUgZm9yIHRoZSBuZXcgZmllbGQuCisgICAgICogQHBhcmFtIG1lZGlhVHlwZSBtZWRpYSB0eXBlIGZvciB0aGUgbmV3IGZpZWxkLgorICAgICAqIEByZXR1cm4gdGhpcyBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRm9ybURhdGFNdWx0aVBhcnQgZmllbGQoU3RyaW5nIG5hbWUsIE9iamVjdCBlbnRpdHksIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgZ2V0Qm9keVBhcnRzKCkuYWRkKG5ldyBGb3JtRGF0YUJvZHlQYXJ0KG5hbWUsIGVudGl0eSwgbWVkaWFUeXBlKSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgYSBmb3JtIGRhdGEgYm9keSBwYXJ0IGdpdmVuIGEgY29udHJvbCBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIGNvbnRyb2wgbmFtZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBmb3JtIGRhdGEgYm9keSBwYXJ0LCBvdGhlcndpc2UgbnVsbCBpZiBubyBwYXJ0IGlzIHByZXNlbnQgd2l0aCB0aGUgZ2l2ZW4gY29udHJvbCBuYW1lLiBJZiBtb3JlIHRoYXQgb25lIHBhcnQKKyAgICAgKiBpcyBwcmVzZW50IHdpdGggdGhlIHNhbWUgY29udHJvbCBuYW1lLCB0aGVuIHRoZSBmaXJzdCBwYXJ0IHRoYXQgb2NjdXJzIGlzIHJldHVybmVkLgorICAgICAqLworICAgIHB1YmxpYyBGb3JtRGF0YUJvZHlQYXJ0IGdldEZpZWxkKFN0cmluZyBuYW1lKSB7CisgICAgICAgIEZvcm1EYXRhQm9keVBhcnQgcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgZm9yIChCb2R5UGFydCBib2R5UGFydCA6IGdldEJvZHlQYXJ0cygpKSB7CisgICAgICAgICAgICBpZiAoIShib2R5UGFydCBpbnN0YW5jZW9mIEZvcm1EYXRhQm9keVBhcnQpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoKChGb3JtRGF0YUJvZHlQYXJ0KSBib2R5UGFydCkuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IChGb3JtRGF0YUJvZHlQYXJ0KSBib2R5UGFydDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgYSBsaXN0IG9mIG9uZSBvciBtb3JlIGZvcm0gZGF0YSBib2R5IHBhcnRzIGdpdmVuIGEgY29udHJvbCBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIGNvbnRyb2wgbmFtZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBsaXN0IG9mIGZvcm0gZGF0YSBib2R5IHBhcnRzLCBvdGhlcndpc2UgbnVsbCBpZiBubyBwYXJ0cyBhcmUgcHJlc2VudCB3aXRoIHRoZSBnaXZlbiBjb250cm9sIG5hbWUuCisgICAgICovCisgICAgcHVibGljIExpc3Q8Rm9ybURhdGFCb2R5UGFydD4gZ2V0RmllbGRzKFN0cmluZyBuYW1lKSB7CisgICAgICAgIExpc3Q8Rm9ybURhdGFCb2R5UGFydD4gcmVzdWx0ID0gbnVsbDsKKyAgICAgICAgZm9yIChCb2R5UGFydCBib2R5UGFydCA6IGdldEJvZHlQYXJ0cygpKSB7CisgICAgICAgICAgICBpZiAoIShib2R5UGFydCBpbnN0YW5jZW9mIEZvcm1EYXRhQm9keVBhcnQpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobmFtZS5lcXVhbHMoKChGb3JtRGF0YUJvZHlQYXJ0KSBib2R5UGFydCkuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoKEZvcm1EYXRhQm9keVBhcnQpIGJvZHlQYXJ0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgYSBtYXAgb2YgZm9ybSBkYXRhIGJvZHkgcGFydHMgd2hlcmUgdGhlIGtleSBpcyB0aGUgY29udHJvbCBuYW1lCisgICAgICogYW5kIHRoZSB2YWx1ZSBpcyBhIGxpc3Qgb2Ygb25lIG9yIG1vcmUgZm9ybSBkYXRhIGJvZHkgcGFydHMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHJldHVybiB0aGUgbWFwIG9mIGZvcm0gZGF0YSBib2R5IHBhcnRzLgorICAgICAqLworICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBMaXN0PEZvcm1EYXRhQm9keVBhcnQ+PiBnZXRGaWVsZHMoKSB7CisgICAgICAgIE1hcDxTdHJpbmcsIExpc3Q8Rm9ybURhdGFCb2R5UGFydD4+IG1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgZm9yIChCb2R5UGFydCBib2R5UGFydCA6IGdldEJvZHlQYXJ0cygpKSB7CisgICAgICAgICAgICBpZiAoIShib2R5UGFydCBpbnN0YW5jZW9mIEZvcm1EYXRhQm9keVBhcnQpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEZvcm1EYXRhQm9keVBhcnQgcCA9IChGb3JtRGF0YUJvZHlQYXJ0KSBib2R5UGFydDsKKyAgICAgICAgICAgIExpc3Q8Rm9ybURhdGFCb2R5UGFydD4gbCA9IG1hcC5nZXQocC5nZXROYW1lKCkpOworICAgICAgICAgICAgaWYgKGwgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGwgPSBuZXcgQXJyYXlMaXN0PD4oMSk7CisgICAgICAgICAgICAgICAgbWFwLnB1dChwLmdldE5hbWUoKSwgbCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsLmFkZChwKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbWFwOworICAgIH0KKworICAgIC8qKgorICAgICAqIERpc2FibGVzIGNoYW5naW5nIHRoZSBtZWRpYSB0eXBlIHRvIGFueXRoaW5nIG90aGVyIHRoYW4ge0Bjb2RlIG11bHRpcGFydC9mb3JtLWRhdGF9LgorICAgICAqCisgICAgICogQHBhcmFtIG1lZGlhVHlwZSB0aGUgcHJvcG9zZWQgbWVkaWEgdHlwZS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgcHJvcG9zZWQgbWVkaWEgdHlwZSBpcyBub3Qge0Bjb2RlIG11bHRpcGFydC9mb3JtLWRhdGF9LgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhVHlwZShNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIGlmICghTWVkaWFUeXBlcy50eXBlRXF1YWwobWVkaWFUeXBlLCBNZWRpYVR5cGUuTVVMVElQQVJUX0ZPUk1fREFUQV9UWVBFKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5GT1JNX0RBVEFfTVVMVElQQVJUX0NBTk5PVF9DSEFOR0VfTUVESUFUWVBFKCkpOworICAgICAgICB9CisgICAgICAgIHN1cGVyLnNldE1lZGlhVHlwZShtZWRpYVR5cGUpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbXVsdGlwYXJ0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvbXVsdGlwYXJ0L0Zvcm1EYXRhUGFyYW0uamF2YSBiL21lZGlhL211bHRpcGFydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9Gb3JtRGF0YVBhcmFtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDI4MDY2MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL211bHRpcGFydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9Gb3JtRGF0YVBhcmFtLmphdmEKQEAgLTAsMCArMSwxNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0OworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5EZWZhdWx0VmFsdWU7CitpbXBvcnQgamF2YXgud3MucnMuRm9ybVBhcmFtOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LkZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5QYXJhbVF1YWxpZmllcjsKKworLyoqCisgKiBCaW5kcyB0aGUgbmFtZWQgYm9keSBwYXJ0KHMpIG9mIGEgIm11bHRpcGFydC9mb3JtLWRhdGEiIHJlcXVlc3QKKyAqIGVudGl0eSBib2R5IHRvIGEgcmVzb3VyY2UgbWV0aG9kIHBhcmFtZXRlci4KKyAqIDxwLz4KKyAqIFRoZSB7QGxpbmsgRm9ybVBhcmFtfSBhbm5vdGF0aW9uIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIG1lZGlhIHR5cGUKKyAqICJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiIGlzIGluZWZmaWNpZW50IGZvciBzZW5kaW5nIGFuZAorICogY29uc3VtaW5nIGxhcmdlIHF1YW50aXRpZXMgb2YgYmluYXJ5IGRhdGEgb3IgdGV4dCBjb250YWluaW5nIG5vbi1BU0NJSQorICogY2hhcmFjdGVycy4KKyAqIDxwLz4KKyAqIFRoaXMgYW5ub3RhdGlvbiBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBtZWRpYSB0eXBlICJtdWx0aXBhcnQvZm9ybS1kYXRhIgorICogc2hvdWxkIGJlIHVzZWQgZm9yIHN1Ym1pdHRpbmcgYW5kIGNvbnN1bWluZyBmb3JtcyB0aGF0IGNvbnRhaW4gZmlsZXMsCisgKiBub24tQVNDSUkgZGF0YSwgYW5kIGJpbmFyeSBkYXRhLgorICogPHAvPgorICogVGhlIHR5cGUge0Bjb2RlIFR9IG9mIHRoZSBhbm5vdGF0ZWQgcGFyYW1ldGVyIG11c3QgYmUgb25lIG9mIHRoZQorICogZm9sbG93aW5nOgorICogPG9sPgorICogPGxpPntAbGluayBGb3JtRGF0YUJvZHlQYXJ0fS4gVGhlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIgd2lsbCBiZSB0aGUKKyAqICAgICBmaXJzdCBuYW1lZCBib2R5IHBhcnQsIG90aGVyd2lzZSBudWxsIGlmIHN1Y2ggYSBuYW1lZCBib2R5IHBhcnQgaXMgbm90CisgKiAgICAgcHJlc2VudC4KKyAqIDxsaT5BIHtAY29kZSBMaXN0fSBvciB7QGNvZGUgQ29sbGVjdGlvbn0gb2Yge0BsaW5rIEZvcm1EYXRhQm9keVBhcnR9LgorICogICAgIFRoZSB2YWx1ZSBvZiB0aGUKKyAqICAgICBwYXJhbWV0ZXIgd2lsbCBvbmUgb3IgbW9yZSBuYW1lZCBib2R5IHBhcnRzIHdpdGggdGhlIHNhbWUgbmFtZSwgb3RoZXJ3aXNlCisgKiAgICAgbnVsbCBpZiBzdWNoIGEgbmFtZWQgYm9keSBwYXJ0IGlzIG5vdCBwcmVzZW50LgorICogPGxpPntAbGluayBGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbn0uIFRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyIHdpbGwgYmUKKyAqICAgICB0aGUgY29udGVudCBkaXNwb3NpdGlvbiBvZiB0aGUgZmlyc3QgbmFtZWQgYm9keSBwYXJ0LCBvdGhlcndpc2UgbnVsbCBpZgorICogICAgIHN1Y2ggYSBuYW1lZCBib2R5IHBhcnQgaXMgbm90IHByZXNlbnQuCisgKiA8bGk+QSB7QGNvZGUgTGlzdH0gb3Ige0Bjb2RlIENvbGxlY3Rpb259IG9mIHtAbGluayBGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbn0uCisgKiAgICAgVGhlIHZhbHVlIG9mCisgKiAgICAgdGhlIHBhcmFtZXRlciB3aWxsIG9uZSBvciBtb3JlIGNvbnRlbnQgZGlzcG9zaXRpb25zIG9mIHRoZSBuYW1lZCBib2R5IHBhcnRzCisgKiAgICAgd2l0aCB0aGUgc2FtZSBuYW1lLCBvdGhlcndpc2UgbnVsbCBpZiBzdWNoIGEgbmFtZWQgYm9keSBwYXJ0IGlzIG5vdAorICogICAgIHByZXNlbnQuCisgKiA8bGk+QSB0eXBlIGZvciB3aGljaCBhIG1lc3NhZ2UgYm9keSByZWFkZXIgaXMgYXZhaWxhYmxlIGdpdmVuIHRoZSBtZWRpYSB0eXBlCisgKiAgICAgb2YgdGhlIGZpcnN0IG5hbWVkIGJvZHkgcGFydC4gVGhlIHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXIgd2lsbCBiZSB0aGUKKyAqICAgICByZXN1bHQgb2YgcmVhZGluZyB1c2luZyB0aGUgbWVzc2FnZSBib2R5IHJlYWRlciBnaXZlbiB0aGUgdHlwZSB7QGNvZGUgVH0sCisgKiAgICAgdGhlIG1lZGlhIHR5cGUgb2YgdGhlIG5hbWVkIHBhcnQsIGFuZCB0aGUgYnl0ZXMgb2YgdGhlIG5hbWVkIGJvZHkgcGFydCBhcworICogICAgIGlucHV0LgorICogICAgIDxwPgorICogICAgIElmIHRoZXJlIGlzIG5vIG5hbWVkIHBhcnQgcHJlc2VudCBhbmQgdGhlcmUgaXMgYSBkZWZhdWx0IHZhbHVlIHByZXNlbnQgYXMKKyAqICAgICBkZWNsYXJlZCBieSB7QGxpbmsgRGVmYXVsdFZhbHVlfSB0aGVuIHRoZSBtZWRpYSB0eXBlIHdpbGwgYmUgc2V0IHRvCisgKiAgICAgInRleHQvcGxhaW4iLiBUaGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlciB3aWxsIGJlIHRoZSByZXN1bHQgb2YgcmVhZGluZworICogICAgIHVzaW5nIHRoZSBtZXNzYWdlIGJvZHkgcmVhZGVyIGdpdmVuIHRoZSB0eXBlIHtAY29kZSBUfSwgdGhlIG1lZGlhIHR5cGUKKyAqICAgICAidGV4dC9wbGFpbiIsIGFuZCB0aGUgVVRGLTggZW5jb2RlZCBieXRlcyBvZiB0aGUgZGVmYXVsdCB2YWx1ZSBhcyBpbnB1dC4KKyAqICAgICA8cD4KKyAqICAgICBJZiB0aGVyZSBpcyBubyBtZXNzYWdlIGJvZHkgcmVhZGVyIGF2YWlsYWJsZSBhbmQgdGhlIHR5cGUge0Bjb2RlIFR9IGNvbmZvcm1zCisgKiAgICAgdG8gYSB0eXBlIHNwZWNpZmllZCBieSB7QGxpbmsgRm9ybVBhcmFtfSB0aGVuIHByb2Nlc3NpbmcgaXMgcGVyZm9ybWVkCisgKiAgICAgYXMgc3BlY2lmaWVkIGJ5IHtAbGluayBGb3JtUGFyYW19LCB3aGVyZSB0aGUgdmFsdWVzIG9mIHRoZSBmb3JtIHBhcmFtZXRlcgorICogICAgIGFyZSB7QGNvZGUgU3RyaW5nfSBpbnN0YW5jZXMgcHJvZHVjZWQgYnkgcmVhZGluZyB0aGUgYnl0ZXMgb2YgdGhlIG5hbWVkIGJvZHkKKyAqICAgICBwYXJ0cyB1dGlsaXppbmcgYSBtZXNzYWdlIGJvZHkgcmVhZGVyIGZvciB0aGUge0Bjb2RlIFN0cmluZ30gdHlwZSBhbmQgdGhlCisgKiAgICAgbWVkaWEgdHlwZSAidGV4dC9wbGFpbiIuCisgKiAgICAgPHA+CisgKiAgICAgSWYgdGhlcmUgaXMgbm8gbmFtZWQgcGFydCBwcmVzZW50IHRoZW4gcHJvY2Vzc2luZyBpcyBwZXJmb3JtZWQgYXMKKyAqICAgICBzcGVjaWZpZWQgYnkge0BsaW5rIEZvcm1QYXJhbX0uPC9saT4KKyAqIDwvb2w+CisgKiA8cC8+CisgKiBGb3IgZXhhbXBsZSwgdGhlIHVzZSBvZiB0aGlzIGFubm90YXRpb24gYWxsb3dzIG9uZSB0byBzdXBwb3J0IHRoZQorICogZm9sbG93aW5nOgorICogPGJsb2NrcXVvdGU+PHByZT4KKyAqICAgICAmIzA2NDtQT1NUCisgKiAgICAgJiMwNjQ7Q29uc3VtZXMoTWVkaWFUeXBlLk1VTFRJUEFSVF9GT1JNX0RBVEFfVFlQRSkKKyAqICAgICBwdWJsaWMgU3RyaW5nIHBvc3RGb3JtKAorICogICAgICAgICAgICAgJiMwNjQ7RGVmYXVsdFZhbHVlKCJ0cnVlIikgJiMwNjQ7Rm9ybURhdGFQYXJhbSgiZW5hYmxlZCIpIGJvb2xlYW4gZW5hYmxlZCwKKyAqICAgICAgICAgICAgICYjMDY0O0Zvcm1EYXRhUGFyYW0oImRhdGEiKSBGaWxlRGF0YSBiZWFuLAorICogICAgICAgICAgICAgJiMwNjQ7Rm9ybURhdGFQYXJhbSgiZmlsZSIpIElucHV0U3RyZWFtIGZpbGUsCisgKiAgICAgICAgICAgICAmIzA2NDtGb3JtRGF0YVBhcmFtKCJmaWxlIikgRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24gZmlsZURpc3Bvc2l0aW9uKSB7CisgKiAgICAgICAgIC4uLgorICogICAgIH0KKyAqIDwvcHJlPjwvYmxvY2txdW90ZT4KKyAqIFdoZXJlIHRoZSBzZXJ2ZXIgY29uc3VtZXMgYSAibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgcmVxdWVzdCBlbnRpdHkgYm9keSB0aGF0CisgKiBjb250YWlucyBvbmUgb3B0aW9uYWwgbmFtZWQgYm9keSBwYXJ0ICJlbmFibGVkIiBhbmQgdHdvIHJlcXVpcmVkIG5hbWVkCisgKiBib2R5IHBhcnRzICJkYXRhIiBhbmQgImZpbGUiLgorICogPHAvPgorICogVGhlIG9wdGlvbmFsIHBhcnQgImVuYWJsZWQiIGlzIHByb2Nlc3NlZAorICogYXMgYSB7QGNvZGUgYm9vbGVhbn0gdmFsdWUsIGlmIHRoZSBwYXJ0IGlzIGFic2VudCB0aGVuIHRoZQorICogdmFsdWUgd2lsbCBiZSB7QGNvZGUgdHJ1ZX0uCisgKiA8cC8+CisgKiBUaGUgcGFydCAiZGF0YSIgaXMgcHJvY2Vzc2VkIGFzIGEgSkFYQiBiZWFuIGFuZCBjb250YWlucyBzb21lIG1ldGEtZGF0YQorICogYWJvdXQgdGhlIGZvbGxvd2luZyBwYXJ0LgorICogPHAvPgorICogVGhlIHBhcnQgImZpbGUiIGlzIGEgZmlsZSB0aGF0IGlzIHVwbG9hZGVkLCB0aGlzIGlzIHByb2Nlc3NlZCBhcyBhbgorICoge0Bjb2RlIElucHV0U3RyZWFtfS4gQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZmlsZSBmcm9tIHRoZQorICogIkNvbnRlbnQtRGlzcG9zaXRpb24iIGhlYWRlciBjYW4gYmUgYWNjZXNzZWQgYnkgdGhlIHBhcmFtZXRlcgorICoge0Bjb2RlIGZpbGVEaXNwb3NpdGlvbn0uCisgKiA8cC8+CisgKiBOb3RlIHRoYXQsIHdoaWxzdCB0aGUgYW5ub3RhdGlvbiB0YXJnZXQgcGVybWl0cyB1c2Ugb24gZmllbGRzIGFuZCBtZXRob2RzLAorICogdGhpcyBhbm5vdGF0aW9uIGlzIG9ubHkgcmVxdWlyZWQgdG8gYmUgc3VwcG9ydGVkIG9uIHJlc291cmNlIG1ldGhvZAorICogcGFyYW1ldGVycy4KKyAqCisgKiBAc2VlIEZvcm1EYXRhTXVsdGlQYXJ0CisgKiBAc2VlIEZvcm1EYXRhQm9keVBhcnQKKyAqIEBzZWUgRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24KKyAqIEBzZWUgamF2YXgud3MucnMuRGVmYXVsdFZhbHVlCisgKiBAc2VlIGphdmF4LndzLnJzLkZvcm1QYXJhbQorICoKKyAqIEBhdXRob3IgQ3JhaWcgTWNDbGFuYWhhbgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BUYXJnZXQoe0VsZW1lbnRUeXBlLlBBUkFNRVRFUiwgRWxlbWVudFR5cGUuTUVUSE9ELCBFbGVtZW50VHlwZS5GSUVMRH0pCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorQFBhcmFtUXVhbGlmaWVyCitwdWJsaWMgQGludGVyZmFjZSBGb3JtRGF0YVBhcmFtIHsKKworICAgIC8qKgorICAgICAqIERlZmluZXMgdGhlIGNvbnRyb2wgbmFtZSBvZiBhICJtdWx0aXBhcnQvZm9ybS1kYXRhIiBib2R5IHBhcnQgd2hvc2UKKyAgICAgKiBjb250ZW50IHdpbGwgYmUgdXNlZCB0byBpbml0aWFsaXplIHRoZSB2YWx1ZSBvZiB0aGUgYW5ub3RhdGVkIG1ldGhvZAorICAgICAqIGFyZ3VtZW50LgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgY29udHJvbCBuYW1lIG9mIGEgIm11bHRpcGFydC9mb3JtLWRhdGEiIGJvZHkgcGFydC4KKyAgICAgKi8KKyAgICBTdHJpbmcgdmFsdWUoKTsKKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbXVsdGlwYXJ0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvbXVsdGlwYXJ0L0Zvcm1EYXRhUGFyYW1FeGNlcHRpb24uamF2YSBiL21lZGlhL211bHRpcGFydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9Gb3JtRGF0YVBhcmFtRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEwNTA0YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL211bHRpcGFydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9Gb3JtRGF0YVBhcmFtRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlBhcmFtRXhjZXB0aW9uOworCisvKioKKyAqIEEgcGFyYW1ldGVyLWJhc2VkIGV4Y2VwdGlvbiBmb3IgZXJyb3JzIHdpdGgge0BsaW5rIEZvcm1EYXRhUGFyYW19LgorICoKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBGb3JtRGF0YVBhcmFtRXhjZXB0aW9uIGV4dGVuZHMgUGFyYW1FeGNlcHRpb24geworCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyB7QGxpbmsgRm9ybURhdGFQYXJhbX0gZXhjZXB0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNhdXNlICAgICAgICAgICAgICByZWFsIGNhdXNlLgorICAgICAqIEBwYXJhbSBuYW1lICAgICAgICAgICAgICAgcGFyYW1ldGVyIG5hbWUuCisgICAgICogQHBhcmFtIGRlZmF1bHRTdHJpbmdWYWx1ZSBkZWZhdWx0IHZhbHVlLgorICAgICAqLworICAgIHB1YmxpYyBGb3JtRGF0YVBhcmFtRXhjZXB0aW9uKGZpbmFsIFRocm93YWJsZSBjYXVzZSwgZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyBkZWZhdWx0U3RyaW5nVmFsdWUpIHsKKyAgICAgICAgc3VwZXIoY2F1c2UsIFJlc3BvbnNlLlN0YXR1cy5CQURfUkVRVUVTVCwgRm9ybURhdGFQYXJhbS5jbGFzcywgbmFtZSwgZGVmYXVsdFN0cmluZ1ZhbHVlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9tdWx0aXBhcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9tdWx0aXBhcnQvTXVsdGlQYXJ0LmphdmEgYi9tZWRpYS9tdWx0aXBhcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9tdWx0aXBhcnQvTXVsdGlQYXJ0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIwOTJiYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL211bHRpcGFydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9NdWx0aVBhcnQuamF2YQpAQCAtMCwwICsxLDE2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQ7CisKK2ltcG9ydCBqYXZhLmlvLkNsb3NlYWJsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKKy8qKgorICogQSBtdXRhYmxlIG1vZGVsIHJlcHJlc2VudGluZyBhIE1JTUUgTXVsdGlQYXJ0IGVudGl0eS4gIFRoaXMgY2xhc3MgZXh0ZW5kcworICoge0BsaW5rIEJvZHlQYXJ0fSBiZWNhdXNlIE11bHRpUGFydCBlbnRpdGllcyBjYW4gYmUgbmVzdGVkIGluc2lkZSBvdGhlcgorICogTXVsdGlQYXJ0IGVudGl0aWVzIHRvIGFuIGFyYml0cmFyeSBkZXB0aC4KKyAqCisgKiBAYXV0aG9yIENyYWlnIE1jQ2xhbmFoYW4KKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgTXVsdGlQYXJ0IGV4dGVuZHMgQm9keVBhcnQgaW1wbGVtZW50cyBDbG9zZWFibGUgeworCisgICAgcHJpdmF0ZSBCb2R5UGFydHNMaXN0IGJvZHlQYXJ0cyA9IG5ldyBCb2R5UGFydHNMaXN0KHRoaXMpOworCisgICAgLyoqCisgICAgICogSW5zdGFudGlhdGVzIGEgbmV3IHtAbGluayBNdWx0aVBhcnR9IHdpdGggYSB7QGNvZGUgbWVkaWFUeXBlfSBvZgorICAgICAqIHtAY29kZSBtdWx0aXBhcnQvbWl4ZWR9LgorICAgICAqLworICAgIHB1YmxpYyBNdWx0aVBhcnQoKSB7CisgICAgICAgIHN1cGVyKG5ldyBNZWRpYVR5cGUoIm11bHRpcGFydCIsICJtaXhlZCIpKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEluc3RhbnRpYXRlcyBhIG5ldyB7QGxpbmsgTXVsdGlQYXJ0fSB3aXRoIHRoZSBzcGVjaWZpZWQgY2hhcmFjdGVyaXN0aWNzLgorICAgICAqCisgICAgICogQHBhcmFtIG1lZGlhVHlwZSB0aGUge0BsaW5rIE1lZGlhVHlwZX0gZm9yIHRoaXMgbXVsdGlwYXJ0LgorICAgICAqLworICAgIHB1YmxpYyBNdWx0aVBhcnQoTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICBzdXBlcihtZWRpYVR5cGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhIG11dGFibGUgbGlzdCBvZiB7QGxpbmsgQm9keVBhcnR9cyBuZXN0ZWQgaW4gdGhpcworICAgICAqIHtAbGluayBNdWx0aVBhcnR9LgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PEJvZHlQYXJ0PiBnZXRCb2R5UGFydHMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmJvZHlQYXJ0czsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNhYmxlcyBhY2Nlc3MgdG8gdGhlIGVudGl0eSBmb3IgYSB7QGxpbmsgTXVsdGlQYXJ0fS4gVXNlIHRoZSBsaXN0CisgICAgICogcmV0dXJuZWQgYnkge0Bjb2RlIGdldEJvZHlQYXJ0cygpfSB0byBhY2Nlc3MgdGhlIHJlbGV2YW50CisgICAgICoge0BsaW5rIEJvZHlQYXJ0fSBpbnN0ZWFkLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gdGhyb3duIHVuY29uZGl0aW9uYWxseS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IGdldEVudGl0eSgpIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2Fubm90IGdldCBlbnRpdHkgb24gYSBNdWx0aVBhcnQgaW5zdGFuY2UiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEaXNhYmxlcyBhY2Nlc3MgdG8gdGhlIGVudGl0eSBmb3IgYSB7QGxpbmsgTXVsdGlQYXJ0fS4gVXNlIHRoZSBsaXN0CisgICAgICogcmV0dXJuZWQgYnkge0Bjb2RlIGdldEJvZHlQYXJ0cygpfSB0byBhY2Nlc3MgdGhlIHJlbGV2YW50CisgICAgICoge0BsaW5rIEJvZHlQYXJ0fSBpbnN0ZWFkLgorICAgICAqCisgICAgICogQHBhcmFtIGVudGl0eQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldEVudGl0eShPYmplY3QgZW50aXR5KSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNhbm5vdCBzZXQgZW50aXR5IG9uIGEgTXVsdGlQYXJ0IGluc3RhbmNlIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUge0BsaW5rIE1lZGlhVHlwZX0gZm9yIHRoaXMge0BsaW5rIE11bHRpUGFydH0uIElmIG5ldmVyIHNldCwKKyAgICAgKiB0aGUgZGVmYXVsdCB7QGxpbmsgTWVkaWFUeXBlfSBNVVNUIGJlIHtAY29kZSBtdWx0aXBhcnQvbWl4ZWR9LgorICAgICAqCisgICAgICogQHBhcmFtIG1lZGlhVHlwZSB0aGUgbmV3IHtAbGluayBNZWRpYVR5cGV9LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSB7QGNvZGUgdHlwZX0gcHJvcGVydHkgaXMgbm90IHNldCB0byB7QGNvZGUgbXVsdGlwYXJ0fS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRNZWRpYVR5cGUoTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICBpZiAoISJtdWx0aXBhcnQiLmVxdWFscyhtZWRpYVR5cGUuZ2V0VHlwZSgpKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihtZWRpYVR5cGUudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgc3VwZXIuc2V0TWVkaWFUeXBlKG1lZGlhVHlwZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQnVpbGRlciBwYXR0ZXJuIG1ldGhvZCB0byBhZGQgdGhlIHNwZWNpZmllZCB7QGxpbmsgQm9keVBhcnR9IHRvIHRoaXMKKyAgICAgKiB7QGxpbmsgTXVsdGlQYXJ0fS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBib2R5UGFydCB7QGxpbmsgQm9keVBhcnR9IHRvIGJlIGFkZGVkLgorICAgICAqLworICAgIHB1YmxpYyBNdWx0aVBhcnQgYm9keVBhcnQoQm9keVBhcnQgYm9keVBhcnQpIHsKKyAgICAgICAgZ2V0Qm9keVBhcnRzKCkuYWRkKGJvZHlQYXJ0KTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQnVpbGRlciBwYXR0ZXJuIG1ldGhvZCB0byBhZGQgYSBuZXdseSBjb25maWd1cmVkIHtAbGluayBCb2R5UGFydH0KKyAgICAgKiB0byB0aGlzIHtAbGluayBNdWx0aVBhcnR9LgorICAgICAqCisgICAgICogQHBhcmFtIGVudGl0eSBlbnRpdHkgb2JqZWN0IGZvciB0aGlzIGJvZHkgcGFydC4KKyAgICAgKiBAcGFyYW0gbWVkaWFUeXBlIGNvbnRlbnQgdHlwZSBmb3IgdGhpcyBib2R5IHBhcnQuCisgICAgICovCisgICAgcHVibGljIE11bHRpUGFydCBib2R5UGFydChPYmplY3QgZW50aXR5LCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIEJvZHlQYXJ0IGJvZHlQYXJ0ID0gbmV3IEJvZHlQYXJ0KGVudGl0eSwgbWVkaWFUeXBlKTsKKyAgICAgICAgcmV0dXJuIGJvZHlQYXJ0KGJvZHlQYXJ0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPdmVycmlkZSB0aGUgZW50aXR5IHNldCBvcGVyYXRpb24gb24gYSB7QGxpbmsgTXVsdGlQYXJ0fSB0byB0aHJvdworICAgICAqIHtAY29kZSBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb259LgorICAgICAqCisgICAgICogQHBhcmFtIGVudGl0eSBlbnRpdHkgdG8gc2V0IGZvciB0aGlzIHtAbGluayBCb2R5UGFydH0uCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJvZHlQYXJ0IGVudGl0eShPYmplY3QgZW50aXR5KSB7CisgICAgICAgIHNldEVudGl0eShlbnRpdHkpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCdWlsZGVyIHBhdHRlcm4gbWV0aG9kIHRvIHJldHVybiB0aGlzIHtAbGluayBNdWx0aVBhcnR9IGFmdGVyCisgICAgICogYWRkaXRpb25hbCBjb25maWd1cmF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgbWVkaWEgdHlwZSB0byBzZXQgZm9yIHRoaXMge0BsaW5rIE11bHRpUGFydH0uCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE11bHRpUGFydCB0eXBlKE1lZGlhVHlwZSB0eXBlKSB7CisgICAgICAgIHNldE1lZGlhVHlwZSh0eXBlKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVyZm9ybXMgYW55IG5lY2Vzc2FyeSBjbGVhbnVwIGF0IHRoZSBlbmQgb2YgcHJvY2Vzc2luZyB0aGlzCisgICAgICoge0BsaW5rIE11bHRpUGFydH0uCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY2xlYW51cCgpIHsKKyAgICAgICAgZm9yIChCb2R5UGFydCBicCA6IGdldEJvZHlQYXJ0cygpKSB7CisgICAgICAgICAgICBicC5jbGVhbnVwKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNsZWFudXAoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL21lZGlhL211bHRpcGFydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9NdWx0aVBhcnRGZWF0dXJlLmphdmEgYi9tZWRpYS9tdWx0aXBhcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9tdWx0aXBhcnQvTXVsdGlQYXJ0RmVhdHVyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3MzE0NzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdWx0aXBhcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9tdWx0aXBhcnQvTXVsdGlQYXJ0RmVhdHVyZS5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0OworCitpbXBvcnQgamF2YXgud3MucnMuUnVudGltZVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuaW50ZXJuYWwuRm9ybURhdGFQYXJhbUluamVjdGlvbkZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LmludGVybmFsLk11bHRpUGFydFJlYWRlckNsaWVudFNpZGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LmludGVybmFsLk11bHRpUGFydFJlYWRlclNlcnZlclNpZGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LmludGVybmFsLk11bHRpUGFydFdyaXRlcjsKKworLyoqCisgKiBGZWF0dXJlIHVzZWQgdG8gcmVnaXN0ZXIgTXVsdGlwYXJ0IHByb3ZpZGVycy4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIE11bHRpUGFydEZlYXR1cmUgaW1wbGVtZW50cyBGZWF0dXJlIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZShmaW5hbCBGZWF0dXJlQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGZpbmFsIFJ1bnRpbWVUeXBlIHJ1bnRpbWUgPSBjb250ZXh0LmdldENvbmZpZ3VyYXRpb24oKS5nZXRSdW50aW1lVHlwZSgpOworCisgICAgICAgIGlmIChSdW50aW1lVHlwZS5TRVJWRVIuZXF1YWxzKHJ1bnRpbWUpKSB7CisgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKEZvcm1EYXRhUGFyYW1JbmplY3Rpb25GZWF0dXJlLmNsYXNzKTsKKyAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoTXVsdGlQYXJ0UmVhZGVyU2VydmVyU2lkZS5jbGFzcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKE11bHRpUGFydFJlYWRlckNsaWVudFNpZGUuY2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgY29udGV4dC5yZWdpc3RlcihNdWx0aVBhcnRXcml0ZXIuY2xhc3MpOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL211bHRpcGFydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9NdWx0aVBhcnRNZWRpYVR5cGVzLmphdmEgYi9tZWRpYS9tdWx0aXBhcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9tdWx0aXBhcnQvTXVsdGlQYXJ0TWVkaWFUeXBlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3YzA4ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdWx0aXBhcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9tdWx0aXBhcnQvTXVsdGlQYXJ0TWVkaWFUeXBlcy5qYXZhCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCisvKioKKyAqIENvbnZlbmllbmNlIHtAbGluayBNZWRpYVR5cGV9IChhbmQgYXNzb2NpYXRlZCBTdHJpbmcpCisgKiBtYW5pZmVzdCBjb25zdGFudHMuCisgKgorICogQGF1dGhvciBDcmFpZyBNY0NsYW5haGFuCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIE11bHRpUGFydE1lZGlhVHlwZXMgeworCisgICAgLyoqICJtdWx0aXBhcnQvYWx0ZXJuYXRpdmUiICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVVMVElQQVJUX0FMVEVSTkFUSVZFID0gIm11bHRpcGFydC9hbHRlcm5hdGl2ZSI7CisKKyAgICAvKiogIm11bHRpcGFydC9hbHRlcm5hdGl2ZSIgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE1lZGlhVHlwZSBNVUxUSVBBUlRfQUxURVJOQVRJVkVfVFlQRSA9CisgICAgICAgICAgICBuZXcgTWVkaWFUeXBlKCJtdWx0aXBhcnQiLCAiYWx0ZXJuYXRpdmUiKTsKKworICAgIC8qKiAibXVsdGlwYXJ0L2RpZ2VzdCIgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNVUxUSVBBUlRfRElHRVNUID0gIm11bHRpcGFydC9kaWdlc3QiOworCisgICAgLyoqICJtdWx0aXBhcnQvZGlnZXN0IiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWVkaWFUeXBlIE1VTFRJUEFSVF9ESUdFU1RfVFlQRSA9CisgICAgICAgICAgICBuZXcgTWVkaWFUeXBlKCJtdWx0aXBhcnQiLCAiZGlnZXN0Iik7CisKKyAgICAvKiogIm11bHRpcGFydC9taXhlZCIgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNVUxUSVBBUlRfTUlYRUQgPSAibXVsdGlwYXJ0L21peGVkIjsKKworICAgIC8qKiAibXVsdGlwYXJ0L21peGVkIiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWVkaWFUeXBlIE1VTFRJUEFSVF9NSVhFRF9UWVBFID0KKyAgICAgICAgICAgIG5ldyBNZWRpYVR5cGUoIm11bHRpcGFydCIsICJtaXhlZCIpOworCisgICAgLyoqICJtdWx0aXBhcnQvcGFyYWxsZWwiICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVVMVElQQVJUX1BBUkFMTEVMID0gIm11bHRpcGFydC9wYXJhbGxlbCI7CisKKyAgICAvKiogIm11bHRpcGFydC9wYXJhbGxlbCIgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE1lZGlhVHlwZSBNVUxUSVBBUlRfUEFSRUxMRUxfVFlQRSA9CisgICAgICAgICAgICBuZXcgTWVkaWFUeXBlKCJtdWx0aXBhcnQiLCAicGFyYWxsZWwiKTsKKworICAgIC8qKgorICAgICAqIEByZXR1cm4gYSAibXVsdGlwYXJ0L2FsdGVybmF0aXZlIiB3aXRoIGEgYm91bmRhcnkgcGFyYW1ldGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFUeXBlIGNyZWF0ZUFsdGVybmF0aXZlKCkgeworICAgICAgICByZXR1cm4gY3JlYXRlKE1VTFRJUEFSVF9BTFRFUk5BVElWRV9UWVBFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGEgIm11bHRpcGFydC9kaWdlc3QiIHdpdGggYSBib3VuZGFyeSBwYXJhbWV0ZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBNZWRpYVR5cGUgY3JlYXRlRGlnZXN0KCkgeworICAgICAgICByZXR1cm4gY3JlYXRlKE1VTFRJUEFSVF9ESUdFU1RfVFlQRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQHJldHVybiBhICJtdWx0aXBhcnQvbWl4ZWQiIHdpdGggYSBib3VuZGFyeSBwYXJhbWV0ZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBNZWRpYVR5cGUgY3JlYXRlTWl4ZWQoKSB7CisgICAgICAgIHJldHVybiBjcmVhdGUoTVVMVElQQVJUX01JWEVEX1RZUEUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEByZXR1cm4gYSAibXVsdGlwYXJ0L3BhcmFsbGVsIiB3aXRoIGEgYm91bmRhcnkgcGFyYW1ldGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFUeXBlIGNyZWF0ZVBhcmFsbGVsKCkgeworICAgICAgICByZXR1cm4gY3JlYXRlKE1VTFRJUEFSVF9QQVJFTExFTF9UWVBFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGEgIm11bHRpcGFydC9mb3JtLWRhdGEiIHdpdGggYSBib3VuZGFyeSBwYXJhbWV0ZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBNZWRpYVR5cGUgY3JlYXRlRm9ybURhdGEoKSB7CisgICAgICAgIHJldHVybiBjcmVhdGUoTWVkaWFUeXBlLk1VTFRJUEFSVF9GT1JNX0RBVEFfVFlQRSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTWVkaWFUeXBlIGNyZWF0ZShNZWRpYVR5cGUgbXQpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVR5cGUobXQuZ2V0VHlwZSgpLCBtdC5nZXRTdWJ0eXBlKCksCisgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc2luZ2xldG9uTWFwKEJvdW5kYXJ5LkJPVU5EQVJZX1BBUkFNRVRFUiwgQm91bmRhcnkuY3JlYXRlQm91bmRhcnkoKSkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbXVsdGlwYXJ0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvbXVsdGlwYXJ0L011bHRpUGFydFByb3BlcnRpZXMuamF2YSBiL21lZGlhL211bHRpcGFydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9NdWx0aVBhcnRQcm9wZXJ0aWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUyZmU3OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL211bHRpcGFydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9NdWx0aVBhcnRQcm9wZXJ0aWVzLmphdmEKQEAgLTAsMCArMSwyMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCitpbXBvcnQgamF2YXgud3MucnMuZXh0LkNvbnRleHRSZXNvbHZlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUHJvcGVydGllc0NsYXNzOworCisvKioKKyAqIEluamVjdGFibGUgSmF2YUJlYW4gY29udGFpbmluZyB0aGUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGZvcgorICoge0Bjb2RlIGplcnNleS1tdWx0aXBhcnR9IGFzIHVzZWQgaW4gdGhpcyBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgTWNDbGFuYWhhbgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BQcm9wZXJ0aWVzQ2xhc3MKK3B1YmxpYyBjbGFzcyBNdWx0aVBhcnRQcm9wZXJ0aWVzIHsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgdGhyZXNob2xkIHNpemUgZm9yIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0JVRkZFUl9USFJFU0hPTEQgPSA0MDk2OworCisgICAgLyoqCisgICAgICogTmFtZSBvZiBhIHByb3BlcnRpZXMgcmVzb3VyY2UgdGhhdCAoaWYgZm91bmQgaW4gdGhlIGNsYXNzcGF0aAorICAgICAqIGZvciB0aGlzIGFwcGxpY2F0aW9uKSB3aWxsIGJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBzZXR0aW5ncyByZXR1cm5lZAorICAgICAqIGJ5IG91ciBnZXR0ZXIgbWV0aG9kcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNVUxUSV9QQVJUX0NPTkZJR19SRVNPVVJDRSA9ICJqZXJzZXktbXVsdGlwYXJ0LWNvbmZpZy5wcm9wZXJ0aWVzIjsKKworICAgIC8qKgorICAgICAqIE5hbWUgb2YgdGhlIHJlc291cmNlIHByb3BlcnR5IGZvciB0aGUgdGhyZXNob2xkIHNpemUgKGluIGJ5dGVzKSBhYm92ZSB3aGljaCBhIGJvZHkgcGFydCBlbnRpdHkgd2lsbCBiZQorICAgICAqIGJ1ZmZlcmVkIHRvIGRpc2sgaW5zdGVhZCBvZiBiZWluZyBoZWxkIGluIG1lbW9yeS4KKyAgICAgKgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHtAdmFsdWUgI0RFRkFVTFRfQlVGRkVSX1RIUkVTSE9MRH0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQlVGRkVSX1RIUkVTSE9MRCA9ICJqZXJzZXkuY29uZmlnLm11bHRpcGFydC5idWZmZXJUaHJlc2hvbGQiOworCisgICAgLyoqCisgICAgICogVGhlIHtAbGluayAjQlVGRkVSX1RIUkVTSE9MRH0gcHJvcGVydHkgdmFsdWUgdG8ga2VlcCBhIGJvZHkgcGFydCBlbnRpdHkgaW4gbWVtb3J5IG9ubHkuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSX1RIUkVTSE9MRF9NRU1PUllfT05MWSA9IC0xOworCisgICAgLyoqCisgICAgICogTmFtZSBvZiB0aGUgcmVzb3VyY2UgcHJvcGVydHkgZm9yIHRoZSBkaXJlY3RvcnkgdG8gc3RvcmUgdGVtcG9yYXJ5IGZpbGVzIGNvbnRhaW5pbmcgYm9keSBwYXJ0cyBvZiBtdWx0aXBhcnQgbWVzc2FnZSB0aGF0CisgICAgICogZXh0ZW5kcyBhbGxvd2VkIG1lbW9yeSB0aHJlc2hvbGQuLgorICAgICAqCisgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgbm90IHNldCAod2lsbCBiZSB0YWtlbiBmcm9tIHtAY29kZSBqYXZhLmlvLnRtcGRpcn0gc3lzdGVtIHByb3BlcnR5KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURU1QX0RJUkVDVE9SWSA9ICJqZXJzZXkuY29uZmlnLm11bHRpcGFydC50ZW1wRGlyIjsKKworICAgIC8qKgorICAgICAqIFRoZSB0aHJlc2hvbGQgc2l6ZSAoaW4gYnl0ZXMpIGFib3ZlIHdoaWNoIGEgYm9keSBwYXJ0IGVudGl0eSB3aWxsIGJlCisgICAgICogYnVmZmVyZWQgdG8gZGlzayBpbnN0ZWFkIG9mIGJlaW5nIGhlbGQgaW4gbWVtb3J5LgorICAgICAqLworICAgIHByaXZhdGUgaW50IGJ1ZmZlclRocmVzaG9sZCA9IERFRkFVTFRfQlVGRkVSX1RIUkVTSE9MRDsKKworICAgIC8qKgorICAgICAqIERpcmVjdG9yeSB0byBzdG9yZSB0ZW1wb3JhcnkgZmlsZXMgY29udGFpbmluZyBib2R5IHBhcnRzIG9mIG11bHRpcGFydCBtZXNzYWdlIHRoYXQgZXh0ZW5kcyBhbGxvd2VkIG1lbW9yeSB0aHJlc2hvbGQuCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdGVtcERpciA9IG51bGw7CisKKyAgICAvKioKKyAgICAgKiBMb2FkIGFuZCBjdXN0b21pemUgKGlmIG5lY2Vzc2FyeSkgdGhlIGNvbmZpZ3VyYXRpb24gdmFsdWVzIGZvciB0aGUKKyAgICAgKiB7QGNvZGUgamVyc2V5LW11bHRpcGFydH0gaW5qZWN0aW9uIGJpbmRlci4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBjb25maWd1cmF0aW9uIHJlc291cmNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RzLCBidXQgdGhlcmUgYXJlIHByb2JsZW1zIHJlYWRpbmcgaXQKKyAgICAgKi8KKyAgICBwdWJsaWMgTXVsdGlQYXJ0UHJvcGVydGllcygpIHsKKyAgICAgICAgY29uZmlndXJlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBzaXplIChpbiBieXRlcykgb2YgdGhlIGVudGl0eSBvZiBhbiBpbmNvbWluZworICAgICAqIHtAbGluayBCb2R5UGFydH0gYmVmb3JlIGl0IHdpbGwgYmUgYnVmZmVyZWQgdG8gZGlzay4gIElmIG5vdAorICAgICAqIGN1c3RvbWl6ZWQsIHRoZSBkZWZhdWx0IHZhbHVlIGlzIDQwOTYuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHJldHVybiB0aHJlc2hvbGQgc2l6ZSBmb3Igc3RhcnRpbmcgdG8gYnVmZmVyIHRoZSBpbmNvbWluZyBlbnRpdHkKKyAgICAgKiAgICAgICAgIHRvIGRpc2suCisgICAgICovCisgICAgcHVibGljIGludCBnZXRCdWZmZXJUaHJlc2hvbGQoKSB7CisgICAgICAgIHJldHVybiBidWZmZXJUaHJlc2hvbGQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBkaXJlY3RvcnkgdG8gc3RvcmUgdGVtcG9yYXJ5IGZpbGVzIGNvbnRhaW5pbmcgYm9keSBwYXJ0cyBvZiBtdWx0aXBhcnQgbWVzc2FnZSB0aGF0IGV4dGVuZHMgYWxsb3dlZCBtZW1vcnkKKyAgICAgKiB0aHJlc2hvbGQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHBhdGggdG8gdGhlIHRlbXBvcmFyeSBkaXJlY3RvcnkuCisgICAgICogQHNpbmNlIDIuNC4xCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRUZW1wRGlyKCkgeworICAgICAgICByZXR1cm4gdGVtcERpcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHNpemUgKGluIGJ5dGVzKSBvZiB0aGUgZW50aXR5IG9mIGFuIGluY29taW5nIHtAbGluayBCb2R5UGFydH0gYmVmb3JlIGl0IHdpbGwgYmUgYnVmZmVyZWQgdG8gZGlzay4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0aHJlc2hvbGQgc2l6ZSBvZiBib2R5IHBhcnQuCisgICAgICogQHJldHVybiB7QGNvZGUgTXVsdGlQYXJ0UHJvcGVydGllc30gaW5zdGFuY2UuCisgICAgICogQHNpbmNlIDIuNC4xCisgICAgICovCisgICAgcHVibGljIE11bHRpUGFydFByb3BlcnRpZXMgYnVmZmVyVGhyZXNob2xkKGZpbmFsIGludCB0aHJlc2hvbGQpIHsKKyAgICAgICAgdGhpcy5idWZmZXJUaHJlc2hvbGQgPSB0aHJlc2hvbGQgPCBCVUZGRVJfVEhSRVNIT0xEX01FTU9SWV9PTkxZID8gQlVGRkVSX1RIUkVTSE9MRF9NRU1PUllfT05MWSA6IHRocmVzaG9sZDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSBwYXRoIHRvIHRoZSBkaXJlY3RvcnkgdG8gc3RvcmUgdGVtcG9yYXJ5IGZpbGVzIGNvbnRhaW5pbmcgYm9keSBwYXJ0cyBvZiBtdWx0aXBhcnQgbWVzc2FnZSB0aGF0IGV4dGVuZHMgYWxsb3dlZAorICAgICAqIG1lbW9yeSB0aHJlc2hvbGQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBwYXRoIHRvIHRoZSB0ZW1wb3JhcnkgZGlyZWN0b3J5LgorICAgICAqIEByZXR1cm4ge0Bjb2RlIE11bHRpUGFydFByb3BlcnRpZXN9IGluc3RhbmNlLgorICAgICAqIEBzaW5jZSAyLjQuMQorICAgICAqLworICAgIHB1YmxpYyBNdWx0aVBhcnRQcm9wZXJ0aWVzIHRlbXBEaXIoZmluYWwgU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgdGhpcy50ZW1wRGlyID0gcGF0aDsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uZmlndXJlIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkgdGhpcyBpbnN0YW5jZSdzIGdldHRlcnMgYmFzZWQgb24KKyAgICAgKiB0aGUgY29udGVudHMgb2YgYSBwcm9wZXJ0aWVzIHJlc291cmNlLCBpZiBpdCBleGlzdHMgb24gdGhlIGNsYXNzcGF0aAorICAgICAqIGZvciB0aGlzIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGNvbmZpZ3VyYXRpb24gcmVzb3VyY2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdHMsIGJ1dCB0aGVyZSBhcmUgcHJvYmxlbXMgcmVhZGluZyBpdAorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgIC8vIElkZW50aWZ5IHRoZSBjbGFzcyBsb2FkZXIgd2Ugd2lsbCB1c2UKKyAgICAgICAgQ2xhc3NMb2FkZXIgbG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgaWYgKGxvYWRlciA9PSBudWxsKSB7CisgICAgICAgICAgICBsb2FkZXIgPSB0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEF0dGVtcHQgdG8gZmluZCBvdXIgcHJvcGVydGllcyByZXNvdXJjZQorICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3RyZWFtID0gbG9hZGVyLmdldFJlc291cmNlQXNTdHJlYW0oTVVMVElfUEFSVF9DT05GSUdfUkVTT1VSQ0UpOworICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICBwcm9wcy5sb2FkKHN0cmVhbSk7CisKKyAgICAgICAgICAgIGlmIChwcm9wcy5jb250YWluc0tleShCVUZGRVJfVEhSRVNIT0xEKSkgeworICAgICAgICAgICAgICAgIHRoaXMuYnVmZmVyVGhyZXNob2xkID0gSW50ZWdlci5wYXJzZUludChwcm9wcy5nZXRQcm9wZXJ0eShCVUZGRVJfVEhSRVNIT0xEKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocHJvcHMuY29udGFpbnNLZXkoVEVNUF9ESVJFQ1RPUlkpKSB7CisgICAgICAgICAgICAgICAgdGhpcy50ZW1wRGlyID0gcHJvcHMuZ2V0UHJvcGVydHkoVEVNUF9ESVJFQ1RPUlkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGUpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBQYXNzIHRocm91Z2gKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSB7QGxpbmsgQ29udGV4dFJlc29sdmVyIGNvbnRleHQgcmVzb2x2ZXJ9IGZvciBhIGN1cnJlbnQgc3RhdGUgb2YgdGhpcyB7QGNvZGUgTXVsdGlQYXJ0UHJvcGVydGllc30uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGNvbnRleHQgcmVzb2x2ZXIgZm9yIHRoaXMgY29uZmlnLgorICAgICAqIEBzaW5jZSAyLjQuMQorICAgICAqLworICAgIHB1YmxpYyBDb250ZXh0UmVzb2x2ZXI8TXVsdGlQYXJ0UHJvcGVydGllcz4gcmVzb2x2ZXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgQ29udGV4dFJlc29sdmVyPE11bHRpUGFydFByb3BlcnRpZXM+KCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBNdWx0aVBhcnRQcm9wZXJ0aWVzIGdldENvbnRleHQoZmluYWwgQ2xhc3M8Pz4gdHlwZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBNdWx0aVBhcnRQcm9wZXJ0aWVzLnRoaXM7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbXVsdGlwYXJ0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvbXVsdGlwYXJ0L1BhcmFtZXRlcml6ZWRIZWFkZXJzTWFwLmphdmEgYi9tZWRpYS9tdWx0aXBhcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9tdWx0aXBhcnQvUGFyYW1ldGVyaXplZEhlYWRlcnNNYXAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTE3YzhiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXVsdGlwYXJ0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvbXVsdGlwYXJ0L1BhcmFtZXRlcml6ZWRIZWFkZXJzTWFwLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQ7CisKK2ltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5TdHJpbmdLZXlJZ25vcmVDYXNlTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5QYXJhbWV0ZXJpemVkSGVhZGVyOworCisvKioKKyAqIEEgbWFwIG9mIE1JTUUgaGVhZGVycyB3aXRoIHBhcmFtZXRyaXplZCB2YWx1ZXMuCisgKiA8cC8+CisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgTXVsdGl2YWx1ZWRNYXB9IHdoZXJlIGtleXMgYXJlIGluc3RhbmNlcyBvZiBTdHJpbmcgYW5kIGFyZSBjb21wYXJlZCBpZ25vcmluZyBjYXNlIGFuZCB2YWx1ZXMgYXJlCisgKiBpbnN0YW5jZXMgb2Yge0BsaW5rIFBhcmFtZXRlcml6ZWRIZWFkZXJ9LgorICoKKyAqIEBhdXRob3IgQ3JhaWcgTWNDbGFuYWhhbgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KKy8qIHBhY2thZ2UgKi8gY2xhc3MgUGFyYW1ldGVyaXplZEhlYWRlcnNNYXAgZXh0ZW5kcyBTdHJpbmdLZXlJZ25vcmVDYXNlTXVsdGl2YWx1ZWRNYXA8UGFyYW1ldGVyaXplZEhlYWRlcj4geworCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyBwYXJhbWV0ZXJpemVkIGhlYWRlcnMgbWFwLgorICAgICAqLworICAgIHB1YmxpYyBQYXJhbWV0ZXJpemVkSGVhZGVyc01hcCgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IHBhcmFtZXRlcml6ZWQgaGVhZGVycyBtYXAgZnJvbSBnaXZlbiBoZWFkZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIGhlYWRlcnMgaGVhZGVycyB0byBpbml0aWFsaXplIHRoaXMgbWFwIGZyb20uCisgICAgICogQHRocm93cyBQYXJzZUV4Y2VwdGlvbiBpZiBhbiB1bi1leHBlY3RlZC9pbi1jb3JyZWN0IHZhbHVlIGlzIGZvdW5kIGR1cmluZyBwYXJzaW5nIHRoZSBoZWFkZXJzLgorICAgICAqLworICAgIHB1YmxpYyBQYXJhbWV0ZXJpemVkSGVhZGVyc01hcChmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVycykgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGVudHJ5IDogaGVhZGVycy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBMaXN0PFBhcmFtZXRlcml6ZWRIZWFkZXI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PFBhcmFtZXRlcml6ZWRIZWFkZXI+KGVudHJ5LmdldFZhbHVlKCkuc2l6ZSgpKTsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIHZhbHVlIDogZW50cnkuZ2V0VmFsdWUoKSkgeworICAgICAgICAgICAgICAgIGxpc3QuYWRkKG5ldyBQYXJhbWV0ZXJpemVkSGVhZGVyKHZhbHVlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLnB1dChlbnRyeS5nZXRLZXkoKSwgbGlzdCk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL21lZGlhL211bHRpcGFydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9maWxlL0RlZmF1bHRNZWRpYVR5cGVQcmVkaWN0b3IuamF2YSBiL21lZGlhL211bHRpcGFydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9maWxlL0RlZmF1bHRNZWRpYVR5cGVQcmVkaWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODMzYWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXVsdGlwYXJ0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvbXVsdGlwYXJ0L2ZpbGUvRGVmYXVsdE1lZGlhVHlwZVByZWRpY3Rvci5qYXZhCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5maWxlOworCitpbXBvcnQgamF2YS5pby5GaWxlOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKKy8qKgorICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgTWVkaWFUeXBlUHJlZGljdG9yfSB0aGF0IHVzZXMKKyAqIHtAbGluayBDb21tb25NZWRpYVR5cGVzfS4KKyAqCisgKiBAYXV0aG9yIEltcmFuIE0gWW91c3VmIChpbXJhbiBhdCBzbWFydGl0ZW5naW5lZXJpbmcuY29tKQorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBEZWZhdWx0TWVkaWFUeXBlUHJlZGljdG9yIGltcGxlbWVudHMgTWVkaWFUeXBlUHJlZGljdG9yIHsKKworICAgIC8qKgorICAgICAqIFRoaXMgZW51bSByZXByZXNlbnRzIGZpbGUgZXh0ZW5zaW9uIGFuZCBNSU1FIHR5cGVzIG9mIGNvbW1vbmx5IHVzZWQgZmlsZS4gSXQKKyAgICAgKiBpcyB0byBiZSBub3RlZCB0aGF0IGFsbCBmaWxlIGV4dGVuc2lvbiBhbmQgTUlNRSB0eXBlcyBhcmUgc3BlY2lmaWVkIGluIGxvd2VyCisgICAgICogY2FzZSwgd2hlbiBjaGVja2luZyB0aGUgZXh0ZW5zaW9uIHRoaXMgc2hvdWxkIGJlIGtlcHQgaW4gbWluZC4KKyAgICAgKiBDdXJyZW50bHkgc3VwcG9ydGVkIGZpbGUgZXh0ZW5zaW9uIGFuZCBNSU1FIFR5cGVzIGFyZSAtCisgICAgICogPHVsPgorICAgICAqICAgPGxpPiIueG1sIiAtIGFwcGxpY2F0aW9uL3htbDwvbGk+CisgICAgICogICA8bGk+Ii50eHQiIC0gdGV4dC9wbGFpbjwvbGk+CisgICAgICogICA8bGk+Ii5wZGYiIC0gYXBwbGljYXRpb24vcGRmPC9saT4KKyAgICAgKiAgIDxsaT4iLmh0bSIgLSB0ZXh0L2h0bWw8L2xpPgorICAgICAqICAgPGxpPiIuaHRtbCIgLSB0ZXh0L2h0bWw8L2xpPgorICAgICAqICAgPGxpPiIuanBnIiAtIGltYWdlL2pwZWc8L2xpPgorICAgICAqICAgPGxpPiIucG5nIiAtIGltYWdlL3BuZzwvbGk+CisgICAgICogICA8bGk+Ii5naWYiIC0gaW1hZ2UvZ2lmPC9saT4KKyAgICAgKiAgIDxsaT4iLmJtcCIgLSBpbWFnZS9ibXA8L2xpPgorICAgICAqICAgPGxpPiIudGFyIiAtIGFwcGxpY2F0aW9uL3gtdGFyPC9saT4KKyAgICAgKiAgIDxsaT4iLnppcCIgLSBhcHBsaWNhdGlvbi96aXA8L2xpPgorICAgICAqICAgPGxpPiIuZ3oiIC0gYXBwbGljYXRpb24veC1nemlwPC9saT4KKyAgICAgKiAgIDxsaT4iLnJhciIgLSBhcHBsaWNhdGlvbi94LXJhcjwvbGk+CisgICAgICogICA8bGk+Ii5tcDMiIC0gYXVkaW8vbXBlZzwvbGk+CisgICAgICogICA8bGk+Ii53YXYiIC0gYXVkaW8veC13YXZlPC9saT4KKyAgICAgKiAgIDxsaT4iLmF2aSIgLSB2aWRlby94LW1zdmlkZW88L2xpPgorICAgICAqICAgPGxpPiIubXBlZyIgLSB2aWRlby9tcGVnPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqLworICAgIHB1YmxpYyBlbnVtIENvbW1vbk1lZGlhVHlwZXMgeworCisgICAgICAgIFhNTCgiLnhtbCIsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUxfVFlQRSksCisgICAgICAgIFRYVCgiLnR4dCIsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpLAorICAgICAgICBIVE0oIi5odG0iLCBNZWRpYVR5cGUuVEVYVF9IVE1MX1RZUEUpLAorICAgICAgICBIVE1MKCIuaHRtbCIsIE1lZGlhVHlwZS5URVhUX0hUTUxfVFlQRSksCisgICAgICAgIFBERigiLnBkZiIsIG5ldyBNZWRpYVR5cGUoImFwcGxpY2F0aW9uIiwgInBkZiIpKSwKKyAgICAgICAgSlBHKCIuanBnIiwgbmV3IE1lZGlhVHlwZSgiaW1hZ2UiLCAianBlZyIpKSwKKyAgICAgICAgUE5HKCIucG5nIiwgbmV3IE1lZGlhVHlwZSgiaW1hZ2UiLCAicG5nIikpLAorICAgICAgICBHSUYoIi5naWYiLCBuZXcgTWVkaWFUeXBlKCJpbWFnZSIsICJnaWYiKSksCisgICAgICAgIEJNUCgiLmJtcCIsIG5ldyBNZWRpYVR5cGUoImltYWdlIiwgInBkZiIpKSwKKyAgICAgICAgVEFSKCIudGFyIiwgbmV3IE1lZGlhVHlwZSgiYXBwbGljYXRpb24iLCAieC10YXIiKSksCisgICAgICAgIFpJUCgiLnppcCIsIG5ldyBNZWRpYVR5cGUoImFwcGxpY2F0aW9uIiwgInppcCIpKSwKKyAgICAgICAgR1ooIi5neiIsIG5ldyBNZWRpYVR5cGUoImFwcGxpY2F0aW9uIiwgIngtZ3ppcCIpKSwKKyAgICAgICAgUkFSKCIucmFyIiwgbmV3IE1lZGlhVHlwZSgiYXBwbGljYXRpb24iLCAieC1yYXIiKSksCisgICAgICAgIE1QMygiLm1wMyIsIG5ldyBNZWRpYVR5cGUoImF1ZGlvIiwgIm1wZWciKSksCisgICAgICAgIFdBVigiLndhdiIsIG5ldyBNZWRpYVR5cGUoImF1ZGlvIiwgIngtd2F2ZSIpKSwKKyAgICAgICAgQVZJKCIuYXZpIiwgbmV3IE1lZGlhVHlwZSgidmlkZW8iLCAieC1tc3ZpZGVvIikpLAorICAgICAgICBNUEVHKCIubXBlZyIsIG5ldyBNZWRpYVR5cGUoInZpZGVvIiwgIm1wZWciKSk7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZXh0ZW5zaW9uOworCisgICAgICAgIHByaXZhdGUgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZTsKKworICAgICAgICBwcml2YXRlIENvbW1vbk1lZGlhVHlwZXMoZmluYWwgU3RyaW5nIGV4dGVuc2lvbiwgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgaWYgKGV4dGVuc2lvbiA9PSBudWxsIHx8ICFleHRlbnNpb24uc3RhcnRzV2l0aCgiLiIpIHx8IG1lZGlhVHlwZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcy5leHRlbnNpb24gPSBleHRlbnNpb247CisgICAgICAgICAgICB0aGlzLm1lZGlhVHlwZSA9IG1lZGlhVHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHRoZSBmaWxlIGV4dGVuc2lvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB0aGUgZmlsZSBleHRlbnNpb24uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEV4dGVuc2lvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBleHRlbnNpb247CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB0aGUgbWVkaWEgdHlwZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB0aGUgbWVkaWEgdHlwZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBNZWRpYVR5cGUgZ2V0TWVkaWFUeXBlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1lZGlhVHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBIHV0aWxpdHkgbWV0aG9kIGZvciBwcmVkaWN0aW5nIG1lZGlhIHR5cGUgZnJvbSBhIGZpbGUgbmFtZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgZnJvbSB3aGljaCB0byBwcmVkaWN0IHRoZSB7QGxpbmsgTWVkaWFUeXBlfQorICAgICAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgTWVkaWFUeXBlfSBmb3IgdGhlIGdpdmUgZmlsZTsge0Bjb2RlIG51bGx9IC0gaWYgZmlsZQorICAgICAgICAgKiAgICAgICAgIGlzIG51bGw7ICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iIGlmIGV4dGVuc2lvbiBub3QgcmVjb2duaXplZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHNlZSBDb21tb25NZWRpYVR5cGVzI2dldE1lZGlhVHlwZUZyb21GaWxlTmFtZShqYXZhLmxhbmcuU3RyaW5nKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBNZWRpYVR5cGUgZ2V0TWVkaWFUeXBlRnJvbUZpbGUoZmluYWwgRmlsZSBmaWxlKSB7CisgICAgICAgICAgICBpZiAoZmlsZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgZmlsZU5hbWUgPSBmaWxlLmdldE5hbWUoKTsKKyAgICAgICAgICAgIHJldHVybiBnZXRNZWRpYVR5cGVGcm9tRmlsZU5hbWUoZmlsZU5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEEgdXRpbGl0eSBtZXRob2QgZm9yIHByZWRpY3RpbmcgbWVkaWEgdHlwZSBmcm9tIGEgZmlsZSBuYW1lLiBJZiB0aGUgZmlsZQorICAgICAgICAgKiBuYW1lIGV4dGVuc2lvbiBpcyBub3QgcmVjb2duaXNlZCBpdCB3aWxsIHJldHVybiB7QGxpbmsgTWVkaWFUeXBlfSBmb3IKKyAgICAgICAgICogIipcLyoiLCBpdCB3aWxsIGFsc28gcmV0dXJuIHRoZSBzYW1lIGlmIHRoZSBmaWxlIGlzIHtAY29kZSBudWxsfS4KKyAgICAgICAgICogQ3VycmVudGx5IHN1cHBvcnRlZCBmaWxlIGV4dGVuc2lvbnMgY2FuIGJlIGZvdW5kIGF0IHtAbGluayBDb21tb25NZWRpYVR5cGVzfS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGZpbGVOYW1lIHRoZSBmaWxlIG5hbWUgZnJvbSB3aGljaCB0byBwcmVkaWN0IHRoZSB7QGxpbmsgTWVkaWFUeXBlfQorICAgICAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgTWVkaWFUeXBlfSBmb3IgdGhlIGdpdmUgZmlsZTsge0Bjb2RlIG51bGx9IC0gaWYgZmlsZQorICAgICAgICAgKiAgICAgICAgIGlzIG51bGw7ICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iIGlmIGV4dGVuc2lvbiBub3QgcmVjb2duaXplZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFUeXBlIGdldE1lZGlhVHlwZUZyb21GaWxlTmFtZShmaW5hbCBTdHJpbmcgZmlsZU5hbWUpIHsKKyAgICAgICAgICAgIGlmIChmaWxlTmFtZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb21tb25NZWRpYVR5cGVzW10gdHlwZXMgPSBDb21tb25NZWRpYVR5cGVzLnZhbHVlcygpOworICAgICAgICAgICAgaWYgKHR5cGVzICE9IG51bGwgJiYgdHlwZXMubGVuZ3RoID4gMCkgeworICAgICAgICAgICAgICAgIGZvciAoQ29tbW9uTWVkaWFUeXBlcyB0eXBlIDogdHlwZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZpbGVOYW1lLnRvTG93ZXJDYXNlKCkuZW5kc1dpdGgodHlwZS5nZXRFeHRlbnNpb24oKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0eXBlLmdldE1lZGlhVHlwZSgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9PQ1RFVF9TVFJFQU1fVFlQRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIERlZmF1bHRNZWRpYVR5cGVQcmVkaWN0b3IgTUVESUFfVFlQRV9QUkVESUNUT1IgPQorICAgICAgICAgICAgbmV3IERlZmF1bHRNZWRpYVR5cGVQcmVkaWN0b3IoKTsKKworICAgIHB1YmxpYyBNZWRpYVR5cGUgZ2V0TWVkaWFUeXBlRnJvbUZpbGUoRmlsZSBmaWxlKSB7CisgICAgICAgIHJldHVybiBDb21tb25NZWRpYVR5cGVzLmdldE1lZGlhVHlwZUZyb21GaWxlKGZpbGUpOworICAgIH0KKworICAgIHB1YmxpYyBNZWRpYVR5cGUgZ2V0TWVkaWFUeXBlRnJvbUZpbGVOYW1lKFN0cmluZyBmaWxlTmFtZSkgeworICAgICAgICByZXR1cm4gQ29tbW9uTWVkaWFUeXBlcy5nZXRNZWRpYVR5cGVGcm9tRmlsZU5hbWUoZmlsZU5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgc2luZ2xldG9uIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRGVmYXVsdE1lZGlhVHlwZVByZWRpY3RvciBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIE1FRElBX1RZUEVfUFJFRElDVE9SOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbXVsdGlwYXJ0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvbXVsdGlwYXJ0L2ZpbGUvRmlsZURhdGFCb2R5UGFydC5qYXZhIGIvbWVkaWEvbXVsdGlwYXJ0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvbXVsdGlwYXJ0L2ZpbGUvRmlsZURhdGFCb2R5UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMmVjZWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdWx0aXBhcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9tdWx0aXBhcnQvZmlsZS9GaWxlRGF0YUJvZHlQYXJ0LmphdmEKQEAgLTAsMCArMSwxOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LmZpbGU7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5Gb3JtRGF0YUJvZHlQYXJ0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5Gb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbjsKKworLyoqCisgKiBBbiBleHRlbnNpb24gb2Yge0BsaW5rIEZvcm1EYXRhQm9keVBhcnR9IGZvciBhc3NvY2lhdGluZworICoge0BsaW5rIEZpbGV9IEZpbGUgYXMgYSBib2R5IHBhcnQgZW50aXR5LgorICogPHAvPgorICogVGhpcyBjbGFzcyBtYXkgYmUgdXNlZCB0byBjcmVhdGUgYm9keSBwYXJ0cyB0aGF0IGNvbnRhaW5zIGEgZmlsZSBhdHRhY2htZW50cy4KKyAqIEFwcHJvcHJpYXRlIENvbnRlbnQtRGlzcG9zaXRpb24gcGFyYW1ldGVycyBhbmQgQ29udGVudC1UeXBlIGhlYWRlciB3aWxsIGJlIGRlcml2ZWQgZnJvbSB0aGUgZmlsZS4KKyAqCisgKiBAYXV0aG9yIEltcmFuIE0gWW91c3VmIChpbXJhbiBhdCBzbWFydGl0ZW5naW5lZXJpbmcuY29tKQorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBGaWxlRGF0YUJvZHlQYXJ0IGV4dGVuZHMgRm9ybURhdGFCb2R5UGFydCB7CisKKyAgICBwcml2YXRlIEZpbGUgZmlsZUVudGl0eTsKKworICAgIHByaXZhdGUgTWVkaWFUeXBlUHJlZGljdG9yIHByZWRpY3RvciA9IERlZmF1bHRNZWRpYVR5cGVQcmVkaWN0b3IuZ2V0SW5zdGFuY2UoKTsKKworICAgIC8qKgorICAgICAqIEEgbm8tYXJncyBjb25zdHJ1Y3RvciB3aGljaCBleHBlY3RzIGl0cyBjbGllbnQgdG8gc2V0IHRoZSB2YWx1ZXMKKyAgICAgKiBpbmRpdmlkdWFsbHksIHRoZSBhdHRyaWJ1dGVzIHRvIGJlIHNldCBhcmUgZmlsZUVudGl0eSBhbmQgbmFtZTsgdGhlCisgICAgICogbWVkaWEgdHlwZSB3aWxsIGJlIHByZWRpY3RlZCBmcm9tIHRoZSBmaWxlRW50aXR5IGlmIG5vdCBzZXQgZXhwbGljaXRseS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZURhdGFCb2R5UGFydCgpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIHRoZSBib2R5IHBhcnQgd2l0aCB0aGUgcHJvdmlkZWQgbmFtZSBhbmQgZmlsZSwgaXQgcHJlZGljdHMgdGhlCisgICAgICoge0BsaW5rIE1lZGlhVHlwZX0gb2YgdGhlIGZpbGUgcHJvdmlkZWQuIEZvciB0aGUga25vd24gbWVkaWEgdHlwZXMgY2xpZW50CisgICAgICogd2lsbCBub3QgbmVlZCB0byBzZXQgdGhlIG1lZGlhIHR5cGUgZXhwbGljaXRseS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIGJvZHkgcGFydC4KKyAgICAgKiBAcGFyYW0gZmlsZUVudGl0eSB0aGUgZmlsZSB0aGF0IHJlcHJlc2VudHMgdGhlIGVudGl0eS4KKyAgICAgKgorICAgICAqIEBzZWUgTWVkaWFUeXBlUHJlZGljdG9yI2dldE1lZGlhVHlwZUZyb21GaWxlKGphdmEuaW8uRmlsZSkKKyAgICAgKiBAc2VlIEZpbGVEYXRhQm9keVBhcnQjRmlsZURhdGFCb2R5UGFydChqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmlvLkZpbGUsIGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlKQorICAgICAqLworICAgIHB1YmxpYyBGaWxlRGF0YUJvZHlQYXJ0KGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBGaWxlIGZpbGVFbnRpdHkpIHsKKyAgICAgICAgdGhpcyhuYW1lLCBmaWxlRW50aXR5LCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIHRoZSBib2R5IHBhcnQgd2l0aCBhbGwgdGhlIGF0dHJpYnV0ZXMgc2V0IGZvciBpdHMgcHJvcGVyCisgICAgICogZnVuY3Rpb24uIElmIHRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCB0byBjb25zdHJ1Y3QgdGhlIGJvZHkgcGFydCB0aGVuIGl0CisgICAgICogaXMgbm90IHJlcXVpcmVkIHRvIHNldCBhbnkgb3RoZXIgYXR0cmlidXRlcyBmb3IgcHJvcGVyIGJlaGF2aW9yLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgYm9keSBwYXJ0LgorICAgICAqIEBwYXJhbSBmaWxlRW50aXR5IHRoZSBmaWxlIHRoYXQgcmVwcmVzZW50cyB0aGUgZW50aXR5LgorICAgICAqIEBwYXJhbSBtZWRpYVR5cGUgdGhlIHtAbGluayBNZWRpYVR5cGV9IG9mIHRoZSBib2R5IHBhcnQuCisgICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHRoZSBmaWxlRW50aXR5IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgRmlsZURhdGFCb2R5UGFydChmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgRmlsZSBmaWxlRW50aXR5LCBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgc3VwZXIuc2V0TmFtZShuYW1lKTsKKworICAgICAgICBpZiAobWVkaWFUeXBlICE9IG51bGwpIHsKKyAgICAgICAgICAgIHNldEZpbGVFbnRpdHkoZmlsZUVudGl0eSwgbWVkaWFUeXBlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNldEZpbGVFbnRpdHkoZmlsZUVudGl0eSwgcHJlZGljdE1lZGlhVHlwZShmaWxlRW50aXR5KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBmaWxlIGZvciB0aGlzIGJvZHkgcGFydC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gZmlsZSBlbnRpdHkgZm9yIHRoaXMgYm9keSBwYXJ0LgorICAgICAqLworICAgIHB1YmxpYyBGaWxlIGdldEZpbGVFbnRpdHkoKSB7CisgICAgICAgIHJldHVybiBmaWxlRW50aXR5OworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgZnJvbSB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIG1lZGlhVHlwZSB0aGUgbWVkaWEgdHlwZSBmb3IgdGhpcyBmaWVsZCB2YWx1ZS4KKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGZpZWxkIHZhbHVlIGFzIGEgSmF2YSBvYmplY3QuCisgICAgICogQHRocm93cyBqYXZhLmxhbmcuVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQuCisgICAgICoKKyAgICAgKiBAc2VlIEZpbGVEYXRhQm9keVBhcnQjc2V0RmlsZUVudGl0eShqYXZhLmlvLkZpbGUsIGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlKQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUsIGZpbmFsIE9iamVjdCB2YWx1ZSkgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJJdCBpcyB1bnN1cHBvcnRlZCwgcGxlYXNlIHVzZSBzZXRGaWxlRW50aXR5IGluc3RlYWQhIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBmcm9tIHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW50aXR5IHRoZSBuZXcgZW50aXR5IG9iamVjdC4KKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBPcGVyYXRpb24gbm90IHN1cHBvcnRlZC4KKyAgICAgKgorICAgICAqIEBzZWUgRmlsZURhdGFCb2R5UGFydCNzZXRGaWxlRW50aXR5KGphdmEuaW8uRmlsZSkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRFbnRpdHkoZmluYWwgT2JqZWN0IGVudGl0eSkgdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJJdCBpcyB1bnN1cHBvcnRlZCwgcGxlYXNlIHVzZSBzZXRGaWxlRW50aXR5IGluc3RlYWQhIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgZmlsZUVudGl0eSBmb3IgdGhpcyB7QGxpbmsgRm9ybURhdGFCb2R5UGFydH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZUVudGl0eSB0aGUgZW50aXR5IG9mIHRoaXMge0BsaW5rIEZvcm1EYXRhQm9keVBhcnR9LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldEZpbGVFbnRpdHkoZmluYWwgRmlsZSBmaWxlRW50aXR5KSB7CisgICAgICAgIHRoaXMuc2V0RmlsZUVudGl0eShmaWxlRW50aXR5LCBwcmVkaWN0TWVkaWFUeXBlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHtAbGluayBNZWRpYVR5cGV9IGFuZCBmaWxlRW50aXR5IGZvciB0aGlzIHtAbGluayBGb3JtRGF0YUJvZHlQYXJ0fS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlRW50aXR5IHRoZSBlbnRpdHkgb2YgdGhpcyBib2R5IHBhcnQuCisgICAgICogQHBhcmFtIG1lZGlhVHlwZSB0aGUgbWVkaWEgdHlwZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGaWxlRW50aXR5KGZpbmFsIEZpbGUgZmlsZUVudGl0eSwgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICBzdXBlci5zZXRNZWRpYVR5cGUobWVkaWFUeXBlKTsKKworICAgICAgICBzdXBlci5zZXRFbnRpdHkoZmlsZUVudGl0eSk7CisgICAgICAgIHRoaXMuZmlsZUVudGl0eSA9IGZpbGVFbnRpdHk7CisKKyAgICAgICAgaWYgKGZpbGVFbnRpdHkgIT0gbnVsbCkgeworICAgICAgICAgICAgRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24uRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb25CdWlsZGVyIGJ1aWxkZXIgPQorICAgICAgICAgICAgICAgICAgICBGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbi5uYW1lKGdldE5hbWUoKSk7CisgICAgICAgICAgICBidWlsZGVyLmZpbGVOYW1lKGZpbGVFbnRpdHkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGlmIChmaWxlRW50aXR5LmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgYnVpbGRlci5zaXplKGZpbGVFbnRpdHkubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIGJ1aWxkZXIubW9kaWZpY2F0aW9uRGF0ZShuZXcgRGF0ZShmaWxlRW50aXR5Lmxhc3RNb2RpZmllZCgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXRGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbihidWlsZGVyLmJ1aWxkKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJlZGljdHMgdGhlIG1lZGlhIHR5cGUgb2YgdGhlIGN1cnJlbnQgZmlsZUVudGl0eS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gcHJlZGljdGVkIHtAbGluayBNZWRpYVR5cGV9LgorICAgICAqLworICAgIHByb3RlY3RlZCBNZWRpYVR5cGUgcHJlZGljdE1lZGlhVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHByZWRpY3RNZWRpYVR5cGUoZ2V0RmlsZUVudGl0eSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmVkaWN0cyB0aGUgbWVkaWEgdHlwZSBvZiB0aGUgcHJvdmlkZWQge0BsaW5rIEZpbGV9LgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGUgdGhlIGZpbGUgZnJvbSB3aGljaCB0aGUgbWVkaWEgdHlwZSBpcyBwcmVkaWN0ZWQuCisgICAgICogQHJldHVybiBwcmVkaWN0ZWQge0BsaW5rIE1lZGlhVHlwZX0uCisgICAgICovCisgICAgcHJvdGVjdGVkIE1lZGlhVHlwZSBwcmVkaWN0TWVkaWFUeXBlKGZpbmFsIEZpbGUgZmlsZSkgeworICAgICAgICByZXR1cm4gZ2V0UHJlZGljdG9yKCkuZ2V0TWVkaWFUeXBlRnJvbUZpbGUoZmlsZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgbWVkaWEgdHlwZSBwcmVkaWN0b3IuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBtZWRpYSB0eXBlIHByZWRpY3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVkaWFUeXBlUHJlZGljdG9yIGdldFByZWRpY3RvcigpIHsKKyAgICAgICAgcmV0dXJuIHByZWRpY3RvcjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBtZWRpYSB0eXBlIHByZWRpY3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcmVkaWN0b3IgdGhlIG1lZGlhIHR5cGUgcHJlZGljdG9yLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFByZWRpY3RvcihNZWRpYVR5cGVQcmVkaWN0b3IgcHJlZGljdG9yKSB7CisgICAgICAgIGlmIChwcmVkaWN0b3IgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5wcmVkaWN0b3IgPSBwcmVkaWN0b3I7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9tZWRpYS9tdWx0aXBhcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9tdWx0aXBhcnQvZmlsZS9NZWRpYVR5cGVQcmVkaWN0b3IuamF2YSBiL21lZGlhL211bHRpcGFydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9maWxlL01lZGlhVHlwZVByZWRpY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MjQ0ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdWx0aXBhcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9tdWx0aXBhcnQvZmlsZS9NZWRpYVR5cGVQcmVkaWN0b3IuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5maWxlOworCitpbXBvcnQgamF2YS5pby5GaWxlOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuZmlsZS5EZWZhdWx0TWVkaWFUeXBlUHJlZGljdG9yLkNvbW1vbk1lZGlhVHlwZXM7CisKKy8qKgorICogQW4gaW50ZXJmYWNlIHdoaWNoIGFsbG93cyBkZXZlbG9wZXJzIGltcGxlbWVudCB0aGVpciBvd24gbWVkaWEgdHlwZSBwcmVkaWN0b3IuCisgKgorICogQGF1dGhvciBJbXJhbiBNIFlvdXN1ZiAoaW1yYW4gYXQgc21hcnRpdGVuZ2luZWVyaW5nLmNvbSkKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgaW50ZXJmYWNlIE1lZGlhVHlwZVByZWRpY3RvciB7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIG1lZGlhIHR5cGUgZnJvbSBhIGZpbGUgbmFtZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlIHRoZSBmaWxlIGZyb20gd2hpY2ggdG8gZ2V0IHRoZSB7QGxpbmsgTWVkaWFUeXBlfS4KKyAgICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgTWVkaWFUeXBlfSBmb3IgdGhlIGdpdmUgZmlsZTsge0Bjb2RlIG51bGx9IC0gaWYgZmlsZQorICAgICAqICAgICAgICAgaXMgbnVsbDsgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIgaWYgZXh0ZW5zaW9uIG5vdCByZWNvZ25pemVkLgorICAgICAqCisgICAgICogQHNlZSBDb21tb25NZWRpYVR5cGVzI2dldE1lZGlhVHlwZUZyb21GaWxlTmFtZShqYXZhLmxhbmcuU3RyaW5nKQorICAgICAqLworICAgIHB1YmxpYyBNZWRpYVR5cGUgZ2V0TWVkaWFUeXBlRnJvbUZpbGUoZmluYWwgRmlsZSBmaWxlKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbWVkaWEgdHlwZSBmcm9tIGEgZmlsZSBuYW1lLiBJZiB0aGUgZmlsZQorICAgICAqIG5hbWUgZXh0ZW5zaW9uIGlzIG5vdCByZWNvZ25pc2VkIGl0IHdpbGwgcmV0dXJuIHtAbGluayBNZWRpYVR5cGV9IGZvcgorICAgICAqICIqXC8qIiwgaXQgd2lsbCBhbHNvIHJldHVybiB0aGUgc2FtZSBpZiB0aGUgZmlsZSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmlsZU5hbWUgdGhlIGZpbGUgbmFtZSBmcm9tIHdoaWNoIHRvIGdldCB0aGUge0BsaW5rIE1lZGlhVHlwZX0uCisgICAgICogQHJldHVybiB0aGUge0BsaW5rIE1lZGlhVHlwZX0gZm9yIHRoZSBnaXZlIGZpbGU7IHtAY29kZSBudWxsfSAtIGlmIGZpbGUKKyAgICAgKiAgICAgICAgIGlzIG51bGw7ICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iIGlmIGV4dGVuc2lvbiBub3QgcmVjb2duaXplZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVkaWFUeXBlIGdldE1lZGlhVHlwZUZyb21GaWxlTmFtZShmaW5hbCBTdHJpbmcgZmlsZU5hbWUpOworCit9CmRpZmYgLS1naXQgYS9tZWRpYS9tdWx0aXBhcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9tdWx0aXBhcnQvZmlsZS9TdHJlYW1EYXRhQm9keVBhcnQuamF2YSBiL21lZGlhL211bHRpcGFydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9maWxlL1N0cmVhbURhdGFCb2R5UGFydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMWVmZTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdWx0aXBhcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9tdWx0aXBhcnQvZmlsZS9TdHJlYW1EYXRhQm9keVBhcnQuamF2YQpAQCAtMCwwICsxLDI3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuZmlsZTsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS50ZXh0Lk1lc3NhZ2VGb3JtYXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5Gb3JtRGF0YUJvZHlQYXJ0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5Gb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbjsKKworLyoqCisgKiBSZXByZXNlbnRzIGFuIHtAbGluayBJbnB1dFN0cmVhbX0gYmFzZWQgZmlsZSBzdWJtaXNzaW9uIGFzIGEgcGFydCBvZiB0aGUKKyAqIG11bHRpcGFydC9mb3JtLWRhdGEuCisgKiA8cC8+CisgKiBJdCBzZXRzIHRoZSB7QGxpbmsgSW5wdXRTdHJlYW19IGFzIGEgYm9keSBwYXJ0IHdpdGggdGhlIGRlZmF1bHQKKyAqIHtAbGluayBNZWRpYVR5cGUjQVBQTElDQVRJT05fT0NURVRfU1RSRUFNX1RZUEV9IChpZiBub3Qgc3BlY2lmaWVkIGJ5IHRoZQorICogdXNlcikuCisgKiA8cC8+CisgKiBOb3RlOiBUaGUgTUlNRSB0eXBlIG9mIHRoZSBlbnRpdHkgY2Fubm90IGJlIGF1dG9tYXRpY2FsbHkgcHJlZGljdGVkIGFzIGluIGNhc2UKKyAqIG9mIHtAbGluayBGaWxlRGF0YUJvZHlQYXJ0fS4KKyAqIDxwLz4KKyAqIFRoZSBmaWxlbmFtZSBvZiB0aGUgYXR0YWNobWVudCBpcyBzZXQgYnkgdGhlIHVzZXIgb3IgZGVmYXVsdHMgdG8gdGhlIHBhcnQncworICogbmFtZS4KKyAqCisgKiBAYXV0aG9yIFBlZHJvIEtvd2Fsc2tpIChwYWxsaXBwIGF0IGdtYWlsLmNvbSkKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICoKKyAqIEBzZWUgRmlsZURhdGFCb2R5UGFydAorICovCitwdWJsaWMgY2xhc3MgU3RyZWFtRGF0YUJvZHlQYXJ0IGV4dGVuZHMgRm9ybURhdGFCb2R5UGFydCB7CisKKyAgICAvKioKKyAgICAgKiBVbmRlcmx5aW5nIGlucHV0IHN0cmVhbSBlbnRpdHkgdG8gYmUgc2VudC4KKyAgICAgKi8KKyAgICBwcml2YXRlIElucHV0U3RyZWFtIHN0cmVhbUVudGl0eTsKKworICAgIC8qKgorICAgICAqIEZpbGVuYW1lIG9mIHRoZSBhdHRhY2htZW50IChzdHJlYW0pIHNldCBieSB0aGUgdXNlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBmaWxlbmFtZTsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgY29uc3RydWN0b3Igd2hpY2ggZm9yY2VzIHVzZXIgdG8gbWFudWFsbHkgc2V0CisgICAgICogdGhlIHJlcXVpcmVkICh7QGNvZGUgbmFtZX0gYW5kIHtAY29kZSBzdHJlYW1FbnRpdHl9KQorICAgICAqIHByb3BlcnRpZXMuCisgICAgICogPHAvPgorICAgICAqIHtAbGluayBTdHJlYW1EYXRhQm9keVBhcnQjc2V0RmlsZW5hbWUoU3RyaW5nKX0gY2FuIGJlIHVzZWQgdG8gc2V0CisgICAgICogdXNlci1zcGVjaWZpZWQgYXR0YWNobWVudCBmaWxlbmFtZSBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IG9uZS4KKyAgICAgKgorICAgICAqIEBzZWUgRm9ybURhdGFCb2R5UGFydCNzZXROYW1lKFN0cmluZykKKyAgICAgKiBAc2VlIFN0cmVhbURhdGFCb2R5UGFydCNzZXRTdHJlYW1FbnRpdHkoSW5wdXRTdHJlYW0sIE1lZGlhVHlwZSkKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyZWFtRGF0YUJvZHlQYXJ0KCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIGNvbnN0cnVjdG9yIHdoaWNoIGFzc3VtZXMgdGhlIGRlZmF1bHRzIGZvcjoKKyAgICAgKiB7QGNvZGUgZmlsZW5hbWV9IChwYXJ0J3MgbmFtZSkgYW5kIHtAY29kZSBtZWRpYVR5cGV9ICgKKyAgICAgKiB7QGxpbmsgTWVkaWFUeXBlI0FQUExJQ0FUSU9OX09DVEVUX1NUUkVBTV9UWVBFfSkuCisgICAgICogPHAvPgorICAgICAqIEl0IGJ1aWxkcyB0aGUgcmVxdWVzdGVkIGJvZHkgcGFydCBhbmQgbWFrZXMgdGhlIHBhcnQgcmVhZHkgZm9yCisgICAgICogc3VibWlzc2lvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lICAgICAgICAgbmFtZSBvZiB0aGUgZm9ybS1kYXRhIGZpZWxkLgorICAgICAqIEBwYXJhbSBzdHJlYW1FbnRpdHkgZW50aXR5IHRvIGJlIHNldCBhcyBhIGJvZHkgcGFydC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyZWFtRGF0YUJvZHlQYXJ0KGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBJbnB1dFN0cmVhbSBzdHJlYW1FbnRpdHkpIHsKKyAgICAgICAgdGhpcyhuYW1lLCBzdHJlYW1FbnRpdHksIG51bGwsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlbmllbmNlIGNvbnN0cnVjdG9yIHdoaWNoIGFzc3VtZXMgdGhlIGRlZmF1bHRzIGZvciB0aGUKKyAgICAgKiB7QGNvZGUgbWVkaWFUeXBlfSAoe0BsaW5rIE1lZGlhVHlwZSNBUFBMSUNBVElPTl9PQ1RFVF9TVFJFQU1fVFlQRX0pLgorICAgICAqIDxwLz4KKyAgICAgKiBJdCBidWlsZHMgdGhlIHJlcXVlc3RlZCBib2R5IHBhcnQgYW5kIG1ha2VzIHRoZSBwYXJ0IHJlYWR5IGZvcgorICAgICAqIHN1Ym1pc3Npb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSAgICAgICAgIG5hbWUgb2YgdGhlIGZvcm0tZGF0YSBmaWVsZC4KKyAgICAgKiBAcGFyYW0gc3RyZWFtRW50aXR5IGVudGl0eSB0byBiZSBzZXQgYXMgYSBib2R5IHBhcnQuCisgICAgICogQHBhcmFtIGZpbGVuYW1lICAgICBmaWxlbmFtZSBvZiB0aGUgc2VudCBhdHRhY2htZW50ICh0byBiZSBzZXQgYXMgYSBwYXJ0IG9mCisgICAgICogICAgICAgICAgICAgICAgICAgICB7QGNvZGUgY29udGVudC1kaXNwb3NpdGlvbn0pLgorICAgICAqLworICAgIHB1YmxpYyBTdHJlYW1EYXRhQm9keVBhcnQoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIElucHV0U3RyZWFtIHN0cmVhbUVudGl0eSwgZmluYWwgU3RyaW5nIGZpbGVuYW1lKSB7CisgICAgICAgIHRoaXMobmFtZSwgc3RyZWFtRW50aXR5LCBmaWxlbmFtZSwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWxsLWFyZ3VtZW50cyBjb25zdHJ1Y3RvciB3aXRoIGFsbCByZXF1ZXN0ZWQgcGFyYW1ldGVycyBzZXQgYnkgdGhlCisgICAgICogY2FsbGVyLgorICAgICAqIDxwLz4KKyAgICAgKiBJdCBidWlsZHMgdGhlIHJlcXVlc3RlZCBib2R5IHBhcnQgYW5kIG1ha2VzIHRoZSBwYXJ0IHJlYWR5IGZvcgorICAgICAqIHN1Ym1pc3Npb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSAgICAgICAgIG5hbWUgb2YgdGhlIGZvcm0tZGF0YSBmaWVsZC4KKyAgICAgKiBAcGFyYW0gc3RyZWFtRW50aXR5IGVudGl0eSB0byBiZSBzZXQgYXMgYSBib2R5IHBhcnQuCisgICAgICogQHBhcmFtIGZpbGVuYW1lICAgICBmaWxlbmFtZSBvZiB0aGUgc2VudCBhdHRhY2htZW50ICh0byBiZSBzZXQgYXMgYSBwYXJ0IG9mCisgICAgICogICAgICAgICAgICAgICAgICAgICB7QGNvZGUgY29udGVudC1kaXNwb3NpdGlvbn0pLgorICAgICAqIEBwYXJhbSBtZWRpYVR5cGUgICAgTUlNRSB0eXBlIG9mIHRoZSB7QGNvZGUgc3RyZWFtRW50aXR5fSBhdHRhY2htZW50LgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHtAY29kZSBuYW1lfSBvciB7QGNvZGUgc3RyZWFtRW50aXR5fSBhcmUge0Bjb2RlIG51bGx9LgorICAgICAqLworICAgIHB1YmxpYyBTdHJlYW1EYXRhQm9keVBhcnQoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIElucHV0U3RyZWFtIHN0cmVhbUVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKworICAgICAgICAvLyBOb3QgYWxsb3dlZCBpbiBub24tZGVmYXVsdCBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uLgorICAgICAgICBpZiAobmFtZSA9PSBudWxsIHx8IHN0cmVhbUVudGl0eSA9PSBudWxsKSB7CisgICAgICAgICAgICBNZXNzYWdlRm9ybWF0IG1zZyA9IG5ldyBNZXNzYWdlRm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAiTmVpdGhlciB0aGUgXCJuYW1lXCIgbm9yIFwic3RyZWFtRW50aXR5XCIgY2FuIGJlIG51bGwuIFBhc3NlZCB2YWx1ZXM6IFwiezB9XCIgXCJ7MX1cIiIpOworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihtc2cuZm9ybWF0KG5ldyBPYmplY3RbXSB7bmFtZSwgc3RyZWFtRW50aXR5fSkpOworICAgICAgICB9CisKKyAgICAgICAgc2V0RmlsZW5hbWUoZmlsZW5hbWUpOworCisgICAgICAgIC8vIEJlIHN1cmUgdG8gaGl0IHRoZSBwYXJlbnQgKG5vbi1vdmVybG9hZGVkKSBtZXRob2QuCisgICAgICAgIHN1cGVyLnNldE5hbWUobmFtZSk7CisKKyAgICAgICAgaWYgKG1lZGlhVHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICBzZXRTdHJlYW1FbnRpdHkoc3RyZWFtRW50aXR5LCBtZWRpYVR5cGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2V0U3RyZWFtRW50aXR5KHN0cmVhbUVudGl0eSwgZ2V0RGVmYXVsdE1lZGlhVHlwZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgZnJvbSB0aGlzIGltcGxlbWVudGF0aW9uLgorICAgICAqCisgICAgICogQHRocm93cyBqYXZhLmxhbmcuVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gT3BlcmF0aW9uIG5vdCBzdXBwb3J0ZWQuCisgICAgICoKKyAgICAgKiBAc2VlIFN0cmVhbURhdGFCb2R5UGFydCNzZXRTdHJlYW1FbnRpdHkoSW5wdXRTdHJlYW0sIE1lZGlhVHlwZSkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLCBmaW5hbCBPYmplY3QgdmFsdWUpIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiSXQgaXMgdW5zdXBwb3J0ZWQsIHBsZWFzZSB1c2Ugc2V0U3RyZWFtRW50aXR5KC0pIGluc3RlYWQhIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBmcm9tIHRoaXMgaW1wbGVtZW50YXRpb24uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBPcGVyYXRpb24gbm90IHN1cHBvcnRlZC4KKyAgICAgKgorICAgICAqIEBzZWUgU3RyZWFtRGF0YUJvZHlQYXJ0I3NldFN0cmVhbUVudGl0eShJbnB1dFN0cmVhbSkKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJJdCBpcyB1bnN1cHBvcnRlZCwgcGxlYXNlIHVzZSBzZXRTdHJlYW1FbnRpdHkoLSkgaW5zdGVhZCEiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGZyb20gdGhpcyBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIE9wZXJhdGlvbiBub3Qgc3VwcG9ydGVkLgorICAgICAqCisgICAgICogQHNlZSBTdHJlYW1EYXRhQm9keVBhcnQjc2V0U3RyZWFtRW50aXR5KElucHV0U3RyZWFtLCBNZWRpYVR5cGUpCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgc2V0RW50aXR5KGZpbmFsIE9iamVjdCBlbnRpdHkpIHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiSXQgaXMgdW5zdXBwb3J0ZWQsIHBsZWFzZSB1c2Ugc2V0U3RyZWFtRW50aXR5KC0pIGluc3RlYWQhIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWxsb3dzIHRvIGV4cGxpY2l0bHkgc2V0IHRoZSBib2R5IHBhcnQgZW50aXR5LiBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoZQorICAgICAqIGRlZmF1bHQge0BsaW5rIE1lZGlhVHlwZSNBUFBMSUNBVElPTl9PQ1RFVF9TVFJFQU19IE1JTUUgdHlwZSBhbmQgZG9lc24ndAorICAgICAqIGhhdmUgdG8gYmUgaW52b2tlZCBpZiBvbmUgb2YgdGhlIG5vbi1kZWZhdWx0IGNvbnN0cnVjdG9ycyB3YXMgYWxyZWFkeQorICAgICAqIGNhbGxlZC4KKyAgICAgKiA8cC8+CisgICAgICogRWl0aGVyIHRoaXMgbWV0aG9kIG9yIHtAbGluayBTdHJlYW1EYXRhQm9keVBhcnQjc2V0U3RyZWFtRW50aXR5KElucHV0U3RyZWFtLCBNZWRpYVR5cGUpfQorICAgICAqIDxzdHJvbmc+bXVzdDwvc3Ryb25nPiBiZSBpbnZva2VkIGlmIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIHdhcyBjYWxsZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyZWFtRW50aXR5IGVudGl0eSB0byBiZSBzZXQgYXMgYSBib2R5IHBhcnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U3RyZWFtRW50aXR5KGZpbmFsIElucHV0U3RyZWFtIHN0cmVhbUVudGl0eSkgeworICAgICAgICB0aGlzLnNldFN0cmVhbUVudGl0eShzdHJlYW1FbnRpdHksIGdldERlZmF1bHRNZWRpYVR5cGUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWxsb3dzIHRvIGV4cGxpY2l0bHkgc2V0IHRoZSB2YWx1ZSBhbmQgdGhlIE1JTUUgdHlwZSBvZiB0aGUgYm9keSBwYXJ0CisgICAgICogZW50aXR5LiBUaGlzIG1ldGhvZCBkb2Vzbid0IGhhdmUgdG8gYmUgaW52b2tlZCBpZiBvbmUgb2YgdGhlIG5vbi1kZWZhdWx0CisgICAgICogY29uc3RydWN0b3JzIHdhcyBhbHJlYWR5IGNhbGxlZC4KKyAgICAgKiA8cC8+CisgICAgICogRWl0aGVyIHRoaXMgbWV0aG9kIG9yIHtAbGluayBTdHJlYW1EYXRhQm9keVBhcnQjc2V0U3RyZWFtRW50aXR5KElucHV0U3RyZWFtKX0KKyAgICAgKiA8c3Ryb25nPm11c3Q8L3N0cm9uZz4gYmUgaW52b2tlZCBpZiB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvciB3YXMgY2FsbGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHN0cmVhbUVudGl0eSBlbnRpdHkgdG8gYmUgc2V0IGFzIGEgYm9keSBwYXJ0LgorICAgICAqIEBwYXJhbSBtZWRpYVR5cGUgTUlNRSB0eXBlIG9mIHRoZSB7QGNvZGUgc3RyZWFtRW50aXR5fSBhdHRhY2htZW50LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFN0cmVhbUVudGl0eShmaW5hbCBJbnB1dFN0cmVhbSBzdHJlYW1FbnRpdHksIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgaWYgKHN0cmVhbUVudGl0eSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJlYW0gYm9keSBwYXJ0IGVudGl0eSBjYW5ub3QgYmUgbnVsbC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtZWRpYVR5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgbWVkaWFUeXBlID0gZ2V0RGVmYXVsdE1lZGlhVHlwZSgpOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy5zdHJlYW1FbnRpdHkgPSBzdHJlYW1FbnRpdHk7CisKKyAgICAgICAgLy8gQmUgc3VyZSB0byBoaXQgdGhlIHBhcmVudCAobm9uLW92ZXJsb2FkZWQpIG1ldGhvZC4KKyAgICAgICAgc3VwZXIuc2V0TWVkaWFUeXBlKG1lZGlhVHlwZSk7CisgICAgICAgIHN1cGVyLnNldEVudGl0eShzdHJlYW1FbnRpdHkpOworCisgICAgICAgIHNldEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uKGJ1aWxkQ29udGVudERpc3Bvc2l0aW9uKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJ1aWxkcyB0aGUgYm9keSBwYXJ0IGNvbnRlbnQtZGlzcG9zaXRpb24gaGVhZGVyIHdoaWNoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBmaWxlbmFtZSAob3IgdGhlIGRlZmF1bHQgb25lIGlmIHVuc3BlY2lmaWVkKS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gcmVhZHkgdG8gdXNlIGNvbnRlbnQtZGlzcG9zaXRpb24gaGVhZGVyLgorICAgICAqLworICAgIHByb3RlY3RlZCBGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbiBidWlsZENvbnRlbnREaXNwb3NpdGlvbigpIHsKKyAgICAgICAgRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24uRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb25CdWlsZGVyIGJ1aWxkZXIgPSBGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbi5uYW1lKGdldE5hbWUoKSk7CisKKyAgICAgICAgaWYgKGZpbGVuYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuZmlsZU5hbWUoZmlsZW5hbWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gRGVmYXVsdCBpcyB0byBzZXQgdGhlIG5hbWUgb2YgdGhlIGZpbGUgYXMgYSBmb3JtLWZpZWxkIG5hbWUuCisgICAgICAgICAgICBidWlsZGVyLmZpbGVOYW1lKGdldE5hbWUoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGRlZmF1bHQge0BsaW5rIE1lZGlhVHlwZX0gdG8gYmUgdXNlZCBpZiB0aGUgdXNlciBkaWRuJ3Qgc3BlY2lmeQorICAgICAqIGFueS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gZGVmYXVsdCB7QGxpbmsgTWVkaWFUeXBlfSBmb3IgdGhpcyBib2R5IHBhcnQgZW50aXR5LgorICAgICAqLworICAgIHByb3RlY3RlZCBzdGF0aWMgTWVkaWFUeXBlIGdldERlZmF1bHRNZWRpYVR5cGUoKSB7CisgICAgICAgIHJldHVybiBNZWRpYVR5cGUuQVBQTElDQVRJT05fT0NURVRfU1RSRUFNX1RZUEU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgYm9keSBwYXJ0IGVudGl0eSBmaWxlbmFtZSB2YWx1ZSB0byBiZSB1c2VkIGluIHRoZQorICAgICAqIGNvbnRlbnQtZGlzcG9zaXRpb24gaGVhZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGVuYW1lIG5hbWUgdG8gYmUgdXNlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRGaWxlbmFtZShmaW5hbCBTdHJpbmcgZmlsZW5hbWUpIHsKKyAgICAgICAgdGhpcy5maWxlbmFtZSA9IGZpbGVuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHVuZGVybHlpbmcgc3RyZWFtIGVudGl0eSB3aGljaCB3aWxsIGZvcm0gdGhlIGJvZHkgcGFydCBlbnRpdHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHVuZGVybHlpbmcgc3RyZWFtLgorICAgICAqLworICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXRTdHJlYW1FbnRpdHkoKSB7CisgICAgICAgIHJldHVybiBzdHJlYW1FbnRpdHk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgZmlsZW5hbWUgdmFsdWUgd2hpY2ggaXMgdG8gYmUgdXNlZCBpbiB0aGUgY29udGVudC1kaXNwb3NpdGlvbgorICAgICAqIGhlYWRlciBvZiB0aGlzIGJvZHkgcGFydCBlbnRpdHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGZpbGVuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZW5hbWUoKSB7CisgICAgICAgIHJldHVybiBmaWxlbmFtZTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL21lZGlhL211bHRpcGFydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9maWxlL3BhY2thZ2UtaW5mby5qYXZhIGIvbWVkaWEvbXVsdGlwYXJ0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvbXVsdGlwYXJ0L2ZpbGUvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JiYzRiOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL211bHRpcGFydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9maWxlL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKKy8qKgorICogUHJvdmlkZXMgc3VwcG9ydCBmb3IgYm9keSBwYXJ0cyB0aGF0IGFyZSBmaWxlIGF0dGFjaG1lbnRzLgorICogPHAvPgorICogVGhlIGZpbGUgYXR0YWNobWVudCBjYW4gYmUgcmVwcmVzZW50ZWQgaS5lLiBieSB0aGUge0BsaW5rIGphdmEuaW8uRmlsZX0KKyAqICh7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LmZpbGUuRmlsZURhdGFCb2R5UGFydH0pIG9yCisgKiBieSB0aGUge0BsaW5rIGphdmEuaW8uSW5wdXRTdHJlYW19CisgKiAoe0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5maWxlLlN0cmVhbURhdGFCb2R5UGFydH0pLgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5maWxlOworCmRpZmYgLS1naXQgYS9tZWRpYS9tdWx0aXBhcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9tdWx0aXBhcnQvaW50ZXJuYWwvRm9ybURhdGFQYXJhbUluamVjdGlvbkZlYXR1cmUuamF2YSBiL21lZGlhL211bHRpcGFydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9pbnRlcm5hbC9Gb3JtRGF0YVBhcmFtSW5qZWN0aW9uRmVhdHVyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxYmZkZWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdWx0aXBhcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9tdWx0aXBhcnQvaW50ZXJuYWwvRm9ybURhdGFQYXJhbUluamVjdGlvbkZlYXR1cmUuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5pbnRlcm5hbDsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN0cmFpbmVkVG87CitpbXBvcnQgamF2YXgud3MucnMuUnVudGltZVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQWJzdHJhY3RCaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkJpbmRpbmdzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5Gb3JtRGF0YVBhcmFtOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5pbmplY3QuTXVsdGl2YWx1ZWRQYXJhbWV0ZXJFeHRyYWN0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuaW5qZWN0LlBhcmFtSW5qZWN0aW9uUmVzb2x2ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5pbnRlcm5hbC5WYWx1ZVBhcmFtUHJvdmlkZXI7CisKKy8qKgorICogRmVhdHVyZSBwcm92aWRpbmcgc3VwcG9ydCBmb3Ige0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5Gb3JtRGF0YVBhcmFtfSBwYXJhbWV0ZXIgaW5qZWN0aW9uLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAQ29uc3RyYWluZWRUbyhSdW50aW1lVHlwZS5TRVJWRVIpCitwdWJsaWMgZmluYWwgY2xhc3MgRm9ybURhdGFQYXJhbUluamVjdGlvbkZlYXR1cmUgaW1wbGVtZW50cyBGZWF0dXJlIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZShGZWF0dXJlQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGNvbnRleHQucmVnaXN0ZXIobmV3IEFic3RyYWN0QmluZGVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgICAgICAgICAgUHJvdmlkZXI8TXVsdGl2YWx1ZWRQYXJhbWV0ZXJFeHRyYWN0b3JQcm92aWRlcj4gZXh0cmFjdG9yUHJvdmlkZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlTWFuYWdlZEluc3RhbmNlUHJvdmlkZXIoTXVsdGl2YWx1ZWRQYXJhbWV0ZXJFeHRyYWN0b3JQcm92aWRlci5jbGFzcyk7CisgICAgICAgICAgICAgICAgUHJvdmlkZXI8Q29udGFpbmVyUmVxdWVzdD4gcmVxdWVzdFByb3ZpZGVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZU1hbmFnZWRJbnN0YW5jZVByb3ZpZGVyKENvbnRhaW5lclJlcXVlc3QuY2xhc3MpOworCisgICAgICAgICAgICAgICAgRm9ybURhdGFQYXJhbVZhbHVlUGFyYW1Qcm92aWRlciB2YWx1ZVN1cHBsaWVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGb3JtRGF0YVBhcmFtVmFsdWVQYXJhbVByb3ZpZGVyKGV4dHJhY3RvclByb3ZpZGVyKTsKKyAgICAgICAgICAgICAgICBiaW5kKEJpbmRpbmdzLnNlcnZpY2UodmFsdWVTdXBwbGllcikudG8oVmFsdWVQYXJhbVByb3ZpZGVyLmNsYXNzKSk7CisgICAgICAgICAgICAgICAgYmluZChCaW5kaW5ncy5pbmplY3Rpb25SZXNvbHZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQYXJhbUluamVjdGlvblJlc29sdmVyPD4odmFsdWVTdXBwbGllciwgRm9ybURhdGFQYXJhbS5jbGFzcywgcmVxdWVzdFByb3ZpZGVyKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbXVsdGlwYXJ0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvbXVsdGlwYXJ0L2ludGVybmFsL0Zvcm1EYXRhUGFyYW1WYWx1ZVBhcmFtUHJvdmlkZXIuamF2YSBiL21lZGlhL211bHRpcGFydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9pbnRlcm5hbC9Gb3JtRGF0YVBhcmFtVmFsdWVQYXJhbVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJmMzNkOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL211bHRpcGFydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9pbnRlcm5hbC9Gb3JtRGF0YVBhcmFtVmFsdWVQYXJhbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwzOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgamF2YXgud3MucnMuQmFkUmVxdWVzdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcjsKKworaW1wb3J0IGphdmF4LmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5FeHRyYWN0b3JFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5SZWZsZWN0aW9uSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5NdWx0aXZhbHVlZFN0cmluZ01hcDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuQm9keVBhcnRFbnRpdHk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LkZvcm1EYXRhQm9keVBhcnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LkZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5Gb3JtRGF0YU11bHRpUGFydDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuRm9ybURhdGFQYXJhbTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuRm9ybURhdGFQYXJhbUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLk1lc3NhZ2VCb2R5V29ya2VyczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLk1lc3NhZ2VVdGlsczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLlV0aWxzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5pbmplY3QuQWJzdHJhY3RWYWx1ZVBhcmFtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLmluamVjdC5NdWx0aXZhbHVlZFBhcmFtZXRlckV4dHJhY3RvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuaW5qZWN0Lk11bHRpdmFsdWVkUGFyYW1ldGVyRXh0cmFjdG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlBhcmFtZXRlcjsKKworaW1wb3J0IG9yZy5qdm5ldC5taW1lcHVsbC5NSU1FUGFyc2luZ0V4Y2VwdGlvbjsKKworLyoqCisgKiBWYWx1ZSBzdXBwbGllciBwcm92aWRlciBzdXBwb3J0aW5nIHRoZSB7QGxpbmsgRm9ybURhdGFQYXJhbX0gaW5qZWN0aW9uIGFubm90YXRpb24gYW5kIGVudGl0eSAoe0BsaW5rIEZvcm1EYXRhTXVsdGlQYXJ0fSkKKyAqIGluamVjdGlvbi4KKyAqCisgKiBAYXV0aG9yIENyYWlnIE1jQ2xhbmFoYW4KKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitmaW5hbCBjbGFzcyBGb3JtRGF0YVBhcmFtVmFsdWVQYXJhbVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RWYWx1ZVBhcmFtUHJvdmlkZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoRm9ybURhdGFQYXJhbVZhbHVlUGFyYW1Qcm92aWRlci5jbGFzcy5nZXROYW1lKCkpOworCisgICAgcHJpdmF0ZSBhYnN0cmFjdCBjbGFzcyBWYWx1ZVByb3ZpZGVyPFQ+IGltcGxlbWVudHMgRnVuY3Rpb248Q29udGFpbmVyUmVxdWVzdCwgVD4geworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIGEge0Bjb2RlIEZvcm1EYXRhTXVsdGlQYXJ0fSBlbnRpdHkgZnJvbSB0aGUgcmVxdWVzdCBhbmQgc3RvcmVzIGl0IGluIHRoZSByZXF1ZXN0IGNvbnRleHQgcHJvcGVydGllcy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBhIGZvcm0gZGF0YSBtdWx0aSBwYXJ0IGVudGl0eS4KKyAgICAgICAgICovCisgICAgICAgIEZvcm1EYXRhTXVsdGlQYXJ0IGdldEVudGl0eShDb250YWluZXJSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZXF1ZXN0UHJvcGVydHlOYW1lID0gRm9ybURhdGFNdWx0aVBhcnQuY2xhc3MuZ2V0TmFtZSgpOworCisgICAgICAgICAgICBPYmplY3QgZW50aXR5ID0gcmVxdWVzdC5nZXRQcm9wZXJ0eShyZXF1ZXN0UHJvcGVydHlOYW1lKTsKKyAgICAgICAgICAgIGlmIChlbnRpdHkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGVudGl0eSA9IHJlcXVlc3QucmVhZEVudGl0eShGb3JtRGF0YU11bHRpUGFydC5jbGFzcyk7CisgICAgICAgICAgICAgICAgaWYgKGVudGl0eSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLkVOVElUWV9JU19FTVBUWSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVxdWVzdC5zZXRQcm9wZXJ0eShyZXF1ZXN0UHJvcGVydHlOYW1lLCBlbnRpdHkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gKEZvcm1EYXRhTXVsdGlQYXJ0KSBlbnRpdHk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlciBzdXBwbGllciBmb3IgZW50aXR5IG9mIHtAY29kZSBGb3JtRGF0YU11bHRpUGFydH0gdHlwZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIEZvcm1EYXRhTXVsdGlQYXJ0UHJvdmlkZXIgZXh0ZW5kcyBWYWx1ZVByb3ZpZGVyPEZvcm1EYXRhTXVsdGlQYXJ0PiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBGb3JtRGF0YU11bHRpUGFydCBhcHBseShDb250YWluZXJSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRFbnRpdHkocmVxdWVzdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlciBzdXBwbGllciBmb3IgbGlzdCBvZiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LkZvcm1EYXRhQm9keVBhcnR9IHR5cGVzIGluamVjdGVkIHZpYQorICAgICAqIHtAbGluayBGb3JtRGF0YVBhcmFtfSBhbm5vdGF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgY2xhc3MgTGlzdEZvcm1EYXRhQm9keVBhcnRWYWx1ZVByb3ZpZGVyIGV4dGVuZHMgVmFsdWVQcm92aWRlcjxMaXN0PEZvcm1EYXRhQm9keVBhcnQ+PiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworICAgICAgICBwdWJsaWMgTGlzdEZvcm1EYXRhQm9keVBhcnRWYWx1ZVByb3ZpZGVyKGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBMaXN0PEZvcm1EYXRhQm9keVBhcnQ+IGFwcGx5KENvbnRhaW5lclJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEVudGl0eShyZXF1ZXN0KS5nZXRGaWVsZHMobmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlciBzdXBwbGllciBmb3IgbGlzdCBvZiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LkZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9ufSB0eXBlcyBpbmplY3RlZCB2aWEKKyAgICAgKiB7QGxpbmsgRm9ybURhdGFQYXJhbX0gYW5ub3RhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIExpc3RGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvblByb3ZpZGVyIGV4dGVuZHMgVmFsdWVQcm92aWRlcjxMaXN0PEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uPj4geworCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisKKyAgICAgICAgcHVibGljIExpc3RGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvblByb3ZpZGVyKGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBMaXN0PEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uPiBhcHBseShDb250YWluZXJSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8Rm9ybURhdGFCb2R5UGFydD4gcGFydHMgPSBnZXRFbnRpdHkocmVxdWVzdCkuZ2V0RmllbGRzKG5hbWUpOworCisgICAgICAgICAgICByZXR1cm4gcGFydHMgPT0gbnVsbCA/IG51bGwgOiBwYXJ0cy5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKEZvcm1EYXRhQm9keVBhcnQ6OmdldEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFByb3ZpZGVyIHN1cHBsaWVyIGZvciB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LkZvcm1EYXRhQm9keVBhcnR9IHR5cGVzIGluamVjdGVkIHZpYQorICAgICAqIHtAbGluayBGb3JtRGF0YVBhcmFtfSBhbm5vdGF0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgY2xhc3MgRm9ybURhdGFCb2R5UGFydFByb3ZpZGVyIGV4dGVuZHMgVmFsdWVQcm92aWRlcjxGb3JtRGF0YUJvZHlQYXJ0PiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworICAgICAgICBwdWJsaWMgRm9ybURhdGFCb2R5UGFydFByb3ZpZGVyKGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBGb3JtRGF0YUJvZHlQYXJ0IGFwcGx5KENvbnRhaW5lclJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEVudGl0eShyZXF1ZXN0KS5nZXRGaWVsZChuYW1lKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFByb3ZpZGVyIHN1cHBsaWVyIGZvciB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LkZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9ufSB0eXBlcyBpbmplY3RlZCB2aWEKKyAgICAgKiB7QGxpbmsgRm9ybURhdGFQYXJhbX0gYW5ub3RhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uUHJvdmlkZXIgZXh0ZW5kcyBWYWx1ZVByb3ZpZGVyPEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uPiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworICAgICAgICBwdWJsaWMgRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb25Qcm92aWRlcihmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24gYXBwbHkoQ29udGFpbmVyUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgICAgICBmaW5hbCBGb3JtRGF0YUJvZHlQYXJ0IHBhcnQgPSBnZXRFbnRpdHkocmVxdWVzdCkuZ2V0RmllbGQobmFtZSk7CisKKyAgICAgICAgICAgIHJldHVybiBwYXJ0ID09IG51bGwgPyBudWxsIDogcGFydC5nZXRGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvdmlkZXIgc3VwcGxpZXIgZm9yIHtAbGluayBqYXZhLmlvLkZpbGV9IHR5cGVzIGluamVjdGVkIHZpYSB7QGxpbmsgRm9ybURhdGFQYXJhbX0gYW5ub3RhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIEZpbGVQcm92aWRlciBleHRlbmRzIFZhbHVlUHJvdmlkZXI8RmlsZT4geworCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisKKyAgICAgICAgcHVibGljIEZpbGVQcm92aWRlcihmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRmlsZSBhcHBseShDb250YWluZXJSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgICAgIGZpbmFsIEZvcm1EYXRhQm9keVBhcnQgcGFydCA9IGdldEVudGl0eShyZXF1ZXN0KS5nZXRGaWVsZChuYW1lKTsKKyAgICAgICAgICAgIGZpbmFsIEJvZHlQYXJ0RW50aXR5IGVudGl0eSA9IHBhcnQgIT0gbnVsbCA/IHBhcnQuZ2V0RW50aXR5QXMoQm9keVBhcnRFbnRpdHkuY2xhc3MpIDogbnVsbDsKKworICAgICAgICAgICAgaWYgKGVudGl0eSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgdGVtcG9yYXJ5IGZpbGUuCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIEZpbGUgZmlsZSA9IFV0aWxzLmNyZWF0ZVRlbXBGaWxlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gTW92ZSB0aGUgcGFydCAocmVwcmVzZW50ZWQgZWl0aGVyIHZpYSBzdHJlYW0gb3IgZmlsZSkgdG8gdGhlIHNwZWNpZmljIHRlbXBvcmFyeSBmaWxlLgorICAgICAgICAgICAgICAgICAgICBlbnRpdHkubW92ZVRvKGZpbGUpOworCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWxlOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIHwgTUlNRVBhcnNpbmdFeGNlcHRpb24gY2Fubm90TW92ZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBVbmFibGUgdG8gY3JlYXRlIGEgdGVtcG9yYXJ5IGZpbGUgb3IgbW92ZSB0aGUgZmlsZS4KKyAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5XQVJOSU5HLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5DQU5OT1RfSU5KRUNUX0ZJTEUoKSwgY2Fubm90TW92ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFByb3ZpZGVyIHN1cHBsaWVyIGZvciBnZW5lcmljIHR5cGVzIGluamVjdGVkIHZpYSB7QGxpbmsgRm9ybURhdGFQYXJhbX0gYW5ub3RhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIEZvcm1EYXRhUGFyYW1WYWx1ZVByb3ZpZGVyIGV4dGVuZHMgVmFsdWVQcm92aWRlcjxPYmplY3Q+IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIE11bHRpdmFsdWVkUGFyYW1ldGVyRXh0cmFjdG9yPD8+IGV4dHJhY3RvcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQYXJhbWV0ZXIgcGFyYW1ldGVyOworCisgICAgICAgIHB1YmxpYyBGb3JtRGF0YVBhcmFtVmFsdWVQcm92aWRlcihQYXJhbWV0ZXIgcGFyYW1ldGVyLCBNdWx0aXZhbHVlZFBhcmFtZXRlckV4dHJhY3Rvcjw/PiBleHRyYWN0b3IpIHsKKyAgICAgICAgICAgIHRoaXMucGFyYW1ldGVyID0gcGFyYW1ldGVyOworICAgICAgICAgICAgdGhpcy5leHRyYWN0b3IgPSBleHRyYWN0b3I7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE9iamVjdCBhcHBseShDb250YWluZXJSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgICAgIC8vIFJldHVybiB0aGUgZmllbGQgdmFsdWUgZm9yIHRoZSBmaWVsZCBzcGVjaWZpZWQgYnkgdGhlIHNvdXJjZU5hbWUgcHJvcGVydHkuCisgICAgICAgICAgICBmaW5hbCBMaXN0PEZvcm1EYXRhQm9keVBhcnQ+IHBhcnRzID0gZ2V0RW50aXR5KHJlcXVlc3QpLmdldEZpZWxkcyhwYXJhbWV0ZXIuZ2V0U291cmNlTmFtZSgpKTsKKworICAgICAgICAgICAgZmluYWwgRm9ybURhdGFCb2R5UGFydCBwYXJ0ID0gcGFydHMgIT0gbnVsbCA/IHBhcnRzLmdldCgwKSA6IG51bGw7CisgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlID0gcGFydCAhPSBudWxsID8gcGFydC5nZXRNZWRpYVR5cGUoKSA6IE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEU7CisKKyAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2VCb2R5V29ya2VycyBtZXNzYWdlQm9keVdvcmtlcnMgPSByZXF1ZXN0LmdldFdvcmtlcnMoKTsKKworICAgICAgICAgICAgTWVzc2FnZUJvZHlSZWFkZXIgcmVhZGVyID0gbWVzc2FnZUJvZHlXb3JrZXJzLmdldE1lc3NhZ2VCb2R5UmVhZGVyKAorICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIuZ2V0UmF3VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIuZ2V0VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIuZ2V0QW5ub3RhdGlvbnMoKSwKKyAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlKTsKKworICAgICAgICAgICAgLy8gVHJhbnNmb3JtIG5vbi1wcmltaXRpdmUgcGFydCBlbnRpdHkgaW50byBhbiBpbnN0YW5jZS4KKyAgICAgICAgICAgIGlmIChyZWFkZXIgIT0gbnVsbAorICAgICAgICAgICAgICAgICAgICAmJiAhaXNQcmltaXRpdmVUeXBlKHBhcmFtZXRlci5nZXRSYXdUeXBlKCkpKSB7CisKKyAgICAgICAgICAgICAgICAvLyBHZXQgaW5wdXQgc3RyZWFtIG9mIHRoZSBib2R5IHBhcnQuCisgICAgICAgICAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gc3RyZWFtOworICAgICAgICAgICAgICAgIGlmIChwYXJ0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtZXRlci5nZXREZWZhdWx0VmFsdWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb252ZXJ0IGRlZmF1bHQgdmFsdWUgdG8gYnl0ZXMuCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocGFyYW1ldGVyLmdldERlZmF1bHRWYWx1ZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRCeXRlcyhNZXNzYWdlVXRpbHMuZ2V0Q2hhcnNldChtZWRpYVR5cGUpKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbSA9IHBhcnQuZ2V0RW50aXR5QXMoQm9keVBhcnRFbnRpdHkuY2xhc3MpLmdldElucHV0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gVHJhbnNmb3JtIGlucHV0IHN0cmVhbSBpbnRvIGluc3RhbmNlIG9mIGRlc2lyZWQgSmF2YSB0eXBlLgorICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIC8vbm9pbnNwZWN0aW9uIHVuY2hlY2tlZAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVhZGVyLnJlYWRGcm9tKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlci5nZXRSYXdUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyLmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIuZ2V0QW5ub3RhdGlvbnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRIZWFkZXJzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtRGF0YVBhcmFtRXhjZXB0aW9uKGUsIHBhcmFtZXRlci5nZXRTb3VyY2VOYW1lKCksIHBhcmFtZXRlci5nZXREZWZhdWx0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJZiBubyByZWFkZXIgd2FzIGZvdW5kIG9yIGEgcHJpbWl0aXZlIHR5cGUgaXMgYmVpbmcgdHJhbnNmb3JtZWQgdXNlIGV4dHJhY3RvciBpbnN0ZWFkLgorICAgICAgICAgICAgaWYgKGV4dHJhY3RvciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCA9IG5ldyBNdWx0aXZhbHVlZFN0cmluZ01hcCgpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoZmluYWwgRm9ybURhdGFCb2R5UGFydCBwIDogcGFydHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIgPSBtZXNzYWdlQm9keVdvcmtlcnMuZ2V0TWVzc2FnZUJvZHlSZWFkZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIuZ2V0QW5ub3RhdGlvbnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHAuZ2V0TWVkaWFUeXBlKCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIGZpbmFsIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIHJlYWRlci5yZWFkRnJvbSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlci5nZXRBbm5vdGF0aW9ucygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5nZXRIZWFkZXJzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEJvZHlQYXJ0RW50aXR5KSBwLmdldEVudGl0eSgpKS5nZXRJbnB1dFN0cmVhbSgpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5hZGQocGFyYW1ldGVyLmdldFNvdXJjZU5hbWUoKSwgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBleHRyYWN0b3IuZXh0cmFjdChtYXApOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIHwgRXh0cmFjdG9yRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBGb3JtRGF0YVBhcmFtRXhjZXB0aW9uKGV4LCBleHRyYWN0b3IuZ2V0TmFtZSgpLCBleHRyYWN0b3IuZ2V0RGVmYXVsdFZhbHVlU3RyaW5nKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IFRZUEVTID0gaW5pdGlhbGl6ZVR5cGVzKCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBTZXQ8Q2xhc3M8Pz4+IGluaXRpYWxpemVUeXBlcygpIHsKKyAgICAgICAgZmluYWwgU2V0PENsYXNzPD8+PiBuZXdTZXQgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgIG5ld1NldC5hZGQoQnl0ZS5jbGFzcyk7CisgICAgICAgIG5ld1NldC5hZGQoYnl0ZS5jbGFzcyk7CisgICAgICAgIG5ld1NldC5hZGQoU2hvcnQuY2xhc3MpOworICAgICAgICBuZXdTZXQuYWRkKHNob3J0LmNsYXNzKTsKKyAgICAgICAgbmV3U2V0LmFkZChJbnRlZ2VyLmNsYXNzKTsKKyAgICAgICAgbmV3U2V0LmFkZChpbnQuY2xhc3MpOworICAgICAgICBuZXdTZXQuYWRkKExvbmcuY2xhc3MpOworICAgICAgICBuZXdTZXQuYWRkKGxvbmcuY2xhc3MpOworICAgICAgICBuZXdTZXQuYWRkKEZsb2F0LmNsYXNzKTsKKyAgICAgICAgbmV3U2V0LmFkZChmbG9hdC5jbGFzcyk7CisgICAgICAgIG5ld1NldC5hZGQoRG91YmxlLmNsYXNzKTsKKyAgICAgICAgbmV3U2V0LmFkZChkb3VibGUuY2xhc3MpOworICAgICAgICBuZXdTZXQuYWRkKEJvb2xlYW4uY2xhc3MpOworICAgICAgICBuZXdTZXQuYWRkKGJvb2xlYW4uY2xhc3MpOworICAgICAgICBuZXdTZXQuYWRkKENoYXJhY3Rlci5jbGFzcyk7CisgICAgICAgIG5ld1NldC5hZGQoY2hhci5jbGFzcyk7CisgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQobmV3U2V0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzUHJpbWl0aXZlVHlwZShmaW5hbCBDbGFzczw/PiB0eXBlKSB7CisgICAgICAgIHJldHVybiBUWVBFUy5jb250YWlucyh0eXBlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbmplY3Rpb24gY29uc3RydWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXh0cmFjdG9yUHJvdmlkZXIgbXVsdGktdmFsdWVkIG1hcCBwYXJhbWV0ZXIgZXh0cmFjdG9yIHByb3ZpZGVyLgorICAgICAqLworICAgIHB1YmxpYyBGb3JtRGF0YVBhcmFtVmFsdWVQYXJhbVByb3ZpZGVyKFByb3ZpZGVyPE11bHRpdmFsdWVkUGFyYW1ldGVyRXh0cmFjdG9yUHJvdmlkZXI+IGV4dHJhY3RvclByb3ZpZGVyKSB7CisgICAgICAgIHN1cGVyKGV4dHJhY3RvclByb3ZpZGVyLCBQYXJhbWV0ZXIuU291cmNlLkVOVElUWSwgUGFyYW1ldGVyLlNvdXJjZS5VTktOT1dOKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgRnVuY3Rpb248Q29udGFpbmVyUmVxdWVzdCwgPz4gY3JlYXRlVmFsdWVQcm92aWRlcihQYXJhbWV0ZXIgcGFyYW1ldGVyKSB7CisgICAgICAgIGZpbmFsIENsYXNzPD8+IHJhd1R5cGUgPSBwYXJhbWV0ZXIuZ2V0UmF3VHlwZSgpOworCisgICAgICAgIGlmIChQYXJhbWV0ZXIuU291cmNlLkVOVElUWSA9PSBwYXJhbWV0ZXIuZ2V0U291cmNlKCkpIHsKKyAgICAgICAgICAgIGlmIChGb3JtRGF0YU11bHRpUGFydC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHJhd1R5cGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGb3JtRGF0YU11bHRpUGFydFByb3ZpZGVyKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHBhcmFtZXRlci5nZXRTb3VyY2VBbm5vdGF0aW9uKCkuYW5ub3RhdGlvblR5cGUoKSA9PSBGb3JtRGF0YVBhcmFtLmNsYXNzKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGFyYW1OYW1lID0gcGFyYW1ldGVyLmdldFNvdXJjZU5hbWUoKTsKKyAgICAgICAgICAgIGlmIChwYXJhbU5hbWUgPT0gbnVsbCB8fCBwYXJhbU5hbWUuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgLy8gSW52YWxpZCBxdWVyeSBwYXJhbWV0ZXIgbmFtZQorICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoQ29sbGVjdGlvbi5jbGFzcyA9PSByYXdUeXBlIHx8IExpc3QuY2xhc3MgPT0gcmF3VHlwZSkgeworICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzIGNsYXp6ID0gUmVmbGVjdGlvbkhlbHBlci5nZXRHZW5lcmljVHlwZUFyZ3VtZW50Q2xhc3NlcyhwYXJhbWV0ZXIuZ2V0VHlwZSgpKS5nZXQoMCk7CisKKyAgICAgICAgICAgICAgICBpZiAoRm9ybURhdGFCb2R5UGFydC5jbGFzcyA9PSBjbGF6eikgeworICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gYSBjb2xsZWN0aW9uIG9mIGZvcm0gZGF0YSBib2R5IHBhcnQuCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTGlzdEZvcm1EYXRhQm9keVBhcnRWYWx1ZVByb3ZpZGVyKHBhcmFtTmFtZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbi5jbGFzcyA9PSBjbGF6eikgeworICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gYSBjb2xsZWN0aW9uIG9mIGZvcm0gZGF0YSBjb250ZW50IGRpc3Bvc2l0aW9uLgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IExpc3RGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvblByb3ZpZGVyKHBhcmFtTmFtZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gUmV0dXJuIGEgY29sbGVjdGlvbiBvZiBzcGVjaWZpYyB0eXBlLgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZvcm1EYXRhUGFyYW1WYWx1ZVByb3ZpZGVyKHBhcmFtZXRlciwgZ2V0KHBhcmFtZXRlcikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoRm9ybURhdGFCb2R5UGFydC5jbGFzcyA9PSByYXdUeXBlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGb3JtRGF0YUJvZHlQYXJ0UHJvdmlkZXIocGFyYW1OYW1lKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24uY2xhc3MgPT0gcmF3VHlwZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb25Qcm92aWRlcihwYXJhbU5hbWUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChGaWxlLmNsYXNzID09IHJhd1R5cGUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGVQcm92aWRlcihwYXJhbU5hbWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZvcm1EYXRhUGFyYW1WYWx1ZVByb3ZpZGVyKHBhcmFtZXRlciwgZ2V0KHBhcmFtZXRlcikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFByaW9yaXR5VHlwZSBnZXRQcmlvcml0eSgpIHsKKyAgICAgICAgcmV0dXJuIFByaW9yaXR5LkhJR0g7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9tZWRpYS9tdWx0aXBhcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9tdWx0aXBhcnQvaW50ZXJuYWwvTXVsdGlQYXJ0UmVhZGVyQ2xpZW50U2lkZS5qYXZhIGIvbWVkaWEvbXVsdGlwYXJ0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvbXVsdGlwYXJ0L2ludGVybmFsL011bHRpUGFydFJlYWRlckNsaWVudFNpZGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNTExMTA4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXVsdGlwYXJ0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvbXVsdGlwYXJ0L2ludGVybmFsL011bHRpUGFydFJlYWRlckNsaWVudFNpZGUuamF2YQpAQCAtMCwwICsxLDI3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkJhZFJlcXVlc3RFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuQ29uc3RyYWluZWRUbzsKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5SdW50aW1lVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Db250ZXh0UmVzb2x2ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcnM7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LmluamVjdC5Qcm92aWRlcjsKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LkJvZHlQYXJ0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5Cb2R5UGFydEVudGl0eTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuRm9ybURhdGFCb2R5UGFydDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuRm9ybURhdGFNdWx0aVBhcnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0Lk11bHRpUGFydDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuTXVsdGlQYXJ0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLk1lc3NhZ2VCb2R5V29ya2VyczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLk1lZGlhVHlwZXM7CisKK2ltcG9ydCBvcmcuanZuZXQubWltZXB1bGwuSGVhZGVyOworaW1wb3J0IG9yZy5qdm5ldC5taW1lcHVsbC5NSU1FQ29uZmlnOworaW1wb3J0IG9yZy5qdm5ldC5taW1lcHVsbC5NSU1FTWVzc2FnZTsKK2ltcG9ydCBvcmcuanZuZXQubWltZXB1bGwuTUlNRVBhcnNpbmdFeGNlcHRpb247CitpbXBvcnQgb3JnLmp2bmV0Lm1pbWVwdWxsLk1JTUVQYXJ0OworCisvKioKKyAqIHtAbGluayBNZXNzYWdlQm9keVJlYWRlcn0gaW1wbGVtZW50YXRpb24gZm9yIHtAbGluayBNdWx0aVBhcnR9IGVudGl0aWVzLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgTWNDbGFuYWhhbgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BDb25zdW1lcygibXVsdGlwYXJ0LyoiKQorQFNpbmdsZXRvbgorQENvbnN0cmFpbmVkVG8oUnVudGltZVR5cGUuQ0xJRU5UKQorcHVibGljIGNsYXNzIE11bHRpUGFydFJlYWRlckNsaWVudFNpZGUgaW1wbGVtZW50cyBNZXNzYWdlQm9keVJlYWRlcjxNdWx0aVBhcnQ+IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKE11bHRpUGFydFJlYWRlckNsaWVudFNpZGUuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIC8qKgorICAgICAqIEluamVjdGFibGUgaGVscGVyIHRvIGxvb2sgdXAgYXBwcm9wcmlhdGUge0BsaW5rIE1lc3NhZ2VCb2R5UmVhZGVyfXMKKyAgICAgKiBmb3Igb3VyIGJvZHkgcGFydHMuCisgICAgICovCisgICAgQEluamVjdAorICAgIHByaXZhdGUgUHJvdmlkZXI8TWVzc2FnZUJvZHlXb3JrZXJzPiBtZXNzYWdlQm9keVdvcmtlcnM7CisKKyAgICBwcml2YXRlIGZpbmFsIE1JTUVDb25maWcgbWltZUNvbmZpZzsKKworICAgIC8qKgorICAgICAqIEFjY2VwdHMgY29uc3RydWN0b3IgaW5qZWN0aW9uIG9mIHRoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgZm9yIHRoaXMKKyAgICAgKiBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgTXVsdGlQYXJ0UmVhZGVyQ2xpZW50U2lkZShAQ29udGV4dCBmaW5hbCBQcm92aWRlcnMgcHJvdmlkZXJzKSB7CisgICAgICAgIGZpbmFsIENvbnRleHRSZXNvbHZlcjxNdWx0aVBhcnRQcm9wZXJ0aWVzPiBjb250ZXh0UmVzb2x2ZXIgPQorICAgICAgICAgICAgICAgIHByb3ZpZGVycy5nZXRDb250ZXh0UmVzb2x2ZXIoTXVsdGlQYXJ0UHJvcGVydGllcy5jbGFzcywgTWVkaWFUeXBlLldJTERDQVJEX1RZUEUpOworCisgICAgICAgIE11bHRpUGFydFByb3BlcnRpZXMgcHJvcGVydGllcyA9IG51bGw7CisgICAgICAgIGlmIChjb250ZXh0UmVzb2x2ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcHJvcGVydGllcyA9IGNvbnRleHRSZXNvbHZlci5nZXRDb250ZXh0KHRoaXMuZ2V0Q2xhc3MoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByb3BlcnRpZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgcHJvcGVydGllcyA9IG5ldyBNdWx0aVBhcnRQcm9wZXJ0aWVzKCk7CisgICAgICAgIH0KKworICAgICAgICBtaW1lQ29uZmlnID0gY3JlYXRlTWltZUNvbmZpZyhwcm9wZXJ0aWVzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIE1JTUVDb25maWcgY3JlYXRlTWltZUNvbmZpZyhmaW5hbCBNdWx0aVBhcnRQcm9wZXJ0aWVzIHByb3BlcnRpZXMpIHsKKyAgICAgICAgZmluYWwgTUlNRUNvbmZpZyBtaW1lQ29uZmlnID0gbmV3IE1JTUVDb25maWcoKTsKKworICAgICAgICAvLyBTZXQgdmFsdWVzIGRlZmluZWQgYnkgdXNlci4KKyAgICAgICAgbWltZUNvbmZpZy5zZXRNZW1vcnlUaHJlc2hvbGQocHJvcGVydGllcy5nZXRCdWZmZXJUaHJlc2hvbGQoKSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHRlbXBEaXIgPSBwcm9wZXJ0aWVzLmdldFRlbXBEaXIoKTsKKyAgICAgICAgaWYgKHRlbXBEaXIgIT0gbnVsbCkgeworICAgICAgICAgICAgbWltZUNvbmZpZy5zZXREaXIodGVtcERpcik7CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJvcGVydGllcy5nZXRCdWZmZXJUaHJlc2hvbGQoKSAhPSBNdWx0aVBhcnRQcm9wZXJ0aWVzLkJVRkZFUl9USFJFU0hPTERfTUVNT1JZX09OTFkpIHsKKyAgICAgICAgICAgIC8vIFZhbGlkYXRlIC0gdGhpcyBjaGVja3Mgd2hldGhlciBpdCdzIHBvc3NpYmxlIHRvIGNyZWF0ZSB0ZW1wIGZpbGVzIGluIGN1cnJlbnRseSBzZXQgdGVtcCBkaXJlY3RvcnkuCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vbm9pbnNwZWN0aW9uIFJlc3VsdE9mTWV0aG9kQ2FsbElnbm9yZWQKKyAgICAgICAgICAgICAgICBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJNSU1FIiwgbnVsbCwgdGVtcERpciAhPSBudWxsID8gbmV3IEZpbGUodGVtcERpcikgOiBudWxsKS5kZWxldGUoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGlvZSkgeworICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuV0FSTklORywgTG9jYWxpemF0aW9uTWVzc2FnZXMuVEVNUF9GSUxFX0NBTk5PVF9CRV9DUkVBVEVEKHByb3BlcnRpZXMuZ2V0QnVmZmVyVGhyZXNob2xkKCkpLCBpb2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG1pbWVDb25maWc7CisgICAgfQorCisgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZShmaW5hbCBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIE11bHRpUGFydC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWRzIHRoZSBlbnRpcmUgbGlzdCBvZiBib2R5IHBhcnRzIGZyb20gdGhlIElucHV0IHN0cmVhbSwgdXNpbmcgdGhlCisgICAgICogYXBwcm9wcmlhdGUgcHJvdmlkZXIgaW1wbGVtZW50YXRpb24gdG8gZGUtc2VyaWFsaXplIGVhY2ggYm9keSBwYXJ0J3MgZW50aXR5LgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgICAgICAgIHRoZSBjbGFzcyBvZiB0aGUgb2JqZWN0IHRvIGJlIHJlYWQgKGkuZS4ge0BsaW5rIE11bHRpUGFydH0uY2xhc3MpLgorICAgICAqIEBwYXJhbSBnZW5lcmljVHlwZSB0aGUgdHlwZSBvZiBvYmplY3QgdG8gYmUgd3JpdHRlbi4KKyAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbnMgYW5ub3RhdGlvbnMgb24gdGhlIHJlc291cmNlIG1ldGhvZCB0aGF0IHJldHVybmVkIHRoaXMgb2JqZWN0LgorICAgICAqIEBwYXJhbSBtZWRpYVR5cGUgICBtZWRpYSB0eXBlICh7QGNvZGUgbXVsdGlwYXJ0Lyp9KSBvZiB0aGlzIGVudGl0eS4KKyAgICAgKiBAcGFyYW0gaGVhZGVycyAgICAgbXV0YWJsZSBtYXAgb2YgSFRUUCBoZWFkZXJzIGZvciB0aGUgZW50aXJlIHJlc3BvbnNlLgorICAgICAqIEBwYXJhbSBzdHJlYW0gICAgICBvdXRwdXQgc3RyZWFtIHRvIHdoaWNoIHRoZSBlbnRpdHkgc2hvdWxkIGJlIHdyaXR0ZW4uCisgICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uICAgICAgICAgICAgICAgICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzLgorICAgICAqIEB0aHJvd3MgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb24gSWYgYW4gSFRUUCBlcnJvciByZXNwb25zZSBuZWVkcyB0byBiZSBwcm9kdWNlZCAob25seSBlZmZlY3RpdmUgaWYgdGhlIHJlc3BvbnNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBub3QKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1pdHRlZCB5ZXQpIG9yIGlmIHRoZSBDb250ZW50LURpc3Bvc2l0aW9uIGhlYWRlciBvZiBhIHtAY29kZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwYXJ0L2Zvcm0tZGF0YX0gYm9keSBwYXJ0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5ub3QgYmUgcGFyc2VkLgorICAgICAqLworICAgIHB1YmxpYyBNdWx0aVBhcnQgcmVhZEZyb20oZmluYWwgQ2xhc3M8TXVsdGlQYXJ0PiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gcmVhZE11bHRpUGFydCh0eXBlLCBnZW5lcmljVHlwZSwgYW5ub3RhdGlvbnMsIG1lZGlhVHlwZSwgaGVhZGVycywgc3RyZWFtKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgTUlNRVBhcnNpbmdFeGNlcHRpb24gbXBlKSB7CisgICAgICAgICAgICBpZiAobXBlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIHRocm93IChJT0V4Y2VwdGlvbikgbXBlLmdldENhdXNlKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKG1wZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgTXVsdGlQYXJ0IHJlYWRNdWx0aVBhcnQoZmluYWwgQ2xhc3M8TXVsdGlQYXJ0PiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgTUlNRVBhcnNpbmdFeGNlcHRpb24geworICAgICAgICBtZWRpYVR5cGUgPSB1bnF1b3RlTWVkaWFUeXBlUGFyYW1ldGVycyhtZWRpYVR5cGUsICJib3VuZGFyeSIpOworCisgICAgICAgIGZpbmFsIE1JTUVNZXNzYWdlIG1pbWVNZXNzYWdlID0gbmV3IE1JTUVNZXNzYWdlKHN0cmVhbSwKKyAgICAgICAgICAgICAgICBtZWRpYVR5cGUuZ2V0UGFyYW1ldGVycygpLmdldCgiYm91bmRhcnkiKSwKKyAgICAgICAgICAgICAgICBtaW1lQ29uZmlnKTsKKworICAgICAgICBmaW5hbCBib29sZWFuIGZvcm1EYXRhID0gTWVkaWFUeXBlcy50eXBlRXF1YWwobWVkaWFUeXBlLCBNZWRpYVR5cGUuTVVMVElQQVJUX0ZPUk1fREFUQV9UWVBFKTsKKyAgICAgICAgZmluYWwgTXVsdGlQYXJ0IG11bHRpUGFydCA9IGZvcm1EYXRhID8gbmV3IEZvcm1EYXRhTXVsdGlQYXJ0KCkgOiBuZXcgTXVsdGlQYXJ0KCk7CisKKyAgICAgICAgZmluYWwgTWVzc2FnZUJvZHlXb3JrZXJzIHdvcmtlcnMgPSBtZXNzYWdlQm9keVdvcmtlcnMuZ2V0KCk7CisgICAgICAgIG11bHRpUGFydC5zZXRNZXNzYWdlQm9keVdvcmtlcnMod29ya2Vycyk7CisKKyAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IG11bHRpUGFydEhlYWRlcnMgPSBtdWx0aVBhcnQuZ2V0SGVhZGVycygpOworICAgICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZW50cnkgOiBoZWFkZXJzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiB2YWx1ZXMgPSBlbnRyeS5nZXRWYWx1ZSgpOworCisgICAgICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyB2YWx1ZSA6IHZhbHVlcykgeworICAgICAgICAgICAgICAgIG11bHRpUGFydEhlYWRlcnMuYWRkKGVudHJ5LmdldEtleSgpLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBib29sZWFuIGZpbGVOYW1lRml4OworICAgICAgICBpZiAoIWZvcm1EYXRhKSB7CisgICAgICAgICAgICBtdWx0aVBhcnQuc2V0TWVkaWFUeXBlKG1lZGlhVHlwZSk7CisgICAgICAgICAgICBmaWxlTmFtZUZpeCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gc2VlIGlmIHRoZSBVc2VyLUFnZW50IGhlYWRlciBjb3JyZXNwb25kcyB0byBzb21lIHZlcnNpb24gb2YgTVMgSW50ZXJuZXQgRXhwbG9yZXIKKyAgICAgICAgICAgIC8vIGlmIHNvLCBuZWVkIHRvIHNldCBmaWxlTmFtZUZpeCB0byB0cnVlIHRvIGhhbmRsZSBpc3N1ZSBodHRwOi8vamF2YS5uZXQvamlyYS9icm93c2UvSkVSU0VZLTc1OQorICAgICAgICAgICAgZmluYWwgU3RyaW5nIHVzZXJBZ2VudCA9IGhlYWRlcnMuZ2V0Rmlyc3QoSHR0cEhlYWRlcnMuVVNFUl9BR0VOVCk7CisgICAgICAgICAgICBmaWxlTmFtZUZpeCA9IHVzZXJBZ2VudCAhPSBudWxsICYmIHVzZXJBZ2VudC5jb250YWlucygiIE1TSUUgIik7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGZpbmFsIE1JTUVQYXJ0IG1pbWVQYXJ0IDogZ2V0TWltZVBhcnRzKG1pbWVNZXNzYWdlKSkgeworICAgICAgICAgICAgZmluYWwgQm9keVBhcnQgYm9keVBhcnQgPSBmb3JtRGF0YSA/IG5ldyBGb3JtRGF0YUJvZHlQYXJ0KGZpbGVOYW1lRml4KSA6IG5ldyBCb2R5UGFydCgpOworCisgICAgICAgICAgICAvLyBDb25maWd1cmUgcHJvdmlkZXJzLgorICAgICAgICAgICAgYm9keVBhcnQuc2V0TWVzc2FnZUJvZHlXb3JrZXJzKHdvcmtlcnMpOworCisgICAgICAgICAgICAvLyBDb3B5IGhlYWRlcnMuCisgICAgICAgICAgICBmb3IgKGZpbmFsIEhlYWRlciBoZWFkZXIgOiBtaW1lUGFydC5nZXRBbGxIZWFkZXJzKCkpIHsKKyAgICAgICAgICAgICAgICBib2R5UGFydC5nZXRIZWFkZXJzKCkuYWRkKGhlYWRlci5nZXROYW1lKCksIGhlYWRlci5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY29udGVudFR5cGUgPSBib2R5UGFydC5nZXRIZWFkZXJzKCkuZ2V0Rmlyc3QoIkNvbnRlbnQtVHlwZSIpOworICAgICAgICAgICAgICAgIGlmIChjb250ZW50VHlwZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIGJvZHlQYXJ0LnNldE1lZGlhVHlwZShNZWRpYVR5cGUudmFsdWVPZihjb250ZW50VHlwZSkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJvZHlQYXJ0LmdldENvbnRlbnREaXNwb3NpdGlvbigpOworICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oZXgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDb3B5IGRhdGEgaW50byBhIEJvZHlQYXJ0RW50aXR5IHN0cnVjdHVyZS4KKyAgICAgICAgICAgIGJvZHlQYXJ0LnNldEVudGl0eShuZXcgQm9keVBhcnRFbnRpdHkobWltZVBhcnQpKTsKKworICAgICAgICAgICAgLy8gQWRkIHRoaXMgQm9keVBhcnQgdG8gb3VyIE11bHRpUGFydC4KKyAgICAgICAgICAgIG11bHRpUGFydC5nZXRCb2R5UGFydHMoKS5hZGQoYm9keVBhcnQpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG11bHRpUGFydDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBsaXN0IG9mIG1pbWUgcGFydCBhdHRhY2htZW50cyBmcm9tIGdpdmVuIG1pbWUgbWVzc2FnZS4gSWYgYW4gZXhjZXB0aW9uIG9jY3VycyBkdXJpbmcgcGFyc2luZyB0aGUgbWVzc2FnZSB0aGUgcGFyc2VkCisgICAgICogbWltZSBwYXJ0cyBhcmUgY2xvc2VkIChhbnkgdGVtcG9yYXJ5IGZpbGVzIGFyZSBkZWxldGVkKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIG1pbWUgbWVzc2FnZSB0byBnZXQgbWltZSBwYXJ0cyBmcm9tLgorICAgICAqIEByZXR1cm4gbGlzdCBvZiBtaW1lIHBhcnQgYXR0YWNobWVudHMuCisgICAgICovCisgICAgcHJpdmF0ZSBMaXN0PE1JTUVQYXJ0PiBnZXRNaW1lUGFydHMoZmluYWwgTUlNRU1lc3NhZ2UgbWVzc2FnZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2UuZ2V0QXR0YWNobWVudHMoKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgTUlNRVBhcnNpbmdFeGNlcHRpb24gb2J0YWluUGFydHNFcnJvcikgeworICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5GSU5FLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5QQVJTSU5HX0VSUk9SKCksIG9idGFpblBhcnRzRXJyb3IpOworCisgICAgICAgICAgICBtZXNzYWdlLmNsb3NlKCk7CisKKyAgICAgICAgICAgIC8vIFJlLXRocm93IHRoZSBleGNlcHRpb24uCisgICAgICAgICAgICB0aHJvdyBvYnRhaW5QYXJ0c0Vycm9yOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTWVkaWFUeXBlIHVucXVvdGVNZWRpYVR5cGVQYXJhbWV0ZXJzKGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUsIGZpbmFsIFN0cmluZy4uLiBwYXJhbWV0ZXJzKSB7CisgICAgICAgIGlmIChwYXJhbWV0ZXJzID09IG51bGwgfHwgcGFyYW1ldGVycy5sZW5ndGggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIG1lZGlhVHlwZTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gdW5xdW90ZWRQYXJhbXMgPSBuZXcgSGFzaE1hcDw+KG1lZGlhVHlwZS5nZXRQYXJhbWV0ZXJzKCkpOworICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBwYXJhbWV0ZXIgOiBwYXJhbWV0ZXJzKSB7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBtZWRpYVR5cGUuZ2V0UGFyYW1ldGVycygpLmdldChwYXJhbWV0ZXIpOworCisgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZS5zdGFydHNXaXRoKCJcIiIpKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMSwgdmFsdWUubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgICAgICAgICB1bnF1b3RlZFBhcmFtcy5wdXQocGFyYW1ldGVyLCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3IE1lZGlhVHlwZShtZWRpYVR5cGUuZ2V0VHlwZSgpLCBtZWRpYVR5cGUuZ2V0U3VidHlwZSgpLCB1bnF1b3RlZFBhcmFtcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbXVsdGlwYXJ0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvbXVsdGlwYXJ0L2ludGVybmFsL011bHRpUGFydFJlYWRlclNlcnZlclNpZGUuamF2YSBiL21lZGlhL211bHRpcGFydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9pbnRlcm5hbC9NdWx0aVBhcnRSZWFkZXJTZXJ2ZXJTaWRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdjOTYyMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL211bHRpcGFydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9pbnRlcm5hbC9NdWx0aVBhcnRSZWFkZXJTZXJ2ZXJTaWRlLmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3RyYWluZWRUbzsKK2ltcG9ydCBqYXZheC53cy5ycy5SdW50aW1lVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyczsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuTXVsdGlQYXJ0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5DbG9zZWFibGVTZXJ2aWNlOworCitpbXBvcnQgb3JnLmp2bmV0Lm1pbWVwdWxsLk1JTUVQYXJzaW5nRXhjZXB0aW9uOworCisvKioKKyAqIHtAbGluayBNZXNzYWdlQm9keVJlYWRlcn0gaW1wbGVtZW50YXRpb24gZm9yIHtAbGluayBNdWx0aVBhcnR9IGVudGl0aWVzLgorICoKKyAqIEBhdXRob3IgQ3JhaWcgTWNDbGFuYWhhbgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BTaW5nbGV0b24KK0BDb25zdHJhaW5lZFRvKFJ1bnRpbWVUeXBlLlNFUlZFUikKK3B1YmxpYyBjbGFzcyBNdWx0aVBhcnRSZWFkZXJTZXJ2ZXJTaWRlIGV4dGVuZHMgTXVsdGlQYXJ0UmVhZGVyQ2xpZW50U2lkZSB7CisKKyAgICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPENsb3NlYWJsZVNlcnZpY2U+IGNsb3NlYWJsZVNlcnZpY2VQcm92aWRlcjsKKworICAgIEBJbmplY3QKKyAgICBwdWJsaWMgTXVsdGlQYXJ0UmVhZGVyU2VydmVyU2lkZShAQ29udGV4dCBmaW5hbCBQcm92aWRlcnMgcHJvdmlkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFByb3ZpZGVyPENsb3NlYWJsZVNlcnZpY2U+IGNsb3NlYWJsZVNlcnZpY2VQcm92aWRlcikgeworICAgICAgICBzdXBlcihwcm92aWRlcnMpOworICAgICAgICB0aGlzLmNsb3NlYWJsZVNlcnZpY2VQcm92aWRlciA9IGNsb3NlYWJsZVNlcnZpY2VQcm92aWRlcjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgTXVsdGlQYXJ0IHJlYWRNdWx0aVBhcnQoZmluYWwgQ2xhc3M8TXVsdGlQYXJ0PiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBzdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgTUlNRVBhcnNpbmdFeGNlcHRpb24geworICAgICAgICBmaW5hbCBNdWx0aVBhcnQgbXVsdGlQYXJ0ID0gc3VwZXIucmVhZE11bHRpUGFydCh0eXBlLCBnZW5lcmljVHlwZSwgYW5ub3RhdGlvbnMsIG1lZGlhVHlwZSwgaGVhZGVycywgc3RyZWFtKTsKKyAgICAgICAgY2xvc2VhYmxlU2VydmljZVByb3ZpZGVyLmdldCgpLmFkZChtdWx0aVBhcnQpOworICAgICAgICByZXR1cm4gbXVsdGlQYXJ0OworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbXVsdGlwYXJ0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvbXVsdGlwYXJ0L2ludGVybmFsL011bHRpUGFydFdyaXRlci5qYXZhIGIvbWVkaWEvbXVsdGlwYXJ0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvbXVsdGlwYXJ0L2ludGVybmFsL011bHRpUGFydFdyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYjdiMmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdWx0aXBhcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9tdWx0aXBhcnQvaW50ZXJuYWwvTXVsdGlQYXJ0V3JpdGVyLmphdmEKQEAgLTAsMCArMSwyMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyczsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuQm9keVBhcnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LkJvZHlQYXJ0RW50aXR5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5Cb3VuZGFyeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuTXVsdGlQYXJ0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuTWVzc2FnZVV0aWxzOworCisvKioKKyAqIHtAbGluayBQcm92aWRlcn0ge0BsaW5rIE1lc3NhZ2VCb2R5V3JpdGVyfSBpbXBsZW1lbnRhdGlvbiBmb3Ige0BsaW5rIE11bHRpUGFydH0gZW50aXRpZXMuCisgKgorICogQGF1dGhvciBDcmFpZyBNY0NsYW5haGFuCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFNpbmdsZXRvbgorQFByb2R1Y2VzKCJtdWx0aXBhcnQvKiIpCitwdWJsaWMgY2xhc3MgTXVsdGlQYXJ0V3JpdGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8TXVsdGlQYXJ0PiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uW10gRU1QVFlfQU5OT1RBVElPTlMgPSBuZXcgQW5ub3RhdGlvblswXTsKKworICAgIC8qKgorICAgICAqIEluamVjdGFibGUgaGVscGVyIHRvIGxvb2sgdXAgYXBwcm9wcmlhdGUge0BsaW5rIFByb3ZpZGVyfXMKKyAgICAgKiBmb3Igb3VyIGJvZHkgcGFydHMuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcnMgcHJvdmlkZXJzOworCisgICAgcHVibGljIE11bHRpUGFydFdyaXRlcihAQ29udGV4dCBmaW5hbCBQcm92aWRlcnMgcHJvdmlkZXJzKSB7CisgICAgICAgIHRoaXMucHJvdmlkZXJzID0gcHJvdmlkZXJzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGdldFNpemUoZmluYWwgTXVsdGlQYXJ0IGVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoZmluYWwgQ2xhc3M8Pz4gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiBNdWx0aVBhcnQuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0eXBlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZSB0aGUgZW50aXJlIGxpc3Qgb2YgYm9keSBwYXJ0cyB0byB0aGUgb3V0cHV0IHN0cmVhbSwgdXNpbmcgdGhlCisgICAgICogYXBwcm9wcmlhdGUgcHJvdmlkZXIgaW1wbGVtZW50YXRpb24gdG8gc2VyaWFsaXplIGVhY2ggYm9keSBwYXJ0J3MgZW50aXR5LgorICAgICAqCisgICAgICogQHBhcmFtIGVudGl0eSAgICAgIHRoZSB7QGxpbmsgTXVsdGlQYXJ0fSBpbnN0YW5jZSB0byB3cml0ZS4KKyAgICAgKiBAcGFyYW0gdHlwZSAgICAgICAgdGhlIGNsYXNzIG9mIHRoZSBvYmplY3QgdG8gYmUgd3JpdHRlbiAoaS5lLiB7QGxpbmsgTXVsdGlQYXJ0fS5jbGFzcykuCisgICAgICogQHBhcmFtIGdlbmVyaWNUeXBlIHRoZSB0eXBlIG9mIG9iamVjdCB0byBiZSB3cml0dGVuLgorICAgICAqIEBwYXJhbSBhbm5vdGF0aW9ucyBhbm5vdGF0aW9ucyBvbiB0aGUgcmVzb3VyY2UgbWV0aG9kIHRoYXQgcmV0dXJuZWQgdGhpcyBvYmplY3QuCisgICAgICogQHBhcmFtIG1lZGlhVHlwZSAgIG1lZGlhIHR5cGUgKHtAY29kZSBtdWx0aXBhcnQvKn0pIG9mIHRoaXMgZW50aXR5LgorICAgICAqIEBwYXJhbSBoZWFkZXJzICAgICBtdXRhYmxlIG1hcCBvZiBIVFRQIGhlYWRlcnMgZm9yIHRoZSBlbnRpcmUgcmVzcG9uc2UuCisgICAgICogQHBhcmFtIHN0cmVhbSAgICAgIG91dHB1dCBzdHJlYW0gdG8gd2hpY2ggdGhlIGVudGl0eSBzaG91bGQgYmUgd3JpdHRlbi4KKyAgICAgKiBAdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gaWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKiBAdGhyb3dzIGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGFuIEhUVFAgZXJyb3IgcmVzcG9uc2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZHMgdG8gYmUgcHJvZHVjZWQgKG9ubHkgZWZmZWN0aXZlIGlmIHRoZSByZXNwb25zZSBpcyBub3QgY29tbWl0dGVkIHlldCkuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGVUbyhmaW5hbCBNdWx0aVBhcnQgZW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBWZXJpZnkgdGhhdCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgYm9keSBwYXJ0LgorICAgICAgICBpZiAoKGVudGl0eS5nZXRCb2R5UGFydHMoKSA9PSBudWxsKSB8fCAoZW50aXR5LmdldEJvZHlQYXJ0cygpLnNpemUoKSA8IDEpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLk1VU1RfU1BFQ0lGWV9CT0RZX1BBUlQoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiBvdXIgZW50aXR5IGlzIG5vdCBuZXN0ZWQsIG1ha2Ugc3VyZSB0aGUgTUlNRS1WZXJzaW9uIGhlYWRlciBpcyBzZXQuCisgICAgICAgIGlmIChlbnRpdHkuZ2V0UGFyZW50KCkgPT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlID0gaGVhZGVycy5nZXRGaXJzdCgiTUlNRS1WZXJzaW9uIik7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGhlYWRlcnMucHV0U2luZ2xlKCJNSU1FLVZlcnNpb24iLCAiMS4wIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBJbml0aWFsaXplIGxvY2FsIHZhcmlhYmxlcyB3ZSBuZWVkLgorICAgICAgICBmaW5hbCBXcml0ZXIgd3JpdGVyID0gbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoc3RyZWFtLCBNZXNzYWdlVXRpbHMuZ2V0Q2hhcnNldChtZWRpYVR5cGUpKSk7CisKKyAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBib3VuZGFyeSBzdHJpbmcgdG8gYmUgdXNlZCwgY3JlYXRpbmcgb25lIGlmIG5lZWRlZC4KKyAgICAgICAgZmluYWwgTWVkaWFUeXBlIGJvdW5kYXJ5TWVkaWFUeXBlID0gQm91bmRhcnkuYWRkQm91bmRhcnkobWVkaWFUeXBlKTsKKyAgICAgICAgaWYgKGJvdW5kYXJ5TWVkaWFUeXBlICE9IG1lZGlhVHlwZSkgeworICAgICAgICAgICAgaGVhZGVycy5wdXRTaW5nbGUoSHR0cEhlYWRlcnMuQ09OVEVOVF9UWVBFLCBib3VuZGFyeU1lZGlhVHlwZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFN0cmluZyBib3VuZGFyeVN0cmluZyA9IGJvdW5kYXJ5TWVkaWFUeXBlLmdldFBhcmFtZXRlcnMoKS5nZXQoImJvdW5kYXJ5Iik7CisKKyAgICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBib2R5IHBhcnRzIGZvciB0aGlzIG1lc3NhZ2UuCisgICAgICAgIGJvb2xlYW4gaXNGaXJzdCA9IHRydWU7CisgICAgICAgIGZvciAoZmluYWwgQm9keVBhcnQgYm9keVBhcnQgOiBlbnRpdHkuZ2V0Qm9keVBhcnRzKCkpIHsKKworICAgICAgICAgICAgLy8gV3JpdGUgdGhlIGxlYWRpbmcgYm91bmRhcnkgc3RyaW5nCisgICAgICAgICAgICBpZiAoaXNGaXJzdCkgeworICAgICAgICAgICAgICAgIGlzRmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoIi0tIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiXHJcbi0tIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoYm91bmRhcnlTdHJpbmcpOworICAgICAgICAgICAgd3JpdGVyLndyaXRlKCJcclxuIik7CisKKyAgICAgICAgICAgIC8vIFdyaXRlIHRoZSBoZWFkZXJzIGZvciB0aGlzIGJvZHkgcGFydAorICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIGJvZHlNZWRpYVR5cGUgPSBib2R5UGFydC5nZXRNZWRpYVR5cGUoKTsKKyAgICAgICAgICAgIGlmIChib2R5TWVkaWFUeXBlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLk1JU1NJTkdfTUVESUFfVFlQRV9PRl9CT0RZX1BBUlQoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBib2R5SGVhZGVycyA9IGJvZHlQYXJ0LmdldEhlYWRlcnMoKTsKKyAgICAgICAgICAgIGJvZHlIZWFkZXJzLnB1dFNpbmdsZSgiQ29udGVudC1UeXBlIiwgYm9keU1lZGlhVHlwZS50b1N0cmluZygpKTsKKworICAgICAgICAgICAgaWYgKGJvZHlIZWFkZXJzLmdldEZpcnN0KCJDb250ZW50LURpc3Bvc2l0aW9uIikgPT0gbnVsbCAmJiBib2R5UGFydC5nZXRDb250ZW50RGlzcG9zaXRpb24oKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgYm9keUhlYWRlcnMucHV0U2luZ2xlKCJDb250ZW50LURpc3Bvc2l0aW9uIiwgYm9keVBhcnQuZ2V0Q29udGVudERpc3Bvc2l0aW9uKCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEl0ZXJhdGUgZm9yIHRoZSBuZXN0ZWQgYm9keSBwYXJ0cworICAgICAgICAgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGVudHJ5IDogYm9keUhlYWRlcnMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgIC8vIFdyaXRlIHRoaXMgaGVhZGVyIGFuZCBpdHMgdmFsdWUocykKKyAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUoZW50cnkuZ2V0S2V5KCkpOworICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgnOicpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOworICAgICAgICAgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIHZhbHVlIDogZW50cnkuZ2V0VmFsdWUoKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgnICcpOworICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgnLCcpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSh2YWx1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdyaXRlci53cml0ZSgiXHJcbiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBNYXJrIHRoZSBlbmQgb2YgdGhlIGhlYWRlcnMgZm9yIHRoaXMgYm9keSBwYXJ0CisgICAgICAgICAgICB3cml0ZXIud3JpdGUoIlxyXG4iKTsKKyAgICAgICAgICAgIHdyaXRlci5mbHVzaCgpOworCisgICAgICAgICAgICAvLyBXcml0ZSB0aGUgZW50aXR5IGZvciB0aGlzIGJvZHkgcGFydAorICAgICAgICAgICAgT2JqZWN0IGJvZHlFbnRpdHkgPSBib2R5UGFydC5nZXRFbnRpdHkoKTsKKyAgICAgICAgICAgIGlmIChib2R5RW50aXR5ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLk1JU1NJTkdfRU5USVRZX09GX0JPRFlfUEFSVChib2R5TWVkaWFUeXBlKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIENsYXNzIGJvZHlDbGFzcyA9IGJvZHlFbnRpdHkuZ2V0Q2xhc3MoKTsKKyAgICAgICAgICAgIGlmIChib2R5RW50aXR5IGluc3RhbmNlb2YgQm9keVBhcnRFbnRpdHkpIHsKKyAgICAgICAgICAgICAgICBib2R5Q2xhc3MgPSBJbnB1dFN0cmVhbS5jbGFzczsKKyAgICAgICAgICAgICAgICBib2R5RW50aXR5ID0gKChCb2R5UGFydEVudGl0eSkgYm9keUVudGl0eSkuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgTWVzc2FnZUJvZHlXcml0ZXIgYm9keVdyaXRlciA9IHByb3ZpZGVycy5nZXRNZXNzYWdlQm9keVdyaXRlcigKKyAgICAgICAgICAgICAgICAgICAgYm9keUNsYXNzLAorICAgICAgICAgICAgICAgICAgICBib2R5Q2xhc3MsCisgICAgICAgICAgICAgICAgICAgIEVNUFRZX0FOTk9UQVRJT05TLAorICAgICAgICAgICAgICAgICAgICBib2R5TWVkaWFUeXBlKTsKKworICAgICAgICAgICAgaWYgKGJvZHlXcml0ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuTk9fQVZBSUxBQkxFX01CVyhib2R5Q2xhc3MsIG1lZGlhVHlwZSkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib2R5V3JpdGVyLndyaXRlVG8oCisgICAgICAgICAgICAgICAgICAgIGJvZHlFbnRpdHksCisgICAgICAgICAgICAgICAgICAgIGJvZHlDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgYm9keUNsYXNzLAorICAgICAgICAgICAgICAgICAgICBFTVBUWV9BTk5PVEFUSU9OUywKKyAgICAgICAgICAgICAgICAgICAgYm9keU1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgYm9keUhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgIHN0cmVhbQorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdyaXRlIHRoZSBmaW5hbCBib3VuZGFyeSBzdHJpbmcKKyAgICAgICAgd3JpdGVyLndyaXRlKCJcclxuLS0iKTsKKyAgICAgICAgd3JpdGVyLndyaXRlKGJvdW5kYXJ5U3RyaW5nKTsKKyAgICAgICAgd3JpdGVyLndyaXRlKCItLVxyXG4iKTsKKyAgICAgICAgd3JpdGVyLmZsdXNoKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9tZWRpYS9tdWx0aXBhcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9tdWx0aXBhcnQvaW50ZXJuYWwvcGFja2FnZS1pbmZvLmphdmEgYi9tZWRpYS9tdWx0aXBhcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9tdWx0aXBhcnQvaW50ZXJuYWwvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFkNmNjMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL211bHRpcGFydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9pbnRlcm5hbC9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvKioKKyAqIEplcnNleSBtdWx0aXBhcnQgbWVkaWEgc3VwcG9ydCBpbnRlcm5hbCBjbGFzc2VzLgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5pbnRlcm5hbDsKZGlmZiAtLWdpdCBhL21lZGlhL211bHRpcGFydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9wYWNrYWdlLWluZm8uamF2YSBiL21lZGlhL211bHRpcGFydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2YzY2M0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXVsdGlwYXJ0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvbXVsdGlwYXJ0L3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKKy8qKgorICogPGgzPkpBWC1SUyBJbnRlZ3JhdGlvbiB3aXRoIE1JTUUgTXVsdGlQYXJ0IE1lc3NhZ2UgRm9ybWF0czwvaDM+CisgKgorICogPHA+VGhlIGNsYXNzZXMgaW4gdGhpcyBwYWNrYWdlIHByb3ZpZGUgZm9yIGludGVncmF0aW9uIG9mCisgKiA8Y29kZT5tdWx0aXBhcnQvKjwvY29kZT4gcmVxdWVzdAorICogYW5kIHJlc3BvbnNlIGJvZGllcyBpbiBhIEpBWC1SUyBydW50aW1lIGVudmlyb25tZW50LiAgVGhlIHNldCBvZiByZWdpc3RlcmVkCisgKiBwcm92aWRlcnMgaXMgbGV2ZXJhZ2VkLCBpbiB0aGF0IHRoZSBjb250ZW50IHR5cGUgZm9yIGEgYm9keSBwYXJ0IG9mIHN1Y2ggYQorICogbWVzc2FnZSByZXVzZXMgdGhlIHNhbWUgTWVzc2FnZUJvZHlSZWFkZXIvTWVzc2FnZUJvZHlXcml0ZXIgaW1wbGVtZW50YXRpb25zCisgKiBhcyB3b3VsZCBiZSB1c2VkIGZvciB0aGF0IGNvbnRlbnQgdHlwZSBhcyBhIHN0YW5kYWxvbmUgZW50aXR5LjwvcD4KKyAqCisgKiA8cD5Gb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgc3ludGF4IGFuZCBzZW1hbnRpY3Mgb2YgTUlNRSBtdWx0aXBhcnQgc3RyZWFtcywKKyAqIHNlZSB0aGUgZm9sbG93aW5nIFJGQ3M6PC9wPgorICogPHVsPgorICogPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzIwNDUudHh0Ij5NdWx0aXB1cnBvc2UgSW50ZXJuZXQgTWFpbAorICogICAgIEV4dGVuc2lvbnMgKE1JTUUpIFBhcnQgT25lOiAgRm9ybWF0IG9mIEludGVybmV0IE1lc3NhZ2UgQm9kaWVzPC9hPgorICogICAgIChSRkMgMjA0NSk8L2xpPgorICogPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzIwNDYudHh0Ij5NdWx0aXB1cnBvc2UgSW50ZXJuZXQgTWFpbAorICogICAgIEV4dGVuc2lvbnMgKE1JTUUpIFBhcnQgVHdvOiAgTWVkaWEgVHlwZXM8L2E+IChSRkMgMjA0Nik8L2xpPgorICogPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzIwNDcudHh0Ij5NdWx0aXB1cnBvc2UgSW50ZXJuZXQgTWFpbAorICogICAgIEV4dGVuc2lvbnMgKE1JTUUpIFBhcnQgVGhyZWU6ICBNZXNzYWdlIEhlYWRlciBFeHRlbnNpb25zIGZvciBOb24tQVNDSUkKKyAqICAgICBUZXh0PC9hPiAoUkZDIDIwNDcpPC9saT4KKyAqIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LmlldGYub3JnL3JmYy9yZmMyMDQ4LnR4dCI+TXVsdGlwdXJwb3NlIEludGVybmV0IE1haWwKKyAqICAgICBFeHRlbnNpb25zIChNSU1FKSBQYXJ0IEZvdXI6ICBSZWdpc3RyYXRpb24gUHJvY2VkdXJlczwvYT4gKFJGQyAyMDQ4KTwvbGk+CisgKiA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMjA0OC50eHQiPk11bHRpcHVycG9zZSBJbnRlcm5ldCBNYWlsCisgKiAgICAgRXh0ZW5zaW9ucyAoTUlNRSkgUGFydCBGaXZlOiAgQ29uZm9ybWFuY2UgQ3JpdGVyaWEgYW5kIEV4YW1wbGVzPC9hPgorICogICAgIChSRkMgMjA0OSk8L2xpPgorICogPC91bD4KKyAqCisgKiA8aDQ+SW1wbGVtZW50YXRpb24gTm90ZXM8L2g0PgorICoKKyAqIDxwPlRoZSBmb2xsb3dpbmcgbm90ZXMgZGVzY3JpYmUgc2lnbmlmaWNhbnQgYXNwZWN0cyBvZiB0aGUgaW1wbGVtZW50YXRpb24KKyAqIG9mIHRoZSBNSU1FIE11bHRpUGFydCBBUElzIGluIHRoaXMgKGFuZCByZWxhdGVkKSBwYWNrYWdlczo8L3A+CisgKiA8dWw+CisgKiA8bGk+QWx0aG91Z2ggcGFja2FnZWQgYXMgYSBKZXJzZXkgZXh0ZW5zaW9uLCB0aGUgcnVudGltZSBjb2RlIGluIHRoaXMKKyAqICAgICBsaWJyYXJ5IHNob3VsZCBiZSBwb3J0YWJsZSB0byBhbnkgY29tcGxpYW50IEpBWC1SUyBpbXBsZW1lbnRhdGlvbi4KKyAqICAgICBKZXJzZXkgaXMgb25seSByZXF1aXJlZCBmb3IgZXhlY3V0aW9uIG9mIHRoZSB1bml0IHRlc3RzLjwvbGk+CisgKiA8L3VsPgorICoKKyAqIDxoND5TdXBwb3J0ZWQgTUlNRSBNdWx0aXBhcnQgQ2FwYWJpbGl0aWVzPC9oND4KKyAqCisgKiA8cD5UaGUgZm9sbG93aW5nIGxpc3Qgb2YgZ2VuZXJhbCBNSU1FIE11bHRpUGFydCBmZWF0dXJlcyBpcyBjdXJyZW50bHkKKyAqIHN1cHBvcnRlZDo8L3A+CisgKiA8dWw+CisgKiA8bGk+VGhlIDxjb2RlPk1JTUUtVmVyc2lvbjogMS4wPC9jb2RlPiBIVFRQIGhlYWRlciBpcyBpbmNsdWRlZCBvbiBnZW5lcmF0ZWQKKyAqICAgICByZXNwb25zZXMuICBJdCBpcyBhY2NlcHRlZCwgYnV0IG5vdCByZXF1aXJlZCwgb24gcHJvY2Vzc2VkIHJlcXVlc3RzLjwvbGk+CisgKiA8bGk+QSA8Y29kZT5NZXNzYWdlQm9keVJlYWRlcjwvY29kZT4gaW1wbGVtZW50YXRpb24gZm9yIGNvbnN1bWluZyBNSU1FCisgKiAgICAgTXVsdGlQYXJ0IGVudGl0aWVzLiAgU2VlIGJlbG93IGZvciB1c2FnZSByZXN0cmljdGlvbnMuPC9saT4KKyAqIDxsaT5BIDxjb2RlPk1lc3NhZ2VCb2R5V3JpdGVyPC9jb2RlPiBpbXBsZW1lbnRhdGlvbiBmb3IgcHJvZHVjaW5nIE1JTUUKKyAqICAgICBNdWx0aVBhcnQgZW50aXRpZXMuICBUaGUgYXBwcm9wcmlhdGUgPGNvZGU+UHJvdmlkZXI8L2NvZGU+IGlzIHVzZWQgdG8KKyAqICAgICBzZXJpYWxpemUgZWFjaCBib2R5IHBhcnQsIGJhc2VkIG9uIGl0cyBtZWRpYSB0eXBlLjwvbGk+CisgKiA8bGk+T3B0aW9uYWwgY3JlYXRpb24gb2YgYW4gYXBwcm9wcmlhdGUgPGNvZGU+Ym91bmRhcnk8L2NvZGU+IHBhcmFtZXRlciBvbiBhCisgKiAgICAgZ2VuZXJhdGVkIDxjb2RlPkNvbnRlbnQtVHlwZTwvY29kZT4gaGVhZGVyLCBpZiBub3QgYWxyZWFkeSBwcmVzZW50LjwvbGk+CisgKiA8bGk+VG9wIGxldmVsIGNvbnRlbnQgdHlwZSBvZiA8Y29kZT5tdWx0aXBhcnQ8L2NvZGU+LCB3aXRoIHRoZSBmb2xsb3dpbmcKKyAqICAgICBzdXBwb3J0ZWQgc3VidHlwZXM6ICA8Y29kZT5hbHRlcm5hdGl2ZTwvY29kZT4sIDxjb2RlPmRpZ2VzdDwvY29kZT4sCisgKiAgICAgPGNvZGU+bWl4ZWQ8L2NvZGU+LCBhbmQgPGNvZGU+cGFyYWxsZWw8L2NvZGU+LjwvbGk+CisgKiA8L3VsPgorICoKKyAqIDxwPkF0IHByZXNlbnQsIHRoZSA8Y29kZT5NZXNzYWdlQm9keVJlYWRlcjwvY29kZT4gaW1wbGVtZW50YXRpb24gZXhoaWJpdHMgYQorICogdXNhYmlsaXR5IGlzc3VlLiAgSXQgaXMgbm90IGN1cnJlbnRseSBwb3NzaWJsZSB0byBrbm93IGFoZWFkIG9mIHRpbWUgd2hhdAorICogSmF2YSBjbGFzcyB0aGUgYXBwbGljYXRpb24gd291bGQgcHJlZmVyIHRvIHVzZSBmb3IgZWFjaCBpbmRpdmlkdWFsIGJvZHkgcGFydCwKKyAqIHNvIGFuIGFwcHJvcHJpYXRlIDxjb2RlPlByb3ZpZGVyPC9jb2RlPiBjYW5ub3QgYmUgc2VsZWN0ZWQuICBDdXJyZW50bHksIHRoZQorICogdW5wYXJzZWQgY29udGVudCBvZiBlYWNoIGJvZHkgcGFydCBpcyByZXR1cm5lZCAoYXMgYSBieXRlIGFycmF5KSBpbiB0aGUKKyAqIDxjb2RlPmVudGl0eTwvY29kZT4gcHJvcGVydHkgb2YgdGhlIHJldHVybmVkIDxjb2RlPkJvZHlQYXJ0fTwvY29kZT4gaW5zdGFuY2UsIGFuZAorICogdGhlIGFwcGxpY2F0aW9uIGNhbiBkZWNpZGUgd2hhdCBmdXJ0aGVyIHN0ZXBzIGFyZSBuZWVkZWQgYmFzZWQgb24gdGhlCisgKiBoZWFkZXJzIGluY2x1ZGVkIGluIHRoYXQgYm9keSBwYXJ0LiAgVGhlIHNpbXBsZXN0IHRlY2huaXF1ZSBpcyB0byBleGFtaW5lCisgKiB0aGUgcmVjZWl2ZWQgPGNvZGU+Qm9keVBhcnQ8L2NvZGU+LCBhbmQgdGhlbiBjYWxsIHRoZSA8Y29kZT5nZXRFbnRpdHlBcygpPC9jb2RlPgorICogbWV0aG9kIG9uY2UgeW91IGtub3cgd2hpY2ggaW1wbGVtZW50YXRpb24gY2xhc3MgeW91IHdvdWxkIHByZWZlci48L3A+CisgKgorICogPGg0Pk5vdCAoWWV0KSBTdXBwb3J0ZWQgTUlNRSBNdWx0aXBhcnQgQ2FwYWJpbGl0aWVzPC9oND4KKyAqCisgKiA8cD5UaGUgZm9sbG93aW5nIGxpc3Qgb2YgZ2VuZXJhbCBNSU1FIE11bHRpUGFydCBmZWF0dXJlcyBpcyBOT1QgKHlldCwgaW4KKyAqIG1vc3QgY2FzZXMpIHN1cHBvcnRlZDo8L3A+CisgKiA8dWw+CisgKiA8bGk+VGhlIDxjb2RlPmNoYXJzZXQ8L2NvZGU+IHBhcmFtZXRlciBvbiB0aGUgPGNvZGU+Q29udGVudC1UeXBlPC9jb2RlPiBoZWFkZXIKKyAqICAgICBmaWVsZC4gIEN1cnJlbnRseSwgdGhlIGhhcmQgY29kZWQgY2hhcnNldCBpcyBGSVhNRS4gIFtSRkMyMDQ1IzUuMl08L2xpPgorICogPGxpPlRoZSA8Y29kZT5Db250ZW50LVRyYW5zZmVyLUVuY29kaW5nPC9jb2RlPiBoZWFkZXIgZmllbGQuICBbUkZDMjA0NSM2XTwvbGk+CisgKiA8bGk+VGhlIDxjb2RlPm1lc3NhZ2UvKjwvY29kZT4gZmFtaWx5IG9mIGNvbnRlbnQgdHlwZXMuPC9saT4KKyAqIDwvdWw+CisgKi8KK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbXVsdGlwYXJ0L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9tdWx0aXBhcnQvaW50ZXJuYWwvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMgYi9tZWRpYS9tdWx0aXBhcnQvc3JjL21haW4vcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9pbnRlcm5hbC9sb2NhbGl6YXRpb24ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTFjMDI2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXVsdGlwYXJ0L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9tdWx0aXBhcnQvaW50ZXJuYWwvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMKQEAgLTAsMCArMSwzMiBAQAorIworIyBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisjIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyMKKyMgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorIyBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisjIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorIyB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisjCisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorIworCitjYW5ub3QuaW5qZWN0LmZpbGU9Q2Fubm90IHByb3ZpZGUgZmlsZSBmb3IgYW4gZW50aXR5IGJvZHkgcGFydC4KK2VudGl0eS5oYXMud3JvbmcudHlwZT1FbnRpdHkgaW5zdGFuY2UgZG9lcyBub3QgY29udGFpbiB0aGUgdW5jb252ZXJ0ZWQgY29udGVudC4KK2Vycm9yLnBhcnNpbmcuY29udGVudC5kaXNwb3NpdGlvbj1FcnJvciBwYXJzaW5nIGNvbnRlbnQgZGlzcG9zaXRpb246IHswfQorZXJyb3IucmVhZGluZy5lbnRpdHk9RXJyb3IgcmVhZGluZyBlbnRpdHkgYXMgezB9LgorZm9ybS5kYXRhLm11bHRpcGFydC5jYW5ub3QuY2hhbmdlLm1lZGlhdHlwZT1DYW5ub3QgY2hhbmdlIG1lZGlhIHR5cGUgb2YgYSBGb3JtRGF0YU11bHRpUGFydCBpbnN0YW5jZS4KK2NvbnRyb2wubmFtZS5jYW5ub3QuYmUubnVsbD1Db250cm9scyBuYW1lIGNhbiBub3QgYmUgbnVsbC4KK21lZGlhLnR5cGUubm90LnRleHQucGxhaW49TWVkaWEgdHlwZSBpcyBub3QgdGV4dC9wbGFpbi4KK211c3Quc3BlY2lmeS5ib2R5LnBhcnQ9TXVzdCBzcGVjaWZ5IGF0IGxlYXN0IG9uZSBib2R5IHBhcnQuCittaXNzaW5nLm1lZGlhLnR5cGUub2YuYm9keS5wYXJ0PU1pc3NpbmcgbWVkaWEgdHlwZSBvZiBib2R5IHBhcnQuCittaXNzaW5nLmVudGl0eS5vZi5ib2R5LnBhcnQ9TWlzc2luZyBib2R5IHBhcnQgZW50aXR5IG9mIHR5cGUgInswfSIuCituby5hdmFpbGFibGUubWJyPU5vIGF2YWlsYWJsZSBNZXNzYWdlQm9keVJlYWRlciBmb3IgY2xhc3MgInswfSIgYW5kIG1lZGlhIHR5cGUgInsxfSIuCituby5hdmFpbGFibGUubWJ3PU5vIGF2YWlsYWJsZSBNZXNzYWdlQm9keVdyaXRlciBmb3IgY2xhc3MgInswfSIgYW5kIG1lZGlhIHR5cGUgInsxfSIuCitwYXJzaW5nLmVycm9yPUV4Y2VwdGlvbiBvY2N1cnJlZCBkdXJpbmcgcGFyc2luZyBNdWx0aVBhcnQgbWVzc2FnZS4gUGVyZm9ybWluZyBjbGVhbnVwLgordGVtcC5maWxlLmNhbm5vdC5iZS5jcmVhdGVkPUNhbm5vdCBjcmVhdGUgdGVtcG9yYXJ5IGZpbGVzLiBNdWx0aXBhcnQgYXR0YWNobWVudHMgd2lsbCBiZSBsaW1pdGVkIHRvICJ7MH0iIGJ5dGVzLgordGVtcC5maWxlLm5vdC5kZWxldGVkPVRlbXBvcmFyeSBmaWxlIHswfSB3YXMgbm90IGRlbGV0ZWQuCitlbnRpdHkuaXMuZW1wdHk9RW50aXR5IGlzIGVtcHR5LgpkaWZmIC0tZ2l0IGEvbWVkaWEvbXVsdGlwYXJ0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvbXVsdGlwYXJ0L0JvZHlQYXJ0VGVzdC5qYXZhIGIvbWVkaWEvbXVsdGlwYXJ0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvbXVsdGlwYXJ0L0JvZHlQYXJ0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwOWQyOTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdWx0aXBhcnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9tdWx0aXBhcnQvQm9keVBhcnRUZXN0LmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBUZXN0IGNhc2UgZm9yIHtAbGluayBCb2R5UGFydH0uCisgKgorICogQGF1dGhvciBDcmFpZyBNY0NsYW5haGFuCisgKiBAYXV0aG9yIEltcmFuIE0gWW91c3VmIChpbXJhbiBhdCBzbWFydGl0ZW5naW5lZXJpbmcuY29tKQorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBCb2R5UGFydFRlc3QgeworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJvZHlQYXJ0ID0gbmV3IEJvZHlQYXJ0KCk7CisgICAgfQorCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYm9keVBhcnQgPSBudWxsOworICAgIH0KKworICAgIHByb3RlY3RlZCBCb2R5UGFydCBib2R5UGFydCA9IG51bGw7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGUoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygidGV4dC9wbGFpbiIsIGJvZHlQYXJ0LmdldE1lZGlhVHlwZSgpLnRvU3RyaW5nKCkpOworICAgICAgICBib2R5UGFydC5zZXRNZWRpYVR5cGUobmV3IE1lZGlhVHlwZSgiYXBwbGljYXRpb24iLCAianNvbiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcHBsaWNhdGlvbi9qc29uIiwgYm9keVBhcnQuZ2V0TWVkaWFUeXBlKCkudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW50aXR5KCkgeworICAgICAgICBib2R5UGFydC5zZXRFbnRpdHkoImZvbyBiYXIgYmF6Iik7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9vIGJhciBiYXoiLCBib2R5UGFydC5nZXRFbnRpdHkoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVhZGVycygpIHsKKyAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMgPSBib2R5UGFydC5nZXRIZWFkZXJzKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoaGVhZGVycyk7CisgICAgICAgIGFzc2VydE51bGwoaGVhZGVycy5nZXQoSHR0cEhlYWRlcnMuQUNDRVBUKSk7CisgICAgICAgIGhlYWRlcnMuYWRkKEh0dHBIZWFkZXJzLkFDQ0VQVCwgImFwcGxpY2F0aW9uL3htbCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFwcGxpY2F0aW9uL3htbCIsIGhlYWRlcnMuZ2V0Rmlyc3QoSHR0cEhlYWRlcnMuQUNDRVBUKSk7CisgICAgICAgIGhlYWRlcnMuYWRkKEh0dHBIZWFkZXJzLkFDQ0VQVCwgImFwcGxpY2F0aW9uL2pzb24iKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcHBsaWNhdGlvbi94bWwiLCBoZWFkZXJzLmdldEZpcnN0KEh0dHBIZWFkZXJzLkFDQ0VQVCkpOworICAgICAgICBMaXN0IHZhbHVlcyA9IGhlYWRlcnMuZ2V0KEh0dHBIZWFkZXJzLkFDQ0VQVCk7CisgICAgICAgIGFzc2VydFRydWUodmFsdWVzLmNvbnRhaW5zKCJhcHBsaWNhdGlvbi94bWwiKSk7CisgICAgICAgIGFzc2VydFRydWUodmFsdWVzLmNvbnRhaW5zKCJhcHBsaWNhdGlvbi9qc29uIikpOworICAgICAgICBhc3NlcnROb3ROdWxsKGhlYWRlcnMuZ2V0KCJhY2NlcHQiKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoaGVhZGVycy5nZXQoIkFDQ0VQVCIpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL21lZGlhL211bHRpcGFydC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9Gb3JtRGF0YUJvZHlQYXJ0VGVzdC5qYXZhIGIvbWVkaWEvbXVsdGlwYXJ0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvbXVsdGlwYXJ0L0Zvcm1EYXRhQm9keVBhcnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA5MzJmOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL211bHRpcGFydC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9Gb3JtRGF0YUJvZHlQYXJ0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICogVGVzdCBjYXNlIGZvciB7QGxpbmsgRm9ybURhdGFCb2R5UGFydH0uCisgKgorICogQGF1dGhvciBDcmFpZyBNY0NsYW5haGFuCisgKiBAYXV0aG9yIEltcmFuIE0gWW91c3VmIChpbXJhbiBhdCBzbWFydGl0ZW5naW5lZXJpbmcuY29tKQorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBGb3JtRGF0YUJvZHlQYXJ0VGVzdCBleHRlbmRzIEJvZHlQYXJ0VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIuc2V0VXAoKTsKKyAgICAgICAgYm9keVBhcnQgPSBuZXcgRm9ybURhdGFCb2R5UGFydCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJvZHlQYXJ0ID0gbnVsbDsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVGREJQKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEZvcm1EYXRhQm9keVBhcnQgZmRicCA9IChGb3JtRGF0YUJvZHlQYXJ0KSBib2R5UGFydDsKKyAgICAgICAgYXNzZXJ0TnVsbChmZGJwLmdldEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uKCkpOworICAgICAgICBhc3NlcnROdWxsKGZkYnAuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChmZGJwLmdldFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUcnVlKGZkYnAuaXNTaW1wbGUoKSk7CisKKyAgICAgICAgZmRicCA9IG5ldyBGb3JtRGF0YUJvZHlQYXJ0KCI8Zm9vPmJhcjwvZm9vPiIsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUxfVFlQRSk7CisgICAgICAgIGFzc2VydE51bGwoZmRicC5nZXRGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbigpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChmZGJwLmdldE5hbWUoKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZkYnAuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBJbGxlZ2FsU3RhdGVFeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIEV4cGVjdGVkIHJlc3VsdC4KKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydEVxdWFscygiPGZvbz5iYXI8L2Zvbz4iLCBmZGJwLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghZmRicC5pc1NpbXBsZSgpKTsKKworICAgICAgICBmZGJwID0gbmV3IEZvcm1EYXRhQm9keVBhcnQoIm5hbWUiLCAidmFsdWUiKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChmZGJwLmdldEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm5hbWUiLCBmZGJwLmdldE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidmFsdWUiLCBmZGJwLmdldFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUcnVlKGZkYnAuaXNTaW1wbGUoKSk7CisKKyAgICAgICAgZmRicCA9IG5ldyBGb3JtRGF0YUJvZHlQYXJ0KCJuYW1lIiwgIjxmb28+YmFyPC9mb28+IiwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTF9UWVBFKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChmZGJwLmdldEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm5hbWUiLCBmZGJwLmdldE5hbWUoKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZkYnAuZ2V0VmFsdWUoKTsKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBJbGxlZ2FsU3RhdGVFeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIEV4cGVjdGVkIHJlc3VsdC4KKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydEVxdWFscygiPGZvbz5iYXI8L2Zvbz4iLCBmZGJwLmdldEVudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghZmRicC5pc1NpbXBsZSgpKTsKKworICAgICAgICBmZGJwID0gbmV3IEZvcm1EYXRhQm9keVBhcnQoCisgICAgICAgICAgICAgICAgRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24ubmFtZSgibmFtZSIpLmZpbGVOYW1lKCJmaWxlbmFtZSIpLmJ1aWxkKCksCisgICAgICAgICAgICAgICAgIjxmb28+YmFyPC9mb28+IiwKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MX1RZUEUpOworICAgICAgICBhc3NlcnROb3ROdWxsKGZkYnAuZ2V0Rm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24oKSk7CisgICAgICAgIGFzc2VydEVxdWFscygibmFtZSIsIGZkYnAuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmaWxlbmFtZSIsIGZkYnAuZ2V0Rm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24oKS5nZXRGaWxlTmFtZSgpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmRicC5nZXRWYWx1ZSgpOworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gRXhwZWN0ZWQgcmVzdWx0LgorICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI8Zm9vPmJhcjwvZm9vPiIsIGZkYnAuZ2V0RW50aXR5KCkpOworICAgICAgICBhc3NlcnRUcnVlKCFmZGJwLmlzU2ltcGxlKCkpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmZGJwID0gbmV3IEZvcm1EYXRhQm9keVBhcnQoKTsKKyAgICAgICAgICAgIGZkYnAuc2V0TmFtZShudWxsKTsKKyAgICAgICAgICAgIGZhaWwoIk5hbWUgc2hvdWxkIGJlIG51bGwgc2V0dGFibGUhIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBhcmd1bWVudEV4Y2VwdGlvbikgeworICAgICAgICAgICAgLy8gRXhwZWN0ZWQgcmVzdWx0LgorICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9tZWRpYS9tdWx0aXBhcnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9tdWx0aXBhcnQvRm9ybURhdGFNdWx0aVBhcnRUZXN0LmphdmEgYi9tZWRpYS9tdWx0aXBhcnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9tdWx0aXBhcnQvRm9ybURhdGFNdWx0aVBhcnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NmMTk2YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL211bHRpcGFydC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9Gb3JtRGF0YU11bHRpUGFydFRlc3QuamF2YQpAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydDsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworCisvKioKKyAqIFRlc3QgY2FzZSBmb3Ige0BsaW5rIEZvcm1EYXRhTXVsdGlQYXJ0fS4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEZvcm1EYXRhTXVsdGlQYXJ0VGVzdCBleHRlbmRzIE11bHRpUGFydFRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIG11bHRpUGFydCA9IG5ldyBGb3JtRGF0YU11bHRpUGFydCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG11bHRpUGFydCA9IG51bGw7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiZW1wdHktc3RhdGVtZW50IikKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmllbGRzRkRNUCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBGb3JtRGF0YU11bHRpUGFydCBmZG1wID0gKEZvcm1EYXRhTXVsdGlQYXJ0KSBtdWx0aVBhcnQ7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBmZG1wLmdldEZpZWxkcygpLnNpemUoKSk7CisgICAgICAgIGZkbXAgPSBmZG1wLmZpZWxkKCJmb28iLCAiYmFyIikuZmllbGQoImJheiIsICJib3AiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgZmRtcC5nZXRGaWVsZHMoKS5zaXplKCkpOworCisgICAgICAgIGFzc2VydE5vdE51bGwoZmRtcC5nZXRGaWVsZCgiZm9vIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoImJhciIsIGZkbXAuZ2V0RmllbGQoImZvbyIpLmdldFZhbHVlKCkpOworICAgICAgICBhc3NlcnROb3ROdWxsKGZkbXAuZ2V0RmllbGQoImJheiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJib3AiLCBmZG1wLmdldEZpZWxkKCJiYXoiKS5nZXRWYWx1ZSgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImJhciIsIGZkbXAuZ2V0RmllbGRzKCJmb28iKS5nZXQoMCkuZ2V0VmFsdWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYm9wIiwgZmRtcC5nZXRGaWVsZHMoImJheiIpLmdldCgwKS5nZXRWYWx1ZSgpKTsKKworICAgICAgICBhc3NlcnROb3ROdWxsKGZkbXAuZ2V0RmllbGRzKCkuZ2V0KCJmb28iKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYmFyIiwgZmRtcC5nZXRGaWVsZHMoKS5nZXQoImZvbyIpLmdldCgwKS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChmZG1wLmdldEZpZWxkcygpLmdldCgiYmF6IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoImJvcCIsIGZkbXAuZ2V0RmllbGRzKCkuZ2V0KCJiYXoiKS5nZXQoMCkuZ2V0VmFsdWUoKSk7CisKKworICAgICAgICBmZG1wID0gZmRtcC5maWVsZCgiZm9vIiwgImJhciIpLmZpZWxkKCJiYXoiLCAiYm9wIik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGZkbXAuZ2V0RmllbGRzKCkuZ2V0KCJmb28iKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgZmRtcC5nZXRGaWVsZHMoKS5nZXQoImJheiIpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBmZG1wLmdldEZpZWxkcygiZm9vIikuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGZkbXAuZ2V0RmllbGRzKCJiYXoiKS5zaXplKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbXVsdGlwYXJ0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvbXVsdGlwYXJ0L011bHRpUGFydE1lZGlhVHlwZXNUZXN0LmphdmEgYi9tZWRpYS9tdWx0aXBhcnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9tdWx0aXBhcnQvTXVsdGlQYXJ0TWVkaWFUeXBlc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjVkM2E5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXVsdGlwYXJ0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvbXVsdGlwYXJ0L011bHRpUGFydE1lZGlhVHlwZXNUZXN0LmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIFRlc3QgY2FzZSBmb3Ige0BsaW5rIE11bHRpUGFydE1lZGlhVHlwZXN9LgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgTXVsdGlQYXJ0TWVkaWFUeXBlc1Rlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWVkaWFUeXBlcygpIHsKKyAgICAgICAgdGVzdChNdWx0aVBhcnRNZWRpYVR5cGVzLk1VTFRJUEFSVF9BTFRFUk5BVElWRV9UWVBFLCBNdWx0aVBhcnRNZWRpYVR5cGVzLmNyZWF0ZUFsdGVybmF0aXZlKCkpOworICAgICAgICB0ZXN0KE11bHRpUGFydE1lZGlhVHlwZXMuTVVMVElQQVJUX0RJR0VTVF9UWVBFLCBNdWx0aVBhcnRNZWRpYVR5cGVzLmNyZWF0ZURpZ2VzdCgpKTsKKyAgICAgICAgdGVzdChNdWx0aVBhcnRNZWRpYVR5cGVzLk1VTFRJUEFSVF9NSVhFRF9UWVBFLCBNdWx0aVBhcnRNZWRpYVR5cGVzLmNyZWF0ZU1peGVkKCkpOworICAgICAgICB0ZXN0KE11bHRpUGFydE1lZGlhVHlwZXMuTVVMVElQQVJUX1BBUkVMTEVMX1RZUEUsIE11bHRpUGFydE1lZGlhVHlwZXMuY3JlYXRlUGFyYWxsZWwoKSk7CisgICAgICAgIHRlc3QoTWVkaWFUeXBlLk1VTFRJUEFSVF9GT1JNX0RBVEFfVFlQRSwgTXVsdGlQYXJ0TWVkaWFUeXBlcy5jcmVhdGVGb3JtRGF0YSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdChNZWRpYVR5cGUgeCwgTWVkaWFUeXBlIHkpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHguZ2V0VHlwZSgpLCB5LmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyh4LmdldFN1YnR5cGUoKSwgeS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRUcnVlKHkuZ2V0UGFyYW1ldGVycygpLmNvbnRhaW5zS2V5KCJib3VuZGFyeSIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9tdWx0aXBhcnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9tdWx0aXBhcnQvTXVsdGlQYXJ0VGVzdC5qYXZhIGIvbWVkaWEvbXVsdGlwYXJ0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvbXVsdGlwYXJ0L011bHRpUGFydFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWNmMDhkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXVsdGlwYXJ0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvbXVsdGlwYXJ0L011bHRpUGFydFRlc3QuamF2YQpAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICogVGVzdCBjYXNlIGZvciB7QGxpbmsgTXVsdGlQYXJ0fS4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIE11bHRpUGFydFRlc3QgeworCisgICAgcHJvdGVjdGVkIE11bHRpUGFydCBtdWx0aVBhcnQgPSBudWxsOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG11bHRpUGFydCA9IG5ldyBNdWx0aVBhcnQoKTsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtdWx0aVBhcnQgPSBudWxsOworICAgIH0KKworICAgIEBUZXN0CisgICAgQFN1cHByZXNzV2FybmluZ3MoImVtcHR5LXN0YXRlbWVudCIpCisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZSgpIHsKKyAgICAgICAgaWYgKG11bHRpUGFydCBpbnN0YW5jZW9mIEZvcm1EYXRhTXVsdGlQYXJ0KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm11bHRpcGFydC9mb3JtLWRhdGEiLCBtdWx0aVBhcnQuZ2V0TWVkaWFUeXBlKCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG11bHRpUGFydC5zZXRNZWRpYVR5cGUobmV3IE1lZGlhVHlwZSgibXVsdGlwYXJ0IiwgImZvbyIpKTsKKyAgICAgICAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIik7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIEV4cGVjdGVkIHJlc3VsdC4KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG11bHRpUGFydC5zZXRNZWRpYVR5cGUoTWVkaWFUeXBlLk1VTFRJUEFSVF9GT1JNX0RBVEFfVFlQRSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm11bHRpcGFydC9taXhlZCIsIG11bHRpUGFydC5nZXRNZWRpYVR5cGUoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIG11bHRpUGFydC5zZXRNZWRpYVR5cGUobmV3IE1lZGlhVHlwZSgibXVsdGlwYXJ0IiwgImFsdGVybmF0aXZlIikpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJtdWx0aXBhcnQvYWx0ZXJuYXRpdmUiLCBtdWx0aVBhcnQuZ2V0TWVkaWFUeXBlKCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG11bHRpUGFydC5zZXRNZWRpYVR5cGUobmV3IE1lZGlhVHlwZSgidGV4dCIsICJ4bWwiKSk7CisgICAgICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyBFeHBlY3RlZCByZXN1bHQuCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJlbXB0eS1zdGF0ZW1lbnQiKQorICAgIHB1YmxpYyB2b2lkIHRlc3RFbnRpdHkoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtdWx0aVBhcnQuc2V0RW50aXR5KCJmb28gYmFyIGJheiIpOworICAgICAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gRXhwZWN0ZWQgcmVzdWx0LgorICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyBiYXIgYmF6IiwgbXVsdGlQYXJ0LmdldEVudGl0eSgpKTsKKyAgICAgICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBJbGxlZ2FsU3RhdGVFeGNlcHRpb24iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIEV4cGVjdGVkIHJlc3VsdC4KKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbXVsdGlwYXJ0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvbXVsdGlwYXJ0L011bHRpcGFydE1peGVkV2l0aEFwYWNoZUNsaWVudFRlc3QuamF2YSBiL21lZGlhL211bHRpcGFydC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9NdWx0aXBhcnRNaXhlZFdpdGhBcGFjaGVDbGllbnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg2NzQ5NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL211bHRpcGFydC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9NdWx0aXBhcnRNaXhlZFdpdGhBcGFjaGVDbGllbnRUZXN0LmphdmEKQEAgLTAsMCArMSwxMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0OworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5hcGFjaGUuY29ubmVjdG9yLkFwYWNoZUNvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitwdWJsaWMgY2xhc3MgTXVsdGlwYXJ0TWl4ZWRXaXRoQXBhY2hlQ2xpZW50VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhQcm9kdWNlc0Zvcm1EYXRhVXNpbmdNdWx0aVBhcnQuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5jb25uZWN0b3JQcm92aWRlcihuZXcgQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihNdWx0aVBhcnRGZWF0dXJlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAUGF0aCgicmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHJvZHVjZXNGb3JtRGF0YVVzaW5nTXVsdGlQYXJ0IHsKKworICAgICAgICBAUE9TVAorICAgICAgICBAQ29uc3VtZXMoIm11bHRpcGFydC9taXhlZCIpCisgICAgICAgIHB1YmxpYyB2b2lkIHBvc3QoTXVsdGlQYXJ0IG1wKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgYnl0ZVtdIGluID0gcmVhZChtcC5nZXRCb2R5UGFydHMoKS5nZXQoMCkuZ2V0RW50aXR5QXMoSW5wdXRTdHJlYW0uY2xhc3MpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg1MCwgaW4ubGVuZ3RoKTsKKworICAgICAgICAgICAgaW4gPSByZWFkKG1wLmdldEJvZHlQYXJ0cygpLmdldCgxKS5nZXRFbnRpdHlBcyhJbnB1dFN0cmVhbS5jbGFzcykpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDkwMCAqIDEwMjQsIGluLmxlbmd0aCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGJ5dGVbXSByZWFkKElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICBieXRlW10gYnVmZmVyID0gbmV3IGJ5dGVbNDA5Nl07CisgICAgICAgICAgICBpbnQgcmVhZCA9IC0xOworICAgICAgICAgICAgd2hpbGUgKChyZWFkID0gaW4ucmVhZChidWZmZXIpKSAhPSAtMSkgeworICAgICAgICAgICAgICAgIGJhb3Mud3JpdGUoYnVmZmVyLCAwLCByZWFkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGJhb3MudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRlc3QgYSByZXNwb25zZSBvZiB0eXBlICJtdWx0aXBhcnQvZm9ybS1kYXRhIi4gIFRoZSBleGFtcGxlIGNvbWVzIGZyb20KKyAgICAvLyBTZWN0aW9uIDYgb2YgUkZDIDE4NjcuCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvZHVjZXNGb3JtRGF0YVVzaW5nTXVsdGlQYXJ0KCkgeworCisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDkwMCAqIDEwMjQ7IGkrKykgeworICAgICAgICAgICAgYmFvcy53cml0ZSg2NSk7CisgICAgICAgIH0KKworICAgICAgICBNdWx0aVBhcnQgbXVsdGlQYXJ0SW5wdXQgPSBuZXcgTXVsdGlQYXJ0KCkKKyAgICAgICAgICAgICAgICAuYm9keVBhcnQobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKCIwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIuZ2V0Qnl0ZXMoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUuQVBQTElDQVRJT05fT0NURVRfU1RSRUFNX1RZUEUpCisgICAgICAgICAgICAgICAgLmJvZHlQYXJ0KGJhb3MudG9CeXRlQXJyYXkoKSwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX09DVEVUX1NUUkVBTV9UWVBFKTsKKworICAgICAgICB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZSIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobXVsdGlQYXJ0SW5wdXQsCisgICAgICAgICAgICAgICAgTXVsdGlQYXJ0TWVkaWFUeXBlcy5jcmVhdGVNaXhlZCgpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2h1bmtlZEVuY29kaW5nVXNpbmdNdWx0aVBhcnQoKSB7CisgICAgICAgIGZpbmFsIENsaWVudCBjbGllbnQgPSBjbGllbnQoKTsKKyAgICAgICAgY2xpZW50LnByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuQ0hVTktFRF9FTkNPRElOR19TSVpFLCAxMDI0KTsKKworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA5MDAgKiAxMDI0OyBpKyspIHsKKyAgICAgICAgICAgIGJhb3Mud3JpdGUoNjUpOworICAgICAgICB9CisKKyAgICAgICAgTXVsdGlQYXJ0IG11bHRpUGFydElucHV0ID0gbmV3IE11bHRpUGFydCgpCisgICAgICAgICAgICAgICAgLmJvZHlQYXJ0KG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgiMDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkiLmdldEJ5dGVzKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX09DVEVUX1NUUkVBTV9UWVBFKQorICAgICAgICAgICAgICAgIC5ib2R5UGFydChiYW9zLnRvQnl0ZUFycmF5KCksIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9PQ1RFVF9TVFJFQU1fVFlQRSk7CisKKyAgICAgICAgY2xpZW50LnRhcmdldChnZXRCYXNlVXJpKCkpLnBhdGgoInJlc291cmNlIikucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eShtdWx0aVBhcnRJbnB1dCwgTXVsdGlQYXJ0TWVkaWFUeXBlcy5jcmVhdGVNaXhlZCgpKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbXVsdGlwYXJ0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvbXVsdGlwYXJ0L1BhcmFtZXRlcml6ZWRIZWFkZXJzTWFwVGVzdC5qYXZhIGIvbWVkaWEvbXVsdGlwYXJ0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvbXVsdGlwYXJ0L1BhcmFtZXRlcml6ZWRIZWFkZXJzTWFwVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZTZkYTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdWx0aXBhcnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9tdWx0aXBhcnQvUGFyYW1ldGVyaXplZEhlYWRlcnNNYXBUZXN0LmphdmEKQEAgLTAsMCArMSw0MzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuUGFyYW1ldGVyaXplZEhlYWRlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCisvKioKKyAqIFVuaXQgdGVzdHMgZm9yIHtAbGluayBQYXJhbWV0ZXJpemVkSGVhZGVyc01hcH0uCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBQYXJhbWV0ZXJpemVkSGVhZGVyc01hcFRlc3QgeworCisgICAgcHJpdmF0ZSBQYXJhbWV0ZXJpemVkSGVhZGVyc01hcCBtYXA7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbWFwID0gbmV3IFBhcmFtZXRlcml6ZWRIZWFkZXJzTWFwKCk7CisgICAgfQorCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbWFwID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IG9mIGFkZCBtZXRob2QsIG9mIGNsYXNzIFBhcmFtZXRyaXplZEhlYWRlcnNNYXAuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1hcC5hZGQoImZvbyIsIG5ldyBQYXJhbWV0ZXJpemVkSGVhZGVyKCJiYXIiKSk7CisgICAgICAgIExpc3Q8UGFyYW1ldGVyaXplZEhlYWRlcj4gdmFsdWVzID0gbWFwLmdldCgiZm9vIik7CisKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh2YWx1ZXMpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdmFsdWVzLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYmFyIiwgdmFsdWVzLmdldCgwKS5nZXRWYWx1ZSgpKTsKKworICAgICAgICBtYXAuYWRkKCJmb28iLCBuZXcgUGFyYW1ldGVyaXplZEhlYWRlcigiYmF6IikpOworCisgICAgICAgIGFzc2VydEVxdWFscygxLCBtYXAuc2l6ZSgpKTsKKworICAgICAgICB2YWx1ZXMgPSBtYXAuZ2V0KCJmb28iKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgdmFsdWVzLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYmFyIiwgdmFsdWVzLmdldCgwKS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYXoiLCB2YWx1ZXMuZ2V0KDEpLmdldFZhbHVlKCkpOworCisgICAgICAgIG1hcC5hZGQoImJvcCIsIG5ldyBQYXJhbWV0ZXJpemVkSGVhZGVyKCJib28iKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBtYXAuc2l6ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IG9mIGNsZWFyIG1ldGhvZCwgb2YgY2xhc3MgUGFyYW1ldHJpemVkSGVhZGVyc01hcC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbGVhcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtYXAuYWRkKCJmb28iLCBuZXcgUGFyYW1ldGVyaXplZEhlYWRlcigiYmFyIikpOworICAgICAgICBtYXAuYWRkKCJiYXoiLCBuZXcgUGFyYW1ldGVyaXplZEhlYWRlcigiYm9wIikpOworCisgICAgICAgIGFzc2VydFRydWUoIW1hcC5pc0VtcHR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbWFwLnNpemUoKSk7CisKKyAgICAgICAgbWFwLmNsZWFyKCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1hcC5zaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKG1hcC5pc0VtcHR5KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgb2YgY29udGFpbnNLZXkgbWV0aG9kLCBvZiBjbGFzcyBQYXJhbWV0cml6ZWRIZWFkZXJzTWFwLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbnRhaW5zS2V5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1hcC5hZGQoImZvbyIsIG5ldyBQYXJhbWV0ZXJpemVkSGVhZGVyKCJiYXIiKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShtYXAuY29udGFpbnNLZXkoImZvbyIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtYXAuY29udGFpbnNLZXkoIkZPTyIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtYXAuY29udGFpbnNLZXkoIkZvbyIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtYXAuY29udGFpbnNLZXkoImZPbyIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtYXAuY29udGFpbnNLZXkoImZvTyIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghbWFwLmNvbnRhaW5zS2V5KCJiYXIiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBvZiBjb250YWluc1ZhbHVlIG1ldGhvZCwgb2YgY2xhc3MgUGFyYW1ldHJpemVkSGVhZGVyc01hcC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb250YWluc1ZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIExpc3Q8UGFyYW1ldGVyaXplZEhlYWRlcj4gdmFsdWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIHZhbHVlcy5hZGQobmV3IFBhcmFtZXRlcml6ZWRIZWFkZXIoImJhciIpKTsKKyAgICAgICAgdmFsdWVzLmFkZChuZXcgUGFyYW1ldGVyaXplZEhlYWRlcigiYm9wIikpOworCisgICAgICAgIG1hcC5wdXQoImZvbyIsIHZhbHVlcyk7CisgICAgICAgIGFzc2VydFRydWUobWFwLmNvbnRhaW5zVmFsdWUodmFsdWVzKSk7CisKKyAgICAgICAgbWFwLmNsZWFyKCk7CisgICAgICAgIGFzc2VydFRydWUoIW1hcC5jb250YWluc1ZhbHVlKHZhbHVlcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgb2YgZW50cnlTZXQgbWV0aG9kLCBvZiBjbGFzcyBQYXJhbWV0cml6ZWRIZWFkZXJzTWFwLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVudHJ5U2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIExpc3Q8UGFyYW1ldGVyaXplZEhlYWRlcj4gdmFsdWVzRm9vID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIHZhbHVlc0Zvby5hZGQobmV3IFBhcmFtZXRlcml6ZWRIZWFkZXIoImZvbzEiKSk7CisgICAgICAgIHZhbHVlc0Zvby5hZGQobmV3IFBhcmFtZXRlcml6ZWRIZWFkZXIoImZvbzIiKSk7CisKKyAgICAgICAgbWFwLnB1dCgiZm9vIiwgdmFsdWVzRm9vKTsKKworICAgICAgICBMaXN0PFBhcmFtZXRlcml6ZWRIZWFkZXI+IHZhbHVlc0JhciA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICB2YWx1ZXNCYXIuYWRkKG5ldyBQYXJhbWV0ZXJpemVkSGVhZGVyKCJiYXIxIikpOworICAgICAgICB2YWx1ZXNCYXIuYWRkKG5ldyBQYXJhbWV0ZXJpemVkSGVhZGVyKCJiYXIyIikpOworCisgICAgICAgIG1hcC5wdXQoImJhciIsIHZhbHVlc0Jhcik7CisKKyAgICAgICAgU2V0PEVudHJ5PFN0cmluZywgTGlzdDxQYXJhbWV0ZXJpemVkSGVhZGVyPj4+IGVudHJ5U2V0ID0gbWFwLmVudHJ5U2V0KCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGVudHJ5U2V0LnNpemUoKSk7CisKKyAgICAgICAgLy8gVE9ETyAtIGRldGFpbGVkIHRlc3RzIGZvciB0aGUgSGVhZGVyc0VudHJpZXMgbWV0aG9kcworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgb2YgZ2V0IG1ldGhvZCwgb2YgY2xhc3MgUGFyYW1ldHJpemVkSGVhZGVyc01hcC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgbWFwLmFkZCgiZm9vIiwgbmV3IFBhcmFtZXRlcml6ZWRIZWFkZXIoImJhciIpKTsKKworICAgICAgICBhc3NlcnROb3ROdWxsKG1hcC5nZXQoImZvbyIpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtYXAuZ2V0KCJGT08iKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwobWFwLmdldCgiRm9vIikpOworICAgICAgICBhc3NlcnROb3ROdWxsKG1hcC5nZXQoImZPbyIpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtYXAuZ2V0KCJmb08iKSk7CisgICAgICAgIGFzc2VydE51bGwobWFwLmdldCgiYmFyIikpOworCisgICAgICAgIExpc3Q8UGFyYW1ldGVyaXplZEhlYWRlcj4gdmFsdWVzID0gbWFwLmdldCgiZm9vIik7CisKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh2YWx1ZXMpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdmFsdWVzLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYmFyIiwgdmFsdWVzLmdldCgwKS5nZXRWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHNBbmRIYXNoQ29kZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBQYXJhbWV0ZXJpemVkSGVhZGVyc01hcCBtYXAyID0gbmV3IFBhcmFtZXRlcml6ZWRIZWFkZXJzTWFwKCk7CisKKyAgICAgICAgTGlzdDxQYXJhbWV0ZXJpemVkSGVhZGVyPiB2YWx1ZXNGb28gPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgdmFsdWVzRm9vLmFkZChuZXcgUGFyYW1ldGVyaXplZEhlYWRlcigiZm9vMSIpKTsKKyAgICAgICAgdmFsdWVzRm9vLmFkZChuZXcgUGFyYW1ldGVyaXplZEhlYWRlcigiZm9vMiIpKTsKKworICAgICAgICBtYXAucHV0KCJmb28iLCB2YWx1ZXNGb28pOworICAgICAgICBtYXAyLnB1dCgiZm9vIiwgdmFsdWVzRm9vKTsKKworICAgICAgICBMaXN0PFBhcmFtZXRlcml6ZWRIZWFkZXI+IHZhbHVlc0JhciA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICB2YWx1ZXNCYXIuYWRkKG5ldyBQYXJhbWV0ZXJpemVkSGVhZGVyKCJiYXIxIikpOworICAgICAgICB2YWx1ZXNCYXIuYWRkKG5ldyBQYXJhbWV0ZXJpemVkSGVhZGVyKCJiYXIyIikpOworCisgICAgICAgIG1hcC5wdXQoImJhciIsIHZhbHVlc0Jhcik7CisgICAgICAgIG1hcDIucHV0KCJiYXIiLCB2YWx1ZXNCYXIpOworCisgICAgICAgIGFzc2VydFRydWUobWFwLmVxdWFscyhtYXAyKSk7CisgICAgICAgIGFzc2VydFRydWUobWFwMi5lcXVhbHMobWFwKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtYXAuaGFzaENvZGUoKSwgbWFwMi5oYXNoQ29kZSgpKTsKKworICAgICAgICBtYXAyLnJlbW92ZSgiYmFyIik7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSghbWFwLmVxdWFscyhtYXAyKSk7CisgICAgICAgIGFzc2VydFRydWUoIW1hcDIuZXF1YWxzKG1hcCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgb2YgZ2V0Rmlyc3QgbWV0aG9kLCBvZiBjbGFzcyBQYXJhbWV0cml6ZWRIZWFkZXJzTWFwLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEZpcnN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1hcC5hZGQoImZvbyIsIG5ldyBQYXJhbWV0ZXJpemVkSGVhZGVyKCJiYXIiKSk7CisgICAgICAgIG1hcC5hZGQoImZvbyIsIG5ldyBQYXJhbWV0ZXJpemVkSGVhZGVyKCJiYXoiKSk7CisgICAgICAgIG1hcC5hZGQoImZvbyIsIG5ldyBQYXJhbWV0ZXJpemVkSGVhZGVyKCJib3AiKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIG1hcC5nZXQoImZvbyIpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYmFyIiwgbWFwLmdldEZpcnN0KCJmb28iKS5nZXRWYWx1ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IG9mIGlzRW1wdHkgbWV0aG9kLCBvZiBjbGFzcyBQYXJhbWV0cml6ZWRIZWFkZXJzTWFwLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElzRW1wdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtYXAuaXNFbXB0eSgpKTsKKworICAgICAgICBtYXAuYWRkKCJmb28iLCBuZXcgUGFyYW1ldGVyaXplZEhlYWRlcigiYmFyIikpOworICAgICAgICBhc3NlcnRUcnVlKCFtYXAuaXNFbXB0eSgpKTsKKworICAgICAgICBtYXAuY2xlYXIoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtYXAuaXNFbXB0eSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IG9mIGtleVNldCBtZXRob2QsIG9mIGNsYXNzIFBhcmFtZXRyaXplZEhlYWRlcnNNYXAuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0S2V5U2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1hcC5hZGQoImZvbyIsIG5ldyBQYXJhbWV0ZXJpemVkSGVhZGVyKCJiYXIiKSk7CisgICAgICAgIG1hcC5hZGQoImJheiIsIG5ldyBQYXJhbWV0ZXJpemVkSGVhZGVyKCJib3AiKSk7CisKKyAgICAgICAgU2V0PFN0cmluZz4ga2V5U2V0ID0gbWFwLmtleVNldCgpOworCisgICAgICAgIGFzc2VydE5vdE51bGwoa2V5U2V0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGtleVNldC5zaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKGtleVNldC5jb250YWlucygiZm9vIikpOworICAgICAgICBhc3NlcnRUcnVlKCFrZXlTZXQuY29udGFpbnMoImJhciIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShrZXlTZXQuY29udGFpbnMoImJheiIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgha2V5U2V0LmNvbnRhaW5zKCJib3AiKSk7CisKKyAgICAgICAgLy8gVE9ETyAtIGRldGFpbGVkIHRlc3RzIGZvciB0aGUgSGVhZGVyc0tleXMgbWV0aG9kcworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhcmFtZXRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUGFyYW1ldGVyaXplZEhlYWRlciBoZWFkZXI7CisgICAgICAgIGhlYWRlciA9IG5ldyBQYXJhbWV0ZXJpemVkSGVhZGVyKCJmb28iKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsIGhlYWRlci5nZXRWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGhlYWRlci5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKworICAgICAgICBoZWFkZXIgPSBuZXcgUGFyYW1ldGVyaXplZEhlYWRlcigiZm9vO2Jhcj1iYXo7Ym9wPWFiYyIpOworCisgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwgaGVhZGVyLmdldFZhbHVlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgaGVhZGVyLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImJheiIsIGhlYWRlci5nZXRQYXJhbWV0ZXJzKCkuZ2V0KCJiYXIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYWJjIiwgaGVhZGVyLmdldFBhcmFtZXRlcnMoKS5nZXQoImJvcCIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IG9mIHB1dCBtZXRob2QsIG9mIGNsYXNzIFBhcmFtZXRyaXplZEhlYWRlcnNNYXAuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIExpc3Q8UGFyYW1ldGVyaXplZEhlYWRlcj4gZm9vVmFsdWVzMSA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb29WYWx1ZXMxLmFkZChuZXcgUGFyYW1ldGVyaXplZEhlYWRlcigiZm9vMSIpKTsKKyAgICAgICAgZm9vVmFsdWVzMS5hZGQobmV3IFBhcmFtZXRlcml6ZWRIZWFkZXIoImZvbzIiKSk7CisKKyAgICAgICAgYXNzZXJ0TnVsbChtYXAuZ2V0KCJmb28iKSk7CisKKyAgICAgICAgbWFwLnB1dCgiZm9vIiwgZm9vVmFsdWVzMSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShtYXAuY29udGFpbnNLZXkoImZvbyIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtYXAuY29udGFpbnNWYWx1ZShmb29WYWx1ZXMxKSk7CisgICAgICAgIGFzc2VydFRydWUobWFwLmdldCgiZm9vIikgPT0gZm9vVmFsdWVzMSk7CisKKyAgICAgICAgTGlzdDxQYXJhbWV0ZXJpemVkSGVhZGVyPiBmb29WYWx1ZXMyID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZvb1ZhbHVlczIuYWRkKG5ldyBQYXJhbWV0ZXJpemVkSGVhZGVyKCJmb28zIikpOworICAgICAgICBmb29WYWx1ZXMyLmFkZChuZXcgUGFyYW1ldGVyaXplZEhlYWRlcigiZm9vNCIpKTsKKworICAgICAgICBtYXAucHV0KCJmb28iLCBmb29WYWx1ZXMyKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbWFwLnNpemUoKSk7CisgICAgICAgIGFzc2VydFRydWUobWFwLmNvbnRhaW5zS2V5KCJmb28iKSk7CisgICAgICAgIGFzc2VydFRydWUoIW1hcC5jb250YWluc1ZhbHVlKGZvb1ZhbHVlczEpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtYXAuY29udGFpbnNWYWx1ZShmb29WYWx1ZXMyKSk7CisgICAgICAgIGFzc2VydFRydWUobWFwLmdldCgiZm9vIikgPT0gZm9vVmFsdWVzMik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBvZiBwdXRBbGwgbWV0aG9kLCBvZiBjbGFzcyBQYXJhbWV0cml6ZWRIZWFkZXJzTWFwLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFB1dEFsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PFBhcmFtZXRlcml6ZWRIZWFkZXI+PiBhbGwgPSBuZXcgSGFzaE1hcDw+KCk7CisKKyAgICAgICAgTGlzdDxQYXJhbWV0ZXJpemVkSGVhZGVyPiBmb29WYWx1ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgZm9vVmFsdWVzLmFkZChuZXcgUGFyYW1ldGVyaXplZEhlYWRlcigiZm9vMSIpKTsKKyAgICAgICAgZm9vVmFsdWVzLmFkZChuZXcgUGFyYW1ldGVyaXplZEhlYWRlcigiZm9vMiIpKTsKKworICAgICAgICBhbGwucHV0KCJmb28iLCBmb29WYWx1ZXMpOworCisgICAgICAgIExpc3Q8UGFyYW1ldGVyaXplZEhlYWRlcj4gYmFyVmFsdWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGJhclZhbHVlcy5hZGQobmV3IFBhcmFtZXRlcml6ZWRIZWFkZXIoImJhcjEiKSk7CisgICAgICAgIGJhclZhbHVlcy5hZGQobmV3IFBhcmFtZXRlcml6ZWRIZWFkZXIoImJhcjIiKSk7CisKKyAgICAgICAgYWxsLnB1dCgiYmFyIiwgYmFyVmFsdWVzKTsKKworICAgICAgICBhc3NlcnRUcnVlKG1hcC5pc0VtcHR5KCkpOworCisgICAgICAgIG1hcC5wdXRBbGwoYWxsKTsKKworICAgICAgICBhc3NlcnRUcnVlKCFtYXAuaXNFbXB0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG1hcC5zaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKG1hcC5jb250YWluc0tleSgiZm9vIikpOworICAgICAgICBhc3NlcnRUcnVlKG1hcC5jb250YWluc0tleSgiYmFyIikpOworICAgICAgICBhc3NlcnRUcnVlKG1hcC5jb250YWluc1ZhbHVlKGZvb1ZhbHVlcykpOworICAgICAgICBhc3NlcnRUcnVlKG1hcC5jb250YWluc1ZhbHVlKGJhclZhbHVlcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgb2YgcHV0U2luZ2xlIG1ldGhvZCwgb2YgY2xhc3MgUGFyYW1ldHJpemVkSGVhZGVyc01hcC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQdXRTaW5nbGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTGlzdDxQYXJhbWV0ZXJpemVkSGVhZGVyPiB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgdmFsdWVzLmFkZChuZXcgUGFyYW1ldGVyaXplZEhlYWRlcigiYmFyIikpOworICAgICAgICB2YWx1ZXMuYWRkKG5ldyBQYXJhbWV0ZXJpemVkSGVhZGVyKCJiYXoiKSk7CisKKyAgICAgICAgbWFwLnB1dCgiZm9vIiwgdmFsdWVzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbWFwLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBtYXAuZ2V0KCJmb28iKS5zaXplKCkpOworCisgICAgICAgIG1hcC5wdXRTaW5nbGUoImZvbyIsIG5ldyBQYXJhbWV0ZXJpemVkSGVhZGVyKCJib3AiKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1hcC5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbWFwLmdldCgiZm9vIikuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJib3AiLCBtYXAuZ2V0KCJmb28iKS5nZXQoMCkuZ2V0VmFsdWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBvZiByZW1vdmUgbWV0aG9kLCBvZiBjbGFzcyBQYXJhbWV0cml6ZWRIZWFkZXJzTWFwLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtYXAuYWRkKCJmb28iLCBuZXcgUGFyYW1ldGVyaXplZEhlYWRlcigiYmFyIikpOworICAgICAgICBtYXAuYWRkKCJiYXoiLCBuZXcgUGFyYW1ldGVyaXplZEhlYWRlcigiYm9wIikpOworCisgICAgICAgIGFzc2VydEVxdWFscygyLCBtYXAuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtYXAuY29udGFpbnNLZXkoImZvbyIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtYXAuY29udGFpbnNLZXkoImJheiIpKTsKKworICAgICAgICBtYXAucmVtb3ZlKCJmb28iKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbWFwLnNpemUoKSk7CisgICAgICAgIGFzc2VydFRydWUoIW1hcC5jb250YWluc0tleSgiZm9vIikpOworICAgICAgICBhc3NlcnRUcnVlKG1hcC5jb250YWluc0tleSgiYmF6IikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgb2Ygc2l6ZSBtZXRob2QsIG9mIGNsYXNzIFBhcmFtZXRyaXplZEhlYWRlcnNNYXAuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbWFwLnNpemUoKSk7CisKKyAgICAgICAgbWFwLmFkZCgiZm9vIiwgbmV3IFBhcmFtZXRlcml6ZWRIZWFkZXIoImJhciIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1hcC5zaXplKCkpOworCisgICAgICAgIG1hcC5hZGQoImZvbyIsIG5ldyBQYXJhbWV0ZXJpemVkSGVhZGVyKCJhcmciKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtYXAuc2l6ZSgpKTsKKworICAgICAgICBtYXAuYWRkKCJiYXoiLCBuZXcgUGFyYW1ldGVyaXplZEhlYWRlcigiYm9wIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbWFwLnNpemUoKSk7CisKKyAgICAgICAgbWFwLnJlbW92ZSgiYmF6Iik7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtYXAuc2l6ZSgpKTsKKworICAgICAgICBtYXAucmVtb3ZlKCJmb28iKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1hcC5zaXplKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgb2YgdmFsdWVzIG1ldGhvZCwgb2YgY2xhc3MgUGFyYW1ldHJpemVkSGVhZGVyc01hcC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWYWx1ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTWFwPFN0cmluZywgTGlzdDxQYXJhbWV0ZXJpemVkSGVhZGVyPj4gYWxsID0gbmV3IEhhc2hNYXA8PigpOworCisgICAgICAgIExpc3Q8UGFyYW1ldGVyaXplZEhlYWRlcj4gZm9vVmFsdWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZvb1ZhbHVlcy5hZGQobmV3IFBhcmFtZXRlcml6ZWRIZWFkZXIoImZvbzEiKSk7CisgICAgICAgIGZvb1ZhbHVlcy5hZGQobmV3IFBhcmFtZXRlcml6ZWRIZWFkZXIoImZvbzIiKSk7CisKKyAgICAgICAgYWxsLnB1dCgiZm9vIiwgZm9vVmFsdWVzKTsKKworICAgICAgICBMaXN0PFBhcmFtZXRlcml6ZWRIZWFkZXI+IGJhclZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBiYXJWYWx1ZXMuYWRkKG5ldyBQYXJhbWV0ZXJpemVkSGVhZGVyKCJiYXIxIikpOworICAgICAgICBiYXJWYWx1ZXMuYWRkKG5ldyBQYXJhbWV0ZXJpemVkSGVhZGVyKCJiYXIyIikpOworCisgICAgICAgIGFsbC5wdXQoImJhciIsIGJhclZhbHVlcyk7CisKKyAgICAgICAgbWFwLnB1dEFsbChhbGwpOworCisgICAgICAgIENvbGxlY3Rpb248TGlzdDxQYXJhbWV0ZXJpemVkSGVhZGVyPj4gdmFsdWVzID0gbWFwLnZhbHVlcygpOworCisgICAgICAgIGFzc2VydE5vdE51bGwodmFsdWVzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHZhbHVlcy5zaXplKCkpOworCisgICAgICAgIExpc3QgYXJyYXlbXSA9IG5ldyBMaXN0WzJdOworICAgICAgICBhcnJheSA9IHZhbHVlcy50b0FycmF5KGFycmF5KTsKKworICAgICAgICBpZiAoYXJyYXlbMF0gPT0gZm9vVmFsdWVzKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGFycmF5WzFdID09IGJhclZhbHVlcyk7CisgICAgICAgIH0gZWxzZSBpZiAoYXJyYXlbMF0gPT0gYmFyVmFsdWVzKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGFycmF5WzFdID09IGZvb1ZhbHVlcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmYWlsKCJSZXR1cm5lZCB2YWx1ZXMgd2VyZSBjb3JydXB0ZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbXVsdGlwYXJ0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvbXVsdGlwYXJ0L1N0cmluZ0tleUlnbm9yZUNhc2VNdWx0aXZhbHVlZE1hcEFzSGVhZGVyc01hcFRlc3QuamF2YSBiL21lZGlhL211bHRpcGFydC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9TdHJpbmdLZXlJZ25vcmVDYXNlTXVsdGl2YWx1ZWRNYXBBc0hlYWRlcnNNYXBUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBlYWVlZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL211bHRpcGFydC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9TdHJpbmdLZXlJZ25vcmVDYXNlTXVsdGl2YWx1ZWRNYXBBc0hlYWRlcnNNYXBUZXN0LmphdmEKQEAgLTAsMCArMSwzOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5TdHJpbmdLZXlJZ25vcmVDYXNlTXVsdGl2YWx1ZWRNYXA7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiBVbml0IHRlc3RzIGZvciB7QGxpbmsgU3RyaW5nS2V5SWdub3JlQ2FzZU11bHRpdmFsdWVkTWFwfS4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIFN0cmluZ0tleUlnbm9yZUNhc2VNdWx0aXZhbHVlZE1hcEFzSGVhZGVyc01hcFRlc3QgeworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG1hcCA9IG5ldyBTdHJpbmdLZXlJZ25vcmVDYXNlTXVsdGl2YWx1ZWRNYXAoKTsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBtYXAgPSBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nS2V5SWdub3JlQ2FzZU11bHRpdmFsdWVkTWFwIG1hcDsKKworICAgIC8qKgorICAgICAqIFRlc3Qgb2YgYWRkIG1ldGhvZCwgb2YgY2xhc3MgSGVhZGVyc01hcC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBZGQoKSB7CisgICAgICAgIG1hcC5hZGQoImZvbyIsICJiYXIiKTsKKyAgICAgICAgTGlzdCB2YWx1ZXMgPSBtYXAuZ2V0KCJmb28iKTsKKworICAgICAgICBhc3NlcnROb3ROdWxsKHZhbHVlcyk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCB2YWx1ZXMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYXIiLCB2YWx1ZXMuZ2V0KDApKTsKKworICAgICAgICBtYXAuYWRkKCJmb28iLCAiYmF6Iik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1hcC5zaXplKCkpOworICAgICAgICB2YWx1ZXMgPSBtYXAuZ2V0KCJmb28iKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHZhbHVlcy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImJhciIsIHZhbHVlcy5nZXQoMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImJheiIsIHZhbHVlcy5nZXQoMSkpOworCisgICAgICAgIG1hcC5hZGQoImJvcCIsICJib28iKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbWFwLnNpemUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBvZiBjbGVhciBtZXRob2QsIG9mIGNsYXNzIEhlYWRlcnNNYXAuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXIoKSB7CisgICAgICAgIG1hcC5hZGQoImZvbyIsICJiYXIiKTsKKyAgICAgICAgbWFwLmFkZCgiYmF6IiwgImJvcCIpOworCisgICAgICAgIGFzc2VydFRydWUoIW1hcC5pc0VtcHR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbWFwLnNpemUoKSk7CisKKyAgICAgICAgbWFwLmNsZWFyKCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1hcC5zaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKG1hcC5pc0VtcHR5KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgb2YgY29udGFpbnNLZXkgbWV0aG9kLCBvZiBjbGFzcyBIZWFkZXJzTWFwLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbnRhaW5zS2V5KCkgeworICAgICAgICBtYXAuYWRkKCJmb28iLCAiYmFyIik7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShtYXAuY29udGFpbnNLZXkoImZvbyIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtYXAuY29udGFpbnNLZXkoIkZPTyIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtYXAuY29udGFpbnNLZXkoIkZvbyIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtYXAuY29udGFpbnNLZXkoImZPbyIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtYXAuY29udGFpbnNLZXkoImZvTyIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghbWFwLmNvbnRhaW5zS2V5KCJiYXIiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBvZiBjb250YWluc1ZhbHVlIG1ldGhvZCwgb2YgY2xhc3MgSGVhZGVyc01hcC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb250YWluc1ZhbHVlKCkgeworICAgICAgICBMaXN0IHZhbHVlcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgdmFsdWVzLmFkZCgiYmFyIik7CisgICAgICAgIHZhbHVlcy5hZGQoImJvcCIpOworCisgICAgICAgIG1hcC5wdXQoImZvbyIsIHZhbHVlcyk7CisgICAgICAgIGFzc2VydFRydWUobWFwLmNvbnRhaW5zVmFsdWUodmFsdWVzKSk7CisKKyAgICAgICAgbWFwLmNsZWFyKCk7CisgICAgICAgIGFzc2VydFRydWUoIW1hcC5jb250YWluc1ZhbHVlKHZhbHVlcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgb2YgZW50cnlTZXQgbWV0aG9kLCBvZiBjbGFzcyBIZWFkZXJzTWFwLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVudHJ5U2V0KCkgeworICAgICAgICBMaXN0IHZhbHVlc0ZvbyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgdmFsdWVzRm9vLmFkZCgiZm9vMSIpOworICAgICAgICB2YWx1ZXNGb28uYWRkKCJmb28yIik7CisKKyAgICAgICAgbWFwLnB1dCgiZm9vIiwgdmFsdWVzRm9vKTsKKworICAgICAgICBMaXN0IHZhbHVlc0JhciA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgdmFsdWVzQmFyLmFkZCgiYmFyMSIpOworICAgICAgICB2YWx1ZXNCYXIuYWRkKCJiYXIyIik7CisKKyAgICAgICAgbWFwLnB1dCgiYmFyIiwgdmFsdWVzQmFyKTsKKworICAgICAgICBTZXQ8RW50cnk8U3RyaW5nLCBMaXN0PFN0cmluZz4+PiBlbnRyeVNldCA9IG1hcC5lbnRyeVNldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgZW50cnlTZXQuc2l6ZSgpKTsKKworICAgICAgICAvLyBUT0RPIC0gZGV0YWlsZWQgdGVzdHMgZm9yIHRoZSBIZWFkZXJzRW50cmllcyBtZXRob2RzCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzQW5kSGFzaENvZGUoKSB7CisgICAgICAgIFN0cmluZ0tleUlnbm9yZUNhc2VNdWx0aXZhbHVlZE1hcCBtYXAyID0gbmV3IFN0cmluZ0tleUlnbm9yZUNhc2VNdWx0aXZhbHVlZE1hcCgpOworCisgICAgICAgIExpc3QgdmFsdWVzRm9vID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICB2YWx1ZXNGb28uYWRkKCJmb28xIik7CisgICAgICAgIHZhbHVlc0Zvby5hZGQoImZvbzIiKTsKKworICAgICAgICBtYXAucHV0KCJmb28iLCB2YWx1ZXNGb28pOworICAgICAgICBtYXAyLnB1dCgiZm9vIiwgdmFsdWVzRm9vKTsKKworICAgICAgICBMaXN0IHZhbHVlc0JhciA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgdmFsdWVzQmFyLmFkZCgiYmFyMSIpOworICAgICAgICB2YWx1ZXNCYXIuYWRkKCJiYXIyIik7CisKKyAgICAgICAgbWFwLnB1dCgiYmFyIiwgdmFsdWVzQmFyKTsKKyAgICAgICAgbWFwMi5wdXQoImJhciIsIHZhbHVlc0Jhcik7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShtYXAuZXF1YWxzKG1hcDIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtYXAyLmVxdWFscyhtYXApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1hcC5oYXNoQ29kZSgpLCBtYXAyLmhhc2hDb2RlKCkpOworCisgICAgICAgIG1hcDIucmVtb3ZlKCJiYXIiKTsKKworICAgICAgICBhc3NlcnRUcnVlKCFtYXAuZXF1YWxzKG1hcDIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghbWFwMi5lcXVhbHMobWFwKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBvZiBnZXQgbWV0aG9kLCBvZiBjbGFzcyBIZWFkZXJzTWFwLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldCgpIHsKKyAgICAgICAgbWFwLmFkZCgiZm9vIiwgImJhciIpOworICAgICAgICBhc3NlcnROb3ROdWxsKG1hcC5nZXQoImZvbyIpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtYXAuZ2V0KCJGT08iKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwobWFwLmdldCgiRm9vIikpOworICAgICAgICBhc3NlcnROb3ROdWxsKG1hcC5nZXQoImZPbyIpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChtYXAuZ2V0KCJmb08iKSk7CisgICAgICAgIGFzc2VydE51bGwobWFwLmdldCgiYmFyIikpOworCisgICAgICAgIExpc3QgdmFsdWVzID0gbWFwLmdldCgiZm9vIik7CisgICAgICAgIGFzc2VydE5vdE51bGwodmFsdWVzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHZhbHVlcy5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImJhciIsIHZhbHVlcy5nZXQoMCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgb2YgZ2V0Rmlyc3QgbWV0aG9kLCBvZiBjbGFzcyBIZWFkZXJzTWFwLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEZpcnN0KCkgeworICAgICAgICBtYXAuYWRkKCJmb28iLCAiYmFyIik7CisgICAgICAgIG1hcC5hZGQoImZvbyIsICJiYXoiKTsKKyAgICAgICAgbWFwLmFkZCgiZm9vIiwgImJvcCIpOworCisgICAgICAgIGFzc2VydEVxdWFscygzLCBtYXAuZ2V0KCJmb28iKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImJhciIsIG1hcC5nZXRGaXJzdCgiZm9vIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgb2YgaXNFbXB0eSBtZXRob2QsIG9mIGNsYXNzIEhlYWRlcnNNYXAuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SXNFbXB0eSgpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtYXAuaXNFbXB0eSgpKTsKKworICAgICAgICBtYXAuYWRkKCJmb28iLCAiYmFyIik7CisgICAgICAgIGFzc2VydFRydWUoIW1hcC5pc0VtcHR5KCkpOworCisgICAgICAgIG1hcC5jbGVhcigpOworICAgICAgICBhc3NlcnRUcnVlKG1hcC5pc0VtcHR5KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgb2Yga2V5U2V0IG1ldGhvZCwgb2YgY2xhc3MgSGVhZGVyc01hcC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RLZXlTZXQoKSB7CisgICAgICAgIG1hcC5hZGQoImZvbyIsICJiYXIiKTsKKyAgICAgICAgbWFwLmFkZCgiYmF6IiwgImJvcCIpOworCisgICAgICAgIFNldDxTdHJpbmc+IGtleVNldCA9IG1hcC5rZXlTZXQoKTsKKworICAgICAgICBhc3NlcnROb3ROdWxsKGtleVNldCk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBrZXlTZXQuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShrZXlTZXQuY29udGFpbnMoImZvbyIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgha2V5U2V0LmNvbnRhaW5zKCJiYXIiKSk7CisgICAgICAgIGFzc2VydFRydWUoa2V5U2V0LmNvbnRhaW5zKCJiYXoiKSk7CisgICAgICAgIGFzc2VydFRydWUoIWtleVNldC5jb250YWlucygiYm9wIikpOworCisgICAgICAgIC8vIFRPRE8gLSBkZXRhaWxlZCB0ZXN0cyBmb3IgdGhlIEhlYWRlcnNLZXlzIG1ldGhvZHMKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IG9mIHB1dCBtZXRob2QsIG9mIGNsYXNzIEhlYWRlcnNNYXAuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0KCkgeworICAgICAgICBMaXN0IGZvb1ZhbHVlczEgPSBuZXcgQXJyYXlMaXN0KCk7CisgICAgICAgIGZvb1ZhbHVlczEuYWRkKCJmb28xIik7CisgICAgICAgIGZvb1ZhbHVlczEuYWRkKCJmb28yIik7CisKKyAgICAgICAgYXNzZXJ0TnVsbChtYXAuZ2V0KCJmb28iKSk7CisKKyAgICAgICAgbWFwLnB1dCgiZm9vIiwgZm9vVmFsdWVzMSk7CisgICAgICAgIGFzc2VydFRydWUobWFwLmNvbnRhaW5zS2V5KCJmb28iKSk7CisgICAgICAgIGFzc2VydFRydWUobWFwLmNvbnRhaW5zVmFsdWUoZm9vVmFsdWVzMSkpOworICAgICAgICBhc3NlcnRUcnVlKG1hcC5nZXQoImZvbyIpID09IGZvb1ZhbHVlczEpOworCisgICAgICAgIExpc3QgZm9vVmFsdWVzMiA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgZm9vVmFsdWVzMi5hZGQoImZvbzMiKTsKKyAgICAgICAgZm9vVmFsdWVzMi5hZGQoImZvbzQiKTsKKyAgICAgICAgbWFwLnB1dCgiZm9vIiwgZm9vVmFsdWVzMik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1hcC5zaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKG1hcC5jb250YWluc0tleSgiZm9vIikpOworICAgICAgICBhc3NlcnRUcnVlKCFtYXAuY29udGFpbnNWYWx1ZShmb29WYWx1ZXMxKSk7CisgICAgICAgIGFzc2VydFRydWUobWFwLmNvbnRhaW5zVmFsdWUoZm9vVmFsdWVzMikpOworICAgICAgICBhc3NlcnRUcnVlKG1hcC5nZXQoImZvbyIpID09IGZvb1ZhbHVlczIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgb2YgcHV0QWxsIG1ldGhvZCwgb2YgY2xhc3MgSGVhZGVyc01hcC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQdXRBbGwoKSB7CisgICAgICAgIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gYWxsID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBMaXN0IGZvb1ZhbHVlcyA9IG5ldyBBcnJheUxpc3QoKTsKKyAgICAgICAgZm9vVmFsdWVzLmFkZCgiZm9vMSIpOworICAgICAgICBmb29WYWx1ZXMuYWRkKCJmb28yIik7CisgICAgICAgIGFsbC5wdXQoImZvbyIsIGZvb1ZhbHVlcyk7CisgICAgICAgIExpc3QgYmFyVmFsdWVzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICBiYXJWYWx1ZXMuYWRkKCJiYXIxIik7CisgICAgICAgIGJhclZhbHVlcy5hZGQoImJhcjIiKTsKKyAgICAgICAgYWxsLnB1dCgiYmFyIiwgYmFyVmFsdWVzKTsKKworICAgICAgICBhc3NlcnRUcnVlKG1hcC5pc0VtcHR5KCkpOworCisgICAgICAgIG1hcC5wdXRBbGwoYWxsKTsKKworICAgICAgICBhc3NlcnRUcnVlKCFtYXAuaXNFbXB0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG1hcC5zaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKG1hcC5jb250YWluc0tleSgiZm9vIikpOworICAgICAgICBhc3NlcnRUcnVlKG1hcC5jb250YWluc0tleSgiYmFyIikpOworICAgICAgICBhc3NlcnRUcnVlKG1hcC5jb250YWluc1ZhbHVlKGZvb1ZhbHVlcykpOworICAgICAgICBhc3NlcnRUcnVlKG1hcC5jb250YWluc1ZhbHVlKGJhclZhbHVlcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgb2YgcHV0U2luZ2xlIG1ldGhvZCwgb2YgY2xhc3MgSGVhZGVyc01hcC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQdXRTaW5nbGUoKSB7CisgICAgICAgIExpc3QgdmFsdWVzID0gbmV3IEFycmF5TGlzdCgpOworICAgICAgICB2YWx1ZXMuYWRkKCJiYXIiKTsKKyAgICAgICAgdmFsdWVzLmFkZCgiYmF6Iik7CisgICAgICAgIG1hcC5wdXQoImZvbyIsIHZhbHVlcyk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtYXAuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG1hcC5nZXQoImZvbyIpLnNpemUoKSk7CisgICAgICAgIG1hcC5wdXRTaW5nbGUoImZvbyIsICJib3AiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1hcC5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbWFwLmdldCgiZm9vIikuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJib3AiLCBtYXAuZ2V0KCJmb28iKS5nZXQoMCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgb2YgcmVtb3ZlIG1ldGhvZCwgb2YgY2xhc3MgSGVhZGVyc01hcC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7CisgICAgICAgIG1hcC5hZGQoImZvbyIsICJiYXIiKTsKKyAgICAgICAgbWFwLmFkZCgiYmF6IiwgImJvcCIpOworCisgICAgICAgIGFzc2VydEVxdWFscygyLCBtYXAuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtYXAuY29udGFpbnNLZXkoImZvbyIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtYXAuY29udGFpbnNLZXkoImJheiIpKTsKKworICAgICAgICBtYXAucmVtb3ZlKCJmb28iKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbWFwLnNpemUoKSk7CisgICAgICAgIGFzc2VydFRydWUoIW1hcC5jb250YWluc0tleSgiZm9vIikpOworICAgICAgICBhc3NlcnRUcnVlKG1hcC5jb250YWluc0tleSgiYmF6IikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgb2Ygc2l6ZSBtZXRob2QsIG9mIGNsYXNzIEhlYWRlcnNNYXAuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1hcC5zaXplKCkpOworCisgICAgICAgIG1hcC5hZGQoImZvbyIsICJiYXIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1hcC5zaXplKCkpOworCisgICAgICAgIG1hcC5hZGQoImZvbyIsICJhcmciKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1hcC5zaXplKCkpOworCisgICAgICAgIG1hcC5hZGQoImJheiIsICJib3AiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG1hcC5zaXplKCkpOworCisgICAgICAgIG1hcC5yZW1vdmUoImJheiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbWFwLnNpemUoKSk7CisKKyAgICAgICAgbWFwLnJlbW92ZSgiZm9vIik7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtYXAuc2l6ZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IG9mIHZhbHVlcyBtZXRob2QsIG9mIGNsYXNzIEhlYWRlcnNNYXAuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsdWVzKCkgeworICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGFsbCA9IG5ldyBIYXNoTWFwPD4oKTsKKworICAgICAgICBMaXN0PFN0cmluZz4gZm9vVmFsdWVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZvb1ZhbHVlcy5hZGQoImZvbzEiKTsKKyAgICAgICAgZm9vVmFsdWVzLmFkZCgiZm9vMiIpOworICAgICAgICBhbGwucHV0KCJmb28iLCBmb29WYWx1ZXMpOworCisgICAgICAgIExpc3Q8U3RyaW5nPiBiYXJWYWx1ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgYmFyVmFsdWVzLmFkZCgiYmFyMSIpOworICAgICAgICBiYXJWYWx1ZXMuYWRkKCJiYXIyIik7CisgICAgICAgIGFsbC5wdXQoImJhciIsIGJhclZhbHVlcyk7CisKKyAgICAgICAgbWFwLnB1dEFsbChhbGwpOworICAgICAgICBDb2xsZWN0aW9uPExpc3Q8U3RyaW5nPj4gdmFsdWVzID0gbWFwLnZhbHVlcygpOworCisgICAgICAgIGFzc2VydE5vdE51bGwodmFsdWVzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHZhbHVlcy5zaXplKCkpOworCisgICAgICAgIExpc3QgYXJyYXlbXSA9IG5ldyBMaXN0WzJdOworICAgICAgICBhcnJheSA9IHZhbHVlcy50b0FycmF5KGFycmF5KTsKKworICAgICAgICBpZiAoYXJyYXlbMF0gPT0gZm9vVmFsdWVzKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGFycmF5WzFdID09IGJhclZhbHVlcyk7CisgICAgICAgIH0gZWxzZSBpZiAoYXJyYXlbMF0gPT0gYmFyVmFsdWVzKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGFycmF5WzFdID09IGZvb1ZhbHVlcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmYWlsKCJSZXR1cm5lZCB2YWx1ZXMgd2VyZSBjb3JydXB0ZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbXVsdGlwYXJ0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvbXVsdGlwYXJ0L2ZpbGUvRmlsZURhdGFCb2R5UGFydFRlc3QuamF2YSBiL21lZGlhL211bHRpcGFydC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9maWxlL0ZpbGVEYXRhQm9keVBhcnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ1NWU3ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL211bHRpcGFydC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9maWxlL0ZpbGVEYXRhQm9keVBhcnRUZXN0LmphdmEKQEAgLTAsMCArMSwxMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LmZpbGU7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5Cb2R5UGFydFRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIFRlc3QgY2FzZSBmb3Ige0BsaW5rIEZpbGVEYXRhQm9keVBhcnR9LgorICoKKyAqIEBhdXRob3IgSW1yYW4gTSBZb3VzdWYgKGltcmFuIGF0IHNtYXJ0aXRlbmdpbmVlcmluZy5jb20pCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEZpbGVEYXRhQm9keVBhcnRUZXN0IGV4dGVuZHMgQm9keVBhcnRUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBib2R5UGFydCA9IG5ldyBGaWxlRGF0YUJvZHlQYXJ0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYm9keVBhcnQgPSBudWxsOworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVudGl0eSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJvZHlQYXJ0LnNldEVudGl0eSgiZm9vIGJhciBiYXoiKTsKKyAgICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICAvLyBleGNlcHRpb24gZXhwZWN0ZWQuCisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVGREJQKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEZpbGVEYXRhQm9keVBhcnQgZmRicCA9IChGaWxlRGF0YUJvZHlQYXJ0KSBib2R5UGFydDsKKyAgICAgICAgYXNzZXJ0TnVsbChmZGJwLmdldEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uKCkpOworICAgICAgICBhc3NlcnROdWxsKGZkYnAuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChmZGJwLmdldFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUcnVlKGZkYnAuaXNTaW1wbGUoKSk7CisgICAgICAgIFN0cmluZyBuYW1lOworCisgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKCJwb20ueG1sIik7CisgICAgICAgIG5hbWUgPSAieG1sIjsKKyAgICAgICAgZmRicCA9IG5ldyBGaWxlRGF0YUJvZHlQYXJ0KG5hbWUsIGZpbGUpOworICAgICAgICBNZWRpYVR5cGUgZXhwZWN0ZWRUeXBlID0gTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTF9UWVBFOworICAgICAgICBjaGVja0VudGl0eUF0dHJpYnV0ZXMobmFtZSwgZmRicCwgZmlsZSwgZXhwZWN0ZWRUeXBlKTsKKyAgICAgICAgZmRicC5zZXROYW1lKG5hbWUpOworICAgICAgICBjaGVja0VudGl0eUF0dHJpYnV0ZXMobmFtZSwgZmRicCwgZmlsZSwgZXhwZWN0ZWRUeXBlKTsKKyAgICAgICAgZmRicC5zZXRGaWxlRW50aXR5KGZpbGUpOworICAgICAgICBjaGVja0VudGl0eUF0dHJpYnV0ZXMobmFtZSwgZmRicCwgZmlsZSwgZXhwZWN0ZWRUeXBlKTsKKworICAgICAgICBmZGJwID0gbmV3IEZpbGVEYXRhQm9keVBhcnQobmFtZSwgZmlsZSwgZXhwZWN0ZWRUeXBlKTsKKyAgICAgICAgY2hlY2tFbnRpdHlBdHRyaWJ1dGVzKG5hbWUsIGZkYnAsIGZpbGUsIGV4cGVjdGVkVHlwZSk7CisgICAgICAgIGZkYnAuc2V0RmlsZUVudGl0eShmaWxlLCBleHBlY3RlZFR5cGUpOworICAgICAgICBjaGVja0VudGl0eUF0dHJpYnV0ZXMobmFtZSwgZmRicCwgZmlsZSwgZXhwZWN0ZWRUeXBlKTsKKworICAgICAgICBmaWxlID0gbmV3IEZpbGUoInBvbS5wbmciKTsKKyAgICAgICAgbmFtZSA9ICJwbmciOworICAgICAgICBmZGJwID0gbmV3IEZpbGVEYXRhQm9keVBhcnQoInBuZyIsIGZpbGUpOworICAgICAgICBleHBlY3RlZFR5cGUgPSBEZWZhdWx0TWVkaWFUeXBlUHJlZGljdG9yLkNvbW1vbk1lZGlhVHlwZXMuUE5HLmdldE1lZGlhVHlwZSgpOworICAgICAgICBjaGVja0VudGl0eUF0dHJpYnV0ZXMobmFtZSwgZmRicCwgZmlsZSwgZXhwZWN0ZWRUeXBlKTsKKworICAgICAgICBmaWxlID0gbmV3IEZpbGUoInBvbS56aXAiKTsKKyAgICAgICAgZmRicCA9IG5ldyBGaWxlRGF0YUJvZHlQYXJ0KG5hbWUsIGZpbGUpOworICAgICAgICBleHBlY3RlZFR5cGUgPSBEZWZhdWx0TWVkaWFUeXBlUHJlZGljdG9yLkNvbW1vbk1lZGlhVHlwZXMuWklQLmdldE1lZGlhVHlwZSgpOworICAgICAgICBjaGVja0VudGl0eUF0dHJpYnV0ZXMobmFtZSwgZmRicCwgZmlsZSwgZXhwZWN0ZWRUeXBlKTsKKworICAgICAgICBmaWxlID0gbmV3IEZpbGUoInBvbS5hdmkiKTsKKyAgICAgICAgZmRicCA9IG5ldyBGaWxlRGF0YUJvZHlQYXJ0KG5hbWUsIGZpbGUpOworICAgICAgICBleHBlY3RlZFR5cGUgPSBEZWZhdWx0TWVkaWFUeXBlUHJlZGljdG9yLkNvbW1vbk1lZGlhVHlwZXMuQVZJLmdldE1lZGlhVHlwZSgpOworICAgICAgICBjaGVja0VudGl0eUF0dHJpYnV0ZXMobmFtZSwgZmRicCwgZmlsZSwgZXhwZWN0ZWRUeXBlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tFbnRpdHlBdHRyaWJ1dGVzKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBGaWxlRGF0YUJvZHlQYXJ0IGZkYnAsIGZpbmFsIEZpbGUgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBleHBlY3RlZFR5cGUpIHsKKyAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG5hbWUsIGZkYnAuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhuYW1lLCBmZGJwLmdldEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhmaWxlLmdldE5hbWUoKSwgZmRicC5nZXRDb250ZW50RGlzcG9zaXRpb24oKS5nZXRGaWxlTmFtZSgpKTsKKyAgICAgICAgICAgIGlmIChmaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGZpbGUubGVuZ3RoKCksIGZkYnAuZ2V0Q29udGVudERpc3Bvc2l0aW9uKCkuZ2V0U2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZmlsZS5sYXN0TW9kaWZpZWQoKSwgZmRicC5nZXRDb250ZW50RGlzcG9zaXRpb24oKS5nZXRNb2RpZmljYXRpb25EYXRlKCkuZ2V0VGltZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBmZGJwLmdldENvbnRlbnREaXNwb3NpdGlvbigpLmdldFNpemUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhc3NlcnROdWxsKGZkYnAuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGFzc2VydE51bGwoZmRicC5nZXRGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbigpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoZmlsZSwgZmRicC5nZXRFbnRpdHkoKSk7CisgICAgICAgIGFzc2VydFRydWUoIWZkYnAuaXNTaW1wbGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFR5cGUsIGZkYnAuZ2V0TWVkaWFUeXBlKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbXVsdGlwYXJ0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvbXVsdGlwYXJ0L2ZpbGUvU3RyZWFtRGF0YUJvZHlQYXJ0VGVzdC5qYXZhIGIvbWVkaWEvbXVsdGlwYXJ0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvbXVsdGlwYXJ0L2ZpbGUvU3RyZWFtRGF0YUJvZHlQYXJ0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYTcwMmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdWx0aXBhcnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9tdWx0aXBhcnQvZmlsZS9TdHJlYW1EYXRhQm9keVBhcnRUZXN0LmphdmEKQEAgLTAsMCArMSwzMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LmZpbGU7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5Cb2R5UGFydFRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LkNvbnRlbnREaXNwb3NpdGlvbjsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICogVGVzdHMgZm9yIHRoZSB7QGxpbmsgU3RyZWFtRGF0YUJvZHlQYXJ0fSBjbGFzcyB3aGljaCBjaGVja3MgdGhlIGNsYXNzJyBtYWluCisgKiBjb250cmFjdCBhbmQgbmV3IGZ1bmN0aW9uYWxpdHkuCisgKgorICogQGF1dGhvciBQZWRybyBLb3dhbHNraSAocGFsbGlwcCBhdCBnbWFpbC5jb20pCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqCisgKiBAc2VlIFN0cmVhbURhdGFCb2R5UGFydAorICogQHNlZSBGaWxlRGF0YUJvZHlQYXJ0VGVzdAorICovCitwdWJsaWMgY2xhc3MgU3RyZWFtRGF0YUJvZHlQYXJ0VGVzdCBleHRlbmRzIEJvZHlQYXJ0VGVzdCB7CisKKyAgICAvKioKKyAgICAgKiBDbGFzcyB1bmRlciB0ZXN0LgorICAgICAqLworICAgIHByaXZhdGUgU3RyZWFtRGF0YUJvZHlQYXJ0IGN1dDsKKworICAgIEBPdmVycmlkZQorICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICBjdXQgPSBuZXcgU3RyZWFtRGF0YUJvZHlQYXJ0KCk7CisKKyAgICAgICAgLy8gTmVlZGVkIGZvciBpbmhlcml0ZWQgdGVzdHMuCisgICAgICAgIGJvZHlQYXJ0ID0gY3V0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGJvZHlQYXJ0ID0gbnVsbDsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBOb3Qgc3VwcG9ydGVkIG1ldGhvZHMKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIEBPdmVycmlkZQorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVudGl0eSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJvZHlQYXJ0LnNldEVudGl0eSgiZm9vIik7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZCBleGNlcHRpb24uCisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZVN0cmluZygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGN1dC5zZXRWYWx1ZSgiZm9vIik7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZCBleGNlcHRpb24uCisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZU1lZGlhVHlwZU9iamVjdCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIFVzZSBhbnkgTWVkaWFUeXBlIGFuZCB2YWx1ZSAtIHRoZXkgZG9lc24ndCBtYXR0ZXIuCisgICAgICAgICAgICBjdXQuc2V0VmFsdWUoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX09DVEVUX1NUUkVBTV9UWVBFLCBuZXcgT2JqZWN0KCkpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQgZXhjZXB0aW9uLgorICAgICAgICB9CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gQ29uc3RydWN0b3IgdGVzdHMKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVN0cmVhbUVudGl0eU5hbWVTdHJlYW0oKSB7CisgICAgICAgIFN0cmluZyBleHBlY3RlZE5hbWUgPSAiZm9vIjsKKyAgICAgICAgTWVkaWFUeXBlIGV4cGVjdGVkTWVkaWFUeXBlID0gU3RyZWFtRGF0YUJvZHlQYXJ0LmdldERlZmF1bHRNZWRpYVR5cGUoKTsKKworICAgICAgICBjdXQgPSBuZXcgU3RyZWFtRGF0YUJvZHlQYXJ0KGV4cGVjdGVkTmFtZSwgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlW10ge30pKTsKKworICAgICAgICBib29sZWFuIGFjdHVhbElzU2ltcGxlQm9keVBhcnQgPSBjdXQuaXNTaW1wbGUoKTsKKyAgICAgICAgU3RyaW5nIGFjdHVhbE5hbWUgPSBjdXQuZ2V0TmFtZSgpOworCisgICAgICAgIC8vIEZpbGVuYW1lIGFuZCBtZWRpYVR5cGUgYXJlIHRvIGJlIHRoZSBkZWZhdWx0IG9uZXMuCisgICAgICAgIFN0cmluZyBhY3R1YWxGaWxlbmFtZSA9IGN1dC5nZXRGaWxlbmFtZSgpOworICAgICAgICBNZWRpYVR5cGUgYWN0dWFsTWVkaWFUeXBlID0gY3V0LmdldE1lZGlhVHlwZSgpOworCisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZE5hbWUsIGFjdHVhbE5hbWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRNZWRpYVR5cGUsIGFjdHVhbE1lZGlhVHlwZSk7CisgICAgICAgIGFzc2VydE51bGwoYWN0dWFsRmlsZW5hbWUpOworICAgICAgICBhc3NlcnRGYWxzZShhY3R1YWxJc1NpbXBsZUJvZHlQYXJ0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVTdHJlYW1FbnRpdHlOYW1lU3RyZWFtRmlsZW5hbWUoKSB7CisgICAgICAgIFN0cmluZyBleHBlY3RlZE5hbWUgPSAiZm9vIjsKKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkRmlsZW5hbWUgPSAiYmFyLnR4dCI7CisgICAgICAgIE1lZGlhVHlwZSBleHBlY3RlZE1lZGlhVHlwZSA9IFN0cmVhbURhdGFCb2R5UGFydC5nZXREZWZhdWx0TWVkaWFUeXBlKCk7CisKKyAgICAgICAgY3V0ID0gbmV3IFN0cmVhbURhdGFCb2R5UGFydChleHBlY3RlZE5hbWUsIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVtdIHt9KSwgZXhwZWN0ZWRGaWxlbmFtZSk7CisKKyAgICAgICAgYm9vbGVhbiBhY3R1YWxJc1NpbXBsZUJvZHlQYXJ0ID0gY3V0LmlzU2ltcGxlKCk7CisgICAgICAgIFN0cmluZyBhY3R1YWxOYW1lID0gY3V0LmdldE5hbWUoKTsKKyAgICAgICAgU3RyaW5nIGFjdHVhbEZpbGVuYW1lID0gY3V0LmdldEZpbGVuYW1lKCk7CisKKyAgICAgICAgLy8gTWVkaWFUeXBlIGlzIHRvIGJlIHRoZSBkZWZhdWx0IG9uZS4KKyAgICAgICAgTWVkaWFUeXBlIGFjdHVhbE1lZGlhVHlwZSA9IGN1dC5nZXRNZWRpYVR5cGUoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWROYW1lLCBhY3R1YWxOYW1lKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkTWVkaWFUeXBlLCBhY3R1YWxNZWRpYVR5cGUpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRGaWxlbmFtZSwgYWN0dWFsRmlsZW5hbWUpOworICAgICAgICBhc3NlcnRGYWxzZShhY3R1YWxJc1NpbXBsZUJvZHlQYXJ0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVTdHJlYW1FbnRpdHkoKSB7CisgICAgICAgIFN0cmluZyBleHBlY3RlZE5hbWUgPSAiZm9vIjsKKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkRmlsZW5hbWUgPSAiYmFyLnR4dCI7CisgICAgICAgIE1lZGlhVHlwZSBleHBlY3RlZE1lZGlhVHlwZSA9IE1lZGlhVHlwZS5URVhUX0hUTUxfVFlQRTsKKworICAgICAgICBjdXQgPSBuZXcgU3RyZWFtRGF0YUJvZHlQYXJ0KGV4cGVjdGVkTmFtZSwgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlW10ge30pLCBleHBlY3RlZEZpbGVuYW1lLCBleHBlY3RlZE1lZGlhVHlwZSk7CisKKyAgICAgICAgLy8gQWxsIHBhcmFtZXRlcnMgbXVzdCBiZSBzZXQgYXMgdGhlIHVzZXIgcmVxdWVzdGVkLiBObyBkZWZhdWx0cy4KKyAgICAgICAgYm9vbGVhbiBhY3R1YWxJc1NpbXBsZUJvZHlQYXJ0ID0gY3V0LmlzU2ltcGxlKCk7CisgICAgICAgIFN0cmluZyBhY3R1YWxOYW1lID0gY3V0LmdldE5hbWUoKTsKKyAgICAgICAgU3RyaW5nIGFjdHVhbEZpbGVuYW1lID0gY3V0LmdldEZpbGVuYW1lKCk7CisgICAgICAgIE1lZGlhVHlwZSBhY3R1YWxNZWRpYVR5cGUgPSBjdXQuZ2V0TWVkaWFUeXBlKCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkTmFtZSwgYWN0dWFsTmFtZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZE1lZGlhVHlwZSwgYWN0dWFsTWVkaWFUeXBlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkRmlsZW5hbWUsIGFjdHVhbEZpbGVuYW1lKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoYWN0dWFsSXNTaW1wbGVCb2R5UGFydCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlU3RyZWFtRW50aXR5TnVsbE5hbWUoKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgU3RyZWFtRGF0YUJvZHlQYXJ0KG51bGwsIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVtdIHt9KSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQgZXhjZXB0aW9uLgorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlU3RyZWFtRW50aXR5TnVsbFN0cmVhbSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBTdHJlYW1EYXRhQm9keVBhcnQoImZvbyIsIG51bGwpOworICAgICAgICAgICAgZmFpbCgpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkIGV4Y2VwdGlvbi4KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVN0cmVhbUVudGl0eU51bGxNZWRpYVR5cGUoKSB7CisgICAgICAgIE1lZGlhVHlwZSBleHBlY3RlZE1lZGlhVHlwZSA9IFN0cmVhbURhdGFCb2R5UGFydC5nZXREZWZhdWx0TWVkaWFUeXBlKCk7CisKKyAgICAgICAgLy8gTWVkaWFUeXBlIGlzIG51bGxhYmxlIC0gaXQgdGFrZXMgdGhlIGRlZmF1bHQgdmFsdWUgaW4gc3VjaCBzaXR1YXRpb24uCisgICAgICAgIGN1dCA9IG5ldyBTdHJlYW1EYXRhQm9keVBhcnQoImZvbyIsIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVtdIHt9KSwgImJhci50eHQiLCBudWxsKTsKKworICAgICAgICBNZWRpYVR5cGUgYWN0dWFsTWVkaWFUeXBlID0gY3V0LmdldE1lZGlhVHlwZSgpOworCisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZE1lZGlhVHlwZSwgYWN0dWFsTWVkaWFUeXBlKTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBDb250ZW50IGRpc3Bvc2l0aW9uIGJ1aWxkaW5nIHRlc3RzCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCdWlsZENvbnRlbnREaXNwb3NpdGlvbigpIHsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSAiZm9vIjsKKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkVHlwZSA9ICJmb3JtLWRhdGEiOworICAgICAgICBTdHJpbmcgZXhwZWN0ZWRGaWxlbmFtZSA9ICJiYXIudHh0IjsKKworICAgICAgICBjdXQuc2V0TmFtZShuYW1lKTsKKyAgICAgICAgY3V0LnNldEZpbGVuYW1lKGV4cGVjdGVkRmlsZW5hbWUpOworCisgICAgICAgIENvbnRlbnREaXNwb3NpdGlvbiBhY3R1YWwgPSBjdXQuYnVpbGRDb250ZW50RGlzcG9zaXRpb24oKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRUeXBlLCBhY3R1YWwuZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkRmlsZW5hbWUsIGFjdHVhbC5nZXRGaWxlTmFtZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCdWlsZENvbnRlbnREaXNwb3NpdGlvbldpdGhvdXRGaWxlbmFtZSgpIHsKKyAgICAgICAgU3RyaW5nIG5hbWUgPSAiZm9vIjsKKyAgICAgICAgU3RyaW5nIGV4cGVjdGVkVHlwZSA9ICJmb3JtLWRhdGEiOworICAgICAgICBTdHJpbmcgZXhwZWN0ZWRGaWxlbmFtZSA9ICJmb28iOworCisgICAgICAgIGN1dC5zZXROYW1lKG5hbWUpOworCisgICAgICAgIENvbnRlbnREaXNwb3NpdGlvbiBhY3R1YWwgPSBjdXQuYnVpbGRDb250ZW50RGlzcG9zaXRpb24oKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRUeXBlLCBhY3R1YWwuZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkRmlsZW5hbWUsIGFjdHVhbC5nZXRGaWxlTmFtZSgpKTsKKyAgICB9CisKKyAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAvLyBTdHJlYW0gZW50aXR5IHNldHRlciB0ZXN0cworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyZWFtRW50aXR5U3RyZWFtTWVkaWFUeXBlKCkgeworICAgICAgICBNZWRpYVR5cGUgZXhwZWN0ZWRNZWRpYVR5cGUgPSBNZWRpYVR5cGUuQVBQTElDQVRJT05fU1ZHX1hNTF9UWVBFOworICAgICAgICBJbnB1dFN0cmVhbSBleHBlY3RlZElucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlW10gezB4MDAyLCAweDAwM30pOworCisgICAgICAgIGFzc2VydFNldEVudGl0eVN0cmVhbShleHBlY3RlZE1lZGlhVHlwZSwgZXhwZWN0ZWRJbnB1dFN0cmVhbSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyZWFtRW50aXR5U3RyZWFtKCkgeworICAgICAgICBNZWRpYVR5cGUgZXhwZWN0ZWRNZWRpYVR5cGUgPSBTdHJlYW1EYXRhQm9keVBhcnQuZ2V0RGVmYXVsdE1lZGlhVHlwZSgpOworICAgICAgICBJbnB1dFN0cmVhbSBleHBlY3RlZElucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5ldyBieXRlW10gezB4MDAyLCAweDAwM30pOworCisgICAgICAgIGFzc2VydFNldEVudGl0eVN0cmVhbShleHBlY3RlZE1lZGlhVHlwZSwgZXhwZWN0ZWRJbnB1dFN0cmVhbSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyZWFtRW50aXR5U3RyZWFtTnVsbFN0cmVhbSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGN1dC5zZXRTdHJlYW1FbnRpdHkobnVsbCk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQgZXhjZXB0aW9uLgorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyZWFtRW50aXR5U3RyZWFtTnVsbE1lZGlhVHlwZSgpIHsKKyAgICAgICAgTWVkaWFUeXBlIGV4cGVjdGVkTWVkaWFUeXBlID0gU3RyZWFtRGF0YUJvZHlQYXJ0LmdldERlZmF1bHRNZWRpYVR5cGUoKTsKKworICAgICAgICAvLyBSZXF1aXJlZCB0byBzZXQgdGhlIGVudGl0eS4KKyAgICAgICAgY3V0LnNldE5hbWUoImZvbyIpOworCisgICAgICAgIC8vIE5vIGV4Y2VwdGlvbiBpcyB0byBiZSBvYnNlcnZlZCAtIE1lZGlhVHlwZSBzaG91bGQgYmUgdGhlIGRlZmF1bHQgb25lLgorICAgICAgICBjdXQuc2V0U3RyZWFtRW50aXR5KG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVtdIHt9KSwgbnVsbCk7CisKKyAgICAgICAgTWVkaWFUeXBlIGFjdHVhbE1lZGlhVHlwZSA9IGN1dC5nZXRNZWRpYVR5cGUoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRNZWRpYVR5cGUsIGFjdHVhbE1lZGlhVHlwZSk7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgLy8gTWlzYyB0ZXN0cworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RGVmYXVsdE1lZGlhVHlwZSgpIHsKKyAgICAgICAgTWVkaWFUeXBlIGV4cGVjdGVkID0gTWVkaWFUeXBlLkFQUExJQ0FUSU9OX09DVEVUX1NUUkVBTV9UWVBFOworICAgICAgICBNZWRpYVR5cGUgYWN0dWFsID0gU3RyZWFtRGF0YUJvZHlQYXJ0LmdldERlZmF1bHRNZWRpYVR5cGUoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSGVscGVyIGNsYXNzIGZvciBjaGVja2luZyBpZiB0aGUgc3RyZWFtIGVudGl0eSBoYXMgYmVlbiBwcm9wZXJseSBzZXQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXhwZWN0ZWRNZWRpYVR5cGUKKyAgICAgKiAgICAgICAgICAgIGFmdGVyIHRoZSBzdHJlYW0gZW50aXR5IGhhcyBiZWVuIHNldC4KKyAgICAgKiBAcGFyYW0gZXhwZWN0ZWRTdHJlYW1FbnRpdHkKKyAgICAgKiAgICAgICAgICAgIGFmdGVyIHRoZSBzdHJlYW0gZW50aXR5IGhhcyBiZWVuIHNldC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0U2V0RW50aXR5U3RyZWFtKE1lZGlhVHlwZSBleHBlY3RlZE1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGV4cGVjdGVkU3RyZWFtRW50aXR5KSB7CisKKyAgICAgICAgLy8gUmVxdWlyZWQgdG8gc2V0IHRoZSBlbnRpdHkuCisgICAgICAgIGN1dC5zZXROYW1lKCJmb28iKTsKKworICAgICAgICBjdXQuc2V0U3RyZWFtRW50aXR5KGV4cGVjdGVkU3RyZWFtRW50aXR5LCBleHBlY3RlZE1lZGlhVHlwZSk7CisKKyAgICAgICAgTWVkaWFUeXBlIGFjdHVhbE1lZGlhVHlwZSA9IGN1dC5nZXRNZWRpYVR5cGUoKTsKKyAgICAgICAgSW5wdXRTdHJlYW0gYWN0dWFsSW5wdXRTdHJlYW0gPSBjdXQuZ2V0U3RyZWFtRW50aXR5KCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RyZWFtRW50aXR5LCBhY3R1YWxJbnB1dFN0cmVhbSk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZE1lZGlhVHlwZSwgYWN0dWFsTWVkaWFUeXBlKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL21lZGlhL211bHRpcGFydC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9pbnRlcm5hbC9Gb3JtRGF0YU11bHRpUGFydEJ1ZmZlclRlc3QuamF2YSBiL21lZGlhL211bHRpcGFydC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9pbnRlcm5hbC9Gb3JtRGF0YU11bHRpUGFydEJ1ZmZlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWI2YjE0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXVsdGlwYXJ0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvbXVsdGlwYXJ0L2ludGVybmFsL0Zvcm1EYXRhTXVsdGlQYXJ0QnVmZmVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5QVVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5Gb3JtRGF0YU11bHRpUGFydDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCisvKioKKyAqIFRlc3QgY2FzZXMgZm9yIGluc3BlY3RpbmcgYW4ge0Bjb2RlIEZvcm1EYXRhTXVsdGlQYXJ0fSBlbnRpdHkgaW4gYSB7QGNvZGUgUmVxdWVzdEZpbHRlcn0gYW5kIGZvbGxvd2luZyBpbmplY3Rpb24gb2YgdGhpcworICogZW50aXR5IGludG8gYSByZXNvdXJjZSBtZXRob2QuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBGb3JtRGF0YU11bHRpUGFydEJ1ZmZlclRlc3QgZXh0ZW5kcyBNdWx0aVBhcnRKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiAoKFJlc291cmNlQ29uZmlnKSBzdXBlci5jb25maWd1cmUoKSkucmVnaXN0ZXJJbnN0YW5jZXMobmV3IE15RmlsdGVyKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTZXQ8Q2xhc3M8Pz4+IGdldFJlc291cmNlQ2xhc3NlcygpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbihDb25zdW1lc0Zvcm1EYXRhUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAoKENvbnRhaW5lclJlcXVlc3QpIGNvbnRleHQpLmJ1ZmZlckVudGl0eSgpOworCisgICAgICAgICAgICAvLyBSZWFkIGVudGl0eQorICAgICAgICAgICAgRm9ybURhdGFNdWx0aVBhcnQgbXVsdGlQYXJ0ID0gKChDb250YWluZXJSZXF1ZXN0KSBjb250ZXh0KS5yZWFkRW50aXR5KEZvcm1EYXRhTXVsdGlQYXJ0LmNsYXNzKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIG11bHRpUGFydC5nZXRCb2R5UGFydHMoKS5zaXplKCkpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChtdWx0aVBhcnQuZ2V0RmllbGQoImZvbyIpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiYmFyIiwgbXVsdGlQYXJ0LmdldEZpZWxkKCJmb28iKS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwobXVsdGlQYXJ0LmdldEZpZWxkKCJiYXoiKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImJvcCIsIG11bHRpUGFydC5nZXRGaWVsZCgiYmF6IikuZ2V0VmFsdWUoKSk7CisKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwobXVsdGlQYXJ0LmdldEZpZWxkKCJiZWFuIikpOworICAgICAgICAgICAgTXVsdGlQYXJ0QmVhbiBiZWFuID0gbXVsdGlQYXJ0LmdldEZpZWxkKCJiZWFuIikuZ2V0VmFsdWVBcyhNdWx0aVBhcnRCZWFuLmNsYXNzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygibXluYW1lIiwgYmVhbi5nZXROYW1lKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJteXZhbHVlIiwgYmVhbi5nZXRWYWx1ZSgpKTsKKworICAgICAgICAgICAgY29udGV4dC5zZXRQcm9wZXJ0eSgiZmlsdGVyZWQiLCAidHJ1ZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi9Db25zdW1lc0Zvcm1EYXRhUmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29uc3VtZXNGb3JtRGF0YVJlc291cmNlIHsKKworICAgICAgICBAUFVUCisgICAgICAgIEBDb25zdW1lcygibXVsdGlwYXJ0L2Zvcm0tZGF0YSIpCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXQoQENvbnRleHQgQ29udGFpbmVyUmVxdWVzdCByZXF1ZXN0LCBGb3JtRGF0YU11bHRpUGFydCBtdWx0aVBhcnQpIHsKKyAgICAgICAgICAgIE9iamVjdCBwID0gcmVxdWVzdC5nZXRQcm9wZXJ0eSgiZmlsdGVyZWQiKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInRydWUiLCBwKTsKKworICAgICAgICAgICAgaWYgKCEobXVsdGlQYXJ0LmdldEJvZHlQYXJ0cygpLnNpemUoKSA9PSAzKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZQorICAgICAgICAgICAgICAgICAgICAgICAgLm9rKCJGQUlMRUQ6ICBOdW1iZXIgb2YgYm9keSBwYXJ0cyBpcyAiICsgbXVsdGlQYXJ0LmdldEJvZHlQYXJ0cygpLnNpemUoKSArICIgaW5zdGVhZCBvZiAzIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG11bHRpUGFydC5nZXRGaWVsZCgiZm9vIikgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygiRkFJTEVEOiAgTWlzc2luZyBmaWVsZCAnZm9vJyIpLmJ1aWxkKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCEiYmFyIi5lcXVhbHMobXVsdGlQYXJ0LmdldEZpZWxkKCJmb28iKS5nZXRWYWx1ZSgpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZQorICAgICAgICAgICAgICAgICAgICAgICAgLm9rKCJGQUlMRUQ6ICBGaWVsZCAnZm9vJyBoYXMgdmFsdWUgJyIgKyBtdWx0aVBhcnQuZ2V0RmllbGQoImZvbyIpLmdldFZhbHVlKCkgKyAiJyBpbnN0ZWFkIG9mIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgJ2JhciciKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobXVsdGlQYXJ0LmdldEZpZWxkKCJiYXoiKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCJGQUlMRUQ6ICBNaXNzaW5nIGZpZWxkICdiYXonIikuYnVpbGQoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoISJib3AiLmVxdWFscyhtdWx0aVBhcnQuZ2V0RmllbGQoImJheiIpLmdldFZhbHVlKCkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAub2soIkZBSUxFRDogIEZpZWxkICdiYXonIGhhcyB2YWx1ZSAnIiArIG11bHRpUGFydC5nZXRGaWVsZCgiYmF6IikuZ2V0VmFsdWUoKSArICInIGluc3RlYWQgb2YgJ2JvcCciKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobXVsdGlQYXJ0LmdldEZpZWxkKCJiZWFuIikgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygiRkFJTEVEOiAgTWlzc2luZyBmaWVsZCAnYmVhbiciKS5idWlsZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTXVsdGlQYXJ0QmVhbiBiZWFuID0gbXVsdGlQYXJ0LmdldEZpZWxkKCJiZWFuIikuZ2V0VmFsdWVBcyhNdWx0aVBhcnRCZWFuLmNsYXNzKTsKKyAgICAgICAgICAgIGlmICghYmVhbi5nZXROYW1lKCkuZXF1YWxzKCJteW5hbWUiKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygiRkFJTEVEOiAgU2Vjb25kIHBhcnQgbmFtZSA9ICIgKyBiZWFuLmdldE5hbWUoKSkuYnVpbGQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghYmVhbi5nZXRWYWx1ZSgpLmVxdWFscygibXl2YWx1ZSIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCJGQUlMRUQ6ICBTZWNvbmQgcGFydCB2YWx1ZSA9ICIgKyBiZWFuLmdldFZhbHVlKCkpLmJ1aWxkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soIlNVQ0NFU1M6ICBBbGwgdGVzdHMgcGFzc2VkIikuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3VtZXNGb3JtRGF0YVJlc291cmNlKCkgeworICAgICAgICBNdWx0aVBhcnRCZWFuIGJlYW4gPSBuZXcgTXVsdGlQYXJ0QmVhbigibXluYW1lIiwgIm15dmFsdWUiKTsKKyAgICAgICAgRm9ybURhdGFNdWx0aVBhcnQgZW50aXR5ID0gbmV3IEZvcm1EYXRhTXVsdGlQYXJ0KCkKKyAgICAgICAgICAgIC5maWVsZCgiZm9vIiwgImJhciIpCisgICAgICAgICAgICAuZmllbGQoImJheiIsICJib3AiKQorICAgICAgICAgICAgLmZpZWxkKCJiZWFuIiwgYmVhbiwgbmV3IE1lZGlhVHlwZSgieC1hcHBsaWNhdGlvbiIsICJ4LWZvcm1hdCIpKTsKKworICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSB0YXJnZXQoKQorICAgICAgICAgICAgICAgIC5wYXRoKCJDb25zdW1lc0Zvcm1EYXRhUmVzb3VyY2UiKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikKKyAgICAgICAgICAgICAgICAucHV0KEVudGl0eS5lbnRpdHkoZW50aXR5LCAibXVsdGlwYXJ0L2Zvcm0tZGF0YSIpLCBTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGlmICghcmVzcG9uc2Uuc3RhcnRzV2l0aCgiU1VDQ0VTUzoiKSkgeworICAgICAgICAgICAgZmFpbCgiUmVzcG9uc2UgaXMgJyIgKyByZXNwb25zZSArICInIik7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL21lZGlhL211bHRpcGFydC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9pbnRlcm5hbC9Gb3JtRGF0YU11bHRpUGFydFJlYWRlcldyaXRlclRlc3QuamF2YSBiL21lZGlhL211bHRpcGFydC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9pbnRlcm5hbC9Gb3JtRGF0YU11bHRpUGFydFJlYWRlcldyaXRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGE4NTFjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXVsdGlwYXJ0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvbXVsdGlwYXJ0L2ludGVybmFsL0Zvcm1EYXRhTXVsdGlQYXJ0UmVhZGVyV3JpdGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsODQ3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKK2ltcG9ydCBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkRlZmF1bHRWYWx1ZTsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QVVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50Lkludm9jYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5Cb2R5UGFydDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuQm9keVBhcnRFbnRpdHk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LkZvcm1EYXRhQm9keVBhcnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LkZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5Gb3JtRGF0YU11bHRpUGFydDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuRm9ybURhdGFQYXJhbTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuTXVsdGlQYXJ0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp2bmV0Lm1pbWVwdWxsLk1JTUVNZXNzYWdlOworaW1wb3J0IG9yZy5qdm5ldC5taW1lcHVsbC5NSU1FUGFyc2luZ0V4Y2VwdGlvbjsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCitpbXBvcnQgbW9ja2l0LkV4cGVjdGF0aW9uczsKK2ltcG9ydCBtb2NraXQuTW9ja2VkOworaW1wb3J0IG1vY2tpdC5WZXJpZmljYXRpb25zOworCisvKioKKyAqIFRlc3RzIGZvciBtdWx0aXBhcnQge0Bjb2RlIE1lc3NhZ2VCb2R5UmVhZGVyfSBhbmQge0Bjb2RlIE1lc3NhZ2VCb2R5V3JpdGVyfSBhcyB3ZWxsIGFzIHtAY29kZSBGb3JtRGF0YU11bHRpUGFydH0gYW5kIHtAY29kZQorICogRm9ybURhdGFQYXJhbX0gaW5qZWN0aW9ucy4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEZvcm1EYXRhTXVsdGlQYXJ0UmVhZGVyV3JpdGVyVGVzdCBleHRlbmRzIE11bHRpUGFydEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFNldDxDbGFzczw/Pj4gZ2V0UmVzb3VyY2VDbGFzc2VzKCkgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdCgKKyAgICAgICAgICAgICAgICBQcm9kdWNlc0Zvcm1EYXRhVXNpbmdNdWx0aVBhcnQuY2xhc3MsCisgICAgICAgICAgICAgICAgUHJvZHVjZXNGb3JtRGF0YVJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIFByb2R1Y2VzRm9ybURhdGFDaGFyc2V0UmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgQ29uc3VtZXNGb3JtRGF0YVJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIENvbnN1bWVzRm9ybURhdGFQYXJhbVJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIEZvcm1EYXRhVHlwZXNSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBGb3JtRGF0YUxpc3RUeXBlc1Jlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIEZvcm1EYXRhQ29sbGVjdGlvblR5cGVzUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgUHJpbWl0aXZlc0Zvcm1EYXRhUGFyYW1SZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBEZWZhdWx0Rm9ybURhdGFQYXJhbVJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIE5vbkNvbnRlbnRUeXBlRm9yUGFydFJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZVdpdGhCb3VuZGFyeVJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIEZpbGVSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbVJlc291cmNlLmNsYXNzKS5zdHJlYW0oKS5jb2xsZWN0KENvbGxlY3RvcnMudG9TZXQoKSk7CisgICAgfQorCisKKyAgICBAUGF0aCgiL1Byb2R1Y2VzRm9ybURhdGFVc2luZ011bHRpUGFydCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQcm9kdWNlc0Zvcm1EYXRhVXNpbmdNdWx0aVBhcnQgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJtdWx0aXBhcnQvZm9ybS1kYXRhIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldCgpIHsKKyAgICAgICAgICAgIGZpbmFsIE11bHRpUGFydCBlbnRpdHkgPSBuZXcgTXVsdGlQYXJ0KCk7CisgICAgICAgICAgICBlbnRpdHkuc2V0TWVkaWFUeXBlKE1lZGlhVHlwZS5NVUxUSVBBUlRfRk9STV9EQVRBX1RZUEUpOworICAgICAgICAgICAgZmluYWwgQm9keVBhcnQgcGFydDEgPSBuZXcgQm9keVBhcnQoKTsKKyAgICAgICAgICAgIHBhcnQxLnNldE1lZGlhVHlwZShNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKTsKKyAgICAgICAgICAgIHBhcnQxLmdldEhlYWRlcnMoKS5hZGQoIkNvbnRlbnQtRGlzcG9zaXRpb24iLCAiZm9ybS1kYXRhOyBuYW1lPVwiZmllbGQxXCIiKTsKKyAgICAgICAgICAgIHBhcnQxLnNldEVudGl0eSgiSm9lIEJsb3dcclxuIik7CisgICAgICAgICAgICBmaW5hbCBCb2R5UGFydCBwYXJ0MiA9IG5ldyBCb2R5UGFydCgpOworICAgICAgICAgICAgcGFydDIuc2V0TWVkaWFUeXBlKE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpOworICAgICAgICAgICAgcGFydDIuZ2V0SGVhZGVycygpLmFkZCgiQ29udGVudC1EaXNwb3NpdGlvbiIsICJmb3JtLWRhdGE7IG5hbWU9XCJwaWNzXCI7IGZpbGVuYW1lPVwiZmlsZTEudHh0XCIiKTsKKyAgICAgICAgICAgIHBhcnQyLnNldEVudGl0eSgiLi4uIGNvbnRlbnRzIG9mIGZpbGUxLnR4dCAuLi5cclxuIik7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soZW50aXR5LmJvZHlQYXJ0KHBhcnQxKS5ib2R5UGFydChwYXJ0MikpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8vIFRlc3QgYSByZXNwb25zZSBvZiB0eXBlICJtdWx0aXBhcnQvZm9ybS1kYXRhIi4gIFRoZSBleGFtcGxlIGNvbWVzIGZyb20KKyAgICAvLyBTZWN0aW9uIDYgb2YgUkZDIDE4NjcuCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvZHVjZXNGb3JtRGF0YVVzaW5nTXVsdGlQYXJ0KCkgeworICAgICAgICBmaW5hbCBJbnZvY2F0aW9uLkJ1aWxkZXIgcmVxdWVzdCA9IHRhcmdldCgpLnBhdGgoIlByb2R1Y2VzRm9ybURhdGFVc2luZ011bHRpUGFydCIpLnJlcXVlc3QoIm11bHRpcGFydC9mb3JtLWRhdGEiKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgTXVsdGlQYXJ0IHJlc3VsdCA9IHJlcXVlc3QuZ2V0KE11bHRpUGFydC5jbGFzcyk7CisgICAgICAgICAgICBjaGVja01lZGlhVHlwZShuZXcgTWVkaWFUeXBlKCJtdWx0aXBhcnQiLCAiZm9ybS1kYXRhIiksIHJlc3VsdC5nZXRNZWRpYVR5cGUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcmVzdWx0LmdldEJvZHlQYXJ0cygpLnNpemUoKSk7CisgICAgICAgICAgICBmaW5hbCBCb2R5UGFydCBwYXJ0MSA9IHJlc3VsdC5nZXRCb2R5UGFydHMoKS5nZXQoMCk7CisgICAgICAgICAgICBjaGVja01lZGlhVHlwZShuZXcgTWVkaWFUeXBlKCJ0ZXh0IiwgInBsYWluIiksIHBhcnQxLmdldE1lZGlhVHlwZSgpKTsKKyAgICAgICAgICAgIGNoZWNrRW50aXR5KCJKb2UgQmxvd1xyXG4iLCAoQm9keVBhcnRFbnRpdHkpIHBhcnQxLmdldEVudGl0eSgpKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZTEgPSBwYXJ0MS5nZXRIZWFkZXJzKCkuZ2V0Rmlyc3QoIkNvbnRlbnQtRGlzcG9zaXRpb24iKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZm9ybS1kYXRhOyBuYW1lPVwiZmllbGQxXCIiLCB2YWx1ZTEpOworICAgICAgICAgICAgZmluYWwgQm9keVBhcnQgcGFydDIgPSByZXN1bHQuZ2V0Qm9keVBhcnRzKCkuZ2V0KDEpOworICAgICAgICAgICAgY2hlY2tNZWRpYVR5cGUobmV3IE1lZGlhVHlwZSgidGV4dCIsICJwbGFpbiIpLCBwYXJ0Mi5nZXRNZWRpYVR5cGUoKSk7CisgICAgICAgICAgICBjaGVja0VudGl0eSgiLi4uIGNvbnRlbnRzIG9mIGZpbGUxLnR4dCAuLi5cclxuIiwgKEJvZHlQYXJ0RW50aXR5KSBwYXJ0Mi5nZXRFbnRpdHkoKSk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUyID0gcGFydDIuZ2V0SGVhZGVycygpLmdldEZpcnN0KCJDb250ZW50LURpc3Bvc2l0aW9uIik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImZvcm0tZGF0YTsgbmFtZT1cInBpY3NcIjsgZmlsZW5hbWU9XCJmaWxlMS50eHRcIiIsIHZhbHVlMik7CisKKyAgICAgICAgICAgIHJlc3VsdC5nZXRQYXJhbWV0ZXJpemVkSGVhZGVycygpOworICAgICAgICAgICAgcmVzdWx0LmNsZWFudXAoKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gfCBQYXJzZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKKyAgICAgICAgICAgIGZhaWwoIkNhdWdodCBleGNlcHRpb246ICIgKyBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvUHJvZHVjZXNGb3JtRGF0YVJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFByb2R1Y2VzRm9ybURhdGFSZXNvdXJjZSB7CisKKyAgICAgICAgLy8gVGVzdCAibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgdGhlIGVhc3kgd2F5ICh3aXRoIHN1YmNsYXNzZXMpCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJtdWx0aXBhcnQvZm9ybS1kYXRhIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldCgpIHsKKyAgICAgICAgICAgIC8vIEV4ZXJjaXNlIGJ1aWxkZXIgcGF0dGVybiB3aXRoIGV4cGxpY2l0IGNvbnRlbnQgdHlwZQorICAgICAgICAgICAgZmluYWwgTXVsdGlQYXJ0QmVhbiBiZWFuID0gbmV3IE11bHRpUGFydEJlYW4oIm15bmFtZSIsICJteXZhbHVlIik7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2sobmV3IEZvcm1EYXRhTXVsdGlQYXJ0KCkKKyAgICAgICAgICAgICAgICAgICAgLmZpZWxkKCJmb28iLCAiYmFyIikKKyAgICAgICAgICAgICAgICAgICAgLmZpZWxkKCJiYXoiLCAiYm9wIikKKyAgICAgICAgICAgICAgICAgICAgLmZpZWxkKCJiZWFuIiwgYmVhbiwgbmV3IE1lZGlhVHlwZSgieC1hcHBsaWNhdGlvbiIsICJ4LWZvcm1hdCIpKSkuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvZHVjZXNGb3JtRGF0YVJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEludm9jYXRpb24uQnVpbGRlciByZXF1ZXN0ID0gdGFyZ2V0KCkucGF0aCgiUHJvZHVjZXNGb3JtRGF0YVJlc291cmNlIikucmVxdWVzdCgibXVsdGlwYXJ0L2Zvcm0tZGF0YSIpOworCisgICAgICAgIGZpbmFsIEZvcm1EYXRhTXVsdGlQYXJ0IHJlc3VsdCA9IHJlcXVlc3QuZ2V0KEZvcm1EYXRhTXVsdGlQYXJ0LmNsYXNzKTsKKyAgICAgICAgY2hlY2tNZWRpYVR5cGUobmV3IE1lZGlhVHlwZSgibXVsdGlwYXJ0IiwgImZvcm0tZGF0YSIpLCByZXN1bHQuZ2V0TWVkaWFUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgcmVzdWx0LmdldEZpZWxkcygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwocmVzdWx0LmdldEZpZWxkKCJmb28iKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYmFyIiwgcmVzdWx0LmdldEZpZWxkKCJmb28iKS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXN1bHQuZ2V0RmllbGQoImJheiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJib3AiLCByZXN1bHQuZ2V0RmllbGQoImJheiIpLmdldFZhbHVlKCkpOworICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3VsdC5nZXRGaWVsZCgiYmVhbiIpKTsKKworICAgICAgICBmaW5hbCBNdWx0aVBhcnRCZWFuIGJlYW4gPSByZXN1bHQuZ2V0RmllbGQoImJlYW4iKS5nZXRWYWx1ZUFzKE11bHRpUGFydEJlYW4uY2xhc3MpOworICAgICAgICBhc3NlcnROb3ROdWxsKGJlYW4pOworICAgICAgICBhc3NlcnRFcXVhbHMoIm15bmFtZSIsIGJlYW4uZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJteXZhbHVlIiwgYmVhbi5nZXRWYWx1ZSgpKTsKKworICAgICAgICByZXN1bHQuY2xlYW51cCgpOworICAgIH0KKworICAgIEBQYXRoKCIvUHJvZHVjZXNGb3JtRGF0YUNoYXJzZXRSZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQcm9kdWNlc0Zvcm1EYXRhQ2hhcnNldFJlc291cmNlIHsKKworICAgICAgICAvLyBUZXN0ICJtdWx0aXBhcnQvZm9ybS1kYXRhIiB0aGUgZWFzeSB3YXkgKHdpdGggc3ViY2xhc3NlcykKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoIm11bHRpcGFydC9mb3JtLWRhdGEiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0KEBRdWVyeVBhcmFtKCJjaGFyc2V0IikgZmluYWwgU3RyaW5nIGNoYXJzZXQpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vayhuZXcgRm9ybURhdGFNdWx0aVBhcnQoKQorICAgICAgICAgICAgICAgICAgICAuZmllbGQoImZvbyIsICJcdTAwQTkgQ09OVEVOVCBcdTAwRkYgXHUyMjAwIFx1MjJGRiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlLnZhbHVlT2YoInRleHQvcGxhaW47Y2hhcnNldD0iICsgY2hhcnNldCkpKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9kdWNlc0Zvcm1EYXRhQ2hhcnNldFJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBjID0gIlx1MDBBOSBDT05URU5UIFx1MDBGRiBcdTIyMDAgXHUyMkZGIjsKKworICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBjaGFyc2V0IDogQXJyYXlzLmFzTGlzdCgKKyAgICAgICAgICAgICAgICAiVVMtQVNDSUkiLAorICAgICAgICAgICAgICAgICJJU08tODg1OS0xIiwKKyAgICAgICAgICAgICAgICAiVVRGLTgiLAorICAgICAgICAgICAgICAgICJVVEYtMTZCRSIsCisgICAgICAgICAgICAgICAgIlVURi0xNkxFIiwKKyAgICAgICAgICAgICAgICAiVVRGLTE2IikpIHsKKworICAgICAgICAgICAgZmluYWwgRm9ybURhdGFNdWx0aVBhcnQgcCA9IHRhcmdldCgpLnBhdGgoIlByb2R1Y2VzRm9ybURhdGFDaGFyc2V0UmVzb3VyY2UiKQorICAgICAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgiY2hhcnNldCIsIGNoYXJzZXQpCisgICAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCJtdWx0aXBhcnQvZm9ybS1kYXRhIikKKyAgICAgICAgICAgICAgICAgICAgLmdldChGb3JtRGF0YU11bHRpUGFydC5jbGFzcyk7CisKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZCA9IG5ldyBTdHJpbmcoYy5nZXRCeXRlcyhjaGFyc2V0KSwgY2hhcnNldCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHAuZ2V0RmllbGQoImZvbyIpLmdldFZhbHVlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi9Db25zdW1lc0Zvcm1EYXRhUmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29uc3VtZXNGb3JtRGF0YVJlc291cmNlIHsKKworICAgICAgICBAUFVUCisgICAgICAgIEBDb25zdW1lcygibXVsdGlwYXJ0L2Zvcm0tZGF0YSIpCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXQoZmluYWwgRm9ybURhdGFNdWx0aVBhcnQgbXVsdGlQYXJ0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKCEobXVsdGlQYXJ0LmdldEJvZHlQYXJ0cygpLnNpemUoKSA9PSAzKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygiRkFJTEVEOiAgTnVtYmVyIG9mIGJvZHkgcGFydHMgaXMgIiArIG11bHRpUGFydC5nZXRCb2R5UGFydHMoKS5zaXplKCkgKyAiIGluc3RlYWQgb2YgMyIpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG11bHRpUGFydC5nZXRGaWVsZCgiZm9vIikgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygiRkFJTEVEOiAgTWlzc2luZyBmaWVsZCAnZm9vJyIpLmJ1aWxkKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCEiYmFyIi5lcXVhbHMobXVsdGlQYXJ0LmdldEZpZWxkKCJmb28iKS5nZXRWYWx1ZSgpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZQorICAgICAgICAgICAgICAgICAgICAgICAgLm9rKCJGQUlMRUQ6ICBGaWVsZCAnZm9vJyBoYXMgdmFsdWUgJyIgKyBtdWx0aVBhcnQuZ2V0RmllbGQoImZvbyIpLmdldFZhbHVlKCkgKyAiJyBpbnN0ZWFkIG9mICdiYXInIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobXVsdGlQYXJ0LmdldEZpZWxkKCJiYXoiKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCJGQUlMRUQ6ICBNaXNzaW5nIGZpZWxkICdiYXonIikuYnVpbGQoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoISJib3AiLmVxdWFscyhtdWx0aVBhcnQuZ2V0RmllbGQoImJheiIpLmdldFZhbHVlKCkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAub2soIkZBSUxFRDogIEZpZWxkICdiYXonIGhhcyB2YWx1ZSAnIiArIG11bHRpUGFydC5nZXRGaWVsZCgiYmF6IikuZ2V0VmFsdWUoKSArICInIGluc3RlYWQgb2YgJ2JvcCciKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtdWx0aVBhcnQuZ2V0RmllbGQoImJlYW4iKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCJGQUlMRUQ6ICBNaXNzaW5nIGZpZWxkICdiZWFuJyIpLmJ1aWxkKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIE11bHRpUGFydEJlYW4gYmVhbiA9IG11bHRpUGFydC5nZXRGaWVsZCgiYmVhbiIpLmdldFZhbHVlQXMoTXVsdGlQYXJ0QmVhbi5jbGFzcyk7CisKKyAgICAgICAgICAgIGlmICghYmVhbi5nZXROYW1lKCkuZXF1YWxzKCJteW5hbWUiKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygiRkFJTEVEOiAgU2Vjb25kIHBhcnQgbmFtZSA9ICIgKyBiZWFuLmdldE5hbWUoKSkuYnVpbGQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFiZWFuLmdldFZhbHVlKCkuZXF1YWxzKCJteXZhbHVlIikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soIkZBSUxFRDogIFNlY29uZCBwYXJ0IHZhbHVlID0gIiArIGJlYW4uZ2V0VmFsdWUoKSkuYnVpbGQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCJTVUNDRVNTOiAgQWxsIHRlc3RzIHBhc3NlZCIpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbnN1bWVzRm9ybURhdGFSZXNvdXJjZSgpIHsKKyAgICAgICAgZmluYWwgSW52b2NhdGlvbi5CdWlsZGVyIHJlcXVlc3QgPSB0YXJnZXQoKS5wYXRoKCJDb25zdW1lc0Zvcm1EYXRhUmVzb3VyY2UiKS5yZXF1ZXN0KCJ0ZXh0L3BsYWluIik7CisKKyAgICAgICAgZmluYWwgTXVsdGlQYXJ0QmVhbiBiZWFuID0gbmV3IE11bHRpUGFydEJlYW4oIm15bmFtZSIsICJteXZhbHVlIik7CisgICAgICAgIGZpbmFsIEZvcm1EYXRhTXVsdGlQYXJ0IGVudGl0eSA9IG5ldyBGb3JtRGF0YU11bHRpUGFydCgpCisgICAgICAgICAgICAgICAgLmZpZWxkKCJmb28iLCAiYmFyIikKKyAgICAgICAgICAgICAgICAuZmllbGQoImJheiIsICJib3AiKQorICAgICAgICAgICAgICAgIC5maWVsZCgiYmVhbiIsIGJlYW4sIG5ldyBNZWRpYVR5cGUoIngtYXBwbGljYXRpb24iLCAieC1mb3JtYXQiKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXNwb25zZSA9IHJlcXVlc3QucHV0KEVudGl0eS5lbnRpdHkoZW50aXR5LCAibXVsdGlwYXJ0L2Zvcm0tZGF0YSIpLCBTdHJpbmcuY2xhc3MpOworICAgICAgICBpZiAoIXJlc3BvbnNlLnN0YXJ0c1dpdGgoIlNVQ0NFU1M6IikpIHsKKyAgICAgICAgICAgIGZhaWwoIlJlc3BvbnNlIGlzICciICsgcmVzcG9uc2UgKyAiJyIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi9Db25zdW1lc0Zvcm1EYXRhUGFyYW1SZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb25zdW1lc0Zvcm1EYXRhUGFyYW1SZXNvdXJjZSB7CisKKyAgICAgICAgQFBVVAorICAgICAgICBAQ29uc3VtZXMoIm11bHRpcGFydC9mb3JtLWRhdGEiKQorICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0KAorICAgICAgICAgICAgICAgIEBGb3JtRGF0YVBhcmFtKCJmb28iKSBmaW5hbCBTdHJpbmcgZm9vLAorICAgICAgICAgICAgICAgIEBGb3JtRGF0YVBhcmFtKCJiYXoiKSBmaW5hbCBTdHJpbmcgYmF6LAorICAgICAgICAgICAgICAgIEBGb3JtRGF0YVBhcmFtKCJiZWFuIikgZmluYWwgTXVsdGlQYXJ0QmVhbiBiZWFuLAorICAgICAgICAgICAgICAgIEBGb3JtRGF0YVBhcmFtKCJ1bmtub3duMSIpIGZpbmFsIFN0cmluZyB1bmtub3duMSwKKyAgICAgICAgICAgICAgICBARm9ybURhdGFQYXJhbSgidW5rbm93bjIiKSBARGVmYXVsdFZhbHVlKCJVTktOT1dOIikgZmluYWwgU3RyaW5nIHVua25vd24yLAorICAgICAgICAgICAgICAgIGZpbmFsIEZvcm1EYXRhTXVsdGlQYXJ0IGZkbXApIHsKKworICAgICAgICAgICAgaWYgKCEiYmFyIi5lcXVhbHMoZm9vKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygiRkFJTEVEOiAgVmFsdWUgb2YgJ2ZvbycgaXMgJyIgKyBmb28gKyAiJyBpbnN0ZWFkIG9mICdiYXInIikuYnVpbGQoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoISJib3AiLmVxdWFscyhiYXopKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCJGQUlMRUQ6ICBWYWx1ZSBvZiAnYmF6JyBpcyAnIiArIGJheiArICInIGluc3RlYWQgb2YgJ2JvcCciKS5idWlsZCgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChiZWFuID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soIkZBSUxFRDogIFZhbHVlIG9mICdiZWFuJyBpcyBOVUxMIikuYnVpbGQoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIShiZWFuLmdldE5hbWUoKS5lcXVhbHMoIm15bmFtZSIpICYmIGJlYW4uZ2V0VmFsdWUoKS5lcXVhbHMoIm15dmFsdWUiKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIC5vaygiRkFJTEVEOiAgVmFsdWUgb2YgJ2JlYW4ubXlOYW1lJyBhbmQgJ2JlYW4uTXlWYWx1ZScgYXJlIG5vdCAnbXluYW1lJyBhbmQgJ215dmFsdWUnIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICAgICAgfSBlbHNlIGlmICh1bmtub3duMSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCJGQUlMRUQ6ICBWYWx1ZSBvZiAndW5rbm93bjEnIGlzICciICsgdW5rbm93bjEgKyAiJyBpbnN0ZWFkIG9mIE5VTEwiKS5idWlsZCgpOworICAgICAgICAgICAgfSBlbHNlIGlmICghIlVOS05PV04iLmVxdWFscyh1bmtub3duMikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soIkZBSUxFRDogIFZhbHVlIG9mICd1bmtub3duMicgaXMgJyIgKyB1bmtub3duMiArICInIGluc3RlYWQgb2YgJ1VOS05PV04nIikuYnVpbGQoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZmRtcCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCJGQUlMRUQ6ICBWYWx1ZSBvZiBmZG1wIGlzIE5VTEwiKS5idWlsZCgpOworICAgICAgICAgICAgfSBlbHNlIGlmIChmZG1wLmdldEZpZWxkcygpLnNpemUoKSAhPSAzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAub2soIkZBSUxFRDogIFZhbHVlIG9mIGZkbXAuZ2V0RmllbGRzKCkuc2l6ZSgpIGlzICIgKyBmZG1wLmdldEZpZWxkcygpLnNpemUoKSArICIgaW5zdGVhZCBvZiAzIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soIlNVQ0NFU1M6ICBBbGwgdGVzdHMgcGFzc2VkIikuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3VtZXNGb3JtRGF0YVBhcmFtUmVzb3VyY2UoKSB7CisgICAgICAgIGZpbmFsIEludm9jYXRpb24uQnVpbGRlciByZXF1ZXN0ID0gdGFyZ2V0KCkucGF0aCgiQ29uc3VtZXNGb3JtRGF0YVBhcmFtUmVzb3VyY2UiKS5yZXF1ZXN0KCJ0ZXh0L3BsYWluIik7CisKKyAgICAgICAgZmluYWwgTXVsdGlQYXJ0QmVhbiBiZWFuID0gbmV3IE11bHRpUGFydEJlYW4oIm15bmFtZSIsICJteXZhbHVlIik7CisgICAgICAgIGZpbmFsIEZvcm1EYXRhTXVsdGlQYXJ0IGVudGl0eSA9IG5ldyBGb3JtRGF0YU11bHRpUGFydCgpCisgICAgICAgICAgICAgICAgLmZpZWxkKCJmb28iLCAiYmFyIikKKyAgICAgICAgICAgICAgICAuZmllbGQoImJheiIsICJib3AiKQorICAgICAgICAgICAgICAgIC5maWVsZCgiYmVhbiIsIGJlYW4sIG5ldyBNZWRpYVR5cGUoIngtYXBwbGljYXRpb24iLCAieC1mb3JtYXQiKSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3BvbnNlID0gcmVxdWVzdC5wdXQoRW50aXR5LmVudGl0eShlbnRpdHksICJtdWx0aXBhcnQvZm9ybS1kYXRhIiksIFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgaWYgKCFyZXNwb25zZS5zdGFydHNXaXRoKCJTVUNDRVNTOiIpKSB7CisgICAgICAgICAgICBmYWlsKCJSZXNwb25zZSBpcyAnIiArIHJlc3BvbnNlICsgIiciKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvRm9ybURhdGFUeXBlc1Jlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZvcm1EYXRhVHlwZXNSZXNvdXJjZSB7CisKKyAgICAgICAgQFBVVAorICAgICAgICBAQ29uc3VtZXMoIm11bHRpcGFydC9mb3JtLWRhdGEiKQorICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgKKyAgICAgICAgICAgICAgICBARm9ybURhdGFQYXJhbSgiZm9vIikgZmluYWwgRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24gZm9vRGlzcCwKKyAgICAgICAgICAgICAgICBARm9ybURhdGFQYXJhbSgiZm9vIikgZmluYWwgRm9ybURhdGFCb2R5UGFydCBmb29QYXJ0LAorICAgICAgICAgICAgICAgIEBGb3JtRGF0YVBhcmFtKCJiYXoiKSBmaW5hbCBGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbiBiYXpEaXNwLAorICAgICAgICAgICAgICAgIEBGb3JtRGF0YVBhcmFtKCJiYXoiKSBmaW5hbCBGb3JtRGF0YUJvZHlQYXJ0IGJhelBhcnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZm9vRGlzcCk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGZvb1BhcnQpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChiYXpEaXNwKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYmF6UGFydCk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwgZm9vRGlzcC5nZXROYW1lKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCBmb29QYXJ0LmdldE5hbWUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImJhciIsIGZvb1BhcnQuZ2V0VmFsdWUoKSk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiYmF6IiwgYmF6RGlzcC5nZXROYW1lKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYXoiLCBiYXpQYXJ0LmdldE5hbWUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImJvcCIsIGJhelBhcnQuZ2V0VmFsdWUoKSk7CisKKyAgICAgICAgICAgIHJldHVybiAiT0siOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JtRGF0YVR5cGVzUmVzb3VyY2UoKSB7CisgICAgICAgIGZpbmFsIEludm9jYXRpb24uQnVpbGRlciByZXF1ZXN0ID0gdGFyZ2V0KCkucGF0aCgiRm9ybURhdGFUeXBlc1Jlc291cmNlIikucmVxdWVzdCgidGV4dC9wbGFpbiIpOworCisgICAgICAgIGZpbmFsIEZvcm1EYXRhTXVsdGlQYXJ0IGVudGl0eSA9IG5ldyBGb3JtRGF0YU11bHRpUGFydCgpCisgICAgICAgICAgICAgICAgLmZpZWxkKCJmb28iLCAiYmFyIikKKyAgICAgICAgICAgICAgICAuZmllbGQoImJheiIsICJib3AiKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3BvbnNlID0gcmVxdWVzdC5wdXQoRW50aXR5LmVudGl0eShlbnRpdHksICJtdWx0aXBhcnQvZm9ybS1kYXRhIiksIFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiT0siLCByZXNwb25zZSk7CisgICAgfQorCisgICAgQFBhdGgoIi9Gb3JtRGF0YUxpc3RUeXBlc1Jlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZvcm1EYXRhTGlzdFR5cGVzUmVzb3VyY2UgeworCisgICAgICAgIEBQVVQKKyAgICAgICAgQENvbnN1bWVzKCJtdWx0aXBhcnQvZm9ybS1kYXRhIikKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoCisgICAgICAgICAgICAgICAgQEZvcm1EYXRhUGFyYW0oImZvbyIpIGZpbmFsIExpc3Q8Rm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24+IGZvb0Rpc3AsCisgICAgICAgICAgICAgICAgQEZvcm1EYXRhUGFyYW0oImZvbyIpIGZpbmFsIExpc3Q8Rm9ybURhdGFCb2R5UGFydD4gZm9vUGFydCwKKyAgICAgICAgICAgICAgICBARm9ybURhdGFQYXJhbSgiYmF6IikgZmluYWwgTGlzdDxGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbj4gYmF6RGlzcCwKKyAgICAgICAgICAgICAgICBARm9ybURhdGFQYXJhbSgiYmF6IikgZmluYWwgTGlzdDxGb3JtRGF0YUJvZHlQYXJ0PiBiYXpQYXJ0KSB7CisKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZm9vRGlzcCk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGZvb1BhcnQpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChiYXpEaXNwKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoYmF6UGFydCk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBmb29EaXNwLnNpemUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgZm9vUGFydC5zaXplKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGJhekRpc3Auc2l6ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBiYXpQYXJ0LnNpemUoKSk7CisKKyAgICAgICAgICAgIHJldHVybiAiT0siOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JtRGF0YUxpc3RUeXBlc1Jlc291cmNlKCkgeworICAgICAgICBmaW5hbCBJbnZvY2F0aW9uLkJ1aWxkZXIgcmVxdWVzdCA9IHRhcmdldCgpLnBhdGgoIkZvcm1EYXRhTGlzdFR5cGVzUmVzb3VyY2UiKS5yZXF1ZXN0KCJ0ZXh0L3BsYWluIik7CisKKyAgICAgICAgZmluYWwgRm9ybURhdGFNdWx0aVBhcnQgZW50aXR5ID0gbmV3IEZvcm1EYXRhTXVsdGlQYXJ0KCkKKyAgICAgICAgICAgICAgICAuZmllbGQoImZvbyIsICJiYXIiKQorICAgICAgICAgICAgICAgIC5maWVsZCgiZm9vIiwgImJhcjIiKQorICAgICAgICAgICAgICAgIC5maWVsZCgiYmF6IiwgImJvcCIpCisgICAgICAgICAgICAgICAgLmZpZWxkKCJiYXoiLCAiYm9wMiIpOworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzcG9uc2UgPSByZXF1ZXN0LnB1dChFbnRpdHkuZW50aXR5KGVudGl0eSwgIm11bHRpcGFydC9mb3JtLWRhdGEiKSwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJPSyIsIHJlc3BvbnNlKTsKKyAgICB9CisKKyAgICBAUGF0aCgiL0Zvcm1EYXRhQ29sbGVjdGlvblR5cGVzUmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRm9ybURhdGFDb2xsZWN0aW9uVHlwZXNSZXNvdXJjZSB7CisKKyAgICAgICAgQFBVVAorICAgICAgICBAQ29uc3VtZXMoIm11bHRpcGFydC9mb3JtLWRhdGEiKQorICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgKKyAgICAgICAgICAgICAgICBARm9ybURhdGFQYXJhbSgiZm9vIikgZmluYWwgQ29sbGVjdGlvbjxGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbj4gZm9vRGlzcCwKKyAgICAgICAgICAgICAgICBARm9ybURhdGFQYXJhbSgiZm9vIikgZmluYWwgQ29sbGVjdGlvbjxGb3JtRGF0YUJvZHlQYXJ0PiBmb29QYXJ0LAorICAgICAgICAgICAgICAgIEBGb3JtRGF0YVBhcmFtKCJiYXoiKSBmaW5hbCBDb2xsZWN0aW9uPEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uPiBiYXpEaXNwLAorICAgICAgICAgICAgICAgIEBGb3JtRGF0YVBhcmFtKCJiYXoiKSBmaW5hbCBDb2xsZWN0aW9uPEZvcm1EYXRhQm9keVBhcnQ+IGJhelBhcnQpIHsKKworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChmb29EaXNwKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoZm9vUGFydCk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGJhekRpc3ApOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChiYXpQYXJ0KTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGZvb0Rpc3Auc2l6ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBmb29QYXJ0LnNpemUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgYmF6RGlzcC5zaXplKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGJhelBhcnQuc2l6ZSgpKTsKKworICAgICAgICAgICAgcmV0dXJuICJPSyI7CisgICAgICAgIH0KKworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZvcm1EYXRhQ29sbGVjdGlvblR5cGVzUmVzb3VyY2UoKSB7CisgICAgICAgIGZpbmFsIEludm9jYXRpb24uQnVpbGRlciByZXF1ZXN0ID0gdGFyZ2V0KCkucGF0aCgiRm9ybURhdGFDb2xsZWN0aW9uVHlwZXNSZXNvdXJjZSIpLnJlcXVlc3QoInRleHQvcGxhaW4iKTsKKworICAgICAgICBmaW5hbCBGb3JtRGF0YU11bHRpUGFydCBlbnRpdHkgPSBuZXcgRm9ybURhdGFNdWx0aVBhcnQoKQorICAgICAgICAgICAgICAgIC5maWVsZCgiZm9vIiwgImJhciIpCisgICAgICAgICAgICAgICAgLmZpZWxkKCJmb28iLCAiYmFyMiIpCisgICAgICAgICAgICAgICAgLmZpZWxkKCJiYXoiLCAiYm9wIikKKyAgICAgICAgICAgICAgICAuZmllbGQoImJheiIsICJib3AyIik7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXNwb25zZSA9IHJlcXVlc3QucHV0KEVudGl0eS5lbnRpdHkoZW50aXR5LCAibXVsdGlwYXJ0L2Zvcm0tZGF0YSIpLCBTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk9LIiwgcmVzcG9uc2UpOworICAgIH0KKworICAgIEBQYXRoKCIvUHJpbWl0aXZlc0Zvcm1EYXRhUGFyYW1SZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQcmltaXRpdmVzRm9ybURhdGFQYXJhbVJlc291cmNlIHsKKworICAgICAgICBAUFVUCisgICAgICAgIEBDb25zdW1lcygibXVsdGlwYXJ0L2Zvcm0tZGF0YSIpCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KAorICAgICAgICAgICAgICAgIEBGb3JtRGF0YVBhcmFtKCJiUCIpIGZpbmFsIGJvb2xlYW4gYlAsCisgICAgICAgICAgICAgICAgQEZvcm1EYXRhUGFyYW0oImJUIikgZmluYWwgQm9vbGVhbiBiVCwKKyAgICAgICAgICAgICAgICBARm9ybURhdGFQYXJhbSgiYlBfYWJzZW50IikgZmluYWwgYm9vbGVhbiBiUF9hYnNlbnQsCisgICAgICAgICAgICAgICAgQEZvcm1EYXRhUGFyYW0oImJUX2Fic2VudCIpIGZpbmFsIEJvb2xlYW4gYlRfYWJzZW50LAorICAgICAgICAgICAgICAgIEBEZWZhdWx0VmFsdWUoInRydWUiKSBARm9ybURhdGFQYXJhbSgiYlBfYWJzZW50X2RlZmF1bHQiKSBmaW5hbCBib29sZWFuIGJQX2Fic2VudF9kZWZhdWx0LAorICAgICAgICAgICAgICAgIEBEZWZhdWx0VmFsdWUoInRydWUiKSBARm9ybURhdGFQYXJhbSgiYlRfYWJzZW50X2RlZmF1bHQiKSBmaW5hbCBCb29sZWFuIGJUX2Fic2VudF9kZWZhdWx0LAorICAgICAgICAgICAgICAgIEBEZWZhdWx0VmFsdWUoInRydWUiKSBARm9ybURhdGFQYXJhbSgiYlBfZGVmYXVsdCIpIGZpbmFsIGJvb2xlYW4gYlBfZGVmYXVsdCwKKyAgICAgICAgICAgICAgICBARGVmYXVsdFZhbHVlKCJ0cnVlIikgQEZvcm1EYXRhUGFyYW0oImJUX2RlZmF1bHQiKSBmaW5hbCBCb29sZWFuIGJUX2RlZmF1bHQKKyAgICAgICAgKSB7CisKKyAgICAgICAgICAgIGFzc2VydFRydWUoYlApOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShiVCk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShiUF9hYnNlbnQpOworICAgICAgICAgICAgYXNzZXJ0TnVsbChiVF9hYnNlbnQpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShiUF9hYnNlbnRfZGVmYXVsdCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGJUX2Fic2VudF9kZWZhdWx0KTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGJQX2RlZmF1bHQpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoYlRfZGVmYXVsdCk7CisKKyAgICAgICAgICAgIHJldHVybiAiT0siOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcmltaXRpdmVzRm9ybURhdGFQYXJhbVJlc291cmNlKCkgeworICAgICAgICBmaW5hbCBJbnZvY2F0aW9uLkJ1aWxkZXIgcmVxdWVzdCA9IHRhcmdldCgpLnBhdGgoIlByaW1pdGl2ZXNGb3JtRGF0YVBhcmFtUmVzb3VyY2UiKS5yZXF1ZXN0KCJ0ZXh0L3BsYWluIik7CisKKyAgICAgICAgZmluYWwgRm9ybURhdGFNdWx0aVBhcnQgZW50aXR5ID0gbmV3IEZvcm1EYXRhTXVsdGlQYXJ0KCkKKyAgICAgICAgICAgICAgICAuZmllbGQoImJQIiwgInRydWUiKQorICAgICAgICAgICAgICAgIC5maWVsZCgiYlQiLCAidHJ1ZSIpCisgICAgICAgICAgICAgICAgLmZpZWxkKCJiUF9kZWZhdWx0IiwgImZhbHNlIikKKyAgICAgICAgICAgICAgICAuZmllbGQoImJUX2RlZmF1bHQiLCAiZmFsc2UiKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3BvbnNlID0gcmVxdWVzdC5wdXQoRW50aXR5LmVudGl0eShlbnRpdHksICJtdWx0aXBhcnQvZm9ybS1kYXRhIiksIFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiT0siLCByZXNwb25zZSk7CisgICAgfQorCisgICAgQFBhdGgoIi9EZWZhdWx0Rm9ybURhdGFQYXJhbVJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERlZmF1bHRGb3JtRGF0YVBhcmFtUmVzb3VyY2UgeworCisgICAgICAgIEBQVVQKKyAgICAgICAgQENvbnN1bWVzKCJtdWx0aXBhcnQvZm9ybS1kYXRhIikKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoCisgICAgICAgICAgICAgICAgQEZvcm1EYXRhUGFyYW0oImJlYW4iKSBmaW5hbCBNdWx0aVBhcnRCZWFuIGJlYW4sCisgICAgICAgICAgICAgICAgQEZvcm1EYXRhUGFyYW0oImJlYW5fYWJzZW50IikgZmluYWwgTXVsdGlQYXJ0QmVhbiBiZWFuX2Fic2VudCwKKyAgICAgICAgICAgICAgICBARGVmYXVsdFZhbHVlKCJteW5hbWU9bXl2YWx1ZSIpIEBGb3JtRGF0YVBhcmFtKCJiZWFuX2RlZmF1bHQiKSBmaW5hbCBNdWx0aVBhcnRCZWFuIGJlYW5fZGVmYXVsdCkgeworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChiZWFuKTsKKyAgICAgICAgICAgIGFzc2VydE51bGwoYmVhbl9hYnNlbnQpOworICAgICAgICAgICAgYXNzZXJ0TnVsbChiZWFuX2RlZmF1bHQpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm15bmFtZSIsIGJlYW4uZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygibXl2YWx1ZSIsIGJlYW4uZ2V0VmFsdWUoKSk7CisKKyAgICAgICAgICAgIHJldHVybiAiT0siOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0Rm9ybURhdGFQYXJhbVJlc291cmNlKCkgeworICAgICAgICBmaW5hbCBJbnZvY2F0aW9uLkJ1aWxkZXIgcmVxdWVzdCA9IHRhcmdldCgpLnBhdGgoIkRlZmF1bHRGb3JtRGF0YVBhcmFtUmVzb3VyY2UiKS5yZXF1ZXN0KCJ0ZXh0L3BsYWluIik7CisKKyAgICAgICAgZmluYWwgTXVsdGlQYXJ0QmVhbiBiZWFuID0gbmV3IE11bHRpUGFydEJlYW4oIm15bmFtZSIsICJteXZhbHVlIik7CisgICAgICAgIGZpbmFsIEZvcm1EYXRhTXVsdGlQYXJ0IGVudGl0eSA9IG5ldyBGb3JtRGF0YU11bHRpUGFydCgpCisgICAgICAgICAgICAgICAgLmZpZWxkKCJiZWFuIiwgYmVhbiwgbmV3IE1lZGlhVHlwZSgieC1hcHBsaWNhdGlvbiIsICJ4LWZvcm1hdCIpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3BvbnNlID0gcmVxdWVzdC5wdXQoRW50aXR5LmVudGl0eShlbnRpdHksICJtdWx0aXBhcnQvZm9ybS1kYXRhIiksIFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiT0siLCByZXNwb25zZSk7CisgICAgfQorCisgICAgQFBhdGgoIi9Ob25Db250ZW50VHlwZUZvclBhcnRSZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBOb25Db250ZW50VHlwZUZvclBhcnRSZXNvdXJjZSB7CisKKyAgICAgICAgQFBVVAorICAgICAgICBAQ29uc3VtZXMoIm11bHRpcGFydC9mb3JtLWRhdGEiKQorICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHB1dChARm9ybURhdGFQYXJhbSgic3VibWl0IikgZmluYWwgRm9ybURhdGFCb2R5UGFydCBiZWFuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChiZWFuKTsKKyAgICAgICAgICAgIGFzc2VydE51bGwoYmVhbi5nZXRIZWFkZXJzKCkuZ2V0Rmlyc3QoIkNvbnRlbnQtVHlwZSIpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygidXBsb2FkIiwgYmVhbi5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiT0siOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb25Db250ZW50VHlwZUZvclBhcnRSZXNvdXJjZSgpIHsKKyAgICAgICAgZmluYWwgSW52b2NhdGlvbi5CdWlsZGVyIHJlcXVlc3QgPSB0YXJnZXQoKS5wYXRoKCJOb25Db250ZW50VHlwZUZvclBhcnRSZXNvdXJjZSIpLnJlcXVlc3QoInRleHQvcGxhaW4iKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgZW50aXR5ID0KKyAgICAgICAgICAgICAgICAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0zMzIxOTYxNTAxOTEwNjk0NDk3MTcxOTQzNzQ4OFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiQ29udGVudC1EaXNwb3NpdGlvbjogZm9ybS1kYXRhOyBuYW1lPVwic3VibWl0XCJcblxuIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAidXBsb2FkXG4iCisgICAgICAgICAgICAgICAgICAgICAgICArICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLTMzMjE5NjE1MDE5MTA2OTQ0OTcxNzE5NDM3NDg4LS0iOworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzcG9uc2UgPSByZXF1ZXN0LnB1dChFbnRpdHkuZW50aXR5KGVudGl0eSwgIm11bHRpcGFydC9mb3JtLWRhdGE7IgorICAgICAgICAgICAgICAgICsgImJvdW5kYXJ5PVwiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tMzMyMTk2MTUwMTkxMDY5NDQ5NzE3MTk0Mzc0ODhcIiIpLCBTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk9LIiwgcmVzcG9uc2UpOworICAgIH0KKworICAgIEBQYXRoKCIvTWVkaWFUeXBlV2l0aEJvdW5kYXJ5UmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWVkaWFUeXBlV2l0aEJvdW5kYXJ5UmVzb3VyY2UgeworCisgICAgICAgIEBQVVQKKyAgICAgICAgQENvbnN1bWVzKCJtdWx0aXBhcnQvZm9ybS1kYXRhIikKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoCisgICAgICAgICAgICAgICAgQENvbnRleHQgZmluYWwgSHR0cEhlYWRlcnMgaCwKKyAgICAgICAgICAgICAgICBARm9ybURhdGFQYXJhbSgic3VibWl0IikgZmluYWwgU3RyaW5nIHMpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBiID0gaC5nZXRNZWRpYVR5cGUoKS5nZXRQYXJhbWV0ZXJzKCkuZ2V0KCJib3VuZGFyeSIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJYWFhYX1lZWVkiLCBiKTsKKyAgICAgICAgICAgIHJldHVybiBzOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNZWRpYVR5cGVXaXRoQm91bmRhcnlSZXNvdXJjZSgpIHsKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbWV0ZXJzID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBwYXJhbWV0ZXJzLnB1dCgiYm91bmRhcnkiLCAiWFhYWF9ZWVlZIik7CisgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUgPSBuZXcgTWVkaWFUeXBlKAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZS5NVUxUSVBBUlRfRk9STV9EQVRBX1RZUEUuZ2V0VHlwZSgpLAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZS5NVUxUSVBBUlRfRk9STV9EQVRBX1RZUEUuZ2V0U3VidHlwZSgpLCBwYXJhbWV0ZXJzKTsKKworICAgICAgICBmaW5hbCBGb3JtRGF0YU11bHRpUGFydCBlbnRpdHkgPSBuZXcgRm9ybURhdGFNdWx0aVBhcnQoKS5maWVsZCgic3VibWl0IiwgIk9LIik7CisKKyAgICAgICAgZmluYWwgSW52b2NhdGlvbi5CdWlsZGVyIHJlcXVlc3QgPSB0YXJnZXQoKS5wYXRoKCJNZWRpYVR5cGVXaXRoQm91bmRhcnlSZXNvdXJjZSIpLnJlcXVlc3QoInRleHQvcGxhaW4iKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3BvbnNlID0gcmVxdWVzdC5wdXQoRW50aXR5LmVudGl0eShlbnRpdHksIG1lZGlhVHlwZSksIFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiT0siLCByZXNwb25zZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWVkaWFUeXBlV2l0aFF1b3RlZEJvdW5kYXJ5UmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgVVJMIHVybCA9IG5ldyBVUkwoZ2V0QmFzZVVyaSgpLnRvU3RyaW5nKCkgKyAiTWVkaWFUeXBlV2l0aEJvdW5kYXJ5UmVzb3VyY2UiKTsKKyAgICAgICAgZmluYWwgSHR0cFVSTENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IChIdHRwVVJMQ29ubmVjdGlvbikgdXJsLm9wZW5Db25uZWN0aW9uKCk7CisKKyAgICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0TWV0aG9kKCJQVVQiKTsKKyAgICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0UHJvcGVydHkoIkFjY2VwdCIsICJ0ZXh0L3BsYWluIik7CisgICAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KCJDb250ZW50LVR5cGUiLCAibXVsdGlwYXJ0L2Zvcm0tZGF0YTsgYm91bmRhcnk9XCJYWFhYX1lZWVlcIiIpOworCisgICAgICAgIGNvbm5lY3Rpb24uc2V0RG9PdXRwdXQodHJ1ZSk7CisgICAgICAgIGNvbm5lY3Rpb24uY29ubmVjdCgpOworCisgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBjb25uZWN0aW9uLmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICBvdXRwdXRTdHJlYW0ud3JpdGUoIi0tWFhYWF9ZWVlZIi5nZXRCeXRlcygpKTsKKyAgICAgICAgb3V0cHV0U3RyZWFtLndyaXRlKCdcbicpOworICAgICAgICBvdXRwdXRTdHJlYW0ud3JpdGUoIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbiIuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIG91dHB1dFN0cmVhbS53cml0ZSgnXG4nKTsKKyAgICAgICAgb3V0cHV0U3RyZWFtLndyaXRlKCJDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCJzdWJtaXRcIiIuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIG91dHB1dFN0cmVhbS53cml0ZSgnXG4nKTsKKyAgICAgICAgb3V0cHV0U3RyZWFtLndyaXRlKCdcbicpOworICAgICAgICBvdXRwdXRTdHJlYW0ud3JpdGUoIk9LIi5nZXRCeXRlcygpKTsKKyAgICAgICAgb3V0cHV0U3RyZWFtLndyaXRlKCdcbicpOworICAgICAgICBvdXRwdXRTdHJlYW0ud3JpdGUoIi0tWFhYWF9ZWVlZLS0iLmdldEJ5dGVzKCkpOworICAgICAgICBvdXRwdXRTdHJlYW0ud3JpdGUoJ1xuJyk7CisgICAgICAgIG91dHB1dFN0cmVhbS5mbHVzaCgpOworCisgICAgICAgIGFzc2VydEVxdWFscygiT0siLCBjb25uZWN0aW9uLmdldFJlc3BvbnNlTWVzc2FnZSgpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiL0ZpbGVSZXNvdXJjZSIpCisgICAgQENvbnN1bWVzKCJtdWx0aXBhcnQvZm9ybS1kYXRhIikKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmlsZVJlc291cmNlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgiSW5qZWN0ZWRGaWxlTm90Q29waWVkIikKKyAgICAgICAgcHVibGljIFN0cmluZyBpbmplY3RlZEZpbGVOb3RDb3BpZWQoQEZvcm1EYXRhUGFyYW0oImZpbGUiKSBmaW5hbCBGaWxlIGZpbGUpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwYXRoID0gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgICAgIC8vbm9pbnNwZWN0aW9uIFJlc3VsdE9mTWV0aG9kQ2FsbElnbm9yZWQKKyAgICAgICAgICAgIGZpbGUuZGVsZXRlKCk7CisgICAgICAgICAgICByZXR1cm4gcGF0aDsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJFeGNlcHRpb25Jbk1ldGhvZCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZXhjZXB0aW9uSW5NZXRob2QoQEZvcm1EYXRhUGFyYW0oImZpbGUiKSBmaW5hbCBGaWxlIGZpbGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbihSZXNwb25zZS5zZXJ2ZXJFcnJvcigpLmVudGl0eShmaWxlLmdldEFic29sdXRlUGF0aCgpKS5idWlsZCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJTdWNjZXNzZnVsTWV0aG9kIikKKyAgICAgICAgcHVibGljIFN0cmluZyBzdWNjZXNzZnVsTWV0aG9kKEBGb3JtRGF0YVBhcmFtKCJmaWxlIikgZmluYWwgRmlsZSBmaWxlKSB7CisgICAgICAgICAgICByZXR1cm4gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJGaWxlU2l6ZSIpCisgICAgICAgIHB1YmxpYyBsb25nIGZpbGVTaXplKEBGb3JtRGF0YVBhcmFtKCJmaWxlIikgZmluYWwgRmlsZSBmaWxlKSB7CisgICAgICAgICAgICByZXR1cm4gZmlsZS5sZW5ndGgoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEpFUlNFWS0yNjYzIHJlcHJvZHVjZXIuIE1ha2Ugc3VyZSB0aGF0IHRlbXBvcmFyeSBmaWxlIGNyZWF0ZWQgYnkgTUlNRVB1bGwgaXMgbm90IGNvcGllZCBpbnRvIG5ldyB0ZW1wb3JhcnkgZmlsZSBjcmVhdGVkCisgICAgICogYnkgSmVyc2V5LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluamVjdGVkRmlsZU5vdENvcGllZChATW9ja2VkIGZpbmFsIEJvZHlQYXJ0RW50aXR5IGVudGl0eSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEZvcm1EYXRhTXVsdGlQYXJ0IG11bHRpcGFydCA9IG5ldyBGb3JtRGF0YU11bHRpUGFydCgpOworICAgICAgICBmaW5hbCBGb3JtRGF0YUJvZHlQYXJ0IGJvZHlwYXJ0ID0gbmV3IEZvcm1EYXRhQm9keVBhcnQoRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24ubmFtZSgiZmlsZSIpLmZpbGVOYW1lKCJmaWxlIikuYnVpbGQoKSwKKyAgICAgICAgICAgICAgICAiQ09OVEVOVCIpOworICAgICAgICBtdWx0aXBhcnQuYm9keVBhcnQoYm9keXBhcnQpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiRmlsZVJlc291cmNlIikucGF0aCgiSW5qZWN0ZWRGaWxlTm90Q29waWVkIikKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eShtdWx0aXBhcnQsIE1lZGlhVHlwZS5NVUxUSVBBUlRfRk9STV9EQVRBKSk7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIE1pbWVwdWxsIHRlbXAgZmlsZSBoYXMgYmVlbiBtb3ZlZCB0byBzcGVjaWZpYyBmaWxlLgorICAgICAgICBuZXcgVmVyaWZpY2F0aW9ucygpIHt7CisgICAgICAgICAgICBlbnRpdHkubW92ZVRvKHdpdGhJbnN0YW5jZU9mKEZpbGUuY2xhc3MpKTsKKyAgICAgICAgICAgIHRpbWVzID0gMTsKKyAgICAgICAgfX07CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHRlbXAgZmlsZSBoYXMgYmVlbiByZW1vdmVkLgorICAgICAgICBmaW5hbCBTdHJpbmcgcGF0aG5hbWUgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIC8vIFdhaXQgYSBzZWNvbmQgdG8gbWFrZSBzdXJlIHRoZSBmaWxlIGRvZXNuJ3QgZXhpc3QuCisgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKKworICAgICAgICBhc3NlcnRUaGF0KCJUZW1wb3JhcnkgZmlsZSwgIiArIHBhdGhuYW1lICsgIiwgb24gdGhlIHNlcnZlciBoYXMgbm90IGJlZW4gcmVtb3ZlZCIsCisgICAgICAgICAgICAgICAgbmV3IEZpbGUocGF0aG5hbWUpLmV4aXN0cygpLCBpcyhmYWxzZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEpFUlNFWS0yODQ2IHJlcHJvZHVjZXIuIE1ha2Ugc3VyZSB0aGF0IHRlbXBvcmFyeSBmaWxlIGNyZWF0ZWQgYnkgTUlNRVB1bGwgZGVsZXRlZCBhZnRlciBhIHN1Y2Nlc3NmdWwgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlbXBGaWxlRGVsZXRlZEFmdGVyU3VjY2Vzc2Z1bFByb2Nlc3NpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgRm9ybURhdGFNdWx0aVBhcnQgbXVsdGlwYXJ0ID0gbmV3IEZvcm1EYXRhTXVsdGlQYXJ0KCk7CisgICAgICAgIGZpbmFsIEZvcm1EYXRhQm9keVBhcnQgYm9keXBhcnQgPSBuZXcgRm9ybURhdGFCb2R5UGFydChGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbi5uYW1lKCJmaWxlIikuZmlsZU5hbWUoImZpbGUiKS5idWlsZCgpLAorICAgICAgICAgICAgICAgICJDT05URU5UIik7CisgICAgICAgIG11bHRpcGFydC5ib2R5UGFydChib2R5cGFydCk7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJGaWxlUmVzb3VyY2UiKS5wYXRoKCJTdWNjZXNzZnVsTWV0aG9kIikKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eShtdWx0aXBhcnQsIE1lZGlhVHlwZS5NVUxUSVBBUlRfRk9STV9EQVRBKSk7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHRlbXAgZmlsZSBoYXMgYmVlbiByZW1vdmVkLgorICAgICAgICBmaW5hbCBTdHJpbmcgcGF0aG5hbWUgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIC8vIFdhaXQgYSBzZWNvbmQgdG8gbWFrZSBzdXJlIHRoZSBmaWxlIGRvZXNuJ3QgZXhpc3QuCisgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKKworICAgICAgICBhc3NlcnRUaGF0KCJUZW1wb3JhcnkgZmlsZSwgIiArIHBhdGhuYW1lICsgIiwgb24gdGhlIHNlcnZlciBoYXMgbm90IGJlZW4gcmVtb3ZlZCIsCisgICAgICAgICAgICAgICAgbmV3IEZpbGUocGF0aG5hbWUpLmV4aXN0cygpLCBpcyhmYWxzZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEpFUlNFWS0yODQ2IHJlcHJvZHVjZXIuIE1ha2Ugc3VyZSB0aGF0IHRlbXBvcmFyeSBmaWxlIGNyZWF0ZWQgYnkgTUlNRVB1bGwgZGVsZXRlZCBhZnRlciBhbiB1bnN1Y2Nlc3NmdWwgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlbXBGaWxlRGVsZXRlZEFmdGVyRXhjZXB0aW9uSW5NZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgRm9ybURhdGFNdWx0aVBhcnQgbXVsdGlwYXJ0ID0gbmV3IEZvcm1EYXRhTXVsdGlQYXJ0KCk7CisgICAgICAgIGZpbmFsIEZvcm1EYXRhQm9keVBhcnQgYm9keXBhcnQgPSBuZXcgRm9ybURhdGFCb2R5UGFydChGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbi5uYW1lKCJmaWxlIikuZmlsZU5hbWUoImZpbGUiKS5idWlsZCgpLAorICAgICAgICAgICAgICAgICJDT05URU5UIik7CisgICAgICAgIG11bHRpcGFydC5ib2R5UGFydChib2R5cGFydCk7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJGaWxlUmVzb3VyY2UiKS5wYXRoKCJFeGNlcHRpb25Jbk1ldGhvZCIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkobXVsdGlwYXJ0LCBNZWRpYVR5cGUuTVVMVElQQVJUX0ZPUk1fREFUQSkpOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSB0ZW1wIGZpbGUgaGFzIGJlZW4gcmVtb3ZlZC4KKyAgICAgICAgZmluYWwgU3RyaW5nIHBhdGhuYW1lID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICAvLyBXYWl0IGEgc2Vjb25kIHRvIG1ha2Ugc3VyZSB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0LgorICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdCgiVGVtcG9yYXJ5IGZpbGUsICIgKyBwYXRobmFtZSArICIsIG9uIHRoZSBzZXJ2ZXIgaGFzIG5vdCBiZWVuIHJlbW92ZWQiLAorICAgICAgICAgICAgICAgIG5ldyBGaWxlKHBhdGhuYW1lKS5leGlzdHMoKSwgaXMoZmFsc2UpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBKRVJTRVktMjg2MiByZXByb2R1Y2VyLiBNYWtlIHN1cmUgdGhhdCBtaW1lcHVsbCBpcyBhYmxlIHRvIG1vdmUgaXQncyB0ZW1wb3JhcnkgZmlsZSB0byB0aGUgb25lIGNyZWF0ZWQgYnkgSmVyc2V5LgorICAgICAqIFJlcHJvZHVjaWJsZSBvbmx5IG9uIFdpbmRvd3MuIEVudGl0eSBzaXplIGhhcyB0byBiZSBiaWdnZXIgdGhhbiA4MTkyIHRvIG1ha2Ugc3VyZSBtaW1lcHVsbCBjcmVhdGVzIHRlbXBvcmFyeSBmaWxlLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpbGVTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEZvcm1EYXRhTXVsdGlQYXJ0IG11bHRpcGFydCA9IG5ldyBGb3JtRGF0YU11bHRpUGFydCgpOworICAgICAgICBmaW5hbCBieXRlW10gY29udGVudCA9IG5ldyBieXRlWzIgKiA4MTkyXTsKKyAgICAgICAgZmluYWwgRm9ybURhdGFCb2R5UGFydCBib2R5cGFydCA9IG5ldyBGb3JtRGF0YUJvZHlQYXJ0KEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uLm5hbWUoImZpbGUiKS5maWxlTmFtZSgiZmlsZSIpLmJ1aWxkKCksCisgICAgICAgICAgICAgICAgY29udGVudCwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSk7CisgICAgICAgIG11bHRpcGFydC5ib2R5UGFydChib2R5cGFydCk7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJGaWxlUmVzb3VyY2UiKS5wYXRoKCJGaWxlU2l6ZSIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkobXVsdGlwYXJ0LCBNZWRpYVR5cGUuTVVMVElQQVJUX0ZPUk1fREFUQSkpOworCisgICAgICAgIGFzc2VydFRoYXQoIlRlbXBvcmFyeSBmaWxlIGhhcyB3cm9uZyBzaXplLiIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoaW50LmNsYXNzKSwgaXMoY29udGVudC5sZW5ndGgpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiL0lucHV0U3RyZWFtUmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5wdXRTdHJlYW1SZXNvdXJjZSB7CisKKyAgICAgICAgQFBVVAorICAgICAgICBAQ29uc3VtZXMoIm11bHRpcGFydC9mb3JtLWRhdGEiKQorICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHB1dChARm9ybURhdGFQYXJhbSgic3VibWl0IikgZmluYWwgSW5wdXRTdHJlYW0gc3RyZWFtKSB7CisgICAgICAgICAgICByZXR1cm4gIk9LIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE1vY2tlZCBKRVJTRVktMjc5NCByZXByb2R1Y2VyLiBSZWFsIHRlc3QgaXMgdW5kZXIgaW50ZWdyYXRpb24gdGVzdHMuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBtaW1lVGVtcEZpbGVSZW1vdmVkQWZ0ZXJBYm9ydGVkVXBsb2FkKEBNb2NrZWQgZmluYWwgTUlNRU1lc3NhZ2UgbWVzc2FnZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIG5ldyBFeHBlY3RhdGlvbnMoKSB7eworICAgICAgICAgICAgbWVzc2FnZS5nZXRBdHRhY2htZW50cygpOworICAgICAgICAgICAgcmVzdWx0ID0gbmV3IE1JTUVQYXJzaW5nRXhjZXB0aW9uKCk7CisgICAgICAgIH19OworCisgICAgICAgIGZpbmFsIFVSTCB1cmwgPSBuZXcgVVJMKGdldEJhc2VVcmkoKS50b1N0cmluZygpICsgIk1lZGlhVHlwZVdpdGhCb3VuZGFyeVJlc291cmNlIik7CisgICAgICAgIGZpbmFsIEh0dHBVUkxDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSAoSHR0cFVSTENvbm5lY3Rpb24pIHVybC5vcGVuQ29ubmVjdGlvbigpOworCisgICAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdE1ldGhvZCgiUFVUIik7CisgICAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KCJBY2NlcHQiLCAidGV4dC9wbGFpbiIpOworICAgICAgICBjb25uZWN0aW9uLnNldFJlcXVlc3RQcm9wZXJ0eSgiQ29udGVudC1UeXBlIiwgIm11bHRpcGFydC9mb3JtLWRhdGE7IGJvdW5kYXJ5PVhYWFhfWVlZWSIpOworCisgICAgICAgIGNvbm5lY3Rpb24uc2V0RG9PdXRwdXQodHJ1ZSk7CisgICAgICAgIGNvbm5lY3Rpb24uY29ubmVjdCgpOworCisgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBjb25uZWN0aW9uLmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICBvdXRwdXRTdHJlYW0ud3JpdGUoIi0tWFhYWF9ZWVlZIi5nZXRCeXRlcygpKTsKKyAgICAgICAgb3V0cHV0U3RyZWFtLndyaXRlKCdcbicpOworICAgICAgICBvdXRwdXRTdHJlYW0ud3JpdGUoIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbiIuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIG91dHB1dFN0cmVhbS53cml0ZSgnXG4nKTsKKyAgICAgICAgb3V0cHV0U3RyZWFtLndyaXRlKCJDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCJiaWctcGFydFwiIi5nZXRCeXRlcygpKTsKKyAgICAgICAgb3V0cHV0U3RyZWFtLndyaXRlKCdcbicpOworICAgICAgICBvdXRwdXRTdHJlYW0ud3JpdGUoJ1xuJyk7CisKKyAgICAgICAgLy8gU2VuZCBiaWcgY2h1bmsgb2YgZGF0YS4KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNiAqIDQwOTY7IGkrKykgeworICAgICAgICAgICAgb3V0cHV0U3RyZWFtLndyaXRlKCdFJyk7CisgICAgICAgICAgICBpZiAoaSAlIDEwMjQgPT0gMCkgeworICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS5mbHVzaCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRG8gTk9UIHNlbmQgZW5kIG9mIHRoZSBNdWx0aVBhcnQgbWVzc2FnZSB0byBzaW11bGF0ZSB0aGUgaXNzdWUuCisKKyAgICAgICAgLy8gR2V0IFJlc3BvbnNlIC4uLgorICAgICAgICBmaW5hbCBpbnQgcmVzcG9uc2UgPSBjb25uZWN0aW9uLmdldFJlc3BvbnNlQ29kZSgpOworICAgICAgICAvLyAuLi4gRGlzY29ubmVjdC4KKyAgICAgICAgY29ubmVjdGlvbi5kaXNjb25uZWN0KCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdCgiQmFkIFJlcXVlc3QgZXhwZWN0ZWQiLCByZXNwb25zZSwgaXMoNDAwKSk7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIE1pbWVwdWxsIG1lc3NhZ2UgYW5kIGl0J3MgcGFydHMgaGF2ZSBiZWVuIGNsb3NlZCBhbmQgdGVtcG9yYXJ5IGZpbGVzIGRlbGV0ZWQuCisgICAgICAgIG5ldyBWZXJpZmljYXRpb25zKCkge3sKKyAgICAgICAgICAgIG1lc3NhZ2UuY2xvc2UoKTsKKyAgICAgICAgICAgIHRpbWVzID0gMTsKKyAgICAgICAgfX07CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrRW50aXR5KGZpbmFsIFN0cmluZyBleHBlY3RlZCwgZmluYWwgQm9keVBhcnRFbnRpdHkgZW50aXR5KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBDb252ZXJ0IHRoZSByYXcgYnl0ZXMgaW50byBhIFN0cmluZworICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbVJlYWRlciBzciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihlbnRpdHkuZ2V0SW5wdXRTdHJlYW0oKSk7CisgICAgICAgIGZpbmFsIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBjaCA9IHNyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChjaCA8IDApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3LmFwcGVuZCgoY2hhcikgY2gpOworICAgICAgICB9CisgICAgICAgIC8vIFBlcmZvcm0gdGhlIGNvbXBhcmlzb24KKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzdy50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tNZWRpYVR5cGUoZmluYWwgTWVkaWFUeXBlIGV4cGVjdGVkLCBmaW5hbCBNZWRpYVR5cGUgYWN0dWFsKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgTWVkaWFUeXBlPSIgKyBleHBlY3RlZCwgZXhwZWN0ZWQuZ2V0VHlwZSgpLCBhY3R1YWwuZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCBNZWRpYVR5cGU9IiArIGV4cGVjdGVkLCBleHBlY3RlZC5nZXRTdWJ0eXBlKCksIGFjdHVhbC5nZXRTdWJ0eXBlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL211bHRpcGFydC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9pbnRlcm5hbC9NdWx0aVBhcnRCZWFuLmphdmEgYi9tZWRpYS9tdWx0aXBhcnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9tdWx0aXBhcnQvaW50ZXJuYWwvTXVsdGlQYXJ0QmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiYmE2YTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdWx0aXBhcnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9tdWx0aXBhcnQvaW50ZXJuYWwvTXVsdGlQYXJ0QmVhbi5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LmludGVybmFsOworCisvKioKKyAqIDxwPkEgSmF2YUJlYW4gY2xhc3MgdGhhdCBjYW4gYmUgc2VyaWFsaXplZCBhbmQgZGVzZXJpYWxpemVkIGJ5IEpBWC1SUworICogcHJvdmlkZXJzLjwvcD4KKyAqLworcHVibGljIGNsYXNzIE11bHRpUGFydEJlYW4geworCisgICAgcHVibGljIE11bHRpUGFydEJlYW4oKSB7CisgICAgfQorCisgICAgcHVibGljIE11bHRpUGFydEJlYW4oU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7CisgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWUgPSBudWxsOworCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9tZWRpYS9tdWx0aXBhcnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9tdWx0aXBhcnQvaW50ZXJuYWwvTXVsdGlQYXJ0QmVhblByb3ZpZGVyLmphdmEgYi9tZWRpYS9tdWx0aXBhcnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9tdWx0aXBhcnQvaW50ZXJuYWwvTXVsdGlQYXJ0QmVhblByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVjMzkyZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL211bHRpcGFydC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9pbnRlcm5hbC9NdWx0aVBhcnRCZWFuUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCisvKioKKyAqIEEgSkFYLVJTIDxjb2RlPlByb3ZpZGVyPC9jb2RlPiB0aGF0IGtub3dzIGhvdyB0byBzZXJpYWxpemUgYW5kIGRlc2VyaWFsaXplCisgKiB7QGxpbmsgTXVsdGlQYXJ0QmVhbn0gaW5zdGFuY2VzLgorICovCitAUHJvdmlkZXIKK0BDb25zdW1lcygieC1hcHBsaWNhdGlvbi94LWZvcm1hdCIpCitAUHJvZHVjZXMoIngtYXBwbGljYXRpb24veC1mb3JtYXQiKQorcHVibGljIGNsYXNzIE11bHRpUGFydEJlYW5Qcm92aWRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5UmVhZGVyPE11bHRpUGFydEJlYW4+LCBNZXNzYWdlQm9keVdyaXRlcjxNdWx0aVBhcnRCZWFuPiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZWRpYVR5cGUgQ1VTVE9NX01FRElBX1RZUEUgPSBuZXcgTWVkaWFUeXBlKCJ4LWFwcGxpY2F0aW9uIiwgIngtZm9ybWF0Iik7CisKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKGZpbmFsIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworCisgICAgICAgIHJldHVybiB0eXBlLmlzQXNzaWduYWJsZUZyb20oTXVsdGlQYXJ0QmVhbi5jbGFzcykgJiYgbWVkaWFUeXBlLmVxdWFscyhDVVNUT01fTUVESUFfVFlQRSk7CisgICAgfQorCisgICAgcHVibGljIE11bHRpUGFydEJlYW4gcmVhZEZyb20oZmluYWwgQ2xhc3M8TXVsdGlQYXJ0QmVhbj4gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgZmluYWwgSW5wdXRTdHJlYW1SZWFkZXIgcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKHN0cmVhbSk7CisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpbnQgY2ggPSByZWFkZXIucmVhZCgpOworICAgICAgICAgICAgaWYgKChjaCA8IDApIHx8ICgoY2hhcikgY2ggPT0gJ1xuJykpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKChjaGFyKSBjaCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgbGluZSA9IHNiLnRvU3RyaW5nKCk7CisgICAgICAgIGludCBlcXVhbHMgPSBsaW5lLmluZGV4T2YoJz0nKTsKKyAgICAgICAgaWYgKGVxdWFscyA8IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW5wdXQgY29udGVudCAnIiArIGxpbmUgKyAiJyBpcyBub3QgaW4gYSB2YWxpZCBmb3JtYXQiKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3IE11bHRpUGFydEJlYW4obGluZS5zdWJzdHJpbmcoMCwgZXF1YWxzKSwgbGluZS5zdWJzdHJpbmcoZXF1YWxzICsgMSkpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKGZpbmFsIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworCisgICAgICAgIHJldHVybiB0eXBlLmlzQXNzaWduYWJsZUZyb20oTXVsdGlQYXJ0QmVhbi5jbGFzcykgJiYgbWVkaWFUeXBlLmVxdWFscyhDVVNUT01fTUVESUFfVFlQRSk7CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShmaW5hbCBNdWx0aVBhcnRCZWFuIGVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVUbyhmaW5hbCBNdWx0aVBhcnRCZWFuIGVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBoZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgT3V0cHV0U3RyZWFtV3JpdGVyIHdyaXRlciA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoc3RyZWFtKTsKKyAgICAgICAgd3JpdGVyLndyaXRlKGVudGl0eS5nZXROYW1lKCkpOworICAgICAgICB3cml0ZXIud3JpdGUoJz0nKTsKKyAgICAgICAgd3JpdGVyLndyaXRlKGVudGl0eS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgd3JpdGVyLndyaXRlKCdcbicpOworICAgICAgICB3cml0ZXIuZmx1c2goKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL21lZGlhL211bHRpcGFydC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9pbnRlcm5hbC9NdWx0aVBhcnRIZWFkZXJNb2RpZmljYXRpb25UZXN0LmphdmEgYi9tZWRpYS9tdWx0aXBhcnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9tdWx0aXBhcnQvaW50ZXJuYWwvTXVsdGlQYXJ0SGVhZGVyTW9kaWZpY2F0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNjcwNDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tdWx0aXBhcnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9tdWx0aXBhcnQvaW50ZXJuYWwvTXVsdGlQYXJ0SGVhZGVyTW9kaWZpY2F0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5CYWRSZXF1ZXN0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuYXBhY2hlLmNvbm5lY3Rvci5BcGFjaGVDb25uZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5IdHRwVXJsQ29ubmVjdG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnNwaS5Db25uZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5LmNvbm5lY3Rvci5Hcml6emx5Q29ubmVjdG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dHkuY29ubmVjdG9yLkpldHR5Q29ubmVjdG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0Lk11bHRpUGFydDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuY29udGFpbnNTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBKRVJTRVktMjEyMyByZXByb2R1Y2VyLgorICogPHAvPgorICogRGVsZXRlIHRoaXMgdGVzdCB3aGVuIEpFUlNFWS0yMzQxIGZpeGVkLgorICoKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgTXVsdGlQYXJ0SGVhZGVyTW9kaWZpY2F0aW9uVGVzdCBleHRlbmRzIE11bHRpUGFydEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBmaW5hbCBDb25uZWN0b3JQcm92aWRlciBjb25uZWN0b3JQcm92aWRlcjsKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbWVzc2FnZUxvZ2dlZDsKKworICAgIHB1YmxpYyBNdWx0aVBhcnRIZWFkZXJNb2RpZmljYXRpb25UZXN0KENsYXNzPD8gZXh0ZW5kcyBDb25uZWN0b3JQcm92aWRlcj4gY29ubmVjdG9yUHJvdmlkZXJDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG1lc3NhZ2VMb2dnZWQpCisgICAgICAgICAgICB0aHJvd3MgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMuY29ubmVjdG9yUHJvdmlkZXIgPSBjb25uZWN0b3JQcm92aWRlckNsYXNzLm5ld0luc3RhbmNlKCk7CisgICAgICAgIHRoaXMubWVzc2FnZUxvZ2dlZCA9IG1lc3NhZ2VMb2dnZWQ7CisgICAgfQorCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gIntpbmRleH06IHswfSAvIHsxfSIpCisgICAgcHVibGljIHN0YXRpYyBMaXN0PE9iamVjdFtdPiB0ZXN0RGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW10geworICAgICAgICAgICAgICAgIHtIdHRwVXJsQ29ubmVjdG9yUHJvdmlkZXIuY2xhc3MsIGZhbHNlfSwKKyAgICAgICAgICAgICAgICB7R3JpenpseUNvbm5lY3RvclByb3ZpZGVyLmNsYXNzLCB0cnVlfSwKKyAgICAgICAgICAgICAgICB7SmV0dHlDb25uZWN0b3JQcm92aWRlci5jbGFzcywgdHJ1ZX0sCisgICAgICAgICAgICAgICAge0FwYWNoZUNvbm5lY3RvclByb3ZpZGVyLmNsYXNzLCB0cnVlfSwKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFNldDxDbGFzczw/Pj4gZ2V0UmVzb3VyY2VDbGFzc2VzKCkgeworICAgICAgICBmaW5hbCBIYXNoU2V0PENsYXNzPD8+PiBjbGFzc2VzID0gbmV3IEhhc2hTZXQ8Q2xhc3M8Pz4+KCk7CisgICAgICAgIGNsYXNzZXMuYWRkKE11bHRpUGFydFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIGNsYXNzZXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgc2V0KFRlc3RQcm9wZXJ0aWVzLlJFQ09SRF9MT0dfTEVWRUwsIExldmVsLldBUk5JTkcuaW50VmFsdWUoKSk7CisgICAgICAgIHJldHVybiBzdXBlci5jb25maWd1cmUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNsaWVudENvbmZpZykgeworICAgICAgICBzdXBlci5jb25maWd1cmVDbGllbnQoY2xpZW50Q29uZmlnKTsKKyAgICAgICAgY2xpZW50Q29uZmlnLmNvbm5lY3RvclByb3ZpZGVyKGNvbm5lY3RvclByb3ZpZGVyKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb2dNZXNzYWdlKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCkucGF0aCgibXVsdGlwYXJ0L3RlbiIpOworCisgICAgICAgIE11bHRpUGFydEJlYW4gYmVhbiA9IG5ldyBNdWx0aVBhcnRCZWFuKCJteW5hbWUiLCAibXl2YWx1ZSIpOworICAgICAgICBNdWx0aVBhcnQgZW50aXR5ID0gbmV3IE11bHRpUGFydCgpCisgICAgICAgICAgICAgICAgLmJvZHlQYXJ0KGJlYW4sIG5ldyBNZWRpYVR5cGUoIngtYXBwbGljYXRpb24iLCAieC1mb3JtYXQiKSkKKyAgICAgICAgICAgICAgICAuYm9keVBhcnQoIiIsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9PQ1RFVF9TVFJFQU1fVFlQRSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIFVOU0VOVF9IRUFERVJfQ0hBTkdFUyA9ICJVbnNlbnQgaGVhZGVyIGNoYW5nZXMiOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGFyZ2V0LnJlcXVlc3QoInRleHQvcGxhaW4iKS5wdXQoRW50aXR5LmVudGl0eShlbnRpdHksICJtdWx0aXBhcnQvbWl4ZWQiKSwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKCJCYWRSZXF1ZXN0RXhjZXB0aW9uIGNhbiBub3QgYmUgdGhyb3duIGp1c3QgaW4gY2FzZSBKRVJTRVktMjM0MSBpcyBub3QgZml4ZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgbWVzc2FnZUxvZ2dlZCk7CisgICAgICAgICAgICBMb2dSZWNvcmQgbG9nUmVjb3JkID0gZmluZExvZ1JlY29yZChVTlNFTlRfSEVBREVSX0NIQU5HRVMpOworICAgICAgICAgICAgYXNzZXJ0TnVsbChsb2dSZWNvcmQpOworICAgICAgICB9IGNhdGNoIChCYWRSZXF1ZXN0RXhjZXB0aW9uIGJyZXgpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkJhZFJlcXVlc3RFeGNlcHRpb24gY2FuIGJlIHRocm93biBqdXN0IGluIGNhc2UgSkVSU0VZLTIzNDEgaXMgbm90IGZpeGVkLiIsCisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VMb2dnZWQpOworICAgICAgICAgICAgTG9nUmVjb3JkIGxvZ1JlY29yZCA9IGZpbmRMb2dSZWNvcmQoVU5TRU5UX0hFQURFUl9DSEFOR0VTKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoIk1pc3NpbmcgTG9nUmVjb3JkIGZvciBtZXNzYWdlICciICsgVU5TRU5UX0hFQURFUl9DSEFOR0VTICsgIicuIiwgbG9nUmVjb3JkKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQobG9nUmVjb3JkLmdldE1lc3NhZ2UoKSwgY29udGFpbnNTdHJpbmcoIk1JTUUtVmVyc2lvbiIpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQobG9nUmVjb3JkLmdldE1lc3NhZ2UoKSwgY29udGFpbnNTdHJpbmcoIkNvbnRlbnQtVHlwZSIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgTG9nUmVjb3JkIGZpbmRMb2dSZWNvcmQoU3RyaW5nIG1lc3NhZ2VDb250YWlucykgeworICAgICAgICBmb3IgKGZpbmFsIExvZ1JlY29yZCByZWNvcmQgOiBnZXRMb2dnZWRSZWNvcmRzKCkpIHsKKyAgICAgICAgICAgIGlmIChyZWNvcmQuZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKG1lc3NhZ2VDb250YWlucykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVjb3JkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbXVsdGlwYXJ0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvbXVsdGlwYXJ0L2ludGVybmFsL011bHRpUGFydEplcnNleVRlc3QuamF2YSBiL21lZGlhL211bHRpcGFydC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9pbnRlcm5hbC9NdWx0aVBhcnRKZXJzZXlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNlNDFhZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL211bHRpcGFydC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9pbnRlcm5hbC9NdWx0aVBhcnRKZXJzZXlUZXN0LmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0Lk11bHRpUGFydEZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworCisvKioKKyAqIENvbW1vbiBwYXJlbnQgY2xhc3MgZm9yIE11bHRpUGFydCB0ZXN0IGNhc2VzLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCithYnN0cmFjdCBjbGFzcyBNdWx0aVBhcnRKZXJzZXlUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihNdWx0aVBhcnRKZXJzZXlUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworCisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlckNsYXNzZXMoZ2V0UmVzb3VyY2VDbGFzc2VzKCkpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyQ2xhc3NlcyhNdWx0aVBhcnRCZWFuUHJvdmlkZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVySW5zdGFuY2VzKG5ldyBMb2dnaW5nRmVhdHVyZShMT0dHRVIsIExvZ2dpbmdGZWF0dXJlLlZlcmJvc2l0eS5QQVlMT0FEX0FOWSkpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKG5ldyBNdWx0aVBhcnRGZWF0dXJlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzZXQgb2YgcmVzb3VyY2UgY2xhc3NlcyBuZWVkZWQgYnkgdGhpcyB0ZXN0LgorICAgICAqCisgICAgICogQHJldHVybiBzZXQgb2YgcmVzb3VyY2UgY2xhc3Nlcy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU2V0PENsYXNzPD8+PiBnZXRSZXNvdXJjZUNsYXNzZXMoKTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihNdWx0aVBhcnRGZWF0dXJlLmNsYXNzKS5yZWdpc3RlcihNdWx0aVBhcnRCZWFuUHJvdmlkZXIuY2xhc3MpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbXVsdGlwYXJ0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvbXVsdGlwYXJ0L2ludGVybmFsL011bHRpUGFydFJlYWRlcldyaXRlclRlc3QuamF2YSBiL21lZGlhL211bHRpcGFydC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9pbnRlcm5hbC9NdWx0aVBhcnRSZWFkZXJXcml0ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJiMDJmMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL211bHRpcGFydC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL211bHRpcGFydC9pbnRlcm5hbC9NdWx0aVBhcnRSZWFkZXJXcml0ZXJUZXN0LmphdmEKQEAgLTAsMCArMSwzMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoOworaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LkJvZHlQYXJ0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5Cb2R5UGFydEVudGl0eTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuTXVsdGlQYXJ0OworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICogVW5pdCB0ZXN0cyBmb3Ige0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5pbnRlcm5hbC5NdWx0aVBhcnRSZWFkZXJDbGllbnRTaWRlfSAoaW4gdGhlIGNsaWVudCkgYW5kCisgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LmludGVybmFsLk11bHRpUGFydFdyaXRlcn0gKGluIHRoZSBzZXJ2ZXIpCisgLiovCitwdWJsaWMgY2xhc3MgTXVsdGlQYXJ0UmVhZGVyV3JpdGVyVGVzdCBleHRlbmRzIE11bHRpUGFydEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgUGF0aCBUTVBfRElSRUNUT1JZOworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBPUklHSU5BTF9UTVBfRElSRUNUT1JZOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisKKyAgICAgICAgT1JJR0lOQUxfVE1QX0RJUkVDVE9SWSA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKTsKKworICAgICAgICBUTVBfRElSRUNUT1JZID0gRmlsZXMuY3JlYXRlVGVtcERpcmVjdG9yeShNdWx0aVBhcnRSZWFkZXJXcml0ZXJUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiLCBUTVBfRElSRUNUT1JZLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIEZpbGVzLmRlbGV0ZShUTVBfRElSRUNUT1JZKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiLCBPUklHSU5BTF9UTVBfRElSRUNUT1JZKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTZXQ8Q2xhc3M8Pz4+IGdldFJlc291cmNlQ2xhc3NlcygpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLjxDbGFzczw/Pj5zaW5nbGV0b24oTXVsdGlQYXJ0UmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFplcm8oKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKS5wYXRoKCJtdWx0aXBhcnQiKS5wYXRoKCJ6ZXJvIik7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQgPSB0YXJnZXQucmVxdWVzdCgidGV4dC9wbGFpbiIpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkhlbGxvLCB3b3JsZFxyXG4iLCByZXN1bHQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uZSgpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpLnBhdGgoIm11bHRpcGFydC9vbmUiKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgTXVsdGlQYXJ0IHJlc3VsdCA9IHRhcmdldC5yZXF1ZXN0KCJtdWx0aXBhcnQvbWl4ZWQiKS5nZXQoTXVsdGlQYXJ0LmNsYXNzKTsKKyAgICAgICAgICAgIGNoZWNrTWVkaWFUeXBlKG5ldyBNZWRpYVR5cGUoIm11bHRpcGFydCIsICJtaXhlZCIpLCByZXN1bHQuZ2V0TWVkaWFUeXBlKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHJlc3VsdC5nZXRCb2R5UGFydHMoKS5zaXplKCkpOworICAgICAgICAgICAgZmluYWwgQm9keVBhcnQgcGFydCA9IHJlc3VsdC5nZXRCb2R5UGFydHMoKS5nZXQoMCk7CisgICAgICAgICAgICBjaGVja01lZGlhVHlwZShuZXcgTWVkaWFUeXBlKCJ0ZXh0IiwgInBsYWluIiksIHBhcnQuZ2V0TWVkaWFUeXBlKCkpOworICAgICAgICAgICAgY2hlY2tFbnRpdHkoIlRoaXMgaXMgdGhlIG9ubHkgc2VnbWVudCIsIChCb2R5UGFydEVudGl0eSkgcGFydC5nZXRFbnRpdHkoKSk7CisKKyAgICAgICAgICAgIHJlc3VsdC5nZXRQYXJhbWV0ZXJpemVkSGVhZGVycygpOworICAgICAgICAgICAgcmVzdWx0LmNsZWFudXAoKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gfCBQYXJzZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKKyAgICAgICAgICAgIGZhaWwoIkNhdWdodCBleGNlcHRpb246ICIgKyBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVUYWcoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKS5wYXRoKCJtdWx0aXBhcnQvZXRhZyIpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBNdWx0aVBhcnQgcmVzdWx0ID0gdGFyZ2V0LnJlcXVlc3QoIm11bHRpcGFydC9taXhlZCIpLmdldChNdWx0aVBhcnQuY2xhc3MpOworICAgICAgICAgICAgY2hlY2tNZWRpYVR5cGUobmV3IE1lZGlhVHlwZSgibXVsdGlwYXJ0IiwgIm1peGVkIiksIHJlc3VsdC5nZXRNZWRpYVR5cGUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcmVzdWx0LmdldEJvZHlQYXJ0cygpLnNpemUoKSk7CisgICAgICAgICAgICBmaW5hbCBCb2R5UGFydCBwYXJ0ID0gcmVzdWx0LmdldEJvZHlQYXJ0cygpLmdldCgwKTsKKyAgICAgICAgICAgIGNoZWNrTWVkaWFUeXBlKG5ldyBNZWRpYVR5cGUoInRleHQiLCAicGxhaW4iKSwgcGFydC5nZXRNZWRpYVR5cGUoKSk7CisgICAgICAgICAgICBjaGVja0VudGl0eSgiVGhpcyBpcyB0aGUgb25seSBzZWdtZW50IiwgKEJvZHlQYXJ0RW50aXR5KSBwYXJ0LmdldEVudGl0eSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiXCJ2YWx1ZVwiIiwgcGFydC5nZXRIZWFkZXJzKCkuZ2V0Rmlyc3QoIkVUYWciKSk7CisKKyAgICAgICAgICAgIHJlc3VsdC5nZXRQYXJhbWV0ZXJpemVkSGVhZGVycygpOworICAgICAgICAgICAgcmVzdWx0LmNsZWFudXAoKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gfCBQYXJzZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZShTeXN0ZW0ub3V0KTsKKyAgICAgICAgICAgIGZhaWwoIkNhdWdodCBleGNlcHRpb246ICIgKyBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFR3bygpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpLnBhdGgoIm11bHRpcGFydC90d28iKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIE11bHRpUGFydCByZXN1bHQgPSB0YXJnZXQucmVxdWVzdCgibXVsdGlwYXJ0L21peGVkIikuZ2V0KE11bHRpUGFydC5jbGFzcyk7CisgICAgICAgICAgICBjaGVja01lZGlhVHlwZShuZXcgTWVkaWFUeXBlKCJtdWx0aXBhcnQiLCAibWl4ZWQiKSwgcmVzdWx0LmdldE1lZGlhVHlwZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCByZXN1bHQuZ2V0Qm9keVBhcnRzKCkuc2l6ZSgpKTsKKyAgICAgICAgICAgIGZpbmFsIEJvZHlQYXJ0IHBhcnQxID0gcmVzdWx0LmdldEJvZHlQYXJ0cygpLmdldCgwKTsKKyAgICAgICAgICAgIGNoZWNrTWVkaWFUeXBlKG5ldyBNZWRpYVR5cGUoInRleHQiLCAicGxhaW4iKSwgcGFydDEuZ2V0TWVkaWFUeXBlKCkpOworICAgICAgICAgICAgY2hlY2tFbnRpdHkoIlRoaXMgaXMgdGhlIGZpcnN0IHNlZ21lbnQiLCAoQm9keVBhcnRFbnRpdHkpIHBhcnQxLmdldEVudGl0eSgpKTsKKyAgICAgICAgICAgIGZpbmFsIEJvZHlQYXJ0IHBhcnQyID0gcmVzdWx0LmdldEJvZHlQYXJ0cygpLmdldCgxKTsKKyAgICAgICAgICAgIGNoZWNrTWVkaWFUeXBlKG5ldyBNZWRpYVR5cGUoInRleHQiLCAieG1sIiksIHBhcnQyLmdldE1lZGlhVHlwZSgpKTsKKyAgICAgICAgICAgIGNoZWNrRW50aXR5KCI8b3V0ZXI+PGlubmVyPnZhbHVlPC9pbm5lcj48L291dGVyPiIsIChCb2R5UGFydEVudGl0eSkgcGFydDIuZ2V0RW50aXR5KCkpOworCisgICAgICAgICAgICByZXN1bHQuZ2V0UGFyYW1ldGVyaXplZEhlYWRlcnMoKTsKKyAgICAgICAgICAgIHJlc3VsdC5jbGVhbnVwKCk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIHwgUGFyc2VFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoU3lzdGVtLm91dCk7CisgICAgICAgICAgICBmYWlsKCJDYXVnaHQgZXhjZXB0aW9uOiAiICsgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUaHJlZSgpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpLnBhdGgoIm11bHRpcGFydC90aHJlZSIpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgTXVsdGlQYXJ0IHJlc3VsdCA9IHRhcmdldC5yZXF1ZXN0KCJtdWx0aXBhcnQvbWl4ZWQiKS5nZXQoTXVsdGlQYXJ0LmNsYXNzKTsKKyAgICAgICAgICAgIGNoZWNrTWVkaWFUeXBlKG5ldyBNZWRpYVR5cGUoIm11bHRpcGFydCIsICJtaXhlZCIpLCByZXN1bHQuZ2V0TWVkaWFUeXBlKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHJlc3VsdC5nZXRCb2R5UGFydHMoKS5zaXplKCkpOworICAgICAgICAgICAgZmluYWwgQm9keVBhcnQgcGFydDEgPSByZXN1bHQuZ2V0Qm9keVBhcnRzKCkuZ2V0KDApOworICAgICAgICAgICAgY2hlY2tNZWRpYVR5cGUobmV3IE1lZGlhVHlwZSgidGV4dCIsICJwbGFpbiIpLCBwYXJ0MS5nZXRNZWRpYVR5cGUoKSk7CisgICAgICAgICAgICBjaGVja0VudGl0eSgiVGhpcyBpcyB0aGUgZmlyc3Qgc2VnbWVudCIsIChCb2R5UGFydEVudGl0eSkgcGFydDEuZ2V0RW50aXR5KCkpOworICAgICAgICAgICAgZmluYWwgQm9keVBhcnQgcGFydDIgPSByZXN1bHQuZ2V0Qm9keVBhcnRzKCkuZ2V0KDEpOworICAgICAgICAgICAgY2hlY2tNZWRpYVR5cGUobmV3IE1lZGlhVHlwZSgieC1hcHBsaWNhdGlvbiIsICJ4LWZvcm1hdCIpLCBwYXJ0Mi5nZXRNZWRpYVR5cGUoKSk7CisgICAgICAgICAgICBmaW5hbCBNdWx0aVBhcnRCZWFuIGVudGl0eSA9IHBhcnQyLmdldEVudGl0eUFzKE11bHRpUGFydEJlYW4uY2xhc3MpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJteW5hbWUiLCBlbnRpdHkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygibXl2YWx1ZSIsIGVudGl0eS5nZXRWYWx1ZSgpKTsKKworICAgICAgICAgICAgcmVzdWx0LmdldFBhcmFtZXRlcml6ZWRIZWFkZXJzKCk7CisgICAgICAgICAgICByZXN1bHQuY2xlYW51cCgpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiB8IFBhcnNlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKFN5c3RlbS5vdXQpOworICAgICAgICAgICAgZmFpbCgiQ2F1Z2h0IGV4Y2VwdGlvbjogIiArIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm91cigpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpLnBhdGgoIm11bHRpcGFydC9mb3VyIik7CisKKyAgICAgICAgZmluYWwgTXVsdGlQYXJ0QmVhbiBiZWFuID0gbmV3IE11bHRpUGFydEJlYW4oIm15bmFtZSIsICJteXZhbHVlIik7CisgICAgICAgIGZpbmFsIE11bHRpUGFydCBlbnRpdHkgPSBuZXcgTXVsdGlQYXJ0KCkKKyAgICAgICAgICAgICAgICAuYm9keVBhcnQoIlRoaXMgaXMgdGhlIGZpcnN0IHNlZ21lbnQiLCBuZXcgTWVkaWFUeXBlKCJ0ZXh0IiwgInBsYWluIikpCisgICAgICAgICAgICAgICAgLmJvZHlQYXJ0KGJlYW4sIG5ldyBNZWRpYVR5cGUoIngtYXBwbGljYXRpb24iLCAieC1mb3JtYXQiKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikucHV0KEVudGl0eS5lbnRpdHkoZW50aXR5LCAibXVsdGlwYXJ0L21peGVkIiksIFN0cmluZy5jbGFzcyk7CisgICAgICAgIGlmICghcmVzcG9uc2Uuc3RhcnRzV2l0aCgiU1VDQ0VTUzoiKSkgeworICAgICAgICAgICAgZmFpbCgiUmVzcG9uc2UgaXMgJyIgKyByZXNwb25zZSArICInIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGb3VyQml6KCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCkucGF0aCgibXVsdGlwYXJ0L2ZvdXIiKTsKKworICAgICAgICBmaW5hbCBNdWx0aVBhcnRCZWFuIGJlYW4gPSBuZXcgTXVsdGlQYXJ0QmVhbigibXluYW1lIiwgIm15dmFsdWUiKTsKKyAgICAgICAgZmluYWwgTXVsdGlQYXJ0IGVudGl0eSA9IG5ldyBNdWx0aVBhcnQoKQorICAgICAgICAgICAgICAgIC5ib2R5UGFydCgiVGhpcyBpcyB0aGUgZmlyc3Qgc2VnbWVudCIsIG5ldyBNZWRpYVR5cGUoInRleHQiLCAicGxhaW4iKSkKKyAgICAgICAgICAgICAgICAuYm9keVBhcnQoYmVhbiwgbmV3IE1lZGlhVHlwZSgieC1hcHBsaWNhdGlvbiIsICJ4LWZvcm1hdCIpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoInRleHQvcGxhaW4iKS5oZWFkZXIoIkNvbnRlbnQtVHlwZSIsICJtdWx0aXBhcnQvbWl4ZWQiKQorICAgICAgICAgICAgICAgIC5wdXQoRW50aXR5LmVudGl0eShlbnRpdHksICJtdWx0aXBhcnQvbWl4ZWQiKSwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgaWYgKCFyZXNwb25zZS5zdGFydHNXaXRoKCJTVUNDRVNTOiIpKSB7CisgICAgICAgICAgICBmYWlsKCJSZXNwb25zZSBpcyAnIiArIHJlc3BvbnNlICsgIiciKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgc2VuZGluZyBhIGNvbXBsZXRlbHkgZW1wdHkgTXVsdGlQYXJ0LgorICAgICAqLworICAgIEBUZXN0KGV4cGVjdGVkID0gUHJvY2Vzc2luZ0V4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2l4KCkgeworICAgICAgICB0YXJnZXQoKQorICAgICAgICAgICAgICAgIC5wYXRoKCJtdWx0aXBhcnQvc2l4IikKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgidGV4dC9wbGFpbiIpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eShuZXcgTXVsdGlQYXJ0KCksICJtdWx0aXBhcnQvbWl4ZWQiKSwgU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uIGFib3V0IHplcm8gYm9keSBwYXJ0cyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFplcm8gbGVuZ3RoIGJvZHkgcGFydC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUZW4oKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKS5wYXRoKCJtdWx0aXBhcnQvdGVuIik7CisKKyAgICAgICAgZmluYWwgTXVsdGlQYXJ0QmVhbiBiZWFuID0gbmV3IE11bHRpUGFydEJlYW4oIm15bmFtZSIsICJteXZhbHVlIik7CisgICAgICAgIGZpbmFsIE11bHRpUGFydCBlbnRpdHkgPSBuZXcgTXVsdGlQYXJ0KCkKKyAgICAgICAgICAgICAgICAuYm9keVBhcnQoYmVhbiwgbmV3IE1lZGlhVHlwZSgieC1hcHBsaWNhdGlvbiIsICJ4LWZvcm1hdCIpKQorICAgICAgICAgICAgICAgIC5ib2R5UGFydCgiIiwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX09DVEVUX1NUUkVBTV9UWVBFKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoInRleHQvcGxhaW4iKS5wdXQoRW50aXR5LmVudGl0eShlbnRpdHksICJtdWx0aXBhcnQvbWl4ZWQiKSwgU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBpZiAoIXJlc3BvbnNlLnN0YXJ0c1dpdGgoIlNVQ0NFU1M6IikpIHsKKyAgICAgICAgICAgIGZhaWwoIlJlc3BvbnNlIGlzICciICsgcmVzcG9uc2UgKyAiJyIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRWNobyBiYWNrIHZhcmlvdXMgc2l6ZWQgYm9keSBwYXJ0IGVudGl0aWVzLCBhbmQgY2hlY2sgc2l6ZS9jb250ZW50CisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RWxldmVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBzZWVkID0gIjAxMjM0NTY3ODlBQkNERUYiOworICAgICAgICBjaGVja0VsZXZlbihzZWVkLCAwKTsKKyAgICAgICAgY2hlY2tFbGV2ZW4oc2VlZCwgMSk7CisgICAgICAgIGNoZWNrRWxldmVuKHNlZWQsIDEwKTsKKyAgICAgICAgY2hlY2tFbGV2ZW4oc2VlZCwgMTAwKTsKKyAgICAgICAgY2hlY2tFbGV2ZW4oc2VlZCwgMTAwMCk7CisgICAgICAgIGNoZWNrRWxldmVuKHNlZWQsIDEwMDAwKTsKKyAgICAgICAgY2hlY2tFbGV2ZW4oc2VlZCwgMTAwMDAwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFY2hvIGJhY2sgdGhlIG11bHRpcGFydCB0aGF0IHdhcyBzZW50LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFR3ZWx2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCkucGF0aCgibXVsdGlwYXJ0L3R3ZWx2ZSIpOworCisgICAgICAgIGZpbmFsIE11bHRpUGFydCBlbnRpdHkgPSBuZXcgTXVsdGlQYXJ0KCkuYm9keVBhcnQoIkNPTlRFTlQiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKTsKKyAgICAgICAgZmluYWwgTXVsdGlQYXJ0IHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoIm11bHRpcGFydC9taXhlZCIpCisgICAgICAgICAgICAgICAgLnB1dChFbnRpdHkuZW50aXR5KGVudGl0eSwgIm11bHRpcGFydC9taXhlZCIpLCBNdWx0aVBhcnQuY2xhc3MpOworICAgICAgICBmaW5hbCBTdHJpbmcgYWN0dWFsID0gcmVzcG9uc2UuZ2V0Qm9keVBhcnRzKCkuZ2V0KDApLmdldEVudGl0eUFzKFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiQ09OVEVOVCIsIGFjdHVhbCk7CisgICAgICAgIHJlc3BvbnNlLmNsZWFudXAoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsIGNsZWFuIHVwIGV4cGxpY2l0bHkuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGhpcnRlZW4oKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKS5wYXRoKCJtdWx0aXBhcnQvdGhpcnRlZW4iKTsKKworICAgICAgICBmaW5hbCBNdWx0aVBhcnQgZW50aXR5ID0gbmV3IE11bHRpUGFydCgpCisgICAgICAgICAgICAgICAgLmJvZHlQYXJ0KCJDT05URU5UIiwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSk7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCJtdWx0aXBhcnQvbWl4ZWQiKS5wdXQoRW50aXR5LmVudGl0eShlbnRpdHksICJtdWx0aXBhcnQvbWl4ZWQiKSwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjbGVhbnVwIiwgcmVzcG9uc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgZm9yIEpFUlNFWS0yNTE1IC0gSmVyc2V5IHNob3VsZCBub3QgbGVhdmUgYW55IHRlbXBvcmFyeSBmaWxlcyBhZnRlciB2ZXJpZnlpbmcgdGhhdCBpdCBpcyBwb3NzaWJsZQorICAgICAqIHRvIGNyZWF0ZSBmaWxlcyBpbiBqYXZhLmlvLnRtcGRpci4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJDb25zdGFudENvbmRpdGlvbnMiKQorICAgIHB1YmxpYyB2b2lkIHNob3VsZE5vdEJlQW55VGVtcG9yYXJ5RmlsZXMoKSB7CisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgTUJSIGlzIGluaXRpYWxpemVkIG9uIHRoZSBjbGllbnQtc2lkZSBhcyB3ZWxsLgorICAgICAgICB0YXJnZXQoKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBUTVBfRElSRUNUT1JZLnRvRmlsZSgpLmxpc3RGaWxlcygpLmxlbmd0aCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrRW50aXR5KGZpbmFsIFN0cmluZyBleHBlY3RlZCwgZmluYWwgQm9keVBhcnRFbnRpdHkgZW50aXR5KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBDb252ZXJ0IHRoZSByYXcgYnl0ZXMgaW50byBhIFN0cmluZworICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbVJlYWRlciBzciA9IG5ldyBJbnB1dFN0cmVhbVJlYWRlcihlbnRpdHkuZ2V0SW5wdXRTdHJlYW0oKSk7CisgICAgICAgIGZpbmFsIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBjaCA9IHNyLnJlYWQoKTsKKyAgICAgICAgICAgIGlmIChjaCA8IDApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3LmFwcGVuZCgoY2hhcikgY2gpOworICAgICAgICB9CisgICAgICAgIC8vIFBlcmZvcm0gdGhlIGNvbXBhcmlzb24KKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBzdy50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tFbGV2ZW4oZmluYWwgU3RyaW5nIHNlZWQsIGZpbmFsIGludCBtdWx0aXBsaWVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKHNlZWQubGVuZ3RoKCkgKiBtdWx0aXBsaWVyKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtdWx0aXBsaWVyOyBpKyspIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZChzZWVkKTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWQgPSBzYi50b1N0cmluZygpOworCisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKS5wYXRoKCJtdWx0aXBhcnQvZWxldmVuIik7CisKKyAgICAgICAgZmluYWwgTXVsdGlQYXJ0IGVudGl0eSA9IG5ldyBNdWx0aVBhcnQoKS5ib2R5UGFydChleHBlY3RlZCwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSk7CisgICAgICAgIGZpbmFsIE11bHRpUGFydCByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCJtdWx0aXBhcnQvbWl4ZWQiKQorICAgICAgICAgICAgICAgIC5wdXQoRW50aXR5LmVudGl0eShlbnRpdHksICJtdWx0aXBhcnQvbWl4ZWQiKSwgTXVsdGlQYXJ0LmNsYXNzKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGFjdHVhbCA9IHJlc3BvbnNlLmdldEJvZHlQYXJ0cygpLmdldCgwKS5nZXRFbnRpdHlBcyhTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkxlbmd0aCBmb3IgbXVsdGlwbGllciAiICsgbXVsdGlwbGllciwgZXhwZWN0ZWQubGVuZ3RoKCksIGFjdHVhbC5sZW5ndGgoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiQ29udGVudCBmb3IgbXVsdGlwbGllciAiICsgbXVsdGlwbGllciwgZXhwZWN0ZWQsIGFjdHVhbCk7CisgICAgICAgIHJlc3BvbnNlLmNsZWFudXAoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tNZWRpYVR5cGUoZmluYWwgTWVkaWFUeXBlIGV4cGVjdGVkLCBmaW5hbCBNZWRpYVR5cGUgYWN0dWFsKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgTWVkaWFUeXBlPSIgKyBleHBlY3RlZCwgZXhwZWN0ZWQuZ2V0VHlwZSgpLCBhY3R1YWwuZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJFeHBlY3RlZCBNZWRpYVR5cGU9IiArIGV4cGVjdGVkLCBleHBlY3RlZC5nZXRTdWJ0eXBlKCksIGFjdHVhbC5nZXRTdWJ0eXBlKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbXVsdGlwYXJ0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvbXVsdGlwYXJ0L2ludGVybmFsL011bHRpUGFydFJlc291cmNlLmphdmEgYi9tZWRpYS9tdWx0aXBhcnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9tdWx0aXBhcnQvaW50ZXJuYWwvTXVsdGlQYXJ0UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjRmNTI2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXVsdGlwYXJ0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvbXVsdGlwYXJ0L2ludGVybmFsL011bHRpUGFydFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwyMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QVVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LkJvZHlQYXJ0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5Cb2R5UGFydEVudGl0eTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuTXVsdGlQYXJ0OworCisvKioKKyAqIFJlc291cmNlIGZpbGUgZm9yIHtAbGluayBNdWx0aVBhcnRSZWFkZXJXcml0ZXJUZXN0fS4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFBhdGgoIi9tdWx0aXBhcnQiKQorcHVibGljIGNsYXNzIE11bHRpUGFydFJlc291cmNlIHsKKworICAgIEBQYXRoKCJ6ZXJvIikKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgU3RyaW5nIHplcm8oKSB7CisgICAgICAgIHJldHVybiAiSGVsbG8sIHdvcmxkXHJcbiI7CisgICAgfQorCisgICAgQFBhdGgoIm9uZSIpCisgICAgQEdFVAorICAgIEBQcm9kdWNlcygibXVsdGlwYXJ0L21peGVkIikKKyAgICBwdWJsaWMgUmVzcG9uc2Ugb25lKCkgeworICAgICAgICBNdWx0aVBhcnQgZW50aXR5ID0gbmV3IE11bHRpUGFydCgpOworICAgICAgICAvLyBFeGVyY2lzZSBtYW51YWxseSBhZGRpbmcgcGFydChzKSB0byB0aGUgYm9keVBhcnRzIHByb3BlcnR5CisgICAgICAgIEJvZHlQYXJ0IHBhcnQgPSBuZXcgQm9keVBhcnQoIlRoaXMgaXMgdGhlIG9ubHkgc2VnbWVudCIsIG5ldyBNZWRpYVR5cGUoInRleHQiLCAicGxhaW4iKSk7CisgICAgICAgIGVudGl0eS5nZXRCb2R5UGFydHMoKS5hZGQocGFydCk7CisgICAgICAgIHJldHVybiBSZXNwb25zZS5vayhlbnRpdHkpLnR5cGUoIm11bHRpcGFydC9taXhlZCIpLmJ1aWxkKCk7CisgICAgfQorCisgICAgQFBhdGgoInR3byIpCisgICAgQEdFVAorICAgIEBQcm9kdWNlcygibXVsdGlwYXJ0L21peGVkIikKKyAgICBwdWJsaWMgUmVzcG9uc2UgdHdvKCkgeworICAgICAgICAvLyBFeGVyY2lzZSBidWlsZGVyIHBhdHRlcm4gd2l0aCBkZWZhdWx0IGNvbnRlbnQgdHlwZQorICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2sobmV3IE11bHRpUGFydCgpCisgICAgICAgICAgICAgICAgLmJvZHlQYXJ0KCJUaGlzIGlzIHRoZSBmaXJzdCBzZWdtZW50IiwgbmV3IE1lZGlhVHlwZSgidGV4dCIsICJwbGFpbiIpKQorICAgICAgICAgICAgICAgIC5ib2R5UGFydCgiPG91dGVyPjxpbm5lcj52YWx1ZTwvaW5uZXI+PC9vdXRlcj4iLCBuZXcgTWVkaWFUeXBlKCJ0ZXh0IiwgInhtbCIpKSkuYnVpbGQoKTsKKyAgICB9CisKKyAgICBAUGF0aCgidGhyZWUiKQorICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoIm11bHRpcGFydC9taXhlZCIpCisgICAgcHVibGljIFJlc3BvbnNlIHRocmVlKCkgeworICAgICAgICAvLyBFeGVyY2lzZSBidWlsZGVyIHBhdHRlcm4gd2l0aCBleHBsaWNpdCBjb250ZW50IHR5cGUKKyAgICAgICAgTXVsdGlQYXJ0QmVhbiBiZWFuID0gbmV3IE11bHRpUGFydEJlYW4oIm15bmFtZSIsICJteXZhbHVlIik7CisgICAgICAgIHJldHVybiBSZXNwb25zZS5vayhuZXcgTXVsdGlQYXJ0KCkKKyAgICAgICAgICAgICAgICAudHlwZShuZXcgTWVkaWFUeXBlKCJtdWx0aXBhcnQiLCAibWl4ZWQiKSkKKyAgICAgICAgICAgICAgICAuYm9keVBhcnQoIlRoaXMgaXMgdGhlIGZpcnN0IHNlZ21lbnQiLCBuZXcgTWVkaWFUeXBlKCJ0ZXh0IiwgInBsYWluIikpCisgICAgICAgICAgICAgICAgLmJvZHlQYXJ0KGJlYW4sIG5ldyBNZWRpYVR5cGUoIngtYXBwbGljYXRpb24iLCAieC1mb3JtYXQiKSkpLmJ1aWxkKCk7CisgICAgfQorCisgICAgQFBhdGgoImZvdXIiKQorICAgIEBQVVQKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBSZXNwb25zZSBmb3VyKE11bHRpUGFydCBtdWx0aVBhcnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmICghKG11bHRpUGFydC5nZXRCb2R5UGFydHMoKS5zaXplKCkgPT0gMikpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygiRkFJTEVEOiAgTnVtYmVyIG9mIGJvZHkgcGFydHMgaXMgIiArIG11bHRpUGFydC5nZXRCb2R5UGFydHMoKS5zaXplKCkgKyAiIGluc3RlYWQgb2YgMiIpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBCb2R5UGFydCBwYXJ0MCA9IG11bHRpUGFydC5nZXRCb2R5UGFydHMoKS5nZXQoMCk7CisgICAgICAgIGlmICghKHBhcnQwLmdldE1lZGlhVHlwZSgpLmVxdWFscyhuZXcgTWVkaWFUeXBlKCJ0ZXh0IiwgInBsYWluIikpKSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCJGQUlMRUQ6ICBGaXJzdCBtZWRpYSB0eXBlIGlzICIgKyBwYXJ0MC5nZXRNZWRpYVR5cGUoKSkuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEJvZHlQYXJ0IHBhcnQxID0gbXVsdGlQYXJ0LmdldEJvZHlQYXJ0cygpLmdldCgxKTsKKyAgICAgICAgaWYgKCEocGFydDEuZ2V0TWVkaWFUeXBlKCkuZXF1YWxzKG5ldyBNZWRpYVR5cGUoIngtYXBwbGljYXRpb24iLCAieC1mb3JtYXQiKSkpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soIkZBSUxFRDogIFNlY29uZCBtZWRpYSB0eXBlIGlzICIgKyBwYXJ0MS5nZXRNZWRpYVR5cGUoKSkuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEJvZHlQYXJ0RW50aXR5IGJwZSA9IChCb2R5UGFydEVudGl0eSkgcGFydDAuZ2V0RW50aXR5KCk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBicGUuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKHN0cmVhbSk7CisgICAgICAgIGNoYXJbXSBidWZmZXIgPSBuZXcgY2hhclsyMDQ4XTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGludCBuID0gcmVhZGVyLnJlYWQoYnVmZmVyKTsKKyAgICAgICAgICAgIGlmIChuIDwgMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2IuYXBwZW5kKGJ1ZmZlciwgMCwgbik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzYi50b1N0cmluZygpLmVxdWFscygiVGhpcyBpcyB0aGUgZmlyc3Qgc2VnbWVudCIpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soIkZBSUxFRDogIEZpcnN0IHBhcnQgbmFtZSA9ICIgKyBzYi50b1N0cmluZygpKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgTXVsdGlQYXJ0QmVhbiBiZWFuID0gcGFydDEuZ2V0RW50aXR5QXMoTXVsdGlQYXJ0QmVhbi5jbGFzcyk7CisgICAgICAgIGlmICghYmVhbi5nZXROYW1lKCkuZXF1YWxzKCJteW5hbWUiKSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCJGQUlMRUQ6ICBTZWNvbmQgcGFydCBuYW1lID0gIiArIGJlYW4uZ2V0TmFtZSgpKS5idWlsZCgpOworICAgICAgICB9CisgICAgICAgIGlmICghYmVhbi5nZXRWYWx1ZSgpLmVxdWFscygibXl2YWx1ZSIpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soIkZBSUxFRDogIFNlY29uZCBwYXJ0IHZhbHVlID0gIiArIGJlYW4uZ2V0VmFsdWUoKSkuYnVpbGQoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soIlNVQ0NFU1M6ICBBbGwgdGVzdHMgcGFzc2VkIikuYnVpbGQoKTsKKyAgICB9CisKKyAgICAvLyBOb3RlIC0gdGhpcyBzaG91bGQgbmV2ZXIgYWN0dWFsbHkgZ2V0IHJlYWNoZWQsIGJlY2F1c2UgdGhlIGNsaWVudAorICAgIC8vIGlzIHRyeWluZyB0byBwb3N0IGEgTXVsdGlQYXJ0IHdpdGggbm8gYm9keSBwYXJ0cyBpbnNpZGUsIGFuZCB0aGF0CisgICAgLy8gc2hvdWxkIHRocm93IGEgY2xpZW50IHNpZGUgZXhjZXB0aW9uCisgICAgQFBhdGgoInNpeCIpCisgICAgQFBPU1QKKyAgICBAQ29uc3VtZXMoIm11bHRpcGFydC9taXhlZCIpCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgUmVzcG9uc2Ugc2l4KE11bHRpUGFydCBtdWx0aVBhcnQpIHsKKyAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gIkFsbCBPSyI7CisgICAgICAgIGlmICghIm11bHRpcGFydCIuZXF1YWxzKG11bHRpUGFydC5nZXRNZWRpYVR5cGUoKS5nZXRUeXBlKCkpCisgICAgICAgICAgICAgICAgfHwgISJtaXhlZCIuZXF1YWxzKG11bHRpUGFydC5nZXRNZWRpYVR5cGUoKS5nZXRTdWJ0eXBlKCkpKSB7CisgICAgICAgICAgICByZXNwb25zZSA9ICJNdWx0aVBhcnQgbWVkaWEgdHlwZSBpcyAiICsgbXVsdGlQYXJ0LmdldE1lZGlhVHlwZSgpLnRvU3RyaW5nKCk7CisgICAgICAgIH0gZWxzZSBpZiAobXVsdGlQYXJ0LmdldEJvZHlQYXJ0cygpLnNpemUoKSAhPSAwKSB7CisgICAgICAgICAgICByZXNwb25zZSA9ICJHb3QgIiArIG11bHRpUGFydC5nZXRCb2R5UGFydHMoKS5zaXplKCkgKyAiIGJvZHkgcGFydHMgaW5zdGVhZCBvZiB6ZXJvIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2socmVzcG9uc2UpLmJ1aWxkKCk7CisgICAgfQorCisgICAgQFBhdGgoInRlbiIpCisgICAgQFBVVAorICAgIEBDb25zdW1lcygibXVsdGlwYXJ0L21peGVkIikKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBSZXNwb25zZSB0ZW4oTXVsdGlQYXJ0IG1wKSB7CisgICAgICAgIGlmICghKG1wLmdldEJvZHlQYXJ0cygpLnNpemUoKSA9PSAyKSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCJGQUlMRUQ6ICBCb2R5IHBhcnQgY291bnQgaXMgIiArIG1wLmdldEJvZHlQYXJ0cygpLnNpemUoKSArICIgaW5zdGVhZCBvZiAyIikuYnVpbGQoKTsKKyAgICAgICAgfSBlbHNlIGlmICghKG1wLmdldEJvZHlQYXJ0cygpLmdldCgxKS5nZXRFbnRpdHkoKSBpbnN0YW5jZW9mIEJvZHlQYXJ0RW50aXR5KSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCJGQUlMRUQ6ICBTZWNvbmQgYm9keSBwYXJ0IGlzICIgKyBtcC5nZXRCb2R5UGFydHMoKS5nZXQoMSkuZ2V0Q2xhc3MoKS5nZXROYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiIGluc3RlYWQgb2YgQm9keVBhcnRFbnRpdHkiKS5idWlsZCgpOworICAgICAgICB9CisgICAgICAgIEJvZHlQYXJ0RW50aXR5IGJwZSA9IChCb2R5UGFydEVudGl0eSkgbXAuZ2V0Qm9keVBhcnRzKCkuZ2V0KDEpLmdldEVudGl0eSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBicGUuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVsyMDQ4XTsKKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgaW50IG4gPSBzdHJlYW0ucmVhZChidWZmZXIpOworICAgICAgICAgICAgICAgIGlmIChuIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYmFvcy53cml0ZShidWZmZXIsIDAsIG4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGJhb3MudG9CeXRlQXJyYXkoKS5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCJGQUlMRUQ6ICBTZWNvbmQgYm9keSBwYXJ0IGhhZCAiICsgYmFvcy50b0J5dGVBcnJheSgpLmxlbmd0aCArICIgYnl0ZXMgaW5zdGVhZCBvZiAwIikuYnVpbGQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygiU1VDQ0VTUzogIEFsbCB0ZXN0cyBwYXNzZWQiKS5idWlsZCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soIkZBSUxFRDogIFRocmV3IElPRXhjZXB0aW9uIikuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEVjaG8gYmFjayBhIGJvZHkgcGFydCB3aG9zZSBjb250ZW50IG1heSBvciBtYXkgbm90IGV4Y2VlZCB0aGUgc2l6ZQorICAgIC8vIG9mIHRoZSBidWZmZXIgdGhyZXNob2xkCisgICAgQFBhdGgoImVsZXZlbiIpCisgICAgQFBVVAorICAgIEBDb25zdW1lcygibXVsdGlwYXJ0L21peGVkIikKKyAgICBAUHJvZHVjZXMoIm11bHRpcGFydC9taXhlZCIpCisgICAgcHVibGljIFJlc3BvbnNlIGVsZXZlbihNdWx0aVBhcnQgbXVsdGlQYXJ0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBCb2R5UGFydEVudGl0eSBicGUgPSAoQm9keVBhcnRFbnRpdHkpIG11bHRpUGFydC5nZXRCb2R5UGFydHMoKS5nZXQoMCkuZ2V0RW50aXR5KCk7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSBicGUuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKHN0cmVhbSk7CisgICAgICAgIGNoYXJbXSBidWZmZXIgPSBuZXcgY2hhclsyMDQ4XTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGludCBuID0gcmVhZGVyLnJlYWQoYnVmZmVyKTsKKyAgICAgICAgICAgIGlmIChuIDwgMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2IuYXBwZW5kKGJ1ZmZlciwgMCwgbik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKG5ldyBNdWx0aVBhcnQoKS5ib2R5UGFydChzYi50b1N0cmluZygpLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSkKKyAgICAgICAgICAgICAgICAudHlwZShuZXcgTWVkaWFUeXBlKCJtdWx0aXBhcnQiLCAibWl4ZWQiKSkuYnVpbGQoKTsKKyAgICB9CisKKyAgICAvLyBFY2hvIGJhY2sgdGhlIG11bHRpcGFydCB0aGF0IHdhcyBzZW50CisgICAgQFBhdGgoInR3ZWx2ZSIpCisgICAgQFBVVAorICAgIEBDb25zdW1lcygibXVsdGlwYXJ0L21peGVkIikKKyAgICBAUHJvZHVjZXMoIm11bHRpcGFydC9taXhlZCIpCisgICAgcHVibGljIE11bHRpUGFydCB0d2VsdmUoTXVsdGlQYXJ0IG11bHRpUGFydCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG11bHRpUGFydDsKKyAgICB9CisKKyAgICAvLyBDYWxsIGNsZWFuIHVwIGV4cGxpY2l0bHkKKyAgICBAUGF0aCgidGhpcnRlZW4iKQorICAgIEBQVVQKKyAgICBAQ29uc3VtZXMoIm11bHRpcGFydC9taXhlZCIpCisgICAgQFByb2R1Y2VzKCJtdWx0aXBhcnQvbWl4ZWQiKQorICAgIHB1YmxpYyBTdHJpbmcgdGhpcnRlZW4oTXVsdGlQYXJ0IG11bHRpUGFydCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgbXVsdGlQYXJ0LmNsZWFudXAoKTsKKyAgICAgICAgcmV0dXJuICJjbGVhbnVwIjsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImV0YWciKQorICAgIEBQcm9kdWNlcygibXVsdGlwYXJ0L21peGVkIikKKyAgICBwdWJsaWMgUmVzcG9uc2UgZXRhZygpIHsKKyAgICAgICAgTXVsdGlQYXJ0IGVudGl0eSA9IG5ldyBNdWx0aVBhcnQoKTsKKyAgICAgICAgLy8gRXhlcmNpc2UgbWFudWFsbHkgYWRkaW5nIHBhcnQocykgdG8gdGhlIGJvZHlQYXJ0cyBwcm9wZXJ0eQorICAgICAgICBCb2R5UGFydCBwYXJ0ID0gbmV3IEJvZHlQYXJ0KCJUaGlzIGlzIHRoZSBvbmx5IHNlZ21lbnQiLCBuZXcgTWVkaWFUeXBlKCJ0ZXh0IiwgInBsYWluIikpOworICAgICAgICBwYXJ0LmdldEhlYWRlcnMoKS5hZGQoIkVUYWciLCAiXCJ2YWx1ZVwiIik7CisgICAgICAgIGVudGl0eS5nZXRCb2R5UGFydHMoKS5hZGQocGFydCk7CisgICAgICAgIHJldHVybiBSZXNwb25zZS5vayhlbnRpdHkpLnR5cGUoIm11bHRpcGFydC9taXhlZCIpLmJ1aWxkKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvcG9tLnhtbCBiL21lZGlhL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ2YjQwMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3BvbS54bWwKQEAgLTAsMCArMSw1OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleTwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktbWVkaWE8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIENvbnRhaW5zIGVudGl0eSBtZWRpYSB0eXBlIHByb3ZpZGVyIG1vZHVsZXMuCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxtb2R1bGVzPgorICAgICAgICA8bW9kdWxlPmpheGI8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5qc29uLWJpbmRpbmc8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5qc29uLWphY2tzb248L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5qc29uLWphY2tzb24xPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+anNvbi1qZXR0aXNvbjwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmpzb24tcHJvY2Vzc2luZzwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPm1veHk8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5tdWx0aXBhcnQ8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5zc2U8L21vZHVsZT4KKyAgICA8L21vZHVsZXM+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1oazI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21lZGlhL3NzZS9wb20ueG1sIGIvbWVkaWEvc3NlL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU3NWQyNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3NzZS9wb20ueG1sCkBAIC0wLDAgKzEsODEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtc3NlPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LW1lZGlhLXNzZTwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgSmVyc2V5IFNlcnZlciBTZW50IEV2ZW50cyBlbnRpdHkgcHJvdmlkZXJzIHN1cHBvcnQgbW9kdWxlLgorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guaGsyLmV4dGVybmFsPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguaW5qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1zZXJ2ZXI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi5pc3RhY2s8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4taXN0YWNrLWNvbW1vbnMtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJ1aWxkLWhlbHBlci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5mZWxpeDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1idW5kbGUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tZWRpYS9zc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9zc2UvRXZlbnRJbnB1dC5qYXZhIGIvbWVkaWEvc3NlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvc3NlL0V2ZW50SW5wdXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWQzZjNjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvc3NlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvc3NlL0V2ZW50SW5wdXQuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZTsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2h1bmtQYXJzZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNodW5rZWRJbnB1dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Qcm9wZXJ0aWVzRGVsZWdhdGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5NZXNzYWdlQm9keVdvcmtlcnM7CisKKy8qKgorICogSW5ib3VuZCBTZXJ2ZXItU2VudCBFdmVudHMgY2hhbm5lbC4KKyAqCisgKiBUaGUgaW5wdXQgY2hhbm5lbCBsZXRzIHlvdSBzZXJpYWxseSByZWFkICYgY29uc3VtZSBTU0UgZXZlbnRzIGFzIHRoZXkgYXJyaXZlLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBFdmVudElucHV0IGV4dGVuZHMgQ2h1bmtlZElucHV0PEluYm91bmRFdmVudD4geworICAgIC8qKgorICAgICAqIFNTRSBldmVudCBjaHVuayBwYXJzZXIgLSBTU0UgY2h1bmtzIGFyZSBkZWxpbWl0ZWQgd2l0aCBhIGZpeGVkICJcblxuIiBhbmQgIlxyXG5cclxuIiBkZWxpbWl0ZXIgaW4gdGhlIHJlc3BvbnNlIHN0cmVhbS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDaHVua1BhcnNlciBTU0VfRVZFTlRfUEFSU0VSID0gQ2h1bmtlZElucHV0LmNyZWF0ZU11bHRpUGFyc2VyKCJcblxuIiwgIlxyXG5cclxuIik7CisKKyAgICAvKioKKyAgICAgKiBQYWNrYWdlLXByaXZhdGUgY29uc3RydWN0b3IgdXNlZCBieSB0aGUge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DaHVua2VkSW5wdXRSZWFkZXJ9LgorICAgICAqCisgICAgICogQHBhcmFtIGlucHV0U3RyZWFtICAgICAgICByZXNwb25zZSBpbnB1dCBzdHJlYW0uCisgICAgICogQHBhcmFtIGFubm90YXRpb25zICAgICAgICBhbm5vdGF0aW9ucyBhc3NvY2lhdGVkIHdpdGggcmVzcG9uc2UgZW50aXR5LgorICAgICAqIEBwYXJhbSBtZWRpYVR5cGUgICAgICAgICAgcmVzcG9uc2UgZW50aXR5IG1lZGlhIHR5cGUuCisgICAgICogQHBhcmFtIGhlYWRlcnMgICAgICAgICAgICByZXNwb25zZSBoZWFkZXJzLgorICAgICAqIEBwYXJhbSBtZXNzYWdlQm9keVdvcmtlcnMgbWVzc2FnZSBib2R5IHdvcmtlcnMuCisgICAgICogQHBhcmFtIHByb3BlcnRpZXNEZWxlZ2F0ZSBwcm9wZXJ0aWVzIGRlbGVnYXRlIGZvciB0aGlzIHJlcXVlc3QvcmVzcG9uc2UuCisgICAgICovCisgICAgRXZlbnRJbnB1dChJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSwKKyAgICAgICAgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVycywKKyAgICAgICAgICAgICAgIE1lc3NhZ2VCb2R5V29ya2VycyBtZXNzYWdlQm9keVdvcmtlcnMsCisgICAgICAgICAgICAgICBQcm9wZXJ0aWVzRGVsZWdhdGUgcHJvcGVydGllc0RlbGVnYXRlKSB7CisgICAgICAgIHN1cGVyKEluYm91bmRFdmVudC5jbGFzcywgaW5wdXRTdHJlYW0sIGFubm90YXRpb25zLCBtZWRpYVR5cGUsIGhlYWRlcnMsIG1lc3NhZ2VCb2R5V29ya2VycywgcHJvcGVydGllc0RlbGVnYXRlKTsKKworICAgICAgICBzdXBlci5zZXRQYXJzZXIoU1NFX0VWRU5UX1BBUlNFUik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvc3NlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvc3NlL0V2ZW50SW5wdXRSZWFkZXIuamF2YSBiL21lZGlhL3NzZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL3NzZS9FdmVudElucHV0UmVhZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzVmZDMxYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3NzZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL3NzZS9FdmVudElucHV0UmVhZGVyLmphdmEKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5zc2U7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworCitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLlByb3BlcnRpZXNEZWxlZ2F0ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLk1lc3NhZ2VCb2R5V29ya2VyczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLk1lc3NhZ2VVdGlsczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLlJlYWRlckludGVyY2VwdG9yRXhlY3V0b3I7CisKKy8qKgorICogU1NFIHtAbGluayBFdmVudElucHV0IGV2ZW50IGlucHV0fSBtZXNzYWdlIGJvZHkgcmVhZGVyLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK2NsYXNzIEV2ZW50SW5wdXRSZWFkZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVJlYWRlcjxFdmVudElucHV0PiB7CisKKyAgICBASW5qZWN0CisgICAgcHJpdmF0ZSBQcm92aWRlcjxNZXNzYWdlQm9keVdvcmtlcnM+IG1lc3NhZ2VCb2R5V29ya2VyczsKKyAgICBASW5qZWN0CisgICAgcHJpdmF0ZSBQcm92aWRlcjxQcm9wZXJ0aWVzRGVsZWdhdGU+IHByb3BlcnRpZXNEZWxlZ2F0ZVByb3ZpZGVyOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZShDbGFzczw/PiBhQ2xhc3MsIFR5cGUgdHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiBhQ2xhc3MuZXF1YWxzKEV2ZW50SW5wdXQuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBFdmVudElucHV0IHJlYWRGcm9tKENsYXNzPEV2ZW50SW5wdXQ+IGNodW5rZWRJbnB1dENsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICBJbnB1dFN0cmVhbSBjbG9zZWFibGVJbnB1dFN0cmVhbSA9IFJlYWRlckludGVyY2VwdG9yRXhlY3V0b3IuY2xvc2VhYmxlSW5wdXRTdHJlYW0oaW5wdXRTdHJlYW0pOworICAgICAgICByZXR1cm4gbmV3IEV2ZW50SW5wdXQoCisgICAgICAgICAgICAgICAgY2xvc2VhYmxlSW5wdXRTdHJlYW0sCisgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgIGhlYWRlcnMsCisgICAgICAgICAgICAgICAgbWVzc2FnZUJvZHlXb3JrZXJzLmdldCgpLAorICAgICAgICAgICAgICAgIHByb3BlcnRpZXNEZWxlZ2F0ZVByb3ZpZGVyLmdldCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9zc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9zc2UvRXZlbnRMaXN0ZW5lci5qYXZhIGIvbWVkaWEvc3NlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvc3NlL0V2ZW50TGlzdGVuZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzgxMTUzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvc3NlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvc3NlL0V2ZW50TGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZTsKKworLyoqCisgKiB7QGxpbmsgRXZlbnRTb3VyY2V9IGxpc3RlbmVyIHRoYXQgY2FuIGJlIHJlZ2lzdGVyZWQgdG8gbGlzdGVuIGZvcgorICogbmV3bHkgcmVjZWl2ZWQge0BsaW5rIEluYm91bmRFdmVudH0gbm90aWZpY2F0aW9ucy4KKyAqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgaW50ZXJmYWNlIEV2ZW50TGlzdGVuZXIgeworCisgICAgLyoqCisgICAgICogSW52b2tlZCB3aGVuIGFuIGV2ZW50IGlzIHJlY2VpdmVkLgorICAgICAqCisgICAgICogQHBhcmFtIGluYm91bmRFdmVudCByZWNlaXZlZCBldmVudC4KKyAgICAgKi8KKyAgICB2b2lkIG9uRXZlbnQoSW5ib3VuZEV2ZW50IGluYm91bmRFdmVudCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9zc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9zc2UvRXZlbnRPdXRwdXQuamF2YSBiL21lZGlhL3NzZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL3NzZS9FdmVudE91dHB1dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwNjE0YWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9zc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9zc2UvRXZlbnRPdXRwdXQuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZTsKKworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5DaHVua2VkT3V0cHV0OworCisvKioKKyAqIE91dGJvdW5kIFNlcnZlci1TZW50IEV2ZW50cyBjaGFubmVsLgorICoKKyAqIFdoZW4gcmV0dXJuZWQgZnJvbSByZXNvdXJjZSBtZXRob2QsIHVuZGVybHlpbmcgY29ubmVjdGlvbiBpcyBrZXB0IG9wZW4gYW5kIGFwcGxpY2F0aW9uCisgKiBpcyBhYmxlIHRvIHNlbmQgZXZlbnRzLiBPbmUgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBjb3JyZXNwb25kcyB3aXRoIGV4YWN0bHkgb25lIEhUVFAgY29ubmVjdGlvbi4KKyAqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEV2ZW50T3V0cHV0IGV4dGVuZHMgQ2h1bmtlZE91dHB1dDxPdXRib3VuZEV2ZW50PiB7CisgICAgLy8gZW5jb2RpbmcgZG9lcyBub3QgbWF0dGVyIGZvciBsb3dlciBBU0NJSSBjaGFyYWN0ZXJzCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIFNTRV9FVkVOVF9ERUxJTUlURVIgPSAiXG4iLmdldEJ5dGVzKENoYXJzZXQuZm9yTmFtZSgiVVRGLTgiKSk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IG91dGJvdW5kIFNlcnZlci1TZW50IEV2ZW50cyBjaGFubmVsLgorICAgICAqLworICAgIHB1YmxpYyBFdmVudE91dHB1dCgpIHsKKyAgICAgICAgc3VwZXIoU1NFX0VWRU5UX0RFTElNSVRFUik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvc3NlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvc3NlL0V2ZW50U291cmNlLmphdmEgYi9tZWRpYS9zc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9zc2UvRXZlbnRTb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjExZmRkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvc3NlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvc3NlL0V2ZW50U291cmNlLmphdmEKQEAgLTAsMCArMSw2MDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlOworCitpbXBvcnQgamF2YS5pby5DbG9zZWFibGU7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRNYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29weU9uV3JpdGVBcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5TY2hlZHVsZWRFeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRFeGVjdXRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YS5UaHJlYWRGYWN0b3J5QnVpbGRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLkV4dGVuZGVkTG9nZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5pbnRlcm5hbC5FdmVudFByb2Nlc3NvcjsKKworLyoqCisgKiBDbGllbnQgZm9yIHJlYWRpbmcgYW5kIHByb2Nlc3Npbmcge0BsaW5rIEluYm91bmRFdmVudCBpbmNvbWluZyBTZXJ2ZXItU2VudCBFdmVudHN9LgorICogPHA+CisgKiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBhcmUgdGhyZWFkIHNhZmUuIFRvIGJ1aWxkIGEgbmV3IGluc3RhbmNlLCB5b3UgY2FuIHVzZSBvbmUgb2YgdGhlCisgKiBhdmFpbGFibGUgcHVibGljIHtAY29kZSBFdmVudFNvdXJjZX0gY29uc3RydWN0b3JzIHRoYXQgcHJvZHVjZSBwcmUtY29uZmlndXJlZCBldmVudAorICogc291cmNlIGluc3RhbmNlcy4gQWx0ZXJuYXRpdmVseSwgeW91IGNhbiBjcmVhdGUgYSBuZXcge0BsaW5rIEV2ZW50U291cmNlLkJ1aWxkZXJ9IGluc3RhbmNlCisgKiB1c2luZyB7QGxpbmsgI3RhcmdldChqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0KSBFdmVudFNvdXJjZS50YXJnZXQoZW5kcG9pbnQpfSBmYWN0b3J5IG1ldGhvZC4KKyAqIENvbXBhcmVkIHRvIHtAY29kZSBFdmVudFNvdXJjZX0gY29uc3RydWN0b3JzLCBhbiBldmVudCBzb3VyY2UgYnVpbGRlciBwcm92aWRlcyBncmVhdGVyIGZsZXhpYmlsaXR5CisgKiB3aGVuIGN1c3RvbS1jb25maWd1cmluZyBhIG5ldyBldmVudCBzb3VyY2UgYnVpbGRlci4KKyAqIDwvcD4KKyAqIDxwPgorICogT25jZSBhbiB7QGxpbmsgRXZlbnRTb3VyY2V9IGlzIGNyZWF0ZWQsIGl0IHtAbGluayAjb3BlbiBvcGVucyBhIGNvbm5lY3Rpb259IHRvIHRoZSBhc3NvY2lhdGVkIHtAbGluayBXZWJUYXJnZXQgd2ViIHRhcmdldH0KKyAqIGFuZCBzdGFydHMgcHJvY2Vzc2luZyBhbnkgaW5jb21pbmcgaW5ib3VuZCBldmVudHMuCisgKiBXaGVuZXZlciBhIG5ldyBldmVudCBpcyByZWNlaXZlZCwgYW4ge0BsaW5rIEV2ZW50U291cmNlI29uRXZlbnQoSW5ib3VuZEV2ZW50KX0gbWV0aG9kIGlzIGNhbGxlZCBhcyB3ZWxsIGFzIGFueQorICogcmVnaXN0ZXJlZCB7QGxpbmsgRXZlbnRMaXN0ZW5lciBldmVudCBsaXN0ZW5lcnN9IGFyZSBub3RpZmllZCAoc2VlIHtAbGluayBFdmVudFNvdXJjZSNyZWdpc3RlcihFdmVudExpc3RlbmVyKX0KKyAqIGFuZCB7QGxpbmsgRXZlbnRTb3VyY2UjcmVnaXN0ZXIoRXZlbnRMaXN0ZW5lciwgU3RyaW5nLCBTdHJpbmcuLi4pfS4KKyAqIDwvcD4KKyAqIDxoMz5SZWNvbm5lY3Qgc3VwcG9ydDwvaDM+CisgKiA8cD4KKyAqIFRoZSB7QGNvZGUgRXZlbnRTb3VyY2V9IHN1cHBvcnRzIGF1dG9tYXRlZCByZWN1cGVyYXRpb24gZnJvbSBhIGNvbm5lY3Rpb24gbG9zcywgaW5jbHVkaW5nCisgKiBuZWdvdGlhdGlvbiBvZiBkZWxpdmVyeSBvZiBhbnkgbWlzc2VkIGV2ZW50cyBiYXNlZCBvbiB0aGUgbGFzdCByZWNlaXZlZCAgU1NFIGV2ZW50IHtAY29kZSBpZH0gZmllbGQgdmFsdWUsIHByb3ZpZGVkCisgKiB0aGlzIGZpZWxkIGlzIHNldCBieSB0aGUgc2VydmVyIGFuZCB0aGUgbmVnb3RpYXRpb24gZmFjaWxpdHkgaXMgc3VwcG9ydGVkIGJ5IHRoZSBzZXJ2ZXIuIEluIGNhc2Ugb2YgYSBjb25uZWN0aW9uIGxvc3MsCisgKiB0aGUgbGFzdCByZWNlaXZlZCBTU0UgZXZlbnQge0Bjb2RlIGlkfSBmaWVsZCB2YWx1ZSBpcyBzZW5kIGluIHRoZSA8dHQ+e0B2YWx1ZSBTc2VGZWF0dXJlI0xBU1RfRVZFTlRfSURfSEVBREVSfTwvdHQ+IEhUVFAKKyAqIHJlcXVlc3QgaGVhZGVyIGFzIHBhcnQgb2YgYSBuZXcgY29ubmVjdGlvbiByZXF1ZXN0IHNlbnQgdG8gdGhlIFNTRSBlbmRwb2ludC4gVXBvbiBhIHJlY2VpcHQgb2Ygc3VjaCByZWNvbm5lY3QgcmVxdWVzdCwgdGhlIFNTRQorICogZW5kcG9pbnQgdGhhdCBzdXBwb3J0cyB0aGlzIG5lZ290aWF0aW9uIGZhY2lsaXR5IGlzIGV4cGVjdGVkIHRvIHJlcGxheSBhbGwgbWlzc2VkIGV2ZW50cy4gTm90ZSBob3dldmVyLCB0aGF0IHRoaXMgaXMgYQorICogYmVzdC1lZmZvcnQgbWVjaGFuaXNtIHdoaWNoIGRvZXMgbm90IHByb3ZpZGUgYW55IGd1YXJhbnR5IHRoYXQgYWxsIGV2ZW50cyB3b3VsZCBiZSBkZWxpdmVyZWQgd2l0aG91dCBhIGxvc3MuIFlvdSBzaG91bGQKKyAqIHRoZXJlZm9yZSBub3QgcmVseSBvbiByZWNlaXZpbmcgZXZlcnkgc2luZ2xlIGV2ZW50IGFuZCBkZXNpZ24geW91ciBjbGllbnQgYXBwbGljYXRpb24gY29kZSBhY2NvcmRpbmdseS4KKyAqIDwvcD4KKyAqIDxwPgorICogQnkgZGVmYXVsdCwgd2hlbiBhIGNvbm5lY3Rpb24gdGhlIHRoZSBTU0UgZW5kcG9pbnQgaXMgbG9zdCwgdGhlIGV2ZW50IHNvdXJjZSB3aWxsIHdhaXQgPHR0PntAdmFsdWUgI1JFQ09OTkVDVF9ERUZBVUxUfTwvdHQ+IG1zCisgKiBiZWZvcmUgYXR0ZW1wdGluZyB0byByZWNvbm5lY3QgdG8gdGhlIFNTRSBlbmRwb2ludC4gVGhlIFNTRSBlbmRwb2ludCBjYW4gaG93ZXZlciBjb250cm9sIHRoZSBjbGllbnQtc2lkZSByZXRyeSBkZWxheQorICogYnkgaW5jbHVkaW5nIGEgc3BlY2lhbCB7QGNvZGUgcmV0cnl9IGZpZWxkIHZhbHVlIGluIHRoZSBhbnkgc2VuZCBldmVudC4gSmVyc2V5IHtAY29kZSBFdmVudFNvdXJjZX0gaW1wbGVtZW50YXRpb24KKyAqIHRyYWNrcyBhbnkgcmVjZWl2ZWQgU1NFIGV2ZW50IHtAY29kZSByZXRyeX0gZmllbGQgdmFsdWVzIHNldCBieSB0aGUgZW5kcG9pbnQgYW5kIGFkanVzdHMgdGhlIHJlY29ubmVjdCBkZWxheSBhY2NvcmRpbmdseSwKKyAqIHVzaW5nIHRoZSBsYXN0IHJlY2VpdmVkIHtAY29kZSByZXRyeX0gZmllbGQgdmFsdWUgYXMgdGhlIHJlY29ubmVjdCBkZWxheS4KKyAqIDwvcD4KKyAqIDxwPgorICogSW4gYWRkaXRpb24gdG8gaGFuZGxpbmcgdGhlIHN0YW5kYXJkIGNvbm5lY3Rpb24gbG9zc2VzLCBKZXJzZXkge0Bjb2RlIEV2ZW50U291cmNlfSBhdXRvbWF0aWNhbGx5IGRlYWxzIHdpdGggYW55CisgKiB7QGNvZGUgSFRUUCA1MDMgU2VydmljZSBVbmF2YWlsYWJsZX0gcmVzcG9uc2VzIGZyb20gU1NFIGVuZHBvaW50LCB0aGF0IGNvbnRhaW4gYQorICogPHR0PntAdmFsdWUgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVycyNSRVRSWV9BRlRFUn08L3R0PiBIVFRQIGhlYWRlciB3aXRoIGEgdmFsaWQgdmFsdWUuIFRoZQorICogPHR0PkhUVFAgNTAzICsge0B2YWx1ZSBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzI1JFVFJZX0FGVEVSfTwvdHQ+IHRlY2huaXF1ZSBpcyBvZnRlbiB1c2VkIGJ5IEhUVFAgZW5kcG9pbnRzCisgKiBhcyBhIG1lYW5zIG9mIGNvbm5lY3Rpb24gYW5kIHRyYWZmaWMgdGhyb3R0bGluZy4gSW4gY2FzZSBhCisgKiA8dHQ+SFRUUCA1MDMgKyB7QHZhbHVlIGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnMjUkVUUllfQUZURVJ9PC90dD4gcmVzcG9uc2UgaXMgcmVjZWl2ZWQgaW4gcmV0dXJuIHRvIGEgY29ubmVjdGlvbgorICogcmVxdWVzdCwgSmVyc2V5IHtAY29kZSBFdmVudFNvdXJjZX0gd2lsbCBhdXRvbWF0aWNhbGx5IHNjaGVkdWxlIGEgbmV3IHJlY29ubmVjdCBhdHRlbXB0IGFuZCB1c2UgdGhlIHJlY2VpdmVkCisgKiA8dHQ+e0B2YWx1ZSBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzI1JFVFJZX0FGVEVSfTwvdHQ+IEhUVFAgaGVhZGVyIHZhbHVlIGFzIGEgb25lLXRpbWUgb3ZlcnJpZGUgb2YgdGhlIHJlY29ubmVjdCBkZWxheS4KKyAqIDwvcD4KKyAqIDxoMz5Vc2luZyBIVFRQIHBlcnNpc3RlbnQgY29ubmVjdGlvbnM8L2gzPgorICogPHA+CisgKiBUaGUgZXhwZXJpZW5jZSBoYXMgc2hvd24gdGhhdCBwZXJzaXN0ZW50IEhUVFAgY29ubmVjdGlvbiBtYW5hZ2VtZW50IGluIHRoZSB7QGxpbmsgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb259LAorICogdGhhdCBpcyB1c2VkIGFzIGEgZGVmYXVsdCBKZXJzZXkgY2xpZW50IHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuc3BpLkNvbm5lY3RvciBjb25uZWN0b3J9LCBpcyBmcmFnaWxlLgorICogSXQgaXMgdW5mb3J0dW5hdGVseSBxdWl0ZSBwb3NzaWJsZSwgdGhhdCB1bmRlciBoZWF2eSBsb2FkIHRoZSBjbGllbnQgYW5kIHNlcnZlciBjb25uZWN0aW9ucyBtYXkgZ2V0IG91dCBvZiBzeW5jLAorICogY2F1c2luZyBKZXJzZXkge0Bjb2RlIEV2ZW50U291cmNlfSBoYW5nIG9uIGEgY29ubmVjdGlvbiB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gY2xvc2VkIGJ5IGEgc2VydmVyLCBidXQgaGFzIG5vdCBiZWVuCisgKiBwcm9wZXJseSBjbGVhbmVkIHVwIGJ5IHRoZSB7QGxpbmsgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb259IG1hbmFnZW1lbnQgY29kZSwgYW5kIGhhcyBiZWVuIHJldXNlZCBmb3IgYSByZS1jb25uZWN0CisgKiByZXF1ZXN0IGluc3RlYWQuIFRvIGF2b2lkIHRoaXMgaXNzdWUsIEplcnNleSB7QGNvZGUgRXZlbnRTb3VyY2V9IGltcGxlbWVudGF0aW9uIGJ5IGRlZmF1bHQgZGlzYWJsZXMKKyAqIDxhIGhyZWY9Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSFRUUF9wZXJzaXN0ZW50X2Nvbm5lY3Rpb24iPnBlcnNpc3RlbnQgSFRUUCBjb25uZWN0aW9uczwvYT4gd2hlbiBjb25uZWN0aW5nCisgKiAob3IgcmVjb25uZWN0aW5nKSB0byB0aGUgU1NFIGVuZHBvaW50LgorICogPC9wPgorICogPHA+CisgKiBJbiBjYXNlIHlvdSBhcmUgdXNpbmcgSmVyc2V5IGV2ZW50IHNvdXJjZSB3aXRoIGEgSmVyc2V5IGNsaWVudAorICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWcjY29ubmVjdG9yUHJvdmlkZXIob3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnNwaS5Db25uZWN0b3JQcm92aWRlcil9CisgKiBjb25uZWN0b3IgcHJvdmlkZXIgY29uZmlndXJlZCB0byB1c2Ugc29tZSBvdGhlciBjbGllbnQge0Bjb2RlIENvbm5lY3RvclByb3ZpZGVyfSBpbXBsZW1lbnRhdGlvbiBhYmxlIHRvIHJlbGlhYmx5CisgKiBtYW5hZ2UgcGVyc2lzdGVudCBIVFRQIGNvbm5lY3Rpb25zIChzdWNoIGFzIHtAY29kZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5LmNvbm5lY3Rvci5Hcml6emx5Q29ubmVjdG9yUHJvdmlkZXJ9IG9yCisgKiB7QGNvZGUgb3JnLmdsYXNzZmlzaC5qZXJzZXkuYXBhY2hlLmNvbm5lY3Rvci5BcGFjaGVDb25uZWN0b3JQcm92aWRlcn0pLCBvciBpbiBjYXNlIHlvdSBzaW1wbHkgbmVlZCB0byB1c2UgcGVyc2lzdGVudAorICogSFRUUCBjb25uZWN0aW9ucywgeW91IG1heSBkbyBzbyBieSBpbnZva2luZyB0aGUge0BsaW5rIEJ1aWxkZXIjdXNlUGVyc2lzdGVudENvbm5lY3Rpb25zKCkgdXNlUGVyc2lzdGVudENvbm5lY3Rpb25zKCl9IG1ldGhvZAorICogb24gYW4gZXZlbnQgc291cmNlIGJ1aWxkZXIgcHJpb3IgdG8gY3JlYXRpbmcgYSBuZXcgZXZlbnQgc291cmNlIGluc3RhbmNlLgorICogPC9wPgorICoKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgRXZlbnRTb3VyY2UgaW1wbGVtZW50cyBFdmVudExpc3RlbmVyIHsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgU1NFIHtAbGluayBFdmVudFNvdXJjZX0gcmVjb25uZWN0IGRlbGF5IHZhbHVlIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKgorICAgICAqIEBzaW5jZSAyLjMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgUkVDT05ORUNUX0RFRkFVTFQgPSA1MDA7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMZXZlbCBDT05ORUNUSU9OX0VSUk9SX0xFVkVMID0gTGV2ZWwuRklORTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBFeHRlbmRlZExvZ2dlciBMT0dHRVIgPSBuZXcgRXh0ZW5kZWRMb2dnZXIoTG9nZ2VyLmdldExvZ2dlcihFdmVudFNvdXJjZS5jbGFzcy5nZXROYW1lKCkpLCBMZXZlbC5GSU5FU1QpOworCisgICAgLyoqCisgICAgICogU1NFIHN0cmVhbWluZyByZXNvdXJjZSB0YXJnZXQuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0OworICAgIC8qKgorICAgICAqIERlZmF1bHQgcmVjb25uZWN0IGRlbGF5LgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgbG9uZyByZWNvbm5lY3REZWxheTsKKyAgICAvKioKKyAgICAgKiBGbGFnIGluZGljYXRpbmcgaWYgdGhlIHBlcnNpc3RlbnQgSFRUUCBjb25uZWN0aW9ucyBzaG91bGQgYmUgZGlzYWJsZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGRpc2FibGVLZWVwQWxpdmU7CisgICAgLyoqCisgICAgICogSW5jb21pbmcgU1NFIGV2ZW50IHByb2Nlc3NpbmcgdGFzayBleGVjdXRvci4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIENsb3NlYWJsZUNsaWVudEV4ZWN1dG9yIGV4ZWN1dG9yOworICAgIC8qKgorICAgICAqIEV2ZW50IHNvdXJjZSBpbnRlcm5hbCBzdGF0ZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIEF0b21pY1JlZmVyZW5jZTxFdmVudFByb2Nlc3Nvci5TdGF0ZT4gc3RhdGUgPSBuZXcgQXRvbWljUmVmZXJlbmNlPD4oRXZlbnRQcm9jZXNzb3IuU3RhdGUuUkVBRFkpOworICAgIC8qKgorICAgICAqIExpc3Qgb2YgYWxsIGxpc3RlbmVycyBub3QgYm91bmQgdG8gcmVjZWl2ZSBvbmx5IGV2ZW50cyBvZiBhIHBhcnRpY3VsYXIgbmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8RXZlbnRMaXN0ZW5lcj4gdW5ib3VuZExpc3RlbmVycyA9IG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdDw+KCk7CisgICAgLyoqCisgICAgICogQSBtYXAgb2YgbGlzdGVuZXJzIGJvdW5kIHRvIHJlY2VpdmUgb25seSBldmVudHMgb2YgYSBwYXJ0aWN1bGFyIG5hbWUuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBDb25jdXJyZW50TWFwPFN0cmluZywgTGlzdDxFdmVudExpc3RlbmVyPj4gYm91bmRMaXN0ZW5lcnMgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpOworCisgICAgLyoqCisgICAgICogU2h1dGRvd24gY2FsbGJhY2suCisgICAgICogPHA+CisgICAgICogSW52b2tlZCB3aGVuIGV2ZW50IHByb2Nlc3NpbmcgcmVhY2hlcyB0ZXJtaW5hbCBzdGFnZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIEV2ZW50UHJvY2Vzc29yLlNodXRkb3duSGFuZGxlciBzaHV0ZG93bkhhbmRsZXIgPSBFdmVudFNvdXJjZS50aGlzOjpzaHV0ZG93bjsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyB7QGxpbmsgRXZlbnRTb3VyY2UuQnVpbGRlciBldmVudCBzb3VyY2UgYnVpbGRlcn0gdGhhdCBwcm92aWRlcyBjb252ZW5pZW50IHdheSBob3cgdG8KKyAgICAgKiBjb25maWd1cmUgYW5kIGZpbmUtdHVuZSB2YXJpb3VzIGFzcGVjdHMgb2YgYSBuZXdseSBwcmVwYXJlZCBldmVudCBzb3VyY2UgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW5kcG9pbnQgU1NFIHN0cmVhbWluZyBlbmRwb2ludC4gTXVzdCBub3QgYmUge0Bjb2RlIG51bGx9LgorICAgICAqIEByZXR1cm4gYSBidWlsZGVyIG9mIGEgbmV3IGV2ZW50IHNvdXJjZSBpbnN0YW5jZSBwb2ludGluZyBhdCB0aGUgc3BlY2lmaWVkIFNTRSBzdHJlYW1pbmcgZW5kcG9pbnQuCisgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBjYXNlIHRoZSBzdXBwbGllZCB3ZWIgdGFyZ2V0IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2luY2UgMi4zCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIHRhcmdldChXZWJUYXJnZXQgZW5kcG9pbnQpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKGVuZHBvaW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IFNTRSBldmVudCBzb3VyY2UgYW5kIG9wZW4gYSBjb25uZWN0aW9uIGl0IHRvIHRoZSBzdXBwbGllZCBTU0Ugc3RyZWFtaW5nIHtAbGluayBXZWJUYXJnZXQgd2ViIHRhcmdldH0uCisgICAgICoKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBlcmZvcm1zIHRoZSBzYW1lIHNlcmllcyBvZiBhY3Rpb25zIGFzIGEgY2FsbCB0bzoKKyAgICAgKiA8cHJlPkV2ZW50U291cmNlLnRhcmdldChlbmRwb2ludCkub3BlbigpPC9wcmU+CisgICAgICogPHA+CisgICAgICogVGhlIGNyZWF0ZWQgZXZlbnQgc291cmNlIGluc3RhbmNlIGF1dG9tYXRpY2FsbHkge0BsaW5rICNvcGVuIG9wZW5zIGEgY29ubmVjdGlvbn0gdG8gdGhlIHN1cHBsaWVkIFNTRSBzdHJlYW1pbmcKKyAgICAgKiB3ZWIgdGFyZ2V0IGFuZCBzdGFydHMgcHJvY2Vzc2luZyBpbmNvbWluZyB7QGxpbmsgSW5ib3VuZEV2ZW50IGV2ZW50c30uCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSBpbmNvbWluZyBldmVudHMgYXJlIHByb2Nlc3NlZCBieSB0aGUgZXZlbnQgc291cmNlIGluIGFuIGFzeW5jaHJvbm91cyB0YXNrIHRoYXQgcnVucyBpbiBhbgorICAgICAqIGludGVybmFsIHNpbmdsZS10aHJlYWRlZCB7QGxpbmsgU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlIHNjaGVkdWxlZCBleGVjdXRvciBzZXJ2aWNlfS4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gZW5kcG9pbnQgU1NFIHN0cmVhbWluZyBlbmRwb2ludC4gTXVzdCBub3QgYmUge0Bjb2RlIG51bGx9LgorICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gY2FzZSB0aGUgc3VwcGxpZWQgd2ViIHRhcmdldCBpcyB7QGNvZGUgbnVsbH0uCisgICAgICovCisgICAgcHVibGljIEV2ZW50U291cmNlKGZpbmFsIFdlYlRhcmdldCBlbmRwb2ludCkgeworICAgICAgICB0aGlzKGVuZHBvaW50LCB0cnVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IFNTRSBldmVudCBzb3VyY2UgcG9pbnRpbmcgYXQgYSBTU0Ugc3RyZWFtaW5nIHtAbGluayBXZWJUYXJnZXQgd2ViIHRhcmdldH0uCisgICAgICoKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHBlcmZvcm1zIHRoZSBzYW1lIHNlcmllcyBvZiBhY3Rpb25zIGFzIGEgY2FsbCB0bzoKKyAgICAgKiA8cHJlPgorICAgICAqIGlmIChvcGVuKSB7CisgICAgICogICAgIEV2ZW50U291cmNlLnRhcmdldChlbmRwb2ludCkub3BlbigpOworICAgICAqIH0gZWxzZSB7CisgICAgICogICAgIEV2ZW50U291cmNlLnRhcmdldChlbmRwb2ludCkuYnVpbGQoKTsKKyAgICAgKiB9PC9wcmU+CisgICAgICogPHA+CisgICAgICogSWYgdGhlIHN1cHBsaWVkIHtAY29kZSBvcGVufSBmbGFnIGlzIHtAY29kZSB0cnVlfSwgdGhlIGNyZWF0ZWQgZXZlbnQgc291cmNlIGluc3RhbmNlIGF1dG9tYXRpY2FsbHkKKyAgICAgKiB7QGxpbmsgI29wZW4gb3BlbnMgYSBjb25uZWN0aW9ufSB0byB0aGUgc3VwcGxpZWQgU1NFIHN0cmVhbWluZyB3ZWIgdGFyZ2V0IGFuZCBzdGFydHMgcHJvY2Vzc2luZyBpbmNvbWluZworICAgICAqIHtAbGluayBJbmJvdW5kRXZlbnQgZXZlbnRzfS4KKyAgICAgKiBPdGhlcndpc2UsIGlmIHRoZSB7QGNvZGUgb3Blbn0gZmxhZyBpcyBzZXQgdG8ge0Bjb2RlIGZhbHNlfSwgdGhlIGNyZWF0ZWQgZXZlbnQgc291cmNlIGluc3RhbmNlCisgICAgICogaXMgbm90IGF1dG9tYXRpY2FsbHkgY29ubmVjdGVkIHRvIHRoZSB3ZWIgdGFyZ2V0LiBJbiB0aGlzIGNhc2UgaXQgaXMgZXhwZWN0ZWQgdGhhdCB0aGUgdXNlciB3aG8KKyAgICAgKiBjcmVhdGVkIHRoZSBldmVudCBzb3VyY2Ugd2lsbCBtYW51YWxseSBpbnZva2UgaXRzIHtAbGluayAjb3BlbigpfSBtZXRob2QuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIE9uY2UgdGhlIGV2ZW50IHNvdXJjZSBpcyBvcGVuLCB0aGUgaW5jb21pbmcgZXZlbnRzIGFyZSBwcm9jZXNzZWQgYnkgdGhlIGV2ZW50IHNvdXJjZSBpbiBhbgorICAgICAqIGFzeW5jaHJvbm91cyB0YXNrIHRoYXQgcnVucyBpbiBhbiBpbnRlcm5hbCBzaW5nbGUtdGhyZWFkZWQge0BsaW5rIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZQorICAgICAqIHNjaGVkdWxlZCBleGVjdXRvciBzZXJ2aWNlfS4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gZW5kcG9pbnQgU1NFIHN0cmVhbWluZyBlbmRwb2ludC4gTXVzdCBub3QgYmUge0Bjb2RlIG51bGx9LgorICAgICAqIEBwYXJhbSBvcGVuICAgICBpZiB7QGNvZGUgdHJ1ZX0sIHRoZSBldmVudCBzb3VyY2Ugd2lsbCBpbW1lZGlhdGVseSBjb25uZWN0IHRvIHRoZSBTU0UgZW5kcG9pbnQsCisgICAgICogICAgICAgICAgICAgICAgIGlmIHtAY29kZSBmYWxzZX0sIHRoZSBjb25uZWN0aW9uIHdpbGwgbm90IGJlIGVzdGFibGlzaGVkIHVudGlsIHtAbGluayAjb3BlbigpfSBtZXRob2QgaXMKKyAgICAgKiAgICAgICAgICAgICAgICAgY2FsbGVkIGV4cGxpY2l0bHkgb24gdGhlIGV2ZW50IHN0cmVhbS4KKyAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGluIGNhc2UgdGhlIHN1cHBsaWVkIHdlYiB0YXJnZXQgaXMge0Bjb2RlIG51bGx9LgorICAgICAqLworICAgIHB1YmxpYyBFdmVudFNvdXJjZShmaW5hbCBXZWJUYXJnZXQgZW5kcG9pbnQsIGZpbmFsIGJvb2xlYW4gb3BlbikgeworICAgICAgICB0aGlzKGVuZHBvaW50LCBudWxsLCBSRUNPTk5FQ1RfREVGQVVMVCwgdHJ1ZSwgb3Blbik7CisgICAgfQorCisgICAgcHJpdmF0ZSBFdmVudFNvdXJjZShmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBsb25nIHJlY29ubmVjdERlbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBkaXNhYmxlS2VlcEFsaXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBvcGVuKSB7CisgICAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJXZWIgdGFyZ2V0IGlzICdudWxsJy4iKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnRhcmdldCA9IFNzZUZlYXR1cmUucmVnaXN0ZXIodGFyZ2V0KTsKKyAgICAgICAgdGhpcy5yZWNvbm5lY3REZWxheSA9IHJlY29ubmVjdERlbGF5OworICAgICAgICB0aGlzLmRpc2FibGVLZWVwQWxpdmUgPSBkaXNhYmxlS2VlcEFsaXZlOworCisgICAgICAgIGZpbmFsIFN0cmluZyBlc05hbWUgPSAobmFtZSA9PSBudWxsKSA/IGNyZWF0ZURlZmF1bHROYW1lKHRhcmdldCkgOiBuYW1lOworCisgICAgICAgIHRoaXMuZXhlY3V0b3IgPSBuZXcgQ2xvc2VhYmxlQ2xpZW50RXhlY3V0b3IoRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZFNjaGVkdWxlZEV4ZWN1dG9yKAorICAgICAgICAgICAgICAgIG5ldyBUaHJlYWRGYWN0b3J5QnVpbGRlcigpLnNldE5hbWVGb3JtYXQoZXNOYW1lICsgIi0lZCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0RGFlbW9uKHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkpOworCisgICAgICAgIGlmIChvcGVuKSB7CisgICAgICAgICAgICBvcGVuKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgY3JlYXRlRGVmYXVsdE5hbWUoV2ViVGFyZ2V0IHRhcmdldCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiamVyc2V5LXNzZS1ldmVudC1zb3VyY2UtWyVzXSIsIHRhcmdldC5nZXRVcmkoKS50b0FTQ0lJU3RyaW5nKCkucmVwbGFjZSgiJSIsICIlJSIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPcGVuIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBzdXBwbGllZCBTU0UgdW5kZXJseWluZyB7QGxpbmsgV2ViVGFyZ2V0IHdlYiB0YXJnZXR9IGFuZCBzdGFydCBwcm9jZXNzaW5nIGluY29taW5nCisgICAgICoge0BsaW5rIEluYm91bmRFdmVudCBldmVudHN9LgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaW4gY2FzZSB0aGUgZXZlbnQgc291cmNlIGhhcyBhbHJlYWR5IGJlZW4gb3BlbmVkIGVhcmxpZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb3BlbigpIHsKKyAgICAgICAgaWYgKCFzdGF0ZS5jb21wYXJlQW5kU2V0KEV2ZW50UHJvY2Vzc29yLlN0YXRlLlJFQURZLCBFdmVudFByb2Nlc3Nvci5TdGF0ZS5PUEVOKSkgeworICAgICAgICAgICAgc3dpdGNoIChzdGF0ZS5nZXQoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgT1BFTjoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5FVkVOVF9TT1VSQ0VfQUxSRUFEWV9DT05ORUNURUQoKSk7CisgICAgICAgICAgICAgICAgY2FzZSBDTE9TRUQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuRVZFTlRfU09VUkNFX0FMUkVBRFlfQ0xPU0VEKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgRXZlbnRQcm9jZXNzb3IuQnVpbGRlciBidWlsZGVyID0KKyAgICAgICAgICAgICAgICBFdmVudFByb2Nlc3Nvci5idWlsZGVyKHRhcmdldCwgc3RhdGUsIGV4ZWN1dG9yLCB0aGlzLCBzaHV0ZG93bkhhbmRsZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYm91bmRMaXN0ZW5lcnMoYm91bmRMaXN0ZW5lcnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudW5ib3VuZExpc3RlbmVycyh1bmJvdW5kTGlzdGVuZXJzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlY29ubmVjdERlbGF5KHJlY29ubmVjdERlbGF5LCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworCisgICAgICAgIGlmIChkaXNhYmxlS2VlcEFsaXZlKSB7CisgICAgICAgICAgICBidWlsZGVyLmRpc2FibGVLZWVwQWxpdmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEV2ZW50UHJvY2Vzc29yIHByb2Nlc3NvciA9IGJ1aWxkZXIuYnVpbGQoKTsKKworICAgICAgICBleGVjdXRvci5zdWJtaXQocHJvY2Vzc29yKTsKKworICAgICAgICAvLyByZXR1cm4gb25seSBhZnRlciB0aGUgZmlyc3QgcmVxdWVzdCB0byB0aGUgU1NFIGVuZHBvaW50IGhhcyBiZWVuIG1hZGUKKyAgICAgICAgcHJvY2Vzc29yLmF3YWl0Rmlyc3RDb250YWN0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgdGhpcyBldmVudCBzb3VyY2UgaW5zdGFuY2UgaGFzIGFscmVhZHkgYmVlbiB7QGxpbmsgI29wZW4oKSBvcGVuZWR9LgorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBldmVudCBzb3VyY2UgaXMgb3Blbiwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNPcGVuKCkgeworICAgICAgICByZXR1cm4gc3RhdGUuZ2V0KCkgPT0gRXZlbnRQcm9jZXNzb3IuU3RhdGUuT1BFTjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBuZXcge0BsaW5rIEV2ZW50TGlzdGVuZXIgZXZlbnQgbGlzdGVuZXJ9IHRvIHJlY2VpdmUgYWxsIHN0cmVhbWVkIHtAbGluayBJbmJvdW5kRXZlbnQgU1NFIGV2ZW50c30uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGlzdGVuZXIgZXZlbnQgbGlzdGVuZXIgdG8gYmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBldmVudCBzb3VyY2UuCisgICAgICogQHNlZSAjcmVnaXN0ZXIoRXZlbnRMaXN0ZW5lciwgU3RyaW5nLCBTdHJpbmcuLi4pCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXIoZmluYWwgRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICByZWdpc3RlcihsaXN0ZW5lciwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIG5hbWUtYm91bmQge0BsaW5rIEV2ZW50TGlzdGVuZXIgZXZlbnQgbGlzdGVuZXJ9IHdoaWNoIHdpbGwgYmUgY2FsbGVkIG9ubHkgZm9yIGluY29taW5nIFNTRQorICAgICAqIHtAbGluayBJbmJvdW5kRXZlbnQgZXZlbnRzfSB3aG9zZSB7QGxpbmsgSW5ib3VuZEV2ZW50I2dldE5hbWUoKSBuYW1lfSBpcyBlcXVhbCB0byB0aGUgc3BlY2lmaWVkCisgICAgICogbmFtZShzKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBsaXN0ZW5lciAgIGV2ZW50IGxpc3RlbmVyIHRvIHJlZ2lzdGVyIHdpdGggdGhpcyBldmVudCBzb3VyY2UuCisgICAgICogQHBhcmFtIGV2ZW50TmFtZSAgaW5ib3VuZCBldmVudCBuYW1lLgorICAgICAqIEBwYXJhbSBldmVudE5hbWVzIGFkZGl0aW9uYWwgZXZlbnQgbmFtZXMuCisgICAgICogQHNlZSAjcmVnaXN0ZXIoRXZlbnRMaXN0ZW5lcikKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlcihmaW5hbCBFdmVudExpc3RlbmVyIGxpc3RlbmVyLCBmaW5hbCBTdHJpbmcgZXZlbnROYW1lLCBmaW5hbCBTdHJpbmcuLi4gZXZlbnROYW1lcykgeworICAgICAgICBpZiAoZXZlbnROYW1lID09IG51bGwpIHsKKyAgICAgICAgICAgIHVuYm91bmRMaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFkZEJvdW5kTGlzdGVuZXIoZXZlbnROYW1lLCBsaXN0ZW5lcik7CisKKyAgICAgICAgICAgIGlmIChldmVudE5hbWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBuYW1lIDogZXZlbnROYW1lcykgeworICAgICAgICAgICAgICAgICAgICBhZGRCb3VuZExpc3RlbmVyKG5hbWUsIGxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYWRkQm91bmRMaXN0ZW5lcihmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgICAgICBMaXN0PEV2ZW50TGlzdGVuZXI+IGxpc3RlbmVycyA9IGJvdW5kTGlzdGVuZXJzLnB1dElmQWJzZW50KG5hbWUsCisgICAgICAgICAgICAgICAgbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PD4oQ29sbGVjdGlvbnMuc2luZ2xldG9uKGxpc3RlbmVyKSkpOworICAgICAgICBpZiAobGlzdGVuZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIGFsYXMsIG5ldyBsaXN0ZW5lciBjb2xsZWN0aW9uIHJlZ2lzdHJhdGlvbiBjb25mbGljdDoKKyAgICAgICAgICAgIC8vIG5lZWQgdG8gYWRkIHRoZSBuZXcgbGlzdGVuZXIgdG8gdGhlIGV4aXN0aW5nIGxpc3RlbmVyIGNvbGxlY3Rpb24KKyAgICAgICAgICAgIGxpc3RlbmVycy5hZGQobGlzdGVuZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqIDxwPgorICAgICAqIFRoZSBkZWZhdWx0IHtAY29kZSBFdmVudFNvdXJjZX0gaW1wbGVtZW50YXRpb24gaXMgZW1wdHksIHVzZXJzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBoYW5kbGUKKyAgICAgKiBpbmNvbWluZyB7QGxpbmsgSW5ib3VuZEV2ZW50fXMuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIE5vdGUgdGhhdCBvdmVycmlkaW5nIHRoaXMgbWV0aG9kIG1heSBiZSBuZWNlc3NhcnkgdG8gbWFrZSBzdXJlIG5vIHtAY29kZSBJbmJvdW5kRXZlbnQgaW5jb21pbmcgZXZlbnRzfQorICAgICAqIGFyZSBsb3N0IGluIGNhc2UgdGhlIGV2ZW50IHNvdXJjZSBpcyBjb25zdHJ1Y3RlZCB1c2luZyB7QGxpbmsgI0V2ZW50U291cmNlKGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQpfQorICAgICAqIGNvbnN0cnVjdG9yIG9yIGluIGNhc2UgYSB7QGNvZGUgdHJ1ZX0gZmxhZyBpcyBwYXNzZWQgdG8gdGhlIHtAbGluayAjRXZlbnRTb3VyY2UoamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldCwgYm9vbGVhbil9CisgICAgICogY29uc3RydWN0b3IsIHNpbmNlIHRoZSBjb25uZWN0aW9uIGlzIG9wZW5lZCBhcyBhcyBwYXJ0IG9mIHRoZSBjb25zdHJ1Y3RvciBjYWxsIGFuZCB0aGUgZXZlbnQgcHJvY2Vzc2luZyBzdGFydHMKKyAgICAgKiBpbW1lZGlhdGVseS4gVGhlcmVmb3JlIGFueSB7QGxpbmsgRXZlbnRMaXN0ZW5lcn1zIHJlZ2lzdGVyZWQgbGF0ZXIgYWZ0ZXIgdGhlIGV2ZW50IHNvdXJjZSBoYXMgYmVlbiBjb25zdHJ1Y3RlZAorICAgICAqIG1heSBtaXNzIHRoZSBub3RpZmljYXRpb25zIGFib3V0IHRoZSBvbmUgb3IgbW9yZSBldmVudHMgdGhhdCBhcnJpdmUgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGNvbm5lY3Rpb24gdG8gdGhlCisgICAgICogZXZlbnQgc291cmNlIGlzIGVzdGFibGlzaGVkLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmJvdW5kRXZlbnQgcmVjZWl2ZWQgaW5ib3VuZCBldmVudC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkV2ZW50KGZpbmFsIEluYm91bmRFdmVudCBpbmJvdW5kRXZlbnQpIHsKKyAgICAgICAgLy8gZG8gbm90aGluZworICAgIH0KKworICAgIC8qKgorICAgICAqIENsb3NlIHRoaXMgZXZlbnQgc291cmNlLgorICAgICAqCisgICAgICogVGhlIG1ldGhvZCB3aWxsIHdhaXQgdXAgdG8gNSBzZWNvbmRzIGZvciB0aGUgaW50ZXJuYWwgZXZlbnQgcHJvY2Vzc2luZyB0YXNrIHRvIGNvbXBsZXRlLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICBjbG9zZSg1LCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZSB0aGlzIGV2ZW50IHNvdXJjZSBhbmQgd2FpdCBmb3IgdGhlIGludGVybmFsIGV2ZW50IHByb2Nlc3NpbmcgdGFzayB0byBjb21wbGV0ZQorICAgICAqIGZvciB1cCB0byB0aGUgc3BlY2lmaWVkIGFtb3VudCBvZiB3YWl0IHRpbWUuCisgICAgICogPHA+CisgICAgICogVGhlIG1ldGhvZCBibG9ja3MgdW50aWwgdGhlIGV2ZW50IHByb2Nlc3NpbmcgdGFzayBoYXMgY29tcGxldGVkIGV4ZWN1dGlvbiBhZnRlciBhIHNodXRkb3duCisgICAgICogcmVxdWVzdCwgb3IgdW50aWwgdGhlIHRpbWVvdXQgb2NjdXJzLCBvciB0aGUgY3VycmVudCB0aHJlYWQgaXMgaW50ZXJydXB0ZWQsIHdoaWNoZXZlciBoYXBwZW5zCisgICAgICogZmlyc3QuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIEluIGNhc2UgdGhlIHdhaXRpbmcgZm9yIHRoZSBldmVudCBwcm9jZXNzaW5nIHRhc2sgaGFzIGJlZW4gaW50ZXJydXB0ZWQsIHRoaXMgbWV0aG9kIHJlc3RvcmVzCisgICAgICogdGhlIHtAbGluayBUaHJlYWQjaW50ZXJydXB0ZWQoKSBpbnRlcnJ1cHR9IGZsYWcgb24gdGhlIHRocmVhZCBiZWZvcmUgcmV0dXJuaW5nIHtAY29kZSBmYWxzZX0uCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHRpbWVvdXQgdGhlIG1heGltdW0gdGltZSB0byB3YWl0LgorICAgICAqIEBwYXJhbSB1bml0ICAgIHRoZSB0aW1lIHVuaXQgb2YgdGhlIHRpbWVvdXQgYXJndW1lbnQuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhpcyBleGVjdXRvciB0ZXJtaW5hdGVkIGFuZCB7QGNvZGUgZmFsc2V9IGlmIHRoZSB0aW1lb3V0IGVsYXBzZWQKKyAgICAgKiBiZWZvcmUgdGVybWluYXRpb24gb3IgdGhlIHRlcm1pbmF0aW9uIHdhcyBpbnRlcnJ1cHRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYm9vbGVhbiBjbG9zZShmaW5hbCBsb25nIHRpbWVvdXQsIGZpbmFsIFRpbWVVbml0IHVuaXQpIHsKKyAgICAgICAgc2h1dGRvd24oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmICghZXhlY3V0b3IuYXdhaXRUZXJtaW5hdGlvbih0aW1lb3V0LCB1bml0KSkgeworICAgICAgICAgICAgICAgIExPR0dFUi5sb2coQ09OTkVDVElPTl9FUlJPUl9MRVZFTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExvY2FsaXphdGlvbk1lc3NhZ2VzLkVWRU5UX1NPVVJDRV9TSFVURE9XTl9USU1FT1VUKHRhcmdldC5nZXRVcmkoKS50b1N0cmluZygpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0dHRVIubG9nKENPTk5FQ1RJT05fRVJST1JfTEVWRUwsCisgICAgICAgICAgICAgICAgICAgIExvY2FsaXphdGlvbk1lc3NhZ2VzLkVWRU5UX1NPVVJDRV9TSFVURE9XTl9JTlRFUlJVUFRFRCh0YXJnZXQuZ2V0VXJpKCkudG9TdHJpbmcoKSkpOworICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgc2h1dGRvd24oKSB7CisgICAgICAgIGlmIChzdGF0ZS5nZXRBbmRTZXQoRXZlbnRQcm9jZXNzb3IuU3RhdGUuQ0xPU0VEKSAhPSBFdmVudFByb2Nlc3Nvci5TdGF0ZS5DTE9TRUQpIHsKKyAgICAgICAgICAgIC8vIHNodXQgZG93biBvbmx5IGlmIGhhcyBub3QgYmVlbiBzaHV0IGRvd24gYmVmb3JlCisgICAgICAgICAgICBMT0dHRVIuZGVidWdMb2coIlNodXR0aW5nIGRvd24gZXZlbnQgcHJvY2Vzc2luZy4iKTsKKyAgICAgICAgICAgIGV4ZWN1dG9yLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbG9zZWFibGUgY2xpZW50IGV4ZWN1dG9yLgorICAgICAqIDxwPgorICAgICAqIFByb3ZpZGVzIGFsbCB7QGxpbmsgQ2xpZW50RXhlY3V0b3J9IG1ldGhvZHMgYXMgd2VsbCBhcyB7QGxpbmsgQ2xvc2VhYmxlfSBhbmQge0BsaW5rICNhd2FpdFRlcm1pbmF0aW9uKGxvbmcsIFRpbWVVbml0KX0uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2xvc2VhYmxlQ2xpZW50RXhlY3V0b3IgaW1wbGVtZW50cyBDbGllbnRFeGVjdXRvciwgQ2xvc2VhYmxlIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSBzY2hlZHVsZWRFeGVjdXRvclNlcnZpY2U7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBuZXcgQ2xvc2VhYmxlIENsaWVudCBleGVjdXRvciB3aXRoIHByb3ZpZGVkIGJhY2tpbmcgc2NoZWR1bGVkIGV4ZWN1dG9yIHNlcnZpY2UuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UgYmFja2luZyBzY2hlZHVsZWQgZXhlY3V0b3Igc2VydmljZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBDbG9zZWFibGVDbGllbnRFeGVjdXRvcihTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2Ugc2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlKSB7CisgICAgICAgICAgICB0aGlzLnNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSA9IHNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgPFQ+IEZ1dHVyZTxUPiBzdWJtaXQoQ2FsbGFibGU8VD4gdGFzaykgeworICAgICAgICAgICAgcmV0dXJuIHNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZS5zdWJtaXQodGFzayk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEZ1dHVyZTw/PiBzdWJtaXQoUnVubmFibGUgdGFzaykgeworICAgICAgICAgICAgcmV0dXJuIHNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZS5zdWJtaXQodGFzayk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIDxUPiBGdXR1cmU8VD4gc3VibWl0KFJ1bm5hYmxlIHRhc2ssIFQgcmVzdWx0KSB7CisgICAgICAgICAgICByZXR1cm4gc2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlLnN1Ym1pdCh0YXNrLCByZXN1bHQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyA8VD4gU2NoZWR1bGVkRnV0dXJlPFQ+IHNjaGVkdWxlKENhbGxhYmxlPFQ+IGNhbGxhYmxlLCBsb25nIGRlbGF5LCBUaW1lVW5pdCB1bml0KSB7CisgICAgICAgICAgICByZXR1cm4gc2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlLnNjaGVkdWxlKGNhbGxhYmxlLCBkZWxheSwgdW5pdCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFNjaGVkdWxlZEZ1dHVyZTw/PiBzY2hlZHVsZShSdW5uYWJsZSBjb21tYW5kLCBsb25nIGRlbGF5LCBUaW1lVW5pdCB1bml0KSB7CisgICAgICAgICAgICByZXR1cm4gc2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlLnNjaGVkdWxlKGNvbW1hbmQsIGRlbGF5LCB1bml0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgICAgIHNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZS5zaHV0ZG93bk5vdygpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJsb2NrcyB1bnRpbCBhbGwgdGFza3MgaGF2ZSBjb21wbGV0ZWQgZXhlY3V0aW9uIGFmdGVyIGEgc2h1dGRvd24KKyAgICAgICAgICogcmVxdWVzdCwgb3IgdGhlIHRpbWVvdXQgb2NjdXJzLCBvciB0aGUgY3VycmVudCB0aHJlYWQgaXMKKyAgICAgICAgICogaW50ZXJydXB0ZWQsIHdoaWNoZXZlciBoYXBwZW5zIGZpcnN0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdGltZW91dCB0aGUgbWF4aW11bSB0aW1lIHRvIHdhaXQKKyAgICAgICAgICogQHBhcmFtIHVuaXQgdGhlIHRpbWUgdW5pdCBvZiB0aGUgdGltZW91dCBhcmd1bWVudAorICAgICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIGV4ZWN1dG9yIHRlcm1pbmF0ZWQgYW5kCisgICAgICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBpZiB0aGUgdGltZW91dCBlbGFwc2VkIGJlZm9yZSB0ZXJtaW5hdGlvbgorICAgICAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGlmIGludGVycnVwdGVkIHdoaWxlIHdhaXRpbmcKKyAgICAgICAgICovCisgICAgICAgIGJvb2xlYW4gYXdhaXRUZXJtaW5hdGlvbihsb25nIHRpbWVvdXQsIFRpbWVVbml0IHVuaXQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gc2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlLmF3YWl0VGVybWluYXRpb24odGltZW91dCwgdW5pdCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIEplcnNleSB7QGxpbmsgRXZlbnRTb3VyY2V9IGJ1aWxkZXIgY2xhc3MuCisgICAgICoKKyAgICAgKiBFdmVudCBzb3VyY2UgYnVpbGRlciBwcm92aWRlcyBtZXRob2RzIHRoYXQgbGV0IHlvdSBjb252ZW5pZW50bHkgY29uZmlndXJlIGFuZCBzdWJzZXF1ZW50bHkgYnVpbGQKKyAgICAgKiBhIG5ldyB7QGNvZGUgRXZlbnRTb3VyY2V9IGluc3RhbmNlLiBZb3UgY2FuIG9idGFpbiBhIG5ldyBldmVudCBzb3VyY2UgYnVpbGRlciBpbnN0YW5jZSB1c2luZworICAgICAqIGEgc3RhdGljIHtAbGluayBFdmVudFNvdXJjZSN0YXJnZXQoamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldCkgRXZlbnRTb3VyY2UudGFyZ2V0KGVuZHBvaW50KX0gZmFjdG9yeSBtZXRob2QuCisgICAgICogPHA+CisgICAgICogRm9yIGV4YW1wbGU6CisgICAgICogPHByZT4KKyAgICAgKiBFdmVudFNvdXJjZSBlcyA9IEV2ZW50U291cmNlLnRhcmdldChlbmRwb2ludCkubmFtZWQoIm15IHNvdXJjZSIpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWNvbm5lY3RpbmdFdmVyeSg1LCBTRUNPTkRTKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAub3BlbigpOworICAgICAqIDwvcHJlPgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBzaW5jZSAyLjMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXIgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgV2ViVGFyZ2V0IGVuZHBvaW50OworCisgICAgICAgIHByaXZhdGUgbG9uZyByZWNvbm5lY3QgPSBFdmVudFNvdXJjZS5SRUNPTk5FQ1RfREVGQVVMVDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZSA9IG51bGw7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBkaXNhYmxlS2VlcEFsaXZlID0gdHJ1ZTsKKworICAgICAgICBwcml2YXRlIEJ1aWxkZXIoZmluYWwgV2ViVGFyZ2V0IGVuZHBvaW50KSB7CisgICAgICAgICAgICB0aGlzLmVuZHBvaW50ID0gZW5kcG9pbnQ7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IGEgY3VzdG9tIG5hbWUgZm9yIHRoZSBldmVudCBzb3VyY2UuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBBdCBwcmVzZW50LCBjdXN0b20gZXZlbnQgc291cmNlIG5hbWUgaXMgbWFpbmx5IHVzZWZ1bCB0byBiZSBhYmxlIHRvIGRpc3Rpbmd1aXNoIGRpZmZlcmVudCBldmVudCBzb3VyY2UKKyAgICAgICAgICogZXZlbnQgcHJvY2Vzc2luZyB0aHJlYWRzIGZyb20gb25lIGFub3RoZXIuIElmIG5vdCBzZXQsIGEgZGVmYXVsdCBuYW1lIHdpbGwgYmUgZ2VuZXJhdGVkIHVzaW5nIHRoZQorICAgICAgICAgKiBTU0UgZW5kcG9pbnQgVVJJLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBuYW1lIGN1c3RvbSBldmVudCBzb3VyY2UgbmFtZS4KKyAgICAgICAgICogQHJldHVybiB1cGRhdGVkIGV2ZW50IHNvdXJjZSBidWlsZGVyIGluc3RhbmNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgbmFtZWQoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbnN0cnVjdCBldmVudCBzb3VyY2UgdG8gdXNlCisgICAgICAgICAqIDxhIGhyZWY9Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSFRUUF9wZXJzaXN0ZW50X2Nvbm5lY3Rpb24iPnBlcnNpc3RlbnQgSFRUUCBjb25uZWN0aW9uczwvYT4gd2hlbiBjb25uZWN0aW5nCisgICAgICAgICAqIChvciByZWNvbm5lY3RpbmcpIHRvIHRoZSBTU0UgZW5kcG9pbnQsIHByb3ZpZGVkIHRoZSBtZWNoYW5pc20gaXMgc3VwcG9ydGVkIGJ5IHRoZSB1bmRlcmx5aW5nIGNsaWVudAorICAgICAgICAgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnNwaS5Db25uZWN0b3J9LgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogQnkgZGVmYXVsdCwgdGhlIHBlcnNpc3RlbnQgSFRUUCBjb25uZWN0aW9ucyBhcmUgZGlzYWJsZWQgZm9yIHRoZSByZWFzb25zIGRpc2N1c3NlZCBpbiB0aGUge0BsaW5rIEV2ZW50U291cmNlfQorICAgICAgICAgKiBqYXZhZG9jLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gdXBkYXRlZCBldmVudCBzb3VyY2UgYnVpbGRlciBpbnN0YW5jZS4KKyAgICAgICAgICovCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKQorICAgICAgICBwdWJsaWMgQnVpbGRlciB1c2VQZXJzaXN0ZW50Q29ubmVjdGlvbnMoKSB7CisgICAgICAgICAgICBkaXNhYmxlS2VlcEFsaXZlID0gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIGluaXRpYWwgcmVjb25uZWN0IGRlbGF5IHRvIGJlIHVzZWQgYnkgdGhlIGV2ZW50IHNvdXJjZS4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIE5vdGUgdGhhdCB0aGlzIHZhbHVlIG1heSBiZSBsYXRlciBvdmVycmlkZGVuIGJ5IHRoZSBTU0UgZW5kcG9pbnQgdXNpbmcgZWl0aGVyIGEge0Bjb2RlIHJldHJ5fSBTU0UgZXZlbnQgZmllbGQKKyAgICAgICAgICogb3IgPHR0PkhUVFAgNTAzICsge0B2YWx1ZSBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzI1JFVFJZX0FGVEVSfTwvdHQ+IG1lY2hhbmlzbSBhcyBkZXNjcmliZWQKKyAgICAgICAgICogaW4gdGhlIHtAbGluayBFdmVudFNvdXJjZX0gamF2YWRvYy4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZGVsYXkgdGhlIGRlZmF1bHQgdGltZSB0byB3YWl0IGJlZm9yZSBhdHRlbXB0aW5nIHRvIHJlY292ZXIgZnJvbSBhIGNvbm5lY3Rpb24gbG9zcy4KKyAgICAgICAgICogQHBhcmFtIHVuaXQgIHRpbWUgdW5pdCBvZiB0aGUgcmVjb25uZWN0IGRlbGF5IHBhcmFtZXRlci4KKyAgICAgICAgICogQHJldHVybiB1cGRhdGVkIGV2ZW50IHNvdXJjZSBidWlsZGVyIGluc3RhbmNlLgorICAgICAgICAgKi8KKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHJlY29ubmVjdGluZ0V2ZXJ5KGZpbmFsIGxvbmcgZGVsYXksIFRpbWVVbml0IHVuaXQpIHsKKyAgICAgICAgICAgIHJlY29ubmVjdCA9IHVuaXQudG9NaWxsaXMoZGVsYXkpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQnVpbGQgbmV3IFNTRSBldmVudCBzb3VyY2UgcG9pbnRpbmcgYXQgYSBTU0Ugc3RyZWFtaW5nIHtAbGluayBXZWJUYXJnZXQgd2ViIHRhcmdldH0uCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGUgcmV0dXJuZWQgZXZlbnQgc291cmNlIGlzIHJlYWR5LCBidXQgbm90IHtAbGluayBFdmVudFNvdXJjZSNvcGVuKCkgY29ubmVjdGVkfSB0byB0aGUgU1NFIGVuZHBvaW50LgorICAgICAgICAgKiBJdCBpcyBleHBlY3RlZCB0aGF0IHlvdSB3aWxsIG1hbnVhbGx5IGludm9rZSBpdHMge0BsaW5rICNvcGVuKCl9IG1ldGhvZCBvbmNlIHlvdSBhcmUgcmVhZHkgdG8gc3RhcnQKKyAgICAgICAgICogcmVjZWl2aW5nIFNTRSBldmVudHMuIEluIGNhc2UgeW91IHdhbnQgdG8gYnVpbGQgYW4gZXZlbnQgc291cmNlIGluc3RhbmNlIHRoYXQgaXMgYWxyZWFkeSBjb25uZWN0ZWQKKyAgICAgICAgICogdG8gdGhlIFNTRSBlbmRwb2ludCwgdXNlIHRoZSBldmVudCBzb3VyY2UgYnVpbGRlciB7QGxpbmsgI29wZW4oKX0gbWV0aG9kIGluc3RlYWQuCisgICAgICAgICAqIDwvcD4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIE9uY2UgdGhlIGV2ZW50IHNvdXJjZSBpcyBvcGVuLCB0aGUgaW5jb21pbmcgZXZlbnRzIGFyZSBwcm9jZXNzZWQgYnkgdGhlIGV2ZW50IHNvdXJjZSBpbiBhbgorICAgICAgICAgKiBhc3luY2hyb25vdXMgdGFzayB0aGF0IHJ1bnMgaW4gYW4gaW50ZXJuYWwgc2luZ2xlLXRocmVhZGVkIHtAbGluayBTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UKKyAgICAgICAgICogc2NoZWR1bGVkIGV4ZWN1dG9yIHNlcnZpY2V9LgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gbmV3IGV2ZW50IHNvdXJjZSBpbnN0YW5jZSwgcmVhZHkgdG8gYmUgY29ubmVjdGVkIHRvIHRoZSBTU0UgZW5kcG9pbnQuCisgICAgICAgICAqIEBzZWUgI29wZW4oKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEV2ZW50U291cmNlIGJ1aWxkKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBFdmVudFNvdXJjZShlbmRwb2ludCwgbmFtZSwgcmVjb25uZWN0LCBkaXNhYmxlS2VlcEFsaXZlLCBmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQnVpbGQgbmV3IFNTRSBldmVudCBzb3VyY2UgcG9pbnRpbmcgYXQgYSBTU0Ugc3RyZWFtaW5nIHtAbGluayBXZWJUYXJnZXQgd2ViIHRhcmdldH0uCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGUgcmV0dXJuZWQgZXZlbnQgc291cmNlIGlzIGFscmVhZHkge0BsaW5rIEV2ZW50U291cmNlI29wZW4oKSBjb25uZWN0ZWR9IHRvIHRoZSBTU0UgZW5kcG9pbnQKKyAgICAgICAgICogYW5kIGlzIHByb2Nlc3NpbmcgYW55IG5ldyBpbmNvbWluZyBldmVudHMuIEluIGNhc2UgeW91IHdhbnQgdG8gYnVpbGQgYW4gZXZlbnQgc291cmNlIGluc3RhbmNlCisgICAgICAgICAqIHRoYXQgaXMgYWxyZWFkeSByZWFkeSwgYnV0IG5vdCBhdXRvbWF0aWNhbGx5IGNvbm5lY3RlZCB0byB0aGUgU1NFIGVuZHBvaW50LCB1c2UgdGhlIGV2ZW50IHNvdXJjZQorICAgICAgICAgKiBidWlsZGVyIHtAbGluayAjYnVpbGQoKX0gbWV0aG9kIGluc3RlYWQuCisgICAgICAgICAqIDwvcD4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoZSBpbmNvbWluZyBldmVudHMgYXJlIHByb2Nlc3NlZCBieSB0aGUgZXZlbnQgc291cmNlIGluIGFuIGFzeW5jaHJvbm91cyB0YXNrIHRoYXQgcnVucyBpbiBhbgorICAgICAgICAgKiBpbnRlcm5hbCBzaW5nbGUtdGhyZWFkZWQge0BsaW5rIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZSBzY2hlZHVsZWQgZXhlY3V0b3Igc2VydmljZX0uCisgICAgICAgICAqIDwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBuZXcgZXZlbnQgc291cmNlIGluc3RhbmNlLCBhbHJlYWR5IGNvbm5lY3RlZCB0byB0aGUgU1NFIGVuZHBvaW50LgorICAgICAgICAgKiBAc2VlICNidWlsZCgpCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgRXZlbnRTb3VyY2Ugb3BlbigpIHsKKyAgICAgICAgICAgIC8vIG9wZW5pbmcgZGlyZWN0bHkgaW4gdGhlIGNvbnN0cnVjdG9yIGlzIGp1c3QgcGxhaW4gdWdseS4uLgorICAgICAgICAgICAgZmluYWwgRXZlbnRTb3VyY2Ugc291cmNlID0gbmV3IEV2ZW50U291cmNlKGVuZHBvaW50LCBuYW1lLCByZWNvbm5lY3QsIGRpc2FibGVLZWVwQWxpdmUsIGZhbHNlKTsKKyAgICAgICAgICAgIHNvdXJjZS5vcGVuKCk7CisgICAgICAgICAgICByZXR1cm4gc291cmNlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvc3NlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvc3NlL0luYm91bmRFdmVudC5qYXZhIGIvbWVkaWEvc3NlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvc3NlL0luYm91bmRFdmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4ZjAwNGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9zc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9zc2UvSW5ib3VuZEV2ZW50LmphdmEKQEAgLTAsMCArMSw0MjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5zc2UuSW5ib3VuZFNzZUV2ZW50OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5NZXNzYWdlQm9keVdvcmtlcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5NZXNzYWdlQm9keVByb3ZpZGVyTm90Rm91bmRFeGNlcHRpb247CisKKy8qKgorICogSW5ib3VuZCBldmVudC4KKyAqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEluYm91bmRFdmVudCBpbXBsZW1lbnRzIEluYm91bmRTc2VFdmVudCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBHZW5lcmljVHlwZTxTdHJpbmc+IFNUUklOR19BU19HRU5FUklDX1RZUEUgPSBuZXcgR2VuZXJpY1R5cGU8PihTdHJpbmcuY2xhc3MpOworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBpZDsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBjb21tZW50OworICAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIGRhdGE7CisgICAgcHJpdmF0ZSBmaW5hbCBsb25nIHJlY29ubmVjdERlbGF5OworCisgICAgcHJpdmF0ZSBmaW5hbCBNZXNzYWdlQm9keVdvcmtlcnMgbWVzc2FnZUJvZHlXb3JrZXJzOworICAgIHByaXZhdGUgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zOworICAgIHByaXZhdGUgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZTsKKyAgICBwcml2YXRlIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzOworCisgICAgLyoqCisgICAgICogSW5ib3VuZCBldmVudCBidWlsZGVyLiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIG5vdCB0aHJlYWQtc2FmZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgQnVpbGRlciB7CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgaWQ7CisgICAgICAgIHByaXZhdGUgbG9uZyByZWNvbm5lY3REZWxheSA9IFNzZUZlYXR1cmUuUkVDT05ORUNUX05PVF9TRVQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGRhdGFTdHJlYW07CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBNZXNzYWdlQm9keVdvcmtlcnMgd29ya2VyczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnM7CisgICAgICAgIHByaXZhdGUgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVyczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdCdWlsZGVyIGNvbW1lbnRCdWlsZGVyOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgbmV3IGluYm91bmQgZXZlbnQgYnVpbGRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHdvcmtlcnMgICAgIGNvbmZpZ3VyZWQgY2xpZW50LXNpZGUge0BsaW5rIE1lc3NhZ2VCb2R5V29ya2VycyBlbnRpdHkgcHJvdmlkZXJzfSB1c2VkIGZvcgorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAge0BsaW5rIGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcn0gbG9va3VwLgorICAgICAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbnMgYW5ub3RhdGlvbnMgYXR0YWNoZWQgdG8gdGhlIEphdmEgdHlwZSB0byBiZSByZWFkLiBVc2VkIGZvcgorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAge0BsaW5rIGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcn0gbG9va3VwLgorICAgICAgICAgKiBAcGFyYW0gbWVkaWFUeXBlICAgbWVkaWEgdHlwZSBvZiB0aGUgU1NFIGV2ZW50IGRhdGEuCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICBVc2VkIGZvciB7QGxpbmsgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyfSBsb29rdXAuCisgICAgICAgICAqIEBwYXJhbSBoZWFkZXJzICAgICByZXNwb25zZSBoZWFkZXJzLiBVc2VkIGZvciB7QGxpbmsgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyfSBsb29rdXAuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlcihNZXNzYWdlQm9keVdvcmtlcnMgd29ya2VycywKKyAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaGVhZGVycykgeworICAgICAgICAgICAgdGhpcy53b3JrZXJzID0gd29ya2VyczsKKyAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uczsKKyAgICAgICAgICAgIHRoaXMubWVkaWFUeXBlID0gbWVkaWFUeXBlOworICAgICAgICAgICAgdGhpcy5oZWFkZXJzID0gaGVhZGVyczsKKworICAgICAgICAgICAgdGhpcy5jb21tZW50QnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICB0aGlzLmRhdGFTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IGluYm91bmQgZXZlbnQgbmFtZS4KKyAgICAgICAgICogPHAvPgorICAgICAgICAgKiBWYWx1ZSBvZiB0aGUgcmVjZWl2ZWQgU1NFIHtAY29kZSAiZXZlbnQifSBmaWVsZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5hbWUge0Bjb2RlICJldmVudCJ9IGZpZWxkIHZhbHVlLgorICAgICAgICAgKiBAcmV0dXJuIHVwZGF0ZWQgYnVpbGRlciBpbnN0YW5jZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIG5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgaW5ib3VuZCBldmVudCBpZGVudGlmaWVyLgorICAgICAgICAgKiA8cC8+CisgICAgICAgICAqIFZhbHVlIG9mIHRoZSByZWNlaXZlZCBTU0Uge0Bjb2RlICJpZCJ9IGZpZWxkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gaWQge0Bjb2RlICJpZCJ9IGZpZWxkIHZhbHVlLgorICAgICAgICAgKiBAcmV0dXJuIHVwZGF0ZWQgYnVpbGRlciBpbnN0YW5jZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGlkKFN0cmluZyBpZCkgeworICAgICAgICAgICAgdGhpcy5pZCA9IGlkOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIGEgY29tbWVudCBsaW5lIHRvIHRoZSBldmVudC4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoZSBjb21tZW50IGxpbmUgd2lsbCBiZSBhZGRlZCB0byB0aGUgcmVjZWl2ZWQgU1NFIGV2ZW50IGNvbW1lbnQgYXMgYSBuZXcgbGluZSBpbiB0aGUgY29tbWVudCBmaWVsZC4KKyAgICAgICAgICogSWYgdGhlIGNvbW1lbnQgbGluZSBwYXJhbWV0ZXIgaXMge0Bjb2RlIG51bGx9LCB0aGUgY2FsbCB3aWxsIGJlIGlnbm9yZWQuCisgICAgICAgICAqIDwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNvbW1lbnRMaW5lIGNvbW1lbnQgbGluZSB0byBiZSBhZGRlZCB0byB0aGUgZXZlbnQgY29tbWVudC4KKyAgICAgICAgICogQHJldHVybiB1cGRhdGVkIGJ1aWxkZXIgaW5zdGFuY2UuCisgICAgICAgICAqIEBzaW5jZSAyLjIxCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBjb21tZW50TGluZShmaW5hbCBDaGFyU2VxdWVuY2UgY29tbWVudExpbmUpIHsKKyAgICAgICAgICAgIGlmIChjb21tZW50TGluZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29tbWVudEJ1aWxkZXIuYXBwZW5kKGNvbW1lbnRMaW5lKS5hcHBlbmQoJ1xuJyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCByZWNvbm5lY3Rpb24gZGVsYXkgKGluIG1pbGxpc2Vjb25kcykgdGhhdCBpbmRpY2F0ZXMgaG93IGxvbmcgdGhlIGV2ZW50IHJlY2VpdmVyIHNob3VsZCB3YWl0CisgICAgICAgICAqIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHJlY29ubmVjdCBpbiBjYXNlIGEgY29ubmVjdGlvbiB0byBTU0UgZXZlbnQgc291cmNlIGlzIGxvc3QuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBWYWx1ZSBvZiB0aGUgcmVjZWl2ZWQgU1NFIHtAY29kZSAicmV0cnkifSBmaWVsZC4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbWlsbGlzZWNvbmRzIHJlY29ubmVjdGlvbiBkZWxheSBpbiBtaWxsaXNlY29uZHMuIE5lZ2F0aXZlIHZhbHVlcyB1bi1zZXQgdGhlIHJlY29ubmVjdGlvbiBkZWxheS4KKyAgICAgICAgICogQHJldHVybiB1cGRhdGVkIGJ1aWxkZXIgaW5zdGFuY2UuCisgICAgICAgICAqIEBzaW5jZSAyLjMKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHJlY29ubmVjdERlbGF5KGxvbmcgbWlsbGlzZWNvbmRzKSB7CisgICAgICAgICAgICBpZiAobWlsbGlzZWNvbmRzIDwgMCkgeworICAgICAgICAgICAgICAgIG1pbGxpc2Vjb25kcyA9IFNzZUZlYXR1cmUuUkVDT05ORUNUX05PVF9TRVQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLnJlY29ubmVjdERlbGF5ID0gbWlsbGlzZWNvbmRzOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIG1vcmUgaW5ib3VuZCBldmVudCBkYXRhLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZGF0YSBieXRlIGFycmF5IGNvbnRhaW5pbmcgZGF0YSBzdG9yZWQgaW4gdGhlIGluY29taW5nIGV2ZW50LgorICAgICAgICAgKiBAcmV0dXJuIHVwZGF0ZWQgYnVpbGRlciBpbnN0YW5jZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHdyaXRlKGJ5dGVbXSBkYXRhKSB7CisgICAgICAgICAgICBpZiAoZGF0YSA9PSBudWxsIHx8IGRhdGEubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB0aGlzLmRhdGFTdHJlYW0ud3JpdGUoZGF0YSk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIC8vIGlnbm9yZSAtIHRoaXMgaXMgbm90IHBvc3NpYmxlIHdpdGggQnl0ZUFycmF5T3V0cHV0U3RyZWFtCisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBCdWlsZCBhIG5ldyBpbmJvdW5kIGV2ZW50IGluc3RhbmNlIHVzaW5nIHRoZSBzdXBwbGllZCBkYXRhLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIG5ldyBpbmJvdW5kIGV2ZW50IGluc3RhbmNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEluYm91bmRFdmVudCBidWlsZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSW5ib3VuZEV2ZW50KAorICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgY29tbWVudEJ1aWxkZXIubGVuZ3RoKCkgPiAwID8gY29tbWVudEJ1aWxkZXIuc3Vic3RyaW5nKDAsIGNvbW1lbnRCdWlsZGVyLmxlbmd0aCgpIC0gMSkgOiBudWxsLAorICAgICAgICAgICAgICAgICAgICByZWNvbm5lY3REZWxheSwKKyAgICAgICAgICAgICAgICAgICAgZGF0YVN0cmVhbS50b0J5dGVBcnJheSgpLAorICAgICAgICAgICAgICAgICAgICB3b3JrZXJzLAorICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICBoZWFkZXJzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgSW5ib3VuZEV2ZW50KGZpbmFsIFN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY29tbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBsb25nIHJlY29ubmVjdERlbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJ5dGVbXSBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2VCb2R5V29ya2VycyBtZXNzYWdlQm9keVdvcmtlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5pZCA9IGlkOworICAgICAgICB0aGlzLmNvbW1lbnQgPSBjb21tZW50OworICAgICAgICB0aGlzLnJlY29ubmVjdERlbGF5ID0gcmVjb25uZWN0RGVsYXk7CisgICAgICAgIHRoaXMuZGF0YSA9IHN0cmlwTGFzdExpbmVCcmVhayhkYXRhKTsKKyAgICAgICAgdGhpcy5tZXNzYWdlQm9keVdvcmtlcnMgPSBtZXNzYWdlQm9keVdvcmtlcnM7CisgICAgICAgIHRoaXMuYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9uczsKKyAgICAgICAgdGhpcy5tZWRpYVR5cGUgPSBtZWRpYVR5cGU7CisgICAgICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGV2ZW50IG5hbWUuCisgICAgICogPHA+CisgICAgICogQ29udGFpbnMgdmFsdWUgb2YgU1NFIHtAY29kZSAiZXZlbnQifSBmaWVsZC4gVGhpcyBmaWVsZCBpcyBvcHRpb25hbC4gTWV0aG9kIG1heSByZXR1cm4ge0Bjb2RlIG51bGx9LCBpZiB0aGUgZXZlbnQKKyAgICAgKiBuYW1lIGlzIG5vdCBzcGVjaWZpZWQuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHJldHVybiBldmVudCBuYW1lLCBvciB7QGNvZGUgbnVsbH0gaWYgbm90IHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBldmVudCBpZGVudGlmaWVyLgorICAgICAqIDxwPgorICAgICAqIENvbnRhaW5zIHZhbHVlIG9mIFNTRSB7QGNvZGUgImlkIn0gZmllbGQuIFRoaXMgZmllbGQgaXMgb3B0aW9uYWwuIE1ldGhvZCBtYXkgcmV0dXJuIHtAY29kZSBudWxsfSwgaWYgdGhlIGV2ZW50CisgICAgICogaWRlbnRpZmllciBpcyBub3Qgc3BlY2lmaWVkLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gZXZlbnQgaWQuCisgICAgICogQHNpbmNlIDIuMworICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiBpZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBjb21tZW50IHN0cmluZyB0aGF0IGFjY29tcGFuaWVzIHRoZSBldmVudC4KKyAgICAgKiA8cD4KKyAgICAgKiBDb250YWlucyB2YWx1ZSBvZiB0aGUgY29tbWVudCBhc3NvY2lhdGVkIHdpdGggU1NFIGV2ZW50LiBUaGlzIGZpZWxkIGlzIG9wdGlvbmFsLiBNZXRob2QgbWF5IHJldHVybiB7QGNvZGUgbnVsbH0sCisgICAgICogaWYgdGhlIGV2ZW50IGNvbW1lbnQgaXMgbm90IHNwZWNpZmllZC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIGNvbW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudC4KKyAgICAgKiBAc2luY2UgMi4yMQorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIGNvbW1lbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IG5ldyBjb25uZWN0aW9uIHJldHJ5IHRpbWUgaW4gbWlsbGlzZWNvbmRzIHRoZSBldmVudCByZWNlaXZlciBzaG91bGQgd2FpdCBiZWZvcmUgYXR0ZW1wdGluZyB0bworICAgICAqIHJlY29ubmVjdCBhZnRlciBhIGNvbm5lY3Rpb24gdG8gdGhlIFNTRSBldmVudCBzb3VyY2UgaXMgbG9zdC4KKyAgICAgKiA8cD4KKyAgICAgKiBDb250YWlucyB2YWx1ZSBvZiBTU0Uge0Bjb2RlICJyZXRyeSJ9IGZpZWxkLiBUaGlzIGZpZWxkIGlzIG9wdGlvbmFsLiBNZXRob2QgcmV0dXJucyB7QGxpbmsgU3NlRmVhdHVyZSNSRUNPTk5FQ1RfTk9UX1NFVH0KKyAgICAgKiBpZiBubyB2YWx1ZSBoYXMgYmVlbiBzZXQuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHJldHVybiByZWNvbm5lY3Rpb24gZGVsYXkgaW4gbWlsbGlzZWNvbmRzIG9yIHtAbGluayBTc2VGZWF0dXJlI1JFQ09OTkVDVF9OT1RfU0VUfSBpZiBubyB2YWx1ZSBoYXMgYmVlbiBzZXQuCisgICAgICogQHNpbmNlIDIuMworICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldFJlY29ubmVjdERlbGF5KCkgeworICAgICAgICByZXR1cm4gcmVjb25uZWN0RGVsYXk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgdGhlIGNvbm5lY3Rpb24gcmV0cnkgdGltZSBoYXMgYmVlbiBzZXQgaW4gdGhlIGV2ZW50LgorICAgICAqCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgbmV3IHJlY29ubmVjdGlvbiBkZWxheSBoYXMgYmVlbiBzZXQgaW4gdGhlIGV2ZW50LCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKiBAc2luY2UgMi4zCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gaXNSZWNvbm5lY3REZWxheVNldCgpIHsKKyAgICAgICAgcmV0dXJuIHJlY29ubmVjdERlbGF5ID4gU3NlRmVhdHVyZS5SRUNPTk5FQ1RfTk9UX1NFVDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayBpZiB0aGUgZXZlbnQgaXMgZW1wdHkgKGkuZS4gZG9lcyBub3QgY29udGFpbiBhbnkgZGF0YSkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiBjdXJyZW50IGluc3RhbmNlIGRvZXMgbm90IGNvbnRhaW4gYW55IGRhdGEsIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7CisgICAgICAgIHJldHVybiBkYXRhLmxlbmd0aCA9PSAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgb3JpZ2luYWwgZXZlbnQgZGF0YSBzdHJpbmcge0BsaW5rIFN0cmluZ30uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGV2ZW50IGRhdGEgZGUtc2VyaWFsaXplZCBpbnRvIGEgc3RyaW5nLgorICAgICAqIEB0aHJvd3MgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbiB3aGVuIHByb3ZpZGVkIHR5cGUgY2FuJ3QgYmUgcmVhZC4gVGhlIHRocm93biBleGNlcHRpb24gd3JhcHMgdGhlIG9yaWdpbmFsIGNhdXNlLgorICAgICAqIEBzaW5jZSAyLjMKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHJlYWREYXRhKCkgeworICAgICAgICByZXR1cm4gcmVhZERhdGEoU1RSSU5HX0FTX0dFTkVSSUNfVFlQRSwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBldmVudCBkYXRhIGFzIGEgZ2l2ZW4gSmF2YSB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIHR5cGUgSmF2YSB0eXBlIHRvIGJlIHVzZWQgZm9yIGV2ZW50IGRhdGEgZGUtc2VyaWFsaXphdGlvbi4KKyAgICAgKiBAcmV0dXJuIGV2ZW50IGRhdGEgZGUtc2VyaWFsaXplZCBhcyBhbiBpbnN0YW5jZSBvZiBhIGdpdmVuIHR5cGUuCisgICAgICogQHRocm93cyBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uIHdoZW4gcHJvdmlkZWQgdHlwZSBjYW4ndCBiZSByZWFkLiBUaGUgdGhyb3duIGV4Y2VwdGlvbiB3cmFwcyB0aGUgb3JpZ2luYWwgY2F1c2UuCisgICAgICogQHNpbmNlIDIuMworICAgICAqLworICAgIHB1YmxpYyA8VD4gVCByZWFkRGF0YShDbGFzczxUPiB0eXBlKSB7CisgICAgICAgIHJldHVybiByZWFkRGF0YShuZXcgR2VuZXJpY1R5cGU8VD4odHlwZSksIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgZXZlbnQgZGF0YSBhcyBhIGdpdmVuIGdlbmVyaWMgdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlIGdlbmVyaWMgdHlwZSB0byBiZSB1c2VkIGZvciBldmVudCBkYXRhIGRlLXNlcmlhbGl6YXRpb24uCisgICAgICogQHJldHVybiBldmVudCBkYXRhIGRlLXNlcmlhbGl6ZWQgYXMgYW4gaW5zdGFuY2Ugb2YgYSBnaXZlbiB0eXBlLgorICAgICAqIEB0aHJvd3MgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbiB3aGVuIHByb3ZpZGVkIHR5cGUgY2FuJ3QgYmUgcmVhZC4gVGhlIHRocm93biBleGNlcHRpb24gd3JhcHMgdGhlIG9yaWdpbmFsIGNhdXNlLgorICAgICAqIEBzaW5jZSAyLjMKKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgICBwdWJsaWMgPFQ+IFQgcmVhZERhdGEoR2VuZXJpY1R5cGU8VD4gdHlwZSkgeworICAgICAgICByZXR1cm4gcmVhZERhdGEodHlwZSwgbnVsbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBldmVudCBkYXRhIGFzIGEgZ2l2ZW4gSmF2YSB0eXBlLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2VUeXBlIEphdmEgdHlwZSB0byBiZSB1c2VkIGZvciBldmVudCBkYXRhIGRlLXNlcmlhbGl6YXRpb24uCisgICAgICogQHBhcmFtIG1lZGlhVHlwZSAgIHtAbGluayBNZWRpYVR5cGUgbWVkaWEgdHlwZX0gdG8gYmUgdXNlZCBmb3IgZXZlbnQgZGF0YSBkZS1zZXJpYWxpemF0aW9uLgorICAgICAqIEByZXR1cm4gZXZlbnQgZGF0YSBkZS1zZXJpYWxpemVkIGFzIGFuIGluc3RhbmNlIG9mIGEgZ2l2ZW4gdHlwZS4KKyAgICAgKiBAdGhyb3dzIGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb24gd2hlbiBwcm92aWRlZCB0eXBlIGNhbid0IGJlIHJlYWQuIFRoZSB0aHJvd24gZXhjZXB0aW9uIHdyYXBzIHRoZSBvcmlnaW5hbCBjYXVzZS4KKyAgICAgKiBAc2luY2UgMi4zCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCisgICAgcHVibGljIDxUPiBUIHJlYWREYXRhKENsYXNzPFQ+IG1lc3NhZ2VUeXBlLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiByZWFkRGF0YShuZXcgR2VuZXJpY1R5cGU8VD4obWVzc2FnZVR5cGUpLCBtZWRpYVR5cGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlYWQgZXZlbnQgZGF0YSBhcyBhIGdpdmVuIGdlbmVyaWMgdHlwZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0eXBlICAgICAgZ2VuZXJpYyB0eXBlIHRvIGJlIHVzZWQgZm9yIGV2ZW50IGRhdGEgZGUtc2VyaWFsaXphdGlvbi4KKyAgICAgKiBAcGFyYW0gbWVkaWFUeXBlIHtAbGluayBNZWRpYVR5cGUgbWVkaWEgdHlwZX0gdG8gYmUgdXNlZCBmb3IgZXZlbnQgZGF0YSBkZS1zZXJpYWxpemF0aW9uLgorICAgICAqIEByZXR1cm4gZXZlbnQgZGF0YSBkZS1zZXJpYWxpemVkIGFzIGFuIGluc3RhbmNlIG9mIGEgZ2l2ZW4gdHlwZS4KKyAgICAgKiBAdGhyb3dzIGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb24gd2hlbiBwcm92aWRlZCB0eXBlIGNhbid0IGJlIHJlYWQuIFRoZSB0aHJvd24gZXhjZXB0aW9uIHdyYXBzIHRoZSBvcmlnaW5hbCBjYXVzZS4KKyAgICAgKiBAc2luY2UgMi4zCisgICAgICovCisgICAgcHVibGljIDxUPiBUIHJlYWREYXRhKEdlbmVyaWNUeXBlPFQ+IHR5cGUsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgZmluYWwgTWVkaWFUeXBlIGVmZmVjdGl2ZU1lZGlhVHlwZSA9IG1lZGlhVHlwZSA9PSBudWxsID8gdGhpcy5tZWRpYVR5cGUgOiBtZWRpYVR5cGU7CisgICAgICAgIGZpbmFsIE1lc3NhZ2VCb2R5UmVhZGVyIHJlYWRlciA9CisgICAgICAgICAgICAgICAgbWVzc2FnZUJvZHlXb3JrZXJzLmdldE1lc3NhZ2VCb2R5UmVhZGVyKHR5cGUuZ2V0UmF3VHlwZSgpLCB0eXBlLmdldFR5cGUoKSwgYW5ub3RhdGlvbnMsIG1lZGlhVHlwZSk7CisgICAgICAgIGlmIChyZWFkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE1lc3NhZ2VCb2R5UHJvdmlkZXJOb3RGb3VuZEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5FVkVOVF9EQVRBX1JFQURFUl9OT1RfRk9VTkQoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlYWRBbmRDYXN0KHR5cGUsIGVmZmVjdGl2ZU1lZGlhVHlwZSwgcmVhZGVyKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwcml2YXRlIDxUPiBUIHJlYWRBbmRDYXN0KEdlbmVyaWNUeXBlPFQ+IHR5cGUsIE1lZGlhVHlwZSBlZmZlY3RpdmVNZWRpYVR5cGUsIE1lc3NhZ2VCb2R5UmVhZGVyIHJlYWRlcikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIChUKSByZWFkZXIucmVhZEZyb20oCisgICAgICAgICAgICAgICAgICAgIHR5cGUuZ2V0UmF3VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICB0eXBlLmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgIGVmZmVjdGl2ZU1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgaGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgcmF3IGV2ZW50IGRhdGEgYnl0ZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHJhdyBldmVudCBkYXRhIGJ5dGVzLiBUaGUgcmV0dXJuZWQgYnl0ZSBhcnJheSBtYXkgYmUgZW1wdHkgaWYgdGhlIGV2ZW50IGRvZXMgbm90CisgICAgICogY29udGFpbiBhbnkgZGF0YS4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKKyAgICBwdWJsaWMgYnl0ZVtdIGdldFJhd0RhdGEoKSB7CisgICAgICAgIGlmIChpc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBkYXRhOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIEFycmF5cy5jb3B5T2YoZGF0YSwgZGF0YS5sZW5ndGgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZyBzOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzID0gcmVhZERhdGEoKTsKKyAgICAgICAgfSBjYXRjaCAoUHJvY2Vzc2luZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBzID0gIjxFcnJvciByZWFkaW5nIGRhdGEgaW50byBhIHN0cmluZz4iOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICJJbmJvdW5kRXZlbnR7IgorICAgICAgICAgICAgICAgICsgIm5hbWU9JyIgKyBuYW1lICsgJ1wnJworICAgICAgICAgICAgICAgICsgIiwgaWQ9JyIgKyBpZCArICdcJycKKyAgICAgICAgICAgICAgICArICIsIGNvbW1lbnQ9IiArIChjb21tZW50ID09IG51bGwgPyAiW25vIGNvbW1lbnRzXSIgOiAnXCcnICsgY29tbWVudCArICdcJycpCisgICAgICAgICAgICAgICAgKyAiLCBkYXRhPSIgKyBzCisgICAgICAgICAgICAgICAgKyAnfSc7CisgICAgfQorCisgICAgLyoqCisgICAgICogU3RyaW5nIGxhc3QgbGluZSBicmVhayBmcm9tIGRhdGEuIChMYXN0IGxpbmUtYnJlYWsgc2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkIGFzIHBhcnQgb2YgcmVjZWl2ZWQgZGF0YSkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGF0YSBkYXRhCisgICAgICogQHJldHVybiB1cGRhdGVkIGJ5dGUgYXJyYXkuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIHN0cmlwTGFzdExpbmVCcmVhayhmaW5hbCBieXRlW10gZGF0YSkgeworCisgICAgICAgIGlmIChkYXRhLmxlbmd0aCA+IDAgJiYgZGF0YVtkYXRhLmxlbmd0aCAtIDFdID09ICdcbicpIHsKKyAgICAgICAgICAgIHJldHVybiBBcnJheXMuY29weU9mKGRhdGEsIGRhdGEubGVuZ3RoIC0gMSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZGF0YTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9zc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9zc2UvSW5ib3VuZEV2ZW50UmVhZGVyLmphdmEgYi9tZWRpYS9zc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9zc2UvSW5ib3VuZEV2ZW50UmVhZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFiMmNlYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3NzZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL3NzZS9JbmJvdW5kRXZlbnRSZWFkZXIuamF2YQpAQCAtMCwwICsxLDIxNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5zc2U7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN0cmFpbmVkVG87CitpbXBvcnQgamF2YXgud3MucnMuUnVudGltZVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuTWVzc2FnZUJvZHlXb3JrZXJzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuTWVzc2FnZVV0aWxzOworCisvKioKKyAqIENsaWVudC1zaWRlIHNpbmdsZSBpbmJvdW5kIFNlcnZlci1TZW50IEV2ZW50IHJlYWRlci4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitAQ29uc3RyYWluZWRUbyhSdW50aW1lVHlwZS5DTElFTlQpCitjbGFzcyBJbmJvdW5kRXZlbnRSZWFkZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVJlYWRlcjxJbmJvdW5kRXZlbnQ+IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEluYm91bmRFdmVudFJlYWRlci5jbGFzcy5nZXROYW1lKCkpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBFT0xfREFUQSA9IG5ldyBieXRlW10geydcbid9OworCisgICAgQEluamVjdAorICAgIHByaXZhdGUgUHJvdmlkZXI8TWVzc2FnZUJvZHlXb3JrZXJzPiBtZXNzYWdlQm9keVdvcmtlcnM7CisKKyAgICBwcml2YXRlIGVudW0gU3RhdGUgeworICAgICAgICBTS0lQUElOR19QUkVQRU5ERURfRU1QVFlfRVZFTlRTLAorICAgICAgICBORVdfTElORSwKKyAgICAgICAgQ09NTUVOVCwKKyAgICAgICAgRklFTEQsCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZShmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiBJbmJvdW5kRXZlbnQuY2xhc3MuZXF1YWxzKHR5cGUpICYmIFNzZUZlYXR1cmUuU0VSVkVSX1NFTlRfRVZFTlRTX1RZUEUuaXNDb21wYXRpYmxlKG1lZGlhVHlwZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEluYm91bmRFdmVudCByZWFkRnJvbShmaW5hbCBDbGFzczxJbmJvdW5kRXZlbnQ+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNTRSBFdmVudCBwYXJzaW5nIGJhc2VkIG9uOgorICAgICAgICAgKgorICAgICAgICAgKiBodHRwOi8vZGV2LnczLm9yZy9odG1sNS9ldmVudHNvdXJjZS8KKyAgICAgICAgICogbGFzdCBlZGl0b3JzIGRyYWZ0IGZyb20gMTMgTWFyY2ggMjAxMgorICAgICAgICAgKi8KKyAgICAgICAgZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHRva2VuRGF0YSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGNoYXJzZXROYW1lID0gTWVzc2FnZVV0aWxzLmdldENoYXJzZXQobWVkaWFUeXBlKS5uYW1lKCk7CisgICAgICAgIGZpbmFsIEluYm91bmRFdmVudC5CdWlsZGVyIGV2ZW50QnVpbGRlciA9CisgICAgICAgICAgICAgICAgbmV3IEluYm91bmRFdmVudC5CdWlsZGVyKG1lc3NhZ2VCb2R5V29ya2Vycy5nZXQoKSwgYW5ub3RhdGlvbnMsIG1lZGlhVHlwZSwgaGVhZGVycyk7CisKKyAgICAgICAgaW50IGIgPSAtMTsKKyAgICAgICAgU3RhdGUgY3VycmVudFN0YXRlID0gU3RhdGUuU0tJUFBJTkdfUFJFUEVOREVEX0VNUFRZX0VWRU5UUzsKKyAgICAgICAgbG9vcDoKKyAgICAgICAgZG8geworICAgICAgICAgICAgc3dpdGNoIChjdXJyZW50U3RhdGUpIHsKKyAgICAgICAgICAgICAgICAvKiBUaGVyZSBpcyBhIHByb2JsZW0gd2l0aCB0aGUgU1NFIGV2ZW50IHBhcnNpbmcsIGJlY2F1c2UgSmVyc2V5IHVzZXMgQ2h1bmtlZElucHV0IHRvIHNlcGFyYXRlIGV2ZW50cy4KKyAgICAgICAgICAgICAgICAgICBUaGUgcHJvYmxlbSBpcyB0aGF0IENodW5rZWRJbnB1dCB1c2VzIGZpeGVkIGNoYXJhY3RlciBzdHJpbmcgYXMgYSBzZXBhcmF0b3IsIHdoaWNoIGlzIFxyXG5cclxuIHdoZW4gaXQKKyAgICAgICAgICAgICAgICAgICBwYXJzZXMgU1NFLgorICAgICAgICAgICAgICAgICAgIFRoZSBwcm9ibGVtIGlzIHRoYXQgU1NFIGV2ZW50cyBhcmUgc2VwYXJhdGVkIG9ubHkgYnkgXHJcbiBhbmQgXHJcbiBhbHNvIHdvcmtzIGFzIGFuIGVuZCBvZiBhIGZpZWxkIGluc2lkZQorICAgICAgICAgICAgICAgICAgIHRoZSBldmVudCwgc28gdGhlIGZpeGVkIHNlcGFyYXRvciBcclxuXHJcbiAgb25seSB3b3JrcyBpZiB0aGUgc2VydmVyIGRvZXMgbm90IHNlbmQgZW1wdHkgZXZlbnRzLgorICAgICAgICAgICAgICAgICAgIEZvciBleGFtcGxlOgorCisgICAgICAgICAgICAgICAgICAgIGV2ZW50OiBlMVxyXG4KKyAgICAgICAgICAgICAgICAgICAgZGF0YTogZDFcclxuCisgICAgICAgICAgICAgICAgICAgIFxyXG4KKyAgICAgICAgICAgICAgICAgICAgXHJcbgorICAgICAgICAgICAgICAgICAgICBldmVudDogZTJcclxuCisgICAgICAgICAgICAgICAgICAgIGRhdGE6IGQyXHJcbgorICAgICAgICAgICAgICAgICAgICBcclxuCisKKyAgICAgICAgICAgICAgICAgICAgaXMgYSBzdHJlYW0gb2YgPGUxPiA8ZW1wdHkgZXZlbnQ+IDxlMj4KKyAgICAgICAgICAgICAgICAgICAgVW5mb3J0dW5hdGVseSB0aGUgQ2h1bmtlZElucHV0IHBhcnNlciB3aWxsIHBhcnNlIGl0IG9ubHkgaW50byAyIGV2ZW50cyA8ZTE+IGFuZCA8ZTI+IGFuZCA8ZTI+IHdpbGwgaGF2ZQorICAgICAgICAgICAgICAgICAgICBcclxuIChhbiBlbXB0eSBldmVudCkgcHJlcGVuZGVkIGF0IHRoZSBiZWdpbm5pbmcuIFRoaXMgaXMgbm90IGZpeGFibGUgb24gdGhlIENodW5rZWRJbnB1dCBwYXJzZXIgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgIHdoaWNoIGlzIG5vdCBTU0UgYXdhcmUsIHNvIHRoaXMgSW5ib3VuZEV2ZW50UmVhZGVyIG11c3QgYmUgYXdhcmUgb2YgdGhpcyBhbmQgc2tpcCBhbnkgcHJlcGVuZGVkIGVtcHR5IGV2ZW50cy4KKyAgICAgICAgICAgICAgICAgICAgQWxzbyBhcyBhIHJlc3VsdCBKZXJzZXkgd2lsbCBub3QgZGVsaXZlciBlbXB0eSBldmVudHMgdG8gdGhlIHVzZXIuICovCisgICAgICAgICAgICAgICAgY2FzZSBTS0lQUElOR19QUkVQRU5ERURfRU1QVFlfRVZFTlRTOgorICAgICAgICAgICAgICAgIGNhc2UgTkVXX0xJTkU6CisgICAgICAgICAgICAgICAgICAgIGlmIChiID09ICdccicpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlYWQgbmV4dCBieXRlIGluIGNhc2Ugb2YgQ1JMRiBkZWxpbWl0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIGIgPSBlbnRpdHlTdHJlYW0ucmVhZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGIgPT0gJ1xuJyA/IGVudGl0eVN0cmVhbS5yZWFkKCkgOiBiOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGVudGl0eVN0cmVhbS5yZWFkKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoYiA9PSAnXG4nIHx8IGIgPT0gJ1xyJyB8fCBiID09IC0xKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFN0YXRlID09IFN0YXRlLlNLSVBQSU5HX1BSRVBFTkRFRF9FTVBUWV9FVkVOVFMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgbG9vcDsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChiID09ICc6JykgeworICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0YXRlID0gU3RhdGUuQ09NTUVOVDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuRGF0YS53cml0ZShiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGF0ZSA9IFN0YXRlLkZJRUxEOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ09NTUVOVDoKKyAgICAgICAgICAgICAgICAgICAgLy8gc2tpcHBpbmcgY29tbWVudCBkYXRhCisgICAgICAgICAgICAgICAgICAgIGIgPSByZWFkTGluZVVudGlsKGVudGl0eVN0cmVhbSwgJ1xuJywgdG9rZW5EYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNvbW1lbnRMaW5lID0gdG9rZW5EYXRhLnRvU3RyaW5nKGNoYXJzZXROYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgdG9rZW5EYXRhLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgICAgIGV2ZW50QnVpbGRlci5jb21tZW50TGluZShjb21tZW50TGluZS50cmltKCkpOworICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RhdGUgPSBTdGF0ZS5ORVdfTElORTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBGSUVMRDoKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVhZCBmaWVsZCBuYW1lCisgICAgICAgICAgICAgICAgICAgIGIgPSByZWFkTGluZVVudGlsKGVudGl0eVN0cmVhbSwgJzonLCB0b2tlbkRhdGEpOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZmllbGROYW1lID0gdG9rZW5EYXRhLnRvU3RyaW5nKGNoYXJzZXROYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgdG9rZW5EYXRhLnJlc2V0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGIgPT0gJzonKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IGVudGl0eVN0cmVhbS5yZWFkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlIChiID09ICcgJyk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiICE9ICdcbicgJiYgYiAhPSAnXHInICYmIGIgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2tlbkRhdGEud3JpdGUoYik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYiA9IHJlYWRMaW5lVW50aWwoZW50aXR5U3RyZWFtLCAnXG4nLCB0b2tlbkRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0ZpZWxkKGV2ZW50QnVpbGRlciwgZmllbGROYW1lLCBtZWRpYVR5cGUsIHRva2VuRGF0YS50b0J5dGVBcnJheSgpKTsKKyAgICAgICAgICAgICAgICAgICAgdG9rZW5EYXRhLnJlc2V0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0YXRlID0gU3RhdGUuTkVXX0xJTkU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IHdoaWxlIChiICE9IC0xKTsKKworICAgICAgICByZXR1cm4gZXZlbnRCdWlsZGVyLmJ1aWxkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZCBpbnB1dCBzdHJlYW0gdW50aWwgYSBkZWxpbWl0ZXIgb3Ige0Bjb2RlIEVPTCAoJ1xuJyl9IG9yIHtAY29kZSBFT0Z9IGlzIHJlYWNoZWQKKyAgICAgKiBhbmQgd3JpdGUgdGhlIHJlYWQgZGF0YSB0byB0aGUgc3VwcGxpZWQgb3V0cHV0IHN0cmVhbSBpZiBub3Qge0Bjb2RlIG51bGx9LCBvciBkaXNjYXJkCisgICAgICogdGhlIGRhdGEgaWYgdGhlIG91dHB1dCBzdHJlYW0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqCisgICAgICogQHBhcmFtIGluICAgICAgICBpbnB1dCBzdHJlYW0gdG8gYmUgcmVhZC4KKyAgICAgKiBAcGFyYW0gZGVsaW1pdGVyIGRlbGltaXRlciB0byBicmVhayB0aGUgcmVhZCAoYXBhcnQgZnJvbSB7QGNvZGUgRU9MICgnXG4nLCAnXHInKX0gb3Ige0Bjb2RlIEVPRn0pLgorICAgICAqIEBwYXJhbSBvdXQgICAgICAgb3V0cHV0IHN0cmVhbSB0byB3cml0ZSB0aGUgcmVhZCBkYXRhIHRvLiBNYXkgYmUge0Bjb2RlIG51bGx9LCBpbiB3aGljaCBjYXNlIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgcmVhZCBkYXRhIGFyZSBzaWxlbnRseSBkaXNjYXJkZWQuCisgICAgICogQHJldHVybiB2YWx1ZSBvZiB0aGUgbGFzdCBieXRlIHJlYWQuCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpbiBjYXNlIHRoZSByZWFkaW5nIG9yIHdyaXRpbmcgb2YgdGhlIGRhdGEgZmFpbGVkLgorICAgICAqLworICAgIHByaXZhdGUgaW50IHJlYWRMaW5lVW50aWwoZmluYWwgSW5wdXRTdHJlYW0gaW4sIGZpbmFsIGludCBkZWxpbWl0ZXIsIGZpbmFsIE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGludCBiOworICAgICAgICB3aGlsZSAoKGIgPSBpbi5yZWFkKCkpICE9IC0xKSB7CisgICAgICAgICAgICBpZiAoYiA9PSBkZWxpbWl0ZXIgfHwgYiA9PSAnXG4nIHx8IGIgPT0gJ1xyJykgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIGlmIChvdXQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG91dC53cml0ZShiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBiOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzRmllbGQoZmluYWwgSW5ib3VuZEV2ZW50LkJ1aWxkZXIgaW5ib3VuZEV2ZW50QnVpbGRlciwgZmluYWwgU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLCBmaW5hbCBieXRlW10gdmFsdWUpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlU3RyaW5nID0gbmV3IFN0cmluZyh2YWx1ZSwgTWVzc2FnZVV0aWxzLmdldENoYXJzZXQobWVkaWFUeXBlKSk7CisgICAgICAgIGlmICgiZXZlbnQiLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgaW5ib3VuZEV2ZW50QnVpbGRlci5uYW1lKHZhbHVlU3RyaW5nKTsKKyAgICAgICAgfSBlbHNlIGlmICgiZGF0YSIuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICBpbmJvdW5kRXZlbnRCdWlsZGVyLndyaXRlKHZhbHVlKTsKKyAgICAgICAgICAgIGluYm91bmRFdmVudEJ1aWxkZXIud3JpdGUoRU9MX0RBVEEpOworICAgICAgICB9IGVsc2UgaWYgKCJpZCIuZXF1YWxzKG5hbWUpKSB7CisgICAgICAgICAgICBpbmJvdW5kRXZlbnRCdWlsZGVyLmlkKHZhbHVlU3RyaW5nKTsKKyAgICAgICAgfSBlbHNlIGlmICgicmV0cnkiLmVxdWFscyhuYW1lKSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpbmJvdW5kRXZlbnRCdWlsZGVyLnJlY29ubmVjdERlbGF5KExvbmcucGFyc2VMb25nKHZhbHVlU3RyaW5nKSk7CisgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBOdW1iZXJGb3JtYXRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLkZJTkUsIExvY2FsaXphdGlvbk1lc3NhZ2VzLklOX0VWRU5UX1JFVFJZX1BBUlNFX0VSUk9SKHZhbHVlU3RyaW5nKSwgZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HR0VSLmZpbmUoTG9jYWxpemF0aW9uTWVzc2FnZXMuSU5fRVZFTlRfRklFTERfTk9UX1JFQ09HTklaRUQobmFtZSwgdmFsdWVTdHJpbmcpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL3NzZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL3NzZS9PdXRib3VuZEV2ZW50LmphdmEgYi9tZWRpYS9zc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9zc2UvT3V0Ym91bmRFdmVudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMzdlZTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9zc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9zc2UvT3V0Ym91bmRFdmVudC5qYXZhCkBAIC0wLDAgKzEsMzk1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZTsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkdlbmVyaWNFbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5zc2UuT3V0Ym91bmRTc2VFdmVudDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUmVmbGVjdGlvbkhlbHBlcjsKKworLyoqCisgKiBSZXByZXNlbnRhdGlvbiBvZiBhIHNpbmdsZSBvdXRib3VuZCBTU0UgZXZlbnQuCisgKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBPdXRib3VuZEV2ZW50IGltcGxlbWVudHMgT3V0Ym91bmRTc2VFdmVudCB7CisKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGNvbW1lbnQ7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBHZW5lcmljVHlwZSB0eXBlOworICAgIHByaXZhdGUgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZTsKKyAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBkYXRhOworICAgIHByaXZhdGUgZmluYWwgbG9uZyByZWNvbm5lY3REZWxheTsKKworICAgIC8qKgorICAgICAqIFVzZWQgZm9yIGNyZWF0aW5nIHtAbGluayBPdXRib3VuZEV2ZW50fSBpbnN0YW5jZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyIGltcGxlbWVudHMgT3V0Ym91bmRTc2VFdmVudC5CdWlsZGVyIHsKKworICAgICAgICBwcml2YXRlIFN0cmluZyBuYW1lOworICAgICAgICBwcml2YXRlIFN0cmluZyBjb21tZW50OworICAgICAgICBwcml2YXRlIFN0cmluZyBpZDsKKyAgICAgICAgcHJpdmF0ZSBsb25nIHJlY29ubmVjdERlbGF5ID0gU3NlRmVhdHVyZS5SRUNPTk5FQ1RfTk9UX1NFVDsKKyAgICAgICAgcHJpdmF0ZSBHZW5lcmljVHlwZSB0eXBlOworICAgICAgICBwcml2YXRlIE9iamVjdCBkYXRhOworICAgICAgICBwcml2YXRlIE1lZGlhVHlwZSBtZWRpYVR5cGUgPSBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgZXZlbnQgbmFtZS4KKyAgICAgICAgICoKKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFdpbGwgYmUgc2VuZCBhcyBhIHZhbHVlIG9mIHRoZSBTU0Uge0Bjb2RlICJldmVudCJ9IGZpZWxkLiBUaGlzIGZpZWxkIGlzIG9wdGlvbmFsLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBuYW1lIGV2ZW50IG5hbWUuCisgICAgICAgICAqIEByZXR1cm4gdXBkYXRlZCBidWlsZGVyIGluc3RhbmNlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgbmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCBldmVudCBpZC4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFdpbGwgYmUgc2VuZCBhcyBhIHZhbHVlIG9mIHRoZSBTU0Uge0Bjb2RlICJpZCJ9IGZpZWxkLiBUaGlzIGZpZWxkIGlzIG9wdGlvbmFsLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBpZCBldmVudCBpZC4KKyAgICAgICAgICogQHJldHVybiB1cGRhdGVkIGJ1aWxkZXIgaW5zdGFuY2UuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBpZChTdHJpbmcgaWQpIHsKKyAgICAgICAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCByZWNvbm5lY3Rpb24gZGVsYXkgKGluIG1pbGxpc2Vjb25kcykgdGhhdCBpbmRpY2F0ZXMgaG93IGxvbmcgdGhlIGV2ZW50IHJlY2VpdmVyIHNob3VsZCB3YWl0CisgICAgICAgICAqIGJlZm9yZSBhdHRlbXB0aW5nIHRvIHJlY29ubmVjdCBpbiBjYXNlIGEgY29ubmVjdGlvbiB0byBTU0UgZXZlbnQgc291cmNlIGlzIGxvc3QuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBXaWxsIGJlIHNlbmQgYXMgYSB2YWx1ZSBvZiB0aGUgU1NFIHtAY29kZSAicmV0cnkifSBmaWVsZC4gVGhpcyBmaWVsZCBpcyBvcHRpb25hbC4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogQWJzZW5jZSBvZiBhIHZhbHVlIG9mIHRoaXMgZmllbGQgaW4gYW4ge0BsaW5rIE91dGJvdW5kRXZlbnR9IGluc3RhbmNlCisgICAgICAgICAqIGlzIGluZGljYXRlZCBieSB7QGxpbmsgU3NlRmVhdHVyZSNSRUNPTk5FQ1RfTk9UX1NFVH0gdmFsdWUgcmV0dXJuZWQgZnJvbQorICAgICAgICAgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLk91dGJvdW5kRXZlbnQjZ2V0UmVjb25uZWN0RGVsYXkoKX0uCisgICAgICAgICAqIDwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG1pbGxpc2Vjb25kcyByZWNvbm5lY3Rpb24gZGVsYXkgaW4gbWlsbGlzZWNvbmRzLiBOZWdhdGl2ZSB2YWx1ZXMgdW4tc2V0IHRoZSByZWNvbm5lY3Rpb24gZGVsYXkuCisgICAgICAgICAqIEByZXR1cm4gdXBkYXRlZCBidWlsZGVyIGluc3RhbmNlLgorICAgICAgICAgKiBAc2luY2UgMi4zCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciByZWNvbm5lY3REZWxheShsb25nIG1pbGxpc2Vjb25kcykgeworICAgICAgICAgICAgaWYgKG1pbGxpc2Vjb25kcyA8IDApIHsKKyAgICAgICAgICAgICAgICBtaWxsaXNlY29uZHMgPSBTc2VGZWF0dXJlLlJFQ09OTkVDVF9OT1RfU0VUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcy5yZWNvbm5lY3REZWxheSA9IG1pbGxpc2Vjb25kczsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUge0BsaW5rIE1lZGlhVHlwZSBtZWRpYSB0eXBlfSBvZiB0aGUgZXZlbnQgZGF0YS4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoaXMgaW5mb3JtYXRpb24gaXMgbWFuZGF0b3J5LiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB7QGxpbmsgTWVkaWFUeXBlI1RFWFRfUExBSU59LgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBtZWRpYVR5cGUge0BsaW5rIE1lZGlhVHlwZX0gb2YgZXZlbnQgZGF0YS4gTXVzdCBub3QgYmUge0Bjb2RlIG51bGx9LgorICAgICAgICAgKiBAcmV0dXJuIHVwZGF0ZWQgYnVpbGRlciBpbnN0YW5jZS4KKyAgICAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBjYXNlIHRoZSB7QGNvZGUgbWVkaWFUeXBlfSBwYXJhbWV0ZXIgaXMge0Bjb2RlIG51bGx9LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgbWVkaWFUeXBlKGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIGlmIChtZWRpYVR5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5PVVRfRVZFTlRfTUVESUFfVFlQRV9OVUxMKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcy5tZWRpYVR5cGUgPSBtZWRpYVR5cGU7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgY29tbWVudCBzdHJpbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudC4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhlIGNvbW1lbnQgd2lsbCBiZSBzZXJpYWxpemVkIHdpdGggdGhlIGV2ZW50LCBiZWZvcmUgZXZlbnQgZGF0YSBhcmUgc2VyaWFsaXplZC4gSWYgdGhlIGV2ZW50CisgICAgICAgICAqIGRvZXMgbm90IGNvbnRhaW4gYW55IGRhdGEsIGEgc2VwYXJhdGUgImV2ZW50IiB0aGF0IGNvbnRhaW5zIG9ubHkgdGhlIGNvbW1lbnQgd2lsbCBiZSBzZW50LgorICAgICAgICAgKiBUaGlzIGluZm9ybWF0aW9uIGlzIG9wdGlvbmFsLCBwcm92aWRlZCB0aGUgZXZlbnQgZGF0YSBhcmUgc2V0LgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogTm90ZSB0aGF0IG11bHRpcGxlIGludm9jYXRpb25zIG9mIHRoaXMgbWV0aG9kIHJlc3VsdCBpbiBhIHByZXZpb3VzIGNvbW1lbnQgYmVpbmcgcmVwbGFjZWQgd2l0aCBhIG5ldyBvbmUuCisgICAgICAgICAqIFRvIGFjaGlldmUgbXVsdGktbGluZSBjb21tZW50cywgYSBtdWx0aS1saW5lIGNvbW1lbnQgc3RyaW5nIGhhcyB0byBiZSB1c2VkLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb21tZW50IGNvbW1lbnQgc3RyaW5nLgorICAgICAgICAgKiBAcmV0dXJuIHVwZGF0ZWQgYnVpbGRlciBpbnN0YW5jZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGNvbW1lbnQoU3RyaW5nIGNvbW1lbnQpIHsKKyAgICAgICAgICAgIHRoaXMuY29tbWVudCA9IGNvbW1lbnQ7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgZXZlbnQgZGF0YSBhbmQgamF2YSB0eXBlIG9mIGV2ZW50IGRhdGEuCisgICAgICAgICAqCisgICAgICAgICAqIFR5cGUgaW5mb3JtYXRpb24gIHdpbGwgYmUgdXNlZCBmb3Ige0BsaW5rIGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcn0gbG9va3VwLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogTm90ZSB0aGF0IG11bHRpcGxlIGludm9jYXRpb25zIG9mIHRoaXMgbWV0aG9kIHJlc3VsdCBpbiBwcmV2aW91cyBldmVuIGRhdGEgYmVpbmcgcmVwbGFjZWQgd2l0aCBuZXcgb25lLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB0eXBlIGphdmEgdHlwZSBvZiBzdXBwbGllZCBkYXRhLiBNdXN0IG5vdCBiZSB7QGNvZGUgbnVsbH0uCisgICAgICAgICAqIEBwYXJhbSBkYXRhIGV2ZW50IGRhdGEuIE11c3Qgbm90IGJlIHtAY29kZSBudWxsfS4KKyAgICAgICAgICogQHJldHVybiB1cGRhdGVkIGJ1aWxkZXIgaW5zdGFuY2UuCisgICAgICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gY2FzZSBlaXRoZXIge0Bjb2RlIHR5cGV9IG9yIHtAY29kZSBkYXRhfSBwYXJhbWV0ZXIgaXMge0Bjb2RlIG51bGx9LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgZGF0YShDbGFzcyB0eXBlLCBPYmplY3QgZGF0YSkgeworICAgICAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5PVVRfRVZFTlRfREFUQV9OVUxMKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHR5cGUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5PVVRfRVZFTlRfREFUQV9UWVBFX05VTEwoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMudHlwZSA9IG5ldyBHZW5lcmljVHlwZSh0eXBlKTsKKyAgICAgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgZXZlbnQgZGF0YSBhbmQgYSBnZW5lcmljIGphdmEgdHlwZSBvZiBldmVudCBkYXRhLgorICAgICAgICAgKgorICAgICAgICAgKiBUeXBlIGluZm9ybWF0aW9uIHdpbGwgYmUgdXNlZCBmb3Ige0BsaW5rIGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcn0gbG9va3VwLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogTm90ZSB0aGF0IG11bHRpcGxlIGludm9jYXRpb25zIG9mIHRoaXMgbWV0aG9kIHJlc3VsdCBpbiBwcmV2aW91cyBldmVuIGRhdGEgYmVpbmcgcmVwbGFjZWQgd2l0aCBuZXcgb25lLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB0eXBlIGdlbmVyaWMgdHlwZSBvZiBzdXBwbGllZCBkYXRhLiBNdXN0IG5vdCBiZSB7QGNvZGUgbnVsbH0uCisgICAgICAgICAqIEBwYXJhbSBkYXRhIGV2ZW50IGRhdGEuIE11c3Qgbm90IGJlIHtAY29kZSBudWxsfS4KKyAgICAgICAgICogQHJldHVybiB1cGRhdGVkIGJ1aWxkZXIgaW5zdGFuY2UuCisgICAgICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gY2FzZSBlaXRoZXIge0Bjb2RlIHR5cGV9IG9yIHtAY29kZSBkYXRhfSBwYXJhbWV0ZXIgaXMge0Bjb2RlIG51bGx9LgorICAgICAgICAgKiBAc2luY2UgMi4zCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBkYXRhKEdlbmVyaWNUeXBlIHR5cGUsIE9iamVjdCBkYXRhKSB7CisgICAgICAgICAgICBpZiAoZGF0YSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLk9VVF9FVkVOVF9EQVRBX05VTEwoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodHlwZSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLk9VVF9FVkVOVF9EQVRBX1RZUEVfTlVMTCgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKKyAgICAgICAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgR2VuZXJpY0VudGl0eSkgeworICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9ICgoR2VuZXJpY0VudGl0eSkgZGF0YSkuZ2V0RW50aXR5KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgZXZlbnQgZGF0YSBhbmQgamF2YSB0eXBlIG9mIGV2ZW50IGRhdGEuCisgICAgICAgICAqCisgICAgICAgICAqIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdGhhdCBkZXJpdmVzIHRoZSBldmVudCBkYXRhIHR5cGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgcnVudGltZSB0eXBlIG9mCisgICAgICAgICAqIHRoZSBldmVudCBkYXRhLiBUaGUgc3VwcGxpZWQgZXZlbnQgZGF0YSBtYXkgYmUgcmVwcmVzZW50ZWQgYXMge0BsaW5rIGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY0VudGl0eX0uCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBOb3RlIHRoYXQgbXVsdGlwbGUgaW52b2NhdGlvbnMgb2YgdGhpcyBtZXRob2QgcmVzdWx0IGluIHByZXZpb3VzIGV2ZW4gZGF0YSBiZWluZyByZXBsYWNlZCB3aXRoIG5ldyBvbmUuCisgICAgICAgICAqIDwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGRhdGEgZXZlbnQgZGF0YS4gTXVzdCBub3QgYmUge0Bjb2RlIG51bGx9LgorICAgICAgICAgKiBAcmV0dXJuIHVwZGF0ZWQgYnVpbGRlciBpbnN0YW5jZS4KKyAgICAgICAgICogQHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBjYXNlIHRoZSB7QGNvZGUgZGF0YX0gcGFyYW1ldGVyIGlzIHtAY29kZSBudWxsfS4KKyAgICAgICAgICogQHNpbmNlIDIuMworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgZGF0YShPYmplY3QgZGF0YSkgeworICAgICAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5PVVRfRVZFTlRfREFUQV9OVUxMKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gZGF0YShSZWZsZWN0aW9uSGVscGVyLmdlbmVyaWNUeXBlRm9yKGRhdGEpLCBkYXRhKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBCdWlsZCB7QGxpbmsgT3V0Ym91bmRFdmVudH0uCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGVyZSBhcmUgdHdvIHZhbGlkIGNvbmZpZ3VyYXRpb25zOgorICAgICAgICAgKiA8dWw+CisgICAgICAgICAqIDxsaT5pZiBhIHtAbGluayBCdWlsZGVyI2NvbW1lbnQoU3RyaW5nKSBjb21tZW50fSBpcyBzZXQsIGFsbCBvdGhlciBwYXJhbWV0ZXJzIGFyZSBvcHRpb25hbC4KKyAgICAgICAgICogSWYgZXZlbnQge0BsaW5rIEJ1aWxkZXIjZGF0YShDbGFzcywgT2JqZWN0KSBkYXRhfSBhbmQge0BsaW5rIEJ1aWxkZXIjbWVkaWFUeXBlKE1lZGlhVHlwZSkgbWVkaWEgdHlwZX0gaXMgc2V0LAorICAgICAgICAgKiBldmVudCBkYXRhIHdpbGwgYmUgc2VyaWFsaXplZCBhZnRlciB0aGUgY29tbWVudC48L2xpPgorICAgICAgICAgKiA8bGk+aWYgYSB7QGxpbmsgQnVpbGRlciNjb21tZW50KFN0cmluZykgY29tbWVudH0gaXMgbm90IHNldCwgYXQgbGVhc3QgdGhlIGV2ZW50CisgICAgICAgICAqIHtAbGluayBCdWlsZGVyI2RhdGEoQ2xhc3MsIE9iamVjdCkgZGF0YX0gbXVzdCBiZSBzZXQuIEFsbCBvdGhlciBwYXJhbWV0ZXJzIGFyZSBvcHRpb25hbC48L2xpPgorICAgICAgICAgKiA8L3VsPgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gbmV3IHtAbGluayBPdXRib3VuZEV2ZW50fSBpbnN0YW5jZS4KKyAgICAgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gd2hlbiBjYWxsZWQgd2l0aCBpbnZhbGlkIGNvbmZpZ3VyYXRpb24gKG5laXRoZXIgYSBjb21tZW50IG5vciBldmVudCBkYXRhIGFyZSBzZXQpLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE91dGJvdW5kRXZlbnQgYnVpbGQoKSB7CisgICAgICAgICAgICBpZiAoY29tbWVudCA9PSBudWxsICYmIGRhdGEgPT0gbnVsbCAmJiB0eXBlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLk9VVF9FVkVOVF9OT1RfQlVJTERBQkxFKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbmV3IE91dGJvdW5kRXZlbnQobmFtZSwgaWQsIHJlY29ubmVjdERlbGF5LCB0eXBlLCBtZWRpYVR5cGUsIGRhdGEsIGNvbW1lbnQpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyBPdXRib3VuZEV2ZW50IHdpdGggZ2l2ZW4gcHJvcGVydGllcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lICAgICAgICAgICBldmVudCBuYW1lIChmaWVsZCBuYW1lICJldmVudCIpLgorICAgICAqIEBwYXJhbSBpZCAgICAgICAgICAgICBldmVudCBpZC4KKyAgICAgKiBAcGFyYW0gcmVjb25uZWN0RGVsYXkgcmVjb25uZWN0aW9uIGRlbGF5IGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKiBAcGFyYW0gdHlwZSAgICAgICAgICAgamF2YSB0eXBlIG9mIGV2ZW50cyBkYXRhLgorICAgICAqIEBwYXJhbSBtZWRpYVR5cGUgICAgICB7QGxpbmsgTWVkaWFUeXBlfSBvZiBldmVudHMgZGF0YS4KKyAgICAgKiBAcGFyYW0gZGF0YSAgICAgICAgICAgZXZlbnRzIGRhdGEuCisgICAgICogQHBhcmFtIGNvbW1lbnQgICAgICAgIGNvbW1lbnQuCisgICAgICovCisgICAgT3V0Ym91bmRFdmVudChmaW5hbCBTdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpZCwKKyAgICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgcmVjb25uZWN0RGVsYXksCisgICAgICAgICAgICAgICAgICBmaW5hbCBHZW5lcmljVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBkYXRhLAorICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNvbW1lbnQpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5jb21tZW50ID0gY29tbWVudDsKKyAgICAgICAgdGhpcy5pZCA9IGlkOworICAgICAgICB0aGlzLnJlY29ubmVjdERlbGF5ID0gcmVjb25uZWN0RGVsYXk7CisgICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CisgICAgICAgIHRoaXMubWVkaWFUeXBlID0gbWVkaWFUeXBlOworICAgICAgICB0aGlzLmRhdGEgPSBkYXRhOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBldmVudCBuYW1lLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgZmllbGQgaXMgb3B0aW9uYWwuIElmIHNwZWNpZmllZCwgd2lsbCBiZSBzZW5kIGFzIGEgdmFsdWUgb2YgdGhlIFNTRSB7QGNvZGUgImV2ZW50In0gZmllbGQuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHJldHVybiBldmVudCBuYW1lLCBvciB7QGNvZGUgbnVsbH0gaWYgbm90IHNldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBldmVudCBpZGVudGlmaWVyLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgZmllbGQgaXMgb3B0aW9uYWwuIElmIHNwZWNpZmllZCwgdGhlIHZhbHVlIGlzIHNlbmQgYXMgYSB2YWx1ZSBvZiB0aGUgU1NFIHtAY29kZSAiaWQifSBmaWVsZC4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIGV2ZW50IGlkZW50aWZpZXIsIG9yIHtAY29kZSBudWxsfSBpZiBub3Qgc2V0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiBpZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgY29ubmVjdGlvbiByZXRyeSB0aW1lIGluIG1pbGxpc2Vjb25kcyB0aGUgZXZlbnQgcmVjZWl2ZXIgc2hvdWxkIHdhaXQgYmVmb3JlIGF0dGVtcHRpbmcgdG8KKyAgICAgKiByZWNvbm5lY3QgYWZ0ZXIgYSBjb25uZWN0aW9uIHRvIHRoZSBTU0Ugc291cmNlIGlzIGxvc3QuCisgICAgICogPHA+CisgICAgICogVGhpcyBmaWVsZCBpcyBvcHRpb25hbC4gSWYgc3BlY2lmaWVkLCB0aGUgdmFsdWUgaXMgc2VuZCBhcyBhIHZhbHVlIG9mIHRoZSBTU0Uge0Bjb2RlICJyZXRyeSJ9IGZpZWxkLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gcmVjb25uZWN0aW9uIGRlbGF5IGluIG1pbGxpc2Vjb25kcyBvciB7QGxpbmsgU3NlRmVhdHVyZSNSRUNPTk5FQ1RfTk9UX1NFVH0gaWYgbm8gdmFsdWUgaGFzIGJlZW4gc2V0LgorICAgICAqIEBzaW5jZSAyLjMKKyAgICAgKi8KKyAgICBwdWJsaWMgbG9uZyBnZXRSZWNvbm5lY3REZWxheSgpIHsKKyAgICAgICAgcmV0dXJuIHJlY29ubmVjdERlbGF5OworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIGlmIHRoZSBjb25uZWN0aW9uIHJldHJ5IHRpbWUgaGFzIGJlZW4gc2V0IGluIHRoZSBldmVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHJlY29ubmVjdGlvbiBkZWxheSBpbiBtaWxsaXNlY29uZHMgaGFzIGJlZW4gc2V0IGluIHRoZSBldmVudCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICogQHNpbmNlIDIuMworICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzUmVjb25uZWN0RGVsYXlTZXQoKSB7CisgICAgICAgIHJldHVybiByZWNvbm5lY3REZWxheSA+IFNzZUZlYXR1cmUuUkVDT05ORUNUX05PVF9TRVQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGRhdGEgdHlwZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gc2VsZWN0IGEgcHJvcGVyIHtAbGluayBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXJ9IHRvIGJlIHVzZWQgZm9yCisgICAgICogc2VyaWFsaXppbmcgdGhlIHtAbGluayAjZ2V0RGF0YSgpIGV2ZW50IGRhdGF9LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gZGF0YSB0eXBlLiBNYXkgcmV0dXJuIHtAY29kZSBudWxsfSwgaWYgdGhlIGV2ZW50IGRvZXMgbm90IGNvbnRhaW4gYW55IGRhdGEuCisgICAgICovCisgICAgcHVibGljIENsYXNzPD8+IGdldFR5cGUoKSB7CisgICAgICAgIHJldHVybiB0eXBlID09IG51bGwgPyBudWxsIDogdHlwZS5nZXRSYXdUeXBlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGdlbmVyaWMgZGF0YSB0eXBlLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCB0byBzZWxlY3QgYSBwcm9wZXIge0BsaW5rIGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcn0gdG8gYmUgdXNlZCBmb3IKKyAgICAgKiBzZXJpYWxpemluZyB0aGUge0BsaW5rICNnZXREYXRhKCkgZXZlbnQgZGF0YX0uCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHJldHVybiBnZW5lcmljIGRhdGEgdHlwZS4gTWF5IHJldHVybiB7QGNvZGUgbnVsbH0sIGlmIHRoZSBldmVudCBkb2VzIG5vdCBjb250YWluIGFueSBkYXRhLgorICAgICAqIEBzaW5jZSAyLjMKKyAgICAgKi8KKyAgICBwdWJsaWMgVHlwZSBnZXRHZW5lcmljVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIHR5cGUgPT0gbnVsbCA/IG51bGwgOiB0eXBlLmdldFR5cGUoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQge0BsaW5rIE1lZGlhVHlwZSBtZWRpYSB0eXBlfSBvZiB0aGUgZXZlbnQgZGF0YS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgdG8gYSBzZWxlY3QgcHJvcGVyIHtAbGluayBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXJ9IHRvIGJlIHVzZWQgZm9yCisgICAgICogc2VyaWFsaXppbmcgdGhlIHtAbGluayAjZ2V0RGF0YSgpIGV2ZW50IGRhdGF9LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gZGF0YSB7QGxpbmsgTWVkaWFUeXBlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVkaWFUeXBlIGdldE1lZGlhVHlwZSgpIHsKKyAgICAgICAgcmV0dXJuIG1lZGlhVHlwZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBjb21tZW50IHN0cmluZyB0aGF0IGFjY29tcGFuaWVzIHRoZSBldmVudC4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiBzcGVjaWZpZWQsIHRoZSBjb21tZW50IHZhbHVlIGlzIHNlbnQgd2l0aCB0aGUgZXZlbnQgYXMgb25lIG9yIG1vcmUgU1NFIGNvbW1lbnQgbGluZXMKKyAgICAgKiAoZGVwZW5kaW5nIG9uIGxpbmUgYnJlYWtzIGluIHRoZSBhY3R1YWwgZGF0YSBzdHJpbmcpLCBiZWZvcmUgYW55IGFjdHVhbCBldmVudCBkYXRhIGFyZSBzZXJpYWxpemVkLgorICAgICAqIElmIHRoZSBldmVudCBpbnN0YW5jZSBkb2VzIG5vdCBjb250YWluIGFueSBkYXRhLCBhIHNlcGFyYXRlICJldmVudCIgdGhhdCBjb250YWlucyBvbmx5IHRoZSBjb21tZW50CisgICAgICogd2lsbCBiZSBzZW50LiBDb21tZW50IGluZm9ybWF0aW9uIGlzIG9wdGlvbmFsLCBwcm92aWRlZCB0aGUgZXZlbnQgZGF0YSBhcmUgc2V0LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gY29tbWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIGV2ZW50LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29tbWVudCgpIHsKKyAgICAgICAgcmV0dXJuIGNvbW1lbnQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGV2ZW50IGRhdGEuCisgICAgICogPHA+CisgICAgICogVGhlIGV2ZW50IGRhdGEsIGlmIHNwZWNpZmllZCwgYXJlIHNlcmlhbGl6ZWQgYW5kIHNlbnQgYXMgb25lIG9yIG1vcmUgU1NFIGV2ZW50IHtAY29kZSAiZGF0YSJ9IGZpZWxkcworICAgICAqIChkZXBlbmRpbmcgb24gdGhlIGxpbmUgYnJlYWtzIGluIHRoZSBhY3R1YWwgc2VyaWFsaXplZCBkYXRhIGNvbnRlbnQpLiBUaGUgZGF0YSBhcmUgc2VyaWFsaXplZAorICAgICAqIHVzaW5nIGFuIGF2YWlsYWJsZSB7QGxpbmsgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyfSB0aGF0IGlzIHNlbGVjdGVkIGJhc2VkIG9uIHRoZSBldmVudAorICAgICAqIHtAbGluayAjZ2V0VHlwZSgpIHR5cGV9LCB7QGxpbmsgI2dldEdlbmVyaWNUeXBlKCl9IGdlbmVyaWMgdHlwZX0gYW5kIHtAbGluayAjZ2V0TWVkaWFUeXBlKCl9IG1lZGlhIHR5cGV9LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gZXZlbnQgZGF0YS4gTWF5IHJldHVybiB7QGNvZGUgbnVsbH0sIGlmIHRoZSBldmVudCBkb2VzIG5vdCBjb250YWluIGFueSBkYXRhLgorICAgICAqLworICAgIHB1YmxpYyBPYmplY3QgZ2V0RGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIGRhdGE7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvc3NlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvc3NlL091dGJvdW5kRXZlbnRXcml0ZXIuamF2YSBiL21lZGlhL3NzZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL3NzZS9PdXRib3VuZEV2ZW50V3JpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2NhZGM0MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3NzZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL3NzZS9PdXRib3VuZEV2ZW50V3JpdGVyLmphdmEKQEAgLTAsMCArMSwxMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OworCitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuc3NlLk91dGJvdW5kU3NlRXZlbnQ7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuTWVzc2FnZUJvZHlXb3JrZXJzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuTWVzc2FnZVV0aWxzOworCisvKioKKyAqIFdyaXRlciBmb3Ige0BsaW5rIE91dGJvdW5kU3NlRXZlbnR9LgorICoKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitjbGFzcyBPdXRib3VuZEV2ZW50V3JpdGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8T3V0Ym91bmRTc2VFdmVudD4geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2hhcnNldCBVVEY4ID0gQ2hhcnNldC5mb3JOYW1lKCJVVEYtOCIpOworCisgICAgLy8gZW5jb2RpbmcgZG9lcyBub3QgbWF0dGVyIChsb3dlciBBU0NJSSBjaGFyYWN0ZXJzKQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBDT01NRU5UX0xFQUQgPSAiOiAiLmdldEJ5dGVzKFVURjgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBOQU1FX0xFQUQgPSAiZXZlbnQ6ICIuZ2V0Qnl0ZXMoVVRGOCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIElEX0xFQUQgPSAiaWQ6ICIuZ2V0Qnl0ZXMoVVRGOCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIFJFVFJZX0xFQUQgPSAicmV0cnk6ICIuZ2V0Qnl0ZXMoVVRGOCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIERBVEFfTEVBRCA9ICJkYXRhOiAiLmdldEJ5dGVzKFVURjgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXSBFT0wgPSB7J1xuJ307CisKKyAgICBASW5qZWN0CisgICAgcHJpdmF0ZSBQcm92aWRlcjxNZXNzYWdlQm9keVdvcmtlcnM+IHdvcmtlcnNQcm92aWRlcjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiBPdXRib3VuZFNzZUV2ZW50LmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSkgJiYgU3NlRmVhdHVyZS5TRVJWRVJfU0VOVF9FVkVOVFNfVFlQRS5pc0NvbXBhdGlibGUobWVkaWFUeXBlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBnZXRTaXplKGZpbmFsIE91dGJvdW5kU3NlRXZlbnQgaW5jb21pbmdFdmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIHZvaWQgd3JpdGVUbyhmaW5hbCBPdXRib3VuZFNzZUV2ZW50IG91dGJvdW5kRXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICBmaW5hbCBDaGFyc2V0IGNoYXJzZXQgPSBNZXNzYWdlVXRpbHMuZ2V0Q2hhcnNldChtZWRpYVR5cGUpOworICAgICAgICBpZiAob3V0Ym91bmRFdmVudC5nZXRDb21tZW50KCkgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgY29tbWVudCA6IG91dGJvdW5kRXZlbnQuZ2V0Q29tbWVudCgpLnNwbGl0KCJcbiIpKSB7CisgICAgICAgICAgICAgICAgZW50aXR5U3RyZWFtLndyaXRlKENPTU1FTlRfTEVBRCk7CisgICAgICAgICAgICAgICAgZW50aXR5U3RyZWFtLndyaXRlKGNvbW1lbnQuZ2V0Qnl0ZXMoY2hhcnNldCkpOworICAgICAgICAgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZShFT0wpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG91dGJvdW5kRXZlbnQuZ2V0VHlwZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGlmIChvdXRib3VuZEV2ZW50LmdldE5hbWUoKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZW50aXR5U3RyZWFtLndyaXRlKE5BTUVfTEVBRCk7CisgICAgICAgICAgICAgICAgZW50aXR5U3RyZWFtLndyaXRlKG91dGJvdW5kRXZlbnQuZ2V0TmFtZSgpLmdldEJ5dGVzKGNoYXJzZXQpKTsKKyAgICAgICAgICAgICAgICBlbnRpdHlTdHJlYW0ud3JpdGUoRU9MKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvdXRib3VuZEV2ZW50LmdldElkKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZShJRF9MRUFEKTsKKyAgICAgICAgICAgICAgICBlbnRpdHlTdHJlYW0ud3JpdGUob3V0Ym91bmRFdmVudC5nZXRJZCgpLmdldEJ5dGVzKGNoYXJzZXQpKTsKKyAgICAgICAgICAgICAgICBlbnRpdHlTdHJlYW0ud3JpdGUoRU9MKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChvdXRib3VuZEV2ZW50LmdldFJlY29ubmVjdERlbGF5KCkgPiBTc2VGZWF0dXJlLlJFQ09OTkVDVF9OT1RfU0VUKSB7CisgICAgICAgICAgICAgICAgZW50aXR5U3RyZWFtLndyaXRlKFJFVFJZX0xFQUQpOworICAgICAgICAgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZShMb25nLnRvU3RyaW5nKG91dGJvdW5kRXZlbnQuZ2V0UmVjb25uZWN0RGVsYXkoKSkuZ2V0Qnl0ZXMoY2hhcnNldCkpOworICAgICAgICAgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZShFT0wpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgZXZlbnRNZWRpYVR5cGUgPQorICAgICAgICAgICAgICAgICAgICBvdXRib3VuZEV2ZW50LmdldE1lZGlhVHlwZSgpID09IG51bGwgPyBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFIDogb3V0Ym91bmRFdmVudC5nZXRNZWRpYVR5cGUoKTsKKyAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2VCb2R5V3JpdGVyIG1lc3NhZ2VCb2R5V3JpdGVyID0gd29ya2Vyc1Byb3ZpZGVyLmdldCgpLmdldE1lc3NhZ2VCb2R5V3JpdGVyKG91dGJvdW5kRXZlbnQuZ2V0VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICBvdXRib3VuZEV2ZW50LmdldEdlbmVyaWNUeXBlKCksIGFubm90YXRpb25zLCBldmVudE1lZGlhVHlwZSk7CisgICAgICAgICAgICBtZXNzYWdlQm9keVdyaXRlci53cml0ZVRvKAorICAgICAgICAgICAgICAgICAgICBvdXRib3VuZEV2ZW50LmdldERhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgb3V0Ym91bmRFdmVudC5nZXRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgIG91dGJvdW5kRXZlbnQuZ2V0R2VuZXJpY1R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgIGV2ZW50TWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgbmV3IE91dHB1dFN0cmVhbSgpIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIHN0YXJ0ID0gdHJ1ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShmaW5hbCBpbnQgaSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5U3RyZWFtLndyaXRlKERBVEFfTEVBRCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZShpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAnXG4nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZShEQVRBX0xFQUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBlbnRpdHlTdHJlYW0ud3JpdGUoRU9MKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL3NzZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL3NzZS9Tc2VCcm9hZGNhc3Rlci5qYXZhIGIvbWVkaWEvc3NlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvc3NlL1NzZUJyb2FkY2FzdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU5NDkwZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3NzZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL3NzZS9Tc2VCcm9hZGNhc3Rlci5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkJyb2FkY2FzdGVyOworCisvKioKKyAqIFVzZWQgZm9yIGJyb2FkY2FzdGluZyBTU0UgdG8gbXVsdGlwbGUge0BsaW5rIEV2ZW50T3V0cHV0fSBpbnN0YW5jZXMuCisgKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitwdWJsaWMgY2xhc3MgU3NlQnJvYWRjYXN0ZXIgZXh0ZW5kcyBCcm9hZGNhc3RlcjxPdXRib3VuZEV2ZW50PiB7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlLgorICAgICAqIElmIHRoaXMgY29uc3RydWN0b3IgaXMgY2FsbGVkIGJ5IGEgc3ViY2xhc3MsIGl0IGFzc3VtZXMgdGhlIHRoZSByZWFzb24gZm9yIHRoZSBzdWJjbGFzcyB0byBleGlzdCBpcyB0byBpbXBsZW1lbnQKKyAgICAgKiB7QGxpbmsgI29uQ2xvc2Uob3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNodW5rZWRPdXRwdXQpfSBhbmQge0BsaW5rICNvbkV4Y2VwdGlvbihvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ2h1bmtlZE91dHB1dCwgRXhjZXB0aW9uKX0gbWV0aG9kcywgc28gaXQgYWRkcworICAgICAqIHRoZSBuZXdseSBjcmVhdGVkIGluc3RhbmNlIGFzIHRoZSBsaXN0ZW5lci4gVG8gYXZvaWQgdGhpcywgc3ViY2xhc3NlcyBtYXkgY2FsbCB7QGxpbmsgI1NzZUJyb2FkY2FzdGVyKENsYXNzKX0KKyAgICAgKiBwYXNzaW5nIHRoZWlyIGNsYXNzIGFzIGFuIGFyZ3VtZW50LgorICAgICAqLworICAgIHB1YmxpYyBTc2VCcm9hZGNhc3RlcigpIHsKKyAgICAgICAgdGhpcyhTc2VCcm9hZGNhc3Rlci5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2FuIGJlIHVzZWQgYnkgc3ViY2xhc3NlcyB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBmdW5jdGlvbmFsaXR5IG9mIGFkZGluZyBzZWxmIHRvIHRoZSBzZXQgb2YKKyAgICAgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkJyb2FkY2FzdGVyTGlzdGVuZXIgbGlzdGVuZXJzfS4KKyAgICAgKiBJZiBjcmVhdGluZyBhIGRpcmVjdCBpbnN0YW5jZSBvZiBhIHN1YmNsYXNzIHBhc3NlZCBpbiB0aGUgcGFyYW1ldGVyLAorICAgICAqIHRoZSBicm9hZGNhc3RlciB3aWxsIG5vdCByZWdpc3RlciBpdHNlbGYgYXMgYSBsaXN0ZW5lci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdWJjbGFzcyBzdWJjbGFzcyBvZiBTc2VCcm9hZGNhc3RlciB0aGF0IHNob3VsZCBub3QgYmUgcmVnaXN0ZXJlZCBhcyBhIGxpc3RlbmVyIC0gaWYgY3JlYXRpbmcgYSBkaXJlY3QgaW5zdGFuY2UKKyAgICAgKiAgICAgICAgICAgICAgICAgb2YgdGhpcyBzdWJjbGFzcywgdGhpcyBjb25zdHJ1Y3RvciB3aWxsIG5vdCByZWdpc3RlciB0aGUgbmV3IGluc3RhbmNlIGFzIGEgbGlzdGVuZXIuCisgICAgICogQHNlZSAjU3NlQnJvYWRjYXN0ZXIoKQorICAgICAqLworICAgIHByb3RlY3RlZCBTc2VCcm9hZGNhc3RlcihmaW5hbCBDbGFzczw/IGV4dGVuZHMgU3NlQnJvYWRjYXN0ZXI+IHN1YmNsYXNzKSB7CisgICAgICAgIHN1cGVyKHN1YmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9zc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9zc2UvU3NlRmVhdHVyZS5qYXZhIGIvbWVkaWEvc3NlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvc3NlL1NzZUZlYXR1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGJhZjk3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvc3NlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvc3NlL1NzZUZlYXR1cmUuamF2YQpAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5zc2U7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYWJsZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUHJvcGVydHk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLmludGVybmFsLlNzZUJpbmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5zc2UuaW50ZXJuYWwuU3NlRXZlbnRTaW5rVmFsdWVQYXJhbVByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuaW50ZXJuYWwuVmFsdWVQYXJhbVByb3ZpZGVyOworCisKKy8qKgorICogQSBKQVgtUlMge0BsaW5rIEZlYXR1cmUgZmVhdHVyZX0gdGhhdCBlbmFibGVzIFNlcnZlci1TZW50IEV2ZW50cyBzdXBwb3J0LgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBTc2VGZWF0dXJlIGltcGxlbWVudHMgRmVhdHVyZSB7CisKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgU3RyaW5nfSByZXByZXNlbnRhdGlvbiBvZiBTZXJ2ZXIgc2VudCBldmVudHMgbWVkaWEgdHlwZS4gKCJ7QHZhbHVlfSIpLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZFUl9TRU5UX0VWRU5UUyA9ICJ0ZXh0L2V2ZW50LXN0cmVhbSI7CisgICAgLyoqCisgICAgICogU2VydmVyIHNlbnQgZXZlbnRzIG1lZGlhIHR5cGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBNZWRpYVR5cGUgU0VSVkVSX1NFTlRfRVZFTlRTX1RZUEUgPSBNZWRpYVR5cGUudmFsdWVPZihTRVJWRVJfU0VOVF9FVkVOVFMpOworCisgICAgLyoqCisgICAgICogSWYge0Bjb2RlIHRydWV9IHRoZW4ge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5Tc2VGZWF0dXJlIFNTRSBGZWF0dXJlfSBhdXRvbWF0aWMgcmVnaXN0cmF0aW9uIGlzCisgICAgICogc3VwcHJlc3NlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBTaW5jZSBKZXJzZXkgMi44LCBieSBkZWZhdWx0IFNTRSBGZWF0dXJlIGlzIGF1dG9tYXRpY2FsbHkgZW5hYmxlZCB3aGVuIHRoZSBTU0UgbW9kdWxlIGlzIG9uIGNsYXNzIHBhdGguCisgICAgICogWW91IGNhbiBvdmVycmlkZSB0aGlzIGJlaGF2aW9yIGJ5IHNldHRpbmcgdGhpcyBwcm9wZXJ0eSB0byB7QGNvZGUgdHJ1ZX0uCisgICAgICogVGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgbWF5IGJlIHNwZWNpZmljYWxseSBvdmVycmlkZGVuIG9uIGVpdGhlciBjbGllbnQgb3Igc2VydmVyIHNpZGUgYnkgc2V0dGluZyB0aGUKKyAgICAgKiB7QGxpbmsgI0RJU0FCTEVfU1NFX0NMSUVOVCBjbGllbnR9IG9yIHtAbGluayAjRElTQUJMRV9TU0VfU0VSVkVSIHNlcnZlcn0gdmFyaWFudCBvZiB0aGlzIHByb3BlcnR5LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB7QGNvZGUgZmFsc2V9LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAc2luY2UgMi44CisgICAgICovCisgICAgQFByb3BlcnR5CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRV9TU0UgPSAiamVyc2V5LmNvbmZpZy5tZWRpYS5zc2UuZGlzYWJsZSI7CisgICAgLyoqCisgICAgICogQ2xpZW50LXNpZGUgdmFyaWFudCBvZiB7QGxpbmsgI0RJU0FCTEVfU1NFfSBwcm9wZXJ0eS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB7QGNvZGUgZmFsc2V9LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAc2luY2UgMi44CisgICAgICovCisgICAgQFByb3BlcnR5CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElTQUJMRV9TU0VfQ0xJRU5UID0gImplcnNleS5jb25maWcuY2xpZW50Lm1lZGlhLnNzZS5kaXNhYmxlIjsKKworICAgIC8qKgorICAgICAqIFNlcnZlci1zaWRlIHZhcmlhbnQgb2Yge0BsaW5rICNESVNBQkxFX1NTRX0gcHJvcGVydHkuCisgICAgICogPHA+CisgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMge0Bjb2RlIGZhbHNlfS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaXMgPHR0PntAdmFsdWV9PC90dD4uCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHNpbmNlIDIuOAorICAgICAqLworICAgIEBQcm9wZXJ0eQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERJU0FCTEVfU1NFX1NFUlZFUiA9ICJqZXJzZXkuY29uZmlnLnNlcnZlci5tZWRpYS5zc2UuZGlzYWJsZSI7CisKKyAgICAvKioKKyAgICAgKiBBICJyZWNvbm5lY3Rpb24gbm90IHNldCIgdmFsdWUgZm9yIHRoZSBTU0UgcmVjb25uZWN0IGRlbGF5IHNldCB2aWEge0Bjb2RlIHJldHJ5fSBmaWVsZC4KKyAgICAgKgorICAgICAqIEBzaW5jZSAyLjMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgUkVDT05ORUNUX05PVF9TRVQgPSAtMTsKKworICAgIC8qKgorICAgICAqIHtAY29kZSAiTGFzdC1FdmVudC1JRCJ9IEhUVFAgcmVxdWVzdCBoZWFkZXIgbmFtZSBhcyBkZWZpbmVkIGJ5CisgICAgICogPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvZXZlbnRzb3VyY2UvI2xhc3QtZXZlbnQtaWQiPlNTRSBzcGVjaWZpY2F0aW9uPC9hPi4KKyAgICAgKgorICAgICAqIEBzaW5jZSAyLjMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBMQVNUX0VWRU5UX0lEX0hFQURFUiA9ICJMYXN0LUV2ZW50LUlEIjsKKworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlKGZpbmFsIEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgaWYgKGNvbnRleHQuZ2V0Q29uZmlndXJhdGlvbigpLmlzRW5hYmxlZCh0aGlzLmdldENsYXNzKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGNvbnRleHQuZ2V0Q29uZmlndXJhdGlvbigpLmdldFJ1bnRpbWVUeXBlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgQ0xJRU5UOgorICAgICAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoRXZlbnRJbnB1dFJlYWRlci5jbGFzcyk7CisgICAgICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihJbmJvdW5kRXZlbnRSZWFkZXIuY2xhc3MpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTRVJWRVI6CisgICAgICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihPdXRib3VuZEV2ZW50V3JpdGVyLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKG5ldyBTc2VCaW5kZXIoKSk7CisgICAgICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihTc2VFdmVudFNpbmtWYWx1ZVBhcmFtUHJvdmlkZXIuY2xhc3MsIFZhbHVlUGFyYW1Qcm92aWRlci5jbGFzcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2FmZWx5IHJlZ2lzdGVyIGEge0Bjb2RlIFNzZUZlYXR1cmV9IGluIGEgZ2l2ZW4gY29uZmlndXJhYmxlIGNvbnRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY3R4IGNvbmZpZ3VyYWJsZSBjb250ZXh0IGluIHdoaWNoIHRoZSBTU0UgZmVhdHVyZSBzaG91bGQgYmUgcmVnaXN0ZXJlZC4KKyAgICAgKiBAcmV0dXJuIHVwZGF0ZWQgY29uZmlndXJhYmxlIGNvbnRleHQuCisgICAgICovCisgICAgc3RhdGljIDxUIGV4dGVuZHMgQ29uZmlndXJhYmxlPFQ+PiBUIHJlZ2lzdGVyKGZpbmFsIFQgY3R4KSB7CisgICAgICAgIGlmICghY3R4LmdldENvbmZpZ3VyYXRpb24oKS5pc1JlZ2lzdGVyZWQoU3NlRmVhdHVyZS5jbGFzcykpIHsKKyAgICAgICAgICAgIGN0eC5yZWdpc3RlcihTc2VGZWF0dXJlLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBjdHg7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvc3NlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvc3NlL2ludGVybmFsL0V2ZW50UHJvY2Vzc29yLmphdmEgYi9tZWRpYS9zc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9zc2UvaW50ZXJuYWwvRXZlbnRQcm9jZXNzb3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTViNzc1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvc3NlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvc3NlL2ludGVybmFsL0V2ZW50UHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSw0NDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLmludGVybmFsOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZTsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5TZXJ2aWNlVW5hdmFpbGFibGVFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50Lkludm9jYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5zc2UuU3NlRXZlbnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50RXhlY3V0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5FeHRlbmRlZExvZ2dlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5zc2UuRXZlbnRJbnB1dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5zc2UuRXZlbnRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5zc2UuRXZlbnRTb3VyY2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLkluYm91bmRFdmVudDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5zc2UuTG9jYWxpemF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLlNzZUZlYXR1cmU7CisKKy8qKgorICogUHJpdmF0ZSBldmVudCBwcm9jZXNzb3IgdGFzayByZXNwb25zaWJsZSBmb3IgY29ubmVjdGluZyB0byB0aGUgU1NFIHN0cmVhbSBhbmQgcHJvY2Vzc2luZworICogaW5jb21pbmcgU1NFIGV2ZW50cyBhcyB3ZWxsIGFzIGhhbmRsaW5nIGFueSBjb25uZWN0aW9uIGlzc3Vlcy4KKyAqLworcHVibGljIGNsYXNzIEV2ZW50UHJvY2Vzc29yIGltcGxlbWVudHMgUnVubmFibGUsIEV2ZW50TGlzdGVuZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGV2ZWwgQ09OTkVDVElPTl9FUlJPUl9MRVZFTCA9IExldmVsLkZJTkU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXh0ZW5kZWRMb2dnZXIgTE9HR0VSID0KKyAgICAgICAgICAgIG5ldyBFeHRlbmRlZExvZ2dlcihMb2dnZXIuZ2V0TG9nZ2VyKEV2ZW50UHJvY2Vzc29yLmNsYXNzLmdldE5hbWUoKSksIExldmVsLkZJTkVTVCk7CisKKyAgICAvKioKKyAgICAgKiBPcGVuIGNvbm5lY3Rpb24gcmVzcG9uc2UgYXJyaXZhbCBzeW5jaHJvbml6YXRpb24gbGF0Y2guCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBDb3VudERvd25MYXRjaCBmaXJzdENvbnRhY3RTaWduYWw7CisgICAgLyoqCisgICAgICogTGFzdCByZWNlaXZlZCBldmVudCBpZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBsYXN0RXZlbnRJZDsKKyAgICAvKioKKyAgICAgKiBSZS1jb25uZWN0IGRlbGF5LgorICAgICAqLworICAgIHByaXZhdGUgbG9uZyByZWNvbm5lY3REZWxheTsKKyAgICAvKioKKyAgICAgKiBTU0Ugc3RyZWFtaW5nIHJlc291cmNlIHRhcmdldC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQ7CisgICAgLyoqCisgICAgICogRmxhZyBpbmRpY2F0aW5nIGlmIHRoZSBwZXJzaXN0ZW50IEhUVFAgY29ubmVjdGlvbnMgc2hvdWxkIGJlIGRpc2FibGVkLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBkaXNhYmxlS2VlcEFsaXZlOworICAgIC8qKgorICAgICAqIEluY29taW5nIFNTRSBldmVudCBwcm9jZXNzaW5nIHRhc2sgZXhlY3V0b3IuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBDbGllbnRFeGVjdXRvciBleGVjdXRvcjsKKyAgICAvKioKKyAgICAgKiBFdmVudCBzb3VyY2UgaW50ZXJuYWwgc3RhdGUuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNSZWZlcmVuY2U8U3RhdGU+IHN0YXRlOworICAgIC8qKgorICAgICAqIExpc3Qgb2YgYWxsIGxpc3RlbmVycyBub3QgYm91bmQgdG8gcmVjZWl2ZSBvbmx5IGV2ZW50cyBvZiBhIHBhcnRpY3VsYXIgbmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIExpc3Q8RXZlbnRMaXN0ZW5lcj4gdW5ib3VuZExpc3RlbmVyczsKKyAgICAvKioKKyAgICAgKiBBIG1hcCBvZiBsaXN0ZW5lcnMgYm91bmQgdG8gcmVjZWl2ZSBvbmx5IGV2ZW50cyBvZiBhIHBhcnRpY3VsYXIgbmFtZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIExpc3Q8RXZlbnRMaXN0ZW5lcj4+IGJvdW5kTGlzdGVuZXJzOworCisgICAgLyoqCisgICAgICogU2h1dGRvd24gaGFuZGxlciBpcyBpbnZva2VkIHdoZW4gRXZlbnQgcHJvY2Vzc29yIHJlYWNoZXMgdGVybWluYWwgc3RhZ2UuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBTaHV0ZG93bkhhbmRsZXIgc2h1dGRvd25IYW5kbGVyOworCisgICAgLyoqCisgICAgICogSW52b2tlZCB3aGVuZXZlciBhbiBldmVudCBpcyByZWNlaXZlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIEV2ZW50TGlzdGVuZXIgZXZlbnRMaXN0ZW5lcjsKKworICAgIHByaXZhdGUgRXZlbnRQcm9jZXNzb3IoZmluYWwgRXZlbnRQcm9jZXNzb3IgdGhhdCkgeworICAgICAgICB0aGlzLmZpcnN0Q29udGFjdFNpZ25hbCA9IG51bGw7CisKKyAgICAgICAgdGhpcy5yZWNvbm5lY3REZWxheSA9IHRoYXQucmVjb25uZWN0RGVsYXk7CisgICAgICAgIHRoaXMubGFzdEV2ZW50SWQgPSB0aGF0Lmxhc3RFdmVudElkOworICAgICAgICB0aGlzLnRhcmdldCA9IHRoYXQudGFyZ2V0OworICAgICAgICB0aGlzLmRpc2FibGVLZWVwQWxpdmUgPSB0aGF0LmRpc2FibGVLZWVwQWxpdmU7CisgICAgICAgIHRoaXMuZXhlY3V0b3IgPSB0aGF0LmV4ZWN1dG9yOworICAgICAgICB0aGlzLnN0YXRlID0gdGhhdC5zdGF0ZTsKKyAgICAgICAgdGhpcy5ib3VuZExpc3RlbmVycyA9IHRoYXQuYm91bmRMaXN0ZW5lcnM7CisgICAgICAgIHRoaXMudW5ib3VuZExpc3RlbmVycyA9IHRoYXQudW5ib3VuZExpc3RlbmVyczsKKyAgICAgICAgdGhpcy5ldmVudExpc3RlbmVyID0gdGhhdC5ldmVudExpc3RlbmVyOworICAgICAgICB0aGlzLnNodXRkb3duSGFuZGxlciA9IHRoYXQuc2h1dGRvd25IYW5kbGVyOworICAgIH0KKworICAgIHByaXZhdGUgRXZlbnRQcm9jZXNzb3IoQnVpbGRlciBidWlsZGVyKSB7CisgICAgICAgIC8vIFN5bmNocm9uaXphdGlvbiBiYXJyaWVyIHVzZWQgdG8gc2lnbmFsIHRoYXQgdGhlIGluaXRpYWwgY29udGFjdCB3aXRoIFNTRSBlbmRwb2ludAorICAgICAgICAvLyBoYXMgYmVlbiBtYWRlLgorICAgICAgICB0aGlzLmZpcnN0Q29udGFjdFNpZ25hbCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKworICAgICAgICB0aGlzLnJlY29ubmVjdERlbGF5ID0gYnVpbGRlci5yZWNvbm5lY3REZWxheTsKKyAgICAgICAgdGhpcy5sYXN0RXZlbnRJZCA9IGJ1aWxkZXIubGFzdEV2ZW50SWQ7CisgICAgICAgIHRoaXMudGFyZ2V0ID0gYnVpbGRlci50YXJnZXQ7CisgICAgICAgIHRoaXMuZGlzYWJsZUtlZXBBbGl2ZSA9IGJ1aWxkZXIuZGlzYWJsZUtlZXBBbGl2ZTsKKyAgICAgICAgdGhpcy5leGVjdXRvciA9IGJ1aWxkZXIuY2xpZW50RXhlY3V0b3I7CisgICAgICAgIHRoaXMuc3RhdGUgPSBidWlsZGVyLnN0YXRlOworICAgICAgICB0aGlzLmJvdW5kTGlzdGVuZXJzID0gYnVpbGRlci5ib3VuZExpc3RlbmVycyA9PSBudWxsID8gQ29sbGVjdGlvbnMuRU1QVFlfTUFQIDogYnVpbGRlci5ib3VuZExpc3RlbmVyczsKKyAgICAgICAgdGhpcy51bmJvdW5kTGlzdGVuZXJzID0gYnVpbGRlci51bmJvdW5kTGlzdGVuZXJzID09IG51bGwgPyBDb2xsZWN0aW9ucy5FTVBUWV9MSVNUIDogYnVpbGRlci51bmJvdW5kTGlzdGVuZXJzOworICAgICAgICB0aGlzLmV2ZW50TGlzdGVuZXIgPSBidWlsZGVyLmV2ZW50TGlzdGVuZXI7CisgICAgICAgIHRoaXMuc2h1dGRvd25IYW5kbGVyID0gYnVpbGRlci5zaHV0ZG93bkhhbmRsZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyBFdmVudCBwcm9jZXNzb3IgYnVpbGRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0YXJnZXQgd2ViIHRhcmdldCB0byBiZSB1c2VkIHRvIGNhbGwgcmVtb3RlIHJlc291cmNlLgorICAgICAqIEBwYXJhbSBzdGF0ZSBzdGF0ZSBzaGFyZWQgd2l0aCB0aGUgb3duZXIgb2YgZXZlbnQgcHJvY2Vzc29yIGluc3RhbmNlLgorICAgICAqIEBwYXJhbSBjbGllbnRFeGVjdXRvciBleGVjdXRvciBzZXJ2aWNlIHVzZWQgZm9yIGNvbnN1bWluZyBldmVudHMgYW5kIHNjaGVkdWxpbmcgcmVjb25uZWN0cy4KKyAgICAgKiBAcGFyYW0gZXZlbnRMaXN0ZW5lciBldmVudCBsaXN0ZW5lci4KKyAgICAgKiBAcGFyYW0gc2h1dGRvd25IYW5kbGVyIHNodXRkb3duIGNhbGxiYWNrLgorICAgICAqIEByZXR1cm4gbmV3IHtAbGluayBCdWlsZGVyfSBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgYnVpbGRlcihXZWJUYXJnZXQgdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pY1JlZmVyZW5jZTxTdGF0ZT4gc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50RXhlY3V0b3IgY2xpZW50RXhlY3V0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRMaXN0ZW5lciBldmVudExpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNodXRkb3duSGFuZGxlciBzaHV0ZG93bkhhbmRsZXIpIHsKKworICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIodGFyZ2V0LCBzdGF0ZSwgY2xpZW50RXhlY3V0b3IsIGV2ZW50TGlzdGVuZXIsIHNodXRkb3duSGFuZGxlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICBMT0dHRVIuZGVidWdMb2coIkxpc3RlbmVyIHRhc2sgc3RhcnRlZC4iKTsKKworICAgICAgICBFdmVudElucHV0IGV2ZW50SW5wdXQgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmaW5hbCBJbnZvY2F0aW9uLkJ1aWxkZXIgcmVxdWVzdCA9IHByZXBhcmVIYW5kc2hha2VSZXF1ZXN0KCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXRlLmdldCgpID09IFN0YXRlLk9QRU4pIHsgLy8gYXR0ZW1wdCB0byBjb25uZWN0IG9ubHkgaWYgZXZlbiBzb3VyY2UgaXMgb3BlbgorICAgICAgICAgICAgICAgICAgICBMT0dHRVIuZGVidWdMb2coIkNvbm5lY3RpbmcuLi4iKTsKKyAgICAgICAgICAgICAgICAgICAgZXZlbnRJbnB1dCA9IHJlcXVlc3QuZ2V0KEV2ZW50SW5wdXQuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICBMT0dHRVIuZGVidWdMb2coIkNvbm5lY3RlZCEiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGlmIChmaXJzdENvbnRhY3RTaWduYWwgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyByZWxlYXNlIHRoZSBzaWduYWwgcmVnYXJkbGVzcyBvZiBldmVudCBzb3VyY2Ugc3RhdGUgb3IgY29ubmVjdGlvbiByZXF1ZXN0IG91dGNvbWUKKyAgICAgICAgICAgICAgICAgICAgZmlyc3RDb250YWN0U2lnbmFsLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgVGhyZWFkIGV4ZWNUaHJlYWQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOworCisgICAgICAgICAgICB3aGlsZSAoc3RhdGUuZ2V0KCkgPT0gU3RhdGUuT1BFTiAmJiAhZXhlY1RocmVhZC5pc0ludGVycnVwdGVkKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZXZlbnRJbnB1dCA9PSBudWxsIHx8IGV2ZW50SW5wdXQuaXNDbG9zZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBMT0dHRVIuZGVidWdMb2coIkNvbm5lY3Rpb24gbG9zdCAtIHNjaGVkdWxpbmcgcmVjb25uZWN0IGluIHswfSBtcyIsIHJlY29ubmVjdERlbGF5KTsKKyAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVSZWNvbm5lY3QocmVjb25uZWN0RGVsYXkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aGlzLm9uRXZlbnQoZXZlbnRJbnB1dC5yZWFkKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBMT0dHRVIuZGVidWdMb2coIlJlY2VpdmVkIEhUVFAgNTAzIik7CisgICAgICAgICAgICBsb25nIGRlbGF5ID0gcmVjb25uZWN0RGVsYXk7CisgICAgICAgICAgICBpZiAoZXguaGFzUmV0cnlBZnRlcigpKSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmRlYnVnTG9nKCJSZWNvdmVyaW5nIGZyb20gSFRUUCA1MDMgdXNpbmcgSFRUUCBSZXRyeS1BZnRlciBoZWFkZXIgdmFsdWUgYXMgYSByZWNvbm5lY3QgZGVsYXkiKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBEYXRlIHJlcXVlc3RUaW1lID0gbmV3IERhdGUoKTsKKyAgICAgICAgICAgICAgICBkZWxheSA9IGV4LmdldFJldHJ5VGltZShyZXF1ZXN0VGltZSkuZ2V0VGltZSgpIC0gcmVxdWVzdFRpbWUuZ2V0VGltZSgpOworICAgICAgICAgICAgICAgIGRlbGF5ID0gKGRlbGF5ID4gMCkgPyBkZWxheSA6IDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIExPR0dFUi5kZWJ1Z0xvZygiUmVjb3ZlcmluZyBmcm9tIEhUVFAgNTAzIC0gc2NoZWR1bGluZyB0byByZWNvbm5lY3QgaW4gezB9IG1zIiwgZGVsYXkpOworICAgICAgICAgICAgc2NoZWR1bGVSZWNvbm5lY3QoZGVsYXkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGlmIChMT0dHRVIuaXNMb2dnYWJsZShDT05ORUNUSU9OX0VSUk9SX0xFVkVMKSkgeworICAgICAgICAgICAgICAgIExPR0dFUi5sb2coQ09OTkVDVElPTl9FUlJPUl9MRVZFTCwgU3RyaW5nLmZvcm1hdCgiVW5hYmxlIHRvIGNvbm5lY3QgLSBjbG9zaW5nIHRoZSBldmVudCBzb3VyY2UgdG8gJXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5nZXRVcmkoKS50b0FTQ0lJU3RyaW5nKCkpLCBleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBpZiB3ZSdyZSBoZXJlLCBhbiB1bnJlY292ZXJhYmxlIGVycm9yIGhhcyBvY2N1cnJlZCAtIGp1c3QgdHVybiBvZmYgdGhlIGxpZ2h0cy4uLgorICAgICAgICAgICAgc2h1dGRvd25IYW5kbGVyLnNodXRkb3duKCk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBpZiAoZXZlbnRJbnB1dCAhPSBudWxsICYmICFldmVudElucHV0LmlzQ2xvc2VkKCkpIHsKKyAgICAgICAgICAgICAgICBldmVudElucHV0LmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMT0dHRVIuZGVidWdMb2coIkxpc3RlbmVyIHRhc2sgZmluaXNoZWQuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYnkgdGhlIGV2ZW50IHNvdXJjZSB3aGVuIGFuIGluYm91bmQgZXZlbnQgaXMgcmVjZWl2ZWQuCisgICAgICoKKyAgICAgKiBUaGlzIGxpc3RlbmVyIGFnZ3JlZ2F0b3IgbWV0aG9kIGlzIHJlc3BvbnNpYmxlIGZvciBpbnZva2luZyB7QGxpbmsgRXZlbnRTb3VyY2Ujb25FdmVudChJbmJvdW5kRXZlbnQpfQorICAgICAqIG1ldGhvZCBvbiB0aGUgb3duaW5nIGV2ZW50IHNvdXJjZSBhcyB3ZWxsIGFzIGZvciBub3RpZnlpbmcgYWxsIHJlZ2lzdGVyZWQge0BsaW5rIEV2ZW50TGlzdGVuZXIgZXZlbnQgbGlzdGVuZXJzfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBldmVudCBpbmNvbWluZyB7QGxpbmsgSW5ib3VuZEV2ZW50IGluYm91bmQgZXZlbnR9LgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uRXZlbnQoZmluYWwgSW5ib3VuZEV2ZW50IGV2ZW50KSB7CisgICAgICAgIGlmIChldmVudCA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBMT0dHRVIuZGVidWdMb2coIk5ldyBldmVudCByZWNlaXZlZC4iKTsKKworICAgICAgICBpZiAoZXZlbnQuZ2V0SWQoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBsYXN0RXZlbnRJZCA9IGV2ZW50LmdldElkKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGV2ZW50LmlzUmVjb25uZWN0RGVsYXlTZXQoKSkgeworICAgICAgICAgICAgcmVjb25uZWN0RGVsYXkgPSBldmVudC5nZXRSZWNvbm5lY3REZWxheSgpOworICAgICAgICB9CisKKyAgICAgICAgbm90aWZ5KGV2ZW50TGlzdGVuZXIsIGV2ZW50KTsKKyAgICAgICAgbm90aWZ5KHVuYm91bmRMaXN0ZW5lcnMsIGV2ZW50KTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgZXZlbnROYW1lID0gZXZlbnQuZ2V0TmFtZSgpOworICAgICAgICBpZiAoZXZlbnROYW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8RXZlbnRMaXN0ZW5lcj4gZXZlbnRMaXN0ZW5lcnMgPSBib3VuZExpc3RlbmVycy5nZXQoZXZlbnROYW1lKTsKKyAgICAgICAgICAgIGlmIChldmVudExpc3RlbmVycyAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgbm90aWZ5KGV2ZW50TGlzdGVuZXJzLCBldmVudCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgbm90aWZ5KGZpbmFsIENvbGxlY3Rpb248RXZlbnRMaXN0ZW5lcj4gbGlzdGVuZXJzLCBmaW5hbCBJbmJvdW5kRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgZm9yIChFdmVudExpc3RlbmVyIGxpc3RlbmVyIDogbGlzdGVuZXJzKSB7CisgICAgICAgICAgICBub3RpZnkobGlzdGVuZXIsIGV2ZW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBub3RpZnkoZmluYWwgRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciwgZmluYWwgSW5ib3VuZEV2ZW50IGV2ZW50KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsaXN0ZW5lci5vbkV2ZW50KGV2ZW50KTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBpZiAoTE9HR0VSLmlzTG9nZ2FibGUoTGV2ZWwuRklORSkpIHsKKyAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLkZJTkUsIFN0cmluZy5mb3JtYXQoIkV2ZW50IG5vdGlmaWNhdGlvbiBpbiBhIGxpc3RlbmVyIG9mICVzIGNsYXNzIGZhaWxlZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpLCBleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTY2hlZHVsZSBhIG5ldyBldmVudCBwcm9jZXNzb3IgdGFzayB0byByZWNvbm5lY3QgYWZ0ZXIgdGhlIHNwZWNpZmllZCB7QGNvZGUgZGVsYXl9IFttaWxsaXNlY29uZHNdLgorICAgICAqCisgICAgICogSWYgdGhlIHtAY29kZSBkZWxheX0gaXMgemVybyBvciBuZWdhdGl2ZSwgdGhlIG5ldyByZWNvbm5lY3QgdGFzayB3aWxsIGJlIHNjaGVkdWxlZCBpbW1lZGlhdGVseS4KKyAgICAgKiBUaGUge0Bjb2RlIHJlY29ubmVjdERlbGF5fSBhbmQge0Bjb2RlIGxhc3RFdmVudElkfSBmaWVsZCB2YWx1ZXMgYXJlIHByb3BhZ2F0ZWQgaW50byB0aGUgbmV3bHkKKyAgICAgKiBzY2hlZHVsZWQgdGFzay4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbWV0aG9kIHdpbGwgc2lsZW50bHkgYWJvcnQgaW4gY2FzZSB0aGUgZXZlbnQgc291cmNlIGlzIG5vdCB7QGxpbmsgRXZlbnRTb3VyY2UjaXNPcGVuKCkgb3Blbn0uCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGRlbGF5IHNwZWNpZmllcyB0aGUgYW1vdW50IG9mIHRpbWUgW21pbGxpc2Vjb25kc10gdG8gd2FpdCBiZWZvcmUgYXR0ZW1wdGluZyBhIHJlY29ubmVjdC4KKyAgICAgKiAgICAgICAgICAgICAgSWYgemVybyBvciBuZWdhdGl2ZSwgdGhlIG5ldyByZWNvbm5lY3QgdGFzayB3aWxsIGJlIHNjaGVkdWxlZCBpbW1lZGlhdGVseS4KKyAgICAgKi8KKyAgICBwcml2YXRlIHZvaWQgc2NoZWR1bGVSZWNvbm5lY3QoZmluYWwgbG9uZyBkZWxheSkgeworICAgICAgICBmaW5hbCBTdGF0ZSBzID0gc3RhdGUuZ2V0KCk7CisgICAgICAgIGlmIChzICE9IFN0YXRlLk9QRU4pIHsKKyAgICAgICAgICAgIExPR0dFUi5kZWJ1Z0xvZygiQWJvcnRpbmcgcmVjb25uZWN0IG9mIGV2ZW50IHNvdXJjZSBpbiB7MH0gc3RhdGUiLCBzdGF0ZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBwcm9wYWdhdGUgdGhlIGN1cnJlbnQgcmVjb25uZWN0RGVsYXksIGJ1dCBzY2hlZHVsZSBiYXNlZCBvbiB0aGUgZGVsYXkgcGFyYW1ldGVyCisgICAgICAgIGZpbmFsIEV2ZW50UHJvY2Vzc29yIHByb2Nlc3NvciA9IG5ldyBFdmVudFByb2Nlc3Nvcih0aGlzKTsKKyAgICAgICAgaWYgKGRlbGF5ID4gMCkgeworICAgICAgICAgICAgZXhlY3V0b3Iuc2NoZWR1bGUocHJvY2Vzc29yLCBkZWxheSwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGV4ZWN1dG9yLnN1Ym1pdChwcm9jZXNzb3IpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBJbnZvY2F0aW9uLkJ1aWxkZXIgcHJlcGFyZUhhbmRzaGFrZVJlcXVlc3QoKSB7CisgICAgICAgIGZpbmFsIEludm9jYXRpb24uQnVpbGRlciByZXF1ZXN0ID0gdGFyZ2V0LnJlcXVlc3QoU3NlRmVhdHVyZS5TRVJWRVJfU0VOVF9FVkVOVFNfVFlQRSk7CisgICAgICAgIGlmIChsYXN0RXZlbnRJZCAhPSBudWxsICYmICFsYXN0RXZlbnRJZC5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJlcXVlc3QuaGVhZGVyKFNzZUZlYXR1cmUuTEFTVF9FVkVOVF9JRF9IRUFERVIsIGxhc3RFdmVudElkKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGlzYWJsZUtlZXBBbGl2ZSkgeworICAgICAgICAgICAgcmVxdWVzdC5oZWFkZXIoIkNvbm5lY3Rpb24iLCAiY2xvc2UiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVxdWVzdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBd2FpdCB0aGUgaW5pdGlhbCBjb250YWN0IHdpdGggdGhlIFNTRSBlbmRwb2ludC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBhd2FpdEZpcnN0Q29udGFjdCgpIHsKKyAgICAgICAgTE9HR0VSLmRlYnVnTG9nKCJBd2FpdGluZyBmaXJzdCBjb250YWN0IHNpZ25hbC4iKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChmaXJzdENvbnRhY3RTaWduYWwgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmaXJzdENvbnRhY3RTaWduYWwuYXdhaXQoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhDT05ORUNUSU9OX0VSUk9SX0xFVkVMLCBMb2NhbGl6YXRpb25NZXNzYWdlcy5FVkVOVF9TT1VSQ0VfT1BFTl9DT05ORUNUSU9OX0lOVEVSUlVQVEVEKCksIGV4KTsKKyAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgTE9HR0VSLmRlYnVnTG9nKCJGaXJzdCBjb250YWN0IHNpZ25hbCByZWxlYXNlZC4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEV2ZW50IHByb2Nlc3NvciBzdGF0ZSwgd2hpY2ggaXMgc2hhcmVkIHdpdGggdGhlIG93bmVyICh0byBiZSBhYmxlIHRvIGNvbnRyb2wgYm9vdHN0cmFwIGFuZCBzaHV0ZG93bikuCisgICAgICovCisgICAgcHVibGljIGVudW0gU3RhdGUgeworICAgICAgICAvKioKKyAgICAgICAgICogUmVhZHkgdG8gY29ubmVjdC4KKyAgICAgICAgICovCisgICAgICAgIFJFQURZLAorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25uZWN0aW9uIGVzdGFibGlzaGVkLCBldmVudHMgY2FuIGJlIHJlY2VpdmVkLgorICAgICAgICAgKi8KKyAgICAgICAgT1BFTiwKKworICAgICAgICAvKioKKyAgICAgICAgICogQ2xvc2VkLCB3b24ndCByZWNlaXZlIGFueSBldmVudHMuCisgICAgICAgICAqLworICAgICAgICBDTE9TRUQKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgRXZlbnRQcm9jZXNzb3J9IGJ1aWxkZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgQXRvbWljUmVmZXJlbmNlPFN0YXRlPiBzdGF0ZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDbGllbnRFeGVjdXRvciBjbGllbnRFeGVjdXRvcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBFdmVudExpc3RlbmVyIGV2ZW50TGlzdGVuZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgU2h1dGRvd25IYW5kbGVyIHNodXRkb3duSGFuZGxlcjsKKworICAgICAgICBwcml2YXRlIGxvbmcgcmVjb25uZWN0RGVsYXk7CisgICAgICAgIHByaXZhdGUgVGltZVVuaXQgcmVjb25uZWN0VW5pdDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbGFzdEV2ZW50SWQ7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBkaXNhYmxlS2VlcEFsaXZlOworICAgICAgICBwcml2YXRlIExpc3Q8RXZlbnRMaXN0ZW5lcj4gdW5ib3VuZExpc3RlbmVyczsKKyAgICAgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBMaXN0PEV2ZW50TGlzdGVuZXI+PiBib3VuZExpc3RlbmVyczsKKworICAgICAgICBwcml2YXRlIEJ1aWxkZXIoV2ViVGFyZ2V0IHRhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pY1JlZmVyZW5jZTxTdGF0ZT4gc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBDbGllbnRFeGVjdXRvciBjbGllbnRFeGVjdXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50TGlzdGVuZXIgZXZlbnRMaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNodXRkb3duSGFuZGxlciBzaHV0ZG93bkhhbmRsZXIpIHsKKworICAgICAgICAgICAgdGhpcy50YXJnZXQgPSB0YXJnZXQ7CisgICAgICAgICAgICB0aGlzLnN0YXRlID0gc3RhdGU7CisgICAgICAgICAgICB0aGlzLmNsaWVudEV4ZWN1dG9yID0gY2xpZW50RXhlY3V0b3I7CisgICAgICAgICAgICB0aGlzLmV2ZW50TGlzdGVuZXIgPSBldmVudExpc3RlbmVyOworICAgICAgICAgICAgdGhpcy5zaHV0ZG93bkhhbmRsZXIgPSBzaHV0ZG93bkhhbmRsZXI7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IGluaXRpYWwgcmVjb25uZWN0IGRlbGF5LgorICAgICAgICAgKgorICAgICAgICAgKiBSZWNvbm5lY3QgZGVsYXkgY2FuIGJlIGNvbnRyb2xsZWQgYnkgdGhlIHNlcnZlciBzaWRlLCBhZGRpbmcgc3BlY2lmaWMgcHJvcGVydGllcyB0byBpbmNvbWluZyBldmVudHMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSByZWNvbm5lY3REZWxheSByZWNvbm5lY3QgZGVsYXkgdmFsdWUuCisgICAgICAgICAqIEBwYXJhbSB1bml0IHJlY29ubmVjdCBkZWxheSB0aW1ldW5pdC4KKyAgICAgICAgICogQHJldHVybiB1cGRhdGVkIGJ1aWxkZXIgaW5zdGFuY2UuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciByZWNvbm5lY3REZWxheShsb25nIHJlY29ubmVjdERlbGF5LCBUaW1lVW5pdCB1bml0KSB7CisgICAgICAgICAgICB0aGlzLnJlY29ubmVjdERlbGF5ID0gcmVjb25uZWN0RGVsYXk7CisgICAgICAgICAgICB0aGlzLnJlY29ubmVjdFVuaXQgPSByZWNvbm5lY3RVbml0OworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVW5ib3VuZGVkIGxpc3RlbmVycyB3aWxsIGdldCBub3RpZmllZCBhYm91dCBhbnkgaW5jb21pbmcgZXZlbnQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSB1bmJvdW5kTGlzdGVuZXJzIGxpc3Qgb2YgbGlzdGVuZXJzLgorICAgICAgICAgKiBAcmV0dXJuIHVwZGF0ZWQgYnVpbGRlciBpbnN0YW5jZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHVuYm91bmRMaXN0ZW5lcnMoTGlzdDxFdmVudExpc3RlbmVyPiB1bmJvdW5kTGlzdGVuZXJzKSB7CisgICAgICAgICAgICB0aGlzLnVuYm91bmRMaXN0ZW5lcnMgPSB1bmJvdW5kTGlzdGVuZXJzOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVW5ib3VuZGVkIGxpc3RlbmVycyB3aWxsIGdldCBub3RpZmllZCBhYm91dCBpbmNvbWluZyBldmVudHMgd2l0aCBwYXJ0aWN1bGFyIG5hbWUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBib3VuZExpc3RlbmVycyBtYXAgb2YgYm91bmQgbGlzdGVuZXJzLCBrZXkgaXMgYSBuYW1lIHRvIHdoaWNoIGxpc3RlbmVycyBhcmUgYm91bmQgdG8sIHZhbHVlIGlzIGEgbGlzdAorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvZiBsaXN0ZW5lcnMuCisgICAgICAgICAqIEByZXR1cm4gdXBkYXRlZCBidWlsZGVyIGluc3RhbmNlLgorICAgICAgICAgKiBAc2VlIFNzZUV2ZW50I2dldE5hbWUoKQorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgYm91bmRMaXN0ZW5lcnMoTWFwPFN0cmluZywgTGlzdDxFdmVudExpc3RlbmVyPj4gYm91bmRMaXN0ZW5lcnMpIHsKKyAgICAgICAgICAgIHRoaXMuYm91bmRMaXN0ZW5lcnMgPSBib3VuZExpc3RlbmVyczsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIERpc2FibGVzIGtlZXBhbGl2ZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB1cGRhdGVkIGJ1aWxkZXIgaW5zdGFuY2UuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBkaXNhYmxlS2VlcEFsaXZlKCkgeworICAgICAgICAgICAgdGhpcy5kaXNhYmxlS2VlcEFsaXZlID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJ1aWxkIHRoZSB7QGxpbmsgRXZlbnRQcm9jZXNzb3J9LgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIGJ1aWx0IEV2ZW50IHByb2Nlc3NvciBpbnN0YW5jZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBFdmVudFByb2Nlc3NvciBidWlsZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRXZlbnRQcm9jZXNzb3IodGhpcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVc2VkIHRvIHNpZ25hbCB0aGF0IHRoZSB7QGxpbmsgRXZlbnRQcm9jZXNzb3J9IHJlYWNoZWQgdGVybWluYWwgc3RhZ2UuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBTaHV0ZG93bkhhbmRsZXIgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBJbnZva2VkIHdoZW4gdGhlIHtAbGluayBFdmVudFByb2Nlc3Nvcn0gcmVhY2hlcyB0ZXJtaW5hbCBzdGFnZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQWxsIHJlc291cmNlcyBzaG91bGQgYmUgZnJlZWQgYXQgdGhpcyBwb2ludC4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgc2h1dGRvd24oKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9zc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9zc2UvaW50ZXJuYWwvSmVyc2V5RXZlbnRTaW5rLmphdmEgYi9tZWRpYS9zc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9zc2UvaW50ZXJuYWwvSmVyc2V5RXZlbnRTaW5rLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNmZWFhZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3NzZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL3NzZS9pbnRlcm5hbC9KZXJzZXlFdmVudFNpbmsuamF2YQpAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5zc2UuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmlvLkZsdXNoYWJsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db21wbGV0YWJsZUZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db21wbGV0aW9uU3RhZ2U7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuc3NlLk91dGJvdW5kU3NlRXZlbnQ7CitpbXBvcnQgamF2YXgud3MucnMuc3NlLlNzZUV2ZW50U2luazsKKworaW1wb3J0IGphdmF4LmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmpzcjE2Ni5GbG93OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5Mb2NhbGl6YXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXN5bmNDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5DaHVua2VkT3V0cHV0OworCisvKioKKyAqIFNlcnZlci1zaWRlIFNTRSBzdWJzY3JpYmVyLgorICogPHA+CisgKiBUaGUgcmVmZXJlbmNlIHNob3VsZCBiZSBvYnRhaW5lZCB2aWEgaW5qZWN0aW9uIGludG8gdGhlIHJlc291cmNlIG1ldGhvZC4KKyAqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pXQorICovCitjbGFzcyBKZXJzZXlFdmVudFNpbmsgZXh0ZW5kcyBDaHVua2VkT3V0cHV0PE91dGJvdW5kU3NlRXZlbnQ+CisgICAgICAgIGltcGxlbWVudHMgU3NlRXZlbnRTaW5rLCBGbHVzaGFibGUsIEZsb3cuU3Vic2NyaWJlcjxPdXRib3VuZFNzZUV2ZW50PiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihKZXJzZXlFdmVudFNpbmsuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlW10gU1NFX0VWRU5UX0RFTElNSVRFUiA9ICJcbiIuZ2V0Qnl0ZXMoQ2hhcnNldC5mb3JOYW1lKCJVVEYtOCIpKTsKKyAgICBwcml2YXRlIEZsb3cuU3Vic2NyaXB0aW9uIHN1YnNjcmlwdGlvbiA9IG51bGw7CisKKyAgICBKZXJzZXlFdmVudFNpbmsoUHJvdmlkZXI8QXN5bmNDb250ZXh0PiBhc3luY0NvbnRleHRQcm92aWRlcikgeworICAgICAgICBzdXBlcihTU0VfRVZFTlRfREVMSU1JVEVSLCBhc3luY0NvbnRleHRQcm92aWRlcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TdWJzY3JpYmUoZmluYWwgRmxvdy5TdWJzY3JpcHRpb24gc3Vic2NyaXB0aW9uKSB7CisgICAgICAgIGNoZWNrQ2xvc2VkKCk7CisgICAgICAgIGlmIChzdWJzY3JpcHRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLlBBUkFNX05VTEwoInN1YnNjcmlwdGlvbiIpKTsKKyAgICAgICAgfQorICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IHN1YnNjcmlwdGlvbjsKKyAgICAgICAgc3Vic2NyaXB0aW9uLnJlcXVlc3QoTG9uZy5NQVhfVkFMVUUpOworICAgIH0KKworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25OZXh0KGZpbmFsIE91dGJvdW5kU3NlRXZlbnQgaXRlbSkgeworICAgICAgICBjaGVja0Nsb3NlZCgpOworICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuUEFSQU1fTlVMTCgib3V0Ym91bmRTc2VFdmVudCIpKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgd3JpdGUoaXRlbSk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIG9uRXJyb3IoZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkVycm9yKGZpbmFsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKKyAgICAgICAgY2hlY2tDbG9zZWQoKTsKKyAgICAgICAgaWYgKHRocm93YWJsZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuUEFSQU1fTlVMTCgidGhyb3dhYmxlIikpOworICAgICAgICB9CisgICAgICAgIHN1YnNjcmlwdGlvbi5jYW5jZWwoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN1cGVyLmNsb3NlKCk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuSU5GTywgTG9jYWxpemF0aW9uTWVzc2FnZXMuRVZFTlRfU0lOS19DTE9TRV9GQUlMRUQoKSwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ29tcGxldGlvblN0YWdlPD8+IHNlbmQoT3V0Ym91bmRTc2VFdmVudCBldmVudCkgeworICAgICAgICBjaGVja0Nsb3NlZCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGhpcy53cml0ZShldmVudCk7CisgICAgICAgICAgICByZXR1cm4gQ29tcGxldGFibGVGdXR1cmUuY29tcGxldGVkRnV0dXJlKG51bGwpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gQ29tcGxldGFibGVGdXR1cmUuY29tcGxldGVkRnV0dXJlKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmx1c2ggdGhlIGhlYWRlcnMuCisgICAgICoKKyAgICAgKiBXaGVuIFNzZUV2ZW50U2luayBpbnN0YW5jZSBpcyByZXR1cm5lZCBmcm9tIHRoZSByZXNvdXJjZSBtZXRob2QgYW5kIHRoZXJlIGFyZSBubyBldmVudCB3cml0dGVuLAorICAgICAqIGh0dHAgaGVhZGVycyBuZWVkIHRvIGJlICJmbHVzaGVkIiAtIHNlbnQgdG8gdGhlIGNsaWVudCwgd2hpY2ggaXMgd2FpdGluZyBmb3IgcmVzcG9uc2UgaGVhZGVycy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gd2hlbiB0aGVyZSBpcyBhIEkvTyBpc3N1ZSBkdXJpbmcgcmVzcG9uc2UgcHJvY2Vzc2luZy4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLmZsdXNoUXVldWUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKCkgeworICAgICAgICBjaGVja0Nsb3NlZCgpOworICAgICAgICBzdWJzY3JpcHRpb24uY2FuY2VsKCk7CisgICAgICAgIGNsb3NlKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrQ2xvc2VkKCkgeworICAgICAgICBpZiAoaXNDbG9zZWQoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5FVkVOVF9TT1VSQ0VfQUxSRUFEWV9DTE9TRUQoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9zc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9zc2UvaW50ZXJuYWwvSmVyc2V5U3NlLmphdmEgYi9tZWRpYS9zc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9zc2UvaW50ZXJuYWwvSmVyc2V5U3NlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NlYzE2YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3NzZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL3NzZS9pbnRlcm5hbC9KZXJzZXlTc2UuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKKworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLnNzZS5PdXRib3VuZFNzZUV2ZW50OworaW1wb3J0IGphdmF4LndzLnJzLnNzZS5Tc2U7CitpbXBvcnQgamF2YXgud3MucnMuc3NlLlNzZUJyb2FkY2FzdGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLk91dGJvdW5kRXZlbnQ7CisKKy8qKgorICogSW1wbGVtZW50YXRpb24gb2Ygc2VydmVyLXNpZGUgaW5qZWN0YWJsZSBTZXJ2ZXItU2VudCBFdmVudCAiY29udGV4dCIuCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitjbGFzcyBKZXJzZXlTc2UgaW1wbGVtZW50cyBTc2UgeworCisgICAgQENvbnRleHQKKyAgICBwcml2YXRlIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvclNlcnZpY2U7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT3V0Ym91bmRTc2VFdmVudC5CdWlsZGVyIG5ld0V2ZW50QnVpbGRlcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBPdXRib3VuZEV2ZW50LkJ1aWxkZXIoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3NlQnJvYWRjYXN0ZXIgbmV3QnJvYWRjYXN0ZXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgSmVyc2V5U3NlQnJvYWRjYXN0ZXIoZXhlY3V0b3JTZXJ2aWNlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9zc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9zc2UvaW50ZXJuYWwvSmVyc2V5U3NlQnJvYWRjYXN0ZXIuamF2YSBiL21lZGlhL3NzZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL3NzZS9pbnRlcm5hbC9KZXJzZXlTc2VCcm9hZGNhc3Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyYjM4ODkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9zc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9zc2UvaW50ZXJuYWwvSmVyc2V5U3NlQnJvYWRjYXN0ZXIuamF2YQpAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5zc2UuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db21wbGV0aW9uU3RhZ2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29weU9uV3JpdGVBcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5CaUNvbnN1bWVyOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5Db25zdW1lcjsKKworaW1wb3J0IGphdmF4LndzLnJzLnNzZS5PdXRib3VuZFNzZUV2ZW50OworaW1wb3J0IGphdmF4LndzLnJzLnNzZS5Tc2U7CitpbXBvcnQgamF2YXgud3MucnMuc3NlLlNzZUJyb2FkY2FzdGVyOworaW1wb3J0IGphdmF4LndzLnJzLnNzZS5Tc2VFdmVudFNpbms7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5qc3IxNjYuRmxvdzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLkplcnNleVB1Ymxpc2hlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5zc2UuTG9jYWxpemF0aW9uTWVzc2FnZXM7CisKKy8qKgorICogVXNlZCBmb3IgYnJvYWRjYXN0aW5nIFNTRSB0byBtdWx0aXBsZSB7QGxpbmsgamF2YXgud3MucnMuc3NlLlNzZUV2ZW50U2lua30gaW5zdGFuY2VzLgorICogPHA+CisgKiBKQVgtUlMgMi4xIHtAbGluayBTc2VCcm9hZGNhc3Rlcn0gaW1wbGVtZW50YXRpb24uCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitjbGFzcyBKZXJzZXlTc2VCcm9hZGNhc3RlciBleHRlbmRzIEplcnNleVB1Ymxpc2hlcjxPdXRib3VuZFNzZUV2ZW50PiBpbXBsZW1lbnRzIFNzZUJyb2FkY2FzdGVyIHsKKworICAgIC8qKgorICAgICAqIENhbGxiYWNrcyBub3RpZmllZCB3aGVuIHtAY29kZSBTc2VCcm9hZGNhc3Rlcn0gaXMgYmVpbmcgY2xvc2VkLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgQ29weU9uV3JpdGVBcnJheUxpc3Q8Q29uc3VtZXI8U3NlRXZlbnRTaW5rPj4gb25DbG9zZUxpc3RlbmVyczsKKworICAgIC8qKgorICAgICAqIENhbGxiYWNrcyBub3RpZmllZCB3aGVuIGVycm9yIG9jY3Vycy4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIENvcHlPbldyaXRlQXJyYXlMaXN0PEJpQ29uc3VtZXI8U3NlRXZlbnRTaW5rLCBUaHJvd2FibGU+PiBvbkV4Y2VwdGlvbkxpc3RlbmVyczsKKworICAgIC8qKgorICAgICAqIFBhY2thZ2UtcHJpdmF0ZSBjb25zdHJ1Y3Rvci4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgYnJvYWRjYXN0ZXIgaW5zdGFuY2Ugc2hvdWxkIGJlIG9idGFpbmVkIGJ5IGNhbGxpbmcge0BsaW5rIFNzZSNuZXdCcm9hZGNhc3RlcigpfSwgbm90IGRpcmVjdGx5LgorICAgICAqLworICAgIEplcnNleVNzZUJyb2FkY2FzdGVyKCkgeworICAgICAgICBvbkV4Y2VwdGlvbkxpc3RlbmVycyA9IG5ldyBDb3B5T25Xcml0ZUFycmF5TGlzdDw+KCk7CisgICAgICAgIG9uQ2xvc2VMaXN0ZW5lcnMgPSBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3Q8PigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhY2thZ2UtcHJpdmF0ZSBjb25zdHJ1Y3Rvci4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgYnJvYWRjYXN0ZXIgaW5zdGFuY2Ugc2hvdWxkIGJlIG9idGFpbmVkIGJ5IGNhbGxpbmcge0BsaW5rIFNzZSNuZXdCcm9hZGNhc3RlcigpfSwgbm90IGRpcmVjdGx5LgorICAgICAqCisgICAgICogQHBhcmFtIGV4ZWN1dG9yU2VydmljZSB7QGNvZGUgRXhlY3V0b3JTZXJ2aWNlfSB0aGUgZXhlY3V0b3IgdG8gdXNlIGZvciBhc3luYyBkZWxpdmVyeSwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRpbmcgY3JlYXRpb24gb2YgYXQgbGVhc3Qgb25lIGluZGVwZW5kZW50IHRocmVhZAorICAgICAqLworICAgIEplcnNleVNzZUJyb2FkY2FzdGVyKGZpbmFsIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvclNlcnZpY2UpIHsKKyAgICAgICAgc3VwZXIoZXhlY3V0b3JTZXJ2aWNlKTsKKyAgICAgICAgb25FeGNlcHRpb25MaXN0ZW5lcnMgPSBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3Q8PigpOworICAgICAgICBvbkNsb3NlTGlzdGVuZXJzID0gbmV3IENvcHlPbldyaXRlQXJyYXlMaXN0PD4oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlcihTc2VFdmVudFNpbmsgc3NlRXZlbnRTaW5rKSB7CisgICAgICAgIHN1cGVyLnN1YnNjcmliZShuZXcgU3NlRXZlbnRTaW5rV3JhcHBlcihzc2VFdmVudFNpbmspKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvbkVycm9yKEJpQ29uc3VtZXI8U3NlRXZlbnRTaW5rLCBUaHJvd2FibGU+IG9uRXJyb3IpIHsKKyAgICAgICAgaWYgKG9uRXJyb3IgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5QQVJBTV9OVUxMKCJvbkVycm9yIikpOworICAgICAgICB9CisKKyAgICAgICAgb25FeGNlcHRpb25MaXN0ZW5lcnMuYWRkKG9uRXJyb3IpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uQ2xvc2UoQ29uc3VtZXI8U3NlRXZlbnRTaW5rPiBvbkNsb3NlKSB7CisgICAgICAgIGlmIChvbkNsb3NlID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuUEFSQU1fTlVMTCgib25DbG9zZSIpKTsKKyAgICAgICAgfQorCisgICAgICAgIG9uQ2xvc2VMaXN0ZW5lcnMuYWRkKG9uQ2xvc2UpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDb21wbGV0aW9uU3RhZ2U8Pz4gYnJvYWRjYXN0KGZpbmFsIE91dGJvdW5kU3NlRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgaWYgKGV2ZW50ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuUEFSQU1fTlVMTCgiZXZlbnQiKSk7CisgICAgICAgIH0KKyAgICAgICAgcHVibGlzaChldmVudCk7CisKKyAgICAgICAgLy8gVE9ETyBKQVgtUlMgMi4xCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBub3RpZnlPbkNvbXBsZXRlSGFuZGxlcnMoRmxvdy5TdWJzY3JpYmVyPD8gc3VwZXIgT3V0Ym91bmRTc2VFdmVudD4gc3Vic2NyaWJlcikgeworICAgICAgICBpZiAoc3Vic2NyaWJlciBpbnN0YW5jZW9mIFNzZUV2ZW50U2lua1dyYXBwZXIpIHsKKyAgICAgICAgICAgIG9uQ2xvc2VMaXN0ZW5lcnMuZm9yRWFjaCgobGlzdGVuZXIpIC0+IGxpc3RlbmVyLmFjY2VwdCgoKFNzZUV2ZW50U2lua1dyYXBwZXIpIHN1YnNjcmliZXIpLnNzZUV2ZW50U2luaykpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG5vdGlmeU9uRXJyb3JDYWxsYmFja3MoZmluYWwgRmxvdy5TdWJzY3JpYmVyPD8gc3VwZXIgT3V0Ym91bmRTc2VFdmVudD4gc3Vic2NyaWJlciwgZmluYWwgVGhyb3dhYmxlIHRocm93YWJsZSkgeworICAgICAgICBpZiAoc3Vic2NyaWJlciBpbnN0YW5jZW9mIFNzZUV2ZW50U2lua1dyYXBwZXIpIHsKKyAgICAgICAgICAgIG9uRXhjZXB0aW9uTGlzdGVuZXJzLmZvckVhY2goCisgICAgICAgICAgICAgICAgICAgIChsaXN0ZW5lcikgLT4gbGlzdGVuZXIuYWNjZXB0KCgoU3NlRXZlbnRTaW5rV3JhcHBlcikgc3Vic2NyaWJlcikuc3NlRXZlbnRTaW5rLCB0aHJvd2FibGUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgY2xhc3MgU3NlRXZlbnRTaW5rV3JhcHBlciBpbXBsZW1lbnRzIEZsb3cuU3Vic2NyaWJlcjxPdXRib3VuZFNzZUV2ZW50PiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTc2VFdmVudFNpbmsgc3NlRXZlbnRTaW5rOworCisgICAgICAgIFNzZUV2ZW50U2lua1dyYXBwZXIoU3NlRXZlbnRTaW5rIHNzZUV2ZW50U2luaykgeworICAgICAgICAgICAgdGhpcy5zc2VFdmVudFNpbmsgPSBzc2VFdmVudFNpbms7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TdWJzY3JpYmUoZmluYWwgRmxvdy5TdWJzY3JpcHRpb24gc3Vic2NyaXB0aW9uKSB7CisgICAgICAgICAgICAvLyBUT0RPIEpBWC1SUyAyLjEKKyAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5yZXF1ZXN0KExvbmcuTUFYX1ZBTFVFKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbk5leHQoZmluYWwgT3V0Ym91bmRTc2VFdmVudCBpdGVtKSB7CisgICAgICAgICAgICBzc2VFdmVudFNpbmsuc2VuZChpdGVtKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKGZpbmFsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKKyAgICAgICAgICAgIC8vIFRPRE8gSkFYLVJTIDIuMQorICAgICAgICAgICAgc3NlRXZlbnRTaW5rLmNsb3NlKCk7CisgICAgICAgICAgICBub3RpZnlPbkVycm9yQ2FsbGJhY2tzKHRoaXMsIHRocm93YWJsZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZSgpIHsKKyAgICAgICAgICAgIC8vIFRPRE8gSkFYLVJTIDIuMQorICAgICAgICAgICAgc3NlRXZlbnRTaW5rLmNsb3NlKCk7CisgICAgICAgICAgICBub3RpZnlPbkNvbXBsZXRlSGFuZGxlcnModGhpcyk7CisKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL3NzZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL3NzZS9pbnRlcm5hbC9KZXJzZXlTc2VFdmVudFNvdXJjZS5qYXZhIGIvbWVkaWEvc3NlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvc3NlL2ludGVybmFsL0plcnNleVNzZUV2ZW50U291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEyNDJiNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3NzZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL3NzZS9pbnRlcm5hbC9KZXJzZXlTc2VFdmVudFNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMjI2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuc3NlLkluYm91bmRTc2VFdmVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5zc2UuU3NlRXZlbnRTb3VyY2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50RXhlY3V0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkplcnNleVdlYlRhcmdldDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5qc3IxNjYuRmxvdzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLkplcnNleVB1Ymxpc2hlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5zc2UuTG9jYWxpemF0aW9uTWVzc2FnZXM7CisKKy8qKgorICoge0Bjb2RlIFNzZUV2ZW50U291cmNlfSBpbXBsZW1lbnRhdGlvbi4KKyAqLworcHVibGljIGNsYXNzIEplcnNleVNzZUV2ZW50U291cmNlIGltcGxlbWVudHMgU3NlRXZlbnRTb3VyY2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBERUZBVUxUX1JFQ09OTkVDVF9ERUxBWSA9IDUwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihKZXJzZXlTc2VFdmVudFNvdXJjZS5jbGFzcy5nZXROYW1lKCkpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29uc3VtZXI8Rmxvdy5TdWJzY3JpcHRpb24+IERFRkFVTFRfU1VCU0NSSVBUSU9OX0hBTkRMRVIgPQorICAgICAgICAgICAgc3NlU3Vic2NyaXB0aW9uIC0+IHNzZVN1YnNjcmlwdGlvbi5yZXF1ZXN0KExvbmcuTUFYX1ZBTFVFKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbnN1bWVyPFRocm93YWJsZT4gREVGQVVMVF9FUlJPUl9IQU5ETEVSID0KKyAgICAgICAgICAgIHRocm93YWJsZSAtPiBMT0dHRVIubG9nKAorICAgICAgICAgICAgICAgICAgICBMZXZlbC5XQVJOSU5HLAorICAgICAgICAgICAgICAgICAgICBMb2NhbGl6YXRpb25NZXNzYWdlcy5FVkVOVF9TT1VSQ0VfREVGQVVMVF9PTkVSUk9SKCksCisgICAgICAgICAgICAgICAgICAgIHRocm93YWJsZSk7CisKKyAgICBwcml2YXRlIEplcnNleVB1Ymxpc2hlcjxJbmJvdW5kU3NlRXZlbnQ+IHB1Ymxpc2hlcjsKKworICAgIC8qKgorICAgICAqIFNzZUV2ZW50U291cmNlIGludGVybmFsIHN0YXRlLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgQXRvbWljUmVmZXJlbmNlPEV2ZW50UHJvY2Vzc29yLlN0YXRlPiBzdGF0ZSA9IG5ldyBBdG9taWNSZWZlcmVuY2U8PihFdmVudFByb2Nlc3Nvci5TdGF0ZS5SRUFEWSk7CisgICAgLyoqCisgICAgICogU1NFIHN0cmVhbWluZyByZXNvdXJjZSB0YXJnZXQuCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBKZXJzZXlXZWJUYXJnZXQgZW5kcG9pbnQ7CisgICAgLyoqCisgICAgICogUmVjb25uZWN0IGRlbGF5IHZhbHVlLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgbG9uZyByZWNvbm5lY3REZWxheTsKKyAgICAvKioKKyAgICAgKiBSZWNvbm5lY3QgZGVsYXkgdGltZSB1bml0LgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgVGltZVVuaXQgcmVjb25uZWN0VGltZVVuaXQ7CisgICAgLyoqCisgICAgICogQ2xpZW50IHByb3ZpZGVkIGV4ZWN1dG9yIGZhY2FkZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGZpbmFsIENsaWVudEV4ZWN1dG9yIGNsaWVudEV4ZWN1dG9yOworCisgICAgLyoqCisgICAgICogUHJpdmF0ZSBjb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbmRwb2ludCAgICAgICAgICBTU0UgcmVzb3VyY2Uge0BsaW5rIFdlYlRhcmdldH0KKyAgICAgKiBAcGFyYW0gcmVjb25uZWN0RGVsYXkgICAgYW1vdW50IG9mIHRpbWUgdW5pdHMgYmVmb3JlIG5leHQgcmVjb25uZWN0IGF0dGVtcHQKKyAgICAgKiBAcGFyYW0gcmVjb25uZWN0VGltZVVuaXQgdGltZSB1bml0cyB0byBtZWFzdXJlIHRoZSByZWNvbm5lY3QgYXR0ZW1wdHMgaW4KKyAgICAgKi8KKyAgICBwcml2YXRlIEplcnNleVNzZUV2ZW50U291cmNlKGZpbmFsIEplcnNleVdlYlRhcmdldCBlbmRwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgcmVjb25uZWN0RGVsYXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUaW1lVW5pdCByZWNvbm5lY3RUaW1lVW5pdCkgeworCisgICAgICAgIHRoaXMuZW5kcG9pbnQgPSBlbmRwb2ludDsKKyAgICAgICAgdGhpcy5yZWNvbm5lY3REZWxheSA9IHJlY29ubmVjdERlbGF5OworICAgICAgICB0aGlzLnJlY29ubmVjdFRpbWVVbml0ID0gcmVjb25uZWN0VGltZVVuaXQ7CisgICAgICAgIHRoaXMuY2xpZW50RXhlY3V0b3IgPSBlbmRwb2ludC5nZXRDb25maWd1cmF0aW9uKCkuZ2V0Q2xpZW50RXhlY3V0b3IoKTsKKyAgICAgICAgdGhpcy5wdWJsaXNoZXIgPSBuZXcgSmVyc2V5UHVibGlzaGVyPD4oY2xpZW50RXhlY3V0b3I6OnN1Ym1pdCwgSmVyc2V5UHVibGlzaGVyLlB1Ymxpc2hlclN0cmF0ZWd5LkJMT0NLSU5HKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPbiBldmVudCBjYWxsYmFjaywgaW52b2tlZCB3aGVuZXZlciBhbiBldmVudCBpcyByZWNlaXZlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmJvdW5kRXZlbnQgcmVjZWl2ZWQgZXZlbnQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgb25FdmVudChmaW5hbCBJbmJvdW5kU3NlRXZlbnQgaW5ib3VuZEV2ZW50KSB7CisgICAgICAgIHB1Ymxpc2hlci5wdWJsaXNoKGluYm91bmRFdmVudCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgcmVnaXN0ZXIoZmluYWwgQ29uc3VtZXI8SW5ib3VuZFNzZUV2ZW50PiBvbkV2ZW50KSB7CisgICAgICAgIHRoaXMuc3Vic2NyaWJlKERFRkFVTFRfU1VCU0NSSVBUSU9OX0hBTkRMRVIsIG9uRXZlbnQsIERFRkFVTFRfRVJST1JfSEFORExFUiwgKCkgLT4geworICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCByZWdpc3RlcihmaW5hbCBDb25zdW1lcjxJbmJvdW5kU3NlRXZlbnQ+IG9uRXZlbnQsIGZpbmFsIENvbnN1bWVyPFRocm93YWJsZT4gb25FcnJvcikgeworICAgICAgICB0aGlzLnN1YnNjcmliZShERUZBVUxUX1NVQlNDUklQVElPTl9IQU5ETEVSLCBvbkV2ZW50LCBvbkVycm9yLCAoKSAtPiB7CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyKGZpbmFsIENvbnN1bWVyPEluYm91bmRTc2VFdmVudD4gb25FdmVudCwgZmluYWwgQ29uc3VtZXI8VGhyb3dhYmxlPiBvbkVycm9yLCBmaW5hbCBSdW5uYWJsZSBvbkNvbXBsZXRlKSB7CisgICAgICAgIHRoaXMuc3Vic2NyaWJlKERFRkFVTFRfU1VCU0NSSVBUSU9OX0hBTkRMRVIsIG9uRXZlbnQsIG9uRXJyb3IsIG9uQ29tcGxldGUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzdWJzY3JpYmUoZmluYWwgQ29uc3VtZXI8Rmxvdy5TdWJzY3JpcHRpb24+IG9uU3Vic2NyaWJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29uc3VtZXI8SW5ib3VuZFNzZUV2ZW50PiBvbkV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29uc3VtZXI8VGhyb3dhYmxlPiBvbkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUnVubmFibGUgb25Db21wbGV0ZSkgeworICAgICAgICBpZiAob25TdWJzY3JpYmUgPT0gbnVsbCB8fCBvbkV2ZW50ID09IG51bGwgfHwgb25FcnJvciA9PSBudWxsIHx8IG9uQ29tcGxldGUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5QQVJBTVNfTlVMTCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1Ymxpc2hlci5zdWJzY3JpYmUobmV3IEZsb3cuU3Vic2NyaWJlcjxJbmJvdW5kU3NlRXZlbnQ+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1YnNjcmliZShmaW5hbCBGbG93LlN1YnNjcmlwdGlvbiBzdWJzY3JpcHRpb24pIHsKKyAgICAgICAgICAgICAgICBvblN1YnNjcmliZS5hY2NlcHQobmV3IEZsb3cuU3Vic2NyaXB0aW9uKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcmVxdWVzdChmaW5hbCBsb25nIG4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5yZXF1ZXN0KG4pOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNhbmNlbCgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5jYW5jZWwoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uTmV4dChmaW5hbCBJbmJvdW5kU3NlRXZlbnQgaXRlbSkgeworICAgICAgICAgICAgICAgIG9uRXZlbnQuYWNjZXB0KGl0ZW0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoZmluYWwgVGhyb3dhYmxlIHRocm93YWJsZSkgeworICAgICAgICAgICAgICAgIG9uRXJyb3IuYWNjZXB0KHRocm93YWJsZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25Db21wbGV0ZSgpIHsKKyAgICAgICAgICAgICAgICBvbkNvbXBsZXRlLnJ1bigpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvcGVuKCkgeworICAgICAgICBpZiAoIXN0YXRlLmNvbXBhcmVBbmRTZXQoRXZlbnRQcm9jZXNzb3IuU3RhdGUuUkVBRFksIEV2ZW50UHJvY2Vzc29yLlN0YXRlLk9QRU4pKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHN0YXRlLmdldCgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBDTE9TRUQ6CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuRVZFTlRfU09VUkNFX0FMUkVBRFlfQ0xPU0VEKCkpOworICAgICAgICAgICAgICAgIGNhc2UgT1BFTjoKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5FVkVOVF9TT1VSQ0VfQUxSRUFEWV9DT05ORUNURUQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgICAgIEV2ZW50UHJvY2Vzc29yIHByb2Nlc3NvciA9IEV2ZW50UHJvY2Vzc29yCisgICAgICAgICAgICAgICAgLmJ1aWxkZXIoZW5kcG9pbnQsIHN0YXRlLCBjbGllbnRFeGVjdXRvciwgdGhpczo6b25FdmVudCwgdGhpczo6Y2xvc2UpCisgICAgICAgICAgICAgICAgLnJlY29ubmVjdERlbGF5KHJlY29ubmVjdERlbGF5LCByZWNvbm5lY3RUaW1lVW5pdCkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgY2xpZW50RXhlY3V0b3Iuc3VibWl0KHByb2Nlc3Nvcik7CisKKyAgICAgICAgLy8gcmV0dXJuIG9ubHkgYWZ0ZXIgdGhlIGZpcnN0IHJlcXVlc3QgdG8gdGhlIFNTRSBlbmRwb2ludCBoYXMgYmVlbiBtYWRlCisgICAgICAgIHByb2Nlc3Nvci5hd2FpdEZpcnN0Q29udGFjdCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzT3BlbigpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRlLmdldCgpID09IEV2ZW50UHJvY2Vzc29yLlN0YXRlLk9QRU47CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY2xvc2UoZmluYWwgbG9uZyB0aW1lb3V0LCBmaW5hbCBUaW1lVW5pdCB1bml0KSB7CisgICAgICAgIGlmIChzdGF0ZS5nZXRBbmRTZXQoRXZlbnRQcm9jZXNzb3IuU3RhdGUuQ0xPU0VEKSAhPSBFdmVudFByb2Nlc3Nvci5TdGF0ZS5DTE9TRUQpIHsKKyAgICAgICAgICAgIHB1Ymxpc2hlci5jbG9zZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAbGluayBTc2VFdmVudFNvdXJjZS5CdWlsZGVyfSBpbXBsZW1lbnRhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXIgZXh0ZW5kcyBqYXZheC53cy5ycy5zc2UuU3NlRXZlbnRTb3VyY2UuQnVpbGRlciB7CisKKyAgICAgICAgcHJpdmF0ZSBXZWJUYXJnZXQgZW5kcG9pbnQ7CisgICAgICAgIHByaXZhdGUgbG9uZyByZWNvbm5lY3REZWxheSA9IERFRkFVTFRfUkVDT05ORUNUX0RFTEFZOworICAgICAgICBwcml2YXRlIFRpbWVVbml0IHJlY29ubmVjdFRpbWVVbml0ID0gVGltZVVuaXQuTUlMTElTRUNPTkRTOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQnVpbGRlciB0YXJnZXQoZmluYWwgV2ViVGFyZ2V0IGVuZHBvaW50KSB7CisgICAgICAgICAgICB0aGlzLmVuZHBvaW50ID0gZW5kcG9pbnQ7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnVpbGRlciByZWNvbm5lY3RpbmdFdmVyeShmaW5hbCBsb25nIGRlbGF5LCBmaW5hbCBUaW1lVW5pdCB1bml0KSB7CisgICAgICAgICAgICB0aGlzLnJlY29ubmVjdERlbGF5ID0gZGVsYXk7CisgICAgICAgICAgICB0aGlzLnJlY29ubmVjdFRpbWVVbml0ID0gdW5pdDsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBKZXJzZXlTc2VFdmVudFNvdXJjZSBidWlsZCgpIHsKKyAgICAgICAgICAgIGlmIChlbmRwb2ludCBpbnN0YW5jZW9mIEplcnNleVdlYlRhcmdldCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSmVyc2V5U3NlRXZlbnRTb3VyY2UoKEplcnNleVdlYlRhcmdldCkgZW5kcG9pbnQsIHJlY29ubmVjdERlbGF5LCByZWNvbm5lY3RUaW1lVW5pdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuVU5TVVBQT1JURURfV0VCVEFSR0VUX1RZUEUoZW5kcG9pbnQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL3NzZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL3NzZS9pbnRlcm5hbC9Tc2VBdXRvRGlzY292ZXJhYmxlLmphdmEgYi9tZWRpYS9zc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9zc2UvaW50ZXJuYWwvU3NlQXV0b0Rpc2NvdmVyYWJsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkODQ3YjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9zc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9zc2UvaW50ZXJuYWwvU3NlQXV0b0Rpc2NvdmVyYWJsZS5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLmludGVybmFsOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuc3BpLkF1dG9EaXNjb3ZlcmFibGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuc3BpLkZvcmNlZEF1dG9EaXNjb3ZlcmFibGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5Qcm9wZXJ0aWVzSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5Tc2VGZWF0dXJlOworCisvKioKKyAqIEplcnNleSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuc3BpLkF1dG9EaXNjb3ZlcmFibGV9IHJlc3BvbnNpYmxlIGZvciByZWdpc3RlcmluZyB7QGxpbmsgU3NlRmVhdHVyZX0uCisgKgorICogSWYgdGhpcyBmZWF0dXJlIGlzIG5vdCBhbHJlYWR5IHJlZ2lzdGVyZWQgYW5kIHRoZSBwcm9wZXJ0eQorICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5Tc2VGZWF0dXJlI0RJU0FCTEVfU1NFfSBpcyBub3Qgc2V0IHRvIHtAY29kZSB0cnVlfSwgdGhlIHtAY29kZSBTc2VGZWF0dXJlfQorICogd2lsbCBiZSBhdXRvbWF0aWNhbGx5IHJlZ2lzdGVyZWQuCisgKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQcmlvcml0eShBdXRvRGlzY292ZXJhYmxlLkRFRkFVTFRfUFJJT1JJVFkpCitwdWJsaWMgZmluYWwgY2xhc3MgU3NlQXV0b0Rpc2NvdmVyYWJsZSBpbXBsZW1lbnRzIEZvcmNlZEF1dG9EaXNjb3ZlcmFibGUgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShmaW5hbCBGZWF0dXJlQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlnID0gY29udGV4dC5nZXRDb25maWd1cmF0aW9uKCk7CisgICAgICAgIGlmIChjb250ZXh0LmdldENvbmZpZ3VyYXRpb24oKS5pc1JlZ2lzdGVyZWQoU3NlRmVhdHVyZS5jbGFzcykpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghUHJvcGVydGllc0hlbHBlci5nZXRWYWx1ZSgKKyAgICAgICAgICAgICAgICBjb25maWcuZ2V0UHJvcGVydGllcygpLCBjb25maWcuZ2V0UnVudGltZVR5cGUoKSwgU3NlRmVhdHVyZS5ESVNBQkxFX1NTRSwgQm9vbGVhbi5GQUxTRSwgQm9vbGVhbi5jbGFzcywgbnVsbCkpIHsKKyAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoU3NlRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9zc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9zc2UvaW50ZXJuYWwvU3NlQmluZGVyLmphdmEgYi9tZWRpYS9zc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9zc2UvaW50ZXJuYWwvU3NlQmluZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQzYzU0MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3NzZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL3NzZS9pbnRlcm5hbC9Tc2VCaW5kZXIuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmF4LndzLnJzLnNzZS5Tc2U7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5BYnN0cmFjdEJpbmRlcjsKKworLyoqCisgKiBCaW5kcyBpbXBsZW1lbnRhdGlvbnMgdG8gaW50ZXJmYWNlcyBmb3IgaW5qZWN0aW9uIG9mIFNTRS1yZWxhdGVkIGluamVjdGFibGVzLgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFNzZUJpbmRlciBleHRlbmRzIEFic3RyYWN0QmluZGVyIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgIGJpbmQoSmVyc2V5U3NlLmNsYXNzKQorICAgICAgICAgICAgICAgIC50byhTc2UuY2xhc3MpCisgICAgICAgICAgICAgICAgLmluKFNpbmdsZXRvbi5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvc3NlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvc3NlL2ludGVybmFsL1NzZUV2ZW50U2lua1ZhbHVlUGFyYW1Qcm92aWRlci5qYXZhIGIvbWVkaWEvc3NlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvc3NlL2ludGVybmFsL1NzZUV2ZW50U2lua1ZhbHVlUGFyYW1Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2ZTY4ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9zc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9zc2UvaW50ZXJuYWwvU3NlRXZlbnRTaW5rVmFsdWVQYXJhbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5zc2UuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uRnVuY3Rpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuc3NlLlNzZUV2ZW50U2luazsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFzeW5jQ29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwuaW5qZWN0LkFic3RyYWN0VmFsdWVQYXJhbVByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5pbmplY3QuTXVsdGl2YWx1ZWRQYXJhbWV0ZXJFeHRyYWN0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUGFyYW1ldGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuaW50ZXJuYWwuVmFsdWVQYXJhbVByb3ZpZGVyOworCisvKioKKyAqIHtAbGluayBWYWx1ZVBhcmFtUHJvdmlkZXJ9IGZvciBiaW5kaW5nIHtAbGluayBTc2VFdmVudFNpbmt9IHRvIGl0cyBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBTc2VFdmVudFNpbmtWYWx1ZVBhcmFtUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFZhbHVlUGFyYW1Qcm92aWRlciB7CisKKyAgICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyPEFzeW5jQ29udGV4dD4gYXN5bmNDb250ZXh0U3VwcGxpZXI7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtcGVwIG11bHRpdmFsdWVkIG1hcCBwYXJhbWV0ZXIgZXh0cmFjdG9yIHByb3ZpZGVyLgorICAgICAqLworICAgIEBJbmplY3QKKyAgICBwdWJsaWMgU3NlRXZlbnRTaW5rVmFsdWVQYXJhbVByb3ZpZGVyKFByb3ZpZGVyPE11bHRpdmFsdWVkUGFyYW1ldGVyRXh0cmFjdG9yUHJvdmlkZXI+IG1wZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm92aWRlcjxBc3luY0NvbnRleHQ+IGFzeW5jQ29udGV4dFN1cHBsaWVyKSB7CisgICAgICAgIHN1cGVyKG1wZXAsIFBhcmFtZXRlci5Tb3VyY2UuQ09OVEVYVCk7CisgICAgICAgIHRoaXMuYXN5bmNDb250ZXh0U3VwcGxpZXIgPSBhc3luY0NvbnRleHRTdXBwbGllcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgRnVuY3Rpb248Q29udGFpbmVyUmVxdWVzdCwgU3NlRXZlbnRTaW5rPiBjcmVhdGVWYWx1ZVByb3ZpZGVyKFBhcmFtZXRlciBwYXJhbWV0ZXIpIHsKKyAgICAgICAgaWYgKHBhcmFtZXRlciA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIENsYXNzPD8+IHJhd1BhcmFtZXRlclR5cGUgPSBwYXJhbWV0ZXIuZ2V0UmF3VHlwZSgpOworICAgICAgICBpZiAocmF3UGFyYW1ldGVyVHlwZSA9PSBTc2VFdmVudFNpbmsuY2xhc3MgJiYgcGFyYW1ldGVyLmlzQW5ub3RhdGlvblByZXNlbnQoQ29udGV4dC5jbGFzcykpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3NlRXZlbnRTaW5rVmFsdWVTdXBwbGllcihhc3luY0NvbnRleHRTdXBwbGllcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgU3NlRXZlbnRTaW5rVmFsdWVTdXBwbGllciBpbXBsZW1lbnRzIEZ1bmN0aW9uPENvbnRhaW5lclJlcXVlc3QsIFNzZUV2ZW50U2luaz4geworCisgICAgICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXI8QXN5bmNDb250ZXh0PiBhc3luY0NvbnRleHRTdXBwbGllcjsKKworICAgICAgICBwdWJsaWMgU3NlRXZlbnRTaW5rVmFsdWVTdXBwbGllcihQcm92aWRlcjxBc3luY0NvbnRleHQ+IGFzeW5jQ29udGV4dFN1cHBsaWVyKSB7CisgICAgICAgICAgICB0aGlzLmFzeW5jQ29udGV4dFN1cHBsaWVyID0gYXN5bmNDb250ZXh0U3VwcGxpZXI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFNzZUV2ZW50U2luayBhcHBseShDb250YWluZXJSZXF1ZXN0IGNvbnRhaW5lclJlcXVlc3QpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSmVyc2V5RXZlbnRTaW5rKGFzeW5jQ29udGV4dFN1cHBsaWVyKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL3NzZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL3NzZS9wYWNrYWdlLWluZm8uamF2YSBiL21lZGlhL3NzZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL3NzZS9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTZjZThkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvc3NlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvc3NlL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKKy8qKgorICogU3VwcG9ydCBmb3IgU2VydmVyIFNlbnQgZXZlbnRzIGluIEplcnNleS4KKyAqLworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5zc2U7CmRpZmYgLS1naXQgYS9tZWRpYS9zc2Uvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL2phdmF4LndzLnJzLnNzZS5Tc2VFdmVudFNvdXJjZS5CdWlsZGVyIGIvbWVkaWEvc3NlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9qYXZheC53cy5ycy5zc2UuU3NlRXZlbnRTb3VyY2UuQnVpbGRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODdkOWQzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvc3NlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9qYXZheC53cy5ycy5zc2UuU3NlRXZlbnRTb3VyY2UuQnVpbGRlcgpAQCAtMCwwICsxIEBACitvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5zc2UuaW50ZXJuYWwuSmVyc2V5U3NlRXZlbnRTb3VyY2UkQnVpbGRlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvc3NlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5zcGkuRm9yY2VkQXV0b0Rpc2NvdmVyYWJsZSBiL21lZGlhL3NzZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuc3BpLkZvcmNlZEF1dG9EaXNjb3ZlcmFibGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzExMzJlMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3NzZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuc3BpLkZvcmNlZEF1dG9EaXNjb3ZlcmFibGUKQEAgLTAsMCArMSBAQAorb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLmludGVybmFsLlNzZUF1dG9EaXNjb3ZlcmFibGUKZGlmZiAtLWdpdCBhL21lZGlhL3NzZS9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvc3NlL2xvY2FsaXphdGlvbi5wcm9wZXJ0aWVzIGIvbWVkaWEvc3NlL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9zc2UvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhlZTQyYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3NzZS9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvc3NlL2xvY2FsaXphdGlvbi5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMzggQEAKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisjCisjIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyMgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorIyBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyMgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorIworIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyMKKworZXZlbnQuZGF0YS5yZWFkZXIubm90LmZvdW5kPU1lc3NhZ2UgYm9keSByZWFkZXIgbm90IGZvdW5kIGZvciB0aGUgU1NFIGV2ZW50IGRhdGEuCitldmVudC5zb3VyY2Uub3Blbi5jb25uZWN0aW9uLmludGVycnVwdGVkPVdhaXRpbmcgZm9yIG9wZW5pbmcgdGhlIGV2ZW50IHNvdXJjZSBjb25uZWN0aW9uIGhhcyBiZWVuIGludGVycnVwdGVkLgorZXZlbnQuc291cmNlLmFscmVhZHkuY29ubmVjdGVkPVRoaXMgZXZlbnQgc291cmNlIGlzIGFscmVhZHkgb3Blbi4KK2V2ZW50LnNvdXJjZS5hbHJlYWR5LmNsb3NlZD1UaGlzIGV2ZW50IHNvdXJjZSBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZC4KK2V2ZW50LnNvdXJjZS5kZWZhdWx0Lm9uZXJyb3I9U3Vic2NyaWJlci5vbkVycm9yKCkgY2FsbGVkIG9uIHN1YnNjcmliZXIgd2l0aCBubyByZWdpc3RlcmVkIGVycm9yIGhhbmRsZXIuCitldmVudC5zb3VyY2Uuc2h1dGRvd24uaW50ZXJydXB0ZWQ9V2FpdGluZyBmb3IgdGhlIGV2ZW50IHNvdXJjZSBleGVjdXRvciBmb3IgW3swfV0gdG8gc2h1dGRvd24gaGFzIGJlZW4gaW50ZXJydXB0ZWQuCitldmVudC5zb3VyY2Uuc2h1dGRvd24udGltZW91dD1BdHRlbXB0IHRvIHNodXRkb3duIHRoZSBldmVudCBzb3VyY2UgZXhlY3V0b3IgZm9yIFt7MH1dIGhhcyB0aW1lZCBvdXQuCisKK2luLmV2ZW50LnJldHJ5LnBhcnNlLmVycm9yPVVuYWJsZSB0byBwYXJzZSBpbmJvdW5kIGV2ZW50IHJldHJ5IHZhbHVlIFt7MH1dIGFzIGRlY2ltYWwgbnVtYmVyLgorIyB7MH0gLSBmaWVsZCBuYW1lLCB7MX0gLSBmaWVsZCB2YWx1ZQoraW4uZXZlbnQuZmllbGQubm90LnJlY29nbml6ZWQ9SW5ib3VuZCBldmVudCBmaWVsZCBbezB9OiB7MX1dIGlzIG5vdCBhIHJlY29nbml6ZWQgU1NFIGZpZWxkIG5hbWUgYW5kIHdpbGwgYmUgaWdub3JlZC4KKworb3V0LmV2ZW50LmRhdGEubnVsbD1PdXRib3VuZCBldmVudCBkYXRhIG11c3Qgbm90IGJlIGV4cGxpY2l0bHkgc2V0IHRvICdudWxsJy4KK291dC5ldmVudC5tZWRpYS50eXBlLm51bGw9T3V0Ym91bmQgZXZlbnQgZGF0YSBtZWRpYSB0eXBlIG11c3Qgbm90IGJlIGV4cGxpY2l0bHkgc2V0IHRvICdudWxsJy4KK291dC5ldmVudC5kYXRhLnR5cGUubnVsbD1PdXRib3VuZCBldmVudCBkYXRhIHR5cGUgbXVzdCBub3QgYmUgZXhwbGljaXRseSBzZXQgdG8gJ251bGwnLgorb3V0LmV2ZW50Lm5vdC5idWlsZGFibGU9Q2Fubm90IGJ1aWxkIG91dGJvdW5kIGV2ZW50LiBFaXRoZXIgYSBjb21tZW50IG9yIG5vbi1udWxsIGV2ZW50IGRhdGEgbXVzdCBiZSBzZXQuCisKK3BhcmFtLm51bGw9InswfSIgcGFyYW1ldGVyIGlzIG51bGwuCitwYXJhbXMubnVsbD1PbmUgb3IgbW9yZSBvZiBwYXJhbWV0ZXJzIGlzIG51bGwuCitldmVudC5zaW5rLmNsb3NlLmZhaWxlZD1DbG9zaW5nIEV2ZW50U2luayBmYWlsZWQuIENvdWxkIG5vdCBjbG9zZSBjaHVua2VkIG91dHB1dC4KK3Vuc3VwcG9ydGVkLndlYnRhcmdldC50eXBlPUFyZ3VtZW50IHswfSBpcyBub3QgYSB2YWxpZCBKZXJzZXlXZWJUYXJnZXQgaW5zdGFuY2UuIFNzZUV2ZW50U291cmNlIGRvZXMgbm90IHN1cHBvcnQgb3RoZXIgXAorICBXZWJUYXJnZXQgaW1wbGVtZW50YXRpb25zLgpkaWZmIC0tZ2l0IGEvbWVkaWEvc3NlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvc3NlL0NsaWVudENsb3NlVGVzdC5qYXZhIGIvbWVkaWEvc3NlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvc3NlL0NsaWVudENsb3NlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYzc5MjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9zc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9zc2UvQ2xpZW50Q2xvc2VUZXN0LmphdmEKQEAgLTAsMCArMSwxMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkludFN0cmVhbTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlLmFzc2VydFRydWU7CisKKy8qKgorICogQGF1dGhvciBQZXRyIEphbm91Y2ggKHBldHIuamFub3VjaCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQ2xpZW50Q2xvc2VUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGVzdCB0ZXN0IHRoYXQgU1NFIGNvbm5lY3Rpb24gaXMgcmVhbGx5IGNsb3NlZCB3aGVuIEV2ZW50U291cmNlLmNsb3NlKCkgaXMgY2FsbGVkLgorICAgICAqIDxwLz4KKyAgICAgKiBUaGlzIHRlc3QgaXMgdmVyeSBIdHRwVVJMQ29ubmVjdGlvbiBhbmQgR3JpenpseSBzZXJ2ZXIgc3BlY2lmaWMsIHNvIGl0IHdpbGwgcHJvYmFibHkgZmFpbCwgaWYgb3RoZXIgY2xpZW50IGFuZCBzZXJ2ZXIKKyAgICAgKiB0cmFuc3BvcnQgYXJlIHVzZWQuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2UoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBXZWJUYXJnZXQgc3NlVGFyZ2V0ID0gdGFyZ2V0KCJzc2UiKTsKKworICAgICAgICBDb3VudERvd25MYXRjaCBldmVudExhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDMpOworICAgICAgICBDb3VudERvd25MYXRjaCBldmVudExhdGNoMiA9IG5ldyBDb3VudERvd25MYXRjaCg0KTsKKyAgICAgICAgRXZlbnRTb3VyY2UgZXZlbnRTb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2Uoc3NlVGFyZ2V0KSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXZlbnQoZmluYWwgSW5ib3VuZEV2ZW50IGluYm91bmRFdmVudCkgeworICAgICAgICAgICAgICAgIGV2ZW50TGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgZXZlbnRMYXRjaDIuY291bnREb3duKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgLy8gU2VydmVyIHNlbmRzIDMgZXZlbnRzIHdlIGFyZSBpbnRlcmVzdGVkIGluLgorICAgICAgICBJbnRTdHJlYW0ucmFuZ2UoMCwgMykuZm9yRWFjaCgoaSkgLT4gYXNzZXJ0RXF1YWxzKCJPSyIsCisgICAgICAgICAgICAgICAgdGFyZ2V0KCJzc2Uvc2VuZCIpLnJlcXVlc3QoKS5nZXQoKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShldmVudExhdGNoLmF3YWl0KDUsIFRpbWVVbml0LlNFQ09ORFMpKTsKKworICAgICAgICAvLyBBZnRlciByZWNlaXZpbmcgdGhlIDMgZXZlbnRzLCB3ZSB0cnkgdG8gY2xvc2UuCisgICAgICAgIGV2ZW50U291cmNlLmNsb3NlKCk7CisKKyAgICAgICAgLy8gVW5mb3J0dW5hdGVseSB0aGUgSFRUUFVSTENvbm5lY3Rpb24gaXMgYmxvY2tlZCBpbiByZWFkKCkgbWV0aG9kLCBzbyBpdCB3aWxsIGNsb3NlIG9ubHkgYWZ0ZXIgcmVjZWl2aW5nIHRoZSBuZXh0IGV2ZW50LgorICAgICAgICBhc3NlcnRFcXVhbHMoIk9LIiwgdGFyZ2V0KCJzc2Uvc2VuZCIpLnJlcXVlc3QoKS5nZXQoKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICAvLyBXYWl0IGZvciB0aGUgZXZlbnQgdGhhdCB3aWxsIHVuYmxvY2sgdGhlIEhUVFBVUkxDb25uZWN0aW9uIGFuZCByZXN1bHQgaW4gc2VuZGluZyBGSU4uCisgICAgICAgIGFzc2VydFRydWUoZXZlbnRMYXRjaDIuYXdhaXQoNSwgVGltZVVuaXQuU0VDT05EUykpOworICAgICAgICAvLyBOb3cgaXQgaXMgaW50ZXJlc3RpbmcuIENsaWVudCBoYXMgc2VudCBGSU4sIGJ1dCBHcml6emx5IGRvZXMgbm90IGxpc3RlbiBmb3IgY2xpZW50IGlucHV0IChzZWxlY3RvciBSRUFEIGtleSBpcworICAgICAgICAvLyBkaXNhYmxlZCksIHdoaWxlIHN0cmVhbWluZyB0aGUgcmVzcG9uc2UuIEZvciBzb21lIHJlYXNvbiB3ZSBuZWVkIHRvIHNlbmQgMiBtb3JlIGV2ZW50cyBmb3IgR3JpenpseSB0byBub3RpY2UKKyAgICAgICAgLy8gdGhhdCB0aGUgY2xpZW50IGlzIGdvbmUuCisgICAgICAgIGFzc2VydEVxdWFscygiT0siLCB0YXJnZXQoInNzZS9zZW5kIikucmVxdWVzdCgpLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiT0siLCB0YXJnZXQoInNzZS9zZW5kIikucmVxdWVzdCgpLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGkgKyAiOiAiICsgdGFyZ2V0KCJzc2Uvc2VuZCIpLnJlcXVlc3QoKS5nZXQoKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICB9CisgICAgICAgIC8vIE5vdyB0aGUgZ3JpenpseSBzaG91bGQgbm90aWNlIHRoYXQgdGhlIFNTRSBjb25uZWN0aW9uIGlzIGZpbmFsbHkgZGVhZCBhbmQgc2VuZGluZyBldmVudHMgZnJvbSB0aGUgc2VydmVyIHdpbGwgZmFpbC4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJOT0siLCB0YXJnZXQoInNzZS9zZW5kIikucmVxdWVzdCgpLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhTc2VFbmRwb2ludC5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKFNzZUZlYXR1cmUuY2xhc3MpOworICAgIH0KKworICAgIEBTaW5nbGV0b24KKyAgICBAUGF0aCgic3NlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNzZUVuZHBvaW50IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIEV2ZW50T3V0cHV0IGV2ZW50T3V0cHV0ID0gbmV3IEV2ZW50T3V0cHV0KCk7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgic2VuZCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgc2VuZEV2ZW50KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIE91dGJvdW5kRXZlbnQgZXZlbnQgPSBuZXcgT3V0Ym91bmRFdmVudC5CdWlsZGVyKCkuZGF0YSgiQW4gZXZlbnQiKS5idWlsZCgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoZXZlbnRPdXRwdXQuaXNDbG9zZWQoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gIk5PSyI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZXZlbnRPdXRwdXQud3JpdGUoZXZlbnQpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHJldHVybiAiTk9LIjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuICJPSyI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcyhTc2VGZWF0dXJlLlNFUlZFUl9TRU5UX0VWRU5UUykKKyAgICAgICAgcHVibGljIEV2ZW50T3V0cHV0IGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBldmVudE91dHB1dDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL3NzZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL3NzZS9FbXB0eUV2ZW50c1Rlc3QuamF2YSBiL21lZGlhL3NzZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL3NzZS9FbXB0eUV2ZW50c1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDA1Nzc3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvc3NlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvc3NlL0VtcHR5RXZlbnRzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTU5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZTsKKworaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBUZXN0cyBoYW5kbGluZyBvZiBlbXB0eSBTU0UgZXZlbnRzLgorICovCitwdWJsaWMgY2xhc3MgRW1wdHlFdmVudHNUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFNzZVRlc3RSZXNvdXJjZS5jbGFzcywgU3NlRmVhdHVyZS5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKFNzZUZlYXR1cmUuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIGEgc2l0dWF0aW9uIHdoZW4gMiBub24tZW1wdHkgU1NFIGV2ZW50cyBhcmUgc2VwYXJhdGVkIHdpdGggYW4gZW1wdHkgb25lLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdDFFbXB0eUV2ZW50KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZG9UZXN0KCJzc2UvMSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIGEgc2l0dWF0aW9uIHdoZW4gMiBub24tZW1wdHkgU1NFIGV2ZW50cyBhcmUgc2VwYXJhdGVkIHdpdGggMiBlbXB0eSBvbmVzLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdDJFbXB0eUV2ZW50cygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGRvVGVzdCgic3NlLzIiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBhIHNpdHVhdGlvbiB3aGVuIDIgbm9uLWVtcHR5IFNTRSBldmVudHMgYXJlIHNlcGFyYXRlZCB3aXRoIDMgZW1wdHkgb25lcy4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3QzRW1wdHlFdmVudHMoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBkb1Rlc3QoInNzZS8zIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGRvVGVzdChTdHJpbmcgdGFyZ2V0KSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBMaXN0PFN0cmluZz4gcmVjZWl2ZWROYW1lcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBMaXN0PFN0cmluZz4gcmVjZWl2ZWREYXRhID0gbmV3IExpbmtlZExpc3Q8PigpOworCisgICAgICAgIFdlYlRhcmdldCBzc2VUYXJnZXQgPSB0YXJnZXQodGFyZ2V0KTsKKyAgICAgICAgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMik7CisgICAgICAgIG5ldyBFdmVudFNvdXJjZShzc2VUYXJnZXQpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25FdmVudChJbmJvdW5kRXZlbnQgaW5ib3VuZEV2ZW50KSB7CisgICAgICAgICAgICAgICAgcmVjZWl2ZWROYW1lcy5hZGQoaW5ib3VuZEV2ZW50LmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZWREYXRhLmFkZChuZXcgU3RyaW5nKGluYm91bmRFdmVudC5nZXRSYXdEYXRhKCksICJBU0NJSSIpKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBhc3NlcnRUcnVlKGxhdGNoLmF3YWl0KDUsIFRpbWVVbml0LlNFQ09ORFMpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZWNlaXZlZE5hbWVzLmNvbnRhaW5zKCJlMSIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZWNlaXZlZE5hbWVzLmNvbnRhaW5zKCJlMiIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZWNlaXZlZERhdGEuY29udGFpbnMoImQxIikpOworICAgICAgICBhc3NlcnRUcnVlKHJlY2VpdmVkRGF0YS5jb250YWlucygiZDIiKSk7CisgICAgfQorCisgICAgQFBhdGgoIi9zc2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3NlVGVzdFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCIvMSIpCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9ldmVudC1zdHJlYW07Y2hhcnNldD11dGYtOCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgc2VuZDFFbXB0eUV2ZW50KCkgeworICAgICAgICAgICAgcmV0dXJuICJldmVudDogZTFcclxuIgorICAgICAgICAgICAgICAgICAgICArICJkYXRhOiBkMVxyXG4iCisgICAgICAgICAgICAgICAgICAgICsgIlxyXG4iCisgICAgICAgICAgICAgICAgICAgIC8vIGVuZCBvZiBlMQorICAgICAgICAgICAgICAgICAgICArICJcclxuIgorICAgICAgICAgICAgICAgICAgICAvLyBlbmQgb2YgYW4gZW1wdHkgZXZlbnQKKyAgICAgICAgICAgICAgICAgICAgKyAiZXZlbnQ6IGUyXHJcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiZGF0YTogZDJcclxuIgorICAgICAgICAgICAgICAgICAgICArICJcclxuIjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIi8yIikKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L2V2ZW50LXN0cmVhbTtjaGFyc2V0PXV0Zi04IikKKyAgICAgICAgcHVibGljIFN0cmluZyBzZW5kMkVtcHR5RXZlbnRzKCkgeworICAgICAgICAgICAgcmV0dXJuICJldmVudDogZTFcclxuIgorICAgICAgICAgICAgICAgICAgICArICJkYXRhOiBkMVxyXG4iCisgICAgICAgICAgICAgICAgICAgICsgIlxyXG4iCisgICAgICAgICAgICAgICAgICAgIC8vIGVuZCBvZiBlMQorICAgICAgICAgICAgICAgICAgICArICJcclxuIgorICAgICAgICAgICAgICAgICAgICAvLyBlbmQgb2YgYW4gZW1wdHkgZXZlbnQKKyAgICAgICAgICAgICAgICAgICAgKyAiXHJcbiIKKyAgICAgICAgICAgICAgICAgICAgLy8gZW5kIG9mIGFuIGVtcHR5IGV2ZW50CisgICAgICAgICAgICAgICAgICAgICsgImV2ZW50OiBlMlxyXG4iCisgICAgICAgICAgICAgICAgICAgICsgImRhdGE6IGQyXHJcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiXHJcbiI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCIvMyIpCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9ldmVudC1zdHJlYW07Y2hhcnNldD11dGYtOCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgc2VuZDNFbXB0eUV2ZW50cygpIHsKKyAgICAgICAgICAgIHJldHVybiAiZXZlbnQ6IGUxXHJcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiZGF0YTogZDFcclxuIgorICAgICAgICAgICAgICAgICAgICArICJcclxuIgorICAgICAgICAgICAgICAgICAgICAvLyBlbmQgb2YgZTEKKyAgICAgICAgICAgICAgICAgICAgKyAiXHJcbiIKKyAgICAgICAgICAgICAgICAgICAgLy8gZW5kIG9mIGFuIGVtcHR5IGV2ZW50CisgICAgICAgICAgICAgICAgICAgICsgIlxyXG4iCisgICAgICAgICAgICAgICAgICAgIC8vIGVuZCBvZiBhbiBlbXB0eSBldmVudAorICAgICAgICAgICAgICAgICAgICArICJcclxuIgorICAgICAgICAgICAgICAgICAgICAvLyBlbmQgb2YgYW4gZW1wdHkgZXZlbnQKKyAgICAgICAgICAgICAgICAgICAgKyAiZXZlbnQ6IGUyXHJcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiZGF0YTogZDJcclxuIgorICAgICAgICAgICAgICAgICAgICArICJcclxuIjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL3NzZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL3NzZS9FdmVudFNvdXJjZVRlc3QuamF2YSBiL21lZGlhL3NzZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL3NzZS9FdmVudFNvdXJjZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWI2ZGU1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvc3NlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvc3NlL0V2ZW50U291cmNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTEVuY29kZXI7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZS5hc3NlcnRUcnVlOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBFdmVudFNvdXJjZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBRVUVSWSA9ICIhQCMkJV4mKCkiOworCisgICAgLyoqCisgICAgICogVGhlIHRlc3QgdGVzdCB0aGF0IFNTRSBjb25uZWN0aW9uIGlzIHJlYWxseSBjbG9zZWQgd2hlbiBFdmVudFNvdXJjZS5jbG9zZSgpIGlzIGNhbGxlZC4KKyAgICAgKiA8cC8+CisgICAgICogVGhpcyB0ZXN0IGlzIHZlcnkgSHR0cFVSTENvbm5lY3Rpb24gYW5kIEdyaXp6bHkgc2VydmVyIHNwZWNpZmljLCBzbyBpdCB3aWxsIHByb2JhYmx5IGZhaWwsIGlmIG90aGVyIGNsaWVudCBhbmQgc2VydmVyCisgICAgICogdHJhbnNwb3J0IGFyZSB1c2VkLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRocmVhZE5hbWUoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBXZWJUYXJnZXQgc3NlVGFyZ2V0ID0gdGFyZ2V0KCJzc2UiKS5xdWVyeVBhcmFtKCJ0ZXN0IiwgUVVFUlkpOworCisgICAgICAgIENvdW50RG93bkxhdGNoIGV2ZW50TGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgIEV2ZW50U291cmNlIGV2ZW50U291cmNlID0gbmV3IEV2ZW50U291cmNlKHNzZVRhcmdldCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkV2ZW50KGZpbmFsIEluYm91bmRFdmVudCBpbmJvdW5kRXZlbnQpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lLmNvbnRhaW5zKFVSTEVuY29kZXIuZW5jb2RlKFFVRVJZLCAiQVNDSUkiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIk9LIiwgdGFyZ2V0KCJzc2Uvc2VuZCIpLnJlcXVlc3QoKS5nZXQoKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnRUcnVlKGV2ZW50TGF0Y2guYXdhaXQoNSwgVGltZVVuaXQuU0VDT05EUykpOworCisgICAgICAgIC8vIEFmdGVyIHJlY2VpdmluZyB0aGUgMyBldmVudHMsIHdlIHRyeSB0byBjbG9zZS4KKyAgICAgICAgZXZlbnRTb3VyY2UuY2xvc2UoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKENsaWVudENsb3NlVGVzdC5Tc2VFbmRwb2ludC5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKFNzZUZlYXR1cmUuY2xhc3MpOworICAgIH0KKworICAgIEBTaW5nbGV0b24KKyAgICBAUGF0aCgic3NlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNzZUVuZHBvaW50IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIEV2ZW50T3V0cHV0IGV2ZW50T3V0cHV0ID0gbmV3IEV2ZW50T3V0cHV0KCk7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgic2VuZCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgc2VuZEV2ZW50KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIE91dGJvdW5kRXZlbnQgZXZlbnQgPSBuZXcgT3V0Ym91bmRFdmVudC5CdWlsZGVyKCkuZGF0YSgiQW4gZXZlbnQiKS5idWlsZCgpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoZXZlbnRPdXRwdXQuaXNDbG9zZWQoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gIk5PSyI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZXZlbnRPdXRwdXQud3JpdGUoZXZlbnQpOworICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHJldHVybiAiTk9LIjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuICJPSyI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcyhTc2VGZWF0dXJlLlNFUlZFUl9TRU5UX0VWRU5UUykKKyAgICAgICAgcHVibGljIEV2ZW50T3V0cHV0IGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBldmVudE91dHB1dDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL3NzZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL3NzZS9JbmJvdW5kRXZlbnRSZWFkZXJUZXN0LmphdmEgYi9tZWRpYS9zc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9zc2UvSW5ib3VuZEV2ZW50UmVhZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNTIyYWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9zc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9zc2UvSW5ib3VuZEV2ZW50UmVhZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQ2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZTsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKKworaW1wb3J0IGphdmF4LndzLnJzLlJ1bnRpbWVUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkFic3RyYWN0QmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5CaW5kaW5nczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uTXVsdGl2YWx1ZWRTdHJpbmdNYXA7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5NZXNzYWdlQm9keVdvcmtlcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5NZXNzYWdlQm9keUZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5NZXNzYWdpbmdCaW5kZXJzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1vZGVsLmludGVybmFsLkNvbW1vbkNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb2RlbC5pbnRlcm5hbC5Db21wb25lbnRCYWc7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworcHVibGljIGNsYXNzIEluYm91bmRFdmVudFJlYWRlclRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTXVsdGl2YWx1ZWRTdHJpbmdNYXAgSEVBREVSUzsKKworICAgIHByaXZhdGUgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyOworCisgICAgc3RhdGljIHsKKyAgICAgICAgSEVBREVSUyA9IG5ldyBNdWx0aXZhbHVlZFN0cmluZ01hcCgpOworICAgICAgICBIRUFERVJTLnB1dCgiVHJhbnNmZXItRW5jb2RpbmciLCBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCJjaHVua2VkIikpOworICAgICAgICBIRUFERVJTLnB1dCgiQ29udGVudC1UeXBlIiwgQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCgidGV4dC9ldmVudC1zdHJlYW0iKSk7CisgICAgfQorCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldHVwKCkgeworICAgICAgICBpbmplY3Rpb25NYW5hZ2VyID0gSW5qZWN0aW9ucy5jcmVhdGVJbmplY3Rpb25NYW5hZ2VyKCk7CisgICAgICAgIGluamVjdGlvbk1hbmFnZXIucmVnaXN0ZXIobmV3IFRlc3RCaW5kZXIoKSk7CisKKyAgICAgICAgTWVzc2FnZUJvZHlGYWN0b3J5IG1lc3NhZ2VCb2R5RmFjdG9yeSA9CisgICAgICAgICAgICAgICAgbmV3IE1lc3NhZ2VCb2R5RmFjdG9yeShuZXcgQ29tbW9uQ29uZmlnKFJ1bnRpbWVUeXBlLlNFUlZFUiwgQ29tcG9uZW50QmFnLkVYQ0xVREVfRU1QVFkpKTsKKworICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyKEJpbmRpbmdzLnNlcnZpY2UobWVzc2FnZUJvZHlGYWN0b3J5KS50byhNZXNzYWdlQm9keVdvcmtlcnMuY2xhc3MpKTsKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5jb21wbGV0ZVJlZ2lzdHJhdGlvbigpOworCisgICAgICAgIG1lc3NhZ2VCb2R5RmFjdG9yeS5pbml0aWFsaXplKGluamVjdGlvbk1hbmFnZXIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRXaXRoU3RhcnRzV2l0aExGKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEluYm91bmRFdmVudCBldmVudCA9IHBhcnNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgiXG5ldmVudDogY3VzdG9tLW1lc3NhZ2UiLmdldEJ5dGVzKCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjdXN0b20tbWVzc2FnZSIsIGV2ZW50LmdldE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBldmVudC5nZXRSYXdEYXRhKCkubGVuZ3RoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkV2l0aFN0YXJ0c1dpdGhDUigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJbmJvdW5kRXZlbnQgZXZlbnQgPSBwYXJzZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oIlxyZXZlbnQ6IGN1c3RvbS1tZXNzYWdlIi5nZXRCeXRlcygpKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY3VzdG9tLW1lc3NhZ2UiLCBldmVudC5nZXROYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgZXZlbnQuZ2V0UmF3RGF0YSgpLmxlbmd0aCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZFdpdGhMRigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgiZXZlbnQ6IGN1c3RvbS1tZXNzYWdlXG5kYXRhOiBtZXNzYWdlIDEiLmdldEJ5dGVzKCkpOworICAgICAgICBJbmJvdW5kRXZlbnQgZXZlbnQgPSBwYXJzZShpbnB1dFN0cmVhbSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY3VzdG9tLW1lc3NhZ2UiLCBldmVudC5nZXROYW1lKCkpOworICAgICAgICBhc3NlcnREYXRhRXF1YWxzKCJtZXNzYWdlIDEiLCBldmVudCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZFdpdGhDUkxGKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKCJldmVudDogY3VzdG9tLW1lc3NhZ2VcclxuZGF0YTogbWVzc2FnZSAxIi5nZXRCeXRlcygpKTsKKyAgICAgICAgSW5ib3VuZEV2ZW50IGV2ZW50ID0gcGFyc2UoaW5wdXRTdHJlYW0pOworICAgICAgICBhc3NlcnRFcXVhbHMoImN1c3RvbS1tZXNzYWdlIiwgZXZlbnQuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RGF0YUVxdWFscygibWVzc2FnZSAxIiwgZXZlbnQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRXaXRoQ1IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oImV2ZW50OiBjdXN0b20tbWVzc2FnZVxyZGF0YTogbWVzc2FnZSAxIi5nZXRCeXRlcygpKTsKKyAgICAgICAgSW5ib3VuZEV2ZW50IGV2ZW50ID0gcGFyc2UoaW5wdXRTdHJlYW0pOworICAgICAgICBhc3NlcnRFcXVhbHMoImN1c3RvbS1tZXNzYWdlIiwgZXZlbnQuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RGF0YUVxdWFscygibWVzc2FnZSAxIiwgZXZlbnQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRXaXRoTXVsdGlwbGVTcGFjZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oImV2ZW50OiAgICAgY3VzdG9tLW1lc3NhZ2VccmRhdGE6ICAgbWVzc2FnZSAxIi5nZXRCeXRlcygpKTsKKyAgICAgICAgSW5ib3VuZEV2ZW50IGV2ZW50ID0gcGFyc2UoaW5wdXRTdHJlYW0pOworICAgICAgICBhc3NlcnRFcXVhbHMoImN1c3RvbS1tZXNzYWdlIiwgZXZlbnQuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RGF0YUVxdWFscygibWVzc2FnZSAxIiwgZXZlbnQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRXaXRoTXVsdGlwbGVFbmRpbmdEZWxpbWl0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oImV2ZW50OiBjdXN0b20tbWVzc2FnZVxyZGF0YTogbWVzc2FnZSAxXHIiLmdldEJ5dGVzKCkpOworICAgICAgICBJbmJvdW5kRXZlbnQgZXZlbnQgPSBwYXJzZShpbnB1dFN0cmVhbSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY3VzdG9tLW1lc3NhZ2UiLCBldmVudC5nZXROYW1lKCkpOworICAgICAgICBhc3NlcnREYXRhRXF1YWxzKCJtZXNzYWdlIDEiLCBldmVudCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBJbmJvdW5kRXZlbnQgcGFyc2UoSW5wdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShJbmJvdW5kRXZlbnRSZWFkZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlYWRGcm9tKEluYm91bmRFdmVudC5jbGFzcywgSW5ib3VuZEV2ZW50LmNsYXNzLCBuZXcgQW5ub3RhdGlvblswXSwKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUudmFsdWVPZihTc2VGZWF0dXJlLlNFUlZFUl9TRU5UX0VWRU5UUyksIEhFQURFUlMsIHN0cmVhbSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydERhdGFFcXVhbHMoZmluYWwgU3RyaW5nIGV4cGVjdGVkRGF0YSwgZmluYWwgSW5ib3VuZEV2ZW50IGV2ZW50KSB7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZERhdGEsIGV2ZW50LnJlYWREYXRhKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWREYXRhLCBuZXcgU3RyaW5nKGV2ZW50LmdldFJhd0RhdGEoKSwgQ2hhcnNldC5kZWZhdWx0Q2hhcnNldCgpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGVzdEJpbmRlciBleHRlbmRzIEFic3RyYWN0QmluZGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICAgICAgaW5zdGFsbChuZXcgTWVzc2FnaW5nQmluZGVycy5NZXNzYWdlQm9keVByb3ZpZGVycyhudWxsLCBSdW50aW1lVHlwZS5TRVJWRVIpKTsKKyAgICAgICAgICAgIGJpbmRBc0NvbnRyYWN0KEluYm91bmRFdmVudFJlYWRlci5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9zc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9zc2UvT3V0Ym91bmRFdmVudFRlc3QuamF2YSBiL21lZGlhL3NzZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL3NzZS9PdXRib3VuZEV2ZW50VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzODgyN2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9zc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9zc2UvT3V0Ym91bmRFdmVudFRlc3QuamF2YQpAQCAtMCwwICsxLDEzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5zc2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY1R5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlJlZmxlY3Rpb25IZWxwZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCisvKioKKyAqIEJhc2ljIHNldCBvZiB1bml0IHRlc3RzIGZvciBPdXRib3VuZEV2ZW50IGNyZWF0aW9uLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBPdXRib3VuZEV2ZW50VGVzdCB7CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q29tbW9uRmllbGRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE91dGJvdW5kRXZlbnQgZXZlbnQ7CisKKyAgICAgICAgZXZlbnQgPSBuZXcgT3V0Ym91bmRFdmVudC5CdWlsZGVyKCkuaWQoImlkIikubmFtZSgibmFtZSIpLmRhdGEoImRhdGEiKS5idWlsZCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImlkIiwgZXZlbnQuZ2V0SWQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygibmFtZSIsIGV2ZW50LmdldE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZGF0YSIsIGV2ZW50LmdldERhdGEoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFLCBldmVudC5nZXRNZWRpYVR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTc2VGZWF0dXJlLlJFQ09OTkVDVF9OT1RfU0VULCBldmVudC5nZXRSZWNvbm5lY3REZWxheSgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoZXZlbnQuaXNSZWNvbm5lY3REZWxheVNldCgpKTsKKworICAgICAgICBldmVudCA9IG5ldyBPdXRib3VuZEV2ZW50LkJ1aWxkZXIoKS5tZWRpYVR5cGUoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSkuZGF0YSgiZGF0YSIpLmJ1aWxkKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFLCBldmVudC5nZXRNZWRpYVR5cGUoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgT3V0Ym91bmRFdmVudC5CdWlsZGVyKCkubWVkaWFUeXBlKG51bGwpOworICAgICAgICAgICAgZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhwZWN0ZWQgd2hlbiBzZXR0aW5nIG51bGwgbWVkaWFUeXBlLiIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gc3VjY2VzcworICAgICAgICB9CisKKyAgICAgICAgZXZlbnQgPSBuZXcgT3V0Ym91bmRFdmVudC5CdWlsZGVyKCkucmVjb25uZWN0RGVsYXkoLTEwMDApLmRhdGEoImRhdGEiKS5idWlsZCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoU3NlRmVhdHVyZS5SRUNPTk5FQ1RfTk9UX1NFVCwgZXZlbnQuZ2V0UmVjb25uZWN0RGVsYXkoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGV2ZW50LmlzUmVjb25uZWN0RGVsYXlTZXQoKSk7CisKKyAgICAgICAgZXZlbnQgPSBuZXcgT3V0Ym91bmRFdmVudC5CdWlsZGVyKCkucmVjb25uZWN0RGVsYXkoMTAwMCkuZGF0YSgiZGF0YSIpLmJ1aWxkKCk7CisgICAgICAgIGFzc2VydEVxdWFscygxMDAwLCBldmVudC5nZXRSZWNvbm5lY3REZWxheSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShldmVudC5pc1JlY29ubmVjdERlbGF5U2V0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldENvbW1lbnRPckRhdGEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb21tZW50IiwgbmV3IE91dGJvdW5kRXZlbnQuQnVpbGRlcigpLmNvbW1lbnQoImNvbW1lbnQiKS5idWlsZCgpLmdldENvbW1lbnQoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJkYXRhIiwgbmV3IE91dGJvdW5kRXZlbnQuQnVpbGRlcigpLmRhdGEoImRhdGEiKS5idWlsZCgpLmdldERhdGEoKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBPdXRib3VuZEV2ZW50LkJ1aWxkZXIoKS5kYXRhKG51bGwpOworICAgICAgICAgICAgZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhwZWN0ZWQgd2hlbiBzZXR0aW5nIG51bGwgZGF0YSBvciBkYXRhIHR5cGUuIik7CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBzdWNjZXNzCisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBPdXRib3VuZEV2ZW50LkJ1aWxkZXIoKS5kYXRhKChDbGFzcykgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiBleHBlY3RlZCB3aGVuIHNldHRpbmcgbnVsbCBkYXRhIG9yIGRhdGEgdHlwZS4iKTsKKyAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIHN1Y2Nlc3MKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IE91dGJvdW5kRXZlbnQuQnVpbGRlcigpLmRhdGEoKEdlbmVyaWNUeXBlKSBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIGZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIGV4cGVjdGVkIHdoZW4gc2V0dGluZyBudWxsIGRhdGEgb3IgZGF0YSB0eXBlLiIpOworICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gc3VjY2VzcworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG5ldyBPdXRib3VuZEV2ZW50LkJ1aWxkZXIoKS5idWlsZCgpOworICAgICAgICAgICAgZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHdoZW4gYnVpbGRpbmcgZXZlbnQgd2l0aCBubyBjb21tZW50IG9yIGRhdGEuIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gc3VjY2VzcworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGF0YVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgT3V0Ym91bmRFdmVudCBldmVudDsKKworICAgICAgICBldmVudCA9IG5ldyBPdXRib3VuZEV2ZW50LkJ1aWxkZXIoKS5kYXRhKCJkYXRhIikuYnVpbGQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5jbGFzcywgZXZlbnQuZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5jbGFzcywgZXZlbnQuZ2V0R2VuZXJpY1R5cGUoKSk7CisKKyAgICAgICAgZmluYWwgR2VuZXJpY0VudGl0eTxBcnJheUxpc3Q8U3RyaW5nPj4gZGF0YSA9IG5ldyBHZW5lcmljRW50aXR5PEFycmF5TGlzdDxTdHJpbmc+PihuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSkgeworICAgICAgICB9OworICAgICAgICBldmVudCA9IG5ldyBPdXRib3VuZEV2ZW50LkJ1aWxkZXIoKS5kYXRhKGRhdGEpLmJ1aWxkKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheUxpc3QuY2xhc3MsIGV2ZW50LmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheUxpc3QuY2xhc3MsIFJlZmxlY3Rpb25IZWxwZXIuZXJhc3VyZShldmVudC5nZXRHZW5lcmljVHlwZSgpKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhkYXRhLmdldFR5cGUoKSwgZXZlbnQuZ2V0R2VuZXJpY1R5cGUoKSk7CisKKworICAgICAgICAvLyBkYXRhIHBhcnQgc2V0IHRvIGFuIGFyYml0cmFyeSBpbnN0YW5jZSBhcyBpdCBpcyBpcnJlbGV2YW50IGZvciB0aGUgdGVzdAorICAgICAgICBldmVudCA9IG5ldyBPdXRib3VuZEV2ZW50LkJ1aWxkZXIoKS5kYXRhKEludGVnZXIuY2xhc3MsICJkYXRhIikuYnVpbGQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVnZXIuY2xhc3MsIGV2ZW50LmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhJbnRlZ2VyLmNsYXNzLCBldmVudC5nZXRHZW5lcmljVHlwZSgpKTsKKworICAgICAgICAvLyBkYXRhIHBhcnQgc2V0IHRvIGFuIGFyYml0cmFyeSBpbnN0YW5jZSBhcyBpdCBpcyBpcnJlbGV2YW50IGZvciB0aGUgdGVzdAorICAgICAgICBldmVudCA9IG5ldyBPdXRib3VuZEV2ZW50LkJ1aWxkZXIoKS5kYXRhKG5ldyBHZW5lcmljVHlwZTxBcnJheUxpc3Q8U3RyaW5nPj4oKSB7CisgICAgICAgIH0sICJkYXRhIikuYnVpbGQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5TGlzdC5jbGFzcywgZXZlbnQuZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5TGlzdC5jbGFzcywgUmVmbGVjdGlvbkhlbHBlci5lcmFzdXJlKGV2ZW50LmdldEdlbmVyaWNUeXBlKCkpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBHZW5lcmljRW50aXR5PEFycmF5TGlzdDxTdHJpbmc+PihuZXcgQXJyYXlMaXN0PFN0cmluZz4oKSkgeworICAgICAgICB9LmdldFR5cGUoKSwgZXZlbnQuZ2V0R2VuZXJpY1R5cGUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvc3NlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvc3NlL1NzZUV2ZW50U2lua0Nsb3NlVGVzdC5qYXZhIGIvbWVkaWEvc3NlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvc3NlL1NzZUV2ZW50U2lua0Nsb3NlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ODY5OWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9zc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9zc2UvU3NlRXZlbnRTaW5rQ2xvc2VUZXN0LmphdmEKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuc3NlLk91dGJvdW5kU3NlRXZlbnQ7CitpbXBvcnQgamF2YXgud3MucnMuc3NlLlNzZTsKK2ltcG9ydCBqYXZheC53cy5ycy5zc2UuU3NlRXZlbnRTaW5rOworaW1wb3J0IGphdmF4LndzLnJzLnNzZS5Tc2VFdmVudFNvdXJjZTsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogVGVzdCwgdGhhdCB7QGNvZGUgU3NlRXZlbnRTaW5rfSBhbmQgdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkIGV2ZW50dWFsbHkgYWZ0ZXIgY2xvc2luZyB7QGNvZGUgU3NlRXZlbnRTb3VyY2V9IG9uIGNsaWVudCBzaWRlLgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFNzZUV2ZW50U2lua0Nsb3NlVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoU3NlRXZlbnRTaW5rQ2xvc2VUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgU3NlRXZlbnRTaW5rIG91dHB1dCA9IG51bGw7CisgICAgcHJpdmF0ZSBzdGF0aWMgQ291bnREb3duTGF0Y2ggb3BlbkxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworCisgICAgQFNpbmdsZXRvbgorICAgIEBQYXRoKCJzc2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3NlRW5kcG9pbnQgeworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJzZW5kIikKKyAgICAgICAgcHVibGljIFN0cmluZyBzZW5kRXZlbnQoQENvbnRleHQgU3NlIHNzZSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIE91dGJvdW5kU3NlRXZlbnQgZXZlbnQgPSBzc2UubmV3RXZlbnRCdWlsZGVyKCkuZGF0YSgiQW4gZXZlbnQiKS5idWlsZCgpOworICAgICAgICAgICAgaWYgKCFvdXRwdXQuaXNDbG9zZWQoKSkgeworICAgICAgICAgICAgICAgIG91dHB1dC5zZW5kKGV2ZW50KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gIk9LIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAiQ2xvc2VkIjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKFNzZUZlYXR1cmUuU0VSVkVSX1NFTlRfRVZFTlRTKQorICAgICAgICBwdWJsaWMgdm9pZCBnZXQoQENvbnRleHQgU3NlRXZlbnRTaW5rIG91dHB1dCwgQENvbnRleHQgU3NlIHNzZSkgeworICAgICAgICAgICAgU3NlRXZlbnRTaW5rQ2xvc2VUZXN0Lm91dHB1dCA9IG91dHB1dDsKKyAgICAgICAgICAgIG9wZW5MYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB0ZXN0IHRlc3QgdGhhdCBTU0UgY29ubmVjdGlvbiBpcyByZWFsbHkgY2xvc2VkIHdoZW4gU3NlRXZlbnRTb3VyY2UuY2xvc2UoKSBpcyBjYWxsZWQuCisgICAgICogPHAvPgorICAgICAqIFRoaXMgdGVzdCBpcyB2ZXJ5IEh0dHBVUkxDb25uZWN0aW9uIGFuZCBHcml6emx5IHNlcnZlciBzcGVjaWZpYywgc28gaXQgd2lsbCBwcm9iYWJseSBmYWlsLCBpZiBvdGhlciBjbGllbnQgYW5kIHNlcnZlcgorICAgICAqIHRyYW5zcG9ydCBhcmUgdXNlZC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIFdlYlRhcmdldCBzc2VUYXJnZXQgPSB0YXJnZXQoInNzZSIpOworCisgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGV2ZW50TGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMyk7CisgICAgICAgIFNzZUV2ZW50U291cmNlIGV2ZW50U291cmNlID0gU3NlRXZlbnRTb3VyY2UudGFyZ2V0KHNzZVRhcmdldCkuYnVpbGQoKTsKKyAgICAgICAgZXZlbnRTb3VyY2UucmVnaXN0ZXIoKGV2ZW50KSAtPiBldmVudExhdGNoLmNvdW50RG93bigpKTsKKyAgICAgICAgZXZlbnRTb3VyY2Uub3BlbigpOworICAgICAgICBvcGVuTGF0Y2guYXdhaXQoKTsKKworICAgICAgICAvLyBUZWxsIHNlcnZlciB0byBzZW5kIHVzIDMgZXZlbnRzCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVzcG9uc2UgPSB0YXJnZXQoInNzZS9zZW5kIikucmVxdWVzdCgpLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiT0siLCByZXNwb25zZSk7CisgICAgICAgIH0KKworICAgICAgICAvLyAuLi4gYW5kIHdhaXQgZm9yIHRoZSBldmVudHMgdG8gYmUgcHJvY2Vzc2VkIGJ5IHRoZSBjbGllbnQgc2lkZSwgdGhlbiBjbG9zZSB0aGUgZXZlbnRTb3VyY2UKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRXZlbnRMYXRjaCB0aW1lZCBvdXQuIiwgZXZlbnRMYXRjaC5hd2FpdCg1LCBUaW1lVW5pdC5TRUNPTkRTKSk7CisgICAgICAgIGV2ZW50U291cmNlLmNsb3NlKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiU3NlRXZlbnRTb3VyY2Ugc2hvdWxkIGhhdmUgYmVlbiBhbHJlYWR5IGNsb3NlZCIsIGZhbHNlLCBldmVudFNvdXJjZS5pc09wZW4oKSk7CisKKyAgICAgICAgU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld1NjaGVkdWxlZFRocmVhZFBvb2woMSk7CisKKyAgICAgICAgQ291bnREb3duTGF0Y2ggY2xvc2VMYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxMDApOworICAgICAgICBleGVjdXRvci5zY2hlZHVsZUF0Rml4ZWRSYXRlKCgpIC0+IHsKKyAgICAgICAgICAgIGlmIChvdXRwdXQuaXNDbG9zZWQoKSkgeworICAgICAgICAgICAgICAgIC8vIGNvdW50ZG93biB0byB6ZXJvCisgICAgICAgICAgICAgICAgd2hpbGUgKGNsb3NlTGF0Y2guZ2V0Q291bnQoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgY2xvc2VMYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJzc2Uvc2VuZCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgICAgIExPR0dFUi5pbmZvKDIwMCA9PSByZXNwb25zZS5nZXRTdGF0dXMoKSA/ICJTdGlsbCBhbGl2ZSIgOiAiRXJyb3IgcmVjZWl2ZWQiKTsKKyAgICAgICAgICAgIGNsb3NlTGF0Y2guY291bnREb3duKCk7CisgICAgICAgIH0sIDAsIDEwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKworICAgICAgICBhc3NlcnRUcnVlKGNsb3NlTGF0Y2guYXdhaXQoMTAwMDAsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICBleGVjdXRvci5zaHV0ZG93bigpOworICAgICAgICBhc3NlcnRUcnVlKCJTc2VFdmVudE91dHB1dCBzaG91bGQgaGF2ZSBiZWVuIGFscmVhZHkgY2xvc2VkLiIsIG91dHB1dC5pc0Nsb3NlZCgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFNzZUVuZHBvaW50LmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9zc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9zc2UvU3NlRXZlbnRTaW5rVGVzdC5qYXZhIGIvbWVkaWEvc3NlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvc3NlL1NzZUV2ZW50U2lua1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjAwYWMyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvc3NlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvc3NlL1NzZUV2ZW50U2lua1Rlc3QuamF2YQpAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZTsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5zc2UuU3NlOworaW1wb3J0IGphdmF4LndzLnJzLnNzZS5Tc2VFdmVudFNpbms7CitpbXBvcnQgamF2YXgud3MucnMuc3NlLlNzZUV2ZW50U291cmNlOworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBTc2VFdmVudFNpbmtUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb3VudERvd25MYXRjaCBDTElFTlRfUkVDRUlWRURfQV9NRVNTQUdFX0xBVENIID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvdW50RG93bkxhdGNoIFJFU09VUkNFX01FVEhPRF9FTkRfTEFUQ0ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBTc2VFdmVudFNpbmsgb3V0cHV0ID0gbnVsbDsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoU3NlRW5kcG9pbnQuY2xhc3MpOworICAgIH0KKworICAgIEBTaW5nbGV0b24KKyAgICBAUGF0aCgic3NlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNzZUVuZHBvaW50IHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcyhTc2VGZWF0dXJlLlNFUlZFUl9TRU5UX0VWRU5UUykKKyAgICAgICAgcHVibGljIHZvaWQgZ2V0KEBDb250ZXh0IFNzZUV2ZW50U2luayBvdXRwdXQsIEBDb250ZXh0IFNzZSBzc2UpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBTc2VFdmVudFNpbmtUZXN0Lm91dHB1dCA9IG91dHB1dDsKKworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIjIyMgU2VydmVyIGlzIGFib3V0IHRvIHNlbmQgYSBtZXNzYWdlLiIpOworCisgICAgICAgICAgICBvdXRwdXQuc2VuZChzc2UubmV3RXZlbnQoIkhvdyB3aWxsIHRoaXMgZW5kPyIpKTsKKworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIjIyMgU2VydmVyIHdhaXRpbmcgZm9yIGNsaWVudCB0byByZWNlaXZlIGEgbWVzc2FnZS4iKTsKKworICAgICAgICAgICAgQ0xJRU5UX1JFQ0VJVkVEX0FfTUVTU0FHRV9MQVRDSC5hd2FpdCgpOworCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiMjIyBTZXJ2ZXIgcmVzb3VyY2UgbWV0aG9kIGludm9jYXRpb24gZW5kLiIpOworCisgICAgICAgICAgICBSRVNPVVJDRV9NRVRIT0RfRU5EX0xBVENILmNvdW50RG93bigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHRlc3QgdGVzdCB0aGF0IFNTRSBjb25uZWN0aW9uIGlzIHJlYWxseSBjbG9zZWQgd2hlbiBTc2VFdmVudFNvdXJjZS5jbG9zZSgpIGlzIGNhbGxlZC4KKyAgICAgKiA8cC8+CisgICAgICogVGhpcyB0ZXN0IGlzIHZlcnkgSHR0cFVSTENvbm5lY3Rpb24gYW5kIEdyaXp6bHkgc2VydmVyIHNwZWNpZmljLCBzbyBpdCB3aWxsIHByb2JhYmx5IGZhaWwsIGlmIG90aGVyIGNsaWVudCBhbmQgc2VydmVyCisgICAgICogdHJhbnNwb3J0IGFyZSB1c2VkLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJsb2NraW5nUmVzb3VyY2VNZXRob2QoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBXZWJUYXJnZXQgc3NlVGFyZ2V0ID0gdGFyZ2V0KCJzc2UiKTsKKworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBldmVudExhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDMpOworICAgICAgICBTc2VFdmVudFNvdXJjZSBldmVudFNvdXJjZSA9IFNzZUV2ZW50U291cmNlLnRhcmdldChzc2VUYXJnZXQpLmJ1aWxkKCk7CisgICAgICAgIGV2ZW50U291cmNlLnJlZ2lzdGVyKChldmVudCkgLT4geworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIjIyMgQ2xpZW50IHJlY2VpdmVkOiAiICsgZXZlbnQpOworICAgICAgICAgICAgQ0xJRU5UX1JFQ0VJVkVEX0FfTUVTU0FHRV9MQVRDSC5jb3VudERvd24oKTsKKyAgICAgICAgfSk7CisgICAgICAgIGV2ZW50U291cmNlLm9wZW4oKTsKKworICAgICAgICAvLyBjbGllbnQgd2FpdGluZyBmb3IgY29uZmlybWF0aW9uIHRoYXQgcmVzb3VyY2UgbWV0aG9kIGVuZGVkLgorICAgICAgICBhc3NlcnRUcnVlKFJFU09VUkNFX01FVEhPRF9FTkRfTEFUQ0guYXdhaXQoMTAwMDAsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL3NzZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL3NzZS9pbnRlcm5hbC9KZXJzZXlFdmVudFNpbmtUZXN0LmphdmEgYi9tZWRpYS9zc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9zc2UvaW50ZXJuYWwvSmVyc2V5RXZlbnRTaW5rVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiYzgzOWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9zc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9tZWRpYS9zc2UvaW50ZXJuYWwvSmVyc2V5RXZlbnRTaW5rVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLmludGVybmFsOworCitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLkV4cGVjdGVkRXhjZXB0aW9uOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXlFdmVudFNpbmtUZXN0IHsKKworICAgIEBSdWxlCisgICAgcHVibGljIEV4cGVjdGVkRXhjZXB0aW9uIHRocm93biA9IEV4cGVjdGVkRXhjZXB0aW9uLm5vbmUoKTsKKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBvblN1YnNjcmliZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBKZXJzZXlFdmVudFNpbmsgZXZlbnRTaW5rID0gbmV3IEplcnNleUV2ZW50U2luayhudWxsKTsKKworICAgICAgICBldmVudFNpbmsuY2xvc2UoKTsKKyAgICAgICAgdGhyb3duLmV4cGVjdChJbGxlZ2FsU3RhdGVFeGNlcHRpb24uY2xhc3MpOworICAgICAgICBldmVudFNpbmsub25TdWJzY3JpYmUobnVsbCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBvbk5leHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSmVyc2V5RXZlbnRTaW5rIGV2ZW50U2luayA9IG5ldyBKZXJzZXlFdmVudFNpbmsobnVsbCk7CisKKyAgICAgICAgZXZlbnRTaW5rLmNsb3NlKCk7CisgICAgICAgIHRocm93bi5leHBlY3QoSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgZXZlbnRTaW5rLm9uTmV4dChudWxsKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSmVyc2V5RXZlbnRTaW5rIGV2ZW50U2luayA9IG5ldyBKZXJzZXlFdmVudFNpbmsobnVsbCk7CisKKyAgICAgICAgZXZlbnRTaW5rLmNsb3NlKCk7CisgICAgICAgIHRocm93bi5leHBlY3QoSWxsZWdhbFN0YXRlRXhjZXB0aW9uLmNsYXNzKTsKKyAgICAgICAgZXZlbnRTaW5rLm9uRXJyb3IobnVsbCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBvbkNvbXBsZXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEplcnNleUV2ZW50U2luayBldmVudFNpbmsgPSBuZXcgSmVyc2V5RXZlbnRTaW5rKG51bGwpOworCisgICAgICAgIGV2ZW50U2luay5jbG9zZSgpOworICAgICAgICB0aHJvd24uZXhwZWN0KElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIGV2ZW50U2luay5vbkNvbXBsZXRlKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEplcnNleUV2ZW50U2luayBldmVudFNpbmsgPSBuZXcgSmVyc2V5RXZlbnRTaW5rKG51bGwpOworCisgICAgICAgIGV2ZW50U2luay5jbG9zZSgpOworICAgICAgICB0aHJvd24uZXhwZWN0KElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIGV2ZW50U2luay5zZW5kKG51bGwpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL3NzZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL3NzZS9pbnRlcm5hbC9KZXJzZXlTc2VCcm9hZGNhc3RlclRlc3QuamF2YSBiL21lZGlhL3NzZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L21lZGlhL3NzZS9pbnRlcm5hbC9KZXJzZXlTc2VCcm9hZGNhc3RlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjk4ZmM4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvc3NlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvbWVkaWEvc3NlL2ludGVybmFsL0plcnNleVNzZUJyb2FkY2FzdGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbXBsZXRpb25TdGFnZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworaW1wb3J0IGphdmF4LndzLnJzLnNzZS5PdXRib3VuZFNzZUV2ZW50OworaW1wb3J0IGphdmF4LndzLnJzLnNzZS5Tc2VFdmVudFNpbms7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5SdWxlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydWxlcy5FeHBlY3RlZEV4Y2VwdGlvbjsKKworLyoqCisgKiB7QGxpbmsgamF2YXgud3MucnMuc3NlLlNzZUJyb2FkY2FzdGVyfSB0ZXN0LgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEplcnNleVNzZUJyb2FkY2FzdGVyVGVzdCB7CisKKyAgICBAUnVsZQorICAgIHB1YmxpYyBFeHBlY3RlZEV4Y2VwdGlvbiB0aHJvd24gPSBFeHBlY3RlZEV4Y2VwdGlvbi5ub25lKCk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9FWENFUFRJT05fTVNHID0gInRlc3RFeGNlcHRpb24iOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25FcnJvck51bGwoKSB7CisgICAgICAgIHRyeSAoSmVyc2V5U3NlQnJvYWRjYXN0ZXIgYnJvYWRjYXN0ZXIgPSBuZXcgSmVyc2V5U3NlQnJvYWRjYXN0ZXIoKSkgeworCisgICAgICAgICAgICB0aHJvd24uZXhwZWN0KElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgICAgICBicm9hZGNhc3Rlci5vbkVycm9yKG51bGwpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25DbG9zZU51bGwoKSB7CisgICAgICAgIHRyeSAoSmVyc2V5U3NlQnJvYWRjYXN0ZXIgamVyc2V5U3NlQnJvYWRjYXN0ZXIgPSBuZXcgSmVyc2V5U3NlQnJvYWRjYXN0ZXIoKSkgeworCisgICAgICAgICAgICB0aHJvd24uZXhwZWN0KElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgICAgICBqZXJzZXlTc2VCcm9hZGNhc3Rlci5vbkNsb3NlKG51bGwpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25FcnJvckZyb21Pbk5leHQoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICB0cnkgKEplcnNleVNzZUJyb2FkY2FzdGVyIGJyb2FkY2FzdGVyID0gbmV3IEplcnNleVNzZUJyb2FkY2FzdGVyKCkpIHsKKworICAgICAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisKKworICAgICAgICAgICAgYnJvYWRjYXN0ZXIub25FcnJvcigoc3Vic2NyaWJlciwgdGhyb3dhYmxlKSAtPiB7CisgICAgICAgICAgICAgICAgaWYgKFRFU1RfRVhDRVBUSU9OX01TRy5lcXVhbHModGhyb3dhYmxlLmdldE1lc3NhZ2UoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIGJyb2FkY2FzdGVyLnJlZ2lzdGVyKG5ldyBTc2VFdmVudFNpbmsoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDbG9zZWQoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgQ29tcGxldGlvblN0YWdlPD8+IHNlbmQoT3V0Ym91bmRTc2VFdmVudCBldmVudCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihURVNUX0VYQ0VQVElPTl9NU0cpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIGJyb2FkY2FzdGVyLmJyb2FkY2FzdChuZXcgSmVyc2V5U3NlKCkubmV3RXZlbnQoInBpbmciKSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShsYXRjaC5hd2FpdCgyMDAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uQ2xvc2UoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICB0cnkgKEplcnNleVNzZUJyb2FkY2FzdGVyIGJyb2FkY2FzdGVyID0gbmV3IEplcnNleVNzZUJyb2FkY2FzdGVyKCkpIHsKKworICAgICAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisKKyAgICAgICAgICAgIGZpbmFsIFNzZUV2ZW50U2luayBldmVudFNpbmsgPSBuZXcgU3NlRXZlbnRTaW5rKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIENvbXBsZXRpb25TdGFnZTw/PiBzZW5kKE91dGJvdW5kU3NlRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICAgICAgYnJvYWRjYXN0ZXIucmVnaXN0ZXIoZXZlbnRTaW5rKTsKKworICAgICAgICAgICAgYnJvYWRjYXN0ZXIub25DbG9zZSgocykgLT4geworICAgICAgICAgICAgICAgIGlmIChzLmVxdWFscyhldmVudFNpbmspKSB7CisgICAgICAgICAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBicm9hZGNhc3Rlci5jbG9zZSgpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUobGF0Y2guYXdhaXQoMjAwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3BvbS54bWwgYi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZjM4NGUKLS0tIC9kZXYvbnVsbAorKysgYi9wb20ueG1sCkBAIC0wLDAgKzEsMTk2NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5uZXQuamF2YTwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+anZuZXQtcGFyZW50PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj40PC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXk8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgorICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPG5hbWU+amVyc2V5PC9uYW1lPgorICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgRWNsaXBzZSBKZXJzZXkgaXMgdGhlIG9wZW4gc291cmNlICh1bmRlciBkdWFsIEVQTCtHUEwgbGljZW5zZSkgSkFYLVJTIDIuMSAoSlNSIDM3MCkKKyAgICAgICAgcHJvZHVjdGlvbiBxdWFsaXR5IFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbiBmb3IgYnVpbGRpbmcgUkVTVGZ1bCBXZWIgc2VydmljZXMuCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDx1cmw+aHR0cHM6Ly9wcm9qZWN0cy5lY2xpcHNlLm9yZy9wcm9qZWN0cy9lZTRqLmplcnNleTwvdXJsPgorCisgICAgPCEtLSBwcmVyZXF1aXNpdGVzIC0tPgorCisgICAgPGlzc3VlTWFuYWdlbWVudD4KKyAgICAgICAgPHN5c3RlbT5KSVJBPC9zeXN0ZW0+CisgICAgICAgIDx1cmw+aHR0cHM6Ly9naXRodWIuY29tL2VjbGlwc2UtZWU0ai9qZXJzZXkvaXNzdWVzPC91cmw+CisgICAgPC9pc3N1ZU1hbmFnZW1lbnQ+CisKKyAgICA8Y2lNYW5hZ2VtZW50PgorICAgICAgICA8c3lzdGVtPkh1ZHNvbjwvc3lzdGVtPgorICAgICAgICA8dXJsPmh0dHA6Ly9odWRzb24uZ2xhc3NmaXNoLm9yZy9qb2IvSmVyc2V5LXRydW5rLW11bHRpcGxhdGZvcm0vPC91cmw+CisgICAgPC9jaU1hbmFnZW1lbnQ+CisKKyAgICA8aW5jZXB0aW9uWWVhcj4yMDEwPC9pbmNlcHRpb25ZZWFyPgorCisgICAgPG1haWxpbmdMaXN0cz4KKyAgICAgICAgPG1haWxpbmdMaXN0PgorICAgICAgICAgICAgPG5hbWU+VXNlcnMgTGlzdDwvbmFtZT4KKyAgICAgICAgICAgIDxwb3N0PmplcnNleS1kZXZAZWNsaXBzZS5vcmc8L3Bvc3Q+CisgICAgICAgIDwvbWFpbGluZ0xpc3Q+CisgICAgPC9tYWlsaW5nTGlzdHM+CisKKyAgICA8ZGV2ZWxvcGVycz4KKyAgICAgICAgPGRldmVsb3Blcj4KKyAgICAgICAgICAgIDxuYW1lPlJvbWFuIEdyaWdvcmlhZGk8L25hbWU+CisgICAgICAgICAgICA8b3JnYW5pemF0aW9uPk9yYWNsZSBDb3Jwb3JhdGlvbjwvb3JnYW5pemF0aW9uPgorICAgICAgICAgICAgPG9yZ2FuaXphdGlvblVybD5odHRwOi8vd3d3Lm9yYWNsZS5jb20vPC9vcmdhbml6YXRpb25Vcmw+CisgICAgICAgIDwvZGV2ZWxvcGVyPgorICAgICAgICA8ZGV2ZWxvcGVyPgorICAgICAgICAgICAgPG5hbWU+THVrYXMgSnVuZ21hbm48L25hbWU+CisgICAgICAgICAgICA8b3JnYW5pemF0aW9uPk9yYWNsZSBDb3Jwb3JhdGlvbjwvb3JnYW5pemF0aW9uPgorICAgICAgICAgICAgPG9yZ2FuaXphdGlvblVybD5odHRwOi8vd3d3Lm9yYWNsZS5jb20vPC9vcmdhbml6YXRpb25Vcmw+CisgICAgICAgIDwvZGV2ZWxvcGVyPgorICAgICAgICA8ZGV2ZWxvcGVyPgorICAgICAgICAgICAgPG5hbWU+RG1pdHJ5IEtvcm5pbG92PC9uYW1lPgorICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5PcmFjbGUgQ29ycG9yYXRpb248L29yZ2FuaXphdGlvbj4KKyAgICAgICAgICAgIDxvcmdhbml6YXRpb25Vcmw+aHR0cDovL3d3dy5vcmFjbGUuY29tLzwvb3JnYW5pemF0aW9uVXJsPgorICAgICAgICA8L2RldmVsb3Blcj4KKyAgICAgICAgPGRldmVsb3Blcj4KKyAgICAgICAgICAgIDxuYW1lPlRvbWFzIEtyYXVzPC9uYW1lPgorICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5PcmFjbGUgQ29ycG9yYXRpb248L29yZ2FuaXphdGlvbj4KKyAgICAgICAgICAgIDxvcmdhbml6YXRpb25Vcmw+aHR0cDovL3d3dy5vcmFjbGUuY29tLzwvb3JnYW5pemF0aW9uVXJsPgorICAgICAgICA8L2RldmVsb3Blcj4KKyAgICAgICAgPGRldmVsb3Blcj4KKyAgICAgICAgICAgIDxuYW1lPlRvbWFzIExhbmdlcjwvbmFtZT4KKyAgICAgICAgICAgIDxvcmdhbml6YXRpb24+T3JhY2xlIENvcnBvcmF0aW9uPC9vcmdhbml6YXRpb24+CisgICAgICAgICAgICA8b3JnYW5pemF0aW9uVXJsPmh0dHA6Ly93d3cub3JhY2xlLmNvbS88L29yZ2FuaXphdGlvblVybD4KKyAgICAgICAgPC9kZXZlbG9wZXI+CisgICAgICAgIDxkZXZlbG9wZXI+CisgICAgICAgICAgICA8bmFtZT5NYXhpbSBOZXNlbjwvbmFtZT4KKyAgICAgICAgICAgIDxvcmdhbml6YXRpb24+T3JhY2xlIENvcnBvcmF0aW9uPC9vcmdhbml6YXRpb24+CisgICAgICAgICAgICA8b3JnYW5pemF0aW9uVXJsPmh0dHA6Ly93d3cub3JhY2xlLmNvbS88L29yZ2FuaXphdGlvblVybD4KKyAgICAgICAgPC9kZXZlbG9wZXI+CisgICAgICAgIDxkZXZlbG9wZXI+CisgICAgICAgICAgICA8bmFtZT5TYW50aWFnbyBQZXJpY2FzLUdlZXJ0c2VuPC9uYW1lPgorICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5PcmFjbGUgQ29ycG9yYXRpb248L29yZ2FuaXphdGlvbj4KKyAgICAgICAgICAgIDxvcmdhbml6YXRpb25Vcmw+aHR0cDovL3d3dy5vcmFjbGUuY29tLzwvb3JnYW5pemF0aW9uVXJsPgorICAgICAgICA8L2RldmVsb3Blcj4KKyAgICAgICAgPGRldmVsb3Blcj4KKyAgICAgICAgICAgIDxuYW1lPkphbiBTdXBvbDwvbmFtZT4KKyAgICAgICAgICAgIDxvcmdhbml6YXRpb24+T3JhY2xlIENvcnBvcmF0aW9uPC9vcmdhbml6YXRpb24+CisgICAgICAgICAgICA8b3JnYW5pemF0aW9uVXJsPmh0dHA6Ly93d3cub3JhY2xlLmNvbS88L29yZ2FuaXphdGlvblVybD4KKyAgICAgICAgICAgIDx1cmw+aHR0cDovL2Jsb2cuc3Vwb2wuaW5mbzwvdXJsPgorICAgICAgICA8L2RldmVsb3Blcj4KKyAgICA8L2RldmVsb3BlcnM+CisKKyAgICA8Y29udHJpYnV0b3JzPgorICAgICAgICA8Y29udHJpYnV0b3I+CisgICAgICAgICAgICA8bmFtZT5QZXRyIEJvdWRhPC9uYW1lPgorICAgICAgICA8L2NvbnRyaWJ1dG9yPgorICAgICAgICA8Y29udHJpYnV0b3I+CisgICAgICAgICAgICA8bmFtZT5QYXZlbCBCdWNlazwvbmFtZT4KKyAgICAgICAgICAgIDxvcmdhbml6YXRpb24+T3JhY2xlIENvcnBvcmF0aW9uPC9vcmdhbml6YXRpb24+CisgICAgICAgICAgICA8dXJsPmh0dHA6Ly91LW1vZHJlaG8ta3JhbGlrYS5uZXQvPC91cmw+CisgICAgICAgIDwvY29udHJpYnV0b3I+CisgICAgICAgIDxjb250cmlidXRvcj4KKyAgICAgICAgICAgIDxuYW1lPk1pY2hhbCBHYWpkb3M8L25hbWU+CisgICAgICAgICAgICA8dXJsPmh0dHA6Ly9ibG9nLmRlamF2dS5zazwvdXJsPgorICAgICAgICA8L2NvbnRyaWJ1dG9yPgorICAgICAgICA8Y29udHJpYnV0b3I+CisgICAgICAgICAgICA8bmFtZT5QZXRyIEphbm91Y2g8L25hbWU+CisgICAgICAgIDwvY29udHJpYnV0b3I+CisgICAgICAgIDxjb250cmlidXRvcj4KKyAgICAgICAgICAgIDxuYW1lPkxpYm9yIEtyYW1vbGlzPC9uYW1lPgorICAgICAgICA8L2NvbnRyaWJ1dG9yPgorICAgICAgICA8Y29udHJpYnV0b3I+CisgICAgICAgICAgICA8bmFtZT5BZGFtIExpbmRlbnRoYWw8L25hbWU+CisgICAgICAgIDwvY29udHJpYnV0b3I+CisgICAgICAgIDxjb250cmlidXRvcj4KKyAgICAgICAgICAgIDxuYW1lPkpha3ViIFBvZGxlc2FrPC9uYW1lPgorICAgICAgICAgICAgPG9yZ2FuaXphdGlvbj5PcmFjbGUgQ29ycG9yYXRpb248L29yZ2FuaXphdGlvbj4KKyAgICAgICAgICAgIDxvcmdhbml6YXRpb25Vcmw+aHR0cDovL3d3dy5vcmFjbGUuY29tLzwvb3JnYW5pemF0aW9uVXJsPgorICAgICAgICA8L2NvbnRyaWJ1dG9yPgorICAgICAgICA8Y29udHJpYnV0b3I+CisgICAgICAgICAgICA8bmFtZT5NYXJlayBQb3RvY2lhcjwvbmFtZT4KKyAgICAgICAgPC9jb250cmlidXRvcj4KKyAgICAgICAgPGNvbnRyaWJ1dG9yPgorICAgICAgICAgICAgPG5hbWU+U3RlcGFuIFZhdnJhPC9uYW1lPgorICAgICAgICA8L2NvbnRyaWJ1dG9yPgorICAgIDwvY29udHJpYnV0b3JzPgorCisgICAgPGxpY2Vuc2VzPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICAgIDxuYW1lPkVQTCAyLjA8L25hbWU+CisgICAgICAgICAgICA8dXJsPmh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMDwvdXJsPgorICAgICAgICAgICAgPGRpc3RyaWJ1dGlvbj5yZXBvPC9kaXN0cmlidXRpb24+CisgICAgICAgICAgICA8Y29tbWVudHM+RXhjZXB0IGZvciAzcmQgY29udGVudCBhbmQgZXhhbXBsZXMuCisgICAgICAgICAgICAgICAgICAgICAgU2VlIGFsc28gaHR0cHM6Ly9naXRodWIuY29tL2VjbGlwc2UtZWU0ai9qZXJzZXkvYmxvYi9tYXN0ZXIvTk9USUNFLm1kPC9jb21tZW50cz4KKyAgICAgICAgPC9saWNlbnNlPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICAgIDxuYW1lPkdQTDIgdy8gQ1BFPC9uYW1lPgorICAgICAgICAgICAgPHVybD5odHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWw8L3VybD4KKyAgICAgICAgICAgIDxkaXN0cmlidXRpb24+cmVwbzwvZGlzdHJpYnV0aW9uPgorICAgICAgICAgICAgPGNvbW1lbnRzPkV4Y2VwdCBmb3IgM3JkIGNvbnRlbnQgYW5kIGV4YW1wbGVzLgorICAgICAgICAgICAgICAgICAgICAgIFNlZSBhbHNvIGh0dHBzOi8vZ2l0aHViLmNvbS9lY2xpcHNlLWVlNGovamVyc2V5L2Jsb2IvbWFzdGVyL05PVElDRS5tZDwvY29tbWVudHM+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgICA8bmFtZT5FREwgMS4wPC9uYW1lPgorICAgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmVjbGlwc2Uub3JnL29yZy9kb2N1bWVudHMvZWRsLXYxMC5waHA8L3VybD4KKyAgICAgICAgICAgIDxkaXN0cmlidXRpb24+cmVwbzwvZGlzdHJpYnV0aW9uPgorICAgICAgICAgICAgPGNvbW1lbnRzPlRoZSBleGFtcGxlczwvY29tbWVudHM+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgICA8bmFtZT5BcGFjaGUgTGljZW5zZSwgMi4wPC9uYW1lPgorICAgICAgICAgICAgPHVybD5odHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAuaHRtbDwvdXJsPgorICAgICAgICAgICAgPGRpc3RyaWJ1dGlvbj5yZXBvPC9kaXN0cmlidXRpb24+CisgICAgICAgICAgICA8Y29tbWVudHM+R29vZ2xlIEd1YXZhIEAgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmEsCisgICAgICAgICAgICAgICAgICAgICAgRHJvcHdpemFyZCBNb25pdG9yaW5nIGluc3BpcmVkIGNsYXNzZXMgQCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwubW9uaXRvcmluZy5jb3JlIGFuZAorICAgICAgICAgICAgICAgICAgICAgIEphY2tzb24gSkFYLVJTIFByb3ZpZGVycyBAIG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uaW50ZXJuYWwuamFja3Nvbi5qYXhyczwvY29tbWVudHM+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgICA8bmFtZT5QdWJsaWMgRG9tYWluPC9uYW1lPgorICAgICAgICAgICAgPHVybD5odHRwczovL2NyZWF0aXZlY29tbW9ucy5vcmcvcHVibGljZG9tYWluL3plcm8vMS4wLzwvdXJsPgorICAgICAgICAgICAgPGRpc3RyaWJ1dGlvbj5yZXBvPC9kaXN0cmlidXRpb24+CisgICAgICAgICAgICA8Y29tbWVudHM+SlNSLTE2NiBFeHRlbnNpb24gdG8gSkVQIDI2NiBAIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmpzcjE2NjwvY29tbWVudHM+CisgICAgICAgIDwvbGljZW5zZT4KKyAgICAgICAgPGxpY2Vuc2U+CisgICAgICAgICAgICA8bmFtZT5Nb2RpZmllZCBCU0Q8L25hbWU+CisgICAgICAgICAgICA8dXJsPmh0dHA6Ly9hc20ub2JqZWN0d2ViLm9yZy9saWNlbnNlLmh0bWw8L3VybD4KKyAgICAgICAgICAgIDxkaXN0cmlidXRpb24+cmVwbzwvZGlzdHJpYnV0aW9uPgorICAgICAgICAgICAgPGNvbW1lbnRzPkFTTSBAIGplcnNleS5yZXBhY2thZ2VkLm9yZy5vYmplY3R3ZWIuYXNtPC9jb21tZW50cz4KKyAgICAgICAgPC9saWNlbnNlPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICAgIDxuYW1lPmpRdWVyeSBsaWNlbnNlPC9uYW1lPgorICAgICAgICAgICAgPHVybD5qcXVlcnkub3JnL2xpY2Vuc2U8L3VybD4KKyAgICAgICAgICAgIDxkaXN0cmlidXRpb24+cmVwbzwvZGlzdHJpYnV0aW9uPgorICAgICAgICAgICAgPGNvbW1lbnRzPmpRdWVyeSB2MS4xMi40PC9jb21tZW50cz4KKyAgICAgICAgPC9saWNlbnNlPgorICAgICAgICA8bGljZW5zZT4KKyAgICAgICAgICAgIDxuYW1lPk1JVCBsaWNlbnNlPC9uYW1lPgorICAgICAgICAgICAgPHVybD5odHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocDwvdXJsPgorICAgICAgICAgICAgPGRpc3RyaWJ1dGlvbj5yZXBvPC9kaXN0cmlidXRpb24+CisgICAgICAgICAgICA8Y29tbWVudHM+QW5ndWxhckpTLCBCb290c3RyYXAgdjMuMy43LAorICAgICAgICAgICAgICAgICAgICAgIGpRdWVyeSBCYXJjb2RlIHBsdWdpbiAwLjMsIEtpbmV0aWNKUyB2NC43LjE8L2NvbW1lbnRzPgorICAgICAgICA8L2xpY2Vuc2U+CisgICAgPC9saWNlbnNlcz4KKworICAgIDxzY20+ICAgIAorICAgICAgICA8Y29ubmVjdGlvbj5zY206Z2l0OmdpdEBnaXRodWIuY29tOmplcnNleS9qZXJzZXkuZ2l0PC9jb25uZWN0aW9uPgorICAgICAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206Z2l0OmdpdEBnaXRodWIuY29tOmVjbGlwc2UtZWU0ai9qZXJzZXkuZ2l0PC9kZXZlbG9wZXJDb25uZWN0aW9uPgorICAgICAgICA8dXJsPmh0dHBzOi8vZ2l0aHViLmNvbS9lY2xpcHNlLWVlNGovamVyc2V5PC91cmw+CisgICAgICAgIDx0YWc+SEVBRDwvdGFnPgorICAgIDwvc2NtPgorCisgICAgPG9yZ2FuaXphdGlvbj4KKyAgICAgICAgPG5hbWU+T3JhY2xlIENvcnBvcmF0aW9uPC9uYW1lPgorICAgICAgICA8dXJsPmh0dHA6Ly93d3cub3JhY2xlLmNvbS88L3VybD4KKyAgICA8L29yZ2FuaXphdGlvbj4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50b29scy5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktZG9jLW1vZHVsZWxpc3QtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjAuMTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWVuZm9yY2VyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+MS40LjE8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+ZW5mb3JjZS12ZXJzaW9uczwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5lbmZvcmNlPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxydWxlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXF1aXJlSmF2YVZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtqYXZhLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXF1aXJlSmF2YVZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcnVsZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YnVpbGQtaGVscGVyLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+MS43PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPmdlbmVyYXRlLXNvdXJjZXM8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+YWRkLXNvdXJjZTwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vZ2VuZXJhdGVkLXNvdXJjZXMvcnNyYy1nZW48L3NvdXJjZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zb3VyY2VzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+aW5pdGlhbGl6ZTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPnBhcnNlLXZlcnNpb248L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cGFyc2UtdmVyc2lvbjwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLmlzdGFjazwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4taXN0YWNrLWNvbW1vbnMtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjYuMTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5nZW5lcmF0ZS1zb3VyY2VzPC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJzLWdlbjwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2VzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9L3NyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqL2xvY2FsaXphdGlvbi5wcm9wZXJ0aWVzPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9pbmNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXNvdXJjZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXN0RGlyPiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2dlbmVyYXRlZC1zb3VyY2VzL3JzcmMtZ2VuPC9kZXN0RGlyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bG9jYWxpemF0aW9uVXRpbGl0aWVzUGtnTmFtZT5vcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5sMTBuPC9sb2NhbGl6YXRpb25VdGlsaXRpZXNQa2dOYW1lPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jbGVhbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuNTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+My4xPC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KKyAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8c291cmNlPiR7amF2YS52ZXJzaW9ufTwvc291cmNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRhcmdldD4ke2phdmEudmVyc2lvbn08L3RhcmdldD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb21waWxlckFyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tPFdlcnJvciAvPi0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gVE9ETyB3b3JrIHRvd2FyZHMgZWxpbWluYXRpbmcgYWxsIHdhcm5pbmdzIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gZW5hYmxlIHRoZSAtWGxpbnQgb3B0aW9uIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1YbGludC8tLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29tcGlsZXJBcmd1bWVudHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2hvd1dhcm5pbmdzPmZhbHNlPC9zaG93V2FybmluZ3M+CisgICAgICAgICAgICAgICAgICAgICAgICA8Zm9yaz5mYWxzZTwvZm9yaz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5tb2R1bGUtaW5mby5qYXZhPC9leGNsdWRlPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi40PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4taW5zdGFsbC1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuNS4yPC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVzb3VyY2VzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi42PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjE4LjE8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBmb3IgY29udmVuaWVuY2UgcmVhc29ucywgJ2FyZ0xpbmUnIHNob3VsZCBub3QgYmUgb3ZlcnJpZGRlbiBpbiBjaGlsZCBwb21zLiBpZiBuZWVkZWQsIGEgcHJvcGVydHkgc2hvdWxkIGJlIGRlY2xhcmVkIGFuZCB1c2VkIGhlcmUgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJnTGluZT4tWG14JHtzdXJlZmlyZS5tYXhtZW0uYXJnbGluZX1tIC1EZmlsZS5lbmNvZGluZz1VVEY4ICR7c3VyZWZpcmUuc2VjdXJpdHkuYXJnbGluZX0gJHtzdXJlZmlyZS5jb3ZlcmFnZS5hcmdsaW5lfTwvYXJnTGluZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxza2lwVGVzdHM+JHtza2lwLnRlc3RzfTwvc2tpcFRlc3RzPgorICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuNDwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8dGFyTG9uZ0ZpbGVNb2RlPmdudTwvdGFyTG9uZ0ZpbGVNb2RlPgorICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi44PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMTAuNDwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZG9jdGl0bGU+SmVyc2V5ICR7amVyc2V5LnZlcnNpb259IEFQSSBEb2N1bWVudGF0aW9uPC9kb2N0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx3aW5kb3d0aXRsZT5KZXJzZXkgJHtqZXJzZXkudmVyc2lvbn0gQVBJPC93aW5kb3d0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxib3R0b20+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCFbQ0RBVEFbQ29weXJpZ2h0ICYjMTY5OyAyMDA3LTIwMTcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Imh0dHA6Ly93d3cub3JhY2xlLmNvbSI+T3JhY2xlPC9hPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMuXV0+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2JvdHRvbT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxsaW5rcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGluaz5odHRwczovL2pheC1ycy5naXRodWIuaW8vYXBpZG9jcy8yLjEvPC9saW5rPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaW5rPmh0dHA6Ly9oazIuamF2YS5uZXQvbm9uYXYvaGsyLWFwaS9hcGlkb2NzPC9saW5rPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9saW5rcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlUGFja2FnZU5hbWVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICouaW50ZXJuYWwuKjoqLnRlc3RzLioKKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZVBhY2thZ2VOYW1lcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzb3VyY2VGaWxlRXhjbHVkZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+YnVuZGxlcy8qKjwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZUV4Y2x1ZGU+bW9kdWxlLWluZm8uamF2YTwvZmlsZUV4Y2x1ZGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3NvdXJjZUZpbGVFeGNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJib3NlIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YWRkaXRpb25hbHBhcmFtPi1YZG9jbGludDpub25lPC9hZGRpdGlvbmFscGFyYW0+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWF4bWVtb3J5PjI1Nm08L21heG1lbW9yeT4KKyAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmF0dGFjaC1qYXZhZG9jczwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4yLjE8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmphci1uby1mb3JrPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZGVwbG95LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi44LjE8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJldHJ5RmFpbGVkRGVwbG95bWVudENvdW50PjEwPC9yZXRyeUZhaWxlZERlcGxveW1lbnRDb3VudD4KKyAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVsZWFzZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuNDwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPCEtLQorICAgICAgICAgICAgICAgICAgICAgICAgbXZuIHJlbGVhc2U6cHJlcGFyZSAtRHJlbGVhc2VWZXJzaW9uPTxyZWxlYXNlLXZlcnNpb24+IC1EZGV2ZWxvcG1lbnRWZXJzaW9uPTxuZXh0LWRldi12ZXJzaW9uPiAtRHRhZz08cmVsZWFzZS12ZXJzaW9uPiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLVByZWxlYXNlCisKKyAgICAgICAgICAgICAgICAgICAgICAgIG12biByZWxlYXNlOnBlcmZvcm0gLURjb25uZWN0aW9uVXJsPSJzY206Z2l0OmZpbGU6Ly88cGF0aC10by1sb2NhbC1yZXBvPiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1QcmVsZWFzZSx0ZXN0c1NraXAKKyAgICAgICAgICAgICAgICAgICAgLS0+CisgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPG1hdmVuRXhlY3V0b3JJZD5mb3JrZWQtcGF0aDwvbWF2ZW5FeGVjdXRvcklkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGF1dG9WZXJzaW9uU3VibW9kdWxlcz50cnVlPC9hdXRvVmVyc2lvblN1Ym1vZHVsZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJlcGFyYXRpb25Hb2Fscz4ke3JlbGVhc2UucHJlcGFyYXRpb25Hb2Fsc308L3ByZXBhcmF0aW9uR29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHVzaENoYW5nZXM+ZmFsc2U8L3B1c2hDaGFuZ2VzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHVzZVJlbGVhc2VQcm9maWxlPmZhbHNlPC91c2VSZWxlYXNlUHJvZmlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcmd1bWVudHM+JHtyZWxlYXNlLnRlc3RzLmFyZ3N9ICR7cmVsZWFzZS5hcmd1bWVudHN9PC9hcmd1bWVudHM+CisgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKworICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5vcHM0ai5wYXguZXhhbTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGF4ZXhhbS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cGF4ZXhhbS5tdm4ucGx1Z2luLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmdlbmVyYXRlLWNvbmZpZzwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5nZW5lcmF0ZS1kZXBlbmRzLWZpbGU8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBsYXRmb3JtPmZlbGl4PC9wbGF0Zm9ybT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvb3B0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc2l0ZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjMuMzwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z2VuZXJhdGVQcm9qZWN0SW5mbz5mYWxzZTwvZ2VuZXJhdGVQcm9qZWN0SW5mbz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnZW5lcmF0ZVJlcG9ydHM+dHJ1ZTwvZ2VuZXJhdGVSZXBvcnRzPgorICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmV4ZWMtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjIuMTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+amF2YTwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWp4ci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+anhyPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnZhbGlkYXRlPC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jaGVja3N0eWxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtjaGVja3N0eWxlLm12bi5wbHVnaW4udmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ0xvY2F0aW9uPmV0Yy9jb25maWcvY2hlY2tzdHlsZS54bWw8L2NvbmZpZ0xvY2F0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPHN1cHByZXNzaW9uc0xvY2F0aW9uPmV0Yy9jb25maWcvY2hlY2tzdHlsZS1zdXBwcmVzc2lvbnMueG1sPC9zdXBwcmVzc2lvbnNMb2NhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxvdXRwdXRGaWxlPiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2NoZWNrc3R5bGUvY2hlY2tzdHlsZS1yZXN1bHQueG1sPC9vdXRwdXRGaWxlPgorICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20ucHVwcHljcmF3bC50b29sczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jaGVja3N0eWxlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7Y2hlY2tzdHlsZS52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBNQ0hFQ0tTVFlMRS0xNTYgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+dG9vbHM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+CisgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmZpbmRidWdzLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtmaW5kYnVncy52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2tpcD4ke2ZpbmRidWdzLnNraXB9PC9za2lwPgorICAgICAgICAgICAgICAgICAgICAgICAgPHRocmVzaG9sZD4ke2ZpbmRidWdzLnRocmVzaG9sZH08L3RocmVzaG9sZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlRmlsdGVyRmlsZT4ke2ZpbmRidWdzLmV4Y2x1ZGV9PC9leGNsdWRlRmlsdGVyRmlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4bWxPdXRwdXQ+dHJ1ZTwveG1sT3V0cHV0PgorICAgICAgICAgICAgICAgICAgICAgICAgPGZpbmRidWdzWG1sT3V0cHV0PnRydWU8L2ZpbmRidWdzWG1sT3V0cHV0PgorICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBmaW5kYnVncyBkZXRlY3RvciBjb25maWd1cmF0aW9uIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPGp2bUFyZ3M+LURmaW5kYnVncy5nbGFzc2Zpc2gubG9nZ2luZy52YWxpZExvZ2dlclByZWZpeGVzPSR7ZmluZGJ1Z3MuZ2xhc3NmaXNoLmxvZ2dpbmcudmFsaWRMb2dnZXJQcmVmaXhlc308L2p2bUFyZ3M+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmZpbmRidWdzPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5maW5kYnVncy1sb2dnaW5nLWRldGVjdG9yczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtmaW5kYnVncy5nbGFzc2Zpc2gudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guZmluZGJ1Z3M8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZmluZGJ1Z3M8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtmaW5kYnVncy5nbGFzc2Zpc2gudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjE2PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxza2lwVGVzdHM+JHtza2lwLnRlc3RzfTwvc2tpcFRlc3RzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNraXBJVHM+JHtza2lwLnRlc3RzfTwvc2tpcElUcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcmdMaW5lPiR7ZmFpbHNhZmUuY292ZXJhZ2UuYXJnbGluZX08L2FyZ0xpbmU+CisgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+aW50ZWdyYXRpb24tdGVzdDwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+dmVyaWZ5PC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4td2FyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi40PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxmYWlsT25NaXNzaW5nV2ViWG1sPmZhbHNlPC9mYWlsT25NaXNzaW5nV2ViWG1sPgorICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1lYXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjg8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5lbWJlZGRlZDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZW1iZWRkZWQtZ2xhc3NmaXNoLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+My4xLjIuMjwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmNvcHlyaWdodDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2xhc3NmaXNoLWNvcHlyaWdodC1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMzk8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVGaWxlPmV0Yy9jb25maWcvY29weXJpZ2h0LWV4Y2x1ZGU8L2V4Y2x1ZGVGaWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPCEtLXN2bnxtZXJjdXJpYWx8Z2l0IC0gZGVmYXVsdHMgdG8gc3ZuLS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2NtPmdpdDwvc2NtPgorICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSB0dXJuIG9uL29mZiBkZWJ1Z2dpbmcgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGVidWc+ZmFsc2U8L2RlYnVnPgorICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBza2lwIGZpbGVzIG5vdCB1bmRlciBTQ00tLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzY21Pbmx5PnRydWU8L3NjbU9ubHk+CisgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHR1cm4gb2ZmIHdhcm5pbmdzIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPHdhcm4+dHJ1ZTwvd2Fybj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZm9yIHVzZSB3aXRoIHJlcGFpciAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx1cGRhdGU+ZmFsc2U8L3VwZGF0ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gY2hlY2sgdGhhdCB5ZWFyIGlzIGNvcnJlY3QgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8aWdub3JlWWVhcj5mYWxzZTwvaWdub3JlWWVhcj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUZpbGU+ZXRjL2NvbmZpZy9jb3B5cmlnaHQudHh0PC90ZW1wbGF0ZUZpbGU+CisgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmZlbGl4PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1idW5kbGUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4zLjIuMDwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPGV4dGVuc2lvbnM+dHJ1ZTwvZXh0ZW5zaW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8aW5zdHJ1Y3Rpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxfdmVyc2lvbnBvbGljeT5bJCh2ZXJzaW9uOz09OyQoQCkpLCQodmVyc2lvbjsrOyQoQCkpKTwvX3ZlcnNpb25wb2xpY3k+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPF9ub2RlZmF1bHR2ZXJzaW9uPmZhbHNlPC9fbm9kZWZhdWx0dmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgorICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+b3NnaS1idW5kbGU8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmJ1bmRsZTwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+eG1sLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4udG9vbHMueGpjLm1hdmVuMjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF4Yi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS4xPC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5idWlsZG51bWJlci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8IS0tIFRPRE86IHJlbW92ZSB0aGUgb2xkIGpldHR5IHBsdWdpbiBkZXBlbmRlbmNpZXMgLS0+CisgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWpldHR5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtqZXR0eS5wbHVnaW4udmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+OC4xLjgudjIwMTIxMTA2PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7amV0dHkudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5idWlsZDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z2ZuZXh1cy1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjAuMTY8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0YWdpbmdSZXBvcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RhZ2luZ1JlcG8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSByZWZlcmVuY2UgYXJ0aWZhY3QgdXNlZCB0byBpZGVudGlmeSB0aGUgcmlnaHQgc3RhZ2luZyByZXBvc2l0b3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVmPm9yZy5nbGFzc2Zpc2guamVyc2V5OnByb2plY3Q6JHtwcm9qZWN0LnZlcnNpb259OnBvbTwvcmVmPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZT5jb20uc3VuLmplcnNleTwvcHJvZmlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N0YWdpbmdSZXBvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9zdGFnaW5nUmVwb3M+CisgICAgICAgICAgICAgICAgICAgICAgICA8IS0tCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcG9yYXJ5IHRpbGwgdGhlcmUgaXMgYSBqZXJzZXkgcHJvbW90aW9uIHByb2ZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPHByb21vdGlvblByb2ZpbGU+Z2xhc3NmaXNoLWludGVncmF0aW9uPC9wcm9tb3Rpb25Qcm9maWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPG1lc3NhZ2U+SkVSU0VZLSR7cHJvamVjdC52ZXJzaW9ufTwvbWVzc2FnZT4KKyAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc2hhZGUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjQuMzwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5zaGFkZS1hcmNoaXZlPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnNoYWRlPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtaW5pbWl6ZUphcj5mYWxzZTwvbWluaW1pemVKYXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXJzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbHRlcj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3Q+KjoqPC9hcnRpZmFjdD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPm1vZHVsZS1pbmZvLio8L2V4Y2x1ZGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsdGVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZpbHRlcnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2hhZGVUZXN0SmFyPmZhbHNlPC9zaGFkZVRlc3RKYXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWluaW1pemVKYXI+dHJ1ZTwvbWluaW1pemVKYXI+CisgICAgICAgICAgICAgICAgICAgICAgICA8cHJvbW90ZVRyYW5zaXRpdmVEZXBlbmRlbmNpZXM+dHJ1ZTwvcHJvbW90ZVRyYW5zaXRpdmVEZXBlbmRlbmNpZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIERvIG5vdCBjcmVhdGUgcmVkdWNlZCBwb20gLSBqYXhycy1yaSBjYW5ub3QgYmUgYnVpbHQgd2hlbiBzZXQgdG8gdHJ1ZSAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjcmVhdGVEZXBlbmRlbmN5UmVkdWNlZFBvbT5mYWxzZTwvY3JlYXRlRGVwZW5kZW5jeVJlZHVjZWRQb20+CisgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFudHJ1bi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuODwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZm9ydGFzb2Z0PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5ncmFkbGUtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjAuNTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZ2l0aHViLnd2ZW5nZW48L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnByb2d1YXJkLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4wLjg8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5uZXQuc2YucHJvZ3VhcmQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+cHJvZ3VhcmQtYmFzZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj41LjE8L3ZlcnNpb24+PCEtLSB0cmFuc2l0aXZlIGRlcGVuZGVuY3kgdmVyc2lvbiBpbmNyZWFzZWQgZnJvbSA1LjAgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY2llcz4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgPC9wbHVnaW5NYW5hZ2VtZW50PgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudG9vbHMucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktZG9jLW1vZHVsZWxpc3QtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+ZmFsc2U8L2luaGVyaXRlZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPG91dHB1dEZpbGVOYW1lPmRvY3Mvc3JjL21haW4vZG9jYm9vay9tb2R1bGVzLnhtbDwvb3V0cHV0RmlsZU5hbWU+CisgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZUZpbGVOYW1lPmRvY3Mvc3JjL21haW4vZG9jYm9vay9pbmMvbW9kdWxlcy5zcmM8L3RlbXBsYXRlRmlsZU5hbWU+CisgICAgICAgICAgICAgICAgICAgIDx0YWJsZUhlYWRlckZpbGVOYW1lPmRvY3Mvc3JjL21haW4vZG9jYm9vay9pbmMvbW9kdWxlc190YWJsZV9oZWFkZXIuc3JjPC90YWJsZUhlYWRlckZpbGVOYW1lPgorICAgICAgICAgICAgICAgICAgICA8dGFibGVGb290ZXJGaWxlTmFtZT5kb2NzL3NyYy9tYWluL2RvY2Jvb2svaW5jL21vZHVsZXNfdGFibGVfZm9vdGVyLnNyYzwvdGFibGVGb290ZXJGaWxlTmFtZT4KKyAgICAgICAgICAgICAgICAgICAgPHRhYmxlUm93RmlsZU5hbWU+ZG9jcy9zcmMvbWFpbi9kb2Nib29rL2luYy9tb2R1bGVzX3RhYmxlX3Jvdy5zcmM8L3RhYmxlUm93RmlsZU5hbWU+CisgICAgICAgICAgICAgICAgICAgIDxvdXRwdXRVbm1hdGNoZWQ+ZmFsc2U8L291dHB1dFVubWF0Y2hlZD4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWVuZm9yY2VyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgIDxleHRlbnNpb25zPgorICAgICAgICAgICAgPGV4dGVuc2lvbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmZpbmRidWdzPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjMuMi1iMDY8L3ZlcnNpb24+CisgICAgICAgICAgICA8L2V4dGVuc2lvbj4KKyAgICAgICAgPC9leHRlbnNpb25zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPCEtLSBVc2UgaXQgd2l0aCByZWxlYXNlLXBlcmZvcm0gZ29hbCB0byBza2lwIGFub3RoZXIgdGVzdCBydW4uIC0tPgorICAgICAgICAgICAgPGlkPnRlc3RzU2tpcDwvaWQ+CisgICAgICAgICAgICA8YWN0aXZhdGlvbj4KKyAgICAgICAgICAgICAgICA8YWN0aXZlQnlEZWZhdWx0PmZhbHNlPC9hY3RpdmVCeURlZmF1bHQ+CisgICAgICAgICAgICAgICAgPCEtLSB0aGlzIGlzIGhvdyB0byBhbGlnbiBiYWNrIHdpdGggbWF2ZW4gc3RhbmRhcmRzIHdoZXJlIHByb3BlcnR5ICdza2lwVGVzdHMnIG1ha2VzIG1hdmVuLXN1cmVmaXJlLXBsdWdpbgorICAgICAgICAgICAgICAgIChhbmQgYWxzbyBtYXZlbi1mYWlsc2FmZS1wbHVnaW4pIHNraXAgdGVzdHMgZXhlY3V0aW9uIC0tPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgPG5hbWU+c2tpcFRlc3RzPC9uYW1lPgorICAgICAgICAgICAgICAgICAgICA8dmFsdWU+dHJ1ZTwvdmFsdWU+CisgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KKyAgICAgICAgICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgIDxyZWxlYXNlLnRlc3RzLmFyZ3M+LURza2lwLnRlc3RzPXRydWU8L3JlbGVhc2UudGVzdHMuYXJncz4KKyAgICAgICAgICAgICAgICA8c2tpcC50ZXN0cz50cnVlPC9za2lwLnRlc3RzPgorICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPmNoZWNrc3R5bGVTa2lwPC9pZD4KKyAgICAgICAgICAgIDxhY3RpdmF0aW9uPgorICAgICAgICAgICAgICAgIDxhY3RpdmVCeURlZmF1bHQ+ZmFsc2U8L2FjdGl2ZUJ5RGVmYXVsdD4KKyAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KKyAgICAgICAgICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgIDxjaGVja3N0eWxlLnNraXA+dHJ1ZTwvY2hlY2tzdHlsZS5za2lwPgorICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPmZpbmRidWdzU2tpcDwvaWQ+CisgICAgICAgICAgICA8YWN0aXZhdGlvbj4KKyAgICAgICAgICAgICAgICA8YWN0aXZlQnlEZWZhdWx0PmZhbHNlPC9hY3RpdmVCeURlZmF1bHQ+CisgICAgICAgICAgICA8L2FjdGl2YXRpb24+CisgICAgICAgICAgICA8cHJvcGVydGllcz4KKyAgICAgICAgICAgICAgICA8ZmluZGJ1Z3Muc2tpcD50cnVlPC9maW5kYnVncy5za2lwPgorICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgICAgIDxwcm9maWxlPiA8IS0tIHRlc3RzIG1vZHVsZSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgaW5jbHVkZWQgdW5sZXNzIHRlc3RzLmV4Y2x1ZGVkIGVudiB2YXJpYWJsZSBpcyBzZXQgLS0+CisgICAgICAgICAgICA8aWQ+dGVzdHNJbmNsdWRlZDwvaWQ+CisgICAgICAgICAgICA8YWN0aXZhdGlvbj4KKyAgICAgICAgICAgICAgICA8YWN0aXZlQnlEZWZhdWx0PmZhbHNlPC9hY3RpdmVCeURlZmF1bHQ+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5PgorICAgICAgICAgICAgICAgICAgPG5hbWU+IXRlc3RzLmV4Y2x1ZGVkPC9uYW1lPgorICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICA8L2FjdGl2YXRpb24+CisgICAgICAgICAgICA8bW9kdWxlcz4KKyAgICAgICAgICAgICAgICA8bW9kdWxlPnRlc3RzPC9tb2R1bGU+CisgICAgICAgICAgICA8L21vZHVsZXM+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICAgICAgPHByb2ZpbGU+IDwhLS0gZXhhbXBsZXMgbW9kdWxlIHdpbGwgYmUgYXV0b21hdGljYWxseSBpbmNsdWRlZCB1bmxlc3MgZXhhbXBsZXMuZXhjbHVkZWQgZW52IHZhcmlhYmxlIGlzIHNldCAtLT4KKyAgICAgICAgICAgIDxpZD5leGFtcGxlc0luY2x1ZGVkPC9pZD4KKyAgICAgICAgICAgIDxhY3RpdmF0aW9uPgorICAgICAgICAgICAgICAgIDxhY3RpdmVCeURlZmF1bHQ+ZmFsc2U8L2FjdGl2ZUJ5RGVmYXVsdD4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgIDxuYW1lPiFleGFtcGxlcy5leGNsdWRlZDwvbmFtZT4KKyAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgICAgPC9hY3RpdmF0aW9uPgorICAgICAgICAgICAgPG1vZHVsZXM+CisgICAgICAgICAgICAgICAgPG1vZHVsZT5leGFtcGxlczwvbW9kdWxlPgorICAgICAgICAgICAgPC9tb2R1bGVzPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgICAgIDxwcm9maWxlPiA8IS0tIGJ1bmRsZXMgbW9kdWxlIHdpbGwgYmUgYXV0b21hdGljYWxseSBpbmNsdWRlZCB1bmxlc3MgYnVuZGxlcy5leGNsdWRlZCBlbnYgdmFyaWFibGUgaXMgc2V0IC0tPgorICAgICAgICAgICAgPGlkPmJ1bmRsZXNJbmNsdWRlZDwvaWQ+CisgICAgICAgICAgICA8YWN0aXZhdGlvbj4KKyAgICAgICAgICAgICAgICA8YWN0aXZlQnlEZWZhdWx0PmZhbHNlPC9hY3RpdmVCeURlZmF1bHQ+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICA8bmFtZT4hYnVuZGxlcy5leGNsdWRlZDwvbmFtZT4KKyAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgICAgPC9hY3RpdmF0aW9uPgorICAgICAgICAgICAgPG1vZHVsZXM+CisgICAgICAgICAgICAgICAgPG1vZHVsZT5idW5kbGVzPC9tb2R1bGU+CisgICAgICAgICAgICA8L21vZHVsZXM+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICAgICAgPHByb2ZpbGU+IDwhLS0gdGVzdC1mcmFtZXdvcmsgbW9kdWxlIHdpbGwgYmUgYXV0b21hdGljYWxseSBpbmNsdWRlZCB1bmxlc3MgdGVzdC1mcmFtZXdvcmsuZXhjbHVkZWQgZW52IHZhcmlhYmxlIGlzIHNldCAtLT4KKyAgICAgICAgICAgIDxpZD50ZXN0RnJhbWV3b3JrSW5jbHVkZWQ8L2lkPgorICAgICAgICAgICAgPGFjdGl2YXRpb24+CisgICAgICAgICAgICAgICAgPGFjdGl2ZUJ5RGVmYXVsdD5mYWxzZTwvYWN0aXZlQnlEZWZhdWx0PgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgPG5hbWU+IXRlc3QtZnJhbWV3b3JrLmV4Y2x1ZGVkPC9uYW1lPgorICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICA8L2FjdGl2YXRpb24+CisgICAgICAgICAgICA8bW9kdWxlcz4KKyAgICAgICAgICAgICAgICA8bW9kdWxlPnRlc3QtZnJhbWV3b3JrPC9tb2R1bGU+CisgICAgICAgICAgICA8L21vZHVsZXM+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+cmVsZWFzZTwvaWQ+CisgICAgICAgICAgICA8bW9kdWxlcz4KKyAgICAgICAgICAgICAgICA8bW9kdWxlPmRvY3M8L21vZHVsZT4KKyAgICAgICAgICAgIDwvbW9kdWxlcz4KKyAgICAgICAgICAgIDxhY3RpdmF0aW9uPgorICAgICAgICAgICAgICAgIDxhY3RpdmVCeURlZmF1bHQ+ZmFsc2U8L2FjdGl2ZUJ5RGVmYXVsdD4KKyAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zb25hdHlwZS5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm5leHVzLXN0YWdpbmctbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7bmV4dXMtc3RhZ2luZy5tdm4ucGx1Z2luLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1ncGctcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7Z3BnLm12bi5wbHVnaW4udmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXJlbGVhc2UtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlcGxveS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2tpcD50cnVlPC9za2lwPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zb25hdHlwZS5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bmV4dXMtc3RhZ2luZy1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+ZGVmYXVsdC1kZXBsb3k8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+ZGVwbG95PC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+ZGVwbG95PC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlcnZlcklkPmp2bmV0LW5leHVzLXN0YWdpbmc8L3NlcnZlcklkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZXh1c1VybD5odHRwczovL21hdmVuLmphdmEubmV0LzwvbmV4dXNVcmw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN0YWdpbmdQcm9ncmVzc1RpbWVvdXRNaW51dGVzPjMwPC9zdGFnaW5nUHJvZ3Jlc3NUaW1lb3V0TWludXRlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD54ZGs8L2lkPgorICAgICAgICAgICAgPGFjdGl2YXRpb24+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICA8bmFtZT54ZGs8L25hbWU+CisgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gYWRkIHhkayBzYXggcGFyc2VyIHRvIHRoZSBjbGFzc3BhdGggYW5kIGV4Y2x1ZGUgeGVyY2VzIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YWRkaXRpb25hbENsYXNzcGF0aEVsZW1lbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YWRkaXRpb25hbENsYXNzcGF0aEVsZW1lbnQ+JHt4ZGsuYWJzb2x1dGUucGF0aH08L2FkZGl0aW9uYWxDbGFzc3BhdGhFbGVtZW50PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYWRkaXRpb25hbENsYXNzcGF0aEVsZW1lbnRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGhEZXBlbmRlbmN5RXhjbHVkZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGhEZXBlbmRlbmN5RXhjbHVkZXM+eGVyY2VzOnhlcmNlc0ltcGw8L2NsYXNzcGF0aERlcGVuZGVuY3lFeGNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NsYXNzcGF0aERlcGVuZGVuY3lFeGNsdWRlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGVuc3VyZSwgdGhhdCB0aGUgcGF0aCB0byB0aGUgeGRrIHNheCBwYXJzZXIgaGFzIGJlZW4gc2V0IC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZW5mb3JjZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+ZW5mb3JjZS1wcm9wZXJ0eTwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5lbmZvcmNlPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJ1bGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXF1aXJlUHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT54ZGsuYWJzb2x1dGUucGF0aDwvcHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtZXNzYWdlPlByb3BlcnR5ICd4ZGsuYWJzb2x1dGUucGF0aCcgaGFzIHRvIGJlIHNwZWNpZmllZC48L21lc3NhZ2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWdleD4uKi94bWxwYXJzZXJ2Mi5qYXIkPC9yZWdleD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlZ2V4TWVzc2FnZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5ICd4ZGsuYWJzb2x1dGUucGF0aCcgaGFzIHRvIHBvaW50IHRvIHRoZSB4ZGsgcGFyc2VyIGphciAoeG1scGFyc2VydjIuamFyKS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWdleE1lc3NhZ2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXF1aXJlUHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3J1bGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZhaWw+dHJ1ZTwvZmFpbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPm1veHk8L2lkPgorICAgICAgICAgICAgPGFjdGl2YXRpb24+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICA8bmFtZT5tb3h5PC9uYW1lPgorICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICA8L2FjdGl2YXRpb24+CisgICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmVjbGlwc2UucGVyc2lzdGVuY2UubW94eTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHttb3h5LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgPHJlcG9zaXRvcmllcz4KKyAgICAgICAgICAgICAgICA8cmVwb3NpdG9yeT4KKyAgICAgICAgICAgICAgICAgICAgPGlkPmVjbGlwc2VsaW5rLnJlcG9zaXRvcnk8L2lkPgorICAgICAgICAgICAgICAgICAgICA8bmFtZT5FY2xpcHNlIE1hdmVuIFJlcG9zaXRvcnk8L25hbWU+CisgICAgICAgICAgICAgICAgICAgIDx1cmw+aHR0cDovL3d3dy5lY2xpcHNlLm9yZy9kb3dubG9hZHMvZG93bmxvYWQucGhwP3I9MSZhbXA7bmY9MSZhbXA7ZmlsZT0vcnQvZWNsaXBzZWxpbmsvbWF2ZW4ucmVwbzwvdXJsPgorICAgICAgICAgICAgICAgICAgICA8bGF5b3V0PmRlZmF1bHQ8L2xheW91dD4KKyAgICAgICAgICAgICAgICA8L3JlcG9zaXRvcnk+CisgICAgICAgICAgICA8L3JlcG9zaXRvcmllcz4KKyAgICAgICAgPC9wcm9maWxlPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5zZWN1cml0eU9mZjwvaWQ+CisgICAgICAgICAgICA8cHJvcGVydGllcz4KKyAgICAgICAgICAgICAgICA8c3VyZWZpcmUuc2VjdXJpdHkuYXJnbGluZSAvPgorICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnByb2plY3QtaW5mbzwvaWQ+CisgICAgICAgICAgICA8YWN0aXZhdGlvbj4KKyAgICAgICAgICAgICAgICA8YWN0aXZlQnlEZWZhdWx0PmZhbHNlPC9hY3RpdmVCeURlZmF1bHQ+CisgICAgICAgICAgICA8L2FjdGl2YXRpb24+CisgICAgICAgICAgICA8cmVwb3J0aW5nPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcHJvamVjdC1pbmZvLXJlcG9ydHMtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi43PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlcG9ydFNldHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlcG9ydFNldD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlcG9ydHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVwb3J0PmRlcGVuZGVuY2llczwvcmVwb3J0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlcG9ydHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXBvcnRTZXQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlcG9ydFNldHM+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgIDwvcmVwb3J0aW5nPgorICAgICAgICAgICAgPCEtLSBwbGFjZWhvbGRlciByZXF1aXJlZCBmb3Igc2l0ZTpzdGFnZSAtLT4KKyAgICAgICAgICAgIDxkaXN0cmlidXRpb25NYW5hZ2VtZW50PgorICAgICAgICAgICAgICAgIDxzaXRlPgorICAgICAgICAgICAgICAgICAgICA8aWQ+bG9jYWxob3N0PC9pZD4KKyAgICAgICAgICAgICAgICAgICAgPHVybD5odHRwOi8vbG9jYWxob3N0PC91cmw+CisgICAgICAgICAgICAgICAgPC9zaXRlPgorICAgICAgICAgICAgPC9kaXN0cmlidXRpb25NYW5hZ2VtZW50PgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPmpkazEuNys8L2lkPgorICAgICAgICAgICAgPGFjdGl2YXRpb24+CisgICAgICAgICAgICAgICAgPGpkaz5bMS43LCk8L2pkaz4KKyAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNoZWNrc3R5bGUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPnZlcmlmeTwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT52YWxpZGF0ZTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRmFpbCB0aGUgYnVpbGQgaWYgY2hlY2tzdHlsZSBydWxlcyBmb3IgY29udHJpYnV0aW9ucyBhcmUgbm90IG1ldC4gLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5jaGVjazwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlnTG9jYXRpb24+ZXRjL2NvbmZpZy9jaGVja3N0eWxlLXZlcmlmeS54bWw8L2NvbmZpZ0xvY2F0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbnNvbGVPdXRwdXQ+dHJ1ZTwvY29uc29sZU91dHB1dD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmYWlsT25WaW9sYXRpb24+dHJ1ZTwvZmFpbE9uVmlvbGF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGVUZXN0U291cmNlRGlyZWN0b3J5PnRydWU8L2luY2x1ZGVUZXN0U291cmNlRGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+c29uYXI8L2lkPgorICAgICAgICAgICAgPHByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgPCEtLSBTb25hci9SZXBvcnRpbmcgc2V0dGluZ3MgKGhlYXZpbHkgaW5zcGlyZWQgYXQgaHR0cDovL3d3dy5haGVyaXRpZXIubmV0L21hdmVuLWZhaWxzYWZlLXNvbmFyLWFuZC1qYWNvY28tYXJlLWluLWEtYm9hdC8gLS0+CisKKyAgICAgICAgICAgICAgICA8IS0tIFRlbGxzIFNvbmFyIHRvIHVzZSBqYWNvY28gZm9yIGNvdmVyYWdlIHJlc3VsdHMgLS0+CisgICAgICAgICAgICAgICAgPHNvbmFyLmphdmEuY292ZXJhZ2VQbHVnaW4+amFjb2NvPC9zb25hci5qYXZhLmNvdmVyYWdlUGx1Z2luPgorCisgICAgICAgICAgICAgICAgPCEtLSBEb24ndCBsZXQgU29uYXIgZXhlY3V0ZSB0ZXN0cy4gV2Ugd2lsbCBhc2sgaXQgdG8gTWF2ZW4gLS0+CisgICAgICAgICAgICAgICAgPHNvbmFyLmR5bmFtaWNBbmFseXNpcz5yZXVzZVJlcG9ydHM8L3NvbmFyLmR5bmFtaWNBbmFseXNpcz4KKyAgICAgICAgICAgICAgICA8IS0tIFRoZSBzeXN0ZW0gcHJvcGVydHkgamFjb2NvLm91dHB1dERpciBpcyBiYXNlZCBvbi4gVGhpcyB3b24ndCB3b3JrIGZvciAnc29uYXI6c29uYXInIChzZWUgaHR0cDovL2ppcmEuY29kZWhhdXMub3JnL2Jyb3dzZS9TT05BUi0zNDI3KSwgYXMgc3VjaCBhIHByb3BlcnR5ICdqYWNvY28ub3V0cHV0RGlyJyBoYXMgdG8gYmUgZXhwbGljaXRseSBzcGVjaWZpZWQgZnJvbSBhIGNvbW1hbmQgbGluZSAtLT4KKyAgICAgICAgICAgICAgICA8amFjb2NvLm91dHB1dERpcj4ke3Nlc3Npb24uZXhlY3V0aW9uUm9vdERpcmVjdG9yeX0vdGFyZ2V0PC9qYWNvY28ub3V0cHV0RGlyPgorICAgICAgICAgICAgICAgIDwhLS0gVGVsbHMgU29uYXIgd2hlcmUgdGhlIEphY29jbyBjb3ZlcmFnZSByZXN1bHQgZmlsZSBpcyBsb2NhdGVkIGZvciBVbml0IFRlc3RzIC0tPgorICAgICAgICAgICAgICAgIDxzb25hci5qYWNvY28ucmVwb3J0UGF0aD4ke2phY29jby5vdXRwdXREaXJ9L2phY29jby5leGVjPC9zb25hci5qYWNvY28ucmVwb3J0UGF0aD4KKyAgICAgICAgICAgICAgICA8IS0tIFRlbGxzIFNvbmFyIHdoZXJlIHRoZSBKYWNvY28gY292ZXJhZ2UgcmVzdWx0IGZpbGUgaXMgbG9jYXRlZCBmb3IgSW50ZWdyYXRpb24gVGVzdHMgLS0+CisgICAgICAgICAgICAgICAgPHNvbmFyLmphY29jby5pdFJlcG9ydFBhdGg+JHtqYWNvY28ub3V0cHV0RGlyfS9qYWNvY28taXQuZXhlYzwvc29uYXIuamFjb2NvLml0UmVwb3J0UGF0aD4KKworICAgICAgICAgICAgICAgIDwhLS0gRm9yY2UgSmFDb0NvIHRvIHNob3cgMCUgY292ZXJhZ2UgaWYgdGhlIHJlcG9ydCBpcyBtaXNzaW5nIC0tPgorICAgICAgICAgICAgICAgIDxzb25hci5qYWNvY28ucmVwb3J0TWlzc2luZy5mb3JjZS56ZXJvPnRydWU8L3NvbmFyLmphY29jby5yZXBvcnRNaXNzaW5nLmZvcmNlLnplcm8+CisKKyAgICAgICAgICAgICAgICA8IS0tIGphY29jby5hZ2VudC4qLmFyZyBwcm9wZXJ0aWVzIGFyZSBkeW5hbWljYWxseSBnZW5lcmF0ZWQgYnkgamFjb2NvOnByZXBhcmUtYWdlbnQgKHNlZSBiZWxsb3cpIC0tPgorICAgICAgICAgICAgICAgIDxzdXJlZmlyZS5jb3ZlcmFnZS5hcmdsaW5lPiR7amFjb2NvLmFnZW50LnV0LmFyZ308L3N1cmVmaXJlLmNvdmVyYWdlLmFyZ2xpbmU+CisgICAgICAgICAgICAgICAgPGZhaWxzYWZlLmNvdmVyYWdlLmFyZ2xpbmU+JHtqYWNvY28uYWdlbnQuaXQuYXJnfTwvZmFpbHNhZmUuY292ZXJhZ2UuYXJnbGluZT4KKworICAgICAgICAgICAgICAgIDwhLS0gTWF2ZW4gdmVyc2lvbnMgLS0+CisgICAgICAgICAgICAgICAgPGphY29jby52ZXJzaW9uPjAuNy40LjIwMTUwMjI2MjEyODwvamFjb2NvLnZlcnNpb24+CisgICAgICAgICAgICAgICAgPHNvbmFyLWphY29jby1saXN0ZW5lcnMudmVyc2lvbj4zLjI8L3NvbmFyLWphY29jby1saXN0ZW5lcnMudmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8c29uYXIudmVyc2lvbj4yLjY8L3NvbmFyLnZlcnNpb24+CisgICAgICAgICAgICA8L3Byb3BlcnRpZXM+CisgICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMuc29uYXItcGx1Z2lucy5qYXZhPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zb25hci1qYWNvY28tbGlzdGVuZXJzPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3NvbmFyLWphY29jby1saXN0ZW5lcnMudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8L2RlcGVuZGVuY2llcz4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5qYWNvY288L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYWNvY28tbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtqYWNvY28udmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFByZXBhcmVzIGEgdmFyaWFibGUsIGphY29jby5hZ2VudC51dC5hcmcsIHRoYXQgY29udGFpbnMgdGhlIGluZm8gdG8gYmUgcGFzc2VkIHRvIHRoZSBKVk0gaG9zdGluZyB0aGUgY29kZSBiZWluZyB0ZXN0ZWQuIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5wcmVwYXJlLXV0LWFnZW50PC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnByb2Nlc3MtdGVzdC1jbGFzc2VzPC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cHJlcGFyZS1hZ2VudDwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzdEZpbGU+JHtzb25hci5qYWNvY28ucmVwb3J0UGF0aH08L2Rlc3RGaWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5TmFtZT5qYWNvY28uYWdlbnQudXQuYXJnPC9wcm9wZXJ0eU5hbWU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXBwZW5kPnRydWU8L2FwcGVuZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUHJlcGFyZXMgYSB2YXJpYWJsZSwgamFjb2NvLmFnZW50Lml0LmFyZywgdGhhdCBjb250YWlucyB0aGUgaW5mbyB0byBiZSBwYXNzZWQgdG8gdGhlIEpWTSBob3N0aW5nIHRoZSBjb2RlIGJlaW5nIHRlc3RlZC4gLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPnByZXBhcmUtaXQtYWdlbnQ8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cHJlLWludGVncmF0aW9uLXRlc3Q8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5wcmVwYXJlLWFnZW50PC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXN0RmlsZT4ke3NvbmFyLmphY29jby5pdFJlcG9ydFBhdGh9PC9kZXN0RmlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0eU5hbWU+amFjb2NvLmFnZW50Lml0LmFyZzwvcHJvcGVydHlOYW1lPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcGVuZD50cnVlPC9hcHBlbmQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gR2VuZXJhdGUgcmVwb3J0cyB3aGljaCBtYXkgbm90IGJlIGNvbXBsZXRlIGFzIHRoZSBleGVjdXRpb24gd29uJ3QgY29uc2lkZXIgdGVzdHMgb2YgcHJvamVjdHMgdGhhdCB3ZXJlbid0IGV4ZWN1dGVkIGR1cmluZyB0aGUgYnVpbGQgeWV0IC0tPjwhLS0gVGhlIGdvb2QgdGhpbmcgaXMgdGhhdCB3aXRoIGV2ZXJ5IG1vZHVsZSBidWlsdCwgd2UncmUgZW5zdXJlZCB0aGF0IGludGVncml0eSBvZiBib3RoIGphY29jbyAuZXhlYyBmaWxlcyB3YXMgcHJlc2VydmVkIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5qYWNvY28tcmVwb3J0LXVuaXQtdGVzdHM8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+dGVzdDwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJlcG9ydDwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNldHMgdGhlIHBhdGggdG8gdGhlIGZpbGUgd2hpY2ggY29udGFpbnMgdGhlIGV4ZWN1dGlvbiBkYXRhLiAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkYXRhRmlsZT4ke3NvbmFyLmphY29jby5yZXBvcnRQYXRofTwvZGF0YUZpbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNldHMgdGhlIG91dHB1dCBkaXJlY3RvcnkgZm9yIHRoZSBjb2RlIGNvdmVyYWdlIHJlcG9ydC4gLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2phY29jbzwvb3V0cHV0RGlyZWN0b3J5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmphY29jby1yZXBvcnQtaW50ZWdyYXRpb24tdGVzdHM8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cG9zdC1pbnRlZ3JhdGlvbi10ZXN0PC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cmVwb3J0LWludGVncmF0aW9uPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2V0cyB0aGUgcGF0aCB0byB0aGUgZmlsZSB3aGljaCBjb250YWlucyB0aGUgZXhlY3V0aW9uIGRhdGEuIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRhdGFGaWxlPiR7c29uYXIuamFjb2NvLml0UmVwb3J0UGF0aH08L2RhdGFGaWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBTZXRzIHRoZSBvdXRwdXQgZGlyZWN0b3J5IGZvciB0aGUgY29kZSBjb3ZlcmFnZSByZXBvcnQuIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9qYWNvY28taXQ8L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICAgICAgPHBsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zb25hci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtzb25hci52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIElmIHBvc3NpYmxlIChpbiBzb21lIG1vZHVsZXMsIHRoaXMgaGFzIHRvIGJlIGRpc2FibGVkIGR1ZSB0byBodHRwczovL2ppcmEuc29uYXJzb3VyY2UuY29tL2Jyb3dzZS9TT05BUkpBVkEtNzI4KSwgZW5hYmxlIGNvdmVyYWdlIGRldGFpbHMgcGVyIEpVbml0IHRlc3QgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmxpc3RlbmVyPC9uYW1lPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5vcmcuc29uYXIuamF2YS5qYWNvY28uSlVuaXRMaXN0ZW5lcjwvdmFsdWU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Byb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gRW5hYmxlIGNvdmVyYWdlIGRldGFpbHMgcGVyIEpVbml0IHRlc3QgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmxpc3RlbmVyPC9uYW1lPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5vcmcuc29uYXIuamF2YS5qYWNvY28uSlVuaXRMaXN0ZW5lcjwvdmFsdWU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Byb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gTGV0J3MgcHV0IGZhaWxzYWZlIHJlcG9ydHMgd2l0aCBzdXJlZmlyZSB0byBoYXZlIGFjY2VzcyB0byB0ZXN0cyBmYWlsdXJlcy9zdWNjZXNzIHJlcG9ydHMgaW4gU29uYXIgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXBvcnRzRGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3N1cmVmaXJlLXJlcG9ydHM8L3JlcG9ydHNEaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKworICAgIDxyZXBvcnRpbmc+CisgICAgICAgIDxleGNsdWRlRGVmYXVsdHM+dHJ1ZTwvZXhjbHVkZURlZmF1bHRzPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZmluZGJ1Z3MtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7ZmluZGJ1Z3MudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPHJlcG9ydFNldHM+CisgICAgICAgICAgICAgICAgICAgIDxyZXBvcnRTZXQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2tpcD4ke2ZpbmRidWdzLnNraXB9PC9za2lwPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0aHJlc2hvbGQ+JHtmaW5kYnVncy50aHJlc2hvbGR9PC90aHJlc2hvbGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGVGaWx0ZXJGaWxlPiR7ZmluZGJ1Z3MuZXhjbHVkZX08L2V4Y2x1ZGVGaWx0ZXJGaWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaW5kYnVnc1htbFdpdGhNZXNzYWdlcz50cnVlPC9maW5kYnVnc1htbFdpdGhNZXNzYWdlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGZpbmRidWdzIGRldGVjdG9yIGNvbmZpZ3VyYXRpb24gLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGp2bUFyZ3M+LURmaW5kYnVncy5nbGFzc2Zpc2gubG9nZ2luZy52YWxpZExvZ2dlclByZWZpeGVzPSR7ZmluZGJ1Z3MuZ2xhc3NmaXNoLmxvZ2dpbmcudmFsaWRMb2dnZXJQcmVmaXhlc308L2p2bUFyZ3M+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmZpbmRidWdzPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZmluZGJ1Z3MtbG9nZ2luZy1kZXRlY3RvcnM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2ZpbmRidWdzLmdsYXNzZmlzaC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlcG9ydHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlcG9ydD5maW5kYnVnczwvcmVwb3J0PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXBvcnRzPgorICAgICAgICAgICAgICAgICAgICA8L3JlcG9ydFNldD4KKyAgICAgICAgICAgICAgICA8L3JlcG9ydFNldHM+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMTAuNDwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8IS0tIFJ1biB0aGlzIHBsdWdpbiByZXBvcnQgc2V0cyBvbmx5IGluIHRoZSBtYWluIEplcnNleSBwb20gLS0+CisgICAgICAgICAgICAgICAgPGluaGVyaXRlZD5mYWxzZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8ZG9jdGl0bGU+SmVyc2V5ICR7amVyc2V5LnZlcnNpb259IEFQSSBEb2N1bWVudGF0aW9uPC9kb2N0aXRsZT4KKyAgICAgICAgICAgICAgICAgICAgPHdpbmRvd3RpdGxlPkplcnNleSAke2plcnNleS52ZXJzaW9ufSBBUEk8L3dpbmRvd3RpdGxlPgorICAgICAgICAgICAgICAgICAgICA8Ym90dG9tPgorICAgICAgICAgICAgICAgICAgICAgICAgPCFbQ0RBVEFbQ29weXJpZ2h0ICYjMTY5OyAyMDA3LTIwMTcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj0iaHR0cDovL3d3dy5vcmFjbGUuY29tIj5PcmFjbGU8L2E+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kL29yIGl0cyBhZmZpbGlhdGVzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMuXV0+CisgICAgICAgICAgICAgICAgICAgIDwvYm90dG9tPgorICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZVBhY2thZ2VOYW1lcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbS5zdW4ud3MucnMuZXh0OiouZXhhbXBsZXMuKjoqLmludGVybmFsLio6Ki50ZXN0cy4qCisgICAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZVBhY2thZ2VOYW1lcz4KKyAgICAgICAgICAgICAgICAgICAgPGxpbmtzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpbms+aHR0cHM6Ly9qYXgtcnMuZ2l0aHViLmlvL2FwaWRvY3MvMi4xPC9saW5rPgorICAgICAgICAgICAgICAgICAgICAgICAgPGxpbms+aHR0cHM6Ly9qYXZhZWUuZ2l0aHViLmlvL2hrMi9hcGlkb2NzLzwvbGluaz4KKyAgICAgICAgICAgICAgICAgICAgPC9saW5rcz4KKyAgICAgICAgICAgICAgICAgICAgPGFkZGl0aW9uYWxwYXJhbT4tWGRvY2xpbnQ6bm9uZTwvYWRkaXRpb25hbHBhcmFtPgorICAgICAgICAgICAgICAgICAgICA8c291cmNlRmlsZUV4Y2x1ZGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVFeGNsdWRlPm1vZHVsZS1pbmZvLmphdmE8L2ZpbGVFeGNsdWRlPgorICAgICAgICAgICAgICAgICAgICA8L3NvdXJjZUZpbGVFeGNsdWRlcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgPHJlcG9ydFNldHM+CisgICAgICAgICAgICAgICAgICAgIDxyZXBvcnRTZXQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVwb3J0cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVwb3J0PmFnZ3JlZ2F0ZTwvcmVwb3J0PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXBvcnRzPgorICAgICAgICAgICAgICAgICAgICA8L3JlcG9ydFNldD4KKyAgICAgICAgICAgICAgICA8L3JlcG9ydFNldHM+CisgICAgICAgICAgICA8L3BsdWdpbj4KKworICAgICAgICAgICAgPCEtLXBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcmVwb3J0LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjEyPC92ZXJzaW9uPgorICAgICAgICAgICAgPC9wbHVnaW4tLT4KKyAgICAgICAgICAgIDwhLS1wbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29iZXJ0dXJhLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjQ8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxmb3JtYXRzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGZvcm1hdD54bWw8L2Zvcm1hdD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtYXQ+aHRtbDwvZm9ybWF0PgorICAgICAgICAgICAgICAgICAgICA8L2Zvcm1hdHM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4tLT4KKworICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tanhyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjM8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPHJlcG9ydFNldHM+CisgICAgICAgICAgICAgICAgICAgIDxyZXBvcnRTZXQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVwb3J0cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVwb3J0Pmp4cjwvcmVwb3J0PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXBvcnRzPgorICAgICAgICAgICAgICAgICAgICA8L3JlcG9ydFNldD4KKyAgICAgICAgICAgICAgICAgICAgPHJlcG9ydFNldD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUnVuIHRoaXMgcmVwb3J0IHNldCBvbmx5IGluIHRoZSBtYWluIEplcnNleSBwb20gLS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPmZhbHNlPC9pbmhlcml0ZWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cmVwb3J0cz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVwb3J0PmFnZ3JlZ2F0ZTwvcmVwb3J0PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9yZXBvcnRzPgorICAgICAgICAgICAgICAgICAgICA8L3JlcG9ydFNldD4KKyAgICAgICAgICAgICAgICA8L3JlcG9ydFNldHM+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNoZWNrc3R5bGUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7Y2hlY2tzdHlsZS5tdm4ucGx1Z2luLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8Y29uZmlnTG9jYXRpb24+ZXRjL2NvbmZpZy9jaGVja3N0eWxlLnhtbDwvY29uZmlnTG9jYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxzdXBwcmVzc2lvbnNMb2NhdGlvbj5ldGMvY29uZmlnL2NoZWNrc3R5bGUtc3VwcHJlc3Npb25zLnhtbDwvc3VwcHJlc3Npb25zTG9jYXRpb24+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgIDxyZXBvcnRTZXRzPgorICAgICAgICAgICAgICAgICAgICA8cmVwb3J0U2V0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHJlcG9ydHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlcG9ydD5jaGVja3N0eWxlPC9yZXBvcnQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3JlcG9ydHM+CisgICAgICAgICAgICAgICAgICAgIDwvcmVwb3J0U2V0PgorICAgICAgICAgICAgICAgIDwvcmVwb3J0U2V0cz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9yZXBvcnRpbmc+CisKKyAgICA8bW9kdWxlcz4KKyAgICAgICAgPG1vZHVsZT5hcmNoZXR5cGVzPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+Ym9tPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+Y29ubmVjdG9yczwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmNvbnRhaW5lcnM8L21vZHVsZT4KKworICAgICAgICA8bW9kdWxlPmNvcmUtY29tbW9uPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+Y29yZS1zZXJ2ZXI8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5jb3JlLWNsaWVudDwvbW9kdWxlPgorCisgICAgICAgIDxtb2R1bGU+ZXh0PC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+aW5jdWJhdG9yPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+aW5qZWN0PC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+bWVkaWE8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5zZWN1cml0eTwvbW9kdWxlPgorICAgIDwvbW9kdWxlcz4KKworICAgIDxkZXBlbmRlbmN5TWFuYWdlbWVudD4KKyAgICAgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LndzLnJzPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LndzLnJzLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2pheHJzLmFwaS5pbXBsLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguYW5ub3RhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5hbm5vdGF0aW9uLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2phdmF4LmFubm90YXRpb24udmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVudGVycHJpc2U8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2RpLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2NkaS5hcGkudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LnRyYW5zYWN0aW9uPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LnRyYW5zYWN0aW9uLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2p0YS5hcGkudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZ3VhdmE8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z3VhdmE8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtndWF2YS52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5oazI8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGsyLWJvbTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2hrMi52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8c2NvcGU+aW1wb3J0PC9zY29wZT4KKyAgICAgICAgICAgICAgICA8dHlwZT5wb208L3R5cGU+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmhrMjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5oazItYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7aGsyLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDxleGNsdXNpb25zPgorICAgICAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguaW5qZWN0PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguaW5qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmhrMjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vc2dpLXJlc291cmNlLWxvY2F0b3I8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+MS4wLjE8L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmhrMi5leHRlcm5hbDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5pbmplY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtoazIudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgICAgICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5pbmplY3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5pbmplY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guaGsyLmV4dGVybmFsPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmFvcGFsbGlhbmNlLXJlcGFja2FnZWQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtoazIudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuamF2YXNzaXN0PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmFzc2lzdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2phdmFzc2lzdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5ncml6emx5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmdyaXp6bHktaHR0cC1zZXJ2ZXI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtncml6emx5Mi52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guZ3JpenpseTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5ncml6emx5LWh0dHAtc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2dyaXp6bHkyLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5ncml6emx5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmdyaXp6bHktd2Vic29ja2V0czwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2dyaXp6bHkyLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5ncml6emx5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbm5lY3Rpb24tcG9vbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2dyaXp6bHkyLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5ncml6emx5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmdyaXp6bHktaHR0cC1jbGllbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtncml6emx5LmNsaWVudC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+aW8ubmV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bmV0dHktYWxsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7bmV0dHkudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+aHR0cGNsaWVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2h0dHBjbGllbnQudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LXV0aWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtqZXR0eS52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LWNsaWVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2pldHR5LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2UuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktc2VydmVyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7amV0dHkudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS13ZWJhcHA8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtqZXR0eS52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5lY2xpcHNlLmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LWNvbnRpbnVhdGlvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2pldHR5LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc2ltcGxlZnJhbWV3b3JrPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNpbXBsZS1odHRwPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7c2ltcGxlLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNpbXBsZWZyYW1ld29yazwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zaW1wbGUtdHJhbnNwb3J0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7c2ltcGxlLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc2ltcGxlZnJhbWV3b3JrPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNpbXBsZS1jb21tb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtzaW1wbGUudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5qZXR0aXNvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0aXNvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2pldHRpc29uLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDxleGNsdXNpb25zPgorICAgICAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+c3RheDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnN0YXgtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LnhtbC5iaW5kPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpheGItYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7amF4Yi5hcGkudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi54bWwuYmluZDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXhiLWltcGw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtqYXhiLnJpLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5tb3h5PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7bW94eS52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgucGVyc2lzdGVuY2U8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGVyc2lzdGVuY2UtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7amF2YXgucGVyc2lzdGVuY2UudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguZWpiPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LmVqYi1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtlamIudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmZhc3RlcnhtbC5qYWNrc29uLmpheHJzPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmphY2tzb24tamF4cnMtanNvbi1wcm92aWRlcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2phY2tzb24udmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5qYXhyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYWNrc29uLWpheHJzLWJhc2U8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtqYWNrc29uLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZmFzdGVyeG1sLmphY2tzb24uY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYWNrc29uLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtqYWNrc29uLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZmFzdGVyeG1sLmphY2tzb24uY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYWNrc29uLWRhdGFiaW5kPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7amFja3Nvbi52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmZhc3RlcnhtbC5qYWNrc29uLmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amFja3Nvbi1hbm5vdGF0aW9uczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2phY2tzb24udmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5tb2R1bGU8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amFja3Nvbi1tb2R1bGUtamF4Yi1hbm5vdGF0aW9uczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2phY2tzb24udmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5qYWNrc29uPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmphY2tzb24tY29yZS1hc2w8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtqYWNrc29uMS52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLmphY2tzb248L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amFja3Nvbi1tYXBwZXItYXNsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7amFja3NvbjEudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5qYWNrc29uPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmphY2tzb24tamF4cnM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtqYWNrc29uMS52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLmphY2tzb248L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amFja3Nvbi14YzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2phY2tzb24xLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD54ZXJjZXM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+eGVyY2VzSW1wbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3hlcmNlcy52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm9zZ2k8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLm9zZ2kuY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke29zZ2kudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm9zZ2k8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLm9zZ2kuY29tcGVuZGl1bTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke29zZ2kudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5tYWluLmVqYjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5lamItY29udGFpbmVyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7Z2YuaW1wbC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2gubWFpbi5jb21tb248L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29udGFpbmVyLWNvbW1vbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2dmLmltcGwudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgICAgIDwhLS0gSFYgT1NHaSBkZXBlbmRlbmNpZXMuIC0tPgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmpib3NzLmxvZ2dpbmc8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amJvc3MtbG9nZ2luZzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2pib3NzLmxvZ2dpbmcudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZmFzdGVyeG1sPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNsYXNzbWF0ZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2Zhc3RlcnhtbC5jbGFzc21hdGUudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lbDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5lbC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtqYXZheC5lbC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2gud2ViPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LmVsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7amF2YXguZWwuaW1wbC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5qc29uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNvbnAucmkudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzb25wLWpheHJzPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNvbnAuamF4cnMudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5oaWJlcm5hdGU8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGliZXJuYXRlLXZhbGlkYXRvcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3ZhbGlkYXRpb24uaW1wbC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmhpYmVybmF0ZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5oaWJlcm5hdGUtdmFsaWRhdG9yLWNkaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3ZhbGlkYXRpb24uaW1wbC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm9wczRqLnBheC53ZWI8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGF4LXdlYi1qZXR0eS1idW5kbGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwYXgud2ViLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm9wczRqLnBheC53ZWI8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGF4LXdlYi1leHRlbmRlci13YXI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwYXgud2ViLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm9wZW5qZGsuam1oPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmptaC1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7am1oLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm9wZW5qZGsuam1oPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmptaC1nZW5lcmF0b3ItYW5ucHJvY2VzczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2ptaC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPmNvbS5lc290ZXJpY3NvZnR3YXJlPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmtyeW88L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtrcnlvLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWxvZ2dpbmc8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sb2dnaW5nPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMjwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICAgICAgPCEtLSBXZWxkIC0tPgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmpib3NzLndlbGQuc2U8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+d2VsZC1zZS1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7d2VsZC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5qYm9zcy53ZWxkLnNlcnZsZXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+d2VsZC1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7d2VsZC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgudmFsaWRhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD52YWxpZGF0aW9uLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2phdmF4LnZhbGlkYXRpb24uYXBpLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgICAgICA8IS0tIFRlc3Qgc2NvcGUgLS0+CisKKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5vcHM0ai5wYXguZXhhbTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5wYXgtZXhhbTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3BheC5leGFtLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm9wczRqLnBheC5leGFtPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnBheC1leGFtLWp1bml0NDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3BheC5leGFtLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm9wczRqLnBheC5leGFtPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnBheC1leGFtLWNvbnRhaW5lci1mb3JrZWQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwYXguZXhhbS52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5vcHM0ai5wYXguZXhhbTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5wYXgtZXhhbS1jb250YWluZXItbmF0aXZlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cGF4LmV4YW0udmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcub3BzNGoucGF4LmV4YW08L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGF4LWV4YW0tanVuaXQtZXh0ZW5kZXItaW1wbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjIuNDwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5vcHM0ai5wYXguZXhhbTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5wYXgtZXhhbS1saW5rLW12bjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3BheC5leGFtLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtqZXR0eS5wbHVnaW4udmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS11dGlsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7amV0dHkucGx1Z2luLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGktMi41PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7amV0dHkuc2VydmxldC5hcGkuMjUudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj40LjEyPC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy50ZXN0bmc8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+dGVzdG5nPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjYuOS42PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmhhbWNyZXN0PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmhhbWNyZXN0LWxpYnJhcnk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtoYW1jcmVzdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuam1vY2tpdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qbW9ja2l0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7am1vY2tpdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ja2l0bzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tb2NraXRvLWFsbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke21vY2tpdG8udmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+eG1sdW5pdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD54bWx1bml0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7eG1sdW5pdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZmVsaXg8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmFwYWNoZS5mZWxpeC5mcmFtZXdvcms8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+NC4yLjE8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmZlbGl4PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5hcGFjaGUuZmVsaXguZXZlbnRhZG1pbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjIuMjwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZmVsaXg8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3JnLmFwYWNoZS5mZWxpeC5mcmFtZXdvcmsuc2VjdXJpdHk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4yLjA8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5qc29uLmJpbmQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguanNvbi5iaW5kLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2pzb25iLmFwaS52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmVjbGlwc2U8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+eWFzc29uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7eWFzc29uLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5pby5vcGVudHJhY2luZzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vcGVudHJhY2luZy1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtvcGVudHJhY2luZy52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+aW8ub3BlbnRyYWNpbmc8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+b3BlbnRyYWNpbmctdXRpbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke29wZW50cmFjaW5nLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDwvZGVwZW5kZW5jaWVzPgorICAgIDwvZGVwZW5kZW5jeU1hbmFnZW1lbnQ+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPGFyY2hldHlwZS5tdm4ucGx1Z2luLnZlcnNpb24+Mi40PC9hcmNoZXR5cGUubXZuLnBsdWdpbi52ZXJzaW9uPgorCisgICAgICAgIDxmaW5kYnVncy5za2lwPmZhbHNlPC9maW5kYnVncy5za2lwPgorICAgICAgICA8ZmluZGJ1Z3MudGhyZXNob2xkPkxvdzwvZmluZGJ1Z3MudGhyZXNob2xkPgorICAgICAgICA8IS0tIHRoZSBleGNsdWRlIGZpbGUgY2Fubm90IGJlIGhlcmUgZGlyZWN0bHksIGFzIEZpbmRCdWdzIHdvdWxkIGludGVycHJldCB0aGUgcGF0aCBhcyByZWxhdGl2ZSB0bworICAgICAgICBlYWNoIG1vZHVsZTsgdGhlIGRlZmF1bHQgZXhjbHVkZSBmaWx0ZXIgZmlsZSBpcyBhdCBldGMvY29uZmlnL2ZpbmRidWdzLWV4Y2x1ZGUueG1sIC0tPgorICAgICAgICA8ZmluZGJ1Z3MuZXhjbHVkZSAvPgorICAgICAgICA8ZmluZGJ1Z3MuZ2xhc3NmaXNoLmxvZ2dpbmcudmFsaWRMb2dnZXJQcmVmaXhlcz4KKyAgICAgICAgICAgIGphdmF4LmVudGVycHJpc2UKKyAgICAgICAgPC9maW5kYnVncy5nbGFzc2Zpc2gubG9nZ2luZy52YWxpZExvZ2dlclByZWZpeGVzPgorICAgICAgICA8amF2YS52ZXJzaW9uPjEuODwvamF2YS52ZXJzaW9uPgorICAgICAgICA8amVyc2V5LnJlcGFja2FnZWQucHJlZml4PmplcnNleS5yZXBhY2thZ2VkPC9qZXJzZXkucmVwYWNrYWdlZC5wcmVmaXg+CisgICAgICAgIDxuZXRiZWFucy5oaW50LmxpY2Vuc2U+Z2YtY2RkbC1ncGw8L25ldGJlYW5zLmhpbnQubGljZW5zZT4KKyAgICAgICAgPHByb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+VVRGLTg8L3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+CisgICAgICAgIDxwcm9qZWN0LnJlcG9ydGluZy5vdXRwdXRFbmNvZGluZz5VVEYtODwvcHJvamVjdC5yZXBvcnRpbmcub3V0cHV0RW5jb2Rpbmc+CisgICAgICAgIDxyZWxlYXNlLnRlc3RzLmFyZ3M+LURtYXZlbi50ZXN0LnNraXA9ZmFsc2U8L3JlbGVhc2UudGVzdHMuYXJncz4KKyAgICAgICAgPHJlbGVhc2UucHJlcGFyYXRpb25Hb2Fscz5jbGVhbiBpbnN0YWxsPC9yZWxlYXNlLnByZXBhcmF0aW9uR29hbHM+CisgICAgICAgIDxza2lwLnRlc3RzPmZhbHNlPC9za2lwLnRlc3RzPgorICAgICAgICA8eGRrLmFic29sdXRlLnBhdGggLz4KKyAgICAgICAgPHN1cmVmaXJlLnNlY3VyaXR5LmFyZ2xpbmUgLz4KKyAgICAgICAgPHN1cmVmaXJlLmNvdmVyYWdlLmFyZ2xpbmUgLz4KKyAgICAgICAgPHN1cmVmaXJlLm1heG1lbS5hcmdsaW5lPjEwMjQ8L3N1cmVmaXJlLm1heG1lbS5hcmdsaW5lPgorICAgICAgICA8ZmFpbHNhZmUuY292ZXJhZ2UuYXJnbGluZSAvPgorICAgICAgICA8c2VydmVyLmNvdmVyYWdlLmFyZ2xpbmU+JHtmYWlsc2FmZS5jb3ZlcmFnZS5hcmdsaW5lfTwvc2VydmVyLmNvdmVyYWdlLmFyZ2xpbmU+CisKKworICAgICAgICA8IS0tIERlcGVuZGVuY3kgdmVyc2lvbnMgLS0+CisgICAgICAgIDxqZXJzZXkudmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L2plcnNleS52ZXJzaW9uPgorICAgICAgICA8IS0tIGFzbSBpcyBub3cgc291cmNlIGludGVncmF0ZWQgLSBrZWVwaW5nIHRoaXMgcHJvcGVydHkgdG8gc2VlIHRoZSB2ZXJzaW9uIC0tPgorICAgICAgICA8IS0tIHNlZSBjb3JlLXNlcnZlci9zcmMvbWFpbi9qYXZhL2plcnNleS9yZXBhY2thZ2VkL2FzbS8uLiAtLT4KKyAgICAgICAgPGFzbS52ZXJzaW9uPjUuMC40PC9hc20udmVyc2lvbj4KKyAgICAgICAgPGJuZC5wbHVnaW4udmVyc2lvbj4yLjMuNjwvYm5kLnBsdWdpbi52ZXJzaW9uPgorICAgICAgICA8Y2RpLmFwaS52ZXJzaW9uPjEuMTwvY2RpLmFwaS52ZXJzaW9uPgorICAgICAgICA8Y29tbW9ucy1sYW5nMy52ZXJzaW9uPjMuMy4yPC9jb21tb25zLWxhbmczLnZlcnNpb24+CisgICAgICAgIDxjaGVja3N0eWxlLm12bi5wbHVnaW4udmVyc2lvbj4yLjE2PC9jaGVja3N0eWxlLm12bi5wbHVnaW4udmVyc2lvbj4KKyAgICAgICAgPGNoZWNrc3R5bGUudmVyc2lvbj42LjguMTwvY2hlY2tzdHlsZS52ZXJzaW9uPgorICAgICAgICA8ZWFzeW1vY2sudmVyc2lvbj4zLjM8L2Vhc3ltb2NrLnZlcnNpb24+CisgICAgICAgIDxlamIudmVyc2lvbj4zLjI8L2VqYi52ZXJzaW9uPgorICAgICAgICA8Z2YuaW1wbC52ZXJzaW9uPjQuMDwvZ2YuaW1wbC52ZXJzaW9uPgorICAgICAgICA8ZmFzdGVyeG1sLmNsYXNzbWF0ZS52ZXJzaW9uPjEuMy4zPC9mYXN0ZXJ4bWwuY2xhc3NtYXRlLnZlcnNpb24+CisgICAgICAgIDxmaW5kYnVncy5nbGFzc2Zpc2gudmVyc2lvbj4xLjM8L2ZpbmRidWdzLmdsYXNzZmlzaC52ZXJzaW9uPgorICAgICAgICA8ZmluZGJ1Z3MudmVyc2lvbj4zLjAuMjwvZmluZGJ1Z3MudmVyc2lvbj4KKyAgICAgICAgPGZyZWVtYXJrZXIudmVyc2lvbj4yLjMuMjctaW5jdWJhdGluZzwvZnJlZW1hcmtlci52ZXJzaW9uPgorICAgICAgICA8Z2FlLnZlcnNpb24+MS45LjU5PC9nYWUudmVyc2lvbj4KKyAgICAgICAgPGdwZy5tdm4ucGx1Z2luLnZlcnNpb24+MS42PC9ncGcubXZuLnBsdWdpbi52ZXJzaW9uPgorICAgICAgICA8Z3JpenpseS5jbGllbnQudmVyc2lvbj4xLjEzPC9ncml6emx5LmNsaWVudC52ZXJzaW9uPgorICAgICAgICA8Z3JpenpseTIudmVyc2lvbj4yLjQuMDwvZ3JpenpseTIudmVyc2lvbj4KKyAgICAgICAgPGd1YXZhLnZlcnNpb24+MTguMDwvZ3VhdmEudmVyc2lvbj4KKyAgICAgICAgPGhhbWNyZXN0LnZlcnNpb24+MS4zPC9oYW1jcmVzdC52ZXJzaW9uPgorICAgICAgICA8eG1sdW5pdC52ZXJzaW9uPjEuNjwveG1sdW5pdC52ZXJzaW9uPgorICAgICAgICA8aGsyLnZlcnNpb24+Mi41LjAtYjQyPC9oazIudmVyc2lvbj4KKyAgICAgICAgPGh0dHBjbGllbnQudmVyc2lvbj40LjU8L2h0dHBjbGllbnQudmVyc2lvbj4gPCEtLSBUT0RPOiA0LjUuMiBkb2Vzbid0IHdvcms7IGFwYWNoZSBjbGllbnQgY29ubmVjdG9yIHRlc3RzIC0tPgorICAgICAgICA8amFja3Nvbi52ZXJzaW9uPjIuOC4xMDwvamFja3Nvbi52ZXJzaW9uPgorICAgICAgICA8amFja3NvbjEudmVyc2lvbj4xLjkuMTM8L2phY2tzb24xLnZlcnNpb24+CisgICAgICAgIDxqYXZhc3Npc3QudmVyc2lvbj4zLjIyLjAtQ1IyPC9qYXZhc3Npc3QudmVyc2lvbj4KKyAgICAgICAgPGphdmF4LmFubm90YXRpb24udmVyc2lvbj4xLjI8L2phdmF4LmFubm90YXRpb24udmVyc2lvbj4KKyAgICAgICAgPGphdmF4LmFubm90YXRpb24uYnVuZGxlLnZlcnNpb24+MS4yPC9qYXZheC5hbm5vdGF0aW9uLmJ1bmRsZS52ZXJzaW9uPgorICAgICAgICA8amF2YXguZWwudmVyc2lvbj4yLjIuNDwvamF2YXguZWwudmVyc2lvbj4KKyAgICAgICAgPGphdmF4LmVsLmltcGwudmVyc2lvbj4yLjIuNDwvamF2YXguZWwuaW1wbC52ZXJzaW9uPgorICAgICAgICA8amF2YXguaW50ZXJjZXB0b3IudmVyc2lvbj4xLjI8L2phdmF4LmludGVyY2VwdG9yLnZlcnNpb24+CisgICAgICAgIDxqYXZheC5wZXJzaXN0ZW5jZS52ZXJzaW9uPjEuMDwvamF2YXgucGVyc2lzdGVuY2UudmVyc2lvbj4KKyAgICAgICAgPGphdmF4LnZhbGlkYXRpb24uYXBpLnZlcnNpb24+MS4xLjAuRmluYWw8L2phdmF4LnZhbGlkYXRpb24uYXBpLnZlcnNpb24+CisgICAgICAgIDxqYXhiLmFwaS52ZXJzaW9uPjIuMi43PC9qYXhiLmFwaS52ZXJzaW9uPgorICAgICAgICA8amF4Yi5yaS52ZXJzaW9uPjIuMi43PC9qYXhiLnJpLnZlcnNpb24+CisgICAgICAgIDxqc29uYi5hcGkudmVyc2lvbj4xLjA8L2pzb25iLmFwaS52ZXJzaW9uPgorICAgICAgICA8amF4cnMuYXBpLnNwZWMudmVyc2lvbj4yLjE8L2pheHJzLmFwaS5zcGVjLnZlcnNpb24+CisgICAgICAgIDxqYXhycy5hcGkuaW1wbC52ZXJzaW9uPjIuMTwvamF4cnMuYXBpLmltcGwudmVyc2lvbj4KKyAgICAgICAgPGpib3NzLmxvZ2dpbmcudmVyc2lvbj4zLjMuMC5GaW5hbDwvamJvc3MubG9nZ2luZy52ZXJzaW9uPgorICAgICAgICA8amVyc2V5MS52ZXJzaW9uPjEuMTkuMzwvamVyc2V5MS52ZXJzaW9uPgorICAgICAgICA8amVyc2V5MS5sYXN0LmZpbmFsLnZlcnNpb24+JHtqZXJzZXkxLnZlcnNpb259PC9qZXJzZXkxLmxhc3QuZmluYWwudmVyc2lvbj4KKyAgICAgICAgPGpldHRpc29uLnZlcnNpb24+MS4zLjc8L2pldHRpc29uLnZlcnNpb24+IDwhLS0gVE9ETzogMS4zLjggZG9lc24ndCB3b3JrOyBBYnN0cmFjdEpzb25UZXN0IGNvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMgLS0+CisgICAgICAgIDxqZXR0eS5wbHVnaW4udmVyc2lvbj42LjEuMjY8L2pldHR5LnBsdWdpbi52ZXJzaW9uPgorICAgICAgICA8amV0dHkudmVyc2lvbj45LjQuNy52MjAxNzA5MTQ8L2pldHR5LnZlcnNpb24+CisgICAgICAgIDxqZXR0eS5zZXJ2bGV0LmFwaS4yNS52ZXJzaW9uPjYuMS4xNDwvamV0dHkuc2VydmxldC5hcGkuMjUudmVyc2lvbj4KKyAgICAgICAgPGptaC52ZXJzaW9uPjEuMTAuMjwvam1oLnZlcnNpb24+CisgICAgICAgIDxqbW9ja2l0LnZlcnNpb24+MS4xODwvam1vY2tpdC52ZXJzaW9uPgorICAgICAgICA8anNvbnAucmkudmVyc2lvbj4xLjE8L2pzb25wLnJpLnZlcnNpb24+CisgICAgICAgIDxqc29ucC5qYXhycy52ZXJzaW9uPjEuMS4xPC9qc29ucC5qYXhycy52ZXJzaW9uPgorICAgICAgICA8anNwLnZlcnNpb24+Mi4wPC9qc3AudmVyc2lvbj4KKyAgICAgICAgPGpzdGwudmVyc2lvbj4xLjI8L2pzdGwudmVyc2lvbj4KKyAgICAgICAgPGp0YS5hcGkudmVyc2lvbj4xLjI8L2p0YS5hcGkudmVyc2lvbj4KKyAgICAgICAgPGtyeW8udmVyc2lvbj40LjAuMTwva3J5by52ZXJzaW9uPgorICAgICAgICA8bG9nYmFjay52ZXJzaW9uPjEuMi4zPC9sb2diYWNrLnZlcnNpb24+CisgICAgICAgIDxtaW1lcHVsbC52ZXJzaW9uPjEuOS42PC9taW1lcHVsbC52ZXJzaW9uPgorICAgICAgICA8bW9ja2l0by52ZXJzaW9uPjEuMTAuMTk8L21vY2tpdG8udmVyc2lvbj4KKyAgICAgICAgPG1veHkudmVyc2lvbj4yLjYuNDwvbW94eS52ZXJzaW9uPgorICAgICAgICA8bW9ja2l0by52ZXJzaW9uPjEuMTAuMTk8L21vY2tpdG8udmVyc2lvbj4KKyAgICAgICAgPG11c3RhY2hlLnZlcnNpb24+MC44LjE3PC9tdXN0YWNoZS52ZXJzaW9uPgorICAgICAgICA8bmV0dHkudmVyc2lvbj40LjEuNS5GaW5hbDwvbmV0dHkudmVyc2lvbj4KKyAgICAgICAgPG5leHVzLXN0YWdpbmcubXZuLnBsdWdpbi52ZXJzaW9uPjEuNi43PC9uZXh1cy1zdGFnaW5nLm12bi5wbHVnaW4udmVyc2lvbj4KKyAgICAgICAgPG9wZW50cmFjaW5nLnZlcnNpb24+MC4zMC4wPC9vcGVudHJhY2luZy52ZXJzaW9uPgorICAgICAgICA8b3NnaS52ZXJzaW9uPjQuMi4wPC9vc2dpLnZlcnNpb24+CisgICAgICAgIDxwYXguZXhhbS52ZXJzaW9uPjQuOS4xPC9wYXguZXhhbS52ZXJzaW9uPgorICAgICAgICA8cGF4LndlYi52ZXJzaW9uPjAuNy40PC9wYXgud2ViLnZlcnNpb24+PCEtLSBUT0RPOiBVUEdSQURFISAtLT4KKyAgICAgICAgPHBheGV4YW0ubXZuLnBsdWdpbi52ZXJzaW9uPjEuMi40PC9wYXhleGFtLm12bi5wbHVnaW4udmVyc2lvbj4KKyAgICAgICAgPHJ4amF2YS52ZXJzaW9uPjEuMi41PC9yeGphdmEudmVyc2lvbj4KKyAgICAgICAgPHJ4amF2YTIudmVyc2lvbj4yLjAuNDwvcnhqYXZhMi52ZXJzaW9uPgorICAgICAgICA8cm9tZS52ZXJzaW9uPjEuMDwvcm9tZS52ZXJzaW9uPgorICAgICAgICA8c2VydmxldDIudmVyc2lvbj4yLjQ8L3NlcnZsZXQyLnZlcnNpb24+CisgICAgICAgIDxzZXJ2bGV0My52ZXJzaW9uPjMuMC4xPC9zZXJ2bGV0My52ZXJzaW9uPgorICAgICAgICA8c2VydmxldDQudmVyc2lvbj40LjAuMDwvc2VydmxldDQudmVyc2lvbj4KKyAgICAgICAgPHNpbXBsZS52ZXJzaW9uPjYuMC4xPC9zaW1wbGUudmVyc2lvbj4KKyAgICAgICAgPHNsZjRqLnZlcnNpb24+MS43LjEyPC9zbGY0ai52ZXJzaW9uPgorICAgICAgICA8c3ByaW5nNC52ZXJzaW9uPjQuMy40LlJFTEVBU0U8L3NwcmluZzQudmVyc2lvbj4KKyAgICAgICAgPHZhbGlkYXRpb24uaW1wbC52ZXJzaW9uPjUuMS4zLkZpbmFsPC92YWxpZGF0aW9uLmltcGwudmVyc2lvbj4gPCEtLSA1LjMuMy5GaW5hbCBkb2Vzbid0IHdvcmsgLSBvc2dpIGJ2IHRlc3RzIC0tPgorICAgICAgICA8d2VsZC52ZXJzaW9uPjIuMi4xNC5GaW5hbDwvd2VsZC52ZXJzaW9uPiA8IS0tIDIuNC4xIGRvZXNuJ3Qgd29yayAtIGJ2IHRlc3RzIC0tPgorICAgICAgICA8d2VsZDMudmVyc2lvbj4zLjAuMC5GaW5hbDwvd2VsZDMudmVyc2lvbj4KKyAgICAgICAgPHhlcmNlcy52ZXJzaW9uPjIuMTEuMDwveGVyY2VzLnZlcnNpb24+CisgICAgICAgIDx4bWx1bml0LnZlcnNpb24+MS42PC94bWx1bml0LnZlcnNpb24+CisgICAgICAgIDx5YXNzb24udmVyc2lvbj4xLjAuMTwveWFzc29uLnZlcnNpb24+CisgICAgPC9wcm9wZXJ0aWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvb2F1dGgxLWNsaWVudC9wb20ueG1sIGIvc2VjdXJpdHkvb2F1dGgxLWNsaWVudC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NzMyYTIKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9vYXV0aDEtY2xpZW50L3BvbS54bWwKQEAgLTAsMCArMSw4OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZWN1cml0eTwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPm9hdXRoMS1jbGllbnQ8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktc2VjdXJpdHk8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIE1vZHVsZSB0aGF0IGFkZHMgYW4gT0F1dGggMSBzdXBwb3J0IHRvIEplcnNleSBjbGllbnQuCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxtb2R1bGVzPgorICAgICAgICA8IS0tbW9kdWxlPjwvbW9kdWxlLS0+CisgICAgPC9tb2R1bGVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi5pc3RhY2s8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4taXN0YWNrLWNvbW1vbnMtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJ1aWxkLWhlbHBlci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKworICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb21tb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LndzLnJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXgud3MucnMtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZWN1cml0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm9hdXRoMS1zaWduYXR1cmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY2xpZW50PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKworICAgIDwvZGVwZW5kZW5jaWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvb2F1dGgxLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9vYXV0aDEvQWNjZXNzVG9rZW4uamF2YSBiL3NlY3VyaXR5L29hdXRoMS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvb2F1dGgxL0FjY2Vzc1Rva2VuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY1ZWNhNgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L29hdXRoMS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvb2F1dGgxL0FjY2Vzc1Rva2VuLmphdmEKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50Lm9hdXRoMTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKKy8qKgorICogQWNjZXNzIFRva2VuIGNsYXNzIChjcmVkZW50aWFscyBpc3N1ZWQgYnkgdGhlIFNlcnZpY2UgUHJvdmlkZXIgZm9yIHRoZSB1c2VyKS4KKyAqIFRoZSBjbGFzcyBzdG9yZXMgY2xpZW50IHNlY3JldCBhcyBieXRlIGFycmF5IHRvIGltcHJvdmUgc2VjdXJpdHkuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICogQHNpbmNlIDIuMworICovCitwdWJsaWMgZmluYWwgY2xhc3MgQWNjZXNzVG9rZW4geworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdG9rZW47CisgICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gYWNjZXNzVG9rZW5TZWNyZXQ7CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBhY2Nlc3MgdG9rZW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdG9rZW4gQWNjZXNzIHRva2VuLgorICAgICAqIEBwYXJhbSBhY2Nlc3NUb2tlblNlY3JldCBBY2Nlc3MgdG9rZW4gc2VjcmV0LgorICAgICAqLworICAgIHB1YmxpYyBBY2Nlc3NUb2tlbihmaW5hbCBTdHJpbmcgdG9rZW4sIGZpbmFsIFN0cmluZyBhY2Nlc3NUb2tlblNlY3JldCkgeworICAgICAgICB0aGlzLnRva2VuID0gdG9rZW47CisgICAgICAgIHRoaXMuYWNjZXNzVG9rZW5TZWNyZXQgPSBhY2Nlc3NUb2tlblNlY3JldC5nZXRCeXRlcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBhY2Nlc3MgdG9rZW4gd2l0aCBzZWNyZXQgZGVmaW5lZCBhcyBieXRlIGFycmF5LgorICAgICAqCisgICAgICogQHBhcmFtIHRva2VuIEFjY2VzcyB0b2tlbi4KKyAgICAgKiBAcGFyYW0gYWNjZXNzVG9rZW5TZWNyZXQgQWNjZXNzIHRva2VuIHNlY3JldCBhcyBieXRlIGFycmF5IGluIHRoZSBkZWZhdWx0IGVuY29kaW5nLgorICAgICAqLworICAgIHB1YmxpYyBBY2Nlc3NUb2tlbihmaW5hbCBTdHJpbmcgdG9rZW4sIGZpbmFsIGJ5dGVbXSBhY2Nlc3NUb2tlblNlY3JldCkgeworICAgICAgICB0aGlzLnRva2VuID0gdG9rZW47CisgICAgICAgIHRoaXMuYWNjZXNzVG9rZW5TZWNyZXQgPSBhY2Nlc3NUb2tlblNlY3JldDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGFjY2VzcyB0b2tlbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQWNjZXNzIHRva2VuLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VG9rZW4oKSB7CisgICAgICAgIHJldHVybiB0b2tlbjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGFjY2VzcyB0b2tlbiBzZWNyZXQuCisgICAgICogQHJldHVybiBTZWNyZXQgcGFydCBvZiBhY2Nlc3MgdG9rZW4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRBY2Nlc3NUb2tlblNlY3JldCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYWNjZXNzVG9rZW5TZWNyZXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgYWNjZXNzIHRva2VuIHNlY3JldCBpbiBieXRlIGFycmF5cyAoaW4gZGVmYXVsdCBlbmNvZGluZykuCisgICAgICogQHJldHVybiBCeXRlIGFycmF5IHdpdGggYWNjZXNzIHRva2VuIHNlY3JldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgYnl0ZVtdIGdldEFjY2Vzc1Rva2VuU2VjcmV0QXNCeXRlQXJyYXkoKSB7CisgICAgICAgIHJldHVybiBhY2Nlc3NUb2tlblNlY3JldDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKHRoaXMgPT0gbykgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgQWNjZXNzVG9rZW4gdGhhdCA9IChBY2Nlc3NUb2tlbikgbzsKKworICAgICAgICBpZiAoIUFycmF5cy5lcXVhbHMoYWNjZXNzVG9rZW5TZWNyZXQsIHRoYXQuYWNjZXNzVG9rZW5TZWNyZXQpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF0b2tlbi5lcXVhbHModGhhdC50b2tlbikpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCByZXN1bHQgPSB0b2tlbi5oYXNoQ29kZSgpOworICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIEFycmF5cy5oYXNoQ29kZShhY2Nlc3NUb2tlblNlY3JldCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvb2F1dGgxLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9vYXV0aDEvQ29uc3VtZXJDcmVkZW50aWFscy5qYXZhIGIvc2VjdXJpdHkvb2F1dGgxLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9vYXV0aDEvQ29uc3VtZXJDcmVkZW50aWFscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMzhhZGYKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9vYXV0aDEtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L29hdXRoMS9Db25zdW1lckNyZWRlbnRpYWxzLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQub2F1dGgxOworCisvKioKKyAqIENvbnN1bWVyIGNyZWRlbnRpYWxzIGNsYXNzIChjcmVkZW50aWFscyBpc3N1ZWQgYnkgdGhlIFNlcnZpY2UgUHJvdmlkZXIgZm9yIHRoZSBhcHBsaWNhdGlvbikuCisgKiBUaGUgY2xhc3Mgc3RvcmVzIGNsaWVudCBzZWNyZXQgYXMgYnl0ZSBhcnJheSB0byBpbXByb3ZlIHNlY3VyaXR5LgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqIEBzaW5jZSAyLjMKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIENvbnN1bWVyQ3JlZGVudGlhbHMgeworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY29uc3VtZXJLZXk7CisgICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gY29uc3VtZXJTZWNyZXQ7CisKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgY29uc3VtZXIgY3JlZGVudGlhbHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uc3VtZXJLZXkgQ29uc3VtZXIga2V5LgorICAgICAqIEBwYXJhbSBjb25zdW1lclNlY3JldCBDb25zdW1lciBzZWNyZXQuCisgICAgICovCisgICAgcHVibGljIENvbnN1bWVyQ3JlZGVudGlhbHMoZmluYWwgU3RyaW5nIGNvbnN1bWVyS2V5LCBmaW5hbCBTdHJpbmcgY29uc3VtZXJTZWNyZXQpIHsKKyAgICAgICAgdGhpcy5jb25zdW1lcktleSA9IGNvbnN1bWVyS2V5OworICAgICAgICB0aGlzLmNvbnN1bWVyU2VjcmV0ID0gY29uc3VtZXJTZWNyZXQuZ2V0Qnl0ZXMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgY29uc3VtZXIgY3JlZGVudGlhbHMgd2l0aCBzZWNyZXQgZGVmaW5lZCBhcyBieXRlIGFycmF5LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnN1bWVyS2V5IENvbnN1bWVyIGtleS4KKyAgICAgKiBAcGFyYW0gY29uc3VtZXJTZWNyZXQgQ29uc3VtZXIgc2VjcmV0IGFzIGJ5dGUgYXJyYXkgaW4gdGhlIGRlZmF1bHQgZW5jb2RpbmcuCisgICAgICovCisgICAgcHVibGljIENvbnN1bWVyQ3JlZGVudGlhbHMoZmluYWwgU3RyaW5nIGNvbnN1bWVyS2V5LCBmaW5hbCBieXRlW10gY29uc3VtZXJTZWNyZXQpIHsKKyAgICAgICAgdGhpcy5jb25zdW1lcktleSA9IGNvbnN1bWVyS2V5OworICAgICAgICB0aGlzLmNvbnN1bWVyU2VjcmV0ID0gY29uc3VtZXJTZWNyZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGNvbnN1bWVyIGtleS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQ29uc3VtZXIga2V5LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29uc3VtZXJLZXkoKSB7CisgICAgICAgIHJldHVybiBjb25zdW1lcktleTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgY29uc3VtZXIgc2VjcmV0LgorICAgICAqCisgICAgICogQHJldHVybiBDb25zdW1lciBzZWNyZXQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb25zdW1lclNlY3JldCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoY29uc3VtZXJTZWNyZXQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBjb25zdW1lciBzZWNyZXQgYXMgYSBieXRlIGFycmF5IChpbiBkZWZhdWx0IGVuY29kaW5nKS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQ29uc3VtZXIgc2VjcmV0LgorICAgICAqLworICAgIHB1YmxpYyBieXRlW10gZ2V0Q29uc3VtZXJTZWNyZXRBc0J5dGVBcnJheSgpIHsKKyAgICAgICAgcmV0dXJuIGNvbnN1bWVyU2VjcmV0OworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvb2F1dGgxLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9vYXV0aDEvT0F1dGgxQXV0aG9yaXphdGlvbkZsb3cuamF2YSBiL3NlY3VyaXR5L29hdXRoMS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvb2F1dGgxL09BdXRoMUF1dGhvcml6YXRpb25GbG93LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY5NmExMAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L29hdXRoMS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvb2F1dGgxL09BdXRoMUF1dGhvcml6YXRpb25GbG93LmphdmEKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50Lm9hdXRoMTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlOworCisvKioKKyAqIFRoZSBpbnRlcmZhY2Ugb2YgdGhlIE9BdXRoIDEgQXV0aG9yaXphdGlvbiBGbG93IHV0aWxpdHkuCisgKiA8cD4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVyZmFjZSBpcyBjYXBhYmxlIG9mIHBlcmZvcm1pbmcgb2YgdGhlIHVzZXIKKyAqIGF1dGhvcml6YXRpb24gZGVmaW5lZCBpbiB0aGUgT0F1dGgxIHNwZWNpZmljYXRpb24uIFRoZSByZXN1bHQgb2YgdGhlIGF1dGhvcml6YXRpb24KKyAqIGlzIHRoZSB7QGxpbmsgQWNjZXNzVG9rZW4gYWNjZXNzIHRva2VufS4gVGhlIHVzZXIgYXV0aG9yaXphdGlvbiBpcyBjYWxsZWQgYWxzbworICogQXV0aG9yaXphdGlvbiBGbG93LiBUaGUgaW1wbGVtZW50YXRpb24gaW5pdGlhdGVzIHRoZSBhdXRob3JpemF0aW9uIHByb2Nlc3Mgd2l0aAorICogdGhlIEF1dGhvcml6YXRpb24gc2VydmVyLCB0aGVuIHByb3ZpZGVzIHJlZGlyZWN0IFVSSSB0byB3aGljaCB0aGUgdXNlciBzaG91bGQKKyAqIGJlIHJlZGlyZWN0ZWQgKHRoZSBVUkkgcG9pbnRzIHRvIGF1dGhvcml6YXRpb24gY29uc2VudCBwYWdlIGhvc3RlZCBieSBTZXJ2aWNlIFByb3ZpZGVyKS4gVGhlIHVzZXIKKyAqIGdyYW50cyBhbiBhY2Nlc3MgdXNpbmcgdGhpcyBwYWdlLiBTZXJ2aWNlIFByb3ZpZGVyIHJlZGlyZWN0cyB0aGUgdXNlciBiYWNrIHRvIHRoZQorICogb3VyIHNlcnZlciBhbmQgdGhlIGF1dGhvcml6YXRpb24gcHJvY2VzcyBpcyBmaW5pc2hlZCB1c2luZyB0aGUgaW1wbGVtZW50YXRpb24uCisgKiA8L3A+CisgKiA8cD4KKyAqIFRvIHBlcmZvcm0gdGhlIGF1dGhvcml6YXRpb24gZm9sbG93IHRoZXNlIHN0ZXBzOgorICogPGxpc3Q+CisgKiA8bGk+R2V0IHRoZSBpbnN0YW5jZSBvZiB0aGlzIGludGVyZmFjZSB1c2luZyB7QGxpbmsgT0F1dGgxQ2xpZW50U3VwcG9ydH0uPC9saT4KKyAqIDxsaT5DYWxsIHtAbGluayAjc3RhcnQoKX0gbWV0aG9kLiBUaGUgbWV0aG9kIHJldHVybnMgcmVkaXJlY3Rpb24gdXJpIGFzIGEgU3RyaW5nLiBOb3RlOiB0aGUgbWV0aG9kIGludGVybmFsbHkKKyAqIG1ha2VzIGEgcmVxdWVzdCB0byB0aGUgcmVxdWVzdCB0b2tlbiB1cmkgYW5kIGdldHMgUmVxdWVzdCBUb2tlbiB3aGljaCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBhdXRob3JpemF0aW9uIHByb2Nlc3MuPC9saT4KKyAqIDxsaT5SZWRpcmVjdCB1c2VyIHRvIHRoZSByZWRpcmVjdCB1cmkgcmV0dXJuZWQgZnJvbSB0aGUge0Bjb2RlIHN0YXJ0fSBtZXRob2QuIElmIHlvdXIgYXBwbGljYXRpb24gZGVwbG95bWVudAorICogZG9lcyBub3QgYWxsb3cgcmVkaXJlY3Rpb24gKGZvciBleGFtcGxlIHRoZSBhcHAgaXMgYSBjb25zb2xlIGFwcGxpY2F0aW9uKSwgdGhlbiBwcm92aWRlIHRoZSByZWRpcmVjdGlvbiBVUkkKKyAqIHRvIHRoZSB1c2VyIGluIG90aGVyIHdheXMuPC9saT4KKyAqIDxsaT5Vc2VyIHNob3VsZCBhdXRob3JpemUgeW91ciBhcHBsaWNhdGlvbiBvbiB0aGUgcmVkaXJlY3QgVVJJLjwvbGk+CisgKiA8bGk+QWZ0ZXIgYXV0aG9yaXphdGlvbiB0aGUgQXV0aG9yaXphdGlvbiBTZXJ2ZXIgcmVkaXJlY3RzIHRoZSB1c2VyIGJhY2sgdG8gdGhlIFVSSSBzcGVjaWZpZWQKKyAqIGJ5IHtAbGluayBPQXV0aDFCdWlsZGVyLkZsb3dCdWlsZGVyI2NhbGxiYWNrVXJpKFN0cmluZyl9IGFuZCBwcm92aWRlIHRoZSB7QGNvZGUgb2F1dGhfdmVyaWZpZXJ9IGFzCisgKiBhIHJlcXVlc3QgcXVlcnkgcGFyYW1ldGVyLiBFeHRyYWN0IHRoaXMgcGFyYW1ldGVyIGZyb20gdGhlIHJlcXVlc3QuIElmIHlvdXIgZGVwbG95bWVudCBkb2VzIG5vdCBzdXBwb3J0CisgKiByZWRpcmVjdGlvbiAoeW91ciBhcHAgaXMgbm90IGEgd2ViIHNlcnZlcikgdGhlbiBBdXRob3JpemF0aW9uIFNlcnZlciB3aWxsIHByb3ZpZGUgdGhlIHVzZXIgd2l0aAorICoge0Bjb2RlIHZlcmlmaWVyfSBpbiBvdGhlciB3YXlzIChmb3IgZXhhbXBsZSBkaXNwbGF5IG9uIHRoZSBodG1sIHBhZ2UpLiBZb3UgbmVlZCB0byBnZXQKKyAqIHRoaXMgdmVyaWZpZXIgZnJvbSB0aGUgdXNlci48L2xpPgorICogPGxpPlVzZSB0aGUge0Bjb2RlIHZlcmlmaWVyfSB0byBmaW5pc2ggdGhlIGF1dGhvcml6YXRpb24gcHJvY2VzcyBieSBjYWxsaW5nIHRoZSBtZXRob2QKKyAqIHtAbGluayAjZmluaXNoKFN0cmluZyl9IHN1cHBseWluZyB0aGUgdmVyaWZpZXIuIFRoZSBtZXRob2Qgd2lsbCBpbnRlcm5hbGx5IHJlcXVlc3QKKyAqIHRoZSBhY2Nlc3MgdG9rZW4gZnJvbSB0aGUgQXV0aG9yaXphdGlvbiBTZXJ2ZXIgYW5kIHJldHVybiBpdC48L2xpPgorICogPGxpPllvdSBjYW4gdXNlIHtAY29kZSBBY2Nlc3NUb2tlbn0gdG9nZXRoZXIgd2l0aCB7QGxpbmsgQ29uc3VtZXJDcmVkZW50aWFsc30gdG8KKyAqIHBlcmZvcm0gdGhlIGF1dGhlbnRpY2F0ZWQgcmVxdWVzdHMgdG8gdGhlIFNlcnZpY2UgUHJvdmlkZXIuIFlvdSBjYW4gYWxzbyBjYWxsCisgKiBtZXRob2RzIHtAbGluayAjZ2V0QXV0aG9yaXplZENsaWVudCgpfSB0byBnZXQge0BsaW5rIENsaWVudCBjbGllbnR9IGFscmVhZHkgY29uZmlndXJlZCB3aXRoIHN1cHBvcnQKKyAqIGZvciBhdXRoZW50aWNhdGlvbiBmcm9tIGNvbnN1bWVyIGNyZWRlbnRpYWxzIGFuZCBhY2Nlc3MgdG9rZW4gcmVjZWl2ZWQgZHVyaW5nIGF1dGhvcml6YXRpb24gcHJvY2Vzcy4KKyAqIDwvbGk+CisgKiA8L2xpc3Q+CisgKiA8L3A+CisgKiA8cD4KKyAqIEltcG9ydGFudCBub3RlOiBvbmUgaW5zdGFuY2Ugb2YgdGhlIGludGVyZmFjZSBjYW4gYmUgdXNlZCBvbmx5IGZvciBvbmUgYXV0aG9yaXphdGlvbiBwcm9jZXNzLiBUaGUgbWV0aG9kcworICogbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkIGJ5IHRoZSBsaXN0IGFib3ZlLiBUaGVyZWZvcmUgdGhlIGluc3RhbmNlIGlzIGFsc28gbm90CisgKiB0aHJlYWQgc2FmZSBhbmQgbm8gY29uY3VycmVudCBhY2Nlc3MgaXMgZXhwZWN0ZWQuCisgKiA8L3A+CisgKiBJbnN0YW5jZSBtdXN0IGJlIHN0b3JlZCBiZXR3ZWVuIG1ldGhvZCBjYWxscyAoYmV0d2VlbiB7QGNvZGUgc3RhcnR9IGFuZCB7QGNvZGUgZmluaXNofSkKKyAqIGZvciBvbmUgdXNlciBhdXRob3JpemF0aW9uIHByb2Nlc3MgYXMgdGhlIGluc3RhbmNlIGtlZXBzCisgKiBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgYXV0aG9yaXphdGlvbiBwcm9jZXNzLgorICogPC9wPgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqIEBzaW5jZSAyLjMKKyAqLworcHVibGljIGludGVyZmFjZSBPQXV0aDFBdXRob3JpemF0aW9uRmxvdyB7CisKKyAgICAvKioKKyAgICAgKiBTdGFydCB0aGUgYXV0aG9yaXphdGlvbiBwcm9jZXNzIGFuZCByZXR1cm4gcmVkaXJlY3Rpb24gVVJJIG9uIHdoaWNoIHRoZSB1c2VyIHNob3VsZCBnaXZlIGEgY29uc2VudAorICAgICAqIGZvciBvdXIgYXBwbGljYXRpb24gdG8gYWNjZXNzIHJlc291cmNlcy4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlOiB0aGUgbWV0aG9kIG1ha2VzIGEgcmVxdWVzdCB0byB0aGUgQXV0aG9yaXphdGlvbiBTZXJ2ZXIgaW4gb3JkZXIgdG8gZ2V0IHJlcXVlc3QgdG9rZW4uCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHJldHVybiBVUkkgdG8gd2hpY2ggdXNlciBzaG91bGQgYmUgcmVkaXJlY3RlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIHN0YXJ0KCk7CisKKyAgICAvKioKKyAgICAgKiBGaW5pc2ggdGhlIGF1dGhvcml6YXRpb24gcHJvY2VzcyBhbmQgcmV0dXJuIHRoZSB7QGxpbmsgQWNjZXNzVG9rZW59LiBUaGUgbWV0aG9kIG11c3QgYmUgY2FsbGVkIG9uIHRoZQorICAgICAqIHNhbWUgaW5zdGFuY2UgYWZ0ZXIgdGhlIHtAbGluayAjc3RhcnQoKX0gbWV0aG9kIHdhcyBjYWxsZWQgYW5kIHVzZXIgZ3JhbnRlZCBhY2Nlc3MgdG8gdGhpcyBhcHBsaWNhdGlvbi4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbWV0aG9kIG1ha2VzIGEgcmVxdWVzdCB0byB0aGUgQXV0aG9yaXphdGlvbiBTZXJ2ZXIgYnV0IGRvZXMgbm90IGV4Y2hhbmdlIHZlcmlmaWVyIGZvciBhY2Nlc3MgdG9rZW4uIFRoaXMgbWV0aG9kIGlzCisgICAgICogaW50ZW5kZWQgb25seSBmb3Igc29tZSBmbG93cy9jYXNlcyBpbiBPQXV0aDEuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHJldHVybiBBY2Nlc3MgdG9rZW4uCisgICAgICogQHNpbmNlIDIuNworICAgICAqLworICAgIHB1YmxpYyBBY2Nlc3NUb2tlbiBmaW5pc2goKTsKKworICAgIC8qKgorICAgICAqIEZpbmlzaCB0aGUgYXV0aG9yaXphdGlvbiBwcm9jZXNzIGFuZCByZXR1cm4gdGhlIHtAbGluayBBY2Nlc3NUb2tlbn0uIFRoZSBtZXRob2QgbXVzdCBiZSBjYWxsZWQgb24gdGhlCisgICAgICogc2FtZSBpbnN0YW5jZSBhZnRlciB0aGUge0BsaW5rICNzdGFydCgpfSBtZXRob2Qgd2FzIGNhbGxlZCBhbmQgdXNlciBncmFudGVkIGFjY2VzcyB0byB0aGlzIGFwcGxpY2F0aW9uLgorICAgICAqIDxwPgorICAgICAqIFRoZSBtZXRob2QgbWFrZXMgYSByZXF1ZXN0IHRvIHRoZSBBdXRob3JpemF0aW9uIFNlcnZlciBpbiBvcmRlciB0byBleGNoYW5nZSB2ZXJpZmllciBmb3IgYWNjZXNzIHRva2VuLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2ZXJpZmllciBWZXJpZmllciBwcm92aWRlZCBmcm9tIHRoZSB1c2VyIGF1dGhvcml6YXRpb24uCisgICAgICogQHJldHVybiBBY2Nlc3MgdG9rZW4uCisgICAgICovCisgICAgcHVibGljIEFjY2Vzc1Rva2VuIGZpbmlzaChTdHJpbmcgdmVyaWZpZXIpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBjbGllbnQgY29uZmlndXJlZCBmb3IgcGVyZm9ybWluZyBhdXRob3JpemVkIHJlcXVlc3RzIHRvIHRoZSBTZXJ2aWNlIFByb3ZpZGVyLiBUaGUKKyAgICAgKiBhdXRob3JpemF0aW9uIHByb2Nlc3MgbXVzdCBiZSBzdWNjZXNzZnVsbHkgZmluaXNoZWQgYnkgaW5zdGFuY2UgYnkgY2FsbGluZyBtZXRob2RzIHtAbGluayAjc3RhcnQoKX0gYW5kCisgICAgICoge0BsaW5rICNmaW5pc2goU3RyaW5nKX0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIENsaWVudCBjb25maWd1cmVkIHRvIGFkZCBjb3JyZWN0IHtAY29kZSBBdXRob3JpemF0aW9ufSBoZWFkZXIgdG8gcmVxdWVzdHMuCisgICAgICovCisgICAgcHVibGljIENsaWVudCBnZXRBdXRob3JpemVkQ2xpZW50KCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHtAbGluayBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmUgb2F1dGggZmlsdGVyIGZlYXR1cmV9IHRoYXQgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlCisgICAgICoge0BsaW5rIENsaWVudCBjbGllbnR9IGluc3RhbmNlcyB0byBwZXJmb3JtIGF1dGhlbnRpY2F0ZWQgcmVxdWVzdHMgdG8gdGhlIFNlcnZpY2UgUHJvdmlkZXIuCisgICAgICogPHA+CisgICAgICogVGhlIGF1dGhvcml6YXRpb24gcHJvY2VzcyBtdXN0IGJlIHN1Y2Nlc3NmdWxseSBmaW5pc2hlZCBieSBpbnN0YW5jZSBieSBjYWxsaW5nIG1ldGhvZHMge0BsaW5rICNzdGFydCgpfSBhbmQKKyAgICAgKiB7QGxpbmsgI2ZpbmlzaChTdHJpbmcpfS4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIG9hdXRoIGZpbHRlciBmZWF0dXJlIGNvbmZpZ3VyZWQgd2l0aCByZWNlaXZlZCB7QGNvZGUgQWNjZXNzVG9rZW59LgorICAgICAqLworICAgIHB1YmxpYyBGZWF0dXJlIGdldE9BdXRoMUZlYXR1cmUoKTsKK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L29hdXRoMS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvb2F1dGgxL09BdXRoMUF1dGhvcml6YXRpb25GbG93SW1wbC5qYXZhIGIvc2VjdXJpdHkvb2F1dGgxLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9vYXV0aDEvT0F1dGgxQXV0aG9yaXphdGlvbkZsb3dJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQyNDM1ZAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L29hdXRoMS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvb2F1dGgxL09BdXRoMUF1dGhvcml6YXRpb25GbG93SW1wbC5qYXZhCkBAIC0wLDAgKzEsMjIzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5vYXV0aDE7CisKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Ob3RBdXRob3JpemVkRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50Lkludm9jYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZvcm07CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5vYXV0aDEuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLlZhbHVlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkub2F1dGgxLnNpZ25hdHVyZS5PQXV0aDFQYXJhbWV0ZXJzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9hdXRoMS5zaWduYXR1cmUuT0F1dGgxU2VjcmV0czsKKworLyoqCisgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBPQXV0aDFBdXRob3JpemF0aW9uRmxvd30uIFRoZSBpbnN0YW5jZSBpcyB1c2VkCisgKiB0byBwZXJmb3JtIGF1dGhvcml6YXRpb24gZmxvd3MuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICogQHNpbmNlIDIuMworICovCitjbGFzcyBPQXV0aDFBdXRob3JpemF0aW9uRmxvd0ltcGwgaW1wbGVtZW50cyBPQXV0aDFBdXRob3JpemF0aW9uRmxvdyB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihPQXV0aDFBdXRob3JpemF0aW9uRmxvd0ltcGwuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIC8qKgorICAgICAqIE9BdXRoMUF1dGhvcml6YXRpb25GbG93SW1wbCBidWlsZGVyLgorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBCdWlsZGVyIGltcGxlbWVudHMgT0F1dGgxQnVpbGRlci5GbG93QnVpbGRlciB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBPQXV0aDFQYXJhbWV0ZXJzIHBhcmFtczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBPQXV0aDFTZWNyZXRzIHNlY3JldHM7CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcmVxdWVzdFRva2VuVXJpOworICAgICAgICBwcml2YXRlIFN0cmluZyBhY2Nlc3NUb2tlblVyaTsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgYXV0aG9yaXphdGlvblVyaTsKKyAgICAgICAgcHJpdmF0ZSBDbGllbnQgY2xpZW50OworICAgICAgICBwcml2YXRlIFN0cmluZyBjYWxsYmFja1VyaTsKKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gZW5hYmxlTG9nZ2luZzsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGEgbmV3IGJ1aWxkZXIuCisgICAgICAgICAqIEBwYXJhbSBwYXJhbXMgUHJlLWNvbmZpZ3VyZWQgb2F1dGggcGFyYW1ldGVycy4KKyAgICAgICAgICogQHBhcmFtIHNlY3JldHMgUHJlLWNvbmZpZ3VyZWQgb2F1dGggc2VjcmV0cy4KKyAgICAgICAgICogQHBhcmFtIHJlcXVlc3RUb2tlblVyaSBSZXF1ZXN0IHRva2VuIHVyaS4KKyAgICAgICAgICogQHBhcmFtIGFjY2Vzc1Rva2VuVXJpIEFjY2VzcyB0b2tlbiB1cmkuCisgICAgICAgICAqIEBwYXJhbSBhdXRob3JpemF0aW9uVXJpIEF1dGhvcml6YXRpb24gdXJpLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIoZmluYWwgT0F1dGgxUGFyYW1ldGVycyBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9BdXRoMVNlY3JldHMgc2VjcmV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJlcXVlc3RUb2tlblVyaSwKKyAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFjY2Vzc1Rva2VuVXJpLAorICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYXV0aG9yaXphdGlvblVyaSkgeworICAgICAgICAgICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7CisgICAgICAgICAgICB0aGlzLnNlY3JldHMgPSBzZWNyZXRzOworCisgICAgICAgICAgICB0aGlzLnJlcXVlc3RUb2tlblVyaSA9IHJlcXVlc3RUb2tlblVyaTsKKyAgICAgICAgICAgIHRoaXMuYWNjZXNzVG9rZW5VcmkgPSBhY2Nlc3NUb2tlblVyaTsKKyAgICAgICAgICAgIHRoaXMuYXV0aG9yaXphdGlvblVyaSA9IGF1dGhvcml6YXRpb25Vcmk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE9BdXRoMUJ1aWxkZXIuRmxvd0J1aWxkZXIgY2FsbGJhY2tVcmkoZmluYWwgU3RyaW5nIGNhbGxiYWNrVXJpKSB7CisgICAgICAgICAgICB0aGlzLmNhbGxiYWNrVXJpID0gY2FsbGJhY2tVcmk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT0F1dGgxQnVpbGRlci5GbG93QnVpbGRlciBjbGllbnQoZmluYWwgQ2xpZW50IGNsaWVudCkgeworICAgICAgICAgICAgdGhpcy5jbGllbnQgPSBjbGllbnQ7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT0F1dGgxQnVpbGRlci5GbG93QnVpbGRlciBlbmFibGVMb2dnaW5nKCkgeworICAgICAgICAgICAgdGhpcy5lbmFibGVMb2dnaW5nID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9BdXRoMUF1dGhvcml6YXRpb25GbG93SW1wbCBidWlsZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgT0F1dGgxQXV0aG9yaXphdGlvbkZsb3dJbXBsKHBhcmFtcywgc2VjcmV0cywgcmVxdWVzdFRva2VuVXJpLCBhY2Nlc3NUb2tlblVyaSwgYXV0aG9yaXphdGlvblVyaSwKKyAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tVcmksIGNsaWVudCwgZW5hYmxlTG9nZ2luZyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiogVGhlIE9BdXRoIHBhcmFtZXRlcnMgdG8gYmUgdXNlZCBpbiBnZW5lcmF0aW5nIHNpZ25hdHVyZS4gKi8KKyAgICBwcml2YXRlIGZpbmFsIE9BdXRoMVBhcmFtZXRlcnMgcGFyYW1ldGVyczsKKworICAgIC8qKiBUaGUgT0F1dGggc2VjcmV0cyB0byBiZSB1c2VkIGluIGdlbmVyYXRpbmcgc2lnbmF0dXJlLiAqLworICAgIHByaXZhdGUgZmluYWwgT0F1dGgxU2VjcmV0cyBzZWNyZXRzOworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcmVxdWVzdFRva2VuVXJpOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGFjY2Vzc1Rva2VuVXJpOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGF1dGhvcml6YXRpb25Vcmk7CisKKyAgICBwcml2YXRlIGZpbmFsIENsaWVudCBjbGllbnQ7CisKKyAgICBwcml2YXRlIHZvbGF0aWxlIEFjY2Vzc1Rva2VuIGFjY2Vzc1Rva2VuOworICAgIHByaXZhdGUgZmluYWwgVmFsdWU8RmVhdHVyZT4gb0F1dGgxQ2xpZW50RmlsdGVyRmVhdHVyZSA9IG5ldyBWYWx1ZTxGZWF0dXJlPigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBGZWF0dXJlIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgT0F1dGgxQnVpbGRlckltcGwocGFyYW1ldGVycywgc2VjcmV0cykuZmVhdHVyZSgpCisgICAgICAgICAgICAgICAgICAgIC5hY2Nlc3NUb2tlbihhY2Nlc3NUb2tlbikKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBPQXV0aDFBdXRob3JpemF0aW9uRmxvd0ltcGwoZmluYWwgT0F1dGgxUGFyYW1ldGVycyBwYXJhbXMsIGZpbmFsIE9BdXRoMVNlY3JldHMgc2VjcmV0cywgZmluYWwgU3RyaW5nIHJlcXVlc3RUb2tlblVyaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYWNjZXNzVG9rZW5VcmksIGZpbmFsIFN0cmluZyBhdXRob3JpemF0aW9uVXJpLCBmaW5hbCBTdHJpbmcgY2FsbGJhY2tVcmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xpZW50IGNsaWVudCwgZmluYWwgYm9vbGVhbiBlbmFibGVMb2dnaW5nKSB7CisgICAgICAgIHRoaXMucGFyYW1ldGVycyA9IHBhcmFtczsKKyAgICAgICAgdGhpcy5zZWNyZXRzID0gc2VjcmV0czsKKyAgICAgICAgdGhpcy5yZXF1ZXN0VG9rZW5VcmkgPSByZXF1ZXN0VG9rZW5Vcmk7CisgICAgICAgIHRoaXMuYWNjZXNzVG9rZW5VcmkgPSBhY2Nlc3NUb2tlblVyaTsKKyAgICAgICAgdGhpcy5hdXRob3JpemF0aW9uVXJpID0gYXV0aG9yaXphdGlvblVyaTsKKworICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMuY2xpZW50ID0gY2xpZW50OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5jbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0J1aWxkZXIoKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWcgPSB0aGlzLmNsaWVudC5nZXRDb25maWd1cmF0aW9uKCk7CisKKyAgICAgICAgaWYgKGVuYWJsZUxvZ2dpbmcgJiYgIWNvbmZpZy5pc1JlZ2lzdGVyZWQoTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpKSB7CisgICAgICAgICAgICB0aGlzLmNsaWVudC5yZWdpc3RlcihuZXcgTG9nZ2luZ0ZlYXR1cmUoTE9HR0VSLCBMb2dnaW5nRmVhdHVyZS5WZXJib3NpdHkuUEFZTE9BRF9BTlkpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWNvbmZpZy5pc1JlZ2lzdGVyZWQoT0F1dGgxQ2xpZW50RmVhdHVyZS5jbGFzcykpIHsKKyAgICAgICAgICAgIHRoaXMuY2xpZW50LnJlZ2lzdGVyKG5ldyBPQXV0aDFDbGllbnRGZWF0dXJlKHBhcmFtcywgc2VjcmV0cykpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNhbGxiYWNrVXJpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMucGFyYW1ldGVycy5jYWxsYmFjayhjYWxsYmFja1VyaSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2VjcmV0cy5nZXRDb25zdW1lclNlY3JldCgpID09IG51bGwgfHwgcGFyYW1ldGVycy5nZXRDb25zdW1lcktleSgpID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfQ09ORklHVVJBVElPTl9NSVNTSU5HX0NPTlNVTUVSKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBJbnZvY2F0aW9uLkJ1aWxkZXIgYWRkUHJvcGVydGllcyhmaW5hbCBJbnZvY2F0aW9uLkJ1aWxkZXIgaW52b2NhdGlvbkJ1aWxkZXIpIHsKKyAgICAgICAgcmV0dXJuIGludm9jYXRpb25CdWlsZGVyCisgICAgICAgICAgICAgICAgLnByb3BlcnR5KE9BdXRoMUNsaWVudFN1cHBvcnQuT0FVVEhfUFJPUEVSVFlfT0FVVEhfUEFSQU1FVEVSUywgcGFyYW1ldGVycykKKyAgICAgICAgICAgICAgICAucHJvcGVydHkoT0F1dGgxQ2xpZW50U3VwcG9ydC5PQVVUSF9QUk9QRVJUWV9PQVVUSF9TRUNSRVRTLCBzZWNyZXRzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHN0YXJ0KCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IGFkZFByb3BlcnRpZXMoY2xpZW50LnRhcmdldChyZXF1ZXN0VG9rZW5VcmkpLnJlcXVlc3QoKSkKKyAgICAgICAgICAgICAgICAucG9zdChudWxsKTsKKyAgICAgICAgaWYgKHJlc3BvbnNlLmdldFN0YXR1cygpICE9IDIwMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfUkVRVUVTVF9SRVFVRVNUX1RPS0VOKHJlc3BvbnNlLmdldFN0YXR1cygpKSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGZvcm1QYXJhbXMgPSByZXNwb25zZS5yZWFkRW50aXR5KEZvcm0uY2xhc3MpLmFzTWFwKCk7CisgICAgICAgIHBhcmFtZXRlcnMudG9rZW4oZm9ybVBhcmFtcy5nZXRGaXJzdChPQXV0aDFQYXJhbWV0ZXJzLlRPS0VOKSk7CisgICAgICAgIHNlY3JldHMudG9rZW5TZWNyZXQoZm9ybVBhcmFtcy5nZXRGaXJzdChPQXV0aDFQYXJhbWV0ZXJzLlRPS0VOX1NFQ1JFVCkpOworCisgICAgICAgIHJldHVybiBVcmlCdWlsZGVyLmZyb21VcmkoYXV0aG9yaXphdGlvblVyaSkucXVlcnlQYXJhbShPQXV0aDFQYXJhbWV0ZXJzLlRPS0VOLCBwYXJhbWV0ZXJzLmdldFRva2VuKCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgQWNjZXNzVG9rZW4gZmluaXNoKCkgeworICAgICAgICByZXR1cm4gZmluaXNoKG51bGwpOworICAgIH0KKworICAgIHB1YmxpYyBBY2Nlc3NUb2tlbiBmaW5pc2goZmluYWwgU3RyaW5nIHZlcmlmaWVyKSB7CisgICAgICAgIHBhcmFtZXRlcnMuc2V0VmVyaWZpZXIodmVyaWZpZXIpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IGFkZFByb3BlcnRpZXMoY2xpZW50LnRhcmdldChhY2Nlc3NUb2tlblVyaSkucmVxdWVzdCgpKS5wb3N0KG51bGwpOworICAgICAgICAvLyBhY2Nlc3NUb2tlbiByZXF1ZXN0IGZhaWxlZAorICAgICAgICBpZiAocmVzcG9uc2UuZ2V0U3RhdHVzKCkgPj0gNDAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9SRVFVRVNUX0FDQ0VTU19UT0tFTihyZXNwb25zZS5nZXRTdGF0dXMoKSkpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIEZvcm0gZm9ybSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoRm9ybS5jbGFzcyk7CisgICAgICAgIGZpbmFsIFN0cmluZyBhY2Nlc3NUb2tlbiA9IGZvcm0uYXNNYXAoKS5nZXRGaXJzdChPQXV0aDFQYXJhbWV0ZXJzLlRPS0VOKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGFjY2Vzc1Rva2VuU2VjcmV0ID0gZm9ybS5hc01hcCgpLmdldEZpcnN0KE9BdXRoMVBhcmFtZXRlcnMuVE9LRU5fU0VDUkVUKTsKKworICAgICAgICBpZiAoYWNjZXNzVG9rZW4gPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5vdEF1dGhvcml6ZWRFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfUkVRVUVTVF9BQ0NFU1NfVE9LRU5fTlVMTCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHBhcmFtZXRlcnMudG9rZW4oYWNjZXNzVG9rZW4pOworICAgICAgICBzZWNyZXRzLnRva2VuU2VjcmV0KGFjY2Vzc1Rva2VuU2VjcmV0KTsKKyAgICAgICAgZmluYWwgQWNjZXNzVG9rZW4gcmVzdWx0VG9rZW4gPSBuZXcgQWNjZXNzVG9rZW4ocGFyYW1ldGVycy5nZXRUb2tlbigpLCBzZWNyZXRzLmdldFRva2VuU2VjcmV0KCkpOworICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuID0gcmVzdWx0VG9rZW47CisgICAgICAgIHJldHVybiByZXN1bHRUb2tlbjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2xpZW50IGdldEF1dGhvcml6ZWRDbGllbnQoKSB7CisgICAgICAgIHJldHVybiBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpLnJlZ2lzdGVyKGdldE9BdXRoMUZlYXR1cmUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEZlYXR1cmUgZ2V0T0F1dGgxRmVhdHVyZSgpIHsKKyAgICAgICAgaWYgKHRoaXMuYWNjZXNzVG9rZW4gPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9GTE9XX05PVF9GSU5JU0hFRCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gb0F1dGgxQ2xpZW50RmlsdGVyRmVhdHVyZS5nZXQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9vYXV0aDEtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L29hdXRoMS9PQXV0aDFCdWlsZGVyLmphdmEgYi9zZWN1cml0eS9vYXV0aDEtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L29hdXRoMS9PQXV0aDFCdWlsZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI1ZWM1YQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L29hdXRoMS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvb2F1dGgxL09BdXRoMUJ1aWxkZXIuamF2YQpAQCAtMCwwICsxLDE4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQub2F1dGgxOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmU7CisKKy8qKgorICogQnVpbGRlciBvZiBPQXV0aCAxIGNsaWVudCBzdXBwb3J0LiBUaGlzIGJ1aWxkZXIgY2FuIGJ1aWxkIHtAbGluayBPQXV0aDFBdXRob3JpemF0aW9uRmxvd30gdXNpbmcgYSBtZXRob2QKKyAqIHtAbGluayAjYXV0aG9yaXphdGlvbkZsb3coU3RyaW5nLCBTdHJpbmcsIFN0cmluZyl9IGFuZCB7QGxpbmsgRmVhdHVyZSBmaWx0ZXIgZmVhdHVyZX0gdXNpbmcgYSBtZXRob2QKKyAqIHtAbGluayAjZmVhdHVyZSgpfS4gQmVmb3JlIG9uZSBvZiB0aGVzZSBtZXRob2RzIGlzIGludm9rZWQsIHByb3BlcnRpZXMgY29tbW9uIGZvciBib3RoIGZlYXR1cmVzCisgKiBjYW4gYmUgZGVmaW5lZCB1c2luZyBtZXRob2RzIG9mIHRoaXMgYnVpbGRlci4gSG93ZXZlciwgZm9yIGRlZmF1bHQgT0F1dGggY29uZmlndXJhdGlvbiB0aGVyZSBzaG91bGQgbm90IGJlCisgKiBubyBuZWVkIHRvIGNhbGwgdGhlc2Uge0Bjb2RlIHNldCp9IG1ldGhvZHMgb2YgdGhpcyBidWlsZGVyIGFuZCB0aGUgYnVpbGRlciBjYW4gYmUgZGlyZWN0bHkgdXNlZCB0byBidWlsZAorICogbWVudGlvbmVkIGZlYXR1cmVzLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqIEBzaW5jZSAyLjMKKyAqLworcHVibGljIGludGVyZmFjZSBPQXV0aDFCdWlsZGVyIHsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgc2lnbmF0dXJlIG1ldGhvZCBuYW1lLiBUaGUgc2lnbmF0dXJlIG1ldGhvZHMgaW1wbGVtZW50CisgICAgICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9hdXRoMS5zaWduYXR1cmUuT0F1dGgxU2lnbmF0dXJlTWV0aG9kfSBhbmQgdGhlIG5hbWUgaXMgcmV0cmlldmVkIGZyb20KKyAgICAgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkub2F1dGgxLnNpZ25hdHVyZS5PQXV0aDFTaWduYXR1cmVNZXRob2QjbmFtZSgpfSBtZXRob2QuIEJ1aWxkLWluIHNpZ25hdHVyZQorICAgICAqIG1ldGhvZHMgYXJlIHtAY29kZSBITUFDLVNIQTF9LCB7QGNvZGUgUlNBLVNIQTF9IGFuZCB7QGNvZGUgUExBSU5URVhUfS4KKyAgICAgKiA8cD4KKyAgICAgKiBEZWZhdWx0IHZhbHVlIGlzIHtAY29kZSBITUFDLVNIQTF9LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzaWduYXR1cmVNZXRob2QgU2lnbmF0dXJlIG1ldGhvZCBuYW1lLgorICAgICAqIEByZXR1cm4gVGhpcyBidWlsZGVyIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBPQXV0aDFCdWlsZGVyIHNpZ25hdHVyZU1ldGhvZChTdHJpbmcgc2lnbmF0dXJlTWV0aG9kKTsKKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcmVhbG0gdG8gd2hpY2ggdGhlIHVzZXIgd2FudHMgdG8gYXV0aGVudGljYXRlLiBUaGUgcGFyYW1ldGVyCisgICAgICogICAgICAgICAgICAgIHdpbGwgYmUgc2VudCBpbiBBdXRoZW50aWNhdGVkIHJlcXVlc3QgYW5kIHVzZWQgZHVyaW5nIEF1dGhvcml6YXRpb24gRmxvdy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWFsbSBSZWFsbSBvbiB0aGUgc2VydmVyIHRvIHdoaWNoIHRoZSB1c2VyIGF1dGhlbnRpY2F0aW9uIGlzIHJlcXVpcmVkLgorICAgICAqIEByZXR1cm4gVGhpcyBidWlsZGVyIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBPQXV0aDFCdWlsZGVyIHJlYWxtKFN0cmluZyByZWFsbSk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHRpbWVzdGFtcC4gVGhlIHRpbWVzdGFtcCBpZiBkZWZpbmVkIHdpbGwgYmUgdXNlZCBpbiB7QGNvZGUgQXV0aG9yaXphdGlvbn0gaGVhZGVyLiBVc3VhbGx5IHRoaXMKKyAgICAgKiBwYXJhbWV0ZXIgaXMgbm90IGRlZmluZWQgZXhwbGljaXRseSBieSB0aGlzIG1ldGhvZCBhbmQgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGZpbGxlZCB3aXRoIHRoZSBjdXJyZW50CisgICAgICogdGltZSBkdXJpbmcgdGhlIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGltZXN0YW1wIFRpbWVzdGFtcCB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIFRoaXMgYnVpbGRlciBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT0F1dGgxQnVpbGRlciB0aW1lc3RhbXAoU3RyaW5nIHRpbWVzdGFtcCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG5vbmNlLiBOb25jZSAoc2hvcnRjdXQgb2YgIm51bWJlciB1c2VkIG9uY2UiKSBpcyB1c2VkIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSByZXF1ZXN0IGFuZAorICAgICAqIHByZXZlbnQgZnJvbSBtdWx0aXBsZSB1c2FnZSBvZiB0aGUgc2FtZSBzaWduZWQgcmVxdWVzdC4gVGhlIG5vbmNlIGlmIGRlZmluZWQgd2lsbCBiZSB1c2VkCisgICAgICogaW4gdGhlIHtAY29kZSBBdXRob3JpemF0aW9ufSBoZWFkZXIgaWYgZGVmaW5lZC4gVXN1YWxseSB0aGlzCisgICAgICogcGFyYW1ldGVyIGlzIG5vdCBkZWZpbmVkIGV4cGxpY2l0bHkgYnkgdGhpcyBtZXRob2QgYW5kIHdpbGwgYmUgYXV0b21hdGljYWxseSBmaWxsZWQgd2l0aCB0aGUgcmFuZG9tbHkKKyAgICAgKiBnZW5lcmF0ZWQgVUlEIGR1cmluZyB0aGUgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBub25jZSBOb25jZSB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIFRoaXMgYnVpbGRlciBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT0F1dGgxQnVpbGRlciBub25jZShTdHJpbmcgbm9uY2UpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSB2ZXJzaW9uIG9mIHRoZSBPQXV0aCBwcm90b2NvbC4gVGhlIHZlcnNpb24sIGlmIGRlZmluZWQsIHdpbGwgYmUgdXNlZCBpbiB0aGUge0Bjb2RlIEF1dGhvcml6YXRpb259CisgICAgICogaGVhZGVyIG90aGVyd2lzZSBkZWZhdWx0IHZhbHVlIHtAY29kZSAxLjF9IHdpbGwgYmUgdXNlZC4gVXN1YWxseSB0aGlzIHBhcmFtZXRlciBkb2VzIG5vdCBuZWVkIHRvIGJlCisgICAgICogb3ZlcndyaXR0ZW4gYnkgdGhpcyBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmVyc2lvbiBPQXV0aCBwcm90b2NvbCB2ZXJzaW9uIHBhcmFtZXRlci4KKyAgICAgKiBAcmV0dXJuIFRoaXMgYnVpbGRlciBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT0F1dGgxQnVpbGRlciB2ZXJzaW9uKFN0cmluZyB2ZXJzaW9uKTsKKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBidWlsZGVyIG9mIHtAbGluayBGZWF0dXJlIGZpbHRlciBmZWF0dXJlfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGJ1aWxkZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBidWlsZCB7QGNvZGUgT0F1dGgxQ2xpZW50RmVhdHVyZX0uCisgICAgICovCisgICAgcHVibGljIEZpbHRlckZlYXR1cmVCdWlsZGVyIGZlYXR1cmUoKTsKKworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBidWlsZGVyIG9mIHtAbGluayBPQXV0aDFBdXRob3JpemF0aW9uRmxvd30uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdFRva2VuVXJpIFVSSSBvZiB0aGUgZW5kcG9pbnQgb24gdGhlIEF1dGhvcml6YXRpb24gU2VydmVyIHdoZXJlIFJlcXVlc3QgVG9rZW4gY2FuIGJlIG9idGFpbmVkLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFVSSSBpcyBkZWZpbmVkIGJ5IHRoZSBTZXJ2aWNlIFByb3ZpZGVyLgorICAgICAqIEBwYXJhbSBhY2Nlc3NUb2tlblVyaSBVUkkgb2YgdGhlIGVuZHBvaW50IG9uIHRoZSBBdXRob3JpemF0aW9uIFNlcnZlciB3aGVyZSBBY2Nlc3MgVG9rZW4gY2FuIGJlIG9idGFpbmVkLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFVSSSBpcyBkZWZpbmVkIGJ5IHRoZSBTZXJ2aWNlIFByb3ZpZGVyLgorICAgICAqIEBwYXJhbSBhdXRob3JpemF0aW9uVXJpIFVSSSBvZiB0aGUgZW5kcG9pbnQgb24gdGhlIEF1dGhvcml6YXRpb24gU2VydmVyIHRvIHdoaWNoIHRoZSB1c2VyIChyZXNvdXJjZSBvd25lcikKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgcmVkaXJlY3RlZCBpbiBvcmRlciB0byBncmFudCBhY2Nlc3MgdG8gdGhpcyBhcHBsaWNhdGlvbiAob3VyIGNvbnN1bWVyKS4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgVVJJIGlzIGRlZmluZWQgYnkgdGhlIFNlcnZpY2UgUHJvdmlkZXIuCisgICAgICogQHJldHVybiBUaGUgYnVpbGRlciB0aGF0IGNhbiBiZSB1c2VkIHRvIGJ1aWxkIHtAY29kZSBPQXV0aDFBdXRob3JpemF0aW9uRmxvd30uCisgICAgICovCisgICAgcHVibGljIEZsb3dCdWlsZGVyIGF1dGhvcml6YXRpb25GbG93KFN0cmluZyByZXF1ZXN0VG9rZW5VcmksIFN0cmluZyBhY2Nlc3NUb2tlblVyaSwgU3RyaW5nIGF1dGhvcml6YXRpb25VcmkpOworCisKKyAgICAvKioKKyAgICAgKiBCdWlsZGVyIG9mIHRoZSB7QGxpbmsgamF2YXgud3MucnMuY29yZS5GZWF0dXJlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBGaWx0ZXJGZWF0dXJlQnVpbGRlciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIEFjY2VzcyBUb2tlbiB0aGF0IHdpbGwgYmUgdXNlZCBmb3Igc2lnbmluZyB0aGUgcmVxdWVzdHMuIElmIHRoaXMgbWV0aG9kIGlzIG5vdCBjYWxsZWQsCisgICAgICAgICAqIG5vIGFjY2VzcyB0b2tlbiB3aWxsIGJlIGRlZmluZWQgaW4gdGhlIHJlc3VsdGluZyBmaWx0ZXIgYW5kIGl0IHdpbGwgaGF2ZSB0byBiZSBzdXBwbGllZCB1c2luZworICAgICAgICAgKiB7QGxpbmsgT0F1dGgxQ2xpZW50U3VwcG9ydCNPQVVUSF9QUk9QRVJUWV9BQ0NFU1NfVE9LRU59IHJlcXVlc3QgcHJvcGVydHkgZm9yIGVhY2ggcmVxdWVzdC4KKyAgICAgICAgICogVGhlIHByb3BlcnR5IGNvdWxkIGJlIGFsc28gdXNlZCB0byBvdmVycmlkZSBzZXR0aW5ncyBkZWZpbmVkIGJ5IHRoaXMgbWV0aG9kLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYWNjZXNzVG9rZW4gQWNjZXNzIHRva2VuLgorICAgICAgICAgKiBAcmV0dXJuIHRoaXMgYnVpbGRlci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBGaWx0ZXJGZWF0dXJlQnVpbGRlciBhY2Nlc3NUb2tlbihBY2Nlc3NUb2tlbiBhY2Nlc3NUb2tlbik7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJ1aWxkIHRoZSB7QGxpbmsgRmVhdHVyZSBvYXV0aCAxIGZpbHRlciBmZWF0dXJlfS4gVGhlIGZlYXR1cmUgY2FuIGJlIHRoZW4gcmVnaXN0ZXJlZCBpbnRvIHRoZQorICAgICAgICAgKiBjbGllbnQgY29uZmlndXJhdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBDbGllbnQgT0F1dGggMSBmZWF0dXJlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEZlYXR1cmUgYnVpbGQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCdWlsZGVyIG9mIHRoZSB7QGxpbmsgT0F1dGgxQXV0aG9yaXphdGlvbkZsb3d9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEZsb3dCdWlsZGVyIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBjYWxsYmFjayBVUkkgdG8gd2hpY2ggdGhlIHVzZXIgKHJlc291cmNlIG93bmVyKSBzaG91bGQgYmUgcmVkaXJlY3RlZCBhZnRlciBoZS9zaGUKKyAgICAgICAgICogZ3JhbnRzIGFjY2VzcyB0byB0aGlzIGFwcGxpY2F0aW9uLiBJbiBtb3N0IGNhc2VzLCB0aGUgVVJJIGlzIHVuZGVyIGNvbnRyb2wgb2YgdGhpcyBhcHBsaWNhdGlvbgorICAgICAgICAgKiBhbmQgcmVxdWVzdCBkb25lIG9uIHRoaXMgVVJJIHdpbGwgYmUgdXNlZCB0byBleHRyYWN0IHF1ZXJ5IHBhcmFtZXRlciB7QGNvZGUgdmVyaWZpZXJ9IHRoYXQgd2lsbCBiZSB1c2VkIGluCisgICAgICAgICAqIHtAbGluayBPQXV0aDFBdXRob3JpemF0aW9uRmxvdyNmaW5pc2goU3RyaW5nKX0gbWV0aG9kLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogSWYgVVJJIGlzIG5vdCBkZWZpbmVkIGJ5IHRoaXMgbWV0aG9kLCB0aGUgZGVmYXVsdCB2YWx1ZSB7QGNvZGUgb29ifSB3aWxsIGJlIHVzZWQgaW4gdGhlIEF1dGhvcml6YXRpb24KKyAgICAgICAgICogRmxvdyB3aGljaCBzaG91bGQgY2F1c2UgdGhhdCB7QGNvZGUgdmVyaWZpZXJ9IHdpbGwgYmUgcGFzc2VkIHRvIGFwcGxpY2F0aW9uIGluIG90aGVyIHdheSB0aGFuIHJlcXVlc3QKKyAgICAgICAgICogcmVkaXJlY3Rpb24gKGZvciBleGFtcGxlIHNob3duIHRvIHRoZSB1c2VyIHVzaW5nIGh0bWwgcGFnZSkuCisgICAgICAgICAqIDwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrVXJpIFVSSSB0aGF0IHNob3VsZCByZWNlaXZlIGF1dGhvcml6YXRpb24gcmVzcG9uc2UgZnJvbSB0aGUgU2VydmljZSBQcm92aWRlci4KKyAgICAgICAgICogQHJldHVybiB0aGlzIGJ1aWxkZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgRmxvd0J1aWxkZXIgY2FsbGJhY2tVcmkoU3RyaW5nIGNhbGxiYWNrVXJpKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBjbGllbnQgdGhhdCBzaG91bGQgYmUgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSB7QGNvZGUgT0F1dGgxQXV0aG9yaXphdGlvbkZsb3d9IHRvIG1ha2UgcmVxdWVzdHMgdG8KKyAgICAgICAgICogQXV0aG9yaXphdGlvbiBTZXJ2ZXIuIElmIHRoaXMgbWV0aG9kIGlzIG5vdCBjYWxsZWQsIGl0IGlzIHVwIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiB0byBjcmVhdGUgb3IgZ2V0CisgICAgICAgICAqIGFueSBwcml2YXRlIGNsaWVudCBpbnN0YW5jZSB0byBwZXJmb3JtIHRoZXNlIHJlcXVlc3RzLiBUaGlzIG1ldGhvZCBjb3VsZCBiZSB1c2VkIG1haW5seSBmb3IKKyAgICAgICAgICogcGVyZm9ybWFuY2UgcmVhc29ucyB0byBhdm9pZCBjcmVhdGlvbiBvZiBuZXcgY2xpZW50IGluc3RhbmNlcyBhbmQgaGF2ZSBjb250cm9sIGFib3V0IGNyZWF0ZWQgY2xpZW50CisgICAgICAgICAqIGluc3RhbmNlcyB1c2VkIGluIHRoZSBhcHBsaWNhdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNsaWVudCBDbGllbnQgaW5zdGFuY2UuCisgICAgICAgICAqIEByZXR1cm4gdGhpcyBidWlsZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEZsb3dCdWlsZGVyIGNsaWVudChDbGllbnQgY2xpZW50KTsKKworICAgICAgICAvKioKKyAgICAgICAgICogRW5hYmxlIGxvZ2dpbmcgKGhlYWRlcnMgYW5kIGVudGl0aWVzKSBvZiBPQXV0aCByZXF1ZXN0cyBhbmQgcmVzcG9uc2VzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHRoaXMgYnVpbGRlci4KKyAgICAgICAgICogQHNpbmNlIDIuNworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEZsb3dCdWlsZGVyIGVuYWJsZUxvZ2dpbmcoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQnVpbGQgdGhlIHtAY29kZSBPQXV0aDFBdXRob3JpemF0aW9uRmxvd30uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gQXV0aG9yaXphdGlvbiBmbG93LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE9BdXRoMUF1dGhvcml6YXRpb25GbG93IGJ1aWxkKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvb2F1dGgxLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9vYXV0aDEvT0F1dGgxQnVpbGRlckltcGwuamF2YSBiL3NlY3VyaXR5L29hdXRoMS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvb2F1dGgxL09BdXRoMUJ1aWxkZXJJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNlMTQ4ZgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L29hdXRoMS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvb2F1dGgxL09BdXRoMUJ1aWxkZXJJbXBsLmphdmEKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50Lm9hdXRoMTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9hdXRoMS5zaWduYXR1cmUuT0F1dGgxUGFyYW1ldGVyczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5vYXV0aDEuc2lnbmF0dXJlLk9BdXRoMVNlY3JldHM7CisKKy8qKgorICogT0F1dGggMSBjbGllbnQgYnVpbGRlciBkZWZhdWx0IGltcGxlbWVudGF0aW9uLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqIEBzaW5jZSAyLjMKKyAqLworY2xhc3MgT0F1dGgxQnVpbGRlckltcGwgaW1wbGVtZW50cyBPQXV0aDFCdWlsZGVyIHsKKworICAgIHByaXZhdGUgZmluYWwgT0F1dGgxUGFyYW1ldGVycyBwYXJhbXM7CisgICAgcHJpdmF0ZSBmaW5hbCBPQXV0aDFTZWNyZXRzIHNlY3JldHM7CisgICAgcHJpdmF0ZSBDb25zdW1lckNyZWRlbnRpYWxzIGNvbnN1bWVyQ3JlZGVudGlhbHM7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgYnVpbGRlciBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25zdW1lckNyZWRlbnRpYWxzIENvbnN1bWVyIGNyZWRlbnRpYWxzLgorICAgICAqLworICAgIE9BdXRoMUJ1aWxkZXJJbXBsKGZpbmFsIENvbnN1bWVyQ3JlZGVudGlhbHMgY29uc3VtZXJDcmVkZW50aWFscykgeworICAgICAgICB0aGlzKG5ldyBPQXV0aDFQYXJhbWV0ZXJzKCksIG5ldyBPQXV0aDFTZWNyZXRzKCksIGNvbnN1bWVyQ3JlZGVudGlhbHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBidWlsZGVyIGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmFtcyBQcmUtY29uZmlndXJlZCBvYXV0aCBwYXJhbWV0ZXJzLgorICAgICAqIEBwYXJhbSBzZWNyZXRzIFByZS1jb25maWd1cmVkIG9hdXRoIHNlY3JldHMuCisgICAgICovCisgICAgT0F1dGgxQnVpbGRlckltcGwoZmluYWwgT0F1dGgxUGFyYW1ldGVycyBwYXJhbXMsIGZpbmFsIE9BdXRoMVNlY3JldHMgc2VjcmV0cykgeworICAgICAgICB0aGlzKHBhcmFtcywgc2VjcmV0cywgbmV3IENvbnN1bWVyQ3JlZGVudGlhbHMocGFyYW1zLmdldENvbnN1bWVyS2V5KCksIHNlY3JldHMuZ2V0Q29uc3VtZXJTZWNyZXQoKSkpOworICAgIH0KKworICAgIHByaXZhdGUgT0F1dGgxQnVpbGRlckltcGwoZmluYWwgT0F1dGgxUGFyYW1ldGVycyBwYXJhbXMsIGZpbmFsIE9BdXRoMVNlY3JldHMgc2VjcmV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbnN1bWVyQ3JlZGVudGlhbHMgY29uc3VtZXJDcmVkZW50aWFscykgeworICAgICAgICB0aGlzLnBhcmFtcyA9IHBhcmFtczsKKyAgICAgICAgdGhpcy5zZWNyZXRzID0gc2VjcmV0czsKKworICAgICAgICAvLyBzcGVjIGRlZmluZXMgdGhhdCB3aGVuIG5vIGNhbGxiYWNrIHVyaSBpcyB1c2VkIChlLmcuIGNsaWVudCBpcyB1bmFibGUgdG8gcmVjZWl2ZSBjYWxsYmFjaworICAgICAgICAvLyBhcyBpdCBpcyBhIG1vYmlsZSBhcHBsaWNhdGlvbiksIHRoZSAib29iIiB2YWx1ZSBzaG91bGQgYmUgdXNlZC4KKyAgICAgICAgaWYgKHRoaXMucGFyYW1zLmdldENhbGxiYWNrKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhpcy5wYXJhbXMuc2V0Q2FsbGJhY2soT0F1dGgxUGFyYW1ldGVycy5OT19DQUxMQkFDS19VUklfVkFMVUUpOworICAgICAgICB9CisgICAgICAgIHRoaXMuY29uc3VtZXJDcmVkZW50aWFscyA9IGNvbnN1bWVyQ3JlZGVudGlhbHM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9BdXRoMUJ1aWxkZXJJbXBsIHNpZ25hdHVyZU1ldGhvZChTdHJpbmcgc2lnbmF0dXJlTWV0aG9kKSB7CisgICAgICAgIHBhcmFtcy5zZXRTaWduYXR1cmVNZXRob2Qoc2lnbmF0dXJlTWV0aG9kKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9BdXRoMUJ1aWxkZXJJbXBsIHJlYWxtKFN0cmluZyByZWFsbSkgeworICAgICAgICBwYXJhbXMuc2V0UmVhbG0ocmVhbG0pOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT0F1dGgxQnVpbGRlckltcGwgdGltZXN0YW1wKFN0cmluZyB0aW1lc3RhbXApIHsKKyAgICAgICAgcGFyYW1zLnNldFRpbWVzdGFtcCh0aW1lc3RhbXApOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT0F1dGgxQnVpbGRlckltcGwgbm9uY2UoU3RyaW5nIHRpbWVzdGFtcCkgeworICAgICAgICBwYXJhbXMuc2V0Tm9uY2UodGltZXN0YW1wKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9BdXRoMUJ1aWxkZXJJbXBsIHZlcnNpb24oU3RyaW5nIHRpbWVzdGFtcCkgeworICAgICAgICBwYXJhbXMuc2V0VmVyc2lvbih0aW1lc3RhbXApOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRmlsdGVyRmVhdHVyZUJ1aWxkZXIgZmVhdHVyZSgpIHsKKyAgICAgICAgZGVmaW5lQ3JlZGVudGlhbHNQYXJhbXMoKTsKKyAgICAgICAgcmV0dXJuIG5ldyBGaWx0ZXJCdWlsZGVySW1wbChwYXJhbXMsIHNlY3JldHMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBkZWZpbmVDcmVkZW50aWFsc1BhcmFtcygpIHsKKyAgICAgICAgcGFyYW1zLnNldENvbnN1bWVyS2V5KGNvbnN1bWVyQ3JlZGVudGlhbHMuZ2V0Q29uc3VtZXJLZXkoKSk7CisgICAgICAgIHNlY3JldHMuc2V0Q29uc3VtZXJTZWNyZXQoY29uc3VtZXJDcmVkZW50aWFscy5nZXRDb25zdW1lclNlY3JldCgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgRmxvd0J1aWxkZXIgYXV0aG9yaXphdGlvbkZsb3coU3RyaW5nIHJlcXVlc3RUb2tlblVyaSwgU3RyaW5nIGFjY2Vzc1Rva2VuVXJpLCBTdHJpbmcgYXV0aG9yaXphdGlvblVyaSkgeworICAgICAgICBkZWZpbmVDcmVkZW50aWFsc1BhcmFtcygpOworICAgICAgICByZXR1cm4gbmV3IE9BdXRoMUF1dGhvcml6YXRpb25GbG93SW1wbC5CdWlsZGVyKHBhcmFtcywgc2VjcmV0cywgcmVxdWVzdFRva2VuVXJpLCBhY2Nlc3NUb2tlblVyaSwgYXV0aG9yaXphdGlvblVyaSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogT0F1dGggMSBjbGllbnQgZmlsdGVyIGZlYXR1cmUgYnVpbGRlciBkZWZhdWx0IGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBGaWx0ZXJCdWlsZGVySW1wbCBpbXBsZW1lbnRzIEZpbHRlckZlYXR1cmVCdWlsZGVyIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIE9BdXRoMVBhcmFtZXRlcnMgcGFyYW1zOworICAgICAgICBwcml2YXRlIGZpbmFsIE9BdXRoMVNlY3JldHMgc2VjcmV0czsKKyAgICAgICAgcHJpdmF0ZSBBY2Nlc3NUb2tlbiBhY2Nlc3NUb2tlbjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGEgbmV3IGJ1aWxkZXIgaW5zdGFuY2UuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwYXJhbXMgUHJlLWNvbmZpZ3VyZWQgb2F1dGggcGFyYW1ldGVycy4KKyAgICAgICAgICogQHBhcmFtIHNlY3JldHMgUHJlLWNvbmZpZ3VyZWQgb2F1dGggc2VjcmV0cy4KKyAgICAgICAgICovCisgICAgICAgIEZpbHRlckJ1aWxkZXJJbXBsKE9BdXRoMVBhcmFtZXRlcnMgcGFyYW1zLCBPQXV0aDFTZWNyZXRzIHNlY3JldHMpIHsKKyAgICAgICAgICAgIHRoaXMucGFyYW1zID0gcGFyYW1zOworICAgICAgICAgICAgdGhpcy5zZWNyZXRzID0gc2VjcmV0czsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRmlsdGVyRmVhdHVyZUJ1aWxkZXIgYWNjZXNzVG9rZW4oQWNjZXNzVG9rZW4gYWNjZXNzVG9rZW4pIHsKKyAgICAgICAgICAgIHRoaXMuYWNjZXNzVG9rZW4gPSBhY2Nlc3NUb2tlbjsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBGZWF0dXJlIGJ1aWxkKCkgeworICAgICAgICAgICAgaWYgKGFjY2Vzc1Rva2VuICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwYXJhbXMuc2V0VG9rZW4oYWNjZXNzVG9rZW4uZ2V0VG9rZW4oKSk7CisgICAgICAgICAgICAgICAgc2VjcmV0cy5zZXRUb2tlblNlY3JldChhY2Nlc3NUb2tlbi5nZXRBY2Nlc3NUb2tlblNlY3JldCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgT0F1dGgxQ2xpZW50RmVhdHVyZShwYXJhbXMsIHNlY3JldHMpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvb2F1dGgxLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9vYXV0aDEvT0F1dGgxQ2xpZW50RmVhdHVyZS5qYXZhIGIvc2VjdXJpdHkvb2F1dGgxLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9vYXV0aDEvT0F1dGgxQ2xpZW50RmVhdHVyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmOGM0YjEKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9vYXV0aDEtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L29hdXRoMS9PQXV0aDFDbGllbnRGZWF0dXJlLmphdmEKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQub2F1dGgxOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5vYXV0aDEuc2lnbmF0dXJlLk9BdXRoMVBhcmFtZXRlcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkub2F1dGgxLnNpZ25hdHVyZS5PQXV0aDFTZWNyZXRzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9hdXRoMS5zaWduYXR1cmUuT0F1dGgxU2lnbmF0dXJlRmVhdHVyZTsKKworLyoqCisgKiBPQXV0aDEgY2xpZW50IGZpbHRlciBmZWF0dXJlIHJlZ2lzdGVycyB0aGUgc3VwcG9ydCBmb3IgcGVyZm9ybWluZyBhdXRoZW50aWNhdGVkIHJlcXVlc3RzIHRvIHRoZQorICogU2VydmljZSBQcm92aWRlci4gVGhlIGZlYXR1cmUgZG9lcyBub3QgcGVyZm9ybSBBdXRob3JpemF0aW9uIEZsb3cgKHNlZSB7QGxpbmsgT0F1dGgxQXV0aG9yaXphdGlvbkZsb3d9CisgKiBmb3IgZGV0YWlscyBob3cgdG8gdXNlIEF1dGhvcml6YXRpb24gRmxvdyBhbmQgcmV0cmlldmUgQWNjZXNzIFRva2VuKS4gVGhlIGZlYXR1cmUgdXNlcyB7QGxpbmsgQ29uc3VtZXJDcmVkZW50aWFsc30KKyAqIGFuZCB7QGxpbmsgQWNjZXNzVG9rZW59IHRvIGluaXRpYWxpemUgdGhlIGludGVybmFsIHtAbGluayBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlciBmaWx0ZXJ9CisgKiB3aGljaCB3aWxsIGFkZCB7QGNvZGUgQXV0aG9yaXphdGlvbn0gaGVhZGVycyBjb250YWluaW5nIE9BdXRoIGF1dGhvcml6YXRpb24gaW5mb3JtYXRpb24gaW5jbHVkaW5nCisgKiB0aGUgb2F1dGggc2lnbmF0dXJlLgorICogPHA+CisgKiBUaGUgaW50ZXJuYWwgZmlsdGVyIGNhbiBiZSBjb250cm9sbGVkIGJ5IHByb3BlcnRpZXMgcHV0IGludG8KKyAqIHRoZSB7QGxpbmsgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RDb250ZXh0IGNsaWVudCByZXF1ZXN0fQorICogdXNpbmcge0BsaW5rIGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0Q29udGV4dCNzZXRQcm9wZXJ0eShTdHJpbmcsIE9iamVjdCl9IG1ldGhvZC4gVGhlIHByb3BlcnR5IGtleXMKKyAqIGFyZSBkZWZpbmVkIGluIHRoaXMgY2xhc3MgYXMgYSBzdGF0aWMgdmFyaWFibGVzIChzZWUgdGhlaXIgamF2YWRvY3MgZm9yIHVzYWdlKS4gVXNpbmcgdGhlc2UgcHJvcGVydGllcyBhIHNwZWNpZmljCisgKiB7QGxpbmsgQWNjZXNzVG9rZW59IGNhbiBiZSBkZWZpbmVkIGZvciBlYWNoIHJlcXVlc3QgZm9yIGV4YW1wbGUuCisgKiA8L3A+CisgKiBFeGFtcGxlIG9mIHVzaW5nIHNwZWNpZmljIGFjY2VzcyB0b2tlbiBmb3Igb25lIHJlcXVlc3Q6CisgKiA8cHJlPgorICogZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSBjbGllbnQudGFyZ2V0KCJmb28iKS5yZXF1ZXN0KCkKKyAqICAgICAgICAgICAucHJvcGVydHkoT0FVVEhfUFJPUEVSVFlfQUNDRVNTX1RPS0VOLCBuZXcgQWNjZXNzVG9rZW4oImFiNDU0Zjg0ZSIsICJmNDU0ZGU4NDhhNTRiIikpLmdldCgpOworICogPC9wcmU+CisgKiA8cD4KKyAqIFNlZSB7QGxpbmsgT0F1dGgxQnVpbGRlcn0gZm9yIG1vcmUgaW5mb3JtYXRpb24gb2YgaG93IHRvIGJ1aWxkIHRoaXMgZmVhdHVyZS4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKiBAc2luY2UgMi4zCisgKi8KK2ZpbmFsIGNsYXNzIE9BdXRoMUNsaWVudEZlYXR1cmUgaW1wbGVtZW50cyBGZWF0dXJlIHsKKworICAgIHByaXZhdGUgZmluYWwgT0F1dGgxUGFyYW1ldGVycyBwYXJhbWV0ZXJzOworICAgIHByaXZhdGUgZmluYWwgT0F1dGgxU2VjcmV0cyBzZWNyZXRzOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGZlYXR1cmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyYW1ldGVycyBPQXV0aCBwYXJhbWV0ZXJzLgorICAgICAqIEBwYXJhbSBzZWNyZXRzIE9BdXRoIGNsaWVudC90b2tlbiBzZWNyZXQuCisgICAgICovCisgICAgT0F1dGgxQ2xpZW50RmVhdHVyZShmaW5hbCBPQXV0aDFQYXJhbWV0ZXJzIHBhcmFtZXRlcnMsIGZpbmFsIE9BdXRoMVNlY3JldHMgc2VjcmV0cykgeworICAgICAgICB0aGlzLnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzOworICAgICAgICB0aGlzLnNlY3JldHMgPSBzZWNyZXRzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZShmaW5hbCBGZWF0dXJlQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoT0F1dGgxU2lnbmF0dXJlRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoT0F1dGgxQ2xpZW50RmlsdGVyLmNsYXNzKTsKKworICAgICAgICBjb250ZXh0LnByb3BlcnR5KE9BdXRoMUNsaWVudFN1cHBvcnQuT0FVVEhfUFJPUEVSVFlfT0FVVEhfUEFSQU1FVEVSUywgcGFyYW1ldGVycyk7CisgICAgICAgIGNvbnRleHQucHJvcGVydHkoT0F1dGgxQ2xpZW50U3VwcG9ydC5PQVVUSF9QUk9QRVJUWV9PQVVUSF9TRUNSRVRTLCBzZWNyZXRzKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9vYXV0aDEtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L29hdXRoMS9PQXV0aDFDbGllbnRGaWx0ZXIuamF2YSBiL3NlY3VyaXR5L29hdXRoMS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvb2F1dGgxL09BdXRoMUNsaWVudEZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YTkxMDgKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9vYXV0aDEtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L29hdXRoMS9PQXV0aDFDbGllbnRGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQub2F1dGgxOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLlByaW9yaXRpZXM7CitpbXBvcnQgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RGaWx0ZXI7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5OworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50Lm9hdXRoMS5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLk1lc3NhZ2VCb2R5V29ya2VyczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5vYXV0aDEuc2lnbmF0dXJlLk9BdXRoMVBhcmFtZXRlcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkub2F1dGgxLnNpZ25hdHVyZS5PQXV0aDFTZWNyZXRzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9hdXRoMS5zaWduYXR1cmUuT0F1dGgxU2lnbmF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9hdXRoMS5zaWduYXR1cmUuT0F1dGgxU2lnbmF0dXJlRXhjZXB0aW9uOworCisvKioKKyAqIENsaWVudCBmaWx0ZXIgdGhhdCBzaWduIHJlcXVlc3RzIHVzaW5nIE9BdXRoIDEgc2lnbmF0dXJlcyBhbmQgc2lnbmF0dXJlIGFuZCBvdGhlciBPQXV0aCAxCisgKiBwYXJhbWV0ZXJzIHRvIHRoZSB7QGNvZGUgQXV0aG9yaXphdGlvbn0gaGVhZGVyLiBUaGUgZmlsdGVyIGNhbiBiZSB1c2VkIHRvIHBlcmZvcm0gYXV0aGVudGljYXRlZAorICogcmVxdWVzdHMgdG8gU2VydmljZSBQcm92aWRlciBidXQgYWxzbyB0byBwZXJmb3JtIHJlcXVlc3RzIG5lZWRlZCBmb3IgQXV0aG9yaXphdGlvbiBwcm9jZXNzIChmbG93KS4KKyAqCisgKiBAYXV0aG9yIFBhdWwgQy4gQnJ5YW4KKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICoKKyAqIEBzaW5jZSAyLjMKKyAqLworQFByaW9yaXR5KFByaW9yaXRpZXMuQVVUSEVOVElDQVRJT04pCitjbGFzcyBPQXV0aDFDbGllbnRGaWx0ZXIgaW1wbGVtZW50cyBDbGllbnRSZXF1ZXN0RmlsdGVyIHsKKworICAgIEBJbmplY3QKKyAgICBwcml2YXRlIFByb3ZpZGVyPE9BdXRoMVNpZ25hdHVyZT4gb0F1dGhTaWduYXR1cmU7CisKKyAgICBASW5qZWN0CisgICAgcHJpdmF0ZSBQcm92aWRlcjxNZXNzYWdlQm9keVdvcmtlcnM+IG1lc3NhZ2VCb2R5V29ya2VyczsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDbGllbnRSZXF1ZXN0Q29udGV4dCByZXF1ZXN0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBDb25zdW1lckNyZWRlbnRpYWxzIGNvbnN1bWVyRnJvbVByb3BlcnRpZXMKKyAgICAgICAgICAgICAgICA9IChDb25zdW1lckNyZWRlbnRpYWxzKSByZXF1ZXN0LmdldFByb3BlcnR5KE9BdXRoMUNsaWVudFN1cHBvcnQuT0FVVEhfUFJPUEVSVFlfQ09OU1VNRVJfQ1JFREVOVElBTFMpOworICAgICAgICByZXF1ZXN0LnJlbW92ZVByb3BlcnR5KE9BdXRoMUNsaWVudFN1cHBvcnQuT0FVVEhfUFJPUEVSVFlfQ09OU1VNRVJfQ1JFREVOVElBTFMpOworCisgICAgICAgIGZpbmFsIEFjY2Vzc1Rva2VuIHRva2VuRnJvbVByb3BlcnRpZXMKKyAgICAgICAgICAgICAgICA9IChBY2Nlc3NUb2tlbikgcmVxdWVzdC5nZXRQcm9wZXJ0eShPQXV0aDFDbGllbnRTdXBwb3J0Lk9BVVRIX1BST1BFUlRZX0FDQ0VTU19UT0tFTik7CisgICAgICAgIHJlcXVlc3QucmVtb3ZlUHJvcGVydHkoT0F1dGgxQ2xpZW50U3VwcG9ydC5PQVVUSF9QUk9QRVJUWV9BQ0NFU1NfVE9LRU4pOworCisgICAgICAgIE9BdXRoMVBhcmFtZXRlcnMgcGFyYW1ldGVycyA9IChPQXV0aDFQYXJhbWV0ZXJzKSByZXF1ZXN0LmdldFByb3BlcnR5KE9BdXRoMUNsaWVudFN1cHBvcnQuT0FVVEhfUFJPUEVSVFlfT0FVVEhfUEFSQU1FVEVSUyk7CisgICAgICAgIGlmIChwYXJhbWV0ZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIHBhcmFtZXRlcnMgPSAoT0F1dGgxUGFyYW1ldGVycykgcmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkKKyAgICAgICAgICAgICAgICAgICAgLmdldFByb3BlcnR5KE9BdXRoMUNsaWVudFN1cHBvcnQuT0FVVEhfUFJPUEVSVFlfT0FVVEhfUEFSQU1FVEVSUyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXF1ZXN0LnJlbW92ZVByb3BlcnR5KE9BdXRoMUNsaWVudFN1cHBvcnQuT0FVVEhfUFJPUEVSVFlfT0FVVEhfUEFSQU1FVEVSUyk7CisgICAgICAgIH0KKworICAgICAgICBPQXV0aDFTZWNyZXRzIHNlY3JldHMgPSAoT0F1dGgxU2VjcmV0cykgcmVxdWVzdC5nZXRQcm9wZXJ0eShPQXV0aDFDbGllbnRTdXBwb3J0Lk9BVVRIX1BST1BFUlRZX09BVVRIX1NFQ1JFVFMpOworICAgICAgICBpZiAoc2VjcmV0cyA9PSBudWxsKSB7CisgICAgICAgICAgICBzZWNyZXRzID0gKE9BdXRoMVNlY3JldHMpIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnR5KE9BdXRoMUNsaWVudFN1cHBvcnQuT0FVVEhfUFJPUEVSVFlfT0FVVEhfU0VDUkVUUyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXF1ZXN0LnJlbW92ZVByb3BlcnR5KE9BdXRoMUNsaWVudFN1cHBvcnQuT0FVVEhfUFJPUEVSVFlfT0FVVEhfU0VDUkVUUyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVxdWVzdC5nZXRIZWFkZXJzKCkuY29udGFpbnNLZXkoIkF1dGhvcml6YXRpb24iKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gTWFrZSBtb2RpZmljYXRpb25zIHRvIGNsb25lcy4KKyAgICAgICAgZmluYWwgT0F1dGgxUGFyYW1ldGVycyBwYXJhbUNvcHkgPSBwYXJhbWV0ZXJzLmNsb25lKCk7CisgICAgICAgIGZpbmFsIE9BdXRoMVNlY3JldHMgc2VjcmV0c0NvcHkgPSBzZWNyZXRzLmNsb25lKCk7CisKKyAgICAgICAgY2hlY2tQYXJhbWV0ZXJzQ29uc2lzdGVuY3kocGFyYW1Db3B5LCBzZWNyZXRzQ29weSk7CisKKyAgICAgICAgaWYgKGNvbnN1bWVyRnJvbVByb3BlcnRpZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgcGFyYW1Db3B5LmNvbnN1bWVyS2V5KGNvbnN1bWVyRnJvbVByb3BlcnRpZXMuZ2V0Q29uc3VtZXJLZXkoKSk7CisgICAgICAgICAgICBzZWNyZXRzQ29weS5jb25zdW1lclNlY3JldChjb25zdW1lckZyb21Qcm9wZXJ0aWVzLmdldENvbnN1bWVyU2VjcmV0KCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRva2VuRnJvbVByb3BlcnRpZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgcGFyYW1Db3B5LnRva2VuKHRva2VuRnJvbVByb3BlcnRpZXMuZ2V0VG9rZW4oKSk7CisgICAgICAgICAgICBzZWNyZXRzQ29weS50b2tlblNlY3JldCh0b2tlbkZyb21Qcm9wZXJ0aWVzLmdldEFjY2Vzc1Rva2VuU2VjcmV0KCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHBhcmFtQ29weS5nZXRUaW1lc3RhbXAoKSA9PSBudWxsKSB7CisgICAgICAgICAgICBwYXJhbUNvcHkuc2V0VGltZXN0YW1wKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocGFyYW1Db3B5LmdldE5vbmNlKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgcGFyYW1Db3B5LnNldE5vbmNlKCk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgb0F1dGhTaWduYXR1cmUuZ2V0KCkuc2lnbihuZXcgUmVxdWVzdFdyYXBwZXIocmVxdWVzdCwgbWVzc2FnZUJvZHlXb3JrZXJzLmdldCgpKSwgcGFyYW1Db3B5LCBzZWNyZXRzQ29weSk7CisgICAgICAgIH0gY2F0Y2ggKE9BdXRoMVNpZ25hdHVyZUV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfUkVRVUVTVF9TSUdOQVRVUkUoKSwgc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrUGFyYW1ldGVyc0NvbnNpc3RlbmN5KE9BdXRoMVBhcmFtZXRlcnMgb2F1dGgxUGFyYW1ldGVycywgT0F1dGgxU2VjcmV0cyBvYXV0aDFTZWNyZXRzKSB7CisgICAgICAgIGlmIChvYXV0aDFQYXJhbWV0ZXJzLmdldFNpZ25hdHVyZU1ldGhvZCgpID09IG51bGwpIHsKKyAgICAgICAgICAgIG9hdXRoMVBhcmFtZXRlcnMuc2lnbmF0dXJlTWV0aG9kKCJITUFDLVNIQTEiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvYXV0aDFQYXJhbWV0ZXJzLmdldFZlcnNpb24oKSA9PSBudWxsKSB7CisgICAgICAgICAgICBvYXV0aDFQYXJhbWV0ZXJzLnZlcnNpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvYXV0aDFTZWNyZXRzLmdldENvbnN1bWVyU2VjcmV0KCkgPT0gbnVsbCB8fCBvYXV0aDFQYXJhbWV0ZXJzLmdldENvbnN1bWVyS2V5KCkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfQ09ORklHVVJBVElPTl9NSVNTSU5HX0NPTlNVTUVSKCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG9hdXRoMVBhcmFtZXRlcnMuZ2V0VG9rZW4oKSAhPSBudWxsICYmIG9hdXRoMVNlY3JldHMuZ2V0VG9rZW5TZWNyZXQoKSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9DT05GSUdVUkFUSU9OX01JU1NJTkdfVE9LRU5fU0VDUkVUKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvb2F1dGgxLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9vYXV0aDEvT0F1dGgxQ2xpZW50U3VwcG9ydC5qYXZhIGIvc2VjdXJpdHkvb2F1dGgxLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9vYXV0aDEvT0F1dGgxQ2xpZW50U3VwcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4YjM5NGMKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9vYXV0aDEtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L29hdXRoMS9PQXV0aDFDbGllbnRTdXBwb3J0LmphdmEKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50Lm9hdXRoMTsKKworLyoqCisgKiBUaGUgbWFpbiBjbGFzcyB0byBidWlsZCB0aGUgc3VwcG9ydCBmb3IgT0F1dGggMSBpbnRvIHRoZSBKZXJzZXkgY2xpZW50LgorICogPHA+CisgKiBUaGUgc3VwcG9ydCBmb3IgT0F1dGggaXMgZGl2aWRlZCBpbnRvIHR3byBwYXJ0czoKKyAqIDxsaXN0PgorICogICAgIDxsaT48Yj5BdXRob3JpemF0aW9uIEZsb3c6PC9iPiBwcm9jZXNzIG9mIGFjcXVpcmluZyB0aGUgdXNlcgorICogICAgIGFwcHJvdmFsIGZvciBhY2Nlc3NpbmcgdXNlcidzIHJlc291cmNlcyBvbiB0aGUgU2VydmljZSBQcm92aWRlci4gVGhlIGF1dGhvcml6YXRpb24gcHJvY2VzcyBpcyBtYW5hZ2VkCisgKiAgICAgYnkgYW4gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIE9BdXRoMUF1dGhvcml6YXRpb25GbG93fSBpbnRlcmZhY2UuIFRoZSByZXN1bHQgb2YgdGhlIHByb2Nlc3MgaXMKKyAqICAgICBhbiB7QGxpbmsgQWNjZXNzVG9rZW59LjwvbGk+CisgKgorICogICAgIDxsaT48Yj5BdXRoZW50aWNhdGVkIFJlcXVlc3RzOjwvYj4gcmVxdWVzdHMgZG9uZSBieSBhIHtAbGluayBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50IGNsaWVudH0gYXJlCisgKiAgICAgZW5oYW5jZWQgYnkgYW4ge0Bjb2RlIEF1dGhvcml6YXRpb259IGh0dHAgaGVhZGVyIHRoYXQgY29udGFpbnMgT0F1dGgxIGF1dGhvcml6YXRpb24gaW5mb3JtYXRpb24KKyAqICAgICBiYXNlZCBvbiB0aGUge0Bjb2RlIEFjY2Vzc1Rva2VufSByZWNlaXZlZCBmcm9tIEF1dGhvcml6YXRpb24gZmxvdy4gVGhpcyBzdXBwb3J0IGlzIHByb3ZpZGVkIGJ5CisgKiAgICAge0BsaW5rIGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZSBvYXV0aCAxIGZpbHRlciBmZWF0dXJlfSB0aGF0IGlzIHJlZ2lzdGVyZWQgaW50byBjbGllbnQgY29uZmlndXJhdGlvbi4KKyAqICAgICA8L2xpPgorICogPC9saXN0PgorICogVGhpcyBjbGFzcyBjb250YWlucyBzdGF0aWMgbWV0aG9kIHRoYXQgYWxsb3dzIHRvIGJ1aWxkIGJvdGggT0F1dGgxIGZlYXR1cmVzIChhdXRob3JpemF0aW9uIGZsb3cgYW5kIGNsaWVudCBmZWF0dXJlKS4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKiBAc2luY2UgMi4zCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBPQXV0aDFDbGllbnRTdXBwb3J0IHsKKworICAgIC8qKgorICAgICAqIEtleSBvZiB0aGUgcHJvcGVydHkgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gdGhlCisgICAgICoge0BsaW5rIGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0Q29udGV4dCBjbGllbnQgcmVxdWVzdH0gdXNpbmcKKyAgICAgKiB7QGxpbmsgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RDb250ZXh0I3NldFByb3BlcnR5KFN0cmluZywgT2JqZWN0KX0gYW5kIHRoYXQKKyAgICAgKiBkZWZpbmVzIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQub2F1dGgxLkNvbnN1bWVyQ3JlZGVudGlhbHMgY29uc3VtZXIgY3JlZGVudGlhbHN9IHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiBnZW5lcmF0aW5nIE9BdXRoIHtAY29kZSBBdXRob3JpemF0aW9ufQorICAgICAqIGh0dHAgaGVhZGVyLiBUaGUgcHJvcGVydHkgd2lsbCBvdmVycmlkZSB0aGUgc2V0dGluZyBvZiB0aGUgaW50ZXJuYWwKKyAgICAgKiB7QGxpbmsgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RGaWx0ZXIgZmlsdGVyfSBmb3IgdGhlIGN1cnJlbnQgcmVxdWVzdCBvbmx5LgorICAgICAqIDxwPgorICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgbXVzdCBiZSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50Lm9hdXRoMS5Db25zdW1lckNyZWRlbnRpYWxzfSBpbnN0YW5jZS4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0FVVEhfUFJPUEVSVFlfQ09OU1VNRVJfQ1JFREVOVElBTFMgPSAiamVyc2V5LmNvbmZpZy5jbGllbnQub2F1dGgxLmNvbnN1bWVyLmNyZWRlbnRpYWxzIjsKKworICAgIC8qKgorICAgICAqIEtleSBvZiB0aGUgcHJvcGVydHkgdGhhdCBjYW4gYmUgYXR0YWNoZWQgdG8gdGhlCisgICAgICoge0BsaW5rIGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0Q29udGV4dCBjbGllbnQgcmVxdWVzdH0gdXNpbmcKKyAgICAgKiB7QGxpbmsgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RDb250ZXh0I3NldFByb3BlcnR5KFN0cmluZywgT2JqZWN0KX0gYW5kIHRoYXQKKyAgICAgKiBkZWZpbmVzIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQub2F1dGgxLkFjY2Vzc1Rva2VuIGFjY2VzcyB0b2tlbn0gdGhhdCBzaG91bGQgYmUgdXNlZCB3aGVuIGdlbmVyYXRpbmcgT0F1dGgge0Bjb2RlIEF1dGhvcml6YXRpb259CisgICAgICogaHR0cCBoZWFkZXIuIFRoZSBwcm9wZXJ0eSB3aWxsIG92ZXJyaWRlIHRoZSBzZXR0aW5nIG9mIHRoZSBpbnRlcm5hbAorICAgICAqIHtAbGluayBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdEZpbHRlciBmaWx0ZXJ9IGZvciB0aGUgY3VycmVudCByZXF1ZXN0IG9ubHkuCisgICAgICogPHA+CisgICAgICogVGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBtdXN0IGJlIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQub2F1dGgxLkFjY2Vzc1Rva2VufSBpbnN0YW5jZS4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0FVVEhfUFJPUEVSVFlfQUNDRVNTX1RPS0VOID0gImplcnNleS5jb25maWcuY2xpZW50Lm9hdXRoMS5hY2Nlc3MudG9rZW4iOworCisgICAgLyoqCisgICAgICogS2V5IG9mIHRoZSBwcm9wZXJ0eSB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byB0aGUKKyAgICAgKiB7QGxpbmsgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RDb250ZXh0IGNsaWVudCByZXF1ZXN0fSB1c2luZworICAgICAqIHtAbGluayBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdENvbnRleHQjc2V0UHJvcGVydHkoU3RyaW5nLCBPYmplY3QpfSBhbmQgdGhhdAorICAgICAqIGRlZmluZXMge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9hdXRoMS5zaWduYXR1cmUuT0F1dGgxUGFyYW1ldGVyc30KKyAgICAgKiB0aGF0IHNob3VsZCBiZSB1c2VkIHdoZW4gZ2VuZXJhdGluZyBPQXV0aCB7QGNvZGUgQXV0aG9yaXphdGlvbn0KKyAgICAgKiBodHRwIGhlYWRlci4gVGhlIHByb3BlcnR5IHdpbGwgb3ZlcnJpZGUgdGhlIHNldHRpbmcgb2YgdGhlIGludGVybmFsCisgICAgICoge0BsaW5rIGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0RmlsdGVyIGZpbHRlcn0gZm9yIHRoZSBjdXJyZW50IHJlcXVlc3Qgb25seS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IG11c3QgYmUge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9hdXRoMS5zaWduYXR1cmUuT0F1dGgxUGFyYW1ldGVyc30gaW5zdGFuY2UuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoaXMgcHJvcGVydHkgaXMgZm9yIGFkdmFuY2VkIHVzYWdlIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgaWYgbm90IG5lZWRlZCBhcyBpdCBjYW4gbWFrZSB0aGUgZmlsdGVyCisgICAgICogY29uZmlndXJhdGlvbiBpbmNvbnNpc3RlbnQgZm9yCisgICAgICogdGhlIHJlcXVlc3QgYW5kIGNhbiBwcm9kdWNlIHVud2FudGVkIHJlc3VsdHMuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIHVzZWQgb25seSBmb3IgY29uZmlndXJpbmcgYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIE9BdXRoMUNsaWVudEZlYXR1cmUgT0F1dGggZmVhdHVyZX0sIG5vdCB0aGUKKyAgICAgKiB7QGxpbmsgT0F1dGgxQXV0aG9yaXphdGlvbkZsb3cgQXV0aG9yaXphdGlvbiBmbG93fS4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0FVVEhfUFJPUEVSVFlfT0FVVEhfUEFSQU1FVEVSUyA9ICJqZXJzZXkuY29uZmlnLmNsaWVudC5vYXV0aDEucGFyYW1ldGVycyI7CisKKyAgICAvKioKKyAgICAgKiBLZXkgb2YgdGhlIHByb3BlcnR5IHRoYXQgY2FuIGJlIGF0dGFjaGVkIHRvIHRoZQorICAgICAqIHtAbGluayBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdENvbnRleHQgY2xpZW50IHJlcXVlc3R9IHVzaW5nCisgICAgICoge0BsaW5rIGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0Q29udGV4dCNzZXRQcm9wZXJ0eShTdHJpbmcsIE9iamVjdCl9IGFuZCB0aGF0CisgICAgICogZGVmaW5lcyB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkub2F1dGgxLnNpZ25hdHVyZS5PQXV0aDFTZWNyZXRzfQorICAgICAqIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiBnZW5lcmF0aW5nIE9BdXRoIHtAY29kZSBBdXRob3JpemF0aW9ufQorICAgICAqIGh0dHAgaGVhZGVyLiBUaGUgcHJvcGVydHkgd2lsbCBvdmVycmlkZSB0aGUgc2V0dGluZyBvZiB0aGUgaW50ZXJuYWwKKyAgICAgKiB7QGxpbmsgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RGaWx0ZXIgZmlsdGVyfSBmb3IgdGhlIGN1cnJlbnQgcmVxdWVzdCBvbmx5LgorICAgICAqIDxwPgorICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgbXVzdCBiZSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkub2F1dGgxLnNpZ25hdHVyZS5PQXV0aDFTZWNyZXRzfSBpbnN0YW5jZS4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogVGhpcworICAgICAqIHByb3BlcnR5IGlzIGZvciBhZHZhbmNlZCB1c2FnZSBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGlmIG5vdCBuZWVkZWQgYXMgaXQgY2FuIG1ha2UgdGhlIGZpbHRlcgorICAgICAqIGNvbmZpZ3VyYXRpb24gaW5jb25zaXN0ZW50IGZvcgorICAgICAqIHRoZSByZXF1ZXN0IGFuZCBjYW4gcHJvZHVjZSB1bndhbnRlZCByZXN1bHRzLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIHByb3BlcnR5IHNob3VsZCBiZSB1c2VkIG9ubHkgZm9yIGNvbmZpZ3VyaW5nIGFuIGluc3RhbmNlIG9mIHtAbGluayBPQXV0aDFDbGllbnRGZWF0dXJlIE9BdXRoIGZlYXR1cmV9LCBub3QgdGhlCisgICAgICoge0BsaW5rIE9BdXRoMUF1dGhvcml6YXRpb25GbG93IEF1dGhvcml6YXRpb24gZmxvd30uCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE9BVVRIX1BST1BFUlRZX09BVVRIX1NFQ1JFVFMgPSAiamVyc2V5LmNvbmZpZy5jbGllbnQub2F1dGgxLnNlY3JldHMiOworCisgICAgLyoqCisgICAgICogR2V0IGEgbmV3IGJ1aWxkZXIgb2YgT0F1dGgxIGNsaWVudCBzdXBwb3J0LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnN1bWVyQ3JlZGVudGlhbHMgQ29uc3VtZXIgY3JlZGVudGlhbHMgaXNzdWVkIGJ5IHRoZSBzZXJ2aWNlIHByb3ZpZGVyIGZvciB0aGUgYXBwbGljYXRpb24gdGhhdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhbnRzIHRvIGFjY2VzcyBkYXRhLgorICAgICAqIEByZXR1cm4gQnVpbGRlciBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9BdXRoMUJ1aWxkZXIgYnVpbGRlcihDb25zdW1lckNyZWRlbnRpYWxzIGNvbnN1bWVyQ3JlZGVudGlhbHMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBPQXV0aDFCdWlsZGVySW1wbChjb25zdW1lckNyZWRlbnRpYWxzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmV2ZW50IGluc3RhbnRpYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBPQXV0aDFDbGllbnRTdXBwb3J0KCkgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L29hdXRoMS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvb2F1dGgxL1JlcXVlc3RVdGlsLmphdmEgYi9zZWN1cml0eS9vYXV0aDEtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L29hdXRoMS9SZXF1ZXN0VXRpbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlODIwOGUKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9vYXV0aDEtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L29hdXRoMS9SZXF1ZXN0VXRpbC5qYXZhCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5vYXV0aDE7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEubmV0LlVSSTsKKworaW1wb3J0IGphdmF4LndzLnJzLkh0dHBNZXRob2Q7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY0VudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkSGFzaE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLk1lc3NhZ2VCb2R5V29ya2VyczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS51cmkuVXJpQ29tcG9uZW50OworCisKKy8qKgorICogVXRpbGl0eSBjbGFzcyBmb3IgcHJvY2Vzc2luZyBjbGllbnQgcmVxdWVzdHMuIFRoaXMgY2xhc3Mgc29tZWhvdyB3YW50cyB0byBiZQorICogbW9yZSB0aGFuIGp1c3QgYSB1dGlsaXR5IGNsYXNzIGZvciB0aGlzIG9uZSBmaWx0ZXIuCisgKgorICogQGF1dGhvciBQYXVsIEMuIEJyeWFuIDxwYnJ5YW5Ac3VuLmNvbT4KKyAqIEBzaW5jZSAyLjMKKyAqLworZmluYWwgY2xhc3MgUmVxdWVzdFV0aWwgeworCisgICAgcHJpdmF0ZSBSZXF1ZXN0VXRpbCgpIHsKKyAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJJbnN0YW50aWF0aW9uIG5vdCBhbGxvd2VkLiIpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFubm90YXRpb25bXSBFTVBUWV9BTk5PVEFUSU9OUyA9IG5ldyBBbm5vdGF0aW9uWzBdOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcXVlcnkgcGFyYW1ldGVycyBvZiBhIHJlcXVlc3QgYXMgYSBtdWx0aS12YWx1ZWQgbWFwLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgdGhlIGNsaWVudCByZXF1ZXN0IHRvIHJldHJpZXZlIHF1ZXJ5IHBhcmFtZXRlcnMgZnJvbS4KKyAgICAgKiBAcmV0dXJuIGEge0BsaW5rIGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXB9IGNvbnRhaW5pbmcgdGhlIGVudGl0eSBxdWVyeSBwYXJhbWV0ZXJzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGdldFF1ZXJ5UGFyYW1ldGVycyhDbGllbnRSZXF1ZXN0Q29udGV4dCByZXF1ZXN0KSB7CisgICAgICAgIFVSSSB1cmkgPSByZXF1ZXN0LmdldFVyaSgpOworICAgICAgICBpZiAodXJpID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIFVyaUNvbXBvbmVudC5kZWNvZGVRdWVyeSh1cmksIHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGZvcm0gcGFyYW1ldGVycyBmcm9tIGEgcmVxdWVzdCBlbnRpdHkgYXMgYSBtdWx0aS12YWx1ZWQgbWFwLgorICAgICAqIElmIHRoZSByZXF1ZXN0IGRvZXMgbm90IGhhdmUgYSBQT1NUIG1ldGhvZCwgb3IgdGhlIG1lZGlhIHR5cGUgaXMgbm90CisgICAgICogeC13d3ctZm9ybS11cmxlbmNvZGVkLCB0aGVuIG51bGwgaXMgcmV0dXJuZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCB0aGUgY2xpZW50IHJlcXVlc3QgY29udGFpbmluZyB0aGUgZW50aXR5IHRvIGV4dHJhY3QgcGFyYW1ldGVycyBmcm9tLgorICAgICAqIEByZXR1cm4gYSB7QGxpbmsgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcH0gY29udGFpbmluZyB0aGUgZW50aXR5IGZvcm0gcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgc3RhdGljIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBnZXRFbnRpdHlQYXJhbWV0ZXJzKENsaWVudFJlcXVlc3RDb250ZXh0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlQm9keVdvcmtlcnMgbWVzc2FnZUJvZHlXb3JrZXJzKSB7CisKKyAgICAgICAgT2JqZWN0IGVudGl0eSA9IHJlcXVlc3QuZ2V0RW50aXR5KCk7CisgICAgICAgIFN0cmluZyBtZXRob2QgPSByZXF1ZXN0LmdldE1ldGhvZCgpOworICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlID0gcmVxdWVzdC5nZXRNZWRpYVR5cGUoKTsKKworICAgICAgICAvLyBubyBlbnRpdHksIG5vdCBhIHBvc3Qgb3Igbm90IHgtd3d3LWZvcm0tdXJsZW5jb2RlZDogcmV0dXJuIGVtcHR5IG1hcAorICAgICAgICBpZiAoZW50aXR5ID09IG51bGwgfHwgbWV0aG9kID09IG51bGwgfHwgIUh0dHBNZXRob2QuUE9TVC5lcXVhbHNJZ25vcmVDYXNlKG1ldGhvZCkKKyAgICAgICAgICAgICAgICB8fCBtZWRpYVR5cGUgPT0gbnVsbCB8fCAhbWVkaWFUeXBlLmVxdWFscyhNZWRpYVR5cGUuQVBQTElDQVRJT05fRk9STV9VUkxFTkNPREVEX1RZUEUpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE11bHRpdmFsdWVkSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGl0J3MgcmVhZHkgdG8gZ28gaWYgYWxyZWFkeSBleHByZXNzZWQgYXMgYSBtdWx0aS12YWx1ZWQgbWFwCisgICAgICAgIGlmIChlbnRpdHkgaW5zdGFuY2VvZiBNdWx0aXZhbHVlZE1hcCkgeworICAgICAgICAgICAgcmV0dXJuIChNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4pIGVudGl0eTsKKyAgICAgICAgfQorCisgICAgICAgIFR5cGUgZW50aXR5VHlwZSA9IGVudGl0eS5nZXRDbGFzcygpOworCisgICAgICAgIC8vIGlmIHRoZSBlbnRpdHkgaXMgZ2VuZXJpYywgZ2V0IHNwZWNpZmljIHR5cGUgYW5kIGNsYXNzCisgICAgICAgIGlmIChlbnRpdHkgaW5zdGFuY2VvZiBHZW5lcmljRW50aXR5KSB7CisgICAgICAgICAgICBmaW5hbCBHZW5lcmljRW50aXR5IGdlbmVyaWMgPSAoR2VuZXJpY0VudGl0eSkgZW50aXR5OworICAgICAgICAgICAgZW50aXR5VHlwZSA9IGdlbmVyaWMuZ2V0VHlwZSgpOyAvLyBvdmVyd3JpdGUKKyAgICAgICAgICAgIGVudGl0eSA9IGdlbmVyaWMuZ2V0RW50aXR5KCk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBDbGFzcyBlbnRpdHlDbGFzcyA9IGVudGl0eS5nZXRDbGFzcygpOworCisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisKKworICAgICAgICBNZXNzYWdlQm9keVdyaXRlciB3cml0ZXIgPSBtZXNzYWdlQm9keVdvcmtlcnMuZ2V0TWVzc2FnZUJvZHlXcml0ZXIoZW50aXR5Q2xhc3MsCisgICAgICAgICAgICAgICAgZW50aXR5VHlwZSwgRU1QVFlfQU5OT1RBVElPTlMsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9GT1JNX1VSTEVOQ09ERURfVFlQRSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHdyaXRlci53cml0ZVRvKGVudGl0eSwgZW50aXR5Q2xhc3MsIGVudGl0eVR5cGUsCisgICAgICAgICAgICAgICAgICAgIEVNUFRZX0FOTk9UQVRJT05TLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fRk9STV9VUkxFTkNPREVEX1RZUEUsIG51bGwsIG91dCk7CisgICAgICAgIH0gY2F0Y2ggKFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHdhZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbih3YWUpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oaW9lKTsKKyAgICAgICAgfQorCisgICAgICAgIEJ5dGVBcnJheUlucHV0U3RyZWFtIGluID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG91dC50b0J5dGVBcnJheSgpKTsKKworICAgICAgICBNZXNzYWdlQm9keVJlYWRlciByZWFkZXIgPSBtZXNzYWdlQm9keVdvcmtlcnMuZ2V0TWVzc2FnZUJvZHlSZWFkZXIoTXVsdGl2YWx1ZWRNYXAuY2xhc3MsCisgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXAuY2xhc3MsIEVNUFRZX0FOTk9UQVRJT05TLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fRk9STV9VUkxFTkNPREVEX1RZUEUpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gKE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPikgcmVhZGVyLnJlYWRGcm9tKE11bHRpdmFsdWVkTWFwLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcC5jbGFzcywgRU1QVFlfQU5OT1RBVElPTlMsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9GT1JNX1VSTEVOQ09ERURfVFlQRSwgbnVsbCwgaW4pOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oaW9lKTsKKyAgICAgICAgfQorICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvb2F1dGgxLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9vYXV0aDEvUmVxdWVzdFdyYXBwZXIuamF2YSBiL3NlY3VyaXR5L29hdXRoMS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvb2F1dGgxL1JlcXVlc3RXcmFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRlYWNhMQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L29hdXRoMS1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvb2F1dGgxL1JlcXVlc3RXcmFwcGVyLmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50Lm9hdXRoMTsKKworaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZEhhc2hNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuTWVzc2FnZUJvZHlXb3JrZXJzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9hdXRoMS5zaWduYXR1cmUuT0F1dGgxUmVxdWVzdDsKKworLyoqCisgKiBJbXBsZW1lbnRzIHRoZSBPQXV0aCBzaWduYXR1cmUgbGlicmFyeSBSZXF1ZXN0IGludGVyZmFjZSwgd3JhcHBpbmcgYSBKZXJzZXkKKyAqIGNsaWVudCByZXF1ZXN0IG9iamVjdC4KKyAqCisgKiBAYXV0aG9yIFBhdWwgQy4gQnJ5YW4gPHBicnlhbkBzdW4uY29tPgorICogQHNpbmNlIDIuMworICovCitjbGFzcyBSZXF1ZXN0V3JhcHBlciBpbXBsZW1lbnRzIE9BdXRoMVJlcXVlc3QgeworCisgICAgLyoqIFRoZSB3cmFwcGVkIEplcnNleSBjbGllbnQgcmVxdWVzdC4gKi8KKyAgICBwcml2YXRlIGZpbmFsIENsaWVudFJlcXVlc3RDb250ZXh0IGNsaWVudFJlcXVlc3Q7CisKKyAgICBwcml2YXRlIGZpbmFsIE1lc3NhZ2VCb2R5V29ya2VycyBtZXNzYWdlQm9keVdvcmtlcnM7CisKKworICAgIC8qKiBGb3JtIGFuZCBxdWVyeSBwYXJhbWV0ZXJzIGZyb20gdGhlIHJlcXVlc3QgKGxhemlseSBpbml0aWFsaXplZCkuICovCisgICAgcHJpdmF0ZSBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycyA9IG51bGw7CisKKyAgICBwcml2YXRlIHZvaWQgc2V0UGFyYW1ldGVycygpIHsKKyAgICAgICAgcGFyYW1ldGVycyA9IG5ldyBNdWx0aXZhbHVlZEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgICAgIHBhcmFtZXRlcnMucHV0QWxsKFJlcXVlc3RVdGlsLmdldFF1ZXJ5UGFyYW1ldGVycyhjbGllbnRSZXF1ZXN0KSk7CisgICAgICAgIHBhcmFtZXRlcnMucHV0QWxsKFJlcXVlc3RVdGlsLmdldEVudGl0eVBhcmFtZXRlcnMoY2xpZW50UmVxdWVzdCwgbWVzc2FnZUJvZHlXb3JrZXJzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIG5ldyBPQXV0aCBjbGllbnQgcmVxdWVzdCB3cmFwcGVyIGFyb3VuZCB0aGUgc3BlY2lmaWVkCisgICAgICogSmVyc2V5IGNsaWVudCByZXF1ZXN0IG9iamVjdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGllbnRSZXF1ZXN0IENsaWVudCByZXF1ZXN0LgorICAgICAqIEBwYXJhbSBtZXNzYWdlQm9keVdvcmtlcnMgTWVzc2FnZSBib2R5IHdvcmtlcnMuCisgICAgICovCisgICAgcHVibGljIFJlcXVlc3RXcmFwcGVyKGZpbmFsIENsaWVudFJlcXVlc3RDb250ZXh0IGNsaWVudFJlcXVlc3QsIE1lc3NhZ2VCb2R5V29ya2VycyBtZXNzYWdlQm9keVdvcmtlcnMpIHsKKyAgICAgICAgdGhpcy5jbGllbnRSZXF1ZXN0ID0gY2xpZW50UmVxdWVzdDsKKyAgICAgICAgdGhpcy5tZXNzYWdlQm9keVdvcmtlcnMgPSBtZXNzYWdlQm9keVdvcmtlcnM7CisgICAgICAgIHNldFBhcmFtZXRlcnMoKTsgLy8gc3RvcmVkIGJlY2F1c2UgcGFyc2luZyBxdWVyeS9lbnRpdHkgcGFyYW1ldGVycyB0b28gbXVjaCB3b3JrIGZvciBlYWNoIHZhbHVlLWdldAorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdE1ldGhvZCgpIHsKKyAgICAgICAgcmV0dXJuIGNsaWVudFJlcXVlc3QuZ2V0TWV0aG9kKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFVSTCBnZXRSZXF1ZXN0VVJMKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgVVJJIHVyaSA9IGNsaWVudFJlcXVlc3QuZ2V0VXJpKCk7CisgICAgICAgICAgICByZXR1cm4gdXJpLnRvVVJMKCk7CisgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihSZXF1ZXN0V3JhcHBlci5jbGFzcy5nZXROYW1lKCkpLmxvZyhMZXZlbC5TRVZFUkUsIG51bGwsIGV4KTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxTdHJpbmc+IGdldFBhcmFtZXRlck5hbWVzKCkgeworICAgICAgICByZXR1cm4gcGFyYW1ldGVycy5rZXlTZXQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFBhcmFtZXRlclZhbHVlcyhmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICByZXR1cm4gcGFyYW1ldGVycy5nZXQobmFtZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRIZWFkZXJWYWx1ZXMoZmluYWwgU3RyaW5nIG5hbWUpIHsKKworICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICAgICAgZm9yIChTdHJpbmcgaGVhZGVyIDogY2xpZW50UmVxdWVzdC5nZXRTdHJpbmdIZWFkZXJzKCkuZ2V0KG5hbWUpKSB7CisgICAgICAgICAgICBsaXN0LmFkZChoZWFkZXIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGxpc3Q7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYWRkSGVhZGVyVmFsdWUoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBjbGllbnRSZXF1ZXN0LmdldEhlYWRlcnMoKS5hZGQobmFtZSwgdmFsdWUpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvb2F1dGgxLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9vYXV0aDEvcGFja2FnZS1pbmZvLmphdmEgYi9zZWN1cml0eS9vYXV0aDEtY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L29hdXRoMS9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTQ4OWYwCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvb2F1dGgxLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9vYXV0aDEvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoqCisgKiBKZXJzZXkgT0F1dGggMSBDbGllbnQgQVBJLgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5vYXV0aDE7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9vYXV0aDEtY2xpZW50L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvb2F1dGgxL2ludGVybmFsL2xvY2FsaXphdGlvbi5wcm9wZXJ0aWVzIGIvc2VjdXJpdHkvb2F1dGgxLWNsaWVudC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L29hdXRoMS9pbnRlcm5hbC9sb2NhbGl6YXRpb24ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTZiZWVlCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvb2F1dGgxLWNsaWVudC9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L29hdXRoMS9pbnRlcm5hbC9sb2NhbGl6YXRpb24ucHJvcGVydGllcwpAQCAtMCwwICsxLDIzIEBACisjCisjIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorIworIyBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisjIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyMgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisjIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyMKKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisjCisKK2Vycm9yLmNvbmZpZ3VyYXRpb24ubWlzc2luZy5jb25zdW1lcj1FcnJvciBvY2N1cnJlZCBpbiB0aGUgb2F1dGggY2xpZW50IHN1cHBvcnQuIENvbnN1bWVyIHNlY3JldCBhbmQgY29uc3VtZXIga2V5IG11c3Qgbm90IGJlIG51bGwuCitlcnJvci5jb25maWd1cmF0aW9uLm1pc3NpbmcudG9rZW5TZWNyZXQ9RXJyb3Igb2NjdXJyZWQgaW4gdGhlIG9hdXRoIGNsaWVudCBzdXBwb3J0LiBUb2tlbiBpcyBub3QgbnVsbCBidXQgdG9rZW4gc2VjcmV0IGlzIG51bGwuCitlcnJvci5yZXF1ZXN0LnJlcXVlc3RUb2tlbj1FcnJvciBvY2N1cnJlZCBpbiB0aGUgb2F1dGggY2xpZW50IHN1cHBvcnQuIEVycm9yIHJlcXVlc3RpbmcgUmVxdWVzdCBUb2tlbi4gUmVzcG9uc2Ugc3RhdHVzIHswfSByZXR1cm5lZC4KK2Vycm9yLnJlcXVlc3QuYWNjZXNzVG9rZW49RXJyb3Igb2NjdXJyZWQgaW4gdGhlIG9hdXRoIGNsaWVudCBzdXBwb3J0LiAgRXJyb3IgcmVxdWVzdGluZyBBY2Nlc3MgVG9rZW4uIFJlc3BvbnNlIHN0YXR1cyB7MH0gcmV0dXJuZWQuCitlcnJvci5yZXF1ZXN0LmFjY2Vzc1Rva2VuLm51bGw9RXJyb3Igb2NjdXJyZWQgaW4gdGhlIG9hdXRoIGNsaWVudCBzdXBwb3J0LiBSZXR1cm5lZCBBY2Nlc3MgVG9rZW4gaXMgbnVsbC4KK2Vycm9yLnJlcXVlc3Quc2lnbmF0dXJlPUVycm9yIG9jY3VycmVkIGluIHRoZSBvYXV0aCBjbGllbnQgc3VwcG9ydC4gRXJyb3Igc2lnbmluZyB0aGUgcmVxdWVzdC4KK2Vycm9yLmZsb3cubm90LmZpbmlzaGVkPUF1dGhvcml6YXRpb24gaXMgbm90IGZpbmlzaGVkIGFuZCBhY2Nlc3MgdG9rZW4gd2FzIG5vdCByZWNlaXZlZC4gQ2FsbCBzdGFydCgpIGFuZCB0aGVuIGZpbmlzaCgpIHRvIHBlcmZvcm0gdGhlIGF1dGhvcml6YXRpb24uCmRpZmYgLS1naXQgYS9zZWN1cml0eS9vYXV0aDEtc2VydmVyL3BvbS54bWwgYi9zZWN1cml0eS9vYXV0aDEtc2VydmVyL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFkN2QzOAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L29hdXRoMS1zZXJ2ZXIvcG9tLnhtbApAQCAtMCwwICsxLDU1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZWN1cml0eTwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPm9hdXRoMS1zZXJ2ZXI8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKworICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgTW9kdWxlIHRoYXQgYWRkcyBhbiBPQXV0aCAxIHN1cHBvcnQgdG8gSmVyc2V5IHNlcnZlcgorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktc2VydmVyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZWN1cml0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm9hdXRoMS1zaWduYXR1cmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvb2F1dGgxLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9vYXV0aDEvRGVmYXVsdE9BdXRoMVByb3ZpZGVyLmphdmEgYi9zZWN1cml0eS9vYXV0aDEtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL29hdXRoMS9EZWZhdWx0T0F1dGgxUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZThkYzczCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvb2F1dGgxLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9vYXV0aDEvRGVmYXVsdE9BdXRoMVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwzNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm9hdXRoMTsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkSGFzaE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5JbW11dGFibGVNdWx0aXZhbHVlZE1hcDsKKworLyoqIERlZmF1bHQgaW4tbWVtb3J5IGltcGxlbWVudGF0aW9uIG9mIE9BdXRoMVByb3ZpZGVyLiBTdG9yZXMgY29uc3VtZXJzIGFuZCB0b2tlbnMKKyAqIGluIHN0YXRpYyBoYXNoIG1hcHMuIFByb3ZpZGVzIHNvbWUgYWRkaXRpb25hbCBoZWxwZXIgbWV0aG9kcyBmb3IgY29uc3VtZXIKKyAqIGFuZCB0b2tlbiBtYW5hZ2VtZW50IChyZWdpc3RlcmluZyBuZXcgY29uc3VtZXJzLCByZXRyaWV2aW5nIGEgbGlzdCBvZiBhbGwKKyAqIHJlZ2lzdGVyZWQgY29uc3VtZXJzIHBlciBvd25lciwgbGlzdGluZyB0aGUgYXV0aG9yaXplZCB0b2tlbnMgcGVyIHByaW5jaXBhbCwKKyAqIHJldm9raW5nIHRva2VucywgZXRjLikKKyAqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworQFByb3ZpZGVyCitwdWJsaWMgY2xhc3MgRGVmYXVsdE9BdXRoMVByb3ZpZGVyIGltcGxlbWVudHMgT0F1dGgxUHJvdmlkZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ29uY3VycmVudEhhc2hNYXA8U3RyaW5nLCBDb25zdW1lcj4gY29uc3VtZXJCeUNvbnN1bWVyS2V5ID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPD4oKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb25jdXJyZW50SGFzaE1hcDxTdHJpbmcsIFRva2VuPiBhY2Nlc3NUb2tlbkJ5VG9rZW5TdHJpbmcgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbmN1cnJlbnRIYXNoTWFwPFN0cmluZywgVG9rZW4+IHJlcXVlc3RUb2tlbkJ5VG9rZW5TdHJpbmcgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbmN1cnJlbnRIYXNoTWFwPFN0cmluZywgU3RyaW5nPiB2ZXJpZmllckJ5VG9rZW5TdHJpbmcgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENvbnN1bWVyIGdldENvbnN1bWVyKGZpbmFsIFN0cmluZyBjb25zdW1lcktleSkgeworICAgICAgICByZXR1cm4gY29uc3VtZXJCeUNvbnN1bWVyS2V5LmdldChjb25zdW1lcktleSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgYSBuZXcgY29uc3VtZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3duZXIgSWRlbnRpZmllciBvZiB0aGUgb3duZXIgdGhhdCByZWdpc3RlcnMgdGhlIGNvbnN1bWVyICh1c2VyIElEIG9yIHNpbWlsYXIpLgorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIEFkZGl0aW9uYWwgYXR0cmlidXRlcyAobmFtZS12YWx1ZXMgcGFpcnMgLSB0byBzdG9yZSBhZGRpdGlvbmFsCisgICAgICogaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbnN1bWVyLCBzdWNoIGFzIG5hbWUsIFVSSSwgZGVzY3JpcHRpb24sIGV0Yy4pCisgICAgICogQHJldHVybiB7QGxpbmsgQ29uc3VtZXJ9IG9iamVjdCBmb3IgdGhlIG5ld2x5IHJlZ2lzdGVyZWQgY29uc3VtZXIuCisgICAgICovCisgICAgcHVibGljIENvbnN1bWVyIHJlZ2lzdGVyQ29uc3VtZXIoZmluYWwgU3RyaW5nIG93bmVyLCBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gYXR0cmlidXRlcykgeworICAgICAgICByZXR1cm4gcmVnaXN0ZXJDb25zdW1lcihvd25lciwgbmV3VVVJRFN0cmluZygpLCBuZXdVVUlEU3RyaW5nKCksIGF0dHJpYnV0ZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGEgbmV3IGNvbnN1bWVyIGNvbmZpZ3VyZWQgd2l0aCBDb25zdW1lciBLZXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3duZXIgSWRlbnRpZmllciBvZiB0aGUgb3duZXIgdGhhdCByZWdpc3RlcnMgdGhlIGNvbnN1bWVyICh1c2VyIElEIG9yIHNpbWlsYXIpLgorICAgICAqIEBwYXJhbSBrZXkgQ29uc3VtZXIga2V5LgorICAgICAqIEBwYXJhbSBzZWNyZXQgQ29uc3VtZXIga2V5IHNlY3JldC4KKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyBBZGRpdGlvbmFsIGF0dHJpYnV0ZXMgKG5hbWUtdmFsdWVzIHBhaXJzIC0gdG8gc3RvcmUgYWRkaXRpb25hbAorICAgICAqIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb25zdW1lciwgc3VjaCBhcyBuYW1lLCBVUkksIGRlc2NyaXB0aW9uLCBldGMuKQorICAgICAqIEByZXR1cm4ge0BsaW5rIENvbnN1bWVyfSBvYmplY3QgZm9yIHRoZSBuZXdseSByZWdpc3RlcmVkIGNvbnN1bWVyLgorICAgICAqLworICAgIHB1YmxpYyBDb25zdW1lciByZWdpc3RlckNvbnN1bWVyKGZpbmFsIFN0cmluZyBvd25lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzZWNyZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGF0dHJpYnV0ZXMpIHsKKyAgICAgICAgZmluYWwgQ29uc3VtZXIgYyA9IG5ldyBDb25zdW1lcihrZXksIHNlY3JldCwgb3duZXIsIGF0dHJpYnV0ZXMpOworICAgICAgICBjb25zdW1lckJ5Q29uc3VtZXJLZXkucHV0KGMuZ2V0S2V5KCksIGMpOworICAgICAgICByZXR1cm4gYzsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyBhIHNldCBvZiBjb25zdW1lcnMgcmVnaXN0ZXJlZCBieSBhIGdpdmVuIG93bmVyLgorICAgICAqCisgICAgICogQHBhcmFtIG93bmVyIElkZW50aWZpZXIgb2YgdGhlIG93bmVyIHRoYXQgcmVnaXN0ZXJlZCB0aGUgY29uc3VtZXJzIHRvIGJlIHJldHJpZXZlZC4KKyAgICAgKiBAcmV0dXJuIGNvbnN1bWVycyByZWdpc3RlcmVkIGJ5IHRoZSBvd25lci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2V0PENvbnN1bWVyPiBnZXRDb25zdW1lcnMoZmluYWwgU3RyaW5nIG93bmVyKSB7CisgICAgICAgIGZpbmFsIFNldDxDb25zdW1lcj4gcmVzdWx0ID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICBmb3IgKGZpbmFsIENvbnN1bWVyIGNvbnN1bWVyIDogY29uc3VtZXJCeUNvbnN1bWVyS2V5LnZhbHVlcygpKSB7CisgICAgICAgICAgICBpZiAoY29uc3VtZXIuZ2V0T3duZXIoKS5lcXVhbHMob3duZXIpKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChjb25zdW1lcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKiogUmV0dXJucyBhIGxpc3Qgb2YgYWNjZXNzIHRva2VucyBhdXRob3JpemVkIHdpdGggdGhlIHN1cHBsaWVkIHByaW5jaXBhbCBuYW1lLgorICAgICAqCisgICAgICogQHBhcmFtIHByaW5jaXBhbE5hbWUgUHJpbmNpcGFsIG5hbWUgZm9yIHdoaWNoIHRvIHJldHJpZXZlIHRoZSBhdXRob3JpemVkIHRva2Vucy4KKyAgICAgKiBAcmV0dXJuIGF1dGhvcml6ZWQgYWNjZXNzIHRva2Vucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2V0PFRva2VuPiBnZXRBY2Nlc3NUb2tlbnMoZmluYWwgU3RyaW5nIHByaW5jaXBhbE5hbWUpIHsKKyAgICAgICAgZmluYWwgU2V0PFRva2VuPiB0b2tlbnMgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgIGZvciAoZmluYWwgVG9rZW4gdG9rZW4gOiBhY2Nlc3NUb2tlbkJ5VG9rZW5TdHJpbmcudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIGlmIChwcmluY2lwYWxOYW1lLmVxdWFscyh0b2tlbi5nZXRQcmluY2lwYWwoKS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgdG9rZW5zLmFkZCh0b2tlbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRva2VuczsKKyAgICB9CisKKyAgICAvKiogQXV0aG9yaXplcyBhIHJlcXVlc3QgdG9rZW4gZm9yIGdpdmVuIHByaW5jaXBhbCBhbmQgcm9sZXMgYW5kIHJldHVybnMKKyAgICAgKiB2ZXJpZmllci4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0b2tlbiBSZXF1ZXN0IHRva2VuIHRvIGF1dGhvcml6ZS4KKyAgICAgKiBAcGFyYW0gdXNlclByaW5jaXBhbCBVc2VyIHByaW5jaXBhbCB0byBhdXRob3JpemUgdGhlIHRva2VuIGZvci4KKyAgICAgKiBAcGFyYW0gcm9sZXMgU2V0IG9mIHJvbGVzIHRvIGF1dGhvcml6ZSB0aGUgdG9rZW4gZm9yLgorICAgICAqIEByZXR1cm4gT0F1dGggdmVyaWZpZXIgdmFsdWUgZm9yIGV4Y2hhbmdpbmcgdGhpcyB0b2tlbiBmb3IgYW4gYWNjZXNzIHRva2VuLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgYXV0aG9yaXplVG9rZW4oZmluYWwgVG9rZW4gdG9rZW4sIGZpbmFsIFByaW5jaXBhbCB1c2VyUHJpbmNpcGFsLCBmaW5hbCBTZXQ8U3RyaW5nPiByb2xlcykgeworICAgICAgICBmaW5hbCBUb2tlbiBhdXRob3JpemVkID0gdG9rZW4uYXV0aG9yaXplKHVzZXJQcmluY2lwYWwsIHJvbGVzKTsKKyAgICAgICAgcmVxdWVzdFRva2VuQnlUb2tlblN0cmluZy5wdXQodG9rZW4uZ2V0VG9rZW4oKSwgYXV0aG9yaXplZCk7CisgICAgICAgIGZpbmFsIFN0cmluZyB2ZXJpZmllciA9IG5ld1VVSURTdHJpbmcoKTsKKyAgICAgICAgdmVyaWZpZXJCeVRva2VuU3RyaW5nLnB1dCh0b2tlbi5nZXRUb2tlbigpLCB2ZXJpZmllcik7CisgICAgICAgIHJldHVybiB2ZXJpZmllcjsKKyAgICB9CisKKyAgICAvKiogQ2hlY2tzIGlmIHRoZSBzdXBwbGllZCB0b2tlbiBpcyBhdXRob3JpemVkIGZvciBhIGdpdmVuIHByaW5jaXBhbCBuYW1lCisgICAgICogYW5kIGlmIHNvLCByZXZva2VzIHRoZSBhdXRob3JpemF0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHRva2VuIEFjY2VzcyB0b2tlbiB0byByZXZva2UgdGhlIGF1dGhvcml6YXRpb24gZm9yLgorICAgICAqIEBwYXJhbSBwcmluY2lwYWxOYW1lIFByaW5jaXBhbCBuYW1lIHRoZSB0b2tlbiBpcyBjdXJyZW50bHkgYXV0aG9yaXplZCBmb3IuCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmV2b2tlQWNjZXNzVG9rZW4oZmluYWwgU3RyaW5nIHRva2VuLCBmaW5hbCBTdHJpbmcgcHJpbmNpcGFsTmFtZSkgeworICAgICAgICBmaW5hbCBUb2tlbiB0ID0gKFRva2VuKSBnZXRBY2Nlc3NUb2tlbih0b2tlbik7CisgICAgICAgIGlmICh0ICE9IG51bGwgJiYgdC5nZXRQcmluY2lwYWwoKS5nZXROYW1lKCkuZXF1YWxzKHByaW5jaXBhbE5hbWUpKSB7CisgICAgICAgICAgICBhY2Nlc3NUb2tlbkJ5VG9rZW5TdHJpbmcucmVtb3ZlKHRva2VuKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBHZW5lcmF0ZXMgYSBuZXcgbm9uLWd1ZXNzYWJsZSByYW5kb20gc3RyaW5nICh1c2VkIGZvciB0b2tlbi9jdXN0b21lcgorICAgICAqIHN0cmluZ3MsIHNlY3JldHMgYW5kIHZlcmlmaWVyLgorICAgICAqCisgICAgICogQHJldHVybiBSYW5kb20gVVVJRCBzdHJpbmcuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBuZXdVVUlEU3RyaW5nKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgdG1wID0gVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKTsKKyAgICAgICAgcmV0dXJuIHRtcC5yZXBsYWNlQWxsKCItIiwgIiIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUb2tlbiBnZXRSZXF1ZXN0VG9rZW4oZmluYWwgU3RyaW5nIHRva2VuKSB7CisgICAgICAgIHJldHVybiByZXF1ZXN0VG9rZW5CeVRva2VuU3RyaW5nLmdldCh0b2tlbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9BdXRoMVRva2VuIG5ld1JlcXVlc3RUb2tlbihmaW5hbCBTdHJpbmcgY29uc3VtZXJLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2FsbGJhY2tVcmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGF0dHJpYnV0ZXMpIHsKKyAgICAgICAgZmluYWwgVG9rZW4gcnQgPSBuZXcgVG9rZW4obmV3VVVJRFN0cmluZygpLCBuZXdVVUlEU3RyaW5nKCksIGNvbnN1bWVyS2V5LCBjYWxsYmFja1VybCwgYXR0cmlidXRlcyk7CisgICAgICAgIHJlcXVlc3RUb2tlbkJ5VG9rZW5TdHJpbmcucHV0KHJ0LmdldFRva2VuKCksIHJ0KTsKKyAgICAgICAgcmV0dXJuIHJ0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPQXV0aDFUb2tlbiBuZXdBY2Nlc3NUb2tlbihmaW5hbCBPQXV0aDFUb2tlbiByZXF1ZXN0VG9rZW4sIGZpbmFsIFN0cmluZyB2ZXJpZmllcikgeworICAgICAgICBpZiAodmVyaWZpZXIgPT0gbnVsbCB8fCByZXF1ZXN0VG9rZW4gPT0gbnVsbCB8fCAhdmVyaWZpZXIuZXF1YWxzKHZlcmlmaWVyQnlUb2tlblN0cmluZy5yZW1vdmUocmVxdWVzdFRva2VuLmdldFRva2VuKCkpKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgVG9rZW4gdG9rZW4gPSByZXF1ZXN0VG9rZW5CeVRva2VuU3RyaW5nLnJlbW92ZShyZXF1ZXN0VG9rZW4uZ2V0VG9rZW4oKSk7CisgICAgICAgIGlmICh0b2tlbiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBUb2tlbiBhdCA9IG5ldyBUb2tlbihuZXdVVUlEU3RyaW5nKCksIG5ld1VVSURTdHJpbmcoKSwgdG9rZW4pOworICAgICAgICBhY2Nlc3NUb2tlbkJ5VG9rZW5TdHJpbmcucHV0KGF0LmdldFRva2VuKCksIGF0KTsKKyAgICAgICAgcmV0dXJuIGF0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGFkZEFjY2Vzc1Rva2VuKGZpbmFsIFN0cmluZyB0b2tlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc2VjcmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjb25zdW1lcktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2FsbGJhY2tVcmwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUHJpbmNpcGFsIHByaW5jaXBhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiByb2xlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gYXR0cmlidXRlcykgeworICAgICAgICBmaW5hbCBUb2tlbiBhY2Nlc3NUb2tlbiA9IG5ldyBUb2tlbih0b2tlbiwgc2VjcmV0LCBjb25zdW1lcktleSwgY2FsbGJhY2tVcmwsIHByaW5jaXBhbCwgcm9sZXMsIGF0dHJpYnV0ZXMpOworCisgICAgICAgIGFjY2Vzc1Rva2VuQnlUb2tlblN0cmluZy5wdXQoYWNjZXNzVG9rZW4uZ2V0VG9rZW4oKSwgYWNjZXNzVG9rZW4pOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPQXV0aDFUb2tlbiBnZXRBY2Nlc3NUb2tlbihmaW5hbCBTdHJpbmcgdG9rZW4pIHsKKyAgICAgICAgcmV0dXJuIGFjY2Vzc1Rva2VuQnlUb2tlblN0cmluZy5nZXQodG9rZW4pOworICAgIH0KKworICAgIC8qKiBTaW1wbGUgcmVhZC1vbmx5IGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBPQXV0aDFDb25zdW1lcn0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb25zdW1lciBpbXBsZW1lbnRzIE9BdXRoMUNvbnN1bWVyIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBrZXk7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHNlY3JldDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgb3duZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGF0dHJpYnV0ZXM7CisKKyAgICAgICAgcHJpdmF0ZSBDb25zdW1lcihmaW5hbCBTdHJpbmcga2V5LCBmaW5hbCBTdHJpbmcgc2VjcmV0LCBmaW5hbCBTdHJpbmcgb3duZXIsIGZpbmFsIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gYXR0cmlidXRlcykgeworICAgICAgICAgICAgdGhpcy5rZXkgPSBrZXk7CisgICAgICAgICAgICB0aGlzLnNlY3JldCA9IHNlY3JldDsKKyAgICAgICAgICAgIHRoaXMub3duZXIgPSBvd25lcjsKKyAgICAgICAgICAgIHRoaXMuYXR0cmlidXRlcyA9IGdldEltbXV0YWJsZU1hcChhdHRyaWJ1dGVzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEtleSgpIHsKKyAgICAgICAgICAgIHJldHVybiBrZXk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRTZWNyZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gc2VjcmV0OworICAgICAgICB9CisKKyAgICAgICAgLyoqIFJldHVybnMgaWRlbnRpZmllciBvZiBvd25lciBvZiB0aGlzIGNvbnN1bWVyIC0gaS5lLiB3aG8gcmVnaXN0ZXJlZAorICAgICAgICAgKiB0aGUgY29uc3VtZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gY29uc3VtZXIgb3duZXIKKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0T3duZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gb3duZXI7CisgICAgICAgIH0KKworICAgICAgICAvKiogUmV0dXJucyBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb25zdW1lciAoZS5nLiBuYW1lLAorICAgICAgICAgKiBVUkksIGRlc2NyaXB0aW9uLCBldGMuKQorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIG5hbWUtdmFsdWVzIHBhaXJzIG9mIGFkZGl0aW9uYWwgYXR0cmlidXRlcworICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBnZXRBdHRyaWJ1dGVzKCkgeworICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFByaW5jaXBhbCBnZXRQcmluY2lwYWwoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0luUm9sZShmaW5hbCBTdHJpbmcgcm9sZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGdldEltbXV0YWJsZU1hcChmaW5hbCBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IG1hcCkgeworICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IG5ld01hcCA9IG5ldyBNdWx0aXZhbHVlZEhhc2hNYXA8PigpOworICAgICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gZW50cnkgOiBtYXAuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgbmV3TWFwLnB1dChlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ld01hcDsKKyAgICB9CisKKyAgICAvKiogU2ltcGxlIGltbXV0YWJsZSBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgT0F1dGgxVG9rZW59LgorICAgICAqCisgICAgICovCisgICAgcHVibGljIGNsYXNzIFRva2VuIGltcGxlbWVudHMgT0F1dGgxVG9rZW4geworCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHRva2VuOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBzZWNyZXQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGNvbnN1bWVyS2V5OworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBjYWxsYmFja1VybDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBQcmluY2lwYWwgcHJpbmNpcGFsOworICAgICAgICBwcml2YXRlIGZpbmFsIFNldDxTdHJpbmc+IHJvbGVzOworICAgICAgICBwcml2YXRlIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBhdHRyaWJzOworCisgICAgICAgIHByb3RlY3RlZCBUb2tlbihmaW5hbCBTdHJpbmcgdG9rZW4sIGZpbmFsIFN0cmluZyBzZWNyZXQsIGZpbmFsIFN0cmluZyBjb25zdW1lcktleSwgZmluYWwgU3RyaW5nIGNhbGxiYWNrVXJsLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUHJpbmNpcGFsIHByaW5jaXBhbCwgZmluYWwgU2V0PFN0cmluZz4gcm9sZXMsIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBhdHRyaWJ1dGVzKSB7CisgICAgICAgICAgICB0aGlzLnRva2VuID0gdG9rZW47CisgICAgICAgICAgICB0aGlzLnNlY3JldCA9IHNlY3JldDsKKyAgICAgICAgICAgIHRoaXMuY29uc3VtZXJLZXkgPSBjb25zdW1lcktleTsKKyAgICAgICAgICAgIHRoaXMuY2FsbGJhY2tVcmwgPSBjYWxsYmFja1VybDsKKyAgICAgICAgICAgIHRoaXMucHJpbmNpcGFsID0gcHJpbmNpcGFsOworICAgICAgICAgICAgdGhpcy5yb2xlcyA9IHJvbGVzOworICAgICAgICAgICAgdGhpcy5hdHRyaWJzID0gYXR0cmlidXRlczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUb2tlbihmaW5hbCBTdHJpbmcgdG9rZW4sCisgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc2VjcmV0LAorICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNvbnN1bWVyS2V5LAorICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGNhbGxiYWNrVXJsLAorICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiBhdHRyaWJ1dGVzKSB7CisgICAgICAgICAgICB0aGlzKHRva2VuLCBzZWNyZXQsIGNvbnN1bWVyS2V5LCBjYWxsYmFja1VybCwgbnVsbCwgQ29sbGVjdGlvbnMuPFN0cmluZz5lbXB0eVNldCgpLAorICAgICAgICAgICAgICAgICAgICBuZXcgSW1tdXRhYmxlTXVsdGl2YWx1ZWRNYXA8PihnZXRJbW11dGFibGVNYXAoYXR0cmlidXRlcykpKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBUb2tlbihmaW5hbCBTdHJpbmcgdG9rZW4sIGZpbmFsIFN0cmluZyBzZWNyZXQsIGZpbmFsIFRva2VuIHJlcXVlc3RUb2tlbikgeworICAgICAgICAgICAgdGhpcyh0b2tlbiwgc2VjcmV0LCByZXF1ZXN0VG9rZW4uZ2V0Q29uc3VtZXIoKS5nZXRLZXkoKSwgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFRva2VuLnByaW5jaXBhbCwgcmVxdWVzdFRva2VuLnJvbGVzLCBJbW11dGFibGVNdWx0aXZhbHVlZE1hcC48U3RyaW5nLCBTdHJpbmc+ZW1wdHkoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRUb2tlbigpIHsKKyAgICAgICAgICAgIHJldHVybiB0b2tlbjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFNlY3JldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBzZWNyZXQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE9BdXRoMUNvbnN1bWVyIGdldENvbnN1bWVyKCkgeworICAgICAgICAgICAgcmV0dXJuIERlZmF1bHRPQXV0aDFQcm92aWRlci50aGlzLmdldENvbnN1bWVyKGNvbnN1bWVyS2V5KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGdldEF0dHJpYnV0ZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gYXR0cmliczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUHJpbmNpcGFsIGdldFByaW5jaXBhbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBwcmluY2lwYWw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNJblJvbGUoZmluYWwgU3RyaW5nIHJvbGUpIHsKKyAgICAgICAgICAgIHJldHVybiByb2xlcy5jb250YWlucyhyb2xlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBSZXR1cm5zIGNhbGxiYWNrIFVSTCBmb3IgdGhpcyB0b2tlbiAoYXBwbGljYWJsZSBqdXN0IHRvIHJlcXVlc3QgdG9rZW5zKQorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIGNhbGxiYWNrIHVybAorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDYWxsYmFja1VybCgpIHsKKyAgICAgICAgICAgIHJldHVybiBjYWxsYmFja1VybDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBBdXRob3JpemVzIHRoaXMgdG9rZW4gLSBpLmUuIGdlbmVyYXRlcyBhIGNsb25lIHdpdGggcHJpbmNpcGFsIGFuZCByb2xlcyBzZXQKKyAgICAgICAgICogdG8gdGhlIHBhc3NlZCB2YWx1ZXMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwcmluY2lwYWwgUHJpbmNpcGFsIHRvIGFkZCB0byB0aGUgdG9rZW4uCisgICAgICAgICAqIEBwYXJhbSByb2xlcyBSb2xlcyB0byBhZGQgdG8gdGhlIHRva2VuLgorICAgICAgICAgKiBAcmV0dXJuIENsb25lZCB0b2tlbiB3aXRoIHRoZSBwcmluY2lwYWwgYW5kIHJvbGVzIHNldC4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBUb2tlbiBhdXRob3JpemUoZmluYWwgUHJpbmNpcGFsIHByaW5jaXBhbCwgZmluYWwgU2V0PFN0cmluZz4gcm9sZXMpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVG9rZW4odG9rZW4sIHNlY3JldCwgY29uc3VtZXJLZXksIGNhbGxiYWNrVXJsLCBwcmluY2lwYWwsCisgICAgICAgICAgICAgICAgICAgIHJvbGVzID09IG51bGwgPyBDb2xsZWN0aW9ucy48U3RyaW5nPmVtcHR5U2V0KCkgOiBuZXcgSGFzaFNldDw+KHJvbGVzKSwgYXR0cmlicyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9vYXV0aDEtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL29hdXRoMS9Ob25jZU1hbmFnZXIuamF2YSBiL3NlY3VyaXR5L29hdXRoMS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvb2F1dGgxL05vbmNlTWFuYWdlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MDA1ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9vYXV0aDEtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL29hdXRoMS9Ob25jZU1hbmFnZXIuamF2YQpAQCAtMCwwICsxLDE5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIub2F1dGgxOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRNYXA7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKKy8qKgorICogVHJhY2tzIHRoZSBub25jZXMgZm9yIGEgZ2l2ZW4gY29uc3VtZXIga2V5IGFuZC9vciB0b2tlbi4gQXV0b21hZ2ljYWxseQorICogZW5zdXJlcyB0aW1lc3RhbXAgaXMgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIGFuZCB0cmFja3MgYWxsIG5vbmNlcworICogZm9yIGEgZ2l2ZW4gdGltZXN0YW1wLgorICoKKyAqIEBhdXRob3IgUGF1bCBDLiBCcnlhbgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKiBAYXV0aG9yIFRob21hcyBNZWlyZQorICovCitmaW5hbCBjbGFzcyBOb25jZU1hbmFnZXIgeworICAgIC8qKgorICAgICAqIFRoZSBtYXhpbXVtIHZhbGlkIGFnZSBvZiBhIG5vbmNlIHRpbWVzdGFtcCwgaW4gbWlsbGlzZWNvbmRzLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgbG9uZyBtYXhBZ2U7CisKKyAgICAvKioKKyAgICAgKiBWZXJpZmljYXRpb25zIHRvIHBlcmZvcm0gb24gYXZlcmFnZSBiZWZvcmUgcGVyZm9ybWluZyBnYXJiYWdlIGNvbGxlY3Rpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgZ2NQZXJpb2Q7CisKKyAgICAvKioKKyAgICAgKiBDb3VudHMgbnVtYmVyIG9mIHZlcmlmaWNhdGlvbiByZXF1ZXN0cyBwZXJmb3JtZWQgdG8gc2NoZWR1bGUgZ2FyYmFnZSBjb2xsZWN0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgaW50IGdjQ291bnRlciA9IDA7CisKKyAgICBwcml2YXRlIGZpbmFsIFRpbWVVbml0IHRpbWVzdGFtcFVuaXQ7CisKKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgbWF4aW11bU1hcFNpemU7CisKKyAgICAvKioKKyAgICAgKiBNYXBzIHRpbWVzdGFtcHMgdG8ga2V5LW5vbmNlIHBhaXJzLgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgU29ydGVkTWFwPExvbmcsIE1hcDxTdHJpbmcsIFNldDxTdHJpbmc+Pj4gdHNUb0tleU5vbmNlUGFpcnMgPSBuZXcgVHJlZU1hcDw+KCk7CisKKyAgICBwcml2YXRlIHZvbGF0aWxlIGxvbmcgbWFwU2l6ZSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgbm9uY2UgbWFuYWdlciBjb25maWd1cmVkIHdpdGggbWF4aW11bSBhZ2UsIG9sZCBub25jZSBjbGVhbmluZyBwZXJpb2QgYW5kIGEgdGltZQorICAgICAqIHVuaXQgb2YgdGltZXN0YW1wcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYXhBZ2UgICB0aGUgbWF4aW11bSB2YWxpZCBhZ2Ugb2YgYSBub25jZSB0aW1lc3RhbXAsIGluIG1pbGxpc2Vjb25kcy4KKyAgICAgKiBAcGFyYW0gZ2NQZXJpb2QgbnVtYmVyIG9mIHZlcmlmaWNhdGlvbnMgdG8gYmUgcGVyZm9ybWVkIG9uIGF2ZXJhZ2UgYmVmb3JlIHBlcmZvcm1pbmcgZ2FyYmFnZSBjb2xsZWN0aW9uCisgICAgICogICAgICAgICAgICAgICAgIG9mIG9sZCBub25jZXMuCisgICAgICogQHBhcmFtIHRpbWVzdGFtcFVuaXQgdW5pdCBpbiB3aGljaCB0aW1lc3RhbXBzIGFyZSBwYXNzZWQgdG8ge0BsaW5rICN2ZXJpZnkoU3RyaW5nLCBTdHJpbmcsIFN0cmluZyl9IG1ldGhvZC4KKyAgICAgKiBAcGFyYW0gbWF4aW11bUNhY2hlU2l6ZSBtYXhpbXVtIHNpemUgb2YgdGhlIGNhY2hlIHRoYXQga2VlcHMgbm9uY2VzLiBJZiB0aGUgY2FjaGUgZXhjZWVkcyB0aGUgbWV0aG9kCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAge0BsaW5rICN2ZXJpZnkoU3RyaW5nLCBTdHJpbmcsIFN0cmluZyl9IHdpbGwgcmV0dXJuIHtAY29kZSBmYWxzZX0uCisgICAgICovCisgICAgcHVibGljIE5vbmNlTWFuYWdlcihmaW5hbCBsb25nIG1heEFnZSwgZmluYWwgaW50IGdjUGVyaW9kLCBmaW5hbCBUaW1lVW5pdCB0aW1lc3RhbXBVbml0LCBmaW5hbCBsb25nIG1heGltdW1DYWNoZVNpemUpIHsKKyAgICAgICAgaWYgKG1heEFnZSA8PSAwIHx8IGdjUGVyaW9kIDw9IDApIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMubWF4QWdlID0gbWF4QWdlOworICAgICAgICB0aGlzLmdjUGVyaW9kID0gZ2NQZXJpb2Q7CisgICAgICAgIHRoaXMudGltZXN0YW1wVW5pdCA9IHRpbWVzdGFtcFVuaXQ7CisgICAgICAgIHRoaXMubWF4aW11bU1hcFNpemUgPSBtYXhpbXVtQ2FjaGVTaXplOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRXZhbHVhdGVzIHRoZSB0aW1lc3RhbXAvbm9uY2UgY29tYmluYXRpb24gZm9yIHZhbGlkaXR5LCBzdG9yaW5nIGFuZC9vcgorICAgICAqIGNsZWFyaW5nIG5vbmNlcyBhcyByZXF1aXJlZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbWV0aG9kIGlzIHBhY2thZ2UgcHJpdmF0ZSBpbiBvcmRlciB0byBiZSB1c2VkIGluIHVuaXQgdGVzdHMgb25seS4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5ICAgICAgIHRoZSBvYXV0aF9jb25zdW1lcl9rZXkgdmFsdWUgZm9yIGEgZ2l2ZW4gY29uc3VtZXIgcmVxdWVzdAorICAgICAqIEBwYXJhbSB0aW1lc3RhbXAgdGhlIG9hdXRoX3RpbWVzdGFtcCB2YWx1ZSBmb3IgYSBnaXZlbiBjb25zdW1lciByZXF1ZXN0IChpbiBtaWxsaXNlY29uZHMpLgorICAgICAqIEBwYXJhbSBub25jZSAgICAgdGhlIG9hdXRoX25vbmNlIHZhbHVlIGZvciBhIGdpdmVuIGNvbnN1bWVyIHJlcXVlc3QuCisgICAgICogQHBhcmFtIG5vdyAgICAgICBjdXJyZW50IHRpbWUgaW4gbWlsbGlzZWNvbmRzCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0aW1lc3RhbXAvbm9uY2UgYXJlIHZhbGlkLgorICAgICAqLworICAgIHN5bmNocm9uaXplZCBib29sZWFuIHZlcmlmeShmaW5hbCBTdHJpbmcga2V5LCBmaW5hbCBTdHJpbmcgdGltZXN0YW1wLCBmaW5hbCBTdHJpbmcgbm9uY2UsIGZpbmFsIGxvbmcgbm93KSB7CisgICAgICAgIC8vIGNvbnZlcnQgdGltZXN0YW1wIHRvIG1pbGxpc2Vjb25kcyBzaW5jZSBlcG9jaCB0byBkZWFsIHdpdGggdW5pZm9ybWx5CisgICAgICAgIGZpbmFsIGxvbmcgc3RhbXAgPSB0aW1lc3RhbXBVbml0LnRvTWlsbGlzKGxvbmdWYWx1ZSh0aW1lc3RhbXApKTsKKworICAgICAgICBpZiAobWFwU2l6ZSArIDEgPiBtYXhpbXVtTWFwU2l6ZSkgeworICAgICAgICAgICAgZ2Mobm93KTsKKyAgICAgICAgICAgIGlmIChtYXBTaXplICsgMSA+IG1heGltdW1NYXBTaXplKSB7CisgICAgICAgICAgICAgICAgLy8gY2Fubm90IGtlZXAgYW5vdGhlciBub25jZSAocHJldmVudHMgZXhoYXVzdGluZyBtZW1vcnkpCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gaW52YWxpZCB0aW1lc3RhbXAgc3VwcGxpZWQ7IGF1dG9tYXRpY2FsbHkgaW52YWxpZAorICAgICAgICBpZiAoc3RhbXAgKyBtYXhBZ2UgPCBub3cgfHwgc3RhbXAgLSBtYXhBZ2UgPiBub3cpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIE1hcDxTdHJpbmcsIFNldDxTdHJpbmc+PiBrZXlUb05vbmNlcyA9IHRzVG9LZXlOb25jZVBhaXJzLmdldChzdGFtcCk7CisgICAgICAgIGlmIChrZXlUb05vbmNlcyA9PSBudWxsKSB7CisgICAgICAgICAgICBrZXlUb05vbmNlcyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgICAgIHRzVG9LZXlOb25jZVBhaXJzLnB1dChzdGFtcCwga2V5VG9Ob25jZXMpOworICAgICAgICB9CisKKyAgICAgICAgU2V0PFN0cmluZz4gbm9uY2VzID0ga2V5VG9Ob25jZXMuZ2V0KGtleSk7CisgICAgICAgIGlmIChub25jZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgbm9uY2VzID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICAgICAga2V5VG9Ob25jZXMucHV0KGtleSwgbm9uY2VzKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVzdWx0ID0gbm9uY2VzLmFkZChub25jZSk7CisgICAgICAgIGlmIChyZXN1bHQpIHsKKyAgICAgICAgICAgIG1hcFNpemUrKzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHBlcmZvcm0gZ2FyYmFnZSBjb2xsZWN0aW9uIGlmIGNvdW50ZXIgaXMgdXAgdG8gZXN0YWJsaXNoZWQgbnVtYmVyIG9mIHBhc3NlcworICAgICAgICBpZiAoKytnY0NvdW50ZXIgPj0gZ2NQZXJpb2QpIHsKKyAgICAgICAgICAgIGdjKG5vdyk7CisgICAgICAgIH0KKworICAgICAgICAvLyByZXR1cm5zIGZhbHNlIGlmIG5vbmNlIGFscmVhZHkgZW5jb3VudGVyZWQgZm9yIGdpdmVuIHRpbWVzdGFtcAorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEV2YWx1YXRlcyB0aGUgdGltZXN0YW1wL25vbmNlIGNvbWJpbmF0aW9uIGZvciB2YWxpZGl0eSwgc3RvcmluZyBhbmQvb3IKKyAgICAgKiBjbGVhcmluZyBub25jZXMgYXMgcmVxdWlyZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0ga2V5ICAgICAgIHRoZSBvYXV0aF9jb25zdW1lcl9rZXkgdmFsdWUgZm9yIGEgZ2l2ZW4gY29uc3VtZXIgcmVxdWVzdAorICAgICAqIEBwYXJhbSB0aW1lc3RhbXAgdGhlIG9hdXRoX3RpbWVzdGFtcCB2YWx1ZSBmb3IgYSBnaXZlbiBjb25zdW1lciByZXF1ZXN0IChpbiBtaWxsaXNlY29uZHMpLgorICAgICAqIEBwYXJhbSBub25jZSAgICAgdGhlIG9hdXRoX25vbmNlIHZhbHVlIGZvciBhIGdpdmVuIGNvbnN1bWVyIHJlcXVlc3QuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0aW1lc3RhbXAvbm9uY2UgYXJlIHZhbGlkLgorICAgICAqLworICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgYm9vbGVhbiB2ZXJpZnkoZmluYWwgU3RyaW5nIGtleSwgZmluYWwgU3RyaW5nIHRpbWVzdGFtcCwgZmluYWwgU3RyaW5nIG5vbmNlKSB7CisgICAgICAgIHJldHVybiB2ZXJpZnkoa2V5LCB0aW1lc3RhbXAsIG5vbmNlLCBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVsZXRlcyBhbGwgbm9uY2VzIG9sZGVyIHRoYW4gbWF4QWdlLgorICAgICAqIFRoaXMgbWV0aG9kIGlzIHBhY2thZ2UgcHJpdmF0ZSAoaW5zdGVhZCBvZiBwcml2YXRlKSBmb3IgdGVzdGFiaWxpdHkgcHVycG9zZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbm93IG1pbGxpc2Vjb25kcyBzaW5jZSBlcG9jaCByZXByZXNlbnRpbmcgIm5vdyIKKyAgICAgKi8KKyAgICB2b2lkIGdjKGZpbmFsIGxvbmcgbm93KSB7CisgICAgICAgIGdjQ291bnRlciA9IDA7CisgICAgICAgIGZpbmFsIFNvcnRlZE1hcDxMb25nLCBNYXA8U3RyaW5nLCBTZXQ8U3RyaW5nPj4+IGhlYWRNYXAgPSB0c1RvS2V5Tm9uY2VQYWlycy5oZWFkTWFwKG5vdyAtIG1heEFnZSk7CisgICAgICAgIGZvciAoZmluYWwgTWFwLkVudHJ5PExvbmcsIE1hcDxTdHJpbmcsIFNldDxTdHJpbmc+Pj4gZW50cnkgOiBoZWFkTWFwLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIGZvciAoZmluYWwgTWFwLkVudHJ5PFN0cmluZywgU2V0PFN0cmluZz4+IHRpbWVFbnRyeSA6IGVudHJ5LmdldFZhbHVlKCkuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgIG1hcFNpemUgLT0gdGltZUVudHJ5LmdldFZhbHVlKCkuc2l6ZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaGVhZE1hcC5jbGVhcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgbnVtYmVyIG9mIGN1cnJlbnRseSB0cmFja2VkIHRpbWVzdGFtcC1rZXktbm9uY2UgdHVwbGVzLiBUaGUgbWV0aG9kIHNob3VsZCBiZSB1c2VkIGJ5IHRlc3RzIG9ubHkuCisgICAgICogQHJldHVybiBudW1iZXIgb2YgY3VycmVudGx5IHRyYWNrZWQgdGltZXN0YW1wLWtleS1ub25jZSB0dXBsZXMuCisgICAgICovCisgICAgbG9uZyBjaGVja0FuZEdldFNpemUoKSB7CisgICAgICAgIGxvbmcgc2l6ZSA9IDA7CisgICAgICAgIGZvciAoZmluYWwgTWFwPFN0cmluZywgU2V0PFN0cmluZz4+IGtleVRvTm9uY2VzIDogdHNUb0tleU5vbmNlUGFpcnMudmFsdWVzKCkpIHsKKyAgICAgICAgICAgIHNpemUgKz0ga2V5VG9Ob25jZXMudmFsdWVzKCkuc2l6ZSgpOworICAgICAgICB9CisgICAgICAgIGFzc2VydCBtYXBTaXplID09IHNpemU7CisgICAgICAgIHJldHVybiBtYXBTaXplOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGxvbmcgbG9uZ1ZhbHVlKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIExvbmcucGFyc2VMb25nKHZhbHVlKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIG5mZSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9zZWN1cml0eS9vYXV0aDEtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL29hdXRoMS9PQXV0aDFDb25zdW1lci5qYXZhIGIvc2VjdXJpdHkvb2F1dGgxLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9vYXV0aDEvT0F1dGgxQ29uc3VtZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWU1ZDkyCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvb2F1dGgxLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9vYXV0aDEvT0F1dGgxQ29uc3VtZXIuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5vYXV0aDE7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKKworLyoqCisgKiBDbGFzcyByZXByZXNlbnRpbmcgYSByZWdpc3RlcmVkIGNvbnN1bWVyLgorICoKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitwdWJsaWMgaW50ZXJmYWNlIE9BdXRoMUNvbnN1bWVyIHsKKyAgICAvKiogUmV0dXJucyBjb25zdW1lciBrZXkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGNvbnN1bWVyIGtleQorICAgICAqLworICAgIFN0cmluZyBnZXRLZXkoKTsKKworICAgIC8qKiBSZXR1cm5zIGNvbnN1bWVyIHNlY3JldC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gY29uc3VtZXIgc2VjcmV0CisgICAgICovCisgICAgU3RyaW5nIGdldFNlY3JldCgpOworCisgICAgLyoqIFJldHVybnMgYSB7QGxpbmsgamF2YS5zZWN1cml0eS5QcmluY2lwYWx9IG9iamVjdCByZXByZXNlbnRpbmcgdGhpcyBjb25zdW1lci4KKyAgICAgKiBXaGVuIHRoZSBvYXV0aCBmaWx0ZXIgdmVyaWZpZXMgdGhlIHJlcXVlc3QKKyAgICAgKiBhbmQgbm8gYWNjZXNzIHRva2VuIGlzIHByb3ZpZGVkLCB0aGlzIGlzIHRoZSBwcmluY2lwYWwgdGhhdCB3aWxsIGdldCBzZXQgdG8gdGhlIHNlY3VyaXR5IGNvbnRleHQuCisgICAgICogVGhpcyBjYW4gYmUgdXNlZCBmb3IgMi1sZWdnZWQgb2F1dGguIElmIHRoZSBzZXJ2ZXIgZG9lcyBub3QgYWxsb3cgY29uc3VtZXJzIGFjdGluZworICAgICAqIG9uIHRoZWlyIG93biAod2l0aCBubyBhY2Nlc3MgdG9rZW4pLCB0aGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIG51bGwuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFByaW5jaXBhbCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgY29uc3VtZXIsIG9yIG51bGwgaWYgMi1sZWdnZWQgb2F1dGggbm90IHN1cHBvcnRlZCAoaS5lLiBjb25zdW1lcnMgY2FuJ3QgYWN0IG9uIHRoZWlyIG93bikKKyAgICAgKi8KKyAgICBQcmluY2lwYWwgZ2V0UHJpbmNpcGFsKCk7CisKKyAgICAvKiogUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgY29uc3VtZXIgaXMgYXV0aG9yaXplZCBmb3IgdGhlCisgICAgICogc3BlY2lmaWVkIGxvZ2ljYWwgInJvbGUiLiBXaGVuIHRoZSBvYXV0aCBmaWx0ZXIgdmVyaWZpZXMgdGhlIHJlcXVlc3QKKyAgICAgKiBhbmQgbm8gYWNjZXNzIHRva2VuIGlzIHByb3ZpZGVkICgyLWxlZ2dlZCBvYXV0aCksIGl0IHNldHMgdGhlIGNvbnN1bWVyIG9iamVjdCB0byB0aGUgc2VjdXJpdHkgY29udGV4dAorICAgICAqIHdoaWNoIHRoZW4gZGVsZWdhdGVzIHtAbGluayBqYXZheC53cy5ycy5jb3JlLlNlY3VyaXR5Q29udGV4dCNpc1VzZXJJblJvbGUoU3RyaW5nKX0gdG8gdGhpcworICAgICAqIG1ldGhvZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByb2xlIGEge0Bjb2RlIFN0cmluZ30gc3BlY2lmeWluZyB0aGUgbmFtZSBvZiB0aGUgcm9sZQorICAgICAqCisgICAgICogQHJldHVybiBhIHtAY29kZSBib29sZWFufSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyB0b2tlbiBpcyBhdXRob3JpemVkIGZvcgorICAgICAqIGEgZ2l2ZW4gcm9sZQorICAgICAqLworICAgIGJvb2xlYW4gaXNJblJvbGUoU3RyaW5nIHJvbGUpOworfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvb2F1dGgxLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9vYXV0aDEvT0F1dGgxRXhjZXB0aW9uLmphdmEgYi9zZWN1cml0eS9vYXV0aDEtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL29hdXRoMS9PQXV0aDFFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjU5ZDljCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvb2F1dGgxLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9vYXV0aDEvT0F1dGgxRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIub2F1dGgxOworCitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2UuUmVzcG9uc2VCdWlsZGVyOworCisvKioKKyAqIHtAbGluayBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiBXZWIgYXBwbGljYXRpb24gZXhjZXB0aW9ufSB0aGF0IGlzIG1hcHBlZCBlaXRoZXIKKyAqIHRvIHtAbGluayBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlLlN0YXR1cyNCQURfUkVRVUVTVH0gKGUuZy4gaWYgcHJvYmxlbSB3aXRoIE9BdXRoCisgKiBwYXJhbWV0ZXJzIG9jY3Vycykgb3IKKyAqIHtAbGluayBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlLlN0YXR1cyNVTkFVVEhPUklaRUR9IChlLmcuIGlmIHNpZ25hdHVyZSBpcyBpbmNvcnJlY3QpLgorICoKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgY2xhc3MgT0F1dGgxRXhjZXB0aW9uIGV4dGVuZHMgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGV4Y2VwdGlvbi4KKyAgICAgKiBAcGFyYW0gc3RhdHVzIFJlc3BvbnNlIHN0YXR1cy4KKyAgICAgKiBAcGFyYW0gd3d3QXV0aEhlYWRlciB7QGNvZGUgQXV0aG9yaXphdGlvbn0gaGVhZGVyIHZhbHVlIG9mIHRoZSByZXF1ZXN0IHRoYXQgY2F1c2UgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgT0F1dGgxRXhjZXB0aW9uKGZpbmFsIFJlc3BvbnNlLlN0YXR1cyBzdGF0dXMsIGZpbmFsIFN0cmluZyB3d3dBdXRoSGVhZGVyKSB7CisgICAgICAgIHN1cGVyKGNyZWF0ZVJlc3BvbnNlKHN0YXR1cywgd3d3QXV0aEhlYWRlcikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgc3RhdHVzIG9mIHRoZSBlcnJvciByZXNwb25zZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gUmVzcG9uc2Ugc3RhdHVzIGNvZGUuCisgICAgICovCisgICAgcHVibGljIFJlc3BvbnNlLlN0YXR1cyBnZXRTdGF0dXMoKSB7CisgICAgICAgIHJldHVybiBSZXNwb25zZS5TdGF0dXMuZnJvbVN0YXR1c0NvZGUoc3VwZXIuZ2V0UmVzcG9uc2UoKS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSB7QGNvZGUgV1dXLUF1dGhlbnRpY2F0ZX0gaGVhZGVyIG9mIHRoZSByZXF1ZXN0IHRoYXQgY2F1c2UgdGhlIGV4Y2VwdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIFdXVy1BdXRoZW50aWNhdGV9IGhlYWRlciB2YWx1ZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFd3d0F1dGhIZWFkZXIoKSB7CisgICAgICAgIHJldHVybiBzdXBlci5nZXRSZXNwb25zZSgpLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5XV1dfQVVUSEVOVElDQVRFKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBSZXNwb25zZSBjcmVhdGVSZXNwb25zZShSZXNwb25zZS5TdGF0dXMgc3RhdHVzLCBTdHJpbmcgd3d3QXV0aEhlYWRlcikgeworICAgICAgICBSZXNwb25zZUJ1aWxkZXIgcmIgPSBSZXNwb25zZS5zdGF0dXMoc3RhdHVzKTsKKyAgICAgICAgaWYgKHd3d0F1dGhIZWFkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgcmIuaGVhZGVyKEh0dHBIZWFkZXJzLldXV19BVVRIRU5USUNBVEUsIHd3d0F1dGhIZWFkZXIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByYi5idWlsZCgpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvb2F1dGgxLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9vYXV0aDEvT0F1dGgxUHJvdmlkZXIuamF2YSBiL3NlY3VyaXR5L29hdXRoMS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvb2F1dGgxL09BdXRoMVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MzMjgzMgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L29hdXRoMS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvb2F1dGgxL09BdXRoMVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIub2F1dGgxOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5Db250cmFjdDsKKworLyoqCisgKiBDb250cmFjdCBmb3IgYSBwcm92aWRlciB0aGF0IHN1cHBvcnRzIG1hbmFnaW5nIE9BdXRoIHRva2VucyBhbmQgY29uc3VtZXIgc2VjcmV0cy4KKyAqIFRoZSBwcm92aWRlciBzaG91bGQgYmUgZWl0aGVyIGRlZmluZWQgaW4gdGhlIHtAbGluayBPQXV0aDFTZXJ2ZXJGZWF0dXJlfQorICogb3IgcmVnaXN0ZXJlZCBhcyBhIHN0YW5kYXJkIHByb3ZpZGVyLgorICoKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitAQ29udHJhY3QKK3B1YmxpYyBpbnRlcmZhY2UgT0F1dGgxUHJvdmlkZXIgeworCisgICAgLyoqIEdldHMgY29uc3VtZXIgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIGNvbnN1bWVyIGtleS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25zdW1lcktleSBjb25zdW1lciBrZXkKKyAgICAgKiBAcmV0dXJuIGNvcnJlc3BvbmRpbmcgY29uc3VtZXIgc2VjcmV0IG9yIHtAbGl0ZXJhbCBudWxsfSBpZiBubyBjb25zdW1lciB3aXRoIHRoZSBnaXZlbiBrZXkgaXMga25vd24KKyAgICAgKi8KKyAgICBPQXV0aDFDb25zdW1lciBnZXRDb25zdW1lcihTdHJpbmcgY29uc3VtZXJLZXkpOworCisgICAgLyoqIENyZWF0ZXMgYSBuZXcgcmVxdWVzdCB0b2tlbiBmb3IgYSBnaXZlbiBjb25zdW1lcktleS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25zdW1lcktleSBjb25zdW1lciBrZXkgdG8gY3JlYXRlIGEgcmVxdWVzdCB0b2tlbiBmb3IKKyAgICAgKiBAcGFyYW0gY2FsbGJhY2tVcmwgY2FsbGJhY2sgdXJsIGZvciB0aGlzIHJlcXVlc3QgdG9rZW4gcmVxdWVzdAorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIGFkZGl0aW9uYWwgc2VydmljZSBwcm92aWRlci1zcGVjaWZpYyBwYXJhbWV0ZXJzCisgICAgICogICAgICAodGhpcyBjYW4gYmUgdXNlZCB0byBpbmRpY2F0ZSB3aGF0IGxldmVsIG9mIGFjY2VzcyBpcyByZXF1ZXN0ZWQKKyAgICAgKiAgICAgIC0gaS5lLiByZWFkb25seSwgb3Igci93LCBldGMuKQorICAgICAqIEByZXR1cm4gbmV3IHJlcXVlc3QgdG9rZW4KKyAgICAgKi8KKyAgICBPQXV0aDFUb2tlbiBuZXdSZXF1ZXN0VG9rZW4oU3RyaW5nIGNvbnN1bWVyS2V5LCBTdHJpbmcgY2FsbGJhY2tVcmwsIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gYXR0cmlidXRlcyk7CisKKyAgICAvKiogUmV0dXJucyB0aGUgcmVxdWVzdCB0b2tlbiBieSB0aGUgY29uc3VtZXIga2V5IGFuZCB0b2tlbiB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0b2tlbiByZXF1ZXN0IHRva2VuIHZhbHVlCisgICAgICogQHJldHVybiByZXF1ZXN0IHRva2VuIG9yIHtAbGl0ZXJhbCBudWxsfSBpZiBubyBzdWNoIHRva2VuIGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbgorICAgICAqIGNvbnN1bWVyIGtleSBpcyBmb3VuZAorICAgICAqLworICAgIE9BdXRoMVRva2VuIGdldFJlcXVlc3RUb2tlbihTdHJpbmcgdG9rZW4pOworCisgICAgLyoqIENyZWF0ZXMgYSBuZXcgYWNjZXNzIHRva2VuLiBUaGlzIG1ldGhvZCBtdXN0IHZhbGlkYXRlIHRoZSBwYXNzZWQgYXJndW1lbnRzCisgICAgICogYW5kIHJldHVybiB7QGxpdGVyYWwgbnVsbH0gaWYgYW55IG9mIHRoZW0gaXMgaW52YWxpZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0VG9rZW4gYXV0aG9yaXplZCByZXF1ZXN0IHRva2VuCisgICAgICogQHBhcmFtIHZlcmlmaWVyIHZlcmlmaWVyIHBhc3NlZCB0byB0aGUgY2FsbGJhY2sgYWZ0ZXIgYXV0aG9yaXphdGlvbgorICAgICAqIEByZXR1cm4gbmV3IGFjY2VzcyB0b2tlbiBvciBudWxsIGlmIHRoZSBhcmd1bWVudHMgYXJlIGludmFsaWQgKGUuZy4gdGhlcmUKKyAgICAgKiBpcyBubyBzdWNoIHJlcXVlc3QgdG9rZW4gYXMgaW4gdGhlIGFyZ3VtZW50LCBvciB0aGUgdmVyaWZpZXIgZG9lcyBub3QgbWF0Y2gpCisgICAgICovCisgICAgT0F1dGgxVG9rZW4gbmV3QWNjZXNzVG9rZW4oT0F1dGgxVG9rZW4gcmVxdWVzdFRva2VuLCBTdHJpbmcgdmVyaWZpZXIpOworCisgICAgLyoqIFJldHVybnMgdGhlIGFjY2VzcyB0b2tlbiBieSB0aGUgY29uc3VtZXIga2V5IGFuZCB0b2tlbiB2YWx1ZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0b2tlbiBhY2Nlc3MgdG9rZW4gdmFsdWUKKyAgICAgKiBAcmV0dXJuIGFjY2VzcyB0b2tlbiBvciB7QGxpdGVyYWwgbnVsbH0gaWYgbm8gc3VjaCBmb3VuZAorICAgICAqLworICAgIE9BdXRoMVRva2VuIGdldEFjY2Vzc1Rva2VuKFN0cmluZyB0b2tlbik7Cit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9vYXV0aDEtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL29hdXRoMS9PQXV0aDFTZWN1cml0eUNvbnRleHQuamF2YSBiL3NlY3VyaXR5L29hdXRoMS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvb2F1dGgxL09BdXRoMVNlY3VyaXR5Q29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzYzIzM2MKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9vYXV0aDEtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL29hdXRoMS9PQXV0aDFTZWN1cml0eUNvbnRleHQuamF2YQpAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5vYXV0aDE7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuU2VjdXJpdHlDb250ZXh0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkub2F1dGgxLnNpZ25hdHVyZS5PQXV0aDFQYXJhbWV0ZXJzOworCisvKioKKyAqIFNlY3VyaXR5IHJlcXVlc3QgdGhhdCBnZXRzIGluamVjdGVkIGludG8gdGhlIGNvbnRleHQgYnkgdGhlIE9BdXRoIGZpbHRlcgorICogYmFzZWQgb24gdGhlIGFjY2VzcyB0b2tlbiBhdHRhY2hlZCB0byB0aGUgcmVxdWVzdC4KKyAqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworY2xhc3MgT0F1dGgxU2VjdXJpdHlDb250ZXh0IGltcGxlbWVudHMgU2VjdXJpdHlDb250ZXh0IHsKKyAgICBwcml2YXRlIGZpbmFsIE9BdXRoMUNvbnN1bWVyIGNvbnN1bWVyOworICAgIHByaXZhdGUgZmluYWwgT0F1dGgxVG9rZW4gdG9rZW47CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGlzU2VjdXJlOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IE9BdXRoIHNlY3VyaXR5IGNvbnRleHQgZnJvbSB7QGxpbmsgT0F1dGgxQ29uc3VtZXIgY29uc3VtZXJ9LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnN1bWVyIE9BdXRoIGNvbnN1bWVyIGZvciB3aGljaCB0aGUgY29udGV4dCB3aWxsIGJlIGNyZWF0ZWQuCisgICAgICogQHBhcmFtIGlzU2VjdXJlIHtAY29kZSB0cnVlfSBpZiB0aGUgcmVxdWVzdCBpcyBzZWN1cmVkIG92ZXIgU1NMIChIVFRQUykuCisgICAgICovCisgICAgcHVibGljIE9BdXRoMVNlY3VyaXR5Q29udGV4dChPQXV0aDFDb25zdW1lciBjb25zdW1lciwgYm9vbGVhbiBpc1NlY3VyZSkgeworICAgICAgICB0aGlzLmNvbnN1bWVyID0gY29uc3VtZXI7CisgICAgICAgIHRoaXMudG9rZW4gPSBudWxsOworICAgICAgICB0aGlzLmlzU2VjdXJlID0gaXNTZWN1cmU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IE9BdXRoIHNlY3VyaXR5IGNvbnRleHQgZnJvbSB7QGxpbmsgT0F1dGgxVG9rZW4gQWNjZXNzIFRva2VufS4KKyAgICAgKiBAcGFyYW0gdG9rZW4gQWNjZXNzIFRva2VuLgorICAgICAqIEBwYXJhbSBpc1NlY3VyZSB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHJlcXVlc3QgaXMgc2VjdXJlZCBvdmVyIFNTTCAoSFRUUFMpLgorICAgICAqLworICAgIHB1YmxpYyBPQXV0aDFTZWN1cml0eUNvbnRleHQoT0F1dGgxVG9rZW4gdG9rZW4sIGJvb2xlYW4gaXNTZWN1cmUpIHsKKyAgICAgICAgdGhpcy5jb25zdW1lciA9IG51bGw7CisgICAgICAgIHRoaXMudG9rZW4gPSB0b2tlbjsKKyAgICAgICAgdGhpcy5pc1NlY3VyZSA9IGlzU2VjdXJlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBQcmluY2lwYWwgZ2V0VXNlclByaW5jaXBhbCgpIHsKKyAgICAgICAgcmV0dXJuIGNvbnN1bWVyID09IG51bGwgPyB0b2tlbi5nZXRQcmluY2lwYWwoKSA6IGNvbnN1bWVyLmdldFByaW5jaXBhbCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzVXNlckluUm9sZShTdHJpbmcgc3RyaW5nKSB7CisgICAgICAgIHJldHVybiBjb25zdW1lciA9PSBudWxsID8gdG9rZW4uaXNJblJvbGUoc3RyaW5nKSA6IGNvbnN1bWVyLmlzSW5Sb2xlKHN0cmluZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNTZWN1cmUoKSB7CisgICAgICAgIHJldHVybiBpc1NlY3VyZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldEF1dGhlbnRpY2F0aW9uU2NoZW1lKCkgeworICAgICAgICByZXR1cm4gT0F1dGgxUGFyYW1ldGVycy5TQ0hFTUU7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9vYXV0aDEtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL29hdXRoMS9PQXV0aDFTZXJ2ZXJGZWF0dXJlLmphdmEgYi9zZWN1cml0eS9vYXV0aDEtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL29hdXRoMS9PQXV0aDFTZXJ2ZXJGZWF0dXJlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI4NjIwZgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L29hdXRoMS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvb2F1dGgxL09BdXRoMVNlcnZlckZlYXR1cmUuamF2YQpAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIub2F1dGgxOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJpb3JpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmVDb250ZXh0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkub2F1dGgxLnNpZ25hdHVyZS5PQXV0aDFTaWduYXR1cmVGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5Nb2RlbFByb2Nlc3NvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTW9kZWw7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm9hdXRoMS5pbnRlcm5hbC5BY2Nlc3NUb2tlblJlc291cmNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5vYXV0aDEuaW50ZXJuYWwuUmVxdWVzdFRva2VuUmVzb3VyY2U7CisKKy8qKgorICogVGhlIGZlYXR1cmUgZW5hYmxlcyBzdXBwb3J0IGZvciBPQXV0aCAxLjBhIG9uIHRoZSBzZXJ2ZXIuCisgKiA8cC8+CisgKiBUaGUgT0F1dGggMSBzZXJ2ZXIgc3VwcG9ydCByZXF1aXJlcyBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgT0F1dGgxUHJvdmlkZXJ9OworICogd2hpY2ggd2lsbCBiZSB1c2VkIHRvIHJldHJpZXZlIFJlcXVlc3QgVG9rZW5zLCBBY2Nlc3MgdG9rZW5zLCBldGMuIFRoZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgY29uZmlndXJlZAorICogaW4gdGhpcyBmZWF0dXJlIG9yIHJlZ2lzdGVyZWQgYXMgYSBzdGFuZGFyZCBwcm92aWRlci4KKyAqIDxwLz4KKyAqIEZlYXR1cmUgY2FuIGJlIGNyZWF0ZWQgYW5kIGNvbmZpZ3VyZWQgYnkgdmFyaW91cyBjb25zdHJ1Y3RvcnMuIEJlc2lkZSB0aGF0LCB0aGUgZmVhdHVyZSBiZWhhdmlvdXIKKyAqIGNhbiBiZSBvdmVyd3JpdHRlbiBieSBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMge0BsaW5rIE9BdXRoMVNlcnZlclByb3BlcnRpZXMjRU5BQkxFX1RPS0VOX1JFU09VUkNFU30sCisgKiB7QGxpbmsgT0F1dGgxU2VydmVyUHJvcGVydGllcyNSRVFVRVNUX1RPS0VOX1VSSX0gYW5kIHtAbGluayBPQXV0aDFTZXJ2ZXJQcm9wZXJ0aWVzI0FDQ0VTU19UT0tFTl9VUkl9LgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIE9BdXRoMVNlcnZlckZlYXR1cmUgaW1wbGVtZW50cyBGZWF0dXJlIHsKKworICAgIHByaXZhdGUgZmluYWwgT0F1dGgxUHJvdmlkZXIgb0F1dGgxUHJvdmlkZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcmVxdWVzdFRva2VuVXJpOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGFjY2Vzc1Rva2VuVXJpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGZlYXR1cmUgY29uZmlndXJlZCB3aXRoIHtAbGluayBPQXV0aDFQcm92aWRlciBPQXV0aCBwcm92aWRlcn0gYW5kIHJlcXVlc3QgYW5kIGFjY2VzcyB0b2tlbgorICAgICAqIFVSSXMuIFRoZSBmZWF0dXJlIGFsc28gZXhwb3NlcyBSZXF1ZXN0IGFuZCBBY2Nlc3MgVG9rZW4gUmVzb3VyY2VzLgorICAgICAqIFRoZXNlIHJlc291cmNlcyBhcmUgcGFydCBvZiB0aGUgQXV0aG9yaXphdGlvbiBwcm9jZXNzIGFuZAorICAgICAqIGdyYW50IFJlcXVlc3QgYW5kIEFjY2VzcyB0b2tlbnMuIFJlc291cmNlcyB3aWxsIGJlIGF2YWlsYWJsZSBvbgorICAgICAqIFVSSXMgZGVmaW5lZCBieSBwYXJhbWV0ZXJzIHtAY29kZSByZXF1ZXN0VG9rZW5Vcml9IGFuZCB7QGNvZGUgYWNjZXNzVG9rZW5Vcml9LgorICAgICAqCisgICAgICogQHBhcmFtIG9BdXRoMVByb3ZpZGVyIEluc3RhbmNlIG9mIHRoZSB7QGNvZGUgT0F1dGgxUHJvdmlkZXJ9IHRoYXQgd2lsbCBoYW5kbGUgYXV0aG9yaXphdGlvbi4gSWYgdGhlIHZhbHVlIGlzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgIHtAY29kZSBudWxsfSwgdGhlbiB0aGUgcHJvdmlkZXIgbXVzdCBiZSByZWdpc3RlcmVkIGV4cGxpY2l0bHkgb3V0c2lkZSBvZiB0aGlzIGZlYXR1cmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgYXMgYSBzdGFuZGFyZCBwcm92aWRlci4KKyAgICAgKiBAcGFyYW0gcmVxdWVzdFRva2VuVXJpIFVSSSAocmVsYXRpdmUgdG8gYXBwbGljYXRpb24gY29udGV4dCBwYXRoKSBvZiBSZXF1ZXN0IFRva2VuIFJlc291cmNlIHRoYXQgd2lsbCBiZSBleHBvc2VkLgorICAgICAqIEBwYXJhbSBhY2Nlc3NUb2tlblVyaSBVUkkgKHJlbGF0aXZlIHRvIGFwcGxpY2F0aW9uIGNvbnRleHQgcGF0aCkgb2YgUmVxdWVzdCBUb2tlbiBSZXNvdXJjZSB0aGF0IHdpbGwgYmUgZXhwb3NlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgT0F1dGgxU2VydmVyRmVhdHVyZShPQXV0aDFQcm92aWRlciBvQXV0aDFQcm92aWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVxdWVzdFRva2VuVXJpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhY2Nlc3NUb2tlblVyaSkgeworICAgICAgICB0aGlzLm9BdXRoMVByb3ZpZGVyID0gb0F1dGgxUHJvdmlkZXI7CisgICAgICAgIHRoaXMucmVxdWVzdFRva2VuVXJpID0gcmVxdWVzdFRva2VuVXJpOworICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuVXJpID0gYWNjZXNzVG9rZW5Vcmk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGZlYXR1cmUgY29uZmlndXJlZCB3aXRoIHtAbGluayBPQXV0aDFQcm92aWRlciBPQXV0aCBwcm92aWRlcn0uIFRoZSBmZWF0dXJlIHdpbGwgbm90CisgICAgICogZXhwb3NlIFJlcXVlc3QgYW5kIEFjY2VzcyBUb2tlbiBSZXNvdXJjZXMuIFRoZSBPQXV0aCAxIHN1cHBvcnQgd2lsbCBub3QgYmUgcmVzcG9uc2libGUgZm9yIGhhbmRsaW5nCisgICAgICogdGhlc2UgYXV0aG9yaXphdGlvbiByZXF1ZXN0IHR5cGVzLgorICAgICAqCisgICAgICogQHBhcmFtIG9BdXRoMVByb3ZpZGVyIEluc3RhbmNlIG9mIHRoZSB7QGNvZGUgT0F1dGgxUHJvdmlkZXJ9IHRoYXQgd2lsbCBoYW5kbGUgYXV0aG9yaXphdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgT0F1dGgxU2VydmVyRmVhdHVyZShPQXV0aDFQcm92aWRlciBvQXV0aDFQcm92aWRlcikgeworICAgICAgICB0aGlzKG9BdXRoMVByb3ZpZGVyLCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgZmVhdHVyZS4gVGhlIGZlYXR1cmUgd2lsbCBub3QgcmVnaXN0ZXIgYW55IHtAbGluayBPQXV0aDFQcm92aWRlciBPQXV0aCBwcm92aWRlcn0KKyAgICAgKiBhbmQgaXQgd2lsbCBub3QgZXhwb3NlIFJlcXVlc3QgYW5kIEFjY2VzcyBUb2tlbiBSZXNvdXJjZXMuIHtAY29kZSBPQXV0aDFQcm92aWRlcn0gbXVzdCBiZSByZWdpc3RlcmVkCisgICAgICogZXhwbGljaXRseSBhcyBhIHN0YW5kYXJkIHByb3ZpZGVyLiBBcyBUb2tlbiBSZXNvdXJjZXMgYXJlIG5vdCBleHBvc2VkLCB0aGUgT0F1dGggMSBzdXBwb3J0IHdpbGwKKyAgICAgKiBub3QgYmUgcmVzcG9uc2libGUgZm9yIGhhbmRsaW5nIFRva2VuIFJlcXVlc3RzLgorICAgICAqLworICAgIHB1YmxpYyBPQXV0aDFTZXJ2ZXJGZWF0dXJlKCkgeworICAgICAgICB0aGlzKG51bGwpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZShGZWF0dXJlQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGlmIChvQXV0aDFQcm92aWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKG9BdXRoMVByb3ZpZGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoT0F1dGgxU2VydmVyRmlsdGVyLmNsYXNzKTsKKworICAgICAgICBpZiAoIWNvbnRleHQuZ2V0Q29uZmlndXJhdGlvbigpLmlzUmVnaXN0ZXJlZChPQXV0aDFTaWduYXR1cmVGZWF0dXJlLmNsYXNzKSkgeworICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihPQXV0aDFTaWduYXR1cmVGZWF0dXJlLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IGNvbnRleHQuZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnRpZXMoKTsKKyAgICAgICAgZmluYWwgQm9vbGVhbiBwcm9wZXJ0eVJlc291cmNlRW5hYmxlZCA9IE9BdXRoMVNlcnZlclByb3BlcnRpZXMuZ2V0VmFsdWUocHJvcGVydGllcywKKyAgICAgICAgICAgICAgICBPQXV0aDFTZXJ2ZXJQcm9wZXJ0aWVzLkVOQUJMRV9UT0tFTl9SRVNPVVJDRVMsIG51bGwsIEJvb2xlYW4uY2xhc3MpOworCisgICAgICAgIGJvb2xlYW4gcmVnaXN0ZXJSZXNvdXJjZXMgPSBwcm9wZXJ0eVJlc291cmNlRW5hYmxlZCAhPSBudWxsCisgICAgICAgICAgICAgICAgPyBwcm9wZXJ0eVJlc291cmNlRW5hYmxlZCA6IHJlcXVlc3RUb2tlblVyaSAhPSBudWxsICYgYWNjZXNzVG9rZW5VcmkgIT0gbnVsbDsKKworICAgICAgICBpZiAocmVnaXN0ZXJSZXNvdXJjZXMpIHsKKyAgICAgICAgICAgIFN0cmluZyByZXF1ZXN0VXJpID0gT0F1dGgxU2VydmVyUHJvcGVydGllcy5nZXRWYWx1ZShwcm9wZXJ0aWVzLCBPQXV0aDFTZXJ2ZXJQcm9wZXJ0aWVzLlJFUVVFU1RfVE9LRU5fVVJJLAorICAgICAgICAgICAgICAgICAgICBudWxsLCBTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgaWYgKHJlcXVlc3RVcmkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJlcXVlc3RVcmkgPSByZXF1ZXN0VG9rZW5VcmkgPT0gbnVsbCA/ICJyZXF1ZXN0VG9rZW4iIDogcmVxdWVzdFRva2VuVXJpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBTdHJpbmcgYWNjZXNzVXJpID0gT0F1dGgxU2VydmVyUHJvcGVydGllcy5nZXRWYWx1ZShwcm9wZXJ0aWVzLCBPQXV0aDFTZXJ2ZXJQcm9wZXJ0aWVzLkFDQ0VTU19UT0tFTl9VUkksCisgICAgICAgICAgICAgICAgICAgIG51bGwsIFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICBpZiAoYWNjZXNzVXJpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhY2Nlc3NVcmkgPSBhY2Nlc3NUb2tlblVyaSA9PSBudWxsID8gImFjY2Vzc1Rva2VuIiA6IGFjY2Vzc1Rva2VuVXJpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZSByZXF1ZXN0UmVzb3VyY2UgPSBSZXNvdXJjZS5idWlsZGVyKFJlcXVlc3RUb2tlblJlc291cmNlLmNsYXNzKS5wYXRoKHJlcXVlc3RVcmkpLmJ1aWxkKCk7CisgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZSBhY2Nlc3NSZXNvdXJjZSA9IFJlc291cmNlLmJ1aWxkZXIoQWNjZXNzVG9rZW5SZXNvdXJjZS5jbGFzcykucGF0aChhY2Nlc3NVcmkpLmJ1aWxkKCk7CisKKyAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIobmV3IE9BdXRoTW9kZWxQcm9jZXNzb3IocmVxdWVzdFJlc291cmNlLCBhY2Nlc3NSZXNvdXJjZSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworCisgICAgQFByaW9yaXR5KDEwMCkKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBPQXV0aE1vZGVsUHJvY2Vzc29yIGltcGxlbWVudHMgTW9kZWxQcm9jZXNzb3IgeworICAgICAgICBwcml2YXRlIGZpbmFsIFJlc291cmNlW10gcmVzb3VyY2VzOworCisgICAgICAgIHByaXZhdGUgT0F1dGhNb2RlbFByb2Nlc3NvcihSZXNvdXJjZS4uLiByZXNvdXJjZXMpIHsKKyAgICAgICAgICAgIHRoaXMucmVzb3VyY2VzID0gcmVzb3VyY2VzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNvdXJjZU1vZGVsIHByb2Nlc3NSZXNvdXJjZU1vZGVsKFJlc291cmNlTW9kZWwgcmVzb3VyY2VNb2RlbCwgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7CisgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZU1vZGVsLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBSZXNvdXJjZU1vZGVsLkJ1aWxkZXIocmVzb3VyY2VNb2RlbCwgZmFsc2UpOworICAgICAgICAgICAgZm9yIChSZXNvdXJjZSByZXNvdXJjZSA6IHJlc291cmNlcykgeworICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkUmVzb3VyY2UocmVzb3VyY2UpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNvdXJjZU1vZGVsIHByb2Nlc3NTdWJSZXNvdXJjZShSZXNvdXJjZU1vZGVsIHN1YlJlc291cmNlTW9kZWwsIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIHN1YlJlc291cmNlTW9kZWw7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9vYXV0aDEtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL29hdXRoMS9PQXV0aDFTZXJ2ZXJGaWx0ZXIuamF2YSBiL3NlY3VyaXR5L29hdXRoMS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvb2F1dGgxL09BdXRoMVNlcnZlckZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNTE1ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9vYXV0aDEtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL29hdXRoMS9PQXV0aDFTZXJ2ZXJGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDI1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIub2F1dGgxOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcmlvcml0aWVzOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJpb3JpdHk7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlByb3BlcnRpZXNIZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkub2F1dGgxLnNpZ25hdHVyZS5PQXV0aDFQYXJhbWV0ZXJzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9hdXRoMS5zaWduYXR1cmUuT0F1dGgxU2VjcmV0czsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5vYXV0aDEuc2lnbmF0dXJlLk9BdXRoMVNpZ25hdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5vYXV0aDEuc2lnbmF0dXJlLk9BdXRoMVNpZ25hdHVyZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuRXh0ZW5kZWRVcmlJbmZvOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5vYXV0aDEuaW50ZXJuYWwuT0F1dGhTZXJ2ZXJSZXF1ZXN0OworCisvKioKKyAqIE9BdXRoIHJlcXVlc3QgZmlsdGVyIHRoYXQgZmlsdGVycyBhbGwgcmVxdWVzdHMgaW5kaWNhdGluZyBpbiB0aGUgQXV0aG9yaXphdGlvbgorICogaGVhZGVyIHRoZXkgdXNlIE9BdXRoLiBDaGVja3MgaWYgdGhlIGluY29taW5nIHJlcXVlc3RzIGFyZSBwcm9wZXJseSBhdXRoZW50aWNhdGVkCisgKiBhbmQgcG9wdWxhdGVzIHRoZSBzZWN1cml0eSBjb250ZXh0IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgdXNlciBwcmluY2lwYWwgYW5kIHJvbGVzLgorICogPHA+CisgKgorICogQGF1dGhvciBQYXVsIEMuIEJyeWFuIDxwYnJ5YW5Ac3VuLmNvbT4KKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitAUHJpb3JpdHkoUHJpb3JpdGllcy5BVVRIRU5USUNBVElPTikKK2NsYXNzIE9BdXRoMVNlcnZlckZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIgeworCisgICAgLyoqIE9BdXRoIFNlcnZlciAqLworICAgIEBJbmplY3QKKyAgICBwcml2YXRlIE9BdXRoMVByb3ZpZGVyIHByb3ZpZGVyOworCisgICAgLyoqIE1hbmFnZXMgYW5kIHZhbGlkYXRlcyBpbmNvbWluZyBub25jZXMuICovCisgICAgcHJpdmF0ZSBmaW5hbCBOb25jZU1hbmFnZXIgbm9uY2VzOworCisgICAgLyoqIFZhbHVlIHRvIHJldHVybiBpbiB3d3ctYXV0aGVudGljYXRlIGhlYWRlciB3aGVuIDQwMSByZXNwb25zZSByZXR1cm5lZC4gKi8KKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB3d3dBdXRoZW50aWNhdGVIZWFkZXI7CisKKyAgICAvKiogT0F1dGggcHJvdG9jb2wgdmVyc2lvbnMgdGhhdCBhcmUgc3VwcG9ydGVkLiAqLworICAgIHByaXZhdGUgZmluYWwgU2V0PFN0cmluZz4gdmVyc2lvbnM7CisKKyAgICAvKiogUmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4gZm9yIHBhdGggdG8gaWdub3JlLiAqLworICAgIHByaXZhdGUgZmluYWwgUGF0dGVybiBpZ25vcmVQYXRoUGF0dGVybjsKKworICAgIEBJbmplY3QKKyAgICBwcml2YXRlIE9BdXRoMVNpZ25hdHVyZSBvQXV0aDFTaWduYXR1cmU7CisKKyAgICBASW5qZWN0CisgICAgcHJpdmF0ZSBQcm92aWRlcjxFeHRlbmRlZFVyaUluZm8+IHVyaUluZm87CisKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gb3B0aW9uYWw7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgZmlsdGVyLgorICAgICAqIEBwYXJhbSByYyBSZXNvdXJjZSBjb25maWcuCisgICAgICovCisgICAgQEluamVjdAorICAgIHB1YmxpYyBPQXV0aDFTZXJ2ZXJGaWx0ZXIoQ29uZmlndXJhdGlvbiByYykgeworICAgICAgICAvLyBlc3RhYmxpc2ggc3VwcG9ydGVkIE9BdXRoIHByb3RvY29sIHZlcnNpb25zCisgICAgICAgIEhhc2hTZXQ8U3RyaW5nPiB2ID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOworICAgICAgICB2LmFkZChudWxsKTsKKyAgICAgICAgdi5hZGQoIjEuMCIpOworICAgICAgICB2ZXJzaW9ucyA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldCh2KTsKKworICAgICAgICAvLyBvcHRpb25hbCBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzIChkZWZhdWx0ZWQpCisgICAgICAgIFN0cmluZyByZWFsbSA9IE9BdXRoMVNlcnZlclByb3BlcnRpZXMuZ2V0VmFsdWUocmMuZ2V0UHJvcGVydGllcygpLCBPQXV0aDFTZXJ2ZXJQcm9wZXJ0aWVzLlJFQUxNLCAiZGVmYXVsdCIsIFN0cmluZy5jbGFzcyk7CisgICAgICAgIC8qIE1heGltdW0gYWdlIChpbiBtaWxsaXNlY29uZHMpIG9mIHRpbWVzdGFtcCB0byBhY2NlcHQgaW4gaW5jb21pbmcgbWVzc2FnZXMuICovCisgICAgICAgIGludCBtYXhBZ2UgPSBPQXV0aDFTZXJ2ZXJQcm9wZXJ0aWVzLmdldFZhbHVlKHJjLmdldFByb3BlcnRpZXMoKSwgT0F1dGgxU2VydmVyUHJvcGVydGllcy5NQVhfQUdFLCAzMDAwMDApOworICAgICAgICAvKiBBdmVyYWdlIHJlcXVlc3RzIHRvIHByb2Nlc3MgYmV0d2VlbiBub25jZSBnYXJiYWdlIGNvbGxlY3Rpb24gcGFzc2VzLiAqLworICAgICAgICBpbnQgZ2NQZXJpb2QgPSBPQXV0aDFTZXJ2ZXJQcm9wZXJ0aWVzLmdldFZhbHVlKHJjLmdldFByb3BlcnRpZXMoKSwgT0F1dGgxU2VydmVyUHJvcGVydGllcy5HQ19QRVJJT0QsIDEwMCk7CisgICAgICAgIGlnbm9yZVBhdGhQYXR0ZXJuID0gcGF0dGVybigKKyAgICAgICAgICAgICAgICBPQXV0aDFTZXJ2ZXJQcm9wZXJ0aWVzLmdldFZhbHVlKHJjLmdldFByb3BlcnRpZXMoKSwgT0F1dGgxU2VydmVyUHJvcGVydGllcy5JR05PUkVfUEFUSF9QQVRURVJOLAorICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgU3RyaW5nLmNsYXNzKSk7IC8vIG5vIHBhdHRlcm4KKyAgICAgICAgb3B0aW9uYWwgPSBQcm9wZXJ0aWVzSGVscGVyLmlzUHJvcGVydHkocmMuZ2V0UHJvcGVydGllcygpLCBPQXV0aDFTZXJ2ZXJQcm9wZXJ0aWVzLk5PX0ZBSUwpOworCisgICAgICAgIGZpbmFsIFN0cmluZyB0aW1lVW5pdFN0ciA9IE9BdXRoMVNlcnZlclByb3BlcnRpZXMuZ2V0VmFsdWUocmMuZ2V0UHJvcGVydGllcygpLCBPQXV0aDFTZXJ2ZXJQcm9wZXJ0aWVzLlRJTUVTVEFNUF9VTklULAorICAgICAgICAgICAgICAgIFN0cmluZy5jbGFzcyk7CisgICAgICAgIGZpbmFsIFRpbWVVbml0IHRpbWVVbml0ID0gdGltZVVuaXRTdHIgIT0gbnVsbCA/IFRpbWVVbml0LnZhbHVlT2YodGltZVVuaXRTdHIpIDogVGltZVVuaXQuU0VDT05EUzsKKworICAgICAgICBmaW5hbCBpbnQgbWF4Q2FjaGVTaXplID0gT0F1dGgxU2VydmVyUHJvcGVydGllcy5nZXRWYWx1ZShyYy5nZXRQcm9wZXJ0aWVzKCksIE9BdXRoMVNlcnZlclByb3BlcnRpZXMuTUFYX05PTkNFX0NBQ0hFX1NJWkUsCisgICAgICAgICAgICAgICAgMjAwMDAwMCk7CisKKyAgICAgICAgbm9uY2VzID0gbmV3IE5vbmNlTWFuYWdlcihtYXhBZ2UsIGdjUGVyaW9kLCB0aW1lVW5pdCwgbWF4Q2FjaGVTaXplKTsKKworICAgICAgICAvLyB3d3ctYXV0aGVudGljYXRlIGhlYWRlciBmb3IgdGhlIGxpZmUgb2YgdGhlIG9iamVjdAorICAgICAgICB3d3dBdXRoZW50aWNhdGVIZWFkZXIgPSAiT0F1dGggcmVhbG09XCIiICsgcmVhbG0gKyAiXCIiOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBkbyBub3QgZmlsdGVyIHJlcXVlc3RzIHRoYXQgZG8gbm90IHVzZSBPQXV0aCBhdXRoZW50aWNhdGlvbgorICAgICAgICBTdHJpbmcgYXV0aEhlYWRlciA9IHJlcXVlc3QuZ2V0SGVhZGVyU3RyaW5nKE9BdXRoMVBhcmFtZXRlcnMuQVVUSE9SSVpBVElPTl9IRUFERVIpOworICAgICAgICBpZiAoYXV0aEhlYWRlciA9PSBudWxsIHx8ICFhdXRoSGVhZGVyLnRvVXBwZXJDYXNlKCkuc3RhcnRzV2l0aChPQXV0aDFQYXJhbWV0ZXJzLlNDSEVNRS50b1VwcGVyQ2FzZSgpKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gZG8gbm90IGZpbHRlciByZXF1ZXN0cyB0aGF0IG1hdGNoZXMgdG8gYWNjZXNzIG9yIHRva2VuIHJlc291cmNlcworICAgICAgICBmaW5hbCBNZXRob2QgaGFuZGxpbmdNZXRob2QgPSB1cmlJbmZvLmdldCgpLmdldE1hdGNoZWRSZXNvdXJjZU1ldGhvZCgpLmdldEludm9jYWJsZSgpLmdldEhhbmRsaW5nTWV0aG9kKCk7CisgICAgICAgIGlmIChoYW5kbGluZ01ldGhvZC5pc0Fubm90YXRpb25QcmVzZW50KFRva2VuUmVzb3VyY2UuY2xhc3MpCisgICAgICAgICAgICAgICAgfHwgaGFuZGxpbmdNZXRob2QuZ2V0RGVjbGFyaW5nQ2xhc3MoKS5pc0Fubm90YXRpb25QcmVzZW50KFRva2VuUmVzb3VyY2UuY2xhc3MpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBkbyBub3QgZmlsdGVyIGlmIHRoZSByZXF1ZXN0IHBhdGggbWF0Y2hlcyBwYXR0ZXJuIHRvIGlnbm9yZQorICAgICAgICBpZiAobWF0Y2goaWdub3JlUGF0aFBhdHRlcm4sIHJlcXVlc3QuZ2V0VXJpSW5mbygpLmdldFBhdGgoKSkpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIE9BdXRoMVNlY3VyaXR5Q29udGV4dCBzYzsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNjID0gZ2V0U2VjdXJpdHlDb250ZXh0KHJlcXVlc3QpOworICAgICAgICB9IGNhdGNoIChPQXV0aDFFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKG9wdGlvbmFsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmVxdWVzdC5zZXRTZWN1cml0eUNvbnRleHQoc2MpOworICAgIH0KKworICAgIHByaXZhdGUgT0F1dGgxU2VjdXJpdHlDb250ZXh0IGdldFNlY3VyaXR5Q29udGV4dChDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0KSB0aHJvd3MgT0F1dGgxRXhjZXB0aW9uIHsKKyAgICAgICAgT0F1dGhTZXJ2ZXJSZXF1ZXN0IG9zciA9IG5ldyBPQXV0aFNlcnZlclJlcXVlc3QocmVxdWVzdCk7CisgICAgICAgIE9BdXRoMVBhcmFtZXRlcnMgcGFyYW1zID0gbmV3IE9BdXRoMVBhcmFtZXRlcnMoKS5yZWFkUmVxdWVzdChvc3IpOworCisgICAgICAgIC8vIGFwcGFyZW50bHkgbm90IHNpZ25lZCB3aXRoIGFueSBPQXV0aCBwYXJhbWV0ZXJzOyB1bmF1dGhvcml6ZWQKKyAgICAgICAgaWYgKHBhcmFtcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3VW5hdXRob3JpemVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBnZXQgcmVxdWlyZWQgT0F1dGggcGFyYW1ldGVycworICAgICAgICBTdHJpbmcgY29uc3VtZXJLZXkgPSByZXF1aXJlZE9BdXRoUGFyYW0ocGFyYW1zLmdldENvbnN1bWVyS2V5KCkpOworICAgICAgICBTdHJpbmcgdG9rZW4gPSBwYXJhbXMuZ2V0VG9rZW4oKTsKKyAgICAgICAgU3RyaW5nIHRpbWVzdGFtcCA9IHJlcXVpcmVkT0F1dGhQYXJhbShwYXJhbXMuZ2V0VGltZXN0YW1wKCkpOworICAgICAgICBTdHJpbmcgbm9uY2UgPSByZXF1aXJlZE9BdXRoUGFyYW0ocGFyYW1zLmdldE5vbmNlKCkpOworCisgICAgICAgIC8vIGVuZm9yY2Ugb3RoZXIgc3VwcG9ydGVkIGFuZCByZXF1aXJlZCBPQXV0aCBwYXJhbWV0ZXJzCisgICAgICAgIHJlcXVpcmVkT0F1dGhQYXJhbShwYXJhbXMuZ2V0U2lnbmF0dXJlKCkpOworICAgICAgICBzdXBwb3J0ZWRPQXV0aFBhcmFtKHBhcmFtcy5nZXRWZXJzaW9uKCksIHZlcnNpb25zKTsKKworICAgICAgICAvLyByZXRyaWV2ZSBzZWNyZXQgZm9yIGNvbnN1bWVyIGtleQorICAgICAgICBPQXV0aDFDb25zdW1lciBjb25zdW1lciA9IHByb3ZpZGVyLmdldENvbnN1bWVyKGNvbnN1bWVyS2V5KTsKKyAgICAgICAgaWYgKGNvbnN1bWVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ld1VuYXV0aG9yaXplZEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgT0F1dGgxU2VjcmV0cyBzZWNyZXRzID0gbmV3IE9BdXRoMVNlY3JldHMoKS5jb25zdW1lclNlY3JldChjb25zdW1lci5nZXRTZWNyZXQoKSk7CisgICAgICAgIE9BdXRoMVNlY3VyaXR5Q29udGV4dCBzYzsKKyAgICAgICAgU3RyaW5nIG5vbmNlS2V5OworCisgICAgICAgIGlmICh0b2tlbiA9PSBudWxsKSB7CisgICAgICAgICAgICBpZiAoY29uc3VtZXIuZ2V0UHJpbmNpcGFsKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ld1VuYXV0aG9yaXplZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbm9uY2VLZXkgPSAiYzoiICsgY29uc3VtZXJLZXk7CisgICAgICAgICAgICBzYyA9IG5ldyBPQXV0aDFTZWN1cml0eUNvbnRleHQoY29uc3VtZXIsIHJlcXVlc3QuZ2V0U2VjdXJpdHlDb250ZXh0KCkuaXNTZWN1cmUoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBPQXV0aDFUb2tlbiBhY2Nlc3NUb2tlbiA9IHByb3ZpZGVyLmdldEFjY2Vzc1Rva2VuKHRva2VuKTsKKyAgICAgICAgICAgIGlmIChhY2Nlc3NUb2tlbiA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3VW5hdXRob3JpemVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIE9BdXRoMUNvbnN1bWVyIGF0Q29uc3VtZXIgPSBhY2Nlc3NUb2tlbi5nZXRDb25zdW1lcigpOworICAgICAgICAgICAgaWYgKGF0Q29uc3VtZXIgPT0gbnVsbCB8fCAhY29uc3VtZXJLZXkuZXF1YWxzKGF0Q29uc3VtZXIuZ2V0S2V5KCkpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3VW5hdXRob3JpemVkRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG5vbmNlS2V5ID0gInQ6IiArIHRva2VuOworICAgICAgICAgICAgc2VjcmV0cy50b2tlblNlY3JldChhY2Nlc3NUb2tlbi5nZXRTZWNyZXQoKSk7CisgICAgICAgICAgICBzYyA9IG5ldyBPQXV0aDFTZWN1cml0eUNvbnRleHQoYWNjZXNzVG9rZW4sIHJlcXVlc3QuZ2V0U2VjdXJpdHlDb250ZXh0KCkuaXNTZWN1cmUoKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXZlcmlmeVNpZ25hdHVyZShvc3IsIHBhcmFtcywgc2VjcmV0cykpIHsKKyAgICAgICAgICAgIHRocm93IG5ld1VuYXV0aG9yaXplZEV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFub25jZXMudmVyaWZ5KG5vbmNlS2V5LCB0aW1lc3RhbXAsIG5vbmNlKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3VW5hdXRob3JpemVkRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gc2M7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHJlcXVpcmVkT0F1dGhQYXJhbShTdHJpbmcgdmFsdWUpIHRocm93cyBPQXV0aDFFeGNlcHRpb24geworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3QmFkUmVxdWVzdEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc3VwcG9ydGVkT0F1dGhQYXJhbShTdHJpbmcgdmFsdWUsIFNldDxTdHJpbmc+IHNldCkgdGhyb3dzIE9BdXRoMUV4Y2VwdGlvbiB7CisgICAgICAgIGlmICghc2V0LmNvbnRhaW5zKHZhbHVlKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3QmFkUmVxdWVzdEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBQYXR0ZXJuIHBhdHRlcm4oU3RyaW5nIHApIHsKKyAgICAgICAgaWYgKHAgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFBhdHRlcm4uY29tcGlsZShwKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIG1hdGNoKFBhdHRlcm4gcGF0dGVybiwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHJldHVybiAocGF0dGVybiAhPSBudWxsICYmIHZhbHVlICE9IG51bGwgJiYgcGF0dGVybi5tYXRjaGVyKHZhbHVlKS5tYXRjaGVzKCkpOworICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiB2ZXJpZnlTaWduYXR1cmUoT0F1dGhTZXJ2ZXJSZXF1ZXN0IG9zciwgT0F1dGgxUGFyYW1ldGVycyBwYXJhbXMsIE9BdXRoMVNlY3JldHMgc2VjcmV0cykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIG9BdXRoMVNpZ25hdHVyZS52ZXJpZnkob3NyLCBwYXJhbXMsIHNlY3JldHMpOworICAgICAgICB9IGNhdGNoIChPQXV0aDFTaWduYXR1cmVFeGNlcHRpb24gb3NlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXdCYWRSZXF1ZXN0RXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBPQXV0aDFFeGNlcHRpb24gbmV3QmFkUmVxdWVzdEV4Y2VwdGlvbigpIHRocm93cyBPQXV0aDFFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IE9BdXRoMUV4Y2VwdGlvbihSZXNwb25zZS5TdGF0dXMuQkFEX1JFUVVFU1QsIG51bGwpOworICAgIH0KKworICAgIHByaXZhdGUgT0F1dGgxRXhjZXB0aW9uIG5ld1VuYXV0aG9yaXplZEV4Y2VwdGlvbigpIHRocm93cyBPQXV0aDFFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IE9BdXRoMUV4Y2VwdGlvbihSZXNwb25zZS5TdGF0dXMuVU5BVVRIT1JJWkVELCB3d3dBdXRoZW50aWNhdGVIZWFkZXIpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvb2F1dGgxLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9vYXV0aDEvT0F1dGgxU2VydmVyUHJvcGVydGllcy5qYXZhIGIvc2VjdXJpdHkvb2F1dGgxLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9vYXV0aDEvT0F1dGgxU2VydmVyUHJvcGVydGllcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZGIyZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9vYXV0aDEtc2VydmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL29hdXRoMS9PQXV0aDFTZXJ2ZXJQcm9wZXJ0aWVzLmphdmEKQEAgLTAsMCArMSwyNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm9hdXRoMTsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlByb3BlcnRpZXNDbGFzczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlByb3BlcnRpZXNIZWxwZXI7CisKKy8qKgorICogUHJvcGVydGllcyB1c2VkIHRvIGNvbmZpZ3VyZSBPQXV0aCBzZXJ2ZXIgbW9kdWxlLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworQFByb3BlcnRpZXNDbGFzcworcHVibGljIGZpbmFsIGNsYXNzIE9BdXRoMVNlcnZlclByb3BlcnRpZXMgeworICAgIC8qKgorICAgICAqIE9BdXRoIHJlYWxtIChTdHJpbmcgcHJvcGVydHkpLgorICAgICAqCisgICAgICogPHA+CisgICAgICogQSBkZWZhdWx0IHZhbHVlIGlzIHtAY29kZSAnZGVmYXVsdCd9LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDx0dD57QHZhbHVlfTwvdHQ+LgorICAgICAqIDwvcD4KKyAgICAgKiovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBTE0gPSAiamVyc2V5LmNvbmZpZy5zZXJ2ZXIub2F1dGgxLnJlYWxtIjsKKworCisgICAgLyoqCisgICAgICogUHJvcGVydHkgdGhhdCBjYW4gYmUgc2V0IHRvIGEgcmVndWxhciBleHByZXNzaW9uIHVzZWQgdG8gbWF0Y2ggdGhlIHBhdGggKHJlbGF0aXZlIHRvIHRoZSBiYXNlIFVSSSkgdGhpcworICAgICAqIGZpbHRlciBzaG91bGQgbm90IGJlIGFwcGxpZWQgdG8uCisgICAgICogPHA+CisgICAgICogQSBkZWZhdWx0IHZhbHVlIGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKiA8L3A+CisgICAgICoqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIElHTk9SRV9QQVRIX1BBVFRFUk4gPSAiamVyc2V5LmNvbmZpZy5zZXJ2ZXIub2F1dGgxLmlnbm9yZVBhdGhQYXR0ZXJuIjsKKworICAgIC8qKgorICAgICAqIFByb3BlcnR5IGRlZmluZXMgbWF4aW11bSBhZ2UgKGluIG1pbGxpc2Vjb25kcykgb2Ygbm9uY2VzIHRoYXQgc2hvdWxkIGJlIHRyYWNrZWQgKGRlZmF1bHQgPSAzMDAwMDAgbXMgPSA1IG1pbikuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBBIGRlZmF1bHQgdmFsdWUgaXMge0Bjb2RlIDMwMDAwMH0gd2hpY2ggY29ycmVzcG9uZHMgdG8gNSBtaW51dGVzLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIDxwPgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDx0dD57QHZhbHVlfTwvdHQ+LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVhfQUdFID0gImplcnNleS5jb25maWcuc2VydmVyLm9hdXRoMS5tYXhBZ2UiOworCisKKyAgICAvKioKKyAgICAgKiBQcm9wZXJ0eSB0aGF0IGNhbiBiZSBzZXQgdG8gZnJlcXVlbmN5IG9mIGNvbGxlY3Rpbmcgbm9uY2VzIGV4Y2VlZGluZyBtYXguIGFnZSAoZGVmYXVsdCA9IDEwMCA9IGV2ZXJ5IDEwMCByZXF1ZXN0cykuCisgICAgICoKKyAgICAgKiovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgR0NfUEVSSU9EID0gImplcnNleS5jb25maWcuc2VydmVyLm9hdXRoMS5nY1BlcmlvZCI7CisKKworICAgIC8qKgorICAgICAqIFVuaXQgb2Yge0Bjb2RlIG9hdXRoX3RpbWVzdGFtcH0gYXR0cmlidXRlIHVzZWQgaW4gYXV0aG9yaXphdGlvbiBoZWFkZXJzLiBUaGUgdmFsdWUgbXVzdCBiZSBvbmUgb2YgdGhlCisgICAgICogZW51bSB2YWx1ZXMgb2Yge0BsaW5rIGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0fSAoZS5nLiB7QGNvZGUgU0VDT05EU30sCisgICAgICoge0Bjb2RlIE1JTExJU0VDT05EU30sIHtAY29kZSBNSU5VVEVTfSkuCisgICAgICogPHA+CisgICAgICogQSBkZWZhdWx0IHZhbHVlIGlzIHtAY29kZSBTRUNPTkRTfS4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElNRVNUQU1QX1VOSVQgPSAiamVyc2V5LmNvbmZpZy5zZXJ2ZXIub2F1dGgxLnRpbWVzdGFtcC51bml0IjsKKworCisgICAgLyoqCisgICAgICogRGVmaW5lcyBtYXhpbXVtIG51bWJlciBvZiBub25jZXMgdGhhdCBjYW4gYmUgc3RvcmVkIGluIHRoZSBub25jZSBjYWNoZS4gSWYgbW9yZSBub25jZXMgd2lsbCBiZSB1c2VkLAorICAgICAqIHRoZSBjYWNoZSB3aWxsIG5vdCBzdG9yZSBhbnkgb3RoZXIgbm9uY2UgYW5kIHJlcXVlc3RzIHdpbGwgYmUgcmVmdXNlZC4gTm90ZSB0aGF0IGNhY2hlIGlzIGF1dG9tYXRpY2FsbHkKKyAgICAgKiBjbGVhbmVkIGFzIGl0IGtlZXBzIG9ubHkgbm9uY2VzIGRlbGl2ZXJlZCB3aXRoIHRpbWVzdGFtcCB3aXRoaW5nIHRoZSB7QGxpbmsgI01BWF9BR0V9IHBlcmlvZC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIHNldHRpbmcgaXMgdXNlZCB0byBsaW1pdCB0aGUgbWF4aW11bSBzaXplIG9mIGludGVybmFsIGNhY2hlIGFuZCB0aGFua3MgdG8gdGhpcworICAgICAqIGl0IHByZXZlbnRzIGV4aGF1c3Rpbmcgb2YgbWVtb3J5IGFuZCBmYWlsaW5nIG9mIHRoZSBzZXJ2ZXIuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhlIHZhbHVlIG11c3QgYmUgYSBsb25nLgorICAgICAqIDwvcD4KKworICAgICAqIDxwPgorICAgICAqIEEgZGVmYXVsdCB2YWx1ZSBpcyB7QGNvZGUgMjAwMDAwMH0uCisgICAgICogPC9wPgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaXMgPHR0PntAdmFsdWV9PC90dD4uCisgICAgICogPC9wPgorICAgICAqCisgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVhfTk9OQ0VfQ0FDSEVfU0laRSA9ICJqZXJzZXkuY29uZmlnLnNlcnZlci5vYXV0aDEubWF4Lm5vbmNlLnNpemUiOworCisgICAgLyoqCisgICAgICogSWYgc2V0IHRvIHtAY29kZSB0cnVlfSBtYWtlcyB0aGUgY29ycmVjdCBPQXV0aCBhdXRoZW50aWNhdGlvbiBvcHRpb25hbC4KKyAgICAgKiBJbnN0ZWFkIG9mIHJldHVybmluZyB0aGUgYXBwcm9wcmlhdGUgc3RhdHVzIGNvZGUKKyAgICAgKiAoe0BsaW5rIGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2UuU3RhdHVzI0JBRF9SRVFVRVNUfQorICAgICAqIG9yIHtAbGluayBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlLlN0YXR1cyNVTkFVVEhPUklaRUR9KSB0aGUge0BsaW5rIE9BdXRoMVNlcnZlckZpbHRlciBPQXV0aCBmaWx0ZXJ9CisgICAgICogd2lsbCBpZ25vcmUgdGhpcyByZXF1ZXN0IChhcyBpZiBpdCB3YXMgbm90IGF1dGhlbnRpY2F0ZWQpIGFuZCBsZXQgdGhlIHdlYiBhcHBsaWNhdGlvbiBkZWFsIHdpdGggaXQuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBBIGRlZmF1bHQgdmFsdWUgaXMge0Bjb2RlIGZhbHNlfS4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKiA8L3A+CisgICAgICogKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT19GQUlMID0gImplcnNleS5jb25maWcuc2VydmVyLm9hdXRoMS5ub0ZhaWwiOworCisgICAgLyoqCisgICAgICogSWYgc2V0IHRvIHtAY29kZSB0cnVlfSwgdG9rZW4gcmVzb3VyY2VzIHdpbGwgYmUgZXhwb3NlZC4gVG9rZW4gcmVzb3VyY2VzIGFyZSBKQVgtUlMgcmVzb3VyY2VzCisgICAgICogZm9yIHJldHJpZXZpbmcgUmVxdWVzdCBUb2tlbnMgYW5kIEFjY2VzcyBUb2tlbnMuIElmIHRoZSBwcm9wZXJ0eSBpcyBzZXQgdG8ge0Bjb2RlIGZhbHNlfSwKKyAgICAgKiB0aGUgcmVzb3VyY2VzIHdpbGwgbm90IGJlIGV4cG9zZWQgYW5kIGl0IGlzIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSB1c2VyIGN1c3RvbSByZXNvdXJjZSB0byBpc3N1ZQorICAgICAqIFJlcXVlc3QgVG9rZW5zIGFuZCBBY2Nlc3MgVG9rZW5zLgorICAgICAqIDxwPgorICAgICAqIFVSSXMgb2YgZXhwb3NlZCByZXNvdXJjZXMgY2FuIGJlIHNwZWNpZmllZCBieSB7QGxpbmsgI1JFUVVFU1RfVE9LRU5fVVJJfSBhbmQge0BsaW5rICNBQ0NFU1NfVE9LRU5fVVJJfS4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBBIGRlZmF1bHQgdmFsdWUgaXMge0Bjb2RlIHRydWV9LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5BQkxFX1RPS0VOX1JFU09VUkNFUyA9ICJqZXJzZXkuY29uZmlnLnNlcnZlci5vYXV0aDEucmVzb3VyY2UuZW5hYmxlZCI7CisKKyAgICAvKioKKyAgICAgKiBJZiBleHBvc3VyZSBvZiB0b2tlbiByZXNvdXJjZXMgaXMgZW5hYmxlZCAoZS5nLiBieSB0aGUgcHJvcGVydHkge0BsaW5rICNFTkFCTEVfVE9LRU5fUkVTT1VSQ0VTfSksCisgICAgICogdGhpcyBwcm9wZXJ0eSBkZWZpbmVzIHRoZSByZWxhdGl2ZSBVUkkgb2YgZXhwb3NlZCBSZXF1ZXN0IFRva2VuIFJlc291cmNlLiBUaGUgVVJJIG11c3QgYmUgcmVsYXRpdmUKKyAgICAgKiB0byB0aGUgYmFzZSBVUkkgb2YgdGhlIEpBWC1SUyBhcHBsaWNhdGlvbi4KKyAgICAgKiA8cC8+CisgICAgICogUmVxdWVzdCBUb2tlbiByZXNvdXJjZSBpcyB0aGUgcmVzb3VyY2Ugd2hpY2ggaXNzdWVzIGEgUmVxdWVzdCBUb2tlbiBhbmQgUmVxdWVzdCBUb2tlbiBzZWNyZXQKKyAgICAgKiBkdXJpbmcgdGhlIEF1dGhvcml6YXRpb24gcHJvY2VzcyAodGVtcG9yYXJ5IGNyZWRlbnRpYWxzIElEcykuCisgICAgICoKKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgcHJvcGVydHkgaXMgdW5kZWZpbmVkIGJ5IGRlZmF1bHQuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDx0dD57QHZhbHVlfTwvdHQ+LgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVRVNUX1RPS0VOX1VSSSA9ICJqZXJzZXkuY29uZmlnLnNlcnZlci5vYXV0aDEucmVzb3VyY2UucmVxdWVzdFRva2VuLnVyaSI7CisKKyAgICAvKioKKyAgICAgKiBJZiBleHBvc3VyZSBvZiB0b2tlbiByZXNvdXJjZXMgaXMgZW5hYmxlZCAoZS5nLiBieSB0aGUgcHJvcGVydHkge0BsaW5rICNFTkFCTEVfVE9LRU5fUkVTT1VSQ0VTfSksCisgICAgICogdGhpcyBwcm9wZXJ0eSBkZWZpbmVzIHRoZSByZWxhdGl2ZSBVUkkgb2YgZXhwb3NlZCBBY2Nlc3MgVG9rZW4gUmVzb3VyY2UuIFRoZSBVUkkgbXVzdCBiZSByZWxhdGl2ZQorICAgICAqIHRvIHRoZSBiYXNlIFVSSSBvZiB0aGUgSkFYLVJTIGFwcGxpY2F0aW9uLgorICAgICAqIDxwLz4KKyAgICAgKiBBY2Nlc3MgVG9rZW4gcmVzb3VyY2UgaXMgdGhlIHJlc291cmNlIHdoaWNoIGlzc3VlcyBhIEFjY2VzcyBUb2tlbiBhbmQgQWNjZXNzIFRva2VuIHNlY3JldAorICAgICAqIGR1cmluZyB0aGUgQXV0aG9yaXphdGlvbiBwcm9jZXNzLgorICAgICAqCisgICAgICogPHA+CisgICAgICogVGhlIHByb3BlcnR5IGlzIHVuZGVmaW5lZCBieSBkZWZhdWx0LgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNDRVNTX1RPS0VOX1VSSSA9ICJqZXJzZXkuY29uZmlnLnNlcnZlci5vYXV0aDEucmVzb3VyY2UuYWNjZXNzVG9rZW4udXJpIjsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIElmIHRoZSBwcm9wZXJ0eSBpcyBub3Qgc2V0IG9yIHRoZSByZWFsIHZhbHVlIHR5cGUgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlIHR5cGUsCisgICAgICogcmV0dXJucyB7QGNvZGUgbnVsbH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvcGVydGllcyAgICBNYXAgb2YgcHJvcGVydGllcyB0byBnZXQgdGhlIHByb3BlcnR5IHZhbHVlIGZyb20uCisgICAgICogQHBhcmFtIGtleSAgTmFtZSBvZiB0aGUgcHJvcGVydHkuCisgICAgICogQHBhcmFtIHR5cGUgICAgICAgICAgVHlwZSB0byByZXRyaWV2ZSB0aGUgdmFsdWUgYXMuCisgICAgICogQHBhcmFtIDxUPiAgICAgICAgICAgVHlwZSBvZiB0aGUgcHJvcGVydHkgdmFsdWUuCisgICAgICogQHJldHVybiAgICAgICAgICAgICAgVmFsdWUgb2YgdGhlIHByb3BlcnR5IG9yIHtAY29kZSBudWxsfS4KKyAgICAgKgorICAgICAqIEBzaW5jZSAyLjgKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUPiBUIGdldFZhbHVlKE1hcDxTdHJpbmcsID8+IHByb3BlcnRpZXMsIFN0cmluZyBrZXksIENsYXNzPFQ+IHR5cGUpIHsKKyAgICAgICAgcmV0dXJuIFByb3BlcnRpZXNIZWxwZXIuZ2V0VmFsdWUocHJvcGVydGllcywga2V5LCB0eXBlLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBJZiB0aGUgcHJvcGVydHkgaXMgbm90IHNldCBvciB0aGUgcmVhbCB2YWx1ZSB0eXBlIGlzIG5vdCBjb21wYXRpYmxlIHdpdGgge0Bjb2RlIGRlZmF1bHRWYWx1ZX0gdHlwZSwKKyAgICAgKiB0aGUgc3BlY2lmaWVkIHtAY29kZSBkZWZhdWx0VmFsdWV9IGlzIHJldHVybmVkLiBDYWxsaW5nIHRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZworICAgICAqIHtAY29kZSBPQXV0aDFTZXJ2ZXJQcm9wZXJ0aWVzLmdldFZhbHVlKHByb3BlcnRpZXMsIGtleSwgZGVmYXVsdFZhbHVlLCAoQ2xhc3M8VD4pIGRlZmF1bHRWYWx1ZS5nZXRDbGFzcygpKX0KKyAgICAgKgorICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzICAgIE1hcCBvZiBwcm9wZXJ0aWVzIHRvIGdldCB0aGUgcHJvcGVydHkgdmFsdWUgZnJvbS4KKyAgICAgKiBAcGFyYW0ga2V5ICBOYW1lIG9mIHRoZSBwcm9wZXJ0eS4KKyAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlICBEZWZhdWx0IHZhbHVlIGlmIHByb3BlcnR5IGlzIG5vdCByZWdpc3RlcmVkCisgICAgICogQHBhcmFtIDxUPiAgICAgICAgICAgVHlwZSBvZiB0aGUgcHJvcGVydHkgdmFsdWUuCisgICAgICogQHJldHVybiAgICAgICAgICAgICAgVmFsdWUgb2YgdGhlIHByb3BlcnR5IG9yIHtAY29kZSBudWxsfS4KKyAgICAgKgorICAgICAqIEBzaW5jZSAyLjgKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIDxUPiBUIGdldFZhbHVlKE1hcDxTdHJpbmcsID8+IHByb3BlcnRpZXMsIFN0cmluZyBrZXksIFQgZGVmYXVsdFZhbHVlKSB7CisgICAgICAgIHJldHVybiBQcm9wZXJ0aWVzSGVscGVyLmdldFZhbHVlKHByb3BlcnRpZXMsIGtleSwgZGVmYXVsdFZhbHVlLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBJZiB0aGUgcHJvcGVydHkgaXMgbm90IHNldCBvciB0aGUgcmVhbCB2YWx1ZSB0eXBlIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZSB0eXBlLAorICAgICAqIHJldHVybnMge0Bjb2RlIGRlZmF1bHRWYWx1ZX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvcGVydGllcyAgICBNYXAgb2YgcHJvcGVydGllcyB0byBnZXQgdGhlIHByb3BlcnR5IHZhbHVlIGZyb20uCisgICAgICogQHBhcmFtIGtleSAgTmFtZSBvZiB0aGUgcHJvcGVydHkuCisgICAgICogQHBhcmFtIGRlZmF1bHRWYWx1ZSAgRGVmYXVsdCB2YWx1ZSBpZiBwcm9wZXJ0eSBpcyBub3QgcmVnaXN0ZXJlZAorICAgICAqIEBwYXJhbSB0eXBlICAgICAgICAgIFR5cGUgdG8gcmV0cmlldmUgdGhlIHZhbHVlIGFzLgorICAgICAqIEBwYXJhbSA8VD4gICAgICAgICAgIFR5cGUgb2YgdGhlIHByb3BlcnR5IHZhbHVlLgorICAgICAqIEByZXR1cm4gICAgICAgICAgICAgIFZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBvciB7QGNvZGUgbnVsbH0uCisgICAgICoKKyAgICAgKiBAc2luY2UgMi44CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8VD4gVCBnZXRWYWx1ZShNYXA8U3RyaW5nLCA/PiBwcm9wZXJ0aWVzLCBTdHJpbmcga2V5LCBUIGRlZmF1bHRWYWx1ZSwgQ2xhc3M8VD4gdHlwZSkgeworICAgICAgICByZXR1cm4gUHJvcGVydGllc0hlbHBlci5nZXRWYWx1ZShwcm9wZXJ0aWVzLCBrZXksIGRlZmF1bHRWYWx1ZSwgdHlwZSwgbnVsbCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvb2F1dGgxLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9vYXV0aDEvT0F1dGgxVG9rZW4uamF2YSBiL3NlY3VyaXR5L29hdXRoMS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvb2F1dGgxL09BdXRoMVRva2VuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcwYjJmNwotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L29hdXRoMS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvb2F1dGgxL09BdXRoMVRva2VuLmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIub2F1dGgxOworCitpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworCisvKiogSW50ZXJmYWNlIHJlcHJlc2VudGluZyBhbiBPQXV0aCB0b2tlbiAoaS5lLiBhY2Nlc3MgdG9rZW4gb3IgcmVxdWVzdCB0b2tlbikuCisgKgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgT0F1dGgxVG9rZW4geworICAgIC8qKiBSZXR1cm5zIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIHRva2VuLgorICAgICAqCisgICAgICogQHJldHVybiBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSB0b2tlbgorICAgICAqLworICAgIFN0cmluZyBnZXRUb2tlbigpOworCisgICAgLyoqIFJldHVybnMgdGhlIHRva2VuIHNlY3JldC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdG9rZW4gc2VjcmV0CisgICAgICovCisgICAgU3RyaW5nIGdldFNlY3JldCgpOworCisgICAgLyoqIFJldHVybnMgY29uc3VtZXIgdGhpcyB0b2tlbiB3YXMgaXNzdWVkIGZvci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gY29uc3VtZXIgdGhpcyB0b2tlbiB3YXMgaXNzdWVkIGZvci4KKyAgICAgKi8KKyAgICBPQXV0aDFDb25zdW1lciBnZXRDb25zdW1lcigpOworCisgICAgLyoqIFJldHVybnMgYWRkaXRpb25hbCBjdXN0b20gYXR0cmlidXRlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHRva2VuLgorICAgICAqIElmIHRoaXMgaXMgYSByZXF1ZXN0IHRva2VuLCB0aGlzIHNob3VsZCBiZSBhIHRoZSBzYW1lIHNldCBvciBhIGRlZmluZWQKKyAgICAgKiBzdWJzZXQgb2YgcGFyYW1ldGVycyB0aGF0IHdlcmUgcGFzc2VkIHRvIHRoZSB7QGxpbmsgT0F1dGgxUHJvdmlkZXIjbmV3UmVxdWVzdFRva2VuKFN0cmluZywgU3RyaW5nLCBqYXZhLnV0aWwuTWFwKX0KKyAgICAgKiBtZXRob2QgdGhhdCBjcmVhdGVkIHRoaXMgcmVxdWVzdCB0b2tlbi4gSWYgdGhpcyBpcyBhbiBhY2Nlc3MgdG9rZW4sCisgICAgICogdGhpcyBpcyBhbnkgYXBwbGljYXRpb24gZGVmaW5lZCBzZXQgdGhhdCB3aWxsIGluY2x1ZGVkIGFzIGZvcm0gcGFyYW1ldGVycworICAgICAqIGluIGEgcmVzcG9uc2UgdG8gYWNjZXNzVG9rZW4gcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gaW1tdXRhYmxlIG1hcCBvZiBjdXN0b20gYXR0cmlidXRlcworICAgICAqLworICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBnZXRBdHRyaWJ1dGVzKCk7CisKKyAgICAvKiogUmV0dXJucyBhIHtAbGluayBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbH0gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlCisgICAgICogdXNlciB0aGUgcmVxdWVzdCBjb250YWluaW5nIHRoaXMgdG9rZW4gaXMgYXV0aG9yaXplZCB0byBhY3Qgb24gYmVoYWxmIG9mLgorICAgICAqIFdoZW4gdGhlIG9hdXRoIGZpbHRlciB2ZXJpZmllcyB0aGUgcmVxdWVzdAorICAgICAqIHdpdGggdGhpcyB0b2tlbiBpcyBwcm9wZXJseSBhdXRoZW50aWNhdGVkLCBpdCBpbmplY3RzIHRoaXMgdG9rZW4gaW50byBhIHNlY3VyaXR5IGNvbnRleHQKKyAgICAgKiB3aGljaCB0aGVuIGRlbGVnYXRlcyB7QGxpbmsgamF2YXgud3MucnMuY29yZS5TZWN1cml0eUNvbnRleHQjZ2V0VXNlclByaW5jaXBhbCgpfSB0byB0aGlzCisgICAgICogbWV0aG9kLgorICAgICAqCisgICAgICogQHJldHVybiBQcmluY2lwYWwgY29ycmVzcG9uZGluZyB0byB0aGlzIHRva2VuLCBvciBudWxsIGlmIHRoZSB0b2tlbiBpcyBub3QgYXV0aG9yaXplZAorICAgICAqLworICAgIFByaW5jaXBhbCBnZXRQcmluY2lwYWwoKTsKKworICAgIC8qKiBSZXR1cm5zIGEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyB0b2tlbiBpcyBhdXRob3JpemVkIGZvciB0aGUKKyAgICAgKiBzcGVjaWZpZWQgbG9naWNhbCAicm9sZSIuIFdoZW4gdGhlIG9hdXRoIGZpbHRlciB2ZXJpZmllcyB0aGUgcmVxdWVzdAorICAgICAqIHdpdGggdGhpcyB0b2tlbiBpcyBwcm9wZXJseSBhdXRoZW50aWNhdGVkLCBpdCBpbmplY3RzIHRoaXMgdG9rZW4gaW50byBhIHNlY3VyaXR5IGNvbnRleHQKKyAgICAgKiB3aGljaCB0aGVuIGRlbGVnYXRlcyB7QGxpbmsgamF2YXgud3MucnMuY29yZS5TZWN1cml0eUNvbnRleHQjaXNVc2VySW5Sb2xlKFN0cmluZyl9IHRvIHRoaXMKKyAgICAgKiBtZXRob2QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcm9sZSBhIHtAY29kZSBTdHJpbmd9IHNwZWNpZnlpbmcgdGhlIG5hbWUgb2YgdGhlIHJvbGUKKyAgICAgKgorICAgICAqIEByZXR1cm4gYSB7QGNvZGUgYm9vbGVhbn0gaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgdG9rZW4gaXMgYXV0aG9yaXplZCBmb3IKKyAgICAgKiBhIGdpdmVuIHJvbGUKKyAgICAgKi8KKyAgICBib29sZWFuIGlzSW5Sb2xlKFN0cmluZyByb2xlKTsKK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L29hdXRoMS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvb2F1dGgxL1Rva2VuUmVzb3VyY2UuamF2YSBiL3NlY3VyaXR5L29hdXRoMS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvb2F1dGgxL1Rva2VuUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGMzN2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvb2F1dGgxLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9vYXV0aDEvVG9rZW5SZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm9hdXRoMTsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCisvKioKKyAqIEFubm90YXRpb24gdG8gYmUgcGxhY2VkIG9uIHJlc291cmNlIGNsYXNzZXMgb3IgcmVzb3VyY2UgbWV0aG9kcworICogdGhhdCBzaG91bGQgYmUgaWdub3JlZCBieSB7QGxpbmsgT0F1dGgxU2VydmVyRmlsdGVyIE9BdXRoIHNlcnZlciBmaWx0ZXJ9LgorICogRmlsdGVyIHdpbGwgbm90IHBlcmZvcm0gYXV0aGVudGljYXRpb24gYW5kIGF1dGhvcml6YXRpb24gY2hlY2sgZm9yIHJlc291cmNlcyB3aXRoIHRoaXMgYW5ub3RhdGlvbiBhbmQgd2lsbAorICogbGVhdmUgdGhlIHtAbGluayBqYXZheC53cy5ycy5jb3JlLlNlY3VyaXR5Q29udGV4dH0gdW5jaGFuZ2VkLiBUaGlzIGFubm90YXRpb24gaXMgaW50ZW5kZWQgdG8gYmUgcGxhY2VkCisgKiBvbiByZXNvdXJjZSBwcm92aWRpbmcgUmVxdWVzdCBhbmQgQWNjZXNzIFRva2VuIGR1cmluZyBBdXRob3JpemF0aW9uIHByb2Nlc3MuCisgKiA8cC8+CisgKiBUaGUgYW5ub3RhdGlvbiBjYW4gYmUgcGxhY2VkIG9uIGEgcmVzb3VyY2UgbWV0aG9kIGRpcmVjdGx5IG9yIHJlc291cmNlIGNsYXNzLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworQFRhcmdldCh7RWxlbWVudFR5cGUuVFlQRSwgRWxlbWVudFR5cGUuTUVUSE9EfSkKK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitwdWJsaWMgQGludGVyZmFjZSBUb2tlblJlc291cmNlIHsKK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L29hdXRoMS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvb2F1dGgxL2ludGVybmFsL0FjY2Vzc1Rva2VuUmVzb3VyY2UuamF2YSBiL3NlY3VyaXR5L29hdXRoMS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvb2F1dGgxL2ludGVybmFsL0FjY2Vzc1Rva2VuUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzFmNjcwCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvb2F1dGgxLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9vYXV0aDEvaW50ZXJuYWwvQWNjZXNzVG9rZW5SZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5vYXV0aDEuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRm9ybTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlcXVlc3Q7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9hdXRoMS5zaWduYXR1cmUuT0F1dGgxUGFyYW1ldGVyczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5vYXV0aDEuc2lnbmF0dXJlLk9BdXRoMVNlY3JldHM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkub2F1dGgxLnNpZ25hdHVyZS5PQXV0aDFTaWduYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkub2F1dGgxLnNpZ25hdHVyZS5PQXV0aDFTaWduYXR1cmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm9hdXRoMS5PQXV0aDFDb25zdW1lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIub2F1dGgxLk9BdXRoMUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIub2F1dGgxLk9BdXRoMVByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5vYXV0aDEuT0F1dGgxVG9rZW47CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm9hdXRoMS5Ub2tlblJlc291cmNlOworCisKKy8qKgorICogUmVzb3VyY2UgaGFuZGxpbmcgYWNjZXNzIHRva2VuIHJlcXVlc3RzLgorICoKKyAqIEBhdXRob3IgSHViZXJ0IEEuIExlIFZhbiBHb25nIDxodWJlcnQubGV2YW5nb25nIGF0IFN1bi5DT00+CisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworCitAUGF0aCgiL2FjY2Vzc1Rva2VuIikKK3B1YmxpYyBjbGFzcyBBY2Nlc3NUb2tlblJlc291cmNlIHsKKyAgICBASW5qZWN0CisgICAgcHJpdmF0ZSBPQXV0aDFQcm92aWRlciBwcm92aWRlcjsKKworICAgIEBJbmplY3QKKyAgICBwcml2YXRlIE9BdXRoMVNpZ25hdHVyZSBvQXV0aDFTaWduYXR1cmU7CisKKyAgICAvKioKKyAgICAgKiBQT1NUIG1ldGhvZCBmb3IgY3JlYXRpbmcgYSByZXF1ZXN0IGZvciBSZXF1ZXN0IFRva2VuLgorICAgICAqIEByZXR1cm4gYW4gSFRUUCByZXNwb25zZSB3aXRoIGNvbnRlbnQgb2YgdGhlIHVwZGF0ZWQgb3IgY3JlYXRlZCByZXNvdXJjZS4KKyAgICAgKi8KKyAgICBAUE9TVAorICAgIEBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fRk9STV9VUkxFTkNPREVEKQorICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fRk9STV9VUkxFTkNPREVEKQorICAgIEBUb2tlblJlc291cmNlCisgICAgcHVibGljIFJlc3BvbnNlIHBvc3RBY2Nlc3NUb2tlblJlcXVlc3QoQENvbnRleHQgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsIEBDb250ZXh0IFJlcXVlc3QgcmVxKSB7CisgICAgICAgIGJvb2xlYW4gc2lnSXNPayA9IGZhbHNlOworICAgICAgICBPQXV0aFNlcnZlclJlcXVlc3QgcmVxdWVzdCA9IG5ldyBPQXV0aFNlcnZlclJlcXVlc3QocmVxdWVzdENvbnRleHQpOworICAgICAgICBPQXV0aDFQYXJhbWV0ZXJzIHBhcmFtcyA9IG5ldyBPQXV0aDFQYXJhbWV0ZXJzKCk7CisgICAgICAgIHBhcmFtcy5yZWFkUmVxdWVzdChyZXF1ZXN0KTsKKworICAgICAgICBpZiAocGFyYW1zLmdldFRva2VuKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKG5ldyBUaHJvd2FibGUoIm9hdXRoX3Rva2VuIE1VU1QgYmUgcHJlc2VudC4iKSwgNDAwKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBjb25zS2V5ID0gcGFyYW1zLmdldENvbnN1bWVyS2V5KCk7CisgICAgICAgIGlmIChjb25zS2V5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBPQXV0aDFFeGNlcHRpb24oUmVzcG9uc2UuU3RhdHVzLkJBRF9SRVFVRVNULCBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIE9BdXRoMVRva2VuIHJ0ID0gcHJvdmlkZXIuZ2V0UmVxdWVzdFRva2VuKHBhcmFtcy5nZXRUb2tlbigpKTsKKyAgICAgICAgaWYgKHJ0ID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIHRva2VuIGludmFsaWQKKyAgICAgICAgICAgIHRocm93IG5ldyBPQXV0aDFFeGNlcHRpb24oUmVzcG9uc2UuU3RhdHVzLkJBRF9SRVFVRVNULCBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIE9BdXRoMUNvbnN1bWVyIGNvbnN1bWVyID0gcnQuZ2V0Q29uc3VtZXIoKTsKKyAgICAgICAgaWYgKGNvbnN1bWVyID09IG51bGwgfHwgIWNvbnNLZXkuZXF1YWxzKGNvbnN1bWVyLmdldEtleSgpKSkgeworICAgICAgICAgICAgLy8gdG9rZW4gaW52YWxpZAorICAgICAgICAgICAgdGhyb3cgbmV3IE9BdXRoMUV4Y2VwdGlvbihSZXNwb25zZS5TdGF0dXMuQkFEX1JFUVVFU1QsIG51bGwpOworCisgICAgICAgIH0KKworICAgICAgICBPQXV0aDFTZWNyZXRzIHNlY3JldHMgPSBuZXcgT0F1dGgxU2VjcmV0cygpLmNvbnN1bWVyU2VjcmV0KGNvbnN1bWVyLmdldFNlY3JldCgpKS50b2tlblNlY3JldChydC5nZXRTZWNyZXQoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzaWdJc09rID0gb0F1dGgxU2lnbmF0dXJlLnZlcmlmeShyZXF1ZXN0LCBwYXJhbXMsIHNlY3JldHMpOworICAgICAgICB9IGNhdGNoIChPQXV0aDFTaWduYXR1cmVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoQWNjZXNzVG9rZW5SZXNvdXJjZS5jbGFzcy5nZXROYW1lKCkpLmxvZyhMZXZlbC5TRVZFUkUsIG51bGwsIGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghc2lnSXNPaykgeworICAgICAgICAgICAgLy8gc2lnbmF0dXJlIGludmFsaWQKKyAgICAgICAgICAgIHRocm93IG5ldyBPQXV0aDFFeGNlcHRpb24oUmVzcG9uc2UuU3RhdHVzLkJBRF9SRVFVRVNULCBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFdlJ3JlIGdvb2QgdG8gZ28uCisgICAgICAgIE9BdXRoMVRva2VuIGF0ID0gcHJvdmlkZXIubmV3QWNjZXNzVG9rZW4ocnQsIHBhcmFtcy5nZXRWZXJpZmllcigpKTsKKworICAgICAgICBpZiAoYXQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE9BdXRoMUV4Y2VwdGlvbihSZXNwb25zZS5TdGF0dXMuQkFEX1JFUVVFU1QsIG51bGwpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUHJlcGFyaW5nIHRoZSByZXNwb25zZS4KKyAgICAgICAgRm9ybSByZXNwID0gbmV3IEZvcm0oKTsKKyAgICAgICAgcmVzcC5wYXJhbShPQXV0aDFQYXJhbWV0ZXJzLlRPS0VOLCBhdC5nZXRUb2tlbigpKTsKKyAgICAgICAgcmVzcC5wYXJhbShPQXV0aDFQYXJhbWV0ZXJzLlRPS0VOX1NFQ1JFVCwgYXQuZ2V0U2VjcmV0KCkpOworICAgICAgICByZXNwLmFzTWFwKCkucHV0QWxsKGF0LmdldEF0dHJpYnV0ZXMoKSk7CisgICAgICAgIHJldHVybiBSZXNwb25zZS5vayhyZXNwKS5idWlsZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L29hdXRoMS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvb2F1dGgxL2ludGVybmFsL09BdXRoU2VydmVyUmVxdWVzdC5qYXZhIGIvc2VjdXJpdHkvb2F1dGgxLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9vYXV0aDEvaW50ZXJuYWwvT0F1dGhTZXJ2ZXJSZXF1ZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ4MDk1YQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L29hdXRoMS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvb2F1dGgxL2ludGVybmFsL09BdXRoU2VydmVyUmVxdWVzdC5qYXZhCkBAIC0wLDAgKzEsMTM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5vYXV0aDEuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRm9ybTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5NZWRpYVR5cGVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5WYWx1ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uVmFsdWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9hdXRoMS5zaWduYXR1cmUuT0F1dGgxUmVxdWVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdDsKKworLyoqCisgKiBXcmFwcyBhIEplcnNleSB7QGxpbmsgQ29udGFpbmVyUmVxdWVzdENvbnRleHR9IG9iamVjdCwgaW1wbGVtZW50aW5nIHRoZQorICogT0F1dGggc2lnbmF0dXJlIGxpYnJhcnkge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9hdXRoMS5zaWduYXR1cmUuT0F1dGgxUmVxdWVzdH0gaW50ZXJmYWNlLgorICoKKyAqIEBhdXRob3IgSHViZXJ0IEEuIExlIFZhbiBHb25nIDxodWJlcnQubGV2YW5nb25nIGF0IFN1bi5DT00+CisgKiBAYXV0aG9yIFBhdWwgQy4gQnJ5YW4gPHBicnlhbkBzdW4uY29tPgorICovCitwdWJsaWMgY2xhc3MgT0F1dGhTZXJ2ZXJSZXF1ZXN0IGltcGxlbWVudHMgT0F1dGgxUmVxdWVzdCB7CisKKyAgICBwcml2YXRlIGZpbmFsIENvbnRhaW5lclJlcXVlc3RDb250ZXh0IGNvbnRleHQ7CisKKyAgICBwcml2YXRlIHN0YXRpYyBTZXQ8U3RyaW5nPiBFTVBUWV9TRVQgPSBDb2xsZWN0aW9ucy5lbXB0eVNldCgpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IEVNUFRZX0xJU1QgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICBwcml2YXRlIGZpbmFsIFZhbHVlPE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPj4gZm9ybVBhcmFtcyA9IFZhbHVlcy5sYXp5KAorICAgICAgICAgICAgbmV3IFZhbHVlPE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPj4oKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBnZXQoKSB7CisgICAgICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbXMgPSBudWxsOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlID0gY29udGV4dC5nZXRNZWRpYVR5cGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lZGlhVHlwZSAhPSBudWxsICYmIE1lZGlhVHlwZXMudHlwZUVxdWFsKG1lZGlhVHlwZSwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0ZPUk1fVVJMRU5DT0RFRF9UWVBFKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29udGFpbmVyUmVxdWVzdCBqZXJzZXlSZXF1ZXN0ID0gKENvbnRhaW5lclJlcXVlc3QpIGNvbnRleHQ7CisgICAgICAgICAgICAgICAgICAgICAgICBqZXJzZXlSZXF1ZXN0LmJ1ZmZlckVudGl0eSgpOworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRm9ybSBmb3JtID0gamVyc2V5UmVxdWVzdC5yZWFkRW50aXR5KEZvcm0uY2xhc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0gZm9ybS5hc01hcCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYXJhbXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCBDb250YWluZXIgcmVxdWVzdCBjb250ZXh0LgorICAgICAqLworICAgIHB1YmxpYyBPQXV0aFNlcnZlclJlcXVlc3QoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgY29udGV4dCkgeworICAgICAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdE1ldGhvZCgpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0TWV0aG9kKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFVSTCBnZXRSZXF1ZXN0VVJMKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0VXJpSW5mbygpLmdldFJlcXVlc3RVcmkoKS50b1VSTCgpOworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoT0F1dGhTZXJ2ZXJSZXF1ZXN0LmNsYXNzLmdldE5hbWUoKSkubG9nKExldmVsLlNFVkVSRSwgbnVsbCwgZXgpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTZXQ8U3RyaW5nPiBrZXlzKE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBtdm0pIHsKKyAgICAgICAgaWYgKG12bSA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gRU1QVFlfU0VUOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtdm0ua2V5U2V0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IHZhbHVlcyhNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gbXZtLCBTdHJpbmcga2V5KSB7CisgICAgICAgIGlmIChtdm0gPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIEVNUFRZX0xJU1Q7CisgICAgICAgIH0KKyAgICAgICAgTGlzdDxTdHJpbmc+IHYgPSBtdm0uZ2V0KGtleSk7CisgICAgICAgIGlmICh2ID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBFTVBUWV9MSVNUOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRQYXJhbWV0ZXJOYW1lcygpIHsKKyAgICAgICAgSGFzaFNldDxTdHJpbmc+IG4gPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7CisgICAgICAgIG4uYWRkQWxsKGtleXMoY29udGV4dC5nZXRVcmlJbmZvKCkuZ2V0UXVlcnlQYXJhbWV0ZXJzKCkpKTsKKyAgICAgICAgbi5hZGRBbGwoa2V5cyhmb3JtUGFyYW1zLmdldCgpKSk7CisKKyAgICAgICAgcmV0dXJuIG47CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRQYXJhbWV0ZXJWYWx1ZXMoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gdiA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICB2LmFkZEFsbCh2YWx1ZXMoY29udGV4dC5nZXRVcmlJbmZvKCkuZ2V0UXVlcnlQYXJhbWV0ZXJzKCksIG5hbWUpKTsKKyAgICAgICAgdi5hZGRBbGwodmFsdWVzKGZvcm1QYXJhbXMuZ2V0KCksIG5hbWUpKTsKKyAgICAgICAgcmV0dXJuIHY7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRIZWFkZXJWYWx1ZXMoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0SGVhZGVycygpLmdldChuYW1lKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhZGRIZWFkZXJWYWx1ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTW9kaWZ5aW5nIE9BdXRoU2VydmVyUmVxdWVzdCB1bnN1cHBvcnRlZCIpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvb2F1dGgxLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9vYXV0aDEvaW50ZXJuYWwvUmVxdWVzdFRva2VuUmVzb3VyY2UuamF2YSBiL3NlY3VyaXR5L29hdXRoMS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvb2F1dGgxL2ludGVybmFsL1JlcXVlc3RUb2tlblJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNmOTkxYwotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L29hdXRoMS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvb2F1dGgxL2ludGVybmFsL1JlcXVlc3RUb2tlblJlc291cmNlLmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm9hdXRoMS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZvcm07CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZEhhc2hNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkub2F1dGgxLnNpZ25hdHVyZS5PQXV0aDFQYXJhbWV0ZXJzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9hdXRoMS5zaWduYXR1cmUuT0F1dGgxU2lnbmF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9hdXRoMS5zaWduYXR1cmUuT0F1dGgxU2lnbmF0dXJlRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9hdXRoMS5zaWduYXR1cmUuT0F1dGgxU2VjcmV0czsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIub2F1dGgxLk9BdXRoMUNvbnN1bWVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5vYXV0aDEuT0F1dGgxRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5vYXV0aDEuT0F1dGgxUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm9hdXRoMS5PQXV0aDFUb2tlbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIub2F1dGgxLlRva2VuUmVzb3VyY2U7CisKKy8qKgorICogUmVzb3VyY2UgaGFuZGxpbmcgcmVxdWVzdCB0b2tlbiByZXF1ZXN0cy4KKyAqCisgKiBAYXV0aG9yIEh1YmVydCBBLiBMZSBWYW4gR29uZyA8aHViZXJ0LmxldmFuZ29uZyBhdCBTdW4uQ09NPgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KKworQFBhdGgoIi9yZXF1ZXN0VG9rZW4iKQorcHVibGljIGNsYXNzIFJlcXVlc3RUb2tlblJlc291cmNlIHsKKyAgICBASW5qZWN0CisgICAgcHJpdmF0ZSBPQXV0aDFQcm92aWRlciBwcm92aWRlcjsKKworICAgIEBJbmplY3QKKyAgICBwcml2YXRlIENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0OworCisgICAgQEluamVjdAorICAgIHByaXZhdGUgT0F1dGgxU2lnbmF0dXJlIG9BdXRoMVNpZ25hdHVyZTsKKworICAgIC8qKgorICAgICAqIFBPU1QgbWV0aG9kIGZvciBjcmVhdGluZyBhIHJlcXVlc3QgZm9yIGEgUmVxdWVzdCBUb2tlbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYW4gSFRUUCByZXNwb25zZSB3aXRoIGNvbnRlbnQgb2YgdGhlIHVwZGF0ZWQgb3IgY3JlYXRlZCByZXNvdXJjZS4KKyAgICAgKi8KKyAgICBAUE9TVAorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpCisgICAgQFRva2VuUmVzb3VyY2UKKyAgICBwdWJsaWMgUmVzcG9uc2UgcG9zdFJlcVRva2VuUmVxdWVzdCgpIHsKKyAgICAgICAgT0F1dGhTZXJ2ZXJSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgT0F1dGhTZXJ2ZXJSZXF1ZXN0KHJlcXVlc3RDb250ZXh0KTsKKyAgICAgICAgT0F1dGgxUGFyYW1ldGVycyBwYXJhbXMgPSBuZXcgT0F1dGgxUGFyYW1ldGVycygpOworICAgICAgICBwYXJhbXMucmVhZFJlcXVlc3QocmVxdWVzdCk7CisKKyAgICAgICAgU3RyaW5nIHRvayA9IHBhcmFtcy5nZXRUb2tlbigpOworICAgICAgICBpZiAoKHRvayAhPSBudWxsKSAmJiAoIXRvay5jb250ZW50RXF1YWxzKCIiKSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBPQXV0aDFFeGNlcHRpb24oUmVzcG9uc2UuU3RhdHVzLkJBRF9SRVFVRVNULCBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBjb25zS2V5ID0gcGFyYW1zLmdldENvbnN1bWVyS2V5KCk7CisgICAgICAgIGlmIChjb25zS2V5ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBPQXV0aDFFeGNlcHRpb24oUmVzcG9uc2UuU3RhdHVzLkJBRF9SRVFVRVNULCBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIE9BdXRoMUNvbnN1bWVyIGNvbnN1bWVyID0gcHJvdmlkZXIuZ2V0Q29uc3VtZXIoY29uc0tleSk7CisgICAgICAgIGlmIChjb25zdW1lciA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgT0F1dGgxRXhjZXB0aW9uKFJlc3BvbnNlLlN0YXR1cy5CQURfUkVRVUVTVCwgbnVsbCk7CisgICAgICAgIH0KKyAgICAgICAgT0F1dGgxU2VjcmV0cyBzZWNyZXRzID0gbmV3IE9BdXRoMVNlY3JldHMoKS5jb25zdW1lclNlY3JldChjb25zdW1lci5nZXRTZWNyZXQoKSkudG9rZW5TZWNyZXQoIiIpOworCisgICAgICAgIGJvb2xlYW4gc2lnSXNPayA9IGZhbHNlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2lnSXNPayA9IG9BdXRoMVNpZ25hdHVyZS52ZXJpZnkocmVxdWVzdCwgcGFyYW1zLCBzZWNyZXRzKTsKKyAgICAgICAgfSBjYXRjaCAoT0F1dGgxU2lnbmF0dXJlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKFJlcXVlc3RUb2tlblJlc291cmNlLmNsYXNzLmdldE5hbWUoKSkubG9nKExldmVsLlNFVkVSRSwgbnVsbCwgZXgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFzaWdJc09rKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgT0F1dGgxRXhjZXB0aW9uKFJlc3BvbnNlLlN0YXR1cy5CQURfUkVRVUVTVCwgbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1ldGVycyA9IG5ldyBNdWx0aXZhbHVlZEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgICAgIGZvciAoU3RyaW5nIG4gOiByZXF1ZXN0LmdldFBhcmFtZXRlck5hbWVzKCkpIHsKKyAgICAgICAgICAgIHBhcmFtZXRlcnMucHV0KG4sIHJlcXVlc3QuZ2V0UGFyYW1ldGVyVmFsdWVzKG4pKTsKKyAgICAgICAgfQorCisgICAgICAgIE9BdXRoMVRva2VuIHJ0ID0gcHJvdmlkZXIubmV3UmVxdWVzdFRva2VuKGNvbnNLZXksIHBhcmFtcy5nZXRDYWxsYmFjaygpLCBwYXJhbWV0ZXJzKTsKKworICAgICAgICBGb3JtIHJlc3AgPSBuZXcgRm9ybSgpOworICAgICAgICByZXNwLnBhcmFtKE9BdXRoMVBhcmFtZXRlcnMuVE9LRU4sIHJ0LmdldFRva2VuKCkpOworICAgICAgICByZXNwLnBhcmFtKE9BdXRoMVBhcmFtZXRlcnMuVE9LRU5fU0VDUkVULCBydC5nZXRTZWNyZXQoKSk7CisgICAgICAgIHJlc3AucGFyYW0oT0F1dGgxUGFyYW1ldGVycy5DQUxMQkFDS19DT05GSVJNRUQsICJ0cnVlIik7CisgICAgICAgIHJldHVybiBSZXNwb25zZS5vayhyZXNwKS5idWlsZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L29hdXRoMS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvb2F1dGgxL2ludGVybmFsL3BhY2thZ2UtaW5mby5qYXZhIGIvc2VjdXJpdHkvb2F1dGgxLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9vYXV0aDEvaW50ZXJuYWwvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJlNTgwMgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L29hdXRoMS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvb2F1dGgxL2ludGVybmFsL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKKy8qKgorICogSmVyc2V5IE9BdXRoIDEgU2VydmVyIGludGVybmFsIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuCisgKi8KK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm9hdXRoMS5pbnRlcm5hbDsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L29hdXRoMS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvb2F1dGgxL3BhY2thZ2UtaW5mby5qYXZhIGIvc2VjdXJpdHkvb2F1dGgxLXNlcnZlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9vYXV0aDEvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFiZGIzMgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L29hdXRoMS1zZXJ2ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvb2F1dGgxL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKKy8qKgorICogSmVyc2V5IE9BdXRoIDEgU2VydmVyIEFQSS4KKyAqLworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIub2F1dGgxOwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvb2F1dGgxLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9vYXV0aDEvTm9uY2VNYW5hZ2VyVGVzdC5qYXZhIGIvc2VjdXJpdHkvb2F1dGgxLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9vYXV0aDEvTm9uY2VNYW5hZ2VyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MDY5ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9vYXV0aDEtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL29hdXRoMS9Ob25jZU1hbmFnZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm9hdXRoMTsKKworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCisvKioKKyAqIEBhdXRob3IgVGhvbWFzIE1laXJlCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBOb25jZU1hbmFnZXJUZXN0IHsKKworICAgIHByaXZhdGUgU3RyaW5nIHN0YW1wKCkgeworICAgICAgICByZXR1cm4gc3RhbXAoMCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgc3RhbXAoaW50IG9mZnNldCkgeworICAgICAgICByZXR1cm4gTG9uZy50b1N0cmluZygoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLSBvZmZzZXQpIC8gMTAwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhwaXJlZE5vbmNlKCkgeworICAgICAgICBOb25jZU1hbmFnZXIgbm9uY2VzID0gbmV3IE5vbmNlTWFuYWdlcigxMDAwLCA1MCwgVGltZVVuaXQuU0VDT05EUywgMjAwMDAwMCk7CisKKyAgICAgICAgYm9vbGVhbiBhY2NlcHRlZCA9IG5vbmNlcy52ZXJpZnkoIm9sZC1ub25jZS1rZXkiLCBzdGFtcCgyMDAwKSwgIm9sZC1ub25jZSIpOworICAgICAgICBhc3NlcnRGYWxzZShhY2NlcHRlZCk7CisKKyAgICAgICAgbG9uZyBzaXplID0gbm9uY2VzLmNoZWNrQW5kR2V0U2l6ZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgc2l6ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWROb25jZSgpIHsKKyAgICAgICAgTm9uY2VNYW5hZ2VyIG5vbmNlcyA9IG5ldyBOb25jZU1hbmFnZXIoMTAwMCwgNTAsIFRpbWVVbml0LlNFQ09ORFMsIDIwMDAwMDApOworCisgICAgICAgIGJvb2xlYW4gYWNjZXB0ZWQgPSBub25jZXMudmVyaWZ5KCJub25jZS1rZXkiLCBzdGFtcCgpLCAibm9uY2UiKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShhY2NlcHRlZCk7CisKKyAgICAgICAgbG9uZyBzaXplID0gbm9uY2VzLmNoZWNrQW5kR2V0U2l6ZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgc2l6ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RHVwbGljYXRlTm9uY2UoKSB7CisgICAgICAgIE5vbmNlTWFuYWdlciBub25jZXMgPSBuZXcgTm9uY2VNYW5hZ2VyKDEwMDAsIDUwLCBUaW1lVW5pdC5TRUNPTkRTLCAyMDAwMDAwKTsKKworICAgICAgICBTdHJpbmcgc3RhbXAgPSBzdGFtcCgpOworCisgICAgICAgIGJvb2xlYW4gYWNjZXB0ZWQ7CisgICAgICAgIGFjY2VwdGVkID0gbm9uY2VzLnZlcmlmeSgibm9uY2Uta2V5Iiwgc3RhbXAsICJub25jZSIpOworICAgICAgICBhc3NlcnRUcnVlKGFjY2VwdGVkKTsKKworICAgICAgICBhY2NlcHRlZCA9IG5vbmNlcy52ZXJpZnkoIm5vbmNlLWtleSIsIHN0YW1wLCAibm9uY2UiKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoYWNjZXB0ZWQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEF1dG9HQygpIHsKKyAgICAgICAgTm9uY2VNYW5hZ2VyIG5vbmNlcyA9IG5ldyBOb25jZU1hbmFnZXIoMTAwMCwgMTAsIFRpbWVVbml0LlNFQ09ORFMsIDIwMDAwMDApOworCisgICAgICAgIC8vIHZlcmlmeSBuaW5lCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgOTsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG5vbmNlcy52ZXJpZnkoInRlc3RpbmctIiArIGksIHN0YW1wKCksIEludGVnZXIudG9TdHJpbmcoaSkpKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoOSwgbm9uY2VzLmNoZWNrQW5kR2V0U2l6ZSgpKTsKKworICAgICAgICAvLyBpbnZhbGlkIG5vbmNlcyBkb24ndCB0cmlnZ2VyIGdjJ3MKKyAgICAgICAgYXNzZXJ0RmFsc2Uobm9uY2VzLnZlcmlmeSgidGVzdGluZy05Iiwgc3RhbXAoMjAwMCksICI5IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoOSwgbm9uY2VzLmNoZWNrQW5kR2V0U2l6ZSgpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiQ2FuJ3QgZ3VhcmFudGVlIHdlIHNsZXB0IGxvbmcgZW5vdWdoLi4uIik7CisgICAgICAgIH0KKyAgICAgICAgLy8gMTB0aCB2YWxpZCBub25jZSB0cmlnZ2VycyBhIGdjIG9uIG9sZCB0b2tlbnMKKyAgICAgICAgYXNzZXJ0VHJ1ZShub25jZXMudmVyaWZ5KCJ0ZXN0aW5nLTEwIiwgc3RhbXAoKSwgIjEwIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbm9uY2VzLmNoZWNrQW5kR2V0U2l6ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYW51YWxHQygpIHsKKyAgICAgICAgTm9uY2VNYW5hZ2VyIG5vbmNlcyA9IG5ldyBOb25jZU1hbmFnZXIoMTAwMCwgNTAwMCwgVGltZVVuaXQuU0VDT05EUywgMjAwMDAwMCk7CisKKyAgICAgICAgLy8gaW5zZXJ0IDEwMCB2YWxpZCBub25jZXMKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykgeworICAgICAgICAgICAgbm9uY2VzLnZlcmlmeSgidGVzdGluZy0iICsgaSwgc3RhbXAoKSwgSW50ZWdlci50b1N0cmluZyhpKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEwMCwgbm9uY2VzLmNoZWNrQW5kR2V0U2l6ZSgpKTsKKworICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIGdjIGRvZXNuJ3QgY2xlYW4gdmFsaWQgbm9uY2VzCisgICAgICAgIG5vbmNlcy5nYyhTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxMDAsIG5vbmNlcy5jaGVja0FuZEdldFNpemUoKSk7CisKKyAgICAgICAgLy8gc2xlZXAgYSB3aGlsZSB0byBpbnZhbGlkYXRlIHRoZSBub25jZXMKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMTAwKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkNhbid0IGd1YXJhbnRlZSB3ZSBzbGVwdCBsb25nIGVub3VnaC4uLiIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gZ2Mgc2hvdWxkIHJlbW92ZSBhbGwgdGhlIG5vbmNlcworICAgICAgICBub25jZXMuZ2MoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbm9uY2VzLmNoZWNrQW5kR2V0U2l6ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGdXR1cmVUaW1lU3RhbXBzKCkgeworICAgICAgICBOb25jZU1hbmFnZXIgbm9uY2VzID0gbmV3IE5vbmNlTWFuYWdlcigxMDAwMCwgNTAwMCwgVGltZVVuaXQuU0VDT05EUywgMjAwMDAwMCk7CisgICAgICAgIGFzc2VydEZhbHNlKG5vbmNlcy52ZXJpZnkoImEiLCBzdGFtcCgtMjAwMDApLCAiMSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG5vbmNlcy5jaGVja0FuZEdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG5vbmNlcy52ZXJpZnkoImEiLCBzdGFtcCgtMTUwMDApLCAiMSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG5vbmNlcy5jaGVja0FuZEdldFNpemUoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG5vbmNlcy52ZXJpZnkoImEiLCBzdGFtcCgxNTAwMCksICIxIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbm9uY2VzLmNoZWNrQW5kR2V0U2l6ZSgpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHN0YW1wID0gc3RhbXAoLTEwMDApOworICAgICAgICBhc3NlcnRUcnVlKG5vbmNlcy52ZXJpZnkoImEiLCBzdGFtcCwgIjEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBub25jZXMuY2hlY2tBbmRHZXRTaXplKCkpOworICAgICAgICBhc3NlcnRGYWxzZShub25jZXMudmVyaWZ5KCJhIiwgc3RhbXAsICIxIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbm9uY2VzLmNoZWNrQW5kR2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShub25jZXMudmVyaWZ5KCJhIiwgc3RhbXAoLTIwMDEpLCAiMSIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG5vbmNlcy5jaGVja0FuZEdldFNpemUoKSk7CisgICAgICAgIGFzc2VydFRydWUobm9uY2VzLnZlcmlmeSgiYSIsIHN0YW1wKC0zMDAxKSwgIjEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBub25jZXMuY2hlY2tBbmRHZXRTaXplKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1heENhY2hlU2l6ZSgpIHsKKyAgICAgICAgLy8gaW5pdGlhbGl6YSBtYXggY2FjaGUgc2l6ZSB0byAzCisgICAgICAgIE5vbmNlTWFuYWdlciBub25jZXMgPSBuZXcgTm9uY2VNYW5hZ2VyKDEwMDAsIDUwMDAsIFRpbWVVbml0Lk1JTExJU0VDT05EUywgMyk7CisgICAgICAgIGFzc2VydFRydWUobm9uY2VzLnZlcmlmeSgiYSIsICIxMDAwIiwgIjEiLCAxMDAwKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBub25jZXMuY2hlY2tBbmRHZXRTaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKG5vbmNlcy52ZXJpZnkoImEiLCAiMTA1MCIsICIxIiwgMTAwMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbm9uY2VzLmNoZWNrQW5kR2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShub25jZXMudmVyaWZ5KCJhIiwgIjExMDAiLCAiMSIsIDEwMDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIG5vbmNlcy5jaGVja0FuZEdldFNpemUoKSk7CisKKyAgICAgICAgLy8gdGhpcyB3aWxsIG5vdCBmaXQgdG8gdGhlIGNhY2hlIChjYWNoZSBpcyBhbHJlYWR5IGZ1bGwpCisgICAgICAgIGFzc2VydEZhbHNlKG5vbmNlcy52ZXJpZnkoImEiLCAiNTAwIiwgIjEiLCAxMDAwKSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBub25jZXMuY2hlY2tBbmRHZXRTaXplKCkpOworCisgICAgICAgIC8vIG5vdyB0aW1lIGlzIDIxMDAsIHNvIHdlIGNsZWFyIHRoZSBjYWNoZSB2YWx1ZXMgbG93ZXIgdGhhbiAxMDYwCisgICAgICAgIGFzc2VydFRydWUobm9uY2VzLnZlcmlmeSgiYSIsICIyMDQwIiwgIjEiLCAyMDYwKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBub25jZXMuY2hlY2tBbmRHZXRTaXplKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVuaXRzKCkgeworICAgICAgICAvLyBpbml0aWFsaXplIG1heCBjYWNoZSBzaXplIHRvIDMKKyAgICAgICAgTm9uY2VNYW5hZ2VyIG5vbmNlcyA9IG5ldyBOb25jZU1hbmFnZXIoMjQwMDAwLCA1MDAwLCBUaW1lVW5pdC5NSU5VVEVTLCAzMCk7CisgICAgICAgIGFzc2VydFRydWUobm9uY2VzLnZlcmlmeSgiYSIsICIxIiwgIjEiLCA2MDAwMCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbm9uY2VzLmNoZWNrQW5kR2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2Uobm9uY2VzLnZlcmlmeSgiYSIsICIxIiwgIjEiLCA2MDAwMSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbm9uY2VzLmNoZWNrQW5kR2V0U2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShub25jZXMudmVyaWZ5KCJhIiwgIjIiLCAiMSIsIDEyMDAwMikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbm9uY2VzLmNoZWNrQW5kR2V0U2l6ZSgpKTsKKworICAgICAgICBhc3NlcnRUcnVlKG5vbmNlcy52ZXJpZnkoImEiLCAiMyIsICIxIiwgMTgwMDAzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBub25jZXMuY2hlY2tBbmRHZXRTaXplKCkpOworCisgICAgICAgIGFzc2VydEZhbHNlKG5vbmNlcy52ZXJpZnkoImEiLCAiMSIsICIxIiwgMzAwMDAwKSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBub25jZXMuY2hlY2tBbmRHZXRTaXplKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L29hdXRoMS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvb2F1dGgxL09BdXRoMUV4Y2VwdGlvblRlc3QuamF2YSBiL3NlY3VyaXR5L29hdXRoMS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvb2F1dGgxL09BdXRoMUV4Y2VwdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjdmODc0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvb2F1dGgxLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9vYXV0aDEvT0F1dGgxRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm9hdXRoMTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworCisvKioKKyAqIHtAbGluayBPQXV0aDFFeGNlcHRpb259IHVuaXQgdGVzdHMuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIE9BdXRoMUV4Y2VwdGlvblRlc3QgeworICAgIC8qKgorICAgICAqIFJlcHJvZHVjZXIgZm9yIEpFUlNFWS0yNDU3LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvbkdldHRlcnMoKSB7CisgICAgICAgIE9BdXRoMUV4Y2VwdGlvbiBleGNlcHRpb247CisKKyAgICAgICAgZXhjZXB0aW9uID0gbmV3IE9BdXRoMUV4Y2VwdGlvbihSZXNwb25zZS5TdGF0dXMuQkFEX1JFUVVFU1QsIG51bGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmVzcG9uc2UuU3RhdHVzLkJBRF9SRVFVRVNULCBleGNlcHRpb24uZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmVzcG9uc2UuU3RhdHVzLkJBRF9SRVFVRVNULmdldFN0YXR1c0NvZGUoKSwgZXhjZXB0aW9uLmdldFJlc3BvbnNlKCkuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnROdWxsKGV4Y2VwdGlvbi5nZXRXd3dBdXRoSGVhZGVyKCkpOworICAgICAgICBhc3NlcnROdWxsKGV4Y2VwdGlvbi5nZXRSZXNwb25zZSgpLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5XV1dfQVVUSEVOVElDQVRFKSk7CisKKworICAgICAgICBleGNlcHRpb24gPSBuZXcgT0F1dGgxRXhjZXB0aW9uKFJlc3BvbnNlLlN0YXR1cy5JTlRFUk5BTF9TRVJWRVJfRVJST1IsICJ0ZXN0QXV0aCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmVzcG9uc2UuU3RhdHVzLklOVEVSTkFMX1NFUlZFUl9FUlJPUiwgZXhjZXB0aW9uLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJlc3BvbnNlLlN0YXR1cy5JTlRFUk5BTF9TRVJWRVJfRVJST1IuZ2V0U3RhdHVzQ29kZSgpLCBleGNlcHRpb24uZ2V0UmVzcG9uc2UoKS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdEF1dGgiLCBleGNlcHRpb24uZ2V0V3d3QXV0aEhlYWRlcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0QXV0aCIsIGV4Y2VwdGlvbi5nZXRSZXNwb25zZSgpLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5XV1dfQVVUSEVOVElDQVRFKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvb2F1dGgxLXNpZ25hdHVyZS9wb20ueG1sIGIvc2VjdXJpdHkvb2F1dGgxLXNpZ25hdHVyZS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhYzgwNjIKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9vYXV0aDEtc2lnbmF0dXJlL3BvbS54bWwKQEAgLTAsMCArMSw2MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZWN1cml0eTwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8YXJ0aWZhY3RJZD5vYXV0aDEtc2lnbmF0dXJlPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisKKyAgICA8ZGVzY3JpcHRpb24+T0F1dGgxIHNpZ25hdHVyZSBtb2R1bGU8L2Rlc2NyaXB0aW9uPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi5pc3RhY2s8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4taXN0YWNrLWNvbW1vbnMtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJ1aWxkLWhlbHBlci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKworICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb21tb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L29hdXRoMS1zaWduYXR1cmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vYXV0aDEvc2lnbmF0dXJlL0Jhc2U2NC5qYXZhIGIvc2VjdXJpdHkvb2F1dGgxLXNpZ25hdHVyZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29hdXRoMS9zaWduYXR1cmUvQmFzZTY0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZkZDllYgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L29hdXRoMS1zaWduYXR1cmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vYXV0aDEvc2lnbmF0dXJlL0Jhc2U2NC5qYXZhCkBAIC0wLDAgKzEsMjIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9hdXRoMS5zaWduYXR1cmU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkub2F1dGgxLnNpZ25hdHVyZS5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKKworLyoqCisgKiBCYXNlNjQgZW5jb2RpbmcgdXRpbCBjbGFzcy4KKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBCYXNlNjQgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2hhciBBTFBIQUJFVFtdID0geydBJywgJ0InLCAnQycsICdEJywgJ0UnLCAnRicsICdHJywKKyAgICAgICAgICAgICdIJywgJ0knLCAnSicsICdLJywgJ0wnLCAnTScsICdOJywgJ08nLCAnUCcsICdRJywgJ1InLCAnUycsICdUJywgJ1UnLCAnVicsCisgICAgICAgICAgICAnVycsICdYJywgJ1knLCAnWicsICdhJywgJ2InLCAnYycsICdkJywgJ2UnLCAnZicsICdnJywgJ2gnLCAnaScsICdqJywgJ2snLAorICAgICAgICAgICAgJ2wnLCAnbScsICduJywgJ28nLCAncCcsICdxJywgJ3InLCAncycsICd0JywgJ3UnLCAndicsICd3JywgJ3gnLCAneScsICd6JywKKyAgICAgICAgICAgICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNScsICc2JywgJzcnLCAnOCcsICc5JywgJysnLCAnLyd9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgaW50IHZhbHVlRGVjb2RpbmdbXSA9IG5ldyBpbnRbMTI4XTsKKworICAgIHN0YXRpYyB7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZURlY29kaW5nLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB2YWx1ZURlY29kaW5nW2ldID0gLTE7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEFMUEhBQkVULmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB2YWx1ZURlY29kaW5nW0FMUEhBQkVUW2ldXSA9IGk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0cyBhIGJ5dGUgYXJyYXkgaW50byBhIEJhc2U2NCBlbmNvZGVkIHN0cmluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRhIGJ5dGVzIHRvIGVuY29kZS4KKyAgICAgKiBAcmV0dXJuIGJhc2U2NCBlbmNvZGluZyBvZiBkYXRhOyA0IGNoYXJzIGZvciBldmVyeSAzIGJ5dGVzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVuY29kZShieXRlW10gZGF0YSkgeworICAgICAgICByZXR1cm4gZW5jb2RlKGRhdGEsIDAsIGRhdGEubGVuZ3RoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0cyBhIGJ5dGUgYXJyYXkgaW50byBhIEJhc2U2NCBlbmNvZGVkIHN0cmluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkYXRhIGJ5dGVzIHRvIGVuY29kZS4KKyAgICAgKiBAcGFyYW0gb2Zmc2V0IHdoaWNoIGJ5dGUgdG8gc3RhcnQgYXQuCisgICAgICogQHBhcmFtIGxlbmd0aCBob3cgbWFueSBieXRlcyB0byBlbmNvZGU7IHBhZGRpbmcgd2lsbCBiZSBhZGRlZCBpZiBuZWVkZWQuCisgICAgICogQHJldHVybiBiYXNlNjQgZW5jb2Rpbmcgb2YgZGF0YTsgNCBjaGFycyBmb3IgZXZlcnkgMyBieXRlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBlbmNvZGUoYnl0ZVtdIGRhdGEsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKworICAgICAgICBpbnQgaTsKKyAgICAgICAgaW50IGVuY29kZWRMZW47CisgICAgICAgIGNoYXJbXSBlbmNvZGVkOworCisgICAgICAgIC8vIDQgY2hhcnMgZm9yIDMgYnl0ZXMsIHJ1biBpbnB1dCB1cCB0byBhIG11bHRpcGxlIG9mIDMKKyAgICAgICAgZW5jb2RlZExlbiA9IChsZW5ndGggKyAyKSAvIDMgKiA0OworICAgICAgICBlbmNvZGVkID0gbmV3IGNoYXJbZW5jb2RlZExlbl07CisKKyAgICAgICAgZm9yIChpID0gMCwgZW5jb2RlZExlbiA9IDA7IGVuY29kZWRMZW4gPCBlbmNvZGVkLmxlbmd0aDsgaSArPSAzLCBlbmNvZGVkTGVuICs9IDQpIHsKKyAgICAgICAgICAgIGVuY29kZVF1YW50dW0oZGF0YSwgb2Zmc2V0ICsgaSwgbGVuZ3RoIC0gaSwgZW5jb2RlZCwgZW5jb2RlZExlbik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3IFN0cmluZyhlbmNvZGVkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbmNvZGVzIDEsIDIsIG9yIDMgYnl0ZXMgb2YgZGF0YSBhcyA0IEJhc2U2NCBjaGFycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbiBidWZmZXIgb2YgYnl0ZXMgdG8gZW5jb2RlLgorICAgICAqIEBwYXJhbSBpbk9mZnNldCB3aGVyZSB0aGUgZmlyc3QgYnl0ZSB0byBlbmNvZGUgaXMuCisgICAgICogQHBhcmFtIGxlbiBob3cgbWFueSBieXRlcyB0byBlbmNvZGUuCisgICAgICogQHBhcmFtIG91dCBidWZmZXIgdG8gcHV0IHRoZSBvdXRwdXQgaW4uCisgICAgICogQHBhcmFtIG91dE9mZnNldCB3aGVyZSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciB0byBwdXQgdGhlIGNoYXJzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZW5jb2RlUXVhbnR1bShieXRlIGluW10sIGludCBpbk9mZnNldCwgaW50IGxlbiwgY2hhciBvdXRbXSwgaW50IG91dE9mZnNldCkgeworCisgICAgICAgIGJ5dGUgYSA9IDAsIGIgPSAwLCBjID0gMDsKKworICAgICAgICBhID0gaW5baW5PZmZzZXRdOworICAgICAgICBvdXRbb3V0T2Zmc2V0XSA9IEFMUEhBQkVUWyhhID4+PiAyKSAmIDB4M0ZdOworCisgICAgICAgIGlmIChsZW4gPiAyKSB7CisgICAgICAgICAgICBiID0gaW5baW5PZmZzZXQgKyAxXTsKKyAgICAgICAgICAgIGMgPSBpbltpbk9mZnNldCArIDJdOworICAgICAgICAgICAgb3V0W291dE9mZnNldCArIDFdID0gQUxQSEFCRVRbKChhIDw8IDQpICYgMHgzMCkgKyAoKGIgPj4+IDQpICYgMHhmKV07CisgICAgICAgICAgICBvdXRbb3V0T2Zmc2V0ICsgMl0gPSBBTFBIQUJFVFsoKGIgPDwgMikgJiAweDNjKSArICgoYyA+Pj4gNikgJiAweDMpXTsKKyAgICAgICAgICAgIG91dFtvdXRPZmZzZXQgKyAzXSA9IEFMUEhBQkVUW2MgJiAweDNGXTsKKyAgICAgICAgfSBlbHNlIGlmIChsZW4gPiAxKSB7CisgICAgICAgICAgICBiID0gaW5baW5PZmZzZXQgKyAxXTsKKyAgICAgICAgICAgIG91dFtvdXRPZmZzZXQgKyAxXSA9IEFMUEhBQkVUWygoYSA8PCA0KSAmIDB4MzApICsgKChiID4+PiA0KSAmIDB4ZildOworICAgICAgICAgICAgb3V0W291dE9mZnNldCArIDJdID0gQUxQSEFCRVRbKChiIDw8IDIpICYgMHgzYykgKyAoKGMgPj4+IDYpICYgMHgzKV07CisgICAgICAgICAgICBvdXRbb3V0T2Zmc2V0ICsgM10gPSAnPSc7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXRbb3V0T2Zmc2V0ICsgMV0gPSBBTFBIQUJFVFsoKGEgPDwgNCkgJiAweDMwKSArICgoYiA+Pj4gNCkgJiAweGYpXTsKKyAgICAgICAgICAgIG91dFtvdXRPZmZzZXQgKyAyXSA9ICc9JzsKKyAgICAgICAgICAgIG91dFtvdXRPZmZzZXQgKyAzXSA9ICc9JzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIGEgQmFzZTY0IGVuY29kZWQgc3RyaW5nIHRvIGEgYnl0ZSBhcnJheS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbmNvZGVkIEJhc2U2NCBlbmNvZGVkIGRhdGEuCisgICAgICogQHJldHVybiBkZWNvZGUgYmluYXJ5IGRhdGE7IDMgYnl0ZXMgZm9yIGV2ZXJ5IDQgY2hhcnMgLSBtaW51cyBwYWRkaW5nLgorICAgICAqIEB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiBpZiBhbiBJL08gZXJyb3Igb2NjdXJzIHJlYWRpbmcgdGhlIGRhdGEuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBieXRlW10gZGVjb2RlKFN0cmluZyBlbmNvZGVkKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXR1cm4gZGVjb2RlKGVuY29kZWQsIDAsIGVuY29kZWQubGVuZ3RoKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIGFuIGVtYmVkZGVkIEJhc2U2NCBlbmNvZGVkIHN0cmluZyB0byBhIGJ5dGUgYXJyYXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZW5jb2RlZCBhIFN0cmluZyB3aXRoIEJhc2U2NCBkYXRhIGVtYmVkZGVkIGluIGl0LgorICAgICAqIEBwYXJhbSBvZmZzZXQgd2hpY2ggY2hhciBvZiB0aGUgU3RyaW5nIHRvIHN0YXJ0IGF0LgorICAgICAqIEBwYXJhbSBsZW5ndGggaG93IG1hbnkgY2hhcnMgdG8gZGVjb2RlOyBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNC4KKyAgICAgKiBAcmV0dXJuIGRlY29kZSBiaW5hcnkgZGF0YTsgMyBieXRlcyBmb3IgZXZlcnkgNCBjaGFycyAtIG1pbnVzIHBhZGRpbmcuCisgICAgICogQHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMgcmVhZGluZyB0aGUgZGF0YS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBkZWNvZGUoU3RyaW5nIGVuY29kZWQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaW50IGk7CisgICAgICAgIGludCBkZWNvZGVkTGVuOworICAgICAgICBieXRlW10gZGVjb2RlZDsKKworICAgICAgICAvLyB0aGUgaW5wdXQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDQKKyAgICAgICAgaWYgKGxlbmd0aCAlIDQgIT0gMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX0JBU0VfNjRfTEVOR1RIKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gNCBjaGFycyBmb3IgMyBieXRlcywgYnV0IHRoZXJlIG1heSBoYXZlIGJlZW4gcGFkIGJ5dGVzCisgICAgICAgIGRlY29kZWRMZW4gPSBsZW5ndGggLyA0ICogMzsKKyAgICAgICAgaWYgKGVuY29kZWQuY2hhckF0KG9mZnNldCArIGxlbmd0aCAtIDEpID09ICc9JykgeworICAgICAgICAgICAgZGVjb2RlZExlbi0tOworICAgICAgICAgICAgaWYgKGVuY29kZWQuY2hhckF0KG9mZnNldCArIGxlbmd0aCAtIDIpID09ICc9JykgeworICAgICAgICAgICAgICAgIGRlY29kZWRMZW4tLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGRlY29kZWQgPSBuZXcgYnl0ZVtkZWNvZGVkTGVuXTsKKworICAgICAgICBmb3IgKGkgPSAwLCBkZWNvZGVkTGVuID0gMDsgaSA8IGxlbmd0aDsgaSArPSA0LCBkZWNvZGVkTGVuICs9IDMpIHsKKyAgICAgICAgICAgIGRlY29kZVF1YW50dW0oZW5jb2RlZC5jaGFyQXQob2Zmc2V0ICsgaSksCisgICAgICAgICAgICAgICAgICAgIGVuY29kZWQuY2hhckF0KG9mZnNldCArIGkgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlZC5jaGFyQXQob2Zmc2V0ICsgaSArIDIpLAorICAgICAgICAgICAgICAgICAgICBlbmNvZGVkLmNoYXJBdChvZmZzZXQgKyBpICsgMyksCisgICAgICAgICAgICAgICAgICAgIGRlY29kZWQsIGRlY29kZWRMZW4pOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGRlY29kZWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGVjb2RlIDQgQmFzZTY0IGNoYXJzIGFzIDEsIDIsIG9yIDMgYnl0ZXMgb2YgZGF0YS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbjEgZmlyc3QgY2hhciBvZiBxdWFudHVtIHRvIGRlY29kZS4KKyAgICAgKiBAcGFyYW0gaW4yIHNlY29uZCBjaGFyIG9mIHF1YW50dW0gdG8gZGVjb2RlLgorICAgICAqIEBwYXJhbSBpbjMgdGhpcmQgY2hhciBvZiBxdWFudHVtIHRvIGRlY29kZS4KKyAgICAgKiBAcGFyYW0gaW40IGZvcnRoIGNoYXIgb2YgcXVhbnR1bSB0byBkZWNvZGUuCisgICAgICogQHBhcmFtIG91dCBidWZmZXIgdG8gcHV0IHRoZSBvdXRwdXQgaW4uCisgICAgICogQHBhcmFtIG91dE9mZnNldCB3aGVyZSBpbiB0aGUgb3V0cHV0IGJ1ZmZlciB0byBwdXQgdGhlIGJ5dGVzLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgZGVjb2RlUXVhbnR1bShjaGFyIGluMSwgY2hhciBpbjIsIGNoYXIgaW4zLCBjaGFyIGluNCwgYnl0ZVtdIG91dCwgaW50IG91dE9mZnNldCkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgaW50IGEgPSAwLCBiID0gMCwgYyA9IDAsIGQgPSAwOworICAgICAgICBpbnQgcGFkID0gMDsKKworICAgICAgICBhID0gdmFsdWVEZWNvZGluZ1tpbjEgJiAxMjddOworICAgICAgICBiID0gdmFsdWVEZWNvZGluZ1tpbjIgJiAxMjddOworCisgICAgICAgIGlmIChpbjQgPT0gJz0nKSB7CisgICAgICAgICAgICBwYWQrKzsKKyAgICAgICAgICAgIGlmIChpbjMgPT0gJz0nKSB7CisgICAgICAgICAgICAgICAgcGFkKys7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGMgPSB2YWx1ZURlY29kaW5nW2luMyAmIDEyN107CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjID0gdmFsdWVEZWNvZGluZ1tpbjMgJiAxMjddOworICAgICAgICAgICAgZCA9IHZhbHVlRGVjb2RpbmdbaW40ICYgMTI3XTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChhIDwgMCB8fCBiIDwgMCB8fCBjIDwgMCB8fCBkIDwgMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX0JBU0VfNjRfTEVOR1RIKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdGhlIGZpcnN0IGJ5dGUgaXMgdGhlIDYgYml0cyBvZiBhIGFuZCAyIGJpdHMgb2YgYgorICAgICAgICBvdXRbb3V0T2Zmc2V0XSA9IChieXRlKSAoKChhIDw8IDIpICYgMHhmYykgfCAoKGIgPj4+IDQpICYgMykpOworCisgICAgICAgIGlmIChwYWQgPCAyKSB7CisKKyAgICAgICAgICAgIC8vIHRoZSBzZWNvbmQgYnl0ZSBpcyA0IGJpdHMgb2YgYiBhbmQgNCBiaXRzIG9mIGMKKyAgICAgICAgICAgIG91dFtvdXRPZmZzZXQgKyAxXSA9IChieXRlKSAoKChiIDw8IDQpICYgMHhmMCkgfCAoKGMgPj4+IDIpICYgMHhmKSk7CisKKyAgICAgICAgICAgIGlmIChwYWQgPCAxKSB7CisgICAgICAgICAgICAgICAgLy8gdGhlIHRoaXJkIGJ5dGUgaXMgMiBiaXRzIG9mIGMgYW5kIDQgYml0cyBvZiBkCisgICAgICAgICAgICAgICAgb3V0W291dE9mZnNldCArIDJdID0gKGJ5dGUpICgoKGMgPDwgNikgJiAweGMwKSB8IChkICYgMHgzZikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9zZWN1cml0eS9vYXV0aDEtc2lnbmF0dXJlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb2F1dGgxL3NpZ25hdHVyZS9IbWFTaGExTWV0aG9kLmphdmEgYi9zZWN1cml0eS9vYXV0aDEtc2lnbmF0dXJlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb2F1dGgxL3NpZ25hdHVyZS9IbWFTaGExTWV0aG9kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU3NzBjZAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L29hdXRoMS1zaWduYXR1cmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vYXV0aDEvc2lnbmF0dXJlL0htYVNoYTFNZXRob2QuamF2YQpAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5vYXV0aDEuc2lnbmF0dXJlOworCitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuSW52YWxpZEtleUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LmNyeXB0by5NYWM7CitpbXBvcnQgamF2YXguY3J5cHRvLnNwZWMuU2VjcmV0S2V5U3BlYzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnVyaS5VcmlDb21wb25lbnQ7CisKKworLyoqCisgKiBBbiBPQXV0aCBzaWduYXR1cmUgbWV0aG9kIHRoYXQgaW1wbGVtZW50cyBITUFDLVNIQTEuCisgKgorICogQGF1dGhvciBIdWJlcnQgQS4gTGUgVmFuIEdvbmcgPGh1YmVydC5sZXZhbmdvbmcgYXQgU3VuLkNPTT4KKyAqIEBhdXRob3IgUGF1bCBDLiBCcnlhbiA8cGJyeWFuQHN1bi5jb20+CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBIbWFTaGExTWV0aG9kIGltcGxlbWVudHMgT0F1dGgxU2lnbmF0dXJlTWV0aG9kIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5BTUUgPSAiSE1BQy1TSEExIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdOQVRVUkVfQUxHT1JJVEhNID0gIkhtYWNTSEExIjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgbmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIE5BTUU7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIHRoZSBITUFDLVNIQTEgc2lnbmF0dXJlIG9mIE9BdXRoIHJlcXVlc3QgZWxlbWVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmFzZVN0cmluZyB0aGUgY29tYmluZWQgT0F1dGggZWxlbWVudHMgdG8gc2lnbi4KKyAgICAgKiBAcGFyYW0gc2VjcmV0cyB0aGUgc2hhcmVkIHNlY3JldHMgdXNlZCB0byBzaWduIHRoZSByZXF1ZXN0LgorICAgICAqIEByZXR1cm4gdGhlIE9BdXRoIHNpZ25hdHVyZSwgaW4gYmFzZTY0LWVuY29kZWQgZm9ybS4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHNpZ24oU3RyaW5nIGJhc2VTdHJpbmcsIE9BdXRoMVNlY3JldHMgc2VjcmV0cykgeworCisgICAgICAgIE1hYyBtYWM7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1hYyA9IE1hYy5nZXRJbnN0YW5jZShTSUdOQVRVUkVfQUxHT1JJVEhNKTsKKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIG5zYWUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24obnNhZSk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKyAgICAgICAgLy8gbnVsbCBzZWNyZXRzIGFyZSBpbnRlcnByZXRlZCBhcyBibGFuayBwZXIgT0F1dGggc3BlY2lmaWNhdGlvbgorICAgICAgICBTdHJpbmcgc2VjcmV0ID0gc2VjcmV0cy5nZXRDb25zdW1lclNlY3JldCgpOworICAgICAgICBpZiAoc2VjcmV0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoVXJpQ29tcG9uZW50LmVuY29kZShzZWNyZXQsIFVyaUNvbXBvbmVudC5UeXBlLlVOUkVTRVJWRUQpKTsKKyAgICAgICAgfQorCisgICAgICAgIGJ1Zi5hcHBlbmQoJyYnKTsKKworICAgICAgICBzZWNyZXQgPSBzZWNyZXRzLmdldFRva2VuU2VjcmV0KCk7CisgICAgICAgIGlmIChzZWNyZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZChVcmlDb21wb25lbnQuZW5jb2RlKHNlY3JldCwgVXJpQ29tcG9uZW50LlR5cGUuVU5SRVNFUlZFRCkpOworICAgICAgICB9CisKKyAgICAgICAgYnl0ZVtdIGtleTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAga2V5ID0gYnVmLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoIlVURi04Iik7CisgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gdWVlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKHVlZSk7CisgICAgICAgIH0KKworICAgICAgICBTZWNyZXRLZXlTcGVjIHNwZWMgPSBuZXcgU2VjcmV0S2V5U3BlYyhrZXksIFNJR05BVFVSRV9BTEdPUklUSE0pOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtYWMuaW5pdChzcGVjKTsKKyAgICAgICAgfSBjYXRjaCAoSW52YWxpZEtleUV4Y2VwdGlvbiBpa2UpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oaWtlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBCYXNlNjQuZW5jb2RlKG1hYy5kb0ZpbmFsKGJhc2VTdHJpbmcuZ2V0Qnl0ZXMoKSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcmlmaWVzIHRoZSBITUFDLVNIQTEgc2lnbmF0dXJlIG9mIE9BdXRoIHJlcXVlc3QgZWxlbWVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZWxlbWVudHMgT0F1dGggZWxlbWVudHMgc2lnbmF0dXJlIGlzIHRvIGJlIHZlcmlmaWVkIGFnYWluc3QuCisgICAgICogQHBhcmFtIHNlY3JldHMgdGhlIHNoYXJlZCBzZWNyZXRzIGZvciB2ZXJpZnlpbmcgdGhlIHNpZ25hdHVyZS4KKyAgICAgKiBAcGFyYW0gc2lnbmF0dXJlIGJhc2U2NC1lbmNvZGVkIE9BdXRoIHNpZ25hdHVyZSB0byBiZSB2ZXJpZmllZC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiB2ZXJpZnkoU3RyaW5nIGVsZW1lbnRzLCBPQXV0aDFTZWNyZXRzIHNlY3JldHMsIFN0cmluZyBzaWduYXR1cmUpIHsKKyAgICAgICAgLy8gd2l0aCBzeW1tZXRyaWMgY3J5cHRvZ3JhcGh5LCBzaW1wbHkgc2lnbiBhZ2FpbiBhbmQgY29tcGFyZQorICAgICAgICByZXR1cm4gc2lnbihlbGVtZW50cywgc2VjcmV0cykuZXF1YWxzKHNpZ25hdHVyZSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9zZWN1cml0eS9vYXV0aDEtc2lnbmF0dXJlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb2F1dGgxL3NpZ25hdHVyZS9JbnZhbGlkU2VjcmV0RXhjZXB0aW9uLmphdmEgYi9zZWN1cml0eS9vYXV0aDEtc2lnbmF0dXJlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb2F1dGgxL3NpZ25hdHVyZS9JbnZhbGlkU2VjcmV0RXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM3MzdlMwotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L29hdXRoMS1zaWduYXR1cmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vYXV0aDEvc2lnbmF0dXJlL0ludmFsaWRTZWNyZXRFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9hdXRoMS5zaWduYXR1cmU7CisKKy8qKgorICogVGhyb3duIHRvIGluZGljYXRlIHRoYXQgdGhlIE9BdXRoIHNlY3JldCBzdXBwbGllZCBpcyBpbnZhbGlkIG9yIG90aGVyd2lzZQorICogdW5zdXBwb3J0ZWQuCisgKgorICogQGF1dGhvciBQYXVsIEMuIEJyeWFuIDxwYnJ5YW5Ac3VuLmNvbT4KKyAqLworcHVibGljIGNsYXNzIEludmFsaWRTZWNyZXRFeGNlcHRpb24gZXh0ZW5kcyBPQXV0aDFTaWduYXR1cmVFeGNlcHRpb24geworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBpbnZhbGlkIE9BdXRoIHNlY3JldCBleGNlcHRpb24gd2l0aCBubyBkZXRhaWwgbWVzc2FnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSW52YWxpZFNlY3JldEV4Y2VwdGlvbigpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGludmFsaWQgT0F1dGggc2VjcmV0IGV4Y2VwdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgZGV0YWlsCisgICAgICogbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzIHRoZSBkZXRhaWwgbWVzc2FnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgSW52YWxpZFNlY3JldEV4Y2VwdGlvbihTdHJpbmcgcykgeworICAgICAgICBzdXBlcihzKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L29hdXRoMS1zaWduYXR1cmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vYXV0aDEvc2lnbmF0dXJlL09BdXRoMVBhcmFtZXRlcnMuamF2YSBiL3NlY3VyaXR5L29hdXRoMS1zaWduYXR1cmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vYXV0aDEvc2lnbmF0dXJlL09BdXRoMVBhcmFtZXRlcnMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTc4ODMwCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvb2F1dGgxLXNpZ25hdHVyZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29hdXRoMS9zaWduYXR1cmUvT0F1dGgxUGFyYW1ldGVycy5qYXZhCkBAIC0wLDAgKzEsNTAxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9hdXRoMS5zaWduYXR1cmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS51cmkuVXJpQ29tcG9uZW50OworCisvKioKKyAqIEEgZGF0YSBzdHJ1Y3R1cmUgY2xhc3MgdGhhdCByZXByZXNlbnRzIE9BdXRoIHByb3RvY29sIHBhcmFtZXRlcnMuCisgKgorICogQGF1dGhvciBIdWJlcnQgQS4gTGUgVmFuIEdvbmcgPGh1YmVydC5sZXZhbmdvbmcgYXQgU3VuLkNPTT4KKyAqIEBhdXRob3IgUGF1bCBDLiBCcnlhbiA8cGJyeWFuQHN1bi5jb20+CisgKi8KK3B1YmxpYyBjbGFzcyBPQXV0aDFQYXJhbWV0ZXJzIGV4dGVuZHMgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4geworCisgICAgLyoqIE5hbWUgb2YgSFRUUCBhdXRob3JpemF0aW9uIGhlYWRlci4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBVVRIT1JJWkFUSU9OX0hFQURFUiA9ICJBdXRob3JpemF0aW9uIjsKKworICAgIC8qKiBPQXV0aCBzY2hlbWUgaW4gQXV0aG9yaXphdGlvbiBoZWFkZXIuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0NIRU1FID0gIk9BdXRoIjsKKworICAgIC8qKiBOYW1lIG9mIHBhcmFtZXRlciBjb250YWluaW5nIHRoZSBwcm90ZWN0aW9uIHJlYWxtLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQUxNID0gInJlYWxtIjsKKworICAgIC8qKiBOYW1lIG9mIHBhcmFtZXRlciBjb250YWluaW5nIHRoZSBjb25zdW1lciBrZXkuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OU1VNRVJfS0VZID0gIm9hdXRoX2NvbnN1bWVyX2tleSI7CisKKyAgICAvKiogTmFtZSBvZiBwYXJhbWV0ZXIgY29udGFpbmluZyB0aGUgYWNjZXNzL3JlcXVlc3QgdG9rZW4uICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9LRU4gPSAib2F1dGhfdG9rZW4iOworCisgICAgLyoqIE5hbWUgb2YgcGFyYW1ldGVyIGNvbnRhaW5pbmcgdGhlIHNpZ25hdHVyZSBtZXRob2QuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lHTkFUVVJFX01FVEhPRCA9ICJvYXV0aF9zaWduYXR1cmVfbWV0aG9kIjsKKworICAgIC8qKiBOYW1lIG9mIHBhcmFtZXRlciBjb250YWluaW5nIHRoZSBzaWduYXR1cmUuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lHTkFUVVJFID0gIm9hdXRoX3NpZ25hdHVyZSI7CisKKyAgICAvKiogTmFtZSBvZiBwYXJhbWV0ZXIgY29udGFpbmluZyB0aGUgdGltZXN0YW1wLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRJTUVTVEFNUCA9ICJvYXV0aF90aW1lc3RhbXAiOworCisgICAgLyoqIE5hbWUgb2YgcGFyYW1ldGVyIGNvbnRhaW5pbmcgdGhlIG5vbmNlLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE5PTkNFID0gIm9hdXRoX25vbmNlIjsKKworICAgIC8qKiBOYW1lIG9mIHBhcmFtZXRlciBjb250YWluaW5nIHRoZSBwcm90b2NvbCB2ZXJzaW9uLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZFUlNJT04gPSAib2F1dGhfdmVyc2lvbiI7CisKKyAgICAvKiogTmFtZSBvZiBwYXJhbWV0ZXIgY29udGFpbmluZyB0aGUgdmVyaWZpZXIgY29kZS4gKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWRVJJRklFUiA9ICJvYXV0aF92ZXJpZmllciI7CisKKyAgICAvKiogTmFtZSBvZiBwYXJhbWV0ZXIgY29udGFpbmluZyB0aGUgY2FsbGJhY2sgVVJMLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBTExCQUNLID0gIm9hdXRoX2NhbGxiYWNrIjsKKworICAgIC8qKiBOYW1lIG9mIHBhcmFtZXRlciBjb250YWluaW5nIHRoZSB0b2tlbiBzZWNyZXQuCisgICAgICogVGhpcyBwYXJhbWV0ZXIgaXMgbmV2ZXIgdXNlZCBpbiByZXF1ZXN0cy4gSXQgaXMgcGFydCBvZiBhIHJlc3BvbnNlIHRvIHRoZSByZXF1ZXN0IHRva2VuIGFuZCBhY2Nlc3MgdG9rZW4gcmVxdWVzdHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVE9LRU5fU0VDUkVUID0gIm9hdXRoX3Rva2VuX3NlY3JldCI7CisKKyAgICAvKiogTmFtZSBvZiBwYXJhbWV0ZXIgY29udGFpbmluZyB0aGUgdG9rZW4gc2VjcmV0LgorICAgICAqIFRoaXMgcGFyYW1ldGVyIGlzIG5ldmVyIHVzZWQgaW4gcmVxdWVzdHMuIEl0IGlzIHBhcnQgb2YgYSByZXNwb25zZSB0byB0aGUgcmVxdWVzdCB0b2tlbiByZXF1ZXN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQUxMQkFDS19DT05GSVJNRUQgPSAib2F1dGhfY2FsbGJhY2tfY29uZmlybWVkIjsKKworICAgIC8qKgorICAgICAqIERlZmF1bHQgdmFsdWUgb2YgdGhlIGNhbGxiYWNrIFVSSSB0aGF0IHNob3VsZCBiZSB1c2VkIGR1cmluZyBBdXRob3JpemF0aW9uIGZsb3cKKyAgICAgKiBmb3IgUmVxdWVzdCBUb2tlbiByZXF1ZXN0IHdoZW4gdGhlIGNsaWVudCBpcyBub3QgY2FwYWJsZSBvZiBoYW5kbGluZyByZWRpcmVjdHMgKGUuZy4gdGhlIGNsaWVudCBpcworICAgICAqIGEgbW9iaWxlIGFwcGxpY2F0aW9uKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOT19DQUxMQkFDS19VUklfVkFMVUUgPSAib29iIjsKKworICAgIC8qIEF1dGhvcml6YXRpb24gc2NoZW1lIGFuZCBkZWxpbWl0ZXIuICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNDSEVNRV9TUEFDRSA9IFNDSEVNRSArICcgJzsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHByb3RlY3Rpb24gcmVhbG0gZm9yIHRoZSByZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVhbG0oKSB7CisgICAgICAgIHJldHVybiBnZXQoUkVBTE0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHByb3RlY3Rpb24gcmVhbG0gZm9yIHRoZSByZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFJlYWxtKFN0cmluZyByZWFsbSkgeworICAgICAgICBwdXQoUkVBTE0sIHJlYWxtKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCdWlsZGVyIHBhdHRlcm4gbWV0aG9kIHRvIHJldHVybiB7QGNvZGUgT0F1dGgxUGFyYW1ldGVyc30gYWZ0ZXIgc2V0dGluZworICAgICAqIHByb3RlY3Rpb24gcmVhbG0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVhbG0gdGhlIHByb3RlY3Rpb24gcmVhbG0gZm9yIHRoZSByZXF1ZXN0LgorICAgICAqIEByZXR1cm4gdGhpcyBwYXJhbWV0ZXJzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgT0F1dGgxUGFyYW1ldGVycyByZWFsbShTdHJpbmcgcmVhbG0pIHsKKyAgICAgICAgc2V0UmVhbG0ocmVhbG0pOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBjb25zdW1lciBrZXkuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDb25zdW1lcktleSgpIHsKKyAgICAgICAgcmV0dXJuIGdldChDT05TVU1FUl9LRVkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGNvbnN1bWVyIGtleS4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25zdW1lcktleShTdHJpbmcgY29uc3VtZXJLZXkpIHsKKyAgICAgICAgcHV0KENPTlNVTUVSX0tFWSwgY29uc3VtZXJLZXkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJ1aWxkZXIgcGF0dGVybiBtZXRob2QgdG8gcmV0dXJuIHtAY29kZSBPQXV0aDFQYXJhbWV0ZXJzfSBhZnRlciBzZXR0aW5nCisgICAgICogY29uc3VtZXIga2V5LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnN1bWVyS2V5IHRoZSBjb25zdW1lciBrZXkuCisgICAgICovCisgICAgcHVibGljIE9BdXRoMVBhcmFtZXRlcnMgY29uc3VtZXJLZXkoU3RyaW5nIGNvbnN1bWVyS2V5KSB7CisgICAgICAgIHNldENvbnN1bWVyS2V5KGNvbnN1bWVyS2V5KTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcmVxdWVzdCBvciBhY2Nlc3MgdG9rZW4uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRUb2tlbigpIHsKKyAgICAgICAgcmV0dXJuIGdldChUT0tFTik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBwdXQoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHJldHVybiB2YWx1ZSA9PSBudWxsID8gcmVtb3ZlKGtleSkgOiBzdXBlci5wdXQoa2V5LCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgcmVxdWVzdCBvciBhY2Nlc3MgdG9rZW4uCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VG9rZW4oU3RyaW5nIHRva2VuKSB7CisgICAgICAgIGlmICh0b2tlbiA9PSBudWxsKSB7CisgICAgICAgICAgICByZW1vdmUoVE9LRU4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHV0KFRPS0VOLCB0b2tlbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCdWlsZGVyIHBhdHRlcm4gbWV0aG9kIHRvIHJldHVybiB7QGNvZGUgT0F1dGgxUGFyYW1ldGVyc30gYWZ0ZXIgc2V0dGluZworICAgICAqIHRva2VuLgorICAgICAqCisgICAgICogQHBhcmFtIHRva2VuIHRoZSBhY2Nlc3Mgb3IgcmVxdWVzdCB0b2tlbi4KKyAgICAgKiBAcmV0dXJuIHRoaXMgcGFyYW1ldGVycyBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIE9BdXRoMVBhcmFtZXRlcnMgdG9rZW4oU3RyaW5nIHRva2VuKSB7CisgICAgICAgIHNldFRva2VuKHRva2VuKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2lnbmF0dXJlIG1ldGhvZCB1c2VkIHRvIHNpZ24gdGhlIHJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTaWduYXR1cmVNZXRob2QoKSB7CisgICAgICAgIHJldHVybiBnZXQoU0lHTkFUVVJFX01FVEhPRCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc2lnbmF0dXJlIG1ldGhvZCB1c2VkIHRvIHNpZ24gdGhlIHJlcXVlc3QuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0U2lnbmF0dXJlTWV0aG9kKFN0cmluZyBzaWduYXR1cmVNZXRob2QpIHsKKyAgICAgICAgcHV0KFNJR05BVFVSRV9NRVRIT0QsIHNpZ25hdHVyZU1ldGhvZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQnVpbGRlciBwYXR0ZXJuIG1ldGhvZCB0byByZXR1cm4ge0Bjb2RlIE9BdXRoMVBhcmFtZXRlcnN9IGFmdGVyIHNldHRpbmcKKyAgICAgKiBzaWduYXR1cmUgbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIHNpZ25hdHVyZU1ldGhvZCB0aGUgc2lnbmF0dXJlIG1ldGhvZCB1c2VkIHRvIHNpZ24gdGhlIHJlcXVlc3QuCisgICAgICogQHJldHVybiB0aGlzIHBhcmFtZXRlcnMgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBPQXV0aDFQYXJhbWV0ZXJzIHNpZ25hdHVyZU1ldGhvZChTdHJpbmcgc2lnbmF0dXJlTWV0aG9kKSB7CisgICAgICAgIHNldFNpZ25hdHVyZU1ldGhvZChzaWduYXR1cmVNZXRob2QpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzaWduYXR1cmUgZm9yIHRoZSByZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2lnbmF0dXJlKCkgeworICAgICAgICByZXR1cm4gZ2V0KFNJR05BVFVSRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc2lnbmF0dXJlIGZvciB0aGUgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRTaWduYXR1cmUoU3RyaW5nIHNpZ25hdHVyZSkgeworICAgICAgICBwdXQoU0lHTkFUVVJFLCBzaWduYXR1cmUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJ1aWxkZXIgcGF0dGVybiBtZXRob2QgdG8gcmV0dXJuIHtAY29kZSBPQXV0aDFQYXJhbWV0ZXJzfSBhZnRlciBzZXR0aW5nCisgICAgICogc2lnbmF0dXJlLgorICAgICAqCisgICAgICogQHBhcmFtIHNpZ25hdHVyZSB0aGUgc2lnbmF0dXJlIGZvciB0aGUgcmVxdWVzdC4KKyAgICAgKiBAcmV0dXJuIHRoaXMgcGFyYW1ldGVycyBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIE9BdXRoMVBhcmFtZXRlcnMgc2lnbmF0dXJlKFN0cmluZyBzaWduYXR1cmUpIHsKKyAgICAgICAgc2V0U2lnbmF0dXJlKHNpZ25hdHVyZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHRpbWVzdGFtcCwgYSB2YWx1ZSBleHBlY3RlZCB0byBiZSBhIHBvc2l0aXZlIGludGVnZXIsCisgICAgICogdHlwaWNhbGx5IGNvbnRhaW5pbmcgdGhlIG51bWJlciBvZiBzZWNvbmRzIHNpbmNlIEphbnVhcnkgMSwgMTk3MAorICAgICAqIDAwOjAwOjAwIEdNVCAoZXBvY2gpLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGltZXN0YW1wKCkgeworICAgICAgICByZXR1cm4gZ2V0KFRJTUVTVEFNUCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdGltZXN0YW1wLiBJdHMgdmFsdWUgaXMgbm90IHZhbGlkYXRlZCwgYnV0IHNob3VsZCBiZSBhCisgICAgICogcG9zaXRpdmUgaW50ZWdlciwgdHlwaWNhbGx5IGNvbnRhaW5pbmcgdGhlIG51bWJlciBvZiBzZWNvbmRzIHNpbmNlCisgICAgICogSmFudWFyeSAxLCAxOTcwIDAwOjAwOjAwIEdNVCAoZXBvY2gpLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRpbWVzdGFtcChTdHJpbmcgdGltZXN0YW1wKSB7CisgICAgICAgIHB1dChUSU1FU1RBTVAsIHRpbWVzdGFtcCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQnVpbGRlciBwYXR0ZXJuIG1ldGhvZCB0byByZXR1cm4ge0Bjb2RlIE9BdXRoMVBhcmFtZXRlcnN9IGFmdGVyIHNldHRpbmcKKyAgICAgKiB0aW1lc3RhbXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGltZXN0YW1wIHBvc2l0aXZlIGludGVnZXIsIHR5cGljYWxseSBudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSBlcG9jaC4KKyAgICAgKiBAcmV0dXJuIHRoaXMgcGFyYW1ldGVycyBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIE9BdXRoMVBhcmFtZXRlcnMgdGltZXN0YW1wKFN0cmluZyB0aW1lc3RhbXApIHsKKyAgICAgICAgc2V0VGltZXN0YW1wKHRpbWVzdGFtcCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHRpbWVzdGFtcCB0byB0aGUgY3VycmVudCB0aW1lIGFzIG51bWJlciBvZiBzZWNvbmRzIHNpbmNlIGVwb2NoLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFRpbWVzdGFtcCgpIHsKKyAgICAgICAgc2V0VGltZXN0YW1wKExvbmcudG9TdHJpbmcoU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgLyAxMDAwKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQnVpbGRlciBwYXR0ZXJuIG1ldGhvZCB0byByZXR1cm4ge0Bjb2RlIE9BdXRoMVBhcmFtZXRlcnN9IGFmdGVyIHNldHRpbmcKKyAgICAgKiB0aW1lc3RhbXAgdG8gdGhlIGN1cnJlbnQgdGltZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhpcyBwYXJhbWV0ZXJzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgT0F1dGgxUGFyYW1ldGVycyB0aW1lc3RhbXAoKSB7CisgICAgICAgIHNldFRpbWVzdGFtcCgpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBub25jZSwgYSB2YWx1ZSB0aGF0IHNob3VsZCBiZSB1bmlxdWUgZm9yIGEgZ2l2ZW4KKyAgICAgKiB0aW1lc3RhbXAuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROb25jZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldChOT05DRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbm9uY2UsIGEgdmFsdWUgdGhhdCBzaG91bGQgYmUgdW5pcXVlIGZvciBhIGdpdmVuIHRpbWVzdGFtcC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROb25jZShTdHJpbmcgbm9uY2UpIHsKKyAgICAgICAgcHV0KE5PTkNFLCBub25jZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQnVpbGRlciBwYXR0ZXJuIG1ldGhvZCB0byByZXR1cm4ge0Bjb2RlIE9BdXRoMVBhcmFtZXRlcnN9IGFmdGVyIHNldHRpbmcKKyAgICAgKiBub25jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBub25jZSBhIHZhbHVlIHRoYXQgc2hvdWxkIGJlIHVuaXF1ZSBmb3IgYSBnaXZlbiB0aW1lc3RhbXAuCisgICAgICogQHJldHVybiB0aGlzIHBhcmFtZXRlcnMgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBPQXV0aDFQYXJhbWV0ZXJzIG5vbmNlKFN0cmluZyBub25jZSkgeworICAgICAgICBzZXROb25jZShub25jZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG5vbmNlIHRvIGNvbnRhaW4gYSByYW5kb21seS1nZW5lcmF0ZWQgVVVJRC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXROb25jZSgpIHsKKyAgICAgICAgc2V0Tm9uY2UoVVVJRC5yYW5kb21VVUlEKCkudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQnVpbGRlciBwYXR0ZXJuIG1ldGhvZCB0byByZXR1cm4ge0Bjb2RlIE9BdXRoMVBhcmFtZXRlcnN9IGFmdGVyIHNldHRpbmcKKyAgICAgKiBub25jZSB0byBhIHJhbmRvbWx5LWdlbmVyYXRlZCBVVUlELgorICAgICAqCisgICAgICogQHJldHVybiB0aGlzIHBhcmFtZXRlcnMgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBPQXV0aDFQYXJhbWV0ZXJzIG5vbmNlKCkgeworICAgICAgICBzZXROb25jZSgpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBwcm90b2NvbCB2ZXJzaW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyc2lvbigpIHsKKyAgICAgICAgcmV0dXJuIGdldChWRVJTSU9OKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBwcm90b2NvbCB2ZXJzaW9uLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZlcnNpb24oU3RyaW5nIHZlcnNpb24pIHsKKyAgICAgICAgcHV0KFZFUlNJT04sIHZlcnNpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJ1aWxkZXIgcGF0dGVybiBtZXRob2QgdG8gcmV0dXJuIHtAY29kZSBPQXV0aDFQYXJhbWV0ZXJzfSBhZnRlciBzZXR0aW5nCisgICAgICogdmVyc2lvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2ZXJzaW9uIHRoZSBwcm90b2NvbCB2ZXJzaW9uLgorICAgICAqIEByZXR1cm4gdGhpcyBwYXJhbWV0ZXJzIG9iamVjdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgT0F1dGgxUGFyYW1ldGVycyB2ZXJzaW9uKFN0cmluZyB2ZXJzaW9uKSB7CisgICAgICAgIHNldFZlcnNpb24odmVyc2lvbik7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHByb3RvY29sIHZlcnNpb24gdG8gdGhlIGRlZmF1bHQgdmFsdWUgb2YgMS4wLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldFZlcnNpb24oKSB7CisgICAgICAgIHNldFZlcnNpb24oIjEuMCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJ1aWxkZXIgcGF0dGVybiBtZXRob2QgdG8gcmV0dXJuIHtAY29kZSBPQXV0aDFQYXJhbWV0ZXJzfSBhZnRlciBzZXR0aW5nCisgICAgICogdmVyc2lvbiB0byB0aGUgZGVmYXVsdCB2YWx1ZSBvZiAxLjAuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoaXMgcGFyYW1ldGVycyBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIE9BdXRoMVBhcmFtZXRlcnMgdmVyc2lvbigpIHsKKyAgICAgICAgc2V0VmVyc2lvbigpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB2ZXJpZmllciBjb2RlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyaWZpZXIoKSB7CisgICAgICAgIHJldHVybiBnZXQoVkVSSUZJRVIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZlcmlmaWVyIGNvZGUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VmVyaWZpZXIoU3RyaW5nIHZlcmlmaWVyKSB7CisgICAgICAgIHB1dChWRVJJRklFUiwgdmVyaWZpZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJ1aWxkZXIgcGF0dGVybiBtZXRob2QgdG8gcmV0dXJuIHtAY29kZSBPQXV0aDFQYXJhbWV0ZXJzfSBhZnRlciBzZXR0aW5nCisgICAgICogdmVyaWZpZXIgY29kZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2ZXJpZmllciB0aGUgdmVyaWZpZXIgY29kZS4KKyAgICAgKiBAcmV0dXJuIHRoaXMgcGFyYW1ldGVycyBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIE9BdXRoMVBhcmFtZXRlcnMgdmVyaWZpZXIoU3RyaW5nIHZlcmlmaWVyKSB7CisgICAgICAgIHNldFZlcmlmaWVyKHZlcmlmaWVyKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY2FsbGJhY2sgVVJMLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2FsbGJhY2soKSB7CisgICAgICAgIHJldHVybiBnZXQoQ0FMTEJBQ0spOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIGNhbGxiYWNrIFVSTC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDYWxsYmFjayhTdHJpbmcgY2FsbGJhY2spIHsKKyAgICAgICAgcHV0KENBTExCQUNLLCBjYWxsYmFjayk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQnVpbGRlciBwYXR0ZXJuIG1ldGhvZCB0byByZXR1cm4ge0Bjb2RlIE9BdXRoMVBhcmFtZXRlcnN9IGFmdGVyIHNldHRpbmcKKyAgICAgKiBjYWxsYmFjayBVUkwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2FsbGJhY2sgdGhlIGNhbGxiYWNrIFVSTC4KKyAgICAgKiBAcmV0dXJuIHRoaXMgcGFyYW1ldGVycyBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIE9BdXRoMVBhcmFtZXRlcnMgY2FsbGJhY2soU3RyaW5nIGNhbGxiYWNrKSB7CisgICAgICAgIHNldENhbGxiYWNrKGNhbGxiYWNrKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlcyAob3B0aW9uYWwpIHF1b3RhdGlvbiBtYXJrcyBlbmNhcHN1bGF0aW5nIHBhcmFtZXRlciB2YWx1ZXMgaW4gdGhlCisgICAgICogQXV0aG9yaXphdGlvbiBoZWFkZXIgYW5kIHJldHVybnMgdGhlIHJlc3VsdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVxdW90ZShTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgaW50IGxlbmd0aCA9IHZhbHVlLmxlbmd0aCgpOworICAgICAgICByZXR1cm4gKChsZW5ndGggPj0gMiAmJiB2YWx1ZS5jaGFyQXQoMCkgPT0gJyInICYmIHZhbHVlLmNoYXJBdChsZW5ndGggLSAxKSA9PSAnIicpCisgICAgICAgICAgICAgICAgPyB2YWx1ZS5zdWJzdHJpbmcoMSwgbGVuZ3RoIC0gMSkgOiB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVhZHMgYSByZXF1ZXN0IGZvciBPQXV0aCBwYXJhbWV0ZXJzLCBhbmQgcG9wdWxhdGVzIHRoaXMgb2JqZWN0LgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgdGhlIHJlcXVlc3QgdG8gcmVhZCBPQXV0aCBwYXJhbWV0ZXJzIGZyb20uCisgICAgICogQHJldHVybiB0aGlzIHBhcmFtZXRlcnMgb2JqZWN0LgorICAgICAqLworICAgIHB1YmxpYyBPQXV0aDFQYXJhbWV0ZXJzIHJlYWRSZXF1ZXN0KE9BdXRoMVJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIC8vIHJlYWQgc3VwcG9ydGVkIHBhcmFtZXRlcnMgZnJvbSBxdWVyeSBzdHJpbmcgb3IgcmVxdWVzdCBib2R5IChsb3dlc3QgcHJlZmVyZW5jZSkKKyAgICAgICAgZm9yIChTdHJpbmcgcGFyYW0gOiByZXF1ZXN0LmdldFBhcmFtZXRlck5hbWVzKCkpIHsKKyAgICAgICAgICAgIGlmICghcGFyYW0uc3RhcnRzV2l0aCgib2F1dGhfIikpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExpc3Q8U3RyaW5nPiB2YWx1ZXMgPSByZXF1ZXN0LmdldFBhcmFtZXRlclZhbHVlcyhwYXJhbSk7CisgICAgICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEl0ZXJhdG9yPFN0cmluZz4gaSA9IHZhbHVlcy5pdGVyYXRvcigpOworICAgICAgICAgICAgaWYgKCFpLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHV0KHBhcmFtLCBpLm5leHQoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyByZWFkIGFsbCBwYXJhbWV0ZXJzIGZyb20gYXV0aG9yaXphdGlvbiBoZWFkZXIgKGhpZ2hlc3QgcHJlZmVyZW5jZSkKKyAgICAgICAgTGlzdDxTdHJpbmc+IGhlYWRlcnMgPSByZXF1ZXN0LmdldEhlYWRlclZhbHVlcyhBVVRIT1JJWkFUSU9OX0hFQURFUik7CisgICAgICAgIGlmIChoZWFkZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChTdHJpbmcgaGVhZGVyIDogaGVhZGVycykgeworICAgICAgICAgICAgaWYgKCFoZWFkZXIucmVnaW9uTWF0Y2hlcyh0cnVlLCAwLCBTQ0hFTUVfU1BBQ0UsIDAsIFNDSEVNRV9TUEFDRS5sZW5ndGgoKSkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoU3RyaW5nIHBhcmFtIDogaGVhZGVyLnN1YnN0cmluZyhTQ0hFTUVfU1BBQ0UubGVuZ3RoKCkpLnRyaW0oKS5zcGxpdCgiLCg/PSg/OlteXCJdKlwiW15cIl0qXCIpKyQpIikpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmdbXSBudiA9IHBhcmFtLnNwbGl0KCI9IiwgMik7CisgICAgICAgICAgICAgICAgaWYgKG52Lmxlbmd0aCAhPSAyKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwdXQoVXJpQ29tcG9uZW50LmRlY29kZShudlswXS50cmltKCksIFVyaUNvbXBvbmVudC5UeXBlLlVOUkVTRVJWRUQpLAorICAgICAgICAgICAgICAgICAgICAgICAgVXJpQ29tcG9uZW50LmRlY29kZShkZXF1b3RlKG52WzFdLnRyaW0oKSksIFVyaUNvbXBvbmVudC5UeXBlLlVOUkVTRVJWRUQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyaXRlcyB0aGUgT0F1dGggcGFyYW1ldGVycyB0byBhIHJlcXVlc3QsIGFzIGFuIEF1dGhvcml6YXRpb24gaGVhZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgdGhlIHJlcXVlc3QgdG8gd3JpdGUgT0F1dGggcGFyYW1ldGVycyB0by4KKyAgICAgKiBAcmV0dXJuIHRoaXMgcGFyYW1ldGVycyBvYmplY3QuCisgICAgICovCisgICAgcHVibGljIE9BdXRoMVBhcmFtZXRlcnMgd3JpdGVSZXF1ZXN0KE9BdXRoMVJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWlsZGVyKFNDSEVNRSk7CisgICAgICAgIGJvb2xlYW4gY29tbWEgPSBmYWxzZTsKKyAgICAgICAgZm9yIChTdHJpbmcga2V5IDoga2V5U2V0KCkpIHsKKyAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IGdldChrZXkpOworICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoY29tbWEgPyAiLCAiIDogIiAiKS5hcHBlbmQoVXJpQ29tcG9uZW50LmVuY29kZShrZXksIFVyaUNvbXBvbmVudC5UeXBlLlVOUkVTRVJWRUQpKTsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIj1cIiIpLmFwcGVuZChVcmlDb21wb25lbnQuZW5jb2RlKHZhbHVlLCBVcmlDb21wb25lbnQuVHlwZS5VTlJFU0VSVkVEKSkuYXBwZW5kKCciJyk7CisgICAgICAgICAgICBjb21tYSA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmVxdWVzdC5hZGRIZWFkZXJWYWx1ZShBVVRIT1JJWkFUSU9OX0hFQURFUiwgYnVmLnRvU3RyaW5nKCkpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT0F1dGgxUGFyYW1ldGVycyBjbG9uZSgpIHsKKyAgICAgICAgcmV0dXJuIChPQXV0aDFQYXJhbWV0ZXJzKSBzdXBlci5jbG9uZSgpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvb2F1dGgxLXNpZ25hdHVyZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29hdXRoMS9zaWduYXR1cmUvT0F1dGgxUmVxdWVzdC5qYXZhIGIvc2VjdXJpdHkvb2F1dGgxLXNpZ25hdHVyZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29hdXRoMS9zaWduYXR1cmUvT0F1dGgxUmVxdWVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNjk0ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9vYXV0aDEtc2lnbmF0dXJlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb2F1dGgxL3NpZ25hdHVyZS9PQXV0aDFSZXF1ZXN0LmphdmEKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5vYXV0aDEuc2lnbmF0dXJlOworCitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogSW50ZXJmYWNlIHRvIGJlIGltcGxlbWVudGVkIGFzIGEgd3JhcHBlciBhcm91bmQgYW4gSFRUUCByZXF1ZXN0LCBzbyB0aGF0CisgKiBkaWdpdGFsIHNpZ25hdHVyZSBjYW4gYmUgZ2VuZXJhdGVkIGFuZC9vciB2ZXJpZmllZC4KKyAqCisgKiBAYXV0aG9yIFBhdWwgQy4gQnJ5YW4gPHBicnlhbkBzdW4uY29tPgorICovCitwdWJsaWMgaW50ZXJmYWNlIE9BdXRoMVJlcXVlc3QgeworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgSFRUUCBtZXRob2Qgd2l0aCB3aGljaCB0aGlzIHJlcXVlc3Qgd2FzIG1hZGUsCisgICAgICogZm9yIGV4YW1wbGUsIEdFVCwgUE9TVCwgb3IgUFVULgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIHdpdGggd2hpY2ggdGhpcyByZXF1ZXN0IHdhcyBtYWRlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdE1ldGhvZCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgVVJMIG9mIHRoZSByZXF1ZXN0LCBpbmNsdWRpbmcgcHJvdG9jb2wsIHNlcnZlciBuYW1lLAorICAgICAqIG9wdGlvbmFsIHBvcnQgbnVtYmVyLCBhbmQgc2VydmVyIHBhdGguCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSByZXF1ZXN0IFVSTC4KKyAgICAgKi8KKyAgICBwdWJsaWMgVVJMIGdldFJlcXVlc3RVUkwoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4ge0BsaW5rIGphdmEudXRpbC5TZXR9IG9mIHtAbGluayBTdHJpbmd9IG9iamVjdHMgY29udGFpbmluZyB0aGUKKyAgICAgKiBuYW1lcyBvZiB0aGUgcGFyYW1ldGVycyBjb250YWluZWQgaW4gdGhlIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBuYW1lcyBvZiB0aGUgcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0UGFyYW1ldGVyTmFtZXMoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4ge0BsaW5rIGphdmEudXRpbC5MaXN0fSBvZiB7QGxpbmsgU3RyaW5nfSBvYmplY3RzIGNvbnRhaW5pbmcgdGhlCisgICAgICogdmFsdWVzIG9mIHRoZSBzcGVjaWZpZWQgcmVxdWVzdCBwYXJhbWV0ZXIsIG9yIG51bGwgaWYgdGhlIHBhcmFtZXRlciBkb2VzCisgICAgICogbm90IGV4aXN0LiBGb3IgSFRUUCByZXF1ZXN0cywgcGFyYW1ldGVycyBhcmUgY29udGFpbmVkIGluIHRoZSBxdWVyeQorICAgICAqIHN0cmluZyBhbmQvb3IgcG9zdGVkIGZvcm0gZGF0YS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIuCisgICAgICogQHJldHVybiB0aGUgdmFsdWVzIG9mIHRoZSBwYXJhbWV0ZXIuCisgICAgICovCisgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRQYXJhbWV0ZXJWYWx1ZXMoU3RyaW5nIG5hbWUpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdmFsdWUocykgb2YgdGhlIHNwZWNpZmllZCByZXF1ZXN0IGhlYWRlci4gSWYgdGhlIHJlcXVlc3QgZGlkCisgICAgICogbm90IGluY2x1ZGUgYSBoZWFkZXIgb2YgdGhlIHNwZWNpZmllZCBuYW1lLCB0aGlzIG1ldGhvZCByZXR1cm5zIG51bGwuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSB0aGUgaGVhZGVyIG5hbWUuCisgICAgICogQHJldHVybiB0aGUgdmFsdWUocykgb2YgdGhlIHJlcXVlc3RlZCBoZWFkZXIsIG9yIG51bGwgaWYgbm9uZSBleGlzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEhlYWRlclZhbHVlcyhTdHJpbmcgbmFtZSk7CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgaGVhZGVyIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgdGhlIG5hbWUgb2YgdGhlIGhlYWRlci4KKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIGhlYWRlciB2YWx1ZS4KKyAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGlzIG1ldGhvZCBjYW5ub3QgYmUgaW1wbGVtZW50ZWQuCisgICAgICovCisgICAgcHVibGljIHZvaWQgYWRkSGVhZGVyVmFsdWUoU3RyaW5nIG5hbWUsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L29hdXRoMS1zaWduYXR1cmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vYXV0aDEvc2lnbmF0dXJlL09BdXRoMVNlY3JldHMuamF2YSBiL3NlY3VyaXR5L29hdXRoMS1zaWduYXR1cmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vYXV0aDEvc2lnbmF0dXJlL09BdXRoMVNlY3JldHMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmNjMzljCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvb2F1dGgxLXNpZ25hdHVyZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29hdXRoMS9zaWduYXR1cmUvT0F1dGgxU2VjcmV0cy5qYXZhCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkub2F1dGgxLnNpZ25hdHVyZTsKKworLyoqCisgKiBDb250YWlucyB0aGUgc2VjcmV0cyB1c2VkIHRvIGdlbmVyYXRlIGFuZC9vciB2ZXJpZnkgc2lnbmF0dXJlcy4KKyAqCisgKiBAYXV0aG9yIFBhdWwgQy4gQnJ5YW4gPHBicnlhbkBzdW4uY29tPgorICovCitwdWJsaWMgY2xhc3MgT0F1dGgxU2VjcmV0cyB7CisKKyAgICAvKiogVGhlIGNvbnN1bWVyIHNlY3JldC4gKi8KKyAgICBwcml2YXRlIHZvbGF0aWxlIFN0cmluZyBjb25zdW1lclNlY3JldDsKKworICAgIC8qKiBUaGUgcmVxdWVzdCBvciBhY2Nlc3MgdG9rZW4gc2VjcmV0LiAqLworICAgIHByaXZhdGUgdm9sYXRpbGUgU3RyaW5nIHRva2VuU2VjcmV0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgY29uc3VtZXIgc2VjcmV0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29uc3VtZXJTZWNyZXQoKSB7CisgICAgICAgIHJldHVybiBjb25zdW1lclNlY3JldDsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFNldHMgdGhlIGNvbnN1bWVyIHNlY3JldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRDb25zdW1lclNlY3JldChTdHJpbmcgY29uc3VtZXJTZWNyZXQpIHsKKyAgICAgICAgdGhpcy5jb25zdW1lclNlY3JldCA9IGNvbnN1bWVyU2VjcmV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEJ1aWxkZXIgcGF0dGVybiBtZXRob2QgdG8gcmV0dXJuIHtAbGluayBPQXV0aDFTZWNyZXRzfSBhZnRlciBzZXR0aW5nCisgICAgICogY29uc3VtZXIgc2VjcmV0LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnN1bWVyU2VjcmV0IHRoZSBjb25zdW1lciBzZWNyZXQuCisgICAgICovCisgICAgcHVibGljIE9BdXRoMVNlY3JldHMgY29uc3VtZXJTZWNyZXQoU3RyaW5nIGNvbnN1bWVyU2VjcmV0KSB7CisgICAgICAgIHNldENvbnN1bWVyU2VjcmV0KGNvbnN1bWVyU2VjcmV0KTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyByZXF1ZXN0IG9yIGFjY2VzcyB0b2tlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFRva2VuU2VjcmV0KCkgeworICAgICAgICByZXR1cm4gdG9rZW5TZWNyZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyByZXF1ZXN0IG9yIGFjY2VzcyB0b2tlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRUb2tlblNlY3JldChTdHJpbmcgdG9rZW5TZWNyZXQpIHsKKyAgICAgICAgdGhpcy50b2tlblNlY3JldCA9IHRva2VuU2VjcmV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEJ1aWxkZXIgcGF0dGVybiBtZXRob2QgdG8gcmV0dXJuIHtAbGluayBPQXV0aDFTZWNyZXRzfSBhZnRlciBzZXR0aW5nCisgICAgICogY29uc3VtZXIgc2VjcmV0LgorICAgICAqCisgICAgICogQHBhcmFtIHRva2VuU2VjcmV0IHRoZSB0b2tlbiBzZWNyZXQuCisgICAgICovCisgICAgcHVibGljIE9BdXRoMVNlY3JldHMgdG9rZW5TZWNyZXQoU3RyaW5nIHRva2VuU2VjcmV0KSB7CisgICAgICAgIHNldFRva2VuU2VjcmV0KHRva2VuU2VjcmV0KTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9BdXRoMVNlY3JldHMgY2xvbmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgT0F1dGgxU2VjcmV0cygpLmNvbnN1bWVyU2VjcmV0KHRoaXMuY29uc3VtZXJTZWNyZXQpLnRva2VuU2VjcmV0KHRoaXMudG9rZW5TZWNyZXQpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvb2F1dGgxLXNpZ25hdHVyZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29hdXRoMS9zaWduYXR1cmUvT0F1dGgxU2lnbmF0dXJlLmphdmEgYi9zZWN1cml0eS9vYXV0aDEtc2lnbmF0dXJlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb2F1dGgxL3NpZ25hdHVyZS9PQXV0aDFTaWduYXR1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTI3MmY5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvb2F1dGgxLXNpZ25hdHVyZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29hdXRoMS9zaWduYXR1cmUvT0F1dGgxU2lnbmF0dXJlLmphdmEKQEAgLTAsMCArMSwyNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkub2F1dGgxLnNpZ25hdHVyZTsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS51cmkuVXJpQ29tcG9uZW50OworCisvKioKKyAqIEluamVjdGFibGUgY2xhc3MgdXNlZCBmb3IgcHJvY2Vzc2luZyBhbiBPQXV0aCBzaWduYXR1cmUgKHNpZ25pbmcgb3IgdmVyaWZ5aW5nKS4KKyAqIDxwPgorICogRXhhbXBsZSBvZiB1c2FnZToKKyAqCisgKiA8cHJlPgorICogLy8gaW5qZWN0IHRoZSBPQXV0aDFTaWduYXR1cmUKKyAqICYjNjQ7SW5qZWN0CisgKiBPQXV0aDFTaWduYXR1cmUgb0F1dGhTaWduYXR1cmU7CisgKiAuLi4KKyAqCisgKiAvLyB3cmFwIGFuIGV4aXN0aW5nIHJlcXVlc3Qgd2l0aCBzb21lIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uCisgKiBPQXV0aDFSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgQ29uY3JldGVPQXV0aFJlcXVlc3RJbXBsZW1lbnRhdGlvbigpOworICoKKyAqIC8vIGVzdGFibGlzaCB0aGUgcGFyYW1ldGVycyB0aGF0IHdpbGwgYmUgdXNlZCB0byBzaWduIHRoZSByZXF1ZXN0CisgKiBPQXV0aDFQYXJhbWV0ZXJzIHBhcmFtcyA9IG5ldyBPQXV0aDFQYXJhbWV0ZXJzKCkuY29uc3VtZXJLZXkoImRwZjQzZjNwMmw0azNsMDMiKS4KKyAqICB0b2tlbigibm5jaDczNGQwMHNsMmpkayIpLnNpZ25hdHVyZU1ldGhvZChIbWFTaGExTWV0aG9kLk5BTUUpLgorICogIHRpbWVzdGFtcCgpLm5vbmNlKCkudmVyc2lvbigpOworICoKKyAqIC8vIGVzdGFibGlzaCB0aGUgc2VjcmV0cyB0aGF0IHdpbGwgYmUgdXNlZCB0byBzaWduIHRoZSByZXF1ZXN0CisgKiBPQXV0aDFTZWNyZXRzIHNlY3JldHMgPSBuZXcgT0F1dGgxU2VjcmV0cygpLmNvbnN1bWVyU2VjcmV0KCJrZDk0aGY5M2s0MjNrZjQ0IikuCisgKiAgdG9rZW5TZWNyZXQoInBma2tkaGk5c2wzcjRzMDAiKTsKKyAqCisgKiAvLyBnZW5lcmF0ZSB0aGUgZGlnaXRhbCBzaWduYXR1cmUgYW5kIHNldCBpbiB0aGUgcmVxdWVzdAorICogb0F1dGhTaWduYXR1cmUuc2lnbihyZXF1ZXN0LCBwYXJhbXMsIHNlY3JldHMpOworICogPC9wcmU+CisgKgorICogQGF1dGhvciBIdWJlcnQgQS4gTGUgVmFuIEdvbmcgPGh1YmVydC5sZXZhbmdvbmcgYXQgU3VuLkNPTT4KKyAqIEBhdXRob3IgUGF1bCBDLiBCcnlhbiA8cGJyeWFuQHN1bi5jb20+CisgKi8KK3B1YmxpYyBjbGFzcyBPQXV0aDFTaWduYXR1cmUgeworCisgICAgcHJpdmF0ZSBmaW5hbCBIYXNoTWFwPFN0cmluZywgT0F1dGgxU2lnbmF0dXJlTWV0aG9kPiBtZXRob2RzOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBPQXV0aCBzaWduYXR1cmUgY29uZmlndXJlZCB3aXRoIGluamVjdGVkIHtAY29kZSBTZXJ2aWNlTG9jYXRvcn0uCisgICAgICogQHBhcmFtIGluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uIG1hbmFnZXIKKyAgICAgKi8KKyAgICBASW5qZWN0CisgICAgcHVibGljIE9BdXRoMVNpZ25hdHVyZShmaW5hbCBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIpIHsKKyAgICAgICAgbWV0aG9kcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT0F1dGgxU2lnbmF0dXJlTWV0aG9kPigpOworICAgICAgICBmaW5hbCBMaXN0PE9BdXRoMVNpZ25hdHVyZU1ldGhvZD4gbWV0aG9kTGlzdCA9IGluamVjdGlvbk1hbmFnZXIuZ2V0QWxsSW5zdGFuY2VzKE9BdXRoMVNpZ25hdHVyZU1ldGhvZC5jbGFzcyk7CisgICAgICAgIGZvciAoZmluYWwgT0F1dGgxU2lnbmF0dXJlTWV0aG9kIG9BdXRoMVNpZ25hdHVyZU1ldGhvZCA6IG1ldGhvZExpc3QpIHsKKyAgICAgICAgICAgIG1ldGhvZHMucHV0KG9BdXRoMVNpZ25hdHVyZU1ldGhvZC5uYW1lKCksIG9BdXRoMVNpZ25hdHVyZU1ldGhvZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgYW5kIHJldHVybnMgYW4gT0F1dGggc2lnbmF0dXJlIGZvciB0aGUgZ2l2ZW4gcmVxdWVzdCwKKyAgICAgKiBwYXJhbWV0ZXJzIGFuZCBzZWNyZXRzLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgdGhlIHJlcXVlc3QgdG8gZ2VuZXJhdGUgc2lnbmF0dXJlIGZvci4KKyAgICAgKiBAcGFyYW0gcGFyYW1zIHRoZSBPQXV0aCBhdXRob3JpemF0aW9uIHBhcmFtZXRlcnMuCisgICAgICogQHBhcmFtIHNlY3JldHMgdGhlIHNlY3JldHMgdXNlZCB0byBnZW5lcmF0ZSB0aGUgT0F1dGggc2lnbmF0dXJlLgorICAgICAqIEByZXR1cm4gdGhlIE9BdXRoIGRpZ2l0YWwgc2lnbmF0dXJlLgorICAgICAqIEB0aHJvd3MgT0F1dGgxU2lnbmF0dXJlRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycmVkIGdlbmVyYXRpbmcgdGhlIHNpZ25hdHVyZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdlbmVyYXRlKGZpbmFsIE9BdXRoMVJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9BdXRoMVBhcmFtZXRlcnMgcGFyYW1zLCBmaW5hbCBPQXV0aDFTZWNyZXRzIHNlY3JldHMpIHRocm93cyBPQXV0aDFTaWduYXR1cmVFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0U2lnbmF0dXJlTWV0aG9kKHBhcmFtcykuc2lnbihiYXNlU3RyaW5nKHJlcXVlc3QsIHBhcmFtcyksIHNlY3JldHMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyBhbiBPQXV0aCBzaWduYXR1cmUgZm9yIHRoZSBnaXZlbiByZXF1ZXN0LCBwYXJhbWV0ZXJzIGFuZAorICAgICAqIHNlY3JldHMsIGFuZCBzdG9yZXMgaXQgYXMgYSBzaWduYXR1cmUgcGFyYW1ldGVyLCBhbmQgd3JpdGVzIHRoZQorICAgICAqIE9BdXRoIHBhcmFtZXRlcnMgdG8gdGhlIHJlcXVlc3QgYXMgYW4gQXV0aG9yaXphdGlvbiBoZWFkZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCB0aGUgcmVxdWVzdCB0byBnZW5lcmF0ZSBzaWduYXR1cmUgZm9yIGFuZCB3cml0ZSBoZWFkZXIgdG8uCisgICAgICogQHBhcmFtIHBhcmFtcyB0aGUgT0F1dGggYXV0aG9yaXphdGlvbiBwYXJhbWV0ZXJzLgorICAgICAqIEBwYXJhbSBzZWNyZXRzIHRoZSBzZWNyZXRzIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIE9BdXRoIHNpZ25hdHVyZS4KKyAgICAgKiBAdGhyb3dzIE9BdXRoMVNpZ25hdHVyZUV4Y2VwdGlvbiBpZiBhbiBlcnJvciBvY2N1cnJlZCBnZW5lcmF0aW5nIHRoZSBzaWduYXR1cmUuCisgICAgICovCisgICAgcHVibGljIHZvaWQgc2lnbihmaW5hbCBPQXV0aDFSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICBPQXV0aDFQYXJhbWV0ZXJzIHBhcmFtcywgZmluYWwgT0F1dGgxU2VjcmV0cyBzZWNyZXRzKSB0aHJvd3MgT0F1dGgxU2lnbmF0dXJlRXhjZXB0aW9uIHsKKyAgICAgICAgcGFyYW1zID0gcGFyYW1zLmNsb25lKCk7IC8vIGRvbid0IG1vZGlmeSBjYWxsZXIncyBwYXJhbWV0ZXJzCisgICAgICAgIHBhcmFtcy5zZXRTaWduYXR1cmUoZ2VuZXJhdGUocmVxdWVzdCwgcGFyYW1zLCBzZWNyZXRzKSk7CisgICAgICAgIHBhcmFtcy53cml0ZVJlcXVlc3QocmVxdWVzdCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmVyaWZpZXMgdGhlIE9BdXRoIHNpZ25hdHVyZSBmb3IgYSBnaXZlbiByZXF1ZXN0LCBwYXJhbWV0ZXJzIGFuZAorICAgICAqIHNlY3JldHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCB0aGUgcmVxdWVzdCB0byB2ZXJpZnkgdGhlIHNpZ25hdHVyZSBmcm9tLgorICAgICAqIEBwYXJhbSBwYXJhbXMgdGhlIE9BdXRoIGF1dGhvcml6YXRpb24gcGFyYW1ldGVycworICAgICAqIEBwYXJhbSBzZWNyZXRzIHRoZSBzZWNyZXRzIHVzZWQgdG8gdmVyaWZ5IHRoZSBPQXV0aCBzaWduYXR1cmUuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzaWduYXR1cmUgaXMgdmVyaWZpZWQuCisgICAgICogQHRocm93cyBPQXV0aDFTaWduYXR1cmVFeGNlcHRpb24gaWYgYW4gZXJyb3Igb2NjdXJyZWQgZ2VuZXJhdGluZyB0aGUgc2lnbmF0dXJlLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHZlcmlmeShmaW5hbCBPQXV0aDFSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9BdXRoMVBhcmFtZXRlcnMgcGFyYW1zLCBmaW5hbCBPQXV0aDFTZWNyZXRzIHNlY3JldHMpIHRocm93cyBPQXV0aDFTaWduYXR1cmVFeGNlcHRpb24geworICAgICAgICByZXR1cm4gZ2V0U2lnbmF0dXJlTWV0aG9kKHBhcmFtcykudmVyaWZ5KGJhc2VTdHJpbmcocmVxdWVzdCwgcGFyYW1zKSwgc2VjcmV0cywgcGFyYW1zLmdldFNpZ25hdHVyZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb2xsZWN0cywgc29ydHMgYW5kIGNvbmNldGVuYXRlcyB0aGUgcmVxdWVzdCBwYXJhbWV0ZXJzIGludG8gYQorICAgICAqIG5vcm1hbGl6ZWQgc3RyaW5nLCBwZXIgc2VjdGlvbiA5LjEuMS4gb2YgdGhlIE9BdXRoIDEuMCBzcGVjaWZpY2F0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3QgdGhlIHJlcXVlc3QgdG8gcmV0cmVpdmUgcGFyYW1ldGVycyBmcm9tLgorICAgICAqIEBwYXJhbSBwYXJhbXMgdGhlIE9BdXRoIGF1dGhvcml6YXRpb24gcGFyYW1ldGVycyB0byByZXRyaWV2ZSBwYXJhbWV0ZXJzIGZyb20uCisgICAgICogQHJldHVybiB0aGUgbm9ybWFsaXplZCBwYXJhbWV0ZXJzIHN0cmluZy4KKyAgICAgKi8KKyAgICBzdGF0aWMgU3RyaW5nIG5vcm1hbGl6ZVBhcmFtZXRlcnMoZmluYWwgT0F1dGgxUmVxdWVzdCByZXF1ZXN0LCBmaW5hbCBPQXV0aDFQYXJhbWV0ZXJzIHBhcmFtcykgeworCisgICAgICAgIGZpbmFsIEFycmF5TGlzdDxTdHJpbmdbXT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nW10+KCk7CisKKyAgICAgICAgLy8gcGFyYW1ldGVycyBpbiB0aGUgT0F1dGggSFRUUCBhdXRob3JpemF0aW9uIGhlYWRlcgorICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBrZXkgOiBwYXJhbXMua2V5U2V0KCkpIHsKKworICAgICAgICAgICAgLy8gZXhjbHVkZSByZWFsbSBhbmQgb2F1dGhfc2lnbmF0dXJlIHBhcmFtZXRlcnMgZnJvbSBPQXV0aCBIVFRQIGF1dGhvcml6YXRpb24gaGVhZGVyCisgICAgICAgICAgICBpZiAoa2V5LmVxdWFscyhPQXV0aDFQYXJhbWV0ZXJzLlJFQUxNKSB8fCBrZXkuZXF1YWxzKE9BdXRoMVBhcmFtZXRlcnMuU0lHTkFUVVJFKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUgPSBwYXJhbXMuZ2V0KGtleSk7CisKKyAgICAgICAgICAgIC8vIEVuY29kZSBrZXkgYW5kIHZhbHVlcyBhcyBwZXIgc2VjdGlvbiAzLjYgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtaGFtbWVyLW9hdXRoLTEwI3NlY3Rpb24tMy42CisgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGFkZFBhcmFtKGtleSwgdmFsdWUsIGxpc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gcGFyYW1ldGVycyBpbiB0aGUgSFRUUCBQT1NUIHJlcXVlc3QgYm9keSBhbmQgSFRUUCBHRVQgcGFyYW1ldGVycyBpbiB0aGUgcXVlcnkgcGFydAorICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBrZXkgOiByZXF1ZXN0LmdldFBhcmFtZXRlck5hbWVzKCkpIHsKKworICAgICAgICAgICAgLy8gaWdub3JlIHBhcmFtZXRlciBpZiBhbiBPQXV0aC1zcGVjaWZpYyBwYXJhbWV0ZXIgdGhhdCBhcHBlYXJzIGluIHRoZSBPQXV0aCBwYXJhbWV0ZXJzCisgICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoIm9hdXRoXyIpICYmIHBhcmFtcy5jb250YWluc0tleShrZXkpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHRoZSBzYW1lIHBhcmFtZXRlciBuYW1lIGNhbiBoYXZlIG11bHRpcGxlIHZhbHVlcworICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHZhbHVlcyA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyVmFsdWVzKGtleSk7CisKKyAgICAgICAgICAgIC8vIEVuY29kZSBrZXkgYW5kIHZhbHVlcyBhcyBwZXIgc2VjdGlvbiAzLjYgaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvZHJhZnQtaGFtbWVyLW9hdXRoLTEwI3NlY3Rpb24tMy42CisgICAgICAgICAgICBpZiAodmFsdWVzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyB2YWx1ZSA6IHZhbHVlcykgeworICAgICAgICAgICAgICAgICAgICBhZGRQYXJhbShrZXksIHZhbHVlLCBsaXN0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBzb3J0IG5hbWUtdmFsdWUgcGFpcnMgYnkgbmFtZQorICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGxpc3QsIG5ldyBDb21wYXJhdG9yPFN0cmluZ1tdPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlKGZpbmFsIFN0cmluZ1tdIHQsIGZpbmFsIFN0cmluZ1tdIHQxKSB7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGMgPSB0WzBdLmNvbXBhcmVUbyh0MVswXSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGMgPT0gMCA/IHRbMV0uY29tcGFyZVRvKHQxWzFdKSA6IGM7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVmID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworICAgICAgICAvLyBhcHBlbmQgZWFjaCBuYW1lLXZhbHVlIHBhaXIsIGRlbGltaXRlZCB3aXRoIGFtcGVyc2FuZAorICAgICAgICBmb3IgKGZpbmFsIEl0ZXJhdG9yPFN0cmluZ1tdPiBpID0gbGlzdC5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBwYXJhbSA9IGkubmV4dCgpOworICAgICAgICAgICAgYnVmLmFwcGVuZChwYXJhbVswXSkuYXBwZW5kKCI9IikuYXBwZW5kKHBhcmFtWzFdKTsKKyAgICAgICAgICAgIGlmIChpLmhhc05leHQoKSkgeworICAgICAgICAgICAgICAgIGJ1Zi5hcHBlbmQoJyYnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIHRoZSByZXF1ZXN0IFVSSSwgcGVyIHNlY3Rpb24gOS4xLjIgb2YgdGhlIE9BdXRoIDEuMAorICAgICAqIHNwZWNpZmljYXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdCB0aGUgaW5jb21pbmcgcmVxdWVzdCB0byBjb25zdHJ1Y3QgdGhlIFVSSSBmcm9tLgorICAgICAqIEByZXR1cm4gdGhlIGNvbnN0cnVjdGVkIFVSSS4KKyAgICAgKi8KKyAgICBwcml2YXRlIFVSSSBjb25zdHJ1Y3RSZXF1ZXN0VVJMKGZpbmFsIE9BdXRoMVJlcXVlc3QgcmVxdWVzdCkgdGhyb3dzIE9BdXRoMVNpZ25hdHVyZUV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBVUkwgdXJsID0gcmVxdWVzdC5nZXRSZXF1ZXN0VVJMKCk7CisgICAgICAgICAgICBpZiAodXJsID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT0F1dGgxU2lnbmF0dXJlRXhjZXB0aW9uKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcih1cmwuZ2V0UHJvdG9jb2woKSkuYXBwZW5kKCI6Ly8iKS5hcHBlbmQodXJsLmdldEhvc3QoKS50b0xvd2VyQ2FzZSgpKTsKKyAgICAgICAgICAgIGZpbmFsIGludCBwb3J0ID0gdXJsLmdldFBvcnQoKTsKKyAgICAgICAgICAgIGlmIChwb3J0ID4gMCAmJiBwb3J0ICE9IHVybC5nZXREZWZhdWx0UG9ydCgpKSB7CisgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJzonKS5hcHBlbmQocG9ydCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCh1cmwuZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVVJJKGJ1aWxkZXIudG9TdHJpbmcoKSk7CisKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgVVJJU3ludGF4RXhjZXB0aW9uIG11ZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE9BdXRoMVNpZ25hdHVyZUV4Y2VwdGlvbihtdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQXNzZW1ibGVzIHJlcXVlc3QgYmFzZSBzdHJpbmcgZm9yIHdoaWNoIGEgZGlnaXRhbCBzaWduYXR1cmUgaXMgdG8gYmUKKyAgICAgKiBnZW5lcmF0ZWQvdmVyaWZpZWQsIHBlciBzZWN0aW9uIDkuMS4zIG9mIHRoZSBPQXV0aCAxLjAgc3BlY2lmaWNhdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXF1ZXN0IHRoZSByZXF1ZXN0IGZyb20gd2hpY2ggdG8gYXNzZW1ibGUgYmFzZVN0cmluZy4KKyAgICAgKiBAcGFyYW0gcGFyYW1zIHRoZSBPQXV0aCBhdXRob3JpemF0aW9uIHBhcmFtZXRlcnMgZnJvbSB3aGljaCB0byBhc3NlbWJsZSBiYXNlU3RyaW5nLgorICAgICAqIEByZXR1cm4gdGhlIGNvbmNhdGVuYXRlZCBiYXNlU3RyaW5nLCByZWFkeSB0byBzaWduL3ZlcmlmeQorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIGJhc2VTdHJpbmcoZmluYWwgT0F1dGgxUmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT0F1dGgxUGFyYW1ldGVycyBwYXJhbXMpIHRocm93cyBPQXV0aDFTaWduYXR1cmVFeGNlcHRpb24geworICAgICAgICAvLyBIVFRQIHJlcXVlc3QgbWV0aG9kCisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKHJlcXVlc3QuZ2V0UmVxdWVzdE1ldGhvZCgpLnRvVXBwZXJDYXNlKCkpOworCisgICAgICAgIC8vIHJlcXVlc3QgVVJMLCBzZWUgc2VjdGlvbiAzLjQuMS4yIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL2RyYWZ0LWhhbW1lci1vYXV0aC0xMCNzZWN0aW9uLTMuNC4xLjIKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoJyYnKS5hcHBlbmQoVXJpQ29tcG9uZW50LmVuY29kZShjb25zdHJ1Y3RSZXF1ZXN0VVJMKHJlcXVlc3QpLnRvQVNDSUlTdHJpbmcoKSwKKyAgICAgICAgICAgICAgICBVcmlDb21wb25lbnQuVHlwZS5VTlJFU0VSVkVEKSk7CisKKyAgICAgICAgLy8gbm9ybWFsaXplZCByZXF1ZXN0IHBhcmFtZXRlcnMsIHNlZSBzZWN0aW9uIDMuNC4xLjMuMiBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9kcmFmdC1oYW1tZXItb2F1dGgtMTAjc2VjdGlvbi0zLjQuMS4zLjIKKyAgICAgICAgYnVpbGRlci5hcHBlbmQoJyYnKS5hcHBlbmQoVXJpQ29tcG9uZW50LmVuY29kZShub3JtYWxpemVQYXJhbWV0ZXJzKHJlcXVlc3QsIHBhcmFtcyksCisgICAgICAgICAgICAgICAgVXJpQ29tcG9uZW50LlR5cGUuVU5SRVNFUlZFRCkpOworCisgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIGFuIGluc3RhbmNlIG9mIGEgc2lnbmF0dXJlIG1ldGhvZCB0aGF0IGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlCisgICAgICogb3IgdmVyaWZ5IHNpZ25hdHVyZXMgZm9yIGRhdGEuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSByZXRyaWV2ZWQgc2lnbmF0dXJlIG1ldGhvZC4KKyAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkU2lnbmF0dXJlTWV0aG9kRXhjZXB0aW9uIGlmIHNpZ25hdHVyZSBtZXRob2Qgbm90IHN1cHBvcnRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIE9BdXRoMVNpZ25hdHVyZU1ldGhvZCBnZXRTaWduYXR1cmVNZXRob2QoZmluYWwgT0F1dGgxUGFyYW1ldGVycyBwYXJhbXMpCisgICAgICAgICAgICB0aHJvd3MgVW5zdXBwb3J0ZWRTaWduYXR1cmVNZXRob2RFeGNlcHRpb24geworICAgICAgICBmaW5hbCBPQXV0aDFTaWduYXR1cmVNZXRob2QgbWV0aG9kID0gbWV0aG9kcy5nZXQocGFyYW1zLmdldFNpZ25hdHVyZU1ldGhvZCgpKTsKKyAgICAgICAgaWYgKG1ldGhvZCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRTaWduYXR1cmVNZXRob2RFeGNlcHRpb24ocGFyYW1zLmdldFNpZ25hdHVyZU1ldGhvZCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbWV0aG9kOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgYWRkUGFyYW0oZmluYWwgU3RyaW5nIGtleSwgZmluYWwgU3RyaW5nIHZhbHVlLCBmaW5hbCBMaXN0PFN0cmluZ1tdPiBsaXN0KSB7CisgICAgICAgIGxpc3QuYWRkKG5ldyBTdHJpbmdbXSB7CisgICAgICAgICAgICAgICAgVXJpQ29tcG9uZW50LmVuY29kZShrZXksIFVyaUNvbXBvbmVudC5UeXBlLlVOUkVTRVJWRUQpLAorICAgICAgICAgICAgICAgIHZhbHVlID09IG51bGwgPyAiIiA6IFVyaUNvbXBvbmVudC5lbmNvZGUodmFsdWUsIFVyaUNvbXBvbmVudC5UeXBlLlVOUkVTRVJWRUQpCisgICAgICAgIH0pOworICAgIH0KKworfQorCmRpZmYgLS1naXQgYS9zZWN1cml0eS9vYXV0aDEtc2lnbmF0dXJlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb2F1dGgxL3NpZ25hdHVyZS9PQXV0aDFTaWduYXR1cmVFeGNlcHRpb24uamF2YSBiL3NlY3VyaXR5L29hdXRoMS1zaWduYXR1cmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vYXV0aDEvc2lnbmF0dXJlL09BdXRoMVNpZ25hdHVyZUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmYzFmM2QKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9vYXV0aDEtc2lnbmF0dXJlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb2F1dGgxL3NpZ25hdHVyZS9PQXV0aDFTaWduYXR1cmVFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9hdXRoMS5zaWduYXR1cmU7CisKKy8qKgorICogVGhyb3duIHRvIGluZGljYXRlIHRoYXQgYW4gT0F1dGggZXhjZXB0aW9uIG9jY3VycmVkLgorICoKKyAqIEBhdXRob3IgUGF1bCBDLiBCcnlhbiA8cGJyeWFuQHN1bi5jb20+CisgKi8KK3B1YmxpYyBjbGFzcyBPQXV0aDFTaWduYXR1cmVFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBPQXV0aCBzaWduYXR1cmUgZXhjZXB0aW9uIHdpdGggbm8gZGV0YWlsIG1lc3NhZ2UuCisgICAgICovCisgICAgcHVibGljIE9BdXRoMVNpZ25hdHVyZUV4Y2VwdGlvbigpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIE9BdXRoIHNpZ25hdHVyZSBleGNlcHRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIGRldGFpbAorICAgICAqIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcyB0aGUgZGV0YWlsIG1lc3NhZ2UuCisgICAgICovCisgICAgcHVibGljIE9BdXRoMVNpZ25hdHVyZUV4Y2VwdGlvbihTdHJpbmcgcykgeworICAgICAgICBzdXBlcihzKTsKKyAgICB9CisKKyAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gT0F1dGggc2lnbmF0dXJlIGV4Y2VwdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgY2F1c2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2F1c2UgdGhlIGNhdXNlIG9mIHRoZSBleGNlcHRpb24uCisgICAgICovCisgICAgcHVibGljIE9BdXRoMVNpZ25hdHVyZUV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgICAgc3VwZXIoY2F1c2UpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvb2F1dGgxLXNpZ25hdHVyZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29hdXRoMS9zaWduYXR1cmUvT0F1dGgxU2lnbmF0dXJlRmVhdHVyZS5qYXZhIGIvc2VjdXJpdHkvb2F1dGgxLXNpZ25hdHVyZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29hdXRoMS9zaWduYXR1cmUvT0F1dGgxU2lnbmF0dXJlRmVhdHVyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NWNjYTQKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9vYXV0aDEtc2lnbmF0dXJlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb2F1dGgxL3NpZ25hdHVyZS9PQXV0aDFTaWduYXR1cmVGZWF0dXJlLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5vYXV0aDEuc2lnbmF0dXJlOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkFic3RyYWN0QmluZGVyOworCisvKioKKyAqIEZlYXR1cmUgZW5hYmxpbmcgT0F1dGggc2lnbmF0dXJlIHN1cHBvcnQuIElmIHRoZSBmZWF0dXJlIGlzIHJlZ2lzdGVyZWQgdGhlCisgKiB7QGxpbmsgT0F1dGgxU2lnbmF0dXJlfSBjYW4gYmUgaW5qZWN0ZWQgdG8gSkFYLVJTIHJlc291cmNlcyBhbmQgcHJvdmlkZXJzCisgKiBhbmQgdXNlZCB0byBzaWduIGFuZCB2ZXJpZnkgT0F1dGggcmVxdWVzdHMuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgY2xhc3MgT0F1dGgxU2lnbmF0dXJlRmVhdHVyZSBpbXBsZW1lbnRzIEZlYXR1cmUgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZShGZWF0dXJlQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGlmICghY29udGV4dC5nZXRDb25maWd1cmF0aW9uKCkuaXNSZWdpc3RlcmVkKEJpbmRlci5jbGFzcykpIHsKKyAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIobmV3IEJpbmRlcigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCaW5kZXIgdGhhdCBiaW5kcyB7QGxpbmsgT0F1dGgxU2lnbmF0dXJlTWV0aG9kIHNpZ25hdHVyZSBtZXRob2RzfQorICAgICAqIGFuZCB7QGxpbmsgT0F1dGgxU2lnbmF0dXJlfS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgY2xhc3MgaXMgcGFja2FnZSBwcml2YXRlIGZvciB0ZXN0aW5nIHB1cnBvc2VzLgorICAgICAqIDxwLz4KKyAgICAgKgorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBCaW5kZXIgZXh0ZW5kcyBBYnN0cmFjdEJpbmRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIGJpbmQoUGxhaW50ZXh0TWV0aG9kLmNsYXNzKS50byhPQXV0aDFTaWduYXR1cmVNZXRob2QuY2xhc3MpLmluKFNpbmdsZXRvbi5jbGFzcyk7CisgICAgICAgICAgICBiaW5kKFJzYVNoYTFNZXRob2QuY2xhc3MpLnRvKE9BdXRoMVNpZ25hdHVyZU1ldGhvZC5jbGFzcykuaW4oU2luZ2xldG9uLmNsYXNzKTsKKyAgICAgICAgICAgIGJpbmQoSG1hU2hhMU1ldGhvZC5jbGFzcykudG8oT0F1dGgxU2lnbmF0dXJlTWV0aG9kLmNsYXNzKS5pbihTaW5nbGV0b24uY2xhc3MpOworICAgICAgICAgICAgYmluZEFzQ29udHJhY3QoT0F1dGgxU2lnbmF0dXJlLmNsYXNzKS5pbihTaW5nbGV0b24uY2xhc3MpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvb2F1dGgxLXNpZ25hdHVyZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29hdXRoMS9zaWduYXR1cmUvT0F1dGgxU2lnbmF0dXJlTWV0aG9kLmphdmEgYi9zZWN1cml0eS9vYXV0aDEtc2lnbmF0dXJlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb2F1dGgxL3NpZ25hdHVyZS9PQXV0aDFTaWduYXR1cmVNZXRob2QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2QyYTA5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvb2F1dGgxLXNpZ25hdHVyZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29hdXRoMS9zaWduYXR1cmUvT0F1dGgxU2lnbmF0dXJlTWV0aG9kLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5vYXV0aDEuc2lnbmF0dXJlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLkNvbnRyYWN0OworCisvKioKKyAqIEFuIGludGVyZmFjZSByZXByZXNlbnRpbmcgdGhlIE9BdXRoIHNpZ25hdHVyZSBtZXRob2QuCisgKgorICogQGF1dGhvciBIdWJlcnQgQS4gTGUgVmFuIEdvbmcgPGh1YmVydC5sZXZhbmdvbmcgYXQgU3VuLkNPTT4KKyAqIEBhdXRob3IgUGF1bCBDLiBCcnlhbiA8cGJyeWFuQHN1bi5jb20+CisgKi8KK0BDb250cmFjdAorcHVibGljIGludGVyZmFjZSBPQXV0aDFTaWduYXR1cmVNZXRob2QgeworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIHNpZ25hdHVyZSBtZXRob2QsIGFzIG5lZ290aWF0ZWQgdGhyb3VnaCB0aGUKKyAgICAgKiBPQXV0aCBwcm90b2NvbC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gU2lnbmF0dXJlIG1ldGhvZCBuYW1lLgorICAgICAqLworICAgICBwdWJsaWMgU3RyaW5nIG5hbWUoKTsKKworICAgIC8qKgorICAgICAqIFNpZ25zIHRoZSBkYXRhIHVzaW5nIHRoZSBzdXBwbGllZCBzZWNyZXQocykuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmFzZVN0cmluZyBhIHtAbGluayBTdHJpbmd9IHRoYXQgY29udGFpbnMgdGhlIHJlcXVlc3QgYmFzZVN0cmluZyB0byBiZSBzaWduZWQuCisgICAgICogQHBhcmFtIHNlY3JldHMgdGhlIHNlY3JldChzKSB0byB1c2UgdG8gc2lnbiB0aGUgZGF0YS4KKyAgICAgKiBAcmV0dXJuIGEge0BsaW5rIFN0cmluZ30gdGhhdCBjb250YWlucyB0aGUgc2lnbmF0dXJlLgorICAgICAqIEB0aHJvd3MgSW52YWxpZFNlY3JldEV4Y2VwdGlvbiBpZiBhIHN1cHBsaWVkIHNlY3JldCBpcyBub3QgdmFsaWQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBzaWduKFN0cmluZyBiYXNlU3RyaW5nLCBPQXV0aDFTZWNyZXRzIHNlY3JldHMpIHRocm93cyBJbnZhbGlkU2VjcmV0RXhjZXB0aW9uOworCisgICAgLyoqCisgICAgICogVmVyaWZpZXMgdGhlIHNpZ25hdHVyZSBmb3IgdGhlIGRhdGEgdXNpbmcgdGhlIHN1cHBsaWVkIHNlY3JldChzKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbGVtZW50cyBhIHtAbGluayBTdHJpbmd9IHRoYXQgY29udGFpbnMgdGhlIHJlcXVlc3QgZWxlbWVudHMgdG8gYmUgdmVyaWZpZWQuCisgICAgICogQHBhcmFtIHNlY3JldHMgdGhlIHNlY3JldChzKSB0byB1c2UgdG8gdmVyaWZ5IHRoZSBzaWduYXR1cmUuCisgICAgICogQHBhcmFtIHNpZ25hdHVyZSBhIHtAbGluayBTdHJpbmd9IHRoYXQgY29udGFpbnMgdGhlIHNpZ25hdHVyZSB0byBiZSB2ZXJpZmllZC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHNpZ25hdHVyZSBtYXRjaGVzIHRoZSBzZWNyZXRzIGFuZCBkYXRhLgorICAgICAqIEB0aHJvd3MgSW52YWxpZFNlY3JldEV4Y2VwdGlvbiBpZiBhIHN1cHBsaWVkIHNlY3JldCBpcyBub3QgdmFsaWQuCisgICAgICovCisgICAgcHVibGljIGJvb2xlYW4gdmVyaWZ5KFN0cmluZyBlbGVtZW50cywgT0F1dGgxU2VjcmV0cyBzZWNyZXRzLCBTdHJpbmcgc2lnbmF0dXJlKSB0aHJvd3MgSW52YWxpZFNlY3JldEV4Y2VwdGlvbjsKK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L29hdXRoMS1zaWduYXR1cmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vYXV0aDEvc2lnbmF0dXJlL1BsYWludGV4dE1ldGhvZC5qYXZhIGIvc2VjdXJpdHkvb2F1dGgxLXNpZ25hdHVyZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29hdXRoMS9zaWduYXR1cmUvUGxhaW50ZXh0TWV0aG9kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThiNDVhYgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L29hdXRoMS1zaWduYXR1cmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vYXV0aDEvc2lnbmF0dXJlL1BsYWludGV4dE1ldGhvZC5qYXZhCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkub2F1dGgxLnNpZ25hdHVyZTsKKworLyoqCisgKiBBbiBPQXV0aCBzaWduYXR1cmUgbWV0aG9kIHRoYXQgaW1wbGVtZW50cyBQbGFpbnRleHQuCisgKgorICogQGF1dGhvciBQYXVsIEMuIEJyeWFuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBQbGFpbnRleHRNZXRob2QgaW1wbGVtZW50cyBPQXV0aDFTaWduYXR1cmVNZXRob2QgeworCisgICAgLyoqCisgICAgICogTWV0aG9kIG5hbWUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTkFNRSA9ICJQTEFJTlRFWFQiOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBuYW1lKCkgeworICAgICAgICByZXR1cm4gTkFNRTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMgdGhlIFBMQUlOVEVYVCBzaWduYXR1cmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmFzZVN0cmluZyB0aGUgT0F1dGggZWxlbWVudHMgdG8gc2lnbiAoaWdub3JlZCkuCisgICAgICogQHBhcmFtIHNlY3JldHMgdGhlIHNoYXJlZCBzZWNyZXRzIHVzZWQgdG8gc2lnbiB0aGUgcmVxdWVzdC4KKyAgICAgKiBAcmV0dXJuIHRoZSBwbGFpbnRleHQgT0F1dGggc2lnbmF0dXJlLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgc2lnbihTdHJpbmcgYmFzZVN0cmluZywgT0F1dGgxU2VjcmV0cyBzZWNyZXRzKSB7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIFN0cmluZyBzZWNyZXQgPSBzZWNyZXRzLmdldENvbnN1bWVyU2VjcmV0KCk7CisgICAgICAgIGlmIChzZWNyZXQgIT0gbnVsbCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZChzZWNyZXQpOworICAgICAgICB9CisgICAgICAgIGJ1Zi5hcHBlbmQoJyYnKTsKKyAgICAgICAgc2VjcmV0ID0gc2VjcmV0cy5nZXRUb2tlblNlY3JldCgpOworICAgICAgICBpZiAoc2VjcmV0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoc2VjcmV0KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYnVmLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVmVyaWZpZXMgdGhlIFBsYWludGV4dCBzaWduYXR1cmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZWxlbWVudHMgT0F1dGggZWxlbWVudHMgKGlnbm9yZWQpLgorICAgICAqIEBwYXJhbSBzZWNyZXRzIHRoZSBzaGFyZWQgc2VjcmV0cyBmb3IgdmVyaWZ5aW5nIHRoZSBzaWduYXR1cmUuCisgICAgICogQHBhcmFtIHNpZ25hdHVyZSBwbGFpbnRleHQgT0F1dGggc2lnbmF0dXJlIHRvIGJlIHZlcmlmaWVkLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIHZlcmlmeShTdHJpbmcgZWxlbWVudHMsIE9BdXRoMVNlY3JldHMgc2VjcmV0cywgU3RyaW5nIHNpZ25hdHVyZSkgeworICAgICAgICByZXR1cm4gc2lnbihlbGVtZW50cywgc2VjcmV0cykuZXF1YWxzKHNpZ25hdHVyZSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9zZWN1cml0eS9vYXV0aDEtc2lnbmF0dXJlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb2F1dGgxL3NpZ25hdHVyZS9Sc2FTaGExTWV0aG9kLmphdmEgYi9zZWN1cml0eS9vYXV0aDEtc2lnbmF0dXJlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb2F1dGgxL3NpZ25hdHVyZS9Sc2FTaGExTWV0aG9kLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRiYTVlYwotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L29hdXRoMS1zaWduYXR1cmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vYXV0aDEvc2lnbmF0dXJlL1JzYVNoYTFNZXRob2QuamF2YQpAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5vYXV0aDEuc2lnbmF0dXJlOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkludmFsaWRLZXlFeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5LZXlGYWN0b3J5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuU2lnbmF0dXJlOworaW1wb3J0IGphdmEuc2VjdXJpdHkuU2lnbmF0dXJlRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuY2VydC5DZXJ0aWZpY2F0ZTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LmNlcnQuQ2VydGlmaWNhdGVGYWN0b3J5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5SU0FQcml2YXRlS2V5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuaW50ZXJmYWNlcy5SU0FQdWJsaWNLZXk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5zcGVjLkVuY29kZWRLZXlTcGVjOworaW1wb3J0IGphdmEuc2VjdXJpdHkuc3BlYy5JbnZhbGlkS2V5U3BlY0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LnNwZWMuUEtDUzhFbmNvZGVkS2V5U3BlYzsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5vYXV0aDEuc2lnbmF0dXJlLmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworCisvKioKKyAqIEFuIE9BdXRoIHNpZ25hdHVyZSBtZXRob2QgdGhhdCBpbXBsZW1lbnRzIFJTQS1TSEExLgorICoKKyAqIEBhdXRob3IgSHViZXJ0IEEuIExlIFZhbiBHb25nIDxodWJlcnQubGV2YW5nb25nIGF0IFN1bi5DT00+CisgKiBAYXV0aG9yIFBhdWwgQy4gQnJ5YW4gPHBicnlhbkBzdW4uY29tPgorICovCitwdWJsaWMgZmluYWwgY2xhc3MgUnNhU2hhMU1ldGhvZCBpbXBsZW1lbnRzIE9BdXRoMVNpZ25hdHVyZU1ldGhvZCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihSc2FTaGExTWV0aG9kLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIlJTQS1TSEExIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdOQVRVUkVfQUxHT1JJVEhNID0gIlNIQTF3aXRoUlNBIjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVFlQRSA9ICJSU0EiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJFR0lOX0NFUlQgPSAiLS0tLS1CRUdJTiBDRVJUSUZJQ0FURSI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIG5hbWUoKSB7CisgICAgICAgIHJldHVybiBOQU1FOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyB0aGUgUlNBLVNIQTEgc2lnbmF0dXJlIG9mIE9BdXRoIHJlcXVlc3QgZWxlbWVudHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmFzZVN0cmluZyB0aGUgY29tYmluZWQgT0F1dGggZWxlbWVudHMgdG8gc2lnbi4KKyAgICAgKiBAcGFyYW0gc2VjcmV0cyB0aGUgc2VjcmV0cyBvYmplY3QgY29udGFpbmluZyB0aGUgcHJpdmF0ZSBrZXkgZm9yIGdlbmVyYXRpbmcgdGhlIHNpZ25hdHVyZS4KKyAgICAgKiBAcmV0dXJuIHRoZSBPQXV0aCBzaWduYXR1cmUsIGluIGJhc2U2NC1lbmNvZGVkIGZvcm0uCisgICAgICogQHRocm93cyBJbnZhbGlkU2VjcmV0RXhjZXB0aW9uIGlmIHRoZSBzdXBwbGllZCBzZWNyZXQgaXMgbm90IHZhbGlkLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgc2lnbihmaW5hbCBTdHJpbmcgYmFzZVN0cmluZywgZmluYWwgT0F1dGgxU2VjcmV0cyBzZWNyZXRzKSB0aHJvd3MgSW52YWxpZFNlY3JldEV4Y2VwdGlvbiB7CisKKyAgICAgICAgZmluYWwgU2lnbmF0dXJlIHNpZ25hdHVyZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNpZ25hdHVyZSA9IFNpZ25hdHVyZS5nZXRJbnN0YW5jZShTSUdOQVRVUkVfQUxHT1JJVEhNKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIG5zYWUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24obnNhZSk7CisgICAgICAgIH0KKworICAgICAgICBieXRlW10gZGVjb2RlZFByaXZhdGVLZXk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkZWNvZGVkUHJpdmF0ZUtleSA9IEJhc2U2NC5kZWNvZGUoc2VjcmV0cy5nZXRDb25zdW1lclNlY3JldCgpKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFNlY3JldEV4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9JTlZBTElEX0NPTlNVTUVSX1NFQ1JFVChpb2UpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIEtleUZhY3Rvcnkga2V5RmFjdG9yeTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGtleUZhY3RvcnkgPSBLZXlGYWN0b3J5LmdldEluc3RhbmNlKEtFWV9UWVBFKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgTm9TdWNoQWxnb3JpdGhtRXhjZXB0aW9uIG5zYWUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24obnNhZSk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBFbmNvZGVkS2V5U3BlYyBrZXlTcGVjID0gbmV3IFBLQ1M4RW5jb2RlZEtleVNwZWMoZGVjb2RlZFByaXZhdGVLZXkpOworCisgICAgICAgIGZpbmFsIFJTQVByaXZhdGVLZXkgcnNhUHJpdmF0ZUtleTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJzYVByaXZhdGVLZXkgPSAoUlNBUHJpdmF0ZUtleSkga2V5RmFjdG9yeS5nZW5lcmF0ZVByaXZhdGUoa2V5U3BlYyk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEludmFsaWRLZXlTcGVjRXhjZXB0aW9uIGlrc2UpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oaWtzZSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2lnbmF0dXJlLmluaXRTaWduKHJzYVByaXZhdGVLZXkpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBJbnZhbGlkS2V5RXhjZXB0aW9uIGlrZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihpa2UpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNpZ25hdHVyZS51cGRhdGUoYmFzZVN0cmluZy5nZXRCeXRlcygpKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgU2lnbmF0dXJlRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGJ5dGVbXSByc2FzaGExOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByc2FzaGExID0gc2lnbmF0dXJlLnNpZ24oKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgU2lnbmF0dXJlRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBCYXNlNjQuZW5jb2RlKHJzYXNoYTEpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZlcmlmaWVzIHRoZSBSU0EtU0hBMSBzaWduYXR1cmUgb2YgT0F1dGggcmVxdWVzdCBlbGVtZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlbGVtZW50cyBPQXV0aCBlbGVtZW50cyBzaWduYXR1cmUgaXMgdG8gYmUgdmVyaWZpZWQgYWdhaW5zdC4KKyAgICAgKiBAcGFyYW0gc2VjcmV0cyB0aGUgc2VjcmV0cyBvYmplY3QgY29udGFpbmluZyB0aGUgcHVibGljIGtleSBmb3IgdmVyaWZ5aW5nIHRoZSBzaWduYXR1cmUuCisgICAgICogQHBhcmFtIHNpZ25hdHVyZSBiYXNlNjQtZW5jb2RlZCBPQXV0aCBzaWduYXR1cmUgdG8gYmUgdmVyaWZpZWQuCisgICAgICogQHRocm93cyBJbnZhbGlkU2VjcmV0RXhjZXB0aW9uIGlmIHRoZSBzdXBwbGllZCBzZWNyZXQgaXMgbm90IHZhbGlkLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIHZlcmlmeShmaW5hbCBTdHJpbmcgZWxlbWVudHMsIGZpbmFsIE9BdXRoMVNlY3JldHMgc2VjcmV0cywgZmluYWwgU3RyaW5nIHNpZ25hdHVyZSkKKyAgICAgICAgICAgIHRocm93cyBJbnZhbGlkU2VjcmV0RXhjZXB0aW9uIHsKKworICAgICAgICBmaW5hbCBTaWduYXR1cmUgc2lnOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzaWcgPSBTaWduYXR1cmUuZ2V0SW5zdGFuY2UoU0lHTkFUVVJFX0FMR09SSVRITSk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBuc2FlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKG5zYWUpOworICAgICAgICB9CisKKyAgICAgICAgUlNBUHVibGljS2V5IHJzYVB1YktleSA9IG51bGw7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHRtcGtleSA9IHNlY3JldHMuZ2V0Q29uc3VtZXJTZWNyZXQoKTsKKyAgICAgICAgaWYgKHRtcGtleS5zdGFydHNXaXRoKEJFR0lOX0NFUlQpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIENlcnRpZmljYXRlIGNlcnQgPSBudWxsOworICAgICAgICAgICAgICAgIGZpbmFsIEJ5dGVBcnJheUlucHV0U3RyZWFtIGJhaXMgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0odG1wa2V5LmdldEJ5dGVzKCkpOworICAgICAgICAgICAgICAgIGZpbmFsIEJ1ZmZlcmVkSW5wdXRTdHJlYW0gYmlzID0gbmV3IEJ1ZmZlcmVkSW5wdXRTdHJlYW0oYmFpcyk7CisgICAgICAgICAgICAgICAgZmluYWwgQ2VydGlmaWNhdGVGYWN0b3J5IGNlcnRmYWMgPSBDZXJ0aWZpY2F0ZUZhY3RvcnkuZ2V0SW5zdGFuY2UoIlguNTA5Iik7CisgICAgICAgICAgICAgICAgd2hpbGUgKGJpcy5hdmFpbGFibGUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgY2VydCA9IGNlcnRmYWMuZ2VuZXJhdGVDZXJ0aWZpY2F0ZShiaXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByc2FQdWJLZXkgPSAoUlNBUHVibGljS2V5KSBjZXJ0LmdldFB1YmxpY0tleSgpOworICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5TRVZFUkUsIExvY2FsaXphdGlvbk1lc3NhZ2VzLkVSUk9SX0NBTk5PVF9PQlRBSU5fUFVCTElDX0tFWSgpLCBleCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZmluYWwgYnl0ZVtdIGRlY29kZWRTaWduYXR1cmU7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBkZWNvZGVkU2lnbmF0dXJlID0gQmFzZTY0LmRlY29kZShzaWduYXR1cmUpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2lnLmluaXRWZXJpZnkocnNhUHViS2V5KTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSW52YWxpZEtleUV4Y2VwdGlvbiBpa2UpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oaWtlKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzaWcudXBkYXRlKGVsZW1lbnRzLmdldEJ5dGVzKCkpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBTaWduYXR1cmVFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oc2UpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBzaWcudmVyaWZ5KGRlY29kZWRTaWduYXR1cmUpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBTaWduYXR1cmVFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oc2UpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvb2F1dGgxLXNpZ25hdHVyZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29hdXRoMS9zaWduYXR1cmUvVW5zdXBwb3J0ZWRTaWduYXR1cmVNZXRob2RFeGNlcHRpb24uamF2YSBiL3NlY3VyaXR5L29hdXRoMS1zaWduYXR1cmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vYXV0aDEvc2lnbmF0dXJlL1Vuc3VwcG9ydGVkU2lnbmF0dXJlTWV0aG9kRXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZkYzc5ZgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L29hdXRoMS1zaWduYXR1cmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vYXV0aDEvc2lnbmF0dXJlL1Vuc3VwcG9ydGVkU2lnbmF0dXJlTWV0aG9kRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5vYXV0aDEuc2lnbmF0dXJlOworCisvKioKKyAqIFRocm93biB0byBpbmRpY2F0ZSB0aGF0IHRoZSBPQXV0aCBzaWduYXR1cmUgbWV0aG9kIHJlcXVlc3RlZCBpcyBub3QKKyAqIHN1cHBvcnRlZC4KKyAqCisgKiBAYXV0aG9yIFBhdWwgQy4gQnJ5YW4gPHBicnlhbkBzdW4uY29tPgorICovCitwdWJsaWMgY2xhc3MgVW5zdXBwb3J0ZWRTaWduYXR1cmVNZXRob2RFeGNlcHRpb24gZXh0ZW5kcyBPQXV0aDFTaWduYXR1cmVFeGNlcHRpb24geworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiB1bnN1cHBvcnRlZCBPQXV0aCBtZXRob2QgZXhjZXB0aW9uIHdpdGggbm8gZGV0YWlsIG1lc3NhZ2UuCisgICAgICovCisgICAgcHVibGljIFVuc3VwcG9ydGVkU2lnbmF0dXJlTWV0aG9kRXhjZXB0aW9uKCkgeworICAgICAgICBzdXBlcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gdW5zdXBwb3J0ZWQgT0F1dGggbWV0aG9kIGV4Y2VwdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBkZXRhaWwgbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzIHRoZSBkZXRhaWwgbWVzc2FnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVW5zdXBwb3J0ZWRTaWduYXR1cmVNZXRob2RFeGNlcHRpb24oU3RyaW5nIHMpIHsKKyAgICAgICAgc3VwZXIocyk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9zZWN1cml0eS9vYXV0aDEtc2lnbmF0dXJlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb2F1dGgxL3NpZ25hdHVyZS9wYWNrYWdlLWluZm8uamF2YSBiL3NlY3VyaXR5L29hdXRoMS1zaWduYXR1cmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vYXV0aDEvc2lnbmF0dXJlL3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YTE3ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9vYXV0aDEtc2lnbmF0dXJlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb2F1dGgxL3NpZ25hdHVyZS9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvKioKKyAqIEplcnNleSBPQXV0aCAxIFNpZ25hdHVyZSBBUEkgYW5kIEltcGxlbWVudGF0aW9uLgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9hdXRoMS5zaWduYXR1cmU7CmRpZmYgLS1naXQgYS9zZWN1cml0eS9vYXV0aDEtc2lnbmF0dXJlL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9vYXV0aDEvc2lnbmF0dXJlL2ludGVybmFsL2xvY2FsaXphdGlvbi5wcm9wZXJ0aWVzIGIvc2VjdXJpdHkvb2F1dGgxLXNpZ25hdHVyZS9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb2F1dGgxL3NpZ25hdHVyZS9pbnRlcm5hbC9sb2NhbGl6YXRpb24ucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmIzZGY1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvb2F1dGgxLXNpZ25hdHVyZS9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb2F1dGgxL3NpZ25hdHVyZS9pbnRlcm5hbC9sb2NhbGl6YXRpb24ucHJvcGVydGllcwpAQCAtMCwwICsxLDIwIEBACisjCisjIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorIworIyBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisjIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyMgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisjIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyMKKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisjCisKK2Vycm9yLmJhc2U2NC5sZW5ndGg9QmFzZTY0IHN0cmluZyBsZW5ndGggaXMgbm90IG11bHRpcGxlIG9mIDQuCitlcnJvci5iYXNlNjQuaW52YWxpZC5jaGFyYWN0ZXI9SW52YWxpZCBjaGFyYWN0ZXIgaW4gQmFzZTY0IHN0cmluZy4KK2Vycm9yLmludmFsaWQuY29uc3VtZXIuc2VjcmV0PUludmFsaWQgY29uc3VtZXIgc2VjcmV0OiB7MH0KK2Vycm9yLmNhbm5vdC5vYnRhaW4ucHVibGljLmtleT1Db3VsZG4nJ3Qgb2J0YWluIHB1YmxpYyBrZXkgZnJvbSBjb25zdW1lciBzZWNyZXQuCmRpZmYgLS1naXQgYS9zZWN1cml0eS9vYXV0aDEtc2lnbmF0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb2F1dGgxL3NpZ25hdHVyZS9EdW1teVJlcXVlc3QuamF2YSBiL3NlY3VyaXR5L29hdXRoMS1zaWduYXR1cmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vYXV0aDEvc2lnbmF0dXJlL0R1bW15UmVxdWVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5YTk3MjUKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9vYXV0aDEtc2lnbmF0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb2F1dGgxL3NpZ25hdHVyZS9EdW1teVJlcXVlc3QuamF2YQpAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5vYXV0aDEuc2lnbmF0dXJlOworCitpbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvKioKKyAqIEBhdXRob3IgUGF1bCBDLiBCcnlhbiA8cGJyeWFuQHN1bi5jb20+CisgKi8KK2NsYXNzIER1bW15UmVxdWVzdCBpbXBsZW1lbnRzIE9BdXRoMVJlcXVlc3QgeworCisgICAgcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgQXJyYXlMaXN0PFN0cmluZz4+IGhlYWRlcnMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEFycmF5TGlzdDxTdHJpbmc+PigpOworCisgICAgcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgQXJyYXlMaXN0PFN0cmluZz4+IHBhcmFtcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgQXJyYXlMaXN0PFN0cmluZz4+KCk7CisKKyAgICBwcml2YXRlIFN0cmluZyByZXF1ZXN0TWV0aG9kOworCisgICAgcHJpdmF0ZSBTdHJpbmcgcmVxdWVzdFVSTDsKKworICAgIHB1YmxpYyBEdW1teVJlcXVlc3QoKSB7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRSZXF1ZXN0TWV0aG9kKCkgeworICAgICAgICByZXR1cm4gcmVxdWVzdE1ldGhvZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0TWV0aG9kKFN0cmluZyBtZXRob2QpIHsKKyAgICAgICAgcmVxdWVzdE1ldGhvZCA9IG1ldGhvZDsKKyAgICB9CisKKyAgICBwdWJsaWMgRHVtbXlSZXF1ZXN0IHJlcXVlc3RNZXRob2QoU3RyaW5nIG1ldGhvZCkgeworICAgICAgICBzZXRSZXF1ZXN0TWV0aG9kKG1ldGhvZCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBVUkwgZ2V0UmVxdWVzdFVSTCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVVJMKHJlcXVlc3RVUkwpOworICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoRHVtbXlSZXF1ZXN0LmNsYXNzLmdldE5hbWUoKSkubG9nKExldmVsLlNFVkVSRSwgbnVsbCwgZXgpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0VVJMKFN0cmluZyB1cmwpIHsKKyAgICAgICAgcmVxdWVzdFVSTCA9IHVybDsKKyAgICB9CisKKyAgICBwdWJsaWMgRHVtbXlSZXF1ZXN0IHJlcXVlc3RVUkwoU3RyaW5nIHVybCkgeworICAgICAgICBzZXRSZXF1ZXN0VVJMKHVybCk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0SGVhZGVyVmFsdWVzKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBoZWFkZXJzLmdldChuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRIZWFkZXJWYWx1ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHZhbHVlcyA9IGhlYWRlcnMuZ2V0KG5hbWUpOworICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHZhbHVlcyA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOworICAgICAgICAgICAgaGVhZGVycy5wdXQobmFtZSwgdmFsdWVzKTsKKyAgICAgICAgfQorICAgICAgICB2YWx1ZXMuYWRkKHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRHVtbXlSZXF1ZXN0IGhlYWRlclZhbHVlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgYWRkSGVhZGVyVmFsdWUobmFtZSwgdmFsdWUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0UGFyYW1ldGVyTmFtZXMoKSB7CisgICAgICAgIHJldHVybiBwYXJhbXMua2V5U2V0KCk7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRQYXJhbWV0ZXJWYWx1ZXMoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIHBhcmFtcy5nZXQobmFtZSk7CisgICAgfQorCisgICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZFBhcmFtZXRlclZhbHVlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gdmFsdWVzID0gcGFyYW1zLmdldChuYW1lKTsKKyAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7CisgICAgICAgICAgICB2YWx1ZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKKyAgICAgICAgICAgIHBhcmFtcy5wdXQobmFtZSwgdmFsdWVzKTsKKyAgICAgICAgfQorICAgICAgICB2YWx1ZXMuYWRkKHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgRHVtbXlSZXF1ZXN0IHBhcmFtZXRlclZhbHVlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgYWRkUGFyYW1ldGVyVmFsdWUobmFtZSwgdmFsdWUpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9vYXV0aDEtc2lnbmF0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb2F1dGgxL3NpZ25hdHVyZS9PQXV0aDFTaWduYXR1cmVUZXN0LmphdmEgYi9zZWN1cml0eS9vYXV0aDEtc2lnbmF0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb2F1dGgxL3NpZ25hdHVyZS9PQXV0aDFTaWduYXR1cmVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU0MGViNAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L29hdXRoMS1zaWduYXR1cmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vYXV0aDEvc2lnbmF0dXJlL09BdXRoMVNpZ25hdHVyZVRlc3QuamF2YQpAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5vYXV0aDEuc2lnbmF0dXJlOworCitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRIYXNoTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICoKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitwdWJsaWMgY2xhc3MgT0F1dGgxU2lnbmF0dXJlVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb3JtYWxpemVQYXJhbWV0ZXJzKCkgeworICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zID0gbmV3IE11bHRpdmFsdWVkSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgcGFyYW1zLmFkZCgib3JnLWNvdW50cnkiLCAiVVMiKTsKKyAgICAgICAgcGFyYW1zLmFkZCgib3JnIiwgImFjbWUiKTsKKyAgICAgICAgcGFyYW1zLmFkZCgiYSIsICJiIik7CisgICAgICAgIHBhcmFtcy5hZGQoIm9yZyIsICJkdW1teSIpOworCisgICAgICAgIFN0cmluZyBub3JtYWxpemVkUGFyYW1zID0gT0F1dGgxU2lnbmF0dXJlLm5vcm1hbGl6ZVBhcmFtZXRlcnMobmV3IE9BdXRoMVJlcXVlc3QoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdE1ldGhvZCgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgeWV0LiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBVUkwgZ2V0UmVxdWVzdFVSTCgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgeWV0LiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRQYXJhbWV0ZXJOYW1lcygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW1zLmtleVNldCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UGFyYW1ldGVyVmFsdWVzKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtcy5nZXQobmFtZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRIZWFkZXJWYWx1ZXMoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgeWV0LiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFkZEhlYWRlclZhbHVlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCB5ZXQuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0sIG5ldyBPQXV0aDFQYXJhbWV0ZXJzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImE9YiZvcmc9YWNtZSZvcmc9ZHVtbXkmb3JnLWNvdW50cnk9VVMiLCBub3JtYWxpemVkUGFyYW1zKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsUGFyYW1WYWx1ZSgpIHsKKyAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtcyA9IG5ldyBNdWx0aXZhbHVlZEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgICAgIHBhcmFtcy5hZGQoIm9yZy1jb3VudHJ5IiwgIlVTIik7CisgICAgICAgIHBhcmFtcy5wdXQoIm9yZyIsIEFycmF5cy5hc0xpc3QobmV3IFN0cmluZ1tde251bGx9KSk7CisgICAgICAgIHBhcmFtcy5hZGQoImEiLCAiYiIpOworCisgICAgICAgIFN0cmluZyBub3JtYWxpemVkUGFyYW1zID0gT0F1dGgxU2lnbmF0dXJlLm5vcm1hbGl6ZVBhcmFtZXRlcnMobmV3IE9BdXRoMVJlcXVlc3QoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdE1ldGhvZCgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgeWV0LiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBVUkwgZ2V0UmVxdWVzdFVSTCgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgeWV0LiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTZXQ8U3RyaW5nPiBnZXRQYXJhbWV0ZXJOYW1lcygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcGFyYW1zLmtleVNldCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UGFyYW1ldGVyVmFsdWVzKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHBhcmFtcy5nZXQobmFtZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRIZWFkZXJWYWx1ZXMoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgeWV0LiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFkZEhlYWRlclZhbHVlKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCB5ZXQuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0sIG5ldyBPQXV0aDFQYXJhbWV0ZXJzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImE9YiZvcmc9Jm9yZy1jb3VudHJ5PVVTIiwgbm9ybWFsaXplZFBhcmFtcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvb2F1dGgxLXNpZ25hdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29hdXRoMS9zaWduYXR1cmUvT0F1dGhCYXNlNjRUZXN0LmphdmEgYi9zZWN1cml0eS9vYXV0aDEtc2lnbmF0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb2F1dGgxL3NpZ25hdHVyZS9PQXV0aEJhc2U2NFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTg3ZmExCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvb2F1dGgxLXNpZ25hdHVyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29hdXRoMS9zaWduYXR1cmUvT0F1dGhCYXNlNjRUZXN0LmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5vYXV0aDEuc2lnbmF0dXJlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIE9BdXRoQmFzZTY0VGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgc3RyID0gIkhlbGxvIFdvcmxkMTIzNDU2Nzg5amhmc2xqa2gzNDd1d2VpaGQ3ODM0eWZvaXVoZWY1cmU0ZzU0ZXMzNWdmNDc0dzUvIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWQgPSBCYXNlNjQuZW5jb2RlKHN0ci5nZXRCeXRlcygpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRVdGlsID0gbmV3IFN0cmluZyhvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLkJhc2U2NC5lbmNvZGUoc3RyLmdldEJ5dGVzKCkpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGVuY29kZWRVdGlsU3RyID0gb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5CYXNlNjQuZW5jb2RlQXNTdHJpbmcoc3RyKTsKKworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oZW5jb2RlZCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZW5jb2RlZCwgZW5jb2RlZFV0aWwpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGVuY29kZWQsIGVuY29kZWRVdGlsU3RyKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgZGVjb2RlZCA9IG5ldyBTdHJpbmcoQmFzZTY0LmRlY29kZShlbmNvZGVkKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBkZWNvZGVkVXRpbCA9IG5ldyBTdHJpbmcob3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5CYXNlNjQuZGVjb2RlKGVuY29kZWQuZ2V0Qnl0ZXMoKSkpOworICAgICAgICBmaW5hbCBTdHJpbmcgZGVjb2RlZFV0aWxTdHIgPSBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLkJhc2U2NC5kZWNvZGVBc1N0cmluZyhlbmNvZGVkLmdldEJ5dGVzKCkpOworICAgICAgICBmaW5hbCBTdHJpbmcgZGVjb2RlZFV0aWxTdHIyID0gb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5CYXNlNjQuZGVjb2RlQXNTdHJpbmcoZW5jb2RlZCk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhkZWNvZGVkLCBkZWNvZGVkVXRpbCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZGVjb2RlZCwgZGVjb2RlZFV0aWxTdHIpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGRlY29kZWQsIGRlY29kZWRVdGlsU3RyMik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZGVjb2RlZCwgc3RyKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9vYXV0aDEtc2lnbmF0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb2F1dGgxL3NpZ25hdHVyZS9TaWduYXR1cmVUZXN0LmphdmEgYi9zZWN1cml0eS9vYXV0aDEtc2lnbmF0dXJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb2F1dGgxL3NpZ25hdHVyZS9TaWduYXR1cmVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQzMzAxNQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L29hdXRoMS1zaWduYXR1cmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vYXV0aDEvc2lnbmF0dXJlL1NpZ25hdHVyZVRlc3QuamF2YQpAQCAtMCwwICsxLDM1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5vYXV0aDEuc2lnbmF0dXJlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudXJpLlVyaUNvbXBvbmVudDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICogQGF1dGhvciBQYXVsIEMuIEJyeWFuIDxwYnJ5YW5Ac3VuLmNvbT4KKyAqIEBhdXRob3IgSHViZXJ0IEEuIExlIFZhbiBHb25nIDxodWJlcnQubGV2YW5nb25nIGF0IFN1bi5DT00+CisgKi8KK3B1YmxpYyBjbGFzcyBTaWduYXR1cmVUZXN0IHsKKworICAgIC8vIHZhbHVlcyBmcm9tIE9BdXRoIHNwZWNpZmljYXRpb24gYXBwZW5kaWNlcyB0byBkZW1vbnN0cmF0ZSBwcm90b2NvbCBvcGVyYXRpb24KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVBTE0gPSAiaHR0cDovL3Bob3Rvcy5leGFtcGxlLm5ldC8iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05TVU1FUl9LRVkgPSAiZHBmNDNmM3AybDRrM2wwMyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFDQ0VTU19UT0tFTiA9ICJubmNoNzM0ZDAwc2wyamRrIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0lHTkFUVVJFX01FVEhPRCA9IEhtYVNoYTFNZXRob2QuTkFNRTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVElNRVNUQU1QID0gIjExOTEyNDIwOTYiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBOT05DRSA9ICJrbGxvOTk0MHBkOTMzM2poIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkVSU0lPTiA9ICIxLjAiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTSUdOQVRVUkUgPSAidFIzK1R5ODFsTWVZQXIvRmlkMGtNVFlhL1dNPSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUlNBX1BSSVZLRVkgPQorICAgICAgICAgICAgIk1JSUNkZ0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQW1Bd2dnSmNBZ0VBQW9HQkFMUmlNTEFoOWlpbXVyOFYiCisgICAgICAgICAgICAgICAgICAgICsgIkE3cVZ2ZHF4ZXZFdVVrVzRLKzJLZE1YbW5RYkc5QWE3azdlQmpLMVMrMExZbVZqUEtsSkdOWEhER3V5NUZ3L2QiCisgICAgICAgICAgICAgICAgICAgICsgIjdyalZKMEJMQit1YlBLOGlBL1R3M2hMUWdYTVJSR1JYWENuOGlrZnVRZmpVUzF1WlNhdGRMQjgxbXlkQkVUbEoiCisgICAgICAgICAgICAgICAgICAgICsgImhJNkdINHR3cmJESkNSMkJ3eS9YV1hncWdHUnpBZ01CQUFFQ2dZQllXVnRsZVV6YXZrYnJQankwVDVGTW91OEgiCisgICAgICAgICAgICAgICAgICAgICsgIlg5dTJBQzJyeTh2RC9sN2NxZWR0d01QcDlrN1R1YmdORm8rTkd2S3NsMnlueXByT1pSMXhqUTdXZ3JnVkIrbW0iCisgICAgICAgICAgICAgICAgICAgICsgInVTY09NLzVIVmNlRnVHUkRoWVRDT2JFK3kxa3hSbG9OWVhueDNlaTF6YmVZTFBDSGRoeFJZVzdUMHFjeW5ObXciCisgICAgICAgICAgICAgICAgICAgICsgInJuMDUvS08yUkxqZ1FOYWxzUUpCQU5lQTNRNE51Z3F5NFFCVUNFQzA5U3F5bFQySzlGcnJJdHFMMlFLYzl2MFoiCisgICAgICAgICAgICAgICAgICAgICsgInpPMnV3bGxDYmcwZHdwVnVZUFlYWXZpa05ISGcrYUNXRitWWHNiOXJwUHNDUVFEV1I5VFQ0T1Jkem9qK05jY24iCisgICAgICAgICAgICAgICAgICAgICsgInFrTXNEbXp0MEVmTmFBT3dIT21WSjJSVkJzcFBjeHQ1aU40SEk3SE5lRzZVNVlzRkJiKy9HWmJnZkJUM2twTkciCisgICAgICAgICAgICAgICAgICAgICsgIldQVHBBa0JJK2dGaGpmSnZSdzM4bjNnLytVZUFrd01JMlRKUVM0bjgraGlkMHV1czMvek9qRHlTSDNYSENVbm8iCisgICAgICAgICAgICAgICAgICAgICsgImNuMXhPSkF5Wk9EQm80N0UrNjdSNGpWMS9nemJBa0VBa2xKYXNwUlBYUDg3N05zc001bkFaTVUwL08vTkdDWisiCisgICAgICAgICAgICAgICAgICAgICsgIjNqUGdEVW5vNldiSm41Y3FtOE1xV2hXMXhHa0ltZ1JrK2ZrREJxdWlxNGdQaVQ4OThqdXNnUUpBZDVacnI2UTgiCisgICAgICAgICAgICAgICAgICAgICsgIkFPLzBpc3IvM2FhNk82TkxReElTTEtjUERrMk5PY2NBZlMveE90Zk96NHNKWU0zK0JzNElvOStkWkdTRENBNTQiCisgICAgICAgICAgICAgICAgICAgICsgIkx3MDNlSFROUWdoUzBBPT0iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSU0FfQ0VSVElGSUNBVEUgPQorICAgICAgICAgICAgIi0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLVxuIgorICAgICAgICAgICAgICAgICAgICArICJNSUlCcGpDQ0FRK2dBd0lCQWdJQkFUQU5CZ2txaGtpRzl3MEJBUVVGQURBWk1SY3dGUVlEVlFRRERBNVVaWE4wXG4iCisgICAgICAgICAgICAgICAgICAgICsgIklGQnlhVzVqYVhCaGJEQWVGdzAzTURBeE1ERXdPREF3TURCYUZ3MHpPREV5TXpFd09EQXdNREJhTUJreEZ6QVZcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiQmdOVkJBTU1EbFJsYzNRZ1VISnBibU5wY0dGc01JR2ZNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0R05BRENCaVFLQlxuIgorICAgICAgICAgICAgICAgICAgICArICJnUUMwWWpDd0lmWW9wcnEvRlFPNmxiM2FzWHJ4TGxKRnVDdnRpblRGNXAwR3h2UUd1NU8zZ1l5dFV2dEMySmxZXG4iCisgICAgICAgICAgICAgICAgICAgICsgInp5cFNSalZ4d3hyc3VSY1AzZTY0MVNkQVN3ZnJtenl2SWdQMDhONFMwSUZ6RVVSa1Yxd3AvSXBIN2tINDFFdGJcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAibVVtclhTd2ZOWnNuUVJFNVNZU09oaCtMY0syd3lRa2RnY012MTFsNEtvQmtjd0lEQVFBQk1BMEdDU3FHU0liM1xuIgorICAgICAgICAgICAgICAgICAgICArICJEUUVCQlFVQUE0R0JBR1pMUEV1SjVTaUoycnlxK0NtRUdPWGZ2bFR0RUwybnVHdHI5UGV3eGtnbk9qWnBVeStkXG4iCisgICAgICAgICAgICAgICAgICAgICsgIjRUdnVYSmJOUWM4ZjRBTVdML3RPOXcwRms4MHJXS3A5ZWE4L2RmNHFNcTVxbEZXbHg2eU9MUXh1bU5PbUVDS2JcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiV3BrVVFESURKRW9GVXpLTVZ1SmY0S08vRkozNDUrQk5MR2diSjZXdWpyZW9NMVgvZ1lmZG5KL0pcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJTQV9TSUdOQVRVUkUgPSAianZUcC93WDFUWXRCeUIxbStQYnlvMGxuQ09MSSIKKyAgICAgICAgICAgICsgInN5R0NIN3drZThBVXMzQnBud1pKdEF1RUprdlFMMi85bjRzNXdVbVVsNGFDSTRCd3ByYU54NFJ0RVhNZTVxZzUiCisgICAgICAgICAgICArICJUMUxWVEdsaU1ScEthc0tzVy8vZStSaW5oZWpnQ3V6b0gyNmR5RjhpWTJaWi81RDFpbGdlaWpoVi92QmthNXR3IgorICAgICAgICAgICAgKyAidDM5OW1Yd2FZZEN3RllFPSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJTQV9TSUdOQVRVUkVfRU5DT0RFRCA9CisgICAgICAgICAgICAianZUcCUyRndYMVRZdEJ5QjFtJTJCUGJ5bzBsbkNPTElzeUdDSDd3a2U4QVVzM0JwbndaSnRBdUVKa3ZRTDIlMiIKKyAgICAgICAgICAgICAgICAgICAgKyAiRjluNHM1d1VtVWw0YUNJNEJ3cHJhTng0UnRFWE1lNXFnNVQxTFZUR2xpTVJwS2FzS3NXJTJGJTJGZSUyQlJpbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiaGVqZ0N1em9IMjZkeUY4aVkyWlolMkY1RDFpbGdlaWpoViUyRnZCa2E1dHd0Mzk5bVh3YVlkQ3dGWUUlM0QiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJTQV9ET0NTX1BSSVZLRVkgPQorICAgICAgICAgICAgIk1JSUV2Z0lCQURBTkJna3Foa2lHOXcwQkFRRUZBQVNDQktnd2dnU2tBZ0VBQW9JQkFRQ2RpU3BMSm0zdU1jWnYiCisgICAgICAgICAgICAgICAgICAgICsgIlQzalVuM1NUaEliMFN4RlpUZytJdzVJbExSMkI1eEhwckFuaTNTRWhZMGZ2cFhVRWwvb1dESWxrKyswbmkvd3QiCisgICAgICAgICAgICAgICAgICAgICsgInVKMmZkamVCMW1UMzVrTmRhS0Jvam15TE1Id1RjMXp2MXphbGRYQUFDa2hFcmFBMHRVRlNtdWRFeERKOXBuZ0IiCisgICAgICAgICAgICAgICAgICAgICsgIlp1SWtGLzdmczZqaFducW9IR0VSdlY5YSsvaW13b1JLZ1lVcnJOK3ROTzRDVTY4aEpxUmVES3dEV1MwaFRyRFYiCisgICAgICAgICAgICAgICAgICAgICsgIndqRUNCY1NIZVo5MkZybEJwNUMrSkZMNTZRdmpkWWRwTjRRV0JXVktEK3QzWUlTZFVpT2JsOWY2emJHWWVNY2QiCisgICAgICAgICAgICAgICAgICAgICsgIm9tTkxsWTBZejkreU1SSmhHWkpKSXg2ZnRRYmcvWTlyV3RzZ0t2SFBnalNTK1NDUkJwOGxsWnQ4UVp3QUFFSFAiCisgICAgICAgICAgICAgICAgICAgICsgInFaZVU0akJWQWdNQkFBRUNnZ0VCQUlYRE5QMHdlVUU2VkhLcE9VRFkwQ1I5OEJVNE5GZnU5ek82VTdwclQxWEEiCisgICAgICAgICAgICAgICAgICAgICsgInZTMzdYVDJiWTRrMUFwelNrY1Mvd3FLOExHRnBwQm5qTzlJYW93UUdYZVZLQk51VlVmZmJZZkRGbGhhdHFYemUiCisgICAgICAgICAgICAgICAgICAgICsgImhMaEZ0ZW5TQ0xLUUNJTUFKanI2K0tkS1Rqck9tTXlsNzluSTRSV2lwbENOL1VTMERkZjJtTmwyUWFSQXRRWHEiCisgICAgICAgICAgICAgICAgICAgICsgImFUcHMwMnFNbjBEcmViTWczdThGYjdWR0NhWjYwTEthZmhEa2VMcmg5Y2RiTVlaR3kwc3FaWHhrUXAveWdqRTAiCisgICAgICAgICAgICAgICAgICAgICsgImxjMTlmaWw2cVBWRjhzNDUrL0JqZUJIWUZIM2h2WVJzUFlvQURzUjYzcmtoUDgxQUxxSFoxQU1vbXZZUDBkNHciCisgICAgICAgICAgICAgICAgICAgICsgImQ5S1VmRWd6Y0RSaXY0Mlk3ZFpRQjZhY0ltSlBsK25XcHBQUXhKYUo2MVVDZ1lFQXpxcnh5eHRScjhwc0lMV1oiCisgICAgICAgICAgICAgICAgICAgICsgIkJlYUVrNmJ0RUlNNnQ5OTVoSEhxNlhZc1JEbWhnMzByNVYvbEo3dTJycktSV0phaWFNUEpVbUsyYXV0REFaa0kiCisgICAgICAgICAgICAgICAgICAgICsgIi9IdWh5T2FPS01VOEZKeitMSWZXUUQrVUNEQWRGNzM3eXdCY3R3R3pxOW55cGkweEtqMU9ZUUNUenhUMWhhVFAiCisgICAgICAgICAgICAgICAgICAgICsgIkdWYUR2Y2dIaHdhcXpUNXJ1K0lUY1RGdUpJc0NnWUVBd3lQZGFRMmd3cDVlT2NDRTc5MVB5dUNvUktEU1B4emciCisgICAgICAgICAgICAgICAgICAgICsgImFMN3ZwbEZzOUtXK295S2xkSWRzR0E2R0k0LzIzWWRiWVRiTVNjMWNqblFyZS9NZmZrSGlxWmsxaXhpWUlDWWoiCisgICAgICAgICAgICAgICAgICAgICsgInloTUNWTHo5bTUzZlhtVVRPTzZ3NVdVNzdFajkrZ0wwMk1QeGJDMGsvMGRUMDdEVmFraXEyVms3U1RxUi84a1oiCisgICAgICAgICAgICAgICAgICAgICsgImFlNnMzRVBXT3A4Q2dZQStWekJ5dlAzcUVoeUZ6V0dvZHYyODhGaUlaNTE1dzY2TE5qWFBVTGRQcVRiQVRDekciCisgICAgICAgICAgICAgICAgICAgICsgImx5T3YxWjdvbWJMZ1R5Z1VoQ0toZUdkZ1h6RXFOVGlSdU5WM25aeDZUZXl1cHlEQTNBVFVBcG1yMHArai9zb0siCisgICAgICAgICAgICAgICAgICAgICsgIlZVU2lhNkFBRWRGeE1TYW9nQys1Y1F3bEprUmRtUFpqeFVZZUpFMm8vR2pmV3BueTVlSkpmY2lrdXdLQmdBTE8iCisgICAgICAgICAgICAgICAgICAgICsgIkN5cXRaWGdtcXBnTjZsdEFSUnRYYTFQQk5BUndOOUdKblF3NDgyWDQwK3FvWHRSejlkdktxYWJ0Tk5FdVZ1UG8iCisgICAgICAgICAgICAgICAgICAgICsgIjA3cmoxc2E5YUxxWlhnU0VrZXQ2SmtqZmk2QTZyQjBGZE8wZTRrNVFVSnVjdkUvL0xrKzl5c1MwcitIZUZRTGciCisgICAgICAgICAgICAgICAgICAgICsgIm5pRzk3R0EyK0Q5OHRUU1g0c3pJK1k4dDVsZFUzcWFsSlpyczVyRmxBb0dCQU1aTlVSdHc2Q3grWDR6R3hpTHAiCisgICAgICAgICAgICAgICAgICAgICsgIndmb3Z4eEJrV05qUWNzc2pZcElua2UvckxESE1RMmR3RFR2L0RTZTlTRlhZTWg3K3BEQXBwQ29LUklGb1htZkwiCisgICAgICAgICAgICAgICAgICAgICsgIjUwQ0JGaTBaYUwvMUVxREZPeVZReUxkT1BWTHY2NjVKY29LV2VaajhiKzdIMjVOR0NvN25EQTZHd1ZPV3EyRWoiCisgICAgICAgICAgICAgICAgICAgICsgImQzUnFYazZubmFlRU1jS01Cc1pRWFBxUyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJTQV9ET0NTX0NFUlRJRklDQVRFID0KKyAgICAgICAgICAgICItLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS1cbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiTUlJREJqQ0NBZTRDQ1FEcWI1UlJKcFFKN0RBTkJna3Foa2lHOXcwQkFRVUZBREJGTVFzd0NRWURWUVFHRXdKQlxuIgorICAgICAgICAgICAgICAgICAgICArICJWVEVUTUJFR0ExVUVDQk1LVTI5dFpTMVRkR0YwWlRFaE1COEdBMVVFQ2hNWVNXNTBaWEp1WlhRZ1YybGtaMmwwXG4iCisgICAgICAgICAgICAgICAgICAgICsgImN5QlFkSGtnVEhSa01CNFhEVEUwTURNd05URTBNREF5TlZvWERUSTBNRE13TWpFME1EQXlOVm93UlRFTE1Ba0dcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiQTFVRUJoTUNRVlV4RXpBUkJnTlZCQWdUQ2xOdmJXVXRVM1JoZEdVeElUQWZCZ05WQkFvVEdFbHVkR1Z5Ym1WMFxuIgorICAgICAgICAgICAgICAgICAgICArICJJRmRwWkdkcGRITWdVSFI1SUV4MFpEQ0NBU0l3RFFZSktvWklodmNOQVFFQkJRQURnZ0VQQURDQ0FRb0NnZ0VCXG4iCisgICAgICAgICAgICAgICAgICAgICsgIkFKMkpLa3NtYmU0eHhtOVBlTlNmZEpPRWh2UkxFVmxPRDRqRGtpVXRIWUhuRWVtc0NlTGRJU0ZqUisrbGRRU1hcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiK2hZTWlXVDc3U2VML0MyNG5aOTJONEhXWlBmbVExMW9vR2lPYklzd2ZCTnpYTy9YTnFWMWNBQUtTRVN0b0RTMVxuIgorICAgICAgICAgICAgICAgICAgICArICJRVkthNTBURU1uMm1lQUZtNGlRWC90K3pxT0ZhZXFnY1lSRzlYMXI3K0tiQ2hFcUJoU3VzMzYwMDdnSlRyeUVtXG4iCisgICAgICAgICAgICAgICAgICAgICsgInBGNE1yQU5aTFNGT3NOWENNUUlGeElkNW4zWVd1VUdua0w0a1V2bnBDK04xaDJrM2hCWUZaVW9QNjNkZ2hKMVNcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiSTV1WDEvck5zWmg0eHgyaVkwdVZqUmpQMzdJeEVtRVpra2tqSHArMUJ1RDlqMnRhMnlBcThjK0NOSkw1SUpFR1xuIgorICAgICAgICAgICAgICAgICAgICArICJueVdWbTN4Qm5BQUFRYytwbDVUaU1GVUNBd0VBQVRBTkJna3Foa2lHOXcwQkFRVUZBQU9DQVFFQVcwZDNGSGd5XG4iCisgICAgICAgICAgICAgICAgICAgICsgInFTMDZCUzNEWFlvQlpaUHdnS1VpaUdEa1RZYWFESnR2TU9vakNFNWs1WlJZaWkxb2RORUkyN3ZxVnRpTVd4cjBcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiUW41djFqR1JWczE1YkVQRkdJWnZlcUttZXRDbVpaZjZJbUlERDFDSmp5WFQ0WlNDd3NOcXZiMTFVYU9TeXpoL1xuIgorICAgICAgICAgICAgICAgICAgICArICJsQ1kvR0dVOHc2UmJkUHJ1cWZsY28yVXlXbGRiaUtLQnRzWlM0b094cW1CdGRKUXlSek9rcm1RT3lFR2FHM20vXG4iCisgICAgICAgICAgICAgICAgICAgICsgImR2VTErcnFsNjBRUTNHUXd3NVNPSnBNSlNvb0pLQi80b3pnSGtSQ0VrWnJQVGVXVGxOai9HcjA2bU1sNXNlU1NcbiIKKyAgICAgICAgICAgICAgICAgICAgKyAiUk9ySHo3Ly9rcWdpV25NbW80TVdBbHljRi9RZDdtWExpdHNzay85dXRRRFdyVVlmazdBR2dzUTVrSEpmdllFRVxuIgorICAgICAgICAgICAgICAgICAgICArICJuOWZtRmFEdnEyOUl4QT09XG4iCisgICAgICAgICAgICAgICAgICAgICsgIi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSU0FfRE9DU19TSUdOQVRVUkUgPQorICAgICAgICAgICAgIlhxUytKbi94a1k2MUN3cUd0cWprV2JhR3E1QmRwemE1cFVnWVBPRlNtS1JBbXcyRFNGM3hvZkdzeTR0VW03Uzg1MWk5MUlkTU1pIgorICAgICAgICAgICAgICAgICAgICArICJHMS8xUWlLdmVpNXI3ajg1aHNKZVpEVDdadGJ2bXNDYkRxY2xldnZmR05tNWdvNXBRbkd4UDl3a1R5aUZyQXhQUVgiCisgICAgICAgICAgICAgICAgICAgICsgIm1vVm1WRXVDK3lxMVhJL2hnU29icUNuUVRjQ1BWS01vbU5Ob1lDMnMrMTNTOURxR3M3SnlEQm5vbzBrS2NMb2lBLyIKKyAgICAgICAgICAgICAgICAgICAgKyAicjI0YTJnMTFIbXAwbjlzU1U0OWxXVnBjRmk1VVgvaXUrOU0yUUwxcXo1MFNsNzIyajhyL3VPZk1BQjFYQlA0TFB6IgorICAgICAgICAgICAgICAgICAgICArICJHOTdPRkhQS21MSHZObzNwcEVKbVFhaDBwbjQzRTlNbjl0NGpoQVhYd0t1QmdJOUEvcTVYeC9XMjcvcDdpMUN1SGMiCisgICAgICAgICAgICAgICAgICAgICsgInVZUXc9PSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJTQV9ET0NTX1NJR05BVFVSRV9FTkNPREVEID0KKyAgICAgICAgICAgICJYcVMlMkJKbiUyRnhrWTYxQ3dxR3RxamtXYmFHcTVCZHB6YTVwVWdZUE9GU21LUkFtdzJEU0YzeG9mR3N5NHRVbTdTODUxaTkxSSIKKyAgICAgICAgICAgICAgICAgICAgKyAiZE1NaUcxJTJGMVFpS3ZlaTVyN2o4NWhzSmVaRFQ3WnRidm1zQ2JEcWNsZXZ2ZkdObTVnbzVwUW5HeFA5d2tUeWlGIgorICAgICAgICAgICAgICAgICAgICArICJyQXhQUVhtb1ZtVkV1QyUyQnlxMVhJJTJGaGdTb2JxQ25RVGNDUFZLTW9tTk5vWUMycyUyQjEzUzlEcUdzN0p5REIiCisgICAgICAgICAgICAgICAgICAgICsgIm5vbzBrS2NMb2lBJTJGcjI0YTJnMTFIbXAwbjlzU1U0OWxXVnBjRmk1VVglMkZpdSUyQjlNMlFMMXF6NTBTbDcyMiIKKyAgICAgICAgICAgICAgICAgICAgKyAiajhyJTJGdU9mTUFCMVhCUDRMUHpHOTdPRkhQS21MSHZObzNwcEVKbVFhaDBwbjQzRTlNbjl0NGpoQVhYd0t1QmdJIgorICAgICAgICAgICAgICAgICAgICArICI5QSUyRnE1WHglMkZXMjclMkZwN2kxQ3VIY3VZUXclM0QlM0QiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJTQV9TSUdOQVRVUkVfTUVUSE9EID0gUnNhU2hhMU1ldGhvZC5OQU1FOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSU0FfTk9OQ0UgPSAiMTM5MTcyODk4MTI3OTcwMTQ0MzciOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSU0FfVElNRVNUQU1QID0gIjExOTY2NjY1MTIiOworCisgICAgLyoqCisgICAgICogUGVyZm9ybSB0aGUgdGVzdC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RITUFDU0hBMSgpIHsKKyAgICAgICAgZmluYWwgT0F1dGgxU2lnbmF0dXJlIG9hdXRoMVNpZ25hdHVyZSA9IGdldG9BdXRoU2lnbmF0dXJlKCk7CisKKyAgICAgICAgRHVtbXlSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgRHVtbXlSZXF1ZXN0KCkucmVxdWVzdE1ldGhvZCgiR0VUIikKKyAgICAgICAgICAgICAgICAucmVxdWVzdFVSTCgiaHR0cDovL3Bob3Rvcy5leGFtcGxlLm5ldC9waG90b3MiKQorICAgICAgICAgICAgICAgIC5wYXJhbWV0ZXJWYWx1ZSgiZmlsZSIsICJ2YWNhdGlvbi5qcGciKS5wYXJhbWV0ZXJWYWx1ZSgic2l6ZSIsICJvcmlnaW5hbCIpOworCisgICAgICAgIE9BdXRoMVBhcmFtZXRlcnMgcGFyYW1zID0gbmV3IE9BdXRoMVBhcmFtZXRlcnMoKS5yZWFsbShSRUFMTSkKKyAgICAgICAgICAgICAgICAuY29uc3VtZXJLZXkoQ09OU1VNRVJfS0VZKS50b2tlbihBQ0NFU1NfVE9LRU4pCisgICAgICAgICAgICAgICAgLnNpZ25hdHVyZU1ldGhvZChTSUdOQVRVUkVfTUVUSE9EKS50aW1lc3RhbXAoVElNRVNUQU1QKQorICAgICAgICAgICAgICAgIC5ub25jZShOT05DRSkudmVyc2lvbihWRVJTSU9OKTsKKworICAgICAgICBPQXV0aDFTZWNyZXRzIHNlY3JldHMgPSBuZXcgT0F1dGgxU2VjcmV0cygpLmNvbnN1bWVyU2VjcmV0KCJrZDk0aGY5M2s0MjNrZjQ0IikKKyAgICAgICAgICAgICAgICAudG9rZW5TZWNyZXQoInBma2tkaGk5c2wzcjRzMDAiKTsKKworICAgICAgICAvLyBnZW5lcmF0ZSBkaWdpdGFsIHNpZ25hdHVyZTsgZW5zdXJlIGl0IG1hdGNoZXMgdGhlIE9BdXRoIHNwZWMKKyAgICAgICAgU3RyaW5nIHNpZ25hdHVyZSA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNpZ25hdHVyZSA9IG9hdXRoMVNpZ25hdHVyZS5nZW5lcmF0ZShyZXF1ZXN0LCBwYXJhbXMsIHNlY3JldHMpOworICAgICAgICB9IGNhdGNoIChPQXV0aDFTaWduYXR1cmVFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgIHNlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgZmFpbChzZS5nZXRNZXNzYWdlKCkpOworCisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRFcXVhbHMoc2lnbmF0dXJlLCBTSUdOQVRVUkUpOworCisgICAgICAgIE9BdXRoMVBhcmFtZXRlcnMgc2F2ZWQgPSBwYXJhbXMuY2xvbmUoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gc2lnbiB0aGUgcmVxdWVzdDsgY2xlYXIgcGFyYW1zOyBwYXJzZSBwYXJhbXMgZnJvbSByZXF1ZXN0OyBlbnN1cmUgdGhleSBtYXRjaCBvcmlnaW5hbAorICAgICAgICAgICAgb2F1dGgxU2lnbmF0dXJlLnNpZ24ocmVxdWVzdCwgcGFyYW1zLCBzZWNyZXRzKTsKKyAgICAgICAgfSBjYXRjaCAoT0F1dGgxU2lnbmF0dXJlRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICBmYWlsKHNlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBzaWduaW5nIHRoZSByZXF1ZXN0IHNob3VsZCBub3QgaGF2ZSBtb2RpZmllZCB0aGUgb3JpZ2luYWwgcGFyYW1ldGVycworICAgICAgICBhc3NlcnRUcnVlKHBhcmFtcy5lcXVhbHMoc2F2ZWQpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwYXJhbXMuZ2V0U2lnbmF0dXJlKCkgPT0gbnVsbCk7CisKKyAgICAgICAgcGFyYW1zID0gbmV3IE9BdXRoMVBhcmFtZXRlcnMoKTsKKyAgICAgICAgcGFyYW1zLnJlYWRSZXF1ZXN0KHJlcXVlc3QpOworICAgICAgICBhc3NlcnRFcXVhbHMocGFyYW1zLmdldFJlYWxtKCksIFJFQUxNKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBhcmFtcy5nZXRDb25zdW1lcktleSgpLCBDT05TVU1FUl9LRVkpOworICAgICAgICBhc3NlcnRFcXVhbHMocGFyYW1zLmdldFRva2VuKCksIEFDQ0VTU19UT0tFTik7CisgICAgICAgIGFzc2VydEVxdWFscyhwYXJhbXMuZ2V0U2lnbmF0dXJlTWV0aG9kKCksIFNJR05BVFVSRV9NRVRIT0QpOworICAgICAgICBhc3NlcnRFcXVhbHMocGFyYW1zLmdldFRpbWVzdGFtcCgpLCBUSU1FU1RBTVApOworICAgICAgICBhc3NlcnRFcXVhbHMocGFyYW1zLmdldE5vbmNlKCksIE5PTkNFKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBhcmFtcy5nZXRWZXJzaW9uKCksIFZFUlNJT04pOworICAgICAgICBhc3NlcnRFcXVhbHMocGFyYW1zLmdldFNpZ25hdHVyZSgpLCBTSUdOQVRVUkUpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyB2ZXJpZnkgc2lnbmF0dXJlIHVzaW5nIHJlcXVlc3QgdGhhdCB3YXMganVzdCBzaWduZWQKKyAgICAgICAgICAgIGFzc2VydFRydWUob2F1dGgxU2lnbmF0dXJlLnZlcmlmeShyZXF1ZXN0LCBwYXJhbXMsIHNlY3JldHMpKTsKKyAgICAgICAgfSBjYXRjaCAoT0F1dGgxU2lnbmF0dXJlRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICBmYWlsKHNlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIE9BdXRoMVNpZ25hdHVyZSBnZXRvQXV0aFNpZ25hdHVyZSgpIHsKKyAgICAgICAgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyID0gSW5qZWN0aW9ucy5jcmVhdGVJbmplY3Rpb25NYW5hZ2VyKG5ldyBPQXV0aDFTaWduYXR1cmVGZWF0dXJlLkJpbmRlcigpKTsKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5jb21wbGV0ZVJlZ2lzdHJhdGlvbigpOworICAgICAgICByZXR1cm4gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShPQXV0aDFTaWduYXR1cmUuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJTQVNIQTEoKSB7CisgICAgICAgIHRlc3RSU0FTSEExKFJTQV9QUklWS0VZLCBSU0FfQ0VSVElGSUNBVEUsIFJTQV9TSUdOQVRVUkUsIFJTQV9TSUdOQVRVUkVfRU5DT0RFRCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG9jc1JzYVNoYTEoKSB7CisgICAgICAgIHRlc3RSU0FTSEExKFJTQV9ET0NTX1BSSVZLRVksIFJTQV9ET0NTX0NFUlRJRklDQVRFLCBSU0FfRE9DU19TSUdOQVRVUkUsIFJTQV9ET0NTX1NJR05BVFVSRV9FTkNPREVEKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UlNBU0hBMShmaW5hbCBTdHJpbmcgcnNhUHJpdktleSwgZmluYWwgU3RyaW5nIHJzYUNlcnRpZmljYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyByc2FTaWduYXR1cmUsIGZpbmFsIFN0cmluZyByc2FTaWduYXR1cmVFbmNvZGVkKSB7CisKKyAgICAgICAgZmluYWwgT0F1dGgxU2lnbmF0dXJlIG9hdXRoMVNpZ25hdHVyZSA9IGdldG9BdXRoU2lnbmF0dXJlKCk7CisgICAgICAgIER1bW15UmVxdWVzdCByZXF1ZXN0ID0gbmV3IER1bW15UmVxdWVzdCgpLnJlcXVlc3RNZXRob2QoIkdFVCIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3RVUkwoImh0dHA6Ly9waG90b3MuZXhhbXBsZS5uZXQvcGhvdG9zIikKKyAgICAgICAgICAgICAgICAucGFyYW1ldGVyVmFsdWUoImZpbGUiLCAidmFjYWN0aW9uLmpwZyIpLnBhcmFtZXRlclZhbHVlKCJzaXplIiwgIm9yaWdpbmFsIik7CisKKyAgICAgICAgT0F1dGgxUGFyYW1ldGVycyBwYXJhbXMgPSBuZXcgT0F1dGgxUGFyYW1ldGVycygpLnJlYWxtKFJFQUxNKQorICAgICAgICAgICAgICAgIC5jb25zdW1lcktleShDT05TVU1FUl9LRVkpCisgICAgICAgICAgICAgICAgLnNpZ25hdHVyZU1ldGhvZChSU0FfU0lHTkFUVVJFX01FVEhPRCkudGltZXN0YW1wKFJTQV9USU1FU1RBTVApCisgICAgICAgICAgICAgICAgLm5vbmNlKFJTQV9OT05DRSkudmVyc2lvbihWRVJTSU9OKTsKKworICAgICAgICBPQXV0aDFTZWNyZXRzIHNlY3JldHMgPSBuZXcgT0F1dGgxU2VjcmV0cygpLmNvbnN1bWVyU2VjcmV0KHJzYVByaXZLZXkpOworCisgICAgICAgIC8vIGdlbmVyYXRlIGRpZ2l0YWwgc2lnbmF0dXJlOyBlbnN1cmUgaXQgbWF0Y2hlcyB0aGUgT0F1dGggc3BlYworICAgICAgICBTdHJpbmcgc2lnbmF0dXJlID0gbnVsbDsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgc2lnbmF0dXJlID0gb2F1dGgxU2lnbmF0dXJlLmdlbmVyYXRlKHJlcXVlc3QsIHBhcmFtcywgc2VjcmV0cyk7CisgICAgICAgIH0gY2F0Y2ggKE9BdXRoMVNpZ25hdHVyZUV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgc2UucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBmYWlsKHNlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJzYVNpZ25hdHVyZSwgc2lnbmF0dXJlKTsKKworICAgICAgICBPQXV0aDFQYXJhbWV0ZXJzIHNhdmVkID0gcGFyYW1zLmNsb25lKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIHNpZ24gdGhlIHJlcXVlc3Q7IGNsZWFyIHBhcmFtczsgcGFyc2UgcGFyYW1zIGZyb20gcmVxdWVzdDsgZW5zdXJlIHRoZXkgbWF0Y2ggb3JpZ2luYWwKKyAgICAgICAgICAgIG9hdXRoMVNpZ25hdHVyZS5zaWduKHJlcXVlc3QsIHBhcmFtcywgc2VjcmV0cyk7CisgICAgICAgIH0gY2F0Y2ggKE9BdXRoMVNpZ25hdHVyZUV4Y2VwdGlvbiBzZSkgeworICAgICAgICAgICAgZmFpbChzZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gc2lnbmluZyB0aGUgcmVxdWVzdCBzaG91bGQgbm90IGhhdmUgbW9kaWZpZWQgdGhlIG9yaWdpbmFsIHBhcmFtZXRlcnMKKyAgICAgICAgYXNzZXJ0VHJ1ZShwYXJhbXMuZXF1YWxzKHNhdmVkKSk7CisgICAgICAgIGFzc2VydFRydWUocGFyYW1zLmdldFNpZ25hdHVyZSgpID09IG51bGwpOworCisgICAgICAgIHBhcmFtcyA9IG5ldyBPQXV0aDFQYXJhbWV0ZXJzKCk7CisgICAgICAgIHBhcmFtcy5yZWFkUmVxdWVzdChyZXF1ZXN0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBhcmFtcy5nZXRSZWFsbSgpLCBSRUFMTSk7CisgICAgICAgIGFzc2VydEVxdWFscyhwYXJhbXMuZ2V0Q29uc3VtZXJLZXkoKSwgQ09OU1VNRVJfS0VZKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBhcmFtcy5nZXRTaWduYXR1cmVNZXRob2QoKSwgUlNBX1NJR05BVFVSRV9NRVRIT0QpOworICAgICAgICBhc3NlcnRFcXVhbHMocGFyYW1zLmdldFRpbWVzdGFtcCgpLCBSU0FfVElNRVNUQU1QKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBhcmFtcy5nZXROb25jZSgpLCBSU0FfTk9OQ0UpOworICAgICAgICBhc3NlcnRFcXVhbHMocGFyYW1zLmdldFZlcnNpb24oKSwgVkVSU0lPTik7CisgICAgICAgIGFzc2VydEVxdWFscyhwYXJhbXMuZ2V0U2lnbmF0dXJlKCksIHJzYVNpZ25hdHVyZSk7CisKKyAgICAgICAgLy8gcGVyZm9ybSB0aGUgc2FtZSBlbmNvZGluZyBhcyBkb25lIGJ5IE9BdXRoMVBhcmFtZXRlcnMud3JpdGVSZXF1ZXN0CisgICAgICAgIC8vIHRvIHNlZSBpZiB0aGUgZW5jb2RlZCBzaWduYXR1cmUgd2lsbCBtYXRjaAorICAgICAgICBhc3NlcnRFcXVhbHMocnNhU2lnbmF0dXJlRW5jb2RlZCwgVXJpQ29tcG9uZW50LmVuY29kZShwYXJhbXMuZ2V0U2lnbmF0dXJlKCksIFVyaUNvbXBvbmVudC5UeXBlLlVOUkVTRVJWRUQpKTsKKworICAgICAgICBzZWNyZXRzID0gbmV3IE9BdXRoMVNlY3JldHMoKS5jb25zdW1lclNlY3JldChyc2FDZXJ0aWZpY2F0ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyB2ZXJpZnkgc2lnbmF0dXJlIHVzaW5nIHJlcXVlc3QgdGhhdCB3YXMganVzdCBzaWduZWQKKyAgICAgICAgICAgIGFzc2VydFRydWUob2F1dGgxU2lnbmF0dXJlLnZlcmlmeShyZXF1ZXN0LCBwYXJhbXMsIHNlY3JldHMpKTsKKyAgICAgICAgfSBjYXRjaCAoT0F1dGgxU2lnbmF0dXJlRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICBmYWlsKHNlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGEgVHdpdHRlciBzdGF0dXMgdXBkYXRlLgorICAgICAqCisgICAgICogU3BlY2lmaWNhbGx5LCB0aGlzIHRlc3QgaW5jbHVkZXMgc29tZSBjaGFyYWN0ZXJzIChzcGFjZXMpIGluIG9uZSBvZiB0aGUKKyAgICAgKiBwYXJhbWV0ZXJzIHdoaWNoIHdlcmUgaW5jb3JyZWN0bHkgZW5jb2RlZCAoYXMgJysnIGluc3RlYWQgb2YgIiUyMCIpIHdpdGgKKyAgICAgKiB0aGUgb3JpZ2luYWwgZW5jb2Rpbmcgcm91dGluZS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUd2l0dGVyU2lnKCkgeworICAgICAgICBmaW5hbCBPQXV0aDFTaWduYXR1cmUgb2F1dGgxU2lnbmF0dXJlID0gZ2V0b0F1dGhTaWduYXR1cmUoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIFRXSVRURVJURVNUX1NJR05BVFVSRSA9ICJ5ZnJuL3AvNEhucCtYY3dVQlZmVzBjU2djK289IjsKKyAgICAgICAgZmluYWwgU3RyaW5nIFRXSVRURVJURVNUX1NJR05BVFVSRV9FTkMgPQorICAgICAgICAgICAgICAgICJ5ZnJuJTJGcCUyRjRIbnAlMkJYY3dVQlZmVzBjU2djJTJCbyUzRCI7CisKKyAgICAgICAgRHVtbXlSZXF1ZXN0IHJlcXVlc3QgPSBuZXcgRHVtbXlSZXF1ZXN0KCkucmVxdWVzdE1ldGhvZCgiUE9TVCIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3RVUkwoImh0dHA6Ly90d2l0dGVyLmNvbS9zdGF0dXNlcy91cGRhdGUuanNvbiIpCisgICAgICAgICAgICAgICAgLnBhcmFtZXRlclZhbHVlKCJzdGF0dXMiLCAiSGVsbG8gVHdpdHRlciBXb3JsZCIpOworCisgICAgICAgIE9BdXRoMVBhcmFtZXRlcnMgcGFyYW1zID0gbmV3IE9BdXRoMVBhcmFtZXRlcnMoKQorICAgICAgICAgICAgICAgIC5jb25zdW1lcktleShDT05TVU1FUl9LRVkpLnRva2VuKEFDQ0VTU19UT0tFTikKKyAgICAgICAgICAgICAgICAuc2lnbmF0dXJlTWV0aG9kKFNJR05BVFVSRV9NRVRIT0QpLnRpbWVzdGFtcChUSU1FU1RBTVApCisgICAgICAgICAgICAgICAgLm5vbmNlKE5PTkNFKS52ZXJzaW9uKFZFUlNJT04pOworCisgICAgICAgIE9BdXRoMVNlY3JldHMgc2VjcmV0cyA9CisgICAgICAgICAgICAgICAgbmV3IE9BdXRoMVNlY3JldHMoKS5jb25zdW1lclNlY3JldCgia2Q5NGhmOTNrNDIza2Y0NCIpCisgICAgICAgICAgICAgICAgICAgICAgICAudG9rZW5TZWNyZXQoInBma2tkaGk5c2wzcjRzMDAiKTsKKworICAgICAgICAvLyBnZW5lcmF0ZSBkaWdpdGFsIHNpZ25hdHVyZTsgZW5zdXJlIGl0IG1hdGNoZXMgdGhlIE9BdXRoIHNwZWMKKyAgICAgICAgU3RyaW5nIHNpZ25hdHVyZSA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNpZ25hdHVyZSA9IG9hdXRoMVNpZ25hdHVyZS5nZW5lcmF0ZShyZXF1ZXN0LCBwYXJhbXMsIHNlY3JldHMpOworICAgICAgICB9IGNhdGNoIChPQXV0aDFTaWduYXR1cmVFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgIHNlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgZmFpbChzZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNpZ25hdHVyZSwgVFdJVFRFUlRFU1RfU0lHTkFUVVJFKTsKKworICAgICAgICBPQXV0aDFQYXJhbWV0ZXJzIHNhdmVkID0gKE9BdXRoMVBhcmFtZXRlcnMpIHBhcmFtcy5jbG9uZSgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBzaWduIHRoZSByZXF1ZXN0OyBjbGVhciBwYXJhbXM7IHBhcnNlIHBhcmFtcyBmcm9tIHJlcXVlc3Q7CisgICAgICAgICAgICAvLyBlbnN1cmUgdGhleSBtYXRjaCBvcmlnaW5hbAorICAgICAgICAgICAgb2F1dGgxU2lnbmF0dXJlLnNpZ24ocmVxdWVzdCwgcGFyYW1zLCBzZWNyZXRzKTsKKyAgICAgICAgfSBjYXRjaCAoT0F1dGgxU2lnbmF0dXJlRXhjZXB0aW9uIHNlKSB7CisgICAgICAgICAgICBmYWlsKHNlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBzaWduaW5nIHRoZSByZXF1ZXN0IHNob3VsZCBub3QgaGF2ZSBtb2RpZmllZCB0aGUgb3JpZ2luYWwgcGFyYW1ldGVycworICAgICAgICBhc3NlcnRUcnVlKHBhcmFtcy5lcXVhbHMoc2F2ZWQpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwYXJhbXMuZ2V0U2lnbmF0dXJlKCkgPT0gbnVsbCk7CisKKyAgICAgICAgcGFyYW1zID0gbmV3IE9BdXRoMVBhcmFtZXRlcnMoKTsKKyAgICAgICAgcGFyYW1zLnJlYWRSZXF1ZXN0KHJlcXVlc3QpOworICAgICAgICBhc3NlcnRFcXVhbHMocGFyYW1zLmdldENvbnN1bWVyS2V5KCksIENPTlNVTUVSX0tFWSk7CisgICAgICAgIGFzc2VydEVxdWFscyhwYXJhbXMuZ2V0VG9rZW4oKSwgQUNDRVNTX1RPS0VOKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBhcmFtcy5nZXRTaWduYXR1cmVNZXRob2QoKSwgU0lHTkFUVVJFX01FVEhPRCk7CisgICAgICAgIGFzc2VydEVxdWFscyhwYXJhbXMuZ2V0VGltZXN0YW1wKCksIFRJTUVTVEFNUCk7CisgICAgICAgIGFzc2VydEVxdWFscyhwYXJhbXMuZ2V0Tm9uY2UoKSwgTk9OQ0UpOworICAgICAgICBhc3NlcnRFcXVhbHMocGFyYW1zLmdldFZlcnNpb24oKSwgVkVSU0lPTik7CisgICAgICAgIGFzc2VydEVxdWFscyhwYXJhbXMuZ2V0U2lnbmF0dXJlKCksIFRXSVRURVJURVNUX1NJR05BVFVSRSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIHZlcmlmeSBzaWduYXR1cmUgdXNpbmcgcmVxdWVzdCB0aGF0IHdhcyBqdXN0IHNpZ25lZAorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShvYXV0aDFTaWduYXR1cmUudmVyaWZ5KHJlcXVlc3QsIHBhcmFtcywgc2VjcmV0cykpOworICAgICAgICB9IGNhdGNoIChPQXV0aDFTaWduYXR1cmVFeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgIGZhaWwoc2UuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L29hdXRoMi1jbGllbnQvcG9tLnhtbCBiL3NlY3VyaXR5L29hdXRoMi1jbGllbnQvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTgzYTBkCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvb2F1dGgyLWNsaWVudC9wb20ueG1sCkBAIC0wLDAgKzEsNjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VjdXJpdHk8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPGFydGlmYWN0SWQ+b2F1dGgyLWNsaWVudDwvYXJ0aWZhY3RJZD4KKworICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgTW9kdWxlIHRoYXQgYWRkcyBhbiBPQXV0aCAyIHN1cHBvcnQgdG8gSmVyc2V5IGNsaWVudAorICAgIDwvZGVzY3JpcHRpb24+CisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLnN1bi5pc3RhY2s8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4taXN0YWNrLWNvbW1vbnMtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxpbmhlcml0ZWQ+dHJ1ZTwvaW5oZXJpdGVkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJ1aWxkLWhlbHBlci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtanNvbi1qYWNrc29uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNsaWVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDwhLS08ZGVwZW5kZW5jeT4tLT4KKyAgICAgICAgICAgIDwhLS08Z3JvdXBJZD5qYXZheC53cy5yczwvZ3JvdXBJZD4tLT4KKyAgICAgICAgICAgIDwhLS08YXJ0aWZhY3RJZD5qYXZheC53cy5ycy1hcGk8L2FydGlmYWN0SWQ+LS0+CisgICAgICAgIDwhLS08L2RlcGVuZGVuY3k+LS0+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvb2F1dGgyLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9vYXV0aDIvQWJzdHJhY3RBdXRob3JpemF0aW9uQ29kZUdyYW50QnVpbGRlci5qYXZhIGIvc2VjdXJpdHkvb2F1dGgyLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9vYXV0aDIvQWJzdHJhY3RBdXRob3JpemF0aW9uQ29kZUdyYW50QnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5YzRhMjAKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9vYXV0aDItY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L29hdXRoMi9BYnN0cmFjdEF1dGhvcml6YXRpb25Db2RlR3JhbnRCdWlsZGVyLmphdmEKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQub2F1dGgyOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKKworLyoqCisgKiBBYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgT0F1dGgyQ29kZUdyYW50Rmxvdy5CdWlsZGVyfS4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKiBAc2luY2UgMi4zCisgKi8KK2NsYXNzIEFic3RyYWN0QXV0aG9yaXphdGlvbkNvZGVHcmFudEJ1aWxkZXI8VCBleHRlbmRzIE9BdXRoMkNvZGVHcmFudEZsb3cuQnVpbGRlcj4gaW1wbGVtZW50cyBPQXV0aDJDb2RlR3JhbnRGbG93LkJ1aWxkZXI8VD4geworCisgICAgcHJpdmF0ZSBmaW5hbCBPQXV0aDJDb2RlR3JhbnRGbG93LkJ1aWxkZXI8VD4gZGVsZWdhdGU7CisKKyAgICBwdWJsaWMgQWJzdHJhY3RBdXRob3JpemF0aW9uQ29kZUdyYW50QnVpbGRlcihPQXV0aDJDb2RlR3JhbnRGbG93LkJ1aWxkZXI8VD4gZGVsZWdhdGUpIHsKKyAgICAgICAgdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUIGFjY2Vzc1Rva2VuVXJpKFN0cmluZyBhY2Nlc3NUb2tlblVyaSkgeworICAgICAgICBkZWxlZ2F0ZS5hY2Nlc3NUb2tlblVyaShhY2Nlc3NUb2tlblVyaSk7CisgICAgICAgIHJldHVybiAoVCkgdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVCBhdXRob3JpemF0aW9uVXJpKFN0cmluZyBhdXRob3JpemF0aW9uVXJpKSB7CisgICAgICAgIGRlbGVnYXRlLmF1dGhvcml6YXRpb25VcmkoYXV0aG9yaXphdGlvblVyaSk7CisgICAgICAgIHJldHVybiAoVCkgdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVCByZWRpcmVjdFVyaShTdHJpbmcgcmVkaXJlY3RVcmkpIHsKKyAgICAgICAgZGVsZWdhdGUucmVkaXJlY3RVcmkocmVkaXJlY3RVcmkpOworICAgICAgICByZXR1cm4gKFQpIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFQgY2xpZW50SWRlbnRpZmllcihDbGllbnRJZGVudGlmaWVyIGNvbnN1bWVyQ3JlZGVudGlhbHMpIHsKKyAgICAgICAgZGVsZWdhdGUuY2xpZW50SWRlbnRpZmllcihjb25zdW1lckNyZWRlbnRpYWxzKTsKKyAgICAgICAgcmV0dXJuIChUKSB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUIHNjb3BlKFN0cmluZyBzY29wZSkgeworICAgICAgICBkZWxlZ2F0ZS5zY29wZShzY29wZSk7CisgICAgICAgIHJldHVybiAoVCkgdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVCBjbGllbnQoQ2xpZW50IGNsaWVudCkgeworICAgICAgICBkZWxlZ2F0ZS5jbGllbnQoY2xpZW50KTsKKyAgICAgICAgcmV0dXJuIChUKSB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUIHJlZnJlc2hUb2tlblVyaShTdHJpbmcgcmVmcmVzaFRva2VuVXJpKSB7CisgICAgICAgIGRlbGVnYXRlLnJlZnJlc2hUb2tlblVyaShyZWZyZXNoVG9rZW5VcmkpOworICAgICAgICByZXR1cm4gKFQpIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFQgcHJvcGVydHkoT0F1dGgyQ29kZUdyYW50Rmxvdy5QaGFzZSBwaGFzZSwgU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIGRlbGVnYXRlLnByb3BlcnR5KHBoYXNlLCBrZXksIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIChUKSB0aGlzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPQXV0aDJDb2RlR3JhbnRGbG93IGJ1aWxkKCkgeworICAgICAgICByZXR1cm4gZGVsZWdhdGUuYnVpbGQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZWN1cml0eS9vYXV0aDItY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L29hdXRoMi9BdXRoQ29kZUdyYW50SW1wbC5qYXZhIGIvc2VjdXJpdHkvb2F1dGgyLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9vYXV0aDIvQXV0aENvZGVHcmFudEltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzljMTdlCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvb2F1dGgyLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9vYXV0aDIvQXV0aENvZGVHcmFudEltcGwuamF2YQpAQCAtMCwwICsxLDM4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQub2F1dGgyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlVVSUQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRm9ybTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkdlbmVyaWNUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SZWFkZXJJbnRlcmNlcHRvcjsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50Lm9hdXRoMi5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Qcm9wZXJ0aWVzRGVsZWdhdGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamFja3Nvbi5KYWNrc29uRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLk1lc3NhZ2VCb2R5V29ya2VyczsKKworLyoqCisgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBPQXV0aDJDb2RlR3JhbnRGbG93fS4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKiBAc2luY2UgMi4zCisgKi8KK2NsYXNzIEF1dGhDb2RlR3JhbnRJbXBsIGltcGxlbWVudHMgT0F1dGgyQ29kZUdyYW50RmxvdyB7CisKKyAgICAvKioKKyAgICAgKiBCdWlsZGVyIGltcGxlbWVudGF0aW9uLgorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBCdWlsZGVyIGltcGxlbWVudHMgT0F1dGgyQ29kZUdyYW50Rmxvdy5CdWlsZGVyIHsKKworICAgICAgICBwcml2YXRlIFN0cmluZyBhY2Nlc3NUb2tlblVyaTsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcmVmcmVzaFRva2VuVXJpOworICAgICAgICBwcml2YXRlIFN0cmluZyBhdXRob3JpemF0aW9uVXJpOworICAgICAgICBwcml2YXRlIFN0cmluZyBjYWxsYmFja1VyaTsKKyAgICAgICAgcHJpdmF0ZSBDbGllbnRJZGVudGlmaWVyIGNsaWVudElkZW50aWZpZXI7CisgICAgICAgIHByaXZhdGUgQ2xpZW50IGNsaWVudDsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgc2NvcGU7CisgICAgICAgIHByaXZhdGUgTWFwPFN0cmluZywgU3RyaW5nPiBhdXRob3JpemF0aW9uUHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGFjY2Vzc1Rva2VuUHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IHJlZnJlc2hUb2tlblByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhIG5ldyBidWlsZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIoKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGEgbmV3IGJ1aWxkZXIgd2l0aCBkZWZpbmVkIFVSSXMgYW5kIGNsaWVudCBpZC4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyKGZpbmFsIENsaWVudElkZW50aWZpZXIgY2xpZW50SWRlbnRpZmllciwgZmluYWwgU3RyaW5nIGF1dGhvcml6YXRpb25VcmksIGZpbmFsIFN0cmluZyBhY2Nlc3NUb2tlblVyaSkgeworICAgICAgICAgICAgdGhpcygpOworICAgICAgICAgICAgdGhpcy5hY2Nlc3NUb2tlblVyaSA9IGFjY2Vzc1Rva2VuVXJpOworICAgICAgICAgICAgdGhpcy5hdXRob3JpemF0aW9uVXJpID0gYXV0aG9yaXphdGlvblVyaTsKKyAgICAgICAgICAgIHRoaXMuY2xpZW50SWRlbnRpZmllciA9IGNsaWVudElkZW50aWZpZXI7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIGEgbmV3IGJ1aWxkZXIgd2l0aCBkZWZpbmVkIFVSSXMgYW5kIGNsaWVudCBpZCBhbmQgY2FsbGJhY2sgdXJpLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIoZmluYWwgQ2xpZW50SWRlbnRpZmllciBjbGllbnRJZGVudGlmaWVyLCBmaW5hbCBTdHJpbmcgYXV0aG9yaXphdGlvblVyaSwgZmluYWwgU3RyaW5nIGFjY2Vzc1Rva2VuVXJpLAorICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2FsbGJhY2tVcmkpIHsKKyAgICAgICAgICAgIHRoaXMoKTsKKyAgICAgICAgICAgIHRoaXMuYWNjZXNzVG9rZW5VcmkgPSBhY2Nlc3NUb2tlblVyaTsKKyAgICAgICAgICAgIHRoaXMuYXV0aG9yaXphdGlvblVyaSA9IGF1dGhvcml6YXRpb25Vcmk7CisgICAgICAgICAgICB0aGlzLmNhbGxiYWNrVXJpID0gY2FsbGJhY2tVcmk7CisgICAgICAgICAgICB0aGlzLmNsaWVudElkZW50aWZpZXIgPSBjbGllbnRJZGVudGlmaWVyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGFjY2Vzc1Rva2VuVXJpKGZpbmFsIFN0cmluZyBhY2Nlc3NUb2tlblVyaSkgeworICAgICAgICAgICAgdGhpcy5hY2Nlc3NUb2tlblVyaSA9IGFjY2Vzc1Rva2VuVXJpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgYXV0aG9yaXphdGlvblVyaShmaW5hbCBTdHJpbmcgYXV0aG9yaXphdGlvblVyaSkgeworICAgICAgICAgICAgdGhpcy5hdXRob3JpemF0aW9uVXJpID0gYXV0aG9yaXphdGlvblVyaTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHJlZGlyZWN0VXJpKGZpbmFsIFN0cmluZyByZWRpcmVjdFVyaSkgeworICAgICAgICAgICAgdGhpcy5jYWxsYmFja1VyaSA9IHJlZGlyZWN0VXJpOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ1aWxkZXIgY2xpZW50SWRlbnRpZmllcihmaW5hbCBDbGllbnRJZGVudGlmaWVyIGNsaWVudElkZW50aWZpZXIpIHsKKyAgICAgICAgICAgIHRoaXMuY2xpZW50SWRlbnRpZmllciA9IGNsaWVudElkZW50aWZpZXI7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnVpbGRlciBzY29wZShmaW5hbCBTdHJpbmcgc2NvcGUpIHsKKyAgICAgICAgICAgIHRoaXMuc2NvcGUgPSBzY29wZTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGNsaWVudChmaW5hbCBDbGllbnQgY2xpZW50KSB7CisgICAgICAgICAgICB0aGlzLmNsaWVudCA9IGNsaWVudDsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHJlZnJlc2hUb2tlblVyaShmaW5hbCBTdHJpbmcgcmVmcmVzaFRva2VuVXJpKSB7CisgICAgICAgICAgICB0aGlzLnJlZnJlc2hUb2tlblVyaSA9IHJlZnJlc2hUb2tlblVyaTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIHByb3BlcnR5KGZpbmFsIE9BdXRoMkNvZGVHcmFudEZsb3cuUGhhc2UgcGhhc2UsIGZpbmFsIFN0cmluZyBrZXksIGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgcGhhc2UucHJvcGVydHkoa2V5LCB2YWx1ZSwgYXV0aG9yaXphdGlvblByb3BlcnRpZXMsIGFjY2Vzc1Rva2VuUHJvcGVydGllcywgcmVmcmVzaFRva2VuUHJvcGVydGllcyk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBnZXRBY2Nlc3NUb2tlblVyaSgpIHsKKyAgICAgICAgICAgIHJldHVybiBhY2Nlc3NUb2tlblVyaTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBnZXRSZWZyZXNoVG9rZW5VcmkoKSB7CisgICAgICAgICAgICByZXR1cm4gcmVmcmVzaFRva2VuVXJpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGdldEF1dGhvcml6YXRpb25VcmkoKSB7CisgICAgICAgICAgICByZXR1cm4gYXV0aG9yaXphdGlvblVyaTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBnZXRTY29wZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBzY29wZTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBnZXRDYWxsYmFja1VyaSgpIHsKKyAgICAgICAgICAgIHJldHVybiBjYWxsYmFja1VyaTsKKyAgICAgICAgfQorCisgICAgICAgIENsaWVudElkZW50aWZpZXIgZ2V0Q2xpZW50SWRlbnRpZmllcigpIHsKKyAgICAgICAgICAgIHJldHVybiBjbGllbnRJZGVudGlmaWVyOworICAgICAgICB9CisKKyAgICAgICAgQ2xpZW50IGdldENsaWVudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBjbGllbnQ7CisgICAgICAgIH0KKworICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldEF1dGhvcml6YXRpb25Qcm9wZXJ0aWVzKCkgeworICAgICAgICAgICAgcmV0dXJuIGF1dGhvcml6YXRpb25Qcm9wZXJ0aWVzOworICAgICAgICB9CisKKyAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRBY2Nlc3NUb2tlblByb3BlcnRpZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gYWNjZXNzVG9rZW5Qcm9wZXJ0aWVzOworICAgICAgICB9CisKKyAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRSZWZyZXNoVG9rZW5Qcm9wZXJ0aWVzKCkgeworICAgICAgICAgICAgcmV0dXJuIHJlZnJlc2hUb2tlblByb3BlcnRpZXM7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEF1dGhDb2RlR3JhbnRJbXBsIGJ1aWxkKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBBdXRoQ29kZUdyYW50SW1wbChhdXRob3JpemF0aW9uVXJpLCBhY2Nlc3NUb2tlblVyaSwKKyAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tVcmksIHJlZnJlc2hUb2tlblVyaSwKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50SWRlbnRpZmllciwKKyAgICAgICAgICAgICAgICAgICAgc2NvcGUsIGNsaWVudCwgYXV0aG9yaXphdGlvblByb3BlcnRpZXMsIGFjY2Vzc1Rva2VuUHJvcGVydGllcywgcmVmcmVzaFRva2VuUHJvcGVydGllcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIEF1dGhDb2RlR3JhbnRJbXBsKGZpbmFsIFN0cmluZyBhdXRob3JpemF0aW9uVXJpLCBmaW5hbCBTdHJpbmcgYWNjZXNzVG9rZW5VcmksIGZpbmFsIFN0cmluZyByZWRpcmVjdFVyaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZWZyZXNoVG9rZW5VcmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGllbnRJZGVudGlmaWVyIGNsaWVudElkZW50aWZpZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc2NvcGUsIGZpbmFsIENsaWVudCBjbGllbnQsIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gYXV0aG9yaXphdGlvblByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IGFjY2Vzc1Rva2VuUHJvcGVydGllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gcmVmcmVzaFRva2VuUHJvcGVydGllcykgeworICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuVXJpID0gYWNjZXNzVG9rZW5Vcmk7CisgICAgICAgIHRoaXMuYXV0aG9yaXphdGlvblVyaSA9IGF1dGhvcml6YXRpb25Vcmk7CisKKyAgICAgICAgdGhpcy5hdXRob3JpemF0aW9uUHJvcGVydGllcyA9IGF1dGhvcml6YXRpb25Qcm9wZXJ0aWVzOworICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuUHJvcGVydGllcyA9IGFjY2Vzc1Rva2VuUHJvcGVydGllczsKKyAgICAgICAgdGhpcy5yZWZyZXNoVG9rZW5Qcm9wZXJ0aWVzID0gcmVmcmVzaFRva2VuUHJvcGVydGllczsKKworICAgICAgICBpZiAocmVmcmVzaFRva2VuVXJpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRoaXMucmVmcmVzaFRva2VuVXJpID0gcmVmcmVzaFRva2VuVXJpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpcy5yZWZyZXNoVG9rZW5VcmkgPSBhY2Nlc3NUb2tlblVyaTsKKyAgICAgICAgfQorCisgICAgICAgIHRoaXMuY2xpZW50SWRlbnRpZmllciA9IGNsaWVudElkZW50aWZpZXI7CisgICAgICAgIHRoaXMuY2xpZW50ID0gY29uZmlndXJlQ2xpZW50KGNsaWVudCk7CisKKyAgICAgICAgaW5pdERlZmF1bHRQcm9wZXJ0aWVzKHJlZGlyZWN0VXJpLCBzY29wZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBDbGllbnQgY29uZmlndXJlQ2xpZW50KENsaWVudCBjbGllbnQpIHsKKyAgICAgICAgaWYgKGNsaWVudCA9PSBudWxsKSB7CisgICAgICAgICAgICBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWcgPSBjbGllbnQuZ2V0Q29uZmlndXJhdGlvbigpOworICAgICAgICBpZiAoIWNvbmZpZy5pc1JlZ2lzdGVyZWQoQXV0aENvZGVHcmFudEltcGwuRGVmYXVsdFRva2VuTWVzc2FnZUJvZHlSZWFkZXIuY2xhc3MpKSB7CisgICAgICAgICAgICBjbGllbnQucmVnaXN0ZXIoQXV0aENvZGVHcmFudEltcGwuRGVmYXVsdFRva2VuTWVzc2FnZUJvZHlSZWFkZXIuY2xhc3MpOworICAgICAgICB9CisgICAgICAgIGlmICghY29uZmlnLmlzUmVnaXN0ZXJlZChKYWNrc29uRmVhdHVyZS5jbGFzcykpIHsKKyAgICAgICAgICAgIGNsaWVudC5yZWdpc3RlcihKYWNrc29uRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gY2xpZW50OworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXREZWZhdWx0UHJvcGVydHkoZmluYWwgU3RyaW5nIGtleSwgZmluYWwgU3RyaW5nIHZhbHVlLCBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+Li4uIHByb3BlcnRpZXMpIHsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gcHJvcHMgOiBwcm9wZXJ0aWVzKSB7CisgICAgICAgICAgICBpZiAocHJvcHMuZ2V0KGtleSkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHByb3BzLnB1dChrZXksIHZhbHVlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdERlZmF1bHRQcm9wZXJ0aWVzKGZpbmFsIFN0cmluZyByZWRpcmVjdFVyaSwgZmluYWwgU3RyaW5nIHNjb3BlKSB7CisgICAgICAgIHNldERlZmF1bHRQcm9wZXJ0eShPQXV0aDJQYXJhbWV0ZXJzLlJFU1BPTlNFX1RZUEUsICJjb2RlIiwgYXV0aG9yaXphdGlvblByb3BlcnRpZXMpOworICAgICAgICBzZXREZWZhdWx0UHJvcGVydHkoT0F1dGgyUGFyYW1ldGVycy5DTElFTlRfSUQsIGNsaWVudElkZW50aWZpZXIuZ2V0Q2xpZW50SWQoKSwgYXV0aG9yaXphdGlvblByb3BlcnRpZXMsCisgICAgICAgICAgICAgICAgYWNjZXNzVG9rZW5Qcm9wZXJ0aWVzLCByZWZyZXNoVG9rZW5Qcm9wZXJ0aWVzKTsKKyAgICAgICAgc2V0RGVmYXVsdFByb3BlcnR5KE9BdXRoMlBhcmFtZXRlcnMuUkVESVJFQ1RfVVJJLCByZWRpcmVjdFVyaSA9PSBudWxsCisgICAgICAgICAgICAgICAgPyBPQXV0aDJQYXJhbWV0ZXJzLlJFRElSRUNUX1VSSV9VTkRFRklORUQgOiByZWRpcmVjdFVyaSwgYXV0aG9yaXphdGlvblByb3BlcnRpZXMsIGFjY2Vzc1Rva2VuUHJvcGVydGllcyk7CisgICAgICAgIHNldERlZmF1bHRQcm9wZXJ0eShPQXV0aDJQYXJhbWV0ZXJzLlNUQVRFLCBVVUlELnJhbmRvbVVVSUQoKS50b1N0cmluZygpLCBhdXRob3JpemF0aW9uUHJvcGVydGllcyk7CisgICAgICAgIHNldERlZmF1bHRQcm9wZXJ0eShPQXV0aDJQYXJhbWV0ZXJzLlNDT1BFLCBzY29wZSwgYXV0aG9yaXphdGlvblByb3BlcnRpZXMpOworCisgICAgICAgIHNldERlZmF1bHRQcm9wZXJ0eShPQXV0aDJQYXJhbWV0ZXJzLkNMSUVOVF9TRUNSRVQsIGNsaWVudElkZW50aWZpZXIuZ2V0Q2xpZW50U2VjcmV0KCksIGFjY2Vzc1Rva2VuUHJvcGVydGllcywKKyAgICAgICAgICAgICAgICByZWZyZXNoVG9rZW5Qcm9wZXJ0aWVzKTsKKyAgICAgICAgc2V0RGVmYXVsdFByb3BlcnR5KE9BdXRoMlBhcmFtZXRlcnMuR3JhbnRUeXBlLmtleSwgT0F1dGgyUGFyYW1ldGVycy5HcmFudFR5cGUuQVVUSE9SSVpBVElPTl9DT0RFLm5hbWUoKS50b0xvd2VyQ2FzZSgpLAorICAgICAgICAgICAgICAgIGFjY2Vzc1Rva2VuUHJvcGVydGllcyk7CisKKyAgICAgICAgc2V0RGVmYXVsdFByb3BlcnR5KE9BdXRoMlBhcmFtZXRlcnMuR3JhbnRUeXBlLmtleSwgT0F1dGgyUGFyYW1ldGVycy5HcmFudFR5cGUuUkVGUkVTSF9UT0tFTi5uYW1lKCkudG9Mb3dlckNhc2UoKSwKKyAgICAgICAgICAgICAgICByZWZyZXNoVG9rZW5Qcm9wZXJ0aWVzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBhY2Nlc3NUb2tlblVyaTsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBhdXRob3JpemF0aW9uVXJpOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHJlZnJlc2hUb2tlblVyaTsKKyAgICBwcml2YXRlIGZpbmFsIENsaWVudElkZW50aWZpZXIgY2xpZW50SWRlbnRpZmllcjsKKworICAgIHByaXZhdGUgZmluYWwgQ2xpZW50IGNsaWVudDsKKworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBhdXRob3JpemF0aW9uUHJvcGVydGllczsKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gYWNjZXNzVG9rZW5Qcm9wZXJ0aWVzOworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiByZWZyZXNoVG9rZW5Qcm9wZXJ0aWVzOworCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBUb2tlblJlc3VsdCB0b2tlblJlc3VsdDsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgc3RhcnQoKSB7CisgICAgICAgIGZpbmFsIFVyaUJ1aWxkZXIgdXJpQnVpbGRlciA9IFVyaUJ1aWxkZXIuZnJvbVVyaShhdXRob3JpemF0aW9uVXJpKTsKKyAgICAgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IGVudHJ5IDogYXV0aG9yaXphdGlvblByb3BlcnRpZXMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgdXJpQnVpbGRlci5xdWVyeVBhcmFtKGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdXJpQnVpbGRlci5idWlsZCgpLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFRva2VuUmVzdWx0IGZpbmlzaChmaW5hbCBTdHJpbmcgYXV0aG9yaXphdGlvbkNvZGUsIGZpbmFsIFN0cmluZyBzdGF0ZSkgeworICAgICAgICBpZiAoIXRoaXMuYXV0aG9yaXphdGlvblByb3BlcnRpZXMuZ2V0KE9BdXRoMlBhcmFtZXRlcnMuU1RBVEUpLmVxdWFscyhzdGF0ZSkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfRkxPV19XUk9OR19TVEFURSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGFjY2Vzc1Rva2VuUHJvcGVydGllcy5wdXQoT0F1dGgyUGFyYW1ldGVycy5DT0RFLCBhdXRob3JpemF0aW9uQ29kZSk7CisgICAgICAgIGZpbmFsIEZvcm0gZm9ybSA9IG5ldyBGb3JtKCk7CisgICAgICAgIGZvciAoZmluYWwgTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA6IGFjY2Vzc1Rva2VuUHJvcGVydGllcy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBmb3JtLnBhcmFtKGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gY2xpZW50LnRhcmdldChhY2Nlc3NUb2tlblVyaSkKKyAgICAgICAgICAgICAgICAucmVxdWVzdChNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkoZm9ybSwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0ZPUk1fVVJMRU5DT0RFRF9UWVBFKSk7CisKKyAgICAgICAgaWYgKHJlc3BvbnNlLmdldFN0YXR1cygpICE9IDIwMCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfRkxPV19SRVFVRVNUX0FDQ0VTU19UT0tFTihyZXNwb25zZS5nZXRTdGF0dXMoKSkpOworICAgICAgICB9CisgICAgICAgIHRoaXMudG9rZW5SZXN1bHQgPSByZXNwb25zZS5yZWFkRW50aXR5KFRva2VuUmVzdWx0LmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIHRva2VuUmVzdWx0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUb2tlblJlc3VsdCByZWZyZXNoQWNjZXNzVG9rZW4oZmluYWwgU3RyaW5nIHJlZnJlc2hUb2tlbikgeworICAgICAgICByZWZyZXNoVG9rZW5Qcm9wZXJ0aWVzLnB1dChPQXV0aDJQYXJhbWV0ZXJzLlJFRlJFU0hfVE9LRU4sIHJlZnJlc2hUb2tlbik7CisgICAgICAgIGZpbmFsIEZvcm0gZm9ybSA9IG5ldyBGb3JtKCk7CisgICAgICAgIGZvciAoZmluYWwgTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBlbnRyeSA6IHJlZnJlc2hUb2tlblByb3BlcnRpZXMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgZm9ybS5wYXJhbShlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IGNsaWVudC50YXJnZXQocmVmcmVzaFRva2VuVXJpKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eShmb3JtLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fRk9STV9VUkxFTkNPREVEX1RZUEUpKTsKKworICAgICAgICBpZiAocmVzcG9uc2UuZ2V0U3RhdHVzKCkgIT0gMjAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbihMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9GTE9XX1JFUVVFU1RfUkVGUkVTSF9UT0tFTihyZXNwb25zZS5nZXRTdGF0dXMoKSkpOworICAgICAgICB9CisKKyAgICAgICAgdGhpcy50b2tlblJlc3VsdCA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoVG9rZW5SZXN1bHQuY2xhc3MpOworICAgICAgICByZXR1cm4gdG9rZW5SZXN1bHQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENsaWVudCBnZXRBdXRob3JpemVkQ2xpZW50KCkgeworICAgICAgICByZXR1cm4gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKS5yZWdpc3RlcihnZXRPQXV0aDJGZWF0dXJlKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBGZWF0dXJlIGdldE9BdXRoMkZlYXR1cmUoKSB7CisgICAgICAgIGlmICh0aGlzLnRva2VuUmVzdWx0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfRkxPV19OT1RfRklOSVNIRUQoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBPQXV0aDJDbGllbnRGZWF0dXJlKHRva2VuUmVzdWx0LmdldEFjY2Vzc1Rva2VuKCkpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBEZWZhdWx0VG9rZW5NZXNzYWdlQm9keVJlYWRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5UmVhZGVyPFRva2VuUmVzdWx0PiB7CisKKyAgICAgICAgLy8gUHJvdmlkZXIgaGVyZSBwcmV2ZW50cyBjaXJjdWxhciBkZXBlbmRlbmN5IGVycm9yIGZyb20gSEsyICh3b3JrZXJzIGluamVjdCBwcm92aWRlcnMgYW5kIHRoaXMgcHJvdmlkZXIgaW5qZWN0IHdvcmtlcnMpCisgICAgICAgIEBJbmplY3QKKyAgICAgICAgcHJpdmF0ZSBQcm92aWRlcjxNZXNzYWdlQm9keVdvcmtlcnM+IHdvcmtlcnM7CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBwcml2YXRlIFByb3ZpZGVyPFByb3BlcnRpZXNEZWxlZ2F0ZT4gcHJvcGVydGllc0RlbGVnYXRlUHJvdmlkZXI7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgSXRlcmFibGU8UmVhZGVySW50ZXJjZXB0b3I+IEVNUFRZX0lOVEVSQ0VQVE9SUyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKGZpbmFsIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHR5cGUuZXF1YWxzKFRva2VuUmVzdWx0LmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVG9rZW5SZXN1bHQgcmVhZEZyb20oZmluYWwgQ2xhc3M8VG9rZW5SZXN1bHQ+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUsIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIGZpbmFsIEdlbmVyaWNUeXBlPE1hcDxTdHJpbmcsIE9iamVjdD4+IG1hcFR5cGUgPSBuZXcgR2VuZXJpY1R5cGU8TWFwPFN0cmluZywgT2JqZWN0Pj4oKSB7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IChNYXA8U3RyaW5nLCBPYmplY3Q+KSB3b3JrZXJzLmdldCgpLnJlYWRGcm9tKG1hcFR5cGUuZ2V0UmF3VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICBtYXBUeXBlLmdldFR5cGUoKSwgYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZSwgaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXNEZWxlZ2F0ZVByb3ZpZGVyLmdldCgpLAorICAgICAgICAgICAgICAgICAgICBlbnRpdHlTdHJlYW0sIEVNUFRZX0lOVEVSQ0VQVE9SUywgZmFsc2UpOworCisgICAgICAgICAgICByZXR1cm4gbmV3IFRva2VuUmVzdWx0KG1hcCk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L29hdXRoMi1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvb2F1dGgyL0NsaWVudElkZW50aWZpZXIuamF2YSBiL3NlY3VyaXR5L29hdXRoMi1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvb2F1dGgyL0NsaWVudElkZW50aWZpZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTE2Y2I1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvb2F1dGgyLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9vYXV0aDIvQ2xpZW50SWRlbnRpZmllci5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50Lm9hdXRoMjsKKworLyoqCisgKiBDbGllbnQgSWRlbnRpZmllciB0aGF0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGNsaWVudCBpZCBhbmQgY2xpZW50IHNlY3JldCBpc3N1ZXMgYnkgYQorICogU2VydmljZSBQcm92aWRlciBmb3IgYXBwbGljYXRpb24uIFRoZSBjbGFzcyBzdG9yZXMgY2xpZW50IHNlY3JldCBhcyBieXRlIGFycmF5IHRvIGltcHJvdmUgc2VjdXJpdHkuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICogQHNpbmNlIDIuMworICovCitwdWJsaWMgY2xhc3MgQ2xpZW50SWRlbnRpZmllciB7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY2xpZW50SWQ7CisgICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gY2xpZW50U2VjcmV0OworCisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2UgaW5pdGlhbGl6ZWQgd2l0aCBjbGllbnQgaWQgYW5kIGNsaWVudCBzZWNyZXQgaW4gZm9ybSBvZiBTdHJpbmcgdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xpZW50SWQgQ2xpZW50IGlkLgorICAgICAqIEBwYXJhbSBjbGllbnRTZWNyZXQgQ2xpZW50IHNlY3JldCBpZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2xpZW50SWRlbnRpZmllcihmaW5hbCBTdHJpbmcgY2xpZW50SWQsIGZpbmFsIFN0cmluZyBjbGllbnRTZWNyZXQpIHsKKyAgICAgICAgdGhpcy5jbGllbnRJZCA9IGNsaWVudElkOworICAgICAgICB0aGlzLmNsaWVudFNlY3JldCA9IGNsaWVudFNlY3JldC5nZXRCeXRlcygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBpbml0aWFsaXplZCB3aXRoIGNsaWVudCBpZCBhbmQgY2xpZW50IHNlY3JldCBpbiBmb3JtIG9mIGJ5dGUgYXJyYXkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xpZW50SWQgQ2xpZW50IGlkLgorICAgICAqIEBwYXJhbSBjbGllbnRTZWNyZXQgQ2xpZW50IHNlY3JldCBpZCBhcyBhIGJ5dGUgYXJyYXkgdmFsdWUgaW4gdGhlIGRlZmF1bHQgZW5jb2RpbmcuCisgICAgICovCisgICAgcHVibGljIENsaWVudElkZW50aWZpZXIoZmluYWwgU3RyaW5nIGNsaWVudElkLCBmaW5hbCBieXRlW10gY2xpZW50U2VjcmV0KSB7CisgICAgICAgIHRoaXMuY2xpZW50SWQgPSBjbGllbnRJZDsKKyAgICAgICAgdGhpcy5jbGllbnRTZWNyZXQgPSBjbGllbnRTZWNyZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBjbGllbnQgaWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIENsaWVudCBpZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldENsaWVudElkKCkgeworICAgICAgICByZXR1cm4gY2xpZW50SWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGNsaWVudCBzZWNyZXQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIENsaWVudCBzZWNyZXQgYXMgYSBTdHJpbmcuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRDbGllbnRTZWNyZXQoKSB7CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGNsaWVudFNlY3JldCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGNsaWVudCBzZWNyZXQgYXMgYnl0ZSBhcnJheS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQ2xpZW50IHNlY3JldCBhcyBhIGJ5dGUgYXJyYXkuCisgICAgICovCisgICAgcHVibGljIGJ5dGVbXSBnZXRDbGllbnRTZWNyZXRBc0J5dGVBcnJheSgpIHsKKyAgICAgICAgcmV0dXJuIGNsaWVudFNlY3JldDsKKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvb2F1dGgyLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9vYXV0aDIvT0F1dGgyQ2xpZW50RmVhdHVyZS5qYXZhIGIvc2VjdXJpdHkvb2F1dGgyLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9vYXV0aDIvT0F1dGgyQ2xpZW50RmVhdHVyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhM2YwZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9vYXV0aDItY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L29hdXRoMi9PQXV0aDJDbGllbnRGZWF0dXJlLmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQub2F1dGgyOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CisKKy8qKgorICogT0F1dGgyIGNsaWVudCBmaWx0ZXIgZmVhdHVyZSByZWdpc3RlcnMgdGhlIHN1cHBvcnQgZm9yIHBlcmZvcm1pbmcgYXV0aGVudGljYXRlZCByZXF1ZXN0cyB0byB0aGUKKyAqIFNlcnZpY2UgUHJvdmlkZXIuIFRoZSBmZWF0dXJlIGRvZXMgbm90IHBlcmZvcm0gQXV0aG9yaXphdGlvbiBGbG93IChzZWUge0BsaW5rIE9BdXRoMkNvZGVHcmFudEZsb3d9CisgKiBmb3IgZGV0YWlscyBob3cgdG8gdXNlIEF1dGhvcml6YXRpb24gRmxvdyBhbmQgcmV0cmlldmUgQWNjZXNzIFRva2VuKS4gVGhlIGZlYXR1cmUgdXNlcyBhY2Nlc3MgdG8gaW5pdGlhbGl6ZQorICogdGhlIGludGVybmFsIHtAbGluayBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlciBmaWx0ZXJ9CisgKiB3aGljaCB3aWxsIGFkZCB7QGNvZGUgQXV0aG9yaXphdGlvbn0gaHR0cCBoZWFkZXIgY29udGFpbmluZyBPQXV0aCAyIGF1dGhvcml6YXRpb24gaW5mb3JtYXRpb24gaW5jbHVkaW5nIChiYXNlZAorICogb24ge0Bjb2RlIGJlYXJlcn0gdG9rZW5zKS4KKyAqIDxwPgorICogVGhlIGludGVybmFsIGZpbHRlciBjYW4gYmUgY29udHJvbGxlZCBieSBwcm9wZXJ0aWVzIHB1dCBpbnRvCisgKiB0aGUge0BsaW5rIGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0Q29udGV4dCBjbGllbnQgcmVxdWVzdH0KKyAqIHVzaW5nIHtAbGluayBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdENvbnRleHQjc2V0UHJvcGVydHkoU3RyaW5nLCBPYmplY3QpfSBtZXRob2QuIFRoZSBwcm9wZXJ0eSBrZXkKKyAqIGlzIGRlZmluZWQgaW4gdGhpcyBjbGFzcyBhcyBhIHN0YXRpYyB2YXJpYWJsZXMKKyAqICh7QGxpbmsgT0F1dGgyQ2xpZW50U3VwcG9ydCNPQVVUSDJfUFJPUEVSVFlfQUNDRVNTX1RPS0VOfSAoc2VlIGl0cyBqYXZhZG9jIGZvciB1c2FnZSkuCisgKiBVc2luZyB0aGUgcHJvcGVydHkgYSBzcGVjaWZpYworICogYWNjZXNzIHRva2VuIGNhbiBiZSBkZWZpbmVkIGZvciBlYWNoIHJlcXVlc3QuCisgKiA8L3A+CisgKiBFeGFtcGxlIG9mIHVzaW5nIHNwZWNpZmljIGFjY2VzcyB0b2tlbiBmb3Igb25lIHJlcXVlc3Q6CisgKiA8cHJlPgorICogZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSBjbGllbnQudGFyZ2V0KCJmb28iKS5yZXF1ZXN0KCkKKyAqICAgICAgICAgICAucHJvcGVydHkoT0FVVEgyX1BST1BFUlRZX0FDQ0VTU19UT0tFTiwgIjZhYjQ1YWI0NjVlNDZmNTRkNzcxYSIpLmdldCgpOworICogPC9wcmU+CisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICogQHNpbmNlIDIuMworICovCitjbGFzcyBPQXV0aDJDbGllbnRGZWF0dXJlIGltcGxlbWVudHMgRmVhdHVyZSB7CisKKyAgICBwcml2YXRlIGZpbmFsIE9BdXRoMkNsaWVudEZpbHRlciBmaWx0ZXI7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgZmVhdHVyZSBpbml0aWFsaXplZCBmb3IgdGhlIGFjY2VzcyB0b2tlbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhY2Nlc3NUb2tlbiBBY2Nlc3MgdG9rZW4uCisgICAgICovCisgICAgcHVibGljIE9BdXRoMkNsaWVudEZlYXR1cmUoU3RyaW5nIGFjY2Vzc1Rva2VuKSB7CisgICAgICAgIHRoaXMuZmlsdGVyID0gbmV3IE9BdXRoMkNsaWVudEZpbHRlcihhY2Nlc3NUb2tlbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGZpbHRlciBmZWF0dXJlIHdpdGggbm8gZGVmYXVsdCBhY2Nlc3MgdG9rZW4uIFRoZSB0b2tlbiB3aWxsIGhhdmUgdG8gYmUKKyAgICAgKiBzcGVjaWZpZWQgYnkge0BsaW5rIE9BdXRoMkNsaWVudFN1cHBvcnQjT0FVVEgyX1BST1BFUlRZX0FDQ0VTU19UT0tFTn0KKyAgICAgKiBmb3IgZWFjaCByZXF1ZXN0IG90aGVyd2lzZSBubyB7QGNvZGUgQXV0aG9yaXphdGlvbn0KKyAgICAgKiBodHRwIGhlYWRlciB3aWxsIGJlIGFkZGVkLgorICAgICAqLworICAgIHB1YmxpYyBPQXV0aDJDbGllbnRGZWF0dXJlKCkgeworICAgICAgICB0aGlzLmZpbHRlciA9IG5ldyBPQXV0aDJDbGllbnRGaWx0ZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgZmVhdHVyZSB3aXRoIHRoZSBnaXZlbiB7QGNvZGUgZmlsdGVyfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWx0ZXIgRmlsdGVyIGluc3RhbmNlLgorICAgICAqLworICAgIE9BdXRoMkNsaWVudEZlYXR1cmUoT0F1dGgyQ2xpZW50RmlsdGVyIGZpbHRlcikgeworICAgICAgICB0aGlzLmZpbHRlciA9IGZpbHRlcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmUoRmVhdHVyZUNvbnRleHQgY29udGV4dCkgeworICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKGZpbHRlcik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L29hdXRoMi1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvb2F1dGgyL09BdXRoMkNsaWVudEZpbHRlci5qYXZhIGIvc2VjdXJpdHkvb2F1dGgyLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9vYXV0aDIvT0F1dGgyQ2xpZW50RmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ5MDFkZQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L29hdXRoMi1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvb2F1dGgyL09BdXRoMkNsaWVudEZpbHRlci5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50Lm9hdXRoMjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcmlvcml0aWVzOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qcmlvcml0eTsKKworLyoqCisgKiBDbGllbnQgZmlsdGVyIHRoYXQgYWRkcyBhY2Nlc3MgdG9rZW4gdG8gdGhlIHtAY29kZSBBdXRob3JpemF0aW9ufSBodHRwIGhlYWRlci4gVGhlIGZpbHRlciB1c2VzIHtAY29kZSBiZWFyZXJ9CisgKiB0b2tlbiBzcGVjaWZpY2F0aW9uLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqIEBzaW5jZSAyLjMKKyAqLworQFByaW9yaXR5KFByaW9yaXRpZXMuQVVUSEVOVElDQVRJT04pCitjbGFzcyBPQXV0aDJDbGllbnRGaWx0ZXIgaW1wbGVtZW50cyBDbGllbnRSZXF1ZXN0RmlsdGVyIHsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGFjY2Vzc1Rva2VuOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGZpbHRlciB3aXRoIHByZWRlZmluZWQgYWNjZXNzIHRva2VuLgorICAgICAqCisgICAgICogQHBhcmFtIGFjY2Vzc1Rva2VuIEFjY2VzcyB0b2tlbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgT0F1dGgyQ2xpZW50RmlsdGVyKFN0cmluZyBhY2Nlc3NUb2tlbikgeworICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuID0gYWNjZXNzVG9rZW47CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGZpbHRlciB3aXRoIG5vIGRlZmF1bHQgYWNjZXNzIHRva2VuLiBUaGUgdG9rZW4gbXVzdCBiZSBzcGVjaWZpZWQgd2l0aAorICAgICAqIGVhY2ggcmVxdWVzdCB1c2luZyB7QGxpbmsgT0F1dGgyQ2xpZW50U3VwcG9ydCNPQVVUSDJfUFJPUEVSVFlfQUNDRVNTX1RPS0VOfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgT0F1dGgyQ2xpZW50RmlsdGVyKCkgeworICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuID0gbnVsbDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ2xpZW50UmVxdWVzdENvbnRleHQgcmVxdWVzdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHRva2VuID0gdGhpcy5hY2Nlc3NUb2tlbjsKKyAgICAgICAgZmluYWwgU3RyaW5nIHByb3BlcnR5VG9rZW4gPSAoU3RyaW5nKSByZXF1ZXN0LmdldFByb3BlcnR5KE9BdXRoMkNsaWVudFN1cHBvcnQuT0FVVEgyX1BST1BFUlRZX0FDQ0VTU19UT0tFTik7CisgICAgICAgIGlmIChwcm9wZXJ0eVRva2VuICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRva2VuID0gcHJvcGVydHlUb2tlbjsKKyAgICAgICAgfQorICAgICAgICByZXF1ZXN0LnJlbW92ZVByb3BlcnR5KE9BdXRoMkNsaWVudFN1cHBvcnQuT0FVVEgyX1BST1BFUlRZX0FDQ0VTU19UT0tFTik7CisgICAgICAgIGlmICh0b2tlbiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIGF1dGhlbnRpY2F0aW9uID0gIkJlYXJlciAiICsgdG9rZW47CisKKyAgICAgICAgaWYgKCFyZXF1ZXN0LmdldEhlYWRlcnMoKS5jb250YWluc0tleShIdHRwSGVhZGVycy5BVVRIT1JJWkFUSU9OKSkgeworICAgICAgICAgICAgcmVxdWVzdC5nZXRIZWFkZXJzKCkuYWRkKEh0dHBIZWFkZXJzLkFVVEhPUklaQVRJT04sIGF1dGhlbnRpY2F0aW9uKTsKKyAgICAgICAgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvb2F1dGgyLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9vYXV0aDIvT0F1dGgyQ2xpZW50U3VwcG9ydC5qYXZhIGIvc2VjdXJpdHkvb2F1dGgyLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9vYXV0aDIvT0F1dGgyQ2xpZW50U3VwcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MmMxYTIKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9vYXV0aDItY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L29hdXRoMi9PQXV0aDJDbGllbnRTdXBwb3J0LmphdmEKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50Lm9hdXRoMjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZTsKKworLyoqCisgKiBNYWluIGNsYXNzIHRvIGJ1aWxkIHRoZSBBdXRob3JpemF0aW9uIEZsb3cgaW5zdGFuY2VzIGFuZCB7QGxpbmsgamF2YXgud3MucnMuY29yZS5GZWF0dXJlIGNsaWVudCBmaWx0ZXIgZmVhdHVyZX0gdGhhdAorICogY2FuIHN1cHBvcnRzIHBlcmZvcm1pbmcgb2YgYXV0aGVudGljYXRlZCBPQXV0aCByZXF1ZXN0cy4KKyAqIDxwPjxiPkF1dGhvcml6YXRpb24gZmxvdzwvYj48L3A+CisgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBhdXRob3JpemF0aW9uIGZsb3csIHNlZSB7QGxpbmsgT0F1dGgyQ29kZUdyYW50Rmxvd30uCisgKiA8cD48Yj5DbGllbnQgZmVhdHVyZTwvYj48L3A+CisgKiA8cD4KKyAqIFVzZSBtZXRob2Qge0BsaW5rICNmZWF0dXJlKFN0cmluZyl9IHRvIGJ1aWxkIHRoZSBmZWF0dXJlLiBPQXV0aDIgY2xpZW50IGZpbHRlciBmZWF0dXJlIHJlZ2lzdGVycworICogdGhlIHN1cHBvcnQgZm9yIHBlcmZvcm1pbmcgYXV0aGVudGljYXRlZCByZXF1ZXN0cyB0byB0aGUKKyAqIFNlcnZpY2UgUHJvdmlkZXIuIFRoZSBmZWF0dXJlIHVzZXMgYW4gYWNjZXNzIHRva2VuIHRvIGluaXRpYWxpemUKKyAqIHRoZSBpbnRlcm5hbCB7QGxpbmsgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RGaWx0ZXIgZmlsdGVyfQorICogd2hpY2ggd2lsbCBhZGQge0Bjb2RlIEF1dGhvcml6YXRpb259IGh0dHAgaGVhZGVyIGNvbnRhaW5pbmcgT0F1dGggMiBhdXRob3JpemF0aW9uIGluZm9ybWF0aW9uIChiYXNlZAorICogb24ge0Bjb2RlIGJlYXJlcn0gdG9rZW5zKS4KKyAqIDwvcD4KKyAqCisgKiA8cD4KKyAqIFRoZSBpbnRlcm5hbCBmaWx0ZXIgY2FuIGJlIGNvbnRyb2xsZWQgYnkgcHJvcGVydGllcyBwdXQgaW50bworICogdGhlIHtAbGluayBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdENvbnRleHQgY2xpZW50IHJlcXVlc3R9CisgKiB1c2luZyB7QGxpbmsgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RDb250ZXh0I3NldFByb3BlcnR5KFN0cmluZywgT2JqZWN0KX0gbWV0aG9kLiBUaGUgcHJvcGVydHkga2V5CisgKiBpcyBkZWZpbmVkIGluIHRoaXMgY2xhc3MgYXMgYSBzdGF0aWMgdmFyaWFibGVzCisgKiAoe0BsaW5rIE9BdXRoMkNsaWVudFN1cHBvcnQjT0FVVEgyX1BST1BFUlRZX0FDQ0VTU19UT0tFTn0gKHNlZSBpdHMgamF2YWRvYyBmb3IgdXNhZ2UpLgorICogVXNpbmcgdGhlIHByb3BlcnR5IGEgc3BlY2lmaWMKKyAqIGFjY2VzcyB0b2tlbiBjYW4gYmUgZGVmaW5lZCBmb3IgZWFjaCByZXF1ZXN0LgorICogPC9wPgorICogRXhhbXBsZSBvZiB1c2luZyBzcGVjaWZpYyBhY2Nlc3MgdG9rZW4gZm9yIG9uZSByZXF1ZXN0OgorICogPHByZT4KKyAqIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gY2xpZW50LnRhcmdldCgiZm9vIikucmVxdWVzdCgpCisgKiAgICAgICAgICAgLnByb3BlcnR5KE9BVVRIMl9QUk9QRVJUWV9BQ0NFU1NfVE9LRU4sICI2YWI0NWFiNDY1ZTQ2ZjU0ZDc3MWEiKS5nZXQoKTsKKyAqIDwvcHJlPgorCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICogQHNpbmNlIDIuMworICovCitwdWJsaWMgZmluYWwgY2xhc3MgT0F1dGgyQ2xpZW50U3VwcG9ydCB7CisgICAgLyoqCisgICAgICogS2V5IG9mIHRoZSBwcm9wZXJ0eSB0aGF0IGNhbiBiZSBhdHRhY2hlZCB0byB0aGUKKyAgICAgKiB7QGxpbmsgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RDb250ZXh0IGNsaWVudCByZXF1ZXN0fSB1c2luZworICAgICAqIHtAbGluayBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdENvbnRleHQjc2V0UHJvcGVydHkoU3RyaW5nLCBPYmplY3QpfSBhbmQgdGhhdAorICAgICAqIGRlZmluZXMgYWNjZXNzIHRva2VuIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiBnZW5lcmF0aW5nIE9BdXRoIHtAY29kZSBBdXRob3JpemF0aW9ufQorICAgICAqIGh0dHAgaGVhZGVyLiBUaGUgcHJvcGVydHkgd2lsbCBvdmVycmlkZSB0aGUgc2V0dGluZyBvZiB0aGUgaW50ZXJuYWwKKyAgICAgKiB7QGxpbmsgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RGaWx0ZXIgZmlsdGVyfSBmb3IgdGhlIGN1cnJlbnQgcmVxdWVzdCBvbmx5LiBUaGlzIHByb3BlcnR5CisgICAgICogY2FuIGJlIHVzZWQgb25seSB3aGVuIHtAbGluayBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmUgT0FhdXRoIDIgZmlsdGVyIGZlYXR1cmV9IGlzCisgICAgICogcmVnaXN0ZXJlZCBpbnRvIHRoZSB7QGxpbmsgamF2YXgud3MucnMuY2xpZW50LkNsaWVudH0KKyAgICAgKiBpbnN0YW5jZS4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IG11c3QgYmUgYSB7QGxpbmsgU3RyaW5nfS4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT0FVVEgyX1BST1BFUlRZX0FDQ0VTU19UT0tFTiA9ICJqZXJzZXkuY29uZmlnLmNsaWVudC5vYXV0aDIuYWNjZXNzLnRva2VuIjsKKworICAgIC8qKgorICAgICAqIEJ1aWxkIHRoZSB7QGxpbmsgRmVhdHVyZSBjbGllbnQgZmlsdGVyIGZlYXR1cmV9IGZyb20gdGhlIHtAY29kZSBhY2Nlc3NUb2tlbn0gdGhhdCB3aWxsIGFkZAorICAgICAqIHtAY29kZSBBdXRob3JpemF0aW9ufSBodHRwIGhlYWRlciB0byB0aGUgcmVxdWVzdCB3aXRoIHRoZSBPQXV0aCBhdXRob3JpemF0aW9uIGluZm9ybWF0aW9uLgorICAgICAqCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWNjZXNzVG9rZW4gQWNjZXNzIHRva2VuIHRvIGJlIHVzZWQgaW4gdGhlIGF1dGhvcml6YXRpb24gaGVhZGVyIG9yIHtAY29kZSBudWxsfQorICAgICAqICAgICAgICAgICAgICAgICAgICBpZiBubyBkZWZhdWx0IGFjY2VzcyB0b2tlbiBzaG91bGQgYmUgZGVmaW5lZC4gSW4gdGhpcyBjYXNlIHRoZSB0b2tlbgorICAgICAqICAgICAgICAgICAgICAgICAgICB3aWxsIGhhdmUgdG8gYmUgc2V0IGZvciBlYWNoIHJlcXVlc3QgdXNpbmcge0BsaW5rICNPQVVUSDJfUFJPUEVSVFlfQUNDRVNTX1RPS0VOfQorICAgICAqICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS4KKyAgICAgKiBAcmV0dXJuIENsaWVudCBmZWF0dXJlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRmVhdHVyZSBmZWF0dXJlKFN0cmluZyBhY2Nlc3NUb2tlbikgeworICAgICAgICByZXR1cm4gbmV3IE9BdXRoMkNsaWVudEZlYXR1cmUoYWNjZXNzVG9rZW4pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgYnVpbGRlciBvZiB0aGUge0BsaW5rIE9BdXRoMkNvZGVHcmFudEZsb3cgQXV0aG9yaXphdGlvbiBDb2RlIEdyYW50IEZsb3d9LgorICAgICAqCisgICAgICogQHBhcmFtIGNsaWVudElkZW50aWZpZXIgQ2xpZW50IGlkZW50aWZpZXIgKGlkIG9mIGFwcGxpY2F0aW9uIHRoYXQgd2FudHMgdG8gYmUgYXBwcm92ZWQpLiBJc3N1ZWQgYnkgdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZSBQcm92aWRlci4KKyAgICAgKiBAcGFyYW0gYXV0aG9yaXphdGlvblVyaSBUaGUgVVJJIHRvIHdoaWNoIHRoZSB1c2VyIHNob3VsZCBiZSByZWRpcmVjdGVkIHRvIGF1dGhvcml6ZSBvdXIgYXBwbGljYXRpb24uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgVGhlIFVSSSBwb2ludHMgdG8gdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIGF1dGhvcml6YXRpb24gc2VydmVyIGFuZCBpcyBkZWZpbmVkIGJ5IHRoZSBTZXJ2aWNlIFByb3ZpZGVyLgorICAgICAqIEBwYXJhbSBhY2Nlc3NUb2tlblVyaSBUaGUgYWNjZXNzIHRva2VuIFVSSSBvbiB3aGljaCB0aGUgYWNjZXNzIHRva2VuIGNhbiBiZSByZXF1ZXN0ZWQuIFRoZSBVUkkgcG9pbnRzIHRvIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRob3JpemF0aW9uIHNlcnZlciBhbmQgaXMgZGVmaW5lZCBieSB0aGUgU2VydmljZSBQcm92aWRlci4KKyAgICAgKiBAcmV0dXJuIGJ1aWxkZXIgb2YgdGhlIHtAbGluayBPQXV0aDJDb2RlR3JhbnRGbG93IEF1dGhvcml6YXRpb24gQ29kZSBHcmFudCBGbG93fS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9BdXRoMkNvZGVHcmFudEZsb3cuQnVpbGRlciBhdXRob3JpemF0aW9uQ29kZUdyYW50Rmxvd0J1aWxkZXIoQ2xpZW50SWRlbnRpZmllciBjbGllbnRJZGVudGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgYXV0aG9yaXphdGlvblVyaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGFjY2Vzc1Rva2VuVXJpKSB7CisgICAgICAgIHJldHVybiBuZXcgQXV0aENvZGVHcmFudEltcGwuQnVpbGRlcihjbGllbnRJZGVudGlmaWVyLCBhdXRob3JpemF0aW9uVXJpLCBhY2Nlc3NUb2tlblVyaSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgYnVpbGRlciB0aGF0IGNhbiBiZSBkaXJlY3RseSB1c2VkIHRvIHBlcmZvcm0gQXV0aG9yaXphdGlvbiBDb2RlIEdyYW50IGZsb3cgZGVmaW5lZCBieQorICAgICAqIEdvb2dsZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGllbnRJZGVudGlmaWVyIENsaWVudCBpZGVudGlmaWVyIChpZCBvZiBhcHBsaWNhdGlvbiB0aGF0IHdhbnRzIHRvIGJlIGFwcHJvdmVkKS4gSXNzdWVkIGJ5IHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2UgUHJvdmlkZXIuCisgICAgICogQHBhcmFtIHJlZGlyZWN0VVJJIFVSSSB0byB3aGljaCB0aGUgdXNlciAocmVzb3VyY2Ugb3duZXIpIHNob3VsZCBiZSByZWRpcmVjdGVkIGFmdGVyIGhlL3NoZQorICAgICAqICAgICAgICAgICAgICAgICAgICBncmFudHMgYWNjZXNzIHRvIG91ciBhcHBsaWNhdGlvbiBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIGFwcGxpY2F0aW9uCisgICAgICogICAgICAgICAgICAgICAgICAgIGRvZXMgbm90IHN1cHBvcnQgcmVkaXJlY3Rpb24gKGVnLiBpcyBub3QgYSB3ZWIgc2VydmVyKS4KKyAgICAgKiBAcGFyYW0gc2NvcGUgVGhlIGFwaSB0byB3aGljaCBhbiBhY2Nlc3MgaXMgcmVxdWVzdGVkIChlZy4gR29vZ2xlIHRhc2tzKS4KKyAgICAgKiBAcmV0dXJuIEdvb2dsZSBidWlsZGVyIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT0F1dGgyRmxvd0dvb2dsZUJ1aWxkZXIgZ29vZ2xlRmxvd0J1aWxkZXIoQ2xpZW50SWRlbnRpZmllciBjbGllbnRJZGVudGlmaWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJlZGlyZWN0VVJJLCBTdHJpbmcgc2NvcGUpIHsKKworICAgICAgICByZXR1cm4gbmV3IE9BdXRoMkZsb3dHb29nbGVCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuYXV0aG9yaXphdGlvblVyaSgiaHR0cHM6Ly9hY2NvdW50cy5nb29nbGUuY29tL28vb2F1dGgyL2F1dGgiKQorICAgICAgICAgICAgICAgIC5hY2Nlc3NUb2tlblVyaSgiaHR0cHM6Ly9hY2NvdW50cy5nb29nbGUuY29tL28vb2F1dGgyL3Rva2VuIikKKyAgICAgICAgICAgICAgICAucmVkaXJlY3RVcmkocmVkaXJlY3RVUkkgPT0gbnVsbCA/IE9BdXRoMlBhcmFtZXRlcnMuUkVESVJFQ1RfVVJJX1VOREVGSU5FRCA6IHJlZGlyZWN0VVJJKQorICAgICAgICAgICAgICAgIC5jbGllbnRJZGVudGlmaWVyKGNsaWVudElkZW50aWZpZXIpCisgICAgICAgICAgICAgICAgLnNjb3BlKHNjb3BlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgYSBidWlsZGVyIHRoYXQgY2FuIGJlIGRpcmVjdGx5IHVzZWQgdG8gcGVyZm9ybSBBdXRob3JpemF0aW9uIENvZGUgR3JhbnQgZmxvdyBkZWZpbmVkIGJ5CisgICAgICogRmFjZWJvb2suCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xpZW50SWRlbnRpZmllciBDbGllbnQgaWRlbnRpZmllciAoaWQgb2YgYXBwbGljYXRpb24gdGhhdCB3YW50cyB0byBiZSBhcHByb3ZlZCkuIElzc3VlZCBieSB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlIFByb3ZpZGVyLgorICAgICAqIEBwYXJhbSByZWRpcmVjdFVSSSBVUkkgdG8gd2hpY2ggdGhlIHVzZXIgKHJlc291cmNlIG93bmVyKSBzaG91bGQgYmUgcmVkaXJlY3RlZCBhZnRlciBoZS9zaGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgZ3JhbnRzIGFjY2VzcyB0byBvdXIgYXBwbGljYXRpb24gb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSBhcHBsaWNhdGlvbgorICAgICAqICAgICAgICAgICAgICAgICAgICBkb2VzIG5vdCBzdXBwb3J0IHJlZGlyZWN0aW9uIChlZy4gaXMgbm90IGEgd2ViIHNlcnZlcikuCisgICAgICogPC9wPgorICAgICAqIEByZXR1cm4gQnVpbGRlciBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9BdXRoMkNvZGVHcmFudEZsb3cuQnVpbGRlciBmYWNlYm9va0Zsb3dCdWlsZGVyKENsaWVudElkZW50aWZpZXIgY2xpZW50SWRlbnRpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZWRpcmVjdFVSSSkgeworICAgICAgICByZXR1cm4gT0F1dGgyRmxvd0ZhY2Vib29rQnVpbGRlci5nZXRGYWNlYm9va0F1dGhvcml6YXRpb25CdWlsZGVyKGNsaWVudElkZW50aWZpZXIsIHJlZGlyZWN0VVJJLAorICAgICAgICAgICAgICAgIENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByZXZlbnQgaW5zdGFudGlhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIE9BdXRoMkNsaWVudFN1cHBvcnQoKSB7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9zZWN1cml0eS9vYXV0aDItY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L29hdXRoMi9PQXV0aDJDb2RlR3JhbnRGbG93LmphdmEgYi9zZWN1cml0eS9vYXV0aDItY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L29hdXRoMi9PQXV0aDJDb2RlR3JhbnRGbG93LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNmNDc2ZAotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L29hdXRoMi1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvb2F1dGgyL09BdXRoMkNvZGVHcmFudEZsb3cuamF2YQpAQCAtMCwwICsxLDMyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQub2F1dGgyOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlOworCisvKioKKyAqIFRoZSBpbnRlcmZhY2UgdGhhdCBkZWZpbmVzIE9BdXRoIDIgQXV0aG9yaXphdGlvbiBDb2RlIEdyYW50IEZsb3cuCisgKiA8cD4KKyAqIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVyZmFjZSBpcyBjYXBhYmxlIG9mIHBlcmZvcm1pbmcgb2YgdGhlIHVzZXIKKyAqIGF1dGhvcml6YXRpb24gZGVmaW5lZCBpbiB0aGUgT0F1dGgyIHNwZWNpZmljYXRpb24gYXMgIkF1dGhvcml6YXRpb24gQ29kZSBHcmFudCBGbG93IiAoT0F1dGggMiBzcGVjIGRlZmluZXMgbW9yZQorICogQXV0aG9yaXphdGlvbiBGbG93cykuIFRoZSByZXN1bHQgb2YgdGhlIGF1dGhvcml6YXRpb24KKyAqIGlzIHRoZSB7QGxpbmsgVG9rZW5SZXN1bHR9LiBUaGUgaW1wbGVtZW50YXRpb24gc3RhcnRzIHRoZSBhdXRob3JpemF0aW9uIHByb2Nlc3MgYnkgY29uc3RydWN0aW9uIG9mIGEgcmVkaXJlY3QgVVJJCisgKiB0byB3aGljaCB0aGUgdXNlciBzaG91bGQKKyAqIGJlIHJlZGlyZWN0ZWQgKHRoZSBVUkkgcG9pbnRzIHRvIGF1dGhvcml6YXRpb24gY29uc2VudCBwYWdlIGhvc3RlZCBieSBTZXJ2aWNlIFByb3ZpZGVyKS4gVGhlIHVzZXIKKyAqIGdyYW50cyBhbiBhY2Nlc3MgdXNpbmcgdGhpcyBwYWdlLiBTZXJ2aWNlIFByb3ZpZGVyIHJlZGlyZWN0cyB0aGUgdXNlciBiYWNrIHRvIHRoZQorICogb3VyIHNlcnZlciBhbmQgdGhlIGF1dGhvcml6YXRpb24gcHJvY2VzcyBpcyBmaW5pc2hlZCB1c2luZyB0aGUgc2FtZSBpbnN0YW5jZSBvZiB0aGUgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uLgorICogPC9wPgorICogPHA+CisgKiBUbyBwZXJmb3JtIHRoZSBhdXRob3JpemF0aW9uIGZvbGxvdyB0aGVzZSBzdGVwczoKKyAqIDxsaXN0PgorICogPGxpPkdldCB0aGUgaW5zdGFuY2Ugb2YgdGhpcyBpbnRlcmZhY2UgdXNpbmcge0BsaW5rIE9BdXRoMkNsaWVudFN1cHBvcnR9LjwvbGk+CisgKiA8bGk+Q2FsbCB7QGxpbmsgI3N0YXJ0KCl9IG1ldGhvZC4gVGhlIG1ldGhvZCByZXR1cm5zIHJlZGlyZWN0aW9uIHVyaSBhcyBhIFN0cmluZy48L2xpPgorICogPGxpPlJlZGlyZWN0IHRoZSB1c2VyIHRvIHRoZSByZWRpcmVjdCBVUkkgcmV0dXJuZWQgZnJvbSB0aGUge0Bjb2RlIHN0YXJ0fSBtZXRob2QuIElmIHlvdXIgYXBwbGljYXRpb24gZGVwbG95bWVudAorICogZG9lcyBub3QgYWxsb3cgcmVkaXJlY3Rpb24gKGZvciBleGFtcGxlIHRoZSBhcHAgaXMgYSBjb25zb2xlIGFwcGxpY2F0aW9uKSwgdGhlbiBwcm92aWRlIHRoZSByZWRpcmVjdGlvbiBVUkkKKyAqIHRvIHRoZSB1c2VyIGluIG90aGVyIHdheXMuPC9saT4KKyAqIDxsaT5Vc2VyIHNob3VsZCBhdXRob3JpemUgeW91ciBhcHBsaWNhdGlvbiBvbiB0aGUgcmVkaXJlY3QgVVJJLjwvbGk+CisgKiA8bGk+QWZ0ZXIgYXV0aG9yaXphdGlvbiB0aGUgQXV0aG9yaXphdGlvbiBTZXJ2ZXIgcmVkaXJlY3RzIHRoZSB1c2VyIGJhY2sgdG8gdGhlIFVSSSBzcGVjaWZpZWQKKyAqIGJ5IHtAbGluayBPQXV0aDJDb2RlR3JhbnRGbG93LkJ1aWxkZXIjcmVkaXJlY3RVcmkoU3RyaW5nKX0gYW5kIHByb3ZpZGUgdGhlIHtAY29kZSBjb2RlfSBhbmQge0Bjb2RlIHN0YXRlfSBhcworICogYSByZXF1ZXN0IHF1ZXJ5IHBhcmFtZXRlci4gRXh0cmFjdCB0aGVzZSBwYXJhbWV0ZXIgZnJvbSB0aGUgcmVxdWVzdC4gSWYgeW91ciBkZXBsb3ltZW50IGRvZXMgbm90IHN1cHBvcnQKKyAqIHJlZGlyZWN0aW9uICh5b3VyIGFwcCBpcyBub3QgYSB3ZWIgc2VydmVyKSB0aGVuIEF1dGhvcml6YXRpb24gU2VydmVyIHdpbGwgcHJvdmlkZSB0aGUgdXNlciB3aXRoCisgKiB7QGNvZGUgY29kZX0gaW4gb3RoZXIgd2F5cyAoZm9yIGV4YW1wbGUgZGlzcGxheSBvbiB0aGUgaHRtbCBwYWdlKS4gWW91IG5lZWQgdG8gZ2V0CisgKiB0aGlzIGNvZGUgZnJvbSB0aGUgdXNlci4gVGhlIHtAY29kZSBzdGF0ZX0gcGFyYW1ldGVyIGlzIGFkZGVkIHRvIHRoZSByZWRpcmVjdCBVUkkgaW4gdGhlIHtAY29kZSBzdGFydH0gbWV0aG9kIGFuZAorICogYW5kIHRoZSBzYW1lIHBhcmFtZXRlciBzaG91bGQgYmUgcmV0dXJuZWQgZnJvbSB0aGUgYXV0aG9yaXphdGlvbiByZXNwb25zZSBhcyBhIHByb3RlY3Rpb24gYWdhaW5zdCBDU1JGIGF0dGFja3MuPC9saT4KKyAqIDxsaT5Vc2UgdGhlIHtAY29kZSBjb2RlfSBhbmQge0Bjb2RlIHN0YXRlfSB0byBmaW5pc2ggdGhlIGF1dGhvcml6YXRpb24gcHJvY2VzcyBieSBjYWxsaW5nIHRoZSBtZXRob2QKKyAqIHtAbGluayAjZmluaXNoKFN0cmluZywgU3RyaW5nKX0gc3VwcGx5aW5nIHRoZSB7QGNvZGUgY29kZX0gYW5kIHRoZSB7QGNvZGUgc3RhdGV9IHBhcmFtZXRlci4gVGhlIG1ldGhvZCB3aWxsIGludGVybmFsbHkgcmVxdWVzdAorICogdGhlIGFjY2VzcyB0b2tlbiBmcm9tIHRoZSBBdXRob3JpemF0aW9uIFNlcnZlciBhbmQgcmV0dXJuIGl0LjwvbGk+CisgKiA8bGk+WW91IGNhbiB1c2UgYWNjZXNzIHRva2VuIGZyb20ge0Bjb2RlIFRva2VuUmVzdWx0fSB0b2dldGhlciB3aXRoIHtAbGluayBDbGllbnRJZGVudGlmaWVyfSB0bworICogcGVyZm9ybSB0aGUgYXV0aGVudGljYXRlZCByZXF1ZXN0cyB0byB0aGUgU2VydmljZSBQcm92aWRlci4gWW91IGNhbiBhbHNvIGNhbGwKKyAqIG1ldGhvZHMge0BsaW5rICNnZXRBdXRob3JpemVkQ2xpZW50KCl9IHRvIGdldCB7QGxpbmsgQ2xpZW50IGNsaWVudH0gYWxyZWFkeSBjb25maWd1cmVkIHdpdGggc3VwcG9ydAorICogZm9yIGF1dGhlbnRpY2F0aW9uIGZyb20gY29uc3VtZXIgY3JlZGVudGlhbHMgYW5kIGFjY2VzcyB0b2tlbiByZWNlaXZlZCBkdXJpbmcgYXV0aG9yaXphdGlvbiBwcm9jZXNzLgorICogPC9saT4KKyAqIDwvbGlzdD4KKyAqIDwvcD4KKyAqIDxwPgorICogSW1wb3J0YW50IG5vdGU6IG9uZSBpbnN0YW5jZSBvZiB0aGUgaW50ZXJmYWNlIGNhbiBiZSB1c2VkIG9ubHkgZm9yIG9uZSBhdXRob3JpemF0aW9uIHByb2Nlc3MuIFRoZSBtZXRob2RzCisgKiBtdXN0IGJlIGNhbGxlZCBleGFjdGx5IGluIHRoZSBvcmRlciBzcGVjaWZpZWQgYnkgdGhlIGxpc3QgYWJvdmUuIFRoZXJlZm9yZSB0aGUgaW5zdGFuY2UgaXMgYWxzbyBub3QKKyAqIHRocmVhZCBzYWZlIGFuZCBubyBjb25jdXJyZW50IGFjY2VzcyBpcyBleHBlY3RlZC4KKyAqIDwvcD4KKyAqIDxwPgorICogSW5zdGFuY2UgbXVzdCBiZSBzdG9yZWQgYmV0d2VlbiBtZXRob2QgY2FsbHMgKGJldHdlZW4ge0Bjb2RlIHN0YXJ0fSBhbmQge0Bjb2RlIGZpbmlzaH0pCisgKiBmb3Igb25lIHVzZXIgYXV0aG9yaXphdGlvbiBwcm9jZXNzIGFzIHRoZSBpbnN0YW5jZSBrZWVwcworICogaW50ZXJuYWwgc3RhdGUgb2YgdGhlIGF1dGhvcml6YXRpb24gcHJvY2Vzcy4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKiBAc2luY2UgMi4zCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgT0F1dGgyQ29kZUdyYW50RmxvdyB7CisKKyAgICAvKioKKyAgICAgKiBTdGFydCB0aGUgYXV0aG9yaXphdGlvbiBwcm9jZXNzIGFuZCByZXR1cm4gcmVkaXJlY3Rpb24gVVJJIG9uIHdoaWNoIHRoZSB1c2VyIHNob3VsZCBnaXZlIGEgY29uc2VudAorICAgICAqIGZvciBvdXIgYXBwbGljYXRpb24gdG8gYWNjZXNzIHJlc291cmNlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVVJJIHRvIHdoaWNoIHVzZXIgc2hvdWxkIGJlIHJlZGlyZWN0ZWQuCisgICAgICovCisgICAgU3RyaW5nIHN0YXJ0KCk7CisKKyAgICAvKioKKyAgICAgKiBGaW5pc2ggdGhlIGF1dGhvcml6YXRpb24gcHJvY2VzcyBhbmQgcmV0dXJuIHRoZSB7QGxpbmsgVG9rZW5SZXN1bHR9LiBUaGUgbWV0aG9kIG11c3QgYmUgY2FsbGVkIG9uIHRoZQorICAgICAqIHNhbWUgaW5zdGFuY2UgYWZ0ZXIgdGhlIHtAbGluayAjc3RhcnQoKX0gbWV0aG9kIHdhcyBjYWxsZWQgYW5kIHVzZXIgZ3JhbnRlZCBhY2Nlc3MgdG8gdGhpcyBhcHBsaWNhdGlvbi4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbWV0aG9kIG1ha2VzIGEgcmVxdWVzdCB0byB0aGUgQXV0aG9yaXphdGlvbiBTZXJ2ZXIgaW4gb3JkZXIgdG8gZXhjaGFuZ2Uge0Bjb2RlIGNvZGV9IGZvciBhY2Nlc3MgdG9rZW4uCisgICAgICogPC9wPgorICAgICAqIEBwYXJhbSBjb2RlIENvZGUgcmVjZWl2ZWQgZnJvbSB0aGUgdXNlciBhdXRob3JpemF0aW9uIHByb2Nlc3MuCisgICAgICogQHBhcmFtIHN0YXRlIFN0YXRlIHJlY2VpdmVkIGZyb20gdGhlIHVzZXIgYXV0aG9yaXphdGlvbiByZXNwb25zZS4KKyAgICAgKiBAcmV0dXJuIFRva2VuIHJlc3VsdC4KKyAgICAgKi8KKworICAgIFRva2VuUmVzdWx0IGZpbmlzaChTdHJpbmcgY29kZSwgU3RyaW5nIHN0YXRlKTsKKworICAgIC8qKgorICAgICAqIFJlZnJlc2ggdGhlIGFjY2VzcyB0b2tlbiB1c2luZyBhIHJlZnJlc2ggdG9rZW4uIFRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgb24gbmV3bHkgY3JlYXRlZCBpbnN0YW5jZSBvciBvbgorICAgICAqIGluc3RhbmNlIG9uIHdoaWNoIHRoZSBhdXRob3JpemF0aW9uIGZsb3cgd2FzIGFscmVhZHkgcGVyZm9ybWVkLgorICAgICAqCisgICAgICogQHBhcmFtIHJlZnJlc2hUb2tlbiBSZWZyZXNoIHRva2VuLgorICAgICAqIEByZXR1cm4gVG9rZW4gcmVzdWx0LgorICAgICAqLworICAgIFRva2VuUmVzdWx0IHJlZnJlc2hBY2Nlc3NUb2tlbihTdHJpbmcgcmVmcmVzaFRva2VuKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgY2xpZW50IGNvbmZpZ3VyZWQgZm9yIHBlcmZvcm1pbmcgYXV0aG9yaXplZCByZXF1ZXN0cyB0byB0aGUgU2VydmljZSBQcm92aWRlci4gVGhlCisgICAgICogYXV0aG9yaXphdGlvbiBwcm9jZXNzIG11c3QgYmUgc3VjY2Vzc2Z1bGx5IGZpbmlzaGVkIGJ5IGluc3RhbmNlIGJ5IGNhbGxpbmcgbWV0aG9kcyB7QGxpbmsgI3N0YXJ0KCl9IGFuZAorICAgICAqIHtAbGluayAjZmluaXNoKFN0cmluZywgU3RyaW5nKX0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIENsaWVudCBjb25maWd1cmVkIHRvIGFkZCBjb3JyZWN0IHtAY29kZSBBdXRob3JpemF0aW9ufSBoZWFkZXIgdG8gcmVxdWVzdHMuCisgICAgICovCisgICAgcHVibGljIENsaWVudCBnZXRBdXRob3JpemVkQ2xpZW50KCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIHtAbGluayBGZWF0dXJlIG9hdXRoIGZpbHRlciBmZWF0dXJlfSB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbmZpZ3VyZQorICAgICAqIHtAbGluayBDbGllbnQgY2xpZW50fSBpbnN0YW5jZXMgdG8gcGVyZm9ybSBhdXRoZW50aWNhdGVkIHJlcXVlc3RzIHRvIHRoZSBTZXJ2aWNlIFByb3ZpZGVyLgorICAgICAqIDxwPgorICAgICAqIFRoZQorICAgICAqIGF1dGhvcml6YXRpb24gcHJvY2VzcyBtdXN0IGJlIHN1Y2Nlc3NmdWxseSBmaW5pc2hlZCBieSBpbnN0YW5jZSBieSBjYWxsaW5nIG1ldGhvZHMge0BsaW5rICNzdGFydCgpfSBhbmQKKyAgICAgKiB7QGxpbmsgI2ZpbmlzaChTdHJpbmcsIFN0cmluZyl9LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gb2F1dGggZmlsdGVyIGZlYXR1cmUgY29uZmlndXJlZCB3aXRoIHJlY2VpdmVkIHtAY29kZSBBY2Nlc3NUb2tlbn0uCisgICAgICovCisgICAgcHVibGljIEZlYXR1cmUgZ2V0T0F1dGgyRmVhdHVyZSgpOworCisgICAgLyoqCisgICAgICogUGhhc2Ugb2YgdGhlIEF1dGhvcml6YXRpb24gQ29kZSBHcmFudCBGbG93LgorICAgICAqLworICAgIGVudW0gUGhhc2UgeworICAgICAgICAvKioKKyAgICAgICAgICogQXV0aG9yaXphdGlvbiBwaGFzZS4gVGhlIHBoYXNlIHdoZW4gdXNlciBpcyByZWRpcmVjdGVkIHRvIHRoZSBhdXRob3JpemF0aW9uIHNlcnZlciB0byBhdXRob3JpemUKKyAgICAgICAgICogdGhlIGFwcGxpY2F0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgQVVUSE9SSVpBVElPTiB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHByb3BlcnR5KFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSwgTWFwPFN0cmluZywgU3RyaW5nPiBhdXRob3JpemF0aW9uUHJvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGFjY2Vzc1Rva2VuUHJvcHMsIE1hcDxTdHJpbmcsIFN0cmluZz4gcmVmcmVzaFRva2VuUHJvcHMpIHsKKyAgICAgICAgICAgICAgICBub25OdWxsUHJvcGVydHkoa2V5LCB2YWx1ZSwgYXV0aG9yaXphdGlvblByb3BzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlcXVlc3RpbmcgdGhlIGFjY2VzcyB0b2tlbiBwaGFzZS4KKyAgICAgICAgICovCisgICAgICAgIEFDQ0VTU19UT0tFTl9SRVFVRVNUIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcHJvcGVydHkoU3RyaW5nIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gYXV0aG9yaXphdGlvblByb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBhY2Nlc3NUb2tlblByb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiByZWZyZXNoVG9rZW5Qcm9wcykgeworICAgICAgICAgICAgICAgIG5vbk51bGxQcm9wZXJ0eShrZXksIHZhbHVlLCBhY2Nlc3NUb2tlblByb3BzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlZnJlc2hpbmcgdGhlIGFjY2VzcyB0b2tlbiBwaGFzZS4KKyAgICAgICAgICovCisgICAgICAgIFJFRlJFU0hfQUNDRVNTX1RPS0VOIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcHJvcGVydHkoU3RyaW5nIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gYXV0aG9yaXphdGlvblByb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBhY2Nlc3NUb2tlblByb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiByZWZyZXNoVG9rZW5Qcm9wcykgeworICAgICAgICAgICAgICAgIG5vbk51bGxQcm9wZXJ0eShrZXksIHZhbHVlLCByZWZyZXNoVG9rZW5Qcm9wcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgICAgIC8qKgorICAgICAgICAgKiBBbGwgcGhhc2VzLgorICAgICAgICAgKi8KKyAgICAgICAgQUxMIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcHJvcGVydHkoU3RyaW5nIGtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gYXV0aG9yaXphdGlvblByb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBhY2Nlc3NUb2tlblByb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiByZWZyZXNoVG9rZW5Qcm9wcykgeworICAgICAgICAgICAgICAgIG5vbk51bGxQcm9wZXJ0eShrZXksIHZhbHVlLCBhdXRob3JpemF0aW9uUHJvcHMpOworICAgICAgICAgICAgICAgIG5vbk51bGxQcm9wZXJ0eShrZXksIHZhbHVlLCBhY2Nlc3NUb2tlblByb3BzKTsKKyAgICAgICAgICAgICAgICBub25OdWxsUHJvcGVydHkoa2V5LCB2YWx1ZSwgcmVmcmVzaFRva2VuUHJvcHMpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgcHJvcGVydHkgZGVmaW5lZCBieSB7QGNvZGUga2V5fSBhbmQge0Bjb2RlIHZhbHVlfSB0byB0aGUgYXBwcm9wcmlhdGUKKyAgICAgICAgICogcHJvcGVydHkgbWFwIGJhc2VkIG9uIHRoaXMgcGhhc2UuCisgICAgICAgICAqIEBwYXJhbSBrZXkgUHJvcGVydHkga2V5LgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgUHJvcGVydHkgdmFsdWUuCisgICAgICAgICAqIEBwYXJhbSBhdXRob3JpemF0aW9uUHJvcHMgUHJvcGVydGllcyB1c2VkIGluIGNvbnN0cnVjdGlvbiBvZiByZWRpcmVjdCBVUkkuCisgICAgICAgICAqIEBwYXJhbSBhY2Nlc3NUb2tlblByb3BzIFByb3BlcnRpZXMgKHBhcmFtZXRlcnMpIHVzZWQgaW4gYWNjZXNzIHRva2VuIHJlcXVlc3QuCisgICAgICAgICAqIEBwYXJhbSByZWZyZXNoVG9rZW5Qcm9wcyBQcm9wZXJ0aWVzIChwYXJhbWV0ZXJzKSB1c2VkIGluIHJlcXVlc3QgZm9yIHJlZnJlc2hpbmcgdGhlIGFjY2VzcyB0b2tlbi4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHByb3BlcnR5KFN0cmluZyBrZXksIFN0cmluZyB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBhdXRob3JpemF0aW9uUHJvcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gYWNjZXNzVG9rZW5Qcm9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiByZWZyZXNoVG9rZW5Qcm9wcyk7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBub25OdWxsUHJvcGVydHkoU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlLCBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BzKSB7CisgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHByb3BzLnJlbW92ZShrZXkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcm9wcy5wdXQoa2V5LCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSBidWlsZGVyIG9mIHtAbGluayBPQXV0aDJDb2RlR3JhbnRGbG93fS4KKyAgICAgKgorICAgICAqIEBwYXJhbSA8VD4gVHlwZSBvZiB0aGUgYnVpbGRlciBpbXBsZW1lbnRhdGlvbi4gVGhpcyBwYXJhbWV0ZXIgaXMgdXNlZCBmb3IgY29udmVuaWVuY2UgdG8gYWxsb3cKKyAgICAgKiAgICAgICAgICAgYmV0dGVyIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgYnVpbGRlcnMgaW1wbGVtZW50aW5nIHRoaXMgaW50ZXJmYWNlIChidWlsZGVyIGNhbiByZXR1cm4KKyAgICAgKiAgICAgICAgICAgdGhlaXIgb3duIHNwZWNpZmljIHR5cGUgaW5zdGVhZCBvZiB0eXBlIGRlZmluZWQgYnkgdGhpcyBpbnRlcmZhY2Ugb25seSkuCisgICAgICovCisgICAgcHVibGljIGludGVyZmFjZSBCdWlsZGVyPFQgZXh0ZW5kcyBCdWlsZGVyPiB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgYWNjZXNzIHRva2VuIFVSSSBvbiB3aGljaCB0aGUgYWNjZXNzIHRva2VuIGNhbiBiZSByZXF1ZXN0ZWQuIFRoZSBVUkkgcG9pbnRzIHRvIHRoZQorICAgICAgICAgKiBhdXRob3JpemF0aW9uIHNlcnZlciBhbmQgaXMgZGVmaW5lZCBieSB0aGUgU2VydmljZSBQcm92aWRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFjY2Vzc1Rva2VuVXJpICBBY2Nlc3MgdG9rZW4gVVJJLgorICAgICAgICAgKiBAcmV0dXJuIEJ1aWxkZXIgaW5zdGFuY2UuCisgICAgICAgICAqLworICAgICAgICBUIGFjY2Vzc1Rva2VuVXJpKFN0cmluZyBhY2Nlc3NUb2tlblVyaSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgVVJJIHRvIHdoaWNoIHRoZSB1c2VyIHNob3VsZCBiZSByZWRpcmVjdGVkIHRvIGF1dGhvcml6ZSBvdXIgYXBwbGljYXRpb24uIFRoZSBVUkkgcG9pbnRzIHRvIHRoZQorICAgICAgICAgKiBhdXRob3JpemF0aW9uIHNlcnZlciBhbmQgaXMgZGVmaW5lZCBieSB0aGUgU2VydmljZSBQcm92aWRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGF1dGhvcml6YXRpb25VcmkgQXV0aG9yaXphdGlvbiBVUkkuCisgICAgICAgICAqIEByZXR1cm4gQnVpbGRlciBpbnN0YW5jZS4KKyAgICAgICAgICovCisgICAgICAgIFQgYXV0aG9yaXphdGlvblVyaShTdHJpbmcgYXV0aG9yaXphdGlvblVyaSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgcmVkaXJlY3QgVVJJIHRvIHdoaWNoIHRoZSB1c2VyIChyZXNvdXJjZSBvd25lcikgc2hvdWxkIGJlIHJlZGlyZWN0ZWQgYWZ0ZXIgaGUvc2hlCisgICAgICAgICAqIGdyYW50cyBhY2Nlc3MgdG8gb3VyIGFwcGxpY2F0aW9uLiBJbiBtb3N0IGNhc2VzLCB0aGUgVVJJIGlzIHVuZGVyIGNvbnRyb2wgb2YgdGhpcyBhcHBsaWNhdGlvbgorICAgICAgICAgKiBhbmQgcmVxdWVzdCBkb25lIG9uIHRoaXMgVVJJIHdpbGwgYmUgdXNlZCB0byBleHRyYWN0IHF1ZXJ5IHBhcmFtZXRlciB7QGNvZGUgY29kZX0gYW5kIHtAY29kZSBzdGF0ZX0KKyAgICAgICAgICogdGhhdCB3aWxsIGJlIHVzZWQgaW4KKyAgICAgICAgICoge0BsaW5rIE9BdXRoMkNvZGVHcmFudEZsb3cjZmluaXNoKFN0cmluZywgU3RyaW5nKX0gbWV0aG9kLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogSWYgVVJJIGlzIG5vdCBkZWZpbmVkIGJ5IHRoaXMgbWV0aG9kLCB0aGUgZGVmYXVsdCB2YWx1ZSB7QGNvZGUgdXJuOmlldGY6d2c6b2F1dGg6Mi4wOm9vYn0gd2lsbCBiZSB1c2VkCisgICAgICAgICAqIGluIHRoZSBBdXRob3JpemF0aW9uCisgICAgICAgICAqIEZsb3cgd2hpY2ggc2hvdWxkIGNhdXNlIHRoYXQge0Bjb2RlIGNvZGV9IHdpbGwgYmUgcGFzc2VkIHRvIGFwcGxpY2F0aW9uIGluIG90aGVyIHdheSB0aGFuIHJlcXVlc3QKKyAgICAgICAgICogcmVkaXJlY3Rpb24gKGZvciBleGFtcGxlIHNob3duIHRvIHRoZSB1c2VyIHVzaW5nIGh0bWwgcGFnZSkuCisgICAgICAgICAqIDwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHJlZGlyZWN0VXJpIFVSSSB0aGF0IHNob3VsZCByZWNlaXZlIGF1dGhvcml6YXRpb24gcmVzcG9uc2UgZnJvbSB0aGUgU2VydmljZSBQcm92aWRlci4KKyAgICAgICAgICogQHJldHVybiBCdWlsZGVyIGluc3RhbmNlLgorICAgICAgICAgKi8KKyAgICAgICAgVCByZWRpcmVjdFVyaShTdHJpbmcgcmVkaXJlY3RVcmkpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgY2xpZW50IGlkZW50aWZpZXIgb2YgdGhlIGFwcGxpY2F0aW9uIHRoYXQgc2hvdWxkIGJlIGF1dGhvcml6ZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjbGllbnRJZGVudGlmaWVyIENsaWVudCBpZGVudGlmaWVyLgorICAgICAgICAgKiBAcmV0dXJuIEJ1aWxkZXIgaW5zdGFuY2UuCisgICAgICAgICAqLworICAgICAgICBUIGNsaWVudElkZW50aWZpZXIoQ2xpZW50SWRlbnRpZmllciBjbGllbnRJZGVudGlmaWVyKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IGEgc2NvcGUgdG8gd2hpY2ggdGhlIGFwcGxpY2F0aW9uIHdpbGwgZ2V0IGF1dGhvcml6YXRpb24gZ3JhbnQuIFZhbHVlcyBvZiB0aGlzIHBhcmFtZXRlcgorICAgICAgICAgKiBhcmUgZGVmaW5lZCBieSB0aGUgU2VydmljZSBQcm92aWRlciBhbmQgZGVmaW5lcyB1c3VhbGx5IHN1YnNldCBvZiByZXNvdXJjZSBhbmQgb3BlcmF0aW9ucyBhdmFpbGFibGUKKyAgICAgICAgICogaW4gdGhlIFNlcnZpY2UgUHJvdmlkZXIuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGUgcGFyYW1ldGVyIGlzIG9wdGlvbmFsIGJ1dCBTZXJ2aWNlUHJvdmlkZXIgbWlnaHQgcmVxdWlyZSBpdC4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc2NvcGUgU2NvcGUgc3RyaW5nLgorICAgICAgICAgKiBAcmV0dXJuIEJ1aWxkZXIgaW5zdGFuY2UuCisgICAgICAgICAqLworICAgICAgICBUIHNjb3BlKFN0cmluZyBzY29wZSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgY2xpZW50IHRoYXQgc2hvdWxkIGJlIHVzZWQgaW50ZXJuYWxseSBieSB0aGUge0Bjb2RlIE9BdXRoMUF1dGhvcml6YXRpb25GbG93fSB0byBtYWtlIHJlcXVlc3RzIHRvCisgICAgICAgICAqIEF1dGhvcml6YXRpb24gU2VydmVyLiBJZiB0aGlzIG1ldGhvZCBpcyBub3QgY2FsbGVkLCBpdCBpcyB1cCB0byB0aGUgaW1wbGVtZW50YXRpb24gdG8gY3JlYXRlIG9yIGdldAorICAgICAgICAgKiBhbnkgcHJpdmF0ZSBjbGllbnQgaW5zdGFuY2UgdG8gcGVyZm9ybSB0aGVzZSByZXF1ZXN0cy4gVGhpcyBtZXRob2QgY291bGQgYmUgdXNlZCBtYWlubHkgZm9yCisgICAgICAgICAqIHBlcmZvcm1hbmNlIHJlYXNvbnMgdG8gYXZvaWQgY3JlYXRpb24gb2YgbmV3IGNsaWVudCBpbnN0YW5jZXMgYW5kIGhhdmUgY29udHJvbCBhYm91dCBjcmVhdGVkIGNsaWVudAorICAgICAgICAgKiBpbnN0YW5jZXMgdXNlZCBpbiB0aGUgYXBwbGljYXRpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjbGllbnQgQ2xpZW50IGluc3RhbmNlLgorICAgICAgICAgKiBAcmV0dXJuIEJ1aWxkZXIgaW5zdGFuY2UuCisgICAgICAgICAqLworICAgICAgICBUIGNsaWVudChDbGllbnQgY2xpZW50KTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSByZWZyZXNoIHRva2VuIFVSSSBvbiB3aGljaCB0aGUgYWNjZXNzIHRva2VuIGNhbiBiZSByZWZyZXNoZWQgdXNpbmcgYSByZWZyZXNoIHRva2VuLgorICAgICAgICAgKiBUaGUgVVJJIHBvaW50cyB0byB0aGUKKyAgICAgICAgICogYXV0aG9yaXphdGlvbiBzZXJ2ZXIgYW5kIGlzIGRlZmluZWQgYnkgdGhlIFNlcnZpY2UgUHJvdmlkZXIuIElmIHRoZSBVUkkgaXMgbm90IGRlZmluZWQgYnkgdGhpcyBtZXRob2QKKyAgICAgICAgICogaXQgd2lsbCBiZSB0aGUgc2FtZSBhcyBVUkkgZGVmaW5lZCBpbiB7QGxpbmsgI2FjY2Vzc1Rva2VuVXJpKFN0cmluZyl9ICh3aGljaCBpcyB0aGUgZGVmYXVsdCB2YWx1ZQorICAgICAgICAgKiBkZWZpbmVkIGJ5IHRoZSBPQXV0aDIgc3BlYykuCisgICAgICAgICAqIFNvbWUgcHJvdmlkZXJzIGRvIG5vdCBzdXBwb3J0CisgICAgICAgICAqIHJlZnJlc2hpbmcgYWNjZXNzIHRva2VucyBhdCBhbGwuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSByZWZyZXNoVG9rZW5VcmkgIFJlZnJlc2ggdG9rZW4gVVJJLgorICAgICAgICAgKiBAcmV0dXJuIEJ1aWxkZXIgaW5zdGFuY2UuCisgICAgICAgICAqLworICAgICAgICBUIHJlZnJlc2hUb2tlblVyaShTdHJpbmcgcmVmcmVzaFRva2VuVXJpKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHByb3BlcnR5IChwYXJhbWV0ZXIpIHRoYXQgd2lsbCBiZSBhZGRlZCB0byByZXF1ZXN0cyBvciBVUklzIGFzIGEgcXVlcnkgcGFyYW1ldGVycyBkdXJpbmcKKyAgICAgICAgICogdGhlIEF1dGhvcml6YXRpb24gRmxvdy4gRGVmYXVsdCBwYXJhbWV0ZXJzIHVzZWQgZHVyaW5nIHRoZSBBdXRob3JpemF0aW9uIEZsb3cgY2FuIGJlIGFsc28KKyAgICAgICAgICogb3ZlcnJpZGRlbiBieSB0aGlzIG1ldGhvZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHBoYXNlIFBoYXNlIG9mIHRoZSBmbG93IGluIHdoaWNoIHRoZSBwcm9wZXJ0aWVzIChwYXJhbWV0ZXJzKSBzaG91bGQgYmUgdXNlZC4gRm9yIGV4YW1wbGUgYnkgdXNpbmcKKyAgICAgICAgICogICAgICAgICAgICAgIGEge0BsaW5rIFBoYXNlI0FDQ0VTU19UT0tFTl9SRVFVRVNUfSwgdGhlIHBhcmFtZXRlciB3aWxsIGJlIGFkZGVkIG9ubHkgdG8gdGhlIGh0dHAgcmVxdWVzdAorICAgICAgICAgKiAgICAgICAgICAgICAgZm9yIGFjY2VzcyB0b2tlbi4KKyAgICAgICAgICogQHBhcmFtIGtleSBQcm9wZXJ0eSBrZXkuCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSBQcm9wZXJ0eSB2YWx1ZS4KKyAgICAgICAgICogQHJldHVybiBCdWlsZGVyIGluc3RhbmNlLgorICAgICAgICAgKi8KKyAgICAgICAgVCBwcm9wZXJ0eShQaGFzZSBwaGFzZSwgU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQnVpbGQgdGhlIHtAY29kZSBPQXV0aDJDb2RlR3JhbnRGbG93fSBpbnN0YW5jZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBOZXcgaW5zdGFuY2Ugb2Yge0Bjb2RlIE9BdXRoMkNvZGVHcmFudEZsb3d9LgorICAgICAgICAgKi8KKyAgICAgICAgT0F1dGgyQ29kZUdyYW50RmxvdyBidWlsZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L29hdXRoMi1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvb2F1dGgyL09BdXRoMkZsb3dGYWNlYm9va0J1aWxkZXIuamF2YSBiL3NlY3VyaXR5L29hdXRoMi1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvb2F1dGgyL09BdXRoMkZsb3dGYWNlYm9va0J1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDVmMjNkCi0tLSAvZGV2L251bGwKKysrIGIvc2VjdXJpdHkvb2F1dGgyLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9vYXV0aDIvT0F1dGgyRmxvd0ZhY2Vib29rQnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50Lm9hdXRoMjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLlJlYWRlcldyaXRlcjsKKworLyoqCisgKiBDbGFzcyB0aGF0IHByb3ZpZGVzIG1ldGhvZHMgdG8gYnVpbGQge0BsaW5rIE9BdXRoMkNvZGVHcmFudEZsb3d9IHByZS1jb25maWd1cmVkIGZvciB1c2FnZQorICogd2l0aCBGYWNlYm9vayBwcm92aWRlci4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKiBAc2luY2UgMi4zCisgKi8KK2NsYXNzIE9BdXRoMkZsb3dGYWNlYm9va0J1aWxkZXIgeworCisgICAgLyoqCisgICAgICogR2V0IGEgYnVpbGRlciB0aGF0IGNhbiBiZSBkaXJlY3RseSB1c2VkIHRvIHBlcmZvcm0gQXV0aG9yaXphdGlvbiBDb2RlIEdyYW50IGZsb3cgZGVmaW5lZCBieQorICAgICAqIEZhY2Vib29rIGRvY3VtZW50YXRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xpZW50SWRlbnRpZmllciBDbGllbnQgaWRlbnRpZmllci4KKyAgICAgKiBAcGFyYW0gcmVkaXJlY3RVcmkgUmVkaXJlY3QgVVJJCisgICAgICogQHBhcmFtIGNsaWVudCBDbGllbnQgaW5zdGFuY2UgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBwZXJmb3JtIEFjY2VzcyB0b2tlbiByZXF1ZXN0LgorICAgICAqIEByZXR1cm4gQnVpbGRlciBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE9BdXRoMkNvZGVHcmFudEZsb3cuQnVpbGRlciBnZXRGYWNlYm9va0F1dGhvcml6YXRpb25CdWlsZGVyKENsaWVudElkZW50aWZpZXIgY2xpZW50SWRlbnRpZmllciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByZWRpcmVjdFVyaSwgQ2xpZW50IGNsaWVudCkgeworCisgICAgICAgIGZpbmFsIEF1dGhDb2RlR3JhbnRJbXBsLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBBdXRoQ29kZUdyYW50SW1wbC5CdWlsZGVyKCk7CisgICAgICAgIGJ1aWxkZXIuYWNjZXNzVG9rZW5VcmkoImh0dHBzOi8vZ3JhcGguZmFjZWJvb2suY29tL29hdXRoL2FjY2Vzc190b2tlbiIpOworICAgICAgICBidWlsZGVyLmF1dGhvcml6YXRpb25VcmkoImh0dHBzOi8vd3d3LmZhY2Vib29rLmNvbS9kaWFsb2cvb2F1dGgiKTsKKyAgICAgICAgYnVpbGRlci5yZWRpcmVjdFVyaShyZWRpcmVjdFVyaSk7CisgICAgICAgIGJ1aWxkZXIuY2xpZW50SWRlbnRpZmllcihjbGllbnRJZGVudGlmaWVyKTsKKyAgICAgICAgY2xpZW50LnJlZ2lzdGVyKEZhY2Vib29rVG9rZW5NZXNzYWdlQm9keVJlYWRlci5jbGFzcyk7CisgICAgICAgIGJ1aWxkZXIuY2xpZW50KGNsaWVudCk7CisgICAgICAgIHJldHVybiBidWlsZGVyOworICAgIH0KKworCisgICAgLyoqCisgICAgICogRW50aXR5IHByb3ZpZGVyIHRoYXQgZGVzZXJpYWxpemVzIGVudGl0eSByZXR1cm5lZCBmcm9tIEFjY2VzcyBUb2tlbiByZXF1ZXN0IGludG8ge0BsaW5rIFRva2VuUmVzdWx0fS4KKyAgICAgKiBUaGUgZm9ybWF0IG9mIGRhdGEgaXMgaW4gcXVlcnkgcGFyYW0gc3R5bGU6ICJhY2Nlc3NfdG9rZW49NDVhNjRhNjU0JmV4cGlyZXNfaW49MzYwMCIuCisgICAgICovCisgICAgQENvbnN1bWVzKCJ0ZXh0L3BsYWluIikKKyAgICBzdGF0aWMgY2xhc3MgRmFjZWJvb2tUb2tlbk1lc3NhZ2VCb2R5UmVhZGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlSZWFkZXI8VG9rZW5SZXN1bHQ+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlLmVxdWFscyhUb2tlblJlc3VsdC5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFRva2VuUmVzdWx0IHJlYWRGcm9tKENsYXNzPFRva2VuUmVzdWx0PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworCisgICAgICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzdHIgPSBSZWFkZXJXcml0ZXIucmVhZEZyb21Bc1N0cmluZyhlbnRpdHlTdHJlYW0sIG1lZGlhVHlwZSk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBzcGxpdEFycmF5ID0gc3RyLnNwbGl0KCImIik7CisgICAgICAgICAgICBmb3IgKFN0cmluZyBzIDogc3BsaXRBcnJheSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIGtleVZhbHVlID0gcy5zcGxpdCgiPSIpOworICAgICAgICAgICAgICAgIG1hcC5wdXQoa2V5VmFsdWVbMF0sIGtleVZhbHVlWzFdKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ldyBUb2tlblJlc3VsdChtYXApOworICAgICAgICB9CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L29hdXRoMi1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvb2F1dGgyL09BdXRoMkZsb3dHb29nbGVCdWlsZGVyLmphdmEgYi9zZWN1cml0eS9vYXV0aDItY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L29hdXRoMi9PQXV0aDJGbG93R29vZ2xlQnVpbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjYWUwMTUKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9vYXV0aDItY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L29hdXRoMi9PQXV0aDJGbG93R29vZ2xlQnVpbGRlci5qYXZhCkBAIC0wLDAgKzEsMTU1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5vYXV0aDI7CisKKy8qKgorICogQ2xhc3MgdGhhdCBwcm92aWRlcyBtZXRob2RzIHRvIGJ1aWxkIHtAbGluayBPQXV0aDJDb2RlR3JhbnRGbG93fSBwcmUtY29uZmlndXJlZCBmb3IgdXNhZ2UKKyAqIHdpdGggR29vZ2xlIHByb3ZpZGVyLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqIEBzaW5jZSAyLjMKKyAqLworcHVibGljIGNsYXNzIE9BdXRoMkZsb3dHb29nbGVCdWlsZGVyIGV4dGVuZHMgQWJzdHJhY3RBdXRob3JpemF0aW9uQ29kZUdyYW50QnVpbGRlcjxPQXV0aDJGbG93R29vZ2xlQnVpbGRlcj4geworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGdvb2dsZSBmbG93IGJ1aWxkZXIuCisgICAgICovCisgICAgT0F1dGgyRmxvd0dvb2dsZUJ1aWxkZXIoKSB7CisgICAgICAgIHN1cGVyKG5ldyBBdXRoQ29kZUdyYW50SW1wbC5CdWlsZGVyKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB7QGNvZGUgYWNjZXNzIHR5cGV9IHBhcmFtZXRlciB1c2VkIGluIEF1dGhvcml6YXRpb24gUmVxdWVzdC4KKyAgICAgKiBAcGFyYW0gYWNjZXNzVHlwZSBhY2Nlc3MgdHlwZSB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIGEgZ29vZ2xlIGF1dGhvcml6YXRpb24gZmxvdyBidWlsZGVyLgorICAgICAqLworICAgIHB1YmxpYyBPQXV0aDJGbG93R29vZ2xlQnVpbGRlciBhY2Nlc3NUeXBlKEFjY2Vzc1R5cGUgYWNjZXNzVHlwZSkgeworICAgICAgICByZXR1cm4gcHJvcGVydHkoT0F1dGgyQ29kZUdyYW50Rmxvdy5QaGFzZS5BVVRIT1JJWkFUSU9OLCBBY2Nlc3NUeXBlLmdldEtleSgpLCBhY2Nlc3NUeXBlLmdldFZhbHVlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB7QGNvZGUgcHJvbXB0fSBwYXJhbWV0ZXIgdXNlZCBpbiBBdXRob3JpemF0aW9uIFJlcXVlc3QuCisgICAgICogQHBhcmFtIHByb21wdCBQcm9tcHQgdmFsdWUuCisgICAgICogQHJldHVybiBhIGdvb2dsZSBhdXRob3JpemF0aW9uIGZsb3cgYnVpbGRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgT0F1dGgyRmxvd0dvb2dsZUJ1aWxkZXIgcHJvbXB0KFByb21wdCBwcm9tcHQpIHsKKyAgICAgICAgcmV0dXJuIHByb3BlcnR5KE9BdXRoMkNvZGVHcmFudEZsb3cuUGhhc2UuQVVUSE9SSVpBVElPTiwgUHJvbXB0LmdldEtleSgpLCBwcm9tcHQuZ2V0VmFsdWUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHtAY29kZSBkaXNwbGF5fSBwYXJhbWV0ZXIgdXNlZCBpbiBBdXRob3JpemF0aW9uIFJlcXVlc3QuCisgICAgICogQHBhcmFtIGRpc3BsYXkgZGlzcGxheSB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIGEgZ29vZ2xlIGF1dGhvcml6YXRpb24gZmxvdyBidWlsZGVyLgorICAgICAqLworICAgIHB1YmxpYyBPQXV0aDJGbG93R29vZ2xlQnVpbGRlciBkaXNwbGF5KERpc3BsYXkgZGlzcGxheSkgeworICAgICAgICByZXR1cm4gcHJvcGVydHkoT0F1dGgyQ29kZUdyYW50Rmxvdy5QaGFzZS5BVVRIT1JJWkFUSU9OLCBEaXNwbGF5LmdldEtleSgpLCBkaXNwbGF5LmdldFZhbHVlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB7QGNvZGUgbG9naW4gaGludH0gcGFyYW1ldGVyIHVzZWQgaW4gQXV0aG9yaXphdGlvbiBSZXF1ZXN0LgorICAgICAqIEBwYXJhbSBsb2dpbkhpbnQgbG9naW4gaGludCB2YWx1ZS4KKyAgICAgKiBAcmV0dXJuIGEgZ29vZ2xlIGF1dGhvcml6YXRpb24gZmxvdyBidWlsZGVyLgorICAgICAqLworICAgIHB1YmxpYyBPQXV0aDJGbG93R29vZ2xlQnVpbGRlciBsb2dpbkhpbnQoU3RyaW5nIGxvZ2luSGludCkgeworICAgICAgICByZXR1cm4gcHJvcGVydHkoT0F1dGgyQ29kZUdyYW50Rmxvdy5QaGFzZS5BVVRIT1JJWkFUSU9OLCBEaXNwbGF5LmdldEtleSgpLCBsb2dpbkhpbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEVudW0gdGhhdCBkZWZpbmVzIHZhbHVlcyBmb3IgImFjY2Vzc190eXBlIiBwYXJhbWV0ZXIgdXNlZCBpbgorICAgICAqIEdvb2dsZSBPQXV0aCBmbG93LiBEZWZpbmVzIHdoZXRoZXIgdGhlIG9mZmxpbmUgYWNjZXNzIGlzIGFsbG93ZWQgKHdpdGhvdXQKKyAgICAgKiB1c2VyIGFjdGl2ZSBzZXNzaW9uKS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGVudW0gQWNjZXNzVHlwZSB7CisgICAgICAgIE9OTElORSgib25saW5lIiksCisgICAgICAgIE9GRkxJTkUoIm9mZmxpbmUiKTsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBwcm9wZXJ0eVZhbHVlOworCisgICAgICAgIHByaXZhdGUgQWNjZXNzVHlwZShTdHJpbmcgcHJvcGVydHlWYWx1ZSkgeworICAgICAgICAgICAgdGhpcy5wcm9wZXJ0eVZhbHVlID0gcHJvcGVydHlWYWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gcHJvcGVydHlWYWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEtleSgpIHsKKyAgICAgICAgICAgIHJldHVybiAiYWNjZXNzX3R5cGUiOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRW51bSB0aGF0IGRlZmluZXMgdmFsdWVzIGZvciAicHJvbXB0IiBwYXJhbWV0ZXIgdXNlZCBpbgorICAgICAqIEdvb2dsZSBPQXV0aCBmbG93LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZW51bSBQcm9tcHQgeworCisgICAgICAgIE5PTkUoIm5vbmUiKSwKKyAgICAgICAgLyoqCisgICAgICAgICAqIFVzZXIgd2lsbCBiZSBhc2tlZCBmb3IgYXBwcm92YWwgZWFjaCB0aW1lIHRoZSBhdXRob3JpemF0aW9uIGlzIHBlcmZvcm1lZC4KKyAgICAgICAgICovCisgICAgICAgIENPTlNFTlQoImNvbnNlbnQiKSwKKyAgICAgICAgU0VMRUNUX0FDQ09VTlQoInNlbGVjdF9hY2NvdW50Iik7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdmFsdWU7CisKKyAgICAgICAgcHJpdmF0ZSBQcm9tcHQoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0S2V5KCkgeworICAgICAgICAgICAgcmV0dXJuICJwcm9tcHQiOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBFbnVtIHRoYXQgZGVmaW5lcyB2YWx1ZXMgZm9yICJkaXNwbGF5IiBwYXJhbWV0ZXIgdXNlZCBpbgorICAgICAqIEdvb2dsZSBPQXV0aCBmbG93LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZW51bSBEaXNwbGF5IHsKKyAgICAgICAgUEFHRSgicGFnZSIpLAorICAgICAgICBQT1BVUCgicG9wdXAiKSwKKyAgICAgICAgVE9VQ0goInRvdWNoIiksCisgICAgICAgIFdBUCgid2FwIik7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdmFsdWU7CisKKyAgICAgICAgcHJpdmF0ZSBEaXNwbGF5KFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEtleSgpIHsKKyAgICAgICAgICAgIHJldHVybiAiZGlzcGxheSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm9wZXJ0eSBrZXkgdGhhdCBkZWZpbmVzIHZhbHVlcyBmb3IgImxvZ2luX2hpbnQiIHBhcmFtZXRlciB1c2VkIGluCisgICAgICogR29vZ2xlIE9BdXRoIGZsb3cuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HSU5fSElOVCA9ICJsb2dpbl9oaW50IjsKKworfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvb2F1dGgyLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9vYXV0aDIvT0F1dGgyUGFyYW1ldGVycy5qYXZhIGIvc2VjdXJpdHkvb2F1dGgyLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9vYXV0aDIvT0F1dGgyUGFyYW1ldGVycy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYmU0YzEKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9vYXV0aDItY2xpZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvY2xpZW50L29hdXRoMi9PQXV0aDJQYXJhbWV0ZXJzLmphdmEKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50Lm9hdXRoMjsKKworLyoqCisgKiBDbGFzcyB0aGF0IGNvbnRhaW5zIGRlZmluaXRpb24gb2QgcGFyYW1ldGVycyB1c2VkIGluIE9BdXRoMi4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKiBAc2luY2UgMi4zCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBPQXV0aDJQYXJhbWV0ZXJzIHsKKyAgICAvKioKKyAgICAgKiBQYXJhbWV0ZXIge0Bjb2RlIGNsaWVudF9pZH0gdGhhdAorICAgICAqIGNvcnJlc3BvbmRzIHRvICh7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50Lm9hdXRoMi5DbGllbnRJZGVudGlmaWVyI2dldENsaWVudElkKCl9KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTElFTlRfSUQgPSAiY2xpZW50X2lkIjsKKworICAgIC8qKgorICAgICAqIFBhcmFtZXRlciB7QGNvZGUgY2xpZW50X3NlY3JldH0gdGhhdAorICAgICAqIGNvcnJlc3BvbmRzIHRvICh7QGxpbmsgQ2xpZW50SWRlbnRpZmllciNnZXRDbGllbnRTZWNyZXQoKX0pLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMSUVOVF9TRUNSRVQgPSAiY2xpZW50X3NlY3JldCI7CisKKyAgICAvKioKKyAgICAgKiBQYXJhbWV0ZXIge0Bjb2RlIHJlc3BvbnNlX3R5cGV9IHVzZWQgaW4gdGhlCisgICAgICogYXV0aG9yaXphdGlvbiByZXF1ZXN0LiBGb3IgQXV0aG9yaXphdGlvbiBDb2RlIEdyYW50IEZsb3cgdGhlIHZhbHVlIGlzIHtAY29kZSBjb2RlfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNQT05TRV9UWVBFID0gInJlc3BvbnNlX3R5cGUiOworCisgICAgLyoqCisgICAgICogUGFyYW1ldGVyIHtAY29kZSByZXNwb25zZV90eXBlfSB1c2VkIGluIHRoZQorICAgICAqIGF1dGhvcml6YXRpb24gcmVxdWVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRURJUkVDVF9VUkkgPSAicmVkaXJlY3RfdXJpIjsKKworICAgIC8qKgorICAgICAqIFBhcmFtZXRlciB7QGNvZGUgc2NvcGV9IHRoYXQgZGVmaW5lcyB0aGUgc2NvcGUgdG8gd2hpY2ggYW4gYXV0aG9yaXphdGlvbiBpcyByZXF1ZXN0ZWQuCisgICAgICogU3BhY2UgZGVsaW1pdGVkIGZvcm1hdC4gU2NvcGUgdmFsdWVzIGFyZSBkZWZpbmVkIGJ5IHRoZSBTZXJ2aWNlIFByb3ZpZGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNDT1BFID0gInNjb3BlIjsKKyAgICAvKioKKyAgICAgKiBTdGF0ZSBwYXJhbWV0ZXIgdXNlZCBpbiB0aGUgYXV0aG9yaXphdGlvbiByZXF1ZXN0IGFuZCBhdXRob3JpemF0aW9uCisgICAgICogcmVzcG9uc2UgdG8gcHJvdGVjdCBhZ2FpbnN0IENTUkYgYXR0YWNrcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFURSA9ICJzdGF0ZSI7CisKKyAgICAvKioKKyAgICAgKiBQYXJhbWV0ZXIge0Bjb2RlIHJlZnJlc2hfdG9rZW59IGNvbnRhaW5zIFJlZnJlc2ggVG9rZW4gKGNvcnJlc3BvbmRzCisgICAgICogdG8ge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5vYXV0aDIuVG9rZW5SZXN1bHQjZ2V0UmVmcmVzaFRva2VuKCl9KS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUZSRVNIX1RPS0VOID0gInJlZnJlc2hfdG9rZW4iOworICAgIC8qKgorICAgICAqIEF1dGhvcml6YXRpb24gY29kZQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPREUgPSAiY29kZSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVESVJFQ1RfVVJJX1VOREVGSU5FRCA9ICJ1cm46aWV0Zjp3ZzpvYXV0aDoyLjA6b29iIjsKKworICAgIC8qKgorICAgICAqICBQYXJhbWV0ZXIge0Bjb2RlIGdyYW50X3R5cGV9IHVzZWQgaW4gdGhlIGFjY2VzcyB0b2tlbiByZXF1ZXN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZW51bSBHcmFudFR5cGUgeworICAgICAgICAvKioKKyAgICAgICAgICogVXNlZCB0byByZXF1ZXN0IGFuIGFjY2VzcyB0b2tlbiBpbiB0aGUgQXV0aG9yaXphdGlvbiBDb2RlIEdyYW50IEZsb3cuCisgICAgICAgICAqIFRoZSBwYXJhbWV0ZXIga2V5IGRlZmluZWQgYnkgdGhlIE9BdXRoMiBwcm90b2NvbCBpcyBlcXVhbAorICAgICAgICAgKiB0byB0aGUgbmFtZSBvZiB0aGlzIGVudW0gdmFsdWUgY29udmVydGVkIHRvIGxvd2VyY2FzZS4KKyAgICAgICAgICovCisgICAgICAgIEFVVEhPUklaQVRJT05fQ09ERSwKKyAgICAgICAgLyoqCisgICAgICAgICAqIFVzZWQgdG8gcmVmcmVzaCBhbiBhY2Nlc3MgdG9rZW4gaW4gdGhlIEF1dGhvcml6YXRpb24gQ29kZSBHcmFudCBGbG93LgorICAgICAgICAgKiBUaGUgcGFyYW1ldGVyIGtleSBkZWZpbmVkIGJ5IHRoZSBPQXV0aDIgcHJvdG9jb2wgaXMgZXF1YWwKKyAgICAgICAgICogdG8gdGhlIG5hbWUgb2YgdGhpcyBlbnVtIHZhbHVlIGNvbnZlcnRlZCB0byBsb3dlcmNhc2UuCisgICAgICAgICAqLworICAgICAgICBSRUZSRVNIX1RPS0VOLAorICAgICAgICAvKioKKyAgICAgICAgICogVXNlZCBpbiBSZXNvdXJjZSBPd25lciBQYXNzd29yZCBDcmVkZW50aWFsIEdyYW50LgorICAgICAgICAgKiBUaGUgcGFyYW1ldGVyIGtleSBkZWZpbmVkIGJ5IHRoZSBPQXV0aDIgcHJvdG9jb2wgaXMgZXF1YWwKKyAgICAgICAgICogdG8gdGhlIG5hbWUgb2YgdGhpcyBlbnVtIHZhbHVlIGNvbnZlcnRlZCB0byBsb3dlcmNhc2UuCisgICAgICAgICAqLworICAgICAgICBQQVNTV09SRCwKKyAgICAgICAgLyoqCisgICAgICAgICAqIFVzZWQgaW4gQ2xpZW50IENyZWRlbnRpYWxzIEZsb3cuCisgICAgICAgICAqIFRoZSBwYXJhbWV0ZXIga2V5IGRlZmluZWQgYnkgdGhlIE9BdXRoMiBwcm90b2NvbCBpcyBlcXVhbAorICAgICAgICAgKiB0byB0aGUgbmFtZSBvZiB0aGlzIGVudW0gdmFsdWUgY29udmVydGVkIHRvIGxvd2VyY2FzZS4KKyAgICAgICAgICovCisgICAgICAgIENMSUVOVF9DUkVERU5USUFMUzsKKworICAgICAgICAvKioKKyAgICAgICAgICogUGFyYW1ldGVyIGtleSBuYW1lLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcga2V5ID0gImdyYW50X3R5cGUiOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByZXZlbnQgaW5zdGFudGlhdGlvbi4KKyAgICAgKi8KKyAgICBwcml2YXRlIE9BdXRoMlBhcmFtZXRlcnMoKSB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvb2F1dGgyLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9vYXV0aDIvVG9rZW5SZXN1bHQuamF2YSBiL3NlY3VyaXR5L29hdXRoMi1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvb2F1dGgyL1Rva2VuUmVzdWx0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBmY2ZhZgotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L29hdXRoMi1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvb2F1dGgyL1Rva2VuUmVzdWx0LmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50Lm9hdXRoMjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKKy8qKgorICogQ2xhc3MgdGhhdCBjb250YWlucyBhIHJlc3VsdCBvZiB0aGUgQXV0aG9yaXphdGlvbiBGbG93IGluY2x1ZGluZyBhIGFjY2VzcyB0b2tlbi4KKyAqIDxwPgorICogQWxsIHJlc3VsdCBwcm9wZXJ0aWVzIGNhbiBiZSBnZXQgYnkgdGhlIG1ldGhvZCB7QGxpbmsgI2dldEFsbFByb3BlcnRpZXMoKX0uIFNvbWUgb2YgdGhlIHByb3BlcnRpZXMKKyAqIGFyZSBzdGFuZGFyZGl6ZWQgYnkgdGhlIE9BdXRoIDIgc3BlY2lmaWNhdGlvbiBhbmQgdGhlcmVmb3JlIHRoZSBjbGFzcyBjb250YWlucyBnZXR0ZXJzIHRoYXQgZXh0cmFjdAorICogdGhlc2UgcHJvcGVydGllcyBmcm9tIHRoZSBwcm9wZXJ0eSBtYXAuCisgKiA8L3A+CisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICogQHNpbmNlIDIuMworICovCitwdWJsaWMgY2xhc3MgVG9rZW5SZXN1bHQgeworCisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXM7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2UgaW5pdGlhdGVkIGZyb20gdGhlIHByb3BlcnR5IG1hcC4KKyAgICAgKiBAcGFyYW0gcHJvcGVydGllcyBBY2Nlc3MgcHJvcGVydGllcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgVG9rZW5SZXN1bHQoZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzKSB7CisgICAgICAgIHRoaXMucHJvcGVydGllcyA9IHByb3BlcnRpZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGFjY2VzcyB0b2tlbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gQWNjZXNzIHRva2VuLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWNjZXNzVG9rZW4oKSB7CisgICAgICAgIHJldHVybiBnZXRQcm9wZXJ0eSgiYWNjZXNzX3Rva2VuIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGV4cGlyYXRpb24gdGltZSBvZiB0aGUge0BsaW5rICNnZXRBY2Nlc3NUb2tlbigpIGFjY2VzcyB0b2tlbn0gaW4gc2Vjb25kcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gRXhwaXJhdGlvbiB0aW1lIGluIHNlY29uZHMgb3Ige0Bjb2RlIG51bGx9IGlmIHRoZSB2YWx1ZSBpcyBub3QgcHJvdmlkZWQuCisgICAgICovCisgICAgcHVibGljIExvbmcgZ2V0RXhwaXJlc0luKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgZXhwaXJhdGlvbiA9IGdldFByb3BlcnR5KCJleHBpcmVzX2luIik7CisgICAgICAgIGlmIChleHBpcmF0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIHJldHVybiBMb25nLnZhbHVlT2YoZXhwaXJhdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSByZWZyZXNoIHRva2VuLiBOb3RlIHRoYXQgdGhlIHJlZnJlc2ggdG9rZW4gbXVzdCBub3QgYmUgaXNzdWVkIGR1cmluZyB0aGUgYXV0aG9yaXphdGlvbiBmbG93LgorICAgICAqIFNvbWUgU2VydmljZSBQcm92aWRlcnMgaXNzdWUgcmVmcmVzaCB0b2tlbiBvbmx5IG9uIGZpcnN0IHVzZXIgYXV0aG9yaXphdGlvbiBhbmQgc29tZSBwcm92aWRlcnMKKyAgICAgKiBkb2VzIG5vdCBzdXBwb3J0IHJlZnJlc2ggdG9rZW4gYXQgYWxsIGFuZCBhdXRob3JpemF0aW9uIGZsb3cgbXVzdCBiZSBhbHdheXMgcGVyZm9ybWVkIHdoZW4gdG9rZW4KKyAgICAgKiBleHBpcmVzLgorICAgICAqCisgICAgICogQHJldHVybiBSZWZyZXNoIHRva2VuIG9yIHtAY29kZSBudWxsfSBpZiB0aGUgdmFsdWUgaXMgbm90IHByb3ZpZGVkLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVmcmVzaFRva2VuKCkgeworICAgICAgICByZXR1cm4gZ2V0UHJvcGVydHkoInJlZnJlc2hfdG9rZW4iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHR5cGUgb2YgdGhlIHJldHVybmVkIGFjY2VzcyB0b2tlbi4gVHlwZSBpcyBpbiBtb3N0IGNhc2VzIHtAY29kZSBiZWFyZXJ9IChubyBjcnlwdG9ncmFwaHkgaXMgdXNlZCkKKyAgICAgKiBidXQgcHJvdmlkZXIgbWlnaHQgc3VwcG9ydCBhbHNvIG90aGVyIGtpbmRzIG9mIHRva2VuIGxpa2Uge0Bjb2RlIG1hY30uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRva2VuIHR5cGUuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRUb2tlblR5cGUoKSB7CisgICAgICAgIHJldHVybiBnZXRQcm9wZXJ0eSgidG9rZW5fdHlwZSIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgbWFwIG9mIGFsbCBwcm9wZXJ0aWVzIHJldHVybmVkIGluIHRoZSBBY2Nlc3MgVG9rZW4gUmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE1hcCB3aXRoIGFsbCB0b2tlbiBwcm9wZXJ0aWVzLgorICAgICAqLworICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldEFsbFByb3BlcnRpZXMoKSB7CisgICAgICAgIHJldHVybiBwcm9wZXJ0aWVzOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldFByb3BlcnR5KGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIGZpbmFsIE9iamVjdCBwcm9wZXJ0eSA9IHByb3BlcnRpZXMuZ2V0KG5hbWUpOworCisgICAgICAgIGlmIChwcm9wZXJ0eSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAocHJvcGVydHkgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7CisgICAgICAgICAgICAgICAgZm9yIChmaW5hbCBPYmplY3QgdmFsdWUgOiAoQ29sbGVjdGlvbikgcHJvcGVydHkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcHJvcGVydHkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlY3VyaXR5L29hdXRoMi1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvb2F1dGgyL3BhY2thZ2UtaW5mby5qYXZhIGIvc2VjdXJpdHkvb2F1dGgyLWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9vYXV0aDIvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk3MTA0NwotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L29hdXRoMi1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvb2F1dGgyL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKKy8qKgorICogSmVyc2V5IE9BdXRoIDIgQ2xpZW50IEFQSS4KKyAqCisgKiBUaGUgQVBJIGlzIGN1cnJlbnRseSBpbiB0aGUgc3RhdGUgb2YgYSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuQmV0YSBCRVRBfSB2ZXJzaW9uLgorICovCitAQmV0YQorcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQub2F1dGgyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuQmV0YTsKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L29hdXRoMi1jbGllbnQvc3JjL21haW4vcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L2NsaWVudC9vYXV0aDIvaW50ZXJuYWwvbG9jYWxpemF0aW9uLnByb3BlcnRpZXMgYi9zZWN1cml0eS9vYXV0aDItY2xpZW50L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvb2F1dGgyL2ludGVybmFsL2xvY2FsaXphdGlvbi5wcm9wZXJ0aWVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5OTBmNDMKLS0tIC9kZXYvbnVsbAorKysgYi9zZWN1cml0eS9vYXV0aDItY2xpZW50L3NyYy9tYWluL3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS9jbGllbnQvb2F1dGgyL2ludGVybmFsL2xvY2FsaXphdGlvbi5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjAgQEAKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisjCisjIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyMgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorIyBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyMgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorIworIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyMKKworZXJyb3IuZmxvdy53cm9uZy5zdGF0ZT1JbnZhbGlkICdzdGF0ZScgcGFyYW1ldGVyLiAnc3RhdGUnIHVzZWQgaW4gdGhlIGF1dGhvcml6YXRpb24gcmVxdWVzdCBkb2VzIG5vdCBtYXRjaCB0byB0aGUgJ3N0YXRlJyBmcm9tIHRoZSBhdXRob3JpemF0aW9uIHJlc3BvbnNlLgorZXJyb3IuZmxvdy5yZXF1ZXN0LmFjY2Vzc1Rva2VuPUVycm9yIHJlcXVlc3RpbmcgYWNjZXNzIHRva2VuLiBSZXNwb25zZSBzdGF0dXMgezB9LgorZXJyb3IuZmxvdy5yZXF1ZXN0LnJlZnJlc2hUb2tlbj1FcnJvciByZWZyZXNoaW5nIGFuIGFjY2VzcyB0b2tlbi4gUmVzcG9uc2Ugc3RhdHVzOiB7MH0uCitlcnJvci5mbG93Lm5vdC5maW5pc2hlZD1BdXRob3JpemF0aW9uIGlzIG5vdCBmaW5pc2hlZCBhbmQgYWNjZXNzIHRva2VuIHdhcyBub3QgcmVjZWl2ZWQuIENhbGwgc3RhcnQoKSBhbmQgdGhlbiBmaW5pc2goKSB0byBwZXJmb3JtIHRoZSBhdXRob3JpemF0aW9uLgpkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvcG9tLnhtbCBiL3NlY3VyaXR5L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE4NDgyMQotLS0gL2Rldi9udWxsCisrKyBiL3NlY3VyaXR5L3BvbS54bWwKQEAgLTAsMCArMSw1NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleTwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlY3VyaXR5PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktc2VjdXJpdHk8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIEplcnNleSBzZWN1cml0eSBleHRlbnNpb24gbW9kdWxlcy4KKworICAgICAgICBOT1RFOiBOb24tc2VjdXJpdHkgSmVyc2V5IGV4dGVuc2lvbnMgaGF2ZSB0aGVpciBvd24gZGVkaWNhdGVkIHVtYnJlbGxhCisgICAgICAgIHByb2plY3QuCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxtb2R1bGVzPgorICAgICAgICA8bW9kdWxlPm9hdXRoMS1jbGllbnQ8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5vYXV0aDEtc2lnbmF0dXJlPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+b2F1dGgxLXNlcnZlcjwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPm9hdXRoMi1jbGllbnQ8L21vZHVsZT4KKyAgICA8L21vZHVsZXM+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1oazI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL2NvcmUvcG9tLnhtbCBiL3Rlc3QtZnJhbWV3b3JrL2NvcmUvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODZhOTFmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1mcmFtZXdvcmsvY29yZS9wb20ueG1sCkBAIC0wLDAgKzEsODIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcms8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstY29yZTwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0LWZyYW1ld29yay1jb3JlPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPkplcnNleSBUZXN0IEZyYW1ld29yayBDb3JlPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1zZXJ2ZXI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguc2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3NlcnZsZXQzLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jbGllbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcudGVzdG5nPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+dGVzdG5nPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5zb25hcjwvaWQ+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGRpc2FibGUgSmFDb0NvIGxpc3RlbmVyIGJlY2F1c2Ugd2UgaGF2ZSBib3RoIEp1bml0IGFuZCBUZXNldE5HIHRvZ2V0aGVyIGluIHRoaXMgcHJvamVjdCAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydGllcyBjb21iaW5lLnNlbGY9Im92ZXJyaWRlIiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL2NvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L0NvbnRhaW5lclBlckNsYXNzVGVzdE5nU3RyYXRlZ3kuamF2YSBiL3Rlc3QtZnJhbWV3b3JrL2NvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L0NvbnRhaW5lclBlckNsYXNzVGVzdE5nU3RyYXRlZ3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTBjZTkxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1mcmFtZXdvcmsvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvQ29udGFpbmVyUGVyQ2xhc3NUZXN0TmdTdHJhdGVneS5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3ROZ1N0cmF0ZWd5OworCisvKioKKyAqIFRlc3RORyBzdHJhdGVneSB0aGF0IGNyZWF0ZXMgb25lIHRlc3QgY29udGFpbmVyIC8gY2xpZW50IHBlciB0ZXN0IGNsYXNzLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgQ29udGFpbmVyUGVyQ2xhc3NUZXN0TmdTdHJhdGVneSBpbXBsZW1lbnRzIFRlc3ROZ1N0cmF0ZWd5IHsKKworICAgIHByaXZhdGUgVGVzdENvbnRhaW5lciB0ZXN0Q29udGFpbmVyOworICAgIHByaXZhdGUgQ2xpZW50IGNsaWVudDsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUZXN0Q29udGFpbmVyIHRlc3RDb250YWluZXIoKSB7CisgICAgICAgIHJldHVybiB0ZXN0Q29udGFpbmVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUZXN0Q29udGFpbmVyIHRlc3RDb250YWluZXIoZmluYWwgVGVzdENvbnRhaW5lciB0ZXN0Q29udGFpbmVyKSB7CisgICAgICAgIGZpbmFsIFRlc3RDb250YWluZXIgb2xkID0gdGhpcy50ZXN0Q29udGFpbmVyOworICAgICAgICB0aGlzLnRlc3RDb250YWluZXIgPSB0ZXN0Q29udGFpbmVyOworICAgICAgICByZXR1cm4gb2xkOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDbGllbnQgY2xpZW50KCkgeworICAgICAgICByZXR1cm4gY2xpZW50OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDbGllbnQgY2xpZW50KGZpbmFsIENsaWVudCBjbGllbnQpIHsKKyAgICAgICAgZmluYWwgQ2xpZW50IG9sZCA9IHRoaXMuY2xpZW50OworICAgICAgICB0aGlzLmNsaWVudCA9IGNsaWVudDsKKyAgICAgICAgcmV0dXJuIG9sZDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0LWZyYW1ld29yay9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9Db250YWluZXJQZXJNZXRob2RUZXN0TmdTdHJhdGVneS5qYXZhIGIvdGVzdC1mcmFtZXdvcmsvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvQ29udGFpbmVyUGVyTWV0aG9kVGVzdE5nU3RyYXRlZ3kuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzg4Nzg5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1mcmFtZXdvcmsvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvQ29udGFpbmVyUGVyTWV0aG9kVGVzdE5nU3RyYXRlZ3kuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0TmdTdHJhdGVneTsKKworLyoqCisgKiBUZXN0Tkcgc3RyYXRlZ3kgdGhhdCBjcmVhdGVzIHNlcGFyYXRlIHRlc3QgY29udGFpbmVyIC8gY2xpZW50IHBlciB0ZXN0IG1ldGhvZC4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIENvbnRhaW5lclBlck1ldGhvZFRlc3ROZ1N0cmF0ZWd5IGltcGxlbWVudHMgVGVzdE5nU3RyYXRlZ3kgeworCisgICAgcHJpdmF0ZSBmaW5hbCBUaHJlYWRMb2NhbDxUZXN0Q29udGFpbmVyPiB0ZXN0Q29udGFpbmVyTG9jYWwgPSBuZXcgVGhyZWFkTG9jYWw8PigpOworICAgIHByaXZhdGUgZmluYWwgVGhyZWFkTG9jYWw8Q2xpZW50PiBjbGllbnRMb2NhbCA9IG5ldyBUaHJlYWRMb2NhbDw+KCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVGVzdENvbnRhaW5lciB0ZXN0Q29udGFpbmVyKCkgeworICAgICAgICByZXR1cm4gdGVzdENvbnRhaW5lckxvY2FsLmdldCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUZXN0Q29udGFpbmVyIHRlc3RDb250YWluZXIoZmluYWwgVGVzdENvbnRhaW5lciB0ZXN0Q29udGFpbmVyKSB7CisgICAgICAgIGZpbmFsIFRlc3RDb250YWluZXIgb2xkID0gdGVzdENvbnRhaW5lckxvY2FsLmdldCgpOworCisgICAgICAgIGlmICh0ZXN0Q29udGFpbmVyID09IG51bGwpIHsKKyAgICAgICAgICAgIHRlc3RDb250YWluZXJMb2NhbC5yZW1vdmUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRlc3RDb250YWluZXJMb2NhbC5zZXQodGVzdENvbnRhaW5lcik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gb2xkOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBDbGllbnQgY2xpZW50KCkgeworICAgICAgICByZXR1cm4gY2xpZW50TG9jYWwuZ2V0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENsaWVudCBjbGllbnQoZmluYWwgQ2xpZW50IGNsaWVudCkgeworICAgICAgICBmaW5hbCBDbGllbnQgb2xkID0gY2xpZW50TG9jYWwuZ2V0KCk7CisKKyAgICAgICAgaWYgKGNsaWVudCA9PSBudWxsKSB7CisgICAgICAgICAgICBjbGllbnRMb2NhbC5yZW1vdmUoKTsKKyAgICAgICAgfSBlbHNlICB7CisgICAgICAgICAgICBjbGllbnRMb2NhbC5zZXQoY2xpZW50KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBvbGQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvRGVwbG95bWVudENvbnRleHQuamF2YSBiL3Rlc3QtZnJhbWV3b3JrL2NvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L0RlcGxveW1lbnRDb250ZXh0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBiYWUyYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZnJhbWV3b3JrL2NvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L0RlcGxveW1lbnRDb250ZXh0LmphdmEKQEAgLTAsMCArMSwyMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKKy8qKgorICogQmFzaWMgYXBwbGljYXRpb24gZGVwbG95bWVudCBjb250ZXh0LgorICogPHA+CisgKiBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIGNyZWF0ZWQgYnkgY3JlYXRpbmcgdXNpbmcge0BsaW5rIEJ1aWxkZXJ9LCB0aGF0IGFsbG93cyB0byBjb25maWd1cmUgdGhlIGRlcGxveW1lbnQKKyAqIGNvbnRleHQgc3RhdGUsIGFuZCBmaW5hbGx5IGJ1aWxkaW5nIHRoZSBjb250ZXh0IGJ5IGludm9raW5nIHRoZSB7QGxpbmsgQnVpbGRlciNidWlsZCgpfSBtZXRob2QuCisgKiA8L3A+CisgKiA8cD4KKyAqIFRoaXMgZGVwbG95bWVudCBjb250ZXh0IGlzIGNvbXBhdGlibGUgd2l0aCBiYXNpYyBub24tU2VydmxldCB0ZXN0IGNvbnRhaW5lcnMuIFRoZSBmb2xsb3dpbmcgdGVzdCBjb250YWluZXIKKyAqIGZhY3RvcmllcyBzdXBwb3J0IHRoZSBkZXNjcmlwdG9yOgorICogPHVsPgorICogPGxpPntAY29kZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmdyaXp6bHkuR3JpenpseVRlc3RDb250YWluZXJGYWN0b3J5fSBmb3IgdGVzdGluZyB3aXRoIHRoZSBHcml6emx5IEhUVFAgY29udGFpbmVyLjwvbGk+CisgKiA8bGk+e0Bjb2RlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuamV0dHkuSmV0dHlUZXN0Q29udGFpbmVyRmFjdG9yeX0gZm9yIHRlc3Rpbmcgd2l0aCB0aGUgSmV0dHkgSFRUUCBjb250YWluZXIuPC9saT4KKyAqIDxsaT57QGNvZGUgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zaW1wbGUuU2ltcGxlVGVzdENvbnRhaW5lckZhY3Rvcnl9IGZvciB0ZXN0aW5nIHdpdGggdGhlIFNpbXBsZSBIVFRQIGNvbnRhaW5lci48L2xpPgorICogPGxpPntAY29kZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0Lmpka2h0dHAuSmRrSHR0cFNlcnZlclRlc3RDb250YWluZXJGYWN0b3J5fSBmb3IgdGVzdGluZyB3aXRoIHRoZSBMaWdodCBXZWlnaHQgSFRUUAorICogc2VydmVyIGRpc3RyaWJ1dGVkIHdpdGggSmF2YSBTRS48L2xpPgorICogPGxpPntAY29kZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmlubWVtb3J5LkluTWVtb3J5VGVzdENvbnRhaW5lckZhY3Rvcnl9IGZvciB0ZXN0aW5nIGluIG1lbW9yeSB3aXRob3V0CisgKiB1c2luZyB1bmRlcmx5aW5nIEhUVFAgY2xpZW50IGFuZCBzZXJ2ZXIgc2lkZSBmdW5jdGlvbmFsaXR5IHRvIHNlbmQgcmVxdWVzdHMgYW5kIHJlY2VpdmUgcmVzcG9uc2VzLjwvbGk+CisgKiA8bGk+e0Bjb2RlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeX0gZm9yIHRlc3RpbmcgSmF2YSBFRSBXZWIKKyAqIGFwcGxpY2F0aW9ucyBkZXBsb3llZCBpbmRlcGVuZGVudGx5IGluIGEgc2VwYXJhdGUgSlZNIHRvIHRoYXQgb2YgdGhlIHRlc3RzLiBGb3IgZXhhbXBsZSwgdGhlIGFwcGxpY2F0aW9uCisgKiBtYXkgYmUgZGVwbG95ZWQgdG8gdGhlIEdsYXNzRmlzaCBvciBXZWJMb2dpYyBhcHBsaWNhdGlvbiBzZXJ2ZXIuPC9saT4KKyAqIDwvdWw+CisgKiA8L3A+CisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqIEBzaW5jZSAyLjgKKyAqLworcHVibGljIGNsYXNzIERlcGxveW1lbnRDb250ZXh0IHsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBkZXBsb3ltZW50IGNvbnRleHQgYnVpbGRlciBmb3IgYSBKQVgtUlMgLyBKZXJzZXkgYXBwbGljYXRpb24gaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXBwbGljYXRpb24gYSBKQVgtUlMgLyBKZXJzZXkgYXBwbGljYXRpb24gdG8gYmUgdGVzdGVkLgorICAgICAqIEByZXR1cm4gbmV3IGRlcGxveW1lbnQgY29udGV4dCBidWlsZGVyIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgSkFYLVJTIC8gSmVyc2V5IGFwcGxpY2F0aW9uIHRvIGJlIHRlc3RlZC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIGluIGNhc2UgdGhlIHtAY29kZSBhcHBsaWNhdGlvbn0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBidWlsZGVyKGZpbmFsIEFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uKSB7CisgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihhcHBsaWNhdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGRlcGxveW1lbnQgY29udGV4dCBidWlsZGVyIGZvciBhIEpBWC1SUyAvIEplcnNleSBhcHBsaWNhdGlvbiBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhcHBsaWNhdGlvbkNsYXNzIGEgSkFYLVJTIC8gSmVyc2V5IGFwcGxpY2F0aW9uIHRvIGJlIHRlc3RlZC4KKyAgICAgKiBAcmV0dXJuIG5ldyBkZXBsb3ltZW50IGNvbnRleHQgYnVpbGRlciBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggdGhlIEpBWC1SUyAvIEplcnNleSBhcHBsaWNhdGlvbiB0byBiZSB0ZXN0ZWQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBjYXNlIHRoZSB7QGNvZGUgYXBwbGljYXRpb25DbGFzc30gaXMge0Bjb2RlIG51bGx9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBidWlsZGVyKGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBBcHBsaWNhdGlvbj4gYXBwbGljYXRpb25DbGFzcykgeworICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoYXBwbGljYXRpb25DbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGRlcGxveW1lbnQgY29udGV4dCBmb3IgYSBKQVgtUlMgLyBKZXJzZXkgYXBwbGljYXRpb24gaW5zdGFuY2UuCisgICAgICogPHA+CisgICAgICogVGhlIGNyZWF0ZWQgZGVwbG95bWVudCBjb250ZXh0IHdpbGwgYmUgY29uZmlndXJlZCB0byB1c2UgZGVmYXVsdCB2YWx1ZXMuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGFwcGxpY2F0aW9uIGEgSkFYLVJTIC8gSmVyc2V5IGFwcGxpY2F0aW9uIHRvIGJlIHRlc3RlZC4KKyAgICAgKiBAcmV0dXJuIG5ldyBkZXBsb3ltZW50IGNvbnRleHQgaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBKQVgtUlMgLyBKZXJzZXkgYXBwbGljYXRpb24gdG8gYmUgdGVzdGVkLgorICAgICAqCisgICAgICogQHRocm93cyBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gY2FzZSB0aGUge0Bjb2RlIGFwcGxpY2F0aW9ufSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBEZXBsb3ltZW50Q29udGV4dCBuZXdJbnN0YW5jZShmaW5hbCBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbikgeworICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoYXBwbGljYXRpb24pLmJ1aWxkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IGRlcGxveW1lbnQgY29udGV4dCBmb3IgYSBKQVgtUlMgLyBKZXJzZXkgYXBwbGljYXRpb24gaW5zdGFuY2UuCisgICAgICogPHA+CisgICAgICogVGhlIGNyZWF0ZWQgZGVwbG95bWVudCBjb250ZXh0IHdpbGwgYmUgY29uZmlndXJlZCB0byB1c2UgZGVmYXVsdCB2YWx1ZXMuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIGFwcGxpY2F0aW9uQ2xhc3MgYSBKQVgtUlMgLyBKZXJzZXkgYXBwbGljYXRpb24gdG8gYmUgdGVzdGVkLgorICAgICAqIEByZXR1cm4gbmV3IGRlcGxveW1lbnQgY29udGV4dCBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggdGhlIEpBWC1SUyAvIEplcnNleSBhcHBsaWNhdGlvbiB0byBiZSB0ZXN0ZWQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBjYXNlIHRoZSB7QGNvZGUgYXBwbGljYXRpb25DbGFzc30gaXMge0Bjb2RlIG51bGx9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgRGVwbG95bWVudENvbnRleHQgbmV3SW5zdGFuY2UoZmluYWwgQ2xhc3M8PyBleHRlbmRzIEFwcGxpY2F0aW9uPiBhcHBsaWNhdGlvbkNsYXNzKSB7CisgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcihhcHBsaWNhdGlvbkNsYXNzKS5idWlsZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIERlcGxveW1lbnQgY29udGV4dCBidWlsZGVyIGZvciBidWlsZGluZyBhIGJhc2ljIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgY29udGV4dCBmb3IgdGhlIEpBWC1SUyAvIEplcnNleSBhcHBsaWNhdGlvbgorICAgICAqIGRlZmluZWQgYnkgdGhlIGFzc29jaWF0ZWQge0BsaW5rIGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb259IGNsYXNzIG9yIGluc3RhbmNlLgorICAgICAqIDxwPgorICAgICAqIElmIHByb3BlcnRpZXMgb2YgdGhlIGJ1aWxkZXIgYXJlIG5vdCBtb2RpZmllZCwgZGVmYXVsdCB2YWx1ZXMgd2lsbCBiZSB1dGlsaXplZDoKKyAgICAgKiA8dWw+CisgICAgICogPGxpPkRlZmF1bHQgdmFsdWUgZm9yIHRoZSBjb250ZXh0IHBhdGggaXMgYW4gZW1wdHkgc3RyaW5nPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBBZnRlciB7QGxpbmsgI2J1aWxkKCl9IGhhcyBiZWVuIGludm9rZWQsIHRoZSBzdGF0ZSBvZiB0aGUgYnVpbGRlciB3aWxsIGJlIHJlc2V0IHRvIGRlZmF1bHQgdmFsdWVzIGFuZCBhbm90aGVyCisgICAgICogY29udGV4dCBmb3IgdGhlIGFzc29jaWF0ZWQgSkFYLVJTIC8gSmVyc2V5IGFwcGxpY2F0aW9uIGNhbiBiZSBwcmVwYXJlZCBhbmQgYnVpbHQuCisgICAgICogPC9wPgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlciB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX0NPTlRFWFRfUEFUSCA9ICIiOworCisgICAgICAgIHByaXZhdGUgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWc7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIGNvbnRleHRQYXRoID0gREVGQVVMVF9DT05URVhUX1BBVEg7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBuZXcgZGVwbG95bWVudCBjb250ZXh0IGJ1aWxkZXIgaW5zdGFuY2Ugbm90IGV4cGxpY2l0bHkgYm91bmQgdG8gdGhlIEpBWC1SUyAvIEplcnNleSBhcHBsaWNhdGlvbiBjbGFzcy4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoZSBjb25zdHJ1Y3RvciBpcyBwcm92aWRlZCB0byBzdXBwb3J0IGRpZmZlcmVudCBzdWJjbGFzcyBpbml0aWFsaXphdGlvbiBzY2VuYXJpb3MuCisgICAgICAgICAqIDwvcD4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBCdWlsZGVyKCkgeworICAgICAgICAgICAgdGhpcy5yZXNvdXJjZUNvbmZpZyA9IG51bGw7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIG5ldyBkZXBsb3ltZW50IGNvbnRleHQgYnVpbGRlciBpbnN0YW5jZSBhbmQgYmluZCBpdCB0byB0aGUgSkFYLVJTIC8gSmVyc2V5IGFwcGxpY2F0aW9uIGluc3RhbmNlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYXBwIEpBWC1SUyAvIEplcnNleSBhcHBsaWNhdGlvbiBpbnN0YW5jZS4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBCdWlsZGVyKGZpbmFsIEFwcGxpY2F0aW9uIGFwcCkgeworICAgICAgICAgICAgaWYgKGFwcCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJBcHBsaWNhdGlvbiBtdXN0IG5vdCBiZSBudWxsLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcy5yZXNvdXJjZUNvbmZpZyA9IFJlc291cmNlQ29uZmlnLmZvckFwcGxpY2F0aW9uKGFwcCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIG5ldyBkZXBsb3ltZW50IGNvbnRleHQgYnVpbGRlciBpbnN0YW5jZSBhbmQgYmluZCBpdCB0byB0aGUgSkFYLVJTIC8gSmVyc2V5IGFwcGxpY2F0aW9uIGNsYXNzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYXBwQ2xhc3MgSkFYLVJTIC8gSmVyc2V5IGFwcGxpY2F0aW9uIGNsYXNzLgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIEJ1aWxkZXIoZmluYWwgQ2xhc3M8PyBleHRlbmRzIEFwcGxpY2F0aW9uPiBhcHBDbGFzcykgeworICAgICAgICAgICAgaWYgKGFwcENsYXNzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIkFwcGxpY2F0aW9uIGNsYXNzIG11c3Qgbm90IGJlIG51bGwuIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMucmVzb3VyY2VDb25maWcgPSBSZXNvdXJjZUNvbmZpZy5mb3JBcHBsaWNhdGlvbkNsYXNzKGFwcENsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgY29udGV4dCBwYXRoLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29udGV4dFBhdGggYXBwbGljYXRpb24gY29udGV4dCBwYXRoLgorICAgICAgICAgKiBAcmV0dXJuIHRoaXMgYXBwbGljYXRpb24gZGVwbG95bWVudCBjb250ZXh0IGJ1aWxkZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEB0aHJvd3MgTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYge0Bjb2RlIGNvbnRleHRQYXRofSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBjb250ZXh0UGF0aChmaW5hbCBTdHJpbmcgY29udGV4dFBhdGgpIHsKKyAgICAgICAgICAgIGlmIChjb250ZXh0UGF0aCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJUaGUgY29udGV4dCBwYXRoIG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy5jb250ZXh0UGF0aCA9IGNvbnRleHRQYXRoOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQnVpbGQgYSBuZXcgYXBwbGljYXRpb24gZGVwbG95bWVudCBjb250ZXh0IGNvbmZpZ3VyZWQgYnkgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhpcworICAgICAgICAgKiBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGNvbnRleHQgYnVpbGRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB0aGlzIGFwcGxpY2F0aW9uIGRlcGxveW1lbnQgY29udGV4dCBidWlsZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIERlcGxveW1lbnRDb250ZXh0IGJ1aWxkKCkgeworICAgICAgICAgICAgZmluYWwgRGVwbG95bWVudENvbnRleHQgbGxkID0gbmV3IERlcGxveW1lbnRDb250ZXh0KHRoaXMpOworCisgICAgICAgICAgICByZXNldCgpOworCisgICAgICAgICAgICByZXR1cm4gbGxkOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlc2V0IHRoZSBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGNvbnRleHQgYnVpbGRlciB2YWx1ZXMgdG8gZGVmYXVsdHMuCisgICAgICAgICAqCisgICAgICAgICAqIE5vdGUgdGhhdCB0aGUgYnVpbGRlciBzdGlsbCByZW1haW5zIGJvdW5kIHRvIHRoZSBzYW1lIEpBWC1SUyAvIEplcnNleSBhcHBsaWNhdGlvbiBpbnN0YW5jZS4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHJlc2V0KCkgeworICAgICAgICAgICAgdGhpcy5jb250ZXh0UGF0aCA9ICIiOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZzsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBjb250ZXh0UGF0aDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgYXBwbGljYXRpb24gZGVwbG95bWVudCBjb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIGIge0BsaW5rIEJ1aWxkZXJ9IGluc3RhbmNlLgorICAgICAqLworICAgIHByb3RlY3RlZCBEZXBsb3ltZW50Q29udGV4dChmaW5hbCBCdWlsZGVyIGIpIHsKKyAgICAgICAgdGhpcy5jb250ZXh0UGF0aCA9IGIuY29udGV4dFBhdGg7CisgICAgICAgIHRoaXMucmVzb3VyY2VDb25maWcgPSBiLnJlc291cmNlQ29uZmlnOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZGVwbG95ZWQgYXBwbGljYXRpb24gcmVzb3VyY2UgY29uZmlndXJhdGlvbi4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIG1ldGhvZCBjYW4gYmUgb3ZlcnJpZGRlbiBpbiBhIHN1YmNsYXNzIHRvIHN1cHBvcnQgY29udmVyc2lvbiBvZiBub24tcmVzb3VyY2UgY29uZmlnCisgICAgICogaW5pdGlhbGl6YXRpb24gc2NlbmFyaW8gKGUuZy4gdmlhIFNlcnZsZXQgaW5pdCBwYXJhbWV0ZXJzKSBpbnRvIGEgcmVzb3VyY2UgY29uZmlndXJhdGlvbi4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBkZXBsb3llZCBhcHBsaWNhdGlvbiByZXNvdXJjZSBjb25maWd1cmF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBSZXNvdXJjZUNvbmZpZyBnZXRSZXNvdXJjZUNvbmZpZygpIHsKKyAgICAgICAgcmV0dXJuIHJlc291cmNlQ29uZmlnOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZGVwbG95ZWQgYXBwbGljYXRpb24gY29udGV4dCBwYXRoLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZGVwbG95ZWQgYXBwbGljYXRpb24gY29udGV4dCBwYXRoLgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgZ2V0Q29udGV4dFBhdGgoKSB7CisgICAgICAgIHJldHVybiBjb250ZXh0UGF0aDsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL2NvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L0plcnNleVRlc3QuamF2YSBiL3Rlc3QtZnJhbWV3b3JrL2NvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L0plcnNleVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjc5NTRjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1mcmFtZXdvcmsvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvSmVyc2V5VGVzdC5qYXZhCkBAIC0wLDAgKzEsOTUzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Q7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5BY2Nlc3NDb250cm9sbGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5JZGVudGl0eUhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuSGFuZGxlcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dNYW5hZ2VyOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuU2VydmljZUZpbmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlByb3BlcnRpZXNIZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5SZWZsZWN0aW9uSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CisKKy8qKgorICogUGFyZW50IGNsYXNzIGZvciB0ZXN0aW5nIEpBWC1SUyBhbmQgSmVyc2V5LWJhc2VkIGFwcGxpY2F0aW9ucyB1c2luZyBKZXJzZXkgdGVzdCBmcmFtZXdvcmsuCisgKiA8cD4KKyAqIEF0IGNvbnN0cnVjdGlvbiB0aGlzIGNsYXNzIHdpbGwgb2J0YWluIGEge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5CisgKiB0ZXN0IGNvbnRhaW5lciBmYWN0b3J5fSBpbXBsZW1lbnRhdGlvbi4KKyAqIDwvcD4KKyAqIDxwPgorICogQmVmb3JlIGVhY2ggdGVzdCBtZXRob2QgaW4gYW4gZXh0ZW5kaW5nIGNsYXNzIGlzIHJ1biB0aGUgdGVzdCBjb250YWluZXIgZmFjdG9yeSBpcyB1c2VkIHRvIG9idGFpbgorICogYSBjb25maWd1cmVkIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyIHRlc3QgY29udGFpbmVyfS4KKyAqIFRoZW4gdGhlIHtAbGluayBUZXN0Q29udGFpbmVyI3N0YXJ0KCl9IG1ldGhvZCBpcyBpbnZva2VkIG9uIHRoZSBjb25maWd1cmVkIHRlc3QgY29udGFpbmVyLiBBZnRlciBlYWNoIHRlc3QgbWV0aG9kCisgKiBoYXMgcnVuLCB0aGUge0BsaW5rIFRlc3RDb250YWluZXIjc3RvcCgpfSBtZXRob2QgaXMgaW52b2tlZCBvbiB0aGUgdGVzdCBjb250YWluZXIuIFN0b3BwZWQgdGVzdCBjb250YWluZXIKKyAqIGdlbmVyYWxseSBzaG91bGRuJ3QgYmUgYWdhaW4gc3RhcnRlZCBmb3IgYW5vdGhlciB0ZXN0LCByYXRoZXIgYSBuZXcgdGVzdCBjb250YWluZXIgc2hvdWxkIGJlIGNyZWF0ZWQuCisgKiBFdmVyeSB0ZXN0IG1ldGhvZCBpbiB0aGUge0Bjb2RlIEplcnNleVRlc3R9IHN1YmNsYXNzIGNhbiBpbnZva2UgdGhlIHtAbGluayAjY2xpZW50KCl9IHRvIG9idGFpbiBhIEpBWC1SUworICoge0BsaW5rIGphdmF4LndzLnJzLmNsaWVudC5DbGllbnR9LCBmcm9tIHdoaWNoIHtAbGluayBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0fSBpbnN0YW5jZXMgY2FuIGJlIGNyZWF0ZWQKKyAqIHRvIHNlbmQgYXJiaXRyYXJ5IHJlcXVlc3RzLgorICogQWxzbywgb25lIG9mIHRoZSB7QGNvZGUgdGFyZ2V0fSBtZXRob2RzICh7QGxpbmsgI3RhcmdldCgpfSBvciB7QGxpbmsgI3RhcmdldChTdHJpbmcpfSkgbWF5IGJlIGludm9rZWQgdG8gb2J0YWluCisgKiBhIEpBWC1SUyB7QGxpbmsgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldH0gaW5zdGFuY2VzIGZyb20gd2hpY2ggcmVxdWVzdHMgY2FuIGJlIHNlbnQgdG8gYW5kIHJlc3BvbnNlcworICogcmVjZWl2ZWQgZnJvbSB0aGUgV2ViIGFwcGxpY2F0aW9uIHVuZGVyIHRlc3QuCisgKiA8L3A+CisgKiA8cD4KKyAqIElmIGEgdGVzdCBjb250YWluZXIgZmFjdG9yeSBpcyBub3QgZXhwbGljaXRseSBkZWNsYXJlZCB1c2luZyB0aGUgYXBwcm9wcmlhdGUgY29uc3RydWN0b3IKKyAqIChzZWUge0BsaW5rICNKZXJzZXlUZXN0KFRlc3RDb250YWluZXJGYWN0b3J5KX0pIG9yIGJ5IG92ZXJyaWRpbmcgdGhlIHtAbGluayAjZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKX0gbWV0aG9kLAorICogdGhlbiBhIGRlZmF1bHQgdGVzdCBjb250YWluZXIgZmFjdG9yeSB3aWxsIGJlIG9idGFpbmVkIGFzIGZvbGxvd3M6CisgKiA8b2w+CisgKiA8bGk+CisgKiBJZiBhIHN5c3RlbSBwcm9wZXJ0eSA8dHQ+e0B2YWx1ZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzI0NPTlRBSU5FUl9GQUNUT1JZfTwvdHQ+IGlzIHNldAorICogYW5kIHRoZSB2YWx1ZSBpcyBhIGZ1bGx5IHF1YWxpZmllZCBjbGFzcyBuYW1lIG9mIGEgY2xhc3MgdGhhdCBleHRlbmRzIGZyb20ge0Bjb2RlIFRlc3RDb250YWluZXJGYWN0b3J5fQorICogdGhlbiB0aGUgdGVzdCBjb250YWluZXIgZmFjdG9yeSB1c2VkIGJ5IGRlZmF1bHQgd2lsbCBiZSBhbiBpbnN0YW5jZSBvZiB0aGF0IGNsYXNzLgorICogQSB7QGxpbmsgVGVzdENvbnRhaW5lckV4Y2VwdGlvbn0gd2lsbCBiZSB0aHJvd24gaWYgdGhlIGNsYXNzIGNhbm5vdCBiZSBsb2FkZWQgb3IgaW5zdGFudGlhdGVkLgorICogPC9saT4KKyAqIDxsaT4KKyAqIE90aGVyd2lzZSwge0Bjb2RlIE1FVEEtSU5GL3NlcnZpY2VzfSBsb2NhdGlvbnMgb24gdGhlIGNsYXNzIHBhdGggd2lsbCBiZSBzY2FubmVkIGZvciBpbXBsZW1lbnRhdGlvbiBwcm92aWRlcnMKKyAqIG9mIHtAY29kZSBUZXN0Q29udGFpbmVyRmFjdG9yeX0gU1BJLiBJZiBhIHNpbmdsZSBpbXBsZW1lbnRhdGlvbiBpcyBmb3VuZCwgaXQgd2lsbCBiZSB1c2VkLiBJZiBtdWx0aXBsZSBpbXBsZW1lbnRhdGlvbnMKKyAqIGFyZSBmb3VuZCwgdGhlIGRlZmF1bHQgPHR0PntAdmFsdWUgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllcyNDT05UQUlORVJfRkFDVE9SWX08L3R0PiBpbXBsZW1lbnRhdGlvbgorICogd2lsbCBiZSBzZWxlY3RlZCBpZiBwcmVzZW50LCBvdGhlcndpc2UgdGhlIGZpcnN0IGZvdW5kIGltcGxlbWVudGF0aW9uIHdpbGwgYmUgc2VsZWN0ZWQgYW5kIGEgd2FybmluZyBtZXNzYWdlIHdpbGwgYmUgbG9nZ2VkLgorICogPC9saT4KKyAqIDxsaT4KKyAqIElmIG5vIHtAY29kZSBUZXN0Q29udGFpbmVyRmFjdG9yeX0gaGFzIGJlZW4gc2VsZWN0ZWQgaW4gdGhlIHN0ZXBzIGFib3ZlLCBKZXJzZXkgdGVzdCBmcmFtZXdvcmsgd2lsbCB0cnkgdG8KKyAqIGluc3RhbnRpYXRlIHRoZSBkZWZhdWx0IHRlc3QgY29udGFpbmVyIGZhY3RvcnkgaW1wbGVtZW50YXRpb24gKAorICogPHR0PntAdmFsdWUgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllcyNERUZBVUxUX0NPTlRBSU5FUl9GQUNUT1JZfTwvdHQ+KSBkaXJlY3RseS4KKyAqIEEge0BsaW5rIFRlc3RDb250YWluZXJFeGNlcHRpb259IHdpbGwgYmUgdGhyb3duIGlmIHRoaXMgY2xhc3MgY2Fubm90IGJlIGxvYWRlZCBvciBpbnN0YW50aWF0ZWQuCisgKiA8L2xpPgorICogPC9vbD4KKyAqIDwvcD4KKyAqIDxwPgorICogVGhlIHRlc3QgY29udGFpbmVyIGlzIGNvbmZpZ3VyZWQgYnkgYSB7QGxpbmsgRGVwbG95bWVudENvbnRleHR9IHRoYXQgaXMgZWl0aGVyIHByb3ZpZGVkCisgKiBieSAgc3ViY2xhc3Mgb3IgYXV0b21hdGljYWxseSBjcmVhdGVkIGJ5IHtAY29kZSBKZXJzZXlUZXN0fSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgSkFYLVJTIC8gSmVyc2V5IHtAY29kZSBBcHBsaWNhdGlvbn0KKyAqIGNsYXNzIG9yIGluc3RhbmNlIHRvIGJlIHRlc3RlZC4gQSB7QGxpbmsgVGVzdENvbnRhaW5lckV4Y2VwdGlvbn0gd2lsbCBiZSB0aHJvd24gaWYgdGhlIGNvbmZpZ3VyZWQgdGVzdCBjb250YWluZXIKKyAqIGZhY3RvcnkgY2Fubm90IHN1cHBvcnQgdGhlIGRlcGxveW1lbnQgY29udGV4dCB0eXBlLgorICogVHdvIGRlcGxveW1lbnQgY29udGV4dCBhcmUgcHJvdmlkZWQ6CisgKiA8b2w+CisgKiA8bGk+QSBiYXNpYyBkZXBsb3ltZW50IGNvbnRleHQsIG9mIHR5cGUge0BsaW5rIERlcGxveW1lbnRDb250ZXh0fSwgY29tcGF0aWJsZSB3aXRoIGFsbCB0ZXN0IGNvbnRhaW5lcnMgdGhhdCBhcmUgbm90CisgKiBiYXNlZCBvbiBTZXJ2bGV0IGRlcGxveW1lbnQgbW9kZWwuPC9saT4KKyAqIDxsaT5BIFNlcnZsZXQtYmFzZWQgZGVwbG95bWVudCBjb250ZXh0LCBvZiB0eXBlIHtAbGluayBTZXJ2bGV0RGVwbG95bWVudENvbnRleHR9LCBjb21wYXRpYmxlIHdpdGggU2VydmxldC1iYXNlZCB0ZXN0CisgKiBjb250YWluZXJzLjwvbGk+CisgKiA8L29sPgorICogPC9wPgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgU3Jpbml2YXMgQmhpbWlzZXR0eQorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQFN1cHByZXNzV2FybmluZ3MoIlVudXNlZERlY2xhcmF0aW9uIikKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEplcnNleVRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIC8qKgorICAgICAqIEhvbGRzIHRoZSB0ZXN0IGNvbnRhaW5lciBmYWN0b3J5IGNsYXNzIHRvIGJlIHVzZWQgZm9yIHJ1bm5pbmcgdGhlIHRlc3RzIGJ5IGRlZmF1bHQKKyAgICAgKiAoaWYgdGVzdENvbnRhaW5lckZhY3RvcnkgaGFzIG5vdCBiZWVuIHNldCkuCisgICAgICogVGhpcyBzdGF0aWMgZmllbGQgaXMgaW5pdGlhbGl6ZWQgaW4ge0BsaW5rICNnZXREZWZhdWx0VGVzdENvbnRhaW5lckZhY3RvcnkoKX0gbWV0aG9kCisgICAgICogYW5kIGlzIHJldXNlZCBieSBhbnkgaW5zdGFuY2VzIG9mIHtAY29kZSBKZXJzZXlUZXN0fSB0aGF0IGFyZSBzdWJzZXF1ZW50bHkgcnVuLgorICAgICAqIFRoaXMgaXMgZG9uZSB0byBvcHRpbWl6ZSB0aGUgbnVtYmVyIG9mIFRlc3RDb250YWluZXJGYWN0b3J5IHNlcnZpY2UgcHJvdmlkZXIgbG9vay11cHMKKyAgICAgKiBhbmQgY2xhc3MgbG9hZGluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBDbGFzczw/IGV4dGVuZHMgVGVzdENvbnRhaW5lckZhY3Rvcnk+IGRlZmF1bHRUZXN0Q29udGFpbmVyRmFjdG9yeUNsYXNzOworCisgICAgLyoqCisgICAgICogQ29uZmlndXJlZCBkZXBsb3ltZW50IGNvbnRleHQgZm9yIHRoZSB0ZXN0ZWQgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBEZXBsb3ltZW50Q29udGV4dCBjb250ZXh0OworCisgICAgLyoqCisgICAgICogVGhlIHRlc3QgY29udGFpbmVyIGZhY3Rvcnkgd2hpY2ggY3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGUgdGVzdCBjb250YWluZXIKKyAgICAgKiBvbiB3aGljaCB0aGUgdGVzdHMgd291bGQgYmUgcnVuLgorICAgICAqLworICAgIHByaXZhdGUgVGVzdENvbnRhaW5lckZhY3RvcnkgdGVzdENvbnRhaW5lckZhY3Rvcnk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgdGVzdCBjb250YWluZXIgb24gd2hpY2ggdGhlIHRlc3RzIHdvdWxkIGJlIHJ1bi4KKyAgICAgKi8KKyAgICBwcml2YXRlIFRlc3RDb250YWluZXIgdGVzdENvbnRhaW5lcjsKKworICAgIHByaXZhdGUgZmluYWwgQXRvbWljUmVmZXJlbmNlPENsaWVudD4gY2xpZW50ID0gbmV3IEF0b21pY1JlZmVyZW5jZTw+KG51bGwpOworCisgICAgLyoqCisgICAgICogSmVyc2V5VGVzdCBwcm9wZXJ0eSBiYWcgdGhhdCBjYW4gYmUgdXNlZCB0byBjb25maWd1cmUgdGhlIHRlc3QgYmVoYXZpb3IuCisgICAgICogVGhlc2UgcHJvcGVydGllcyBjYW4gYmUgb3ZlcnJpZGRlbiB3aXRoIGEgc3lzdGVtIHByb3BlcnR5LgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0eU1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKworICAgIC8qKgorICAgICAqIEplcnNleVRlc3QgZm9yY2VkIHByb3BlcnR5IGJhZyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgdGVzdCBiZWhhdmlvci4KKyAgICAgKiBUaGVzZSBwcm9wZXJ0eSBjYW5ub3QgYmUgb3ZlcnJpZGRlbiB3aXRoIGEgc3lzdGVtIHByb3BlcnR5LgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBmb3JjZWRQcm9wZXJ0eU1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKworICAgIHByaXZhdGUgSmVyc2V5VGVzdExvZ0hhbmRsZXIgbG9nSGFuZGxlcjsKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxMb2dnZXIsIExldmVsPiBsb2dMZXZlbE1hcCA9IG5ldyBJZGVudGl0eUhhc2hNYXA8PigpOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSBKZXJzZXlUZXN0IGluc3RhbmNlLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgY2FuIGJlIHVzZWQgZnJvbSBhbiBleHRlbmRpbmcgc3ViY2xhc3MuCisgICAgICogPHA+CisgICAgICogV2hlbiB0aGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQsIHRoZSBleHRlbmRpbmcgY29uY3JldGUgc3ViY2xhc3MgbXVzdCBpbXBsZW1lbnQgb25lIG9mIHRoZQorICAgICAqIHtAbGluayAjY29uZmlndXJlKCl9IG9yIHtAbGluayAjY29uZmlndXJlRGVwbG95bWVudCgpfSBtZXRob2RzIHRvIHByb3ZpZGUgdGhlIHRlc3RlZCBhcHBsaWNhdGlvbgorICAgICAqIGNvbmZpZ3VyYXRpb24gYW5kIGRlcGxveW1lbnQgY29udGV4dC4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIEplcnNleVRlc3QoKSB7CisgICAgICAgIC8vIE5vdGU6IHRoaXMgbXVzdCBiZSB0aGUgZmlyc3QgY2FsbCBpbiB0aGUgY29uc3RydWN0b3IgdG8gYWxsb3cgc2V0dGluZyBjb25maWcKKyAgICAgICAgLy8gcHJvcGVydGllcyAoZXNwZWNpYWxseSBhcm91bmQgbG9nZ2luZykgaW4gdGhlIGNvbmZpZ3VyZSgpIG9yIGNvbmZpZ3VyZURlcGxveW1lbnQoKQorICAgICAgICAvLyBtZXRob2Qgb3ZlcnJpZGRlbiBpbiBzdWJjbGFzcywgb3RoZXJ3aXNlIHRoZSBwcm9wZXJ0aWVzIHNldCBpbiB0aGUgc3ViY2xhc3Mgd291bGQKKyAgICAgICAgLy8gbm90IGJlIHNldCBzb29uIGVub3VnaAorICAgICAgICB0aGlzLmNvbnRleHQgPSBjb25maWd1cmVEZXBsb3ltZW50KCk7CisgICAgICAgIHRoaXMudGVzdENvbnRhaW5lckZhY3RvcnkgPSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgSmVyc2V5VGVzdCBpbnN0YW5jZSBhbmQgc3BlY2lmeSB0aGUgdGVzdCBjb250YWluZXIgZmFjdG9yeSB0byBiZSB1c2VkIGJ5IHRoaXMgdGVzdC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNhbiBiZSB1c2VkIGZyb20gYW4gZXh0ZW5kaW5nIHN1YmNsYXNzLgorICAgICAqIDxwPgorICAgICAqIFdoZW4gdGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkLCB0aGUgZXh0ZW5kaW5nIGNvbmNyZXRlIHN1YmNsYXNzIG11c3QgaW1wbGVtZW50IG9uZSBvZiB0aGUKKyAgICAgKiB7QGxpbmsgI2NvbmZpZ3VyZSgpfSBvciB7QGxpbmsgI2NvbmZpZ3VyZURlcGxveW1lbnQoKX0gbWV0aG9kcyB0byBwcm92aWRlIHRoZSB0ZXN0ZWQgYXBwbGljYXRpb24KKyAgICAgKiBjb25maWd1cmF0aW9uIGFuZCBkZXBsb3ltZW50IGNvbnRleHQuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHRlc3RDb250YWluZXJGYWN0b3J5IHRoZSB0ZXN0IGNvbnRhaW5lciBmYWN0b3J5IHRvIHVzZSBmb3IgdGVzdGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgSmVyc2V5VGVzdChmaW5hbCBUZXN0Q29udGFpbmVyRmFjdG9yeSB0ZXN0Q29udGFpbmVyRmFjdG9yeSkgeworICAgICAgICAvLyBOb3RlOiB0aGlzIG11c3QgYmUgdGhlIGZpcnN0IGNhbGwgaW4gdGhlIGNvbnN0cnVjdG9yIHRvIGFsbG93IHNldHRpbmcgY29uZmlnCisgICAgICAgIC8vIHByb3BlcnRpZXMgKGVzcGVjaWFsbHkgYXJvdW5kIGxvZ2dpbmcpIGluIHRoZSBjb25maWd1cmUoKSBvciBjb25maWd1cmVEZXBsb3ltZW50KCkKKyAgICAgICAgLy8gbWV0aG9kIG92ZXJyaWRkZW4gaW4gc3ViY2xhc3MsIG90aGVyd2lzZSB0aGUgcHJvcGVydGllcyBzZXQgaW4gdGhlIHN1YmNsYXNzIHdvdWxkCisgICAgICAgIC8vIG5vdCBiZSBzZXQgc29vbiBlbm91Z2gKKyAgICAgICAgdGhpcy5jb250ZXh0ID0gY29uZmlndXJlRGVwbG95bWVudCgpOworICAgICAgICB0aGlzLnRlc3RDb250YWluZXJGYWN0b3J5ID0gdGVzdENvbnRhaW5lckZhY3Rvcnk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSBKZXJzZXlUZXN0IGluc3RhbmNlLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgY2FuIGJlIHVzZWQgZnJvbSBhbiBleHRlbmRpbmcgc3ViY2xhc3MuCisgICAgICogPHA+CisgICAgICogV2hlbiB0aGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQsIHRoZSBleHRlbmRpbmcgY29uY3JldGUgc3ViY2xhc3MgbXVzdCBpbXBsZW1lbnQgb25lIG9mIHRoZQorICAgICAqIHtAbGluayAjY29uZmlndXJlKCl9IG9yIHtAbGluayAjY29uZmlndXJlRGVwbG95bWVudCgpfSBtZXRob2RzIGFyZSBpZ25vcmVkLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBQbGVhc2Ugbm90ZSB0aGF0IHdoZW4gdGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkLCByZWNvcmRpbmcgb2Ygc3RhcnR1cCBsb2dzIGFzIHdlbGwgYXMgY29uZmlndXJpbmcKKyAgICAgKiBvdGhlciB7QGNvZGUgSmVyc2V5VGVzdH0gcHJvcGVydGllcyBhbmQgZmVhdHVyZXMgbWF5IG5vdCB3b3JrIHByb3Blcmx5LiBXaGlsZSB1c2luZyB0aGlzIGNvbnN0cnVjdG9yCisgICAgICogc2hvdWxkIGdlbmVyYWxseSBiZSBhdm9pZGVkLCBpbiBjZXJ0YWluIHNjZW5hcmlvcyBpdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIHVzZSB0aGlzIGNvbnN0cnVjdG9yLgorICAgICAqIChFLmcuIHdoZW4gcnVubmluZyBwYXJhbWV0ZXJpemVkIHRlc3RzIGluIHdoaWNoIGFwcGxpY2F0aW9uIGlzIGNyZWF0ZWQgYmFzZWQgb24gdGVzdCBwYXJhbWV0ZXJzCisgICAgICogcGFzc2VkIGluIGJ5IEpVbml0IGZyYW1ld29yayB2aWEgdGVzdCBjb25zdHJ1Y3RvciAtIGluIHN1Y2ggY2FzZSBpdCBpcyBub3QgcG9zc2libGUgdG8gcHJvcGFnYXRlCisgICAgICogdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiB0byBvbmUgb2YgdGhlIG92ZXJyaWRkZW4ge0Bjb2RlIEplcnNleVRlc3QuY29uZmlndXJlLi4ufSBtZXRob2RzKS4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gamF4cnNBcHBsaWNhdGlvbiB0ZXN0ZWQgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHVibGljIEplcnNleVRlc3QoZmluYWwgQXBwbGljYXRpb24gamF4cnNBcHBsaWNhdGlvbikgeworICAgICAgICB0aGlzLmNvbnRleHQgPSBEZXBsb3ltZW50Q29udGV4dC5uZXdJbnN0YW5jZShqYXhyc0FwcGxpY2F0aW9uKTsKKyAgICAgICAgdGhpcy50ZXN0Q29udGFpbmVyRmFjdG9yeSA9IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGN1cnJlbnRseSB1c2VkIHRlc3QgY29udGFpbmVyIHRvIHJ1biB0aGUgdGVzdHMgaW4uIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuLgorICAgICAqCisgICAgICogQHJldHVybiBhIHRlc3QgY29udGFpbmVyIGluc3RhbmNlIG9yIHtAY29kZSBudWxsfSBpZiB0aGUgY29udGFpbmVyIGlzIG5vdCBzZXQuCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBUZXN0Q29udGFpbmVyIGdldFRlc3RDb250YWluZXIoKSB7CisgICAgICAgIHJldHVybiB0ZXN0Q29udGFpbmVyOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgb2xkIHRlc3QgY29udGFpbmVyIHVzZWQgdG8gcnVuIHRoZSB0ZXN0cyBpbiBhbmQgc2V0IGEgbmV3IG9uZS4gVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGVzdENvbnRhaW5lciBhIHRlc3QgY29udGFpbmVyIGluc3RhbmNlIG9yIHtAY29kZSBudWxsfSBpdCB0aGUgY3VycmVudCB0ZXN0IGNvbnRhaW5lciBzaG91bGQgYmUgcmVsZWFzZWQuCisgICAgICogQHJldHVybiBvbGQgdGVzdCBjb250YWluZXIgaW5zdGFuY2UuCisgICAgICovCisgICAgLyogcGFja2FnZSAqLyBUZXN0Q29udGFpbmVyIHNldFRlc3RDb250YWluZXIoZmluYWwgVGVzdENvbnRhaW5lciB0ZXN0Q29udGFpbmVyKSB7CisgICAgICAgIGZpbmFsIFRlc3RDb250YWluZXIgb2xkID0gdGhpcy50ZXN0Q29udGFpbmVyOworICAgICAgICB0aGlzLnRlc3RDb250YWluZXIgPSB0ZXN0Q29udGFpbmVyOworICAgICAgICByZXR1cm4gb2xkOworICAgIH0KKworICAgIHByaXZhdGUgVGVzdENvbnRhaW5lciBjcmVhdGVUZXN0Q29udGFpbmVyKGZpbmFsIERlcGxveW1lbnRDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkuY3JlYXRlKGdldEJhc2VVcmkoKSwgY29udGV4dCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvZ3JhbW1hdGljYWxseSBlbmFibGUgYSBmZWF0dXJlIHdpdGggYSBnaXZlbiBuYW1lLgorICAgICAqIEVuYWJsaW5nIG9mIHRoZSBmZWF0dXJlIG1heSBiZSBvdmVycmlkZGVuIHZpYSBhIHN5c3RlbSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmZWF0dXJlTmFtZSBuYW1lIG9mIHRoZSBlbmFibGVkIGZlYXR1cmUuCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgZW5hYmxlKGZpbmFsIFN0cmluZyBmZWF0dXJlTmFtZSkgeworICAgICAgICAvLyBUT0RPOiBwZXJoYXBzIHdlIGNvdWxkIHJldXNlIHRoZSByZXNvdXJjZSBjb25maWcgZm9yIHRoZSB0ZXN0IHByb3BlcnRpZXM/CisgICAgICAgIHByb3BlcnR5TWFwLnB1dChmZWF0dXJlTmFtZSwgQm9vbGVhbi5UUlVFLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2dyYW1tYXRpY2FsbHkgZGlzYWJsZSBhIGZlYXR1cmUgd2l0aCBhIGdpdmVuIG5hbWUuCisgICAgICogRGlzYWJsaW5nIG9mIHRoZSBmZWF0dXJlIG1heSBiZSBvdmVycmlkZGVuIHZpYSBhIHN5c3RlbSBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmZWF0dXJlTmFtZSBuYW1lIG9mIHRoZSBkaXNhYmxlZCBmZWF0dXJlLgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGRpc2FibGUoZmluYWwgU3RyaW5nIGZlYXR1cmVOYW1lKSB7CisgICAgICAgIHByb3BlcnR5TWFwLnB1dChmZWF0dXJlTmFtZSwgQm9vbGVhbi5GQUxTRS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm9ncmFtbWF0aWNhbGx5IGZvcmNlLWVuYWJsZSBhIGZlYXR1cmUgd2l0aCBhIGdpdmVuIG5hbWUuCisgICAgICogRm9yY2UtZW5hYmxpbmcgb2YgdGhlIGZlYXR1cmUgY2Fubm90IGJlIG92ZXJyaWRkZW4gdmlhIGEgc3lzdGVtIHByb3BlcnR5LgorICAgICAqIFVzZSB3aXRoIGNhcmUhCisgICAgICoKKyAgICAgKiBAcGFyYW0gZmVhdHVyZU5hbWUgbmFtZSBvZiB0aGUgZm9yY2UtZW5hYmxlZCBmZWF0dXJlLgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGZvcmNlRW5hYmxlKGZpbmFsIFN0cmluZyBmZWF0dXJlTmFtZSkgeworICAgICAgICBmb3JjZWRQcm9wZXJ0eU1hcC5wdXQoZmVhdHVyZU5hbWUsIEJvb2xlYW4uVFJVRS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcm9ncmFtbWF0aWNhbGx5IGZvcmNlLWRpc2FibGUgYSBmZWF0dXJlIHdpdGggYSBnaXZlbiBuYW1lLgorICAgICAqIEZvcmNlLWRpc2FibGluZyBvZiB0aGUgZmVhdHVyZSBjYW5ub3QgYmUgb3ZlcnJpZGRlbiB2aWEgYSBzeXN0ZW0gcHJvcGVydHkuCisgICAgICogVXNlIHdpdGggY2FyZSEKKyAgICAgKgorICAgICAqIEBwYXJhbSBmZWF0dXJlTmFtZSBuYW1lIG9mIHRoZSBmb3JjZS1kaXNhYmxlZCBmZWF0dXJlLgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGZvcmNlRGlzYWJsZShmaW5hbCBTdHJpbmcgZmVhdHVyZU5hbWUpIHsKKyAgICAgICAgZm9yY2VkUHJvcGVydHlNYXAucHV0KGZlYXR1cmVOYW1lLCBCb29sZWFuLkZBTFNFLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb2dyYW1tYXRpY2FsbHkgc2V0IGEgdmFsdWUgb2YgYSBwcm9wZXJ0eSB3aXRoIGEgZ2l2ZW4gbmFtZS4KKyAgICAgKiBUaGUgcHJvcGVydHkgdmFsdWUgbWF5IGJlIG92ZXJyaWRkZW4gdmlhIGEgc3lzdGVtIHByb3BlcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS4KKyAgICAgKiBAcGFyYW0gdmFsdWUgICAgICAgIHByb3BlcnR5IHZhbHVlLgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIHNldChmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lLCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgc2V0KHByb3BlcnR5TmFtZSwgdmFsdWUudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvZ3JhbW1hdGljYWxseSBzZXQgYSB2YWx1ZSBvZiBhIHByb3BlcnR5IHdpdGggYSBnaXZlbiBuYW1lLgorICAgICAqIFRoZSBwcm9wZXJ0eSB2YWx1ZSBtYXkgYmUgb3ZlcnJpZGRlbiB2aWEgYSBzeXN0ZW0gcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIG5hbWUgb2YgdGhlIHByb3BlcnR5LgorICAgICAqIEBwYXJhbSB2YWx1ZSAgICAgICAgcHJvcGVydHkgdmFsdWUuCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgc2V0KGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBwcm9wZXJ0eU1hcC5wdXQocHJvcGVydHlOYW1lLCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJvZ3JhbW1hdGljYWxseSBmb3JjZS1zZXQgYSB2YWx1ZSBvZiBhIHByb3BlcnR5IHdpdGggYSBnaXZlbiBuYW1lLgorICAgICAqIFRoZSBmb3JjZS1zZXQgcHJvcGVydHkgdmFsdWUgY2Fubm90IGJlIG92ZXJyaWRkZW4gdmlhIGEgc3lzdGVtIHByb3BlcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIHByb3BlcnR5TmFtZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eS4KKyAgICAgKiBAcGFyYW0gdmFsdWUgICAgICAgIHByb3BlcnR5IHZhbHVlLgorICAgICAqLworICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIGZvcmNlU2V0KGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICBmb3JjZWRQcm9wZXJ0eU1hcC5wdXQocHJvcGVydHlOYW1lLCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgaWYgdGhlIEplcnNleSB0ZXN0IGJvb2xlYW4gcHJvcGVydHkgKGZsYWcpIGhhcyBiZWVuIHNldCB0byB7QGNvZGUgdHJ1ZX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lIG5hbWUgb2YgdGhlIEplcnNleSB0ZXN0IGJvb2xlYW4gcHJvcGVydHkuCisgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHRlc3QgcHJvcGVydHkgaGFzIGJlZW4gZW5hYmxlZCwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaXNFbmFibGVkKGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKyAgICAgICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZihnZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRQcm9wZXJ0eShmaW5hbCBTdHJpbmcgcHJvcGVydHlOYW1lKSB7CisgICAgICAgIGlmIChmb3JjZWRQcm9wZXJ0eU1hcC5jb250YWluc0tleShwcm9wZXJ0eU5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gZm9yY2VkUHJvcGVydHlNYXAuZ2V0KHByb3BlcnR5TmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBQcm9wZXJ0aWVzIHN5c3RlbVByb3BlcnRpZXMgPSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChQcm9wZXJ0aWVzSGVscGVyLmdldFN5c3RlbVByb3BlcnRpZXMoKSk7CisgICAgICAgIGlmIChzeXN0ZW1Qcm9wZXJ0aWVzLmNvbnRhaW5zS2V5KHByb3BlcnR5TmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBzeXN0ZW1Qcm9wZXJ0aWVzLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJvcGVydHlNYXAuY29udGFpbnNLZXkocHJvcGVydHlOYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5TWFwLmdldChwcm9wZXJ0eU5hbWUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFN5c3RlbVByb3BlcnR5KGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKyAgICAgICAgZmluYWwgUHJvcGVydGllcyBzeXN0ZW1Qcm9wZXJ0aWVzID0gQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoUHJvcGVydGllc0hlbHBlci5nZXRTeXN0ZW1Qcm9wZXJ0aWVzKCkpOworICAgICAgICByZXR1cm4gc3lzdGVtUHJvcGVydGllcy5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSB0aGUgdGVzdGVkIEpBWC1SUyAvSmVyc2V5IGFwcGxpY2F0aW9uLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIG1heSBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMgdG8gcHJvdmlkZSB0aGUgY29uZmlndXJlZCBKQVgtUlMgL0plcnNleSBhcHBsaWNhdGlvbiB0byBiZSB0ZXN0ZWQuCisgICAgICogVGhlIG1ldGhvZCBtYXkgYmUgYWxzbyB1c2VkIHRvIGNvbmZpZ3VyZSB7QGNvZGUgSmVyc2V5VGVzdH0gaW5zdGFuY2UgcHJvcGVydGllcy4KKyAgICAgKiA8cD4KKyAgICAgKiBVbmxlc3Mge0BsaW5rICNjb25maWd1cmVEZXBsb3ltZW50KCl9IG1ldGhvZCBpcyBvdmVycmlkZGVuIGluIHRoZSBzdWJjbGFzcywgdGhlIHtAY29kZSBjb25maWd1cmUoKX0gbWV0aG9kIGlzIGludm9rZWQKKyAgICAgKiBieSB7QGNvZGUgY29uZmlndXJlRGVwbG95bWVudCgpfSB0byBjcmVhdGUgZGVmYXVsdCBkZXBsb3ltZW50IGNvbnRleHQgZm9yIHRoZSB0ZXN0ZWQgYXBwbGljYXRpb24uIEFzIHN1Y2gsIHRoZSBtZXRob2QKKyAgICAgKiBpcyBpbnZva2VkIGluIHRoZSBzY29wZSBvZiBvbmUgb2YgdGhlIHtAY29kZSBKZXJzZXlUZXN0fSBjb25zdHJ1Y3RvcnMuCisgICAgICogRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCB0aHJvd3Mge0BsaW5rIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufSwgc28gdGhhdCBjb25zdHJ1Y3Rpb24gb2YKKyAgICAgKiB7QGNvZGUgSmVyc2V5VGVzdH0gaW5zdGFuY2UgZmFpbHMgdW5sZXNzIG9uZSBvZiB0aGUge0Bjb2RlIGNvbmZpZ3VyZSgpfSBvciB7QGNvZGUgY29uZmlndXJlRGVwbG95bWVudCgpfSBtZXRob2RzIGlzCisgICAgICogb3ZlcnJpZGRlbiBpbiB0aGUgc3ViY2xhc3MuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIE5vdGUgdGhhdCBzaW5jZSB0aGUgbWV0aG9kIGlzIGludm9rZWQgZnJvbSB7QGNvZGUgSmVyc2V5VGVzdH0gY29uc3RydWN0b3IsIHRoZSBvdmVycmlkaW5nIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtZXRob2QKKyAgICAgKiBtdXN0IG5vdCBkZXBlbmQgb24gYW55IHN1YmNsYXNzIGZpZWxkcyBhcyB0aG9zZSB3aWxsIG5vdCBiZSBpbml0aWFsaXplZCB5ZXQgd2hlbiB0aGUgbWV0aG9kIGlzIGludm9rZWQuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIEFsc28gbm90ZSB0aGF0IGluIGNhc2UgdGhlIHtAbGluayAjSmVyc2V5VGVzdChqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uKX0gY29uc3RydWN0b3IgaXMgdXNlZCwgdGhlIG1ldGhvZCBpcyBuZXZlcgorICAgICAqIGludm9rZWQuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHJldHVybiB0ZXN0ZWQgSkFYLVJTIC9KZXJzZXkgYXBwbGljYXRpb24uCisgICAgICovCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGUgY29uZmlndXJlIG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHRoZSBleHRlbmRpbmcgY2xhc3MiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYW5kIGNvbmZpZ3VyZSBkZXBsb3ltZW50IGNvbnRleHQgZm9yIHRoZSB0ZXN0ZWQgYXBwbGljYXRpb24uCisgICAgICogPHA+CisgICAgICogVGhpcyBtZXRob2QgbWF5IGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3NlcyB0byBwcm92aWRlIGN1c3RvbSB0ZXN0IGNvbnRhaW5lciBkZXBsb3ltZW50IGNvbnRleHQgZm9yIHRoZSB0ZXN0ZWQKKyAgICAgKiBhcHBsaWNhdGlvbi4gVGhlIG1ldGhvZCBtYXkgYmUgYWxzbyB1c2VkIHRvIGNvbmZpZ3VyZSB7QGNvZGUgSmVyc2V5VGVzdH0gaW5zdGFuY2UgcHJvcGVydGllcy4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbWV0aG9kIGlzIGludm9rZWQgZnJvbSB7QGNvZGUgSmVyc2V5VGVzdH0gY29uc3RydWN0b3JzIHRvIHByb3ZpZGUgZGVwbG95bWVudCBjb250ZXh0IGZvciB0aGUgdGVzdGVkIGFwcGxpY2F0aW9uLgorICAgICAqIERlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QgY3JlYXRlcworICAgICAqIHtAbGluayBEZXBsb3ltZW50Q29udGV4dCNuZXdJbnN0YW5jZShqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uKSBuZXcgZGVwbG95bWVudCBjb250ZXh0fQorICAgICAqIHVzaW5nIEpBWC1SUyBhcHBsaWNhdGlvbiBpbnN0YW5jZSBvYnRhaW5lZCBieSBjYWxsaW5nIHRoZSB7QGxpbmsgI2NvbmZpZ3VyZSgpfSBtZXRob2QuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIE5vdGUgdGhhdCBzaW5jZSB0aGUgbWV0aG9kIGlzIGludm9rZWQgZnJvbSB7QGNvZGUgSmVyc2V5VGVzdH0gY29uc3RydWN0b3IsIHRoZSBvdmVycmlkaW5nIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtZXRob2QKKyAgICAgKiBtdXN0IG5vdCBkZXBlbmQgb24gYW55IHN1YmNsYXNzIGZpZWxkcyBhcyB0aG9zZSB3aWxsIG5vdCBiZSBpbml0aWFsaXplZCB5ZXQgd2hlbiB0aGUgbWV0aG9kIGlzIGludm9rZWQuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIEFsc28gbm90ZSB0aGF0IGluIGNhc2UgdGhlIHtAbGluayAjSmVyc2V5VGVzdChqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uKX0gY29uc3RydWN0b3IgaXMgdXNlZCwgdGhlIG1ldGhvZCBpcyBuZXZlcgorICAgICAqIGludm9rZWQuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHJldHVybiBjb25maWd1cmVkIGRlcGxveW1lbnQgY29udGV4dCBmb3IgdGhlIHRlc3RlZCBhcHBsaWNhdGlvbi4KKyAgICAgKiBAc2luY2UgMi44CisgICAgICovCisgICAgcHJvdGVjdGVkIERlcGxveW1lbnRDb250ZXh0IGNvbmZpZ3VyZURlcGxveW1lbnQoKSB7CisgICAgICAgIHJldHVybiBEZXBsb3ltZW50Q29udGV4dC5idWlsZGVyKGNvbmZpZ3VyZSgpKS5idWlsZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgVGVzdENvbnRhaW5lckZhY3Rvcnl9IGNsYXNzLgorICAgICAqIDxwPgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgb25seSBvbmNlIGR1cmluZyB7QGNvZGUgSmVyc2V5VGVzdH0gaW5zdGFuY2UgY29uc3RydWN0aW9uIHRvIHJldHJpZXZlIHRoZSBmYWN0b3J5IHJlc3BvbnNpYmxlCisgICAgICogZm9yIHByb3ZpZGluZyB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lcn0gdGhhdCB3aWxsIGJlIHVzZWQgdG8gZGVwbG95IHRoZSB0ZXN0ZWQgYXBwbGljYXRpb24uCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIEEgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmaXJzdCBzZWFyY2hlcyBmb3IgdGhlIHtAY29kZSBUZXN0Q29udGFpbmVyRmFjdG9yeX0gc2V0IHZpYQorICAgICAqIHtAbGluayAjSmVyc2V5VGVzdChvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeSkgY29uc3RydWN0b3J9LCB0aGVuIGl0IGxvb2tzIGZvciBhCisgICAgICoge0Bjb2RlIFRlc3RDb250YWluZXJGYWN0b3J5fSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBuYW1lIHNldCB2aWEKKyAgICAgKiA8dHQ+e0B2YWx1ZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzI0NPTlRBSU5FUl9GQUNUT1JZfTwvdHQ+IHN5c3RlbSBwcm9wZXJ0eSB3aXRoIGEgZmFsbGJhY2sgdG8KKyAgICAgKiBzZWFyY2hpbmcgZm9yIHtAY29kZSBUZXN0Q29udGFpbmVyRmFjdG9yeX0gc2VydmljZSBwcm92aWRlcnMgb24gdGhlIGNsYXNzIHBhdGguIEF0IGxhc3QsIGlmIG5vCisgICAgICoge0Bjb2RlIFRlc3RDb250YWluZXJGYWN0b3J5fSBoYXMgYmVlbiBmb3VuZCwgdGhlIG1ldGhvZCBhdHRlbXB0cyB0byBjcmVhdGUgbmV3IGRlZmF1bHQKKyAgICAgKiB7QGNvZGUgVGVzdENvbnRhaW5lckZhY3Rvcnl9IGltcGxlbWVudGF0aW9uIGluc3RhbmNlCisgICAgICogKDx0dD57QHZhbHVlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXMjREVGQVVMVF9DT05UQUlORVJfRkFDVE9SWX08L3R0PikuCisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIEFsdGVybmF0aXZlbHksIHRoaXMgbWV0aG9kIG1heSBiZSBvdmVycmlkZGVuIHRvIGRpcmVjdGx5IHByb3ZpZGUgYSBjdXN0b20ge0Bjb2RlIFRlc3RDb250YWluZXJGYWN0b3J5fSBpbnN0YW5jZS4KKyAgICAgKiBOb3RlIHRoYXQgc2luY2UgdGhlIG1ldGhvZCBpcyBpbnZva2VkIGZyb20ge0Bjb2RlIEplcnNleVRlc3R9IGNvbnN0cnVjdG9yLCB0aGUgb3ZlcnJpZGluZyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgbWV0aG9kCisgICAgICogbXVzdCBub3QgZGVwZW5kIG9uIGFueSBzdWJjbGFzcyBmaWVsZHMgYXMgdGhvc2Ugd2lsbCBub3QgYmUgaW5pdGlhbGl6ZWQgeWV0IHdoZW4gdGhlIG1ldGhvZCBpcyBpbnZva2VkLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYW4gaW5zdGFuY2Ugb2Yge0BsaW5rIFRlc3RDb250YWluZXJGYWN0b3J5fSBjbGFzcy4KKyAgICAgKiBAdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24gaWYgdGhlIGluaXRpYWxpemF0aW9uIG9mIHtAbGluayBUZXN0Q29udGFpbmVyRmFjdG9yeX0gaW5zdGFuY2UgaXMgbm90IHN1Y2Nlc3NmdWwuCisgICAgICovCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICBpZiAodGVzdENvbnRhaW5lckZhY3RvcnkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGVzdENvbnRhaW5lckZhY3RvcnkgPSBnZXREZWZhdWx0VGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGVzdENvbnRhaW5lckZhY3Rvcnk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgc3luY2hyb25pemVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldERlZmF1bHRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHsKKworICAgICAgICBpZiAoZGVmYXVsdFRlc3RDb250YWluZXJGYWN0b3J5Q2xhc3MgPT0gbnVsbCkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZhY3RvcnlDbGFzc05hbWUgPSBnZXRTeXN0ZW1Qcm9wZXJ0eShUZXN0UHJvcGVydGllcy5DT05UQUlORVJfRkFDVE9SWSk7CisgICAgICAgICAgICBpZiAoZmFjdG9yeUNsYXNzTmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5DT05GSUcsCisgICAgICAgICAgICAgICAgICAgICAgICAiTG9hZGluZyB0ZXN0IGNvbnRhaW5lciBmYWN0b3J5ICd7MH0nIHNwZWNpZmllZCBpbiB0aGUgJ3sxfScgc3lzdGVtIHByb3BlcnR5LiIsCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT2JqZWN0W10ge2ZhY3RvcnlDbGFzc05hbWUsIFRlc3RQcm9wZXJ0aWVzLkNPTlRBSU5FUl9GQUNUT1JZfSk7CisKKyAgICAgICAgICAgICAgICBkZWZhdWx0VGVzdENvbnRhaW5lckZhY3RvcnlDbGFzcyA9IGxvYWRGYWN0b3J5Q2xhc3MoZmFjdG9yeUNsYXNzTmFtZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZpbmFsIFRlc3RDb250YWluZXJGYWN0b3J5W10gZmFjdG9yaWVzID0gU2VydmljZUZpbmRlci5maW5kKFRlc3RDb250YWluZXJGYWN0b3J5LmNsYXNzKS50b0FycmF5KCk7CisgICAgICAgICAgICAgICAgaWYgKGZhY3Rvcmllcy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIG9ubHkgb25lIGZhY3RvcnkgaW5zdGFuY2UsIGp1c3QgcmV0dXJuIGl0CisgICAgICAgICAgICAgICAgICAgIGlmIChmYWN0b3JpZXMubGVuZ3RoID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhY2hlIHRoZSBjbGFzcyBmb3IgZnV0dXJlIHJldXNlCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VGVzdENvbnRhaW5lckZhY3RvcnlDbGFzcyA9IGZhY3Rvcmllc1swXS5nZXRDbGFzcygpOworICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGV2ZWwuQ09ORklHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVXNpbmcgdGhlIHNpbmdsZSBmb3VuZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBzZXJ2aWNlIHByb3ZpZGVyICd7MH0nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFRlc3RDb250YWluZXJGYWN0b3J5Q2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWN0b3JpZXNbMF07CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBpZiBkZWZhdWx0IGZhY3RvcnkgaXMgcHJlc2VudCwgdXNlIGl0LgorICAgICAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIFRlc3RDb250YWluZXJGYWN0b3J5IHRjZiA6IGZhY3RvcmllcykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFRlc3RQcm9wZXJ0aWVzLkRFRkFVTFRfQ09OVEFJTkVSX0ZBQ1RPUlkuZXF1YWxzKHRjZi5nZXRDbGFzcygpLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYWNoZSB0aGUgY2xhc3MgZm9yIGZ1dHVyZSByZXVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRUZXN0Q29udGFpbmVyRmFjdG9yeUNsYXNzID0gdGNmLmdldENsYXNzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExldmVsLkNPTkZJRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGb3VuZCBtdWx0aXBsZSBUZXN0Q29udGFpbmVyRmFjdG9yeSBzZXJ2aWNlIHByb3ZpZGVycywgdXNpbmcgdGhlIGRlZmF1bHQgZm91bmQgJ3swfSciLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdFByb3BlcnRpZXMuREVGQVVMVF9DT05UQUlORVJfRkFDVE9SWSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRjZjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgZmFjdG9yeSBpcyBub3QgaW4gdGhlIGxpc3QgLSBsb2cgd2FybmluZyBhbmQgcmV0dXJuIHRoZSBmaXJzdCBmb3VuZCBmYWN0b3J5IGluc3RhbmNlCisgICAgICAgICAgICAgICAgICAgIC8vIGNhY2hlIHRoZSBjbGFzcyBmb3IgZnV0dXJlIHJldXNlCisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRUZXN0Q29udGFpbmVyRmFjdG9yeUNsYXNzID0gZmFjdG9yaWVzWzBdLmdldENsYXNzKCk7CisgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRm91bmQgbXVsdGlwbGUgVGVzdENvbnRhaW5lckZhY3Rvcnkgc2VydmljZSBwcm92aWRlcnMsIHVzaW5nIHRoZSBmaXJzdCBmb3VuZCAnezB9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFRlc3RDb250YWluZXJGYWN0b3J5Q2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhY3Rvcmllc1swXTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBMT0dHRVIubG9nKAorICAgICAgICAgICAgICAgICAgICAgICAgTGV2ZWwuQ09ORklHLAorICAgICAgICAgICAgICAgICAgICAgICAgIk5vIFRlc3RDb250YWluZXJGYWN0b3J5IGNvbmZpZ3VyZWQsIHRyeWluZyB0byBsb2FkIGFuZCBpbnN0YW50aWF0ZSB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiAnezB9JyIsCisgICAgICAgICAgICAgICAgICAgICAgICBUZXN0UHJvcGVydGllcy5ERUZBVUxUX0NPTlRBSU5FUl9GQUNUT1JZKTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0VGVzdENvbnRhaW5lckZhY3RvcnlDbGFzcyA9IGxvYWRGYWN0b3J5Q2xhc3MoVGVzdFByb3BlcnRpZXMuREVGQVVMVF9DT05UQUlORVJfRkFDVE9SWSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRUZXN0Q29udGFpbmVyRmFjdG9yeUNsYXNzLm5ld0luc3RhbmNlKCk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRlc3RDb250YWluZXJFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBpbnN0YW50aWF0ZSB0ZXN0IGNvbnRhaW5lciBmYWN0b3J5ICclcyciLCBkZWZhdWx0VGVzdENvbnRhaW5lckZhY3RvcnlDbGFzcy5nZXROYW1lKCkpLCBleCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBDbGFzczw/IGV4dGVuZHMgVGVzdENvbnRhaW5lckZhY3Rvcnk+IGxvYWRGYWN0b3J5Q2xhc3MoZmluYWwgU3RyaW5nIGZhY3RvcnlDbGFzc05hbWUpIHsKKyAgICAgICAgQ2xhc3M8PyBleHRlbmRzIFRlc3RDb250YWluZXJGYWN0b3J5PiBmYWN0b3J5Q2xhc3M7CisgICAgICAgIGZpbmFsIENsYXNzPE9iamVjdD4gbG9hZGVkQ2xhc3MgPSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChSZWZsZWN0aW9uSGVscGVyLmNsYXNzRm9yTmFtZVBBKGZhY3RvcnlDbGFzc05hbWUsIG51bGwpKTsKKyAgICAgICAgaWYgKGxvYWRlZENsYXNzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICJUZXN0IGNvbnRhaW5lciBmYWN0b3J5IGNsYXNzICclcycgY2Fubm90IGJlIGxvYWRlZCIsIGZhY3RvcnlDbGFzc05hbWUpKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGxvYWRlZENsYXNzLmFzU3ViY2xhc3MoVGVzdENvbnRhaW5lckZhY3RvcnkuY2xhc3MpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBDbGFzc0Nhc3RFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICJDbGFzcyAnJXMnIGRvZXMgbm90IGltcGxlbWVudCBUZXN0Q29udGFpbmVyRmFjdG9yeSBTUEkuIiwgZmFjdG9yeUNsYXNzTmFtZSksIGV4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIEpBWC1SUyB3ZWIgdGFyZ2V0IHdob3NlIFVSSSByZWZlcnMgdG8gdGhlIHtAbGluayAjZ2V0QmFzZVVyaSgpIGJhc2UgVVJJfSB0aGUgdGVzdGVkCisgICAgICogSkFYLVJTIC8gSmVyc2V5IGFwcGxpY2F0aW9uIGlzIGRlcGxveWVkIGF0LCBwbHVzIHRoZSBwYXRoIHNwZWNpZmllZCBpbiB0aGUge0Bjb2RlIHBhdGh9IGFyZ3VtZW50LgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGFuIGVxdWl2YWxlbnQgb2YgY2FsbGluZyA8dHQ+Y2xpZW50KCkudGFyZ2V0KGdldEJhc2VVcmkoKSk8L3R0Pi4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjcmVhdGVkIEpBWC1SUyB3ZWIgdGFyZ2V0LgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0KCkgeworICAgICAgICByZXR1cm4gY2xpZW50KCkudGFyZ2V0KGdldFRlc3RDb250YWluZXIoKS5nZXRCYXNlVXJpKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIEpBWC1SUyB3ZWIgdGFyZ2V0IHdob3NlIFVSSSByZWZlcnMgdG8gdGhlIHtAbGluayAjZ2V0QmFzZVVyaSgpIGJhc2UgVVJJfSB0aGUgdGVzdGVkCisgICAgICogSkFYLVJTIC8gSmVyc2V5IGFwcGxpY2F0aW9uIGlzIGRlcGxveWVkIGF0LCBwbHVzIHRoZSBwYXRoIHNwZWNpZmllZCBpbiB0aGUge0Bjb2RlIHBhdGh9IGFyZ3VtZW50LgorICAgICAqIDxwPgorICAgICAqIFRoaXMgbWV0aG9kIGlzIGFuIGVxdWl2YWxlbnQgb2YgY2FsbGluZyB7QGNvZGUgdGFyZ2V0KCkucGF0aChwYXRoKX0uCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggcmVsYXRpdmUgcGF0aCAoZnJvbSB0ZXN0ZWQgYXBwbGljYXRpb24gYmFzZSBVUkkpIHRoaXMgd2ViIHRhcmdldCBzaG91bGQgcG9pbnQgdG8uCisgICAgICogQHJldHVybiB0aGUgY3JlYXRlZCBKQVgtUlMgd2ViIHRhcmdldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgZmluYWwgV2ViVGFyZ2V0IHRhcmdldChmaW5hbCBTdHJpbmcgcGF0aCkgeworICAgICAgICByZXR1cm4gdGFyZ2V0KCkucGF0aChwYXRoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIEpBWC1SUyB0ZXN0IGNsaWVudCB0aGF0IGlzIHtAbGluayAjY29uZmlndXJlQ2xpZW50KG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWcpIHByZS1jb25maWd1cmVkfQorICAgICAqIGZvciB0aGlzIHRlc3QuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjb25maWd1cmVkIHRlc3QgY2xpZW50LgorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCBDbGllbnQgY2xpZW50KCkgeworICAgICAgICByZXR1cm4gZ2V0Q2xpZW50KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHVwIHRoZSB0ZXN0IGJ5IGNyZWF0aW5nIGEgdGVzdCBjb250YWluZXIgaW5zdGFuY2UsIHtAbGluayBUZXN0Q29udGFpbmVyI3N0YXJ0KCkgc3RhcnRpbmd9IGl0IGFuZCBieSBjcmVhdGluZyBhIG5ldworICAgICAqIHtAbGluayAjY29uZmlndXJlQ2xpZW50KG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWcpIHByZS1jb25maWd1cmVkfSB0ZXN0IGNsaWVudC4KKyAgICAgKiBUaGUgdGVzdCBjb250YWluZXIgaXMgb2J0YWluZWQgZnJvbSB0aGUge0BsaW5rICNnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRlc3QgY29udGFpbmVyIGZhY3Rvcnl9LgorICAgICAqCisgICAgICogQHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIGlmIHRoZSBkZWZhdWx0IHRlc3QgY29udGFpbmVyIGZhY3RvcnkgY2Fubm90IGJlIG9idGFpbmVkLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciB0aGUgdGVzdCBhcHBsaWNhdGlvbiBkZXBsb3ltZW50IGNvbnRleHQgaXMgbm90IHN1cHBvcnRlZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieSB0aGUgdGVzdCBjb250YWluZXIgZmFjdG9yeS4KKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiAgICAgICAgICAgICAgaWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgc2V0dGluZyB1cCB0aGUgdGVzdCBlbnZpcm9ubWVudC4KKyAgICAgKi8KKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGlzTG9nUmVjb3JkaW5nRW5hYmxlZCgpKSB7CisgICAgICAgICAgICByZWdpc3RlckxvZ0hhbmRsZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFRlc3RDb250YWluZXIgdGVzdENvbnRhaW5lciA9IGNyZWF0ZVRlc3RDb250YWluZXIoY29udGV4dCk7CisKKyAgICAgICAgLy8gU2V0IGN1cnJlbnQgaW5zdGFuY2Ugb2YgdGVzdCBjb250YWluZXIgYW5kIHN0YXJ0IGl0LgorICAgICAgICBzZXRUZXN0Q29udGFpbmVyKHRlc3RDb250YWluZXIpOworICAgICAgICB0ZXN0Q29udGFpbmVyLnN0YXJ0KCk7CisKKyAgICAgICAgLy8gQ3JlYXRlIGFuIHNldCBuZXcgY2xpZW50LgorICAgICAgICBzZXRDbGllbnQoZ2V0Q2xpZW50KHRlc3RDb250YWluZXIuZ2V0Q2xpZW50Q29uZmlnKCkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZWFyIGRvd24gdGhlIHRlc3QgYnkge0BsaW5rIFRlc3RDb250YWluZXIjc3RvcCgpIHN0b3BwaW5nfSB0aGUgdGVzdCBjb250YWluZXIgb2J0YWluZWQgZnJvbSB0aGUKKyAgICAgKiB7QGxpbmsgI2dldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGVzdCBjb250YWluZXIgZmFjdG9yeX0gYW5kIGJ5IHtAbGluayBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50I2Nsb3NlKCkgY2xvc2luZ30KKyAgICAgKiBhbmQgZGlzY2FyZGluZyB0aGUge0BsaW5rICNjb25maWd1cmVDbGllbnQob3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZykgcHJlLWNvbmZpZ3VyZWR9IHRlc3QgY2xpZW50CisgICAgICogdGhhdCB3YXMge0BsaW5rICNzZXRVcCgpIHNldCB1cH0gZm9yIHRoZSB0ZXN0LgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24gaWYgYW4gZXhjZXB0aW9uIGlzIHRocm93biBkdXJpbmcgdGVhcmluZyBkb3duIHRoZSB0ZXN0IGVudmlyb25tZW50LgorICAgICAqLworICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChpc0xvZ1JlY29yZGluZ0VuYWJsZWQoKSkgeworICAgICAgICAgICAgdW5yZWdpc3RlckxvZ0hhbmRsZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUZXN0Q29udGFpbmVyIG9sZENvbnRhaW5lciA9IHNldFRlc3RDb250YWluZXIobnVsbCk7CisgICAgICAgICAgICBpZiAob2xkQ29udGFpbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBvbGRDb250YWluZXIuc3RvcCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgY2xvc2VJZk5vdE51bGwoc2V0Q2xpZW50KG51bGwpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgSkFYLVJTIHRlc3QgY2xpZW50IHRoYXQgaXMge0BsaW5rICNjb25maWd1cmVDbGllbnQob3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZykgcHJlLWNvbmZpZ3VyZWR9CisgICAgICogZm9yIHRoaXMgdGVzdC4gVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBjb25maWd1cmVkIHRlc3QgY2xpZW50LgorICAgICAqLworICAgIHByb3RlY3RlZCBDbGllbnQgZ2V0Q2xpZW50KCkgeworICAgICAgICByZXR1cm4gY2xpZW50LmdldCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgb2xkIEpBWC1SUyB0ZXN0IGNsaWVudCBhbmQgc2V0IGEgbmV3IG9uZS4gVGhpcyBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xpZW50IHRoZSBjb25maWd1cmVkIHRlc3QgY2xpZW50LgorICAgICAqIEByZXR1cm4gb2xkIGNvbmZpZ3VyZWQgdGVzdCBjbGllbnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIENsaWVudCBzZXRDbGllbnQoZmluYWwgQ2xpZW50IGNsaWVudCkgeworICAgICAgICByZXR1cm4gdGhpcy5jbGllbnQuZ2V0QW5kU2V0KGNsaWVudCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIHRlc3Qge0BsaW5rIENsaWVudH0gdXNpbmcgdGhlIGNsaWVudCBjb25maWd1cmF0aW9uIHByb3ZpZGVkIGJ5IHRoZSBjb25maWd1cmVkCisgICAgICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJ9LgorICAgICAqIDxwPgorICAgICAqIElmIHRoZSB7QGNvZGUgVGVzdENvbnRhaW5lcn0gZG9lcyBub3QgcHJvdmlkZSBhbnkgY2xpZW50IGNvbmZpZ3VyYXRpb24gKHBhc3NlZCB7QGNvZGUgY2xpZW50Q29uZmlnfSBpcyB7QGNvZGUgbnVsbH0pLAorICAgICAqIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGZpcnN0IGNyZWF0ZXMgYW4gZW1wdHkgbmV3IHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnfQorICAgICAqIGluc3RhbmNlLiBUaGUgY2xpZW50IGNvbmZpZ3VyYXRpb24gKHByb3ZpZGVkIGJ5IHRlc3QgY29udGFpbmVyIG9yIGNyZWF0ZWQpIGlzIHRoZW4gcGFzc2VkIHRvCisgICAgICoge0BsaW5rICNjb25maWd1cmVDbGllbnQob3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZyl9IHdoaWNoIGNhbiBiZSBvdmVycmlkZGVuIGluIHRoZSB7QGNvZGUgSmVyc2V5VGVzdH0KKyAgICAgKiBzdWJjbGFzcyB0byBwcm92aWRlIGN1c3RvbSBjbGllbnQgY29uZmlndXJhdGlvbi4gQXQgbGFzdCwgbmV3IEpBWC1SUyB7QGxpbmsgQ2xpZW50fSBpbnN0YW5jZSBpcyBjcmVhdGVkIGJhc2VkIG9uIHRoZQorICAgICAqIHJlc3VsdGluZyBjbGllbnQgY29uZmlndXJhdGlvbi4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xpZW50Q29uZmlnIHRlc3QgY2xpZW50IGRlZmF1bHQgY29uZmlndXJhdGlvbi4gTWF5IGJlIHtAY29kZSBudWxsfS4KKyAgICAgKiBAcmV0dXJuIEEgQ2xpZW50IGluc3RhbmNlLgorICAgICAqLworICAgIHByaXZhdGUgQ2xpZW50IGdldENsaWVudChDbGllbnRDb25maWcgY2xpZW50Q29uZmlnKSB7CisgICAgICAgIGlmIChjbGllbnRDb25maWcgPT0gbnVsbCkgeworICAgICAgICAgICAgY2xpZW50Q29uZmlnID0gbmV3IENsaWVudENvbmZpZygpOworICAgICAgICB9CisKKyAgICAgICAgLy9jaGVjayBpZiBsb2dnaW5nIGlzIHJlcXVpcmVkCisgICAgICAgIGlmIChpc0VuYWJsZWQoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpKSB7CisgICAgICAgICAgICBjbGllbnRDb25maWcucmVnaXN0ZXIobmV3IExvZ2dpbmdGZWF0dXJlKExPR0dFUiwgaXNFbmFibGVkKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKQorICAgICAgICAgICAgICAgICAgICA/IExvZ2dpbmdGZWF0dXJlLlZlcmJvc2l0eS5QQVlMT0FEX0FOWQorICAgICAgICAgICAgICAgICAgICA6IExvZ2dpbmdGZWF0dXJlLlZlcmJvc2l0eS5IRUFERVJTX09OTFkpKTsKKworICAgICAgICB9CisKKyAgICAgICAgY29uZmlndXJlQ2xpZW50KGNsaWVudENvbmZpZyk7CisKKyAgICAgICAgcmV0dXJuIENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KGNsaWVudENvbmZpZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uZmlndXJlIHRoZSB0ZXN0IGNsaWVudC4KKyAgICAgKiA8cD4KKyAgICAgKiBUaGUgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHtAY29kZSBKZXJzZXlUZXN0fSBzdWJjbGFzc2VzIHRvIGNvbnZlbmllbnRseSBjb25maWd1cmUgdGhlIHRlc3QgY2xpZW50IGluc3RhbmNlCisgICAgICogdXNlZCBieSBKZXJzZXkgdGVzdCBmcmFtZXdvcmsgKGVpdGhlciByZXR1cm5lZCBmcm9tIHtAbGluayAjY2xpZW50KCl9IG1ldGhvZCBvciB1c2VkIHRvIGNyZWF0ZQorICAgICAqIHtAbGluayBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0fSBpbnN0YW5jZXMgcmV0dXJuZWQgZnJvbSBvbmUgb2YgdGhlIHtAY29kZSB0YXJnZXR9IG1ldGhvZHMKKyAgICAgKiAoe0BsaW5rICN0YXJnZXQoKX0gb3Ige0BsaW5rICN0YXJnZXQoU3RyaW5nKX0pLgorICAgICAqIDxwPgorICAgICAqIFByaW9yIHRvIGV2ZXJ5IHRlc3QgbWV0aG9kIHJ1biwgYSBuZXcgY2xpZW50IGluc3RhbmNlIGlzIGNvbmZpZ3VyZWQgYW5kIGNyZWF0ZWQgdXNpbmcgdGhlIGNsaWVudCBjb25maWd1cmF0aW9uCisgICAgICogcHJvdmlkZWQgYnkgdGhlIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyfSBhcyB3ZWxsIGFzIGFueSBpbnRlcm5hbCB7QGNvZGUgSmVyc2V5VGVzdH0KKyAgICAgKiBjbGllbnQgY29uZmlndXJhdGlvbiBzZXR0aW5ncy4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogQmVmb3JlIHRoZSBhY3R1YWwgY2xpZW50IGluc3RhbmNlIGNyZWF0aW9uLCBKZXJzZXkgdGVzdCBmcmFtZXdvcmsgaW52b2tlcyB0aGlzIG1ldGhvZCBpbiBvcmRlciB0byBhbGxvdyB0aGUgc3ViY2xhc3NlcworICAgICAqIHRvIGZ1cnRoZXIgY3VzdG9taXplIGNyZWF0ZWQgY2xpZW50IGluc3RhbmNlLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBBZnRlciBlYWNoIHRlc3QgbWV0aG9kIGlzIHJ1biwgdGhlIGV4aXN0aW5nIGNsaWVudCBpbnN0YW5jZSBpcyB7QGxpbmsgamF2YXgud3MucnMuY2xpZW50LkNsaWVudCNjbG9zZSgpIGNsb3NlZH0KKyAgICAgKiBhbmQgZGlzY2FyZGVkLgorICAgICAqIDwvcD4KKyAgICAgKiA8cD4KKyAgICAgKiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBtZXRob2QgaXMgIm5vLW9wIi4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gY29uZmlnIEplcnNleSB0ZXN0IGNsaWVudCBjb25maWd1cmF0aW9uIHRoYXQgY2FuIGJlIG1vZGlmaWVkIGJlZm9yZSB0aGUgY2xpZW50IGlzIGNyZWF0ZWQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KGZpbmFsIENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgLy8gZG8gbm90aGluZworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGJhc2UgVVJJIG9mIHRoZSB0ZXN0ZWQgYXBwbGljYXRpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBiYXNlIFVSSSBvZiB0aGUgdGVzdGVkIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIC8vIFRPRE8gbWFrZSBmaW5hbAorICAgIHByb3RlY3RlZCBVUkkgZ2V0QmFzZVVyaSgpIHsKKyAgICAgICAgZmluYWwgVGVzdENvbnRhaW5lciBjb250YWluZXIgPSBnZXRUZXN0Q29udGFpbmVyKCk7CisKKyAgICAgICAgaWYgKGNvbnRhaW5lciAhPSBudWxsKSB7CisgICAgICAgICAgICAvLyBjYWxsZWQgZnJvbSBvdXRzaWRlIG9mIEplcnNleVRlc3QgY29uc3RydWN0b3IKKyAgICAgICAgICAgIHJldHVybiBjb250YWluZXIuZ2V0QmFzZVVyaSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gY2FsbGVkIGZyb20gd2l0aGluIEplcnNleVRlc3QgY29uc3RydWN0b3IKKyAgICAgICAgcmV0dXJuIFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdC8iKS5wb3J0KGdldFBvcnQoKSkuYnVpbGQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHBvcnQgdG8gYmUgdXNlZCBmb3IgdGVzdCBhcHBsaWNhdGlvbiBkZXBsb3ltZW50cy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIEhUVFAgcG9ydCBvZiB0aGUgVVJJCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIGludCBnZXRQb3J0KCkgeworICAgICAgICBmaW5hbCBUZXN0Q29udGFpbmVyIGNvbnRhaW5lciA9IGdldFRlc3RDb250YWluZXIoKTsKKworICAgICAgICBpZiAoY29udGFpbmVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIGNhbGxlZCBmcm9tIG91dHNpZGUgb2YgSmVyc2V5VGVzdCBjb25zdHJ1Y3RvcgorICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lci5nZXRCYXNlVXJpKCkuZ2V0UG9ydCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gY2FsbGVkIGZyb20gd2l0aGluIEplcnNleVRlc3QgY29uc3RydWN0b3IKKyAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlID0gZ2V0UHJvcGVydHkoVGVzdFByb3BlcnRpZXMuQ09OVEFJTkVSX1BPUlQpOworICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgeworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCBpID0gSW50ZWdlci5wYXJzZUludCh2YWx1ZSk7CisgICAgICAgICAgICAgICAgaWYgKGkgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oIlZhbHVlIG5vdCBwb3NpdGl2ZS4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuQ09ORklHLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZhbHVlIG9mICIgKyBUZXN0UHJvcGVydGllcy5DT05UQUlORVJfUE9SVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgcHJvcGVydHkgaXMgbm90IGEgdmFsaWQgcG9zaXRpdmUgaW50ZWdlciBbIiArIHZhbHVlICsgIl0uIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgUmV2ZXJ0aW5nIHRvIGRlZmF1bHQgWyIgKyBUZXN0UHJvcGVydGllcy5ERUZBVUxUX0NPTlRBSU5FUl9QT1JUICsgIl0uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGUKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBUZXN0UHJvcGVydGllcy5ERUZBVUxUX0NPTlRBSU5FUl9QT1JUOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBzdG9yZWQge0BsaW5rIExvZ1JlY29yZCBsb2cgcmVjb3Jkc30gaWYgZW5hYmxlZCBieSBzZXR0aW5nIHtAbGluayBUZXN0UHJvcGVydGllcyNSRUNPUkRfTE9HX0xFVkVMfSBvciBhbiBlbXB0eSBsaXN0LgorICAgICAqCisgICAgICogQHJldHVybiBsaXN0IG9mIGxvZyByZWNvcmRzIG9yIGFuIGVtcHR5IGxpc3QuCisgICAgICovCisgICAgcHJvdGVjdGVkIGZpbmFsIExpc3Q8TG9nUmVjb3JkPiBnZXRMb2dnZWRSZWNvcmRzKCkgeworICAgICAgICByZXR1cm4gZ2V0TG9nSGFuZGxlcigpLmdldFJlY29yZHMoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgbGFzdCBzdG9yZWQge0BsaW5rIExvZ1JlY29yZCBsb2cgcmVjb3JkfSBpZiBlbmFibGVkIGJ5IHNldHRpbmcge0BsaW5rIFRlc3RQcm9wZXJ0aWVzI1JFQ09SRF9MT0dfTEVWRUx9CisgICAgICogb3Ige0Bjb2RlIG51bGx9LgorICAgICAqCisgICAgICogQHJldHVybiBsYXN0IHN0b3JlZCB7QGxpbmsgTG9nUmVjb3JkIGxvZyByZWNvcmR9IG9yIHtAY29kZSBudWxsfS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgZmluYWwgTG9nUmVjb3JkIGdldExhc3RMb2dnZWRSZWNvcmQoKSB7CisgICAgICAgIGZpbmFsIExpc3Q8TG9nUmVjb3JkPiBsb2dnZWRSZWNvcmRzID0gZ2V0TG9nZ2VkUmVjb3JkcygpOworICAgICAgICByZXR1cm4gbG9nZ2VkUmVjb3Jkcy5pc0VtcHR5KCkgPyBudWxsIDogbG9nZ2VkUmVjb3Jkcy5nZXQobG9nZ2VkUmVjb3Jkcy5zaXplKCkgLSAxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgYSBsaXN0IG9mIHJvb3QgbG9nZ2Vycy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbGlzdCBvZiByb290IGxvZ2dlcnMuCisgICAgICovCisgICAgcHJpdmF0ZSBTZXQ8TG9nZ2VyPiBnZXRSb290TG9nZ2VycygpIHsKKyAgICAgICAgZmluYWwgTG9nTWFuYWdlciBsb2dNYW5hZ2VyID0gTG9nTWFuYWdlci5nZXRMb2dNYW5hZ2VyKCk7CisgICAgICAgIGZpbmFsIEVudW1lcmF0aW9uPFN0cmluZz4gbG9nZ2VyTmFtZXMgPSBsb2dNYW5hZ2VyLmdldExvZ2dlck5hbWVzKCk7CisKKyAgICAgICAgZmluYWwgU2V0PExvZ2dlcj4gcm9vdExvZ2dlcnMgPSBuZXcgSGFzaFNldDw+KCk7CisKKyAgICAgICAgd2hpbGUgKGxvZ2dlck5hbWVzLmhhc01vcmVFbGVtZW50cygpKSB7CisgICAgICAgICAgICBMb2dnZXIgbG9nZ2VyID0gbG9nTWFuYWdlci5nZXRMb2dnZXIobG9nZ2VyTmFtZXMubmV4dEVsZW1lbnQoKSk7CisgICAgICAgICAgICBpZiAobG9nZ2VyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAobG9nZ2VyLmdldFBhcmVudCgpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nZ2VyID0gbG9nZ2VyLmdldFBhcmVudCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByb290TG9nZ2Vycy5hZGQobG9nZ2VyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByb290TG9nZ2VyczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciB7QGxpbmsgSGFuZGxlciBsb2cgaGFuZGxlcn0gdG8gdGhlIGxpc3Qgb2Ygcm9vdCBsb2dnZXJzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCByZWdpc3RlckxvZ0hhbmRsZXIoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyByZWNvcmRMb2dMZXZlbCA9IGdldFByb3BlcnR5KFRlc3RQcm9wZXJ0aWVzLlJFQ09SRF9MT0dfTEVWRUwpOworICAgICAgICBmaW5hbCBpbnQgcmVjb3JkTG9nTGV2ZWxJbnQgPSBJbnRlZ2VyLnZhbHVlT2YocmVjb3JkTG9nTGV2ZWwpOworICAgICAgICBmaW5hbCBMZXZlbCBsZXZlbCA9IExldmVsLnBhcnNlKHJlY29yZExvZ0xldmVsKTsKKworICAgICAgICBsb2dMZXZlbE1hcC5jbGVhcigpOworCisgICAgICAgIGZvciAoZmluYWwgTG9nZ2VyIHJvb3QgOiBnZXRSb290TG9nZ2VycygpKSB7CisgICAgICAgICAgICBsb2dMZXZlbE1hcC5wdXQocm9vdCwgcm9vdC5nZXRMZXZlbCgpKTsKKworICAgICAgICAgICAgaWYgKHJvb3QuZ2V0TGV2ZWwoKS5pbnRWYWx1ZSgpID4gcmVjb3JkTG9nTGV2ZWxJbnQpIHsKKyAgICAgICAgICAgICAgICByb290LnNldExldmVsKGxldmVsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcm9vdC5hZGRIYW5kbGVyKGdldExvZ0hhbmRsZXIoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVbi1yZWdpc3RlciB7QGxpbmsgSGFuZGxlciBsb2cgaGFuZGxlcn0gZnJvbSB0aGUgbGlzdCBvZiByb290IGxvZ2dlcnMuCisgICAgICovCisgICAgcHJpdmF0ZSB2b2lkIHVucmVnaXN0ZXJMb2dIYW5kbGVyKCkgeworICAgICAgICBmb3IgKGZpbmFsIExvZ2dlciByb290IDogZ2V0Um9vdExvZ2dlcnMoKSkgeworICAgICAgICAgICAgcm9vdC5zZXRMZXZlbChsb2dMZXZlbE1hcC5nZXQocm9vdCkpOworICAgICAgICAgICAgcm9vdC5yZW1vdmVIYW5kbGVyKGdldExvZ0hhbmRsZXIoKSk7CisgICAgICAgIH0KKyAgICAgICAgbG9nSGFuZGxlciA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHtAY29kZSB0cnVlfSBpZiBsb2cgcmVjb2RpbmcgaXMgZW5hYmxlZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIGxvZyByZWNvZGluZyBpcyBlbmFibGVkLCB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBwcml2YXRlIGJvb2xlYW4gaXNMb2dSZWNvcmRpbmdFbmFibGVkKCkgeworICAgICAgICByZXR1cm4gZ2V0UHJvcGVydHkoVGVzdFByb3BlcnRpZXMuUkVDT1JEX0xPR19MRVZFTCkgIT0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMge0BsaW5rIEhhbmRsZXIgbG9nIGhhbmRsZXJ9IGNhcGFibGUgb2Ygc3RvcmluZyB7QGxpbmsgTG9nUmVjb3JkIGxvZ2dlZCByZWNvcmRzfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbG9nIGhhbmRsZXIuCisgICAgICovCisgICAgcHJpdmF0ZSBKZXJzZXlUZXN0TG9nSGFuZGxlciBnZXRMb2dIYW5kbGVyKCkgeworICAgICAgICBpZiAobG9nSGFuZGxlciA9PSBudWxsKSB7CisgICAgICAgICAgICBsb2dIYW5kbGVyID0gbmV3IEplcnNleVRlc3RMb2dIYW5kbGVyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxvZ0hhbmRsZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB7QGxpbmsgVGVzdFByb3BlcnRpZXMjQVNZTkNfVElNRU9VVF9NVUxUSVBMSUVSfSBvciB7QGNvZGUgMX0gaWYgdGhlIHByb3BlcnR5IGlzIG5vdCBkZWZpbmVkLgorICAgICAqCisgICAgICogQHJldHVybiBNdWx0aXBsaWVyIG9mIHRoZSBhc3luYyB0aW1lb3V0IGZvciBhc3luYyB0ZXN0LgorICAgICAqLworICAgIHByb3RlY3RlZCBpbnQgZ2V0QXN5bmNUaW1lb3V0TXVsdGlwbGllcigpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHByb3BlcnR5ID0gZ2V0UHJvcGVydHkoVGVzdFByb3BlcnRpZXMuQVNZTkNfVElNRU9VVF9NVUxUSVBMSUVSKTsKKyAgICAgICAgSW50ZWdlciBtdWx0aSA9IDE7CisgICAgICAgIGlmIChwcm9wZXJ0eSAhPSBudWxsKSB7CisgICAgICAgICAgICBtdWx0aSA9IEludGVnZXIudmFsdWVPZihwcm9wZXJ0eSk7CisgICAgICAgICAgICBpZiAobXVsdGkgPD0gMCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAiUHJvcGVydHkgIiArIFRlc3RQcm9wZXJ0aWVzLkFTWU5DX1RJTUVPVVRfTVVMVElQTElFUiArICIgbXVzdCBiZSBhIG51bWJlciBncmVhdGVyIHRoYW4gMC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbXVsdGk7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IG1ldGhvZCB0aGF0IHNhZmVseSBjbG9zZXMgYSByZXNwb25zZSB3aXRob3V0IHRocm93aW5nIGFuIGV4Y2VwdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNwb25zZXMgcmVzcG9uc2VzIHRvIGNsb3NlLiBFYWNoIHJlc3BvbnNlIG1heSBiZSB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIDIuNQorICAgICAqLworICAgIHB1YmxpYyBmaW5hbCB2b2lkIGNsb3NlKGZpbmFsIFJlc3BvbnNlLi4uIHJlc3BvbnNlcykgeworICAgICAgICBpZiAocmVzcG9uc2VzID09IG51bGwgfHwgcmVzcG9uc2VzLmxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlIDogcmVzcG9uc2VzKSB7CisgICAgICAgICAgICBpZiAocmVzcG9uc2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5jbG9zZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLldBUk5JTkcsICJFcnJvciBjbG9zaW5nIGEgcmVzcG9uc2UuIiwgdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IG1ldGhvZCB0aGF0IHNhZmVseSBjbG9zZXMgYSBjbGllbnQgaW5zdGFuY2Ugd2l0aG91dCB0aHJvd2luZyBhbiBleGNlcHRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xpZW50cyBjbGllbnQgaW5zdGFuY2VzIHRvIGNsb3NlLiBFYWNoIGluc3RhbmNlIG1heSBiZSB7QGNvZGUgbnVsbH0uCisgICAgICogQHNpbmNlIDIuNQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjbG9zZUlmTm90TnVsbChmaW5hbCBDbGllbnQuLi4gY2xpZW50cykgeworICAgICAgICBpZiAoY2xpZW50cyA9PSBudWxsIHx8IGNsaWVudHMubGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoZmluYWwgQ2xpZW50IGMgOiBjbGllbnRzKSB7CisgICAgICAgICAgICBpZiAoYyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGMuY2xvc2UoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5XQVJOSU5HLCAiRXJyb3IgY2xvc2luZyBhIGNsaWVudCBpbnN0YW5jZS4iLCB0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3VzdG9tIGxvZ2dpbmcgaGFuZGxlciB1c2VkIHRvIHN0b3JlIGxvZyByZWNvcmRzIHByb2R1Y2VzIGR1cmluZyBhbiBpbnZvY2F0aW9uIG9mIGEgdGVzdC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIEplcnNleVRlc3RMb2dIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbG9nTGV2ZWw7CisgICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxMb2dSZWNvcmQ+IHJlY29yZHM7CisKKyAgICAgICAgcHJpdmF0ZSBKZXJzZXlUZXN0TG9nSGFuZGxlcigpIHsKKyAgICAgICAgICAgIHRoaXMubG9nTGV2ZWwgPSBJbnRlZ2VyLnBhcnNlSW50KGdldFByb3BlcnR5KFRlc3RQcm9wZXJ0aWVzLlJFQ09SRF9MT0dfTEVWRUwpKTsKKyAgICAgICAgICAgIHRoaXMucmVjb3JkcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHB1Ymxpc2goZmluYWwgTG9nUmVjb3JkIHJlY29yZCkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGxvZ2dlck5hbWUgPSByZWNvcmQuZ2V0TG9nZ2VyTmFtZSgpOworCisgICAgICAgICAgICBpZiAocmVjb3JkLmdldExldmVsKCkuaW50VmFsdWUoKSA+PSBsb2dMZXZlbAorICAgICAgICAgICAgICAgICAgICAmJiBsb2dnZXJOYW1lLnN0YXJ0c1dpdGgoIm9yZy5nbGFzc2Zpc2guamVyc2V5IikKKyAgICAgICAgICAgICAgICAgICAgJiYgIWxvZ2dlck5hbWUuc3RhcnRzV2l0aCgib3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdCIpKSB7CisgICAgICAgICAgICAgICAgcmVjb3Jkcy5hZGQocmVjb3JkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBTZWN1cml0eUV4Y2VwdGlvbiB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTGlzdDxMb2dSZWNvcmQ+IGdldFJlY29yZHMoKSB7CisgICAgICAgICAgICByZXR1cm4gcmVjb3JkczsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL2NvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L0plcnNleVRlc3ROZy5qYXZhIGIvdGVzdC1mcmFtZXdvcmsvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvSmVyc2V5VGVzdE5nLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJhNTRjZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZnJhbWV3b3JrL2NvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L0plcnNleVRlc3ROZy5qYXZhCkBAIC0wLDAgKzEsMjEwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdE5nU3RyYXRlZ3k7CisKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlck1ldGhvZDsKK2ltcG9ydCBvcmcudGVzdG5nLmFubm90YXRpb25zLkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlTWV0aG9kOworCisvKioKKyAqIFBhcmVudCBjbGFzcyBmb3IgdGVzdGluZyBKQVgtUlMgYW5kIEplcnNleS1iYXNlZCBhcHBsaWNhdGlvbnMgdXNpbmcgSmVyc2V5IHRlc3QgZnJhbWV3b3JrIGFuZCBUZXN0TkcgZnJhbWV3b3JrLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICoKKyAqIEBzZWUgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0CisgKiBAc2VlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3ROZ1N0cmF0ZWd5CisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBKZXJzZXlUZXN0TmcgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgVGVzdE5nU3RyYXRlZ3kgc3RyYXRlZ3k7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIEplcnNleVRlc3ROZyBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIFRoaXMgY29uc3RydWN0b3IgY2FuIGJlIHVzZWQgZnJvbSBhbiBleHRlbmRpbmcgc3ViY2xhc3MuIFdoZW4gdGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkLCB0aGUgZXh0ZW5kaW5nCisgICAgICogY29uY3JldGUgc3ViY2xhc3MgbXVzdCBpbXBsZW1lbnQge0BsaW5rICNjb25maWd1cmVTdHJhdGVneSgpfSBtZXRob2QuCisgICAgICogPHA+CisgICAgICogV2hlbiB0aGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQsIHRoZSBleHRlbmRpbmcgY29uY3JldGUgc3ViY2xhc3MgbXVzdCBpbXBsZW1lbnQgb25lIG9mIHRoZQorICAgICAqIHtAbGluayAjY29uZmlndXJlKCl9IG9yIHtAbGluayAjY29uZmlndXJlRGVwbG95bWVudCgpfSBtZXRob2RzIHRvIHByb3ZpZGUgdGhlIHRlc3RlZCBhcHBsaWNhdGlvbgorICAgICAqIGNvbmZpZ3VyYXRpb24gYW5kIGRlcGxveW1lbnQgY29udGV4dC4KKyAgICAgKiA8L3A+CisgICAgICovCisgICAgcHVibGljIEplcnNleVRlc3ROZygpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIoKTsKKworICAgICAgICBzdHJhdGVneSA9IGNvbmZpZ3VyZVN0cmF0ZWd5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSBKZXJzZXlUZXN0TmcgaW5zdGFuY2UgYW5kIHNwZWNpZnkgdGhlIHRlc3QgY29udGFpbmVyIGZhY3RvcnkgdG8gYmUgdXNlZCBieSB0aGlzIHRlc3QuCisgICAgICoKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNhbiBiZSB1c2VkIGZyb20gYW4gZXh0ZW5kaW5nIHN1YmNsYXNzLiBXaGVuIHRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCwgdGhlIGV4dGVuZGluZworICAgICAqIGNvbmNyZXRlIHN1YmNsYXNzIG11c3QgaW1wbGVtZW50IHtAbGluayAjY29uZmlndXJlU3RyYXRlZ3koKX0gbWV0aG9kLgorICAgICAqIDxwPgorICAgICAqIFdoZW4gdGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkLCB0aGUgZXh0ZW5kaW5nIGNvbmNyZXRlIHN1YmNsYXNzIG11c3QgaW1wbGVtZW50IG9uZSBvZiB0aGUKKyAgICAgKiB7QGxpbmsgI2NvbmZpZ3VyZSgpfSBvciB7QGxpbmsgI2NvbmZpZ3VyZURlcGxveW1lbnQoKX0gbWV0aG9kcyB0byBwcm92aWRlIHRoZSB0ZXN0ZWQgYXBwbGljYXRpb24KKyAgICAgKiBjb25maWd1cmF0aW9uIGFuZCBkZXBsb3ltZW50IGNvbnRleHQuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogQHBhcmFtIHRlc3RDb250YWluZXJGYWN0b3J5IHRoZSB0ZXN0IGNvbnRhaW5lciBmYWN0b3J5IHRvIHVzZSBmb3IgdGVzdGluZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgSmVyc2V5VGVzdE5nKGZpbmFsIFRlc3RDb250YWluZXJGYWN0b3J5IHRlc3RDb250YWluZXJGYWN0b3J5KSB7CisgICAgICAgIHN1cGVyKHRlc3RDb250YWluZXJGYWN0b3J5KTsKKworICAgICAgICBzdHJhdGVneSA9IGNvbmZpZ3VyZVN0cmF0ZWd5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSBKZXJzZXlUZXN0TmcgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBUaGlzIGNvbnN0cnVjdG9yIGNhbiBiZSB1c2VkIGZyb20gYW4gZXh0ZW5kaW5nIHN1YmNsYXNzLgorICAgICAqIDxwPgorICAgICAqIFdoZW4gdGhpcyBjb25zdHJ1Y3RvciBpcyB1c2VkLCB0aGUgZXh0ZW5kaW5nIGNvbmNyZXRlIHN1YmNsYXNzIHRoZSB7QGxpbmsgI2NvbmZpZ3VyZSgpfQorICAgICAqIG9yIHtAbGluayAjY29uZmlndXJlRGVwbG95bWVudCgpfSBtZXRob2QgYXJlIGlnbm9yZWQuIEhvd2V2ZXIgaXQgbXVzdCBpbXBsZW1lbnQKKyAgICAgKiB7QGxpbmsgI2NvbmZpZ3VyZVN0cmF0ZWd5KCl9IG1ldGhvZC4KKyAgICAgKiA8L3A+CisgICAgICogPHA+CisgICAgICogUGxlYXNlIG5vdGUgdGhhdCB3aGVuIHRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCwgcmVjb3JkaW5nIG9mIHN0YXJ0dXAgbG9ncyBhcyB3ZWxsIGFzIGNvbmZpZ3VyaW5nCisgICAgICogb3RoZXIge0Bjb2RlIEplcnNleVRlc3ROZ30gcHJvcGVydGllcyBhbmQgZmVhdHVyZXMgbWF5IG5vdCB3b3JrIHByb3Blcmx5LiBXaGlsZSB1c2luZyB0aGlzIGNvbnN0cnVjdG9yCisgICAgICogc2hvdWxkIGdlbmVyYWxseSBiZSBhdm9pZGVkLCBpbiBjZXJ0YWluIHNjZW5hcmlvcyBpdCBtYXkgYmUgbmVjZXNzYXJ5IHRvIHVzZSB0aGlzIGNvbnN0cnVjdG9yLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBqYXhyc0FwcGxpY2F0aW9uIHRlc3RlZCBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgSmVyc2V5VGVzdE5nKGZpbmFsIEFwcGxpY2F0aW9uIGpheHJzQXBwbGljYXRpb24pIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIoamF4cnNBcHBsaWNhdGlvbik7CisKKyAgICAgICAgc3RyYXRlZ3kgPSBjb25maWd1cmVTdHJhdGVneSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIC8qIHBhY2thZ2UgKi8gZmluYWwgVGVzdENvbnRhaW5lciBnZXRUZXN0Q29udGFpbmVyKCkgeworICAgICAgICByZXR1cm4gc3RyYXRlZ3kudGVzdENvbnRhaW5lcigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIC8qIHBhY2thZ2UgKi8gZmluYWwgVGVzdENvbnRhaW5lciBzZXRUZXN0Q29udGFpbmVyKGZpbmFsIFRlc3RDb250YWluZXIgdGVzdENvbnRhaW5lcikgeworICAgICAgICByZXR1cm4gc3RyYXRlZ3kudGVzdENvbnRhaW5lcih0ZXN0Q29udGFpbmVyKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgZmluYWwgQ2xpZW50IGdldENsaWVudCgpIHsKKyAgICAgICAgcmV0dXJuIHN0cmF0ZWd5LmNsaWVudCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBmaW5hbCBDbGllbnQgc2V0Q2xpZW50KGZpbmFsIENsaWVudCBjbGllbnQpIHsKKyAgICAgICAgcmV0dXJuIHN0cmF0ZWd5LmNsaWVudChjbGllbnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbmZpZ3VyZSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdE5nU3RyYXRlZ3kgc3RyYXRlZ3l9IGZvciB0aGlzIFRlc3RORyBKZXJzZXlUZXN0LiBUaGUgc3RyYXRlZ3kgZGVmaW5lcworICAgICAqIGhvdyBhIHRlc3QgY29udGFpbmVyIC8gY2xpZW50IGlzIHN0b3JlZCAocGVyIGNsYXNzLCBwZXIgdGhyZWFkKSBhbmQgaXMgYWxzbyByZXNwb25zaWJsZSBmb3IgZGlzcG9zaW5nIHN0b3JlZCBpbnN0YW5jZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRlc3RORyBzdHJhdGVneSBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgVGVzdE5nU3RyYXRlZ3kgY29uZmlndXJlU3RyYXRlZ3koKSB7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhlIGNvbmZpZ3VyZVN0cmF0ZWd5IG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHRoZSBleHRlbmRpbmcgY2xhc3MiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJlbnQgZm9yIFRlc3ROZyB0ZXN0cyB0aGF0IG5lZWRzIHRvIGNyZWF0ZSBhIHRlc3QgY29udGFpbmVyIG9ubHkgb25jZSBwZXIgYSB0ZXN0IGNsYXNzLgorICAgICAqIDxwLz4KKyAgICAgKiBUaGUgY3JlYXRpb24gYW5kIGRpc3Bvc2FsIG9mIHRoZSB0ZXN0IGNvbnRhaW5lciAob3IgY2xpZW50KSBhcmUgbWFuYWdlZCBieSB7QGxpbmsgI3NldFVwKCl9IC8ge0BsaW5rICN0ZWFyRG93bigpfSBtZXRob2RzCisgICAgICogYW5ub3RhdGVkIGJ5IFRlc3RORyBhbm5vdGF0aW9ucyB7QGxpbmsgQmVmb3JlQ2xhc3N9IC8ge0BsaW5rIEFmdGVyQ2xhc3N9LgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJVbnVzZWREZWNsYXJhdGlvbiIpCisgICAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBDb250YWluZXJQZXJDbGFzc1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0TmcgeworCisgICAgICAgIHB1YmxpYyBDb250YWluZXJQZXJDbGFzc1Rlc3QoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvbnRhaW5lclBlckNsYXNzVGVzdChmaW5hbCBUZXN0Q29udGFpbmVyRmFjdG9yeSB0ZXN0Q29udGFpbmVyRmFjdG9yeSkgeworICAgICAgICAgICAgc3VwZXIodGVzdENvbnRhaW5lckZhY3RvcnkpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvbnRhaW5lclBlckNsYXNzVGVzdChmaW5hbCBBcHBsaWNhdGlvbiBqYXhyc0FwcGxpY2F0aW9uKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBzdXBlcihqYXhyc0FwcGxpY2F0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIEBCZWZvcmVDbGFzcworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIH0KKworICAgICAgICBAQWZ0ZXJDbGFzcworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIFRlc3ROZ1N0cmF0ZWd5IGNvbmZpZ3VyZVN0cmF0ZWd5KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDb250YWluZXJQZXJDbGFzc1Rlc3ROZ1N0cmF0ZWd5KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQYXJlbnQgZm9yIFRlc3ROZyB0ZXN0cyB0aGF0IG5lZWRzIHRvIGNyZWF0ZSBhIHNlcGFyYXRlIHRlc3QgY29udGFpbmVyIGZvciBlYWNoIHRlc3QgaW4gYSB0ZXN0IGNsYXNzLgorICAgICAqIDxwLz4KKyAgICAgKiBUaGUgY3JlYXRpb24gYW5kIGRpc3Bvc2FsIG9mIHRoZSB0ZXN0IGNvbnRhaW5lciAob3IgY2xpZW50KSBhcmUgbWFuYWdlZCBieSB7QGxpbmsgI3NldFVwKCl9IC8ge0BsaW5rICN0ZWFyRG93bigpfSBtZXRob2RzCisgICAgICogYW5ub3RhdGVkIGJ5IFRlc3RORyBhbm5vdGF0aW9ucyB7QGxpbmsgQmVmb3JlTWV0aG9kfSAvIHtAbGluayBBZnRlck1ldGhvZH0uCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoIlVudXNlZERlY2xhcmF0aW9uIikKKyAgICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIENvbnRhaW5lclBlck1ldGhvZFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0TmcgeworCisgICAgICAgIHB1YmxpYyBDb250YWluZXJQZXJNZXRob2RUZXN0KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb250YWluZXJQZXJNZXRob2RUZXN0KGZpbmFsIFRlc3RDb250YWluZXJGYWN0b3J5IHRlc3RDb250YWluZXJGYWN0b3J5KSB7CisgICAgICAgICAgICBzdXBlcih0ZXN0Q29udGFpbmVyRmFjdG9yeSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQ29udGFpbmVyUGVyTWV0aG9kVGVzdChmaW5hbCBBcHBsaWNhdGlvbiBqYXhyc0FwcGxpY2F0aW9uKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBzdXBlcihqYXhyc0FwcGxpY2F0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIEBCZWZvcmVNZXRob2QKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICB9CisKKyAgICAgICAgQEFmdGVyTWV0aG9kCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgVGVzdE5nU3RyYXRlZ3kgY29uZmlndXJlU3RyYXRlZ3koKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENvbnRhaW5lclBlck1ldGhvZFRlc3ROZ1N0cmF0ZWd5KCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0LWZyYW1ld29yay9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9TZXJ2bGV0RGVwbG95bWVudENvbnRleHQuamF2YSBiL3Rlc3QtZnJhbWV3b3JrL2NvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L1NlcnZsZXREZXBsb3ltZW50Q29udGV4dC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMDA5MzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9TZXJ2bGV0RGVwbG95bWVudENvbnRleHQuamF2YQpAQCAtMCwwICsxLDc5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkVudW1TZXQ7CitpbXBvcnQgamF2YS51dGlsLkV2ZW50TGlzdGVuZXI7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuRGlzcGF0Y2hlclR5cGU7CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dEF0dHJpYnV0ZUxpc3RlbmVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHRMaXN0ZW5lcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0QXR0cmlidXRlTGlzdGVuZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdExpc3RlbmVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlc3Npb25BY3RpdmF0aW9uTGlzdGVuZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uQXR0cmlidXRlTGlzdGVuZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXNzaW9uTGlzdGVuZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI7CisKKy8qKgorICogQSBTZXJ2bGV0LWJhc2VkIGRlcGxveW1lbnQgY29udGV4dC4KKyAqCisgKiA8cD4KKyAqIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgY3JlYXRlZCBieSBjcmVhdGluZyB1c2luZyB7QGxpbmsgQnVpbGRlcn0sIHRoYXQgYWxsb3dzIHRvIGNvbmZpZ3VyZSB0aGUgZGVwbG95bWVudAorICogY29udGV4dCBzdGF0ZSwgYW5kIGZpbmFsbHkgYnVpbGRpbmcgdGhlIGNvbnRleHQgYnkgaW52b2tpbmcgdGhlIHtAbGluayBCdWlsZGVyI2J1aWxkKCl9IG1ldGhvZC4KKyAqIDwvcD4KKyAqIDxwPgorICogVGhpcyBkZXBsb3ltZW50IGNvbnRleHQgaXMgY29tcGF0aWJsZSB3aXRoIFNlcnZsZXQtYmFzZWQgdGVzdCBjb250YWluZXJzLiBUaGUgZm9sbG93aW5nIHRlc3QgY29udGFpbmVyCisgKiBmYWN0b3JpZXMgc3VwcG9ydCB0aGUgZGVzY3JpcHRvcjoKKyAqIDx1bD4KKyAqIDxsaT57QGNvZGUgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5ncml6emx5LkdyaXp6bHlXZWJUZXN0Q29udGFpbmVyRmFjdG9yeX0gZm9yIHRlc3Rpbmcgd2l0aCB0aGUKKyAqIEdyaXp6bHkgU2VydmxldCBjb250YWluZXIuPC9saT4KKyAqIDxsaT57QGNvZGUgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5fSBmb3IgdGVzdGluZyBKYXZhIEVFIFdlYgorICogYXBwbGljYXRpb25zIGRlcGxveWVkIGluZGVwZW5kZW50bHkgaW4gYSBzZXBhcmF0ZSBKVk0gdG8gdGhhdCBvZiB0aGUgdGVzdHMuIEZvciBleGFtcGxlLCB0aGUgYXBwbGljYXRpb24KKyAqIG1heSBiZSBkZXBsb3llZCB0byB0aGUgR2xhc3NGaXNoIG9yIFdlYkxvZ2ljIGFwcGxpY2F0aW9uIHNlcnZlci48L2xpPgorICogPC91bD4KKyAqIDwvcD4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICogQHNpbmNlIDIuOAorICovCitAU3VwcHJlc3NXYXJuaW5ncygiTWV0aG9kT3ZlcnJpZGVzU3RhdGljTWV0aG9kT2ZTdXBlcmNsYXNzIikKK3B1YmxpYyBjbGFzcyBTZXJ2bGV0RGVwbG95bWVudENvbnRleHQgZXh0ZW5kcyBEZXBsb3ltZW50Q29udGV4dCB7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgc2VydmxldCBkZXBsb3ltZW50IGNvbnRleHQgYnVpbGRlciBmb3IgYSBKQVgtUlMgLyBKZXJzZXkgYXBwbGljYXRpb24gaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXBwbGljYXRpb24gYSBKQVgtUlMgLyBKZXJzZXkgYXBwbGljYXRpb24gdG8gYmUgdGVzdGVkLgorICAgICAqIEByZXR1cm4gbmV3IHNlcnZsZXQgZGVwbG95bWVudCBjb250ZXh0IGJ1aWxkZXIgaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBKQVgtUlMgLyBKZXJzZXkgYXBwbGljYXRpb24gdG8gYmUgdGVzdGVkLgorICAgICAqCisgICAgICogQHRocm93cyBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gY2FzZSB0aGUge0Bjb2RlIGFwcGxpY2F0aW9ufSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIGJ1aWxkZXIoZmluYWwgQXBwbGljYXRpb24gYXBwbGljYXRpb24pIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKGFwcGxpY2F0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBuZXcgc2VydmxldCBkZXBsb3ltZW50IGNvbnRleHQgYnVpbGRlciBmb3IgYSBKQVgtUlMgLyBKZXJzZXkgYXBwbGljYXRpb24gaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYXBwbGljYXRpb25DbGFzcyBhIEpBWC1SUyAvIEplcnNleSBhcHBsaWNhdGlvbiB0byBiZSB0ZXN0ZWQuCisgICAgICogQHJldHVybiBuZXcgc2VydmxldCBkZXBsb3ltZW50IGNvbnRleHQgYnVpbGRlciBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggdGhlIEpBWC1SUyAvIEplcnNleSBhcHBsaWNhdGlvbiB0byBiZSB0ZXN0ZWQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiBpbiBjYXNlIHRoZSB7QGNvZGUgYXBwbGljYXRpb25DbGFzc30gaXMge0Bjb2RlIG51bGx9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBidWlsZGVyKGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBBcHBsaWNhdGlvbj4gYXBwbGljYXRpb25DbGFzcykgeworICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoYXBwbGljYXRpb25DbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyBzZXJ2bGV0IGRlcGxveW1lbnQgY29udGV4dCBidWlsZGVyIGluaXRpYWxpemVkIGZyb20gdGhlIHN1cHBsaWVkIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5pdFBhcmFtcyBhIG1hcCBvZiBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzLiBUaGUgcGFyYW1ldGVycyB3aWxsIGJlIGNvcGllZC4KKyAgICAgKiBAcmV0dXJuIG5ldyBzZXJ2bGV0IGRlcGxveW1lbnQgY29udGV4dCBidWlsZGVyIGluc3RhbmNlIGluaXRpYWxpemVkIGZyb20gdGhlIHN1cHBsaWVkIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiBpcyB0aGUgc3BlY2lmaWVkIG1hcCBpcyB7QGNvZGUgbnVsbH0uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIGJ1aWxkZXIoZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBpbml0UGFyYW1zKSB7CisgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLmluaXRQYXJhbXMoaW5pdFBhcmFtcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyBzZXJ2bGV0IGRlcGxveW1lbnQgY29udGV4dCBidWlsZGVyIGJvdW5kIHRvIGEgU2VydmxldCBpbnN0YW5jZS4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlIHRoYXQgdGhlIHNlcnZsZXQgaW5zdGFuY2Ugd2lsbCBiZSBkaXNjYXJkZWQgaWYgb25lIG9mIHRoZSB7QGxpbmsgQnVpbGRlciNzZXJ2bGV0KGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldCl9LAorICAgICAqIHtAbGluayBCdWlsZGVyI3NlcnZsZXRDbGFzcyhDbGFzcyl9LCB7QGxpbmsgQnVpbGRlciNmaWx0ZXJDbGFzcyhDbGFzcyl9IG9yCisgICAgICoge0BsaW5rIEJ1aWxkZXIjZmlsdGVyQ2xhc3MoQ2xhc3MsIGphdmEudXRpbC5TZXQpfSBpcyBpbnZva2VkIG9uIHRoZSBidWlsZGVyLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2bGV0IHRoZSBzZXJ2bGV0IGluc3RhbmNlIHRvIHNlcnZlIHRoZSBhcHBsaWNhdGlvbi4KKyAgICAgKiBAcmV0dXJuIG5ldyBzZXJ2bGV0IGRlcGxveW1lbnQgY29udGV4dCBidWlsZGVyIGluc3RhbmNlIGJvdW5kIHRvIGEgU2VydmxldCBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIGlzIHRoZSBzcGVjaWZpZWQgbWFwIGlzIHtAY29kZSBudWxsfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgZm9yU2VydmxldChIdHRwU2VydmxldCBzZXJ2bGV0KSB7CisgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLnNlcnZsZXQoc2VydmxldCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyBzZXJ2bGV0IGRlcGxveW1lbnQgY29udGV4dCBidWlsZGVyIGJvdW5kIHRvIGEgU2VydmxldCBjbGFzcy4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlIHRoYXQgdGhlIHNlcnZsZXQgaW5zdGFuY2Ugd2lsbCBiZSBkaXNjYXJkZWQgaWYgb25lIG9mIHRoZSB7QGxpbmsgQnVpbGRlciNzZXJ2bGV0KGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldCl9LAorICAgICAqIHtAbGluayBCdWlsZGVyI3NlcnZsZXRDbGFzcyhDbGFzcyl9LCB7QGxpbmsgQnVpbGRlciNmaWx0ZXJDbGFzcyhDbGFzcyl9IG9yCisgICAgICoge0BsaW5rIEJ1aWxkZXIjZmlsdGVyQ2xhc3MoQ2xhc3MsIGphdmEudXRpbC5TZXQpfSBpcyBpbnZva2VkIG9uIHRoZSBidWlsZGVyLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2bGV0Q2xhc3MgdGhlIHNlcnZsZXQgY2xhc3MgdG8gc2VydmUgdGhlIGFwcGxpY2F0aW9uLgorICAgICAqIEByZXR1cm4gbmV3IHNlcnZsZXQgZGVwbG95bWVudCBjb250ZXh0IGJ1aWxkZXIgaW5zdGFuY2UgYm91bmQgdG8gYSBTZXJ2bGV0IGluc3RhbmNlLgorICAgICAqCisgICAgICogQHRocm93cyBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24gaXMgdGhlIHNwZWNpZmllZCBtYXAgaXMge0Bjb2RlIG51bGx9LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBmb3JTZXJ2bGV0KENsYXNzPD8gZXh0ZW5kcyBIdHRwU2VydmxldD4gc2VydmxldENsYXNzKSB7CisgICAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpLnNlcnZsZXRDbGFzcyhzZXJ2bGV0Q2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgc2VydmxldCBkZXBsb3ltZW50IGNvbnRleHQgYnVpbGRlciBpbml0aWFsaXplZCB3aXRoIHRoZSBwcm92aWRlcnMgZnJvbSB0aGUgc3BlY2lmaWVkIHBhY2thZ2VzLgorICAgICAqIDxwPgorICAgICAqIFRoZSB7QGNvZGUgcGFja2FnZXN9IHZhbHVlIHdpbGwgYmUgc2V0IGFzIG9uZSBvZiB0aGUge0BsaW5rIEJ1aWxkZXIjaW5pdFBhcmFtKFN0cmluZywgU3RyaW5nKSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzfQorICAgICAqIHdpdGggPHR0PntAdmFsdWUgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMjUFJPVklERVJfUEFDS0FHRVN9PC90dD4ga2V5LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYWNrYWdlcyBsaXN0IG9mIGFwcGxpY2F0aW9uIHBhY2thZ2VzIGNvbnRhaW5pbmcgSkFYLVJTIC8gSmVyc2V5IHByb3ZpZGVyIGFuZCByZXNvdXJjZSBjbGFzc2VzLgorICAgICAqIEByZXR1cm4gbmV3IHNlcnZsZXQgZGVwbG95bWVudCBjb250ZXh0IGJ1aWxkZXIgaW5zdGFuY2UgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgcHJvdmlkZXJzIGZyb20gdGhlIHNwZWNpZmllZCBwYWNrYWdlcy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIGlzIHRoZSBzcGVjaWZpZWQgbWFwIGlzIHtAY29kZSBudWxsfS4KKyAgICAgKiBAc2VlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzI1BST1ZJREVSX1BBQ0tBR0VTCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIGZvclBhY2thZ2VzKFN0cmluZyBwYWNrYWdlcykgeworICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKS5pbml0UGFyYW0oU2VydmVyUHJvcGVydGllcy5QUk9WSURFUl9QQUNLQUdFUywgcGFja2FnZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBzZXJ2bGV0IGRlcGxveW1lbnQgY29udGV4dCBmb3IgYSBKQVgtUlMgLyBKZXJzZXkgYXBwbGljYXRpb24gaW5zdGFuY2UuCisgICAgICogPHA+CisgICAgICogVGhlIGNyZWF0ZWQgc2VydmxldCBkZXBsb3ltZW50IGNvbnRleHQgd2lsbCBiZSBjb25maWd1cmVkIHRvIHVzZSBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gYXBwbGljYXRpb24gYSBKQVgtUlMgLyBKZXJzZXkgYXBwbGljYXRpb24gdG8gYmUgdGVzdGVkLgorICAgICAqIEByZXR1cm4gbmV3IHNlcnZsZXQgZGVwbG95bWVudCBjb250ZXh0IGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgSkFYLVJTIC8gSmVyc2V5IGFwcGxpY2F0aW9uIHRvIGJlIHRlc3RlZC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIGluIGNhc2UgdGhlIHtAY29kZSBhcHBsaWNhdGlvbn0gaXMge0Bjb2RlIG51bGx9LgorICAgICAqLworCisgICAgcHVibGljIHN0YXRpYyBTZXJ2bGV0RGVwbG95bWVudENvbnRleHQgbmV3SW5zdGFuY2UoZmluYWwgQXBwbGljYXRpb24gYXBwbGljYXRpb24pIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKGFwcGxpY2F0aW9uKS5idWlsZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBzZXJ2bGV0IGRlcGxveW1lbnQgY29udGV4dCBmb3IgYSBKQVgtUlMgLyBKZXJzZXkgYXBwbGljYXRpb24gaW5zdGFuY2UuCisgICAgICogPHA+CisgICAgICogVGhlIGNyZWF0ZWQgc2VydmxldCBkZXBsb3ltZW50IGNvbnRleHQgd2lsbCBiZSBjb25maWd1cmVkIHRvIHVzZSBkZWZhdWx0IHZhbHVlcy4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcGFyYW0gYXBwbGljYXRpb25DbGFzcyBhIEpBWC1SUyAvIEplcnNleSBhcHBsaWNhdGlvbiB0byBiZSB0ZXN0ZWQuCisgICAgICogQHJldHVybiBuZXcgc2VydmxldCBkZXBsb3ltZW50IGNvbnRleHQgaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBKQVgtUlMgLyBKZXJzZXkgYXBwbGljYXRpb24gdG8gYmUgdGVzdGVkLgorICAgICAqCisgICAgICogQHRocm93cyBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24gaW4gY2FzZSB0aGUge0Bjb2RlIGFwcGxpY2F0aW9uQ2xhc3N9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFNlcnZsZXREZXBsb3ltZW50Q29udGV4dCBuZXdJbnN0YW5jZShmaW5hbCBDbGFzczw/IGV4dGVuZHMgQXBwbGljYXRpb24+IGFwcGxpY2F0aW9uQ2xhc3MpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKGFwcGxpY2F0aW9uQ2xhc3MpLmJ1aWxkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyBzZXJ2bGV0IGRlcGxveW1lbnQgY29udGV4dCBpbml0aWFsaXplZCB3aXRoIHRoZSBwcm92aWRlcnMgZnJvbSB0aGUgc3BlY2lmaWVkIHBhY2thZ2VzLgorICAgICAqIDxwPgorICAgICAqIFRoZSB7QGNvZGUgcGFja2FnZXN9IHZhbHVlIHdpbGwgYmUgc2V0IGFzIG9uZSBvZiB0aGUge0BsaW5rIEJ1aWxkZXIjaW5pdFBhcmFtKFN0cmluZywgU3RyaW5nKSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzfQorICAgICAqIHdpdGggPHR0PntAdmFsdWUgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMjUFJPVklERVJfUEFDS0FHRVN9PC90dD4ga2V5LgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYWNrYWdlcyBsaXN0IG9mIGFwcGxpY2F0aW9uIHBhY2thZ2VzIGNvbnRhaW5pbmcgSkFYLVJTIC8gSmVyc2V5IHByb3ZpZGVyIGFuZCByZXNvdXJjZSBjbGFzc2VzLgorICAgICAqIEByZXR1cm4gbmV3IHNlcnZsZXQgZGVwbG95bWVudCBjb250ZXh0IGluc3RhbmNlIGluaXRpYWxpemVkIHdpdGggdGhlIHByb3ZpZGVycyBmcm9tIHRoZSBzcGVjaWZpZWQgcGFja2FnZXMuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiBpcyB0aGUgc3BlY2lmaWVkIG1hcCBpcyB7QGNvZGUgbnVsbH0uCisgICAgICogQHNlZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcyNQUk9WSURFUl9QQUNLQUdFUworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBuZXdJbnN0YW5jZShTdHJpbmcgcGFja2FnZXMpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKCkuaW5pdFBhcmFtKFNlcnZlclByb3BlcnRpZXMuUFJPVklERVJfUEFDS0FHRVMsIHBhY2thZ2VzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgYnVpbGRlciBmb3IgYnVpbGRpbmcgYSBTZXJ2bGV0LWJhc2VkIGRlcGxveW1lbnQgY29udGV4dC4KKyAgICAgKiA8cD4KKyAgICAgKiBJZiBwcm9wZXJ0aWVzIG9mIHRoZSBidWlsZGVyIGFyZSBub3QgbW9kaWZpZWQsIGRlZmF1bHQgdmFsdWVzIHdpbGwgYmUgdXRpbGl6ZWQ6CisgICAgICogPHVsPgorICAgICAqIDxsaT5UaGUgZGVmYXVsdCB2YWx1ZSBmb3IgaW5pdGlhbGl6YXRpb24gYW5kIGNvbnRleHQgcGFyYW1ldGVycyBpcyBhbiBlbXB0eSBtYXAuPC9saT4KKyAgICAgKiA8bGk+VGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBjb250ZXh0IGFuZCBzZXJ2bGV0IHBhdGggaXMgYW4gZW1wdHkgc3RyaW5nLjwvbGk+CisgICAgICogPGxpPlRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgc2VydmxldCBjbGFzcyBpcyB0aGUgY2xhc3Mge0BsaW5rIFNlcnZsZXRDb250YWluZXJ9LjwvbGk+CisgICAgICogPGxpPlRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgc2VydmxldCBpbnN0YW5jZSwgZmlsdGVyIGNsYXNzIGFuZCB0aGUgc2VydmxldCBjb250ZXh0IGxpc3RlbmVyIGNsYXNzIGlzIHtAY29kZSBudWxsfS48L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9wPgorICAgICAqIDxwPgorICAgICAqIEFmdGVyIHRoZSB7QGxpbmsgI2J1aWxkKCl9IGhhcyBiZWVuIGludm9rZWQgdGhlIHN0YXRlIG9mIHRoZSBidWlsZGVyIHdpbGwgYmUgcmVzZXQgdG8gdGhlIGRlZmF1bHQgdmFsdWVzLgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXIgZXh0ZW5kcyBEZXBsb3ltZW50Q29udGV4dC5CdWlsZGVyIHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRW51bVNldDxEaXNwYXRjaGVyVHlwZT4gREVGQVVMVF9ESVNQQVRDSEVSX1RZUEVTID0gRW51bVNldC5vZihEaXNwYXRjaGVyVHlwZS5SRVFVRVNUKTsKKworICAgICAgICBwcml2YXRlIE1hcDxTdHJpbmcsIFN0cmluZz4gaW5pdFBhcmFtczsKKyAgICAgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBTdHJpbmc+IGNvbnRleHRQYXJhbXM7CisgICAgICAgIHByaXZhdGUgQ2xhc3M8PyBleHRlbmRzIEh0dHBTZXJ2bGV0PiBzZXJ2bGV0Q2xhc3MgPSBTZXJ2bGV0Q29udGFpbmVyLmNsYXNzOworICAgICAgICBwcml2YXRlIEh0dHBTZXJ2bGV0IHNlcnZsZXRJbnN0YW5jZTsKKyAgICAgICAgcHJpdmF0ZSBMaXN0PEZpbHRlckRlc2NyaXB0b3I+IGZpbHRlcnM7CisgICAgICAgIHByaXZhdGUgTGlzdDxDbGFzczw/IGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4+IGxpc3RlbmVyczsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgc2VydmxldFBhdGggPSAiIjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIG5ldyBkZXBsb3ltZW50IGNvbnRleHQgYnVpbGRlciBpbnN0YW5jZSBub3QgZXhwbGljaXRseSBib3VuZCB0byB0aGUgSkFYLVJTIC8gSmVyc2V5IGFwcGxpY2F0aW9uIGNsYXNzLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogVGhlIGNvbnN0cnVjdG9yIGlzIHByb3ZpZGVkIHRvIHN1cHBvcnQgZGlmZmVyZW50IHN1YmNsYXNzIGluaXRpYWxpemF0aW9uIHNjZW5hcmlvcy4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKi8KKyAgICAgICAgcHJvdGVjdGVkIEJ1aWxkZXIoKSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhIGJ1aWxkZXIgd2l0aCBvbmUgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbmFtZSAgdGhlIHBhcmFtZXRlciBuYW1lLgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHBhcmFtZXRlciB2YWx1ZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIGluaXRQYXJhbShuYW1lLCB2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIG5ldyBkZXBsb3ltZW50IGNvbnRleHQgYnVpbGRlciBpbnN0YW5jZSBhbmQgYmluZCBpdCB0byB0aGUgSkFYLVJTIC8gSmVyc2V5IGFwcGxpY2F0aW9uIGluc3RhbmNlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYXBwIEpBWC1SUyAvIEplcnNleSBhcHBsaWNhdGlvbiBpbnN0YW5jZS4KKyAgICAgICAgICovCisgICAgICAgIHByb3RlY3RlZCBCdWlsZGVyKGZpbmFsIEFwcGxpY2F0aW9uIGFwcCkgeworICAgICAgICAgICAgc3VwZXIoYXBwKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgbmV3IGRlcGxveW1lbnQgY29udGV4dCBidWlsZGVyIGluc3RhbmNlIGFuZCBiaW5kIGl0IHRvIHRoZSBKQVgtUlMgLyBKZXJzZXkgYXBwbGljYXRpb24gY2xhc3MuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhcHBDbGFzcyBKQVgtUlMgLyBKZXJzZXkgYXBwbGljYXRpb24gY2xhc3MuCisgICAgICAgICAqLworICAgICAgICBwcm90ZWN0ZWQgQnVpbGRlcihDbGFzczw/IGV4dGVuZHMgQXBwbGljYXRpb24+IGFwcENsYXNzKSB7CisgICAgICAgICAgICBzdXBlcihhcHBDbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIGFuIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG5hbWUgIHRoZSBwYXJhbWV0ZXIgbmFtZS4KKyAgICAgICAgICogQHBhcmFtIHZhbHVlIHRoZSBwYXJhbWV0ZXIgdmFsdWUuCisgICAgICAgICAqIEByZXR1cm4gdGhpcyBzZXJ2bGV0IGRlcGxveW1lbnQgY29udGV4dCBidWlsZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgaW5pdFBhcmFtKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIGlmICh0aGlzLmluaXRQYXJhbXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRoaXMuaW5pdFBhcmFtcyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRoaXMuaW5pdFBhcmFtcy5wdXQobmFtZSwgdmFsdWUpOworCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGluaXRQYXJhbXMgYSBtYXAgb2YgaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycy4gVGhlIHBhcmFtZXRlcnMgd2lsbCBiZSBjb3BpZWQuCisgICAgICAgICAqIEByZXR1cm4gdGhpcyBzZXJ2bGV0IGRlcGxveW1lbnQgY29udGV4dCBidWlsZGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiBpcyB0aGUgc3BlY2lmaWVkIG1hcCBpcyB7QGNvZGUgbnVsbH0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBpbml0UGFyYW1zKE1hcDxTdHJpbmcsIFN0cmluZz4gaW5pdFBhcmFtcykgeworICAgICAgICAgICAgaWYgKHRoaXMuaW5pdFBhcmFtcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhpcy5pbml0UGFyYW1zID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcy5pbml0UGFyYW1zLnB1dEFsbChpbml0UGFyYW1zKTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIGEgY29udGV4dCBwYXJhbWV0ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBuYW1lICB0aGUgcGFyYW1ldGVyIG5hbWUuCisgICAgICAgICAqIEBwYXJhbSB2YWx1ZSB0aGUgcGFyYW1ldGVyIHZhbHVlLgorICAgICAgICAgKiBAcmV0dXJuIHRoaXMgc2VydmxldCBkZXBsb3ltZW50IGNvbnRleHQgYnVpbGRlci4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGNvbnRleHRQYXJhbShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0UGFyYW1zID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRQYXJhbXMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLmNvbnRleHRQYXJhbXMucHV0KG5hbWUsIHZhbHVlKTsKKworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIGNvbnRleHQgcGFyYW1ldGVycy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNvbnRleHRQYXJhbXMgYSBtYXAgb2YgY29udGV4dCBwYXJhbWV0ZXJzLiBUaGUgcGFyYW1ldGVycyB3aWxsIGJlIGNvcGllZC4KKyAgICAgICAgICogQHJldHVybiB0aGlzIHNlcnZsZXQgZGVwbG95bWVudCBjb250ZXh0IGJ1aWxkZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIGlzIHRoZSBzcGVjaWZpZWQgbWFwIGlzIHtAY29kZSBudWxsfS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGNvbnRleHRQYXJhbXMoTWFwPFN0cmluZywgU3RyaW5nPiBjb250ZXh0UGFyYW1zKSB7CisgICAgICAgICAgICBpZiAodGhpcy5jb250ZXh0UGFyYW1zID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRQYXJhbXMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzLmNvbnRleHRQYXJhbXMucHV0QWxsKGNvbnRleHRQYXJhbXMpOworCisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIHNlcnZsZXQgY2xhc3MuCisgICAgICAgICAqCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBTZXR0aW5nIGEgc2VydmxldCBjbGFzcyByZXNldHMgdGhlIHNlcnZsZXQgaW5zdGFuY2UgYXMgd2VsbCBhcyByZWdpc3RlcmVkIGZpbHRlcnMgdG8ge0Bjb2RlIG51bGx9LgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBzZXJ2bGV0Q2xhc3MgdGhlIHNlcnZsZXQgY2xhc3MgdG8gc2VydmUgdGhlIGFwcGxpY2F0aW9uLgorICAgICAgICAgKiBAcmV0dXJuIHRoaXMgc2VydmxldCBkZXBsb3ltZW50IGNvbnRleHQgYnVpbGRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHRocm93cyBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYge0Bjb2RlIHNlcnZsZXRDbGFzc30gaXMge0Bjb2RlIG51bGx9LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2VydmxldENsYXNzKENsYXNzPD8gZXh0ZW5kcyBIdHRwU2VydmxldD4gc2VydmxldENsYXNzKSB7CisgICAgICAgICAgICBpZiAoc2VydmxldENsYXNzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIlRoZSBzZXJ2bGV0IGNsYXNzIG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy5maWx0ZXJzID0gbnVsbDsKKyAgICAgICAgICAgIHRoaXMuc2VydmxldEluc3RhbmNlID0gbnVsbDsKKyAgICAgICAgICAgIHRoaXMuc2VydmxldENsYXNzID0gc2VydmxldENsYXNzOworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBzZXJ2bGV0IGluc3RhbmNlLgorICAgICAgICAgKgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogU2V0dGluZyBhIHNlcnZsZXQgaW5zdGFuY2UgcmVzZXRzIHRoZSBzZXJ2bGV0IGNsYXNzIGFzIHdlbGwgYXMgcmVnaXN0ZXJlZCBmaWx0ZXJzIHRvIHtAY29kZSBudWxsfS4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc2VydmxldCB0aGUgc2VydmxldCBpbnN0YW5jZSB0byBzZXJ2ZSB0aGUgYXBwbGljYXRpb24uCisgICAgICAgICAqIEByZXR1cm4gdGhpcyBzZXJ2bGV0IGRlcGxveW1lbnQgY29udGV4dCBidWlsZGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB7QGNvZGUgc2VydmxldENsYXNzfSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXJ2bGV0KEh0dHBTZXJ2bGV0IHNlcnZsZXQpIHsKKyAgICAgICAgICAgIGlmIChzZXJ2bGV0Q2xhc3MgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiVGhlIHNlcnZsZXQgY2xhc3MgbXVzdCBub3QgYmUgbnVsbCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLmZpbHRlcnMgPSBudWxsOworICAgICAgICAgICAgdGhpcy5zZXJ2bGV0Q2xhc3MgPSBudWxsOworICAgICAgICAgICAgdGhpcy5zZXJ2bGV0SW5zdGFuY2UgPSBzZXJ2bGV0OworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0IHRoZSBmaWx0ZXIgY2xhc3MuCisgICAgICAgICAqCisgICAgICAgICAqIFRoZSByZWdpc3RlcmVkIHNlcnZsZXQgZmlsdGVyIHdpbGwgYmUgYWN0aXZlIGZvciB7QGxpbmsgRGlzcGF0Y2hlclR5cGUjUkVRVUVTVH0gZGlzcGF0Y2ggdHlwZXMgb25seS4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFNldHRpbmcgYSBmaWx0ZXIgY2xhc3MgcmVzZXRzIHRoZSBzZXJ2bGV0IGNsYXNzIGFuZCBzZXJ2bGV0IGluc3RhbmNlIHRvIHtAY29kZSBudWxsfS4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZmlsdGVyQ2xhc3MgdGhlIGZpbHRlciBjbGFzcyB0byBzZXJ2ZSB0aGUgYXBwbGljYXRpb24uCisgICAgICAgICAqIEByZXR1cm4gdGhpcyBzZXJ2bGV0IGRlcGxveW1lbnQgY29udGV4dCBidWlsZGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB7QGNvZGUgZmlsdGVyQ2xhc3N9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGZpbHRlckNsYXNzKENsYXNzPD8gZXh0ZW5kcyBGaWx0ZXI+IGZpbHRlckNsYXNzKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJDbGFzcyhmaWx0ZXJDbGFzcywgREVGQVVMVF9ESVNQQVRDSEVSX1RZUEVTKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXQgdGhlIGZpbHRlciBjbGFzcy4KKyAgICAgICAgICoKKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFNldHRpbmcgYSBmaWx0ZXIgY2xhc3MgcmVzZXRzIHRoZSBzZXJ2bGV0IGNsYXNzIGFuZCBzZXJ2bGV0IGluc3RhbmNlIHRvIHtAY29kZSBudWxsfS4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZmlsdGVyQ2xhc3MgICAgIHRoZSBmaWx0ZXIgY2xhc3MgdG8gc2VydmUgdGhlIGFwcGxpY2F0aW9uLgorICAgICAgICAgKiBAcGFyYW0gZGlzcGF0Y2hlclR5cGVzIGRpc3BhdGNoZXIgdHlwZXMgZm9yIHdoaWNoIHRoZSBmaWx0ZXIgc2hvdWxkIGJlIHJlZ2lzdGVyZWQuCisgICAgICAgICAqIEByZXR1cm4gdGhpcyBzZXJ2bGV0IGRlcGxveW1lbnQgY29udGV4dCBidWlsZGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiAgICAgaWYge0Bjb2RlIGZpbHRlckNsYXNzfSBvciB7QGNvZGUgZGlzcGF0Y2hlclR5cGVzfSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbiBjYXNlIHRoZSB7QGNvZGUgZGlzcGF0Y2hlclR5cGVzfSBpcyBlbXB0eS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGZpbHRlckNsYXNzKENsYXNzPD8gZXh0ZW5kcyBGaWx0ZXI+IGZpbHRlckNsYXNzLCBTZXQ8RGlzcGF0Y2hlclR5cGU+IGRpc3BhdGNoZXJUeXBlcykgeworICAgICAgICAgICAgaWYgKGZpbHRlckNsYXNzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIlRoZSBmaWx0ZXIgY2xhc3MgbXVzdCBub3QgYmUgbnVsbC4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy5zZXJ2bGV0Q2xhc3MgPSBudWxsOworICAgICAgICAgICAgdGhpcy5zZXJ2bGV0SW5zdGFuY2UgPSBudWxsOworICAgICAgICAgICAgcmV0dXJuIGFkZEZpbHRlcihmaWx0ZXJDbGFzcywgImplcnNleWZpbHRlciIsIENvbGxlY3Rpb25zLjxTdHJpbmcsIFN0cmluZz5lbXB0eU1hcCgpLCBkaXNwYXRjaGVyVHlwZXMpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBhIGZpbHRlciBjbGFzcy4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIEFkZGluZyBhIGZpbHRlciBjbGFzcyBET0VTIE5PVCByZXNldCB0aGUgc2VydmxldCBvciBmaWx0ZXIgY2xhc3Nlcy4gRmlsdGVyIHdpbGwgYmUgaW5zdGFudGlhdGVkIHdpdGhvdXQKKyAgICAgICAgICogaW5pdGlhbGl6YXRpb24gcGFyYW1ldGVycy4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZmlsdGVyQ2xhc3MgZmlsdGVyIGNsYXNzLiBNdXN0IG5vdCBiZSB7QGNvZGUgbnVsbH0uCisgICAgICAgICAqIEBwYXJhbSBmaWx0ZXJOYW1lICBmaWx0ZXIgbmFtZS4gTXVzdCBub3QgYmUge0Bjb2RlIG51bGx9IG9yIGVtcHR5IHN0cmluZy4KKyAgICAgICAgICogQHJldHVybiB0aGlzIHNlcnZsZXQgZGVwbG95bWVudCBjb250ZXh0IGJ1aWxkZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uICAgICBpZiB7QGNvZGUgZmlsdGVyQ2xhc3N9IG9yIHtAY29kZSBmaWx0ZXJOYW1lfSBpcyB7QGNvZGUgbnVsbH0uCisgICAgICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbiBjYXNlIHRoZSB7QGNvZGUgZmlsdGVyTmFtZX0gaXMgZW1wdHkuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRGaWx0ZXIoQ2xhc3M8PyBleHRlbmRzIEZpbHRlcj4gZmlsdGVyQ2xhc3MsIFN0cmluZyBmaWx0ZXJOYW1lKSB7CisgICAgICAgICAgICByZXR1cm4gYWRkRmlsdGVyKGZpbHRlckNsYXNzLCBmaWx0ZXJOYW1lLCBDb2xsZWN0aW9ucy48U3RyaW5nLCBTdHJpbmc+ZW1wdHlNYXAoKSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIGEgZmlsdGVyIGNsYXNzLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogQWRkaW5nIGEgZmlsdGVyIGNsYXNzIERPRVMgTk9UIHJlc2V0IHRoZSBzZXJ2bGV0IG9yIGZpbHRlciBjbGFzc2VzLiBGaWx0ZXIgd2lsbCBiZSBpbnN0YW50aWF0ZWQgd2l0aG91dAorICAgICAgICAgKiBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBmaWx0ZXJDbGFzcyBmaWx0ZXIgY2xhc3MuIE11c3Qgbm90IGJlIHtAY29kZSBudWxsfS4KKyAgICAgICAgICogQHBhcmFtIGZpbHRlck5hbWUgIGZpbHRlciBuYW1lLiBNdXN0IG5vdCBiZSB7QGNvZGUgbnVsbH0gb3IgZW1wdHkgc3RyaW5nLgorICAgICAgICAgKiBAcGFyYW0gaW5pdFBhcmFtcyAgZmlsdGVyIGluaXQgcGFyYW1ldGVycy4gTXVzdCBub3QgYmUge0Bjb2RlIG51bGx9LgorICAgICAgICAgKiBAcmV0dXJuIHRoaXMgc2VydmxldCBkZXBsb3ltZW50IGNvbnRleHQgYnVpbGRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHRocm93cyBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24gICAgIGlmIHtAY29kZSBmaWx0ZXJDbGFzc30gb3Ige0Bjb2RlIGZpbHRlck5hbWV9IG9yIHtAY29kZSBpbml0UGFyYW1zfQorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMge0Bjb2RlIG51bGx9LgorICAgICAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW4gY2FzZSB0aGUge0Bjb2RlIGZpbHRlck5hbWV9IGlzIGVtcHR5LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkRmlsdGVyKENsYXNzPD8gZXh0ZW5kcyBGaWx0ZXI+IGZpbHRlckNsYXNzLCBTdHJpbmcgZmlsdGVyTmFtZSwgTWFwPFN0cmluZywgU3RyaW5nPiBpbml0UGFyYW1zKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy5hZGRGaWx0ZXIoZmlsdGVyQ2xhc3MsIGZpbHRlck5hbWUsIGluaXRQYXJhbXMsIERFRkFVTFRfRElTUEFUQ0hFUl9UWVBFUyk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkIGEgZmlsdGVyIGNsYXNzLgorICAgICAgICAgKiA8cD4KKyAgICAgICAgICogQWRkaW5nIGEgZmlsdGVyIGNsYXNzIERPRVMgTk9UIHJlc2V0IHRoZSBzZXJ2bGV0IG9yIGZpbHRlciBjbGFzc2VzLiBGaWx0ZXIgd2lsbCBiZSBpbnN0YW50aWF0ZWQgd2l0aG91dAorICAgICAgICAgKiBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzLgorICAgICAgICAgKiA8L3A+CisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBmaWx0ZXJDbGFzcyAgICAgZmlsdGVyIGNsYXNzLiBNdXN0IG5vdCBiZSB7QGNvZGUgbnVsbH0uCisgICAgICAgICAqIEBwYXJhbSBmaWx0ZXJOYW1lICAgICAgZmlsdGVyIG5hbWUuIE11c3Qgbm90IGJlIHtAY29kZSBudWxsfSBvciBlbXB0eSBzdHJpbmcuCisgICAgICAgICAqIEBwYXJhbSBkaXNwYXRjaGVyVHlwZXMgZmlsdGVyIHdpbGwgYmUgcmVnaXN0ZXJlZCBmb3IgdGhlc2UgZGlzcGF0Y2hlciB0eXBlcy4gTXVzdCBub3QgYmUge0Bjb2RlIG51bGx9LgorICAgICAgICAgKiBAcmV0dXJuIHRoaXMgc2VydmxldCBkZXBsb3ltZW50IGNvbnRleHQgYnVpbGRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHRocm93cyBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24gICAgIGlmIHtAY29kZSBmaWx0ZXJDbGFzc30gb3Ige0Bjb2RlIGZpbHRlck5hbWV9IG9yIHtAY29kZSBkaXNwYXRjaGVyVHlwZXN9CisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyB7QGNvZGUgbnVsbH0uCisgICAgICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbiBjYXNlIHRoZSB7QGNvZGUgZmlsdGVyTmFtZX0gb3Ige0Bjb2RlIGRpc3BhdGNoZXJUeXBlc30gaXMgZW1wdHkuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRGaWx0ZXIoQ2xhc3M8PyBleHRlbmRzIEZpbHRlcj4gZmlsdGVyQ2xhc3MsIFN0cmluZyBmaWx0ZXJOYW1lLCBTZXQ8RGlzcGF0Y2hlclR5cGU+IGRpc3BhdGNoZXJUeXBlcykgeworICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWRkRmlsdGVyKGZpbHRlckNsYXNzLCBmaWx0ZXJOYW1lLCBDb2xsZWN0aW9ucy48U3RyaW5nLCBTdHJpbmc+ZW1wdHlNYXAoKSwgZGlzcGF0Y2hlclR5cGVzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgYSBmaWx0ZXIgY2xhc3MuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBBZGRpbmcgYSBmaWx0ZXIgY2xhc3MgRE9FUyBOT1QgcmVzZXQgdGhlIHNlcnZsZXQgb3IgZmlsdGVyIGNsYXNzZXMuIEZpbHRlciB3aWxsIGJlIGluc3RhbnRpYXRlZCB3aXRob3V0CisgICAgICAgICAqIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMuCisgICAgICAgICAqIDwvcD4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGZpbHRlckNsYXNzICAgICBmaWx0ZXIgY2xhc3MuIE11c3Qgbm90IGJlIHtAY29kZSBudWxsfS4KKyAgICAgICAgICogQHBhcmFtIGZpbHRlck5hbWUgICAgICBmaWx0ZXIgbmFtZS4gTXVzdCBub3QgYmUge0Bjb2RlIG51bGx9IG9yIGVtcHR5IHN0cmluZy4KKyAgICAgICAgICogQHBhcmFtIGluaXRQYXJhbXMgICAgICBmaWx0ZXIgaW5pdCBwYXJhbWV0ZXJzLiBNdXN0IG5vdCBiZSB7QGNvZGUgbnVsbH0uCisgICAgICAgICAqIEBwYXJhbSBkaXNwYXRjaGVyVHlwZXMgZmlsdGVyIHdpbGwgYmUgcmVnaXN0ZXJlZCBmb3IgdGhlc2UgZGlzcGF0Y2hlciB0eXBlcy4gTXVzdCBub3QgYmUge0Bjb2RlIG51bGx9LgorICAgICAgICAgKiBAcmV0dXJuIHRoaXMgc2VydmxldCBkZXBsb3ltZW50IGNvbnRleHQgYnVpbGRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHRocm93cyBqYXZhLmxhbmcuTnVsbFBvaW50ZXJFeGNlcHRpb24gICAgIGlmIHtAY29kZSBmaWx0ZXJDbGFzc30gb3Ige0Bjb2RlIGZpbHRlck5hbWV9IG9yIHtAY29kZSBpbml0UGFyYW1zfQorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3Ige0Bjb2RlIGRpc3BhdGNoZXJUeXBlc30gaXMge0Bjb2RlIG51bGx9LgorICAgICAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5JbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaW4gY2FzZSB0aGUge0Bjb2RlIGZpbHRlck5hbWV9IG9yIHtAY29kZSBkaXNwYXRjaGVyVHlwZXN9IGlzIGVtcHR5LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkRmlsdGVyKENsYXNzPD8gZXh0ZW5kcyBGaWx0ZXI+IGZpbHRlckNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZpbHRlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGluaXRQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQ8RGlzcGF0Y2hlclR5cGU+IGRpc3BhdGNoZXJUeXBlcykgeworICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVycyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIExpbmtlZExpc3Q8U3RyaW5nPiBudWxscyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICAgICAgICAgIGZpbmFsIExpbmtlZExpc3Q8U3RyaW5nPiBlbXB0aWVzID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgICAgICAgICAgaWYgKGZpbHRlckNsYXNzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBudWxscy5hZGQoImZpbHRlciBjbGFzcyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChmaWx0ZXJOYW1lID09IG51bGwpKSB7CisgICAgICAgICAgICAgICAgbnVsbHMuYWRkKCJmaWx0ZXIgbmFtZSIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChmaWx0ZXJOYW1lLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGVtcHRpZXMuYWRkKCJmaWx0ZXIgbmFtZSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGluaXRQYXJhbXMgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIG51bGxzLmFkZCgiaW5pdCBwYXJhbWV0ZXJzIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZGlzcGF0Y2hlclR5cGVzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBudWxscy5hZGQoImRpc3BhdGNoZXIgdHlwZXMiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZGlzcGF0Y2hlclR5cGVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGVtcHRpZXMuYWRkKCJkaXNwYXRjaGVyIHR5cGVzIik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghbnVsbHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIlRoZSAlcyBtdXN0IG5vdCBiZSBudWxsLiIsIG51bGxzLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZW1wdGllcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoIlRoZSAlcyBtdXN0IG5vdCBiZSBlbXB0eS4iLCBlbXB0aWVzLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy5maWx0ZXJzLmFkZChuZXcgRmlsdGVyRGVzY3JpcHRvcihmaWx0ZXJOYW1lLCBmaWx0ZXJDbGFzcywgaW5pdFBhcmFtcywgZGlzcGF0Y2hlclR5cGVzKSk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQnVpbGRlciBjb250ZXh0UGF0aChTdHJpbmcgY29udGV4dFBhdGgpIHsKKyAgICAgICAgICAgIHN1cGVyLmNvbnRleHRQYXRoKGNvbnRleHRQYXRoKTsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldCB0aGUgc2VydmxldCBwYXRoLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gc2VydmxldFBhdGggdGhlIHNlcnZsZXQgcGF0aCB0byB0aGUgYXBwbGljYXRpb24uIChTZWUgU2VydmxldCBzcGVjaWZpY2F0aW9uIGZvciBkZWZpbml0aW9uIG9mIHNlcnZsZXRQYXRoLikKKyAgICAgICAgICogQHJldHVybiB0aGlzIHNlcnZsZXQgZGVwbG95bWVudCBjb250ZXh0IGJ1aWxkZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEB0aHJvd3MgamF2YS5sYW5nLk51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHtAY29kZSBzZXJ2bGV0UGF0aH0gaXMge0Bjb2RlIG51bGx9LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEJ1aWxkZXIgc2VydmxldFBhdGgoU3RyaW5nIHNlcnZsZXRQYXRoKSB7CisgICAgICAgICAgICBpZiAoc2VydmxldFBhdGggPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiVGhlIHNlcnZsZXQgcGF0aCBtdXN0IG5vdCBiZSBudWxsLiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLnNlcnZsZXRQYXRoID0gc2VydmxldFBhdGg7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgZXZlbnQgbGlzdGVuZXIgY2xhc3MuCisgICAgICAgICAqIDxwPgorICAgICAgICAgKiBUaGUgZXZlbnQgbGlzdGVuZXIgc2hvdWxkIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR5cGVzOgorICAgICAgICAgKiA8dWw+CisgICAgICAgICAqIDxsaT57QGNvZGUgU2VydmxldENvbnRleHRMaXN0ZW5lcn08L2xpPgorICAgICAgICAgKiA8bGk+e0Bjb2RlIFNlcnZsZXRDb250ZXh0QXR0cmlidXRlTGlzdGVuZXJ9PC9saT4KKyAgICAgICAgICogPGxpPntAY29kZSBTZXJ2bGV0UmVxdWVzdExpc3RlbmVyfTwvbGk+CisgICAgICAgICAqIDxsaT57QGNvZGUgU2VydmxldFJlcXVlc3RBdHRyaWJ1dGVMaXN0ZW5lcn08L2xpPgorICAgICAgICAgKiA8bGk+e0Bjb2RlIEh0dHBTZXNzaW9uTGlzdGVuZXJ9PC9saT4KKyAgICAgICAgICogPGxpPntAY29kZSBIdHRwU2Vzc2lvbkFjdGl2YXRpb25MaXN0ZW5lcn08L2xpPgorICAgICAgICAgKiA8bGk+e0Bjb2RlIEh0dHBTZXNzaW9uQXR0cmlidXRlTGlzdGVuZXJ9PC9saT4KKyAgICAgICAgICogPC91bD4KKyAgICAgICAgICogPC9wPgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbGlzdGVuZXJDbGFzcyB0aGUgZXZlbnQgbGlzdGVuZXIgY2xhc3MuCisgICAgICAgICAqIEByZXR1cm4gdGhpcyBzZXJ2bGV0IGRlcGxveW1lbnQgY29udGV4dCBidWlsZGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAdGhyb3dzIGphdmEubGFuZy5OdWxsUG9pbnRlckV4Y2VwdGlvbiAgICAgaWYge0Bjb2RlIGxpc3RlbmVyQ2xhc3N9IGlzIHtAY29kZSBudWxsfS4KKyAgICAgICAgICogQHRocm93cyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHtAY29kZSBsaXN0ZW5lckNsYXNzfSBpcyBuZWl0aGVyIG9mIHRoZSBzdXBwb3J0ZWQgbGlzdGVuZXIgdHlwZXMgbGlzdGVkCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYm92ZS4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZExpc3RlbmVyKENsYXNzPD8gZXh0ZW5kcyBFdmVudExpc3RlbmVyPiBsaXN0ZW5lckNsYXNzKSB7CisgICAgICAgICAgICBpZiAobGlzdGVuZXJDbGFzcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJUaGUgc2VydmxldCBjb250ZXh0IGxpc3RlbmVyIGNsYXNzIG11c3Qgbm90IGJlIG51bGwiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFTZXJ2bGV0Q29udGV4dExpc3RlbmVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20obGlzdGVuZXJDbGFzcykKKyAgICAgICAgICAgICAgICAgICAgJiYgIVNlcnZsZXRDb250ZXh0QXR0cmlidXRlTGlzdGVuZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShsaXN0ZW5lckNsYXNzKQorICAgICAgICAgICAgICAgICAgICAmJiAhU2VydmxldFJlcXVlc3RMaXN0ZW5lci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGxpc3RlbmVyQ2xhc3MpCisgICAgICAgICAgICAgICAgICAgICYmICFTZXJ2bGV0UmVxdWVzdEF0dHJpYnV0ZUxpc3RlbmVyLmNsYXNzLmlzQXNzaWduYWJsZUZyb20obGlzdGVuZXJDbGFzcykKKyAgICAgICAgICAgICAgICAgICAgJiYgIUh0dHBTZXNzaW9uTGlzdGVuZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShsaXN0ZW5lckNsYXNzKQorICAgICAgICAgICAgICAgICAgICAmJiAhSHR0cFNlc3Npb25BY3RpdmF0aW9uTGlzdGVuZXIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShsaXN0ZW5lckNsYXNzKQorICAgICAgICAgICAgICAgICAgICAmJiAhSHR0cFNlc3Npb25BdHRyaWJ1dGVMaXN0ZW5lci5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGxpc3RlbmVyQ2xhc3MpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgZXZlbnQgbGlzdGVuZXIgdHlwZS4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHRoaXMubGlzdGVuZXJzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmxpc3RlbmVycyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5hZGQobGlzdGVuZXJDbGFzcyk7CisgICAgICAgICAgICByZXR1cm4gdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBCdWlsZCBhIG5ldyBzZXJ2bGV0IGRlcGxveW1lbnQgY29udGV4dCBjb25maWd1cmVkIGJ5IHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoaXMKKyAgICAgICAgICogc2VydmxldCBkZXBsb3ltZW50IGNvbnRleHQgYnVpbGRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB0aGlzIHNlcnZsZXQgZGVwbG95bWVudCBjb250ZXh0IGJ1aWxkZXIuCisgICAgICAgICAqLworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFNlcnZsZXREZXBsb3ltZW50Q29udGV4dCBidWlsZCgpIHsKKyAgICAgICAgICAgIFNlcnZsZXREZXBsb3ltZW50Q29udGV4dCB3ZCA9IG5ldyBTZXJ2bGV0RGVwbG95bWVudENvbnRleHQodGhpcyk7CisgICAgICAgICAgICByZXNldCgpOworICAgICAgICAgICAgcmV0dXJuIHdkOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIHJlc2V0KCkgeworICAgICAgICAgICAgc3VwZXIucmVzZXQoKTsKKyAgICAgICAgICAgIHRoaXMuaW5pdFBhcmFtcyA9IG51bGw7CisgICAgICAgICAgICB0aGlzLmNvbnRleHRQYXJhbXMgPSBudWxsOworICAgICAgICAgICAgdGhpcy5zZXJ2bGV0SW5zdGFuY2UgPSBudWxsOworICAgICAgICAgICAgdGhpcy5zZXJ2bGV0Q2xhc3MgPSBTZXJ2bGV0Q29udGFpbmVyLmNsYXNzOworICAgICAgICAgICAgdGhpcy5maWx0ZXJzID0gbnVsbDsKKyAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzID0gbnVsbDsKKyAgICAgICAgICAgIHRoaXMuc2VydmxldFBhdGggPSAiIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEhlbHBlciBjbGFzcyB0byBrZWVwIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gb2YgYSBzaW5nbGUgZmlsdGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmlsdGVyRGVzY3JpcHRvciB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZmlsdGVyTmFtZTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDbGFzczw/IGV4dGVuZHMgRmlsdGVyPiBmaWx0ZXJDbGFzczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IGluaXRQYXJhbXM7CisgICAgICAgIHByaXZhdGUgZmluYWwgU2V0PERpc3BhdGNoZXJUeXBlPiBkaXNwYXRjaGVyVHlwZXM7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhIG5ldyBkZXNjcmlwdG9yLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZmlsdGVyTmFtZSAgICAgIE5hbWUgZm9yIHRoZSBmaWx0ZXIgcmVnaXN0cmF0aW9uLgorICAgICAgICAgKiBAcGFyYW0gZmlsdGVyQ2xhc3MgICAgIFNlcnZsZXQgZmlsdGVyIGNsYXNzLgorICAgICAgICAgKiBAcGFyYW0gaW5pdFBhcmFtcyAgICAgIFNlcnZsZXQgZmlsdGVyIGluaXQgcGFyYW1ldGVycy4KKyAgICAgICAgICogQHBhcmFtIGRpc3BhdGNoZXJUeXBlcyBkaXNwYXRjaGVyIHR5cGVzIGZvciB3aGljaCB0aGUgZmlsdGVyIHNob3VsZCBiZSByZWdpc3RlcmVkLgorICAgICAgICAgKi8KKyAgICAgICAgcHJpdmF0ZSBGaWx0ZXJEZXNjcmlwdG9yKAorICAgICAgICAgICAgICAgIFN0cmluZyBmaWx0ZXJOYW1lLCBDbGFzczw/IGV4dGVuZHMgRmlsdGVyPiBmaWx0ZXJDbGFzcywKKyAgICAgICAgICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGluaXRQYXJhbXMsCisgICAgICAgICAgICAgICAgU2V0PERpc3BhdGNoZXJUeXBlPiBkaXNwYXRjaGVyVHlwZXMpIHsKKworICAgICAgICAgICAgdGhpcy5maWx0ZXJOYW1lID0gZmlsdGVyTmFtZTsKKyAgICAgICAgICAgIHRoaXMuZmlsdGVyQ2xhc3MgPSBmaWx0ZXJDbGFzczsKKyAgICAgICAgICAgIHRoaXMuaW5pdFBhcmFtcyA9IGluaXRQYXJhbXM7CisgICAgICAgICAgICB0aGlzLmRpc3BhdGNoZXJUeXBlcyA9IGRpc3BhdGNoZXJUeXBlczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgZmlsdGVyIGNsYXNzLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIGZpbHRlciBjbGFzcy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBDbGFzczw/IGV4dGVuZHMgRmlsdGVyPiBnZXRGaWx0ZXJDbGFzcygpIHsKKyAgICAgICAgICAgIHJldHVybiBmaWx0ZXJDbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgZmlsdGVyIG5hbWUuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gZmlsdGVyIG5hbWUuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEZpbHRlck5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gZmlsdGVyTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgZmlsdGVyIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gZmlsdGVyIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgTWFwPFN0cmluZywgU3RyaW5nPiBnZXRJbml0UGFyYW1zKCkgeworICAgICAgICAgICAgcmV0dXJuIGluaXRQYXJhbXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IGZpbHRlciBkaXNwYXRjaGVyIHR5cGUgc2V0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIGZpbHRlciBkaXNwYXRjaGVyIHR5cGUgc2V0LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFNldDxEaXNwYXRjaGVyVHlwZT4gZ2V0RGlzcGF0Y2hlclR5cGVzKCkgeworICAgICAgICAgICAgcmV0dXJuIGRpc3BhdGNoZXJUeXBlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBpbml0UGFyYW1zOworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBjb250ZXh0UGFyYW1zOworICAgIHByaXZhdGUgZmluYWwgQ2xhc3M8PyBleHRlbmRzIEh0dHBTZXJ2bGV0PiBzZXJ2bGV0Q2xhc3M7CisgICAgcHJpdmF0ZSBmaW5hbCBIdHRwU2VydmxldCBzZXJ2bGV0SW5zdGFuY2U7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEZpbHRlckRlc2NyaXB0b3I+IGZpbHRlcnM7CisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PENsYXNzPD8gZXh0ZW5kcyBFdmVudExpc3RlbmVyPj4gbGlzdGVuZXJzOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHNlcnZsZXRQYXRoOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyBzZXJ2bGV0IGRlcGxveW1lbnQgY29udGV4dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiIHtAbGluayBCdWlsZGVyfSBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU2VydmxldERlcGxveW1lbnRDb250ZXh0KEJ1aWxkZXIgYikgeworICAgICAgICBzdXBlcihiKTsKKworICAgICAgICB0aGlzLmluaXRQYXJhbXMgPSAoYi5pbml0UGFyYW1zID09IG51bGwpID8gQ29sbGVjdGlvbnMuPFN0cmluZywgU3RyaW5nPmVtcHR5TWFwKCkgOiBiLmluaXRQYXJhbXM7CisgICAgICAgIHRoaXMuY29udGV4dFBhcmFtcyA9IChiLmNvbnRleHRQYXJhbXMgPT0gbnVsbCkgPyBDb2xsZWN0aW9ucy48U3RyaW5nLCBTdHJpbmc+ZW1wdHlNYXAoKSA6IGIuY29udGV4dFBhcmFtczsKKyAgICAgICAgdGhpcy5zZXJ2bGV0Q2xhc3MgPSBiLnNlcnZsZXRDbGFzczsKKyAgICAgICAgdGhpcy5zZXJ2bGV0SW5zdGFuY2UgPSBiLnNlcnZsZXRJbnN0YW5jZTsKKyAgICAgICAgdGhpcy5maWx0ZXJzID0gYi5maWx0ZXJzOworICAgICAgICB0aGlzLnNlcnZsZXRQYXRoID0gYi5zZXJ2bGV0UGF0aDsKKyAgICAgICAgdGhpcy5saXN0ZW5lcnMgPSAoYi5saXN0ZW5lcnMgPT0gbnVsbCkKKyAgICAgICAgICAgICAgICA/IENvbGxlY3Rpb25zLjxDbGFzczw/IGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4+ZW1wdHlMaXN0KCkgOiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KGIubGlzdGVuZXJzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzLgorICAgICAqLworICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldEluaXRQYXJhbXMoKSB7CisgICAgICAgIHJldHVybiBpbml0UGFyYW1zOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgY29udGV4dCBwYXJhbWV0ZXJzLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgY29udGV4dCBwYXJhbWV0ZXJzLgorICAgICAqLworICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldENvbnRleHRQYXJhbXMoKSB7CisgICAgICAgIHJldHVybiBjb250ZXh0UGFyYW1zOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgc2VydmxldCBjbGFzcy4KKyAgICAgKiA8cD4KKyAgICAgKiBOb3RlIHRoYXQgc2VydmxldCBjbGFzcyBhbmQge0BsaW5rICNnZXRTZXJ2bGV0SW5zdGFuY2UoKSBzZXJ2bGV0IGluc3RhbmNlfSBjYW4gZWl0aGVyIGJlIGJvdGgge0Bjb2RlIG51bGx9CisgICAgICogb3Igb25lIG9mIHRoZW0gaXMgc3BlY2lmaWVkIGV4Y2x1c2l2ZWx5IChpLmUuIHNlcnZsZXQgY2xhc3MgYW5kIHNlcnZsZXQgaW5zdGFuY2UgY2Fubm90IGJlIGJvdGggbm90IHtAY29kZSBudWxsfQorICAgICAqIGF0IHRoZSBzYW1lIHRpbWUpLgorICAgICAqIDwvcD4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHNlcnZsZXQgY2xhc3MuCisgICAgICoKKyAgICAgKiBAc2VlICNnZXRTZXJ2bGV0SW5zdGFuY2UoKQorICAgICAqLworICAgIHB1YmxpYyBDbGFzczw/IGV4dGVuZHMgSHR0cFNlcnZsZXQ+IGdldFNlcnZsZXRDbGFzcygpIHsKKyAgICAgICAgcmV0dXJuIHNlcnZsZXRDbGFzczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHNlcnZsZXQgaW5zdGFuY2UuCisgICAgICogPHA+CisgICAgICogTm90ZSB0aGF0IHtAbGluayAjZ2V0U2VydmxldENsYXNzKCkgc2VydmxldCBjbGFzc30gYW5kIHNlcnZsZXQgaW5zdGFuY2UgY2FuIGVpdGhlciBiZSBib3RoIHtAY29kZSBudWxsfQorICAgICAqIG9yIG9uZSBvZiB0aGVtIGlzIHNwZWNpZmllZCBleGNsdXNpdmVseSAoaS5lLiBzZXJ2bGV0IGNsYXNzIGFuZCBzZXJ2bGV0IGluc3RhbmNlIGNhbm5vdCBiZSBib3RoIG5vdCB7QGNvZGUgbnVsbH0KKyAgICAgKiBhdCB0aGUgc2FtZSB0aW1lKS4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBzZXJ2bGV0IGluc3RhbmNlLgorICAgICAqCisgICAgICogQHNlZSAjZ2V0U2VydmxldENsYXNzKCkKKyAgICAgKi8KKyAgICBwdWJsaWMgSHR0cFNlcnZsZXQgZ2V0U2VydmxldEluc3RhbmNlKCkgeworICAgICAgICByZXR1cm4gc2VydmxldEluc3RhbmNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCB0aGUgZmlsdGVyIGNsYXNzLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgZmlsdGVyIGNsYXNzZXMuCisgICAgICovCisgICAgcHVibGljIExpc3Q8RmlsdGVyRGVzY3JpcHRvcj4gZ2V0RmlsdGVycygpIHsKKyAgICAgICAgcmV0dXJuIGZpbHRlcnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBzZXJ2bGV0IHBhdGguCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBzZXJ2bGV0IHBhdGguCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIHNlcnZsZXRQYXRoOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhbGwgdGhlIHJlZ2lzdGVyZWQgTGlzdGVuZXIgY2xhc3NlcworICAgICAqCisgICAgICogQHJldHVybiB0aGUgcmVnaXN0ZXJlZCBsaXN0ZW5lciBjbGFzc2VzLCBvciB7QGNvZGUgbnVsbH0gaWYgbm9uZSBpcyByZWdpc3RlcmVkLgorICAgICAqLworICAgIHB1YmxpYyBMaXN0PENsYXNzPD8gZXh0ZW5kcyBFdmVudExpc3RlbmVyPj4gZ2V0TGlzdGVuZXJzKCkgeworICAgICAgICByZXR1cm4gbGlzdGVuZXJzOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvVGVzdFByb3BlcnRpZXMuamF2YSBiL3Rlc3QtZnJhbWV3b3JrL2NvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L1Rlc3RQcm9wZXJ0aWVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MxYzZlNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZnJhbWV3b3JrL2NvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L1Rlc3RQcm9wZXJ0aWVzLmphdmEKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUHJvcGVydGllc0NsYXNzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCisvKioKKyAqIEplcnNleSB0ZXN0IGZyYW1ld29yayBjb25maWd1cmF0aW9uIHByb3BlcnRpZXMuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQFByb3BlcnRpZXNDbGFzcworcHVibGljIGZpbmFsIGNsYXNzIFRlc3RQcm9wZXJ0aWVzIHsKKworICAgIC8qKgorICAgICAqIElmIHNldCB0byB7QGNvZGUgdHJ1ZX0gdGhlIHByb3BlcnR5IGVuYWJsZXMgYmFzaWMgbG9nZ2luZyBvZiB0aGUgcmVxdWVzdCBhbmQKKyAgICAgKiByZXNwb25zZSBmbG93IG9uIGJvdGggLSBjbGllbnQgYW5kIHNlcnZlci4gTm90ZSB0aGF0IHRyYWZmaWMgbG9nZ2luZyBkb2VzIG5vdAorICAgICAqIGR1bXAgbWVzc2FnZSBlbnRpdGllcyBieSBkZWZhdWx0LiBQbGVhc2Ugc2VlIHtAbGluayAjRFVNUF9FTlRJVFl9IGRvY3VtZW50YXRpb24KKyAgICAgKiBmb3IgaW5zdHJ1Y3Rpb25zIGhvdyB0byBlbmFibGUgZW50aXR5IGNvbnRlbnQgZHVtcGluZy4KKyAgICAgKiA8cC8+CisgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMge0Bjb2RlIGZhbHNlfS4KKyAgICAgKiA8cC8+CisgICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gcHJvcGVydHkgaXMgPHR0PntAdmFsdWV9PC90dD4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTE9HX1RSQUZGSUMgPSAiamVyc2V5LmNvbmZpZy50ZXN0LmxvZ2dpbmcuZW5hYmxlIjsKKworICAgIC8qKgorICAgICAqIElmIHNldCB0byB7QGNvZGUgdHJ1ZX0gdGhlIHByb3BlcnR5IGluc3RydWN0cyB0aGUgdGVzdCB0cmFmZmljIGxvZ2dlciB0bworICAgICAqIGR1bXAgbWVzc2FnZSBlbnRpdGllcyBhcyBwYXJ0IG9mIHRoZSB0ZXN0IHRyYWZmaWMgbG9nZ2luZy4gTWVzc2FnZSBlbnRpdHkKKyAgICAgKiBkdW1waW5nIGlzIHR1cm5lZCBvZmYgYnkgZGVmYXVsdCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4gTm90ZSB0aGF0IHRoZQorICAgICAqIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSB3aWxsIGJlIGlnbm9yZWQgdW5sZXNzIHtAbGluayAjTE9HX1RSQUZGSUMgdHJhZmZpYworICAgICAqIGxvZ2dpbmd9IGlzIGVuYWJsZWQgdG9vLgorICAgICAqIDxwLz4KKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB7QGNvZGUgZmFsc2V9LgorICAgICAqIDxwLz4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBEVU1QX0VOVElUWSA9ICJqZXJzZXkuY29uZmlnLnRlc3QubG9nZ2luZy5kdW1wRW50aXR5IjsKKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB0aGUge0BsaW5rIFRlc3RDb250YWluZXJGYWN0b3J5IHRlc3QgY29udGFpbmVyIGZhY3Rvcnl9IGltcGxlbWVudGF0aW9uCisgICAgICogY2xhc3MgdG8gYmUgdXNlZCB0byBjcmVhdGUgYSB0ZXN0IGNvbnRhaW5lciBpbnN0YW5jZSBmb3IgdGhlIHRlc3QuIFRoZSB2YWx1ZQorICAgICAqIG9mIHRoZSBwcm9wZXJ0eSBtdXN0IGJlIGEge0Bjb2RlIFN0cmluZ30gaWRlbnRpZnlpbmcgYSB2YWxpZCwgZnVsbHkgcXVhbGlmaWVkCisgICAgICogbmFtZSBvZiBhIHRlc3QgY29udGFpbmVyIGZhY3RvcnkgaW1wbGVtZW50YXRpb24gY2xhc3MsIG90aGVyd2lzZSBpdCB3aWxsCisgICAgICogYmUgaWdub3JlZC4KKyAgICAgKiA8cC8+CisgICAgICogVGhlIGRlZmF1bHQgdmFsdWUgaXMgPHR0PntAdmFsdWUgI0RFRkFVTFRfQ09OVEFJTkVSX0ZBQ1RPUll9PC90dD4uCisgICAgICogPHAvPgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDx0dD57QHZhbHVlfTwvdHQ+LgorICAgICAqCisgICAgICogQHNlZSAjQ09OVEFJTkVSX1BPUlQKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UQUlORVJfRkFDVE9SWSA9ICJqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3RvcnkiOworCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIHRoZSBkZWZhdWx0IHtAbGluayBUZXN0Q29udGFpbmVyRmFjdG9yeSB0ZXN0IGNvbnRhaW5lciBmYWN0b3J5fQorICAgICAqIGltcGxlbWVudGF0aW9uIGNsYXNzIHRvIGJlIHVzZWQgdG8gY3JlYXRlIGEgdGVzdCBjb250YWluZXIgaW5zdGFuY2UgZm9yIHRoZQorICAgICAqIHRlc3QuCisgICAgICoKKyAgICAgKiBAc2VlICNDT05UQUlORVJfRkFDVE9SWQorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQ09OVEFJTkVSX0ZBQ1RPUlkgPSAib3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5ncml6emx5LkdyaXp6bHlUZXN0Q29udGFpbmVyRmFjdG9yeSI7CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWZpZXMgdGhlIG5ldHdvcmsgY29ubmVjdGlvbiBwb3J0IHRvIGJlIHVzZWQgYnkgYW4gYWN0aXZlIHRlc3QgY29udGFpbmVyCisgICAgICogZm9yIHRlc3QgYXBwbGljYXRpb24gZGVwbG95bWVudC4gVGhlIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBtdXN0IGJlIGEgdmFsaWQKKyAgICAgKiBwb3NpdGl2ZSBpbnRlZ2VyLCBvdGhlcndpc2UgaXQgd2lsbCBiZSBpZ25vcmVkLgorICAgICAqIDxwLz4KKyAgICAgKiBJZiB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IGlzIHtAY29kZSAwfSB0aGVuIGZpcnN0IGF2YWlsYWJsZSBwb3J0IGlzIHVzZWQuCisgICAgICogPHAvPgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDx0dD57QHZhbHVlICNERUZBVUxUX0NPTlRBSU5FUl9QT1JUfTwvdHQ+LgorICAgICAqIDxwLz4KKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBwcm9wZXJ0eSBpcyA8dHQ+e0B2YWx1ZX08L3R0Pi4KKyAgICAgKgorICAgICAqIEBzZWUgI0NPTlRBSU5FUl9GQUNUT1JZCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEFJTkVSX1BPUlQgPSAiamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0IjsKKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB0aGUgZGVmYXVsdCBuZXR3b3JrIGNvbm5lY3Rpb24gcG9ydCB0byBiZSB1c2VkIGJ5IGFuIGFjdGl2ZSB0ZXN0CisgICAgICogY29udGFpbmVyIGZvciB0ZXN0IGFwcGxpY2F0aW9uIGRlcGxveW1lbnQuCisgICAgICoKKyAgICAgKiBAc2VlICNDT05UQUlORVJfUE9SVAorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQ09OVEFJTkVSX1BPUlQgPSA5OTk4OworCisgICAgLyoqCisgICAgICogSWYgc2V0IHRvIGEgbnVtZXJpYyB2YWx1ZSB0aGVuIHRoaXMgcHJvcGVydHkgZW5hYmxlcyB0byBzdG9yZSBsb2cgcmVjb3JkcyBhdCB7QGxpbmsgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWwgbG9nIGxldmVsfQorICAgICAqIHZhbHVlIChvciBoaWdoZXIpIGRlZmluZWQgYnkgdGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkuCisgICAgICogTG9nIHJlY29yZHMgY2FuIGJlIHJldHJpZXZlZCBpbiB0ZXN0cyB1c2luZyB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0I2dldExvZ2dlZFJlY29yZHMoKX0uCisgICAgICogPHAvPgorICAgICAqIFRoaXMgcHJvcGVydHkgaXMgbm90IHN1cHBvcnRlZCBmb3IgcGFyYWxsZWwgdGVzdHMuCisgICAgICogPHAvPgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDx0dD57QHZhbHVlfTwvdHQ+LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQ09SRF9MT0dfTEVWRUwgPSAiamVyc2V5LmNvbmZpZy50ZXN0LmxvZ2dpbmcucmVjb3JkLmxldmVsIjsKKworICAgIC8qKgorICAgICAqIFNwZWNpZmllcyB0aGUgbXVsdGlwbGllciB3aGljaCB3aWxsIGJlIGFwcGxpZWQgdG8gdGltZW91dHMgZm9yIGFzeW5jaHJvbm91cyB0ZXN0cy4gVGhpcyBwcm9wZXJ0eSBpcyB1c2VmdWwgdG8gYmUKKyAgICAgKiBkZWZpbmVkIGlmIHRoZXJlIGFyZSBwcm9ibGVtcyB3aXRoIGVudmlyb25tZW50IGluIHdoaWNoIHRlc3RzIHJ1biBhbmQgdGVzdHMgZmFpbCBmb3IgdGltZW91dCBkdWUgdG8gc2xvdworICAgICAqIHByb2Nlc3NpbmcuCisgICAgICogPHA+CisgICAgICogRm9yIGV4YW1wbGUgaWYgdGhlIHRpbWVvdXQgZm9yIGFzeW5jaHJvbm91cyB0ZXN0IGlzIDUgc2Vjb25kcyBhbmQgdGhpcyBwcm9wZXJ0eSBpcyBkZWZpbmVkIHRvIDMKKyAgICAgKiB0aGVuIHRoZSB0aW1lb3V0IGZpbmFsIHdpbGwgYmUgMTUuCisgICAgICogPC9wPgorICAgICAqCisgICAgICogPHAvPgorICAgICAqIFRoZSBwcm9wZXJ0eSBtdXN0IGJlIGFuIGludGVnZXIgdmFsdWUgZ3JlYXRlciB0aGFuIDEuCisgICAgICogPHAvPgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDx0dD4xPC90dD4uCisgICAgICogPHAvPgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDx0dD57QHZhbHVlfTwvdHQ+LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFTWU5DX1RJTUVPVVRfTVVMVElQTElFUiA9ICJqZXJzZXkuY29uZmlnLnRlc3QuYXN5bmMudGltZW91dC5tdWx0aXBsaWVyIjsKKworICAgIHByaXZhdGUgVGVzdFByb3BlcnRpZXMoKSB7CisgICAgICAgIC8vIHByZXZlbnRzIGluc3RhbnRpYXRpb24KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0LWZyYW1ld29yay9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9wYWNrYWdlLWluZm8uamF2YSBiL3Rlc3QtZnJhbWV3b3JrL2NvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwYjgxMDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvKioKKyAqIEplcnNleSB0ZXN0IGZyYW1ld29yayBjb21tb24gY2xhc3NlcyB0aGF0IHN1cHBvcnQgdGVzdGluZyBKQVgtUlMgYW5kIEplcnNleS1iYXNlZCBhcHBsaWNhdGlvbnMuCisgKgorICogVGhlIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3R9IGNsYXNzIG1heSBiZSBleHRlbmRlZCB0byBkZWZpbmUgdGhlIHRlc3RpbmcKKyAqIGNvbmZpZ3VyYXRpb24gYW5kIGZ1bmN0aW9uYWxpdHkuCisgKiA8cD4KKyAqIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGNsYXNzIGlzIGNvbmZpZ3VyZWQgdG8gdXNlIEdyaXp6bHkgSFRUUCB0ZXN0IGNvbnRhaW5lciBmYWN0b3J5LAorICoge0Bjb2RlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZ3JpenpseS5Hcml6emx5VGVzdENvbnRhaW5lckZhY3Rvcnl9IGFuZCB0ZXN0IHRoYXQgYSBzaW1wbGUgcmVzb3VyY2UKKyAqIHtAY29kZSBUZXN0UmVzb3VyY2V9IHJldHVybnMgdGhlIGV4cGVjdGVkIHJlc3VsdHMgZm9yIGEgSFRUUCBHRVQgcmVxdWVzdDoKKyAqIDwvcD4KKyAqIDxwcmU+CisgKiBwdWJsaWMgY2xhc3MgU2ltcGxlR3JpenpseUJhc2VkVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworICoKKyAqICAgJiM2NDtQYXRoKCJyb290IikKKyAqICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0UmVzb3VyY2UgeworICogICAgICYjNjQ7R0VUCisgKiAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgKiAgICAgICByZXR1cm4gIkdFVCI7CisgKiAgICAgfQorICogICB9CisgKgorICogICAmIzY0O092ZXJyaWRlCisgKiAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgKiAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKyAqICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFRlc3RSZXNvdXJjZS5jbGFzcyk7CisgKiAgIH0KKyAqCisgKiAgICYjNjQ7T3ZlcnJpZGUKKyAqICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgeworICogICAgIHJldHVybiBuZXcgR3JpenpseVRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgKiAgIH0KKyAqCisgKiAgICYjNjQ7VGVzdAorICogICBwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgeworICogICAgIFdlYlRhcmdldCB0ID0gdGFyZ2V0KCJyb290Iik7CisgKgorICogICAgIFN0cmluZyBzID0gdC5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgKiAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiR0VUIiwgcyk7CisgKiAgIH0KKyAqIH0KKyAqIDwvcHJlPgorICogPHA+CisgKiBUaGUgZm9sbG93aW5nIHRlc3RzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgdXNpbmcgdGhlIFNlcnZsZXQtYmFzZWQgR3JpenpseSB0ZXN0IGNvbnRhaW5lciBmYWN0b3J5LAorICoge0Bjb2RlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZ3JpenpseS5Hcml6emx5V2ViVGVzdENvbnRhaW5lckZhY3Rvcnl9OgorICogPC9wPgorICogPHByZT4KKyAqIHB1YmxpYyBjbGFzcyBXZWJCYXNlZFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKyAqCisgKiAgICYjNjQ7UGF0aCgicm9vdCIpCisgKiAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFJlc291cmNlIHsKKyAqICAgICAmIzY0O0dFVAorICogICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICogICAgICAgcmV0dXJuICJHRVQiOworICogICAgIH0KKyAqICAgfQorICoKKyAqICAgJiM2NDtPdmVycmlkZQorICogICBwcm90ZWN0ZWQgRGVwbG95bWVudENvbnRleHQgY29uZmlndXJlRGVwbG95bWVudCgpIHsKKyAqICAgICByZXR1cm4gU2VydmxldERlcGxveW1lbnRDb250ZXh0LmJ1aWxkZXIoImZvbyIpCisgKiAgICAgICAgICAgICAuY29udGV4dFBhdGgoImNvbnRleHQiKS5idWlsZCgpOworICogICB9CisgKgorICogICAmIzY0O092ZXJyaWRlCisgKiAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHsKKyAqICAgICByZXR1cm4gbmV3IEdyaXp6bHlUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICogICB9CisgKgorICogICAmIzY0O1Rlc3QKKyAqICAgcHVibGljIHZvaWQgdGVzdEdldCgpIHsKKyAqICAgICBXZWJUYXJnZXQgdCA9IHRhcmdldCgicm9vdCIpOworICoKKyAqICAgICBTdHJpbmcgcyA9IHQucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICogICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkdFVCIsIHMpOworICogICB9CisgKiB9CisgKiA8L3ByZT4KKyAqIDxwPgorICogVGhlIGFib3ZlIHRlc3QgaXMgYWN0dWFsbHkgbm90IHNwZWNpZmljIHRvIGFueSBTZXJ2bGV0LWJhc2VkIHRlc3QgY29udGFpbmVyIGZhY3RvcnkgYW5kIHdpbGwgd29yayBmb3IgYWxsCisgKiBwcm92aWRlZCB0ZXN0IGNvbnRhaW5lciBmYWN0b3JpZXMuIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvbiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0fSBmb3IKKyAqIG1vcmUgZGV0YWlscyBvbiBob3cgdG8gc2V0IHRoZSBkZWZhdWx0IHRlc3QgY29udGFpbmVyIGZhY3RvcnkuCisgKiA8L3A+CisgKi8KK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdDsKZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL2NvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L3NwaS9SZXF1aXJlcy5qYXZhIGIvdGVzdC1mcmFtZXdvcmsvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3Qvc3BpL1JlcXVpcmVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBjNTUzOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZnJhbWV3b3JrL2NvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L3NwaS9SZXF1aXJlcy5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGk7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Jbmhlcml0ZWQ7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKKy8qKgorICogVE9ETworICovCitASW5oZXJpdGVkCitAVGFyZ2V0KHtFbGVtZW50VHlwZS5UWVBFfSkKK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitwdWJsaWMgQGludGVyZmFjZSBSZXF1aXJlcyB7CisgICAgU3RyaW5nW10gdmFsdWUoKSBkZWZhdWx0KCIiKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL2NvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L3NwaS9TdXBwb3J0cy5qYXZhIGIvdGVzdC1mcmFtZXdvcmsvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3Qvc3BpL1N1cHBvcnRzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBlYTlkOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZnJhbWV3b3JrL2NvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L3NwaS9TdXBwb3J0cy5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGk7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Jbmhlcml0ZWQ7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKKy8qKgorICogVE9ETworICovCitASW5oZXJpdGVkCitAVGFyZ2V0KHtFbGVtZW50VHlwZS5UWVBFfSkKK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitwdWJsaWMgQGludGVyZmFjZSBTdXBwb3J0cyB7CisgICAgU3RyaW5nW10gdmFsdWUoKSBkZWZhdWx0KCIiKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL2NvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L3NwaS9UZXN0Q29udGFpbmVyLmphdmEgYi90ZXN0LWZyYW1ld29yay9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9zcGkvVGVzdENvbnRhaW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4YTViZjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9zcGkvVGVzdENvbnRhaW5lci5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGk7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworCisvKioKKyAqIEEgdGVzdCBjb250YWluZXIuCisgKiA8cC8+CisgKiBBbiBpbnN0YW5jZSBvZiBhIHRlc3QgY29udGFpbmVyIGNhbiBiZSBzdGFydGVkIGFuZCBzdG9wcGVkIG9ubHkgb25jZSB0byBwcmV2ZW50IHRlc3QgY29ycnVwdGlvbi4gRm9yIGFub3RoZXIgdGVzdCBhIG5ldyB0ZXN0CisgKiBjb250YWluZXIgaW5zdGFuY2UgaGFzIHRvIGJlIGNyZWF0ZWQuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitwdWJsaWMgaW50ZXJmYWNlIFRlc3RDb250YWluZXIgeworCisgICAgLyoqCisgICAgICogR2V0IGEgY2xpZW50IGNvbmZpZ3VyYXRpb24gc3BlY2lmaWMgdG8gdGhlIHRlc3QgY29udGFpbmVyLgorICAgICAqCisgICAgICogQHJldHVybiBhIGNsaWVudCBjb25maWd1cmF0aW9uIHNwZWNpZmljIHRvIHRoZSB0ZXN0IGNvbnRhaW5lciwgb3RoZXJ3aXNlIHtAY29kZSBudWxsfSBpZiB0aGVyZQorICAgICAqICAgICAgICAgaXMgbm8gc3BlY2lmaWMgY2xpZW50IGNvbmZpZ3VyYXRpb24gcmVxdWlyZWQuCisgICAgICovCisgICAgcHVibGljIENsaWVudENvbmZpZyBnZXRDbGllbnRDb25maWcoKTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgYmFzZSBVUkkgb2YgdGhlIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgYmFzZSBVUkkgb2YgdGhlIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBVUkkgZ2V0QmFzZVVyaSgpOworCisgICAgLyoqCisgICAgICogU3RhcnQgdGhlIGNvbnRhaW5lci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpOworCisgICAgLyoqCisgICAgICogU3RvcCB0aGUgY29udGFpbmVyLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHN0b3AoKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL2NvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L3NwaS9UZXN0Q29udGFpbmVyRXhjZXB0aW9uLmphdmEgYi90ZXN0LWZyYW1ld29yay9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9zcGkvVGVzdENvbnRhaW5lckV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MThhYzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9zcGkvVGVzdENvbnRhaW5lckV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGk7CisKKy8qKgorICogVGhyb3duIHdoZW4gYSB0ZXN0IGNvbnRhaW5lci1zcGVjaWZpYyBlcnJvciBvY2N1cnMuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitwdWJsaWMgY2xhc3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDQxMTY3MTAwMDc1MjQyMjE5MTRMOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIHdpdGggbm8gbWVzc2FnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGVzdENvbnRhaW5lckV4Y2VwdGlvbigpIHsKKyAgICAgICAgc3VwZXIoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugd2l0aCBhIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZQorICAgICAqLworICAgIHB1YmxpYyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIHN1cGVyKG1lc3NhZ2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSB3aXRoIGEgbWVzc2FnZSBhbmQgYSBjYXVzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlLgorICAgICAqIEBwYXJhbSBjYXVzZSB0aGUgVGhyb3dhYmxlIHRoYXQgY2F1c2VkIHRoZSBleGNlcHRpb24gdG8gYmUgdGhyb3duLgorICAgICAqLworICAgIHB1YmxpYyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSB3aXRoIGEgY2F1c2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2F1c2UgdGhlIFRocm93YWJsZSB0aGF0IGNhdXNlZCB0aGUgZXhjZXB0aW9uIHRvIGJlIHRocm93bi4KKyAgICAgKi8KKyAgICBwdWJsaWMgVGVzdENvbnRhaW5lckV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgICAgc3VwZXIoY2F1c2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL2NvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L3NwaS9UZXN0Q29udGFpbmVyRmFjdG9yeS5qYXZhIGIvdGVzdC1mcmFtZXdvcmsvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3Qvc3BpL1Rlc3RDb250YWluZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI1ZmVjOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZnJhbWV3b3JrL2NvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L3NwaS9UZXN0Q29udGFpbmVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGk7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkRlcGxveW1lbnRDb250ZXh0OworCisvKioKKyAqIEEgdGVzdCBjb250YWluZXIgZmFjdG9yeSByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGVzdCBjb250YWluZXJzLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVGVzdENvbnRhaW5lckZhY3RvcnkgeworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgdGVzdCBjb250YWluZXIgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmFzZVVyaSBiYXNlIFVSSSBmb3IgdGhlIHRlc3QgY29udGFpbmVyIHRvIHJ1biBhdC4KKyAgICAgKiBAcGFyYW0gZGVwbG95bWVudENvbnRleHQgZGVwbG95bWVudCBjb250ZXh0IG9mIHRoZSB0ZXN0ZWQgSkFYLVJTIC8gSmVyc2V5IGFwcGxpY2F0aW9uIC4KKyAgICAgKiBAcmV0dXJuIG5ldyB0ZXN0IGNvbnRhaW5lciBjb25maWd1cmVkIHRvIHJ1biB0aGUgdGVzdGVkIGFwcGxpY2F0aW9uLgorICAgICAqCisgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYge0Bjb2RlIGRlcGxveW1lbnRDb250ZXh0fSBpcyBub3Qgc3VwcG9ydGVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnkgdGhpcyB0ZXN0IGNvbnRhaW5lciBmYWN0b3J5LgorICAgICAqLworICAgIFRlc3RDb250YWluZXIgY3JlYXRlKFVSSSBiYXNlVXJpLCBEZXBsb3ltZW50Q29udGV4dCBkZXBsb3ltZW50Q29udGV4dCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0LWZyYW1ld29yay9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9zcGkvVGVzdEhlbHBlci5qYXZhIGIvdGVzdC1mcmFtZXdvcmsvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3Qvc3BpL1Rlc3RIZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzgwOWY2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1mcmFtZXdvcmsvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3Qvc3BpL1Rlc3RIZWxwZXIuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworCisvKioKKyAqIEhlbHBlciBjbGFzcyBmb3IgSmVyc2V5IFRlc3QgRnJhbWV3b3JrLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgZmluYWwgY2xhc3MgVGVzdEhlbHBlciB7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBodW1hbiByZWFkYWJsZSBzdHJpbmcgZnJvbSBnaXZlbiBVUkkuIFRoaXMgbWV0aG9kIHJlcGxhY2VzIHtAY29kZSAwfSBwb3J0IChzdGFydCBjb250YWluZXIgYXQgZmlyc3QgYXZhaWxhYmxlCisgICAgICogcG9ydCkgaW4gZ2l2ZW4gVVJJIHdpdGggc3RyaW5nIHtAY29kZSA8QVZBSUxBQkxFLVBPUlQ+fS4KKyAgICAgKgorICAgICAqIEBwYXJhbSB1cmkgYW4gVVJJLgorICAgICAqIEByZXR1cm4gc3RyaW5naWZpZWQgVVJJLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHplcm9Qb3J0VG9BdmFpbGFibGVQb3J0KGZpbmFsIFVSSSB1cmkpIHsKKyAgICAgICAgcmV0dXJuIHVyaS5nZXRQb3J0KCkgIT0gMAorICAgICAgICAgICAgICAgID8gdXJpLnRvU3RyaW5nKCkKKyAgICAgICAgICAgICAgICA6IHVyaS50b1N0cmluZygpLnJlcGxhY2VGaXJzdCgiOjAiLCAiOjxBVkFJTEFCTEUtUE9SVD4iKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmV2ZW50IGluc3RhbnRpYXRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBUZXN0SGVscGVyKCkgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL2NvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L3NwaS9UZXN0TmdTdHJhdGVneS5qYXZhIGIvdGVzdC1mcmFtZXdvcmsvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3Qvc3BpL1Rlc3ROZ1N0cmF0ZWd5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZjNDExMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZnJhbWV3b3JrL2NvcmUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L3NwaS9UZXN0TmdTdHJhdGVneS5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworCisvKioKKyAqIFN0cmF0ZWd5IGRlZmluaW5nIGhvdyB0ZXN0IGNvbnRhaW5lcnMgYW5kIGNsaWVudHMgYXJlIHN0b3JlZCBhbmQgcGFzc2VkIHRvIFRlc3RORyB0ZXN0cy4KKyAqIDxwLz4KKyAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3ROZyBKZXJzZXkgVGVzdH0gY2FsbHMge0BsaW5rICN0ZXN0Q29udGFpbmVyKFRlc3RDb250YWluZXIpfSAvCisgKiB7QGxpbmsgI2NsaWVudChqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50KX0gbWV0aG9kcyBiZWZvcmUge0BsaW5rICN0ZXN0Q29udGFpbmVyKCl9IC8ge0BsaW5rICNjbGllbnQoKX0uIFN0cmF0ZWd5IGlzIG5vdAorICogc3VwcG9zZWQgdG8gY3JlYXRlIGluc3RhbmNlcyBvZiB0ZXN0IGNvbnRhaW5lciAvIGNsaWVudC4gSXQncyBwdXJwb3NlIGlzIHRvIGFwcHJvcHJpYXRlbHkgc3RvcmUgZ2l2ZW4gaW5zdGFuY2VzIGZvciBkaWZmZXJlbnQKKyAqIFRlc3RORyBhcHByb2FjaGVzIGRlZmluZWQgYnkge0Bjb2RlIEBCZWZvcmVYWFh9IGFuZCB7QGNvZGUgQEFmdGVyWFhYfSBhbm5vdGF0aW9ucy4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGludGVyZmFjZSBUZXN0TmdTdHJhdGVneSB7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSB0ZXN0IGNvbnRhaW5lciB0byBydW4gdGhlIHRlc3RzIGluLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIge0BsaW5rICN0ZXN0Q29udGFpbmVyKFRlc3RDb250YWluZXIpfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYSB0ZXN0IGNvbnRhaW5lciBpbnN0YW5jZSBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIHRlc3QgY29udGFpbmVyIGlzIG5vdCBzZXQuCisgICAgICovCisgICAgcHVibGljIFRlc3RDb250YWluZXIgdGVzdENvbnRhaW5lcigpOworCisgICAgLyoqCisgICAgICogU2V0IGEgbmV3IHRlc3QgY29udGFpbmVyIGluc3RhbmNlIHRvIHJ1biB0aGUgdGVzdHMgaW4gYW5kIHJldHVybiB0aGUgb2xkLCBwcmV2aW91c2x5IHN0b3JlZCwgaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdGVzdENvbnRhaW5lciBuZXcgY29udGFpbmVyIGluc3RhbmNlLgorICAgICAqIEByZXR1cm4gYW4gb2xkIGNvbnRhaW5lciBpbnN0YW5jZSBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIGNvbnRhaW5lciBpcyBub3Qgc2V0LgorICAgICAqLworICAgIHB1YmxpYyBUZXN0Q29udGFpbmVyIHRlc3RDb250YWluZXIoZmluYWwgVGVzdENvbnRhaW5lciB0ZXN0Q29udGFpbmVyKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIEpBWC1SUyBjbGllbnQuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlciB7QGxpbmsgI2NsaWVudChqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50KX0uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgY2xpZW50IGluc3RhbmNlIG9yIHtAY29kZSBudWxsfSBpZiB0aGUgY2xpZW50IGlzIG5vdCBzZXQuCisgICAgICovCisgICAgcHVibGljIENsaWVudCBjbGllbnQoKTsKKworICAgIC8qKgorICAgICAqIFNldCBhIG5ldyBKQVgtUlMgY2xpZW50IGluc3RhbmNlIGFuZCByZXR1cm4gdGhlIG9sZCwgcHJldmlvdXNseSBzdG9yZWQsIGluc3RhbmNlLgorICAgICAqCisgICAgICogQHBhcmFtIGNsaWVudCBuZXcgY2xpZW50LgorICAgICAqIEByZXR1cm4gYW4gb2xkIGNsaWVudCBpbnN0YW5jZSBvciB7QGNvZGUgbnVsbH0gaWYgdGhlIGNsaWVudCBpcyBub3Qgc2V0LgorICAgICAqLworICAgIHB1YmxpYyBDbGllbnQgY2xpZW50KGZpbmFsIENsaWVudCBjbGllbnQpOworfQpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3Qvc3BpL3BhY2thZ2UtaW5mby5qYXZhIGIvdGVzdC1mcmFtZXdvcmsvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3Qvc3BpL3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlM2M1ZjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay9jb3JlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9zcGkvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoqCisgKiBKZXJzZXkgdGVzdCBmcmFtZXdvcmsgc2VydmljZSBwcm92aWRlciBjb250cmFjdCAoU1BJKSBjbGFzc2VzLgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpOwpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvY29yZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvSmVyc2V5VGVzdFRlc3QuamF2YSBiL3Rlc3QtZnJhbWV3b3JrL2NvcmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L0plcnNleVRlc3RUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE3MTM5ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZnJhbWV3b3JrL2NvcmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L0plcnNleVRlc3RUZXN0LmphdmEKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdDsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlByb3BlcnRpZXNIZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0fSB1bml0IHRlc3RzLgorICoKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSmVyc2V5VGVzdFRlc3QgeworCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAieHh4IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlUZXN0Q29udGFpbmVyRmFjdG9yeSBpbXBsZW1lbnRzIFRlc3RDb250YWluZXJGYWN0b3J5IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFRlc3RDb250YWluZXIgY3JlYXRlKGZpbmFsIFVSSSBiYXNlVXJpLCBmaW5hbCBEZXBsb3ltZW50Q29udGV4dCBjb250ZXh0KSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVGVzdENvbnRhaW5lcigpIHsKKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBDbGllbnRDb25maWcgZ2V0Q2xpZW50Q29uZmlnKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgVVJJIGdldEJhc2VVcmkoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBiYXNlVXJpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgeworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE15SmVyc2V5VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoTXlSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIG5ldyBNeVRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21UZXN0Q29udGFpbmVyRmFjdG9yeSgpIHsKKyAgICAgICAgTXlKZXJzZXlUZXN0IG15SmVyc2V5VGVzdCA9IG5ldyBNeUplcnNleVRlc3QoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMobXlKZXJzZXlUZXN0LmdldFRlc3RDb250YWluZXJGYWN0b3J5KCkuZ2V0Q2xhc3MoKSwgTXlUZXN0Q29udGFpbmVyRmFjdG9yeS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGVQb3J0TnVtYmVyKCkgeworICAgICAgICBmaW5hbCBpbnQgbmV3UG9ydCA9IFRlc3RQcm9wZXJ0aWVzLkRFRkFVTFRfQ09OVEFJTkVSX1BPUlQgKyAxOworICAgICAgICBNeUplcnNleVRlc3QgbXlKZXJzZXlUZXN0ID0gbmV3IE15SmVyc2V5VGVzdCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgICAgICBmb3JjZVNldChUZXN0UHJvcGVydGllcy5DT05UQUlORVJfUE9SVCwgSW50ZWdlci50b1N0cmluZyhuZXdQb3J0KSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmNvbmZpZ3VyZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIGFzc2VydEVxdWFscyhuZXdQb3J0LCBteUplcnNleVRlc3QuZ2V0UG9ydCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUaGF0RGVmYXVsdENvbnRhaW5lclBvcnRJc1VzZWQoKSB7CisgICAgICAgIE15SmVyc2V5VGVzdCBteUplcnNleVRlc3QgPSBuZXcgTXlKZXJzZXlUZXN0KCk7CisKKyAgICAgICAgU3RyaW5nIHBvcnRWYWx1ZSA9IEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKFByb3BlcnRpZXNIZWxwZXIuZ2V0U3lzdGVtUHJvcGVydHkoVGVzdFByb3BlcnRpZXMuQ09OVEFJTkVSX1BPUlQsCisgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoVGVzdFByb3BlcnRpZXMuREVGQVVMVF9DT05UQUlORVJfUE9SVCkpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKHBvcnRWYWx1ZSkuaW50VmFsdWUoKSwgbXlKZXJzZXlUZXN0LmdldFBvcnQoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0LWZyYW1ld29yay9tYXZlbi9jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbi9wb20ueG1sIGIvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzQ2ZWI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vcG9tLnhtbApAQCAtMCwwICsxLDE5MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5tYXZlbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmNvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+bWF2ZW4tcGx1Z2luPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3QtZnJhbWV3b3JrLW1hdmVuLWNvbnRhaW5lci1ydW5uZXItcGx1Z2luPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBUaGUgY29udGFpbmVyIHJ1bm5lciBtYXZlbiBwbHVnaW4gcHJvdmlkZXMgbWVhbnMgdG8gc3RhcnQgYW5kIHN0b3AgYSBjb250YWluZXIgKGN1cnJlbnRseSwgV2VibG9naWMsIFRvbWNhdCBhbmQgR2xhc3NmaXNoNAorICAgICAgICBhcmUgc3VwcG9ydGVkKS4gVG8gZGVwbG95IGFuIGFwcGxpY2F0aW9uIHRvIHRoaXMgY29udGFpbmVyIG9yIHRvIHJlcGV0aXRpdmVseSByZWRlcGxveSBhbmQgdGVzdCBhbiBhcHBsaWNhdGlvbiBpbiB0aGUgY29udGFpbmVyLgorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPGdyb292eS52ZXJzaW9uPjIuNC4zPC9ncm9vdnkudmVyc2lvbj4KKyAgICAgICAgPGdyb292eS1lY2xpcHNlLWNvbXBpbGVyLnZlcnNpb24+Mi45LjItMDE8L2dyb292eS1lY2xpcHNlLWNvbXBpbGVyLnZlcnNpb24+CisgICAgICAgIDxncm9vdnktZWNsaXBzZS1iYXRjaC52ZXJzaW9uPjIuMy43LTAxPC9ncm9vdnktZWNsaXBzZS1iYXRjaC52ZXJzaW9uPgorICAgICAgICA8bWF2ZW4udmVyc2lvbj4zLjMuMzwvbWF2ZW4udmVyc2lvbj4KKyAgICAgICAgPG1hdmVuLXBsdWdpbi52ZXJzaW9uPjMuNTwvbWF2ZW4tcGx1Z2luLnZlcnNpb24+CisgICAgPC9wcm9wZXJ0aWVzPgorCisgICAgPGRlcGVuZGVuY2llcz4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHttYXZlbi52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1tb2RlbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7bWF2ZW4udmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7bWF2ZW4udmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGF0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHttYXZlbi52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFydGlmYWN0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHttYXZlbi52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDwhLS0gZGVwZW5kZW5jaWVzIHRvIGFubm90YXRpb25zIC0tPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLXRvb2xzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLWFubm90YXRpb25zPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHttYXZlbi1wbHVnaW4udmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi10ZXN0aW5nPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLXRlc3RpbmctaGFybmVzczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjMuMy4wPC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjIuMi4xPC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLmdtYXZlbnBsdXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5nbWF2ZW5wbHVzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjEuNjwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLmdyb292eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmdyb292eS1hbGw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke2dyb292eS52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jbGllbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8dGVzdFJlc291cmNlcz4KKyAgICAgICAgICAgIDx0ZXN0UmVzb3VyY2U+CisgICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvdGVzdC9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICA8ZmlsdGVyaW5nPnRydWU8L2ZpbHRlcmluZz4KKyAgICAgICAgICAgICAgICA8aW5jbHVkZXM+CisgICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlPioueG1sPC9pbmNsdWRlPgorICAgICAgICAgICAgICAgIDwvaW5jbHVkZXM+CisgICAgICAgICAgICA8L3Rlc3RSZXNvdXJjZT4KKyAgICAgICAgICAgIDx0ZXN0UmVzb3VyY2U+CisgICAgICAgICAgICAgICAgPGRpcmVjdG9yeT5zcmMvdGVzdC9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICA8ZmlsdGVyaW5nPmZhbHNlPC9maWx0ZXJpbmc+CisgICAgICAgICAgICAgICAgPGV4Y2x1ZGVzPgorICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT4qLnhtbDwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgPC90ZXN0UmVzb3VyY2U+CisgICAgICAgIDwvdGVzdFJlc291cmNlcz4KKworICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLmdyb292eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5ncm9vdnktZWNsaXBzZS1jb21waWxlcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2dyb292eS1lY2xpcHNlLWNvbXBpbGVyLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDxleHRlbnNpb25zPnRydWU8L2V4dGVuc2lvbnM+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8Y29tcGlsZXJJZD5ncm9vdnktZWNsaXBzZS1jb21waWxlcjwvY29tcGlsZXJJZD4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMuZ3Jvb3Z5PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z3Jvb3Z5LWVjbGlwc2UtY29tcGlsZXI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2dyb292eS1lY2xpcHNlLWNvbXBpbGVyLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgICAgIDwhLS0gZm9yIDIuOC4wLTAxIGFuZCBsYXRlciB5b3UgbXVzdCBoYXZlIGFuIGV4cGxpY2l0IGRlcGVuZGVuY3kgb24gZ3Jvb3Z5LWVjbGlwc2UtYmF0Y2ggLS0+CisgICAgICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLmdyb292eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmdyb292eS1lY2xpcHNlLWJhdGNoPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtncm9vdnktZWNsaXBzZS1iYXRjaC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKworICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgIDwhLS0gcmVxdWlyZWQgYnkgTWF2ZW4gMy4yLjEgYW5kIG9sZGVyIChzZWUgaHR0cHM6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9NTkctNTM0NikgLS0+CisgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke21hdmVuLXBsdWdpbi52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8c2tpcEVycm9yTm9EZXNjcmlwdG9yc0ZvdW5kPnRydWU8L3NraXBFcnJvck5vRGVzY3JpcHRvcnNGb3VuZD4KKyAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmRlZmF1bHQtZGVzY3JpcHRvcjwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnByb2Nlc3MtY2xhc3NlczwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5kZXNjcmlwdG9yPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+CisgICAgPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2NvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2dyb292eS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L21hdmVuL3J1bm5lci9Db21tb25Eb3dubG9hZC5ncm9vdnkgYi90ZXN0LWZyYW1ld29yay9tYXZlbi9jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9ncm9vdnkvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9tYXZlbi9ydW5uZXIvQ29tbW9uRG93bmxvYWQuZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZGQ5OTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay9tYXZlbi9jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9ncm9vdnkvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9tYXZlbi9ydW5uZXIvQ29tbW9uRG93bmxvYWQuZ3Jvb3Z5CkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5tYXZlbi5ydW5uZXIKKworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucy5hbm5vdGF0aW9ucy5QYXJhbWV0ZXIKKworLyoqCisgKiBDb21tb24gZnVuY3Rpb25hbGl0eSBvZiBkb3dubG9hZCBNb2pvcy4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK3RyYWl0IENvbW1vbkRvd25sb2FkIGltcGxlbWVudHMgUnVubmVyTW9qbyB7CisKKyAgICAvKioKKyAgICAgKiBGcm9tIHdoZXJlIHRvIGRvd25sb2FkIHRoZSBkaXN0cmlidXRpb24gYXJjaGl2ZSBmaWxlLgorICAgICAqLworICAgIEBQYXJhbWV0ZXIocmVxdWlyZWQgPSB0cnVlLCBuYW1lID0gImRpc3RVcmwiLCBwcm9wZXJ0eSA9ICJqZXJzZXkucnVubmVyLmRpc3RVcmwiKQorICAgIFN0cmluZyBkaXN0VXJsCisKKyAgICAvKioKKyAgICAgKiBXaGVyZSB0byBkb3dubG9hZCAob3IgbG9vayBmb3IpIHRoZSBkaXN0cmlidXRpb24gYXJjaGl2ZSBmaWxlLgorICAgICAqLworICAgIEBQYXJhbWV0ZXIoZGVmYXVsdFZhbHVlID0gIlwke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9kaXN0QXJjaGl2ZS5qYXIiLCBuYW1lID0gImRpc3RUYXJnZXRMb2NhdGlvbiIpCisgICAgU3RyaW5nIGRpc3RUYXJnZXRMb2NhdGlvbgorCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBkb3dubG9hZCB0aGUgZGlzdHJpYnV0aW9uIGFyY2hpdmUgaWYgaXQgYWxyZWFkeSBleGlzdHMgaW4ge0BsaW5rICNkaXN0VGFyZ2V0TG9jYXRpb259IHBhdGguCisgICAgICovCisgICAgQFBhcmFtZXRlcihkZWZhdWx0VmFsdWUgPSAiZmFsc2UiLCBwcm9wZXJ0eSA9ICJqZXJzZXkucnVubmVyLmRvd25sb2FkSWZFeGlzdHMiLCBuYW1lID0gImRvd25sb2FkSWZFeGlzdHMiKQorICAgIGJvb2xlYW4gZG93bmxvYWRJZkV4aXN0cworCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBvdmVyd3JpdGUgdW5wYWNrZWQgZGlzdHJpYnV0aW9uIGluIHtAbGluayAjZGlzdERpcn07IGkuZS4sIHRoZSB7QGNvZGUgPGRpc3REaXI+LzxkaXN0U3ViZGlyPn0gaXMgcmVtb3ZlZCBhbmQgdGhlCisgICAgICogZGlzdHJpYnV0aW9uIGlzIHVucGFja2VkLgorICAgICAqLworICAgIEBQYXJhbWV0ZXIoZGVmYXVsdFZhbHVlID0gInRydWUiLCBwcm9wZXJ0eSA9ICJqZXJzZXkucnVubmVyLm92ZXJ3cml0ZSIsIG5hbWUgPSAib3ZlcndyaXRlIikKKyAgICBib29sZWFuIG92ZXJ3cml0ZQorCisgICAgLyoqCisgICAgICogVGhlIGh0dHAvaHR0cHMgcHJveHkgdG8gdXNlCisgICAgICovCisgICAgQFBhcmFtZXRlcihwcm9wZXJ0eSA9ICJqZXJzZXkucnVubmVyLnByb3h5IiwgbmFtZSA9ICJwcm94eSIpCisgICAgU3RyaW5nIHByb3h5CisKKyAgICBNYXAgY29tbW9uRW52aXJvbm1lbnQoKSB7CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgIkRJU1RfVVJMIiAgICAgICAgICA6IGRpc3RVcmwsCisgICAgICAgICAgICAgICAgIkRJU1RfVEdUX0xPQ0FUSU9OIiA6IGRpc3RUYXJnZXRMb2NhdGlvbiwKKworICAgICAgICAgICAgICAgICJET1dOTE9BRF9JRl9FWElTVFMiOiBkb3dubG9hZElmRXhpc3RzIGFzIFN0cmluZywKKyAgICAgICAgICAgICAgICAiT1ZFUldSSVRFIiAgICAgICAgIDogb3ZlcndyaXRlIGFzIFN0cmluZywKKworICAgICAgICAgICAgICAgICJhbGxfcHJveHkiICAgICAgICAgOiBwcm94eSA/OiAiIiwKKyAgICAgICAgXQorICAgIH0KKworICAgIHZvaWQgc2V0RGlzdFVybChmaW5hbCBTdHJpbmcgZGlzdFVybCkgeworICAgICAgICB0aGlzLmRpc3RVcmwgPSBkaXN0VXJsCisgICAgfQorCisgICAgdm9pZCBzZXREaXN0VGFyZ2V0TG9jYXRpb24oZmluYWwgU3RyaW5nIGRpc3RUYXJnZXRMb2NhdGlvbikgeworICAgICAgICB0aGlzLmRpc3RUYXJnZXRMb2NhdGlvbiA9IGRpc3RUYXJnZXRMb2NhdGlvbgorICAgIH0KKworICAgIHZvaWQgc2V0RG93bmxvYWRJZkV4aXN0cyhmaW5hbCBib29sZWFuIGRvd25sb2FkSWZFeGlzdHMpIHsKKyAgICAgICAgdGhpcy5kb3dubG9hZElmRXhpc3RzID0gZG93bmxvYWRJZkV4aXN0cworICAgIH0KKworICAgIHZvaWQgc2V0T3ZlcndyaXRlKGZpbmFsIGJvb2xlYW4gb3ZlcndyaXRlKSB7CisgICAgICAgIHRoaXMub3ZlcndyaXRlID0gb3ZlcndyaXRlCisgICAgfQorCisgICAgdm9pZCBzZXRQcm94eShmaW5hbCBTdHJpbmcgcHJveHkpIHsKKyAgICAgICAgdGhpcy5wcm94eSA9IHByb3h5CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL21haW4vZ3Jvb3Z5L29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvbWF2ZW4vcnVubmVyL0NvbW1vblJlZGVwbG95Lmdyb292eSBiL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2NvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2dyb292eS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L21hdmVuL3J1bm5lci9Db21tb25SZWRlcGxveS5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMwMmQwMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2NvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2dyb292eS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L21hdmVuL3J1bm5lci9Db21tb25SZWRlcGxveS5ncm9vdnkKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5tYXZlbi5ydW5uZXIKKworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb24KK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuYW5ub3RhdGlvbnMuUGFyYW1ldGVyCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXMKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcgoraW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQKKworLyoqCisgKiBDb21tb24gZnVuY3Rpb25hbGl0eSBvZiBSZWRlcGxveSBNb2pvcy4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK3RyYWl0IENvbW1vblJlZGVwbG95IGV4dGVuZHMgQ29tbW9uU3RvcCB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZXhpdCBjb2RlIHRoYXQgZGVub3RlcyBhIGRldGVjdGVkIG1lbW9yeSBsZWFrLgorICAgICAqLworICAgIGZpbmFsIHN0YXRpYyBpbnQgTUVNT1JZX0xFQUtfREVURUNURURfRVJST1JfRVhJVF9DT0RFID0gNjgKKworICAgIC8qKgorICAgICAqIFRoZSBwYXRoIGFuZCBxdWVyeSB0byBleGVjdXRlIGFmdGVyIGVhY2ggYXBwbGljYXRpb24gcmVkZXBsb3kKKyAgICAgKi8KKyAgICBAUGFyYW1ldGVyKHJlcXVpcmVkID0gdHJ1ZSwgbmFtZSA9ICJyZXF1ZXN0UGF0aFF1ZXJ5IikKKyAgICBTdHJpbmcgcmVxdWVzdFBhdGhRdWVyeQorCisgICAgLyoqCisgICAgICogVGhlIG51bWJlciBvZiByZWRlcGxveXMgdG8gZXhlY3V0ZS4KKyAgICAgKi8KKyAgICBAUGFyYW1ldGVyKHJlcXVpcmVkID0gdHJ1ZSwgbmFtZSA9ICJyZWRlcGxveUNvdW50IikKKyAgICBpbnQgcmVkZXBsb3lDb3VudAorCisgICAgLyoqCisgICAgICogVGhlIGh0dHAgbWV0aG9kIHRvIHVzZSB3aGlsZSBleGVjdXRpbmcgdGhlIGh0dHAgcmVxdWVzdCB0byB7QGxpbmsgI3JlcXVlc3RQYXRoUXVlcnl9LgorICAgICAqLworICAgIEBQYXJhbWV0ZXIoZGVmYXVsdFZhbHVlID0gIkdFVCIsIG5hbWUgPSAibWV0aG9kIikKKyAgICBTdHJpbmcgbWV0aG9kCisKKyAgICAvKioKKyAgICAgKiBBIGh0dHAgc3RhdHVzIHRvIGV4cGVjdCB3aGlsZSBxdWVlcmluZyB0aGUgYXBwbGljYXRpb24gYmV0d2VlbiByZWRlcGxveXMuCisgICAgICovCisgICAgQFBhcmFtZXRlcihkZWZhdWx0VmFsdWUgPSAiMjAwIiwgbmFtZSA9ICJleHBlY3RlZFN0YXR1cyIpCisgICAgaW50IGV4cGVjdGVkU3RhdHVzCisKKyAgICAvKioKKyAgICAgKiBUaGUgYXJjaGl2ZSBsb2NhdGlvbiBvZiBhbiBhcHBsaWNhdGlvbiB0byBiZSByZWRlcGxveWVkLgorICAgICAqLworICAgIEBQYXJhbWV0ZXIocmVxdWlyZWQgPSB0cnVlLCBuYW1lID0gIndhclBhdGgiKQorICAgIEZpbGUgd2FyUGF0aAorCisgICAgQFBhcmFtZXRlcihkZWZhdWx0VmFsdWUgPSAiZmFsc2UiLCBuYW1lID0gInNraXBSZWRlcGxveSIsIHByb3BlcnR5ID0gImplcnNleS5ydW5uZXIuc2tpcFJlZGVwbG95IikKKyAgICBib29sZWFuIHNraXBSZWRlcGxveQorCisgICAgZGVmIHJlZGVwbG95QW5kU2VuZFJlcXVlc3QoU3RyaW5nIHNoZWxsLCBTdHJpbmcgc3RvcFNoZWxsKSB7CisgICAgICAgIHJlZGVwbG95QW5kU2VuZFJlcXVlc3Qoc2hlbGwsIHN0b3BTaGVsbCwgbnVsbCkKKyAgICB9CisKKyAgICBkZWYgcmVkZXBsb3lBbmRTZW5kUmVxdWVzdChTdHJpbmcgc2hlbGwsIFN0cmluZyBzdG9wU2hlbGwsIE1hcCBlbnYpIHsKKyAgICAgICAgZmluYWwgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KCkKKyAgICAgICAgICAgICAgICAucHJvcGVydHkoQ2xpZW50UHJvcGVydGllcy5DT05ORUNUX1RJTUVPVVQsIDMwMDAwKQorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLlJFQURfVElNRU9VVCwgMzAwMDApCisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSBjbGllbnQudGFyZ2V0KCJodHRwOi8vbG9jYWxob3N0OiR7cG9ydH0vJHtub3JtYWxpemVkUmVxdWVzdFBhdGhRdWVyeSgpfSIpCisKKyAgICAgICAgZ2V0TG9nKCkuaW5mbygiV0VCIFRhcmdldCBVUkk6ICIgKyB0YXJnZXQuZ2V0VXJpKCkpCisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGludCBpID0gMQorICAgICAgICAgICAgZm9yICg7IGkgPD0gcmVkZXBsb3lDb3VudDsgKytpKSB7CisgICAgICAgICAgICAgICAgZ2V0TG9nKCkuaW5mbygiRXhlY3V0aW5nIHJlcXVlc3QgJG1ldGhvZCB0byAiICsgdGFyZ2V0LmdldFVyaSgpICsgIiAoaXRlcmF0aW9uICRpLyRyZWRlcGxveUNvdW50KSIpCisgICAgICAgICAgICAgICAgZGVmIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5tZXRob2QobWV0aG9kKQorICAgICAgICAgICAgICAgIGdldExvZygpLmluZm8oIlJlY2VpdmVkIGh0dHAgc3RhdHVzICIgKyByZXNwb25zZS5nZXRTdGF0dXMoKSkKKworICAgICAgICAgICAgICAgIGlmIChleHBlY3RlZFN0YXR1cyAhPSByZXNwb25zZT8uZ2V0U3RhdHVzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkFmdGVyICRpIGl0ZXJhdGlvbnMsIHRoZSBodHRwIHJlcXVlc3QgZW5kZWQgd2l0aCB1bmV4cGVjdGVkIGNvZGUhIEV4cGVjdGVkOiA8JGV4cGVjdGVkU3RhdHVzPiwgYWN0dWFsOiA8JHtyZXNwb25zZS5nZXRTdGF0dXMoKX0+IikKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBleGVjdXRlU2hlbGwoc2hlbGwsIGVudikKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvZy5pbmZvKCJUaGUgdGVzdCBlbmRlZCBhZnRlciAke2kgLSAxfSBpdGVyYXRpb25zLiIpCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBsb2cuZXJyb3IoIkV4Y2VwdGlvbiBlbmNvdW50ZXJlZCBkdXJpbmcgdGhlIHJlZGVwbG95IGN5Y2xlISAiLCBlKQorICAgICAgICAgICAgdGhyb3cgZQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBleGVjdXRlU2hlbGwoc3RvcFNoZWxsLCBlbnYpCisgICAgICAgICAgICB9IGNhdGNoIChNb2pvRXhlY3V0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBnZXRMb2coKS53YXJuKCJTdG9wIGNvbW1hbmQgdGhyZXcgYW4gZXhjZXB0aW9uOiAiICsgZS5nZXRNZXNzYWdlKCkpCisgICAgICAgICAgICAgICAgLy8gbm90IHJlLXRocm93aW5nIHNvIHRoYXQgdGhlIHBvc3NpYmxlIG9yaWdpbmFsIGV4Y2VwdGlvbiBpcyBub3QgbWFza2VkIGFuZCBzdWNjZXNzIGV4aXQgaXMgcHJlc2VydmVkCisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVTaGVsbCgiL3J1bm5lci92ZXJpZnkuc2giLCBbIkVSUk9SX0VYSVRfQ09ERSI6IE1FTU9SWV9MRUFLX0RFVEVDVEVEX0VSUk9SX0VYSVRfQ09ERSBhcyBTdHJpbmddKQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNoZWxsTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChlLmVycm9yQ29kZSA9PSBNRU1PUllfTEVBS19ERVRFQ1RFRF9FUlJPUl9FWElUX0NPREUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLXRocm93IHRoZSBleGNlcHRpb24gYW5kIG1hc2sgYWxsIHRoZSBvdGhlciBleGNlcHRpb25zIGJlY2F1c2Ugd2UgdmVyaWZpZWQgdGhhdCBhbiBFUlJPUiAoZS5nLiBPdXRPZk1lbW9yeUVycm9yKSBvY2N1cnJlZAorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgTWFwIGNvbW1vbkVudmlyb25tZW50KCkgeworICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgICJXQVJfUEFUSCIgICAgICAgICAgOiB3YXJQYXRoLmFic29sdXRlUGF0aCwKKyAgICAgICAgICAgICAgICAiUkVRVUVTVF9QQVRIX1FVRVJZIjogbm9ybWFsaXplZFJlcXVlc3RQYXRoUXVlcnkoKSwKKyAgICAgICAgICAgICAgICAiU0tJUF9SRURFUExPWSIgICAgIDogc2tpcFJlZGVwbG95IGFzIFN0cmluZworICAgICAgICBdIDw8IHN1cGVyLmNvbW1vbkVudmlyb25tZW50KCkKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBub3JtYWxpemVkUmVxdWVzdFBhdGhRdWVyeSgpIHsKKyAgICAgICAgd2hpbGUgKHJlcXVlc3RQYXRoUXVlcnkuc3RhcnRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICByZXF1ZXN0UGF0aFF1ZXJ5ID0gcmVxdWVzdFBhdGhRdWVyeS5zdWJzdHJpbmcoMSwgcmVxdWVzdFBhdGhRdWVyeS5sZW5ndGgoKSkKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVxdWVzdFBhdGhRdWVyeQorICAgIH0KKworICAgIHZvaWQgc2V0UmVxdWVzdFBhdGhRdWVyeShmaW5hbCBTdHJpbmcgcmVxdWVzdFBhdGhRdWVyeSkgeworICAgICAgICB0aGlzLnJlcXVlc3RQYXRoUXVlcnkgPSByZXF1ZXN0UGF0aFF1ZXJ5CisgICAgfQorCisgICAgdm9pZCBzZXRSZWRlcGxveUNvdW50KGZpbmFsIGludCByZWRlcGxveUNvdW50KSB7CisgICAgICAgIHRoaXMucmVkZXBsb3lDb3VudCA9IHJlZGVwbG95Q291bnQKKyAgICB9CisKKyAgICB2b2lkIHNldE1ldGhvZChmaW5hbCBTdHJpbmcgbWV0aG9kKSB7CisgICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kCisgICAgfQorCisgICAgdm9pZCBzZXRFeHBlY3RlZFN0YXR1cyhmaW5hbCBpbnQgZXhwZWN0ZWRTdGF0dXMpIHsKKyAgICAgICAgdGhpcy5leHBlY3RlZFN0YXR1cyA9IGV4cGVjdGVkU3RhdHVzCisgICAgfQorCisgICAgdm9pZCBzZXRXYXJQYXRoKGZpbmFsIEZpbGUgd2FyUGF0aCkgeworICAgICAgICB0aGlzLndhclBhdGggPSB3YXJQYXRoCisgICAgfQorCisgICAgdm9pZCBzZXRTa2lwUmVkZXBsb3koZmluYWwgYm9vbGVhbiBza2lwUmVkZXBsb3kpIHsKKyAgICAgICAgdGhpcy5za2lwUmVkZXBsb3kgPSBza2lwUmVkZXBsb3kKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0LWZyYW1ld29yay9tYXZlbi9jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9ncm9vdnkvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9tYXZlbi9ydW5uZXIvQ29tbW9uU3RhcnRBbmREZXBsb3kuZ3Jvb3Z5IGIvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL21haW4vZ3Jvb3Z5L29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvbWF2ZW4vcnVubmVyL0NvbW1vblN0YXJ0QW5kRGVwbG95Lmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGEzNjdiNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2NvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2dyb292eS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L21hdmVuL3J1bm5lci9Db21tb25TdGFydEFuZERlcGxveS5ncm9vdnkKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5tYXZlbi5ydW5uZXIKKworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucy5hbm5vdGF0aW9ucy5QYXJhbWV0ZXIKKworLyoqCisgKiBDb21tb24gZnVuY3Rpb25hbGl0eSBvZiBTdGFydCBhbmQgRGVwbG95IE1vam9zLgorICoKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLwordHJhaXQgQ29tbW9uU3RhcnRBbmREZXBsb3kgaW1wbGVtZW50cyBSdW5uZXJNb2pvIHsKKworICAgIC8qKgorICAgICAqIFRoZSBhcmNoaXZlIGxvY2F0aW9uIG9mIGFuIGFwcGxpY2F0aW9uIHRvIGJlIGRlcGxveWVkLgorICAgICAqLworICAgIEBQYXJhbWV0ZXIocmVxdWlyZWQgPSB0cnVlLCBuYW1lID0gIndhclBhdGgiKQorICAgIEZpbGUgd2FyUGF0aAorCisgICAgLyoqCisgICAgICogVGhlIG1heGltdW0gaGVhcCBzaXplLiBNdXN0IGNvbmZvcm0gdG8gamF2YSB7QGNvZGUgWG14fSBzdGFuZGFyZHMuCisgICAgICovCisgICAgQFBhcmFtZXRlcihkZWZhdWx0VmFsdWUgPSAiMjU2bSIsIG5hbWUgPSAibWF4SGVhcCIpCisgICAgU3RyaW5nIG1heEhlYXAKKworICAgIC8qKgorICAgICAqIEFkZGl0aW9uYWwgSlZNIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBjb250YWluZXIganZtLgorICAgICAqLworICAgIEBQYXJhbWV0ZXIoZGVmYXVsdFZhbHVlID0gIiIsIG5hbWUgPSAianZtQXJncyIsIHByb3BlcnR5ID0gImplcnNleS5ydW5uZXIuanZtQXJncyIpCisgICAgU3RyaW5nIGp2bUFyZ3MKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gc2tpcCBkZXBsb3ltZW50LgorICAgICAqLworICAgIEBQYXJhbWV0ZXIoZGVmYXVsdFZhbHVlID0gImZhbHNlIiwgbmFtZSA9ICJza2lwRGVwbG95IiwgcHJvcGVydHkgPSAiamVyc2V5LnJ1bm5lci5za2lwRGVwbG95IikKKyAgICBib29sZWFuIHNraXBEZXBsb3kKKworICAgIC8qKgorICAgICAqIFdoZXRoZXIgdG8gc2tpcCBjaGVjayBmb3IgcnVubmluZyBqYXZhIHByb2Nlc3NlcyB3aXRoIGEgbWFnaWMgaWRlbnRpZmllcgorICAgICAqIHtAY29kZSBqZXJzZXkuY29uZmlnLnRlc3QubWVtbGVhay4qLm1hZ2ljUnVubmVySWRlbnRpZmllcn0gd2hpY2ggcHJvdmlkZXMgYSB3YXkgdG8gcHJldmVudCBtdWx0aXBsZSBjb250YWluZXJzCisgICAgICogdG8gcnVuIGluIHBhcmFsbGVsLiBCeSBkZWZhdWx0LCB3aGVuIGFub3RoZXIgY29udGFpbmVyIGluc3RhbmNlIGlzIHJ1bm5pbmcsIHRoZSBzdGFydHVwIGZhaWxzIGluIG9yZGVyIHRvIHByZXZlbnQKKyAgICAgKiBhbiB1bmNvbnRyb2xsZWQgZXhwbG9zaW9uIG9mIG51bWJlciBvZiBydW5uaW5nIGphdmEgY29udGFpbmVycyB0aGF0IHdlcmVuJ3Qgc3VwcG9zZWQgdG8gcnVuIHBvc3NpYmx5LgorICAgICAqLworICAgIEBQYXJhbWV0ZXIoZGVmYXVsdFZhbHVlID0gImZhbHNlIiwgbmFtZSA9ICJza2lwQ2hlY2siLCBwcm9wZXJ0eSA9ICJqZXJzZXkucnVubmVyLnNraXBDaGVjayIpCisgICAgYm9vbGVhbiBza2lwQ2hlY2sKKworICAgIE1hcCBjb21tb25FbnZpcm9ubWVudCgpIHsKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAiV0FSX1BBVEgiICAgOiB3YXJQYXRoLmFic29sdXRlUGF0aCwKKyAgICAgICAgICAgICAgICAiTUFYX0hFQVAiICAgOiBtYXhIZWFwLAorICAgICAgICAgICAgICAgICJQT1JUIiAgICAgICA6IHBvcnQgYXMgU3RyaW5nLAorICAgICAgICAgICAgICAgICJTS0lQX0RFUExPWSI6IHNraXBEZXBsb3kgYXMgU3RyaW5nLAorICAgICAgICAgICAgICAgICJKVk1fQVJHUyIgICA6IGp2bUFyZ3MgPzogIiIsCisgICAgICAgICAgICAgICAgIlNLSVBfQ0hFQ0siIDogc2tpcENoZWNrIGFzIFN0cmluZworICAgICAgICBdCisgICAgfQorCisgICAgdm9pZCBzdGFydEFuZERlcGxveVN0b3BPbkZhaWx1cmUoU3RyaW5nIHNoZWxsLCBTdHJpbmcgc3RvcFNoZWxsKSB7CisgICAgICAgIHN0YXJ0QW5kRGVwbG95U3RvcE9uRmFpbHVyZShzaGVsbCwgc3RvcFNoZWxsLCBudWxsKQorICAgIH0KKworICAgIHZvaWQgc3RhcnRBbmREZXBsb3lTdG9wT25GYWlsdXJlKFN0cmluZyBzaGVsbCwgU3RyaW5nIHN0b3BTaGVsbCwgTWFwIGVudikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZXhlY3V0ZVNoZWxsKHNoZWxsLCBlbnYpCisgICAgICAgIH0gY2F0Y2ggKFNoZWxsTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyByZWdhcmRsZXNzIG9mIHRoZSBzdGF0ZSB3ZSBuZWVkIHRvIGJlIHN1cmUsIHRoZSBjb250YWluZXIgd2Fzbid0IGxlZnQgaW4gYSBydW5uaW5nIHN0YXRlCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGV4ZWN1dGVTaGVsbChzdG9wU2hlbGwpCisgICAgICAgICAgICB9IGNhdGNoIChTaGVsbE1vam9FeGVjdXRpb25FeGNlcHRpb24gc2UpIHsKKyAgICAgICAgICAgICAgICBsb2cud2FybigiQ29udGFpbmVyIHN0b3AgZW5kZWQgd2l0aCBlcnJvci4iLCBzZSkKKyAgICAgICAgICAgICAgICAvLyBub3QgcmUtdHJvd2luZworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0aHJvdyBlCisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIHNldFNraXBEZXBsb3koZmluYWwgYm9vbGVhbiBza2lwRGVwbG95KSB7CisgICAgICAgIHRoaXMuc2tpcERlcGxveSA9IHNraXBEZXBsb3kKKyAgICB9CisKKyAgICB2b2lkIHNldE1heEhlYXAoZmluYWwgU3RyaW5nIG1heEhlYXApIHsKKyAgICAgICAgdGhpcy5tYXhIZWFwID0gbWF4SGVhcAorICAgIH0KKworICAgIHZvaWQgc2V0V2FyUGF0aChmaW5hbCBGaWxlIHdhclBhdGgpIHsKKyAgICAgICAgdGhpcy53YXJQYXRoID0gd2FyUGF0aAorICAgIH0KKworICAgIHZvaWQgc2V0SnZtQXJncyhmaW5hbCBTdHJpbmcganZtQXJncykgeworICAgICAgICB0aGlzLmp2bUFyZ3MgPSBqdm1BcmdzCisgICAgfQorCisgICAgdm9pZCBzZXRTa2lwQ2hlY2soZmluYWwgYm9vbGVhbiBza2lwQ2hlY2spIHsKKyAgICAgICAgdGhpcy5za2lwQ2hlY2sgPSBza2lwQ2hlY2sKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0LWZyYW1ld29yay9tYXZlbi9jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9ncm9vdnkvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9tYXZlbi9ydW5uZXIvQ29tbW9uU3RvcC5ncm9vdnkgYi90ZXN0LWZyYW1ld29yay9tYXZlbi9jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9ncm9vdnkvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9tYXZlbi9ydW5uZXIvQ29tbW9uU3RvcC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTc5YjRjYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2NvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2dyb292eS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L21hdmVuL3J1bm5lci9Db21tb25TdG9wLmdyb292eQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QubWF2ZW4ucnVubmVyCisKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuYW5ub3RhdGlvbnMuUGFyYW1ldGVyCisKKy8qKgorICogQ29tbW9uIGZ1bmN0aW9uYWxpdHkgb2YgU3RvcCBNb2pvcy4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK3RyYWl0IENvbW1vblN0b3AgaW1wbGVtZW50cyBSdW5uZXJNb2pvIHsKKworICAgIEBQYXJhbWV0ZXIoZGVmYXVsdFZhbHVlID0gImZhbHNlIiwgbmFtZSA9ICJza2lwU3RvcCIsIHByb3BlcnR5ID0gImplcnNleS5ydW5uZXIuc2tpcFN0b3AiKQorICAgIGJvb2xlYW4gc2tpcFN0b3AKKworICAgIE1hcCBjb21tb25FbnZpcm9ubWVudCgpIHsKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAiU0tJUF9TVE9QIjogc2tpcFN0b3AgYXMgU3RyaW5nLAorICAgICAgICBdCisgICAgfQorCisgICAgdm9pZCBzZXRTa2lwU3RvcChmaW5hbCBib29sZWFuIHNraXBTdG9wKSB7CisgICAgICAgIHRoaXMuc2tpcFN0b3AgPSBza2lwU3RvcAorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2NvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2dyb292eS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L21hdmVuL3J1bm5lci9SdW5uZXJNb2pvLmdyb292eSBiL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2NvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2dyb292eS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L21hdmVuL3J1bm5lci9SdW5uZXJNb2pvLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDRjMzZiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL21haW4vZ3Jvb3Z5L29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvbWF2ZW4vcnVubmVyL1J1bm5lck1vam8uZ3Jvb3Z5CkBAIC0wLDAgKzEsMjI4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QubWF2ZW4ucnVubmVyCisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkV2aWN0aW5nUXVldWUKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uCitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0ZhaWx1cmVFeGNlcHRpb24KK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuYW5ub3RhdGlvbnMuUGFyYW1ldGVyCitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdAorCitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlcworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHMKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybgorCisvKioKKyAqIEFic3RyYWN0IGNsYXNzIGZvciBhbGwgUnVubmVyIE1vam9zLgorICoKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLwordHJhaXQgUnVubmVyTW9qbyBpbXBsZW1lbnRzIFN1cGVyUnVubmVyTW9qbyB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcG9ydCB3aGVyZSB0aGUgY29udGFpbmVyIHdpbGwgbGlzdGVuIGZvciByZXF1ZXN0cy4KKyAgICAgKi8KKyAgICBAUGFyYW1ldGVyKGRlZmF1bHRWYWx1ZSA9ICIxODA4MCIsIG5hbWUgPSAicG9ydCIpCisgICAgaW50IHBvcnQKKworICAgIC8qKgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhcHBsaWNhdGlvbiB0byBiZSBpZGVudGlmaWVkIHdpdGggaW4gdGhlIGNvbnRhaW5lcgorICAgICAqLworICAgIEBQYXJhbWV0ZXIoZGVmYXVsdFZhbHVlID0gImpheC1ycy1tZW1sZWFrLXRlc3QtYXBwIiwgbmFtZSA9ICJhcHBsaWNhdGlvbk5hbWUiKQorICAgIFN0cmluZyBhcHBsaWNhdGlvbk5hbWUKKworICAgIC8qKgorICAgICAqIFRoZSBjb250YWluZXIgZG9tYWluIG5hbWUgKG11c3QgYmUgYSB2YWxpZCBzaW5nbGUgZGlyZWN0b3J5IG5hbWU7IHRoYXQgaXMsIG5vdCBhIGRpcmVjdG9yeSBwYXRoKQorICAgICAqLworICAgIEBQYXJhbWV0ZXIoZGVmYXVsdFZhbHVlID0gIm1lbWxlYWtfdGVzdF9kb21haW4iLCBuYW1lID0gImRvbWFpbiIpCisgICAgU3RyaW5nIGRvbWFpbgorCisgICAgLyoqCisgICAgICogVGhlIGNvbnRleHQgcm9vdCB3aGVyZSB0aGUgZGVwbG95ZWQgYXBwbGljYXRpb24gd2lsbCBiZSBhY2Nlc3NpYmxlCisgICAgICovCisgICAgQFBhcmFtZXRlcihyZXF1aXJlZCA9IHRydWUsIG5hbWUgPSAiY29udGV4dFJvb3QiKQorICAgIFN0cmluZyBjb250ZXh0Um9vdAorCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgZGlyZWN0b3J5IHdoZXJlIHRvIGNvbnRhaW5lciBpcyBsb2NhdGVkLiBUaGUgY29udGFpbmVyIGFyY2hpdmUgZGlzdHJpYnV0aW9uIGlzIHVucGFja2VkIHRvIHRoaXMgZGVzdGluYXRpb24uCisgICAgICovCisgICAgQFBhcmFtZXRlcihkZWZhdWx0VmFsdWUgPSAiXCR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9IiwgbmFtZSA9ICJkaXN0RGlyIikKKyAgICBTdHJpbmcgZGlzdERpcgorCisgICAgLyoqCisgICAgICogVGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSBsb2NhdGVkIGluIHRoZSByb290IG9mIHRoZSBjb250YWluZXIgZGlzdHJpYnV0aW9uLiBJbiBvdGhlciB3b3Jkcywgd2hlbiB0aGUKKyAgICAgKiBhcmNoaXZlIGRpc3RyaWJ1dGlvbiBpcyB1bnBhY2tlZCBpbiBkaXJlY3Rvcnkge0BsaW5rICNkaXN0RGlyfSB0aGUgcmVzdWx0aW5nIGRpcmVjdG9yeSBuYW1lIGluIHRoZSB7QGxpbmsgI2Rpc3REaXJ9IHdoZXJlIHRoZSBjb250ZW50IG9mIHRoZQorICAgICAqIGRpc3RyaWJ1dGlvbiBpcyBsb2NhdGVkIGlzIGRlbm90ZWQgYnkgdGhpcyBwcm9wZXJ0eS4KKyAgICAgKi8KKyAgICBAUGFyYW1ldGVyKHJlcXVpcmVkID0gdHJ1ZSwgbmFtZSA9ICJkaXN0U3ViZGlyIikKKyAgICBTdHJpbmcgZGlzdFN1YmRpcgorCisgICAgLyoqCisgICAgICogV2hldGhlciB0byBza2lwIHN0YXJ0IGFuZCBzdG9wLiBUaGlzIGFsc28gc2tpcHMgdGhlIGRvd25sb2FkLiBVc2VmdWwgd2hlbiB0aGUgY29udGFpbmVyIGlzIGFscmVhZHkgcnVubmluZy4KKyAgICAgKi8KKyAgICBAUGFyYW1ldGVyKGRlZmF1bHRWYWx1ZSA9ICJmYWxzZSIsIG5hbWUgPSAic2tpcFN0YXJ0QW5kU3RvcCIsIHByb3BlcnR5ID0gImplcnNleS5ydW5uZXIuc2tpcFN0YXJ0QW5kU3RvcCIpCisgICAgYm9vbGVhbiBza2lwU3RhcnRBbmRTdG9wCisKKyAgICAvKioKKyAgICAgKiBUaGUgbG9jYXRpb24gb2YgYSBkaXJlY3Rvcnkgd2hlcmUgYSBjb250ZW50IG9mIGV4ZWN1dGVkIHNoZWxsIHNjcmlwdHMgaXMgZHVtcGVkLgorICAgICAqLworICAgIEBQYXJhbWV0ZXIoZGVmYXVsdFZhbHVlID0gIlwke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS90bXAiLCBuYW1lID0gInNjcmlwdHNEaXJlY3RvcnkiKQorICAgIFN0cmluZyBzY3JpcHRzRGlyZWN0b3J5CisKKyAgICAvKioKKyAgICAgKiBQYXJzZSBhIGhhc2hiYW5nIGZyb20gdGhlIGZpcnN0IGxpbmUgb2YgdGhlIHNjcmlwdDsgaWYgYXJndW1lbnRzIGFyZSBwcmVzZW50LCB0aGV5J3JlIGluY2x1ZGVkCisgICAgICogaW4gdGhlIGV4ZWN1dGFibGUgYXJyYXkgKGNhbiBiZSBwYXNzZWQgdG8ge0BsaW5rIFByb2Nlc3NCdWlsZGVyI2NvbW1hbmQoamF2YS5sYW5nLlN0cmluZyAuLi4pfSkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc2hlbGxDb250ZW50IGFzIGEgU3RyaW5nIChpLmUuLCB0aGUgd2hvbGUgc2NyaXB0IGNvbnRlbnQpCisgICAgICogQHJldHVybiBhIHN0cmluZyBhcnJheSBjb250YWluaW5nIHRoZSBzaGVsbCBleGVjdXRhYmxlIGFuZCBpdHMgYXJndW1lbnRzIChkZWZhdWx0cyB0byBbInNoIl0pCisgICAgICovCisgICAgc3RhdGljIFN0cmluZ1tdIHNoZWxsRXhlY3V0YWJsZShTdHJpbmcgc2hlbGxDb250ZW50KSB7CisKKyAgICAgICAgZGVmIHN0cmluZyA9IFBhdHRlcm4uY29tcGlsZSgiIyEoW15cclxuXSopLioiLCBQYXR0ZXJuLkRPVEFMTCkubWF0Y2hlcihzaGVsbENvbnRlbnQpLnJlcGxhY2VGaXJzdCgiXCQxIikKKworICAgICAgICBkZWYgY29tbWFuZCA9IHN0cmluZy5zcGxpdCgiICsoPz0oKC4qPyg/PCFcXFxcKScpezJ9KSpbXiddKlwkKSIpCisKKyAgICAgICAgcmV0dXJuIGNvbW1hbmQ/Lmxlbmd0aCA+IDAgJiYgRmlsZXMuZXhpc3RzKFBhdGhzLmdldChjb21tYW5kWzBdKSkgPyBjb21tYW5kIDogWyJzaCJdCisgICAgfQorCisgICAgYWJzdHJhY3QgTWFwIGNvbW1vbkVudmlyb25tZW50KCkKKworICAgIGFic3RyYWN0IE1hcCBjb250YWluZXJFbnZpcm9ubWVudCgpCisKKyAgICBhYnN0cmFjdCBTdHJpbmcgZ2V0TG9nRmlsZSgpCisKKyAgICBhYnN0cmFjdCB2b2lkIGV4ZWN1dGVSdW5uZXIoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiwgTW9qb0ZhaWx1cmVFeGNlcHRpb24KKworICAgIHByaXZhdGUgTWFwIGVudmlyb25tZW50KCkgeworICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgICJQT1JUIiAgICAgICAgICAgIDogcG9ydCBhcyBTdHJpbmcsCisgICAgICAgICAgICAgICAgIkRFQlVHIiAgICAgICAgICAgOiAoZ2V0TG9nKCk/LmlzRGVidWdFbmFibGVkKCkgPzogImZhbHNlIikgYXMgU3RyaW5nLAorICAgICAgICAgICAgICAgICJBUFBMSUNBVElPTl9OQU1FIjogYXBwbGljYXRpb25OYW1lLAorICAgICAgICAgICAgICAgICJET01BSU4iICAgICAgICAgIDogZG9tYWluLAorICAgICAgICAgICAgICAgICJMT0dGSUxFIiAgICAgICAgIDogbG9nRmlsZSwKKyAgICAgICAgICAgICAgICAiQ09OVEVYVF9ST09UIiAgICA6IGNvbnRleHRSb290LAorICAgICAgICAgICAgICAgICJTS0lQX1NUQVJUX1NUT1AiIDogc2tpcFN0YXJ0QW5kU3RvcCBhcyBTdHJpbmcsCisKKyAgICAgICAgICAgICAgICAiRElTVF9ESVIiICAgICAgICA6IGRpc3REaXIsCisgICAgICAgICAgICAgICAgIkRJU1RfU1VCRElSIiAgICAgOiBkaXN0U3ViZGlyLAorICAgICAgICBdCisgICAgfQorCisgICAgZGVmIGV4ZWN1dGVTaGVsbChTdHJpbmcgc2hlbGwpIHsKKyAgICAgICAgZXhlY3V0ZVNoZWxsKHNoZWxsLCBudWxsKQorICAgIH0KKworICAgIGRlZiBleGVjdXRlU2hlbGwoU3RyaW5nIHNoZWxsLCBNYXA8U3RyaW5nLCBTdHJpbmc+IG1vam9TcGVjaWZpY0Vudmlyb25tZW50KSB7CisgICAgICAgIGV4ZWN1dGVTaGVsbCh0cnVlLCBzaGVsbCwgbW9qb1NwZWNpZmljRW52aXJvbm1lbnQpCisgICAgfQorCisgICAgaW50IGV4ZWN1dGVTaGVsbChib29sZWFuIGV4Y2VwdGlvbk9uRXJyb3IsIFN0cmluZyBzaGVsbCwgTWFwPFN0cmluZywgU3RyaW5nPiBtb2pvU3BlY2lmaWNFbnZpcm9ubWVudCkgeworICAgICAgICBkZWYgc2hlbGxDb250ZW50ID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKHNoZWxsKS5nZXRCeXRlcygpCisKKyAgICAgICAgZGVmIGJ1aWxkZXIgPSBuZXcgUHJvY2Vzc0J1aWxkZXIoc2hlbGxFeGVjdXRhYmxlKG5ldyBTdHJpbmcoc2hlbGxDb250ZW50KSkpCisgICAgICAgIGRlZiBtYXAgPSBbOl0KKyAgICAgICAgbWFwLnB1dEFsbChtb2pvU3BlY2lmaWNFbnZpcm9ubWVudCA/OiBDb2xsZWN0aW9ucy5FTVBUWV9NQVApCisgICAgICAgIG1hcC5wdXRBbGwoY29tbW9uRW52aXJvbm1lbnQoKSA/OiBDb2xsZWN0aW9ucy5FTVBUWV9NQVApCisgICAgICAgIG1hcC5wdXRBbGwoY29udGFpbmVyRW52aXJvbm1lbnQoKSA/OiBDb2xsZWN0aW9ucy5FTVBUWV9NQVApCisgICAgICAgIG1hcC5wdXRBbGwoZW52aXJvbm1lbnQoKSA/OiBDb2xsZWN0aW9ucy5FTVBUWV9NQVApCisgICAgICAgIGJ1aWxkZXIuZW52aXJvbm1lbnQoKS5wdXRBbGwobWFwKQorCisgICAgICAgIG91dHB1dFNjcmlwdENvbnRlbnQoc2hlbGxDb250ZW50LCBtYXAsIHNoZWxsKQorCisgICAgICAgIC8vIHN0ZGVyciBhbmQgc3Rkb3V0IHJlZGlyZWN0ZWQgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGFsbG9jYXRlZCBhZGRpdGlvbmFsIHRocmVhZCB0byBjb25zdW1lIGEgc3RyZWFtCisgICAgICAgIGJ1aWxkZXIucmVkaXJlY3RFcnJvclN0cmVhbSh0cnVlKQorCisgICAgICAgIGRlZiBwcm9jZXNzID0gYnVpbGRlci5zdGFydCgpCisKKyAgICAgICAgLy8gcGlwZSBzaGVsbCBzY3JpcHQgaW50byB0aGUgc2hlbGwKKyAgICAgICAgZGVmIG91dHB1dFN0cmVhbSA9IG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShwcm9jZXNzLm91dCkKKyAgICAgICAgb3V0cHV0U3RyZWFtLndyaXRlKHNoZWxsQ29udGVudCkKKyAgICAgICAgb3V0cHV0U3RyZWFtLmNsb3NlKCkKKworICAgICAgICBkZWYgbGFzdExpbmVzUXVldWUgPSBFdmljdGluZ1F1ZXVlLjxTdHJpbmc+Y3JlYXRlKGxhc3RMaW5lc0NvdW50KQorCisgICAgICAgIHByb2Nlc3MuaW4uZWFjaExpbmUgeworICAgICAgICAgICAgbGFzdExpbmVzUXVldWUuYWRkKGl0KQorICAgICAgICAgICAgaWYgKGdldExvZygpPy5pc0RlYnVnRW5hYmxlZCgpICYmIGl0LnN0YXJ0c1dpdGgoIisiKSkgeworICAgICAgICAgICAgICAgIGdldExvZygpLmRlYnVnKGl0KQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBnZXRMb2coKS5pbmZvKGl0KQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvY2Vzcy53YWl0Rm9yKCkKKworICAgICAgICBpZiAocHJvY2Vzcy5leGl0VmFsdWUoKSAhPSAwICYmIGV4Y2VwdGlvbk9uRXJyb3IpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTaGVsbE1vam9FeGVjdXRpb25FeGNlcHRpb24oIlRoZSBzaGVsbCBzY3JpcHQ6ICciICsgc2hlbGwgKyAiJyBlbmRlZCB3aXRoIG5vbi16ZXJvIGV4aXQgdmFsdWUhIiwKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0VmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgbGFzdExpbmVzUXVldWUpCisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcHJvY2Vzcy5leGl0VmFsdWUoKQorICAgIH0KKworICAgIGRlZiBvdXRwdXRTY3JpcHRDb250ZW50KGJ5dGVbXSBzaGVsbENvbnRlbnQsIE1hcCBlbnZpcm9ubWVudCwgU3RyaW5nIHNoZWxsKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKQorICAgICAgICAgICAgZm9yIChNYXAuRW50cnkgZW50cnkgOiBlbnZpcm9ubWVudC5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKFN5c3RlbS5saW5lU2VwYXJhdG9yKCkpLmFwcGVuZChlbnRyeS5nZXRLZXkoKSkuYXBwZW5kKCI9XCIiKS5hcHBlbmQoZW50cnkuZ2V0VmFsdWUoKSkuYXBwZW5kKCJcIiIpCisgICAgICAgICAgICB9CisgICAgICAgICAgICBzYi5hcHBlbmQoU3lzdGVtLmxpbmVTZXBhcmF0b3IoKSkKKyAgICAgICAgICAgIGRlZiBtYXRjaGVyID0gUGF0dGVybi5jb21waWxlKCIoIyFbXlxyXG5dKikoLiopIiwgUGF0dGVybi5ET1RBTEwpLm1hdGNoZXIobmV3IFN0cmluZyhzaGVsbENvbnRlbnQpKQorICAgICAgICAgICAgZGVmIHN0cmluZyA9IG1hdGNoZXIubWF0Y2hlcygpID8gbWF0Y2hlci5yZXBsYWNlRmlyc3QoIlwkMSR7c2IudG9TdHJpbmcoKX1cJDIiKSA6IHNiLmFwcGVuZChzaGVsbENvbnRlbnQpLnRvU3RyaW5nKCkKKyAgICAgICAgICAgIFBhdGhzLmdldChzY3JpcHRzRGlyZWN0b3J5KS50b0ZpbGUoKS5ta2RpcnMoKQorICAgICAgICAgICAgZGVmIHJlRXhlY3V0YWJsZVNoZWxsID0gUGF0aHMuZ2V0KHNjcmlwdHNEaXJlY3RvcnksIFBhdGhzLmdldChzaGVsbCkuZmlsZU5hbWUudG9TdHJpbmcoKSkKKyAgICAgICAgICAgIEZpbGVzLndyaXRlKHJlRXhlY3V0YWJsZVNoZWxsLCBzdHJpbmcuYnl0ZXMpCisgICAgICAgICAgICBnZXRMb2coKS5pbmZvKCJSZS1leGVjdXRhYmxlIHNoZWxsIHdyaXR0ZW4gdG86ICRyZUV4ZWN1dGFibGVTaGVsbCIpCisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBnZXRMb2coKS53YXJuKCJVbmFibGUgdG8gb3V0cHV0IHJlLWV4ZWN1dGFibGUgc2hlbGwgY29udGVudCBvZiAkc2hlbGwiLCBlKQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBzZXRQcm9qZWN0KGZpbmFsIE1hdmVuUHJvamVjdCBwcm9qZWN0KSB7CisgICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3QKKyAgICB9CisKKyAgICB2b2lkIHNldFBvcnQoZmluYWwgaW50IHBvcnQpIHsKKyAgICAgICAgdGhpcy5wb3J0ID0gcG9ydAorICAgIH0KKworICAgIHZvaWQgc2V0QXBwbGljYXRpb25OYW1lKGZpbmFsIFN0cmluZyBhcHBsaWNhdGlvbk5hbWUpIHsKKyAgICAgICAgdGhpcy5hcHBsaWNhdGlvbk5hbWUgPSBhcHBsaWNhdGlvbk5hbWUKKyAgICB9CisKKyAgICB2b2lkIHNldERvbWFpbihmaW5hbCBTdHJpbmcgZG9tYWluKSB7CisgICAgICAgIHRoaXMuZG9tYWluID0gZG9tYWluCisgICAgfQorCisgICAgdm9pZCBzZXRDb250ZXh0Um9vdChmaW5hbCBTdHJpbmcgY29udGV4dFJvb3QpIHsKKyAgICAgICAgdGhpcy5jb250ZXh0Um9vdCA9IGNvbnRleHRSb290CisgICAgfQorCisgICAgdm9pZCBzZXREaXN0RGlyKGZpbmFsIFN0cmluZyBkaXN0RGlyKSB7CisgICAgICAgIHRoaXMuZGlzdERpciA9IGRpc3REaXIKKyAgICB9CisKKyAgICB2b2lkIHNldERpc3RTdWJkaXIoZmluYWwgU3RyaW5nIGRpc3RTdWJkaXIpIHsKKyAgICAgICAgdGhpcy5kaXN0U3ViZGlyID0gZGlzdFN1YmRpcgorICAgIH0KKworICAgIHZvaWQgc2V0U2tpcFN0YXJ0QW5kU3RvcChmaW5hbCBib29sZWFuIHNraXBTdGFydEFuZFN0b3ApIHsKKyAgICAgICAgdGhpcy5za2lwU3RhcnRBbmRTdG9wID0gc2tpcFN0YXJ0QW5kU3RvcAorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL21haW4vZ3Jvb3Z5L29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvbWF2ZW4vcnVubmVyL1NoZWxsTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbi5qYXZhIGIvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL21haW4vZ3Jvb3Z5L29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvbWF2ZW4vcnVubmVyL1NoZWxsTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MWM4OWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay9tYXZlbi9jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9ncm9vdnkvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9tYXZlbi9ydW5uZXIvU2hlbGxNb2pvRXhlY3V0aW9uRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0Lm1hdmVuLnJ1bm5lcjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKKworLyoqCisgKiBNb2pvIEV4ZWN1dGlvbiBleGNlcHRpb24gdGhhdCBjb250YWlucyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBhbiBlcnJvciBmcm9tIGFuIGV4ZWN1dGVkIHNoZWxsIHNjcmlwdC4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBTaGVsbE1vam9FeGVjdXRpb25FeGNlcHRpb24gZXh0ZW5kcyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uIHsKKworICAgIC8qKgorICAgICAqIFRoZSBlcnJvciBjb2RlIHRoZSBzaGVsbCBzY3JpcHQgZXhpdGVkIHdpdGguCisgICAgICovCisgICAgcHJpdmF0ZSBmaW5hbCBpbnQgZXJyb3JDb2RlOworCisgICAgLyoqCisgICAgICogVGhlIGxhc3QgbGluZXMgb2YgdGhlIG91dHB1dCBvZiB0aGUgZXhlY3V0ZWQgc2hlbGwgc2NyaXB0LgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IGxhc3RMaW5lczsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgc2hlbGwgbW9qbyBleGVjdGlvbiBleGNlcHRpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZSBUaGUgbWVzc2FnZSB0aGF0IHdpbGwgYmUgcHJlcGVuZGVkIHRvIGEgZGVmYXVsdCBtb2pvIGV4ZWN0dWlvbiBleGNlcHRpb24gbWVzc2FnZS4KKyAgICAgKiBAcGFyYW0gZXJyb3JDb2RlIFRoZSBlcnJvciBjb2RlLgorICAgICAqIEBwYXJhbSBsYXN0TGluZXMgVGhlIGNvbGxlY3Rpb24gb2YgbGFzdCBsaW5lcyB0aGF0IHdpbGwgYmUgYWxzbyBwYXJ0IG9mIHRoZSBleGNlcHRpb24gbWVzc2FnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2hlbGxNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBpbnQgZXJyb3JDb2RlLCBmaW5hbCBDb2xsZWN0aW9uPFN0cmluZz4gbGFzdExpbmVzKSB7CisgICAgICAgIHN1cGVyKG1lc3NhZ2UKKyAgICAgICAgICAgICAgICArICJcbkVycm9yIGV4aXQgY29kZTogIiArIGVycm9yQ29kZSArICIuIgorICAgICAgICAgICAgICAgICsgIlxuVGhlIGxhc3QgIiArIGxhc3RMaW5lcy5zaXplKCkgKyAiIGxpbmVzIG9mIHN0ZGVyci9zdGRvdXQgb3V0cHV0IGFyZTogIgorICAgICAgICAgICAgICAgICsgIlxuIiArIGxhc3RMaW5lc1RvU3RyaW5nKGxhc3RMaW5lcykpOworICAgICAgICB0aGlzLmVycm9yQ29kZSA9IGVycm9yQ29kZTsKKyAgICAgICAgdGhpcy5sYXN0TGluZXMgPSBsYXN0TGluZXM7CisgICAgfQorCisgICAgcHVibGljIGludCBnZXRFcnJvckNvZGUoKSB7CisgICAgICAgIHJldHVybiBlcnJvckNvZGU7CisgICAgfQorCisgICAgcHVibGljIENvbGxlY3Rpb248U3RyaW5nPiBnZXRMYXN0TGluZXMoKSB7CisgICAgICAgIHJldHVybiBsYXN0TGluZXM7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGxhc3RMaW5lc1RvU3RyaW5nKENvbGxlY3Rpb248U3RyaW5nPiBjb2xsZWN0aW9uKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBpbnQgbGluZU51bWJlciA9IDE7CisgICAgICAgIGZvciAoU3RyaW5nIHN0cmluZyA6IGNvbGxlY3Rpb24pIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiTGluZSAiKS5hcHBlbmQobGluZU51bWJlcisrKS5hcHBlbmQoIjogIik7CisgICAgICAgICAgICBzYi5hcHBlbmQoc3RyaW5nKS5hcHBlbmQoIlxuIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL21haW4vZ3Jvb3Z5L29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvbWF2ZW4vcnVubmVyL1N1cGVyUnVubmVyTW9qby5ncm9vdnkgYi90ZXN0LWZyYW1ld29yay9tYXZlbi9jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9ncm9vdnkvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9tYXZlbi9ydW5uZXIvU3VwZXJSdW5uZXJNb2pvLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzUyMzE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL21haW4vZ3Jvb3Z5L29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvbWF2ZW4vcnVubmVyL1N1cGVyUnVubmVyTW9qby5ncm9vdnkKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0Lm1hdmVuLnJ1bm5lcgorCitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qbworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucy5hbm5vdGF0aW9ucy5QYXJhbWV0ZXIKKworLyoqCisgKiBUaGlzIHRyYWl0IHNlcnZlcyBhcyBhIGZpZWxkIGNvbnRhaW5lciBvbmx5IGFzIGEgd29ya2Fyb3VuZCBmb3IgZmFpbGluZyBUcmFpdHMgd2l0aCBtb3JlIHRoYW4gMTAgZmllbGRzIChzZWUKKyAqIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMjcyNTk2MzMvdXNpbmctZ3Jvb3Z5LXRyYWl0LWluLWdyYWlscy10ZXN0LWZhaWxzKQorICoKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLwordHJhaXQgU3VwZXJSdW5uZXJNb2pvIGltcGxlbWVudHMgTW9qbyB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgbnVtYmVyIG9mIGxpbmVzIG9mIHN0ZGVyci9zdGRvdXQgdG8gcHJpbnQgd2hlbiBhbiBleGVjdXRpb24gZmFpbHVyZSBvY2N1cnMuCisgICAgICovCisgICAgQFBhcmFtZXRlcihkZWZhdWx0VmFsdWUgPSAiMTAiLCBuYW1lID0gImxhc3RMaW5lc0NvdW50IikKKyAgICBpbnQgbGFzdExpbmVzQ291bnQKKworICAgIHZvaWQgc2V0TGFzdExpbmVzQ291bnQoZmluYWwgaW50IGxhc3RMaW5lc0NvdW50KSB7CisgICAgICAgIHRoaXMubGFzdExpbmVzQ291bnQgPSBsYXN0TGluZXNDb3VudAorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2NvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2dyb292eS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L21hdmVuL3J1bm5lci9nZjQvQWJzdHJhY3RHbGFzc2Zpc2hSdW5uZXJNb2pvLmdyb292eSBiL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2NvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2dyb292eS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L21hdmVuL3J1bm5lci9nZjQvQWJzdHJhY3RHbGFzc2Zpc2hSdW5uZXJNb2pvLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzJiMDIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL21haW4vZ3Jvb3Z5L29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvbWF2ZW4vcnVubmVyL2dmNC9BYnN0cmFjdEdsYXNzZmlzaFJ1bm5lck1vam8uZ3Jvb3Z5CkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5tYXZlbi5ydW5uZXIuZ2Y0CisKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uCitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0ZhaWx1cmVFeGNlcHRpb24KK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuYW5ub3RhdGlvbnMuUGFyYW1ldGVyCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdtYXZlbnBsdXMubW9qby5BYnN0cmFjdEdyb292eU1vam8KK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0Lm1hdmVuLnJ1bm5lci5SdW5uZXJNb2pvCisKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhzCisvKioKKyAqIEFic3RyYWN0IGNsYXNzIGZvciBhbGwgR2xhc3NmaXNoNCByZWxhdGVkIG1vam9zLgorICoKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLworYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RHbGFzc2Zpc2hSdW5uZXJNb2pvIGV4dGVuZHMgQWJzdHJhY3RHcm9vdnlNb2pvIGltcGxlbWVudHMgUnVubmVyTW9qbyB7CisKKyAgICAvKioKKyAgICAgKiBUaGUge0Bjb2RlIEFTX0hPTUV9IGVudmlyb25tZW50IHZhcmlhYmxlIHZhbHVlLiBJZiByZWxhdGl2ZSBkaXJlY3RvcnkgaXMgc3BlY2lmaWVkICh3aGljaCBpcyB0aGUgZGVmYXVsdCksIGl0IGlzIGRlcml2ZWQKKyAgICAgKiBmcm9tIHtAbGluayAjZ2V0RGlzdERpcigpfSBhbmQge0BsaW5rICNnZXREaXN0U3ViZGlyKCl9IHRvZ2V0aGVyIHdpdGggdGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkuCisgICAgICovCisgICAgQFBhcmFtZXRlcihkZWZhdWx0VmFsdWUgPSAiZ2xhc3NmaXNoIikKKyAgICBTdHJpbmcgYXNIb21lCisKKyAgICAvKioKKyAgICAgKiBUaGUgR2xhc3NmaXNoIGFkbWluIHBvcnQKKyAgICAgKi8KKyAgICBAUGFyYW1ldGVyKGRlZmF1bHRWYWx1ZSA9ICIyNDg0OCIpCisgICAgaW50IGFkbWluUG9ydAorCisgICAgLyoqCisgICAgICogVGhlIHRpbWVvdXQgdmFsdWUgaW4gbWlsbGlzZWNvbmRzIG9mIHtAY29kZSBBU19BRE1JTl9SRUFEVElNRU9VVH0gZW52aXJvbm1lbnRhbCB2YXJpYWJsZS4KKyAgICAgKi8KKyAgICBAUGFyYW1ldGVyKGRlZmF1bHRWYWx1ZSA9ICI2MDAwMCIpCisgICAgaW50IGFzQWRtaW5SZWFkVGltZW91dAorCisgICAgLyoqCisgICAgICogVGhlIGxvY2F0aW9uIG9mIGxvZyBmaWxlLiBJZiByZWxhdGl2ZSBwYXRoIHNwZWNpZmllZCwgaXQgaXMgZGVyaXZlZCBmcm9tIDxjb2RlPntAbGluayAjYXNIb21lfS9kb21haW5zLworICAgICAqIHtAbGluayAjZ2V0RG9tYWluKCl9L2xvZ3MvJmx0O3RoZSB2YWx1ZSBvZiB0aGlzIHByb3BlcnR5Jmd0OzwvY29kZT4KKyAgICAgKi8KKyAgICBAUGFyYW1ldGVyKGRlZmF1bHRWYWx1ZSA9ICJzZXJ2ZXIubG9nIikKKyAgICBTdHJpbmcgbG9nRmlsZQorCisgICAgQE92ZXJyaWRlCisgICAgdm9pZCBleGVjdXRlKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24sIE1vam9GYWlsdXJlRXhjZXB0aW9uIHsKKyAgICAgICAgYXNIb21lID0gUGF0aHMuZ2V0KGFzSG9tZSkuaXNBYnNvbHV0ZSgpID8gYXNIb21lIDogUGF0aHMuZ2V0KGRpc3REaXIsIGRpc3RTdWJkaXIsIGFzSG9tZSkKKyAgICAgICAgbG9nRmlsZSA9IFBhdGhzLmdldChsb2dGaWxlKS5pc0Fic29sdXRlKCk/IGxvZ0ZpbGUgOiBQYXRocy5nZXQoYXNIb21lLCAiZG9tYWlucyIsIGRvbWFpbiwgImxvZ3MiLCBsb2dGaWxlKQorICAgICAgICBleGVjdXRlUnVubmVyKCkKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBNYXAgY29udGFpbmVyRW52aXJvbm1lbnQoKSB7CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgIkFTX0hPTUUiICAgICAgICAgICAgIDogYXNIb21lLAorICAgICAgICAgICAgICAgICJBRE1JTlBPUlQiICAgICAgICAgICA6IGFkbWluUG9ydCBhcyBTdHJpbmcsCisgICAgICAgICAgICAgICAgIkFTX0FETUlOX1JFQURUSU1FT1VUIjogYXNBZG1pblJlYWRUaW1lb3V0IGFzIFN0cmluZworICAgICAgICBdCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL21haW4vZ3Jvb3Z5L29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvbWF2ZW4vcnVubmVyL2dmNC9Eb3dubG9hZEdsYXNzZmlzaE1vam8uZ3Jvb3Z5IGIvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL21haW4vZ3Jvb3Z5L29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvbWF2ZW4vcnVubmVyL2dmNC9Eb3dubG9hZEdsYXNzZmlzaE1vam8uZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhYjIyZTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay9tYXZlbi9jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9ncm9vdnkvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9tYXZlbi9ydW5uZXIvZ2Y0L0Rvd25sb2FkR2xhc3NmaXNoTW9qby5ncm9vdnkKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0Lm1hdmVuLnJ1bm5lci5nZjQKKworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb24KK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRmFpbHVyZUV4Y2VwdGlvbgoraW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucy5hbm5vdGF0aW9ucy5Nb2pvCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5tYXZlbi5ydW5uZXIuQ29tbW9uRG93bmxvYWQKKworLyoqCisgKiBUaGlzIG1vam8gcGVyZm9ybXMgZG93bmxvYWQgYW5kIHVuemlwIG9mIEdsYXNzZmlzaCB6aXAgZGlzdHJpYnV0aW9uLgorICoKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLworQE1vam8obmFtZSA9ICJkb3dubG9hZEdmNCIpCitjbGFzcyBEb3dubG9hZEdsYXNzZmlzaE1vam8gZXh0ZW5kcyBBYnN0cmFjdEdsYXNzZmlzaFJ1bm5lck1vam8gaW1wbGVtZW50cyBDb21tb25Eb3dubG9hZCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICB2b2lkIGV4ZWN1dGVSdW5uZXIoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiwgTW9qb0ZhaWx1cmVFeGNlcHRpb24geworCisgICAgICAgIGlmICghbmV3IEZpbGUoYXNIb21lKS5jYW5vbmljYWxQYXRoLnN0YXJ0c1dpdGgobmV3IEZpbGUoZGlzdERpcikuY2Fub25pY2FsUGF0aCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRmFpbHVyZUV4Y2VwdGlvbigiR2l2ZW4gJ213SG9tZScgPCRhc0hvbWU+IGlzIG5vdCBhIHN1YnBhdGggb2YgJ2Rpc3REaXInIDwkZGlzdERpcj4hIikKKyAgICAgICAgfQorCisgICAgICAgIGV4ZWN1dGVTaGVsbCgiL3J1bm5lci9nZjQvZG93bmxvYWQuc2giKQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL21haW4vZ3Jvb3Z5L29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvbWF2ZW4vcnVubmVyL2dmNC9SZWRlcGxveUdsYXNzZmlzaE1vam8uZ3Jvb3Z5IGIvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL21haW4vZ3Jvb3Z5L29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvbWF2ZW4vcnVubmVyL2dmNC9SZWRlcGxveUdsYXNzZmlzaE1vam8uZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1YzU5ZTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay9tYXZlbi9jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9ncm9vdnkvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9tYXZlbi9ydW5uZXIvZ2Y0L1JlZGVwbG95R2xhc3NmaXNoTW9qby5ncm9vdnkKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0Lm1hdmVuLnJ1bm5lci5nZjQKKworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb24KK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRmFpbHVyZUV4Y2VwdGlvbgoraW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucy5hbm5vdGF0aW9ucy5Nb2pvCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5tYXZlbi5ydW5uZXIuQ29tbW9uUmVkZXBsb3kKKworLyoqCisgKiBUaGlzIG1vam8gcmVwZXRpdGl2ZWx5IHJlZGVwbG95cyBnaXZlbiBhcHBsaWNhdGlvbiB0byBHbGFzc2Zpc2ggYW5kIHBlcmZvcm1zIGEgaHR0cCByZXF1ZXN0IHRvIGl0LgorICoKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLworQE1vam8obmFtZSA9ICJyZWRlcGxveUdmNCIpCitjbGFzcyBSZWRlcGxveUdsYXNzZmlzaE1vam8gZXh0ZW5kcyBBYnN0cmFjdEdsYXNzZmlzaFJ1bm5lck1vam8gaW1wbGVtZW50cyBDb21tb25SZWRlcGxveSB7CisKKyAgICB2b2lkIGV4ZWN1dGVSdW5uZXIoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiwgTW9qb0ZhaWx1cmVFeGNlcHRpb24geworICAgICAgICByZWRlcGxveUFuZFNlbmRSZXF1ZXN0KCIvcnVubmVyL2dmNC9yZWRlcGxveS5zaCIsICIvcnVubmVyL2dmNC9zdG9wLnNoIikKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL21haW4vZ3Jvb3Z5L29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvbWF2ZW4vcnVubmVyL2dmNC9TdGFydEFuZERlcGxveUdsYXNzZmlzaE1vam8uZ3Jvb3Z5IGIvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL21haW4vZ3Jvb3Z5L29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvbWF2ZW4vcnVubmVyL2dmNC9TdGFydEFuZERlcGxveUdsYXNzZmlzaE1vam8uZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2YjZhZWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay9tYXZlbi9jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9ncm9vdnkvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9tYXZlbi9ydW5uZXIvZ2Y0L1N0YXJ0QW5kRGVwbG95R2xhc3NmaXNoTW9qby5ncm9vdnkKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0Lm1hdmVuLnJ1bm5lci5nZjQKKworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb24KK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRmFpbHVyZUV4Y2VwdGlvbgoraW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucy5hbm5vdGF0aW9ucy5Nb2pvCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5tYXZlbi5ydW5uZXIuQ29tbW9uU3RhcnRBbmREZXBsb3kKKworLyoqCisgKiBUaGlzIG1vam8gc3RhcnRzIEdsYXNzZmlzaDQgYW5kIGRlcGxveXMgcHJvdmlkZWQgYXBwbGljYXRpb24gdG8gaXQuCisgKgorICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYSBhdCBvcmFjbGUuY29tKQorICovCitATW9qbyhuYW1lID0gInN0YXJ0QW5kRGVwbG95R2Y0IikKK2NsYXNzIFN0YXJ0QW5kRGVwbG95R2xhc3NmaXNoTW9qbyBleHRlbmRzIEFic3RyYWN0R2xhc3NmaXNoUnVubmVyTW9qbyBpbXBsZW1lbnRzIENvbW1vblN0YXJ0QW5kRGVwbG95IHsKKworICAgIEBPdmVycmlkZQorICAgIHZvaWQgZXhlY3V0ZVJ1bm5lcigpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uLCBNb2pvRmFpbHVyZUV4Y2VwdGlvbiB7CisgICAgICAgIHN0YXJ0QW5kRGVwbG95U3RvcE9uRmFpbHVyZSgiL3J1bm5lci9nZjQvc3RhcnQuc2giLCAiL3J1bm5lci9nZjQvc3RvcC5zaCIpCisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0LWZyYW1ld29yay9tYXZlbi9jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9ncm9vdnkvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9tYXZlbi9ydW5uZXIvZ2Y0L1N0b3BHbGFzc2Zpc2hNb2pvLmdyb292eSBiL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2NvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2dyb292eS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L21hdmVuL3J1bm5lci9nZjQvU3RvcEdsYXNzZmlzaE1vam8uZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYmRjYzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay9tYXZlbi9jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9ncm9vdnkvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9tYXZlbi9ydW5uZXIvZ2Y0L1N0b3BHbGFzc2Zpc2hNb2pvLmdyb292eQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QubWF2ZW4ucnVubmVyLmdmNAorCitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgoraW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9GYWlsdXJlRXhjZXB0aW9uCitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zLmFubm90YXRpb25zLk1vam8KK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0Lm1hdmVuLnJ1bm5lci5Db21tb25TdG9wCisKKy8qKgorICogVGhpcyBtb2pvIHN0b3BzIEdsYXNzZmlzaC4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK0BNb2pvKG5hbWUgPSAic3RvcEdmNCIpCitjbGFzcyBTdG9wR2xhc3NmaXNoTW9qbyBleHRlbmRzIEFic3RyYWN0R2xhc3NmaXNoUnVubmVyTW9qbyBpbXBsZW1lbnRzIENvbW1vblN0b3AgeworCisgICAgQE92ZXJyaWRlCisgICAgdm9pZCBleGVjdXRlUnVubmVyKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24sIE1vam9GYWlsdXJlRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVNoZWxsKCIvcnVubmVyL2dmNC9zdG9wLnNoIikKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2NvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2dyb292eS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L21hdmVuL3J1bm5lci90b21jYXQvQWJzdHJhY3RUb21jYXRSdW5uZXJNb2pvLmdyb292eSBiL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2NvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2dyb292eS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L21hdmVuL3J1bm5lci90b21jYXQvQWJzdHJhY3RUb21jYXRSdW5uZXJNb2pvLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOThiNTlkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL21haW4vZ3Jvb3Z5L29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvbWF2ZW4vcnVubmVyL3RvbWNhdC9BYnN0cmFjdFRvbWNhdFJ1bm5lck1vam8uZ3Jvb3Z5CkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5tYXZlbi5ydW5uZXIudG9tY2F0CisKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uCitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0ZhaWx1cmVFeGNlcHRpb24KK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuYW5ub3RhdGlvbnMuUGFyYW1ldGVyCitpbXBvcnQgb3JnLmNvZGVoYXVzLmdtYXZlbnBsdXMubW9qby5BYnN0cmFjdEdyb292eU1vam8KK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0Lm1hdmVuLnJ1bm5lci5SdW5uZXJNb2pvCisKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhzCisvKioKKyAqIEFic3RyYWN0IGNsYXNzIGZvciBhbGwgVG9tY2F0IHJlbGF0ZWQgbW9qb3MuCisgKgorICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYSBhdCBvcmFjbGUuY29tKQorICovCisKK2Fic3RyYWN0IGNsYXNzIEFic3RyYWN0VG9tY2F0UnVubmVyTW9qbyBleHRlbmRzIEFic3RyYWN0R3Jvb3Z5TW9qbyBpbXBsZW1lbnRzIFJ1bm5lck1vam8geworCisgICAgLyoqCisgICAgICoge0Bjb2RlIENBVEFMSU5BX0hPTUV9IGVudmlyb25tZW50YWwgdmFyaWFibGUuIElmIHJlbGF0aXZlIHBhdGggc3BlY2lmaWVkLCB0aGVuIGl0IGlzIGFwcGVuZGVkIHRvCisgICAgICogPGNvZGU+e0BsaW5rICNnZXREaXN0RGlyKCl9L3tAbGluayAjZ2V0RGlzdFN1YmRpcigpfS88L2NvZGU+LgorICAgICAqLworICAgIEBQYXJhbWV0ZXIoZGVmYXVsdFZhbHVlID0gIi4iKQorICAgIFN0cmluZyBjYXRhbGluYUhvbWUKKworICAgIC8qKgorICAgICAqIFRoZSBsb2NhdGlvbiBvZiBUb21jYXQgbG9nIGZpbGUgdGhhdCBpcyBiZWluZyBpbnNwZWN0ZWQuIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvCisgICAgICogPGNvZGU+e0BsaW5rICNjYXRhbGluYUhvbWV9L2xvZ3MvY2F0YWxpbmEub3V0PC9jb2RlPgorICAgICAqLworICAgIEBQYXJhbWV0ZXIKKyAgICBTdHJpbmcgbG9nRmlsZQorCisgICAgQE92ZXJyaWRlCisgICAgdm9pZCBleGVjdXRlKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24sIE1vam9GYWlsdXJlRXhjZXB0aW9uIHsKKyAgICAgICAgY2F0YWxpbmFIb21lID0gUGF0aHMuZ2V0KGNhdGFsaW5hSG9tZSkuaXNBYnNvbHV0ZSgpID8gY2F0YWxpbmFIb21lIDogUGF0aHMuZ2V0KGRpc3REaXIsIGRpc3RTdWJkaXIsIGNhdGFsaW5hSG9tZSkKKyAgICAgICAgbG9nRmlsZSA9IGxvZ0ZpbGUgPzogUGF0aHMuZ2V0KGNhdGFsaW5hSG9tZSwgImxvZ3MiLCAiY2F0YWxpbmEub3V0IikudG9TdHJpbmcoKQorICAgICAgICBleGVjdXRlUnVubmVyKCkKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBNYXAgY29udGFpbmVyRW52aXJvbm1lbnQoKSB7CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgIkNBVEFMSU5BX0hPTUUiOiBjYXRhbGluYUhvbWUsCisgICAgICAgICAgICAgICAgIkNBVEFMSU5BX1BJRCIgOiAiJGNhdGFsaW5hSG9tZS9iaW4vY2F0YWxpbmEucGlkIiBhcyBTdHJpbmcKKyAgICAgICAgXQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2NvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2dyb292eS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L21hdmVuL3J1bm5lci90b21jYXQvRG93bmxvYWRUb21jYXRNb2pvLmdyb292eSBiL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2NvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2dyb292eS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L21hdmVuL3J1bm5lci90b21jYXQvRG93bmxvYWRUb21jYXRNb2pvLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2YzMWY5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL21haW4vZ3Jvb3Z5L29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvbWF2ZW4vcnVubmVyL3RvbWNhdC9Eb3dubG9hZFRvbWNhdE1vam8uZ3Jvb3Z5CkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5tYXZlbi5ydW5uZXIudG9tY2F0CisKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uCitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0ZhaWx1cmVFeGNlcHRpb24KK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuYW5ub3RhdGlvbnMuTW9qbworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QubWF2ZW4ucnVubmVyLkNvbW1vbkRvd25sb2FkCisKKy8qKgorICogVGhpcyBtb2pvIHBlcmZvcm1zIGRvd25sb2FkIGFuZCB1bnppcCBvZiBUb21jYXQgemlwIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK0BNb2pvKG5hbWUgPSAiZG93bmxvYWRUb21jYXQiKQorY2xhc3MgRG93bmxvYWRUb21jYXRNb2pvIGV4dGVuZHMgQWJzdHJhY3RUb21jYXRSdW5uZXJNb2pvIGltcGxlbWVudHMgQ29tbW9uRG93bmxvYWQgeworCisgICAgQE92ZXJyaWRlCisgICAgdm9pZCBleGVjdXRlUnVubmVyKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24sIE1vam9GYWlsdXJlRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoIW5ldyBGaWxlKGNhdGFsaW5hSG9tZSkuY2Fub25pY2FsUGF0aC5zdGFydHNXaXRoKG5ldyBGaWxlKGRpc3REaXIpLmNhbm9uaWNhbFBhdGgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0ZhaWx1cmVFeGNlcHRpb24oIkdpdmVuICdtd0hvbWUnIDwkY2F0YWxpbmFIb21lPiBpcyBub3QgYSBzdWJwYXRoIG9mICdkaXN0RGlyJyA8JGRpc3REaXI+ISIpCisgICAgICAgIH0KKworICAgICAgICBleGVjdXRlU2hlbGwoIi9ydW5uZXIvdG9tY2F0L2Rvd25sb2FkLnNoIikKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2NvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2dyb292eS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L21hdmVuL3J1bm5lci90b21jYXQvUmVkZXBsb3lUb21jYXRNb2pvLmdyb292eSBiL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2NvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2dyb292eS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L21hdmVuL3J1bm5lci90b21jYXQvUmVkZXBsb3lUb21jYXRNb2pvLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGI4ZDdiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL21haW4vZ3Jvb3Z5L29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvbWF2ZW4vcnVubmVyL3RvbWNhdC9SZWRlcGxveVRvbWNhdE1vam8uZ3Jvb3Z5CkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5tYXZlbi5ydW5uZXIudG9tY2F0CisKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uCitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0ZhaWx1cmVFeGNlcHRpb24KK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuYW5ub3RhdGlvbnMuTW9qbworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QubWF2ZW4ucnVubmVyLkNvbW1vblJlZGVwbG95CisKKy8qKgorICogVGhpcyBtb2pvIHJlcGV0aXRpdmVseSByZWRlcGxveXMgZ2l2ZW4gYXBwbGljYXRpb24gdG8gVG9tY2F0IGFuZCBwZXJmb3JtcyBhIGh0dHAgcmVxdWVzdCB0byBpdC4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK0BNb2pvKG5hbWUgPSAicmVkZXBsb3lUb21jYXQiKQorY2xhc3MgUmVkZXBsb3lUb21jYXRNb2pvIGV4dGVuZHMgQWJzdHJhY3RUb21jYXRSdW5uZXJNb2pvIGltcGxlbWVudHMgQ29tbW9uUmVkZXBsb3kgeworCisgICAgdm9pZCBleGVjdXRlUnVubmVyKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24sIE1vam9GYWlsdXJlRXhjZXB0aW9uIHsKKyAgICAgICAgcmVkZXBsb3lBbmRTZW5kUmVxdWVzdCgiL3J1bm5lci90b21jYXQvcmVkZXBsb3kuc2giLCAiL3J1bm5lci90b21jYXQvc3RvcC5zaCIpCisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0LWZyYW1ld29yay9tYXZlbi9jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9ncm9vdnkvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9tYXZlbi9ydW5uZXIvdG9tY2F0L1N0YXJ0QW5kRGVwbG95VG9tY2F0TW9qby5ncm9vdnkgYi90ZXN0LWZyYW1ld29yay9tYXZlbi9jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9ncm9vdnkvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9tYXZlbi9ydW5uZXIvdG9tY2F0L1N0YXJ0QW5kRGVwbG95VG9tY2F0TW9qby5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRjZDMxYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2NvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2dyb292eS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L21hdmVuL3J1bm5lci90b21jYXQvU3RhcnRBbmREZXBsb3lUb21jYXRNb2pvLmdyb292eQpAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QubWF2ZW4ucnVubmVyLnRvbWNhdAorCitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgoraW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9GYWlsdXJlRXhjZXB0aW9uCitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zLmFubm90YXRpb25zLk1vam8KK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuYW5ub3RhdGlvbnMuUGFyYW1ldGVyCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5tYXZlbi5ydW5uZXIuQ29tbW9uU3RhcnRBbmREZXBsb3kKKworLyoqCisgKiBUaGlzIG1vam8gc3RhcnRzIFRvbWNhdCBhbmQgZGVwbG95cyBwcm92aWRlZCBhcHBsaWNhdGlvbiB0byBpdC4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK0BNb2pvKG5hbWUgPSAic3RhcnRBbmREZXBsb3lUb21jYXQiKQorY2xhc3MgU3RhcnRBbmREZXBsb3lUb21jYXRNb2pvIGV4dGVuZHMgQWJzdHJhY3RUb21jYXRSdW5uZXJNb2pvIGltcGxlbWVudHMgQ29tbW9uU3RhcnRBbmREZXBsb3kgeworCisgICAgLyoqCisgICAgICogRm9yIGhvdyBsb25nIChtdWx0aXBsaWVkIGJ5IDUpIHRvIHdhaXQgZm9yIFRvbWNhdCB0byBzdGFydCB1cC4KKyAgICAgKi8KKyAgICBAUGFyYW1ldGVyKGRlZmF1bHRWYWx1ZSA9ICIyMCIsIG5hbWUgPSAidHJpZXNDb3VudCIpCisgICAgaW50IHRyaWVzQ291bnQKKworICAgIC8qKgorICAgICAqIFRvbWNhdCBzcGVjaWZpYyBtZW1vcnkgbGVhayBwcmV2ZW50aW9uIGxpc3RlbmVycyBmbGFnLiBEaXNhYmxlZCBieSBkZWZhdWx0IHNvIHRoYXQgbWVtb3J5IGxlYWtzIGNhbiBiZSBkZXRlY3RlZC4KKyAgICAgKiBXaGVuIGVuYWJsZWQsIG1lbW9yeSBsZWFrIHByZXZlbnRpb24gaXMgdHVybmVkIG9uOyBpbiBwYXJ0aWN1bGFyLCBsaXN0ZW5lcnMKKyAgICAgKiB7QGNvZGUgb3JnLmFwYWNoZS5jYXRhbGluYS5jb3JlLlRocmVhZExvY2FsTGVha1ByZXZlbnRpb25MaXN0ZW5lcn0sCisgICAgICoge0Bjb2RlIG9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5KcmVNZW1vcnlMZWFrUHJldmVudGlvbkxpc3RlbmVyfSBhbmQKKyAgICAgKiB7QGNvZGUgb3JnLmFwYWNoZS5jYXRhbGluYS5tYmVhbnMuR2xvYmFsUmVzb3VyY2VzTGlmZWN5Y2xlTGlzdGVuZXJ9IGFyZSBlbmFibGVkLgorICAgICAqCisgICAgICovCisgICAgQFBhcmFtZXRlcihkZWZhdWx0VmFsdWUgPSAiZmFsc2UiLCBwcm9wZXJ0eSA9ICJqZXJzZXkucnVubmVyLm1lbW9yeUxlYWtQcmV2ZW50aW9uIikKKyAgICBib29sZWFuIG1lbW9yeUxlYWtQcmV2ZW50aW9uCisKKyAgICBAT3ZlcnJpZGUKKyAgICB2b2lkIGV4ZWN1dGVSdW5uZXIoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiwgTW9qb0ZhaWx1cmVFeGNlcHRpb24geworICAgICAgICBzdGFydEFuZERlcGxveVN0b3BPbkZhaWx1cmUoIi9ydW5uZXIvdG9tY2F0L3N0YXJ0LnNoIiwgIi9ydW5uZXIvdG9tY2F0L3N0b3Auc2giLCBbCisgICAgICAgICAgICAgICAgIlRSSUVTX0NPVU5UIjogdHJpZXNDb3VudCBhcyBTdHJpbmcsCisgICAgICAgICAgICAgICAgIk1FTU9SWV9MRUFLX1BSRVZFTlRJT04iOiBtZW1vcnlMZWFrUHJldmVudGlvbiBhcyBTdHJpbmcKKyAgICAgICAgXSkKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2NvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2dyb292eS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L21hdmVuL3J1bm5lci90b21jYXQvU3RvcFRvbWNhdE1vam8uZ3Jvb3Z5IGIvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL21haW4vZ3Jvb3Z5L29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvbWF2ZW4vcnVubmVyL3RvbWNhdC9TdG9wVG9tY2F0TW9qby5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ0NWQ0OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2NvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2dyb292eS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L21hdmVuL3J1bm5lci90b21jYXQvU3RvcFRvbWNhdE1vam8uZ3Jvb3Z5CkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5tYXZlbi5ydW5uZXIudG9tY2F0CisKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uCitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0ZhaWx1cmVFeGNlcHRpb24KK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuYW5ub3RhdGlvbnMuTW9qbworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QubWF2ZW4ucnVubmVyLkNvbW1vblN0b3AKKworLyoqCisgKiBUaGlzIG1vam8gc3RvcHMgVG9tY2F0LgorICoKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLworQE1vam8obmFtZSA9ICJzdG9wVG9tY2F0IikKK2NsYXNzIFN0b3BUb21jYXRNb2pvIGV4dGVuZHMgQWJzdHJhY3RUb21jYXRSdW5uZXJNb2pvIGltcGxlbWVudHMgQ29tbW9uU3RvcCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICB2b2lkIGV4ZWN1dGVSdW5uZXIoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiwgTW9qb0ZhaWx1cmVFeGNlcHRpb24geworICAgICAgICBleGVjdXRlU2hlbGwoIi9ydW5uZXIvdG9tY2F0L3N0b3Auc2giKQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL21haW4vZ3Jvb3Z5L29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvbWF2ZW4vcnVubmVyL3dscy9BYnN0cmFjdFdsc1J1bm5lck1vam8uZ3Jvb3Z5IGIvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL21haW4vZ3Jvb3Z5L29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvbWF2ZW4vcnVubmVyL3dscy9BYnN0cmFjdFdsc1J1bm5lck1vam8uZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYTlmZmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay9tYXZlbi9jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9ncm9vdnkvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9tYXZlbi9ydW5uZXIvd2xzL0Fic3RyYWN0V2xzUnVubmVyTW9qby5ncm9vdnkKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0Lm1hdmVuLnJ1bm5lci53bHMKKworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb24KK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRmFpbHVyZUV4Y2VwdGlvbgoraW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucy5hbm5vdGF0aW9ucy5QYXJhbWV0ZXIKK2ltcG9ydCBvcmcuY29kZWhhdXMuZ21hdmVucGx1cy5tb2pvLkFic3RyYWN0R3Jvb3Z5TW9qbworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QubWF2ZW4ucnVubmVyLlJ1bm5lck1vam8KKworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHMKKworLyoqCisgKiBBYnN0cmFjdCBjbGFzcyBmb3IgYWxsIFdlYmxvZ2ljIHJlbGF0ZWQgbW9qb3MuCisgKgorICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYSBhdCBvcmFjbGUuY29tKQorICovCithYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFdsc1J1bm5lck1vam8gZXh0ZW5kcyBBYnN0cmFjdEdyb292eU1vam8gaW1wbGVtZW50cyBSdW5uZXJNb2pvIHsKKworICAgIC8qKgorICAgICAqIFRoZSB2YWx1ZSBvZiB7QGNvZGUgTVdfSE9NRX0gZGlyZWN0b3J5CisgICAgICovCisgICAgQFBhcmFtZXRlcihkZWZhdWx0VmFsdWUgPSAiLiIpCisgICAgU3RyaW5nIG13SG9tZQorCisgICAgLyoqCisgICAgICogVGhlIFdMUyBzZXJ2ZXIgbmFtZS4gUGFzc2VkIHRvIFdMUyBKVk0gYXMge0Bjb2RlIHdlYmxvZ2ljLk5hbWV9LgorICAgICAqLworICAgIEBQYXJhbWV0ZXIoZGVmYXVsdFZhbHVlID0gIk1lbW9yeUxlYWtUZXN0U2VydmVyIikKKyAgICBTdHJpbmcgc2VydmVyTmFtZQorCisgICAgLyoqCisgICAgICogVGhlIGxvY2F0aW9uIG9mIFdscyBsb2cgZmlsZSB0aGF0IGlzIGJlaW5nIGluc3BlY3RlZC4gSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8KKyAgICAgKiA8Y29kZT57QGxpbmsgI213SG9tZX0ve0BsaW5rICNnZXREb21haW4oKX0vd2xzLmxvZzwvY29kZT4gd2hpY2ggaXMgd2hlcmUgdGhlIFdMUyBvdXRwdXRzIGl0cyBtZXNzYWdlcyBieSBkZWZhdWx0LgorICAgICAqLworICAgIEBQYXJhbWV0ZXIKKyAgICBTdHJpbmcgbG9nRmlsZTsKKworICAgIEBPdmVycmlkZQorICAgIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uLCBNb2pvRmFpbHVyZUV4Y2VwdGlvbiB7CisgICAgICAgIG13SG9tZSA9IFBhdGhzLmdldChtd0hvbWUpLmlzQWJzb2x1dGUoKSA/IG13SG9tZSA6IFBhdGhzLmdldChkaXN0RGlyLCBkaXN0U3ViZGlyLCBtd0hvbWUpCisgICAgICAgIGxvZ0ZpbGUgPSBsb2dGaWxlID86IFBhdGhzLmdldChtd0hvbWUsIGRvbWFpbiwgIndscy5sb2ciKS50b1N0cmluZygpCisgICAgICAgIGV4ZWN1dGVSdW5uZXIoKQorICAgIH0KKworICAgIE1hcCBjb250YWluZXJFbnZpcm9ubWVudCgpIHsKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAiTVdfSE9NRSIgICAgICAgIDogbXdIb21lLAorICAgICAgICAgICAgICAgICJXTFNfU0VSVkVSX05BTUUiOiBzZXJ2ZXJOYW1lCisgICAgICAgIF0KKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL21haW4vZ3Jvb3Z5L29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvbWF2ZW4vcnVubmVyL3dscy9Eb3dubG9hZFdsc01vam8uZ3Jvb3Z5IGIvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL21haW4vZ3Jvb3Z5L29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvbWF2ZW4vcnVubmVyL3dscy9Eb3dubG9hZFdsc01vam8uZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMjkzYWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay9tYXZlbi9jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9ncm9vdnkvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9tYXZlbi9ydW5uZXIvd2xzL0Rvd25sb2FkV2xzTW9qby5ncm9vdnkKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0Lm1hdmVuLnJ1bm5lci53bHMKKworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb24KK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRmFpbHVyZUV4Y2VwdGlvbgoraW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucy5hbm5vdGF0aW9ucy5Nb2pvCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5tYXZlbi5ydW5uZXIuQ29tbW9uRG93bmxvYWQKKworLyoqCisgKiBUaGlzIG1vam8gcGVyZm9ybXMgZG93bmxvYWQgYW5kIHNldHVwIG9mIFdlYmxvZ2ljIGphciBkaXN0cmlidXRpb24uCisgKgorICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYSBhdCBvcmFjbGUuY29tKQorICovCitATW9qbyhuYW1lID0gImRvd25sb2FkV2xzIikKK2NsYXNzIERvd25sb2FkV2xzTW9qbyBleHRlbmRzIEFic3RyYWN0V2xzUnVubmVyTW9qbyBpbXBsZW1lbnRzIENvbW1vbkRvd25sb2FkIHsKKworICAgIEBPdmVycmlkZQorICAgIHZvaWQgZXhlY3V0ZVJ1bm5lcigpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uLCBNb2pvRmFpbHVyZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKCFuZXcgRmlsZShtd0hvbWUpLmNhbm9uaWNhbFBhdGguc3RhcnRzV2l0aChuZXcgRmlsZShkaXN0RGlyKS5jYW5vbmljYWxQYXRoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9GYWlsdXJlRXhjZXB0aW9uKCJHaXZlbiAnbXdIb21lJyA8JG13SG9tZT4gaXMgbm90IGEgc3VicGF0aCBvZiAnZGlzdERpcicgPCRkaXN0RGlyPiEiKQorICAgICAgICB9CisKKyAgICAgICAgZXhlY3V0ZVNoZWxsKCIvcnVubmVyL3dscy9kb3dubG9hZC5zaCIpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL21haW4vZ3Jvb3Z5L29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvbWF2ZW4vcnVubmVyL3dscy9SZWRlcGxveVdsc01vam8uZ3Jvb3Z5IGIvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL21haW4vZ3Jvb3Z5L29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvbWF2ZW4vcnVubmVyL3dscy9SZWRlcGxveVdsc01vam8uZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkOTc2NzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay9tYXZlbi9jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9ncm9vdnkvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9tYXZlbi9ydW5uZXIvd2xzL1JlZGVwbG95V2xzTW9qby5ncm9vdnkKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0Lm1hdmVuLnJ1bm5lci53bHMKKworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb24KK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRmFpbHVyZUV4Y2VwdGlvbgoraW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucy5hbm5vdGF0aW9ucy5Nb2pvCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5tYXZlbi5ydW5uZXIuQ29tbW9uUmVkZXBsb3kKKworLyoqCisgKiBUaGlzIG1vam8gcmVwZXRpdGl2ZWx5IHJlZGVwbG95cyBnaXZlbiBhcHBsaWNhdGlvbiB0byBXZWJsb2dpYyBhbmQgcGVyZm9ybXMgYSBodHRwIHJlcXVlc3QgdG8gaXQuCisgKgorICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYSBhdCBvcmFjbGUuY29tKQorICovCitATW9qbyhuYW1lID0gInJlZGVwbG95V2xzIikKK2NsYXNzIFJlZGVwbG95V2xzTW9qbyBleHRlbmRzIEFic3RyYWN0V2xzUnVubmVyTW9qbyBpbXBsZW1lbnRzIENvbW1vblJlZGVwbG95IHsKKworICAgIHZvaWQgZXhlY3V0ZVJ1bm5lcigpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uLCBNb2pvRmFpbHVyZUV4Y2VwdGlvbiB7CisgICAgICAgIHJlZGVwbG95QW5kU2VuZFJlcXVlc3QoIi9ydW5uZXIvd2xzL3JlZGVwbG95LnNoIiwgIi9ydW5uZXIvd2xzL3N0b3Auc2giKQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL21haW4vZ3Jvb3Z5L29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvbWF2ZW4vcnVubmVyL3dscy9TdGFydEFuZERlcGxveVdsc01vam8uZ3Jvb3Z5IGIvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL21haW4vZ3Jvb3Z5L29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvbWF2ZW4vcnVubmVyL3dscy9TdGFydEFuZERlcGxveVdsc01vam8uZ3Jvb3Z5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZmU3MjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay9tYXZlbi9jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9ncm9vdnkvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9tYXZlbi9ydW5uZXIvd2xzL1N0YXJ0QW5kRGVwbG95V2xzTW9qby5ncm9vdnkKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0Lm1hdmVuLnJ1bm5lci53bHMKKworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb24KK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRmFpbHVyZUV4Y2VwdGlvbgoraW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucy5hbm5vdGF0aW9ucy5Nb2pvCitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zLmFubm90YXRpb25zLlBhcmFtZXRlcgoraW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QubWF2ZW4ucnVubmVyLkNvbW1vblN0YXJ0QW5kRGVwbG95CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5tYXZlbi5ydW5uZXIuU2hlbGxNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCisKKy8qKgorICogVGhpcyBtb2pvIHN0YXJ0cyBXZWJsb2dpYyBhbmQgZGVwbG95cyBwcm92aWRlZCBhcHBsaWNhdGlvbiB0byBpdC4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK0BNb2pvKG5hbWUgPSAic3RhcnRBbmREZXBsb3lXbHMiKQorY2xhc3MgU3RhcnRBbmREZXBsb3lXbHNNb2pvIGV4dGVuZHMgQWJzdHJhY3RXbHNSdW5uZXJNb2pvIGltcGxlbWVudHMgQ29tbW9uU3RhcnRBbmREZXBsb3kgeworCisgICAgLyoqCisgICAgICogRm9yIGhvdyBsb25nIChtdWx0aXBsaWVkIGJ5IDUpIHRvIHdhaXQgZm9yIFdlYmxvZ2ljIHRvIHN0YXJ0IHVwLgorICAgICAqLworICAgIEBQYXJhbWV0ZXIoZGVmYXVsdFZhbHVlID0gIjIwIiwgbmFtZSA9ICJ0cmllc0NvdW50IikKKyAgICBpbnQgdHJpZXNDb3VudAorCisgICAgQE92ZXJyaWRlCisgICAgdm9pZCBleGVjdXRlUnVubmVyKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24sIE1vam9GYWlsdXJlRXhjZXB0aW9uIHsKKyAgICAgICAgc3RhcnRBbmREZXBsb3lTdG9wT25GYWlsdXJlKCIvcnVubmVyL3dscy9zdGFydC5zaCIsICIvcnVubmVyL3dscy9zdG9wLnNoIiwgWworICAgICAgICAgICAgICAgICJUUklFU19DT1VOVCI6IHRyaWVzQ291bnQgYXMgU3RyaW5nLAorICAgICAgICBdKQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL21haW4vZ3Jvb3Z5L29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvbWF2ZW4vcnVubmVyL3dscy9TdG9wV2xzTW9qby5ncm9vdnkgYi90ZXN0LWZyYW1ld29yay9tYXZlbi9jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9ncm9vdnkvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9tYXZlbi9ydW5uZXIvd2xzL1N0b3BXbHNNb2pvLmdyb292eQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGIwZGM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL21haW4vZ3Jvb3Z5L29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvbWF2ZW4vcnVubmVyL3dscy9TdG9wV2xzTW9qby5ncm9vdnkKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0Lm1hdmVuLnJ1bm5lci53bHMKKworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb24KK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRmFpbHVyZUV4Y2VwdGlvbgoraW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucy5hbm5vdGF0aW9ucy5Nb2pvCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5tYXZlbi5ydW5uZXIuQ29tbW9uU3RvcAorCisvKioKKyAqIFRoaXMgbW9qbyBzdG9wcyBXZWJsb2dpYy4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK0BNb2pvKG5hbWUgPSAic3RvcFdscyIpCitjbGFzcyBTdG9wV2xzTW9qbyBleHRlbmRzIEFic3RyYWN0V2xzUnVubmVyTW9qbyBpbXBsZW1lbnRzIENvbW1vblN0b3AgeworCisgICAgQE92ZXJyaWRlCisgICAgdm9pZCBleGVjdXRlUnVubmVyKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24sIE1vam9GYWlsdXJlRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0ZVNoZWxsKCIvcnVubmVyL3dscy9zdG9wLnNoIikKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2NvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9ydW5uZXIvZ2Y0L2Rvd25sb2FkLnNoIGIvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL3J1bm5lci9nZjQvZG93bmxvYWQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkwODFiMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2NvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9ydW5uZXIvZ2Y0L2Rvd25sb2FkLnNoCkBAIC0wLDAgKzEsNTMgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisjIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyMKKyMgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorIyBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisjIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorIyB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisjCisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorIworCitzZXQgLWUKK1sgIiRERUJVRyIgPSAidHJ1ZSIgXSAmJiBzZXQgLXgKKworIyByZWRlY2xhcmF0aW9uIG9mIGVudiB2YXJpYWJsZXMgc28gdGhhdCBlZGl0b3JzIGRvIG5vdCB0aGluayBldmVyeSB2YXJpYWJsZSBpcyBhIHR5cG8KK0RJU1RfVVJMPSRESVNUX1VSTAorRElTVF9UR1RfTE9DQVRJT049JERJU1RfVEdUX0xPQ0FUSU9OCitESVNUX1NVQkRJUj0kRElTVF9TVUJESVIKK0RJU1RfRElSPSRESVNUX0RJUgorCitTS0lQX1NUQVJUX1NUT1A9JFNLSVBfU1RBUlRfU1RPUAorRE9XTkxPQURfSUZfRVhJU1RTPSRET1dOTE9BRF9JRl9FWElTVFMKK09WRVJXUklURT0kT1ZFUldSSVRFCithbGxfcHJveHk9JGFsbF9wcm94eQorCisKK2lmIFsgIiRTS0lQX1NUQVJUX1NUT1AiID0gInRydWUiIF07IHRoZW4KKyAgICBlY2hvIERvd25sb2FkIHNraXBwZWQKKyAgICBleGl0IDAKK2ZpCisKK2lmIFsgIiRESVNUX0RJUiIgPSAiIiAtbyAiJERJU1RfVEdUX0xPQ0FUSU9OIiA9ICIiIC1vICIkRElTVF9VUkwiID0gIiIgXTsgdGhlbgorICAgIGVjaG8gQVJHVU1FTlRTIE5PVCBPSworICAgIGV4aXQgMQorZmkKKworaWYgWyAhIC1mICIkRElTVF9UR1RfTE9DQVRJT04iIC1vICIkRE9XTkxPQURfSUZfRVhJU1RTIiA9ICJ0cnVlIiBdOyB0aGVuCisgICAgbWtkaXIgLXAgIiQoZGlybmFtZSAiJERJU1RfVEdUX0xPQ0FUSU9OIikiCisgICAgY3VybCAtc1MgLW8gIiRESVNUX1RHVF9MT0NBVElPTiIgIiRESVNUX1VSTCIKK2ZpCisKK2lmIFsgIiRPVkVSV1JJVEUiID0gInRydWUiIC1vICEgLWQgIiRESVNUX0RJUiIvIiRESVNUX1NVQkRJUiIgXTsgdGhlbgorICAgIHJtIC1yZiAiJERJU1RfRElSIi8iJERJU1RfU1VCRElSIgorCisgICAgdW56aXAgLW8gIiRESVNUX1RHVF9MT0NBVElPTiIgLWQgIiRESVNUX0RJUiIKKyAgICBjaG1vZCAtUiA3NzcgIiRESVNUX0RJUiIvIiRESVNUX1NVQkRJUiIKK2ZpCmRpZmYgLS1naXQgYS90ZXN0LWZyYW1ld29yay9tYXZlbi9jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvcnVubmVyL2dmNC9yZWRlcGxveS5zaCBiL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2NvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9ydW5uZXIvZ2Y0L3JlZGVwbG95LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxYTA1NTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay9tYXZlbi9jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvcnVubmVyL2dmNC9yZWRlcGxveS5zaApAQCAtMCwwICsxLDQ4IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisjCisjIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyMgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorIyBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyMgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorIworIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyMKKworc2V0IC1lCitbICIkREVCVUciID0gInRydWUiIF0gJiYgc2V0IC14CisKKyMgcmVkZWNsYXJhdGlvbiBvZiBlbnYgdmFyaWFibGVzIHNvIHRoYXQgZWRpdG9ycyBkbyBub3QgdGhpbmsgZXZlcnkgdmFyaWFibGUgaXMgYSB0eXBvCitXQVJfUEFUSD0iJFdBUl9QQVRIIgorQVNfSE9NRT0iJEFTX0hPTUUiCitBRE1JTlBPUlQ9JEFETUlOUE9SVAorQVBQTElDQVRJT05fTkFNRT0kQVBQTElDQVRJT05fTkFNRQorQ09OVEVYVF9ST09UPSRDT05URVhUX1JPT1QKK1NLSVBfUkVERVBMT1k9JFNLSVBfUkVERVBMT1kKKworaWYgWyAiJEFTX0hPTUUiID0gIiIgLW8gIiRXQVJfUEFUSCIgPSAiIiAtbyAiJEFETUlOUE9SVCIgPSAiIiBdOyB0aGVuCisgICAgZWNobyBBUkdVTUVOVFMgTk9UIE9LCisgICAgZXhpdCAxCitmaQorCitjaG1vZCAreCAiJEFTX0hPTUUiL2Jpbi9hc2FkbWluCisKKyIkQVNfSE9NRSIvYmluL2FzYWRtaW4gdW5kZXBsb3kgLS1wb3J0ICRBRE1JTlBPUlQgJEFQUExJQ0FUSU9OX05BTUUKKworaWYgWyAiJFNLSVBfUkVERVBMT1kiID0gInRydWUiIF07IHRoZW4KKyAgICBlY2hvIFNraXBwaW5nIHJlZGVwbG95LgorICAgIGV4aXQKK2ZpCisKKyIkQVNfSE9NRSIvYmluL2FzYWRtaW4gZGVwbG95IC0tcG9ydCAkQURNSU5QT1JUIC0tY29udGV4dHJvb3QgJENPTlRFWFRfUk9PVCAtLW5hbWUgJEFQUExJQ0FUSU9OX05BTUUgIiRXQVJfUEFUSCIKKworRVhJVF9DT0RFPSQ/CitlY2hvIFJlZGVwbG95bWVudCBmaW5pc2hlZCB3aXRoICRFWElUX0NPREUKKworZXhpdCAkRVhJVF9DT0RFCmRpZmYgLS1naXQgYS90ZXN0LWZyYW1ld29yay9tYXZlbi9jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvcnVubmVyL2dmNC9zdGFydC5zaCBiL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2NvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9ydW5uZXIvZ2Y0L3N0YXJ0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2Yjc1MzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay9tYXZlbi9jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvcnVubmVyL2dmNC9zdGFydC5zaApAQCAtMCwwICsxLDk3IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisjCisjIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyMgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorIyBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyMgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorIworIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyMKKworc2V0IC1lCitbICIkREVCVUciID0gInRydWUiIF0gJiYgc2V0IC14CisKKyMgcmVkZWNsYXJhdGlvbiBvZiBlbnYgdmFyaWFibGVzIHNvIHRoYXQgZWRpdG9ycyBkbyBub3QgdGhpbmsgZXZlcnkgdmFyaWFibGUgaXMgYSB0eXBvCitXQVJfUEFUSD0kV0FSX1BBVEgKK01BWF9IRUFQPSRNQVhfSEVBUAorVFJJRVNfQ09VTlQ9JFRSSUVTX0NPVU5UCitBU19IT01FPSRBU19IT01FCitQT1JUPSRQT1JUCitBRE1JTlBPUlQ9JEFETUlOUE9SVAorU0tJUF9ERVBMT1k9JFNLSVBfREVQTE9ZCitET01BSU49JERPTUFJTgorQVBQTElDQVRJT05fTkFNRT0kQVBQTElDQVRJT05fTkFNRQorQ09OVEVYVF9ST09UPSRDT05URVhUX1JPT1QKK0pWTV9BUkdTPSRKVk1fQVJHUworU0tJUF9TVEFSVF9TVE9QPSRTS0lQX1NUQVJUX1NUT1AKK1NLSVBfQ0hFQ0s9JFNLSVBfQ0hFQ0sKKworaWYgWyAiJEFTX0hPTUUiID0gIiIgLW8gIiRXQVJfUEFUSCIgPSAiIiAtbyAiJE1BWF9IRUFQIiA9ICIiIF07IHRoZW4KKyAgICBlY2hvIEFSR1VNRU5UUyBOT1QgT0sKKyAgICBleGl0IDEKK2ZpCisKK2NobW9kICt4ICIkQVNfSE9NRSIvYmluL2FzYWRtaW4KKworIyBTdGFydCBHbGFzc2Zpc2gKK2lmIFsgIiRTS0lQX1NUQVJUX1NUT1AiID0gInRydWUiIF07IHRoZW4KKyAgICBlY2hvIFN0YXJ0IHNraXBwZWQKK2Vsc2UKKyAgICBpZiBbICIkU0tJUF9DSEVDSyIgIT0gInRydWUiIF0gJiYganBzIC12IHwgZ3JlcCAnamVyc2V5LmNvbmZpZy50ZXN0Lm1lbWxlYWsuZ2Y0Lm1hZ2ljUnVubmVySWRlbnRpZmllcic7IHRoZW4KKyAgICAgICAgZWNobyBFUlJPUiBUaGVyZSBpcyBhbHJlYWR5IHJ1bm5pbmcgaW5zdGFuY2Ugb2YgR2xhc3NmaXNoCisgICAgICAgIGV4aXQgMgorICAgIGZpCisKKyAgICBpZiBuYyAteiBsb2NhbGhvc3QgJFBPUlQ7IHRoZW4KKyAgICAgICAgZWNobyBFUlJPUiBwb3J0ICRQT1JUIGlzIG5vdCBmcmVlIQorICAgICAgICBleGl0IDMKKyAgICBmaQorCisgICAgWyAtZCAiJEFTX0hPTUUiL2RvbWFpbnMvJERPTUFJTiBdICYmIHJtIC1yZiAiJEFTX0hPTUUiL2RvbWFpbnMvJERPTUFJTgorCisgICAgIiRBU19IT01FIi9iaW4vYXNhZG1pbiBjcmVhdGUtZG9tYWluIC0tYWRtaW5wb3J0ICRBRE1JTlBPUlQgLS1pbnN0YW5jZXBvcnQgJFBPUlQgLS1ub3Bhc3N3b3JkICRET01BSU4KKyAgICAiJEFTX0hPTUUiL2Jpbi9hc2FkbWluIHN0YXJ0LWRvbWFpbiAtLXBvcnQgJEFETUlOUE9SVCAkRE9NQUlOCisKKyAgICBzZXQgK2UKKyAgICAiJEFTX0hPTUUiL2Jpbi9hc2FkbWluIGRlbGV0ZS1qdm0tb3B0aW9ucyAtLXBvcnQgJEFETUlOUE9SVCAtLXRhcmdldCBkZWZhdWx0LWNvbmZpZyAtWG14NTEybQorICAgICIkQVNfSE9NRSIvYmluL2FzYWRtaW4gZGVsZXRlLWp2bS1vcHRpb25zIC0tcG9ydCAkQURNSU5QT1JUIC0tdGFyZ2V0IGRlZmF1bHQtY29uZmlnIC1YbXgkTUFYX0hFQVAKKworICAgICIkQVNfSE9NRSIvYmluL2FzYWRtaW4gZGVsZXRlLWp2bS1vcHRpb25zIC0tcG9ydCAkQURNSU5QT1JUIC0tdGFyZ2V0IHNlcnZlci1jb25maWcgLVhteDUxMm0KKyAgICAiJEFTX0hPTUUiL2Jpbi9hc2FkbWluIGRlbGV0ZS1qdm0tb3B0aW9ucyAtLXBvcnQgJEFETUlOUE9SVCAtLXRhcmdldCBzZXJ2ZXItY29uZmlnIC1YbXgkTUFYX0hFQVAKKworICAgIHNldCAtZQorICAgICIkQVNfSE9NRSIvYmluL2FzYWRtaW4gY3JlYXRlLWp2bS1vcHRpb25zIC0tcG9ydCAkQURNSU5QT1JUIC0tdGFyZ2V0IGRlZmF1bHQtY29uZmlnIC1YbXgkTUFYX0hFQVAKKyAgICAiJEFTX0hPTUUiL2Jpbi9hc2FkbWluIGNyZWF0ZS1qdm0tb3B0aW9ucyAtLXBvcnQgJEFETUlOUE9SVCAtLXRhcmdldCBzZXJ2ZXItY29uZmlnIC1YbXgkTUFYX0hFQVAKKworICAgICMgYWRkIG1hZ2ljIHJ1bm5lciBpZGVudGlmaWVyIHNvIHRoYXQgd2UgY2FuIGlkZW50aWZ5IG90aGVyIHByb2Nlc3NlcworICAgICIkQVNfSE9NRSIvYmluL2FzYWRtaW4gY3JlYXRlLWp2bS1vcHRpb25zIC0tcG9ydCAkQURNSU5QT1JUIC0tdGFyZ2V0IGRlZmF1bHQtY29uZmlnIC1EamVyc2V5LmNvbmZpZy50ZXN0Lm1lbWxlYWsuZ2Y0Lm1hZ2ljUnVubmVySWRlbnRpZmllcgorICAgICIkQVNfSE9NRSIvYmluL2FzYWRtaW4gY3JlYXRlLWp2bS1vcHRpb25zIC0tcG9ydCAkQURNSU5QT1JUIC0tdGFyZ2V0IHNlcnZlci1jb25maWcgLURqZXJzZXkuY29uZmlnLnRlc3QubWVtbGVhay5nZjQubWFnaWNSdW5uZXJJZGVudGlmaWVyCisKKyAgICAjIGlmIEpWTV9BUkdTIGRvZXNuJ3QgY29udGFpbiBmb2xsb3dpbmcgdm0gb3B0aW9ucywgc2V0IHRoZW0gKGluY3JlYXNlcyB0aGUgcHJvYmFiaWxpdHkgb2YgT09NRSBHQyBPdmVyaGVhZCBleGNlZWRlZCkKKyAgICBlY2hvICIkSlZNX0FSR1MiIHwgZ3JlcCBHQ1RpbWVMaW1pdCA+IC9kZXYvbnVsbCB8fCAiJEFTX0hPTUUiL2Jpbi9hc2FkbWluIGNyZWF0ZS1qdm0tb3B0aW9ucyAtLXBvcnQgJEFETUlOUE9SVCAtLXRhcmdldCBzZXJ2ZXItY29uZmlnICItWFhcOkdDVGltZUxpbWl0PTIwIgorICAgIGVjaG8gIiRKVk1fQVJHUyIgfCBncmVwIEdDSGVhcEZyZWVMaW1pdCA+IC9kZXYvbnVsbCB8fCAiJEFTX0hPTUUiL2Jpbi9hc2FkbWluIGNyZWF0ZS1qdm0tb3B0aW9ucyAtLXBvcnQgJEFETUlOUE9SVCAtLXRhcmdldCBzZXJ2ZXItY29uZmlnICItWFhcOkdDSGVhcEZyZWVMaW1pdD0zMCIKKworICAgIGlmIFsgIiRKVk1fQVJHUyIgIT0gIiIgXTsgdGhlbgorICAgICAgICBmb3IgSlZNX0FSRyBpbiBgZWNobyAkSlZNX0FSR1NgOyBkbworICAgICAgICAgICAgIiRBU19IT01FIi9iaW4vYXNhZG1pbiBjcmVhdGUtanZtLW9wdGlvbnMgLS1wb3J0ICRBRE1JTlBPUlQgLS10YXJnZXQgZGVmYXVsdC1jb25maWcgIiRKVk1fQVJHIgorICAgICAgICAgICAgIiRBU19IT01FIi9iaW4vYXNhZG1pbiBjcmVhdGUtanZtLW9wdGlvbnMgLS1wb3J0ICRBRE1JTlBPUlQgLS10YXJnZXQgc2VydmVyLWNvbmZpZyAiJEpWTV9BUkciCisgICAgICAgIGRvbmUKKyAgICBmaQorCisgICAgIiRBU19IT01FIi9iaW4vYXNhZG1pbiBzdG9wLWRvbWFpbiAtLXBvcnQgJEFETUlOUE9SVCAtLWZvcmNlPXRydWUgJERPTUFJTgorICAgICIkQVNfSE9NRSIvYmluL2FzYWRtaW4gc3RhcnQtZG9tYWluIC0tcG9ydCAkQURNSU5QT1JUICRET01BSU4KK2ZpCisKKyMgRGVwbG95IHRvIEdsYXNzZmlzaAoraWYgWyAiJFNLSVBfREVQTE9ZIiA9ICJ0cnVlIiBdOyB0aGVuCisgICAgZWNobyBEZXBsb3ltZW50IHNraXBwZWQKK2Vsc2UKKyAgICAiJEFTX0hPTUUiL2Jpbi9hc2FkbWluIGRlcGxveSAtLXBvcnQgJEFETUlOUE9SVCAtLWNvbnRleHRyb290ICRDT05URVhUX1JPT1QgLS1uYW1lICRBUFBMSUNBVElPTl9OQU1FICIkV0FSX1BBVEgiCitmaQpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL3J1bm5lci9nZjQvc3RvcC5zaCBiL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2NvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9ydW5uZXIvZ2Y0L3N0b3Auc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI4MzVlZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2NvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9ydW5uZXIvZ2Y0L3N0b3Auc2gKQEAgLTAsMCArMSw2NSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorIworIyBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisjIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyMgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisjIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyMKKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisjCisKK3NldCAtZQorWyAiJERFQlVHIiA9ICJ0cnVlIiBdICYmIHNldCAteAorCisjIHJlZGVjbGFyYXRpb24gb2YgZW52IHZhcmlhYmxlcyBzbyB0aGF0IGVkaXRvcnMgZG8gbm90IHRoaW5rIGV2ZXJ5IHZhcmlhYmxlIGlzIGEgdHlwbworQVNfSE9NRT0kQVNfSE9NRQorUE9SVD0kUE9SVAorQURNSU5QT1JUPSRBRE1JTlBPUlQKK0RPTUFJTj0kRE9NQUlOCitTS0lQX1NUQVJUX1NUT1A9JFNLSVBfU1RBUlRfU1RPUAorU0tJUF9TVE9QPSRTS0lQX1NUT1AKKworUElEX1NVQkRJUj1kb21haW5zLyRET01BSU4vY29uZmlnL3BpZAorU1RPUF9USU1FPTIwCitLSUxMX1RJTUU9NQorCitpZiBbICIkU0tJUF9TVEFSVF9TVE9QIiA9ICJ0cnVlIiAtbyAiJFNLSVBfU1RPUCIgPSAidHJ1ZSIgXTsgdGhlbgorICAgIGVjaG8gU3RvcCBza2lwcGVkCisgICAgZXhpdCAwCitmaQorCitpZiBbICIkQVNfSE9NRSIgPSAiIiAtbyAiJERPTUFJTiIgPSAiIiBdOyB0aGVuCisgICAgZWNobyBBUkdVTUVOVFMgTk9UIE9LCisgICAgZXhpdCAxCitmaQorCitjaG1vZCAreCAiJEFTX0hPTUUiL2Jpbi9hc2FkbWluCisKKyIkQVNfSE9NRSIvYmluL2FzYWRtaW4gc3RvcC1kb21haW4gLS1wb3J0ICRBRE1JTlBPUlQgLS1mb3JjZT10cnVlICRET01BSU4gJgorU1RPUF9QSUQ9JCEKKyMgZ2l2ZSBHbGFzc2Zpc2ggJFNUT1BfVElNRSBzZWNvbmRzIHRvIHN0b3AgLi4gdGhpcyBtYXkgaGFuZyBmb3JldmVyIHNpbmNlIEpWTSBtaWdodCBoYXZlIHRocm93biBPdXRPZk1lbW9yeUVycm9yCitmb3IgQSBpbiBgc2VxICRTVE9QX1RJTUVgOyBkbworICAgIGtpbGwgLTAgJFNUT1BfUElEIHx8IGJyZWFrOworICAgIHNsZWVwIDEKK2RvbmUKKworc2V0ICtlCitraWxsIC05ICRTVE9QX1BJRAorCitbIC1mICIkQVNfSE9NRSIvJFBJRF9TVUJESVIgXSAmJiBraWxsIC05IGBjYXQgIiRBU19IT01FIi8kUElEX1NVQkRJUmAKKworIyBXYWl0IGZvcgorZm9yIEEgaW4gYHNlcSAkS0lMTF9USU1FYDsgZG8KKyAgICBuYyAteiBsb2NhbGhvc3QgJEFETUlOUE9SVCB8fCBuYyAteiBsb2NhbGhvc3QgJFBPUlQgfHwgZXhpdCAwCisgICAgc2xlZXAgMQorZG9uZQorCitlY2hvIEVSUk9SIEdsYXNzZmlzaCBzZXJ2ZXIgc2VlbXMgdG8gbm90IGJlIHNodXRkb3duIQorZXhpdCAyCmRpZmYgLS1naXQgYS90ZXN0LWZyYW1ld29yay9tYXZlbi9jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvcnVubmVyL3RvbWNhdC9kb3dubG9hZC5zaCBiL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2NvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9ydW5uZXIvdG9tY2F0L2Rvd25sb2FkLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyYmFmNjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay9tYXZlbi9jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvcnVubmVyL3RvbWNhdC9kb3dubG9hZC5zaApAQCAtMCwwICsxLDUyIEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisjCisjIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyMgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorIyBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyMgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorIworIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyMKKworc2V0IC1lCitbICIkREVCVUciID0gInRydWUiIF0gJiYgc2V0IC14CisKKyMgcmVkZWNsYXJhdGlvbiBvZiBlbnYgdmFyaWFibGVzIHNvIHRoYXQgZWRpdG9ycyBkbyBub3QgdGhpbmsgZXZlcnkgdmFyaWFibGUgaXMgYSB0eXBvCitESVNUX1VSTD0kRElTVF9VUkwKK0RJU1RfVEdUX0xPQ0FUSU9OPSRESVNUX1RHVF9MT0NBVElPTgorRElTVF9TVUJESVI9JERJU1RfU1VCRElSCitESVNUX0RJUj0kRElTVF9ESVIKKworU0tJUF9TVEFSVF9TVE9QPSRTS0lQX1NUQVJUX1NUT1AKK0RPV05MT0FEX0lGX0VYSVNUUz0kRE9XTkxPQURfSUZfRVhJU1RTCitPVkVSV1JJVEU9JE9WRVJXUklURQorYWxsX3Byb3h5PSRhbGxfcHJveHkKKworaWYgWyAiJFNLSVBfU1RBUlRfU1RPUCIgPSAidHJ1ZSIgXTsgdGhlbgorICAgIGVjaG8gRG93bmxvYWQgc2tpcHBlZAorICAgIGV4aXQgMAorZmkKKworaWYgWyAiJERJU1RfRElSIiA9ICIiIC1vICIkRElTVF9UR1RfTE9DQVRJT04iID0gIiIgLW8gIiRESVNUX1VSTCIgPSAiIiBdOyB0aGVuCisgICAgZWNobyBBUkdVTUVOVFMgTk9UIE9LCisgICAgZXhpdCAxCitmaQorCitpZiBbICEgLWYgIiRESVNUX1RHVF9MT0NBVElPTiIgLW8gIiRET1dOTE9BRF9JRl9FWElTVFMiID0gInRydWUiIF07IHRoZW4KKyAgICBta2RpciAtcCAiJChkaXJuYW1lICIkRElTVF9UR1RfTE9DQVRJT04iKSIKKyAgICBjdXJsIC1zUyAtbyAiJERJU1RfVEdUX0xPQ0FUSU9OIiAiJERJU1RfVVJMIgorZmkKKworaWYgWyAiJE9WRVJXUklURSIgPSAidHJ1ZSIgLW8gISAtZCAiJERJU1RfRElSIi8iJERJU1RfU1VCRElSIiBdOyB0aGVuCisgICAgcm0gLXJmICIkRElTVF9ESVIiLyIkRElTVF9TVUJESVIiCisKKyAgICB1bnppcCAtbyAiJERJU1RfVEdUX0xPQ0FUSU9OIiAtZCAiJERJU1RfRElSIgorICAgIGNobW9kIC1SIDc3NyAiJERJU1RfRElSIi8iJERJU1RfU1VCRElSIgorZmkKZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2NvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9ydW5uZXIvdG9tY2F0L3JlZGVwbG95LnNoIGIvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL3J1bm5lci90b21jYXQvcmVkZXBsb3kuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZjNjIyMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2NvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9ydW5uZXIvdG9tY2F0L3JlZGVwbG95LnNoCkBAIC0wLDAgKzEsNDcgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisjIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyMKKyMgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorIyBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisjIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorIyB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisjCisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorIworCitzZXQgLWUKK1sgIiRERUJVRyIgPSAidHJ1ZSIgXSAmJiBzZXQgLXgKKworIyByZWRlY2xhcmF0aW9uIG9mIGVudiB2YXJpYWJsZXMgc28gdGhhdCBlZGl0b3JzIGRvIG5vdCB0aGluayBldmVyeSB2YXJpYWJsZSBpcyBhIHR5cG8KK1dBUl9QQVRIPSRXQVJfUEFUSAorQVBQTElDQVRJT05fTkFNRT0kQVBQTElDQVRJT05fTkFNRQorQ09OVEVYVF9ST09UPSRDT05URVhUX1JPT1QKK1JFUVVFU1RfUEFUSF9RVUVSWT0kUkVRVUVTVF9QQVRIX1FVRVJZCitTS0lQX1JFREVQTE9ZPSRTS0lQX1JFREVQTE9ZCisKK2lmIFsgIiRDT05URVhUX1JPT1QiID0gIiIgLW8gIiRXQVJfUEFUSCIgPSAiIiBdOyB0aGVuCisgICAgZWNobyBBUkdVTUVOVFMgTk9UIE9LCisgICAgZXhpdCAxCitmaQorCithYiAtbjUwIC1jNSAiaHR0cDovL2xvY2FsaG9zdDokUE9SVC8kUkVRVUVTVF9QQVRIX1FVRVJZIgorCithbGxfcHJveHk9IiIgaHR0cF9wcm94eT0iIiBjdXJsIC1zUyAiaHR0cDovL3RvbWNhdDp0b21jYXRAbG9jYWxob3N0OiRQT1JUL21hbmFnZXIvdGV4dC91bmRlcGxveT9wYXRoPS8kQ09OVEVYVF9ST09UIgorCitpZiBbICIkU0tJUF9SRURFUExPWSIgPSAidHJ1ZSIgXTsgdGhlbgorICAgIGVjaG8gU2tpcHBpbmcgcmVkZXBsb3kuCisgICAgZXhpdAorZmkKKworYWxsX3Byb3h5PSIiIGh0dHBfcHJveHk9IiIgY3VybCAtc1MgLS11cGxvYWQtZmlsZSAiJFdBUl9QQVRIIiAiaHR0cDovL3RvbWNhdDp0b21jYXRAbG9jYWxob3N0OiRQT1JUL21hbmFnZXIvdGV4dC9kZXBsb3k/cGF0aD0vJENPTlRFWFRfUk9PVCZ0YWc9JEFQUExJQ0FUSU9OX05BTUUiCisKK0VYSVRfQ09ERT0kPworZWNobyBSZWRlcGxveW1lbnQgZmluaXNoZWQgd2l0aCAkRVhJVF9DT0RFCisKK2V4aXQgJEVYSVRfQ09ERQpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL3J1bm5lci90b21jYXQvc3RhcnQuc2ggYi90ZXN0LWZyYW1ld29yay9tYXZlbi9jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvcnVubmVyL3RvbWNhdC9zdGFydC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDljYTA5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL3J1bm5lci90b21jYXQvc3RhcnQuc2gKQEAgLTAsMCArMSwxMDUgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisjIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyMKKyMgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorIyBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisjIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorIyB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisjCisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorIworCitzZXQgLWUKK1sgIiRERUJVRyIgPSAidHJ1ZSIgXSAmJiBzZXQgLXgKKworIyByZWRlY2xhcmF0aW9uIG9mIGVudiB2YXJpYWJsZXMgc28gdGhhdCBlZGl0b3JzIGRvIG5vdCB0aGluayBldmVyeSB2YXJpYWJsZSBpcyBhIHR5cG8KK1dBUl9QQVRIPSRXQVJfUEFUSAorTUFYX0hFQVA9JE1BWF9IRUFQCitUUklFU19DT1VOVD0kVFJJRVNfQ09VTlQKK0NBVEFMSU5BX0hPTUU9JENBVEFMSU5BX0hPTUUKK1BPUlQ9JFBPUlQKK1NLSVBfREVQTE9ZPSRTS0lQX0RFUExPWQorQVBQTElDQVRJT05fTkFNRT0kQVBQTElDQVRJT05fTkFNRQorQ09OVEVYVF9ST09UPSRDT05URVhUX1JPT1QKK01FTU9SWV9MRUFLX1BSRVZFTlRJT049JE1FTU9SWV9MRUFLX1BSRVZFTlRJT04KK0RJU1RfRElSPSRESVNUX0RJUgorU0tJUF9TVEFSVF9TVE9QPSRTS0lQX1NUQVJUX1NUT1AKK0pWTV9BUkdTPSRKVk1fQVJHUworU0tJUF9DSEVDSz0kU0tJUF9DSEVDSworCitpZiBbICIkQ0FUQUxJTkFfSE9NRSIgPSAiIiAtbyAiJFdBUl9QQVRIIiA9ICIiIC1vICIkTUFYX0hFQVAiID0gIiIgLW8gIiRUUklFU19DT1VOVCIgPSAiIiBdOyB0aGVuCisgICAgZWNobyBBUkdVTUVOVFMgTk9UIE9LCisgICAgZXhpdCAxCitmaQorCitzdGFydF90b21jYXQoKSB7CisgICAgaWYgWyAiJFNLSVBfQ0hFQ0siICE9ICJ0cnVlIiBdICYmIGpwcyAtdiB8IGdyZXAgJ2plcnNleS5jb25maWcudGVzdC5tZW1sZWFrLnRvbWNhdC5tYWdpY1J1bm5lcklkZW50aWZpZXInOyB0aGVuCisgICAgICAgIGVjaG8gRVJST1IgVGhlcmUgaXMgYWxyZWFkeSBydW5uaW5nIGluc3RhbmNlIG9mIFRvbWNhdAorICAgICAgICBleGl0IDIKKyAgICBmaQorCisgICAgaWYgbmMgLXogbG9jYWxob3N0ICRQT1JUOyB0aGVuCisgICAgICAgIGVjaG8gRVJST1IgcG9ydCAkUE9SVCBpcyBub3QgZnJlZSEKKyAgICAgICAgZXhpdCAzCisgICAgZmkKKworICAgIFsgLWQgIiRDQVRBTElOQV9IT01FIi93ZWJhcHBzLyIkQ09OVEVYVF9ST09UIiBdICYmIHJtIC1yZiAiJENBVEFMSU5BX0hPTUUiL3dlYmFwcHMvIiRDT05URVhUX1JPT1QiCisgICAgWyAtZiAiJENBVEFMSU5BX0hPTUUiL3dlYmFwcHMvIiRDT05URVhUX1JPT1QiLiogXSAmJiBybSAtZiAiJENBVEFMSU5BX0hPTUUiL3dlYmFwcHMvIiRDT05URVhUX1JPT1QiLioKKworICAgIHNlZCAtaSAtZSAnc0BcKENvbm5lY3RvciBwb3J0PSJcKVswLTldKlwoIiBwcm90b2NvbD0iSFRUUC8xLjEiXClAXDEnJFBPUlQnXDJAJyAiJENBVEFMSU5BX0hPTUUiL2NvbmYvc2VydmVyLnhtbAorCisgICAgaWYgWyAiJE1FTU9SWV9MRUFLX1BSRVZFTlRJT04iICE9ICJ0cnVlIiBdOyB0aGVuCisgICAgICAgIHNlZCAtaSAtZSAnc0BcKF5bXjxdLipvcmcuYXBhY2hlLmNhdGFsaW5hLmNvcmUuVGhyZWFkTG9jYWxMZWFrUHJldmVudGlvbkxpc3RlbmVyLiokXClAPCEtLVwxLS0+QCcgIiRDQVRBTElOQV9IT01FIi9jb25mL3NlcnZlci54bWwKKyAgICAgICAgc2VkIC1pIC1lICdzQFwoXltePF0uKm9yZy5hcGFjaGUuY2F0YWxpbmEuY29yZS5KcmVNZW1vcnlMZWFrUHJldmVudGlvbkxpc3RlbmVyLiokXClAPCEtLVwxLS0+QCcgIiRDQVRBTElOQV9IT01FIi9jb25mL3NlcnZlci54bWwKKyAgICAgICAgc2VkIC1pIC1lICdzQFwoXltePF0uKm9yZy5hcGFjaGUuY2F0YWxpbmEubWJlYW5zLkdsb2JhbFJlc291cmNlc0xpZmVjeWNsZUxpc3RlbmVyLiokXClAPCEtLVwxLS0+QCcgIiRDQVRBTElOQV9IT01FIi9jb25mL3NlcnZlci54bWwKKyAgICBmaQorCisgICAgaWYgISBncmVwICc8cm9sZSByb2xlbmFtZT0ibWFuYWdlci1ndWkiLz4nICIkQ0FUQUxJTkFfSE9NRSIvY29uZi90b21jYXQtdXNlcnMueG1sOyB0aGVuCisgICAgICAgIHNlZCAtaSAtZSAnc0A8L3RvbWNhdC11c2Vycz5APHJvbGUgcm9sZW5hbWU9Im1hbmFnZXItZ3VpIi8+XAorICAgIDwvdG9tY2F0LXVzZXJzPkBnJyAiJENBVEFMSU5BX0hPTUUiL2NvbmYvdG9tY2F0LXVzZXJzLnhtbAorICAgIGZpCisgICAgaWYgISBncmVwICc8cm9sZSByb2xlbmFtZT0ibWFuYWdlci1zY3JpcHQiLz4nICIkQ0FUQUxJTkFfSE9NRSIvY29uZi90b21jYXQtdXNlcnMueG1sOyB0aGVuCisgICAgICAgIHNlZCAtaSAtZSAnc0A8L3RvbWNhdC11c2Vycz5APHJvbGUgcm9sZW5hbWU9Im1hbmFnZXItc2NyaXB0Ii8+XAorICAgIDwvdG9tY2F0LXVzZXJzPkBnJyAiJENBVEFMSU5BX0hPTUUiL2NvbmYvdG9tY2F0LXVzZXJzLnhtbAorICAgIGZpCisgICAgaWYgISBncmVwICc8dXNlciB1c2VybmFtZT0idG9tY2F0IiBwYXNzd29yZD0idG9tY2F0IiByb2xlcz0idG9tY2F0LG1hbmFnZXItZ3VpLG1hbmFnZXItc2NyaXB0Ii8+JyAiJENBVEFMSU5BX0hPTUUiL2NvbmYvdG9tY2F0LXVzZXJzLnhtbDsgdGhlbgorICAgICAgICBzZWQgLWkgLWUgJ3NAPC90b21jYXQtdXNlcnM+QDx1c2VyIHVzZXJuYW1lPSJ0b21jYXQiIHBhc3N3b3JkPSJ0b21jYXQiIHJvbGVzPSJ0b21jYXQsbWFuYWdlci1ndWksbWFuYWdlci1zY3JpcHQiLz5cCisgICAgPC90b21jYXQtdXNlcnM+QGcnICIkQ0FUQUxJTkFfSE9NRSIvY29uZi90b21jYXQtdXNlcnMueG1sCisgICAgZmkKKworICAgIGV4cG9ydCBDQVRBTElOQV9PUFRTPSItWG14JE1BWF9IRUFQIC1EamVyc2V5LmNvbmZpZy50ZXN0Lm1lbWxlYWsudG9tY2F0Lm1hZ2ljUnVubmVySWRlbnRpZmllciAtWFg6K0hlYXBEdW1wT25PdXRPZk1lbW9yeUVycm9yIC1YWDpIZWFwRHVtcFBhdGg9JERJU1RfRElSIC1YWDpHQ1RpbWVMaW1pdD0yMCAtWFg6R0NIZWFwRnJlZUxpbWl0PTMwICRKVk1fQVJHUyIKKworICAgIGNobW9kICt4ICIkQ0FUQUxJTkFfSE9NRSIvYmluL3N0YXJ0dXAuc2gKKworICAgICIkQ0FUQUxJTkFfSE9NRSIvYmluL3N0YXJ0dXAuc2gKKworICAgIGZvciBBIGluIGBzZXEgJFRSSUVTX0NPVU5UYDsgZG8KKyAgICAgICAgc2V0ICtlCisgICAgICAgIG5jIC16IGxvY2FsaG9zdCAkUE9SVCAmJiBicmVhaworICAgICAgICBzZXQgLWUKKyAgICAgICAgc2xlZXAgNQorICAgIGRvbmUKK30KKworZGVwbG95X3RvbWNhdCgpIHsKKyAgICBhbGxfcHJveHk9IiIgaHR0cF9wcm94eT0iIiBjdXJsIC1zUyAtLXVwbG9hZC1maWxlICIkV0FSX1BBVEgiICJodHRwOi8vdG9tY2F0OnRvbWNhdEBsb2NhbGhvc3Q6JFBPUlQvbWFuYWdlci90ZXh0L2RlcGxveT9wYXRoPS8kQ09OVEVYVF9ST09UIgorfQorCitpZiBbICIkU0tJUF9TVEFSVF9TVE9QIiA9ICJ0cnVlIiBdOyB0aGVuCisgICAgZWNobyBTdGFydCBza2lwcGVkCitlbHNlCisgICAgc3RhcnRfdG9tY2F0CitmaQorCitpZiBbICIkU0tJUF9ERVBMT1kiID0gInRydWUiIF07IHRoZW4KKyAgICBlY2hvIERlcGxveW1lbnQgc2tpcHBlZAorZWxzZQorICAgIGRlcGxveV90b21jYXQKK2ZpCisKZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2NvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9ydW5uZXIvdG9tY2F0L3N0b3Auc2ggYi90ZXN0LWZyYW1ld29yay9tYXZlbi9jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvcnVubmVyL3RvbWNhdC9zdG9wLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNWQ5YWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay9tYXZlbi9jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvcnVubmVyL3RvbWNhdC9zdG9wLnNoCkBAIC0wLDAgKzEsNjQgQEAKKyMhL2Jpbi9zaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisjIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyMKKyMgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorIyBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisjIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorIyB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisjCisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorIworCitzZXQgLWUKK1sgIiRERUJVRyIgPSAidHJ1ZSIgXSAmJiBzZXQgLXgKKworIyByZWRlY2xhcmF0aW9uIG9mIGVudiB2YXJpYWJsZXMgc28gdGhhdCBlZGl0b3JzIGRvIG5vdCB0aGluayBldmVyeSB2YXJpYWJsZSBpcyBhIHR5cG8KK1BPUlQ9JFBPUlQKK1NLSVBfU1RBUlRfU1RPUD0kU0tJUF9TVEFSVF9TVE9QCitTS0lQX1NUT1A9JFNLSVBfU1RPUAorCitDQVRBTElOQV9QSUQ9JENBVEFMSU5BX1BJRAorQ0FUQUxJTkFfSE9NRT0kQ0FUQUxJTkFfSE9NRQorCitTVE9QX1RJTUU9MjAKK0tJTExfVElNRT01CisKK2lmIFsgIiRTS0lQX1NUQVJUX1NUT1AiID0gInRydWUiIC1vICIkU0tJUF9TVE9QIiA9ICJ0cnVlIiBdOyB0aGVuCisgICAgZWNobyBTdG9wIHNraXBwZWQKKyAgICBleGl0IDAKK2ZpCisKK2lmIFsgIiRDQVRBTElOQV9IT01FIiA9ICIiIC1vICIkQ0FUQUxJTkFfUElEIiA9ICIiIF07IHRoZW4KKyAgICBlY2hvIEFSR1VNRU5UUyBOT1QgT0sKKyAgICBleGl0IDEKK2ZpCisKK2NobW9kICt4ICIkQ0FUQUxJTkFfSE9NRSIvYmluL3NodXRkb3duLnNoCisKKyIkQ0FUQUxJTkFfSE9NRSIvYmluL3NodXRkb3duLnNoICYKK1NUT1BfUElEPSQhCisjIGdpdmUgVG9tY2F0ICRTVE9QX1RJTUUgc2Vjb25kcyB0byBzdG9wIC4uIHRoaXMgbWF5IGhhbmcgZm9yZXZlciBzaW5jZSBKVk0gbWlnaHQgaGF2ZSB0aHJvd24gT3V0T2ZNZW1vcnlFcnJvcgorZm9yIEEgaW4gYHNlcSAkU1RPUF9USU1FYDsgZG8KKyAgICBraWxsIC0wICRTVE9QX1BJRCB8fCBicmVhazsKKyAgICBzbGVlcCAxCitkb25lCisKK3NldCArZQora2lsbCAtOSAkU1RPUF9QSUQKKworWyAtZiAiJENBVEFMSU5BX1BJRCIgXSAmJiBraWxsIC05IGBjYXQgIiRDQVRBTElOQV9QSUQiYAorCisjIFdhaXQgZm9yCitmb3IgQSBpbiBgc2VxICRLSUxMX1RJTUVgOyBkbworICAgIG5jIC16IGxvY2FsaG9zdCAkUE9SVCB8fCBleGl0IDAKKyAgICBzbGVlcCAxCitkb25lCisKK2VjaG8gRVJST1IgVG9tY2F0IHNlZW1zIHRvIG5vdCBiZSBzaHV0ZG93biEKK2V4aXQgMgpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL3J1bm5lci92ZXJpZnkuc2ggYi90ZXN0LWZyYW1ld29yay9tYXZlbi9jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvcnVubmVyL3ZlcmlmeS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmU2NWFkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL3J1bm5lci92ZXJpZnkuc2gKQEAgLTAsMCArMSw0MSBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorIworIyBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisjIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyMgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisjIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyMKKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisjCisKK3NldCAtZQorWyAiJERFQlVHIiA9ICJ0cnVlIiBdICYmIHNldCAteAorCisjIHJlZGVjbGFyYXRpb24gb2YgZW52IHZhcmlhYmxlcyBzbyB0aGF0IGVkaXRvcnMgZG8gbm90IHRoaW5rIGV2ZXJ5IHZhcmlhYmxlIGlzIGEgdHlwbworTE9HRklMRT0kTE9HRklMRQorRVJST1JfRVhJVF9DT0RFPSRFUlJPUl9FWElUX0NPREUKKworaWYgWyAiJExPR0ZJTEUiID0gIiIgXTsgdGhlbgorICAgIGVjaG8gQVJHVU1FTlRTIE5PVCBPSworICAgIGV4aXQgMQorZmkKKworZWNobyAiU2VhcmNoaW5nIGZvciBqYXZhLmxhbmcuT3V0T2ZNZW1vcnlFcnJvciBleGNlcHRpb25zIGluICRMT0dGSUxFIgorCitzZXQgK2UKKworaWYgZ3JlcCAtbkggJ2phdmFcLmxhbmdcLk91dE9mTWVtb3J5RXJyb3InICIkTE9HRklMRSI7IHRoZW4KKyAgICBlY2hvICJqYXZhLmxhbmcuT3V0T2ZNZW1vcnlFcnJvciBleGNlcHRpb25zIHdlcmUgZm91bmQgaW4gbG9nZmlsZSAkTE9HRklMRSEiCisgICAgZXhpdCAkRVJST1JfRVhJVF9DT0RFCitmaQorCitlY2hvICJObyBqYXZhLmxhbmcuT3V0T2ZNZW1vcnlFcnJvciBleGNlcHRpb25zIHdlcmUgZm91bmQgaW4gJExPR0ZJTEUiCisKK2V4aXQgMApkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL3J1bm5lci93bHMvZG93bmxvYWQuc2ggYi90ZXN0LWZyYW1ld29yay9tYXZlbi9jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvcnVubmVyL3dscy9kb3dubG9hZC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzhkM2M2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL3J1bm5lci93bHMvZG93bmxvYWQuc2gKQEAgLTAsMCArMSw1MiBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorIworIyBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisjIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyMgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisjIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyMKKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisjCisKK3NldCAtZQorWyAiJERFQlVHIiA9ICJ0cnVlIiBdICYmIHNldCAteAorCisjIHJlZGVjbGFyYXRpb24gb2YgZW52IHZhcmlhYmxlcyBzbyB0aGF0IGVkaXRvcnMgZG8gbm90IHRoaW5rIGV2ZXJ5IHZhcmlhYmxlIGlzIGEgdHlwbworRElTVF9VUkw9JERJU1RfVVJMCitESVNUX1RHVF9MT0NBVElPTj0kRElTVF9UR1RfTE9DQVRJT04KK0RJU1RfU1VCRElSPSRESVNUX1NVQkRJUgorRElTVF9ESVI9JERJU1RfRElSCisKK1NLSVBfU1RBUlRfU1RPUD0kU0tJUF9TVEFSVF9TVE9QCitET1dOTE9BRF9JRl9FWElTVFM9JERPV05MT0FEX0lGX0VYSVNUUworT1ZFUldSSVRFPSRPVkVSV1JJVEUKK2FsbF9wcm94eT0kYWxsX3Byb3h5CisKK2lmIFsgIiRTS0lQX1NUQVJUX1NUT1AiID0gInRydWUiIF07IHRoZW4KKyAgICBlY2hvIERvd25sb2FkIHNraXBwZWQKKyAgICBleGl0IDAKK2ZpCisKK2lmIFsgIiRESVNUX0RJUiIgPSAiIiAtbyAiJERJU1RfVEdUX0xPQ0FUSU9OIiA9ICIiIC1vICIkRElTVF9VUkwiID0gIiIgXTsgdGhlbgorICAgIGVjaG8gQVJHVU1FTlRTIE5PVCBPSworICAgIGV4aXQgMQorZmkKKworaWYgWyAhIC1mICIkRElTVF9UR1RfTE9DQVRJT04iIC1vICIkRE9XTkxPQURfSUZfRVhJU1RTIiA9ICJ0cnVlIiBdOyB0aGVuCisgICAgbWtkaXIgLXAgIiQoZGlybmFtZSAiJERJU1RfVEdUX0xPQ0FUSU9OIikiCisgICAgY3VybCAtc1MgLW8gIiRESVNUX1RHVF9MT0NBVElPTiIgIiRESVNUX1VSTCIKK2ZpCisKK2lmIFsgIiRPVkVSV1JJVEUiID0gInRydWUiIC1vICEgLWQgIiRESVNUX0RJUiIvIiRESVNUX1NVQkRJUiIgXTsgdGhlbgorICAgIHJtIC1yZiAiJERJU1RfRElSIi8iJERJU1RfU1VCRElSIgorCisgICAgY2QgIiRESVNUX0RJUiIKKyAgICBqYXZhIC1qYXIgIiRESVNUX1RHVF9MT0NBVElPTiIKK2ZpCmRpZmYgLS1naXQgYS90ZXN0LWZyYW1ld29yay9tYXZlbi9jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvcnVubmVyL3dscy9yZWRlcGxveS5zaCBiL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2NvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9ydW5uZXIvd2xzL3JlZGVwbG95LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ZDY0Y2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay9tYXZlbi9jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvcnVubmVyL3dscy9yZWRlcGxveS5zaApAQCAtMCwwICsxLDk0IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisjCisjIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyMgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorIyBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyMgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorIworIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyMKKworc2V0IC1lCitbICIkREVCVUciID0gInRydWUiIF0gJiYgc2V0IC14CisKKyMgcmVkZWNsYXJhdGlvbiBvZiBlbnYgdmFyaWFibGVzIHNvIHRoYXQgZWRpdG9ycyBkbyBub3QgdGhpbmsgZXZlcnkgdmFyaWFibGUgaXMgYSB0eXBvCitXQVJfUEFUSD0kV0FSX1BBVEgKK01XX0hPTUU9JE1XX0hPTUUKK0RPTUFJTj0kRE9NQUlOCitQT1JUPSRQT1JUCitBUFBMSUNBVElPTl9OQU1FPSRBUFBMSUNBVElPTl9OQU1FCitTS0lQX1JFREVQTE9ZPSRTS0lQX1JFREVQTE9ZCisKK0RFUExPWV9USU1FT1VUPTMwMDAwCitDT05ORUNUX1RJTUVPVVQ9MzAwMDAKK1JFTkFNRURfV0FSX1BBVEg9IiRNV19IT01FIi8kQ09OVEVYVF9ST09ULiR7V0FSX1BBVEgjIyoufQorCitpZiBbICIkV0FSX1BBVEgiID0gIiIgLW8gIiRET01BSU4iID0gIiIgLW8gIiRNV19IT01FIiA9ICIiIF07IHRoZW4KKyAgICBlY2hvIEFSR1VNRU5UUyBOT1QgT0sKKyAgICBleGl0IDEKK2ZpCisKK2V4cG9ydCBKQVZBX09QVElPTlM9LURqYXZhLmVuZG9yc2VkLmRpcnM9IiRKQVZBX0hPTUUvanJlL2xpYi9lbmRvcnNlZCI6IiRNV19IT01FL29yYWNsZV9jb21tb24vbW9kdWxlcy9lbmRvcnNlZCIKKworc2V0ICt4CisuICIkTVdfSE9NRSIvd2xzZXJ2ZXIvc2VydmVyL2Jpbi9zZXRXTFNFbnYuc2gKK1sgIiRERUJVRyIgPSAidHJ1ZSIgXSAmJiBzZXQgLXgKKworY2QgIiRNV19IT01FLyRET01BSU4iCisKK2phdmEgd2VibG9naWMuV0xTVCA8PCBFT0YKK2Zyb20gamF2YS51dGlsIGltcG9ydCAqCitmcm9tIGphdmF4Lm1hbmFnZW1lbnQgaW1wb3J0ICoKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkF0dHJpYnV0ZQorcHJpbnQgIldMU1Q6ICBDb25uZWN0aW5nLi4uIgorY29ubmVjdCgid2VibG9naWMiLCAid2VibG9naWMxIiwgImxvY2FsaG9zdDokUE9SVCIpCit1bmRlcGxveSgiJEFQUExJQ0FUSU9OX05BTUUiKQorcHJpbnQgIldMU1Q6IEFwcGxpY2F0aW9uIHVuZGVwbG95ZWQsIGV4aXRpbmcuIgorZXhpdCgpCitFT0YKKworaWYgWyAiJFNLSVBfUkVERVBMT1kiID0gInRydWUiIF07IHRoZW4KKyAgICBlY2hvIFNraXBwaW5nIHJlZGVwbG95LgorICAgIGV4aXQKK2ZpCisKKyMgSXQgaXMgaW1wb3NzaWJsZSB0byBlYXNpbGx5IHNldCB0aGUgY29udGV4dCByb290IGluIFdlYmxvZ2ljIGJlc2lkZXMgY2hhbmdpbmcgdGhlIHdhciBuYW1lCitpZiBbICIke1dBUl9QQVRIIyMqL30iICE9ICIke1JFTkFNRURfV0FSX1BBVEgjIyovfSIgXTsgdGhlbgorICAgIFsgLWYgIiRSRU5BTUVEX1dBUl9QQVRIIiBdICYmIHJtICIkUkVOQU1FRF9XQVJfUEFUSCIKKyAgICBsbiAtcyAiJFdBUl9QQVRIIiAiJFJFTkFNRURfV0FSX1BBVEgiCitlbHNlCisgICAgUkVOQU1FRF9XQVJfUEFUSD0iJFdBUl9QQVRIIgorZmkKKworc2V0ICtlCisKK2phdmEgd2VibG9naWMuV0xTVCA8PCBFT0YKK2Zyb20gamF2YS51dGlsIGltcG9ydCAqCitmcm9tIGphdmF4Lm1hbmFnZW1lbnQgaW1wb3J0ICoKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LkF0dHJpYnV0ZQorcHJpbnQgIldMU1Q6ICBDb25uZWN0aW5nLi4uIgordHJ5OgorICAgIGNvbm5lY3QoIndlYmxvZ2ljIiwgIndlYmxvZ2ljMSIsICJsb2NhbGhvc3Q6JFBPUlQiLCB0aW1lb3V0PSRDT05ORUNUX1RJTUVPVVQpCisgICAgcHJvZ3Jlc3MgPSBkZXBsb3koIiRBUFBMSUNBVElPTl9OQU1FIiwgIiRSRU5BTUVEX1dBUl9QQVRIIiwgdGltZW91dD0kREVQTE9ZX1RJTUVPVVQpCisgICAgaWYgbm90IHByb2dyZXNzLmlzQ29tcGxldGVkKCk6CisgICAgICAgIHByaW50ICJXTFNUOiBEZXBsb3ltZW50IHdhc24ndCBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LiBGYWlsdXJlOiAiICsgcHJvZ3Jlc3MuZ2V0U3RhdGUoKQorICAgICAgICBleGl0KGV4aXRjb2RlPTMpCitleGNlcHQgRXhjZXB0aW9uLCBlOgorICAgIHByaW50ICJFeGNlcHRpb24gb2NjdXJyZWQhICIgKyBzdHIoZSkKKyAgICBleGl0KGV4aXRjb2RlPTQpCisKK3ByaW50ICJXTFNUOiBEZXBsb3ltZW50IGZpbmlzaGVkLCBleGl0aW5nLiIKK2V4aXQoKQorRU9GCisKK0VYSVRfQ09ERT0kPworZWNobyBEZXBsb3ltZW50IGZpbmlzaGVkIHdpdGggJEVYSVRfQ09ERQorCitleGl0ICRFWElUX0NPREUKZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2NvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9ydW5uZXIvd2xzL3N0YXJ0LnNoIGIvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL3J1bm5lci93bHMvc3RhcnQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUwY2I1NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2NvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9ydW5uZXIvd2xzL3N0YXJ0LnNoCkBAIC0wLDAgKzEsMTM3IEBACisjIS9iaW4vc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisjCisjIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyMgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorIyBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyMgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorIworIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyMKKworc2V0IC1lCitbICIkREVCVUciID0gInRydWUiIF0gJiYgc2V0IC14CisKKyMgcmVkZWNsYXJhdGlvbiBvZiBlbnYgdmFyaWFibGVzIHNvIHRoYXQgZWRpdG9ycyBkbyBub3QgdGhpbmsgZXZlcnkgdmFyaWFibGUgaXMgYSB0eXBvCitXQVJfUEFUSD0kV0FSX1BBVEgKK01BWF9IRUFQPSRNQVhfSEVBUAorVFJJRVNfQ09VTlQ9JFRSSUVTX0NPVU5UCitNV19IT01FPSRNV19IT01FCitET01BSU49JERPTUFJTgorUE9SVD0kUE9SVAorU0tJUF9ERVBMT1k9JFNLSVBfREVQTE9ZCitET01BSU49JERPTUFJTgorQVBQTElDQVRJT05fTkFNRT0kQVBQTElDQVRJT05fTkFNRQorTE9HRklMRT0kTE9HRklMRQorQ09OVEVYVF9ST09UPSRDT05URVhUX1JPT1QKK0pWTV9BUkdTPSRKVk1fQVJHUworU0tJUF9TVEFSVF9TVE9QPSRTS0lQX1NUQVJUX1NUT1AKK1NLSVBfQ0hFQ0s9JFNLSVBfQ0hFQ0sKK0RJU1RfRElSPSRESVNUX0RJUgorCitXTFNfU0VSVkVSX05BTUU9JFdMU19TRVJWRVJfTkFNRQorCitERVBMT1lfVElNRU9VVD0zMDAwMAorQ09OTkVDVF9USU1FT1VUPTMwMDAwCisKK2lmIFsgIiRXQVJfUEFUSCIgPSAiIiAtbyAiJERPTUFJTiIgPSAiIiAtbyAiJE1XX0hPTUUiID0gIiIgXTsgdGhlbgorICAgIGVjaG8gQVJHVU1FTlRTIE5PVCBPSworICAgIGV4aXQgMQorZmkKKworZXhwb3J0IEpBVkFfT1BUSU9OUz0tRGphdmEuZW5kb3JzZWQuZGlycz0iJEpBVkFfSE9NRS9qcmUvbGliL2VuZG9yc2VkIjoiJE1XX0hPTUUvb3JhY2xlX2NvbW1vbi9tb2R1bGVzL2VuZG9yc2VkIgorCitzZXQgK3gKKy4gIiRNV19IT01FIi93bHNlcnZlci9zZXJ2ZXIvYmluL3NldFdMU0Vudi5zaAorWyAiJERFQlVHIiA9ICJ0cnVlIiBdICYmIHNldCAteAorCitpZiBbICIkU0tJUF9TVEFSVF9TVE9QIiA9ICJ0cnVlIiBdOyB0aGVuCisgICAgY2QgIiRNV19IT01FLyRET01BSU4iCisgICAgZWNobyBTdGFydCBza2lwcGVkCitlbHNlCisgICAgaWYgWyAiJFNLSVBfQ0hFQ0siICE9ICJ0cnVlIiBdICYmIGpwcyAtdiB8IGdyZXAgJ2plcnNleS5jb25maWcudGVzdC5tZW1sZWFrLndscy5tYWdpY1J1bm5lcklkZW50aWZpZXInOyB0aGVuCisgICAgICAgIGVjaG8gRVJST1IgVGhlcmUgaXMgYWxyZWFkeSBydW5uaW5nIGluc3RhbmNlIG9mIE1lbWxlYWsgVGVzdCBXZWJsb2dpYworICAgICAgICBleGl0IDIKKyAgICBmaQorCisgICAgaWYgbmMgLXogbG9jYWxob3N0ICRQT1JUOyB0aGVuCisgICAgICAgIGVjaG8gRVJST1IgcG9ydCAkUE9SVCBpcyBub3QgZnJlZSEKKyAgICAgICAgZXhpdCAzCisgICAgZmkKKworICAgIHJtIC1yZiAiJE1XX0hPTUUvJERPTUFJTiIKKyAgICBta2RpciAiJE1XX0hPTUUvJERPTUFJTiIKKworICAgIGNkICIkTVdfSE9NRS8kRE9NQUlOIgorCisgICAgamF2YSAkSkFWQV9PUFRJT05TIC1YbXgkTUFYX0hFQVAgLVhYOk1heFBlcm1TaXplPTI1Nm0gXAorICAgICAgICAtWFg6K0hlYXBEdW1wT25PdXRPZk1lbW9yeUVycm9yIC1YWDpIZWFwRHVtcFBhdGg9JERJU1RfRElSIFwKKyAgICAgICAgLVhYOkdDVGltZUxpbWl0PTIwIC1YWDpHQ0hlYXBGcmVlTGltaXQ9MzAgXAorICAgICAgICAtRGplcnNleS5jb25maWcudGVzdC5tZW1sZWFrLndscy5tYWdpY1J1bm5lcklkZW50aWZpZXIgXAorICAgICAgICAtRHdlYmxvZ2ljLm1hbmFnZW1lbnQuR2VuZXJhdGVEZWZhdWx0Q29uZmlnIFwKKyAgICAgICAgLUR3ZWJsb2dpYy5Eb21haW49JERPTUFJTiBcCisgICAgICAgIC1Ed2VibG9naWMuTmFtZT0kV0xTX1NFUlZFUl9OQU1FIFwKKyAgICAgICAgLUR3ZWJsb2dpYy5tYW5hZ2VtZW50LnVzZXJuYW1lPXdlYmxvZ2ljIFwKKyAgICAgICAgLUR3ZWJsb2dpYy5tYW5hZ2VtZW50LnBhc3N3b3JkPXdlYmxvZ2ljMSBcCisgICAgICAgIC1Ed2VibG9naWMuTGlzdGVuUG9ydD0kUE9SVCBcCisgICAgICAgIC1EamF2YS5zZWN1cml0eS5lZ2Q9ZmlsZTovZGV2Ly4vdXJhbmRvbSBcCisgICAgICAgICRKVk1fQVJHUyBcCisgICAgICAgIHdlYmxvZ2ljLlNlcnZlciA+ICIkTE9HRklMRSIgMj4mMSAmCisKKyAgICBlY2hvICQhID4gIiRNV19IT01FLyRET01BSU4vd2xzLnBpZCIKKworICAgIGZvciBBIGluIGBzZXEgJFRSSUVTX0NPVU5UYDsgZG8KKyAgICAgICAgc2V0ICtlCisgICAgICAgIG5jIC16IGxvY2FsaG9zdCAkUE9SVCAmJiBicmVhaworICAgICAgICBzZXQgLWUKKyAgICAgICAgc2xlZXAgNQorICAgIGRvbmUKKworICAgIHNldCAtZQorZmkKKworaWYgWyAiJFNLSVBfREVQTE9ZIiA9ICJ0cnVlIiBdOyB0aGVuCisgICAgZWNobyBEZXBsb3ltZW50IHNraXBwZWQKKyAgICBleGl0IDAKK2ZpCisKKyMgSXQgaXMgaW1wb3NzaWJsZSB0byBlYXNpbGx5IHNldCB0aGUgY29udGV4dCByb290IGluIFdlYmxvZ2ljIGJlc2lkZXMgY2hhbmdpbmcgdGhlIHdhciBuYW1lCitSRU5BTUVEX1dBUl9QQVRIPSIkTVdfSE9NRSIvJENPTlRFWFRfUk9PVC4ke1dBUl9QQVRIIyMqLn0KK2lmIFsgIiR7V0FSX1BBVEgjIyovfSIgIT0gIiR7UkVOQU1FRF9XQVJfUEFUSCMjKi99IiBdOyB0aGVuCisgICAgWyAtZiAiJFJFTkFNRURfV0FSX1BBVEgiIF0gJiYgcm0gIiRSRU5BTUVEX1dBUl9QQVRIIgorICAgIGxuIC1zICIkV0FSX1BBVEgiICIkUkVOQU1FRF9XQVJfUEFUSCIKK2Vsc2UKKyAgICBSRU5BTUVEX1dBUl9QQVRIPSIkV0FSX1BBVEgiCitmaQorCitzZXQgK2UKKworamF2YSB3ZWJsb2dpYy5XTFNUIDw8IEVPRgorZnJvbSBqYXZhLnV0aWwgaW1wb3J0ICoKK2Zyb20gamF2YXgubWFuYWdlbWVudCBpbXBvcnQgKgoraW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuQXR0cmlidXRlCitwcmludCAiV0xTVDogIENvbm5lY3RpbmcuLi4iCit0cnk6CisgICAgY29ubmVjdCgid2VibG9naWMiLCAid2VibG9naWMxIiwgImxvY2FsaG9zdDokUE9SVCIsIHRpbWVvdXQ9JENPTk5FQ1RfVElNRU9VVCkKKyAgICBwcm9ncmVzcyA9IGRlcGxveSgiJEFQUExJQ0FUSU9OX05BTUUiLCAiJFJFTkFNRURfV0FSX1BBVEgiLCB0aW1lb3V0PSRERVBMT1lfVElNRU9VVCkKKyAgICBpZiBub3QgcHJvZ3Jlc3MuaXNDb21wbGV0ZWQoKToKKyAgICAgICAgcHJpbnQgIldMU1Q6IERlcGxveW1lbnQgd2Fzbid0IGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuIEZhaWx1cmU6ICIgKyBwcm9ncmVzcy5nZXRTdGF0ZSgpCisgICAgICAgIGV4aXQoZXhpdGNvZGU9MykKK2V4Y2VwdCBFeGNlcHRpb24sIGU6CisgICAgcHJpbnQgIkV4Y2VwdGlvbiBvY2N1cnJlZCEgIiArIHN0cihlKQorICAgIGV4aXQoZXhpdGNvZGU9NCkKKworcHJpbnQgIldMU1Q6IERlcGxveW1lbnQgZmluaXNoZWQsIGV4aXRpbmcuIgorZXhpdCgpCitFT0YKKworRVhJVF9DT0RFPSQ/CitlY2hvIERlcGxveW1lbnQgZmluaXNoZWQgd2l0aCAkRVhJVF9DT0RFCisKK2V4aXQgJEVYSVRfQ09ERQpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL3J1bm5lci93bHMvc3RvcC5zaCBiL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2NvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9ydW5uZXIvd2xzL3N0b3Auc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjA2OGZhYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2NvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9ydW5uZXIvd2xzL3N0b3Auc2gKQEAgLTAsMCArMSw2OCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorIworIyBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisjIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyMgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisjIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyMKKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisjCisKK3NldCAtZQorWyAiJERFQlVHIiA9ICJ0cnVlIiBdICYmIHNldCAteAorCisjIHJlZGVjbGFyYXRpb24gb2YgZW52IHZhcmlhYmxlcyBzbyB0aGF0IGVkaXRvcnMgZG8gbm90IHRoaW5rIGV2ZXJ5IHZhcmlhYmxlIGlzIGEgdHlwbworTVdfSE9NRT0kTVdfSE9NRQorRE9NQUlOPSRET01BSU4KK1BPUlQ9JFBPUlQKK1NLSVBfU1RBUlRfU1RPUD0kU0tJUF9TVEFSVF9TVE9QCitTS0lQX1NUT1A9JFNLSVBfU1RPUAorCitTVE9QX1RJTUU9MjAKK0tJTExfVElNRT01CisKK2lmIFsgIiRTS0lQX1NUQVJUX1NUT1AiID0gInRydWUiIC1vICIkU0tJUF9TVE9QIiA9ICJ0cnVlIiBdOyB0aGVuCisgICAgZWNobyBTdG9wIHNraXBwZWQKKyAgICBleGl0IDAKK2ZpCisKK2lmIFsgIiRNV19IT01FIiA9ICIiIC1vICIkRE9NQUlOIiA9ICIiIF07IHRoZW4KKyAgICBlY2hvIEFSR1VNRU5UUyBOT1QgT0sKKyAgICBleGl0IDEKK2ZpCisKK3NldCAreAorLiAkTVdfSE9NRS93bHNlcnZlci9zZXJ2ZXIvYmluL3NldFdMU0Vudi5zaAorWyAiJERFQlVHIiA9ICJ0cnVlIiBdICYmIHNldCAteAorCitjZCAkTVdfSE9NRS8kRE9NQUlOCisKK3NldCAreAorc2ggYmluL3N0b3BXZWJMb2dpYy5zaCAmCitTVE9QX1BJRD0kIQorCitbICIkREVCVUciID0gInRydWUiIF0gJiYgc2V0IC14Citmb3IgQSBpbiBgc2VxICRTVE9QX1RJTUVgOyBkbworICAgIGtpbGwgLTAgJFNUT1BfUElEIHx8IGJyZWFrOworICAgIHNsZWVwIDEKK2RvbmUKKworc2V0ICtlCitraWxsIC05ICRTVE9QX1BJRAorCitbIC1mICIkTVdfSE9NRS8kRE9NQUlOL3dscy5waWQiIF0gJiYga2lsbCAtOSBgY2F0ICIkTVdfSE9NRS8kRE9NQUlOL3dscy5waWQiYAorCitmb3IgQSBpbiBgc2VxICRLSUxMX1RJTUVgOyBkbworICAgIG5jIC16IGxvY2FsaG9zdCAkUE9SVCB8fCBleGl0IDAKKyAgICBzbGVlcCAxCitkb25lCisKK2VjaG8gRVJST1IgV0xTIHNlcnZlciBzZWVtcyB0byBub3QgYmUgc2h1dGRvd24hCitleGl0IDIKZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2NvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L2dyb292eS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L21hdmVuL3J1bm5lci9nZjQvR2Y0UnVubmVyTW9qb1Rlc3QuZ3Jvb3Z5IGIvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvZ3Jvb3Z5L29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvbWF2ZW4vcnVubmVyL2dmNC9HZjRSdW5uZXJNb2pvVGVzdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYwMThjYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2NvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L2dyb292eS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L21hdmVuL3J1bm5lci9nZjQvR2Y0UnVubmVyTW9qb1Rlc3QuZ3Jvb3Z5CkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5tYXZlbi5ydW5uZXIuZ2Y0CisKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvCitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4udGVzdGluZy5BYnN0cmFjdE1vam9UZXN0Q2FzZQoraW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQKK2ltcG9ydCBvcmcuanVuaXQuQXNzdW1lCitpbXBvcnQgb3JnLmp1bml0LlRlc3QKKworLyoqCisgKiBHbGFzc2Zpc2g0IHJ1bm5lciB0ZXN0cy4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK2NsYXNzIEdmNFJ1bm5lck1vam9UZXN0IGV4dGVuZHMgQWJzdHJhY3RNb2pvVGVzdENhc2UgeworCisgICAgcHJpdmF0ZSBNb2pvIGxvb2t1cE1vam9UZXN0UG9tKFN0cmluZyBnb2FsLCBTdHJpbmcgcG9tRmlsZSkgeworICAgICAgICBkZWYgcmVzb3VyY2UgPSBnZXRDbGFzcygpLmdldFJlc291cmNlKHBvbUZpbGUpCisgICAgICAgIGlmIChyZXNvdXJjZSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJQb20gZmlsZTogJHBvbUZpbGUgd2FzIG5vdCBsb2NhdGVkIG9uIGNsYXNzcGF0aCEiKQorICAgICAgICB9CisgICAgICAgIGRlZiBmaWxlID0gbmV3IEZpbGUocmVzb3VyY2UudG9VUkkoKSkKKyAgICAgICAgaWYgKCFmaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3QgbG9jYXRlIHRlc3QgcG9tIHhtbCBmaWxlISIpCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxvb2t1cE1vam8oZ29hbCwgZmlsZSkKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHZvaWQgdGVzdERvd25sb2FkR2Y0TW9qbygpIHsKKyAgICAgICAgZGVmIG1vam8gPSBsb29rdXBNb2pvVGVzdFBvbSgiZG93bmxvYWRHZjQiLCAiL3BvbS1kb3dubG9hZC1tb2pvLnhtbCIpCisgICAgICAgIG1vam8uZXhlY3V0ZSgpCisKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkFzIGFkbWluIGluIGdsYXNzZmlzaDQvZ2xhc3NmaXNoL2Jpbi9hc2FkbWluIHdhc24ndCBjcmVhdGVkIiwKKyAgICAgICAgICAgICAgICBuZXcgRmlsZShnZXRDbGFzcygpLmdldFJlc291cmNlKCIvZ2Y0L2dsYXNzZmlzaDQvZ2xhc3NmaXNoL2Jpbi9hc2FkbWluIikudG9VUkkoKSkuZXhpc3RzKCkpCisgICAgfQorCisgICAgQFRlc3QKKyAgICB2b2lkIHRlc3RTdGFydEFuZERlcGxveUdmNE1vam8oKSB7CisgICAgICAgIGRlZiBtb2pvID0gbG9va3VwTW9qb1Rlc3RQb20oInN0YXJ0QW5kRGVwbG95R2Y0IiwgIi9wb20tc3RhcnQtZGVwbG95LW1vam8ueG1sIikKKyAgICAgICAgbW9qby5leGVjdXRlKCkKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHZvaWQgdGVzdFN0b3BHZjRNb2pvKCkgeworICAgICAgICBkZWYgbW9qbyA9IGxvb2t1cE1vam9UZXN0UG9tKCJzdG9wR2Y0IiwgIi9wb20tdW5kZXBsb3ktc3RvcC1tb2pvLnhtbCIpCisgICAgICAgIG1vam8uZXhlY3V0ZSgpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvZ3Jvb3Z5L29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvbWF2ZW4vcnVubmVyL2dmNC9tYXZlbi9SdW5uZXJUZXN0TWF2ZW5Qcm9qZWN0Lmdyb292eSBiL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2NvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L2dyb292eS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L21hdmVuL3J1bm5lci9nZjQvbWF2ZW4vUnVubmVyVGVzdE1hdmVuUHJvamVjdC5ncm9vdnkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYxMjJkNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2NvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L2dyb292eS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L21hdmVuL3J1bm5lci9nZjQvbWF2ZW4vUnVubmVyVGVzdE1hdmVuUHJvamVjdC5ncm9vdnkKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0Lm1hdmVuLnJ1bm5lci5nZjQubWF2ZW4KKworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLnRlc3Rpbmcuc3R1YnMuTWF2ZW5Qcm9qZWN0U3R1YgorCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHtAbGluayBNYXZlblByb2plY3RTdHVifSB0byBiZSB1c2VkIGFzIHtAbGluayBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0fSBmaWVsZCBpbiBtb2pvcyBhbm5vdGF0ZWQgd2l0aAorICoge0BsaW5rIG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucy5hbm5vdGF0aW9ucy5Db21wb25lbnR9CisgKgorICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYSBhdCBvcmFjbGUuY29tKQorICovCitjbGFzcyBSdW5uZXJUZXN0TWF2ZW5Qcm9qZWN0IGV4dGVuZHMgTWF2ZW5Qcm9qZWN0U3R1YiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBGaWxlIGdldEJhc2VkaXIoKSB7CisgICAgICAgIHJldHVybiBuZXcgRmlsZSgiLiIpCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2dsYXNzZmlzaC1zdHViLnppcCBiL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2NvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9nbGFzc2Zpc2gtc3R1Yi56aXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM0YWRmMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2NvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9nbGFzc2Zpc2gtc3R1Yi56aXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2dsYXNzZmlzaDQvZ2xhc3NmaXNoL2Jpbi9hc2FkbWluIGIvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2dsYXNzZmlzaDQvZ2xhc3NmaXNoL2Jpbi9hc2FkbWluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNThmM2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay9tYXZlbi9jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvZ2xhc3NmaXNoNC9nbGFzc2Zpc2gvYmluL2FzYWRtaW4KQEAgLTAsMCArMSwxOCBAQAorIyEvYmluL3NoCisjCisjIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorIworIyBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisjIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyMgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisjIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyMKKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisjCisKK2VjaG8gUnVubmluZyAkKgpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3BvbS1kb3dubG9hZC1tb2pvLnhtbCBiL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2NvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9wb20tZG93bmxvYWQtbW9qby54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRjMTEzNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2NvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9wb20tZG93bmxvYWQtbW9qby54bWwKQEAgLTAsMCArMSw0NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5tYXZlbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGRpc3RVcmw+ZmlsZTovLyR7cHJvamVjdC5idWlsZC50ZXN0T3V0cHV0RGlyZWN0b3J5fS9nbGFzc2Zpc2gtc3R1Yi56aXA8L2Rpc3RVcmw+CisgICAgICAgICAgICAgICAgICAgIDxkaXN0VGFyZ2V0TG9jYXRpb24+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vbGF0ZXN0LWdsYXNzZmlzaC56aXA8L2Rpc3RUYXJnZXRMb2NhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGRpc3REaXI+JHtwcm9qZWN0LmJ1aWxkLnRlc3RPdXRwdXREaXJlY3Rvcnl9L2dmNDwvZGlzdERpcj4KKyAgICAgICAgICAgICAgICAgICAgPGRpc3RTdWJkaXI+Z2xhc3NmaXNoNDwvZGlzdFN1YmRpcj4KKyAgICAgICAgICAgICAgICAgICAgPGFzSG9tZT5nbGFzc2Zpc2g8L2FzSG9tZT4KKyAgICAgICAgICAgICAgICAgICAgPGRvbWFpbj5tZW1sZWFrX3Rlc3RfZG9tYWluPC9kb21haW4+CisgICAgICAgICAgICAgICAgICAgIDxhcHBsaWNhdGlvbk5hbWU+amF4LXJzLW1lbWxlYWstdGVzdC1hcHA8L2FwcGxpY2F0aW9uTmFtZT4KKyAgICAgICAgICAgICAgICAgICAgPGxvZ0ZpbGU+c2VydmVyLmxvZzwvbG9nRmlsZT4KKyAgICAgICAgICAgICAgICAgICAgPCEtLTxhc0hvbWU+JHtwcm9qZWN0LmJ1aWxkLnRlc3RPdXRwdXREaXJlY3Rvcnl9L2dmNC9nbGFzc2Zpc2g0L2dsYXNzZmlzaDwvYXNIb21lPi0tPgorICAgICAgICAgICAgICAgICAgICA8Y29udGV4dFJvb3Q+YXBwPC9jb250ZXh0Um9vdD4KKyAgICAgICAgICAgICAgICAgICAgPHByb2plY3QgaW1wbGVtZW50YXRpb249Im9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QubWF2ZW4ucnVubmVyLmdmNC5tYXZlbi5SdW5uZXJUZXN0TWF2ZW5Qcm9qZWN0Ii8+CisgICAgICAgICAgICAgICAgICAgIDxzY3JpcHRzRGlyZWN0b3J5PiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L3RtcDwvc2NyaXB0c0RpcmVjdG9yeT4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2NvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9wb20tc3RhcnQtZGVwbG95LW1vam8ueG1sIGIvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3BvbS1zdGFydC1kZXBsb3ktbW9qby54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ3NGNkMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2NvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9wb20tc3RhcnQtZGVwbG95LW1vam8ueG1sCkBAIC0wLDAgKzEsNDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsubWF2ZW48L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxhc0hvbWU+JHtwcm9qZWN0LmJ1aWxkLnRlc3RPdXRwdXREaXJlY3Rvcnl9L2dsYXNzZmlzaDQvZ2xhc3NmaXNoPC9hc0hvbWU+CisgICAgICAgICAgICAgICAgICAgIDx3YXJQYXRoPiR7cHJvamVjdC5idWlsZC50ZXN0T3V0cHV0RGlyZWN0b3J5fS90ZXN0Lndhcjwvd2FyUGF0aD4KKyAgICAgICAgICAgICAgICAgICAgPGRvbWFpbj5tZW1sZWFrX3Rlc3RfZG9tYWluPC9kb21haW4+CisgICAgICAgICAgICAgICAgICAgIDxkaXN0RGlyPiR7cHJvamVjdC5idWlsZC50ZXN0T3V0cHV0RGlyZWN0b3J5fS9nZjQ8L2Rpc3REaXI+CisgICAgICAgICAgICAgICAgICAgIDxkaXN0U3ViZGlyPmdsYXNzZmlzaDQ8L2Rpc3RTdWJkaXI+CisgICAgICAgICAgICAgICAgICAgIDxhcHBsaWNhdGlvbk5hbWU+amF4LXJzLW1lbWxlYWstdGVzdC1hcHA8L2FwcGxpY2F0aW9uTmFtZT4KKyAgICAgICAgICAgICAgICAgICAgPGxvZ0ZpbGU+c2VydmVyLmxvZzwvbG9nRmlsZT4KKyAgICAgICAgICAgICAgICAgICAgPG1heEhlYXA+MjU2bTwvbWF4SGVhcD4KKyAgICAgICAgICAgICAgICAgICAgPGNvbnRleHRSb290PmFwcDwvY29udGV4dFJvb3Q+CisgICAgICAgICAgICAgICAgICAgIDxwcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0Lm1hdmVuLnJ1bm5lci5nZjQubWF2ZW4uUnVubmVyVGVzdE1hdmVuUHJvamVjdCIvPgorICAgICAgICAgICAgICAgICAgICA8c2NyaXB0c0RpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS90bXA8L3NjcmlwdHNEaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgICAgIDxza2lwQ2hlY2s+dHJ1ZTwvc2tpcENoZWNrPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3BvbS11bmRlcGxveS1zdG9wLW1vam8ueG1sIGIvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3BvbS11bmRlcGxveS1zdG9wLW1vam8ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5Zjk3YTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay9tYXZlbi9jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvcG9tLXVuZGVwbG95LXN0b3AtbW9qby54bWwKQEAgLTAsMCArMSw0NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5tYXZlbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGFzSG9tZT4ke3Byb2plY3QuYnVpbGQudGVzdE91dHB1dERpcmVjdG9yeX0vZ2xhc3NmaXNoNC9nbGFzc2Zpc2g8L2FzSG9tZT4KKyAgICAgICAgICAgICAgICAgICAgPGRvbWFpbj5tZW1sZWFrX3Rlc3RfZG9tYWluPC9kb21haW4+CisgICAgICAgICAgICAgICAgICAgIDxkaXN0RGlyPiR7cHJvamVjdC5idWlsZC50ZXN0T3V0cHV0RGlyZWN0b3J5fS9nZjQ8L2Rpc3REaXI+CisgICAgICAgICAgICAgICAgICAgIDxkaXN0U3ViZGlyPmdsYXNzZmlzaDQ8L2Rpc3RTdWJkaXI+CisgICAgICAgICAgICAgICAgICAgIDxhcHBsaWNhdGlvbk5hbWU+amF4LXJzLW1lbWxlYWstdGVzdC1hcHA8L2FwcGxpY2F0aW9uTmFtZT4KKyAgICAgICAgICAgICAgICAgICAgPGxvZ0ZpbGU+c2VydmVyLmxvZzwvbG9nRmlsZT4KKyAgICAgICAgICAgICAgICAgICAgPGNvbnRleHRSb290PmFwcDwvY29udGV4dFJvb3Q+CisgICAgICAgICAgICAgICAgICAgIDxwcm9qZWN0IGltcGxlbWVudGF0aW9uPSJvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0Lm1hdmVuLnJ1bm5lci5nZjQubWF2ZW4uUnVubmVyVGVzdE1hdmVuUHJvamVjdCIvPgorICAgICAgICAgICAgICAgICAgICA8c2NyaXB0c0RpcmVjdG9yeT4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS90bXA8L3NjcmlwdHNEaXJlY3Rvcnk+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0LWZyYW1ld29yay9tYXZlbi9jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdC53YXIgYi90ZXN0LWZyYW1ld29yay9tYXZlbi9jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvdGVzdC53YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2NvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy90ZXN0LndhcgpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY3VzdG9tLWVuZm9yY2VyLXJ1bGVzL3BvbS54bWwgYi90ZXN0LWZyYW1ld29yay9tYXZlbi9jdXN0b20tZW5mb3JjZXItcnVsZXMvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTk0NmM4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY3VzdG9tLWVuZm9yY2VyLXJ1bGVzL3BvbS54bWwKQEAgLTAsMCArMSw2NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5tYXZlbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmN1c3RvbS1lbmZvcmNlci1ydWxlczwvYXJ0aWZhY3RJZD4KKyAgICA8bmFtZT5qZXJzZXktdGVzdC1mcmFtZXdvcmstbWF2ZW4tY3VzdG9tLWVuZm9yY2VyLXJ1bGVzPC9uYW1lPgorCisgICAgPGRlcGVuZGVuY2llcz4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWVuZm9yY2VyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjEuNC4xPC92ZXJzaW9uPgorICAgICAgICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICAgICAgPC9leGNsdXNpb25zPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWlvPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1pbzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5ndWF2YTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmd1YXZhPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8L2RlcGVuZGVuY2llcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY3VzdG9tLWVuZm9yY2VyLXJ1bGVzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9tYXZlbi9ydWxlL0ZpbGVQYXR0ZXJuRG9lc05vdEV4aXN0UnVsZS5qYXZhIGIvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY3VzdG9tLWVuZm9yY2VyLXJ1bGVzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9tYXZlbi9ydWxlL0ZpbGVQYXR0ZXJuRG9lc05vdEV4aXN0UnVsZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMDBlNzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay9tYXZlbi9jdXN0b20tZW5mb3JjZXItcnVsZXMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L21hdmVuL3J1bGUvRmlsZVBhdHRlcm5Eb2VzTm90RXhpc3RSdWxlLmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0Lm1hdmVuLnJ1bGU7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlRmlsdGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKKworaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5maWxlZmlsdGVyLldpbGRjYXJkRmlsZUZpbHRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmVuZm9yY2VyLnJ1bGUuYXBpLkVuZm9yY2VyUnVsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmVuZm9yY2VyLnJ1bGUuYXBpLkVuZm9yY2VyUnVsZUhlbHBlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnMuZW5mb3JjZXIuQWJzdHJhY3ROb25DYWNoZWFibGVFbmZvcmNlclJ1bGU7CisKKy8qKgorICogTWF2ZW4gZW5mb3JjZXIgcnVsZSB0byBlbmZvcmNlIHRoYXQgZ2l2ZW4gc2V0IG9mIGZpbGVzIGRvZXMgbm90IGV4aXN0Ljxici8+CisgKiBUaGlzIHJ1bGUgaXMgc2ltaWxhciB0byBhcGFjaGUge0Bjb2RlIHJlcXVpcmVGaWxlc0RvbnRFeGlzdH0gd2l0aCBhIHN1cHBvcnQgZm9yIHdpbGRjYXJkcy4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBGaWxlUGF0dGVybkRvZXNOb3RFeGlzdFJ1bGUgZXh0ZW5kcyBBYnN0cmFjdE5vbkNhY2hlYWJsZUVuZm9yY2VyUnVsZSB7CisKKyAgICBGaWxlW10gZmlsZXM7CisKKyAgICBwdWJsaWMgdm9pZCBleGVjdXRlKEVuZm9yY2VyUnVsZUhlbHBlciBoZWxwZXIpCisgICAgICAgICAgICB0aHJvd3MgRW5mb3JjZXJSdWxlRXhjZXB0aW9uIHsKKworICAgICAgICBpZiAoZmlsZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChGaWxlIGZpbGUgOiBmaWxlcykgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZpbGVQYXRoID0gZmlsZS5nZXRQYXRoKCk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcHJlZml4ID0gZmlsZVBhdGguc3Vic3RyaW5nKDAsIGZpbGVQYXRoLmluZGV4T2YoIioiKSk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGlyTmFtZSA9IHByZWZpeC5zdWJzdHJpbmcoMCwgcHJlZml4Lmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yKSk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZmlsZUl0c2VsZlBhdHRlcm4gPSBmaWxlUGF0aC5zdWJzdHJpbmcoZGlyTmFtZS5sZW5ndGgoKSArIDEpOworCisgICAgICAgICAgICBmaW5hbCBGaWxlIGRpciA9IG5ldyBGaWxlKGRpck5hbWUpOworICAgICAgICAgICAgaWYgKCFkaXIuaXNEaXJlY3RvcnkoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBTZXQ8RmlsZT4gbWF0Y2hlZEZpbGVzID0gbmV3IFRyZWVTZXQ8PigpOworICAgICAgICAgICAgZm9yIChGaWxlIG1hdGNoZWRGaWxlIDogZGlyLmxpc3RGaWxlcygoRmlsZUZpbHRlcikgbmV3IFdpbGRjYXJkRmlsZUZpbHRlcihmaWxlSXRzZWxmUGF0dGVybikpKSB7CisgICAgICAgICAgICAgICAgbWF0Y2hlZEZpbGVzLmFkZChtYXRjaGVkRmlsZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghbWF0Y2hlZEZpbGVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFbmZvcmNlclJ1bGVFeGNlcHRpb24oIkZpbGVzIGZvdW5kISAiICsgQXJyYXlzLnRvU3RyaW5nKG1hdGNoZWRGaWxlcy50b0FycmF5KCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2N1c3RvbS1lbmZvcmNlci1ydWxlcy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvbWF2ZW4vcnVsZS9QYXR0ZXJuTm90TWF0Y2hlZEluRmlsZVJ1bGUuamF2YSBiL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2N1c3RvbS1lbmZvcmNlci1ydWxlcy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvbWF2ZW4vcnVsZS9QYXR0ZXJuTm90TWF0Y2hlZEluRmlsZVJ1bGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzc3MTgxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY3VzdG9tLWVuZm9yY2VyLXJ1bGVzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9tYXZlbi9ydWxlL1BhdHRlcm5Ob3RNYXRjaGVkSW5GaWxlUnVsZS5qYXZhCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QubWF2ZW4ucnVsZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5lbmZvcmNlci5ydWxlLmFwaS5FbmZvcmNlclJ1bGVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5lbmZvcmNlci5ydWxlLmFwaS5FbmZvcmNlclJ1bGVIZWxwZXI7CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zLmVuZm9yY2VyLkFic3RyYWN0Tm9uQ2FjaGVhYmxlRW5mb3JjZXJSdWxlOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uaW8uRmlsZXM7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uaW8uTGluZVByb2Nlc3NvcjsKKworLyoqCisgKiBNYXZlbiBlbmZvcmNlciBydWxlIHRvIGVuZm9yY2UgdGhhdCBnaXZlbiBmaWxlIGRvZXMgbm90IGNvbnRhaW4gbGluZSBtYXRjaGluZyBnaXZlbiBwYXR0ZXJuLiBXaGVuIG1hdGNoZWQsIGV4Y2VwdGlvbiBpcworICogcmFpc2VkLgorICogPHAvPgorICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIHNoZWxsIHBzZXVkby1zY3JpcHQ6IHtjb2RlIGdyZXAgUEFUVEVSTiBGSUxFICYmICdyYWlzZSBlcnJvcid9CisgKgorICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYSBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgUGF0dGVybk5vdE1hdGNoZWRJbkZpbGVSdWxlIGV4dGVuZHMgQWJzdHJhY3ROb25DYWNoZWFibGVFbmZvcmNlclJ1bGUgeworCisgICAgLyoqCisgICAgICogVGhlIHBhdHRlcm4gdG8gbG9vayBmb3IgaW4gdGhlIGdpdmVuIGZpbGUuCisgICAgICovCisgICAgU3RyaW5nIHBhdHRlcm47CisKKyAgICAvKioKKyAgICAgKiBUaGUgZmlsZSB3aGVyZSB0byBsb29rIGZvciBsaW5lcyBtYXRjaGluZyBnaXZlbiBwYXR0ZXJuLgorICAgICAqLworICAgIEZpbGUgZmlsZTsKKworICAgIC8qKgorICAgICAqIE1heGltdW0gbnVtYmVyIG9mIGxpbmVzIHRvIGJlIG1hdGNoZWQgKGV4Y2VwdGlvbiBpcyByYWlzZWQgcmVnYXJkbGVzcyBvZiB0aGUgbnVtYmVyIG9mIGZvdW5kIGxpbmVzIGFzIGxvbmcgYXMgdGhlIG51bWJlciBpcworICAgICAqIGdyZWF0ZXIgdGhhbiAwKQorICAgICAqLworICAgIGludCBtYXhNYXRjaGVkTGluZXMgPSAwOworCisgICAgcHVibGljIHZvaWQgZXhlY3V0ZShFbmZvcmNlclJ1bGVIZWxwZXIgaGVscGVyKQorICAgICAgICAgICAgdGhyb3dzIEVuZm9yY2VyUnVsZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgaWYgKGZpbGUgPT0gbnVsbCB8fCAhZmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgUGF0dGVybiBwYXR0ZXJuQ29tcGlsZWQgPSBQYXR0ZXJuLmNvbXBpbGUocGF0dGVybik7CisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBsaW5lcyA9IEZpbGVzLnJlYWRMaW5lcyhmaWxlLCBDaGFyc2V0LmRlZmF1bHRDaGFyc2V0KCksIG5ldyBMaW5lUHJvY2Vzc29yPExpc3Q8U3RyaW5nPj4oKSB7CisgICAgICAgICAgICAgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbWF0Y2hlZExpbmVzID0gbmV3IExpbmtlZExpc3Q8PigpOworCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gcHJvY2Vzc0xpbmUoZmluYWwgU3RyaW5nIGxpbmUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuQ29tcGlsZWQubWF0Y2hlcihsaW5lKS5tYXRjaGVzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWRMaW5lcy5hZGQobGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF4TWF0Y2hlZExpbmVzICE9IDAgJiYgbWF4TWF0Y2hlZExpbmVzIDw9IG1hdGNoZWRMaW5lcy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRSZXN1bHQoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaGVkTGluZXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIGlmIChsaW5lcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVuZm9yY2VyUnVsZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJGb3VuZCBsaW5lcyBtYXRjaGluZyBwYXR0ZXJuOiAnIiArIHBhdHRlcm4gKyAiJyEgTGluZXMgbWF0Y2hlZDogIiArIEFycmF5cy50b1N0cmluZyhsaW5lcy50b0FycmF5KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBpbiBmaWxlOiAiICsgZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEVuZm9yY2VyUnVsZUV4Y2VwdGlvbigiSS9PIEVycm9yIG9jY3VycmVkIGR1cmluZyBwcm9jZXNzaW5nIG9mIGZpbGU6ICIgKyBmaWxlLmdldEFic29sdXRlUGF0aCgpLCBlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2N1c3RvbS1lbmZvcmNlci1ydWxlcy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvbWF2ZW4vcnVsZS9GaWxlUGF0dGVybkRvZXNOb3RFeGlzdFJ1bGVUZXN0LmphdmEgYi90ZXN0LWZyYW1ld29yay9tYXZlbi9jdXN0b20tZW5mb3JjZXItcnVsZXMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L21hdmVuL3J1bGUvRmlsZVBhdHRlcm5Eb2VzTm90RXhpc3RSdWxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1ZjRjNWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay9tYXZlbi9jdXN0b20tZW5mb3JjZXItcnVsZXMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L21hdmVuL3J1bGUvRmlsZVBhdHRlcm5Eb2VzTm90RXhpc3RSdWxlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5tYXZlbi5ydWxlOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmVuZm9yY2VyLnJ1bGUuYXBpLkVuZm9yY2VyUnVsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBCYXNpYyBzYW5pdHkgdGVzdCBvZiB7QGxpbmsgRmlsZVBhdHRlcm5Eb2VzTm90RXhpc3RSdWxlfSBlbmZvcmNlciBydWxlLgorICoKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEZpbGVQYXR0ZXJuRG9lc05vdEV4aXN0UnVsZVRlc3QgeworCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBFbmZvcmNlclJ1bGVFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdE1hdGNoZWRQYXRoKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiwgRW5mb3JjZXJSdWxlRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgRmlsZVBhdHRlcm5Eb2VzTm90RXhpc3RSdWxlIGZpbGVQYXR0ZXJuRG9lc05vdEV4aXN0UnVsZSA9IG5ldyBGaWxlUGF0dGVybkRvZXNOb3RFeGlzdFJ1bGUoKTsKKworICAgICAgICBmaW5hbCBVUkkgdXJpID0gZ2V0Q2xhc3MoKQorICAgICAgICAgICAgICAgIC5nZXRSZXNvdXJjZSgiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvbWF2ZW4vcnVsZS9GaWxlUGF0dGVybkRvZXNOb3RFeGlzdFJ1bGUuY2xhc3MiKS50b1VSSSgpOworICAgICAgICBmaW5hbCBGaWxlIGZpbGUgPSBuZXcgRmlsZSh1cmkpOworICAgICAgICBmaW5hbCBTdHJpbmcgcGF0dGVybiA9IGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCkucmVwbGFjZSgiUGF0dGVybkRvZXMiLCAiKiIpOworICAgICAgICBmaWxlUGF0dGVybkRvZXNOb3RFeGlzdFJ1bGUuZmlsZXMgPSBuZXcgRmlsZVtdIHtuZXcgRmlsZShwYXR0ZXJuKX07CisKKyAgICAgICAgZmlsZVBhdHRlcm5Eb2VzTm90RXhpc3RSdWxlLmV4ZWN1dGUobnVsbCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90TWF0Y2hlZFBhdGgoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uLCBFbmZvcmNlclJ1bGVFeGNlcHRpb24geworICAgICAgICBmaW5hbCBGaWxlUGF0dGVybkRvZXNOb3RFeGlzdFJ1bGUgZmlsZVBhdHRlcm5Eb2VzTm90RXhpc3RSdWxlID0gbmV3IEZpbGVQYXR0ZXJuRG9lc05vdEV4aXN0UnVsZSgpOworCisgICAgICAgIGZpbmFsIFVSSSB1cmkgPSBnZXRDbGFzcygpCisgICAgICAgICAgICAgICAgLmdldFJlc291cmNlKCIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9tYXZlbi9ydWxlL0ZpbGVQYXR0ZXJuRG9lc05vdEV4aXN0UnVsZS5jbGFzcyIpLnRvVVJJKCk7CisgICAgICAgIGZpbmFsIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHVyaSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBwYXR0ZXJuID0gZmlsZS5nZXRBYnNvbHV0ZVBhdGgoKS5yZXBsYWNlKCJQYXR0ZXJuRG9lcyIsICIqIikucmVwbGFjZSgiRXhpc3QiLCAiIik7CisgICAgICAgIGZpbGVQYXR0ZXJuRG9lc05vdEV4aXN0UnVsZS5maWxlcyA9IG5ldyBGaWxlW10ge25ldyBGaWxlKHBhdHRlcm4pfTsKKworICAgICAgICBmaWxlUGF0dGVybkRvZXNOb3RFeGlzdFJ1bGUuZXhlY3V0ZShudWxsKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0LWZyYW1ld29yay9tYXZlbi9jdXN0b20tZW5mb3JjZXItcnVsZXMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L21hdmVuL3J1bGUvUGF0dGVybk5vdE1hdGNoZWRJbkZpbGVSdWxlVGVzdC5qYXZhIGIvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY3VzdG9tLWVuZm9yY2VyLXJ1bGVzL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9tYXZlbi9ydWxlL1BhdHRlcm5Ob3RNYXRjaGVkSW5GaWxlUnVsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDNhNzMzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY3VzdG9tLWVuZm9yY2VyLXJ1bGVzL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9tYXZlbi9ydWxlL1BhdHRlcm5Ob3RNYXRjaGVkSW5GaWxlUnVsZVRlc3QuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QubWF2ZW4ucnVsZTsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CisKK2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmVuZm9yY2VyLnJ1bGUuYXBpLkVuZm9yY2VyUnVsZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBCYXNpYyBzYW5pdHkgdGVzdCBvZiB7QGxpbmsgUGF0dGVybk5vdE1hdGNoZWRJbkZpbGVSdWxlfSBlbmZvcmNlciBydWxlLgorICoKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFBhdHRlcm5Ob3RNYXRjaGVkSW5GaWxlUnVsZVRlc3QgeworCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBFbmZvcmNlclJ1bGVFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdE1hdGNoZWRQYXRoKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiwgRW5mb3JjZXJSdWxlRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdEZpbGVQYXR0ZXJuTGluZU1hdGNoZXIoIi9vdXRfb2ZfbWVtb3J5LmRhdCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vdE1hdGNoZWRQYXRoKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiwgRW5mb3JjZXJSdWxlRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdEZpbGVQYXR0ZXJuTGluZU1hdGNoZXIoIi9vay5kYXQiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdEZpbGVQYXR0ZXJuTGluZU1hdGNoZXIoU3RyaW5nIGZpbGVPbkNsYXNzcGF0aCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiwgRW5mb3JjZXJSdWxlRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUGF0dGVybk5vdE1hdGNoZWRJbkZpbGVSdWxlIGZpbGVQYXR0ZXJuRG9lc05vdENvbnRhaW5MaW5lTWF0Y2hpbmcgPSBuZXcKKyAgICAgICAgICAgICAgICBQYXR0ZXJuTm90TWF0Y2hlZEluRmlsZVJ1bGUoKTsKKworICAgICAgICBmaWxlUGF0dGVybkRvZXNOb3RDb250YWluTGluZU1hdGNoaW5nLmZpbGUgPSBuZXcgRmlsZShnZXRDbGFzcygpLmdldFJlc291cmNlKGZpbGVPbkNsYXNzcGF0aCkudG9VUkkoKSk7CisgICAgICAgIGZpbGVQYXR0ZXJuRG9lc05vdENvbnRhaW5MaW5lTWF0Y2hpbmcucGF0dGVybiA9ICIuKmphdmFcXC5sYW5nXFwuT3V0T2ZNZW1vcnlFcnJvci4qIjsKKworICAgICAgICBmaWxlUGF0dGVybkRvZXNOb3RDb250YWluTGluZU1hdGNoaW5nLmV4ZWN1dGUobnVsbCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY3VzdG9tLWVuZm9yY2VyLXJ1bGVzL3NyYy90ZXN0L3Jlc291cmNlcy9vay5kYXQgYi90ZXN0LWZyYW1ld29yay9tYXZlbi9jdXN0b20tZW5mb3JjZXItcnVsZXMvc3JjL3Rlc3QvcmVzb3VyY2VzL29rLmRhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzI0M2E1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vY3VzdG9tLWVuZm9yY2VyLXJ1bGVzL3NyYy90ZXN0L3Jlc291cmNlcy9vay5kYXQKQEAgLTAsMCArMSwzIEBACitIZWxsbyBXb3JsZAorRm9vIEJhcgorVGhpcyBpcyB0aGUgZW5kLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL21hdmVuL2N1c3RvbS1lbmZvcmNlci1ydWxlcy9zcmMvdGVzdC9yZXNvdXJjZXMvb3V0X29mX21lbW9yeS5kYXQgYi90ZXN0LWZyYW1ld29yay9tYXZlbi9jdXN0b20tZW5mb3JjZXItcnVsZXMvc3JjL3Rlc3QvcmVzb3VyY2VzL291dF9vZl9tZW1vcnkuZGF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0NzQyYjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay9tYXZlbi9jdXN0b20tZW5mb3JjZXItcnVsZXMvc3JjL3Rlc3QvcmVzb3VyY2VzL291dF9vZl9tZW1vcnkuZGF0CkBAIC0wLDAgKzEsMjIgQEAKK0hlbGxvIFdvcmxkCitGb28gQmFyCitvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyRXhjZXB0aW9uOiBqYXZhLmxhbmcuT3V0T2ZNZW1vcnlFcnJvcjogSmF2YSBoZWFwIHNwYWNlCisJYXQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5pbnRlcm5hbC5SZXNwb25zZVdyaXRlci5yZXRocm93KFJlc3BvbnNlV3JpdGVyLmphdmE6MjU2KQorCWF0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuaW50ZXJuYWwuUmVzcG9uc2VXcml0ZXIuZmFpbHVyZShSZXNwb25zZVdyaXRlci5qYXZhOjIzOCkKKwlhdCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUnVudGltZSRSZXNwb25kZXIucHJvY2VzcyhTZXJ2ZXJSdW50aW1lLmphdmE6NDg2KQorCWF0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJSdW50aW1lJDIucnVuKFNlcnZlclJ1bnRpbWUuamF2YTozMTYpCisJYXQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuRXJyb3JzJDEuY2FsbChFcnJvcnMuamF2YToyNzEpCisJVHJ1bmNhdGVkLiBzZWUgbG9nIGZpbGUgZm9yIGNvbXBsZXRlIHN0YWNrdHJhY2UKK0NhdXNlZCBCeTogamF2YS5sYW5nLk91dE9mTWVtb3J5RXJyb3I6IEphdmEgaGVhcCBzcGFjZQorCWF0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLm1lbWxlYWtzLnRlc3RsZWFrLk1lbUxlYWtpbmdSZXNvdXJjZS5pbnZva2UoTWVtTGVha2luZ1Jlc291cmNlLmphdmE6NzApCisJYXQgc3VuLnJlZmxlY3QuR2VuZXJhdGVkTWV0aG9kQWNjZXNzb3IxNTYuaW52b2tlKFVua25vd24gU291cmNlKQorCWF0IHN1bi5yZWZsZWN0LkRlbGVnYXRpbmdNZXRob2RBY2Nlc3NvckltcGwuaW52b2tlKERlbGVnYXRpbmdNZXRob2RBY2Nlc3NvckltcGwuamF2YTo0MykKKwlhdCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2QuaW52b2tlKE1ldGhvZC5qYXZhOjQ5NykKKwlhdCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuaW50ZXJuYWwuUmVzb3VyY2VNZXRob2RJbnZvY2F0aW9uSGFuZGxlckZhY3RvcnkkMS5pbnZva2UoUmVzb3VyY2VNZXRob2RJbnZvY2F0aW9uSGFuZGxlckZhY3RvcnkuamF2YTo4MSkKKwlUcnVuY2F0ZWQuIHNlZSBsb2cgZmlsZSBmb3IgY29tcGxldGUgc3RhY2t0cmFjZQorPgorCitFeGNlcHRpb246IGphdmEubGFuZy5PdXRPZk1lbW9yeUVycm9yIHRocm93biBmcm9tIHRoZSBVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIgaW4gdGhyZWFkICJ3ZWJsb2dpYy50aW1lcnMuVGltZXJUaHJlYWQiCitFeGNlcHRpb24gaW4gdGhyZWFkICJUaW1lci0yIgorRXhjZXB0aW9uOiBqYXZhLmxhbmcuT3V0T2ZNZW1vcnlFcnJvciB0aHJvd24gZnJvbSB0aGUgVW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyIGluIHRocmVhZCAiVGltZXItMiIKK1RoaXMgaXMgdGhlIGVuZC4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0LWZyYW1ld29yay9tYXZlbi9wb20ueG1sIGIvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDRkYjc5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1mcmFtZXdvcmsvbWF2ZW4vcG9tLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yazwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLm1hdmVuPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdC1mcmFtZXdvcmstbWF2ZW48L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+SmVyc2V5IHRlc3QgZnJhbWV3b3JrIE1hdmVuIHByb2plY3RzPC9kZXNjcmlwdGlvbj4KKworICAgIDxtb2R1bGVzPgorICAgICAgICA8bW9kdWxlPmNvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+Y3VzdG9tLWVuZm9yY2VyLXJ1bGVzPC9tb2R1bGU+CisgICAgPC9tb2R1bGVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0LWZyYW1ld29yay9tZW1sZWFrLXRlc3QtY29tbW9uL3BvbS54bWwgYi90ZXN0LWZyYW1ld29yay9tZW1sZWFrLXRlc3QtY29tbW9uL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZhYjI0MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZnJhbWV3b3JrL21lbWxlYWstdGVzdC1jb21tb24vcG9tLnhtbApAQCAtMCwwICsxLDUwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+bWVtbGVhay10ZXN0LWNvbW1vbjwvYXJ0aWZhY3RJZD4KKyAgICA8bmFtZT5qZXJzZXktdGVzdC1mcmFtZXdvcmstbWVtbGVhay10ZXN0LWNvbW1vbjwvbmFtZT4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZ3VhdmE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5ndWF2YTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0LWZyYW1ld29yay9tZW1sZWFrLXRlc3QtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9tZW1sZWFrL2NvbW1vbi9BYnN0cmFjdE1lbW9yeUxlYWtTaW1wbGVUZXN0LmphdmEgYi90ZXN0LWZyYW1ld29yay9tZW1sZWFrLXRlc3QtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9tZW1sZWFrL2NvbW1vbi9BYnN0cmFjdE1lbW9yeUxlYWtTaW1wbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE1MDZmZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZnJhbWV3b3JrL21lbWxlYWstdGVzdC1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L21lbWxlYWsvY29tbW9uL0Fic3RyYWN0TWVtb3J5TGVha1NpbXBsZVRlc3QuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QubWVtbGVhay5jb21tb247CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5sYW5nLm1hbmFnZW1lbnQuTWFuYWdlbWVudEZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworCisvKioKKyAqIEFuIGFic3RyYWN0IHRlc3QgY2xhc3MgdGhhdCBhZGRzIHN1cHBvcnQgZm9yIGR1bXAgaGVhcCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0ZXN0IGV4ZWN1dGlvbi4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBBYnN0cmFjdE1lbW9yeUxlYWtTaW1wbGVUZXN0IHsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBkdW1wVGhlSGVhcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgaGVhcER1bXBQYXRoID0gU3lzdGVtLmdldFByb3BlcnR5KE1lbW9yeUxlYWtVdGlscy5KRVJTRVlfQ09ORklHX1RFU1RfTUVNTEVBS19IRUFQX0RVTVBfUEFUSCk7CisgICAgICAgIFN0cmluZyBoZWFwRHVtcEZpbGUgPSAiamF2YV9zdGFydF9waWQiICsgZ3Vlc3NQaWQoKSArICIuaHByb2YiOworICAgICAgICBpZiAoaGVhcER1bXBQYXRoICE9IG51bGwpIHsKKyAgICAgICAgICAgIGhlYXBEdW1wRmlsZSA9IGhlYXBEdW1wUGF0aCArIEZpbGUuc2VwYXJhdG9yICsgaGVhcER1bXBGaWxlOworICAgICAgICB9CisgICAgICAgIE1lbW9yeUxlYWtVdGlscy5kdW1wSGVhcChoZWFwRHVtcEZpbGUsIHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGd1ZXNzUGlkKCkgeworICAgICAgICBTdHJpbmcgbmFtZSA9IE1hbmFnZW1lbnRGYWN0b3J5LmdldFJ1bnRpbWVNWEJlYW4oKS5nZXROYW1lKCk7CisKKyAgICAgICAgaWYgKG5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9CisgICAgICAgIGlmIChuYW1lLmNvbnRhaW5zKCJAIikpIHsKKyAgICAgICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cmluZygwLCBuYW1lLmluZGV4T2YoIkAiKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5hbWUudHJpbSgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvbWVtbGVhay10ZXN0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvbWVtbGVhay9jb21tb24vQWJzdHJhY3RNZW1vcnlMZWFrV2ViQXBwVGVzdC5qYXZhIGIvdGVzdC1mcmFtZXdvcmsvbWVtbGVhay10ZXN0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvbWVtbGVhay9jb21tb24vQWJzdHJhY3RNZW1vcnlMZWFrV2ViQXBwVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjNjg0ODAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay9tZW1sZWFrLXRlc3QtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9tZW1sZWFrL2NvbW1vbi9BYnN0cmFjdE1lbW9yeUxlYWtXZWJBcHBUZXN0LmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0Lm1lbWxlYWsuY29tbW9uOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5EZXBsb3ltZW50Q29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CisKKy8qKgorICogQWRkcyBzdXBwb3J0IGZvciB3ZWIgYXBwbGljYXRpb24gdGVzdGluZyBhbmQgbWVtb3J5IGxlYWsgZGV0ZWN0aW9uIGluIHRhcmdldCBKVk0uCisgKgorICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYSBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQWJzdHJhY3RNZW1vcnlMZWFrV2ViQXBwVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFWFRfUk9PVCA9IFN5c3RlbS5nZXRQcm9wZXJ0eShNZW1vcnlMZWFrVXRpbHMuSkVSU0VZX0NPTkZJR19URVNUX0NPTlRBSU5FUl9DT05URVhUX1JPT1QsICIvIik7CisKKyAgICAvKioKKyAgICAgKiBWZXJpZmllcyBubyBPdXRPZk1lbW9yeUVycm9yIGlzIHByZXNlbnQgaW4gYXNzb2NpYXRlZCBsb2cgZmlsZS48YnIvPiBUaGUgbW90aXZhdGlvbiBpcyB0byBoYXZlIHRoZSBPdXRPZk1lbW9yeSBlcnJvcgorICAgICAqIGluY2x1ZGVkIGluIHRoZSBKVW5pdCB0ZXN0IHJlc3VsdCBpZiBwb3NzaWJsZS48YnIvPiBUaGUgcHJvYmxlbSBpcyB0aGF0IGV2ZW4gb2YgT3V0T2ZNZW1vcnlFcnJvciBvY2N1cnJlZCwgaXQgbWF5IG5vdCBiZQorICAgICAqIGxvZ2dlZCB5ZXQuIFRoZXJlZm9yZSB0aGUgbG9nIGZpbGUgbmVlZHMgdG8gYmUgaW5zcGVjdGVkIHdoZW4gdGhlIEpWTSBpcyBzaHV0IGRvd24gYW5kIGFsbCBpdHMgcmVzb3VyY2VzIGFyZSBmbHVzaGVkIGFuZAorICAgICAqIGNsb3NlZC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24KKyAgICAgKi8KKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCB2ZXJpZnlOb091dE9mTWVtb3J5T2NjdXJyZWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBNZW1vcnlMZWFrVXRpbHMudmVyaWZ5Tm9PdXRPZk1lbW9yeU9jY3VycmVkKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIERlcGxveW1lbnRDb250ZXh0IGNvbmZpZ3VyZURlcGxveW1lbnQoKSB7CisgICAgICAgIHJldHVybiBEZXBsb3ltZW50Q29udGV4dC5idWlsZGVyKGNvbmZpZ3VyZSgpKS5jb250ZXh0UGF0aChDT05URVhUX1JPT1QpLmJ1aWxkKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnCisgICAgICAgICAgICAgICAgLnByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuQ09OTkVDVF9USU1FT1VULCAzMDAwMCkKKyAgICAgICAgICAgICAgICAucHJvcGVydHkoQ2xpZW50UHJvcGVydGllcy5SRUFEX1RJTUVPVVQsIDMwMDAwKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL21lbWxlYWstdGVzdC1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L21lbWxlYWsvY29tbW9uL01lbW9yeUxlYWtTdWNjZWVkaW5nVGltZW91dC5qYXZhIGIvdGVzdC1mcmFtZXdvcmsvbWVtbGVhay10ZXN0LWNvbW1vbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvbWVtbGVhay9jb21tb24vTWVtb3J5TGVha1N1Y2NlZWRpbmdUaW1lb3V0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM2NTVlNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZnJhbWV3b3JrL21lbWxlYWstdGVzdC1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L21lbWxlYWsvY29tbW9uL01lbW9yeUxlYWtTdWNjZWVkaW5nVGltZW91dC5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5tZW1sZWFrLmNvbW1vbjsKKworaW1wb3J0IG9yZy5qdW5pdC5pbnRlcm5hbC5ydW5uZXJzLnN0YXRlbWVudHMuRmFpbE9uVGltZW91dDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGltZW91dDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLkRlc2NyaXB0aW9uOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLm1vZGVsLlN0YXRlbWVudDsKKworLyoqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBNZW1vcnlMZWFrU3VjY2VlZGluZ1RpbWVvdXQgZXh0ZW5kcyBUaW1lb3V0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1RJTUVPVVRfTUlMTElTID0gMzAwXzAwMDsKKyAgICBwcml2YXRlIGludCBtaWxsaXM7CisKKyAgICBwdWJsaWMgTWVtb3J5TGVha1N1Y2NlZWRpbmdUaW1lb3V0KCkgeworICAgICAgICB0aGlzKERFRkFVTFRfVElNRU9VVF9NSUxMSVMpOworICAgIH0KKworICAgIHB1YmxpYyBNZW1vcnlMZWFrU3VjY2VlZGluZ1RpbWVvdXQoZmluYWwgaW50IGRlZmF1bHRNaWxsaXNUaW1lb3V0KSB7CisgICAgICAgIHN1cGVyKGRlZmF1bHRNaWxsaXNUaW1lb3V0KTsKKworICAgICAgICB0aGlzLm1pbGxpcyA9IEludGVnZXIuZ2V0SW50ZWdlcihNZW1vcnlMZWFrVXRpbHMuSkVSU0VZX0NPTkZJR19URVNUX01FTUxFQUtfVElNRU9VVCwgZGVmYXVsdE1pbGxpc1RpbWVvdXQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdGF0ZW1lbnQgYXBwbHkoZmluYWwgU3RhdGVtZW50IGJhc2UsIGZpbmFsIERlc2NyaXB0aW9uIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIHJldHVybiBuZXcgRmFpbE9uVGltZW91dChiYXNlLCBtaWxsaXMpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgZXZhbHVhdGUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzdXBlci5ldmFsdWF0ZSgpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0aHJvd2FibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRocm93YWJsZS5nZXRNZXNzYWdlKCkuc3RhcnRzV2l0aCgidGVzdCB0aW1lZCBvdXQgYWZ0ZXIiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTWVtb3J5TGVha1V0aWxzLnZlcmlmeU5vT3V0T2ZNZW1vcnlPY2N1cnJlZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUZXN0IHRpbWVkIG91dCBhZnRlciAiICsgbWlsbGlzICsgIiBtcy4gU3VjY2Vzc2Z1bGx5IGVuZGluZy4iKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHRocm93YWJsZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0LWZyYW1ld29yay9tZW1sZWFrLXRlc3QtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9tZW1sZWFrL2NvbW1vbi9NZW1vcnlMZWFrVXRpbHMuamF2YSBiL3Rlc3QtZnJhbWV3b3JrL21lbWxlYWstdGVzdC1jb21tb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L21lbWxlYWsvY29tbW9uL01lbW9yeUxlYWtVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhZWJmYzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay9tZW1sZWFrLXRlc3QtY29tbW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9tZW1sZWFrL2NvbW1vbi9NZW1vcnlMZWFrVXRpbHMuamF2YQpAQCAtMCwwICsxLDE2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0Lm1lbWxlYWsuY29tbW9uOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLm1hbmFnZW1lbnQuTWFuYWdlbWVudEZhY3Rvcnk7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OworaW1wb3J0IGphdmEubmlvLmZpbGUuUGF0aHM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5pby5GaWxlczsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5pby5MaW5lUHJvY2Vzc29yOworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgZm9yIG1lbW9yeSBsZWFrIHRlc3QgaW5mcmFzdHJ1Y3R1cmUuCisgKgorICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYSBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgTWVtb3J5TGVha1V0aWxzIHsKKworICAgIC8qKgorICAgICAqIFRoZSBsb2cgZmlsZSB3aGVyZSB0aGUgb3V0cHV0IChzdGRvdXQvc3RkZXJyKSBvZiBjb250YWluZXIgaXMgbG9jYXRlZC4KKyAgICAgKiA8cC8+CisgICAgICogRm9yIGluc3RhbmNlLCB0aGlzIGZpbGUgaXMgdXNlZCBmb3IgZGV0ZWN0aW9uIG9mIHtAbGluayBPdXRPZk1lbW9yeUVycm9yfSBleGNlcHRpb24gcmVjb3Jkcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKRVJTRVlfQ09ORklHX1RFU1RfQ09OVEFJTkVSX0xPR0ZJTEUgPSAiamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5sb2dmaWxlIjsKKworICAgIC8qKgorICAgICAqIFRoZSBtZW1vcnkgbGVhayB0aW1lb3V0IGRlbm90ZXMgc3VjY2Vzc2Z1bCBlbmQgb2YgdGhlIG1lbW9yeSBsZWFrIHRlc3QuIFRoYXQgaXMsIGlmIHRoZSBtZW1vcnkgbGVhayBkaWRuJ3Qgb2NjdXIgZHVyaW5nIHRoZQorICAgICAqIHNwZWNpZmllZCB0aW1lb3V0LCB0aGUgdGVzdCBzdWNjZXNzZnVsbHkgZmluaXNoZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkVSU0VZX0NPTkZJR19URVNUX01FTUxFQUtfVElNRU9VVCA9ICJqZXJzZXkuY29uZmlnLnRlc3QubWVtbGVhay50aW1lb3V0IjsKKworICAgIC8qKgorICAgICAqIFRoZSBjb250ZXh0IHJvb3Qgd2hlcmUgdGhlIGRlcGxveWVkIGFwcGxpY2F0aW9uIHdpbGwgYmUgYWNjZXNzaWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBKRVJTRVlfQ09ORklHX1RFU1RfQ09OVEFJTkVSX0NPTlRFWFRfUk9PVCA9ICJqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmNvbnRleHRSb290IjsKKworICAgIC8qKgorICAgICAqIFRoZSBwYXRoIHdoZXJlIHRvIGNyZWF0ZSBoZWFwIGR1bXAgZmlsZXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkVSU0VZX0NPTkZJR19URVNUX01FTUxFQUtfSEVBUF9EVU1QX1BBVEggPSAiamVyc2V5LmNvbmZpZy50ZXN0Lm1lbWxlYWsuaGVhcER1bXBQYXRoIjsKKworICAgIHByaXZhdGUgTWVtb3J5TGVha1V0aWxzKCkgeworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gUEFUVEVSTiA9IFBhdHRlcm4uY29tcGlsZSgiLipqYXZhXFwubGFuZ1xcLk91dE9mTWVtb3J5RXJyb3IuKiIpOworCisgICAgLyoqCisgICAgICogU2NhbnMgdGhlIGZpbGUgZGVub3RlZCBieSB7QGxpbmsgI0pFUlNFWV9DT05GSUdfVEVTVF9DT05UQUlORVJfTE9HRklMRX0gZm9yIHtAbGluayBPdXRPZk1lbW9yeUVycm9yfSByZWNvcmRzLgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAgICAgICAgICAgSW4gY2FzZSBvZiBJL08gZXJyb3IuCisgICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gSW4gY2FzZSB0aGUge0BsaW5rIE91dE9mTWVtb3J5RXJyb3J9IHJlY29yZCB3YXMgZm91bmQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHZlcmlmeU5vT3V0T2ZNZW1vcnlPY2N1cnJlZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGxvZ0ZpbGVOYW1lID0gU3lzdGVtLmdldFByb3BlcnR5KEpFUlNFWV9DT05GSUdfVEVTVF9DT05UQUlORVJfTE9HRklMRSk7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVmVyaWZ5aW5nIHdoZXRoZXIgT3V0T2ZNZW1vcnlFcnJvciBvY2N1cnJlZCBpbiBsb2cgZmlsZTogIiArIGxvZ0ZpbGVOYW1lKTsKKworICAgICAgICBpZiAobG9nRmlsZU5hbWUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGZpbmFsIEZpbGUgbG9nRmlsZSA9IG5ldyBGaWxlKGxvZ0ZpbGVOYW1lKTsKKyAgICAgICAgaWYgKCFsb2dGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gbGluZXMgPSBGaWxlcy5yZWFkTGluZXMobG9nRmlsZSwgQ2hhcnNldC5kZWZhdWx0Q2hhcnNldCgpLCBuZXcgTGluZVByb2Nlc3NvcjxMaXN0PFN0cmluZz4+KCkgeworICAgICAgICAgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbWF0Y2hlZExpbmVzID0gbmV3IExpbmtlZExpc3Q8PigpOworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIHByb2Nlc3NMaW5lKGZpbmFsIFN0cmluZyBsaW5lKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIGlmIChQQVRURVJOLm1hdGNoZXIobGluZSkubWF0Y2hlcygpKSB7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoZWRMaW5lcy5hZGQobGluZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0UmVzdWx0KCkgeworICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaGVkTGluZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIGlmIChsaW5lcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiT3V0T2ZNZW1vcnlFcnJvciBkZXRlY3RlZCBpbiAnIiArIGxvZ0ZpbGVOYW1lICsgIic6ICIgKyBBcnJheXMudG9TdHJpbmcobGluZXMudG9BcnJheSgpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGUgbmFtZSBvZiB0aGUgSG90U3BvdCBEaWFnbm9zdGljIE1YQmVhbgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIT1RTUE9UX0JFQU5fTkFNRSA9ICJjb20uc3VuLm1hbmFnZW1lbnQ6dHlwZT1Ib3RTcG90RGlhZ25vc3RpYyI7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY2xhc3MgbmFtZSBvZiBIb3RTcG90IERpYWdub3N0aWMgTVhCZWFuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhPVF9TUE9UX0RJQUdOT1NUSUNfTVhCRUFOX0NMQVNTTkFNRSA9ICJjb20uc3VuLm1hbmFnZW1lbnQuSG90U3BvdERpYWdub3N0aWNNWEJlYW4iOworCisgICAgLyoqCisgICAgICogSG90c3BvdCBkaWFnbm9zdGljIE1CZWFuIHNpbmdsZXRvbgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIE9iamVjdCBob3RTcG90RGlhZ25vc3RpY01CZWFuOworCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgTWV0aG9kIGR1bXBIZWFwTWV0aG9kOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgaGVhcCBkdW1wIGludG8gYSBnaXZlbiBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtIGZpbGVOYW1lIG5hbWUgb2YgdGhlIGhlYXAgZHVtcCBmaWxlCisgICAgICogQHBhcmFtIGxpdmUgICAgIHdoZXRoZXIgdG8gZHVtcCBvbmx5IHRoZSBsaXZlIG9iamVjdHMKKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBkdW1wSGVhcChTdHJpbmcgZmlsZU5hbWUsIGJvb2xlYW4gbGl2ZSkKKyAgICAgICAgICAgIHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uLCBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uLCBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLCBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgY29uZGl0aW9uYWxseUluaXRIb3RTcG90RGlhZ25vc3RpY01YQmVhbigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgamF2YS5uaW8uZmlsZS5GaWxlcy5kZWxldGVJZkV4aXN0cyhQYXRocy5nZXQoZmlsZU5hbWUpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZG8gbm90aGluZyBhbmQgdHJ5IHRvIGdvIGZ1cnRoZXIKKyAgICAgICAgfQorICAgICAgICBkdW1wSGVhcE1ldGhvZC5pbnZva2UoaG90U3BvdERpYWdub3N0aWNNQmVhbiwgZmlsZU5hbWUsIGxpdmUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgdGhlIEhvdFNwb3QgZGlhZ25vc3RpYyBNQmVhbgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY29uZGl0aW9uYWxseUluaXRIb3RTcG90RGlhZ25vc3RpY01YQmVhbigpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIENsYXNzTm90Rm91bmRFeGNlcHRpb24sIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChob3RTcG90RGlhZ25vc3RpY01CZWFuID09IG51bGwpIHsKKyAgICAgICAgICAgIHN5bmNocm9uaXplZCAoTWVtb3J5TGVha1V0aWxzLmNsYXNzKSB7CisgICAgICAgICAgICAgICAgaWYgKGhvdFNwb3REaWFnbm9zdGljTUJlYW4gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBDbGFzcyBjbGF6eiA9IENsYXNzLmZvck5hbWUoSE9UX1NQT1RfRElBR05PU1RJQ19NWEJFQU5fQ0xBU1NOQU1FKTsKKyAgICAgICAgICAgICAgICAgICAgTUJlYW5TZXJ2ZXIgc2VydmVyID0gTWFuYWdlbWVudEZhY3RvcnkuZ2V0UGxhdGZvcm1NQmVhblNlcnZlcigpOworICAgICAgICAgICAgICAgICAgICBob3RTcG90RGlhZ25vc3RpY01CZWFuID0gTWFuYWdlbWVudEZhY3RvcnkubmV3UGxhdGZvcm1NWEJlYW5Qcm94eShzZXJ2ZXIsIEhPVFNQT1RfQkVBTl9OQU1FLCBjbGF6eik7CisgICAgICAgICAgICAgICAgICAgIGR1bXBIZWFwTWV0aG9kID0gY2xhenouZ2V0TWV0aG9kKCJkdW1wSGVhcCIsIFN0cmluZy5jbGFzcywgYm9vbGVhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvcG9tLnhtbCBiL3Rlc3QtZnJhbWV3b3JrL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdkMmZhNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZnJhbWV3b3JrL3BvbS54bWwKQEAgLTAsMCArMSw1NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXk8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yazwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3QtZnJhbWV3b3JrPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPkplcnNleSB0ZXN0IGZyYW1ld29yayB1bWJyZWxsYSBwcm9qZWN0PC9kZXNjcmlwdGlvbj4KKworICAgIDxtb2R1bGVzPgorICAgICAgICA8bW9kdWxlPmNvcmU8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5wcm92aWRlcnM8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT51dGlsPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+bWF2ZW48L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5tZW1sZWFrLXRlc3QtY29tbW9uPC9tb2R1bGU+CisgICAgPC9tb2R1bGVzPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWhrMjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL2J1bmRsZS9wb20ueG1sIGIvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL2J1bmRsZS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlNDI4NDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvYnVuZGxlL3BvbS54bWwKQEAgLTAsMCArMSw3MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItYnVuZGxlPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgVGVzdCBGcmFtZXdvcmsgUHJvdmlkZXJzIEJ1bmRsZTwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1ncml6emx5MjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1pbm1lbW9yeTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1qZGstaHR0cDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1zaW1wbGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItamV0dHk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItbmV0dHk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL3Byb3ZpZGVycy9leHRlcm5hbC9wb20ueG1sIGIvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL2V4dGVybmFsL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNmM2IyMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZnJhbWV3b3JrL3Byb3ZpZGVycy9leHRlcm5hbC9wb20ueG1sCkBAIC0wLDAgKzEsNTIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPkplcnNleSBUZXN0IEZyYW1ld29yayAtIEV4dGVybmFsIGNvbnRhaW5lcjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXNlcnZlcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY2xpZW50PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvZXh0ZXJuYWwvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L2V4dGVybmFsL0V4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkuamF2YSBiL3Rlc3QtZnJhbWV3b3JrL3Byb3ZpZGVycy9leHRlcm5hbC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvZXh0ZXJuYWwvRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiN2E3NzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvZXh0ZXJuYWwvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L2V4dGVybmFsL0V4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUHJvcGVydGllc0hlbHBlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkRlcGxveW1lbnRDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuU2VydmxldERlcGxveW1lbnRDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKKy8qKgorICogQSBXZWItYmFzZWQgdGVzdCBjb250YWluZXIgZmFjdG9yeSBmb3IgY3JlYXRpbmcgdGVzdCBjb250YWluZXIgaW5zdGFuY2VzCisgKiB3aGVuIHRoZSBXZWIgYXBwbGljYXRpb24gaXMgaW5kZXBlbmRlbnRseSBkZXBsb3llZCBpbiBhIHNlcGFyYXRlIEpWTSB0byB0aGF0CisgKiBvZiB0aGUgdGVzdHMuIEZvciBleGFtcGxlLCB0aGUgYXBwbGljYXRpb24gbWF5IGJlIGRlcGxveWVkIHRvIHRoZQorICogR2xhc3NmaXNoIHYyIG9yIHYzIGFwcGxpY2F0aW9uIHNlcnZlci4KKyAqIDxQPgorICogSWYgeW91IHdvdWxkIGxpa2UgdG8gcnVuIHlvdXIgdGVzdHMgb24gYSBzdGFnaW5nIHNlcnZlciwganVzdCBzZXQgdGhlIG1hY2hpbmUncworICogSVAgYWRkcmVzcyBvciBmdWxseS1xdWFsaWZpZWQgZG9tYWluIG5hbWUgdG8gdGhlIFN5c3RlbSBQcm9wZXJ0eSA8ST5qZXJzZXkudGVzdC5ob3N0PC9JPi4KKyAqCisgKiBAYXV0aG9yIFNyaW5pdmFzIEJoaW1pc2V0dHkKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5IGltcGxlbWVudHMgVGVzdENvbnRhaW5lckZhY3RvcnkgeworCisgICAgLyoqCisgICAgICogU3BlY2lmaWVzIHRoZSBhY3RpdmUgdGVzdCBjb250YWluZXIgaG9zdCBhZGRyZXNzIHdoZXJlIGFwcGxpY2F0aW9uIGlzIGRlcGxveWVkLgorICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgcHJvcGVydHkgbXVzdCBiZSBhIHZhbGlkIGhvc3QgbmFtZSBvciBJUCBhZGRyZXNzLgorICAgICAqIDxwIC8+CisgICAgICogVGhlcmUgaXMgbm8gZGVmYXVsdCB2YWx1ZS4KKyAgICAgKiA8cCAvPgorICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb25maWd1cmF0aW9uIHByb3BlcnR5IGlzIDx0dD57QHZhbHVlfTwvdHQ+LgorICAgICAqLworICAgIC8vIFRPRE8gcmVuYW1lIHRvIGplcnNleS5jb25maWcudGVzdC5leHRlcm5hbC5jb250YWluZXIuaG9zdAorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEpFUlNFWV9URVNUX0hPU1QgPSAiamVyc2V5LnRlc3QuaG9zdCI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVGVzdENvbnRhaW5lciBjcmVhdGUoZmluYWwgVVJJIGJhc2VVcmksIGZpbmFsIERlcGxveW1lbnRDb250ZXh0IGNvbnRleHQpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lcihnZXRCYXNlVVJJKGJhc2VVcmkpLCBjb250ZXh0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIFVSSSBnZXRCYXNlVVJJKGZpbmFsIFVSSSBiYXNlVXJpKSB7CisgICAgICAgIFN0cmluZyBzdGFnaW5nSG9zdE5hbWUgPSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChQcm9wZXJ0aWVzSGVscGVyLmdldFN5c3RlbVByb3BlcnR5KEpFUlNFWV9URVNUX0hPU1QpKTsKKyAgICAgICAgaWYgKHN0YWdpbmdIb3N0TmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gVXJpQnVpbGRlci5mcm9tVXJpKGJhc2VVcmkpLmhvc3Qoc3RhZ2luZ0hvc3ROYW1lKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGJhc2VVcmk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2xhc3Mgd2hpY2ggaGVscHMgcnVubmluZyB0ZXN0cyBvbiBhbiBleHRlcm5hbCBjb250YWluZXIuIEl0IGFzc3VtZXMgdGhhdAorICAgICAqIHRoZSBjb250YWluZXIgaXMgc3RhcnRlZC9zdG9wcGVkIGV4cGxpY2l0bHkgYW5kIGFsc28gdGhhdCB0aGUgYXBwbGljYXRpb24gaXMKKyAgICAgKiBwcmUtZGVwbG95ZWQuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRXh0ZXJuYWxUZXN0Q29udGFpbmVyIGltcGxlbWVudHMgVGVzdENvbnRhaW5lciB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEV4dGVybmFsVGVzdENvbnRhaW5lci5jbGFzcy5nZXROYW1lKCkpOworCisgICAgICAgIHByaXZhdGUgZmluYWwgVVJJIGJhc2VVcmk7CisKKyAgICAgICAgcHJpdmF0ZSBFeHRlcm5hbFRlc3RDb250YWluZXIoZmluYWwgVVJJIGJhc2VVcmksIGZpbmFsIERlcGxveW1lbnRDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIGZpbmFsIFVyaUJ1aWxkZXIgdXJpQnVpbGRlciA9IFVyaUJ1aWxkZXIuZnJvbVVyaShiYXNlVXJpKS5wYXRoKGNvbnRleHQuZ2V0Q29udGV4dFBhdGgoKSk7CisgICAgICAgICAgICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIFNlcnZsZXREZXBsb3ltZW50Q29udGV4dCkgeworICAgICAgICAgICAgICAgIHVyaUJ1aWxkZXIucGF0aCgoKFNlcnZsZXREZXBsb3ltZW50Q29udGV4dCkgY29udGV4dCkuZ2V0U2VydmxldFBhdGgoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMuYmFzZVVyaSA9IHVyaUJ1aWxkZXIuYnVpbGQoKTsKKworICAgICAgICAgICAgaWYgKExPR0dFUi5pc0xvZ2dhYmxlKExldmVsLklORk8pKSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmluZm8oIkNyZWF0aW5nIEV4dGVybmFsVGVzdENvbnRhaW5lciBjb25maWd1cmVkIGF0IHRoZSBiYXNlIFVSSSAiICsgdGhpcy5iYXNlVXJpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ2xpZW50Q29uZmlnIGdldENsaWVudENvbmZpZygpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBVUkkgZ2V0QmFzZVVyaSgpIHsKKyAgICAgICAgICAgIHJldHVybiBiYXNlVXJpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgeworICAgICAgICAgICAgLy8gZG8gbm90aGluZworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgICAgICAgICAvLyBkbyBub3RoaW5nCisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL2V4dGVybmFsL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9leHRlcm5hbC9wYWNrYWdlLWluZm8uamF2YSBiL3Rlc3QtZnJhbWV3b3JrL3Byb3ZpZGVycy9leHRlcm5hbC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvZXh0ZXJuYWwvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY4ZmJkNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZnJhbWV3b3JrL3Byb3ZpZGVycy9leHRlcm5hbC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvZXh0ZXJuYWwvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoqCisgKiBKZXJzZXkgdGVzdCBmcmFtZXdvcmsgZXh0ZXJuYWwgY29udGFpbmVyIHByb3ZpZGVyIGNsYXNzZXMuCisgKi8KK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbDsKZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL3Byb3ZpZGVycy9ncml6emx5Mi9wb20ueG1sIGIvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL2dyaXp6bHkyL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJlNDhhMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZnJhbWV3b3JrL3Byb3ZpZGVycy9ncml6emx5Mi9wb20ueG1sCkBAIC0wLDAgKzEsNTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWdyaXp6bHkyPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWdyaXp6bHkyPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPkplcnNleSBUZXN0IEZyYW1ld29yayAtIEdyaXp6bHkyIGNvbnRhaW5lcjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7c2VydmxldDQudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1ncml6emx5Mi1odHRwPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItZ3JpenpseTItc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL2dyaXp6bHkyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9ncml6emx5L0dyaXp6bHlUZXN0Q29udGFpbmVyRmFjdG9yeS5qYXZhIGIvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL2dyaXp6bHkyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9ncml6emx5L0dyaXp6bHlUZXN0Q29udGFpbmVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZjJkYTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvZ3JpenpseTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L2dyaXp6bHkvR3JpenpseVRlc3RDb250YWluZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5ncml6emx5OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5Mi5odHRwc2VydmVyLkdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkRlcGxveW1lbnRDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0SGVscGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5ncml6emx5Lmh0dHAuc2VydmVyLkh0dHBTZXJ2ZXI7CisKKy8qKgorICogSmVyc2V5IHRlc3QgZnJhbWV3b3JrIGNvbnRhaW5lciBmYWN0b3J5IGltcGxlbWVudGF0aW9uIGJhc2VkIG9uIEdyaXp6bHkgMi54IEhUVFAgc2VydmVyLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBHcml6emx5VGVzdENvbnRhaW5lckZhY3RvcnkgaW1wbGVtZW50cyBUZXN0Q29udGFpbmVyRmFjdG9yeSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBHcml6emx5VGVzdENvbnRhaW5lciBpbXBsZW1lbnRzIFRlc3RDb250YWluZXIgeworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEdyaXp6bHlUZXN0Q29udGFpbmVyLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICAgICAgcHJpdmF0ZSBVUkkgYmFzZVVyaTsKKworICAgICAgICBwcml2YXRlIGZpbmFsIEh0dHBTZXJ2ZXIgc2VydmVyOworCisgICAgICAgIHByaXZhdGUgR3JpenpseVRlc3RDb250YWluZXIoZmluYWwgVVJJIGJhc2VVcmksIGZpbmFsIERlcGxveW1lbnRDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHRoaXMuYmFzZVVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaShiYXNlVXJpKS5wYXRoKGNvbnRleHQuZ2V0Q29udGV4dFBhdGgoKSkuYnVpbGQoKTsKKworICAgICAgICAgICAgaWYgKExPR0dFUi5pc0xvZ2dhYmxlKExldmVsLklORk8pKSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmluZm8oIkNyZWF0aW5nIEdyaXp6bHlUZXN0Q29udGFpbmVyIGNvbmZpZ3VyZWQgYXQgdGhlIGJhc2UgVVJJICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgVGVzdEhlbHBlci56ZXJvUG9ydFRvQXZhaWxhYmxlUG9ydChiYXNlVXJpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMuc2VydmVyID0gR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5LmNyZWF0ZUh0dHBTZXJ2ZXIodGhpcy5iYXNlVXJpLCBjb250ZXh0LmdldFJlc291cmNlQ29uZmlnKCksIGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ2xpZW50Q29uZmlnIGdldENsaWVudENvbmZpZygpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBVUkkgZ2V0QmFzZVVyaSgpIHsKKyAgICAgICAgICAgIHJldHVybiBiYXNlVXJpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgeworICAgICAgICAgICAgaWYgKHNlcnZlci5pc1N0YXJ0ZWQoKSkgeworICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuV0FSTklORywgIklnbm9yaW5nIHN0YXJ0IHJlcXVlc3QgLSBHcml6emx5VGVzdENvbnRhaW5lciBpcyBhbHJlYWR5IHN0YXJ0ZWQuIik7CisKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5GSU5FLCAiU3RhcnRpbmcgR3JpenpseVRlc3RDb250YWluZXIuLi4iKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBzZXJ2ZXIuc3RhcnQoKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoYmFzZVVyaS5nZXRQb3J0KCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYmFzZVVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaShiYXNlVXJpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucG9ydChzZXJ2ZXIuZ2V0TGlzdGVuZXIoImdyaXp6bHkiKS5nZXRQb3J0KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5JTkZPLCAiU3RhcnRlZCBHcml6emx5VGVzdENvbnRhaW5lciBhdCB0aGUgYmFzZSBVUkkgIiArIGJhc2VVcmkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gaW9lKSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uKGlvZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgICAgICAgICBpZiAoc2VydmVyLmlzU3RhcnRlZCgpKSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5GSU5FLCAiU3RvcHBpbmcgR3JpenpseVRlc3RDb250YWluZXIuLi4iKTsKKyAgICAgICAgICAgICAgICB0aGlzLnNlcnZlci5zaHV0ZG93bk5vdygpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLldBUk5JTkcsICJJZ25vcmluZyBzdG9wIHJlcXVlc3QgLSBHcml6emx5VGVzdENvbnRhaW5lciBpcyBhbHJlYWR5IHN0b3BwZWQuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVGVzdENvbnRhaW5lciBjcmVhdGUoZmluYWwgVVJJIGJhc2VVcmksIGZpbmFsIERlcGxveW1lbnRDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBHcml6emx5VGVzdENvbnRhaW5lcihiYXNlVXJpLCBjb250ZXh0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvZ3JpenpseTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L2dyaXp6bHkvR3JpenpseVdlYlRlc3RDb250YWluZXJGYWN0b3J5LmphdmEgYi90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvZ3JpenpseTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L2dyaXp6bHkvR3JpenpseVdlYlRlc3RDb250YWluZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNkNjU0YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZnJhbWV3b3JrL3Byb3ZpZGVycy9ncml6emx5Mi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvZ3JpenpseS9Hcml6emx5V2ViVGVzdENvbnRhaW5lckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmdyaXp6bHk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKK2ltcG9ydCBqYXZhLnV0aWwuRXZlbnRMaXN0ZW5lcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkRpc3BhdGNoZXJUeXBlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyUmVnaXN0cmF0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlZ2lzdHJhdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkyLmh0dHBzZXJ2ZXIuR3JpenpseUh0dHBDb250YWluZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseTIuaHR0cHNlcnZlci5Hcml6emx5SHR0cFNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5EZXBsb3ltZW50Q29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlNlcnZsZXREZXBsb3ltZW50Q29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdEhlbHBlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guZ3JpenpseS5odHRwLnNlcnZlci5IdHRwU2VydmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guZ3JpenpseS5zZXJ2bGV0LldlYmFwcENvbnRleHQ7CisKKy8qKgorICogQSBTZXJ2bGV0LWJhc2VkIHRlc3QgY29udGFpbmVyIGZhY3RvcnkgZm9yIGNyZWF0aW5nIHRlc3QgY29udGFpbmVyIGluc3RhbmNlcyB1c2luZyBHcml6emx5LgorICoKKyAqIEBhdXRob3IgU3Jpbml2YXMgQmhpbWlzZXR0eQorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBHcml6emx5V2ViVGVzdENvbnRhaW5lckZhY3RvcnkgaW1wbGVtZW50cyBUZXN0Q29udGFpbmVyRmFjdG9yeSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVGVzdENvbnRhaW5lciBjcmVhdGUoZmluYWwgVVJJIGJhc2VVcmksIGZpbmFsIERlcGxveW1lbnRDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgaWYgKCEoY29udGV4dCBpbnN0YW5jZW9mIFNlcnZsZXREZXBsb3ltZW50Q29udGV4dCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSBkZXBsb3ltZW50IGNvbnRleHQgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBTZXJ2bGV0RGVwbG95bWVudENvbnRleHQuIik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3IEdyaXp6bHlXZWJUZXN0Q29udGFpbmVyKGJhc2VVcmksIChTZXJ2bGV0RGVwbG95bWVudENvbnRleHQpIGNvbnRleHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgY2xhc3MgaGFzIG1ldGhvZHMgZm9yIGluc3RhbnRpYXRpbmcsIHN0YXJ0aW5nIGFuZCBzdG9wcGluZyB0aGUgR3JpenpseSAyIFdlYgorICAgICAqIFNlcnZlci4KKyAgICAgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBHcml6emx5V2ViVGVzdENvbnRhaW5lciBpbXBsZW1lbnRzIFRlc3RDb250YWluZXIgeworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEdyaXp6bHlXZWJUZXN0Q29udGFpbmVyLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICAgICAgcHJpdmF0ZSBVUkkgYmFzZVVyaTsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFNlcnZsZXREZXBsb3ltZW50Q29udGV4dCBkZXBsb3ltZW50Q29udGV4dDsKKworICAgICAgICBwcml2YXRlIEh0dHBTZXJ2ZXIgc2VydmVyOworCisgICAgICAgIHByaXZhdGUgR3JpenpseVdlYlRlc3RDb250YWluZXIoZmluYWwgVVJJIGJhc2VVcmksIGZpbmFsIFNlcnZsZXREZXBsb3ltZW50Q29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICB0aGlzLmJhc2VVcmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoYmFzZVVyaSkKKyAgICAgICAgICAgICAgICAgICAgLnBhdGgoY29udGV4dC5nZXRDb250ZXh0UGF0aCgpKQorICAgICAgICAgICAgICAgICAgICAucGF0aChjb250ZXh0LmdldFNlcnZsZXRQYXRoKCkpCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgICAgICBMT0dHRVIuaW5mbygiQ3JlYXRpbmcgR3JpenpseVdlYlRlc3RDb250YWluZXIgY29uZmlndXJlZCBhdCB0aGUgYmFzZSBVUkkgIgorICAgICAgICAgICAgICAgICAgICArIFRlc3RIZWxwZXIuemVyb1BvcnRUb0F2YWlsYWJsZVBvcnQoYmFzZVVyaSkpOworCisgICAgICAgICAgICB0aGlzLmRlcGxveW1lbnRDb250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgICAgIGluc3RhbnRpYXRlR3JpenpseVdlYlNlcnZlcigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDbGllbnRDb25maWcgZ2V0Q2xpZW50Q29uZmlnKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFVSSSBnZXRCYXNlVXJpKCkgeworICAgICAgICAgICAgcmV0dXJuIGJhc2VVcmk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc3RhcnQoKSB7CisgICAgICAgICAgICBpZiAoc2VydmVyLmlzU3RhcnRlZCgpKSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5XQVJOSU5HLCAiSWdub3Jpbmcgc3RhcnQgcmVxdWVzdCAtIEdyaXp6bHlXZWJUZXN0Q29udGFpbmVyIGlzIGFscmVhZHkgc3RhcnRlZC4iKTsKKworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLkZJTkUsICJTdGFydGluZyBHcml6emx5V2ViVGVzdENvbnRhaW5lci4uLiIpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHNlcnZlci5zdGFydCgpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChiYXNlVXJpLmdldFBvcnQoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlVXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKGJhc2VVcmkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wb3J0KHNlcnZlci5nZXRMaXN0ZW5lcigiZ3JpenpseSIpLmdldFBvcnQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLklORk8sICJTdGFydGVkIEdyaXp6bHlXZWJUZXN0Q29udGFpbmVyIGF0IHRoZSBiYXNlIFVSSSAiICsgYmFzZVVyaSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRlc3RDb250YWluZXJFeGNlcHRpb24oaW9lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgICAgIGlmIChzZXJ2ZXIuaXNTdGFydGVkKCkpIHsKKyAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLkZJTkUsICJTdG9wcGluZyBHcml6emx5V2ViVGVzdENvbnRhaW5lci4uLiIpOworICAgICAgICAgICAgICAgIHRoaXMuc2VydmVyLnNodXRkb3duTm93KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuV0FSTklORywgIklnbm9yaW5nIHN0b3AgcmVxdWVzdCAtIEdyaXp6bHlXZWJUZXN0Q29udGFpbmVyIGlzIGFscmVhZHkgc3RvcHBlZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBpbnN0YW50aWF0ZUdyaXp6bHlXZWJTZXJ2ZXIoKSB7CisKKyAgICAgICAgICAgIFN0cmluZyBjb250ZXh0UGF0aExvY2FsID0gZGVwbG95bWVudENvbnRleHQuZ2V0Q29udGV4dFBhdGgoKTsKKyAgICAgICAgICAgIGlmICghY29udGV4dFBhdGhMb2NhbC5pc0VtcHR5KCkgJiYgIWNvbnRleHRQYXRoTG9jYWwuc3RhcnRzV2l0aCgiLyIpKSB7CisgICAgICAgICAgICAgICAgY29udGV4dFBhdGhMb2NhbCA9ICIvIiArIGNvbnRleHRQYXRoTG9jYWw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyBzZXJ2bGV0UGF0aExvY2FsID0gZGVwbG95bWVudENvbnRleHQuZ2V0U2VydmxldFBhdGgoKTsKKyAgICAgICAgICAgIGlmICghc2VydmxldFBhdGhMb2NhbC5zdGFydHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgICAgICBzZXJ2bGV0UGF0aExvY2FsID0gIi8iICsgc2VydmxldFBhdGhMb2NhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzZXJ2bGV0UGF0aExvY2FsLmVuZHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgICAgICBzZXJ2bGV0UGF0aExvY2FsICs9ICIqIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc2VydmxldFBhdGhMb2NhbCArPSAiLyoiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBXZWJhcHBDb250ZXh0IGNvbnRleHQgPSBuZXcgV2ViYXBwQ29udGV4dCgiVGVzdENvbnRleHQiLCBjb250ZXh0UGF0aExvY2FsKTsKKworICAgICAgICAgICAgLy8gc2VydmxldCBjbGFzcyBhbmQgc2VydmxldCBpbnN0YW5jZSBjYW4gYmUgYm90aCBudWxsIG9yIG9uZSBvZiB0aGVtIGlzIHNwZWNpZmllZCBleGNsdXNpdmVseS4KKyAgICAgICAgICAgIGZpbmFsIEh0dHBTZXJ2bGV0IHNlcnZsZXRJbnN0YW5jZSA9IGRlcGxveW1lbnRDb250ZXh0LmdldFNlcnZsZXRJbnN0YW5jZSgpOworICAgICAgICAgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIEh0dHBTZXJ2bGV0PiBzZXJ2bGV0Q2xhc3MgPSBkZXBsb3ltZW50Q29udGV4dC5nZXRTZXJ2bGV0Q2xhc3MoKTsKKyAgICAgICAgICAgIGlmIChzZXJ2bGV0SW5zdGFuY2UgIT0gbnVsbCB8fCBzZXJ2bGV0Q2xhc3MgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFNlcnZsZXRSZWdpc3RyYXRpb24gcmVnaXN0cmF0aW9uOworICAgICAgICAgICAgICAgIGlmIChzZXJ2bGV0SW5zdGFuY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZWdpc3RyYXRpb24gPSBjb250ZXh0LmFkZFNlcnZsZXQoc2VydmxldEluc3RhbmNlLmdldENsYXNzKCkuZ2V0TmFtZSgpLCBzZXJ2bGV0SW5zdGFuY2UpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdHJhdGlvbiA9IGNvbnRleHQuYWRkU2VydmxldChzZXJ2bGV0Q2xhc3MuZ2V0TmFtZSgpLCBzZXJ2bGV0Q2xhc3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZWdpc3RyYXRpb24uc2V0SW5pdFBhcmFtZXRlcnMoZGVwbG95bWVudENvbnRleHQuZ2V0SW5pdFBhcmFtcygpKTsKKyAgICAgICAgICAgICAgICByZWdpc3RyYXRpb24uYWRkTWFwcGluZyhzZXJ2bGV0UGF0aExvY2FsKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yIChmaW5hbCBDbGFzczw/IGV4dGVuZHMgRXZlbnRMaXN0ZW5lcj4gZXZlbnRMaXN0ZW5lciA6IGRlcGxveW1lbnRDb250ZXh0LmdldExpc3RlbmVycygpKSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5hZGRMaXN0ZW5lcihldmVudExpc3RlbmVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBjb250ZXh0UGFyYW1zID0gZGVwbG95bWVudENvbnRleHQuZ2V0Q29udGV4dFBhcmFtcygpOworICAgICAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgY29udGV4dFBhcmFtTmFtZSA6IGNvbnRleHRQYXJhbXMua2V5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LmFkZENvbnRleHRJbml0UGFyYW1ldGVyKGNvbnRleHRQYXJhbU5hbWUsIGNvbnRleHRQYXJhbXMuZ2V0KGNvbnRleHRQYXJhbU5hbWUpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRmlsdGVyIHN1cHBvcnQKKyAgICAgICAgICAgIGlmIChkZXBsb3ltZW50Q29udGV4dC5nZXRGaWx0ZXJzKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoZmluYWwgU2VydmxldERlcGxveW1lbnRDb250ZXh0LkZpbHRlckRlc2NyaXB0b3IgZmlsdGVyRGVzY3JpcHRvciA6IGRlcGxveW1lbnRDb250ZXh0LmdldEZpbHRlcnMoKSkgeworCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIEZpbHRlclJlZ2lzdHJhdGlvbiBmaWx0ZXJSZWdpc3RyYXRpb24gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuYWRkRmlsdGVyKGZpbHRlckRlc2NyaXB0b3IuZ2V0RmlsdGVyTmFtZSgpLCBmaWx0ZXJEZXNjcmlwdG9yLmdldEZpbHRlckNsYXNzKCkpOworCisgICAgICAgICAgICAgICAgICAgIGZpbHRlclJlZ2lzdHJhdGlvbi5zZXRJbml0UGFyYW1ldGVycyhmaWx0ZXJEZXNjcmlwdG9yLmdldEluaXRQYXJhbXMoKSk7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlclJlZ2lzdHJhdGlvbi5hZGRNYXBwaW5nRm9yVXJsUGF0dGVybnMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JpenpseURpc3BhdGNoZXJUeXBlcyhmaWx0ZXJEZXNjcmlwdG9yLmdldERpc3BhdGNoZXJUeXBlcygpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZsZXRQYXRoTG9jYWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzZXJ2ZXIgPSBHcml6emx5SHR0cFNlcnZlckZhY3RvcnkuY3JlYXRlSHR0cFNlcnZlcihiYXNlVXJpLCAoR3JpenpseUh0dHBDb250YWluZXIpIG51bGwsIGZhbHNlLCBudWxsLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgY29udGV4dC5kZXBsb3koc2VydmVyKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFByb2Nlc3NpbmdFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVGVzdENvbnRhaW5lckV4Y2VwdGlvbihleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIEVudW1TZXQ8RGlzcGF0Y2hlclR5cGU+IGdyaXp6bHlEaXNwYXRjaGVyVHlwZXMoZmluYWwgU2V0PERpc3BhdGNoZXJUeXBlPiBkaXNwYXRjaGVyVHlwZXMpIHsKKyAgICAgICAgICAgIGZpbmFsIFNldDxEaXNwYXRjaGVyVHlwZT4gZ3JpenpseURpc3BhdGNoZXJUeXBlcyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgICAgIGZvciAoZmluYWwgamF2YXguc2VydmxldC5EaXNwYXRjaGVyVHlwZSBzZXJ2bGV0RGlzcGF0Y2hUeXBlIDogZGlzcGF0Y2hlclR5cGVzKSB7CisgICAgICAgICAgICAgICAgZ3JpenpseURpc3BhdGNoZXJUeXBlcy5hZGQoRGlzcGF0Y2hlclR5cGUudmFsdWVPZihzZXJ2bGV0RGlzcGF0Y2hUeXBlLm5hbWUoKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEVudW1TZXQuY29weU9mKGdyaXp6bHlEaXNwYXRjaGVyVHlwZXMpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL2dyaXp6bHkyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9ncml6emx5L3BhY2thZ2UtaW5mby5qYXZhIGIvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL2dyaXp6bHkyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9ncml6emx5L3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMGM5YmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvZ3JpenpseTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L2dyaXp6bHkvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoqCisgKiBKZXJzZXkgdGVzdCBmcmFtZXdvcmsgR3JpenpseSAyIGNvbnRhaW5lciBwcm92aWRlciBjbGFzc2VzLgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZ3JpenpseTsKZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL3Byb3ZpZGVycy9ncml6emx5Mi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3RvcnkgYi90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvZ3JpenpseTIvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwY2Y5ZmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvZ3JpenpseTIvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5CkBAIC0wLDAgKzEsMiBAQAorb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5ncml6emx5LkdyaXp6bHlXZWJUZXN0Q29udGFpbmVyRmFjdG9yeQorb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5ncml6emx5LkdyaXp6bHlUZXN0Q29udGFpbmVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL2dyaXp6bHkyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9ncml6emx5L0F2YWlsYWJsZVBvcnRHcml6emx5VGVzdC5qYXZhIGIvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL2dyaXp6bHkyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9ncml6emx5L0F2YWlsYWJsZVBvcnRHcml6emx5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NGRjODYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvZ3JpenpseTIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L2dyaXp6bHkvQXZhaWxhYmxlUG9ydEdyaXp6bHlUZXN0LmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmdyaXp6bHk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuRGVwbG95bWVudENvbnRleHQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMubm90OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIFRlc3RzIGZpbmRpbmcgYW4gYXZhaWxhYmxlIHBvcnQgZm9yIGNvbnRhaW5lci4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEF2YWlsYWJsZVBvcnRHcml6emx5VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgeworICAgICAgICByZXR1cm4gbmV3IEdyaXp6bHlUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBQYXRoKCJBdmFpbGFibGVQb3J0R3JpenpseVRlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFJlc291cmNlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiR0VUIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBEZXBsb3ltZW50Q29udGV4dCBjb25maWd1cmVEZXBsb3ltZW50KCkgeworICAgICAgICBmb3JjZVNldChUZXN0UHJvcGVydGllcy5DT05UQUlORVJfUE9SVCwgIjAiKTsKKworICAgICAgICByZXR1cm4gRGVwbG95bWVudENvbnRleHQuYnVpbGRlcihuZXcgUmVzb3VyY2VDb25maWcoVGVzdFJlc291cmNlLmNsYXNzKSkuYnVpbGQoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXQoKSB7CisgICAgICAgIGFzc2VydFRoYXQodGFyZ2V0KCkuZ2V0VXJpKCkuZ2V0UG9ydCgpLCBub3QoMCkpOworICAgICAgICBhc3NlcnRUaGF0KGdldEJhc2VVcmkoKS5nZXRQb3J0KCksIG5vdCgwKSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdCh0YXJnZXQoIkF2YWlsYWJsZVBvcnRHcml6emx5VGVzdCIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbygiR0VUIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL3Byb3ZpZGVycy9ncml6emx5Mi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvZ3JpenpseS9CYXNlVXJpVGVzdC5qYXZhIGIvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL2dyaXp6bHkyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9ncml6emx5L0Jhc2VVcmlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdhMjkyOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZnJhbWV3b3JrL3Byb3ZpZGVycy9ncml6emx5Mi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvZ3JpenpseS9CYXNlVXJpVGVzdC5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5ncml6emx5OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkRlcGxveW1lbnRDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBHcml6emx5IHRlc3QgY29udGFpbmVyIGJhc2UgVVJJIHRlc3RzLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBCYXNlVXJpVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgeworICAgICAgICByZXR1cm4gbmV3IEdyaXp6bHlUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBQYXRoKCJyb290IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RSZXNvdXJjZSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gIkdFVCI7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgic3ViIikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFN1YigpIHsKKyAgICAgICAgICAgIHJldHVybiAic3ViIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBEZXBsb3ltZW50Q29udGV4dCBjb25maWd1cmVEZXBsb3ltZW50KCkgeworICAgICAgICByZXR1cm4gRGVwbG95bWVudENvbnRleHQuYnVpbGRlcihuZXcgUmVzb3VyY2VDb25maWcoVGVzdFJlc291cmNlLmNsYXNzKSkKKyAgICAgICAgICAgICAgICAuY29udGV4dFBhdGgoImNvbnRleHQxL2NvbnRleHQyIikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXQoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoInJvb3QiKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgcyA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkdFVCIsIHMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFN1YigpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgicm9vdC9zdWIiKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgcyA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInN1YiIsIHMpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL2dyaXp6bHkyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9ncml6emx5L3Bja2cvR3JpenpseVBhY2thZ2VUZXN0LmphdmEgYi90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvZ3JpenpseTIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L2dyaXp6bHkvcGNrZy9Hcml6emx5UGFja2FnZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzU3YmM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL2dyaXp6bHkyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9ncml6emx5L3Bja2cvR3JpenpseVBhY2thZ2VUZXN0LmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmdyaXp6bHkucGNrZzsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZ3JpenpseS5Hcml6emx5VGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKworLyoqCisgKiBUZXN0IHBpY2tpbmcgdXAgcmVzb3VyY2VzIGZvciBHcml6emx5IHRlc3QgY29udGFpbmVyIHZpYSBwYWNrYWdlcy4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgR3JpenpseVBhY2thZ2VUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZygpLnBhY2thZ2VzKHRoaXMuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB7CisgICAgICAgIHJldHVybiBuZXcgR3JpenpseVRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFBhdGgoInJvb3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFJlc291cmNlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiR0VUIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJzdWIiKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3ViKCkgeworICAgICAgICAgICAgcmV0dXJuICJzdWIiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgeworICAgICAgICBTdHJpbmcgcyA9IHRhcmdldCgpLnBhdGgoInJvb3QiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiR0VUIiwgcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3ViKCkgeworICAgICAgICBTdHJpbmcgcyA9IHRhcmdldCgpLnBhdGgoInJvb3Qvc3ViIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoInN1YiIsIHMpOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvZ3JpenpseTIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L2dyaXp6bHkvd2ViL0F2YWlsYWJsZVBvcnRHcml6emx5V2ViVGVzdC5qYXZhIGIvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL2dyaXp6bHkyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9ncml6emx5L3dlYi9BdmFpbGFibGVQb3J0R3JpenpseVdlYlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODRkYjdlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL2dyaXp6bHkyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9ncml6emx5L3dlYi9BdmFpbGFibGVQb3J0R3JpenpseVdlYlRlc3QuamF2YQpAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZ3JpenpseS53ZWI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5EZXBsb3ltZW50Q29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5TZXJ2bGV0RGVwbG95bWVudENvbnRleHQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmdyaXp6bHkuR3JpenpseVdlYlRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5ub3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogVGVzdHMgZmluZGluZyBhbiBhdmFpbGFibGUgcG9ydCBmb3IgY29udGFpbmVyLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgQXZhaWxhYmxlUG9ydEdyaXp6bHlXZWJUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB7CisgICAgICAgIHJldHVybiBuZXcgR3JpenpseVdlYlRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFBhdGgoIkF2YWlsYWJsZVBvcnRHcml6emx5V2ViVGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0UmVzb3VyY2UgeworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJHRVQiOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIERlcGxveW1lbnRDb250ZXh0IGNvbmZpZ3VyZURlcGxveW1lbnQoKSB7CisgICAgICAgIGZvcmNlU2V0KFRlc3RQcm9wZXJ0aWVzLkNPTlRBSU5FUl9QT1JULCAiMCIpOworCisgICAgICAgIHJldHVybiBTZXJ2bGV0RGVwbG95bWVudENvbnRleHQuZm9yU2VydmxldChuZXcgU2VydmxldENvbnRhaW5lcihuZXcgUmVzb3VyY2VDb25maWcoVGVzdFJlc291cmNlLmNsYXNzKSkpLmJ1aWxkKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgeworICAgICAgICBhc3NlcnRUaGF0KHRhcmdldCgpLmdldFVyaSgpLmdldFBvcnQoKSwgbm90KDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChnZXRCYXNlVXJpKCkuZ2V0UG9ydCgpLCBub3QoMCkpOworCisgICAgICAgIGFzc2VydFRoYXQodGFyZ2V0KCJBdmFpbGFibGVQb3J0R3JpenpseVdlYlRlc3QiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyksIGVxdWFsVG8oIkdFVCIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvZ3JpenpseTIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L2dyaXp6bHkvd2ViL0dyaXp6bHlSZXF1ZXN0RGlzcGF0Y2hGaWx0ZXJUZXN0LmphdmEgYi90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvZ3JpenpseTIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L2dyaXp6bHkvd2ViL0dyaXp6bHlSZXF1ZXN0RGlzcGF0Y2hGaWx0ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhhZDU2OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZnJhbWV3b3JrL3Byb3ZpZGVycy9ncml6emx5Mi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvZ3JpenpseS93ZWIvR3JpenpseVJlcXVlc3REaXNwYXRjaEZpbHRlclRlc3QuamF2YQpAQCAtMCwwICsxLDIzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmdyaXp6bHkud2ViOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bVNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlckNoYWluOworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ29uZmlnOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5EZXBsb3ltZW50Q29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5TZXJ2bGV0RGVwbG95bWVudENvbnRleHQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5ncml6emx5LkdyaXp6bHlXZWJUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guZ3JpenpseS5zZXJ2bGV0Lkh0dHBTZXJ2bGV0UmVxdWVzdEltcGw7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFJlcHJvZHVjZXIgZm9yIEpFUlNFWS0xODkzLgorICoKKyAqIFRoaXMgaXMgdG8gbWFrZSBzdXJlIGZpbHRlcnMgY291bGQgYmUgdXRpbGl6ZWQgZXZlbiBmb3IgZmlsdGVyaW5nCisgKiByZXF1ZXN0cyB0aGF0IGFyZSBiZWluZyBmb3J3YXJkZWQvaW5jbHVkZWQgd2l0aGluIHRoZSBzZXJ2ZXIgc2lkZQorICogdXNpbmcge0BsaW5rIGphdmF4LnNlcnZsZXQuUmVxdWVzdERpc3BhdGNoZXJ9IG1lY2hhbmlzbS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEdyaXp6bHlSZXF1ZXN0RGlzcGF0Y2hGaWx0ZXJUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICAvKioKKyAgICAgKiBXZSBjYW4gb25seSByZWdpc3RlciBhIHNpbmdsZSBTZXJ2bGV0IGluc3RhbmNlLiBUaGlzIG9uZSB0aGVuIHNlcnZlcyBhcyBhIHJlcXVlc3QgZGlzcGF0Y2hlcgorICAgICAqIGFzIHdlbGwgYXMgSmVyc2V5IFNlcnZsZXQgY29udGFpbmVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVxdWVzdERpc3BhdGNoZXJTZXJ2bGV0IGV4dGVuZHMgU2VydmxldENvbnRhaW5lciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNlcnZpY2UoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKGlzSW5ib3VuZChyZXEpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGFjdGlvbiA9IHJlcS5nZXRQYXJhbWV0ZXIoImFjdGlvbiIpOworICAgICAgICAgICAgICAgIGlmICgiZm9yd2FyZCIuZXF1YWxzKGFjdGlvbikpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZXF1ZXN0RGlzcGF0Y2hlcigiL2ZvcndhcmQiKS5mb3J3YXJkKHJlcSwgcmVzcCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgiaW5jbHVkZSIuZXF1YWxzKGFjdGlvbikpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0U2VydmxldENvbnRleHQoKS5nZXRSZXF1ZXN0RGlzcGF0Y2hlcigiL2luY2x1ZGVkIikuaW5jbHVkZShyZXEsIHJlc3ApOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN1cGVyLnNlcnZpY2UocmVxLCByZXNwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN1cGVyLnNlcnZpY2UocmVxLCByZXNwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc0luYm91bmQoSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSkgeworICAgICAgICAgICAgLy8gdGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIGJyb2tlbiBnZXREaXNwYXRjaFR5cGUgaW4gZ3JpenpseQorICAgICAgICAgICAgcmV0dXJuIHJlcSBpbnN0YW5jZW9mIEh0dHBTZXJ2bGV0UmVxdWVzdEltcGw7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbHRlciB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIGZvciByZWd1bGFyIHJlcXVlc3RzIGNvbWluZyBkaXJlY3RseSBmcm9tIGNsaWVudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlZ3VsYXJGaWx0ZXIgaW1wbGVtZW50cyBGaWx0ZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBpbml0KEZpbHRlckNvbmZpZyBmaWx0ZXJDb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBkb0ZpbHRlcihTZXJ2bGV0UmVxdWVzdCBzZXJ2bGV0UmVxdWVzdCwgU2VydmxldFJlc3BvbnNlIHNlcnZsZXRSZXNwb25zZSwgRmlsdGVyQ2hhaW4gZmlsdGVyQ2hhaW4pCisgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHNlcnZsZXRSZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKS5wcmludCgiWyIpOworICAgICAgICAgICAgZmlsdGVyQ2hhaW4uZG9GaWx0ZXIoc2VydmxldFJlcXVlc3QsIHNlcnZsZXRSZXNwb25zZSk7CisgICAgICAgICAgICBzZXJ2bGV0UmVzcG9uc2UuZ2V0T3V0cHV0U3RyZWFtKCkucHJpbnQoIl0iKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgeworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogRmlsdGVyIHRoYXQgd2lsbCBvbmx5IGJlIGFwcGxpZWQgZm9yIGludGVybmFsbHkgZm9yd2FyZGVkIHJlcXVlc3RzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRm9yd2FyZEZpbHRlciBpbXBsZW1lbnRzIEZpbHRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGluaXQoRmlsdGVyQ29uZmlnIGZpbHRlckNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGRvRmlsdGVyKFNlcnZsZXRSZXF1ZXN0IHNlcnZsZXRSZXF1ZXN0LCBTZXJ2bGV0UmVzcG9uc2Ugc2VydmxldFJlc3BvbnNlLCBGaWx0ZXJDaGFpbiBmaWx0ZXJDaGFpbikKKyAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICAgICAgc2VydmxldFJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpLnByaW50KCI+PiIpOworICAgICAgICAgICAgZmlsdGVyQ2hhaW4uZG9GaWx0ZXIoc2VydmxldFJlcXVlc3QsIHNlcnZsZXRSZXNwb25zZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbHRlciBmb3IgaW50ZXJuYWwgaW5jbHVkZSBjYWxscy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEluY2x1ZGVGaWx0ZXIgaW1wbGVtZW50cyBGaWx0ZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBpbml0KEZpbHRlckNvbmZpZyBmaWx0ZXJDb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBkb0ZpbHRlcihTZXJ2bGV0UmVxdWVzdCBzZXJ2bGV0UmVxdWVzdCwgU2VydmxldFJlc3BvbnNlIHNlcnZsZXRSZXNwb25zZSwgRmlsdGVyQ2hhaW4gZmlsdGVyQ2hhaW4pCisgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHNlcnZsZXRSZXNwb25zZS5nZXRPdXRwdXRTdHJlYW0oKS5wcmludCgiU09NRVRISU5HICIpOworICAgICAgICAgICAgZmlsdGVyQ2hhaW4uZG9GaWx0ZXIoc2VydmxldFJlcXVlc3QsIHNlcnZsZXRSZXNwb25zZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc291cmNlIHRvIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGZyb20gdGhlIGNsaWVudCBvbmx5LgorICAgICAqLworICAgIEBQYXRoKCJkaXJlY3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGlyZWN0UmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gIkRJUkVDVCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNvdXJjZSB0aGF0IHdpbGwgYWxzbyBiZSBjYWxsZWQgZnJvbSB0aGUgc2VydmVyIHNpZGUgdXNpbmcgdGhlIFNlcnZsZXQgZm9yd2FyZCBtZWNoYW5pc20uCisgICAgICovCisgICAgQFBhdGgoImZvcndhcmQiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRm9yd2FyZFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJGT1JXQVJEIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc291cmNlIHRoYXQgd2lsbCBhbHNvIGJlIGNhbGxlZCBmcm9tIHRoZSBzZXJ2ZXIgc2lkZSB1c2luZyB0aGUgU2VydmxldCBpbmNsdWRlIG1lY2hhbmlzbS4KKyAgICAgKi8KKyAgICBAUGF0aCgiaW5jbHVkZWQiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5jbHVkZVJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJJTkNMVURFRCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgRGVwbG95bWVudENvbnRleHQgY29uZmlndXJlRGVwbG95bWVudCgpIHsKKyAgICAgICAgcmV0dXJuIFNlcnZsZXREZXBsb3ltZW50Q29udGV4dC5mb3JTZXJ2bGV0KFJlcXVlc3REaXNwYXRjaGVyU2VydmxldC5jbGFzcykKKyAgICAgICAgICAgICAgICAuYWRkRmlsdGVyKEZvcndhcmRGaWx0ZXIuY2xhc3MsICJmb3J3YXJkRmlsdGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVudW1TZXQub2YoamF2YXguc2VydmxldC5EaXNwYXRjaGVyVHlwZS5GT1JXQVJEKSkKKyAgICAgICAgICAgICAgICAuYWRkRmlsdGVyKEluY2x1ZGVGaWx0ZXIuY2xhc3MsICJpbmNsdWRlRmlsdGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEVudW1TZXQub2YoamF2YXguc2VydmxldC5EaXNwYXRjaGVyVHlwZS5JTkNMVURFKSkKKyAgICAgICAgICAgICAgICAuYWRkRmlsdGVyKFJlZ3VsYXJGaWx0ZXIuY2xhc3MsICJyZWd1bGFyRmlsdGVyIikKKyAgICAgICAgICAgICAgICAuaW5pdFBhcmFtKFNlcnZlclByb3BlcnRpZXMuUFJPVklERVJfUEFDS0FHRVMsIHRoaXMuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBHcml6emx5V2ViVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByb2R1Y2VyIHRlc3QgZm9yIEpFUlNFWS0xODkzLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldCgpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpOworCisgICAgICAgIFN0cmluZyBzOworCisgICAgICAgIC8vIGNoZWNrIHRoYXQgdGhlIHJlZ3VsYXIgZmlsdGVyIGdldHMgaW52b2x2ZWQKKyAgICAgICAgcyA9IHRhcmdldC5wYXRoKCJkaXJlY3QiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIltESVJFQ1RdIiwgcyk7CisKKyAgICAgICAgLy8gdGhlIHJlZ3VsYXIgZmlsdGVyIHNob3VsZCB3b3JrIGZvciBkaXJlY3RseSByZXF1ZXN0ZWQgZm9yd2FyZCByZXNvdXJjZSBhcyB3ZWxsLgorICAgICAgICBzID0gdGFyZ2V0LnBhdGgoImZvcndhcmQiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIltGT1JXQVJEXSIsIHMpOworCisgICAgICAgIC8vIGZvcndhcmQgYWN0aW9uIHNob3VsZCBlbmZvcmNlIGZvcndhcmQgZmlsdGVyIHRvIGJlIGludm9rZWQKKyAgICAgICAgcyA9IHRhcmdldC5xdWVyeVBhcmFtKCJhY3Rpb24iLCAiZm9yd2FyZCIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiPj5GT1JXQVJEIiwgcyk7CisKKyAgICAgICAgLy8gZGlyZWN0IGNhbGwgdG8gdGhlIGluY2x1ZGUgcmVzb3VyY2UKKyAgICAgICAgcyA9IHRhcmdldC5wYXRoKCJpbmNsdWRlZCIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiW0lOQ0xVREVEXSIsIHMpOworCisgICAgICAgIC8vIGluY2x1ZGUgY2FsbCBzaG91bGQgaW52b2x2ZSBib3RoIHJlZ3VsYXIgYW5kIGluY2x1ZGUgZmlsdGVyCisgICAgICAgIHMgPSB0YXJnZXQucGF0aCgiaW5jbHVkZWQiKS5xdWVyeVBhcmFtKCJhY3Rpb24iLCAiaW5jbHVkZSIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiW1NPTUVUSElORyBJTkNMVURFRF0iLCBzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvZ3JpenpseTIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L2dyaXp6bHkvd2ViL0dyaXp6bHlXZWJGaXhlZFJlcXVlc3RTaXplVGVzdC5qYXZhIGIvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL2dyaXp6bHkyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9ncml6emx5L3dlYi9Hcml6emx5V2ViRml4ZWRSZXF1ZXN0U2l6ZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjRiYjA2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL2dyaXp6bHkyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9ncml6emx5L3dlYi9Hcml6emx5V2ViRml4ZWRSZXF1ZXN0U2l6ZVRlc3QuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZ3JpenpseS53ZWI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5IZWFkZXJQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkRlcGxveW1lbnRDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlNlcnZsZXREZXBsb3ltZW50Q29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmdyaXp6bHkuR3JpenpseVdlYlRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgR3JpenpseVdlYkZpeGVkUmVxdWVzdFNpemVUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB7CisgICAgICAgIHJldHVybiBuZXcgR3JpenpseVdlYlRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBieXRlW10gcG9zdChASGVhZGVyUGFyYW0oIkNvbnRlbnQtTGVuZ3RoIikgZmluYWwgSW50ZWdlciBzaXplLCBmaW5hbCBieXRlW10gaW4pIHsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoc2l6ZSwgaXMoNCkpOworCisgICAgICAgICAgICByZXR1cm4gaW47CisgICAgICAgIH0KKyAgICB9CisKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBEZXBsb3ltZW50Q29udGV4dCBjb25maWd1cmVEZXBsb3ltZW50KCkgeworICAgICAgICByZXR1cm4gU2VydmxldERlcGxveW1lbnRDb250ZXh0LmZvclNlcnZsZXQobmV3IFNlcnZsZXRDb250YWluZXIobmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzKSkpLmJ1aWxkKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWVzdCgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKS5wb3N0KEVudGl0eS50ZXh0KCJQT1NUIikpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiQ29udGVudC1MZW5ndGgiKSwgaXMoIjQiKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCksIGlzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9PQ1RFVF9TVFJFQU1fVFlQRSkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmhhc0VudGl0eSgpLCBpcyh0cnVlKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL2dyaXp6bHkyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9ncml6emx5L3dlYi9Hcml6emx5V2ViSW5qZWN0aW9uVGVzdC5qYXZhIGIvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL2dyaXp6bHkyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9ncml6emx5L3dlYi9Hcml6emx5V2ViSW5qZWN0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNmQwNTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvZ3JpenpseTIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L2dyaXp6bHkvd2ViL0dyaXp6bHlXZWJJbmplY3Rpb25UZXN0LmphdmEKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5ncml6emx5LndlYjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29uZmlnOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkRlcGxveW1lbnRDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlNlcnZsZXREZXBsb3ltZW50Q29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmdyaXp6bHkuR3JpenpseVdlYlRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBUZXN0IGluamVjdGlvbiBzdXBwb3J0IGluIHRoZSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5ncml6emx5LkdyaXp6bHlXZWJUZXN0Q29udGFpbmVyRmFjdG9yeX0uCisgKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBHcml6emx5V2ViSW5qZWN0aW9uVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQFBhdGgoImZpZWxkcyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGaWVsZHNSZXNvdXJjZSB7CisKKyAgICAgICAgQENvbnRleHQKKyAgICAgICAgcHJpdmF0ZSBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdDsKKyAgICAgICAgQENvbnRleHQKKyAgICAgICAgcHJpdmF0ZSBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlOworCisgICAgICAgIEBDb250ZXh0CisgICAgICAgIHByaXZhdGUgU2VydmxldENvbmZpZyBjb25maWc7CisgICAgICAgIEBDb250ZXh0CisgICAgICAgIHByaXZhdGUgU2VydmxldENvbnRleHQgY29udGV4dDsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIHRlc3RJbmplY3Rpb25zKHJlcXVlc3QsIHJlc3BvbnNlLCBjb25maWcsIGNvbnRleHQpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInNpbmdsZXRvbi9maWVsZHMiKQorICAgIEBTaW5nbGV0b24KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNpbmdsZXRvbkZpZWxkc1Jlc291cmNlIHsKKworICAgICAgICBAQ29udGV4dAorICAgICAgICBwcml2YXRlIEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0OworICAgICAgICBAQ29udGV4dAorICAgICAgICBwcml2YXRlIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2U7CisKKyAgICAgICAgQENvbnRleHQKKyAgICAgICAgcHJpdmF0ZSBTZXJ2bGV0Q29uZmlnIGNvbmZpZzsKKyAgICAgICAgQENvbnRleHQKKyAgICAgICAgcHJpdmF0ZSBTZXJ2bGV0Q29udGV4dCBjb250ZXh0OworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gdGVzdEluamVjdGlvbnMocmVxdWVzdCwgcmVzcG9uc2UsIGNvbmZpZywgY29udGV4dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL2NvbnN0cnVjdG9yIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbnN0cnVjdG9yUmVzb3VyY2UgeworCisgICAgICAgIHByaXZhdGUgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3Q7CisgICAgICAgIHByaXZhdGUgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZTsKKworICAgICAgICBwcml2YXRlIFNlcnZsZXRDb25maWcgY29uZmlnOworICAgICAgICBwcml2YXRlIFNlcnZsZXRDb250ZXh0IGNvbnRleHQ7CisKKyAgICAgICAgcHVibGljIENvbnN0cnVjdG9yUmVzb3VyY2UoCisgICAgICAgICAgICAgICAgQENvbnRleHQgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcSwKKyAgICAgICAgICAgICAgICBAQ29udGV4dCBIdHRwU2VydmxldFJlc3BvbnNlIHJlcywKKyAgICAgICAgICAgICAgICBAQ29udGV4dCBTZXJ2bGV0Q29uZmlnIHNjb25mLAorICAgICAgICAgICAgICAgIEBDb250ZXh0IFNlcnZsZXRDb250ZXh0IHNjb250KSB7CisgICAgICAgICAgICB0aGlzLnJlcXVlc3QgPSByZXE7CisgICAgICAgICAgICB0aGlzLnJlc3BvbnNlID0gcmVzOworICAgICAgICAgICAgdGhpcy5jb25maWcgPSBzY29uZjsKKyAgICAgICAgICAgIHRoaXMuY29udGV4dCA9IHNjb250OworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiB0ZXN0SW5qZWN0aW9ucyhyZXF1ZXN0LCByZXNwb25zZSwgY29uZmlnLCBjb250ZXh0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyB0ZXN0SW5qZWN0aW9ucyhmaW5hbCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgZmluYWwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZXJ2bGV0Q29uZmlnIGNvbmZpZywgZmluYWwgU2VydmxldENvbnRleHQgY29udGV4dCkgeworICAgICAgICBpZiAoY29uZmlnICE9IG51bGwgJiYgY29udGV4dCAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgcmVxdWVzdCAhPSBudWxsICYmIHJlc3BvbnNlICE9IG51bGwKKyAgICAgICAgICAgICAgICAmJiBjb25maWcuZ2V0SW5pdFBhcmFtZXRlcihTZXJ2ZXJQcm9wZXJ0aWVzLlBST1ZJREVSX1BBQ0tBR0VTKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5lcXVhbHMoR3JpenpseVdlYkluamVjdGlvblRlc3QuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiAiU1VDQ0VTUyI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gIkZBSUwiOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIERlcGxveW1lbnRDb250ZXh0IGNvbmZpZ3VyZURlcGxveW1lbnQoKSB7CisgICAgICAgIHJldHVybiBTZXJ2bGV0RGVwbG95bWVudENvbnRleHQuYnVpbGRlcihuZXcgUmVzb3VyY2VDb25maWcoKSkKKyAgICAgICAgICAgICAgICAuaW5pdFBhcmFtKFNlcnZlclByb3BlcnRpZXMuUFJPVklERVJfUEFDS0FHRVMsIHRoaXMuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBHcml6emx5V2ViVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGaWVsZHMoKSB7CisgICAgICAgIF90ZXN0KCJmaWVsZHMiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGV0b25GaWVsZHMoKSB7CisgICAgICAgIF90ZXN0KCJzaW5nbGV0b24vZmllbGRzIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3IoKSB7CisgICAgICAgIF90ZXN0KCJjb25zdHJ1Y3RvciIpOworICAgIH0KKworCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0KGZpbmFsIFN0cmluZyBwYXRoKSB7CisgICAgICAgIGFzc2VydFRoYXQodGFyZ2V0KHBhdGgpLnJlcXVlc3QoKS5nZXQoKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGlzKCJTVUNDRVNTIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL3Byb3ZpZGVycy9ncml6emx5Mi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvZ3JpenpseS93ZWIvR3JpenpseVdlYlNlcnZsZXRBbmRGaWx0ZXJUZXN0LmphdmEgYi90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvZ3JpenpseTIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L2dyaXp6bHkvd2ViL0dyaXp6bHlXZWJTZXJ2bGV0QW5kRmlsdGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0MjU5MTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvZ3JpenpseTIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L2dyaXp6bHkvd2ViL0dyaXp6bHlXZWJTZXJ2bGV0QW5kRmlsdGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZ3JpenpseS53ZWI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ2hhaW47CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXJDb25maWc7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkRlcGxveW1lbnRDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlNlcnZsZXREZXBsb3ltZW50Q29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmdyaXp6bHkuR3JpenpseVdlYlRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBUZXN0IHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmdyaXp6bHkuR3JpenpseVdlYlRlc3RDb250YWluZXJGYWN0b3J5fSBzdXBwb3J0IGZvcgorICogc2VydmxldCArIGZpbHRlciBkZXBsb3ltZW50IHNjZW5hcmlvcy4KKyAqCisgKiBAYXV0aG9yIHBhdmVsLmJ1Y2VrQG9yYWNsZS5jb20KKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBHcml6emx5V2ViU2VydmxldEFuZEZpbHRlclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlTZXJ2bGV0IGV4dGVuZHMgU2VydmxldENvbnRhaW5lciB7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHZpc2l0ZWQgPSBmYWxzZTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2VydmljZShIdHRwU2VydmxldFJlcXVlc3QgcmVxLCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3ApIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBzdXBlci5zZXJ2aWNlKHJlcSwgcmVzcCk7CisgICAgICAgICAgICB2aXNpdGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlGaWx0ZXIxIGltcGxlbWVudHMgRmlsdGVyIHsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmlzaXRlZCA9IGZhbHNlOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBpbml0KEZpbHRlckNvbmZpZyBmaWx0ZXJDb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBkb0ZpbHRlcihTZXJ2bGV0UmVxdWVzdCBzZXJ2bGV0UmVxdWVzdCwgU2VydmxldFJlc3BvbnNlIHNlcnZsZXRSZXNwb25zZSwgRmlsdGVyQ2hhaW4gZmlsdGVyQ2hhaW4pCisgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHZpc2l0ZWQgPSB0cnVlOworICAgICAgICAgICAgZmlsdGVyQ2hhaW4uZG9GaWx0ZXIoc2VydmxldFJlcXVlc3QsIHNlcnZsZXRSZXNwb25zZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlGaWx0ZXIyIGltcGxlbWVudHMgRmlsdGVyIHsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gdmlzaXRlZCA9IGZhbHNlOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBpbml0KEZpbHRlckNvbmZpZyBmaWx0ZXJDb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBkb0ZpbHRlcihTZXJ2bGV0UmVxdWVzdCBzZXJ2bGV0UmVxdWVzdCwgU2VydmxldFJlc3BvbnNlIHNlcnZsZXRSZXNwb25zZSwgRmlsdGVyQ2hhaW4gZmlsdGVyQ2hhaW4pCisgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHZpc2l0ZWQgPSB0cnVlOworICAgICAgICAgICAgZmlsdGVyQ2hhaW4uZG9GaWx0ZXIoc2VydmxldFJlcXVlc3QsIHNlcnZsZXRSZXNwb25zZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJHcml6emx5V2ViU2VydmxldEFuZEZpbHRlclRlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJHRVQiOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIERlcGxveW1lbnRDb250ZXh0IGNvbmZpZ3VyZURlcGxveW1lbnQoKSB7CisgICAgICAgIHJldHVybiBTZXJ2bGV0RGVwbG95bWVudENvbnRleHQuZm9yU2VydmxldChNeVNlcnZsZXQuY2xhc3MpCisgICAgICAgICAgICAgICAgLmFkZEZpbHRlcihNeUZpbHRlcjEuY2xhc3MsICJteUZpbHRlcjEiKQorICAgICAgICAgICAgICAgIC5hZGRGaWx0ZXIoTXlGaWx0ZXIyLmNsYXNzLCAibXlGaWx0ZXIyIikKKyAgICAgICAgICAgICAgICAuaW5pdFBhcmFtKFNlcnZlclByb3BlcnRpZXMuUFJPVklERVJfUEFDS0FHRVMsIHRoaXMuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBHcml6emx5V2ViVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXQoKSB7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoIkdyaXp6bHlXZWJTZXJ2bGV0QW5kRmlsdGVyVGVzdCIpOworCisgICAgICAgIFN0cmluZyBzID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiR0VUIiwgcyk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoTXlTZXJ2bGV0LnZpc2l0ZWQpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShNeUZpbHRlcjEudmlzaXRlZCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKE15RmlsdGVyMi52aXNpdGVkKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvZ3JpenpseTIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L2dyaXp6bHkvd2ViL0dyaXp6bHlXZWJUZXN0LmphdmEgYi90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvZ3JpenpseTIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L2dyaXp6bHkvd2ViL0dyaXp6bHlXZWJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI4NTA1NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZnJhbWV3b3JrL3Byb3ZpZGVycy9ncml6emx5Mi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvZ3JpenpseS93ZWIvR3JpenpseVdlYlRlc3QuamF2YQpAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZ3JpenpseS53ZWI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkRlcGxveW1lbnRDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlNlcnZsZXREZXBsb3ltZW50Q29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmdyaXp6bHkuR3JpenpseVdlYlRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBCYXNpYyBHcml6emx5V2ViVGVzdENvbnRhaW5lckZhY3RvcnkgdW5pdCB0ZXN0cy4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgR3JpenpseVdlYlRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBHcml6emx5V2ViVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAUGF0aCgicm9vdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0UmVzb3VyY2UgeworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJHRVQiOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInN1YiIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRTdWIoKSB7CisgICAgICAgICAgICByZXR1cm4gInN1YiI7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBEZXBsb3ltZW50Q29udGV4dCBjb25maWd1cmVEZXBsb3ltZW50KCkgeworICAgICAgICByZXR1cm4gU2VydmxldERlcGxveW1lbnRDb250ZXh0LmZvclNlcnZsZXQobmV3IFNlcnZsZXRDb250YWluZXIobmV3IFJlc291cmNlQ29uZmlnKFRlc3RSZXNvdXJjZS5jbGFzcykpKS5idWlsZCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldCgpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgicm9vdCIpOworCisgICAgICAgIFN0cmluZyBzID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiR0VUIiwgcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0U3ViKCkgeworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJyb290L3N1YiIpOworCisgICAgICAgIFN0cmluZyBzID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygic3ViIiwgcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL2dyaXp6bHkyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9ncml6emx5L3dlYi9jb250ZXh0L0dyaXp6bHlXZWJDb250ZXh0UGF0aFRlc3QuamF2YSBiL3Rlc3QtZnJhbWV3b3JrL3Byb3ZpZGVycy9ncml6emx5Mi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvZ3JpenpseS93ZWIvY29udGV4dC9Hcml6emx5V2ViQ29udGV4dFBhdGhUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNmZmEwOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZnJhbWV3b3JrL3Byb3ZpZGVycy9ncml6emx5Mi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvZ3JpenpseS93ZWIvY29udGV4dC9Hcml6emx5V2ViQ29udGV4dFBhdGhUZXN0LmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmdyaXp6bHkud2ViLmNvbnRleHQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5EZXBsb3ltZW50Q29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5TZXJ2bGV0RGVwbG95bWVudENvbnRleHQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5ncml6emx5LkdyaXp6bHlXZWJUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0IHN1cHBvcnQgZm9yIGNvbnRleHQgcGF0aCBpbiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5ncml6emx5LkdyaXp6bHlXZWJUZXN0Q29udGFpbmVyRmFjdG9yeX0uCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEdyaXp6bHlXZWJDb250ZXh0UGF0aFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBHcml6emx5V2ViVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAUGF0aCgiY29udGV4dHJvb3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFJlc291cmNlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiR0VUIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJzdWIiKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3ViKCkgeworICAgICAgICAgICAgcmV0dXJuICJzdWIiOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIERlcGxveW1lbnRDb250ZXh0IGNvbmZpZ3VyZURlcGxveW1lbnQoKSB7CisgICAgICAgIHJldHVybiBTZXJ2bGV0RGVwbG95bWVudENvbnRleHQuZm9yUGFja2FnZXModGhpcy5nZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpCisgICAgICAgICAgICAgICAgLmNvbnRleHRQYXRoKCJjb250ZXh0IikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXQoKSB7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoImNvbnRleHRyb290Iik7CisKKyAgICAgICAgU3RyaW5nIHMgPSB0YXJnZXQucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCIsIHMpOworCisgICAgICAgIGFzc2VydEVxdWFscygiL2NvbnRleHQvY29udGV4dHJvb3QiLCB0YXJnZXQuZ2V0VXJpKCkuZ2V0UmF3UGF0aCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTdWIoKSB7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoImNvbnRleHRyb290L3N1YiIpOworCisgICAgICAgIFN0cmluZyBzID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzdWIiLCBzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIi9jb250ZXh0L2NvbnRleHRyb290L3N1YiIsIHRhcmdldC5nZXRVcmkoKS5nZXRSYXdQYXRoKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL3Byb3ZpZGVycy9pbm1lbW9yeS9wb20ueG1sIGIvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL2lubWVtb3J5L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRlMzc4YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZnJhbWV3b3JrL3Byb3ZpZGVycy9pbm1lbW9yeS9wb20ueG1sCkBAIC0wLDAgKzEsNTIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWlubWVtb3J5PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWlubWVtb3J5PC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPkplcnNleSBUZXN0IEZyYW1ld29yayAtIEluTWVtb3J5IGNvbnRhaW5lcjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXNlcnZlcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY2xpZW50PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L2lubWVtb3J5L0luTWVtb3J5Q29ubmVjdG9yLmphdmEgYi90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L2lubWVtb3J5L0luTWVtb3J5Q29ubmVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc2MDhkYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZnJhbWV3b3JrL3Byb3ZpZGVycy9pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvaW5tZW1vcnkvSW5NZW1vcnlDb25uZWN0b3IuamF2YQpAQCAtMCwwICsxLDMxOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmlubWVtb3J5OworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbXBsZXRhYmxlRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuU2VjdXJpdHlDb250ZXh0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5zcGkuQXN5bmNDb25uZWN0b3JDYWxsYmFjazsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuc3BpLkNvbm5lY3RvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuc3BpLkNvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLk1hcFByb3BlcnRpZXNEZWxlZ2F0ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Qcm9wZXJ0aWVzRGVsZWdhdGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5PdXRib3VuZE1lc3NhZ2VDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29udGFpbmVyUmVzcG9uc2VXcml0ZXI7CisKKy8qKgorICogSW4tbWVtb3J5IGNsaWVudCBjb25uZWN0b3IuCisgKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK2NsYXNzIEluTWVtb3J5Q29ubmVjdG9yIGltcGxlbWVudHMgQ29ubmVjdG9yIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEluTWVtb3J5Q29ubmVjdG9yLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBwcml2YXRlIGZpbmFsIFVSSSBiYXNlVXJpOworICAgIHByaXZhdGUgZmluYWwgQXBwbGljYXRpb25IYW5kbGVyIGFwcEhhbmRsZXI7CisKKyAgICAvKioKKyAgICAgKiBJbi1tZW1vcnkgY2xpZW50IGNvbm5lY3RvciBwcm92aWRlci4KKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgUHJvdmlkZXIgaW1wbGVtZW50cyBDb25uZWN0b3JQcm92aWRlciB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBVUkkgYmFzZVVyaTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwSGFuZGxlcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlIG5ldyBpbi1tZW1vcnkgY29ubmVjdG9yIHByb3ZpZGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYmFzZVVyaSAgICBhcHBsaWNhdGlvbiBiYXNlIFVSSS4KKyAgICAgICAgICogQHBhcmFtIGFwcEhhbmRsZXIgUmVxdWVzdEludm9rZXIgaW5zdGFuY2Ugd2hpY2ggcmVwcmVzZW50cyBhcHBsaWNhdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIFByb3ZpZGVyKFVSSSBiYXNlVXJpLCBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwSGFuZGxlcikgeworICAgICAgICAgICAgdGhpcy5iYXNlVXJpID0gYmFzZVVyaTsKKyAgICAgICAgICAgIHRoaXMuYXBwSGFuZGxlciA9IGFwcEhhbmRsZXI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENvbm5lY3RvciBnZXRDb25uZWN0b3IoQ2xpZW50IGNsaWVudCwgQ29uZmlndXJhdGlvbiBjb25maWcpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSW5NZW1vcnlDb25uZWN0b3IoYmFzZVVyaSwgYXBwSGFuZGxlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IGluLW1lbW9yeSBjb25uZWN0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmFzZVVyaSAgICBhcHBsaWNhdGlvbiBiYXNlIFVSSS4KKyAgICAgKiBAcGFyYW0gYXBwSGFuZGxlciBSZXF1ZXN0SW52b2tlciBpbnN0YW5jZSB3aGljaCByZXByZXNlbnRzIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgSW5NZW1vcnlDb25uZWN0b3IoZmluYWwgVVJJIGJhc2VVcmksIGZpbmFsIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBIYW5kbGVyKSB7CisgICAgICAgIHRoaXMuYmFzZVVyaSA9IGJhc2VVcmk7CisgICAgICAgIHRoaXMuYXBwSGFuZGxlciA9IGFwcEhhbmRsZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW4gbWVtb3J5IGNvbnRhaW5lciByZXNwb25zZSB3cml0ZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbk1lbW9yeVJlc3BvbnNlV3JpdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVzcG9uc2VXcml0ZXIgeworCisgICAgICAgIHByaXZhdGUgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnM7CisgICAgICAgIHByaXZhdGUgZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBjb21taXR0ZWQ7CisgICAgICAgIHByaXZhdGUgUmVzcG9uc2UuU3RhdHVzVHlwZSBzdGF0dXNJbmZvOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIHdyaXRlUmVzcG9uc2VTdGF0dXNBbmRIZWFkZXJzKGxvbmcgY29udGVudExlbmd0aCwgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2VDb250ZXh0KSB7CisgICAgICAgICAgICBMaXN0PE9iamVjdD4gbGVuZ3RoID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICBsZW5ndGguYWRkKFN0cmluZy52YWx1ZU9mKGNvbnRlbnRMZW5ndGgpKTsKKworICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LmdldEhlYWRlcnMoKS5wdXQoSHR0cEhlYWRlcnMuQ09OVEVOVF9MRU5HVEgsIGxlbmd0aCk7CisgICAgICAgICAgICBoZWFkZXJzID0gcmVzcG9uc2VDb250ZXh0LmdldFN0cmluZ0hlYWRlcnMoKTsKKyAgICAgICAgICAgIHN0YXR1c0luZm8gPSByZXNwb25zZUNvbnRleHQuZ2V0U3RhdHVzSW5mbygpOworICAgICAgICAgICAgcmV0dXJuIGJhb3M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gc3VzcGVuZChsb25nIHRpbWVPdXQsIFRpbWVVbml0IHRpbWVVbml0LCBUaW1lb3V0SGFuZGxlciB0aW1lb3V0SGFuZGxlcikgeworICAgICAgICAgICAgTE9HR0VSLndhcm5pbmcoIkFzeW5jaHJvbm91cyBzZXJ2ZXIgc2lkZSBpbnZvY2F0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBieSBJbk1lbW9yeUNvbnRhaW5lci4iKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRTdXNwZW5kVGltZW91dChsb25nIHRpbWVPdXQsIFRpbWVVbml0IHRpbWVVbml0KSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIkFzeW5jIHNlcnZlciBzaWRlIGludm9jYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIGJ5IEluTWVtb3J5Q29udGFpbmVyLiIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNvbW1pdCgpIHsKKyAgICAgICAgICAgIGNvbW1pdHRlZCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmFpbHVyZShUaHJvd2FibGUgZXJyb3IpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKCJTZXJ2ZXItc2lkZSByZXF1ZXN0IHByb2Nlc3NpbmcgZmFpbGVkIHdpdGggYW4gZXJyb3IuIiwgZXJyb3IpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZVJlc3BvbnNlQnVmZmVyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHRoZSB3cml0dGVuIGVudGl0eS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBCeXRlIGFycmF5IHdoaWNoIGNvbnRhaW5zIHRoZSBlbnRpdHkgd3JpdHRlbiBieSB0aGUgc2VydmVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIGJ5dGVbXSBnZXRFbnRpdHkoKSB7CisgICAgICAgICAgICBpZiAoIWNvbW1pdHRlZCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlJlc3BvbnNlIGlzIG5vdCBjb21taXR0ZWQgeWV0LiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJhb3MudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gcmVzcG9uc2UgaGVhZGVycy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBoZWFkZXJzLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBnZXRIZWFkZXJzKCkgeworICAgICAgICAgICAgcmV0dXJuIGhlYWRlcnM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyByZXNwb25zZSBzdGF0dXMgaW5mby4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBzdGF0dXMgaW5mby4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBSZXNwb25zZS5TdGF0dXNUeXBlIGdldFN0YXR1c0luZm8oKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzSW5mbzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKiA8cC8+CisgICAgICogVHJhbnNmb3JtcyBjbGllbnQtc2lkZSByZXF1ZXN0IHRvIHNlcnZlci1zaWRlIGFuZCBpbnZva2VzIGl0IG9uIHByb3ZpZGVkIGFwcGxpY2F0aW9uICh7QGxpbmsgQXBwbGljYXRpb25IYW5kbGVyfQorICAgICAqIGluc3RhbmNlKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGllbnRSZXF1ZXN0IGNsaWVudCBzaWRlIHJlcXVlc3QgdG8gYmUgaW52b2tlZC4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgQ2xpZW50UmVzcG9uc2UgYXBwbHkoZmluYWwgQ2xpZW50UmVxdWVzdCBjbGllbnRSZXF1ZXN0KSB7CisgICAgICAgIFByb3BlcnRpZXNEZWxlZ2F0ZSBwcm9wZXJ0aWVzRGVsZWdhdGUgPSBuZXcgTWFwUHJvcGVydGllc0RlbGVnYXRlKCk7CisKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVxdWVzdCBjb250YWluZXJSZXF1ZXN0ID0gbmV3IENvbnRhaW5lclJlcXVlc3QoYmFzZVVyaSwKKyAgICAgICAgICAgICAgICBjbGllbnRSZXF1ZXN0LmdldFVyaSgpLCBjbGllbnRSZXF1ZXN0LmdldE1ldGhvZCgpLAorICAgICAgICAgICAgICAgIG51bGwsIHByb3BlcnRpZXNEZWxlZ2F0ZSk7CisKKyAgICAgICAgY29udGFpbmVyUmVxdWVzdC5nZXRIZWFkZXJzKCkucHV0QWxsKGNsaWVudFJlcXVlc3QuZ2V0U3RyaW5nSGVhZGVycygpKTsKKworICAgICAgICBmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gY2xpZW50T3V0cHV0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBpZiAoY2xpZW50UmVxdWVzdC5nZXRFbnRpdHkoKSAhPSBudWxsKSB7CisgICAgICAgICAgICBjbGllbnRSZXF1ZXN0LnNldFN0cmVhbVByb3ZpZGVyKG5ldyBPdXRib3VuZE1lc3NhZ2VDb250ZXh0LlN0cmVhbVByb3ZpZGVyKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKGludCBjb250ZW50TGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gY2xpZW50SGVhZGVycyA9IGNsaWVudFJlcXVlc3QuZ2V0SGVhZGVycygpOworICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudExlbmd0aCAhPSAtMSAmJiAhY2xpZW50SGVhZGVycy5jb250YWluc0tleShIdHRwSGVhZGVycy5DT05URU5UX0xFTkdUSCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lclJlcXVlc3QuZ2V0SGVhZGVycygpLnB1dFNpbmdsZShIdHRwSGVhZGVycy5DT05URU5UX0xFTkdUSCwgU3RyaW5nLnZhbHVlT2YoY29udGVudExlbmd0aCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjbGllbnRPdXRwdXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBjbGllbnRSZXF1ZXN0LmVuYWJsZUJ1ZmZlcmluZygpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNsaWVudFJlcXVlc3Qud3JpdGVFbnRpdHkoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbXNnID0gIkVycm9yIHdoaWxlIHdyaXRpbmcgZW50aXR5IHRvIHRoZSBvdXRwdXQgc3RyZWFtLiI7CisgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5TRVZFUkUsIG1zZywgZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24obXNnLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGNvbnRhaW5lclJlcXVlc3Quc2V0RW50aXR5U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShjbGllbnRPdXRwdXQudG9CeXRlQXJyYXkoKSkpOworCisgICAgICAgIGJvb2xlYW4gZm9sbG93UmVkaXJlY3RzID0gQ2xpZW50UHJvcGVydGllcy5nZXRWYWx1ZShjbGllbnRSZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0aWVzKCksCisgICAgICAgICAgICAgICAgQ2xpZW50UHJvcGVydGllcy5GT0xMT1dfUkVESVJFQ1RTLCB0cnVlKTsKKworICAgICAgICBmaW5hbCBJbk1lbW9yeVJlc3BvbnNlV3JpdGVyIGluTWVtb3J5UmVzcG9uc2VXcml0ZXIgPSBuZXcgSW5NZW1vcnlSZXNwb25zZVdyaXRlcigpOworICAgICAgICBjb250YWluZXJSZXF1ZXN0LnNldFdyaXRlcihpbk1lbW9yeVJlc3BvbnNlV3JpdGVyKTsKKyAgICAgICAgY29udGFpbmVyUmVxdWVzdC5zZXRTZWN1cml0eUNvbnRleHQobmV3IFNlY3VyaXR5Q29udGV4dCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFByaW5jaXBhbCBnZXRVc2VyUHJpbmNpcGFsKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzVXNlckluUm9sZShTdHJpbmcgcm9sZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1NlY3VyZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRBdXRoZW50aWNhdGlvblNjaGVtZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIGFwcEhhbmRsZXIuaGFuZGxlKGNvbnRhaW5lclJlcXVlc3QpOworCisgICAgICAgIHJldHVybiB0cnlGb2xsb3dSZWRpcmVjdHMoZm9sbG93UmVkaXJlY3RzLAorICAgICAgICAgICAgICAgIGNyZWF0ZUNsaWVudFJlc3BvbnNlKAorICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50UmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluTWVtb3J5UmVzcG9uc2VXcml0ZXIpLAorICAgICAgICAgICAgICAgIG5ldyBDbGllbnRSZXF1ZXN0KGNsaWVudFJlcXVlc3QpKTsKKworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBGdXR1cmU8Pz4gYXBwbHkoZmluYWwgQ2xpZW50UmVxdWVzdCByZXF1ZXN0LCBmaW5hbCBBc3luY0Nvbm5lY3RvckNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPENsaWVudFJlc3BvbnNlPiBmdXR1cmUgPSBuZXcgQ29tcGxldGFibGVGdXR1cmU8PigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2xpZW50UmVzcG9uc2UgcmVzcG9uc2UgPSBhcHBseShyZXF1ZXN0KTsKKyAgICAgICAgICAgIGNhbGxiYWNrLnJlc3BvbnNlKHJlc3BvbnNlKTsKKyAgICAgICAgICAgIGZ1dHVyZS5jb21wbGV0ZShyZXNwb25zZSk7CisgICAgICAgIH0gY2F0Y2ggKFByb2Nlc3NpbmdFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGZ1dHVyZS5jb21wbGV0ZUV4Y2VwdGlvbmFsbHkoZXgpOworICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgY2FsbGJhY2suZmFpbHVyZSh0KTsKKyAgICAgICAgICAgIGZ1dHVyZS5jb21wbGV0ZUV4Y2VwdGlvbmFsbHkodCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZ1dHVyZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgLy8gZG8gbm90aGluZworICAgIH0KKworICAgIHByaXZhdGUgQ2xpZW50UmVzcG9uc2UgY3JlYXRlQ2xpZW50UmVzcG9uc2UoZmluYWwgQ2xpZW50UmVxdWVzdCBjbGllbnRSZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSW5NZW1vcnlSZXNwb25zZVdyaXRlciByZXNwb25zZVdyaXRlcikgeworICAgICAgICBmaW5hbCBDbGllbnRSZXNwb25zZSBjbGllbnRSZXNwb25zZSA9IG5ldyBDbGllbnRSZXNwb25zZShyZXNwb25zZVdyaXRlci5nZXRTdGF0dXNJbmZvKCksIGNsaWVudFJlcXVlc3QpOworICAgICAgICBjbGllbnRSZXNwb25zZS5nZXRIZWFkZXJzKCkucHV0QWxsKHJlc3BvbnNlV3JpdGVyLmdldEhlYWRlcnMoKSk7CisgICAgICAgIGNsaWVudFJlc3BvbnNlLnNldEVudGl0eVN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocmVzcG9uc2VXcml0ZXIuZ2V0RW50aXR5KCkpKTsKKyAgICAgICAgcmV0dXJuIGNsaWVudFJlc3BvbnNlOworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJNYWdpY051bWJlciIpCisgICAgcHJpdmF0ZSBDbGllbnRSZXNwb25zZSB0cnlGb2xsb3dSZWRpcmVjdHMoYm9vbGVhbiBmb2xsb3dSZWRpcmVjdHMsIENsaWVudFJlc3BvbnNlIHJlc3BvbnNlLCBDbGllbnRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgaWYgKCFmb2xsb3dSZWRpcmVjdHMpIHsKKyAgICAgICAgICAgIHJldHVybiByZXNwb25zZTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHJlc3BvbnNlLmdldFN0YXR1cygpKSB7CisgICAgICAgICAgICAgICAgY2FzZSAzMDM6CisgICAgICAgICAgICAgICAgY2FzZSAzMDI6CisgICAgICAgICAgICAgICAgY2FzZSAzMDc6CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSBuZXcgQ2xpZW50UmVxdWVzdChyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5zZXRVcmkocmVzcG9uc2UuZ2V0TG9jYXRpb24oKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5nZXRTdGF0dXMoKSA9PSAzMDMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0TWV0aG9kKCJHRVQiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IGFwcGx5KHJlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiAiSmVyc2V5IEluTWVtb3J5IENvbm5lY3RvciI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL2lubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9pbm1lbW9yeS9Jbk1lbW9yeVRlc3RDb250YWluZXJGYWN0b3J5LmphdmEgYi90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L2lubWVtb3J5L0luTWVtb3J5VGVzdENvbnRhaW5lckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGQxMzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL2lubWVtb3J5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9pbm1lbW9yeS9Jbk1lbW9yeVRlc3RDb250YWluZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmlubWVtb3J5OworCitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkRlcGxveW1lbnRDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKKy8qKgorICogSW4tbWVtb3J5IHRlc3QgY29udGFpbmVyIGZhY3RvcnkuCisgKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBJbk1lbW9yeVRlc3RDb250YWluZXJGYWN0b3J5IGltcGxlbWVudHMgVGVzdENvbnRhaW5lckZhY3RvcnkgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSW5NZW1vcnlUZXN0Q29udGFpbmVyIGltcGxlbWVudHMgVGVzdENvbnRhaW5lciB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBVUkkgYmFzZVVyaTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwSGFuZGxlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNCb29sZWFuIHN0YXJ0ZWQgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEluTWVtb3J5VGVzdENvbnRhaW5lci5jbGFzcy5nZXROYW1lKCkpOworCisgICAgICAgIHByaXZhdGUgSW5NZW1vcnlUZXN0Q29udGFpbmVyKGZpbmFsIFVSSSBiYXNlVXJpLCBmaW5hbCBEZXBsb3ltZW50Q29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICB0aGlzLmJhc2VVcmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoYmFzZVVyaSkucGF0aChjb250ZXh0LmdldENvbnRleHRQYXRoKCkpLmJ1aWxkKCk7CisKKyAgICAgICAgICAgIGlmIChMT0dHRVIuaXNMb2dnYWJsZShMZXZlbC5JTkZPKSkgeworICAgICAgICAgICAgICAgIExPR0dFUi5pbmZvKCJDcmVhdGluZyBJbk1lbW9yeVRlc3RDb250YWluZXIgY29uZmlndXJlZCBhdCB0aGUgYmFzZSBVUkkgIiArIHRoaXMuYmFzZVVyaSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMuYXBwSGFuZGxlciA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIoY29udGV4dC5nZXRSZXNvdXJjZUNvbmZpZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ2xpZW50Q29uZmlnIGdldENsaWVudENvbmZpZygpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ2xpZW50Q29uZmlnKCkuY29ubmVjdG9yUHJvdmlkZXIobmV3IEluTWVtb3J5Q29ubmVjdG9yLlByb3ZpZGVyKGJhc2VVcmksIGFwcEhhbmRsZXIpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVVJJIGdldEJhc2VVcmkoKSB7CisgICAgICAgICAgICByZXR1cm4gYmFzZVVyaTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKKyAgICAgICAgICAgIGlmIChzdGFydGVkLmNvbXBhcmVBbmRTZXQoZmFsc2UsIHRydWUpKSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5GSU5FLCAiU3RhcnRpbmcgSW5NZW1vcnlDb250YWluZXIuLi4iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5XQVJOSU5HLCAiSWdub3Jpbmcgc3RhcnQgcmVxdWVzdCAtIEluTWVtb3J5VGVzdENvbnRhaW5lciBpcyBhbHJlYWR5IHN0YXJ0ZWQuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgICAgIGlmIChzdGFydGVkLmNvbXBhcmVBbmRTZXQodHJ1ZSwgZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5GSU5FLCAiU3RvcHBpbmcgSW5NZW1vcnlDb250YWluZXIuLi4iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5XQVJOSU5HLCAiSWdub3Jpbmcgc3RvcCByZXF1ZXN0IC0gSW5NZW1vcnlUZXN0Q29udGFpbmVyIGlzIGFscmVhZHkgc3RvcHBlZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUZXN0Q29udGFpbmVyIGNyZWF0ZShmaW5hbCBVUkkgYmFzZVVyaSwgZmluYWwgRGVwbG95bWVudENvbnRleHQgY29udGV4dCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgSW5NZW1vcnlUZXN0Q29udGFpbmVyKGJhc2VVcmksIGNvbnRleHQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL3Byb3ZpZGVycy9pbm1lbW9yeS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvaW5tZW1vcnkvcGFja2FnZS1pbmZvLmphdmEgYi90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L2lubWVtb3J5L3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YmMyY2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvaW5tZW1vcnkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L2lubWVtb3J5L3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKKy8qKgorICogSmVyc2V5IHRlc3QgZnJhbWV3b3JrIGluLW1lbW9yeSBwcm92aWRlciBjbGFzc2VzLgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuaW5tZW1vcnk7CmRpZmYgLS1naXQgYS90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvaW5tZW1vcnkvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5IGIvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL2lubWVtb3J5L3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGJmZjU5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL2lubWVtb3J5L3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeQpAQCAtMCwwICsxIEBACitvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmlubWVtb3J5LkluTWVtb3J5VGVzdENvbnRhaW5lckZhY3RvcnkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvaW5tZW1vcnkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L2lubWVtb3J5L0luTWVtb3J5Q29udGFpbmVyUGFja2FnZVRlc3QuamF2YSBiL3Rlc3QtZnJhbWV3b3JrL3Byb3ZpZGVycy9pbm1lbW9yeS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvaW5tZW1vcnkvSW5NZW1vcnlDb250YWluZXJQYWNrYWdlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjYmQzMDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvaW5tZW1vcnkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L2lubWVtb3J5L0luTWVtb3J5Q29udGFpbmVyUGFja2FnZVRlc3QuamF2YQpAQCAtMCwwICsxLDkxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuaW5tZW1vcnk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIFBhY2thZ2Ugc2Nhbm5pbmcgdGVzdCBmb3Ige0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuaW5tZW1vcnkuSW5NZW1vcnlDb25uZWN0b3J9LgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqLworcHVibGljIGNsYXNzIEluTWVtb3J5Q29udGFpbmVyUGFja2FnZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgbmV3IGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBJbk1lbW9yeUNvbnRhaW5lclBhY2thZ2VUZXN0KCkgeworICAgICAgICBzdXBlcihuZXcgSW5NZW1vcnlUZXN0Q29udGFpbmVyRmFjdG9yeSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICBSZXNvdXJjZUNvbmZpZyByYyA9IG5ldyBSZXNvdXJjZUNvbmZpZygpOworICAgICAgICByYy5wYWNrYWdlcyh0aGlzLmdldENsYXNzKCkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHJlc291cmNlIGNsYXNzLgorICAgICAqLworICAgIEBQYXRoKCJwYWNrYWdldGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0UmVzb3VyY2UgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUZXN0IHJlc291cmNlIG1ldGhvZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBUZXN0IHNpbXBsZSBzdHJpbmcgcmVzcG9uc2UuCisgICAgICAgICAqLworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U29tZXRoaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJnZXQiOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRlc3QgKHN1YilyZXNvdXJjZSBtZXRob2QuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gU2ltcGxlIHN0cmluZyB0ZXN0IHJlc3BvbnNlLgorICAgICAgICAgKi8KKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgic3ViIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRTdWJSZXNvdXJjZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAic3ViIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluTWVtb3J5Q29ubmVjdG9yR2V0KCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgicGFja2FnZXRlc3QiKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5nZXRTdGF0dXMoKSA9PSAyMDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFN1YigpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3BvbnNlID0gdGFyZ2V0KCJwYWNrYWdldGVzdCIpLnBhdGgoInN1YiIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzdWIiLCByZXNwb25zZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL2lubWVtb3J5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9pbm1lbW9yeS9Jbk1lbW9yeUNvbnRhaW5lclRlc3QuamF2YSBiL3Rlc3QtZnJhbWV3b3JrL3Byb3ZpZGVycy9pbm1lbW9yeS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvaW5tZW1vcnkvSW5NZW1vcnlDb250YWluZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk0ZDVmNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZnJhbWV3b3JrL3Byb3ZpZGVycy9pbm1lbW9yeS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvaW5tZW1vcnkvSW5NZW1vcnlDb250YWluZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5pbm1lbW9yeTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Bc3luY1Jlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5TdXNwZW5kZWQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiBUZXN0IGNsYXNzIGZvciB7QGxpbmsgSW5NZW1vcnlDb25uZWN0b3J9LgorICoKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBJbk1lbW9yeUNvbnRhaW5lclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgbmV3IGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBJbk1lbW9yeUNvbnRhaW5lclRlc3QoKSB7CisgICAgICAgIHN1cGVyKG5ldyBJbk1lbW9yeVRlc3RDb250YWluZXJGYWN0b3J5KCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoVGVzdFJlc291cmNlLmNsYXNzLCBSZXNvdXJjZTE5NTYuY2xhc3MsIFJlc291cmNlMjA5MS5jbGFzcywgUmVzb3VyY2UyMDMwLmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHJlc291cmNlIGNsYXNzLgorICAgICAqLworICAgIEBQYXRoKCJ0ZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RSZXNvdXJjZSB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRlc3QgcmVzb3VyY2UgbWV0aG9kLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFRlc3Qgc2ltcGxlIHN0cmluZyByZXNwb25zZS4KKyAgICAgICAgICovCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRTb21ldGhpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gImdldCI7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3QoU3RyaW5nIGVudGl0eSkgeworICAgICAgICAgICAgcmV0dXJuIGVudGl0eSArICItcG9zdCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJzdWIiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFN1YlJlc291cmNlKCkgeworICAgICAgICAgICAgcmV0dXJuICJzdWIiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5NZW1vcnlDb25uZWN0b3JHZXQoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJ0ZXN0IikucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuZ2V0U3RhdHVzKCkgPT0gMjAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRTdWIoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXNwb25zZSA9IHRhcmdldCgidGVzdCIpLnBhdGgoInN1YiIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzdWIiLCByZXNwb25zZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5NZW1vcnlDb25ubmVjdG9yUG9zdCgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoInRlc3QiKS5yZXF1ZXN0KCkucG9zdCgKKyAgICAgICAgICAgICAgICBFbnRpdHkuZW50aXR5KCJlbnRpdHkiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5nZXRTdGF0dXMoKSA9PSAyMDApOworICAgICAgICBhc3NlcnRFcXVhbHMoImVudGl0eS1wb3N0IiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByb2R1Y2VyIHJlc291cmNlIGZvciBKRVJTRVktMTk1Ni4KKyAgICAgKi8KKyAgICBAUGF0aCgiMTk1NiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZTE5NTYgeworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKyAgICAgICAgQFBhdGgoImdldC1qc29uIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRKc29uKEBDb250ZXh0IEh0dHBIZWFkZXJzIGhlYWRlcnMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgU3RyaW5nIGFnZW50ID0gaGVhZGVycy5nZXRIZWFkZXJTdHJpbmcoSHR0cEhlYWRlcnMuVVNFUl9BR0VOVCk7CisgICAgICAgICAgICByZXR1cm4gIntcImFnZW50XCI6IFwiIiArIGFnZW50ICsgIlwifSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByb2R1Y2VyIHJlc291cmNlIGZvciBKRVJTRVktMjA5MS4KKyAgICAgKi8KKyAgICBAUGF0aCgiMjA5MSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZTIwOTEgeworICAgICAgICBAUE9TVAorICAgICAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgICAgIEBQYXRoKCJwb3N0LWR1bW15LWhlYWRlciIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdEhlYWRlcihAQ29udGV4dCBIdHRwSGVhZGVycyBoZWFkZXJzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiAicG9zdC0iICsgaGVhZGVycy5nZXRIZWFkZXJTdHJpbmcoImR1bW15LWhlYWRlciIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcm9kdWNlciByZXNvdXJjZSBmb3IgSkVSU0VZLTIwMzAuCisgICAgICovCisgICAgQFBhdGgoIjIwMzAiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UyMDMwIHsKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgICAgIHB1YmxpYyB2b2lkIGFzeW5jR2V0KEBTdXNwZW5kZWQgZmluYWwgQXN5bmNSZXNwb25zZSBhc3luY1Jlc3BvbnNlKSB7CisKKyAgICAgICAgICAgIG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDApOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGFzeW5jUmVzcG9uc2UucmVzdW1lKCJyZXN1bWVkIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkuc3RhcnQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJvZHVjZXIgZm9yIEpFUlNFWS0xOTU2LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFjY2VwdE5vdFN0cmlwcGVkKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZTsKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQoIjE5NTYvZ2V0LWpzb24iKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgZXF1YWxUbyhSZXNwb25zZS5TdGF0dXMuTk9UX0FDQ0VQVEFCTEUuZ2V0U3RhdHVzQ29kZSgpKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQoIjE5NTYvZ2V0LWpzb24iKS5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKS5oZWFkZXIoSHR0cEhlYWRlcnMuVVNFUl9BR0VOVCwgInRlc3QiKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgZXF1YWxUbyhSZXNwb25zZS5TdGF0dXMuT0suZ2V0U3RhdHVzQ29kZSgpKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKCJ7XCJhZ2VudFwiOiBcInRlc3RcIn0iKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcm9kdWNlciBmb3IgSkVSU0VZLTIwOTEuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVhZGVyc01ha2VJdFRocm91Z2hGb3JFbnRpdHlMZXNzUmVxdWVzdCgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPQorICAgICAgICAgICAgICAgIHRhcmdldCgiMjA5MS9wb3N0LWR1bW15LWhlYWRlciIpLnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfUExBSU4pLmhlYWRlcigiZHVtbXktaGVhZGVyIiwgImJ1bW1lciIpLnBvc3QobnVsbCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oUmVzcG9uc2UuU3RhdHVzLk9LLmdldFN0YXR1c0NvZGUoKSkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbygicG9zdC1idW1tZXIiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcm9kdWNlciBmb3IgSkVSU0VZLTIwMzAuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNNZXRob2RzTm90U3VwcG9ydGVkKCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGFyZ2V0KCIyMDMwIikucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9QTEFJTikuZ2V0KCk7CisgICAgICAgICAgICBmYWlsKCJQcm9jZXNzaW5nRXhjZXB0aW9uIGV4cGVjdGVkLiIpOworICAgICAgICB9IGNhdGNoIChQcm9jZXNzaW5nRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGV4LmdldFN0YWNrVHJhY2UoKVswXS5nZXRDbGFzc05hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgZXF1YWxUbyhJbk1lbW9yeUNvbm5lY3Rvci5Jbk1lbW9yeVJlc3BvbnNlV3JpdGVyLmNsYXNzLmdldE5hbWUoKSkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL2lubWVtb3J5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9pbm1lbW9yeS9pbnRlcm5hbC9Gb2xsb3dSZWRpcmVjdHNUZXN0LmphdmEgYi90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvaW5tZW1vcnkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L2lubWVtb3J5L2ludGVybmFsL0ZvbGxvd1JlZGlyZWN0c1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzBjOWI4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL2lubWVtb3J5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9pbm1lbW9yeS9pbnRlcm5hbC9Gb2xsb3dSZWRpcmVjdHNUZXN0LmphdmEKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5pbm1lbW9yeS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlc3BvbnNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVzcG9uc2VGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogSW4tbWVtb3J5IGNvbm5lY3RvciBmb2xsb3cgcmVkaXJlY3QgdGVzdHMuCisgKgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgRm9sbG93UmVkaXJlY3RzVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworICAgIEBQYXRoKCIvZm9sbG93VGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZWRpcmVjdFJlc291cmNlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiR0VUIjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInJlZGlyZWN0MSIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSByZWRpcmVjdDEoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDMwMikubG9jYXRpb24oCisgICAgICAgICAgICAgICAgICAgIFVyaUJ1aWxkZXIuZnJvbVJlc291cmNlKFJlZGlyZWN0UmVzb3VyY2UuY2xhc3MpLnBhdGgoUmVkaXJlY3RSZXNvdXJjZS5jbGFzcywgInJlZGlyZWN0MiIpLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgicmVkaXJlY3QyIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHJlZGlyZWN0MigpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoMzAyKS5sb2NhdGlvbihVcmlCdWlsZGVyLmZyb21SZXNvdXJjZShSZWRpcmVjdFJlc291cmNlLmNsYXNzKS5idWlsZCgpKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZWRpcmVjdFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJlZGlyZWN0VGVzdEZpbHRlciBpbXBsZW1lbnRzIENsaWVudFJlc3BvbnNlRmlsdGVyIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT0xWRURfVVJJX0hFQURFUiA9ICJyZXNvbHZlZC11cmkiOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ2xpZW50UmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsIENsaWVudFJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAocmVzcG9uc2VDb250ZXh0IGluc3RhbmNlb2YgQ2xpZW50UmVzcG9uc2UpIHsKKyAgICAgICAgICAgICAgICBDbGllbnRSZXNwb25zZSBjbGllbnRSZXNwb25zZSA9IChDbGllbnRSZXNwb25zZSkgcmVzcG9uc2VDb250ZXh0OworICAgICAgICAgICAgICAgIHJlc3BvbnNlQ29udGV4dC5nZXRIZWFkZXJzKCkucHV0U2luZ2xlKFJFU09MVkVEX1VSSV9IRUFERVIsIGNsaWVudFJlc3BvbnNlLmdldFJlc29sdmVkUmVxdWVzdFVyaSgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG9Gb2xsb3coKSB7CisgICAgICAgIFJlc3BvbnNlIHIgPSB0YXJnZXQoImZvbGxvd1Rlc3QvcmVkaXJlY3QxIikucmVnaXN0ZXIoUmVkaXJlY3RUZXN0RmlsdGVyLmNsYXNzKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHIuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCIsIHIucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgIFVyaUJ1aWxkZXIuZnJvbVVyaShnZXRCYXNlVXJpKCkpLnBhdGgoUmVkaXJlY3RSZXNvdXJjZS5jbGFzcykuYnVpbGQoKS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgIHIuZ2V0SGVhZGVyU3RyaW5nKFJlZGlyZWN0VGVzdEZpbHRlci5SRVNPTFZFRF9VUklfSEVBREVSKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG9udEZvbGxvdygpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHQgPSB0YXJnZXQoImZvbGxvd1Rlc3QvcmVkaXJlY3QxIik7CisgICAgICAgIHQucHJvcGVydHkoQ2xpZW50UHJvcGVydGllcy5GT0xMT1dfUkVESVJFQ1RTLCBmYWxzZSk7CisgICAgICAgIGFzc2VydEVxdWFscygzMDIsIHQucmVxdWVzdCgpLmdldCgpLmdldFN0YXR1cygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvamRrLWh0dHAvcG9tLnhtbCBiL3Rlc3QtZnJhbWV3b3JrL3Byb3ZpZGVycy9qZGstaHR0cC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3N2JlZDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvamRrLWh0dHAvcG9tLnhtbApAQCAtMCwwICsxLDU4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1qZGstaHR0cDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1qZGstaHR0cDwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgVGVzdCBGcmFtZXdvcmsgLSBKREsgSFRUUCBjb250YWluZXI8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yazwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItamRrLWh0dHA8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXNlcnZlcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY2xpZW50PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8L2RlcGVuZGVuY2llcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL3Byb3ZpZGVycy9qZGstaHR0cC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvamRraHR0cC9KZGtIdHRwU2VydmVyVGVzdENvbnRhaW5lckZhY3RvcnkuamF2YSBiL3Rlc3QtZnJhbWV3b3JrL3Byb3ZpZGVycy9qZGstaHR0cC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvamRraHR0cC9KZGtIdHRwU2VydmVyVGVzdENvbnRhaW5lckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTIyZDJlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL2pkay1odHRwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9qZGtodHRwL0pka0h0dHBTZXJ2ZXJUZXN0Q29udGFpbmVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuamRraHR0cDsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lmpka2h0dHAuSmRrSHR0cFNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5EZXBsb3ltZW50Q29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RIZWxwZXI7CisKK2ltcG9ydCBjb20uc3VuLm5ldC5odHRwc2VydmVyLkh0dHBTZXJ2ZXI7CisKKy8qKgorICogRmFjdG9yeSBmb3IgdGVzdGluZyB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamRraHR0cC5KZGtIdHRwSGFuZGxlckNvbnRhaW5lcn0uCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEpka0h0dHBTZXJ2ZXJUZXN0Q29udGFpbmVyRmFjdG9yeSBpbXBsZW1lbnRzIFRlc3RDb250YWluZXJGYWN0b3J5IHsKKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEpka0h0dHBTZXJ2ZXJUZXN0Q29udGFpbmVyIGltcGxlbWVudHMgVGVzdENvbnRhaW5lciB7CisKKyAgICAgICAgcHJpdmF0ZSBVUkkgYmFzZVVyaTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBIdHRwU2VydmVyIHNlcnZlcjsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNCb29sZWFuIHN0YXJ0ZWQgPSBuZXcgQXRvbWljQm9vbGVhbihmYWxzZSk7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEpka0h0dHBTZXJ2ZXJUZXN0Q29udGFpbmVyLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICAgICAgcHJpdmF0ZSBKZGtIdHRwU2VydmVyVGVzdENvbnRhaW5lcihmaW5hbCBVUkkgYmFzZVVyaSwgZmluYWwgRGVwbG95bWVudENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgdGhpcy5iYXNlVXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKGJhc2VVcmkpLnBhdGgoY29udGV4dC5nZXRDb250ZXh0UGF0aCgpKS5idWlsZCgpOworCisgICAgICAgICAgICBpZiAoTE9HR0VSLmlzTG9nZ2FibGUoTGV2ZWwuSU5GTykpIHsKKyAgICAgICAgICAgICAgICBMT0dHRVIuaW5mbygiQ3JlYXRpbmcgSmRrSHR0cFNlcnZlclRlc3RDb250YWluZXIgY29uZmlndXJlZCBhdCB0aGUgYmFzZSBVUkkgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBUZXN0SGVscGVyLnplcm9Qb3J0VG9BdmFpbGFibGVQb3J0KGJhc2VVcmkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy5zZXJ2ZXIgPSBKZGtIdHRwU2VydmVyRmFjdG9yeS5jcmVhdGVIdHRwU2VydmVyKHRoaXMuYmFzZVVyaSwgY29udGV4dC5nZXRSZXNvdXJjZUNvbmZpZygpLCBmYWxzZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENsaWVudENvbmZpZyBnZXRDbGllbnRDb25maWcoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVVJJIGdldEJhc2VVcmkoKSB7CisgICAgICAgICAgICByZXR1cm4gYmFzZVVyaTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKKyAgICAgICAgICAgIGlmIChzdGFydGVkLmNvbXBhcmVBbmRTZXQoZmFsc2UsIHRydWUpKSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5GSU5FLCAiU3RhcnRpbmcgSmRrSHR0cFNlcnZlclRlc3RDb250YWluZXIuLi4iKTsKKyAgICAgICAgICAgICAgICBzZXJ2ZXIuc3RhcnQoKTsKKworICAgICAgICAgICAgICAgIGlmIChiYXNlVXJpLmdldFBvcnQoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJhc2VVcmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoYmFzZVVyaSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAucG9ydChzZXJ2ZXIuZ2V0QWRkcmVzcygpLmdldFBvcnQoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5JTkZPLCAiU3RhcnRlZCBKZGtIdHRwU2VydmVyVGVzdENvbnRhaW5lciBhdCB0aGUgYmFzZSBVUkkgIiArIGJhc2VVcmkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5XQVJOSU5HLCAiSWdub3Jpbmcgc3RhcnQgcmVxdWVzdCAtIEpka0h0dHBTZXJ2ZXJUZXN0Q29udGFpbmVyIGlzIGFscmVhZHkgc3RhcnRlZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzdG9wKCkgeworICAgICAgICAgICAgaWYgKHN0YXJ0ZWQuY29tcGFyZUFuZFNldCh0cnVlLCBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLkZJTkUsICJTdG9wcGluZyBKZGtIdHRwU2VydmVyVGVzdENvbnRhaW5lci4uLiIpOworICAgICAgICAgICAgICAgIHRoaXMuc2VydmVyLnN0b3AoMyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuV0FSTklORywgIklnbm9yaW5nIHN0b3AgcmVxdWVzdCAtIEpka0h0dHBTZXJ2ZXJUZXN0Q29udGFpbmVyIGlzIGFscmVhZHkgc3RvcHBlZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUZXN0Q29udGFpbmVyIGNyZWF0ZShmaW5hbCBVUkkgYmFzZVVyaSwgZmluYWwgRGVwbG95bWVudENvbnRleHQgY29udGV4dCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgSmRrSHR0cFNlcnZlclRlc3RDb250YWluZXIoYmFzZVVyaSwgY29udGV4dCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL2pkay1odHRwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9qZGtodHRwL3BhY2thZ2UtaW5mby5qYXZhIGIvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL2pkay1odHRwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9qZGtodHRwL3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliMWUzZmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvamRrLWh0dHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L2pka2h0dHAvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoqCisgKiBKZXJzZXkgdGVzdCBmcmFtZXdvcmsgZm9yIEpESyBIdHRwU2VydmVyIENvbnRhaW5lci4KKyAqLworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0Lmpka2h0dHA7CmRpZmYgLS1naXQgYS90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvamRrLWh0dHAvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5IGIvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL2pkay1odHRwL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzE3NTNiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL2pkay1odHRwL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeQpAQCAtMCwwICsxIEBACitvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0Lmpka2h0dHAuSmRrSHR0cFNlcnZlclRlc3RDb250YWluZXJGYWN0b3J5ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL2pkay1odHRwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9qZGtodHRwL0F2YWlsYWJsZVBvcnRKZGtIdHRwU2VydmVyVGVzdC5qYXZhIGIvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL2pkay1odHRwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9qZGtodHRwL0F2YWlsYWJsZVBvcnRKZGtIdHRwU2VydmVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZmM5OGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvamRrLWh0dHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L2pka2h0dHAvQXZhaWxhYmxlUG9ydEpka0h0dHBTZXJ2ZXJUZXN0LmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0Lmpka2h0dHA7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkRlcGxveW1lbnRDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5ub3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogVGVzdHMgZmluZGluZyBhbiBhdmFpbGFibGUgcG9ydCBmb3IgY29udGFpbmVyLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgQXZhaWxhYmxlUG9ydEpka0h0dHBTZXJ2ZXJUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB7CisgICAgICAgIHJldHVybiBuZXcgSmRrSHR0cFNlcnZlclRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFBhdGgoIkF2YWlsYWJsZVBvcnRKZGtIdHRwU2VydmVyVGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0UmVzb3VyY2UgeworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJHRVQiOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIERlcGxveW1lbnRDb250ZXh0IGNvbmZpZ3VyZURlcGxveW1lbnQoKSB7CisgICAgICAgIGZvcmNlU2V0KFRlc3RQcm9wZXJ0aWVzLkNPTlRBSU5FUl9QT1JULCAiMCIpOworCisgICAgICAgIHJldHVybiBEZXBsb3ltZW50Q29udGV4dC5idWlsZGVyKG5ldyBSZXNvdXJjZUNvbmZpZyhUZXN0UmVzb3VyY2UuY2xhc3MpKS5idWlsZCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldCgpIHsKKyAgICAgICAgYXNzZXJ0VGhhdCh0YXJnZXQoKS5nZXRVcmkoKS5nZXRQb3J0KCksIG5vdCgwKSk7CisgICAgICAgIGFzc2VydFRoYXQoZ2V0QmFzZVVyaSgpLmdldFBvcnQoKSwgbm90KDApKTsKKworICAgICAgICBhc3NlcnRUaGF0KHRhcmdldCgiQXZhaWxhYmxlUG9ydEpka0h0dHBTZXJ2ZXJUZXN0IikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKCJHRVQiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL2pkay1odHRwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9qZGtodHRwL0pka0h0dHBTZXJ2ZXJDb250YWluZXJUZXN0LmphdmEgYi90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvamRrLWh0dHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L2pka2h0dHAvSmRrSHR0cFNlcnZlckNvbnRhaW5lclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzlkZGU5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL2pkay1odHRwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9qZGtodHRwL0pka0h0dHBTZXJ2ZXJDb250YWluZXJUZXN0LmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0Lmpka2h0dHA7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamRraHR0cC5KZGtIdHRwSGFuZGxlckNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3QgY2xhc3MgZm9yIHtAbGluayBKZGtIdHRwSGFuZGxlckNvbnRhaW5lcn0uCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgY2xhc3MgSmRrSHR0cFNlcnZlckNvbnRhaW5lclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgbmV3IGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBKZGtIdHRwU2VydmVyQ29udGFpbmVyVGVzdCgpIHsKKyAgICAgICAgc3VwZXIobmV3IEpka0h0dHBTZXJ2ZXJUZXN0Q29udGFpbmVyRmFjdG9yeSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHJlc291cmNlIGNsYXNzLgorICAgICAqLworICAgIEBQYXRoKCJvbmUiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUZXN0IHJlc291cmNlIG1ldGhvZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBUZXN0IHNpbXBsZSBzdHJpbmcgcmVzcG9uc2UuCisgICAgICAgICAqLworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U29tZXRoaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJnZXQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICAvKioKKyAgICAgKiBUZXN0IHtAbGluayBIdHRwU2VydmVyIEpESyBIdHRwU2VydmVyfSBjb250YWluZXIuCisgICAgICovCisgICAgcHVibGljIHZvaWQgdGVzdEpka0h0dHBTZXJ2ZXJDb250YWluZXJUYXJnZXQoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgib25lIikucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydEVxdWFscygiUmVzcG9uc2Ugc3RhdHVzIHVuZXhwZWN0ZWQuIiwgMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiUmVzcG9uc2UgZW50aXR5IHVuZXhwZWN0ZWQuIiwgImdldCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL2pldHR5L3BvbS54bWwgYi90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvamV0dHkvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZGVkZjYzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL2pldHR5L3BvbS54bWwKQEAgLTAsMCArMSw1OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8cGFyZW50PgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWpldHR5PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWpldHR5PC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPkplcnNleSBUZXN0IEZyYW1ld29yayAtIEpldHR5IEhUVFAgY29udGFpbmVyPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcms8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLWpldHR5LWh0dHA8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+dGVzdHNTa2lwSmRrNjwvaWQ+CisgICAgICAgICAgICA8YWN0aXZhdGlvbj4KKyAgICAgICAgICAgICAgICA8amRrPjEuNjwvamRrPgorICAgICAgICAgICAgPC9hY3RpdmF0aW9uPgorICAgICAgICAgICAgPHByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgPHNraXAudGVzdHM+dHJ1ZTwvc2tpcC50ZXN0cz4KKyAgICAgICAgICAgIDwvcHJvcGVydGllcz4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL3Byb3ZpZGVycy9qZXR0eS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvamV0dHkvSmV0dHlUZXN0Q29udGFpbmVyRmFjdG9yeS5qYXZhIGIvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL2pldHR5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9qZXR0eS9KZXR0eVRlc3RDb250YWluZXJGYWN0b3J5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzUwNjczNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZnJhbWV3b3JrL3Byb3ZpZGVycy9qZXR0eS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvamV0dHkvSmV0dHlUZXN0Q29udGFpbmVyRmFjdG9yeS5qYXZhCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuamV0dHk7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0eS5KZXR0eUh0dHBDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuRGVwbG95bWVudENvbnRleHQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RIZWxwZXI7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZXR0eS5zZXJ2ZXIuQ29ubmVjdG9yOworaW1wb3J0IG9yZy5lY2xpcHNlLmpldHR5LnNlcnZlci5TZXJ2ZXI7CitpbXBvcnQgb3JnLmVjbGlwc2UuamV0dHkuc2VydmVyLlNlcnZlckNvbm5lY3RvcjsKKworLyoqCisgKiBGYWN0b3J5IGZvciB0ZXN0aW5nIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0eS5KZXR0eUh0dHBDb250YWluZXJ9LgorICoKKyAqIEBhdXRob3IgQXJ1bCBEaGVzaWFzZWVsYW4gKGFydWxkQGFjbS5vcmcpCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSmV0dHlUZXN0Q29udGFpbmVyRmFjdG9yeSBpbXBsZW1lbnRzIFRlc3RDb250YWluZXJGYWN0b3J5IHsKKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEpldHR5VGVzdENvbnRhaW5lciBpbXBsZW1lbnRzIFRlc3RDb250YWluZXIgeworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEpldHR5VGVzdENvbnRhaW5lci5jbGFzcy5nZXROYW1lKCkpOworCisgICAgICAgIHByaXZhdGUgVVJJIGJhc2VVcmk7CisgICAgICAgIHByaXZhdGUgZmluYWwgU2VydmVyIHNlcnZlcjsKKworICAgICAgICBwcml2YXRlIEpldHR5VGVzdENvbnRhaW5lcihmaW5hbCBVUkkgYmFzZVVyaSwgZmluYWwgRGVwbG95bWVudENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgZmluYWwgVVJJIGJhc2UgPSBVcmlCdWlsZGVyLmZyb21VcmkoYmFzZVVyaSkucGF0aChjb250ZXh0LmdldENvbnRleHRQYXRoKCkpLmJ1aWxkKCk7CisKKyAgICAgICAgICAgIGlmICghIi8iLmVxdWFscyhiYXNlLmdldFJhd1BhdGgoKSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVGVzdENvbnRhaW5lckV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBkZXBsb3kgb24gJXMuIEpldHR5IEhUVFAgY29udGFpbmVyIG9ubHkgc3VwcG9ydHMgZGVwbG95bWVudCBvbiByb290IHBhdGguIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UuZ2V0UmF3UGF0aCgpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMuYmFzZVVyaSA9IGJhc2U7CisKKyAgICAgICAgICAgIGlmIChMT0dHRVIuaXNMb2dnYWJsZShMZXZlbC5JTkZPKSkgeworICAgICAgICAgICAgICAgIExPR0dFUi5pbmZvKCJDcmVhdGluZyBKZXR0eVRlc3RDb250YWluZXIgY29uZmlndXJlZCBhdCB0aGUgYmFzZSBVUkkgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyBUZXN0SGVscGVyLnplcm9Qb3J0VG9BdmFpbGFibGVQb3J0KGJhc2VVcmkpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGhpcy5zZXJ2ZXIgPSBKZXR0eUh0dHBDb250YWluZXJGYWN0b3J5LmNyZWF0ZVNlcnZlcih0aGlzLmJhc2VVcmksIGNvbnRleHQuZ2V0UmVzb3VyY2VDb25maWcoKSwgZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDbGllbnRDb25maWcgZ2V0Q2xpZW50Q29uZmlnKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFVSSSBnZXRCYXNlVXJpKCkgeworICAgICAgICAgICAgcmV0dXJuIGJhc2VVcmk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc3RhcnQoKSB7CisgICAgICAgICAgICBpZiAoc2VydmVyLmlzU3RhcnRlZCgpKSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5XQVJOSU5HLCAiSWdub3Jpbmcgc3RhcnQgcmVxdWVzdCAtIEpldHR5VGVzdENvbnRhaW5lciBpcyBhbHJlYWR5IHN0YXJ0ZWQuIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuRklORSwgIlN0YXJ0aW5nIEpldHR5VGVzdENvbnRhaW5lci4uLiIpOworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHNlcnZlci5zdGFydCgpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChiYXNlVXJpLmdldFBvcnQoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9ydCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIENvbm5lY3RvciBjb25uZWN0b3IgOiBzZXJ2ZXIuZ2V0Q29ubmVjdG9ycygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbm5lY3RvciBpbnN0YW5jZW9mIFNlcnZlckNvbm5lY3RvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3J0ID0gKChTZXJ2ZXJDb25uZWN0b3IpIGNvbm5lY3RvcikuZ2V0TG9jYWxQb3J0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgYmFzZVVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaShiYXNlVXJpKS5wb3J0KHBvcnQpLmJ1aWxkKCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuSU5GTywgIlN0YXJ0ZWQgSmV0dHlUZXN0Q29udGFpbmVyIGF0IHRoZSBiYXNlIFVSSSAiICsgYmFzZVVyaSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVGVzdENvbnRhaW5lckV4Y2VwdGlvbihlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgICAgIGlmIChzZXJ2ZXIuaXNTdGFydGVkKCkpIHsKKyAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLkZJTkUsICJTdG9wcGluZyBKZXR0eVRlc3RDb250YWluZXIuLi4iKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICB0aGlzLnNlcnZlci5zdG9wKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuV0FSTklORywgIkVycm9yIFN0b3BwaW5nIEpldHR5VGVzdENvbnRhaW5lci4uLiIsIGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuV0FSTklORywgIklnbm9yaW5nIHN0b3AgcmVxdWVzdCAtIEpldHR5VGVzdENvbnRhaW5lciBpcyBhbHJlYWR5IHN0b3BwZWQuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgVGVzdENvbnRhaW5lciBjcmVhdGUoZmluYWwgVVJJIGJhc2VVcmksIGZpbmFsIERlcGxveW1lbnRDb250ZXh0IGNvbnRleHQpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEpldHR5VGVzdENvbnRhaW5lcihiYXNlVXJpLCBjb250ZXh0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvamV0dHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L2pldHR5L3BhY2thZ2UtaW5mby5qYXZhIGIvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL2pldHR5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9qZXR0eS9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWYxMDdkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL2pldHR5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9qZXR0eS9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvKioKKyAqIEplcnNleSB0ZXN0IGZyYW1ld29yayBmb3IgSmV0dHkgSHR0cCBDb250YWluZXIuCisgKi8KK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5qZXR0eTsKZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL3Byb3ZpZGVycy9qZXR0eS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3RvcnkgYi90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvamV0dHkvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1MzNlOTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvamV0dHkvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5CkBAIC0wLDAgKzEgQEAKK29yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuamV0dHkuSmV0dHlUZXN0Q29udGFpbmVyRmFjdG9yeQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL3Byb3ZpZGVycy9qZXR0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvamV0dHkvQXZhaWxhYmxlUG9ydEpldHR5VGVzdC5qYXZhIGIvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL2pldHR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9qZXR0eS9BdmFpbGFibGVQb3J0SmV0dHlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZmNTg3ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZnJhbWV3b3JrL3Byb3ZpZGVycy9qZXR0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvamV0dHkvQXZhaWxhYmxlUG9ydEpldHR5VGVzdC5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5qZXR0eTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuRGVwbG95bWVudENvbnRleHQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLm5vdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBUZXN0cyBmaW5kaW5nIGFuIGF2YWlsYWJsZSBwb3J0IGZvciBjb250YWluZXIuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBBdmFpbGFibGVQb3J0SmV0dHlUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB7CisgICAgICAgIHJldHVybiBuZXcgSmV0dHlUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBQYXRoKCJBdmFpbGFibGVQb3J0SmV0dHlUZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RSZXNvdXJjZSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gIkdFVCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgRGVwbG95bWVudENvbnRleHQgY29uZmlndXJlRGVwbG95bWVudCgpIHsKKyAgICAgICAgZm9yY2VTZXQoVGVzdFByb3BlcnRpZXMuQ09OVEFJTkVSX1BPUlQsICIwIik7CisKKyAgICAgICAgcmV0dXJuIERlcGxveW1lbnRDb250ZXh0LmJ1aWxkZXIobmV3IFJlc291cmNlQ29uZmlnKFRlc3RSZXNvdXJjZS5jbGFzcykpLmJ1aWxkKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgeworICAgICAgICBhc3NlcnRUaGF0KHRhcmdldCgpLmdldFVyaSgpLmdldFBvcnQoKSwgbm90KDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChnZXRCYXNlVXJpKCkuZ2V0UG9ydCgpLCBub3QoMCkpOworCisgICAgICAgIGFzc2VydFRoYXQodGFyZ2V0KCJBdmFpbGFibGVQb3J0SmV0dHlUZXN0IikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKCJHRVQiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL2pldHR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9qZXR0eS9KZXR0eUNvbnRhaW5lclRlc3QuamF2YSBiL3Rlc3QtZnJhbWV3b3JrL3Byb3ZpZGVycy9qZXR0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvamV0dHkvSmV0dHlDb250YWluZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMxYTk1MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZnJhbWV3b3JrL3Byb3ZpZGVycy9qZXR0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvamV0dHkvSmV0dHlDb250YWluZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5qZXR0eTsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuaGsyLkRlbGF5ZWRIazJJbmplY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5oazIuSW1tZWRpYXRlSGsySW5qZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0eS5KZXR0eUh0dHBDb250YWluZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dHkuSmV0dHlIdHRwQ29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIuYXBpLlNlcnZpY2VMb2NhdG9yOworCitpbXBvcnQgb3JnLmp2bmV0LmhrMi5pbnRlcm5hbC5TZXJ2aWNlTG9jYXRvckltcGw7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5qZXR0eS5zZXJ2ZXIuU2VydmVyOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIFRlc3QgY2xhc3MgZm9yIHtAbGluayBKZXR0eUh0dHBDb250YWluZXJ9LgorICoKKyAqIEBhdXRob3IgQXJ1bCBEaGVzaWFzZWVsYW4gKGFydWxkIGF0IGFjbSBvcmcpCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBKZXR0eUNvbnRhaW5lclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgbmV3IGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBKZXR0eUNvbnRhaW5lclRlc3QoKSB7CisgICAgICAgIHN1cGVyKG5ldyBKZXR0eVRlc3RDb250YWluZXJGYWN0b3J5KCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgcmVzb3VyY2UgY2xhc3MuCisgICAgICovCisgICAgQFBhdGgoIm9uZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRlc3QgcmVzb3VyY2UgbWV0aG9kLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFRlc3Qgc2ltcGxlIHN0cmluZyByZXNwb25zZS4KKyAgICAgICAgICovCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRTb21ldGhpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gImdldCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIC8qKgorICAgICAqIFRlc3Qge0BsaW5rIFNlcnZlciBKZXR0eSBTZXJ2ZXJ9IGNvbnRhaW5lci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0SmV0dHlDb250YWluZXJUYXJnZXQoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgib25lIikucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydEVxdWFscygiUmVzcG9uc2Ugc3RhdHVzIHVuZXhwZWN0ZWQuIiwgMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiUmVzcG9uc2UgZW50aXR5IHVuZXhwZWN0ZWQuIiwgImdldCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0aGF0IGRlZmluZWQgU2VydmljZUxvY2F0b3IgYmVjb21lcyBhIHBhcmVudCBvZiB0aGUgbmV3bHkgY3JlYXRlZCBzZXJ2aWNlIGxvY2F0b3IuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyZW50U2VydmljZUxvY2F0b3IoKSB7CisgICAgICAgIGZpbmFsIFNlcnZpY2VMb2NhdG9yIGxvY2F0b3IgPSBuZXcgU2VydmljZUxvY2F0b3JJbXBsKCJNeVNlcnZpY2VMb2NhdG9yIiwgbnVsbCk7CisgICAgICAgIGZpbmFsIFNlcnZlciBzZXJ2ZXIgPSBKZXR0eUh0dHBDb250YWluZXJGYWN0b3J5LmNyZWF0ZVNlcnZlcihVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0Ojk4NzYiKSwKKyAgICAgICAgICAgICAgICBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MpLCBmYWxzZSwgbG9jYXRvcik7CisgICAgICAgIEpldHR5SHR0cENvbnRhaW5lciBjb250YWluZXIgPSAoSmV0dHlIdHRwQ29udGFpbmVyKSBzZXJ2ZXIuZ2V0SGFuZGxlcigpOworICAgICAgICBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIgPSBjb250YWluZXIuZ2V0QXBwbGljYXRpb25IYW5kbGVyKCkuZ2V0SW5qZWN0aW9uTWFuYWdlcigpOworCisgICAgICAgIFNlcnZpY2VMb2NhdG9yIHNlcnZpY2VMb2NhdG9yOworICAgICAgICBpZiAoaW5qZWN0aW9uTWFuYWdlciBpbnN0YW5jZW9mIEltbWVkaWF0ZUhrMkluamVjdGlvbk1hbmFnZXIpIHsKKyAgICAgICAgICAgIHNlcnZpY2VMb2NhdG9yID0gKChJbW1lZGlhdGVIazJJbmplY3Rpb25NYW5hZ2VyKSBpbmplY3Rpb25NYW5hZ2VyKS5nZXRTZXJ2aWNlTG9jYXRvcigpOworICAgICAgICB9IGVsc2UgaWYgKGluamVjdGlvbk1hbmFnZXIgaW5zdGFuY2VvZiBEZWxheWVkSGsySW5qZWN0aW9uTWFuYWdlcikgeworICAgICAgICAgICAgc2VydmljZUxvY2F0b3IgPSAoKERlbGF5ZWRIazJJbmplY3Rpb25NYW5hZ2VyKSBpbmplY3Rpb25NYW5hZ2VyKS5nZXRTZXJ2aWNlTG9jYXRvcigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkludmFsaWQgSGsyIEluamVjdGlvbk1hbmFnZXIiKTsKKyAgICAgICAgfQorICAgICAgICBhc3NlcnRUcnVlKCJBcHBsaWNhdGlvbiBpbmplY3Rpb24gbWFuYWdlciB3YXMgZXhwZWN0ZWQgdG8gaGF2ZSBkZWZpbmVkIHBhcmVudCBsb2NhdG9yIiwKKyAgICAgICAgICAgICAgICAgICBzZXJ2aWNlTG9jYXRvci5nZXRQYXJlbnQoKSA9PSBsb2NhdG9yKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvbmV0dHkvcG9tLnhtbCBiL3Rlc3QtZnJhbWV3b3JrL3Byb3ZpZGVycy9uZXR0eS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2NzcwYWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvbmV0dHkvcG9tLnhtbApAQCAtMCwwICsxLDQ3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE2LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1uZXR0eTwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1uZXR0eTwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgVGVzdCBGcmFtZXdvcmsgLSBOZXR0eSBjb250YWluZXI8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yazwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItbmV0dHktaHR0cDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL25ldHR5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9uZXR0eS9OZXR0eVRlc3RDb250YWluZXJGYWN0b3J5LmphdmEgYi90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvbmV0dHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L25ldHR5L05ldHR5VGVzdENvbnRhaW5lckZhY3RvcnkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzdmZTBiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL25ldHR5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9uZXR0eS9OZXR0eVRlc3RDb250YWluZXJGYWN0b3J5LmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0Lm5ldHR5OworCitpbXBvcnQgamF2YS5uZXQuVVJJOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgaW8ubmV0dHkuY2hhbm5lbC5DaGFubmVsOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubmV0dHkuaHR0cHNlcnZlci5OZXR0eUh0dHBDb250YWluZXJQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkRlcGxveW1lbnRDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKKy8qKgorICogTmV0dHkgdGVzdCBjb250YWluZXIgZmFjdG9yeS4KKyAqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgTmV0dHlUZXN0Q29udGFpbmVyRmFjdG9yeSBpbXBsZW1lbnRzIFRlc3RDb250YWluZXJGYWN0b3J5IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUZXN0Q29udGFpbmVyIGNyZWF0ZShVUkkgYmFzZVVyaSwgRGVwbG95bWVudENvbnRleHQgZGVwbG95bWVudENvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBOZXR0eVRlc3RDb250YWluZXIoYmFzZVVyaSwgZGVwbG95bWVudENvbnRleHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIE5ldHR5IFRlc3QgQ29udGFpbmVyLgorICAgICAqIDxwPgorICAgICAqIEFsbCBmdW5jdGlvbmFsaXR5IGlzIGRlZmVycmVkIHRvIHtAbGluayBOZXR0eUh0dHBDb250YWluZXJQcm92aWRlcn0uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTmV0dHlUZXN0Q29udGFpbmVyIGltcGxlbWVudHMgVGVzdENvbnRhaW5lciB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBVUkkgYmFzZVVyaTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBEZXBsb3ltZW50Q29udGV4dCBkZXBsb3ltZW50Q29udGV4dDsKKworICAgICAgICBwcml2YXRlIHZvbGF0aWxlIENoYW5uZWwgc2VydmVyOworCisgICAgICAgIE5ldHR5VGVzdENvbnRhaW5lcihVUkkgYmFzZVVyaSwgRGVwbG95bWVudENvbnRleHQgZGVwbG95bWVudENvbnRleHQpIHsKKyAgICAgICAgICAgIHRoaXMuYmFzZVVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaShiYXNlVXJpKS5wYXRoKGRlcGxveW1lbnRDb250ZXh0LmdldENvbnRleHRQYXRoKCkpLmJ1aWxkKCk7CisgICAgICAgICAgICB0aGlzLmRlcGxveW1lbnRDb250ZXh0ID0gZGVwbG95bWVudENvbnRleHQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENsaWVudENvbmZpZyBnZXRDbGllbnRDb25maWcoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVVJJIGdldEJhc2VVcmkoKSB7CisgICAgICAgICAgICByZXR1cm4gYmFzZVVyaTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKKyAgICAgICAgICAgIHNlcnZlciA9IE5ldHR5SHR0cENvbnRhaW5lclByb3ZpZGVyLmNyZWF0ZVNlcnZlcihnZXRCYXNlVXJpKCksIGRlcGxveW1lbnRDb250ZXh0LmdldFJlc291cmNlQ29uZmlnKCksIGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzdG9wKCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzZXJ2ZXIuY2xvc2UoKS5zeW5jKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL3Byb3ZpZGVycy9uZXR0eS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3RvcnkgYi90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvbmV0dHkvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YzU0NGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvbmV0dHkvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5CkBAIC0wLDAgKzEgQEAKK29yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QubmV0dHkuTmV0dHlUZXN0Q29udGFpbmVyRmFjdG9yeQpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL3BvbS54bWwgYi90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTJhNzZjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL3BvbS54bWwKQEAgLTAsMCArMSw0NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcms8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlcnM8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+SmVyc2V5IHRlc3QgZnJhbWV3b3JrIHByb3ZpZGVycyB1bWJyZWxsYSBwcm9qZWN0PC9kZXNjcmlwdGlvbj4KKworICAgIDxtb2R1bGVzPgorICAgICAgICA8bW9kdWxlPmJ1bmRsZTwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmV4dGVybmFsPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+Z3JpenpseTI8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5pbm1lbW9yeTwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmpldHR5PC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+amRrLWh0dHA8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5uZXR0eTwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnNpbXBsZTwvbW9kdWxlPgorICAgIDwvbW9kdWxlcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL3Byb3ZpZGVycy9zaW1wbGUvcG9tLnhtbCBiL3Rlc3QtZnJhbWV3b3JrL3Byb3ZpZGVycy9zaW1wbGUvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDc0MDUxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL3NpbXBsZS9wb20ueG1sCkBAIC0wLDAgKzEsNTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPHBhcmVudD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1zaW1wbGU8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItc2ltcGxlPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPkplcnNleSBUZXN0IEZyYW1ld29yayAtIFNpbXBsZSBIVFRQIGNvbnRhaW5lcjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zaW1wbGUtaHR0cDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktc2VydmVyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jbGllbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvc2ltcGxlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9zaW1wbGUvU2ltcGxlVGVzdENvbnRhaW5lckZhY3RvcnkuamF2YSBiL3Rlc3QtZnJhbWV3b3JrL3Byb3ZpZGVycy9zaW1wbGUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L3NpbXBsZS9TaW1wbGVUZXN0Q29udGFpbmVyRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMjY2NGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvc2ltcGxlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9zaW1wbGUvU2ltcGxlVGVzdENvbnRhaW5lckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNpbXBsZTsKKworaW1wb3J0IGphdmEuaW8uQ2xvc2VhYmxlOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zaW1wbGUuU2ltcGxlQ29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zaW1wbGUuU2ltcGxlU2VydmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuRGVwbG95bWVudENvbnRleHQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCisvKioKKyAqIEZhY3RvcnkgZm9yIHRlc3Rpbmcge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNpbXBsZS5TaW1wbGVDb250YWluZXJ9LgorICoKKyAqIEBhdXRob3IgQXJ1bCBEaGVzaWFzZWVsYW4gKGFydWxkQGFjbS5vcmcpCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgU2ltcGxlVGVzdENvbnRhaW5lckZhY3RvcnkgaW1wbGVtZW50cyBUZXN0Q29udGFpbmVyRmFjdG9yeSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTaW1wbGVUZXN0Q29udGFpbmVyIGltcGxlbWVudHMgVGVzdENvbnRhaW5lciB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoU2ltcGxlVGVzdENvbnRhaW5lci5jbGFzcy5nZXROYW1lKCkpOworCisgICAgICAgIHByaXZhdGUgZmluYWwgRGVwbG95bWVudENvbnRleHQgZGVwbG95bWVudENvbnRleHQ7CisKKyAgICAgICAgcHJpdmF0ZSBVUkkgYmFzZVVyaTsKKyAgICAgICAgcHJpdmF0ZSBTaW1wbGVTZXJ2ZXIgc2VydmVyOworCisgICAgICAgIHByaXZhdGUgU2ltcGxlVGVzdENvbnRhaW5lcihmaW5hbCBVUkkgYmFzZVVyaSwgZmluYWwgRGVwbG95bWVudENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgZmluYWwgVVJJIGJhc2UgPSBVcmlCdWlsZGVyLmZyb21VcmkoYmFzZVVyaSkucGF0aChjb250ZXh0LmdldENvbnRleHRQYXRoKCkpLmJ1aWxkKCk7CisKKyAgICAgICAgICAgIGlmICghIi8iLmVxdWFscyhiYXNlLmdldFJhd1BhdGgoKSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVGVzdENvbnRhaW5lckV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCBkZXBsb3kgb24gJXMuIFNpbXBsZSBmcmFtZXdvcmsgY29udGFpbmVyIG9ubHkgc3VwcG9ydHMgZGVwbG95bWVudCBvbiByb290IHBhdGguIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UuZ2V0UmF3UGF0aCgpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRoaXMuYmFzZVVyaSA9IGJhc2U7CisKKyAgICAgICAgICAgIGlmIChMT0dHRVIuaXNMb2dnYWJsZShMZXZlbC5JTkZPKSkgeworICAgICAgICAgICAgICAgIExPR0dFUi5pbmZvKCJDcmVhdGluZyBTaW1wbGVUZXN0Q29udGFpbmVyIGNvbmZpZ3VyZWQgYXQgdGhlIGJhc2UgVVJJICIgKyB0aGlzLmJhc2VVcmkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhpcy5kZXBsb3ltZW50Q29udGV4dCA9IGNvbnRleHQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENsaWVudENvbmZpZyBnZXRDbGllbnRDb25maWcoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVVJJIGdldEJhc2VVcmkoKSB7CisgICAgICAgICAgICByZXR1cm4gYmFzZVVyaTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKKyAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuRklORSwgIlN0YXJ0aW5nIFNpbXBsZVRlc3RDb250YWluZXIuLi4iKTsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzZXJ2ZXIgPSBTaW1wbGVDb250YWluZXJGYWN0b3J5LmNyZWF0ZShiYXNlVXJpLCBkZXBsb3ltZW50Q29udGV4dC5nZXRSZXNvdXJjZUNvbmZpZygpKTsKKworICAgICAgICAgICAgICAgIGlmIChiYXNlVXJpLmdldFBvcnQoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJhc2VVcmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoYmFzZVVyaSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAucG9ydChzZXJ2ZXIuZ2V0UG9ydCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuSU5GTywgIlN0YXJ0ZWQgU2ltcGxlVGVzdENvbnRhaW5lciBhdCB0aGUgYmFzZSBVUkkgIiArIGJhc2VVcmkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKFByb2Nlc3NpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uKGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7CisgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLkZJTkUsICJTdG9wcGluZyBTaW1wbGVUZXN0Q29udGFpbmVyLi4uIik7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHRoaXMuc2VydmVyLmNsb3NlKCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuV0FSTklORywgIkVycm9yIFN0b3BwaW5nIFNpbXBsZVRlc3RDb250YWluZXIuLi4iLCBleCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIHRoaXMuc2VydmVyID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUZXN0Q29udGFpbmVyIGNyZWF0ZShmaW5hbCBVUkkgYmFzZVVyaSwgZmluYWwgRGVwbG95bWVudENvbnRleHQgY29udGV4dCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgU2ltcGxlVGVzdENvbnRhaW5lcihiYXNlVXJpLCBjb250ZXh0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvc2ltcGxlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9zaW1wbGUvcGFja2FnZS1pbmZvLmphdmEgYi90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvc2ltcGxlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9zaW1wbGUvcGFja2FnZS1pbmZvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE3MzcxOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZnJhbWV3b3JrL3Byb3ZpZGVycy9zaW1wbGUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L3NpbXBsZS9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvKioKKyAqIEplcnNleSB0ZXN0IGZyYW1ld29yayBmb3IgU2ltcGxlIENvbnRhaW5lciBjbGFzc2VzLgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc2ltcGxlOwpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL3NpbXBsZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3RvcnkgYi90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvc2ltcGxlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjYyYmZkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL3NpbXBsZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3RvcnkKQEAgLTAsMCArMSBAQAorb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zaW1wbGUuU2ltcGxlVGVzdENvbnRhaW5lckZhY3RvcnkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvc2ltcGxlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9zaW1wbGUvQXZhaWxhYmxlUG9ydFNpbXBsZVRlc3QuamF2YSBiL3Rlc3QtZnJhbWV3b3JrL3Byb3ZpZGVycy9zaW1wbGUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L3NpbXBsZS9BdmFpbGFibGVQb3J0U2ltcGxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZDJiYjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay9wcm92aWRlcnMvc2ltcGxlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC9zaW1wbGUvQXZhaWxhYmxlUG9ydFNpbXBsZVRlc3QuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc2ltcGxlOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5EZXBsb3ltZW50Q29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMubm90OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIFRlc3RzIGZpbmRpbmcgYW4gYXZhaWxhYmxlIHBvcnQgZm9yIGNvbnRhaW5lci4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEF2YWlsYWJsZVBvcnRTaW1wbGVUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB7CisgICAgICAgIHJldHVybiBuZXcgU2ltcGxlVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAUGF0aCgiQXZhaWxhYmxlUG9ydFNpbXBsZVRlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFJlc291cmNlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiR0VUIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBEZXBsb3ltZW50Q29udGV4dCBjb25maWd1cmVEZXBsb3ltZW50KCkgeworICAgICAgICBmb3JjZVNldChUZXN0UHJvcGVydGllcy5DT05UQUlORVJfUE9SVCwgIjAiKTsKKworICAgICAgICByZXR1cm4gRGVwbG95bWVudENvbnRleHQuYnVpbGRlcihuZXcgUmVzb3VyY2VDb25maWcoVGVzdFJlc291cmNlLmNsYXNzKSkuYnVpbGQoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXQoKSB7CisgICAgICAgIGFzc2VydFRoYXQodGFyZ2V0KCkuZ2V0VXJpKCkuZ2V0UG9ydCgpLCBub3QoMCkpOworICAgICAgICBhc3NlcnRUaGF0KGdldEJhc2VVcmkoKS5nZXRQb3J0KCksIG5vdCgwKSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdCh0YXJnZXQoIkF2YWlsYWJsZVBvcnRTaW1wbGVUZXN0IikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKCJHRVQiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvcHJvdmlkZXJzL3NpbXBsZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3Qvc2ltcGxlL1NpbXBsZUNvbnRhaW5lclRlc3QuamF2YSBiL3Rlc3QtZnJhbWV3b3JrL3Byb3ZpZGVycy9zaW1wbGUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L3NpbXBsZS9TaW1wbGVDb250YWluZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM5NjI1NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3QtZnJhbWV3b3JrL3Byb3ZpZGVycy9zaW1wbGUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L3NpbXBsZS9TaW1wbGVDb250YWluZXJUZXN0LmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNpbXBsZTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2ltcGxlLlNpbXBsZUNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdCBjbGFzcyBmb3Ige0BsaW5rIFNpbXBsZUNvbnRhaW5lcn0uCisgKgorICogQGF1dGhvciBBcnVsIERoZXNpYXNlZWxhbiAoYXJ1bGRAYWNtLm9yZykKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIFNpbXBsZUNvbnRhaW5lclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgbmV3IGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBTaW1wbGVDb250YWluZXJUZXN0KCkgeworICAgICAgICBzdXBlcihuZXcgU2ltcGxlVGVzdENvbnRhaW5lckZhY3RvcnkoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCByZXNvdXJjZSBjbGFzcy4KKyAgICAgKi8KKyAgICBAUGF0aCgib25lIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGVzdCByZXNvdXJjZSBtZXRob2QuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gVGVzdCBzaW1wbGUgc3RyaW5nIHJlc3BvbnNlLgorICAgICAgICAgKi8KKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFNvbWV0aGluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiZ2V0IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgLyoqCisgICAgICogVGVzdCB7QGxpbmsgU2ltcGxlIEh0dHBTZXJ2ZXJ9IGNvbnRhaW5lci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlQ29udGFpbmVyVGFyZ2V0KCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoIm9uZSIpLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIlJlc3BvbnNlIHN0YXR1cyB1bmV4cGVjdGVkLiIsIDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlJlc3BvbnNlIGVudGl0eSB1bmV4cGVjdGVkLiIsICJnZXQiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL3V0aWwvcG9tLnhtbCBiL3Rlc3QtZnJhbWV3b3JrL3V0aWwvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzhhNzVkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1mcmFtZXdvcmsvdXRpbC9wb20ueG1sCkBAIC0wLDAgKzEsNDcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcms8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstdXRpbDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0LWZyYW1ld29yay11dGlsPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPkplcnNleSBUZXN0IEZyYW1ld29yayBVdGlsczwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktc2VydmVyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jbGllbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL3V0aWwvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L3V0aWwvY2xpZW50L0xvb3BCYWNrQ29ubmVjdG9yLmphdmEgYi90ZXN0LWZyYW1ld29yay91dGlsL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC91dGlsL2NsaWVudC9Mb29wQmFja0Nvbm5lY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkYWZlNTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay91dGlsL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC91dGlsL2NsaWVudC9Mb29wQmFja0Nvbm5lY3Rvci5qYXZhCkBAIC0wLDAgKzEsMTQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QudXRpbC5jbGllbnQ7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29tcGxldGFibGVGdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOworCitpbXBvcnQgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5zcGkuQXN5bmNDb25uZWN0b3JDYWxsYmFjazsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuc3BpLkNvbm5lY3RvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkhlYWRlclV0aWxzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuT3V0Ym91bmRNZXNzYWdlQ29udGV4dDsKKworLyoqCisgKiBMb29wLUJhY2sgY29ubmVjdG9yIHVzZWQgZm9yIHRlc3RpbmcvYmVuY2htYXJraW5nIHB1cnBvc2VzLiBJdCByZXR1cm5zIGEgcmVzcG9uc2UgdGhhdCBjb250YWlucyB0aGUgc2FtZSBkYXRhIChoZWFkZXJzLCBlbnRpdHkpCisgKiBhcyB0aGUgcHJvY2Vzc2VkIHJlcXVlc3QuIFRoZSBzdGF0dXMgb2YgdGhlIHJlc3BvbnNlIGlzIHtAY29kZSA2MDB9LgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICogQHNpbmNlIDIuMTcKKyAqLworZmluYWwgY2xhc3MgTG9vcEJhY2tDb25uZWN0b3IgaW1wbGVtZW50cyBDb25uZWN0b3IgeworCisgICAgLyoqCisgICAgICogVGVzdCBsb29wLWJhY2sgc3RhdHVzIGNvZGUuCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIGludCBURVNUX0xPT1BCQUNLX0NPREUgPSA2MDA7CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGxvb3AtYmFjayBzdGF0dXMgdHlwZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgUmVzcG9uc2UuU3RhdHVzVHlwZSBMT09QQkFDS19TVEFUVVMgPSBuZXcgUmVzcG9uc2UuU3RhdHVzVHlwZSgpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0U3RhdHVzQ29kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBURVNUX0xPT1BCQUNLX0NPREU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc3BvbnNlLlN0YXR1cy5GYW1pbHkgZ2V0RmFtaWx5KCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLlN0YXR1cy5GYW1pbHkuT1RIRVI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRSZWFzb25QaHJhc2UoKSB7CisgICAgICAgICAgICByZXR1cm4gIlRlc3QgY29ubmVjdG9yIGxvb3AtYmFjayI7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGNsb3NlZCA9IGZhbHNlOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENsaWVudFJlc3BvbnNlIGFwcGx5KGZpbmFsIENsaWVudFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICByZXR1cm4gX2FwcGx5KHJlcXVlc3QpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBGdXR1cmU8Pz4gYXBwbHkoZmluYWwgQ2xpZW50UmVxdWVzdCByZXF1ZXN0LCBmaW5hbCBBc3luY0Nvbm5lY3RvckNhbGxiYWNrIGNhbGxiYWNrKSB7CisgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPENsaWVudFJlc3BvbnNlPiBmdXR1cmUgPSBuZXcgQ29tcGxldGFibGVGdXR1cmU8PigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgQ2xpZW50UmVzcG9uc2UgcmVzcG9uc2UgPSBfYXBwbHkocmVxdWVzdCk7CisgICAgICAgICAgICBjYWxsYmFjay5yZXNwb25zZShyZXNwb25zZSk7CisgICAgICAgICAgICBmdXR1cmUuY29tcGxldGUocmVzcG9uc2UpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgY2FsbGJhY2suZmFpbHVyZSh0KTsKKyAgICAgICAgICAgIGZ1dHVyZS5jb21wbGV0ZUV4Y2VwdGlvbmFsbHkodCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZ1dHVyZTsKKyAgICB9CisKKyAgICBwcml2YXRlIENsaWVudFJlc3BvbnNlIF9hcHBseShmaW5hbCBDbGllbnRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgY2hlY2tOb3RDbG9zZWQoKTsKKyAgICAgICAgZmluYWwgQ2xpZW50UmVzcG9uc2UgcmVzcG9uc2UgPSBuZXcgQ2xpZW50UmVzcG9uc2UoTE9PUEJBQ0tfU1RBVFVTLCByZXF1ZXN0KTsKKworICAgICAgICAvLyBIZWFkZXJzLgorICAgICAgICByZXNwb25zZS5oZWFkZXJzKEhlYWRlclV0aWxzLmFzU3RyaW5nSGVhZGVycyhyZXF1ZXN0LmdldEhlYWRlcnMoKSkpOworCisgICAgICAgIC8vIEVudGl0eS4KKyAgICAgICAgaWYgKHJlcXVlc3QuaGFzRW50aXR5KCkpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlLnNldEVudGl0eVN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oYnVmZmVyRW50aXR5KHJlcXVlc3QpKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzcG9uc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBieXRlW10gYnVmZmVyRW50aXR5KGZpbmFsIENsaWVudFJlcXVlc3QgcmVxdWVzdENvbnRleHQpIHsKKyAgICAgICAgZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKDUxMik7CisKKyAgICAgICAgcmVxdWVzdENvbnRleHQuc2V0U3RyZWFtUHJvdmlkZXIobmV3IE91dGJvdW5kTWVzc2FnZUNvbnRleHQuU3RyZWFtUHJvdmlkZXIoKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oZmluYWwgaW50IGNvbnRlbnRMZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJhb3M7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC53cml0ZUVudGl0eSgpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKCJFcnJvciBidWZmZXJpbmcgdGhlIGVudGl0eS4iLCBpb2UpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGJhb3MudG9CeXRlQXJyYXkoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiAidGVzdC1sb29wLWJhY2stY29ubmVjdG9yIjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgY2xvc2VkID0gdHJ1ZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tOb3RDbG9zZWQoKSB7CisgICAgICAgIGlmIChjbG9zZWQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkxvb3AtYmFjayBDb25uZWN0b3IgY2xvc2VkLiIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvdXRpbC9jbGllbnQvTG9vcEJhY2tDb25uZWN0b3JQcm92aWRlci5qYXZhIGIvdGVzdC1mcmFtZXdvcmsvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvdXRpbC9jbGllbnQvTG9vcEJhY2tDb25uZWN0b3JQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzMWIxODAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay91dGlsL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC91dGlsL2NsaWVudC9Mb29wQmFja0Nvbm5lY3RvclByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnV0aWwuY2xpZW50OworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5zcGkuQ29ubmVjdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5zcGkuQ29ubmVjdG9yUHJvdmlkZXI7CisKKy8qKgorICogVGhlIGRlZmF1bHQge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5zcGkuQ29ubmVjdG9yUHJvdmlkZXIgY29ubmVjdG9yIHByb3ZpZGVyfSB1c2VkIGZvciB0ZXN0aW5nL2JlbmNobWFya2luZworICogcHVycG9zZXMuIFRoZSBwcm92aWRlZCBjb25uZWN0b3IgaXMge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QudXRpbC5jbGllbnQuTG9vcEJhY2tDb25uZWN0b3J9IHJldHVybnMgYSByZXNwb25zZSB0aGF0CisgKiBjb250YWlucyB0aGUgc2FtZSBkYXRhIChoZWFkZXJzLCBlbnRpdHkpIGFzIHRoZSBwcm9jZXNzZWQgcmVxdWVzdC4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqIEBzaW5jZSAyLjE3CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBMb29wQmFja0Nvbm5lY3RvclByb3ZpZGVyIGltcGxlbWVudHMgQ29ubmVjdG9yUHJvdmlkZXIgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIENvbm5lY3RvciBnZXRDb25uZWN0b3IoZmluYWwgQ2xpZW50IGNsaWVudCwgZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWcpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBMb29wQmFja0Nvbm5lY3RvcigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIGNsaWVudCBjb25maWd1cmF0aW9uIHNwZWNpZmljIHRvIHRoZSBjb25uZWN0b3IuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgY2xpZW50IGNvbmZpZ3VyYXRpb24gc3BlY2lmaWMgdG8gdGhlIGNvbm5lY3Rvci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENvbmZpZ3VyYXRpb24gZ2V0Q2xpZW50Q29uZmlnKCkgeworICAgICAgICByZXR1cm4gbmV3IENsaWVudENvbmZpZygpLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBMb29wQmFja0Nvbm5lY3RvclByb3ZpZGVyKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL3V0aWwvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L3V0aWwvcGFja2FnZS1pbmZvLmphdmEgYi90ZXN0LWZyYW1ld29yay91dGlsL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC91dGlsL3BhY2thZ2UtaW5mby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExNTBmZDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay91dGlsL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC91dGlsL3BhY2thZ2UtaW5mby5qYXZhCkBAIC0wLDAgKzEsMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKKy8qKgorICogSmVyc2V5IFV0aWxzIHVzZWQgZm9yIHVuaXQgdGVzdHMgYW5kIGJlbmNobWFya3MuCisgKgorICogQHNpbmNlIDIuMTcKKyAqLworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnV0aWw7CmRpZmYgLS1naXQgYS90ZXN0LWZyYW1ld29yay91dGlsL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC91dGlsL3J1bm5lci9Db25jdXJyZW50UGFyYW1ldGVyaXplZFJ1bm5lci5qYXZhIGIvdGVzdC1mcmFtZXdvcmsvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvdXRpbC9ydW5uZXIvQ29uY3VycmVudFBhcmFtZXRlcml6ZWRSdW5uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjhjMDljCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1mcmFtZXdvcmsvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvdXRpbC9ydW5uZXIvQ29uY3VycmVudFBhcmFtZXRlcml6ZWRSdW5uZXIuamF2YQpAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnV0aWwucnVubmVyOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKKworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVubmVyOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIubm90aWZpY2F0aW9uLkZhaWx1cmU7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5ub3RpZmljYXRpb24uUnVuTm90aWZpZXI7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuQmxvY2tKVW5pdDRDbGFzc1J1bm5lcjsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLm1vZGVsLkZyYW1ld29ya01ldGhvZDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LkJldGE7CisKKy8qKgorICogQ3VzdG9tIGltcGxlbWVudGF0aW9uIG9mIGEgSlVuaXQge0BsaW5rIFJ1bm5lcn0gdGhhdCBhbGxvd3MgcGFyYW1ldGVyaXplZAorICogdGVzdHMgdG8gcnVuIGluIHBhcmFsbGVsLiBUaGlzIHJ1bm5lciB3aWxsIHByb2JhYmx5CisgKiBiZSBtZXJnZWQgaW50byB7QGxpbmsgQ29uY3VycmVudFJ1bm5lcn0gaW4gdGhlIGZ1dHVyZS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAQmV0YQorcHVibGljIGNsYXNzIENvbmN1cnJlbnRQYXJhbWV0ZXJpemVkUnVubmVyIGV4dGVuZHMgQmxvY2tKVW5pdDRDbGFzc1J1bm5lciB7CisKKyAgICBwdWJsaWMgZmluYWwgaW50IEZJTklTSF9XQUlUX0NZQ0xFX01TID0gMjAwMDsKKyAgICBwdWJsaWMgZmluYWwgaW50IFRFU1RfVEhSRUFEUyA9IDEyNDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKENvbmN1cnJlbnRQYXJhbWV0ZXJpemVkUnVubmVyLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBwcml2YXRlIGZpbmFsIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvciA9IEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2woVEVTVF9USFJFQURTKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBydW5uZXIgZm9yIGdpdmVuIHRlc3QgY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xhenogdGVzdCBjbGFzcworICAgICAqIEB0aHJvd3MgVGhyb3dhYmxlCisgICAgICovCisgICAgcHVibGljIENvbmN1cnJlbnRQYXJhbWV0ZXJpemVkUnVubmVyKENsYXNzPD8+IGNsYXp6KSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgc3VwZXIoY2xhenopOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlVGVzdE1ldGhvZHMoTGlzdDxUaHJvd2FibGU+IGVycm9ycykgeworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHJ1bkNoaWxkKGZpbmFsIEZyYW1ld29ya01ldGhvZCBtZXRob2QsIGZpbmFsIFJ1bk5vdGlmaWVyIG5vdGlmaWVyKSB7CisgICAgICAgIG5vdGlmaWVyLmZpcmVUZXN0U3RhcnRlZChkZXNjcmliZUNoaWxkKG1ldGhvZCkpOworCisgICAgICAgIGZpbmFsIE9iamVjdCB0ZXN0SW5zdGFuY2U7CisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIC8vIGdldCB0aGUgdGVzdCBwYXJhbWV0ZXIgaXRlcmF0b3IgZmlyc3QKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8RnJhbWV3b3JrTWV0aG9kPiBwYXJhbWV0ZXJNZXRob2RzID0gZ2V0VGVzdENsYXNzKCkuZ2V0QW5ub3RhdGVkTWV0aG9kcyhQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMuY2xhc3MpOworICAgICAgICAgICAgZmluYWwgSXRlcmFibGU8T2JqZWN0W10+IHBhcmFtZXRlcnMgPSAoSXRlcmFibGU8T2JqZWN0W10+KSBwYXJhbWV0ZXJNZXRob2RzLmdldCgwKS5nZXRNZXRob2QoKS5pbnZva2UobnVsbCk7CisKKyAgICAgICAgICAgIC8vIHRoZW4gY3JlYXRlIHRoZSB0ZXN0IGluc3RhbmNlCisgICAgICAgICAgICB0ZXN0SW5zdGFuY2UgPSBzdXBlci5jcmVhdGVUZXN0KCk7CisKKyAgICAgICAgICAgIC8vIG5vdyBydW4gdGhlIGJlZm9yZSBtZXRob2RzCisgICAgICAgICAgICBMaXN0PEZyYW1ld29ya01ldGhvZD4gYmVmb3JlcyA9IGdldFRlc3RDbGFzcygpLmdldEFubm90YXRlZE1ldGhvZHMoQmVmb3JlLmNsYXNzKTsKKyAgICAgICAgICAgIGZvciAoRnJhbWV3b3JrTWV0aG9kIGJlZm9yZSA6IGJlZm9yZXMpIHsKKyAgICAgICAgICAgICAgICBiZWZvcmUuZ2V0TWV0aG9kKCkuaW52b2tlKHRlc3RJbnN0YW5jZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGFuZCBsYXVuY2ggYXMgbWVueSB0ZXN0IG1ldGhvZCBpbnZvY2F0aW9ucyBhcyBtYW55IHBhcmFtZXRlcnMgaXMgYXZhaWxhYmxlCisgICAgICAgICAgICBmaW5hbCBJdGVyYXRvcjxPYmplY3RbXT4gcGFyYW1JdGVyYXRvciA9IHBhcmFtZXRlcnMuaXRlcmF0b3IoKTsKKyAgICAgICAgICAgIGZpbmFsIE1ldGhvZCBqYXZhVGVzdE1ldGhvZCA9IG1ldGhvZC5nZXRNZXRob2QoKTsKKworICAgICAgICAgICAgZmluYWwgQXRvbWljSW50ZWdlciBzdWJtaXR0ZWQgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKKworICAgICAgICAgICAgd2hpbGUgKHBhcmFtSXRlcmF0b3IuaGFzTmV4dCgpKSB7CisKKyAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3RbXSBqYXZhTWV0aG9kQXJncyA9IHBhcmFtSXRlcmF0b3IubmV4dCgpOworICAgICAgICAgICAgICAgIHN1Ym1pdHRlZC5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgICAgICAgICAgICBleGVjdXRvci5zdWJtaXQobmV3IFJ1bm5hYmxlKCkgeworCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmFUZXN0TWV0aG9kLmludm9rZSh0ZXN0SW5zdGFuY2UsIGphdmFNZXRob2RBcmdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmllci5maXJlVGVzdEZhaWx1cmUobmV3IEZhaWx1cmUoZGVzY3JpYmVDaGlsZChtZXRob2QpLCBleCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpZXIuZmlyZVRlc3RGYWlsdXJlKG5ldyBGYWlsdXJlKGRlc2NyaWJlQ2hpbGQobWV0aG9kKSwgZXgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmllci5maXJlVGVzdEZhaWx1cmUobmV3IEZhaWx1cmUoZGVzY3JpYmVDaGlsZChtZXRob2QpLCBleCkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJtaXR0ZWQuZGVjcmVtZW50QW5kR2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gd2FpdCB1bnRpbCBldmVyeXRoaW5nIGlzIGRvbmUKKyAgICAgICAgICAgIHdoaWxlIChzdWJtaXR0ZWQuaW50VmFsdWUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBMT0dHRVIuaW5mbyhTdHJpbmcuZm9ybWF0KCJXYWl0aW5nIGZvciAlZCByZXF1ZXN0cyB0byBmaW5pc2guLi4lbiIsIHN1Ym1pdHRlZC5pbnRWYWx1ZSgpKSk7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKEZJTklTSF9XQUlUX0NZQ0xFX01TKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBhbmQgbGF1bmNoIHRoZSBhZnRlciBwYXJ0eS4uCisgICAgICAgICAgICBMaXN0PEZyYW1ld29ya01ldGhvZD4gYWZ0ZXJzID0gZ2V0VGVzdENsYXNzKCkuZ2V0QW5ub3RhdGVkTWV0aG9kcyhBZnRlci5jbGFzcyk7CisgICAgICAgICAgICBmb3IgKEZyYW1ld29ya01ldGhvZCBhZnRlciA6IGFmdGVycykgeworICAgICAgICAgICAgICAgIGFmdGVyLmdldE1ldGhvZCgpLmludm9rZSh0ZXN0SW5zdGFuY2UpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIG5vdGlmaWVyLmZpcmVUZXN0RmFpbHVyZShuZXcgRmFpbHVyZShkZXNjcmliZUNoaWxkKG1ldGhvZCksIGV4KSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbm90aWZpZXIuZmlyZVRlc3RGaW5pc2hlZChkZXNjcmliZUNoaWxkKG1ldGhvZCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL3V0aWwvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L3V0aWwvcnVubmVyL0NvbmN1cnJlbnRSdW5uZXIuamF2YSBiL3Rlc3QtZnJhbWV3b3JrL3V0aWwvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L3V0aWwvcnVubmVyL0NvbmN1cnJlbnRSdW5uZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDY3NmQyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1mcmFtZXdvcmsvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvdXRpbC9ydW5uZXIvQ29uY3VycmVudFJ1bm5lci5qYXZhCkBAIC0wLDAgKzEsMTc3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QudXRpbC5ydW5uZXI7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlNlbWFwaG9yZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworCitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5uZXI7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5ub3RpZmljYXRpb24uRmFpbHVyZTsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLm5vdGlmaWNhdGlvbi5SdW5Ob3RpZmllcjsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5CbG9ja0pVbml0NENsYXNzUnVubmVyOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLm1vZGVsLkZyYW1ld29ya01ldGhvZDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LkJldGE7CisKKy8qKgorICogSmVyc2V5IGltcGxlbWVudGF0aW9uIG9mIGEgSlVuaXQge0BsaW5rIFJ1bm5lcn0gdGhhdCBydW5zCisgKiBhbGwgdGVzdCBtZXRob2RzIHdpdGhpbiBhIHNpbmdsZSB0ZXN0IGNsYXNzIGluIHBhcmFsbGVsLgorICogVGhlIG1haW4gcHVycG9zZSBpcyB0byBhdm9pZCBoYXZpbmcgSFRUUCBjb250YWluZXIKKyAqIGxhdW5jaGVkIHNlcGFyYXRlbHkgZm9yIGVhY2ggaW5kaXZpZHVhbCB0ZXN0LgorICogT3JkZXIgaW4gd2hpY2ggaW5kaXZpZHVhbCB0ZXN0IG1ldGhvZHMgYXJlIGludm9rZWQKKyAqIGlzIG5vdCBndWFyYW50ZWVkIGFuZCBpcyBub24tZGV0ZXJtaW5pc3RpYy4KKyAqCisgKiBUZXN0IG1ldGhvZHMgdGhhdCBuZWVkcyBhIHNlcGFyYXRlIGNvbnRhaW5lciBvciBuZWVkcworICogdG8gcnVuIHNlcGFyYXRlbHkgZm9yIG90aGVyIHJlYXNvbnMKKyAqIGNvdWxkIGJlIGFubm90YXRlZCB3aXRoIHtAbGluayBSdW5TZXBhcmF0ZWx5fSBhbm5vdGF0aW9uLgorICogVGhlc2UgdGVzdCBtZXRob2RzIHdpbGwgdGhlbiBiZSBleGNsdWRlZAorICogZnJvbSBwYXJhbGxlbCBwcm9jZXNzaW5nLCBhbmQgd2lsbCBiZSBpbnZva2VkCisgKiBhcyBpZiBubyBzcGVjaWFsIGNvbmN1cnJlbnQgcnVubmVyIHdhcyBpbnZvbHZlZC4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCisKK0BCZXRhCitwdWJsaWMgY2xhc3MgQ29uY3VycmVudFJ1bm5lciBleHRlbmRzIEJsb2NrSlVuaXQ0Q2xhc3NSdW5uZXIgeworCisgICAgcHVibGljIGZpbmFsIGludCBGSU5JU0hfV0FJVF9DWUNMRV9NUyA9IDIwMDA7CisgICAgcHVibGljIGZpbmFsIGludCBURVNUX1RIUkVBRFMgPSAxMjQ7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihDb25jdXJyZW50UnVubmVyLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBwcml2YXRlIGZpbmFsIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvciA9IEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2woVEVTVF9USFJFQURTKTsKKworICAgIHByaXZhdGUgZmluYWwgU2VtYXBob3JlIHBlcm1pdFRvR28gPSBuZXcgU2VtYXBob3JlKDEpOworICAgIHByaXZhdGUgZmluYWwgQXRvbWljSW50ZWdlciBpbnZvY2F0aW9ucyA9IG5ldyBBdG9taWNJbnRlZ2VyKDEpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IHJ1bm5lciBmb3IgZ2l2ZW4gdGVzdCBjbGFzcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGF6eiB0ZXN0IGNsYXNzCisgICAgICogQHRocm93cyBUaHJvd2FibGUKKyAgICAgKi8KKyAgICBwdWJsaWMgQ29uY3VycmVudFJ1bm5lcihDbGFzczw/PiBjbGF6eikgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHN1cGVyKGNsYXp6KTsKKyAgICAgICAgY29uY3VycmVudFRlc3RNZXRob2RzID0gbmV3IExpbmtlZExpc3Q8PihzdXBlci5jb21wdXRlVGVzdE1ldGhvZHMoKSk7CisgICAgICAgIGNvbmN1cnJlbnRUZXN0TWV0aG9kcy5yZW1vdmVBbGwoZ2V0VGVzdENsYXNzKCkuZ2V0QW5ub3RhdGVkTWV0aG9kcyhSdW5TZXBhcmF0ZWx5LmNsYXNzKSk7CisgICAgICAgIGZpbmFsIExpc3Q8RnJhbWV3b3JrTWV0aG9kPiBpZ25vcmVkID0gZ2V0VGVzdENsYXNzKCkuZ2V0QW5ub3RhdGVkTWV0aG9kcyhJZ25vcmUuY2xhc3MpOworICAgICAgICBjb25jdXJyZW50VGVzdE1ldGhvZHMucmVtb3ZlQWxsKGlnbm9yZWQpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHZhbGlkYXRlVGVzdE1ldGhvZHMoTGlzdDxUaHJvd2FibGU+IGVycm9ycykgeworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIHJ1bkNoaWxkKGZpbmFsIEZyYW1ld29ya01ldGhvZCBtZXRob2QsIGZpbmFsIFJ1bk5vdGlmaWVyIG5vdGlmaWVyKSB7CisgICAgICAgIHN5bmNocm9uaXplZCAocGVybWl0VG9HbykgeworICAgICAgICAgICAgaWYgKGNvbmN1cnJlbnRUZXN0TWV0aG9kcy5jb250YWlucyhtZXRob2QpKSB7CisgICAgICAgICAgICAgICAgaWYgKGludm9jYXRpb25zLmNvbXBhcmVBbmRTZXQoMSwgMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcnVuVGhlbUFsbChjb25jdXJyZW50VGVzdE1ldGhvZHMsIG5vdGlmaWVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN1cGVyLnJ1bkNoaWxkKG1ldGhvZCwgbm90aWZpZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PEZyYW1ld29ya01ldGhvZD4gY29uY3VycmVudFRlc3RNZXRob2RzOworCisKKyAgICBwcml2YXRlIHZvaWQgcnVuVGhlbUFsbChmaW5hbCBMaXN0PEZyYW1ld29ya01ldGhvZD4gbWV0aG9kcywgZmluYWwgUnVuTm90aWZpZXIgbm90aWZpZXIpIHsKKworICAgICAgICBmaW5hbCBPYmplY3QgdGVzdEluc3RhbmNlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGVzdEluc3RhbmNlID0gc3VwZXIuY3JlYXRlVGVzdCgpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHJ1biB0aGUgYmVmb3JlIG1ldGhvZHMKKyAgICAgICAgTGlzdDxGcmFtZXdvcmtNZXRob2Q+IGJlZm9yZXMgPSBnZXRUZXN0Q2xhc3MoKS5nZXRBbm5vdGF0ZWRNZXRob2RzKEJlZm9yZS5jbGFzcyk7CisgICAgICAgIGZvciAoRnJhbWV3b3JrTWV0aG9kIGJlZm9yZSA6IGJlZm9yZXMpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYmVmb3JlLmdldE1ldGhvZCgpLmludm9rZSh0ZXN0SW5zdGFuY2UpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhqYXZhLnV0aWwubG9nZ2luZy5MZXZlbC5TRVZFUkUsIG51bGwsIGV4KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgQXRvbWljSW50ZWdlciBzdWJtaXR0ZWQgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKKworICAgICAgICAgICAgZm9yIChmaW5hbCBGcmFtZXdvcmtNZXRob2QgbWV0aG9kIDogbWV0aG9kcykgeworCisgICAgICAgICAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgICAgICAgICBub3RpZmllci5maXJlVGVzdFN0YXJ0ZWQoZGVzY3JpYmVDaGlsZChtZXRob2QpKTsKKworICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZXRob2QgamF2YVRlc3RNZXRob2QgPSBtZXRob2QuZ2V0TWV0aG9kKCk7CisKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0W10gamF2YU1ldGhvZEFyZ3MgPSBuZXcgT2JqZWN0W117fTsKKyAgICAgICAgICAgICAgICAgICAgc3VibWl0dGVkLmluY3JlbWVudEFuZEdldCgpOworICAgICAgICAgICAgICAgICAgICBleGVjdXRvci5zdWJtaXQobmV3IFJ1bm5hYmxlKCkgeworCisgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhVGVzdE1ldGhvZC5pbnZva2UodGVzdEluc3RhbmNlLCBqYXZhTWV0aG9kQXJncyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWVyLmZpcmVUZXN0RmFpbHVyZShuZXcgRmFpbHVyZShkZXNjcmliZUNoaWxkKG1ldGhvZCksIGV4KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VibWl0dGVkLmRlY3JlbWVudEFuZEdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmaWVyLmZpcmVUZXN0RmFpbHVyZShuZXcgRmFpbHVyZShkZXNjcmliZUNoaWxkKG1ldGhvZCksIGV4KSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbm90aWZpZXIuZmlyZVRlc3RGaW5pc2hlZChkZXNjcmliZUNoaWxkKG1ldGhvZCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyB3YWl0IHVudGlsIGV2ZXJ5dGhpbmcgaXMgZG9uZQorICAgICAgICAgICAgd2hpbGUgKHN1Ym1pdHRlZC5pbnRWYWx1ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIExPR0dFUi5pbmZvKFN0cmluZy5mb3JtYXQoIldhaXRpbmcgZm9yICVkIHJlcXVlc3RzIHRvIGZpbmlzaC4uLiVuIiwgc3VibWl0dGVkLmludFZhbHVlKCkpKTsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoRklOSVNIX1dBSVRfQ1lDTEVfTVMpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGFuZCBsYXVuY2ggdGhlIGFmdGVyIHBhcnR5Li4KKyAgICAgICAgICAgIExpc3Q8RnJhbWV3b3JrTWV0aG9kPiBhZnRlcnMgPSBnZXRUZXN0Q2xhc3MoKS5nZXRBbm5vdGF0ZWRNZXRob2RzKEFmdGVyLmNsYXNzKTsKKyAgICAgICAgICAgIGZvciAoRnJhbWV3b3JrTWV0aG9kIGFmdGVyIDogYWZ0ZXJzKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgYWZ0ZXIuZ2V0TWV0aG9kKCkuaW52b2tlKHRlc3RJbnN0YW5jZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuU0VWRVJFLCBudWxsLCBleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvdXRpbC9ydW5uZXIvUnVuU2VwYXJhdGVseS5qYXZhIGIvdGVzdC1mcmFtZXdvcmsvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvdXRpbC9ydW5uZXIvUnVuU2VwYXJhdGVseS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0Y2QyYzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay91dGlsL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC91dGlsL3J1bm5lci9SdW5TZXBhcmF0ZWx5LmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnV0aWwucnVubmVyOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKKy8qKgorICogTWFya2VyIGFubm90YXRpb24gZm9yIHRlc3QgbWV0aG9kcyB0aGF0IHNob3VsZCBiZSBydW4gc2VwYXJhdGVseSBpbiBhIG5vbi1wYXJhbGxlbAorICogZmFzaGlvbi4gVGhpcyBpcyBvbmx5IHRha2VuIGludG8gYWNjb3VudCB3aGVuIHRoZSB0ZXN0IGNsYXNzIGlzIGJlaW5nIHByb2Nlc3NlZAorICogYnkgYW55IG9mIEplcnNleSBwcm92aWRlZCBwYXJhbGxlbCB0ZXN0IHJ1bm5lciB7QGxpbmsgQ29uY3VycmVudFJ1bm5lcn0uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BUYXJnZXQoRWxlbWVudFR5cGUuTUVUSE9EKQorcHVibGljIEBpbnRlcmZhY2UgUnVuU2VwYXJhdGVseSB7Cit9CmRpZmYgLS1naXQgYS90ZXN0LWZyYW1ld29yay91dGlsL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC91dGlsL3NlcnZlci9Db250YWluZXJSZXF1ZXN0QnVpbGRlci5qYXZhIGIvdGVzdC1mcmFtZXdvcmsvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvdXRpbC9zZXJ2ZXIvQ29udGFpbmVyUmVxdWVzdEJ1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTk3NTU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1mcmFtZXdvcmsvdXRpbC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvdXRpbC9zZXJ2ZXIvQ29udGFpbmVyUmVxdWVzdEJ1aWxkZXIuamF2YQpAQCAtMCwwICsxLDM3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnV0aWwuc2VydmVyOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29va2llOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5TZWN1cml0eUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJ1bnRpbWVEZWxlZ2F0ZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLk1hcFByb3BlcnRpZXNEZWxlZ2F0ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Qcm9wZXJ0aWVzRGVsZWdhdGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5NZXNzYWdlQm9keVdvcmtlcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5IZWFkZXJVdGlsczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXF1ZXN0OworCisvKioKKyAqIFVzZWQgYnkgdW5pdCB0ZXN0cyAvIGJlbmNobWFya3MgdG8gY3JlYXRlIG1vY2sge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXF1ZXN0fSBpbnN0YW5jZXMuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqIEBzaW5jZSAyLjE3CisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBDb250YWluZXJSZXF1ZXN0QnVpbGRlciB7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IEplcnNleSBjb250YWluZXIgcmVxdWVzdCBjb250ZXh0IGJ1aWxkZXIuIFRoZSBidWlsZGVyIGFuZCBidWlsdCByZXF1ZXN0IGNvbnRleHQgYXJlIHN1cHBvc2VkIHRvIGJlIHVzZWQgb25seQorICAgICAqIGZvciB0ZXN0aW5nIHB1cnBvc2VzLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3RVcmkgcmVxdWVzdCBVUkkuCisgICAgICogQHBhcmFtIG1ldGhvZCAgICAgcmVxdWVzdCBIVFRQIG1ldGhvZCBuYW1lLgorICAgICAqIEByZXR1cm4gbmV3IGJ1aWxkZXIgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDb250YWluZXJSZXF1ZXN0QnVpbGRlciBmcm9tKGZpbmFsIFN0cmluZyByZXF1ZXN0VXJpLCBmaW5hbCBTdHJpbmcgbWV0aG9kKSB7CisgICAgICAgIHJldHVybiBmcm9tKG51bGwsIHJlcXVlc3RVcmksIG1ldGhvZCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyBKZXJzZXkgY29udGFpbmVyIHJlcXVlc3QgY29udGV4dCBidWlsZGVyLiBUaGUgYnVpbGRlciBhbmQgYnVpbHQgcmVxdWVzdCBjb250ZXh0IGFyZSBzdXBwb3NlZCB0byBiZSB1c2VkIG9ubHkKKyAgICAgKiBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiYXNlVXJpICAgIGJhc2UgYXBwbGljYXRpb24gVVJJLgorICAgICAqIEBwYXJhbSByZXF1ZXN0VXJpIHJlcXVlc3QgVVJJLgorICAgICAqIEBwYXJhbSBtZXRob2QgICAgIHJlcXVlc3QgSFRUUCBtZXRob2QgbmFtZS4KKyAgICAgKiBAcmV0dXJuIG5ldyBidWlsZGVyIGluc3RhbmNlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgQ29udGFpbmVyUmVxdWVzdEJ1aWxkZXIgZnJvbShmaW5hbCBTdHJpbmcgYmFzZVVyaSwgZmluYWwgU3RyaW5nIHJlcXVlc3RVcmksIGZpbmFsIFN0cmluZyBtZXRob2QpIHsKKyAgICAgICAgcmV0dXJuIGZyb20oYmFzZVVyaSwgcmVxdWVzdFVyaSwgbWV0aG9kLCBudWxsLCBudWxsKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IEplcnNleSBjb250YWluZXIgcmVxdWVzdCBjb250ZXh0IGJ1aWxkZXIuIFRoZSBidWlsZGVyIGFuZCBidWlsdCByZXF1ZXN0IGNvbnRleHQgYXJlIHN1cHBvc2VkIHRvIGJlIHVzZWQgb25seQorICAgICAqIGZvciB0ZXN0aW5nIHB1cnBvc2VzLgorICAgICAqCisgICAgICogQHBhcmFtIGJhc2VVcmkgICAgICAgICAgICBiYXNlIGFwcGxpY2F0aW9uIFVSSS4KKyAgICAgKiBAcGFyYW0gcmVxdWVzdFVyaSAgICAgICAgIHJlcXVlc3QgVVJJLgorICAgICAqIEBwYXJhbSBtZXRob2QgICAgICAgICAgICAgcmVxdWVzdCBIVFRQIG1ldGhvZCBuYW1lLgorICAgICAqIEBwYXJhbSBzZWN1cml0eUNvbnRleHQgICAgc2VjdXJpdHkgY29udGV4dCBvZiB0aGUgY3VycmVudCByZXF1ZXN0LiBNYXkgYmUge0Bjb2RlIG51bGx9LgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHtAbGluayBTZWN1cml0eUNvbnRleHQjZ2V0VXNlclByaW5jaXBhbCgpfSBtdXN0IHJldHVybiB7QGNvZGUgbnVsbH0gaWYgdGhlIGN1cnJlbnQgcmVxdWVzdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzIG5vdCBiZWVuIGF1dGhlbnRpY2F0ZWQgYnkgdGhlIGNvbnRhaW5lci4KKyAgICAgKiBAcGFyYW0gcHJvcGVydGllc0RlbGVnYXRlIGN1c3RvbSB7QGxpbmsgUHJvcGVydGllc0RlbGVnYXRlIHByb3BlcnRpZXMgZGVsZWdhdGV9IHRvIGJlIHVzZWQgYnkgdGhlIGNvbnRleHQsIG1heSBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIG51bGx9LgorICAgICAqIEByZXR1cm4gbmV3IGJ1aWxkZXIgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDb250YWluZXJSZXF1ZXN0QnVpbGRlciBmcm9tKGZpbmFsIFN0cmluZyBiYXNlVXJpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVxdWVzdFVyaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU2VjdXJpdHlDb250ZXh0IHNlY3VyaXR5Q29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUHJvcGVydGllc0RlbGVnYXRlIHByb3BlcnRpZXNEZWxlZ2F0ZSkgeworICAgICAgICByZXR1cm4gbmV3IENvbnRhaW5lclJlcXVlc3RCdWlsZGVyKGJhc2VVcmksIHJlcXVlc3RVcmksIG1ldGhvZCwgc2VjdXJpdHlDb250ZXh0LCBwcm9wZXJ0aWVzRGVsZWdhdGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgSmVyc2V5IGNvbnRhaW5lciByZXF1ZXN0IGNvbnRleHQgYnVpbGRlci4gVGhlIGJ1aWxkZXIgYW5kIGJ1aWx0IHJlcXVlc3QgY29udGV4dCBhcmUgc3VwcG9zZWQgdG8gYmUgdXNlZCBvbmx5CisgICAgICogZm9yIHRlc3RpbmcgcHVycG9zZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVxdWVzdFVyaSByZXF1ZXN0IFVSSS4KKyAgICAgKiBAcGFyYW0gbWV0aG9kICAgICByZXF1ZXN0IEhUVFAgbWV0aG9kIG5hbWUuCisgICAgICogQHJldHVybiBuZXcgYnVpbGRlciBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENvbnRhaW5lclJlcXVlc3RCdWlsZGVyIGZyb20oZmluYWwgVVJJIHJlcXVlc3RVcmksIGZpbmFsIFN0cmluZyBtZXRob2QpIHsKKyAgICAgICAgcmV0dXJuIGZyb20obnVsbCwgcmVxdWVzdFVyaSwgbWV0aG9kKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IEplcnNleSBjb250YWluZXIgcmVxdWVzdCBjb250ZXh0IGJ1aWxkZXIuIFRoZSBidWlsZGVyIGFuZCBidWlsdCByZXF1ZXN0IGNvbnRleHQgYXJlIHN1cHBvc2VkIHRvIGJlIHVzZWQgb25seQorICAgICAqIGZvciB0ZXN0aW5nIHB1cnBvc2VzLgorICAgICAqCisgICAgICogQHBhcmFtIGJhc2VVcmkgICAgYmFzZSBhcHBsaWNhdGlvbiBVUkkuCisgICAgICogQHBhcmFtIHJlcXVlc3RVcmkgcmVxdWVzdCBVUkkuCisgICAgICogQHBhcmFtIG1ldGhvZCAgICAgcmVxdWVzdCBIVFRQIG1ldGhvZCBuYW1lLgorICAgICAqIEByZXR1cm4gbmV3IGJ1aWxkZXIgaW5zdGFuY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBDb250YWluZXJSZXF1ZXN0QnVpbGRlciBmcm9tKGZpbmFsIFVSSSBiYXNlVXJpLCBmaW5hbCBVUkkgcmVxdWVzdFVyaSwgZmluYWwgU3RyaW5nIG1ldGhvZCkgeworICAgICAgICByZXR1cm4gZnJvbShiYXNlVXJpLCByZXF1ZXN0VXJpLCBtZXRob2QsIG51bGwsIG51bGwpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgSmVyc2V5IGNvbnRhaW5lciByZXF1ZXN0IGNvbnRleHQgYnVpbGRlci4gVGhlIGJ1aWxkZXIgYW5kIGJ1aWx0IHJlcXVlc3QgY29udGV4dCBhcmUgc3VwcG9zZWQgdG8gYmUgdXNlZCBvbmx5CisgICAgICogZm9yIHRlc3RpbmcgcHVycG9zZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYmFzZVVyaSAgICAgICAgICAgIGJhc2UgYXBwbGljYXRpb24gVVJJLgorICAgICAqIEBwYXJhbSByZXF1ZXN0VXJpICAgICAgICAgcmVxdWVzdCBVUkkuCisgICAgICogQHBhcmFtIG1ldGhvZCAgICAgICAgICAgICByZXF1ZXN0IEhUVFAgbWV0aG9kIG5hbWUuCisgICAgICogQHBhcmFtIHNlY3VyaXR5Q29udGV4dCAgICBzZWN1cml0eSBjb250ZXh0IG9mIHRoZSBjdXJyZW50IHJlcXVlc3QuIE1heSBiZSB7QGNvZGUgbnVsbH0uCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUge0BsaW5rIFNlY3VyaXR5Q29udGV4dCNnZXRVc2VyUHJpbmNpcGFsKCl9IG11c3QgcmV0dXJuIHtAY29kZSBudWxsfSBpZiB0aGUgY3VycmVudCByZXF1ZXN0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICBoYXMgbm90IGJlZW4gYXV0aGVudGljYXRlZCBieSB0aGUgY29udGFpbmVyLgorICAgICAqIEBwYXJhbSBwcm9wZXJ0aWVzRGVsZWdhdGUgY3VzdG9tIHtAbGluayBQcm9wZXJ0aWVzRGVsZWdhdGUgcHJvcGVydGllcyBkZWxlZ2F0ZX0gdG8gYmUgdXNlZCBieSB0aGUgY29udGV4dCwgbWF5IGJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICB7QGNvZGUgbnVsbH0uCisgICAgICogQHJldHVybiBuZXcgYnVpbGRlciBpbnN0YW5jZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENvbnRhaW5lclJlcXVlc3RCdWlsZGVyIGZyb20oZmluYWwgVVJJIGJhc2VVcmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFVSSSByZXF1ZXN0VXJpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZWN1cml0eUNvbnRleHQgc2VjdXJpdHlDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBQcm9wZXJ0aWVzRGVsZWdhdGUgcHJvcGVydGllc0RlbGVnYXRlKSB7CisgICAgICAgIHJldHVybiBuZXcgQ29udGFpbmVyUmVxdWVzdEJ1aWxkZXIoYmFzZVVyaSwgcmVxdWVzdFVyaSwgbWV0aG9kLCBzZWN1cml0eUNvbnRleHQsIHByb3BlcnRpZXNEZWxlZ2F0ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJlcGVuZCBhIGxlYWRpbmcgc2xhc2ggdG8gZ2l2ZW4gVVJJLgorICAgICAqCisgICAgICogQHBhcmFtIHVyaSBVUkkgdG8gYmUgbW9kaWZpZWQuCisgICAgICogQHJldHVybiBVUkkgd2l0aCBhIGxlYWRpbmcgc2xhc2ggcHJlcGVuZGVkLCBpZiBub3QgYWJzb2x1dGUuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgVVJJIHNsYXNoKGZpbmFsIFVSSSB1cmkpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHN0clVyaSA9IHVyaS50b1N0cmluZygpOworICAgICAgICByZXR1cm4gKHVyaS5pc0Fic29sdXRlKCkgfHwgc3RyVXJpLmNoYXJBdCgwKSA9PSAnLycpID8gdXJpIDogVVJJLmNyZWF0ZSgnLycgKyBzdHJVcmkpOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgUnVudGltZURlbGVnYXRlIGRlbGVnYXRlID0gUnVudGltZURlbGVnYXRlLmdldEluc3RhbmNlKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBUZXN0Q29udGFpbmVyUmVxdWVzdCByZXF1ZXN0OworCisgICAgLyoqCisgICAgICogQ3JlYXRlIG5ldyBKZXJzZXkgY29udGFpbmVyIHJlcXVlc3QgY29udGV4dCBidWlsZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGJhc2VVcmkgICAgICAgICAgICBiYXNlIGFwcGxpY2F0aW9uIFVSSS4KKyAgICAgKiBAcGFyYW0gcmVxdWVzdFVyaSAgICAgICAgIHJlcXVlc3QgVVJJLgorICAgICAqIEBwYXJhbSBtZXRob2QgICAgICAgICAgICAgcmVxdWVzdCBIVFRQIG1ldGhvZCBuYW1lLgorICAgICAqIEBwYXJhbSBzZWN1cml0eUNvbnRleHQgICAgc2VjdXJpdHkgY29udGV4dCBvZiB0aGUgY3VycmVudCByZXF1ZXN0LiBNYXkgYmUge0Bjb2RlIG51bGx9LgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIHtAbGluayBTZWN1cml0eUNvbnRleHQjZ2V0VXNlclByaW5jaXBhbCgpfSBtdXN0IHJldHVybiB7QGNvZGUgbnVsbH0gaWYgdGhlIGN1cnJlbnQgcmVxdWVzdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzIG5vdCBiZWVuIGF1dGhlbnRpY2F0ZWQgYnkgdGhlIGNvbnRhaW5lci4KKyAgICAgKiBAcGFyYW0gcHJvcGVydGllc0RlbGVnYXRlIGN1c3RvbSB7QGxpbmsgUHJvcGVydGllc0RlbGVnYXRlIHByb3BlcnRpZXMgZGVsZWdhdGV9IHRvIGJlIHVzZWQgYnkgdGhlIGNvbnRleHQsIG1heSBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAge0Bjb2RlIG51bGx9LgorICAgICAqLworICAgIHByaXZhdGUgQ29udGFpbmVyUmVxdWVzdEJ1aWxkZXIoZmluYWwgU3RyaW5nIGJhc2VVcmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVxdWVzdFVyaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXRob2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZWN1cml0eUNvbnRleHQgc2VjdXJpdHlDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUHJvcGVydGllc0RlbGVnYXRlIHByb3BlcnRpZXNEZWxlZ2F0ZSkgeworICAgICAgICB0aGlzKGJhc2VVcmkgPT0gbnVsbCB8fCBiYXNlVXJpLmlzRW1wdHkoKSA/IG51bGwgOiBVUkkuY3JlYXRlKGJhc2VVcmkpLAorICAgICAgICAgICAgICAgIFVSSS5jcmVhdGUocmVxdWVzdFVyaSksCisgICAgICAgICAgICAgICAgbWV0aG9kLAorICAgICAgICAgICAgICAgIHNlY3VyaXR5Q29udGV4dCwKKyAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzRGVsZWdhdGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgSmVyc2V5IGNvbnRhaW5lciByZXF1ZXN0IGNvbnRleHQgYnVpbGRlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBiYXNlVXJpICAgICAgICAgICAgYmFzZSBhcHBsaWNhdGlvbiBVUkkuCisgICAgICogQHBhcmFtIHJlcXVlc3RVcmkgICAgICAgICByZXF1ZXN0IFVSSS4KKyAgICAgKiBAcGFyYW0gbWV0aG9kICAgICAgICAgICAgIHJlcXVlc3QgSFRUUCBtZXRob2QgbmFtZS4KKyAgICAgKiBAcGFyYW0gc2VjdXJpdHlDb250ZXh0ICAgIHNlY3VyaXR5IGNvbnRleHQgb2YgdGhlIGN1cnJlbnQgcmVxdWVzdC4gTWF5IGJlIHtAY29kZSBudWxsfS4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSB7QGxpbmsgU2VjdXJpdHlDb250ZXh0I2dldFVzZXJQcmluY2lwYWwoKX0gbXVzdCByZXR1cm4ge0Bjb2RlIG51bGx9IGlmIHRoZSBjdXJyZW50IHJlcXVlc3QKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhcyBub3QgYmVlbiBhdXRoZW50aWNhdGVkIGJ5IHRoZSBjb250YWluZXIuCisgICAgICogQHBhcmFtIHByb3BlcnRpZXNEZWxlZ2F0ZSBjdXN0b20ge0BsaW5rIFByb3BlcnRpZXNEZWxlZ2F0ZSBwcm9wZXJ0aWVzIGRlbGVnYXRlfSB0byBiZSB1c2VkIGJ5IHRoZSBjb250ZXh0LCBtYXkgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAY29kZSBudWxsfS4KKyAgICAgKi8KKyAgICBwcml2YXRlIENvbnRhaW5lclJlcXVlc3RCdWlsZGVyKGZpbmFsIFVSSSBiYXNlVXJpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVVJJIHJlcXVlc3RVcmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU2VjdXJpdHlDb250ZXh0IHNlY3VyaXR5Q29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFByb3BlcnRpZXNEZWxlZ2F0ZSBwcm9wZXJ0aWVzRGVsZWdhdGUpIHsKKyAgICAgICAgcmVxdWVzdCA9IG5ldyBUZXN0Q29udGFpbmVyUmVxdWVzdChiYXNlVXJpLAorICAgICAgICAgICAgICAgIHNsYXNoKHJlcXVlc3RVcmkpLAorICAgICAgICAgICAgICAgIG1ldGhvZCwKKyAgICAgICAgICAgICAgICBzZWN1cml0eUNvbnRleHQsCisgICAgICAgICAgICAgICAgcHJvcGVydGllc0RlbGVnYXRlID09IG51bGwgPyBuZXcgTWFwUHJvcGVydGllc0RlbGVnYXRlKCkgOiBwcm9wZXJ0aWVzRGVsZWdhdGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEJ1aWxkIGEgSmVyc2V5IGNvbnRhaW5lciByZXF1ZXN0IGNvbnRleHQuIFRoZSBidWlsZCBjb250YWluZXIgcmVxdWVzdCBjYW4gYmUgdXNlZCBpbgorICAgICAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyI2FwcGx5KG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXF1ZXN0KX0gbWV0aG9kIHRvIG9idGFpbgorICAgICAqIHJlc3BvbnNlIGZyb20gSmVyc2V5LgorICAgICAqCisgICAgICogQHJldHVybiB0ZXN0aW5nIGNvbnRhaW5lciByZXF1ZXN0IGNvbnRleHQuCisgICAgICovCisgICAgcHVibGljIENvbnRhaW5lclJlcXVlc3QgYnVpbGQoKSB7CisgICAgICAgIHJldHVybiByZXF1ZXN0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCB0aGUgYWNjZXB0ZWQgcmVzcG9uc2UgbWVkaWEgdHlwZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVkaWFUeXBlcyBhY2NlcHRlZCByZXNwb25zZSBtZWRpYSB0eXBlcy4gSWYge0Bjb2RlIGNvb2tpZX0gaXMge0Bjb2RlIG51bGx9IHRoZW4gYWxsIGN1cnJlbnQgaGVhZGVycyBvZiB0aGUgc2FtZQorICAgICAqICAgICAgICAgICAgICAgICAgIG5hbWUgd2lsbCBiZSByZW1vdmVkLgorICAgICAqIEByZXR1cm4gdGhlIHVwZGF0ZWQgYnVpbGRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGFpbmVyUmVxdWVzdEJ1aWxkZXIgYWNjZXB0KGZpbmFsIFN0cmluZy4uLiBtZWRpYVR5cGVzKSB7CisgICAgICAgIHB1dEhlYWRlcnMoSHR0cEhlYWRlcnMuQUNDRVBULCBtZWRpYVR5cGVzKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIHRoZSBhY2NlcHRlZCByZXNwb25zZSBtZWRpYSB0eXBlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZWRpYVR5cGVzIGFjY2VwdGVkIHJlc3BvbnNlIG1lZGlhIHR5cGVzLiBJZiB7QGNvZGUgY29va2llfSBpcyB7QGNvZGUgbnVsbH0gdGhlbiBhbGwgY3VycmVudCBoZWFkZXJzIG9mIHRoZSBzYW1lCisgICAgICogICAgICAgICAgICAgICAgICAgbmFtZSB3aWxsIGJlIHJlbW92ZWQuCisgICAgICogQHJldHVybiB0aGUgdXBkYXRlZCBidWlsZGVyLgorICAgICAqLworICAgIHB1YmxpYyBDb250YWluZXJSZXF1ZXN0QnVpbGRlciBhY2NlcHQoZmluYWwgTWVkaWFUeXBlLi4uIG1lZGlhVHlwZXMpIHsKKyAgICAgICAgcHV0SGVhZGVycyhIdHRwSGVhZGVycy5BQ0NFUFQsIChPYmplY3RbXSkgbWVkaWFUeXBlcyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgcmVxdWVzdCBlbnRpdHkgaW5wdXQgc3RyZWFtLiBFbnRpdHkge0Bjb2RlIG51bGx9IHZhbHVlcyBhcmUgaWdub3JlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzdHJlYW0gcmVxdWVzdCBlbnRpdHkgaW5wdXQgc3RyZWFtLgorICAgICAqIEByZXR1cm4gdGhlIHVwZGF0ZWQgYnVpbGRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGFpbmVyUmVxdWVzdEJ1aWxkZXIgZW50aXR5KGZpbmFsIElucHV0U3RyZWFtIHN0cmVhbSkgeworICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlcXVlc3Quc2V0RW50aXR5KHN0cmVhbSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0IHRoZSByZXF1ZXN0IGVudGl0eSBhbmQgZW50aXR5IGlucHV0IHN0cmVhbS4gRW50aXR5IHtAY29kZSBudWxsfSB2YWx1ZXMgYXJlIGlnbm9yZWQuCisgICAgICogPHAvPgorICAgICAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLk1lc3NhZ2VCb2R5V29ya2Vyc30gYXJlIHVzZWQgdG8gdHJhbnNmb3JtIHRoZSBvYmplY3QgaW50byBlbnRpdHkgaW5wdXQgc3RyZWFtIHJlcXVpcmVkCisgICAgICogdG8gcHJvY2VzcyB0aGUgcmVxdWVzdC4KKyAgICAgKiA8cC8+CisgICAgICogTk9URTogRW50aXR5IHRyYW5zZm9ybWF0aW9uIGludG8gZW50aXR5IGlucHV0IHN0cmVhbSBkb2Vzbid0IGhhdmUgYW55IGltcGFjdCBvbiBiZW5jaG1hcmtzLgorICAgICAqCisgICAgICogQHBhcmFtIGVudGl0eSAgcmVxdWVzdCBlbnRpdHkgaW5zdGFuY2UuCisgICAgICogQHBhcmFtIHdvcmtlcnMgbWVzc2FnZSBib2R5IHdvcmtlcnMgdG8gdHJhbnNmb3JtIGVudGl0eSBpbnRvIGVudGl0eSBpbnB1dCBzdHJlYW0uCisgICAgICogQHJldHVybiB0aGUgdXBkYXRlZCBidWlsZGVyLgorICAgICAqLworICAgIHB1YmxpYyBDb250YWluZXJSZXF1ZXN0QnVpbGRlciBlbnRpdHkoZmluYWwgT2JqZWN0IGVudGl0eSwgZmluYWwgTWVzc2FnZUJvZHlXb3JrZXJzIHdvcmtlcnMpIHsKKyAgICAgICAgaWYgKGVudGl0eSAhPSBudWxsKSB7CisgICAgICAgICAgICBpZiAoZW50aXR5IGluc3RhbmNlb2YgSW5wdXRTdHJlYW0pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZW50aXR5KChJbnB1dFN0cmVhbSkgZW50aXR5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5zZXRFbnRpdHkoZW50aXR5LCB3b3JrZXJzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIHJlcXVlc3QgZW50aXR5IGFuZCBlbnRpdHkgaW5wdXQgc3RyZWFtLiBFbnRpdHkge0Bjb2RlIG51bGx9IHZhbHVlcyBhcmUgaWdub3JlZC4KKyAgICAgKiA8cC8+CisgICAgICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXJ9IGlzIHJlcXVpcmVkIHRvIG9idGFpbgorICAgICAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLk1lc3NhZ2VCb2R5V29ya2Vyc30gdG8gdHJhbnNmb3JtIHRoZSBvYmplY3QgaW50byBlbnRpdHkgaW5wdXQgc3RyZWFtIHVzZWQgZm9yCisgICAgICogcHJvY2Vzc2luZyB0aGUgcmVxdWVzdC4KKyAgICAgKiA8cC8+CisgICAgICogTk9URTogRW50aXR5IHRyYW5zZm9ybWF0aW9uIGludG8gZW50aXR5IGlucHV0IHN0cmVhbSBkb2Vzbid0IGhhdmUgYW55IGltcGFjdCBvbiBiZW5jaG1hcmtzLgorICAgICAqCisgICAgICogQHBhcmFtIGVudGl0eSAgcmVxdWVzdCBlbnRpdHkgaW5zdGFuY2UuCisgICAgICogQHBhcmFtIGhhbmRsZXIgYXBwbGljYXRpb24gaGFuZGxlciB0byBvYnRhaW4gbWVzc2FnZSBib2R5IHdvcmtlcnMgZnJvbS4KKyAgICAgKiBAcmV0dXJuIHRoZSB1cGRhdGVkIGJ1aWxkZXIuCisgICAgICovCisgICAgcHVibGljIENvbnRhaW5lclJlcXVlc3RCdWlsZGVyIGVudGl0eShmaW5hbCBPYmplY3QgZW50aXR5LCBmaW5hbCBBcHBsaWNhdGlvbkhhbmRsZXIgaGFuZGxlcikgeworICAgICAgICByZXR1cm4gZW50aXR5KGVudGl0eSwgaGFuZGxlci5nZXRJbmplY3Rpb25NYW5hZ2VyKCkuZ2V0SW5zdGFuY2UoTWVzc2FnZUJvZHlXb3JrZXJzLmNsYXNzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGNvbnRlbnQgdHlwZSBvZiB0aGUgZW50aXR5LgorICAgICAqCisgICAgICogQHBhcmFtIGNvbnRlbnRUeXBlIGNvbnRlbnQgbWVkaWEgdHlwZS4KKyAgICAgKiBAcmV0dXJuIHRoZSB1cGRhdGVkIGJ1aWxkZXIuCisgICAgICovCisgICAgcHVibGljIENvbnRhaW5lclJlcXVlc3RCdWlsZGVyIHR5cGUoZmluYWwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7CisgICAgICAgIHJlcXVlc3QuZ2V0SGVhZGVycygpLnB1dFNpbmdsZShIdHRwSGVhZGVycy5DT05URU5UX1RZUEUsIGNvbnRlbnRUeXBlKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgY29udGVudCB0eXBlIG9mIHRoZSBlbnRpdHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGVudFR5cGUgY29udGVudCBtZWRpYSB0eXBlLgorICAgICAqIEByZXR1cm4gdGhlIHVwZGF0ZWQgYnVpbGRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGFpbmVyUmVxdWVzdEJ1aWxkZXIgdHlwZShmaW5hbCBNZWRpYVR5cGUgY29udGVudFR5cGUpIHsKKyAgICAgICAgcmVxdWVzdC5nZXRIZWFkZXJzKCkucHV0U2luZ2xlKEh0dHBIZWFkZXJzLkNPTlRFTlRfVFlQRSwgSGVhZGVyVXRpbHMuYXNTdHJpbmcoY29udGVudFR5cGUsIGRlbGVnYXRlKSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZCBhbiBhcmJpdHJhcnkgaGVhZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgIHRoZSBuYW1lIG9mIHRoZSBoZWFkZXIKKyAgICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9mIHRoZSBoZWFkZXIsIHRoZSBoZWFkZXIgd2lsbCBiZSBzZXJpYWxpemVkCisgICAgICogICAgICAgICAgICAgIHVzaW5nIGEge0BsaW5rIGphdmF4LndzLnJzLmV4dC5SdW50aW1lRGVsZWdhdGUuSGVhZGVyRGVsZWdhdGV9IGlmCisgICAgICogICAgICAgICAgICAgIG9uZSBpcyBhdmFpbGFibGUgdmlhIHtAbGluayBqYXZheC53cy5ycy5leHQuUnVudGltZURlbGVnYXRlI2NyZWF0ZUhlYWRlckRlbGVnYXRlKGphdmEubGFuZy5DbGFzcyl9CisgICAgICogICAgICAgICAgICAgIGZvciB0aGUgY2xhc3Mgb2Yge0Bjb2RlIHZhbHVlfSBvciB1c2luZyBpdHMge0Bjb2RlIHRvU3RyaW5nfSBtZXRob2QKKyAgICAgKiAgICAgICAgICAgICAgaWYgYSBoZWFkZXIgZGVsZWdhdGUgaXMgbm90IGF2YWlsYWJsZS4gSWYge0Bjb2RlIHZhbHVlfSBpcyB7QGNvZGUgbnVsbH0KKyAgICAgKiAgICAgICAgICAgICAgdGhlbiBhbGwgY3VycmVudCBoZWFkZXJzIG9mIHRoZSBzYW1lIG5hbWUgd2lsbCBiZSByZW1vdmVkLgorICAgICAqIEByZXR1cm4gdGhlIHVwZGF0ZWQgYnVpbGRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGFpbmVyUmVxdWVzdEJ1aWxkZXIgaGVhZGVyKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgcHV0SGVhZGVyKG5hbWUsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGEgY29va2llIHRvIGJlIHNldC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb29raWUgdG8gYmUgc2V0LiBJZiB7QGNvZGUgY29va2llfSBpcyB7QGNvZGUgbnVsbH0gdGhlbiBhbGwgY3VycmVudCBoZWFkZXJzIG9mIHRoZSBzYW1lIG5hbWUgd2lsbCBiZSByZW1vdmVkLgorICAgICAqIEByZXR1cm4gdGhlIHVwZGF0ZWQgYnVpbGRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ29udGFpbmVyUmVxdWVzdEJ1aWxkZXIgY29va2llKGZpbmFsIENvb2tpZSBjb29raWUpIHsKKyAgICAgICAgcHV0SGVhZGVyKEh0dHBIZWFkZXJzLkNPT0tJRSwgY29va2llKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkIGNvb2tpZXMgdG8gYmUgc2V0LgorICAgICAqCisgICAgICogQHBhcmFtIGNvb2tpZXMgdG8gYmUgc2V0LiBJZiB7QGNvZGUgY29va2llc30gaXMge0Bjb2RlIG51bGx9IHRoZW4gYWxsIGN1cnJlbnQgaGVhZGVycyBvZiB0aGUgc2FtZSBuYW1lIHdpbGwgYmUgcmVtb3ZlZC4KKyAgICAgKiBAcmV0dXJuIHRoZSB1cGRhdGVkIGJ1aWxkZXIuCisgICAgICovCisgICAgcHVibGljIENvbnRhaW5lclJlcXVlc3RCdWlsZGVyIGNvb2tpZXMoZmluYWwgQ29va2llLi4uIGNvb2tpZXMpIHsKKyAgICAgICAgcHV0SGVhZGVycyhIdHRwSGVhZGVycy5DT09LSUUsIChPYmplY3RbXSkgY29va2llcyk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwdXRIZWFkZXIoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIE9iamVjdCB2YWx1ZSkgeworICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmVxdWVzdC5nZXRIZWFkZXJzKCkucmVtb3ZlKG5hbWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHJlcXVlc3QuaGVhZGVyKG5hbWUsIEhlYWRlclV0aWxzLmFzU3RyaW5nKHZhbHVlLCBkZWxlZ2F0ZSkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwdXRIZWFkZXJzKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBPYmplY3QuLi4gdmFsdWVzKSB7CisgICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmVxdWVzdC5nZXRIZWFkZXJzKCkucmVtb3ZlKG5hbWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHJlcXVlc3QuZ2V0SGVhZGVycygpLmFkZEFsbChuYW1lLCBIZWFkZXJVdGlscy5hc1N0cmluZ0xpc3QoQXJyYXlzLmFzTGlzdCh2YWx1ZXMpLCBkZWxlZ2F0ZSkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBwdXRIZWFkZXJzKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcuLi4gdmFsdWVzKSB7CisgICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgeworICAgICAgICAgICAgcmVxdWVzdC5nZXRIZWFkZXJzKCkucmVtb3ZlKG5hbWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHJlcXVlc3QuZ2V0SGVhZGVycygpLmFkZEFsbChuYW1lLCB2YWx1ZXMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL3V0aWwvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L3V0aWwvc2VydmVyL1Rlc3RDb250YWluZXJSZXF1ZXN0LmphdmEgYi90ZXN0LWZyYW1ld29yay91dGlsL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC91dGlsL3NlcnZlci9UZXN0Q29udGFpbmVyUmVxdWVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjOWJiZWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay91dGlsL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC91dGlsL3NlcnZlci9UZXN0Q29udGFpbmVyUmVxdWVzdC5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QudXRpbC5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY1R5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZEhhc2hNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5TZWN1cml0eUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuUHJvcGVydGllc0RlbGVnYXRlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuTWVzc2FnZUJvZHlXb3JrZXJzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXF1ZXN0OworCisvKioKKyAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdCBDb250YWluZXIgcmVxdWVzdCBjb250ZXh0fSB1c2VkIGZvciB0ZXN0aW5nL2JlbmNobWFya2luZyBwdXJwb3Nlcy4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqIEBzaW5jZSAyLjE3CisgKi8KK2ZpbmFsIGNsYXNzIFRlc3RDb250YWluZXJSZXF1ZXN0IGV4dGVuZHMgQ29udGFpbmVyUmVxdWVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihUZXN0Q29udGFpbmVyUmVxdWVzdC5jbGFzcy5nZXROYW1lKCkpOworCisgICAgVGVzdENvbnRhaW5lclJlcXVlc3QoZmluYWwgVVJJIGJhc2VVcmksCisgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVVJJIHJlcXVlc3RVcmksCisgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1ldGhvZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTZWN1cml0eUNvbnRleHQgc2VjdXJpdHlDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFByb3BlcnRpZXNEZWxlZ2F0ZSBwcm9wZXJ0aWVzRGVsZWdhdGUpIHsKKyAgICAgICAgc3VwZXIoYmFzZVVyaSwgcmVxdWVzdFVyaSwgbWV0aG9kLCBzZWN1cml0eUNvbnRleHQsIHByb3BlcnRpZXNEZWxlZ2F0ZSk7CisgICAgfQorCisgICAgdm9pZCBzZXRFbnRpdHkoZmluYWwgSW5wdXRTdHJlYW0gc3RyZWFtKSB7CisgICAgICAgIHNldEVudGl0eVN0cmVhbShzdHJlYW0pOworICAgIH0KKworICAgIHZvaWQgc2V0RW50aXR5KGZpbmFsIE9iamVjdCByZXF1ZXN0RW50aXR5LCBmaW5hbCBNZXNzYWdlQm9keVdvcmtlcnMgd29ya2VycykgeworICAgICAgICBmaW5hbCBPYmplY3QgZW50aXR5OworICAgICAgICBmaW5hbCBHZW5lcmljVHlwZSBlbnRpdHlUeXBlOworCisgICAgICAgIGlmIChyZXF1ZXN0RW50aXR5IGluc3RhbmNlb2YgR2VuZXJpY0VudGl0eSkgeworICAgICAgICAgICAgZW50aXR5ID0gKChHZW5lcmljRW50aXR5KSByZXF1ZXN0RW50aXR5KS5nZXRFbnRpdHkoKTsKKyAgICAgICAgICAgIGVudGl0eVR5cGUgPSBuZXcgR2VuZXJpY1R5cGUoKChHZW5lcmljRW50aXR5KSByZXF1ZXN0RW50aXR5KS5nZXRUeXBlKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZW50aXR5ID0gcmVxdWVzdEVudGl0eTsKKyAgICAgICAgICAgIGVudGl0eVR5cGUgPSBuZXcgR2VuZXJpY1R5cGUocmVxdWVzdEVudGl0eS5nZXRDbGFzcygpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIGJ5dGVbXSBlbnRpdHlCeXRlczsKKworICAgICAgICBpZiAoZW50aXR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzdHJlYW0gPSB3b3JrZXJzLndyaXRlVG8oZW50aXR5LCBlbnRpdHkuZ2V0Q2xhc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eVR5cGUuZ2V0VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFubm90YXRpb25bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRNZWRpYVR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNdWx0aXZhbHVlZEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KGdldEhlYWRlcnMoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRQcm9wZXJ0aWVzRGVsZWdhdGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLjxXcml0ZXJJbnRlcmNlcHRvcj5lbXB0eUxpc3QoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiB8IFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5TRVZFUkUsICJUcmFuc2Zvcm1pbmcgZW50aXR5IHRvIGlucHV0IHN0cmVhbSBmYWlsZWQuIiwgZXgpOworICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZW50aXR5Qnl0ZXMgPSBvdXRwdXQudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVudGl0eUJ5dGVzID0gbmV3IGJ5dGVbMF07CisgICAgICAgIH0KKworICAgICAgICBzZXRFbnRpdHkobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGVudGl0eUJ5dGVzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdC1mcmFtZXdvcmsvdXRpbC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvdXRpbC9jbGllbnQvTG9vcEJhY2tDb25uZWN0b3JUZXN0LmphdmEgYi90ZXN0LWZyYW1ld29yay91dGlsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC91dGlsL2NsaWVudC9Mb29wQmFja0Nvbm5lY3RvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGI0MGVkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdC1mcmFtZXdvcmsvdXRpbC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3QvdXRpbC9jbGllbnQvTG9vcEJhY2tDb25uZWN0b3JUZXN0LmphdmEKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC51dGlsLmNsaWVudDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY1JlZmVyZW5jZTsKKworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5JbnZvY2F0aW9uQ2FsbGJhY2s7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLm51bGxWYWx1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIEJhc2ljIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnV0aWwuY2xpZW50Lkxvb3BCYWNrQ29ubmVjdG9yfSB1bml0IHRlc3RzLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgTG9vcEJhY2tDb25uZWN0b3JUZXN0IHsKKworICAgIHByaXZhdGUgQ2xpZW50IGNsaWVudDsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudChMb29wQmFja0Nvbm5lY3RvclByb3ZpZGVyLmdldENsaWVudENvbmZpZygpKTsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGNsaWVudC5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVhZGVyc0FuZFN0YXR1cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IGNsaWVudC50YXJnZXQoImJheiIpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5oZWFkZXIoImZvbyIsICJiYXIiKQorICAgICAgICAgICAgICAgIC5oZWFkZXIoImJhciIsICJmb28iKQorICAgICAgICAgICAgICAgIC5nZXQoKTsKKworICAgICAgICBhc3NlcnRUaGF0KCJVbmV4cGVjdGVkIEhUVFAgcmVzcG9uc2Ugc3RhdHVzIiwgcmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKExvb3BCYWNrQ29ubmVjdG9yLlRFU1RfTE9PUEJBQ0tfQ09ERSkpOworICAgICAgICBhc3NlcnRUaGF0KCJJbnZhbGlkIHZhbHVlIG9mIGhlYWRlciAnZm9vJyIsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiZm9vIiksIGlzKCJiYXIiKSk7CisgICAgICAgIGFzc2VydFRoYXQoIkludmFsaWQgdmFsdWUgb2YgaGVhZGVyICdiYXInIiwgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJiYXIiKSwgaXMoImZvbyIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSBjbGllbnQudGFyZ2V0KCJiYXoiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkudGV4dCgiZm9vIikpOworCisgICAgICAgIGFzc2VydFRoYXQoIkludmFsaWQgZW50aXR5IHJlY2VpdmVkIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBpcygiZm9vIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVudGl0eU1lZGlhVHlwZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IGNsaWVudC50YXJnZXQoImJheiIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoImZvbyIsICJmb28vYmFyIikpOworCisgICAgICAgIGFzc2VydFRoYXQoIkludmFsaWQgZW50aXR5IHJlY2VpdmVkIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBpcygiZm9vIikpOworICAgICAgICBhc3NlcnRUaGF0KCJJbnZhbGlkIGNvbnRlbnQtdHlwZSByZWNlaXZlZCIsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpLCBpcyhuZXcgTWVkaWFUeXBlKCJmb28iLCAiYmFyIikpKTsKKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgY2xpZW50LmNsb3NlKCk7CisgICAgICAgIGNsaWVudC50YXJnZXQoImJheiIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luYygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgZmluYWwgQXRvbWljUmVmZXJlbmNlPFRocm93YWJsZT4gdGhyb3dhYmxlID0gbmV3IEF0b21pY1JlZmVyZW5jZTw+KCk7CisKKyAgICAgICAgY2xpZW50LnRhcmdldCgiYmF6IikucmVxdWVzdCgpLmFzeW5jKCkuZ2V0KG5ldyBJbnZvY2F0aW9uQ2FsbGJhY2s8UmVzcG9uc2U+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBjb21wbGV0ZWQoZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBmYWlsZWQoZmluYWwgVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICB0aHJvd2FibGUuc2V0KHQpOworICAgICAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBsYXRjaC5hd2FpdCgpOworCisgICAgICAgIGFzc2VydFRoYXQoIkFzeW5jIHJlcXVlc3QgZmFpbGVkIiwgdGhyb3dhYmxlLmdldCgpLCBudWxsVmFsdWUoKSk7CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBQcm9jZXNzaW5nRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGNsaWVudC50YXJnZXQoImJheiIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5qc29uKEFycmF5cy5hc0xpc3QoImZvbyIsICJiYXIiKSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3QtZnJhbWV3b3JrL3V0aWwvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0L3V0aWwvcnVubmVyL0NvbmN1cnJlbnRSdW5uZXJUZXN0LmphdmEgYi90ZXN0LWZyYW1ld29yay91dGlsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC91dGlsL3J1bm5lci9Db25jdXJyZW50UnVubmVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMGMwNTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0LWZyYW1ld29yay91dGlsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdC91dGlsL3J1bm5lci9Db25jdXJyZW50UnVubmVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC51dGlsLnJ1bm5lcjsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworCitpbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworLyoqCisgKiBUZXN0IGNvbmN1cnJlbnQgcnVubmVyIGludm9rZXMgYWxsIHRlc3QgbWV0aG9kcy4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUnVuV2l0aChDb25jdXJyZW50UnVubmVyLmNsYXNzKQorcHVibGljIGNsYXNzIENvbmN1cnJlbnRSdW5uZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgeworCisgICAgZmluYWwgQXRvbWljSW50ZWdlciB0ZXN0MUludm9jYXRpb25zID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKyAgICBmaW5hbCBBdG9taWNJbnRlZ2VyIHRlc3QySW52b2NhdGlvbnMgPSBuZXcgQXRvbWljSW50ZWdlcigpOworICAgIGZpbmFsIEF0b21pY0ludGVnZXIgYmVmb3JlSW52b2NhdGlvbnMgPSBuZXcgQXRvbWljSW50ZWdlcigpOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIGJlZm9yZSgpIHsKKyAgICAgICAgYmVmb3JlSW52b2NhdGlvbnMuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25lKCkgeworICAgICAgICBfdGVzdCh0ZXN0MUludm9jYXRpb25zKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUd28oKSB7CisgICAgICAgIF90ZXN0KHRlc3QySW52b2NhdGlvbnMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQElnbm9yZQorICAgIHB1YmxpYyB2b2lkIGlnbm9yZWRUZXN0KCkgeworICAgICAgICBmYWlsKCJUaGUgdGVzdCBzaG91bGQgYmUgaWdub3JlZCEiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3QoQXRvbWljSW50ZWdlciB0ZXN0Q291bnRlcikgeworICAgICAgICBpZiAodGVzdENvdW50ZXIuZ2V0QW5kSW5jcmVtZW50KCkgPiAwKSB7CisgICAgICAgICAgICBmYWlsKCJ0ZXN0IG1ldGhvZCBpbnZva2VkIG1vcmUgdGhhbiBvbmNlISIpOworICAgICAgICB9CisgICAgICAgIGlmIChiZWZvcmVJbnZvY2F0aW9ucy5nZXQoKSA9PSAwKSB7CisgICAgICAgICAgICBmYWlsKCJCZWZvcmUgdGVzdCBtZXRob2QgaGFzIG5vdCBiZWVuIGNhbGxlZCEiKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNsaWVudC9wb20ueG1sIGIvdGVzdHMvZTJlLWNsaWVudC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZDdiMTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY2xpZW50L3BvbS54bWwKQEAgLTAsMCArMSwyMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5lMmUtY2xpZW50PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWUyZS1jbGllbnQ8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+SmVyc2V5IEUyRSBDbGllbnQgdGVzdHM8L2Rlc2NyaXB0aW9uPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGZvcmtDb3VudD4xPC9mb3JrQ291bnQ+CisgICAgICAgICAgICAgICAgICAgIDxyZXVzZUZvcmtzPmZhbHNlPC9yZXVzZUZvcmtzPgorICAgICAgICAgICAgICAgICAgICA8ZW5hYmxlQXNzZXJ0aW9ucz5mYWxzZTwvZW5hYmxlQXNzZXJ0aW9ucz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1idW5kbGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dHlwZT5wb208L3R5cGU+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5hbm5vdGF0aW9uPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguYW5ub3RhdGlvbi1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbXZjPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW12Yy1mcmVlbWFya2VyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW12Yy1tdXN0YWNoZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLWpzb24tamFja3NvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLWpzb24tamFja3NvbjE8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1qc29uLWpldHRpc29uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtbW94eTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLWpzb24tcHJvY2Vzc2luZzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1iZWFuLXZhbGlkYXRpb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktZW50aXR5LWZpbHRlcmluZzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tdmMtYmVhbi12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtc3NlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtbXVsdGlwYXJ0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29ubmVjdG9yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1hcGFjaGUtY29ubmVjdG9yPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29ubmVjdG9yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1ncml6emx5LWNvbm5lY3RvcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbm5lY3RvcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktamV0dHktY29ubmVjdG9yPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29ubmVjdG9yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1qZGstY29ubmVjdG9yPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VjdXJpdHk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vYXV0aDEtc2lnbmF0dXJlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VjdXJpdHk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vYXV0aDEtY2xpZW50PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VjdXJpdHk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vYXV0aDEtc2VydmVyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VjdXJpdHk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5vYXV0aDItY2xpZW50PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmd1YXZhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Z3VhdmE8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke2d1YXZhLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yazwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay11dGlsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuaGFtY3Jlc3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5oYW1jcmVzdC1saWJyYXJ5PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD54bWx1bml0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+eG1sdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD54ZGs8L2lkPgorICAgICAgICAgICAgPHByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgPCEtLSBkbyBub3QgdXNlIHNlY3VyaXR5IG1hbmFnZXIgZm9yIHhkayAtLT4KKyAgICAgICAgICAgICAgICA8c3VyZWZpcmUuc2VjdXJpdHkuYXJnbGluZSAvPgorICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnNvbmFyPC9pZD4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZGlzYWJsZSBKYUNvQ28gbGlzdGVuZXIgYmVjYXVzZSBpdCdzIG5vdCB3b3JraW5nIHdpdGggPGZvcmtNb2RlPmFsd2F5czwvZm9yaz4gKDxyZXVzZUZvcmtzPmZhbHNlPC9yZXVzZUZvcmtzPiByZXNwZWN0aXZlbHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBzOi8vamlyYS5zb25hcnNvdXJjZS5jb20vYnJvd3NlL1NPTkFSSkFWQS03MjggKGh0dHBzOi8vZ2l0aHViLmNvbS9Tb25hclNvdXJjZS9zb25hci1qYXZhL3B1bGwvMzI0KSAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnRpZXMgY29tYmluZS5zZWxmPSJvdmVycmlkZSIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKworICAgIDwvcHJvZmlsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0Fib3J0UmVzcG9uc2VDbGllbnRUZXN0LmphdmEgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9BYm9ydFJlc3BvbnNlQ2xpZW50VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMTJhM2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9BYm9ydFJlc3BvbnNlQ2xpZW50VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jbGllbnQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuQ2FsZW5kYXI7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVzcG9uc2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXNwb25zZUZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuSW52b2NhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTmV3Q29va2llOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3RzIGFib3J0aW5nIHRoZSByZXF1ZXN0IG9uIHRoZSBjbGllbnQgc2lkZS4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBBYm9ydFJlc3BvbnNlQ2xpZW50VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhUZXN0UmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcXVlc3RBYm9ydCgpIHsKKworICAgICAgICBmaW5hbCBEYXRlIGRhdGUgPSBnZXREYXRlKCk7CisKKyAgICAgICAgQ2xpZW50UmVxdWVzdEZpbHRlciBvdXRGaWx0ZXIgPSBuZXcgQ2xpZW50UmVxdWVzdEZpbHRlcigpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ2xpZW50UmVxdWVzdENvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBOZXdDb29raWUgY29va2llMSA9IG5ldyBOZXdDb29raWUoImNvb2tpZTEiLCAiY29va2llMSIpOworICAgICAgICAgICAgICAgIE5ld0Nvb2tpZSBjb29raWUyID0gbmV3IE5ld0Nvb2tpZSgiY29va2llMiIsICJjb29raWUyIik7CisgICAgICAgICAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSBSZXNwb25zZS5vaygpLmNvb2tpZShjb29raWUxKS5jb29raWUoY29va2llMikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5oZWFkZXIoImhlYWQxIiwgImhlYWQxIikuaGVhZGVyKEh0dHBIZWFkZXJzLkRBVEUsIGRhdGUpLmhlYWRlcihIdHRwSGVhZGVycy5FVEFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIxMjM0NjVcIiIpLmhlYWRlcihIdHRwSGVhZGVycy5DT05URU5UX0xBTkdVQUdFLCAibGFuZ3VhZ2UiKS5oZWFkZXIoSHR0cEhlYWRlcnMuTEFTVF9NT0RJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZSkuaGVhZGVyKEh0dHBIZWFkZXJzLkNPTlRFTlRfTEVOR1RILCA5OSkudHlwZShNZWRpYVR5cGUuVEVYVF9IVE1MX1RZUEUpCisgICAgICAgICAgICAgICAgICAgICAgICAubG9jYXRpb24oVVJJLmNyZWF0ZSgid3d3Lm9yYWNsZS5jb20iKSkuYnVpbGQoKTsKKworICAgICAgICAgICAgICAgIC8vIGFib3J0IHRoZSByZXF1ZXN0CisgICAgICAgICAgICAgICAgY29udGV4dC5hYm9ydFdpdGgocmVzcG9uc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBDbGllbnRSZXNwb25zZUZpbHRlciBpbkZpbHRlciA9IG5ldyBDbGllbnRSZXNwb25zZUZpbHRlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENsaWVudFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudFJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgTWFwPFN0cmluZywgTmV3Q29va2llPiBtYXAgPSByZXNwb25zZUNvbnRleHQuZ2V0Q29va2llcygpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiY29va2llMSIsIG1hcC5nZXQoImNvb2tpZTEiKS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImNvb2tpZTIiLCBtYXAuZ2V0KCJjb29raWUyIikuZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMgPSByZXNwb25zZUNvbnRleHQuZ2V0SGVhZGVycygpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiaGVhZDEiLCBoZWFkZXJzLmdldCgiaGVhZDEiKS5nZXQoMCkpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhkYXRlLmdldFRpbWUoKSwgcmVzcG9uc2VDb250ZXh0LmdldERhdGUoKS5nZXRUaW1lKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0Iik7CisgICAgICAgIHRhcmdldC5yZWdpc3RlcihvdXRGaWx0ZXIpLnJlZ2lzdGVyKGluRmlsdGVyKTsKKyAgICAgICAgSW52b2NhdGlvbiBpID0gdGFyZ2V0LnJlcXVlc3QoKS5idWlsZEdldCgpOworICAgICAgICBSZXNwb25zZSByID0gaS5pbnZva2UoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImhlYWQxIiwgci5nZXRIZWFkZXJTdHJpbmcoImhlYWQxIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvb2tpZTEiLCByLmdldENvb2tpZXMoKS5nZXQoImNvb2tpZTEiKS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb29raWUyIiwgci5nZXRDb29raWVzKCkuZ2V0KCJjb29raWUyIikuZ2V0VmFsdWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhkYXRlLmdldFRpbWUoKSwgci5nZXREYXRlKCkuZ2V0VGltZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxMjM0NjUiLCByLmdldEVudGl0eVRhZygpLmdldFZhbHVlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImxhbmd1YWdlIiwgci5nZXRMYW5ndWFnZSgpLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZGF0ZS5nZXRUaW1lKCksIHIuZ2V0TGFzdE1vZGlmaWVkKCkuZ2V0VGltZSgpKTsKKyAgICAgICAgLy8gQXNzZXJ0LmFzc2VydEVxdWFscygidXJpIiwgci5nZXRMaW5rKCJsaW5rIikpOyBUT0RPOiBub3Qgc3VwcG9ydGVkIHlldAorICAgICAgICBhc3NlcnRFcXVhbHMoInd3dy5vcmFjbGUuY29tIiwgci5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFUeXBlLlRFWFRfSFRNTF9UWVBFLCByLmdldE1lZGlhVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDk5LCByLmdldExlbmd0aCgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIERhdGUgZ2V0RGF0ZSgpIHsKKyAgICAgICAgQ2FsZW5kYXIgY2FsID0gQ2FsZW5kYXIuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgY2FsLnNldChDYWxlbmRhci5ZRUFSLCAyMDEyKTsKKyAgICAgICAgY2FsLnNldChDYWxlbmRhci5NT05USCwgNyk7CisgICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuREFZX09GX01PTlRILCAxKTsKKyAgICAgICAgY2FsLnNldChDYWxlbmRhci5IT1VSLCAxMCk7CisgICAgICAgIGNhbC5zZXQoQ2FsZW5kYXIuTUlOVVRFLCA1KTsKKyAgICAgICAgY2FsLnNldChDYWxlbmRhci5TRUNPTkQsIDEpOworICAgICAgICBjYWwuc2V0KENhbGVuZGFyLk1JTExJU0VDT05ELCAwKTsKKyAgICAgICAgcmV0dXJuIGNhbC5nZXRUaW1lKCk7CisgICAgfQorCisgICAgQFBhdGgoInRlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJ0aGlzIHdpbGwgbmV2ZXIgYmUgY2FsbGVkLiI7CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0Jhc2ljQ2xpZW50VGVzdC5qYXZhIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvQmFzaWNDbGllbnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk2YWRiMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0Jhc2ljQ2xpZW50VGVzdC5qYXZhCkBAIC0wLDAgKzEsNDM4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jbGllbnQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29tcGxldGFibGVGdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5Bc3luY0ludm9rZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50Lkludm9jYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50Lkludm9jYXRpb25DYWxsYmFjazsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0OworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRBc3luY0V4ZWN1dG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5UaHJlYWRQb29sRXhlY3V0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90U2FtZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKK2ltcG9ydCBzdGF0aWMgamF2YXgud3MucnMuY2xpZW50LkVudGl0eS50ZXh0OworCisvKioKKyAqIFRlc3RzIHN5bmMgYW5kIGFzeW5jIGNsaWVudCBpbnZvY2F0aW9ucy4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQmFzaWNDbGllbnRUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICAvLyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKyAgICAgICAgLy8gICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5EVU1QX0VOVElUWSk7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbUV4ZWN1dG9yc0FzeW5jKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBDbGllbnRDb25maWcgamVyc2V5Q29uZmlnID0gbmV3IENsaWVudENvbmZpZygpOworICAgICAgICBqZXJzZXlDb25maWcucmVnaXN0ZXIoQ3VzdG9tRXhlY3V0b3JQcm92aWRlci5jbGFzcykucmVnaXN0ZXIoVGhyZWFkSW50ZXJjZXB0b3IuY2xhc3MpOworICAgICAgICBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoamVyc2V5Q29uZmlnKTsKKyAgICAgICAgcnVuQ3VzdG9tRXhlY3V0b3JUZXN0QXN5bmMoY2xpZW50KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21FeGVjdXRvcnNJbnN0YW5jZUFzeW5jKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBDbGllbnRDb25maWcgamVyc2V5Q29uZmlnID0gbmV3IENsaWVudENvbmZpZygpOworICAgICAgICBqZXJzZXlDb25maWcucmVnaXN0ZXIobmV3IEN1c3RvbUV4ZWN1dG9yUHJvdmlkZXIoKSkucmVnaXN0ZXIoVGhyZWFkSW50ZXJjZXB0b3IuY2xhc3MpOworICAgICAgICBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoamVyc2V5Q29uZmlnKTsKKyAgICAgICAgcnVuQ3VzdG9tRXhlY3V0b3JUZXN0QXN5bmMoY2xpZW50KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21FeGVjdXRvcnNTeW5jKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBDbGllbnRDb25maWcgamVyc2V5Q29uZmlnID0gbmV3IENsaWVudENvbmZpZygpOworICAgICAgICBqZXJzZXlDb25maWcucmVnaXN0ZXIoQ3VzdG9tRXhlY3V0b3JQcm92aWRlci5jbGFzcykucmVnaXN0ZXIoVGhyZWFkSW50ZXJjZXB0b3IuY2xhc3MpOworICAgICAgICBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoamVyc2V5Q29uZmlnKTsKKyAgICAgICAgcnVuQ3VzdG9tRXhlY3V0b3JUZXN0U3luYyhjbGllbnQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbUV4ZWN1dG9yc0luc3RhbmNlU3luYygpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xpZW50Q29uZmlnIGplcnNleUNvbmZpZyA9IG5ldyBDbGllbnRDb25maWcoKTsKKyAgICAgICAgamVyc2V5Q29uZmlnLnJlZ2lzdGVyKG5ldyBDdXN0b21FeGVjdXRvclByb3ZpZGVyKCkpLnJlZ2lzdGVyKFRocmVhZEludGVyY2VwdG9yLmNsYXNzKTsKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KGplcnNleUNvbmZpZyk7CisgICAgICAgIHJ1bkN1c3RvbUV4ZWN1dG9yVGVzdFN5bmMoY2xpZW50KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcnVuQ3VzdG9tRXhlY3V0b3JUZXN0QXN5bmMoQ2xpZW50IGNsaWVudCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24geworICAgICAgICBBc3luY0ludm9rZXIgYXN5bmMgPSBjbGllbnQudGFyZ2V0KGdldEJhc2VVcmkoKSkucGF0aCgicmVzb3VyY2UiKS5yZXF1ZXN0KCkuYXN5bmMoKTsKKworICAgICAgICBGdXR1cmU8UmVzcG9uc2U+IGYxID0gYXN5bmMucG9zdCh0ZXh0KCJwb3N0IikpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IGYxLmdldCgpOworICAgICAgICBmaW5hbCBTdHJpbmcgZW50aXR5ID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoImN1c3RvbS1hc3luYy1yZXF1ZXN0LXBvc3QiLCBlbnRpdHkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBydW5DdXN0b21FeGVjdXRvclRlc3RTeW5jKENsaWVudCBjbGllbnQpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IGNsaWVudC50YXJnZXQoZ2V0QmFzZVVyaSgpKS5wYXRoKCJyZXNvdXJjZSIpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdCh0ZXh0KCJwb3N0IikpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBlbnRpdHkgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydE5vdFNhbWUoImN1c3RvbS1hc3luYy1yZXF1ZXN0LXBvc3QiLCBlbnRpdHkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFzeW5jQ2xpZW50SW52b2NhdGlvbigpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHJlc291cmNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKTsKKworICAgICAgICBGdXR1cmU8UmVzcG9uc2U+IGYxID0gcmVzb3VyY2UucmVxdWVzdCgpLmFzeW5jKCkucG9zdCh0ZXh0KCJwb3N0MSIpKTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSBmMS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwb3N0MSIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgRnV0dXJlPFN0cmluZz4gZjIgPSByZXNvdXJjZS5yZXF1ZXN0KCkuYXN5bmMoKS5wb3N0KHRleHQoInBvc3QyIiksIFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygicG9zdDIiLCBmMi5nZXQoKSk7CisKKyAgICAgICAgRnV0dXJlPExpc3Q8SmF4YlN0cmluZz4+IGYzID0gcmVzb3VyY2UucmVxdWVzdCgpLmFzeW5jKCkuZ2V0KG5ldyBHZW5lcmljVHlwZTxMaXN0PEpheGJTdHJpbmc+PigpIHsKKyAgICAgICAgfSk7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KCJhIiwgImIiLCAiYyIpLnRvU3RyaW5nKCksCisgICAgICAgICAgICAgICAgZjMuZ2V0KCkuc3RyZWFtKCkubWFwKGlucHV0IC0+IGlucHV0LnZhbHVlKS5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpLnRvU3RyaW5nKCkpOworCisgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFN0cmluZz4gZnV0dXJlMSA9IG5ldyBDb21wbGV0YWJsZUZ1dHVyZTw+KCk7CisgICAgICAgIGZpbmFsIFRlc3RDYWxsYmFjazxSZXNwb25zZT4gYzEgPSBuZXcgVGVzdENhbGxiYWNrPFJlc3BvbnNlPihmdXR1cmUxKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBwcm9jZXNzKFJlc3BvbnNlIHJlc3VsdCkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIHJlc291cmNlLnJlcXVlc3QoKS5hc3luYygpLnBvc3QodGV4dCgicG9zdCIpLCBjMSk7CisgICAgICAgIGFzc2VydEVxdWFscygicG9zdCIsIGZ1dHVyZTEuZ2V0KCkpOworCisgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFN0cmluZz4gZnV0dXJlMiA9IG5ldyBDb21wbGV0YWJsZUZ1dHVyZTw+KCk7CisgICAgICAgIGZpbmFsIFRlc3RDYWxsYmFjazxTdHJpbmc+IGMyID0gbmV3IFRlc3RDYWxsYmFjazxTdHJpbmc+KGZ1dHVyZTIpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIHByb2Nlc3MoU3RyaW5nIHJlc3VsdCkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHJlc291cmNlLnJlcXVlc3QoKS5hc3luYygpLnBvc3QodGV4dCgicG9zdCIpLCBjMik7CisgICAgICAgIGFzc2VydEVxdWFscygicG9zdCIsIGZ1dHVyZTIuZ2V0KCkpOworCisgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFN0cmluZz4gZnV0dXJlMyA9IG5ldyBDb21wbGV0YWJsZUZ1dHVyZTw+KCk7CisgICAgICAgIGZpbmFsIFRlc3RDYWxsYmFjazxMaXN0PEpheGJTdHJpbmc+PiBjMyA9IG5ldyBUZXN0Q2FsbGJhY2s8TGlzdDxKYXhiU3RyaW5nPj4oZnV0dXJlMykgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgcHJvY2VzcyhMaXN0PEpheGJTdHJpbmc+IHJlc3VsdCkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQuc3RyZWFtKCkubWFwKGpheGJTdHJpbmcgLT4gamF4YlN0cmluZy52YWx1ZSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKS50b1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICByZXNvdXJjZS5yZXF1ZXN0KCkuYXN5bmMoKS5nZXQoYzMpOworICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCgiYSIsICJiIiwgImMiKS50b1N0cmluZygpLCBmdXR1cmUzLmdldCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luY0NsaWVudEludm9jYXRpb25FcnJvclJlc3BvbnNlKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24geworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgZXJyb3JSZXNvdXJjZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIikucGF0aCgiZXJyb3IiKTsKKworICAgICAgICBGdXR1cmU8UmVzcG9uc2U+IGYxID0gZXJyb3JSZXNvdXJjZS5yZXF1ZXN0KCkuYXN5bmMoKS5nZXQoKTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSBmMS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwNCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImVycm9yIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICBGdXR1cmU8U3RyaW5nPiBmMiA9IGVycm9yUmVzb3VyY2UucmVxdWVzdCgpLmFzeW5jKCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmMi5nZXQoKTsKKyAgICAgICAgICAgIGZhaWwoIkV4ZWN1dGlvbkV4Y2VwdGlvbiBleHBlY3RlZC4iKTsKKyAgICAgICAgfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBUaHJvd2FibGUgY2F1c2UgPSBleC5nZXRDYXVzZSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNhdXNlLmdldENsYXNzKCkpKTsKKyAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlIHIgPSAoKFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKSBjYXVzZSkuZ2V0UmVzcG9uc2UoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg0MDQsIHIuZ2V0U3RhdHVzKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJlcnJvciIsIHIucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgfQorCisgICAgICAgIEZ1dHVyZTxMaXN0PFN0cmluZz4+IGYzID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKS5wYXRoKCJlcnJvcmxpc3QiKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hc3luYygpLmdldChuZXcgR2VuZXJpY1R5cGU8TGlzdDxTdHJpbmc+PigpIHsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGYzLmdldCgpOworICAgICAgICAgICAgZmFpbCgiRXhlY3V0aW9uRXhjZXB0aW9uIGV4cGVjdGVkLiIpOworICAgICAgICB9IGNhdGNoIChFeGVjdXRpb25FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIFRocm93YWJsZSBjYXVzZSA9IGV4LmdldENhdXNlKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oY2F1c2UuZ2V0Q2xhc3MoKSkpOworICAgICAgICAgICAgZmluYWwgUmVzcG9uc2UgciA9ICgoV2ViQXBwbGljYXRpb25FeGNlcHRpb24pIGNhdXNlKS5nZXRSZXNwb25zZSgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDQwNCwgci5nZXRTdGF0dXMoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImVycm9yIiwgci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICB9CisKKyAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8U3RyaW5nPiBmdXR1cmUxID0gbmV3IENvbXBsZXRhYmxlRnV0dXJlPD4oKTsKKyAgICAgICAgZmluYWwgVGVzdENhbGxiYWNrPFJlc3BvbnNlPiBjMSA9IG5ldyBUZXN0Q2FsbGJhY2s8UmVzcG9uc2U+KGZ1dHVyZTEpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIHByb2Nlc3MoUmVzcG9uc2UgcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGVycm9yUmVzb3VyY2UucmVxdWVzdCgpLmFzeW5jKCkuZ2V0KGMxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJlcnJvciIsIGZ1dHVyZTEuZ2V0KCkpOworCisgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFN0cmluZz4gZnV0dXJlMiA9IG5ldyBDb21wbGV0YWJsZUZ1dHVyZTw+KCk7CisgICAgICAgIGZpbmFsIFRlc3RDYWxsYmFjazxTdHJpbmc+IGMyID0gbmV3IFRlc3RDYWxsYmFjazxTdHJpbmc+KGZ1dHVyZTIpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIHByb2Nlc3MoU3RyaW5nIHJlc3VsdCkgeworICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGVycm9yUmVzb3VyY2UucmVxdWVzdCgpLmFzeW5jKCkuZ2V0KGMyKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZ1dHVyZTIuZ2V0KCk7CisgICAgICAgICAgICBmYWlsKCJFeGVjdXRpb25FeGNlcHRpb24gZXhwZWN0ZWQuIik7CisgICAgICAgIH0gY2F0Y2ggKEV4ZWN1dGlvbkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgVGhyb3dhYmxlIGNhdXNlID0gZXguZ2V0Q2F1c2UoKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoV2ViQXBwbGljYXRpb25FeGNlcHRpb24uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjYXVzZS5nZXRDbGFzcygpKSk7CisgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByID0gKChXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbikgY2F1c2UpLmdldFJlc3BvbnNlKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoNDA0LCByLmdldFN0YXR1cygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZXJyb3IiLCByLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIH0KKworICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxTdHJpbmc+IGZ1dHVyZTMgPSBuZXcgQ29tcGxldGFibGVGdXR1cmU8PigpOworICAgICAgICBmaW5hbCBUZXN0Q2FsbGJhY2s8TGlzdDxKYXhiU3RyaW5nPj4gYzMgPSBuZXcgVGVzdENhbGxiYWNrPExpc3Q8SmF4YlN0cmluZz4+KGZ1dHVyZTMpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgU3RyaW5nIHByb2Nlc3MoTGlzdDxKYXhiU3RyaW5nPiByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0LnN0cmVhbSgpLm1hcChqYXhiU3RyaW5nIC0+IGpheGJTdHJpbmcudmFsdWUpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKS5wYXRoKCJlcnJvcmxpc3QiKS5yZXF1ZXN0KCkuYXN5bmMoKS5nZXQoYzMpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgZnV0dXJlMy5nZXQoKTsKKyAgICAgICAgICAgIGZhaWwoIkV4ZWN1dGlvbkV4Y2VwdGlvbiBleHBlY3RlZC4iKTsKKyAgICAgICAgfSBjYXRjaCAoRXhlY3V0aW9uRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBUaHJvd2FibGUgY2F1c2UgPSBleC5nZXRDYXVzZSgpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbi5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGNhdXNlLmdldENsYXNzKCkpKTsKKyAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlIHIgPSAoKFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKSBjYXVzZSkuZ2V0UmVzcG9uc2UoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg0MDQsIHIuZ2V0U3RhdHVzKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJlcnJvciIsIHIucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN5bmNDbGllbnRJbnZvY2F0aW9uKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24geworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgcmVzb3VyY2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZSIpOworCisgICAgICAgIFJlc3BvbnNlIHIxID0gcmVzb3VyY2UucmVxdWVzdCgpLnBvc3QodGV4dCgicG9zdDEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygicG9zdDEiLCByMS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworCisgICAgICAgIFN0cmluZyByMiA9IHJlc291cmNlLnJlcXVlc3QoKS5wb3N0KHRleHQoInBvc3QyIiksIFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygicG9zdDIiLCByMik7CisKKyAgICAgICAgTGlzdDxKYXhiU3RyaW5nPiByMyA9IHJlc291cmNlLnJlcXVlc3QoKS5nZXQobmV3IEdlbmVyaWNUeXBlPExpc3Q8SmF4YlN0cmluZz4+KCkgeworICAgICAgICB9KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoImEiLCAiYiIsICJjIikudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgIHIzLnN0cmVhbSgpLm1hcChpbnB1dCAtPiBpbnB1dC52YWx1ZSkuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTeW5jQ2xpZW50SW52b2NhdGlvbkVycm9yUmVzcG9uc2UoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCBlcnJvclJlc291cmNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKS5wYXRoKCJlcnJvciIpOworCisgICAgICAgIFJlc3BvbnNlIHIxID0gZXJyb3JSZXNvdXJjZS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDQsIHIxLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJlcnJvciIsIHIxLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVycm9yUmVzb3VyY2UucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgZmFpbCgiRXhlY3V0aW9uRXhjZXB0aW9uIGV4cGVjdGVkLiIpOworICAgICAgICB9IGNhdGNoIChXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgZmluYWwgUmVzcG9uc2UgciA9IGV4LmdldFJlc3BvbnNlKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoNDA0LCByLmdldFN0YXR1cygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZXJyb3IiLCByLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKS5wYXRoKCJlcnJvcmxpc3QiKS5yZXF1ZXN0KCkuZ2V0KG5ldyBHZW5lcmljVHlwZTxMaXN0PFN0cmluZz4+KCkgeworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBmYWlsKCJFeGVjdXRpb25FeGNlcHRpb24gZXhwZWN0ZWQuIik7CisgICAgICAgIH0gY2F0Y2ggKFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByID0gZXguZ2V0UmVzcG9uc2UoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg0MDQsIHIuZ2V0U3RhdHVzKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJlcnJvciIsIHIucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgLy8gSkVSU0VZLTE0MTIKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWJvcnRBc3luY1JlcXVlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSW52b2NhdGlvbiBpbnZvY2F0aW9uID0gYWJvcnRpbmdUYXJnZXQoKS5yZXF1ZXN0KCkuYnVpbGRQb3N0KHRleHQoImVudGl0eSIpKTsKKyAgICAgICAgRnV0dXJlPFN0cmluZz4gZnV0dXJlID0gaW52b2NhdGlvbi5zdWJtaXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhYm9ydGVkIiwgZnV0dXJlLmdldCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIC8vIEpFUlNFWS0xNDEyCisgICAgcHVibGljIHZvaWQgdGVzdEFib3J0U3luY1JlcXVlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSW52b2NhdGlvbiBpbnZvY2F0aW9uID0gYWJvcnRpbmdUYXJnZXQoKS5yZXF1ZXN0KCkuYnVpbGRQb3N0KHRleHQoImVudGl0eSIpKTsKKyAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gaW52b2NhdGlvbi5pbnZva2UoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhYm9ydGVkIiwgcmVzcG9uc2UpOworICAgIH0KKworICAgIHByb3RlY3RlZCBXZWJUYXJnZXQgYWJvcnRpbmdUYXJnZXQoKSB7CisgICAgICAgIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpOworICAgICAgICBjbGllbnQucmVnaXN0ZXIobmV3IENsaWVudFJlcXVlc3RGaWx0ZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDbGllbnRSZXF1ZXN0Q29udGV4dCBjdHgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgUmVzcG9uc2UgciA9IFJlc3BvbnNlLm9rKCJhYm9ydGVkIikuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICBjdHguYWJvcnRXaXRoKHIpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIGNsaWVudC50YXJnZXQoImh0dHA6Ly9hbnkud2ViOjg4OCIpOworICAgIH0KKworICAgIEBDbGllbnRBc3luY0V4ZWN1dG9yCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDdXN0b21FeGVjdXRvclByb3ZpZGVyIGV4dGVuZHMgVGhyZWFkUG9vbEV4ZWN1dG9yUHJvdmlkZXIgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHRocmVhZCBwb29sIGV4ZWN1dG9yIHByb3ZpZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEN1c3RvbUV4ZWN1dG9yUHJvdmlkZXIoKSB7CisgICAgICAgICAgICBzdXBlcigiY3VzdG9tLWFzeW5jLXJlcXVlc3QiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGhyZWFkSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBXcml0ZXJJbnRlcmNlcHRvciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGFyb3VuZFdyaXRlVG8oV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKTsgLy8gZS5nLiBjdXN0b20tYXN5bmMtcmVxdWVzdC0wCisgICAgICAgICAgICBmaW5hbCBpbnQgbGFzdEluZGV4T2ZEYXNoID0gbmFtZS5sYXN0SW5kZXhPZignLScpOworICAgICAgICAgICAgY29udGV4dC5zZXRFbnRpdHkoCisgICAgICAgICAgICAgICAgICAgIG5hbWUuc3Vic3RyaW5nKDAsIGxhc3RJbmRleE9mRGFzaCA8IDAgPyBuYW1lLmxlbmd0aCgpIDogbGFzdEluZGV4T2ZEYXNoKSArICItIiArIGNvbnRleHQuZ2V0RW50aXR5KCkpOworICAgICAgICAgICAgY29udGV4dC5wcm9jZWVkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImVycm9yIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRFcnJvcigpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihSZXNwb25zZS5zdGF0dXMoNDA0KS50eXBlKCJ0ZXh0L3BsYWluIikuZW50aXR5KCJlcnJvciIpLmJ1aWxkKCkpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiZXJyb3JsaXN0IikKKyAgICAgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUwpCisgICAgICAgIHB1YmxpYyBMaXN0PEpheGJTdHJpbmc+IGdldEVycm9yTGlzdCgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihSZXNwb25zZS5zdGF0dXMoNDA0KS50eXBlKCJ0ZXh0L3BsYWluIikuZW50aXR5KCJlcnJvciIpLmJ1aWxkKCkpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTCkKKyAgICAgICAgcHVibGljIExpc3Q8SmF4YlN0cmluZz4gZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IEpheGJTdHJpbmcoImEiKSwgbmV3IEpheGJTdHJpbmcoImIiKSwgbmV3IEpheGJTdHJpbmcoImMiKSk7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3QoU3RyaW5nIGVudGl0eSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTApOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZW50aXR5OworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgVGVzdENhbGxiYWNrPFQ+IGltcGxlbWVudHMgSW52b2NhdGlvbkNhbGxiYWNrPFQ+IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIENvbXBsZXRhYmxlRnV0dXJlPFN0cmluZz4gY29tcGxldGFibGVGdXR1cmU7CisKKyAgICAgICAgVGVzdENhbGxiYWNrKENvbXBsZXRhYmxlRnV0dXJlPFN0cmluZz4gY29tcGxldGFibGVGdXR1cmUpIHsKKyAgICAgICAgICAgIHRoaXMuY29tcGxldGFibGVGdXR1cmUgPSBjb21wbGV0YWJsZUZ1dHVyZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjb21wbGV0ZWQoVCByZXN1bHQpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29tcGxldGFibGVGdXR1cmUuY29tcGxldGUocHJvY2VzcyhyZXN1bHQpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICAgICAgY29tcGxldGFibGVGdXR1cmUuY29tcGxldGVFeGNlcHRpb25hbGx5KHQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBwcm9jZXNzKFQgcmVzdWx0KTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmFpbGVkKFRocm93YWJsZSBlcnJvcikgeworICAgICAgICAgICAgaWYgKGVycm9yLmdldENhdXNlKCkgaW5zdGFuY2VvZiBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIGNvbXBsZXRhYmxlRnV0dXJlLmNvbXBsZXRlRXhjZXB0aW9uYWxseShlcnJvci5nZXRDYXVzZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29tcGxldGFibGVGdXR1cmUuY29tcGxldGVFeGNlcHRpb25hbGx5KChlcnJvcikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFhtbFJvb3RFbGVtZW50CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKYXhiU3RyaW5nIHsKKworICAgICAgICBwdWJsaWMgU3RyaW5nIHZhbHVlOworCisgICAgICAgIHB1YmxpYyBKYXhiU3RyaW5nKCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEpheGJTdHJpbmcoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIH0KKyAgICB9Cit9CisKKwpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvQnVmZmVyaW5nVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvQnVmZmVyaW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2OTFmYzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9CdWZmZXJpbmdUZXN0LmphdmEKQEAgLTAsMCArMSwxNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNsaWVudDsKKworaW1wb3J0IGphdmF4LndzLnJzLkhlYWRlclBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuYXBhY2hlLmNvbm5lY3Rvci5BcGFjaGVDb25uZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5SZXF1ZXN0RW50aXR5UHJvY2Vzc2luZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5LmNvbm5lY3Rvci5Hcml6emx5Q29ubmVjdG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBUZXN0cyBjaHVuayBlbmNvZGluZyBhbmQgcG9zc2liaWxpdHkgb2YgYnVmZmVyaW5nIHRoZSBlbnRpdHkuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgY2xhc3MgQnVmZmVyaW5nVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhNeVJlc291cmNlLmNsYXNzLCBMb2dnaW5nRmVhdHVyZS5jbGFzcyk7CisgICAgfQorCisgICAgQFBhdGgoInJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15UmVzb3VyY2UgeworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEJ1ZmZlcmVkKEBIZWFkZXJQYXJhbSgiY29udGVudC1sZW5ndGgiKSBTdHJpbmcgY29udGVudExlbmdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBASGVhZGVyUGFyYW0oInRyYW5zZmVyLWVuY29kaW5nIikgU3RyaW5nIHRyYW5zZmVyRW5jb2RpbmcpIHsKKyAgICAgICAgICAgIGlmICh0cmFuc2ZlckVuY29kaW5nICE9IG51bGwgJiYgdHJhbnNmZXJFbmNvZGluZy5lcXVhbHMoImNodW5rZWQiKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAiY2h1bmtlZCI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY29udGVudExlbmdodDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFwYWNoZUNvbm5lY3RvcigpIHsKKyAgICAgICAgdGVzdFdpdGhCdWZmZXJpbmcoZ2V0QXBhY2hlQ29ubmVjdG9yQ29uZmlnKCkpOworICAgICAgICB0ZXN0V2l0aENodW5rRW5jb2RpbmdXaXRob3V0UHJvcGVydHlEZWZpbml0aW9uKGdldEFwYWNoZUNvbm5lY3RvckNvbmZpZygpKTsKKyAgICAgICAgdGVzdFdpdGhDaHVua0VuY29kaW5nV2l0aFByb3BlcnR5RGVmaW5pdGlvbihnZXRBcGFjaGVDb25uZWN0b3JDb25maWcoKSk7CisgICAgICAgIHRlc3RXaXRoQ2h1bmtFbmNvZGluZ1BlclJlcXVlc3QoZ2V0QXBhY2hlQ29ubmVjdG9yQ29uZmlnKCkpOworICAgICAgICB0ZXN0RGVmYXVsdE9wdGlvbihnZXRBcGFjaGVDb25uZWN0b3JDb25maWcoKSwgUmVxdWVzdEVudGl0eVByb2Nlc3NpbmcuQ0hVTktFRCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R3JpenpseUNvbm5lY3RvcigpIHsKKyAgICAgICAgdGVzdFdpdGhCdWZmZXJpbmcoZ2V0R3JpenpseUNvbm5lY3RvckNvbmZpZygpKTsKKyAgICAgICAgdGVzdFdpdGhDaHVua0VuY29kaW5nV2l0aG91dFByb3BlcnR5RGVmaW5pdGlvbihnZXRHcml6emx5Q29ubmVjdG9yQ29uZmlnKCkpOworICAgICAgICB0ZXN0V2l0aENodW5rRW5jb2RpbmdXaXRoUHJvcGVydHlEZWZpbml0aW9uKGdldEdyaXp6bHlDb25uZWN0b3JDb25maWcoKSk7CisgICAgICAgIHRlc3RXaXRoQ2h1bmtFbmNvZGluZ1BlclJlcXVlc3QoZ2V0R3JpenpseUNvbm5lY3RvckNvbmZpZygpKTsKKyAgICAgICAgdGVzdERlZmF1bHRPcHRpb24oZ2V0R3JpenpseUNvbm5lY3RvckNvbmZpZygpLCBSZXF1ZXN0RW50aXR5UHJvY2Vzc2luZy5DSFVOS0VEKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIdHRwVXJsQ29ubmVjdG9yKCkgeworICAgICAgICB0ZXN0V2l0aEJ1ZmZlcmluZyhnZXRIdHRwVXJsQ29ubmVjdG9yQ29uZmlnKCkpOworICAgICAgICB0ZXN0V2l0aENodW5rRW5jb2RpbmdXaXRob3V0UHJvcGVydHlEZWZpbml0aW9uKGdldEh0dHBVcmxDb25uZWN0b3JDb25maWcoKSk7CisgICAgICAgIHRlc3RXaXRoQ2h1bmtFbmNvZGluZ1dpdGhQcm9wZXJ0eURlZmluaXRpb24oZ2V0SHR0cFVybENvbm5lY3RvckNvbmZpZygpKTsKKyAgICAgICAgdGVzdFdpdGhDaHVua0VuY29kaW5nUGVyUmVxdWVzdChnZXRIdHRwVXJsQ29ubmVjdG9yQ29uZmlnKCkpOworICAgICAgICB0ZXN0RGVmYXVsdE9wdGlvbihnZXRIdHRwVXJsQ29ubmVjdG9yQ29uZmlnKCksIFJlcXVlc3RFbnRpdHlQcm9jZXNzaW5nLkJVRkZFUkVEKTsKKyAgICB9CisKKyAgICBwcml2YXRlIENsaWVudENvbmZpZyBnZXRBcGFjaGVDb25uZWN0b3JDb25maWcoKSB7CisgICAgICAgIHJldHVybiBuZXcgQ2xpZW50Q29uZmlnKCkuY29ubmVjdG9yUHJvdmlkZXIobmV3IEFwYWNoZUNvbm5lY3RvclByb3ZpZGVyKCkpOworICAgIH0KKworICAgIHByaXZhdGUgQ2xpZW50Q29uZmlnIGdldEdyaXp6bHlDb25uZWN0b3JDb25maWcoKSB7CisgICAgICAgIHJldHVybiBuZXcgQ2xpZW50Q29uZmlnKCkuY29ubmVjdG9yUHJvdmlkZXIobmV3IEdyaXp6bHlDb25uZWN0b3JQcm92aWRlcigpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIENsaWVudENvbmZpZyBnZXRIdHRwVXJsQ29ubmVjdG9yQ29uZmlnKCkgeworICAgICAgICByZXR1cm4gbmV3IENsaWVudENvbmZpZygpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0RGVmYXVsdE9wdGlvbihDbGllbnRDb25maWcgY2MsIFJlcXVlc3RFbnRpdHlQcm9jZXNzaW5nIG1vZGUpIHsKKyAgICAgICAgU3RyaW5nIGVudGl0eSA9IGdldFZlcnlMb25nU3RyaW5nKCk7CisgICAgICAgIG1ha2VSZXF1ZXN0KGNjLCBlbnRpdHksIG1vZGUgPT0gUmVxdWVzdEVudGl0eVByb2Nlc3NpbmcuQlVGRkVSRUQgPyBTdHJpbmcudmFsdWVPZihlbnRpdHkubGVuZ3RoKCkpCisgICAgICAgICAgICAgICAgOiAiY2h1bmtlZCIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0V2l0aEJ1ZmZlcmluZyhDbGllbnRDb25maWcgY2MpIHsKKyAgICAgICAgY2MucHJvcGVydHkoQ2xpZW50UHJvcGVydGllcy5SRVFVRVNUX0VOVElUWV9QUk9DRVNTSU5HLCBSZXF1ZXN0RW50aXR5UHJvY2Vzc2luZy5CVUZGRVJFRCk7CisgICAgICAgIFN0cmluZyBlbnRpdHkgPSBnZXRWZXJ5TG9uZ1N0cmluZygpOworCisgICAgICAgIG1ha2VSZXF1ZXN0KGNjLCBlbnRpdHksIFN0cmluZy52YWx1ZU9mKGVudGl0eS5sZW5ndGgoKSkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBtYWtlUmVxdWVzdChDbGllbnRDb25maWcgY2MsIFN0cmluZyBlbnRpdHksIFN0cmluZyBleHBlY3RlZCkgeworICAgICAgICBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoY2MpOworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gY2xpZW50LnRhcmdldChVcmlCdWlsZGVyLmZyb21VcmkoZ2V0QmFzZVVyaSgpKS5wYXRoKCJyZXNvdXJjZSIpLmJ1aWxkKCkpOworCisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoZW50aXR5LCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RXaXRoQ2h1bmtFbmNvZGluZ1dpdGhQcm9wZXJ0eURlZmluaXRpb24oQ2xpZW50Q29uZmlnIGNjKSB7CisgICAgICAgIGNjLnByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuUkVRVUVTVF9FTlRJVFlfUFJPQ0VTU0lORywgUmVxdWVzdEVudGl0eVByb2Nlc3NpbmcuQ0hVTktFRCk7CisgICAgICAgIGNjLnByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuQ0hVTktFRF9FTkNPRElOR19TSVpFLCAzMDAwKTsKKyAgICAgICAgU3RyaW5nIGVudGl0eSA9IGdldFZlcnlMb25nU3RyaW5nKCk7CisKKyAgICAgICAgbWFrZVJlcXVlc3QoY2MsIGVudGl0eSwgImNodW5rZWQiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdFdpdGhDaHVua0VuY29kaW5nV2l0aG91dFByb3BlcnR5RGVmaW5pdGlvbihDbGllbnRDb25maWcgY2MpIHsKKyAgICAgICAgY2MucHJvcGVydHkoQ2xpZW50UHJvcGVydGllcy5SRVFVRVNUX0VOVElUWV9QUk9DRVNTSU5HLCBSZXF1ZXN0RW50aXR5UHJvY2Vzc2luZy5DSFVOS0VEKTsKKyAgICAgICAgU3RyaW5nIGVudGl0eSA9IGdldFZlcnlMb25nU3RyaW5nKCk7CisKKyAgICAgICAgbWFrZVJlcXVlc3QoY2MsIGVudGl0eSwgImNodW5rZWQiKTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzI1JFUVVFU1RfRU5USVRZX1BST0NFU1NJTkd9IGNhbiBiZSBkZWZpbmVkCisgICAgICogcGVyIHJlcXVlc3Qgd2l0aCBkaWZmZXJlbnQgdmFsdWVzLgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCB0ZXN0V2l0aENodW5rRW5jb2RpbmdQZXJSZXF1ZXN0KENsaWVudENvbmZpZyBjYykgeworICAgICAgICBjYy5wcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLlJFUVVFU1RfRU5USVRZX1BST0NFU1NJTkcsIFJlcXVlc3RFbnRpdHlQcm9jZXNzaW5nLkNIVU5LRUQpOworCisgICAgICAgIGNjLnByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuQ0hVTktFRF9FTkNPRElOR19TSVpFLCAzMDAwKTsKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KGNjKTsKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IGNsaWVudC50YXJnZXQoVXJpQnVpbGRlci5mcm9tVXJpKGdldEJhc2VVcmkoKSkucGF0aCgicmVzb3VyY2UiKS5idWlsZCgpKTsKKworICAgICAgICBTdHJpbmcgZW50aXR5ID0gZ2V0VmVyeUxvbmdTdHJpbmcoKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShlbnRpdHksIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiY2h1bmtlZCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQucHJvcGVydHkoQ2xpZW50UHJvcGVydGllcy5SRVFVRVNUX0VOVElUWV9QUk9DRVNTSU5HLCBSZXF1ZXN0RW50aXR5UHJvY2Vzc2luZy5CVUZGRVJFRCkKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShlbnRpdHksIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhTdHJpbmcudmFsdWVPZihlbnRpdHkubGVuZ3RoKCkpLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmVyeUxvbmdTdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDE7IGkrKykgeworICAgICAgICAgICAgc2IuYXBwZW5kKCJoZWxsbGxsbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3V1dXV1dXV1dXV1LiIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0NhbmNlbEZ1dHVyZUNsaWVudFRlc3QuamF2YSBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0NhbmNlbEZ1dHVyZUNsaWVudFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjBhZGU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvQ2FuY2VsRnV0dXJlQ2xpZW50VGVzdC5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNsaWVudDsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbmNlbGxhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZW91dEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5JbnZvY2F0aW9uQ2FsbGJhY2s7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCisvKioKKyAqIFRlc3RzIHRoZSBiZWhhdmlvdXIgb2YgdGhlIEFzeW5jIGNsaWVudCB3aGVuIHRoZSB7QGxpbmsgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlfSBpcyBjYW5jZWxsZWQuCisgKgorICogPHA+CisgKiBUZXN0cywgdGhhdCBpZiB0aGUgYXN5bmMgcmVxdWVzdCBmdXR1cmUgaXMgY2FuY2VsbGVkIGJ5IHRoZSBjbGllbnQsCisgKiB0aGUge0BsaW5rIGphdmF4LndzLnJzLmNsaWVudC5JbnZvY2F0aW9uQ2FsbGJhY2sjY29tcGxldGVkKE9iamVjdCl9IGNhbGxiYWNrIGlzIG5vdCBpbnZva2VkIGFuZCB0aGF0CisgKiB7QGxpbmsgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FuY2VsbGF0aW9uRXhjZXB0aW9ufSBpcyBjb3JyZWN0bHkgcmV0dXJuZWQgKGFjY29yZGluZyB0byBzcGVjLikgdG8KKyAqIHtAbGluayBqYXZheC53cy5ycy5jbGllbnQuSW52b2NhdGlvbkNhbGxiYWNrI2ZhaWxlZChUaHJvd2FibGUpfSBjYWxsYmFjayBtZXRob2QuCisgKiA8L3A+CisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQ2FuY2VsRnV0dXJlQ2xpZW50VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIE1BWF9XQUlUSU5HX1NFQ09ORFMgPSAyTDsKKyAgICBmaW5hbCBDb3VudERvd25MYXRjaCBjb3VudERvd25MYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoVGVzdFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDYW5jZWxGdXR1cmUoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24geworICAgICAgICBGdXR1cmU8UmVzcG9uc2U+IGZ1dHVyZSA9IHRhcmdldCgpLnBhdGgoInRlc3QiKS5yZXF1ZXN0KCkuYXN5bmMoKS5nZXQoCisgICAgICAgICAgICAgICAgbmV3IEludm9jYXRpb25DYWxsYmFjazxSZXNwb25zZT4oKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbXBsZXRlZChmaW5hbCBSZXNwb25zZSByZXNwb25zZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCgiW2NvbXBsZXRlZCgpXSBjYWxsYmFjayB3YXMgaW52b2tlZCwgYWx0aG91Z2ggdGhlIEZ1dHVyZSBzaG91bGQgaGF2ZSBiZWVuIGNhbmNlbGxlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZhaWxlZChmaW5hbCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoQ2FuY2VsbGF0aW9uRXhjZXB0aW9uLmNsYXNzLCB0aHJvd2FibGUuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3VudERvd25MYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICAgICAgaWYgKCFmdXR1cmUuY2FuY2VsKHRydWUpKSB7CisgICAgICAgICAgICBmYWlsKCJUaGUgRnV0dXJlIGNvdWxkIG5vdCBiZSBjYW5jZWxlZC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHByZXZlbnQgdGhlIHRlc3QgY29udGFpbmVyIHRvIHN0b3AgdGhlIG1ldGhvZCBleGVjdXRpb24gYmVmb3JlIHRoZSBjYWxsYmFja3MgY2FuIGJlIHJlYWNoZWQuCisgICAgICAgIGlmICghY291bnREb3duTGF0Y2guYXdhaXQoTUFYX1dBSVRJTkdfU0VDT05EUyAqIGdldEFzeW5jVGltZW91dE11bHRpcGxpZXIoKSwgVGltZVVuaXQuU0VDT05EUykpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUaW1lb3V0RXhjZXB0aW9uKCJDYWxsYmFjayB3YXMgbm90IHRyaWdnZXJlZCB3aXRoaW4gdGhlIHRpbWUgbGltaXQuIiArIGNvdW50RG93bkxhdGNoLmdldENvdW50KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInRlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFJlc291cmNlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0KCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5ub0NvbnRlbnQoKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvQ2h1bmtlZElucHV0U3RyZWFtQ2xvc2VkUHJlbWF0dXJlbHlUZXN0LmphdmEgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9DaHVua2VkSW5wdXRTdHJlYW1DbG9zZWRQcmVtYXR1cmVseVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWY1YzMxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvQ2h1bmtlZElucHV0U3RyZWFtQ2xvc2VkUHJlbWF0dXJlbHlUZXN0LmphdmEKQEAgLTAsMCArMSwyNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNsaWVudDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lb3V0RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5JbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuUmVxdWVzdEVudGl0eVByb2Nlc3Npbmc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5SZWFkZXJXcml0ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5TZXR0YWJsZUZ1dHVyZTsKKworLyoqCisgKiBSZXByb2R1Y2VyIGZvciBKRVJTRVktMjcwNS4gQ2xpZW50IHNpZGUgZW50aXR5IElucHV0U3RyZWFtIGV4Y2VwdGlvbgorICogaW4gY2h1bmtlZCBtb2RlIHNob3VsZCBub3QgbGVhZCB0byB0aGUgc2FtZSBiZWhhdmlvciBvbiB0aGUgc2VydmVyIHNpZGUsCisgKiBhcyBpZiBubyBleGNlcHRpb24gb2NjdXJyZWQgYXQgYWxsLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQ2h1bmtlZElucHV0U3RyZWFtQ2xvc2VkUHJlbWF0dXJlbHlUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihDaHVua2VkSW5wdXRTdHJlYW1DbG9zZWRQcmVtYXR1cmVseVRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBFeGNlcHRpb24gTk9fRVhDRVBUSU9OID0gbmV3IEV4Y2VwdGlvbigiTm8gZXhjZXB0aW9uLiIpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXRvbWljSW50ZWdlciBORVhUX1JFUV9JRCA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFfSURfUEFSQU1fTkFNRSA9ICJ0ZXN0LXJlcS1pZCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJZVEVTX1RPX1NFTkQgPSAxMDI0ICogMTAyNCArIDEzOworCisgICAgQFBhdGgoIi90ZXN0IikKKyAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlRocm93YWJsZVJlc3VsdE9mTWV0aG9kQ2FsbElnbm9yZWQiLCAiSmF2YURvYyJ9KQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFJlc291cmNlIHsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb25jdXJyZW50TWFwPFN0cmluZywgU2V0dGFibGVGdXR1cmU8RXhjZXB0aW9uPj4gUkVRVUVTVF9NQVAgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpOworCisgICAgICAgIEBRdWVyeVBhcmFtKFJFUV9JRF9QQVJBTV9OQU1FKQorICAgICAgICBwcml2YXRlIFN0cmluZyByZXFJZDsKKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3QoSW5wdXRTdHJlYW0gaXMpIHsKKyAgICAgICAgICAgIGZpbmFsIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVs0MDk2XTsKKyAgICAgICAgICAgIGludCByZWFkVG90YWwgPSAwOworCisgICAgICAgICAgICBFeGNlcHRpb24gdGhyb3duID0gTk9fRVhDRVBUSU9OOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpbnQgcmVhZDsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKHJlYWQgPSBpcy5yZWFkKGJ1ZmZlcikpID4gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVhZFRvdGFsICs9IHJlYWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgdGhyb3duID0gZXg7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghZ2V0RnV0dXJlRm9yKHJlcUlkKS5zZXQodGhyb3duKSkgeworICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuV0FSTklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICJVbmFibGUgdG8gc2V0IHN0cmVhbSBwcm9jZXNzaW5nIGV4Y2VwdGlvbiBpbnRvIHRoZSBzZXR0YWJsZSBmdXR1cmUgaW5zdGFuY2UgZm9yIHJlcXVlc3QgaWQgIiArIHJlcUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3duKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIEludGVnZXIudG9TdHJpbmcocmVhZFRvdGFsKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCIvcmVxdWVzdFdhc01hZGUiKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBCb29sZWFuIGdldFJlcXVlc3RXYXNNYWRlKCkgeworICAgICAgICAgICAgLy8gYWRkIGEgbmV3IGZ1dHVyZSBmb3IgdGhlIHJlcXVlc3QgaWYgbm90IHRoZXJlIHlldCB0byBhdm9pZCByYWNlIGNvbmRpdGlvbnMgd2l0aCBQT1NUIHByb2Nlc3NpbmcKKyAgICAgICAgICAgIGZpbmFsIFNldHRhYmxlRnV0dXJlPEV4Y2VwdGlvbj4gZXNmID0gZ2V0RnV0dXJlRm9yKHJlcUlkKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gd2FpdCBmb3IgdXAgdG8gdGhyZWUgc2Vjb25kIGZvciBhIHJlcXVlc3QgdG8gYmUgbWFkZTsKKyAgICAgICAgICAgICAgICAvLyB0aGVyZSBpcyBhbHdheXMgYSB2YWx1ZSwgaWYgc2V0Li4uCisgICAgICAgICAgICAgICAgcmV0dXJuIGVzZi5nZXQoMywgVGltZVVuaXQuU0VDT05EUykgIT0gbnVsbDsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIHwgVGltZW91dEV4Y2VwdGlvbiB8IEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24oIlBvc3QgcmVxdWVzdCBwcm9jZXNzaW5nIGhhcyB0aW1lZCBvdXQgZm9yIHJlcXVlc3QgaWQgIiArIHJlcUlkLCBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCIvcmVxdWVzdENhdXNlZEV4Y2VwdGlvbiIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIEJvb2xlYW4gZ2V0UmVxdWVzdENhdXNlZEV4Y2VwdGlvbigpIHsKKyAgICAgICAgICAgIGZpbmFsIFNldHRhYmxlRnV0dXJlPEV4Y2VwdGlvbj4gZXNmID0gZ2V0RnV0dXJlRm9yKHJlcUlkKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVzZi5nZXQoMywgVGltZVVuaXQuU0VDT05EUykgIT0gTk9fRVhDRVBUSU9OOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gfCBFeGVjdXRpb25FeGNlcHRpb24gfCBUaW1lb3V0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbigiUG9zdCByZXF1ZXN0IHByb2Nlc3NpbmcgaGFzIHRpbWVkIG91dCBmb3IgcmVxdWVzdCBpZCAiICsgcmVxSWQsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTZXR0YWJsZUZ1dHVyZTxFeGNlcHRpb24+IGdldEZ1dHVyZUZvcihTdHJpbmcga2V5KSB7CisgICAgICAgICAgICBmaW5hbCBTZXR0YWJsZUZ1dHVyZTxFeGNlcHRpb24+IGVzZiA9IFNldHRhYmxlRnV0dXJlLmNyZWF0ZSgpOworICAgICAgICAgICAgZmluYWwgU2V0dGFibGVGdXR1cmU8RXhjZXB0aW9uPiBvbGRFc2YgPSBSRVFVRVNUX01BUC5wdXRJZkFic2VudChrZXksIGVzZik7CisgICAgICAgICAgICByZXR1cm4gKG9sZEVzZiAhPSBudWxsKSA/IG9sZEVzZiA6IGVzZjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoVGVzdFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcucHJvcGVydHkoQ2xpZW50UHJvcGVydGllcy5SRVFVRVNUX0VOVElUWV9QUk9DRVNTSU5HLCBSZXF1ZXN0RW50aXR5UHJvY2Vzc2luZy5DSFVOS0VEKTsKKyAgICAgICAgY29uZmlnLnByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuQ0hVTktFRF9FTkNPRElOR19TSVpFLCA3KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBIHNhbml0eSB0ZXN0IHRvIGNoZWNrIHRoZSBub3JtYWwgdXNlIGNhc2UgaXMgd29ya2luZyBhcyBleHBlY3RlZC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVbmludGVycnVwdGVkKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgdGVzdFJlcUlkID0gbmV4dFJlcXVlc3RJZCgidGVzdFVuaW50ZXJydXB0ZWQiKTsKKworICAgICAgICBSZXNwb25zZSB0ZXN0UmVzcG9uc2UgPSB0YXJnZXQoInRlc3QiKS5xdWVyeVBhcmFtKFJFUV9JRF9QQVJBTV9OQU1FLCB0ZXN0UmVxSWQpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoIjAxMjM0NTY3ODlBQkNERUYiLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fT0NURVRfU1RSRUFNKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCByZXNwb25zZSBzdGF0dXMgY29kZS4iLCAyMDAsIHRlc3RSZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCByZXNwb25zZSBlbnRpdHkuIiwgIjE2IiwgdGVzdFJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiUE9TVCByZXF1ZXN0ICIgKyB0ZXN0UmVxSWQgKyAiIGhhcyBub3QgcmVhY2hlZCB0aGUgc2VydmVyLiIsCisgICAgICAgICAgICAgICAgdGFyZ2V0KCJ0ZXN0IikucGF0aCgicmVxdWVzdFdhc01hZGUiKS5xdWVyeVBhcmFtKFJFUV9JRF9QQVJBTV9OQU1FLCB0ZXN0UmVxSWQpCisgICAgICAgICAgICAgICAgICAgICAgICAucmVxdWVzdCgpLmdldChCb29sZWFuLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJQT1NUIHJlcXVlc3QgIiArIHRlc3RSZXFJZCArICIgaGFzIGNhdXNlZCBhbiB1bmV4cGVjdGVkIGV4Y2VwdGlvbiBvbiB0aGUgc2VydmVyLiIsCisgICAgICAgICAgICAgICAgdGFyZ2V0KCJ0ZXN0IikucGF0aCgicmVxdWVzdENhdXNlZEV4Y2VwdGlvbiIpLnF1ZXJ5UGFyYW0oUkVRX0lEX1BBUkFNX05BTUUsIHRlc3RSZXFJZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkuZ2V0KEJvb2xlYW4uY2xhc3MpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHRlc3Qgc2ltdWxhdGVzIGhvdyBKZXJzZXkgQ2xpZW50IHNob3VsZCBiZWhhdmUgYWZ0ZXIgSkVSU0VZLTI3MDUgZ2V0cyBmaXhlZC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGluIGNhc2UgdGhlIHRlc3QgZmFpbHMgdG8gZXhlY3V0ZS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnRlcnJ1cHRlZEplcnNleUh0dHBVcmxDb25uZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHRlc3RSZXFJZCA9IG5leHRSZXF1ZXN0SWQoInRlc3RJbnRlcnJ1cHRlZEplcnNleUh0dHBVcmxDb25uZWN0aW9uIik7CisKKyAgICAgICAgVVJMIHBvc3RVcmwgPSBVcmlCdWlsZGVyLmZyb21VcmkoZ2V0QmFzZVVyaSgpKS5wYXRoKCJ0ZXN0IikucXVlcnlQYXJhbShSRVFfSURfUEFSQU1fTkFNRSwgdGVzdFJlcUlkKS5idWlsZCgpLnRvVVJMKCk7CisgICAgICAgIGZpbmFsIEh0dHBVUkxDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSAoSHR0cFVSTENvbm5lY3Rpb24pIHBvc3RVcmwub3BlbkNvbm5lY3Rpb24oKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0TWV0aG9kKCJQT1NUIik7CisgICAgICAgICAgICBjb25uZWN0aW9uLnNldFJlcXVlc3RQcm9wZXJ0eSgiQ29udGVudC1UeXBlIiwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX09DVEVUX1NUUkVBTSk7CisgICAgICAgICAgICBjb25uZWN0aW9uLnNldERvT3V0cHV0KHRydWUpOworICAgICAgICAgICAgY29ubmVjdGlvbi5zZXRDaHVua2VkU3RyZWFtaW5nTW9kZSgxMDI0KTsKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0gPSBjb25uZWN0aW9uLmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgUmVhZGVyV3JpdGVyLndyaXRlVG8obmV3IEV4Y2VwdGlvblRocm93aW5nSW5wdXRTdHJlYW0oQllURVNfVE9fU0VORCksIGVudGl0eVN0cmVhbSk7CisgICAgICAgICAgICBBc3NlcnQuZmFpbCgiRXhwZWN0ZWQgUHJvY2Vzc2luZ0V4Y2VwdGlvbiBoYXMgbm90IGJlZW4gdGhyb3duLiIpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICAgICAgLy8gc28gZmFyIHNvIGdvb2QKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGNvbm5lY3Rpb24uZGlzY29ubmVjdCgpOworICAgICAgICB9CisgICAgICAgIC8vIHdlIHNob3VsZCBtYWtlIGl0IHRvIHRoZSBzZXJ2ZXIsIGJ1dCB0aGVyZSB0aGUgZXhjZXB0aW9uYWwgYmVoYXZpb3VyIHNob3VsZCBnZXQgbm90aWNlZAorICAgICAgICBhc3NlcnRUcnVlKCJQT1NUIHJlcXVlc3QgIiArIHRlc3RSZXFJZCArICIgaGFzIG5vdCByZWFjaGVkIHRoZSBzZXJ2ZXIuIiwKKyAgICAgICAgICAgICAgICB0YXJnZXQoInRlc3QiKS5wYXRoKCJyZXF1ZXN0V2FzTWFkZSIpLnF1ZXJ5UGFyYW0oUkVRX0lEX1BBUkFNX05BTUUsIHRlc3RSZXFJZCkucmVxdWVzdCgpLmdldChCb29sZWFuLmNsYXNzKSk7CisgICAgICAgIGFzc2VydFRydWUoIlBPU1QgcmVxdWVzdCAiICsgdGVzdFJlcUlkICsgIiBkaWQgbm90IGNhdXNlIGFuIGV4cGVjdGVkIGV4Y2VwdGlvbiBvbiB0aGUgc2VydmVyLiIsCisgICAgICAgICAgICAgICAgdGFyZ2V0KCJ0ZXN0IikucGF0aCgicmVxdWVzdENhdXNlZEV4Y2VwdGlvbiIpLnF1ZXJ5UGFyYW0oUkVRX0lEX1BBUkFNX05BTUUsIHRlc3RSZXFJZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkuZ2V0KEJvb2xlYW4uY2xhc3MpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHRlc3QgcmVwcm9kdWNlcyB0aGUgSmVyc2V5IENsaWVudCBiZWhhdmlvciByZXBvcnRlZCBpbiBKRVJTRVktMjcwNS4KKyAgICAgKi8KKyAgICBASWdub3JlCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW50ZXJydXB0ZWRKZXJzZXlDbGllbnQoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyB0ZXN0UmVxSWQgPSBuZXh0UmVxdWVzdElkKCJ0ZXN0SW50ZXJydXB0ZWRKZXJzZXlDbGllbnQiKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGFyZ2V0KCJ0ZXN0IikucXVlcnlQYXJhbShSRVFfSURfUEFSQU1fTkFNRSwgdGVzdFJlcUlkKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eShuZXcgRXhjZXB0aW9uVGhyb3dpbmdJbnB1dFN0cmVhbShCWVRFU19UT19TRU5EKSwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX09DVEVUX1NUUkVBTSkpOworICAgICAgICAgICAgQXNzZXJ0LmZhaWwoIkV4cGVjdGVkIFByb2Nlc3NpbmdFeGNlcHRpb24gaGFzIG5vdCBiZWVuIHRocm93bi4iKTsKKyAgICAgICAgfSBjYXRjaCAoUHJvY2Vzc2luZ0V4Y2VwdGlvbiBleHBlY3RlZCkgeworICAgICAgICAgICAgLy8gc28gZmFyIHNvIGdvb2QKKyAgICAgICAgfQorICAgICAgICAvLyB3ZSBzaG91bGQgbWFrZSBpdCB0byB0aGUgc2VydmVyLCBidXQgdGhlcmUgdGhlIGV4Y2VwdGlvbmFsIGJlaGF2aW91ciBzaG91bGQgZ2V0IG5vdGljZWQKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiUE9TVCByZXF1ZXN0ICIgKyB0ZXN0UmVxSWQgKyAiIGhhcyBub3QgcmVhY2hlZCB0aGUgc2VydmVyLiIsCisgICAgICAgICAgICAgICAgdGFyZ2V0KCJ0ZXN0IikucGF0aCgicmVxdWVzdFdhc01hZGUiKS5xdWVyeVBhcmFtKFJFUV9JRF9QQVJBTV9OQU1FLCB0ZXN0UmVxSWQpLnJlcXVlc3QoKS5nZXQoQm9vbGVhbi5jbGFzcykpOworICAgICAgICBhc3NlcnRUcnVlKCJQT1NUIHJlcXVlc3QgIiArIHRlc3RSZXFJZCArICIgZGlkIG5vdCBjYXVzZSBhbiBleHBlY3RlZCBleGNlcHRpb24gb24gdGhlIHNlcnZlci4iLAorICAgICAgICAgICAgICAgIHRhcmdldCgidGVzdCIpLnBhdGgoInJlcXVlc3RDYXVzZWRFeGNlcHRpb24iKS5xdWVyeVBhcmFtKFJFUV9JRF9QQVJBTV9OQU1FLCB0ZXN0UmVxSWQpCisgICAgICAgICAgICAgICAgICAgICAgICAucmVxdWVzdCgpLmdldChCb29sZWFuLmNsYXNzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG5leHRSZXF1ZXN0SWQoU3RyaW5nIHRlc3RNZXRob2ROYW1lKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KHRlc3RNZXRob2ROYW1lICsgIi0lMDNkIiwgTkVYVF9SRVFfSUQuZ2V0QW5kSW5jcmVtZW50KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIElucHV0U3RyZWFtIGltcGxlbWVudGF0aW9uIHRoYXQgYWxsb3dzICJyZWFkaW5nIiBhcyBtYW55IGJ5dGVzIGFzIHNwZWNpZmllZCBieSB0aHJlc2hvbGQgY29uc3RydWN0b3IgcGFyYW1ldGVyLgorICAgICAqIFRocm93cyBhbiBJT0V4Y2VwdGlvbiBpZiByZWFkIG9wZXJhdGlvbiBpcyBhdHRlbXB0ZWQgYWZ0ZXIgdGhlIHRocmVzaG9sZCBpcyBleGNlZWRlZC4KKyAgICAgKi8KKyAgICBwcml2YXRlIGNsYXNzIEV4Y2VwdGlvblRocm93aW5nSW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgdGhyZXNob2xkOworICAgICAgICBwcml2YXRlIGludCBvZmZzZXQgPSAwOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgbWUgYSBuZXcgc3RyZWFtIHRoYXQgdGhyb3dzIGV4Y2VwdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIHRocmVzaG9sZCB0aGlzIG51bWJlciBvZiBieXRlcyB3aWxsIGJlIHJlYWQgYWxsIHJpZ2h0CisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgRXhjZXB0aW9uVGhyb3dpbmdJbnB1dFN0cmVhbShpbnQgdGhyZXNob2xkKSB7CisgICAgICAgICAgICB0aGlzLnRocmVzaG9sZCA9IHRocmVzaG9sZDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKG9mZnNldCsrIDwgdGhyZXNob2xkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICdBJzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJzdHJlYW0gY2xvc2VkIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgb2Zmc2V0ICs9IGxlbjsKKyAgICAgICAgICAgIGlmIChvZmZzZXQgPCB0aHJlc2hvbGQpIHsKKyAgICAgICAgICAgICAgICBBcnJheXMuZmlsbChiLCBvZmYsIG9mZiArIGxlbiwgKGJ5dGUpICdBJyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxlbjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJTdHJlYW0gY2xvc2VkIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9DbGllbnRCdWZmZXJpbmdEaXNhYmxlZFRlc3QuamF2YSBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0NsaWVudEJ1ZmZlcmluZ0Rpc2FibGVkVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMjE4NjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9DbGllbnRCdWZmZXJpbmdEaXNhYmxlZFRlc3QuamF2YQpAQCAtMCwwICsxLDE5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY2xpZW50OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubmV0Lkh0dHBVUkxDb25uZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50Lkh0dHBVcmxDb25uZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QudXRpbC5ydW5uZXIuQ29uY3VycmVudFJ1bm5lcjsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CisKKy8qKgorICogVGVzdHMgcG9zc2liaWxpdHkgb2YgZGlzYWJsaW5nIGJ1ZmZlcmluZyBvZiBvdXRnb2luZyBlbnRpdHkgaW4KKyAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuSHR0cFVybENvbm5lY3RvclByb3ZpZGVyfS4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitAUnVuV2l0aChDb25jdXJyZW50UnVubmVyLmNsYXNzKQorcHVibGljIGNsYXNzIENsaWVudEJ1ZmZlcmluZ0Rpc2FibGVkVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBMRU5HVEggPSAyMDAwMDAwMDBMOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDSFVOSyA9IDIwNDg7CisgICAgcHJpdmF0ZSBzdGF0aWMgQ291bnREb3duTGF0Y2ggcG9zdExhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhNeVJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAUGF0aCgicmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlSZXNvdXJjZSB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIGxvbmcgcG9zdChJbnB1dFN0cmVhbSBpcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGludCBiOworICAgICAgICAgICAgbG9uZyBjb3VudCA9IDA7CisgICAgICAgICAgICBib29sZWFuIGZpcnN0Qnl0ZSA9IHRydWU7CisgICAgICAgICAgICB3aGlsZSAoKGIgPSBpcy5yZWFkKCkpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgaWYgKGZpcnN0Qnl0ZSkgeworICAgICAgICAgICAgICAgICAgICBmaXJzdEJ5dGUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgcG9zdExhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY291bnQ7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCBidWZmZXJpbmcgY2FuIGJlIGRpc2FibGVkIHdpdGgge0BsaW5rIEh0dHBVUkxDb25uZWN0aW9ufS4gQnkgZGVmYXVsdCwgdGhlCisgICAgICoge0Bjb2RlIEh0dHBVUkxDb25uZWN0aW9ufSBidWZmZXJzIHRoZSBvdXRwdXQgZW50aXR5IGluIG9yZGVyIHRvIGNhbGN1bGF0ZSB0aGUKKyAgICAgKiBDb250ZW50LWxlbmd0aCByZXF1ZXN0IGF0dHJpYnV0ZS4gVGhpcyBjYXVzZSBwcm9ibGVtcyBmb3IgbGFyZ2UgZW50aXRpZXMuCisgICAgICogPHA+CisgICAgICogVGhpcyB0ZXN0IHVzZXMge0BsaW5rIEh0dHBVcmxDb25uZWN0b3JQcm92aWRlciNVU0VfRklYRURfTEVOR1RIX1NUUkVBTUlOR30gdG8gZW5hYmxlCisgICAgICogZml4IGxlbmd0aCBzdHJlYW1pbmcgb24ge0Bjb2RlIEh0dHBVUkxDb25uZWN0aW9ufS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhYmxlQnVmZmVyaW5nV2l0aEZpeGVkTGVuZ3RoVmlhUHJvcGVydHkoKSB7CisgICAgICAgIHBvc3RMYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKworICAgICAgICAvLyBUaGlzIElTIHNlbmRzIG91dCAxMCBjaHVua3MgYW5kIHdhaXRzIHdoZXRoZXIgdGhleSB3ZXJlIHJlY2VpdmVkIG9uIHRoZSBzZXJ2ZXIuIFRoaXMgdGVzdHMKKyAgICAgICAgLy8gd2hldGhlciB0aGUgYnVmZmVyaW5nIGlzIGRpc2FibGVkLgorICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IGdldElucHV0U3RyZWFtKCk7CisKKyAgICAgICAgZmluYWwgSHR0cFVybENvbm5lY3RvclByb3ZpZGVyIGNvbm5lY3RvclByb3ZpZGVyID0gbmV3IEh0dHBVcmxDb25uZWN0b3JQcm92aWRlcigpOworICAgICAgICBDbGllbnRDb25maWcgY2xpZW50Q29uZmlnID0gbmV3IENsaWVudENvbmZpZygpLmNvbm5lY3RvclByb3ZpZGVyKGNvbm5lY3RvclByb3ZpZGVyKTsKKyAgICAgICAgY2xpZW50Q29uZmlnLnByb3BlcnR5KEh0dHBVcmxDb25uZWN0b3JQcm92aWRlci5VU0VfRklYRURfTEVOR1RIX1NUUkVBTUlORywgdHJ1ZSk7CisgICAgICAgIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudChjbGllbnRDb25maWcpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZQorICAgICAgICAgICAgICAgID0gY2xpZW50LnRhcmdldChnZXRCYXNlVXJpKCkpLnBhdGgoInJlc291cmNlIikKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpLmhlYWRlcihIdHRwSGVhZGVycy5DT05URU5UX0xFTkdUSCwgTEVOR1RIKS5wb3N0KAorICAgICAgICAgICAgICAgICAgICAgICAgRW50aXR5LmVudGl0eShpcywgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX09DVEVUX1NUUkVBTSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBmaW5hbCBsb25nIGNvdW50ID0gcmVzcG9uc2UucmVhZEVudGl0eShsb25nLmNsYXNzKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiVW5leHBlY3RlZCBjb250ZW50IGxlbmd0aCByZWNlaXZlZC4iLCBMRU5HVEgsIGNvdW50KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoYXQgYnVmZmVyaW5nIGNhbiBiZSBkaXNhYmxlZCB3aXRoIHtAbGluayBIdHRwVVJMQ29ubmVjdGlvbn0uIEJ5IGRlZmF1bHQsIHRoZQorICAgICAqIHtAY29kZSBIdHRwVVJMQ29ubmVjdGlvbn0gYnVmZmVycyB0aGUgb3V0cHV0IGVudGl0eSBpbiBvcmRlciB0byBjYWxjdWxhdGUgdGhlCisgICAgICogQ29udGVudC1sZW5ndGggcmVxdWVzdCBhdHRyaWJ1dGUuIFRoaXMgY2F1c2UgcHJvYmxlbXMgZm9yIGxhcmdlIGVudGl0aWVzLgorICAgICAqIDxwPgorICAgICAqIFRoaXMgdGVzdCB1c2VzIHtAbGluayBIdHRwVXJsQ29ubmVjdG9yUHJvdmlkZXIjdXNlRml4ZWRMZW5ndGhTdHJlYW1pbmcoKX0gdG8gZW5hYmxlCisgICAgICogZml4IGxlbmd0aCBzdHJlYW1pbmcgb24ge0Bjb2RlIEh0dHBVUkxDb25uZWN0aW9ufS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REaXNhYmxlQnVmZmVyaW5nV2l0aEZpeGVkTGVuZ3RoVmlhTWV0aG9kKCkgeworICAgICAgICBwb3N0TGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisKKyAgICAgICAgLy8gVGhpcyBJUyBzZW5kcyBvdXQgMTAgY2h1bmtzIGFuZCB3YWl0cyB3aGV0aGVyIHRoZXkgd2VyZSByZWNlaXZlZCBvbiB0aGUgc2VydmVyLiBUaGlzIHRlc3RzCisgICAgICAgIC8vIHdoZXRoZXIgdGhlIGJ1ZmZlcmluZyBpcyBkaXNhYmxlZC4KKyAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBnZXRJbnB1dFN0cmVhbSgpOworCisgICAgICAgIGZpbmFsIEh0dHBVcmxDb25uZWN0b3JQcm92aWRlciBjb25uZWN0b3JQcm92aWRlciA9IG5ldyBIdHRwVXJsQ29ubmVjdG9yUHJvdmlkZXIoKQorICAgICAgICAgICAgICAgIC51c2VGaXhlZExlbmd0aFN0cmVhbWluZygpOworICAgICAgICBDbGllbnRDb25maWcgY2xpZW50Q29uZmlnID0gbmV3IENsaWVudENvbmZpZygpLmNvbm5lY3RvclByb3ZpZGVyKGNvbm5lY3RvclByb3ZpZGVyKTsKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KGNsaWVudENvbmZpZyk7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlCisgICAgICAgICAgICAgICAgPSBjbGllbnQudGFyZ2V0KGdldEJhc2VVcmkoKSkucGF0aCgicmVzb3VyY2UiKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkuaGVhZGVyKEh0dHBIZWFkZXJzLkNPTlRFTlRfTEVOR1RILCBMRU5HVEgpLnBvc3QoCisgICAgICAgICAgICAgICAgICAgICAgICBFbnRpdHkuZW50aXR5KGlzLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fT0NURVRfU1RSRUFNKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGZpbmFsIGxvbmcgY291bnQgPSByZXNwb25zZS5yZWFkRW50aXR5KGxvbmcuY2xhc3MpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGNvbnRlbnQgbGVuZ3RoIHJlY2VpdmVkLiIsIExFTkdUSCwgY291bnQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCBidWZmZXJpbmcgY2FuIGJlIGRpc2FibGVkIHdpdGgge0BsaW5rIEh0dHBVUkxDb25uZWN0aW9ufS4gQnkgZGVmYXVsdCwgdGhlCisgICAgICoge0Bjb2RlIEh0dHBVUkxDb25uZWN0aW9ufSBidWZmZXJzIHRoZSBvdXRwdXQgZW50aXR5IGluIG9yZGVyIHRvIGNhbGN1bGF0ZSB0aGUKKyAgICAgKiBDb250ZW50LWxlbmd0aCByZXF1ZXN0IGF0dHJpYnV0ZS4gVGhpcyBjYXVzZSBwcm9ibGVtcyBmb3IgbGFyZ2UgZW50aXRpZXMuCisgICAgICogPHA+CisgICAgICogSW4gSmVyc2V5IDEueCBjaHVuayBlbmNvZGluZyB3aXRoIHtAY29kZSBIdHRwVVJMQ29ubmVjdGlvbn0gd2FzIGNhdXNpbmcgYnVncworICAgICAqIHdoaWNoIG9jY3VycmVkIGZyb20gdGltZSB0byB0aW1lLiBUaGlzIGxvb2tzIHRvIGJlIGEgY2FzZSBhbHNvIGluIEplcnNleSAyLnguIFRoaXMgdGVzdAorICAgICAqIGhhcyBmYWlsZWQgdW5wcmVkaWN0YWJseSBvbiBzb21lIG1hY2hpbmVzLiBUaGVyZWZvcmUgaXQgaXMgZGlzYWJsZWQgbm93LgorICAgICAqIDwvcD4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIEBJZ25vcmUoImZhaWxzIHVucHJlZGljdGFibGUgKHNlZSBqYXZhZG9jKSIpCisgICAgcHVibGljIHZvaWQgdGVzdERpc2FibGVCdWZmZXJpbmdXaXRoQ2h1bmtFbmNvZGluZygpIHsKKyAgICAgICAgcG9zdExhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworCisgICAgICAgIC8vIFRoaXMgSVMgc2VuZHMgb3V0IDEwIGNodW5rcyBhbmQgd2FpdHMgd2hldGhlciB0aGV5IHdlcmUgcmVjZWl2ZWQgb24gdGhlIHNlcnZlci4gVGhpcyB0ZXN0cworICAgICAgICAvLyB3aGV0aGVyIHRoZSBidWZmZXJpbmcgaXMgZGlzYWJsZWQuCisgICAgICAgIElucHV0U3RyZWFtIGlzID0gZ2V0SW5wdXRTdHJlYW0oKTsKKworICAgICAgICBmaW5hbCBIdHRwVXJsQ29ubmVjdG9yUHJvdmlkZXIgY29ubmVjdG9yUHJvdmlkZXIgPSBuZXcgSHR0cFVybENvbm5lY3RvclByb3ZpZGVyKCkKKyAgICAgICAgICAgICAgICAuY2h1bmtTaXplKENIVU5LKTsKKyAgICAgICAgQ2xpZW50Q29uZmlnIGNsaWVudENvbmZpZyA9IG5ldyBDbGllbnRDb25maWcoKQorICAgICAgICAgICAgICAgIC5jb25uZWN0b3JQcm92aWRlcihjb25uZWN0b3JQcm92aWRlcik7CisgICAgICAgIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudChjbGllbnRDb25maWcpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZQorICAgICAgICAgICAgICAgID0gY2xpZW50LnRhcmdldChnZXRCYXNlVXJpKCkpLnBhdGgoInJlc291cmNlIikKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShpcywgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX09DVEVUX1NUUkVBTSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBmaW5hbCBsb25nIGNvdW50ID0gcmVzcG9uc2UucmVhZEVudGl0eShsb25nLmNsYXNzKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiVW5leHBlY3RlZCBjb250ZW50IGxlbmd0aCByZWNlaXZlZC4iLCBMRU5HVEgsIGNvdW50KTsKKyAgICB9CisKKyAgICBwcml2YXRlIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkgeworICAgICAgICByZXR1cm4gbmV3IElucHV0U3RyZWFtKCkgeworICAgICAgICAgICAgcHJpdmF0ZSBpbnQgY250ID0gMDsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIGNudCsrOworICAgICAgICAgICAgICAgIGlmIChjbnQgPiBDSFVOSyAqIDEwKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwb3N0TGF0Y2guYXdhaXQoMyAqIGdldEFzeW5jVGltZW91dE11bHRpcGxpZXIoKSwgVGltZVVuaXQuU0VDT05EUyk7CisgICAgICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJ3YWl0aW5nIGZvciBjaHVuayBvbiB0aGUgc2VydmVyIHNpZGUgdGltZS1vdXRlZCIsIDAsIHBvc3RMYXRjaC5nZXRDb3VudCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGNudCA8PSBMRU5HVEgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdhJzsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0NsaWVudERlc3Ryb3lUZXN0LmphdmEgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9DbGllbnREZXN0cm95VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5OTdhMTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9DbGllbnREZXN0cm95VGVzdC5qYXZhCkBAIC0wLDAgKzEsMjM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jbGllbnQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuSGVhZGVyUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmVDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SZWFkZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0OworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5QcmVEZXN0cm95OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudExpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5KZXJzZXlDbGllbnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkplcnNleUNsaWVudEJ1aWxkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIEFzc2VydCB0aGF0IHByZSBkZXN0cm95IG1ldGhvZCBvbiBwcm92aWRlcnMgaXMgaW52b2tlZC4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIENsaWVudERlc3Ryb3lUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBCb29sZWFuPiBkZXN0cm95ZWQgPSBuZXcgSGFzaE1hcDw+KCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZGVzdHJveWVkLmNsZWFyKCk7CisgICAgICAgIGRlc3Ryb3llZC5wdXQoImZpbHRlciIsIGZhbHNlKTsKKyAgICAgICAgZGVzdHJveWVkLnB1dCgicmVhZGVyIiwgZmFsc2UpOworICAgICAgICBkZXN0cm95ZWQucHV0KCJmZWF0dXJlIiwgZmFsc2UpOworCisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoQEhlYWRlclBhcmFtKCJmb28iKSBmaW5hbCBTdHJpbmcgZm9vKSB7CisgICAgICAgICAgICByZXR1cm4gInJlc291cmNlLSIgKyBmb287CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15RmlsdGVyIGltcGxlbWVudHMgQ2xpZW50UmVxdWVzdEZpbHRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihmaW5hbCBDbGllbnRSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LmdldEhlYWRlcnMoKS5wdXRTaW5nbGUoImZvbyIsICJiYXIiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQcmVEZXN0cm95CisgICAgICAgIHB1YmxpYyB2b2lkIHByZURlc3Ryb3koKSB7CisgICAgICAgICAgICBkZXN0cm95ZWQucHV0KCJmaWx0ZXIiLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlSZWFkZXIgaW1wbGVtZW50cyBSZWFkZXJJbnRlcmNlcHRvciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPYmplY3QgYXJvdW5kUmVhZEZyb20oZmluYWwgUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgT2JqZWN0IGVudGl0eSA9IGNvbnRleHQucHJvY2VlZCgpOworICAgICAgICAgICAgcmV0dXJuICJyZWFkZXItIiArIGVudGl0eTsKKyAgICAgICAgfQorCisgICAgICAgIEBQcmVEZXN0cm95CisgICAgICAgIHB1YmxpYyB2b2lkIHByZURlc3Ryb3koKSB7CisgICAgICAgICAgICBkZXN0cm95ZWQucHV0KCJyZWFkZXIiLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlGZWF0dXJlIGltcGxlbWVudHMgRmVhdHVyZSB7CisKKyAgICAgICAgQFByZURlc3Ryb3kKKyAgICAgICAgcHVibGljIHZvaWQgcHJlRGVzdHJveSgpIHsKKyAgICAgICAgICAgIGRlc3Ryb3llZC5wdXQoImZlYXR1cmUiLCB0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmUoZmluYWwgRmVhdHVyZUNvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbGllbnRJbnZva2VQcmVEZXN0cm95TWV0aG9kT25Qcm92aWRlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKE15RmlsdGVyLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihNeVJlYWRlci5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoTXlGZWF0dXJlLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRUaGF0KGNsaWVudC50YXJnZXQoZ2V0QmFzZVVyaSgpKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyksIGlzKCJyZWFkZXItcmVzb3VyY2UtYmFyIikpOworCisgICAgICAgIGNoZWNrRGVzdHJveWVkKGZhbHNlKTsKKyAgICAgICAgY2xpZW50LmNsb3NlKCk7CisgICAgICAgIGNoZWNrRGVzdHJveWVkKHRydWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja0Rlc3Ryb3llZChmaW5hbCBib29sZWFuIHNob3VsZEJlRGVzdHJveWVkKSB7CisgICAgICAgIGZvciAoZmluYWwgTWFwLkVudHJ5PFN0cmluZywgQm9vbGVhbj4gZW50cnkgOiBkZXN0cm95ZWQuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgYXNzZXJ0VGhhdChlbnRyeS5nZXRLZXkoKSArICAiIHNob3VsZCIgKyAoc2hvdWxkQmVEZXN0cm95ZWQgPyAiIiA6ICIgbm90IikgKyAiIGJlIGRlc3Ryb3llZCIsCisgICAgICAgICAgICAgICAgICAgIGVudHJ5LmdldFZhbHVlKCksIGlzKHNob3VsZEJlRGVzdHJveWVkKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZvb0xpc3RlbmVyIGltcGxlbWVudHMgQ2xpZW50UmVxdWVzdEZpbHRlciwgQ2xpZW50TGlmZWN5Y2xlTGlzdGVuZXIgeworICAgICAgICBwdWJsaWMgc3RhdGljIHZvbGF0aWxlIGJvb2xlYW4gSU5JVElBTElaRUQgPSBmYWxzZTsKKyAgICAgICAgcHVibGljIHN0YXRpYyB2b2xhdGlsZSBib29sZWFuIENMT1NFRCA9IGZhbHNlOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoZmluYWwgQ2xpZW50UmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7IC8qIGRvIG5vdGhpbmcgKi8gfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNsb3NlKCkgeworICAgICAgICAgICAgQ0xPU0VEID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkluaXQoKSB7CisgICAgICAgICAgICBJTklUSUFMSVpFRCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvLyB0byBjaGVjayBpZiBjbG9zaW5nIHdvcmtzIGFsc28gZm9yIGNsYXNzLXJlZ2lzdGVyZWQgcHJvdmlkZXJzCisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Nsb3NlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBDTE9TRUQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBJTklUSUFMSVpFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQmFyTGlzdGVuZXIgaW1wbGVtZW50cyBDbGllbnRSZXF1ZXN0RmlsdGVyLCBDbGllbnRMaWZlY3ljbGVMaXN0ZW5lciB7CisgICAgICAgIHByb3RlY3RlZCB2b2xhdGlsZSBib29sZWFuIGNsb3NlZCA9IGZhbHNlOworICAgICAgICBwcm90ZWN0ZWQgdm9sYXRpbGUgYm9vbGVhbiBpbml0aWFsaXplZCA9IGZhbHNlOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoZmluYWwgQ2xpZW50UmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7IC8qIGRvIG5vdGhpbmcgKi8gfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkluaXQoKSB7CisgICAgICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgb25DbG9zZSgpIHsKKyAgICAgICAgICAgIHRoaXMuY2xvc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCkgeworICAgICAgICAgICAgcmV0dXJuIGNsb3NlZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzSW5pdGlhbGl6ZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gaW5pdGlhbGl6ZWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBhbm90aGVyIHR5cGUgbmVlZGVkLCBhcyBtdWx0aXBsZSByZWdpc3RyYXRpb25zIG9mIHRoZSBzYW1lIHR5cGUgYXJlIG5vdCBhbGxvd2VkCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCYXJMaXN0ZW5lcjIgZXh0ZW5kcyBCYXJMaXN0ZW5lciB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGlmZWN5Y2xlTGlzdGVuZXJQcm92aWRlcigpIHsKKyAgICAgICAgZmluYWwgSmVyc2V5Q2xpZW50QnVpbGRlciBidWlsZGVyID0gbmV3IEplcnNleUNsaWVudEJ1aWxkZXIoKTsKKyAgICAgICAgZmluYWwgSmVyc2V5Q2xpZW50IGNsaWVudCA9IGJ1aWxkZXIuYnVpbGQoKTsKKworICAgICAgICBmaW5hbCBCYXJMaXN0ZW5lciBmaWx0ZXIgPSBuZXcgQmFyTGlzdGVuZXIoKTsKKyAgICAgICAgZmluYWwgQmFyTGlzdGVuZXIgZmlsdGVyMiA9IG5ldyBCYXJMaXN0ZW5lcjIoKTsKKworICAgICAgICAvLyBDbGllbnRSdW50aW1lIGluaXRpYWxpemVzIGxhemlseSwgc28gaXQgaXMgZm9yY2VkIGJ5IGludm9raW5nIGEgKGR1bW15KSByZXF1ZXN0CisgICAgICAgIGNsaWVudC5yZWdpc3RlcihmaWx0ZXIyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnN0YW5jZSByZWdpc3RlcmVkIGludG8gY2xpZW50CisgICAgICAgIGNsaWVudC50YXJnZXQoZ2V0QmFzZVVyaSgpKS5yZWdpc3RlcihmaWx0ZXIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsgICAvLyBpbnN0YW5jZSByZWdpc3RyYXRpb24gaW50byB0YXJnZXQKKworICAgICAgICBhc3NlcnRUcnVlKCJGaWx0ZXIgd2FzIGV4cGVjdGVkIHRvIGJlIGFscmVhZHkgaW5pdGlhbGl6ZWQuIiwgZmlsdGVyLmlzSW5pdGlhbGl6ZWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoIkZpbHRlcjIgd2FzIGV4cGVjdGVkIHRvIGJlIGFscmVhZHkgaW5pdGlhbGl6ZWQuIiwgZmlsdGVyMi5pc0luaXRpYWxpemVkKCkpOworCisgICAgICAgIGNsaWVudC50YXJnZXQoZ2V0QmFzZVVyaSgpKS5yZWdpc3RlcihGb29MaXN0ZW5lci5jbGFzcykucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOyAvLyBjbGFzcyByZWdpc3RyYXRpb24gaW50byB0YXJnZXQKKworICAgICAgICBhc3NlcnRUcnVlKCJDbGFzcy1yZWdpc3RlcmVkIGZpbHRlciB3YXMgZXhwZWN0ZWQgdG8gYmUgYWxyZWFkeSBpbml0aWFsaXplZCIsIEZvb0xpc3RlbmVyLmlzSW5pdGlhbGl6ZWQoKSk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UoIkNsYXNzLXJlZ2lzdGVyZWQgZmlsdGVyIHdhcyBleHBlY3RlZCB0byBiZSBzdGlsbCBvcGVuLiIsIEZvb0xpc3RlbmVyLmlzQ2xvc2VkKCkpOworICAgICAgICBhc3NlcnRGYWxzZSgiRmlsdGVyIHdhcyBleHBlY3RlZCB0byBiZSBzdGlsbCBvcGVuLiIsIGZpbHRlci5pc0Nsb3NlZCgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIkZpbHRlcjIgd2FzIGV4cGVjdGVkIHRvIGJlIHN0aWxsIG9wZW4uIiwgZmlsdGVyMi5pc0Nsb3NlZCgpKTsKKworICAgICAgICBjbGllbnQuY2xvc2UoKTsKKworICAgICAgICBhc3NlcnRUcnVlKCJDbGFzcy1yZWdpc3RlcmVkIGZpbHRlciB3YXMgZXhwZWN0ZWQgdG8gYmUgY2xvc2VkLiIsIEZvb0xpc3RlbmVyLmlzQ2xvc2VkKCkpOworICAgICAgICBhc3NlcnRUcnVlKCJGaWx0ZXIgd2FzIGV4cGVjdGVkIHRvIGJlIGNsb3NlZC4iLCBmaWx0ZXIuaXNDbG9zZWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoIkZpbHRlcjIgd2FzIGV4cGVjdGVkIHRvIGJlIGNsb3NlZC4iLCBmaWx0ZXIyLmlzQ2xvc2VkKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvQ2xpZW50RW50aXR5QW5ub3RhdGlvblRlc3QuamF2YSBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0NsaWVudEVudGl0eUFubm90YXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkyODhjNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0NsaWVudEVudGl0eUFubm90YXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY2xpZW50OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFRlc3RzIGFubm90YXRpb25zIG9mIGVudGl0eSBvbiB0aGUgY2xpZW50IHNpZGUuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICoKKyAqLworcHVibGljIGNsYXNzIENsaWVudEVudGl0eUFubm90YXRpb25UZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKENsaWVudEZpbHRlci5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0KCkgeworICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMgPSBNeVByb3ZpZGVyLmNsYXNzLmdldEFubm90YXRpb25zKCk7CisgICAgICAgIEVudGl0eTxTdHJpbmc+IHBvc3QgPSBFbnRpdHkuZW50aXR5KCJ0ZXN0IiwgTWVkaWFUeXBlLldJTERDQVJEX1RZUEUsCisgICAgICAgICAgICAgICAgYW5ub3RhdGlvbnMpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIikucmVxdWVzdCgpLnBvc3QocG9zdCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInRlc3QiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDbGllbnRGaWx0ZXIgaW1wbGVtZW50cyBDbGllbnRSZXF1ZXN0RmlsdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENsaWVudFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGVudGl0eUFubm90YXRpb25zID0gcmVxdWVzdENvbnRleHQuZ2V0RW50aXR5QW5ub3RhdGlvbnMoKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgZW50aXR5QW5ub3RhdGlvbnMubGVuZ3RoKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoTXlQcm92aWRlci5jbGFzcy5nZXRBbm5vdGF0aW9uKFByb3ZpZGVyLmNsYXNzKSwgZW50aXR5QW5ub3RhdGlvbnNbMF0pOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0KFN0cmluZyBlbnRpdHkpIHsKKyAgICAgICAgICAgIHJldHVybiBlbnRpdHk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15UHJvdmlkZXIgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0NsaWVudEV4ZWN1dG9yQ2xvc2VUZXN0LmphdmEgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9DbGllbnRFeGVjdXRvckNsb3NlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YzJkM2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9DbGllbnRFeGVjdXRvckNsb3NlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jbGllbnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLnNzZS5Tc2VFdmVudFNvdXJjZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBAYXV0aG9yIFBldHIgSmFub3VjaCAocGV0ci5qYW5vdWNoIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBDbGllbnRFeGVjdXRvckNsb3NlVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworICAgIHByaXZhdGUgc3RhdGljIENvdW50RG93bkxhdGNoIGNkbCA9IG5ldyBDb3VudERvd25MYXRjaCgyKTsKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHNjaGVkdWxlckZvdW5kID0gZmFsc2U7CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGF0IGNsb3NpbmcgYSBjbGllbnQgc2h1dHMgZG93biBhIGNvcnJlc3BvbmRpbmcgY2xpZW50IGFzeW5jIGV4ZWN1dG9yIHNlcnZpY2UuCisgICAgICovCisgICAgQFRlc3QKKyAgICBASWdub3JlKCJKZXJzZXkgdXNlcyBGb3JrSm9pbiBjb21tb24gcG9vbCBieSBkZWZhdWx0LCB3aGljaCBzaG91bGRuJ3QgYmUgY2xvc2VkIHdoZW4gY2xpZW50IGNsb3Nlcy4iKQorICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZUFzeW5jRXhlY3V0b3IoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBhc3NlcnRGYWxzZShjbGllbnRFeGVjdXRvclRocmVhZFByZXNlbnQoKSk7CisgICAgICAgIHRhcmdldCgicmVzb3VyY2UiKS5yZXF1ZXN0KCkuYXN5bmMoKS5nZXQoKTsKKyAgICAgICAgZmluYWwgU3NlRXZlbnRTb3VyY2UgZXZlbnRTb3VyY2UgPSBTc2VFdmVudFNvdXJjZQorICAgICAgICAgICAgICAgIC50YXJnZXQodGFyZ2V0KCJyZXNvdXJjZS9mYWlsIikpCisgICAgICAgICAgICAgICAgLnJlY29ubmVjdGluZ0V2ZXJ5KDExLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIGV2ZW50U291cmNlLnJlZ2lzdGVyKFN5c3RlbS5vdXQ6OnByaW50bG4pOworICAgICAgICBldmVudFNvdXJjZS5vcGVuKCk7CisgICAgICAgIGFzc2VydFRydWUoIldhaXRpbmcgZm9yIGV2ZW50U291cmNlIHRvIG9wZW4gdGltZS1vdXRlZCIsIGNkbC5hd2FpdCg1MDAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQ2xpZW50IGFzeW5jIGV4ZWN1dG9yIHRocmVhZCBub3QgZm91bmQuIiwgY2xpZW50RXhlY3V0b3JUaHJlYWRQcmVzZW50KCkpOworICAgICAgICBhc3NlcnRUcnVlKCJTY2hlZHVsZXIgdGhyZWFkIG5vdCBmb3VuZC4iLCBzY2hlZHVsZXJGb3VuZCk7CisgICAgICAgIGNsaWVudCgpLmNsb3NlKCk7CisgICAgICAgIGFzc2VydEZhbHNlKCJDbGllbnQgYXN5bmMgZXhlY3V0b3IgdGhyZWFkIHNob3VsZCBoYXZlIGJlZW4gYWxyZWFkeSByZW1vdmVkLiIsCisgICAgICAgICAgICAgICAgY2xpZW50RXhlY3V0b3JUaHJlYWRQcmVzZW50KCkpOworICAgICAgICBhc3NlcnRGYWxzZSgiQ2xpZW50IGJhY2tncm91bmQgc2NoZWR1bGVyIHRocmVhZCBzaG91bGQgaGF2ZSBiZWVuIGFscmVhZHkgcmVtb3ZlZC4iLAorICAgICAgICAgICAgICAgIGNsaWVudFNjaGVkdWxlclRocmVhZFByZXNlbnQoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGNsaWVudEV4ZWN1dG9yVGhyZWFkUHJlc2VudCgpIHsKKyAgICAgICAgU2V0PFRocmVhZD4gdGhyZWFkcyA9IFRocmVhZC5nZXRBbGxTdGFja1RyYWNlcygpLmtleVNldCgpOworICAgICAgICByZXR1cm4gdGhyZWFkcy5zdHJlYW0oKS5tYXAoVGhyZWFkOjpnZXROYW1lKS5hbnlNYXRjaChuYW1lIC0+IG5hbWUuY29udGFpbnMoImplcnNleS1jbGllbnQtYXN5bmMtZXhlY3V0b3IiKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjbGllbnRTY2hlZHVsZXJUaHJlYWRQcmVzZW50KCkgeworICAgICAgICBTZXQ8VGhyZWFkPiB0aHJlYWRzID0gVGhyZWFkLmdldEFsbFN0YWNrVHJhY2VzKCkua2V5U2V0KCk7CisgICAgICAgIGZvciAoVGhyZWFkIHRocmVhZCA6IHRocmVhZHMpIHsKKyAgICAgICAgICAgIGlmICh0aHJlYWQuZ2V0TmFtZSgpLmNvbnRhaW5zKCJqZXJzZXktY2xpZW50LWJhY2tncm91bmQtc2NoZWR1bGVyIikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFBhdGgoInJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SGVsbG8oKSB7CisgICAgICAgICAgICByZXR1cm4gIkhlbGxvIjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImZhaWwiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZmFpbCgpIHsKKyAgICAgICAgICAgIC8vIHNob3VsZCByZXR1cm4gZmFsc2Ugb24gZmlyc3QgKHJlZ3VsYXIpIGNvbm5lY3QgYW5kIHRydWUgb24gcmVjb25uZWN0CisgICAgICAgICAgICBzY2hlZHVsZXJGb3VuZCA9IGNsaWVudFNjaGVkdWxlclRocmVhZFByZXNlbnQoKTsKKyAgICAgICAgICAgIGNkbC5jb3VudERvd24oKTsKKyAgICAgICAgICAgIC8vIHNpbXVsYXRlIHVuc3VjY2Vzc2Z1bCBjb25uZWN0IGF0dGVtcHQgLT4gZm9yY2UgcmVjb25uZWN0IChldmVudFNvdXJjZSB3aWxsIHN1Ym1pdCBhIHRhc2sgaW50byBzY2hlZHVsZXIpCisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDUwMykuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0NsaWVudEV4ZWN1dG9yVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvQ2xpZW50RXhlY3V0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE3YjJhMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0NsaWVudEV4ZWN1dG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjA1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jbGllbnQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudEFzeW5jRXhlY3V0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmEuVGhyZWFkRmFjdG9yeUJ1aWxkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5FeGVjdXRvclNlcnZpY2VQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuY29udGFpbnNTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKKworLyoqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQ2xpZW50RXhlY3V0b3JUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAUGF0aCgiQ2xpZW50RXhlY3V0b3JUZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENsaWVudEV4ZWN1dG9yVGVzdFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJnZXQiOworICAgICAgICB9CisgICAgfQorCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKENsaWVudEV4ZWN1dG9yVGVzdFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvbGF0aWxlIFN0cmluZyB0aHJlYWROYW1lID0gbnVsbDsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbUV4ZWN1dG9yUngoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworCisgICAgICAgIEV4ZWN1dG9yU2VydmljZSBjbGllbnRFeGVjdXRvciA9CisgICAgICAgICAgICAgICAgRXhlY3V0b3JzLm5ld0NhY2hlZFRocmVhZFBvb2wobmV3IFRocmVhZEZhY3RvcnlCdWlsZGVyKCkuc2V0TmFtZUZvcm1hdCgiQ2xpZW50RXhlY3V0b3ItJWQiKS5idWlsZCgpKTsKKworICAgICAgICBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdCdWlsZGVyKCkuZXhlY3V0b3JTZXJ2aWNlKGNsaWVudEV4ZWN1dG9yKS5idWlsZCgpOworCisgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworCisgICAgICAgIHRlc3RSeChjbGllbnQsIGxhdGNoKTsKKworICAgICAgICBsYXRjaC5hd2FpdCgzLCBUaW1lVW5pdC5TRUNPTkRTKTsKKworICAgICAgICBhc3NlcnROb3ROdWxsKHRocmVhZE5hbWUpOworICAgICAgICBhc3NlcnRUaGF0KHRocmVhZE5hbWUsIGNvbnRhaW5zU3RyaW5nKCJDbGllbnRFeGVjdXRvciIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0RXhlY3V0b3JSeCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KCk7CisKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisKKyAgICAgICAgdGVzdFJ4KGNsaWVudCwgbGF0Y2gpOworCisgICAgICAgIGxhdGNoLmF3YWl0KDMsIFRpbWVVbml0LlNFQ09ORFMpOworICAgICAgICBhc3NlcnROb3ROdWxsKHRocmVhZE5hbWUpOworICAgICAgICBhc3NlcnRUaGF0KHRocmVhZE5hbWUsIGNvbnRhaW5zU3RyaW5nKCJqZXJzZXktY2xpZW50LWFzeW5jLWV4ZWN1dG9yIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRFeGVjdXRvckFzeW5jKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKworICAgICAgICBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKTsKKworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKworICAgICAgICB0ZXN0QXN5bmMoY2xpZW50LCBsYXRjaCk7CisKKyAgICAgICAgbGF0Y2guYXdhaXQoMywgVGltZVVuaXQuU0VDT05EUyk7CisgICAgICAgIGFzc2VydE5vdE51bGwodGhyZWFkTmFtZSk7CisgICAgICAgIGFzc2VydFRoYXQodGhyZWFkTmFtZSwgY29udGFpbnNTdHJpbmcoImplcnNleS1jbGllbnQtYXN5bmMtZXhlY3V0b3IiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SmVyc2V5Q3VzdG9tRXhlY3V0b3JBc3luYygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpOworICAgICAgICBjbGllbnQucmVnaXN0ZXIoTXlFeGVjdXRvclByb3ZpZGVyLmNsYXNzKTsKKworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKworICAgICAgICB0ZXN0QXN5bmMoY2xpZW50LCBsYXRjaCk7CisKKyAgICAgICAgbGF0Y2guYXdhaXQoMywgVGltZVVuaXQuU0VDT05EUyk7CisgICAgICAgIGFzc2VydE5vdE51bGwodGhyZWFkTmFtZSk7CisgICAgICAgIGFzc2VydFRoYXQodGhyZWFkTmFtZSwgY29udGFpbnNTdHJpbmcoIk15RXhlY3V0b3JQcm92aWRlciIpKTsKKyAgICB9CisKKworICAgIHByaXZhdGUgdm9pZCB0ZXN0UngoQ2xpZW50IGNsaWVudCwgQ291bnREb3duTGF0Y2ggbGF0Y2gpIHsKKyAgICAgICAgY2xpZW50LnRhcmdldChVcmlCdWlsZGVyLmZyb21VcmkoZ2V0QmFzZVVyaSgpKS5wYXRoKCJDbGllbnRFeGVjdXRvclRlc3QiKSkKKyAgICAgICAgICAgICAgLnJlZ2lzdGVyKG5ldyBNZXNzYWdlQm9keVJlYWRlcjxDbGllbnRFeGVjdXRvclRlc3Q+KCkgeworICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgIHB1YmxpYyBDbGllbnRFeGVjdXRvclRlc3QgcmVhZEZyb20oQ2xhc3M8Q2xpZW50RXhlY3V0b3JUZXN0PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgICAgICAgICAgIENsaWVudEV4ZWN1dG9yVGVzdC50aGlzLnRocmVhZE5hbWUgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKworICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2xpZW50RXhlY3V0b3JUZXN0KCk7CisKKyAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAucngoKQorICAgICAgICAgICAgICAuZ2V0KENsaWVudEV4ZWN1dG9yVGVzdC5jbGFzcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RBc3luYyhDbGllbnQgY2xpZW50LCBDb3VudERvd25MYXRjaCBsYXRjaCkgeworICAgICAgICBjbGllbnQudGFyZ2V0KFVyaUJ1aWxkZXIuZnJvbVVyaShnZXRCYXNlVXJpKCkpLnBhdGgoIkNsaWVudEV4ZWN1dG9yVGVzdCIpKQorICAgICAgICAgICAgICAucmVnaXN0ZXIobmV3IE1lc3NhZ2VCb2R5UmVhZGVyPENsaWVudEV4ZWN1dG9yVGVzdD4oKSB7CisgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgcHVibGljIENsaWVudEV4ZWN1dG9yVGVzdCByZWFkRnJvbShDbGFzczxDbGllbnRFeGVjdXRvclRlc3Q+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworCisgICAgICAgICAgICAgICAgICAgICAgQ2xpZW50RXhlY3V0b3JUZXN0LnRoaXMudGhyZWFkTmFtZSA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpOworICAgICAgICAgICAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworCisgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDbGllbnRFeGVjdXRvclRlc3QoKTsKKworICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgIC5hc3luYygpCisgICAgICAgICAgICAgIC5nZXQoQ2xpZW50RXhlY3V0b3JUZXN0LmNsYXNzKTsKKyAgICB9CisKKyAgICBAQ2xpZW50QXN5bmNFeGVjdXRvcgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlFeGVjdXRvclByb3ZpZGVyIGltcGxlbWVudHMgRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXIgeworCisgICAgICAgIHB1YmxpYyBmaW5hbCBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlID0KKyAgICAgICAgICAgICAgICBFeGVjdXRvcnMKKyAgICAgICAgICAgICAgICAgICAgICAgIC5uZXdDYWNoZWRUaHJlYWRQb29sKG5ldyBUaHJlYWRGYWN0b3J5QnVpbGRlcigpLnNldE5hbWVGb3JtYXQoIk15RXhlY3V0b3JQcm92aWRlci0lZCIpLmJ1aWxkKCkpOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRXhlY3V0b3JTZXJ2aWNlIGdldEV4ZWN1dG9yU2VydmljZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBleGVjdXRvclNlcnZpY2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZShFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlKSB7CisgICAgICAgICAgICBleGVjdXRvclNlcnZpY2Uuc2h1dGRvd24oKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0NsaWVudEZpbHRlclRlc3QuamF2YSBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0NsaWVudEZpbHRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjQyOTBiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvQ2xpZW50RmlsdGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jbGllbnQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXNwb25zZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlc3BvbnNlRmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5SZXNwb25zZVByb2Nlc3NpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ2FjaGVDb250cm9sOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvb2tpZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBDbGllbnRGaWx0ZXJUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAUGF0aCgiL3Rlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRm9vUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoQENvbnRleHQgSHR0cEhlYWRlcnMgaGVhZGVycykgeworICAgICAgICAgICAgcmV0dXJuICJHRVQgIgorICAgICAgICAgICAgICAgICAgICArIGhlYWRlcnMuZ2V0SGVhZGVyU3RyaW5nKEh0dHBIZWFkZXJzLkNPT0tJRSkKKyAgICAgICAgICAgICAgICAgICAgKyBoZWFkZXJzLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5DQUNIRV9DT05UUk9MKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ3VzdG9tUmVxdWVzdEZpbHRlciBpbXBsZW1lbnRzIENsaWVudFJlcXVlc3RGaWx0ZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ2xpZW50UmVxdWVzdENvbnRleHQgY2xpZW50UmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBjbGllbnRSZXF1ZXN0Q29udGV4dC5hYm9ydFdpdGgoUmVzcG9uc2Uub2soIk9LISIsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpLmJ1aWxkKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhGb29SZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBmaWx0ZXJBYm9ydFRlc3QoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKTsKKyAgICAgICAgdGFyZ2V0LnJlZ2lzdGVyKEN1c3RvbVJlcXVlc3RGaWx0ZXIuY2xhc3MpOworICAgICAgICBmaW5hbCBTdHJpbmcgZW50aXR5ID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIk9LISIsIGVudGl0eSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBIZWFkZXJQcm92aWRlcnNSZXF1ZXN0RmlsdGVyIGltcGxlbWVudHMgQ2xpZW50UmVxdWVzdEZpbHRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDbGllbnRSZXF1ZXN0Q29udGV4dCBjbGllbnRSZXF1ZXN0Q29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIENhY2hlQ29udHJvbCBjYWNoZUNvbnRyb2wgPSBuZXcgQ2FjaGVDb250cm9sKCk7CisgICAgICAgICAgICBjYWNoZUNvbnRyb2wuc2V0UHJpdmF0ZSh0cnVlKTsKKyAgICAgICAgICAgIGNsaWVudFJlcXVlc3RDb250ZXh0LmdldEhlYWRlcnMoKS5wdXRTaW5nbGUoSHR0cEhlYWRlcnMuQ0FDSEVfQ09OVFJPTCwgY2FjaGVDb250cm9sKTsKKyAgICAgICAgICAgIGNsaWVudFJlcXVlc3RDb250ZXh0LmdldEhlYWRlcnMoKS5wdXRTaW5nbGUoSHR0cEhlYWRlcnMuQ09PS0lFLCBuZXcgQ29va2llKCJjb29raWUiLCAiY29va2llLXZhbHVlIikpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBmaWx0ZXJIZWFkZXJQcm92aWRlcnNUZXN0KCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCk7CisgICAgICAgIHRhcmdldC5yZWdpc3RlcihIZWFkZXJQcm92aWRlcnNSZXF1ZXN0RmlsdGVyLmNsYXNzKS5yZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnBhdGgoInRlc3QiKS5yZXF1ZXN0KCkuZ2V0KFJlc3BvbnNlLmNsYXNzKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGVudGl0eSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRUcnVlKGVudGl0eS5jb250YWlucygiR0VUIikpOworICAgICAgICBhc3NlcnRUcnVlKGVudGl0eS5jb250YWlucygicHJpdmF0ZSIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShlbnRpdHkuY29udGFpbnMoImNvb2tpZS12YWx1ZSIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIElPRXhjZXB0aW9uUmVzcG9uc2VGaWx0ZXIgaW1wbGVtZW50cyBDbGllbnRSZXNwb25zZUZpbHRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDbGllbnRSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCwgQ2xpZW50UmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCkgdGhyb3dzCisgICAgICAgICAgICAgICAgSU9FeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKElPRXhjZXB0aW9uUmVzcG9uc2VGaWx0ZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBpb0V4Y2VwdGlvblJlc3BvbnNlRmlsdGVyVGVzdCgpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpOworICAgICAgICB0YXJnZXQucmVnaXN0ZXIoSU9FeGNlcHRpb25SZXNwb25zZUZpbHRlci5jbGFzcykucmVnaXN0ZXIoTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpOworCisgICAgICAgIGJvb2xlYW4gY2F1Z2h0ID0gZmFsc2U7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRhcmdldC5wYXRoKCJ0ZXN0IikucmVxdWVzdCgpLmdldChSZXNwb25zZS5jbGFzcyk7CisgICAgICAgIH0gY2F0Y2ggKFJlc3BvbnNlUHJvY2Vzc2luZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBjYXVnaHQgPSB0cnVlOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChlLmdldENhdXNlKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKElPRXhjZXB0aW9uLmNsYXNzLCBlLmdldENhdXNlKCkuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoSU9FeGNlcHRpb25SZXNwb25zZUZpbHRlci5jbGFzcy5nZXROYW1lKCksIGUuZ2V0Q2F1c2UoKS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShjYXVnaHQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0NsaWVudFBhdGhUZXN0LmphdmEgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9DbGllbnRQYXRoVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMDdiZDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9DbGllbnRQYXRoVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jbGllbnQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3QgZGVmaW5pdGlvbiBvZiBwYXRoIGluIGNsaWVudCBpbnZvY2F0aW9uLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBDbGllbnRQYXRoVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhUZXN0UmVzb3VyY2UuY2xhc3MsIFRlc3RSZXNvdXJjZVdpdGhQYXRoUGFyYW1zLmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoYXQge0BsaW5rIFBhdGhQYXJhbSBwYXRoIHBhcmFtZXRlcnN9IGNhbiBiZSBwYXNzZWQgdG8ge0BsaW5rIENsaWVudCN0YXJnZXQoU3RyaW5nKX0gbWV0aG9kLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcGF0aFBhcmFtSW5UYXJnZXRUZXN0KCkgeworCisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gY2xpZW50KCkudGFyZ2V0KCJodHRwOi8vbG9jYWxob3N0OiIgKyBnZXRQb3J0KCkgKyAiL3Rlc3Qve2JlZ2luQnl9IikKKyAgICAgICAgICAgICAgICAucmVzb2x2ZVRlbXBsYXRlKCJiZWdpbkJ5IiwgImFiYyIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0LWdldCxhYmMiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHBhdGggY29uY2F0ZW5hdGlvbi4gKHJlZ3Jlc3Npb24gdGVzdCBmb3IgSkVSU0VZLTExMTQpCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwYXRoQ29uY2F0ZW5hdGlvblRlc3QxKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IGNsaWVudCgpLnRhcmdldCgiaHR0cDovL2xvY2FsaG9zdDoiICsgZ2V0UG9ydCgpKS5wYXRoKCJwYXRoIikucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKQorICAgICAgICAgICAgICAgIC5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QtcGF0aCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgcGF0aCBjb25jYXRlbmF0aW9uLiAocmVncmVzc2lvbiB0ZXN0IGZvciBKRVJTRVktMTExNCkKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHBhdGhDb25jYXRlbmF0aW9uVGVzdDIoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gY2xpZW50KCkudGFyZ2V0KCJodHRwOi8vbG9jYWxob3N0OiIgKyBnZXRQb3J0KCkpLnBhdGgoIi9wYXRoIikucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKQorICAgICAgICAgICAgICAgIC5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QtcGF0aCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgcGF0aCBjb25jYXRlbmF0aW9uLiAocmVncmVzc2lvbiB0ZXN0IGZvciBKRVJTRVktMTExNCkKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHBhdGhDb25jYXRlbmF0aW9uVGVzdDMoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gY2xpZW50KCkudGFyZ2V0KCJodHRwOi8vbG9jYWxob3N0OiIgKyBnZXRQb3J0KCkpLnBhdGgoIi9wYXRoLyIpLnBhdGgoIi9hbm90aGVyLyIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0LWFub3RoZXItcGF0aCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgcGF0aCBjb25jYXRlbmF0aW9uLiAocmVncmVzc2lvbiB0ZXN0IGZvciBKRVJTRVktMTExNCkKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHBhdGhDb25jYXRlbmF0aW9uVGVzdDQoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gY2xpZW50KCkudGFyZ2V0KCJodHRwOi8vbG9jYWxob3N0OiIgKyBnZXRQb3J0KCkpLnBhdGgoIi9wYXRoIikucGF0aCgiYW5vdGhlci8iKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdC1hbm90aGVyLXBhdGgiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHBhdGggY29uY2F0ZW5hdGlvbi4gKHJlZ3Jlc3Npb24gdGVzdCBmb3IgSkVSU0VZLTExMTQpCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwYXRoQ29uY2F0ZW5hdGlvblRlc3Q2KCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IGNsaWVudCgpLnRhcmdldCgiaHR0cDovL2xvY2FsaG9zdDoiICsgZ2V0UG9ydCgpICsgIi8iKS5wYXRoKCIvcGF0aC9hbm90aGVyIikKKyAgICAgICAgICAgICAgICAucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3QtYW5vdGhlci1wYXRoIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHJlc291cmNlIGNsYXNzIHdpdGgge0BsaW5rIFBhdGhQYXJhbSBwYXRoIHBhcmFtZXRlcnMpLgorICAgICAqCisgICAgICovCisgICAgQFBhdGgoInRlc3Qve2JlZ2luQnl9IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RSZXNvdXJjZVdpdGhQYXRoUGFyYW1zIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICAgICAgQENvbnN1bWVzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldChAUGF0aFBhcmFtKHZhbHVlID0gImJlZ2luQnkiKSBTdHJpbmcgcGFyYW0pIHsKKyAgICAgICAgICAgIHJldHVybiAidGVzdC1nZXQsIiArIHBhcmFtOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHJlc291cmNlIGNsYXNzLgorICAgICAqCisgICAgICovCisgICAgQFBhdGgoInBhdGgiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICAgICAgQENvbnN1bWVzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAidGVzdC1wYXRoIjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgICAgICBAQ29uc3VtZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgICAgIEBQYXRoKCJhbm90aGVyIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRBbm90aGVyKCkgeworICAgICAgICAgICAgcmV0dXJuICJ0ZXN0LWFub3RoZXItcGF0aCI7CisgICAgICAgIH0KKworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvQ2xpZW50UHJlSW5pdFRlc3QuamF2YSBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0NsaWVudFByZUluaXRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ0ZDY4NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0NsaWVudFByZUluaXRUZXN0LmphdmEKQEAgLTAsMCArMSwyMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNsaWVudDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuSGVhZGVyUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVzcG9uc2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXNwb25zZUZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5KZXJzZXlDbGllbnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkplcnNleVdlYlRhcmdldDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBUZXN0IHByZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgY2xpZW50LgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIENsaWVudFByZUluaXRUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFBhdGgoInJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldChASGVhZGVyUGFyYW0oImZpbHRlci1yZXF1ZXN0IikgU3RyaW5nIGhlYWRlcikgeworICAgICAgICAgICAgcmV0dXJuICJyZXNvdXJjZToiICsgKGhlYWRlciA9PSBudWxsID8gIjxudWxsPiIgOiBoZWFkZXIpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiY2hpbGQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENoaWxkKEBIZWFkZXJQYXJhbSgiZmlsdGVyLXJlcXVlc3QiKSBTdHJpbmcgaGVhZGVyKSB7CisgICAgICAgICAgICByZXR1cm4gImNoaWxkOiIgKyAoaGVhZGVyID09IG51bGwgPyAiPG51bGw+IiA6IGhlYWRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15UmVxdWVzdEZpbHRlciBpbXBsZW1lbnRzIENsaWVudFJlcXVlc3RGaWx0ZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ2xpZW50UmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5nZXRIZWFkZXJzKCkuYWRkKCJmaWx0ZXItcmVxdWVzdCIsICJjYWxsZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlSZXNwb25zZUZpbHRlciBpbXBsZW1lbnRzIENsaWVudFJlc3BvbnNlRmlsdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENsaWVudFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LCBDbGllbnRSZXNwb25zZUNvbnRleHQgcmVzcG9uc2VDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LmdldEhlYWRlcnMoKS5hZGQoImZpbHRlci1yZXNwb25zZSIsICJjYWxsZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFJlYWRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5UmVhZGVyPEludGVnZXI+IHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGluaXRpYWxpemVkOworCisgICAgICAgIHB1YmxpYyBUZXN0UmVhZGVyKCkgeworICAgICAgICAgICAgVGVzdFJlYWRlci5pbml0aWFsaXplZCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSW50ZWdlciByZWFkRnJvbShDbGFzczxJbnRlZ2VyPiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBodHRwSGVhZGVycywgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKQorICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgYmVmb3JlKCkgeworICAgICAgICBUZXN0UmVhZGVyLmluaXRpYWxpemVkID0gZmFsc2U7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uSW5pdGlhbGl6ZWQoKSB7CisgICAgICAgIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpOworICAgICAgICBjbGllbnQucmVnaXN0ZXIoTXlSZXNwb25zZUZpbHRlci5jbGFzcyk7CisgICAgICAgIGNsaWVudC5yZWdpc3RlcihUZXN0UmVhZGVyLmNsYXNzKTsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IGNsaWVudC50YXJnZXQoc3VwZXIuZ2V0QmFzZVVyaSgpKS5wYXRoKCJyZXNvdXJjZSIpOworICAgICAgICBhc3NlcnRGYWxzZShUZXN0UmVhZGVyLmluaXRpYWxpemVkKTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzb3VyY2VSZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGNoZWNrUmVzcG9uc2UocmVzb3VyY2VSZXNwb25zZSwgInJlc291cmNlOjxudWxsPiIpOworICAgICAgICBhc3NlcnRUcnVlKFRlc3RSZWFkZXIuaW5pdGlhbGl6ZWQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZVByZWluaXRpYWxpemUoKSB7CisgICAgICAgIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpOworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gY2xpZW50LnRhcmdldChzdXBlci5nZXRCYXNlVXJpKCkpLnBhdGgoInJlc291cmNlIik7CisgICAgICAgIHRhcmdldC5yZWdpc3RlcihNeVJlc3BvbnNlRmlsdGVyLmNsYXNzKTsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IGNoaWxkVGFyZ2V0ID0gdGFyZ2V0LnBhdGgoImNoaWxkIik7CisgICAgICAgICgoSmVyc2V5V2ViVGFyZ2V0KSBjaGlsZFRhcmdldCkucHJlSW5pdGlhbGl6ZSgpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IGNoaWxkVGFyZ2V0LnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgY2hlY2tSZXNwb25zZShyZXNwb25zZSwgImNoaWxkOjxudWxsPiIpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc291cmNlUmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLmdldCgpOworICAgICAgICBjaGVja1Jlc3BvbnNlKHJlc291cmNlUmVzcG9uc2UsICJyZXNvdXJjZTo8bnVsbD4iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXVzaW5nUHJlaW5pdGlhbGl6ZWRDb25maWcoKSB7CisgICAgICAgIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpOworICAgICAgICBjbGllbnQucmVnaXN0ZXIoVGVzdFJlYWRlci5jbGFzcyk7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSBjbGllbnQudGFyZ2V0KHN1cGVyLmdldEJhc2VVcmkoKSkucGF0aCgicmVzb3VyY2UiKTsKKyAgICAgICAgdGFyZ2V0LnJlZ2lzdGVyKE15UmVzcG9uc2VGaWx0ZXIuY2xhc3MpOworICAgICAgICAoKEplcnNleVdlYlRhcmdldCkgdGFyZ2V0KS5wcmVJbml0aWFsaXplKCk7CisgICAgICAgIGFzc2VydFRydWUoVGVzdFJlYWRlci5pbml0aWFsaXplZCk7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCBjaGlsZFRhcmdldCA9IHRhcmdldC5wYXRoKCJjaGlsZCIpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IGNoaWxkVGFyZ2V0LnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICBjaGVja1Jlc3BvbnNlKHJlc3BvbnNlLCAiY2hpbGQ6PG51bGw+Iik7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzb3VyY2VSZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGNoZWNrUmVzcG9uc2UocmVzb3VyY2VSZXNwb25zZSwgInJlc291cmNlOjxudWxsPiIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJldXNpbmdQcmVpbml0aWFsaXplZENvbmZpZzIoKSB7CisgICAgICAgIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpOworICAgICAgICBjbGllbnQucmVnaXN0ZXIoVGVzdFJlYWRlci5jbGFzcyk7CisgICAgICAgIGNsaWVudC5yZWdpc3RlcihNeVJlc3BvbnNlRmlsdGVyLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRGYWxzZShUZXN0UmVhZGVyLmluaXRpYWxpemVkKTsKKyAgICAgICAgKChKZXJzZXlDbGllbnQpIGNsaWVudCkucHJlSW5pdGlhbGl6ZSgpOworICAgICAgICBhc3NlcnRUcnVlKFRlc3RSZWFkZXIuaW5pdGlhbGl6ZWQpOworCisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSBjbGllbnQudGFyZ2V0KHN1cGVyLmdldEJhc2VVcmkoKSkucGF0aCgicmVzb3VyY2UiKTsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IGNoaWxkVGFyZ2V0ID0gdGFyZ2V0LnBhdGgoImNoaWxkIik7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gY2hpbGRUYXJnZXQucmVxdWVzdCgpLmdldCgpOworICAgICAgICBjaGVja1Jlc3BvbnNlKHJlc3BvbnNlLCAiY2hpbGQ6PG51bGw+Iik7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzb3VyY2VSZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGNoZWNrUmVzcG9uc2UocmVzb3VyY2VSZXNwb25zZSwgInJlc291cmNlOjxudWxsPiIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja1Jlc3BvbnNlKFJlc3BvbnNlIHJlc3BvbnNlLCBTdHJpbmcgZW50aXR5KSB7CisgICAgICAgIGFzc2VydEVxdWFscygiY2FsbGVkIiwgcmVzcG9uc2UuZ2V0SGVhZGVycygpLmdldCgiZmlsdGVyLXJlc3BvbnNlIikuZ2V0KDApKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZW50aXR5LCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlZ2lzdGVyT25QcmVpbml0aWFsaXplZDEoKSB7CisgICAgICAgIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpOworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gY2xpZW50LnRhcmdldChzdXBlci5nZXRCYXNlVXJpKCkpLnBhdGgoInJlc291cmNlIik7CisgICAgICAgIHRhcmdldC5yZWdpc3RlcihNeVJlcXVlc3RGaWx0ZXIuY2xhc3MpOworICAgICAgICAoKEplcnNleVdlYlRhcmdldCkgdGFyZ2V0KS5wcmVJbml0aWFsaXplKCk7CisgICAgICAgIHRhcmdldC5yZWdpc3RlcihNeVJlc3BvbnNlRmlsdGVyLmNsYXNzKTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLmdldCgpOworICAgICAgICBjaGVja1Jlc3BvbnNlKHJlc3BvbnNlLCAicmVzb3VyY2U6Y2FsbGVkIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVnaXN0ZXJPblByZWluaXRpYWxpemVkMigpIHsKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KCk7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSBjbGllbnQudGFyZ2V0KHN1cGVyLmdldEJhc2VVcmkoKSkucGF0aCgicmVzb3VyY2UiKTsKKyAgICAgICAgdGFyZ2V0LnJlZ2lzdGVyKE15UmVzcG9uc2VGaWx0ZXIuY2xhc3MpOworICAgICAgICAoKEplcnNleVdlYlRhcmdldCkgdGFyZ2V0KS5wcmVJbml0aWFsaXplKCk7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCBjaGlsZCA9IHRhcmdldC5wYXRoKCJjaGlsZCIpOworICAgICAgICBjaGlsZC5yZWdpc3RlcihNeVJlcXVlc3RGaWx0ZXIuY2xhc3MpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgY2hlY2tSZXNwb25zZShyZXNwb25zZSwgInJlc291cmNlOjxudWxsPiIpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIGNoaWxkUmVzcG9uc2UgPSBjaGlsZC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGNoZWNrUmVzcG9uc2UoY2hpbGRSZXNwb25zZSwgImNoaWxkOmNhbGxlZCIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0ZvbGxvd1JlZGlyZWN0SGVhZFRlc3QuamF2YSBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0ZvbGxvd1JlZGlyZWN0SGVhZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDRjYTE1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvRm9sbG93UmVkaXJlY3RIZWFkVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jbGllbnQ7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFRlc3RzIHRoYXQgY29uZmlndXJhdGlvbiBvZiB7QGxpbmsgQ2xpZW50UHJvcGVydGllcyNGT0xMT1dfUkVESVJFQ1RTfSB3b3JrcyB3aGVuIEhFQUQgbWV0aG9kIGlzIHVzZWQuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgY2xhc3MgRm9sbG93UmVkaXJlY3RIZWFkVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQFBhdGgoInJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAUGF0aCgicmVkaXJlY3QiKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSByZWRpcmVjdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoMzAzKS5sb2NhdGlvbihVUkkuY3JlYXRlKCJyZXNvdXJjZS9maW5hbCIpKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImZpbmFsIikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgYWZ0ZXJSZWRpcmVjdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygiZmluYWwtZW50aXR5IikuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MsIExvZ2dpbmdGZWF0dXJlLmNsYXNzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFdlYlRhcmdldCBnZXRUYXJnZXQoYm9vbGVhbiBmb2xsb3dSZWRpcmVjdCkgeworICAgICAgICBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQobmV3IENsaWVudENvbmZpZygpLnByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuRk9MTE9XX1JFRElSRUNUUywKKyAgICAgICAgICAgICAgICBmb2xsb3dSZWRpcmVjdCkpOworICAgICAgICByZXR1cm4gY2xpZW50LnRhcmdldChnZXRCYXNlVXJpKCkpLnBhdGgoInJlc291cmNlL3JlZGlyZWN0Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG9udEZvbGxvd1JlZGlyZWN0SGVhZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IGdldFRhcmdldChmYWxzZSkucmVxdWVzdCgpLmhlYWQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMDMsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocmVzcG9uc2UuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpLmVuZHNXaXRoKCIvZmluYWwiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG9udEZvbGxvd1JlZGlyZWN0R2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gZ2V0VGFyZ2V0KGZhbHNlKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzAzLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHJlc3BvbnNlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKS5lbmRzV2l0aCgiL2ZpbmFsIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZvbGxvd1JlZGlyZWN0SGVhZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IGdldFRhcmdldCh0cnVlKS5yZXF1ZXN0KCkuaGVhZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UocmVzcG9uc2UuaGFzRW50aXR5KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZvbGxvd1JlZGlyZWN0R2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gZ2V0VGFyZ2V0KHRydWUpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiZmluYWwtZW50aXR5IiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9Gb2xsb3dSZWRpcmVjdHNUZXN0LmphdmEgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9Gb2xsb3dSZWRpcmVjdHNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI2MTBiMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0ZvbGxvd1JlZGlyZWN0c1Rlc3QuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jbGllbnQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitwdWJsaWMgY2xhc3MgRm9sbG93UmVkaXJlY3RzVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworICAgIEBQYXRoKCIvdGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZWRpcmVjdFJlc291cmNlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiR0VUIjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInJlZGlyZWN0IikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHJlZGlyZWN0KCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnNlZU90aGVyKFVyaUJ1aWxkZXIuZnJvbVJlc291cmNlKFJlZGlyZWN0UmVzb3VyY2UuY2xhc3MpLmJ1aWxkKCkpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlZGlyZWN0UmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERvRm9sbG93KCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgidGVzdC9yZWRpcmVjdCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG9udEZvbGxvdygpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgidGVzdC9yZWRpcmVjdCIpOworICAgICAgICB0YXJnZXQucHJvcGVydHkoQ2xpZW50UHJvcGVydGllcy5GT0xMT1dfUkVESVJFQ1RTLCBmYWxzZSk7CisgICAgICAgIGFzc2VydEVxdWFscygzMDMsIHRhcmdldC5yZXF1ZXN0KCkuZ2V0KCkuZ2V0U3RhdHVzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0dlbmVyaWNSZXNwb25zZVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0dlbmVyaWNSZXNwb25zZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGRhZGNkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvR2VuZXJpY1Jlc3BvbnNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jbGllbnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5Bc3luY0ludm9rZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuU3luY0ludm9rZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY1R5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFRlc3Qge0BsaW5rIEdlbmVyaWNUeXBlfSB3aXRoIHtAbGluayBSZXNwb25zZX0uCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgY2xhc3MgR2VuZXJpY1Jlc3BvbnNlVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhUZXN0UmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBQYXRoKCJyZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0UmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gImdldCI7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3QoU3RyaW5nIHBvc3QpIHsKKyAgICAgICAgICAgIHJldHVybiBwb3N0OworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdCgpIHsKKyAgICAgICAgR2VuZXJpY1R5cGU8UmVzcG9uc2U+IGdlbmVyaWMgPSBuZXcgR2VuZXJpY1R5cGU8UmVzcG9uc2U+KFJlc3BvbnNlLmNsYXNzKTsKKyAgICAgICAgRW50aXR5IGVudGl0eSA9IEVudGl0eS5lbnRpdHkoImVudGl0eSIsIE1lZGlhVHlwZS5XSUxEQ0FSRF9UWVBFKTsKKworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJyZXNvdXJjZSIpOworICAgICAgICBTeW5jSW52b2tlciBzeW5jID0gdGFyZ2V0LnJlcXVlc3QoKTsKKworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHN5bmMucG9zdChlbnRpdHksIGdlbmVyaWMpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJlbnRpdHkiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFzeW5jUG9zdCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgR2VuZXJpY1R5cGU8UmVzcG9uc2U+IGdlbmVyaWMgPSBuZXcgR2VuZXJpY1R5cGU8UmVzcG9uc2U+KFJlc3BvbnNlLmNsYXNzKTsKKyAgICAgICAgRW50aXR5IGVudGl0eSA9IEVudGl0eS5lbnRpdHkoImVudGl0eSIsIE1lZGlhVHlwZS5XSUxEQ0FSRF9UWVBFKTsKKworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJyZXNvdXJjZSIpOworICAgICAgICBmaW5hbCBBc3luY0ludm9rZXIgYXN5bmMgPSB0YXJnZXQucmVxdWVzdCgpLmFzeW5jKCk7CisKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSBhc3luYy5wb3N0KGVudGl0eSwgZ2VuZXJpYykuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImVudGl0eSIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgeworICAgICAgICBHZW5lcmljVHlwZTxSZXNwb25zZT4gZ2VuZXJpYyA9IG5ldyBHZW5lcmljVHlwZTxSZXNwb25zZT4oUmVzcG9uc2UuY2xhc3MpOworCisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoInJlc291cmNlIik7CisgICAgICAgIFN5bmNJbnZva2VyIHN5bmMgPSB0YXJnZXQucmVxdWVzdCgpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHN5bmMuZ2V0KGdlbmVyaWMpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJnZXQiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFzeW5jR2V0KCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBHZW5lcmljVHlwZTxSZXNwb25zZT4gZ2VuZXJpYyA9IG5ldyBHZW5lcmljVHlwZTxSZXNwb25zZT4oUmVzcG9uc2UuY2xhc3MpOworCisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoInJlc291cmNlIik7CisgICAgICAgIGZpbmFsIEFzeW5jSW52b2tlciBhc3luYyA9IHRhcmdldC5yZXF1ZXN0KCkuYXN5bmMoKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSBhc3luYy5nZXQoZ2VuZXJpYykuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImdldCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0R2VuZXJpY1N0cmluZygpIHsKKyAgICAgICAgR2VuZXJpY1R5cGU8U3RyaW5nPiBnZW5lcmljID0gbmV3IEdlbmVyaWNUeXBlPFN0cmluZz4oU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJyZXNvdXJjZSIpOworICAgICAgICBTeW5jSW52b2tlciBzeW5jID0gdGFyZ2V0LnJlcXVlc3QoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGVudGl0eSA9IHN5bmMuZ2V0KGdlbmVyaWMpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJnZXQiLCBlbnRpdHkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0h0dHBBdXRob3JpemF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvSHR0cEF1dGhvcml6YXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRkODExNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0h0dHBBdXRob3JpemF0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTQzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jbGllbnQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKK2ltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5OYW1lQmluZGluZzsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlNlY3VyaXR5Q29udGV4dDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5hdXRoZW50aWNhdGlvbi5IdHRwQXV0aGVudGljYXRpb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuQmFzZTY0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnV0aWwucnVubmVyLkNvbmN1cnJlbnRSdW5uZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworLyoqCisgKiBUZXN0cyB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LmF1dGhlbnRpY2F0aW9uLkh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmV9LgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworQFJ1bldpdGgoQ29uY3VycmVudFJ1bm5lci5jbGFzcykKK3B1YmxpYyBjbGFzcyBIdHRwQXV0aG9yaXphdGlvblRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBOYW1lQmluZGluZworICAgIEBUYXJnZXQoe0VsZW1lbnRUeXBlLlRZUEUsIEVsZW1lbnRUeXBlLk1FVEhPRH0pCisgICAgQFJldGVudGlvbih2YWx1ZSA9IFJldGVudGlvblBvbGljeS5SVU5USU1FKQorICAgIHB1YmxpYyBzdGF0aWMgQGludGVyZmFjZSBEaWdlc3QgeworICAgIH0KKworICAgIEBOYW1lQmluZGluZworICAgIEBUYXJnZXQoe0VsZW1lbnRUeXBlLlRZUEUsIEVsZW1lbnRUeXBlLk1FVEhPRH0pCisgICAgQFJldGVudGlvbih2YWx1ZSA9IFJldGVudGlvblBvbGljeS5SVU5USU1FKQorICAgIHB1YmxpYyBzdGF0aWMgQGludGVyZmFjZSBCYXNpYyB7CisgICAgfQorCisgICAgQE5hbWVCaW5kaW5nCisgICAgQFRhcmdldCh7RWxlbWVudFR5cGUuVFlQRSwgRWxlbWVudFR5cGUuTUVUSE9EfSkKKyAgICBAUmV0ZW50aW9uKHZhbHVlID0gUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCisgICAgcHVibGljIHN0YXRpYyBAaW50ZXJmYWNlIEFsdGVybmF0aW5nIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBbHRlcm5hdGVzIGJldHdlZW4gQkFTSUMgYW5kIERJR0VTVCAoZWFjaCBpcyB1c2VkIGZvciAyIHJlcXVlc3RzKS4KKyAgICAgKi8KKyAgICBAQWx0ZXJuYXRpbmcKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFsdGVybmF0aW5nRGlnZXN0QmFzaWNGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHsKKworICAgICAgICBpbnQgY291bnRlciA9IDA7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmICgoY291bnRlcisrIC8gMikgJSAyID09IDApIHsKKyAgICAgICAgICAgICAgICBuZXcgQmFzaWNGaWx0ZXIoKS5maWx0ZXIocmVxdWVzdENvbnRleHQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBuZXcgRGlnZXN0RmlsdGVyKCkuZmlsdGVyKHJlcXVlc3RDb250ZXh0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBEaWdlc3QKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERpZ2VzdEZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYXV0aG9yaXphdGlvbiA9IHJlcXVlc3RDb250ZXh0LmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5BVVRIT1JJWkFUSU9OKTsKKworICAgICAgICAgICAgaWYgKGF1dGhvcml6YXRpb24gIT0gbnVsbCAmJiBhdXRob3JpemF0aW9uLnRyaW0oKS50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoIkRJR0VTVCIpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgTWF0Y2hlciBtYXRjaCA9IFBhdHRlcm4uY29tcGlsZSgidXNlcm5hbWU9XCIoW15cIl0rKVwiIikubWF0Y2hlcihhdXRob3JpemF0aW9uKTsKKyAgICAgICAgICAgICAgICBpZiAoIW1hdGNoLmZpbmQoKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB1c2VybmFtZSA9IG1hdGNoLmdyb3VwKDEpOworCisgICAgICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuc2V0U2VjdXJpdHlDb250ZXh0KG5ldyBTZWN1cml0eUNvbnRleHQoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgUHJpbmNpcGFsIGdldFVzZXJQcmluY2lwYWwoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByaW5jaXBhbCgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1c2VybmFtZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzVXNlckluUm9sZShTdHJpbmcgcm9sZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzU2VjdXJlKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXV0aGVudGljYXRpb25TY2hlbWUoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRJR0VTVCI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5hYm9ydFdpdGgoUmVzcG9uc2Uuc3RhdHVzKDQwMSkuaGVhZGVyKEh0dHBIZWFkZXJzLldXV19BVVRIRU5USUNBVEUsCisgICAgICAgICAgICAgICAgICAgICJEaWdlc3QgcmVhbG09XCJteS1yZWFsbVwiLCBkb21haW49XCJcIiwgbm9uY2U9XCJuOWl2M01lU05rRWZNM3VKdDJnbkJVYVdVYktBbGp4cFwiLCBhbGdvcml0aG09TUQ1LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAicW9wPVwiYXV0aFwiLCBzdGFsZT1mYWxzZSIpCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEJhc2ljIEF1dGg6IHBhc3N3b3JkIG11c3QgYmUgdGhlIHNhbWUgYXMgdXNlciBuYW1lIGV4Y2VwdCBmaXJzdCBsZXR0ZXIgaXMgY2FwaXRhbGl6ZWQuCisgICAgICogRXhhbXBsZTogdXNlcm5hbWUgImhvbWVyIiAtPiAgcGFzc3dvcmQgIkhvbWVyIgorICAgICAqLworICAgIEBCYXNpYworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQmFzaWNGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHsKKworICAgICAgICBzdGF0aWMgZmluYWwgQ2hhcnNldCBDSEFSQUNURVJfU0VUID0gQ2hhcnNldC5mb3JOYW1lKCJpc28tODg1OS0xIik7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFVVEhfU0NIRU1FX0NBU0UgPSAiQXV0aC1TY2hlbWUtQ2FzZSI7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgICAgICBTdHJpbmcgYXV0aEhlYWRlciA9IHJlcXVlc3QuZ2V0SGVhZGVycygpLmdldEZpcnN0KEh0dHBIZWFkZXJzLkFVVEhPUklaQVRJT04pOworICAgICAgICAgICAgaWYgKGF1dGhIZWFkZXIgIT0gbnVsbCAmJiBhdXRoSGVhZGVyLnRyaW0oKS50b1VwcGVyQ2FzZSgpLnN0YXJ0c1dpdGgoIkJBU0lDIikpIHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgZGVjb2RlZCA9IG5ldyBTdHJpbmcoQmFzZTY0LmRlY29kZShhdXRoSGVhZGVyLnN1YnN0cmluZyg2KS5nZXRCeXRlcygpKSwgQ0hBUkFDVEVSX1NFVCk7CisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgU3RyaW5nIGRlY29kZWQgPSBCYXNlNjQuZGVjb2RlQXNTdHJpbmcoYXV0aEhlYWRlci5zdWJzdHJpbmcoNikpOworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZ1tdIHNwbGl0ID0gZGVjb2RlZC5zcGxpdCgiOiIpOworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB1c2VybmFtZSA9IHNwbGl0WzBdOworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwd2QgPSBzcGxpdFsxXTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgY2FwaXRhbGl6ZWRVc2VyTmFtZSA9IHVzZXJuYW1lLnN1YnN0cmluZygwLCAxKS50b1VwcGVyQ2FzZSgpICsgdXNlcm5hbWUuc3Vic3RyaW5nKDEpOworICAgICAgICAgICAgICAgIGlmIChjYXBpdGFsaXplZFVzZXJOYW1lLmVxdWFscyhwd2QpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3Quc2V0U2VjdXJpdHlDb250ZXh0KG5ldyBTZWN1cml0eUNvbnRleHQoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBQcmluY2lwYWwgZ2V0VXNlclByaW5jaXBhbCgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByaW5jaXBhbCgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1c2VybmFtZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNVc2VySW5Sb2xlKFN0cmluZyByb2xlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTZWN1cmUoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXV0aGVudGljYXRpb25TY2hlbWUoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJCQVNJQyI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgU3RyaW5nIGF1dGhTY2hlbWVDYXNlID0gcmVxdWVzdC5nZXRIZWFkZXJTdHJpbmcoQVVUSF9TQ0hFTUVfQ0FTRSk7CisKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhdXRoU2NoZW1lOworICAgICAgICAgICAgaWYgKCJ1cHBlcmNhc2UiLmVxdWFscyhhdXRoU2NoZW1lQ2FzZSkpIHsKKyAgICAgICAgICAgICAgICBhdXRoU2NoZW1lID0gIkJBU0lDIjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoImxvd2VyY2FzZSIuZXF1YWxzKGF1dGhTY2hlbWVDYXNlKSkgeworICAgICAgICAgICAgICAgIGF1dGhTY2hlbWUgPSAiYmFzaWMiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdXRoU2NoZW1lID0gIkJhc2ljIjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmVxdWVzdC5hYm9ydFdpdGgoUmVzcG9uc2Uuc3RhdHVzKDQwMSkuaGVhZGVyKEh0dHBIZWFkZXJzLldXV19BVVRIRU5USUNBVEUsIGF1dGhTY2hlbWUpLmJ1aWxkKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoTXlSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVyKExvZ2dpbmdGZWF0dXJlLmNsYXNzKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucmVnaXN0ZXIobmV3IEJhc2ljRmlsdGVyKCkpOworICAgICAgICByZXNvdXJjZUNvbmZpZy5yZWdpc3RlcihuZXcgRGlnZXN0RmlsdGVyKCkpOworICAgICAgICByZXNvdXJjZUNvbmZpZy5yZWdpc3RlcihuZXcgQWx0ZXJuYXRpbmdEaWdlc3RCYXNpY0ZpbHRlcigpKTsKKyAgICAgICAgcmV0dXJuIHJlc291cmNlQ29uZmlnOworICAgIH0KKworICAgIEBQYXRoKCJyZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVJlc291cmNlIHsKKworICAgICAgICBAQ29udGV4dAorICAgICAgICBTZWN1cml0eUNvbnRleHQgc2VjdXJpdHlDb250ZXh0OworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyB1bnNlY3VyZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAidW5zZWN1cmUiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiYmFzaWMiKQorICAgICAgICBAQmFzaWMKKyAgICAgICAgcHVibGljIFN0cmluZyBiYXNpYygpIHsKKyAgICAgICAgICAgIHJldHVybiBzZWN1cml0eUNvbnRleHQuZ2V0QXV0aGVudGljYXRpb25TY2hlbWUoKSArICI6IiArIHNlY3VyaXR5Q29udGV4dC5nZXRVc2VyUHJpbmNpcGFsKCkuZ2V0TmFtZSgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiZGlnZXN0IikKKyAgICAgICAgQERpZ2VzdAorICAgICAgICBwdWJsaWMgU3RyaW5nIGRpZ2VzdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBzZWN1cml0eUNvbnRleHQuZ2V0QXV0aGVudGljYXRpb25TY2hlbWUoKSArICI6IiArIHNlY3VyaXR5Q29udGV4dC5nZXRVc2VyUHJpbmNpcGFsKCkuZ2V0TmFtZSgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiYWx0ZXJuYXRpbmciKQorICAgICAgICBAQWx0ZXJuYXRpbmcKKyAgICAgICAgcHVibGljIFN0cmluZyBhbHRlcm5hdGluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBzZWN1cml0eUNvbnRleHQuZ2V0QXV0aGVudGljYXRpb25TY2hlbWUoKSArICI6IiArIHNlY3VyaXR5Q29udGV4dC5nZXRVc2VyUHJpbmNpcGFsKCkuZ2V0TmFtZSgpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCYXNpY1ByZWVtcHRpdmUoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKS5wYXRoKCJiYXNpYyIpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUuYmFzaWNCdWlsZGVyKCkuY3JlZGVudGlhbHMoImhvbWVyIiwgIkhvbWVyIikuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpLmdldCgpOworICAgICAgICBjaGVjayhyZXNwb25zZSwgMjAwLCAiQkFTSUM6aG9tZXIiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCYXNpY05vblByZWVtcHRpdmUoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKS5wYXRoKCJiYXNpYyIpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUuYmFzaWNCdWlsZGVyKCkubm9uUHJlZW1wdGl2ZSgpLmNyZWRlbnRpYWxzKCJob21lciIsICJIb21lciIpLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgY2hlY2socmVzcG9uc2UsIDIwMCwgIkJBU0lDOmhvbWVyIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFzaWNOb25QcmVlbXB0aXZlV2l0aEVtcHR5UGFzc3dvcmQoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZSIpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUuYmFzaWNCdWlsZGVyKCkubm9uUHJlZW1wdGl2ZSgpLmJ1aWxkKCkpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGNoZWNrKHJlc3BvbnNlLCAyMDAsICJ1bnNlY3VyZSIpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIikucGF0aCgiYmFzaWMiKQorICAgICAgICAgICAgICAgICAgICAucmVnaXN0ZXIoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5iYXNpY0J1aWxkZXIoKS5ub25QcmVlbXB0aXZlKCkuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgICAgIEFzc2VydC5mYWlsKCJzaG91bGQgdGhyb3cgYW4gZXhjZXB0aW9uIGFzIGNyZWRlbnRpYWxzIGFyZSBtaXNzaW5nIik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBvaworICAgICAgICB9CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQucGF0aCgiYmFzaWMiKS5yZXF1ZXN0KCkucHJvcGVydHkoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5IVFRQX0FVVEhFTlRJQ0FUSU9OX0JBU0lDX1VTRVJOQU1FLCAiYmFydCIpCisgICAgICAgICAgICAgICAgLnByb3BlcnR5KEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUuSFRUUF9BVVRIRU5USUNBVElPTl9CQVNJQ19QQVNTV09SRCwgIkJhcnQiKQorICAgICAgICAgICAgICAgIC5nZXQoKTsKKworICAgICAgICBjaGVjayhyZXNwb25zZSwgMjAwLCAiQkFTSUM6YmFydCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVuaXZlcnNhbEJhc2ljKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIikucGF0aCgiYmFzaWMiKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLnVuaXZlcnNhbEJ1aWxkZXIoKS5jcmVkZW50aWFscygiaG9tZXIiLCAiSG9tZXIiKS5idWlsZCgpKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGNoZWNrKHJlc3BvbnNlLCAyMDAsICJCQVNJQzpob21lciIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJvZHVjZXIgZm9yIEpFUlNFWS0yOTQxOiBCYXNpY0F1dGhlbnRpY2F0b3IjZmlsdGVyUmVzcG9uc2VBbmRBdXRoZW50aWNhdGU6IGF1dGgtc2NoZW1lIGNoZWNrcyBzaG91bGQgYmUgY2FzZQorICAgICAqIGluc2Vuc2l0dmUuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5pdmVyc2FsQmFzaWNDYXNlU2Vuc2l0aXZpdHkoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKS5wYXRoKCJiYXNpYyIpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUudW5pdmVyc2FsQnVpbGRlcigpLmNyZWRlbnRpYWxzKCJob21lciIsICJIb21lciIpLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC8vIG5vIEFVVEhfU0NIRU1FX0NBU0UgaGVhZGVyID0gbWl4ZWQgY2FzZQorICAgICAgICAgICAgICAgIC5nZXQoKTsKKyAgICAgICAgY2hlY2socmVzcG9uc2UsIDIwMCwgIkJBU0lDOmhvbWVyIik7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZSIpLnBhdGgoImJhc2ljIikKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS51bml2ZXJzYWxCdWlsZGVyKCkuY3JlZGVudGlhbHMoImhvbWVyIiwgIkhvbWVyIikuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLmhlYWRlcihCYXNpY0ZpbHRlci5BVVRIX1NDSEVNRV9DQVNFLCAibG93ZXJjYXNlIikKKyAgICAgICAgICAgICAgICAuZ2V0KCk7CisgICAgICAgIGNoZWNrKHJlc3BvbnNlLCAyMDAsICJCQVNJQzpob21lciIpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKS5wYXRoKCJiYXNpYyIpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUudW5pdmVyc2FsQnVpbGRlcigpLmNyZWRlbnRpYWxzKCJob21lciIsICJIb21lciIpLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5oZWFkZXIoQmFzaWNGaWx0ZXIuQVVUSF9TQ0hFTUVfQ0FTRSwgInVwcGVyY2FzZSIpCisgICAgICAgICAgICAgICAgLmdldCgpOworICAgICAgICBjaGVjayhyZXNwb25zZSwgMjAwLCAiQkFTSUM6aG9tZXIiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVbml2ZXJzYWxCYXNpY1dyb25nUGFzc3dvcmQoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKS5wYXRoKCJiYXNpYyIpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUudW5pdmVyc2FsQnVpbGRlcigpLmNyZWRlbnRpYWxzKCJob21lciIsICJGT08iKS5idWlsZCgpKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGNoZWNrKHJlc3BvbnNlLCA0MDEpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJhc2ljV2l0aERpZmZlcmVudENyZWRlbnRpYWxzKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKS5wYXRoKCJiYXNpYyIpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUuYmFzaWNCdWlsZGVyKCkuY3JlZGVudGlhbHMoIm1hcmdlIiwgIk1hcmdlIikuYnVpbGQoKSk7CisKKyAgICAgICAgX3Rlc3RCYXNpY1dpdGhEaWZmZXJlbnRDcmVkZW50aWFscyh0YXJnZXQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJhc2ljVW5pdmVyc2FsV2l0aERpZmZlcmVudENyZWRlbnRpYWxzKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKS5wYXRoKCJiYXNpYyIpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUudW5pdmVyc2FsQnVpbGRlcigpLmNyZWRlbnRpYWxzKCJtYXJnZSIsICJNYXJnZSIpLmJ1aWxkKCkpOworCisgICAgICAgIF90ZXN0QmFzaWNXaXRoRGlmZmVyZW50Q3JlZGVudGlhbHModGFyZ2V0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBfdGVzdEJhc2ljV2l0aERpZmZlcmVudENyZWRlbnRpYWxzKFdlYlRhcmdldCB0YXJnZXQpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpLmdldCgpOworICAgICAgICBjaGVjayhyZXNwb25zZSwgMjAwLCAiQkFTSUM6bWFyZ2UiKTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkucHJvcGVydHkoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5IVFRQX0FVVEhFTlRJQ0FUSU9OX1VTRVJOQU1FLCAiYmFydCIpCisgICAgICAgICAgICAgICAgLnByb3BlcnR5KEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUuSFRUUF9BVVRIRU5USUNBVElPTl9QQVNTV09SRCwgIkJhcnQiKQorICAgICAgICAgICAgICAgIC5nZXQoKTsKKworICAgICAgICBjaGVjayhyZXNwb25zZSwgMjAwLCAiQkFTSUM6YmFydCIpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5wcm9wZXJ0eShIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLkhUVFBfQVVUSEVOVElDQVRJT05fQkFTSUNfVVNFUk5BTUUsICJiYXJ0IikKKyAgICAgICAgICAgICAgICAucHJvcGVydHkoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5IVFRQX0FVVEhFTlRJQ0FUSU9OX0JBU0lDX1BBU1NXT1JELCAiQmFydCIpCisgICAgICAgICAgICAgICAgLmdldCgpOworCisgICAgICAgIGNoZWNrKHJlc3BvbnNlLCAyMDAsICJCQVNJQzpiYXJ0Iik7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLnByb3BlcnR5KEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUuSFRUUF9BVVRIRU5USUNBVElPTl9ESUdFU1RfVVNFUk5BTUUsICJiYXJ0IikKKyAgICAgICAgICAgICAgICAucHJvcGVydHkoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5IVFRQX0FVVEhFTlRJQ0FUSU9OX0RJR0VTVF9QQVNTV09SRCwgIkJhcnQiKQorICAgICAgICAgICAgICAgIC5nZXQoKTsKKworICAgICAgICBjaGVjayhyZXNwb25zZSwgMjAwLCAiQkFTSUM6bWFyZ2UiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REaWdlc3QoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKS5wYXRoKCJkaWdlc3QiKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLmRpZ2VzdCgiaG9tZXIiLCAiSG9tZXIiKSkKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpLmdldCgpOworICAgICAgICBjaGVjayhyZXNwb25zZSwgMjAwLCAiRElHRVNUOmhvbWVyIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlnZXN0V2l0aFBhc3N3b3JkcygpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIikucGF0aCgiZGlnZXN0IikKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5kaWdlc3QoImhvbWVyIiwgIkhvbWVyIikpOworICAgICAgICBfdGVzdERpZ2VzdFdpdGhQYXNzd29yZHModGFyZ2V0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVbml2ZXJzYWxEaWdlc3RXaXRoUGFzc3dvcmRzKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKS5wYXRoKCJkaWdlc3QiKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLnVuaXZlcnNhbEJ1aWxkZXIoKS5jcmVkZW50aWFscygiaG9tZXIiLCAiSG9tZXIiKS5idWlsZCgpKTsKKyAgICAgICAgX3Rlc3REaWdlc3RXaXRoUGFzc3dvcmRzKHRhcmdldCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgX3Rlc3REaWdlc3RXaXRoUGFzc3dvcmRzKFdlYlRhcmdldCB0YXJnZXQpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLmdldCgpOworICAgICAgICBjaGVjayhyZXNwb25zZSwgMjAwLCAiRElHRVNUOmhvbWVyIik7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLnByb3BlcnR5KEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUuSFRUUF9BVVRIRU5USUNBVElPTl9ESUdFU1RfVVNFUk5BTUUsICJiYXJ0IikKKyAgICAgICAgICAgICAgICAucHJvcGVydHkoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5IVFRQX0FVVEhFTlRJQ0FUSU9OX0RJR0VTVF9QQVNTV09SRCwgIkJhcnQiKQorICAgICAgICAgICAgICAgIC5nZXQoKTsKKyAgICAgICAgY2hlY2socmVzcG9uc2UsIDIwMCwgIkRJR0VTVDpiYXJ0Iik7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLnByb3BlcnR5KEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUuSFRUUF9BVVRIRU5USUNBVElPTl9CQVNJQ19VU0VSTkFNRSwgImJhcnQiKQorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLkhUVFBfQVVUSEVOVElDQVRJT05fQkFTSUNfUEFTU1dPUkQsICJCYXJ0IikKKyAgICAgICAgICAgICAgICAuZ2V0KCk7CisgICAgICAgIGNoZWNrKHJlc3BvbnNlLCAyMDAsICJESUdFU1Q6aG9tZXIiKTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkucHJvcGVydHkoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5IVFRQX0FVVEhFTlRJQ0FUSU9OX1VTRVJOQU1FLCAiYmFydCIpCisgICAgICAgICAgICAgICAgLnByb3BlcnR5KEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUuSFRUUF9BVVRIRU5USUNBVElPTl9QQVNTV09SRCwgIkJhcnQiKQorICAgICAgICAgICAgICAgIC5nZXQoKTsKKyAgICAgICAgY2hlY2socmVzcG9uc2UsIDIwMCwgIkRJR0VTVDpiYXJ0Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGlnZXN0V2l0aEVtcHR5RGVmYXVsdFBhc3N3b3JkKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLmRpZ2VzdCgpKTsKKyAgICAgICAgX3Rlc3REaWdlc3RXaXRoRW1wdHlEZWZhdWx0UGFzc3dvcmQodGFyZ2V0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REaWdlc3RVbml2ZXJzYWxXaXRoRW1wdHlEZWZhdWx0UGFzc3dvcmQoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZSIpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUudW5pdmVyc2FsQnVpbGRlcigpLmJ1aWxkKCkpOworICAgICAgICBfdGVzdERpZ2VzdFdpdGhFbXB0eURlZmF1bHRQYXNzd29yZCh0YXJnZXQpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIF90ZXN0RGlnZXN0V2l0aEVtcHR5RGVmYXVsdFBhc3N3b3JkKFdlYlRhcmdldCB0YXJnZXQpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLmdldCgpOworICAgICAgICBjaGVjayhyZXNwb25zZSwgMjAwLCAidW5zZWN1cmUiKTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkucHJvcGVydHkoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5IVFRQX0FVVEhFTlRJQ0FUSU9OX0RJR0VTVF9VU0VSTkFNRSwgImJhcnQiKQorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLkhUVFBfQVVUSEVOVElDQVRJT05fRElHRVNUX1BBU1NXT1JELCAiQmFydCIpCisgICAgICAgICAgICAgICAgLmdldCgpOworICAgICAgICBjaGVjayhyZXNwb25zZSwgMjAwLCAidW5zZWN1cmUiKTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldC5wYXRoKCJkaWdlc3QiKS5yZXF1ZXN0KCkucHJvcGVydHkoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5IVFRQX0FVVEhFTlRJQ0FUSU9OX0RJR0VTVF9VU0VSTkFNRSwgImJhcnQiKQorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLkhUVFBfQVVUSEVOVElDQVRJT05fRElHRVNUX1BBU1NXT1JELCAiQmFydCIpCisgICAgICAgICAgICAgICAgLmdldCgpOworICAgICAgICBjaGVjayhyZXNwb25zZSwgMjAwLCAiRElHRVNUOmJhcnQiKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGFyZ2V0LnBhdGgoImRpZ2VzdCIpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgICAgICAucHJvcGVydHkoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5IVFRQX0FVVEhFTlRJQ0FUSU9OX0JBU0lDX1VTRVJOQU1FLCAiYmFydCIpCisgICAgICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLkhUVFBfQVVUSEVOVElDQVRJT05fQkFTSUNfUEFTU1dPUkQsICJCYXJ0IikKKyAgICAgICAgICAgICAgICAgICAgLmdldCgpOworICAgICAgICAgICAgQXNzZXJ0LmZhaWwoInNob3VsZCB0aHJvdyBhbiBleGNlcHRpb24gYXMgbm8gY3JlZGVudGlhbHMgd2VyZSBzdXBwbGllZCBmb3IgZGlnZXN0IGF1dGgiKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIG9rCisgICAgICAgIH0KKworICAgICAgICByZXNwb25zZSA9IHRhcmdldC5wYXRoKCJkaWdlc3QiKS5yZXF1ZXN0KCkucHJvcGVydHkoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5IVFRQX0FVVEhFTlRJQ0FUSU9OX1VTRVJOQU1FLCAiYmFydCIpCisgICAgICAgICAgICAgICAgLnByb3BlcnR5KEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUuSFRUUF9BVVRIRU5USUNBVElPTl9QQVNTV09SRCwgIkJhcnQiKQorICAgICAgICAgICAgICAgIC5nZXQoKTsKKyAgICAgICAgY2hlY2socmVzcG9uc2UsIDIwMCwgIkRJR0VTVDpiYXJ0Iik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrKFJlc3BvbnNlIHJlc3BvbnNlLCBpbnQgc3RhdHVzLCBTdHJpbmcgZW50aXR5KSB7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoc3RhdHVzLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZW50aXR5LCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVjayhSZXNwb25zZSByZXNwb25zZSwgaW50IHN0YXR1cykgeworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHN0YXR1cywgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERpZ2VzdFVuaXZlcnNhbFNpbXBsZSgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZSIpLnBhdGgoImRpZ2VzdCIpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUudW5pdmVyc2FsQnVpbGRlcigpLmNyZWRlbnRpYWxzKCJob21lciIsICJIb21lciIpLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgY2hlY2socmVzcG9uc2UsIDIwMCwgIkRJR0VTVDpob21lciIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERpZ2VzdFVuaXZlcnNhbFNpbXBsZTIoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKS5wYXRoKCJkaWdlc3QiKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLnVuaXZlcnNhbEJ1aWxkZXIoKS5jcmVkZW50aWFsc0ZvckRpZ2VzdCgiaG9tZXIiLCAiSG9tZXIiKS5idWlsZCgpKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGNoZWNrKHJlc3BvbnNlLCAyMDAsICJESUdFU1Q6aG9tZXIiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REaWdlc3RVbml2ZXJzYWxTaW1wbGUzKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIikucGF0aCgiZGlnZXN0IikKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS51bml2ZXJzYWxCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVkZW50aWFsc0ZvckRpZ2VzdCgiaG9tZXIiLCAiSG9tZXIiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmNyZWRlbnRpYWxzRm9yQmFzaWMoImZvbyIsICJiYXIiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgY2hlY2socmVzcG9uc2UsIDIwMCwgIkRJR0VTVDpob21lciIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERpZ2VzdFVuaXZlcnNhbFNpbXBsZTQoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKS5wYXRoKCJkaWdlc3QiKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLnVuaXZlcnNhbCgiaG9tZXIiLCAiSG9tZXIiKSkKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpLmdldCgpOworICAgICAgICBjaGVjayhyZXNwb25zZSwgMjAwLCAiRElHRVNUOmhvbWVyIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5pdmVyc2FsKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLnVuaXZlcnNhbCgiaG9tZXIiLCAiSG9tZXIiKSk7CisKKyAgICAgICAgY2hlY2sodGFyZ2V0LnJlcXVlc3QoKS5nZXQoKSwgMjAwLCAidW5zZWN1cmUiKTsKKyAgICAgICAgY2hlY2sodGFyZ2V0LnBhdGgoImRpZ2VzdCIpLnJlcXVlc3QoKS5nZXQoKSwgMjAwLCAiRElHRVNUOmhvbWVyIik7CisgICAgICAgIGNoZWNrKHRhcmdldC5wYXRoKCJiYXNpYyIpLnJlcXVlc3QoKS5nZXQoKSwgMjAwLCAiQkFTSUM6aG9tZXIiKTsKKyAgICAgICAgY2hlY2sodGFyZ2V0LnBhdGgoImJhc2ljIikucmVxdWVzdCgpLmdldCgpLCAyMDAsICJCQVNJQzpob21lciIpOworICAgICAgICBjaGVjayh0YXJnZXQucGF0aCgiZGlnZXN0IikucmVxdWVzdCgpLmdldCgpLCAyMDAsICJESUdFU1Q6aG9tZXIiKTsKKyAgICAgICAgY2hlY2sodGFyZ2V0LnBhdGgoImRpZ2VzdCIpLnJlcXVlc3QoKS5nZXQoKSwgMjAwLCAiRElHRVNUOmhvbWVyIik7CisgICAgICAgIGNoZWNrKHRhcmdldC5wYXRoKCJkaWdlc3QiKS5yZXF1ZXN0KCkuZ2V0KCksIDIwMCwgIkRJR0VTVDpob21lciIpOworICAgICAgICBjaGVjayh0YXJnZXQucGF0aCgiYmFzaWMiKS5yZXF1ZXN0KCkuZ2V0KCksIDIwMCwgIkJBU0lDOmhvbWVyIik7CisgICAgICAgIGNoZWNrKHRhcmdldC5wYXRoKCJiYXNpYyIpLnJlcXVlc3QoKS5wcm9wZXJ0eShIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLkhUVFBfQVVUSEVOVElDQVRJT05fRElHRVNUX1VTRVJOQU1FLCAiYmFydCIpCisgICAgICAgICAgICAgICAgLnByb3BlcnR5KEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUuSFRUUF9BVVRIRU5USUNBVElPTl9ESUdFU1RfUEFTU1dPUkQsICJCYXJ0IikuZ2V0KCksIDIwMCwgIkJBU0lDOmhvbWVyIik7CisKKyAgICAgICAgY2hlY2sodGFyZ2V0LnBhdGgoImRpZ2VzdCIpLnJlcXVlc3QoKS5wcm9wZXJ0eShIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLkhUVFBfQVVUSEVOVElDQVRJT05fRElHRVNUX1VTRVJOQU1FLCAiYmFydCIpCisgICAgICAgICAgICAgICAgLnByb3BlcnR5KEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUuSFRUUF9BVVRIRU5USUNBVElPTl9ESUdFU1RfUEFTU1dPUkQsICJCYXJ0IikuZ2V0KCksIDIwMCwgIkRJR0VTVDpiYXJ0Iik7CisKKyAgICAgICAgY2hlY2sodGFyZ2V0LnBhdGgoImRpZ2VzdCIpLnJlcXVlc3QoKS5wcm9wZXJ0eShIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLkhUVFBfQVVUSEVOVElDQVRJT05fVVNFUk5BTUUsICJiYXJ0IikKKyAgICAgICAgICAgICAgICAucHJvcGVydHkoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5IVFRQX0FVVEhFTlRJQ0FUSU9OX1BBU1NXT1JELCAiQmFydCIpLmdldCgpLCAyMDAsICJESUdFU1Q6YmFydCIpOworCisgICAgICAgIGNoZWNrKHRhcmdldC5wYXRoKCJhbHRlcm5hdGluZyIpLnJlcXVlc3QoKS5nZXQoKSwgMjAwLCAiQkFTSUM6aG9tZXIiKTsKKyAgICAgICAgY2hlY2sodGFyZ2V0LnBhdGgoImFsdGVybmF0aW5nIikucmVxdWVzdCgpLmdldCgpLCAyMDAsICJESUdFU1Q6aG9tZXIiKTsKKyAgICAgICAgY2hlY2sodGFyZ2V0LnBhdGgoImFsdGVybmF0aW5nIikucmVxdWVzdCgpLmdldCgpLCAyMDAsICJCQVNJQzpob21lciIpOworICAgICAgICBjaGVjayh0YXJnZXQucGF0aCgiYmFzaWMiKS5yZXF1ZXN0KCkuZ2V0KCksIDIwMCwgIkJBU0lDOmhvbWVyIik7CisgICAgICAgIGNoZWNrKHRhcmdldC5wYXRoKCJhbHRlcm5hdGluZyIpLnJlcXVlc3QoKS5wcm9wZXJ0eShIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLkhUVFBfQVVUSEVOVElDQVRJT05fVVNFUk5BTUUsICJiYXJ0IikKKyAgICAgICAgICAgICAgICAucHJvcGVydHkoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5IVFRQX0FVVEhFTlRJQ0FUSU9OX1BBU1NXT1JELCAiQmFydCIpLmdldCgpLCAyMDAsICJESUdFU1Q6YmFydCIpOworICAgICAgICBjaGVjayh0YXJnZXQucGF0aCgiYWx0ZXJuYXRpbmciKS5yZXF1ZXN0KCkucHJvcGVydHkoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5IVFRQX0FVVEhFTlRJQ0FUSU9OX1VTRVJOQU1FLCAiYmFydCIpCisgICAgICAgICAgICAgICAgLnByb3BlcnR5KEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUuSFRUUF9BVVRIRU5USUNBVElPTl9QQVNTV09SRCwgIkJhcnQiKS5nZXQoKSwgMjAwLCAiQkFTSUM6YmFydCIpOworCisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9IdHRwRGlnZXN0QXV0aEZpbHRlclRlc3QuamF2YSBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0h0dHBEaWdlc3RBdXRoRmlsdGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YWFlZTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9IdHRwRGlnZXN0QXV0aEZpbHRlclRlc3QuamF2YQpAQCAtMCwwICsxLDI3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY2xpZW50OworCitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OworaW1wb3J0IGphdmEuc2VjdXJpdHkuTWVzc2FnZURpZ2VzdDsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5Lk5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZS5SZXNwb25zZUJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LmF1dGhlbnRpY2F0aW9uLkh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnVyaS5VcmlDb21wb25lbnQ7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBTdGVmYW4gS2F0ZXJrYW1wIDxzdGVmYW4gYXQga2F0ZXJrYW1wLmRlPgorICovCitwdWJsaWMgY2xhc3MgSHR0cERpZ2VzdEF1dGhGaWx0ZXJUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElHRVNUX1RFU1RfTE9HSU4gPSAidXNlciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJR0VTVF9URVNUX1BBU1MgPSAicGFzc3dvcmQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESUdFU1RfVEVTVF9JTlZBTElEUEFTUyA9ICJub3Bhc3MiOworICAgIC8vIERpZ2VzdCBzdHJpbmcgZXhwZWN0ZWQgZm9yIE9LIGF1dGg6CisgICAgLy8gRGlnZXN0IHJlYWxtPSJ0ZXN0Iiwgbm9uY2U9ImVEZVBGTmVKQkFBPWE4NzQ4MTRlYzU1NjQ3ODYyYjY2YTc0NzYzMjYwM2U1ODI1YWNkMzkiLAorICAgIC8vICAgYWxnb3JpdGhtPU1ENSwgZG9tYWluPSIvYXV0aC1kaWdlc3QvIiwgcW9wPSJhdXRoIgorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBESUdFU1RfVEVTVF9OT05DRSA9ICJlRGVQRk5lSkJBQT1hODc0ODE0ZWM1NTY0Nzg2MmI2NmE3NDc2MzI2MDNlNTgyNWFjZDM5IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRElHRVNUX1RFU1RfUkVBTE0gPSAidGVzdCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERJR0VTVF9URVNUX0RPTUFJTiA9ICIvYXV0aC1kaWdlc3QvIjsKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgbmNFeHBlY3RlZCA9IDE7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAUGF0aCgiL2F1dGgtZGlnZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAQ29udGV4dAorICAgICAgICBwcml2YXRlIEh0dHBIZWFkZXJzIGh0dHBIZWFkZXJzOworICAgICAgICBAQ29udGV4dAorICAgICAgICBwcml2YXRlIFVyaUluZm8gdXJpSW5mbzsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXQxKCkgeworICAgICAgICAgICAgcmV0dXJuIHZlcmlmeSgpOworICAgICAgICB9CisKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCLEm8WhxI3FmcW+w73DocOtw6kiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0RW5jb2RpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gdmVyaWZ5KCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFJlc3BvbnNlIHZlcmlmeSgpIHsKKyAgICAgICAgICAgIGlmIChodHRwSGVhZGVycy5nZXRSZXF1ZXN0SGVhZGVyKEh0dHBIZWFkZXJzLkFVVEhPUklaQVRJT04pID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGUgZmlyc3QgcmVxdWVzdCBoYXMgbm8gYXV0aG9yaXphdGlvbiBoZWFkZXIsIHRlbGwgZmlsdGVyIGl0cyA0MDEKKyAgICAgICAgICAgICAgICAvLyBhbmQgc2VuZCBmaWx0ZXIgYmFjayBzZWVkIGZvciB0aGUgbmV3IHRvIGJlIGJ1aWx0IGhlYWRlcgorICAgICAgICAgICAgICAgIFJlc3BvbnNlQnVpbGRlciByZXNwb25zZUJ1aWxkZXIgPSBSZXNwb25zZS5zdGF0dXMoUmVzcG9uc2UuU3RhdHVzLlVOQVVUSE9SSVpFRCk7CisgICAgICAgICAgICAgICAgcmVzcG9uc2VCdWlsZGVyID0gcmVzcG9uc2VCdWlsZGVyLmhlYWRlcihIdHRwSGVhZGVycy5XV1dfQVVUSEVOVElDQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgIkRpZ2VzdCByZWFsbT1cIiIgKyBESUdFU1RfVEVTVF9SRUFMTSArICJcIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJub25jZT1cIiIgKyBESUdFU1RfVEVTVF9OT05DRSArICJcIiwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJhbGdvcml0aG09TUQ1LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImRvbWFpbj1cIiIgKyBESUdFU1RfVEVTVF9ET01BSU4gKyAiXCIsIHFvcD1cImF1dGhcIiIpOworICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZUJ1aWxkZXIuYnVpbGQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gdGhlIGZpbHRlciB0YWtlcyB0aGUgc2VlZCBhbmQgYWRkcyB0aGUgaGVhZGVyCisgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGF1dGhMaXN0ID0gaHR0cEhlYWRlcnMuZ2V0UmVxdWVzdEhlYWRlcihIdHRwSGVhZGVycy5BVVRIT1JJWkFUSU9OKTsKKyAgICAgICAgICAgICAgICBpZiAoYXV0aExpc3Quc2l6ZSgpICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyhSZXNwb25zZS5TdGF0dXMuSU5URVJOQUxfU0VSVkVSX0VSUk9SKS5idWlsZCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYXV0aEhlYWRlciA9IGF1dGhMaXN0LmdldCgwKTsKKworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBoYTEgPSBtZDUoRElHRVNUX1RFU1RfTE9HSU4sIERJR0VTVF9URVNUX1JFQUxNLCBESUdFU1RfVEVTVF9QQVNTKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVxdWVzdFVyaSA9IFVyaUNvbXBvbmVudC5mdWxsUmVsYXRpdmVVcmkodXJpSW5mby5nZXRSZXF1ZXN0VXJpKCkpOworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBoYTIgPSBtZDUoIkdFVCIsIHJlcXVlc3RVcmkuc3RhcnRzV2l0aCgiLyIpID8gcmVxdWVzdFVyaSA6ICIvIiArIHJlcXVlc3RVcmkpOworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZXNwb25zZSA9IG1kNSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERJR0VTVF9URVNUX05PTkNFLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGlnZXN0QXV0aEhlYWRlclZhbHVlKGF1dGhIZWFkZXIsICJuYz0iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldERpZ2VzdEF1dGhIZWFkZXJWYWx1ZShhdXRoSGVhZGVyLCAiY25vbmNlPSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGlnZXN0QXV0aEhlYWRlclZhbHVlKGF1dGhIZWFkZXIsICJxb3A9IiksCisgICAgICAgICAgICAgICAgICAgICAgICBoYTIpOworCisgICAgICAgICAgICAgICAgLy8gdGhpcyBnZW5lcmF0ZXMgSU5URVJOQUxfU0VSVkVSX0VSUk9SIGlmIG5vdCBtYXRjaGluZworICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMobmNFeHBlY3RlZCwgSW50ZWdlci5wYXJzZUludChnZXREaWdlc3RBdXRoSGVhZGVyVmFsdWUoYXV0aEhlYWRlciwgIm5jPSIpKSk7CisKKyAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuZXF1YWxzKGdldERpZ2VzdEF1dGhIZWFkZXJWYWx1ZShhdXRoSGVhZGVyLCAicmVzcG9uc2U9IikpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygpLmJ1aWxkKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyhSZXNwb25zZS5TdGF0dXMuVU5BVVRIT1JJWkVEKS5idWlsZCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENoYXJzZXQgQ0hBUkFDVEVSX1NFVCA9IENoYXJzZXQuZm9yTmFtZSgiaXNvLTg4NTktMSIpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb2xvbiBzZXBhcmF0ZWQgdmFsdWUgTUQ1IGhhc2guIENhbGwgbWQ1IG1ldGhvZCBvZiB0aGUgZmlsdGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdG9rZW5zIG9uZSBvciBtb3JlIHN0cmluZ3MKKyAgICAgICAgICogQHJldHVybiBNNSBoYXNoIHN0cmluZworICAgICAgICAgKi8KKyAgICAgICAgc3RhdGljIFN0cmluZyBtZDUoZmluYWwgU3RyaW5nLi4uIHRva2VucykgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKDEwMCk7CisgICAgICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyB0b2tlbiA6IHRva2VucykgeworICAgICAgICAgICAgICAgIGlmIChzYi5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCc6Jyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNiLmFwcGVuZCh0b2tlbik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2VEaWdlc3QgbWQ7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1kID0gTWVzc2FnZURpZ2VzdC5nZXRJbnN0YW5jZSgiTUQ1Iik7CisgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbihleC5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWQudXBkYXRlKHNiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoQ0hBUkFDVEVSX1NFVCksIDAsIHNiLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIGZpbmFsIGJ5dGVbXSBtZDVoYXNoID0gbWQuZGlnZXN0KCk7CisgICAgICAgICAgICByZXR1cm4gYnl0ZXNUb0hleChtZDVoYXNoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDb252ZXJ0IGJ5dGVzIGFycmF5IHRvIGhleCBzdHJpbmcuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBieXRlcyBhcnJheSBvZiBieXRlcworICAgICAgICAgKiBAcmV0dXJuIGhleCBzdHJpbmcKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBieXRlc1RvSGV4KGZpbmFsIGJ5dGVbXSBieXRlcykgeworICAgICAgICAgICAgZmluYWwgY2hhcltdIGhleENoYXJzID0gbmV3IGNoYXJbYnl0ZXMubGVuZ3RoICogMl07CisgICAgICAgICAgICBpbnQgdjsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgYnl0ZXMubGVuZ3RoOyBqKyspIHsKKyAgICAgICAgICAgICAgICB2ID0gYnl0ZXNbal0gJiAweEZGOworICAgICAgICAgICAgICAgIGhleENoYXJzW2ogKiAyXSA9IEhFWF9BUlJBWVt2ID4+PiA0XTsKKyAgICAgICAgICAgICAgICBoZXhDaGFyc1tqICogMiArIDFdID0gSEVYX0FSUkFZW3YgJiAweDBGXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGhleENoYXJzKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBIRVhfQVJSQVkgPSB7JzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsICc4JywgJzknLCAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnfTsKKworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgYSB2YWx1ZSBvZiB0aGUgRGlnZXN0IEF1dGggSGVhZGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYXV0aEhlYWRlciBkaWdlc3QgYXV0aCBoZWFkZXIgc3RyaW5nCisgICAgICAgICAqIEBwYXJhbSBrZXlOYW1lIGtleSBvZiB0aGUgdmFsdWUgdG8gcmV0cmlldmUKKyAgICAgICAgICogQHJldHVybiB2YWx1ZSBzdHJpbmcKKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBTdHJpbmcgZ2V0RGlnZXN0QXV0aEhlYWRlclZhbHVlKGZpbmFsIFN0cmluZyBhdXRoSGVhZGVyLCBmaW5hbCBTdHJpbmcga2V5TmFtZSkgeworICAgICAgICAgICAgZmluYWwgaW50IGkxID0gYXV0aEhlYWRlci5pbmRleE9mKGtleU5hbWUpOworCisgICAgICAgICAgICBpZiAoaTEgPT0gLTEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gYXV0aEhlYWRlci5zdWJzdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIGF1dGhIZWFkZXIuaW5kZXhPZignPScsIGkxKSArIDEsCisgICAgICAgICAgICAgICAgICAgIChhdXRoSGVhZGVyLmluZGV4T2YoJywnLCBpMSkgIT0gLTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGF1dGhIZWFkZXIuaW5kZXhPZignLCcsIGkxKSA6IGF1dGhIZWFkZXIubGVuZ3RoKCkpKTsKKworICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS50cmltKCk7CisgICAgICAgICAgICBpZiAodmFsdWUuY2hhckF0KDApID09ICciJyAmJiB2YWx1ZS5jaGFyQXQodmFsdWUubGVuZ3RoKCkgLSAxKSA9PSAnIicpIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygxLCB2YWx1ZS5sZW5ndGgoKSAtIDEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIdHRwRGlnZXN0QXV0aEZpbHRlcigpIHsKKyAgICAgICAgdGVzdFJlcXVlc3QoImF1dGgtZGlnZXN0Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SHR0cERpZ2VzdEF1dGhGaWx0ZXJXaXRoRW5jb2RlZFVyaSgpIHsKKyAgICAgICAgdGVzdFJlcXVlc3QoImF1dGgtZGlnZXN0L8SbxaHEjcWZxb7DvcOhw63DqSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEh0dHBEaWdlc3RBdXRoRmlsdGVyV2l0aFBhcmFtcygpIHsKKyAgICAgICAgdGVzdFJlcXVlc3QoImF1dGgtZGlnZXN0IiwgdHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SHR0cERpZ2VzdEF1dGhGaWx0ZXJXaXRoRW5jb2RlZFVyaUFuZFBhcmFtcygpIHsKKyAgICAgICAgdGVzdFJlcXVlc3QoImF1dGgtZGlnZXN0L8SbxaHEjcWZxb7DvcOhw63DqSIsIHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0UmVxdWVzdChmaW5hbCBTdHJpbmcgcGF0aCkgeworICAgICAgICB0ZXN0UmVxdWVzdChwYXRoLCBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RSZXF1ZXN0KGZpbmFsIFN0cmluZyBwYXRoLCBmaW5hbCBib29sZWFuIGFkZFBhcmFtcykgeworICAgICAgICBXZWJUYXJnZXQgcmVzb3VyY2UgPSB0YXJnZXQoKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLmRpZ2VzdChESUdFU1RfVEVTVF9MT0dJTiwgRElHRVNUX1RFU1RfUEFTUykpCisgICAgICAgICAgICAgICAgLnBhdGgocGF0aCk7CisKKyAgICAgICAgaWYgKGFkZFBhcmFtcykgeworICAgICAgICAgICAgcmVzb3VyY2UgPSByZXNvdXJjZS5tYXRyaXhQYXJhbSgiYmFyIiwgImZvbyIpLnF1ZXJ5UGFyYW0oImZvbyIsICJiYXIiKTsKKyAgICAgICAgfQorCisgICAgICAgIG5jRXhwZWN0ZWQgPSAxOworICAgICAgICBmaW5hbCBSZXNwb25zZSByMSA9IHJlc291cmNlLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhSZXNwb25zZS5TdGF0dXMuZnJvbVN0YXR1c0NvZGUocjEuZ2V0U3RhdHVzKCkpLCBSZXNwb25zZS5TdGF0dXMuT0spOworICAgIH0KKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlZW1wdGl2ZSgpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHJlc291cmNlID0gdGFyZ2V0KCkKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5kaWdlc3QoRElHRVNUX1RFU1RfTE9HSU4sIERJR0VTVF9URVNUX1BBU1MpKQorICAgICAgICAgICAgICAgIC5wYXRoKCJhdXRoLWRpZ2VzdCIpOworCisgICAgICAgIG5jRXhwZWN0ZWQgPSAxOworICAgICAgICBmaW5hbCBSZXNwb25zZSByMSA9IHJlc291cmNlLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhSZXNwb25zZS5TdGF0dXMuZnJvbVN0YXR1c0NvZGUocjEuZ2V0U3RhdHVzKCkpLCBSZXNwb25zZS5TdGF0dXMuT0spOworCisgICAgICAgIG5jRXhwZWN0ZWQgPSAyOworICAgICAgICBmaW5hbCBSZXNwb25zZSByMiA9IHJlc291cmNlLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhSZXNwb25zZS5TdGF0dXMuZnJvbVN0YXR1c0NvZGUocjIuZ2V0U3RhdHVzKCkpLCBSZXNwb25zZS5TdGF0dXMuT0spOworCisgICAgICAgIG5jRXhwZWN0ZWQgPSAzOworICAgICAgICBmaW5hbCBSZXNwb25zZSByMyA9IHJlc291cmNlLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhSZXNwb25zZS5TdGF0dXMuZnJvbVN0YXR1c0NvZGUocjMuZ2V0U3RhdHVzKCkpLCBSZXNwb25zZS5TdGF0dXMuT0spOworCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0aGVudGljYXRpb24oKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCByZXNvdXJjZSA9IHRhcmdldCgpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUuZGlnZXN0KERJR0VTVF9URVNUX0xPR0lOLCBESUdFU1RfVEVTVF9JTlZBTElEUEFTUykpCisgICAgICAgICAgICAgICAgLnBhdGgoImF1dGgtZGlnZXN0Iik7CisKKyAgICAgICAgbmNFeHBlY3RlZCA9IDE7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHIxID0gcmVzb3VyY2UucmVxdWVzdCgpLmdldCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFJlc3BvbnNlLlN0YXR1cy5mcm9tU3RhdHVzQ29kZShyMS5nZXRTdGF0dXMoKSksIFJlc3BvbnNlLlN0YXR1cy5VTkFVVEhPUklaRUQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0h0dHBNZXRob2RFbnRpdHlUZXN0LmphdmEgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9IdHRwTWV0aG9kRW50aXR5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NmZkNTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9IdHRwTWV0aG9kRW50aXR5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTk1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jbGllbnQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5ERUxFVEU7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLkhFQUQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QVVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCisvKioKKyAqIFRlc3RzIEhUVFAgbWV0aG9kcyBhbmQgZW50aXR5IHByZXNlbmNlLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBIdHRwTWV0aG9kRW50aXR5VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgeworICAgICAgICBfdGVzdCgiR0VUIiwgdHJ1ZSwgdHJ1ZSk7CisgICAgICAgIF90ZXN0KCJHRVQiLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc3QoKSB7CisgICAgICAgIF90ZXN0KCJQT1NUIiwgdHJ1ZSwgZmFsc2UpOworICAgICAgICBfdGVzdCgiUE9TVCIsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0KCkgeworICAgICAgICBfdGVzdCgiUFVUIiwgdHJ1ZSwgZmFsc2UpOworICAgICAgICBfdGVzdCgiUFVUIiwgZmFsc2UsIHRydWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlbGV0ZSgpIHsKKyAgICAgICAgX3Rlc3QoIkRFTEVURSIsIHRydWUsIHRydWUpOworICAgICAgICBfdGVzdCgiREVMRVRFIiwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIZWFkKCkgeworICAgICAgICBfdGVzdCgiSEVBRCIsIHRydWUsIHRydWUpOworICAgICAgICBfdGVzdCgiSEVBRCIsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3B0aW9ucygpIHsKKyAgICAgICAgX3Rlc3QoIk9QVElPTlMiLCB0cnVlLCB0cnVlKTsKKyAgICAgICAgX3Rlc3QoIk9QVElPTlMiLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJvZHVjZXIgZm9yIEpFUlNFWS0yMzcwOiBTZW5kaW5nIFBPU1Qgd2l0aG91dCBib2R5LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5UG9zdFdpdGhvdXRDb250ZW50VHlwZSgpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHJlc291cmNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIEZ1dHVyZTxSZXNwb25zZT4gZnV0dXJlID0gcmVzb3VyY2UucmVxdWVzdCgpLmFzeW5jKCkucG9zdChudWxsKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyMDAsIGZ1dHVyZS5nZXQoKS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gcmVzb3VyY2UucmVxdWVzdCgpLnBvc3QobnVsbCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJTZW5kaW5nIFBPU1QgbWV0aG9kIHdpdGhvdXQgZW50aXR5IHNob3VsZCBub3QgZmFpbC4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJvZHVjZXIgZm9yIEpFUlNFWS0yMzcwOiBTZW5kaW5nIFBPU1Qgd2l0aG91dCBib2R5LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5UG9zdFdpdGhDb250ZW50VHlwZSgpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHJlc291cmNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIEZ1dHVyZTxSZXNwb25zZT4gZnV0dXJlID0gcmVzb3VyY2UucmVxdWVzdCgpLmFzeW5jKCkucG9zdChFbnRpdHkuZW50aXR5KG51bGwsICJ0ZXh0L3BsYWluIikpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgZnV0dXJlLmdldCgpLmdldFN0YXR1cygpKTsKKworICAgICAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSByZXNvdXJjZS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG51bGwsICJ0ZXh0L3BsYWluIikpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZmFpbCgiU2VuZGluZyBQT1NUIG1ldGhvZCB3aXRob3V0IGVudGl0eSBzaG91bGQgbm90IGZhaWwuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBfdGVzdChTdHJpbmcgbWV0aG9kLCBib29sZWFuIGVudGl0eVByZXNlbnQsIGJvb2xlYW4gc2hvdWxkRmFpbCkgeworICAgICAgICBFbnRpdHkgZW50aXR5ID0gZW50aXR5UHJlc2VudCA/IEVudGl0eS5lbnRpdHkoImVudGl0eSIsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpIDogbnVsbDsKKyAgICAgICAgX3Rlc3RTeW5jKG1ldGhvZCwgZW50aXR5LCBzaG91bGRGYWlsKTsKKyAgICAgICAgX3Rlc3RBc3luYyhtZXRob2QsIGVudGl0eSwgc2hvdWxkRmFpbCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgX3Rlc3RBc3luYyhTdHJpbmcgbWV0aG9kLCBFbnRpdHkgZW50aXR5LCBib29sZWFuIHNob3VsZEZhaWwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIEZ1dHVyZTxSZXNwb25zZT4gZnV0dXJlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKS5yZXF1ZXN0KCkuYXN5bmMoKS5tZXRob2QobWV0aG9kLCBlbnRpdHkpOworICAgICAgICAgICAgaWYgKHNob3VsZEZhaWwpIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJUaGUgbWV0aG9kIHNob3VsZCBmYWlsLiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgZnV0dXJlLmdldCgpLmdldFN0YXR1cygpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmICghc2hvdWxkRmFpbCkgeworICAgICAgICAgICAgICAgIGZhaWwoIlRoZSBtZXRob2QgIiArIG1ldGhvZCArICIgd2l0aCBlbnRpdHk9IiArIChlbnRpdHkgIT0gbnVsbCkgKyAiIHNob3VsZCBub3QgZmFpbC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIF90ZXN0U3luYyhTdHJpbmcgbWV0aG9kLCBFbnRpdHkgZW50aXR5LCBib29sZWFuIHNob3VsZEZhaWwpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKS5yZXF1ZXN0KCkubWV0aG9kKG1ldGhvZCwgZW50aXR5KTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgICAgIGlmIChzaG91bGRGYWlsKSB7CisgICAgICAgICAgICAgICAgZmFpbCgiVGhlIG1ldGhvZCBzaG91bGQgZmFpbC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmICghc2hvdWxkRmFpbCkgeworICAgICAgICAgICAgICAgIGZhaWwoIlRoZSBtZXRob2QgIiArIG1ldGhvZCArICIgd2l0aCBlbnRpdHlQcmVzZW50PSIgKyAoZW50aXR5ICE9IG51bGwpICsgIiBzaG91bGQgbm90IGZhaWwuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBDb250ZXh0CisgICAgICAgIEh0dHBIZWFkZXJzIGh0dHBIZWFkZXJzOworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gImdldCI7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3QoU3RyaW5nIHN0cikgeworICAgICAgICAgICAgLy8gU2VlIEpFUlNFWS0xNDU1CisgICAgICAgICAgICBhc3NlcnRGYWxzZShodHRwSGVhZGVycy5nZXRSZXF1ZXN0SGVhZGVycygpLmNvbnRhaW5zS2V5KEh0dHBIZWFkZXJzLkNPTlRFTlRfRU5DT0RJTkcpKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGh0dHBIZWFkZXJzLmdldFJlcXVlc3RIZWFkZXJzKCkuY29udGFpbnNLZXkoSHR0cEhlYWRlcnMuQ09OVEVOVF9MQU5HVUFHRSkpOworCisgICAgICAgICAgICByZXR1cm4gInBvc3QiOworICAgICAgICB9CisKKyAgICAgICAgQFBVVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHB1dChTdHJpbmcgc3RyKSB7CisgICAgICAgICAgICByZXR1cm4gInB1dCI7CisgICAgICAgIH0KKworICAgICAgICBASEVBRAorICAgICAgICBwdWJsaWMgU3RyaW5nIGhlYWQoKSB7CisgICAgICAgICAgICByZXR1cm4gImhlYWQiOworICAgICAgICB9CisKKyAgICAgICAgQERFTEVURQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRlbGV0ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAiZGVsZXRlIjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0luamVjdGVkQ2xpZW50Qm9keVdvcmtlci5qYXZhIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvSW5qZWN0ZWRDbGllbnRCb2R5V29ya2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdlNTQ0YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0luamVjdGVkQ2xpZW50Qm9keVdvcmtlci5qYXZhCkBAIC0wLDAgKzEsMjUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jbGllbnQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LkNvbnRleHRSZXNvbHZlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXJzOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuY29udGFpbnNTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogVGVzdCBpZiBKQVgtUlMgaW5qZWN0aW9uIHBvaW50cyB3b3JrIGluIGNsaWVudCBzaWRlIHByb3ZpZGVycy4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSW5qZWN0ZWRDbGllbnRCb2R5V29ya2VyIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICAvLyBtZWRpYSB0eXBlcyBhcmUgdXNlZCB0byBkZXRlcm1pbmUgd2hhdCBraW5kIG9mIGluamVjdGlvbiBzaG91bGQgYmUgdGVzdGVkCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBQcm92aWRlclR5cGUgPSAidGVzdC9wcm92aWRlcnMiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ29uZmlndXJhdGlvblRZUEUgPSAidGVzdC9jb25maWd1cmF0aW9uIjsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlDb250ZXh0IHt9CisKKyAgICBAUHJvdmlkZXIKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15Q29udGV4dFJlc29sdmVyIGltcGxlbWVudHMgQ29udGV4dFJlc29sdmVyPE15Q29udGV4dD4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTXlDb250ZXh0IGdldENvbnRleHQoQ2xhc3M8Pz4gdHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBAUHJvZHVjZXMoUHJvdmlkZXJUeXBlKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHJvdmlkZXJzSW5qZWN0ZWRXcml0ZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVdyaXRlcjxTdHJpbmc+IHsKKworICAgICAgICBAQ29udGV4dAorICAgICAgICBQcm92aWRlcnMgcHJvdmlkZXJzOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlID09IFN0cmluZy5jbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKFN0cmluZyB0LCBDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKFN0cmluZyB0LCBDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworCisgICAgICAgICAgICAvLyBtYWtlIHN1cmUgbm8gZXhjZXB0aW9uIG9jY3VycyBoZXJlCisgICAgICAgICAgICBwcm92aWRlcnMuZ2V0RXhjZXB0aW9uTWFwcGVyKEV4Y2VwdGlvbi5jbGFzcyk7CisKKyAgICAgICAgICAgIGZpbmFsIENvbnRleHRSZXNvbHZlcjxNeUNvbnRleHQ+IGNvbnRleHRSZXNvbHZlciA9IHByb3ZpZGVycworICAgICAgICAgICAgICAgICAgICAuZ2V0Q29udGV4dFJlc29sdmVyKE15Q29udGV4dC5jbGFzcywgTWVkaWFUeXBlLnZhbHVlT2YoUHJvdmlkZXJUeXBlKSk7CisgICAgICAgICAgICBlbnRpdHlTdHJlYW0ud3JpdGUoU3RyaW5nLmZvcm1hdCgiJXMiLCBjb250ZXh0UmVzb2x2ZXIpLmdldEJ5dGVzKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgQENvbnN1bWVzKFByb3ZpZGVyVHlwZSkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFByb3ZpZGVyc0luamVjdGVkUmVhZGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlSZWFkZXI8U3RyaW5nPiB7CisKKyAgICAgICAgQENvbnRleHQKKyAgICAgICAgUHJvdmlkZXJzIHByb3ZpZGVyczsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlID09IFN0cmluZy5jbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHJlYWRGcm9tKENsYXNzPFN0cmluZz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworCisgICAgICAgICAgICAvLyBtYWtlIHN1cmUgbm8gZXhjZXB0aW9uIG9jY3VycyBoZXJlCisgICAgICAgICAgICBwcm92aWRlcnMuZ2V0RXhjZXB0aW9uTWFwcGVyKEV4Y2VwdGlvbi5jbGFzcyk7CisKKyAgICAgICAgICAgIGZpbmFsIENvbnRleHRSZXNvbHZlcjxNeUNvbnRleHQ+IGNvbnRleHRSZXNvbHZlciA9IHByb3ZpZGVycworICAgICAgICAgICAgICAgICAgICAuZ2V0Q29udGV4dFJlc29sdmVyKE15Q29udGV4dC5jbGFzcywgTWVkaWFUeXBlLnZhbHVlT2YoUHJvdmlkZXJUeXBlKSk7CisgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJXMiLCBjb250ZXh0UmVzb2x2ZXIpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBAUHJvZHVjZXMoQ29uZmlndXJhdGlvblRZUEUpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb25maWd1cmF0aW9uSW5qZWN0ZWRXcml0ZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVdyaXRlcjxTdHJpbmc+IHsKKworICAgICAgICBAQ29udGV4dAorICAgICAgICBDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb247CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gU3RyaW5nLmNsYXNzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldFNpemUoU3RyaW5nIHQsIENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oU3RyaW5nIHQsIENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gY3R4UmVzb2x2ZXJSZWdpc3RlcmVkID0gY29uZmlndXJhdGlvbi5pc1JlZ2lzdGVyZWQoTXlDb250ZXh0UmVzb2x2ZXIuY2xhc3MpOworICAgICAgICAgICAgZW50aXR5U3RyZWFtLndyaXRlKFN0cmluZy5mb3JtYXQoIiViIiwgY3R4UmVzb2x2ZXJSZWdpc3RlcmVkKS5nZXRCeXRlcygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIEBDb25zdW1lcyhDb25maWd1cmF0aW9uVFlQRSkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbmZpZ3VyYXRpb25JbmplY3RlZFJlYWRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5UmVhZGVyPFN0cmluZz4geworCisgICAgICAgIEBDb250ZXh0CisgICAgICAgIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbjsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlID09IFN0cmluZy5jbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHJlYWRGcm9tKENsYXNzPFN0cmluZz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBjdHhSZXNvbHZlclJlZ2lzdGVyZWQgPSBjb25maWd1cmF0aW9uLmlzUmVnaXN0ZXJlZChNeUNvbnRleHRSZXNvbHZlci5jbGFzcyk7CisgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJWIiLCBjdHhSZXNvbHZlclJlZ2lzdGVyZWQpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoImVjaG8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRWNob1Jlc291cmNlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBAQ29uc3VtZXMoe1Byb3ZpZGVyVHlwZSwgQ29uZmlndXJhdGlvblRZUEUsIE1lZGlhVHlwZS5URVhUX1BMQUlOfSkKKyAgICAgICAgQFByb2R1Y2VzKHtQcm92aWRlclR5cGUsIENvbmZpZ3VyYXRpb25UWVBFLCBNZWRpYVR5cGUuVEVYVF9QTEFJTn0pCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdChTdHJpbmcgcCkgeworICAgICAgICAgICAgcmV0dXJuIHA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEVjaG9SZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKFByb3ZpZGVyc0luamVjdGVkV3JpdGVyLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihDb25maWd1cmF0aW9uSW5qZWN0ZWRXcml0ZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKFByb3ZpZGVyc0luamVjdGVkUmVhZGVyLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihDb25maWd1cmF0aW9uSW5qZWN0ZWRSZWFkZXIuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByb3ZpZGVyc0luUmVhZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0UHJvdmlkZXJzKFByb3ZpZGVyVHlwZSwgTWVkaWFUeXBlLlRFWFRfUExBSU4pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByb3ZpZGVyc0luV3JpdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0UHJvdmlkZXJzKE1lZGlhVHlwZS5URVhUX1BMQUlOLCBQcm92aWRlclR5cGUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbmZpZ3VyYXRpb25JblJlYWRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0Q29uZmlndXJhdGlvbihDb25maWd1cmF0aW9uVFlQRSwgTWVkaWFUeXBlLlRFWFRfUExBSU4pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbmZpZ3VyYXRpb25JbldyaXRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0Q29uZmlndXJhdGlvbihNZWRpYVR5cGUuVEVYVF9QTEFJTiwgQ29uZmlndXJhdGlvblRZUEUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfdGVzdFByb3ZpZGVycyhmaW5hbCBTdHJpbmcgaW5jb21pbmdUeXBlLCBmaW5hbCBTdHJpbmcgb3V0Z29pbmdUeXBlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBmaW5hbCBTdHJpbmcgcG9zdFdpdGhvdXRQcm92aWRlclJlc3VsdCA9IHRhcmdldCgiZWNobyIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3Qob3V0Z29pbmdUeXBlKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkoImRvZXMgbm90IG1hdHRlciIsIGluY29taW5nVHlwZSksIFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRoYXQocG9zdFdpdGhvdXRQcm92aWRlclJlc3VsdCwgaXMoIm51bGwiKSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHBvc3RXaXRoUHJvdmlkZXJSZXN1bHQgPSB0YXJnZXQoImVjaG8iKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihNeUNvbnRleHRSZXNvbHZlci5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVxdWVzdChvdXRnb2luZ1R5cGUpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eSgiaWdub3JlZCIsIGluY29taW5nVHlwZSksIFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRoYXQocG9zdFdpdGhQcm92aWRlclJlc3VsdCwgY29udGFpbnNTdHJpbmcoTXlDb250ZXh0UmVzb2x2ZXIuY2xhc3MuZ2V0TmFtZSgpKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RDb25maWd1cmF0aW9uKGZpbmFsIFN0cmluZyBpbmNvbWluZ1R5cGUsIGZpbmFsIFN0cmluZyBvdXRnb2luZ1R5cGUpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGZpbmFsIFN0cmluZyBwb3N0V2l0aG91dFByb3ZpZGVyUmVzdWx0ID0gdGFyZ2V0KCJlY2hvIikKKyAgICAgICAgICAgICAgICAucmVxdWVzdChpbmNvbWluZ1R5cGUpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eSgid2hhdGV2ZXIiLCBvdXRnb2luZ1R5cGUpLCBTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KHBvc3RXaXRob3V0UHJvdmlkZXJSZXN1bHQsIGlzKCJmYWxzZSIpKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgcG9zdFdpdGhQcm92aWRlclJlc3VsdCA9IHRhcmdldCgiZWNobyIpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKE15Q29udGV4dFJlc29sdmVyLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KGluY29taW5nVHlwZSkKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KCJidW1tZXIiLCBvdXRnb2luZ1R5cGUpLCBTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KHBvc3RXaXRoUHJvdmlkZXJSZXN1bHQsIGlzKCJ0cnVlIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0luamVjdGlvbk1hbmFnZXJQcm92aWRlclRlc3QuamF2YSBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L0luamVjdGlvbk1hbmFnZXJQcm92aWRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWUzOTNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvSW5qZWN0aW9uTWFuYWdlclByb3ZpZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjk0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jbGllbnQ7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXNwb25zZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlc3BvbnNlRmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SZWFkZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0OworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LkluamVjdGlvbk1hbmFnZXJQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuSW5qZWN0aW9uTWFuYWdlckNsaWVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5BYnN0cmFjdEJpbmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3RzIHtAbGluayBJbmplY3Rpb25NYW5hZ2VyQ2xpZW50UHJvdmlkZXJ9LgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIEluamVjdGlvbk1hbmFnZXJQcm92aWRlclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBQYXRoKCJyZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0UmVzb3VyY2UgeworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGVjaG8oU3RyaW5nIGVudGl0eSkgeworICAgICAgICAgICAgcmV0dXJuIGVudGl0eTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhUZXN0UmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUluamVjdGVkU2VydmljZSB7CisgICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgbmFtZTsKKworICAgICAgICBwdWJsaWMgTXlJbmplY3RlZFNlcnZpY2UoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQmluZGVyRmVhdHVyZSBpbXBsZW1lbnRzIEZlYXR1cmUgeworCisgICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgbmFtZTsKKworICAgICAgICBwdWJsaWMgQmluZGVyRmVhdHVyZShTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmUoRmVhdHVyZUNvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihuZXcgQWJzdHJhY3RCaW5kZXIoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICAgICAgICAgICAgICBiaW5kKG5ldyBNeUluamVjdGVkU2VydmljZShuYW1lKSkudG8oTXlJbmplY3RlZFNlcnZpY2UuY2xhc3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlSZXF1ZXN0RmlsdGVyIGltcGxlbWVudHMgQ2xpZW50UmVxdWVzdEZpbHRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDbGllbnRSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciA9IEluamVjdGlvbk1hbmFnZXJDbGllbnRQcm92aWRlci5nZXRJbmplY3Rpb25NYW5hZ2VyKHJlcXVlc3RDb250ZXh0KTsKKyAgICAgICAgICAgIGZpbmFsIE15SW5qZWN0ZWRTZXJ2aWNlIHNlcnZpY2UgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKE15SW5qZWN0ZWRTZXJ2aWNlLmNsYXNzKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gc2VydmljZS5nZXROYW1lKCk7CisgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5zZXRFbnRpdHkobmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcXVlc3RGaWx0ZXJJbnN0YW5jZSgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZSIpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKG5ldyBCaW5kZXJGZWF0dXJlKCJoZWxsbyIpKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihuZXcgTXlSZXF1ZXN0RmlsdGVyKCkpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoIndpbGwtYmUtb3ZlcndyaXR0ZW4iLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJoZWxsbyIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWVzdEZpbHRlckNsYXNzKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIikKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIobmV3IEJpbmRlckZlYXR1cmUoImhlbGxvIikpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKE15UmVxdWVzdEZpbHRlci5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eSgid2lsbC1iZS1vdmVyd3JpdHRlbiIsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImhlbGxvIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlSZXNwb25zZUZpbHRlciBpbXBsZW1lbnRzIENsaWVudFJlc3BvbnNlRmlsdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENsaWVudFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LCBDbGllbnRSZXNwb25zZUNvbnRleHQgcmVzcG9uc2VDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgICAgICBmaW5hbCBJbmplY3Rpb25NYW5hZ2VyIGxvY2F0b3IgPSBJbmplY3Rpb25NYW5hZ2VyQ2xpZW50UHJvdmlkZXIuZ2V0SW5qZWN0aW9uTWFuYWdlcihyZXNwb25zZUNvbnRleHQpOworICAgICAgICAgICAgZmluYWwgTXlJbmplY3RlZFNlcnZpY2Ugc2VydmljZSA9IGxvY2F0b3IuZ2V0SW5zdGFuY2UoTXlJbmplY3RlZFNlcnZpY2UuY2xhc3MpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSBzZXJ2aWNlLmdldE5hbWUoKTsKKyAgICAgICAgICAgIHJlc3BvbnNlQ29udGV4dC5zZXRFbnRpdHlTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG5hbWUuZ2V0Qnl0ZXMoKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzcG9uc2VGaWx0ZXJJbnN0YW5jZSgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZSIpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKG5ldyBCaW5kZXJGZWF0dXJlKCJ3b3JsZCIpKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihuZXcgTXlSZXNwb25zZUZpbHRlcigpKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KCJ3aWxsLWJlLW92ZXJ3cml0dGVuIiwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygid29ybGQiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc3BvbnNlRmlsdGVyQ2xhc3MoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihuZXcgQmluZGVyRmVhdHVyZSgid29ybGQiKSkKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoTXlSZXNwb25zZUZpbHRlci5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eSgid2lsbC1iZS1vdmVyd3JpdHRlbiIsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIndvcmxkIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15RmVhdHVyZSBpbXBsZW1lbnRzIEZlYXR1cmUgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmUoRmVhdHVyZUNvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihNeUZlYXR1cmVJbnRlcmNlcHRvci5jbGFzcyk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlGZWF0dXJlSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBXcml0ZXJJbnRlcmNlcHRvciB7CisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisgICAgICAgICAgICBASW5qZWN0CisgICAgICAgICAgICBwdWJsaWMgTXlGZWF0dXJlSW50ZXJjZXB0b3IoTXlJbmplY3RlZFNlcnZpY2UgaW5qZWN0ZWRTZXJ2aWNlKSB7CisgICAgICAgICAgICAgICAgdGhpcy5uYW1lID0gaW5qZWN0ZWRTZXJ2aWNlLmdldE5hbWUoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBhcm91bmRXcml0ZVRvKFdyaXRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LnNldEVudGl0eShjb250ZXh0LmdldEVudGl0eSgpICsgIi1pbnRlcmNlcHRvci0iICsgbmFtZSk7CisgICAgICAgICAgICAgICAgY29udGV4dC5wcm9jZWVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGZWF0dXJlSW5zdGFuY2UoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihuZXcgQWJzdHJhY3RCaW5kZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKG5ldyBNeUluamVjdGVkU2VydmljZSgiZmVhdHVyZSIpKS50byhNeUluamVjdGVkU2VydmljZS5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihuZXcgTXlGZWF0dXJlKCkpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoIndpbGwtYmUtZXh0ZW5kZWQtYnkiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3aWxsLWJlLWV4dGVuZGVkLWJ5LWludGVyY2VwdG9yLWZlYXR1cmUiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZlYXR1cmVDbGFzcygpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZSIpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKG5ldyBBYnN0cmFjdEJpbmRlcigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQobmV3IE15SW5qZWN0ZWRTZXJ2aWNlKCJmZWF0dXJlIikpLnRvKE15SW5qZWN0ZWRTZXJ2aWNlLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKE15RmVhdHVyZS5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eSgid2lsbC1iZS1leHRlbmRlZC1ieSIsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIndpbGwtYmUtZXh0ZW5kZWQtYnktaW50ZXJjZXB0b3ItZmVhdHVyZSIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15V3JpdGVySW50ZXJjZXB0b3IgaW1wbGVtZW50cyBXcml0ZXJJbnRlcmNlcHRvciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGFyb3VuZFdyaXRlVG8oV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgSW5qZWN0aW9uTWFuYWdlciBzZXJ2aWNlTG9jYXRvciA9IEluamVjdGlvbk1hbmFnZXJQcm92aWRlci5nZXRJbmplY3Rpb25NYW5hZ2VyKGNvbnRleHQpOworICAgICAgICAgICAgZmluYWwgTXlJbmplY3RlZFNlcnZpY2Ugc2VydmljZSA9IHNlcnZpY2VMb2NhdG9yLmdldEluc3RhbmNlKE15SW5qZWN0ZWRTZXJ2aWNlLmNsYXNzKTsKKyAgICAgICAgICAgIGNvbnRleHQuc2V0RW50aXR5KCgoU3RyaW5nKSBjb250ZXh0LmdldEVudGl0eSgpKSArICItd3JpdGVyLWludGVyY2VwdG9yLSIgKyBzZXJ2aWNlLmdldE5hbWUoKSk7CisgICAgICAgICAgICBjb250ZXh0LnByb2NlZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdyaXRlckludGVyY2VwdG9ySW5zdGFuY2UoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihuZXcgQmluZGVyRmVhdHVyZSgidW5pdmVyc2UiKSkKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIobmV3IE15V3JpdGVySW50ZXJjZXB0b3IoKSkKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eSgid2lsbC1iZS1leHRlbmRlZC1ieSIsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIndpbGwtYmUtZXh0ZW5kZWQtYnktd3JpdGVyLWludGVyY2VwdG9yLXVuaXZlcnNlIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXcml0ZXJJbnRlcmNlcHRvckNsYXNzKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIikKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIobmV3IEJpbmRlckZlYXR1cmUoInVuaXZlcnNlIikpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKE15V3JpdGVySW50ZXJjZXB0b3IuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoIndpbGwtYmUtZXh0ZW5kZWQtYnkiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3aWxsLWJlLWV4dGVuZGVkLWJ5LXdyaXRlci1pbnRlcmNlcHRvci11bml2ZXJzZSIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15UmVhZGVySW50ZXJjZXB0b3IgaW1wbGVtZW50cyBSZWFkZXJJbnRlcmNlcHRvciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPYmplY3QgYXJvdW5kUmVhZEZyb20oUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgT2JqZWN0IGVudGl0eSA9IGNvbnRleHQucHJvY2VlZCgpOworICAgICAgICAgICAgaWYgKCEoZW50aXR5IGluc3RhbmNlb2YgU3RyaW5nKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBlbnRpdHk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc3RyaW5nRW50aXR5ID0gKFN0cmluZykgZW50aXR5OworICAgICAgICAgICAgZmluYWwgSW5qZWN0aW9uTWFuYWdlciBzZXJ2aWNlTG9jYXRvciA9IEluamVjdGlvbk1hbmFnZXJQcm92aWRlci5nZXRJbmplY3Rpb25NYW5hZ2VyKGNvbnRleHQpOworICAgICAgICAgICAgZmluYWwgTXlJbmplY3RlZFNlcnZpY2Ugc2VydmljZSA9IHNlcnZpY2VMb2NhdG9yLmdldEluc3RhbmNlKE15SW5qZWN0ZWRTZXJ2aWNlLmNsYXNzKTsKKyAgICAgICAgICAgIHJldHVybiBzdHJpbmdFbnRpdHkgKyAiLXJlYWRlci1pbnRlcmNlcHRvci0iICsgc2VydmljZS5nZXROYW1lKCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRlckludGVyY2VwdG9ySW5zdGFuY2UoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihuZXcgQmluZGVyRmVhdHVyZSgidW5pdmVyc2UiKSkKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIobmV3IE15UmVhZGVySW50ZXJjZXB0b3IoKSkKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eSgid2lsbC1iZS1leHRlbmRlZC1ieSIsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIndpbGwtYmUtZXh0ZW5kZWQtYnktcmVhZGVyLWludGVyY2VwdG9yLXVuaXZlcnNlIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkZXJJbnRlcmNlcHRvckNsYXNzKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIikKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIobmV3IEJpbmRlckZlYXR1cmUoInVuaXZlcnNlIikpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKE15UmVhZGVySW50ZXJjZXB0b3IuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoIndpbGwtYmUtZXh0ZW5kZWQtYnkiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3aWxsLWJlLWV4dGVuZGVkLWJ5LXJlYWRlci1pbnRlcmNlcHRvci11bml2ZXJzZSIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvSmF4UnNUaW1lb3V0VGVzdC5qYXZhIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvSmF4UnNUaW1lb3V0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZGY5YTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9KYXhSc1RpbWVvdXRUZXN0LmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY2xpZW50OworCitpbXBvcnQgamF2YS5uZXQuU29ja2V0VGltZW91dEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuSmVyc2V5V2ViVGFyZ2V0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSmF4UnNUaW1lb3V0VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBmaW5hbCBDbGllbnQgY2xpZW50ID0KKyAgICAgICAgICAgIENsaWVudEJ1aWxkZXIubmV3QnVpbGRlcigpLnJlYWRUaW1lb3V0KDIwMDAsIFRpbWVVbml0Lk1JTExJU0VDT05EUykuYnVpbGQoKTsKKworICAgIEBQYXRoKCIvdGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUaW1lb3V0UmVzb3VyY2UgeworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJHRVQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgidGltZW91dCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGltZW91dCgpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDUwMDApOworICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gIkdFVCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFRpbWVvdXRUZXN0LlRpbWVvdXRSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIENsaWVudCBnZXRDbGllbnQoKSB7CisgICAgICAgIHJldHVybiBjbGllbnQ7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmFzdCgpIHsKKyAgICAgICAgUmVzcG9uc2UgciA9IHRhcmdldCgidGVzdCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgci5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiR0VUIiwgci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNsb3coKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0YXJnZXQoInRlc3QvdGltZW91dCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgICAgIGZhaWwoIlRpbWVvdXQgZXhwZWN0ZWQuIik7CisgICAgICAgIH0gY2F0Y2ggKFByb2Nlc3NpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgaWYgKCEoZS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgU29ja2V0VGltZW91dEV4Y2VwdGlvbikpIHsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L05vblN1Y2Nlc3NmdWxSZXNwb25zZVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L05vblN1Y2Nlc3NmdWxSZXNwb25zZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDc1NjI4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvTm9uU3VjY2Vzc2Z1bFJlc3BvbnNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jbGllbnQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5TeW5jSW52b2tlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGVzdCBubyBzdWNjZXNzZnVsICgzWFgsIDRYWCwgNVhYKSByZXNwb25zZXMgd2l0aCBubyBlbXB0eSBib2R5LgorICoKKyAqIEBhdXRob3IgQmFsbGVzaSBFemVxdWllbCAoZXplcXVpZWxiYWxsZXNpIGF0IGdtYWlsLmNvbSkKKyAqLworcHVibGljIGNsYXNzIE5vblN1Y2Nlc3NmdWxSZXNwb25zZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoVGVzdFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICAvLyBOT1RFOiBUaGlzIGlzIG5vdCBuZWNlc3Nhcnkgd2hlbiB1c2luZyBjb25uZWN0b3IsIHRoYXQgZG9lcyBub3QgZm9sbG93IHJlZGlyZWN0cyBieSBkZWZhdWx0LCBzdWNoIGFzIEh0dHBVcmxDb25uZWN0b3IuCisgICAgICAgIC8vIEhvd2V2ZXIsIHRoZSB0ZXN0Y2FzZSB3b3VsZCBmYWlsIHdoZW4gRk9MTE9XX1JFRElSRUNUUyBpcyBzZXQgdG8gdHJ1ZS4gVGhlcmVmb3IsIHdlIGNvbmZpZ3VyZSB0aGUgYmVoYXZpb3VyIG9uCisgICAgICAgIC8vIHJlZGlyZWN0cyBleHBsaWNpdGx5LgorICAgICAgICBjb25maWcucHJvcGVydHkoQ2xpZW50UHJvcGVydGllcy5GT0xMT1dfUkVESVJFQ1RTLCBmYWxzZSk7CisgICAgfQorCisgICAgQFBhdGgoInJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiL3tzdGF0dXN9IikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldFhYWChAUGF0aFBhcmFtKCJzdGF0dXMiKSBpbnQgc3RhdHVzKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKHN0YXR1cykuZW50aXR5KCJnZXQiKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoIi97c3RhdHVzfSIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBwb3N0WFhYKEBQYXRoUGFyYW0oInN0YXR1cyIpIGludCBzdGF0dXMsIFN0cmluZyBwb3N0KSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKHN0YXR1cykuZW50aXR5KHBvc3QpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldDNYWCgpIHsKKyAgICAgICAgZ2VuZXJhbFRlc3RHZXQoMzAyKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0M1hYKCkgeworICAgICAgICBnZW5lcmFsVGVzdFBvc3QoMzAyKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXQ0WFgoKSB7CisgICAgICAgIGdlbmVyYWxUZXN0R2V0KDQwMSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdDRYWCgpIHsKKyAgICAgICAgZ2VuZXJhbFRlc3RQb3N0KDQwMSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0NVhYKCkgeworICAgICAgICBnZW5lcmFsVGVzdEdldCg1MDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc3Q1WFgoKSB7CisgICAgICAgIGdlbmVyYWxUZXN0UG9zdCg1MDApOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBnZW5lcmFsVGVzdEdldChpbnQgc3RhdHVzKSB7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoInJlc291cmNlIikucGF0aChJbnRlZ2VyLnRvU3RyaW5nKHN0YXR1cykpOworICAgICAgICBTeW5jSW52b2tlciBzeW5jID0gdGFyZ2V0LnJlcXVlc3QoKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSBzeW5jLmdldChSZXNwb25zZS5jbGFzcyk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoc3RhdHVzLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImdldCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGdlbmVyYWxUZXN0UG9zdChpbnQgc3RhdHVzKSB7CisgICAgICAgIEVudGl0eTxTdHJpbmc+IGVudGl0eSA9IEVudGl0eS5lbnRpdHkoImVudGl0eSIsIE1lZGlhVHlwZS5XSUxEQ0FSRF9UWVBFKTsKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgicmVzb3VyY2UiKS5wYXRoKEludGVnZXIudG9TdHJpbmcoc3RhdHVzKSk7CisgICAgICAgIFN5bmNJbnZva2VyIHN5bmMgPSB0YXJnZXQucmVxdWVzdCgpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHN5bmMucG9zdChlbnRpdHksIFJlc3BvbnNlLmNsYXNzKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhzdGF0dXMsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiZW50aXR5IiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L1JlcXVlc3RTY29wZWRSZWFkRW50aXR5VGVzdC5qYXZhIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvUmVxdWVzdFNjb3BlZFJlYWRFbnRpdHlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMwODgwZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L1JlcXVlc3RTY29wZWRSZWFkRW50aXR5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jbGllbnQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50Lkludm9jYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuQWJzdHJhY3RNZXNzYWdlUmVhZGVyV3JpdGVyUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUT0RPOiBqYXZhZG9jLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBSZXF1ZXN0U2NvcGVkUmVhZEVudGl0eVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWVzc2FnZSB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgdGV4dDsKKworICAgICAgICBwdWJsaWMgTWVzc2FnZShTdHJpbmcgdGV4dCkgeworICAgICAgICAgICAgdGhpcy50ZXh0ID0gdGV4dDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJzaW1wbGUiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2ltcGxlUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRJdCgpIHsKKyAgICAgICAgICAgIHJldHVybiAicGFzc2VkIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTY29wZWRNZXNzYWdlRW50aXR5UHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VSZWFkZXJXcml0ZXJQcm92aWRlcjxNZXNzYWdlPiB7CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBwcml2YXRlIFByb3ZpZGVyPENsaWVudFJlcXVlc3Q+IGNsaWVudFJlcXVlc3RQcm92aWRlcjsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlID09IE1lc3NhZ2UuY2xhc3MgJiYgbWVkaWFUeXBlLmVxdWFscyhNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTWVzc2FnZSByZWFkRnJvbSgKKyAgICAgICAgICAgICAgICBDbGFzczxNZXNzYWdlPiB0eXBlLAorICAgICAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIGNsaWVudFJlcXVlc3RQcm92aWRlci5nZXQoKSAhPSBudWxsCisgICAgICAgICAgICAgICAgICAgID8gbmV3IE1lc3NhZ2UocmVhZEZyb21Bc1N0cmluZyhlbnRpdHlTdHJlYW0sIG1lZGlhVHlwZSkpIDogbmV3IE1lc3NhZ2UoImZhaWxlZCIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gTWVzc2FnZS5jbGFzcyAmJiBtZWRpYVR5cGUuZXF1YWxzKE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oCisgICAgICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlLAorICAgICAgICAgICAgICAgIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICB3cml0ZVRvQXNTdHJpbmcoKGNsaWVudFJlcXVlc3RQcm92aWRlci5nZXQoKSAhPSBudWxsKSA/IG1lc3NhZ2UudGV4dCA6ICJmYWlsZWQiLCBlbnRpdHlTdHJlYW0sIG1lZGlhVHlwZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFNpbXBsZVJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkQWZ0ZXJDbG9zZSgpIHsKKyAgICAgICAgZmluYWwgSW52b2NhdGlvbi5CdWlsZGVyIHJlcXVlc3QgPSB0YXJnZXQoKS5wYXRoKCJzaW1wbGUiKS5yZWdpc3RlcihTY29wZWRNZXNzYWdlRW50aXR5UHJvdmlkZXIuY2xhc3MpLnJlcXVlc3QoKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHJlcXVlc3QuZ2V0KFJlc3BvbnNlLmNsYXNzKTsKKyAgICAgICAgLy8gcmVhZGluZyBlbnRpdHkgIm91dC1vZi1zY29wZSIKKyAgICAgICAgZmluYWwgTWVzc2FnZSBtc2cgPSByZXNwb25zZS5yZWFkRW50aXR5KE1lc3NhZ2UuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBhc3NlZCIsIG1zZy50ZXh0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9SZXNwb25zZUNsb3NlVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvUmVzcG9uc2VDbG9zZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGFiODM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvUmVzcG9uc2VDbG9zZVRlc3QuamF2YQpAQCAtMCwwICsxLDE0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY2xpZW50OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICogVGVzdCBmb3IgUmVzcG9uc2UuY2xvc2UoKSBtZXRob2QuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFJlc3BvbnNlQ2xvc2VUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAUGF0aCgic2ltcGxlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNpbXBsZVJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SXQoKSB7CisgICAgICAgICAgICByZXR1cm4gIml0IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImVtcHR5IikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldEVtcHR5KCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm5vQ29udGVudCgpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFNpbXBsZVJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkQWZ0ZXJDbG9zZSgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJzaW1wbGUiKS5yZXF1ZXN0KCkuZ2V0KFJlc3BvbnNlLmNsYXNzKTsKKyAgICAgICAgcmVzcG9uc2UuY2xvc2UoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgIGZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCB3aGVuIHJlYWRpbmcgZW50aXR5IGFmdGVyIHJlc3BvbnNlIGhhcyBiZWVuIGNsb3NlZC4iKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2VCZWZvcmVSZWFkaW5nRW1wdHlDb250ZW50SGFzTm9FZmZlY3QoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgic2ltcGxlIikucGF0aCgiZW1wdHkiKS5yZXF1ZXN0KCkuZ2V0KFJlc3BvbnNlLmNsYXNzKTsKKyAgICAgICAgcmVzcG9uc2UuY2xvc2UoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgIGZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCB3aGVuIHJlYWRpbmcgZW50aXR5IGFmdGVyIHJlc3BvbnNlIGhhcyBiZWVuIGNsb3NlZC4iKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEFmdGVyTXVsdGlwbGVDbG9zZSgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJzaW1wbGUiKS5yZXF1ZXN0KCkuZ2V0KFJlc3BvbnNlLmNsYXNzKTsKKyAgICAgICAgcmVzcG9uc2UuY2xvc2UoKTsKKyAgICAgICAgcmVzcG9uc2UuY2xvc2UoKTsKKyAgICAgICAgcmVzcG9uc2UuY2xvc2UoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgIGZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCB3aGVuIHJlYWRpbmcgZW50aXR5IGFmdGVyIHJlc3BvbnNlIGhhcyBiZWVuIGNsb3NlZC4iKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEJ1ZmZlcmVkRW50aXR5QWZ0ZXJDbG9zZSgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJzaW1wbGUiKS5yZXF1ZXN0KCkuZ2V0KFJlc3BvbnNlLmNsYXNzKTsKKyAgICAgICAgcmVzcG9uc2UuYnVmZmVyRW50aXR5KCk7CisgICAgICAgIHJlc3BvbnNlLmNsb3NlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICBmYWlsKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQgd2hlbiByZWFkaW5nIGEgYnVmZmVyZWQgZW50aXR5IGFmdGVyIHJlc3BvbnNlIGhhcyBiZWVuIGNsb3NlZC4iKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnVmZmVyRW50aXR5QWZ0ZXJDbG9zZSgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJzaW1wbGUiKS5yZXF1ZXN0KCkuZ2V0KFJlc3BvbnNlLmNsYXNzKTsKKyAgICAgICAgcmVzcG9uc2UuY2xvc2UoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc3BvbnNlLmJ1ZmZlckVudGl0eSgpOworICAgICAgICAgICAgZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkIHdoZW4gcmVhZGluZyBhIGJ1ZmZlcmVkIGVudGl0eSBhZnRlciByZXNwb25zZSBoYXMgYmVlbiBjbG9zZWQuIik7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEVudGl0eUFmdGVyQ2xvc2UoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgic2ltcGxlIikucmVxdWVzdCgpLmdldChSZXNwb25zZS5jbGFzcyk7CisgICAgICAgIHJlc3BvbnNlLmNsb3NlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXNwb25zZS5nZXRFbnRpdHkoKTsKKyAgICAgICAgICAgIGZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCB3aGVuIHJlYWRpbmcgYSBidWZmZXJlZCBlbnRpdHkgYWZ0ZXIgcmVzcG9uc2UgaGFzIGJlZW4gY2xvc2VkLiIpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIYXNFbnRpdHlBZnRlckNsb3NlKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInNpbXBsZSIpLnJlcXVlc3QoKS5nZXQoUmVzcG9uc2UuY2xhc3MpOworICAgICAgICByZXNwb25zZS5jbG9zZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVzcG9uc2UuaGFzRW50aXR5KCk7CisgICAgICAgICAgICBmYWlsKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gc2hvdWxkIGhhdmUgYmVlbiBjYXVnaHQgaW5zaWRlIGhhc0VudGl0eS4iKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvUmVzcG9uc2VSZWFkQW5kQnVmZmVyRW50aXR5VGVzdC5qYXZhIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvUmVzcG9uc2VSZWFkQW5kQnVmZmVyRW50aXR5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZGRmYWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9SZXNwb25zZVJlYWRBbmRCdWZmZXJFbnRpdHlUZXN0LmphdmEKQEAgLTAsMCArMSwzNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNsaWVudDsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlc3BvbnNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVzcG9uc2VGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaW5zdGFuY2VPZjsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCisvKioKKyAqIEJ1ZmZlcmVkIHJlc3BvbnNlIGVudGl0eSB0ZXN0cy4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNwb25zZVJlYWRBbmRCdWZmZXJFbnRpdHlUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihSZXNwb25zZVJlYWRBbmRCdWZmZXJFbnRpdHlUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvcnJ1cHRhYmxlSW5wdXRTdHJlYW0gZXh0ZW5kcyBJbnB1dFN0cmVhbSB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBdG9taWNJbnRlZ2VyIGNsb3NlQ291bnRlciA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOworCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBjb3JydXB0Q2xvc2UgPSBmYWxzZTsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIGNvcnJ1cHRSZWFkID0gZmFsc2U7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBCeXRlQXJyYXlJbnB1dFN0cmVhbSBkZWxlZ2F0ZTsKKworICAgICAgICBwdWJsaWMgQ29ycnVwdGFibGVJbnB1dFN0cmVhbSgpIHsKKyAgICAgICAgICAgIHRoaXMuZGVsZWdhdGUgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oUmVzb3VyY2UuRU5USVRZLmdldEJ5dGVzKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKGNvcnJ1cHRSZWFkKSB7CisgICAgICAgICAgICAgICAgY29ycnVwdCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLnJlYWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHJlYWQoZmluYWwgYnl0ZVtdIGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoY29ycnVwdFJlYWQpIHsKKyAgICAgICAgICAgICAgICBjb3JydXB0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUucmVhZChiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IHJlYWQoZmluYWwgYnl0ZVtdIGIsIGZpbmFsIGludCBvZmYsIGZpbmFsIGludCBsZW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoY29ycnVwdFJlYWQpIHsKKyAgICAgICAgICAgICAgICBjb3JydXB0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUucmVhZChiLCBvZmYsIGxlbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgc2tpcChmaW5hbCBsb25nIG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoY29ycnVwdFJlYWQpIHsKKyAgICAgICAgICAgICAgICBjb3JydXB0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuc2tpcChuKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGF2YWlsYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoY29ycnVwdFJlYWQpIHsKKyAgICAgICAgICAgICAgICBjb3JydXB0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuYXZhaWxhYmxlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gbWFya1N1cHBvcnRlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5tYXJrU3VwcG9ydGVkKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgbWFyayhmaW5hbCBpbnQgcmVhZEFoZWFkTGltaXQpIHsKKyAgICAgICAgICAgIGRlbGVnYXRlLm1hcmsocmVhZEFoZWFkTGltaXQpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICAgICAgY2xvc2VDb3VudGVyLnNldCgwKTsKKyAgICAgICAgICAgIGRlbGVnYXRlLnJlc2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgY2xvc2VDb3VudGVyLmluY3JlbWVudEFuZEdldCgpOworICAgICAgICAgICAgaWYgKGNvcnJ1cHRDbG9zZSkgeworICAgICAgICAgICAgICAgIGNvcnJ1cHQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlbGVnYXRlLmNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRDb3JydXB0UmVhZChmaW5hbCBib29sZWFuIGNvcnJ1cHRSZWFkKSB7CisgICAgICAgICAgICB0aGlzLmNvcnJ1cHRSZWFkID0gY29ycnVwdFJlYWQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRDb3JydXB0Q2xvc2UoZmluYWwgYm9vbGVhbiBjb3JydXB0Q2xvc2UpIHsKKyAgICAgICAgICAgIHRoaXMuY29ycnVwdENsb3NlID0gY29ycnVwdENsb3NlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBnZXRDbG9zZUNvdW50KCkgeworICAgICAgICAgICAgcmV0dXJuIGNsb3NlQ291bnRlci5nZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY29ycnVwdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkFwb2NhbHlwc2UgTm93Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicmVzcG9uc2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWSA9ICJFTnRpVHkiOworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImNvcnJ1cHRlZCIpCisgICAgICAgIHB1YmxpYyBDb3JydXB0YWJsZUlucHV0U3RyZWFtIGNvcnJ1cHRlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ29ycnVwdGFibGVJbnB1dFN0cmVhbSgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgic3RyaW5nIikKKyAgICAgICAgcHVibGljIFN0cmluZyBzdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gRU5USVRZOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKTsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3Rlckluc3RhbmNlcyhuZXcgTG9nZ2luZ0ZlYXR1cmUoTE9HR0VSLCBMb2dnaW5nRmVhdHVyZS5WZXJib3NpdHkuUEFZTE9BRF9BTlkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCdWZmZXJFbnRpdHlSZWFkc09yaWdpbmFsU3RyZWFtVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJyZXNwb25zZS9jb3JydXB0ZWQiKTsKKyAgICAgICAgZmluYWwgQ29ycnVwdGFibGVJbnB1dFN0cmVhbSBjaXMgPSBuZXcgQ29ycnVwdGFibGVJbnB1dFN0cmVhbSgpOworICAgICAgICB0YXJnZXQucmVnaXN0ZXIobmV3IENsaWVudFJlc3BvbnNlRmlsdGVyKCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihmaW5hbCBDbGllbnRSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCwgZmluYWwgQ2xpZW50UmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCkgeworICAgICAgICAgICAgICAgIHJlc3BvbnNlQ29udGV4dC5zZXRFbnRpdHlTdHJlYW0oY2lzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9KTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLmJ1aWxkR2V0KCkuaW52b2tlKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNpcy5zZXRDb3JydXB0UmVhZCh0cnVlKTsKKyAgICAgICAgICAgIHJlc3BvbnNlLmJ1ZmZlckVudGl0eSgpOworICAgICAgICAgICAgZmFpbCgiUHJvY2Vzc2luZ0V4Y2VwdGlvbiBleHBlY3RlZC4iKTsKKyAgICAgICAgfSBjYXRjaCAoUHJvY2Vzc2luZ0V4Y2VwdGlvbiBwZSkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgICAgIGFzc2VydFRoYXQocGUuZ2V0Q2F1c2UoKSwgaW5zdGFuY2VPZihJT0V4Y2VwdGlvbi5jbGFzcykpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICAvLyBTZWUgSkVSU0VZLTEzNDAKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2Vjb25kVW5idWZmZXJlZFJlYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoInJlc3BvbnNlL3N0cmluZyIpLnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfUExBSU4pLmdldCgpOworICAgICAgICBTdHJpbmcgZW50aXR5ID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmVzb3VyY2UuRU5USVRZLCBlbnRpdHkpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXNwb25zZS5yZWFkRW50aXR5KFJlYWRlci5jbGFzcyk7CisgICAgICAgICAgICBmYWlsKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQgdG8gYmUgdGhyb3duLiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgICAgIC8vIHBhc3NlZC4KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgLy8gU2VlIEpFUlNFWS0xMzM5CisgICAgcHVibGljIHZvaWQgdGVzdFNlY29uZEJ1ZmZlcmVkUmVhZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgicmVzcG9uc2Uvc3RyaW5nIikucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9QTEFJTikuZ2V0KCk7CisgICAgICAgIHJlc3BvbnNlLmJ1ZmZlckVudGl0eSgpOworCisgICAgICAgIFN0cmluZyBlbnRpdHk7CisKKyAgICAgICAgZW50aXR5ID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmVzb3VyY2UuRU5USVRZLCBlbnRpdHkpOworCisgICAgICAgIGVudGl0eSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJlc291cmNlLkVOVElUWSwgZW50aXR5KTsKKworICAgICAgICBCdWZmZXJlZFJlYWRlciBidWZmZXJlZCA9IG5ldyBCdWZmZXJlZFJlYWRlcihyZXNwb25zZS5yZWFkRW50aXR5KFJlYWRlci5jbGFzcykpOworICAgICAgICBTdHJpbmcgbGluZSA9IGJ1ZmZlcmVkLnJlYWRMaW5lKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhSZXNvdXJjZS5FTlRJVFksIGxpbmUpOworCisgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVswXTsKKyAgICAgICAgYnVmZmVyID0gcmVzcG9uc2UucmVhZEVudGl0eShidWZmZXIuZ2V0Q2xhc3MoKSk7CisgICAgICAgIFN0cmluZyBlbnRpdHlGcm9tQnl0ZXMgPSBuZXcgU3RyaW5nKGJ1ZmZlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhSZXNvdXJjZS5FTlRJVFksIGVudGl0eUZyb21CeXRlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgdGVzdHMgYmVoYXZpb3Igb2YgaW5wdXQgc3RyZWFtIG9wZXJhdGlvbnMgaW4gY2FzZSB0aGUgdW5kZXJseWluZyBpbnB1dCBzdHJlYW0gdGhyb3dzIGFuIGV4Y2VwdGlvbiB3aGVuIGNsb3NlZC4KKyAgICAgKiBSZXByb2R1Y2VyIGZvciBKUkZDQUYtMTM0NC4KKyAgICAgKiA8cD4KKyAgICAgKiBVQy0xIDogUmVhZCB1bmJ1ZmZlcmVkIGVudGl0eSBhbmQgdGhlbiB0cnkgdG8gY2xvc2UgdGhlIGNvbnRleHQKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkVW5idWZmZXJlZEVudGl0eUZyb21TdHJlYW1UaGF0RmFpbHNUb0Nsb3NlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgZmluYWwgQ29ycnVwdGFibGVJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0gPSBuZXcgQ29ycnVwdGFibGVJbnB1dFN0cmVhbSgpOworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJyZXNwb25zZS9jb3JydXB0ZWQiKTsKKyAgICAgICAgdGFyZ2V0LnJlZ2lzdGVyKG5ldyBDbGllbnRSZXNwb25zZUZpbHRlcigpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoZmluYWwgQ2xpZW50UmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsIGZpbmFsIENsaWVudFJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQpIHsKKyAgICAgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuc2V0RW50aXR5U3RyZWFtKGVudGl0eVN0cmVhbSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSk7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5idWlsZEdldCgpLmludm9rZSgpOworICAgICAgICBlbnRpdHlTdHJlYW0uc2V0Q29ycnVwdENsb3NlKHRydWUpOworCisgICAgICAgIC8vIFJlYWQgZW50aXR5IHNob3VsZCBub3QgZmFpbCAtIHdlIHNpbGVudGx5IGNvbnN1bWUgdGhlIHVuZGVybHlpbmcgSU9FeGNlcHRpb24gZnJvbSBjbG9zZWQgaW5wdXQgc3RyZWFtLgorICAgICAgICBmaW5hbCBTdHJpbmcgZW50aXR5ID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MsIG51bGwpOworICAgICAgICBhc3NlcnRUaGF0KCJVbmV4cGVjdGVkIHJlc3BvbnNlLiIsIGVudGl0eS50b1N0cmluZygpLCBlcXVhbFRvKFJlc291cmNlLkVOVElUWSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkNsb3NlIG5vdCBpbnZva2VkIG9uIHVuZGVybHlpbmcgaW5wdXQgc3RyZWFtLiIsIDEsIGVudGl0eVN0cmVhbS5nZXRDbG9zZUNvdW50KCkpOworCisgICAgICAgIC8vIENsb3NlIHNob3VsZCBub3QgZmFpbCBhbmQgc2hvdWxkIGJlIGlkZW1wb3RlbnQKKyAgICAgICAgcmVzcG9uc2UuY2xvc2UoKTsKKyAgICAgICAgcmVzcG9uc2UuY2xvc2UoKTsKKyAgICAgICAgcmVzcG9uc2UuY2xvc2UoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJDbG9zZSBpbnZva2VkIHRvbyBtYW55IHRpbWVzIG9uIHVuZGVybHlpbmcgaW5wdXQgc3RyZWFtLiIsIDEsIGVudGl0eVN0cmVhbS5nZXRDbG9zZUNvdW50KCkpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBVQy0xLjEgOiBUcnkgdG8gcmVhZCBhbiB1bmJ1ZmZlcmVkIGVudGl0eSBmcm9tIGEgY2xvc2VkIGNvbnRleHQKKyAgICAgICAgICAgIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzLCBudWxsKTsKKyAgICAgICAgICAgIGZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCB3aGVuIHJlYWRpbmcgZnJvbSBhIGNsb3NlZCBjb250ZXh0LiIpOworICAgICAgICAgICAgLy8gVUMtMS4xIDogRU5ECisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpc2UpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG1ldGhvZCB0ZXN0cyBiZWhhdmlvciBvZiBpbnB1dCBzdHJlYW0gb3BlcmF0aW9ucyBpbiBjYXNlIHRoZSB1bmRlcmx5aW5nIGlucHV0IHN0cmVhbSB0aHJvd3MgYW4gZXhjZXB0aW9uIHdoZW4gY2xvc2VkLgorICAgICAqIFJlcHJvZHVjZXIgZm9yIEpSRkNBRi0xMzQ0LgorICAgICAqIDxwPgorICAgICAqIFVDLTIgOiBSZWFkIGJ1ZmZlcmVkIGVudGl0eSBtdWx0aXBsZSB0aW1lcyBhbmQgdGhlbiB0cnkgdG8gY2xvc2UgdGhlIGNvbnRleHQKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkQnVmZmVyZWRFbnRpdHlNdWx0aXBsZVRpbWVzRnJvbVN0cmVhbVRoYXRGYWlsc1RvQ2xvc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ29ycnVwdGFibGVJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0gPSBuZXcgQ29ycnVwdGFibGVJbnB1dFN0cmVhbSgpOworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJyZXNwb25zZS9jb3JydXB0ZWQiKTsKKyAgICAgICAgdGFyZ2V0LnJlZ2lzdGVyKG5ldyBDbGllbnRSZXNwb25zZUZpbHRlcigpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoZmluYWwgQ2xpZW50UmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsIGZpbmFsIENsaWVudFJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQpIHsKKyAgICAgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuc2V0RW50aXR5U3RyZWFtKGVudGl0eVN0cmVhbSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSk7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5idWlsZEdldCgpLmludm9rZSgpOworICAgICAgICBlbnRpdHlTdHJlYW0uc2V0Q29ycnVwdENsb3NlKHRydWUpOworCisgICAgICAgIHJlc3BvbnNlLmJ1ZmZlckVudGl0eSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkNsb3NlIG5vdCBpbnZva2VkIG9uIHVuZGVybHlpbmcgaW5wdXQgc3RyZWFtLiIsIDEsIGVudGl0eVN0cmVhbS5nZXRDbG9zZUNvdW50KCkpOworCisgICAgICAgIFN0cmluZyBlbnRpdHk7CisgICAgICAgIGVudGl0eSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzLCBudWxsKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgiVW5leHBlY3RlZCByZXNwb25zZS4iLCBlbnRpdHkudG9TdHJpbmcoKSwgZXF1YWxUbyhSZXNvdXJjZS5FTlRJVFkpKTsKKyAgICAgICAgZW50aXR5ID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MsIG51bGwpOworICAgICAgICBhc3NlcnRUaGF0KCJVbmV4cGVjdGVkIHJlc3BvbnNlLiIsIGVudGl0eS50b1N0cmluZygpLCBlcXVhbFRvKFJlc291cmNlLkVOVElUWSkpOworCisgICAgICAgIC8vIENsb3NlIHNob3VsZCBub3QgZmFpbCBhbmQgc2hvdWxkIGJlIGlkZW1wb3RlbnQKKyAgICAgICAgcmVzcG9uc2UuY2xvc2UoKTsKKyAgICAgICAgcmVzcG9uc2UuY2xvc2UoKTsKKyAgICAgICAgcmVzcG9uc2UuY2xvc2UoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJDbG9zZSBpbnZva2VkIHRvbyBtYW55IHRpbWVzIG9uIHVuZGVybHlpbmcgaW5wdXQgc3RyZWFtLiIsIDEsIGVudGl0eVN0cmVhbS5nZXRDbG9zZUNvdW50KCkpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyBVQy0yLjEgOiBUcnkgdG8gcmVhZCBhIGJ1ZmZlcmVkIGVudGl0eSBmcm9tIGEgY2xvc2VkIGNvbnRleHQKKyAgICAgICAgICAgIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzLCBudWxsKTsKKyAgICAgICAgICAgIGZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCB3aGVuIHJlYWRpbmcgZnJvbSBhIGNsb3NlZCBidWZmZXJlZCBjb250ZXh0LiIpOworICAgICAgICAgICAgLy8gVUMtMi4xIDogRU5ECisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpc2UpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICAgICAgLy8gVUMtMiA6IEVORAorCisgICAgICAgIGVudGl0eVN0cmVhbS5yZXNldCgpOworCisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2QgdGVzdHMgYmVoYXZpb3Igb2YgaW5wdXQgc3RyZWFtIG9wZXJhdGlvbnMgaW4gY2FzZSB0aGUgdW5kZXJseWluZyBpbnB1dCBzdHJlYW0gdGhyb3dzIGFuIGV4Y2VwdGlvbiB3aGVuIGNsb3NlZC4KKyAgICAgKiBSZXByb2R1Y2VyIGZvciBKUkZDQUYtMTM0NC4KKyAgICAgKiA8cD4KKyAgICAgKiBVQy0zIDogVHJ5IHRvIGNsb3NlIHRoZSByZXNwb25zZSAtIHVuZGVybHlpbmcgZXhjZXB0aW9uIHNob3VsZCBiZSByZXBvcnRlZC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZVVucmVhZFJlc3BvbnNlV2l0aEVudGl0eVN0cmVhbVRoYXRGYWlsc1RvQ2xvc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ29ycnVwdGFibGVJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0gPSBuZXcgQ29ycnVwdGFibGVJbnB1dFN0cmVhbSgpOworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJyZXNwb25zZS9jb3JydXB0ZWQiKTsKKyAgICAgICAgdGFyZ2V0LnJlZ2lzdGVyKG5ldyBDbGllbnRSZXNwb25zZUZpbHRlcigpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoZmluYWwgQ2xpZW50UmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsIGZpbmFsIENsaWVudFJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQpIHsKKyAgICAgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuc2V0RW50aXR5U3RyZWFtKGVudGl0eVN0cmVhbSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSk7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5idWlsZEdldCgpLmludm9rZSgpOworICAgICAgICBlbnRpdHlTdHJlYW0uc2V0Q29ycnVwdENsb3NlKHRydWUpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXNwb25zZS5jbG9zZSgpOworICAgICAgICAgICAgZmFpbCgiUHJvY2Vzc2luZ0V4Y2VwdGlvbiBleHBlY3RlZCB3aGVuIGNsb3NpbmcgdGhlIGNvbnRleHQgYW5kIHVuZGVybHlpbmcgc3RyZWFtIHRocm93cyBhbiBJT0V4Y2VwdGlvbi4iKTsKKyAgICAgICAgfSBjYXRjaCAoUHJvY2Vzc2luZ0V4Y2VwdGlvbiBwZSkgeworICAgICAgICAgICAgYXNzZXJ0VGhhdChwZS5nZXRDYXVzZSgpLCBpbnN0YW5jZU9mKElPRXhjZXB0aW9uLmNsYXNzKSk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L1NodXRkb3duSG9va01lbW9yeUxlYWtUZXN0LmphdmEgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9TaHV0ZG93bkhvb2tNZW1vcnlMZWFrVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmZjRiNWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9TaHV0ZG93bkhvb2tNZW1vcnlMZWFrVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jbGllbnQ7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuYXBhY2hlLmNvbm5lY3Rvci5BcGFjaGVDb25uZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRMaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuSHR0cFVybENvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5KZXJzZXlDbGllbnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnNwaS5Db25uZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkuY29ubmVjdG9yLkdyaXp6bHlDb25uZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0eS5jb25uZWN0b3IuSmV0dHlDb25uZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKKworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIEVuc3VyZSBKZXJzZXkgY29ubmVjdG9ycyBkbyBub3QgbGVhayByZXNvdXJjZXMKKyAqIGluIGNhc2UgbXVsdGlwbGUgY2xpZW50IHJ1bnRpbWUgaW5zdGFuY2VzIGFyZSBiZWluZyBjcmVhdGVkLgorICoKKyAqIE9uIG15IGxhcHRvcCwgMTAwMCBpdGVyYXRpb25zIHdhcyBzdWZmaWNpZW50IHRvIGNhdXNlCisgKiBhIG1lbW9yeSBsZWFrIHVudGlsIEpFUlNFWS0yNjg4IGdvdCBmaXhlZC4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGNsYXNzIFNodXRkb3duSG9va01lbW9yeUxlYWtUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSCA9ICJ0ZXN0IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSVRFUkFUSU9OUyA9IDEwMDA7CisKKyAgICBwcml2YXRlIGZpbmFsIENvbm5lY3RvclByb3ZpZGVyIGNvbm5lY3RvclByb3ZpZGVyOworCisgICAgcHVibGljIFNodXRkb3duSG9va01lbW9yeUxlYWtUZXN0KGZpbmFsIENvbm5lY3RvclByb3ZpZGVyIGNwKSB7CisgICAgICAgIGNvbm5lY3RvclByb3ZpZGVyID0gY3A7CisgICAgfQorCisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzCisgICAgcHVibGljIHN0YXRpYyBMaXN0PENvbm5lY3RvclByb3ZpZGVyW10+IGNvbm5lY3Rpb25Qcm92aWRlcnMoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBDb25uZWN0b3JQcm92aWRlcltdW10geworICAgICAgICAgICAgICAgIHtuZXcgR3JpenpseUNvbm5lY3RvclByb3ZpZGVyKCl9LAorICAgICAgICAgICAgICAgIHtuZXcgSmV0dHlDb25uZWN0b3JQcm92aWRlcigpfSwKKyAgICAgICAgICAgICAgICB7bmV3IEFwYWNoZUNvbm5lY3RvclByb3ZpZGVyKCl9LAorICAgICAgICAgICAgICAgIHtuZXcgSHR0cFVybENvbm5lY3RvclByb3ZpZGVyKCl9CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBQYXRoKFBBVEgpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0UmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gIkdFVCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFRlc3RSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLmNvbm5lY3RvclByb3ZpZGVyKGNvbm5lY3RvclByb3ZpZGVyKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBJZ25vcmUoIlVuc3RhYmxlLCBpZ25vcmVkIGZvciBub3ciKQorICAgIHB1YmxpYyB2b2lkIHRlc3RDbGllbnREb2VzTm90TGVha1Jlc291cmNlcygpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGZpbmFsIEF0b21pY0ludGVnZXIgbGlzdGVuZXJzSW5pdGlhbGl6ZWQgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKKyAgICAgICAgZmluYWwgQXRvbWljSW50ZWdlciBsaXN0ZW5lcnNDbG9zZWQgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IElURVJBVElPTlM7IGkrKykgeworICAgICAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoUEFUSCkucHJvcGVydHkoImFub3RoZXIiLCAicnVudGltZSIpLnJlZ2lzdGVyKG5ldyBDbGllbnRMaWZlY3ljbGVMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkluaXQoKSB7CisgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyc0luaXRpYWxpemVkLmluY3JlbWVudEFuZEdldCgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xvc2UoKSB7CisgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyc0Nsb3NlZC5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KS5yZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcykucmVxdWVzdCgpLmdldCgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJHRVQiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICB9CisKKyAgICAgICAgQ29sbGVjdGlvbiBzaHV0ZG93bkhvb2tzID0gZ2V0U2h1dGRvd25Ib29rcyhjbGllbnQoKSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAiJXM6IG51bWJlciBvZiBpbml0aWFsaXplZCBsaXN0ZW5lcnMgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIG51bWJlciBvZiB0b3RhbCByZXF1ZXN0IGNvdW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RvclByb3ZpZGVyLmdldENsYXNzKCkpLAorICAgICAgICAgICAgICAgIGxpc3RlbmVyc0luaXRpYWxpemVkLmdldCgpLCBpcyhJVEVSQVRJT05TKSk7CisKKy8vICAgICAgdGhlIGZvbGxvd2luZyBjaGVjayBpcyBmcmFnaWxlLCBhcyBHQyBjb3VsZCBicmVhayBpdCBlYXNpbHkKKy8vICAgICAgICBhc3NlcnRUaGF0KFN0cmluZy5mb3JtYXQoCisvLyAgICAgICAgICAgICAgICAiJXM6IG51bWJlciBvZiBjbG9zZWQgbGlzdGVuZXJzIHNob3VsZCBjb3JyZXNwb25kIHRvIHRoZSBudW1iZXIgb2YgbWlzc2luZyBob29rcyIsCisvLyAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RvclByb3ZpZGVyLmdldENsYXNzKCkpLAorLy8gICAgICAgICAgICAgICAgbGlzdGVuZXJzQ2xvc2VkLmdldCgpLCBpcyhJVEVSQVRJT05TIC0gc2h1dGRvd25Ib29rcy5zaXplKCkpKTsKKworICAgICAgICBjbGllbnQoKS5jbG9zZSgpOyAgICAgIC8vIGNsZWFuIHVwIHRoZSByZXN0CisKKyAgICAgICAgYXNzZXJ0VGhhdChTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBudW1iZXIgb2YgY2xvc2VkIGxpc3RlbmVycyBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiB0b3RhbCByZXF1ZXN0cyBtYWRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3RvclByb3ZpZGVyLmdldENsYXNzKCkpLAorICAgICAgICAgICAgICAgIGxpc3RlbmVyc0Nsb3NlZC5nZXQoKSwgaXMoSVRFUkFUSU9OUykpOworICAgIH0KKworICAgIHByaXZhdGUgQ29sbGVjdGlvbiBnZXRTaHV0ZG93bkhvb2tzKGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQgY2xpZW50KSB0aHJvd3MgTm9TdWNoRmllbGRFeGNlcHRpb24sIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24geworICAgICAgICBKZXJzZXlDbGllbnQgamVyc2V5Q2xpZW50ID0gKEplcnNleUNsaWVudCkgY2xpZW50OworICAgICAgICBGaWVsZCBzaHV0ZG93bkhvb2tzRmllbGQgPSBKZXJzZXlDbGllbnQuY2xhc3MuZ2V0RGVjbGFyZWRGaWVsZCgic2h1dGRvd25Ib29rcyIpOworICAgICAgICBzaHV0ZG93bkhvb2tzRmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKKyAgICAgICAgcmV0dXJuIChDb2xsZWN0aW9uKSBzaHV0ZG93bkhvb2tzRmllbGQuZ2V0KGplcnNleUNsaWVudCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvVGltZW91dFRlc3QuamF2YSBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L1RpbWVvdXRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA3MzIxZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L1RpbWVvdXRUZXN0LmphdmEKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY2xpZW50OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIFRpbWVvdXRUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisgICAgQFBhdGgoIi90ZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRpbWVvdXRSZXNvdXJjZSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gIkdFVCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJ0aW1lb3V0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRUaW1lb3V0KCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNTAwMCk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAiR0VUIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoVGltZW91dFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcucHJvcGVydHkoQ2xpZW50UHJvcGVydGllcy5SRUFEX1RJTUVPVVQsIDIwMDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZhc3QoKSB7CisgICAgICAgIFJlc3BvbnNlIHIgPSB0YXJnZXQoInRlc3QiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHIuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCIsIHIucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTbG93KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGFyZ2V0KCJ0ZXN0L3RpbWVvdXQiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgICAgICBmYWlsKCJUaW1lb3V0IGV4cGVjdGVkLiIpOworICAgICAgICB9IGNhdGNoIChQcm9jZXNzaW5nRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGlmICghKGUuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKSkgeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgZmFpbCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvY29ubmVjdG9yL0h0dHBQYXRjaFRlc3QuamF2YSBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L2Nvbm5lY3Rvci9IdHRwUGF0Y2hUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg4NmVmMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L2Nvbm5lY3Rvci9IdHRwUGF0Y2hUZXN0LmphdmEKQEAgLTAsMCArMSwxNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNsaWVudC5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbXBsZXRpb25TdGFnZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuUEFUQ0g7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuYXBhY2hlLmNvbm5lY3Rvci5BcGFjaGVDb25uZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5zcGkuQ29ubmVjdG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseS5jb25uZWN0b3IuR3JpenpseUNvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lmpkay5jb25uZWN0b3IuSmRrQ29ubmVjdG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dHkuY29ubmVjdG9yLkpldHR5Q29ubmVjdG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5uZXR0eS5jb25uZWN0b3IuTmV0dHlDb25uZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGNsYXNzIEh0dHBQYXRjaFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFJlcXVlc3RIZWFkZXJNb2RpZmljYXRpb25zVGVzdC5jbGFzcy5nZXROYW1lKCkpOworCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gIntpbmRleH06IHswfSIpCisgICAgcHVibGljIHN0YXRpYyBMaXN0PE9iamVjdFtdPiB0ZXN0RGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW117CisgICAgICAgICAgICAgICAgLy8ge0h0dHBVcmxDb25uZWN0b3JQcm92aWRlci5jbGFzc30sIC8vIGNhbm5vdCBwcm9jZXNzIFBBVENIIHdpdGhvdXQgYWRkaXRpb25hbCBjb25maWd1cmF0aW9uCisgICAgICAgICAgICAgICAge0dyaXp6bHlDb25uZWN0b3JQcm92aWRlci5jbGFzc30sCisgICAgICAgICAgICAgICAge0pldHR5Q29ubmVjdG9yUHJvdmlkZXIuY2xhc3N9LCAvLyB1bnN0YWJsZS4KKyAgICAgICAgICAgICAgICB7QXBhY2hlQ29ubmVjdG9yUHJvdmlkZXIuY2xhc3N9LAorICAgICAgICAgICAgICAgIHtHcml6emx5Q29ubmVjdG9yUHJvdmlkZXIuY2xhc3N9LAorICAgICAgICAgICAgICAgIHtOZXR0eUNvbm5lY3RvclByb3ZpZGVyLmNsYXNzfSwKKyAgICAgICAgICAgICAgICB7SmRrQ29ubmVjdG9yUHJvdmlkZXIuY2xhc3N9LAorICAgICAgICAgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgQ29ubmVjdG9yUHJvdmlkZXIgY29ubmVjdG9yUHJvdmlkZXI7CisKKyAgICBwdWJsaWMgSHR0cFBhdGNoVGVzdChDbGFzczw/IGV4dGVuZHMgQ29ubmVjdG9yUHJvdmlkZXI+IGNvbm5lY3RvclByb3ZpZGVyQ2xhc3MpCisgICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMuY29ubmVjdG9yUHJvdmlkZXIgPSBjb25uZWN0b3JQcm92aWRlckNsYXNzLm5ld0luc3RhbmNlKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgc2V0KFRlc3RQcm9wZXJ0aWVzLlJFQ09SRF9MT0dfTEVWRUwsIExldmVsLldBUk5JTkcuaW50VmFsdWUoKSk7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUGF0Y2hSZXNvdXJjZS5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIobmV3IExvZ2dpbmdGZWF0dXJlKExPR0dFUiwgTG9nZ2luZ0ZlYXR1cmUuVmVyYm9zaXR5LkhFQURFUlNfT05MWSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY2xpZW50Q29uZmlnKSB7CisgICAgICAgIGNsaWVudENvbmZpZy5jb25uZWN0b3JQcm92aWRlcihjb25uZWN0b3JQcm92aWRlcik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGF0Y2hSZXNwb25zZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5tZXRob2QoIlBBVENIIiwgRW50aXR5LnRleHQoInBhdGNoIikpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXRjaCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGF0Y2hFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLm1ldGhvZCgiUEFUQ0giLCBFbnRpdHkudGV4dCgicGF0Y2giKSwgU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoInBhdGNoIiwgcmVzcG9uc2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBhdGNoR2VuZXJpY1R5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLm1ldGhvZCgiUEFUQ0giLCBFbnRpdHkudGV4dCgicGF0Y2giKSwgbmV3IEdlbmVyaWNUeXBlPFN0cmluZz4oKSB7CisgICAgICAgIH0pOworCisgICAgICAgIGFzc2VydEVxdWFscygicGF0Y2giLCByZXNwb25zZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNQYXRjaFJlc3BvbnNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEZ1dHVyZTxSZXNwb25zZT4gcmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkuYXN5bmMoKS5tZXRob2QoIlBBVENIIiwgRW50aXR5LnRleHQoInBhdGNoIikpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldCgpLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwYXRjaCIsIHJlc3BvbnNlLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNQYXRjaEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBGdXR1cmU8U3RyaW5nPiByZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5hc3luYygpLm1ldGhvZCgiUEFUQ0giLCBFbnRpdHkudGV4dCgicGF0Y2giKSwgU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoInBhdGNoIiwgcmVzcG9uc2UuZ2V0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFzeW5jUGF0Y2hHZW5lcmljVHlwZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBGdXR1cmU8U3RyaW5nPiByZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5hc3luYygpLm1ldGhvZCgiUEFUQ0giLCBFbnRpdHkudGV4dCgicGF0Y2giKSwgbmV3IEdlbmVyaWNUeXBlPFN0cmluZz4oKSB7CisgICAgICAgIH0pOworCisgICAgICAgIGFzc2VydEVxdWFscygicGF0Y2giLCByZXNwb25zZS5nZXQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UnhQYXRjaFJlc3BvbnNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENvbXBsZXRpb25TdGFnZTxSZXNwb25zZT4gcmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkucngoKS5tZXRob2QoIlBBVENIIiwgRW50aXR5LnRleHQoInBhdGNoIikpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLnRvQ29tcGxldGFibGVGdXR1cmUoKS5nZXQoKS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygicGF0Y2giLCByZXNwb25zZS50b0NvbXBsZXRhYmxlRnV0dXJlKCkuZ2V0KCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSeFBhdGNoRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIENvbXBsZXRpb25TdGFnZTxTdHJpbmc+IHJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLnJ4KCkubWV0aG9kKCJQQVRDSCIsIEVudGl0eS50ZXh0KCJwYXRjaCIpLCBTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscygicGF0Y2giLCByZXNwb25zZS50b0NvbXBsZXRhYmxlRnV0dXJlKCkuZ2V0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJ4UGF0Y2hHZW5lcmljVHlwZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDb21wbGV0aW9uU3RhZ2U8U3RyaW5nPiByZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5yeCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWV0aG9kKCJQQVRDSCIsIEVudGl0eS50ZXh0KCJwYXRjaCIpLCBuZXcgR2VuZXJpY1R5cGU8U3RyaW5nPigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgIGFzc2VydEVxdWFscygicGF0Y2giLCByZXNwb25zZS50b0NvbXBsZXRhYmxlRnV0dXJlKCkuZ2V0KCkpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhdGNoUmVzb3VyY2UgeworCisgICAgICAgIEBQQVRDSAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBhdGNoKFN0cmluZyBlbnRpdHkpIHsKKworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTRVJWRVI6IHBhdGNoIHJlcXVlc3QgcmVjZWl2ZWQuIik7CisKKyAgICAgICAgICAgIHJldHVybiBlbnRpdHk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9jb25uZWN0b3IvUmVxdWVzdEhlYWRlck1vZGlmaWNhdGlvbnNUZXN0LmphdmEgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9jb25uZWN0b3IvUmVxdWVzdEhlYWRlck1vZGlmaWNhdGlvbnNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZhYjRkYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L2Nvbm5lY3Rvci9SZXF1ZXN0SGVhZGVyTW9kaWZpY2F0aW9uc1Rlc3QuamF2YQpAQCAtMCwwICsxLDI5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY2xpZW50LmNvbm5lY3RvcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2Nhbm5lcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkdaSVBJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkdaSVBPdXRwdXRTdHJlYW07CisKK2ltcG9ydCBqYXZheC53cy5ycy5IZWFkZXJQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJpb3JpdGllczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQXN5bmNJbnZva2VyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5JbnZvY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yQ29udGV4dDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJpb3JpdHk7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5hcGFjaGUuY29ubmVjdG9yLkFwYWNoZUNvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50Lkh0dHBVcmxDb25uZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuc3BpLkNvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseS5jb25uZWN0b3IuR3JpenpseUNvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHR5LmNvbm5lY3Rvci5KZXR0eUNvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuY29udGFpbnNTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIEpFUlNFWS0yMjA2IHJlcHJvZHVjZXIKKyAqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGNsYXNzIFJlcXVlc3RIZWFkZXJNb2RpZmljYXRpb25zVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoUmVxdWVzdEhlYWRlck1vZGlmaWNhdGlvbnNUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBHWklQID0gZmFsc2U7IC8vIGNoYW5nZSB0byB0cnVlIHdoZW4gSkVSU0VZLTIzNDEgZml4ZWQKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERVTVBfRU5USVRZID0gZmFsc2U7IC8vIEkgaGF2ZSB0cm91YmxlcyB0byBkdW1wIGVudGl0eSB3aXRoIGFzeW5jIGpldHR5IQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFFVRVNUSU9OID0gIlFVRVNUSU9OIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQU5TV0VSID0gIkFOU1dFUiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVFU1RfSEVBREVSX05BTUVfQ0xJRU5UID0gIkNsaWVudC1Qcm9wIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUVTVF9IRUFERVJfVkFMVUVfQ0xJRU5UID0gIkNsaWVudC1WYWx1ZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVFU1RfSEVBREVSX05BTUVfRklMVEVSID0gIkZpbHRlci1Qcm9wIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUVTVF9IRUFERVJfVkFMVUVfRklMVEVSID0gIkZpbHRlci1WYWx1ZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVFU1RfSEVBREVSX05BTUVfSU5URVJDRVBUT1IgPSAiSWNlcHRvci1Qcm9wIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUVTVF9IRUFERVJfVkFMVUVfSU5URVJDRVBUT1IgPSAiSWNlcHRvci1WYWx1ZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVFU1RfSEVBREVSX05BTUVfTUJXID0gIk1idy1Qcm9wIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUVTVF9IRUFERVJfVkFMVUVfTUJXID0gIk1idy1WYWx1ZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVFU1RfSEVBREVSX01PRElGSUNBVElPTl9TVVBQT1JURUQgPSAibW9kaWZpY2F0aW9uU3VwcG9ydGVkIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSCA9ICIvcmVzb3VyY2UiOworCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gIntpbmRleH06IHswfSAvIG1vZGlmaWNhdGlvblN1cHBvcnRlZD0gezF9IC8gYWRkSGVhZGVyPSB7Mn0iKQorICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPYmplY3RbXT4gdGVzdERhdGEoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXVtdIHsKKyAgICAgICAgICAgICAgICB7SHR0cFVybENvbm5lY3RvclByb3ZpZGVyLmNsYXNzLCB0cnVlLCBmYWxzZX0sCisgICAgICAgICAgICAgICAge0dyaXp6bHlDb25uZWN0b3JQcm92aWRlci5jbGFzcywgZmFsc2UsIGZhbHNlfSwgLy8gY2hhbmdlIHRvIHRydWUgd2hlbiBKRVJTRVktMjM0MSBmaXhlZAorICAgICAgICAgICAgICAgIHtKZXR0eUNvbm5lY3RvclByb3ZpZGVyLmNsYXNzLCBmYWxzZSwgZmFsc2V9LCAvLyBjaGFuZ2UgdG8gdHJ1ZSB3aGVuIEpFUlNFWS0yMzQxIGZpeGVkCisgICAgICAgICAgICAgICAge0FwYWNoZUNvbm5lY3RvclByb3ZpZGVyLmNsYXNzLCBmYWxzZSwgZmFsc2V9LCAvLyBjaGFuZ2UgdG8gdHJ1ZSB3aGVuIEpFUlNFWS0yMzQxIGZpeGVkCisgICAgICAgICAgICAgICAge0h0dHBVcmxDb25uZWN0b3JQcm92aWRlci5jbGFzcywgdHJ1ZSwgdHJ1ZX0sCisgICAgICAgICAgICAgICAge0dyaXp6bHlDb25uZWN0b3JQcm92aWRlci5jbGFzcywgZmFsc2UsIHRydWV9LCAvLyBjaGFuZ2UgdG8gdHJ1ZSB3aGVuIEpFUlNFWS0yMzQxIGZpeGVkCisgICAgICAgICAgICAgICAge0pldHR5Q29ubmVjdG9yUHJvdmlkZXIuY2xhc3MsIGZhbHNlLCB0cnVlfSwgLy8gY2hhbmdlIHRvIHRydWUgd2hlbiBKRVJTRVktMjM0MSBmaXhlZAorICAgICAgICAgICAgICAgIHtBcGFjaGVDb25uZWN0b3JQcm92aWRlci5jbGFzcywgZmFsc2UsIHRydWV9LCAvLyBjaGFuZ2UgdG8gdHJ1ZSB3aGVuIEpFUlNFWS0yMzQxIGZpeGVkCisgICAgICAgIH0pOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgQ29ubmVjdG9yUHJvdmlkZXIgY29ubmVjdG9yUHJvdmlkZXI7CisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1vZGlmaWNhdGlvblN1cHBvcnRlZDsgLy8gcmVtb3ZlIHdoZW4gSkVSU0VZLTIzNDEgZml4ZWQKKyAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gYWRkSGVhZGVyOworCisgICAgcHVibGljIFJlcXVlc3RIZWFkZXJNb2RpZmljYXRpb25zVGVzdChDbGFzczw/IGV4dGVuZHMgQ29ubmVjdG9yUHJvdmlkZXI+IGNvbm5lY3RvclByb3ZpZGVyQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIG1vZGlmaWNhdGlvblN1cHBvcnRlZCwgYm9vbGVhbiBhZGRIZWFkZXIpCisgICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRoaXMuY29ubmVjdG9yUHJvdmlkZXIgPSBjb25uZWN0b3JQcm92aWRlckNsYXNzLm5ld0luc3RhbmNlKCk7CisgICAgICAgIHRoaXMubW9kaWZpY2F0aW9uU3VwcG9ydGVkID0gbW9kaWZpY2F0aW9uU3VwcG9ydGVkOworICAgICAgICB0aGlzLmFkZEhlYWRlciA9IGFkZEhlYWRlcjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBzZXQoVGVzdFByb3BlcnRpZXMuUkVDT1JEX0xPR19MRVZFTCwgTGV2ZWwuV0FSTklORy5pbnRWYWx1ZSgpKTsKKworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworICAgICAgICBpZiAoRFVNUF9FTlRJVFkpIHsKKyAgICAgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5EVU1QX0VOVElUWSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhUZXN0UmVzb3VyY2UuY2xhc3MpLnJlZ2lzdGVyKG5ldyBMb2dnaW5nRmVhdHVyZShMT0dHRVIsIExvZ2dpbmdGZWF0dXJlLlZlcmJvc2l0eS5IRUFERVJTX09OTFkpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNsaWVudENvbmZpZykgeworICAgICAgICBjbGllbnRDb25maWcucmVnaXN0ZXIoTXlDbGllbnRSZXF1ZXN0RmlsdGVyLmNsYXNzKTsKKyAgICAgICAgY2xpZW50Q29uZmlnLnJlZ2lzdGVyKG5ldyBNeVdyaXRlckludGVyY2VwdG9yKGFkZEhlYWRlcikpOworICAgICAgICBjbGllbnRDb25maWcucmVnaXN0ZXIobmV3IE15TWVzc2FnZUJvZHlXcml0ZXIoYWRkSGVhZGVyKSk7CisgICAgICAgIGNsaWVudENvbmZpZy5jb25uZWN0b3JQcm92aWRlcihjb25uZWN0b3JQcm92aWRlcik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2FybmluZ0xvZ2dlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHJlcXVlc3RCdWlsZGVyKCkucG9zdChyZXF1ZXN0RW50aXR5KCkpOworICAgICAgICBhc3NlcnRSZXNwb25zZShyZXNwb25zZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2FybmluZ0xvZ2dlZEFzeW5jKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEFzeW5jSW52b2tlciBhc3luY0ludm9rZXIgPSByZXF1ZXN0QnVpbGRlcigpLmFzeW5jKCk7CisgICAgICAgIEZ1dHVyZTxSZXNwb25zZT4gcmVzcG9uc2VGdXR1cmUgPSBhc3luY0ludm9rZXIucG9zdChyZXF1ZXN0RW50aXR5KCkpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHJlc3BvbnNlRnV0dXJlLmdldCgpOworICAgICAgICBhc3NlcnRSZXNwb25zZShyZXNwb25zZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBJbnZvY2F0aW9uLkJ1aWxkZXIgcmVxdWVzdEJ1aWxkZXIoKSB7CisgICAgICAgIHJldHVybiB0YXJnZXQoUEFUSCkKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLmhlYWRlcihSRVFVRVNUX0hFQURFUl9OQU1FX0NMSUVOVCwgUkVRVUVTVF9IRUFERVJfVkFMVUVfQ0xJRU5UKQorICAgICAgICAgICAgICAgIC5oZWFkZXIoUkVRVUVTVF9IRUFERVJfTU9ESUZJQ0FUSU9OX1NVUFBPUlRFRCwgbW9kaWZpY2F0aW9uU3VwcG9ydGVkICYmIGFkZEhlYWRlcikKKyAgICAgICAgICAgICAgICAuaGVhZGVyKCJoZWxsbyIsICJkb3VibGUiKS5oZWFkZXIoImhlbGxvIiwgInZhbHVlIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBFbnRpdHk8TXlFbnRpdHk+IHJlcXVlc3RFbnRpdHkoKSB7CisgICAgICAgIHJldHVybiBFbnRpdHkudGV4dChuZXcgTXlFbnRpdHkoUVVFU1RJT04pKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0UmVzcG9uc2UoUmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgaWYgKCFtb2RpZmljYXRpb25TdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBVTlNFTlRfSEVBREVSX0NIQU5HRVMgPSAiVW5zZW50IGhlYWRlciBjaGFuZ2VzIjsKKyAgICAgICAgICAgIExvZ1JlY29yZCBsb2dSZWNvcmQgPSBmaW5kTG9nUmVjb3JkKFVOU0VOVF9IRUFERVJfQ0hBTkdFUyk7CisgICAgICAgICAgICBpZiAoYWRkSGVhZGVyKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTWlzc2luZyBMb2dSZWNvcmQgZm9yIG1lc3NhZ2UgJyIgKyBVTlNFTlRfSEVBREVSX0NIQU5HRVMgKyAiJy4iLCBsb2dSZWNvcmQpOworICAgICAgICAgICAgICAgIGFzc2VydFRoYXQobG9nUmVjb3JkLmdldE1lc3NhZ2UoKSwgY29udGFpbnNTdHJpbmcoUkVRVUVTVF9IRUFERVJfTkFNRV9JTlRFUkNFUFRPUikpOworICAgICAgICAgICAgICAgIGFzc2VydFRoYXQobG9nUmVjb3JkLmdldE1lc3NhZ2UoKSwgY29udGFpbnNTdHJpbmcoUkVRVUVTVF9IRUFERVJfTkFNRV9NQlcpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0TnVsbCgiVW5leHBlY3RlZCBMb2dSZWNvcmQgZm9yIG1lc3NhZ2UgJyIgKyBVTlNFTlRfSEVBREVSX0NIQU5HRVMgKyAiJy4iLCBsb2dSZWNvcmQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoQU5TV0VSLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIHByaXZhdGUgTG9nUmVjb3JkIGZpbmRMb2dSZWNvcmQoU3RyaW5nIG1lc3NhZ2VDb250YWlucykgeworICAgICAgICBmb3IgKGZpbmFsIExvZ1JlY29yZCByZWNvcmQgOiBnZXRMb2dnZWRSZWNvcmRzKCkpIHsKKyAgICAgICAgICAgIGlmIChyZWNvcmQuZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKG1lc3NhZ2VDb250YWlucykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVjb3JkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBQYXRoKFBBVEgpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0UmVzb3VyY2UgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgaGFuZGxlKElucHV0U3RyZWFtIHF1ZXN0aW9uU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBASGVhZGVyUGFyYW0oUkVRVUVTVF9IRUFERVJfTkFNRV9DTElFTlQpIFN0cmluZyBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBIZWFkZXJQYXJhbShSRVFVRVNUX0hFQURFUl9OQU1FX0ZJTFRFUikgU3RyaW5nIGZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQEhlYWRlclBhcmFtKFJFUVVFU1RfSEVBREVSX05BTUVfSU5URVJDRVBUT1IpIFN0cmluZyBpbnRlcmNlcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQEhlYWRlclBhcmFtKFJFUVVFU1RfSEVBREVSX05BTUVfTUJXKSBTdHJpbmcgbWJ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBASGVhZGVyUGFyYW0oUkVRVUVTVF9IRUFERVJfTU9ESUZJQ0FUSU9OX1NVUFBPUlRFRCkgYm9vbGVhbiBtb2RpZmljYXRpb25TdXBwb3J0ZWQpCisgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhSRVFVRVNUX0hFQURFUl9WQUxVRV9DTElFTlQsIGNsaWVudCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoUkVRVUVTVF9IRUFERVJfVkFMVUVfRklMVEVSLCBmaWx0ZXIpOworICAgICAgICAgICAgaWYgKG1vZGlmaWNhdGlvblN1cHBvcnRlZCkgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhSRVFVRVNUX0hFQURFUl9WQUxVRV9JTlRFUkNFUFRPUiwgaW50ZXJjZXB0b3IpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhSRVFVRVNUX0hFQURFUl9WQUxVRV9NQlcsIG1idyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoUVVFU1RJT04sIG5ldyBTY2FubmVyKEdaSVAgPyBuZXcgR1pJUElucHV0U3RyZWFtKHF1ZXN0aW9uU3RyZWFtKSA6IHF1ZXN0aW9uU3RyZWFtKS5uZXh0TGluZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBBTlNXRVI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15V3JpdGVySW50ZXJjZXB0b3IgaW1wbGVtZW50cyBXcml0ZXJJbnRlcmNlcHRvciB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGFkZEhlYWRlcjsKKworICAgICAgICBwdWJsaWMgTXlXcml0ZXJJbnRlcmNlcHRvcihib29sZWFuIGFkZEhlYWRlcikgeworICAgICAgICAgICAgdGhpcy5hZGRIZWFkZXIgPSBhZGRIZWFkZXI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYXJvdW5kV3JpdGVUbyhXcml0ZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoYWRkSGVhZGVyKSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5nZXRIZWFkZXJzKCkuYWRkKFJFUVVFU1RfSEVBREVSX05BTUVfSU5URVJDRVBUT1IsIFJFUVVFU1RfSEVBREVSX1ZBTFVFX0lOVEVSQ0VQVE9SKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChHWklQKSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5zZXRPdXRwdXRTdHJlYW0obmV3IEdaSVBPdXRwdXRTdHJlYW0oY29udGV4dC5nZXRPdXRwdXRTdHJlYW0oKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGV4dC5wcm9jZWVkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15Q2xpZW50UmVxdWVzdEZpbHRlciBpbXBsZW1lbnRzIENsaWVudFJlcXVlc3RGaWx0ZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ2xpZW50UmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5nZXRIZWFkZXJzKCkuYWRkKFJFUVVFU1RfSEVBREVSX05BTUVfRklMVEVSLCBSRVFVRVNUX0hFQURFUl9WQUxVRV9GSUxURVIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFByaW9yaXR5KFByaW9yaXRpZXMuRU5USVRZX0NPREVSKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlNZXNzYWdlQm9keVdyaXRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5V3JpdGVyPE15RW50aXR5PiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGFkZEhlYWRlcjsKKworICAgICAgICBwdWJsaWMgTXlNZXNzYWdlQm9keVdyaXRlcihib29sZWFuIGFkZEhlYWRlcikgeworICAgICAgICAgICAgdGhpcy5hZGRIZWFkZXIgPSBhZGRIZWFkZXI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoQ2xhc3MgdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKE15RW50aXR5IG8sIENsYXNzIHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOyAvL2lnbm9yZWQKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKE15RW50aXR5IG8sIENsYXNzIHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcCBodHRwSGVhZGVycywgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkKKyAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChhZGRIZWFkZXIpIHsKKyAgICAgICAgICAgICAgICBodHRwSGVhZGVycy5hZGQoUkVRVUVTVF9IRUFERVJfTkFNRV9NQlcsIFJFUVVFU1RfSEVBREVSX1ZBTFVFX01CVyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbnRpdHlTdHJlYW0ud3JpdGUoby5nZXRWYWx1ZSgpLmdldEJ5dGVzKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUVudGl0eSB7CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKyAgICAgICAgcHVibGljIE15RW50aXR5KCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE15RW50aXR5KFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9jb25uZWN0b3Ivc3NsL0Fic3RyYWN0Q29ubmVjdG9yU2VydmVyVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvY29ubmVjdG9yL3NzbC9BYnN0cmFjdENvbm5lY3RvclNlcnZlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDMxNWY0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvY29ubmVjdG9yL3NzbC9BYnN0cmFjdENvbm5lY3RvclNlcnZlclRlc3QuamF2YQpAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY2xpZW50LmNvbm5lY3Rvci5zc2w7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMQ29udGV4dDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LlNzbENvbmZpZ3VyYXRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5hcGFjaGUuY29ubmVjdG9yLkFwYWNoZUNvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5IdHRwVXJsQ29ubmVjdG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnNwaS5Db25uZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5LmNvbm5lY3Rvci5Hcml6emx5Q29ubmVjdG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dHkuY29ubmVjdG9yLkpldHR5Q29ubmVjdG9yUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmlvLkJ5dGVTdHJlYW1zOworCisvKioKKyAqIFNTTCBjb25uZWN0b3IgaG9zdG5hbWUgdmVyaWZpY2F0aW9uIHRlc3RzLgorICoKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29ubmVjdG9yU2VydmVyVGVzdCB7CisKKyAgICAvLyBEZWZhdWx0IHRydXN0c3RvcmUgYW5kIGtleXN0b3JlCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENMSUVOVF9UUlVTVF9TVE9SRSA9ICJ0cnVzdHN0b3JlLWxvY2FsaG9zdC1jbGllbnQiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWRVJfS0VZX1NUT1JFID0gImtleXN0b3JlLWxvY2FsaG9zdC1zZXJ2ZXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTElFTlRfS0VZX1NUT1JFID0gImtleXN0b3JlLWNsaWVudCI7CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHBhcmFtZXRlcnMgcHJvdmlkZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRlc3QgcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKG5hbWUgPSAie2luZGV4fTogezB9IikKKyAgICBwdWJsaWMgc3RhdGljIEl0ZXJhYmxlPE9iamVjdFtdPiB0ZXN0RGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW10geworICAgICAgICAgICAgICAgIHtuZXcgSHR0cFVybENvbm5lY3RvclByb3ZpZGVyKCl9LAorICAgICAgICAgICAgICAgIHtuZXcgR3JpenpseUNvbm5lY3RvclByb3ZpZGVyKCl9LAorICAgICAgICAgICAgICAgIHtuZXcgSmV0dHlDb25uZWN0b3JQcm92aWRlcigpfSwKKyAgICAgICAgICAgICAgICB7bmV3IEFwYWNoZUNvbm5lY3RvclByb3ZpZGVyKCl9CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcigwKQorICAgIHB1YmxpYyBDb25uZWN0b3JQcm92aWRlciBjb25uZWN0b3JQcm92aWRlcjsKKworICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IHNlcnZlckd1YXJkID0gbmV3IE9iamVjdCgpOworICAgIHByaXZhdGUgU2VydmVyIHNlcnZlciA9IG51bGw7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3luY2hyb25pemVkIChzZXJ2ZXJHdWFyZCkgeworICAgICAgICAgICAgaWYgKHNlcnZlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICJUZXN0IHJ1biBzeW5jIGlzc3VlOiBBbm90aGVyIGluc3RhbmNlIG9mIHRoZSBTU0wtc2VjdXJlZCBIVFRQIHRlc3Qgc2VydmVyIGhhcyBiZWVuIGFscmVhZHkgc3RhcnRlZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlcnZlciA9IFNlcnZlci5zdGFydChzZXJ2ZXJLZXlTdG9yZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN5bmNocm9uaXplZCAoc2VydmVyR3VhcmQpIHsKKyAgICAgICAgICAgIGlmIChzZXJ2ZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRlc3QgcnVuIHN5bmMgaXNzdWU6IFRoZXJlIGlzIG5vIFNTTC1zZWN1cmVkIEhUVFAgdGVzdCBzZXJ2ZXIgdG8gc3RvcC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNlcnZlci5zdG9wKCk7CisgICAgICAgICAgICBzZXJ2ZXIgPSBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIFNTTENvbnRleHQgZ2V0U3NsQ29udGV4dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIHRydXN0U3RvcmUgPSBTc2xDb25uZWN0b3JDb25maWd1cmF0aW9uVGVzdC5jbGFzcy5nZXRSZXNvdXJjZUFzU3RyZWFtKGNsaWVudFRydXN0U3RvcmUoKSk7CisgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGtleVN0b3JlID0gU3NsQ29ubmVjdG9yQ29uZmlndXJhdGlvblRlc3QuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbShDTElFTlRfS0VZX1NUT1JFKTsKKyAgICAgICAgcmV0dXJuIFNzbENvbmZpZ3VyYXRvci5uZXdJbnN0YW5jZSgpCisgICAgICAgICAgICAgICAgLnRydXN0U3RvcmVCeXRlcyhCeXRlU3RyZWFtcy50b0J5dGVBcnJheSh0cnVzdFN0b3JlKSkKKyAgICAgICAgICAgICAgICAudHJ1c3RTdG9yZVBhc3N3b3JkKCJhc2RmZ2giKQorICAgICAgICAgICAgICAgIC5rZXlTdG9yZUJ5dGVzKEJ5dGVTdHJlYW1zLnRvQnl0ZUFycmF5KGtleVN0b3JlKSkKKyAgICAgICAgICAgICAgICAua2V5UGFzc3dvcmQoImFzZGZnaCIpCisgICAgICAgICAgICAgICAgLmNyZWF0ZVNTTENvbnRleHQoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHNlcnZlcktleVN0b3JlKCkgeworICAgICAgICByZXR1cm4gU0VSVkVSX0tFWV9TVE9SRTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGNsaWVudFRydXN0U3RvcmUoKSB7CisgICAgICAgIHJldHVybiBDTElFTlRfVFJVU1RfU1RPUkU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvY29ubmVjdG9yL3NzbC9BdXRoZW50aWNhdGlvbkV4Y2VwdGlvbi5qYXZhIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvY29ubmVjdG9yL3NzbC9BdXRoZW50aWNhdGlvbkV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NmNmODUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9jb25uZWN0b3Ivc3NsL0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY2xpZW50LmNvbm5lY3Rvci5zc2w7CisKKy8qKgorICogQSBydW50aW1lIGV4Y2VwdGlvbiByZXByZXNlbnRpbmcgYSBmYWlsdXJlIHRvIHByb3ZpZGUgY29ycmVjdCBhdXRoZW50aWNhdGlvbiBjcmVkZW50aWFscy4KKyAqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQXV0aGVudGljYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgYXV0aGVudGljYXRpb24gZXhjZXB0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2UgZXJyb3IgbWVzc2FnZS4KKyAgICAgKiBAcGFyYW0gcmVhbG0gICBzZWN1cml0eSByZWFsbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgQXV0aGVudGljYXRpb25FeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFN0cmluZyByZWFsbSkgeworICAgICAgICBzdXBlcihtZXNzYWdlKTsKKyAgICAgICAgdGhpcy5yZWFsbSA9IHJlYWxtOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHJlYWxtID0gbnVsbDsKKworICAgIC8qKgorICAgICAqIEdldCBzZWN1cml0eSByZWFsbS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gc2VjdXJpdHkgcmVhbG0uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRSZWFsbSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMucmVhbG07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvY29ubmVjdG9yL3NzbC9BdXRoZW50aWNhdGlvbkV4Y2VwdGlvbk1hcHBlci5qYXZhIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvY29ubmVjdG9yL3NzbC9BdXRoZW50aWNhdGlvbkV4Y2VwdGlvbk1hcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzOTEyZjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9jb25uZWN0b3Ivc3NsL0F1dGhlbnRpY2F0aW9uRXhjZXB0aW9uTWFwcGVyLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY2xpZW50LmNvbm5lY3Rvci5zc2w7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2UuU3RhdHVzOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5FeGNlcHRpb25NYXBwZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCisvKioKKyAqIE1hcCBhbiBhdXRoZW50aWNhdGlvbiBleGNlcHRpb24gdG8gYW4gSFRUUCA0MDEgcmVzcG9uc2UsCisgKiBvcHRpb25hbGx5IGluY2x1ZGluZyB0aGUgcmVhbG0gZm9yIGEgY3JlZGVudGlhbHMgY2hhbGxlbmdlIGF0IHRoZSBjbGllbnQuCisgKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFByb3ZpZGVyCitwdWJsaWMgY2xhc3MgQXV0aGVudGljYXRpb25FeGNlcHRpb25NYXBwZXIgaW1wbGVtZW50cyBFeGNlcHRpb25NYXBwZXI8QXV0aGVudGljYXRpb25FeGNlcHRpb24+IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNwb25zZSB0b1Jlc3BvbnNlKEF1dGhlbnRpY2F0aW9uRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgaWYgKGUuZ2V0UmVhbG0oKSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2UKKyAgICAgICAgICAgICAgICAgICAgLnN0YXR1cyhTdGF0dXMuVU5BVVRIT1JJWkVEKQorICAgICAgICAgICAgICAgICAgICAuaGVhZGVyKCJXV1ctQXV0aGVudGljYXRlIiwgIkJhc2ljIHJlYWxtPVwiIiArIGUuZ2V0UmVhbG0oKSArICJcIiIpCisgICAgICAgICAgICAgICAgICAgIC50eXBlKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgICAgICAgICAgICAgLmVudGl0eShlLmdldE1lc3NhZ2UoKSkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2UKKyAgICAgICAgICAgICAgICAgICAgLnN0YXR1cyhTdGF0dXMuVU5BVVRIT1JJWkVEKQorICAgICAgICAgICAgICAgICAgICAudHlwZSgidGV4dC9wbGFpbiIpCisgICAgICAgICAgICAgICAgICAgIC5lbnRpdHkoZS5nZXRNZXNzYWdlKCkpCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvY29ubmVjdG9yL3NzbC9Sb290UmVzb3VyY2UuamF2YSBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L2Nvbm5lY3Rvci9zc2wvUm9vdFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNjYmY5NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L2Nvbm5lY3Rvci9zc2wvUm9vdFJlc291cmNlLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY2xpZW50LmNvbm5lY3Rvci5zc2w7CisKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuQmFzZTY0OworCisvKioKKyAqIFNpbXBsZSByZXNvdXJjZSBkZW1vbnN0cmF0aW5nIGxvdyBsZXZlbCBhcHByb2FjaCBvZiBnZXR0aW5nIHVzZXIgY3JlZGVudGlhbHMuCisgKgorICogQSBiZXR0ZXIgd2F5IHdvdWxkIGJlIGluamVjdGluZyB7QGxpbmsgamF2YXgud3MucnMuY29yZS5TZWN1cml0eUNvbnRleHR9LgorICoKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCIvIikKK3B1YmxpYyBjbGFzcyBSb290UmVzb3VyY2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFJvb3RSZXNvdXJjZS5jbGFzcy5nZXROYW1lKCkpOworICAgIC8qKgorICAgICAqIFNlcnZlZCBjb250ZW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlQgPSAiSkVSU0VZIEhUVFBTIEVYQU1QTEVcbiI7CisKKyAgICAvKioKKyAgICAgKiBTZXJ2ZSBjb250ZW50LgorICAgICAqCisgICAgICogQHBhcmFtIGhlYWRlcnMgcmVxdWVzdCBoZWFkZXJzLgorICAgICAqIEByZXR1cm4gY29udGVudCAoc2VlIHtAbGluayAjQ09OVEVOVH0pLgorICAgICAqLworICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnQoQENvbnRleHQgSHR0cEhlYWRlcnMgaGVhZGVycykgeworICAgICAgICAvLyB5b3UgY2FuIGdldCB1c2VybmFtZSBmb3JtIEh0dHBIZWFkZXJzCisgICAgICAgIExPR0dFUi5pbmZvKCJTZXJ2aWNlOiBHRVQgLyBVc2VyOiAiICsgZ2V0VXNlcihoZWFkZXJzKSk7CisKKyAgICAgICAgcmV0dXJuIENPTlRFTlQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VXNlcihIdHRwSGVhZGVycyBoZWFkZXJzKSB7CisgICAgICAgIC8vIHRoaXMgaXMgYSB2ZXJ5IG1pbmltYWxpc3RpYyBhbmQgIm5haXZlIiBjb2RlOworICAgICAgICAvLyBpZiB5b3UgcGxhbiB0byB1c2UgaXQsIGFkZCB0aGUgbmVjZXNzYXJ5IGNoZWNrcworICAgICAgICBTdHJpbmcgYXV0aCA9IGhlYWRlcnMuZ2V0UmVxdWVzdEhlYWRlcigiYXV0aG9yaXphdGlvbiIpLmdldCgwKTsKKworICAgICAgICBhdXRoID0gYXV0aC5zdWJzdHJpbmcoIkJhc2ljICIubGVuZ3RoKCkpOworICAgICAgICBTdHJpbmdbXSB2YWx1ZXMgPSBCYXNlNjQuZGVjb2RlQXNTdHJpbmcoYXV0aCkuc3BsaXQoIjoiKTsKKworICAgICAgICAvLyBTdHJpbmcgdXNlcm5hbWUgPSB2YWx1ZXNbMF07CisgICAgICAgIC8vIFN0cmluZyBwYXNzd29yZCA9IHZhbHVlc1sxXTsKKyAgICAgICAgcmV0dXJuIHZhbHVlc1swXTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9jb25uZWN0b3Ivc3NsL1NlY3VyaXR5RmlsdGVyLmphdmEgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9jb25uZWN0b3Ivc3NsL1NlY3VyaXR5RmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI4ZDRjZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L2Nvbm5lY3Rvci9zc2wvU2VjdXJpdHlGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY2xpZW50LmNvbm5lY3Rvci5zc2w7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuUHJlTWF0Y2hpbmc7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXF1ZXN0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuU2VjdXJpdHlDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLkJhc2U2NDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdDsKKworLyoqCisgKiBTaW1wbGUgYXV0aGVudGljYXRpb24gZmlsdGVyLgorICoKKyAqIFJldHVybnMgcmVzcG9uc2Ugd2l0aCBodHRwIHN0YXR1cyA0MDEgd2hlbiBwcm9wZXIgYXV0aGVudGljYXRpb24gaXMgbm90IHByb3ZpZGVkIGluIGluY29taW5nIHJlcXVlc3QuCisgKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBzZWUgQ29udGFpbmVyUmVxdWVzdEZpbHRlcgorICovCitAUHJvdmlkZXIKK0BQcmVNYXRjaGluZworcHVibGljIGNsYXNzIFNlY3VyaXR5RmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciB7CisKKyAgICAvKioKKyAgICAgKiBTZWN1cml0eSByZWFsbS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFMTSA9ICJUZXN0IEhUVFBTIEF1dGhlbnRpY2F0aW9uIFJFQUxNIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihTZWN1cml0eUZpbHRlci5jbGFzcy5nZXROYW1lKCkpOworCisgICAgQENvbnRleHQKKyAgICBwcml2YXRlIFVyaUluZm8gdXJpSW5mbzsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCBmaWx0ZXJDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBVc2VyIHVzZXIgPSBhdXRoZW50aWNhdGUoZmlsdGVyQ29udGV4dC5nZXRSZXF1ZXN0KCkpOworICAgICAgICBmaWx0ZXJDb250ZXh0LnNldFNlY3VyaXR5Q29udGV4dChuZXcgQXV0aG9yaXphdGlvbkNvbnRleHQodXNlcikpOworICAgIH0KKworICAgIHByaXZhdGUgVXNlciBhdXRoZW50aWNhdGUoUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgIC8vIEV4dHJhY3QgYXV0aGVudGljYXRpb24gY3JlZGVudGlhbHMKKyAgICAgICAgU3RyaW5nIGF1dGhlbnRpY2F0aW9uID0gKChDb250YWluZXJSZXF1ZXN0KSByZXF1ZXN0KS5nZXRIZWFkZXJTdHJpbmcoSHR0cEhlYWRlcnMuQVVUSE9SSVpBVElPTik7CisgICAgICAgIGlmIChhdXRoZW50aWNhdGlvbiA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQXV0aGVudGljYXRpb25FeGNlcHRpb24oIkF1dGhlbnRpY2F0aW9uIGNyZWRlbnRpYWxzIGFyZSByZXF1aXJlZCIsIFJFQUxNKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWF1dGhlbnRpY2F0aW9uLnN0YXJ0c1dpdGgoIkJhc2ljICIpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIC8vIGFkZGl0aW9uYWwgY2hlY2tzIHNob3VsZCBiZSBkb25lIGhlcmUKKyAgICAgICAgICAgIC8vICJPbmx5IEhUVFAgQmFzaWMgYXV0aGVudGljYXRpb24gaXMgc3VwcG9ydGVkIgorICAgICAgICB9CisgICAgICAgIGF1dGhlbnRpY2F0aW9uID0gYXV0aGVudGljYXRpb24uc3Vic3RyaW5nKCJCYXNpYyAiLmxlbmd0aCgpKTsKKyAgICAgICAgU3RyaW5nW10gdmFsdWVzID0gQmFzZTY0LmRlY29kZUFzU3RyaW5nKGF1dGhlbnRpY2F0aW9uKS5zcGxpdCgiOiIpOworICAgICAgICBpZiAodmFsdWVzLmxlbmd0aCA8IDIpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbig0MDApOworICAgICAgICAgICAgLy8gIkludmFsaWQgc3ludGF4IGZvciB1c2VybmFtZSBhbmQgcGFzc3dvcmQiCisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHVzZXJuYW1lID0gdmFsdWVzWzBdOworICAgICAgICBTdHJpbmcgcGFzc3dvcmQgPSB2YWx1ZXNbMV07CisgICAgICAgIGlmICgodXNlcm5hbWUgPT0gbnVsbCkgfHwgKHBhc3N3b3JkID09IG51bGwpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViQXBwbGljYXRpb25FeGNlcHRpb24oNDAwKTsKKyAgICAgICAgICAgIC8vICJNaXNzaW5nIHVzZXJuYW1lIG9yIHBhc3N3b3JkIgorICAgICAgICB9CisKKyAgICAgICAgLy8gVmFsaWRhdGUgdGhlIGV4dHJhY3RlZCBjcmVkZW50aWFscworICAgICAgICBVc2VyIHVzZXI7CisKKyAgICAgICAgaWYgKCJ1c2VyIi5lcXVhbHModXNlcm5hbWUpICYmICJwYXNzd29yZCIuZXF1YWxzKHBhc3N3b3JkKSkgeworICAgICAgICAgICAgdXNlciA9IG5ldyBVc2VyKCJ1c2VyIiwgInVzZXIiKTsKKyAgICAgICAgICAgIExPR0dFUi5pbmZvKCJVU0VSIEFVVEhFTlRJQ0FURUQiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPR0dFUi5pbmZvKCJVU0VSIE5PVCBBVVRIRU5USUNBVEVEIik7CisgICAgICAgICAgICB0aHJvdyBuZXcgQXV0aGVudGljYXRpb25FeGNlcHRpb24oIkludmFsaWQgdXNlcm5hbWUgb3IgcGFzc3dvcmQiLCBSRUFMTSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHVzZXI7CisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBBdXRob3JpemF0aW9uQ29udGV4dCBpbXBsZW1lbnRzIFNlY3VyaXR5Q29udGV4dCB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBVc2VyIHVzZXI7CisgICAgICAgIHByaXZhdGUgZmluYWwgUHJpbmNpcGFsIHByaW5jaXBhbDsKKworICAgICAgICBwdWJsaWMgQXV0aG9yaXphdGlvbkNvbnRleHQoZmluYWwgVXNlciB1c2VyKSB7CisgICAgICAgICAgICB0aGlzLnVzZXIgPSB1c2VyOworICAgICAgICAgICAgdGhpcy5wcmluY2lwYWwgPSBuZXcgUHJpbmNpcGFsKCkgeworCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXNlci51c2VybmFtZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBQcmluY2lwYWwgZ2V0VXNlclByaW5jaXBhbCgpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnByaW5jaXBhbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1VzZXJJblJvbGUoU3RyaW5nIHJvbGUpIHsKKyAgICAgICAgICAgIHJldHVybiAocm9sZS5lcXVhbHModXNlci5yb2xlKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTZWN1cmUoKSB7CisgICAgICAgICAgICByZXR1cm4gImh0dHBzIi5lcXVhbHModXJpSW5mby5nZXRSZXF1ZXN0VXJpKCkuZ2V0U2NoZW1lKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXV0aGVudGljYXRpb25TY2hlbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gU2VjdXJpdHlDb250ZXh0LkJBU0lDX0FVVEg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBVc2VyIHsKKworICAgICAgICBwdWJsaWMgU3RyaW5nIHVzZXJuYW1lOworICAgICAgICBwdWJsaWMgU3RyaW5nIHJvbGU7CisKKyAgICAgICAgcHVibGljIFVzZXIoU3RyaW5nIHVzZXJuYW1lLCBTdHJpbmcgcm9sZSkgeworICAgICAgICAgICAgdGhpcy51c2VybmFtZSA9IHVzZXJuYW1lOworICAgICAgICAgICAgdGhpcy5yb2xlID0gcm9sZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L2Nvbm5lY3Rvci9zc2wvU2VydmVyLmphdmEgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9jb25uZWN0b3Ivc3NsL1NlcnZlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhM2NiMzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9jb25uZWN0b3Ivc3NsL1NlcnZlci5qYXZhCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jbGllbnQuY29ubmVjdG9yLnNzbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5Mi5odHRwc2VydmVyLkdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmdyaXp6bHkuaHR0cC5zZXJ2ZXIuSHR0cFNlcnZlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmdyaXp6bHkuc3NsLlNTTENvbnRleHRDb25maWd1cmF0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5ncml6emx5LnNzbC5TU0xFbmdpbmVDb25maWd1cmF0b3I7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5pby5CeXRlU3RyZWFtczsKKworLyoqCisgKiBBIHNpbXBsZSBTU0wtc2VjdXJlZCBIVFRQIHNlcnZlciBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KKyAqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitmaW5hbCBjbGFzcyBTZXJ2ZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoU2VydmVyLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX1RSVVNUX1NUT1JFID0gInRydXN0c3RvcmUtc2VydmVyIjsKKworICAgIC8qKgorICAgICAqIEJhc2Ugc2VydmVyIFVSSS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFVSSSBCQVNFX1VSSSA9IGdldEJhc2VVUkkoKTsKKworICAgIHByaXZhdGUgZmluYWwgSHR0cFNlcnZlciB3ZWJTZXJ2ZXI7CisKKyAgICBwcml2YXRlIFNlcnZlcihmaW5hbCBIdHRwU2VydmVyIHdlYlNlcnZlcikgeworICAgICAgICB0aGlzLndlYlNlcnZlciA9IHdlYlNlcnZlcjsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBVUkkgZ2V0QmFzZVVSSSgpIHsKKyAgICAgICAgcmV0dXJuIFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cHM6Ly9sb2NhbGhvc3QvIikucG9ydChnZXRQb3J0KDg0NjMpKS5idWlsZCgpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGludCBnZXRQb3J0KGludCBkZWZhdWx0UG9ydCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgcG9ydCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0Iik7CisgICAgICAgIGlmIChudWxsICE9IHBvcnQpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQocG9ydCk7CisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIExPR0dFUi53YXJuaW5nKCJWYWx1ZSBvZiBqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQgcHJvcGVydHkiCisgICAgICAgICAgICAgICAgICAgICAgICArICIgaXMgbm90IGEgdmFsaWQgcG9zaXRpdmUgaW50ZWdlciBbIiArIHBvcnQgKyAiXS4iCisgICAgICAgICAgICAgICAgICAgICAgICArICIgUmV2ZXJ0aW5nIHRvIGRlZmF1bHQgWyIgKyBkZWZhdWx0UG9ydCArICJdLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBkZWZhdWx0UG9ydDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBTU0wtc2VjdXJlZCBIVFRQIHRlc3Qgc2VydmVyLgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpbiBjYXNlIHRoZXJlIGlzIGFuIGVycm9yIHdoaWxlIHJlYWRpbmcgc2VydmVyIGtleSBzdG9yZSBvciB0cnVzdCBzdG9yZS4KKyAgICAgKiBAcmV0dXJuIGFuIGluc3RhbmNlIG9mIHRoZSBzdGFydGVkIFNTTC1zZWN1cmVkIEhUVFAgdGVzdCBzZXJ2ZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBTZXJ2ZXIgc3RhcnQoU3RyaW5nIGtleXN0b3JlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSB0cnVzdFN0b3JlID0gU2VydmVyLmNsYXNzLmdldFJlc291cmNlQXNTdHJlYW0oU0VSVkVSX1RSVVNUX1NUT1JFKTsKKyAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0ga2V5U3RvcmUgPSBTZXJ2ZXIuY2xhc3MuZ2V0UmVzb3VyY2VBc1N0cmVhbShrZXlzdG9yZSk7CisKKyAgICAgICAgLy8gR3JpenpseSBzc2wgY29uZmlndXJhdGlvbgorICAgICAgICBTU0xDb250ZXh0Q29uZmlndXJhdG9yIHNzbENvbnRleHQgPSBuZXcgU1NMQ29udGV4dENvbmZpZ3VyYXRvcigpOworCisgICAgICAgIC8vIHNldCB1cCBzZWN1cml0eSBjb250ZXh0CisgICAgICAgIHNzbENvbnRleHQuc2V0S2V5U3RvcmVCeXRlcyhCeXRlU3RyZWFtcy50b0J5dGVBcnJheShrZXlTdG9yZSkpOyAgLy8gY29udGFpbnMgc2VydmVyIGtleSBwYWlyCisgICAgICAgIHNzbENvbnRleHQuc2V0S2V5U3RvcmVQYXNzKCJhc2RmZ2giKTsKKyAgICAgICAgc3NsQ29udGV4dC5zZXRUcnVzdFN0b3JlQnl0ZXMoQnl0ZVN0cmVhbXMudG9CeXRlQXJyYXkodHJ1c3RTdG9yZSkpOyAvLyBjb250YWlucyBjbGllbnQgY2VydGlmaWNhdGUKKyAgICAgICAgc3NsQ29udGV4dC5zZXRUcnVzdFN0b3JlUGFzcygiYXNkZmdoIik7CisKKyAgICAgICAgUmVzb3VyY2VDb25maWcgcmMgPSBuZXcgUmVzb3VyY2VDb25maWcoKTsKKyAgICAgICAgcmMucmVnaXN0ZXIobmV3IExvZ2dpbmdGZWF0dXJlKExPR0dFUiwgTG9nZ2luZ0ZlYXR1cmUuVmVyYm9zaXR5LlBBWUxPQURfQU5ZKSk7CisgICAgICAgIHJjLnJlZ2lzdGVyQ2xhc3NlcyhSb290UmVzb3VyY2UuY2xhc3MsIFNlY3VyaXR5RmlsdGVyLmNsYXNzLCBBdXRoZW50aWNhdGlvbkV4Y2VwdGlvbk1hcHBlci5jbGFzcyk7CisKKyAgICAgICAgZmluYWwgSHR0cFNlcnZlciBncml6emx5U2VydmVyID0gR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5LmNyZWF0ZUh0dHBTZXJ2ZXIoCisgICAgICAgICAgICAgICAgZ2V0QmFzZVVSSSgpLAorICAgICAgICAgICAgICAgIHJjLAorICAgICAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICAgICAgbmV3IFNTTEVuZ2luZUNvbmZpZ3VyYXRvcihzc2xDb250ZXh0KS5zZXRDbGllbnRNb2RlKGZhbHNlKS5zZXROZWVkQ2xpZW50QXV0aCh0cnVlKQorICAgICAgICApOworCisgICAgICAgIC8vIHN0YXJ0IEdyaXp6bHkgZW1iZWRkZWQgc2VydmVyIC8vCisgICAgICAgIExPR0dFUi5pbmZvKCJKZXJzZXkgYXBwIHN0YXJ0ZWQuIFRyeSBvdXQgIiArIEJBU0VfVVJJICsgIlxuSGl0IENUUkwgKyBDIHRvIHN0b3AgaXQuLi4iKTsKKyAgICAgICAgZ3JpenpseVNlcnZlci5zdGFydCgpOworCisgICAgICAgIHJldHVybiBuZXcgU2VydmVyKGdyaXp6bHlTZXJ2ZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3AgU1NMLXNlY3VyZWQgSFRUUCB0ZXN0IHNlcnZlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzdG9wKCkgeworICAgICAgICB3ZWJTZXJ2ZXIuc2h1dGRvd25Ob3coKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9jb25uZWN0b3Ivc3NsL1NzbENvbm5lY3RvckNvbmZpZ3VyYXRpb25UZXN0LmphdmEgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9jb25uZWN0b3Ivc3NsL1NzbENvbm5lY3RvckNvbmZpZ3VyYXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdlZGNiMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L2Nvbm5lY3Rvci9zc2wvU3NsQ29ubmVjdG9yQ29uZmlndXJhdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDE0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY2xpZW50LmNvbm5lY3Rvci5zc2w7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMQ29udGV4dDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmFwYWNoZS5jb25uZWN0b3IuQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuYXV0aGVudGljYXRpb24uSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogU1NMIGNvbm5lY3RvciB0ZXN0cy4KKyAqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBBcnVsIERoZXNpYXNlZWxhbiAoYXJ1bGQgYXQgYWNtLm9yZykKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgU3NsQ29ubmVjdG9yQ29uZmlndXJhdGlvblRlc3QgZXh0ZW5kcyBBYnN0cmFjdENvbm5lY3RvclNlcnZlclRlc3QgeworCisgICAgLyoqCisgICAgICogVGVzdCB0byBzZWUgdGhhdCB0aGUgY29ycmVjdCBIdHRwIHN0YXR1cyBpcyByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0ZXN0IGZhaWx1cmUuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U1NMV2l0aEF1dGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU1NMQ29udGV4dCBzc2xDb250ZXh0ID0gZ2V0U3NsQ29udGV4dCgpOworCisgICAgICAgIGZpbmFsIENsaWVudENvbmZpZyBjYyA9IG5ldyBDbGllbnRDb25maWcoKS5jb25uZWN0b3JQcm92aWRlcihjb25uZWN0b3JQcm92aWRlcik7CisgICAgICAgIGZpbmFsIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC53aXRoQ29uZmlnKGNjKQorICAgICAgICAgICAgICAgIC5zc2xDb250ZXh0KHNzbENvbnRleHQpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAgICAgLy8gY2xpZW50IGJhc2ljIGF1dGggZGVtb25zdHJhdGlvbgorICAgICAgICBjbGllbnQucmVnaXN0ZXIoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5iYXNpYygidXNlciIsICJwYXNzd29yZCIpKTsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IGNsaWVudC50YXJnZXQoU2VydmVyLkJBU0VfVVJJKS5yZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcyk7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucGF0aCgiLyIpLnJlcXVlc3QoKS5nZXQoUmVzcG9uc2UuY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRvIHNlZSB0aGF0IEhUVFAgNDAxIGlzIHJldHVybmVkIHdoZW4gY2xpZW50IHRyaWVzIHRvIEdFVCB3aXRob3V0CisgICAgICogcHJvcGVyIGNyZWRlbnRpYWxzLgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRlc3QgZmFpbHVyZS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIVFRQQmFzaWNBdXRoMSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTU0xDb250ZXh0IHNzbENvbnRleHQgPSBnZXRTc2xDb250ZXh0KCk7CisKKyAgICAgICAgZmluYWwgQ2xpZW50Q29uZmlnIGNjID0gbmV3IENsaWVudENvbmZpZygpLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBBcGFjaGVDb25uZWN0b3JQcm92aWRlcigpKTsKKyAgICAgICAgZmluYWwgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgLndpdGhDb25maWcoY2MpCisgICAgICAgICAgICAgICAgLnNzbENvbnRleHQoc3NsQ29udGV4dCkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gY2xpZW50LnRhcmdldChTZXJ2ZXIuQkFTRV9VUkkpLnJlZ2lzdGVyKExvZ2dpbmdGZWF0dXJlLmNsYXNzKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5wYXRoKCIvIikucmVxdWVzdCgpLmdldChSZXNwb25zZS5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMSwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdG8gc2VlIHRoYXQgU1NMSGFuZHNoYWtlRXhjZXB0aW9uIGlzIHRocm93biB3aGVuIGNsaWVudCBkb24ndCBoYXZlCisgICAgICogdHJ1c3RlZCBrZXkuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGVzdCBmYWlsdXJlLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNTTEF1dGgxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFNTTENvbnRleHQgc3NsQ29udGV4dCA9IGdldFNzbENvbnRleHQoKTsKKworICAgICAgICBmaW5hbCBDbGllbnRDb25maWcgY2MgPSBuZXcgQ2xpZW50Q29uZmlnKCkuY29ubmVjdG9yUHJvdmlkZXIobmV3IEFwYWNoZUNvbm5lY3RvclByb3ZpZGVyKCkpOworICAgICAgICBmaW5hbCBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAud2l0aENvbmZpZyhjYykKKyAgICAgICAgICAgICAgICAuc3NsQ29udGV4dChzc2xDb250ZXh0KQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSBjbGllbnQudGFyZ2V0KFNlcnZlci5CQVNFX1VSSSkucmVnaXN0ZXIoTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpOworCisgICAgICAgIGJvb2xlYW4gY2F1Z2h0ID0gZmFsc2U7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0YXJnZXQucGF0aCgiLyIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGNhdWdodCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRUcnVlKGNhdWdodCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0aGF0IGEgcmVzcG9uc2UgdG8gYW4gYXV0aGVudGljYXRpb24gY2hhbGxlbmdlIGhhcyB0aGUgc2FtZSBTU0wgY29uZmlndXJhdGlvbiBhcyB0aGUgb3JpZ2luYWwgcmVxdWVzdC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTU0xXaXRoTm9uUHJlZW1wdGl2ZUF1dGgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU1NMQ29udGV4dCBzc2xDb250ZXh0ID0gZ2V0U3NsQ29udGV4dCgpOworCisgICAgICAgIGZpbmFsIENsaWVudENvbmZpZyBjYyA9IG5ldyBDbGllbnRDb25maWcoKS5jb25uZWN0b3JQcm92aWRlcihjb25uZWN0b3JQcm92aWRlcik7CisgICAgICAgIGZpbmFsIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC53aXRoQ29uZmlnKGNjKQorICAgICAgICAgICAgICAgIC5zc2xDb250ZXh0KHNzbENvbnRleHQpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAgICAgLy8gY2xpZW50IGJhc2ljIGF1dGggZGVtb25zdHJhdGlvbgorICAgICAgICBIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlIGF1dGhGZWF0dXJlID0gSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5iYXNpY0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5ub25QcmVlbXB0aXZlKCkKKyAgICAgICAgICAgICAgICAuY3JlZGVudGlhbHMoInVzZXIiLCAicGFzc3dvcmQiKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgIGNsaWVudC5yZWdpc3RlcihhdXRoRmVhdHVyZSk7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSBjbGllbnQudGFyZ2V0KFNlcnZlci5CQVNFX1VSSSkucmVnaXN0ZXIoTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnBhdGgoIi8iKS5yZXF1ZXN0KCkuZ2V0KFJlc3BvbnNlLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvY29ubmVjdG9yL3NzbC9Tc2xDb25uZWN0b3JIb3N0bmFtZVZlcmlmaWVyVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvY29ubmVjdG9yL3NzbC9Tc2xDb25uZWN0b3JIb3N0bmFtZVZlcmlmaWVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MWYyMTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9jb25uZWN0b3Ivc3NsL1NzbENvbm5lY3Rvckhvc3RuYW1lVmVyaWZpZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNsaWVudC5jb25uZWN0b3Iuc3NsOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgamF2YXgubmV0LnNzbC5Ib3N0bmFtZVZlcmlmaWVyOworaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMU2Vzc2lvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LmF1dGhlbnRpY2F0aW9uLkh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnNwaS5Db25uZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5LmNvbm5lY3Rvci5Hcml6emx5Q29ubmVjdG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dHkuY29ubmVjdG9yLkpldHR5Q29ubmVjdG9yUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiBTU0wgY29ubmVjdG9yIGhvc3RuYW1lIHZlcmlmaWNhdGlvbiB0ZXN0cy4KKyAqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBTc2xDb25uZWN0b3JIb3N0bmFtZVZlcmlmaWVyVGVzdCBleHRlbmRzIEFic3RyYWN0Q29ubmVjdG9yU2VydmVyVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJRU5UX1RSVVNUX1NUT1JFID0gInRydXN0c3RvcmUtZXhhbXBsZV9jb20tY2xpZW50IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVkVSX0tFWV9TVE9SRSA9ICJrZXlzdG9yZS1leGFtcGxlX2NvbS1zZXJ2ZXIiOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmluZyBzZXJ2ZXJLZXlTdG9yZSgpIHsKKyAgICAgICAgcmV0dXJuIFNFUlZFUl9LRVlfU1RPUkU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmluZyBjbGllbnRUcnVzdFN0b3JlKCkgeworICAgICAgICByZXR1cm4gQ0xJRU5UX1RSVVNUX1NUT1JFOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdG8gYXBwbHkge0BsaW5rIEhvc3RuYW1lVmVyaWZpZXJ9IGFsb25nIHdpdGggU1NMIGluIHRoZSBwcmVkZWZpbmVkIGNvbm5lY3RvcnMKKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0ZXN0IGZhaWx1cmUuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SG9zdG5hbWVWZXJpZmllckFwcGxpZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gR3JpenpseSBhbmQgSmV0dHkgY29ubmVjdG9ycyBkb24ndCBzdXBwb3J0IEhvc3RuYW1lIFZlcmlmaWNhdGlvbgorICAgICAgICBpZiAoaXNFeGNsdWRlZChBcnJheXMuYXNMaXN0KEdyaXp6bHlDb25uZWN0b3JQcm92aWRlci5jbGFzcywgSmV0dHlDb25uZWN0b3JQcm92aWRlci5jbGFzcykpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAud2l0aENvbmZpZyhuZXcgQ2xpZW50Q29uZmlnKCkuY29ubmVjdG9yUHJvdmlkZXIoY29ubmVjdG9yUHJvdmlkZXIpKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLmJhc2ljKCJ1c2VyIiwgInBhc3N3b3JkIikpCisgICAgICAgICAgICAgICAgLmhvc3RuYW1lVmVyaWZpZXIobmV3IEN1c3RvbUhvc3RuYW1lVmVyaWZpZXIoKSkKKyAgICAgICAgICAgICAgICAuc3NsQ29udGV4dChnZXRTc2xDb250ZXh0KCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNsaWVudC50YXJnZXQoU2VydmVyLkJBU0VfVVJJKS5yZXF1ZXN0KCkuZ2V0KFJlc3BvbnNlLmNsYXNzKTsKKyAgICAgICAgICAgIGZhaWwoIkhvc3RuYW1lVmVyaWZpZXIgd2FzIG5vdCBhcHBsaWVkLiIpOworICAgICAgICB9IGNhdGNoIChQcm9jZXNzaW5nRXhjZXB0aW9uIHBleCkgeworICAgICAgICAgICAgQ3VzdG9tSG9zdG5hbWVWZXJpZmllci5Ib3N0bmFtZVZlcmlmaWVyRXhjZXB0aW9uIGh2ZSA9IGdldEhWRShwZXgpOworCisgICAgICAgICAgICBpZiAoaHZlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoQ3VzdG9tSG9zdG5hbWVWZXJpZmllci5FWF9WRVJJRklFUl9NRVNTQUdFLCBodmUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZmFpbCgiSW52YWxpZCB3cmFwcGVkIGV4Y2VwdGlvbi4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc0V4Y2x1ZGVkKExpc3Q8Q2xhc3M8PyBleHRlbmRzIENvbm5lY3RvclByb3ZpZGVyPj4gZXhjbHVkZWQpIHsKKyAgICAgICAgZm9yIChDbGFzczw/PiBjbGF6eiA6IGV4Y2x1ZGVkKSB7CisgICAgICAgICAgICBpZiAoY2xhenouaXNBc3NpZ25hYmxlRnJvbShjb25uZWN0b3JQcm92aWRlci5nZXRDbGFzcygpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEN1c3RvbUhvc3RuYW1lVmVyaWZpZXIuSG9zdG5hbWVWZXJpZmllckV4Y2VwdGlvbiBnZXRIVkUoZmluYWwgVGhyb3dhYmxlIHN0YWNrdHJhY2UpIHsKKyAgICAgICAgVGhyb3dhYmxlIHRlbXAgPSBzdGFja3RyYWNlOworICAgICAgICBkbyB7CisgICAgICAgICAgICB0ZW1wID0gdGVtcC5nZXRDYXVzZSgpOworICAgICAgICAgICAgaWYgKHRlbXAgaW5zdGFuY2VvZiBDdXN0b21Ib3N0bmFtZVZlcmlmaWVyLkhvc3RuYW1lVmVyaWZpZXJFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKEN1c3RvbUhvc3RuYW1lVmVyaWZpZXIuSG9zdG5hbWVWZXJpZmllckV4Y2VwdGlvbikgdGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSB3aGlsZSAodGVtcCAhPSBudWxsKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDdXN0b21Ib3N0bmFtZVZlcmlmaWVyIGltcGxlbWVudHMgSG9zdG5hbWVWZXJpZmllciB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVYX1ZFUklGSUVSX01FU1NBR0UgPSAiVmVyaWZpZXIgQXBwbGllZCI7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIHZlcmlmeShmaW5hbCBTdHJpbmcgcywgZmluYWwgU1NMU2Vzc2lvbiBzc2xTZXNzaW9uKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSG9zdG5hbWVWZXJpZmllckV4Y2VwdGlvbihFWF9WRVJJRklFUl9NRVNTQUdFKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJDVVNUT01fSE9TVF9WRVJJRklFUiI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEhvc3RuYW1lVmVyaWZpZXJFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgcHVibGljIEhvc3RuYW1lVmVyaWZpZXJFeGNlcHRpb24oZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgICAgICBzdXBlcihtZXNzYWdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L2Nvbm5lY3Rvci9zc2wvU3NsSHR0cFVybENvbm5lY3RvclRlc3QuamF2YSBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L2Nvbm5lY3Rvci9zc2wvU3NsSHR0cFVybENvbm5lY3RvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTgyMzIxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvY29ubmVjdG9yL3NzbC9Tc2xIdHRwVXJsQ29ubmVjdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jbGllbnQuY29ubmVjdG9yLnNzbDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS5uZXQuSW5ldEFkZHJlc3M7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0OworaW1wb3J0IGphdmEubmV0LlVSTDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IGphdmF4Lm5ldC5zc2wuSHR0cHNVUkxDb25uZWN0aW9uOworaW1wb3J0IGphdmF4Lm5ldC5zc2wuU1NMQ29udGV4dDsKK2ltcG9ydCBqYXZheC5uZXQuc3NsLlNTTFNvY2tldEZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5IdHRwVXJsQ29ubmVjdG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LmF1dGhlbnRpY2F0aW9uLkh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIFRlc3QgY3VzdG9tIHNvY2tldCBmYWN0b3J5IGluIEh0dHBVcmxDb25uZWN0aW9uIHVzaW5nIFNTTAorICoKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitwdWJsaWMgY2xhc3MgU3NsSHR0cFVybENvbm5lY3RvclRlc3QgZXh0ZW5kcyBBYnN0cmFjdENvbm5lY3RvclNlcnZlclRlc3QgeworCisgICAgLyoqCisgICAgICogVGVzdCB0byBzZWUgdGhhdCB0aGUgY29ycmVjdCBIdHRwIHN0YXR1cyBpcyByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0ZXN0IGZhaWx1cmUuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U1NMV2l0aEN1c3RvbVNvY2tldEZhY3RvcnkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU1NMQ29udGV4dCBzc2xDb250ZXh0ID0gZ2V0U3NsQ29udGV4dCgpOworICAgICAgICBmaW5hbCBDdXN0b21TU0xTb2NrZXRGYWN0b3J5IHNvY2tldEZhY3RvcnkgPSBuZXcgQ3VzdG9tU1NMU29ja2V0RmFjdG9yeShzc2xDb250ZXh0KTsKKworICAgICAgICBmaW5hbCBDbGllbnRDb25maWcgY2MgPSBuZXcgQ2xpZW50Q29uZmlnKCkKKyAgICAgICAgICAgICAgICAuY29ubmVjdG9yUHJvdmlkZXIobmV3IEh0dHBVcmxDb25uZWN0b3JQcm92aWRlcigpLmNvbm5lY3Rpb25GYWN0b3J5KAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEh0dHBVcmxDb25uZWN0b3JQcm92aWRlci5Db25uZWN0aW9uRmFjdG9yeSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgSHR0cFVSTENvbm5lY3Rpb24gZ2V0Q29ubmVjdGlvbihmaW5hbCBVUkwgdXJsKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIdHRwc1VSTENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IChIdHRwc1VSTENvbm5lY3Rpb24pIHVybC5vcGVuQ29ubmVjdGlvbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnNldFNTTFNvY2tldEZhY3Rvcnkoc29ja2V0RmFjdG9yeSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKKworICAgICAgICBmaW5hbCBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAud2l0aENvbmZpZyhjYykKKyAgICAgICAgICAgICAgICAuc3NsQ29udGV4dChzc2xDb250ZXh0KQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLmJhc2ljKCJ1c2VyIiwgInBhc3N3b3JkIikpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKExvZ2dpbmdGZWF0dXJlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gY2xpZW50LnRhcmdldChTZXJ2ZXIuQkFTRV9VUkkpLnBhdGgoIi8iKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzb2NrZXRGYWN0b3J5LmlzVmlzaXRlZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEN1c3RvbVNTTFNvY2tldEZhY3RvcnkgZXh0ZW5kcyBTU0xTb2NrZXRGYWN0b3J5IHsKKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gdmlzaXRlZCA9IGZhbHNlOworCisgICAgICAgIHByaXZhdGUgZmluYWwgU1NMQ29udGV4dCBzc2xDb250ZXh0OworCisgICAgICAgIHByb3RlY3RlZCBDdXN0b21TU0xTb2NrZXRGYWN0b3J5KFNTTENvbnRleHQgc3NsQ29udGV4dCkgeworICAgICAgICAgICAgdGhpcy5zc2xDb250ZXh0ID0gc3NsQ29udGV4dDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzVmlzaXRlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiB2aXNpdGVkOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTb2NrZXQgY3JlYXRlU29ja2V0KFNvY2tldCBzLCBTdHJpbmcgaG9zdCwgaW50IHBvcnQsIGJvb2xlYW4gYXV0b0Nsb3NlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgdGhpcy52aXNpdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIFNTTFNvY2tldEZhY3Rvcnkgc3NsU29ja2V0RmFjdG9yeSA9IHNzbENvbnRleHQuZ2V0U29ja2V0RmFjdG9yeSgpOworICAgICAgICAgICAgcmV0dXJuIHNzbFNvY2tldEZhY3RvcnkuY3JlYXRlU29ja2V0KHMsIGhvc3QsIHBvcnQsIGF1dG9DbG9zZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFNvY2tldCBjcmVhdGVTb2NrZXQoSW5ldEFkZHJlc3MgYWRkcmVzcywgaW50IHBvcnQsIEluZXRBZGRyZXNzIGxvY2FsQWRkcmVzcywgaW50IGxvY2FsUG9ydCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhpcyBjcmVhdGVTb2NrZXQgbWV0aG9kIHNob3VsZCBub3QgYmUgaW52b2tlZC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU29ja2V0IGNyZWF0ZVNvY2tldChTdHJpbmcgaG9zdCwgaW50IHBvcnQsIEluZXRBZGRyZXNzIGxvY2FsSG9zdCwgaW50IGxvY2FsUG9ydCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhpcyBjcmVhdGVTb2NrZXQgbWV0aG9kIHNob3VsZCBub3QgYmUgaW52b2tlZC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU29ja2V0IGNyZWF0ZVNvY2tldChJbmV0QWRkcmVzcyBob3N0LCBpbnQgcG9ydCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhpcyBjcmVhdGVTb2NrZXQgbWV0aG9kIHNob3VsZCBub3QgYmUgaW52b2tlZC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU29ja2V0IGNyZWF0ZVNvY2tldChTdHJpbmcgaG9zdCwgaW50IHBvcnQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRoaXMgY3JlYXRlU29ja2V0IG1ldGhvZCBzaG91bGQgbm90IGJlIGludm9rZWQuIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZ1tdIGdldERlZmF1bHRDaXBoZXJTdWl0ZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0U3VwcG9ydGVkQ2lwaGVyU3VpdGVzKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9ncml6emx5Y29ubmVjdG9yL05vbkJsb2NraW5nVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvZ3JpenpseWNvbm5lY3Rvci9Ob25CbG9ja2luZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDA2YjE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvZ3JpenpseWNvbm5lY3Rvci9Ob25CbG9ja2luZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDkwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE2LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jbGllbnQuZ3JpenpseWNvbm5lY3RvcjsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5JbnZvY2F0aW9uQ2FsbGJhY2s7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseS5jb25uZWN0b3IuR3JpenpseUNvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIEdyaXp6bHkgY29ubmVjdG9yIG5vbiBibG9ja2luZyB0ZXN0LgorICovCitwdWJsaWMgY2xhc3MgTm9uQmxvY2tpbmdUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAUGF0aCgiL3Rlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gIkdFVCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcuY29ubmVjdG9yUHJvdmlkZXIobmV3IEdyaXp6bHlDb25uZWN0b3JQcm92aWRlcigpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvbGF0aWxlIFN0cmluZyBpbnZvY2F0aW9uQ2FsbGJhY2tUaHJlYWROYW1lOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uQmxvY2tpbmdDb25uZWN0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggY291bnREb3duTGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisKKyAgICAgICAgRnV0dXJlPFN0cmluZz4gZnV0dXJlID0gdGFyZ2V0KCJ0ZXN0IikKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLmFzeW5jKCkKKyAgICAgICAgICAgICAgICAuZ2V0KG5ldyBJbnZvY2F0aW9uQ2FsbGJhY2s8U3RyaW5nPigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbXBsZXRlZChTdHJpbmcgcmVzcG9uc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludm9jYXRpb25DYWxsYmFja1RocmVhZE5hbWUgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50RG93bkxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZhaWxlZChUaHJvd2FibGUgdGhyb3dhYmxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnZvY2F0aW9uQ2FsbGJhY2tUaHJlYWROYW1lID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb3VudERvd25MYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgIFN0cmluZyByZXNwb25zZSA9IGZ1dHVyZS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZSk7CisgICAgICAgIGFzc2VydFRydWUoIkludm9jYXRpb24gY2FsbGJhY2sgd2FzIG5vdCBpbnZva2VkIiwKKyAgICAgICAgICAgICAgICBjb3VudERvd25MYXRjaC5hd2FpdCg1LCBUaW1lVW5pdC5TRUNPTkRTKSk7CisgICAgICAgIGFzc2VydFRydWUoIkludm9jYXRpb24gY2FsbGJhY2sgaXMgbm90IGV4ZWN1dGVkIG9uIHRoZSBOSU8gcG9vbCB0aHJlYWQuIiwKKyAgICAgICAgICAgICAgICAgICAhaW52b2NhdGlvbkNhbGxiYWNrVGhyZWFkTmFtZS5jb250YWlucygiamVyc2V5LWNsaWVudC1hc3luYy1leGVjdXRvciIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9odHRwdXJsY29ubmVjdG9yL0FzeW5jVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvaHR0cHVybGNvbm5lY3Rvci9Bc3luY1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDJmZTMyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvaHR0cHVybGNvbm5lY3Rvci9Bc3luY1Rlc3QuamF2YQpAQCAtMCwwICsxLDI2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY2xpZW50Lmh0dHB1cmxjb25uZWN0b3I7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQXN5bmNJbnZva2VyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkFzeW5jUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlN1c3BlbmRlZDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuVGltZW91dEhhbmRsZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuSHR0cFVybENvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnM7CitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5sZXNzVGhhbk9yRXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICogQXN5bmNocm9ub3VzIGNvbm5lY3RvciB0ZXN0LgorICoKKyAqIEBhdXRob3IgQXJ1bCBEaGVzaWFzZWVsYW4gKGFydWxkIGF0IGFjbS5vcmcpCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQXN5bmNUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihBc3luY1Rlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSCA9ICJhc3luYyI7CisKKyAgICAvKioKKyAgICAgKiBBc3luY2hyb25vdXMgdGVzdCByZXNvdXJjZS4KKyAgICAgKi8KKyAgICBAUGF0aChQQVRIKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQXN5bmNSZXNvdXJjZSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUeXBpY2FsIGxvbmctcnVubmluZyBvcGVyYXRpb24gZHVyYXRpb24uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgT1BFUkFUSU9OX0RVUkFUSU9OID0gMTAwMDsKKworICAgICAgICAvKioKKyAgICAgICAgICogTG9uZy1ydW5uaW5nIGFzeW5jaHJvbm91cyBwb3N0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYXN5bmNSZXNwb25zZSBhc3luYyByZXNwb25zZS4KKyAgICAgICAgICogQHBhcmFtIGlkICAgICAgICAgICAgcG9zdCByZXF1ZXN0IGlkIChyZWNlaXZlZCBhcyByZXF1ZXN0IHBheWxvYWQpLgorICAgICAgICAgKi8KKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIHZvaWQgYXN5bmNQb3N0KEBTdXNwZW5kZWQgZmluYWwgQXN5bmNSZXNwb25zZSBhc3luY1Jlc3BvbnNlLCBmaW5hbCBTdHJpbmcgaWQpIHsKKyAgICAgICAgICAgIExPR0dFUi5pbmZvKCJMb25nIHJ1bm5pbmcgcG9zdCBvcGVyYXRpb24gY2FsbGVkIHdpdGggaWQgIiArIGlkICsgIiBvbiB0aHJlYWQgIiArIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVzdWx0ID0gdmVyeUV4cGVuc2l2ZU9wZXJhdGlvbigpOworICAgICAgICAgICAgICAgICAgICBhc3luY1Jlc3BvbnNlLnJlc3VtZShyZXN1bHQpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByaXZhdGUgU3RyaW5nIHZlcnlFeHBlbnNpdmVPcGVyYXRpb24oKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIC4uLiB2ZXJ5IGV4cGVuc2l2ZSBvcGVyYXRpb24gdGhhdCB0eXBpY2FsbHkgZmluaXNoZXMgd2l0aGluIDEgc2Vjb25kcywgc2ltdWxhdGVkIHVzaW5nIHNsZWVwKCkKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChPUEVSQVRJT05fRFVSQVRJT04pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJET05FLSIgKyBpZDsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiSU5URVJSVVBURUQtIiArIGlkOworICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmluZm8oIkxvbmcgcnVubmluZyBwb3N0IG9wZXJhdGlvbiBmaW5pc2hlZCBvbiB0aHJlYWQgIiArIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sICJhc3luYy1wb3N0LXJ1bm5lci0iICsgaWQpLnN0YXJ0KCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogTG9uZy1ydW5uaW5nIGFzeW5jIGdldCByZXF1ZXN0IHRoYXQgdGltZXMgb3V0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYXN5bmNSZXNwb25zZSBhc3luYyByZXNwb25zZS4KKyAgICAgICAgICovCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInRpbWVvdXQiKQorICAgICAgICBwdWJsaWMgdm9pZCBhc3luY0dldFdpdGhUaW1lb3V0KEBTdXNwZW5kZWQgZmluYWwgQXN5bmNSZXNwb25zZSBhc3luY1Jlc3BvbnNlKSB7CisgICAgICAgICAgICBMT0dHRVIuaW5mbygiQXN5bmMgbG9uZy1ydW5uaW5nIGdldCB3aXRoIHRpbWVvdXQgY2FsbGVkIG9uIHRocmVhZCAiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgYXN5bmNSZXNwb25zZS5zZXRUaW1lb3V0SGFuZGxlcihuZXcgVGltZW91dEhhbmRsZXIoKSB7CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVUaW1lb3V0KGZpbmFsIEFzeW5jUmVzcG9uc2UgYXN5bmNSZXNwb25zZSkgeworICAgICAgICAgICAgICAgICAgICBhc3luY1Jlc3BvbnNlLnJlc3VtZShSZXNwb25zZS5zdGF0dXMoUmVzcG9uc2UuU3RhdHVzLlNFUlZJQ0VfVU5BVkFJTEFCTEUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVudGl0eSgiT3BlcmF0aW9uIHRpbWUgb3V0LiIpLmJ1aWxkKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgYXN5bmNSZXNwb25zZS5zZXRUaW1lb3V0KDEsIFRpbWVVbml0LlNFQ09ORFMpOworCisgICAgICAgICAgICBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IHZlcnlFeHBlbnNpdmVPcGVyYXRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgYXN5bmNSZXNwb25zZS5yZXN1bWUocmVzdWx0KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwcml2YXRlIFN0cmluZyB2ZXJ5RXhwZW5zaXZlT3BlcmF0aW9uKCkgeworICAgICAgICAgICAgICAgICAgICAvLyB2ZXJ5IGV4cGVuc2l2ZSBvcGVyYXRpb24gdGhhdCB0eXBpY2FsbHkgZmluaXNoZXMgd2l0aGluIDEgc2Vjb25kIGJ1dCBjYW4gdGFrZSB1cCB0byA1IHNlY29uZHMsCisgICAgICAgICAgICAgICAgICAgIC8vIHNpbXVsYXRlZCB1c2luZyBzbGVlcCgpCisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNSAqIE9QRVJBVElPTl9EVVJBVElPTik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkRPTkUiOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJJTlRFUlJVUFRFRCI7CisgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dHRVIuaW5mbygiQXN5bmMgbG9uZy1ydW5uaW5nIGdldCB3aXRoIHRpbWVvdXQgZmluaXNoZWQgb24gdGhyZWFkICIgKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KS5zdGFydCgpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEFzeW5jUmVzb3VyY2UuY2xhc3MsIFRocmVhZFBvb2xSZXNvdXJjZS5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIobmV3IExvZ2dpbmdGZWF0dXJlKExPR0dFUiwgTG9nZ2luZ0ZlYXR1cmUuVmVyYm9zaXR5LlBBWUxPQURfQU5ZKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KGZpbmFsIENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKG5ldyBMb2dnaW5nRmVhdHVyZShMT0dHRVIsIExvZ2dpbmdGZWF0dXJlLlZlcmJvc2l0eS5QQVlMT0FEX0FOWSkpOworICAgICAgICBjb25maWcuY29ubmVjdG9yUHJvdmlkZXIobmV3IEh0dHBVcmxDb25uZWN0b3JQcm92aWRlcigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGFzeW5jaHJvbm91cyBQT1NULgorICAgICAqCisgICAgICogU2VuZCAzIGFzeW5jIFBPU1QgcmVxdWVzdHMgYW5kIHdhaXQgdG8gcmVjZWl2ZSB0aGUgcmVzcG9uc2VzLiBDaGVjayB0aGUgcmVzcG9uc2UgY29udGVudCBhbmQKKyAgICAgKiBhc3NlcnQgdGhhdCB0aGUgb3BlcmF0aW9uIGRpZCBub3QgdGFrZSBtb3JlIHRoYW4gdHdpY2UgYXMgbG9uZyBhcyBhIHNpbmdsZSBsb25nIG9wZXJhdGlvbiBkdXJhdGlvbgorICAgICAqICh0aGlzIGVuc3VyZXMgYXN5bmMgcmVxdWVzdCBleGVjdXRpb24pLgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRlc3QgZXJyb3IuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNQb3N0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGxvbmcgdGljID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisKKyAgICAgICAgLy8gU3VibWl0IHJlcXVlc3RzIGFzeW5jaHJvbm91c2x5LgorICAgICAgICBmaW5hbCBGdXR1cmU8UmVzcG9uc2U+IHJmMSA9IHRhcmdldChQQVRIKS5yZXF1ZXN0KCkuYXN5bmMoKS5wb3N0KEVudGl0eS50ZXh0KCIxIikpOworICAgICAgICBmaW5hbCBGdXR1cmU8UmVzcG9uc2U+IHJmMiA9IHRhcmdldChQQVRIKS5yZXF1ZXN0KCkuYXN5bmMoKS5wb3N0KEVudGl0eS50ZXh0KCIyIikpOworICAgICAgICBmaW5hbCBGdXR1cmU8UmVzcG9uc2U+IHJmMyA9IHRhcmdldChQQVRIKS5yZXF1ZXN0KCkuYXN5bmMoKS5wb3N0KEVudGl0eS50ZXh0KCIzIikpOworICAgICAgICAvLyBnZXQoKSB3YWl0cyBmb3IgdGhlIHJlc3BvbnNlCisgICAgICAgIGZpbmFsIFN0cmluZyByMSA9IHJmMS5nZXQoKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGZpbmFsIFN0cmluZyByMiA9IHJmMi5nZXQoKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGZpbmFsIFN0cmluZyByMyA9IHJmMy5nZXQoKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgZmluYWwgbG9uZyB0b2MgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIkRPTkUtMSIsIHIxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJET05FLTIiLCByMik7CisgICAgICAgIGFzc2VydEVxdWFscygiRE9ORS0zIiwgcjMpOworCisgICAgICAgIGFzc2VydFRoYXQoIkFzeW5jIHByb2Nlc3NpbmcgdG9vayB0b28gbG9uZy4iLCB0b2MgLSB0aWMsIE1hdGNoZXJzLmxlc3NUaGFuKDMgKiBBc3luY1Jlc291cmNlLk9QRVJBVElPTl9EVVJBVElPTikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgYWNjZXNzaW5nIGFuIG9wZXJhdGlvbiB0aGF0IHRpbWVzIG91dCBvbiB0aGUgc2VydmVyLgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24gaW4gY2FzZSBvZiBhIHRlc3QgZXJyb3IuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNHZXRXaXRoVGltZW91dCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBGdXR1cmU8UmVzcG9uc2U+IHJlc3BvbnNlRnV0dXJlID0gdGFyZ2V0KFBBVEgpLnBhdGgoInRpbWVvdXQiKS5yZXF1ZXN0KCkuYXN5bmMoKS5nZXQoKTsKKyAgICAgICAgLy8gUmVxdWVzdCBpcyBiZWluZyBwcm9jZXNzZWQgYXN5bmNocm9ub3VzbHkuCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gcmVzcG9uc2VGdXR1cmUuZ2V0KCk7CisKKyAgICAgICAgLy8gZ2V0KCkgd2FpdHMgZm9yIHRoZSByZXNwb25zZQorICAgICAgICBhc3NlcnRFcXVhbHMoNTAzLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiT3BlcmF0aW9uIHRpbWUgb3V0LiIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFBhdGgoIi90aHJlYWRwb29sIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRocmVhZFBvb2xSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHNsZWVwKCk7CisgICAgICAgICAgICByZXR1cm4gIkdFVCI7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgc2xlZXAoKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDApOworICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAvLyBOT09QLgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBASWdub3JlKCJVbnN0YWJsZSB0ZXN0LiIpCisgICAgcHVibGljIHZvaWQgdGVzdENsaWVudFRocmVhZFBvb2woKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQXN5bmNJbnZva2VyIGludm9rZXIgPSBDbGllbnRCdWlsZGVyCisgICAgICAgICAgICAgICAgLm5ld0NsaWVudChuZXcgQ2xpZW50Q29uZmlnKCkucHJvcGVydHkoQ2xpZW50UHJvcGVydGllcy5BU1lOQ19USFJFQURQT09MX1NJWkUsIDkpKQorICAgICAgICAgICAgICAgIC50YXJnZXQoZ2V0QmFzZVVyaSgpKQorICAgICAgICAgICAgICAgIC5wYXRoKCJ0aHJlYWRwb29sIikKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLmFzeW5jKCk7CisKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMTAwKTsKKyAgICAgICAgZmluYWwgaW50IHRocmVhZENvdW50ID0gVGhyZWFkLmFjdGl2ZUNvdW50KCk7CisKKyAgICAgICAgZmluYWwgTGlzdDxUaHJlYWQ+IHRocmVhZHMgPSBuZXcgQXJyYXlMaXN0PFRocmVhZD4oMjApOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDIwOyBpKyspIHsKKyAgICAgICAgICAgIHRocmVhZHMuYWRkKG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VGhhdChpbnZva2VyLmdldCgpLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbygiR0VUIikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRoYXQoVGhyZWFkLmFjdGl2ZUNvdW50KCkgLSB0aHJlYWRDb3VudCAtIDIwLCBsZXNzVGhhbk9yRXF1YWxUbygxMCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEV4ZWN1dGlvbkV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkpOworICAgICAgICB9CisgICAgICAgIGZvciAoZmluYWwgVGhyZWFkIHRocmVhZCA6IHRocmVhZHMpIHsKKyAgICAgICAgICAgIHRocmVhZC5zdGFydCgpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShsYXRjaC5hd2FpdCgxMCAqIGdldEFzeW5jVGltZW91dE11bHRpcGxpZXIoKSwgVGltZVVuaXQuU0VDT05EUykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvY29ubmVjdG9yL3NzbC9rZXlzdG9yZS1jbGllbnQgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L2Nvbm5lY3Rvci9zc2wva2V5c3RvcmUtY2xpZW50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwMTZmZDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L2Nvbm5lY3Rvci9zc2wva2V5c3RvcmUtY2xpZW50CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvY29ubmVjdG9yL3NzbC9rZXlzdG9yZS1leGFtcGxlX2NvbS1zZXJ2ZXIgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L2Nvbm5lY3Rvci9zc2wva2V5c3RvcmUtZXhhbXBsZV9jb20tc2VydmVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZjZlOWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L2Nvbm5lY3Rvci9zc2wva2V5c3RvcmUtZXhhbXBsZV9jb20tc2VydmVyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvY29ubmVjdG9yL3NzbC9rZXlzdG9yZS1sb2NhbGhvc3Qtc2VydmVyIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9jb25uZWN0b3Ivc3NsL2tleXN0b3JlLWxvY2FsaG9zdC1zZXJ2ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg2YTg3ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvY29ubmVjdG9yL3NzbC9rZXlzdG9yZS1sb2NhbGhvc3Qtc2VydmVyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvY29ubmVjdG9yL3NzbC90cnVzdHN0b3JlLWV4YW1wbGVfY29tLWNsaWVudCBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvY29ubmVjdG9yL3NzbC90cnVzdHN0b3JlLWV4YW1wbGVfY29tLWNsaWVudApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2ZhYzg2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9jb25uZWN0b3Ivc3NsL3RydXN0c3RvcmUtZXhhbXBsZV9jb20tY2xpZW50CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvY29ubmVjdG9yL3NzbC90cnVzdHN0b3JlLWxvY2FsaG9zdC1jbGllbnQgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L2Nvbm5lY3Rvci9zc2wvdHJ1c3RzdG9yZS1sb2NhbGhvc3QtY2xpZW50Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZDYxMDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY2xpZW50L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L2Nvbm5lY3Rvci9zc2wvdHJ1c3RzdG9yZS1sb2NhbGhvc3QtY2xpZW50CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvY29ubmVjdG9yL3NzbC90cnVzdHN0b3JlLXNlcnZlciBiL3Rlc3RzL2UyZS1jbGllbnQvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvY29ubmVjdG9yL3NzbC90cnVzdHN0b3JlLXNlcnZlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjI2Y2U0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNsaWVudC9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9jb25uZWN0b3Ivc3NsL3RydXN0c3RvcmUtc2VydmVyCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9wb20ueG1sIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE3MDAwMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9wb20ueG1sCkBAIC0wLDAgKzEsNzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5lMmUtY29yZS1jb21tb248L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtZTJlLWNvcmUtY29tbW9uPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPkplcnNleSBFMkUgQ29yZS1Db21tb24gdGVzdHM8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuaGFtY3Jlc3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5oYW1jcmVzdC1saWJyYXJ5PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD54ZGs8L2lkPgorICAgICAgICAgICAgPHByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgPCEtLSBkbyBub3QgdXNlIHNlY3VyaXR5IG1hbmFnZXIgZm9yIHhkayAtLT4KKyAgICAgICAgICAgICAgICA8c3VyZWZpcmUuc2VjdXJpdHkuYXJnbGluZSAvPgorICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnNvbmFyPC9pZD4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZGlzYWJsZSBKYUNvQ28gbGlzdGVuZXIgYmVjYXVzZSBpdCdzIG5vdCB3b3JraW5nIHdpdGggPGZvcmtNb2RlPmFsd2F5czwvZm9yaz4gKDxyZXVzZUZvcmtzPmZhbHNlPC9yZXVzZUZvcmtzPiByZXNwZWN0aXZlbHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBzOi8vamlyYS5zb25hcnNvdXJjZS5jb20vYnJvd3NlL1NPTkFSSkFWQS03MjggKGh0dHBzOi8vZ2l0aHViLmNvbS9Tb25hclNvdXJjZS9zb25hci1qYXZhL3B1bGwvMzI0KSAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnRpZXMgY29tYmluZS5zZWxmPSJvdmVycmlkZSIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICA8L3Byb2ZpbGVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9UZXN0UnVudGltZURlbGVnYXRlLmphdmEgYi90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL1Rlc3RSdW50aW1lRGVsZWdhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODUyMDJjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9UZXN0UnVudGltZURlbGVnYXRlLmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uOworCitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkxpbms7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5WYXJpYW50OworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SdW50aW1lRGVsZWdhdGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5BYnN0cmFjdFJ1bnRpbWVEZWxlZ2F0ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLk1lc3NhZ2luZ0JpbmRlcnM7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworCisvKioKKyAqIFRlc3QgcnVudGltZSBkZWxlZ2F0ZS4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgVGVzdFJ1bnRpbWVEZWxlZ2F0ZSBleHRlbmRzIEFic3RyYWN0UnVudGltZURlbGVnYXRlIHsKKworICAgIHB1YmxpYyBUZXN0UnVudGltZURlbGVnYXRlKCkgeworICAgICAgICBzdXBlcihuZXcgTWVzc2FnaW5nQmluZGVycy5IZWFkZXJEZWxlZ2F0ZVByb3ZpZGVycygpLmdldEhlYWRlckRlbGVnYXRlUHJvdmlkZXJzKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gVCBjcmVhdGVFbmRwb2ludChBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiwgQ2xhc3M8VD4gZW5kcG9pbnRUeXBlKQorICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiwgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIk5vdCBzdXBwb3J0ZWQgeWV0LiIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RNZWRpYVR5cGUoKSB7CisgICAgICAgIE1lZGlhVHlwZSBtID0gbmV3IE1lZGlhVHlwZSgidGV4dCIsICJwbGFpbiIpOworICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChtKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXJpQnVpbGRlcigpIHsKKyAgICAgICAgVXJpQnVpbGRlciB1YiA9IFJ1bnRpbWVEZWxlZ2F0ZS5nZXRJbnN0YW5jZSgpLmNyZWF0ZVVyaUJ1aWxkZXIoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwodWIpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNwb25zZUJ1aWxkZXIoKSB7CisgICAgICAgIFJlc3BvbnNlLlJlc3BvbnNlQnVpbGRlciByYiA9IFJ1bnRpbWVEZWxlZ2F0ZS5nZXRJbnN0YW5jZSgpLmNyZWF0ZVJlc3BvbnNlQnVpbGRlcigpOworICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChyYik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFZhcmlhbnRMaXN0QnVpbGRlcigpIHsKKyAgICAgICAgVmFyaWFudC5WYXJpYW50TGlzdEJ1aWxkZXIgdmxiID0gUnVudGltZURlbGVnYXRlLmdldEluc3RhbmNlKCkuY3JlYXRlVmFyaWFudExpc3RCdWlsZGVyKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKHZsYik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdExpbmtCdWlsZGVyKCkgeworICAgICAgICBmaW5hbCBMaW5rLkJ1aWxkZXIgbGlua0J1aWxkZXIgPSBSdW50aW1lRGVsZWdhdGUuZ2V0SW5zdGFuY2UoKS5jcmVhdGVMaW5rQnVpbGRlcigpOworICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChsaW5rQnVpbGRlcik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKCkgeworICAgICAgICBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB3YWUgPSBuZXcgV2ViQXBwbGljYXRpb25FeGNlcHRpb24oKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwod2FlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL2NvbmZpZy9TZXJ2aWNlRmluZGVyQmluZGVyVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9jb25maWcvU2VydmljZUZpbmRlckJpbmRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTk1MjMzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9jb25maWcvU2VydmljZUZpbmRlckJpbmRlclRlc3QuamF2YQpAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb24uY29uZmlnOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5SdW50aW1lVHlwZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLlNlcnZpY2VGaW5kZXJCaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkFic3RyYWN0QmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25zOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5Qcm92aWRlcnM7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXJDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogU2VydmljZSBmaW5kZXIgaW5qZWN0aW9uIGJpbmRlciB1bml0IHRlc3QuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFNlcnZpY2VGaW5kZXJCaW5kZXJUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlcjsKKworICAgIHB1YmxpYyBTZXJ2aWNlRmluZGVyQmluZGVyVGVzdCgpIHsKKyAgICB9CisKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXBDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBBYnN0cmFjdEJpbmRlciBiaW5kZXIgPSBuZXcgQWJzdHJhY3RCaW5kZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgICAgICBiaW5kKFRlc3RTZXJ2aWNlQi5jbGFzcykudG8oVGVzdENvbnRyYWN0LmNsYXNzKTsKKyAgICAgICAgICAgICAgICBiaW5kKFRlc3RTZXJ2aWNlRC5jbGFzcykudG8oVGVzdENvbnRyYWN0LmNsYXNzKTsKKyAgICAgICAgICAgICAgICBpbnN0YWxsKG5ldyBTZXJ2aWNlRmluZGVyQmluZGVyPD4oVGVzdENvbnRyYWN0LmNsYXNzLCBudWxsLCBSdW50aW1lVHlwZS5TRVJWRVIpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlciA9IEluamVjdGlvbnMuY3JlYXRlSW5qZWN0aW9uTWFuYWdlcihiaW5kZXIpOworICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLmNvbXBsZXRlUmVnaXN0cmF0aW9uKCk7CisgICAgfQorCisgICAgQEFmdGVyQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVhckRvd25DbGFzcygpIHRocm93cyBFeGNlcHRpb24geworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbmZpZ3VyZSgpIHsKKyAgICAgICAgZmluYWwgU2V0PFRlc3RDb250cmFjdD4gcHJvdmlkZXJzID0gUHJvdmlkZXJzLmdldFByb3ZpZGVycyhpbmplY3Rpb25NYW5hZ2VyLCBUZXN0Q29udHJhY3QuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoNCwgcHJvdmlkZXJzLnNpemUoKSk7CisKKyAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxTdHJpbmc+IHByb3ZpZGVyTmFtZXMgPQorICAgICAgICAgICAgICAgIHByb3ZpZGVycy5zdHJlYW0oKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoVGVzdENvbnRyYWN0OjpuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworCisgICAgICAgIGFzc2VydFRydWUocHJvdmlkZXJOYW1lcy5jb250YWlucyhUZXN0U2VydmljZUEuY2xhc3MuZ2V0TmFtZSgpKSk7CisgICAgICAgIGFzc2VydFRydWUocHJvdmlkZXJOYW1lcy5jb250YWlucyhUZXN0U2VydmljZUIuY2xhc3MuZ2V0TmFtZSgpKSk7CisgICAgICAgIGFzc2VydFRydWUocHJvdmlkZXJOYW1lcy5jb250YWlucyhUZXN0U2VydmljZUMuY2xhc3MuZ2V0TmFtZSgpKSk7CisgICAgICAgIGFzc2VydFRydWUocHJvdmlkZXJOYW1lcy5jb250YWlucyhUZXN0U2VydmljZUQuY2xhc3MuZ2V0TmFtZSgpKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9jb25maWcvVGVzdENvbnRyYWN0LmphdmEgYi90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL2NvbmZpZy9UZXN0Q29udHJhY3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWExNDgyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9jb25maWcvVGVzdENvbnRyYWN0LmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uLmNvbmZpZzsKKworLyoqCisgKiBUZXN0IGNvbnRyYWN0IGZvciB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuU2VydmljZUZpbmRlckJpbmRlcn0gdGVzdC4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgaW50ZXJmYWNlIFRlc3RDb250cmFjdCB7CisgICAgLyoqCisgICAgICogR2V0IHNlcnZpY2UgbmFtZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gc2VydmljZSBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgbmFtZSgpOworCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL2NvbmZpZy9UZXN0U2VydmljZUEuamF2YSBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vY29uZmlnL1Rlc3RTZXJ2aWNlQS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NmQ2MzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL2NvbmZpZy9UZXN0U2VydmljZUEuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb24uY29uZmlnOworCisvKioKKyAqIFRlc3QgY29udHJhY3QgaW1wbGVtZW50YXRpb24uCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFRlc3RTZXJ2aWNlQSBpbXBsZW1lbnRzIFRlc3RDb250cmFjdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIG5hbWUoKSB7CisgICAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vY29uZmlnL1Rlc3RTZXJ2aWNlQi5qYXZhIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9jb25maWcvVGVzdFNlcnZpY2VCLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q5NTdiOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vY29uZmlnL1Rlc3RTZXJ2aWNlQi5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbi5jb25maWc7CisKKy8qKgorICogVGVzdCBjb250cmFjdCBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgVGVzdFNlcnZpY2VCIGltcGxlbWVudHMgVGVzdENvbnRyYWN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgbmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIGdldENsYXNzKCkuZ2V0TmFtZSgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9jb25maWcvVGVzdFNlcnZpY2VDLmphdmEgYi90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL2NvbmZpZy9UZXN0U2VydmljZUMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDA5YTM4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9jb25maWcvVGVzdFNlcnZpY2VDLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uLmNvbmZpZzsKKworLyoqCisgKiBUZXN0IGNvbnRyYWN0IGltcGxlbWVudGF0aW9uLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0U2VydmljZUMgaW1wbGVtZW50cyBUZXN0Q29udHJhY3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBuYW1lKCkgeworICAgICAgICByZXR1cm4gZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL2NvbmZpZy9UZXN0U2VydmljZUQuamF2YSBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vY29uZmlnL1Rlc3RTZXJ2aWNlRC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhNzNjNTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL2NvbmZpZy9UZXN0U2VydmljZUQuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb24uY29uZmlnOworCisvKioKKyAqIFRlc3QgY29udHJhY3QgaW1wbGVtZW50YXRpb24uCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFRlc3RTZXJ2aWNlRCBpbXBsZW1lbnRzIFRlc3RDb250cmFjdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIG5hbWUoKSB7CisgICAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldE5hbWUoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vaW50ZXJuYWwvQ29udGV4dFJlc29sdmVyRmFjdG9yeVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vaW50ZXJuYWwvQ29udGV4dFJlc29sdmVyRmFjdG9yeVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzAwZWRkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9pbnRlcm5hbC9Db250ZXh0UmVzb2x2ZXJGYWN0b3J5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb24uaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuQ29udGV4dFJlc29sdmVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUnVudGltZURlbGVnYXRlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuQm9vdHN0cmFwQmFnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkNvbnRleHRSZXNvbHZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkFic3RyYWN0QmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25zOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5Qcm92aWRlckJpbmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uLlRlc3RSdW50aW1lRGVsZWdhdGU7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworCisvKioKKyAqIENvbnRleHQgcmVzb2x2ZXJzIGZhY3RvcnkgdW5pdCB0ZXN0LgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBDb250ZXh0UmVzb2x2ZXJGYWN0b3J5VGVzdCB7CisKKyAgICBAUHJvdmlkZXIKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDdXN0b21TdHJpbmdSZXNvbHZlciBpbXBsZW1lbnRzIENvbnRleHRSZXNvbHZlcjxTdHJpbmc+IHsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWQUxVRSA9ICJmb29mIjsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb250ZXh0KENsYXNzPD8+IHR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBWQUxVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vKiIpCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ3VzdG9tSW50ZWdlclJlc29sdmVyQSBpbXBsZW1lbnRzIENvbnRleHRSZXNvbHZlcjxJbnRlZ2VyPiB7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkFMVUUgPSAxMDAxOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSW50ZWdlciBnZXRDb250ZXh0KENsYXNzPD8+IHR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBWQUxVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ3VzdG9tSW50ZWdlclJlc29sdmVyQiBpbXBsZW1lbnRzIENvbnRleHRSZXNvbHZlcjxJbnRlZ2VyPiB7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkFMVUUgPSAyMDAyOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSW50ZWdlciBnZXRDb250ZXh0KENsYXNzPD8+IHR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBWQUxVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ3VzdG9tSW50ZWdlclJlc29sdmVyQyBpbXBsZW1lbnRzIENvbnRleHRSZXNvbHZlcjxJbnRlZ2VyPiB7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVkFMVUUgPSAzMDAzOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSW50ZWdlciBnZXRDb250ZXh0KENsYXNzPD8+IHR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBWQUxVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEJpbmRlciBleHRlbmRzIEFic3RyYWN0QmluZGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICAgICAgYmluZChDdXN0b21TdHJpbmdSZXNvbHZlci5jbGFzcykudG8oQ29udGV4dFJlc29sdmVyLmNsYXNzKTsKKyAgICAgICAgICAgIGJpbmQoQ3VzdG9tSW50ZWdlclJlc29sdmVyQS5jbGFzcykudG8oQ29udGV4dFJlc29sdmVyLmNsYXNzKTsKKyAgICAgICAgICAgIGJpbmQoQ3VzdG9tSW50ZWdlclJlc29sdmVyQi5jbGFzcykudG8oQ29udGV4dFJlc29sdmVyLmNsYXNzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgQ29udGV4dFJlc29sdmVyRmFjdG9yeSBjcmY7CisKKyAgICBwdWJsaWMgQ29udGV4dFJlc29sdmVyRmFjdG9yeVRlc3QoKSB7CisgICAgICAgIFJ1bnRpbWVEZWxlZ2F0ZS5zZXRJbnN0YW5jZShuZXcgVGVzdFJ1bnRpbWVEZWxlZ2F0ZSgpKTsKKyAgICB9CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB7CisgICAgICAgIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciA9IEluamVjdGlvbnMuY3JlYXRlSW5qZWN0aW9uTWFuYWdlcigpOworICAgICAgICBQcm92aWRlckJpbmRlciBwcm92aWRlckJpbmRlciA9IG5ldyBQcm92aWRlckJpbmRlcihpbmplY3Rpb25NYW5hZ2VyKTsKKyAgICAgICAgcHJvdmlkZXJCaW5kZXIuYmluZENsYXNzZXMoQ29sbGVjdGlvbnMuc2luZ2xldG9uKEN1c3RvbUludGVnZXJSZXNvbHZlckMuY2xhc3MpKTsKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5yZWdpc3RlcihuZXcgQmluZGVyKCkpOworCisgICAgICAgIEJvb3RzdHJhcEJhZyBib290c3RyYXBCYWcgPSBuZXcgQm9vdHN0cmFwQmFnKCk7CisgICAgICAgIENvbnRleHRSZXNvbHZlckZhY3RvcnkuQ29udGV4dFJlc29sdmVyc0NvbmZpZ3VyYXRvciBjb25maWd1cmF0b3IgPQorICAgICAgICAgICAgICAgIG5ldyBDb250ZXh0UmVzb2x2ZXJGYWN0b3J5LkNvbnRleHRSZXNvbHZlcnNDb25maWd1cmF0b3IoKTsKKyAgICAgICAgY29uZmlndXJhdG9yLmluaXQoaW5qZWN0aW9uTWFuYWdlciwgYm9vdHN0cmFwQmFnKTsKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5jb21wbGV0ZVJlZ2lzdHJhdGlvbigpOworICAgICAgICBjb25maWd1cmF0b3IucG9zdEluaXQoaW5qZWN0aW9uTWFuYWdlciwgYm9vdHN0cmFwQmFnKTsKKworICAgICAgICBjcmYgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKENvbnRleHRSZXNvbHZlckZhY3RvcnkuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc29sdmUoKSB7CisgICAgICAgIGFzc2VydEVxdWFscyhDdXN0b21TdHJpbmdSZXNvbHZlci5WQUxVRSwgY3JmLnJlc29sdmUoU3RyaW5nLmNsYXNzLCBNZWRpYVR5cGUuV0lMRENBUkRfVFlQRSkuZ2V0Q29udGV4dChTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEN1c3RvbVN0cmluZ1Jlc29sdmVyLlZBTFVFLCBjcmYucmVzb2x2ZShTdHJpbmcuY2xhc3MsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpLmdldENvbnRleHQoU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEN1c3RvbUludGVnZXJSZXNvbHZlckEuVkFMVUUsCisgICAgICAgICAgICAgICAgY3JmLnJlc29sdmUoSW50ZWdlci5jbGFzcywgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTF9UWVBFKS5nZXRDb250ZXh0KEludGVnZXIuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEN1c3RvbUludGVnZXJSZXNvbHZlckEuVkFMVUUsCisgICAgICAgICAgICAgICAgY3JmLnJlc29sdmUoSW50ZWdlci5jbGFzcywgTWVkaWFUeXBlLnZhbHVlT2YoImFwcGxpY2F0aW9uLyoiKSkuZ2V0Q29udGV4dChJbnRlZ2VyLmNsYXNzKSk7CisKKyAgICAgICAgLy8gVGVzdCB0aGF0IHJlc29sdmVyICJCIiBpcyBzaGFkb3dlZCBieSBhIGN1c3RvbSByZXNvbHZlciAiQyIKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEN1c3RvbUludGVnZXJSZXNvbHZlckMuVkFMVUUsCisgICAgICAgICAgICAgICAgY3JmLnJlc29sdmUoSW50ZWdlci5jbGFzcywgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSkuZ2V0Q29udGV4dChJbnRlZ2VyLmNsYXNzKSk7CisKKyAgICAgICAgLy8gVGVzdCB0aGF0IHRoZXJlIGlzIG5vIG1hdGNoaW5nIHByb3ZpZGVyCisgICAgICAgIGFzc2VydE51bGwoY3JmLnJlc29sdmUoSW50ZWdlci5jbGFzcywgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vaW50ZXJuYWwvRXhjZXB0aW9uTWFwcGVyRmFjdG9yeVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vaW50ZXJuYWwvRXhjZXB0aW9uTWFwcGVyRmFjdG9yeVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGI0ZmZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9pbnRlcm5hbC9FeGNlcHRpb25NYXBwZXJGYWN0b3J5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMjA3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb24uaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5FeGNlcHRpb25NYXBwZXI7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuRXhjZXB0aW9uTWFwcGVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQWJzdHJhY3RCaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLkV4dGVuZGVkRXhjZXB0aW9uTWFwcGVyOworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBVbml0IHRlc3Qgb2Yge0BsaW5rIEV4Y2VwdGlvbk1hcHBlckZhY3Rvcnl9LgorICovCitwdWJsaWMgY2xhc3MgRXhjZXB0aW9uTWFwcGVyRmFjdG9yeVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRXh0ZW5kZWRFeGNlcHRpb25NYXBwZXJzIGV4dGVuZHMgQWJzdHJhY3RCaW5kZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgICAgICBiaW5kKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbk1hcHBlci5jbGFzcykudG8oRXhjZXB0aW9uTWFwcGVyLmNsYXNzKS5pbihTaW5nbGV0b24uY2xhc3MpOworICAgICAgICAgICAgYmluZChJbGxlZ2FsU3RhdGVFeGNlcHRpb25NYXBwZXIuY2xhc3MpLnRvKEV4Y2VwdGlvbk1hcHBlci5jbGFzcykuaW4oU2luZ2xldG9uLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQWxsTWFwcGVycyBleHRlbmRzIEFic3RyYWN0QmluZGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICAgICAgYmluZChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25NYXBwZXIuY2xhc3MpLnRvKEV4Y2VwdGlvbk1hcHBlci5jbGFzcykuaW4oU2luZ2xldG9uLmNsYXNzKTsKKyAgICAgICAgICAgIGJpbmQoSWxsZWdhbFN0YXRlRXhjZXB0aW9uTWFwcGVyLmNsYXNzKS50byhFeGNlcHRpb25NYXBwZXIuY2xhc3MpLmluKFNpbmdsZXRvbi5jbGFzcyk7CisgICAgICAgICAgICBiaW5kKFJ1bnRpbWVFeGNlcHRpb25NYXBwZXIuY2xhc3MpLnRvKEV4Y2VwdGlvbk1hcHBlci5jbGFzcykuaW4oU2luZ2xldG9uLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBzcGVjOgorICAgICAqIDxwLz4KKyAgICAgKiBzZXR1cDo8YnIvPgorICAgICAqIC0gaGF2ZSB0d28gZXh0ZW5kZWQgZXhjZXB0aW9uIG1hcHBlcnMsIG9yZGVyIG1hdHRlcnM8YnIvPgorICAgICAqIC0gYm90aCB1c2luZyB0aGUgc2FtZSBnZW5lcmljIHR5cGUgKFJ1bnRpbWVFeGNlcHRpb24pPGJyLz4KKyAgICAgKiAtIGZpcnN0IG1hcHBlciByZXR1cm4gaXNNYXBwYWJsZSB0cnVlIG9ubHkgdG8gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uPGJyLz4KKyAgICAgKiAtIHNlY29uZCBtYXBwZXIgcmV0dXJuIGlzTWFwcGFibGUgdHJ1ZSBvbmx5IHRvIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjxici8+CisgICAgICogPGJyLz4KKyAgICAgKiB3aGVuOjxici8+CisgICAgICogLSB7QGxpbmsgRXhjZXB0aW9uTWFwcGVyRmFjdG9yeSNmaW5kTWFwcGluZyhUaHJvd2FibGUpfSB3aXRoIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbnN0YW5jZTxici8+CisgICAgICogPGJyLz4KKyAgICAgKiB0aGVuOjxici8+CisgICAgICogLSBleGNlcHRpb24gbWFwcGVyIGZhY3RvcnkgcmV0dXJucyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb25NYXBwZXI8YnIvPgorICAgICAqIDxwLz4KKyAgICAgKiB3aHk6PGJyLz4KKyAgICAgKiAtIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBoYXMgdGhlIHNhbWUgZGlzdGFuY2UgKDEpIGZvciBib3RoIGV4Y2VwdGlvbiBtYXBwZXJzIGdlbmVyaWMgdHlwZSAoUnVudGltZUV4Y2VwdGlvbiksCisgICAgICogYnV0IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbidzIGlzTWFwcGFibGUgcmV0dXJuIHRydWUsIHNvIGl0IGlzIHRoZSB3aW5uZXIKKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIHVuZXhwZWN0ZWQgLSBpZiBhbnl0aGluZyBnb2VzIHdyb25nLCB0aGUgdGVzdCBmYWlscworICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpbmRNYXBwaW5nRXh0ZW5kZWRFeGNlcHRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciA9IEluamVjdGlvbnMuY3JlYXRlSW5qZWN0aW9uTWFuYWdlcihuZXcgRXh0ZW5kZWRFeGNlcHRpb25NYXBwZXJzKCkpOworICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLmNvbXBsZXRlUmVnaXN0cmF0aW9uKCk7CisgICAgICAgIGZpbmFsIEV4Y2VwdGlvbk1hcHBlckZhY3RvcnkgbWFwcGVyRmFjdG9yeSA9IG5ldyBFeGNlcHRpb25NYXBwZXJGYWN0b3J5KGluamVjdGlvbk1hbmFnZXIpOworCisgICAgICAgIGZpbmFsIEV4Y2VwdGlvbk1hcHBlciBtYXBwZXIgPSBtYXBwZXJGYWN0b3J5LmZpbmRNYXBwaW5nKG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKSk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbk1hcHBlciBzaG91bGQgYmUgcmV0dXJuZWQiLAorICAgICAgICAgICAgICAgIG1hcHBlciBpbnN0YW5jZW9mIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbk1hcHBlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBzcGVjOgorICAgICAqIDxwLz4KKyAgICAgKiBzZXR1cDo8YnIvPgorICAgICAqIC0gaGF2ZSAzIGV4Y2VwdGlvbiBtYXBwZXJzLCBvcmRlciBtYXR0ZXJzPGJyLz4KKyAgICAgKiAtIGZpcnN0IGlzICpub3QqIGV4dGVuZGVkIG1hcHBlciB0eXBlZCB0byBSdW50aW1lRXhjZXB0aW9uCisgICAgICogLSBzZWNvbmQgYW5kIHRoaXJkIGFyZSBleHRlbmRlZCBtYXBwZXJzIHR5cGUgdG8gUnVudGltZUV4Y2VwdGlvbgorICAgICAqIDxici8+CisgICAgICogd2hlbjo8YnIvPgorICAgICAqIC0ge0BsaW5rIEV4Y2VwdGlvbk1hcHBlckZhY3RvcnkjZmluZE1hcHBpbmcoVGhyb3dhYmxlKX0gaW52b2tlZCB3aXRoIFJ1bnRpbWVFeGNlcHRpb24gaW5zdGFuY2U8YnIvPgorICAgICAqIHRoZW46IDxici8+CisgICAgICogLSBleGNlcHRpb24gbWFwcGVyIGZhY3RvcnkgcmV0dXJucyBSdW50aW1lRXhjZXB0aW9uTWFwcGVyPGJyLz4KKyAgICAgKiA8cC8+CisgICAgICogd2h5Ojxici8+CisgICAgICogLSBSdW50aW1lRXhjZXB0aW9uIG1hcHBlciBoYXMgZGlzdGFuY2UgMCBmb3IgUnVudGltZUV4Y2VwdGlvbiwgaXQgaXMgbm90IGV4dGVuZGVkIG1hcHBlciwgc28gaXQgd2lsbCBiZSBjaG9zZW4KKyAgICAgKiBpbW1lZGlhdGVseSwgY2F1c2UgdGhlcmUgaXMgbm8gYmV0dGVyIG9wdGlvbiBwb3NzaWJsZQorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24gdW5leHBlY3RlZCAtIGlmIGFueXRoaW5nIGdvZXMgd3JvbmcsIHRoZSB0ZXN0IGZhaWxzCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmluZE1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyID0gSW5qZWN0aW9ucy5jcmVhdGVJbmplY3Rpb25NYW5hZ2VyKG5ldyBBbGxNYXBwZXJzKCkpOworICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLmNvbXBsZXRlUmVnaXN0cmF0aW9uKCk7CisgICAgICAgIGZpbmFsIEV4Y2VwdGlvbk1hcHBlckZhY3RvcnkgbWFwcGVyRmFjdG9yeSA9IG5ldyBFeGNlcHRpb25NYXBwZXJGYWN0b3J5KGluamVjdGlvbk1hbmFnZXIpOworCisgICAgICAgIGZpbmFsIEV4Y2VwdGlvbk1hcHBlcjxSdW50aW1lRXhjZXB0aW9uPiBtYXBwZXIgPSBtYXBwZXJGYWN0b3J5LmZpbmRNYXBwaW5nKG5ldyBSdW50aW1lRXhjZXB0aW9uKCkpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJSdW50aW1lRXhjZXB0aW9uTWFwcGVyIHNob3VsZCBiZSByZXR1cm5lZCIsIG1hcHBlciBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb25NYXBwZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgc3BlYzogPGJyLz4KKyAgICAgKiA8cC8+CisgICAgICogc2V0dXA6PGJyLz4KKyAgICAgKiAtIGhhdmUgMiBleHRlbmRlZCBtYXBwZXJzLCBvcmRlciBtYXR0ZXJzPGJyLz4KKyAgICAgKiAtIGZpcnN0IG1hcHBlciByZXR1cm4gaXNNYXBwYWJsZSB0cnVlIG9ubHkgdG8gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uPGJyLz4KKyAgICAgKiAtIHNlY29uZCBtYXBwZXIgcmV0dXJuIGlzTWFwcGFibGUgdHJ1ZSBvbmx5IHRvIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjxici8+CisgICAgICogPGJyLz4KKyAgICAgKiB3aGVuOjxici8+CisgICAgICogLSB7QGxpbmsgRXhjZXB0aW9uTWFwcGVyRmFjdG9yeSNmaW5kKENsYXNzKX0gaW52b2tlZCB3aXRoIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzczxici8+CisgICAgICogdGhlbjo8YnIvPgorICAgICAqIC0gZXhjZXB0aW9uIG1hcHBlciBmYWN0b3J5IHJldHVybnMgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uTWFwcGVyPGJyLz4KKyAgICAgKiA8cC8+CisgICAgICogd2h5Ojxici8+CisgICAgICogLSBib3RoIGV4Y2VwdGlvbiBtYXBwZXJzIGhhdmUgZGlzdGFuY2UgMSB0byBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIHdlIGRvbid0IGhhdmUgaW5zdGFuY2Ugb2YgdGhlCisgICAgICogSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLCBzbyB0aGUgaXNNYXBwYWJsZSBjaGVjayBpcyBub3QgdXNlZCBhbmQgYm90aCBhcmUgYWNjZXB0ZWQsIHRoZSBsYXRlciBhY2NlcHRlZCBpcworICAgICAqIHRoZSB3aW5uZXIKKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIHVuZXhwZWN0ZWQgLSBpZiBhbnl0aGluZyBnb2VzIHdyb25nLCB0aGUgdGVzdCBmYWlscworICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpbmRFeHRlbmRlZEV4Y2VwdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyID0gSW5qZWN0aW9ucy5jcmVhdGVJbmplY3Rpb25NYW5hZ2VyKG5ldyBFeHRlbmRlZEV4Y2VwdGlvbk1hcHBlcnMoKSk7CisgICAgICAgIGluamVjdGlvbk1hbmFnZXIuY29tcGxldGVSZWdpc3RyYXRpb24oKTsKKyAgICAgICAgZmluYWwgRXhjZXB0aW9uTWFwcGVyRmFjdG9yeSBtYXBwZXJGYWN0b3J5ID0gbmV3IEV4Y2VwdGlvbk1hcHBlckZhY3RvcnkoaW5qZWN0aW9uTWFuYWdlcik7CisKKyAgICAgICAgZmluYWwgRXhjZXB0aW9uTWFwcGVyIG1hcHBlciA9IG1hcHBlckZhY3RvcnkuZmluZChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24uY2xhc3MpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb25NYXBwZXIgc2hvdWxkIGJlIHJldHVybmVkIiwKKyAgICAgICAgICAgICAgICBtYXBwZXIgaW5zdGFuY2VvZiBJbGxlZ2FsU3RhdGVFeGNlcHRpb25NYXBwZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4dGVuZGVkIEV4Y2VwdGlvbiBNYXBwZXIgd2hpY2ggaGFzIFJ1bnRpbWVFeGNlcHRpb24gYXMgZ2VuZXJpYyB0eXBlIGFuZCBpc01hcHBhYmxlIHJldHVybnMgdHJ1ZSBpZiB0aGUKKyAgICAgKiBleGNlcHRpb24gaXMgaW5zdGFuY2Ugb2YgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbk1hcHBlciBpbXBsZW1lbnRzIEV4dGVuZGVkRXhjZXB0aW9uTWFwcGVyPFJ1bnRpbWVFeGNlcHRpb24+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNNYXBwYWJsZShmaW5hbCBSdW50aW1lRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbiBpbnN0YW5jZW9mIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgdG9SZXNwb25zZShmaW5hbCBSdW50aW1lRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlCisgICAgICAgICAgICAgICAgICAgIC5zdGF0dXMoUmVzcG9uc2UuU3RhdHVzLkJBRF9SRVFVRVNUKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogRXh0ZW5kZWQgRXhjZXB0aW9uIE1hcHBlciB3aGljaCBoYXMgUnVudGltZUV4Y2VwdGlvbiBhcyBnZW5lcmljIHR5cGUgYW5kIGlzTWFwcGFibGUgcmV0dXJucyB0cnVlIGlmIHRoZQorICAgICAqIGV4Y2VwdGlvbiBpcyBpbnN0YW5jZSBvZiBJbGxlZ2FsU3RhdGVFeGNlcHRpb24uCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uTWFwcGVyIGltcGxlbWVudHMgRXh0ZW5kZWRFeGNlcHRpb25NYXBwZXI8UnVudGltZUV4Y2VwdGlvbj4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc01hcHBhYmxlKGZpbmFsIFJ1bnRpbWVFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gZXhjZXB0aW9uIGluc3RhbmNlb2YgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSB0b1Jlc3BvbnNlKGZpbmFsIFJ1bnRpbWVFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2UKKyAgICAgICAgICAgICAgICAgICAgLnN0YXR1cyhSZXNwb25zZS5TdGF0dXMuU0VSVklDRV9VTkFWQUlMQUJMRSkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4Y2VwdGlvbiBNYXBwZXIgd2hpY2ggaGFzIFJ1bnRpbWVFeGNlcHRpb24gYXMgZ2VuZXJpYyB0eXBlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJ1bnRpbWVFeGNlcHRpb25NYXBwZXIgaW1wbGVtZW50cyBFeGNlcHRpb25NYXBwZXI8UnVudGltZUV4Y2VwdGlvbj4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgdG9SZXNwb25zZShmaW5hbCBSdW50aW1lRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlCisgICAgICAgICAgICAgICAgICAgIC5zdGF0dXMoUmVzcG9uc2UuU3RhdHVzLklOVEVSTkFMX1NFUlZFUl9FUlJPUikKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vaW50ZXJuYWwvSmF4cnNQcm92aWRlcnNUZXN0LmphdmEgYi90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL2ludGVybmFsL0pheHJzUHJvdmlkZXJzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYjYyMjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL2ludGVybmFsL0pheHJzUHJvdmlkZXJzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb24uaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5SdW50aW1lVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuQ29udGV4dFJlc29sdmVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJ1bnRpbWVEZWxlZ2F0ZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkJvb3RzdHJhcEJhZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Cb290c3RyYXBDb25maWd1cmF0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuQ29udGV4dFJlc29sdmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5FeGNlcHRpb25NYXBwZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkpheHJzUHJvdmlkZXJzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5BYnN0cmFjdEJpbmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLk1lc3NhZ2VCb2R5RmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLk1lc3NhZ2luZ0JpbmRlcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW9kZWwuaW50ZXJuYWwuQ29tbW9uQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1vZGVsLmludGVybmFsLkNvbXBvbmVudEJhZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLmludGVybmFsLlJlcXVlc3RTY29wZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uLlRlc3RSdW50aW1lRGVsZWdhdGU7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFNhbWU7CisKKy8qKsKuCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSmF4cnNQcm92aWRlcnNUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEJpbmRlciBleHRlbmRzIEFic3RyYWN0QmluZGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICAgICAgYmluZChuZXcgQ29udGV4dFJlc29sdmVyPFN0cmluZz4oKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb250ZXh0KENsYXNzPD8+IHR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIHlldC4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KS50byhuZXcgR2VuZXJpY1R5cGU8Q29udGV4dFJlc29sdmVyPFN0cmluZz4+KCkgeworICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIGJpbmQobmV3IENvbW1vbkNvbmZpZyhSdW50aW1lVHlwZS5TRVJWRVIsIENvbXBvbmVudEJhZy5FWENMVURFX0VNUFRZKSkudG8oQ29uZmlndXJhdGlvbi5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgSmF4cnNQcm92aWRlcnNUZXN0KCkgeworICAgICAgICBSdW50aW1lRGVsZWdhdGUuc2V0SW5zdGFuY2UobmV3IFRlc3RSdW50aW1lRGVsZWdhdGUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvdmlkZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciA9IEluamVjdGlvbnMuY3JlYXRlSW5qZWN0aW9uTWFuYWdlcigpOworICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyKG5ldyBNZXNzYWdpbmdCaW5kZXJzLk1lc3NhZ2VCb2R5UHJvdmlkZXJzKG51bGwsIFJ1bnRpbWVUeXBlLlNFUlZFUikpOworICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyKG5ldyBCaW5kZXIoKSk7CisKKyAgICAgICAgQm9vdHN0cmFwQmFnIGJvb3RzdHJhcEJhZyA9IG5ldyBCb290c3RyYXBCYWcoKTsKKyAgICAgICAgTGlzdDxCb290c3RyYXBDb25maWd1cmF0b3I+IGJvb3RzdHJhcENvbmZpZ3VyYXRvcnMgPSBBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgICAgIG5ldyBSZXF1ZXN0U2NvcGUuUmVxdWVzdFNjb3BlQ29uZmlndXJhdG9yKCksCisgICAgICAgICAgICAgICAgbmV3IFRlc3RDb25maWdDb25maWd1cmF0b3IoKSwKKyAgICAgICAgICAgICAgICBuZXcgQ29udGV4dFJlc29sdmVyRmFjdG9yeS5Db250ZXh0UmVzb2x2ZXJzQ29uZmlndXJhdG9yKCksCisgICAgICAgICAgICAgICAgbmV3IE1lc3NhZ2VCb2R5RmFjdG9yeS5NZXNzYWdlQm9keVdvcmtlcnNDb25maWd1cmF0b3IoKSwKKyAgICAgICAgICAgICAgICBuZXcgRXhjZXB0aW9uTWFwcGVyRmFjdG9yeS5FeGNlcHRpb25NYXBwZXJzQ29uZmlndXJhdG9yKCksCisgICAgICAgICAgICAgICAgbmV3IEpheHJzUHJvdmlkZXJzLlByb3ZpZGVyc0NvbmZpZ3VyYXRvcigpKTsKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5yZWdpc3RlcihuZXcgVGVzdEJpbmRlcigpKTsKKworICAgICAgICBUZXN0QmluZGVyLmluaXRQcm92aWRlcnMoaW5qZWN0aW9uTWFuYWdlcik7CisgICAgICAgIGJvb3RzdHJhcENvbmZpZ3VyYXRvcnMuZm9yRWFjaChjb25maWd1cmF0b3IgLT4gY29uZmlndXJhdG9yLmluaXQoaW5qZWN0aW9uTWFuYWdlciwgYm9vdHN0cmFwQmFnKSk7CisgICAgICAgIGluamVjdGlvbk1hbmFnZXIuY29tcGxldGVSZWdpc3RyYXRpb24oKTsKKyAgICAgICAgYm9vdHN0cmFwQ29uZmlndXJhdG9ycy5mb3JFYWNoKGNvbmZpZ3VyYXRvciAtPiBjb25maWd1cmF0b3IucG9zdEluaXQoaW5qZWN0aW9uTWFuYWdlciwgYm9vdHN0cmFwQmFnKSk7CisKKyAgICAgICAgUmVxdWVzdFNjb3BlIHNjb3BlID0gYm9vdHN0cmFwQmFnLmdldFJlcXVlc3RTY29wZSgpOworCisgICAgICAgIHNjb3BlLnJ1bkluU2NvcGUoKENhbGxhYmxlPE9iamVjdD4pICgpIC0+IHsKKyAgICAgICAgICAgIFByb3ZpZGVycyBpbnN0YW5jZSA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoUHJvdmlkZXJzLmNsYXNzKTsKKworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChpbnN0YW5jZSk7CisgICAgICAgICAgICBhc3NlcnRTYW1lKEpheHJzUHJvdmlkZXJzLmNsYXNzLCBpbnN0YW5jZS5nZXRDbGFzcygpKTsKKworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChpbnN0YW5jZS5nZXRFeGNlcHRpb25NYXBwZXIoVGhyb3dhYmxlLmNsYXNzKSk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGluc3RhbmNlLmdldE1lc3NhZ2VCb2R5UmVhZGVyKFN0cmluZy5jbGFzcywgU3RyaW5nLmNsYXNzLCBuZXcgQW5ub3RhdGlvblswXSwKKyAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChpbnN0YW5jZS5nZXRNZXNzYWdlQm9keVdyaXRlcihTdHJpbmcuY2xhc3MsIFN0cmluZy5jbGFzcywgbmV3IEFubm90YXRpb25bMF0sCisgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoaW5zdGFuY2UuZ2V0Q29udGV4dFJlc29sdmVyKFN0cmluZy5jbGFzcywgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vaW50ZXJuYWwvTG9jYWxpemF0aW9uTWVzc2FnZXNUZXN0LmphdmEgYi90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL2ludGVybmFsL0xvY2FsaXphdGlvbk1lc3NhZ2VzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYzY3OWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL2ludGVybmFsL0xvY2FsaXphdGlvbk1lc3NhZ2VzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbi5pbnRlcm5hbDsKKworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuTG9jYWxpemF0aW9uTWVzc2FnZXM7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFRlc3RzIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlc30uCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBMb2NhbGl6YXRpb25NZXNzYWdlc1Rlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0KCkgeworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShMb2NhbGl6YXRpb25NZXNzYWdlcy5DT01QT05FTlRfQ09OVFJBQ1RTX0VNUFRZX09SX05VTEwoIlRZUEUiKQorICAgICAgICAgICAgICAgIC5jb250YWlucygiQXR0ZW1wdCB0byByZWdpc3RlciBjb21wb25lbnQgb2YgdHlwZSBUWVBFIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vaW50ZXJuYWwvUHJvdmlkZXJCaW5kZXJUZXN0LmphdmEgYi90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL2ludGVybmFsL1Byb3ZpZGVyQmluZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlNjA4NzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL2ludGVybmFsL1Byb3ZpZGVyQmluZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjY3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb24uaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgamF2YXgud3MucnMuUnVudGltZVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlc3BvbnNlRmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUnVudGltZURlbGVnYXRlOworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5CaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkNvbXBvc2l0ZUJpbmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQ3VzdG9tQW5ub3RhdGlvbkxpdGVyYWw7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LlByb3ZpZGVyQmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5Qcm92aWRlcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5NZXNzYWdpbmdCaW5kZXJzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb24uVGVzdFJ1bnRpbWVEZWxlZ2F0ZTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIFNlcnZpY2VQcm92aWRlcnMgdW5pdCB0ZXN0LgorICoKKyAqIEBhdXRob3IgU2FudGlhZ28gUGVyaWNhcy1HZWVydHNlbiAoc2FudGlhZ28ucGVyaWNhc2dlZXJ0c2VuIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFByb3ZpZGVyQmluZGVyVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNeVByb3ZpZGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlSZWFkZXIsIE1lc3NhZ2VCb2R5V3JpdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZShDbGFzcyB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIHlldC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0IHJlYWRGcm9tKENsYXNzIHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcCBodHRwSGVhZGVycywgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKQorICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIHlldC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShDbGFzcyB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCB5ZXQuIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShPYmplY3QgdCwgQ2xhc3MgdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCB5ZXQuIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbyhPYmplY3QgdCwgQ2xhc3MgdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsIE11bHRpdmFsdWVkTWFwIGh0dHBIZWFkZXJzLCBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKQorICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIHlldC4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIEJpbmRlciBpbml0QmluZGVycyhCaW5kZXIuLi4gYmluZGVycykgeworICAgICAgICBMaXN0PEJpbmRlcj4gYmluZGVyTGlzdCA9IEFycmF5cy5zdHJlYW0oYmluZGVycykuY29sbGVjdChDb2xsZWN0b3JzLnRvTGlzdCgpKTsKKyAgICAgICAgYmluZGVyTGlzdC5hZGQobmV3IE1lc3NhZ2luZ0JpbmRlcnMuTWVzc2FnZUJvZHlQcm92aWRlcnMobnVsbCwgUnVudGltZVR5cGUuU0VSVkVSKSk7CisgICAgICAgIHJldHVybiBDb21wb3NpdGVCaW5kZXIud3JhcChiaW5kZXJMaXN0KTsKKyAgICB9CisKKyAgICBwdWJsaWMgUHJvdmlkZXJCaW5kZXJUZXN0KCkgeworICAgICAgICBSdW50aW1lRGVsZWdhdGUuc2V0SW5zdGFuY2UobmV3IFRlc3RSdW50aW1lRGVsZWdhdGUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VydmljZXNOb3RFbXB0eSgpIHsKKyAgICAgICAgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyID0gSW5qZWN0aW9ucy5jcmVhdGVJbmplY3Rpb25NYW5hZ2VyKGluaXRCaW5kZXJzKCkpOworICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLmNvbXBsZXRlUmVnaXN0cmF0aW9uKCk7CisgICAgICAgIFNldDxNZXNzYWdlQm9keVJlYWRlcj4gcHJvdmlkZXJzID0gUHJvdmlkZXJzLmdldFByb3ZpZGVycyhpbmplY3Rpb25NYW5hZ2VyLCBNZXNzYWdlQm9keVJlYWRlci5jbGFzcyk7CisgICAgICAgIGFzc2VydFRydWUocHJvdmlkZXJzLnNpemUoKSA+IDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlcnZpY2VzTWJyKCkgeworICAgICAgICBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIgPSBJbmplY3Rpb25zLmNyZWF0ZUluamVjdGlvbk1hbmFnZXIoaW5pdEJpbmRlcnMoKSk7CisgICAgICAgIGluamVjdGlvbk1hbmFnZXIuY29tcGxldGVSZWdpc3RyYXRpb24oKTsKKyAgICAgICAgU2V0PE1lc3NhZ2VCb2R5UmVhZGVyPiBwcm92aWRlcnMgPSBQcm92aWRlcnMuZ2V0UHJvdmlkZXJzKGluamVjdGlvbk1hbmFnZXIsIE1lc3NhZ2VCb2R5UmVhZGVyLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwcm92aWRlcnMuc2l6ZSgpID4gMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VydmljZXNNYncoKSB7CisgICAgICAgIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciA9IEluamVjdGlvbnMuY3JlYXRlSW5qZWN0aW9uTWFuYWdlcihpbml0QmluZGVycygpKTsKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5jb21wbGV0ZVJlZ2lzdHJhdGlvbigpOworICAgICAgICBTZXQ8TWVzc2FnZUJvZHlXcml0ZXI+IHByb3ZpZGVycyA9IFByb3ZpZGVycy5nZXRQcm92aWRlcnMoaW5qZWN0aW9uTWFuYWdlciwgTWVzc2FnZUJvZHlXcml0ZXIuY2xhc3MpOworICAgICAgICBhc3NlcnRUcnVlKHByb3ZpZGVycy5zaXplKCkgPiAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm92aWRlcnNNYnIoKSB7CisgICAgICAgIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciA9IEluamVjdGlvbnMuY3JlYXRlSW5qZWN0aW9uTWFuYWdlcihpbml0QmluZGVycygpKTsKKyAgICAgICAgUHJvdmlkZXJCaW5kZXIgcHJvdmlkZXJCaW5kZXIgPSBuZXcgUHJvdmlkZXJCaW5kZXIoaW5qZWN0aW9uTWFuYWdlcik7CisgICAgICAgIHByb3ZpZGVyQmluZGVyLmJpbmRDbGFzc2VzKENvbGxlY3Rpb25zLnNpbmdsZXRvbihNeVByb3ZpZGVyLmNsYXNzKSk7CisKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5jb21wbGV0ZVJlZ2lzdHJhdGlvbigpOworICAgICAgICBTZXQ8TWVzc2FnZUJvZHlSZWFkZXI+IHByb3ZpZGVycyA9IFByb3ZpZGVycy5nZXRDdXN0b21Qcm92aWRlcnMoaW5qZWN0aW9uTWFuYWdlciwgTWVzc2FnZUJvZHlSZWFkZXIuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgaW5zdGFuY2VzT2ZUeXBlKE15UHJvdmlkZXIuY2xhc3MsIHByb3ZpZGVycykuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm92aWRlcnNNYncoKSB7CisgICAgICAgIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciA9IEluamVjdGlvbnMuY3JlYXRlSW5qZWN0aW9uTWFuYWdlcihpbml0QmluZGVycygpKTsKKyAgICAgICAgUHJvdmlkZXJCaW5kZXIgcHJvdmlkZXJCaW5kZXIgPSBuZXcgUHJvdmlkZXJCaW5kZXIoaW5qZWN0aW9uTWFuYWdlcik7CisgICAgICAgIHByb3ZpZGVyQmluZGVyLmJpbmRDbGFzc2VzKENvbGxlY3Rpb25zLnNpbmdsZXRvbihNeVByb3ZpZGVyLmNsYXNzKSk7CisKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5jb21wbGV0ZVJlZ2lzdHJhdGlvbigpOworICAgICAgICBTZXQ8TWVzc2FnZUJvZHlXcml0ZXI+IHByb3ZpZGVycyA9IFByb3ZpZGVycy5nZXRDdXN0b21Qcm92aWRlcnMoaW5qZWN0aW9uTWFuYWdlciwgTWVzc2FnZUJvZHlXcml0ZXIuY2xhc3MpOworICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPE15UHJvdmlkZXI+IG15UHJvdmlkZXJzID0gaW5zdGFuY2VzT2ZUeXBlKE15UHJvdmlkZXIuY2xhc3MsIHByb3ZpZGVycyk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBteVByb3ZpZGVycy5zaXplKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByb3ZpZGVyc01ickluc3RhbmNlKCkgeworICAgICAgICBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIgPSBJbmplY3Rpb25zLmNyZWF0ZUluamVjdGlvbk1hbmFnZXIoaW5pdEJpbmRlcnMoKSk7CisgICAgICAgIFByb3ZpZGVyQmluZGVyIHByb3ZpZGVyQmluZGVyID0gbmV3IFByb3ZpZGVyQmluZGVyKGluamVjdGlvbk1hbmFnZXIpOworICAgICAgICBwcm92aWRlckJpbmRlci5iaW5kSW5zdGFuY2VzKENvbGxlY3Rpb25zLnNpbmdsZXRvbihuZXcgTXlQcm92aWRlcigpKSk7CisKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5jb21wbGV0ZVJlZ2lzdHJhdGlvbigpOworICAgICAgICBTZXQ8TWVzc2FnZUJvZHlSZWFkZXI+IHByb3ZpZGVycyA9IFByb3ZpZGVycy5nZXRDdXN0b21Qcm92aWRlcnMoaW5qZWN0aW9uTWFuYWdlciwgTWVzc2FnZUJvZHlSZWFkZXIuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgaW5zdGFuY2VzT2ZUeXBlKE15UHJvdmlkZXIuY2xhc3MsIHByb3ZpZGVycykuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm92aWRlcnNNYndJbnN0YW5jZSgpIHsKKyAgICAgICAgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyID0gSW5qZWN0aW9ucy5jcmVhdGVJbmplY3Rpb25NYW5hZ2VyKGluaXRCaW5kZXJzKCkpOworICAgICAgICBQcm92aWRlckJpbmRlciBwcm92aWRlckJpbmRlciA9IG5ldyBQcm92aWRlckJpbmRlcihpbmplY3Rpb25NYW5hZ2VyKTsKKyAgICAgICAgcHJvdmlkZXJCaW5kZXIuYmluZEluc3RhbmNlcyhDb2xsZWN0aW9ucy5zaW5nbGV0b24obmV3IE15UHJvdmlkZXIoKSkpOworCisgICAgICAgIGluamVjdGlvbk1hbmFnZXIuY29tcGxldGVSZWdpc3RyYXRpb24oKTsKKyAgICAgICAgU2V0PE1lc3NhZ2VCb2R5V3JpdGVyPiBwcm92aWRlcnMgPSBQcm92aWRlcnMuZ2V0Q3VzdG9tUHJvdmlkZXJzKGluamVjdGlvbk1hbmFnZXIsIE1lc3NhZ2VCb2R5V3JpdGVyLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGluc3RhbmNlc09mVHlwZShNeVByb3ZpZGVyLmNsYXNzLCBwcm92aWRlcnMpLnNpemUoKSwgMSk7CisgICAgfQorCisgICAgcHJpdmF0ZSA8VD4gQ29sbGVjdGlvbjxUPiBpbnN0YW5jZXNPZlR5cGUoZmluYWwgQ2xhc3M8VD4gYywgQ29sbGVjdGlvbjw/PiBjb2xsZWN0aW9uKSB7CisKKyAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb24uc3RyZWFtKCkKKyAgICAgICAgICAgICAgICAuZmlsdGVyKChqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlPE9iamVjdD4pIG8gLT4gby5nZXRDbGFzcygpID09IGMpCisgICAgICAgICAgICAgICAgLm1hcCgoamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uPE9iamVjdCwgVD4pIGM6OmNhc3QpCisgICAgICAgICAgICAgICAgLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgfQorCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21SZWdpc3RyYXRpb24oKSB7CisgICAgICAgIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciA9IEluamVjdGlvbnMuY3JlYXRlSW5qZWN0aW9uTWFuYWdlcigpOworCisgICAgICAgIFByb3ZpZGVyQmluZGVyIHByb3ZpZGVyQmluZGVyID0gbmV3IFByb3ZpZGVyQmluZGVyKGluamVjdGlvbk1hbmFnZXIpOworICAgICAgICBwcm92aWRlckJpbmRlci5iaW5kQ2xhc3NlcyhDaGlsZC5jbGFzcyk7CisgICAgICAgIHByb3ZpZGVyQmluZGVyLmJpbmRDbGFzc2VzKE5vdEZpbHRlckNoaWxkLmNsYXNzKTsKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5jb21wbGV0ZVJlZ2lzdHJhdGlvbigpOworCisgICAgICAgIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIgcmVxdWVzdEZpbHRlciA9IGdldFJlcXVlc3RGaWx0ZXIoaW5qZWN0aW9uTWFuYWdlcik7CisgICAgICAgIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIgcmVxdWVzdEZpbHRlcjIgPSBnZXRSZXF1ZXN0RmlsdGVyKGluamVjdGlvbk1hbmFnZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMocmVxdWVzdEZpbHRlciwgcmVxdWVzdEZpbHRlcjIpOworCisKKyAgICAgICAgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXIgcmVzcG9uc2VGaWx0ZXIgPSBnZXRSZXNwb25zZUZpbHRlcihpbmplY3Rpb25NYW5hZ2VyKTsKKyAgICAgICAgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXIgcmVzcG9uc2VGaWx0ZXIyID0gZ2V0UmVzcG9uc2VGaWx0ZXIoaW5qZWN0aW9uTWFuYWdlcik7CisgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VGaWx0ZXIgPT0gcmVzcG9uc2VGaWx0ZXIyKTsKKworICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlRmlsdGVyID09IHJlcXVlc3RGaWx0ZXIpOworCisgICAgICAgIC8vIG9ubHkgb25lIGZpbHRlciBzaG91bGQgYmUgcmVnaXN0ZXJlZAorICAgICAgICBDb2xsZWN0aW9uPENvbnRhaW5lclJlc3BvbnNlRmlsdGVyPiBmaWx0ZXJzID0KKyAgICAgICAgICAgICAgICBQcm92aWRlcnMuZ2V0Q3VzdG9tUHJvdmlkZXJzKGluamVjdGlvbk1hbmFnZXIsIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGZpbHRlcnMuc2l6ZSgpKTsKKworICAgICAgICBDaGlsZCBjaGlsZCA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoQ2hpbGQuY2xhc3MpOworICAgICAgICBDaGlsZCBjaGlsZDIgPSBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKENoaWxkLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRUcnVlKGNoaWxkICE9IHJlc3BvbnNlRmlsdGVyKTsKKworICAgICAgICBhc3NlcnRUcnVlKGNoaWxkID09IGNoaWxkMik7CisgICAgfQorCisgICAgcHJpdmF0ZSBDb250YWluZXJSZXNwb25zZUZpbHRlciBnZXRSZXNwb25zZUZpbHRlcihJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIpIHsKKyAgICAgICAgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXIgcmVzcG9uc2VGaWx0ZXIgPQorICAgICAgICAgICAgICAgIGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXIuY2xhc3MsIEN1c3RvbUFubm90YXRpb25MaXRlcmFsLklOU1RBTkNFKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKENoaWxkLmNsYXNzLCByZXNwb25zZUZpbHRlci5nZXRDbGFzcygpKTsKKyAgICAgICAgcmV0dXJuIHJlc3BvbnNlRmlsdGVyOworICAgIH0KKworICAgIHByaXZhdGUgQ29udGFpbmVyUmVxdWVzdEZpbHRlciBnZXRSZXF1ZXN0RmlsdGVyKEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlcikgeworICAgICAgICBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHJlcXVlc3RGaWx0ZXIgPQorICAgICAgICAgICAgICAgIGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoQ29udGFpbmVyUmVxdWVzdEZpbHRlci5jbGFzcywgQ3VzdG9tQW5ub3RhdGlvbkxpdGVyYWwuSU5TVEFOQ0UpOworICAgICAgICBhc3NlcnRFcXVhbHMoQ2hpbGQuY2xhc3MsIHJlcXVlc3RGaWx0ZXIuZ2V0Q2xhc3MoKSk7CisgICAgICAgIHJldHVybiByZXF1ZXN0RmlsdGVyOworICAgIH0KKworICAgIGludGVyZmFjZSBQYXJlbnRJbnRlcmZhY2UgeworICAgIH0KKworICAgIGludGVyZmFjZSBDaGlsZEludGVyZmFjZSBleHRlbmRzIENoaWxkU3VwZXJJbnRlcmZhY2UgeworICAgIH0KKworCisgICAgaW50ZXJmYWNlIFNlY29uZENoaWxkSW50ZXJmYWNlIHsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgQ2hpbGRTdXBlckludGVyZmFjZSBleHRlbmRzIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyIHsKKyAgICB9CisKKyAgICBAU2luZ2xldG9uCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXJlbnQgaW1wbGVtZW50cyBQYXJlbnRJbnRlcmZhY2UsIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB9CisgICAgfQorCisgICAgQFNpbmdsZXRvbgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2hpbGQgZXh0ZW5kcyBQYXJlbnQgaW1wbGVtZW50cyBDaGlsZEludGVyZmFjZSwgU2Vjb25kQ2hpbGRJbnRlcmZhY2UgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LCBDb250YWluZXJSZXNwb25zZUNvbnRleHQgcmVzcG9uc2VDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm90RmlsdGVyQ2hpbGQgaW1wbGVtZW50cyBQYXJlbnRJbnRlcmZhY2UgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vaW50ZXJuYWwvVGVzdEJpbmRlci5qYXZhIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9pbnRlcm5hbC9UZXN0QmluZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE2Njc0OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vaW50ZXJuYWwvVGVzdEJpbmRlci5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbi5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKKworaW1wb3J0IGphdmF4LndzLnJzLlJ1bnRpbWVUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LkV4Y2VwdGlvbk1hcHBlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5BYnN0cmFjdEJpbmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuUHJvdmlkZXJCaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5NZXNzYWdpbmdCaW5kZXJzOworCisvKioKKyAqIEJpbmRlciBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgVGVzdEJpbmRlciBleHRlbmRzIEFic3RyYWN0QmluZGVyIHsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbml0UHJvdmlkZXJzKGZpbmFsIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlcikgeworICAgICAgICBpbml0UHJvdmlkZXJzKGluamVjdGlvbk1hbmFnZXIsIENvbGxlY3Rpb25zLmVtcHR5U2V0KCksIENvbGxlY3Rpb25zLmVtcHR5U2V0KCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbml0UHJvdmlkZXJzKGZpbmFsIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJdGVyYWJsZTxDbGFzczw/Pj4gcHJvdmlkZXJDbGFzc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEl0ZXJhYmxlPE9iamVjdD4gcHJvdmlkZXJJbnN0YW5jZXMpIHsKKyAgICAgICAgZmluYWwgUHJvdmlkZXJCaW5kZXIgcHJvdmlkZXJCaW5kZXIgPSBuZXcgUHJvdmlkZXJCaW5kZXIoaW5qZWN0aW9uTWFuYWdlcik7CisgICAgICAgIHByb3ZpZGVyQmluZGVyLmJpbmRDbGFzc2VzKHByb3ZpZGVyQ2xhc3Nlcyk7CisgICAgICAgIHByb3ZpZGVyQmluZGVyLmJpbmRJbnN0YW5jZXMocHJvdmlkZXJJbnN0YW5jZXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgaW5zdGFsbChuZXcgTWVzc2FnaW5nQmluZGVycy5NZXNzYWdlQm9keVByb3ZpZGVycyhudWxsLCBSdW50aW1lVHlwZS5TRVJWRVIpKTsKKworICAgICAgICBiaW5kKG5ldyBFeGNlcHRpb25NYXBwZXI8VGhyb3dhYmxlPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFJlc3BvbnNlIHRvUmVzcG9uc2UoVGhyb3dhYmxlIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIGlmIChleGNlcHRpb24gaW5zdGFuY2VvZiBOdW1iZXJGb3JtYXRFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKC0xKS5idWlsZCgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4Y2VwdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pLnRvKEV4Y2VwdGlvbk1hcHBlci5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9pbnRlcm5hbC9UZXN0Q29uZmlnQ29uZmlndXJhdG9yLmphdmEgYi90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL2ludGVybmFsL1Rlc3RDb25maWdDb25maWd1cmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjE3Y2E5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9pbnRlcm5hbC9UZXN0Q29uZmlnQ29uZmlndXJhdG9yLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uLmludGVybmFsOworCitpbXBvcnQgamF2YXgud3MucnMuUnVudGltZVR5cGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5Cb290c3RyYXBCYWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuQm9vdHN0cmFwQ29uZmlndXJhdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1vZGVsLmludGVybmFsLkNvbW1vbkNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb2RlbC5pbnRlcm5hbC5Db21wb25lbnRCYWc7CisKKy8qKgorICogQ29uZmlndXJhdG9yIHdoaWNoIGluaXRpYWxpemVzIGNvbmZpZ3VyYXRpb24uCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0Q29uZmlnQ29uZmlndXJhdG9yIGltcGxlbWVudHMgQm9vdHN0cmFwQ29uZmlndXJhdG9yIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGluaXQoSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyLCBCb290c3RyYXBCYWcgYm9vdHN0cmFwQmFnKSB7CisgICAgICAgIGJvb3RzdHJhcEJhZy5zZXRDb25maWd1cmF0aW9uKG5ldyBDb21tb25Db25maWcoUnVudGltZVR5cGUuU0VSVkVSLCBDb21wb25lbnRCYWcuRVhDTFVERV9FTVBUWSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHBvc3RJbml0KEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciwgQm9vdHN0cmFwQmFnIGJvb3RzdHJhcEJhZykgeworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9pbnRlcm5hbC9pbmplY3QvUmVmZXJlbmNpbmdGYWN0b3J5VGVzdC5qYXZhIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9pbnRlcm5hbC9pbmplY3QvUmVmZXJlbmNpbmdGYWN0b3J5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYWY5MjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL2ludGVybmFsL2luamVjdC9SZWZlcmVuY2luZ0ZhY3RvcnlUZXN0LmphdmEKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbi5pbnRlcm5hbC5pbmplY3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljVHlwZTsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQWJzdHJhY3RCaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LlJlZmVyZW5jaW5nRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uUmVmOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKKworLyoqCisgKiBSZWZlcmVuY2luZyBmYWN0b3J5IHRlc3QuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFJlZmVyZW5jaW5nRmFjdG9yeVRlc3QgZXh0ZW5kcyBBYnN0cmFjdEJpbmRlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBGb28geworICAgICAgICBmaW5hbCBpbnQgdmFsdWU7CisKKyAgICAgICAgcHJpdmF0ZSBGb28oaW50IHZhbHVlKSB7CisgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBWYWx1ZUluamVjdGVkIHsKKworICAgICAgICBASW5qZWN0CisgICAgICAgIEZvbyBmb287CisgICAgICAgIEBJbmplY3QKKyAgICAgICAgTGlzdDxJbnRlZ2VyPiBpbnRlZ2VyczsKKyAgICAgICAgQEluamVjdAorICAgICAgICBMaXN0PFN0cmluZz4gc3RyaW5nczsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSZWZJbmplY3RlZCB7CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBSZWY8Rm9vPiBmb287CisgICAgICAgIEBJbmplY3QKKyAgICAgICAgUmVmPExpc3Q8SW50ZWdlcj4+IGludGVnZXJzOworICAgICAgICBASW5qZWN0CisgICAgICAgIFJlZjxMaXN0PFN0cmluZz4+IHN0cmluZ3M7CisgICAgfQorCisgICAgLy8KKyAgICBwcml2YXRlIEZvbyBleHBlY3RlZEZvbyA9IG51bGw7CisgICAgcHJpdmF0ZSBMaXN0PEludGVnZXI+IGV4cGVjdGVkSW50ZWdlcnMgPSBudWxsOworICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGV4cGVjdGVkU3RyaW5ncyA9IG5ldyBMaW5rZWRMaXN0PFN0cmluZz4oKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEZvb1JlZmVyZW5jaW5nRmFjdG9yeSBleHRlbmRzIFJlZmVyZW5jaW5nRmFjdG9yeTxGb28+IHsKKyAgICAgICAgQEluamVjdAorICAgICAgICBwdWJsaWMgRm9vUmVmZXJlbmNpbmdGYWN0b3J5KFByb3ZpZGVyPFJlZjxGb28+PiByZWZlcmVuY2VGYWN0b3J5KSB7CisgICAgICAgICAgICBzdXBlcihyZWZlcmVuY2VGYWN0b3J5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIExpc3RPZkludGVnZXJSZWZlcmVuY2luZ0ZhY3RvcnkgZXh0ZW5kcyBSZWZlcmVuY2luZ0ZhY3Rvcnk8TGlzdDxJbnRlZ2VyPj4geworICAgICAgICBASW5qZWN0CisgICAgICAgIHB1YmxpYyBMaXN0T2ZJbnRlZ2VyUmVmZXJlbmNpbmdGYWN0b3J5KFByb3ZpZGVyPFJlZjxMaXN0PEludGVnZXI+Pj4gcmVmZXJlbmNlRmFjdG9yeSkgeworICAgICAgICAgICAgc3VwZXIocmVmZXJlbmNlRmFjdG9yeSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBMaXN0T2ZTdHJpbmdSZWZlcmVuY2luZ0ZhY3RvcnkgZXh0ZW5kcyBSZWZlcmVuY2luZ0ZhY3Rvcnk8TGlzdDxTdHJpbmc+PiB7CisgICAgICAgIEBJbmplY3QKKyAgICAgICAgcHVibGljIExpc3RPZlN0cmluZ1JlZmVyZW5jaW5nRmFjdG9yeShQcm92aWRlcjxSZWY8TGlzdDxTdHJpbmc+Pj4gcmVmZXJlbmNlRmFjdG9yeSkgeworICAgICAgICAgICAgc3VwZXIocmVmZXJlbmNlRmFjdG9yeSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgIGJpbmRGYWN0b3J5KEZvb1JlZmVyZW5jaW5nRmFjdG9yeS5jbGFzcykudG8oRm9vLmNsYXNzKTsKKyAgICAgICAgYmluZEZhY3RvcnkoUmVmZXJlbmNpbmdGYWN0b3J5LnJlZmVyZW5jZUZhY3RvcnkoKSkudG8obmV3IEdlbmVyaWNUeXBlPFJlZjxGb28+PigpIHt9KS5pbihTaW5nbGV0b24uY2xhc3MpOworCisgICAgICAgIGJpbmRGYWN0b3J5KExpc3RPZkludGVnZXJSZWZlcmVuY2luZ0ZhY3RvcnkuY2xhc3MpLnRvKG5ldyBHZW5lcmljVHlwZTxMaXN0PEludGVnZXI+PigpIHt9KTsKKyAgICAgICAgYmluZEZhY3RvcnkoUmVmZXJlbmNpbmdGYWN0b3J5LnJlZmVyZW5jZUZhY3RvcnkoKSkudG8obmV3IEdlbmVyaWNUeXBlPFJlZjxMaXN0PEludGVnZXI+Pj4oKSB7CisgICAgICAgIH0pLmluKFNpbmdsZXRvbi5jbGFzcyk7CisKKyAgICAgICAgYmluZEZhY3RvcnkoTGlzdE9mU3RyaW5nUmVmZXJlbmNpbmdGYWN0b3J5LmNsYXNzKS50byhuZXcgR2VuZXJpY1R5cGU8TGlzdDxTdHJpbmc+PigpIHt9KTsKKyAgICAgICAgYmluZEZhY3RvcnkoUmVmZXJlbmNpbmdGYWN0b3J5LnJlZmVyZW5jZUZhY3RvcnkoZXhwZWN0ZWRTdHJpbmdzKSkudG8obmV3IEdlbmVyaWNUeXBlPFJlZjxMaXN0PFN0cmluZz4+PigpIHsKKyAgICAgICAgfSkuaW4oU2luZ2xldG9uLmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWZlcmVuY2VkIGJpbmRpbmcgdGVzdC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWZlcmVuY2VkQmluZGluZygpIHsKKyAgICAgICAgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyID0gSW5qZWN0aW9ucy5jcmVhdGVJbmplY3Rpb25NYW5hZ2VyKHRoaXMpOworICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLmNvbXBsZXRlUmVnaXN0cmF0aW9uKCk7CisKKyAgICAgICAgUmVmSW5qZWN0ZWQgcmVmVmFsdWVzID0gaW5qZWN0aW9uTWFuYWdlci5jcmVhdGVBbmRJbml0aWFsaXplKFJlZkluamVjdGVkLmNsYXNzKTsKKyAgICAgICAgZXhwZWN0ZWRGb28gPSBuZXcgRm9vKDEwKTsKKyAgICAgICAgcmVmVmFsdWVzLmZvby5zZXQoZXhwZWN0ZWRGb28pOworICAgICAgICBleHBlY3RlZEludGVnZXJzID0gbmV3IExpbmtlZExpc3Q8SW50ZWdlcj4oKTsKKyAgICAgICAgcmVmVmFsdWVzLmludGVnZXJzLnNldChleHBlY3RlZEludGVnZXJzKTsKKyAgICAgICAgZXhwZWN0ZWRTdHJpbmdzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7CisgICAgICAgIHJlZlZhbHVlcy5zdHJpbmdzLnNldChleHBlY3RlZFN0cmluZ3MpOworCisgICAgICAgIFZhbHVlSW5qZWN0ZWQgdXBkYXRlZFZhbHVlcyA9IGluamVjdGlvbk1hbmFnZXIuY3JlYXRlQW5kSW5pdGlhbGl6ZShWYWx1ZUluamVjdGVkLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0U2FtZShleHBlY3RlZEZvbywgdXBkYXRlZFZhbHVlcy5mb28pOworICAgICAgICBhc3NlcnRTYW1lKGV4cGVjdGVkSW50ZWdlcnMsIHVwZGF0ZWRWYWx1ZXMuaW50ZWdlcnMpOworICAgICAgICBhc3NlcnRTYW1lKGV4cGVjdGVkU3RyaW5ncywgdXBkYXRlZFZhbHVlcy5zdHJpbmdzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL21lc3NhZ2UvaW50ZXJuYWwvQWNjZXB0YWJsZU1lZGlhVHlwZVN0cmluZ1JlcHJlc2VudGF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9tZXNzYWdlL2ludGVybmFsL0FjY2VwdGFibGVNZWRpYVR5cGVTdHJpbmdSZXByZXNlbnRhdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzE0MjU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9tZXNzYWdlL2ludGVybmFsL0FjY2VwdGFibGVNZWRpYVR5cGVTdHJpbmdSZXByZXNlbnRhdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb24ubWVzc2FnZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuQWNjZXB0YWJsZU1lZGlhVHlwZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLk1lZGlhVHlwZVByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuUXVhbGl0eTsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CisKKworLyoqCisgKiBBY2NlcHRhYmxlIG1lZGlhIHR5cGUgdW5pdCB0ZXN0cy4KKyAqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgQWNjZXB0YWJsZU1lZGlhVHlwZVN0cmluZ1JlcHJlc2VudGF0aW9uVGVzdCB7CisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycworICAgIC8vIGV4cGVjdGVkIHJlc3VsdCwgYWNjZXB0YWJsZSBtZWRpYSB0eXBlCisgICAgcHVibGljIHN0YXRpYyBMaXN0PE9iamVjdFtdPiBnZXRQYXJhbWV0ZXJzKCkgeworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IGVtcHR5UGFyYW1zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgICAgIHBhcmFtcy5wdXQoIm15UGFyYW0iLCAibXlWYWx1ZSIpOworCisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXVtdeworICAgICAgICAgICAgICAgIHsiKi8qIiwgbmV3IEFjY2VwdGFibGVNZWRpYVR5cGUoIioiLCAiKiIpfSwKKyAgICAgICAgICAgICAgICB7IiovKiIsIG5ldyBBY2NlcHRhYmxlTWVkaWFUeXBlKCIqIiwgIioiLCBRdWFsaXR5LkRFRkFVTFQsIGVtcHR5UGFyYW1zKX0sCisgICAgICAgICAgICAgICAgeyIqLyo7cT0wLjc1IiwgbmV3IEFjY2VwdGFibGVNZWRpYVR5cGUoIioiLCAiKiIsIDc1MCwgZW1wdHlQYXJhbXMpfSwKKyAgICAgICAgICAgICAgICB7InRleHQvaHRtbCIsIG5ldyBBY2NlcHRhYmxlTWVkaWFUeXBlKCJ0ZXh0IiwgImh0bWwiLCBRdWFsaXR5LkRFRkFVTFQsIG51bGwpfSwKKyAgICAgICAgICAgICAgICB7InRleHQvaHRtbDtxPTAuNSIsIG5ldyBBY2NlcHRhYmxlTWVkaWFUeXBlKCJ0ZXh0IiwgImh0bWwiLCA1MDAsIGVtcHR5UGFyYW1zKX0sCisgICAgICAgICAgICAgICAgeyJpbWFnZS8qO215cGFyYW09bXlWYWx1ZTtxPTAuOCIsIG5ldyBBY2NlcHRhYmxlTWVkaWFUeXBlKCJpbWFnZSIsICIqIiwgODAwLCBwYXJhbXMpfSwKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZXhwZWN0ZWRWYWx1ZTsKKyAgICBwcml2YXRlIGZpbmFsIEFjY2VwdGFibGVNZWRpYVR5cGUgdGVzdGVkVHlwZTsKKworICAgIHB1YmxpYyBBY2NlcHRhYmxlTWVkaWFUeXBlU3RyaW5nUmVwcmVzZW50YXRpb25UZXN0KGZpbmFsIFN0cmluZyBleHBlY3RlZFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFjY2VwdGFibGVNZWRpYVR5cGUgdGVzdGVkVHlwZSkgeworICAgICAgICB0aGlzLmV4cGVjdGVkVmFsdWUgPSBleHBlY3RlZFZhbHVlOworICAgICAgICB0aGlzLnRlc3RlZFR5cGUgPSB0ZXN0ZWRUeXBlOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ1JlcHJlc2VudGF0aW9uKCkgeworICAgICAgICBmaW5hbCBNZWRpYVR5cGVQcm92aWRlciBwcm92aWRlciA9IG5ldyBNZWRpYVR5cGVQcm92aWRlcigpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGV4cGVjdGVkVmFsdWUsIHRlc3RlZFR5cGUudG9TdHJpbmcoKSk7CisgICAgICAgIHByb3ZpZGVyLmZyb21TdHJpbmcodGVzdGVkVHlwZS50b1N0cmluZygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL21lc3NhZ2UvaW50ZXJuYWwvQWNjZXB0YWJsZU1lZGlhVHlwZVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vbWVzc2FnZS9pbnRlcm5hbC9BY2NlcHRhYmxlTWVkaWFUeXBlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5OGE5MDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL21lc3NhZ2UvaW50ZXJuYWwvQWNjZXB0YWJsZU1lZGlhVHlwZVRlc3QuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb24ubWVzc2FnZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuQWNjZXB0YWJsZU1lZGlhVHlwZTsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CisKKy8qKgorICogQWNjZXB0YWJsZSBtZWRpYSB0eXBlIHVuaXQgdGVzdHMuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBBY2NlcHRhYmxlTWVkaWFUeXBlVGVzdCB7CisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycworICAgIC8vIGV4cGVjdGVkIHJlc3VsdCwgbWVkaWEgdHlwZSwgYWNjZXB0YWJsZSBtZWRpYSB0eXBlCisgICAgcHVibGljIHN0YXRpYyBMaXN0PE9iamVjdFtdPiB0ZXN0QmVkcygpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW117CisgICAgICAgICAgICAgICAge0Jvb2xlYW4uVFJVRSwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSwgbmV3IEFjY2VwdGFibGVNZWRpYVR5cGUoImFwcGxpY2F0aW9uIiwgImpzb24iKX0sCisgICAgICAgICAgICAgICAge0Jvb2xlYW4uVFJVRSwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSwgbmV3IEFjY2VwdGFibGVNZWRpYVR5cGUoImFwcGxpY2F0aW9uIiwgImpzb24iLCAxMDAwLCBudWxsKX0sCisgICAgICAgICAgICAgICAge0Jvb2xlYW4uRkFMU0UsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUsIG5ldyBBY2NlcHRhYmxlTWVkaWFUeXBlKCJhcHBsaWNhdGlvbiIsICJqc29uIiwgNTAwLCBudWxsKX0sCisgICAgICAgICAgICAgICAge0Jvb2xlYW4uRkFMU0UsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUsIG5ldyBBY2NlcHRhYmxlTWVkaWFUeXBlKCJhcHBsaWNhdGlvbiIsICJ4bWwiKX0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGV4cGVjdEVxdWFsaXR5OworICAgIHByaXZhdGUgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZTsKKyAgICBwcml2YXRlIGZpbmFsIEFjY2VwdGFibGVNZWRpYVR5cGUgYWNjZXB0YWJsZU1lZGlhVHlwZTsKKworICAgIHB1YmxpYyBBY2NlcHRhYmxlTWVkaWFUeXBlVGVzdChib29sZWFuIGV4cGVjdEVxdWFsaXR5LCBNZWRpYVR5cGUgbWVkaWFUeXBlLCBBY2NlcHRhYmxlTWVkaWFUeXBlIGFjY2VwdGFibGVNZWRpYVR5cGUpIHsKKyAgICAgICAgdGhpcy5leHBlY3RFcXVhbGl0eSA9IGV4cGVjdEVxdWFsaXR5OworICAgICAgICB0aGlzLm1lZGlhVHlwZSA9IG1lZGlhVHlwZTsKKyAgICAgICAgdGhpcy5hY2NlcHRhYmxlTWVkaWFUeXBlID0gYWNjZXB0YWJsZU1lZGlhVHlwZTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGV4cGVjdEVxdWFsaXR5KSB7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJUeXBlcyBub3QgZXF1YWwuIiwgbWVkaWFUeXBlLCBhY2NlcHRhYmxlTWVkaWFUeXBlKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIlR5cGVzIG5vdCBlcXVhbC4iLCBhY2NlcHRhYmxlTWVkaWFUeXBlLCBtZWRpYVR5cGUpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiSGFzaCBjb2RlcyBub3QgZXF1YWwgZm9yICVzIGFuZCAlcy4iLCBtZWRpYVR5cGUudG9TdHJpbmcoKSwgYWNjZXB0YWJsZU1lZGlhVHlwZS50b1N0cmluZygpKSwKKyAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlLmhhc2hDb2RlKCksIGFjY2VwdGFibGVNZWRpYVR5cGUuaGFzaENvZGUoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoU3RyaW5nLmZvcm1hdCgiRmFsc2UgZXF1YWxpdHkgb2YgJXMgYW5kICVzIiwgbWVkaWFUeXBlLnRvU3RyaW5nKCksIGFjY2VwdGFibGVNZWRpYVR5cGUudG9TdHJpbmcoKSksCisgICAgICAgICAgICAgICAgICAgIGFjY2VwdGFibGVNZWRpYVR5cGUuZXF1YWxzKG1lZGlhVHlwZSkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9tZXNzYWdlL2ludGVybmFsL0NvbW1pdHRpbmdPdXRwdXRTdHJlYW1UZXN0LmphdmEgYi90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL21lc3NhZ2UvaW50ZXJuYWwvQ29tbWl0dGluZ091dHB1dFN0cmVhbVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzYxMjc1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9tZXNzYWdlL2ludGVybmFsL0NvbW1pdHRpbmdPdXRwdXRTdHJlYW1UZXN0LmphdmEKQEAgLTAsMCArMSwzNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbi5tZXNzYWdlLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXgud3MucnMuUnVudGltZVR5cGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5Db21tb25Qcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUHJvcGVydGllc0hlbHBlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkNvbW1pdHRpbmdPdXRwdXRTdHJlYW07CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5PdXRib3VuZE1lc3NhZ2VDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1vZGVsLmludGVybmFsLkNvbW1vbkNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb2RlbC5pbnRlcm5hbC5Db21wb25lbnRCYWc7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCisvKioKKyAqIFRlc3QgdGhlIHtAbGluayBDb21taXR0aW5nT3V0cHV0U3RyZWFtfS4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBDb21taXR0aW5nT3V0cHV0U3RyZWFtVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQYXNzZWQgeworICAgICAgICBib29sZWFuIGI7CisKKyAgICAgICAgcHVibGljIHZvaWQgcGFzcygpIHsKKyAgICAgICAgICAgIGIgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhhY3RTaXplT2ZCdWZmZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBQYXNzZWQgcGFzc2VkID0gbmV3IFBhc3NlZCgpOworICAgICAgICBmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oMTAwMCk7CisgICAgICAgIENvbW1pdHRpbmdPdXRwdXRTdHJlYW0gY29zID0gbmV3IENvbW1pdHRpbmdPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgc2V0dXBCdWZmZXJlZFN0cmVhbVByb3ZpZGVyKHBhc3NlZCwgYmFvcywgY29zLCAzKTsKKworICAgICAgICBjb3Mud3JpdGUoKGJ5dGUpIDEpOworICAgICAgICBjb3Mud3JpdGUoKGJ5dGUpIDIpOworICAgICAgICBjb3Mud3JpdGUoKGJ5dGUpIDMpOworICAgICAgICBjaGVja05vdFlldENvbW1pdHRlZChwYXNzZWQsIGJhb3MsIGNvcyk7CisgICAgICAgIGNvcy5jb21taXQoKTsKKyAgICAgICAgY2hlY2soYmFvcywgbmV3IGJ5dGVbXXsxLCAyLCAzfSk7CisgICAgICAgIGFzc2VydFRydWUocGFzc2VkLmIpOworICAgICAgICBjb3MuY2xvc2UoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tOb3RZZXRDb21taXR0ZWQoUGFzc2VkIHBhc3NlZCwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MsIENvbW1pdHRpbmdPdXRwdXRTdHJlYW0gY29zKSB7CisgICAgICAgIGFzc2VydEZhbHNlKHBhc3NlZC5iKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY29zLmlzQ29tbWl0dGVkKCkpOworICAgICAgICBjaGVjayhiYW9zLCBudWxsKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tDb21taXR0ZWQoUGFzc2VkIHBhc3NlZCwgQ29tbWl0dGluZ091dHB1dFN0cmVhbSBjb3MpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwYXNzZWQuYik7CisgICAgICAgIGFzc2VydFRydWUoY29zLmlzQ29tbWl0dGVkKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXR1cEJ1ZmZlcmVkU3RyZWFtUHJvdmlkZXIoZmluYWwgUGFzc2VkIHBhc3NlZCwgZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MsIENvbW1pdHRpbmdPdXRwdXRTdHJlYW0gY29zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGV4cGVjdGVkQ29udGVudExlbmd0aCkgeworICAgICAgICBjb3Muc2V0U3RyZWFtUHJvdmlkZXIobmV3IE91dGJvdW5kTWVzc2FnZUNvbnRleHQuU3RyZWFtUHJvdmlkZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKGludCBjb250ZW50TGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZENvbnRlbnRMZW5ndGgsIGNvbnRlbnRMZW5ndGgpOworICAgICAgICAgICAgICAgIHBhc3NlZC5wYXNzKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJhb3M7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICBjb3MuZW5hYmxlQnVmZmVyaW5nKDMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzZXR1cFN0cmVhbVByb3ZpZGVyKGZpbmFsIFBhc3NlZCBwYXNzZWQsIGZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zLCBDb21taXR0aW5nT3V0cHV0U3RyZWFtIGNvcykgeworICAgICAgICBjb3Muc2V0U3RyZWFtUHJvdmlkZXIobmV3IE91dGJvdW5kTWVzc2FnZUNvbnRleHQuU3RyZWFtUHJvdmlkZXIoKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIE91dHB1dFN0cmVhbSBnZXRPdXRwdXRTdHJlYW0oaW50IGNvbnRlbnRMZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgcGFzc2VkLnBhc3MoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYmFvczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeGFjdFNpemVPZkJ1ZmZlckJ5Q2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBQYXNzZWQgcGFzc2VkID0gbmV3IFBhc3NlZCgpOworICAgICAgICBmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oMTAwMCk7CisgICAgICAgIENvbW1pdHRpbmdPdXRwdXRTdHJlYW0gY29zID0gbmV3IENvbW1pdHRpbmdPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgc2V0dXBCdWZmZXJlZFN0cmVhbVByb3ZpZGVyKHBhc3NlZCwgYmFvcywgY29zLCAzKTsKKworICAgICAgICBjb3Mud3JpdGUoKGJ5dGUpIDEpOworICAgICAgICBjb3Mud3JpdGUoKGJ5dGUpIDIpOworICAgICAgICBjb3Mud3JpdGUoKGJ5dGUpIDMpOworICAgICAgICBjaGVja05vdFlldENvbW1pdHRlZChwYXNzZWQsIGJhb3MsIGNvcyk7CisgICAgICAgIGNvcy5jbG9zZSgpOworICAgICAgICBjaGVjayhiYW9zLCBuZXcgYnl0ZVtdezEsIDIsIDN9KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwYXNzZWQuYik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGVzc0J5dGVzVGhhbkxpbWl0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUGFzc2VkIHBhc3NlZCA9IG5ldyBQYXNzZWQoKTsKKyAgICAgICAgZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKDEwMDApOworICAgICAgICBDb21taXR0aW5nT3V0cHV0U3RyZWFtIGNvcyA9IG5ldyBDb21taXR0aW5nT3V0cHV0U3RyZWFtKCk7CisgICAgICAgIHNldHVwQnVmZmVyZWRTdHJlYW1Qcm92aWRlcihwYXNzZWQsIGJhb3MsIGNvcywgMik7CisKKyAgICAgICAgY29zLndyaXRlKChieXRlKSAxKTsKKyAgICAgICAgY29zLndyaXRlKChieXRlKSAyKTsKKyAgICAgICAgY2hlY2tOb3RZZXRDb21taXR0ZWQocGFzc2VkLCBiYW9zLCBjb3MpOworCisgICAgICAgIGNvcy5jb21taXQoKTsKKworICAgICAgICBjaGVjayhiYW9zLCBuZXcgYnl0ZVtdezEsIDJ9KTsKKyAgICAgICAgY29zLmNsb3NlKCk7CisgICAgICAgIGFzc2VydFRydWUocGFzc2VkLmIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vQnl0ZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBQYXNzZWQgcGFzc2VkID0gbmV3IFBhc3NlZCgpOworICAgICAgICBmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oMTAwMCk7CisgICAgICAgIENvbW1pdHRpbmdPdXRwdXRTdHJlYW0gY29zID0gbmV3IENvbW1pdHRpbmdPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgc2V0dXBCdWZmZXJlZFN0cmVhbVByb3ZpZGVyKHBhc3NlZCwgYmFvcywgY29zLCAwKTsKKworICAgICAgICBjaGVja05vdFlldENvbW1pdHRlZChwYXNzZWQsIGJhb3MsIGNvcyk7CisKKyAgICAgICAgY29zLmNvbW1pdCgpOworCisgICAgICAgIGNoZWNrKGJhb3MsIG51bGwpOworICAgICAgICBjb3MuY2xvc2UoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwYXNzZWQuYik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnVmZmVyT3ZlcmZsb3coKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBQYXNzZWQgcGFzc2VkID0gbmV3IFBhc3NlZCgpOworICAgICAgICBmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oMTAwMCk7CisgICAgICAgIENvbW1pdHRpbmdPdXRwdXRTdHJlYW0gY29zID0gbmV3IENvbW1pdHRpbmdPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgc2V0dXBCdWZmZXJlZFN0cmVhbVByb3ZpZGVyKHBhc3NlZCwgYmFvcywgY29zLCAtMSk7CisKKyAgICAgICAgY29zLndyaXRlKChieXRlKSAxKTsKKyAgICAgICAgY29zLndyaXRlKChieXRlKSAyKTsKKyAgICAgICAgY29zLndyaXRlKChieXRlKSAzKTsKKyAgICAgICAgY2hlY2tOb3RZZXRDb21taXR0ZWQocGFzc2VkLCBiYW9zLCBjb3MpOworICAgICAgICBjb3Mud3JpdGUoKGJ5dGUpIDQpOworICAgICAgICBjaGVjayhiYW9zLCBuZXcgYnl0ZVtdezEsIDIsIDMsIDR9KTsKKyAgICAgICAgY29zLndyaXRlKChieXRlKSA1KTsKKyAgICAgICAgY2hlY2soYmFvcywgbmV3IGJ5dGVbXXsxLCAyLCAzLCA0LCA1fSk7CisKKyAgICAgICAgY29zLmNvbW1pdCgpOworCisgICAgICAgIGNoZWNrKGJhb3MsIG5ldyBieXRlW117MSwgMiwgMywgNCwgNX0pOworICAgICAgICBjb3MuY2xvc2UoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RCdWZmZXJlZE9TKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUGFzc2VkIHBhc3NlZCA9IG5ldyBQYXNzZWQoKTsKKyAgICAgICAgZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKDEwMDApOworICAgICAgICBDb21taXR0aW5nT3V0cHV0U3RyZWFtIGNvcyA9IG5ldyBDb21taXR0aW5nT3V0cHV0U3RyZWFtKCk7CisgICAgICAgIHNldHVwU3RyZWFtUHJvdmlkZXIocGFzc2VkLCBiYW9zLCBjb3MpOworCisgICAgICAgIGNoZWNrTm90WWV0Q29tbWl0dGVkKHBhc3NlZCwgYmFvcywgY29zKTsKKyAgICAgICAgY29zLndyaXRlKChieXRlKSAxKTsKKyAgICAgICAgY2hlY2tDb21taXR0ZWQocGFzc2VkLCBjb3MpOworICAgICAgICBjaGVjayhiYW9zLCBuZXcgYnl0ZVtdezF9KTsKKyAgICAgICAgY29zLndyaXRlKChieXRlKSAyKTsKKyAgICAgICAgY2hlY2tDb21taXR0ZWQocGFzc2VkLCBjb3MpOworICAgICAgICBjb3Mud3JpdGUoKGJ5dGUpIDMpOworICAgICAgICBjb3Mud3JpdGUoKGJ5dGUpIDQpOworICAgICAgICBjaGVjayhiYW9zLCBuZXcgYnl0ZVtdezEsIDIsIDMsIDR9KTsKKyAgICAgICAgY29zLndyaXRlKChieXRlKSA1KTsKKyAgICAgICAgY2hlY2soYmFvcywgbmV3IGJ5dGVbXXsxLCAyLCAzLCA0LCA1fSk7CisKKyAgICAgICAgY29zLmNvbW1pdCgpOworICAgICAgICBjaGVja0NvbW1pdHRlZChwYXNzZWQsIGNvcyk7CisgICAgICAgIGNoZWNrKGJhb3MsIG5ldyBieXRlW117MSwgMiwgMywgNCwgNX0pOworICAgICAgICBjb3MuY2xvc2UoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2soQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MsIGJ5dGUuLi4gYnl0ZXMpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGJ5dGVzID09IG51bGwgPyAwIDogYnl0ZXMubGVuZ3RoLCBiYW9zLnNpemUoKSk7CisKKyAgICAgICAgaWYgKGJ5dGVzICE9IG51bGwpIHsKKyAgICAgICAgICAgIGZpbmFsIGJ5dGVbXSBhY3R1YWxCeXRlcyA9IGJhb3MudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYnl0ZXNbaV0sIGFjdHVhbEJ5dGVzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByb3BlcnRpZXNXaXRoTWVzc2FnZUNvbnRleHQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IDIwOworICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIHByb3BlcnRpZXMucHV0KENvbW1vblByb3BlcnRpZXMuT1VUQk9VTkRfQ09OVEVOVF9MRU5HVEhfQlVGRkVSLCBzaXplKTsKKyAgICAgICAgZmluYWwgUnVudGltZVR5cGUgcnVudGltZSA9IFJ1bnRpbWVUeXBlLkNMSUVOVDsKKworICAgICAgICBjaGVja0J1ZmZlclNpemUoc2l6ZSwgcHJvcGVydGllcywgcnVudGltZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydGllc1dpdGhNZXNzYWdlQ29udGV4dFZlcnlCaWdCdWZmZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IDIwMDAwMDsKKyAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBwcm9wZXJ0aWVzLnB1dChDb21tb25Qcm9wZXJ0aWVzLk9VVEJPVU5EX0NPTlRFTlRfTEVOR1RIX0JVRkZFUiwgc2l6ZSk7CisgICAgICAgIGZpbmFsIFJ1bnRpbWVUeXBlIHJ1bnRpbWUgPSBSdW50aW1lVHlwZS5DTElFTlQ7CisKKyAgICAgICAgY2hlY2tCdWZmZXJTaXplKHNpemUsIHByb3BlcnRpZXMsIHJ1bnRpbWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByb3BlcnRpZXNXaXRoTWVzc2FnZUNvbnRleHRNaXNzaW5nU2VydmVyU3BlY2lmaWMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IDIyOworICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIHByb3BlcnRpZXMucHV0KENvbW1vblByb3BlcnRpZXMuT1VUQk9VTkRfQ09OVEVOVF9MRU5HVEhfQlVGRkVSLCBzaXplKTsKKyAgICAgICAgcHJvcGVydGllcy5wdXQoQ29tbW9uUHJvcGVydGllcy5PVVRCT1VORF9DT05URU5UX0xFTkdUSF9CVUZGRVIgKyAiLmNsaWVudCIsIHNpemUgKiAyKTsKKyAgICAgICAgY2hlY2tCdWZmZXJTaXplKHNpemUsIHByb3BlcnRpZXMsIFJ1bnRpbWVUeXBlLlNFUlZFUik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydGllc1dpdGhNZXNzYWdlQ29udGV4dE1pc3NpbmdTZXJ2ZXJBdEFsbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGludCBzaXplID0gMjI7CisgICAgICAgIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllcyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgcHJvcGVydGllcy5wdXQoUHJvcGVydGllc0hlbHBlci5nZXRQcm9wZXJ0eU5hbWVGb3JSdW50aW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uUHJvcGVydGllcy5PVVRCT1VORF9DT05URU5UX0xFTkdUSF9CVUZGRVIsIFJ1bnRpbWVUeXBlLkNMSUVOVCksIHNpemUpOworICAgICAgICBjaGVja0J1ZmZlclNpemUoQ29tbWl0dGluZ091dHB1dFN0cmVhbS5ERUZBVUxUX0JVRkZFUl9TSVpFLCBwcm9wZXJ0aWVzLCBSdW50aW1lVHlwZS5TRVJWRVIpOworICAgICAgICBjaGVja0J1ZmZlclNpemUoc2l6ZSwgcHJvcGVydGllcywgUnVudGltZVR5cGUuQ0xJRU5UKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0aWVzV2l0aE1lc3NhZ2VDb250ZXh0Q2xpZW50T3ZlcnJpZGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgaW50IHNpemUgPSAyMjsKKyAgICAgICAgTWFwPFN0cmluZywgT2JqZWN0PiBwcm9wZXJ0aWVzID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBwcm9wZXJ0aWVzLnB1dChDb21tb25Qcm9wZXJ0aWVzLk9VVEJPVU5EX0NPTlRFTlRfTEVOR1RIX0JVRkZFUiwgc2l6ZSk7CisgICAgICAgIHByb3BlcnRpZXMucHV0KFByb3BlcnRpZXNIZWxwZXIuZ2V0UHJvcGVydHlOYW1lRm9yUnVudGltZShDb21tb25Qcm9wZXJ0aWVzLk9VVEJPVU5EX0NPTlRFTlRfTEVOR1RIX0JVRkZFUiwKKyAgICAgICAgICAgICAgICBSdW50aW1lVHlwZS5DTElFTlQpLCBzaXplICogMik7CisKKyAgICAgICAgY2hlY2tCdWZmZXJTaXplKHNpemUgKiAyLCBwcm9wZXJ0aWVzLCBSdW50aW1lVHlwZS5DTElFTlQpOworICAgICAgICBjaGVja0J1ZmZlclNpemUoc2l6ZSwgcHJvcGVydGllcywgUnVudGltZVR5cGUuU0VSVkVSKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9wZXJ0aWVzV2l0aE1lc3NhZ2VDb250ZXh0RGVmYXVsdE5vUHJvcHMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIGZpbmFsIFJ1bnRpbWVUeXBlIHJ1bnRpbWUgPSBSdW50aW1lVHlwZS5DTElFTlQ7CisKKyAgICAgICAgY2hlY2tCdWZmZXJTaXplKENvbW1pdHRpbmdPdXRwdXRTdHJlYW0uREVGQVVMVF9CVUZGRVJfU0laRSwgcHJvcGVydGllcywgcnVudGltZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrQnVmZmVyU2l6ZShpbnQgZXhwZWN0ZWRTaXplLCBNYXA8U3RyaW5nLCBPYmplY3Q+IHByb3BlcnRpZXMsIFJ1bnRpbWVUeXBlIHJ1bnRpbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIE91dGJvdW5kTWVzc2FnZUNvbnRleHQgb3V0Ym91bmRNZXNzYWdlQ29udGV4dCA9IG5ldyBPdXRib3VuZE1lc3NhZ2VDb250ZXh0KCk7CisgICAgICAgIGZpbmFsIFBhc3NlZCBwYXNzZWQgPSBuZXcgUGFzc2VkKCk7CisgICAgICAgIG91dGJvdW5kTWVzc2FnZUNvbnRleHQuc2V0U3RyZWFtUHJvdmlkZXIobmV3IE91dGJvdW5kTWVzc2FnZUNvbnRleHQuU3RyZWFtUHJvdmlkZXIoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKGludCBjb250ZW50TGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBjb250ZW50TGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBwYXNzZWQucGFzcygpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgQ29tbW9uQ29uZmlnIGNvbmZpZ3VyYXRpb24gPSBuZXcgQ29tbW9uQ29uZmlnKHJ1bnRpbWUsIENvbXBvbmVudEJhZy5JTkNMVURFX0FMTCk7CisgICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0UHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKKyAgICAgICAgb3V0Ym91bmRNZXNzYWdlQ29udGV4dC5lbmFibGVCdWZmZXJpbmcoY29uZmlndXJhdGlvbik7CisKKyAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSA9IG91dGJvdW5kTWVzc2FnZUNvbnRleHQuZ2V0RW50aXR5U3RyZWFtKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyAoaSA8IDEwMDAwMDApICYmICghcGFzc2VkLmIpOyBpKyspIHsKKyAgICAgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZSgoYnl0ZSkgNjUpOworICAgICAgICAgICAgaWYgKGkgPj0gZXhwZWN0ZWRTaXplICsgMSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRGYWxzZSgiY29tbWl0dGVkIGFscmVhZHkgd2l0aCBieXRlICMiICsgaSwgcGFzc2VkLmIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShwYXNzZWQuYik7CisgICAgfQorCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbmFibGVCdWZmZXJpbmcoKSB7CisgICAgICAgIENvbW1pdHRpbmdPdXRwdXRTdHJlYW0gY29zID0gbmV3IENvbW1pdHRpbmdPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgY29zLmVuYWJsZUJ1ZmZlcmluZyg1MDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVuYWJsZUJ1ZmZlcmluZ0lsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIENvbW1pdHRpbmdPdXRwdXRTdHJlYW0gY29zID0gbmV3IENvbW1pdHRpbmdPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgY29zLnNldFN0cmVhbVByb3ZpZGVyKG5ldyBPdXRib3VuZE1lc3NhZ2VDb250ZXh0LlN0cmVhbVByb3ZpZGVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbShpbnQgY29udGVudExlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIGNvcy53cml0ZSgnYScpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29zLmVuYWJsZUJ1ZmZlcmluZyg1MDApOworICAgICAgICAgICAgZmFpbCgic2hvdWxkIHRocm93IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBiZWNhdXNlIG9mIGxhdGUgc2V0dXAgb2YgZW5hYmxlQnVmZmVyaW5nIHdoZW4gYnl0ZXMgYXJlIGFscmVhZHkgd3JpdHRlbi4iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigidGhpcyBpcyBvayAtIGV4Y2VwdGlvbiBzaG91bGQgYmUgdGhyb3duOiAiICsgZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgLy8gb2sgLSBzaG91bGQgYmUgdGhyb3duIChieXRlcyBhcmUgYWxyZWFkeSB3cml0dGVuKS4KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNldFN0cmFtUHJvdmlkZXJJbGxlZ2FsU3RhdGVFeGNlcHRpb24xKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQ29tbWl0dGluZ091dHB1dFN0cmVhbSBjb3MgPSBuZXcgQ29tbWl0dGluZ091dHB1dFN0cmVhbSgpOworICAgICAgICBjb3MuZW5hYmxlQnVmZmVyaW5nKDEpOworICAgICAgICB3cml0ZUFuZENoZWNrSWxsZWdhbFN0YXRlKGNvcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0U3RyYW1Qcm92aWRlcklsbGVnYWxTdGF0ZUV4Y2VwdGlvbjIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBDb21taXR0aW5nT3V0cHV0U3RyZWFtIGNvcyA9IG5ldyBDb21taXR0aW5nT3V0cHV0U3RyZWFtKCk7CisgICAgICAgIHdyaXRlQW5kQ2hlY2tJbGxlZ2FsU3RhdGUoY29zKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgd3JpdGVBbmRDaGVja0lsbGVnYWxTdGF0ZShDb21taXR0aW5nT3V0cHV0U3RyZWFtIGNvcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvcy53cml0ZSgnYScpOworICAgICAgICAgICAgY29zLndyaXRlKCdhJyk7CisgICAgICAgICAgICBjb3Mud3JpdGUoJ2EnKTsKKyAgICAgICAgICAgIGNvcy53cml0ZSgnYScpOworICAgICAgICAgICAgY29zLndyaXRlKCdhJyk7CisgICAgICAgICAgICBmYWlsKCJzaG91bGQgdGhyb3cgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGJlY2F1c2Ugb2YgbWlzc2luZyBzdHJlYW0gcHJvdmlkZXIgKGJ5dGVzIGFyZSBhbHJlYWR5IHdyaXR0ZW4pLiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJ0aGlzIGlzIG9rIC0gZXhjZXB0aW9uIHNob3VsZCBiZSB0aHJvd246ICIgKyBlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAvLyBvayAtIHNob3VsZCBiZSB0aHJvd24gKGJ5dGVzIGFyZSBhbHJlYWR5IHdyaXR0ZW4pLgorICAgICAgICB9CisgICAgfQorCit9CisKKworCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL21lc3NhZ2UvaW50ZXJuYWwvQ29va2llc1BhcnNlclRlc3QuamF2YSBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vbWVzc2FnZS9pbnRlcm5hbC9Db29raWVzUGFyc2VyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3Y2UyNWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL21lc3NhZ2UvaW50ZXJuYWwvQ29va2llc1BhcnNlclRlc3QuamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb24ubWVzc2FnZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudGV4dC5TaW1wbGVEYXRlRm9ybWF0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk5ld0Nvb2tpZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuQ29va2llc1BhcnNlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBDb29raWVzUGFyc2VyVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTaW1wbGVEYXRlRm9ybWF0IGRhdGVGb3JtYXQgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiRUVFLCBkZCBNTU0geXl5eSBISDptbTpzcyB6enoiLCBMb2NhbGUuVVMpOworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2FzZUluc2Vuc2l0aXZlTmV3Q29va2llUGFyYW1zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0Q2FzZUluc2Vuc2l0aXZlTmV3Q29va2llUGFyYW1zKCJleHBpcmVzIiwgIm1heC1hZ2UiLCAicGF0aCIsICJkb21haW4iLCAiY29tbWVudCIsICJ2ZXJzaW9uIiwgInNlY3VyZSIsICJodHRwb25seSIpOworICAgICAgICBfdGVzdENhc2VJbnNlbnNpdGl2ZU5ld0Nvb2tpZVBhcmFtcygiRXhwaXJlcyIsICJNYXgtQWdlIiwgIlBhdGgiLCAiRG9tYWluIiwgIkNvbW1lbnQiLCAiVmVyc2lvbiIsICJTZWN1cmUiLCAiSHR0cE9ubHkiKTsKKyAgICAgICAgX3Rlc3RDYXNlSW5zZW5zaXRpdmVOZXdDb29raWVQYXJhbXMoImV4UGlyZXMiLCAibWF4LWFHZSIsICJwYXRIIiwgImRvTUFpbiIsICJDb21tZW50IiwgInZFcnNpb24iLCAic2VjdVJlIiwgImh0dFBvbmx5Iik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0Q2FzZUluc2Vuc2l0aXZlTmV3Q29va2llUGFyYW1zKGZpbmFsIFN0cmluZyBleHBpcmVzLCBmaW5hbCBTdHJpbmcgbWF4QWdlLCBmaW5hbCBTdHJpbmcgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGRvbWFpbiwgZmluYWwgU3RyaW5nIGNvbW1lbnQsIGZpbmFsIFN0cmluZyB2ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc2VjdXJlLCBmaW5hbCBTdHJpbmcgaHR0cE9ubHkpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIGZpbmFsIFN0cmluZyBoZWFkZXIgPSAiZm9vPWJhcjsiCisgICAgICAgICAgICAgICAgKyBleHBpcmVzICsgIj1UdWUsIDE1IEphbiAyMDEzIDIxOjQ3OjM4IEdNVDsiCisgICAgICAgICAgICAgICAgKyBtYXhBZ2UgKyAiPTQyOyIKKyAgICAgICAgICAgICAgICArIHBhdGggKyAiPS87IgorICAgICAgICAgICAgICAgICsgZG9tYWluICsgIj0uZXhhbXBsZS5jb207IgorICAgICAgICAgICAgICAgICsgY29tbWVudCArICI9VGVzdGluZzsiCisgICAgICAgICAgICAgICAgKyB2ZXJzaW9uICsgIj0xOyIKKyAgICAgICAgICAgICAgICArIHNlY3VyZSArICI7IgorICAgICAgICAgICAgICAgICsgaHR0cE9ubHk7CisKKyAgICAgICAgZmluYWwgTmV3Q29va2llIGNvb2tpZSA9IENvb2tpZXNQYXJzZXIucGFyc2VOZXdDb29raWUoaGVhZGVyKTsKKworICAgICAgICBhc3NlcnRUaGF0KGNvb2tpZS5nZXROYW1lKCksIGVxdWFsVG8oImZvbyIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjb29raWUuZ2V0VmFsdWUoKSwgZXF1YWxUbygiYmFyIikpOworCisgICAgICAgIGFzc2VydFRoYXQoY29va2llLmdldEV4cGlyeSgpLCBlcXVhbFRvKGRhdGVGb3JtYXQucGFyc2UoIlR1ZSwgMTUgSmFuIDIwMTMgMjE6NDc6MzggR01UIikpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjb29raWUuZ2V0TWF4QWdlKCksIGVxdWFsVG8oNDIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjb29raWUuZ2V0UGF0aCgpLCBlcXVhbFRvKCIvIikpOworICAgICAgICBhc3NlcnRUaGF0KGNvb2tpZS5nZXREb21haW4oKSwgZXF1YWxUbygiLmV4YW1wbGUuY29tIikpOworICAgICAgICBhc3NlcnRUaGF0KGNvb2tpZS5nZXRDb21tZW50KCksIGVxdWFsVG8oIlRlc3RpbmciKSk7CisgICAgICAgIGFzc2VydFRoYXQoY29va2llLmdldFZlcnNpb24oKSwgZXF1YWxUbygxKSk7CisgICAgICAgIGFzc2VydFRoYXQoY29va2llLmlzU2VjdXJlKCksIGlzKHRydWUpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjb29raWUuaXNIdHRwT25seSgpLCBpcyh0cnVlKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9tZXNzYWdlL2ludGVybmFsL0hlYWRlclV0aWxzVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9tZXNzYWdlL2ludGVybmFsL0hlYWRlclV0aWxzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyMTJlMWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL21lc3NhZ2UvaW50ZXJuYWwvSGVhZGVyVXRpbHNUZXN0LmphdmEKQEAgLTAsMCArMSwxODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbi5tZXNzYWdlLmludGVybmFsOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BYnN0cmFjdE11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJ1bnRpbWVEZWxlZ2F0ZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuSGVhZGVyVXRpbHM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbi5UZXN0UnVudGltZURlbGVnYXRlOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRTYW1lOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiB7QGxpbmsgSGVhZGVyVXRpbHN9IHVuaXQgdGVzdHMuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEhlYWRlclV0aWxzVGVzdCB7CisKKyAgICBwdWJsaWMgSGVhZGVyVXRpbHNUZXN0KCkgeworICAgICAgICBSdW50aW1lRGVsZWdhdGUuc2V0SW5zdGFuY2UobmV3IFRlc3RSdW50aW1lRGVsZWdhdGUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlSW5ib3VuZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaW5ib3VuZCA9IEhlYWRlclV0aWxzLmNyZWF0ZUluYm91bmQoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChpbmJvdW5kKTsKKworICAgICAgICAvLyBUZXN0IG11dGFiaWxpdHkuCisgICAgICAgIGluYm91bmQucHV0U2luZ2xlKCJrZXkiLCAidmFsdWUiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZSIsIGluYm91bmQuZ2V0Rmlyc3QoImtleSIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gZW1wdHlTdHJpbmdzID0gSGVhZGVyVXRpbHMuZW1wdHkoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChlbXB0eVN0cmluZ3MpOworCisgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBlbXB0eU9iamVjdHMgPSBIZWFkZXJVdGlscy5lbXB0eSgpOworICAgICAgICBhc3NlcnROb3ROdWxsKGVtcHR5T2JqZWN0cyk7CisKKyAgICAgICAgLy8gVGVzdCBpbW11dGFiaWxpdHkuCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlbXB0eVN0cmluZ3MucHV0U2luZ2xlKCJrZXkiLCAidmFsdWUiKTsKKyAgICAgICAgICAgIGZhaWwoIlVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4cGVjdGVkLiIpOworICAgICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gcGFzc2VkCisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVtcHR5T2JqZWN0cy5wdXRTaW5nbGUoImtleSIsICJ2YWx1ZSIpOworICAgICAgICAgICAgZmFpbCgiVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXhwZWN0ZWQuIik7CisgICAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBwYXNzZWQKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZU91dGJvdW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBvdXRib3VuZCA9IEhlYWRlclV0aWxzLmNyZWF0ZU91dGJvdW5kKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwob3V0Ym91bmQpOworCisgICAgICAgIC8vIFRlc3QgbXV0YWJpbGl0eS4KKyAgICAgICAgb3V0Ym91bmQucHV0U2luZ2xlKCJrZXkiLCAidmFsdWUiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZSIsIG91dGJvdW5kLmdldEZpcnN0KCJrZXkiKSk7CisKKyAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlID0gbmV3IE9iamVjdCgpOworICAgICAgICBvdXRib3VuZC5wdXRTaW5nbGUoImtleSIsIHZhbHVlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlLCBvdXRib3VuZC5nZXRGaXJzdCgia2V5IikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFzU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydE51bGwoSGVhZGVyVXRpbHMuYXNTdHJpbmcobnVsbCwgbnVsbCkpOworCisgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSA9ICJ2YWx1ZSI7CisgICAgICAgIGFzc2VydFNhbWUodmFsdWUsIEhlYWRlclV0aWxzLmFzU3RyaW5nKHZhbHVlLCBudWxsKSk7CisKKyAgICAgICAgZmluYWwgVVJJIHVyaSA9IG5ldyBVUkkoInRlc3QiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHVyaS50b0FTQ0lJU3RyaW5nKCksIEhlYWRlclV0aWxzLmFzU3RyaW5nKHVyaSwgbnVsbCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFzU3RyaW5nTGlzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnROb3ROdWxsKEhlYWRlclV0aWxzLmFzU3RyaW5nTGlzdChudWxsLCBudWxsKSk7CisgICAgICAgIGFzc2VydFRydWUoSGVhZGVyVXRpbHMuYXNTdHJpbmdMaXN0KG51bGwsIG51bGwpLmlzRW1wdHkoKSk7CisKKyAgICAgICAgZmluYWwgVVJJIHVyaSA9IG5ldyBVUkkoInRlc3QiKTsKKyAgICAgICAgZmluYWwgTGlzdDxPYmplY3Q+IHZhbHVlcyA9IG5ldyBMaW5rZWRMaXN0PE9iamVjdD4oKSB7eworICAgICAgICAgICAgYWRkKCJ2YWx1ZSIpOworICAgICAgICAgICAgYWRkKG51bGwpOworICAgICAgICAgICAgYWRkKHVyaSk7CisgICAgICAgIH19OworCisgICAgICAgIC8vIHRlc3Qgc3RyaW5nIHZhbHVlcworICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gc3RyaW5nTGlzdCA9IEhlYWRlclV0aWxzLmFzU3RyaW5nTGlzdCh2YWx1ZXMsIG51bGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCgidmFsdWUiLCAiW251bGxdIiwgdXJpLnRvQVNDSUlTdHJpbmcoKSksCisgICAgICAgICAgICAgICAgICAgICBzdHJpbmdMaXN0KTsKKworICAgICAgICAvLyB0ZXN0cyBsaXZlIHZpZXcKKyAgICAgICAgdmFsdWVzLmFkZCgidmFsdWUyIik7CisgICAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KCJ2YWx1ZSIsICJbbnVsbF0iLCB1cmkudG9BU0NJSVN0cmluZygpLCAidmFsdWUyIiksCisgICAgICAgICAgICAgICAgICAgICBzdHJpbmdMaXN0KTsKKyAgICAgICAgdmFsdWVzLnJlbW92ZSgxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoInZhbHVlIiwgdXJpLnRvQVNDSUlTdHJpbmcoKSwgInZhbHVlMiIpLAorICAgICAgICAgICAgICAgICAgICAgc3RyaW5nTGlzdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXNTdHJpbmdIZWFkZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydE51bGwoSGVhZGVyVXRpbHMuYXNTdHJpbmdIZWFkZXJzKG51bGwpKTsKKworICAgICAgICBmaW5hbCBBYnN0cmFjdE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBoZWFkZXJzID0gSGVhZGVyVXRpbHMuY3JlYXRlT3V0Ym91bmQoKTsKKworICAgICAgICBoZWFkZXJzLnB1dFNpbmdsZSgiazEiLCAidmFsdWUiKTsKKyAgICAgICAgaGVhZGVycy5hZGQoImsxIiwgInZhbHVlMiIpOworCisgICAgICAgIGZpbmFsIFVSSSB1cmkgPSBuZXcgVVJJKCJ0ZXN0Iik7CisgICAgICAgIGhlYWRlcnMucHV0U2luZ2xlKCJrMiIsIHVyaSk7CisKKyAgICAgICAgaGVhZGVycy5wdXRTaW5nbGUoImszIiwgInZhbHVlMyIpOworCisgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBzdHJpbmdIZWFkZXJzID0gSGVhZGVyVXRpbHMuYXNTdHJpbmdIZWFkZXJzKGhlYWRlcnMpOworCisgICAgICAgIC8vIHRlc3Qgc3RyaW5nIHZhbHVlcworICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCgidmFsdWUiLCAidmFsdWUyIiksCisgICAgICAgICAgICAgICAgICAgICBzdHJpbmdIZWFkZXJzLmdldCgiazEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHVyaS50b0FTQ0lJU3RyaW5nKCkpLAorICAgICAgICAgICAgICAgICAgICAgc3RyaW5nSGVhZGVycy5nZXQoImsyIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCgidmFsdWUzIiksCisgICAgICAgICAgICAgICAgICAgICBzdHJpbmdIZWFkZXJzLmdldCgiazMiKSk7CisKKyAgICAgICAgLy8gdGVzdCBsaXZlIHZpZXcKKyAgICAgICAgaGVhZGVycy5nZXQoImsxIikucmVtb3ZlKDEpOworICAgICAgICBoZWFkZXJzLmFkZCgiazIiLCAidmFsdWU0Iik7CisgICAgICAgIGhlYWRlcnMucmVtb3ZlKCJrMyIpOworCisgICAgICAgIGFzc2VydEVxdWFscyhDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KCJ2YWx1ZSIpLAorICAgICAgICAgICAgICAgICAgICAgc3RyaW5nSGVhZGVycy5nZXQoImsxIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCh1cmkudG9BU0NJSVN0cmluZygpLCAidmFsdWU0IiksCisgICAgICAgICAgICAgICAgICAgICBzdHJpbmdIZWFkZXJzLmdldCgiazIiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHN0cmluZ0hlYWRlcnMuY29udGFpbnNLZXkoImszIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFzSGVhZGVyU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydE51bGwoSGVhZGVyVXRpbHMuYXNIZWFkZXJTdHJpbmcobnVsbCwgbnVsbCkpOworCisgICAgICAgIGZpbmFsIFVSSSB1cmkgPSBuZXcgVVJJKCJ0ZXN0Iik7CisgICAgICAgIGZpbmFsIExpc3Q8T2JqZWN0PiB2YWx1ZXMgPSBBcnJheXMuYXNMaXN0KCJ2YWx1ZSIsIG51bGwsIHVyaSk7CisKKyAgICAgICAgLy8gdGVzdCBzdHJpbmcgdmFsdWVzCisgICAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQgPSBIZWFkZXJVdGlscy5hc0hlYWRlclN0cmluZyh2YWx1ZXMsIG51bGwpOworICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlLFtudWxsXSwiICsgdXJpLnRvQVNDSUlTdHJpbmcoKSwgcmVzdWx0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL21lc3NhZ2UvaW50ZXJuYWwvSW5ib3VuZE1lc3NhZ2VDb250ZXh0VGVzdC5qYXZhIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9tZXNzYWdlL2ludGVybmFsL0luYm91bmRNZXNzYWdlQ29udGV4dFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjQ1NTEzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9tZXNzYWdlL2ludGVybmFsL0luYm91bmRNZXNzYWdlQ29udGV4dFRlc3QuamF2YQpAQCAtMCwwICsxLDI0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uLm1lc3NhZ2UuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOworaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnRleHQuU2ltcGxlRGF0ZUZvcm1hdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5FbnRpdHlUYWc7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkxpbms7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJlYWRlckludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SdW50aW1lRGVsZWdhdGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkNvb2tpZVByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuSW5ib3VuZE1lc3NhZ2VDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb24uVGVzdFJ1bnRpbWVEZWxlZ2F0ZTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuSW5ib3VuZE1lc3NhZ2VDb250ZXh0fSB0ZXN0LgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBJbmJvdW5kTWVzc2FnZUNvbnRleHRUZXN0IHsKKworICAgIHB1YmxpYyBJbmJvdW5kTWVzc2FnZUNvbnRleHRUZXN0KCkgeworICAgICAgICBSdW50aW1lRGVsZWdhdGUuc2V0SW5zdGFuY2UobmV3IFRlc3RSdW50aW1lRGVsZWdhdGUoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgSW5ib3VuZE1lc3NhZ2VDb250ZXh0IGNyZWF0ZUluYm91bmRNZXNzYWdlQ29udGV4dCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJbmJvdW5kTWVzc2FnZUNvbnRleHQoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCBJdGVyYWJsZTxSZWFkZXJJbnRlcmNlcHRvcj4gZ2V0UmVhZGVySW50ZXJjZXB0b3JzKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb0xlbmd0aCgpIHsKKyAgICAgICAgSW5ib3VuZE1lc3NhZ2VDb250ZXh0IHIgPSBjcmVhdGVJbmJvdW5kTWVzc2FnZUNvbnRleHQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCByLmdldExlbmd0aCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1ZXN0Q29va2llcygpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24geworICAgICAgICBJbmJvdW5kTWVzc2FnZUNvbnRleHQgciA9IGNyZWF0ZUluYm91bmRNZXNzYWdlQ29udGV4dCgpOworICAgICAgICByLmhlYWRlcihIdHRwSGVhZGVycy5DT09LSUUsICJvcmVvPWNob2NvbGF0ZSIpOworICAgICAgICByLmhlYWRlcihIdHRwSGVhZGVycy5DT09LSUUsICJuaWxsYT12YW5pbGxhIik7CisgICAgICAgIGFzc2VydEVxdWFscyhyLmdldFJlcXVlc3RDb29raWVzKCkuc2l6ZSgpLCAyKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyLmdldFJlcXVlc3RDb29raWVzKCkuY29udGFpbnNLZXkoIm9yZW8iKSk7CisgICAgICAgIGFzc2VydFRydWUoci5nZXRSZXF1ZXN0Q29va2llcygpLmNvbnRhaW5zS2V5KCJuaWxsYSIpKTsKKyAgICAgICAgQ29va2llUHJvdmlkZXIgY3AgPSBuZXcgQ29va2llUHJvdmlkZXIoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyLmdldFJlcXVlc3RDb29raWVzKCkuY29udGFpbnNWYWx1ZShjcC5mcm9tU3RyaW5nKCJvcmVvPWNob2NvbGF0ZSIpKSk7CisgICAgICAgIGFzc2VydFRydWUoci5nZXRSZXF1ZXN0Q29va2llcygpLmNvbnRhaW5zVmFsdWUoY3AuZnJvbVN0cmluZygibmlsbGE9dmFuaWxsYSIpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGF0ZSgpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgSW5ib3VuZE1lc3NhZ2VDb250ZXh0IHIgPSBjcmVhdGVJbmJvdW5kTWVzc2FnZUNvbnRleHQoKTsKKyAgICAgICAgci5oZWFkZXIoSHR0cEhlYWRlcnMuREFURSwgIlR1ZSwgMjkgSmFuIDIwMDIgMjI6MTQ6MDIgLTA1MDAiKTsKKyAgICAgICAgU2ltcGxlRGF0ZUZvcm1hdCBmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoIkUsIGRkIE1NTSB5eXl5IEhIOm1tOnNzIFoiLCBMb2NhbGUuRU5HTElTSCk7CisgICAgICAgIERhdGUgZGF0ZSA9IGYucGFyc2UoIlR1ZSwgMjkgSmFuIDIwMDIgMjI6MTQ6MDIgLTA1MDAiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHIuZ2V0RGF0ZSgpLCBkYXRlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIZWFkZXIoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIEluYm91bmRNZXNzYWdlQ29udGV4dCByID0gY3JlYXRlSW5ib3VuZE1lc3NhZ2VDb250ZXh0KCk7CisgICAgICAgIHIuaGVhZGVyKEh0dHBIZWFkZXJzLkFDQ0VQVCwgImFwcGxpY2F0aW9uL3htbCwgdGV4dC9wbGFpbiIpOworICAgICAgICByLmhlYWRlcihIdHRwSGVhZGVycy5BQ0NFUFQsICJhcHBsaWNhdGlvbi9qc29uIik7CisgICAgICAgIHIuaGVhZGVyKCJGT08iLCAiIik7CisgICAgICAgIGFzc2VydFRydWUoci5nZXRIZWFkZXJTdHJpbmcoSHR0cEhlYWRlcnMuQUNDRVBUKS5jb250YWlucygiYXBwbGljYXRpb24veG1sIikpOworICAgICAgICBhc3NlcnRUcnVlKHIuZ2V0SGVhZGVyU3RyaW5nKEh0dHBIZWFkZXJzLkFDQ0VQVCkuY29udGFpbnMoInRleHQvcGxhaW4iKSk7CisgICAgICAgIGFzc2VydFRydWUoci5nZXRIZWFkZXJTdHJpbmcoSHR0cEhlYWRlcnMuQUNDRVBUKS5jb250YWlucygiYXBwbGljYXRpb24vanNvbiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHIuZ2V0SGVhZGVyU3RyaW5nKCJGT08iKS5sZW5ndGgoKSwgMCk7CisgICAgICAgIGFzc2VydE51bGwoci5nZXRIZWFkZXJTdHJpbmcoIkJBUiIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIZWFkZXJNYXAoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uLCBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIEluYm91bmRNZXNzYWdlQ29udGV4dCByID0gY3JlYXRlSW5ib3VuZE1lc3NhZ2VDb250ZXh0KCk7CisgICAgICAgIHIuaGVhZGVyKEh0dHBIZWFkZXJzLkFDQ0VQVCwgImFwcGxpY2F0aW9uL3htbCwgdGV4dC9wbGFpbiIpOworICAgICAgICByLmhlYWRlcihIdHRwSGVhZGVycy5BQ0NFUFQsICJhcHBsaWNhdGlvbi9qc29uIik7CisgICAgICAgIHIuaGVhZGVyKCJBbGxvdyIsICJHRVQsIFBVVCIpOworICAgICAgICByLmhlYWRlcigiQWxsb3ciLCAiUE9TVCIpOworICAgICAgICBhc3NlcnRUcnVlKHIuZ2V0SGVhZGVycygpLmNvbnRhaW5zS2V5KEh0dHBIZWFkZXJzLkFDQ0VQVCkpOworICAgICAgICBhc3NlcnRUcnVlKHIuZ2V0SGVhZGVycygpLmNvbnRhaW5zS2V5KCJBbGxvdyIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyLmdldEhlYWRlcnMoKS5nZXQoSHR0cEhlYWRlcnMuQUNDRVBUKS5jb250YWlucygiYXBwbGljYXRpb24vanNvbiIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyLmdldEhlYWRlcnMoKS5nZXQoIkFsbG93IikuY29udGFpbnMoIlBPU1QiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWxsb3dlZE1ldGhvZHMoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKKyAgICAgICAgSW5ib3VuZE1lc3NhZ2VDb250ZXh0IHIgPSBjcmVhdGVJbmJvdW5kTWVzc2FnZUNvbnRleHQoKTsKKyAgICAgICAgci5oZWFkZXIoIkFsbG93IiwgIkdFVCwgUFVUIik7CisgICAgICAgIHIuaGVhZGVyKCJBbGxvdyIsICJQT1NUIik7CisgICAgICAgIGFzc2VydEVxdWFscygzLCByLmdldEFsbG93ZWRNZXRob2RzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyLmdldEFsbG93ZWRNZXRob2RzKCkuY29udGFpbnMoIkdFVCIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyLmdldEFsbG93ZWRNZXRob2RzKCkuY29udGFpbnMoIlBVVCIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyLmdldEFsbG93ZWRNZXRob2RzKCkuY29udGFpbnMoIlBPU1QiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHIuZ2V0QWxsb3dlZE1ldGhvZHMoKS5jb250YWlucygiREVMRVRFIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc3BvbnNlQ29va2llcygpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24geworICAgICAgICBJbmJvdW5kTWVzc2FnZUNvbnRleHQgciA9IGNyZWF0ZUluYm91bmRNZXNzYWdlQ29udGV4dCgpOworICAgICAgICByLmhlYWRlcihIdHRwSGVhZGVycy5TRVRfQ09PS0lFLCAib3Jlbz1jaG9jb2xhdGUiKTsKKyAgICAgICAgci5oZWFkZXIoSHR0cEhlYWRlcnMuU0VUX0NPT0tJRSwgIm5pbGxhPXZhbmlsbGEiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHIuZ2V0UmVzcG9uc2VDb29raWVzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyLmdldFJlc3BvbnNlQ29va2llcygpLmNvbnRhaW5zS2V5KCJvcmVvIikpOworICAgICAgICBhc3NlcnRUcnVlKHIuZ2V0UmVzcG9uc2VDb29raWVzKCkuY29udGFpbnNLZXkoIm5pbGxhIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVudGl0eVRhZygpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24geworICAgICAgICBJbmJvdW5kTWVzc2FnZUNvbnRleHQgciA9IGNyZWF0ZUluYm91bmRNZXNzYWdlQ29udGV4dCgpOworICAgICAgICByLmhlYWRlcihIdHRwSGVhZGVycy5FVEFHLCAiXCJ0YWdcIiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoRW50aXR5VGFnLnZhbHVlT2YoIlwidGFnXCIiKSwgci5nZXRFbnRpdHlUYWcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGFzdE1vZGlmaWVkKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24geworICAgICAgICBJbmJvdW5kTWVzc2FnZUNvbnRleHQgciA9IGNyZWF0ZUluYm91bmRNZXNzYWdlQ29udGV4dCgpOworICAgICAgICByLmhlYWRlcihIdHRwSGVhZGVycy5MQVNUX01PRElGSUVELCAiVHVlLCAyOSBKYW4gMjAwMiAyMjoxNDowMiAtMDUwMCIpOworICAgICAgICBTaW1wbGVEYXRlRm9ybWF0IGYgPSBuZXcgU2ltcGxlRGF0ZUZvcm1hdCgiRSwgZGQgTU1NIHl5eXkgSEg6bW06c3MgWiIsIExvY2FsZS5FTkdMSVNIKTsKKyAgICAgICAgRGF0ZSBkYXRlID0gZi5wYXJzZSgiVHVlLCAyOSBKYW4gMjAwMiAyMjoxNDowMiAtMDUwMCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZGF0ZSwgci5nZXRMYXN0TW9kaWZpZWQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jYXRpb24oKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKKyAgICAgICAgSW5ib3VuZE1lc3NhZ2VDb250ZXh0IHIgPSBjcmVhdGVJbmJvdW5kTWVzc2FnZUNvbnRleHQoKTsKKyAgICAgICAgci5oZWFkZXIoSHR0cEhlYWRlcnMuTE9DQVRJT04sICJodHRwOi8vZXhhbXBsZS5vcmcvYXBwIik7CisgICAgICAgIGFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vZXhhbXBsZS5vcmcvYXBwIiksIHIuZ2V0TG9jYXRpb24oKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TGlua3MoKSB7CisgICAgICAgIEluYm91bmRNZXNzYWdlQ29udGV4dCByID0gY3JlYXRlSW5ib3VuZE1lc3NhZ2VDb250ZXh0KCk7CisgICAgICAgIExpbmsgbGluazEgPSBMaW5rLmZyb21VcmkoImh0dHA6Ly9leGFtcGxlLm9yZy9hcHAvbGluazEiKS5wYXJhbSgicHJvZHVjZXMiLCAiYXBwbGljYXRpb24vanNvbiIpLnBhcmFtKCJtZXRob2QiLAorICAgICAgICAgICAgICAgICJHRVQiKS5yZWwoInNlbGYiKS5idWlsZCgpOworICAgICAgICBMaW5rIGxpbmsyID0gTGluay5mcm9tVXJpKCJodHRwOi8vZXhhbXBsZS5vcmcvYXBwL2xpbmsyIikucGFyYW0oInByb2R1Y2VzIiwgImFwcGxpY2F0aW9uL3htbCIpLnBhcmFtKCJtZXRob2QiLAorICAgICAgICAgICAgICAgICJQVVQiKS5yZWwoInNlbGYiKS5idWlsZCgpOworICAgICAgICByLmhlYWRlcigiTGluayIsIGxpbmsxLnRvU3RyaW5nKCkpOworICAgICAgICByLmhlYWRlcigiTGluayIsIGxpbmsyLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgci5nZXRMaW5rcygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydFRydWUoci5nZXRMaW5rcygpLmNvbnRhaW5zKGxpbmsxKSk7CisgICAgICAgIGFzc2VydFRydWUoci5nZXRMaW5rcygpLmNvbnRhaW5zKGxpbmsyKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TGlua3NXaXRoQ29tbWFJblVyaSgpIHsKKyAgICAgICAgSW5ib3VuZE1lc3NhZ2VDb250ZXh0IHIgPSBjcmVhdGVJbmJvdW5kTWVzc2FnZUNvbnRleHQoKTsKKyAgICAgICAgTGluayBsaW5rMSA9IExpbmsuZnJvbVVyaSgiaHR0cDovL2V4YW1wbGUub3JnL2FwcC9mb28sYmFyIikucGFyYW0oInByb2R1Y2VzIiwgImFwcGxpY2F0aW9uL2pzb24iKS5wYXJhbSgibWV0aG9kIiwKKyAgICAgICAgICAgICAgICAiR0VUIikucmVsKCJzZWxmIikuYnVpbGQoKTsKKyAgICAgICAgci5oZWFkZXIoIkxpbmsiLCBsaW5rMS50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHIuZ2V0TGlua3MoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKHIuZ2V0TGlua3MoKS5jb250YWlucyhsaW5rMSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldExpbmtzV2l0aE11bHRpcGxlTGlua3NJbk9uZUhlYWRlckFuZENvbW1hSW5VcmkoKSB7CisgICAgICAgIEluYm91bmRNZXNzYWdlQ29udGV4dCByID0gY3JlYXRlSW5ib3VuZE1lc3NhZ2VDb250ZXh0KCk7CisgICAgICAgIExpbmsgbGluazEgPSBMaW5rLmZyb21VcmkoImh0dHBzOi8vZXhhbXBsZS5vcmcvb25lL2FwaS9ncm91cHM/Zm9vLHBhZ2U9MiIpLnJlbCgibmV4dCIpLmJ1aWxkKCk7CisgICAgICAgIExpbmsgbGluazIgPSBMaW5rLmZyb21VcmkoImh0dHBzOi8vZXhhbXBsZS5vcmcvb25lL2FwaS9ncm91cHM/YmFyLHBhZ2U9MzkiKS5yZWwoImxhc3QiKS5idWlsZCgpOworICAgICAgICByLmhlYWRlcigiTGluayIsICI8aHR0cHM6Ly9leGFtcGxlLm9yZy9vbmUvYXBpL2dyb3Vwcz9mb28scGFnZT0yPjsgcmVsPVwibmV4dFwiLCA8aHR0cHM6Ly9leGFtcGxlLm9yZy9vbmUvYXBpL2dyb3Vwcz9iYXIscGFnZT0zOT47IHJlbD1cImxhc3RcIiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgci5nZXRMaW5rcygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydFRydWUoci5nZXRMaW5rcygpLmNvbnRhaW5zKGxpbmsxKSk7CisgICAgICAgIGFzc2VydFRydWUoci5nZXRMaW5rcygpLmNvbnRhaW5zKGxpbmsyKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TGlua3NXaXRoTXVsdGlwbGVMaW5rc0luT25lSGVhZGVyKCkgeworICAgICAgICBJbmJvdW5kTWVzc2FnZUNvbnRleHQgciA9IGNyZWF0ZUluYm91bmRNZXNzYWdlQ29udGV4dCgpOworICAgICAgICBMaW5rIGxpbmsxID0gTGluay5mcm9tVXJpKCJodHRwczovL2V4YW1wbGUub3JnL29uZS9hcGkvZ3JvdXBzP3BhZ2U9MiIpLnJlbCgibmV4dCIpLmJ1aWxkKCk7CisgICAgICAgIExpbmsgbGluazIgPSBMaW5rLmZyb21VcmkoImh0dHBzOi8vZXhhbXBsZS5vcmcvb25lL2FwaS9ncm91cHM/cGFnZT0zOSIpLnJlbCgibGFzdCIpLmJ1aWxkKCk7CisgICAgICAgIHIuaGVhZGVyKCJMaW5rIiwgIjxodHRwczovL2V4YW1wbGUub3JnL29uZS9hcGkvZ3JvdXBzP3BhZ2U9Mj47IHJlbD1cIm5leHRcIiwgPGh0dHBzOi8vZXhhbXBsZS5vcmcvb25lL2FwaS9ncm91cHM/cGFnZT0zOT47IHJlbD1cImxhc3RcIiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgci5nZXRMaW5rcygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydFRydWUoci5nZXRMaW5rcygpLmNvbnRhaW5zKGxpbmsxKSk7CisgICAgICAgIGFzc2VydFRydWUoci5nZXRMaW5rcygpLmNvbnRhaW5zKGxpbmsyKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TGlua3NXaXRoTXVsdGlwbGVMaW5rc0luT25lSGVhZGVyV2l0aEx0SW5WYWx1ZSgpIHsKKyAgICAgICAgSW5ib3VuZE1lc3NhZ2VDb250ZXh0IHIgPSBjcmVhdGVJbmJvdW5kTWVzc2FnZUNvbnRleHQoKTsKKyAgICAgICAgTGluayBsaW5rMSA9IExpbmsuZnJvbVVyaSgiaHR0cHM6Ly9leGFtcGxlLm9yZy9vbmUvYXBpL2dyb3Vwcz9wYWdlPTIiKS5yZWwoIm5leHQiKS5wYXJhbSgiZm9vIiwgIjxiYXI+IikuYnVpbGQoKTsKKyAgICAgICAgTGluayBsaW5rMiA9IExpbmsuZnJvbVVyaSgiaHR0cHM6Ly9leGFtcGxlLm9yZy9vbmUvYXBpL2dyb3Vwcz9wYWdlPTM5IikucmVsKCJsYXN0IikucGFyYW0oImJhciIsICI8PGZvbyIpLmJ1aWxkKCk7CisgICAgICAgIHIuaGVhZGVyKCJMaW5rIiwgIjxodHRwczovL2V4YW1wbGUub3JnL29uZS9hcGkvZ3JvdXBzP3BhZ2U9Mj47IHJlbD1cIm5leHRcIjsgZm9vPVwiPGJhcj5cIiwgPGh0dHBzOi8vZXhhbXBsZS5vcmcvb25lL2FwaS9ncm91cHM/cGFnZT0zOT47IHJlbD1cImxhc3RcIjsgYmFyPVwiPDxmb29cIiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgci5nZXRMaW5rcygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydFRydWUoci5nZXRMaW5rcygpLmNvbnRhaW5zKGxpbmsxKSk7CisgICAgICAgIGFzc2VydFRydWUoci5nZXRMaW5rcygpLmNvbnRhaW5zKGxpbmsyKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TGluaygpIHsKKyAgICAgICAgSW5ib3VuZE1lc3NhZ2VDb250ZXh0IHIgPSBjcmVhdGVJbmJvdW5kTWVzc2FnZUNvbnRleHQoKTsKKyAgICAgICAgTGluayBsaW5rMSA9IExpbmsuZnJvbVVyaSgiaHR0cDovL2V4YW1wbGUub3JnL2FwcC9saW5rMSIpLnBhcmFtKCJwcm9kdWNlcyIsICJhcHBsaWNhdGlvbi9qc29uIikucGFyYW0oIm1ldGhvZCIsCisgICAgICAgICAgICAgICAgIkdFVCIpLnJlbCgic2VsZiIpLmJ1aWxkKCk7CisgICAgICAgIExpbmsgbGluazIgPSBMaW5rLmZyb21VcmkoImh0dHA6Ly9leGFtcGxlLm9yZy9hcHAvbGluazIiKS5wYXJhbSgicHJvZHVjZXMiLCAiYXBwbGljYXRpb24veG1sIikucGFyYW0oIm1ldGhvZCIsCisgICAgICAgICAgICAgICAgIlBVVCIpLnJlbCgidXBkYXRlIikuYnVpbGQoKTsKKyAgICAgICAgTGluayBsaW5rMyA9IExpbmsuZnJvbVVyaSgiaHR0cDovL2V4YW1wbGUub3JnL2FwcC9saW5rMiIpLnBhcmFtKCJwcm9kdWNlcyIsICJhcHBsaWNhdGlvbi94bWwiKS5wYXJhbSgibWV0aG9kIiwKKyAgICAgICAgICAgICAgICAiUE9TVCIpLnJlbCgidXBkYXRlIikuYnVpbGQoKTsKKyAgICAgICAgci5oZWFkZXIoIkxpbmsiLCBsaW5rMS50b1N0cmluZygpKTsKKyAgICAgICAgci5oZWFkZXIoIkxpbmsiLCBsaW5rMi50b1N0cmluZygpKTsKKyAgICAgICAgci5oZWFkZXIoIkxpbmsiLCBsaW5rMy50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyLmdldExpbmsoInNlbGYiKS5lcXVhbHMobGluazEpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyLmdldExpbmsoInVwZGF0ZSIpLmVxdWFscyhsaW5rMikgfHwgci5nZXRMaW5rKCJ1cGRhdGUiKS5lcXVhbHMobGluazMpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBbGxvd2VkTWV0aG9kcygpIHsKKyAgICAgICAgSW5ib3VuZE1lc3NhZ2VDb250ZXh0IHIgPSBjcmVhdGVJbmJvdW5kTWVzc2FnZUNvbnRleHQoKTsKKyAgICAgICAgci5oZWFkZXIoSHR0cEhlYWRlcnMuQUxMT1csICJhLEIsQ2NDLGREZCIpOworICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiBhbGxvd2VkTWV0aG9kcyA9IHIuZ2V0QWxsb3dlZE1ldGhvZHMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQsIGFsbG93ZWRNZXRob2RzLnNpemUoKSk7CisgICAgICAgIGFzc2VydFRydWUoYWxsb3dlZE1ldGhvZHMuY29udGFpbnMoIkEiKSk7CisgICAgICAgIGFzc2VydFRydWUoYWxsb3dlZE1ldGhvZHMuY29udGFpbnMoIkIiKSk7CisgICAgICAgIGFzc2VydFRydWUoYWxsb3dlZE1ldGhvZHMuY29udGFpbnMoIkNDQyIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShhbGxvd2VkTWV0aG9kcy5jb250YWlucygiREREIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vbWVzc2FnZS9pbnRlcm5hbC9KZXJzZXlMaW5rVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9tZXNzYWdlL2ludGVybmFsL0plcnNleUxpbmtUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2UyNWRmOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vbWVzc2FnZS9pbnRlcm5hbC9KZXJzZXlMaW5rVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb24ubWVzc2FnZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTGluazsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUnVudGltZURlbGVnYXRlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbi5UZXN0UnVudGltZURlbGVnYXRlOworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICogVGVzdHMgZm9yIExpbmtUZXN0IGNsYXNzLgorICoKKyAqIEBhdXRob3IgU2FudGlhZ28gUGVyaWNhcy1HZWVydHNlbiAoU2FudGlhZ28uUGVyaWNhc0dlZXJ0c2VuIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXlMaW5rVGVzdCB7CisKKyAgICBAUGF0aCgiL215cmVzb3VyY2UiKQorICAgIHN0YXRpYyBjbGFzcyBNeVJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgc2VsZigpIHsKKyAgICAgICAgICAgIHJldHVybiAibXlzZWxmIjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi94bWwiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIG5vdFNlbGYoKSB7CisgICAgICAgICAgICByZXR1cm4gIjx4bWw+bm90U2VsZjwveG1sPiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUnVudGltZURlbGVnYXRlLnNldEluc3RhbmNlKG5ldyBUZXN0UnVudGltZURlbGVnYXRlKCkpOworICAgIH0KKworICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFJ1bnRpbWVEZWxlZ2F0ZS5zZXRJbnN0YW5jZShudWxsKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRVcmkoKSB7CisgICAgICAgIFVSSSB1ID0gVVJJLmNyZWF0ZSgiaHR0cDovL2V4YW1wbGUub3JnL2FwcC9saW5rMSIpOworICAgICAgICBMaW5rIGwxID0gTGluay5mcm9tVXJpKCJodHRwOi8vZXhhbXBsZS5vcmcvYXBwL2xpbmsxIikucGFyYW0oImZvbzEiLCAiYmFyMSIpLnBhcmFtKCJmb28yIiwgImJhcjIiKS5idWlsZCgpOworICAgICAgICBhc3NlcnRFcXVhbHMobDEuZ2V0VXJpKCksIHUpOworICAgICAgICBhc3NlcnRFcXVhbHMobDEuZ2V0VXJpQnVpbGRlcigpLmJ1aWxkKCksIHUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgeworICAgICAgICBMaW5rIGxpbmsgPSBMaW5rLmZyb21VcmkoImh0dHA6Ly9leGFtcGxlLm9yZy9hcHAvbGluazEiKS5yZWwoInNlbGYiKS5idWlsZCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjxodHRwOi8vZXhhbXBsZS5vcmcvYXBwL2xpbmsxPjsgcmVsPVwic2VsZlwiIiwgbGluay50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXR0ZXJzKCkgeworICAgICAgICBMaW5rIGxpbmsgPSBMaW5rLmZyb21VcmkoImh0dHA6Ly9leGFtcGxlLm9yZy9hcHAvbGluazEiKS5yZWwoInNlbGYiKS50eXBlKCJ0ZXh0L3BsYWluIikuYnVpbGQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9leGFtcGxlLm9yZy9hcHAvbGluazEiKSwgbGluay5nZXRVcmkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygic2VsZiIsIGxpbmsuZ2V0UmVsKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgbGluay5nZXRUaXRsZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0L3BsYWluIiwgbGluay5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbGluay5nZXRQYXJhbXMoKS5zaXplKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlZ3Jlc3Npb24gdGVzdCBmb3IgSkVSU0VZLTEzNzggZml4LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYnVpbGRSZWxhdGl2ZUxpbmtUZXN0KCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiYWElMjBiYiIpLCBMaW5rLmZyb21VcmkoImFhIGJiIikuYnVpbGQoKS5nZXRVcmkoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcm9kdWNlciBmb3IgSkVSU0VZLTIzODc6IElBRSBleHBlY3RlZCBvbiB1bnJlc29sdmVkIFVSSSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExpbmtCdWlsZGVyV2l0aFVucmVzb2x2ZWRUZW1wbGF0ZXMoKSB7CisgICAgICAgIExpbmsuQnVpbGRlciBsaW5rQnVpbGRlcjsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGxpbmtCdWlsZGVyID0gTGluay5mcm9tVXJpKCJzY2hlbWU6Ly9hdXRob3JpdHkve3gxfS97eDJ9L3t4M30iKTsKKyAgICAgICAgICAgIGxpbmtCdWlsZGVyLmJ1aWxkKCJwIik7CisgICAgICAgICAgICBmYWlsKCJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaXMgZXhwZWN0ZWQgdG8gYmUgdGhyb3duIGZyb20gTGluay5CdWlsZGVyIHdoZW4gdGhlcmUgYXJlIHVucmVzb2x2ZWQgdGVtcGxhdGVzLiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhwZWN0ZWQpIHsKKyAgICAgICAgICAgIC8vIGV4Y2VwdGlvbiBleHBlY3RlZCwgbW92ZSBvbi4uLgorICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBsaW5rQnVpbGRlciA9IExpbmsuZnJvbVVyaSgic2NoZW1lOi8vYXV0aG9yaXR5L3t4MX0ve3gyfS97eDN9Iik7CisgICAgICAgICAgICBsaW5rQnVpbGRlci5idWlsZCgpOworICAgICAgICAgICAgZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlzIGV4cGVjdGVkIHRvIGJlIHRocm93biBmcm9tIExpbmsuQnVpbGRlciB3aGVuIHRoZXJlIGFyZSB1bnJlc29sdmVkIHRlbXBsYXRlcy4iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4cGVjdGVkKSB7CisgICAgICAgICAgICAvLyBleGNlcHRpb24gZXhwZWN0ZWQsIG1vdmUgb24uLi4KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vbWVzc2FnZS9pbnRlcm5hbC9MaW5rUHJvdmlkZXJUZXN0LmphdmEgYi90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL21lc3NhZ2UvaW50ZXJuYWwvTGlua1Byb3ZpZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmOGYzYzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL21lc3NhZ2UvaW50ZXJuYWwvTGlua1Byb3ZpZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb24ubWVzc2FnZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTGluazsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUnVudGltZURlbGVnYXRlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbi5UZXN0UnVudGltZURlbGVnYXRlOworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3RzIGZvciBMaW5rUHJvdmlkZXIgY2xhc3MuCisgKgorICogQGF1dGhvciBTYW50aWFnbyBQZXJpY2FzLUdlZXJ0c2VuIChTYW50aWFnby5QZXJpY2FzR2VlcnRzZW4gYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIExpbmtQcm92aWRlclRlc3QgeworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFJ1bnRpbWVEZWxlZ2F0ZS5zZXRJbnN0YW5jZShuZXcgVGVzdFJ1bnRpbWVEZWxlZ2F0ZSgpKTsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSdW50aW1lRGVsZWdhdGUuc2V0SW5zdGFuY2UobnVsbCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsdWVPZigpIHsKKyAgICAgICAgZmluYWwgTGluayBsMSA9IExpbmsuZnJvbVVyaSgiaHR0cDovL2V4YW1wbGUub3JnL2FwcC9saW5rMSIpLmJ1aWxkKCk7CisgICAgICAgIExpbmsgbDIgPSBMaW5rLnZhbHVlT2YoIjxodHRwOi8vZXhhbXBsZS5vcmcvYXBwL2xpbmsxPiIpOworICAgICAgICBhc3NlcnRFcXVhbHMobDEsIGwyKTsKKyAgICAgICAgbDIgPSBMaW5rLnZhbHVlT2YoIiA8aHR0cDovL2V4YW1wbGUub3JnL2FwcC9saW5rMT4iKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGwxLCBsMik7CisgICAgICAgIGwyID0gTGluay52YWx1ZU9mKCIgPGh0dHA6Ly9leGFtcGxlLm9yZy9hcHAvbGluazE+ICIpOworICAgICAgICBhc3NlcnRFcXVhbHMobDEsIGwyKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWYWx1ZU9mRXhjZXB0aW9ucygpIHsKKyAgICAgICAgaW50IG5PZkV4Y2VwdGlvbnMgPSAwOworICAgICAgICB0cnkgeworICAgICAgICAgICAgTGluay52YWx1ZU9mKCJodHRwOi8vZXhhbXBsZS5vcmcvYXBwL2xpbmsxPiIpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbk9mRXhjZXB0aW9ucysrOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBMaW5rLnZhbHVlT2YoIjxodHRwOi8vZXhhbXBsZS5vcmcvYXBwL2xpbmsxIik7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBuT2ZFeGNlcHRpb25zKys7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIExpbmsudmFsdWVPZigiaHR0cDovL2V4YW1wbGUub3JnL2FwcC9saW5rMSIpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgbk9mRXhjZXB0aW9ucysrOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscyhuT2ZFeGNlcHRpb25zLCAzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWYWx1ZU9mUGFyYW1zKCkgeworICAgICAgICBmaW5hbCBMaW5rIGwxID0gTGluay5mcm9tVXJpKCJodHRwOi8vZXhhbXBsZS5vcmcvYXBwL2xpbmsxIikucGFyYW0oImZvbzEiLCAiYmFyMSIpLnBhcmFtKCJmb28yIiwgImJhcjIiKS5idWlsZCgpOworICAgICAgICBMaW5rIGwyID0gTGluay52YWx1ZU9mKCI8aHR0cDovL2V4YW1wbGUub3JnL2FwcC9saW5rMT47IGZvbzE9XCJiYXIxXCI7IGZvbzIgPSBcImJhcjJcIiIpOworICAgICAgICBhc3NlcnRFcXVhbHMobDEsIGwyKTsKKyAgICAgICAgbDIgPSBMaW5rLnZhbHVlT2YoIjxodHRwOi8vZXhhbXBsZS5vcmcvYXBwL2xpbmsxPjsgZm9vMj1cImJhcjJcIjsgZm9vMT0gXCJiYXIxXCIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGwxLCBsMik7CisgICAgICAgIGwyID0gTGluay52YWx1ZU9mKCI8aHR0cDovL2V4YW1wbGUub3JnL2FwcC9saW5rMT47ICAgICAgZm9vMT1cImJhcjFcIjsgICAgIGZvbzI9XCJiYXIyXCIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGwxLCBsMik7CisgICAgICAgIGwyID0gTGluay52YWx1ZU9mKCI8IGh0dHA6Ly9leGFtcGxlLm9yZy9hcHAvbGluazEgICA+OyAgICAgIGZvbzE9XCJiYXIxXCI7ICAgICBmb28yPVwiYmFyMlwiIik7CisgICAgICAgIGFzc2VydEVxdWFscyhsMSwgbDIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJvdW5kVHJpcCgpIHsKKyAgICAgICAgZmluYWwgTGluayBsMSA9IExpbmsuZnJvbVVyaSgiaHR0cDovL2V4YW1wbGUub3JnL2FwcC9saW5rMSIpLnBhcmFtKCJmb28xIiwgImJhcjEiKS5wYXJhbSgiZm9vMiIsICJiYXIyIikuYnVpbGQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGwxLCBMaW5rLnZhbHVlT2YobDEudG9TdHJpbmcoKSkpOworICAgICAgICBmaW5hbCBMaW5rIGwyID0gTGluay52YWx1ZU9mKCI8aHR0cDovL2V4YW1wbGUub3JnL2FwcC9saW5rMT47IGZvbzE9XCJiYXIxXCI7IGZvbzIgPSBcImJhcjJcIiIpOworICAgICAgICBhc3NlcnRFcXVhbHMobDEsIGwyKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaXRob3V0RG91YmxlUXVvdGVzKCkgeworICAgICAgICBmaW5hbCBMaW5rIGwxID0gTGluay5mcm9tVXJpKCJodHRwOi8vZXhhbXBsZS5vcmcvYXBwL2xpbmsxIikucGFyYW0oImZvbzEiLCAiYmFyMSIpLnBhcmFtKCJmb28yIiwgImJhcjIiKS5idWlsZCgpOworICAgICAgICBhc3NlcnRFcXVhbHMobDEsIExpbmsudmFsdWVPZihsMS50b1N0cmluZygpKSk7CisgICAgICAgIGZpbmFsIExpbmsgbDIgPSBMaW5rLnZhbHVlT2YoIjxodHRwOi8vZXhhbXBsZS5vcmcvYXBwL2xpbmsxPjsgZm9vMT1iYXIxOyBmb28yID0gYmFyMiIpOworICAgICAgICBhc3NlcnRFcXVhbHMobDEsIGwyKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL21lc3NhZ2UvaW50ZXJuYWwvTWF0Y2hpbmdFbnRpdHlUYWdUZXN0LmphdmEgYi90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL21lc3NhZ2UvaW50ZXJuYWwvTWF0Y2hpbmdFbnRpdHlUYWdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBkNDU3YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vbWVzc2FnZS9pbnRlcm5hbC9NYXRjaGluZ0VudGl0eVRhZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDkwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb24ubWVzc2FnZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5FbnRpdHlUYWc7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkh0dHBIZWFkZXJSZWFkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5NYXRjaGluZ0VudGl0eVRhZzsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiB7QGxpbmsgTWF0Y2hpbmdFbnRpdHlUYWd9IHVuaXQgdGVzdHMgcG9ydGVkIGZyb20gSmVyc2V5IDEueC4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIE1hdGNoaW5nRW50aXR5VGFnVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPbmVFbnRpdHlUYWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGhlYWRlciA9ICJcIjFcIiI7CisgICAgICAgIFNldDxNYXRjaGluZ0VudGl0eVRhZz4gcyA9IEh0dHBIZWFkZXJSZWFkZXIucmVhZE1hdGNoaW5nRW50aXR5VGFnKGhlYWRlcik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHMuc2l6ZSgpKTsKKworICAgICAgICBhc3NlcnRUcnVlKHMuY29udGFpbnMobmV3IEVudGl0eVRhZygiMSIpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVFbnRpdHlUYWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGhlYWRlciA9ICJcIjFcIiwgVy9cIjJcIiwgXCIzXCIiOworICAgICAgICBTZXQ8TWF0Y2hpbmdFbnRpdHlUYWc+IHMgPSBIdHRwSGVhZGVyUmVhZGVyLnJlYWRNYXRjaGluZ0VudGl0eVRhZyhoZWFkZXIpOworCisgICAgICAgIGFzc2VydEVxdWFscygzLCBzLnNpemUoKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShzLmNvbnRhaW5zKG5ldyBFbnRpdHlUYWcoIjEiKSkpOworCisgICAgICAgIGFzc2VydFRydWUocy5jb250YWlucyhuZXcgRW50aXR5VGFnKCIyIiwgdHJ1ZSkpKTsKKworICAgICAgICBhc3NlcnRUcnVlKHMuY29udGFpbnMobmV3IEVudGl0eVRhZygiMyIpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QW55TWF0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGhlYWRlciA9ICIqIjsKKyAgICAgICAgU2V0PE1hdGNoaW5nRW50aXR5VGFnPiBzID0gSHR0cEhlYWRlclJlYWRlci5yZWFkTWF0Y2hpbmdFbnRpdHlUYWcoaGVhZGVyKTsKKworICAgICAgICBhc3NlcnRUaGF0KHMuc2l6ZSgpLCBpcyhlcXVhbFRvKDApKSk7CisgICAgICAgIGFzc2VydFRoYXQoTWF0Y2hpbmdFbnRpdHlUYWcuQU5ZX01BVENILCBpcyhzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcm9kdWNlciBmb3IgSkVSU0VZLTEyNzguCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFkRW50aXR5VGFnKCkgeworICAgICAgICBTdHJpbmcgaGVhZGVyID0gIjFcIiI7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBIdHRwSGVhZGVyUmVhZGVyLnJlYWRNYXRjaGluZ0VudGl0eVRhZyhoZWFkZXIpOworICAgICAgICAgICAgZmFpbCgiUGFyc2VFeGNlcHRpb24gZXhwZWN0ZWQiKTsKKyAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gcGUpIHsKKyAgICAgICAgICAgIGFzc2VydFRoYXQocGUuZ2V0TWVzc2FnZSgpLCBjb250YWluc1N0cmluZyhoZWFkZXIpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vbWVzc2FnZS9pbnRlcm5hbC9NZWRpYVR5cGVzVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9tZXNzYWdlL2ludGVybmFsL01lZGlhVHlwZXNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJkY2Q4MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vbWVzc2FnZS9pbnRlcm5hbC9NZWRpYVR5cGVzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTU4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb24ubWVzc2FnZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkh0dHBIZWFkZXJSZWFkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5NZWRpYVR5cGVzOworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIE1lZGlhVHlwZXMgdXRpbGl0eSBtZXRob2QgdGVzdHMuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhbGNlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIE1lZGlhVHlwZXNUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbnZlcnRUb1N0cmluZygpIHsKKyAgICAgICAgZmluYWwgTGlzdDxNZWRpYVR5cGU+IGVtcHR5TGlzdCA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIiLCBNZWRpYVR5cGVzLmNvbnZlcnRUb1N0cmluZyhlbXB0eUxpc3QpKTsKKworCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIlwidGV4dC9wbGFpblwiIiwgTWVkaWFUeXBlcy5jb252ZXJ0VG9TdHJpbmcoQ29sbGVjdGlvbnMuc2luZ2xldG9uKE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKSk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiXCJ0ZXh0L3BsYWluXCIsIFwiYXBwbGljYXRpb24vanNvblwiIiwKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGVzLmNvbnZlcnRUb1N0cmluZyhBcnJheXMuYXNMaXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFKSkpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIlwidGV4dC9wbGFpblwiLCBcImFwcGxpY2F0aW9uL2pzb25cIiwgXCJ0ZXh0L2h0bWxcIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlcy5jb252ZXJ0VG9TdHJpbmcoQXJyYXlzLmFzTGlzdChNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZS5URVhUX0hUTUxfVFlQRSkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNb3N0U3BlY2lmaWMoKSB7CisKKyAgICAgICAgTWVkaWFUeXBlIG0xOworICAgICAgICBNZWRpYVR5cGUgbTI7CisKKyAgICAgICAgLyogd2lsZGNhcmQgdHlwZSAqLworICAgICAgICBtMSA9IE1lZGlhVHlwZS5XSUxEQ0FSRF9UWVBFOworCisgICAgICAgIC8vIHdpbGRjYXJkIHR5cGUgIzEgLSBjb25jcmV0ZSB0eXBlIHdpbnMKKyAgICAgICAgbTIgPSBuZXcgTWVkaWFUeXBlKCJmb28iLCAiYmFyIik7CisgICAgICAgIF90ZXN0TW9zdFNwZWNpZmljKG0xLCBtMiwgbTIpOworICAgICAgICBfdGVzdE1vc3RTcGVjaWZpYyhtMiwgbTEsIG0yKTsKKworICAgICAgICAvLyB3aWxkY2FyZCB0eXBlICMyIC0gd2lsZGNhcmQgc3VidHlwZSB3aW5zCisgICAgICAgIG0yID0gbmV3IE1lZGlhVHlwZSgiZm9vIiwgIioiKTsKKyAgICAgICAgX3Rlc3RNb3N0U3BlY2lmaWMobTEsIG0yLCBtMik7CisgICAgICAgIF90ZXN0TW9zdFNwZWNpZmljKG0yLCBtMSwgbTIpOworCisgICAgICAgIC8vIHdpbGRjYXJkIHR5cGUgIzMgLSBmaXJzdCBwYXJhbWV0ZXIgd2lucworICAgICAgICBtMiA9IG5ldyBNZWRpYVR5cGUoIioiLCAiKiIpOworICAgICAgICBfdGVzdE1vc3RTcGVjaWZpYyhtMSwgbTIsIG0xKTsKKyAgICAgICAgX3Rlc3RNb3N0U3BlY2lmaWMobTIsIG0xLCBtMik7CisKKyAgICAgICAgLyogd2lsZGNhcmQgc3VidHlwZSAqLworICAgICAgICBtMSA9IG5ldyBNZWRpYVR5cGUoIm1vbyIsICIqIik7CisKKyAgICAgICAgLy8gd2lsZGNhcmQgc3VidHlwZSAjMSAtIGNvbmNyZXRlIHR5cGUgd2lucworICAgICAgICBtMiA9IG5ldyBNZWRpYVR5cGUoImZvbyIsICJiYXIiKTsKKyAgICAgICAgX3Rlc3RNb3N0U3BlY2lmaWMobTEsIG0yLCBtMik7CisgICAgICAgIF90ZXN0TW9zdFNwZWNpZmljKG0yLCBtMSwgbTIpOworCisgICAgICAgIC8vIHdpbGRjYXJkIHN1YnR5cGUgIzIgLSBmaXJzdCBwYXJhbWV0ZXIgaW4gbWV0aG9kIHdpbnMKKyAgICAgICAgbTIgPSBuZXcgTWVkaWFUeXBlKCJmb28iLCAiKiIpOworICAgICAgICBfdGVzdE1vc3RTcGVjaWZpYyhtMSwgbTIsIG0xKTsKKyAgICAgICAgX3Rlc3RNb3N0U3BlY2lmaWMobTIsIG0xLCBtMik7CisKKyAgICAgICAgLyogY29uY3JldGUgdHlwZXMgKi8KKyAgICAgICAgLy8gY29uY3JldGUgdHlwZXMgLSBmaXJzdCBwYXJhbWV0ZXIgaW4gbWV0aG9kIHdpbnMKKyAgICAgICAgbTEgPSBuZXcgTWVkaWFUeXBlKCJtb28iLCAiYm9vIik7CisgICAgICAgIG0yID0gbmV3IE1lZGlhVHlwZSgiZm9vIiwgImJhciIpOworICAgICAgICBfdGVzdE1vc3RTcGVjaWZpYyhtMSwgbTIsIG0xKTsKKyAgICAgICAgX3Rlc3RNb3N0U3BlY2lmaWMobTIsIG0xLCBtMik7CisKKyAgICAgICAgLyogY29uY3JldGUgdHlwZSB3aXRoIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgbTEgPSBuZXcgTWVkaWFUeXBlKCJmb28iLCAiYmFyIiwgYXNNYXAoInAxPXYxO3AyPXYyIikpOworCisgICAgICAgIC8vIGNvbmNyZXRlIHR5cGUgd2l0aCBwYXJhbWV0ZXJzICMxIC0gd2lsZGNhcmQgdHlwZSBsb29zZXMKKyAgICAgICAgbTIgPSBNZWRpYVR5cGUuV0lMRENBUkRfVFlQRTsKKyAgICAgICAgX3Rlc3RNb3N0U3BlY2lmaWMobTEsIG0yLCBtMSk7CisgICAgICAgIF90ZXN0TW9zdFNwZWNpZmljKG0yLCBtMSwgbTEpOworCisgICAgICAgIC8vIGNvbmNyZXRlIHR5cGUgd2l0aCBwYXJhbWV0ZXJzICMyIC0gd2lsZGNhcmQgc3VidHlwZSBsb29zZXMKKyAgICAgICAgbTIgPSBuZXcgTWVkaWFUeXBlKCJmb28iLCAiKiIpOworICAgICAgICBfdGVzdE1vc3RTcGVjaWZpYyhtMSwgbTIsIG0xKTsKKyAgICAgICAgX3Rlc3RNb3N0U3BlY2lmaWMobTIsIG0xLCBtMSk7CisKKyAgICAgICAgLy8gY29uY3JldGUgdHlwZSB3aXRoIHBhcmFtZXRlcnMgIzMgLSBjb25jcmV0ZSBwYXJhbWV0ZXItbGVzcyB0eXBlIGxvb3NlcworICAgICAgICBtMiA9IG5ldyBNZWRpYVR5cGUoImZvbyIsICJiYXoiKTsKKyAgICAgICAgX3Rlc3RNb3N0U3BlY2lmaWMobTEsIG0yLCBtMSk7CisgICAgICAgIF90ZXN0TW9zdFNwZWNpZmljKG0yLCBtMSwgbTEpOworCisgICAgICAgIC8vIGNvbmNyZXRlIHR5cGUgd2l0aCBwYXJhbWV0ZXJzICM0IC0gdHlwZSB3aXRoIGxlc3MgcGFyYW1ldGVycyB0eXBlIGxvb3NlcworICAgICAgICBtMiA9IG5ldyBNZWRpYVR5cGUoImZvbyIsICJiYXoiLCBhc01hcCgiYTE9YjEiKSk7CisgICAgICAgIF90ZXN0TW9zdFNwZWNpZmljKG0xLCBtMiwgbTEpOworICAgICAgICBfdGVzdE1vc3RTcGVjaWZpYyhtMiwgbTEsIG0xKTsKKworICAgICAgICAvLyBib3RoIGNvbmNyZXRlIHR5cGVzIHdpdGggcGFyYW1ldGVycyAjNSAtIGZpcnN0IHBhcmFtZXRlciBpbiBtZXRob2Qgd2lucworICAgICAgICBtMiA9IG5ldyBNZWRpYVR5cGUoImZvbyIsICJiYXoiLCBhc01hcCgiYTE9YjE7YTI9YjIiKSk7CisgICAgICAgIF90ZXN0TW9zdFNwZWNpZmljKG0xLCBtMiwgbTEpOworICAgICAgICBfdGVzdE1vc3RTcGVjaWZpYyhtMiwgbTEsIG0yKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIF90ZXN0TW9zdFNwZWNpZmljKE1lZGlhVHlwZSBtMSwgTWVkaWFUeXBlIG0yLCBNZWRpYVR5cGUgcmVzdWx0KSB7CisgICAgICAgIGFzc2VydFRoYXQoIlVuZXhwZWN0ZWQgbWVkaWEgdHlwZSBzZWxlY3RlZCB0byBiZSBtb3N0IHNwZWNpZmljLiIsCisgICAgICAgICAgICAgICAgTWVkaWFUeXBlcy5tb3N0U3BlY2lmaWMobTEsIG0yKSwgaXMocmVzdWx0KSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIG1hcCBmcm9tIEhUVFAgaGVhZGVyIHBhcmFtZXRlciBzdHJpbmdzLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmFtZXRlcnMgSFRUUCBoZWFkZXIgcGFyYW1ldGVycyBzdHJpbmcuCisgICAgICogQHJldHVybiBIVFRQIGhlYWRlciBwYXJhbWV0ZXJzIG1hcC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE1hcDxTdHJpbmcsIFN0cmluZz4gYXNNYXAoU3RyaW5nIHBhcmFtZXRlcnMpIHsKKyAgICAgICAgSHR0cEhlYWRlclJlYWRlciByZWFkZXIgPSBIdHRwSGVhZGVyUmVhZGVyLm5ld0luc3RhbmNlKCI7IiArIHBhcmFtZXRlcnMpOworCisgICAgICAgIGlmIChyZWFkZXIuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBIdHRwSGVhZGVyUmVhZGVyLnJlYWRQYXJhbWV0ZXJzKHJlYWRlcik7CisgICAgICAgICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL21lc3NhZ2UvaW50ZXJuYWwvT3V0Ym91bmRKYXhyc1Jlc3BvbnNlQnVpbGRlclRlc3QuamF2YSBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vbWVzc2FnZS9pbnRlcm5hbC9PdXRib3VuZEpheHJzUmVzcG9uc2VCdWlsZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNjg2OTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL21lc3NhZ2UvaW50ZXJuYWwvT3V0Ym91bmRKYXhyc1Jlc3BvbnNlQnVpbGRlclRlc3QuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb24ubWVzc2FnZS5pbnRlcm5hbDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUnVudGltZURlbGVnYXRlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5PdXRib3VuZEpheHJzUmVzcG9uc2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5PdXRib3VuZE1lc3NhZ2VDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb24uVGVzdFJ1bnRpbWVEZWxlZ2F0ZTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBKYXhyc1Jlc3BvbnNlVmlld1Rlc3QgY2xhc3MuCisgKgorICogQGF1dGhvciBTYW50aWFnbyBQZXJpY2FzLUdlZXJ0c2VuIChzYW50aWFnby5wZXJpY2FzZ2VlcnRzZW4gYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIE91dGJvdW5kSmF4cnNSZXNwb25zZUJ1aWxkZXJUZXN0IHsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSB0ZXN0IGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBPdXRib3VuZEpheHJzUmVzcG9uc2VCdWlsZGVyVGVzdCgpIHsKKyAgICAgICAgUnVudGltZURlbGVnYXRlLnNldEluc3RhbmNlKG5ldyBUZXN0UnVudGltZURlbGVnYXRlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgbWVkaWEgdHlwZSBoZWFkZXIgc2V0dGluZywgcmV0cmlldmFsLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1lZGlhVHlwZSgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgciA9IG5ldyBPdXRib3VuZEpheHJzUmVzcG9uc2UuQnVpbGRlcihuZXcgT3V0Ym91bmRNZXNzYWdlQ29udGV4dCgpKQorICAgICAgICAgICAgICAgIC5oZWFkZXIoSHR0cEhlYWRlcnMuQ09OVEVOVF9UWVBFLCBNZWRpYVR5cGUuVEVYVF9IVE1MKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjA0LCByLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJlc3BvbnNlLlN0YXR1cy5OT19DT05URU5ULCByLmdldFN0YXR1c0luZm8oKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUuVEVYVF9IVE1MX1RZUEUsIHIuZ2V0TWVkaWFUeXBlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElzc3VlMTI5N0ZpeCgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSBuZXcgT3V0Ym91bmRKYXhyc1Jlc3BvbnNlLkJ1aWxkZXIobmV3IE91dGJvdW5kTWVzc2FnZUNvbnRleHQoKSkKKyAgICAgICAgICAgICAgICAuc3RhdHVzKFJlc3BvbnNlLlN0YXR1cy5PSykKKyAgICAgICAgICAgICAgICAuZW50aXR5KCIxMjM0NTY3ODkwIikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgZmluYWwgaW50IGxlbiA9IHJlc3BvbnNlLmdldExlbmd0aCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIGxlbik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9tZXNzYWdlL2ludGVybmFsL091dGJvdW5kSmF4cnNSZXNwb25zZVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vbWVzc2FnZS9pbnRlcm5hbC9PdXRib3VuZEpheHJzUmVzcG9uc2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZjMjQxZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vbWVzc2FnZS9pbnRlcm5hbC9PdXRib3VuZEpheHJzUmVzcG9uc2VUZXN0LmphdmEKQEAgLTAsMCArMSwyNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbi5tZXNzYWdlLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUnVudGltZURlbGVnYXRlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5PdXRib3VuZEpheHJzUmVzcG9uc2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5PdXRib3VuZE1lc3NhZ2VDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb24uVGVzdFJ1bnRpbWVEZWxlZ2F0ZTsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCisvKioKKyAqIE91dGJvdW5kSmF4cnNSZXNwb25zZSB1bml0IHRlc3RzLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBPdXRib3VuZEpheHJzUmVzcG9uc2VUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRlc3RJbnB1dFN0cmVhbSBleHRlbmRzIEJ5dGVBcnJheUlucHV0U3RyZWFtIHsKKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNSZWFkOworICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNDbG9zZWQ7CisKKyAgICAgICAgcHJpdmF0ZSBUZXN0SW5wdXRTdHJlYW0oKSB7CisgICAgICAgICAgICBzdXBlcigidGVzdCIuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgcmVhZCgpIHsKKyAgICAgICAgICAgIGZpbmFsIGludCByZWFkID0gc3VwZXIucmVhZCgpOworICAgICAgICAgICAgaXNSZWFkID0gcmVhZCA9PSAtMTsKKyAgICAgICAgICAgIHJldHVybiByZWFkOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgaW50IHJlYWQoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHsKKyAgICAgICAgICAgIGZpbmFsIGludCByZWFkID0gc3VwZXIucmVhZChiLCBvZmYsIGxlbik7CisgICAgICAgICAgICBpc1JlYWQgPSByZWFkID09IC0xOworICAgICAgICAgICAgcmV0dXJuIHJlYWQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgaW50IHJlYWQgPSBzdXBlci5yZWFkKGIpOworICAgICAgICAgICAgaXNSZWFkID0gcmVhZCA9PSAtMTsKKyAgICAgICAgICAgIHJldHVybiByZWFkOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlzQ2xvc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIHN1cGVyLmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBPdXRib3VuZE1lc3NhZ2VDb250ZXh0LlN0cmVhbVByb3ZpZGVyIFRFU1RfUFJPVklERVIKKyAgICAgICAgICAgID0gbmV3IE91dGJvdW5kTWVzc2FnZUNvbnRleHQuU3RyZWFtUHJvdmlkZXIoKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbShpbnQgY29udGVudExlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgcHJpdmF0ZSBSZXNwb25zZS5SZXNwb25zZUJ1aWxkZXIgcmI7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgdGVzdCBjbGFzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgT3V0Ym91bmRKYXhyc1Jlc3BvbnNlVGVzdCgpIHsKKyAgICAgICAgUnVudGltZURlbGVnYXRlLnNldEluc3RhbmNlKG5ldyBUZXN0UnVudGltZURlbGVnYXRlKCkpOworICAgIH0KKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHsKKyAgICAgICAgcmIgPSBuZXcgT3V0Ym91bmRKYXhyc1Jlc3BvbnNlLkJ1aWxkZXIobmV3IE91dGJvdW5kTWVzc2FnZUNvbnRleHQoKSkuc3RhdHVzKFJlc3BvbnNlLlN0YXR1cy5PSyk7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUZXN0IG9mIGVtcHR5IGVudGl0eSBidWZmZXJpbmcuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnVmZmVyRW1wdHlFbnRpdHkoKSB7CisgICAgICAgIGZpbmFsIE91dGJvdW5kSmF4cnNSZXNwb25zZSByID0gT3V0Ym91bmRKYXhyc1Jlc3BvbnNlLmZyb20ocmIuYnVpbGQoKSk7CisgICAgICAgIHIuZ2V0Q29udGV4dCgpLnNldFN0cmVhbVByb3ZpZGVyKFRFU1RfUFJPVklERVIpOworCisgICAgICAgIGFzc2VydEZhbHNlKCJCdWZmZXIgZW50aXR5IHNob3VsZCByZXR1cm4gJ2ZhbHNlJyBpZiBubyBlbnRpdHkuIiwgci5idWZmZXJFbnRpdHkoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBvZiBub24tc3RyZWFtIGVudGl0eSBidWZmZXJpbmcuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnVmZmVyTm9uU3RyZWFtRW50aXR5KCkgeworICAgICAgICBmaW5hbCBPdXRib3VuZEpheHJzUmVzcG9uc2UgciA9IE91dGJvdW5kSmF4cnNSZXNwb25zZS5mcm9tKHJiLmVudGl0eShuZXcgT2JqZWN0KCkpLmJ1aWxkKCkpOworICAgICAgICByLmdldENvbnRleHQoKS5zZXRTdHJlYW1Qcm92aWRlcihURVNUX1BST1ZJREVSKTsKKworICAgICAgICBhc3NlcnRGYWxzZSgiQnVmZmVyIGVudGl0eSBzaG91bGQgcmV0dXJuICdmYWxzZScgZm9yIG5vbi1zdHJlYW0gZW50aXR5LiIsIHIuYnVmZmVyRW50aXR5KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgb2Ygc3RyZWFtIGVudGl0eSBidWZmZXJpbmcuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnVmZmVyU3RyZWFtRW50aXR5KCkgeworICAgICAgICBUZXN0SW5wdXRTdHJlYW0gdGlzID0gbmV3IFRlc3RJbnB1dFN0cmVhbSgpOworICAgICAgICBmaW5hbCBPdXRib3VuZEpheHJzUmVzcG9uc2UgciA9IE91dGJvdW5kSmF4cnNSZXNwb25zZS5mcm9tKHJiLmVudGl0eSh0aXMpLmJ1aWxkKCkpOworICAgICAgICByLmdldENvbnRleHQoKS5zZXRTdHJlYW1Qcm92aWRlcihURVNUX1BST1ZJREVSKTsKKworICAgICAgICBhc3NlcnRUcnVlKCJCdWZmZXIgZW50aXR5IHNob3VsZCByZXR1cm4gJ3RydWUnIGZvciBzdHJlYW0gZW50aXR5LiIsIHIuYnVmZmVyRW50aXR5KCkpOworICAgICAgICBhc3NlcnRUcnVlKCJTZWNvbmQgY2FsbCB0byBidWZmZXIgZW50aXR5IHNob3VsZCByZXR1cm4gJ3RydWUnIGZvciBzdHJlYW0gZW50aXR5LiIsIHIuYnVmZmVyRW50aXR5KCkpOyAvLyBzZWNvbmQgY2FsbAorICAgICAgICBhc3NlcnRUcnVlKCJCdWZmZXJlZCBzdHJlYW0gaGFzIG5vdCBiZWVuIGZ1bGx5IHJlYWQuIiwgdGlzLmlzUmVhZCk7CisgICAgICAgIGFzc2VydFRydWUoIkJ1ZmZlcmVkIHN0cmVhbSBoYXMgbm90IGJlZW4gY2xvc2VkIGFmdGVyIGJ1ZmZlcmluZy4iLCB0aXMuaXNDbG9zZWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgb2YgY2xvc2luZyByZXNwb25zZSB3aXRoIGVtcHR5IGVudGl0eS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZUVtcHR5RW50aXR5KCkgeworICAgICAgICBmaW5hbCBPdXRib3VuZEpheHJzUmVzcG9uc2UgciA9IE91dGJvdW5kSmF4cnNSZXNwb25zZS5mcm9tKHJiLmJ1aWxkKCkpOworICAgICAgICByLmdldENvbnRleHQoKS5zZXRTdHJlYW1Qcm92aWRlcihURVNUX1BST1ZJREVSKTsKKworICAgICAgICByLmNsb3NlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByLmJ1ZmZlckVudGl0eSgpOworICAgICAgICAgICAgZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkIHdoZW4gYnVmZmVyaW5nIGVudGl0eSBvbiBjbG9zZWQgcmVzcG9uc2UuIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gb2sKKyAgICAgICAgfQorICAgICAgICByLmNsb3NlKCk7IC8vIHNlY29uZCBjYWxsIHNob3VsZCBwYXNzCisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBvZiBjbG9zaW5nIHJlc3BvbnNlIHdpdGggbm9uLXN0cmVhbSBlbnRpdHkuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2VOb25TdHJlYW1FbnRpdHkoKSB7CisgICAgICAgIGZpbmFsIE91dGJvdW5kSmF4cnNSZXNwb25zZSByID0gT3V0Ym91bmRKYXhyc1Jlc3BvbnNlLmZyb20ocmIuZW50aXR5KG5ldyBPYmplY3QoKSkuYnVpbGQoKSk7CisgICAgICAgIHIuZ2V0Q29udGV4dCgpLnNldFN0cmVhbVByb3ZpZGVyKFRFU1RfUFJPVklERVIpOworCisgICAgICAgIHIuY2xvc2UoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHIuYnVmZmVyRW50aXR5KCk7CisgICAgICAgICAgICBmYWlsKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQgd2hlbiBidWZmZXJpbmcgZW50aXR5IG9uIGNsb3NlZCByZXNwb25zZS4iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBvaworICAgICAgICB9CisgICAgICAgIHIuY2xvc2UoKTsgLy8gc2Vjb25kIGNhbGwgc2hvdWxkIHBhc3MKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IG9mIGNsb3NpbmcgcmVzcG9uc2Ugd2l0aCBzdHJlYW0gZW50aXR5LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsb3NlU3RyZWFtRW50aXR5KCkgeworICAgICAgICBUZXN0SW5wdXRTdHJlYW0gdGlzID0gbmV3IFRlc3RJbnB1dFN0cmVhbSgpOworICAgICAgICBmaW5hbCBPdXRib3VuZEpheHJzUmVzcG9uc2UgciA9IE91dGJvdW5kSmF4cnNSZXNwb25zZS5mcm9tKHJiLmVudGl0eSh0aXMpLmJ1aWxkKCkpOworICAgICAgICByLmdldENvbnRleHQoKS5zZXRTdHJlYW1Qcm92aWRlcihURVNUX1BST1ZJREVSKTsKKworICAgICAgICByLmNsb3NlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByLmJ1ZmZlckVudGl0eSgpOworICAgICAgICAgICAgZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkIHdoZW4gYnVmZmVyaW5nIGVudGl0eSBvbiBjbG9zZWQgcmVzcG9uc2UuIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gb2sKKyAgICAgICAgfQorICAgICAgICByLmNsb3NlKCk7IC8vIHNlY29uZCBjYWxsIHNob3VsZCBwYXNzCisKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlVuYnVmZmVyZWQgY2xvc2VkIHJlc3BvbnNlIHN0cmVhbSBlbnRpdHkgc2hvdWxkIG5vdCBiZSByZWFkLiIsIHRpcy5pc1JlYWQpOworICAgICAgICBhc3NlcnRUcnVlKCJDbG9zZWQgcmVzcG9uc2Ugc3RyZWFtIGVudGl0eSBzaG91bGQgaGF2ZSBiZWVuIGNsb3NlZC4iLCB0aXMuaXNDbG9zZWQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgb2YgY2xvc2luZyByZXNwb25zZSB3aXRoIGVtcHR5IGVudGl0eS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbG9zZUVtcHR5RW50aXR5Tm9TdHJlYW1Qcm92aWRlcigpIHsKKyAgICAgICAgZmluYWwgT3V0Ym91bmRKYXhyc1Jlc3BvbnNlIHIgPSBPdXRib3VuZEpheHJzUmVzcG9uc2UuZnJvbShyYi5idWlsZCgpKTsKKyAgICAgICAgci5jbG9zZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgci5idWZmZXJFbnRpdHkoKTsKKyAgICAgICAgICAgIGZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCB3aGVuIGJ1ZmZlcmluZyBlbnRpdHkgb24gY2xvc2VkIHJlc3BvbnNlLiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIG9rCisgICAgICAgIH0KKyAgICAgICAgci5jbG9zZSgpOyAvLyBzZWNvbmQgY2FsbCBzaG91bGQgcGFzcworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgb2YgY2xvc2luZyByZXNwb25zZSB3aXRoIG5vbi1zdHJlYW0gZW50aXR5LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsb3NlTm9uU3RyZWFtRW50aXR5Tm9TdHJlYW1Qcm92aWRlcigpIHsKKyAgICAgICAgZmluYWwgT3V0Ym91bmRKYXhyc1Jlc3BvbnNlIHIgPSBPdXRib3VuZEpheHJzUmVzcG9uc2UuZnJvbShyYi5lbnRpdHkobmV3IE9iamVjdCgpKS5idWlsZCgpKTsKKyAgICAgICAgci5jbG9zZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgci5idWZmZXJFbnRpdHkoKTsKKyAgICAgICAgICAgIGZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCB3aGVuIGJ1ZmZlcmluZyBlbnRpdHkgb24gY2xvc2VkIHJlc3BvbnNlLiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIG9rCisgICAgICAgIH0KKyAgICAgICAgci5jbG9zZSgpOyAvLyBzZWNvbmQgY2FsbCBzaG91bGQgcGFzcworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgb2YgY2xvc2luZyByZXNwb25zZSB3aXRoIHN0cmVhbSBlbnRpdHkuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvc2VTdHJlYW1FbnRpdHlOb1N0cmVhbVByb3ZpZGVyKCkgeworICAgICAgICBUZXN0SW5wdXRTdHJlYW0gdGlzID0gbmV3IFRlc3RJbnB1dFN0cmVhbSgpOworICAgICAgICBmaW5hbCBPdXRib3VuZEpheHJzUmVzcG9uc2UgciA9IE91dGJvdW5kSmF4cnNSZXNwb25zZS5mcm9tKHJiLmVudGl0eSh0aXMpLmJ1aWxkKCkpOworICAgICAgICByLmNsb3NlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByLmJ1ZmZlckVudGl0eSgpOworICAgICAgICAgICAgZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkIHdoZW4gYnVmZmVyaW5nIGVudGl0eSBvbiBjbG9zZWQgcmVzcG9uc2UuIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gb2sKKyAgICAgICAgfQorICAgICAgICByLmNsb3NlKCk7IC8vIHNlY29uZCBjYWxsIHNob3VsZCBwYXNzCisKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlVuYnVmZmVyZWQgY2xvc2VkIHJlc3BvbnNlIHN0cmVhbSBlbnRpdHkgc2hvdWxkIG5vdCBiZSByZWFkLiIsIHRpcy5pc1JlYWQpOworICAgICAgICBhc3NlcnRUcnVlKCJDbG9zZWQgcmVzcG9uc2Ugc3RyZWFtIGVudGl0eSBzaG91bGQgaGF2ZSBiZWVuIGNsb3NlZC4iLCB0aXMuaXNDbG9zZWQpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9tZXNzYWdlL2ludGVybmFsL091dGJvdW5kTWVzc2FnZUNvbnRleHRUZXN0LmphdmEgYi90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL21lc3NhZ2UvaW50ZXJuYWwvT3V0Ym91bmRNZXNzYWdlQ29udGV4dFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGYyYTAzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9tZXNzYWdlL2ludGVybmFsL091dGJvdW5kTWVzc2FnZUNvbnRleHRUZXN0LmphdmEKQEAgLTAsMCArMSwyMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbi5tZXNzYWdlLmludGVybmFsOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5FbnRpdHlUYWc7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkxpbms7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJ1bnRpbWVEZWxlZ2F0ZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuQ29va2llUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5PdXRib3VuZE1lc3NhZ2VDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb24uVGVzdFJ1bnRpbWVEZWxlZ2F0ZTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuY29udGFpbnM7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCisvKioKKyAqIHtAbGluayBPdXRib3VuZE1lc3NhZ2VDb250ZXh0fSB0ZXN0LgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBPdXRib3VuZE1lc3NhZ2VDb250ZXh0VGVzdCB7CisKKyAgICBwdWJsaWMgT3V0Ym91bmRNZXNzYWdlQ29udGV4dFRlc3QoKSB7CisgICAgICAgIFJ1bnRpbWVEZWxlZ2F0ZS5zZXRJbnN0YW5jZShuZXcgVGVzdFJ1bnRpbWVEZWxlZ2F0ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBY2NlcHRhYmxlTWVkaWFUeXBlcygpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24geworICAgICAgICBPdXRib3VuZE1lc3NhZ2VDb250ZXh0IHIgPSBuZXcgT3V0Ym91bmRNZXNzYWdlQ29udGV4dCgpOworCisgICAgICAgIHIuZ2V0SGVhZGVycygpLmFkZChIdHRwSGVhZGVycy5BQ0NFUFQsICJhcHBsaWNhdGlvbi94bWwsIHRleHQvcGxhaW4iKTsKKyAgICAgICAgci5nZXRIZWFkZXJzKCkuYWRkKEh0dHBIZWFkZXJzLkFDQ0VQVCwgImFwcGxpY2F0aW9uL2pzb24iKTsKKworICAgICAgICBmaW5hbCBMaXN0PE1lZGlhVHlwZT4gYWNjZXB0YWJsZU1lZGlhVHlwZXMgPSByLmdldEFjY2VwdGFibGVNZWRpYVR5cGVzKCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChhY2NlcHRhYmxlTWVkaWFUeXBlcy5zaXplKCksIGVxdWFsVG8oMykpOworICAgICAgICBhc3NlcnRUaGF0KGFjY2VwdGFibGVNZWRpYVR5cGVzLAorICAgICAgICAgICAgICAgIGNvbnRhaW5zKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUxfVFlQRSwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFjY2VwdGFibGVMYW5ndWFnZXMoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKKyAgICAgICAgT3V0Ym91bmRNZXNzYWdlQ29udGV4dCByID0gbmV3IE91dGJvdW5kTWVzc2FnZUNvbnRleHQoKTsKKyAgICAgICAgci5nZXRIZWFkZXJzKCkuYWRkKEh0dHBIZWFkZXJzLkFDQ0VQVF9MQU5HVUFHRSwgImVuLWdiO3E9MC44LCBlbjtxPTAuNyIpOworICAgICAgICByLmdldEhlYWRlcnMoKS5hZGQoSHR0cEhlYWRlcnMuQUNDRVBUX0xBTkdVQUdFLCAiZGUiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHIuZ2V0QWNjZXB0YWJsZUxhbmd1YWdlcygpLnNpemUoKSwgMyk7CisgICAgICAgIGFzc2VydFRydWUoci5nZXRBY2NlcHRhYmxlTGFuZ3VhZ2VzKCkuY29udGFpbnMoTG9jYWxlLlVLKSk7CisgICAgICAgIGFzc2VydFRydWUoci5nZXRBY2NlcHRhYmxlTGFuZ3VhZ2VzKCkuY29udGFpbnMoTG9jYWxlLkVOR0xJU0gpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyLmdldEFjY2VwdGFibGVMYW5ndWFnZXMoKS5jb250YWlucyhMb2NhbGUuR0VSTUFOKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWVzdENvb2tpZXMoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKKyAgICAgICAgT3V0Ym91bmRNZXNzYWdlQ29udGV4dCByID0gbmV3IE91dGJvdW5kTWVzc2FnZUNvbnRleHQoKTsKKyAgICAgICAgci5nZXRIZWFkZXJzKCkuYWRkKEh0dHBIZWFkZXJzLkNPT0tJRSwgIm9yZW89Y2hvY29sYXRlIik7CisgICAgICAgIHIuZ2V0SGVhZGVycygpLmFkZChIdHRwSGVhZGVycy5DT09LSUUsICJuaWxsYT12YW5pbGxhIik7CisgICAgICAgIGFzc2VydEVxdWFscyhyLmdldFJlcXVlc3RDb29raWVzKCkuc2l6ZSgpLCAyKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyLmdldFJlcXVlc3RDb29raWVzKCkuY29udGFpbnNLZXkoIm9yZW8iKSk7CisgICAgICAgIGFzc2VydFRydWUoci5nZXRSZXF1ZXN0Q29va2llcygpLmNvbnRhaW5zS2V5KCJuaWxsYSIpKTsKKyAgICAgICAgQ29va2llUHJvdmlkZXIgY3AgPSBuZXcgQ29va2llUHJvdmlkZXIoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyLmdldFJlcXVlc3RDb29raWVzKCkuY29udGFpbnNWYWx1ZShjcC5mcm9tU3RyaW5nKCJvcmVvPWNob2NvbGF0ZSIpKSk7CisgICAgICAgIGFzc2VydFRydWUoci5nZXRSZXF1ZXN0Q29va2llcygpLmNvbnRhaW5zVmFsdWUoY3AuZnJvbVN0cmluZygibmlsbGE9dmFuaWxsYSIpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGF0ZSgpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgT3V0Ym91bmRNZXNzYWdlQ29udGV4dCByID0gbmV3IE91dGJvdW5kTWVzc2FnZUNvbnRleHQoKTsKKyAgICAgICAgci5nZXRIZWFkZXJzKCkuYWRkKEh0dHBIZWFkZXJzLkRBVEUsICJUdWUsIDI5IEphbiAyMDAyIDIyOjE0OjAyIC0wNTAwIik7CisgICAgICAgIFNpbXBsZURhdGVGb3JtYXQgZiA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJFLCBkZCBNTU0geXl5eSBISDptbTpzcyBaIiwgTG9jYWxlLkVOR0xJU0gpOworICAgICAgICBEYXRlIGRhdGUgPSBmLnBhcnNlKCJUdWUsIDI5IEphbiAyMDAyIDIyOjE0OjAyIC0wNTAwIik7CisgICAgICAgIGFzc2VydEVxdWFscyhyLmdldERhdGUoKSwgZGF0ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVhZGVyKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24geworICAgICAgICBPdXRib3VuZE1lc3NhZ2VDb250ZXh0IHIgPSBuZXcgT3V0Ym91bmRNZXNzYWdlQ29udGV4dCgpOworICAgICAgICByLmdldEhlYWRlcnMoKS5hZGQoSHR0cEhlYWRlcnMuQUNDRVBULCAiYXBwbGljYXRpb24veG1sLCB0ZXh0L3BsYWluIik7CisgICAgICAgIHIuZ2V0SGVhZGVycygpLmFkZChIdHRwSGVhZGVycy5BQ0NFUFQsICJhcHBsaWNhdGlvbi9qc29uIik7CisgICAgICAgIHIuZ2V0SGVhZGVycygpLmFkZCgiRk9PIiwgIiIpOworICAgICAgICBhc3NlcnRUcnVlKHIuZ2V0SGVhZGVyU3RyaW5nKEh0dHBIZWFkZXJzLkFDQ0VQVCkuY29udGFpbnMoImFwcGxpY2F0aW9uL3htbCIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5BQ0NFUFQpLmNvbnRhaW5zKCJ0ZXh0L3BsYWluIikpOworICAgICAgICBhc3NlcnRUcnVlKHIuZ2V0SGVhZGVyU3RyaW5nKEh0dHBIZWFkZXJzLkFDQ0VQVCkuY29udGFpbnMoImFwcGxpY2F0aW9uL2pzb24iKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhyLmdldEhlYWRlclN0cmluZygiRk9PIikubGVuZ3RoKCksIDApOworICAgICAgICBhc3NlcnROdWxsKHIuZ2V0SGVhZGVyU3RyaW5nKCJCQVIiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVhZGVyTWFwKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiwgUGFyc2VFeGNlcHRpb24geworICAgICAgICBPdXRib3VuZE1lc3NhZ2VDb250ZXh0IHIgPSBuZXcgT3V0Ym91bmRNZXNzYWdlQ29udGV4dCgpOworICAgICAgICByLmdldEhlYWRlcnMoKS5hZGQoSHR0cEhlYWRlcnMuQUNDRVBULCAiYXBwbGljYXRpb24veG1sLCB0ZXh0L3BsYWluIik7CisgICAgICAgIHIuZ2V0SGVhZGVycygpLmFkZChIdHRwSGVhZGVycy5BQ0NFUFQsICJhcHBsaWNhdGlvbi9qc29uIik7CisgICAgICAgIHIuZ2V0SGVhZGVycygpLmFkZCgiQWxsb3ciLCAiR0VULCBQVVQiKTsKKyAgICAgICAgci5nZXRIZWFkZXJzKCkuYWRkKCJBbGxvdyIsICJQT1NUIik7CisgICAgICAgIGFzc2VydFRydWUoci5nZXRIZWFkZXJzKCkuY29udGFpbnNLZXkoSHR0cEhlYWRlcnMuQUNDRVBUKSk7CisgICAgICAgIGFzc2VydFRydWUoci5nZXRIZWFkZXJzKCkuY29udGFpbnNLZXkoIkFsbG93IikpOworICAgICAgICBhc3NlcnRUcnVlKHIuZ2V0SGVhZGVycygpLmdldChIdHRwSGVhZGVycy5BQ0NFUFQpLmNvbnRhaW5zKCJhcHBsaWNhdGlvbi9qc29uIikpOworICAgICAgICBhc3NlcnRUcnVlKHIuZ2V0SGVhZGVycygpLmdldCgiQWxsb3ciKS5jb250YWlucygiUE9TVCIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBbGxvd2VkTWV0aG9kcygpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24geworICAgICAgICBPdXRib3VuZE1lc3NhZ2VDb250ZXh0IHIgPSBuZXcgT3V0Ym91bmRNZXNzYWdlQ29udGV4dCgpOworICAgICAgICByLmdldEhlYWRlcnMoKS5hZGQoIkFsbG93IiwgIkdFVCwgUFVUIik7CisgICAgICAgIHIuZ2V0SGVhZGVycygpLmFkZCgiQWxsb3ciLCAiUE9TVCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgci5nZXRBbGxvd2VkTWV0aG9kcygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydFRydWUoci5nZXRBbGxvd2VkTWV0aG9kcygpLmNvbnRhaW5zKCJHRVQiKSk7CisgICAgICAgIGFzc2VydFRydWUoci5nZXRBbGxvd2VkTWV0aG9kcygpLmNvbnRhaW5zKCJQVVQiKSk7CisgICAgICAgIGFzc2VydFRydWUoci5nZXRBbGxvd2VkTWV0aG9kcygpLmNvbnRhaW5zKCJQT1NUIikpOworICAgICAgICBhc3NlcnRGYWxzZShyLmdldEFsbG93ZWRNZXRob2RzKCkuY29udGFpbnMoIkRFTEVURSIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNwb25zZUNvb2tpZXMoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKKyAgICAgICAgT3V0Ym91bmRNZXNzYWdlQ29udGV4dCByID0gbmV3IE91dGJvdW5kTWVzc2FnZUNvbnRleHQoKTsKKyAgICAgICAgci5nZXRIZWFkZXJzKCkuYWRkKEh0dHBIZWFkZXJzLlNFVF9DT09LSUUsICJvcmVvPWNob2NvbGF0ZSIpOworICAgICAgICByLmdldEhlYWRlcnMoKS5hZGQoSHR0cEhlYWRlcnMuU0VUX0NPT0tJRSwgIm5pbGxhPXZhbmlsbGEiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHIuZ2V0UmVzcG9uc2VDb29raWVzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyLmdldFJlc3BvbnNlQ29va2llcygpLmNvbnRhaW5zS2V5KCJvcmVvIikpOworICAgICAgICBhc3NlcnRUcnVlKHIuZ2V0UmVzcG9uc2VDb29raWVzKCkuY29udGFpbnNLZXkoIm5pbGxhIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVudGl0eVRhZygpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24geworICAgICAgICBPdXRib3VuZE1lc3NhZ2VDb250ZXh0IHIgPSBuZXcgT3V0Ym91bmRNZXNzYWdlQ29udGV4dCgpOworICAgICAgICByLmdldEhlYWRlcnMoKS5hZGQoSHR0cEhlYWRlcnMuRVRBRywgIlwidGFnXCIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEVudGl0eVRhZy52YWx1ZU9mKCJcInRhZ1wiIiksIHIuZ2V0RW50aXR5VGFnKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExhc3RNb2RpZmllZCgpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24sIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgT3V0Ym91bmRNZXNzYWdlQ29udGV4dCByID0gbmV3IE91dGJvdW5kTWVzc2FnZUNvbnRleHQoKTsKKyAgICAgICAgci5nZXRIZWFkZXJzKCkuYWRkKEh0dHBIZWFkZXJzLkxBU1RfTU9ESUZJRUQsICJUdWUsIDI5IEphbiAyMDAyIDIyOjE0OjAyIC0wNTAwIik7CisgICAgICAgIFNpbXBsZURhdGVGb3JtYXQgZiA9IG5ldyBTaW1wbGVEYXRlRm9ybWF0KCJFLCBkZCBNTU0geXl5eSBISDptbTpzcyBaIiwgTG9jYWxlLkVOR0xJU0gpOworICAgICAgICBEYXRlIGRhdGUgPSBmLnBhcnNlKCJUdWUsIDI5IEphbiAyMDAyIDIyOjE0OjAyIC0wNTAwIik7CisgICAgICAgIGFzc2VydEVxdWFscyhkYXRlLCByLmdldExhc3RNb2RpZmllZCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NhdGlvbigpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24geworICAgICAgICBPdXRib3VuZE1lc3NhZ2VDb250ZXh0IHIgPSBuZXcgT3V0Ym91bmRNZXNzYWdlQ29udGV4dCgpOworICAgICAgICByLmdldEhlYWRlcnMoKS5hZGQoSHR0cEhlYWRlcnMuTE9DQVRJT04sICJodHRwOi8vZXhhbXBsZS5vcmcvYXBwIik7CisgICAgICAgIGFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vZXhhbXBsZS5vcmcvYXBwIiksIHIuZ2V0TG9jYXRpb24oKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TGlua3MoKSB7CisgICAgICAgIE91dGJvdW5kTWVzc2FnZUNvbnRleHQgciA9IG5ldyBPdXRib3VuZE1lc3NhZ2VDb250ZXh0KCk7CisgICAgICAgIExpbmsgbGluazEgPSBMaW5rLmZyb21VcmkoImh0dHA6Ly9leGFtcGxlLm9yZy9hcHAvbGluazEiKS5wYXJhbSgicHJvZHVjZXMiLCAiYXBwbGljYXRpb24vanNvbiIpLnBhcmFtKCJtZXRob2QiLCAiR0VUIikucmVsKCJzZWxmIikuYnVpbGQoKTsKKyAgICAgICAgTGluayBsaW5rMiA9IExpbmsuZnJvbVVyaSgiaHR0cDovL2V4YW1wbGUub3JnL2FwcC9saW5rMiIpLnBhcmFtKCJwcm9kdWNlcyIsICJhcHBsaWNhdGlvbi94bWwiKS5wYXJhbSgibWV0aG9kIiwgIlBVVCIpLnJlbCgic2VsZiIpLmJ1aWxkKCk7CisgICAgICAgIHIuZ2V0SGVhZGVycygpLmFkZCgiTGluayIsIGxpbmsxLnRvU3RyaW5nKCkpOworICAgICAgICByLmdldEhlYWRlcnMoKS5hZGQoIkxpbmsiLCBsaW5rMi50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHIuZ2V0TGlua3MoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKHIuZ2V0TGlua3MoKS5jb250YWlucyhsaW5rMSkpOworICAgICAgICBhc3NlcnRUcnVlKHIuZ2V0TGlua3MoKS5jb250YWlucyhsaW5rMikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldExpbmsoKSB7CisgICAgICAgIE91dGJvdW5kTWVzc2FnZUNvbnRleHQgciA9IG5ldyBPdXRib3VuZE1lc3NhZ2VDb250ZXh0KCk7CisgICAgICAgIExpbmsgbGluazEgPSBMaW5rLmZyb21VcmkoImh0dHA6Ly9leGFtcGxlLm9yZy9hcHAvbGluazEiKS5wYXJhbSgicHJvZHVjZXMiLCAiYXBwbGljYXRpb24vanNvbiIpLnBhcmFtKCJtZXRob2QiLCAiR0VUIikucmVsKCJzZWxmIikuYnVpbGQoKTsKKyAgICAgICAgTGluayBsaW5rMiA9IExpbmsuZnJvbVVyaSgiaHR0cDovL2V4YW1wbGUub3JnL2FwcC9saW5rMiIpLnBhcmFtKCJwcm9kdWNlcyIsICJhcHBsaWNhdGlvbi94bWwiKS5wYXJhbSgibWV0aG9kIiwgIlBVVCIpLnJlbCgidXBkYXRlIikuYnVpbGQoKTsKKyAgICAgICAgTGluayBsaW5rMyA9IExpbmsuZnJvbVVyaSgiaHR0cDovL2V4YW1wbGUub3JnL2FwcC9saW5rMiIpLnBhcmFtKCJwcm9kdWNlcyIsICJhcHBsaWNhdGlvbi94bWwiKS5wYXJhbSgibWV0aG9kIiwgIlBPU1QiKS5yZWwoInVwZGF0ZSIpLmJ1aWxkKCk7CisgICAgICAgIHIuZ2V0SGVhZGVycygpLmFkZCgiTGluayIsIGxpbmsxLnRvU3RyaW5nKCkpOworICAgICAgICByLmdldEhlYWRlcnMoKS5hZGQoIkxpbmsiLCBsaW5rMi50b1N0cmluZygpKTsKKyAgICAgICAgci5nZXRIZWFkZXJzKCkuYWRkKCJMaW5rIiwgbGluazMudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydFRydWUoci5nZXRMaW5rKCJzZWxmIikuZXF1YWxzKGxpbmsxKSk7CisgICAgICAgIGFzc2VydFRydWUoci5nZXRMaW5rKCJ1cGRhdGUiKS5lcXVhbHMobGluazIpIHx8IHIuZ2V0TGluaygidXBkYXRlIikuZXF1YWxzKGxpbmszKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TGVuZ3RoKCkgeworICAgICAgICBPdXRib3VuZE1lc3NhZ2VDb250ZXh0IHIgPSBuZXcgT3V0Ym91bmRNZXNzYWdlQ29udGV4dCgpOworICAgICAgICByLmdldEhlYWRlcnMoKS5hZGQoIkNvbnRlbnQtTGVuZ3RoIiwgNTApOworICAgICAgICBhc3NlcnRFcXVhbHMoNTAsIHIuZ2V0TGVuZ3RoTG9uZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRMZW5ndGhfdG9vTG9uZ0ZvckludCgpIHsKKyAgICAgICAgT3V0Ym91bmRNZXNzYWdlQ29udGV4dCByID0gbmV3IE91dGJvdW5kTWVzc2FnZUNvbnRleHQoKTsKKyAgICAgICAgbG9uZyBsZW5ndGggPSBJbnRlZ2VyLk1BWF9WQUxVRSArIDVMOworICAgICAgICByLmdldEhlYWRlcnMoKS5hZGQoIkNvbnRlbnQtTGVuZ3RoIiwgbGVuZ3RoKTsKKworCisgICAgICAgIGFzc2VydEVxdWFscyhsZW5ndGgsIHIuZ2V0TGVuZ3RoTG9uZygpKTsKKworICAgICAgICAvLyB2YWx1ZSBpcyBub3QgYSB2YWxpZCBpbnRlZ2VyIC0+IFByb2Nlc3NpbmdFeGNlcHRpb24gaXMgdGhyb3duLgorICAgICAgICB0cnkgeworICAgICAgICAgICAgci5nZXRMZW5ndGgoKTsKKyAgICAgICAgfSBjYXRjaCAoUHJvY2Vzc2luZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmYWlsKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9tZXNzYWdlL2ludGVybmFsL1F1YWxpdHlTb3VyY2VNZWRpYVR5cGVUZXN0LmphdmEgYi90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL21lc3NhZ2UvaW50ZXJuYWwvUXVhbGl0eVNvdXJjZU1lZGlhVHlwZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDliYzZjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9tZXNzYWdlL2ludGVybmFsL1F1YWxpdHlTb3VyY2VNZWRpYVR5cGVUZXN0LmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uLm1lc3NhZ2UuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLlF1YWxpdHlTb3VyY2VNZWRpYVR5cGU7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworCisvKioKKyAqIFF1YWxpdHkgc291cmNlIG1lZGlhIHR5cGUgdW5pdCB0ZXN0cy4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGNsYXNzIFF1YWxpdHlTb3VyY2VNZWRpYVR5cGVUZXN0IHsKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzCisgICAgLy8gZXhwZWN0ZWQgcmVzdWx0LCBtZWRpYSB0eXBlLCBxdWFsaXR5IHNvdXJjZSBtZWRpYSB0eXBlCisgICAgcHVibGljIHN0YXRpYyBMaXN0PE9iamVjdFtdPiB0ZXN0QmVkcygpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW117CisgICAgICAgICAgICAgICAge0Jvb2xlYW4uVFJVRSwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSwgbmV3IFF1YWxpdHlTb3VyY2VNZWRpYVR5cGUoImFwcGxpY2F0aW9uIiwgImpzb24iKX0sCisgICAgICAgICAgICAgICAge0Jvb2xlYW4uVFJVRSwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSwgbmV3IFF1YWxpdHlTb3VyY2VNZWRpYVR5cGUoImFwcGxpY2F0aW9uIiwgImpzb24iLCAxMDAwLCBudWxsKX0sCisgICAgICAgICAgICAgICAge0Jvb2xlYW4uRkFMU0UsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUsIG5ldyBRdWFsaXR5U291cmNlTWVkaWFUeXBlKCJhcHBsaWNhdGlvbiIsICJqc29uIiwgNTAwLCBudWxsKX0sCisgICAgICAgICAgICAgICAge0Jvb2xlYW4uRkFMU0UsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUsIG5ldyBRdWFsaXR5U291cmNlTWVkaWFUeXBlKCJhcHBsaWNhdGlvbiIsICJ4bWwiKX0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGV4cGVjdEVxdWFsaXR5OworICAgIHByaXZhdGUgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZTsKKyAgICBwcml2YXRlIGZpbmFsIFF1YWxpdHlTb3VyY2VNZWRpYVR5cGUgcXNNZWRpYVR5cGU7CisKKyAgICBwdWJsaWMgUXVhbGl0eVNvdXJjZU1lZGlhVHlwZVRlc3QoYm9vbGVhbiBleHBlY3RFcXVhbGl0eSwgTWVkaWFUeXBlIG1lZGlhVHlwZSwgUXVhbGl0eVNvdXJjZU1lZGlhVHlwZSBxc01lZGlhVHlwZSkgeworICAgICAgICB0aGlzLmV4cGVjdEVxdWFsaXR5ID0gZXhwZWN0RXF1YWxpdHk7CisgICAgICAgIHRoaXMubWVkaWFUeXBlID0gbWVkaWFUeXBlOworICAgICAgICB0aGlzLnFzTWVkaWFUeXBlID0gcXNNZWRpYVR5cGU7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChleHBlY3RFcXVhbGl0eSkgeworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiVHlwZXMgbm90IGVxdWFsLiIsIG1lZGlhVHlwZSwgcXNNZWRpYVR5cGUpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiVHlwZXMgbm90IGVxdWFsLiIsIHFzTWVkaWFUeXBlLCBtZWRpYVR5cGUpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiSGFzaCBjb2RlcyBub3QgZXF1YWwgZm9yICVzIGFuZCAlcy4iLCBtZWRpYVR5cGUudG9TdHJpbmcoKSwgcXNNZWRpYVR5cGUudG9TdHJpbmcoKSksCisgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZS5oYXNoQ29kZSgpLCBxc01lZGlhVHlwZS5oYXNoQ29kZSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShTdHJpbmcuZm9ybWF0KCJGYWxzZSBlcXVhbGl0eSBvZiAlcyBhbmQgJXMiLCBtZWRpYVR5cGUudG9TdHJpbmcoKSwgcXNNZWRpYVR5cGUudG9TdHJpbmcoKSksCisgICAgICAgICAgICAgICAgICAgIHFzTWVkaWFUeXBlLmVxdWFscyhtZWRpYVR5cGUpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vbW9kZWwvaW50ZXJuYWwvQ29tbW9uQ29uZmlnVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9tb2RlbC9pbnRlcm5hbC9Db21tb25Db25maWdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk2ZjI4YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vbW9kZWwvaW50ZXJuYWwvQ29tbW9uQ29uZmlnVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTAwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uLm1vZGVsLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcmlvcml0aWVzOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5FeGNlcHRpb25NYXBwZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJlYWRlckludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SZWFkZXJJbnRlcmNlcHRvckNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvckNvbnRleHQ7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5OworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuaGsyLkhrMkluamVjdGlvbk1hbmFnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5BYnN0cmFjdEJpbmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuUHJvdmlkZXJCaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LlByb3ZpZGVyczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb2RlbC5Db250cmFjdFByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1vZGVsLmludGVybmFsLkNvbW1vbkNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb2RlbC5pbnRlcm5hbC5Db21wb25lbnRCYWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW9kZWwuaW50ZXJuYWwuTWFuYWdlZE9iamVjdHNGaW5hbGl6ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW9kZWwuaW50ZXJuYWwuUmFua2VkQ29tcGFyYXRvcjsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3N1bWU7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0U2FtZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiBUZXN0IGNhc2VzIGZvciB7QGxpbmsgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9ufS4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIENvbW1vbkNvbmZpZ1Rlc3QgeworCisgICAgcHJpdmF0ZSBDb21tb25Db25maWcgY29uZmlnOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmZpZyA9IG5ldyBDb21tb25Db25maWcobnVsbCwgQ29tcG9uZW50QmFnLklOQ0xVREVfQUxMKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRQcm9wZXJ0aWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb25maWcuZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnRpZXMoKS5wdXQoImZvbyIsICJiYXIiKTsKKyAgICAgICAgICAgIGZhaWwoIlJldHVybmVkIHByb3BlcnRpZXMgY29sbGVjdGlvbiBzaG91bGQgYmUgaW1tdXRhYmxlLiIpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gT0suCisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRQcm9wZXJ0aWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmZpZyA9IGNvbmZpZy5wcm9wZXJ0eSgiZm9vIiwgImJhciIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImJhciIsIGNvbmZpZy5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UHJvcGVydHkoImZvbyIpKTsKKworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IHByb3BlcnRpZXMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIHByb3BlcnRpZXMucHV0KCJoZWxsbyIsICJ3b3JsZCIpOworICAgICAgICBjb25maWcgPSBjb25maWcuc2V0UHJvcGVydGllcyhwcm9wZXJ0aWVzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY29uZmlnLmdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3b3JsZCIsIGNvbmZpZy5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UHJvcGVydHkoImhlbGxvIikpOworCisgICAgICAgIHByb3BlcnRpZXMucHV0KCJvbmUiLCAidHdvIik7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjb25maWcuZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnRpZXMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnROdWxsKGNvbmZpZy5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UHJvcGVydHkoIm9uZSIpKTsKKworICAgICAgICBjb25maWcgPSBjb25maWcuc2V0UHJvcGVydGllcyhuZXcgSGFzaE1hcDw+KCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvbmZpZy5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UHJvcGVydGllcygpLmlzRW1wdHkoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0R2V0UHJvcGVydHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgY29uZmlnID0gY29uZmlnLnByb3BlcnR5KCJmb28iLCAiYmFyIik7CisgICAgICAgIGFzc2VydEVxdWFscygiYmFyIiwgY29uZmlnLmdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0eSgiZm9vIikpOworCisgICAgICAgIGNvbmZpZy5wcm9wZXJ0eSgiaGVsbG8iLCAid29ybGQiKTsKKyAgICAgICAgY29uZmlnLnByb3BlcnR5KCJmb28iLCBudWxsKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgY29uZmlnLmdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0eSgiZm9vIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY29uZmlnLmdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0aWVzKCkuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEVtcHR5RmVhdHVyZSBpbXBsZW1lbnRzIEZlYXR1cmUgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmUoZmluYWwgRmVhdHVyZUNvbnRleHQgY29uZmlndXJhdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFVuY29uZmlndXJhYmxlRmVhdHVyZSBpbXBsZW1lbnRzIEZlYXR1cmUgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmUoZmluYWwgRmVhdHVyZUNvbnRleHQgY29uZmlndXJhdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb21wbGV4RW1wdHlQcm92aWRlciBpbXBsZW1lbnRzIFJlYWRlckludGVyY2VwdG9yLCBDb250YWluZXJSZXF1ZXN0RmlsdGVyLCBFeGNlcHRpb25NYXBwZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoZmluYWwgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAvLyBEbyBub3RoaW5nLgorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPYmplY3QgYXJvdW5kUmVhZEZyb20oZmluYWwgUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQucHJvY2VlZCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSB0b1Jlc3BvbnNlKGZpbmFsIFRocm93YWJsZSBleGNlcHRpb24pIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb21wbGV4RW1wdHlQcm92aWRlckZlYXR1cmUgZXh0ZW5kcyBDb21wbGV4RW1wdHlQcm92aWRlciBpbXBsZW1lbnRzIEZlYXR1cmUgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmUoZmluYWwgRmVhdHVyZUNvbnRleHQgY29uZmlndXJhdGlvbikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlV2l0aCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBjb25maWcucHJvcGVydHkoImZvbyIsICJiYXIiKTsKKyAgICAgICAgZmluYWwgRW1wdHlGZWF0dXJlIGVtcHR5RmVhdHVyZSA9IG5ldyBFbXB0eUZlYXR1cmUoKTsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKGVtcHR5RmVhdHVyZSk7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihDb21wbGV4RW1wdHlQcm92aWRlci5jbGFzcywgRXhjZXB0aW9uTWFwcGVyLmNsYXNzKTsKKworICAgICAgICBmaW5hbCBDb21tb25Db25maWcgb3RoZXIgPSBuZXcgQ29tbW9uQ29uZmlnKG51bGwsIENvbXBvbmVudEJhZy5JTkNMVURFX0FMTCk7CisgICAgICAgIG90aGVyLnByb3BlcnR5KCJmb28iLCAiYmF6Iik7CisgICAgICAgIG90aGVyLnJlZ2lzdGVyKFVuY29uZmlndXJhYmxlRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIG90aGVyLnJlZ2lzdGVyKENvbXBsZXhFbXB0eVByb3ZpZGVyLmNsYXNzLCBSZWFkZXJJbnRlcmNlcHRvci5jbGFzcywgQ29udGFpbmVyUmVxdWVzdEZpbHRlci5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYXoiLCBvdGhlci5nZXRQcm9wZXJ0eSgiZm9vIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgb3RoZXIuZ2V0UHJvcGVydGllcygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBvdGhlci5nZXRDbGFzc2VzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG90aGVyLmdldEluc3RhbmNlcygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBvdGhlci5nZXRDb250cmFjdHMoQ29tcGxleEVtcHR5UHJvdmlkZXIuY2xhc3MpLnNpemUoKSk7CisgICAgICAgIGFzc2VydFRydWUob3RoZXIuZ2V0Q29udHJhY3RzKENvbXBsZXhFbXB0eVByb3ZpZGVyLmNsYXNzKS5jb250YWluc0tleShSZWFkZXJJbnRlcmNlcHRvci5jbGFzcykpOworICAgICAgICBhc3NlcnRUcnVlKG90aGVyLmdldENvbnRyYWN0cyhDb21wbGV4RW1wdHlQcm92aWRlci5jbGFzcykuY29udGFpbnNLZXkoQ29udGFpbmVyUmVxdWVzdEZpbHRlci5jbGFzcykpOworCisgICAgICAgIG90aGVyLmxvYWRGcm9tKGNvbmZpZyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYXIiLCBvdGhlci5nZXRQcm9wZXJ0eSgiZm9vIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgb3RoZXIuZ2V0UHJvcGVydGllcygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBvdGhlci5nZXRDbGFzc2VzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG90aGVyLmdldEluc3RhbmNlcygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBvdGhlci5nZXRDb250cmFjdHMoQ29tcGxleEVtcHR5UHJvdmlkZXIuY2xhc3MpLnNpemUoKSk7CisgICAgICAgIGFzc2VydFNhbWUoRXhjZXB0aW9uTWFwcGVyLmNsYXNzLCBvdGhlci5nZXRDb250cmFjdHMoQ29tcGxleEVtcHR5UHJvdmlkZXIuY2xhc3MpLmtleVNldCgpLml0ZXJhdG9yKCkubmV4dCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRGZWF0dXJlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBFbXB0eUZlYXR1cmUgZW1wdHlGZWF0dXJlID0gbmV3IEVtcHR5RmVhdHVyZSgpOworICAgICAgICBmaW5hbCBVbmNvbmZpZ3VyYWJsZUZlYXR1cmUgdW5jb25maWd1cmFibGVGZWF0dXJlID0gbmV3IFVuY29uZmlndXJhYmxlRmVhdHVyZSgpOworICAgICAgICBmaW5hbCBDb21wbGV4RW1wdHlQcm92aWRlckZlYXR1cmUgcHJvdmlkZXJGZWF0dXJlID0gbmV3IENvbXBsZXhFbXB0eVByb3ZpZGVyRmVhdHVyZSgpOworCisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihlbXB0eUZlYXR1cmUpOworICAgICAgICBjb25maWcucmVnaXN0ZXIodW5jb25maWd1cmFibGVGZWF0dXJlKTsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKHByb3ZpZGVyRmVhdHVyZSwgUmVhZGVySW50ZXJjZXB0b3IuY2xhc3MpOworCisgICAgICAgIGFzc2VydEZhbHNlKGNvbmZpZy5nZXRDb25maWd1cmF0aW9uKCkuaXNFbmFibGVkKGVtcHR5RmVhdHVyZSkpOworICAgICAgICBhc3NlcnRGYWxzZShjb25maWcuZ2V0Q29uZmlndXJhdGlvbigpLmlzRW5hYmxlZCh1bmNvbmZpZ3VyYWJsZUZlYXR1cmUpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY29uZmlnLmdldENvbmZpZ3VyYXRpb24oKS5pc0VuYWJsZWQocHJvdmlkZXJGZWF0dXJlKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWcuZ2V0Q29uZmlndXJhdGlvbigpLmlzUmVnaXN0ZXJlZChlbXB0eUZlYXR1cmUpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWcuZ2V0Q29uZmlndXJhdGlvbigpLmlzUmVnaXN0ZXJlZCh1bmNvbmZpZ3VyYWJsZUZlYXR1cmUpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWcuZ2V0Q29uZmlndXJhdGlvbigpLmlzUmVnaXN0ZXJlZChwcm92aWRlckZlYXR1cmUpKTsKKyAgICB9CisKKworICAgIEBUZXN0CisgICAgLy8gUmVncmVzc2lvbiB0ZXN0IGZvciBKRVJTRVktMTYzOC4KKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Tm9uRXhpc3RlbnRQcm92aWRlckNvbnRyYWN0c0FTRW1wdHlNYXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWcuZ2V0Q29uZmlndXJhdGlvbigpLmdldENvbnRyYWN0cyhDb21tb25Db25maWdUZXN0LmNsYXNzKS5pc0VtcHR5KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIHZvaWQgdGVzdEdldENsYXNzZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RDb2xsZWN0aW9uc0NvbW1vbigiR2V0UHJvdmlkZXJDbGFzc2VzIiwgY29uZmlnLmdldENsYXNzZXMoKSwgRW1wdHlGZWF0dXJlLmNsYXNzKTsKKworICAgICAgICBjb25maWcucmVnaXN0ZXIoQ29tcGxleEVtcHR5UHJvdmlkZXJGZWF0dXJlLmNsYXNzLAorICAgICAgICAgICAgICAgIFdyaXRlckludGVyY2VwdG9yLmNsYXNzLCBSZWFkZXJJbnRlcmNlcHRvci5jbGFzcywgQ29udGFpbmVyUmVxdWVzdEZpbHRlci5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjb25maWcuZ2V0Q2xhc3NlcygpLnNpemUoKSk7CisKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKEVtcHR5RmVhdHVyZS5jbGFzcyk7CisKKyAgICAgICAgZmluYWwgU2V0PENsYXNzPD8+PiBwcm92aWRlckNsYXNzZXMgPSBjb25maWcuZ2V0Q2xhc3NlcygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcHJvdmlkZXJDbGFzc2VzLnNpemUoKSk7CisgICAgICAgIGFzc2VydFRydWUocHJvdmlkZXJDbGFzc2VzLmNvbnRhaW5zKENvbXBsZXhFbXB0eVByb3ZpZGVyRmVhdHVyZS5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIHZvaWQgdGVzdEdldEluc3RhbmNlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdENvbGxlY3Rpb25zQ29tbW9uKCJHZXRQcm92aWRlckluc3RhbmNlcyIsIGNvbmZpZy5nZXRJbnN0YW5jZXMoKSwgbmV3IEVtcHR5RmVhdHVyZSgpKTsKKworICAgICAgICBmaW5hbCBDb21wbGV4RW1wdHlQcm92aWRlckZlYXR1cmUgcHJvdmlkZXJGZWF0dXJlMSA9IG5ldyBDb21wbGV4RW1wdHlQcm92aWRlckZlYXR1cmUoKTsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKHByb3ZpZGVyRmVhdHVyZTEsIFdyaXRlckludGVyY2VwdG9yLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNvbmZpZy5nZXRJbnN0YW5jZXMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvbmZpZy5nZXRJbnN0YW5jZXMoKS5jb250YWlucyhwcm92aWRlckZlYXR1cmUxKSk7CisKKyAgICAgICAgZmluYWwgRW1wdHlGZWF0dXJlIGVtcHR5RmVhdHVyZSA9IG5ldyBFbXB0eUZlYXR1cmUoKTsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKGVtcHR5RmVhdHVyZSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBjb25maWcuZ2V0SW5zdGFuY2VzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWcuZ2V0SW5zdGFuY2VzKCkuY29udGFpbnMoZW1wdHlGZWF0dXJlKSk7CisKKyAgICAgICAgZmluYWwgQ29tcGxleEVtcHR5UHJvdmlkZXJGZWF0dXJlIHByb3ZpZGVyRmVhdHVyZTIgPSBuZXcgQ29tcGxleEVtcHR5UHJvdmlkZXJGZWF0dXJlKCk7CisgICAgICAgIGNvbmZpZy5yZWdpc3Rlcihwcm92aWRlckZlYXR1cmUyLCBSZWFkZXJJbnRlcmNlcHRvci5jbGFzcywgQ29udGFpbmVyUmVxdWVzdEZpbHRlci5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBjb25maWcuZ2V0SW5zdGFuY2VzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY29uZmlnLmdldEluc3RhbmNlcygpLmNvbnRhaW5zKHByb3ZpZGVyRmVhdHVyZTIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWdpc3RlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBDbGFzcyBjbGF6eiA9IG51bGw7CisgICAgICAgICAgICAvL25vaW5zcGVjdGlvbiBDb25zdGFudENvbmRpdGlvbnMKKyAgICAgICAgICAgIGNvbmZpZy5yZWdpc3RlcihjbGF6eik7CisgICAgICAgICAgICBmYWlsKCJDYW5ub3QgcmVnaXN0ZXIgbnVsbC4iKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIE9LLgorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgICAgIGNvbmZpZy5yZWdpc3RlcihDb21wbGV4RW1wdHlQcm92aWRlci5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBDb250cmFjdFByb3ZpZGVyIGNvbnRyYWN0UHJvdmlkZXIgPQorICAgICAgICAgICAgICAgIGNvbmZpZy5nZXRDb21wb25lbnRCYWcoKS5nZXRNb2RlbChDb21wbGV4RW1wdHlQcm92aWRlci5jbGFzcyk7CisgICAgICAgIGZpbmFsIFNldDxDbGFzczw/Pj4gY29udHJhY3RzID0gY29udHJhY3RQcm92aWRlci5nZXRDb250cmFjdHMoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMywgY29udHJhY3RzLnNpemUoKSk7CisgICAgICAgIGFzc2VydFRydWUoY29udHJhY3RzLmNvbnRhaW5zKFJlYWRlckludGVyY2VwdG9yLmNsYXNzKSk7CisgICAgICAgIGFzc2VydFRydWUoY29udHJhY3RzLmNvbnRhaW5zKENvbnRhaW5lclJlcXVlc3RGaWx0ZXIuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb250cmFjdHMuY29udGFpbnMoRXhjZXB0aW9uTWFwcGVyLmNsYXNzKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWcuaXNSZWdpc3RlcmVkKENvbXBsZXhFbXB0eVByb3ZpZGVyLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVnaXN0ZXJJbnN0YW5jZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29uZmlnLnJlZ2lzdGVyKG51bGwpOworICAgICAgICAgICAgZmFpbCgiQ2Fubm90IHJlZ2lzdGVyIG51bGwuIik7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBPSy4KKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIENvbXBsZXhFbXB0eVByb3ZpZGVyW10gY2VwcyA9IG5ldyBDb21wbGV4RW1wdHlQcm92aWRlclsyXTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspIHsKKyAgICAgICAgICAgIGNlcHNbaV0gPSBuZXcgQ29tcGxleEVtcHR5UHJvdmlkZXIoKTsKKyAgICAgICAgICAgIGNvbmZpZy5yZWdpc3RlcihjZXBzW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIENvbnRyYWN0UHJvdmlkZXIgY29udHJhY3RQcm92aWRlciA9CisgICAgICAgICAgICAgICAgY29uZmlnLmdldENvbXBvbmVudEJhZygpLmdldE1vZGVsKENvbXBsZXhFbXB0eVByb3ZpZGVyLmNsYXNzKTsKKyAgICAgICAgZmluYWwgU2V0PENsYXNzPD8+PiBjb250cmFjdHMgPSBjb250cmFjdFByb3ZpZGVyLmdldENvbnRyYWN0cygpOworCisgICAgICAgIGFzc2VydEVxdWFscygzLCBjb250cmFjdHMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb250cmFjdHMuY29udGFpbnMoUmVhZGVySW50ZXJjZXB0b3IuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb250cmFjdHMuY29udGFpbnMoQ29udGFpbmVyUmVxdWVzdEZpbHRlci5jbGFzcykpOworICAgICAgICBhc3NlcnRUcnVlKGNvbnRyYWN0cy5jb250YWlucyhFeGNlcHRpb25NYXBwZXIuY2xhc3MpKTsKKworICAgICAgICBhc3NlcnRUcnVlKGNvbmZpZy5pc1JlZ2lzdGVyZWQoQ29tcGxleEVtcHR5UHJvdmlkZXIuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWcuaXNSZWdpc3RlcmVkKGNlcHNbMF0pKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY29uZmlnLmlzUmVnaXN0ZXJlZChjZXBzWzFdKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVnaXN0ZXJDbGFzc0luc3RhbmNlQ2xhc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ29tcGxleEVtcHR5UHJvdmlkZXIgY29tcGxleEVtcHR5UHJvdmlkZXIgPSBuZXcgQ29tcGxleEVtcHR5UHJvdmlkZXIoKTsKKworICAgICAgICBjb25maWcucmVnaXN0ZXIoQ29tcGxleEVtcHR5UHJvdmlkZXIuY2xhc3MpOworICAgICAgICBjb25maWcucmVnaXN0ZXIoY29tcGxleEVtcHR5UHJvdmlkZXIpOworICAgICAgICBjb25maWcucmVnaXN0ZXIoQ29tcGxleEVtcHR5UHJvdmlkZXIuY2xhc3MpOworCisgICAgICAgIGFzc2VydFRydWUoY29uZmlnLmdldENsYXNzZXMoKS5jb250YWlucyhDb21wbGV4RW1wdHlQcm92aWRlci5jbGFzcykpOworICAgICAgICBhc3NlcnRGYWxzZShjb25maWcuZ2V0SW5zdGFuY2VzKCkuY29udGFpbnMoY29tcGxleEVtcHR5UHJvdmlkZXIpKTsKKworICAgICAgICBmaW5hbCBDb250cmFjdFByb3ZpZGVyIGNvbnRyYWN0UHJvdmlkZXIgPQorICAgICAgICAgICAgICAgIGNvbmZpZy5nZXRDb21wb25lbnRCYWcoKS5nZXRNb2RlbChDb21wbGV4RW1wdHlQcm92aWRlci5jbGFzcyk7CisgICAgICAgIGZpbmFsIFNldDxDbGFzczw/Pj4gY29udHJhY3RzID0gY29udHJhY3RQcm92aWRlci5nZXRDb250cmFjdHMoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMywgY29udHJhY3RzLnNpemUoKSk7CisgICAgICAgIGFzc2VydFRydWUoY29udHJhY3RzLmNvbnRhaW5zKFJlYWRlckludGVyY2VwdG9yLmNsYXNzKSk7CisgICAgICAgIGFzc2VydFRydWUoY29udHJhY3RzLmNvbnRhaW5zKENvbnRhaW5lclJlcXVlc3RGaWx0ZXIuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb250cmFjdHMuY29udGFpbnMoRXhjZXB0aW9uTWFwcGVyLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVnaXN0ZXJDbGFzc0JpbmdpbmdQcmlvcml0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgQ2xhc3MgY2xhenogPSBudWxsOworICAgICAgICAgICAgLy9ub2luc3BlY3Rpb24gQ29uc3RhbnRDb25kaXRpb25zCisgICAgICAgICAgICBjb25maWcucmVnaXN0ZXIoY2xhenosIFByaW9yaXRpZXMuVVNFUik7CisgICAgICAgICAgICBmYWlsKCJDYW5ub3QgcmVnaXN0ZXIgbnVsbC4iKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIE9LLgorICAgICAgICB9CisKKyAgICAgICAgZm9yIChmaW5hbCBpbnQgcHJpb3JpdHkgOiBuZXcgaW50W117UHJpb3JpdGllcy5VU0VSLCBQcmlvcml0aWVzLkFVVEhFTlRJQ0FUSU9OfSkgeworICAgICAgICAgICAgY29uZmlnLnJlZ2lzdGVyKENvbXBsZXhFbXB0eVByb3ZpZGVyLmNsYXNzLCBwcmlvcml0eSk7CisKKyAgICAgICAgICAgIGZpbmFsIENvbnRyYWN0UHJvdmlkZXIgY29udHJhY3RQcm92aWRlciA9CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5nZXRDb21wb25lbnRCYWcoKS5nZXRNb2RlbChDb21wbGV4RW1wdHlQcm92aWRlci5jbGFzcyk7CisgICAgICAgICAgICBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IGNvbnRyYWN0cyA9IGNvbnRyYWN0UHJvdmlkZXIuZ2V0Q29udHJhY3RzKCk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzLCBjb250cmFjdHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoY29udHJhY3RzLmNvbnRhaW5zKFJlYWRlckludGVyY2VwdG9yLmNsYXNzKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGNvbnRyYWN0cy5jb250YWlucyhDb250YWluZXJSZXF1ZXN0RmlsdGVyLmNsYXNzKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGNvbnRyYWN0cy5jb250YWlucyhFeGNlcHRpb25NYXBwZXIuY2xhc3MpKTsKKworICAgICAgICAgICAgLy8gQWxsIHByaW9yaXRpZXMgYXJlIHRoZSBzYW1lLgorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFByaW9yaXRpZXMuVVNFUiwgY29udHJhY3RQcm92aWRlci5nZXRQcmlvcml0eShSZWFkZXJJbnRlcmNlcHRvci5jbGFzcykpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFByaW9yaXRpZXMuVVNFUiwgY29udHJhY3RQcm92aWRlci5nZXRQcmlvcml0eShDb250YWluZXJSZXF1ZXN0RmlsdGVyLmNsYXNzKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoUHJpb3JpdGllcy5VU0VSLCBjb250cmFjdFByb3ZpZGVyLmdldFByaW9yaXR5KEV4Y2VwdGlvbk1hcHBlci5jbGFzcykpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVnaXN0ZXJJbnN0YW5jZUJpbmdpbmdQcmlvcml0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29uZmlnLnJlZ2lzdGVyKG51bGwsIFByaW9yaXRpZXMuVVNFUik7CisgICAgICAgICAgICBmYWlsKCJDYW5ub3QgcmVnaXN0ZXIgbnVsbC4iKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIE9LLgorICAgICAgICB9CisKKyAgICAgICAgZmluYWwgQ2xhc3M8Q29tcGxleEVtcHR5UHJvdmlkZXI+IHByb3ZpZGVyQ2xhc3MgPSBDb21wbGV4RW1wdHlQcm92aWRlci5jbGFzczsKKworICAgICAgICBmb3IgKGZpbmFsIGludCBwcmlvcml0eSA6IG5ldyBpbnRbXXtQcmlvcml0aWVzLlVTRVIsIFByaW9yaXRpZXMuQVVUSEVOVElDQVRJT059KSB7CisgICAgICAgICAgICBjb25maWcucmVnaXN0ZXIocHJvdmlkZXJDbGFzcywgcHJpb3JpdHkpOworCisgICAgICAgICAgICBmaW5hbCBDb21tb25Db25maWcgY29tbW9uQ29uZmlnID0gY29uZmlnOworICAgICAgICAgICAgZmluYWwgQ29udHJhY3RQcm92aWRlciBjb250cmFjdFByb3ZpZGVyID0KKyAgICAgICAgICAgICAgICAgICAgY29tbW9uQ29uZmlnLmdldENvbXBvbmVudEJhZygpLmdldE1vZGVsKHByb3ZpZGVyQ2xhc3MpOworICAgICAgICAgICAgZmluYWwgU2V0PENsYXNzPD8+PiBjb250cmFjdHMgPSBjb250cmFjdFByb3ZpZGVyLmdldENvbnRyYWN0cygpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMywgY29udHJhY3RzLnNpemUoKSk7IC8vIEZlYXR1cmUgaXMgbm90IHRoZXJlLgorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb250cmFjdHMuY29udGFpbnMoUmVhZGVySW50ZXJjZXB0b3IuY2xhc3MpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoY29udHJhY3RzLmNvbnRhaW5zKENvbnRhaW5lclJlcXVlc3RGaWx0ZXIuY2xhc3MpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoY29udHJhY3RzLmNvbnRhaW5zKEV4Y2VwdGlvbk1hcHBlci5jbGFzcykpOworCisgICAgICAgICAgICAvLyBBbGwgcHJpb3JpdGllcyBhcmUgdGhlIHNhbWUuCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoUHJpb3JpdGllcy5VU0VSLCBjb250cmFjdFByb3ZpZGVyLmdldFByaW9yaXR5KFJlYWRlckludGVyY2VwdG9yLmNsYXNzKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoUHJpb3JpdGllcy5VU0VSLCBjb250cmFjdFByb3ZpZGVyLmdldFByaW9yaXR5KENvbnRhaW5lclJlcXVlc3RGaWx0ZXIuY2xhc3MpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhQcmlvcml0aWVzLlVTRVIsIGNvbnRyYWN0UHJvdmlkZXIuZ2V0UHJpb3JpdHkoRXhjZXB0aW9uTWFwcGVyLmNsYXNzKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWdpc3RlckNsYXNzSW5zdGFuY2VCaW5kaW5nUHJpb3JpdHlDbGFzaCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBDb21wbGV4RW1wdHlQcm92aWRlciBjb21wbGV4RW1wdHlQcm92aWRlciA9IG5ldyBDb21wbGV4RW1wdHlQcm92aWRlcigpOworCisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihDb21wbGV4RW1wdHlQcm92aWRlci5jbGFzcywgUHJpb3JpdGllcy5BVVRIRU5USUNBVElPTik7CisgICAgICAgIGNvbmZpZy5yZWdpc3Rlcihjb21wbGV4RW1wdHlQcm92aWRlciwgUHJpb3JpdGllcy5VU0VSKTsKKworCisgICAgICAgIGFzc2VydFRydWUoY29uZmlnLmdldENsYXNzZXMoKS5jb250YWlucyhDb21wbGV4RW1wdHlQcm92aWRlci5jbGFzcykpOworICAgICAgICBhc3NlcnRGYWxzZShjb25maWcuZ2V0SW5zdGFuY2VzKCkuY29udGFpbnMoY29tcGxleEVtcHR5UHJvdmlkZXIpKTsKKworICAgICAgICBmaW5hbCBDb21wb25lbnRCYWcgY29tcG9uZW50QmFnID0gY29uZmlnLmdldENvbXBvbmVudEJhZygpOworICAgICAgICBmaW5hbCBDb250cmFjdFByb3ZpZGVyIGNvbnRyYWN0UHJvdmlkZXIgPQorICAgICAgICAgICAgICAgIGNvbXBvbmVudEJhZy5nZXRNb2RlbChDb21wbGV4RW1wdHlQcm92aWRlci5jbGFzcyk7CisgICAgICAgIGZpbmFsIFNldDxDbGFzczw/Pj4gY29udHJhY3RzID0gY29udHJhY3RQcm92aWRlci5nZXRDb250cmFjdHMoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMywgY29udHJhY3RzLnNpemUoKSk7IC8vIEZlYXR1cmUgaXMgbm90IHRoZXJlLgorICAgICAgICBhc3NlcnRUcnVlKGNvbnRyYWN0cy5jb250YWlucyhSZWFkZXJJbnRlcmNlcHRvci5jbGFzcykpOworICAgICAgICBhc3NlcnRUcnVlKGNvbnRyYWN0cy5jb250YWlucyhDb250YWluZXJSZXF1ZXN0RmlsdGVyLmNsYXNzKSk7CisgICAgICAgIGFzc2VydFRydWUoY29udHJhY3RzLmNvbnRhaW5zKEV4Y2VwdGlvbk1hcHBlci5jbGFzcykpOworCisgICAgICAgIC8vIEFsbCBwcmlvcml0aWVzIGFyZSB0aGUgc2FtZS4KKyAgICAgICAgYXNzZXJ0RXF1YWxzKFByaW9yaXRpZXMuQVVUSEVOVElDQVRJT04sIGNvbnRyYWN0UHJvdmlkZXIuZ2V0UHJpb3JpdHkoUmVhZGVySW50ZXJjZXB0b3IuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFByaW9yaXRpZXMuQVVUSEVOVElDQVRJT04sIGNvbnRyYWN0UHJvdmlkZXIuZ2V0UHJpb3JpdHkoQ29udGFpbmVyUmVxdWVzdEZpbHRlci5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoUHJpb3JpdGllcy5BVVRIRU5USUNBVElPTiwgY29udHJhY3RQcm92aWRlci5nZXRQcmlvcml0eShFeGNlcHRpb25NYXBwZXIuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWdpc3RlckNsYXNzQ29udHJhY3RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBDbGFzcyBjbGF6eiA9IG51bGw7CisgICAgICAgICAgICAvL25vaW5zcGVjdGlvbiBDb25zdGFudENvbmRpdGlvbnMKKyAgICAgICAgICAgIGNvbmZpZy5yZWdpc3RlcihjbGF6eiwgUmVhZGVySW50ZXJjZXB0b3IuY2xhc3MpOworICAgICAgICAgICAgZmFpbCgiQ2Fubm90IHJlZ2lzdGVyIG51bGwuIik7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBPSy4KKyAgICAgICAgfQorCisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihDb21wbGV4RW1wdHlQcm92aWRlci5jbGFzcywKKyAgICAgICAgICAgICAgICBSZWFkZXJJbnRlcmNlcHRvci5jbGFzcywgQ29udGFpbmVyUmVxdWVzdEZpbHRlci5jbGFzcywgV3JpdGVySW50ZXJjZXB0b3IuY2xhc3MpOworICAgICAgICBmaW5hbCBDb250cmFjdFByb3ZpZGVyIGNvbnRyYWN0UHJvdmlkZXIgPSBjb25maWcuZ2V0Q29tcG9uZW50QmFnKCkuZ2V0TW9kZWwoQ29tcGxleEVtcHR5UHJvdmlkZXIuY2xhc3MpOworICAgICAgICBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IGNvbnRyYWN0cyA9IGNvbnRyYWN0UHJvdmlkZXIuZ2V0Q29udHJhY3RzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBjb250cmFjdHMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShSZWFkZXJJbnRlcmNlcHRvci5jbGFzcyArICIgaXMgbm90IHJlZ2lzdGVyZWQuIiwgY29udHJhY3RzLmNvbnRhaW5zKFJlYWRlckludGVyY2VwdG9yLmNsYXNzKSk7CisgICAgICAgIGFzc2VydFRydWUoQ29udGFpbmVyUmVxdWVzdEZpbHRlci5jbGFzcyArICIgaXMgbm90IHJlZ2lzdGVyZWQuIiwgY29udHJhY3RzLmNvbnRhaW5zKENvbnRhaW5lclJlcXVlc3RGaWx0ZXIuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoV3JpdGVySW50ZXJjZXB0b3IuY2xhc3MgKyAiIHNob3VsZCBub3QgYmUgcmVnaXN0ZXJlZC4iLCBjb250cmFjdHMuY29udGFpbnMoV3JpdGVySW50ZXJjZXB0b3IuY2xhc3MpKTsKKworICAgICAgICBhc3NlcnRUcnVlKGNvbmZpZy5nZXRJbnN0YW5jZXMoKS5pc0VtcHR5KCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvbmZpZy5nZXRDbGFzc2VzKCkuY29udGFpbnMoQ29tcGxleEVtcHR5UHJvdmlkZXIuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWdpc3Rlckluc3RhbmNlc0NvbnRyYWN0cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29uZmlnLnJlZ2lzdGVyKG51bGwsIFJlYWRlckludGVyY2VwdG9yLmNsYXNzKTsKKyAgICAgICAgICAgIGZhaWwoIkNhbm5vdCByZWdpc3RlciBudWxsLiIpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gT0suCisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBDb21wbGV4RW1wdHlQcm92aWRlciBjb21wbGV4RW1wdHlQcm92aWRlciA9IG5ldyBDb21wbGV4RW1wdHlQcm92aWRlcigpOworICAgICAgICBjb25maWcucmVnaXN0ZXIoY29tcGxleEVtcHR5UHJvdmlkZXIsCisgICAgICAgICAgICAgICAgUmVhZGVySW50ZXJjZXB0b3IuY2xhc3MsIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIuY2xhc3MsIFdyaXRlckludGVyY2VwdG9yLmNsYXNzKTsKKyAgICAgICAgZmluYWwgQ29udHJhY3RQcm92aWRlciBjb250cmFjdFByb3ZpZGVyID0gY29uZmlnLmdldENvbXBvbmVudEJhZygpLmdldE1vZGVsKENvbXBsZXhFbXB0eVByb3ZpZGVyLmNsYXNzKTsKKyAgICAgICAgZmluYWwgU2V0PENsYXNzPD8+PiBjb250cmFjdHMgPSBjb250cmFjdFByb3ZpZGVyLmdldENvbnRyYWN0cygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgY29udHJhY3RzLnNpemUoKSk7CisgICAgICAgIGFzc2VydFRydWUoUmVhZGVySW50ZXJjZXB0b3IuY2xhc3MgKyAiIGlzIG5vdCByZWdpc3RlcmVkLiIsIGNvbnRyYWN0cy5jb250YWlucyhSZWFkZXJJbnRlcmNlcHRvci5jbGFzcykpOworICAgICAgICBhc3NlcnRUcnVlKENvbnRhaW5lclJlcXVlc3RGaWx0ZXIuY2xhc3MgKyAiIGlzIG5vdCByZWdpc3RlcmVkLiIsIGNvbnRyYWN0cy5jb250YWlucyhDb250YWluZXJSZXF1ZXN0RmlsdGVyLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEZhbHNlKFdyaXRlckludGVyY2VwdG9yLmNsYXNzICsgIiBzaG91bGQgbm90IGJlIHJlZ2lzdGVyZWQuIiwgY29udHJhY3RzLmNvbnRhaW5zKFdyaXRlckludGVyY2VwdG9yLmNsYXNzKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWcuZ2V0SW5zdGFuY2VzKCkuY29udGFpbnMoY29tcGxleEVtcHR5UHJvdmlkZXIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWcuZ2V0Q2xhc3NlcygpLmlzRW1wdHkoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVnaXN0ZXJDbGFzc0NvbnRyYWN0c0ZlYXR1cmVOb3RJbnZva2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihDb21wbGV4RW1wdHlQcm92aWRlckZlYXR1cmUuY2xhc3MsIFJlYWRlckludGVyY2VwdG9yLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY29uZmlnLmdldENvbmZpZ3VyYXRpb24oKS5pc0VuYWJsZWQoQ29tcGxleEVtcHR5UHJvdmlkZXJGZWF0dXJlLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVnaXN0ZXJJbnN0YW5jZXNDb250cmFjdHNGZWF0dXJlTm90SW52b2tlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBDb21wbGV4RW1wdHlQcm92aWRlckZlYXR1cmUgZmVhdHVyZSA9IG5ldyBDb21wbGV4RW1wdHlQcm92aWRlckZlYXR1cmUoKTsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKGZlYXR1cmUsIFJlYWRlckludGVyY2VwdG9yLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY29uZmlnLmdldENvbmZpZ3VyYXRpb24oKS5pc0VuYWJsZWQoQ29tcGxleEVtcHR5UHJvdmlkZXJGZWF0dXJlLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGNvbmZpZy5nZXRDb25maWd1cmF0aW9uKCkuaXNFbmFibGVkKGZlYXR1cmUpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWdpc3RlckNsYXNzTnVsbENvbnRyYWN0cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBjb25maWcucmVnaXN0ZXIoQ29tcGxleEVtcHR5UHJvdmlkZXIuY2xhc3MsIChDbGFzcykgbnVsbCk7CisKKyAgICAgICAgZmluYWwgQ29udHJhY3RQcm92aWRlciBjb250cmFjdFByb3ZpZGVyID0KKyAgICAgICAgICAgICAgICBjb25maWcuZ2V0Q29tcG9uZW50QmFnKCkuZ2V0TW9kZWwoQ29tcGxleEVtcHR5UHJvdmlkZXIuY2xhc3MpOworICAgICAgICBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IGNvbnRyYWN0cyA9IGNvbnRyYWN0UHJvdmlkZXIuZ2V0Q29udHJhY3RzKCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGNvbnRyYWN0cy5zaXplKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIHZvaWQgdGVzdFJlZ2lzdGVySW5zdGFuY2VOdWxsQ29udHJhY3RzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihuZXcgQ29tcGxleEVtcHR5UHJvdmlkZXIoKSwgKENsYXNzKSBudWxsKTsKKworICAgICAgICBmaW5hbCBDb250cmFjdFByb3ZpZGVyIGNvbnRyYWN0UHJvdmlkZXIgPQorICAgICAgICAgICAgICAgIGNvbmZpZy5nZXRDb21wb25lbnRCYWcoKS5nZXRNb2RlbChDb21wbGV4RW1wdHlQcm92aWRlci5jbGFzcyk7CisgICAgICAgIGZpbmFsIFNldDxDbGFzczw/Pj4gY29udHJhY3RzID0gY29udHJhY3RQcm92aWRlci5nZXRDb250cmFjdHMoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY29udHJhY3RzLnNpemUoKSk7CisgICAgfQorCisgICAgLy8gUmVwcm9kdWNlciBKRVJTRVktMTYzNworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlZ2lzdGVyTnVsbE9yRW1wdHlDb250cmFjdHMoKSB7CisgICAgICAgIGZpbmFsIENvbXBsZXhFbXB0eVByb3ZpZGVyIHByb3ZpZGVyID0gbmV3IENvbXBsZXhFbXB0eVByb3ZpZGVyKCk7CisKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKENvbXBsZXhFbXB0eVByb3ZpZGVyLmNsYXNzLCAgKENsYXNzPD8+W10pIG51bGwpOworICAgICAgICBhc3NlcnRGYWxzZShjb25maWcuZ2V0Q29uZmlndXJhdGlvbigpLmlzUmVnaXN0ZXJlZChDb21wbGV4RW1wdHlQcm92aWRlci5jbGFzcykpOworCisgICAgICAgIGNvbmZpZy5yZWdpc3Rlcihwcm92aWRlciwgIChDbGFzczw/PltdKSBudWxsKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY29uZmlnLmdldENvbmZpZ3VyYXRpb24oKS5pc1JlZ2lzdGVyZWQoQ29tcGxleEVtcHR5UHJvdmlkZXIuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoY29uZmlnLmdldENvbmZpZ3VyYXRpb24oKS5pc1JlZ2lzdGVyZWQocHJvdmlkZXIpKTsKKworICAgICAgICBjb25maWcucmVnaXN0ZXIoQ29tcGxleEVtcHR5UHJvdmlkZXIuY2xhc3MsICBuZXcgQ2xhc3NbMF0pOworICAgICAgICBhc3NlcnRGYWxzZShjb25maWcuZ2V0Q29uZmlndXJhdGlvbigpLmlzUmVnaXN0ZXJlZChDb21wbGV4RW1wdHlQcm92aWRlci5jbGFzcykpOworCisgICAgICAgIGNvbmZpZy5yZWdpc3Rlcihwcm92aWRlciwgIG5ldyBDbGFzc1swXSk7CisgICAgICAgIGFzc2VydEZhbHNlKGNvbmZpZy5nZXRDb25maWd1cmF0aW9uKCkuaXNSZWdpc3RlcmVkKENvbXBsZXhFbXB0eVByb3ZpZGVyLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGNvbmZpZy5nZXRDb25maWd1cmF0aW9uKCkuaXNSZWdpc3RlcmVkKHByb3ZpZGVyKSk7CisgICAgfQorCisgICAgQFByaW9yaXR5KDMwMCkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIExvd1ByaW9yaXR5UHJvdmlkZXIgaW1wbGVtZW50cyBXcml0ZXJJbnRlcmNlcHRvciwgUmVhZGVySW50ZXJjZXB0b3IgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBhcm91bmRXcml0ZVRvKGZpbmFsIFdyaXRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIC8vIERvIG5vdGhpbmcuCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE9iamVjdCBhcm91bmRSZWFkRnJvbShmaW5hbCBSZWFkZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5wcm9jZWVkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJpb3JpdHkoMjAwKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWlkUHJpb3JpdHlQcm92aWRlciBpbXBsZW1lbnRzIFdyaXRlckludGVyY2VwdG9yLCBSZWFkZXJJbnRlcmNlcHRvciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGFyb3VuZFdyaXRlVG8oZmluYWwgV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgLy8gRG8gbm90aGluZy4KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0IGFyb3VuZFJlYWRGcm9tKGZpbmFsIFJlYWRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0LnByb2NlZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcmlvcml0eSgxMDApCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBIaWdoUHJpb3JpdHlQcm92aWRlciBpbXBsZW1lbnRzIFdyaXRlckludGVyY2VwdG9yLCBSZWFkZXJJbnRlcmNlcHRvciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGFyb3VuZFdyaXRlVG8oZmluYWwgV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgLy8gRG8gbm90aGluZy4KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0IGFyb3VuZFJlYWRGcm9tKGZpbmFsIFJlYWRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0LnByb2NlZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByb3ZpZGVyT3JkZXJNYW51YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyID0gSW5qZWN0aW9ucy5jcmVhdGVJbmplY3Rpb25NYW5hZ2VyKCk7CisKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKE1pZFByaW9yaXR5UHJvdmlkZXIuY2xhc3MsIDUwMCk7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihMb3dQcmlvcml0eVByb3ZpZGVyLmNsYXNzLCAyMCk7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihIaWdoUHJpb3JpdHlQcm92aWRlci5jbGFzcywgMTUwKTsKKworICAgICAgICBQcm92aWRlckJpbmRlci5iaW5kUHJvdmlkZXJzKGNvbmZpZy5nZXRDb21wb25lbnRCYWcoKSwgaW5qZWN0aW9uTWFuYWdlcik7CisKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5jb21wbGV0ZVJlZ2lzdHJhdGlvbigpOworICAgICAgICBmaW5hbCBJdGVyYWJsZTxXcml0ZXJJbnRlcmNlcHRvcj4gYWxsUHJvdmlkZXJzID0KKyAgICAgICAgICAgICAgICBQcm92aWRlcnMuZ2V0QWxsUHJvdmlkZXJzKGluamVjdGlvbk1hbmFnZXIsIFdyaXRlckludGVyY2VwdG9yLmNsYXNzLCBuZXcgUmFua2VkQ29tcGFyYXRvcjw+KCkpOworCisgICAgICAgIGZpbmFsIEl0ZXJhdG9yPFdyaXRlckludGVyY2VwdG9yPiBpdGVyYXRvciA9IGFsbFByb3ZpZGVycy5pdGVyYXRvcigpOworCisgICAgICAgIGFzc2VydEVxdWFscyhMb3dQcmlvcml0eVByb3ZpZGVyLmNsYXNzLCBpdGVyYXRvci5uZXh0KCkuZ2V0Q2xhc3MoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhIaWdoUHJpb3JpdHlQcm92aWRlci5jbGFzcywgaXRlcmF0b3IubmV4dCgpLmdldENsYXNzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWlkUHJpb3JpdHlQcm92aWRlci5jbGFzcywgaXRlcmF0b3IubmV4dCgpLmdldENsYXNzKCkpOworICAgICAgICBhc3NlcnRGYWxzZShpdGVyYXRvci5oYXNOZXh0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByb3ZpZGVyT3JkZXJTZW1pQXV0b21hdGljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciA9IEluamVjdGlvbnMuY3JlYXRlSW5qZWN0aW9uTWFuYWdlcigpOworCisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihNaWRQcmlvcml0eVByb3ZpZGVyLmNsYXNzLCA1MCk7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihMb3dQcmlvcml0eVByb3ZpZGVyLmNsYXNzLCAyMDAwKTsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKEhpZ2hQcmlvcml0eVByb3ZpZGVyLmNsYXNzKTsKKworICAgICAgICBQcm92aWRlckJpbmRlci5iaW5kUHJvdmlkZXJzKGNvbmZpZy5nZXRDb21wb25lbnRCYWcoKSwgaW5qZWN0aW9uTWFuYWdlcik7CisgICAgICAgIGluamVjdGlvbk1hbmFnZXIuY29tcGxldGVSZWdpc3RyYXRpb24oKTsKKyAgICAgICAgZmluYWwgSXRlcmFibGU8V3JpdGVySW50ZXJjZXB0b3I+IGFsbFByb3ZpZGVycyA9CisgICAgICAgICAgICAgICAgUHJvdmlkZXJzLmdldEFsbFByb3ZpZGVycyhpbmplY3Rpb25NYW5hZ2VyLCBXcml0ZXJJbnRlcmNlcHRvci5jbGFzcywgbmV3IFJhbmtlZENvbXBhcmF0b3I8PigpKTsKKworICAgICAgICBmaW5hbCBJdGVyYXRvcjxXcml0ZXJJbnRlcmNlcHRvcj4gaXRlcmF0b3IgPSBhbGxQcm92aWRlcnMuaXRlcmF0b3IoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoTWlkUHJpb3JpdHlQcm92aWRlci5jbGFzcywgaXRlcmF0b3IubmV4dCgpLmdldENsYXNzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoSGlnaFByaW9yaXR5UHJvdmlkZXIuY2xhc3MsIGl0ZXJhdG9yLm5leHQoKS5nZXRDbGFzcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExvd1ByaW9yaXR5UHJvdmlkZXIuY2xhc3MsIGl0ZXJhdG9yLm5leHQoKS5nZXRDbGFzcygpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoaXRlcmF0b3IuaGFzTmV4dCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm92aWRlck9yZGVyQXV0b21hdGljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciA9IEluamVjdGlvbnMuY3JlYXRlSW5qZWN0aW9uTWFuYWdlcigpOworICAgICAgICBjb25maWcucmVnaXN0ZXIoTWlkUHJpb3JpdHlQcm92aWRlci5jbGFzcyk7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihMb3dQcmlvcml0eVByb3ZpZGVyLmNsYXNzKTsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKEhpZ2hQcmlvcml0eVByb3ZpZGVyLmNsYXNzKTsKKworICAgICAgICBQcm92aWRlckJpbmRlci5iaW5kUHJvdmlkZXJzKGNvbmZpZy5nZXRDb21wb25lbnRCYWcoKSwgaW5qZWN0aW9uTWFuYWdlcik7CisgICAgICAgIGluamVjdGlvbk1hbmFnZXIuY29tcGxldGVSZWdpc3RyYXRpb24oKTsKKworICAgICAgICBmaW5hbCBJdGVyYWJsZTxXcml0ZXJJbnRlcmNlcHRvcj4gYWxsUHJvdmlkZXJzID0KKyAgICAgICAgICAgICAgICBQcm92aWRlcnMuZ2V0QWxsUHJvdmlkZXJzKGluamVjdGlvbk1hbmFnZXIsIFdyaXRlckludGVyY2VwdG9yLmNsYXNzLCBuZXcgUmFua2VkQ29tcGFyYXRvcjw+KCkpOworCisgICAgICAgIGZpbmFsIEl0ZXJhdG9yPFdyaXRlckludGVyY2VwdG9yPiBpdGVyYXRvciA9IGFsbFByb3ZpZGVycy5pdGVyYXRvcigpOworCisgICAgICAgIGFzc2VydEVxdWFscyhIaWdoUHJpb3JpdHlQcm92aWRlci5jbGFzcywgaXRlcmF0b3IubmV4dCgpLmdldENsYXNzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWlkUHJpb3JpdHlQcm92aWRlci5jbGFzcywgaXRlcmF0b3IubmV4dCgpLmdldENsYXNzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTG93UHJpb3JpdHlQcm92aWRlci5jbGFzcywgaXRlcmF0b3IubmV4dCgpLmdldENsYXNzKCkpOworICAgICAgICBhc3NlcnRGYWxzZShpdGVyYXRvci5oYXNOZXh0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIHZvaWQgdGVzdFByb3ZpZGVyT3JkZXJEaWZGb3JDb250cmFjdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgTWFwPENsYXNzPD8+LCBJbnRlZ2VyPiBjb250cmFjdHMgPSBuZXcgSWRlbnRpdHlIYXNoTWFwPD4oKTsKKworICAgICAgICBjb250cmFjdHMucHV0KFdyaXRlckludGVyY2VwdG9yLmNsYXNzLCBDb250cmFjdFByb3ZpZGVyLk5PX1BSSU9SSVRZKTsKKyAgICAgICAgY29udHJhY3RzLnB1dChSZWFkZXJJbnRlcmNlcHRvci5jbGFzcywgMjAwMCk7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihNaWRQcmlvcml0eVByb3ZpZGVyLmNsYXNzLCBjb250cmFjdHMpOworICAgICAgICBjb250cmFjdHMuY2xlYXIoKTsKKworICAgICAgICBjb250cmFjdHMucHV0KFdyaXRlckludGVyY2VwdG9yLmNsYXNzLCBDb250cmFjdFByb3ZpZGVyLk5PX1BSSU9SSVRZKTsKKyAgICAgICAgY29udHJhY3RzLnB1dChSZWFkZXJJbnRlcmNlcHRvci5jbGFzcywgMTAwMCk7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihMb3dQcmlvcml0eVByb3ZpZGVyLmNsYXNzLCBjb250cmFjdHMpOworICAgICAgICBjb250cmFjdHMuY2xlYXIoKTsKKworICAgICAgICBjb250cmFjdHMucHV0KFdyaXRlckludGVyY2VwdG9yLmNsYXNzLCBDb250cmFjdFByb3ZpZGVyLk5PX1BSSU9SSVRZKTsKKyAgICAgICAgY29udHJhY3RzLnB1dChSZWFkZXJJbnRlcmNlcHRvci5jbGFzcywgMzAwMCk7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihIaWdoUHJpb3JpdHlQcm92aWRlci5jbGFzcywgY29udHJhY3RzKTsKKyAgICAgICAgY29udHJhY3RzLmNsZWFyKCk7CisKKyAgICAgICAgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyID0gSW5qZWN0aW9ucy5jcmVhdGVJbmplY3Rpb25NYW5hZ2VyKCk7CisgICAgICAgIFByb3ZpZGVyQmluZGVyLmJpbmRQcm92aWRlcnMoY29uZmlnLmdldENvbXBvbmVudEJhZygpLCBpbmplY3Rpb25NYW5hZ2VyKTsKKworICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLmNvbXBsZXRlUmVnaXN0cmF0aW9uKCk7CisgICAgICAgIGZpbmFsIEl0ZXJhYmxlPFdyaXRlckludGVyY2VwdG9yPiB3cml0ZXJJbnRlcmNlcHRvcnMgPQorICAgICAgICAgICAgICAgIFByb3ZpZGVycy5nZXRBbGxQcm92aWRlcnMoaW5qZWN0aW9uTWFuYWdlciwgV3JpdGVySW50ZXJjZXB0b3IuY2xhc3MsIG5ldyBSYW5rZWRDb21wYXJhdG9yPD4oKSk7CisKKyAgICAgICAgZmluYWwgSXRlcmF0b3I8V3JpdGVySW50ZXJjZXB0b3I+IHdyaXRlckl0ZXJhdG9yID0gd3JpdGVySW50ZXJjZXB0b3JzLml0ZXJhdG9yKCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEhpZ2hQcmlvcml0eVByb3ZpZGVyLmNsYXNzLCB3cml0ZXJJdGVyYXRvci5uZXh0KCkuZ2V0Q2xhc3MoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNaWRQcmlvcml0eVByb3ZpZGVyLmNsYXNzLCB3cml0ZXJJdGVyYXRvci5uZXh0KCkuZ2V0Q2xhc3MoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhMb3dQcmlvcml0eVByb3ZpZGVyLmNsYXNzLCB3cml0ZXJJdGVyYXRvci5uZXh0KCkuZ2V0Q2xhc3MoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHdyaXRlckl0ZXJhdG9yLmhhc05leHQoKSk7CisKKyAgICAgICAgZmluYWwgSXRlcmFibGU8UmVhZGVySW50ZXJjZXB0b3I+IHJlYWRlckludGVyY2VwdG9ycyA9CisgICAgICAgICAgICAgICAgUHJvdmlkZXJzLmdldEFsbFByb3ZpZGVycyhpbmplY3Rpb25NYW5hZ2VyLCBSZWFkZXJJbnRlcmNlcHRvci5jbGFzcywgbmV3IFJhbmtlZENvbXBhcmF0b3I8PigpKTsKKworICAgICAgICBmaW5hbCBJdGVyYXRvcjxSZWFkZXJJbnRlcmNlcHRvcj4gcmVhZGVySXRlcmF0b3IgPSByZWFkZXJJbnRlcmNlcHRvcnMuaXRlcmF0b3IoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoTG93UHJpb3JpdHlQcm92aWRlci5jbGFzcywgcmVhZGVySXRlcmF0b3IubmV4dCgpLmdldENsYXNzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWlkUHJpb3JpdHlQcm92aWRlci5jbGFzcywgcmVhZGVySXRlcmF0b3IubmV4dCgpLmdldENsYXNzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoSGlnaFByaW9yaXR5UHJvdmlkZXIuY2xhc3MsIHJlYWRlckl0ZXJhdG9yLm5leHQoKS5nZXRDbGFzcygpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocmVhZGVySXRlcmF0b3IuaGFzTmV4dCgpKTsKKyAgICB9CisKKworICAgIHByaXZhdGUgPFQ+IHZvaWQgX3Rlc3RDb2xsZWN0aW9uc0NvbW1vbihmaW5hbCBTdHJpbmcgdGVzdE5hbWUsIGZpbmFsIENvbGxlY3Rpb248VD4gY29sbGVjdGlvbiwgZmluYWwgVCBlbGVtZW50KQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgLy8gTm90IG51bGwuCisgICAgICAgIGFzc2VydE5vdE51bGwodGVzdE5hbWUgKyAiIC0gcmV0dXJuZWQgY29sbGVjdGlvbiBpcyBudWxsLiIsIGNvbGxlY3Rpb24pOworCisgICAgICAgIC8vIEltbXV0YWJpbGl0eS4KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbGxlY3Rpb24uYWRkKGVsZW1lbnQpOworICAgICAgICAgICAgZmFpbCh0ZXN0TmFtZSArICIgLSByZXR1cm5lZCBjb2xsZWN0aW9uIHNob3VsZCBiZSBpbW11dGFibGUuIik7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBPSy4KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQ3VzdG9tUmVhZGVyQSBpbXBsZW1lbnRzIFJlYWRlckludGVyY2VwdG9yIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE9iamVjdCBhcm91bmRSZWFkRnJvbShmaW5hbCBSZWFkZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQ3VzdG9tUmVhZGVyQiBpbXBsZW1lbnRzIFJlYWRlckludGVyY2VwdG9yIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE9iamVjdCBhcm91bmRSZWFkRnJvbShmaW5hbCBSZWFkZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgU2ltcGxlRmVhdHVyZUEgaW1wbGVtZW50cyBGZWF0dXJlIHsKKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gaW5pdEI7CisKKyAgICAgICAgcHVibGljIFNpbXBsZUZlYXR1cmVBKCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNpbXBsZUZlYXR1cmVBKGZpbmFsIGJvb2xlYW4gaW5pdEIpIHsKKyAgICAgICAgICAgIHRoaXMuaW5pdEIgPSBpbml0QjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmUoZmluYWwgRmVhdHVyZUNvbnRleHQgY29uZmlnKSB7CisgICAgICAgICAgICBjb25maWcucmVnaXN0ZXIoaW5pdEIgPyBDdXN0b21SZWFkZXJCLmNsYXNzIDogQ3VzdG9tUmVhZGVyQS5jbGFzcyk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgU2ltcGxlRmVhdHVyZUIgaW1wbGVtZW50cyBGZWF0dXJlIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlKGZpbmFsIEZlYXR1cmVDb250ZXh0IGNvbmZpZykgeworICAgICAgICAgICAgY29uZmlnLnJlZ2lzdGVyKEN1c3RvbVJlYWRlckIuY2xhc3MpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEluc3RhbmNlRmVhdHVyZUEgaW1wbGVtZW50cyBGZWF0dXJlIHsKKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gaW5pdEI7CisKKyAgICAgICAgcHVibGljIEluc3RhbmNlRmVhdHVyZUEoKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSW5zdGFuY2VGZWF0dXJlQShmaW5hbCBib29sZWFuIGluaXRCKSB7CisgICAgICAgICAgICB0aGlzLmluaXRCID0gaW5pdEI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlKGZpbmFsIEZlYXR1cmVDb250ZXh0IGNvbmZpZykgeworICAgICAgICAgICAgY29uZmlnLnJlZ2lzdGVyKGluaXRCID8gbmV3IEN1c3RvbVJlYWRlckIoKSA6IG5ldyBDdXN0b21SZWFkZXJBKCkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIENvbXBsZXhGZWF0dXJlIGltcGxlbWVudHMgRmVhdHVyZSB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZShmaW5hbCBGZWF0dXJlQ29udGV4dCBjb25maWcpIHsKKyAgICAgICAgICAgIGNvbmZpZy5yZWdpc3RlcihTaW1wbGVGZWF0dXJlQS5jbGFzcyk7CisgICAgICAgICAgICBjb25maWcucmVnaXN0ZXIoU2ltcGxlRmVhdHVyZUIuY2xhc3MpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJlY3Vyc2l2ZUZlYXR1cmUgaW1wbGVtZW50cyBGZWF0dXJlIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlKGZpbmFsIEZlYXR1cmVDb250ZXh0IGNvbmZpZykgeworICAgICAgICAgICAgY29uZmlnLnJlZ2lzdGVyKG5ldyBDdXN0b21SZWFkZXJBKCkpOworICAgICAgICAgICAgY29uZmlnLnJlZ2lzdGVyKFJlY3Vyc2l2ZUZlYXR1cmUuY2xhc3MpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJlY3Vyc2l2ZUluc3RhbmNlRmVhdHVyZSBpbXBsZW1lbnRzIEZlYXR1cmUgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmUoZmluYWwgRmVhdHVyZUNvbnRleHQgY29uZmlnKSB7CisgICAgICAgICAgICBjb25maWcucmVnaXN0ZXIobmV3IEN1c3RvbVJlYWRlckEoKSk7CisgICAgICAgICAgICBjb25maWcucmVnaXN0ZXIobmV3IFJlY3Vyc2l2ZUluc3RhbmNlRmVhdHVyZSgpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uZmlndXJlRmVhdHVyZUhpZXJhcmNoeSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBjb25maWcucmVnaXN0ZXIoQ29tcGxleEZlYXR1cmUuY2xhc3MpOworCisgICAgICAgIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciA9IEluamVjdGlvbnMuY3JlYXRlSW5qZWN0aW9uTWFuYWdlcigpOworICAgICAgICBNYW5hZ2VkT2JqZWN0c0ZpbmFsaXplciBmaW5hbGl6ZXIgPSBuZXcgTWFuYWdlZE9iamVjdHNGaW5hbGl6ZXIoaW5qZWN0aW9uTWFuYWdlcik7CisgICAgICAgIGNvbmZpZy5jb25maWd1cmVNZXRhUHJvdmlkZXJzKGluamVjdGlvbk1hbmFnZXIsIGZpbmFsaXplcik7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWcuZ2V0Q29uZmlndXJhdGlvbigpLmlzRW5hYmxlZChDb21wbGV4RmVhdHVyZS5jbGFzcykpOworCisgICAgICAgIGFzc2VydFRydWUoY29uZmlnLmdldENvbmZpZ3VyYXRpb24oKS5pc1JlZ2lzdGVyZWQoQ3VzdG9tUmVhZGVyQS5jbGFzcykpOworICAgICAgICBhc3NlcnRUcnVlKGNvbmZpZy5nZXRDb25maWd1cmF0aW9uKCkuaXNSZWdpc3RlcmVkKEN1c3RvbVJlYWRlckIuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25maWd1cmVGZWF0dXJlUmVjdXJzaXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihSZWN1cnNpdmVGZWF0dXJlLmNsYXNzKTsKKyAgICAgICAgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyID0gSW5qZWN0aW9ucy5jcmVhdGVJbmplY3Rpb25NYW5hZ2VyKCk7CisgICAgICAgIE1hbmFnZWRPYmplY3RzRmluYWxpemVyIGZpbmFsaXplciA9IG5ldyBNYW5hZ2VkT2JqZWN0c0ZpbmFsaXplcihpbmplY3Rpb25NYW5hZ2VyKTsKKyAgICAgICAgY29uZmlnLmNvbmZpZ3VyZU1ldGFQcm92aWRlcnMoaW5qZWN0aW9uTWFuYWdlciwgZmluYWxpemVyKTsKKworICAgICAgICBhc3NlcnRUcnVlKGNvbmZpZy5nZXRDb25maWd1cmF0aW9uKCkuaXNFbmFibGVkKFJlY3Vyc2l2ZUZlYXR1cmUuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNvbmZpZy5nZXRJbnN0YW5jZXMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRTYW1lKEN1c3RvbVJlYWRlckEuY2xhc3MsIGNvbmZpZy5nZXRJbnN0YW5jZXMoKS5pdGVyYXRvcigpLm5leHQoKS5nZXRDbGFzcygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25maWd1cmVGZWF0dXJlSW5zdGFuY2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFNpbXBsZUZlYXR1cmVBIGYxID0gbmV3IFNpbXBsZUZlYXR1cmVBKCk7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihmMSk7CisgICAgICAgIGZpbmFsIFNpbXBsZUZlYXR1cmVBIGYyID0gbmV3IFNpbXBsZUZlYXR1cmVBKHRydWUpOworICAgICAgICBjb25maWcucmVnaXN0ZXIoZjIpOworCisgICAgICAgIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciA9IEluamVjdGlvbnMuY3JlYXRlSW5qZWN0aW9uTWFuYWdlcigpOworICAgICAgICBNYW5hZ2VkT2JqZWN0c0ZpbmFsaXplciBmaW5hbGl6ZXIgPSBuZXcgTWFuYWdlZE9iamVjdHNGaW5hbGl6ZXIoaW5qZWN0aW9uTWFuYWdlcik7CisgICAgICAgIGNvbmZpZy5jb25maWd1cmVNZXRhUHJvdmlkZXJzKGluamVjdGlvbk1hbmFnZXIsIGZpbmFsaXplcik7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWcuZ2V0Q29uZmlndXJhdGlvbigpLmlzRW5hYmxlZChmMSkpOworICAgICAgICBhc3NlcnRGYWxzZShjb25maWcuZ2V0Q29uZmlndXJhdGlvbigpLmlzRW5hYmxlZChmMikpOworCisgICAgICAgIGFzc2VydFRydWUoY29uZmlnLmdldENvbmZpZ3VyYXRpb24oKS5pc1JlZ2lzdGVyZWQoQ3VzdG9tUmVhZGVyQS5jbGFzcykpOworICAgICAgICBhc3NlcnRGYWxzZShjb25maWcuZ2V0Q29uZmlndXJhdGlvbigpLmlzUmVnaXN0ZXJlZChDdXN0b21SZWFkZXJCLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uZmlndXJlRmVhdHVyZUluc3RhbmNlc1Byb3ZpZGVySW5zdGFuY2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEluc3RhbmNlRmVhdHVyZUEgZjEgPSBuZXcgSW5zdGFuY2VGZWF0dXJlQSgpOworICAgICAgICBjb25maWcucmVnaXN0ZXIoZjEpOworICAgICAgICBmaW5hbCBJbnN0YW5jZUZlYXR1cmVBIGYyID0gbmV3IEluc3RhbmNlRmVhdHVyZUEodHJ1ZSk7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihmMik7CisKKyAgICAgICAgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyID0gSW5qZWN0aW9ucy5jcmVhdGVJbmplY3Rpb25NYW5hZ2VyKCk7CisgICAgICAgIE1hbmFnZWRPYmplY3RzRmluYWxpemVyIGZpbmFsaXplciA9IG5ldyBNYW5hZ2VkT2JqZWN0c0ZpbmFsaXplcihpbmplY3Rpb25NYW5hZ2VyKTsKKyAgICAgICAgY29uZmlnLmNvbmZpZ3VyZU1ldGFQcm92aWRlcnMoaW5qZWN0aW9uTWFuYWdlciwgZmluYWxpemVyKTsKKworICAgICAgICBhc3NlcnRUcnVlKGNvbmZpZy5nZXRDb25maWd1cmF0aW9uKCkuaXNFbmFibGVkKGYxKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGNvbmZpZy5nZXRDb25maWd1cmF0aW9uKCkuaXNFbmFibGVkKGYyKSk7CisKKyAgICAgICAgZmluYWwgU2V0PE9iamVjdD4gcHJvdmlkZXJJbnN0YW5jZXMgPSBjb25maWcuZ2V0SW5zdGFuY2VzKCk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCBwcm92aWRlckluc3RhbmNlcy5zaXplKCkpOworCisgICAgICAgIGZpbmFsIFNldDxPYmplY3Q+IHB1cmVQcm92aWRlckluc3RhbmNlcyA9CisgICAgICAgICAgICAgICAgY29uZmlnLmdldENvbXBvbmVudEJhZygpLmdldEluc3RhbmNlcyhDb21wb25lbnRCYWcuZXhjbHVkZU1ldGFQcm92aWRlcnMoaW5qZWN0aW9uTWFuYWdlcikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgcHVyZVByb3ZpZGVySW5zdGFuY2VzLnNpemUoKSk7CisKKyAgICAgICAgaW50IGEgPSAwOworICAgICAgICBpbnQgYiA9IDA7CisgICAgICAgIGZvciAoZmluYWwgT2JqZWN0IGluc3RhbmNlIDogcHVyZVByb3ZpZGVySW5zdGFuY2VzKSB7CisgICAgICAgICAgICBpZiAoaW5zdGFuY2UgaW5zdGFuY2VvZiBDdXN0b21SZWFkZXJBKSB7CisgICAgICAgICAgICAgICAgYSsrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBiKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGEpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgYik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uZmlndXJlRmVhdHVyZUluc3RhbmNlUmVjdXJzaXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihuZXcgUmVjdXJzaXZlSW5zdGFuY2VGZWF0dXJlKCkpOworICAgICAgICBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIgPSBJbmplY3Rpb25zLmNyZWF0ZUluamVjdGlvbk1hbmFnZXIoKTsKKyAgICAgICAgTWFuYWdlZE9iamVjdHNGaW5hbGl6ZXIgZmluYWxpemVyID0gbmV3IE1hbmFnZWRPYmplY3RzRmluYWxpemVyKGluamVjdGlvbk1hbmFnZXIpOworICAgICAgICBjb25maWcuY29uZmlndXJlTWV0YVByb3ZpZGVycyhpbmplY3Rpb25NYW5hZ2VyLCBmaW5hbGl6ZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY29uZmlnLmdldENsYXNzZXMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgY29uZmlnLmdldEluc3RhbmNlcygpLnNpemUoKSk7CisgICAgICAgIGZpbmFsIFNldDxPYmplY3Q+IHB1cmVQcm92aWRlcnMgPQorICAgICAgICAgICAgICAgIGNvbmZpZy5nZXRDb21wb25lbnRCYWcoKS5nZXRJbnN0YW5jZXMoQ29tcG9uZW50QmFnLmV4Y2x1ZGVNZXRhUHJvdmlkZXJzKGluamVjdGlvbk1hbmFnZXIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHB1cmVQcm92aWRlcnMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0U2FtZShDdXN0b21SZWFkZXJBLmNsYXNzLCBwdXJlUHJvdmlkZXJzLml0ZXJhdG9yKCkubmV4dCgpLmdldENsYXNzKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIENvbnRyYWN0IHsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNlcnZpY2UgaW1wbGVtZW50cyBDb250cmFjdCB7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb250cmFjdEJpbmRlciBleHRlbmRzIEFic3RyYWN0QmluZGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICAgICAgYmluZChTZXJ2aWNlLmNsYXNzKS50byhDb250cmFjdC5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbnRyYWN0QmluZGVyRmVhdHVyZSBpbXBsZW1lbnRzIEZlYXR1cmUgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmUoZmluYWwgRmVhdHVyZUNvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihuZXcgQ29udHJhY3RCaW5kZXIoKSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJpbmRlckNvbmZpZ3VyaW5nRmVhdHVyZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBjb25maWcucmVnaXN0ZXIoQ29udHJhY3RCaW5kZXJGZWF0dXJlLmNsYXNzKTsKKyAgICAgICAgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyID0gSW5qZWN0aW9ucy5jcmVhdGVJbmplY3Rpb25NYW5hZ2VyKCk7CisgICAgICAgIE1hbmFnZWRPYmplY3RzRmluYWxpemVyIGZpbmFsaXplciA9IG5ldyBNYW5hZ2VkT2JqZWN0c0ZpbmFsaXplcihpbmplY3Rpb25NYW5hZ2VyKTsKKyAgICAgICAgY29uZmlnLmNvbmZpZ3VyZU1ldGFQcm92aWRlcnMoaW5qZWN0aW9uTWFuYWdlciwgZmluYWxpemVyKTsKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5jb21wbGV0ZVJlZ2lzdHJhdGlvbigpOworCisgICAgICAgIGFzc2VydFRydWUoY29uZmlnLmlzRW5hYmxlZChDb250cmFjdEJpbmRlckZlYXR1cmUuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGNvbmZpZy5nZXRJbnN0YW5jZXMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRTYW1lKENvbnRyYWN0QmluZGVyLmNsYXNzLCBjb25maWcuZ2V0SW5zdGFuY2VzKCkuaXRlcmF0b3IoKS5uZXh0KCkuZ2V0Q2xhc3MoKSk7CisKKyAgICAgICAgZmluYWwgQ29udHJhY3Qgc2VydmljZSA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoQ29udHJhY3QuY2xhc3MpOworICAgICAgICBhc3NlcnROb3ROdWxsKHNlcnZpY2UpOworICAgICAgICBhc3NlcnRTYW1lKFNlcnZpY2UuY2xhc3MsIHNlcnZpY2UuZ2V0Q2xhc3MoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbmplY3RNZSB7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbmplY3RJbnRvRmVhdHVyZUluc3RhbmNlIGltcGxlbWVudHMgRmVhdHVyZSB7CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBwcml2YXRlIEluamVjdE1lIGluamVjdE1lOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmUoZmluYWwgRmVhdHVyZUNvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgY29udGV4dC5wcm9wZXJ0eSgiaW5zdGFuY2UtaW5qZWN0ZWQiLCBpbmplY3RNZSAhPSBudWxsKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbmplY3RJbnRvRmVhdHVyZUNsYXNzIGltcGxlbWVudHMgRmVhdHVyZSB7CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBwcml2YXRlIEluamVjdE1lIGluamVjdE1lOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmUoZmluYWwgRmVhdHVyZUNvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgY29udGV4dC5wcm9wZXJ0eSgiY2xhc3MtaW5qZWN0ZWQiLCBpbmplY3RNZSAhPSBudWxsKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCaW5kSW5qZWN0TWVJbkZlYXR1cmUgaW1wbGVtZW50cyBGZWF0dXJlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZShGZWF0dXJlQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKG5ldyBBYnN0cmFjdEJpbmRlcigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgICAgICAgICAgICAgIGJpbmQobmV3IEluamVjdE1lKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGZWF0dXJlSW5qZWN0aW9ucygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZShIazJJbmplY3Rpb25NYW5hZ2VyRmFjdG9yeS5pc0ltbWVkaWF0ZVN0cmF0ZWd5KCkpOworCisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihJbmplY3RJbnRvRmVhdHVyZUNsYXNzLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihuZXcgSW5qZWN0SW50b0ZlYXR1cmVJbnN0YW5jZSgpKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihuZXcgQWJzdHJhY3RCaW5kZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKG5ldyBJbmplY3RNZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciA9IEluamVjdGlvbnMuY3JlYXRlSW5qZWN0aW9uTWFuYWdlcigpOworICAgICAgICBNYW5hZ2VkT2JqZWN0c0ZpbmFsaXplciBmaW5hbGl6ZXIgPSBuZXcgTWFuYWdlZE9iamVjdHNGaW5hbGl6ZXIoaW5qZWN0aW9uTWFuYWdlcik7CisgICAgICAgIGNvbmZpZy5jb25maWd1cmVNZXRhUHJvdmlkZXJzKGluamVjdGlvbk1hbmFnZXIsIGZpbmFsaXplcik7CisKKyAgICAgICAgYXNzZXJ0VGhhdCgiRmVhdHVyZSBpbnN0YW5jZSBub3QgaW5qZWN0ZWQiLCBjb25maWcuZ2V0UHJvcGVydHkoImluc3RhbmNlLWluamVjdGVkIikudG9TdHJpbmcoKSwgaXMoInRydWUiKSk7CisgICAgICAgIGFzc2VydFRoYXQoIkZlYXR1cmUgY2xhc3Mgbm90IGluamVjdGVkIiwgY29uZmlnLmdldFByb3BlcnR5KCJjbGFzcy1pbmplY3RlZCIpLnRvU3RyaW5nKCksIGlzKCJ0cnVlIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQElnbm9yZQorICAgIHB1YmxpYyB2b2lkIHRlc3RGZWF0dXJlSW5qZWN0aW9uc0JpbmRJbkZlYXR1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKG5ldyBCaW5kSW5qZWN0TWVJbkZlYXR1cmUoKSk7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihJbmplY3RJbnRvRmVhdHVyZUNsYXNzLmNsYXNzKTsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKG5ldyBJbmplY3RJbnRvRmVhdHVyZUluc3RhbmNlKCkpOworCisgICAgICAgIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlciA9IEluamVjdGlvbnMuY3JlYXRlSW5qZWN0aW9uTWFuYWdlcigpOworICAgICAgICBNYW5hZ2VkT2JqZWN0c0ZpbmFsaXplciBmaW5hbGl6ZXIgPSBuZXcgTWFuYWdlZE9iamVjdHNGaW5hbGl6ZXIoaW5qZWN0aW9uTWFuYWdlcik7CisgICAgICAgIGNvbmZpZy5jb25maWd1cmVNZXRhUHJvdmlkZXJzKGluamVjdGlvbk1hbmFnZXIsIGZpbmFsaXplcik7CisKKyAgICAgICAgYXNzZXJ0VGhhdCgiRmVhdHVyZSBpbnN0YW5jZSBub3QgaW5qZWN0ZWQiLCBjb25maWcuZ2V0UHJvcGVydHkoImluc3RhbmNlLWluamVjdGVkIikudG9TdHJpbmcoKSwgaXMoInRydWUiKSk7CisgICAgICAgIGFzc2VydFRoYXQoIkZlYXR1cmUgY2xhc3Mgbm90IGluamVjdGVkIiwgY29uZmlnLmdldFByb3BlcnR5KCJjbGFzcy1pbmplY3RlZCIpLnRvU3RyaW5nKCksIGlzKCJ0cnVlIikpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9wcm9jZXNzL2ludGVybmFsL0V4ZWN1dG9yUHJvdmlkZXJzVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9wcm9jZXNzL2ludGVybmFsL0V4ZWN1dG9yUHJvdmlkZXJzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjZmQ1M2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL3Byb2Nlc3MvaW50ZXJuYWwvRXhlY3V0b3JQcm92aWRlcnNUZXN0LmphdmEKQEAgLTAsMCArMSwyNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbi5wcm9jZXNzLmludGVybmFsOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5QcmVEZXN0cm95OworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0Lk5hbWVkOworaW1wb3J0IGphdmF4LmluamVjdC5RdWFsaWZpZXI7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5BYnN0cmFjdEJpbmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlByb2R1Y2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWwuRXhlY3V0b3JQcm92aWRlcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLkV4ZWN1dG9yU2VydmljZVByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5TY2hlZHVsZWRFeGVjdXRvclNlcnZpY2VQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuU2NoZWR1bGVkVGhyZWFkUG9vbEV4ZWN1dG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLlRocmVhZFBvb2xFeGVjdXRvclByb3ZpZGVyOworCitpbXBvcnQgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIEV4ZWN1dG9yUHJvdmlkZXJzIHVuaXQgdGVzdHMuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEV4ZWN1dG9yUHJvdmlkZXJzVGVzdCBleHRlbmRzIEFic3RyYWN0QmluZGVyIHsKKworICAgIC8qKgorICAgICAqIEN1c3RvbSBzY2hlZHVsZXIgaW5qZWN0aW9uIHF1YWxpZmllci4KKyAgICAgKi8KKyAgICBAUXVhbGlmaWVyCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgICBwdWJsaWMgc3RhdGljIEBpbnRlcmZhY2UgQ3VzdG9tU2NoZWR1bGVyIHsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIEN1c3RvbSBzY2hlZHVsZXIgcHJvdmlkZXIuCisgICAgICovCisgICAgQEN1c3RvbVNjaGVkdWxlcgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ3VzdG9tU2NoZWR1bGVyUHJvdmlkZXIgZXh0ZW5kcyBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3JQcm92aWRlciB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc2NoZWR1bGVkIHRocmVhZCBwb29sIGV4ZWN1dG9yIHByb3ZpZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEN1c3RvbVNjaGVkdWxlclByb3ZpZGVyKCkgeworICAgICAgICAgICAgc3VwZXIoImN1c3RvbS1zY2hlZHVsZXIiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEN1c3RvbSBuYW1lZCBzY2hlZHVsZXIgcHJvdmlkZXIuCisgICAgICovCisgICAgQE5hbWVkKCJjdXN0b20tc2NoZWR1bGVyIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEN1c3RvbU5hbWVkU2NoZWR1bGVyUHJvdmlkZXIgZXh0ZW5kcyBTY2hlZHVsZWRUaHJlYWRQb29sRXhlY3V0b3JQcm92aWRlciB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgc2NoZWR1bGVkIHRocmVhZCBwb29sIGV4ZWN1dG9yIHByb3ZpZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIEN1c3RvbU5hbWVkU2NoZWR1bGVyUHJvdmlkZXIoKSB7CisgICAgICAgICAgICBzdXBlcigiY3VzdG9tLW5hbWVkLXNjaGVkdWxlciIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3VzdG9tIGV4ZWN1dG9yIGluamVjdGlvbiBxdWFsaWZpZXIuCisgICAgICovCisgICAgQFF1YWxpZmllcgorICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCisgICAgcHVibGljIHN0YXRpYyBAaW50ZXJmYWNlIEN1c3RvbUV4ZWN1dG9yIHsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIEN1c3RvbSBleGVjdXRvciBwcm92aWRlci4KKyAgICAgKi8KKyAgICBAQ3VzdG9tRXhlY3V0b3IKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEN1c3RvbUV4ZWN1dG9yUHJvdmlkZXIgZXh0ZW5kcyBUaHJlYWRQb29sRXhlY3V0b3JQcm92aWRlciB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdGhyZWFkIHBvb2wgZXhlY3V0b3IgcHJvdmlkZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQ3VzdG9tRXhlY3V0b3JQcm92aWRlcigpIHsKKyAgICAgICAgICAgIHN1cGVyKCJjdXN0b20tZXhlY3V0b3IiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEN1c3RvbSBuYW1lZCBleGVjdXRvciBwcm92aWRlci4KKyAgICAgKi8KKyAgICBATmFtZWQoImN1c3RvbS1leGVjdXRvciIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDdXN0b21OYW1lZEV4ZWN1dG9yUHJvdmlkZXIgZXh0ZW5kcyBUaHJlYWRQb29sRXhlY3V0b3JQcm92aWRlciB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdGhyZWFkIHBvb2wgZXhlY3V0b3IgcHJvdmlkZXIuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgQ3VzdG9tTmFtZWRFeGVjdXRvclByb3ZpZGVyKCkgeworICAgICAgICAgICAgc3VwZXIoImN1c3RvbS1uYW1lZC1leGVjdXRvciIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQSB0YXNrIHRvIHJldHJpZXZlIHRoZSBjdXJyZW50IHRocmVhZCBuYW1lLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ3VycmVudFRocmVhZE5hbWVSZXRyaWV2ZXJUYXNrIGltcGxlbWVudHMgUHJvZHVjZXI8U3RyaW5nPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgY2FsbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE5vdGlmaWVyIG9mIHByZS1kZXN0cm95IG1ldGhvZCBpbnZvY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHJlRGVzdHJveU5vdGlmaWVyIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworCisgICAgICAgIEBQcmVEZXN0cm95CisgICAgICAgIHB1YmxpYyB2b2lkIHByZURlc3Ryb3koKSB7CisgICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGF3YWl0KGZpbmFsIGxvbmcgdGltZW91dCwgZmluYWwgVGltZVVuaXQgdW5pdCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBsYXRjaC5hd2FpdCh0aW1lb3V0LCB1bml0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEluamVjdGFibGUgZXhlY3V0b3IgY2xpZW50IGNsYXNzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5qZWN0ZWRFeGVjdXRvckNsaWVudCB7CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBwcml2YXRlIFByZURlc3Ryb3lOb3RpZmllciBwcmVEZXN0cm95Tm90aWZpZXI7CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBAQ3VzdG9tRXhlY3V0b3IKKyAgICAgICAgcHJpdmF0ZSBFeGVjdXRvclNlcnZpY2UgY3VzdG9tRXhlY3V0b3I7CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBATmFtZWQoImN1c3RvbS1leGVjdXRvciIpCisgICAgICAgIHByaXZhdGUgRXhlY3V0b3JTZXJ2aWNlIGN1c3RvbU5hbWVkRXhlY3V0b3I7CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBAQ3VzdG9tU2NoZWR1bGVyCisgICAgICAgIHByaXZhdGUgU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlIGN1c3RvbVNjaGVkdWxlcjsKKworICAgICAgICBASW5qZWN0CisgICAgICAgIEBDdXN0b21TY2hlZHVsZXIKKyAgICAgICAgcHJpdmF0ZSBFeGVjdXRvclNlcnZpY2UgY3VzdG9tU2NoZWR1bGVyQXNFeGVjdXRvcjsKKworICAgICAgICBASW5qZWN0CisgICAgICAgIEBOYW1lZCgiY3VzdG9tLXNjaGVkdWxlciIpCisgICAgICAgIHByaXZhdGUgU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlIGN1c3RvbU5hbWVkU2NoZWR1bGVyOworCisgICAgICAgIEBJbmplY3QKKyAgICAgICAgQE5hbWVkKCJjdXN0b20tc2NoZWR1bGVyIikKKyAgICAgICAgcHJpdmF0ZSBTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UgY3VzdG9tTmFtZWRTY2hlZHVsZXJBc0V4ZWN1dG9yOworCisgICAgfQorCisgICAgcHJpdmF0ZSBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisKKworCisgICAgICAgIGJpbmQoQ3VzdG9tRXhlY3V0b3JQcm92aWRlci5jbGFzcykudG8oRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXIuY2xhc3MpLmluKFNpbmdsZXRvbi5jbGFzcyk7CisgICAgICAgIGJpbmQoQ3VzdG9tTmFtZWRFeGVjdXRvclByb3ZpZGVyLmNsYXNzKS50byhFeGVjdXRvclNlcnZpY2VQcm92aWRlci5jbGFzcykuaW4oU2luZ2xldG9uLmNsYXNzKTsKKyAgICAgICAgYmluZChDdXN0b21TY2hlZHVsZXJQcm92aWRlci5jbGFzcykudG8oU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXIuY2xhc3MpLmluKFNpbmdsZXRvbi5jbGFzcyk7CisgICAgICAgIGJpbmQoQ3VzdG9tTmFtZWRTY2hlZHVsZXJQcm92aWRlci5jbGFzcykudG8oU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXIuY2xhc3MpLmluKFNpbmdsZXRvbi5jbGFzcyk7CisgICAgICAgIGJpbmRBc0NvbnRyYWN0KFByZURlc3Ryb3lOb3RpZmllci5jbGFzcykuaW4oU2luZ2xldG9uLmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQtdXAgdGhlIHRlc3RzLgorICAgICAqLworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXR1cCgpIHsKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlciA9IEluamVjdGlvbnMuY3JlYXRlSW5qZWN0aW9uTWFuYWdlcih0aGlzKTsKKyAgICAgICAgRXhlY3V0b3JQcm92aWRlcnMucmVnaXN0ZXJFeGVjdXRvckJpbmRpbmdzKGluamVjdGlvbk1hbmFnZXIpOworICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLmNvbXBsZXRlUmVnaXN0cmF0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBleGVjdXRvciBhbmQgc2NoZWR1bGVyIGluamVjdGlvbiBhcyB3ZWxsIGFzIHRoZSBwcm9wZXIgc2h1dGRvd24gd2hlbiBpbmplY3Rpb24gbWFuYWdlciBpcyBjbG9zZWQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGVzdCBlcnJvci4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeGVjdXRvckluamVjdGlvbkFuZFJlbGVhc2luZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBJbmplY3RlZEV4ZWN1dG9yQ2xpZW50IGV4ZWN1dG9yQ2xpZW50ID0gSW5qZWN0aW9ucy5nZXRPckNyZWF0ZShpbmplY3Rpb25NYW5hZ2VyLCBJbmplY3RlZEV4ZWN1dG9yQ2xpZW50LmNsYXNzKTsKKworICAgICAgICBhc3NlcnRUaGF0KGV4ZWN1dG9yQ2xpZW50LmN1c3RvbUV4ZWN1dG9yLCBNYXRjaGVycy5ub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZXhlY3V0b3JDbGllbnQuY3VzdG9tTmFtZWRFeGVjdXRvciwgTWF0Y2hlcnMubm90TnVsbFZhbHVlKCkpOworCisgICAgICAgIGFzc2VydFRoYXQoZXhlY3V0b3JDbGllbnQuY3VzdG9tU2NoZWR1bGVyLCBNYXRjaGVycy5ub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZXhlY3V0b3JDbGllbnQuY3VzdG9tTmFtZWRTY2hlZHVsZXIsIE1hdGNoZXJzLm5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChleGVjdXRvckNsaWVudC5jdXN0b21TY2hlZHVsZXJBc0V4ZWN1dG9yLCBNYXRjaGVycy5ub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZXhlY3V0b3JDbGllbnQuY3VzdG9tTmFtZWRTY2hlZHVsZXJBc0V4ZWN1dG9yLCBNYXRjaGVycy5ub3ROdWxsVmFsdWUoKSk7CisKKyAgICAgICAgQ3VycmVudFRocmVhZE5hbWVSZXRyaWV2ZXJUYXNrIG5hbWVSZXRyaWV2ZXJUYXNrID0gbmV3IEN1cnJlbnRUaHJlYWROYW1lUmV0cmlldmVyVGFzaygpOworCisgICAgICAgIC8vIFRlc3QgYXV0aGVudGljaXR5IG9mIGluamVjdGVkIGV4ZWN1dG9ycworICAgICAgICBhc3NlcnRUaGF0KGV4ZWN1dG9yQ2xpZW50LmN1c3RvbUV4ZWN1dG9yLnN1Ym1pdChuYW1lUmV0cmlldmVyVGFzaykuZ2V0KCksCisgICAgICAgICAgICAgICAgTWF0Y2hlcnMuc3RhcnRzV2l0aCgiY3VzdG9tLWV4ZWN1dG9yLSIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChleGVjdXRvckNsaWVudC5jdXN0b21OYW1lZEV4ZWN1dG9yLnN1Ym1pdChuYW1lUmV0cmlldmVyVGFzaykuZ2V0KCksCisgICAgICAgICAgICAgICAgTWF0Y2hlcnMuc3RhcnRzV2l0aCgiY3VzdG9tLW5hbWVkLWV4ZWN1dG9yLSIpKTsKKworICAgICAgICAvLyBUZXN0IGF1dGhlbnRpY2l0eSBvZiBpbmplY3RlZCBzY2hlZHVsZXJzCisgICAgICAgIGFzc2VydFRoYXQoZXhlY3V0b3JDbGllbnQuY3VzdG9tU2NoZWR1bGVyLnN1Ym1pdChuYW1lUmV0cmlldmVyVGFzaykuZ2V0KCksCisgICAgICAgICAgICAgICAgTWF0Y2hlcnMuc3RhcnRzV2l0aCgiY3VzdG9tLXNjaGVkdWxlci0iKSk7CisgICAgICAgIGFzc2VydFRoYXQoZXhlY3V0b3JDbGllbnQuY3VzdG9tTmFtZWRTY2hlZHVsZXIuc3VibWl0KG5hbWVSZXRyaWV2ZXJUYXNrKS5nZXQoKSwKKyAgICAgICAgICAgICAgICBNYXRjaGVycy5zdGFydHNXaXRoKCJjdXN0b20tbmFtZWQtc2NoZWR1bGVyLSIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChleGVjdXRvckNsaWVudC5jdXN0b21TY2hlZHVsZXJBc0V4ZWN1dG9yLnN1Ym1pdChuYW1lUmV0cmlldmVyVGFzaykuZ2V0KCksCisgICAgICAgICAgICAgICAgTWF0Y2hlcnMuc3RhcnRzV2l0aCgiY3VzdG9tLXNjaGVkdWxlci0iKSk7CisgICAgICAgIGFzc2VydFRoYXQoZXhlY3V0b3JDbGllbnQuY3VzdG9tTmFtZWRTY2hlZHVsZXJBc0V4ZWN1dG9yLnN1Ym1pdChuYW1lUmV0cmlldmVyVGFzaykuZ2V0KCksCisgICAgICAgICAgICAgICAgTWF0Y2hlcnMuc3RhcnRzV2l0aCgiY3VzdG9tLW5hbWVkLXNjaGVkdWxlci0iKSk7CisKKyAgICAgICAgLy8gVGVzdCBwcm9wZXIgZXhlY3V0b3Igc2h1dGRvd24gd2hlbiBsb2NhdG9yIGlzIHNodXQgZG93bi4KKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5zaHV0ZG93bigpOworCisgICAgICAgIGFzc2VydFRoYXQoIldhaXRpbmcgZm9yIHByZS1kZXN0cm95IHRpbWVkIG91dC4iLAorICAgICAgICAgICAgICAgIGV4ZWN1dG9yQ2xpZW50LnByZURlc3Ryb3lOb3RpZmllci5hd2FpdCgzLCBUaW1lVW5pdC5TRUNPTkRTKSwgTWF0Y2hlcnMuaXModHJ1ZSkpOworCisgICAgICAgIHRlc3RTaHV0RG93bigiY3VzdG9tRXhlY3V0b3IiLCBleGVjdXRvckNsaWVudC5jdXN0b21FeGVjdXRvcik7CisgICAgICAgIHRlc3RTaHV0RG93bigiY3VzdG9tTmFtZWRFeGVjdXRvciIsIGV4ZWN1dG9yQ2xpZW50LmN1c3RvbU5hbWVkRXhlY3V0b3IpOworICAgICAgICB0ZXN0U2h1dERvd24oImN1c3RvbVNjaGVkdWxlciIsIGV4ZWN1dG9yQ2xpZW50LmN1c3RvbVNjaGVkdWxlcik7CisgICAgICAgIHRlc3RTaHV0RG93bigiY3VzdG9tTmFtZWRTY2hlZHVsZXIiLCBleGVjdXRvckNsaWVudC5jdXN0b21OYW1lZFNjaGVkdWxlcik7CisgICAgICAgIHRlc3RTaHV0RG93bigiY3VzdG9tU2NoZWR1bGVyQXNFeGVjdXRvciIsIGV4ZWN1dG9yQ2xpZW50LmN1c3RvbVNjaGVkdWxlckFzRXhlY3V0b3IpOworICAgICAgICB0ZXN0U2h1dERvd24oImN1c3RvbU5hbWVkU2NoZWR1bGVyQXNFeGVjdXRvciIsIGV4ZWN1dG9yQ2xpZW50LmN1c3RvbU5hbWVkU2NoZWR1bGVyQXNFeGVjdXRvcik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RTaHV0RG93bihTdHJpbmcgbmFtZSwgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yU2VydmljZSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShuYW1lICsgIiBub3Qgc2h1dGRvd24iLCBleGVjdXRvclNlcnZpY2UuaXNTaHV0ZG93bigpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShuYW1lICsgIiBub3QgdGVybWluYXRlZCIsIGV4ZWN1dG9yU2VydmljZS5pc1Rlcm1pbmF0ZWQoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL3Byb2Nlc3MvaW50ZXJuYWwvUmVxdWVzdFNjb3BlVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9wcm9jZXNzL2ludGVybmFsL1JlcXVlc3RTY29wZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmEyM2U5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9wcm9jZXNzL2ludGVybmFsL1JlcXVlc3RTY29wZVRlc3QuamF2YQpAQCAtMCwwICsxLDE3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uLnByb2Nlc3MuaW50ZXJuYWw7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0LmhrMi5IazJSZXF1ZXN0U2NvcGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkZvcmVpZ25EZXNjcmlwdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWwuUmVxdWVzdFNjb3BlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIuYXBpLlNlcnZpY2VIYW5kbGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIudXRpbGl0aWVzLkFic3RyYWN0QWN0aXZlRGVzY3JpcHRvcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogVGVzdCBvZiB0aGUge0BsaW5rIFJlcXVlc3RTY29wZSByZXF1ZXN0IHNjb3BlfS4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBSZXF1ZXN0U2NvcGVUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNjb3BlV2l0aENyZWF0ZWRJbnN0YW5jZSgpIHsKKyAgICAgICAgZmluYWwgUmVxdWVzdFNjb3BlIHJlcXVlc3RTY29wZSA9IG5ldyBIazJSZXF1ZXN0U2NvcGUoKTsKKyAgICAgICAgYXNzZXJ0TnVsbChyZXF1ZXN0U2NvcGUuc3VzcGVuZEN1cnJlbnQoKSk7CisgICAgICAgIGZpbmFsIEhrMlJlcXVlc3RTY29wZS5JbnN0YW5jZSBjb250ZXh0ID0gKEhrMlJlcXVlc3RTY29wZS5JbnN0YW5jZSkgcmVxdWVzdFNjb3BlLmNyZWF0ZUNvbnRleHQoKTsKKyAgICAgICAgRm9yZWlnbkRlc2NyaXB0b3IgaW5oYWIgPSBGb3JlaWduRGVzY3JpcHRvci53cmFwKG5ldyBUZXN0UHJvdmlkZXIoImEiKSk7CisgICAgICAgIGNvbnRleHQucHV0KGluaGFiLCAiMSIpOworICAgICAgICByZXF1ZXN0U2NvcGUucnVuSW5TY29wZShjb250ZXh0LCAoKSAtPiB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCBjb250ZXh0LmdldChpbmhhYikpOworICAgICAgICAgICAgY29udGV4dC5yZWxlYXNlKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCBjb250ZXh0LmdldChpbmhhYikpOworICAgICAgICB9KTsKKyAgICAgICAgYXNzZXJ0TnVsbChjb250ZXh0LmdldChpbmhhYikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNjb3BlUmVsZWFzZUluc2lkZVNjb3BlKCkgeworICAgICAgICBmaW5hbCBSZXF1ZXN0U2NvcGUgcmVxdWVzdFNjb3BlID0gbmV3IEhrMlJlcXVlc3RTY29wZSgpOworICAgICAgICBhc3NlcnROdWxsKHJlcXVlc3RTY29wZS5zdXNwZW5kQ3VycmVudCgpKTsKKyAgICAgICAgZmluYWwgSGsyUmVxdWVzdFNjb3BlLkluc3RhbmNlIGluc3RhbmNlID0gKEhrMlJlcXVlc3RTY29wZS5JbnN0YW5jZSkgcmVxdWVzdFNjb3BlLmNyZWF0ZUNvbnRleHQoKTsKKyAgICAgICAgRm9yZWlnbkRlc2NyaXB0b3IgaW5oYWIgPSBGb3JlaWduRGVzY3JpcHRvci53cmFwKG5ldyBUZXN0UHJvdmlkZXIoImEiKSk7CisgICAgICAgIGluc3RhbmNlLnB1dChpbmhhYiwgIjEiKTsKKyAgICAgICAgcmVxdWVzdFNjb3BlLnJ1bkluU2NvcGUoaW5zdGFuY2UsICgpIC0+IHsKKyAgICAgICAgICAgIGZpbmFsIEhrMlJlcXVlc3RTY29wZS5JbnN0YW5jZSBpbnRlcm5hbEluc3RhbmNlID0gKEhrMlJlcXVlc3RTY29wZS5JbnN0YW5jZSkgcmVxdWVzdFNjb3BlLnN1c3BlbmRDdXJyZW50KCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoaW50ZXJuYWxJbnN0YW5jZSwgaW5zdGFuY2UpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgaW5zdGFuY2UuZ2V0KGluaGFiKSk7CisgICAgICAgICAgICBpbnN0YW5jZS5yZWxlYXNlKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCBpbnN0YW5jZS5nZXQoaW5oYWIpKTsKKyAgICAgICAgfSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMSIsIGluc3RhbmNlLmdldChpbmhhYikpOworICAgICAgICBpbnN0YW5jZS5yZWxlYXNlKCk7CisgICAgICAgIGFzc2VydE51bGwoaW5zdGFuY2UuZ2V0KGluaGFiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2NvcGVXaXRoSW1wbGljaXRJbnN0YW5jZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXF1ZXN0U2NvcGUgcmVxdWVzdFNjb3BlID0gbmV3IEhrMlJlcXVlc3RTY29wZSgpOworICAgICAgICBhc3NlcnROdWxsKHJlcXVlc3RTY29wZS5zdXNwZW5kQ3VycmVudCgpKTsKKyAgICAgICAgRm9yZWlnbkRlc2NyaXB0b3IgaW5oYWIgPSBGb3JlaWduRGVzY3JpcHRvci53cmFwKG5ldyBUZXN0UHJvdmlkZXIoImEiKSk7CisgICAgICAgIGZpbmFsIEhrMlJlcXVlc3RTY29wZS5JbnN0YW5jZSBpbnN0YW5jZSA9IHJlcXVlc3RTY29wZS5ydW5JblNjb3BlKCgpIC0+IHsKKyAgICAgICAgICAgIGZpbmFsIEhrMlJlcXVlc3RTY29wZS5JbnN0YW5jZSBpbnRlcm5hbEluc3RhbmNlID0gKEhrMlJlcXVlc3RTY29wZS5JbnN0YW5jZSkgcmVxdWVzdFNjb3BlLnN1c3BlbmRDdXJyZW50KCk7CisgICAgICAgICAgICBhc3NlcnROdWxsKGludGVybmFsSW5zdGFuY2UuZ2V0KGluaGFiKSk7CisgICAgICAgICAgICBpbnRlcm5hbEluc3RhbmNlLnB1dChpbmhhYiwgIjEiKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMSIsIGludGVybmFsSW5zdGFuY2UuZ2V0KGluaGFiKSk7CisgICAgICAgICAgICByZXR1cm4gaW50ZXJuYWxJbnN0YW5jZTsKKyAgICAgICAgfSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMSIsIGluc3RhbmNlLmdldChpbmhhYikpOworICAgICAgICBpbnN0YW5jZS5yZWxlYXNlKCk7CisgICAgICAgIGFzc2VydE51bGwoaW5zdGFuY2UuZ2V0KGluaGFiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2NvcGVXaXRoVHdvSW50ZXJuYWxUYXNrcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXF1ZXN0U2NvcGUgcmVxdWVzdFNjb3BlID0gbmV3IEhrMlJlcXVlc3RTY29wZSgpOworICAgICAgICBhc3NlcnROdWxsKHJlcXVlc3RTY29wZS5zdXNwZW5kQ3VycmVudCgpKTsKKyAgICAgICAgRm9yZWlnbkRlc2NyaXB0b3IgaW5oYWIgPSBGb3JlaWduRGVzY3JpcHRvci53cmFwKG5ldyBUZXN0UHJvdmlkZXIoImEiKSk7CisgICAgICAgIGZpbmFsIEhrMlJlcXVlc3RTY29wZS5JbnN0YW5jZSBpbnN0YW5jZSA9IHJlcXVlc3RTY29wZS5ydW5JblNjb3BlKCgpIC0+IHsKKyAgICAgICAgICAgIGZpbmFsIEhrMlJlcXVlc3RTY29wZS5JbnN0YW5jZSBpbnRlcm5hbEluc3RhbmNlID0gKEhrMlJlcXVlc3RTY29wZS5JbnN0YW5jZSkgcmVxdWVzdFNjb3BlLnN1c3BlbmRDdXJyZW50KCk7CisKKyAgICAgICAgICAgIGZpbmFsIEhrMlJlcXVlc3RTY29wZS5JbnN0YW5jZSBhbm90aGVySW5zdGFuY2UgPSByZXF1ZXN0U2NvcGUucnVuSW5TY29wZSgoKSAtPiB7CisgICAgICAgICAgICAgICAgZmluYWwgSGsyUmVxdWVzdFNjb3BlLkluc3RhbmNlIGN1cnJlbnRJbnN0YW5jZSA9IChIazJSZXF1ZXN0U2NvcGUuSW5zdGFuY2UpIHJlcXVlc3RTY29wZS5zdXNwZW5kQ3VycmVudCgpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIWN1cnJlbnRJbnN0YW5jZS5lcXVhbHMoaW50ZXJuYWxJbnN0YW5jZSkpOworICAgICAgICAgICAgICAgIGN1cnJlbnRJbnN0YW5jZS5wdXQoaW5oYWIsICIxIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRJbnN0YW5jZTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSghYW5vdGhlckluc3RhbmNlLmVxdWFscyhpbnRlcm5hbEluc3RhbmNlKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCBhbm90aGVySW5zdGFuY2UuZ2V0KGluaGFiKSk7CisgICAgICAgICAgICBhbm90aGVySW5zdGFuY2UucmVsZWFzZSgpOworICAgICAgICAgICAgYXNzZXJ0TnVsbChhbm90aGVySW5zdGFuY2UuZ2V0KGluaGFiKSk7CisKKyAgICAgICAgICAgIHJldHVybiBpbnRlcm5hbEluc3RhbmNlOworICAgICAgICB9KTsKKyAgICAgICAgaW5zdGFuY2UucmVsZWFzZSgpOworICAgICAgICBhc3NlcnROdWxsKGluc3RhbmNlLmdldChpbmhhYikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlR2V0SW5zdGFuY2VDYWxscygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXF1ZXN0U2NvcGUgcmVxdWVzdFNjb3BlID0gbmV3IEhrMlJlcXVlc3RTY29wZSgpOworICAgICAgICBhc3NlcnROdWxsKHJlcXVlc3RTY29wZS5zdXNwZW5kQ3VycmVudCgpKTsKKyAgICAgICAgRm9yZWlnbkRlc2NyaXB0b3IgaW5oYWIgPSBGb3JlaWduRGVzY3JpcHRvci53cmFwKG5ldyBUZXN0UHJvdmlkZXIoImEiKSk7CisgICAgICAgIGZpbmFsIEhrMlJlcXVlc3RTY29wZS5JbnN0YW5jZSBpbnN0YW5jZSA9IHJlcXVlc3RTY29wZS5ydW5JblNjb3BlKCgpIC0+IHsKKyAgICAgICAgICAgIGZpbmFsIEhrMlJlcXVlc3RTY29wZS5JbnN0YW5jZSBpbnRlcm5hbEluc3RhbmNlID0gKEhrMlJlcXVlc3RTY29wZS5JbnN0YW5jZSkgcmVxdWVzdFNjb3BlLnN1c3BlbmRDdXJyZW50KCk7CisgICAgICAgICAgICBpbnRlcm5hbEluc3RhbmNlLnB1dChpbmhhYiwgIjEiKTsKKyAgICAgICAgICAgIHJlcXVlc3RTY29wZS5zdXNwZW5kQ3VycmVudCgpOworICAgICAgICAgICAgcmVxdWVzdFNjb3BlLnN1c3BlbmRDdXJyZW50KCk7CisgICAgICAgICAgICByZXF1ZXN0U2NvcGUuc3VzcGVuZEN1cnJlbnQoKTsKKyAgICAgICAgICAgIHJlcXVlc3RTY29wZS5zdXNwZW5kQ3VycmVudCgpOworICAgICAgICAgICAgcmV0dXJuIGludGVybmFsSW5zdGFuY2U7CisgICAgICAgIH0pOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCBpbnN0YW5jZS5nZXQoaW5oYWIpKTsKKyAgICAgICAgaW5zdGFuY2UucmVsZWFzZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCBpbnN0YW5jZS5nZXQoaW5oYWIpKTsKKyAgICAgICAgaW5zdGFuY2UucmVsZWFzZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCBpbnN0YW5jZS5nZXQoaW5oYWIpKTsKKyAgICAgICAgaW5zdGFuY2UucmVsZWFzZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCBpbnN0YW5jZS5nZXQoaW5oYWIpKTsKKyAgICAgICAgaW5zdGFuY2UucmVsZWFzZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCBpbnN0YW5jZS5nZXQoaW5oYWIpKTsKKyAgICAgICAgaW5zdGFuY2UucmVsZWFzZSgpOworICAgICAgICBhc3NlcnROdWxsKGluc3RhbmNlLmdldChpbmhhYikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgcmVxdWVzdCBzY29wZSBpbmhhYml0YW50LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RBY3RpdmVEZXNjcmlwdG9yPFN0cmluZz4geworCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGlkOworCisgICAgICAgIHB1YmxpYyBUZXN0UHJvdmlkZXIoZmluYWwgU3RyaW5nIGlkKSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICAgICAgdGhpcy5pZCA9IGlkOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDbGFzczw/PiBnZXRJbXBsZW1lbnRhdGlvbkNsYXNzKCkgeworICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5jbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVHlwZSBnZXRJbXBsZW1lbnRhdGlvblR5cGUoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SW1wbGVtZW50YXRpb25DbGFzcygpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlKGZpbmFsIFNlcnZpY2VIYW5kbGU8Pz4gcm9vdCkgeworICAgICAgICAgICAgcmV0dXJuIGlkOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi91cmkvaW50ZXJuYWwvSmVyc2V5VXJpQnVpbGRlclRlc3QuamF2YSBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vdXJpL2ludGVybmFsL0plcnNleVVyaUJ1aWxkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU4MzAxMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vdXJpL2ludGVybmFsL0plcnNleVVyaUJ1aWxkZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxNjMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb24udXJpLmludGVybmFsOworCitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUGF0aFNlZ21lbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudXJpLlVyaUNvbXBvbmVudDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS51cmkuaW50ZXJuYWwuSmVyc2V5VXJpQnVpbGRlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiBVcmkgYnVpbGRlciBpbXBsZW1lbnRhdGlvbiB0ZXN0LgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgVmV0bGUgTGVpbm9uZW4tUm9laW0gKHZldGxlIGF0IHJvZWltLm5ldCkKKyAqLworcHVibGljIGNsYXNzIEplcnNleVVyaUJ1aWxkZXJUZXN0IHsKKworICAgIHB1YmxpYyBKZXJzZXlVcmlCdWlsZGVyVGVzdCgpIHsKKyAgICB9CisKKyAgICAvLyBSZXByb2R1Y2VyIGZvciBKRVJTRVktMjUzNworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkS2VlcFRyYWlsaW5nU2xhc2goKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uLCBVUklTeW50YXhFeGNlcHRpb24geworICAgICAgICBmaW5hbCBVUkwgdXJsID0gbmV3IFVSTCgiaHR0cDovL2V4YW1wbGUuY29tL2F1dGhlbnRpY2F0aW9ucztlbWFpbD1qb2VAam9lLmNvbS8iKTsKKyAgICAgICAgZmluYWwgVXJpQnVpbGRlciBidWlsZGVyID0gVXJpQnVpbGRlci5mcm9tUGF0aCh1cmwuZ2V0UGF0aCgpKS5yZXBsYWNlTWF0cml4KG51bGwpOworCisgICAgICAgIGZpbmFsIFVSSSByZXN1bHQgPSBidWlsZGVyLmJ1aWxkKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiL2F1dGhlbnRpY2F0aW9ucy8iLCByZXN1bHQudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgLy8gUmVwcm9kdWNlciBmb3IgSkVSU0VZLTI1MzcKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNob3VsZFJlbW92ZUFsbEluY2x1ZGluZ1NlbWljb2xvbigpIHRocm93cyBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFVSTCB1cmwgPSBuZXcgVVJMKCJodHRwOi8vZXhhbXBsZS5jb20vYXV0aGVudGljYXRpb25zO2VtYWlsPWpvZUBqb2UuY29tIik7CisgICAgICAgIGZpbmFsIFVyaUJ1aWxkZXIgYnVpbGRlciA9IFVyaUJ1aWxkZXIuZnJvbVBhdGgodXJsLmdldFBhdGgoKSkucmVwbGFjZU1hdHJpeChudWxsKTsKKworICAgICAgICBmaW5hbCBVUkkgcmVzdWx0ID0gYnVpbGRlci5idWlsZCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9hdXRoZW50aWNhdGlvbnMiLCByZXN1bHQudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgLy8gUmVwcm9kdWNlciBmb3IgSkVSU0VZLTI1MzcKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNob3VsZExlYXZlVVJJVW50b3VjaGVkKCkgeworICAgICAgICBmaW5hbCBVcmlCdWlsZGVyIGJ1aWxkZXIgPSBVcmlCdWlsZGVyLmZyb21QYXRoKCIvYXBwbGVzO29yZGVyPXJhbmRvbTtjb2xvcj1ibHVlLzIwMDYiKS5yZXBsYWNlTWF0cml4KG51bGwpOworICAgICAgICBmaW5hbCBVUkkgcmVzdWx0ID0gYnVpbGRlci5idWlsZCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9hcHBsZXM7b3JkZXI9cmFuZG9tO2NvbG9yPWJsdWUvMjAwNiIsIHJlc3VsdC50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICAvLyBSZXByb2R1Y2VyIGZvciBKRVJTRVktMjUzNworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2hvdWxkTGVhdmVVUklVbnRvdWNoZWRBbmRLZWVwU2xhc2goKSB7CisgICAgICAgIGZpbmFsIFVyaUJ1aWxkZXIgYnVpbGRlciA9IFVyaUJ1aWxkZXIuZnJvbVBhdGgoIi9hcHBsZXM7b3JkZXI9cmFuZG9tO2NvbG9yPWJsdWUvMjAwNi8iKS5yZXBsYWNlTWF0cml4KG51bGwpOworICAgICAgICBmaW5hbCBVUkkgcmVzdWx0ID0gYnVpbGRlci5idWlsZCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9hcHBsZXM7b3JkZXI9cmFuZG9tO2NvbG9yPWJsdWUvMjAwNi8iLCByZXN1bHQudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgLy8gUmVwcm9kdWNlciBmb3IgSkVSU0VZLTI1MzcKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNob3VsZE9ubHlSZW1vdmVNYXRyaXhJbkZpbmFsU2VnbWVudCgpIHsKKyAgICAgICAgZmluYWwgVXJpQnVpbGRlciBidWlsZGVyID0gVXJpQnVpbGRlci5mcm9tUGF0aCgiL2FwcGxlcztvcmRlcj1yYW5kb207Y29sb3I9Ymx1ZS8yMDA2L2Jhcjt6b3Q9YmF6IikucmVwbGFjZU1hdHJpeChudWxsKTsKKyAgICAgICAgZmluYWwgVVJJIHJlc3VsdCA9IGJ1aWxkZXIuYnVpbGQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvYXBwbGVzO29yZGVyPXJhbmRvbTtjb2xvcj1ibHVlLzIwMDYvYmFyIiwgcmVzdWx0LnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIC8vIFJlcHJvZHVjZXIgZm9yIEpFUlNFWS0yNTM3CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRPbmx5UmVtb3ZlTWF0cml4SW5GaW5hbFNlZ21lbnRBbmRLZWVwU2xhc2goKSB7CisgICAgICAgIGZpbmFsIFVyaUJ1aWxkZXIgYnVpbGRlciA9IFVyaUJ1aWxkZXIuZnJvbVBhdGgoIi9hcHBsZXM7b3JkZXI9cmFuZG9tO2NvbG9yPWJsdWUvMjAwNi9iYXI7em90PWJhei8iKS5yZXBsYWNlTWF0cml4KG51bGwpOworICAgICAgICBmaW5hbCBVUkkgcmVzdWx0ID0gYnVpbGRlci5idWlsZCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9hcHBsZXM7b3JkZXI9cmFuZG9tO2NvbG9yPWJsdWUvMjAwNi9iYXIvIiwgcmVzdWx0LnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIC8vIFJlcHJvZHVjZXIgZm9yIEpFUlNFWS0yMDM2CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZU5vbkFzY2lpUXVlcnlQYXJhbSgpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uLCBNYWxmb3JtZWRVUkxFeGNlcHRpb24sIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFVSTCB1cmwgPSBuZXcgVVJMKCJodHRwOi8vZXhhbXBsZS5jb20vZ2V0TXlOYW1lP27DqW1lPXQiKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHF1ZXJ5ID0gdXJsLmdldFF1ZXJ5KCk7CisKKyAgICAgICAgZmluYWwgVXJpQnVpbGRlciBidWlsZGVyID0gVXJpQnVpbGRlci5mcm9tUGF0aCh1cmwuZ2V0UGF0aCgpKS5zY2hlbWUodXJsLmdldFByb3RvY29sKCkpLmhvc3QodXJsLmdldEhvc3QoKSkKKyAgICAgICAgICAgICAgICAucG9ydCh1cmwuZ2V0UG9ydCgpKQorICAgICAgICAgICAgICAgIC5yZXBsYWNlUXVlcnkocXVlcnkpLmZyYWdtZW50KHVybC5nZXRSZWYoKSk7CisKKyAgICAgICAgLy8gUmVwbGFjZSBRdWVyeVBhcmFtLgorICAgICAgICBmaW5hbCBTdHJpbmcgcGFybU5hbWUgPSAibsOpbWUiOworICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUgPSAidmFsdWUiOworCisgICAgICAgIGJ1aWxkZXIucmVwbGFjZVF1ZXJ5UGFyYW0ocGFybU5hbWUsIHZhbHVlKTsKKworICAgICAgICBmaW5hbCBVUkkgcmVzdWx0ID0gYnVpbGRlci5idWlsZCgpOworICAgICAgICBmaW5hbCBVUkkgZXhwZWN0ZWQgPSBuZXcgVVJJKCJodHRwOi8vZXhhbXBsZS5jb20vZ2V0TXlOYW1lP27DqW1lPXZhbHVlIik7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZC50b0FTQ0lJU3RyaW5nKCksIHJlc3VsdC50b0FTQ0lJU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgLy8gU2VlIEpBWF9SU19TUEVDLTI0NQorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNpbmdVc2VySW5mbygpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHVzZXJJbmZvID0gImZvbzpmb28iOworCisgICAgICAgIFVSSSB1cmk7CisgICAgICAgIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2ZvbzI6Zm9vMkBsb2NhbGhvc3Q6ODA4MCIpLnVzZXJJbmZvKHVzZXJJbmZvKS5idWlsZCgpOworICAgICAgICBhc3NlcnRFcXVhbHModXNlckluZm8sIHVyaS5nZXRSYXdVc2VySW5mbygpKTsKKworICAgICAgICB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCIpLnVzZXJJbmZvKHVzZXJJbmZvKS5idWlsZCgpOworICAgICAgICBhc3NlcnRFcXVhbHModXNlckluZm8sIHVyaS5nZXRSYXdVc2VySW5mbygpKTsKKyAgICB9CisKKyAgICAvLyBSZXByb2R1Y2VyIGZvciBKRVJTRVktMTgwMAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5VXJpU3RyaW5nKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFVSSSB1cmkgPSBVUkkuY3JlYXRlKCIiKTsKKyAgICAgICAgSmVyc2V5VXJpQnVpbGRlciB1YiA9IG5ldyBKZXJzZXlVcmlCdWlsZGVyKCkudXJpKCJuZXdzOmNvbXAubGFuZy5qYXZhIikudXJpKHVyaSk7CisgICAgICAgIGFzc2VydEVxdWFscygibmV3czoiLCB1Yi50b1RlbXBsYXRlKCkpOworICAgICAgICAvLyBub3RlIHRoYXQgZXZlbiB0aG91Z2ggdGhlIFVSSSBpcyB2YWxpZCBhY2NvcmRpbmcgdG8gUkZDIDM5ODYsCisgICAgICAgIC8vIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBjcmVhdGUgYSBqYXZhLm5ldC5VUkkgZnJvbSB0aGlzIGJ1aWxkZXIgaWYgU1NQIGlzIGVtcHR5CisKKyAgICAgICAgdWIgPSBuZXcgSmVyc2V5VXJpQnVpbGRlcigpLnVyaSgibmV3czpjb21wLmxhbmcuamF2YSIpLnVyaSgiIik7CisgICAgICAgIGFzc2VydEVxdWFscygibmV3czoiLCB1Yi50b1RlbXBsYXRlKCkpOworICAgICAgICAvLyBub3RlIHRoYXQgZXZlbiB0aG91Z2ggdGhlIFVSSSBpcyB2YWxpZCBhY2NvcmRpbmcgdG8gUkZDIDM5ODYsCisgICAgICAgIC8vIGl0IGlzIG5vdCBwb3NzaWJsZSB0byBjcmVhdGUgYSBqYXZhLm5ldC5VUkkgZnJvbSB0aGlzIGJ1aWxkZXIgaWYgU1NQIGlzIGVtcHR5CisgICAgfQorCisgICAgLy8gUmVwcm9kdWNlciBmb3IgSkVSU0VZLTI3NTMKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVcmlCdWlsZGVyU2hvdWxkTGVhdmVSZWxhdGl2ZVBhdGhSZWxhdGl2ZSgpIHsKKyAgICAgICAgZmluYWwgVXJpQnVpbGRlciBidWlsZGVyID0gSmVyc2V5VXJpQnVpbGRlci5mcm9tUGF0aCgiIik7CisgICAgICAgIGJ1aWxkZXIuc2NoZW1lKCJodHRwIik7CisgICAgICAgIGJ1aWxkZXIucmVwbGFjZVBhdGgoInBhdGgiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6cGF0aCIsIGJ1aWxkZXIuYnVpbGQoKS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUb1RlbXBsYXRlKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEplcnNleVVyaUJ1aWxkZXIgdWIgPSBuZXcgSmVyc2V5VXJpQnVpbGRlcigpLnVyaShuZXcgVVJJKCJodHRwOi8vZXhhbXBsZXMuamVyc2V5LmphdmEubmV0LyIpKS51c2VySW5mbygie1QxfSIpCisgICAgICAgICAgICAgICAgLnBhdGgoIntUMn0iKS5zZWdtZW50KCJ7VDN9IikucXVlcnlQYXJhbSgiYSIsICJ7VDR9IiwgInYxIikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgiYiIsICJ2MiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly97VDF9QGV4YW1wbGVzLmplcnNleS5qYXZhLm5ldC97VDJ9L3tUM30/YT17VDR9JmE9djEmYj12MiIsIHViLnRvVGVtcGxhdGUoKSk7CisKKyAgICAgICAgdWIucXVlcnlQYXJhbSgiYSIsICJ2MyIpLnF1ZXJ5UGFyYW0oImMiLCAidjQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8ve1QxfUBleGFtcGxlcy5qZXJzZXkuamF2YS5uZXQve1QyfS97VDN9P2E9e1Q0fSZhPXYxJmI9djImYT12MyZjPXY0IiwgdWIudG9UZW1wbGF0ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXRoVGVtcGxhdGVWYWx1ZUVuY29kaW5nKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyByZXN1bHQ7CisgICAgICAgIHJlc3VsdCA9IG5ldyBKZXJzZXlVcmlCdWlsZGVyKCkudXJpKG5ldyBVUkkoImh0dHA6Ly9leGFtcGxlcy5qZXJzZXkuamF2YS5uZXQvIikpLnVzZXJJbmZvKCJhL2IiKS5wYXRoKCJhL2IiKQorICAgICAgICAgICAgICAgIC5zZWdtZW50KCJhL2IiKS5idWlsZCgpLnRvU3RyaW5nKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL2ElMkZiQGV4YW1wbGVzLmplcnNleS5qYXZhLm5ldC9hL2IvYSUyRmIiLCByZXN1bHQpOworCisgICAgICAgIHJlc3VsdCA9IG5ldyBKZXJzZXlVcmlCdWlsZGVyKCkudXJpKG5ldyBVUkkoImh0dHA6Ly9leGFtcGxlcy5qZXJzZXkuamF2YS5uZXQvIikpLnVzZXJJbmZvKCJ7VDF9IikucGF0aCgie1QyfSIpCisgICAgICAgICAgICAgICAgLnNlZ21lbnQoIntUM30iKS5idWlsZCgiYS9iIiwgImEvYiIsICJhL2IiKS50b1N0cmluZygpOworICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9hJTJGYkBleGFtcGxlcy5qZXJzZXkuamF2YS5uZXQvYSUyRmIvYSUyRmIiLCByZXN1bHQpOworCisgICAgICAgIHJlc3VsdCA9IG5ldyBKZXJzZXlVcmlCdWlsZGVyKCkudXJpKG5ldyBVUkkoImh0dHA6Ly9leGFtcGxlcy5qZXJzZXkuamF2YS5uZXQvIikpLnVzZXJJbmZvKCJ7VDF9IikucGF0aCgie1QyfSIpCisgICAgICAgICAgICAgICAgLnNlZ21lbnQoIntUM30iKS5idWlsZChuZXcgT2JqZWN0W10geyJhL2IiLCAiYS9iIiwgImEvYiJ9LCBmYWxzZSkudG9TdHJpbmcoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vYSUyRmJAZXhhbXBsZXMuamVyc2V5LmphdmEubmV0L2EvYi9hL2IiLCByZXN1bHQpOworCisgICAgICAgIHJlc3VsdCA9IG5ldyBKZXJzZXlVcmlCdWlsZGVyKCkudXJpKG5ldyBVUkkoImh0dHA6Ly9leGFtcGxlcy5qZXJzZXkuamF2YS5uZXQvIikpLnVzZXJJbmZvKCJ7VDF9IikucGF0aCgie1QyfSIpCisgICAgICAgICAgICAgICAgLnNlZ21lbnQoIntUMn0iKS5idWlsZCgiYUBiIiwgImFAYiIpLnRvU3RyaW5nKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL2ElNDBiQGV4YW1wbGVzLmplcnNleS5qYXZhLm5ldC9hQGIvYUBiIiwgcmVzdWx0KTsKKworICAgICAgICByZXN1bHQgPSBuZXcgSmVyc2V5VXJpQnVpbGRlcigpLnVyaShuZXcgVVJJKCJodHRwOi8vZXhhbXBsZXMuamVyc2V5LmphdmEubmV0LyIpKS51c2VySW5mbygie1R9IikucGF0aCgie1R9IikKKyAgICAgICAgICAgICAgICAuc2VnbWVudCgie1R9IikuYnVpbGQoImFAYiIpLnRvU3RyaW5nKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL2ElNDBiQGV4YW1wbGVzLmplcnNleS5qYXZhLm5ldC9hQGIvYUBiIiwgcmVzdWx0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlTWF0cml4UGFyYW1XaXRoTnVsbCgpIHsKKyAgICAgICAgZmluYWwgVXJpQnVpbGRlciBidWlsZGVyID0gbmV3IEplcnNleVVyaUJ1aWxkZXIoKS5tYXRyaXhQYXJhbSgibWF0cml4IiwgInBhcmFtMSIsICJwYXJhbTIiKTsKKyAgICAgICAgYnVpbGRlci5yZXBsYWNlTWF0cml4UGFyYW0oIm1hdHJpeCIsIChPYmplY3RbXSkgbnVsbCk7CisgICAgICAgIGFzc2VydEVxdWFscyhidWlsZGVyLmJ1aWxkKCkudG9TdHJpbmcoKSwgIiIpOworICAgIH0KKworICAgIC8vIGZvciBjb21wbGV0ZW5lc3MgKGFkZGVkIGFsb25nIHdpdGggcmVncmVzc2lvbiB0ZXN0cyBmb3IgSkVSU0VZLTExMTQpCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnVpbGROb1NsYXNoVXJpKCkgeworICAgICAgICBmaW5hbCBVcmlCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgSmVyc2V5VXJpQnVpbGRlcigpLnVyaShVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAiKSkucGF0aCgidGVzdCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC90ZXN0IiwgYnVpbGRlci5idWlsZCgpLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIC8vIHJlZ3Jlc3Npb24gdGVzdCBmb3IgSkVSU0VZLTExMTQKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCdWlsZEZyb21NYXBOb1NsYXNoSW5VcmkoKSB7CisgICAgICAgIGZpbmFsIFVyaUJ1aWxkZXIgYnVpbGRlciA9IG5ldyBKZXJzZXlVcmlCdWlsZGVyKCkudXJpKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCIpKS5wYXRoKCJ0ZXN0Iik7CisgICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3Rlc3QiLCBidWlsZGVyLmJ1aWxkRnJvbU1hcChuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKSkudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgLy8gcmVncmVzc2lvbiB0ZXN0IGZvciBKRVJTRVktMTExNAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ1aWxkRnJvbUFycmF5Tm9TbGFzaEluVXJpKCkgeworICAgICAgICBmaW5hbCBVcmlCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgSmVyc2V5VXJpQnVpbGRlcigpLnVyaShVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAiKSkucGF0aCgidGVzdCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC90ZXN0IiwgYnVpbGRlci5idWlsZCgidGVzdGluZyIpLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcGxhY2VOdWxsTWF0cml4UGFyYW0oKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgSmVyc2V5VXJpQnVpbGRlcigpLnJlcGxhY2VNYXRyaXhQYXJhbShudWxsLCAicGFyYW0iKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGZhaWwoIkV4cGVjdGVkIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBidXQgZ290ICIgKyBlLnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIGZhaWwoIkV4cGVjdGVkIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBidXQgbm8gZXhjZXB0aW9uIHdhcyB0aHJvd24uIik7CisgICAgfQorCisgICAgLy8gcmVncmVzc2lvbiB0ZXN0IGZvciBKRVJTRVktMTA4MQorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcGxhY2VRdWVyeVBhcmFtKCkgeworICAgICAgICBmaW5hbCBVUkkgdXJpID0gbmV3IEplcnNleVVyaUJ1aWxkZXIoKS5wYXRoKCJodHRwOi8vbG9jYWxob3N0LyIpLnJlcGxhY2VRdWVyeVBhcmFtKCJmb28iLCAidGVzdCIpLmJ1aWxkKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL2xvY2FsaG9zdC8/Zm9vPXRlc3QiLCB1cmkudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgLy8gcmVncmVzc2lvbiB0ZXN0IGZvciBKRVJTRVktMTA4MQorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcGxhY2VRdWVyeVBhcmFtQW5kQ2xvbmUoKSB7CisgICAgICAgIGZpbmFsIFVSSSB1cmkgPSBuZXcgSmVyc2V5VXJpQnVpbGRlcigpLnBhdGgoImh0dHA6Ly9sb2NhbGhvc3QvIikucmVwbGFjZVF1ZXJ5UGFyYW0oImZvbyIsICJ0ZXN0IikuY2xvbmUoKS5idWlsZCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9sb2NhbGhvc3QvP2Zvbz10ZXN0IiwgdXJpLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIC8vIHJlZ3Jlc3Npb24gdGVzdCBmb3IgSkVSU0VZLTEzNDEKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eVF1ZXJ5UGFyYW1WYWx1ZSgpIHsKKyAgICAgICAgZmluYWwgVVJJIHVyaSA9IG5ldyBKZXJzZXlVcmlCdWlsZGVyKCkucGF0aCgiaHR0cDovL2xvY2FsaG9zdC8iKS5xdWVyeVBhcmFtKCJ0ZXN0IiwgIiIpLmJ1aWxkKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL2xvY2FsaG9zdC8/dGVzdD0iLCB1cmkudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgLy8gcmVncmVzc2lvbiB0ZXN0IGZvciBKRVJTRVktMTQ1NworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENoYW5nZVNzcFZpYVN0cmluZ1VyaVRlbXBsYXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZ1tdIG9yaWdVcmlzID0gbmV3IFN0cmluZ1tdIHsibmV3czpjb21wLmxhbmcuamF2YSIsICJ0ZWw6KzEtODE2LTU1NS0xMjEyIn07CisgICAgICAgIGZpbmFsIFVSSVtdIHJlcGxhY2VVcmlzID0gbmV3IFVSSVtdIHtuZXcgVVJJKG51bGwsICJuZXdzLmxhbmcuamF2YSIsIG51bGwpLCBuZXcgVVJJKG51bGwsICIrMS04NjYtNTU1LTEyMTIiLCBudWxsKX07CisgICAgICAgIGZpbmFsIFN0cmluZ1tdIHJlc3VsdHMgPSBuZXcgU3RyaW5nW10geyJuZXdzOm5ld3MubGFuZy5qYXZhIiwgInRlbDorMS04NjYtNTU1LTEyMTIifTsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICB3aGlsZSAoaSA8IG9yaWdVcmlzLmxlbmd0aCkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdHNbaV0sCisgICAgICAgICAgICAgICAgICAgIFVyaUJ1aWxkZXIuZnJvbVVyaShuZXcgVVJJKG9yaWdVcmlzW2ldKSkudXJpKHJlcGxhY2VVcmlzW2ldLnRvQVNDSUlTdHJpbmcoKSkuYnVpbGQoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENoYW5nZVVyaVN0cmluZ0FmdGVyQ2hhbmdpbmdPcGFxdWVTY2hlbWVUb0h0dHAoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL3d3dy5leGFtcGxlLm9yZy90ZXN0IiwKKyAgICAgICAgICAgICAgICBVcmlCdWlsZGVyLmZyb21VcmkoInRlbDorMS04MTYtNTU1LTEyMTIiKS5zY2hlbWUoImh0dHAiKS51cmkoIi8vd3d3Lntob3N0fS5vcmciKS5wYXRoKCJ0ZXN0IikuYnVpbGQoImV4YW1wbGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVyaUJ1aWxkZXJUZW1wbGF0ZXNTaW1wbGUoKSB7CisgICAgICAgIHRlc3RVcmkoImE6L3BhdGgiKTsKKyAgICAgICAgdGVzdFVyaSgiYTovcCIpOworICAgICAgICB0ZXN0VXJpKCJhOi9wYXRoL3gveS96Iik7CisgICAgICAgIHRlc3RVcmkoImE6L3BhdGgveD9xPTEyI2ZyYWdtZW50Iik7CisgICAgICAgIHRlc3RVcmkoImE6L3A/cSNmIik7CisgICAgICAgIHRlc3RVcmkoImE6Ly9ob3N0Iik7CisgICAgICAgIHRlc3RVcmkoImE6Ly9ob3N0OjU1NTUvYS9iIik7CisgICAgICAgIHRlc3RVcmkoImE6Ly9oOjUvYS9iIik7CisgICAgICAgIHRlc3RVcmkoImE6L3VzZXJAaG9zdDoxMjM0NSIpOyAgICAgICAgIC8vdXNlckBob3N0OjEyMzQ1IGlzIG5vdCBhdXRob3JpdHkgYnV0IHBhdGgKKyAgICAgICAgdGVzdFVyaSgiYTovdXNlckBob3N0OjEyMzQ1L2EvYi9jIik7CisgICAgICAgIHRlc3RVcmkoImE6L3VzZXJAaG9zdDoxMjM0NS9hL2IvYz9hYWEmYmJiI2NjYyIpOworICAgICAgICB0ZXN0VXJpKCJhOi91c2VyQGhvc3QuaGhoLmRkZC5jOjEyMzQ1L2EvYi9jP2FhYSZiYmIjY2NjIik7CisgICAgICAgIHRlc3RVcmkoIi9hIik7CisgICAgICAgIHRlc3RVcmkoIi9hLy4uLy4uL2IvYy9kIik7CisgICAgICAgIHRlc3RVcmkoIi8vbG9jYWxob3N0OjgwL2EvYiIpOworICAgICAgICB0ZXN0VXJpKCIvL2w6OC9hL2IiKTsKKyAgICAgICAgdGVzdFVyaSgiYS9iIik7CisgICAgICAgIHRlc3RVcmkoImEiKTsKKyAgICAgICAgdGVzdFVyaSgiLi4vLi4vcyIpOworICAgICAgICB0ZXN0VXJpKCJtYWlsdG86dGVzdEB0ZXN0LmNvbSIpOworICAgICAgICB0ZXN0VXJpKCJodHRwOi8vb3JhY0BsZTpjb0BtOjEyMzQvYS9iL2NjYz9hI2ZyIik7CisgICAgICAgIHRlc3RVcmkoImh0dHA6Ly9bOjpGRkZGOjEyOS4xNDQuNTIuMzhdOjEyMzQvYS9iL2NjYz9hI2ZyIik7CisgICAgICAgIHRlc3RVcmkoImh0dHA6Ly9bRkVEQzpCQTk4Ojc2NTQ6MzIxMDpGRURDOkJBOTg6NzY1NDozMjEwXToxMjM0L2EvYi9jY2M/YSNmciIpOworCisgICAgfQorCisgICAgQFRlc3QKKyAgICBASWdub3JlCisgICAgcHVibGljIHZvaWQgZmFpbGluZ1Rlc3RzKCkgeworICAgICAgICB0ZXN0VXJpKCJhOi8vI2ZyYWdtZW50Iik7IC8vIGZhaWxzIGluIEplcnNleVVyaUJ1aWxkZXIKKyAgICAgICAgdGVzdFVyaSgiYTovLz9xdWVyeSIpOworCisgICAgICAgIC8vIGZhaWxzOiBvcGFxdWUgdXJpcyBhcmUgbm90IHN1cHBvcnRlZCBieSBVcmlUZW1wbGF0ZQorICAgICAgICBmaW5hbCBVUkkgdXJpID0gbmV3IEplcnNleVVyaUJ1aWxkZXIoKS51cmkoIntzY2hlbWV9Oi8ve21haWx0b30iKS5idWlsZCgibWFpbHRvIiwgImVtYWlsQHRlc3QudHR0Iik7CisgICAgICAgIGFzc2VydEVxdWFscygibWFpbHRvOmVtYWlsQHRlc3QudHR0IiwgdXJpLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVyaUJ1aWxkZXJUZW1wbGF0ZXMoKSB7CisgICAgICAgIFVSSSB1cmkgPSBuZXcgSmVyc2V5VXJpQnVpbGRlcigpLnVyaSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3twYXRofSIpLmJ1aWxkKCJhL2IvYyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hJTJGYiUyRmMiLCB1cmkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgdXJpID0gbmV3IEplcnNleVVyaUJ1aWxkZXIoKS51cmkoIntzY2hlbWV9Oi8ve2hvc3R9IikuYnVpbGQoImh0dHAiLCAibG9jYWxob3N0Iik7CisgICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL2xvY2FsaG9zdCIsIHVyaS50b1N0cmluZygpKTsKKworICAgICAgICB1cmkgPSBuZXcgSmVyc2V5VXJpQnVpbGRlcigpLnVyaSgiaHR0cDovL3tob3N0fTo4MDgwL3twYXRofSIpLmJ1aWxkKCJsIiwgImEvYi9jIik7CisgICAgICAgIGFzc2VydEVxdWFscygiaHR0cDovL2w6ODA4MC9hJTJGYiUyRmMiLCB1cmkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgdXJpID0gbmV3IEplcnNleVVyaUJ1aWxkZXIoKS51cmkoIntzY2hlbWV9Oi8ve2hvc3R9Ontwb3J0fS97cGF0aH0iKS5idWlsZCgicyIsICJoIiwgbmV3IEludGVnZXIoMSksICJhIik7CisgICAgICAgIGFzc2VydEVxdWFscygiczovL2g6MS9hIiwgdXJpLnRvU3RyaW5nKCkpOworCisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gdmFsdWVzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisgICAgICAgIHZhbHVlcy5wdXQoInNjaGVtZSIsICJzIik7CisgICAgICAgIHZhbHVlcy5wdXQoImhvc3QiLCAiaCIpOworICAgICAgICB2YWx1ZXMucHV0KCJwb3J0IiwgMSk7CisgICAgICAgIHZhbHVlcy5wdXQoInBhdGgiLCAicC9wIik7CisgICAgICAgIHZhbHVlcy5wdXQoInF1ZXJ5IiwgInEiKTsKKyAgICAgICAgdmFsdWVzLnB1dCgiZnJhZ21lbnQiLCAiZiIpOworCisgICAgICAgIHVyaSA9IG5ldyBKZXJzZXlVcmlCdWlsZGVyKCkudXJpKCJ7c2NoZW1lfTovL3tob3N0fTp7cG9ydH0ve3BhdGh9P3txdWVyeX0je2ZyYWdtZW50fSIpLmJ1aWxkRnJvbU1hcCh2YWx1ZXMpOworICAgICAgICBhc3NlcnRFcXVhbHMoInM6Ly9oOjEvcCUyRnA/cSNmIiwgdXJpLnRvU3RyaW5nKCkpOworCisgICAgICAgIHVyaSA9IG5ldyBKZXJzZXlVcmlCdWlsZGVyKCkudXJpKCJ7c2NoZW1lfTovL3tob3N0fTp7cG9ydH0ve3BhdGh9L3twYXRoMn0iKS5idWlsZCgicyIsICJoIiwgbmV3IEludGVnZXIoMSksICJhIiwgImIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzOi8vaDoxL2EvYiIsIHVyaS50b1N0cmluZygpKTsKKworICAgICAgICB1cmkgPSBuZXcgSmVyc2V5VXJpQnVpbGRlcigpLnVyaSgie3NjaGVtZX06Ly97aG9zdH06e3BvcnR9L3twYXRofS97cGF0aDJ9IikuYnVpbGQoInMiLCAiaCIsIG5ldyBJbnRlZ2VyKDEpLCAiYSIsICJiIik7CisgICAgICAgIGFzc2VydEVxdWFscygiczovL2g6MS9hL2IiLCB1cmkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgdXJpID0gbmV3IEplcnNleVVyaUJ1aWxkZXIoKS51cmkoIi8ve2hvc3R9Ontwb3J0fS97cGF0aH0ve3BhdGgyfSIpLmJ1aWxkKCJoIiwgbmV3IEludGVnZXIoMSksICJhIiwgImIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvL2g6MS9hL2IiLCB1cmkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgdXJpID0gbmV3IEplcnNleVVyaUJ1aWxkZXIoKS51cmkoIi97YX0ve2F9L3tifSIpLmJ1aWxkKCJhIiwgImIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvYS9hL2IiLCB1cmkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgdXJpID0gbmV3IEplcnNleVVyaUJ1aWxkZXIoKS51cmkoIi97YX0ve2F9L3tifT97cXVlcnlQYXJhbX0iKS5idWlsZCgiYSIsICJiIiwgInF1ZXJ5Iik7CisgICAgICAgIGFzc2VydEVxdWFscygiL2EvYS9iP3F1ZXJ5IiwgdXJpLnRvU3RyaW5nKCkpOworCisgICAgICAgIC8vIHBhcnRpYWwgdGVtcGxhdGVzCisgICAgICAgIHVyaSA9IG5ldyBKZXJzZXlVcmlCdWlsZGVyKCkudXJpKCIve2F9eHgve2F9L3tifT97cXVlcnlQYXJhbX0iKS5idWlsZCgiYSIsICJiIiwgInF1ZXJ5Iik7CisgICAgICAgIGFzc2VydEVxdWFscygiL2F4eC9hL2I/cXVlcnkiLCB1cmkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgdXJpID0gbmV3IEplcnNleVVyaUJ1aWxkZXIoKS51cmkoIm15e3NjaGVtZX06Ly9teXtob3N0fToxe3BvcnR9L215e3BhdGh9L215e3BhdGgyfSIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCJzIiwgImgiLCBuZXcgSW50ZWdlcigxKSwgImEiLCAiYi9jIik7CisgICAgICAgIGFzc2VydEVxdWFscygibXlzOi8vbXloOjExL215YS9teWIlMkZjIiwgdXJpLnRvU3RyaW5nKCkpOworCisgICAgICAgIHVyaSA9IG5ldyBKZXJzZXlVcmlCdWlsZGVyKCkudXJpKCJteXtzY2hlbWV9cG9zdDovL215e2hvc3R9cG9zdDo1e3BvcnR9OS9teXtwYXRofXBvc3QvbXl7cGF0aDJ9cG9zdCIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCJzIiwgImgiLCBuZXcgSW50ZWdlcigxKSwgImEiLCAiYiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm15c3Bvc3Q6Ly9teWhwb3N0OjUxOS9teWFwb3N0L215YnBvc3QiLCB1cmkudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXJpQnVpbGRlclRlbXBsYXRlc05vdEVuY29kZWRTbGFzaCgpIHsKKyAgICAgICAgVVJJIHVyaSA9IG5ldyBKZXJzZXlVcmlCdWlsZGVyKCkudXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAve3BhdGh9IikuYnVpbGQobmV3IE9iamVjdFtdIHsiYS9iL2MifSwgZmFsc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYyIsIHVyaS50b1N0cmluZygpKTsKKworICAgICAgICB1cmkgPSBuZXcgSmVyc2V5VXJpQnVpbGRlcigpLnVyaSgiaHR0cDovL3tob3N0fTo4MDgwL3twYXRofSIpLmJ1aWxkKG5ldyBPYmplY3RbXSB7ImwiLCAiYS9iL2MifSwgZmFsc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoImh0dHA6Ly9sOjgwODAvYS9iL2MiLCB1cmkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiB2YWx1ZXMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICAgICAgdmFsdWVzLnB1dCgic2NoZW1lIiwgInMiKTsKKyAgICAgICAgdmFsdWVzLnB1dCgiaG9zdCIsICJoIik7CisgICAgICAgIHZhbHVlcy5wdXQoInBvcnQiLCAxKTsKKyAgICAgICAgdmFsdWVzLnB1dCgicGF0aCIsICJwL3AiKTsKKyAgICAgICAgdmFsdWVzLnB1dCgicXVlcnkiLCAicSIpOworICAgICAgICB2YWx1ZXMucHV0KCJmcmFnbWVudCIsICJmIik7CisKKyAgICAgICAgdXJpID0gbmV3IEplcnNleVVyaUJ1aWxkZXIoKS51cmkoIntzY2hlbWV9Oi8ve2hvc3R9Ontwb3J0fS97cGF0aH0/e3F1ZXJ5fSN7ZnJhZ21lbnR9IikuYnVpbGRGcm9tTWFwKHZhbHVlcywgZmFsc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoInM6Ly9oOjEvcC9wP3EjZiIsIHVyaS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdFVyaShmaW5hbCBTdHJpbmcgaW5wdXQpIHsKKyAgICAgICAgZmluYWwgVVJJIHVyaSA9IG5ldyBKZXJzZXlVcmlCdWlsZGVyKCkudXJpKGlucHV0KS5jbG9uZSgpLmJ1aWxkKCk7CisKKyAgICAgICAgZmluYWwgVVJJIG9yaWdpbmFsVXJpID0gVVJJLmNyZWF0ZShpbnB1dCk7CisgICAgICAgIGFzc2VydEVxdWFscyhvcmlnaW5hbFVyaS5nZXRTY2hlbWUoKSwgdXJpLmdldFNjaGVtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG9yaWdpbmFsVXJpLmdldEhvc3QoKSwgdXJpLmdldEhvc3QoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhvcmlnaW5hbFVyaS5nZXRQb3J0KCksIHVyaS5nZXRQb3J0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMob3JpZ2luYWxVcmkuZ2V0VXNlckluZm8oKSwgdXJpLmdldFVzZXJJbmZvKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMob3JpZ2luYWxVcmkuZ2V0UGF0aCgpLCB1cmkuZ2V0UGF0aCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG9yaWdpbmFsVXJpLmdldFF1ZXJ5KCksIHVyaS5nZXRRdWVyeSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG9yaWdpbmFsVXJpLmdldEZyYWdtZW50KCksIHVyaS5nZXRGcmFnbWVudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG9yaWdpbmFsVXJpLmdldFJhd1NjaGVtZVNwZWNpZmljUGFydCgpLCB1cmkuZ2V0UmF3U2NoZW1lU3BlY2lmaWNQYXJ0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMob3JpZ2luYWxVcmkuaXNBYnNvbHV0ZSgpLCB1cmkuaXNBYnNvbHV0ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGlucHV0LCB1cmkudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQG9yZy5qdW5pdC5UZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9wYXF1ZVVyaSgpIHsKKyAgICAgICAgZmluYWwgVVJJIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgibWFpbHRvOmFAYiIpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIm1haWx0bzphQGIiLCB1cmkudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3BhcXVlVXJpUmVwbGFjZVNjaGVtZVNwZWNpZmljUGFydCgpIHsKKyAgICAgICAgZmluYWwgVVJJIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgibWFpbHRvOmFAYiIpLnNjaGVtZVNwZWNpZmljUGFydCgiY0BkIikuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygibWFpbHRvOmNAZCIsIHVyaS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPcGFxdWVSZXBsYWNlVXJpKCkgeworICAgICAgICBmaW5hbCBVUkkgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJtYWlsdG86YUBiIikudXJpKFVSSS5jcmVhdGUoImNAZCIpKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJtYWlsdG86Y0BkIiwgdXJpLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcGxhY2VTY2hlbWUoKSB7CisgICAgICAgIFVSSSB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYyIpLnNjaGVtZSgiaHR0cHMiKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJodHRwczovL2xvY2FsaG9zdDo4MDgwL2EvYi9jIiwgdXJpLnRvU3RyaW5nKCkpOworCisgICAgICAgIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvYi9jIikuc2NoZW1lKG51bGwpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIi8vbG9jYWxob3N0OjgwODAvYS9iL2MiLCB1cmkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2MiKS5zY2hlbWUobnVsbCkuaG9zdChudWxsKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIvLzo4MDgwL2EvYi9jIiwgdXJpLnRvU3RyaW5nKCkpOworCisgICAgICAgIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvYi9jIikuc2NoZW1lKG51bGwpLmhvc3QobnVsbCkucG9ydCgtMSkuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiL2EvYi9jIiwgdXJpLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcGxhY2VTY2hlbWVTcGVjaWZpY1BhcnQoKSB7CisgICAgICAgIGZpbmFsIFVSSSB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYyIpLnNjaGVtZVNwZWNpZmljUGFydCgiLy9sb2NhbGhvc3Q6ODA4MC9hL2IvYy9kIikuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2MvZCIpLCB1cmkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5hbWVBdXRob3JpdHlVcmkoKSB7CisgICAgICAgIGZpbmFsIFVSSSB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly94X3kvYS9iL2MiKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly94X3kvYS9iL2MiKSwgdXJpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlTmFtZUF1dGhvcml0eVVyaVdpdGhIb3N0KCkgeworICAgICAgICBmaW5hbCBVUkkgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8veF95LmNvbS9hL2IvYyIpLmhvc3QoInh5LmNvbSIpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL3h5LmNvbS9hL2IvYyIpLCB1cmkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcGxhY2VOYW1lQXV0aG9yaXR5VXJpV2l0aFNTUCgpIHsKKyAgICAgICAgVVJJIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL3hfeS5jb20vYS9iL2MiKS5zY2hlbWVTcGVjaWZpY1BhcnQoIi8veHkuY29tL2EvYi9jIikuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8veHkuY29tL2EvYi9jIiksIHVyaSk7CisKKyAgICAgICAgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8veF95LmNvbS9hL2IvYyIpLnNjaGVtZVNwZWNpZmljUGFydCgiLy92X3cuY29tL2EvYi9jIikuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vdl93LmNvbS9hL2IvYyIpLCB1cmkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcGxhY2VVc2VySW5mbygpIHsKKyAgICAgICAgZmluYWwgVVJJIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2JvYkBsb2NhbGhvc3Q6ODA4MC9hL2IvYyIpLnVzZXJJbmZvKCJzdWUiKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9zdWVAbG9jYWxob3N0OjgwODAvYS9iL2MiKSwgdXJpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlSG9zdCgpIHsKKyAgICAgICAgVVJJIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvYi9jIikuaG9zdCgiYS5jb20iKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9hLmNvbTo4MDgwL2EvYi9jIiksIHVyaSk7CisKKyAgICAgICAgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2MiKS5ob3N0KCJbOjpGRkZGOjEyOS4xNDQuNTIuMzhdIikuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vWzo6RkZGRjoxMjkuMTQ0LjUyLjM4XTo4MDgwL2EvYi9jIiksIHVyaSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZVBvcnQoKSB7CisgICAgICAgIFVSSSB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYyIpLnBvcnQoOTA5MCkuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjkwOTAvYS9iL2MiKSwgdXJpKTsKKworICAgICAgICB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYyIpLnBvcnQoLTEpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdC9hL2IvYyIpLCB1cmkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcGxhY2VQYXRoKCkgeworICAgICAgICBmaW5hbCBVUkkgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2MiKS5yZXBsYWNlUGF0aCgiL3gveS96IikuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAveC95L3oiKSwgdXJpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlUGF0aE51bGwoKSB7CisgICAgICAgIGZpbmFsIFVSSSB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYyIpLnJlcGxhY2VQYXRoKG51bGwpLmJ1aWxkKCk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAiKSwgdXJpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlTWF0cml4KCkgeworICAgICAgICBmaW5hbCBVUkkgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2M7YT14O2I9eSIpLnJlcGxhY2VNYXRyaXgoIng9YTt5PWIiKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYzt4PWE7eT1iIiksIHVyaSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZU1hdHJpeFBhcmFtcygpIHsKKyAgICAgICAgZmluYWwgVXJpQnVpbGRlciB1YnUgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYzthPXg7Yj15IikucmVwbGFjZU1hdHJpeFBhcmFtKCJhIiwgInoiLCAienoiKTsKKworICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBVUkkgdXJpID0gdWJ1LmJ1aWxkKCk7CisgICAgICAgICAgICBmaW5hbCBMaXN0PFBhdGhTZWdtZW50PiBwcyA9IFVyaUNvbXBvbmVudC5kZWNvZGVQYXRoKHVyaSwgdHJ1ZSk7CisgICAgICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gbXBzID0gcHMuZ2V0KDIpLmdldE1hdHJpeFBhcmFtZXRlcnMoKTsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBhID0gbXBzLmdldCgiYSIpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBhLnNpemUoKSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJ6IiwgYS5nZXQoMCkpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygienoiLCBhLmdldCgxKSk7CisgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gYiA9IG1wcy5nZXQoImIiKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgYi5zaXplKCkpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygieSIsIGIuZ2V0KDApKTsKKyAgICAgICAgfQorCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbmFsIFVSSSB1cmkgPSB1YnUucmVwbGFjZU1hdHJpeFBhcmFtKCJhIiwgIl96XyIsICJfenpfIikuYnVpbGQoKTsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8UGF0aFNlZ21lbnQ+IHBzID0gVXJpQ29tcG9uZW50LmRlY29kZVBhdGgodXJpLCB0cnVlKTsKKyAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBtcHMgPSBwcy5nZXQoMikuZ2V0TWF0cml4UGFyYW1ldGVycygpOworICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGEgPSBtcHMuZ2V0KCJhIik7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIGEuc2l6ZSgpKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIl96XyIsIGEuZ2V0KDApKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIl96el8iLCBhLmdldCgxKSk7CisgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gYiA9IG1wcy5nZXQoImIiKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgYi5zaXplKCkpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygieSIsIGIuZ2V0KDApKTsKKyAgICAgICAgfQorCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbmFsIFVSSSB1cmkgPSBKZXJzZXlVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYzthPXg7Yj15IikucmVwbGFjZU1hdHJpeFBhcmFtKCJhIiwgInoiLCAienoiKQorICAgICAgICAgICAgICAgICAgICAubWF0cml4UGFyYW0oImMiLCAiYyIpLnBhdGgoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImQiKS5idWlsZCgpOworCisgICAgICAgICAgICBmaW5hbCBMaXN0PFBhdGhTZWdtZW50PiBwcyA9IFVyaUNvbXBvbmVudC5kZWNvZGVQYXRoKHVyaSwgdHJ1ZSk7CisgICAgICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gbXBzID0gcHMuZ2V0KDIpLmdldE1hdHJpeFBhcmFtZXRlcnMoKTsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBhID0gbXBzLmdldCgiYSIpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBhLnNpemUoKSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJ6IiwgYS5nZXQoMCkpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygienoiLCBhLmdldCgxKSk7CisgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gYiA9IG1wcy5nZXQoImIiKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgYi5zaXplKCkpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygieSIsIGIuZ2V0KDApKTsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBjID0gbXBzLmdldCgiYyIpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBjLnNpemUoKSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJjIiwgYy5nZXQoMCkpOworICAgICAgICB9CisKKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgVVJJIHVyaSA9IEplcnNleVVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2E7dz0xMjM7cT0xNS9iL2M7YT14O2I9eSIpLnJlcGxhY2VNYXRyaXhQYXJhbSgiYSIsCisgICAgICAgICAgICAgICAgICAgICJ6IiwgInp6IikubWF0cml4UGFyYW0oImMiLCAiYyIpLnBhdGgoImQiKS5idWlsZCgpOworCisgICAgICAgICAgICBmaW5hbCBMaXN0PFBhdGhTZWdtZW50PiBwcyA9IFVyaUNvbXBvbmVudC5kZWNvZGVQYXRoKHVyaSwgdHJ1ZSk7CisgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gbXBzID0gcHMuZ2V0KDApLmdldE1hdHJpeFBhcmFtZXRlcnMoKTsKKworICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHcgPSBtcHMuZ2V0KCJ3Iik7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIHcuc2l6ZSgpKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjEyMyIsIHcuZ2V0KDApKTsKKworICAgICAgICAgICAgdyA9IG1wcy5nZXQoInEiKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgdy5zaXplKCkpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiMTUiLCB3LmdldCgwKSk7CisKKyAgICAgICAgICAgIG1wcyA9IHBzLmdldCgyKS5nZXRNYXRyaXhQYXJhbWV0ZXJzKCk7CisgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gYSA9IG1wcy5nZXQoImEiKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgYS5zaXplKCkpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygieiIsIGEuZ2V0KDApKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInp6IiwgYS5nZXQoMSkpOworICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGIgPSBtcHMuZ2V0KCJiIik7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIGIuc2l6ZSgpKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInkiLCBiLmdldCgwKSk7CisgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gYyA9IG1wcy5nZXQoImMiKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgYy5zaXplKCkpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiYyIsIGMuZ2V0KDApKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcGxhY2VNYXRyaXhQYXJhbXNFbXB0eSgpIHsKKyAgICAgICAgZmluYWwgVXJpQnVpbGRlciB1YnUgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYyIpLnJlcGxhY2VNYXRyaXhQYXJhbSgiYSIsICJ6IiwgInp6Iik7CisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbmFsIFVSSSB1cmkgPSB1YnUuYnVpbGQoKTsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8UGF0aFNlZ21lbnQ+IHBzID0gVXJpQ29tcG9uZW50LmRlY29kZVBhdGgodXJpLCB0cnVlKTsKKyAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBtcHMgPSBwcy5nZXQoMikuZ2V0TWF0cml4UGFyYW1ldGVycygpOworICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGEgPSBtcHMuZ2V0KCJhIik7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIGEuc2l6ZSgpKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInoiLCBhLmdldCgwKSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJ6eiIsIGEuZ2V0KDEpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcGxhY2VNYXRyaXhQYXJhbXNFbmNvZGVkKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFVyaUJ1aWxkZXIgdWJ1ID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0LyIpLnJlcGxhY2VNYXRyaXgoImxpbWl0PTEwO3NxbD1zZWxlY3QrKitmcm9tK3VzZXJzIik7CisgICAgICAgIHVidS5yZXBsYWNlTWF0cml4UGFyYW0oImxpbWl0IiwgMTAwKTsKKworICAgICAgICBmaW5hbCBVUkkgdXJpID0gdWJ1LmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdC87bGltaXQ9MTAwO3NxbD1zZWxlY3QrKitmcm9tK3VzZXJzIiksIHVyaSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWF0cml4UGFyYW1zV2l0aFRoZVNhbWVOYW1lKCkgeworICAgICAgICBVcmlCdWlsZGVyIGZpcnN0ID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vd3d3LmNvbS8iKS5yZXBsYWNlTWF0cml4UGFyYW0oImV4YW1wbGUiLCAib25lIiwgInR3byIpOworICAgICAgICBmaXJzdCA9IGZpcnN0LnBhdGgoIi9jaGlsZCIpOworICAgICAgICBmaXJzdCA9IGZpcnN0LnJlcGxhY2VNYXRyaXhQYXJhbSgiZXhhbXBsZSIsICJhbm90aGVyIik7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiaHR0cDovL3d3dy5jb20vO2V4YW1wbGU9b25lO2V4YW1wbGU9dHdvL2NoaWxkO2V4YW1wbGU9YW5vdGhlciIsIGZpcnN0LmJ1aWxkKCkudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWF0cml4UGFyYW1zV2l0aFRoZURpZmZlcmVudE5hbWUoKSB7CisgICAgICAgIFVyaUJ1aWxkZXIgZmlyc3QgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly93d3cuY29tLyIpLnJlcGxhY2VNYXRyaXhQYXJhbSgiZXhhbXBsZSIsICJvbmUiLCAidHdvIik7CisgICAgICAgIGZpcnN0ID0gZmlyc3QucGF0aCgiL2NoaWxkIik7CisgICAgICAgIGZpcnN0ID0gZmlyc3QucmVwbGFjZU1hdHJpeFBhcmFtKCJvdGhlciIsICJhbm90aGVyIik7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiaHR0cDovL3d3dy5jb20vO2V4YW1wbGU9b25lO2V4YW1wbGU9dHdvL2NoaWxkO290aGVyPWFub3RoZXIiLCBmaXJzdC5idWlsZCgpLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcGxhY2VRdWVyeSgpIHsKKyAgICAgICAgZmluYWwgVVJJIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvYi9jP2E9eCZiPXkiKS5yZXBsYWNlUXVlcnkoIng9YSZ5PWIiKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYz94PWEmeT1iIiksIHVyaSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnVpbGRFbmNvZGVkUXVlcnkoKSB7CisgICAgICAgIFVSSSB1ID0gVXJpQnVpbGRlci5mcm9tUGF0aCgiIikucXVlcnlQYXJhbSgieSIsICIxICUyQiAyIikuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCI/eT0xKyUyQisyIiksIHUpOworCisgICAgICAgIC8vIElzc3VlIDIxNgorICAgICAgICB1ID0gVXJpQnVpbGRlci5mcm9tUGF0aCgiaHR0cDovL2xvY2FsaG9zdDo4MDgwIikucGF0aCgiL3t4fS97eX0ve3p9L3t4fSIpLmJ1aWxkRnJvbUVuY29kZWQoIiV4eSIsICIgIiwgIj0iKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvJTI1eHkvJTIwLz0vJTI1eHkiKSwgdSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZVF1ZXJ5UGFyYW1zKCkgeworICAgICAgICBmaW5hbCBVcmlCdWlsZGVyIHVidSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvYi9jP2E9eCZiPXkiKS5yZXBsYWNlUXVlcnlQYXJhbSgiYSIsICJ6IiwgInp6IikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgiYyIsICJjIik7CisKKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgVVJJIHVyaSA9IHVidS5idWlsZCgpOworCisgICAgICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gcXBzID0gVXJpQ29tcG9uZW50LmRlY29kZVF1ZXJ5KHVyaSwgdHJ1ZSk7CisgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gYSA9IHFwcy5nZXQoImEiKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgYS5zaXplKCkpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygieiIsIGEuZ2V0KDApKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInp6IiwgYS5nZXQoMSkpOworICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGIgPSBxcHMuZ2V0KCJiIik7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIGIuc2l6ZSgpKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInkiLCBiLmdldCgwKSk7CisgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gYyA9IHFwcy5nZXQoImMiKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgYy5zaXplKCkpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiYyIsIGMuZ2V0KDApKTsKKyAgICAgICAgfQorCisgICAgICAgIHsKKyAgICAgICAgICAgIGZpbmFsIFVSSSB1cmkgPSB1YnUucmVwbGFjZVF1ZXJ5UGFyYW0oImEiLCAiX3pfIiwgIl96el8iKS5idWlsZCgpOworCisgICAgICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gcXBzID0gVXJpQ29tcG9uZW50LmRlY29kZVF1ZXJ5KHVyaSwgdHJ1ZSk7CisgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gYSA9IHFwcy5nZXQoImEiKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgYS5zaXplKCkpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiX3pfIiwgYS5nZXQoMCkpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiX3p6XyIsIGEuZ2V0KDEpKTsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8U3RyaW5nPiBiID0gcXBzLmdldCgiYiIpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBiLnNpemUoKSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJ5IiwgYi5nZXQoMCkpOworICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGMgPSBxcHMuZ2V0KCJjIik7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIGMuc2l6ZSgpKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImMiLCBjLmdldCgwKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBpc3N1ZSAyNTcgLSBwYXJhbSBpcyByZW1vdmVkIGFmdGVyIHNldHRpbmcgaXQgdG8gbnVsbAorICAgICAgICB7CisgICAgICAgICAgICBmaW5hbCBVUkkgdTEgPSBVcmlCdWlsZGVyLmZyb21QYXRoKCJodHRwOi8vbG9jYWxob3N0OjgwODAiKS5xdWVyeVBhcmFtKCJ4IiwgIjEwIikKKyAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2VRdWVyeVBhcmFtKCJ4IiwgKE9iamVjdFtdKSBudWxsKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHUxLnRvU3RyaW5nKCkuZXF1YWxzKCJodHRwOi8vbG9jYWxob3N0OjgwODAiKSk7CisKKyAgICAgICAgICAgIGZpbmFsIFVSSSB1MiA9IFVyaUJ1aWxkZXIuZnJvbVBhdGgoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCIpLnF1ZXJ5UGFyYW0oIngiLCAiMTAiKS5yZXBsYWNlUXVlcnlQYXJhbSgieCIpLmJ1aWxkKCk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSh1Mi50b1N0cmluZygpLmVxdWFscygiaHR0cDovL2xvY2FsaG9zdDo4MDgwIikpOworICAgICAgICB9CisKKyAgICAgICAgLy8gaXNzdWUgMjU3IC0gSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCisgICAgICAgIHsKKyAgICAgICAgICAgIGJvb2xlYW4gY2F1Z2h0ID0gZmFsc2U7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgVXJpQnVpbGRlci5mcm9tUGF0aCgiaHR0cDovL2xvY2FsaG9zdDo4MDgwIikucXVlcnlQYXJhbSgieCIsICIxMCIpLnJlcGxhY2VRdWVyeVBhcmFtKCJ4IiwgIjEiLCBudWxsLCAiMiIpLmJ1aWxkKCk7CisgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWFlKSB7CisgICAgICAgICAgICAgICAgY2F1Z2h0ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoY2F1Z2h0KTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVwbGFjZVF1ZXJ5UGFyYW1zRW1wdHkoKSB7CisgICAgICAgIGZpbmFsIFVyaUJ1aWxkZXIgdWJ1ID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2MiKS5yZXBsYWNlUXVlcnlQYXJhbSgiYSIsICJ6IiwgInp6IikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgiYyIsICJjIik7CisKKyAgICAgICAgeworICAgICAgICAgICAgZmluYWwgVVJJIHVyaSA9IHVidS5idWlsZCgpOworCisgICAgICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gcXBzID0gVXJpQ29tcG9uZW50LmRlY29kZVF1ZXJ5KHVyaSwgdHJ1ZSk7CisgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gYSA9IHFwcy5nZXQoImEiKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgYS5zaXplKCkpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygieiIsIGEuZ2V0KDApKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInp6IiwgYS5nZXQoMSkpOworICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGMgPSBxcHMuZ2V0KCJjIik7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEsIGMuc2l6ZSgpKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImMiLCBjLmdldCgwKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlUXVlcnlQYXJhbXNFbmNvZGVkMSgpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24geworICAgICAgICBmaW5hbCBVcmlCdWlsZGVyIHVidSA9IFVyaUJ1aWxkZXIuZnJvbVVyaShuZXcgVVJJKCJodHRwOi8vbG9jYWxob3N0LyIpKS5yZXBsYWNlUXVlcnkoImxpbWl0PTEwJnNxbD1zZWxlY3QrKitmcm9tK3VzZXJzIik7CisgICAgICAgIHVidS5yZXBsYWNlUXVlcnlQYXJhbSgibGltaXQiLCAxMDApOworCisgICAgICAgIGZpbmFsIFVSSSB1cmkgPSB1YnUuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0Lz9saW1pdD0xMDAmc3FsPXNlbGVjdCslMkErZnJvbSt1c2VycyIpLCB1cmkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcGxhY2VRdWVyeVBhcmFtc0VuY29kZWQyKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFVyaUJ1aWxkZXIgdWJ1ID0gVXJpQnVpbGRlci5mcm9tVXJpKG5ldyBVUkkoImh0dHA6Ly9sb2NhbGhvc3QiKSkucmVwbGFjZVF1ZXJ5KCJsaW1pdD0xMCZzcWw9c2VsZWN0KyorZnJvbSt1c2VycyIpOworICAgICAgICB1YnUucmVwbGFjZVF1ZXJ5UGFyYW0oImxpbWl0IiwgMTAwKTsKKworICAgICAgICBmaW5hbCBVUkkgdXJpID0gdWJ1LmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdC8/bGltaXQ9MTAwJnNxbD1zZWxlY3QrJTJBK2Zyb20rdXNlcnMiKSwgdXJpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlUXVlcnlQYXJhbXNFbmNvZGVkMygpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24geworICAgICAgICBmaW5hbCBVcmlCdWlsZGVyIHVidSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdC8iKS5yZXBsYWNlUXVlcnkoImxpbWl0PTEwJnNxbD1zZWxlY3QrKitmcm9tK3VzZXJzIik7CisgICAgICAgIHVidS5yZXBsYWNlUXVlcnlQYXJhbSgibGltaXQiLCAxMDApOworCisgICAgICAgIGZpbmFsIFVSSSB1cmkgPSB1YnUuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0Lz9saW1pdD0xMDAmc3FsPXNlbGVjdCslMkErZnJvbSt1c2VycyIpLCB1cmkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcGxhY2VRdWVyeVBhcmFtc0VuY29kZWQ0KCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFVyaUJ1aWxkZXIgdWJ1ID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0IikucmVwbGFjZVF1ZXJ5KCJsaW1pdD0xMCZzcWw9c2VsZWN0KyorZnJvbSt1c2VycyIpOworICAgICAgICB1YnUucmVwbGFjZVF1ZXJ5UGFyYW0oImxpbWl0IiwgMTAwKTsKKworICAgICAgICBmaW5hbCBVUkkgdXJpID0gdWJ1LmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdC8/bGltaXQ9MTAwJnNxbD1zZWxlY3QrJTJBK2Zyb20rdXNlcnMiKSwgdXJpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNlRnJhZ21lbnQoKSB7CisgICAgICAgIGZpbmFsIFVSSSB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYz9hPXgmYj15I2ZyYWciKS5mcmFnbWVudCgibWVudCIpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvYi9jP2E9eCZiPXkjbWVudCIpLCB1cmkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcGxhY2VVcmkoKSB7CisgICAgICAgIGZpbmFsIFVSSSB1ID0gVVJJLmNyZWF0ZSgiaHR0cDovL2JvYkBsb2NhbGhvc3Q6ODA4MC9hL2IvYz9hPXgmYj15I2ZyYWciKTsKKworICAgICAgICBVUkkgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKHUpLnVyaShVUkkuY3JlYXRlKCJodHRwczovL2JvYkBsb2NhbGhvc3Q6ODA4MCIpKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHBzOi8vYm9iQGxvY2FsaG9zdDo4MDgwL2EvYi9jP2E9eCZiPXkjZnJhZyIpLCB1cmkpOworCisgICAgICAgIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSh1KS51cmkoVVJJLmNyZWF0ZSgiaHR0cHM6Ly9zdWVAbG9jYWxob3N0OjgwODAiKSkuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwczovL3N1ZUBsb2NhbGhvc3Q6ODA4MC9hL2IvYz9hPXgmYj15I2ZyYWciKSwgdXJpKTsKKworICAgICAgICB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkodSkudXJpKFVSSS5jcmVhdGUoImh0dHBzOi8vc3VlQGxvY2FsaG9zdDo5MDkwIikpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cHM6Ly9zdWVAbG9jYWxob3N0OjkwOTAvYS9iL2M/YT14JmI9eSNmcmFnIiksIHVyaSk7CisKKyAgICAgICAgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKHUpLnVyaShVUkkuY3JlYXRlKCIveC95L3oiKSkuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vYm9iQGxvY2FsaG9zdDo4MDgwL3gveS96P2E9eCZiPXkjZnJhZyIpLCB1cmkpOworCisgICAgICAgIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSh1KS51cmkoVVJJLmNyZWF0ZSgiP3g9YSZiPXkiKSkuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vYm9iQGxvY2FsaG9zdDo4MDgwL2EvYi9jP3g9YSZiPXkjZnJhZyIpLCB1cmkpOworCisgICAgICAgIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSh1KS51cmkoVVJJLmNyZWF0ZSgiI21lbnQiKSkuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vYm9iQGxvY2FsaG9zdDo4MDgwL2EvYi9jP2E9eCZiPXkjbWVudCIpLCB1cmkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNjaGVtZVNwZWNpZmljUGFydCgpIHsKKyAgICAgICAgZmluYWwgVVJJIHUgPSBVUkkuY3JlYXRlKCJodHRwOi8vYm9iQGxvY2FsaG9zdDo4MDgwL2EvYi9jP2E9eCZiPXkjZnJhZyIpOworCisgICAgICAgIGZpbmFsIFVSSSB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkodSkuc2NoZW1lU3BlY2lmaWNQYXJ0KCIvL3N1ZUByZW1vdGVob3N0OjkwOTAveC95L3o/eD1hJnk9YiIpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL3N1ZUByZW1vdGVob3N0OjkwOTAveC95L3o/eD1hJnk9YiNmcmFnIiksIHVyaSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwZW5kUGF0aCgpIHsKKyAgICAgICAgVVJJIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwIikucGF0aCgiYS9iL2MiKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYyIpLCB1cmkpOworCisgICAgICAgIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwLyIpLnBhdGgoImEvYi9jIikuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2MiKSwgdXJpKTsKKworICAgICAgICB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCIpLnBhdGgoIi9hL2IvYyIpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvYi9jIiksIHVyaSk7CisKKyAgICAgICAgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2MvIikucGF0aCgiLyIpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvYi9jLyIpLCB1cmkpOworCisgICAgICAgIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvYi9jLyIpLnBhdGgoIi94L3kveiIpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvYi9jL3gveS96IiksIHVyaSk7CisKKyAgICAgICAgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2MiKS5wYXRoKCIveC95L3oiKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYy94L3kveiIpLCB1cmkpOworCisgICAgICAgIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvYi9jIikucGF0aCgieC95L3oiKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYy94L3kveiIpLCB1cmkpOworCisgICAgICAgIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvYi9jIikucGF0aCgiLyIpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvYi9jLyIpLCB1cmkpOworCisgICAgICAgIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvYi9jIikucGF0aCgiIikuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2MiKSwgdXJpKTsKKworICAgICAgICB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hJTIwL2IlMjAvYyUyMCIpLnBhdGgoIi94IC95IC96ICIpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2ElMjAvYiUyMC9jJTIwL3glMjAveSUyMC96JTIwIiksIHVyaSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwZW5kU2VnbWVudCgpIHsKKyAgICAgICAgZmluYWwgVVJJIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwIikuc2VnbWVudCgiYS9iL2M7eCIpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2ElMkZiJTJGYyUzQngiKSwgdXJpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaGl0ZXNwYWNlc0luUGF0aFBhcmFtcygpIHsKKyAgICAgICAgZmluYWwgVVJJIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdDo4MC9hYWEveyAgcGFyMX0vIikucGF0aCgiYmJiL3sgIHBhcjIgICB9L2NjYyIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCIxcGFyYW0iLCAiMnBhcmFtIik7CisgICAgICAgIGFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwL2FhYS8xcGFyYW0vYmJiLzJwYXJhbS9jY2MiKSwgdXJpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaGl0ZXNwYWNlc0luUGF0aFBhcmFtc0J5UmVzb2x2ZSgpIHsKKyAgICAgICAgZmluYWwgVVJJIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdDo4MC9hYWEveyAgcGFyMX0vIikucGF0aCgiYmJiL3sgIHBhcjIgICB9L2NjYyIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCIxcGFyYW0iLCAiMnBhcmFtIik7CisgICAgICAgIGFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwL2FhYS8xcGFyYW0vYmJiLzJwYXJhbS9jY2MiKSwgdXJpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaGl0ZXNwYWNlc0luUGF0aFBhcmFtczIoKSB7CisgICAgICAgIGZpbmFsIFVSSSB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODAvYWFhL3sgIHBhcjF9IikucGF0aCgiYmJiL3sgIHBhcjIgOiBcXGQqICB9L2NjYyIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCIxcGFyYW0iLCAiMiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MC9hYWEvMXBhcmFtL2JiYi8yL2NjYyIpLCB1cmkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdoaXRlc3BhY2VzSW5QYXRoUGFyYW1zMkJ5UmVzb2x2ZSgpIHsKKyAgICAgICAgZmluYWwgVVJJIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdDo4MC9hYWEveyAgcGFyMX0iKS5wYXRoKCJiYmIveyAgcGFyMiA6IFxcZCogIH0vY2NjIikKKyAgICAgICAgICAgICAgICAucmVzb2x2ZVRlbXBsYXRlKCJwYXIxIiwgIjFwYXJhbSIpLnJlc29sdmVUZW1wbGF0ZSgicGFyMiIsICIyIikuYnVpbGQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODAvYWFhLzFwYXJhbS9iYmIvMi9jY2MiKSwgdXJpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaGl0ZXNwYWNlc0luUXVlcnlQYXJhbXMoKSB7CisgICAgICAgIGZpbmFsIFVSSSB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODAvYWFhP2E9eyAgICAgIHBhcmFtICAgOiBcXC5kKiAgfSIpLmJ1aWxkKCI1Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwL2FhYT9hPTUiKSwgdXJpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaGl0ZXNwYWNlc0luUXVlcnlQYXJhbXNCeVJlc29sdmUoKSB7CisgICAgICAgIGZpbmFsIFVSSSB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODAvYWFhP2E9eyAgICAgIHBhcmFtICAgOiBcXC5kKiAgfSIpLnJlc29sdmVUZW1wbGF0ZSgicGFyYW0iLCAiNSIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwL2FhYT9hPTUiKSwgdXJpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWxhdGl2ZUZyb21VcmkoKSB7CisgICAgICAgIFVSSSB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImEvYi9jIikuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJhL2IvYyIpLCB1cmkpOworCisgICAgICAgIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiYS9iL2MiKS5wYXRoKCJkIikuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJhL2IvYy9kIiksIHVyaSk7CisKKyAgICAgICAgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJhL2IvYy8iKS5wYXRoKCJkIikuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJhL2IvYy9kIiksIHVyaSk7CisKKyAgICAgICAgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJhL2IvYyIpLnBhdGgoIi9kIikuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJhL2IvYy9kIiksIHVyaSk7CisKKyAgICAgICAgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJhL2IvYy8iKS5wYXRoKCIvZCIpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiYS9iL2MvZCIpLCB1cmkpOworCisgICAgICAgIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiIikucXVlcnlQYXJhbSgieCIsICJ5IikuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCI/eD15IiksIHVyaSk7CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWxhdGl2ZWZyb21QYXRoKCkgeworICAgICAgICBVUkkgdXJpID0gVXJpQnVpbGRlci5mcm9tUGF0aCgiYS9iL2MiKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImEvYi9jIiksIHVyaSk7CisKKyAgICAgICAgdXJpID0gVXJpQnVpbGRlci5mcm9tUGF0aCgiYS9iL2MiKS5wYXRoKCJkIikuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJhL2IvYy9kIiksIHVyaSk7CisKKyAgICAgICAgdXJpID0gVXJpQnVpbGRlci5mcm9tUGF0aCgiYS9iL2MvIikucGF0aCgiZCIpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiYS9iL2MvZCIpLCB1cmkpOworCisgICAgICAgIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVBhdGgoImEvYi9jIikucGF0aCgiL2QiKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImEvYi9jL2QiKSwgdXJpKTsKKworICAgICAgICB1cmkgPSBVcmlCdWlsZGVyLmZyb21QYXRoKCJhL2IvYy8iKS5wYXRoKCIvZCIpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiYS9iL2MvZCIpLCB1cmkpOworCisgICAgICAgIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVBhdGgoIiIpLnF1ZXJ5UGFyYW0oIngiLCAieSIpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiP3g9eSIpLCB1cmkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFwcGVuZFF1ZXJ5UGFyYW1zKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICAgIFVSSSB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYz9hPXgmYj15IikucXVlcnlQYXJhbSgiYyIsICJ6IikuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2M/YT14JmI9eSZjPXoiKSwgdXJpKTsKKworICAgICAgICB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYz9hPXgmYj15IikucXVlcnlQYXJhbSgiYz0gIiwgIno9ICIpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvYi9jP2E9eCZiPXkmYyUzRCs9eiUzRCsiKSwgdXJpKTsKKworICAgICAgICB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkobmV3IFVSSSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwLyIpKS5xdWVyeVBhcmFtKCJjIiwgInoiKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8/Yz16IiksIHVyaSk7CisKKyAgICAgICAgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKG5ldyBVUkkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCIpKS5xdWVyeVBhcmFtKCJjIiwgInoiKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8/Yz16IiksIHVyaSk7CisKKyAgICAgICAgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAvIikucXVlcnlQYXJhbSgiYyIsICJ6IikuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvP2M9eiIpLCB1cmkpOworCisgICAgICAgIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwIikucXVlcnlQYXJhbSgiYyIsICJ6IikuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvP2M9eiIpLCB1cmkpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBVcmlCdWlsZGVyLmZyb21QYXRoKCJodHRwOi8vbG9jYWxob3N0OjgwODAiKS5xdWVyeVBhcmFtKCJuYW1lIiwgIngiLCBudWxsKS5idWlsZCgpOworICAgICAgICAgICAgZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4cGVjdGVkLiIpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gZXhjZXB0aW9uIGV4cGVjdGVkLCBtb3ZlIG9uLi4uCisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBlbmRNYXRyaXhQYXJhbXMoKSB7CisgICAgICAgIFVSSSB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYzthPXg7Yj15IikubWF0cml4UGFyYW0oImMiLCAieiIpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvYi9jO2E9eDtiPXk7Yz16IiksIHVyaSk7CisKKyAgICAgICAgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2M7YT14O2I9eSIpLm1hdHJpeFBhcmFtKCJjPS8gOyIsICJ6PS8gOyIpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvYi9jO2E9eDtiPXk7YyUzRCUyRiUyMCUzQj16JTNEJTJGJTIwJTNCIiksIHVyaSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwZW5kUGF0aEFuZE1hdHJpeFBhcmFtcygpIHsKKyAgICAgICAgZmluYWwgVVJJIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwLyIpLnBhdGgoCisgICAgICAgICAgICAgICAgImEiKS5tYXRyaXhQYXJhbSgieCIsICJmb28iKS5tYXRyaXhQYXJhbSgieSIsICJiYXIiKS5wYXRoKCJiIikubWF0cml4UGFyYW0oIngiLCAiZm9vIikubWF0cml4UGFyYW0oInkiLCAiYmFyIikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYTt4PWZvbzt5PWJhci9iO3g9Zm9vO3k9YmFyIiksIHVyaSk7CisgICAgfQorCisgICAgQFBhdGgoInJlc291cmNlIikKKyAgICBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgibWV0aG9kIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgibG9jYXRvciIpCisgICAgICAgIHB1YmxpYyBPYmplY3QgbG9jYXRvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VBcHBlbmRQYXRoKCkgdGhyb3dzIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiB7CisgICAgICAgIFVSSSB1YiA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2Jhc2UiKS5wYXRoKFJlc291cmNlLmNsYXNzKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9iYXNlL3Jlc291cmNlIiksIHViKTsKKworICAgICAgICB1YiA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2Jhc2UiKS5wYXRoKFJlc291cmNlLmNsYXNzLCAiZ2V0IikuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYmFzZS9tZXRob2QiKSwgdWIpOworCisgICAgICAgIGZpbmFsIE1ldGhvZCBnZXQgPSBSZXNvdXJjZS5jbGFzcy5nZXRNZXRob2QoImdldCIpOworICAgICAgICBmaW5hbCBNZXRob2QgbG9jYXRvciA9IFJlc291cmNlLmNsYXNzLmdldE1ldGhvZCgibG9jYXRvciIpOworICAgICAgICB1YiA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2Jhc2UiKS5wYXRoKGdldCkucGF0aChsb2NhdG9yKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9iYXNlL21ldGhvZC9sb2NhdG9yIiksIHViKTsKKyAgICB9CisKKyAgICBAUGF0aCgicmVzb3VyY2Uve2lkfSIpCisgICAgY2xhc3MgUmVzb3VyY2VXaXRoVGVtcGxhdGUgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIm1ldGhvZC97aWQxfSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImxvY2F0b3Ive2lkMn0iKQorICAgICAgICBwdWJsaWMgT2JqZWN0IGxvY2F0b3IoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlV2l0aFRlbXBsYXRlQXBwZW5kUGF0aCgpIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24geworICAgICAgICBVUkkgdWIgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9iYXNlIikucGF0aChSZXNvdXJjZVdpdGhUZW1wbGF0ZS5jbGFzcykuYnVpbGQoImZvbyIpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9iYXNlL3Jlc291cmNlL2ZvbyIpLCB1Yik7CisKKyAgICAgICAgdWIgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9iYXNlIikucGF0aChSZXNvdXJjZVdpdGhUZW1wbGF0ZS5jbGFzcywgImdldCIpLmJ1aWxkKCJmb28iKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYmFzZS9tZXRob2QvZm9vIiksIHViKTsKKworICAgICAgICBmaW5hbCBNZXRob2QgZ2V0ID0gUmVzb3VyY2VXaXRoVGVtcGxhdGUuY2xhc3MuZ2V0TWV0aG9kKCJnZXQiKTsKKyAgICAgICAgZmluYWwgTWV0aG9kIGxvY2F0b3IgPSBSZXNvdXJjZVdpdGhUZW1wbGF0ZS5jbGFzcy5nZXRNZXRob2QoImxvY2F0b3IiKTsKKyAgICAgICAgdWIgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9iYXNlIikucGF0aChnZXQpLnBhdGgobG9jYXRvcikuYnVpbGQoImZvbyIsICJiYXIiKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYmFzZS9tZXRob2QvZm9vL2xvY2F0b3IvYmFyIiksIHViKTsKKyAgICB9CisKKyAgICBAUGF0aCgicmVzb3VyY2Uve2lkOiAuK30iKQorICAgIGNsYXNzIFJlc291cmNlV2l0aFRlbXBsYXRlUmVnZXggeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIm1ldGhvZC97aWQxOiAuK30iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJsb2NhdG9yL3tpZDI6IC4rfSIpCisgICAgICAgIHB1YmxpYyBPYmplY3QgbG9jYXRvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VXaXRoVGVtcGxhdGVSZWdleEFwcGVuZFBhdGgoKSB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHsKKyAgICAgICAgVVJJIHViID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYmFzZSIpLnBhdGgoUmVzb3VyY2VXaXRoVGVtcGxhdGVSZWdleC5jbGFzcykuYnVpbGQoImZvbyIpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9iYXNlL3Jlc291cmNlL2ZvbyIpLCB1Yik7CisKKyAgICAgICAgdWIgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9iYXNlIikucGF0aChSZXNvdXJjZVdpdGhUZW1wbGF0ZVJlZ2V4LmNsYXNzLCAiZ2V0IikuYnVpbGQoImZvbyIpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9iYXNlL21ldGhvZC9mb28iKSwgdWIpOworCisgICAgICAgIGZpbmFsIE1ldGhvZCBnZXQgPSBSZXNvdXJjZVdpdGhUZW1wbGF0ZVJlZ2V4LmNsYXNzLmdldE1ldGhvZCgiZ2V0Iik7CisgICAgICAgIGZpbmFsIE1ldGhvZCBsb2NhdG9yID0gUmVzb3VyY2VXaXRoVGVtcGxhdGVSZWdleC5jbGFzcy5nZXRNZXRob2QoImxvY2F0b3IiKTsKKyAgICAgICAgdWIgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9iYXNlIikucGF0aChnZXQpLnBhdGgobG9jYXRvcikuYnVpbGQoImZvbyIsICJiYXIiKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYmFzZS9tZXRob2QvZm9vL2xvY2F0b3IvYmFyIiksIHViKTsKKyAgICB9CisKKyAgICBpbnRlcmZhY2UgR2VuZXJpY0ludGVyZmFjZTxULCBVPiB7CisKKyAgICAgICAgVCBmaW5kKFUgdSk7CisgICAgfQorCisgICAgQFBhdGgoInJlc291cmNlLyIpCisgICAgY2xhc3MgUmVzb3VyY2VXaXRoR2VuZXJpY0ludGVyZmFjZSBpbXBsZW1lbnRzIEdlbmVyaWNJbnRlcmZhY2U8T2JqZWN0LCBTdHJpbmc+IHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJ7aWR9IikKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPYmplY3QgZmluZChAUGF0aFBhcmFtKCJpZCIpIGZpbmFsIFN0cmluZyBzKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlV2l0aEdlbmVyaWNJbnRlcmZhY2VBcHBlbmRQYXRoKCkgeworICAgICAgICBmaW5hbCBVUkkgdWIgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9iYXNlIikucGF0aChSZXNvdXJjZVdpdGhHZW5lcmljSW50ZXJmYWNlLmNsYXNzLCAiZmluZCIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCJmb28iKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYmFzZS9mb28iKSwgdWIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ1aWxkVGVtcGxhdGVzKCkgeworICAgICAgICBVUkkgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2MiKS5wYXRoKCIve2Zvb30ve2Jhcn0ve2Jhen0ve2Zvb30iKS5idWlsZCgieCIsICJ5IiwgInoiKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2MveC95L3oveCIpLCB1cmkpOworCisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gbSA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICBtLnB1dCgiZm9vIiwgIngiKTsKKyAgICAgICAgbS5wdXQoImJhciIsICJ5Iik7CisgICAgICAgIG0ucHV0KCJiYXoiLCAieiIpOworICAgICAgICB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYyIpLnBhdGgoIi97Zm9vfS97YmFyfS97YmF6fS97Zm9vfSIpLmJ1aWxkRnJvbU1hcChtKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2MveC95L3oveCIpLCB1cmkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ1aWxkVGVtcGxhdGVzQnlSZXNvbHZlKCkgeworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IG0gPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICAgICAgbS5wdXQoImZvbyIsICJ4Iik7CisgICAgICAgIG0ucHV0KCJiYXIiLCAieSIpOworICAgICAgICBtLnB1dCgiYmF6IiwgInoiKTsKKworICAgICAgICBmaW5hbCBVUkkgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2MiKS5wYXRoKCIve2Zvb30ve2Jhcn0ve2Jhen0ve2Zvb30iKS5yZXNvbHZlVGVtcGxhdGVzKG0pCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2MveC95L3oveCIpLCB1cmkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ1aWxkVGVtcGxhdGVzV2l0aE5hbWVBdXRob3JpdHkoKSB7CisgICAgICAgIFVSSSB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly94X3kuY29tOjgwODAvYS9iL2MiKS5wYXRoKCIve2Zvb30ve2Jhcn0ve2Jhen0ve2Zvb30iKS5idWlsZCgieCIsICJ5IiwgInoiKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8veF95LmNvbTo4MDgwL2EvYi9jL3gveS96L3giKSwgdXJpKTsKKworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IG0gPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICAgICAgbS5wdXQoImZvbyIsICJ4Iik7CisgICAgICAgIG0ucHV0KCJiYXIiLCAieSIpOworICAgICAgICBtLnB1dCgiYmF6IiwgInoiKTsKKyAgICAgICAgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8veF95LmNvbTo4MDgwL2EvYi9jIikucGF0aCgiL3tmb299L3tiYXJ9L3tiYXp9L3tmb299IikuYnVpbGRGcm9tTWFwKG0pOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly94X3kuY29tOjgwODAvYS9iL2MveC95L3oveCIpLCB1cmkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ1aWxkVGVtcGxhdGVzV2l0aE5hbWVBdXRob3JpdHlCeVJlc29sdmUoKSB7CisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gbSA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICBtLnB1dCgiZm9vIiwgIngiKTsKKyAgICAgICAgbS5wdXQoImJhciIsICJ5Iik7CisgICAgICAgIG0ucHV0KCJiYXoiLCAieiIpOworICAgICAgICBmaW5hbCBVUkkgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8veF95LmNvbTo4MDgwL2EvYi9jIikKKyAgICAgICAgICAgICAgICAucGF0aCgiL3tmb299L3tiYXJ9L3tiYXp9L3tmb299IikuYnVpbGRGcm9tTWFwKG0pOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly94X3kuY29tOjgwODAvYS9iL2MveC95L3oveCIpLCB1cmkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJ1aWxkRnJvbU1hcCgpIHsKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBtYXBzID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisgICAgICAgIG1hcHMucHV0KCJ4IiwgbnVsbCk7CisgICAgICAgIG1hcHMucHV0KCJ5IiwgIi9wYXRoLWFic29sdXRlL3Rlc3QxIik7CisgICAgICAgIG1hcHMucHV0KCJ6IiwgImZyZWRAZXhhbXBsZS5jb20iKTsKKyAgICAgICAgbWFwcy5wdXQoInciLCAicGF0aC1yb290bGVzcy90ZXN0MiIpOworICAgICAgICBtYXBzLnB1dCgidSIsICJleHRyYSIpOworCisgICAgICAgIGJvb2xlYW4gY2F1Z2h0ID0gZmFsc2U7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihVcmlCdWlsZGVyLmZyb21QYXRoKCIiKS5wYXRoKCJ7d30ve3h9L3t5fS97en0ve3h9IikuYnVpbGRGcm9tRW5jb2RlZE1hcChtYXBzKSk7CisKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBjYXVnaHQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoY2F1Z2h0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCdWlsZEZyb21NYXBCeVJlc29sdmUoKSB7CisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gbWFwcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICBtYXBzLnB1dCgieCIsIG51bGwpOworICAgICAgICBtYXBzLnB1dCgieSIsICIvcGF0aC1hYnNvbHV0ZS90ZXN0MSIpOworICAgICAgICBtYXBzLnB1dCgieiIsICJmcmVkQGV4YW1wbGUuY29tIik7CisgICAgICAgIG1hcHMucHV0KCJ3IiwgInBhdGgtcm9vdGxlc3MvdGVzdDIiKTsKKyAgICAgICAgbWFwcy5wdXQoInUiLCAiZXh0cmEiKTsKKworICAgICAgICBib29sZWFuIGNhdWdodCA9IGZhbHNlOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oVXJpQnVpbGRlci5mcm9tUGF0aCgiIikucGF0aCgie3d9L3t4fS97eX0ve3p9L3t4fSIpLnJlc29sdmVUZW1wbGF0ZXMobWFwcykuYnVpbGQoKSk7CisKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBjYXVnaHQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoY2F1Z2h0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCdWlsZFF1ZXJ5VGVtcGxhdGVzKCkgeworICAgICAgICBVUkkgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2MiKS5xdWVyeVBhcmFtKCJhIiwgIntifSIpLmJ1aWxkKCI9KyYleHglMjAiKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2M/YT0lM0QlMkIlMjYlMjV4eCUyNTIwIiksIHVyaSk7CisKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBtID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisgICAgICAgIG0ucHV0KCJiIiwgIj0rJiV4eCUyMCIpOworICAgICAgICB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYyIpLnF1ZXJ5UGFyYW0oImEiLCAie2J9IikuYnVpbGRGcm9tTWFwKG0pOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYz9hPSUzRCUyQiUyNiUyNXh4JTI1MjAiKSwgdXJpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCdWlsZEZyb21FbmNvZGVkUXVlcnlUZW1wbGF0ZXMoKSB7CisgICAgICAgIFVSSSB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYyIpLnF1ZXJ5UGFyYW0oImEiLCAie2J9IikuYnVpbGRGcm9tRW5jb2RlZCgiPSsmJXh4JTIwIik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvYi9jP2E9JTNEJTJCJTI2JTI1eHglMjAiKSwgdXJpKTsKKworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IG0gPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICAgICAgbS5wdXQoImIiLCAiPSsmJXh4JTIwIik7CisgICAgICAgIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvYi9jIikucXVlcnlQYXJhbSgiYSIsICJ7Yn0iKS5idWlsZEZyb21FbmNvZGVkTWFwKG0pOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYz9hPSUzRCUyQiUyNiUyNXh4JTIwIiksIHVyaSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnVpbGRGcm9tRW5jb2RlZFNsYXNoSW5QYXJhbVZhbHVlKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIi9BL0IiLCBVcmlCdWlsZGVyLmZyb21VcmkoIi97cGFyYW19IikuYnVpbGRGcm9tRW5jb2RlZCgiQS9CIikudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZVRlbXBsYXRlRnJvbUVuY29kZWRRdWVyeVRlbXBsYXRlcygpIHsKKyAgICAgICAgVVJJIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvYi9jIikucXVlcnlQYXJhbSgiYSIsICJ7Yn0iKQorICAgICAgICAgICAgICAgIC5yZXNvbHZlVGVtcGxhdGVGcm9tRW5jb2RlZCgiYiIsICI9KyYleHglMjAiKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYz9hPSUzRCUyQiUyNiUyNXh4JTIwIiksIHVyaSk7CisKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBtID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisgICAgICAgIG0ucHV0KCJiIiwgIj0rJiV4eCUyMCIpOworICAgICAgICB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYyIpLnF1ZXJ5UGFyYW0oImEiLCAie2J9IikucmVzb2x2ZVRlbXBsYXRlc0Zyb21FbmNvZGVkKG0pLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvYi9jP2E9JTNEJTJCJTI2JTI1eHglMjAiKSwgdXJpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCdWlsZEZyYWdtZW50VGVtcGxhdGVzKCkgeworICAgICAgICBVUkkgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2MiKS5wYXRoKCIve2Zvb30ve2Jhcn0ve2Jhen0ve2Zvb30iKS5mcmFnbWVudCgie2Zvb30iKQorICAgICAgICAgICAgICAgIC5idWlsZCgieCIsICJ5IiwgInoiKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2MveC95L3oveCN4IiksIHVyaSk7CisKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBtID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisgICAgICAgIG0ucHV0KCJmb28iLCAieCIpOworICAgICAgICBtLnB1dCgiYmFyIiwgInkiKTsKKyAgICAgICAgbS5wdXQoImJheiIsICJ6Iik7CisgICAgICAgIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvYi9jIikucGF0aCgiL3tmb299L3tiYXJ9L3tiYXp9L3tmb299IikuZnJhZ21lbnQoIntmb299IikKKyAgICAgICAgICAgICAgICAuYnVpbGRGcm9tTWFwKG0pOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYy94L3kvei94I3giKSwgdXJpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvbHZlVGVtcGxhdGVGcm9tRnJhZ21lbnRUZW1wbGF0ZXMoKSB7CisgICAgICAgIFVSSSB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYyIpLnBhdGgoIi97Zm9vfS97YmFyfS97YmF6fS97Zm9vfSIpLmZyYWdtZW50KCJ7Zm9vfSIpCisgICAgICAgICAgICAgICAgLnJlc29sdmVUZW1wbGF0ZSgiZm9vIiwgIngiKS5yZXNvbHZlVGVtcGxhdGUoImJhciIsICJ5IikKKyAgICAgICAgICAgICAgICAucmVzb2x2ZVRlbXBsYXRlKCJiYXoiLCAieiIpLmJ1aWxkKCk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvYS9iL2MveC95L3oveCN4IiksIHVyaSk7CisKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBtID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisgICAgICAgIG0ucHV0KCJmb28iLCAieCIpOworICAgICAgICBtLnB1dCgiYmFyIiwgInkiKTsKKyAgICAgICAgbS5wdXQoImJheiIsICJ6Iik7CisgICAgICAgIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2EvYi9jIikucGF0aCgiL3tmb299L3tiYXJ9L3tiYXp9L3tmb299IikuZnJhZ21lbnQoIntmb299IikKKyAgICAgICAgICAgICAgICAucmVzb2x2ZVRlbXBsYXRlcyhtKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYy94L3kvei94I3giKSwgdXJpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUZW1wbGF0ZXNEZWZhdWx0UG9ydCgpIHsKKyAgICAgICAgVVJJIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdC9hL2IvYyIpLnBhdGgoIi97Zm9vfS97YmFyfS97YmF6fS97Zm9vfSIpLmJ1aWxkKCJ4IiwgInkiLCAieiIpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3QvYS9iL2MveC95L3oveCIpLCB1cmkpOworCisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gbSA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICBtLnB1dCgiZm9vIiwgIngiKTsKKyAgICAgICAgbS5wdXQoImJhciIsICJ5Iik7CisgICAgICAgIG0ucHV0KCJiYXoiLCAieiIpOworICAgICAgICB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3QvYS9iL2MiKS5wYXRoKCIve2Zvb30ve2Jhcn0ve2Jhen0ve2Zvb30iKS5idWlsZEZyb21NYXAobSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdC9hL2IvYy94L3kvei94IiksIHVyaSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZVRlbXBsYXRlc0RlZmF1bHRQb3J0KCkgeworICAgICAgICBVUkkgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0L2EvYi9jIikucGF0aCgiL3tmb299L3tiYXJ9L3tiYXp9L3tmb299IikucmVzb2x2ZVRlbXBsYXRlKCJmb28iLCAieCIpCisgICAgICAgICAgICAgICAgLnJlc29sdmVUZW1wbGF0ZSgiYmFyIiwgInkiKS5yZXNvbHZlVGVtcGxhdGUoImJheiIgKyAiIiwgInoiKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3QvYS9iL2MveC95L3oveCIpLCB1cmkpOworCisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gbSA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICBtLnB1dCgiZm9vIiwgIngiKTsKKyAgICAgICAgbS5wdXQoImJhciIsICJ5Iik7CisgICAgICAgIG0ucHV0KCJiYXoiLCAieiIpOworICAgICAgICB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3QvYS9iL2MiKS5wYXRoKCIve2Zvb30ve2Jhcn0ve2Jhen0ve2Zvb30iKS5yZXNvbHZlVGVtcGxhdGVzKG0pLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdC9hL2IvYy94L3kvei94IiksIHVyaSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB7CisgICAgICAgIGZpbmFsIFVyaUJ1aWxkZXIgdWIgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly91c2VyQGxvY2FsaG9zdDo4MDgwLz9xdWVyeSNmcmFnbWVudCIpLnBhdGgoImEiKTsKKyAgICAgICAgZmluYWwgVVJJIGZ1bGwgPSB1Yi5jbG9uZSgpLnBhdGgoImIiKS5idWlsZCgpOworICAgICAgICBmaW5hbCBVUkkgYmFzZSA9IHViLmJ1aWxkKCk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vdXNlckBsb2NhbGhvc3Q6ODA4MC9hP3F1ZXJ5I2ZyYWdtZW50IiksIGJhc2UpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly91c2VyQGxvY2FsaG9zdDo4MDgwL2EvYj9xdWVyeSNmcmFnbWVudCIpLCBmdWxsKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKSB7CisgICAgICAgIGJvb2xlYW4gY2F1Z2h0ID0gZmFsc2U7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBVcmlCdWlsZGVyLmZyb21QYXRoKG51bGwpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgY2F1Z2h0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShjYXVnaHQpOworCisgICAgICAgIGNhdWdodCA9IGZhbHNlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgVXJpQnVpbGRlci5mcm9tVXJpKChVUkkpIG51bGwpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgY2F1Z2h0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShjYXVnaHQpOworCisgICAgICAgIGNhdWdodCA9IGZhbHNlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgVXJpQnVpbGRlci5mcm9tVXJpKChTdHJpbmcpIG51bGwpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgY2F1Z2h0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShjYXVnaHQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVyaUVuY29kaW5nKCkgeworICAgICAgICBmaW5hbCBVUkkgZXhwZWN0ZWQgPSBVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvJTVFIik7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgbmV3IEplcnNleVVyaUJ1aWxkZXIoKS51cmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9eIikuYnVpbGQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAvXiIpLmJ1aWxkKCkpOworICAgIH0KKworICAgIC8vIFJlZ3Jlc3Npb24gdGVzdCBmb3IgSkVSU0VZLTEzMjQgZml4LgorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRVcmlUZW1wbGF0ZUVuY29kZWRBc1BhdGgoKSB7CisgICAgICAgIGFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwJTIwZnRwJTIweG1sLy86ODg4Ojg4OC8xOjgwODA6ODAiKSwKKyAgICAgICAgICAgICAgICBuZXcgSmVyc2V5VXJpQnVpbGRlcigpLnVyaSgiaHR0cCBmdHAgeG1sLy86ODg4Ojg4OC8xOjgwODA6ODAiKS5idWlsZCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWYXJpYWJsZVdpdGhvdXRWYWx1ZSgpIHsKKyAgICAgICAgYm9vbGVhbiBjYXVnaHQgPSBmYWxzZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFVyaUJ1aWxkZXIuZnJvbVBhdGgoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCIpLnBhdGgoIi97YX0ve2J9IikuYnVpbGRGcm9tRW5jb2RlZCgiYVZhbCIpOworCisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBjYXVnaHQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGNhdWdodCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9ydFZhbHVlKCkgeworICAgICAgICBib29sZWFuIGNhdWdodCA9IGZhbHNlOworICAgICAgICB0cnkgeworICAgICAgICAgICAgVXJpQnVpbGRlci5mcm9tUGF0aCgiaHR0cDovL2xvY2FsaG9zdCIpLnBvcnQoLTIpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgY2F1Z2h0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShjYXVnaHQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvcnRTZXR0aW5nKCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICAgIFVSSSB1cmk7CisKKyAgICAgICAgdXJpID0gbmV3IEplcnNleVVyaUJ1aWxkZXIoKS51cmkoImh0dHA6Ly9sb2NhbGhvc3QiKS5wb3J0KDgwODApLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwIiksIHVyaSk7CisKKyAgICAgICAgdXJpID0gbmV3IEplcnNleVVyaUJ1aWxkZXIoKS51cmkobmV3IFVSSSgiaHR0cDovL2xvY2FsaG9zdCIpKS5wb3J0KDgwODApLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwIiksIHVyaSk7CisKKyAgICAgICAgdXJpID0gbmV3IEplcnNleVVyaUJ1aWxkZXIoKS51cmkoImh0dHA6Ly9sb2NhbGhvc3QvIikucG9ydCg4MDgwKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8iKSwgdXJpKTsKKworICAgICAgICB1cmkgPSBuZXcgSmVyc2V5VXJpQnVpbGRlcigpLnVyaShuZXcgVVJJKCJodHRwOi8vbG9jYWxob3N0LyIpKS5wb3J0KDgwODApLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwLyIpLCB1cmkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhvc3RWYWx1ZSgpIHsKKyAgICAgICAgYm9vbGVhbiBjYXVnaHQgPSBmYWxzZTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFVyaUJ1aWxkZXIuZnJvbVBhdGgoImh0dHA6Ly9sb2NhbGhvc3QiKS5ob3N0KCIiKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGNhdWdodCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoY2F1Z2h0KTsKKworICAgICAgICBVUkkgdXJpID0gVXJpQnVpbGRlci5mcm9tUGF0aCgiIikuaG9zdCgiYWJjIikuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCIvL2FiYyIpLCB1cmkpOworCisgICAgICAgIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVBhdGgoIiIpLmhvc3QoImFiYyIpLmhvc3QobnVsbCkuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCIiKSwgdXJpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHRlc3QgaGFzIGJlZW4gcmV3cml0dGVuIGFzIHBhcnQgb2YgZml4IGZvciBKRVJTRVktMjM3OC4KKyAgICAgKiBUaGUgbmV3IHB1cnBvc2Ugb2YgdGhpcyB0ZXN0IGlzIHRvIGRlbW9uc3RyYXRlIGhvdyBvbGQgYmVoYXZpb3Igb2YgVXJpQnVpbGRlci5idWlsZCgpIG1ldGhvZAorICAgICAqIHdydC4gdW5yZXNvbHZlZCB0ZW1wbGF0ZXMgY2FuIGJlIGFjaGlldmVkIHZpYSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkudXJpLlVyaUNvbXBvbmVudCNlbmNvZGVUZW1wbGF0ZU5hbWVzKFN0cmluZyl9CisgICAgICogbWV0aG9kLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVuY29kZVRlbXBsYXRlTmFtZXMoKSB7CisgICAgICAgIGZpbmFsIFVSSSB1cmkgPSBVUkkuY3JlYXRlKFVyaUNvbXBvbmVudC5lbmNvZGVUZW1wbGF0ZU5hbWVzKFVyaUJ1aWxkZXIuZnJvbVBhdGgoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCIpLnBhdGgoCisgICAgICAgICAgICAgICAgIi97YX0ve2J9IikucmVwbGFjZVF1ZXJ5KCJxPXtjfSIpLnRvVGVtcGxhdGUoKSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFVSSS5jcmVhdGUoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8lN0JhJTdELyU3QmIlN0Q/cT0lN0JjJTdEIiksIHVyaSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXNvbHZlVGVtcGxhdGVUZXN0KCkgeworICAgICAgICBmaW5hbCBVcmlCdWlsZGVyIHVyaUJ1aWxkZXIgPSBVcmlCdWlsZGVyLmZyb21QYXRoKCJodHRwOi8vbG9jYWxob3N0OjgwODAiKS5wYXRoKCJ7YX0iKS5wYXRoKCJ7Yn0iKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJxdWVyeSIsICJ7cX0iKTsKKyAgICAgICAgdXJpQnVpbGRlci5yZXNvbHZlVGVtcGxhdGUoImEiLCAicGFyYW0tYSIpOworICAgICAgICB1cmlCdWlsZGVyLnJlc29sdmVUZW1wbGF0ZSgicSIsICJwYXJhbS1xIik7CisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gbSA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICBtLnB1dCgiYSIsICJpZ25vcmVkLWEiKTsKKyAgICAgICAgbS5wdXQoImIiLCAicGFyYW0tYiIpOworICAgICAgICBtLnB1dCgicSIsICJpZ25vcmVkLXEiKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvcGFyYW0tYS9wYXJhbS1iP3F1ZXJ5PXBhcmFtLXEiKSwgdXJpQnVpbGRlci5idWlsZEZyb21NYXAobSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVzb2x2ZVRlbXBsYXRlRnJvbUVuY29kZWRUZXN0KCkgeworICAgICAgICBmaW5hbCBVcmlCdWlsZGVyIHVyaUJ1aWxkZXIgPSBVcmlCdWlsZGVyLmZyb21QYXRoKCJodHRwOi8vbG9jYWxob3N0OjgwODAiKS5wYXRoKCJ7YX0iKS5wYXRoKCJ7Yn0iKS5wYXRoKCJ7Y30iKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJxdWVyeSIsICJ7cX0iKTsKKyAgICAgICAgdXJpQnVpbGRlci5yZXNvbHZlVGVtcGxhdGVGcm9tRW5jb2RlZCgiYSIsICJ4L3kveiUzRiUyMCIpOworICAgICAgICB1cmlCdWlsZGVyLnJlc29sdmVUZW1wbGF0ZUZyb21FbmNvZGVkKCJxIiwgInE/JTIwJTI2Iik7CisgICAgICAgIHVyaUJ1aWxkZXIucmVzb2x2ZVRlbXBsYXRlKCJjIiwgInBhcmFtYzEvcGFyYW1jMiIpOworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IG0gPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICAgICAgbS5wdXQoImEiLCAiaWdub3JlZC1hIik7CisgICAgICAgIG0ucHV0KCJiIiwgInBhcmFtLWIvYWFhIik7CisgICAgICAgIG0ucHV0KCJxIiwgImlnbm9yZWQtcSIpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJodHRwOi8vbG9jYWxob3N0OjgwODAveC95L3olM0YlMjAvcGFyYW0tYi9hYWEvcGFyYW1jMSUyRnBhcmFtYzI/cXVlcnk9cSUzRiUyMCUyNiIsCisgICAgICAgICAgICAgICAgdXJpQnVpbGRlci5idWlsZEZyb21FbmNvZGVkTWFwKG0pLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVzb2x2ZVRlbXBsYXRlV2l0aG91dEVuY29kZWRUZXN0KCkgeworICAgICAgICBmaW5hbCBVcmlCdWlsZGVyIHVyaUJ1aWxkZXIgPSBVcmlCdWlsZGVyLmZyb21QYXRoKCJodHRwOi8vbG9jYWxob3N0OjgwODAiKS5wYXRoKCJ7YX0iKS5wYXRoKCJ7Yn0iKS5wYXRoKCJ7Y30iKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJxdWVyeSIsICJ7cX0iKTsKKyAgICAgICAgdXJpQnVpbGRlci5yZXNvbHZlVGVtcGxhdGUoImEiLCAieC95L3olM0YlMjAiKTsKKyAgICAgICAgdXJpQnVpbGRlci5yZXNvbHZlVGVtcGxhdGUoInEiLCAicT8lMjAlMjYiKTsKKyAgICAgICAgdXJpQnVpbGRlci5yZXNvbHZlVGVtcGxhdGUoImMiLCAicGFyYW1jMS9wYXJhbWMyIik7CisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gbSA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICBtLnB1dCgiYSIsICJpZ25vcmVkLWEiKTsKKyAgICAgICAgbS5wdXQoImIiLCAicGFyYW0tYi9hYWEiKTsKKyAgICAgICAgbS5wdXQoInEiLCAiaWdub3JlZC1xIik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC94JTJGeSUyRnolMjUzRiUyNTIwL3BhcmFtLWIlMkZhYWEvcGFyYW1jMSUyRnBhcmFtYzI/cXVlcnk9cSUzRiUyNTIwJTI1MjYiLAorICAgICAgICAgICAgICAgIHVyaUJ1aWxkZXIuYnVpbGRGcm9tTWFwKG0pLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVzb2x2ZVRlbXBsYXRlV2l0aEVuY29kZWRTbGFzaFRlc3QoKSB7CisgICAgICAgIGZpbmFsIFVyaUJ1aWxkZXIgdXJpQnVpbGRlciA9IFVyaUJ1aWxkZXIuZnJvbVBhdGgoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCIpLnBhdGgoInthfSIpLnBhdGgoIntifSIpCisgICAgICAgICAgICAgICAgLnF1ZXJ5UGFyYW0oInF1ZXJ5IiwgIntxfSIpOworICAgICAgICB1cmlCdWlsZGVyLnJlc29sdmVUZW1wbGF0ZSgiYSIsICJwYXJhbS1hL3dpdGhTbGFzaCIsIGZhbHNlKTsKKyAgICAgICAgdXJpQnVpbGRlci5yZXNvbHZlVGVtcGxhdGUoImIiLCAicGFyYW0tYi93aXRoRW5jb2RlZFNsYXNoIiwgdHJ1ZSk7CisgICAgICAgIHVyaUJ1aWxkZXIucmVzb2x2ZVRlbXBsYXRlKCJxIiwgInBhcmFtLXEiLCB0cnVlKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvcGFyYW0tYS93aXRoU2xhc2gvcGFyYW0tYiUyRndpdGhFbmNvZGVkU2xhc2g/cXVlcnk9cGFyYW0tcSIpLAorICAgICAgICAgICAgICAgIHVyaUJ1aWxkZXIuYnVpbGQoKSk7CisgICAgICAgIHVyaUJ1aWxkZXIuYnVpbGQoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlc29sdmVUZW1wbGF0ZXNUZXN0KCkgeworICAgICAgICBmaW5hbCBVcmlCdWlsZGVyIHVyaUJ1aWxkZXIgPSBVcmlCdWlsZGVyLmZyb21QYXRoKCJodHRwOi8vbG9jYWxob3N0OjgwODAiKS5wYXRoKCJ7YX0iKS5wYXRoKCJ7Yn0iKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJxdWVyeSIsICJ7cX0iKTsKKworICAgICAgICB1cmlCdWlsZGVyLnJlc29sdmVUZW1wbGF0ZSgiYSIsICJwYXJhbS1hIik7CisgICAgICAgIHVyaUJ1aWxkZXIucmVzb2x2ZVRlbXBsYXRlKCJxIiwgInBhcmFtLXEiKTsKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBidWlsZE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICBidWlsZE1hcC5wdXQoImEiLCAiaWdub3JlZC1hIik7CisgICAgICAgIGJ1aWxkTWFwLnB1dCgiYiIsICJwYXJhbS1iIik7CisgICAgICAgIGJ1aWxkTWFwLnB1dCgicSIsICJpZ25vcmVkLXEiKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvcGFyYW0tYS9wYXJhbS1iP3F1ZXJ5PXBhcmFtLXEiKSwgdXJpQnVpbGRlci5idWlsZEZyb21NYXAoYnVpbGRNYXApKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlc29sdmVUZW1wbGF0ZXNGcm9tRW5jb2RlZFRlc3QoKSB7CisgICAgICAgIGZpbmFsIFVyaUJ1aWxkZXIgdXJpQnVpbGRlciA9IFVyaUJ1aWxkZXIuZnJvbVBhdGgoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCIpLnBhdGgoInthfSIpLnBhdGgoIntifSIpLnBhdGgoIntjfSIpCisgICAgICAgICAgICAgICAgLnF1ZXJ5UGFyYW0oInF1ZXJ5IiwgIntxfSIpOworCisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzb2x2ZU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICByZXNvbHZlTWFwLnB1dCgiYSIsICJ4L3kveiUzRiUyMCIpOworICAgICAgICByZXNvbHZlTWFwLnB1dCgicSIsICJxPyUyMCUyNiIpOworICAgICAgICByZXNvbHZlTWFwLnB1dCgiYyIsICJwYXJhbWMxL3BhcmFtYzIiKTsKKyAgICAgICAgdXJpQnVpbGRlci5yZXNvbHZlVGVtcGxhdGVzRnJvbUVuY29kZWQocmVzb2x2ZU1hcCk7CisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gYnVpbGRNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICAgICAgYnVpbGRNYXAucHV0KCJiIiwgInBhcmFtLWIvYWFhIik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC94L3kveiUzRiUyMC9wYXJhbS1iL2FhYS9wYXJhbWMxL3BhcmFtYzI/cXVlcnk9cSUzRiUyMCUyNiIsCisgICAgICAgICAgICAgICAgdXJpQnVpbGRlci5idWlsZEZyb21FbmNvZGVkTWFwKGJ1aWxkTWFwKS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlc29sdmVUZW1wbGF0ZXNGcm9tTm90RW5jb2RlZFRlc3QoKSB7CisgICAgICAgIGZpbmFsIFVyaUJ1aWxkZXIgdXJpQnVpbGRlciA9IFVyaUJ1aWxkZXIuZnJvbVBhdGgoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCIpLnBhdGgoInthfSIpLnBhdGgoIntifSIpLnBhdGgoIntjfSIpCisgICAgICAgICAgICAgICAgLnF1ZXJ5UGFyYW0oInF1ZXJ5IiwgIntxfSIpOworCisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzb2x2ZU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICByZXNvbHZlTWFwLnB1dCgiYSIsICJ4L3kveiUzRiUyMCIpOworICAgICAgICByZXNvbHZlTWFwLnB1dCgicSIsICJxPyUyMCUyNiIpOworICAgICAgICByZXNvbHZlTWFwLnB1dCgiYyIsICJwYXJhbWMxL3BhcmFtYzIiKTsKKyAgICAgICAgdXJpQnVpbGRlci5yZXNvbHZlVGVtcGxhdGVzKHJlc29sdmVNYXApOworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IGJ1aWxkTWFwID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KCk7CisgICAgICAgIGJ1aWxkTWFwLnB1dCgiYiIsICJwYXJhbS1iL2FhYSIpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJodHRwOi8vbG9jYWxob3N0OjgwODAveCUyRnklMkZ6JTI1M0YlMjUyMC9wYXJhbS1iJTJGYWFhL3BhcmFtYzElMkZwYXJhbWMyP3F1ZXJ5PXElM0YlMjUyMCUyNTI2IiwKKyAgICAgICAgICAgICAgICB1cmlCdWlsZGVyLmJ1aWxkRnJvbU1hcChidWlsZE1hcCkudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXNvbHZlVGVtcGxhdGVzRW5jb2RlU2xhc2goKSB7CisgICAgICAgIGZpbmFsIFVyaUJ1aWxkZXIgdXJpQnVpbGRlciA9IFVyaUJ1aWxkZXIuZnJvbVBhdGgoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCIpLnBhdGgoInthfSIpLnBhdGgoIntifSIpLnBhdGgoIntjfSIpCisgICAgICAgICAgICAgICAgLnF1ZXJ5UGFyYW0oInF1ZXJ5IiwgIntxfSIpOworCisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gcmVzb2x2ZU1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICByZXNvbHZlTWFwLnB1dCgiYSIsICJ4L3kveiUzRiUyMCIpOworICAgICAgICByZXNvbHZlTWFwLnB1dCgicSIsICJxPyUyMCUyNiIpOworICAgICAgICByZXNvbHZlTWFwLnB1dCgiYyIsICJwYXJhbWMxL3BhcmFtYzIiKTsKKyAgICAgICAgdXJpQnVpbGRlci5yZXNvbHZlVGVtcGxhdGVzKHJlc29sdmVNYXAsIGZhbHNlKTsKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgT2JqZWN0PiBidWlsZE1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICBidWlsZE1hcC5wdXQoImIiLCAicGFyYW0tYi9hYWEiKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3gveS96JTI1M0YlMjUyMC9wYXJhbS1iL2FhYS9wYXJhbWMxL3BhcmFtYzI/cXVlcnk9cSUzRiUyNTIwJTI1MjYiLAorICAgICAgICAgICAgICAgIHVyaUJ1aWxkZXIuYnVpbGRGcm9tTWFwKGJ1aWxkTWFwLCBmYWxzZSkudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXNvbHZlVGVtcGxhdGVzV2l0aEVuY29kZWRTbGFzaFRlc3QoKSB7CisgICAgICAgIGZpbmFsIFVyaUJ1aWxkZXIgdXJpQnVpbGRlciA9IFVyaUJ1aWxkZXIuZnJvbVBhdGgoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MCIpLnBhdGgoInthfSIpLnBhdGgoIntifSIpCisgICAgICAgICAgICAgICAgLnF1ZXJ5UGFyYW0oInF1ZXJ5IiwgIntxfSIpOworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBPYmplY3Q+IHJlc29sdmVNYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKKyAgICAgICAgcmVzb2x2ZU1hcC5wdXQoImEiLCAicGFyYW0tYS93aXRoU2xhc2giKTsKKyAgICAgICAgcmVzb2x2ZU1hcC5wdXQoInEiLCAicGFyYW0tcSIpOworICAgICAgICB1cmlCdWlsZGVyLnJlc29sdmVUZW1wbGF0ZXMocmVzb2x2ZU1hcCwgZmFsc2UpOworICAgICAgICB1cmlCdWlsZGVyLnJlc29sdmVUZW1wbGF0ZSgiYiIsICJwYXJhbS1iL3dpdGhFbmNvZGVkU2xhc2giLCB0cnVlKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvcGFyYW0tYS93aXRoU2xhc2gvcGFyYW0tYiUyRndpdGhFbmNvZGVkU2xhc2g/cXVlcnk9cGFyYW0tcSIpLAorICAgICAgICAgICAgICAgIHVyaUJ1aWxkZXIuYnVpbGQoKSk7CisgICAgICAgIHVyaUJ1aWxkZXIuYnVpbGQoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlc29sdmVUZW1wbGF0ZU11bHRpcGxlQ2FsbCgpIHsKKyAgICAgICAgZmluYWwgVXJpQnVpbGRlciB1cmlCdWlsZGVyID0gVXJpQnVpbGRlci5mcm9tUGF0aCgiaHR0cDovL2xvY2FsaG9zdDo4MDgwIikucGF0aCgie3N0YXJ0fSIpLnBhdGgoInthfSIpCisgICAgICAgICAgICAgICAgLnJlc29sdmVUZW1wbGF0ZSgiYSIsICJmaXJzdC1hIikucGF0aCgie2F9IikucmVzb2x2ZVRlbXBsYXRlKCJhIiwgInNlY29uZC1hIikKKyAgICAgICAgICAgICAgICAucGF0aCgie2F9L3thfSIpLnJlc29sdmVUZW1wbGF0ZSgiYSIsICJ0d2ljZS1hIik7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvc3RhcnQtcGF0aC9maXJzdC1hL3NlY29uZC1hL3R3aWNlLWEvdHdpY2UtYSIpLAorICAgICAgICAgICAgICAgIHVyaUJ1aWxkZXIuYnVpbGQoInN0YXJ0LXBhdGgiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXBsYWNlV2l0aEVtdHB5U2NoZW1lRnJvbVVyaVRlc3QoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHVyaU9yaWcgPSAiZnRwOi8vZnRwLmlzLmNvLnphL3JmYy9yZmMxODA4LnR4dCI7CisgICAgICAgIGZpbmFsIFVSSSB1cmlSZXBsYWNlID0gbmV3IFVSSShudWxsLCAiZnRwLmlzLmNvLnphIiwgIi90ZXN0L3JmYzE4MDgudHh0IiwgbnVsbCwgbnVsbCk7CisgICAgICAgIGZpbmFsIFVSSSB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkobmV3IFVSSSh1cmlPcmlnKSkudXJpKHVyaVJlcGxhY2UpLmJ1aWxkKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImZ0cDovL2Z0cC5pcy5jby56YS90ZXN0L3JmYzE4MDgudHh0IiwgdXJpLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVwbGFjZVdpdGhFbXB0eVNjaGVtZUZyb21TdHJpbmdUZXN0KCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyB1cmlPcmlnID0gImZ0cDovL2Z0cC5pcy5jby56YS9yZmMvcmZjMTgwOC50eHQiOworICAgICAgICBmaW5hbCBVUkkgdXJpUmVwbGFjZSA9IG5ldyBVUkkobnVsbCwgImZ0cC5pcy5jby56YSIsICIvdGVzdC9yZmMxODA4LnR4dCIsIG51bGwsIG51bGwpOworCisgICAgICAgIGZpbmFsIFVSSSB1cmkgPSBVcmlCdWlsZGVyLmZyb21VcmkobmV3IFVSSSh1cmlPcmlnKSkudXJpKHVyaVJlcGxhY2UudG9BU0NJSVN0cmluZygpKS5idWlsZCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJmdHA6Ly9mdHAuaXMuY28uemEvdGVzdC9yZmMxODA4LnR4dCIsIHVyaS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlcGxhY2VXaXRoRW1wdHlRdWVyeUZyb21TdHJpbmdUZXN0KCkgdGhyb3dzIFVSSVN5bnRheEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyB1cmlPcmlnID0gImZ0cDovL2Z0cC5pcy5jby56YS9yZmMvcmZjMTgwOC50eHQ/YT0xIjsKKyAgICAgICAgZmluYWwgVVJJIHVyaVJlcGxhY2UgPSBuZXcgVVJJKG51bGwsICJmdHAuaXMuY28uemEiLCAiL3Rlc3QvcmZjMTgwOC50eHQiLCBudWxsLCBudWxsKTsKKworICAgICAgICBmaW5hbCBVUkkgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKG5ldyBVUkkodXJpT3JpZykpLnVyaSh1cmlSZXBsYWNlLnRvQVNDSUlTdHJpbmcoKSkuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiZnRwOi8vZnRwLmlzLmNvLnphL3Rlc3QvcmZjMTgwOC50eHQ/YT0xIiwgdXJpLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcmVwbGFjZVdpdGhFbXB0eUZyYWdtZW50RnJvbVN0cmluZ1Rlc3QoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHVyaU9yaWcgPSAiZnRwOi8vZnRwLmlzLmNvLnphL3JmYy9yZmMxODA4LnR4dCNteUZyYWdtZW50IjsKKyAgICAgICAgZmluYWwgVVJJIHVyaVJlcGxhY2UgPSBuZXcgVVJJKG51bGwsICJmdHAuaXMuY28uemEiLCAiL3Rlc3QvcmZjMTgwOC50eHQiLCBudWxsLCBudWxsKTsKKworICAgICAgICBmaW5hbCBVUkkgdXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKG5ldyBVUkkodXJpT3JpZykpLnVyaSh1cmlSZXBsYWNlLnRvQVNDSUlTdHJpbmcoKSkuYnVpbGQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiZnRwOi8vZnRwLmlzLmNvLnphL3Rlc3QvcmZjMTgwOC50eHQjbXlGcmFnbWVudCIsIHVyaS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlcGxhY2VPcGFxdWVVcmlXaXRoTm9uT3BhcXVlRnJvbVN0cmluZ1Rlc3QoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGZpcnN0ID0gIm5ld3M6Y29tcC5sYW5nLmphdmEiOworICAgICAgICBmaW5hbCBTdHJpbmcgc2Vjb25kID0gImh0dHA6Ly9jb21wLmxhbmcuamF2YSI7CisgICAgICAgIFVyaUJ1aWxkZXIuZnJvbVVyaShuZXcgVVJJKGZpcnN0KSkudXJpKHNlY29uZCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCByZXBsYWNlT3BhcXVlVXJpV2l0aE5vbk9wYXF1ZUZyb21TdHJpbmdUZXN0MigpIHRocm93cyBVUklTeW50YXhFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgZmlyc3QgPSAibmV3czpjb21wLmxhbmcuamF2YSI7CisgICAgICAgIGZpbmFsIFN0cmluZyBzZWNvbmQgPSAiaHR0cDovL2NvbXAubGFuZy5qYXZhIjsKKyAgICAgICAgVXJpQnVpbGRlci5mcm9tVXJpKG5ldyBVUkkoZmlyc3QpKS5zY2hlbWUoImh0dHAiKS51cmkoc2Vjb25kKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlcGxhY2VPcGFxdWVVcmlXaXRoTm9uT3BhcXVlRnJvbVVyaVRlc3QoKSB0aHJvd3MgVVJJU3ludGF4RXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGZpcnN0ID0gIm5ld3M6Y29tcC5sYW5nLmphdmEiOworICAgICAgICBmaW5hbCBTdHJpbmcgc2Vjb25kID0gImh0dHA6Ly9jb21wLmxhbmcuamF2YSI7CisgICAgICAgIFVyaUJ1aWxkZXIuZnJvbVVyaShuZXcgVVJJKGZpcnN0KSkudXJpKG5ldyBVUkkoc2Vjb25kKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UXVlcnlQYXJhbUVuY29kZWQoKSB7CisgICAgICAgIGZpbmFsIFVyaUJ1aWxkZXIgdXJpQnVpbGRlciA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3BhdGgiKTsKKyAgICAgICAgdXJpQnVpbGRlci5xdWVyeVBhcmFtKCJxdWVyeSIsICIlZHVtbXkyMyIpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJodHRwOi8vbG9jYWxob3N0OjgwODAvcGF0aD9xdWVyeT0lMjVkdW1teTIzIiwgdXJpQnVpbGRlci5idWlsZCgpLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFF1ZXJ5UGFyYW1FbmNvZGVkMigpIHsKKyAgICAgICAgZmluYWwgVXJpQnVpbGRlciB1cmlCdWlsZGVyID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0OjgwODAvcGF0aCIpOworICAgICAgICB1cmlCdWlsZGVyLnF1ZXJ5UGFyYW0oInF1ZXJ5IiwgIntwYXJhbX0iKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3BhdGg/cXVlcnk9JTI1ZHVtbXkyMyIsIHVyaUJ1aWxkZXIuYnVpbGQoIiVkdW1teTIzIikudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UXVlcnlQYXJhbUVuY29kZWQzKCkgeworICAgICAgICBmaW5hbCBVcmlCdWlsZGVyIHVyaUJ1aWxkZXIgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9wYXRoIik7CisgICAgICAgIHVyaUJ1aWxkZXIucXVlcnlQYXJhbSgicXVlcnkiLCAie3BhcmFtfSIpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJodHRwOi8vbG9jYWxob3N0OjgwODAvcGF0aD9xdWVyeT0lMjUyNXRlc3QiLCB1cmlCdWlsZGVyLmJ1aWxkKCIlMjV0ZXN0IikudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UXVlcnlQYXJhbUVuY29kZWQ0KCkgeworICAgICAgICBmaW5hbCBVcmlCdWlsZGVyIHVyaUJ1aWxkZXIgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9wYXRoIik7CisgICAgICAgIHVyaUJ1aWxkZXIucXVlcnlQYXJhbSgicXVlcnkiLCAie3BhcmFtfSIpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJodHRwOi8vbG9jYWxob3N0OjgwODAvcGF0aD9xdWVyeT0lMjV0ZXN0IiwgdXJpQnVpbGRlci5idWlsZEZyb21FbmNvZGVkKCIlMjV0ZXN0IikudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UXVlcnlQYXJhbUVuY29kZWQ1KCkgeworICAgICAgICBmaW5hbCBVcmlCdWlsZGVyIHVyaUJ1aWxkZXIgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9wYXRoIik7CisgICAgICAgIHVyaUJ1aWxkZXIucXVlcnlQYXJhbSgicXVlcnkiLCAiISAjICQgJiAnICggKSAqICsgLCAvIDogOyA9ID8gQCBbIF0iKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiaHR0cDovL2xvY2FsaG9zdDo4MDgwL3BhdGg/cXVlcnk9JTIxKyUyMyslMjQrJTI2KyUyNyslMjgrJTI5KyUyQSslMkIrJTJDKyUyRislM0ErJTNCKyUzRCslM0YrJTQwKyU1QislNUQiLAorICAgICAgICAgICAgICAgIHVyaUJ1aWxkZXIuYnVpbGQoKS50b1N0cmluZygpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbi5jb25maWcuVGVzdENvbnRyYWN0IGIvdGVzdHMvZTJlLWNvcmUtY29tbW9uL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uLmNvbmZpZy5UZXN0Q29udHJhY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWM5MmU1NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbi5jb25maWcuVGVzdENvbnRyYWN0CkBAIC0wLDAgKzEsMiBAQAorb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbi5jb25maWcuVGVzdFNlcnZpY2VBCitvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uLmNvbmZpZy5UZXN0U2VydmljZUMKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvcmVzb3VyY2VzL3N1cmVmaXJlLnBvbGljeSBiL3Rlc3RzL2UyZS1jb3JlLWNvbW1vbi9zcmMvdGVzdC9yZXNvdXJjZXMvc3VyZWZpcmUucG9saWN5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlOTlhNWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtY29yZS1jb21tb24vc3JjL3Rlc3QvcmVzb3VyY2VzL3N1cmVmaXJlLnBvbGljeQpAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvLyB3ZSBkbyBub3QgY2FyZSBhYm91dCBqYXZhIGxpYiBpdHNlbGYKK2dyYW50IGNvZGViYXNlICJmaWxlOiR7amF2YS5ob21lfS8tIiB7CisgIHBlcm1pc3Npb24gamF2YS5zZWN1cml0eS5BbGxQZXJtaXNzaW9uOworfTsKKworLy8gd2UgZG8gbm90IGNhcmUgYWJvdXQgb3VyIGRlcGVuZGVuY2llcworZ3JhbnQgY29kZWJhc2UgImZpbGU6JHtzZXR0aW5ncy5sb2NhbFJlcG9zaXRvcnl9Ly0iIHsKKyAgcGVybWlzc2lvbiBqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb247Cit9OworCisvLyB0aGlzIGlzIHRvIGJlIGFibGUgdG8gc2V0IHJ1bnRpbWUgZGVsZWdhdGUgaW5zdGFuY2UgaW4gamF4LXJzIGZyb20gdGhlIHRlc3RzCisvLyBhbmQgdG8gcnVuIG11bHRpLXRocmVhZGVkIHRlc3RzCitncmFudCBjb2RlYmFzZSAiZmlsZToke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS90ZXN0LWNsYXNzZXMvLSIgeworICBwZXJtaXNzaW9uIGphdmEubGFuZy5yZWZsZWN0LlJlZmxlY3RQZXJtaXNzaW9uICJzdXBwcmVzc0FjY2Vzc0NoZWNrcyI7CisgIHBlcm1pc3Npb24gamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uICJtb2RpZnlUaHJlYWQiOworICBwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gIioiLCAid3JpdGUiOworICBwZXJtaXNzaW9uIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiAiZ2V0Q2xhc3NMb2FkZXIiOworICBwZXJtaXNzaW9uIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiAiYWNjZXNzQ2xhc3NJblBhY2thZ2Uuc3VuLm1pc2MiOworICBwZXJtaXNzaW9uIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiAiYWNjZXNzQ2xhc3NJblBhY2thZ2Uuc3VuLm1pc2MuKiI7CisgIHBlcm1pc3Npb24gamF2YS5sYW5nLnJlZmxlY3QuUmVmbGVjdFBlcm1pc3Npb24gInN1cHByZXNzQWNjZXNzQ2hlY2tzIjsKK307CisKK2dyYW50IGNvZGViYXNlICJmaWxlOiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2NsYXNzZXMvLSIgeworICBwZXJtaXNzaW9uIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiAiYWNjZXNzQ2xhc3NJblBhY2thZ2Uuc3VuLm1pc2MiOworICBwZXJtaXNzaW9uIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiAiYWNjZXNzRGVjbGFyZWRNZW1iZXJzIjsKKyAgcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gImdldENsYXNzTG9hZGVyIjsKKyAgcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gIm1vZGlmeVRocmVhZCI7CisgIHBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAiKiIsICJyZWFkIjsKKyAgcGVybWlzc2lvbiBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uICI8PEFMTCBGSUxFUz4+IiwgInJlYWQiOworICBwZXJtaXNzaW9uIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiAiYWNjZXNzQ2xhc3NJblBhY2thZ2Uuc3VuLm1pc2MiOworICBwZXJtaXNzaW9uIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiAiYWNjZXNzQ2xhc3NJblBhY2thZ2Uuc3VuLm1pc2MuKiI7CisgIHBlcm1pc3Npb24gamF2YS5sYW5nLnJlZmxlY3QuUmVmbGVjdFBlcm1pc3Npb24gInN1cHByZXNzQWNjZXNzQ2hlY2tzIjsKK307CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3BvbS54bWwgYi90ZXN0cy9lMmUtZW50aXR5L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZmMzhlMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvcG9tLnhtbApAQCAtMCwwICsxLDIyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0czwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmUyZS1lbnRpdHk8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtZTJlLWVudGl0eTwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgRTJFIEVudGl0eSB0ZXN0czwvZGVzY3JpcHRpb24+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8Zm9ya0NvdW50PjE8L2ZvcmtDb3VudD4KKyAgICAgICAgICAgICAgICAgICAgPHJldXNlRm9ya3M+ZmFsc2U8L3JldXNlRm9ya3M+CisgICAgICAgICAgICAgICAgICAgIDxlbmFibGVBc3NlcnRpb25zPmZhbHNlPC9lbmFibGVBc3NlcnRpb25zPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LmFubm90YXRpb248L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5hbm5vdGF0aW9uLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tdmM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbXZjLWZyZWVtYXJrZXI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbXZjLW11c3RhY2hlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtanNvbi1qYWNrc29uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtanNvbi1qYWNrc29uMTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLWpzb24tamV0dGlzb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1tb3h5PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtanNvbi1wcm9jZXNzaW5nPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtanNvbi1iaW5kaW5nPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWJlYW4tdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1lbnRpdHktZmlsdGVyaW5nPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW12Yy1iZWFuLXZhbGlkYXRpb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1zc2U8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1tdWx0aXBhcnQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb25uZWN0b3JzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWFwYWNoZS1jb25uZWN0b3I8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb25uZWN0b3JzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWdyaXp6bHktY29ubmVjdG9yPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29ubmVjdG9yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1qZXR0eS1jb25uZWN0b3I8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZWN1cml0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm9hdXRoMS1zaWduYXR1cmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZWN1cml0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm9hdXRoMS1jbGllbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZWN1cml0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm9hdXRoMS1zZXJ2ZXI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZWN1cml0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm9hdXRoMi1jbGllbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZ3VhdmE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5ndWF2YTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7Z3VhdmEudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXV0aWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5oYW1jcmVzdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmhhbWNyZXN0LWxpYnJhcnk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPnhtbHVuaXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD54bWx1bml0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnhkazwvaWQ+CisgICAgICAgICAgICA8cHJvcGVydGllcz4KKyAgICAgICAgICAgICAgICA8IS0tIGRvIG5vdCB1c2Ugc2VjdXJpdHkgbWFuYWdlciBmb3IgeGRrIC0tPgorICAgICAgICAgICAgICAgIDxzdXJlZmlyZS5zZWN1cml0eS5hcmdsaW5lIC8+CisgICAgICAgICAgICA8L3Byb3BlcnRpZXM+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+c29uYXI8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5NYW5hZ2VtZW50PgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBkaXNhYmxlIEphQ29DbyBsaXN0ZW5lciBiZWNhdXNlIGl0J3Mgbm90IHdvcmtpbmcgd2l0aCA8Zm9ya01vZGU+YWx3YXlzPC9mb3JrPiAoPHJldXNlRm9ya3M+ZmFsc2U8L3JldXNlRm9ya3M+IHJlc3BlY3RpdmVseSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9qaXJhLnNvbmFyc291cmNlLmNvbS9icm93c2UvU09OQVJKQVZBLTcyOCAoaHR0cHM6Ly9naXRodWIuY29tL1NvbmFyU291cmNlL3NvbmFyLWphdmEvcHVsbC8zMjQpIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydGllcyBjb21iaW5lLnNlbGY9Im92ZXJyaWRlIiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5NYW5hZ2VtZW50PgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorCisgICAgPC9wcm9maWxlcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvQWJzdHJhY3RQYXJhbWV0ZXJUeXBlQXJndW1lbnRPcmRlclRlc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0Fic3RyYWN0UGFyYW1ldGVyVHlwZUFyZ3VtZW50T3JkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgxNzU2ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0Fic3RyYWN0UGFyYW1ldGVyVHlwZUFyZ3VtZW50T3JkZXJUZXN0LmphdmEKQEAgLTAsMCArMSwyMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCisvKioKKyAqIFBhcmVudCBmb3Igc2V0IG9mIFBhcmFtZXRlclR5cGVBcmd1bWVudE9yZGVyIHRlc3RzLgorICoKKyAqIENvbnRhaW5zIGFsbCB0aGUgcHJvdmlkZXJzIGFuZCByZXNvdXJjZXMgZm9yIHRoZSB0ZXN0cy4gVGhlIHJlc291cmNlIGNvbmZpZyBjcmVhdGlvbiBhbmQgdGVzdCBtZXRob2RzIHdlcmUgc2VwYXJhdGVkIGludG8KKyAqIHN1YmNsYXNzZXMuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQYXJhbWV0ZXJUeXBlQXJndW1lbnRPcmRlclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBQcm92aWRlcgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgT2JqZWN0V3JpdGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShmaW5hbCBDbGFzcyB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldFNpemUoZmluYWwgT2JqZWN0IG8sIGZpbmFsIENsYXNzIHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbyhmaW5hbCBPYmplY3QgbywgZmluYWwgQ2xhc3MgdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUsIGZpbmFsIE11bHRpdmFsdWVkTWFwIGh0dHBIZWFkZXJzLCBmaW5hbCBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKQorICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgZW50aXR5U3RyZWFtLndyaXRlKG8udG9TdHJpbmcoKS5nZXRCeXRlcygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgR2VuZXJpY0NsYXNzV3JpdGVyPFQ+IGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8VD4geworCisgICAgICAgIHByaXZhdGUgZmluYWwgQ2xhc3MgYzsKKworICAgICAgICBHZW5lcmljQ2xhc3NXcml0ZXIoZmluYWwgQ2xhc3MgYykgeworICAgICAgICAgICAgdGhpcy5jID0gYzsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBjLmlzQXNzaWduYWJsZUZyb20odHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShmaW5hbCBUIHQsIGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbyhmaW5hbCBUIHQsIGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLCBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBlbnRpdHlTdHJlYW0ud3JpdGUoKGMuZ2V0U2ltcGxlTmFtZSgpICsgdHlwZS5nZXRTaW1wbGVOYW1lKCkpLmdldEJ5dGVzKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBIHt9CisKKyAgICBAUHJvdmlkZXIKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFXcml0ZXIgZXh0ZW5kcyBHZW5lcmljQ2xhc3NXcml0ZXI8QT4geworCisgICAgICAgIHB1YmxpYyBBV3JpdGVyKCkgeworICAgICAgICAgICAgc3VwZXIoQS5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEIgZXh0ZW5kcyBBIHt9CisKKyAgICBAUHJvdmlkZXIKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJXcml0ZXIgZXh0ZW5kcyBHZW5lcmljQ2xhc3NXcml0ZXI8Qj4geworCisgICAgICAgIHB1YmxpYyBCV3JpdGVyKCkgeworICAgICAgICAgICAgc3VwZXIoQi5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEMgZXh0ZW5kcyBCIHt9CisKKyAgICBAUHJvdmlkZXIKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENXcml0ZXIgZXh0ZW5kcyBHZW5lcmljQ2xhc3NXcml0ZXI8Qz4geworCisgICAgICAgIHB1YmxpYyBDV3JpdGVyKCkgeworICAgICAgICAgICAgc3VwZXIoQy5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDbGFzc1Jlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJhIikKKyAgICAgICAgcHVibGljIEEgZ2V0QSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQSgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiYiIpCisgICAgICAgIHB1YmxpYyBCIGdldEIoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEIoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImMiKQorICAgICAgICBwdWJsaWMgQyBnZXRDKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEdlbmVyaWNDbGFzc1JlYWRlcldyaXRlcjxUPiBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5V3JpdGVyPFQ+LCBNZXNzYWdlQm9keVJlYWRlcjxUPiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDbGFzcyBjOworCisgICAgICAgIEdlbmVyaWNDbGFzc1JlYWRlcldyaXRlcihmaW5hbCBDbGFzcyBjKSB7CisgICAgICAgICAgICB0aGlzLmMgPSBjOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBjLmlzQXNzaWduYWJsZUZyb20odHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFQgcmVhZEZyb20oZmluYWwgQ2xhc3M8VD4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLCBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiAoVCkgYy5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIGMuaXNBc3NpZ25hYmxlRnJvbSh0eXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKGZpbmFsIFQgdCwgZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIFQgdCwgZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUsIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZSgoYy5nZXRTaW1wbGVOYW1lKCkgKyB0eXBlLmdldFNpbXBsZU5hbWUoKSkuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFSZWFkZXJXcml0ZXI8VD4gZXh0ZW5kcyBHZW5lcmljQ2xhc3NSZWFkZXJXcml0ZXI8VD4geworCisgICAgICAgIHB1YmxpYyBBUmVhZGVyV3JpdGVyKCkgeworICAgICAgICAgICAgc3VwZXIoQS5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJSZWFkZXJXcml0ZXIgZXh0ZW5kcyBHZW5lcmljQ2xhc3NSZWFkZXJXcml0ZXI8Qj4geworCisgICAgICAgIHB1YmxpYyBCUmVhZGVyV3JpdGVyKCkgeworICAgICAgICAgICAgc3VwZXIoQi5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENSZWFkZXJXcml0ZXIgZXh0ZW5kcyBHZW5lcmljQ2xhc3NSZWFkZXJXcml0ZXI8Qz4geworCisgICAgICAgIHB1YmxpYyBDUmVhZGVyV3JpdGVyKCkgeworICAgICAgICAgICAgc3VwZXIoQy5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0Fic3RyYWN0VHlwZVRlc3Rlci5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvQWJzdHJhY3RUeXBlVGVzdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYzYzhhMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0Fic3RyYWN0VHlwZVRlc3Rlci5qYXZhCkBAIC0wLDAgKzEsMTgzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHk7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdHJhaW5lZFRvOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5SdW50aW1lVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlc3BvbnNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVzcG9uc2VGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvckNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuUmVhZGVyV3JpdGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQWJzdHJhY3QgZW50aXR5IHR5cGUgdGVzdGVyIGJhc2UgY2xhc3MuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RUeXBlVGVzdGVyIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFRocmVhZExvY2FsIGxvY2FsUmVxdWVzdEVudGl0eSA9IG5ldyBUaHJlYWRMb2NhbCgpOworCisgICAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBBUmVzb3VyY2U8VD4geworCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBUIHBvc3QoVCB0KSB7CisgICAgICAgICAgICByZXR1cm4gdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVxdWVzdEVudGl0eUludGVyY2VwdG9yIGltcGxlbWVudHMgV3JpdGVySW50ZXJjZXB0b3IgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBhcm91bmRXcml0ZVRvKFdyaXRlckludGVyY2VwdG9yQ29udGV4dCB3cml0ZXJJbnRlcmNlcHRvckNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG9yaWdpbmFsID0gd3JpdGVySW50ZXJjZXB0b3JDb250ZXh0LmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICB3cml0ZXJJbnRlcmNlcHRvckNvbnRleHQuc2V0T3V0cHV0U3RyZWFtKGJhb3MpOworICAgICAgICAgICAgd3JpdGVySW50ZXJjZXB0b3JDb250ZXh0LnByb2NlZWQoKTsKKyAgICAgICAgICAgIGZpbmFsIGJ5dGVbXSByZXF1ZXN0RW50aXR5ID0gYmFvcy50b0J5dGVBcnJheSgpOworICAgICAgICAgICAgd3JpdGVySW50ZXJjZXB0b3JDb250ZXh0LnNldFByb3BlcnR5KCJyZXF1ZXN0RW50aXR5IiwgcmVxdWVzdEVudGl0eSk7CisgICAgICAgICAgICBvcmlnaW5hbC53cml0ZShyZXF1ZXN0RW50aXR5KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzcG9uc2VGaWx0ZXIgaW1wbGVtZW50cyBDbGllbnRSZXNwb25zZUZpbHRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDbGllbnRSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCwgQ2xpZW50UmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGxvY2FsUmVxdWVzdEVudGl0eS5zZXQocmVxdWVzdENvbnRleHQuZ2V0UHJvcGVydHkoInJlcXVlc3RFbnRpdHkiKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb29rcyBmb3IgYWxsIHJlc291cmNlcyBhbmQgcHJvdmlkZXJzIGRlY2xhcmVkIGFzIGlubmVyIGNsYXNzZXMgb2YgdGhlIHN1YmNsYXNzIG9mIHRoaXMgY2xhc3MKKyAgICAgKiBhbmQgYWRkcyB0aGVtIHRvIHRoZSByZXR1cm5lZCBSZXNvdXJjZUNvbmZpZyAodW5sZXNzIGNvbnN0cmFpbmVkIHRvIGNsaWVudCBzaWRlKS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gUmVzb3VyY2VDb25maWcgaW5zdGFuY2UKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBIYXNoU2V0PENsYXNzPD8+PiBjbGFzc2VzID0gbmV3IEhhc2hTZXQ8Q2xhc3M8Pz4+KCk7CisKKyAgICAgICAgZm9yIChDbGFzczw/PiBjbHMgOiBnZXRDbGFzcygpLmdldERlY2xhcmVkQ2xhc3NlcygpKSB7CisgICAgICAgICAgICBpZiAoY2xzLmdldEFubm90YXRpb24oUGF0aC5jbGFzcykgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNsYXNzZXMuYWRkKGNscyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGNscy5nZXRBbm5vdGF0aW9uKFByb3ZpZGVyLmNsYXNzKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgQ29uc3RyYWluZWRUbyBjb25zdHJhaW5lZFRvID0gY2xzLmdldEFubm90YXRpb24oQ29uc3RyYWluZWRUby5jbGFzcyk7CisgICAgICAgICAgICAgICAgaWYgKGNvbnN0cmFpbmVkVG8gPT0gbnVsbCB8fCBjb25zdHJhaW5lZFRvLnZhbHVlKCkgPT0gUnVudGltZVR5cGUuU0VSVkVSKSB7CisgICAgICAgICAgICAgICAgICAgIGNsYXNzZXMuYWRkKGNscyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhjbGFzc2VzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb29rcyBmb3IgYWxsIHByb3ZpZGVycyBkZWNsYXJlZCBhcyBpbm5lciBjbGFzc2VzIG9mIHRoZSBzdWJjbGFzcyBvZiB0aGlzIGNsYXNzCisgICAgICogYW5kIGFkZHMgdGhlbSB0byB0aGUgY2xpZW50IGNvbmZpZ3VyYXRpb24gKHVubGVzcyBjb25zdHJhaW5lZCB0byBzZXJ2ZXIgc2lkZSkuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKFJlcXVlc3RFbnRpdHlJbnRlcmNlcHRvci5jbGFzcyk7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihSZXNwb25zZUZpbHRlci5jbGFzcyk7CisKKyAgICAgICAgZm9yIChDbGFzczw/PiBjbHMgOiBnZXRDbGFzcygpLmdldERlY2xhcmVkQ2xhc3NlcygpKSB7CisgICAgICAgICAgICBpZiAoY2xzLmdldEFubm90YXRpb24oUHJvdmlkZXIuY2xhc3MpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBDb25zdHJhaW5lZFRvIGNvbnN0cmFpbmVkVG8gPSBjbHMuZ2V0QW5ub3RhdGlvbihDb25zdHJhaW5lZFRvLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBpZiAoY29uc3RyYWluZWRUbyA9PSBudWxsIHx8IGNvbnN0cmFpbmVkVG8udmFsdWUoKSA9PSBSdW50aW1lVHlwZS5DTElFTlQpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLnJlZ2lzdGVyKGNscyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIDxUPiB2b2lkIF90ZXN0KFQgaW4sIENsYXNzIHJlc291cmNlKSB7CisgICAgICAgIF90ZXN0KGluLCByZXNvdXJjZSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIDxUPiB2b2lkIF90ZXN0KFQgaW4sIENsYXNzIHJlc291cmNlLCBNZWRpYVR5cGUgbSkgeworICAgICAgICBfdGVzdChpbiwgcmVzb3VyY2UsIG0sIHRydWUpOworICAgIH0KKworICAgIHByb3RlY3RlZCA8VD4gdm9pZCBfdGVzdChUIGluLCBDbGFzcyByZXNvdXJjZSwgYm9vbGVhbiB2ZXJpZnkpIHsKKyAgICAgICAgX3Rlc3QoaW4sIHJlc291cmNlLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFLCB2ZXJpZnkpOworICAgIH0KKworICAgIHByb3RlY3RlZCA8VD4gdm9pZCBfdGVzdChUIGluLCBDbGFzcyByZXNvdXJjZSwgTWVkaWFUeXBlIG0sIGJvb2xlYW4gdmVyaWZ5KSB7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQocmVzb3VyY2UuZ2V0U2ltcGxlTmFtZSgpKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShpbiwgbSkpOworCisgICAgICAgIGJ5dGVbXSBpbkJ5dGVzID0gZ2V0UmVxdWVzdEVudGl0eSgpOworICAgICAgICBieXRlW10gb3V0Qnl0ZXMgPSBnZXRFbnRpdHlBc0J5dGVBcnJheShyZXNwb25zZSk7CisKKyAgICAgICAgaWYgKHZlcmlmeSkgeworICAgICAgICAgICAgX3ZlcmlmeShpbkJ5dGVzLCBvdXRCeXRlcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGJ5dGVbXSBnZXRSZXF1ZXN0RW50aXR5KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIChieXRlW10pIGxvY2FsUmVxdWVzdEVudGl0eS5nZXQoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGxvY2FsUmVxdWVzdEVudGl0eS5zZXQobnVsbCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgX3ZlcmlmeShieXRlW10gaW4sIGJ5dGVbXSBvdXQpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGluLmxlbmd0aCwgb3V0Lmxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW4ubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpbltpXSAhPSBvdXRbaV0pIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkluZGV4OiAiICsgaSwgaW5baV0sIG91dFtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGJ5dGVbXSBnZXRFbnRpdHlBc0J5dGVBcnJheShSZXNwb25zZSByKSB7CisgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgUmVhZGVyV3JpdGVyLndyaXRlVG8oci5yZWFkRW50aXR5KElucHV0U3RyZWFtLmNsYXNzKSwgYmFvcyk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJhb3MudG9CeXRlQXJyYXkoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9CZWFuU3RyZWFtaW5nVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvQmVhblN0cmVhbWluZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODgyZTZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvQmVhblN0cmVhbWluZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDM2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuQWJzdHJhY3RNZXNzYWdlUmVhZGVyV3JpdGVyUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIEJlYW5TdHJlYW1pbmdUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKGdldENsYXNzKCkuZ2V0RGVjbGFyZWRDbGFzc2VzKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGZvciAoQ2xhc3M8Pz4gYyA6IGdldENsYXNzKCkuZ2V0RGVjbGFyZWRDbGFzc2VzKCkpIHsKKyAgICAgICAgICAgIGlmIChjLmdldEFubm90YXRpb24oUHJvdmlkZXIuY2xhc3MpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb25maWcucmVnaXN0ZXIoYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCZWFuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEJlYW4gYiA9IG5ldyBCZWFuKCJiZWFuIiwgMTIzLCAzLjE0MTVmKTsKKworICAgICAgICAvLyB0aGUgZm9sbG93aW5nIHNob3VsZCB3b3JrIHVzaW5nIEJlYW5Qcm92aWRlciB3aGljaAorICAgICAgICAvLyBzdXBwb3J0cyBCZWFuLmNsYXNzIGZvciB0eXBlIGFwcGxpY2F0aW9uL2JlYW4KKyAgICAgICAgV2ViVGFyZ2V0IHIgPSB0YXJnZXQoKS5wYXRoKCIvYmVhbiIpOworICAgICAgICByLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoYiwgImFwcGxpY2F0aW9uL2JlYW4iKSwgQmVhbi5jbGFzcyk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHIgPSB0YXJnZXQoKS5wYXRoKCIvcGxhaW4iKTsKKyAgICAgICAgICAgIHIucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShiLCAidGV4dC9wbGFpbiIpLCBCZWFuLmNsYXNzKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKGZhbHNlKTsKKyAgICAgICAgfSBjYXRjaCAoUHJvY2Vzc2luZ0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSh0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJlYW5XaWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEJlYW4gYiA9IG5ldyBCZWFuKCJiZWFuIiwgMTIzLCAzLjE0MTVmKTsKKworICAgICAgICAvLyB0aGUgZm9sbG93aW5nIHNob3VsZCB3b3JrIHVzaW5nIEJlYW5XaWxkUHJvdmlkZXIgd2hpY2gKKyAgICAgICAgLy8gc3VwcG9ydHMgQmVhbi5jbGFzcyBmb3IgdHlwZSBhcHBsaWNhdGlvbi8qCisgICAgICAgIHRhcmdldCgpLnBhdGgoIi93aWxkIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShiLCAiYXBwbGljYXRpb24vd2lsZC1iZWFuIiksIEJlYW4uY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJlYW4yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEJlYW4yIGIgPSBuZXcgQmVhbjIoImJlYW4iLCAxMjMsIDMuMTQxNWYpOworCisgICAgICAgIHRhcmdldCgpLnBhdGgoIi9iZWFuMiIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoYiwgImFwcGxpY2F0aW9uL2JlYW4iKSwgQmVhbjIuY2xhc3MpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0YXJnZXQoKS5wYXRoKCIvcGxhaW4yIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShiLCAidGV4dC9wbGFpbiIpLCBCZWFuMi5jbGFzcyk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShmYWxzZSk7CisgICAgICAgIH0gY2F0Y2ggKFByb2Nlc3NpbmdFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUodHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCZWFuMlVzaW5nQmVhbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBCZWFuMiBiID0gbmV3IEJlYW4yKCJiZWFuIiwgMTIzLCAzLjE0MTVmKTsKKworICAgICAgICAvLyB0aGUgZm9sbG93aW5nIHNob3VsZCB3b3JrIHVzaW5nIEJlYW5Qcm92aWRlciB3aGljaAorICAgICAgICAvLyBzdXBwb3J0cyBCZWFuLmNsYXNzIGZvciB0eXBlIGFwcGxpY2F0aW9uL2JlYW4KKyAgICAgICAgdGFyZ2V0KCkucGF0aCgiL2JlYW4iKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KGIsICJhcHBsaWNhdGlvbi9iZWFuIiksIEJlYW4yLmNsYXNzKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGFyZ2V0KCkucGF0aCgiL3BsYWluIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShiLCAidGV4dC9wbGFpbiIpLCBCZWFuMi5jbGFzcyk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0gY2F0Y2ggKFByb2Nlc3NpbmdFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIGdvb2QKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJlYW4yV2lsZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBCZWFuMiBiID0gbmV3IEJlYW4yKCJiZWFuIiwgMTIzLCAzLjE0MTVmKTsKKworICAgICAgICAvLyB0aGUgZm9sbG93aW5nIHNob3VsZCB3b3JrIHVzaW5nIEJlYW5XaWxkUHJvdmlkZXIgd2hpY2gKKyAgICAgICAgLy8gc3VwcG9ydHMgQmVhbi5jbGFzcyBmb3IgdHlwZSBhcHBsaWNhdGlvbi8qCisgICAgICAgIHRhcmdldCgpLnBhdGgoIi93aWxkMiIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoYiwgImFwcGxpY2F0aW9uL3dpbGQtYmVhbiIpLCBCZWFuMi5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmVhbjJXaWxkVXNpbmdCZWFuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEJlYW4yIGIgPSBuZXcgQmVhbjIoImJlYW4iLCAxMjMsIDMuMTQxNWYpOworCisgICAgICAgIC8vIHRoZSBmb2xsb3dpbmcgc2hvdWxkIHdvcmsgdXNpbmcgQmVhbldpbGRQcm92aWRlciB3aGljaAorICAgICAgICAvLyBzdXBwb3J0cyBCZWFuLmNsYXNzIGZvciB0eXBlIGFwcGxpY2F0aW9uLyoKKyAgICAgICAgdGFyZ2V0KCkucGF0aCgiL3dpbGQiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KGIsICJhcHBsaWNhdGlvbi93aWxkLWJlYW4iKSwgQmVhbjIuY2xhc3MpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQmVhbiBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIHN0cmluZzsKKyAgICAgICAgcHJpdmF0ZSBpbnQgaW50ZWdlcjsKKyAgICAgICAgcHJpdmF0ZSBmbG9hdCByZWFsOworCisgICAgICAgIHB1YmxpYyBCZWFuKCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEJlYW4oU3RyaW5nIHN0cmluZywgaW50IGludGVnZXIsIGZsb2F0IHJlYWwpIHsKKyAgICAgICAgICAgIHRoaXMuc3RyaW5nID0gc3RyaW5nOworICAgICAgICAgICAgdGhpcy5pbnRlZ2VyID0gaW50ZWdlcjsKKyAgICAgICAgICAgIHRoaXMucmVhbCA9IHJlYWw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBzdHJpbmc7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRTdHJpbmcoU3RyaW5nIHN0cmluZykgeworICAgICAgICAgICAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgaW50IGdldEludGVnZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gaW50ZWdlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEludGVnZXIoaW50IGludGVnZXIpIHsKKyAgICAgICAgICAgIHRoaXMuaW50ZWdlciA9IGludGVnZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgZmxvYXQgZ2V0UmVhbCgpIHsKKyAgICAgICAgICAgIHJldHVybiByZWFsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UmVhbChmbG9hdCByZWFsKSB7CisgICAgICAgICAgICB0aGlzLnJlYWwgPSByZWFsOworICAgICAgICB9CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9iZWFuIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL2JlYW4iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQmVhblByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlUmVhZGVyV3JpdGVyUHJvdmlkZXI8QmVhbj4geworCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uc1tdLCBNZWRpYVR5cGUgbXQpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlID09IEJlYW4uY2xhc3M7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQmVhbiByZWFkRnJvbSgKKyAgICAgICAgICAgICAgICBDbGFzczxCZWFuPiB0eXBlLAorICAgICAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uc1tdLAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIE9iamVjdElucHV0U3RyZWFtIG9pbiA9IG5ldyBPYmplY3RJbnB1dFN0cmVhbShlbnRpdHlTdHJlYW0pOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKEJlYW4pIG9pbi5yZWFkT2JqZWN0KCk7CisgICAgICAgICAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGNhdXNlKSB7CisgICAgICAgICAgICAgICAgSU9FeGNlcHRpb24gZWZmZWN0ID0gbmV3IElPRXhjZXB0aW9uKGNhdXNlLmdldExvY2FsaXplZE1lc3NhZ2UoKSk7CisgICAgICAgICAgICAgICAgZWZmZWN0LmluaXRDYXVzZShjYXVzZSk7CisgICAgICAgICAgICAgICAgdGhyb3cgZWZmZWN0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uc1tdLCBNZWRpYVR5cGUgbXQpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlID09IEJlYW4uY2xhc3M7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKAorICAgICAgICAgICAgICAgIEJlYW4gdCwKKyAgICAgICAgICAgICAgICBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uc1tdLAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBPYmplY3RPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShlbnRpdHlTdHJlYW0pOworICAgICAgICAgICAgb3V0LndyaXRlT2JqZWN0KHQpOworICAgICAgICAgICAgb3V0LmZsdXNoKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uLyoiKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vKiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCZWFuV2lsZFByb3ZpZGVyIGV4dGVuZHMgQmVhblByb3ZpZGVyIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uc1tdLCBNZWRpYVR5cGUgbXQpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlID09IEJlYW4uY2xhc3M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uc1tdLCBNZWRpYVR5cGUgbXQpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlID09IEJlYW4uY2xhc3M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2JlYW4iKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vYmVhbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCZWFuMlByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlUmVhZGVyV3JpdGVyUHJvdmlkZXI8QmVhbjI+IHsKKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb24gYW5ub3RhdGlvbnNbXSwgTWVkaWFUeXBlIG10KSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSBCZWFuMi5jbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBCZWFuMiByZWFkRnJvbSgKKyAgICAgICAgICAgICAgICBDbGFzczxCZWFuMj4gdHlwZSwKKyAgICAgICAgICAgICAgICBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbnNbXSwKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBvaW4gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oZW50aXR5U3RyZWFtKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChCZWFuMikgb2luLnJlYWRPYmplY3QoKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gY2F1c2UpIHsKKyAgICAgICAgICAgICAgICBJT0V4Y2VwdGlvbiBlZmZlY3QgPSBuZXcgSU9FeGNlcHRpb24oY2F1c2UuZ2V0TG9jYWxpemVkTWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICBlZmZlY3QuaW5pdENhdXNlKGNhdXNlKTsKKyAgICAgICAgICAgICAgICB0aHJvdyBlZmZlY3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uIGFubm90YXRpb25zW10sIE1lZGlhVHlwZSBtdCkgeworICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gQmVhbjIuY2xhc3M7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKAorICAgICAgICAgICAgICAgIEJlYW4yIHQsCisgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gdHlwZSwKKyAgICAgICAgICAgICAgICBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbnNbXSwKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgT2JqZWN0T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oZW50aXR5U3RyZWFtKTsKKyAgICAgICAgICAgIG91dC53cml0ZU9iamVjdCh0KTsKKyAgICAgICAgICAgIG91dC5mbHVzaCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi8qIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uLyoiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQmVhbjJXaWxkUHJvdmlkZXIgZXh0ZW5kcyBCZWFuMlByb3ZpZGVyIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uc1tdLCBNZWRpYVR5cGUgbXQpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlID09IEJlYW4yLmNsYXNzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb24gYW5ub3RhdGlvbnNbXSwgTWVkaWFUeXBlIG10KSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSBCZWFuMi5jbGFzczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQmVhbjIgZXh0ZW5kcyBCZWFuIHsKKyAgICAgICAgcHVibGljIEJlYW4yKFN0cmluZyBzdHJpbmcsIGludCBpbnRlZ2VyLCBmbG9hdCByZWFsKSB7CisgICAgICAgICAgICBzdXBlcihzdHJpbmcsIGludGVnZXIsIHJlYWwpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi9iZWFuIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJlYW5SZXNvdXJjZSB7CisgICAgICAgIEBQT1NUCisgICAgICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vYmVhbiIpCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYmVhbiIpCisgICAgICAgIHB1YmxpYyBCZWFuIHBvc3QoQmVhbiB0KSB7CisgICAgICAgICAgICByZXR1cm4gdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvYmVhbjIiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQmVhbjJSZXNvdXJjZSB7CisgICAgICAgIEBQT1NUCisgICAgICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vYmVhbiIpCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYmVhbiIpCisgICAgICAgIHB1YmxpYyBCZWFuMiBwb3N0KEJlYW4yIHQpIHsKKyAgICAgICAgICAgIHJldHVybiB0OworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi9wbGFpbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCZWFuVGV4dFBsYWluUmVzb3VyY2UgeworICAgICAgICBAUE9TVAorICAgICAgICBAQ29uc3VtZXMoInRleHQvcGxhaW4iKQorICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgICAgICBwdWJsaWMgQmVhbiBwb3N0KEJlYW4gdCkgeworICAgICAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL3BsYWluMiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCZWFuMlRleHRQbGFpblJlc291cmNlIHsKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQENvbnN1bWVzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgcHVibGljIEJlYW4yIHBvc3QoQmVhbjIgdCkgeworICAgICAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL3dpbGQiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQmVhbldpbGRSZXNvdXJjZSB7CisgICAgICAgIEBQT1NUCisgICAgICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vKiIpCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vKiIpCisgICAgICAgIHB1YmxpYyBCZWFuIHBvc3QoQmVhbiB0KSB7CisgICAgICAgICAgICByZXR1cm4gdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvd2lsZDIiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQmVhbjJXaWxkUmVzb3VyY2UgeworICAgICAgICBAUE9TVAorICAgICAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uLyoiKQorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uLyoiKQorICAgICAgICBwdWJsaWMgQmVhbjIgcG9zdChCZWFuMiB0KSB7CisgICAgICAgICAgICByZXR1cm4gdDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0NoYXJzZXRUZXN0LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9DaGFyc2V0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MWFhMDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9DaGFyc2V0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMjkyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHk7CisKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZvcm07CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkSGFzaE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LkNvbnRleHRSZXNvbHZlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dGlzb24uSmV0dGlzb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmpldHRpc29uLkpldHRpc29uSmF4YkNvbnRleHQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmpldHRpc29uLmpzb24uSlNPTkFycmF5OworaW1wb3J0IG9yZy5jb2RlaGF1cy5qZXR0aXNvbi5qc29uLkpTT05PYmplY3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFJlc3BvbnNlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitwdWJsaWMgY2xhc3MgQ2hhcnNldFRlc3QgZXh0ZW5kcyBBYnN0cmFjdFR5cGVUZXN0ZXIgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nW10gQ0hBUlNFVFMgPSB7CisgICAgICAgICAgICAiVVMtQVNDSUkiLCAiSVNPLTg4NTktMSIsICJVVEYtOCIsICJVVEYtMTZCRSIsICJVVEYtMTZMRSIsICJVVEYtMTYiCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URU5UID0gIlx1MDBBOSBDT05URU5UIFx1MDBGRiBcdTIyMDAgXHUyMkZGIjsKKworICAgIEBQYXRoKCIvU3RyaW5nQ2hhcnNldFJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN0cmluZ0NoYXJzZXRSZXNvdXJjZSB7CisKKyAgICAgICAgQFBhdGgoIlVTLUFTQ0lJIikKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluO2NoYXJzZXQ9VVMtQVNDSUkiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3RVc19Bc2NpaShTdHJpbmcgdCkgeworICAgICAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiSVNPLTg4NTktMSIpCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbjtjaGFyc2V0PUlTTy04ODU5LTEiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3RJc29fODg1OV8xKFN0cmluZyB0KSB7CisgICAgICAgICAgICByZXR1cm4gdDsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJVVEYtOCIpCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbjtjaGFyc2V0PVVURi04IikKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0VXRmXzgoU3RyaW5nIHQpIHsKKyAgICAgICAgICAgIHJldHVybiB0OworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoIlVURi0xNkJFIikKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluO2NoYXJzZXQ9VVRGLTE2QkUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3RVdGZfMTZiZShTdHJpbmcgdCkgeworICAgICAgICAgICAgcmV0dXJuIHQ7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiVVRGLTE2TEUiKQorICAgICAgICBAUE9TVAorICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW47Y2hhcnNldD1VVEYtMTZMRSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdFV0Zl8xNmxlKFN0cmluZyB0KSB7CisgICAgICAgICAgICByZXR1cm4gdDsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJVVEYtMTYiKQorICAgICAgICBAUE9TVAorICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW47Y2hhcnNldD1VVEYtMTYiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3RVdGZfMTYoU3RyaW5nIHQpIHsKKyAgICAgICAgICAgIHJldHVybiB0OworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuICgoUmVzb3VyY2VDb25maWcpIHN1cGVyLmNvbmZpZ3VyZSgpKS5yZWdpc3RlcihuZXcgSmV0dGlzb25GZWF0dXJlKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIHN1cGVyLmNvbmZpZ3VyZUNsaWVudChjb25maWcpOworICAgICAgICBjb25maWcucmVnaXN0ZXIobmV3IEpldHRpc29uRmVhdHVyZSgpKTsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKE15SmF4YkNvbnRleHRSZXNvbHZlci5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nQ2hhcnNldFJlc291cmNlKCkgeworICAgICAgICBTdHJpbmcgaW4gPSAiXHUwMEE5IENPTlRFTlQgXHUwMEZGIFx1MjIwMCBcdTIyRkYiOworCisgICAgICAgIFdlYlRhcmdldCB0ID0gdGFyZ2V0KCkucGF0aCgiU3RyaW5nQ2hhcnNldFJlc291cmNlIik7CisKKyAgICAgICAgZm9yIChTdHJpbmcgY2hhcnNldCA6IENIQVJTRVRTKSB7CisgICAgICAgICAgICBSZXNwb25zZSByID0gdC5wYXRoKGNoYXJzZXQpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoaW4sICJ0ZXh0L3BsYWluO2NoYXJzZXQ9IiArIGNoYXJzZXQpKTsKKworICAgICAgICAgICAgYnl0ZVtdIGluQnl0ZXMgPSBnZXRSZXF1ZXN0RW50aXR5KCk7CisgICAgICAgICAgICBieXRlW10gb3V0Qnl0ZXMgPSBnZXRFbnRpdHlBc0J5dGVBcnJheShyKTsKKworICAgICAgICAgICAgX3ZlcmlmeShpbkJ5dGVzLCBvdXRCeXRlcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIENoYXJzZXRSZXNvdXJjZTxUPiB7CisKKyAgICAgICAgQENvbnRleHQKKyAgICAgICAgSHR0cEhlYWRlcnMgaDsKKworICAgICAgICBAUE9TVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uLyoiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgcG9zdChUIHQpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vayh0LCBoLmdldE1lZGlhVHlwZSgpKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi9TdHJpbmdSZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdHJpbmdSZXNvdXJjZSBleHRlbmRzIENoYXJzZXRSZXNvdXJjZTxTdHJpbmc+IHsKKworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZ1JlcHJlc2VudGF0aW9uKCkgeworICAgICAgICBfdGVzdChDT05URU5ULCBTdHJpbmdSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFBhdGgoIi9Gb3JtTXVsdGl2YWx1ZWRNYXBSZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGb3JtTXVsdGl2YWx1ZWRNYXBSZXNvdXJjZSBleHRlbmRzIENoYXJzZXRSZXNvdXJjZTxNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4+IHsKKworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZvcm1NdWx0aXZhbHVlZE1hcFJlcHJlc2VudGF0aW9uKCkgeworICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gbWFwID0gbmV3IE11bHRpdmFsdWVkSGFzaE1hcDw+KCk7CisKKyAgICAgICAgbWFwLmFkZCgibmFtZSIsICJcdTAwQTkgQ09OVEVOVCBcdTAwRkYgXHUyMjAwIFx1MjJGRiIpOworICAgICAgICBtYXAuYWRkKCJuYW1lIiwgIu+/vSDvv70g77+9Iik7CisgICAgICAgIF90ZXN0KG1hcCwgRm9ybU11bHRpdmFsdWVkTWFwUmVzb3VyY2UuY2xhc3MsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9GT1JNX1VSTEVOQ09ERURfVFlQRSk7CisgICAgfQorCisgICAgQFBhdGgoIi9Gb3JtUmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRm9ybVJlc291cmNlIGV4dGVuZHMgQ2hhcnNldFJlc291cmNlPEZvcm0+IHsKKworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcHJlc2VudGF0aW9uKCkgeworICAgICAgICBGb3JtIGZvcm0gPSBuZXcgRm9ybSgpOworCisgICAgICAgIGZvcm0ucGFyYW0oIm5hbWUiLCAiXHUwMEE5IENPTlRFTlQgXHUwMEZGIFx1MjIwMCBcdTIyRkYiKTsKKyAgICAgICAgZm9ybS5wYXJhbSgibmFtZSIsICLvv70g77+9IO+/vSIpOworICAgICAgICBfdGVzdChmb3JtLCBGb3JtUmVzb3VyY2UuY2xhc3MsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9GT1JNX1VSTEVOQ09ERURfVFlQRSk7CisgICAgfQorCisgICAgQFBhdGgoIi9KU09OT2JqZWN0UmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSlNPTk9iamVjdFJlc291cmNlIGV4dGVuZHMgQ2hhcnNldFJlc291cmNlPEpTT05PYmplY3Q+IHsKKworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpTT05PYmplY3RSZXByZXNlbnRhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBKU09OT2JqZWN0IG9iamVjdCA9IG5ldyBKU09OT2JqZWN0KCk7CisgICAgICAgIG9iamVjdC5wdXQoInVzZXJpZCIsIDEyMzQpCisgICAgICAgICAgICAgICAgLnB1dCgidXNlcm5hbWUiLCBDT05URU5UKQorICAgICAgICAgICAgICAgIC5wdXQoImVtYWlsIiwgImFAYiIpCisgICAgICAgICAgICAgICAgLnB1dCgicGFzc3dvcmQiLCAiKioqKiIpOworCisgICAgICAgIF90ZXN0KG9iamVjdCwgSlNPTk9iamVjdFJlc291cmNlLmNsYXNzLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFKTsKKyAgICB9CisKKyAgICBAUGF0aCgiL0pTT05PQXJyYXlSZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKU09OT0FycmF5UmVzb3VyY2UgZXh0ZW5kcyBDaGFyc2V0UmVzb3VyY2U8SlNPTkFycmF5PiB7CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKU09OQXJyYXlSZXByZXNlbnRhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBKU09OQXJyYXkgYXJyYXkgPSBuZXcgSlNPTkFycmF5KCk7CisgICAgICAgIGFycmF5LnB1dChDT05URU5UKS5wdXQoIlR3byIpLnB1dCgiVGhyZWUiKS5wdXQoMSkucHV0KDIuMCk7CisKKyAgICAgICAgX3Rlc3QoYXJyYXksIEpTT05PQXJyYXlSZXNvdXJjZS5jbGFzcywgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSk7CisgICAgfQorCisgICAgQFBhdGgoIi9KQVhCQmVhblJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpBWEJCZWFuUmVzb3VyY2UgZXh0ZW5kcyBDaGFyc2V0UmVzb3VyY2U8SmF4YkJlYW4+IHsKKworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpBWEJCZWFuWE1MUmVwcmVzZW50YXRpb24oKSB7CisgICAgICAgIF90ZXN0KG5ldyBKYXhiQmVhbihDT05URU5UKSwgSkFYQkJlYW5SZXNvdXJjZS5jbGFzcywgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTF9UWVBFKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCQmVhbkpTT05SZXByZXNlbnRhdGlvbigpIHsKKyAgICAgICAgX3Rlc3QobmV3IEpheGJCZWFuKENPTlRFTlQpLCBKQVhCQmVhblJlc291cmNlLmNsYXNzLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFKTsKKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15SmF4YkNvbnRleHRSZXNvbHZlciBpbXBsZW1lbnRzIENvbnRleHRSZXNvbHZlcjxKQVhCQ29udGV4dD4geworCisgICAgICAgIEpBWEJDb250ZXh0IGNvbnRleHQ7CisKKyAgICAgICAgcHVibGljIE15SmF4YkNvbnRleHRSZXNvbHZlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgY29udGV4dCA9IG5ldyBKZXR0aXNvbkpheGJDb250ZXh0KEpheGJCZWFuLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBKQVhCQ29udGV4dCBnZXRDb250ZXh0KENsYXNzPD8+IG9iamVjdFR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAob2JqZWN0VHlwZSA9PSBKYXhiQmVhbi5jbGFzcykgPyBjb250ZXh0IDogbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpBWEJCZWFuSlNPTlJlcHJlc2VudGF0aW9uV2l0aENvbnRleHRSZXNvbHZlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBKYXhiQmVhbiBpbiA9IG5ldyBKYXhiQmVhbihDT05URU5UKTsKKyAgICAgICAgV2ViVGFyZ2V0IHQgPSB0YXJnZXQoIi9KQVhCQmVhblJlc291cmNlIik7CisgICAgICAgIGZvciAoU3RyaW5nIGNoYXJzZXQgOiBDSEFSU0VUUykgeworICAgICAgICAgICAgUmVzcG9uc2UgcmliID0gdC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KGluLCAiYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PSIgKyBjaGFyc2V0KSk7CisgICAgICAgICAgICBieXRlW10gaW5CeXRlcyA9IGdldFJlcXVlc3RFbnRpdHkoKTsKKyAgICAgICAgICAgIGJ5dGVbXSBvdXRCeXRlcyA9IGdldEVudGl0eUFzQnl0ZUFycmF5KHJpYik7CisgICAgICAgICAgICBfdmVyaWZ5KGluQnl0ZXMsIG91dEJ5dGVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvUmVhZGVyUmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVhZGVyUmVzb3VyY2UgZXh0ZW5kcyBDaGFyc2V0UmVzb3VyY2U8UmVhZGVyPiB7CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkZXJSZXByZXNlbnRhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBXZWJUYXJnZXQgdCA9IHRhcmdldCgiL1JlYWRlclJlc291cmNlIik7CisgICAgICAgIGZvciAoU3RyaW5nIGNoYXJzZXQgOiBDSEFSU0VUUykgeworICAgICAgICAgICAgUmVzcG9uc2UgcmliID0gdC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG5ldyBTdHJpbmdSZWFkZXIoQ09OVEVOVCksICJ0ZXh0L3BsYWluO2NoYXJzZXQ9IiArIGNoYXJzZXQpKTsKKyAgICAgICAgICAgIGJ5dGVbXSBpbkJ5dGVzID0gZ2V0UmVxdWVzdEVudGl0eSgpOworICAgICAgICAgICAgYnl0ZVtdIG91dEJ5dGVzID0gZ2V0RW50aXR5QXNCeXRlQXJyYXkocmliKTsKKyAgICAgICAgICAgIF92ZXJpZnkoaW5CeXRlcywgb3V0Qnl0ZXMpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxUPiB2b2lkIF90ZXN0KFQgaW4sIENsYXNzIHJlc291cmNlKSB7CisgICAgICAgIF90ZXN0KGluLCByZXNvdXJjZSwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxUPiB2b2lkIF90ZXN0KFQgaW4sIENsYXNzIHJlc291cmNlLCBNZWRpYVR5cGUgbSkgeworICAgICAgICBXZWJUYXJnZXQgdCA9IHRhcmdldChyZXNvdXJjZS5nZXRTaW1wbGVOYW1lKCkpOworICAgICAgICBmb3IgKFN0cmluZyBjaGFyc2V0IDogQ0hBUlNFVFMpIHsKKyAgICAgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gcCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgICAgIHAucHV0KCJjaGFyc2V0IiwgY2hhcnNldCk7CisgICAgICAgICAgICBNZWRpYVR5cGUgX20gPSBuZXcgTWVkaWFUeXBlKG0uZ2V0VHlwZSgpLCBtLmdldFN1YnR5cGUoKSwgcCk7CisgICAgICAgICAgICBSZXNwb25zZSByaWIgPSB0LnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoaW4sIF9tKSk7CisgICAgICAgICAgICBieXRlW10gaW5CeXRlcyA9IGdldFJlcXVlc3RFbnRpdHkoKTsKKyAgICAgICAgICAgIGJ5dGVbXSBvdXRCeXRlcyA9IGdldEVudGl0eUFzQnl0ZUFycmF5KHJpYik7CisgICAgICAgICAgICBfdmVyaWZ5KGluQnl0ZXMsIG91dEJ5dGVzKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0NvbnRleHRSZXNvbHZlck1lZGlhVHlwZVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0NvbnRleHRSZXNvbHZlck1lZGlhVHlwZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTI1MGUzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvQ29udGV4dFJlc29sdmVyTWVkaWFUeXBlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LkNvbnRleHRSZXNvbHZlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyczsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5leHBlcmltZW50YWwucnVubmVycy5FbmNsb3NlZDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitAUnVuV2l0aChFbmNsb3NlZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBDb250ZXh0UmVzb2x2ZXJNZWRpYVR5cGVUZXN0IHsKKworICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgQFByb3ZpZGVyCisgICAgQElnbm9yZSgiVGhpcyBjbGFzcyBpcyBub3QgYSB0ZXN0IGNsYXNzICYgbXVzdCBiZSBpZ25vcmVkIGJ5IHRoZSBFbmNsb3NlZCB0ZXN0IHJ1bm5lci4iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGV4dFBsYWluQ29udGV4dFJlc29sdmVyIGltcGxlbWVudHMgQ29udGV4dFJlc29sdmVyPFN0cmluZz4geworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dChDbGFzczw/PiBvYmplY3RUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gInRleHQvcGxhaW4iOworICAgICAgICB9CisgICAgfQorCisgICAgQFByb2R1Y2VzKCJ0ZXh0LyoiKQorICAgIEBQcm92aWRlcgorICAgIEBJZ25vcmUoIlRoaXMgY2xhc3MgaXMgbm90IGEgdGVzdCBjbGFzcyAmIG11c3QgYmUgaWdub3JlZCBieSB0aGUgRW5jbG9zZWQgdGVzdCBydW5uZXIuIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRleHRDb250ZXh0UmVzb2x2ZXIgaW1wbGVtZW50cyBDb250ZXh0UmVzb2x2ZXI8U3RyaW5nPiB7CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb250ZXh0KENsYXNzPD8+IG9iamVjdFR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAidGV4dC8qIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm9kdWNlcygiKi8qIikKKyAgICBAUHJvdmlkZXIKKyAgICBASWdub3JlKCJUaGlzIGNsYXNzIGlzIG5vdCBhIHRlc3QgY2xhc3MgJiBtdXN0IGJlIGlnbm9yZWQgYnkgdGhlIEVuY2xvc2VkIHRlc3QgcnVubmVyLiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBXaWxkY2FyZENvbnRleHRSZXNvbHZlciBpbXBsZW1lbnRzIENvbnRleHRSZXNvbHZlcjxTdHJpbmc+IHsKKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRleHQoQ2xhc3M8Pz4gb2JqZWN0VHlwZSkgeworICAgICAgICAgICAgcmV0dXJuICIqLyoiOworICAgICAgICB9CisgICAgfQorCisgICAgQFByb2R1Y2VzKHsidGV4dC9wbGFpbiIsICJ0ZXh0L2h0bWwifSkKKyAgICBAUHJvdmlkZXIKKyAgICBASWdub3JlKCJUaGlzIGNsYXNzIGlzIG5vdCBhIHRlc3QgY2xhc3MgJiBtdXN0IGJlIGlnbm9yZWQgYnkgdGhlIEVuY2xvc2VkIHRlc3QgcnVubmVyLiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXh0UGxhaW5IdG1sQ29udGV4dFJlc29sdmVyIGltcGxlbWVudHMgQ29udGV4dFJlc29sdmVyPFN0cmluZz4geworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dChDbGFzczw/PiBvYmplY3RUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gInRleHQvcGxhaW4vaHRtbCI7CisgICAgICAgIH0KKworICAgIH0KKworICAgIEBQcm9kdWNlcygidGV4dC9odG1sIikKKyAgICBAUHJvdmlkZXIKKyAgICBASWdub3JlKCJUaGlzIGNsYXNzIGlzIG5vdCBhIHRlc3QgY2xhc3MgJiBtdXN0IGJlIGlnbm9yZWQgYnkgdGhlIEVuY2xvc2VkIHRlc3QgcnVubmVyLiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXh0SHRtbENvbnRleHRSZXNvbHZlciBpbXBsZW1lbnRzIENvbnRleHRSZXNvbHZlcjxTdHJpbmc+IHsKKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRleHQoQ2xhc3M8Pz4gb2JqZWN0VHlwZSkgeworICAgICAgICAgICAgcmV0dXJuICJ0ZXh0L2h0bWwiOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgQElnbm9yZSgiVGhpcyBjbGFzcyBpcyBub3QgYSB0ZXN0IGNsYXNzICYgbXVzdCBiZSBpZ25vcmVkIGJ5IHRoZSBFbmNsb3NlZCB0ZXN0IHJ1bm5lci4iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29udGV4dFJlc291cmNlIHsKKworICAgICAgICBAQ29udGV4dAorICAgICAgICBQcm92aWRlcnMgcDsKKworICAgICAgICBAQ29udGV4dAorICAgICAgICBDb250ZXh0UmVzb2x2ZXI8U3RyaW5nPiBjcjsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJ7aWQ6IC4rfSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KEBQYXRoUGFyYW0oImlkIikgTWVkaWFUeXBlIG0pIHsKKyAgICAgICAgICAgIENvbnRleHRSZXNvbHZlcjxTdHJpbmc+IGNyID0gcC5nZXRDb250ZXh0UmVzb2x2ZXIoU3RyaW5nLmNsYXNzLCBtKTsKKworICAgICAgICAgICAgLy8gVmVyaWZ5IGNhY2hlIGlzIHdvcmtpbmcKKyAgICAgICAgICAgIENvbnRleHRSZXNvbHZlcjxTdHJpbmc+IGNhY2hlZENyID0gcC5nZXRDb250ZXh0UmVzb2x2ZXIoU3RyaW5nLmNsYXNzLCBtKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhjciwgY2FjaGVkQ3IpOworCisgICAgICAgICAgICBpZiAoY3IgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiAiTlVMTCI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBjci5nZXRDb250ZXh0KG51bGwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQcm9kdWNlVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhDb250ZXh0UmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgIFRleHRQbGFpbkNvbnRleHRSZXNvbHZlci5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgVGV4dENvbnRleHRSZXNvbHZlci5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgV2lsZGNhcmRDb250ZXh0UmVzb2x2ZXIuY2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdFByb2R1Y2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygidGV4dC9wbGFpbiIsIHRhcmdldC5wYXRoKCJ0ZXh0L3BsYWluIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygidGV4dC8qIiwgdGFyZ2V0LnBhdGgoInRleHQvKiIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIiovKiIsIHRhcmdldC5wYXRoKCIqLyoiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQvKiIsIHRhcmdldC5wYXRoKCJ0ZXh0L2h0bWwiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIiovKiIsIHRhcmdldC5wYXRoKCJhcHBsaWNhdGlvbi94bWwiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIqLyoiLCB0YXJnZXQucGF0aCgiYXBwbGljYXRpb24vKiIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFByb2R1Y2VzVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhDb250ZXh0UmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgIFRleHRQbGFpbkh0bWxDb250ZXh0UmVzb2x2ZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgIFRleHRDb250ZXh0UmVzb2x2ZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgIFdpbGRjYXJkQ29udGV4dFJlc29sdmVyLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9kdWNlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygidGV4dC9wbGFpbi9odG1sIiwgdGFyZ2V0LnBhdGgoInRleHQvcGxhaW4iKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0L3BsYWluL2h0bWwiLCB0YXJnZXQucGF0aCgidGV4dC9odG1sIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygidGV4dC8qIiwgdGFyZ2V0LnBhdGgoInRleHQvKiIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIiovKiIsIHRhcmdldC5wYXRoKCIqLyoiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQvKiIsIHRhcmdldC5wYXRoKCJ0ZXh0L2NzdiIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiKi8qIiwgdGFyZ2V0LnBhdGgoImFwcGxpY2F0aW9uL3htbCIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIiovKiIsIHRhcmdldC5wYXRoKCJhcHBsaWNhdGlvbi8qIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHJvZHVjZXNTZXBhcmF0ZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoQ29udGV4dFJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICBUZXh0UGxhaW5Db250ZXh0UmVzb2x2ZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgIFRleHRIdG1sQ29udGV4dFJlc29sdmVyLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICBUZXh0Q29udGV4dFJlc29sdmVyLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICBXaWxkY2FyZENvbnRleHRSZXNvbHZlci5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvZHVjZXNTZXBhcmF0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygidGV4dC9wbGFpbiIsIHRhcmdldC5wYXRoKCJ0ZXh0L3BsYWluIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygidGV4dC9odG1sIiwgdGFyZ2V0LnBhdGgoInRleHQvaHRtbCIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQvKiIsIHRhcmdldC5wYXRoKCJ0ZXh0LyoiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIqLyoiLCB0YXJnZXQucGF0aCgiKi8qIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0LyoiLCB0YXJnZXQucGF0aCgidGV4dC9jc3YiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIiovKiIsIHRhcmdldC5wYXRoKCJhcHBsaWNhdGlvbi94bWwiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIqLyoiLCB0YXJnZXQucGF0aCgiYXBwbGljYXRpb24vKiIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFByb2R1Y2VzWFhYVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhDb250ZXh0UmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgIFRleHRQbGFpbkNvbnRleHRSZXNvbHZlci5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgVGV4dEh0bWxDb250ZXh0UmVzb2x2ZXIuY2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdFByb2R1Y2VzWFhYKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0L3BsYWluIiwgdGFyZ2V0LnBhdGgoInRleHQvcGxhaW4iKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0L2h0bWwiLCB0YXJnZXQucGF0aCgidGV4dC9odG1sIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiTlVMTCIsIHRhcmdldC5wYXRoKCJ0ZXh0LyoiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJOVUxMIiwgdGFyZ2V0LnBhdGgoIiovKiIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiTlVMTCIsIHRhcmdldC5wYXRoKCJ0ZXh0L2NzdiIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiTlVMTCIsIHRhcmdldC5wYXRoKCJhcHBsaWNhdGlvbi94bWwiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJOVUxMIiwgdGFyZ2V0LnBhdGgoImFwcGxpY2F0aW9uLyoiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvRW1wdHlFbnRpdHlUZXN0LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9FbXB0eUVudGl0eVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjI0ZTQzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvRW1wdHlFbnRpdHlUZXN0LmphdmEKQEAgLTAsMCArMSwzNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuUmVzcG9uc2VQcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY1R5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTm9Db250ZW50RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5SZWFkZXJXcml0ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRTYW1lOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiBKRVJTRVktMTU0MC4KKyAqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgRW1wdHlFbnRpdHlUZXN0IGV4dGVuZHMgQWJzdHJhY3RUeXBlVGVzdGVyIHsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdEVtdHB5QmVhbiB7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHZhbHVlOworCisgICAgICAgIHB1YmxpYyBUZXN0RW10cHlCZWFuKFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdEVtcHR5QmVhblByb3ZpZGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlSZWFkZXI8VGVzdEVtdHB5QmVhbj4sIE1lc3NhZ2VCb2R5V3JpdGVyPFRlc3RFbXRweUJlYW4+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBUZXN0RW10cHlCZWFuLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFRlc3RFbXRweUJlYW4gcmVhZEZyb20oQ2xhc3M8VGVzdEVtdHB5QmVhbj4gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSA9IFJlYWRlcldyaXRlci5yZWFkRnJvbUFzU3RyaW5nKGVudGl0eVN0cmVhbSwgbWVkaWFUeXBlKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVGVzdEVtdHB5QmVhbih2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gVGVzdEVtdHB5QmVhbi5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldFNpemUoVGVzdEVtdHB5QmVhbiB0ZXN0RW10cHlCZWFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oVGVzdEVtdHB5QmVhbiB0ZXN0RW10cHlCZWFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBSZWFkZXJXcml0ZXIud3JpdGVUb0FzU3RyaW5nKHRlc3RFbXRweUJlYW4uZ2V0VmFsdWUoKSwgZW50aXR5U3RyZWFtLCBtZWRpYVR5cGUpOworICAgICAgICB9CisgICAgfQorCisgICAgQFhtbFJvb3RFbGVtZW50CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0SmF4YkJlYW4geworCisgICAgfQorCisgICAgQFBhdGgoImVtcHR5IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEVtcHR5UmVzb3VyY2UgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJqYXhiZWxlbSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgamF4YmVsZW0oSkFYQkVsZW1lbnQ8U3RyaW5nPiBqYXhiKSB7CisgICAgICAgICAgICByZXR1cm4gIkVSUk9SIjsgLy8gc2hvdWxkbid0IGJlIGNhbGxlZAorICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoImpheGJiZWFuIikKKyAgICAgICAgcHVibGljIFN0cmluZyBqYXhiYmVhbihUZXN0SmF4YkJlYW4gYmVhbikgeworICAgICAgICAgICAgcmV0dXJuICJFUlJPUiI7IC8vIHNob3VsZG4ndCBiZSBjYWxsZWQKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJqYXhibGlzdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgamF4Ymxpc3QoTGlzdDxUZXN0SmF4YkJlYW4+IGJlYW5zKSB7CisgICAgICAgICAgICByZXR1cm4gIkVSUk9SIjsgLy8gc2hvdWxkbid0IGJlIGNhbGxlZAorICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoImJvb2xlYW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGJvb2woQm9vbGVhbiBiKSB7CisgICAgICAgICAgICByZXR1cm4gIkVSUk9SIjsgLy8gc2hvdWxkbid0IGJlIGNhbGxlZAorICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoImNoYXJhY3RlciIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgY2hhcmFjdGVyKENoYXJhY3RlciBjKSB7CisgICAgICAgICAgICByZXR1cm4gIkVSUk9SIjsgLy8gc2hvdWxkbid0IGJlIGNhbGxlZAorICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoImludGVnZXIiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGludGVnZXIoSW50ZWdlciBpKSB7CisgICAgICAgICAgICByZXR1cm4gIkVSUk9SIjsgLy8gc2hvdWxkbid0IGJlIGNhbGxlZAorICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoImVtcHR5YmVhbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZW1wdHlCZWFuKFRlc3RFbXRweUJlYW4gYmVhbikgeworICAgICAgICAgICAgcmV0dXJuIChiZWFuLmdldFZhbHVlKCkuaXNFbXB0eSgpKSA/ICJQQVNTRUQiIDogIkVSUk9SIjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImdldGVtcHR5IikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldEVtcHR5KEBDb250ZXh0IEh0dHBIZWFkZXJzIGhlYWRlcnMpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygpLnR5cGUoaGVhZGVycy5nZXRBY2NlcHRhYmxlTWVkaWFUeXBlcygpLmdldCgwKSkuaGVhZGVyKEh0dHBIZWFkZXJzLkNPTlRFTlRfTEVOR1RILCAwKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIEVtcHR5RW50aXR5VGVzdCgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kRW1wdHlKQVhCRWxlbWVudCgpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiZW1wdHkvamF4YmVsZW0iKTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShudWxsLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNlbmRFbXB0eUpBWEJiZWFuKCkgeworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJlbXB0eS9qYXhiYmVhbiIpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG51bGwsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUxfVFlQRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEVtcHR5SkFYQmxpc3QoKSB7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoImVtcHR5L2pheGJsaXN0Iik7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobnVsbCwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTF9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kRW1wdHlCb29sZWFuKCkgeworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJlbXB0eS9ib29sZWFuIik7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobnVsbCwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VuZEVtcHR5Q2hhcmFjdGVyKCkgeworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJlbXB0eS9jaGFyYWN0ZXIiKTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShudWxsLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kRW1wdHlJbnRlZ2VyKCkgeworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJlbXB0eS9pbnRlZ2VyIik7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobnVsbCwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworCisgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZW5kRW1wdHlCZWFuKCkgeworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJlbXB0eS9lbXB0eWJlYW4iKTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShudWxsLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlBBU1NFRCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVjZWl2ZUVtcHR5SkFYQkVsZW1lbnQoKSB7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoImVtcHR5L2dldGVtcHR5Iik7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoImFwcGxpY2F0aW9uL3htbCIpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc3BvbnNlLnJlYWRFbnRpdHkobmV3IEdlbmVyaWNUeXBlPEpBWEJFbGVtZW50PFN0cmluZz4+KCkgeworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBmYWlsKCJQcm9jZXNzaW5nRXhjZXB0aW9uIGV4cGVjdGVkLiIpOworICAgICAgICB9IGNhdGNoIChQcm9jZXNzaW5nRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBhc3NlcnRTYW1lKE5vQ29udGVudEV4Y2VwdGlvbi5jbGFzcywgZXguZ2V0Q2F1c2UoKS5nZXRDbGFzcygpKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0YXJnZXQucmVxdWVzdCgiYXBwbGljYXRpb24veG1sIikuZ2V0KG5ldyBHZW5lcmljVHlwZTxKQVhCRWxlbWVudDxTdHJpbmc+PigpIHsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgZmFpbCgiUmVzcG9uc2VQcm9jZXNzaW5nRXhjZXB0aW9uIGV4cGVjdGVkLiIpOworICAgICAgICB9IGNhdGNoIChSZXNwb25zZVByb2Nlc3NpbmdFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGFzc2VydFNhbWUoTm9Db250ZW50RXhjZXB0aW9uLmNsYXNzLCBleC5nZXRDYXVzZSgpLmdldENsYXNzKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVjZWl2ZUVtcHR5SkFYQmJlYW4oKSB7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoImVtcHR5L2dldGVtcHR5Iik7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoImFwcGxpY2F0aW9uL3htbCIpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc3BvbnNlLnJlYWRFbnRpdHkoVGVzdEpheGJCZWFuLmNsYXNzKTsKKyAgICAgICAgICAgIGZhaWwoIlByb2Nlc3NpbmdFeGNlcHRpb24gZXhwZWN0ZWQuIik7CisgICAgICAgIH0gY2F0Y2ggKFByb2Nlc3NpbmdFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGFzc2VydFNhbWUoTm9Db250ZW50RXhjZXB0aW9uLmNsYXNzLCBleC5nZXRDYXVzZSgpLmdldENsYXNzKCkpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRhcmdldC5yZXF1ZXN0KCJhcHBsaWNhdGlvbi94bWwiKS5nZXQoVGVzdEpheGJCZWFuLmNsYXNzKTsKKyAgICAgICAgICAgIGZhaWwoIlJlc3BvbnNlUHJvY2Vzc2luZ0V4Y2VwdGlvbiBleHBlY3RlZC4iKTsKKyAgICAgICAgfSBjYXRjaCAoUmVzcG9uc2VQcm9jZXNzaW5nRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBhc3NlcnRTYW1lKE5vQ29udGVudEV4Y2VwdGlvbi5jbGFzcywgZXguZ2V0Q2F1c2UoKS5nZXRDbGFzcygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlY2VpdmVFbXB0eUpBWEJsaXN0KCkgeworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJlbXB0eS9nZXRlbXB0eSIpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCJhcHBsaWNhdGlvbi94bWwiKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXNwb25zZS5yZWFkRW50aXR5KG5ldyBHZW5lcmljVHlwZTxMaXN0PFRlc3RKYXhiQmVhbj4+KCkgeworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBmYWlsKCJQcm9jZXNzaW5nRXhjZXB0aW9uIGV4cGVjdGVkLiIpOworICAgICAgICB9IGNhdGNoIChQcm9jZXNzaW5nRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBhc3NlcnRTYW1lKE5vQ29udGVudEV4Y2VwdGlvbi5jbGFzcywgZXguZ2V0Q2F1c2UoKS5nZXRDbGFzcygpKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICB0YXJnZXQucmVxdWVzdCgiYXBwbGljYXRpb24veG1sIikuZ2V0KG5ldyBHZW5lcmljVHlwZTxMaXN0PFRlc3RKYXhiQmVhbj4+KCkgeworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBmYWlsKCJSZXNwb25zZVByb2Nlc3NpbmdFeGNlcHRpb24gZXhwZWN0ZWQuIik7CisgICAgICAgIH0gY2F0Y2ggKFJlc3BvbnNlUHJvY2Vzc2luZ0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgYXNzZXJ0U2FtZShOb0NvbnRlbnRFeGNlcHRpb24uY2xhc3MsIGV4LmdldENhdXNlKCkuZ2V0Q2xhc3MoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWNlaXZlRW1wdHlCb29sZWFuKCkgeworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJlbXB0eS9nZXRlbXB0eSIpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVzcG9uc2UucmVhZEVudGl0eShCb29sZWFuLmNsYXNzKTsKKyAgICAgICAgICAgIGZhaWwoIlByb2Nlc3NpbmdFeGNlcHRpb24gZXhwZWN0ZWQuIik7CisgICAgICAgIH0gY2F0Y2ggKFByb2Nlc3NpbmdFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGFzc2VydFNhbWUoTm9Db250ZW50RXhjZXB0aW9uLmNsYXNzLCBleC5nZXRDYXVzZSgpLmdldENsYXNzKCkpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRhcmdldC5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikuZ2V0KEJvb2xlYW4uY2xhc3MpOworICAgICAgICAgICAgZmFpbCgiUmVzcG9uc2VQcm9jZXNzaW5nRXhjZXB0aW9uIGV4cGVjdGVkLiIpOworICAgICAgICB9IGNhdGNoIChSZXNwb25zZVByb2Nlc3NpbmdFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGFzc2VydFNhbWUoTm9Db250ZW50RXhjZXB0aW9uLmNsYXNzLCBleC5nZXRDYXVzZSgpLmdldENsYXNzKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVjZWl2ZUVtcHR5Q2hhcmFjdGVyKCkgeworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJlbXB0eS9nZXRlbXB0eSIpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVzcG9uc2UucmVhZEVudGl0eShDaGFyYWN0ZXIuY2xhc3MpOworICAgICAgICAgICAgZmFpbCgiUHJvY2Vzc2luZ0V4Y2VwdGlvbiBleHBlY3RlZC4iKTsKKyAgICAgICAgfSBjYXRjaCAoUHJvY2Vzc2luZ0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgYXNzZXJ0U2FtZShOb0NvbnRlbnRFeGNlcHRpb24uY2xhc3MsIGV4LmdldENhdXNlKCkuZ2V0Q2xhc3MoKSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGFyZ2V0LnJlcXVlc3QoInRleHQvcGxhaW4iKS5nZXQoQ2hhcmFjdGVyLmNsYXNzKTsKKyAgICAgICAgICAgIGZhaWwoIlJlc3BvbnNlUHJvY2Vzc2luZ0V4Y2VwdGlvbiBleHBlY3RlZC4iKTsKKyAgICAgICAgfSBjYXRjaCAoUmVzcG9uc2VQcm9jZXNzaW5nRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBhc3NlcnRTYW1lKE5vQ29udGVudEV4Y2VwdGlvbi5jbGFzcywgZXguZ2V0Q2F1c2UoKS5nZXRDbGFzcygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlY2VpdmVFbXB0eUludGVnZXIoKSB7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoImVtcHR5L2dldGVtcHR5Iik7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoInRleHQvcGxhaW4iKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXNwb25zZS5yZWFkRW50aXR5KEludGVnZXIuY2xhc3MpOworICAgICAgICAgICAgZmFpbCgiUHJvY2Vzc2luZ0V4Y2VwdGlvbiBleHBlY3RlZC4iKTsKKyAgICAgICAgfSBjYXRjaCAoUHJvY2Vzc2luZ0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgYXNzZXJ0U2FtZShOb0NvbnRlbnRFeGNlcHRpb24uY2xhc3MsIGV4LmdldENhdXNlKCkuZ2V0Q2xhc3MoKSk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGFyZ2V0LnJlcXVlc3QoInRleHQvcGxhaW4iKS5nZXQoSW50ZWdlci5jbGFzcyk7CisgICAgICAgICAgICBmYWlsKCJSZXNwb25zZVByb2Nlc3NpbmdFeGNlcHRpb24gZXhwZWN0ZWQuIik7CisgICAgICAgIH0gY2F0Y2ggKFJlc3BvbnNlUHJvY2Vzc2luZ0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgYXNzZXJ0U2FtZShOb0NvbnRlbnRFeGNlcHRpb24uY2xhc3MsIGV4LmdldENhdXNlKCkuZ2V0Q2xhc3MoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWNlaXZlRW1wdHlCZWFuKCkgeworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJlbXB0eS9nZXRlbXB0eSIpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLnJlYWRFbnRpdHkoVGVzdEVtdHB5QmVhbi5jbGFzcykuZ2V0VmFsdWUoKS5pc0VtcHR5KCkpOworICAgICAgICBhc3NlcnRUcnVlKHRhcmdldC5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikuZ2V0KFRlc3RFbXRweUJlYW4uY2xhc3MpLmdldFZhbHVlKCkuaXNFbXB0eSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9FbXB0eVJlcXVlc3RUb0VudGl0eVBhcmFtVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvRW1wdHlSZXF1ZXN0VG9FbnRpdHlQYXJhbVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NjI1OGI2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvRW1wdHlSZXF1ZXN0VG9FbnRpdHlQYXJhbVRlc3QuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHk7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXgud3MucnMuREVMRVRFOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGVzdCBmb3IgSkVSU0VZLTE1NzkuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEVtcHR5UmVxdWVzdFRvRW50aXR5UGFyYW1UZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEVudGl0eVJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFbnRpdHlSZXNvdXJjZSB7CisKKyAgICAgICAgQERFTEVURQorICAgICAgICBwdWJsaWMgdm9pZCBkZWxldGUoTWFwPFN0cmluZywgU3RyaW5nPiBlbnRpdHkpIHsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnROdWxsKGVudGl0eSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eVJlcXVlc3QoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLmRlbGV0ZShSZXNwb25zZS5jbGFzcyk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjA0LCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvRW1wdHlSZXF1ZXN0V2l0aEpheGJUZXN0LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9FbXB0eVJlcXVlc3RXaXRoSmF4YlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2M0ZjBkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvRW1wdHlSZXF1ZXN0V2l0aEpheGJUZXN0LmphdmEKQEAgLTAsMCArMSwyMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Db250ZXh0UmVzb2x2ZXI7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0aXNvbi5KZXR0aXNvbkNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0aXNvbi5KZXR0aXNvbkZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dGlzb24uSmV0dGlzb25KYXhiQ29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQuZXhwZXJpbWVudGFsLnJ1bm5lcnMuRW5jbG9zZWQ7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworQFJ1bldpdGgoRW5jbG9zZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgRW1wdHlSZXF1ZXN0V2l0aEpheGJUZXN0IHsKKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJVbnVzZWRQYXJhbWV0ZXJzIikKKyAgICBAUGF0aCgiLyIpCisgICAgQElnbm9yZSgiVGhpcyBjbGFzcyBpcyBub3QgYSB0ZXN0IGNsYXNzICYgbXVzdCBiZSBpZ25vcmVkIGJ5IHRoZSBFbmNsb3NlZCB0ZXN0IHJ1bm5lci4iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyB2b2lkIGJlYW4oSmF4YkJlYW4gYikgeworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInR5cGUiKQorICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgdm9pZCB0eXBlKEpheGJCZWFuVHlwZSBiKSB7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgibGlzdC1iZWFuIikKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIHZvaWQgbGlzdEJlYW4oTGlzdDxKYXhiQmVhbj4gYikgeworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImxpc3QtdHlwZSIpCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyB2b2lkIGxpc3RUeXBlKExpc3Q8SmF4YkJlYW5UeXBlPiBiKSB7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiYXJyYXktYmVhbiIpCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyB2b2lkIGFycmF5QmVhbihKYXhiQmVhbltdIGIpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJhcnJheS10eXBlIikKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIHZvaWQgYXJyYXlUeXBlKEpheGJCZWFuVHlwZVtdIGIpIHsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFbXB0eVJlcXVlc3RUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzKS5yZWdpc3RlcihuZXcgSmV0dGlzb25GZWF0dXJlKCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgICAgICBjb25maWcucmVnaXN0ZXIoSmV0dGlzb25GZWF0dXJlLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUpzb25SZXF1ZXN0TWFwcGVkKCkgeworICAgICAgICAgICAgX3Rlc3QodGFyZ2V0KCkpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5WG1sUmVxdWVzdCgpIHsKKyAgICAgICAgICAgIFdlYlRhcmdldCByID0gdGFyZ2V0KCk7CisKKyAgICAgICAgICAgIFJlc3BvbnNlIGNyID0gci5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG51bGwsICJhcHBsaWNhdGlvbi94bWwiKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCBjci5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgICAgIGNyID0gci5wYXRoKCJ0eXBlIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShudWxsLCAiYXBwbGljYXRpb24veG1sIikpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMCwgY3IuZ2V0U3RhdHVzKCkpOworCisgICAgICAgICAgICBjciA9IHIucGF0aCgibGlzdC1iZWFuIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShudWxsLCAiYXBwbGljYXRpb24veG1sIikpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMCwgY3IuZ2V0U3RhdHVzKCkpOworCisgICAgICAgICAgICBjciA9IHIucGF0aCgibGlzdC10eXBlIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShudWxsLCAiYXBwbGljYXRpb24veG1sIikpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMCwgY3IuZ2V0U3RhdHVzKCkpOworCisgICAgICAgICAgICBjciA9IHIucGF0aCgiYXJyYXktYmVhbiIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobnVsbCwgImFwcGxpY2F0aW9uL3htbCIpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIGNyLmdldFN0YXR1cygpKTsKKworICAgICAgICAgICAgY3IgPSByLnBhdGgoImFycmF5LXR5cGUiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG51bGwsICJhcHBsaWNhdGlvbi94bWwiKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCBjci5nZXRTdGF0dXMoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBASWdub3JlKCJUaGlzIGNsYXNzIGlzIG5vdCBhIHRlc3QgY2xhc3MgJiBtdXN0IGJlIGlnbm9yZWQgYnkgdGhlIEVuY2xvc2VkIHRlc3QgcnVubmVyLiIpCisgICAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBDUiBpbXBsZW1lbnRzIENvbnRleHRSZXNvbHZlcjxKQVhCQ29udGV4dD4geworCisgICAgICAgIHByaXZhdGUgZmluYWwgSkFYQkNvbnRleHQgY29udGV4dDsKKworICAgICAgICBwcml2YXRlIGZpbmFsIENsYXNzW10gY2xhc3NlcyA9IHtKYXhiQmVhbi5jbGFzcywgSmF4YkJlYW5UeXBlLmNsYXNzfTsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFNldDxDbGFzcz4gdHlwZXMgPSBuZXcgSGFzaFNldDw+KEFycmF5cy5hc0xpc3QoY2xhc3NlcykpOworCisgICAgICAgIHB1YmxpYyBDUigpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29udGV4dCA9IGNvbmZpZ3VyZShjbGFzc2VzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEpBWEJFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgSkFYQkNvbnRleHQgY29uZmlndXJlKENsYXNzW10gY2xhc3NlcykgdGhyb3dzIEpBWEJFeGNlcHRpb247CisKKyAgICAgICAgcHVibGljIEpBWEJDb250ZXh0IGdldENvbnRleHQoQ2xhc3M8Pz4gb2JqZWN0VHlwZSkgeworICAgICAgICAgICAgcmV0dXJuICh0eXBlcy5jb250YWlucyhvYmplY3RUeXBlKSkgPyBjb250ZXh0IDogbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWFwcGVkSmV0dGlzb25DUlRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoTWFwcGVkSmV0dGlzb25DUi5jbGFzcywgUmVzb3VyY2UuY2xhc3MpLnJlZ2lzdGVyKG5ldyBKZXR0aXNvbkZlYXR1cmUoKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgICAgIGNvbmZpZy5yZWdpc3RlcihKZXR0aXNvbkZlYXR1cmUuY2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNYXBwZWRKZXR0aXNvbkNSIGV4dGVuZHMgQ1IgeworCisgICAgICAgICAgICBwcm90ZWN0ZWQgSkFYQkNvbnRleHQgY29uZmlndXJlKENsYXNzW10gY2xhc3NlcykgdGhyb3dzIEpBWEJFeGNlcHRpb24geworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSmV0dGlzb25KYXhiQ29udGV4dChKZXR0aXNvbkNvbmZpZy5tYXBwZWRKZXR0aXNvbigpLmJ1aWxkKCksIGNsYXNzZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdE1hcHBlZEpldHRpc29uQ1IoKSB7CisgICAgICAgICAgICBfdGVzdCh0YXJnZXQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJhZGdlckZpc2hDUlRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoQmFkZ2VyRmlzaENSLmNsYXNzLCBSZXNvdXJjZS5jbGFzcykucmVnaXN0ZXIobmV3IEpldHRpc29uRmVhdHVyZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICAgICAgY29uZmlnLnJlZ2lzdGVyKEpldHRpc29uRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJhZGdlckZpc2hDUiBleHRlbmRzIENSIHsKKworICAgICAgICAgICAgcHJvdGVjdGVkIEpBWEJDb250ZXh0IGNvbmZpZ3VyZShDbGFzc1tdIGNsYXNzZXMpIHRocm93cyBKQVhCRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEpldHRpc29uSmF4YkNvbnRleHQoSmV0dGlzb25Db25maWcuYmFkZ2VyRmlzaCgpLmJ1aWxkKCksIGNsYXNzZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdEJhZGdlckZpc2hDUigpIHsKKyAgICAgICAgICAgIF90ZXN0KHRhcmdldCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBfdGVzdChXZWJUYXJnZXQgdGFyZ2V0KSB7CisgICAgICAgIFJlc3BvbnNlIGNyID0gdGFyZ2V0LnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobnVsbCwgImFwcGxpY2F0aW9uL2pzb24iKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIGNyLmdldFN0YXR1cygpKTsKKworICAgICAgICBjciA9IHRhcmdldC5wYXRoKCJ0eXBlIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShudWxsLCAiYXBwbGljYXRpb24vanNvbiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMCwgY3IuZ2V0U3RhdHVzKCkpOworCisgICAgICAgIGNyID0gdGFyZ2V0LnBhdGgoImxpc3QtYmVhbiIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobnVsbCwgImFwcGxpY2F0aW9uL2pzb24iKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIGNyLmdldFN0YXR1cygpKTsKKworICAgICAgICBjciA9IHRhcmdldC5wYXRoKCJsaXN0LXR5cGUiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG51bGwsICJhcHBsaWNhdGlvbi9qc29uIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCBjci5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgY3IgPSB0YXJnZXQucGF0aCgiYXJyYXktYmVhbiIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobnVsbCwgImFwcGxpY2F0aW9uL2pzb24iKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIGNyLmdldFN0YXR1cygpKTsKKworICAgICAgICBjciA9IHRhcmdldC5wYXRoKCJhcnJheS10eXBlIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShudWxsLCAiYXBwbGljYXRpb24vanNvbiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMCwgY3IuZ2V0U3RhdHVzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0VudGl0eVR5cGVzVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvRW50aXR5VHlwZXNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzllZDhmMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0VudGl0eVR5cGVzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTE2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5OworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uUmVhZGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuUXVldWU7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZvcm07CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY1R5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5TdHJlYW1pbmdPdXRwdXQ7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LkNvbnRleHRSZXNvbHZlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKK2ltcG9ydCBqYXZheC5hY3RpdmF0aW9uLkRhdGFTb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkNvbnRleHQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlNBWFNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5NdWx0aXZhbHVlZFN0cmluZ01hcDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0aXNvbi5KZXR0aXNvbkZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5GaWxlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QudXRpbC5ydW5uZXIuQ29uY3VycmVudFJ1bm5lcjsKKworaW1wb3J0IG9yZy5jb2RlaGF1cy5qZXR0aXNvbi5qc29uLkpTT05BcnJheTsKK2ltcG9ydCBvcmcuY29kZWhhdXMuamV0dGlzb24uanNvbi5KU09OT2JqZWN0OworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitAUnVuV2l0aChDb25jdXJyZW50UnVubmVyLmNsYXNzKQorcHVibGljIGNsYXNzIEVudGl0eVR5cGVzVGVzdCBleHRlbmRzIEFic3RyYWN0VHlwZVRlc3RlciB7CisKKyAgICBAUGF0aCgiSW5wdXRTdHJlYW1SZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbnB1dFN0cmVhbVJlc291cmNlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgSW5wdXRTdHJlYW0gcG9zdChmaW5hbCBJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICBpbnQgcmVhZDsKKyAgICAgICAgICAgIGZpbmFsIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbMjA0OF07CisgICAgICAgICAgICB3aGlsZSAoKHJlYWQgPSBpbi5yZWFkKGRhdGEpKSAhPSAtMSkgeworICAgICAgICAgICAgICAgIG91dC53cml0ZShkYXRhLCAwLCByZWFkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXQudG9CeXRlQXJyYXkoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnB1dFN0cmVhbSgpIHsKKyAgICAgICAgZmluYWwgQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW4gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oIkNPTlRFTlQiLmdldEJ5dGVzKCkpOworICAgICAgICBfdGVzdChpbiwgSW5wdXRTdHJlYW1SZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFBhdGgoIlN0cmluZ1Jlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN0cmluZ1Jlc291cmNlIGV4dGVuZHMgQVJlc291cmNlPFN0cmluZz4geworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmluZygpIHsKKyAgICAgICAgX3Rlc3QoIkNPTlRFTlQiLCBTdHJpbmdSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFBhdGgoIkRhdGFTb3VyY2VSZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEYXRhU291cmNlUmVzb3VyY2UgZXh0ZW5kcyBBUmVzb3VyY2U8RGF0YVNvdXJjZT4geworICAgIH0KKworICAgIEBQYXRoKCJCeXRlQXJyYXlSZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCeXRlQXJyYXlSZXNvdXJjZSBleHRlbmRzIEFSZXNvdXJjZTxieXRlW10+IHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCeXRlQXJyYXlSZXByZXNlbnRhdGlvbigpIHsKKyAgICAgICAgX3Rlc3QoIkNPTlRFTlQiLmdldEJ5dGVzKCksIEJ5dGVBcnJheVJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAUGF0aCgiSmF4YkJlYW5SZXNvdXJjZSIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi94bWwiKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24veG1sIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpheGJCZWFuUmVzb3VyY2UgZXh0ZW5kcyBBUmVzb3VyY2U8SmF4YkJlYW4+IHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKYXhiQmVhblJlcHJlc2VudGF0aW9uKCkgeworICAgICAgICBfdGVzdChuZXcgSmF4YkJlYW4oIkNPTlRFTlQiKSwgSmF4YkJlYW5SZXNvdXJjZS5jbGFzcywgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTF9UWVBFKTsKKyAgICB9CisKKyAgICBAUGF0aCgiSmF4YkJlYW5SZXNvdXJjZU1lZGlhVHlwZSIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mb28reG1sIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL2Zvbyt4bWwiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSmF4YkJlYW5SZXNvdXJjZU1lZGlhVHlwZSBleHRlbmRzIEFSZXNvdXJjZTxKYXhiQmVhbj4geworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpheGJCZWFuUmVwcmVzZW50YXRpb25NZWRpYVR5cGUoKSB7CisgICAgICAgIF90ZXN0KG5ldyBKYXhiQmVhbigiQ09OVEVOVCIpLCBKYXhiQmVhblJlc291cmNlTWVkaWFUeXBlLmNsYXNzLCBNZWRpYVR5cGUudmFsdWVPZigiYXBwbGljYXRpb24vZm9vK3htbCIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKYXhiQmVhblJlcHJlc2VudGF0aW9uRXJyb3IoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoIkpheGJCZWFuUmVzb3VyY2UiKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgeG1sID0gIjxyb290PmZvbzwvcm9vdD4iOworICAgICAgICBmaW5hbCBSZXNwb25zZSBjciA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KHhtbCwgImFwcGxpY2F0aW9uL3htbCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMCwgY3IuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBQYXRoKCJKYXhiQmVhblRleHRSZXNvdXJjZSIpCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3htbCIpCisgICAgQENvbnN1bWVzKCJ0ZXh0L3htbCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKYXhiQmVhblRleHRSZXNvdXJjZSBleHRlbmRzIEFSZXNvdXJjZTxKYXhiQmVhbj4geworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpheGJCZWFuVGV4dFJlcHJlc2VudGF0aW9uKCkgeworICAgICAgICBfdGVzdChuZXcgSmF4YkJlYW4oIkNPTlRFTlQiKSwgSmF4YkJlYW5UZXh0UmVzb3VyY2UuY2xhc3MsIE1lZGlhVHlwZS5URVhUX1hNTF9UWVBFKTsKKyAgICB9CisKKyAgICBAUGF0aCgiSkFYQkVsZW1lbnRCZWFuUmVzb3VyY2UiKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24veG1sIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL3htbCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQVhCRWxlbWVudEJlYW5SZXNvdXJjZSBleHRlbmRzIEFSZXNvdXJjZTxKQVhCRWxlbWVudDxKYXhiQmVhblR5cGU+PiB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQkVsZW1lbnRCZWFuUmVwcmVzZW50YXRpb24oKSB7CisgICAgICAgIF90ZXN0KG5ldyBKYXhiQmVhbigiQ09OVEVOVCIpLCBKQVhCRWxlbWVudEJlYW5SZXNvdXJjZS5jbGFzcywgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTF9UWVBFKTsKKyAgICB9CisKKyAgICBAUGF0aCgiSkFYQkVsZW1lbnRMaXN0UmVzb3VyY2UiKQorICAgIEBQcm9kdWNlcyh7ImFwcGxpY2F0aW9uL3htbCIsICJhcHBsaWNhdGlvbi9qc29uIn0pCisgICAgQENvbnN1bWVzKHsiYXBwbGljYXRpb24veG1sIiwgImFwcGxpY2F0aW9uL2pzb24ifSkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpBWEJFbGVtZW50TGlzdFJlc291cmNlIGV4dGVuZHMgQVJlc291cmNlPExpc3Q8SkFYQkVsZW1lbnQ8U3RyaW5nPj4+IHsKKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8SkFYQkVsZW1lbnQ8U3RyaW5nPj4gZ2V0SkFYQkVsZW1lbnRMaXN0KCkgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChnZXRKQVhCRWxlbWVudEFycmF5KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpBWEJFbGVtZW50TGlzdFhNTFJlcHJlc2VudGF0aW9uKCkgeworICAgICAgICBfdGVzdExpc3RPckFycmF5KHRydWUsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUxfVFlQRSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgX3Rlc3RMaXN0T3JBcnJheShmaW5hbCBib29sZWFuIGlzTGlzdCwgZmluYWwgTWVkaWFUeXBlIG10KSB7CisgICAgICAgIGZpbmFsIE9iamVjdCBpbiA9IGlzTGlzdCA/IGdldEpBWEJFbGVtZW50TGlzdCgpIDogZ2V0SkFYQkVsZW1lbnRBcnJheSgpOworICAgICAgICBmaW5hbCBHZW5lcmljVHlwZSBndCA9IGlzTGlzdCA/IG5ldyBHZW5lcmljVHlwZTxMaXN0PEpBWEJFbGVtZW50PFN0cmluZz4+PigpIHsKKyAgICAgICAgfSA6IG5ldyBHZW5lcmljVHlwZTxKQVhCRWxlbWVudDxTdHJpbmc+W10+KCkgeworICAgICAgICB9OworCisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoaXNMaXN0ID8gIkpBWEJFbGVtZW50TGlzdFJlc291cmNlIiA6ICJKQVhCRWxlbWVudEFycmF5UmVzb3VyY2UiKTsKKyAgICAgICAgZmluYWwgT2JqZWN0IG91dCA9IHRhcmdldC5yZXF1ZXN0KG10KS5wb3N0KEVudGl0eS5lbnRpdHkobmV3IEdlbmVyaWNFbnRpdHkoaW4sIGd0LmdldFR5cGUoKSksIG10KSwgZ3QpOworCisgICAgICAgIGZpbmFsIExpc3Q8SkFYQkVsZW1lbnQ8U3RyaW5nPj4gaW5MaXN0ID0gaXNMaXN0ID8gKChMaXN0PEpBWEJFbGVtZW50PFN0cmluZz4+KSBpbikgOiBBcnJheXMKKyAgICAgICAgICAgICAgICAuYXNMaXN0KChKQVhCRWxlbWVudDxTdHJpbmc+W10pIGluKTsKKyAgICAgICAgZmluYWwgTGlzdDxKQVhCRWxlbWVudDxTdHJpbmc+PiBvdXRMaXN0ID0gaXNMaXN0ID8gKChMaXN0PEpBWEJFbGVtZW50PFN0cmluZz4+KSBvdXQpIDogQXJyYXlzCisgICAgICAgICAgICAgICAgLmFzTGlzdCgoSkFYQkVsZW1lbnQ8U3RyaW5nPltdKSBvdXQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkxlbmd0aHMgZGlmZmVyIiwgaW5MaXN0LnNpemUoKSwgb3V0TGlzdC5zaXplKCkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluTGlzdC5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJOYW1lcyBvZiBlbGVtZW50cyBhdCBpbmRleCAiICsgaSArICIgZGlmZmVyIiwgaW5MaXN0LmdldChpKS5nZXROYW1lKCksIG91dExpc3QuZ2V0KGkpLmdldE5hbWUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlZhbHVlcyBvZiBlbGVtZW50cyBhdCBpbmRleCAiICsgaSArICIgZGlmZmVyIiwgaW5MaXN0LmdldChpKS5nZXRWYWx1ZSgpLCBvdXRMaXN0LmdldChpKS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpBWEJFbGVtZW50TGlzdEpTT05SZXByZXNlbnRhdGlvbigpIHsKKyAgICAgICAgX3Rlc3RMaXN0T3JBcnJheSh0cnVlLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFKTsKKyAgICB9CisKKyAgICBAUGF0aCgiSkFYQkVsZW1lbnRBcnJheVJlc291cmNlIikKKyAgICBAUHJvZHVjZXMoeyJhcHBsaWNhdGlvbi94bWwiLCAiYXBwbGljYXRpb24vanNvbiJ9KQorICAgIEBDb25zdW1lcyh7ImFwcGxpY2F0aW9uL3htbCIsICJhcHBsaWNhdGlvbi9qc29uIn0pCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQVhCRWxlbWVudEFycmF5UmVzb3VyY2UgZXh0ZW5kcyBBUmVzb3VyY2U8SkFYQkVsZW1lbnQ8U3RyaW5nPltdPiB7CisgICAgfQorCisgICAgcHJpdmF0ZSBKQVhCRWxlbWVudDxTdHJpbmc+W10gZ2V0SkFYQkVsZW1lbnRBcnJheSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudFtdIHsKKyAgICAgICAgICAgICAgICBuZXcgSkFYQkVsZW1lbnQoUU5hbWUudmFsdWVPZigiZWxlbWVudDEiKSwgU3RyaW5nLmNsYXNzLCAiYWhvaiIpLAorICAgICAgICAgICAgICAgIG5ldyBKQVhCRWxlbWVudChRTmFtZS52YWx1ZU9mKCJlbGVtZW50MiIpLCBTdHJpbmcuY2xhc3MsICJuYXpkYXIiKQorICAgICAgICB9OworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpBWEJFbGVtZW50QXJyYXlYTUxSZXByZXNlbnRhdGlvbigpIHsKKyAgICAgICAgX3Rlc3RMaXN0T3JBcnJheShmYWxzZSwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTF9UWVBFKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCRWxlbWVudEFycmF5SlNPTlJlcHJlc2VudGF0aW9uKCkgeworICAgICAgICBfdGVzdExpc3RPckFycmF5KGZhbHNlLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFKTsKKyAgICB9CisKKyAgICBAUGF0aCgiSkFYQkVsZW1lbnRCZWFuUmVzb3VyY2VNZWRpYVR5cGUiKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZm9vK3htbCIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9mb28reG1sIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpBWEJFbGVtZW50QmVhblJlc291cmNlTWVkaWFUeXBlIGV4dGVuZHMgQVJlc291cmNlPEpBWEJFbGVtZW50PEpheGJCZWFuVHlwZT4+IHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCRWxlbWVudEJlYW5SZXByZXNlbnRhdGlvbk1lZGlhVHlwZSgpIHsKKyAgICAgICAgX3Rlc3QobmV3IEpheGJCZWFuKCJDT05URU5UIiksIEpBWEJFbGVtZW50QmVhblJlc291cmNlTWVkaWFUeXBlLmNsYXNzLCBNZWRpYVR5cGUudmFsdWVPZigiYXBwbGljYXRpb24vZm9vK3htbCIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCRWxlbWVudEJlYW5SZXByZXNlbnRhdGlvbkVycm9yKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJKQVhCRWxlbWVudEJlYW5SZXNvdXJjZSIpOworCisgICAgICAgIGZpbmFsIFN0cmluZyB4bWwgPSAiPHJvb3Q+PHZhbHVlPmZvbyI7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIGNyID0gdGFyZ2V0LnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoeG1sLCAiYXBwbGljYXRpb24veG1sIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCBjci5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFBhdGgoIkpBWEJFbGVtZW50QmVhblRleHRSZXNvdXJjZSIpCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3htbCIpCisgICAgQENvbnN1bWVzKCJ0ZXh0L3htbCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQVhCRWxlbWVudEJlYW5UZXh0UmVzb3VyY2UgZXh0ZW5kcyBBUmVzb3VyY2U8SkFYQkVsZW1lbnQ8SmF4YkJlYW5UeXBlPj4geworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpBWEJFbGVtZW50QmVhblRleHRSZXByZXNlbnRhdGlvbigpIHsKKyAgICAgICAgX3Rlc3QobmV3IEpheGJCZWFuKCJDT05URU5UIiksIEpBWEJFbGVtZW50QmVhblRleHRSZXNvdXJjZS5jbGFzcywgTWVkaWFUeXBlLlRFWFRfWE1MX1RZUEUpOworICAgIH0KKworICAgIEBQYXRoKCJKYXhiQmVhblJlc291cmNlQXRvbSIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9hdG9tK3htbCIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9hdG9tK3htbCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKYXhiQmVhblJlc291cmNlQXRvbSBleHRlbmRzIEFSZXNvdXJjZTxKQVhCRWxlbWVudDxKYXhiQmVhbj4+IHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKYXhiQmVhblJlcHJlc2VudGF0aW9uTWVkaWFUeXBlQXRvbSgpIHsKKyAgICAgICAgX3Rlc3QobmV3IEpheGJCZWFuKCJDT05URU5UIiksIEpheGJCZWFuUmVzb3VyY2VBdG9tLmNsYXNzLCBNZWRpYVR5cGUudmFsdWVPZigiYXBwbGljYXRpb24vYXRvbSt4bWwiKSk7CisgICAgfQorCisgICAgQFBhdGgoIkpBWEJUeXBlUmVzb3VyY2UiKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24veG1sIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL3htbCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQVhCVHlwZVJlc291cmNlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgSmF4YkJlYW4gcG9zdChmaW5hbCBKYXhiQmVhblR5cGUgdCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBKYXhiQmVhbih0LnZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiAoKFJlc291cmNlQ29uZmlnKSBzdXBlci5jb25maWd1cmUoKSkucmVnaXN0ZXIobmV3IEpldHRpc29uRmVhdHVyZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoZmluYWwgQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBzdXBlci5jb25maWd1cmVDbGllbnQoY29uZmlnKTsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKG5ldyBKZXR0aXNvbkZlYXR1cmUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQlR5cGVSZXByZXNlbnRhdGlvbigpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiSkFYQlR5cGVSZXNvdXJjZSIpOworICAgICAgICBmaW5hbCBKYXhiQmVhbiBpbiA9IG5ldyBKYXhiQmVhbigiQ09OVEVOVCIpOworICAgICAgICBmaW5hbCBKYXhiQmVhblR5cGUgb3V0ID0gdGFyZ2V0LnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoaW4sICJhcHBsaWNhdGlvbi94bWwiKSwgSmF4YkJlYW5UeXBlLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGluLnZhbHVlLCBvdXQudmFsdWUpOworICAgIH0KKworICAgIEBQYXRoKCJKQVhCVHlwZVJlc291cmNlTWVkaWFUeXBlIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Zvbyt4bWwiKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vZm9vK3htbCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQVhCVHlwZVJlc291cmNlTWVkaWFUeXBlIGV4dGVuZHMgSkFYQlR5cGVSZXNvdXJjZSB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQlR5cGVSZXByZXNlbnRhdGlvbk1lZGlhVHlwZSgpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiSkFYQlR5cGVSZXNvdXJjZU1lZGlhVHlwZSIpOworICAgICAgICBmaW5hbCBKYXhiQmVhbiBpbiA9IG5ldyBKYXhiQmVhbigiQ09OVEVOVCIpOworICAgICAgICBmaW5hbCBKYXhiQmVhblR5cGUgb3V0ID0gdGFyZ2V0LnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoaW4sICJhcHBsaWNhdGlvbi9mb28reG1sIiksIEpheGJCZWFuVHlwZS5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhpbi52YWx1ZSwgb3V0LnZhbHVlKTsKKyAgICB9CisKKyAgICBAUGF0aCgiSkFYQk9iamVjdFJlc291cmNlIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3htbCIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi94bWwiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSkFYQk9iamVjdFJlc291cmNlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgT2JqZWN0IHBvc3QoZmluYWwgT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIHJldHVybiBvOworICAgICAgICB9CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQVhCT2JqZWN0UmVzb2x2ZXIgaW1wbGVtZW50cyBDb250ZXh0UmVzb2x2ZXI8SkFYQkNvbnRleHQ+IHsKKworICAgICAgICBwdWJsaWMgSkFYQkNvbnRleHQgZ2V0Q29udGV4dChmaW5hbCBDbGFzczw/PiBjKSB7CisgICAgICAgICAgICBpZiAoT2JqZWN0LmNsYXNzID09IGMpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gSkFYQkNvbnRleHQubmV3SW5zdGFuY2UoSmF4YkJlYW4uY2xhc3MpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEpBWEJFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpBWEJPYmplY3RSZXByZXNlbnRhdGlvbigpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiSkFYQk9iamVjdFJlc291cmNlIik7CisgICAgICAgIGZpbmFsIE9iamVjdCBpbiA9IG5ldyBKYXhiQmVhbigiQ09OVEVOVCIpOworICAgICAgICBmaW5hbCBKYXhiQmVhbiBvdXQgPSB0YXJnZXQucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShpbiwgImFwcGxpY2F0aW9uL3htbCIpLCBKYXhiQmVhbi5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhpbiwgb3V0KTsKKyAgICB9CisKKyAgICBAUGF0aCgiSkFYQk9iamVjdFJlc291cmNlTWVkaWFUeXBlIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Zvbyt4bWwiKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vZm9vK3htbCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQVhCT2JqZWN0UmVzb3VyY2VNZWRpYVR5cGUgZXh0ZW5kcyBKQVhCT2JqZWN0UmVzb3VyY2UgeworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpBWEJPYmplY3RSZXByZXNlbnRhdGlvbk1lZGlhVHlwZSgpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiSkFYQk9iamVjdFJlc291cmNlTWVkaWFUeXBlIik7CisgICAgICAgIGZpbmFsIE9iamVjdCBpbiA9IG5ldyBKYXhiQmVhbigiQ09OVEVOVCIpOworICAgICAgICBmaW5hbCBKYXhiQmVhbiBvdXQgPSB0YXJnZXQucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShpbiwgImFwcGxpY2F0aW9uL2Zvbyt4bWwiKSwgSmF4YkJlYW4uY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoaW4sIG91dCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQk9iamVjdFJlcHJlc2VudGF0aW9uRXJyb3IoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoIkpBWEJPYmplY3RSZXNvdXJjZSIpOworCisgICAgICAgIGZpbmFsIFN0cmluZyB4bWwgPSAiPHJvb3Q+Zm9vPC9yb290PiI7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIGNyID0gdGFyZ2V0LnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoeG1sLCAiYXBwbGljYXRpb24veG1sIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCBjci5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFBhdGgoIkZpbGVSZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGaWxlUmVzb3VyY2UgZXh0ZW5kcyBBUmVzb3VyY2U8RmlsZT4geworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpbGVSZXByZXNlbnRhdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEZpbGVQcm92aWRlciBmcCA9IG5ldyBGaWxlUHJvdmlkZXIoKTsKKyAgICAgICAgZmluYWwgRmlsZSBpbiA9IGZwLnJlYWRGcm9tKEZpbGUuY2xhc3MsIEZpbGUuY2xhc3MsIG51bGwsIG51bGwsIG51bGwsCisgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKCJDT05URU5UIi5nZXRCeXRlcygpKSk7CisKKyAgICAgICAgX3Rlc3QoaW4sIEZpbGVSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikKKyAgICBAUGF0aCgiRm9ybVJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZvcm1SZXNvdXJjZSBleHRlbmRzIEFSZXNvdXJjZTxGb3JtPiB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9ybVJlcHJlc2VudGF0aW9uKCkgeworICAgICAgICBmaW5hbCBGb3JtIGZwID0gbmV3IEZvcm0oKTsKKyAgICAgICAgZnAucGFyYW0oIkVtYWlsIiwgImpvaG5kb2VAZ21haWwuY29tIik7CisgICAgICAgIGZwLnBhcmFtKCJQYXNzd2QiLCAibm9ydGggMjNBWiIpOworICAgICAgICBmcC5wYXJhbSgic2VydmljZSIsICJjbCIpOworICAgICAgICBmcC5wYXJhbSgic291cmNlIiwgIkd1bHAtQ2FsR3VsLTEuMDUiKTsKKworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJGb3JtUmVzb3VyY2UiKTsKKyAgICAgICAgZmluYWwgRm9ybSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KGZwLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fRk9STV9VUkxFTkNPREVEX1RZUEUpLCBGb3JtLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoZnAuYXNNYXAoKS5zaXplKCksIHJlc3BvbnNlLmFzTWFwKCkuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGVudHJ5IDogZnAuYXNNYXAoKS5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcyA9IHJlc3BvbnNlLmFzTWFwKCkuZ2V0KGVudHJ5LmdldEtleSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhlbnRyeS5nZXRWYWx1ZSgpLnNpemUoKSwgcy5zaXplKCkpOworICAgICAgICAgICAgZm9yIChJdGVyYXRvcjxTdHJpbmc+IGl0MSA9IGVudHJ5LmdldFZhbHVlKCkubGlzdEl0ZXJhdG9yKCksIGl0MiA9IHMubGlzdEl0ZXJhdG9yKCk7IGl0MS5oYXNOZXh0KCk7ICkgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhpdDEubmV4dCgpLCBpdDIubmV4dCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9qc29uIikKKyAgICBAUGF0aCgiSlNPTk9iamVjdFJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpTT05PYmplY3RSZXNvdXJjZSBleHRlbmRzIEFSZXNvdXJjZTxKU09OT2JqZWN0PiB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SlNPTk9iamVjdFJlcHJlc2VudGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEpTT05PYmplY3Qgb2JqZWN0ID0gbmV3IEpTT05PYmplY3QoKTsKKyAgICAgICAgb2JqZWN0LnB1dCgidXNlcmlkIiwgMTIzNCkKKyAgICAgICAgICAgICAgICAucHV0KCJ1c2VybmFtZSIsICIxMjM0IikKKyAgICAgICAgICAgICAgICAucHV0KCJlbWFpbCIsICJhQGIiKQorICAgICAgICAgICAgICAgIC5wdXQoInBhc3N3b3JkIiwgIioqKioiKTsKKworICAgICAgICBfdGVzdChvYmplY3QsIEpTT05PYmplY3RSZXNvdXJjZS5jbGFzcywgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSk7CisgICAgfQorCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi94eHgranNvbiIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi94eHgranNvbiIpCisgICAgQFBhdGgoIkpTT05PYmplY3RSZXNvdXJjZUdlbmVyYWxNZWRpYVR5cGUiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSlNPTk9iamVjdFJlc291cmNlR2VuZXJhbE1lZGlhVHlwZSBleHRlbmRzIEFSZXNvdXJjZTxKU09OT2JqZWN0PiB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SlNPTk9iamVjdFJlcHJlc2VudGF0aW9uR2VuZXJhbE1lZGlhVHlwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEpTT05PYmplY3Qgb2JqZWN0ID0gbmV3IEpTT05PYmplY3QoKTsKKyAgICAgICAgb2JqZWN0LnB1dCgidXNlcmlkIiwgMTIzNCkKKyAgICAgICAgICAgICAgICAucHV0KCJ1c2VybmFtZSIsICIxMjM0IikKKyAgICAgICAgICAgICAgICAucHV0KCJlbWFpbCIsICJhQGIiKQorICAgICAgICAgICAgICAgIC5wdXQoInBhc3N3b3JkIiwgIioqKioiKTsKKworICAgICAgICBfdGVzdChvYmplY3QsIEpTT05PYmplY3RSZXNvdXJjZUdlbmVyYWxNZWRpYVR5cGUuY2xhc3MsIE1lZGlhVHlwZS52YWx1ZU9mKCJhcHBsaWNhdGlvbi94eHgranNvbiIpKTsKKyAgICB9CisKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgQFBhdGgoIkpTT05PQXJyYXlSZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKU09OT0FycmF5UmVzb3VyY2UgZXh0ZW5kcyBBUmVzb3VyY2U8SlNPTkFycmF5PiB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SlNPTkFycmF5UmVwcmVzZW50YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSlNPTkFycmF5IGFycmF5ID0gbmV3IEpTT05BcnJheSgpOworICAgICAgICBhcnJheS5wdXQoIk9uZSIpLnB1dCgiVHdvIikucHV0KCJUaHJlZSIpLnB1dCgxKS5wdXQoMi4wKTsKKworICAgICAgICBfdGVzdChhcnJheSwgSlNPTk9BcnJheVJlc291cmNlLmNsYXNzLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFKTsKKyAgICB9CisKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3h4eCtqc29uIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL3h4eCtqc29uIikKKyAgICBAUGF0aCgiSlNPTk9BcnJheVJlc291cmNlR2VuZXJhbE1lZGlhVHlwZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKU09OT0FycmF5UmVzb3VyY2VHZW5lcmFsTWVkaWFUeXBlIGV4dGVuZHMgQVJlc291cmNlPEpTT05BcnJheT4geworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpTT05BcnJheVJlcHJlc2VudGF0aW9uR2VuZXJhbE1lZGlhVHlwZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBKU09OQXJyYXkgYXJyYXkgPSBuZXcgSlNPTkFycmF5KCk7CisgICAgICAgIGFycmF5LnB1dCgiT25lIikucHV0KCJUd28iKS5wdXQoIlRocmVlIikucHV0KDEpLnB1dCgyLjApOworCisgICAgICAgIF90ZXN0KGFycmF5LCBKU09OT0FycmF5UmVzb3VyY2VHZW5lcmFsTWVkaWFUeXBlLmNsYXNzLCBNZWRpYVR5cGUudmFsdWVPZigiYXBwbGljYXRpb24veHh4K2pzb24iKSk7CisgICAgfQorCisgICAgLy8gICAgQFBhdGgoIkZlZWRSZXNvdXJjZSIpCisgICAgLy8gICAgcHVibGljIHN0YXRpYyBjbGFzcyBGZWVkUmVzb3VyY2UgZXh0ZW5kcyBBUmVzb3VyY2U8RmVlZD4geworICAgIC8vICAgIH0KKyAgICAvLworICAgIC8vICAgIEBUZXN0CisgICAgLy8gICAgcHVibGljIHZvaWQgdGVzdEZlZWRSZXByZXNlbnRhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgIC8vICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKCJmZWVkLnhtbCIpOworICAgIC8vICAgICAgICBBdG9tRmVlZFByb3ZpZGVyIGFmcCA9IG5ldyBBdG9tRmVlZFByb3ZpZGVyKCk7CisgICAgLy8gICAgICAgIEZlZWQgZiA9IGFmcC5yZWFkRnJvbShGZWVkLmNsYXNzLCBGZWVkLmNsYXNzLCBudWxsLCBudWxsLCBudWxsLCBpbik7CisgICAgLy8KKyAgICAvLyAgICAgICAgX3Rlc3QoZiwgRmVlZFJlc291cmNlLmNsYXNzKTsKKyAgICAvLyAgICB9CisgICAgLy8KKyAgICAvLyAgICBAUGF0aCgiRW50cnlSZXNvdXJjZSIpCisgICAgLy8gICAgcHVibGljIHN0YXRpYyBjbGFzcyBFbnRyeVJlc291cmNlIGV4dGVuZHMgQVJlc291cmNlPEVudHJ5PiB7CisgICAgLy8gICAgfQorICAgIC8vCisgICAgLy8gICAgQFRlc3QKKyAgICAvLyAgICBwdWJsaWMgdm9pZCB0ZXN0RW50cnlSZXByZXNlbnRhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgIC8vICAgICAgICBJbnB1dFN0cmVhbSBpbiA9IHRoaXMuZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKCJlbnRyeS54bWwiKTsKKyAgICAvLyAgICAgICAgQXRvbUVudHJ5UHJvdmlkZXIgYWZwID0gbmV3IEF0b21FbnRyeVByb3ZpZGVyKCk7CisgICAgLy8gICAgICAgIEVudHJ5IGUgPSBhZnAucmVhZEZyb20oRW50cnkuY2xhc3MsIEVudHJ5LmNsYXNzLCBudWxsLCBudWxsLCBudWxsLCBpbik7CisgICAgLy8KKyAgICAvLyAgICAgICAgX3Rlc3QoZSwgRW50cnlSZXNvdXJjZS5jbGFzcyk7CisgICAgLy8gICAgfQorCisgICAgQFBhdGgoIlJlYWRlclJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlYWRlclJlc291cmNlIGV4dGVuZHMgQVJlc291cmNlPFJlYWRlcj4geworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRlclJlcHJlc2VudGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KG5ldyBTdHJpbmdSZWFkZXIoIkNPTlRFTlQiKSwgUmVhZGVyUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBYTUxfRE9DVU1FTlQgPSAiPG46eCB4bWxuczpuPVwidXJuOm5cIj48bjplPkNPTlRORVQ8L246ZT48L246eD4iOworCisgICAgQFBhdGgoIlN0cmVhbVNvdXJjZVJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN0cmVhbVNvdXJjZVJlc291cmNlIGV4dGVuZHMgQVJlc291cmNlPFN0cmVhbVNvdXJjZT4geworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0cmVhbVNvdXJjZVJlcHJlc2VudGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmVhbVNvdXJjZSBzcyA9IG5ldyBTdHJlYW1Tb3VyY2UoCisgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKFhNTF9ET0NVTUVOVC5nZXRCeXRlcygpKSk7CisgICAgICAgIF90ZXN0KHNzLCBTdHJlYW1Tb3VyY2VSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFBhdGgoIlNBWFNvdXJjZVJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNBWFNvdXJjZVJlc291cmNlIGV4dGVuZHMgQVJlc291cmNlPFNBWFNvdXJjZT4geworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNBWFNvdXJjZVJlcHJlc2VudGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmVhbVNvdXJjZSBzcyA9IG5ldyBTdHJlYW1Tb3VyY2UoCisgICAgICAgICAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKFhNTF9ET0NVTUVOVC5nZXRCeXRlcygpKSk7CisgICAgICAgIF90ZXN0KHNzLCBTQVhTb3VyY2VSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFBhdGgoIkRPTVNvdXJjZVJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERPTVNvdXJjZVJlc291cmNlIGV4dGVuZHMgQVJlc291cmNlPERPTVNvdXJjZT4geworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERPTVNvdXJjZVJlcHJlc2VudGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZGJmID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICBmaW5hbCBEb2N1bWVudCBkID0gZGJmLm5ld0RvY3VtZW50QnVpbGRlcigpLnBhcnNlKG5ldyBJbnB1dFNvdXJjZShuZXcgU3RyaW5nUmVhZGVyKFhNTF9ET0NVTUVOVCkpKTsKKyAgICAgICAgZmluYWwgRE9NU291cmNlIGRzID0gbmV3IERPTVNvdXJjZShkKTsKKyAgICAgICAgX3Rlc3QoZHMsIERPTVNvdXJjZVJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAUGF0aCgiRG9jdW1lbnRSZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEb2N1bWVudFJlc291cmNlIGV4dGVuZHMgQVJlc291cmNlPERvY3VtZW50PiB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG9jdW1lbnRSZXByZXNlbnRhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGRiZiA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgZmluYWwgRG9jdW1lbnQgZCA9IGRiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKS5wYXJzZShuZXcgSW5wdXRTb3VyY2UobmV3IFN0cmluZ1JlYWRlcihYTUxfRE9DVU1FTlQpKSk7CisgICAgICAgIF90ZXN0KGQsIERvY3VtZW50UmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBQYXRoKCJGb3JtTXVsdGl2YWx1ZWRNYXBSZXNvdXJjZSIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZvcm1NdWx0aXZhbHVlZE1hcFJlc291cmNlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IHBvc3QoZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IHQpIHsKKyAgICAgICAgICAgIHJldHVybiB0OworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9ybU11bHRpdmFsdWVkTWFwUmVwcmVzZW50YXRpb24oKSB7CisgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBmcCA9IG5ldyBNdWx0aXZhbHVlZFN0cmluZ01hcCgpOworICAgICAgICBmcC5hZGQoIkVtYWlsIiwgImpvaG5kb2VAZ21haWwuY29tIik7CisgICAgICAgIGZwLmFkZCgiUGFzc3dkIiwgIm5vcnRoIDIzQVoiKTsKKyAgICAgICAgZnAuYWRkKCJzZXJ2aWNlIiwgImNsIik7CisgICAgICAgIGZwLmFkZCgic291cmNlIiwgIkd1bHAtQ2FsR3VsLTEuMDUiKTsKKyAgICAgICAgZnAuYWRkKCJzb3VyY2UiLCAiZm9vLmphdmEiKTsKKyAgICAgICAgZnAuYWRkKCJzb3VyY2UiLCAiYmFyLmphdmEiKTsKKworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJGb3JtTXVsdGl2YWx1ZWRNYXBSZXNvdXJjZSIpOworICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcCBfZnAgPSB0YXJnZXQucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eShmcCwgImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpLCBNdWx0aXZhbHVlZE1hcC5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhmcCwgX2ZwKTsKKyAgICB9CisKKyAgICBAUGF0aCgiU3RyZWFtaW5nT3V0cHV0UmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3RyZWFtaW5nT3V0cHV0UmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmVhbWluZ091dHB1dCBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmVhbWluZ091dHB1dCgpIHsKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShmaW5hbCBPdXRwdXRTdHJlYW0gZW50aXR5KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICBlbnRpdHkud3JpdGUoIkNPTlRFTlQiLmdldEJ5dGVzKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJlYW1pbmdPdXRwdXRSZXByZXNlbnRhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJTdHJlYW1pbmdPdXRwdXRSZXNvdXJjZSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkNPTlRFTlQiLCB0YXJnZXQucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiSkFYQkVsZW1lbnRCZWFuSlNPTlJlc291cmNlIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQVhCRWxlbWVudEJlYW5KU09OUmVzb3VyY2UgZXh0ZW5kcyBBUmVzb3VyY2U8SkFYQkVsZW1lbnQ8U3RyaW5nPj4geworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpBWEJFbGVtZW50QmVhbkpTT05SZXByZXNlbnRhdGlvbigpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiSkFYQkVsZW1lbnRCZWFuSlNPTlJlc291cmNlIik7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmliID0gdGFyZ2V0LnJlcXVlc3QoKS5wb3N0KAorICAgICAgICAgICAgICAgIEVudGl0eS5lbnRpdHkobmV3IEpBWEJFbGVtZW50PD4obmV3IFFOYW1lKCJ0ZXN0IiksIFN0cmluZy5jbGFzcywgIkNPTlRFTlQiKSwgImFwcGxpY2F0aW9uL2pzb24iKSk7CisKKyAgICAgICAgLy8gVE9ETzogdGhlIGZvbGxvd2luZyB3b3VsZCBub3QgYmUgbmVlZGVkIGlmIGkga25ldyBob3cgdG8gd29ya2Fyb3VuZCBKQVhCRWxlbWVudDxTdHJpbmc+LmNsYXNzIGxpdGVyYWwKKworICAgICAgICBmaW5hbCBieXRlW10gaW5CeXRlcyA9IGdldFJlcXVlc3RFbnRpdHkoKTsKKyAgICAgICAgZmluYWwgYnl0ZVtdIG91dEJ5dGVzID0gZ2V0RW50aXR5QXNCeXRlQXJyYXkocmliKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IFN0cmluZyhvdXRCeXRlcyksIGluQnl0ZXMubGVuZ3RoLCBvdXRCeXRlcy5sZW5ndGgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluQnl0ZXMubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChpbkJ5dGVzW2ldICE9IG91dEJ5dGVzW2ldKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbmRleDogIiArIGksIGluQnl0ZXNbaV0sIG91dEJ5dGVzW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJKYXhiQmVhblJlc291cmNlSlNPTiIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9qc29uIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSmF4YkJlYW5SZXNvdXJjZUpTT04gZXh0ZW5kcyBBUmVzb3VyY2U8SmF4YkJlYW4+IHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKYXhiQmVhblJlcHJlc2VudGF0aW9uSlNPTigpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiSmF4YkJlYW5SZXNvdXJjZUpTT04iKTsKKyAgICAgICAgZmluYWwgSmF4YkJlYW4gaW4gPSBuZXcgSmF4YkJlYW4oIkNPTlRFTlQiKTsKKyAgICAgICAgZmluYWwgSmF4YkJlYW4gb3V0ID0gdGFyZ2V0LnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoaW4sICJhcHBsaWNhdGlvbi9qc29uIiksIEpheGJCZWFuLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGluLnZhbHVlLCBvdXQudmFsdWUpOworICAgIH0KKworICAgIEBQYXRoKCJKYXhiQmVhblJlc291cmNlSlNPTk1lZGlhVHlwZSIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mb28ranNvbiIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9mb28ranNvbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKYXhiQmVhblJlc291cmNlSlNPTk1lZGlhVHlwZSBleHRlbmRzIEFSZXNvdXJjZTxKYXhiQmVhbj4geworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpheGJCZWFuUmVwcmVzZW50YXRpb25KU09OTWVkaWFUeXBlKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJKYXhiQmVhblJlc291cmNlSlNPTk1lZGlhVHlwZSIpOworICAgICAgICBmaW5hbCBKYXhiQmVhbiBpbiA9IG5ldyBKYXhiQmVhbigiQ09OVEVOVCIpOworICAgICAgICBmaW5hbCBKYXhiQmVhbiBvdXQgPSB0YXJnZXQucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShpbiwgImFwcGxpY2F0aW9uL2Zvbytqc29uIiksIEpheGJCZWFuLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGluLnZhbHVlLCBvdXQudmFsdWUpOworICAgIH0KKworICAgIEBQYXRoKCJKQVhCRWxlbWVudEJlYW5SZXNvdXJjZUpTT04iKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9qc29uIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpBWEJFbGVtZW50QmVhblJlc291cmNlSlNPTiBleHRlbmRzIEFSZXNvdXJjZTxKQVhCRWxlbWVudDxKYXhiQmVhblR5cGU+PiB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQkVsZW1lbnRCZWFuUmVwcmVzZW50YXRpb25KU09OKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJKQVhCRWxlbWVudEJlYW5SZXNvdXJjZUpTT04iKTsKKyAgICAgICAgZmluYWwgSmF4YkJlYW4gaW4gPSBuZXcgSmF4YkJlYW4oIkNPTlRFTlQiKTsKKyAgICAgICAgZmluYWwgSmF4YkJlYW4gb3V0ID0gdGFyZ2V0LnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoaW4sICJhcHBsaWNhdGlvbi9qc29uIiksIEpheGJCZWFuLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGluLnZhbHVlLCBvdXQudmFsdWUpOworICAgIH0KKworICAgIEBQYXRoKCJKQVhCRWxlbWVudEJlYW5SZXNvdXJjZUpTT05NZWRpYVR5cGUiKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZm9vK2pzb24iKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vZm9vK2pzb24iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSkFYQkVsZW1lbnRCZWFuUmVzb3VyY2VKU09OTWVkaWFUeXBlIGV4dGVuZHMgQVJlc291cmNlPEpBWEJFbGVtZW50PEpheGJCZWFuVHlwZT4+IHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCRWxlbWVudEJlYW5SZXByZXNlbnRhdGlvbkpTT05NZWRpYVR5cGUoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoIkpBWEJFbGVtZW50QmVhblJlc291cmNlSlNPTk1lZGlhVHlwZSIpOworICAgICAgICBmaW5hbCBKYXhiQmVhbiBpbiA9IG5ldyBKYXhiQmVhbigiQ09OVEVOVCIpOworICAgICAgICBmaW5hbCBKYXhiQmVhbiBvdXQgPSB0YXJnZXQucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShpbiwgImFwcGxpY2F0aW9uL2Zvbytqc29uIiksIEpheGJCZWFuLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGluLnZhbHVlLCBvdXQudmFsdWUpOworICAgIH0KKworICAgIEBQYXRoKCJKQVhCVHlwZVJlc291cmNlSlNPTiIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9qc29uIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSkFYQlR5cGVSZXNvdXJjZUpTT04geworCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBKYXhiQmVhbiBwb3N0KGZpbmFsIEpheGJCZWFuVHlwZSB0KSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEpheGJCZWFuKHQudmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQlR5cGVSZXByZXNlbnRhdGlvbkpTT04oKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoIkpBWEJUeXBlUmVzb3VyY2VKU09OIik7CisgICAgICAgIGZpbmFsIEpheGJCZWFuIGluID0gbmV3IEpheGJCZWFuKCJDT05URU5UIik7CisgICAgICAgIGZpbmFsIEpheGJCZWFuVHlwZSBvdXQgPSB0YXJnZXQucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShpbiwgImFwcGxpY2F0aW9uL2pzb24iKSwgSmF4YkJlYW5UeXBlLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGluLnZhbHVlLCBvdXQudmFsdWUpOworICAgIH0KKworICAgIEBQYXRoKCJKQVhCVHlwZVJlc291cmNlSlNPTk1lZGlhVHlwZSIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mb28ranNvbiIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9mb28ranNvbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQVhCVHlwZVJlc291cmNlSlNPTk1lZGlhVHlwZSB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIEpheGJCZWFuIHBvc3QoZmluYWwgSmF4YkJlYW5UeXBlIHQpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSmF4YkJlYW4odC52YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCVHlwZVJlcHJlc2VudGF0aW9uSlNPTk1lZGlhVHlwZSgpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiSkFYQlR5cGVSZXNvdXJjZUpTT05NZWRpYVR5cGUiKTsKKyAgICAgICAgZmluYWwgSmF4YkJlYW4gaW4gPSBuZXcgSmF4YkJlYW4oIkNPTlRFTlQiKTsKKyAgICAgICAgZmluYWwgSmF4YkJlYW5UeXBlIG91dCA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KGluLCAiYXBwbGljYXRpb24vZm9vK2pzb24iKSwgSmF4YkJlYW5UeXBlLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGluLnZhbHVlLCBvdXQudmFsdWUpOworICAgIH0KKworICAgIEBQYXRoKCJKYXhiQmVhblJlc291cmNlRmFzdEluZm9zZXQiKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZmFzdGluZm9zZXQiKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vZmFzdGluZm9zZXQiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSmF4YkJlYW5SZXNvdXJjZUZhc3RJbmZvc2V0IGV4dGVuZHMgQVJlc291cmNlPEpheGJCZWFuPiB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBASWdub3JlKCJUT0RPOiB1bmlnbm9yZSBvbmNlIGZpIHN1cHBvcnQgaW1wbGVtZW50ZWQgKEpFUlNFWS0xMTkwKSIpCisgICAgLy8gVE9ETzogdW5pZ25vcmUgb25jZSBmaSBzdXBwb3J0IGltcGxlbWVudGVkIChKRVJTRVktMTE5MCkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SmF4YkJlYW5SZXByZXNlbnRhdGlvbkZhc3RJbmZvc2V0KCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJKYXhiQmVhblJlc291cmNlRmFzdEluZm9zZXQiKTsKKyAgICAgICAgZmluYWwgSmF4YkJlYW4gaW4gPSBuZXcgSmF4YkJlYW4oIkNPTlRFTlQiKTsKKyAgICAgICAgZmluYWwgSmF4YkJlYW4gb3V0ID0gdGFyZ2V0LnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoaW4sICJhcHBsaWNhdGlvbi9mYXN0aW5mb3NldCIpLCBKYXhiQmVhbi5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhpbi52YWx1ZSwgb3V0LnZhbHVlKTsKKyAgICB9CisKKyAgICBAUGF0aCgiSkFYQkVsZW1lbnRCZWFuUmVzb3VyY2VGYXN0SW5mb3NldCIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mYXN0aW5mb3NldCIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9mYXN0aW5mb3NldCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQVhCRWxlbWVudEJlYW5SZXNvdXJjZUZhc3RJbmZvc2V0IGV4dGVuZHMgQVJlc291cmNlPEpBWEJFbGVtZW50PEpheGJCZWFuVHlwZT4+IHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBJZ25vcmUoIlRPRE86IHVuaWdub3JlIG9uY2UgZmkgc3VwcG9ydCBpbXBsZW1lbnRlZCAoSkVSU0VZLTExOTApIikKKyAgICAvLyBUT0RPOiB1bmlnbm9yZSBvbmNlIGZpIHN1cHBvcnQgaW1wbGVtZW50ZWQgKEpFUlNFWS0xMTkwKQorICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCRWxlbWVudEJlYW5SZXByZXNlbnRhdGlvbkZhc3RJbmZvc2V0KCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJKQVhCRWxlbWVudEJlYW5SZXNvdXJjZUZhc3RJbmZvc2V0Iik7CisgICAgICAgIGZpbmFsIEpheGJCZWFuIGluID0gbmV3IEpheGJCZWFuKCJDT05URU5UIik7CisgICAgICAgIGZpbmFsIEpheGJCZWFuIG91dCA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KGluLCAiYXBwbGljYXRpb24vZmFzdGluZm9zZXQiKSwgSmF4YkJlYW4uY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoaW4udmFsdWUsIG91dC52YWx1ZSk7CisgICAgfQorCisgICAgQFBhdGgoIkpBWEJUeXBlUmVzb3VyY2VGYXN0SW5mb3NldCIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mYXN0aW5mb3NldCIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9mYXN0aW5mb3NldCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQVhCVHlwZVJlc291cmNlRmFzdEluZm9zZXQgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBKYXhiQmVhbiBwb3N0KGZpbmFsIEpheGJCZWFuVHlwZSB0KSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEpheGJCZWFuKHQudmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBASWdub3JlKCJUT0RPOiB1bmlnbm9yZSBvbmNlIGZpIHN1cHBvcnQgaW1wbGVtZW50ZWQgKEpFUlNFWS0xMTkwKSIpCisgICAgLy8gVE9ETzogdW5pZ25vcmUgb25jZSBmaSBzdXBwb3J0IGltcGxlbWVudGVkIChKRVJTRVktMTE5MCkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQlR5cGVSZXByZXNlbnRhdGlvbkZhc3RJbmZvc2V0KCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJKQVhCVHlwZVJlc291cmNlRmFzdEluZm9zZXQiKTsKKyAgICAgICAgZmluYWwgSmF4YkJlYW4gaW4gPSBuZXcgSmF4YkJlYW4oIkNPTlRFTlQiKTsKKyAgICAgICAgZmluYWwgSmF4YkJlYW5UeXBlIG91dCA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KGluLCAiYXBwbGljYXRpb24vZmFzdGluZm9zZXQiKSwgSmF4YkJlYW5UeXBlLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGluLnZhbHVlLCBvdXQudmFsdWUpOworICAgIH0KKworICAgIEBQYXRoKCJKQVhCTGlzdFJlc291cmNlIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3htbCIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi94bWwiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSkFYQkxpc3RSZXNvdXJjZSB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIExpc3Q8SmF4YkJlYW4+IHBvc3QoZmluYWwgTGlzdDxKYXhiQmVhbj4gbCkgeworICAgICAgICAgICAgcmV0dXJuIGw7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgic2V0IikKKyAgICAgICAgcHVibGljIFNldDxKYXhiQmVhbj4gcG9zdFNldChmaW5hbCBTZXQ8SmF4YkJlYW4+IGwpIHsKKyAgICAgICAgICAgIHJldHVybiBsOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoInF1ZXVlIikKKyAgICAgICAgcHVibGljIFF1ZXVlPEpheGJCZWFuPiBwb3N0UXVldWUoZmluYWwgUXVldWU8SmF4YkJlYW4+IGwpIHsKKyAgICAgICAgICAgIHJldHVybiBsOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoInN0YWNrIikKKyAgICAgICAgcHVibGljIFN0YWNrPEpheGJCZWFuPiBwb3N0U3RhY2soZmluYWwgU3RhY2s8SmF4YkJlYW4+IGwpIHsKKyAgICAgICAgICAgIHJldHVybiBsOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoImN1c3RvbSIpCisgICAgICAgIHB1YmxpYyBNeUFycmF5TGlzdDxKYXhiQmVhbj4gcG9zdEN1c3RvbShmaW5hbCBNeUFycmF5TGlzdDxKYXhiQmVhbj4gbCkgeworICAgICAgICAgICAgcmV0dXJuIGw7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBDb2xsZWN0aW9uPEpheGJCZWFuPiBnZXQoKSB7CisgICAgICAgICAgICBmaW5hbCBBcnJheUxpc3Q8SmF4YkJlYW4+IGwgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgICAgIGwuYWRkKG5ldyBKYXhiQmVhbigib25lIikpOworICAgICAgICAgICAgbC5hZGQobmV3IEpheGJCZWFuKCJ0d28iKSk7CisgICAgICAgICAgICBsLmFkZChuZXcgSmF4YkJlYW4oInRocmVlIikpOworICAgICAgICAgICAgcmV0dXJuIGw7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgidHlwZSIpCisgICAgICAgIHB1YmxpYyBMaXN0PEpheGJCZWFuPiBwb3N0VHlwZShmaW5hbCBDb2xsZWN0aW9uPEpheGJCZWFuVHlwZT4gbCkgeworICAgICAgICAgICAgZmluYWwgTGlzdDxKYXhiQmVhbj4gYmVhbnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgICAgIGZvciAoZmluYWwgSmF4YkJlYW5UeXBlIHQgOiBsKSB7CisgICAgICAgICAgICAgICAgYmVhbnMuYWRkKG5ldyBKYXhiQmVhbih0LnZhbHVlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYmVhbnM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiSkFYQkFycmF5UmVzb3VyY2UiKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24veG1sIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL3htbCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQVhCQXJyYXlSZXNvdXJjZSB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIEpheGJCZWFuW10gcG9zdChmaW5hbCBKYXhiQmVhbltdIGwpIHsKKyAgICAgICAgICAgIHJldHVybiBsOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgSmF4YkJlYW5bXSBnZXQoKSB7CisgICAgICAgICAgICBmaW5hbCBBcnJheUxpc3Q8SmF4YkJlYW4+IGwgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgICAgIGwuYWRkKG5ldyBKYXhiQmVhbigib25lIikpOworICAgICAgICAgICAgbC5hZGQobmV3IEpheGJCZWFuKCJ0d28iKSk7CisgICAgICAgICAgICBsLmFkZChuZXcgSmF4YkJlYW4oInRocmVlIikpOworICAgICAgICAgICAgcmV0dXJuIGwudG9BcnJheShuZXcgSmF4YkJlYW5bbC5zaXplKCldKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJ0eXBlIikKKyAgICAgICAgcHVibGljIEpheGJCZWFuW10gcG9zdFR5cGUoZmluYWwgSmF4YkJlYW5UeXBlW10gbCkgeworICAgICAgICAgICAgZmluYWwgTGlzdDxKYXhiQmVhbj4gYmVhbnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgICAgIGZvciAoZmluYWwgSmF4YkJlYW5UeXBlIHQgOiBsKSB7CisgICAgICAgICAgICAgICAgYmVhbnMuYWRkKG5ldyBKYXhiQmVhbih0LnZhbHVlKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYmVhbnMudG9BcnJheShuZXcgSmF4YkJlYW5bYmVhbnMuc2l6ZSgpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCQXJyYXlSZXByZXNlbnRhdGlvbigpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiSkFYQkFycmF5UmVzb3VyY2UiKTsKKworICAgICAgICBmaW5hbCBKYXhiQmVhbltdIGEgPSB0YXJnZXQucmVxdWVzdCgpLmdldChKYXhiQmVhbltdLmNsYXNzKTsKKyAgICAgICAgSmF4YkJlYW5bXSBiID0gdGFyZ2V0LnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoYSwgImFwcGxpY2F0aW9uL3htbCIpLCBKYXhiQmVhbltdLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGEubGVuZ3RoLCBiLmxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGFbaV0sIGJbaV0pOworICAgICAgICB9CisKKyAgICAgICAgYiA9IHRhcmdldC5wYXRoKCJ0eXBlIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShhLCAiYXBwbGljYXRpb24veG1sIiksIEpheGJCZWFuW10uY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoYS5sZW5ndGgsIGIubGVuZ3RoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoYVtpXSwgYltpXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiSkFYQkxpc3RSZXNvdXJjZU1lZGlhVHlwZSIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mb28reG1sIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL2Zvbyt4bWwiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSkFYQkxpc3RSZXNvdXJjZU1lZGlhVHlwZSBleHRlbmRzIEpBWEJMaXN0UmVzb3VyY2UgeworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpBWEJMaXN0UmVwcmVzZW50YXRpb25NZWRpYVR5cGUoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoIkpBWEJMaXN0UmVzb3VyY2VNZWRpYVR5cGUiKTsKKworICAgICAgICBDb2xsZWN0aW9uPEpheGJCZWFuPiBhID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoCisgICAgICAgICAgICAgICAgbmV3IEdlbmVyaWNUeXBlPENvbGxlY3Rpb248SmF4YkJlYW4+PigpIHsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgQ29sbGVjdGlvbjxKYXhiQmVhbj4gYiA9IHRhcmdldC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KG5ldyBHZW5lcmljRW50aXR5PENvbGxlY3Rpb248SmF4YkJlYW4+PihhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB9LCAiYXBwbGljYXRpb24vZm9vK3htbCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEdlbmVyaWNUeXBlPENvbGxlY3Rpb248SmF4YkJlYW4+PigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgIGFzc2VydEVxdWFscyhhLCBiKTsKKworICAgICAgICBiID0gdGFyZ2V0LnBhdGgoInR5cGUiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG5ldyBHZW5lcmljRW50aXR5PENvbGxlY3Rpb248SmF4YkJlYW4+PihhKSB7CisgICAgICAgIH0sICJhcHBsaWNhdGlvbi9mb28reG1sIiksIG5ldyBHZW5lcmljVHlwZTxDb2xsZWN0aW9uPEpheGJCZWFuPj4oKSB7CisgICAgICAgIH0pOworICAgICAgICBhc3NlcnRFcXVhbHMoYSwgYik7CisKKyAgICAgICAgYSA9IG5ldyBMaW5rZWRMaXN0PD4oYSk7CisgICAgICAgIGIgPSB0YXJnZXQucGF0aCgicXVldWUiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG5ldyBHZW5lcmljRW50aXR5PFF1ZXVlPEpheGJCZWFuPj4oKFF1ZXVlPEpheGJCZWFuPikgYSkgeworICAgICAgICB9LCAiYXBwbGljYXRpb24vZm9vK3htbCIpLCBuZXcgR2VuZXJpY1R5cGU8UXVldWU8SmF4YkJlYW4+PigpIHsKKyAgICAgICAgfSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhLCBiKTsKKworICAgICAgICBhID0gbmV3IEhhc2hTZXQ8PihhKTsKKyAgICAgICAgYiA9IHRhcmdldC5wYXRoKCJzZXQiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG5ldyBHZW5lcmljRW50aXR5PFNldDxKYXhiQmVhbj4+KChTZXQ8SmF4YkJlYW4+KSBhKSB7CisgICAgICAgIH0sICJhcHBsaWNhdGlvbi9mb28reG1sIiksIG5ldyBHZW5lcmljVHlwZTxTZXQ8SmF4YkJlYW4+PigpIHsKKyAgICAgICAgfSk7CisgICAgICAgIGZpbmFsIENvbXBhcmF0b3I8SmF4YkJlYW4+IGMgPSBuZXcgQ29tcGFyYXRvcjxKYXhiQmVhbj4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShmaW5hbCBKYXhiQmVhbiB0LCBmaW5hbCBKYXhiQmVhbiB0MSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0LnZhbHVlLmNvbXBhcmVUbyh0MS52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGZpbmFsIFRyZWVTZXQ8SmF4YkJlYW4+IHQxID0gbmV3IFRyZWVTZXQ8PihjKTsKKyAgICAgICAgZmluYWwgVHJlZVNldDxKYXhiQmVhbj4gdDIgPSBuZXcgVHJlZVNldDw+KGMpOworICAgICAgICB0MS5hZGRBbGwoYSk7CisgICAgICAgIHQyLmFkZEFsbChiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHQxLCB0Mik7CisKKyAgICAgICAgZmluYWwgU3RhY2s8SmF4YkJlYW4+IHMgPSBuZXcgU3RhY2s8PigpOworICAgICAgICBzLmFkZEFsbChhKTsKKyAgICAgICAgYiA9IHRhcmdldC5wYXRoKCJzdGFjayIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobmV3IEdlbmVyaWNFbnRpdHk8U3RhY2s8SmF4YkJlYW4+PihzKSB7CisgICAgICAgIH0sICJhcHBsaWNhdGlvbi9mb28reG1sIiksIG5ldyBHZW5lcmljVHlwZTxTdGFjazxKYXhiQmVhbj4+KCkgeworICAgICAgICB9KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHMsIGIpOworCisgICAgICAgIGEgPSBuZXcgTXlBcnJheUxpc3Q8PihhKTsKKyAgICAgICAgYiA9IHRhcmdldC5wYXRoKCJjdXN0b20iKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KG5ldyBHZW5lcmljRW50aXR5PE15QXJyYXlMaXN0PEpheGJCZWFuPj4oKE15QXJyYXlMaXN0PEpheGJCZWFuPikgYSkgeworICAgICAgICAgICAgICAgIH0sICJhcHBsaWNhdGlvbi9mb28reG1sIiksIG5ldyBHZW5lcmljVHlwZTxNeUFycmF5TGlzdDxKYXhiQmVhbj4+KCkgeworICAgICAgICAgICAgICAgIH0pOworICAgICAgICBhc3NlcnRFcXVhbHMoYSwgYik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQkxpc3RSZXByZXNlbnRhdGlvbkVycm9yKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJKQVhCTGlzdFJlc291cmNlIik7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHhtbCA9ICI8cm9vdD48dmFsdWU+Zm9vIjsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgY3IgPSB0YXJnZXQucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eSh4bWwsICJhcHBsaWNhdGlvbi94bWwiKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIGNyLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiSkFYQkxpc3RSZXNvdXJjZUZhc3RJbmZvc2V0IikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Zhc3RpbmZvc2V0IikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL2Zhc3RpbmZvc2V0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpBWEJMaXN0UmVzb3VyY2VGYXN0SW5mb3NldCBleHRlbmRzIEpBWEJMaXN0UmVzb3VyY2UgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFRPRE8sIHRoZSB1bm1hcnNoYWxsaW5nIGZhaWxzLgorICAgICAqLworICAgIEBUZXN0CisgICAgQElnbm9yZSgiVE9ETzogdW5pZ25vcmUgb25jZSBmaSBzdXBwb3J0IGltcGxlbWVudGVkIChKRVJTRVktMTE5MCkiKQorICAgIC8vIFRPRE86IHVuaWdub3JlIG9uY2UgZmkgc3VwcG9ydCBpbXBsZW1lbnRlZCAoSkVSU0VZLTExOTApCisgICAgcHVibGljIHZvaWQgdGVzdEpBWEJMaXN0UmVwcmVzZW50YXRpb25GYXN0SW5mb3NldCgpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiSkFYQkxpc3RSZXNvdXJjZUZhc3RJbmZvc2V0Iik7CisKKyAgICAgICAgQ29sbGVjdGlvbjxKYXhiQmVhbj4gYSA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KG5ldyBHZW5lcmljVHlwZTxDb2xsZWN0aW9uPEpheGJCZWFuPj4oKSB7CisgICAgICAgIH0pOworCisgICAgICAgIENvbGxlY3Rpb248SmF4YkJlYW4+IGIgPSB0YXJnZXQucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShuZXcgR2VuZXJpY0VudGl0eTxDb2xsZWN0aW9uPEpheGJCZWFuPj4oYSkgeworICAgICAgICAgICAgICAgIH0sICJhcHBsaWNhdGlvbi9mYXN0aW5mb3NldCIpLCBuZXcgR2VuZXJpY1R5cGU8Q29sbGVjdGlvbjxKYXhiQmVhbj4+KCkgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoYSwgYik7CisKKyAgICAgICAgYiA9IHRhcmdldC5wYXRoKCJ0eXBlIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShuZXcgR2VuZXJpY0VudGl0eTxDb2xsZWN0aW9uPEpheGJCZWFuPj4oYSkgeworICAgICAgICB9LCAiYXBwbGljYXRpb24vZmFzdGluZm9zZXQiKSwgbmV3IEdlbmVyaWNUeXBlPENvbGxlY3Rpb248SmF4YkJlYW4+PigpIHsKKyAgICAgICAgfSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhLCBiKTsKKworICAgICAgICBhID0gbmV3IExpbmtlZExpc3Q8PihhKTsKKyAgICAgICAgYiA9IHRhcmdldC5wYXRoKCJxdWV1ZSIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobmV3IEdlbmVyaWNFbnRpdHk8UXVldWU8SmF4YkJlYW4+PigoUXVldWU8SmF4YkJlYW4+KSBhKSB7CisgICAgICAgIH0sICJhcHBsaWNhdGlvbi9mYXN0aW5mb3NldCIpLCBuZXcgR2VuZXJpY1R5cGU8UXVldWU8SmF4YkJlYW4+PigpIHsKKyAgICAgICAgfSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhLCBiKTsKKworICAgICAgICBhID0gbmV3IEhhc2hTZXQ8PihhKTsKKyAgICAgICAgYiA9IHRhcmdldC5wYXRoKCJzZXQiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG5ldyBHZW5lcmljRW50aXR5PFNldDxKYXhiQmVhbj4+KChTZXQ8SmF4YkJlYW4+KSBhKSB7CisgICAgICAgIH0sICJhcHBsaWNhdGlvbi9mYXN0aW5mb3NldCIpLCBuZXcgR2VuZXJpY1R5cGU8U2V0PEpheGJCZWFuPj4oKSB7CisgICAgICAgIH0pOworICAgICAgICBmaW5hbCBDb21wYXJhdG9yPEpheGJCZWFuPiBjID0gbmV3IENvbXBhcmF0b3I8SmF4YkJlYW4+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoZmluYWwgSmF4YkJlYW4gdCwgZmluYWwgSmF4YkJlYW4gdDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdC52YWx1ZS5jb21wYXJlVG8odDEudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBmaW5hbCBUcmVlU2V0PEpheGJCZWFuPiB0MSA9IG5ldyBUcmVlU2V0PD4oYyk7CisgICAgICAgIGZpbmFsIFRyZWVTZXQ8SmF4YkJlYW4+IHQyID0gbmV3IFRyZWVTZXQ8PihjKTsKKyAgICAgICAgdDEuYWRkQWxsKGEpOworICAgICAgICB0Mi5hZGRBbGwoYik7CisgICAgICAgIGFzc2VydEVxdWFscyh0MSwgdDIpOworCisgICAgICAgIGZpbmFsIFN0YWNrPEpheGJCZWFuPiBzID0gbmV3IFN0YWNrPD4oKTsKKyAgICAgICAgcy5hZGRBbGwoYSk7CisgICAgICAgIGIgPSB0YXJnZXQucGF0aCgic3RhY2siKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG5ldyBHZW5lcmljRW50aXR5PFN0YWNrPEpheGJCZWFuPj4ocykgeworICAgICAgICB9LCAiYXBwbGljYXRpb24vZmFzdGluZm9zZXQiKSwgbmV3IEdlbmVyaWNUeXBlPFN0YWNrPEpheGJCZWFuPj4oKSB7CisgICAgICAgIH0pOworICAgICAgICBhc3NlcnRFcXVhbHMocywgYik7CisKKyAgICAgICAgYSA9IG5ldyBNeUFycmF5TGlzdDw+KGEpOworICAgICAgICBiID0gdGFyZ2V0LnBhdGgoImN1c3RvbSIpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkobmV3IEdlbmVyaWNFbnRpdHk8TXlBcnJheUxpc3Q8SmF4YkJlYW4+PigoTXlBcnJheUxpc3Q8SmF4YkJlYW4+KSBhKSB7CisgICAgICAgICAgICAgICAgfSwgImFwcGxpY2F0aW9uL2Zhc3RpbmZvc2V0IiksIG5ldyBHZW5lcmljVHlwZTxNeUFycmF5TGlzdDxKYXhiQmVhbj4+KCkgeworICAgICAgICAgICAgICAgIH0pOworICAgICAgICBhc3NlcnRFcXVhbHMoYSwgYik7CisgICAgfQorCisgICAgQFBhdGgoIkpBWEJMaXN0UmVzb3VyY2VKU09OIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQVhCTGlzdFJlc291cmNlSlNPTiBleHRlbmRzIEpBWEJMaXN0UmVzb3VyY2UgeworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpBWEJMaXN0UmVwcmVzZW50YXRpb25KU09OKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoIkpBWEJMaXN0UmVzb3VyY2VKU09OIik7CisKKyAgICAgICAgQ29sbGVjdGlvbjxKYXhiQmVhbj4gYSA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KAorICAgICAgICAgICAgICAgIG5ldyBHZW5lcmljVHlwZTxDb2xsZWN0aW9uPEpheGJCZWFuPj4oKSB7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIENvbGxlY3Rpb248SmF4YkJlYW4+IGIgPSB0YXJnZXQucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShuZXcgR2VuZXJpY0VudGl0eTxDb2xsZWN0aW9uPEpheGJCZWFuPj4oYSkgeworICAgICAgICB9LCAiYXBwbGljYXRpb24vanNvbiIpLCBuZXcgR2VuZXJpY1R5cGU8Q29sbGVjdGlvbjxKYXhiQmVhbj4+KCkgeworICAgICAgICB9KTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoYSwgYik7CisKKyAgICAgICAgYiA9IHRhcmdldC5wYXRoKCJ0eXBlIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShuZXcgR2VuZXJpY0VudGl0eTxDb2xsZWN0aW9uPEpheGJCZWFuPj4oYSkgeworICAgICAgICB9LCAiYXBwbGljYXRpb24vanNvbiIpLCBuZXcgR2VuZXJpY1R5cGU8Q29sbGVjdGlvbjxKYXhiQmVhbj4+KCkgeworICAgICAgICB9KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGEsIGIpOworCisgICAgICAgIGEgPSBuZXcgTGlua2VkTGlzdDw+KGEpOworICAgICAgICBiID0gdGFyZ2V0LnBhdGgoInF1ZXVlIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShuZXcgR2VuZXJpY0VudGl0eTxRdWV1ZTxKYXhiQmVhbj4+KChRdWV1ZTxKYXhiQmVhbj4pIGEpIHsKKyAgICAgICAgfSwgImFwcGxpY2F0aW9uL2pzb24iKSwgbmV3IEdlbmVyaWNUeXBlPFF1ZXVlPEpheGJCZWFuPj4oKSB7CisgICAgICAgIH0pOworICAgICAgICBhc3NlcnRFcXVhbHMoYSwgYik7CisKKyAgICAgICAgYSA9IG5ldyBIYXNoU2V0PD4oYSk7CisgICAgICAgIGIgPSB0YXJnZXQucGF0aCgic2V0IikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShuZXcgR2VuZXJpY0VudGl0eTxTZXQ8SmF4YkJlYW4+PigoU2V0PEpheGJCZWFuPikgYSkgeworICAgICAgICB9LCAiYXBwbGljYXRpb24vanNvbiIpLCBuZXcgR2VuZXJpY1R5cGU8U2V0PEpheGJCZWFuPj4oKSB7CisgICAgICAgIH0pOworICAgICAgICBmaW5hbCBDb21wYXJhdG9yPEpheGJCZWFuPiBjID0gbmV3IENvbXBhcmF0b3I8SmF4YkJlYW4+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoZmluYWwgSmF4YkJlYW4gdCwgZmluYWwgSmF4YkJlYW4gdDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdC52YWx1ZS5jb21wYXJlVG8odDEudmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBmaW5hbCBUcmVlU2V0PEpheGJCZWFuPiB0MSA9IG5ldyBUcmVlU2V0PD4oYyk7CisgICAgICAgIGZpbmFsIFRyZWVTZXQ8SmF4YkJlYW4+IHQyID0gbmV3IFRyZWVTZXQ8PihjKTsKKyAgICAgICAgdDEuYWRkQWxsKGEpOworICAgICAgICB0Mi5hZGRBbGwoYik7CisgICAgICAgIGFzc2VydEVxdWFscyh0MSwgdDIpOworCisgICAgICAgIGZpbmFsIFN0YWNrPEpheGJCZWFuPiBzID0gbmV3IFN0YWNrPD4oKTsKKyAgICAgICAgcy5hZGRBbGwoYSk7CisgICAgICAgIGIgPSB0YXJnZXQucGF0aCgic3RhY2siKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG5ldyBHZW5lcmljRW50aXR5PFN0YWNrPEpheGJCZWFuPj4ocykgeworICAgICAgICB9LCAiYXBwbGljYXRpb24vanNvbiIpLCBuZXcgR2VuZXJpY1R5cGU8U3RhY2s8SmF4YkJlYW4+PigpIHsKKyAgICAgICAgfSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzLCBiKTsKKworICAgICAgICBhID0gbmV3IE15QXJyYXlMaXN0PD4oYSk7CisgICAgICAgIGIgPSB0YXJnZXQucGF0aCgiY3VzdG9tIikucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eShuZXcgR2VuZXJpY0VudGl0eTxNeUFycmF5TGlzdDxKYXhiQmVhbj4+KChNeUFycmF5TGlzdDxKYXhiQmVhbj4pIGEpIHsKKyAgICAgICAgICAgICAgICB9LCAiYXBwbGljYXRpb24vanNvbiIpLCBuZXcgR2VuZXJpY1R5cGU8TXlBcnJheUxpc3Q8SmF4YkJlYW4+PigpIHsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGEsIGIpOworCisgICAgICAgIC8vIFRPRE86IHdvdWxkIGJlIG5pY2UgdG8gcHJvZHVjZS9jb25zdW1lIGEgcmVhbCBKU09OIGFycmF5IGxpa2UgZm9sbG93aW5nCisgICAgICAgIC8vIGluc3RlYWQgb2Ygd2hhdCB3ZSBoYXZlIG5vdzoKKyAgICAgICAgLy8gICAgICAgIEpTT05BcnJheSBhID0gci5nZXQoSlNPTkFycmF5LmNsYXNzKTsKKyAgICAgICAgLy8gICAgICAgIEpTT05BcnJheSBiID0gbmV3IEpTT05BcnJheSgpLgorICAgICAgICAvLyAgICAgICAgICAgICAgICBwdXQobmV3IEpTT05PYmplY3QoKS5wdXQoInZhbHVlIiwgIm9uZSIpKS4KKyAgICAgICAgLy8gICAgICAgICAgICAgICAgcHV0KG5ldyBKU09OT2JqZWN0KCkucHV0KCJ2YWx1ZSIsICJ0d28iKSkuCisgICAgICAgIC8vICAgICAgICAgICAgICAgIHB1dChuZXcgSlNPTk9iamVjdCgpLnB1dCgidmFsdWUiLCAidGhyZWUiKSk7CisgICAgICAgIC8vICAgICAgICBhc3NlcnRFcXVhbHMoYS50b1N0cmluZygpLCBiLnRvU3RyaW5nKCkpOworICAgICAgICAvLyAgICAgICAgSlNPTkFycmF5IGMgPSByLnBvc3QoSlNPTkFycmF5LmNsYXNzLCBiKTsKKyAgICAgICAgLy8gICAgICAgIGFzc2VydEVxdWFscyhhLnRvU3RyaW5nKCksIGMudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFBhdGgoIkpBWEJMaXN0UmVzb3VyY2VKU09OTWVkaWFUeXBlIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Zvbytqc29uIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL2Zvbytqc29uIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpBWEJMaXN0UmVzb3VyY2VKU09OTWVkaWFUeXBlIGV4dGVuZHMgSkFYQkxpc3RSZXNvdXJjZSB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQkxpc3RSZXByZXNlbnRhdGlvbkpTT05NZWRpYVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiSkFYQkxpc3RSZXNvdXJjZUpTT05NZWRpYVR5cGUiKTsKKworICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPEpheGJCZWFuPiBhID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoCisgICAgICAgICAgICAgICAgbmV3IEdlbmVyaWNUeXBlPENvbGxlY3Rpb248SmF4YkJlYW4+PigpIHsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgQ29sbGVjdGlvbjxKYXhiQmVhbj4gYiA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG5ldyBHZW5lcmljRW50aXR5PENvbGxlY3Rpb248SmF4YkJlYW4+PihhKSB7CisgICAgICAgIH0sICJhcHBsaWNhdGlvbi9mb28ranNvbiIpLCBuZXcgR2VuZXJpY1R5cGU8Q29sbGVjdGlvbjxKYXhiQmVhbj4+KCkgeworICAgICAgICB9KTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoYSwgYik7CisKKyAgICAgICAgYiA9IHRhcmdldC5wYXRoKCJ0eXBlIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShuZXcgR2VuZXJpY0VudGl0eTxDb2xsZWN0aW9uPEpheGJCZWFuPj4oYSkgeworICAgICAgICB9LCAiYXBwbGljYXRpb24vZm9vK2pzb24iKSwgbmV3IEdlbmVyaWNUeXBlPENvbGxlY3Rpb248SmF4YkJlYW4+PigpIHsKKyAgICAgICAgfSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhLCBiKTsKKworICAgICAgICAvLyBUT0RPOiB3b3VsZCBiZSBuaWNlIHRvIHByb2R1Y2UvY29uc3VtZSBhIHJlYWwgSlNPTiBhcnJheSBsaWtlIGZvbGxvd2luZworICAgICAgICAvLyBpbnN0ZWFkIG9mIHdoYXQgd2UgaGF2ZSBub3c6CisgICAgICAgIC8vICAgICAgICBKU09OQXJyYXkgYSA9IHIuZ2V0KEpTT05BcnJheS5jbGFzcyk7CisgICAgICAgIC8vICAgICAgICBKU09OQXJyYXkgYiA9IG5ldyBKU09OQXJyYXkoKS4KKyAgICAgICAgLy8gICAgICAgICAgICAgICAgcHV0KG5ldyBKU09OT2JqZWN0KCkucHV0KCJ2YWx1ZSIsICJvbmUiKSkuCisgICAgICAgIC8vICAgICAgICAgICAgICAgIHB1dChuZXcgSlNPTk9iamVjdCgpLnB1dCgidmFsdWUiLCAidHdvIikpLgorICAgICAgICAvLyAgICAgICAgICAgICAgICBwdXQobmV3IEpTT05PYmplY3QoKS5wdXQoInZhbHVlIiwgInRocmVlIikpOworICAgICAgICAvLyAgICAgICAgYXNzZXJ0RXF1YWxzKGEudG9TdHJpbmcoKSwgYi50b1N0cmluZygpKTsKKyAgICAgICAgLy8gICAgICAgIEpTT05BcnJheSBjID0gci5wb3N0KEpTT05BcnJheS5jbGFzcywgYik7CisgICAgICAgIC8vICAgICAgICBhc3NlcnRFcXVhbHMoYS50b1N0cmluZygpLCBjLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBQYXRoKCIvTm9Db250ZW50VHlwZUpBWEJSZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBOb0NvbnRlbnRUeXBlSkFYQlJlc291cmNlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgSmF4YkJlYW4gcG9zdChAQ29udGV4dCBmaW5hbCBIdHRwSGVhZGVycyBoZWFkZXJzLCBmaW5hbCBKYXhiQmVhbiBiZWFuKSB7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGhlYWRlcnMuZ2V0TWVkaWFUeXBlKCksIGlzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUxfVFlQRSkpOworICAgICAgICAgICAgcmV0dXJuIGJlYW47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb0NvbnRlbnRUeXBlSmF4YkVudGl0eSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFRoYXQodGFyZ2V0KCJOb0NvbnRlbnRUeXBlSkFYQlJlc291cmNlIikucmVxdWVzdCgiYXBwbGljYXRpb24veG1sIikucG9zdChFbnRpdHkueG1sKG5ldyBKYXhiQmVhbigiZm9vIikpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmdldE1lZGlhVHlwZSgpLAorICAgICAgICAgICAgICAgIGlzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUxfVFlQRSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0dlbmVyaWNUeXBlQW5kRW50aXR5VGVzdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvR2VuZXJpY1R5cGVBbmRFbnRpdHlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVkOTI4MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0dlbmVyaWNUeXBlQW5kRW50aXR5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMzk1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5QYXJhbWV0ZXJpemVkVHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkdlbmVyaWNFbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmpldHRpc29uLmpzb24uSlNPTkFycmF5OworaW1wb3J0IG9yZy5jb2RlaGF1cy5qZXR0aXNvbi5qc29uLkpTT05FeGNlcHRpb247CitpbXBvcnQgb3JnLmNvZGVoYXVzLmpldHRpc29uLmpzb24uSlNPTk9iamVjdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLlJlYWRlcldyaXRlcjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK3B1YmxpYyBjbGFzcyBHZW5lcmljVHlwZUFuZEVudGl0eVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFR5cGVUZXN0ZXIgeworCisgICAgQFByb3ZpZGVyCisgICAgQFN1cHByZXNzV2FybmluZ3MoIlVudXNlZERlY2xhcmF0aW9uIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIExpc3RJbnRlZ2VyV3JpdGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlSZWFkZXI8TGlzdDxJbnRlZ2VyPj4sIE1lc3NhZ2VCb2R5V3JpdGVyPExpc3Q8SW50ZWdlcj4+IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFR5cGUgdDsKKworICAgICAgICBwdWJsaWMgTGlzdEludGVnZXJXcml0ZXIoKSB7CisgICAgICAgICAgICBmaW5hbCBMaXN0PEludGVnZXI+IGwgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgICAgIGZpbmFsIEdlbmVyaWNFbnRpdHk8TGlzdDxJbnRlZ2VyPj4gZ2UgPSBuZXcgR2VuZXJpY0VudGl0eTxMaXN0PEludGVnZXI+PihsKSB7fTsKKyAgICAgICAgICAgIHRoaXMudCA9IGdlLmdldFR5cGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKGZpbmFsIENsYXNzPD8+IGMsIGZpbmFsIFR5cGUgdCwgZmluYWwgQW5ub3RhdGlvbltdIGFzLCBmaW5hbCBNZWRpYVR5cGUgbXQpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzLnQuZXF1YWxzKHQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShmaW5hbCBMaXN0PEludGVnZXI+IGwsIGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIExpc3Q8SW50ZWdlcj4gbCwgZmluYWwgQ2xhc3M8Pz4gYywgZmluYWwgVHlwZSB0LCBmaW5hbCBBbm5vdGF0aW9uW10gYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG10LCBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIGZvciAoZmluYWwgSW50ZWdlciBpIDogbCkgeworICAgICAgICAgICAgICAgIGlmIChzYi5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCIsICIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXQud3JpdGUoc2IudG9TdHJpbmcoKS5nZXRCeXRlcygpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdGhpcy50LmVxdWFscyhnZW5lcmljVHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIExpc3Q8SW50ZWdlcj4gcmVhZEZyb20oZmluYWwgQ2xhc3M8TGlzdDxJbnRlZ2VyPj4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLCBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gQXJyYXlzLnN0cmVhbShSZWFkZXJXcml0ZXIucmVhZEZyb21Bc1N0cmluZyhlbnRpdHlTdHJlYW0sIG1lZGlhVHlwZSkuc3BsaXQoIiwiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKGlucHV0IC0+IEludGVnZXIudmFsdWVPZihpbnB1dC50cmltKCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5jb2xsZWN0KENvbGxlY3RvcnMudG9MaXN0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBHZW5lcmljTGlzdFJlc291cmNlPFQ+IHsKKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgiZ2VuZXJpY1R5cGUiKQorICAgICAgICBwdWJsaWMgTGlzdDxUPiBwb3N0KGZpbmFsIExpc3Q8VD4gcG9zdCkgeworICAgICAgICAgICAgcmV0dXJuIHBvc3Q7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiTGlzdFJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIExpc3RSZXNvdXJjZSBleHRlbmRzIEdlbmVyaWNMaXN0UmVzb3VyY2U8SW50ZWdlcj4geworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInR5cGUiKQorICAgICAgICBwdWJsaWMgTGlzdDxJbnRlZ2VyPiB0eXBlKCkgeworICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QoMSwgMiwgMywgNCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJnZW5lcmljRW50aXR5IikKKyAgICAgICAgcHVibGljIEdlbmVyaWNFbnRpdHk8TGlzdDxJbnRlZ2VyPj4gZ2VuZXJpY0VudGl0eSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgR2VuZXJpY0VudGl0eTxMaXN0PEludGVnZXI+PihBcnJheXMuYXNMaXN0KDEsIDIsIDMsIDQpKSB7fTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIm9iamVjdCIpCisgICAgICAgIHB1YmxpYyBPYmplY3Qgb2JqZWN0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBHZW5lcmljRW50aXR5PExpc3Q8SW50ZWdlcj4+KEFycmF5cy5hc0xpc3QoMSwgMiwgMywgNCkpIHt9OworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgicmVzcG9uc2UiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgcmVzcG9uc2UoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2sobmV3IEdlbmVyaWNFbnRpdHk8TGlzdDxJbnRlZ2VyPj4oQXJyYXlzLmFzTGlzdCgxLCAyLCAzLCA0KSkge30pLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJ3cm9uZ0dlbmVyaWNFbnRpdHkiKQorICAgICAgICBwdWJsaWMgR2VuZXJpY0VudGl0eTxMaXN0PEludGVnZXI+PiB3cm9uZ0dlbmVyaWNFbnRpdHkoKSB7CisgICAgICAgICAgICAvLyB3cm9uZ2x5IGNvbnN0cnVjdGVkIGdlbmVyaWMgZW50aXR5OiBnZW5lcmljIHR5cGUgb2YgdGhlIGdlbmVyaWMgZW50aXR5CisgICAgICAgICAgICAvLyBpcyBub3QgZ2VuZXJpYyBidXQganVzdCBhIExpc3QgaW50ZXJmYWNlIHR5cGUuIEluIHRoaXMgY2FzZQorICAgICAgICAgICAgLy8gdGhlIHJldHVybiBnZW5lcmljIHR5cGUgd2lsbCBiZSB1c2VkCisgICAgICAgICAgICByZXR1cm4gbmV3IEdlbmVyaWNFbnRpdHk8PihBcnJheXMuYXNMaXN0KDEsIDIsIDMsIDQpLCBMaXN0LmNsYXNzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgR2VuZXJpY0xpc3RNZWRpYVR5cGVSZXNvdXJjZTxUPiB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoImdlbmVyaWNUeXBlIikKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgcHVibGljIExpc3Q8VD4gcG9zdChmaW5hbCBMaXN0PFQ+IHBvc3QpIHsKKyAgICAgICAgICAgIHJldHVybiBwb3N0OworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIkxpc3RSZXNvdXJjZVdpdGhNZWRpYVR5cGUiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTGlzdFJlc291cmNlV2l0aE1lZGlhVHlwZSBleHRlbmRzIEdlbmVyaWNMaXN0TWVkaWFUeXBlUmVzb3VyY2U8SW50ZWdlcj4geworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInR5cGUiKQorICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgICAgICBwdWJsaWMgTGlzdDxJbnRlZ2VyPiB0eXBlKCkgeworICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QoMSwgMiwgMywgNCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJnZW5lcmljRW50aXR5IikKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgcHVibGljIEdlbmVyaWNFbnRpdHk8TGlzdDxJbnRlZ2VyPj4gZ2VuZXJpY0VudGl0eSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgR2VuZXJpY0VudGl0eTxMaXN0PEludGVnZXI+PihBcnJheXMuYXNMaXN0KDEsIDIsIDMsIDQpKSB7fTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIm9iamVjdCIpCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgICAgIHB1YmxpYyBPYmplY3Qgb2JqZWN0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBHZW5lcmljRW50aXR5PExpc3Q8SW50ZWdlcj4+KEFycmF5cy5hc0xpc3QoMSwgMiwgMywgNCkpIHt9OworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgicmVzcG9uc2UiKQorICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgcmVzcG9uc2UoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2sobmV3IEdlbmVyaWNFbnRpdHk8TGlzdDxJbnRlZ2VyPj4oQXJyYXlzLmFzTGlzdCgxLCAyLCAzLCA0KSkge30pLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJ3cm9uZ0dlbmVyaWNFbnRpdHkiKQorICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgICAgICBwdWJsaWMgR2VuZXJpY0VudGl0eTxMaXN0PEludGVnZXI+PiB3cm9uZ0dlbmVyaWNFbnRpdHkoKSB7CisgICAgICAgICAgICAvLyB3cm9uZ2x5IGNvbnN0cnVjdGVkIGdlbmVyaWMgZW50aXR5OiBnZW5lcmljIHR5cGUgb2YgdGhlIGdlbmVyaWMgZW50aXR5CisgICAgICAgICAgICAvLyBpcyBub3QgZ2VuZXJpYyBidXQganVzdCBhIExpc3QgaW50ZXJmYWNlIHR5cGUuIEluIHRoaXMgY2FzZQorICAgICAgICAgICAgLy8gdGhlIHJldHVybiBnZW5lcmljIHR5cGUgd2lsbCBiZSB1c2VkCisgICAgICAgICAgICByZXR1cm4gbmV3IEdlbmVyaWNFbnRpdHk8PihBcnJheXMuYXNMaXN0KDEsIDIsIDMsIDQpLCBMaXN0LmNsYXNzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdlbmVyaWNUeXBlKCkgeworICAgICAgICBfZ2VuZXJpY1Rlc3QoTGlzdFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmljVHlwZVdpdGhNZWRpYVR5cGUoKSB7CisgICAgICAgIF9nZW5lcmljVGVzdChMaXN0UmVzb3VyY2VXaXRoTWVkaWFUeXBlLmNsYXNzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX2dlbmVyaWNUZXN0KGZpbmFsIENsYXNzIHJlc291cmNlQ2xhc3MpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldChyZXNvdXJjZUNsYXNzLmdldFNpbXBsZU5hbWUoKSk7CisKKyAgICAgICAgX3Rlc3RQYXRoKHRhcmdldCwgInR5cGUiKTsKKyAgICAgICAgX3Rlc3RQYXRoKHRhcmdldCwgImdlbmVyaWNFbnRpdHkiKTsKKyAgICAgICAgX3Rlc3RQYXRoKHRhcmdldCwgIm9iamVjdCIpOworICAgICAgICBfdGVzdFBhdGgodGFyZ2V0LCAicmVzcG9uc2UiKTsKKyAgICAgICAgX3Rlc3RQYXRoKHRhcmdldCwgIndyb25nR2VuZXJpY0VudGl0eSIpOworCisgICAgICAgIF90ZXN0UGF0aFBvc3QodGFyZ2V0LCAiZ2VuZXJpY1R5cGUiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3RQYXRoKGZpbmFsIFdlYlRhcmdldCB0YXJnZXQsIGZpbmFsIFN0cmluZyBwYXRoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiMSwgMiwgMywgNCIsIHRhcmdldC5wYXRoKHBhdGgpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0UGF0aFBvc3QoZmluYWwgV2ViVGFyZ2V0IHRhcmdldCwgZmluYWwgU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxLCAyLCAzLCA0IiwgdGFyZ2V0LnBhdGgocGF0aCkucmVxdWVzdCgpLnBvc3QoRW50aXR5LnRleHQoIjEsIDIsIDMsIDQiKSwgU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNYXBTdHJpbmdSZWFkZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVJlYWRlcjxNYXA8U3RyaW5nLCBTdHJpbmc+PiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VCb2R5V3JpdGVyPE1hcDxTdHJpbmcsIFN0cmluZz4+IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFR5cGUgbWFwU3RyaW5nVHlwZTsKKworICAgICAgICBwdWJsaWMgTWFwU3RyaW5nUmVhZGVyKCkgeworICAgICAgICAgICAgZmluYWwgUGFyYW1ldGVyaXplZFR5cGUgaWZhY2UgPSAoUGFyYW1ldGVyaXplZFR5cGUpIHRoaXMuZ2V0Q2xhc3MoKS5nZXRHZW5lcmljSW50ZXJmYWNlcygpWzBdOworICAgICAgICAgICAgbWFwU3RyaW5nVHlwZSA9IGlmYWNlLmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKVswXTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoZmluYWwgQ2xhc3M8Pz4gYywgZmluYWwgVHlwZSB0LCBmaW5hbCBBbm5vdGF0aW9uW10gYXMsIGZpbmFsIE1lZGlhVHlwZSBtdCkgeworICAgICAgICAgICAgcmV0dXJuIE1hcC5jbGFzcyA9PSBjICYmIG1hcFN0cmluZ1R5cGUuZXF1YWxzKHQpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE1hcDxTdHJpbmcsIFN0cmluZz4gcmVhZEZyb20oZmluYWwgQ2xhc3M8TWFwPFN0cmluZywgU3RyaW5nPj4gYywgZmluYWwgVHlwZSB0LCBmaW5hbCBBbm5vdGF0aW9uW10gYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtdCwgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgU3RyaW5nW10gdiA9IFJlYWRlcldyaXRlci5yZWFkRnJvbUFzU3RyaW5nKGluLCBtdCkuc3BsaXQoIiwiKTsKKyAgICAgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gbSA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdi5sZW5ndGg7IGkgPSBpICsgMikgeworICAgICAgICAgICAgICAgIG0ucHV0KHZbaV0sIHZbaSArIDFdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKGZpbmFsIENsYXNzPD8+IGMsIGZpbmFsIFR5cGUgdCwgZmluYWwgQW5ub3RhdGlvbltdIGFzLCBmaW5hbCBNZWRpYVR5cGUgbXQpIHsKKyAgICAgICAgICAgIHJldHVybiBNYXAuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShjKSAmJiBtYXBTdHJpbmdUeXBlLmVxdWFscyh0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gdCwgZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtdCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiB0LCBmaW5hbCBDbGFzczw/PiBjLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG10LCBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIGZvciAoZmluYWwgTWFwLkVudHJ5PFN0cmluZywgU3RyaW5nPiBlIDogdC5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgaWYgKHNiLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoJywnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGUuZ2V0S2V5KCkpLmFwcGVuZCgnLCcpLmFwcGVuZChlLmdldFZhbHVlKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0LndyaXRlKHNiLnRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEdlbmVyaWNNYXBSZXNvdXJjZTxLLCBWPiB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIE1hcDxLLCBWPiBwb3N0KGZpbmFsIE1hcDxLLCBWPiBtKSB7CisgICAgICAgICAgICByZXR1cm4gbTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvTWFwUmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWFwUmVzb3VyY2UgZXh0ZW5kcyBHZW5lcmljTWFwUmVzb3VyY2U8U3RyaW5nLCBTdHJpbmc+IHsKKworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdlbmVyaWNNYXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0VGhhdCh0YXJnZXQoIi9NYXBSZXNvdXJjZSIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS50ZXh0KCJhLGIsYyxkIiksIFN0cmluZy5jbGFzcyksIGlzKCJhLGIsYyxkIikpOworICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWFwTGlzdFN0cmluZ1JlYWRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5UmVhZGVyPE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VCb2R5V3JpdGVyPE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4+IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFR5cGUgbWFwTGlzdFN0cmluZ1R5cGU7CisKKyAgICAgICAgcHVibGljIE1hcExpc3RTdHJpbmdSZWFkZXIoKSB7CisgICAgICAgICAgICBmaW5hbCBQYXJhbWV0ZXJpemVkVHlwZSBpZmFjZSA9IChQYXJhbWV0ZXJpemVkVHlwZSkgdGhpcy5nZXRDbGFzcygpLmdldEdlbmVyaWNJbnRlcmZhY2VzKClbMF07CisgICAgICAgICAgICBtYXBMaXN0U3RyaW5nVHlwZSA9IGlmYWNlLmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKVswXTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoZmluYWwgQ2xhc3M8Pz4gYywgZmluYWwgVHlwZSB0LCBmaW5hbCBBbm5vdGF0aW9uW10gYXMsIGZpbmFsIE1lZGlhVHlwZSBtdCkgeworICAgICAgICAgICAgcmV0dXJuIE1hcC5jbGFzcyA9PSBjICYmIG1hcExpc3RTdHJpbmdUeXBlLmVxdWFscyh0KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBMaXN0PFN0cmluZz4+IHJlYWRGcm9tKGZpbmFsIENsYXNzPE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4+IGMsIGZpbmFsIFR5cGUgdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFzLCBmaW5hbCBNZWRpYVR5cGUgbXQsIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywKKyAgICAgICAgICAgICAgICBTdHJpbmc+IGhlYWRlcnMsIGZpbmFsIElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBmaW5hbCBKU09OT2JqZWN0IG8gPSBuZXcgSlNPTk9iamVjdChSZWFkZXJXcml0ZXIucmVhZEZyb21Bc1N0cmluZyhpbiwgbXQpKTsKKworICAgICAgICAgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gbSA9IG5ldyBMaW5rZWRIYXNoTWFwPD4oKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBJdGVyYXRvciBrZXlzID0gby5rZXlzKCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKGtleXMuaGFzTmV4dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBrZXkgPSAoU3RyaW5nKSBrZXlzLm5leHQoKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGwgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgICAgICAgICAgICAgbS5wdXQoa2V5LCBsKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgSlNPTkFycmF5IGEgPSBvLmdldEpTT05BcnJheShrZXkpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGEubGVuZ3RoKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgbC5hZGQoYS5nZXRTdHJpbmcoaSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBtOworICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSlNPTkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoZmluYWwgQ2xhc3M8Pz4gYywgZmluYWwgVHlwZSB0LCBmaW5hbCBBbm5vdGF0aW9uW10gYXMsIGZpbmFsIE1lZGlhVHlwZSBtdCkgeworICAgICAgICAgICAgcmV0dXJuIE1hcC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGMpICYmIG1hcExpc3RTdHJpbmdUeXBlLmVxdWFscyh0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKGZpbmFsIE1hcDxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gdCwgZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYXMsIGZpbmFsIE1lZGlhVHlwZSBtdCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oZmluYWwgTWFwPFN0cmluZywgTGlzdDxTdHJpbmc+PiB0LCBmaW5hbCBDbGFzczw/PiBjLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG10LCBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGZpbmFsIEpTT05PYmplY3QgbyA9IG5ldyBKU09OT2JqZWN0KCk7CisgICAgICAgICAgICAgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8U3RyaW5nLCBMaXN0PFN0cmluZz4+IGUgOiB0LmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgby5wdXQoZS5nZXRLZXkoKSwgZS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0LndyaXRlKG8udG9TdHJpbmcoKS5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEpTT05FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBHZW5lcmljTWFwTGlzdFJlc291cmNlPEssIFY+IHsKKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgTWFwPEssIExpc3Q8Vj4+IHBvc3QoZmluYWwgTWFwPEssIExpc3Q8Vj4+IG0pIHsKKyAgICAgICAgICAgIHJldHVybiBtOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi9NYXBMaXN0UmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWFwTGlzdFJlc291cmNlIGV4dGVuZHMgR2VuZXJpY01hcExpc3RSZXNvdXJjZTxTdHJpbmcsIFN0cmluZz4geworCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJpY01hcExpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGpzb24gPSAie1wiYVwiOltcIjFcIixcIjJcIl0sXCJiXCI6W1wiMVwiLFwiMlwiXX0iOworICAgICAgICBhc3NlcnRUaGF0KHRhcmdldCgiL01hcExpc3RSZXNvdXJjZSIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS50ZXh0KGpzb24pLCBTdHJpbmcuY2xhc3MpLCBpcyhqc29uKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvSW5qZWN0ZWRQcm92aWRlclRlc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0luamVjdGVkUHJvdmlkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU2MmVkOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0luamVjdGVkUHJvdmlkZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitwdWJsaWMgY2xhc3MgSW5qZWN0ZWRQcm92aWRlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdFR5cGVUZXN0ZXIgeworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCZWFuIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworICAgICAgICBwcml2YXRlIFN0cmluZyBzdHJpbmc7CisKKyAgICAgICAgcHVibGljIEJlYW4oKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQmVhbihTdHJpbmcgc3RyaW5nKSB7CisgICAgICAgICAgICB0aGlzLnN0cmluZyA9IHN0cmluZzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIHN0cmluZzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFN0cmluZyhTdHJpbmcgc3RyaW5nKSB7CisgICAgICAgICAgICB0aGlzLnN0cmluZyA9IHN0cmluZzsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQmVhblJlYWRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5UmVhZGVyPEJlYW4+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uIGFubm90YXRpb25zW10sIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlID09IEJlYW4uY2xhc3M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJlYW4gcmVhZEZyb20oCisgICAgICAgICAgICAgICAgQ2xhc3M8QmVhbj4gdHlwZSwKKyAgICAgICAgICAgICAgICBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbnNbXSwKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBPYmplY3RJbnB1dFN0cmVhbSBvaW4gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oZW50aXR5U3RyZWFtKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChCZWFuKSBvaW4ucmVhZE9iamVjdCgpOworICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBjYXVzZSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihjYXVzZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEluamVjdGVkQmVhblJlYWRlcldyaXRlciBleHRlbmRzIEJlYW5SZWFkZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVdyaXRlcjxCZWFuPiB7CisKKyAgICAgICAgQENvbnRleHQKKyAgICAgICAgVXJpSW5mbyB1cmlJbmZvOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uIGFubm90YXRpb25zW10sIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlID09IEJlYW4uY2xhc3M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbygKKyAgICAgICAgICAgICAgICBCZWFuIHQsCisgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gdHlwZSwKKyAgICAgICAgICAgICAgICBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbnNbXSwKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgdC5zZXRTdHJpbmcodXJpSW5mby5nZXRSZXF1ZXN0VXJpKCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBPYmplY3RPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShlbnRpdHlTdHJlYW0pOworICAgICAgICAgICAgb3V0LndyaXRlT2JqZWN0KHQpOworICAgICAgICAgICAgb3V0LmZsdXNoKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShCZWFuIHQsIENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi9vbmUvdHdvL3tpZH0iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQmVhblJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBCZWFuIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQmVhbigiIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcucmVnaXN0ZXIoQmVhblJlYWRlci5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmVhbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBCZWFuIGJlYW4zID0gdGFyZ2V0KCJvbmUvdHdvL3RocmVlIikucmVxdWVzdCgpLmdldChCZWFuLmNsYXNzKTsKKyAgICAgICAgQmVhbiBiZWFuNCA9IHRhcmdldCgib25lL3R3by9mb3VyIikucmVxdWVzdCgpLmdldChCZWFuLmNsYXNzKTsKKworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcDMgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKSB7eworICAgICAgICAgICAgcHV0KCJpZCIsICJ0aHJlZSIpOworICAgICAgICB9fTsKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBtYXA0ID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCkge3sKKyAgICAgICAgICAgIHB1dCgiaWQiLCAiZm91ciIpOworICAgICAgICB9fTsKKworICAgICAgICBTdHJpbmcgcmVxdWVzdFVyaTMgPSB0YXJnZXQoKS5nZXRVcmlCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAucGF0aChCZWFuUmVzb3VyY2UuY2xhc3MpLmJ1aWxkRnJvbU1hcChtYXAzKS50b1N0cmluZygpOworICAgICAgICBTdHJpbmcgcmVxdWVzdFVyaTQgPSB0YXJnZXQoKS5nZXRVcmlCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAucGF0aChCZWFuUmVzb3VyY2UuY2xhc3MpLmJ1aWxkRnJvbU1hcChtYXA0KS50b1N0cmluZygpOworCisgICAgICAgIGFzc2VydEVxdWFscyhyZXF1ZXN0VXJpMywgYmVhbjMuZ2V0U3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMocmVxdWVzdFVyaTQsIGJlYW40LmdldFN0cmluZygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9JbnRlcmNlcHRlZFN0cmVhbUNsb3NlVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvSW50ZXJjZXB0ZWRTdHJlYW1DbG9zZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmFjNTc3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvSW50ZXJjZXB0ZWRTdHJlYW1DbG9zZVRlc3QuamF2YQpAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5OworCitpbXBvcnQgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbHRlck91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SZWFkZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBSZXByb2R1Y2VyIGZvciBKRVJTRVktMTg0NS4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSW50ZXJjZXB0ZWRTdHJlYW1DbG9zZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKyAgICBAUGF0aCgicmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFJlc291cmNlIHsKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0KFN0cmluZyBlbnRpdHkpIHsKKyAgICAgICAgICAgIHJldHVybiBlbnRpdHk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENsaWVudEludGVyY2VwdG9yIGltcGxlbWVudHMgUmVhZGVySW50ZXJjZXB0b3IsIFdyaXRlckludGVyY2VwdG9yIHsKKyAgICAgICAgcHJpdmF0ZSB2b2xhdGlsZSBpbnQgcmVhZEZyb21Db3VudCA9IDA7CisgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgaW50IGluQ2xvc2VDb3VudCA9IDA7CisgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgaW50IHdyaXRlVG9Db3VudCA9IDA7CisgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgaW50IG91dENsb3NlQ291bnQgPSAwOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0IGFyb3VuZFJlYWRGcm9tKFJlYWRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJlYWRGcm9tQ291bnQrKzsKKworICAgICAgICAgICAgY29udGV4dC5zZXRJbnB1dFN0cmVhbShuZXcgRmlsdGVySW5wdXRTdHJlYW0oY29udGV4dC5nZXRJbnB1dFN0cmVhbSgpKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICBpbkNsb3NlQ291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgc3VwZXIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0LnByb2NlZWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBhcm91bmRXcml0ZVRvKFdyaXRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHdyaXRlVG9Db3VudCsrOworCisgICAgICAgICAgICBjb250ZXh0LnNldE91dHB1dFN0cmVhbShuZXcgRmlsdGVyT3V0cHV0U3RyZWFtKGNvbnRleHQuZ2V0T3V0cHV0U3RyZWFtKCkpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIG91dENsb3NlQ291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgc3VwZXIuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgY29udGV4dC5wcm9jZWVkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFRlc3RSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V3JhcHBlZFN0cmVhbUNsb3NlZCgpIHsKKyAgICAgICAgQ2xpZW50SW50ZXJjZXB0b3IgaW50ZXJjZXB0b3IgPSBuZXcgQ2xpZW50SW50ZXJjZXB0b3IoKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnJlZ2lzdGVyKGludGVyY2VwdG9yKQorICAgICAgICAgICAgICAgIC5wYXRoKCJyZXNvdXJjZSIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoImVudGl0eSIsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJlbnRpdHkiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworCisgICAgICAgIGFzc2VydEVxdWFscygxLCBpbnRlcmNlcHRvci5yZWFkRnJvbUNvdW50KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGludGVyY2VwdG9yLmluQ2xvc2VDb3VudCk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBpbnRlcmNlcHRvci53cml0ZVRvQ291bnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgaW50ZXJjZXB0b3Iub3V0Q2xvc2VDb3VudCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvSW52YWxpZEVudGl0eVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0ludmFsaWRFbnRpdHlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRhN2NjNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0ludmFsaWRFbnRpdHlUZXN0LmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LlJlc3BvbnNlUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK3B1YmxpYyBjbGFzcyBJbnZhbGlkRW50aXR5VGVzdCBleHRlbmRzIEFic3RyYWN0VHlwZVRlc3RlciB7CisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFJlc291cmNlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImZvby9iYXIiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEZvb0JhcigpIHsKKyAgICAgICAgICAgIHJldHVybiAiZm9vL2JhciI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkRW50aXR5KCkgeworICAgICAgICBUaHJvd2FibGUgZXhjZXB0aW9uID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRhcmdldCgpLnJlcXVlc3QoImZvby9iYXIiKS5nZXQoSW50ZWdlci5jbGFzcyk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBleGNlcHRpb24gPSBlOworICAgICAgICB9CisgICAgICAgIGlmICghKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIFJlc3BvbnNlUHJvY2Vzc2luZ0V4Y2VwdGlvbikpIHsKKyAgICAgICAgICAgIGlmIChleGNlcHRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGV4Y2VwdGlvbi5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0ludmFsaWRGb3JtVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvSW52YWxpZEZvcm1UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmFmOWIzMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0ludmFsaWRGb3JtVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eTsKKworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRm9ybTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqLworcHVibGljIGNsYXNzIEludmFsaWRGb3JtVGVzdCBleHRlbmRzIEFic3RyYWN0VHlwZVRlc3RlciB7CisKKyAgICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIFJlc291cmNlPFQ+IHsKKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgdm9pZCBwb3N0KFQgdCkgeworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIm11bHRpdmFsdWVkbWFwIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZvcm1NdWx0aXZhbHVlZE1hcFJlc291cmNlIGV4dGVuZHMgUmVzb3VyY2U8TXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+PiB7fQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9ybU11bHRpdmFsdWVkTWFwUmVwcmVzZW50YXRpb24oKSB7CisgICAgICAgIF90ZXN0KCJtdWx0aXZhbHVlZG1hcCIpOworICAgIH0KKworICAgIEBQYXRoKCJmb3JtIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZvcm1SZXNvdXJjZSBleHRlbmRzIFJlc291cmNlPEZvcm0+IHt9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXByZXNlbnRhdGlvbigpIHsKKyAgICAgICAgX3Rlc3QoImZvcm0iKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBfdGVzdChTdHJpbmcgcGF0aCkgeworICAgICAgICBTdHJpbmcgZm9ybSA9ICJtPSUiOworICAgICAgICBSZXNwb25zZSBjciA9IHRhcmdldChwYXRoKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KGZvcm0sIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9GT1JNX1VSTEVOQ09ERURfVFlQRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCBjci5nZXRTdGF0dXMoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvSkFYQkNvbnRleHRSZXNvbHZlclRlc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0pBWEJDb250ZXh0UmVzb2x2ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYyODc3NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0pBWEJDb250ZXh0UmVzb2x2ZXJUZXN0LmphdmEKQEAgLTAsMCArMSw2MzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eTsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuQ29udGV4dFJlc29sdmVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLmJpbmQuTWFyc2hhbGxlcjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5Vbm1hcnNoYWxsZXI7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LmV4cGVyaW1lbnRhbC5ydW5uZXJzLkVuY2xvc2VkOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitAUnVuV2l0aChFbmNsb3NlZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBKQVhCQ29udGV4dFJlc29sdmVyVGVzdCB7CisKKyAgICBAUHJvdmlkZXIKKyAgICBASWdub3JlKCJUaGlzIGNsYXNzIGlzIG5vdCBhIHRlc3QgY2xhc3MgJiBtdXN0IGJlIGlnbm9yZWQgYnkgdGhlIEVuY2xvc2VkIHRlc3QgcnVubmVyLiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQVhCQ29udGV4dFJlc29sdmVyIGltcGxlbWVudHMgQ29udGV4dFJlc29sdmVyPEpBWEJDb250ZXh0PiB7CisKKyAgICAgICAgcHJpdmF0ZSBKQVhCQ29udGV4dCBjb250ZXh0OworICAgICAgICBwcml2YXRlIGludCBpbnZva2VkOworCisgICAgICAgIHB1YmxpYyBKQVhCQ29udGV4dFJlc29sdmVyKCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQgPSBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZShKYXhiQmVhbi5jbGFzcyk7CisgICAgICAgICAgICB9IGNhdGNoIChKQVhCRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEpBWEJDb250ZXh0IGdldENvbnRleHQoQ2xhc3M8Pz4gYykgeworICAgICAgICAgICAgaWYgKEpheGJCZWFuLmNsYXNzID09IGMpIHsKKyAgICAgICAgICAgICAgICBpbnZva2VkKys7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBpbnZva2VkKCkgeworICAgICAgICAgICAgcmV0dXJuIGludm9rZWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBASWdub3JlKCJUaGlzIGNsYXNzIGlzIG5vdCBhIHRlc3QgY2xhc3MgJiBtdXN0IGJlIGlnbm9yZWQgYnkgdGhlIEVuY2xvc2VkIHRlc3QgcnVubmVyLiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNYXJzaGFsbGVyUmVzb2x2ZXIgaW1wbGVtZW50cyBDb250ZXh0UmVzb2x2ZXI8TWFyc2hhbGxlcj4geworCisgICAgICAgIHByaXZhdGUgSkFYQkNvbnRleHQgY29udGV4dDsKKyAgICAgICAgcHJpdmF0ZSBpbnQgaW52b2tlZDsKKworICAgICAgICBwdWJsaWMgTWFyc2hhbGxlclJlc29sdmVyKCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHQgPSBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZShKYXhiQmVhbi5jbGFzcyk7CisgICAgICAgICAgICB9IGNhdGNoIChKQVhCRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE1hcnNoYWxsZXIgZ2V0Q29udGV4dChDbGFzczw/PiBjKSB7CisgICAgICAgICAgICBpZiAoSmF4YkJlYW4uY2xhc3MgPT0gYykgeworICAgICAgICAgICAgICAgIGludm9rZWQrKzsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5jcmVhdGVNYXJzaGFsbGVyKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSkFYQkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgaW52b2tlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBpbnZva2VkOworICAgICAgICB9CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgQElnbm9yZSgiVGhpcyBjbGFzcyBpcyBub3QgYSB0ZXN0IGNsYXNzICYgbXVzdCBiZSBpZ25vcmVkIGJ5IHRoZSBFbmNsb3NlZCB0ZXN0IHJ1bm5lci4iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVW5tYXJzaGFsbGVyUmVzb2x2ZXIgaW1wbGVtZW50cyBDb250ZXh0UmVzb2x2ZXI8VW5tYXJzaGFsbGVyPiB7CisKKyAgICAgICAgcHJpdmF0ZSBKQVhCQ29udGV4dCBjb250ZXh0OworICAgICAgICBwcml2YXRlIGludCBpbnZva2VkOworCisgICAgICAgIHB1YmxpYyBVbm1hcnNoYWxsZXJSZXNvbHZlcigpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0ID0gSkFYQkNvbnRleHQubmV3SW5zdGFuY2UoSmF4YkJlYW4uY2xhc3MpOworICAgICAgICAgICAgfSBjYXRjaCAoSkFYQkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBVbm1hcnNoYWxsZXIgZ2V0Q29udGV4dChDbGFzczw/PiBjKSB7CisgICAgICAgICAgICBpZiAoSmF4YkJlYW4uY2xhc3MgPT0gYykgeworICAgICAgICAgICAgICAgIGludm9rZWQrKzsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5jcmVhdGVVbm1hcnNoYWxsZXIoKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChKQVhCRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGV4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGludCBpbnZva2VkKCkgeworICAgICAgICAgICAgcmV0dXJuIGludm9rZWQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgQElnbm9yZSgiVGhpcyBjbGFzcyBpcyBub3QgYSB0ZXN0IGNsYXNzICYgbXVzdCBiZSBpZ25vcmVkIGJ5IHRoZSBFbmNsb3NlZCB0ZXN0IHJ1bm5lci4iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSmF4YkJlYW5SZXNvdXJjZSB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIEpheGJCZWFuIGdldChKYXhiQmVhbiBiKSB7CisgICAgICAgICAgICByZXR1cm4gYjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSkFYQkNvbnRleHRUZXN0IGV4dGVuZHMgQWJzdHJhY3RUeXBlVGVzdGVyIHsKKworICAgICAgICBwcml2YXRlIEpBWEJDb250ZXh0UmVzb2x2ZXIgY3I7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgICAgICBjciA9IG5ldyBKQVhCQ29udGV4dFJlc29sdmVyKCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEpheGJCZWFuUmVzb3VyY2UuY2xhc3MpLnJlZ2lzdGVySW5zdGFuY2VzKGNyKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCQ29udGV4dCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUxfVFlQRSkucG9zdChFbnRpdHkueG1sKG5ldyBKYXhiQmVhbigiZm9vIikpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCksIGVxdWFsVG8oTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTF9UWVBFKSk7CisKKyAgICAgICAgICAgIGZpbmFsIEpheGJCZWFuIGZvbyA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoSmF4YkJlYW4uY2xhc3MpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChmb28udmFsdWUsIGVxdWFsVG8oImZvbyIpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoY3IuaW52b2tlZCgpLCBlcXVhbFRvKDIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVW5tYXJzaGFsbGVyVGVzdCBleHRlbmRzIEFic3RyYWN0VHlwZVRlc3RlciB7CisKKyAgICAgICAgcHJpdmF0ZSBKQVhCQ29udGV4dFJlc29sdmVyIGNyOworICAgICAgICBwcml2YXRlIE1hcnNoYWxsZXJSZXNvbHZlciBtcjsKKyAgICAgICAgcHJpdmF0ZSBVbm1hcnNoYWxsZXJSZXNvbHZlciB1bXI7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgICAgICBjciA9IG5ldyBKQVhCQ29udGV4dFJlc29sdmVyKCk7CisgICAgICAgICAgICBtciA9IG5ldyBNYXJzaGFsbGVyUmVzb2x2ZXIoKTsKKyAgICAgICAgICAgIHVtciA9IG5ldyBVbm1hcnNoYWxsZXJSZXNvbHZlcigpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhKYXhiQmVhblJlc291cmNlLmNsYXNzKS5yZWdpc3Rlckluc3RhbmNlcyhjciwgbXIsIHVtcik7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0VW5tYXJzaGFsbGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTF9UWVBFKS5wb3N0KEVudGl0eS54bWwobmV3IEpheGJCZWFuKCJmb28iKSkpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRNZWRpYVR5cGUoKSwgZXF1YWxUbyhNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MX1RZUEUpKTsKKworICAgICAgICAgICAgZmluYWwgSmF4YkJlYW4gZm9vID0gcmVzcG9uc2UucmVhZEVudGl0eShKYXhiQmVhbi5jbGFzcyk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGZvby52YWx1ZSwgZXF1YWxUbygiZm9vIikpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChjci5pbnZva2VkKCksIGVxdWFsVG8oMCkpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChtci5pbnZva2VkKCksIGVxdWFsVG8oMSkpOworICAgICAgICAgICAgYXNzZXJ0VGhhdCh1bXIuaW52b2tlZCgpLCBlcXVhbFRvKDEpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24veG1sIikKKyAgICBASWdub3JlKCJUaGlzIGNsYXNzIGlzIG5vdCBhIHRlc3QgY2xhc3MgJiBtdXN0IGJlIGlnbm9yZWQgYnkgdGhlIEVuY2xvc2VkIHRlc3QgcnVubmVyLiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQVhCQ29udGV4dFJlc29sdmVyQXBwIGV4dGVuZHMgSkFYQkNvbnRleHRSZXNvbHZlciB7CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi94bWwiKQorICAgIEBJZ25vcmUoIlRoaXMgY2xhc3MgaXMgbm90IGEgdGVzdCBjbGFzcyAmIG11c3QgYmUgaWdub3JlZCBieSB0aGUgRW5jbG9zZWQgdGVzdCBydW5uZXIuIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1hcnNoYWxsZXJSZXNvbHZlckFwcCBleHRlbmRzIE1hcnNoYWxsZXJSZXNvbHZlciB7CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi94bWwiKQorICAgIEBJZ25vcmUoIlRoaXMgY2xhc3MgaXMgbm90IGEgdGVzdCBjbGFzcyAmIG11c3QgYmUgaWdub3JlZCBieSB0aGUgRW5jbG9zZWQgdGVzdCBydW5uZXIuIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFVubWFyc2hhbGxlclJlc29sdmVyQXBwIGV4dGVuZHMgVW5tYXJzaGFsbGVyUmVzb2x2ZXIgeworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL3htbCIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi94bWwiKQorICAgIEBJZ25vcmUoIlRoaXMgY2xhc3MgaXMgbm90IGEgdGVzdCBjbGFzcyAmIG11c3QgYmUgaWdub3JlZCBieSB0aGUgRW5jbG9zZWQgdGVzdCBydW5uZXIuIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpheGJCZWFuUmVzb3VyY2VBcHAgZXh0ZW5kcyBKYXhiQmVhblJlc291cmNlIHsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpBWEJDb250ZXh0QXBwVGVzdCBleHRlbmRzIEFic3RyYWN0VHlwZVRlc3RlciB7CisKKyAgICAgICAgcHJpdmF0ZSBKQVhCQ29udGV4dFJlc29sdmVyIGNyOworICAgICAgICBwcml2YXRlIEpBWEJDb250ZXh0UmVzb2x2ZXJBcHAgY3JBcHA7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgICAgICBjciA9IG5ldyBKQVhCQ29udGV4dFJlc29sdmVyKCk7CisgICAgICAgICAgICBjckFwcCA9IG5ldyBKQVhCQ29udGV4dFJlc29sdmVyQXBwKCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEpheGJCZWFuUmVzb3VyY2VBcHAuY2xhc3MpLnJlZ2lzdGVySW5zdGFuY2VzKGNyLCBjckFwcCk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQkNvbnRleHRBcHAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0KCkucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShuZXcgSmF4YkJlYW4oImZvbyIpLCAiYXBwbGljYXRpb24veG1sIiksIEpheGJCZWFuLmNsYXNzKS52YWx1ZSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY3IuaW52b2tlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBjckFwcC5pbnZva2VkKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBVbm1hcnNoYWxsZXJBcHBUZXN0IGV4dGVuZHMgQWJzdHJhY3RUeXBlVGVzdGVyIHsKKworICAgICAgICBwcml2YXRlIEpBWEJDb250ZXh0UmVzb2x2ZXIgY3I7CisgICAgICAgIHByaXZhdGUgTWFyc2hhbGxlclJlc29sdmVyIG1yOworICAgICAgICBwcml2YXRlIFVubWFyc2hhbGxlclJlc29sdmVyIHVtcjsKKyAgICAgICAgcHJpdmF0ZSBNYXJzaGFsbGVyUmVzb2x2ZXJBcHAgbXJBcHA7CisgICAgICAgIHByaXZhdGUgVW5tYXJzaGFsbGVyUmVzb2x2ZXJBcHAgdW1yQXBwOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICAgICAgY3IgPSBuZXcgSkFYQkNvbnRleHRSZXNvbHZlcigpOworICAgICAgICAgICAgbXIgPSBuZXcgTWFyc2hhbGxlclJlc29sdmVyKCk7CisgICAgICAgICAgICB1bXIgPSBuZXcgVW5tYXJzaGFsbGVyUmVzb2x2ZXIoKTsKKyAgICAgICAgICAgIG1yQXBwID0gbmV3IE1hcnNoYWxsZXJSZXNvbHZlckFwcCgpOworICAgICAgICAgICAgdW1yQXBwID0gbmV3IFVubWFyc2hhbGxlclJlc29sdmVyQXBwKCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEpheGJCZWFuUmVzb3VyY2VBcHAuY2xhc3MpLnJlZ2lzdGVySW5zdGFuY2VzKGNyLCBtciwgdW1yLCBtckFwcCwgdW1yQXBwKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RVbm1hcnNoYWxsZXJBcHAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0KCkucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShuZXcgSmF4YkJlYW4oImZvbyIpLCAiYXBwbGljYXRpb24veG1sIiksIEpheGJCZWFuLmNsYXNzKS52YWx1ZSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY3IuaW52b2tlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBtci5pbnZva2VkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHVtci5pbnZva2VkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1yQXBwLmludm9rZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdW1yQXBwLmludm9rZWQoKSk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwgdGFyZ2V0KCkucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkobmV3IEpheGJCZWFuKCJmb28iKSwgImFwcGxpY2F0aW9uL3htbDtjaGFyc2V0PVVURi04IiksIEpheGJCZWFuLmNsYXNzKS52YWx1ZSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY3IuaW52b2tlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBtci5pbnZva2VkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHVtci5pbnZva2VkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG1yQXBwLmludm9rZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgdW1yQXBwLmludm9rZWQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBAUHJvZHVjZXMoInRleHQveG1sIikKKyAgICBASWdub3JlKCJUaGlzIGNsYXNzIGlzIG5vdCBhIHRlc3QgY2xhc3MgJiBtdXN0IGJlIGlnbm9yZWQgYnkgdGhlIEVuY2xvc2VkIHRlc3QgcnVubmVyLiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQVhCQ29udGV4dFJlc29sdmVyVGV4dCBleHRlbmRzIEpBWEJDb250ZXh0UmVzb2x2ZXIgeworICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIEBQcm9kdWNlcygidGV4dC94bWwiKQorICAgIEBJZ25vcmUoIlRoaXMgY2xhc3MgaXMgbm90IGEgdGVzdCBjbGFzcyAmIG11c3QgYmUgaWdub3JlZCBieSB0aGUgRW5jbG9zZWQgdGVzdCBydW5uZXIuIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1hcnNoYWxsZXJSZXNvbHZlclRleHQgZXh0ZW5kcyBNYXJzaGFsbGVyUmVzb2x2ZXIgeworICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIEBQcm9kdWNlcygidGV4dC94bWwiKQorICAgIEBJZ25vcmUoIlRoaXMgY2xhc3MgaXMgbm90IGEgdGVzdCBjbGFzcyAmIG11c3QgYmUgaWdub3JlZCBieSB0aGUgRW5jbG9zZWQgdGVzdCBydW5uZXIuIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFVubWFyc2hhbGxlclJlc29sdmVyVGV4dCBleHRlbmRzIFVubWFyc2hhbGxlclJlc29sdmVyIHsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgQENvbnN1bWVzKCJ0ZXh0L3htbCIpCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3htbCIpCisgICAgQElnbm9yZSgiVGhpcyBjbGFzcyBpcyBub3QgYSB0ZXN0IGNsYXNzICYgbXVzdCBiZSBpZ25vcmVkIGJ5IHRoZSBFbmNsb3NlZCB0ZXN0IHJ1bm5lci4iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSmF4YkJlYW5SZXNvdXJjZVRleHQgZXh0ZW5kcyBKYXhiQmVhblJlc291cmNlIHsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpBWEJDb250ZXh0VGV4dFRlc3QgZXh0ZW5kcyBBYnN0cmFjdFR5cGVUZXN0ZXIgeworCisgICAgICAgIHByaXZhdGUgSkFYQkNvbnRleHRSZXNvbHZlciBjcjsKKyAgICAgICAgcHJpdmF0ZSBKQVhCQ29udGV4dFJlc29sdmVyVGV4dCBjclRleHQ7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgICAgICBjciA9IG5ldyBKQVhCQ29udGV4dFJlc29sdmVyKCk7CisgICAgICAgICAgICBjclRleHQgPSBuZXcgSkFYQkNvbnRleHRSZXNvbHZlclRleHQoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoSmF4YkJlYW5SZXNvdXJjZVRleHQuY2xhc3MpLnJlZ2lzdGVySW5zdGFuY2VzKGNyLCBjclRleHQpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdEpBWEJDb250ZXh0VGV4dCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCB0YXJnZXQoKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG5ldyBKYXhiQmVhbigiZm9vIiksICJ0ZXh0L3htbCIpLCBKYXhiQmVhbi5jbGFzcykudmFsdWUpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGNyLmludm9rZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgY3JUZXh0Lmludm9rZWQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFVubWFyc2hhbGxlclRleHRUZXN0IGV4dGVuZHMgQWJzdHJhY3RUeXBlVGVzdGVyIHsKKworICAgICAgICBwcml2YXRlIEpBWEJDb250ZXh0UmVzb2x2ZXIgY3I7CisgICAgICAgIHByaXZhdGUgTWFyc2hhbGxlclJlc29sdmVyIG1yOworICAgICAgICBwcml2YXRlIFVubWFyc2hhbGxlclJlc29sdmVyIHVtcjsKKyAgICAgICAgcHJpdmF0ZSBNYXJzaGFsbGVyUmVzb2x2ZXJUZXh0IG1yVGV4dDsKKyAgICAgICAgcHJpdmF0ZSBVbm1hcnNoYWxsZXJSZXNvbHZlclRleHQgdW1yVGV4dDsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIGNyID0gbmV3IEpBWEJDb250ZXh0UmVzb2x2ZXIoKTsKKyAgICAgICAgICAgIG1yID0gbmV3IE1hcnNoYWxsZXJSZXNvbHZlcigpOworICAgICAgICAgICAgdW1yID0gbmV3IFVubWFyc2hhbGxlclJlc29sdmVyKCk7CisgICAgICAgICAgICBtclRleHQgPSBuZXcgTWFyc2hhbGxlclJlc29sdmVyVGV4dCgpOworICAgICAgICAgICAgdW1yVGV4dCA9IG5ldyBVbm1hcnNoYWxsZXJSZXNvbHZlclRleHQoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoSmF4YkJlYW5SZXNvdXJjZVRleHQuY2xhc3MpLnJlZ2lzdGVySW5zdGFuY2VzKGNyLCBtciwgdW1yLCBtclRleHQsIHVtclRleHQpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdFVubWFyc2hhbGxlclRleHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwgdGFyZ2V0KCkucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShuZXcgSmF4YkJlYW4oImZvbyIpLCAidGV4dC94bWwiKSwgSmF4YkJlYW4uY2xhc3MpLnZhbHVlKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBjci5pbnZva2VkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1yLmludm9rZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdW1yLmludm9rZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbXJUZXh0Lmludm9rZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdW1yVGV4dC5pbnZva2VkKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgQFByb2R1Y2VzKCJ0ZXh0L2Zvbyt4bWwiKQorICAgIEBJZ25vcmUoIlRoaXMgY2xhc3MgaXMgbm90IGEgdGVzdCBjbGFzcyAmIG11c3QgYmUgaWdub3JlZCBieSB0aGUgRW5jbG9zZWQgdGVzdCBydW5uZXIuIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1hcnNoYWxsZXJSZXNvbHZlckZvbyBleHRlbmRzIE1hcnNoYWxsZXJSZXNvbHZlciB7CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgQFByb2R1Y2VzKCJ0ZXh0L2Zvbyt4bWwiKQorICAgIEBJZ25vcmUoIlRoaXMgY2xhc3MgaXMgbm90IGEgdGVzdCBjbGFzcyAmIG11c3QgYmUgaWdub3JlZCBieSB0aGUgRW5jbG9zZWQgdGVzdCBydW5uZXIuIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFVubWFyc2hhbGxlclJlc29sdmVyRm9vIGV4dGVuZHMgVW5tYXJzaGFsbGVyUmVzb2x2ZXIgeworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBAQ29uc3VtZXMoInRleHQvZm9vK3htbCIpCisgICAgQFByb2R1Y2VzKCJ0ZXh0L2Zvbyt4bWwiKQorICAgIEBJZ25vcmUoIlRoaXMgY2xhc3MgaXMgbm90IGEgdGVzdCBjbGFzcyAmIG11c3QgYmUgaWdub3JlZCBieSB0aGUgRW5jbG9zZWQgdGVzdCBydW5uZXIuIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpheGJCZWFuUmVzb3VyY2VGb28gZXh0ZW5kcyBKYXhiQmVhblJlc291cmNlIHsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFVubWFyc2hhbGxlckZvb1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdFR5cGVUZXN0ZXIgeworCisgICAgICAgIHByaXZhdGUgSkFYQkNvbnRleHRSZXNvbHZlciBjcjsKKyAgICAgICAgcHJpdmF0ZSBNYXJzaGFsbGVyUmVzb2x2ZXIgbXI7CisgICAgICAgIHByaXZhdGUgVW5tYXJzaGFsbGVyUmVzb2x2ZXIgdW1yOworICAgICAgICBwcml2YXRlIE1hcnNoYWxsZXJSZXNvbHZlckZvbyBtckZvbzsKKyAgICAgICAgcHJpdmF0ZSBVbm1hcnNoYWxsZXJSZXNvbHZlckZvbyB1bXJGb287CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgICAgICBjciA9IG5ldyBKQVhCQ29udGV4dFJlc29sdmVyKCk7CisgICAgICAgICAgICBtciA9IG5ldyBNYXJzaGFsbGVyUmVzb2x2ZXIoKTsKKyAgICAgICAgICAgIHVtciA9IG5ldyBVbm1hcnNoYWxsZXJSZXNvbHZlcigpOworICAgICAgICAgICAgbXJGb28gPSBuZXcgTWFyc2hhbGxlclJlc29sdmVyRm9vKCk7CisgICAgICAgICAgICB1bXJGb28gPSBuZXcgVW5tYXJzaGFsbGVyUmVzb2x2ZXJGb28oKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoSmF4YkJlYW5SZXNvdXJjZUZvby5jbGFzcykucmVnaXN0ZXJJbnN0YW5jZXMoY3IsIG1yLCB1bXIsIG1yRm9vLCB1bXJGb28pOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdFVubWFyc2hhbGxlckZvbygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLAorICAgICAgICAgICAgICAgICAgICB0YXJnZXQoKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG5ldyBKYXhiQmVhbigiZm9vIiksICJ0ZXh0L2Zvbyt4bWwiKSwgSmF4YkJlYW4uY2xhc3MpLnZhbHVlKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBjci5pbnZva2VkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1yLmludm9rZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdW1yLmludm9rZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbXJGb28uaW52b2tlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCB1bXJGb28uaW52b2tlZCgpKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCB0YXJnZXQoKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eShuZXcgSmF4YkJlYW4oImZvbyIpLCAidGV4dC9mb28reG1sO2NoYXJzZXQ9VVRGLTgiKSwgSmF4YkJlYW4uY2xhc3MpLnZhbHVlKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBjci5pbnZva2VkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1yLmludm9rZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgdW1yLmludm9rZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbXJGb28uaW52b2tlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCB1bXJGb28uaW52b2tlZCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBASWdub3JlKCJUaGlzIGNsYXNzIGlzIG5vdCBhIHRlc3QgY2xhc3MgJiBtdXN0IGJlIGlnbm9yZWQgYnkgdGhlIEVuY2xvc2VkIHRlc3QgcnVubmVyLiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKYXhiQmVhblJlc291cmNlQWxsIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL2Zvbyt4bWwiKQorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Zvbyt4bWwiKQorICAgICAgICBwdWJsaWMgSmF4YkJlYW4gZ2V0KEpheGJCZWFuIGIpIHsKKyAgICAgICAgICAgIHJldHVybiBiOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi94bWwiKQorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3htbCIpCisgICAgICAgIHB1YmxpYyBKYXhiQmVhbiBnZXRBcHAoSmF4YkJlYW4gYikgeworICAgICAgICAgICAgcmV0dXJuIGI7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAQ29uc3VtZXMoInRleHQveG1sIikKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3htbCIpCisgICAgICAgIHB1YmxpYyBKYXhiQmVhbiBnZXRUZXh0KEpheGJCZWFuIGIpIHsKKyAgICAgICAgICAgIHJldHVybiBiOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQVhCQ29udGV4dEFsbFRlc3QgZXh0ZW5kcyBBYnN0cmFjdFR5cGVUZXN0ZXIgeworCisgICAgICAgIHByaXZhdGUgSkFYQkNvbnRleHRSZXNvbHZlciBjcjsKKyAgICAgICAgcHJpdmF0ZSBKQVhCQ29udGV4dFJlc29sdmVyQXBwIGNyQXBwOworICAgICAgICBwcml2YXRlIEpBWEJDb250ZXh0UmVzb2x2ZXJUZXh0IGNyVGV4dDsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIGNyID0gbmV3IEpBWEJDb250ZXh0UmVzb2x2ZXIoKTsKKyAgICAgICAgICAgIGNyQXBwID0gbmV3IEpBWEJDb250ZXh0UmVzb2x2ZXJBcHAoKTsKKyAgICAgICAgICAgIGNyVGV4dCA9IG5ldyBKQVhCQ29udGV4dFJlc29sdmVyVGV4dCgpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhKYXhiQmVhblJlc291cmNlQWxsLmNsYXNzKS5yZWdpc3Rlckluc3RhbmNlcyhjciwgY3JBcHAsIGNyVGV4dCk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQkNvbnRleHRBbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0KCkucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShuZXcgSmF4YkJlYW4oImZvbyIpLCAiYXBwbGljYXRpb24vZm9vK3htbCIpLCBKYXhiQmVhbi5jbGFzcykudmFsdWUpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGNyLmludm9rZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY3JBcHAuaW52b2tlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBjclRleHQuaW52b2tlZCgpKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLAorICAgICAgICAgICAgICAgICAgICB0YXJnZXQoKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG5ldyBKYXhiQmVhbigiZm9vIiksICJhcHBsaWNhdGlvbi94bWwiKSwgSmF4YkJlYW4uY2xhc3MpLnZhbHVlKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBjci5pbnZva2VkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGNyQXBwLmludm9rZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY3JUZXh0Lmludm9rZWQoKSk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwgdGFyZ2V0KCkucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShuZXcgSmF4YkJlYW4oImZvbyIpLCAidGV4dC94bWwiKSwgSmF4YkJlYW4uY2xhc3MpLnZhbHVlKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBjci5pbnZva2VkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGNyQXBwLmludm9rZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgY3JUZXh0Lmludm9rZWQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFVubWFyc2hhbGxlckFsbFRlc3QgZXh0ZW5kcyBBYnN0cmFjdFR5cGVUZXN0ZXIgeworCisgICAgICAgIHByaXZhdGUgSkFYQkNvbnRleHRSZXNvbHZlciBjcjsKKyAgICAgICAgcHJpdmF0ZSBKQVhCQ29udGV4dFJlc29sdmVyQXBwIGNyQXBwOworICAgICAgICBwcml2YXRlIEpBWEJDb250ZXh0UmVzb2x2ZXJUZXh0IGNyVGV4dDsKKyAgICAgICAgcHJpdmF0ZSBNYXJzaGFsbGVyUmVzb2x2ZXIgbXI7CisgICAgICAgIHByaXZhdGUgVW5tYXJzaGFsbGVyUmVzb2x2ZXIgdW1yOworICAgICAgICBwcml2YXRlIE1hcnNoYWxsZXJSZXNvbHZlckFwcCBtckFwcDsKKyAgICAgICAgcHJpdmF0ZSBVbm1hcnNoYWxsZXJSZXNvbHZlckFwcCB1bXJBcHA7CisgICAgICAgIHByaXZhdGUgTWFyc2hhbGxlclJlc29sdmVyVGV4dCBtclRleHQ7CisgICAgICAgIHByaXZhdGUgVW5tYXJzaGFsbGVyUmVzb2x2ZXJUZXh0IHVtclRleHQ7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgICAgICBjciA9IG5ldyBKQVhCQ29udGV4dFJlc29sdmVyKCk7CisgICAgICAgICAgICBjckFwcCA9IG5ldyBKQVhCQ29udGV4dFJlc29sdmVyQXBwKCk7CisgICAgICAgICAgICBjclRleHQgPSBuZXcgSkFYQkNvbnRleHRSZXNvbHZlclRleHQoKTsKKyAgICAgICAgICAgIG1yID0gbmV3IE1hcnNoYWxsZXJSZXNvbHZlcigpOworICAgICAgICAgICAgdW1yID0gbmV3IFVubWFyc2hhbGxlclJlc29sdmVyKCk7CisgICAgICAgICAgICBtckFwcCA9IG5ldyBNYXJzaGFsbGVyUmVzb2x2ZXJBcHAoKTsKKyAgICAgICAgICAgIHVtckFwcCA9IG5ldyBVbm1hcnNoYWxsZXJSZXNvbHZlckFwcCgpOworICAgICAgICAgICAgbXJUZXh0ID0gbmV3IE1hcnNoYWxsZXJSZXNvbHZlclRleHQoKTsKKyAgICAgICAgICAgIHVtclRleHQgPSBuZXcgVW5tYXJzaGFsbGVyUmVzb2x2ZXJUZXh0KCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEpheGJCZWFuUmVzb3VyY2VBbGwuY2xhc3MpLnJlZ2lzdGVySW5zdGFuY2VzKGNyLCBjckFwcCwgY3JUZXh0LCBtciwgdW1yLAorICAgICAgICAgICAgICAgICAgICBtckFwcCwgdW1yQXBwLCBtclRleHQsIHVtclRleHQpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdFVubWFyc2hhbGxlckFsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLAorICAgICAgICAgICAgICAgICAgICB0YXJnZXQoKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG5ldyBKYXhiQmVhbigiZm9vIiksICJhcHBsaWNhdGlvbi9mb28reG1sIiksIEpheGJCZWFuLmNsYXNzKS52YWx1ZSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY3IuaW52b2tlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBjckFwcC5pbnZva2VkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGNyVGV4dC5pbnZva2VkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1yLmludm9rZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdW1yLmludm9rZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbXJBcHAuaW52b2tlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCB1bXJBcHAuaW52b2tlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBtclRleHQuaW52b2tlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCB1bXJUZXh0Lmludm9rZWQoKSk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0KCkucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShuZXcgSmF4YkJlYW4oImZvbyIpLCAiYXBwbGljYXRpb24veG1sIiksIEpheGJCZWFuLmNsYXNzKS52YWx1ZSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY3IuaW52b2tlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBjckFwcC5pbnZva2VkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGNyVGV4dC5pbnZva2VkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1yLmludm9rZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgdW1yLmludm9rZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbXJBcHAuaW52b2tlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCB1bXJBcHAuaW52b2tlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBtclRleHQuaW52b2tlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCB1bXJUZXh0Lmludm9rZWQoKSk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwgdGFyZ2V0KCkucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShuZXcgSmF4YkJlYW4oImZvbyIpLCAidGV4dC94bWwiKSwgSmF4YkJlYW4uY2xhc3MpLnZhbHVlKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBjci5pbnZva2VkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGNyQXBwLmludm9rZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY3JUZXh0Lmludm9rZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbXIuaW52b2tlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCB1bXIuaW52b2tlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBtckFwcC5pbnZva2VkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHVtckFwcC5pbnZva2VkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1yVGV4dC5pbnZva2VkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHVtclRleHQuaW52b2tlZCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBYbWxSb290RWxlbWVudAorICAgIEBJZ25vcmUoIlRoaXMgY2xhc3MgaXMgbm90IGEgdGVzdCBjbGFzcyAmIG11c3QgYmUgaWdub3JlZCBieSB0aGUgRW5jbG9zZWQgdGVzdCBydW5uZXIuIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE90aGVySmF4YkJlYW4geworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdmFsdWU7CisKKyAgICAgICAgcHVibGljIE90aGVySmF4YkJlYW4oKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT3RoZXJKYXhiQmVhbihTdHJpbmcgc3RyKSB7CisgICAgICAgICAgICB2YWx1ZSA9IHN0cjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICAgICAgcmV0dXJuIG8gaW5zdGFuY2VvZiBKYXhiQmVhbiAmJiAoKEpheGJCZWFuKSBvKS52YWx1ZS5lcXVhbHModmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiSkFYQkNsYXNzOiAiICsgdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgQElnbm9yZSgiVGhpcyBjbGFzcyBpcyBub3QgYSB0ZXN0IGNsYXNzICYgbXVzdCBiZSBpZ25vcmVkIGJ5IHRoZSBFbmNsb3NlZCB0ZXN0IHJ1bm5lci4iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSmF4YkJlYW5SZXNvdXJjZUFsbE90aGVySmF4YkJlYW4geworCisgICAgICAgIEBQT1NUCisgICAgICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vZm9vK3htbCIpCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZm9vK3htbCIpCisgICAgICAgIHB1YmxpYyBPdGhlckpheGJCZWFuIGdldChPdGhlckpheGJCZWFuIGIpIHsKKyAgICAgICAgICAgIHJldHVybiBiOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi94bWwiKQorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3htbCIpCisgICAgICAgIHB1YmxpYyBPdGhlckpheGJCZWFuIGdldEFwcChPdGhlckpheGJCZWFuIGIpIHsKKyAgICAgICAgICAgIHJldHVybiBiOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQENvbnN1bWVzKCJ0ZXh0L3htbCIpCisgICAgICAgIEBQcm9kdWNlcygidGV4dC94bWwiKQorICAgICAgICBwdWJsaWMgT3RoZXJKYXhiQmVhbiBnZXRUZXh0KE90aGVySmF4YkJlYW4gYikgeworICAgICAgICAgICAgcmV0dXJuIGI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpBWEJDb250ZXh0QWxsV2l0aE90aGVySmF4YkJlYW5UZXN0IGV4dGVuZHMgQWJzdHJhY3RUeXBlVGVzdGVyIHsKKworICAgICAgICBwcml2YXRlIEpBWEJDb250ZXh0UmVzb2x2ZXIgY3I7CisgICAgICAgIHByaXZhdGUgSkFYQkNvbnRleHRSZXNvbHZlckFwcCBjckFwcDsKKyAgICAgICAgcHJpdmF0ZSBKQVhCQ29udGV4dFJlc29sdmVyVGV4dCBjclRleHQ7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgICAgICBjciA9IG5ldyBKQVhCQ29udGV4dFJlc29sdmVyKCk7CisgICAgICAgICAgICBjckFwcCA9IG5ldyBKQVhCQ29udGV4dFJlc29sdmVyQXBwKCk7CisgICAgICAgICAgICBjclRleHQgPSBuZXcgSkFYQkNvbnRleHRSZXNvbHZlclRleHQoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoSmF4YkJlYW5SZXNvdXJjZUFsbE90aGVySmF4YkJlYW4uY2xhc3MpLnJlZ2lzdGVySW5zdGFuY2VzKGNyLCBjckFwcCwgY3JUZXh0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCQ29udGV4dEFsbFdpdGhPdGhlckpheGJCZWFuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsIHRhcmdldCgpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KG5ldyBPdGhlckpheGJCZWFuKCJmb28iKSwgImFwcGxpY2F0aW9uL2Zvbyt4bWwiKSwgT3RoZXJKYXhiQmVhbi5jbGFzcykudmFsdWUpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGNyLmludm9rZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY3JBcHAuaW52b2tlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBjclRleHQuaW52b2tlZCgpKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCB0YXJnZXQoKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eShuZXcgT3RoZXJKYXhiQmVhbigiZm9vIiksICJhcHBsaWNhdGlvbi94bWwiKSwgT3RoZXJKYXhiQmVhbi5jbGFzcykudmFsdWUpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGNyLmludm9rZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY3JBcHAuaW52b2tlZCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBjclRleHQuaW52b2tlZCgpKTsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLAorICAgICAgICAgICAgICAgICAgICB0YXJnZXQoKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG5ldyBPdGhlckpheGJCZWFuKCJmb28iKSwgInRleHQveG1sIiksIE90aGVySmF4YkJlYW4uY2xhc3MpLnZhbHVlKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBjci5pbnZva2VkKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIGNyQXBwLmludm9rZWQoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY3JUZXh0Lmludm9rZWQoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9KYXhiQmVhbi5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvSmF4YkJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWNkMmRmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvSmF4YkJlYW4uamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHk7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCisvKioKKyAqIEBhdXRob3IgRG91ZyBLb2hsZXJ0CisgKi8KK0BYbWxSb290RWxlbWVudChuYW1lID0gImpheGJCZWFuIikKK3B1YmxpYyBjbGFzcyBKYXhiQmVhbiB7CisKKyAgICBwdWJsaWMgU3RyaW5nIHZhbHVlOworCisgICAgcHVibGljIEpheGJCZWFuKCkgeworICAgIH0KKworICAgIHB1YmxpYyBKYXhiQmVhbihTdHJpbmcgc3RyKSB7CisgICAgICAgIHZhbHVlID0gc3RyOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgSmF4YkJlYW4pKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICgoSmF4YkJlYW4pIG8pLnZhbHVlLmVxdWFscyh2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJKQVhCQ2xhc3M6ICIgKyB2YWx1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9KYXhiQmVhblR5cGUuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0pheGJCZWFuVHlwZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYWI0ODAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9KYXhiQmVhblR5cGUuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHk7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7CisKKy8qKgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqLworQFhtbFR5cGUobmFtZSA9ICJkYWRhIikKK3B1YmxpYyBjbGFzcyBKYXhiQmVhblR5cGUgeworCisgICAgcHVibGljIFN0cmluZyB2YWx1ZTsKKworICAgIHB1YmxpYyBKYXhiQmVhblR5cGUoKSB7CisgICAgfQorCisgICAgcHVibGljIEpheGJCZWFuVHlwZShTdHJpbmcgc3RyKSB7CisgICAgICAgIHZhbHVlID0gc3RyOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgeworICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgSmF4YkJlYW5UeXBlKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoKEpheGJCZWFuVHlwZSkgbykudmFsdWUuZXF1YWxzKHZhbHVlKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIkpheGJCZWFuVHlwZTogIiArIHZhbHVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0pzb25Nb3h5VGVzdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvSnNvbk1veHlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVhMDNhMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0pzb25Nb3h5VGVzdC5qYXZhCkBAIC0wLDAgKzEsNDU1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHk7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlF1ZXVlOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlN0YWNrOworaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkdlbmVyaWNFbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Db250ZXh0UmVzb2x2ZXI7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb3h5Lmpzb24uTW94eUpzb25Db25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW94eS5qc29uLk1veHlKc29uRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnV0aWwucnVubmVyLkNvbmN1cnJlbnRSdW5uZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJ1bldpdGgoQ29uY3VycmVudFJ1bm5lci5jbGFzcykKK3B1YmxpYyBjbGFzcyBKc29uTW94eVRlc3QgZXh0ZW5kcyBBYnN0cmFjdFR5cGVUZXN0ZXIgeworCisgICAgQFBhdGgoIkpBWEJFbGVtZW50TGlzdFJlc291cmNlIikKKyAgICBAUHJvZHVjZXMoeyJhcHBsaWNhdGlvbi9qc29uIn0pCisgICAgQENvbnN1bWVzKHsiYXBwbGljYXRpb24vanNvbiJ9KQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSkFYQkVsZW1lbnRMaXN0UmVzb3VyY2UgZXh0ZW5kcyBBUmVzb3VyY2U8TGlzdDxKQVhCRWxlbWVudDxTdHJpbmc+Pj4geworICAgIH0KKworICAgIHByaXZhdGUgTGlzdDxKQVhCRWxlbWVudDxTdHJpbmc+PiBnZXRKQVhCRWxlbWVudExpc3QoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KGdldEpBWEJFbGVtZW50QXJyYXkoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBNb3h5SnNvbkNvbmZpZ3VyYXRpb25Db250ZXh0UmVzb2x2ZXIgaW1wbGVtZW50cyBDb250ZXh0UmVzb2x2ZXI8TW94eUpzb25Db25maWc+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE1veHlKc29uQ29uZmlnIGdldENvbnRleHQoZmluYWwgQ2xhc3M8Pz4gdHlwZSkgeworICAgICAgICAgICAgZmluYWwgTW94eUpzb25Db25maWcgY29uZmlndXJhdGlvbiA9IG5ldyBNb3h5SnNvbkNvbmZpZygpOworICAgICAgICAgICAgY29uZmlndXJhdGlvbi5zZXRJbmNsdWRlUm9vdCh0cnVlKTsKKyAgICAgICAgICAgIHJldHVybiBjb25maWd1cmF0aW9uOworICAgICAgICB9CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIHZvaWQgX3Rlc3RMaXN0T3JBcnJheShmaW5hbCBib29sZWFuIGlzTGlzdCwgZmluYWwgTWVkaWFUeXBlIG10KSB7CisgICAgICAgIGZpbmFsIE9iamVjdCBpbiA9IGlzTGlzdCA/IGdldEpBWEJFbGVtZW50TGlzdCgpIDogZ2V0SkFYQkVsZW1lbnRBcnJheSgpOworICAgICAgICBmaW5hbCBHZW5lcmljVHlwZSBndCA9IGlzTGlzdCA/IG5ldyBHZW5lcmljVHlwZTxMaXN0PEpBWEJFbGVtZW50PFN0cmluZz4+PigpIHsKKyAgICAgICAgfSA6IG5ldyBHZW5lcmljVHlwZTxKQVhCRWxlbWVudDxTdHJpbmc+W10+KCkgeworICAgICAgICB9OworCisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoaXNMaXN0ID8gIkpBWEJFbGVtZW50TGlzdFJlc291cmNlIiA6ICJKQVhCRWxlbWVudEFycmF5UmVzb3VyY2UiKTsKKyAgICAgICAgZmluYWwgT2JqZWN0IG91dCA9IHRhcmdldC5yZXF1ZXN0KG10KS5wb3N0KEVudGl0eS5lbnRpdHkobmV3IEdlbmVyaWNFbnRpdHkoaW4sIGd0LmdldFR5cGUoKSksIG10KSwgZ3QpOworCisgICAgICAgIGZpbmFsIExpc3Q8SkFYQkVsZW1lbnQ8U3RyaW5nPj4gaW5MaXN0ID0KKyAgICAgICAgICAgICAgICBpc0xpc3QgPyAoKExpc3Q8SkFYQkVsZW1lbnQ8U3RyaW5nPj4pIGluKSA6IEFycmF5cy5hc0xpc3QoKEpBWEJFbGVtZW50PFN0cmluZz5bXSkgaW4pOworICAgICAgICBmaW5hbCBMaXN0PEpBWEJFbGVtZW50PFN0cmluZz4+IG91dExpc3QgPSBpc0xpc3QgPyAoKExpc3Q8SkFYQkVsZW1lbnQ8U3RyaW5nPj4pIG91dCkgOiBBcnJheXMKKyAgICAgICAgICAgICAgICAuYXNMaXN0KChKQVhCRWxlbWVudDxTdHJpbmc+W10pIG91dCk7CisgICAgICAgIGFzc2VydEVxdWFscygiTGVuZ3RocyBkaWZmZXIiLCBpbkxpc3Quc2l6ZSgpLCBvdXRMaXN0LnNpemUoKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5MaXN0LnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIk5hbWVzIG9mIGVsZW1lbnRzIGF0IGluZGV4ICIgKyBpICsgIiBkaWZmZXIiLCBpbkxpc3QuZ2V0KGkpLmdldE5hbWUoKSwgb3V0TGlzdC5nZXQoaSkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVmFsdWVzIG9mIGVsZW1lbnRzIGF0IGluZGV4ICIgKyBpICsgIiBkaWZmZXIiLCBpbkxpc3QuZ2V0KGkpLmdldFZhbHVlKCksIG91dExpc3QuZ2V0KGkpLmdldFZhbHVlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQkVsZW1lbnRMaXN0SlNPTlJlcHJlc2VudGF0aW9uKCkgeworICAgICAgICBfdGVzdExpc3RPckFycmF5KHRydWUsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUpOworICAgIH0KKworICAgIEBQYXRoKCJKQVhCRWxlbWVudEFycmF5UmVzb3VyY2UiKQorICAgIEBQcm9kdWNlcyh7ImFwcGxpY2F0aW9uL2pzb24ifSkKKyAgICBAQ29uc3VtZXMoeyJhcHBsaWNhdGlvbi9qc29uIn0pCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQVhCRWxlbWVudEFycmF5UmVzb3VyY2UgZXh0ZW5kcyBBUmVzb3VyY2U8SkFYQkVsZW1lbnQ8U3RyaW5nPltdPiB7CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHJpdmF0ZSBKQVhCRWxlbWVudDxTdHJpbmc+W10gZ2V0SkFYQkVsZW1lbnRBcnJheSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKQVhCRWxlbWVudFtdIHsKKyAgICAgICAgICAgICAgICBuZXcgSkFYQkVsZW1lbnQoUU5hbWUudmFsdWVPZigiZWxlbWVudDEiKSwgU3RyaW5nLmNsYXNzLCAiYWhvaiIpLAorICAgICAgICAgICAgICAgIG5ldyBKQVhCRWxlbWVudChRTmFtZS52YWx1ZU9mKCJlbGVtZW50MiIpLCBTdHJpbmcuY2xhc3MsICJuYXpkYXIiKQorICAgICAgICB9OworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpBWEJFbGVtZW50QXJyYXlKU09OUmVwcmVzZW50YXRpb24oKSB7CisgICAgICAgIF90ZXN0TGlzdE9yQXJyYXkoZmFsc2UsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5EVU1QX0VOVElUWSk7CisKKyAgICAgICAgcmV0dXJuICgoUmVzb3VyY2VDb25maWcpIHN1cGVyLmNvbmZpZ3VyZSgpKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihNb3h5SnNvbkZlYXR1cmUuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKE1veHlKc29uQ29uZmlndXJhdGlvbkNvbnRleHRSZXNvbHZlci5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KGZpbmFsIENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgc3VwZXIuY29uZmlndXJlQ2xpZW50KGNvbmZpZyk7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihNb3h5SnNvbkZlYXR1cmUuY2xhc3MpOworICAgICAgICBjb25maWcucmVnaXN0ZXIoTW94eUpzb25Db25maWd1cmF0aW9uQ29udGV4dFJlc29sdmVyLmNsYXNzKTsKKyAgICB9CisKKyAgICBAUGF0aCgiSkFYQkVsZW1lbnRCZWFuSlNPTlJlc291cmNlIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQVhCRWxlbWVudEJlYW5KU09OUmVzb3VyY2UgZXh0ZW5kcyBBUmVzb3VyY2U8SkFYQkVsZW1lbnQ8U3RyaW5nPj4geworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpBWEJFbGVtZW50QmVhbkpTT05SZXByZXNlbnRhdGlvbigpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiSkFYQkVsZW1lbnRCZWFuSlNPTlJlc291cmNlIik7CisKKyAgICAgICAgZmluYWwgR2VuZXJpY1R5cGU8SkFYQkVsZW1lbnQ8U3RyaW5nPj4gZ2VuZXJpY1R5cGUgPSBuZXcgR2VuZXJpY1R5cGU8SkFYQkVsZW1lbnQ8U3RyaW5nPj4oKSB7CisgICAgICAgIH07CisgICAgICAgIGZpbmFsIEdlbmVyaWNFbnRpdHk8SkFYQkVsZW1lbnQ8U3RyaW5nPj4gamF4YkVsZW1lbnRHZW5lcmljRW50aXR5ID0gbmV3IEdlbmVyaWNFbnRpdHk8PigKKyAgICAgICAgICAgICAgICBuZXcgSkFYQkVsZW1lbnQ8PihuZXcgUU5hbWUoInRlc3QiKSwgU3RyaW5nLmNsYXNzLCAiQ09OVEVOVCIpLCBnZW5lcmljVHlwZS5nZXRUeXBlKCkpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJpYiA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdCgKKyAgICAgICAgICAgICAgICBFbnRpdHkuZW50aXR5KGpheGJFbGVtZW50R2VuZXJpY0VudGl0eSwgImFwcGxpY2F0aW9uL2pzb24iKSk7CisKKyAgICAgICAgLy8gVE9ETzogdGhlIGZvbGxvd2luZyB3b3VsZCBub3QgYmUgbmVlZGVkIGlmIGkga25ldyBob3cgdG8gd29ya2Fyb3VuZCBKQVhCRWxlbWVudDxTdHJpbmc+LmNsYXNzIGxpdGVyYWwKKyAgICAgICAgZmluYWwgYnl0ZVtdIGluQnl0ZXMgPSBnZXRSZXF1ZXN0RW50aXR5KCk7CisgICAgICAgIGZpbmFsIGJ5dGVbXSBvdXRCeXRlcyA9IGdldEVudGl0eUFzQnl0ZUFycmF5KHJpYik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBTdHJpbmcob3V0Qnl0ZXMpLCBpbkJ5dGVzLmxlbmd0aCwgb3V0Qnl0ZXMubGVuZ3RoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbkJ5dGVzLmxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoaW5CeXRlc1tpXSAhPSBvdXRCeXRlc1tpXSkgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiSW5kZXg6ICIgKyBpLCBpbkJ5dGVzW2ldLCBvdXRCeXRlc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiSmF4YkJlYW5SZXNvdXJjZUpTT04iKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9qc29uIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpheGJCZWFuUmVzb3VyY2VKU09OIGV4dGVuZHMgQVJlc291cmNlPEpheGJCZWFuPiB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SmF4YkJlYW5SZXByZXNlbnRhdGlvbkpTT04oKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoIkpheGJCZWFuUmVzb3VyY2VKU09OIik7CisgICAgICAgIGZpbmFsIEpheGJCZWFuIGluID0gbmV3IEpheGJCZWFuKCJDT05URU5UIik7CisgICAgICAgIGZpbmFsIEpheGJCZWFuIG91dCA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KGluLCAiYXBwbGljYXRpb24vanNvbiIpLCBKYXhiQmVhbi5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhpbi52YWx1ZSwgb3V0LnZhbHVlKTsKKyAgICB9CisKKyAgICBAUGF0aCgiSmF4YkJlYW5SZXNvdXJjZUpTT05NZWRpYVR5cGUiKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZm9vK2pzb24iKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vZm9vK2pzb24iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSmF4YkJlYW5SZXNvdXJjZUpTT05NZWRpYVR5cGUgZXh0ZW5kcyBBUmVzb3VyY2U8SmF4YkJlYW4+IHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKYXhiQmVhblJlcHJlc2VudGF0aW9uSlNPTk1lZGlhVHlwZSgpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiSmF4YkJlYW5SZXNvdXJjZUpTT05NZWRpYVR5cGUiKTsKKyAgICAgICAgZmluYWwgSmF4YkJlYW4gaW4gPSBuZXcgSmF4YkJlYW4oIkNPTlRFTlQiKTsKKyAgICAgICAgZmluYWwgSmF4YkJlYW4gb3V0ID0gdGFyZ2V0LnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoaW4sICJhcHBsaWNhdGlvbi9mb28ranNvbiIpLCBKYXhiQmVhbi5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhpbi52YWx1ZSwgb3V0LnZhbHVlKTsKKyAgICB9CisKKyAgICBAUGF0aCgiSkFYQkVsZW1lbnRCZWFuUmVzb3VyY2VKU09OIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQVhCRWxlbWVudEJlYW5SZXNvdXJjZUpTT04gZXh0ZW5kcyBBUmVzb3VyY2U8SkFYQkVsZW1lbnQ8SmF4YkJlYW5UeXBlPj4geworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpBWEJFbGVtZW50QmVhblJlcHJlc2VudGF0aW9uSlNPTigpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiSkFYQkVsZW1lbnRCZWFuUmVzb3VyY2VKU09OIik7CisgICAgICAgIGZpbmFsIEpheGJCZWFuIGluID0gbmV3IEpheGJCZWFuKCJDT05URU5UIik7CisgICAgICAgIGZpbmFsIEpheGJCZWFuIG91dCA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KGluLCAiYXBwbGljYXRpb24vanNvbiIpLCBKYXhiQmVhbi5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhpbi52YWx1ZSwgb3V0LnZhbHVlKTsKKyAgICB9CisKKyAgICBAUGF0aCgiSkFYQkVsZW1lbnRCZWFuUmVzb3VyY2VKU09OTWVkaWFUeXBlIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Zvbytqc29uIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL2Zvbytqc29uIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpBWEJFbGVtZW50QmVhblJlc291cmNlSlNPTk1lZGlhVHlwZSBleHRlbmRzIEFSZXNvdXJjZTxKQVhCRWxlbWVudDxKYXhiQmVhblR5cGU+PiB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQkVsZW1lbnRCZWFuUmVwcmVzZW50YXRpb25KU09OTWVkaWFUeXBlKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJKQVhCRWxlbWVudEJlYW5SZXNvdXJjZUpTT05NZWRpYVR5cGUiKTsKKyAgICAgICAgZmluYWwgSmF4YkJlYW4gaW4gPSBuZXcgSmF4YkJlYW4oIkNPTlRFTlQiKTsKKyAgICAgICAgZmluYWwgSmF4YkJlYW4gb3V0ID0gdGFyZ2V0LnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoaW4sICJhcHBsaWNhdGlvbi9mb28ranNvbiIpLCBKYXhiQmVhbi5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhpbi52YWx1ZSwgb3V0LnZhbHVlKTsKKyAgICB9CisKKyAgICBAUGF0aCgiSkFYQlR5cGVSZXNvdXJjZUpTT04iKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9qc29uIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpBWEJUeXBlUmVzb3VyY2VKU09OIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgSmF4YkJlYW4gcG9zdChmaW5hbCBKYXhiQmVhblR5cGUgdCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBKYXhiQmVhbih0LnZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpBWEJUeXBlUmVwcmVzZW50YXRpb25KU09OKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJKQVhCVHlwZVJlc291cmNlSlNPTiIpOworICAgICAgICBmaW5hbCBKYXhiQmVhbiBpbiA9IG5ldyBKYXhiQmVhbigiQ09OVEVOVCIpOworICAgICAgICBmaW5hbCBKYXhiQmVhblR5cGUgb3V0ID0gdGFyZ2V0LnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoaW4sICJhcHBsaWNhdGlvbi9qc29uIiksIEpheGJCZWFuVHlwZS5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhpbi52YWx1ZSwgb3V0LnZhbHVlKTsKKyAgICB9CisKKyAgICBAUGF0aCgiSkFYQlR5cGVSZXNvdXJjZUpTT05NZWRpYVR5cGUiKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZm9vK2pzb24iKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vZm9vK2pzb24iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSkFYQlR5cGVSZXNvdXJjZUpTT05NZWRpYVR5cGUgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBKYXhiQmVhbiBwb3N0KGZpbmFsIEpheGJCZWFuVHlwZSB0KSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEpheGJCZWFuKHQudmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQlR5cGVSZXByZXNlbnRhdGlvbkpTT05NZWRpYVR5cGUoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoIkpBWEJUeXBlUmVzb3VyY2VKU09OTWVkaWFUeXBlIik7CisgICAgICAgIGZpbmFsIEpheGJCZWFuIGluID0gbmV3IEpheGJCZWFuKCJDT05URU5UIik7CisgICAgICAgIGZpbmFsIEpheGJCZWFuVHlwZSBvdXQgPSB0YXJnZXQucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShpbiwgImFwcGxpY2F0aW9uL2Zvbytqc29uIiksIEpheGJCZWFuVHlwZS5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhpbi52YWx1ZSwgb3V0LnZhbHVlKTsKKyAgICB9CisKKyAgICBAUGF0aCgiSkFYQkxpc3RSZXNvdXJjZSIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi94bWwiKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24veG1sIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpBWEJMaXN0UmVzb3VyY2UgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBMaXN0PEpheGJCZWFuPiBwb3N0KGZpbmFsIExpc3Q8SmF4YkJlYW4+IGwpIHsKKyAgICAgICAgICAgIHJldHVybiBsOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoInNldCIpCisgICAgICAgIHB1YmxpYyBTZXQ8SmF4YkJlYW4+IHBvc3RTZXQoZmluYWwgU2V0PEpheGJCZWFuPiBsKSB7CisgICAgICAgICAgICByZXR1cm4gbDsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJxdWV1ZSIpCisgICAgICAgIHB1YmxpYyBRdWV1ZTxKYXhiQmVhbj4gcG9zdFF1ZXVlKGZpbmFsIFF1ZXVlPEpheGJCZWFuPiBsKSB7CisgICAgICAgICAgICByZXR1cm4gbDsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJzdGFjayIpCisgICAgICAgIHB1YmxpYyBTdGFjazxKYXhiQmVhbj4gcG9zdFN0YWNrKGZpbmFsIFN0YWNrPEpheGJCZWFuPiBsKSB7CisgICAgICAgICAgICByZXR1cm4gbDsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJjdXN0b20iKQorICAgICAgICBwdWJsaWMgTXlBcnJheUxpc3Q8SmF4YkJlYW4+IHBvc3RDdXN0b20oZmluYWwgTXlBcnJheUxpc3Q8SmF4YkJlYW4+IGwpIHsKKyAgICAgICAgICAgIHJldHVybiBsOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgQ29sbGVjdGlvbjxKYXhiQmVhbj4gZ2V0KCkgeworICAgICAgICAgICAgZmluYWwgQXJyYXlMaXN0PEpheGJCZWFuPiBsID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICBsLmFkZChuZXcgSmF4YkJlYW4oIm9uZSIpKTsKKyAgICAgICAgICAgIGwuYWRkKG5ldyBKYXhiQmVhbigidHdvIikpOworICAgICAgICAgICAgbC5hZGQobmV3IEpheGJCZWFuKCJ0aHJlZSIpKTsKKyAgICAgICAgICAgIHJldHVybiBsOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoInR5cGUiKQorICAgICAgICBwdWJsaWMgTGlzdDxKYXhiQmVhbj4gcG9zdFR5cGUoZmluYWwgQ29sbGVjdGlvbjxKYXhiQmVhblR5cGU+IGwpIHsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8SmF4YkJlYW4+IGJlYW5zID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICBmb3IgKGZpbmFsIEpheGJCZWFuVHlwZSB0IDogbCkgeworICAgICAgICAgICAgICAgIGJlYW5zLmFkZChuZXcgSmF4YkJlYW4odC52YWx1ZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJlYW5zOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIkpBWEJMaXN0UmVzb3VyY2VNZWRpYVR5cGUiKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZm9vK3htbCIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9mb28reG1sIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpBWEJMaXN0UmVzb3VyY2VNZWRpYVR5cGUgZXh0ZW5kcyBKQVhCTGlzdFJlc291cmNlIHsKKyAgICB9CisKKyAgICBAUGF0aCgiSkFYQkxpc3RSZXNvdXJjZUpTT04iKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9qc29uIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpBWEJMaXN0UmVzb3VyY2VKU09OIGV4dGVuZHMgSkFYQkxpc3RSZXNvdXJjZSB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQkxpc3RSZXByZXNlbnRhdGlvbkpTT05Db2xsZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoIkpBWEJMaXN0UmVzb3VyY2VKU09OIik7CisKKyAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxKYXhiQmVhbj4gYSA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KAorICAgICAgICAgICAgICAgIG5ldyBHZW5lcmljVHlwZTxDb2xsZWN0aW9uPEpheGJCZWFuPj4oKSB7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIENvbGxlY3Rpb248SmF4YkJlYW4+IGIgPSB0YXJnZXQucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShuZXcgR2VuZXJpY0VudGl0eTxDb2xsZWN0aW9uPEpheGJCZWFuPj4oYSkgeworICAgICAgICB9LCAiYXBwbGljYXRpb24vanNvbiIpLCBuZXcgR2VuZXJpY1R5cGU8Q29sbGVjdGlvbjxKYXhiQmVhbj4+KCkgeworICAgICAgICB9KTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoYSwgYik7CisKKyAgICAgICAgYiA9IHRhcmdldC5wYXRoKCJ0eXBlIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShuZXcgR2VuZXJpY0VudGl0eTxDb2xsZWN0aW9uPEpheGJCZWFuPj4oYSkgeworICAgICAgICB9LCAiYXBwbGljYXRpb24vanNvbiIpLCBuZXcgR2VuZXJpY1R5cGU8Q29sbGVjdGlvbjxKYXhiQmVhbj4+KCkgeworICAgICAgICB9KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGEsIGIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpBWEJMaXN0UmVwcmVzZW50YXRpb25KU09OTGlua2VkTGlzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJKQVhCTGlzdFJlc291cmNlSlNPTiIpOworCisgICAgICAgIENvbGxlY3Rpb248SmF4YkJlYW4+IGEgPSB0YXJnZXQucmVxdWVzdCgpLmdldCgKKyAgICAgICAgICAgICAgICBuZXcgR2VuZXJpY1R5cGU8Q29sbGVjdGlvbjxKYXhiQmVhbj4+KCkgeworICAgICAgICAgICAgICAgIH0pOworICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPEpheGJCZWFuPiBiOworCisgICAgICAgIGEgPSBuZXcgTGlua2VkTGlzdDw+KGEpOworICAgICAgICBiID0gdGFyZ2V0LnBhdGgoInF1ZXVlIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShuZXcgR2VuZXJpY0VudGl0eTxRdWV1ZTxKYXhiQmVhbj4+KChRdWV1ZTxKYXhiQmVhbj4pIGEpIHsKKyAgICAgICAgfSwgImFwcGxpY2F0aW9uL2pzb24iKSwgbmV3IEdlbmVyaWNUeXBlPFF1ZXVlPEpheGJCZWFuPj4oKSB7CisgICAgICAgIH0pOworICAgICAgICBhc3NlcnRFcXVhbHMoYSwgYik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQkxpc3RSZXByZXNlbnRhdGlvbkpTT05TZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiSkFYQkxpc3RSZXNvdXJjZUpTT04iKTsKKworICAgICAgICBDb2xsZWN0aW9uPEpheGJCZWFuPiBhID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoCisgICAgICAgICAgICAgICAgbmV3IEdlbmVyaWNUeXBlPENvbGxlY3Rpb248SmF4YkJlYW4+PigpIHsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxKYXhiQmVhbj4gYjsKKworICAgICAgICBhID0gbmV3IEhhc2hTZXQ8PihhKTsKKyAgICAgICAgYiA9IHRhcmdldC5wYXRoKCJzZXQiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG5ldyBHZW5lcmljRW50aXR5PFNldDxKYXhiQmVhbj4+KChTZXQ8SmF4YkJlYW4+KSBhKSB7CisgICAgICAgIH0sICJhcHBsaWNhdGlvbi9qc29uIiksIG5ldyBHZW5lcmljVHlwZTxTZXQ8SmF4YkJlYW4+PigpIHsKKyAgICAgICAgfSk7CisgICAgICAgIGZpbmFsIENvbXBhcmF0b3I8SmF4YkJlYW4+IGMgPSBuZXcgQ29tcGFyYXRvcjxKYXhiQmVhbj4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShmaW5hbCBKYXhiQmVhbiB0LCBmaW5hbCBKYXhiQmVhbiB0MSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0LnZhbHVlLmNvbXBhcmVUbyh0MS52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGZpbmFsIFRyZWVTZXQ8SmF4YkJlYW4+IHQxID0gbmV3IFRyZWVTZXQ8PihjKTsKKyAgICAgICAgZmluYWwgVHJlZVNldDxKYXhiQmVhbj4gdDIgPSBuZXcgVHJlZVNldDw+KGMpOworICAgICAgICB0MS5hZGRBbGwoYSk7CisgICAgICAgIHQyLmFkZEFsbChiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHQxLCB0Mik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQkxpc3RSZXByZXNlbnRhdGlvbkpTT05TdGFjaygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJKQVhCTGlzdFJlc291cmNlSlNPTiIpOworCisgICAgICAgIGZpbmFsIENvbGxlY3Rpb248SmF4YkJlYW4+IGEgPSB0YXJnZXQucmVxdWVzdCgpLmdldCgKKyAgICAgICAgICAgICAgICBuZXcgR2VuZXJpY1R5cGU8Q29sbGVjdGlvbjxKYXhiQmVhbj4+KCkgeworICAgICAgICAgICAgICAgIH0pOworICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPEpheGJCZWFuPiBiOworCisgICAgICAgIGZpbmFsIFN0YWNrPEpheGJCZWFuPiBzID0gbmV3IFN0YWNrPD4oKTsKKyAgICAgICAgcy5hZGRBbGwoYSk7CisgICAgICAgIGIgPSB0YXJnZXQucGF0aCgic3RhY2siKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG5ldyBHZW5lcmljRW50aXR5PFN0YWNrPEpheGJCZWFuPj4ocykgeworICAgICAgICB9LCAiYXBwbGljYXRpb24vanNvbiIpLCBuZXcgR2VuZXJpY1R5cGU8U3RhY2s8SmF4YkJlYW4+PigpIHsKKyAgICAgICAgfSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzLCBiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIEBJZ25vcmUoIlVudGlsIEpFUlNFWS0yODI1IGlzIGZpeGVkLiIpCisgICAgcHVibGljIHZvaWQgdGVzdEpBWEJMaXN0UmVwcmVzZW50YXRpb25KU09OQXJyYXlMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoIkpBWEJMaXN0UmVzb3VyY2VKU09OIik7CisKKyAgICAgICAgQ29sbGVjdGlvbjxKYXhiQmVhbj4gYSA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KG5ldyBHZW5lcmljVHlwZTxDb2xsZWN0aW9uPEpheGJCZWFuPj4oKSB7fSk7CisgICAgICAgIGZpbmFsIENvbGxlY3Rpb248SmF4YkJlYW4+IGI7CisKKyAgICAgICAgYSA9IG5ldyBNeUFycmF5TGlzdDw+KGEpOworICAgICAgICBiID0gdGFyZ2V0LnBhdGgoImN1c3RvbSIpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkobmV3IEdlbmVyaWNFbnRpdHk8TXlBcnJheUxpc3Q8SmF4YkJlYW4+PigoTXlBcnJheUxpc3Q8SmF4YkJlYW4+KSBhKSB7fSwgImFwcGxpY2F0aW9uL2pzb24iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBHZW5lcmljVHlwZTxNeUFycmF5TGlzdDxKYXhiQmVhbj4+KCkge30pOworICAgICAgICBhc3NlcnRFcXVhbHMoYSwgYik7CisgICAgfQorCisgICAgQFBhdGgoIkpBWEJMaXN0UmVzb3VyY2VKU09OTWVkaWFUeXBlIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Zvbytqc29uIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL2Zvbytqc29uIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpBWEJMaXN0UmVzb3VyY2VKU09OTWVkaWFUeXBlIGV4dGVuZHMgSkFYQkxpc3RSZXNvdXJjZSB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQkxpc3RSZXByZXNlbnRhdGlvbkpTT05NZWRpYVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiSkFYQkxpc3RSZXNvdXJjZUpTT05NZWRpYVR5cGUiKTsKKworICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPEpheGJCZWFuPiBhID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoCisgICAgICAgICAgICAgICAgbmV3IEdlbmVyaWNUeXBlPENvbGxlY3Rpb248SmF4YkJlYW4+PigpIHsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgQ29sbGVjdGlvbjxKYXhiQmVhbj4gYiA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG5ldyBHZW5lcmljRW50aXR5PENvbGxlY3Rpb248SmF4YkJlYW4+PihhKSB7CisgICAgICAgIH0sICJhcHBsaWNhdGlvbi9mb28ranNvbiIpLCBuZXcgR2VuZXJpY1R5cGU8Q29sbGVjdGlvbjxKYXhiQmVhbj4+KCkgeworICAgICAgICB9KTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoYSwgYik7CisKKyAgICAgICAgYiA9IHRhcmdldC5wYXRoKCJ0eXBlIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShuZXcgR2VuZXJpY0VudGl0eTxDb2xsZWN0aW9uPEpheGJCZWFuPj4oYSkgeworICAgICAgICB9LCAiYXBwbGljYXRpb24vZm9vK2pzb24iKSwgbmV3IEdlbmVyaWNUeXBlPENvbGxlY3Rpb248SmF4YkJlYW4+PigpIHsKKyAgICAgICAgfSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhLCBiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9NZWRpYVR5cGVTZWxlY3Rpb25UZXN0LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9NZWRpYVR5cGVTZWxlY3Rpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdmN2RmNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L01lZGlhVHlwZVNlbGVjdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDE4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5OworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRm9ybTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkSGFzaE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIE1lZGlhVHlwZVNlbGVjdGlvblRlc3QgZXh0ZW5kcyBBYnN0cmFjdFR5cGVUZXN0ZXIgeworICAgIEBQYXRoKCJmb3JtIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZvcm1SZXNvdXJjZSB7CisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBwb3N0KE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBkYXRhKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soZGF0YSwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0ZPUk1fVVJMRU5DT0RFRF9UWVBFKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoImZvbyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGb29SZXNvdXJjZSB7CisgICAgICAgIEBQT1NUCisgICAgICAgIEBDb25zdW1lcygiZm9vLyoiKQorICAgICAgICBAUHJvZHVjZXMoImZvby8qIikKKyAgICAgICAgcHVibGljIFN0cmluZyBmb28oU3RyaW5nIGZvbykgeworICAgICAgICAgICAgcmV0dXJuIGZvbzsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJ0ZXh0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRleHRSZXNvdXJjZSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0LyoiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisgICAgICAgICAgICByZXR1cm4gInRleHQiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uLyoiKQorICAgICAgICBAUGF0aCgiYW55IikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRBbnkoKSB7CisgICAgICAgICAgICByZXR1cm4gInRleHQiOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0LyoiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgcG9zdChTdHJpbmcgZW50aXR5KSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soKS5lbnRpdHkoImVudGl0eSIpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgid2lsZGNhcmQiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgV2lsZENhcmRSZXNvdXJjZSB7CisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgd2lsZENhcmQoU3RyaW5nIHdjKSB7CisgICAgICAgICAgICByZXR1cm4gd2M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiamlyYS8xNTE4IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIElzc3VlMTUxOFJlc291cmNlIHsKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQENvbnN1bWVzKCJ0ZXh0L3BsYWluO3FzPTAuNyIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgbmV2ZXIoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViQXBwbGljYXRpb25FeGNlcHRpb24oUmVzcG9uc2UuU3RhdHVzLkNPTkZMSUNUKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBDb25zdW1lcygidGV4dC8qIikKKyAgICAgICAgcHVibGljIFN0cmluZyB0ZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuICIxNTE4IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEpFUlNFWS0xNTE4IHJlcHJvZHVjZXIgdGVzdAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFFzSW5Db25zdW1lcygpIHsKKyAgICAgICAgUmVzcG9uc2UgciA9IHRhcmdldCgiamlyYS8xNTE4IikucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKS5wb3N0KEVudGl0eS50ZXh0KCJyZXF1ZXN0IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUsIHIuZ2V0TWVkaWFUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjE1MTgiLCByLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgLy8gSkVSU0VZLTExODcgcmVncmVzc2lvbiB0ZXN0CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhwbGljaXRNZWRpYVR5cGUoKSB7CisgICAgICAgIFJlc3BvbnNlIHIgPSB0YXJnZXQoImZvcm0iKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZm9ybShuZXcgRm9ybSgpLnBhcmFtKCJhIiwgImIiKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0ZPUk1fVVJMRU5DT0RFRF9UWVBFLCByLmdldE1lZGlhVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiIiwgci5yZWFkRW50aXR5KEZvcm0uY2xhc3MpLmFzTWFwKCkuZ2V0Rmlyc3QoImEiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QW1iaWd1b3VzV2lsZGNhcmQoKSB7CisgICAgICAgIFJlc3BvbnNlIHIgPSB0YXJnZXQoImZvbyIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoInRlc3QiLCAiZm9vL3BsYWluIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDA2LCByLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaWxkY2FyZEluU3ViVHlwZSgpIHsKKyAgICAgICAgUmVzcG9uc2UgciA9IHRhcmdldCgidGV4dCIpLnJlcXVlc3QoInRleHQvKiIpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDA2LCByLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaWxkY2FyZEluU3ViVHlwZVBvc3QoKSB7CisgICAgICAgIFJlc3BvbnNlIHIgPSB0YXJnZXQoInRleHQiKS5yZXF1ZXN0KCJ0ZXh0LyoiKS5wb3N0KEVudGl0eS5lbnRpdHkoInRlc3QiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDYsIHIuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdpbGRjYXJkSW5TdWJUeXBlMigpIHsKKyAgICAgICAgUmVzcG9uc2UgciA9IHRhcmdldCgidGV4dCIpLnJlcXVlc3QoIiovKiIpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDA2LCByLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaWxkY2FyZHNJblR5cGVBbmRTdWJUeXBlKCkgeworICAgICAgICBSZXNwb25zZSByID0gdGFyZ2V0KCJ0ZXh0L2FueSIpLnJlcXVlc3QoIiovKiIpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9PQ1RFVF9TVFJFQU1fVFlQRSwgci5nZXRNZWRpYVR5cGUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9BY2NlcHRIZWFkZXIoKSB7CisgICAgICAgIC8vIFRoaXMgdGVzdCBpcyB0ZXN0aW5nIHRoZSBzaXR1YXRpb24gd2hlbiB0aGUgY2xpZW50IHNlbmRzIG5vIEFjY2VwdCBoZWFkZXIgdG8gdGhlIHNlcnZlciBhbmQgaXQgZXhwZWN0cworICAgICAgICAvLyBBUFBMSUNBVElPTl9PQ1RFVF9TVFJFQU1fVFlQRSB0byBiZSByZXR1cm5lZC4gQnV0IHdoZW4gbm8gQWNjZXB0IGhlYWRlciBpcyBkZWZpbmVkIGJ5IHRoZSBjbGllbnQgYXBpIHRoZQorICAgICAgICAvLyBIdHRwVVJMQ29ubmVjdGlvbiAoaW4gSHR0cFVybENvbm5lY3RvcikgIGFsd2F5cyBwdXQgdGhlcmUgc29tZSBkZWZhdWx0IEFjY2VwdCBoZWFkZXIgKGxpa2UgKi8qLCB0ZXh0L3BsYWluLCAuLi4pLgorICAgICAgICAvLyBUbyBvdmVyd3JpdGUgdGhpcyBiZWhhdmlvdXIgd2Ugc2V0IEFjY2VwdCB0byBlbXB0eSBTdHJpbmcuIFRoaXMgd29ya3MgZmluZSBhcyB0aGUgc2VydmVyIGNvZGUgaGFuZGxlcyBlbXB0eQorICAgICAgICAvLyBBY2NlcHQgaGVhZGVyIGxpa2Ugbm8gQWNjZXB0IGhlYWRlci4KKyAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRIYXNoTWFwIGhlYWRlcnMgPSBuZXcgTXVsdGl2YWx1ZWRIYXNoTWFwKCk7CisgICAgICAgIGhlYWRlcnMuYWRkKCJBY2NlcHQiLCAiIik7CisKKyAgICAgICAgUmVzcG9uc2UgciA9IHRhcmdldCgidGV4dC9hbnkiKS5yZXF1ZXN0KCkuaGVhZGVycyhoZWFkZXJzKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgci5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUuQVBQTElDQVRJT05fT0NURVRfU1RSRUFNX1RZUEUsIHIuZ2V0TWVkaWFUeXBlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNwZWNpZmljKCkgeworICAgICAgICBSZXNwb25zZSByID0gdGFyZ2V0KCJmb28iKS5yZXF1ZXN0KCJmb28vcGxhaW4iKS5wb3N0KEVudGl0eS5lbnRpdHkoInRlc3QiLCAiZm9vL3BsYWluIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFUeXBlLnZhbHVlT2YoImZvby9wbGFpbiIpLCByLmdldE1lZGlhVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0Iiwgci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQElnbm9yZSgiSlNPTkIgYnJlYWtzIHRoaXMgdGVzdC4iKQorICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBsaWNhdGlvbldpbGRDYXJkKCkgeworICAgICAgICBSZXNwb25zZSByID0gdGFyZ2V0KCJ3aWxkY2FyZCIpLnJlcXVlc3QoImFwcGxpY2F0aW9uLyoiKS5wb3N0KEVudGl0eS50ZXh0KCJ0ZXN0IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX09DVEVUX1NUUkVBTV9UWVBFLCByLmdldE1lZGlhVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0Iiwgci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L01lc3NhZ2VCb2R5UHJvdmlkZXJBbm5vdGF0aW9uc1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L01lc3NhZ2VCb2R5UHJvdmlkZXJBbm5vdGF0aW9uc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTdiZmU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvTWVzc2FnZUJvZHlQcm92aWRlckFubm90YXRpb25zVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTgwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdHMgYW5ub3RhdGlvbnMgcGFzc2VkIHRvIG1lc3NhZ2UgYm9keSBwcm92aWRlci4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBNZXNzYWdlQm9keVByb3ZpZGVyQW5ub3RhdGlvbnNUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKENvbnRhaW5lclJlYWRlcldyaXRlci5jbGFzcywgUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdyaXRlcigpIHsKKyAgICAgICAgU3RyaW5nIGdldCA9IHRhcmdldCgpLnBhdGgoInRlc3QiKS5yZXF1ZXN0KCJ0ZXN0L3RleHQiKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXQtb2siLCBnZXQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRlcigpIHsKKyAgICAgICAgU3RyaW5nIGdldCA9IHRhcmdldCgpLnBhdGgoInRlc3QiKS5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikucG9zdChFbnRpdHkuZW50aXR5KCJ0ZXN0IiwgInRlc3QvdGV4dCIpLCBTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm9rIiwgZ2V0KTsKKyAgICB9CisKKworICAgIEBQcm9kdWNlcygidGVzdC90ZXh0IikKKyAgICBAQ29uc3VtZXMoInRlc3QvdGV4dCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb250YWluZXJSZWFkZXJXcml0ZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVdyaXRlcjxTdHJpbmc+LCBNZXNzYWdlQm9keVJlYWRlcjxCZWFuPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gU3RyaW5nLmNsYXNzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldFNpemUoU3RyaW5nIHMsIENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oU3RyaW5nIHMsIENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBPdXRwdXRTdHJlYW1Xcml0ZXIgb3N3ID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihlbnRpdHlTdHJlYW0pOworCisgICAgICAgICAgICBpZiAoY29tcGFyZUFubm90YXRpb25zKG5ldyBDbGFzczw/Pltde015QW5ub3RhdGlvbi5jbGFzcywgUHJvZHVjZXMuY2xhc3MsIEdFVC5jbGFzc30sIGFubm90YXRpb25zKSkgeworICAgICAgICAgICAgICAgIG9zdy53cml0ZShzICsgIi1vayIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvc3cud3JpdGUocyArICItZmFpbCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3N3LmZsdXNoKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlID09IEJlYW4uY2xhc3M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJlYW4gcmVhZEZyb20oQ2xhc3M8QmVhbj4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaHR0cEhlYWRlcnMsIElucHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChjb21wYXJlQW5ub3RhdGlvbnMobmV3IENsYXNzPD8+W117TXlBbm5vdGF0aW9uLmNsYXNzfSwgYW5ub3RhdGlvbnMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCZWFuKCJvayIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJlYW4oImZhaWwiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQmVhbiB7CisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHZhbHVlOworCisgICAgICAgIHB1YmxpYyBCZWFuKFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gY29tcGFyZUFubm90YXRpb25zKENsYXNzW10gZXhwZWN0ZWQsIEFubm90YXRpb25bXSBhY3R1YWwpIHsKKyAgICAgICAgaWYgKGV4cGVjdGVkLmxlbmd0aCAhPSBhY3R1YWwubGVuZ3RoKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKENsYXNzPD8+IGUgOiBleHBlY3RlZCkgeworICAgICAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChBbm5vdGF0aW9uIGEgOiBhY3R1YWwpIHsKKyAgICAgICAgICAgICAgICBpZiAoZS5lcXVhbHMoYS5hbm5vdGF0aW9uVHlwZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBBbm5vdGF0aW9uIEFOTk9UQVRJT047CisKKyAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorICAgIHB1YmxpYyBzdGF0aWMgQGludGVyZmFjZSBNeUFubm90YXRpb24geworICAgIH0KKworICAgIHN0YXRpYyB7CisgICAgICAgIEBNeUFubm90YXRpb24KKyAgICAgICAgY2xhc3MgVGVtcENsYXNzIHsKKyAgICAgICAgfQorICAgICAgICA7CisgICAgICAgIEFOTk9UQVRJT04gPSBUZW1wQ2xhc3MuY2xhc3MuZ2V0QW5ub3RhdGlvbihNeUFubm90YXRpb24uY2xhc3MpOworICAgIH0KKworICAgIEBQYXRoKCJ0ZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoInRlc3QvdGV4dCIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXQoKSB7CisgICAgICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IFJlc3BvbnNlLm9rKCkuZW50aXR5KCJnZXQiLCBuZXcgQW5ub3RhdGlvbltde0FOTk9UQVRJT059KS5idWlsZCgpOworICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQENvbnN1bWVzKCJ0ZXN0L3RleHQiKQorICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3QoQE15QW5ub3RhdGlvbiBCZWFuIGVudGl0eSkgeworICAgICAgICAgICAgcmV0dXJuIGVudGl0eS5nZXRWYWx1ZSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvTXVsdGlwYXJ0VGVzdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvTXVsdGlwYXJ0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0OWRhNzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9NdWx0aXBhcnRUZXN0LmphdmEKQEAgLTAsMCArMSwyMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uSmFja3NvbkZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LkZvcm1EYXRhQm9keVBhcnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LkZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5Gb3JtRGF0YU11bHRpUGFydDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuRm9ybURhdGFQYXJhbTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuTXVsdGlQYXJ0RmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIE11bHRpcGFydFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJVbnVzZWREZWNsYXJhdGlvbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeU9iamVjdCB7CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKyAgICAgICAgcHVibGljIE15T2JqZWN0KCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE15T2JqZWN0KGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXVsdGlwYXJ0UmVzb3VyY2UgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJmaWxlbmFtZSIpCisgICAgICAgIEBDb25zdW1lcyhNZWRpYVR5cGUuTVVMVElQQVJUX0ZPUk1fREFUQSkKKyAgICAgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGZpbGVuYW1lKGZpbmFsIEZvcm1EYXRhTXVsdGlQYXJ0IGVudGl0eSkgeworICAgICAgICAgICAgcmV0dXJuIGVudGl0eS5nZXRGaWVsZCgidGV4dCIpLmdldFZhbHVlKCkgKyBlbnRpdHkuZ2V0RmllbGQoImZpbGUiKS5nZXRDb250ZW50RGlzcG9zaXRpb24oKS5nZXRGaWxlTmFtZSgpOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoIm1iciIpCisgICAgICAgIEBDb25zdW1lcyhNZWRpYVR5cGUuTVVMVElQQVJUX0ZPUk1fREFUQSkKKyAgICAgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgbWJyKGZpbmFsIEZvcm1EYXRhTXVsdGlQYXJ0IGVudGl0eSkgeworICAgICAgICAgICAgZW50aXR5LmdldEZpZWxkKCJ0ZXh0IikuZ2V0VmFsdWVBcyhNdWx0aXBhcnRSZXNvdXJjZS5jbGFzcyk7CisKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygia28iKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoImxpc3RBc1BhcmFtZXRlciIpCisgICAgICAgIEBDb25zdW1lcyhNZWRpYVR5cGUuTVVMVElQQVJUX0ZPUk1fREFUQSkKKyAgICAgICAgcHVibGljIFN0cmluZyBwcm9jZXNzKEBGb3JtRGF0YVBhcmFtKHZhbHVlID0gIm9iamVjdCIpIGZpbmFsIE15T2JqZWN0IG9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBGb3JtRGF0YVBhcmFtKHZhbHVlID0gImxpc3QiKSBmaW5hbCBMaXN0PE15T2JqZWN0PiBsaXN0KSB7CisgICAgICAgICAgICBTdHJpbmcgdmFsdWUgPSBvYmplY3QudmFsdWU7CisKKyAgICAgICAgICAgIGZvciAoZmluYWwgTXlPYmplY3Qgb2JqIDogbGlzdCkgeworICAgICAgICAgICAgICAgIHZhbHVlICs9ICJfIiArIG9iai52YWx1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNZXNzYWdlQm9keVByb3ZpZGVyCisgICAgICAgICAgICBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5UmVhZGVyPE11bHRpcGFydFJlc291cmNlPiwgTWVzc2FnZUJvZHlXcml0ZXI8TXVsdGlwYXJ0UmVzb3VyY2U+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZShmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE11bHRpcGFydFJlc291cmNlIHJlYWRGcm9tKGZpbmFsIENsYXNzPE11bHRpcGFydFJlc291cmNlPiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiSU9FIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKGZpbmFsIE11bHRpcGFydFJlc291cmNlIG11bHRpcGFydFJlc291cmNlLCBmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oZmluYWwgTXVsdGlwYXJ0UmVzb3VyY2UgbXVsdGlwYXJ0UmVzb3VyY2UsIGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywgZmluYWwgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkKKyAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJJT0UiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoTXVsdGlwYXJ0UmVzb3VyY2UuY2xhc3MsIE1lc3NhZ2VCb2R5UHJvdmlkZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKE11bHRpUGFydEZlYXR1cmUuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKEphY2tzb25GZWF0dXJlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoZmluYWwgQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcucmVnaXN0ZXIoTXVsdGlQYXJ0RmVhdHVyZS5jbGFzcyk7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihKYWNrc29uRmVhdHVyZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZU5hbWVJbnRlcm5ldEV4cGxvcmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGVudGl0eSA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbSgibXVsdGlwYXJ0LXRlc3RjYXNlLnR4dCIpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiZmlsZW5hbWUiKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAuaGVhZGVyKCJVc2VyLUFnZW50IiwgIk1vemlsbGEvNS4wIChXaW5kb3dzOyBVOyBNU0lFIDcuMDsgV2luZG93cyBOVCA2LjA7IGVuLVVTKSIpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eShlbnRpdHksICJtdWx0aXBhcnQvZm9ybS1kYXRhOyBib3VuZGFyeT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS03ZGM5NDE1MjA4ODgiKSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGVxdWFsVG8oImJoaGtsYnBvbS54bWwiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlsZU5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gZW50aXR5ID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZUFzU3RyZWFtKCJtdWx0aXBhcnQtdGVzdGNhc2UudHh0Iik7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJmaWxlbmFtZSIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkoZW50aXR5LCAibXVsdGlwYXJ0L2Zvcm0tZGF0YTsgYm91bmRhcnk9LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tN2RjOTQxNTIwODg4IikpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKCJiaGhrbGJDOmphdmFwcm9qZWN0c211bHRpcGFydC10ZXN0Y2FzZXBvbS54bWwiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWJyRXhjZXB0aW9uU2VydmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGVudGl0eSA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbSgibXVsdGlwYXJ0LXRlc3RjYXNlLnR4dCIpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgibWJyIikKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eShlbnRpdHksICJtdWx0aXBhcnQvZm9ybS1kYXRhOyBib3VuZGFyeT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS03ZGM5NDE1MjA4ODgiKSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgZXF1YWxUbyg1MDApKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoYXQgaW5qZWN0aW9uIG9mIGEgbGlzdCAoc3BlY2lmaWMgdHlwZSkgd29ya3MuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3BlY2lmaWNMaXN0QXNQYXJhbWV0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgTXlPYmplY3Qgb2JqZWN0ID0gbmV3IE15T2JqZWN0KCJvYmplY3QiKTsKKyAgICAgICAgZmluYWwgTGlzdDxNeU9iamVjdD4gbGlzdCA9IEFycmF5cy5hc0xpc3QobmV3IE15T2JqZWN0KCJsaXN0MSIpLCBuZXcgTXlPYmplY3QoImxpc3QyIikpOworCisgICAgICAgIGZpbmFsIEZvcm1EYXRhTXVsdGlQYXJ0IG1wID0gbmV3IEZvcm1EYXRhTXVsdGlQYXJ0KCk7CisgICAgICAgIG1wLmJvZHlQYXJ0KG5ldyBGb3JtRGF0YUJvZHlQYXJ0KEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uLm5hbWUoIm9iamVjdCIpLmZpbGVOYW1lKCJvYmplY3QiKS5idWlsZCgpLAorICAgICAgICAgICAgICAgIG9iamVjdCwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSkpOworICAgICAgICBtcC5ib2R5UGFydChuZXcgRm9ybURhdGFCb2R5UGFydChGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbi5uYW1lKCJsaXN0IikuZmlsZU5hbWUoImxpc3QiKS5idWlsZCgpLAorICAgICAgICAgICAgICAgIGxpc3QsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUpKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgibGlzdEFzUGFyYW1ldGVyIikKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShtcCwgTWVkaWFUeXBlLk1VTFRJUEFSVF9GT1JNX0RBVEFfVFlQRSkpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBpcygib2JqZWN0X2xpc3QxX2xpc3QyIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJmaWxlbmFtZSIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkobnVsbCwgTWVkaWFUeXBlLk1VTFRJUEFSVF9GT1JNX0RBVEFfVFlQRSkpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDQwMCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5RW50aXR5V2l0aG91dENvbnRlbnRUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJmaWxlbmFtZSIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5wb3N0KG51bGwpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDQwMCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvTXlBcnJheUxpc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L015QXJyYXlMaXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkxOTIxNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L015QXJyYXlMaXN0LmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworLyoqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIE15QXJyYXlMaXN0PFQ+IGV4dGVuZHMgQXJyYXlMaXN0PFQ+IHsKKworICAgIHB1YmxpYyBNeUFycmF5TGlzdCgpIHsKKworICAgIH0KKworICAgIHB1YmxpYyBNeUFycmF5TGlzdChmaW5hbCBDb2xsZWN0aW9uPFQ+IGEpIHsKKyAgICAgICAgc3VwZXIoYSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9Ob01lc3NhZ2VCb2R5V29ya2VyVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvTm9NZXNzYWdlQm9keVdvcmtlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTRmYWMzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvTm9NZXNzYWdlQm9keVdvcmtlclRlc3QuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuQ29tbW9uUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitwdWJsaWMgY2xhc3MgTm9NZXNzYWdlQm9keVdvcmtlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdFR5cGVUZXN0ZXIgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSAoUmVzb3VyY2VDb25maWcpIHN1cGVyLmNvbmZpZ3VyZSgpOworICAgICAgICByZXNvdXJjZUNvbmZpZy5wcm9wZXJ0eShDb21tb25Qcm9wZXJ0aWVzLk1PWFlfSlNPTl9GRUFUVVJFX0RJU0FCTEUsIHRydWUpOworICAgICAgICByZXR1cm4gcmVzb3VyY2VDb25maWc7CisgICAgfQorCisgICAgQFBhdGgoIm5vYm9keXJlYWRlciIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBOb01lc3NhZ2VCb2R5UmVhZGVyUmVzb3VyY2UgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyB2b2lkIHBvc3QoTm9NZXNzYWdlQm9keVJlYWRlclJlc291cmNlIHQpIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vTWVzc2FnZUJvZHlSZWFkZXJSZXNvdXJjZSgpIHsKKyAgICAgICAgUmVzcG9uc2UgciA9IHRhcmdldCgibm9ib2R5cmVhZGVyIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LnRleHQoImEiKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MTUsIHIuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBQYXRoKCJub2JvZHl3cml0ZXIiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTm9NZXNzYWdlQm9keVdyaXRlclJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBOb01lc3NhZ2VCb2R5V3JpdGVyUmVzb3VyY2UgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBOb01lc3NhZ2VCb2R5V3JpdGVyUmVzb3VyY2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vTWVzc2FnZUJvZHlXcml0ZXJSZXNvdXJjZSgpIHsKKyAgICAgICAgUmVzcG9uc2UgciA9IHRhcmdldCgibm9ib2R5d3JpdGVyIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoNTAwLCByLmdldFN0YXR1cygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9QYXJhbWV0ZXJUeXBlQXJndW1lbnRPcmRlclRlc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L1BhcmFtZXRlclR5cGVBcmd1bWVudE9yZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmN2JiYTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9QYXJhbWV0ZXJUeXBlQXJndW1lbnRPcmRlclRlc3QuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHk7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3RzIHRoZSBjb3JyZWN0IG9yZGVyIG9mIHByb3ZpZGVycy4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKi8KK3B1YmxpYyBjbGFzcyBQYXJhbWV0ZXJUeXBlQXJndW1lbnRPcmRlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdFBhcmFtZXRlclR5cGVBcmd1bWVudE9yZGVyVGVzdCB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhBV3JpdGVyLmNsYXNzLCBCV3JpdGVyLmNsYXNzLCBDV3JpdGVyLmNsYXNzLCBDbGFzc1Jlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbGFzc1Jlc291cmNlKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIkFBIiwgdGFyZ2V0KCkucGF0aCgiYSIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiQkIiLCB0YXJnZXQoKS5wYXRoKCJiIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJDQyIsIHRhcmdldCgpLnBhdGgoImMiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvUGFyYW1ldGVyVHlwZUFyZ3VtZW50UmVzb3VyY2VSZWFkZXJXcml0ZXJPcmRlclRlc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L1BhcmFtZXRlclR5cGVBcmd1bWVudFJlc291cmNlUmVhZGVyV3JpdGVyT3JkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThhYTc5OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L1BhcmFtZXRlclR5cGVBcmd1bWVudFJlc291cmNlUmVhZGVyV3JpdGVyT3JkZXJUZXN0LmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0cyB0aGUgY29ycmVjdCBvcmRlciBvZiBwcm92aWRlcnMuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitwdWJsaWMgY2xhc3MgUGFyYW1ldGVyVHlwZUFyZ3VtZW50UmVzb3VyY2VSZWFkZXJXcml0ZXJPcmRlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdFBhcmFtZXRlclR5cGVBcmd1bWVudE9yZGVyVGVzdCB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhBUmVhZGVyV3JpdGVyLmNsYXNzLCBCUmVhZGVyV3JpdGVyLmNsYXNzLCBDUmVhZGVyV3JpdGVyLmNsYXNzLCBDbGFzc1Jlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbGFzc1Jlc291cmNlKCkgeworICAgICAgICAvLyBOT1RFOiBIdHRwVXJsQ29ubmVjdG9yIHNlbmRzIHNldmVyYWwgYWNjZXB0ZWQgdHlwZXMgYnkgZGVmYXVsdCB3aGVuIG5vdCBleHBsaWNpdGx5IHNldCBieSB0aGUgY2FsbGVyLgorICAgICAgICAvLyBJbiBzdWNoIGNhc2UsIHRoZSAuYWNjZXB0KCJ0ZXh0L2h0bWwiKSBjYWxsIGlzIG5vdCBuZWNlc3NhcnkuIEhvd2V2ZXIsIG90aGVyIGNvbm5lY3RvcnMgYWN0IGluIGEgZGlmZmVyZW50IHdheSBhbmQKKyAgICAgICAgLy8gdGhpcyBsZWFkcyBpbiBkaWZmZXJlbnQgYmVoYXZpb3VyIHdoZW4gc2VsZWN0aW5nIHRoZSBNZXNzYWdlQm9keVdyaXRlci4gTGVhdmluZyB0aGUgZGVmaW5pdGlvbiBleHBsaWNpdCBmb3IgYnJvYWRlcgorICAgICAgICAvLyBjb21wYXRpYmlsaXR5LgorICAgICAgICBhc3NlcnRFcXVhbHMoIkFBIiwgdGFyZ2V0KCkucGF0aCgiYSIpLnJlcXVlc3QoInRleHQvaHRtbCIpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJCQiIsIHRhcmdldCgpLnBhdGgoImIiKS5yZXF1ZXN0KCJ0ZXh0L2h0bWwiKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiQ0MiLCB0YXJnZXQoKS5wYXRoKCJjIikucmVxdWVzdCgidGV4dC9odG1sIikuZ2V0KFN0cmluZy5jbGFzcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L1BhcmFtZXRlclR5cGVBcmd1bWVudFJldmVyc2VkT3JkZXJUZXN0LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9QYXJhbWV0ZXJUeXBlQXJndW1lbnRSZXZlcnNlZE9yZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYzgyNmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9QYXJhbWV0ZXJUeXBlQXJndW1lbnRSZXZlcnNlZE9yZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdHMgdGhlIGNvcnJlY3Qgb3JkZXIgb2YgcHJvdmlkZXJzLgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqLworcHVibGljIGNsYXNzIFBhcmFtZXRlclR5cGVBcmd1bWVudFJldmVyc2VkT3JkZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RQYXJhbWV0ZXJUeXBlQXJndW1lbnRPcmRlclRlc3QgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoQ1dyaXRlci5jbGFzcywgQldyaXRlci5jbGFzcywgQVdyaXRlci5jbGFzcywgQ2xhc3NSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NSZXNvdXJjZSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBQSIsIHRhcmdldCgpLnBhdGgoImEiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkJCIiwgdGFyZ2V0KCkucGF0aCgiYiIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiQ0MiLCB0YXJnZXQoKS5wYXRoKCJjIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L1JlbmRlcmVkSW1hZ2VUeXBlVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvUmVuZGVyZWRJbWFnZVR5cGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQzNzllMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L1JlbmRlcmVkSW1hZ2VUeXBlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHk7CisKK2ltcG9ydCBqYXZhLmF3dC5pbWFnZS5CdWZmZXJlZEltYWdlOworaW1wb3J0IGphdmEuYXd0LmltYWdlLlJlbmRlcmVkSW1hZ2U7CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5ub3ROdWxsVmFsdWU7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5ncmVhdGVyVGhhbjsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgUmVuZGVyZWRJbWFnZVR5cGVUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbWFnZVJlc291cmNlIHsKKworICAgICAgICBAQ29uc3VtZXMoImltYWdlL2dpZiIpCisgICAgICAgIEBQcm9kdWNlcygiaW1hZ2UvcG5nIikKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFJlbmRlcmVkSW1hZ2UgcG9zdEdpZihmaW5hbCBSZW5kZXJlZEltYWdlIGltYWdlKSB7CisgICAgICAgICAgICByZXR1cm4gaW1hZ2U7CisgICAgICAgIH0KKworICAgICAgICBAQ29uc3VtZXMoImltYWdlL3BuZyIpCisgICAgICAgIEBQcm9kdWNlcygiaW1hZ2UvcG5nIikKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFJlbmRlcmVkSW1hZ2UgcG9zdFBuZyhmaW5hbCBSZW5kZXJlZEltYWdlIGltYWdlKSB7CisgICAgICAgICAgICByZXR1cm4gaW1hZ2U7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgic3ViIikKKyAgICAgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKQorICAgICAgICBAUHJvZHVjZXMoImltYWdlL3BuZyIpCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBSZW5kZXJlZEltYWdlIHBvc3RVbmRlZmluZWQoZmluYWwgQnVmZmVyZWRJbWFnZSBpbWFnZSkgeworICAgICAgICAgICAgcmV0dXJuIGltYWdlOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhJbWFnZVJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0UG5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIHN0cmVhbSA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbSgiSmVyc2V5X3llbGxvdy5wbmciKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KHN0cmVhbSwgImltYWdlL3BuZyIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChMb25nLnZhbHVlT2YocmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJDb250ZW50LUxlbmd0aCIpKSwgZ3JlYXRlclRoYW4oMEwpKTsKKworICAgICAgICBmaW5hbCBSZW5kZXJlZEltYWdlIGltYWdlID0gcmVzcG9uc2UucmVhZEVudGl0eShSZW5kZXJlZEltYWdlLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VGhhdChpbWFnZSwgbm90TnVsbFZhbHVlKCkpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShpbWFnZSwgImltYWdlL3BuZyIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFJlbmRlcmVkSW1hZ2UuY2xhc3MpLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoTG9uZy52YWx1ZU9mKHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiQ29udGVudC1MZW5ndGgiKSksIGdyZWF0ZXJUaGFuKDBMKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdEdpZigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBzdHJlYW0gPSBnZXRDbGFzcygpLmdldFJlc291cmNlQXNTdHJlYW0oImR1a2Vfcm9ja2V0LmdpZiIpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoc3RyZWFtLCAiaW1hZ2UvZ2lmIikpOworICAgICAgICBhc3NlcnRUaGF0KExvbmcudmFsdWVPZihyZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIkNvbnRlbnQtTGVuZ3RoIikpLCBncmVhdGVyVGhhbigwTCkpOworCisgICAgICAgIGZpbmFsIFJlbmRlcmVkSW1hZ2UgaW1hZ2UgPSByZXNwb25zZS5yZWFkRW50aXR5KFJlbmRlcmVkSW1hZ2UuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KGltYWdlLCBub3ROdWxsVmFsdWUoKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KGltYWdlLCAiaW1hZ2UvcG5nIikpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoUmVuZGVyZWRJbWFnZS5jbGFzcyksIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChMb25nLnZhbHVlT2YocmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJDb250ZW50LUxlbmd0aCIpKSwgZ3JlYXRlclRoYW4oMEwpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0VW5kZWZpbmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIHN0cmVhbSA9IGdldENsYXNzKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbSgiZHVrZV9yb2NrZXQuZ2lmIik7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJzdWIiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KHN0cmVhbSwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChMb25nLnZhbHVlT2YocmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJDb250ZW50LUxlbmd0aCIpKSwgZ3JlYXRlclRoYW4oMEwpKTsKKworICAgICAgICBmaW5hbCBSZW5kZXJlZEltYWdlIGltYWdlID0gcmVzcG9uc2UucmVhZEVudGl0eShSZW5kZXJlZEltYWdlLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VGhhdChpbWFnZSwgbm90TnVsbFZhbHVlKCkpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShpbWFnZSwgImltYWdlL3BuZyIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFJlbmRlcmVkSW1hZ2UuY2xhc3MpLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoTG9uZy52YWx1ZU9mKHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiQ29udGVudC1MZW5ndGgiKSksIGdyZWF0ZXJUaGFuKDBMKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvU3RyZWFtaW5nT3V0cHV0VGVzdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvU3RyZWFtaW5nT3V0cHV0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZGY1NDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9TdHJlYW1pbmdPdXRwdXRUZXN0LmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlN0cmVhbWluZ091dHB1dDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK0BQYXRoKCIvIikKK3B1YmxpYyBjbGFzcyBTdHJlYW1pbmdPdXRwdXRUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisgICAgQEdFVAorICAgIEBQYXRoKCJ3YWUiKQorICAgIHB1YmxpYyBTdHJlYW1pbmdPdXRwdXQgdGVzdDIoKSB7CisgICAgICAgIHJldHVybiBuZXcgU3RyZWFtaW5nT3V0cHV0KCkgeworICAgICAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoT3V0cHV0U3RyZWFtIG91dHB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgV2ViQXBwbGljYXRpb25FeGNlcHRpb24oUmVzcG9uc2UuU3RhdHVzLkJBRF9HQVRFV0FZLmdldFN0YXR1c0NvZGUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhTdHJlYW1pbmdPdXRwdXRUZXN0LmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbigpIHsKKyAgICAgICAgUmVzcG9uc2UgciA9IHRhcmdldCgid2FlIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmVzcG9uc2UuU3RhdHVzLkJBRF9HQVRFV0FZLmdldFN0YXR1c0NvZGUoKSwgci5nZXRTdGF0dXNJbmZvKCkuZ2V0U3RhdHVzQ29kZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9TdWJSZXNvdXJjZUR5bmFtaWNQcm94eVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L1N1YlJlc291cmNlRHluYW1pY1Byb3h5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYjIyZjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9TdWJSZXNvdXJjZUR5bmFtaWNQcm94eVRlc3QuamF2YQpAQCAtMCwwICsxLDE3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25IYW5kbGVyOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5QYXJhbWV0ZXJpemVkVHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Qcm94eTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogUmVwcm9kdWNlciBmb3IgSkVSU0VZLTI1NDEuCisgKgorICogTWFrZSBzdXJlIHRoYXQgdHlwZSBwYXJhbWV0ZXIgd2lsbCBiZSByZXRhaW5lZCBmb3IgcmVzb3VyY2UgbWV0aG9kCisgKiBvZiBhIHN1Yi1yZXNvdXJjZSBsb2NhdG9yIHRoYXQgcmV0dXJucyBhIGR5bmFtaWMgcHJveHkuCisgKiBUaGlzIHRlc3Qgc2hvdWxkIGNvdmVyIGFsc28gdGhlIEVKQiBjYXNlLCBhcyB0aGUgY29tbW9uIGNhdXNlCisgKiBpcyBtaXNzaW5nIHR5cGUgcGFyYW1ldGVyLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBTdWJSZXNvdXJjZUR5bmFtaWNQcm94eVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoTGlzdFByb3ZpZGVyLmNsYXNzLCBSb290UmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN1Yi1yZXNvdXJjZSBpbnRlcmZhY2Ugc28gdGhhdCBpdCBpcyBlYXN5IHRvIG1ha2UgYSBkeW5hbWljIHByb3h5CisgICAgICogd2l0aCB0aGUgc3RhbmRhcmQgSmF2YSByZWZsZWN0aW9uIEFQSS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBTdWJSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgTGlzdDxGb28+IGdldEdyZWV0aW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSGVscGVyIHR5cGUgdG8gYmUgdXNlZCBhcyBhIHR5cGUgcGFyYW1ldGVyLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRm9vIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNZXNzYWdlIGJvZHkgd3JpdGVyIHRoYXQgdXNlcyB0byBjaGVjayBwcmVzZW5jZSBvZiB0eXBlIHBhcmFtZXRlciBpbiB0aGUgcHJvdmlkZWQgZW50aXR5IHR5cGUuCisgICAgICogSWYgbm8gdHlwZSBwYXJhbWV0ZXIgaXMgZm91bmQgdGhlIHByb3ZpZGVyIHJlZnVzZXMgdG8gcHJvY2VzcyBjb3JyZXNwb25kaW5nIGVudGl0eSwKKyAgICAgKiB3aGljaCB3b3VsZCBsZWFkIHRvIGFuIGVycm9yLgorICAgICAqLworICAgIEBQcm92aWRlcgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTGlzdFByb3ZpZGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8TGlzdDxGb28+PiB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgaXMgdGhlIGRhdGEgdGhhdCB3b3VsZCBiZSB3cml0dGVuIHRvIHRoZSByZXNwb25zZSBib2R5IGJ5IHRoZSB7QGxpbmsgTGlzdFByb3ZpZGVyfSBiZWxsb3cuCisgICAgICAgICAqLworICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENIRUNLX0RBVEEgPSAiZW5zdXJlIHRoaXMgb25lIG1ha2VzIGl0IHRvIHRoZSBjbGllbnQiOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBXZSBuZWVkIHRvIHdvcmsgd2l0aCBhIG5vbi1udWxsIGVudGl0eSBoZXJlIHNvIHRoYXQgdGhlIHdvcmtlciBjb3VsZCBkbyBpdCdzIGpvYi4KKyAgICAgICAgICovCisgICAgICAgIHN0YXRpYyBmaW5hbCBMaW5rZWRMaXN0PEZvbz4gVEVTVF9FTlRJVFkgPSBuZXcgTGlua2VkTGlzdDxGb28+KCkgeworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFkZChuZXcgRm9vKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIGlmICghKGdlbmVyaWNUeXBlIGluc3RhbmNlb2YgUGFyYW1ldGVyaXplZFR5cGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBQYXJhbWV0ZXJpemVkVHlwZSBwdCA9IChQYXJhbWV0ZXJpemVkVHlwZSkgZ2VuZXJpY1R5cGU7CisKKyAgICAgICAgICAgIGlmIChwdC5nZXRBY3R1YWxUeXBlQXJndW1lbnRzKCkubGVuZ3RoID4gMSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCEocHQuZ2V0QWN0dWFsVHlwZUFyZ3VtZW50cygpWzBdIGluc3RhbmNlb2YgQ2xhc3MpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBDbGFzcyBsaXN0Q2xhc3MgPSAoQ2xhc3MpIHB0LmdldEFjdHVhbFR5cGVBcmd1bWVudHMoKVswXTsKKyAgICAgICAgICAgIHJldHVybiBsaXN0Q2xhc3MgPT0gRm9vLmNsYXNzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldFNpemUoTGlzdDxGb28+IHQsIENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oTGlzdDxGb28+IHQsIENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlLCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0LCBURVNUX0VOVElUWSk7CisgICAgICAgICAgICBlbnRpdHlTdHJlYW0ud3JpdGUoQ0hFQ0tfREFUQS5nZXRCeXRlcygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJyb290IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJvb3RSZXNvdXJjZSB7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFN1Yi1yZXNvdXJjZSBsb2NhdG9yIGlzIHVzZWQgaGVyZSwgc28gdGhhdCByZXNvdXJjZSBtb2RlbCB3aWxsIGJlIGJ1aWx0CisgICAgICAgICAqIGF0IHJ1bnRpbWUsIHdoZW4gdGhlIGFjdHVhbCBoYW5kbGVyIGlzIHRoZSBkeW5hbWljIHByb3h5LgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIGR5bmFtaWMgcHJveHkgZm9yIHRoZSBzdWItcmVzb3VyY2UKKyAgICAgICAgICovCisgICAgICAgIEBQYXRoKCJzdWIiKQorICAgICAgICBwdWJsaWMgU3ViUmVzb3VyY2UgZ2V0U3VicmVzb3VyY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gKFN1YlJlc291cmNlKSBQcm94eS5uZXdQcm94eUluc3RhbmNlKAorICAgICAgICAgICAgICAgICAgICBSb290UmVzb3VyY2UuY2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IENsYXNzPD8+W10ge1N1YlJlc291cmNlLmNsYXNzfSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IEludm9jYXRpb25IYW5kbGVyKCkgeworCisgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgaW52b2tlKE9iamVjdCBwcm94eSwgTWV0aG9kIG1ldGhvZCwgT2JqZWN0W10gYXJncykgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIExpc3RQcm92aWRlci5URVNUX0VOVElUWTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYWtlIHN1cmUgdGhlIHJlcXVlc3QgaXMgcHJvY2Vzc2VkIHdpdGhvdXQgZXJyb3JzLCBhbmQgdGhlIGRhdGEKKyAgICAgKiB3cml0dGVuIGJ5IHRoZSB7QGxpbmsgTGlzdFByb3ZpZGVyfSBpcyByZXR1cm5lZCBiYWNrIHRvIHRoZSBjbGllbnQuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3ViUmVzb3VyY2VQcm94eSgpIHsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiL3Jvb3Qvc3ViIikucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKExpc3RQcm92aWRlci5DSEVDS19EQVRBLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L1hYRVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L1hYRVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTNkM2IzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvWFhFVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjA1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHk7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuSkFYQkVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlNBWFNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3RzIHhtbCBzZWN1cml0eS4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKi8KK3B1YmxpYyBjbGFzcyBYWEVUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRE9DVFlQRSA9ICI8IURPQ1RZUEUgZm9vIFs8IUVOVElUWSB4eGUgU1lTVEVNIFwiJXNcIj5dPiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFhNTCA9ICI8amF4YkJlYW4+PHZhbHVlPiZ4eGU7PC92YWx1ZT48L2pheGJCZWFuPiI7CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXREb2N1bWVudCgpIHsKKyAgICAgICAgZmluYWwgVVJMIHUgPSB0aGlzLmdldENsYXNzKCkuZ2V0UmVzb3VyY2UoInh4ZS50eHQiKTsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoRE9DVFlQRSwgdS50b1N0cmluZygpKSArIFhNTDsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBnZXRMaXN0RG9jdW1lbnQoKSB7CisgICAgICAgIGZpbmFsIFVSTCB1ID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKCJ4eGUudHh0Iik7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KERPQ1RZUEUsIHUudG9TdHJpbmcoKSkgKyAiPGpheGJCZWFucz4iICsgWE1MICsgWE1MICsgWE1MICsgIjwvamF4YkJlYW5zPiI7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24veG1sIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3htbCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFbnRpdHlIb2xkZXJSZXNvdXJjZSB7CisKKyAgICAgICAgQFBhdGgoImpheGIiKQorICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3QoZmluYWwgSmF4YkJlYW4gcykgeworICAgICAgICAgICAgcmV0dXJuIHMudmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiamF4YmVsZW1lbnQiKQorICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3QoZmluYWwgSkFYQkVsZW1lbnQ8SmF4YkJlYW5UeXBlPiBzKSB7CisgICAgICAgICAgICByZXR1cm4gcy5nZXRWYWx1ZSgpLnZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImpheGIvbGlzdCIpCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdChmaW5hbCBMaXN0PEpheGJCZWFuPiBzKSB7CisgICAgICAgICAgICByZXR1cm4gcy5nZXQoMCkudmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgic2F4IikKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFNBWFNvdXJjZSBwb3N0U2F4KGZpbmFsIFNBWFNvdXJjZSBzKSB7CisgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJkb20iKQorICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3REb20oZmluYWwgRE9NU291cmNlIHMpIHsKKyAgICAgICAgICAgIGZpbmFsIERvY3VtZW50IGQgPSAoRG9jdW1lbnQpIHMuZ2V0Tm9kZSgpOworICAgICAgICAgICAgZmluYWwgRWxlbWVudCBlID0gKEVsZW1lbnQpIGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInZhbHVlIikuaXRlbSgwKTsKKyAgICAgICAgICAgIGZpbmFsIE5vZGUgbiA9IGUuZ2V0Q2hpbGROb2RlcygpLml0ZW0oMCk7CisgICAgICAgICAgICBpZiAobi5nZXROb2RlVHlwZSgpID09IE5vZGUuVEVYVF9OT0RFKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG4uZ2V0Tm9kZVZhbHVlKCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG4uZ2V0Tm9kZVR5cGUoKSA9PSBOb2RlLkVOVElUWV9SRUZFUkVOQ0VfTk9ERSkgeworICAgICAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKDQwMCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgic3RyZWFtIikKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmVhbVNvdXJjZSBwb3N0U3RyZWFtKGZpbmFsIFN0cmVhbVNvdXJjZSBzKSB7CisgICAgICAgICAgICByZXR1cm4gczsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoRW50aXR5SG9sZGVyUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpBWEJTZWN1cmUoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBzID0gdGFyZ2V0KCkucGF0aCgiamF4YiIpLnJlcXVlc3QoImFwcGxpY2F0aW9uL3htbCIpLnBvc3QoRW50aXR5LmVudGl0eShnZXREb2N1bWVudCgpLAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUxfVFlQRSksIFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQlNlY3VyZVdpdGhUaHJlYWRzKCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIGZpbmFsIGludCBuID0gNDsKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2gobik7CisKKyAgICAgICAgZmluYWwgUnVubmFibGUgcnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHMgPSB0YXJnZXQoKS5wYXRoKCJqYXhiIikucmVxdWVzdCgiYXBwbGljYXRpb24veG1sIikucG9zdChFbnRpdHkuZW50aXR5KGdldERvY3VtZW50KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSksIFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiIiwgcyk7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIGZpbmFsIFNldDxUaHJvd2FibGU+IHMgPSBuZXcgSGFzaFNldDxUaHJvd2FibGU+KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBUaHJlYWQgdCA9IG5ldyBUaHJlYWQocnVubmFibGUpOworICAgICAgICAgICAgdC5zZXRVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIobmV3IFRocmVhZC5VbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIoKSB7CisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgdW5jYXVnaHRFeGNlcHRpb24oZmluYWwgVGhyZWFkIHQsIGZpbmFsIFRocm93YWJsZSBleCkgeworICAgICAgICAgICAgICAgICAgICBzLmFkZChleCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB0LnN0YXJ0KCk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgbGF0Y2guYXdhaXQoKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSW50ZXJydXB0ZWRFeGNlcHRpb24gaWdub3JlZCkgeworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQkVsZW1lbnRTZWN1cmUoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBzID0gdGFyZ2V0KCkucGF0aCgiamF4YmVsZW1lbnQiKS5yZXF1ZXN0KCJhcHBsaWNhdGlvbi94bWwiKS5wb3N0KEVudGl0eS5lbnRpdHkoZ2V0RG9jdW1lbnQoKSwKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MX1RZUEUpLCBTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIHMpOworICAgIH0KKworICAgIEBJZ25vcmUgLy8gVE9ETworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpBWEJMaXN0U2VjdXJlKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgcyA9IHRhcmdldCgpLnBhdGgoImpheGIvbGlzdCIpLnJlcXVlc3QoImFwcGxpY2F0aW9uL3htbCIpLnBvc3QoRW50aXR5LmVudGl0eShnZXRMaXN0RG9jdW1lbnQoKSwKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MX1RZUEUpLCBTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIHMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNBWFNlY3VyZSgpIHsKKyAgICAgICAgZmluYWwgSmF4YkJlYW4gYiA9IHRhcmdldCgpLnBhdGgoInNheCIpLnJlcXVlc3QoImFwcGxpY2F0aW9uL3htbCIpLnBvc3QoRW50aXR5LmVudGl0eShnZXREb2N1bWVudCgpLAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUxfVFlQRSksIEpheGJCZWFuLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBiLnZhbHVlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RET01TZWN1cmUoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBzID0gdGFyZ2V0KCkucGF0aCgiZG9tIikucmVxdWVzdCgiYXBwbGljYXRpb24veG1sIikucG9zdChFbnRpdHkuZW50aXR5KGdldERvY3VtZW50KCksCisgICAgICAgICAgICAgICAgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTF9UWVBFKSwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJlYW1TZWN1cmUoKSB7CisgICAgICAgIGZpbmFsIEpheGJCZWFuIGIgPSB0YXJnZXQoKS5wYXRoKCJzdHJlYW0iKS5yZXF1ZXN0KCJhcHBsaWNhdGlvbi94bWwiKS5wb3N0KEVudGl0eS5lbnRpdHkoZ2V0RG9jdW1lbnQoKSwKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MX1RZUEUpLCBKYXhiQmVhbi5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgYi52YWx1ZSk7CisgICAgfQorCisgICAgLy8gTk9URSAtIHRoaXMgaXMgYSB0ZXMgbWlncmF0ZWQgZnJvbSBKZXJzZXkgMS54IHRlc3RzLiBUaGUgb3JpZ2luYWwgdGVzdCBjbGFzcyBjb250YWlucyBhbHNvIGluc2VjdXJlICJ2ZXJzaW9ucyIgb2YgdGhlCisgICAgLy8gbWV0aG9kcyBhYm92ZSBjb25maWd1cmVkIHZpYSBGZWF0dXJlc0FuZFByb3BlcnRpZXMuRkVBVFVSRV9ESVNBQkxFX1hNTF9TRUNVUklUWS4gVGhvc2UgbWV0aG9kcyBhcmUgb21taXRlZCwKKyAgICAvLyBhcyBKZXJzZXkgMiBkb2VzIG5vdCBzdXBwb3J0IHN1Y2ggY29uc3R1cmN0LgorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9YbWxKYXhCRWxlbWVudFByb3ZpZGVyVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvWG1sSmF4QkVsZW1lbnRQcm92aWRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWI4NGViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvWG1sSmF4QkVsZW1lbnRQcm92aWRlclRlc3QuamF2YQpAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5OworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkdlbmVyaWNUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBYbWxKYXhCRWxlbWVudFByb3ZpZGVyVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoQXRvbS5jbGFzcyk7CisgICAgfQorCisgICAgQFBhdGgoImF0b20iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQXRvbSB7CisgICAgICAgIEBDb250ZXh0CisgICAgICAgIEh0dHBIZWFkZXJzIGhlYWRlcnM7CisKKyAgICAgICAgQFBhdGgoIndpbGRjYXJkIikKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi8qIikKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi8qIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHdpbGRjYXJkKEpBWEJFbGVtZW50PFN0cmluZz4gamF4YikgeworICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhID0gaGVhZGVycy5nZXRNZWRpYVR5cGUoKTsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vayhqYXhiKS50eXBlKG1lZGlhKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImF0b20iKQorICAgICAgICBAUE9TVAorICAgICAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL2F0b20reG1sIikKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9hdG9tK3htbCIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBhdG9tKEpBWEJFbGVtZW50PFN0cmluZz4gamF4YikgeworICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhID0gaGVhZGVycy5nZXRNZWRpYVR5cGUoKTsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vayhqYXhiKS50eXBlKG1lZGlhKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImVtcHR5IikKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGVtcHR5Q29uc3VtZXNQcm9kdWNlcyhKQVhCRWxlbWVudDxTdHJpbmc+IGpheGIpIHsKKyAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYSA9IGhlYWRlcnMuZ2V0TWVkaWFUeXBlKCk7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soamF4YikudHlwZShtZWRpYSkuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdpbGRjYXJkKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgcGF0aCA9ICJhdG9tL3dpbGRjYXJkIjsKKyAgICAgICAgX3Rlc3QocGF0aCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0KFN0cmluZyBwYXRoKSB7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQocGF0aCk7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlcyA9IHRhcmdldC5yZXF1ZXN0KCJhcHBsaWNhdGlvbi9hdG9tK3htbCIpLnBvc3QoCisgICAgICAgICAgICAgICAgRW50aXR5LmVudGl0eShuZXcgSkFYQkVsZW1lbnQ8U3RyaW5nPihuZXcgUU5hbWUoImF0b20iKSwgU3RyaW5nLmNsYXNzLCAidmFsdWUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi9hdG9tK3htbCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzLmdldFN0YXR1cygpKTsKKyAgICAgICAgZmluYWwgR2VuZXJpY1R5cGU8SkFYQkVsZW1lbnQ8U3RyaW5nPj4gZ2VuZXJpY1R5cGUgPSBuZXcgR2VuZXJpY1R5cGU8SkFYQkVsZW1lbnQ8U3RyaW5nPj4oKSB7fTsKKyAgICAgICAgZmluYWwgSkFYQkVsZW1lbnQ8U3RyaW5nPiBzdHJpbmdKQVhCRWxlbWVudCA9IHJlcy5yZWFkRW50aXR5KGdlbmVyaWNUeXBlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2YWx1ZSIsIHN0cmluZ0pBWEJFbGVtZW50LmdldFZhbHVlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEF0b20oKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBwYXRoID0gImF0b20vYXRvbSI7CisgICAgICAgIF90ZXN0KHBhdGgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5KCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgcGF0aCA9ICJhdG9tL2VtcHR5IjsKKyAgICAgICAgX3Rlc3QocGF0aCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvWG1sTW94eVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L1htbE1veHlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU5NWNhMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L1htbE1veHlUZXN0LmphdmEKQEAgLTAsMCArMSw1NDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eTsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuUXVldWU7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU3RhY2s7CitpbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY0VudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkdlbmVyaWNUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LkNvbnRleHRSZXNvbHZlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCQ29udGV4dDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5KQVhCRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLm5hbWVzcGFjZS5RTmFtZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW94eS54bWwuTW94eVhtbEZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QudXRpbC5ydW5uZXIuQ29uY3VycmVudFJ1bm5lcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaW5zdGFuY2VPZjsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5ub3ROdWxsVmFsdWU7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworLyoqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitAUnVuV2l0aChDb25jdXJyZW50UnVubmVyLmNsYXNzKQorcHVibGljIGNsYXNzIFhtbE1veHlUZXN0IGV4dGVuZHMgQWJzdHJhY3RUeXBlVGVzdGVyIHsKKworICAgIEBQYXRoKCJKYXhiQmVhblJlc291cmNlIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3htbCIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi94bWwiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSmF4YkJlYW5SZXNvdXJjZSBleHRlbmRzIEFSZXNvdXJjZTxKYXhiQmVhbj4geworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpheGJCZWFuUmVwcmVzZW50YXRpb24oKSB7CisgICAgICAgIF90ZXN0KG5ldyBKYXhiQmVhbigiQ09OVEVOVCIpLCBKYXhiQmVhblJlc291cmNlLmNsYXNzLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MX1RZUEUpOworICAgIH0KKworICAgIEBQYXRoKCJKYXhiQmVhblJlc291cmNlTWVkaWFUeXBlIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Zvbyt4bWwiKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vZm9vK3htbCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKYXhiQmVhblJlc291cmNlTWVkaWFUeXBlIGV4dGVuZHMgQVJlc291cmNlPEpheGJCZWFuPiB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SmF4YkJlYW5SZXByZXNlbnRhdGlvbk1lZGlhVHlwZSgpIHsKKyAgICAgICAgX3Rlc3QobmV3IEpheGJCZWFuKCJDT05URU5UIiksIEpheGJCZWFuUmVzb3VyY2VNZWRpYVR5cGUuY2xhc3MsIE1lZGlhVHlwZS52YWx1ZU9mKCJhcHBsaWNhdGlvbi9mb28reG1sIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpheGJCZWFuUmVwcmVzZW50YXRpb25FcnJvcigpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiSmF4YkJlYW5SZXNvdXJjZSIpOworCisgICAgICAgIGZpbmFsIFN0cmluZyB4bWwgPSAiPHJvb3Q+Zm9vPC9yb290PiI7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIGNyID0gdGFyZ2V0LnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoeG1sLCAiYXBwbGljYXRpb24veG1sIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCBjci5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFBhdGgoIkpheGJCZWFuVGV4dFJlc291cmNlIikKKyAgICBAUHJvZHVjZXMoInRleHQveG1sIikKKyAgICBAQ29uc3VtZXMoInRleHQveG1sIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpheGJCZWFuVGV4dFJlc291cmNlIGV4dGVuZHMgQVJlc291cmNlPEpheGJCZWFuPiB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SmF4YkJlYW5UZXh0UmVwcmVzZW50YXRpb24oKSB7CisgICAgICAgIF90ZXN0KG5ldyBKYXhiQmVhbigiQ09OVEVOVCIpLCBKYXhiQmVhblRleHRSZXNvdXJjZS5jbGFzcywgTWVkaWFUeXBlLlRFWFRfWE1MX1RZUEUpOworICAgIH0KKworICAgIEBQYXRoKCJKQVhCRWxlbWVudEJlYW5SZXNvdXJjZSIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi94bWwiKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24veG1sIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpBWEJFbGVtZW50QmVhblJlc291cmNlIGV4dGVuZHMgQVJlc291cmNlPEpBWEJFbGVtZW50PEpheGJCZWFuVHlwZT4+IHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCRWxlbWVudEJlYW5SZXByZXNlbnRhdGlvbigpIHsKKyAgICAgICAgX3Rlc3QobmV3IEpheGJCZWFuKCJDT05URU5UIiksIEpBWEJFbGVtZW50QmVhblJlc291cmNlLmNsYXNzLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MX1RZUEUpOworICAgIH0KKworICAgIEBQYXRoKCJKQVhCRWxlbWVudExpc3RSZXNvdXJjZSIpCisgICAgQFByb2R1Y2VzKHsiYXBwbGljYXRpb24veG1sIiwgImFwcGxpY2F0aW9uL2pzb24ifSkKKyAgICBAQ29uc3VtZXMoeyJhcHBsaWNhdGlvbi94bWwiLCAiYXBwbGljYXRpb24vanNvbiJ9KQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSkFYQkVsZW1lbnRMaXN0UmVzb3VyY2UgZXh0ZW5kcyBBUmVzb3VyY2U8TGlzdDxKQVhCRWxlbWVudDxTdHJpbmc+Pj4geworICAgIH0KKworICAgIHByaXZhdGUgTGlzdDxKQVhCRWxlbWVudDxTdHJpbmc+PiBnZXRKQVhCRWxlbWVudExpc3QoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KGdldEpBWEJFbGVtZW50QXJyYXkoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQkVsZW1lbnRMaXN0WE1MUmVwcmVzZW50YXRpb24oKSB7CisgICAgICAgIF90ZXN0TGlzdE9yQXJyYXkodHJ1ZSwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTF9UWVBFKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgdm9pZCBfdGVzdExpc3RPckFycmF5KGZpbmFsIGJvb2xlYW4gaXNMaXN0LCBmaW5hbCBNZWRpYVR5cGUgbXQpIHsKKyAgICAgICAgZmluYWwgT2JqZWN0IGluID0gaXNMaXN0ID8gZ2V0SkFYQkVsZW1lbnRMaXN0KCkgOiBnZXRKQVhCRWxlbWVudEFycmF5KCk7CisgICAgICAgIGZpbmFsIEdlbmVyaWNUeXBlIGd0ID0gaXNMaXN0ID8gbmV3IEdlbmVyaWNUeXBlPExpc3Q8SkFYQkVsZW1lbnQ8U3RyaW5nPj4+KCkgeworICAgICAgICB9IDogbmV3IEdlbmVyaWNUeXBlPEpBWEJFbGVtZW50PFN0cmluZz5bXT4oKSB7CisgICAgICAgIH07CisKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldChpc0xpc3QgPyAiSkFYQkVsZW1lbnRMaXN0UmVzb3VyY2UiIDogIkpBWEJFbGVtZW50QXJyYXlSZXNvdXJjZSIpOworICAgICAgICBmaW5hbCBPYmplY3Qgb3V0ID0gdGFyZ2V0LnJlcXVlc3QobXQpLnBvc3QoRW50aXR5LmVudGl0eShuZXcgR2VuZXJpY0VudGl0eShpbiwgZ3QuZ2V0VHlwZSgpKSwgbXQpLCBndCk7CisKKyAgICAgICAgZmluYWwgTGlzdDxKQVhCRWxlbWVudDxTdHJpbmc+PiBpbkxpc3QgPQorICAgICAgICAgICAgICAgIGlzTGlzdCA/ICgoTGlzdDxKQVhCRWxlbWVudDxTdHJpbmc+PikgaW4pIDogQXJyYXlzLmFzTGlzdCgoSkFYQkVsZW1lbnQ8U3RyaW5nPltdKSBpbik7CisgICAgICAgIGZpbmFsIExpc3Q8SkFYQkVsZW1lbnQ8U3RyaW5nPj4gb3V0TGlzdCA9IGlzTGlzdCA/ICgoTGlzdDxKQVhCRWxlbWVudDxTdHJpbmc+Pikgb3V0KSA6IEFycmF5cworICAgICAgICAgICAgICAgIC5hc0xpc3QoKEpBWEJFbGVtZW50PFN0cmluZz5bXSkgb3V0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJMZW5ndGhzIGRpZmZlciIsIGluTGlzdC5zaXplKCksIG91dExpc3Quc2l6ZSgpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbkxpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiTmFtZXMgb2YgZWxlbWVudHMgYXQgaW5kZXggIiArIGkgKyAiIGRpZmZlciIsIGluTGlzdC5nZXQoaSkuZ2V0TmFtZSgpLCBvdXRMaXN0LmdldChpKS5nZXROYW1lKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJWYWx1ZXMgb2YgZWxlbWVudHMgYXQgaW5kZXggIiArIGkgKyAiIGRpZmZlciIsIGluTGlzdC5nZXQoaSkuZ2V0VmFsdWUoKSwgb3V0TGlzdC5nZXQoaSkuZ2V0VmFsdWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiSkFYQkVsZW1lbnRBcnJheVJlc291cmNlIikKKyAgICBAUHJvZHVjZXMoeyJhcHBsaWNhdGlvbi94bWwiLCAiYXBwbGljYXRpb24vanNvbiJ9KQorICAgIEBDb25zdW1lcyh7ImFwcGxpY2F0aW9uL3htbCIsICJhcHBsaWNhdGlvbi9qc29uIn0pCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQVhCRWxlbWVudEFycmF5UmVzb3VyY2UgZXh0ZW5kcyBBUmVzb3VyY2U8SkFYQkVsZW1lbnQ8U3RyaW5nPltdPiB7CisgICAgfQorCisgICAgcHJpdmF0ZSBKQVhCRWxlbWVudDxTdHJpbmc+W10gZ2V0SkFYQkVsZW1lbnRBcnJheSgpIHsKKyAgICAgICAgLy9ub2luc3BlY3Rpb24gdW5jaGVja2VkCisgICAgICAgIHJldHVybiBuZXcgSkFYQkVsZW1lbnRbXSB7CisgICAgICAgICAgICAgICAgbmV3IEpBWEJFbGVtZW50KFFOYW1lLnZhbHVlT2YoImVsZW1lbnQxIiksIFN0cmluZy5jbGFzcywgImFob2oiKSwKKyAgICAgICAgICAgICAgICBuZXcgSkFYQkVsZW1lbnQoUU5hbWUudmFsdWVPZigiZWxlbWVudDIiKSwgU3RyaW5nLmNsYXNzLCAibmF6ZGFyIikKKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCRWxlbWVudEFycmF5WE1MUmVwcmVzZW50YXRpb24oKSB7CisgICAgICAgIF90ZXN0TGlzdE9yQXJyYXkoZmFsc2UsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUxfVFlQRSk7CisgICAgfQorCisgICAgQFBhdGgoIkpBWEJFbGVtZW50QmVhblJlc291cmNlTWVkaWFUeXBlIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Zvbyt4bWwiKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vZm9vK3htbCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQVhCRWxlbWVudEJlYW5SZXNvdXJjZU1lZGlhVHlwZSBleHRlbmRzIEFSZXNvdXJjZTxKQVhCRWxlbWVudDxKYXhiQmVhblR5cGU+PiB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQkVsZW1lbnRCZWFuUmVwcmVzZW50YXRpb25NZWRpYVR5cGUoKSB7CisgICAgICAgIF90ZXN0KG5ldyBKYXhiQmVhbigiQ09OVEVOVCIpLCBKQVhCRWxlbWVudEJlYW5SZXNvdXJjZU1lZGlhVHlwZS5jbGFzcywgTWVkaWFUeXBlLnZhbHVlT2YoImFwcGxpY2F0aW9uL2Zvbyt4bWwiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQkVsZW1lbnRCZWFuUmVwcmVzZW50YXRpb25FcnJvcigpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiSkFYQkVsZW1lbnRCZWFuUmVzb3VyY2UiKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgeG1sID0gIjxyb290Pjx2YWx1ZT5mb28iOworICAgICAgICBmaW5hbCBSZXNwb25zZSBjciA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KHhtbCwgImFwcGxpY2F0aW9uL3htbCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMCwgY3IuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBQYXRoKCJKQVhCRWxlbWVudEJlYW5UZXh0UmVzb3VyY2UiKQorICAgIEBQcm9kdWNlcygidGV4dC94bWwiKQorICAgIEBDb25zdW1lcygidGV4dC94bWwiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSkFYQkVsZW1lbnRCZWFuVGV4dFJlc291cmNlIGV4dGVuZHMgQVJlc291cmNlPEpBWEJFbGVtZW50PEpheGJCZWFuVHlwZT4+IHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCRWxlbWVudEJlYW5UZXh0UmVwcmVzZW50YXRpb24oKSB7CisgICAgICAgIF90ZXN0KG5ldyBKYXhiQmVhbigiQ09OVEVOVCIpLCBKQVhCRWxlbWVudEJlYW5UZXh0UmVzb3VyY2UuY2xhc3MsIE1lZGlhVHlwZS5URVhUX1hNTF9UWVBFKTsKKyAgICB9CisKKyAgICBAUGF0aCgiSkFYQlR5cGVSZXNvdXJjZSIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi94bWwiKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24veG1sIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpBWEJUeXBlUmVzb3VyY2UgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBKYXhiQmVhbiBwb3N0KGZpbmFsIEpheGJCZWFuVHlwZSB0KSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEpheGJCZWFuKHQudmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuICgoUmVzb3VyY2VDb25maWcpIHN1cGVyLmNvbmZpZ3VyZSgpKS5yZWdpc3RlcihuZXcgTW94eVhtbEZlYXR1cmUoU2ltcGxlQmVhbi5jbGFzcykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChmaW5hbCBDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIHN1cGVyLmNvbmZpZ3VyZUNsaWVudChjb25maWcpOworICAgICAgICBjb25maWcucmVnaXN0ZXIobmV3IE1veHlYbWxGZWF0dXJlKFNpbXBsZUJlYW4uY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCVHlwZVJlcHJlc2VudGF0aW9uKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJKQVhCVHlwZVJlc291cmNlIik7CisgICAgICAgIGZpbmFsIEpheGJCZWFuIGluID0gbmV3IEpheGJCZWFuKCJDT05URU5UIik7CisgICAgICAgIGZpbmFsIEpheGJCZWFuVHlwZSBvdXQgPSB0YXJnZXQucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShpbiwgImFwcGxpY2F0aW9uL3htbCIpLCBKYXhiQmVhblR5cGUuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoaW4udmFsdWUsIG91dC52YWx1ZSk7CisgICAgfQorCisgICAgQFBhdGgoIkpBWEJUeXBlUmVzb3VyY2VNZWRpYVR5cGUiKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZm9vK3htbCIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9mb28reG1sIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpBWEJUeXBlUmVzb3VyY2VNZWRpYVR5cGUgZXh0ZW5kcyBKQVhCVHlwZVJlc291cmNlIHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCVHlwZVJlcHJlc2VudGF0aW9uTWVkaWFUeXBlKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJKQVhCVHlwZVJlc291cmNlTWVkaWFUeXBlIik7CisgICAgICAgIGZpbmFsIEpheGJCZWFuIGluID0gbmV3IEpheGJCZWFuKCJDT05URU5UIik7CisgICAgICAgIGZpbmFsIEpheGJCZWFuVHlwZSBvdXQgPSB0YXJnZXQucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShpbiwgImFwcGxpY2F0aW9uL2Zvbyt4bWwiKSwgSmF4YkJlYW5UeXBlLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGluLnZhbHVlLCBvdXQudmFsdWUpOworICAgIH0KKworICAgIEBQYXRoKCJKQVhCT2JqZWN0UmVzb3VyY2UiKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24veG1sIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL3htbCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKQVhCT2JqZWN0UmVzb3VyY2UgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBPYmplY3QgcG9zdChmaW5hbCBPYmplY3QgbykgeworICAgICAgICAgICAgcmV0dXJuIG87CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpBWEJPYmplY3RSZXNvbHZlciBpbXBsZW1lbnRzIENvbnRleHRSZXNvbHZlcjxKQVhCQ29udGV4dD4geworCisgICAgICAgIHB1YmxpYyBKQVhCQ29udGV4dCBnZXRDb250ZXh0KGZpbmFsIENsYXNzPD8+IGMpIHsKKyAgICAgICAgICAgIGlmIChPYmplY3QuY2xhc3MgPT0gYykgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBKQVhCQ29udGV4dC5uZXdJbnN0YW5jZShKYXhiQmVhbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSkFYQkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAvLyBOT09QLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQk9iamVjdFJlcHJlc2VudGF0aW9uKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJKQVhCT2JqZWN0UmVzb3VyY2UiKTsKKyAgICAgICAgZmluYWwgT2JqZWN0IGluID0gbmV3IEpheGJCZWFuKCJDT05URU5UIik7CisgICAgICAgIGZpbmFsIEpheGJCZWFuIG91dCA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KGluLCAiYXBwbGljYXRpb24veG1sIiksIEpheGJCZWFuLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGluLCBvdXQpOworICAgIH0KKworICAgIEBQYXRoKCJKQVhCT2JqZWN0UmVzb3VyY2VNZWRpYVR5cGUiKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZm9vK3htbCIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9mb28reG1sIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpBWEJPYmplY3RSZXNvdXJjZU1lZGlhVHlwZSBleHRlbmRzIEpBWEJPYmplY3RSZXNvdXJjZSB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQk9iamVjdFJlcHJlc2VudGF0aW9uTWVkaWFUeXBlKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJKQVhCT2JqZWN0UmVzb3VyY2VNZWRpYVR5cGUiKTsKKyAgICAgICAgZmluYWwgT2JqZWN0IGluID0gbmV3IEpheGJCZWFuKCJDT05URU5UIik7CisgICAgICAgIGZpbmFsIEpheGJCZWFuIG91dCA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KGluLCAiYXBwbGljYXRpb24vZm9vK3htbCIpLCBKYXhiQmVhbi5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhpbiwgb3V0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCT2JqZWN0UmVwcmVzZW50YXRpb25FcnJvcigpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiSkFYQk9iamVjdFJlc291cmNlIik7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHhtbCA9ICI8cm9vdD5mb288L3Jvb3Q+IjsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgY3IgPSB0YXJnZXQucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eSh4bWwsICJhcHBsaWNhdGlvbi94bWwiKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIGNyLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiSkFYQkxpc3RSZXNvdXJjZSIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi94bWwiKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24veG1sIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpBWEJMaXN0UmVzb3VyY2UgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBMaXN0PEpheGJCZWFuPiBwb3N0KGZpbmFsIExpc3Q8SmF4YkJlYW4+IGwpIHsKKyAgICAgICAgICAgIHJldHVybiBsOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoInNldCIpCisgICAgICAgIHB1YmxpYyBTZXQ8SmF4YkJlYW4+IHBvc3RTZXQoZmluYWwgU2V0PEpheGJCZWFuPiBsKSB7CisgICAgICAgICAgICByZXR1cm4gbDsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJxdWV1ZSIpCisgICAgICAgIHB1YmxpYyBRdWV1ZTxKYXhiQmVhbj4gcG9zdFF1ZXVlKGZpbmFsIFF1ZXVlPEpheGJCZWFuPiBsKSB7CisgICAgICAgICAgICByZXR1cm4gbDsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJzdGFjayIpCisgICAgICAgIHB1YmxpYyBTdGFjazxKYXhiQmVhbj4gcG9zdFN0YWNrKGZpbmFsIFN0YWNrPEpheGJCZWFuPiBsKSB7CisgICAgICAgICAgICByZXR1cm4gbDsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJjdXN0b20iKQorICAgICAgICBwdWJsaWMgTXlBcnJheUxpc3Q8SmF4YkJlYW4+IHBvc3RDdXN0b20oZmluYWwgTXlBcnJheUxpc3Q8SmF4YkJlYW4+IGwpIHsKKyAgICAgICAgICAgIHJldHVybiBsOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgQ29sbGVjdGlvbjxKYXhiQmVhbj4gZ2V0KCkgeworICAgICAgICAgICAgZmluYWwgQXJyYXlMaXN0PEpheGJCZWFuPiBsID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICBsLmFkZChuZXcgSmF4YkJlYW4oIm9uZSIpKTsKKyAgICAgICAgICAgIGwuYWRkKG5ldyBKYXhiQmVhbigidHdvIikpOworICAgICAgICAgICAgbC5hZGQobmV3IEpheGJCZWFuKCJ0aHJlZSIpKTsKKyAgICAgICAgICAgIHJldHVybiBsOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoInR5cGUiKQorICAgICAgICBwdWJsaWMgTGlzdDxKYXhiQmVhbj4gcG9zdFR5cGUoZmluYWwgQ29sbGVjdGlvbjxKYXhiQmVhblR5cGU+IGwpIHsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8SmF4YkJlYW4+IGJlYW5zID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICBmb3IgKGZpbmFsIEpheGJCZWFuVHlwZSB0IDogbCkgeworICAgICAgICAgICAgICAgIGJlYW5zLmFkZChuZXcgSmF4YkJlYW4odC52YWx1ZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJlYW5zOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIkpBWEJBcnJheVJlc291cmNlIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3htbCIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi94bWwiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSkFYQkFycmF5UmVzb3VyY2UgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBKYXhiQmVhbltdIHBvc3QoZmluYWwgSmF4YkJlYW5bXSBsKSB7CisgICAgICAgICAgICByZXR1cm4gbDsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIEpheGJCZWFuW10gZ2V0KCkgeworICAgICAgICAgICAgZmluYWwgQXJyYXlMaXN0PEpheGJCZWFuPiBsID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICBsLmFkZChuZXcgSmF4YkJlYW4oIm9uZSIpKTsKKyAgICAgICAgICAgIGwuYWRkKG5ldyBKYXhiQmVhbigidHdvIikpOworICAgICAgICAgICAgbC5hZGQobmV3IEpheGJCZWFuKCJ0aHJlZSIpKTsKKyAgICAgICAgICAgIHJldHVybiBsLnRvQXJyYXkobmV3IEpheGJCZWFuW2wuc2l6ZSgpXSk7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgidHlwZSIpCisgICAgICAgIHB1YmxpYyBKYXhiQmVhbltdIHBvc3RUeXBlKGZpbmFsIEpheGJCZWFuVHlwZVtdIGwpIHsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8SmF4YkJlYW4+IGJlYW5zID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgICAgICBmb3IgKGZpbmFsIEpheGJCZWFuVHlwZSB0IDogbCkgeworICAgICAgICAgICAgICAgIGJlYW5zLmFkZChuZXcgSmF4YkJlYW4odC52YWx1ZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJlYW5zLnRvQXJyYXkobmV3IEpheGJCZWFuW2JlYW5zLnNpemUoKV0pOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQkFycmF5UmVwcmVzZW50YXRpb24oKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoIkpBWEJBcnJheVJlc291cmNlIik7CisKKyAgICAgICAgZmluYWwgSmF4YkJlYW5bXSBhID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoSmF4YkJlYW5bXS5jbGFzcyk7CisgICAgICAgIEpheGJCZWFuW10gYiA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KGEsICJhcHBsaWNhdGlvbi94bWwiKSwgSmF4YkJlYW5bXS5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhhLmxlbmd0aCwgYi5sZW5ndGgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhhW2ldLCBiW2ldKTsKKyAgICAgICAgfQorCisgICAgICAgIGIgPSB0YXJnZXQucGF0aCgidHlwZSIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoYSwgImFwcGxpY2F0aW9uL3htbCIpLCBKYXhiQmVhbltdLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGEubGVuZ3RoLCBiLmxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGFbaV0sIGJbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIkpBWEJMaXN0UmVzb3VyY2VNZWRpYVR5cGUiKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZm9vK3htbCIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9mb28reG1sIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpBWEJMaXN0UmVzb3VyY2VNZWRpYVR5cGUgZXh0ZW5kcyBKQVhCTGlzdFJlc291cmNlIHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKQVhCTGlzdFJlcHJlc2VudGF0aW9uTWVkaWFUeXBlKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJKQVhCTGlzdFJlc291cmNlTWVkaWFUeXBlIik7CisKKyAgICAgICAgQ29sbGVjdGlvbjxKYXhiQmVhbj4gYSA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KAorICAgICAgICAgICAgICAgIG5ldyBHZW5lcmljVHlwZTxDb2xsZWN0aW9uPEpheGJCZWFuPj4oKSB7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIENvbGxlY3Rpb248SmF4YkJlYW4+IGIgPSB0YXJnZXQucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eShuZXcgR2VuZXJpY0VudGl0eTxDb2xsZWN0aW9uPEpheGJCZWFuPj4oYSkge30sICJhcHBsaWNhdGlvbi9mb28reG1sIiksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgR2VuZXJpY1R5cGU8Q29sbGVjdGlvbjxKYXhiQmVhbj4+KCkge30pOworCisgICAgICAgIGFzc2VydEVxdWFscyhhLCBiKTsKKworICAgICAgICBiID0gdGFyZ2V0LnBhdGgoInR5cGUiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG5ldyBHZW5lcmljRW50aXR5PENvbGxlY3Rpb248SmF4YkJlYW4+PihhKSB7CisgICAgICAgIH0sICJhcHBsaWNhdGlvbi9mb28reG1sIiksIG5ldyBHZW5lcmljVHlwZTxDb2xsZWN0aW9uPEpheGJCZWFuPj4oKSB7CisgICAgICAgIH0pOworICAgICAgICBhc3NlcnRFcXVhbHMoYSwgYik7CisKKyAgICAgICAgYSA9IG5ldyBMaW5rZWRMaXN0PD4oYSk7CisgICAgICAgIGIgPSB0YXJnZXQucGF0aCgicXVldWUiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG5ldyBHZW5lcmljRW50aXR5PFF1ZXVlPEpheGJCZWFuPj4oKFF1ZXVlPEpheGJCZWFuPikgYSkgeworICAgICAgICB9LCAiYXBwbGljYXRpb24vZm9vK3htbCIpLCBuZXcgR2VuZXJpY1R5cGU8UXVldWU8SmF4YkJlYW4+PigpIHsKKyAgICAgICAgfSk7CisgICAgICAgIGFzc2VydEVxdWFscyhhLCBiKTsKKworICAgICAgICBhID0gbmV3IEhhc2hTZXQ8PihhKTsKKyAgICAgICAgYiA9IHRhcmdldC5wYXRoKCJzZXQiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG5ldyBHZW5lcmljRW50aXR5PFNldDxKYXhiQmVhbj4+KChTZXQ8SmF4YkJlYW4+KSBhKSB7CisgICAgICAgIH0sICJhcHBsaWNhdGlvbi9mb28reG1sIiksIG5ldyBHZW5lcmljVHlwZTxTZXQ8SmF4YkJlYW4+PigpIHsKKyAgICAgICAgfSk7CisgICAgICAgIGZpbmFsIENvbXBhcmF0b3I8SmF4YkJlYW4+IGMgPSBuZXcgQ29tcGFyYXRvcjxKYXhiQmVhbj4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShmaW5hbCBKYXhiQmVhbiB0LCBmaW5hbCBKYXhiQmVhbiB0MSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0LnZhbHVlLmNvbXBhcmVUbyh0MS52YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGZpbmFsIFRyZWVTZXQ8SmF4YkJlYW4+IHQxID0gbmV3IFRyZWVTZXQ8PihjKTsKKyAgICAgICAgZmluYWwgVHJlZVNldDxKYXhiQmVhbj4gdDIgPSBuZXcgVHJlZVNldDw+KGMpOworICAgICAgICB0MS5hZGRBbGwoYSk7CisgICAgICAgIHQyLmFkZEFsbChiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHQxLCB0Mik7CisKKyAgICAgICAgZmluYWwgU3RhY2s8SmF4YkJlYW4+IHMgPSBuZXcgU3RhY2s8PigpOworICAgICAgICBzLmFkZEFsbChhKTsKKyAgICAgICAgYiA9IHRhcmdldC5wYXRoKCJzdGFjayIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobmV3IEdlbmVyaWNFbnRpdHk8U3RhY2s8SmF4YkJlYW4+PihzKSB7CisgICAgICAgIH0sICJhcHBsaWNhdGlvbi9mb28reG1sIiksIG5ldyBHZW5lcmljVHlwZTxTdGFjazxKYXhiQmVhbj4+KCkgeworICAgICAgICB9KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHMsIGIpOworCisgICAgICAgIGEgPSBuZXcgTXlBcnJheUxpc3Q8PihhKTsKKyAgICAgICAgYiA9IHRhcmdldC5wYXRoKCJjdXN0b20iKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KG5ldyBHZW5lcmljRW50aXR5PE15QXJyYXlMaXN0PEpheGJCZWFuPj4oKE15QXJyYXlMaXN0PEpheGJCZWFuPikgYSkgeworICAgICAgICAgICAgICAgIH0sICJhcHBsaWNhdGlvbi9mb28reG1sIiksIG5ldyBHZW5lcmljVHlwZTxNeUFycmF5TGlzdDxKYXhiQmVhbj4+KCkgeworICAgICAgICAgICAgICAgIH0pOworICAgICAgICBhc3NlcnRFcXVhbHMoYSwgYik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SkFYQkxpc3RSZXByZXNlbnRhdGlvbkVycm9yKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJKQVhCTGlzdFJlc291cmNlIik7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIHhtbCA9ICI8cm9vdD48dmFsdWU+Zm9vIjsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgY3IgPSB0YXJnZXQucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eSh4bWwsICJhcHBsaWNhdGlvbi94bWwiKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIGNyLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiVW51c2VkRGVjbGFyYXRpb24iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2ltcGxlQmVhbiB7CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKyAgICAgICAgcHVibGljIFNpbXBsZUJlYW4oKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU2ltcGxlQmVhbihmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJVbnVzZWREZWNsYXJhdGlvbiIpCisgICAgQFhtbFJvb3RFbGVtZW50CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb21wbGV4SmF4YkJlYW4geworCisgICAgICAgIHByaXZhdGUgT2JqZWN0IHNpbXBsZUJlYW47CisKKyAgICAgICAgcHVibGljIENvbXBsZXhKYXhiQmVhbigpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb21wbGV4SmF4YkJlYW4oZmluYWwgT2JqZWN0IHNpbXBsZUJlYW4pIHsKKyAgICAgICAgICAgIHRoaXMuc2ltcGxlQmVhbiA9IHNpbXBsZUJlYW47CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFNpbXBsZUJlYW4oKSB7CisgICAgICAgICAgICByZXR1cm4gc2ltcGxlQmVhbjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFNpbXBsZUJlYW4oZmluYWwgT2JqZWN0IHNpbXBsZUJlYW4pIHsKKyAgICAgICAgICAgIHRoaXMuc2ltcGxlQmVhbiA9IHNpbXBsZUJlYW47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiQWRkaXRpb25hbENsYXNzZXNSZXNvdXJjZSIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi94bWwiKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24veG1sIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFkZGl0aW9uYWxDbGFzc2VzUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIENvbXBsZXhKYXhiQmVhbiBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENvbXBsZXhKYXhiQmVhbihuZXcgU2ltcGxlQmVhbigiZm9vIikpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWRkaXRpb25hbENsYXNzZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ29tcGxleEpheGJCZWFuIG5vbkpheGJCZWFuID0gdGFyZ2V0KCJBZGRpdGlvbmFsQ2xhc3Nlc1Jlc291cmNlIikucmVxdWVzdCgpLmdldChDb21wbGV4SmF4YkJlYW4uY2xhc3MpOworICAgICAgICBmaW5hbCBPYmplY3Qgc2ltcGxlQmVhbiA9IG5vbkpheGJCZWFuLmdldFNpbXBsZUJlYW4oKTsKKworICAgICAgICBhc3NlcnRUaGF0KHNpbXBsZUJlYW4sIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzaW1wbGVCZWFuLCBpbnN0YW5jZU9mKFNpbXBsZUJlYW4uY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgiZm9vIiwgZXF1YWxUbygoKFNpbXBsZUJlYW4pIHNpbXBsZUJlYW4pLmdldFZhbHVlKCkpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvRGVmYXVsdEZpbHRlcmluZ1Njb3BlLmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvRGVmYXVsdEZpbHRlcmluZ1Njb3BlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ2MzBiNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9EZWZhdWx0RmlsdGVyaW5nU2NvcGUuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkFubm90YXRpb25MaXRlcmFsOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLkVudGl0eUZpbHRlcmluZzsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIERlZmF1bHRGaWx0ZXJpbmdTY29wZSBleHRlbmRzIEFubm90YXRpb25MaXRlcmFsPEVudGl0eUZpbHRlcmluZz4gaW1wbGVtZW50cyBFbnRpdHlGaWx0ZXJpbmcgeworCisgICAgLyoqCisgICAgICogR2V0IGFuIGluc3RhbmNlIG9mIHtAbGluayBFbnRpdHlGaWx0ZXJpbmd9IGFubm90YXRpb24uCisgICAgICovCisgICAgcHVibGljIERlZmF1bHRGaWx0ZXJpbmdTY29wZSgpIHsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvRW1wdHlFbnRpdHlUZXN0LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvRW1wdHlFbnRpdHlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNjMzU2MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9FbXB0eUVudGl0eVRlc3QuamF2YQpAQCAtMCwwICsxLDg0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLkVudGl0eUZpbHRlcmluZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuZG9tYWluLkVtcHR5RW50aXR5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLmRvbWFpbi5Ob25FbXB0eUVudGl0eTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFVzZS1jYXNlcyB0byBjaGVjayB3aGV0aGVyIGVtcHR5IGNsYXNzIGNhdXNlcyBwcm9ibGVtcyAoSkVSU0VZLTI4MjQgcmVwcm9kdWNlcikuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBFbXB0eUVudGl0eVRlc3QgZXh0ZW5kcyBFbnRpdHlGaWx0ZXJpbmdUZXN0IHsKKworICAgIEBQYXRoKCIvIikKKyAgICBAQ29uc3VtZXMoImVudGl0eS9maWx0ZXJpbmciKQorICAgIEBQcm9kdWNlcygiZW50aXR5L2ZpbHRlcmluZyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQFBhdGgoIm5vbkVtcHR5RW50aXR5IikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgTm9uRW1wdHlFbnRpdHkgbm9uRW1wdHlFbnRpdHkoKSB7CisgICAgICAgICAgICByZXR1cm4gTm9uRW1wdHlFbnRpdHkuSU5TVEFOQ0U7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiZW1wdHlFbnRpdHkiKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBFbXB0eUVudGl0eSBlbXB0eUVudGl0eSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRW1wdHlFbnRpdHkoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5EVU1QX0VOVElUWSk7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZygpCisgICAgICAgICAgICAgICAgLy8gUmVzb3VyY2VzLgorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihSZXNvdXJjZS5jbGFzcykKKyAgICAgICAgICAgICAgICAvLyBQcm92aWRlcnMuCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKEVudGl0eUZpbHRlcmluZ0ZlYXR1cmUuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKEZpbHRlcmluZ01lc3NhZ2VCb2R5UHJvdmlkZXIuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vbkVtcHR5RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBmaWVsZHMgPSB0YXJnZXQoIm5vbkVtcHR5RW50aXR5IikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydFNhbWVGaWVsZHMoZmllbGRzLCAidmFsdWUiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUVudGl0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgZmllbGRzID0gdGFyZ2V0KCJlbXB0eUVudGl0eSIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRTYW1lRmllbGRzKGZpZWxkcywgIiIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9FbnRpdHlGaWx0ZXJpbmdDbGllbnRUZXN0LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvRW50aXR5RmlsdGVyaW5nQ2xpZW50VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MDUwMzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvRW50aXR5RmlsdGVyaW5nQ2xpZW50VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTgyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5DdXN0b21Bbm5vdGF0aW9uTGl0ZXJhbDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5FbnRpdHlGaWx0ZXJpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QudXRpbC5ydW5uZXIuQ29uY3VycmVudFJ1bm5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5kb21haW4uTWFueUZpbHRlcmluZ3NPbkNsYXNzRW50aXR5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLmRvbWFpbi5PbmVGaWx0ZXJpbmdPbkNsYXNzRW50aXR5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BSdW5XaXRoKENvbmN1cnJlbnRSdW5uZXIuY2xhc3MpCitwdWJsaWMgY2xhc3MgRW50aXR5RmlsdGVyaW5nQ2xpZW50VGVzdCBleHRlbmRzIEVudGl0eUZpbHRlcmluZ1Rlc3QgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBNZWRpYVR5cGUgRU5USVRZX0ZJTFRFUklORyA9IG5ldyBNZWRpYVR5cGUoImVudGl0eSIsICJmaWx0ZXJpbmciKTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5EVU1QX0VOVElUWSk7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZygpCisgICAgICAgICAgICAgICAgLy8gUmVzb3VyY2VzLgorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KGZpbmFsIENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKEVudGl0eUZpbHRlcmluZ0ZlYXR1cmUuY2xhc3MpLnJlZ2lzdGVyKEZpbHRlcmluZ01lc3NhZ2VCb2R5UHJvdmlkZXIuY2xhc3MpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBAQ29uc3VtZXMoImVudGl0eS9maWx0ZXJpbmciKQorICAgIEBQcm9kdWNlcygiZW50aXR5L2ZpbHRlcmluZyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0KGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW50aXR5QW5ub3RhdGlvbnNQcmltYXJ5VmlldygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgZmllbGRzID0gdGFyZ2V0KCkKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9uZUZpbHRlcmluZ09uQ2xhc3NFbnRpdHkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5USVRZX0ZJTFRFUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFubm90YXRpb25bXSB7UHJpbWFyeURldGFpbGVkVmlldy5GYWN0b3J5LmdldCgpfSksCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydFNhbWVGaWVsZHMoZmllbGRzLCAiZmllbGQsYWNjZXNzb3IscHJvcGVydHksc3ViRW50aXRpZXMuZmllbGQyLHN1YkVudGl0aWVzLnByb3BlcnR5MixzdWJFbnRpdGllcy5wcm9wZXJ0eTEsIgorICAgICAgICAgICAgICAgICsgInN1YkVudGl0aWVzLmZpZWxkMSxkZWZhdWx0RW50aXRpZXMuZmllbGQsZGVmYXVsdEVudGl0aWVzLnByb3BlcnR5Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW50aXR5QW5ub3RhdGlvbnNEZWZhdWx0VmlldygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgZmllbGRzID0gdGFyZ2V0KCkKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eShuZXcgT25lRmlsdGVyaW5nT25DbGFzc0VudGl0eSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTlRJVFlfRklMVEVSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQW5ub3RhdGlvbltdIHtuZXcgRGVmYXVsdEZpbHRlcmluZ1Njb3BlKCl9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChmaWVsZHMsIGVxdWFsVG8oIiIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbnRpdHlBbm5vdGF0aW9uc0ludmFsaWRWaWV3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBmaWVsZHMgPSB0YXJnZXQoKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgT25lRmlsdGVyaW5nT25DbGFzc0VudGl0eSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTlRJVFlfRklMVEVSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQW5ub3RhdGlvbltdIHtDdXN0b21Bbm5vdGF0aW9uTGl0ZXJhbC5JTlNUQU5DRX0pLAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRUaGF0KGZpZWxkcywgZXF1YWxUbygiIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbmZpZ3VyYXRpb25QcmltYXJ5VmlldygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0Q29uZmlndXJhdGlvbigiZmllbGQsYWNjZXNzb3IscHJvcGVydHksc3ViRW50aXRpZXMuZmllbGQyLHN1YkVudGl0aWVzLnByb3BlcnR5MixzdWJFbnRpdGllcy5wcm9wZXJ0eTEsIgorICAgICAgICAgICAgICAgICsgInN1YkVudGl0aWVzLmZpZWxkMSxkZWZhdWx0RW50aXRpZXMuZmllbGQsZGVmYXVsdEVudGl0aWVzLnByb3BlcnR5IiwgUHJpbWFyeURldGFpbGVkVmlldy5GYWN0b3J5LmdldCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25maWd1cmF0aW9uRGVmYXVsdFZpZXcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdENvbmZpZ3VyYXRpb24oIiIsIG5ldyBEZWZhdWx0RmlsdGVyaW5nU2NvcGUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uZmlndXJhdGlvbk11bHRpcGxlVmlld3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdENvbmZpZ3VyYXRpb24oImZpZWxkLGFjY2Vzc29yLHByb3BlcnR5LHN1YkVudGl0aWVzLmZpZWxkMixzdWJFbnRpdGllcy5wcm9wZXJ0eTIsc3ViRW50aXRpZXMucHJvcGVydHkxLCIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgInN1YkVudGl0aWVzLmZpZWxkMSxkZWZhdWx0RW50aXRpZXMuZmllbGQsZGVmYXVsdEVudGl0aWVzLnByb3BlcnR5IiwgUHJpbWFyeURldGFpbGVkVmlldy5GYWN0b3J5LmdldCgpLAorICAgICAgICAgICAgICAgIEN1c3RvbUFubm90YXRpb25MaXRlcmFsLklOU1RBTkNFKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdENvbmZpZ3VyYXRpb24oZmluYWwgU3RyaW5nIGV4cGVjdGVkLCBmaW5hbCBBbm5vdGF0aW9uLi4uIGFubm90YXRpb25zKSB7CisgICAgICAgIGZpbmFsIENsaWVudENvbmZpZyBjb25maWcgPSBuZXcgQ2xpZW50Q29uZmlnKCkKKyAgICAgICAgICAgICAgICAucHJvcGVydHkoRW50aXR5RmlsdGVyaW5nRmVhdHVyZS5FTlRJVFlfRklMVEVSSU5HX1NDT1BFLCBhbm5vdGF0aW9ucy5sZW5ndGggPT0gMSA/IGFubm90YXRpb25zWzBdIDogYW5ub3RhdGlvbnMpOworICAgICAgICBjb25maWd1cmVDbGllbnQoY29uZmlnKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgZmllbGRzID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoY29uZmlnKQorICAgICAgICAgICAgICAgIC50YXJnZXQoZ2V0QmFzZVVyaSgpKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KG5ldyBPbmVGaWx0ZXJpbmdPbkNsYXNzRW50aXR5KCksIEVOVElUWV9GSUxURVJJTkcpLCBTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydFNhbWVGaWVsZHMoZmllbGRzLCBleHBlY3RlZCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZENvbmZpZ3VyYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ2xpZW50Q29uZmlnIGNvbmZpZyA9IG5ldyBDbGllbnRDb25maWcoKQorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShFbnRpdHlGaWx0ZXJpbmdGZWF0dXJlLkVOVElUWV9GSUxURVJJTkdfU0NPUEUsICJpbnZhbGlkX3ZhbHVlIik7CisgICAgICAgIGNvbmZpZ3VyZUNsaWVudChjb25maWcpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBmaWVsZHMgPQorICAgICAgICAgICAgICAgIENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KGNvbmZpZykKKyAgICAgICAgICAgICAgICAgICAgICAgIC50YXJnZXQoZ2V0QmFzZVVyaSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eShuZXcgT25lRmlsdGVyaW5nT25DbGFzc0VudGl0eSgpLCBFTlRJVFlfRklMVEVSSU5HKSwgU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRUaGF0KGZpZWxkcywgZXF1YWxUbygiIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVudGl0eUFubm90YXRpb25zT3ZlckNvbmZpZ3VyYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ2xpZW50Q29uZmlnIGNvbmZpZyA9IG5ldyBDbGllbnRDb25maWcoKQorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShFbnRpdHlGaWx0ZXJpbmdGZWF0dXJlLkVOVElUWV9GSUxURVJJTkdfU0NPUEUsIFNlY29uZGFyeURldGFpbGVkVmlldy5GYWN0b3J5LmdldCgpKTsKKyAgICAgICAgY29uZmlndXJlQ2xpZW50KGNvbmZpZyk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGZpZWxkcyA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KGNvbmZpZykKKyAgICAgICAgICAgICAgICAudGFyZ2V0KGdldEJhc2VVcmkoKSkKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTlRJVFlfRklMVEVSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQW5ub3RhdGlvbltdIHtQcmltYXJ5RGV0YWlsZWRWaWV3LkZhY3RvcnkuZ2V0KCl9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0U2FtZUZpZWxkcyhmaWVsZHMsICJmaWVsZCxhY2Nlc3Nvcixwcm9wZXJ0eSxtYW55RW50aXRpZXMucHJvcGVydHkxLG1hbnlFbnRpdGllcy5maWVsZDEsb25lRW50aXRpZXMuZmllbGQyLCIKKyAgICAgICAgICAgICAgICArICJvbmVFbnRpdGllcy5wcm9wZXJ0eTIsb25lRW50aXRpZXMucHJvcGVydHkxLG9uZUVudGl0aWVzLmZpZWxkMSxkZWZhdWx0RW50aXRpZXMuZmllbGQsZGVmYXVsdEVudGl0aWVzIgorICAgICAgICAgICAgICAgICsgIi5wcm9wZXJ0eSIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9FbnRpdHlGaWx0ZXJpbmdPbkNsYXNzVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL0VudGl0eUZpbHRlcmluZ09uQ2xhc3NUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEyYzI0ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9FbnRpdHlGaWx0ZXJpbmdPbkNsYXNzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTc2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuRW50aXR5RmlsdGVyaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5kb21haW4uTWFueUZpbHRlcmluZ3NPbkNsYXNzRW50aXR5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLmRvbWFpbi5PbmVGaWx0ZXJpbmdPbkNsYXNzRW50aXR5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVXNlLWNhc2VzIHdpdGggZW50aXR5LWZpbHRlcmluZyBhbm5vdGF0aW9ucyBvbiBjbGFzcy4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEVudGl0eUZpbHRlcmluZ09uQ2xhc3NUZXN0IGV4dGVuZHMgRW50aXR5RmlsdGVyaW5nVGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworCisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoKQorICAgICAgICAgICAgICAgIC8vIFJlc291cmNlcy4KKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoUmVzb3VyY2UuY2xhc3MpCisgICAgICAgICAgICAgICAgLy8gUHJvdmlkZXJzLgorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihFbnRpdHlGaWx0ZXJpbmdGZWF0dXJlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihGaWx0ZXJpbmdNZXNzYWdlQm9keVByb3ZpZGVyLmNsYXNzKTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgQENvbnN1bWVzKCJlbnRpdHkvZmlsdGVyaW5nIikKKyAgICBAUHJvZHVjZXMoImVudGl0eS9maWx0ZXJpbmciKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIk9uZUZpbHRlcmluZ0VudGl0eSIpCisgICAgICAgIEBQcmltYXJ5RGV0YWlsZWRWaWV3CisgICAgICAgIHB1YmxpYyBPbmVGaWx0ZXJpbmdPbkNsYXNzRW50aXR5IGdldE9uZUZpbHRlcmluZ0VudGl0eSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgT25lRmlsdGVyaW5nT25DbGFzc0VudGl0eSgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiT25lRmlsdGVyaW5nRW50aXR5RGVmYXVsdFZpZXciKQorICAgICAgICBwdWJsaWMgT25lRmlsdGVyaW5nT25DbGFzc0VudGl0eSBnZXRPbmVGaWx0ZXJpbmdFbnRpdHlEZWZhdWx0VmlldygpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgT25lRmlsdGVyaW5nT25DbGFzc0VudGl0eSgpOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoIk9uZUZpbHRlcmluZ0VudGl0eSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdE9uZUZpbHRlcmluZ0VudGl0eShmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIk9uZUZpbHRlcmluZ0VudGl0eURlZmF1bHRWaWV3UmVzcG9uc2UiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0T25lRmlsdGVyaW5nRW50aXR5RGVmYXVsdFZpZXdSZXNwb25zZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygpLmVudGl0eShuZXcgT25lRmlsdGVyaW5nT25DbGFzc0VudGl0eSgpLCBuZXcgQW5ub3RhdGlvbltdIHtuZXcgRGVmYXVsdEZpbHRlcmluZ1Njb3BlKCl9KS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiTWFueUZpbHRlcmluZ3NFbnRpdHlQcmltYXJ5VmlldyIpCisgICAgICAgIEBQcmltYXJ5RGV0YWlsZWRWaWV3CisgICAgICAgIHB1YmxpYyBNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkgZ2V0TWFueUZpbHRlcmluZ3NFbnRpdHlQcmltYXJ5VmlldygpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTWFueUZpbHRlcmluZ3NPbkNsYXNzRW50aXR5KCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJNYW55RmlsdGVyaW5nc0VudGl0eVNlY29uZGFyeVZpZXciKQorICAgICAgICBAU2Vjb25kYXJ5RGV0YWlsZWRWaWV3CisgICAgICAgIHB1YmxpYyBNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkgZ2V0TWFueUZpbHRlcmluZ3NFbnRpdHlTZWNvbmRhcnlWaWV3KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIk1hbnlGaWx0ZXJpbmdzRW50aXR5RGVmYXVsdFZpZXciKQorICAgICAgICBwdWJsaWMgTWFueUZpbHRlcmluZ3NPbkNsYXNzRW50aXR5IGdldE1hbnlGaWx0ZXJpbmdzRW50aXR5RGVmYXVsdFZpZXcoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eSgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiTWFueUZpbHRlcmluZ3NFbnRpdHlNYW55Vmlld3MiKQorICAgICAgICBAUHJpbWFyeURldGFpbGVkVmlldworICAgICAgICBAU2Vjb25kYXJ5RGV0YWlsZWRWaWV3CisgICAgICAgIHB1YmxpYyBNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkgZ2V0TWFueUZpbHRlcmluZ3NFbnRpdHlNYW55Vmlld3MoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25lRW50aXR5RmlsdGVyaW5nT25DbGFzcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgZmllbGRzID0gdGFyZ2V0KCJPbmVGaWx0ZXJpbmdFbnRpdHkiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0U2FtZUZpZWxkcyhmaWVsZHMsICJmaWVsZCxhY2Nlc3Nvcixwcm9wZXJ0eSxzdWJFbnRpdGllcy5maWVsZDIsc3ViRW50aXRpZXMucHJvcGVydHkyLHN1YkVudGl0aWVzLnByb3BlcnR5MSwiCisgICAgICAgICAgICAgICAgKyAic3ViRW50aXRpZXMuZmllbGQxLGRlZmF1bHRFbnRpdGllcy5maWVsZCxkZWZhdWx0RW50aXRpZXMucHJvcGVydHkiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPbmVFbnRpdHlGaWx0ZXJpbmdPbkNsYXNzRGVmYXVsdFZpZXdSZXNwb25zZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgZmllbGRzID0gdGFyZ2V0KCJPbmVGaWx0ZXJpbmdFbnRpdHlEZWZhdWx0Vmlld1Jlc3BvbnNlIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydFNhbWVGaWVsZHMoZmllbGRzLCAiIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25lRW50aXR5RmlsdGVyaW5nT25DbGFzc0RlZmF1bHRWaWV3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBmaWVsZHMgPSB0YXJnZXQoIk9uZUZpbHRlcmluZ0VudGl0eURlZmF1bHRWaWV3IikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydFNhbWVGaWVsZHMoZmllbGRzLCAiIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVWaWV3c09uQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdE9uZUVudGl0eUZpbHRlcmluZ09uQ2xhc3MoKTsKKyAgICAgICAgdGVzdE9uZUVudGl0eUZpbHRlcmluZ09uQ2xhc3NEZWZhdWx0VmlldygpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hbnlGaWx0ZXJpbmdzRW50aXR5UHJpbWFyeVZpZXcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGZpZWxkcyA9IHRhcmdldCgiTWFueUZpbHRlcmluZ3NFbnRpdHlQcmltYXJ5VmlldyIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRTYW1lRmllbGRzKGZpZWxkcywgImZpZWxkLGFjY2Vzc29yLHByb3BlcnR5LG1hbnlFbnRpdGllcy5wcm9wZXJ0eTEsbWFueUVudGl0aWVzLmZpZWxkMSxvbmVFbnRpdGllcy5maWVsZDIsIgorICAgICAgICAgICAgICAgICsgIm9uZUVudGl0aWVzLnByb3BlcnR5MixvbmVFbnRpdGllcy5wcm9wZXJ0eTEsb25lRW50aXRpZXMuZmllbGQxLGRlZmF1bHRFbnRpdGllcy5maWVsZCxkZWZhdWx0RW50aXRpZXMiCisgICAgICAgICAgICAgICAgKyAiLnByb3BlcnR5Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFueUZpbHRlcmluZ3NFbnRpdHlTZWNvbmRhcnlWaWV3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBmaWVsZHMgPSB0YXJnZXQoIk1hbnlGaWx0ZXJpbmdzRW50aXR5U2Vjb25kYXJ5VmlldyIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRTYW1lRmllbGRzKGZpZWxkcywgImZpZWxkLGFjY2Vzc29yLHByb3BlcnR5LG1hbnlFbnRpdGllcy5maWVsZDIsbWFueUVudGl0aWVzLnByb3BlcnR5MixtYW55RW50aXRpZXMuZmllbGQxLCIKKyAgICAgICAgICAgICAgICArICJvbmVFbnRpdGllcy5wcm9wZXJ0eTIsb25lRW50aXRpZXMuZmllbGQxLGRlZmF1bHRFbnRpdGllcy5maWVsZCxkZWZhdWx0RW50aXRpZXMucHJvcGVydHkiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYW55RmlsdGVyaW5nc0VudGl0eURlZmF1bHRWaWV3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBmaWVsZHMgPSB0YXJnZXQoIk1hbnlGaWx0ZXJpbmdzRW50aXR5RGVmYXVsdFZpZXciKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0U2FtZUZpZWxkcyhmaWVsZHMsICIiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYW55RmlsdGVyaW5nc0VudGl0eU1hbnlWaWV3cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgZmllbGRzID0gdGFyZ2V0KCJNYW55RmlsdGVyaW5nc0VudGl0eU1hbnlWaWV3cyIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRTYW1lRmllbGRzKGZpZWxkcywgImZpZWxkLGFjY2Vzc29yLHByb3BlcnR5LG1hbnlFbnRpdGllcy5maWVsZDIsbWFueUVudGl0aWVzLnByb3BlcnR5MixtYW55RW50aXRpZXMucHJvcGVydHkxLCIKKyAgICAgICAgICAgICAgICArICJtYW55RW50aXRpZXMuZmllbGQxLG9uZUVudGl0aWVzLmZpZWxkMixvbmVFbnRpdGllcy5wcm9wZXJ0eTIsb25lRW50aXRpZXMucHJvcGVydHkxLG9uZUVudGl0aWVzLmZpZWxkMSwiCisgICAgICAgICAgICAgICAgKyAiZGVmYXVsdEVudGl0aWVzLmZpZWxkLGRlZmF1bHRFbnRpdGllcy5wcm9wZXJ0eSIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9FbnRpdHlGaWx0ZXJpbmdPblByb3BlcnRpZXNUZXN0LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvRW50aXR5RmlsdGVyaW5nT25Qcm9wZXJ0aWVzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNjAzYWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvRW50aXR5RmlsdGVyaW5nT25Qcm9wZXJ0aWVzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTcwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuRW50aXR5RmlsdGVyaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5kb21haW4uTWFueUZpbHRlcmluZ3NPblByb3BlcnRpZXNFbnRpdHk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuZG9tYWluLk9uZUZpbHRlcmluZ09uUHJvcGVydGllc0VudGl0eTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFVzZS1jYXNlcyB3aXRoIGVudGl0eS1maWx0ZXJpbmcgYW5ub3RhdGlvbnMgb24gcHJvcGVydGllcy4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEVudGl0eUZpbHRlcmluZ09uUHJvcGVydGllc1Rlc3QgZXh0ZW5kcyBFbnRpdHlGaWx0ZXJpbmdUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5EVU1QX0VOVElUWSk7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZygpCisgICAgICAgICAgICAgICAgLy8gUmVzb3VyY2VzLgorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihSZXNvdXJjZS5jbGFzcykKKyAgICAgICAgICAgICAgICAvLyBQcm92aWRlcnMuCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKEVudGl0eUZpbHRlcmluZ0ZlYXR1cmUuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKEZpbHRlcmluZ01lc3NhZ2VCb2R5UHJvdmlkZXIuY2xhc3MpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBAQ29uc3VtZXMoImVudGl0eS9maWx0ZXJpbmciKQorICAgIEBQcm9kdWNlcygiZW50aXR5L2ZpbHRlcmluZyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiT25lRmlsdGVyaW5nRW50aXR5IikKKyAgICAgICAgQFByaW1hcnlEZXRhaWxlZFZpZXcKKyAgICAgICAgcHVibGljIE9uZUZpbHRlcmluZ09uUHJvcGVydGllc0VudGl0eSBnZXRPbmVGaWx0ZXJpbmdFbnRpdHkoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE9uZUZpbHRlcmluZ09uUHJvcGVydGllc0VudGl0eSgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiT25lRmlsdGVyaW5nRW50aXR5RGVmYXVsdFZpZXciKQorICAgICAgICBwdWJsaWMgT25lRmlsdGVyaW5nT25Qcm9wZXJ0aWVzRW50aXR5IGdldE9uZUZpbHRlcmluZ0VudGl0eURlZmF1bHRWaWV3KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBPbmVGaWx0ZXJpbmdPblByb3BlcnRpZXNFbnRpdHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJPbmVGaWx0ZXJpbmdFbnRpdHkiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3RPbmVGaWx0ZXJpbmdFbnRpdHkoZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJPbmVGaWx0ZXJpbmdFbnRpdHlEZWZhdWx0Vmlld1Jlc3BvbnNlIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldE9uZUZpbHRlcmluZ0VudGl0eURlZmF1bHRWaWV3UmVzcG9uc2UoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soKS5lbnRpdHkobmV3IE9uZUZpbHRlcmluZ09uUHJvcGVydGllc0VudGl0eSgpLCBuZXcgQW5ub3RhdGlvbltdIHtuZXcgRGVmYXVsdEZpbHRlcmluZ1Njb3BlKCl9KQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIk1hbnlGaWx0ZXJpbmdzRW50aXR5UHJpbWFyeVZpZXciKQorICAgICAgICBAUHJpbWFyeURldGFpbGVkVmlldworICAgICAgICBwdWJsaWMgTWFueUZpbHRlcmluZ3NPblByb3BlcnRpZXNFbnRpdHkgZ2V0TWFueUZpbHRlcmluZ3NFbnRpdHlQcmltYXJ5VmlldygpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTWFueUZpbHRlcmluZ3NPblByb3BlcnRpZXNFbnRpdHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIk1hbnlGaWx0ZXJpbmdzRW50aXR5U2Vjb25kYXJ5VmlldyIpCisgICAgICAgIEBTZWNvbmRhcnlEZXRhaWxlZFZpZXcKKyAgICAgICAgcHVibGljIE1hbnlGaWx0ZXJpbmdzT25Qcm9wZXJ0aWVzRW50aXR5IGdldE1hbnlGaWx0ZXJpbmdzRW50aXR5U2Vjb25kYXJ5VmlldygpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTWFueUZpbHRlcmluZ3NPblByb3BlcnRpZXNFbnRpdHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIk1hbnlGaWx0ZXJpbmdzRW50aXR5RGVmYXVsdFZpZXciKQorICAgICAgICBwdWJsaWMgTWFueUZpbHRlcmluZ3NPblByb3BlcnRpZXNFbnRpdHkgZ2V0TWFueUZpbHRlcmluZ3NFbnRpdHlEZWZhdWx0VmlldygpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTWFueUZpbHRlcmluZ3NPblByb3BlcnRpZXNFbnRpdHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIk1hbnlGaWx0ZXJpbmdzRW50aXR5TWFueVZpZXdzIikKKyAgICAgICAgQFByaW1hcnlEZXRhaWxlZFZpZXcKKyAgICAgICAgQFNlY29uZGFyeURldGFpbGVkVmlldworICAgICAgICBwdWJsaWMgTWFueUZpbHRlcmluZ3NPblByb3BlcnRpZXNFbnRpdHkgZ2V0TWFueUZpbHRlcmluZ3NFbnRpdHlNYW55Vmlld3MoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE1hbnlGaWx0ZXJpbmdzT25Qcm9wZXJ0aWVzRW50aXR5KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPbmVFbnRpdHlGaWx0ZXJpbmdPblByb3BlcnRpZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGZpZWxkcyA9IHRhcmdldCgiT25lRmlsdGVyaW5nRW50aXR5IikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydFNhbWVGaWVsZHMoZmllbGRzLCAiZmllbGQsYWNjZXNzb3IscHJvcGVydHksc3ViRW50aXRpZXMuZmllbGQyLHN1YkVudGl0aWVzLnByb3BlcnR5MixzdWJFbnRpdGllcy5wcm9wZXJ0eTEsIgorICAgICAgICAgICAgICAgICsgInN1YkVudGl0aWVzLmZpZWxkMSxkZWZhdWx0RW50aXRpZXMuZmllbGQsZGVmYXVsdEVudGl0aWVzLnByb3BlcnR5Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25lRW50aXR5RmlsdGVyaW5nT25Qcm9wZXJ0aWVzRGVmYXVsdFZpZXdSZXNwb25zZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgZmllbGRzID0gdGFyZ2V0KCJPbmVGaWx0ZXJpbmdFbnRpdHlEZWZhdWx0Vmlld1Jlc3BvbnNlIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydFNhbWVGaWVsZHMoZmllbGRzLCAiZmllbGQiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPbmVFbnRpdHlGaWx0ZXJpbmdPblByb3BlcnRpZXNEZWZhdWx0VmlldygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgZmllbGRzID0gdGFyZ2V0KCJPbmVGaWx0ZXJpbmdFbnRpdHlEZWZhdWx0VmlldyIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRTYW1lRmllbGRzKGZpZWxkcywgImZpZWxkIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFueUZpbHRlcmluZ3NFbnRpdHlQcmltYXJ5VmlldygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgZmllbGRzID0gdGFyZ2V0KCJNYW55RmlsdGVyaW5nc0VudGl0eVByaW1hcnlWaWV3IikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydFNhbWVGaWVsZHMoZmllbGRzLCAiZmllbGQsYWNjZXNzb3IscHJvcGVydHksb25lRW50aXRpZXMuZmllbGQyLG9uZUVudGl0aWVzLnByb3BlcnR5MixvbmVFbnRpdGllcy5wcm9wZXJ0eTEsIgorICAgICAgICAgICAgICAgICsgIm9uZUVudGl0aWVzLmZpZWxkMSxkZWZhdWx0RW50aXRpZXMuZmllbGQsZGVmYXVsdEVudGl0aWVzLnByb3BlcnR5Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFueUZpbHRlcmluZ3NFbnRpdHlTZWNvbmRhcnlWaWV3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBmaWVsZHMgPSB0YXJnZXQoIk1hbnlGaWx0ZXJpbmdzRW50aXR5U2Vjb25kYXJ5VmlldyIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRTYW1lRmllbGRzKGZpZWxkcywgImZpZWxkLGFjY2Vzc29yLHByb3BlcnR5LG1hbnlFbnRpdGllcy5maWVsZDIsbWFueUVudGl0aWVzLnByb3BlcnR5MixtYW55RW50aXRpZXMuZmllbGQxLCIKKyAgICAgICAgICAgICAgICArICJvbmVFbnRpdGllcy5wcm9wZXJ0eTIsb25lRW50aXRpZXMuZmllbGQxIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFueUZpbHRlcmluZ3NFbnRpdHlEZWZhdWx0VmlldygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgZmllbGRzID0gdGFyZ2V0KCJNYW55RmlsdGVyaW5nc0VudGl0eURlZmF1bHRWaWV3IikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydFNhbWVGaWVsZHMoZmllbGRzLCAiZmllbGQsYWNjZXNzb3IiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYW55RmlsdGVyaW5nc0VudGl0eU1hbnlWaWV3cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgZmllbGRzID0gdGFyZ2V0KCJNYW55RmlsdGVyaW5nc0VudGl0eU1hbnlWaWV3cyIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRTYW1lRmllbGRzKGZpZWxkcywgImZpZWxkLGFjY2Vzc29yLHByb3BlcnR5LG1hbnlFbnRpdGllcy5maWVsZDIsbWFueUVudGl0aWVzLnByb3BlcnR5MixtYW55RW50aXRpZXMucHJvcGVydHkxLCIKKyAgICAgICAgICAgICAgICArICJtYW55RW50aXRpZXMuZmllbGQxLG9uZUVudGl0aWVzLmZpZWxkMixvbmVFbnRpdGllcy5wcm9wZXJ0eTIsb25lRW50aXRpZXMucHJvcGVydHkxLG9uZUVudGl0aWVzLmZpZWxkMSwiCisgICAgICAgICAgICAgICAgKyAiZGVmYXVsdEVudGl0aWVzLmZpZWxkLGRlZmF1bHRFbnRpdGllcy5wcm9wZXJ0eSIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9FbnRpdHlGaWx0ZXJpbmdTY29wZXNUZXN0LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvRW50aXR5RmlsdGVyaW5nU2NvcGVzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmOTEwZmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvRW50aXR5RmlsdGVyaW5nU2NvcGVzVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmc7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuRW50aXR5RmlsdGVyaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuZG9tYWluLkNvbXBsZXhFbnRpdHk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgRW50aXR5RmlsdGVyaW5nU2NvcGVzVGVzdCBleHRlbmRzIEVudGl0eUZpbHRlcmluZ1Rlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKTsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKCkKKyAgICAgICAgICAgICAgICAvLyBSZXNvdXJjZXMuCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKFJlc291cmNlLmNsYXNzKQorICAgICAgICAgICAgICAgIC8vIFByb3ZpZGVycy4KKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoRW50aXR5RmlsdGVyaW5nRmVhdHVyZS5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoRmlsdGVyaW5nTWVzc2FnZUJvZHlQcm92aWRlci5jbGFzcyk7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIEBDb25zdW1lcygiZW50aXR5L2ZpbHRlcmluZyIpCisgICAgQFByb2R1Y2VzKCJlbnRpdHkvZmlsdGVyaW5nIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcmltYXJ5RGV0YWlsZWRWaWV3CisgICAgICAgIHB1YmxpYyBDb21wbGV4RW50aXR5IGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgQ29tcGxleEVudGl0eSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbWFyeSAtPiBEZWZhdWx0IC0+IFByaW1hcnkuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW50aXR5RmlsdGVyaW5nU2NvcGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBmaWVsZHMgPSB0YXJnZXQoKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0U2FtZUZpZWxkcyhmaWVsZHMsICJhY2Nlc3Nvcixwcm9wZXJ0eSxmaWVsZC5maWVsZCxmaWVsZC5hY2Nlc3NvcixmaWVsZC5wcm9wZXJ0eS5hY2Nlc3NvcixmaWVsZC5wcm9wZXJ0eS5wcm9wZXJ0eSIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9FbnRpdHlGaWx0ZXJpbmdTZXJ2ZXJUZXN0LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvRW50aXR5RmlsdGVyaW5nU2VydmVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkODMwM2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvRW50aXR5RmlsdGVyaW5nU2VydmVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjI0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLkVudGl0eUZpbHRlcmluZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuZG9tYWluLk1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5TdWl0ZTsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFJ1bldpdGgoU3VpdGUuY2xhc3MpCitAU3VpdGUuU3VpdGVDbGFzc2VzKHsKKyAgICAgICAgRW50aXR5RmlsdGVyaW5nU2VydmVyVGVzdC5Db25maWd1cmF0aW9uU2VydmVyVGVzdC5jbGFzcywKKyAgICAgICAgRW50aXR5RmlsdGVyaW5nU2VydmVyVGVzdC5Db25maWd1cmF0aW9uRGVmYXVsdFZpZXdTZXJ2ZXJUZXN0LmNsYXNzLAorICAgICAgICBFbnRpdHlGaWx0ZXJpbmdTZXJ2ZXJUZXN0LkFubm90YXRpb25zU2VydmVyVGVzdC5jbGFzcywKKyAgICAgICAgRW50aXR5RmlsdGVyaW5nU2VydmVyVGVzdC5Bbm5vdGF0aW9uc092ZXJDb25maWd1cmF0aW9uU2VydmVyVGVzdC5jbGFzcworfSkKK3B1YmxpYyBjbGFzcyBFbnRpdHlGaWx0ZXJpbmdTZXJ2ZXJUZXN0IHsKKworICAgIEBQYXRoKCIvIikKKyAgICBAUHJvZHVjZXMoImVudGl0eS9maWx0ZXJpbmciKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImNvbmZpZ3VyYXRpb24iKQorICAgICAgICBwdWJsaWMgTWFueUZpbHRlcmluZ3NPbkNsYXNzRW50aXR5IGdldENvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eSgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiY29uZmlndXJhdGlvbk92ZXJSZXNvdXJjZSIpCisgICAgICAgIEBTZWNvbmRhcnlEZXRhaWxlZFZpZXcKKyAgICAgICAgcHVibGljIE1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eSBnZXRDb25maWd1cmF0aW9uT3ZlclJlc291cmNlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImFubm90YXRpb25zIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldEFubm90YXRpb25zKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlCisgICAgICAgICAgICAgICAgICAgIC5vaygpCisgICAgICAgICAgICAgICAgICAgIC5lbnRpdHkobmV3IE1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eSgpLCBuZXcgQW5ub3RhdGlvbltdIHtQcmltYXJ5RGV0YWlsZWRWaWV3LkZhY3RvcnkuZ2V0KCl9KQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImFubm90YXRpb25zT3ZlckNvbmZpZ3VyYXRpb24iKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0QW5ub3RhdGlvbnNPdmVyQ29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZQorICAgICAgICAgICAgICAgICAgICAub2soKQorICAgICAgICAgICAgICAgICAgICAuZW50aXR5KG5ldyBNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkoKSwgbmV3IEFubm90YXRpb25bXSB7UHJpbWFyeURldGFpbGVkVmlldy5GYWN0b3J5LmdldCgpfSkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJhbm5vdGF0aW9uc092ZXJSZXNvdXJjZSIpCisgICAgICAgIEBTZWNvbmRhcnlEZXRhaWxlZFZpZXcKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldEFubm90YXRpb25zT3ZlclJlc291cmNlKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlCisgICAgICAgICAgICAgICAgICAgIC5vaygpCisgICAgICAgICAgICAgICAgICAgIC5lbnRpdHkobmV3IE1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eSgpLCBuZXcgQW5ub3RhdGlvbltdIHtQcmltYXJ5RGV0YWlsZWRWaWV3LkZhY3RvcnkuZ2V0KCl9KQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImFubm90YXRpb25zT3ZlckNvbmZpZ3VyYXRpb25PdmVyUmVzb3VyY2UiKQorICAgICAgICBAU2Vjb25kYXJ5RGV0YWlsZWRWaWV3CisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXRBbm5vdGF0aW9uc092ZXJDb25maWd1cmF0aW9uT3ZlclJlc291cmNlKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlCisgICAgICAgICAgICAgICAgICAgIC5vaygpCisgICAgICAgICAgICAgICAgICAgIC5lbnRpdHkobmV3IE1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eSgpLCBuZXcgQW5ub3RhdGlvbltdIHtQcmltYXJ5RGV0YWlsZWRWaWV3LkZhY3RvcnkuZ2V0KCl9KQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEZpbHRlcmluZ1Jlc291cmNlQ29uZmlnIGV4dGVuZHMgUmVzb3VyY2VDb25maWcgeworCisgICAgICAgIHByaXZhdGUgRmlsdGVyaW5nUmVzb3VyY2VDb25maWcoKSB7CisgICAgICAgICAgICAvLyBSZXNvdXJjZXMuCisgICAgICAgICAgICByZWdpc3RlcihSZXNvdXJjZS5jbGFzcyk7CisKKyAgICAgICAgICAgIC8vIFByb3ZpZGVycy4KKyAgICAgICAgICAgIHJlZ2lzdGVyKEVudGl0eUZpbHRlcmluZ0ZlYXR1cmUuY2xhc3MpOworICAgICAgICAgICAgcmVnaXN0ZXIoRmlsdGVyaW5nTWVzc2FnZUJvZHlQcm92aWRlci5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbmZpZ3VyYXRpb25TZXJ2ZXJUZXN0IGV4dGVuZHMgRW50aXR5RmlsdGVyaW5nVGVzdCB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworICAgICAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWx0ZXJpbmdSZXNvdXJjZUNvbmZpZygpCisgICAgICAgICAgICAgICAgICAgIC8vIFByb3BlcnRpZXMKKyAgICAgICAgICAgICAgICAgICAgLnByb3BlcnR5KEVudGl0eUZpbHRlcmluZ0ZlYXR1cmUuRU5USVRZX0ZJTFRFUklOR19TQ09QRSwgUHJpbWFyeURldGFpbGVkVmlldy5GYWN0b3J5LmdldCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RDb25maWd1cmF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZmllbGRzID0gdGFyZ2V0KCJjb25maWd1cmF0aW9uIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworCisgICAgICAgICAgICBhc3NlcnRTYW1lRmllbGRzKGZpZWxkcywgImZpZWxkLGFjY2Vzc29yLHByb3BlcnR5LG1hbnlFbnRpdGllcy5wcm9wZXJ0eTEsbWFueUVudGl0aWVzLmZpZWxkMSxvbmVFbnRpdGllcy5maWVsZDIsIgorICAgICAgICAgICAgICAgICAgICArICJvbmVFbnRpdGllcy5wcm9wZXJ0eTIsb25lRW50aXRpZXMucHJvcGVydHkxLG9uZUVudGl0aWVzLmZpZWxkMSxkZWZhdWx0RW50aXRpZXMuZmllbGQsZGVmYXVsdEVudGl0aWVzIgorICAgICAgICAgICAgICAgICAgICArICIucHJvcGVydHkiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RDb25maWd1cmF0aW9uT3ZlclJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZmllbGRzID0gdGFyZ2V0KCJjb25maWd1cmF0aW9uT3ZlclJlc291cmNlIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworCisgICAgICAgICAgICBhc3NlcnRTYW1lRmllbGRzKGZpZWxkcywgImZpZWxkLGFjY2Vzc29yLHByb3BlcnR5LG1hbnlFbnRpdGllcy5wcm9wZXJ0eTEsbWFueUVudGl0aWVzLmZpZWxkMSxvbmVFbnRpdGllcy5maWVsZDIsIgorICAgICAgICAgICAgICAgICAgICArICJvbmVFbnRpdGllcy5wcm9wZXJ0eTIsb25lRW50aXRpZXMucHJvcGVydHkxLG9uZUVudGl0aWVzLmZpZWxkMSxkZWZhdWx0RW50aXRpZXMuZmllbGQsZGVmYXVsdEVudGl0aWVzIgorICAgICAgICAgICAgICAgICAgICArICIucHJvcGVydHkiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29uZmlndXJhdGlvbkRlZmF1bHRWaWV3U2VydmVyVGVzdCBleHRlbmRzIEVudGl0eUZpbHRlcmluZ1Rlc3QgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKTsKKyAgICAgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgRmlsdGVyaW5nUmVzb3VyY2VDb25maWcoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RDb25maWd1cmF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZmllbGRzID0gdGFyZ2V0KCJjb25maWd1cmF0aW9uIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworCisgICAgICAgICAgICBhc3NlcnRTYW1lRmllbGRzKGZpZWxkcywgIiIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBbm5vdGF0aW9uc1NlcnZlclRlc3QgZXh0ZW5kcyBFbnRpdHlGaWx0ZXJpbmdUZXN0IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5EVU1QX0VOVElUWSk7CisgICAgICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworCisgICAgICAgICAgICByZXR1cm4gbmV3IEZpbHRlcmluZ1Jlc291cmNlQ29uZmlnKCk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmaWVsZHMgPSB0YXJnZXQoImFubm90YXRpb25zIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworCisgICAgICAgICAgICBhc3NlcnRTYW1lRmllbGRzKGZpZWxkcywgImZpZWxkLGFjY2Vzc29yLHByb3BlcnR5LG1hbnlFbnRpdGllcy5wcm9wZXJ0eTEsbWFueUVudGl0aWVzLmZpZWxkMSxvbmVFbnRpdGllcy5maWVsZDIsIgorICAgICAgICAgICAgICAgICAgICArICJvbmVFbnRpdGllcy5wcm9wZXJ0eTIsb25lRW50aXRpZXMucHJvcGVydHkxLG9uZUVudGl0aWVzLmZpZWxkMSxkZWZhdWx0RW50aXRpZXMuZmllbGQsZGVmYXVsdEVudGl0aWVzIgorICAgICAgICAgICAgICAgICAgICArICIucHJvcGVydHkiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uc092ZXJSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZpZWxkcyA9IHRhcmdldCgiYW5ub3RhdGlvbnNPdmVyUmVzb3VyY2UiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgICAgIGFzc2VydFNhbWVGaWVsZHMoZmllbGRzLCAiZmllbGQsYWNjZXNzb3IscHJvcGVydHksbWFueUVudGl0aWVzLnByb3BlcnR5MSxtYW55RW50aXRpZXMuZmllbGQxLG9uZUVudGl0aWVzLmZpZWxkMiwiCisgICAgICAgICAgICAgICAgICAgICsgIm9uZUVudGl0aWVzLnByb3BlcnR5MixvbmVFbnRpdGllcy5wcm9wZXJ0eTEsb25lRW50aXRpZXMuZmllbGQxLGRlZmF1bHRFbnRpdGllcy5maWVsZCxkZWZhdWx0RW50aXRpZXMiCisgICAgICAgICAgICAgICAgICAgICsgIi5wcm9wZXJ0eSIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBbm5vdGF0aW9uc092ZXJDb25maWd1cmF0aW9uU2VydmVyVGVzdCBleHRlbmRzIEVudGl0eUZpbHRlcmluZ1Rlc3QgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKTsKKyAgICAgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisKKyAgICAgICAgICAgIHJldHVybiBuZXcgRmlsdGVyaW5nUmVzb3VyY2VDb25maWcoKQorICAgICAgICAgICAgICAgICAgICAvLyBQcm9wZXJ0aWVzCisgICAgICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShFbnRpdHlGaWx0ZXJpbmdGZWF0dXJlLkVOVElUWV9GSUxURVJJTkdfU0NPUEUsIG5ldyBEZWZhdWx0RmlsdGVyaW5nU2NvcGUoKSk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbnNPdmVyQ29uZmlndXJhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZpZWxkcyA9IHRhcmdldCgiYW5ub3RhdGlvbnNPdmVyQ29uZmlndXJhdGlvbiIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICAgICAgYXNzZXJ0U2FtZUZpZWxkcyhmaWVsZHMsICJmaWVsZCxhY2Nlc3Nvcixwcm9wZXJ0eSxtYW55RW50aXRpZXMucHJvcGVydHkxLG1hbnlFbnRpdGllcy5maWVsZDEsb25lRW50aXRpZXMuZmllbGQyLCIKKyAgICAgICAgICAgICAgICAgICAgKyAib25lRW50aXRpZXMucHJvcGVydHkyLG9uZUVudGl0aWVzLnByb3BlcnR5MSxvbmVFbnRpdGllcy5maWVsZDEsZGVmYXVsdEVudGl0aWVzLmZpZWxkLGRlZmF1bHRFbnRpdGllcyIKKyAgICAgICAgICAgICAgICAgICAgKyAiLnByb3BlcnR5Iik7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbnNPdmVyQ29uZmlndXJhdGlvbk92ZXJSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZpZWxkcyA9IHRhcmdldCgiYW5ub3RhdGlvbnNPdmVyQ29uZmlndXJhdGlvbk92ZXJSZXNvdXJjZSIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICAgICAgYXNzZXJ0U2FtZUZpZWxkcyhmaWVsZHMsICJmaWVsZCxhY2Nlc3Nvcixwcm9wZXJ0eSxtYW55RW50aXRpZXMucHJvcGVydHkxLG1hbnlFbnRpdGllcy5maWVsZDEsb25lRW50aXRpZXMuZmllbGQyLCIKKyAgICAgICAgICAgICAgICAgICAgKyAib25lRW50aXRpZXMucHJvcGVydHkyLG9uZUVudGl0aWVzLnByb3BlcnR5MSxvbmVFbnRpdGllcy5maWVsZDEsZGVmYXVsdEVudGl0aWVzLmZpZWxkLGRlZmF1bHRFbnRpdGllcyIKKyAgICAgICAgICAgICAgICAgICAgKyAiLnByb3BlcnR5Iik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvRW50aXR5RmlsdGVyaW5nVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL0VudGl0eUZpbHRlcmluZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDUwZTBjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL0VudGl0eUZpbHRlcmluZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIENvbW1vbiBwYXJlbnQgY2xhc3MgZm9yIEVudGl0eSBGaWx0ZXJpbmcgdGVzdHMuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK2Fic3RyYWN0IGNsYXNzIEVudGl0eUZpbHRlcmluZ1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCAoZmlsdGVyZWQpIGZpZWxkcyBvZiBnaXZlbiBzdHJpbmdzIGFyZSBlcXVhbCAoZmllbGRzIGFyZSBzZXBhcmF0ZWQgYnkgY29tbWFzKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhY3R1YWwgYWN0dWFsIGZpZWxkcyBmcm9tIHJlc3BvbnNlIHJlY2VpdmVkIGZyb20gc2VydmVyLgorICAgICAqIEBwYXJhbSBleHBlY3RlZCBleHBlY3RlZCBmaWVsZHMuCisgICAgICovCisgICAgc3RhdGljIHZvaWQgYXNzZXJ0U2FtZUZpZWxkcyhmaW5hbCBTdHJpbmcgYWN0dWFsLCBmaW5hbCBTdHJpbmcgZXhwZWN0ZWQpIHsKKyAgICAgICAgZmluYWwgU2V0PFN0cmluZz4gYWN0dWFsU2V0ID0gQXJyYXlzLnN0cmVhbShhY3R1YWwuc3BsaXQoIiwiKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpOworICAgICAgICBmaW5hbCBTZXQ8U3RyaW5nPiBleHBlY3RlZFNldCA9IEFycmF5cy5zdHJlYW0oZXhwZWN0ZWQuc3BsaXQoIiwiKSkuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpOworCisgICAgICAgIGFzc2VydFRoYXQoYWN0dWFsU2V0LCBlcXVhbFRvKGV4cGVjdGVkU2V0KSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL0ZpbHRlcmluZ01lc3NhZ2VCb2R5UHJvdmlkZXIuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9GaWx0ZXJpbmdNZXNzYWdlQm9keVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNiNmJhNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9GaWx0ZXJpbmdNZXNzYWdlQm9keVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLnNwaS5GaWx0ZXJpbmdIZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuc3BpLk9iamVjdEdyYXBoOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLnNwaS5PYmplY3RQcm92aWRlcjsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFByb3ZpZGVyCitAQ29uc3VtZXMoImVudGl0eS9maWx0ZXJpbmciKQorQFByb2R1Y2VzKCJlbnRpdHkvZmlsdGVyaW5nIikKK3B1YmxpYyBjbGFzcyBGaWx0ZXJpbmdNZXNzYWdlQm9keVByb3ZpZGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlSZWFkZXI8T2JqZWN0PiwgTWVzc2FnZUJvZHlXcml0ZXI8T2JqZWN0PiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihGaWx0ZXJpbmdNZXNzYWdlQm9keVByb3ZpZGVyLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBASW5qZWN0CisgICAgcHJpdmF0ZSBqYXZheC5pbmplY3QuUHJvdmlkZXI8T2JqZWN0UHJvdmlkZXI8T2JqZWN0R3JhcGg+PiBwcm92aWRlcjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICByZXR1cm4gU3RyaW5nLmNsYXNzICE9IHR5cGU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5jbGFzcyAhPSB0eXBlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGdldFNpemUoZmluYWwgT2JqZWN0IG8sIGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgcmVhZEZyb20oZmluYWwgQ2xhc3M8T2JqZWN0PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLCBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgT2JqZWN0R3JhcGggb2JqZWN0R3JhcGggPSBwcm92aWRlci5nZXQoKQorICAgICAgICAgICAgICAgICAgICAuZ2V0RmlsdGVyaW5nT2JqZWN0KEZpbHRlcmluZ0hlbHBlci5nZXRFbnRpdHlDbGFzcyhnZW5lcmljVHlwZSksIGZhbHNlLCBhbm5vdGF0aW9ucyk7CisKKyAgICAgICAgICAgIHJldHVybiBvYmplY3RHcmFwaFRvU3RyaW5nKG9iamVjdEdyYXBoKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuV0FSTklORywgIkVycm9yIGR1cmluZyByZWFkaW5nIGFuIG9iamVjdCBncmFwaC4iLCB0KTsKKyAgICAgICAgICAgIHJldHVybiAiRVJST1I6ICIgKyB0LmdldE1lc3NhZ2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oZmluYWwgT2JqZWN0IG8sIGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUsIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICBmaW5hbCBPYmplY3RHcmFwaCBvYmplY3RHcmFwaCA9IHByb3ZpZGVyLmdldCgpCisgICAgICAgICAgICAgICAgLmdldEZpbHRlcmluZ09iamVjdChGaWx0ZXJpbmdIZWxwZXIuZ2V0RW50aXR5Q2xhc3MoZ2VuZXJpY1R5cGUpLCB0cnVlLCBhbm5vdGF0aW9ucyk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZShvYmplY3RHcmFwaFRvU3RyaW5nKG9iamVjdEdyYXBoKS5nZXRCeXRlcygpKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuV0FSTklORywgIkVycm9yIGR1cmluZyB3cml0aW5nIGFuIG9iamVjdCBncmFwaC4iLCB0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBvYmplY3RHcmFwaFRvU3RyaW5nKGZpbmFsIE9iamVjdEdyYXBoIG9iamVjdEdyYXBoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBmaWVsZCA6IG9iamVjdEdyYXBoVG9GaWVsZHMoIiIsIG9iamVjdEdyYXBoKSkgeworICAgICAgICAgICAgaWYgKCFmaWVsZC5jb250YWlucygiVHJhbnNpZW50IikpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoZmllbGQpLmFwcGVuZCgnLCcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzYi5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIHNiLmRlbGV0ZShzYi5sZW5ndGgoKSAtIDEsIHNiLmxlbmd0aCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBMaXN0PFN0cmluZz4gb2JqZWN0R3JhcGhUb0ZpZWxkcyhmaW5hbCBTdHJpbmcgcHJlZml4LCBmaW5hbCBPYmplY3RHcmFwaCBvYmplY3RHcmFwaCkgeworICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gZmllbGRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICAgICAgLy8gRmllbGRzLgorICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBmaWVsZCA6IG9iamVjdEdyYXBoLmdldEZpZWxkcygpKSB7CisgICAgICAgICAgICBmaWVsZHMuYWRkKHByZWZpeCArIGZpZWxkKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoZmluYWwgTWFwLkVudHJ5PFN0cmluZywgT2JqZWN0R3JhcGg+IGVudHJ5IDogb2JqZWN0R3JhcGguZ2V0U3ViZ3JhcGhzKCkuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgZmllbGRzLmFkZEFsbChvYmplY3RHcmFwaFRvRmllbGRzKHByZWZpeCArIGVudHJ5LmdldEtleSgpICsgIi4iLCBlbnRyeS5nZXRWYWx1ZSgpKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmllbGRzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9QcmltYXJ5RGV0YWlsZWRWaWV3LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvUHJpbWFyeURldGFpbGVkVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MGEzNDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvUHJpbWFyeURldGFpbGVkVmlldy5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmc7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkFubm90YXRpb25MaXRlcmFsOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLkVudGl0eUZpbHRlcmluZzsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFRhcmdldCh7RWxlbWVudFR5cGUuVFlQRSwgRWxlbWVudFR5cGUuTUVUSE9ELCBFbGVtZW50VHlwZS5GSUVMRH0pCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorQERvY3VtZW50ZWQKK0BFbnRpdHlGaWx0ZXJpbmcKK3B1YmxpYyBAaW50ZXJmYWNlIFByaW1hcnlEZXRhaWxlZFZpZXcgeworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5IGV4dGVuZHMgQW5ub3RhdGlvbkxpdGVyYWw8UHJpbWFyeURldGFpbGVkVmlldz4gaW1wbGVtZW50cyBQcmltYXJ5RGV0YWlsZWRWaWV3IHsKKworICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIFByaW1hcnlEZXRhaWxlZFZpZXcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBGYWN0b3J5KCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvU2Vjb25kYXJ5RGV0YWlsZWRWaWV3LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvU2Vjb25kYXJ5RGV0YWlsZWRWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJkMjA2ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9TZWNvbmRhcnlEZXRhaWxlZFZpZXcuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5Bbm5vdGF0aW9uTGl0ZXJhbDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5FbnRpdHlGaWx0ZXJpbmc7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BUYXJnZXQoe0VsZW1lbnRUeXBlLlRZUEUsIEVsZW1lbnRUeXBlLk1FVEhPRCwgRWxlbWVudFR5cGUuRklFTER9KQorQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BEb2N1bWVudGVkCitARW50aXR5RmlsdGVyaW5nCitwdWJsaWMgQGludGVyZmFjZSBTZWNvbmRhcnlEZXRhaWxlZFZpZXcgeworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5IGV4dGVuZHMgQW5ub3RhdGlvbkxpdGVyYWw8U2Vjb25kYXJ5RGV0YWlsZWRWaWV3PiBpbXBsZW1lbnRzIFNlY29uZGFyeURldGFpbGVkVmlldyB7CisKKyAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBTZWNvbmRhcnlEZXRhaWxlZFZpZXcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBGYWN0b3J5KCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvVGVydGlhcnlEZXRhaWxlZFZpZXcuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9UZXJ0aWFyeURldGFpbGVkVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiOWE1MTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvVGVydGlhcnlEZXRhaWxlZFZpZXcuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5Bbm5vdGF0aW9uTGl0ZXJhbDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5FbnRpdHlGaWx0ZXJpbmc7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BUYXJnZXQoe0VsZW1lbnRUeXBlLlRZUEUsIEVsZW1lbnRUeXBlLk1FVEhPRCwgRWxlbWVudFR5cGUuRklFTER9KQorQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BEb2N1bWVudGVkCitARW50aXR5RmlsdGVyaW5nCitwdWJsaWMgQGludGVyZmFjZSBUZXJ0aWFyeURldGFpbGVkVmlldyB7CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3RvcnkgZXh0ZW5kcyBBbm5vdGF0aW9uTGl0ZXJhbDxUZXJ0aWFyeURldGFpbGVkVmlldz4gaW1wbGVtZW50cyBUZXJ0aWFyeURldGFpbGVkVmlldyB7CisKKyAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBUZXJ0aWFyeURldGFpbGVkVmlldyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEZhY3RvcnkoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9kb21haW4vQ29tcGxleEVudGl0eS5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL2RvbWFpbi9Db21wbGV4RW50aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZhMzZhMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9kb21haW4vQ29tcGxleEVudGl0eS5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuZG9tYWluOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFRyYW5zaWVudDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLlByaW1hcnlEZXRhaWxlZFZpZXc7CisKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uYW5ub3RhdGlvbi5Kc29uQXV0b0RldGVjdDsKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uYW5ub3RhdGlvbi5Kc29uSWdub3JlOworCisvKioKKyAqIFByaW1hcnkgZGV0YWlsZWQgdmlldyBPTkxZLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitASnNvbkF1dG9EZXRlY3QoZmllbGRWaXNpYmlsaXR5ID0gSnNvbkF1dG9EZXRlY3QuVmlzaWJpbGl0eS5BTlksIGdldHRlclZpc2liaWxpdHkgPSBKc29uQXV0b0RldGVjdC5WaXNpYmlsaXR5LkFOWSkKK0BYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5QUk9QRVJUWSkKKy8vIEVudGl0eSBGaWx0ZXJpbmcuCitAUHJpbWFyeURldGFpbGVkVmlldworcHVibGljIGNsYXNzIENvbXBsZXhFbnRpdHkgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBDb21wbGV4RW50aXR5IElOU1RBTkNFOworCisgICAgc3RhdGljIHsKKyAgICAgICAgSU5TVEFOQ0UgPSBuZXcgQ29tcGxleEVudGl0eSgpOworICAgICAgICBJTlNUQU5DRS5maWVsZCA9IENvbXBsZXhTdWJFbnRpdHkuSU5TVEFOQ0U7CisgICAgICAgIElOU1RBTkNFLnByb3BlcnR5ID0gInByb3BlcnR5IjsKKyAgICB9CisKKyAgICBAWG1sRWxlbWVudAorICAgIHB1YmxpYyBDb21wbGV4U3ViRW50aXR5IGZpZWxkOworCisgICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHk7CisKKyAgICBAWG1sVHJhbnNpZW50CisgICAgQEpzb25JZ25vcmUKKyAgICBwdWJsaWMgU3RyaW5nIGFjY2Vzc29yVHJhbnNpZW50OworCisgICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eSgpIHsKKyAgICAgICAgcmV0dXJuIHByb3BlcnR5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KGZpbmFsIFN0cmluZyBwcm9wZXJ0eSkgeworICAgICAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRBY2Nlc3NvcigpIHsKKyAgICAgICAgcmV0dXJuIGFjY2Vzc29yVHJhbnNpZW50ID09IG51bGwgPyBwcm9wZXJ0eSArIHByb3BlcnR5IDogYWNjZXNzb3JUcmFuc2llbnQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QWNjZXNzb3IoZmluYWwgU3RyaW5nIGFjY2Vzc29yKSB7CisgICAgICAgIGFjY2Vzc29yVHJhbnNpZW50ID0gYWNjZXNzb3I7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL2RvbWFpbi9Db21wbGV4U3ViRW50aXR5LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvZG9tYWluL0NvbXBsZXhTdWJFbnRpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Njc2ZTNjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL2RvbWFpbi9Db21wbGV4U3ViRW50aXR5LmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5kb21haW47CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHJhbnNpZW50OworCitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmFubm90YXRpb24uSnNvbkF1dG9EZXRlY3Q7CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmFubm90YXRpb24uSnNvbklnbm9yZTsKKworLyoqCisgKiBEZWZhdWx0IHZpZXcgT05MWS4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQEpzb25BdXRvRGV0ZWN0KGZpZWxkVmlzaWJpbGl0eSA9IEpzb25BdXRvRGV0ZWN0LlZpc2liaWxpdHkuQU5ZLCBnZXR0ZXJWaXNpYmlsaXR5ID0gSnNvbkF1dG9EZXRlY3QuVmlzaWJpbGl0eS5BTlkpCitAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuUFJPUEVSVFkpCitwdWJsaWMgY2xhc3MgQ29tcGxleFN1YkVudGl0eSB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBsZXhTdWJFbnRpdHkgSU5TVEFOQ0U7CisKKyAgICBzdGF0aWMgeworICAgICAgICBJTlNUQU5DRSA9IG5ldyBDb21wbGV4U3ViRW50aXR5KCk7CisgICAgICAgIElOU1RBTkNFLmZpZWxkID0gImZpZWxkIjsKKyAgICAgICAgSU5TVEFOQ0UucHJvcGVydHkgPSBDb21wbGV4U3ViU3ViRW50aXR5LklOU1RBTkNFOworICAgIH0KKworICAgIEBYbWxFbGVtZW50CisgICAgcHVibGljIFN0cmluZyBmaWVsZDsKKworICAgIHByaXZhdGUgQ29tcGxleFN1YlN1YkVudGl0eSBwcm9wZXJ0eTsKKworICAgIEBYbWxUcmFuc2llbnQKKyAgICBASnNvbklnbm9yZQorICAgIHB1YmxpYyBTdHJpbmcgYWNjZXNzb3JUcmFuc2llbnQ7CisKKyAgICBwdWJsaWMgQ29tcGxleFN1YlN1YkVudGl0eSBnZXRQcm9wZXJ0eSgpIHsKKyAgICAgICAgcmV0dXJuIHByb3BlcnR5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KGZpbmFsIENvbXBsZXhTdWJTdWJFbnRpdHkgcHJvcGVydHkpIHsKKyAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWNjZXNzb3IoKSB7CisgICAgICAgIHJldHVybiBhY2Nlc3NvclRyYW5zaWVudCA9PSBudWxsID8gZmllbGQgKyBmaWVsZCA6IGFjY2Vzc29yVHJhbnNpZW50OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEFjY2Vzc29yKGZpbmFsIFN0cmluZyBhY2Nlc3NvcikgeworICAgICAgICBhY2Nlc3NvclRyYW5zaWVudCA9IGFjY2Vzc29yOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9kb21haW4vQ29tcGxleFN1YlN1YkVudGl0eS5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL2RvbWFpbi9Db21wbGV4U3ViU3ViRW50aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU3MDllMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9kb21haW4vQ29tcGxleFN1YlN1YkVudGl0eS5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuZG9tYWluOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFRyYW5zaWVudDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLlByaW1hcnlEZXRhaWxlZFZpZXc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuU2Vjb25kYXJ5RGV0YWlsZWRWaWV3OworCitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmFubm90YXRpb24uSnNvbkF1dG9EZXRlY3Q7CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmFubm90YXRpb24uSnNvbklnbm9yZTsKKworLyoqCisgKiBNaXhlZCB2aWV3cy4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQEpzb25BdXRvRGV0ZWN0KGZpZWxkVmlzaWJpbGl0eSA9IEpzb25BdXRvRGV0ZWN0LlZpc2liaWxpdHkuQU5ZLCBnZXR0ZXJWaXNpYmlsaXR5ID0gSnNvbkF1dG9EZXRlY3QuVmlzaWJpbGl0eS5BTlkpCitAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuUFJPUEVSVFkpCitwdWJsaWMgY2xhc3MgQ29tcGxleFN1YlN1YkVudGl0eSB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbXBsZXhTdWJTdWJFbnRpdHkgSU5TVEFOQ0U7CisKKyAgICBzdGF0aWMgeworICAgICAgICBJTlNUQU5DRSA9IG5ldyBDb21wbGV4U3ViU3ViRW50aXR5KCk7CisgICAgICAgIElOU1RBTkNFLmZpZWxkID0gImZpZWxkIjsKKyAgICAgICAgSU5TVEFOQ0UucHJvcGVydHkgPSAicHJvcGVydHkiOworICAgIH0KKworICAgIEBYbWxFbGVtZW50CisgICAgQFNlY29uZGFyeURldGFpbGVkVmlldworICAgIHB1YmxpYyBTdHJpbmcgZmllbGQ7CisKKyAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTsKKworICAgIEBYbWxUcmFuc2llbnQKKyAgICBASnNvbklnbm9yZQorICAgIHB1YmxpYyBTdHJpbmcgYWNjZXNzb3JUcmFuc2llbnQ7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KCkgeworICAgICAgICByZXR1cm4gcHJvcGVydHk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoZmluYWwgU3RyaW5nIHByb3BlcnR5KSB7CisgICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKKyAgICB9CisKKyAgICBAUHJpbWFyeURldGFpbGVkVmlldworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWNjZXNzb3IoKSB7CisgICAgICAgIHJldHVybiBhY2Nlc3NvclRyYW5zaWVudCA9PSBudWxsID8gZmllbGQgKyBmaWVsZCA6IGFjY2Vzc29yVHJhbnNpZW50OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEFjY2Vzc29yKGZpbmFsIFN0cmluZyBhY2Nlc3NvcikgeworICAgICAgICBhY2Nlc3NvclRyYW5zaWVudCA9IGFjY2Vzc29yOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9kb21haW4vRGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eS5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL2RvbWFpbi9EZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNkMzg4OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9kb21haW4vRGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eS5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuZG9tYWluOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKKworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5hbm5vdGF0aW9uLkpzb25BdXRvRGV0ZWN0OworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitASnNvbkF1dG9EZXRlY3QoZmllbGRWaXNpYmlsaXR5ID0gSnNvbkF1dG9EZXRlY3QuVmlzaWJpbGl0eS5BTlksIGdldHRlclZpc2liaWxpdHkgPSBKc29uQXV0b0RldGVjdC5WaXNpYmlsaXR5LkFOWSkKK0BYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5QUk9QRVJUWSkKK3B1YmxpYyBjbGFzcyBEZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5IHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eSBJTlNUQU5DRTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIElOU1RBTkNFID0gbmV3IERlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkoKTsKKyAgICAgICAgSU5TVEFOQ0UuZmllbGQgPSB0cnVlOworICAgICAgICBJTlNUQU5DRS5wcm9wZXJ0eSA9IDIwTDsKKyAgICB9CisKKyAgICBAWG1sRWxlbWVudAorICAgIHB1YmxpYyBib29sZWFuIGZpZWxkOworICAgIHByaXZhdGUgTG9uZyBwcm9wZXJ0eTsKKworICAgIHB1YmxpYyBMb25nIGdldFByb3BlcnR5KCkgeworICAgICAgICByZXR1cm4gcHJvcGVydHk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoZmluYWwgTG9uZyBwcm9wZXJ0eSkgeworICAgICAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL2RvbWFpbi9FbXB0eUVudGl0eS5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL2RvbWFpbi9FbXB0eUVudGl0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlODM4OWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvZG9tYWluL0VtcHR5RW50aXR5LmphdmEKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5kb21haW47CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBFbXB0eUVudGl0eSB7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvZG9tYWluL0ZpbHRlcmVkQ2xhc3NFbnRpdHkuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9kb21haW4vRmlsdGVyZWRDbGFzc0VudGl0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZWM1ZjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvZG9tYWluL0ZpbHRlcmVkQ2xhc3NFbnRpdHkuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLmRvbWFpbjsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5UZXJ0aWFyeURldGFpbGVkVmlldzsKKworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5hbm5vdGF0aW9uLkpzb25BdXRvRGV0ZWN0OworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitASnNvbkF1dG9EZXRlY3QoZmllbGRWaXNpYmlsaXR5ID0gSnNvbkF1dG9EZXRlY3QuVmlzaWJpbGl0eS5BTlksIGdldHRlclZpc2liaWxpdHkgPSBKc29uQXV0b0RldGVjdC5WaXNpYmlsaXR5LkFOWSkKK0BYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5QUk9QRVJUWSkKKy8vIEVudGl0eSBGaWx0ZXJpbmcuCitAVGVydGlhcnlEZXRhaWxlZFZpZXcKK3B1YmxpYyBjbGFzcyBGaWx0ZXJlZENsYXNzRW50aXR5IHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgRmlsdGVyZWRDbGFzc0VudGl0eSBJTlNUQU5DRTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIElOU1RBTkNFID0gbmV3IEZpbHRlcmVkQ2xhc3NFbnRpdHkoKTsKKyAgICAgICAgSU5TVEFOQ0UuZmllbGQgPSA0MDsKKyAgICAgICAgSU5TVEFOQ0UucHJvcGVydHkgPSAicHJvcGVydHkiOworICAgIH0KKworICAgIEBYbWxFbGVtZW50CisgICAgcHVibGljIGludCBmaWVsZDsKKyAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoKSB7CisgICAgICAgIHJldHVybiBwcm9wZXJ0eTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShmaW5hbCBTdHJpbmcgcHJvcGVydHkpIHsKKyAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9kb21haW4vTWFueUZpbHRlcmluZ3NPbkNsYXNzRW50aXR5LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvZG9tYWluL01hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMjFmYjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvZG9tYWluL01hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eS5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuZG9tYWluOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFRyYW5zaWVudDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLlByaW1hcnlEZXRhaWxlZFZpZXc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuU2Vjb25kYXJ5RGV0YWlsZWRWaWV3OworCitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmFubm90YXRpb24uSnNvbkF1dG9EZXRlY3Q7CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmFubm90YXRpb24uSnNvbklnbm9yZTsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQEpzb25BdXRvRGV0ZWN0KGZpZWxkVmlzaWJpbGl0eSA9IEpzb25BdXRvRGV0ZWN0LlZpc2liaWxpdHkuQU5ZLCBnZXR0ZXJWaXNpYmlsaXR5ID0gSnNvbkF1dG9EZXRlY3QuVmlzaWJpbGl0eS5BTlkpCitAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuUFJPUEVSVFkpCisvLyBFbnRpdHkgRmlsdGVyaW5nLgorQFByaW1hcnlEZXRhaWxlZFZpZXcKK0BTZWNvbmRhcnlEZXRhaWxlZFZpZXcKK3B1YmxpYyBjbGFzcyBNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkgSU5TVEFOQ0U7CisKKyAgICBzdGF0aWMgeworICAgICAgICBJTlNUQU5DRSA9IG5ldyBNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkoKTsKKyAgICAgICAgSU5TVEFOQ0UuZmllbGQgPSA1MDsKKyAgICAgICAgSU5TVEFOQ0UucHJvcGVydHkgPSAicHJvcGVydHkiOworICAgICAgICBJTlNUQU5DRS5kZWZhdWx0RW50aXRpZXMgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KERlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkuSU5TVEFOQ0UpOworICAgICAgICBJTlNUQU5DRS5vbmVFbnRpdGllcyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoT25lRmlsdGVyaW5nU3ViRW50aXR5LklOU1RBTkNFKTsKKyAgICAgICAgSU5TVEFOQ0UubWFueUVudGl0aWVzID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChNYW55RmlsdGVyaW5nc1N1YkVudGl0eS5JTlNUQU5DRSk7CisgICAgICAgIElOU1RBTkNFLmZpbHRlcmVkID0gRmlsdGVyZWRDbGFzc0VudGl0eS5JTlNUQU5DRTsKKyAgICB9CisKKyAgICBAWG1sRWxlbWVudAorICAgIHB1YmxpYyBpbnQgZmllbGQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHk7CisKKyAgICBAWG1sRWxlbWVudAorICAgIHB1YmxpYyBMaXN0PERlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHk+IGRlZmF1bHRFbnRpdGllczsKKworICAgIEBYbWxFbGVtZW50CisgICAgcHVibGljIExpc3Q8T25lRmlsdGVyaW5nU3ViRW50aXR5PiBvbmVFbnRpdGllczsKKyAgICBAWG1sRWxlbWVudAorICAgIHB1YmxpYyBMaXN0PE1hbnlGaWx0ZXJpbmdzU3ViRW50aXR5PiBtYW55RW50aXRpZXM7CisKKyAgICBAWG1sRWxlbWVudAorICAgIHB1YmxpYyBGaWx0ZXJlZENsYXNzRW50aXR5IGZpbHRlcmVkOworCisgICAgQFhtbFRyYW5zaWVudAorICAgIEBKc29uSWdub3JlCisgICAgcHVibGljIFN0cmluZyBhY2Nlc3NvclRyYW5zaWVudDsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoKSB7CisgICAgICAgIHJldHVybiBwcm9wZXJ0eTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShmaW5hbCBTdHJpbmcgcHJvcGVydHkpIHsKKyAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWNjZXNzb3IoKSB7CisgICAgICAgIHJldHVybiBhY2Nlc3NvclRyYW5zaWVudCA9PSBudWxsID8gcHJvcGVydHkgKyBwcm9wZXJ0eSA6IGFjY2Vzc29yVHJhbnNpZW50OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEFjY2Vzc29yKGZpbmFsIFN0cmluZyBhY2Nlc3NvcikgeworICAgICAgICBhY2Nlc3NvclRyYW5zaWVudCA9IGFjY2Vzc29yOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9kb21haW4vTWFueUZpbHRlcmluZ3NPblByb3BlcnRpZXNFbnRpdHkuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9kb21haW4vTWFueUZpbHRlcmluZ3NPblByb3BlcnRpZXNFbnRpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTliODdkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL2RvbWFpbi9NYW55RmlsdGVyaW5nc09uUHJvcGVydGllc0VudGl0eS5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuZG9tYWluOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFRyYW5zaWVudDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLlByaW1hcnlEZXRhaWxlZFZpZXc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuU2Vjb25kYXJ5RGV0YWlsZWRWaWV3OworCitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmFubm90YXRpb24uSnNvbkF1dG9EZXRlY3Q7CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmFubm90YXRpb24uSnNvbklnbm9yZTsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQEpzb25BdXRvRGV0ZWN0KGZpZWxkVmlzaWJpbGl0eSA9IEpzb25BdXRvRGV0ZWN0LlZpc2liaWxpdHkuQU5ZLCBnZXR0ZXJWaXNpYmlsaXR5ID0gSnNvbkF1dG9EZXRlY3QuVmlzaWJpbGl0eS5BTlkpCitAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuUFJPUEVSVFkpCitwdWJsaWMgY2xhc3MgTWFueUZpbHRlcmluZ3NPblByb3BlcnRpZXNFbnRpdHkgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBNYW55RmlsdGVyaW5nc09uUHJvcGVydGllc0VudGl0eSBJTlNUQU5DRTsKKworICAgIHN0YXRpYyB7CisgICAgICAgIElOU1RBTkNFID0gbmV3IE1hbnlGaWx0ZXJpbmdzT25Qcm9wZXJ0aWVzRW50aXR5KCk7CisgICAgICAgIElOU1RBTkNFLmZpZWxkID0gOTA7CisgICAgICAgIElOU1RBTkNFLnByb3BlcnR5ID0gInByb3BlcnR5IjsKKyAgICAgICAgSU5TVEFOQ0UuZGVmYXVsdEVudGl0aWVzID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChEZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5LklOU1RBTkNFKTsKKyAgICAgICAgSU5TVEFOQ0Uub25lRW50aXRpZXMgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KE9uZUZpbHRlcmluZ1N1YkVudGl0eS5JTlNUQU5DRSk7CisgICAgICAgIElOU1RBTkNFLm1hbnlFbnRpdGllcyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoTWFueUZpbHRlcmluZ3NTdWJFbnRpdHkuSU5TVEFOQ0UpOworICAgICAgICBJTlNUQU5DRS5maWx0ZXJlZCA9IEZpbHRlcmVkQ2xhc3NFbnRpdHkuSU5TVEFOQ0U7CisgICAgfQorCisgICAgQFhtbEVsZW1lbnQKKyAgICBwdWJsaWMgaW50IGZpZWxkOworICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5OworCisgICAgQFhtbEVsZW1lbnQKKyAgICBAUHJpbWFyeURldGFpbGVkVmlldworICAgIHB1YmxpYyBMaXN0PERlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHk+IGRlZmF1bHRFbnRpdGllczsKKworICAgIEBYbWxFbGVtZW50CisgICAgQFByaW1hcnlEZXRhaWxlZFZpZXcKKyAgICBAU2Vjb25kYXJ5RGV0YWlsZWRWaWV3CisgICAgcHVibGljIExpc3Q8T25lRmlsdGVyaW5nU3ViRW50aXR5PiBvbmVFbnRpdGllczsKKworICAgIEBYbWxFbGVtZW50CisgICAgQFNlY29uZGFyeURldGFpbGVkVmlldworICAgIHB1YmxpYyBMaXN0PE1hbnlGaWx0ZXJpbmdzU3ViRW50aXR5PiBtYW55RW50aXRpZXM7CisKKyAgICBAWG1sRWxlbWVudAorICAgIEBQcmltYXJ5RGV0YWlsZWRWaWV3CisgICAgQFNlY29uZGFyeURldGFpbGVkVmlldworICAgIHB1YmxpYyBGaWx0ZXJlZENsYXNzRW50aXR5IGZpbHRlcmVkOworCisgICAgQFhtbFRyYW5zaWVudAorICAgIEBKc29uSWdub3JlCisgICAgcHVibGljIFN0cmluZyBhY2Nlc3NvclRyYW5zaWVudDsKKworICAgIEBQcmltYXJ5RGV0YWlsZWRWaWV3CisgICAgQFNlY29uZGFyeURldGFpbGVkVmlldworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoKSB7CisgICAgICAgIHJldHVybiBwcm9wZXJ0eTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eShmaW5hbCBTdHJpbmcgcHJvcGVydHkpIHsKKyAgICAgICAgdGhpcy5wcm9wZXJ0eSA9IHByb3BlcnR5OworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWNjZXNzb3IoKSB7CisgICAgICAgIHJldHVybiBhY2Nlc3NvclRyYW5zaWVudCA9PSBudWxsID8gcHJvcGVydHkgKyBwcm9wZXJ0eSA6IGFjY2Vzc29yVHJhbnNpZW50OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEFjY2Vzc29yKGZpbmFsIFN0cmluZyBhY2Nlc3NvcikgeworICAgICAgICBhY2Nlc3NvclRyYW5zaWVudCA9IGFjY2Vzc29yOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9kb21haW4vTWFueUZpbHRlcmluZ3NTdWJFbnRpdHkuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9kb21haW4vTWFueUZpbHRlcmluZ3NTdWJFbnRpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzI2YWJjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL2RvbWFpbi9NYW55RmlsdGVyaW5nc1N1YkVudGl0eS5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuZG9tYWluOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLlByaW1hcnlEZXRhaWxlZFZpZXc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuU2Vjb25kYXJ5RGV0YWlsZWRWaWV3OworCitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmFubm90YXRpb24uSnNvbkF1dG9EZXRlY3Q7CisKKy8qKgorKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyovCitASnNvbkF1dG9EZXRlY3QoZmllbGRWaXNpYmlsaXR5ID0gSnNvbkF1dG9EZXRlY3QuVmlzaWJpbGl0eS5BTlksIGdldHRlclZpc2liaWxpdHkgPSBKc29uQXV0b0RldGVjdC5WaXNpYmlsaXR5LkFOWSkKK0BYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5QUk9QRVJUWSkKK3B1YmxpYyBjbGFzcyBNYW55RmlsdGVyaW5nc1N1YkVudGl0eSB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE1hbnlGaWx0ZXJpbmdzU3ViRW50aXR5IElOU1RBTkNFOworCisgICAgc3RhdGljIHsKKyAgICAgICAgSU5TVEFOQ0UgPSBuZXcgTWFueUZpbHRlcmluZ3NTdWJFbnRpdHkoKTsKKyAgICAgICAgSU5TVEFOQ0UuZmllbGQxID0gNjA7CisgICAgICAgIElOU1RBTkNFLmZpZWxkMiA9IDcwOworICAgICAgICBJTlNUQU5DRS5wcm9wZXJ0eTEgPSAicHJvcGVydHkxIjsKKyAgICAgICAgSU5TVEFOQ0UucHJvcGVydHkyID0gInByb3BlcnR5MiI7CisgICAgfQorCisgICAgQFhtbEVsZW1lbnQKKyAgICBwdWJsaWMgaW50IGZpZWxkMTsKKworICAgIEBYbWxFbGVtZW50CisgICAgQFNlY29uZGFyeURldGFpbGVkVmlldworICAgIHB1YmxpYyBpbnQgZmllbGQyOworCisgICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHkxOworICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MjsKKworICAgIEBQcmltYXJ5RGV0YWlsZWRWaWV3CisgICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eTEoKSB7CisgICAgICAgIHJldHVybiBwcm9wZXJ0eTE7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkxKGZpbmFsIFN0cmluZyBwcm9wZXJ0eTEpIHsKKyAgICAgICAgdGhpcy5wcm9wZXJ0eTEgPSBwcm9wZXJ0eTE7CisgICAgfQorCisgICAgQFNlY29uZGFyeURldGFpbGVkVmlldworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkyKCkgeworICAgICAgICByZXR1cm4gcHJvcGVydHkyOworICAgIH0KKworICAgIEBQcmltYXJ5RGV0YWlsZWRWaWV3CisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkyKGZpbmFsIFN0cmluZyBwcm9wZXJ0eTIpIHsKKyAgICAgICAgdGhpcy5wcm9wZXJ0eTIgPSBwcm9wZXJ0eTI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL2RvbWFpbi9Ob25FbXB0eUVudGl0eS5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL2RvbWFpbi9Ob25FbXB0eUVudGl0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZjAwOTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvZG9tYWluL05vbkVtcHR5RW50aXR5LmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5kb21haW47CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBOb25FbXB0eUVudGl0eSB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIE5vbkVtcHR5RW50aXR5IElOU1RBTkNFOworCisgICAgc3RhdGljIHsKKyAgICAgICAgSU5TVEFOQ0UgPSBuZXcgTm9uRW1wdHlFbnRpdHkoKTsKKyAgICAgICAgSU5TVEFOQ0Uuc2V0VmFsdWUoImZvbyIpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlOworCisgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIHZhbHVlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIEVtcHR5RW50aXR5IGdldEVtcHR5RW50aXR5KCkgeworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvZG9tYWluL09uZUZpbHRlcmluZ09uQ2xhc3NFbnRpdHkuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9kb21haW4vT25lRmlsdGVyaW5nT25DbGFzc0VudGl0eS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1YmU5ZmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvZG9tYWluL09uZUZpbHRlcmluZ09uQ2xhc3NFbnRpdHkuamF2YQpAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5kb21haW47CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHJhbnNpZW50OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuUHJpbWFyeURldGFpbGVkVmlldzsKKworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5hbm5vdGF0aW9uLkpzb25BdXRvRGV0ZWN0OworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5hbm5vdGF0aW9uLkpzb25JZ25vcmU7CisKKy8qKgorKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyovCitASnNvbkF1dG9EZXRlY3QoZmllbGRWaXNpYmlsaXR5ID0gSnNvbkF1dG9EZXRlY3QuVmlzaWJpbGl0eS5BTlksIGdldHRlclZpc2liaWxpdHkgPSBKc29uQXV0b0RldGVjdC5WaXNpYmlsaXR5LkFOWSkKK0BYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5QUk9QRVJUWSkKKy8vIEVudGl0eSBGaWx0ZXJpbmcuCitAUHJpbWFyeURldGFpbGVkVmlldworcHVibGljIGNsYXNzIE9uZUZpbHRlcmluZ09uQ2xhc3NFbnRpdHkgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBPbmVGaWx0ZXJpbmdPbkNsYXNzRW50aXR5IElOU1RBTkNFOworCisgICAgc3RhdGljIHsKKyAgICAgICAgSU5TVEFOQ0UgPSBuZXcgT25lRmlsdGVyaW5nT25DbGFzc0VudGl0eSgpOworICAgICAgICBJTlNUQU5DRS5maWVsZCA9IDEwOworICAgICAgICBJTlNUQU5DRS5wcm9wZXJ0eSA9ICJwcm9wZXJ0eSI7CisgICAgICAgIElOU1RBTkNFLmRlZmF1bHRFbnRpdGllcyA9IENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoRGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eS5JTlNUQU5DRSk7CisgICAgICAgIElOU1RBTkNFLnN1YkVudGl0aWVzID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChPbmVGaWx0ZXJpbmdTdWJFbnRpdHkuSU5TVEFOQ0UpOworICAgICAgICBJTlNUQU5DRS5maWx0ZXJlZCA9IEZpbHRlcmVkQ2xhc3NFbnRpdHkuSU5TVEFOQ0U7CisgICAgfQorCisgICAgQFhtbEVsZW1lbnQKKyAgICBwdWJsaWMgaW50IGZpZWxkOworICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5OworCisgICAgcHJpdmF0ZSBMaXN0PERlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHk+IGRlZmF1bHRFbnRpdGllczsKKyAgICBwcml2YXRlIExpc3Q8T25lRmlsdGVyaW5nU3ViRW50aXR5PiBzdWJFbnRpdGllczsKKworICAgIHByaXZhdGUgRmlsdGVyZWRDbGFzc0VudGl0eSBmaWx0ZXJlZDsKKworICAgIEBYbWxUcmFuc2llbnQKKyAgICBASnNvbklnbm9yZQorICAgIHB1YmxpYyBTdHJpbmcgYWNjZXNzb3JUcmFuc2llbnQ7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5KCkgeworICAgICAgICByZXR1cm4gcHJvcGVydHk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkoZmluYWwgU3RyaW5nIHByb3BlcnR5KSB7CisgICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxEZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5PiBnZXREZWZhdWx0RW50aXRpZXMoKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0RW50aXRpZXM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdEVudGl0aWVzKGZpbmFsIExpc3Q8RGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eT4gZGVmYXVsdEVudGl0aWVzKSB7CisgICAgICAgIHRoaXMuZGVmYXVsdEVudGl0aWVzID0gZGVmYXVsdEVudGl0aWVzOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PE9uZUZpbHRlcmluZ1N1YkVudGl0eT4gZ2V0U3ViRW50aXRpZXMoKSB7CisgICAgICAgIHJldHVybiBzdWJFbnRpdGllczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdWJFbnRpdGllcyhmaW5hbCBMaXN0PE9uZUZpbHRlcmluZ1N1YkVudGl0eT4gc3ViRW50aXRpZXMpIHsKKyAgICAgICAgdGhpcy5zdWJFbnRpdGllcyA9IHN1YkVudGl0aWVzOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWNjZXNzb3IoKSB7CisgICAgICAgIHJldHVybiBhY2Nlc3NvclRyYW5zaWVudCA9PSBudWxsID8gcHJvcGVydHkgKyBwcm9wZXJ0eSA6IGFjY2Vzc29yVHJhbnNpZW50OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEFjY2Vzc29yKGZpbmFsIFN0cmluZyBhY2Nlc3NvcikgeworICAgICAgICBhY2Nlc3NvclRyYW5zaWVudCA9IGFjY2Vzc29yOworICAgIH0KKworICAgIHB1YmxpYyBGaWx0ZXJlZENsYXNzRW50aXR5IGdldEZpbHRlcmVkKCkgeworICAgICAgICByZXR1cm4gZmlsdGVyZWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RmlsdGVyZWQoZmluYWwgRmlsdGVyZWRDbGFzc0VudGl0eSBmaWx0ZXJlZCkgeworICAgICAgICB0aGlzLmZpbHRlcmVkID0gZmlsdGVyZWQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL2RvbWFpbi9PbmVGaWx0ZXJpbmdPblByb3BlcnRpZXNFbnRpdHkuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9kb21haW4vT25lRmlsdGVyaW5nT25Qcm9wZXJ0aWVzRW50aXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM4MDllNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9kb21haW4vT25lRmlsdGVyaW5nT25Qcm9wZXJ0aWVzRW50aXR5LmphdmEKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuZG9tYWluOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFRyYW5zaWVudDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLlByaW1hcnlEZXRhaWxlZFZpZXc7CisKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uYW5ub3RhdGlvbi5Kc29uQXV0b0RldGVjdDsKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uYW5ub3RhdGlvbi5Kc29uSWdub3JlOworCisvKioKKyogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisqLworQEpzb25BdXRvRGV0ZWN0KGZpZWxkVmlzaWJpbGl0eSA9IEpzb25BdXRvRGV0ZWN0LlZpc2liaWxpdHkuQU5ZLCBnZXR0ZXJWaXNpYmlsaXR5ID0gSnNvbkF1dG9EZXRlY3QuVmlzaWJpbGl0eS5BTlkpCitAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuUFJPUEVSVFkpCitwdWJsaWMgY2xhc3MgT25lRmlsdGVyaW5nT25Qcm9wZXJ0aWVzRW50aXR5IHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgT25lRmlsdGVyaW5nT25Qcm9wZXJ0aWVzRW50aXR5IElOU1RBTkNFOworCisgICAgc3RhdGljIHsKKyAgICAgICAgSU5TVEFOQ0UgPSBuZXcgT25lRmlsdGVyaW5nT25Qcm9wZXJ0aWVzRW50aXR5KCk7CisgICAgICAgIElOU1RBTkNFLmZpZWxkID0gODA7CisgICAgICAgIElOU1RBTkNFLnByb3BlcnR5ID0gInByb3BlcnR5IjsKKyAgICAgICAgSU5TVEFOQ0UuZGVmYXVsdEVudGl0aWVzID0gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChEZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5LklOU1RBTkNFKTsKKyAgICAgICAgSU5TVEFOQ0Uuc3ViRW50aXRpZXMgPSBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KE9uZUZpbHRlcmluZ1N1YkVudGl0eS5JTlNUQU5DRSk7CisgICAgICAgIElOU1RBTkNFLmZpbHRlcmVkID0gRmlsdGVyZWRDbGFzc0VudGl0eS5JTlNUQU5DRTsKKyAgICB9CisKKyAgICBAWG1sRWxlbWVudAorICAgIHB1YmxpYyBpbnQgZmllbGQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgcHJvcGVydHk7CisKKyAgICBwcml2YXRlIExpc3Q8RGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eT4gZGVmYXVsdEVudGl0aWVzOworCisgICAgQFByaW1hcnlEZXRhaWxlZFZpZXcKKyAgICBwcml2YXRlIExpc3Q8T25lRmlsdGVyaW5nU3ViRW50aXR5PiBzdWJFbnRpdGllczsKKworICAgIEBQcmltYXJ5RGV0YWlsZWRWaWV3CisgICAgcHJpdmF0ZSBGaWx0ZXJlZENsYXNzRW50aXR5IGZpbHRlcmVkOworCisgICAgQFhtbFRyYW5zaWVudAorICAgIEBKc29uSWdub3JlCisgICAgcHVibGljIFN0cmluZyBhY2Nlc3NvclRyYW5zaWVudDsKKworICAgIEBQcmltYXJ5RGV0YWlsZWRWaWV3CisgICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eSgpIHsKKyAgICAgICAgcmV0dXJuIHByb3BlcnR5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5KGZpbmFsIFN0cmluZyBwcm9wZXJ0eSkgeworICAgICAgICB0aGlzLnByb3BlcnR5ID0gcHJvcGVydHk7CisgICAgfQorCisgICAgQFByaW1hcnlEZXRhaWxlZFZpZXcKKyAgICBwdWJsaWMgTGlzdDxEZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5PiBnZXREZWZhdWx0RW50aXRpZXMoKSB7CisgICAgICAgIHJldHVybiBkZWZhdWx0RW50aXRpZXM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RGVmYXVsdEVudGl0aWVzKGZpbmFsIExpc3Q8RGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eT4gZGVmYXVsdEVudGl0aWVzKSB7CisgICAgICAgIHRoaXMuZGVmYXVsdEVudGl0aWVzID0gZGVmYXVsdEVudGl0aWVzOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PE9uZUZpbHRlcmluZ1N1YkVudGl0eT4gZ2V0U3ViRW50aXRpZXMoKSB7CisgICAgICAgIHJldHVybiBzdWJFbnRpdGllczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRTdWJFbnRpdGllcyhmaW5hbCBMaXN0PE9uZUZpbHRlcmluZ1N1YkVudGl0eT4gc3ViRW50aXRpZXMpIHsKKyAgICAgICAgdGhpcy5zdWJFbnRpdGllcyA9IHN1YkVudGl0aWVzOworICAgIH0KKworICAgIEBQcmltYXJ5RGV0YWlsZWRWaWV3CisgICAgcHVibGljIFN0cmluZyBnZXRBY2Nlc3NvcigpIHsKKyAgICAgICAgcmV0dXJuIGFjY2Vzc29yVHJhbnNpZW50ID09IG51bGwgPyBwcm9wZXJ0eSArIHByb3BlcnR5IDogYWNjZXNzb3JUcmFuc2llbnQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0QWNjZXNzb3IoZmluYWwgU3RyaW5nIGFjY2Vzc29yKSB7CisgICAgICAgIGFjY2Vzc29yVHJhbnNpZW50ID0gYWNjZXNzb3I7CisgICAgfQorCisgICAgcHVibGljIEZpbHRlcmVkQ2xhc3NFbnRpdHkgZ2V0RmlsdGVyZWQoKSB7CisgICAgICAgIHJldHVybiBmaWx0ZXJlZDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRGaWx0ZXJlZChmaW5hbCBGaWx0ZXJlZENsYXNzRW50aXR5IGZpbHRlcmVkKSB7CisgICAgICAgIHRoaXMuZmlsdGVyZWQgPSBmaWx0ZXJlZDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvZG9tYWluL09uZUZpbHRlcmluZ1N1YkVudGl0eS5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL2RvbWFpbi9PbmVGaWx0ZXJpbmdTdWJFbnRpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDljYTA1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL2RvbWFpbi9PbmVGaWx0ZXJpbmdTdWJFbnRpdHkuamF2YQpAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLmRvbWFpbjsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5QcmltYXJ5RGV0YWlsZWRWaWV3OworCitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmFubm90YXRpb24uSnNvbkF1dG9EZXRlY3Q7CisKKy8qKgorKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyovCitASnNvbkF1dG9EZXRlY3QoZmllbGRWaXNpYmlsaXR5ID0gSnNvbkF1dG9EZXRlY3QuVmlzaWJpbGl0eS5BTlksIGdldHRlclZpc2liaWxpdHkgPSBKc29uQXV0b0RldGVjdC5WaXNpYmlsaXR5LkFOWSkKK0BYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5QUk9QRVJUWSkKK3B1YmxpYyBjbGFzcyBPbmVGaWx0ZXJpbmdTdWJFbnRpdHkgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBPbmVGaWx0ZXJpbmdTdWJFbnRpdHkgSU5TVEFOQ0U7CisKKyAgICBzdGF0aWMgeworICAgICAgICBJTlNUQU5DRSA9IG5ldyBPbmVGaWx0ZXJpbmdTdWJFbnRpdHkoKTsKKyAgICAgICAgSU5TVEFOQ0UuZmllbGQxID0gMjA7CisgICAgICAgIElOU1RBTkNFLmZpZWxkMiA9IDMwOworICAgICAgICBJTlNUQU5DRS5wcm9wZXJ0eTEgPSAicHJvcGVydHkxIjsKKyAgICAgICAgSU5TVEFOQ0UucHJvcGVydHkyID0gInByb3BlcnR5MiI7CisgICAgfQorCisgICAgQFhtbEVsZW1lbnQKKyAgICBwdWJsaWMgaW50IGZpZWxkMTsKKworICAgIEBYbWxFbGVtZW50CisgICAgQFByaW1hcnlEZXRhaWxlZFZpZXcKKyAgICBwdWJsaWMgaW50IGZpZWxkMjsKKworICAgIHByaXZhdGUgU3RyaW5nIHByb3BlcnR5MTsKKyAgICBwcml2YXRlIFN0cmluZyBwcm9wZXJ0eTI7CisKKyAgICBAUHJpbWFyeURldGFpbGVkVmlldworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkxKCkgeworICAgICAgICByZXR1cm4gcHJvcGVydHkxOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5MShmaW5hbCBTdHJpbmcgcHJvcGVydHkxKSB7CisgICAgICAgIHRoaXMucHJvcGVydHkxID0gcHJvcGVydHkxOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkyKCkgeworICAgICAgICByZXR1cm4gcHJvcGVydHkyOworICAgIH0KKworICAgIEBQcmltYXJ5RGV0YWlsZWRWaWV3CisgICAgcHVibGljIHZvaWQgc2V0UHJvcGVydHkyKGZpbmFsIFN0cmluZyBwcm9wZXJ0eTIpIHsKKyAgICAgICAgdGhpcy5wcm9wZXJ0eTIgPSBwcm9wZXJ0eTI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL2pzb24vSnNvbkVtcHR5RW50aXR5VGVzdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL2pzb24vSnNvbkVtcHR5RW50aXR5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZWU0MmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvanNvbi9Kc29uRW1wdHlFbnRpdHlUZXN0LmphdmEKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuanNvbjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmU7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LkNvbnRleHRSZXNvbHZlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uSmFja3NvbkZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuRW50aXR5RmlsdGVyaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb3h5Lmpzb24uTW94eUpzb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5kb21haW4uRW1wdHlFbnRpdHk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuZG9tYWluLk5vbkVtcHR5RW50aXR5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5udWxsVmFsdWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5hbm5vdGF0aW9uLkpzb25JbmNsdWRlOworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5PYmplY3RNYXBwZXI7CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLlNlcmlhbGl6YXRpb25GZWF0dXJlOworCisvKioKKyAqIFVzZS1jYXNlcyB0byBjaGVjayB3aGV0aGVyIGVtcHR5IGNsYXNzIGNhdXNlcyBwcm9ibGVtcyAoSkVSU0VZLTI4MjQgcmVwcm9kdWNlcikuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgSnNvbkVtcHR5RW50aXR5VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gIlByb3ZpZGVyOiB7MH0iKQorICAgIHB1YmxpYyBzdGF0aWMgSXRlcmFibGU8Q2xhc3NbXT4gcHJvdmlkZXJzKCkgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgQ2xhc3NbXVtdIHt7TW94eUpzb25GZWF0dXJlLmNsYXNzfSwge0phY2tzb25GZWF0dXJlLmNsYXNzfX0pOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQFBhdGgoIm5vbkVtcHR5RW50aXR5IikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgTm9uRW1wdHlFbnRpdHkgbm9uRW1wdHlFbnRpdHkoKSB7CisgICAgICAgICAgICByZXR1cm4gTm9uRW1wdHlFbnRpdHkuSU5TVEFOQ0U7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiZW1wdHlFbnRpdHkiKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBFbXB0eUVudGl0eSBlbXB0eUVudGl0eSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRW1wdHlFbnRpdHkoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBKc29uRW1wdHlFbnRpdHlUZXN0KGZpbmFsIENsYXNzPEZlYXR1cmU+IGZpbHRlcmluZ1Byb3ZpZGVyKSB7CisgICAgICAgIHN1cGVyKG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcywgRW50aXR5RmlsdGVyaW5nRmVhdHVyZS5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoZmlsdGVyaW5nUHJvdmlkZXIpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKG5ldyBDb250ZXh0UmVzb2x2ZXI8T2JqZWN0TWFwcGVyPigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPYmplY3RNYXBwZXIgZ2V0Q29udGV4dChmaW5hbCBDbGFzczw/PiB0eXBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdE1hcHBlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb25maWd1cmUoU2VyaWFsaXphdGlvbkZlYXR1cmUuRkFJTF9PTl9FTVBUWV9CRUFOUywgZmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRTZXJpYWxpemF0aW9uSW5jbHVzaW9uKEpzb25JbmNsdWRlLkluY2x1ZGUuTk9OX05VTEwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSkpOworCisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5EVU1QX0VOVElUWSk7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uRW1wdHlFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgTm9uRW1wdHlFbnRpdHkgZW50aXR5ID0gdGFyZ2V0KCJub25FbXB0eUVudGl0eSIpLnJlcXVlc3QoKS5nZXQoTm9uRW1wdHlFbnRpdHkuY2xhc3MpOworCisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmdldFZhbHVlKCksIGlzKCJmb28iKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmdldEVtcHR5RW50aXR5KCksIG51bGxWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUVudGl0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRUaGF0KHRhcmdldCgiZW1wdHlFbnRpdHkiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyksIGlzKCJ7fSIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvanNvbi9Kc29uRW50aXR5RmlsdGVyaW5nQ2xpZW50VGVzdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL2pzb24vSnNvbkVudGl0eUZpbHRlcmluZ0NsaWVudFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTgwYzJlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL2pzb24vSnNvbkVudGl0eUZpbHRlcmluZ0NsaWVudFRlc3QuamF2YQpAQCAtMCwwICsxLDI3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5qc29uOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5DdXN0b21Bbm5vdGF0aW9uTGl0ZXJhbDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uLkphY2tzb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLkVudGl0eUZpbHRlcmluZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW94eS5qc29uLk1veHlKc29uRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuRGVmYXVsdEZpbHRlcmluZ1Njb3BlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLlByaW1hcnlEZXRhaWxlZFZpZXc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuU2Vjb25kYXJ5RGV0YWlsZWRWaWV3OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLmRvbWFpbi5EZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLmRvbWFpbi5GaWx0ZXJlZENsYXNzRW50aXR5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLmRvbWFpbi5NYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuZG9tYWluLk1hbnlGaWx0ZXJpbmdzU3ViRW50aXR5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLmRvbWFpbi5PbmVGaWx0ZXJpbmdPbkNsYXNzRW50aXR5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLmRvbWFpbi5PbmVGaWx0ZXJpbmdTdWJFbnRpdHk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5ub3ROdWxsVmFsdWU7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMubnVsbFZhbHVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgSnNvbkVudGl0eUZpbHRlcmluZ0NsaWVudFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMobmFtZSA9ICJQcm92aWRlcjogezB9IikKKyAgICBwdWJsaWMgc3RhdGljIEl0ZXJhYmxlPENsYXNzW10+IHByb3ZpZGVycygpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IENsYXNzW11bXSB7e01veHlKc29uRmVhdHVyZS5jbGFzc30sIHtKYWNrc29uRmVhdHVyZS5jbGFzc319KTsKKyAgICB9CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXIKKyAgICBwdWJsaWMgQ2xhc3M8RmVhdHVyZT4gZmlsdGVyaW5nUHJvdmlkZXI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworCisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoKQorICAgICAgICAgICAgICAgIC8vIFJlc291cmNlcy4KKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChmaW5hbCBDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihFbnRpdHlGaWx0ZXJpbmdGZWF0dXJlLmNsYXNzKS5yZWdpc3RlcihmaWx0ZXJpbmdQcm92aWRlcik7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9qc29uIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3QoZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbnRpdHlBbm5vdGF0aW9uc1ByaW1hcnlWaWV3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIE9uZUZpbHRlcmluZ09uQ2xhc3NFbnRpdHkgZW50aXR5ID0gdGFyZ2V0KCkKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25lRmlsdGVyaW5nT25DbGFzc0VudGl0eS5JTlNUQU5DRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFubm90YXRpb25bXSB7UHJpbWFyeURldGFpbGVkVmlldy5GYWN0b3J5LmdldCgpfSksCisgICAgICAgICAgICAgICAgICAgICAgICBPbmVGaWx0ZXJpbmdPbkNsYXNzRW50aXR5LmNsYXNzKTsKKworICAgICAgICBfdGVzdFByaW1hcnlWaWV3RW50aXR5KGVudGl0eSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW50aXR5QW5ub3RhdGlvbnNEZWZhdWx0VmlldygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBPbmVGaWx0ZXJpbmdPbkNsYXNzRW50aXR5IGVudGl0eSA9IHRhcmdldCgpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uZUZpbHRlcmluZ09uQ2xhc3NFbnRpdHkuSU5TVEFOQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBbm5vdGF0aW9uW10ge25ldyBEZWZhdWx0RmlsdGVyaW5nU2NvcGUoKX0pLAorICAgICAgICAgICAgICAgICAgICAgICAgT25lRmlsdGVyaW5nT25DbGFzc0VudGl0eS5jbGFzcyk7CisKKyAgICAgICAgX3Rlc3RFbXB0eUVudGl0eShlbnRpdHkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVudGl0eUFubm90YXRpb25zSW52YWxpZFZpZXcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgT25lRmlsdGVyaW5nT25DbGFzc0VudGl0eSBlbnRpdHkgPSB0YXJnZXQoKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbmVGaWx0ZXJpbmdPbkNsYXNzRW50aXR5LklOU1RBTkNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQW5ub3RhdGlvbltdIHtDdXN0b21Bbm5vdGF0aW9uTGl0ZXJhbC5JTlNUQU5DRX0pLAorICAgICAgICAgICAgICAgICAgICAgICAgT25lRmlsdGVyaW5nT25DbGFzc0VudGl0eS5jbGFzcyk7CisKKyAgICAgICAgX3Rlc3RFbXB0eUVudGl0eShlbnRpdHkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbmZpZ3VyYXRpb25QcmltYXJ5VmlldygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdFByaW1hcnlWaWV3RW50aXR5KHJldHJpZXZlRW50aXR5KFByaW1hcnlEZXRhaWxlZFZpZXcuRmFjdG9yeS5nZXQoKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbmZpZ3VyYXRpb25EZWZhdWx0VmlldygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdEVtcHR5RW50aXR5KHJldHJpZXZlRW50aXR5KG5ldyBEZWZhdWx0RmlsdGVyaW5nU2NvcGUoKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbmZpZ3VyYXRpb25NdWx0aXBsZVZpZXdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0UHJpbWFyeVZpZXdFbnRpdHkocmV0cmlldmVFbnRpdHkoUHJpbWFyeURldGFpbGVkVmlldy5GYWN0b3J5LmdldCgpLCBDdXN0b21Bbm5vdGF0aW9uTGl0ZXJhbC5JTlNUQU5DRSkpOworICAgIH0KKworICAgIHByaXZhdGUgT25lRmlsdGVyaW5nT25DbGFzc0VudGl0eSByZXRyaWV2ZUVudGl0eShmaW5hbCBBbm5vdGF0aW9uLi4uIGFubm90YXRpb25zKSB7CisgICAgICAgIGZpbmFsIENsaWVudENvbmZpZyBjb25maWcgPSBuZXcgQ2xpZW50Q29uZmlnKCkKKyAgICAgICAgICAgICAgICAucHJvcGVydHkoRW50aXR5RmlsdGVyaW5nRmVhdHVyZS5FTlRJVFlfRklMVEVSSU5HX1NDT1BFLCBhbm5vdGF0aW9ucy5sZW5ndGggPT0gMSA/IGFubm90YXRpb25zWzBdIDogYW5ub3RhdGlvbnMpOworICAgICAgICBjb25maWd1cmVDbGllbnQoY29uZmlnKTsKKworICAgICAgICByZXR1cm4gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoY29uZmlnKQorICAgICAgICAgICAgICAgIC50YXJnZXQoZ2V0QmFzZVVyaSgpKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KE9uZUZpbHRlcmluZ09uQ2xhc3NFbnRpdHkuSU5TVEFOQ0UsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUpLAorICAgICAgICAgICAgICAgICAgICAgICAgT25lRmlsdGVyaW5nT25DbGFzc0VudGl0eS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZENvbmZpZ3VyYXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ2xpZW50Q29uZmlnIGNvbmZpZyA9IG5ldyBDbGllbnRDb25maWcoKQorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShFbnRpdHlGaWx0ZXJpbmdGZWF0dXJlLkVOVElUWV9GSUxURVJJTkdfU0NPUEUsICJpbnZhbGlkX3ZhbHVlIik7CisgICAgICAgIGNvbmZpZ3VyZUNsaWVudChjb25maWcpOworCisgICAgICAgIGZpbmFsIE9uZUZpbHRlcmluZ09uQ2xhc3NFbnRpdHkgZW50aXR5ID0KKyAgICAgICAgICAgICAgICBDbGllbnRCdWlsZGVyLm5ld0NsaWVudChjb25maWcpCisgICAgICAgICAgICAgICAgICAgICAgICAudGFyZ2V0KGdldEJhc2VVcmkoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkoT25lRmlsdGVyaW5nT25DbGFzc0VudGl0eS5JTlNUQU5DRSwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uZUZpbHRlcmluZ09uQ2xhc3NFbnRpdHkuY2xhc3MpOworCisgICAgICAgIF90ZXN0RW1wdHlFbnRpdHkoZW50aXR5KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbnRpdHlBbm5vdGF0aW9uc092ZXJDb25maWd1cmF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENsaWVudENvbmZpZyBjb25maWcgPSBuZXcgQ2xpZW50Q29uZmlnKCkKKyAgICAgICAgICAgICAgICAucHJvcGVydHkoRW50aXR5RmlsdGVyaW5nRmVhdHVyZS5FTlRJVFlfRklMVEVSSU5HX1NDT1BFLCBTZWNvbmRhcnlEZXRhaWxlZFZpZXcuRmFjdG9yeS5nZXQoKSk7CisgICAgICAgIGNvbmZpZ3VyZUNsaWVudChjb25maWcpOworCisgICAgICAgIGZpbmFsIE1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eSBlbnRpdHkgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudChjb25maWcpCisgICAgICAgICAgICAgICAgLnRhcmdldChnZXRCYXNlVXJpKCkpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eS5JTlNUQU5DRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFubm90YXRpb25bXSB7UHJpbWFyeURldGFpbGVkVmlldy5GYWN0b3J5LmdldCgpfSksCisgICAgICAgICAgICAgICAgICAgICAgICBNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkuY2xhc3MpOworCisgICAgICAgIC8vIE1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5maWVsZCwgaXMoNTApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuYWNjZXNzb3JUcmFuc2llbnQsIGlzKCJwcm9wZXJ0eXByb3BlcnR5IikpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXRQcm9wZXJ0eSgpLCBpcygicHJvcGVydHkiKSk7CisKKyAgICAgICAgLy8gRmlsdGVyZWRDbGFzc0VudGl0eQorICAgICAgICBmaW5hbCBGaWx0ZXJlZENsYXNzRW50aXR5IGZpbHRlcmVkID0gZW50aXR5LmZpbHRlcmVkOworICAgICAgICBhc3NlcnRUaGF0KGZpbHRlcmVkLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZmlsdGVyZWQuZmllbGQsIGlzKDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChmaWx0ZXJlZC5nZXRQcm9wZXJ0eSgpLCBudWxsVmFsdWUoKSk7CisKKyAgICAgICAgLy8gRGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5kZWZhdWx0RW50aXRpZXMsIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZGVmYXVsdEVudGl0aWVzLnNpemUoKSwgaXMoMSkpOworICAgICAgICBmaW5hbCBEZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5IGRlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkgPSBlbnRpdHkuZGVmYXVsdEVudGl0aWVzLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0VGhhdChkZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5LmZpZWxkLCBpcyh0cnVlKSk7CisgICAgICAgIGFzc2VydFRoYXQoZGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eS5nZXRQcm9wZXJ0eSgpLCBpcygyMEwpKTsKKworICAgICAgICAvLyBPbmVGaWx0ZXJpbmdTdWJFbnRpdHkKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkub25lRW50aXRpZXMsIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkub25lRW50aXRpZXMuc2l6ZSgpLCBpcygxKSk7CisgICAgICAgIGZpbmFsIE9uZUZpbHRlcmluZ1N1YkVudGl0eSBvbmVGaWx0ZXJpbmdTdWJFbnRpdHkgPSBlbnRpdHkub25lRW50aXRpZXMuZ2V0KDApOworICAgICAgICBhc3NlcnRUaGF0KG9uZUZpbHRlcmluZ1N1YkVudGl0eS5maWVsZDEsIGlzKDIwKSk7CisgICAgICAgIGFzc2VydFRoYXQob25lRmlsdGVyaW5nU3ViRW50aXR5LmZpZWxkMiwgaXMoMzApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChvbmVGaWx0ZXJpbmdTdWJFbnRpdHkuZ2V0UHJvcGVydHkxKCksIGlzKCJwcm9wZXJ0eTEiKSk7CisgICAgICAgIGFzc2VydFRoYXQob25lRmlsdGVyaW5nU3ViRW50aXR5LmdldFByb3BlcnR5MigpLCBpcygicHJvcGVydHkyIikpOworCisgICAgICAgIC8vIE1hbnlGaWx0ZXJpbmdzU3ViRW50aXR5CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5Lm1hbnlFbnRpdGllcywgbm90TnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5tYW55RW50aXRpZXMuc2l6ZSgpLCBpcygxKSk7CisgICAgICAgIGZpbmFsIE1hbnlGaWx0ZXJpbmdzU3ViRW50aXR5IG1hbnlGaWx0ZXJpbmdzU3ViRW50aXR5ID0gZW50aXR5Lm1hbnlFbnRpdGllcy5nZXQoMCk7CisgICAgICAgIGFzc2VydFRoYXQobWFueUZpbHRlcmluZ3NTdWJFbnRpdHkuZmllbGQxLCBpcyg2MCkpOworICAgICAgICBhc3NlcnRUaGF0KG1hbnlGaWx0ZXJpbmdzU3ViRW50aXR5LmZpZWxkMiwgaXMoMCkpOworICAgICAgICBhc3NlcnRUaGF0KG1hbnlGaWx0ZXJpbmdzU3ViRW50aXR5LmdldFByb3BlcnR5MSgpLCBpcygicHJvcGVydHkxIikpOworICAgICAgICBhc3NlcnRUaGF0KG1hbnlGaWx0ZXJpbmdzU3ViRW50aXR5LmdldFByb3BlcnR5MigpLCBudWxsVmFsdWUoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0RW1wdHlFbnRpdHkoZmluYWwgT25lRmlsdGVyaW5nT25DbGFzc0VudGl0eSBlbnRpdHkpIHsKKyAgICAgICAgLy8gT25lRmlsdGVyaW5nT25DbGFzc0VudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5maWVsZCwgaXMoMCkpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5hY2Nlc3NvclRyYW5zaWVudCwgbnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXRQcm9wZXJ0eSgpLCBudWxsVmFsdWUoKSk7CisKKyAgICAgICAgLy8gRmlsdGVyZWRDbGFzc0VudGl0eQorICAgICAgICBmaW5hbCBGaWx0ZXJlZENsYXNzRW50aXR5IGZpbHRlcmVkID0gZW50aXR5LmdldEZpbHRlcmVkKCk7CisgICAgICAgIGFzc2VydFRoYXQoZmlsdGVyZWQsIG51bGxWYWx1ZSgpKTsKKworICAgICAgICAvLyBEZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmdldERlZmF1bHRFbnRpdGllcygpLCBudWxsVmFsdWUoKSk7CisKKyAgICAgICAgLy8gT25lRmlsdGVyaW5nU3ViRW50aXR5CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmdldFN1YkVudGl0aWVzKCksIG51bGxWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3RQcmltYXJ5Vmlld0VudGl0eShmaW5hbCBPbmVGaWx0ZXJpbmdPbkNsYXNzRW50aXR5IGVudGl0eSkgeworICAgICAgICAvLyBPbmVGaWx0ZXJpbmdPbkNsYXNzRW50aXR5CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmZpZWxkLCBpcygxMCkpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5hY2Nlc3NvclRyYW5zaWVudCwgaXMoInByb3BlcnR5cHJvcGVydHkiKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmdldFByb3BlcnR5KCksIGlzKCJwcm9wZXJ0eSIpKTsKKworICAgICAgICAvLyBGaWx0ZXJlZENsYXNzRW50aXR5CisgICAgICAgIGZpbmFsIEZpbHRlcmVkQ2xhc3NFbnRpdHkgZmlsdGVyZWQgPSBlbnRpdHkuZ2V0RmlsdGVyZWQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChmaWx0ZXJlZCwgbm90TnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KGZpbHRlcmVkLmZpZWxkLCBpcygwKSk7CisgICAgICAgIGFzc2VydFRoYXQoZmlsdGVyZWQuZ2V0UHJvcGVydHkoKSwgbnVsbFZhbHVlKCkpOworCisgICAgICAgIC8vIERlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0RGVmYXVsdEVudGl0aWVzKCksIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0RGVmYXVsdEVudGl0aWVzKCkuc2l6ZSgpLCBpcygxKSk7CisgICAgICAgIGZpbmFsIERlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkgZGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eSA9IGVudGl0eS5nZXREZWZhdWx0RW50aXRpZXMoKS5nZXQoMCk7CisgICAgICAgIGFzc2VydFRoYXQoZGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eS5maWVsZCwgaXModHJ1ZSkpOworICAgICAgICBhc3NlcnRUaGF0KGRlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkuZ2V0UHJvcGVydHkoKSwgaXMoMjBMKSk7CisKKyAgICAgICAgLy8gT25lRmlsdGVyaW5nU3ViRW50aXR5CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmdldFN1YkVudGl0aWVzKCksIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0U3ViRW50aXRpZXMoKS5zaXplKCksIGlzKDEpKTsKKyAgICAgICAgZmluYWwgT25lRmlsdGVyaW5nU3ViRW50aXR5IG9uZUZpbHRlcmluZ1N1YkVudGl0eSA9IGVudGl0eS5nZXRTdWJFbnRpdGllcygpLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0VGhhdChvbmVGaWx0ZXJpbmdTdWJFbnRpdHkuZmllbGQxLCBpcygyMCkpOworICAgICAgICBhc3NlcnRUaGF0KG9uZUZpbHRlcmluZ1N1YkVudGl0eS5maWVsZDIsIGlzKDMwKSk7CisgICAgICAgIGFzc2VydFRoYXQob25lRmlsdGVyaW5nU3ViRW50aXR5LmdldFByb3BlcnR5MSgpLCBpcygicHJvcGVydHkxIikpOworICAgICAgICBhc3NlcnRUaGF0KG9uZUZpbHRlcmluZ1N1YkVudGl0eS5nZXRQcm9wZXJ0eTIoKSwgaXMoInByb3BlcnR5MiIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvanNvbi9Kc29uRW50aXR5RmlsdGVyaW5nT25DbGFzc1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9qc29uL0pzb25FbnRpdHlGaWx0ZXJpbmdPbkNsYXNzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxOGVlZWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvanNvbi9Kc29uRW50aXR5RmlsdGVyaW5nT25DbGFzc1Rlc3QuamF2YQpAQCAtMCwwICsxLDM2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5qc29uOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uSmFja3NvbkZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuRW50aXR5RmlsdGVyaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb3h5Lmpzb24uTW94eUpzb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5EZWZhdWx0RmlsdGVyaW5nU2NvcGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuUHJpbWFyeURldGFpbGVkVmlldzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5TZWNvbmRhcnlEZXRhaWxlZFZpZXc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuZG9tYWluLkRlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuZG9tYWluLkZpbHRlcmVkQ2xhc3NFbnRpdHk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuZG9tYWluLk1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5kb21haW4uTWFueUZpbHRlcmluZ3NTdWJFbnRpdHk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuZG9tYWluLk9uZUZpbHRlcmluZ09uQ2xhc3NFbnRpdHk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuZG9tYWluLk9uZUZpbHRlcmluZ1N1YkVudGl0eTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLm5vdE51bGxWYWx1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5udWxsVmFsdWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBVc2UtY2FzZXMgd2l0aCBlbnRpdHktZmlsdGVyaW5nIGFubm90YXRpb25zIG9uIGNsYXNzLCBKU09OIG91dHB1dC4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBKc29uRW50aXR5RmlsdGVyaW5nT25DbGFzc1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMobmFtZSA9ICJQcm92aWRlcjogezB9IikKKyAgICBwdWJsaWMgc3RhdGljIEl0ZXJhYmxlPENsYXNzW10+IHByb3ZpZGVycygpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IENsYXNzW11bXSB7e01veHlKc29uRmVhdHVyZS5jbGFzc30sIHtKYWNrc29uRmVhdHVyZS5jbGFzc319KTsKKyAgICB9CisKKyAgICBwdWJsaWMgSnNvbkVudGl0eUZpbHRlcmluZ09uQ2xhc3NUZXN0KGZpbmFsIENsYXNzPEZlYXR1cmU+IGZpbHRlcmluZ1Byb3ZpZGVyKSB7CisgICAgICAgIHN1cGVyKG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcywgRW50aXR5RmlsdGVyaW5nRmVhdHVyZS5jbGFzcykucmVnaXN0ZXIoZmlsdGVyaW5nUHJvdmlkZXIpKTsKKworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiT25lRmlsdGVyaW5nRW50aXR5IikKKyAgICAgICAgQFByaW1hcnlEZXRhaWxlZFZpZXcKKyAgICAgICAgcHVibGljIE9uZUZpbHRlcmluZ09uQ2xhc3NFbnRpdHkgZ2V0T25lRmlsdGVyaW5nRW50aXR5KCkgeworICAgICAgICAgICAgcmV0dXJuIE9uZUZpbHRlcmluZ09uQ2xhc3NFbnRpdHkuSU5TVEFOQ0U7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJPbmVGaWx0ZXJpbmdFbnRpdHlEZWZhdWx0VmlldyIpCisgICAgICAgIHB1YmxpYyBPbmVGaWx0ZXJpbmdPbkNsYXNzRW50aXR5IGdldE9uZUZpbHRlcmluZ0VudGl0eURlZmF1bHRWaWV3KCkgeworICAgICAgICAgICAgcmV0dXJuIE9uZUZpbHRlcmluZ09uQ2xhc3NFbnRpdHkuSU5TVEFOQ0U7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgiT25lRmlsdGVyaW5nRW50aXR5IikKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0T25lRmlsdGVyaW5nRW50aXR5KGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiT25lRmlsdGVyaW5nRW50aXR5RGVmYXVsdFZpZXdSZXNwb25zZSIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXRPbmVGaWx0ZXJpbmdFbnRpdHlEZWZhdWx0Vmlld1Jlc3BvbnNlKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCkuZW50aXR5KE9uZUZpbHRlcmluZ09uQ2xhc3NFbnRpdHkuSU5TVEFOQ0UsIG5ldyBBbm5vdGF0aW9uW10ge25ldyBEZWZhdWx0RmlsdGVyaW5nU2NvcGUoKX0pCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiTWFueUZpbHRlcmluZ3NFbnRpdHlQcmltYXJ5VmlldyIpCisgICAgICAgIEBQcmltYXJ5RGV0YWlsZWRWaWV3CisgICAgICAgIHB1YmxpYyBNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkgZ2V0TWFueUZpbHRlcmluZ3NFbnRpdHlQcmltYXJ5VmlldygpIHsKKyAgICAgICAgICAgIHJldHVybiBNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkuSU5TVEFOQ0U7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJNYW55RmlsdGVyaW5nc0VudGl0eVNlY29uZGFyeVZpZXciKQorICAgICAgICBAU2Vjb25kYXJ5RGV0YWlsZWRWaWV3CisgICAgICAgIHB1YmxpYyBNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkgZ2V0TWFueUZpbHRlcmluZ3NFbnRpdHlTZWNvbmRhcnlWaWV3KCkgeworICAgICAgICAgICAgcmV0dXJuIE1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eS5JTlNUQU5DRTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIk1hbnlGaWx0ZXJpbmdzRW50aXR5RGVmYXVsdFZpZXciKQorICAgICAgICBwdWJsaWMgTWFueUZpbHRlcmluZ3NPbkNsYXNzRW50aXR5IGdldE1hbnlGaWx0ZXJpbmdzRW50aXR5RGVmYXVsdFZpZXcoKSB7CisgICAgICAgICAgICByZXR1cm4gTWFueUZpbHRlcmluZ3NPbkNsYXNzRW50aXR5LklOU1RBTkNFOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiTWFueUZpbHRlcmluZ3NFbnRpdHlNYW55Vmlld3MiKQorICAgICAgICBAUHJpbWFyeURldGFpbGVkVmlldworICAgICAgICBAU2Vjb25kYXJ5RGV0YWlsZWRWaWV3CisgICAgICAgIHB1YmxpYyBNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkgZ2V0TWFueUZpbHRlcmluZ3NFbnRpdHlNYW55Vmlld3MoKSB7CisgICAgICAgICAgICByZXR1cm4gTWFueUZpbHRlcmluZ3NPbkNsYXNzRW50aXR5LklOU1RBTkNFOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25lRW50aXR5RmlsdGVyaW5nT25DbGFzcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBPbmVGaWx0ZXJpbmdPbkNsYXNzRW50aXR5IGVudGl0eSA9IHRhcmdldCgiT25lRmlsdGVyaW5nRW50aXR5IikucmVxdWVzdCgpLmdldChPbmVGaWx0ZXJpbmdPbkNsYXNzRW50aXR5LmNsYXNzKTsKKworICAgICAgICAvLyBPbmVGaWx0ZXJpbmdPbkNsYXNzRW50aXR5CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmZpZWxkLCBpcygxMCkpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5hY2Nlc3NvclRyYW5zaWVudCwgaXMoInByb3BlcnR5cHJvcGVydHkiKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmdldFByb3BlcnR5KCksIGlzKCJwcm9wZXJ0eSIpKTsKKworICAgICAgICAvLyBGaWx0ZXJlZENsYXNzRW50aXR5CisgICAgICAgIGZpbmFsIEZpbHRlcmVkQ2xhc3NFbnRpdHkgZmlsdGVyZWQgPSBlbnRpdHkuZ2V0RmlsdGVyZWQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChmaWx0ZXJlZCwgbm90TnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KGZpbHRlcmVkLmZpZWxkLCBpcygwKSk7CisgICAgICAgIGFzc2VydFRoYXQoZmlsdGVyZWQuZ2V0UHJvcGVydHkoKSwgbnVsbFZhbHVlKCkpOworCisgICAgICAgIC8vIERlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0RGVmYXVsdEVudGl0aWVzKCksIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0RGVmYXVsdEVudGl0aWVzKCkuc2l6ZSgpLCBpcygxKSk7CisgICAgICAgIGZpbmFsIERlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkgZGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eSA9IGVudGl0eS5nZXREZWZhdWx0RW50aXRpZXMoKS5nZXQoMCk7CisgICAgICAgIGFzc2VydFRoYXQoZGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eS5maWVsZCwgaXModHJ1ZSkpOworICAgICAgICBhc3NlcnRUaGF0KGRlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkuZ2V0UHJvcGVydHkoKSwgaXMoMjBMKSk7CisKKyAgICAgICAgLy8gT25lRmlsdGVyaW5nU3ViRW50aXR5CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmdldFN1YkVudGl0aWVzKCksIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0U3ViRW50aXRpZXMoKS5zaXplKCksIGlzKDEpKTsKKyAgICAgICAgZmluYWwgT25lRmlsdGVyaW5nU3ViRW50aXR5IG9uZUZpbHRlcmluZ1N1YkVudGl0eSA9IGVudGl0eS5nZXRTdWJFbnRpdGllcygpLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0VGhhdChvbmVGaWx0ZXJpbmdTdWJFbnRpdHkuZmllbGQxLCBpcygyMCkpOworICAgICAgICBhc3NlcnRUaGF0KG9uZUZpbHRlcmluZ1N1YkVudGl0eS5maWVsZDIsIGlzKDMwKSk7CisgICAgICAgIGFzc2VydFRoYXQob25lRmlsdGVyaW5nU3ViRW50aXR5LmdldFByb3BlcnR5MSgpLCBpcygicHJvcGVydHkxIikpOworICAgICAgICBhc3NlcnRUaGF0KG9uZUZpbHRlcmluZ1N1YkVudGl0eS5nZXRQcm9wZXJ0eTIoKSwgaXMoInByb3BlcnR5MiIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPbmVFbnRpdHlGaWx0ZXJpbmdPbkNsYXNzRGVmYXVsdFZpZXdSZXNwb25zZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBPbmVGaWx0ZXJpbmdPbkNsYXNzRW50aXR5IGVudGl0eSA9IHRhcmdldCgiT25lRmlsdGVyaW5nRW50aXR5RGVmYXVsdFZpZXdSZXNwb25zZSIpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5nZXQoT25lRmlsdGVyaW5nT25DbGFzc0VudGl0eS5jbGFzcyk7CisKKyAgICAgICAgLy8gT25lRmlsdGVyaW5nT25DbGFzc0VudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5maWVsZCwgaXMoMCkpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5hY2Nlc3NvclRyYW5zaWVudCwgbnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXRQcm9wZXJ0eSgpLCBudWxsVmFsdWUoKSk7CisKKyAgICAgICAgLy8gRmlsdGVyZWRDbGFzc0VudGl0eQorICAgICAgICBmaW5hbCBGaWx0ZXJlZENsYXNzRW50aXR5IGZpbHRlcmVkID0gZW50aXR5LmdldEZpbHRlcmVkKCk7CisgICAgICAgIGFzc2VydFRoYXQoZmlsdGVyZWQsIG51bGxWYWx1ZSgpKTsKKworICAgICAgICAvLyBEZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmdldERlZmF1bHRFbnRpdGllcygpLCBudWxsVmFsdWUoKSk7CisKKyAgICAgICAgLy8gT25lRmlsdGVyaW5nU3ViRW50aXR5CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmdldFN1YkVudGl0aWVzKCksIG51bGxWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPbmVFbnRpdHlGaWx0ZXJpbmdPbkNsYXNzRGVmYXVsdFZpZXcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgT25lRmlsdGVyaW5nT25DbGFzc0VudGl0eSBlbnRpdHkgPSB0YXJnZXQoIk9uZUZpbHRlcmluZ0VudGl0eURlZmF1bHRWaWV3IikucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLmdldChPbmVGaWx0ZXJpbmdPbkNsYXNzRW50aXR5LmNsYXNzKTsKKworICAgICAgICAvLyBPbmVGaWx0ZXJpbmdPbkNsYXNzRW50aXR5CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmZpZWxkLCBpcygwKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmFjY2Vzc29yVHJhbnNpZW50LCBudWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmdldFByb3BlcnR5KCksIG51bGxWYWx1ZSgpKTsKKworICAgICAgICAvLyBGaWx0ZXJlZENsYXNzRW50aXR5CisgICAgICAgIGZpbmFsIEZpbHRlcmVkQ2xhc3NFbnRpdHkgZmlsdGVyZWQgPSBlbnRpdHkuZ2V0RmlsdGVyZWQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChmaWx0ZXJlZCwgbnVsbFZhbHVlKCkpOworCisgICAgICAgIC8vIERlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0RGVmYXVsdEVudGl0aWVzKCksIG51bGxWYWx1ZSgpKTsKKworICAgICAgICAvLyBPbmVGaWx0ZXJpbmdTdWJFbnRpdHkKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0U3ViRW50aXRpZXMoKSwgbnVsbFZhbHVlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlVmlld3NPbkNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RPbmVFbnRpdHlGaWx0ZXJpbmdPbkNsYXNzKCk7CisgICAgICAgIHRlc3RPbmVFbnRpdHlGaWx0ZXJpbmdPbkNsYXNzRGVmYXVsdFZpZXcoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYW55RmlsdGVyaW5nc0VudGl0eVByaW1hcnlWaWV3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIE1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eSBlbnRpdHkgPSB0YXJnZXQoIk1hbnlGaWx0ZXJpbmdzRW50aXR5UHJpbWFyeVZpZXciKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAuZ2V0KE1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eS5jbGFzcyk7CisKKyAgICAgICAgLy8gTWFueUZpbHRlcmluZ3NPbkNsYXNzRW50aXR5CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmZpZWxkLCBpcyg1MCkpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5hY2Nlc3NvclRyYW5zaWVudCwgaXMoInByb3BlcnR5cHJvcGVydHkiKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmdldFByb3BlcnR5KCksIGlzKCJwcm9wZXJ0eSIpKTsKKworICAgICAgICAvLyBGaWx0ZXJlZENsYXNzRW50aXR5CisgICAgICAgIGZpbmFsIEZpbHRlcmVkQ2xhc3NFbnRpdHkgZmlsdGVyZWQgPSBlbnRpdHkuZmlsdGVyZWQ7CisgICAgICAgIGFzc2VydFRoYXQoZmlsdGVyZWQsIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChmaWx0ZXJlZC5maWVsZCwgaXMoMCkpOworICAgICAgICBhc3NlcnRUaGF0KGZpbHRlcmVkLmdldFByb3BlcnR5KCksIG51bGxWYWx1ZSgpKTsKKworICAgICAgICAvLyBEZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmRlZmF1bHRFbnRpdGllcywgbm90TnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5kZWZhdWx0RW50aXRpZXMuc2l6ZSgpLCBpcygxKSk7CisgICAgICAgIGZpbmFsIERlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkgZGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eSA9IGVudGl0eS5kZWZhdWx0RW50aXRpZXMuZ2V0KDApOworICAgICAgICBhc3NlcnRUaGF0KGRlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkuZmllbGQsIGlzKHRydWUpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChkZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5LmdldFByb3BlcnR5KCksIGlzKDIwTCkpOworCisgICAgICAgIC8vIE9uZUZpbHRlcmluZ1N1YkVudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5vbmVFbnRpdGllcywgbm90TnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5vbmVFbnRpdGllcy5zaXplKCksIGlzKDEpKTsKKyAgICAgICAgZmluYWwgT25lRmlsdGVyaW5nU3ViRW50aXR5IG9uZUZpbHRlcmluZ1N1YkVudGl0eSA9IGVudGl0eS5vbmVFbnRpdGllcy5nZXQoMCk7CisgICAgICAgIGFzc2VydFRoYXQob25lRmlsdGVyaW5nU3ViRW50aXR5LmZpZWxkMSwgaXMoMjApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChvbmVGaWx0ZXJpbmdTdWJFbnRpdHkuZmllbGQyLCBpcygzMCkpOworICAgICAgICBhc3NlcnRUaGF0KG9uZUZpbHRlcmluZ1N1YkVudGl0eS5nZXRQcm9wZXJ0eTEoKSwgaXMoInByb3BlcnR5MSIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChvbmVGaWx0ZXJpbmdTdWJFbnRpdHkuZ2V0UHJvcGVydHkyKCksIGlzKCJwcm9wZXJ0eTIiKSk7CisKKyAgICAgICAgLy8gTWFueUZpbHRlcmluZ3NTdWJFbnRpdHkKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkubWFueUVudGl0aWVzLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5Lm1hbnlFbnRpdGllcy5zaXplKCksIGlzKDEpKTsKKyAgICAgICAgZmluYWwgTWFueUZpbHRlcmluZ3NTdWJFbnRpdHkgbWFueUZpbHRlcmluZ3NTdWJFbnRpdHkgPSBlbnRpdHkubWFueUVudGl0aWVzLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtYW55RmlsdGVyaW5nc1N1YkVudGl0eS5maWVsZDEsIGlzKDYwKSk7CisgICAgICAgIGFzc2VydFRoYXQobWFueUZpbHRlcmluZ3NTdWJFbnRpdHkuZmllbGQyLCBpcygwKSk7CisgICAgICAgIGFzc2VydFRoYXQobWFueUZpbHRlcmluZ3NTdWJFbnRpdHkuZ2V0UHJvcGVydHkxKCksIGlzKCJwcm9wZXJ0eTEiKSk7CisgICAgICAgIGFzc2VydFRoYXQobWFueUZpbHRlcmluZ3NTdWJFbnRpdHkuZ2V0UHJvcGVydHkyKCksIG51bGxWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYW55RmlsdGVyaW5nc0VudGl0eVNlY29uZGFyeVZpZXcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgTWFueUZpbHRlcmluZ3NPbkNsYXNzRW50aXR5IGVudGl0eSA9IHRhcmdldCgiTWFueUZpbHRlcmluZ3NFbnRpdHlTZWNvbmRhcnlWaWV3IikucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLmdldChNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkuY2xhc3MpOworCisgICAgICAgIC8vIE1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5maWVsZCwgaXMoNTApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuYWNjZXNzb3JUcmFuc2llbnQsIGlzKCJwcm9wZXJ0eXByb3BlcnR5IikpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXRQcm9wZXJ0eSgpLCBpcygicHJvcGVydHkiKSk7CisKKyAgICAgICAgLy8gRmlsdGVyZWRDbGFzc0VudGl0eQorICAgICAgICBmaW5hbCBGaWx0ZXJlZENsYXNzRW50aXR5IGZpbHRlcmVkID0gZW50aXR5LmZpbHRlcmVkOworICAgICAgICBhc3NlcnRUaGF0KGZpbHRlcmVkLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZmlsdGVyZWQuZmllbGQsIGlzKDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChmaWx0ZXJlZC5nZXRQcm9wZXJ0eSgpLCBudWxsVmFsdWUoKSk7CisKKyAgICAgICAgLy8gRGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5kZWZhdWx0RW50aXRpZXMsIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZGVmYXVsdEVudGl0aWVzLnNpemUoKSwgaXMoMSkpOworICAgICAgICBmaW5hbCBEZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5IGRlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkgPSBlbnRpdHkuZGVmYXVsdEVudGl0aWVzLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0VGhhdChkZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5LmZpZWxkLCBpcyh0cnVlKSk7CisgICAgICAgIGFzc2VydFRoYXQoZGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eS5nZXRQcm9wZXJ0eSgpLCBpcygyMEwpKTsKKworICAgICAgICAvLyBPbmVGaWx0ZXJpbmdTdWJFbnRpdHkKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkub25lRW50aXRpZXMsIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkub25lRW50aXRpZXMuc2l6ZSgpLCBpcygxKSk7CisgICAgICAgIGZpbmFsIE9uZUZpbHRlcmluZ1N1YkVudGl0eSBvbmVGaWx0ZXJpbmdTdWJFbnRpdHkgPSBlbnRpdHkub25lRW50aXRpZXMuZ2V0KDApOworICAgICAgICBhc3NlcnRUaGF0KG9uZUZpbHRlcmluZ1N1YkVudGl0eS5maWVsZDEsIGlzKDIwKSk7CisgICAgICAgIGFzc2VydFRoYXQob25lRmlsdGVyaW5nU3ViRW50aXR5LmZpZWxkMiwgaXMoMCkpOworICAgICAgICBhc3NlcnRUaGF0KG9uZUZpbHRlcmluZ1N1YkVudGl0eS5nZXRQcm9wZXJ0eTEoKSwgbnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KG9uZUZpbHRlcmluZ1N1YkVudGl0eS5nZXRQcm9wZXJ0eTIoKSwgaXMoInByb3BlcnR5MiIpKTsKKworICAgICAgICAvLyBNYW55RmlsdGVyaW5nc1N1YkVudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5tYW55RW50aXRpZXMsIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkubWFueUVudGl0aWVzLnNpemUoKSwgaXMoMSkpOworICAgICAgICBmaW5hbCBNYW55RmlsdGVyaW5nc1N1YkVudGl0eSBtYW55RmlsdGVyaW5nc1N1YkVudGl0eSA9IGVudGl0eS5tYW55RW50aXRpZXMuZ2V0KDApOworICAgICAgICBhc3NlcnRUaGF0KG1hbnlGaWx0ZXJpbmdzU3ViRW50aXR5LmZpZWxkMSwgaXMoNjApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtYW55RmlsdGVyaW5nc1N1YkVudGl0eS5maWVsZDIsIGlzKDcwKSk7CisgICAgICAgIGFzc2VydFRoYXQobWFueUZpbHRlcmluZ3NTdWJFbnRpdHkuZ2V0UHJvcGVydHkxKCksIG51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtYW55RmlsdGVyaW5nc1N1YkVudGl0eS5nZXRQcm9wZXJ0eTIoKSwgaXMoInByb3BlcnR5MiIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYW55RmlsdGVyaW5nc0VudGl0eURlZmF1bHRWaWV3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIE1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eSBlbnRpdHkgPSB0YXJnZXQoIk1hbnlGaWx0ZXJpbmdzRW50aXR5RGVmYXVsdFZpZXciKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAuZ2V0KE1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eS5jbGFzcyk7CisKKyAgICAgICAgLy8gTWFueUZpbHRlcmluZ3NPbkNsYXNzRW50aXR5CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmZpZWxkLCBpcygwKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmFjY2Vzc29yVHJhbnNpZW50LCBudWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmdldFByb3BlcnR5KCksIG51bGxWYWx1ZSgpKTsKKworICAgICAgICAvLyBGaWx0ZXJlZENsYXNzRW50aXR5CisgICAgICAgIGZpbmFsIEZpbHRlcmVkQ2xhc3NFbnRpdHkgZmlsdGVyZWQgPSBlbnRpdHkuZmlsdGVyZWQ7CisgICAgICAgIGFzc2VydFRoYXQoZmlsdGVyZWQsIG51bGxWYWx1ZSgpKTsKKworICAgICAgICAvLyBEZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmRlZmF1bHRFbnRpdGllcywgbnVsbFZhbHVlKCkpOworCisgICAgICAgIC8vIE9uZUZpbHRlcmluZ1N1YkVudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5vbmVFbnRpdGllcywgbnVsbFZhbHVlKCkpOworCisgICAgICAgIC8vIE1hbnlGaWx0ZXJpbmdzU3ViRW50aXR5CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5Lm1hbnlFbnRpdGllcywgbnVsbFZhbHVlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hbnlGaWx0ZXJpbmdzRW50aXR5TWFueVZpZXdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIE1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eSBlbnRpdHkgPSB0YXJnZXQoIk1hbnlGaWx0ZXJpbmdzRW50aXR5TWFueVZpZXdzIikucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLmdldChNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkuY2xhc3MpOworCisgICAgICAgIC8vIE1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5maWVsZCwgaXMoNTApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuYWNjZXNzb3JUcmFuc2llbnQsIGlzKCJwcm9wZXJ0eXByb3BlcnR5IikpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXRQcm9wZXJ0eSgpLCBpcygicHJvcGVydHkiKSk7CisKKyAgICAgICAgLy8gRmlsdGVyZWRDbGFzc0VudGl0eQorICAgICAgICBmaW5hbCBGaWx0ZXJlZENsYXNzRW50aXR5IGZpbHRlcmVkID0gZW50aXR5LmZpbHRlcmVkOworICAgICAgICBhc3NlcnRUaGF0KGZpbHRlcmVkLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZmlsdGVyZWQuZmllbGQsIGlzKDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChmaWx0ZXJlZC5nZXRQcm9wZXJ0eSgpLCBudWxsVmFsdWUoKSk7CisKKyAgICAgICAgLy8gRGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5kZWZhdWx0RW50aXRpZXMsIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZGVmYXVsdEVudGl0aWVzLnNpemUoKSwgaXMoMSkpOworICAgICAgICBmaW5hbCBEZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5IGRlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkgPSBlbnRpdHkuZGVmYXVsdEVudGl0aWVzLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0VGhhdChkZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5LmZpZWxkLCBpcyh0cnVlKSk7CisgICAgICAgIGFzc2VydFRoYXQoZGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eS5nZXRQcm9wZXJ0eSgpLCBpcygyMEwpKTsKKworICAgICAgICAvLyBPbmVGaWx0ZXJpbmdTdWJFbnRpdHkKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkub25lRW50aXRpZXMsIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkub25lRW50aXRpZXMuc2l6ZSgpLCBpcygxKSk7CisgICAgICAgIGZpbmFsIE9uZUZpbHRlcmluZ1N1YkVudGl0eSBvbmVGaWx0ZXJpbmdTdWJFbnRpdHkgPSBlbnRpdHkub25lRW50aXRpZXMuZ2V0KDApOworICAgICAgICBhc3NlcnRUaGF0KG9uZUZpbHRlcmluZ1N1YkVudGl0eS5maWVsZDEsIGlzKDIwKSk7CisgICAgICAgIGFzc2VydFRoYXQob25lRmlsdGVyaW5nU3ViRW50aXR5LmZpZWxkMiwgaXMoMzApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChvbmVGaWx0ZXJpbmdTdWJFbnRpdHkuZ2V0UHJvcGVydHkxKCksIGlzKCJwcm9wZXJ0eTEiKSk7CisgICAgICAgIGFzc2VydFRoYXQob25lRmlsdGVyaW5nU3ViRW50aXR5LmdldFByb3BlcnR5MigpLCBpcygicHJvcGVydHkyIikpOworCisgICAgICAgIC8vIE1hbnlGaWx0ZXJpbmdzU3ViRW50aXR5CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5Lm1hbnlFbnRpdGllcywgbm90TnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5tYW55RW50aXRpZXMuc2l6ZSgpLCBpcygxKSk7CisgICAgICAgIGZpbmFsIE1hbnlGaWx0ZXJpbmdzU3ViRW50aXR5IG1hbnlGaWx0ZXJpbmdzU3ViRW50aXR5ID0gZW50aXR5Lm1hbnlFbnRpdGllcy5nZXQoMCk7CisgICAgICAgIGFzc2VydFRoYXQobWFueUZpbHRlcmluZ3NTdWJFbnRpdHkuZmllbGQxLCBpcyg2MCkpOworICAgICAgICBhc3NlcnRUaGF0KG1hbnlGaWx0ZXJpbmdzU3ViRW50aXR5LmZpZWxkMiwgaXMoNzApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtYW55RmlsdGVyaW5nc1N1YkVudGl0eS5nZXRQcm9wZXJ0eTEoKSwgaXMoInByb3BlcnR5MSIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtYW55RmlsdGVyaW5nc1N1YkVudGl0eS5nZXRQcm9wZXJ0eTIoKSwgaXMoInByb3BlcnR5MiIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvanNvbi9Kc29uRW50aXR5RmlsdGVyaW5nT25Qcm9wZXJ0aWVzVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL2pzb24vSnNvbkVudGl0eUZpbHRlcmluZ09uUHJvcGVydGllc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDEwN2IzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL2pzb24vSnNvbkVudGl0eUZpbHRlcmluZ09uUHJvcGVydGllc1Rlc3QuamF2YQpAQCAtMCwwICsxLDM1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5qc29uOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uSmFja3NvbkZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuRW50aXR5RmlsdGVyaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb3h5Lmpzb24uTW94eUpzb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5EZWZhdWx0RmlsdGVyaW5nU2NvcGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuUHJpbWFyeURldGFpbGVkVmlldzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5TZWNvbmRhcnlEZXRhaWxlZFZpZXc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuZG9tYWluLkRlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuZG9tYWluLkZpbHRlcmVkQ2xhc3NFbnRpdHk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuZG9tYWluLk1hbnlGaWx0ZXJpbmdzT25Qcm9wZXJ0aWVzRW50aXR5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLmRvbWFpbi5NYW55RmlsdGVyaW5nc1N1YkVudGl0eTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5kb21haW4uT25lRmlsdGVyaW5nT25Qcm9wZXJ0aWVzRW50aXR5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLmRvbWFpbi5PbmVGaWx0ZXJpbmdTdWJFbnRpdHk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5ub3ROdWxsVmFsdWU7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMubnVsbFZhbHVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogVXNlLWNhc2VzIHdpdGggZW50aXR5LWZpbHRlcmluZyBhbm5vdGF0aW9ucyBvbiBwcm9wZXJ0aWVzLCBKU09OIG91dHB1dC4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBKc29uRW50aXR5RmlsdGVyaW5nT25Qcm9wZXJ0aWVzVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gIlByb3ZpZGVyOiB7MH0iKQorICAgIHB1YmxpYyBzdGF0aWMgSXRlcmFibGU8Q2xhc3NbXT4gcHJvdmlkZXJzKCkgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgQ2xhc3NbXVtdIHt7TW94eUpzb25GZWF0dXJlLmNsYXNzfSwge0phY2tzb25GZWF0dXJlLmNsYXNzfX0pOworICAgIH0KKworICAgIHB1YmxpYyBKc29uRW50aXR5RmlsdGVyaW5nT25Qcm9wZXJ0aWVzVGVzdChmaW5hbCBDbGFzczxGZWF0dXJlPiBmaWx0ZXJpbmdQcm92aWRlcikgeworICAgICAgICBzdXBlcihuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MsIEVudGl0eUZpbHRlcmluZ0ZlYXR1cmUuY2xhc3MpLnJlZ2lzdGVyKGZpbHRlcmluZ1Byb3ZpZGVyKSk7CisKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKTsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9qc29uIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIk9uZUZpbHRlcmluZ0VudGl0eSIpCisgICAgICAgIEBQcmltYXJ5RGV0YWlsZWRWaWV3CisgICAgICAgIHB1YmxpYyBPbmVGaWx0ZXJpbmdPblByb3BlcnRpZXNFbnRpdHkgZ2V0T25lRmlsdGVyaW5nRW50aXR5KCkgeworICAgICAgICAgICAgcmV0dXJuIE9uZUZpbHRlcmluZ09uUHJvcGVydGllc0VudGl0eS5JTlNUQU5DRTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIk9uZUZpbHRlcmluZ0VudGl0eURlZmF1bHRWaWV3IikKKyAgICAgICAgcHVibGljIE9uZUZpbHRlcmluZ09uUHJvcGVydGllc0VudGl0eSBnZXRPbmVGaWx0ZXJpbmdFbnRpdHlEZWZhdWx0VmlldygpIHsKKyAgICAgICAgICAgIHJldHVybiBPbmVGaWx0ZXJpbmdPblByb3BlcnRpZXNFbnRpdHkuSU5TVEFOQ0U7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgiT25lRmlsdGVyaW5nRW50aXR5IikKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0T25lRmlsdGVyaW5nRW50aXR5KGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiT25lRmlsdGVyaW5nRW50aXR5RGVmYXVsdFZpZXdSZXNwb25zZSIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXRPbmVGaWx0ZXJpbmdFbnRpdHlEZWZhdWx0Vmlld1Jlc3BvbnNlKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCkuZW50aXR5KE9uZUZpbHRlcmluZ09uUHJvcGVydGllc0VudGl0eS5JTlNUQU5DRSwgbmV3IEFubm90YXRpb25bXSB7bmV3IERlZmF1bHRGaWx0ZXJpbmdTY29wZSgpfSkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJNYW55RmlsdGVyaW5nc0VudGl0eVByaW1hcnlWaWV3IikKKyAgICAgICAgQFByaW1hcnlEZXRhaWxlZFZpZXcKKyAgICAgICAgcHVibGljIE1hbnlGaWx0ZXJpbmdzT25Qcm9wZXJ0aWVzRW50aXR5IGdldE1hbnlGaWx0ZXJpbmdzRW50aXR5UHJpbWFyeVZpZXcoKSB7CisgICAgICAgICAgICByZXR1cm4gTWFueUZpbHRlcmluZ3NPblByb3BlcnRpZXNFbnRpdHkuSU5TVEFOQ0U7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJNYW55RmlsdGVyaW5nc0VudGl0eVNlY29uZGFyeVZpZXciKQorICAgICAgICBAU2Vjb25kYXJ5RGV0YWlsZWRWaWV3CisgICAgICAgIHB1YmxpYyBNYW55RmlsdGVyaW5nc09uUHJvcGVydGllc0VudGl0eSBnZXRNYW55RmlsdGVyaW5nc0VudGl0eVNlY29uZGFyeVZpZXcoKSB7CisgICAgICAgICAgICByZXR1cm4gTWFueUZpbHRlcmluZ3NPblByb3BlcnRpZXNFbnRpdHkuSU5TVEFOQ0U7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJNYW55RmlsdGVyaW5nc0VudGl0eURlZmF1bHRWaWV3IikKKyAgICAgICAgcHVibGljIE1hbnlGaWx0ZXJpbmdzT25Qcm9wZXJ0aWVzRW50aXR5IGdldE1hbnlGaWx0ZXJpbmdzRW50aXR5RGVmYXVsdFZpZXcoKSB7CisgICAgICAgICAgICByZXR1cm4gTWFueUZpbHRlcmluZ3NPblByb3BlcnRpZXNFbnRpdHkuSU5TVEFOQ0U7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJNYW55RmlsdGVyaW5nc0VudGl0eU1hbnlWaWV3cyIpCisgICAgICAgIEBQcmltYXJ5RGV0YWlsZWRWaWV3CisgICAgICAgIEBTZWNvbmRhcnlEZXRhaWxlZFZpZXcKKyAgICAgICAgcHVibGljIE1hbnlGaWx0ZXJpbmdzT25Qcm9wZXJ0aWVzRW50aXR5IGdldE1hbnlGaWx0ZXJpbmdzRW50aXR5TWFueVZpZXdzKCkgeworICAgICAgICAgICAgcmV0dXJuIE1hbnlGaWx0ZXJpbmdzT25Qcm9wZXJ0aWVzRW50aXR5LklOU1RBTkNFOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25lRW50aXR5RmlsdGVyaW5nT25Qcm9wZXJ0aWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIE9uZUZpbHRlcmluZ09uUHJvcGVydGllc0VudGl0eSBlbnRpdHkgPSB0YXJnZXQoIk9uZUZpbHRlcmluZ0VudGl0eSIpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5nZXQoT25lRmlsdGVyaW5nT25Qcm9wZXJ0aWVzRW50aXR5LmNsYXNzKTsKKworICAgICAgICAvLyBPbmVGaWx0ZXJpbmdPblByb3BlcnRpZXNFbnRpdHkKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZmllbGQsIGlzKDgwKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmFjY2Vzc29yVHJhbnNpZW50LCBpcygicHJvcGVydHlwcm9wZXJ0eSIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0UHJvcGVydHkoKSwgaXMoInByb3BlcnR5IikpOworCisgICAgICAgIC8vIEZpbHRlcmVkQ2xhc3NFbnRpdHkKKyAgICAgICAgZmluYWwgRmlsdGVyZWRDbGFzc0VudGl0eSBmaWx0ZXJlZCA9IGVudGl0eS5nZXRGaWx0ZXJlZCgpOworICAgICAgICBhc3NlcnRUaGF0KGZpbHRlcmVkLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZmlsdGVyZWQuZmllbGQsIGlzKDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChmaWx0ZXJlZC5nZXRQcm9wZXJ0eSgpLCBudWxsVmFsdWUoKSk7CisKKyAgICAgICAgLy8gRGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXREZWZhdWx0RW50aXRpZXMoKSwgbm90TnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXREZWZhdWx0RW50aXRpZXMoKS5zaXplKCksIGlzKDEpKTsKKyAgICAgICAgZmluYWwgRGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eSBkZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5ID0gZW50aXR5LmdldERlZmF1bHRFbnRpdGllcygpLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0VGhhdChkZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5LmZpZWxkLCBpcyh0cnVlKSk7CisgICAgICAgIGFzc2VydFRoYXQoZGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eS5nZXRQcm9wZXJ0eSgpLCBpcygyMEwpKTsKKworICAgICAgICAvLyBPbmVGaWx0ZXJpbmdTdWJFbnRpdHkKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0U3ViRW50aXRpZXMoKSwgbm90TnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXRTdWJFbnRpdGllcygpLnNpemUoKSwgaXMoMSkpOworICAgICAgICBmaW5hbCBPbmVGaWx0ZXJpbmdTdWJFbnRpdHkgb25lRmlsdGVyaW5nU3ViRW50aXR5ID0gZW50aXR5LmdldFN1YkVudGl0aWVzKCkuZ2V0KDApOworICAgICAgICBhc3NlcnRUaGF0KG9uZUZpbHRlcmluZ1N1YkVudGl0eS5maWVsZDEsIGlzKDIwKSk7CisgICAgICAgIGFzc2VydFRoYXQob25lRmlsdGVyaW5nU3ViRW50aXR5LmZpZWxkMiwgaXMoMzApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChvbmVGaWx0ZXJpbmdTdWJFbnRpdHkuZ2V0UHJvcGVydHkxKCksIGlzKCJwcm9wZXJ0eTEiKSk7CisgICAgICAgIGFzc2VydFRoYXQob25lRmlsdGVyaW5nU3ViRW50aXR5LmdldFByb3BlcnR5MigpLCBpcygicHJvcGVydHkyIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uZUVudGl0eUZpbHRlcmluZ09uUHJvcGVydGllc0RlZmF1bHRWaWV3UmVzcG9uc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgT25lRmlsdGVyaW5nT25Qcm9wZXJ0aWVzRW50aXR5IGVudGl0eSA9IHRhcmdldCgiT25lRmlsdGVyaW5nRW50aXR5RGVmYXVsdFZpZXdSZXNwb25zZSIpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5nZXQoT25lRmlsdGVyaW5nT25Qcm9wZXJ0aWVzRW50aXR5LmNsYXNzKTsKKworICAgICAgICAvLyBPbmVGaWx0ZXJpbmdPblByb3BlcnRpZXNFbnRpdHkKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZmllbGQsIGlzKDgwKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmFjY2Vzc29yVHJhbnNpZW50LCBudWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmdldFByb3BlcnR5KCksIG51bGxWYWx1ZSgpKTsKKworICAgICAgICAvLyBGaWx0ZXJlZENsYXNzRW50aXR5CisgICAgICAgIGZpbmFsIEZpbHRlcmVkQ2xhc3NFbnRpdHkgZmlsdGVyZWQgPSBlbnRpdHkuZ2V0RmlsdGVyZWQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChmaWx0ZXJlZCwgbnVsbFZhbHVlKCkpOworCisgICAgICAgIC8vIERlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0RGVmYXVsdEVudGl0aWVzKCksIG51bGxWYWx1ZSgpKTsKKworICAgICAgICAvLyBPbmVGaWx0ZXJpbmdTdWJFbnRpdHkKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0U3ViRW50aXRpZXMoKSwgbnVsbFZhbHVlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uZUVudGl0eUZpbHRlcmluZ09uUHJvcGVydGllc0RlZmF1bHRWaWV3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIE9uZUZpbHRlcmluZ09uUHJvcGVydGllc0VudGl0eSBlbnRpdHkgPSB0YXJnZXQoIk9uZUZpbHRlcmluZ0VudGl0eURlZmF1bHRWaWV3IikucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLmdldChPbmVGaWx0ZXJpbmdPblByb3BlcnRpZXNFbnRpdHkuY2xhc3MpOworCisgICAgICAgIC8vIE9uZUZpbHRlcmluZ09uUHJvcGVydGllc0VudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5maWVsZCwgaXMoODApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuYWNjZXNzb3JUcmFuc2llbnQsIG51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0UHJvcGVydHkoKSwgbnVsbFZhbHVlKCkpOworCisgICAgICAgIC8vIEZpbHRlcmVkQ2xhc3NFbnRpdHkKKyAgICAgICAgZmluYWwgRmlsdGVyZWRDbGFzc0VudGl0eSBmaWx0ZXJlZCA9IGVudGl0eS5nZXRGaWx0ZXJlZCgpOworICAgICAgICBhc3NlcnRUaGF0KGZpbHRlcmVkLCBudWxsVmFsdWUoKSk7CisKKyAgICAgICAgLy8gRGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXREZWZhdWx0RW50aXRpZXMoKSwgbnVsbFZhbHVlKCkpOworCisgICAgICAgIC8vIE9uZUZpbHRlcmluZ1N1YkVudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXRTdWJFbnRpdGllcygpLCBudWxsVmFsdWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVWaWV3c09uUHJvcGVydGllcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0T25lRW50aXR5RmlsdGVyaW5nT25Qcm9wZXJ0aWVzKCk7CisgICAgICAgIHRlc3RPbmVFbnRpdHlGaWx0ZXJpbmdPblByb3BlcnRpZXNEZWZhdWx0VmlldygpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hbnlGaWx0ZXJpbmdzRW50aXR5UHJpbWFyeVZpZXcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgTWFueUZpbHRlcmluZ3NPblByb3BlcnRpZXNFbnRpdHkgZW50aXR5ID0gdGFyZ2V0KCJNYW55RmlsdGVyaW5nc0VudGl0eVByaW1hcnlWaWV3IikucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLmdldChNYW55RmlsdGVyaW5nc09uUHJvcGVydGllc0VudGl0eS5jbGFzcyk7CisKKyAgICAgICAgLy8gTWFueUZpbHRlcmluZ3NPblByb3BlcnRpZXNFbnRpdHkKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZmllbGQsIGlzKDkwKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmFjY2Vzc29yVHJhbnNpZW50LCBpcygicHJvcGVydHlwcm9wZXJ0eSIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0UHJvcGVydHkoKSwgaXMoInByb3BlcnR5IikpOworCisgICAgICAgIC8vIEZpbHRlcmVkQ2xhc3NFbnRpdHkKKyAgICAgICAgZmluYWwgRmlsdGVyZWRDbGFzc0VudGl0eSBmaWx0ZXJlZCA9IGVudGl0eS5maWx0ZXJlZDsKKyAgICAgICAgYXNzZXJ0VGhhdChmaWx0ZXJlZCwgbm90TnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KGZpbHRlcmVkLmZpZWxkLCBpcygwKSk7CisgICAgICAgIGFzc2VydFRoYXQoZmlsdGVyZWQuZ2V0UHJvcGVydHkoKSwgbnVsbFZhbHVlKCkpOworCisgICAgICAgIC8vIERlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZGVmYXVsdEVudGl0aWVzLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmRlZmF1bHRFbnRpdGllcy5zaXplKCksIGlzKDEpKTsKKyAgICAgICAgZmluYWwgRGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eSBkZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5ID0gZW50aXR5LmRlZmF1bHRFbnRpdGllcy5nZXQoMCk7CisgICAgICAgIGFzc2VydFRoYXQoZGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eS5maWVsZCwgaXModHJ1ZSkpOworICAgICAgICBhc3NlcnRUaGF0KGRlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkuZ2V0UHJvcGVydHkoKSwgaXMoMjBMKSk7CisKKyAgICAgICAgLy8gT25lRmlsdGVyaW5nU3ViRW50aXR5CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5Lm9uZUVudGl0aWVzLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5Lm9uZUVudGl0aWVzLnNpemUoKSwgaXMoMSkpOworICAgICAgICBmaW5hbCBPbmVGaWx0ZXJpbmdTdWJFbnRpdHkgb25lRmlsdGVyaW5nU3ViRW50aXR5ID0gZW50aXR5Lm9uZUVudGl0aWVzLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0VGhhdChvbmVGaWx0ZXJpbmdTdWJFbnRpdHkuZmllbGQxLCBpcygyMCkpOworICAgICAgICBhc3NlcnRUaGF0KG9uZUZpbHRlcmluZ1N1YkVudGl0eS5maWVsZDIsIGlzKDMwKSk7CisgICAgICAgIGFzc2VydFRoYXQob25lRmlsdGVyaW5nU3ViRW50aXR5LmdldFByb3BlcnR5MSgpLCBpcygicHJvcGVydHkxIikpOworICAgICAgICBhc3NlcnRUaGF0KG9uZUZpbHRlcmluZ1N1YkVudGl0eS5nZXRQcm9wZXJ0eTIoKSwgaXMoInByb3BlcnR5MiIpKTsKKworICAgICAgICAvLyBNYW55RmlsdGVyaW5nc1N1YkVudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5tYW55RW50aXRpZXMsIG51bGxWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYW55RmlsdGVyaW5nc0VudGl0eVNlY29uZGFyeVZpZXcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgTWFueUZpbHRlcmluZ3NPblByb3BlcnRpZXNFbnRpdHkgZW50aXR5ID0gdGFyZ2V0KCJNYW55RmlsdGVyaW5nc0VudGl0eVNlY29uZGFyeVZpZXciKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAuZ2V0KE1hbnlGaWx0ZXJpbmdzT25Qcm9wZXJ0aWVzRW50aXR5LmNsYXNzKTsKKworICAgICAgICAvLyBNYW55RmlsdGVyaW5nc09uUHJvcGVydGllc0VudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5maWVsZCwgaXMoOTApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuYWNjZXNzb3JUcmFuc2llbnQsIGlzKCJwcm9wZXJ0eXByb3BlcnR5IikpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXRQcm9wZXJ0eSgpLCBpcygicHJvcGVydHkiKSk7CisKKyAgICAgICAgLy8gRmlsdGVyZWRDbGFzc0VudGl0eQorICAgICAgICBmaW5hbCBGaWx0ZXJlZENsYXNzRW50aXR5IGZpbHRlcmVkID0gZW50aXR5LmZpbHRlcmVkOworICAgICAgICBhc3NlcnRUaGF0KGZpbHRlcmVkLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZmlsdGVyZWQuZmllbGQsIGlzKDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChmaWx0ZXJlZC5nZXRQcm9wZXJ0eSgpLCBudWxsVmFsdWUoKSk7CisKKyAgICAgICAgLy8gRGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5kZWZhdWx0RW50aXRpZXMsIG51bGxWYWx1ZSgpKTsKKworICAgICAgICAvLyBPbmVGaWx0ZXJpbmdTdWJFbnRpdHkKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkub25lRW50aXRpZXMsIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkub25lRW50aXRpZXMuc2l6ZSgpLCBpcygxKSk7CisgICAgICAgIGZpbmFsIE9uZUZpbHRlcmluZ1N1YkVudGl0eSBvbmVGaWx0ZXJpbmdTdWJFbnRpdHkgPSBlbnRpdHkub25lRW50aXRpZXMuZ2V0KDApOworICAgICAgICBhc3NlcnRUaGF0KG9uZUZpbHRlcmluZ1N1YkVudGl0eS5maWVsZDEsIGlzKDIwKSk7CisgICAgICAgIGFzc2VydFRoYXQob25lRmlsdGVyaW5nU3ViRW50aXR5LmZpZWxkMiwgaXMoMCkpOworICAgICAgICBhc3NlcnRUaGF0KG9uZUZpbHRlcmluZ1N1YkVudGl0eS5nZXRQcm9wZXJ0eTEoKSwgbnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KG9uZUZpbHRlcmluZ1N1YkVudGl0eS5nZXRQcm9wZXJ0eTIoKSwgaXMoInByb3BlcnR5MiIpKTsKKworICAgICAgICAvLyBNYW55RmlsdGVyaW5nc1N1YkVudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5tYW55RW50aXRpZXMsIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkubWFueUVudGl0aWVzLnNpemUoKSwgaXMoMSkpOworICAgICAgICBmaW5hbCBNYW55RmlsdGVyaW5nc1N1YkVudGl0eSBtYW55RmlsdGVyaW5nc1N1YkVudGl0eSA9IGVudGl0eS5tYW55RW50aXRpZXMuZ2V0KDApOworICAgICAgICBhc3NlcnRUaGF0KG1hbnlGaWx0ZXJpbmdzU3ViRW50aXR5LmZpZWxkMSwgaXMoNjApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtYW55RmlsdGVyaW5nc1N1YkVudGl0eS5maWVsZDIsIGlzKDcwKSk7CisgICAgICAgIGFzc2VydFRoYXQobWFueUZpbHRlcmluZ3NTdWJFbnRpdHkuZ2V0UHJvcGVydHkxKCksIG51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtYW55RmlsdGVyaW5nc1N1YkVudGl0eS5nZXRQcm9wZXJ0eTIoKSwgaXMoInByb3BlcnR5MiIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYW55RmlsdGVyaW5nc0VudGl0eURlZmF1bHRWaWV3KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIE1hbnlGaWx0ZXJpbmdzT25Qcm9wZXJ0aWVzRW50aXR5IGVudGl0eSA9IHRhcmdldCgiTWFueUZpbHRlcmluZ3NFbnRpdHlEZWZhdWx0VmlldyIpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5nZXQoTWFueUZpbHRlcmluZ3NPblByb3BlcnRpZXNFbnRpdHkuY2xhc3MpOworCisgICAgICAgIC8vIE1hbnlGaWx0ZXJpbmdzT25Qcm9wZXJ0aWVzRW50aXR5CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmZpZWxkLCBpcyg5MCkpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5hY2Nlc3NvclRyYW5zaWVudCwgaXMoInByb3BlcnR5cHJvcGVydHkiKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmdldFByb3BlcnR5KCksIG51bGxWYWx1ZSgpKTsKKworICAgICAgICAvLyBGaWx0ZXJlZENsYXNzRW50aXR5CisgICAgICAgIGZpbmFsIEZpbHRlcmVkQ2xhc3NFbnRpdHkgZmlsdGVyZWQgPSBlbnRpdHkuZmlsdGVyZWQ7CisgICAgICAgIGFzc2VydFRoYXQoZmlsdGVyZWQsIG51bGxWYWx1ZSgpKTsKKworICAgICAgICAvLyBEZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmRlZmF1bHRFbnRpdGllcywgbnVsbFZhbHVlKCkpOworCisgICAgICAgIC8vIE9uZUZpbHRlcmluZ1N1YkVudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5vbmVFbnRpdGllcywgbnVsbFZhbHVlKCkpOworCisgICAgICAgIC8vIE1hbnlGaWx0ZXJpbmdzU3ViRW50aXR5CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5Lm1hbnlFbnRpdGllcywgbnVsbFZhbHVlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hbnlGaWx0ZXJpbmdzRW50aXR5TWFueVZpZXdzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIE1hbnlGaWx0ZXJpbmdzT25Qcm9wZXJ0aWVzRW50aXR5IGVudGl0eSA9IHRhcmdldCgiTWFueUZpbHRlcmluZ3NFbnRpdHlNYW55Vmlld3MiKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAuZ2V0KE1hbnlGaWx0ZXJpbmdzT25Qcm9wZXJ0aWVzRW50aXR5LmNsYXNzKTsKKworICAgICAgICAvLyBNYW55RmlsdGVyaW5nc09uUHJvcGVydGllc0VudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5maWVsZCwgaXMoOTApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuYWNjZXNzb3JUcmFuc2llbnQsIGlzKCJwcm9wZXJ0eXByb3BlcnR5IikpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXRQcm9wZXJ0eSgpLCBpcygicHJvcGVydHkiKSk7CisKKyAgICAgICAgLy8gRmlsdGVyZWRDbGFzc0VudGl0eQorICAgICAgICBmaW5hbCBGaWx0ZXJlZENsYXNzRW50aXR5IGZpbHRlcmVkID0gZW50aXR5LmZpbHRlcmVkOworICAgICAgICBhc3NlcnRUaGF0KGZpbHRlcmVkLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZmlsdGVyZWQuZmllbGQsIGlzKDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChmaWx0ZXJlZC5nZXRQcm9wZXJ0eSgpLCBudWxsVmFsdWUoKSk7CisKKyAgICAgICAgLy8gRGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5kZWZhdWx0RW50aXRpZXMsIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZGVmYXVsdEVudGl0aWVzLnNpemUoKSwgaXMoMSkpOworICAgICAgICBmaW5hbCBEZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5IGRlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkgPSBlbnRpdHkuZGVmYXVsdEVudGl0aWVzLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0VGhhdChkZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5LmZpZWxkLCBpcyh0cnVlKSk7CisgICAgICAgIGFzc2VydFRoYXQoZGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eS5nZXRQcm9wZXJ0eSgpLCBpcygyMEwpKTsKKworICAgICAgICAvLyBPbmVGaWx0ZXJpbmdTdWJFbnRpdHkKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkub25lRW50aXRpZXMsIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkub25lRW50aXRpZXMuc2l6ZSgpLCBpcygxKSk7CisgICAgICAgIGZpbmFsIE9uZUZpbHRlcmluZ1N1YkVudGl0eSBvbmVGaWx0ZXJpbmdTdWJFbnRpdHkgPSBlbnRpdHkub25lRW50aXRpZXMuZ2V0KDApOworICAgICAgICBhc3NlcnRUaGF0KG9uZUZpbHRlcmluZ1N1YkVudGl0eS5maWVsZDEsIGlzKDIwKSk7CisgICAgICAgIGFzc2VydFRoYXQob25lRmlsdGVyaW5nU3ViRW50aXR5LmZpZWxkMiwgaXMoMzApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChvbmVGaWx0ZXJpbmdTdWJFbnRpdHkuZ2V0UHJvcGVydHkxKCksIGlzKCJwcm9wZXJ0eTEiKSk7CisgICAgICAgIGFzc2VydFRoYXQob25lRmlsdGVyaW5nU3ViRW50aXR5LmdldFByb3BlcnR5MigpLCBpcygicHJvcGVydHkyIikpOworCisgICAgICAgIC8vIE1hbnlGaWx0ZXJpbmdzU3ViRW50aXR5CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5Lm1hbnlFbnRpdGllcywgbm90TnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5tYW55RW50aXRpZXMuc2l6ZSgpLCBpcygxKSk7CisgICAgICAgIGZpbmFsIE1hbnlGaWx0ZXJpbmdzU3ViRW50aXR5IG1hbnlGaWx0ZXJpbmdzU3ViRW50aXR5ID0gZW50aXR5Lm1hbnlFbnRpdGllcy5nZXQoMCk7CisgICAgICAgIGFzc2VydFRoYXQobWFueUZpbHRlcmluZ3NTdWJFbnRpdHkuZmllbGQxLCBpcyg2MCkpOworICAgICAgICBhc3NlcnRUaGF0KG1hbnlGaWx0ZXJpbmdzU3ViRW50aXR5LmZpZWxkMiwgaXMoNzApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtYW55RmlsdGVyaW5nc1N1YkVudGl0eS5nZXRQcm9wZXJ0eTEoKSwgaXMoInByb3BlcnR5MSIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtYW55RmlsdGVyaW5nc1N1YkVudGl0eS5nZXRQcm9wZXJ0eTIoKSwgaXMoInByb3BlcnR5MiIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9maWx0ZXJpbmcvanNvbi9Kc29uRW50aXR5RmlsdGVyaW5nU2NvcGVzVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL2pzb24vSnNvbkVudGl0eUZpbHRlcmluZ1Njb3Blc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGJhNTE2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL2pzb24vSnNvbkVudGl0eUZpbHRlcmluZ1Njb3Blc1Rlc3QuamF2YQpAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLmpzb247CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamFja3Nvbi5KYWNrc29uRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5FbnRpdHlGaWx0ZXJpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1veHkuanNvbi5Nb3h5SnNvbkZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLlByaW1hcnlEZXRhaWxlZFZpZXc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuZG9tYWluLkNvbXBsZXhFbnRpdHk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuZG9tYWluLkNvbXBsZXhTdWJFbnRpdHk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuZG9tYWluLkNvbXBsZXhTdWJTdWJFbnRpdHk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5ub3ROdWxsVmFsdWU7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMubnVsbFZhbHVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgSnNvbkVudGl0eUZpbHRlcmluZ1Njb3Blc1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMobmFtZSA9ICJQcm92aWRlcjogezB9IikKKyAgICBwdWJsaWMgc3RhdGljIEl0ZXJhYmxlPENsYXNzW10+IHByb3ZpZGVycygpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IENsYXNzW11bXXt7TW94eUpzb25GZWF0dXJlLmNsYXNzfSwge0phY2tzb25GZWF0dXJlLmNsYXNzfX0pOworICAgIH0KKworICAgIHB1YmxpYyBKc29uRW50aXR5RmlsdGVyaW5nU2NvcGVzVGVzdChmaW5hbCBDbGFzczxGZWF0dXJlPiBmaWx0ZXJpbmdQcm92aWRlcikgeworICAgICAgICBzdXBlcihuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MsIEVudGl0eUZpbHRlcmluZ0ZlYXR1cmUuY2xhc3MpLnJlZ2lzdGVyKGZpbHRlcmluZ1Byb3ZpZGVyKSk7CisKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKTsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9qc29uIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByaW1hcnlEZXRhaWxlZFZpZXcKKyAgICAgICAgcHVibGljIENvbXBsZXhFbnRpdHkgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIENvbXBsZXhFbnRpdHkuSU5TVEFOQ0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQcmltYXJ5IC0+IERlZmF1bHQgLT4gUHJpbWFyeS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbnRpdHlGaWx0ZXJpbmdTY29wZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ29tcGxleEVudGl0eSBlbnRpdHkgPSB0YXJnZXQoKS5yZXF1ZXN0KCkuZ2V0KENvbXBsZXhFbnRpdHkuY2xhc3MpOworCisgICAgICAgIC8vIENvbXBsZXhFbnRpdHkKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuYWNjZXNzb3JUcmFuc2llbnQsIGlzKCJwcm9wZXJ0eXByb3BlcnR5IikpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXRQcm9wZXJ0eSgpLCBpcygicHJvcGVydHkiKSk7CisKKyAgICAgICAgLy8gQ29tcGxleFN1YkVudGl0eQorICAgICAgICBmaW5hbCBDb21wbGV4U3ViRW50aXR5IHN1YkVudGl0eSA9IGVudGl0eS5maWVsZDsKKyAgICAgICAgYXNzZXJ0VGhhdChzdWJFbnRpdHksIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzdWJFbnRpdHkuYWNjZXNzb3JUcmFuc2llbnQsIGlzKCJmaWVsZGZpZWxkIikpOworICAgICAgICBhc3NlcnRUaGF0KHN1YkVudGl0eS5maWVsZCwgaXMoImZpZWxkIikpOworCisgICAgICAgIC8vIENvbXBsZXhTdWJTdWJFbnRpdHkKKyAgICAgICAgZmluYWwgQ29tcGxleFN1YlN1YkVudGl0eSBzdWJTdWJFbnRpdHkgPSBlbnRpdHkuZmllbGQuZ2V0UHJvcGVydHkoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzdWJTdWJFbnRpdHkuYWNjZXNzb3JUcmFuc2llbnQsIGlzKCJmaWVsZGZpZWxkIikpOworICAgICAgICBhc3NlcnRUaGF0KHN1YlN1YkVudGl0eS5nZXRQcm9wZXJ0eSgpLCBpcygicHJvcGVydHkiKSk7CisgICAgICAgIGFzc2VydFRoYXQoc3ViU3ViRW50aXR5LmZpZWxkLCBudWxsVmFsdWUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL2pzb24vSnNvbkVudGl0eUZpbHRlcmluZ1NlcnZlclRlc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9qc29uL0pzb25FbnRpdHlGaWx0ZXJpbmdTZXJ2ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFlN2I3ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9qc29uL0pzb25FbnRpdHlGaWx0ZXJpbmdTZXJ2ZXJUZXN0LmphdmEKQEAgLTAsMCArMSwyNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuanNvbjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamFja3Nvbi5KYWNrc29uRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5FbnRpdHlGaWx0ZXJpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1veHkuanNvbi5Nb3h5SnNvbkZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLkRlZmF1bHRGaWx0ZXJpbmdTY29wZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5QcmltYXJ5RGV0YWlsZWRWaWV3OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLlNlY29uZGFyeURldGFpbGVkVmlldzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5kb21haW4uRGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5kb21haW4uRmlsdGVyZWRDbGFzc0VudGl0eTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5kb21haW4uTWFueUZpbHRlcmluZ3NPbkNsYXNzRW50aXR5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5lbnRpdHkuZmlsdGVyaW5nLmRvbWFpbi5NYW55RmlsdGVyaW5nc1N1YkVudGl0eTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuZW50aXR5LmZpbHRlcmluZy5kb21haW4uT25lRmlsdGVyaW5nU3ViRW50aXR5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuU3VpdGU7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMubm90TnVsbFZhbHVlOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLm51bGxWYWx1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUnVuV2l0aChTdWl0ZS5jbGFzcykKK0BTdWl0ZS5TdWl0ZUNsYXNzZXMoeworICAgICAgICBKc29uRW50aXR5RmlsdGVyaW5nU2VydmVyVGVzdC5Db25maWd1cmF0aW9uU2VydmVyVGVzdC5jbGFzcywKKyAgICAgICAgSnNvbkVudGl0eUZpbHRlcmluZ1NlcnZlclRlc3QuQ29uZmlndXJhdGlvbkRlZmF1bHRWaWV3U2VydmVyVGVzdC5jbGFzcywKKyAgICAgICAgSnNvbkVudGl0eUZpbHRlcmluZ1NlcnZlclRlc3QuQW5ub3RhdGlvbnNTZXJ2ZXJUZXN0LmNsYXNzLAorICAgICAgICBKc29uRW50aXR5RmlsdGVyaW5nU2VydmVyVGVzdC5Bbm5vdGF0aW9uc092ZXJDb25maWd1cmF0aW9uU2VydmVyVGVzdC5jbGFzcworfSkKK3B1YmxpYyBjbGFzcyBKc29uRW50aXR5RmlsdGVyaW5nU2VydmVyVGVzdCB7CisKKyAgICBAUGF0aCgiLyIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9qc29uIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJjb25maWd1cmF0aW9uIikKKyAgICAgICAgcHVibGljIE1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eSBnZXRDb25maWd1cmF0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIE1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eS5JTlNUQU5DRTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImNvbmZpZ3VyYXRpb25PdmVyUmVzb3VyY2UiKQorICAgICAgICBAU2Vjb25kYXJ5RGV0YWlsZWRWaWV3CisgICAgICAgIHB1YmxpYyBNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkgZ2V0Q29uZmlndXJhdGlvbk92ZXJSZXNvdXJjZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkuSU5TVEFOQ0U7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJhbm5vdGF0aW9ucyIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXRBbm5vdGF0aW9ucygpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZQorICAgICAgICAgICAgICAgICAgICAub2soKQorICAgICAgICAgICAgICAgICAgICAuZW50aXR5KE1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eS5JTlNUQU5DRSwgbmV3IEFubm90YXRpb25bXSB7UHJpbWFyeURldGFpbGVkVmlldy5GYWN0b3J5LmdldCgpfSkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJhbm5vdGF0aW9uc092ZXJDb25maWd1cmF0aW9uIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldEFubm90YXRpb25zT3ZlckNvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2UKKyAgICAgICAgICAgICAgICAgICAgLm9rKCkKKyAgICAgICAgICAgICAgICAgICAgLmVudGl0eShNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkuSU5TVEFOQ0UsIG5ldyBBbm5vdGF0aW9uW10ge1ByaW1hcnlEZXRhaWxlZFZpZXcuRmFjdG9yeS5nZXQoKX0pCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiYW5ub3RhdGlvbnNPdmVyUmVzb3VyY2UiKQorICAgICAgICBAU2Vjb25kYXJ5RGV0YWlsZWRWaWV3CisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXRBbm5vdGF0aW9uc092ZXJSZXNvdXJjZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZQorICAgICAgICAgICAgICAgICAgICAub2soKQorICAgICAgICAgICAgICAgICAgICAuZW50aXR5KE1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eS5JTlNUQU5DRSwgbmV3IEFubm90YXRpb25bXSB7UHJpbWFyeURldGFpbGVkVmlldy5GYWN0b3J5LmdldCgpfSkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJhbm5vdGF0aW9uc092ZXJDb25maWd1cmF0aW9uT3ZlclJlc291cmNlIikKKyAgICAgICAgQFNlY29uZGFyeURldGFpbGVkVmlldworICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0QW5ub3RhdGlvbnNPdmVyQ29uZmlndXJhdGlvbk92ZXJSZXNvdXJjZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZQorICAgICAgICAgICAgICAgICAgICAub2soKQorICAgICAgICAgICAgICAgICAgICAuZW50aXR5KE1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eS5JTlNUQU5DRSwgbmV3IEFubm90YXRpb25bXSB7UHJpbWFyeURldGFpbGVkVmlldy5GYWN0b3J5LmdldCgpfSkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29uZmlndXJhdGlvblNlcnZlclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgICAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKG5hbWUgPSAiUHJvdmlkZXI6IHswfSIpCisgICAgICAgIHB1YmxpYyBzdGF0aWMgSXRlcmFibGU8Q2xhc3NbXT4gcHJvdmlkZXJzKCkgeworICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IENsYXNzW11bXSB7e01veHlKc29uRmVhdHVyZS5jbGFzc30sIHtKYWNrc29uRmVhdHVyZS5jbGFzc319KTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDb25maWd1cmF0aW9uU2VydmVyVGVzdChmaW5hbCBDbGFzczxGZWF0dXJlPiBmaWx0ZXJpbmdQcm92aWRlcikgeworICAgICAgICAgICAgc3VwZXIobmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzLCBFbnRpdHlGaWx0ZXJpbmdGZWF0dXJlLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAucmVnaXN0ZXIoZmlsdGVyaW5nUHJvdmlkZXIpCisgICAgICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShFbnRpdHlGaWx0ZXJpbmdGZWF0dXJlLkVOVElUWV9GSUxURVJJTkdfU0NPUEUsIFByaW1hcnlEZXRhaWxlZFZpZXcuRmFjdG9yeS5nZXQoKSkpOworCisgICAgICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworICAgICAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RDb25maWd1cmF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBfdGVzdEVudGl0eSh0YXJnZXQoImNvbmZpZ3VyYXRpb24iKS5yZXF1ZXN0KCkuZ2V0KE1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eS5jbGFzcykpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdENvbmZpZ3VyYXRpb25PdmVyUmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIF90ZXN0RW50aXR5KHRhcmdldCgiY29uZmlndXJhdGlvbk92ZXJSZXNvdXJjZSIpLnJlcXVlc3QoKS5nZXQoTWFueUZpbHRlcmluZ3NPbkNsYXNzRW50aXR5LmNsYXNzKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29uZmlndXJhdGlvbkRlZmF1bHRWaWV3U2VydmVyVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMobmFtZSA9ICJQcm92aWRlcjogezB9IikKKyAgICAgICAgcHVibGljIHN0YXRpYyBJdGVyYWJsZTxDbGFzc1tdPiBwcm92aWRlcnMoKSB7CisgICAgICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgQ2xhc3NbXVtdIHt7TW94eUpzb25GZWF0dXJlLmNsYXNzfSwge0phY2tzb25GZWF0dXJlLmNsYXNzfX0pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIENvbmZpZ3VyYXRpb25EZWZhdWx0Vmlld1NlcnZlclRlc3QoZmluYWwgQ2xhc3M8RmVhdHVyZT4gZmlsdGVyaW5nUHJvdmlkZXIpIHsKKyAgICAgICAgICAgIHN1cGVyKG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcywgRW50aXR5RmlsdGVyaW5nRmVhdHVyZS5jbGFzcykucmVnaXN0ZXIoZmlsdGVyaW5nUHJvdmlkZXIpKTsKKworICAgICAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKTsKKyAgICAgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uZmlndXJhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgTWFueUZpbHRlcmluZ3NPbkNsYXNzRW50aXR5IGVudGl0eSA9IHRhcmdldCgiY29uZmlndXJhdGlvbiIpLnJlcXVlc3QoKS5nZXQoTWFueUZpbHRlcmluZ3NPbkNsYXNzRW50aXR5LmNsYXNzKTsKKworICAgICAgICAgICAgLy8gTWFueUZpbHRlcmluZ3NPbkNsYXNzRW50aXR5CisgICAgICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5maWVsZCwgaXMoMCkpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuYWNjZXNzb3JUcmFuc2llbnQsIG51bGxWYWx1ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmdldFByb3BlcnR5KCksIG51bGxWYWx1ZSgpKTsKKworICAgICAgICAgICAgLy8gRmlsdGVyZWRDbGFzc0VudGl0eQorICAgICAgICAgICAgZmluYWwgRmlsdGVyZWRDbGFzc0VudGl0eSBmaWx0ZXJlZCA9IGVudGl0eS5maWx0ZXJlZDsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoZmlsdGVyZWQsIG51bGxWYWx1ZSgpKTsKKworICAgICAgICAgICAgLy8gRGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eQorICAgICAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZGVmYXVsdEVudGl0aWVzLCBudWxsVmFsdWUoKSk7CisKKyAgICAgICAgICAgIC8vIE9uZUZpbHRlcmluZ1N1YkVudGl0eQorICAgICAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkub25lRW50aXRpZXMsIG51bGxWYWx1ZSgpKTsKKworICAgICAgICAgICAgLy8gTWFueUZpbHRlcmluZ3NTdWJFbnRpdHkKKyAgICAgICAgICAgIGFzc2VydFRoYXQoZW50aXR5Lm1hbnlFbnRpdGllcywgbnVsbFZhbHVlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFubm90YXRpb25zU2VydmVyVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMobmFtZSA9ICJQcm92aWRlcjogezB9IikKKyAgICAgICAgcHVibGljIHN0YXRpYyBJdGVyYWJsZTxDbGFzc1tdPiBwcm92aWRlcnMoKSB7CisgICAgICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgQ2xhc3NbXVtdIHt7TW94eUpzb25GZWF0dXJlLmNsYXNzfSwge0phY2tzb25GZWF0dXJlLmNsYXNzfX0pOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEFubm90YXRpb25zU2VydmVyVGVzdChmaW5hbCBDbGFzczxGZWF0dXJlPiBmaWx0ZXJpbmdQcm92aWRlcikgeworICAgICAgICAgICAgc3VwZXIobmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzLCBFbnRpdHlGaWx0ZXJpbmdGZWF0dXJlLmNsYXNzKS5yZWdpc3RlcihmaWx0ZXJpbmdQcm92aWRlcikpOworCisgICAgICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworICAgICAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9ucygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgX3Rlc3RFbnRpdHkodGFyZ2V0KCJhbm5vdGF0aW9ucyIpLnJlcXVlc3QoKS5nZXQoTWFueUZpbHRlcmluZ3NPbkNsYXNzRW50aXR5LmNsYXNzKSk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbnNPdmVyUmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIF90ZXN0RW50aXR5KHRhcmdldCgiYW5ub3RhdGlvbnNPdmVyUmVzb3VyY2UiKS5yZXF1ZXN0KCkuZ2V0KE1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eS5jbGFzcykpOworICAgICAgICB9CisgICAgfQorCisgICAgQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFubm90YXRpb25zT3ZlckNvbmZpZ3VyYXRpb25TZXJ2ZXJUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICAgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gIlByb3ZpZGVyOiB7MH0iKQorICAgICAgICBwdWJsaWMgc3RhdGljIEl0ZXJhYmxlPENsYXNzW10+IHByb3ZpZGVycygpIHsKKyAgICAgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBDbGFzc1tdW10ge3tNb3h5SnNvbkZlYXR1cmUuY2xhc3N9LCB7SmFja3NvbkZlYXR1cmUuY2xhc3N9fSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQW5ub3RhdGlvbnNPdmVyQ29uZmlndXJhdGlvblNlcnZlclRlc3QoZmluYWwgQ2xhc3M8RmVhdHVyZT4gZmlsdGVyaW5nUHJvdmlkZXIpIHsKKyAgICAgICAgICAgIHN1cGVyKG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcywgRW50aXR5RmlsdGVyaW5nRmVhdHVyZS5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKGZpbHRlcmluZ1Byb3ZpZGVyKQorICAgICAgICAgICAgICAgICAgICAucHJvcGVydHkoRW50aXR5RmlsdGVyaW5nRmVhdHVyZS5FTlRJVFlfRklMVEVSSU5HX1NDT1BFLCBuZXcgRGVmYXVsdEZpbHRlcmluZ1Njb3BlKCkpKTsKKworICAgICAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKTsKKyAgICAgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbnNPdmVyQ29uZmlndXJhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgX3Rlc3RFbnRpdHkodGFyZ2V0KCJhbm5vdGF0aW9uc092ZXJDb25maWd1cmF0aW9uIikucmVxdWVzdCgpLmdldChNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkuY2xhc3MpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RBbm5vdGF0aW9uc092ZXJDb25maWd1cmF0aW9uT3ZlclJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBfdGVzdEVudGl0eSh0YXJnZXQoImFubm90YXRpb25zT3ZlckNvbmZpZ3VyYXRpb25PdmVyUmVzb3VyY2UiKS5yZXF1ZXN0KCkuZ2V0KE1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eS5jbGFzcykpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBfdGVzdEVudGl0eShmaW5hbCBNYW55RmlsdGVyaW5nc09uQ2xhc3NFbnRpdHkgZW50aXR5KSB7CisgICAgICAgIC8vIE1hbnlGaWx0ZXJpbmdzT25DbGFzc0VudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5maWVsZCwgaXMoNTApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuYWNjZXNzb3JUcmFuc2llbnQsIGlzKCJwcm9wZXJ0eXByb3BlcnR5IikpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXRQcm9wZXJ0eSgpLCBpcygicHJvcGVydHkiKSk7CisKKyAgICAgICAgLy8gRmlsdGVyZWRDbGFzc0VudGl0eQorICAgICAgICBmaW5hbCBGaWx0ZXJlZENsYXNzRW50aXR5IGZpbHRlcmVkID0gZW50aXR5LmZpbHRlcmVkOworICAgICAgICBhc3NlcnRUaGF0KGZpbHRlcmVkLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZmlsdGVyZWQuZmllbGQsIGlzKDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChmaWx0ZXJlZC5nZXRQcm9wZXJ0eSgpLCBudWxsVmFsdWUoKSk7CisKKyAgICAgICAgLy8gRGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eQorICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5kZWZhdWx0RW50aXRpZXMsIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZGVmYXVsdEVudGl0aWVzLnNpemUoKSwgaXMoMSkpOworICAgICAgICBmaW5hbCBEZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5IGRlZmF1bHRGaWx0ZXJpbmdTdWJFbnRpdHkgPSBlbnRpdHkuZGVmYXVsdEVudGl0aWVzLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0VGhhdChkZWZhdWx0RmlsdGVyaW5nU3ViRW50aXR5LmZpZWxkLCBpcyh0cnVlKSk7CisgICAgICAgIGFzc2VydFRoYXQoZGVmYXVsdEZpbHRlcmluZ1N1YkVudGl0eS5nZXRQcm9wZXJ0eSgpLCBpcygyMEwpKTsKKworICAgICAgICAvLyBPbmVGaWx0ZXJpbmdTdWJFbnRpdHkKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkub25lRW50aXRpZXMsIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkub25lRW50aXRpZXMuc2l6ZSgpLCBpcygxKSk7CisgICAgICAgIGZpbmFsIE9uZUZpbHRlcmluZ1N1YkVudGl0eSBvbmVGaWx0ZXJpbmdTdWJFbnRpdHkgPSBlbnRpdHkub25lRW50aXRpZXMuZ2V0KDApOworICAgICAgICBhc3NlcnRUaGF0KG9uZUZpbHRlcmluZ1N1YkVudGl0eS5maWVsZDEsIGlzKDIwKSk7CisgICAgICAgIGFzc2VydFRoYXQob25lRmlsdGVyaW5nU3ViRW50aXR5LmZpZWxkMiwgaXMoMzApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChvbmVGaWx0ZXJpbmdTdWJFbnRpdHkuZ2V0UHJvcGVydHkxKCksIGlzKCJwcm9wZXJ0eTEiKSk7CisgICAgICAgIGFzc2VydFRoYXQob25lRmlsdGVyaW5nU3ViRW50aXR5LmdldFByb3BlcnR5MigpLCBpcygicHJvcGVydHkyIikpOworCisgICAgICAgIC8vIE1hbnlGaWx0ZXJpbmdzU3ViRW50aXR5CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5Lm1hbnlFbnRpdGllcywgbm90TnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5tYW55RW50aXRpZXMuc2l6ZSgpLCBpcygxKSk7CisgICAgICAgIGZpbmFsIE1hbnlGaWx0ZXJpbmdzU3ViRW50aXR5IG1hbnlGaWx0ZXJpbmdzU3ViRW50aXR5ID0gZW50aXR5Lm1hbnlFbnRpdGllcy5nZXQoMCk7CisgICAgICAgIGFzc2VydFRoYXQobWFueUZpbHRlcmluZ3NTdWJFbnRpdHkuZmllbGQxLCBpcyg2MCkpOworICAgICAgICBhc3NlcnRUaGF0KG1hbnlGaWx0ZXJpbmdzU3ViRW50aXR5LmZpZWxkMiwgaXMoMCkpOworICAgICAgICBhc3NlcnRUaGF0KG1hbnlGaWx0ZXJpbmdzU3ViRW50aXR5LmdldFByb3BlcnR5MSgpLCBpcygicHJvcGVydHkxIikpOworICAgICAgICBhc3NlcnRUaGF0KG1hbnlGaWx0ZXJpbmdzU3ViRW50aXR5LmdldFByb3BlcnR5MigpLCBudWxsVmFsdWUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZmlsdGVyaW5nL2pzb24vTW94eUVudGl0eUZpbHRlcmluZ1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9qc29uL01veHlFbnRpdHlGaWx0ZXJpbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVmYWJmNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L2ZpbHRlcmluZy9qc29uL01veHlFbnRpdHlGaWx0ZXJpbmdUZXN0LmphdmEKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmVudGl0eS5maWx0ZXJpbmcuanNvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLkVudGl0eUZpbHRlcmluZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5ub3ROdWxsVmFsdWU7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBNb3h5RW50aXR5RmlsdGVyaW5nVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQFBhdGgoIi8iKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgWG1sRWxlbWVudEVudGl0eSBnZXRYbWxBdHRyaWJ1dGVFbnRpdHkoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFhtbEVsZW1lbnRFbnRpdHkobmV3IFhtbEF0dHJpYnV0ZUVudGl0eSgiZm9vIikpOworICAgICAgICB9CisgICAgfQorCisgICAgQFhtbFJvb3RFbGVtZW50CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBYbWxFbGVtZW50RW50aXR5IHsKKworICAgICAgICBAWG1sRWxlbWVudAorICAgICAgICBwcml2YXRlIFhtbEF0dHJpYnV0ZUVudGl0eSB2YWx1ZTsKKworICAgICAgICBwdWJsaWMgWG1sRWxlbWVudEVudGl0eSgpIHsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgWG1sRWxlbWVudEVudGl0eShmaW5hbCBYbWxBdHRyaWJ1dGVFbnRpdHkgdmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBYbWxBdHRyaWJ1dGVFbnRpdHkgZ2V0VmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShmaW5hbCBYbWxBdHRyaWJ1dGVFbnRpdHkgdmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBYbWxSb290RWxlbWVudAorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgWG1sQXR0cmlidXRlRW50aXR5IHsKKworICAgICAgICBAWG1sQXR0cmlidXRlCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGF0dHJpYnV0ZTsKKworICAgICAgICBwdWJsaWMgWG1sQXR0cmlidXRlRW50aXR5KCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFhtbEF0dHJpYnV0ZUVudGl0eShmaW5hbCBTdHJpbmcgYXR0cmlidXRlKSB7CisgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZSA9IGF0dHJpYnV0ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKCkgeworICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShmaW5hbCBTdHJpbmcgYXR0cmlidXRlKSB7CisgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZSA9IGF0dHJpYnV0ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5EVU1QX0VOVElUWSk7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcykKKyAgICAgICAgICAgICAgICAvLyBGZWF0dXJlcy4KKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoRW50aXR5RmlsdGVyaW5nRmVhdHVyZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0WG1sQXR0cmlidXRlRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFhtbEVsZW1lbnRFbnRpdHkgZW50aXR5ID0gdGFyZ2V0KCkucmVxdWVzdCgpLmdldChYbWxFbGVtZW50RW50aXR5LmNsYXNzKTsKKworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eSwgbm90TnVsbFZhbHVlKCkpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXRWYWx1ZSgpLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmdldFZhbHVlKCkuZ2V0QXR0cmlidXRlKCksIGVxdWFsVG8oImZvbyIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vQWJzdHJhY3RKc29uVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL0Fic3RyYWN0SnNvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGM1YWZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL0Fic3RyYWN0SnNvblRlc3QuamF2YQpAQCAtMCwwICsxLDMzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuQ29udGV4dFJlc29sdmVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlByb3BlcnRpZXNIZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dGlzb24uSmV0dGlzb25Db25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dGlzb24uSmV0dGlzb25KYXhiQ29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLkluZmxlY3RvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuamF4Yi5KQVhCQ29udGV4dEZhY3Rvcnk7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIENvbW1vbiBmdW5jdGlvbmFsaXR5IGZvciBKU09OIHRlc3RzIHRoYXQgYXJlIHVzaW5nIG11bHRpcGxlIEpTT04gcHJvdmlkZXJzIChlLmcuIE1PWHksIEphY2tzb24sIEpldHRpc29uKS4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SnNvblRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQS0dfTkFNRSA9ICJvcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihBYnN0cmFjdEpzb25UZXN0LmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgY2xhc3MgcmVwcmVzZW50aW5nIGNvbmZpZ3VyYXRpb24gZm9yIG9uZSB0ZXN0IGNhc2UuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjbGFzcyBKc29uVGVzdFNldHVwIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIEpzb25UZXN0UHJvdmlkZXIganNvblByb3ZpZGVyOworICAgICAgICBwcml2YXRlIGZpbmFsIENsYXNzPD8+W10gdGVzdENsYXNzZXM7CisKKyAgICAgICAgcHJvdGVjdGVkIEpzb25UZXN0U2V0dXAoZmluYWwgQ2xhc3M8Pz4gdGVzdENsYXNzLCBmaW5hbCBKc29uVGVzdFByb3ZpZGVyIGpzb25Qcm92aWRlcikgeworICAgICAgICAgICAgdGhpcyhuZXcgQ2xhc3M8Pz5bXSB7dGVzdENsYXNzfSwganNvblByb3ZpZGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHByb3RlY3RlZCBKc29uVGVzdFNldHVwKGZpbmFsIENsYXNzPD8+W10gdGVzdENsYXNzZXMsIGZpbmFsIEpzb25UZXN0UHJvdmlkZXIganNvblByb3ZpZGVyKSB7CisgICAgICAgICAgICB0aGlzLnRlc3RDbGFzc2VzID0gdGVzdENsYXNzZXM7CisgICAgICAgICAgICB0aGlzLmpzb25Qcm92aWRlciA9IGpzb25Qcm92aWRlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBKc29uVGVzdFByb3ZpZGVyIGdldEpzb25Qcm92aWRlcigpIHsKKyAgICAgICAgICAgIHJldHVybiBqc29uUHJvdmlkZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU2V0PE9iamVjdD4gZ2V0UHJvdmlkZXJzKCkgeworICAgICAgICAgICAgcmV0dXJuIGpzb25Qcm92aWRlci5nZXRQcm92aWRlcnMoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDbGFzczw/PiBnZXRFbnRpdHlDbGFzcygpIHsKKyAgICAgICAgICAgIHJldHVybiB0ZXN0Q2xhc3Nlc1swXTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBDbGFzczw/PltdIGdldFRlc3RDbGFzc2VzKCkgeworICAgICAgICAgICAgcmV0dXJuIHRlc3RDbGFzc2VzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRUZXN0RW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gZ2V0RW50aXR5Q2xhc3MoKS5nZXREZWNsYXJlZE1ldGhvZCgiY3JlYXRlVGVzdEluc3RhbmNlIikuaW52b2tlKG51bGwpOworICAgICAgICB9CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgSkFYQkNvbnRleHRSZXNvbHZlciBpbXBsZW1lbnRzIENvbnRleHRSZXNvbHZlcjxKQVhCQ29udGV4dD4geworCisgICAgICAgIHByaXZhdGUgZmluYWwgSkFYQkNvbnRleHQgY29udGV4dDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IHR5cGVzOworCisgICAgICAgIHB1YmxpYyBKQVhCQ29udGV4dFJlc29sdmVyKGZpbmFsIEpldHRpc29uQ29uZmlnIGpzb25Db25maWd1cmF0aW9uLCBmaW5hbCBDbGFzczw/PltdIGNsYXNzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gZm9yTW94eVByb3ZpZGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRoaXMudHlwZXMgPSBuZXcgSGFzaFNldDw+KEFycmF5cy5hc0xpc3QoY2xhc3NlcykpOworCisgICAgICAgICAgICBpZiAoanNvbkNvbmZpZ3VyYXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHRoaXMuY29udGV4dCA9IG5ldyBKZXR0aXNvbkpheGJDb250ZXh0KGpzb25Db25maWd1cmF0aW9uLCBjbGFzc2VzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0ID0gZm9yTW94eVByb3ZpZGVyCisgICAgICAgICAgICAgICAgICAgICAgICA/IEpBWEJDb250ZXh0RmFjdG9yeS5jcmVhdGVDb250ZXh0KGNsYXNzZXMsIG5ldyBIYXNoTWFwKCkpIDogSkFYQkNvbnRleHQubmV3SW5zdGFuY2UoY2xhc3Nlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEpBWEJDb250ZXh0IGdldENvbnRleHQoZmluYWwgQ2xhc3M8Pz4gb2JqZWN0VHlwZSkgeworICAgICAgICAgICAgcmV0dXJuICh0eXBlcy5jb250YWlucyhvYmplY3RUeXBlKSkgPyBjb250ZXh0IDogbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgSnNvblRlc3RTZXR1cCBqc29uVGVzdFNldHVwOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbmQgY29uZmlndXJlcyBhIEpBWC1SUyB7QGxpbmsgQXBwbGljYXRpb259IGZvciBnaXZlbiB7QGxpbmsgSnNvblRlc3RTZXR1cH0uIFRoZSB7QGxpbmsgQXBwbGljYXRpb259IHdpbGwKKyAgICAgKiBjb250YWluIG9uZSByZXNvdXJjZSB0aGF0IGNhbiBiZSBhY2Nlc3NlZCB2aWEge0Bjb2RlIFBPU1R9IG1ldGhvZCBhdCB7QGNvZGUgPGpzb25Qcm92aWRlck5hbWU+LzxlbnRpdHlDbGFzc05hbWU+fSBwYXRoLgorICAgICAqIFRoZSByZXNvdXJjZSBhbHNvIGNoZWNrcyB3aGV0aGVyIGlzIHRoZSBpbmNvbWluZyBKU09OIHNhbWUgYXMgdGhlIG9uZSBzdG9yZWQgaW4gYSBhcHByb3ByaWF0ZSBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtIGpzb25UZXN0U2V0dXAgY29uZmlndXJhdGlvbiB0byBjcmVhdGUgYSBKQVgtUlMge0BsaW5rIEFwcGxpY2F0aW9ufSBmb3IuCisgICAgICogQHJldHVybiBhbiB7QGxpbmsgQXBwbGljYXRpb259IGluc3RhbmNlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZUpheHJzQXBwbGljYXRpb24oZmluYWwgSnNvblRlc3RTZXR1cCBqc29uVGVzdFNldHVwKSB7CisgICAgICAgIGZpbmFsIFJlc291cmNlLkJ1aWxkZXIgcmVzb3VyY2VCdWlsZGVyID0gUmVzb3VyY2UuYnVpbGRlcigpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBwcm92aWRlck5hbWUgPSBnZXRQcm92aWRlclBhdGhQYXJ0KGpzb25UZXN0U2V0dXApOworICAgICAgICBmaW5hbCBTdHJpbmcgdGVzdE5hbWUgPSBnZXRFbnRpdHlQYXRoUGFydChqc29uVGVzdFNldHVwKTsKKworICAgICAgICByZXNvdXJjZUJ1aWxkZXIKKyAgICAgICAgICAgICAgICAucGF0aCgiLyIgKyBwcm92aWRlck5hbWUgKyAiLyIgKyB0ZXN0TmFtZSkKKyAgICAgICAgICAgICAgICAuYWRkTWV0aG9kKCJQT1NUIikKKyAgICAgICAgICAgICAgICAuY29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSkKKyAgICAgICAgICAgICAgICAucHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSkKKyAgICAgICAgICAgICAgICAuaGFuZGxlZEJ5KG5ldyBJbmZsZWN0b3I8Q29udGFpbmVyUmVxdWVzdENvbnRleHQsIFJlc3BvbnNlPigpIHsKKworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIFJlc3BvbnNlIGFwcGx5KGZpbmFsIENvbnRhaW5lclJlcXVlc3RDb250ZXh0IGNvbnRhaW5lclJlcXVlc3RDb250ZXh0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb250YWluZXJSZXF1ZXN0IGNvbnRhaW5lclJlcXVlc3QgPSAoQ29udGFpbmVyUmVxdWVzdCkgY29udGFpbmVyUmVxdWVzdENvbnRleHQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBKU09OIGlzIHRoZSBzYW1lIGFzIGluIHRoZSBwcmV2aW91cyB2ZXJzaW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyUmVxdWVzdC5idWZmZXJFbnRpdHkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGpzb24gPSBKc29uVGVzdEhlbHBlci5nZXRSZXNvdXJjZUFzU3RyaW5nKFBLR19OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJOYW1lICsgIl8iICsgdGVzdE5hbWUgKyAobW94eUpheGJQcm92aWRlcigpIHx8IHJ1bm5pbmdPbkpkazdBbmRMYXRlcigpID8gIl9NT1h5IiA6ICIiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIuanNvbiIpLnRyaW0oKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGVudGl0eVN0cmVhbSA9IGNvbnRhaW5lclJlcXVlc3QuZ2V0RW50aXR5U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJldHJpZXZlZEpzb24gPSBKc29uVGVzdEhlbHBlci5nZXRFbnRpdHlBc1N0cmluZyhlbnRpdHlTdHJlYW0pLnRyaW0oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRpdHlTdHJlYW0ucmVzZXQoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEpBWEItUkkgYW5kIE1PWHkgZ2VuZXJhdGUgbmFtZXNwYWNlIHByZWZpeGVzIGRpZmZlcmVudGx5IC0gdW5pZnkgdGhlbSAobnMxL25zMiBpbnRvIG5zMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoanNvblRlc3RTZXR1cC5nZXRKc29uUHJvdmlkZXIoKSBpbnN0YW5jZW9mIEpzb25UZXN0UHJvdmlkZXIuSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0cmlldmVkSnNvbi5jb250YWlucygiXCJuczFcIiIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc29uID0ganNvbi5yZXBsYWNlKCJuczEiLCAibnMwIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRyaWV2ZWRKc29uID0gcmV0cmlldmVkSnNvbi5yZXBsYWNlKCJuczEiLCAibnMwIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0cmlldmVkSnNvbi5jb250YWlucygiXCJuczJcIiIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc29uID0ganNvbi5yZXBsYWNlKCJuczIiLCAibnMwIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXRyaWV2ZWRKc29uID0gcmV0cmlldmVkSnNvbi5yZXBsYWNlKCJuczIiLCAibnMwIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWpzb24uZXF1YWxzKHJldHJpZXZlZEpzb24pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuU0VWRVJFLCAiRXhwZWN0ZWQ6ICIgKyBqc29uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5TRVZFUkUsICJBY3R1YWw6ICAgIiArIHJldHJpZXZlZEpzb24pOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygie1wiZXJyb3JcIjpcIkpTT04gdmFsdWVzIGRvZXNuJ3QgbWF0Y2guXCJ9IikuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCJ7XCJlcnJvclwiOlwiQ2Fubm90IGZpbmQgb3JpZ2luYWwgSlNPTiBmaWxlLlwifSIpLmJ1aWxkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCB0ZXN0QmVhbiA9IGNvbnRhaW5lclJlcXVlc3QucmVhZEVudGl0eShqc29uVGVzdFNldHVwLmdldEVudGl0eUNsYXNzKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKHRlc3RCZWFuKS5idWlsZCgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZygpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyUmVzb3VyY2VzKHJlc291cmNlQnVpbGRlci5idWlsZCgpKQorICAgICAgICAgICAgICAgIC5yZWdpc3Rlcihqc29uVGVzdFNldHVwLmdldEpzb25Qcm92aWRlcigpLmdldEZlYXR1cmUoKSk7CisKKyAgICAgICAgcmVzb3VyY2VDb25maWcucmVnaXN0ZXJJbnN0YW5jZXMoZ2V0SmF4YkNvbnRleHRSZXNvbHZlcihqc29uVGVzdFNldHVwKSk7CisKKyAgICAgICAgaWYgKGpzb25UZXN0U2V0dXAuZ2V0UHJvdmlkZXJzKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVzb3VyY2VDb25maWcucmVnaXN0ZXJJbnN0YW5jZXMoanNvblRlc3RTZXR1cC5nZXRQcm92aWRlcnMoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzb3VyY2VDb25maWc7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgSkFYQkNvbnRleHRSZXNvbHZlciBnZXRKYXhiQ29udGV4dFJlc29sdmVyKGZpbmFsIEpzb25UZXN0U2V0dXAganNvblRlc3RTZXR1cCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUpheGJDb250ZXh0UmVzb2x2ZXIoanNvblRlc3RTZXR1cC5nZXRKc29uUHJvdmlkZXIoKSwganNvblRlc3RTZXR1cC5nZXRUZXN0Q2xhc3NlcygpKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBydW5uaW5nT25KZGs3QW5kTGF0ZXIoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBqYXZhVmVyc2lvbiA9IEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKFByb3BlcnRpZXNIZWxwZXIuZ2V0U3lzdGVtUHJvcGVydHkoImphdmEudmVyc2lvbiIpKTsKKyAgICAgICAgZmluYWwgaW50IHZlcnNpb24gPSBJbnRlZ2VyLnZhbHVlT2YoamF2YVZlcnNpb24uc3BsaXQoIlxcLiIpWzFdKTsKKworICAgICAgICByZXR1cm4gdmVyc2lvbiA+PSA3OworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gbW94eUpheGJQcm92aWRlcigpIHsKKyAgICAgICAgcmV0dXJuICJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qYXhiLkpBWEJDb250ZXh0RmFjdG9yeSIuZXF1YWxzKAorICAgICAgICAgICAgICAgIEFjY2Vzc0NvbnRyb2xsZXIuZG9Qcml2aWxlZ2VkKFByb3BlcnRpZXNIZWxwZXIuZ2V0U3lzdGVtUHJvcGVydHkoImphdmF4LnhtbC5iaW5kLkpBWEJDb250ZXh0IikpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGVudGl0eSBwYXRoIHBhcnQgZm9yIGdpdmVuIHtAbGluayBKc29uVGVzdFNldHVwfSAoYmFzZWQgb24gdGhlIG5hbWUgb2YgdGhlIGVudGl0eSkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGVudGl0eSBwYXRoIHBhcnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0RW50aXR5UGF0aFBhcnQoZmluYWwgSnNvblRlc3RTZXR1cCBqc29uVGVzdFNldHVwKSB7CisgICAgICAgIHJldHVybiBqc29uVGVzdFNldHVwLmdldEVudGl0eUNsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgbmV3IHtAbGluayBDb250ZXh0UmVzb2x2ZXJ9IG9mIHtAbGluayBKQVhCQ29udGV4dH0gaW5zdGFuY2UgZm9yIGdpdmVuIHtAbGluayBKc29uVGVzdFByb3ZpZGVyfSBhbmQgYW4gZW50aXR5CisgICAgICogY2xhc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0ganNvblByb3ZpZGVyIHByb3ZpZGVyIHRvIGNyZWF0ZSBhIGNvbnRleHQgcmVzb2x2ZXIgZm9yLgorICAgICAqIEBwYXJhbSBjbGF6eiAgICAgICAgSkFYQiBlbGVtZW50IGNsYXNzIGZvciBKQVhCIGNvbnRleHQuCisgICAgICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiBKQVhCIGNvbnRleHQgcmVzb2x2ZXIuCisgICAgICogQHRocm93cyBFeGNlcHRpb24gaWYgdGhlIGNyZWF0aW9uIG9mIHtAY29kZSBKQVhCQ29udGV4dFJlc29sdmVyfSBmYWlscy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIEpBWEJDb250ZXh0UmVzb2x2ZXIgY3JlYXRlSmF4YkNvbnRleHRSZXNvbHZlcihmaW5hbCBKc29uVGVzdFByb3ZpZGVyIGpzb25Qcm92aWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiBjbGF6eikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjcmVhdGVKYXhiQ29udGV4dFJlc29sdmVyKGpzb25Qcm92aWRlciwgbmV3IENsYXNzPD8+W10ge2NsYXp6fSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBuZXcge0BsaW5rIENvbnRleHRSZXNvbHZlcn0gb2Yge0BsaW5rIEpBWEJDb250ZXh0fSBpbnN0YW5jZSBmb3IgZ2l2ZW4ge0BsaW5rIEpzb25UZXN0UHJvdmlkZXJ9IGFuZCBhbiBlbnRpdHkKKyAgICAgKiBjbGFzc2VzLgorICAgICAqCisgICAgICogQHBhcmFtIGpzb25Qcm92aWRlciBwcm92aWRlciB0byBjcmVhdGUgYSBjb250ZXh0IHJlc29sdmVyIGZvci4KKyAgICAgKiBAcGFyYW0gY2xhc3NlcyAgICAgIEpBWEIgZWxlbWVudCBjbGFzc2VzIGZvciBKQVhCIGNvbnRleHQuCisgICAgICogQHJldHVybiBhbiBpbnN0YW5jZSBvZiBKQVhCIGNvbnRleHQgcmVzb2x2ZXIuCisgICAgICogQHRocm93cyBFeGNlcHRpb24gaWYgdGhlIGNyZWF0aW9uIG9mIHtAY29kZSBKQVhCQ29udGV4dFJlc29sdmVyfSBmYWlscy4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgc3RhdGljIEpBWEJDb250ZXh0UmVzb2x2ZXIgY3JlYXRlSmF4YkNvbnRleHRSZXNvbHZlcihmaW5hbCBKc29uVGVzdFByb3ZpZGVyIGpzb25Qcm92aWRlciwgZmluYWwgQ2xhc3M8Pz5bXSBjbGFzc2VzKQorICAgICAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgSkFYQkNvbnRleHRSZXNvbHZlcihqc29uUHJvdmlkZXIuZ2V0Q29uZmlndXJhdGlvbigpLCBjbGFzc2VzLAorICAgICAgICAgICAgICAgIGpzb25Qcm92aWRlciBpbnN0YW5jZW9mIEpzb25UZXN0UHJvdmlkZXIuTW94eUpzb25UZXN0UHJvdmlkZXIpOworICAgIH0KKworICAgIHByb3RlY3RlZCBBYnN0cmFjdEpzb25UZXN0KGZpbmFsIEpzb25UZXN0U2V0dXAganNvblRlc3RTZXR1cCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyKGNvbmZpZ3VyZUpheHJzQXBwbGljYXRpb24oanNvblRlc3RTZXR1cCkpOworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworCisgICAgICAgIHRoaXMuanNvblRlc3RTZXR1cCA9IGpzb25UZXN0U2V0dXA7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBlbnRpdHkgcGF0aCBwYXJ0IGZvciBjdXJyZW50IHRlc3QgY2FzZSAoYmFzZWQgb24gdGhlIG5hbWUgb2YgdGhlIGVudGl0eSkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGVudGl0eSBwYXRoIHBhcnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRFbnRpdHlQYXRoUGFydCgpIHsKKyAgICAgICAgcmV0dXJuIGdldEVudGl0eVBhdGhQYXJ0KGpzb25UZXN0U2V0dXApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgcHJvdmlkZXIgcGF0aCBwYXJ0IGZvciBjdXJyZW50IHRlc3QgY2FzZSAoYmFzZWQgb24gdGhlIG5hbWUgb2YgdGhlIHtAbGluayBKc29uVGVzdFByb3ZpZGVyfSkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHByb3ZpZGVyIHBhdGggcGFydC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFByb3ZpZGVyUGF0aFBhcnQoKSB7CisgICAgICAgIHJldHVybiBnZXRQcm92aWRlclBhdGhQYXJ0KGpzb25UZXN0U2V0dXApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgcHJvdmlkZXIgcGF0aCBwYXJ0IGZvciBnaXZlbiB7QGxpbmsgSnNvblRlc3RTZXR1cH0gKGJhc2VkIG9uIHRoZSBuYW1lIG9mIHRoZSB7QGxpbmsgSnNvblRlc3RQcm92aWRlcn0pLgorICAgICAqCisgICAgICogQHJldHVybiBwcm92aWRlciBwYXRoIHBhcnQuCisgICAgICovCisgICAgcHJvdGVjdGVkIHN0YXRpYyBTdHJpbmcgZ2V0UHJvdmlkZXJQYXRoUGFydChmaW5hbCBKc29uVGVzdFNldHVwIGpzb25UZXN0U2V0dXApIHsKKyAgICAgICAgcmV0dXJuIGpzb25UZXN0U2V0dXAuanNvblByb3ZpZGVyLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpOworICAgIH0KKworICAgIHByb3RlY3RlZCBKc29uVGVzdFNldHVwIGdldEpzb25UZXN0U2V0dXAoKSB7CisgICAgICAgIHJldHVybiBqc29uVGVzdFNldHVwOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChmaW5hbCBDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihnZXRKc29uVGVzdFNldHVwKCkuZ2V0SnNvblByb3ZpZGVyKCkuZ2V0RmVhdHVyZSgpKTsKKworICAgICAgICBjb25maWcucmVnaXN0ZXIoZ2V0SmF4YkNvbnRleHRSZXNvbHZlcihqc29uVGVzdFNldHVwKSk7CisKKyAgICAgICAgLy8gUmVnaXN0ZXIgYWRkaXRpb25hbCBwcm92aWRlcnMuCisgICAgICAgIGlmIChnZXRKc29uVGVzdFNldHVwKCkuZ2V0UHJvdmlkZXJzKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgZm9yIChmaW5hbCBPYmplY3QgcHJvdmlkZXIgOiBnZXRKc29uVGVzdFNldHVwKCkuZ2V0UHJvdmlkZXJzKCkpIHsKKyAgICAgICAgICAgICAgICBjb25maWcucmVnaXN0ZXIocHJvdmlkZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIE9iamVjdCBlbnRpdHkgPSBnZXRKc29uVGVzdFNldHVwKCkuZ2V0VGVzdEVudGl0eSgpOworCisgICAgICAgIGZpbmFsIE9iamVjdCByZWNlaXZlZEVudGl0eSA9IHRhcmdldCgpCisgICAgICAgICAgICAgICAgLnBhdGgoZ2V0UHJvdmlkZXJQYXRoUGFydCgpKQorICAgICAgICAgICAgICAgIC5wYXRoKGdldEVudGl0eVBhdGhQYXJ0KCkpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoImFwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9VVRGLTgiKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkoZW50aXR5LCAiYXBwbGljYXRpb24vanNvbjsgY2hhcnNldD1VVEYtOCIpLCBnZXRKc29uVGVzdFNldHVwKCkuZ2V0RW50aXR5Q2xhc3MoKSk7CisKKyAgICAgICAgLy8gUHJpbnQgb3V0IGNvbmZpZ3VyYXRpb24gZm9yIHRoaXMgdGVzdCBjYXNlIGFzIHRoZXJlIGlzIG5vIHdheSB0byByZW5hbWUgZ2VuZXJhdGVkIEpVbml0IHRlc3RzIGF0IHRoZSBtb21lbnQuCisgICAgICAgIC8vIFRPRE8gcmVtb3ZlIG9uY2UgSlVuaXQgc3VwcG9ydHMgcGFyYW1ldGVyaXplZCB0ZXN0cyB3aXRoIGN1c3RvbSBuYW1lcworICAgICAgICAvLyBUT0RPIChzZWUgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy82NTA4OTQvY2hhbmdlLXRlc3QtbmFtZS1vZi1wYXJhbWV0ZXJpemVkLXRlc3RzCisgICAgICAgIC8vIFRPRE8gb3IgaHR0cHM6Ly9naXRodWIuY29tL0tlbnRCZWNrL2p1bml0L3B1bGwvMzkzKQorICAgICAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmZvcm1hdCgiJXMgLSAlczogUmVjZWl2ZWQgSlNPTiBlbnRpdHkgY29udGVudCBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCBKU09OIGVudGl0eSBjb250ZW50LiIsCisgICAgICAgICAgICAgICAgZ2V0SnNvblRlc3RTZXR1cCgpLmdldEpzb25Qcm92aWRlcigpLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpLAorICAgICAgICAgICAgICAgIGdldEpzb25UZXN0U2V0dXAoKS5nZXRFbnRpdHlDbGFzcygpLmdldFNpbXBsZU5hbWUoKSksIGVudGl0eSwgcmVjZWl2ZWRFbnRpdHkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9HZW5lcmljVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL0dlbmVyaWNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY3ZjViOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9HZW5lcmljVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb247CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eS5Db2xvckhvbGRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHkuSmVyc2V5MTE5OUxpc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworCisvKioKKyAqIFVuaWdub3JlIHdoZW4geW91IG5lZWQgdG8gcnVuIGEgc3BlY2lmaWMgdGVzdC4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQElnbm9yZSgiVW5pZ25vcmUgb25seSB3aGVuIHlvdSBuZWVkIHRvIHJ1biBhIHNwZWNpZmljIHRlc3QuIikKK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgR2VuZXJpY1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdEpzb25UZXN0IHsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMoKQorICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxKc29uVGVzdFNldHVwW10+IGdlbmVyYXRlVGVzdENhc2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIExpc3Q8SnNvblRlc3RTZXR1cFtdPiBqc29uVGVzdFNldHVwcyA9IG5ldyBMaW5rZWRMaXN0PEpzb25UZXN0U2V0dXBbXT4oKTsKKyAgICAgICAgZmluYWwgQ2xhc3M8Pz5bXSBjbGFzc2VzID0ge0plcnNleTExOTlMaXN0LmNsYXNzLCBDb2xvckhvbGRlci5jbGFzc307CisKKyAgICAgICAgZm9yIChKc29uVGVzdFByb3ZpZGVyIGpzb25Qcm92aWRlciA6IG5ldyBKc29uVGVzdFByb3ZpZGVyW117bmV3IEpzb25UZXN0UHJvdmlkZXIuTW94eUpzb25UZXN0UHJvdmlkZXIoKX0pIHsKKyAgICAgICAgICAgIGpzb25UZXN0U2V0dXBzLmFkZChuZXcgSnNvblRlc3RTZXR1cFtde25ldyBKc29uVGVzdFNldHVwKGNsYXNzZXMsIGpzb25Qcm92aWRlcil9KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBqc29uVGVzdFNldHVwczsKKyAgICB9CisKKyAgICBwdWJsaWMgR2VuZXJpY1Rlc3QoZmluYWwgSnNvblRlc3RTZXR1cCBqc29uVGVzdFNldHVwKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIoanNvblRlc3RTZXR1cCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vSW5oZXJpdGFuY2VUZXN0LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vSW5oZXJpdGFuY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgxZDE1ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9Jbmhlcml0YW5jZVRlc3QuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHkuQW5pbWFsOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eS5BbmltYWxMaXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eS5DYXQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5LkRvZzsKKworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGNsYXNzIEluaGVyaXRhbmNlVGVzdCBleHRlbmRzIEFic3RyYWN0SnNvblRlc3QgeworCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycygpCisgICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPEpzb25UZXN0U2V0dXBbXT4gZ2VuZXJhdGVUZXN0Q2FzZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgTGlzdDxKc29uVGVzdFNldHVwW10+IGpzb25UZXN0U2V0dXBzID0gbmV3IExpbmtlZExpc3Q8SnNvblRlc3RTZXR1cFtdPigpOworICAgICAgICBmaW5hbCBDbGFzczw/PltdIGNsYXNzZXMgPSB7QW5pbWFsTGlzdC5jbGFzcywgQW5pbWFsLmNsYXNzLCBEb2cuY2xhc3MsIENhdC5jbGFzc307CisKKyAgICAgICAgZm9yIChmaW5hbCBKc29uVGVzdFByb3ZpZGVyIGpzb25Qcm92aWRlciA6IEpzb25UZXN0UHJvdmlkZXIuSkFYQl9QUk9WSURFUlMpIHsKKyAgICAgICAgICAgIC8vIFRPRE8gLSByZW1vdmUgdGhlIGNvbmRpdGlvbiBhZnRlciBqc29uYiBwb2x5bW9ycGhpYyBhZGFwdGVyIGlzIGltcGxlbWVudGVkCisgICAgICAgICAgICBpZiAoIShqc29uUHJvdmlkZXIgaW5zdGFuY2VvZiBKc29uVGVzdFByb3ZpZGVyLkpzb25iVGVzdFByb3ZpZGVyKSkgeworICAgICAgICAgICAgICAgIGpzb25UZXN0U2V0dXBzLmFkZChuZXcgSnNvblRlc3RTZXR1cFtde25ldyBKc29uVGVzdFNldHVwKGNsYXNzZXMsIGpzb25Qcm92aWRlcil9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBqc29uVGVzdFNldHVwczsKKyAgICB9CisKKyAgICBwdWJsaWMgSW5oZXJpdGFuY2VUZXN0KGZpbmFsIEpzb25UZXN0U2V0dXAganNvblRlc3RTZXR1cCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyKGpzb25UZXN0U2V0dXApOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL0phY2tzb24xSnNvblZpZXdUZXN0LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vSmFja3NvbjFKc29uVmlld1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzFkZDU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL0phY2tzb24xSnNvblZpZXdUZXN0LmphdmEKQEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQXN5bmNSZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuU3VzcGVuZGVkOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24xLkphY2tzb24xRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmNvZGVoYXVzLmphY2tzb24ubWFwLmFubm90YXRlLkpzb25WaWV3OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIFJlcHJvZHVjZXIgZm9yIEpFUlNFWS0xODc4LgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgSmFja3NvbjFKc29uVmlld1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoTXlSZXNvdXJjZS5jbGFzcywgSmFja3NvbjFGZWF0dXJlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoZmluYWwgQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcucmVnaXN0ZXIoSmFja3NvbjFGZWF0dXJlLmNsYXNzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNpbXBsZVZpZXcge30KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERldGFpbGVkVmlldyB7fQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0RW50aXR5IHsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFRlc3RFbnRpdHkgRU5USVRZID0gbmV3IFRlc3RFbnRpdHkoInNpbXBsZSIsICJkZXRhaWxlZCIpOworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFRlc3RFbnRpdHkgREVUQUlMRUQgPSBuZXcgVGVzdEVudGl0eShudWxsLCAiZGV0YWlsZWQiKTsKKworICAgICAgICBwcml2YXRlIFN0cmluZyBzaW1wbGU7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIGRldGFpbGVkOworCisgICAgICAgIHB1YmxpYyBUZXN0RW50aXR5KCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRlc3RFbnRpdHkoZmluYWwgU3RyaW5nIHNpbXBsZSwgZmluYWwgU3RyaW5nIGRldGFpbGVkKSB7CisgICAgICAgICAgICB0aGlzLnNpbXBsZSA9IHNpbXBsZTsKKyAgICAgICAgICAgIHRoaXMuZGV0YWlsZWQgPSBkZXRhaWxlZDsKKyAgICAgICAgfQorCisgICAgICAgIEBKc29uVmlldyhTaW1wbGVWaWV3LmNsYXNzKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFNpbXBsZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBzaW1wbGU7CisgICAgICAgIH0KKworICAgICAgICBASnNvblZpZXcoRGV0YWlsZWRWaWV3LmNsYXNzKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERldGFpbGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIGRldGFpbGVkOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3QgbykgeworICAgICAgICAgICAgaWYgKHRoaXMgPT0gbykgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgVGVzdEVudGl0eSB0aGF0ID0gKFRlc3RFbnRpdHkpIG87CisKKyAgICAgICAgICAgIGlmIChkZXRhaWxlZCAhPSBudWxsID8gIWRldGFpbGVkLmVxdWFscyh0aGF0LmRldGFpbGVkKSA6IHRoYXQuZGV0YWlsZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzaW1wbGUgIT0gbnVsbCA/ICFzaW1wbGUuZXF1YWxzKHRoYXQuc2ltcGxlKSA6IHRoYXQuc2ltcGxlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICBpbnQgcmVzdWx0ID0gc2ltcGxlICE9IG51bGwgPyBzaW1wbGUuaGFzaENvZGUoKSA6IDA7CisgICAgICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIChkZXRhaWxlZCAhPSBudWxsID8gZGV0YWlsZWQuaGFzaENvZGUoKSA6IDApOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBAU2luZ2xldG9uCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKyAgICAgICAgQFBhdGgoImFzeW5jIikKKyAgICAgICAgQEpzb25WaWV3KERldGFpbGVkVmlldy5jbGFzcykKKyAgICAgICAgcHVibGljIHZvaWQgZ2V0QXN5bmMoQFN1c3BlbmRlZCBmaW5hbCBBc3luY1Jlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgICAgICAgICByZXNwb25zZS5yZXN1bWUoVGVzdEVudGl0eS5FTlRJVFkpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisgICAgICAgIEBQYXRoKCJzeW5jIikKKyAgICAgICAgQEpzb25WaWV3KERldGFpbGVkVmlldy5jbGFzcykKKyAgICAgICAgcHVibGljIFRlc3RFbnRpdHkgZ2V0U3luYygpIHsKKyAgICAgICAgICAgIHJldHVybiBUZXN0RW50aXR5LkVOVElUWTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN5bmMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJzeW5jIikucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoVGVzdEVudGl0eS5jbGFzcyksIGlzKFRlc3RFbnRpdHkuREVUQUlMRUQpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luYygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoImFzeW5jIikucmVxdWVzdCgpLmFzeW5jKCkuZ2V0KCkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShUZXN0RW50aXR5LmNsYXNzKSwgaXMoVGVzdEVudGl0eS5ERVRBSUxFRCkpOworCisgICAgICAgIHJlc3BvbnNlLmNsb3NlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL0phY2tzb25Kc29uVmlld1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9KYWNrc29uSnNvblZpZXdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRjOGRkOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9KYWNrc29uSnNvblZpZXdUZXN0LmphdmEKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQXN5bmNSZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuU3VzcGVuZGVkOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uSmFja3NvbkZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworCitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmFubm90YXRpb24uSnNvblZpZXc7CisKKy8qKgorICogUmVwcm9kdWNlciBmb3IgSkVSU0VZLTE4NzguCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBKYWNrc29uSnNvblZpZXdUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKE15UmVzb3VyY2UuY2xhc3MsIEphY2tzb25GZWF0dXJlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoZmluYWwgQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcucmVnaXN0ZXIoSmFja3NvbkZlYXR1cmUuY2xhc3MpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2ltcGxlVmlldyB7fQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGV0YWlsZWRWaWV3IHt9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RFbnRpdHkgeworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVGVzdEVudGl0eSBFTlRJVFkgPSBuZXcgVGVzdEVudGl0eSgic2ltcGxlIiwgImRldGFpbGVkIik7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgVGVzdEVudGl0eSBERVRBSUxFRCA9IG5ldyBUZXN0RW50aXR5KG51bGwsICJkZXRhaWxlZCIpOworCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHNpbXBsZTsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZGV0YWlsZWQ7CisKKyAgICAgICAgcHVibGljIFRlc3RFbnRpdHkoKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVGVzdEVudGl0eShmaW5hbCBTdHJpbmcgc2ltcGxlLCBmaW5hbCBTdHJpbmcgZGV0YWlsZWQpIHsKKyAgICAgICAgICAgIHRoaXMuc2ltcGxlID0gc2ltcGxlOworICAgICAgICAgICAgdGhpcy5kZXRhaWxlZCA9IGRldGFpbGVkOworICAgICAgICB9CisKKyAgICAgICAgQEpzb25WaWV3KFNpbXBsZVZpZXcuY2xhc3MpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U2ltcGxlKCkgeworICAgICAgICAgICAgcmV0dXJuIHNpbXBsZTsKKyAgICAgICAgfQorCisgICAgICAgIEBKc29uVmlldyhEZXRhaWxlZFZpZXcuY2xhc3MpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGV0YWlsZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gZGV0YWlsZWQ7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvKSB7CisgICAgICAgICAgICBpZiAodGhpcyA9PSBvKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5hbCBUZXN0RW50aXR5IHRoYXQgPSAoVGVzdEVudGl0eSkgbzsKKworICAgICAgICAgICAgaWYgKGRldGFpbGVkICE9IG51bGwgPyAhZGV0YWlsZWQuZXF1YWxzKHRoYXQuZGV0YWlsZWQpIDogdGhhdC5kZXRhaWxlZCAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNpbXBsZSAhPSBudWxsID8gIXNpbXBsZS5lcXVhbHModGhhdC5zaW1wbGUpIDogdGhhdC5zaW1wbGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIGludCByZXN1bHQgPSBzaW1wbGUgIT0gbnVsbCA/IHNpbXBsZS5oYXNoQ29kZSgpIDogMDsKKyAgICAgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgKGRldGFpbGVkICE9IG51bGwgPyBkZXRhaWxlZC5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIEBTaW5nbGV0b24KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15UmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorICAgICAgICBAUGF0aCgiYXN5bmMiKQorICAgICAgICBASnNvblZpZXcoRGV0YWlsZWRWaWV3LmNsYXNzKQorICAgICAgICBwdWJsaWMgdm9pZCBnZXRBc3luYyhAU3VzcGVuZGVkIGZpbmFsIEFzeW5jUmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlLnJlc3VtZShUZXN0RW50aXR5LkVOVElUWSk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKyAgICAgICAgQFBhdGgoInN5bmMiKQorICAgICAgICBASnNvblZpZXcoRGV0YWlsZWRWaWV3LmNsYXNzKQorICAgICAgICBwdWJsaWMgVGVzdEVudGl0eSBnZXRTeW5jKCkgeworICAgICAgICAgICAgcmV0dXJuIFRlc3RFbnRpdHkuRU5USVRZOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3luYygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInN5bmMiKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShUZXN0RW50aXR5LmNsYXNzKSwgaXMoVGVzdEVudGl0eS5ERVRBSUxFRCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFzeW5jKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiYXN5bmMiKS5yZXF1ZXN0KCkuYXN5bmMoKS5nZXQoKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFRlc3RFbnRpdHkuY2xhc3MpLCBpcyhUZXN0RW50aXR5LkRFVEFJTEVEKSk7CisKKyAgICAgICAgcmVzcG9uc2UuY2xvc2UoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vSmF4YlRlc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9KYXhiVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNTAwZDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vSmF4YlRlc3QuamF2YQpAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5LkFub3RoZXJBcnJheVRlc3RCZWFuOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eS5BdHRyQW5kQ2hhckRhdGFCZWFuOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eS5Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eS5Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHkuQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5LkNvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXM0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eS5FbXB0eUVsZW1lbnRCZWFuOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eS5FbXB0eUVsZW1lbnRDb250YWluaW5nQmVhbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHkuRW5jb2RlZENvbnRlbnRCZWFuOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eS5GYWtlQXJyYXlCZWFuOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eS5JbnRBcnJheTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHkuTGlzdEFuZE5vbkxpc3RCZWFuOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eS5MaXN0RW1wdHlCZWFuOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eS5MaXN0V3JhcHBlckJlYW47CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5Lk15UmVzcG9uc2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5Lk5hbWVzcGFjZUJlYW47CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5Lk5hbWVzcGFjZUJlYW5XaXRoQXR0cmlidXRlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eS5OdWxsU3RyaW5nQmVhbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHkuUGVyc29uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eS5QdXJlQ2hhckRhdGFCZWFuOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eS5SZWdpc3Rlck1lc3NhZ2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5LlNpbXBsZUJlYW47CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5LlNpbXBsZUJlYW5XaXRoQXR0cmlidXRlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHkuU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eS5TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVBbmRWYWx1ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHkuVHJlZU1vZGVsOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eS5Ud29MaXN0c1dyYXBwZXJCZWFuOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eS5Vc2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eS5Vc2VyVGFibGU7CisKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBKYXhiVGVzdCBleHRlbmRzIEFic3RyYWN0SnNvblRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8Pz5bXSBDTEFTU0VTID0geworICAgICAgICAgICAgQW5vdGhlckFycmF5VGVzdEJlYW4uY2xhc3MsCisgICAgICAgICAgICBBdHRyQW5kQ2hhckRhdGFCZWFuLmNsYXNzLAorICAgICAgICAgICAgQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlcy5jbGFzcywKKyAgICAgICAgICAgIENvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMyLmNsYXNzLAorICAgICAgICAgICAgQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczMuY2xhc3MsCisgICAgICAgICAgICBDb21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzNC5jbGFzcywKKyAgICAgICAgICAgIEVtcHR5RWxlbWVudEJlYW4uY2xhc3MsCisgICAgICAgICAgICBFbXB0eUVsZW1lbnRDb250YWluaW5nQmVhbi5jbGFzcywKKyAgICAgICAgICAgIEVuY29kZWRDb250ZW50QmVhbi5jbGFzcywKKyAgICAgICAgICAgIEZha2VBcnJheUJlYW4uY2xhc3MsCisgICAgICAgICAgICBJbnRBcnJheS5jbGFzcywKKyAgICAgICAgICAgIExpc3RBbmROb25MaXN0QmVhbi5jbGFzcywKKyAgICAgICAgICAgIExpc3RFbXB0eUJlYW4uY2xhc3MsCisgICAgICAgICAgICBMaXN0V3JhcHBlckJlYW4uY2xhc3MsCisgICAgICAgICAgICBNeVJlc3BvbnNlLmNsYXNzLAorICAgICAgICAgICAgTmFtZXNwYWNlQmVhbi5jbGFzcywKKyAgICAgICAgICAgIE5hbWVzcGFjZUJlYW5XaXRoQXR0cmlidXRlLmNsYXNzLAorICAgICAgICAgICAgTnVsbFN0cmluZ0JlYW4uY2xhc3MsCisgICAgICAgICAgICBQZXJzb24uY2xhc3MsCisgICAgICAgICAgICBQdXJlQ2hhckRhdGFCZWFuLmNsYXNzLAorICAgICAgICAgICAgUmVnaXN0ZXJNZXNzYWdlLmNsYXNzLAorICAgICAgICAgICAgU2ltcGxlQmVhbi5jbGFzcywKKyAgICAgICAgICAgIFNpbXBsZUJlYW5XaXRoQXR0cmlidXRlcy5jbGFzcywKKyAgICAgICAgICAgIFNpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZS5jbGFzcywKKyAgICAgICAgICAgIFNpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZUFuZFZhbHVlLmNsYXNzLAorICAgICAgICAgICAgVHJlZU1vZGVsLmNsYXNzLAorICAgICAgICAgICAgVHdvTGlzdHNXcmFwcGVyQmVhbi5jbGFzcywKKyAgICAgICAgICAgIFVzZXIuY2xhc3MsCisgICAgICAgICAgICBVc2VyVGFibGUuY2xhc3MKKyAgICB9OworCisgICAgcHVibGljIEpheGJUZXN0KGZpbmFsIEpzb25UZXN0U2V0dXAganNvblRlc3RTZXR1cCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyKGpzb25UZXN0U2V0dXApOworICAgIH0KKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMoKQorICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxKc29uVGVzdFNldHVwW10+IGdldEpzb25Qcm92aWRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgTGlzdDxKc29uVGVzdFNldHVwW10+IGpzb25UZXN0U2V0dXBzID0gbmV3IExpbmtlZExpc3Q8PigpOworCisgICAgICAgIGZvciAoZmluYWwgSnNvblRlc3RQcm92aWRlciBqc29uUHJvdmlkZXIgOiBKc29uVGVzdFByb3ZpZGVyLkpBWEJfUFJPVklERVJTKSB7CisgICAgICAgICAgICBmb3IgKGZpbmFsIENsYXNzPD8+IGVudGl0eUNsYXNzIDogQ0xBU1NFUykgeworICAgICAgICAgICAgICAgIC8vIFRPRE8gLSByZW1vdmUgdGhlIGNvbmRpdGlvbiBhZnRlciBqc29uYiBwb2x5bW9ycGhpYyBhZGFwdGVyIGlzIGltcGxlbWVudGVkCisgICAgICAgICAgICAgICAgaWYgKCEoanNvblByb3ZpZGVyIGluc3RhbmNlb2YgSnNvblRlc3RQcm92aWRlci5Kc29uYlRlc3RQcm92aWRlcikpIHsKKyAgICAgICAgICAgICAgICAgICAganNvblRlc3RTZXR1cHMuYWRkKG5ldyBKc29uVGVzdFNldHVwW117bmV3IEpzb25UZXN0U2V0dXAoZW50aXR5Q2xhc3MsIGpzb25Qcm92aWRlcil9KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4ganNvblRlc3RTZXR1cHM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL0plcnNleTExOTlUZXN0LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vSmVyc2V5MTE5OVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2RlYzhkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL0plcnNleTExOTlUZXN0LmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC5qc29uLmJpbmQuYWRhcHRlci5Kc29uYkFkYXB0ZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHkuQ29sb3JIb2xkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5LkplcnNleTExOTlMaXN0OworCitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgSmVyc2V5MTE5OVRlc3QgZXh0ZW5kcyBBYnN0cmFjdEpzb25UZXN0IHsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMoKQorICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxKc29uVGVzdFNldHVwW10+IGdlbmVyYXRlVGVzdENhc2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIExpc3Q8SnNvblRlc3RTZXR1cFtdPiBqc29uVGVzdFNldHVwcyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICAgICAgZmluYWwgQ2xhc3M8Pz5bXSBjbGFzc2VzID0ge0plcnNleTExOTlMaXN0LmNsYXNzLCBDb2xvckhvbGRlci5jbGFzc307CisKKyAgICAgICAgZm9yIChmaW5hbCBKc29uVGVzdFByb3ZpZGVyIGpzb25Qcm92aWRlciA6IEpzb25UZXN0UHJvdmlkZXIuSkFYQl9QUk9WSURFUlMpIHsKKyAgICAgICAgICAgIGpzb25UZXN0U2V0dXBzLmFkZChuZXcgSnNvblRlc3RTZXR1cFtde25ldyBKc29uVGVzdFNldHVwKGNsYXNzZXMsIGpzb25Qcm92aWRlcil9KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBqc29uVGVzdFNldHVwczsKKyAgICB9CisKKyAgICBwdWJsaWMgSmVyc2V5MTE5OVRlc3QoZmluYWwgSnNvblRlc3RTZXR1cCBqc29uVGVzdFNldHVwKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIoanNvblRlc3RTZXR1cCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3VzdG9tIHtAbGluayBKc29uYkFkYXB0ZXJ9IHRvIHByb3ZpZGUgSlNPTkIgd2l0aCB0aGUgdHlwZSBoaWRkZW4gYmVoaW5kIHRoZSBnZW5lcmljIE9iamVjdCBhcnJheSByZXR1cm5lZCBieQorICAgICAqIHtAbGluayBKZXJzZXkxMTk5TGlzdCNnZXRPYmplY3RzKCl9CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKc29uYk9iamVjdFRvQ29sb3JIb2xkZXJBZGFwdGVyIGltcGxlbWVudHMgSnNvbmJBZGFwdGVyPE9iamVjdFtdLCBDb2xvckhvbGRlcltdPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDb2xvckhvbGRlcltdIGFkYXB0VG9Kc29uKE9iamVjdFtdIG8pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5jb3B5T2Yobywgby5sZW5ndGgsIENvbG9ySG9sZGVyW10uY2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPYmplY3RbXSBhZGFwdEZyb21Kc29uKENvbG9ySG9sZGVyW10gY29sb3JIb2xkZXIpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIGNvbG9ySG9sZGVyOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vSmVyc2V5MTgzNVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9KZXJzZXkxODM1VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NzJhYTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vSmVyc2V5MTgzNVRlc3QuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHkuU2luZ2xlSXRlbUxpc3RXcmFwcGVyQmVhbjsKKworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworCisvKioKKyAqIFJlcHJvZHVjaWJsZSB0ZXN0IGNhc2UgZm9yIEpFUlNFWS0xODM1LgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgSmVyc2V5MTgzNVRlc3QgZXh0ZW5kcyBBYnN0cmFjdEpzb25UZXN0IHsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMoKQorICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxKc29uVGVzdFNldHVwW10+IGdlbmVyYXRlVGVzdENhc2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIExpc3Q8SnNvblRlc3RTZXR1cFtdPiByZXN1bHQgPSBuZXcgTGlua2VkTGlzdDxKc29uVGVzdFNldHVwW10+KCk7CisgICAgICAgIHJlc3VsdC5hZGQobmV3IEpzb25UZXN0U2V0dXBbXSB7bmV3IEpzb25UZXN0U2V0dXAobmV3IENsYXNzPD8+W10ge1NpbmdsZUl0ZW1MaXN0V3JhcHBlckJlYW4uY2xhc3N9LAorICAgICAgICAgICAgICAgIG5ldyBKc29uVGVzdFByb3ZpZGVyLkpldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcigpKX0pOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHB1YmxpYyBKZXJzZXkxODM1VGVzdChmaW5hbCBKc29uVGVzdFNldHVwIGpzb25UZXN0U2V0dXApIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlcihqc29uVGVzdFNldHVwKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vSnNvblByb2Nlc3NpbmdEaXNhYmxlZFRlc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9Kc29uUHJvY2Vzc2luZ0Rpc2FibGVkVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3YTRlNjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vSnNvblByb2Nlc3NpbmdEaXNhYmxlZFRlc3QuamF2YQpAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uOworCitpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC5qc29uLkpzb247CitpbXBvcnQgamF2YXguanNvbi5Kc29uT2JqZWN0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuSW50ZXJuYWxQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEpzb25Qcm9jZXNzaW5nRGlzYWJsZWRUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9PQkpFQ1RfU1RSID0gIntcImZvb1wiOlwiYmFyXCJ9IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBKc29uT2JqZWN0IEpTT05fT0JKRUNUID0gSnNvbi5jcmVhdGVSZWFkZXIobmV3IFN0cmluZ1JlYWRlcihKU09OX09CSkVDVF9TVFIpKS5yZWFkT2JqZWN0KCk7CisKKyAgICBAUGF0aCgiLyIpCisgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorICAgIEBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgianNvbk9iamVjdCIpCisgICAgICAgIHB1YmxpYyBKc29uT2JqZWN0IHBvc3RKc29uT2JqZWN0KGZpbmFsIEpzb25PYmplY3QganNvbk9iamVjdCkgeworICAgICAgICAgICAgcmV0dXJuIGpzb25PYmplY3Q7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworCisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MpCisgICAgICAgICAgICAgICAgLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuSlNPTl9QUk9DRVNTSU5HX0ZFQVRVUkVfRElTQUJMRSwgdHJ1ZSkKKyAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgb3RoZXIgSlNPTiBwcm92aWRlcnMgYXJlIGRpc2FibGVkIGFzIHdlbGwuCisgICAgICAgICAgICAgICAgLnByb3BlcnR5KEludGVybmFsUHJvcGVydGllcy5KU09OX0ZFQVRVUkVfU0VSVkVSLCAiSnNvblByb2Nlc3NpbmciKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKc29uT2JqZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJqc29uT2JqZWN0IikucmVxdWVzdChNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikucG9zdChFbnRpdHkuanNvbihKU09OX09CSkVDVCkpOworCisgICAgICAgIGFzc2VydEVxdWFscyg0MTUsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vSnNvblByb2Nlc3NpbmdUZXN0LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vSnNvblByb2Nlc3NpbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI5ZjUyMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9Kc29uUHJvY2Vzc2luZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDM1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbjsKKworaW1wb3J0IGphdmEuaW8uU3RyaW5nUmVhZGVyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IGphdmF4Lmpzb24uSnNvbjsKK2ltcG9ydCBqYXZheC5qc29uLkpzb25BcnJheTsKK2ltcG9ydCBqYXZheC5qc29uLkpzb25OdW1iZXI7CitpbXBvcnQgamF2YXguanNvbi5Kc29uT2JqZWN0OworaW1wb3J0IGphdmF4Lmpzb24uSnNvblN0cmluZzsKK2ltcG9ydCBqYXZheC5qc29uLkpzb25TdHJ1Y3R1cmU7CitpbXBvcnQgamF2YXguanNvbi5Kc29uVmFsdWU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qc29ucC5Kc29uUHJvY2Vzc2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkpTT05QOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCisvLyBAUnVuV2l0aChDb25jdXJyZW50UnVubmVyLmNsYXNzKQorcHVibGljIGNsYXNzIEpzb25Qcm9jZXNzaW5nVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fT0JKRUNUX1NUUjEgPSAie1wiZm9vXCI6XCJiYXJcIn0iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX09CSkVDVF9TVFIyID0gIntcImZvb1wiOiAxMjM0NX0iOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBKU09OX0FSUkFZX1NUUjEgPSAiWyIgKyBKU09OX09CSkVDVF9TVFIxICsgIiwiICsgSlNPTl9PQkpFQ1RfU1RSMSArICJdIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSlNPTl9BUlJBWV9TVFIyID0gIlsiICsgSlNPTl9PQkpFQ1RfU1RSMiArICIsIiArIEpTT05fT0JKRUNUX1NUUjIgKyAiXSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEpTT05fQVJSQVlfVkFMVUVfU1RSID0gIltudWxsXSI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBKc29uT2JqZWN0IEpTT05fT0JKRUNUID0gSnNvbi5jcmVhdGVSZWFkZXIobmV3IFN0cmluZ1JlYWRlcihKU09OX09CSkVDVF9TVFIxKSkucmVhZE9iamVjdCgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEpzb25BcnJheSBKU09OX0FSUkFZID0gSnNvbi5jcmVhdGVSZWFkZXIobmV3IFN0cmluZ1JlYWRlcihKU09OX0FSUkFZX1NUUjEpKS5yZWFkQXJyYXkoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBKc29uQXJyYXkgSlNPTl9BUlJBWV9WQUxVRSA9IEpzb24uY3JlYXRlUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoSlNPTl9BUlJBWV9WQUxVRV9TVFIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWFkQXJyYXkoKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEpzb25WYWx1ZSBKU09OX1ZBTFVFX0JPT0wgPSBKc29uVmFsdWUuVFJVRTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBKc29uU3RyaW5nIEpTT05fVkFMVUVfU1RSSU5HID0gSnNvbi5jcmVhdGVSZWFkZXIoCisgICAgICAgICAgICBuZXcgU3RyaW5nUmVhZGVyKEpTT05fQVJSQVlfU1RSMSkpLnJlYWRBcnJheSgpLmdldEpzb25PYmplY3QoMCkuZ2V0SnNvblN0cmluZygiZm9vIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSnNvbk51bWJlciBKU09OX1ZBTFVFX05VTUJFUiA9IEpzb24uY3JlYXRlUmVhZGVyKAorICAgICAgICAgICAgbmV3IFN0cmluZ1JlYWRlcihKU09OX0FSUkFZX1NUUjIpKS5yZWFkQXJyYXkoKS5nZXRKc29uT2JqZWN0KDApLmdldEpzb25OdW1iZXIoImZvbyIpOworCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJqc29uT2JqZWN0IikKKyAgICAgICAgcHVibGljIEpzb25PYmplY3QgcG9zdEpzb25PYmplY3QoZmluYWwgSnNvbk9iamVjdCBqc29uT2JqZWN0KSB7CisgICAgICAgICAgICByZXR1cm4ganNvbk9iamVjdDsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJqc29uU3RydWN0dXJlIikKKyAgICAgICAgcHVibGljIEpzb25TdHJ1Y3R1cmUgcG9zdEpzb25TdHJ1Y3R1cmUoZmluYWwgSnNvblN0cnVjdHVyZSBqc29uU3RydWN0dXJlKSB7CisgICAgICAgICAgICByZXR1cm4ganNvblN0cnVjdHVyZTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJqc29uQXJyYXkiKQorICAgICAgICBwdWJsaWMgSnNvbkFycmF5IHBvc3RKc29uQXJyYXkoZmluYWwgSnNvbkFycmF5IGpzb25BcnJheSkgeworICAgICAgICAgICAgcmV0dXJuIGpzb25BcnJheTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJqc29uVmFsdWUiKQorICAgICAgICBwdWJsaWMgSnNvblZhbHVlIHBvc3RKc29uVmFsdWUoZmluYWwgSnNvblZhbHVlIGpzb25WYWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIGpzb25WYWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJqc29uU3RyaW5nIikKKyAgICAgICAgcHVibGljIEpzb25TdHJpbmcgcG9zdEpzb25TdHJpbmcoZmluYWwgSnNvblN0cmluZyBqc29uU3RyaW5nKSB7CisgICAgICAgICAgICByZXR1cm4ganNvblN0cmluZzsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJqc29uTnVtYmVyIikKKyAgICAgICAgcHVibGljIEpzb25WYWx1ZSBwb3N0SnNvbk51bWJlcihmaW5hbCBKc29uTnVtYmVyIGpzb25OdW1iZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBqc29uTnVtYmVyOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBASlNPTlAKKyAgICAgICAgQFBhdGgoImpzb25PYmplY3RXaXRoUGFkZGluZyIpCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vamF2YXNjcmlwdCIpCisgICAgICAgIHB1YmxpYyBKc29uT2JqZWN0IGdldEpzb25PYmplY3RXaXRoUGFkZGluZygpIHsKKyAgICAgICAgICAgIHJldHVybiBKU09OX09CSkVDVDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5EVU1QX0VOVElUWSk7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcykKKyAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdG8gZGlzYWJsZSBhdXRvLWRpc2NvdmVyeSAoTU9YeSwgQmVhblZhbGlkYXRpb24sIC4uLikgYW5kIHJlZ2lzdGVyIFZhbGlkYXRpb25GZWF0dXJlLgorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLkZFQVRVUkVfQVVUT19ESVNDT1ZFUllfRElTQUJMRSwgdHJ1ZSkKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoSnNvblByb2Nlc3NpbmdGZWF0dXJlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKc29uT2JqZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJqc29uT2JqZWN0IikucmVxdWVzdChNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikucG9zdChFbnRpdHkuanNvbihKU09OX09CSkVDVCkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhKU09OX09CSkVDVCwgcmVzcG9uc2UucmVhZEVudGl0eShKc29uT2JqZWN0LmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SnNvbk9iamVjdEFzU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJqc29uT2JqZWN0IikucmVxdWVzdChNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5qc29uKEpTT05fT0JKRUNUX1NUUjEpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoSlNPTl9PQkpFQ1QsIHJlc3BvbnNlLnJlYWRFbnRpdHkoSnNvbk9iamVjdC5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpzb25PYmplY3RQbHVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJqc29uT2JqZWN0IikucmVxdWVzdCgiYXBwbGljYXRpb24vZm9vK2pzb24iKS5wb3N0KEVudGl0eS5qc29uKEpTT05fT0JKRUNUKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEpTT05fT0JKRUNULCByZXNwb25zZS5yZWFkRW50aXR5KEpzb25PYmplY3QuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKc29uT2JqZWN0QXNTdHJpbmdQbHVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJqc29uT2JqZWN0IikucmVxdWVzdCgiYXBwbGljYXRpb24vZm9vK2pzb24iKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5Lmpzb24oSlNPTl9PQkpFQ1RfU1RSMSkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhKU09OX09CSkVDVCwgcmVzcG9uc2UucmVhZEVudGl0eShKc29uT2JqZWN0LmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SnNvbk9iamVjdFdyb25nVGFyZ2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJqc29uQXJyYXkiKS5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKS5wb3N0KEVudGl0eS5qc29uKEpTT05fT0JKRUNUKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpzb25PYmplY3RBc1N0cmluZ1dyb25nVGFyZ2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJqc29uQXJyYXkiKS5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuanNvbihKU09OX09CSkVDVF9TVFIxKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpzb25PYmplY3RXcm9uZ0VudGl0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgianNvbk9iamVjdCIpLnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pLnBvc3QoRW50aXR5Lmpzb24oSlNPTl9BUlJBWSkpOworCisgICAgICAgIGFzc2VydEVxdWFscyg1MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKc29uT2JqZWN0QXNTdHJpbmdXcm9uZ0VudGl0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgianNvbk9iamVjdCIpLnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuanNvbihKU09OX0FSUkFZX1NUUjEpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNTAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SnNvbk9iamVjdFdyb25nTWVkaWFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJqc29uT2JqZWN0IikucmVxdWVzdChNZWRpYVR5cGUuQVBQTElDQVRJT05fT0NURVRfU1RSRUFNKS5wb3N0KEVudGl0eS5qc29uKEpTT05fT0JKRUNUKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpzb25PYmplY3RBc1N0cmluZ1dyb25nTWVkaWFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJqc29uT2JqZWN0IikucmVxdWVzdChNZWRpYVR5cGUuQVBQTElDQVRJT05fT0NURVRfU1RSRUFNKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5Lmpzb24oSlNPTl9PQkpFQ1RfU1RSMSkpOworCisgICAgICAgIGFzc2VydEVxdWFscyg1MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKc29uQXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImpzb25BcnJheSIpLnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pLnBvc3QoRW50aXR5Lmpzb24oSlNPTl9BUlJBWSkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhKU09OX0FSUkFZLCByZXNwb25zZS5yZWFkRW50aXR5KEpzb25BcnJheS5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpzb25BcnJheUFzU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJqc29uQXJyYXkiKS5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuanNvbihKU09OX0FSUkFZX1NUUjEpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoSlNPTl9BUlJBWSwgcmVzcG9uc2UucmVhZEVudGl0eShKc29uQXJyYXkuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKc29uQXJyYXlQbHVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJqc29uQXJyYXkiKS5yZXF1ZXN0KCJhcHBsaWNhdGlvbi9mb28ranNvbiIpLnBvc3QoRW50aXR5Lmpzb24oSlNPTl9BUlJBWSkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhKU09OX0FSUkFZLCByZXNwb25zZS5yZWFkRW50aXR5KEpzb25BcnJheS5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpzb25BcnJheUFzU3RyaW5nUGx1cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgianNvbkFycmF5IikucmVxdWVzdCgiYXBwbGljYXRpb24vZm9vK2pzb24iKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuanNvbihKU09OX0FSUkFZX1NUUjEpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoSlNPTl9BUlJBWSwgcmVzcG9uc2UucmVhZEVudGl0eShKc29uQXJyYXkuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKc29uQXJyYXlXcm9uZ1RhcmdldCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgianNvbk9iamVjdCIpLnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pLnBvc3QoRW50aXR5Lmpzb24oSlNPTl9BUlJBWSkpOworCisgICAgICAgIGFzc2VydEVxdWFscyg1MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKc29uQXJyYXlBc1N0cmluZ1dyb25nVGFyZ2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJqc29uT2JqZWN0IikucmVxdWVzdChNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5qc29uKEpTT05fQVJSQVlfU1RSMSkpOworCisgICAgICAgIGFzc2VydEVxdWFscyg1MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKc29uQXJyYXlXcm9uZ0VudGl0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgianNvbkFycmF5IikucmVxdWVzdChNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikucG9zdChFbnRpdHkuanNvbihKU09OX09CSkVDVCkpOworCisgICAgICAgIGFzc2VydEVxdWFscyg1MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKc29uQXJyYXlBc1N0cmluZ1dyb25nRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJqc29uQXJyYXkiKS5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuanNvbihKU09OX09CSkVDVF9TVFIxKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpzb25BcnJheVdyb25nTWVkaWFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJqc29uQXJyYXkiKS5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9PQ1RFVF9TVFJFQU0pLnBvc3QoRW50aXR5Lmpzb24oSlNPTl9BUlJBWSkpOworCisgICAgICAgIGFzc2VydEVxdWFscyg1MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKc29uQXJyYXl0QXNTdHJpbmdXcm9uZ01lZGlhVHlwZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgianNvbkFycmF5IikucmVxdWVzdChNZWRpYVR5cGUuQVBQTElDQVRJT05fT0NURVRfU1RSRUFNKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuanNvbihKU09OX0FSUkFZX1NUUjEpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNTAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SnNvbkFycmF5VmFsdWVFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImpzb25BcnJheSIpLnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pLnBvc3QoRW50aXR5Lmpzb24oSlNPTl9BUlJBWV9WQUxVRSkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhKU09OX0FSUkFZX1ZBTFVFLCByZXNwb25zZS5yZWFkRW50aXR5KEpzb25BcnJheS5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpzb25TdHJ1Y3R1cmVBcnJheSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgianNvblN0cnVjdHVyZSIpLnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pLnBvc3QoRW50aXR5Lmpzb24oSlNPTl9BUlJBWSkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhKU09OX0FSUkFZLCByZXNwb25zZS5yZWFkRW50aXR5KEpzb25TdHJ1Y3R1cmUuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKc29uU3RydWN0dXJlT2JqZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJqc29uU3RydWN0dXJlIikucmVxdWVzdChNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikucG9zdChFbnRpdHkuanNvbihKU09OX09CSkVDVCkpOworCisgICAgICAgIGFzc2VydEVxdWFscyhKU09OX09CSkVDVCwgcmVzcG9uc2UucmVhZEVudGl0eShKc29uU3RydWN0dXJlLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SnNvblZhbHVlQm9vbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgianNvblZhbHVlIikucmVxdWVzdChNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5Lmpzb24oSlNPTl9WQUxVRV9CT09MKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEpTT05fVkFMVUVfQk9PTCwgcmVzcG9uc2UucmVhZEVudGl0eShKc29uVmFsdWUuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKc29uVmFsdWVTdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImpzb25TdHJpbmciKS5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5Lmpzb24oSlNPTl9WQUxVRV9TVFJJTkcpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoSlNPTl9WQUxVRV9TVFJJTkcsIHJlc3BvbnNlLnJlYWRFbnRpdHkoSnNvblN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpzb25WYWx1ZVN0cmluZ0FzVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImpzb25WYWx1ZSIpLnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5qc29uKEpTT05fVkFMVUVfU1RSSU5HKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEpTT05fVkFMVUVfU1RSSU5HLCByZXNwb25zZS5yZWFkRW50aXR5KEpzb25TdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKc29uVmFsdWVTdHJpbmdBc1N0cmluZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgianNvblZhbHVlIikucmVxdWVzdChNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5Lmpzb24oIlwiUmVkIDVcIiIpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIlJlZCA1IiwgcmVzcG9uc2UucmVhZEVudGl0eShKc29uU3RyaW5nLmNsYXNzKS5nZXRTdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SnNvblZhbHVlTnVtYmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJqc29uTnVtYmVyIikucmVxdWVzdChNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5qc29uKEpTT05fVkFMVUVfTlVNQkVSKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEpTT05fVkFMVUVfTlVNQkVSLCByZXNwb25zZS5yZWFkRW50aXR5KEpzb25OdW1iZXIuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKc29uVmFsdWVOdW1iZXJBc1ZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJqc29uVmFsdWUiKS5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuanNvbihKU09OX1ZBTFVFX05VTUJFUikpOworCisgICAgICAgIGFzc2VydEVxdWFscyhKU09OX1ZBTFVFX05VTUJFUiwgcmVzcG9uc2UucmVhZEVudGl0eShKc29uTnVtYmVyLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SnNvbk9iamVjdFdpdGhQYWRkaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJqc29uT2JqZWN0V2l0aFBhZGRpbmciKS5yZXF1ZXN0KCJhcHBsaWNhdGlvbi9qYXZhc2NyaXB0IikuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBpcyhKU09OUC5ERUZBVUxUX0NBTExCQUNLICsgIigiICsgSlNPTl9PQkpFQ1RfU1RSMSArICIpIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9Kc29uVGVzdEhlbHBlci5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL0pzb25UZXN0SGVscGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcwNmNlYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9Kc29uVGVzdEhlbHBlci5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworLyoqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBKc29uVGVzdEhlbHBlciB7CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRSZXNvdXJjZUFzU3RyaW5nKFN0cmluZyBwcmVmaXgsIFN0cmluZyByZXNvdXJjZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldEVudGl0eUFzU3RyaW5nKFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0Q29udGV4dENsYXNzTG9hZGVyKCkuZ2V0UmVzb3VyY2VBc1N0cmVhbShwcmVmaXggKyByZXNvdXJjZSkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEVudGl0eUFzU3RyaW5nKElucHV0U3RyZWFtIGlucHV0U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBSZWFkZXIgcmVhZGVyID0gbmV3IElucHV0U3RyZWFtUmVhZGVyKGlucHV0U3RyZWFtKTsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGNoYXJbXSBjID0gbmV3IGNoYXJbMTAyNF07CisgICAgICAgIGludCBsOworICAgICAgICB3aGlsZSAoKGwgPSByZWFkZXIucmVhZChjKSkgIT0gLTEpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZChjLCAwLCBsKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIDxUPiBUIGNyZWF0ZVRlc3RJbnN0YW5jZShDbGFzczxUPiBjbGF6eikgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgTWV0aG9kIGNyZWF0ZU1ldGhvZCA9IGNsYXp6LmdldERlY2xhcmVkTWV0aG9kKCJjcmVhdGVUZXN0SW5zdGFuY2UiKTsKKyAgICAgICAgICAgIC8vbm9pbnNwZWN0aW9uIHVuY2hlY2tlZAorICAgICAgICAgICAgcmV0dXJuIChUKSBjcmVhdGVNZXRob2QuaW52b2tlKGNsYXp6KTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbGxlY3Rpb25FbXB0eShmaW5hbCBDb2xsZWN0aW9uPD8+IGNvbGxlY3Rpb24pIHsKKyAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb24gPT0gbnVsbCB8fCBjb2xsZWN0aW9uLmlzRW1wdHkoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIDxUPiBib29sZWFuIGFyZUNvbGxlY3Rpb25zRXF1YWwoZmluYWwgQ29sbGVjdGlvbjxUPiBjb2xsZWN0aW9uMSwgZmluYWwgQ29sbGVjdGlvbjxUPiBjb2xsZWN0aW9uMikgeworICAgICAgICByZXR1cm4gY29sbGVjdGlvbjEgPT0gY29sbGVjdGlvbjIKKyAgICAgICAgICAgICAgICB8fCAoaXNDb2xsZWN0aW9uRW1wdHkoY29sbGVjdGlvbjEpICYmIGlzQ29sbGVjdGlvbkVtcHR5KGNvbGxlY3Rpb24yKSkKKyAgICAgICAgICAgICAgICB8fCAoY29sbGVjdGlvbjEgIT0gbnVsbCAmJiBjb2xsZWN0aW9uMS5lcXVhbHMoY29sbGVjdGlvbjIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNBcnJheUVtcHR5KGZpbmFsIE9iamVjdFtdIGFycmF5KSB7CisgICAgICAgIHJldHVybiBhcnJheSA9PSBudWxsIHx8IGFycmF5Lmxlbmd0aCA9PSAwOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgPFQ+IGJvb2xlYW4gYXJlQXJyYXlzRXF1YWwoZmluYWwgVFtdIGFycmF5MSwgZmluYWwgVFtdIGFycmF5MikgeworICAgICAgICByZXR1cm4gYXJyYXkxID09IGFycmF5MgorICAgICAgICAgICAgICAgIHx8IChpc0FycmF5RW1wdHkoYXJyYXkxKSAmJiBpc0FycmF5RW1wdHkoYXJyYXkyKSkKKyAgICAgICAgICAgICAgICB8fCBBcnJheXMuZXF1YWxzKGFycmF5MSwgYXJyYXkyKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9Kc29uVGVzdFByb3ZpZGVyLmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vSnNvblRlc3RQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjNzJiNjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vSnNvblRlc3RQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsMTczIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Db250ZXh0UmVzb2x2ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgamF2YXguanNvbi5iaW5kLkpzb25iOworaW1wb3J0IGphdmF4Lmpzb24uYmluZC5Kc29uYkJ1aWxkZXI7CitpbXBvcnQgamF2YXguanNvbi5iaW5kLkpzb25iQ29uZmlnOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamFja3Nvbi5KYWNrc29uRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uMS5KYWNrc29uMUZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dGlzb24uSmV0dGlzb25Db25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dGlzb24uSmV0dGlzb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lmpzb25iLkpzb25CaW5kaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb3h5Lmpzb24uTW94eUpzb25Db25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW94eS5qc29uLk1veHlKc29uRmVhdHVyZTsKKworLyoqCisgKiBDb21tb24gY2xhc3MgZm9yIEpTT04gcHJvdmlkZXJzIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRlc3RpbmcgSlNPTiBjYXBhYmlsaXRpZXMuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBKc29uVGVzdFByb3ZpZGVyIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgQ29sbGVjdGlvbjxKc29uVGVzdFByb3ZpZGVyPiBKQVhCX1BST1ZJREVSUyA9IG5ldyBMaW5rZWRIYXNoU2V0PEpzb25UZXN0UHJvdmlkZXI+KCkge3sKKyAgICAgICAgYWRkKG5ldyBKYWNrc29uSnNvblRlc3RQcm92aWRlcigpKTsKKyAgICAgICAgYWRkKG5ldyBKYWNrc29uMUpzb25UZXN0UHJvdmlkZXIoKSk7CisgICAgICAgIGFkZChuZXcgSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyKCkpOworICAgICAgICBhZGQobmV3IEpldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXIoKSk7CisgICAgICAgIGFkZChuZXcgTW94eUpzb25UZXN0UHJvdmlkZXIoKSk7CisgICAgICAgIGFkZChuZXcgSnNvbmJUZXN0UHJvdmlkZXIoKSk7CisgICAgfX07CisKKyAgICAvLyAgVE9ETyBhZGQgTW94eUpzb25UZXN0UHJvdmlkZXIgb25jZSBNT1h5IHN1cHBvcnRzIFBPSk8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIENvbGxlY3Rpb248SnNvblRlc3RQcm92aWRlcj4gUE9KT19QUk9WSURFUlMgPSBuZXcgTGlua2VkSGFzaFNldDxKc29uVGVzdFByb3ZpZGVyPigpIHt7CisgICAgICAgIGFkZChuZXcgSmFja3Nvbkpzb25UZXN0UHJvdmlkZXIoKSk7CisgICAgICAgIGFkZChuZXcgSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyKCkpOworICAgIH19OworCisgICAgcHJpdmF0ZSBGZWF0dXJlIGZlYXR1cmU7CisgICAgcHJpdmF0ZSBKZXR0aXNvbkNvbmZpZyBjb25maWd1cmF0aW9uOworICAgIHByaXZhdGUgU2V0PE9iamVjdD4gcHJvdmlkZXJzID0gbmV3IExpbmtlZEhhc2hTZXQ8PigpOworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXIgZXh0ZW5kcyBKc29uVGVzdFByb3ZpZGVyIHsKKworICAgICAgICBwdWJsaWMgSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyKCkgeworICAgICAgICAgICAgZmluYWwgSmV0dGlzb25Db25maWcganNvbkNvbmZpZ3VyYXRpb24gPQorICAgICAgICAgICAgICAgICAgICBKZXR0aXNvbkNvbmZpZy5tYXBwZWRKZXR0aXNvbigpLnhtbDJKc29uTnMobmV3IEhhc2hNYXA8U3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZz4oKSB7eworICAgICAgICAgICAgICAgICAgICAgICAgcHV0KCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsICJ4c2kiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1dCgiaHR0cDovL2V4YW1wbGUuY29tIiwgImV4YW1wbGUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1dCgiaHR0cDovL3Rlc3QuamF4Yi5jb20iLCAiamF4YiIpOworICAgICAgICAgICAgICAgICAgICB9fSkuc2VyaWFsaXplQXNBcnJheSgic2luZ2xlSXRlbUxpc3QiKS5idWlsZCgpOworCisgICAgICAgICAgICBzZXRGZWF0dXJlKG5ldyBKZXR0aXNvbkZlYXR1cmUoKSk7CisgICAgICAgICAgICBzZXRDb25maWd1cmF0aW9uKGpzb25Db25maWd1cmF0aW9uKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyIGV4dGVuZHMgSnNvblRlc3RQcm92aWRlciB7CisKKyAgICAgICAgcHVibGljIEpldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXIoKSB7CisgICAgICAgICAgICBzZXRGZWF0dXJlKG5ldyBKZXR0aXNvbkZlYXR1cmUoKSk7CisKKyAgICAgICAgICAgIHNldENvbmZpZ3VyYXRpb24oSmV0dGlzb25Db25maWcuYmFkZ2VyRmlzaCgpLmJ1aWxkKCkpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1veHlKc29uVGVzdFByb3ZpZGVyIGV4dGVuZHMgSnNvblRlc3RQcm92aWRlciB7CisKKyAgICAgICAgcHVibGljIE1veHlKc29uVGVzdFByb3ZpZGVyKCkgeworICAgICAgICAgICAgc2V0RmVhdHVyZShuZXcgTW94eUpzb25GZWF0dXJlKCkpOworICAgICAgICAgICAgZ2V0UHJvdmlkZXJzKCkuYWRkKG5ldyBNb3h5SnNvbkNvbmZpZ3VyYXRpb25Db250ZXh0UmVzb2x2ZXIoKSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2xhc3MgTW94eUpzb25Db25maWd1cmF0aW9uQ29udGV4dFJlc29sdmVyIGltcGxlbWVudHMgQ29udGV4dFJlc29sdmVyPE1veHlKc29uQ29uZmlnPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBNb3h5SnNvbkNvbmZpZyBnZXRDb250ZXh0KGZpbmFsIENsYXNzPD8+IG9iamVjdFR5cGUpIHsKKyAgICAgICAgICAgIGZpbmFsIE1veHlKc29uQ29uZmlnIGNvbmZpZ3VyYXRpb24gPSBuZXcgTW94eUpzb25Db25maWcoKTsKKworICAgICAgICAgICAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBuYW1lc3BhY2VQcmVmaXhNYXBwZXIgPSBuZXcgSGFzaE1hcDw+KDEpOworICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4TWFwcGVyLnB1dCgiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiLCAieHNpIik7CisgICAgICAgICAgICBuYW1lc3BhY2VQcmVmaXhNYXBwZXIucHV0KCJodHRwOi8vZXhhbXBsZS5jb20iLCAiZXhhbXBsZSIpOworICAgICAgICAgICAgbmFtZXNwYWNlUHJlZml4TWFwcGVyLnB1dCgiaHR0cDovL3Rlc3QuamF4Yi5jb20iLCAiamF4YiIpOworCisgICAgICAgICAgICBjb25maWd1cmF0aW9uLnNldE5hbWVzcGFjZVByZWZpeE1hcHBlcihuYW1lc3BhY2VQcmVmaXhNYXBwZXIpOworICAgICAgICAgICAgY29uZmlndXJhdGlvbi5zZXROYW1lc3BhY2VTZXBhcmF0b3IoJzonKTsKKworICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ3VyYXRpb247CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNsYXNzIEpzb25iQ29udGV4dFJlc29sdmVyIGltcGxlbWVudHMgQ29udGV4dFJlc29sdmVyPEpzb25iPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBKc29uYiBnZXRDb250ZXh0KENsYXNzPD8+IHR5cGUpIHsKKyAgICAgICAgICAgIEpzb25iQ29uZmlnIGNvbmZpZyA9IG5ldyBKc29uYkNvbmZpZygpOworICAgICAgICAgICAgcmV0dXJuIEpzb25iQnVpbGRlci5jcmVhdGUoY29uZmlnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSmFja3Nvbkpzb25UZXN0UHJvdmlkZXIgZXh0ZW5kcyBKc29uVGVzdFByb3ZpZGVyIHsKKworICAgICAgICBwdWJsaWMgSmFja3Nvbkpzb25UZXN0UHJvdmlkZXIoKSB7CisgICAgICAgICAgICBzZXRGZWF0dXJlKG5ldyBKYWNrc29uRmVhdHVyZSgpKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKYWNrc29uMUpzb25UZXN0UHJvdmlkZXIgZXh0ZW5kcyBKc29uVGVzdFByb3ZpZGVyIHsKKyAgICAgICAgcHVibGljIEphY2tzb24xSnNvblRlc3RQcm92aWRlcigpIHsKKyAgICAgICAgICAgIHNldEZlYXR1cmUobmV3IEphY2tzb24xRmVhdHVyZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSnNvbmJUZXN0UHJvdmlkZXIgZXh0ZW5kcyBKc29uVGVzdFByb3ZpZGVyIHsKKyAgICAgICAgcHVibGljIEpzb25iVGVzdFByb3ZpZGVyKCkgeworICAgICAgICAgICAgc2V0RmVhdHVyZShuZXcgSnNvbkJpbmRpbmdGZWF0dXJlKCkpOworICAgICAgICAgICAgZ2V0UHJvdmlkZXJzKCkuYWRkKG5ldyBKc29uYkNvbnRleHRSZXNvbHZlcigpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBKZXR0aXNvbkNvbmZpZyBnZXRDb25maWd1cmF0aW9uKCkgeworICAgICAgICByZXR1cm4gY29uZmlndXJhdGlvbjsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRDb25maWd1cmF0aW9uKGZpbmFsIEpldHRpc29uQ29uZmlnIGNvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uID0gY29uZmlndXJhdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgRmVhdHVyZSBnZXRGZWF0dXJlKCkgeworICAgICAgICByZXR1cm4gZmVhdHVyZTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBzZXRGZWF0dXJlKGZpbmFsIEZlYXR1cmUgZmVhdHVyZSkgeworICAgICAgICB0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOworICAgIH0KKworICAgIHB1YmxpYyBTZXQ8T2JqZWN0PiBnZXRQcm92aWRlcnMoKSB7CisgICAgICAgIHJldHVybiBwcm92aWRlcnM7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vSnNvbldpdGhQYWRkaW5nRW5jb2RpbmdGaWx0ZXJUZXN0LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vSnNvbldpdGhQYWRkaW5nRW5jb2RpbmdGaWx0ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQyZTUwYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9Kc29uV2l0aFBhZGRpbmdFbmNvZGluZ0ZpbHRlclRlc3QuamF2YQpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uSmFja3NvbkZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5EZWZsYXRlRW5jb2RlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLkdaaXBFbmNvZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5KU09OUDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmZpbHRlci5FbmNvZGluZ0ZpbHRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIFRlc3RzLCB0aGF0IEpTT05QIGNhbGxiYWNrIHdyYXBwaW5nIHRha2VzIHBsYWNlcyBiZWZvcmUgdGhlIGV2ZW50dWFsIGVudGl0eSBjb21wcmVzc2lvbi4KKyAqCisgKiBTZWUgaHR0cHM6Ly9qYXZhLm5ldC9qaXJhL2Jyb3dzZS9KRVJTRVktMjUyNCBmb3IgdGhlIG9yaWdpbmFsIGlzc3VlIGRlc2NyaXB0aW9uLgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEpzb25XaXRoUGFkZGluZ0VuY29kaW5nRmlsdGVyVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhNeVJlc291cmNlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihKYWNrc29uRmVhdHVyZS5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoRW5jb2RpbmdGaWx0ZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKEdaaXBFbmNvZGVyLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihEZWZsYXRlRW5jb2Rlci5jbGFzcyk7CisgICAgfQorCisgICAgQFBhdGgoInJlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlSZXNvdXJjZSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImpzb25wIikKKyAgICAgICAgQEpTT05QKHF1ZXJ5UGFyYW0gPSBKU09OUC5ERUZBVUxUX1FVRVJZKQorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpCisgICAgICAgIHB1YmxpYyBNZXNzYWdlIGdldEhlbGxvSnNvblAoQENvbnRleHQgZmluYWwgSHR0cEhlYWRlcnMgaGVhZGVycykgeworICAgICAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlclBhcmFtcyA9IGhlYWRlcnMuZ2V0UmVxdWVzdEhlYWRlcnMoKTsKKyAgICAgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIGtleSA6IGhlYWRlclBhcmFtcy5rZXlTZXQoKSkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihrZXkgKyAiOiAiKTsKKyAgICAgICAgICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyB2YWx1ZSA6IGhlYWRlclBhcmFtcy5nZXQoa2V5KSkgeworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KHZhbHVlICsgIiwgIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiXGJcYiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBNZXNzYWdlKCJIZWxsbyB3b3JsZCBKc29uUCEiLCAiRW5nbGlzaCIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNZXNzYWdlIHsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ3JlZXRpbmc7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIGxhbmd1YWdlOworCisgICAgICAgIHB1YmxpYyBNZXNzYWdlKGZpbmFsIFN0cmluZyBncmVldGluZywgZmluYWwgU3RyaW5nIGxhbmd1YWdlKSB7CisgICAgICAgICAgICB0aGlzLmdyZWV0aW5nID0gZ3JlZXRpbmc7CisgICAgICAgICAgICB0aGlzLmxhbmd1YWdlID0gbGFuZ3VhZ2U7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEdyZWV0aW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIGdyZWV0aW5nOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRMYW5ndWFnZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBsYW5ndWFnZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvcnJlY3RHemlwRGVjb2RpbmcoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzdC9qc29ucCIpLnF1ZXJ5UGFyYW0oIl9fY2FsbGJhY2siLCAiZGlhbG9nIikKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoR1ppcEVuY29kZXIuY2xhc3MpLnJlcXVlc3QoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpCisgICAgICAgICAgICAgICAgLmhlYWRlcigiQWNjZXB0LUVuY29kaW5nIiwgImd6aXAiKS5nZXQoKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzdWx0ID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoImd6aXAiLCByZXNwb25zZS5nZXRIZWFkZXJzKCkuZ2V0Rmlyc3QoIkNvbnRlbnQtRW5jb2RpbmciKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuc3RhcnRzV2l0aCgiZGlhbG9nKCIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuY29udGFpbnMoIkhlbGxvIHdvcmxkIEpzb25QISIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuY29udGFpbnMoIkVuZ2xpc2giKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29ycmVjdERlZmxhdGVEZWNvZGluZygpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXN0L2pzb25wIikucXVlcnlQYXJhbSgiX19jYWxsYmFjayIsICJkaWFsb2ciKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihEZWZsYXRlRW5jb2Rlci5jbGFzcykucmVxdWVzdCgiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0IikKKyAgICAgICAgICAgICAgICAuaGVhZGVyKCJBY2NlcHQtRW5jb2RpbmciLCAiZGVmbGF0ZSIpLmdldCgpOworCisgICAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiZGVmbGF0ZSIsIHJlc3BvbnNlLmdldEhlYWRlcnMoKS5nZXRGaXJzdCgiQ29udGVudC1FbmNvZGluZyIpKTsKKworICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5zdGFydHNXaXRoKCJkaWFsb2coIikpOworICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5jb250YWlucygiSGVsbG8gd29ybGQgSnNvblAhIikpOworICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdC5jb250YWlucygiRW5nbGlzaCIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vSnNvbldpdGhQYWRkaW5nVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL0pzb25XaXRoUGFkZGluZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2YzNWRmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL0pzb25XaXRoUGFkZGluZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDI4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbjsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uLkphY2tzb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5KU09OUDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuaGFtY3Jlc3QuTWF0Y2hlcjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5hbGxPZjsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lbmRzV2l0aDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLm5vdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5zdGFydHNXaXRoOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgSnNvbldpdGhQYWRkaW5nVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQFN1cHByZXNzV2FybmluZ3MoIlVudXNlZERlY2xhcmF0aW9uIikKKyAgICBAWG1sUm9vdEVsZW1lbnQKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpzb25CZWFuIHsKKworICAgICAgICBwcml2YXRlIFN0cmluZyBhdHRyaWJ1dGU7CisKKyAgICAgICAgcHVibGljIEpzb25CZWFuKCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEpzb25CZWFuKGZpbmFsIFN0cmluZyBhdHRyKSB7CisgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZSA9IGF0dHI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIEpzb25CZWFuIGNyZWF0ZVRlc3RJbnN0YW5jZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSnNvbkJlYW4oImF0dHIiKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlKCkgeworICAgICAgICAgICAgcmV0dXJuIGF0dHJpYnV0ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShmaW5hbCBTdHJpbmcgYXR0cmlidXRlKSB7CisgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZSA9IGF0dHJpYnV0ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJqc29ucCIpCisgICAgQFByb2R1Y2VzKHsiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0IiwgImFwcGxpY2F0aW9uL2pzb24ifSkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpzb25SZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiUHVyZUpzb24iKQorICAgICAgICBwdWJsaWMgSnNvbkJlYW4gZ2V0UHVyZUpzb24oKSB7CisgICAgICAgICAgICByZXR1cm4gSnNvbkJlYW4uY3JlYXRlVGVzdEluc3RhbmNlKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBKU09OUAorICAgICAgICBAUGF0aCgiSnNvbldpdGhQYWRkaW5nRGVmYXVsdCIpCisgICAgICAgIHB1YmxpYyBKc29uQmVhbiBnZXRKc29uV2l0aFBhZGRpbmdEZWZhdWx0KCkgeworICAgICAgICAgICAgcmV0dXJuIEpzb25CZWFuLmNyZWF0ZVRlc3RJbnN0YW5jZSgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBASlNPTlAocXVlcnlQYXJhbSA9ICJldmFsIikKKyAgICAgICAgQFBhdGgoIkpzb25XaXRoUGFkZGluZ1F1ZXJ5Q2FsbGJhY2tQYXJhbSIpCisgICAgICAgIHB1YmxpYyBKc29uQmVhbiBnZXRKc29uV2l0aFBhZGRpbmdRdWVyeUNhbGxiYWNrUGFyYW0oKSB7CisgICAgICAgICAgICByZXR1cm4gSnNvbkJlYW4uY3JlYXRlVGVzdEluc3RhbmNlKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBKU09OUChjYWxsYmFjayA9ICJwYXJzZSIsIHF1ZXJ5UGFyYW0gPSAiZXZhbCIpCisgICAgICAgIEBQYXRoKCJKc29uV2l0aFBhZGRpbmdDYWxsYmFja0FuZFF1ZXJ5Q2FsbGJhY2tQYXJhbSIpCisgICAgICAgIHB1YmxpYyBKc29uQmVhbiBnZXRKc29uV2l0aFBhZGRpbmdDYWxsYmFja0FuZFF1ZXJ5Q2FsbGJhY2tQYXJhbSgpIHsKKyAgICAgICAgICAgIHJldHVybiBKc29uQmVhbi5jcmVhdGVUZXN0SW5zdGFuY2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQEpTT05QKGNhbGxiYWNrID0gImV2YWwiKQorICAgICAgICBAUGF0aCgiSnNvbldpdGhQYWRkaW5nQ2FsbGJhY2siKQorICAgICAgICBwdWJsaWMgSnNvbkJlYW4gZ2V0SnNvbldpdGhQYWRkaW5nQ2FsbGJhY2soKSB7CisgICAgICAgICAgICByZXR1cm4gSnNvbkJlYW4uY3JlYXRlVGVzdEluc3RhbmNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKG5hbWUgPSAiezB9IikKKyAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248SnNvblRlc3RQcm92aWRlcltdPiBnZXRKc29uUHJvdmlkZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIExpc3Q8SnNvblRlc3RQcm92aWRlcltdPiB0ZXN0UHJvdmlkZXJzID0gbmV3IExpbmtlZExpc3Q8PigpOworCisgICAgICAgIGZvciAoZmluYWwgSnNvblRlc3RQcm92aWRlciBqc29uUHJvdmlkZXIgOiBKc29uVGVzdFByb3ZpZGVyLkpBWEJfUFJPVklERVJTKSB7CisgICAgICAgICAgICB0ZXN0UHJvdmlkZXJzLmFkZChuZXcgSnNvblRlc3RQcm92aWRlcltdIHtqc29uUHJvdmlkZXJ9KTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiB0ZXN0UHJvdmlkZXJzOworICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgSnNvblRlc3RQcm92aWRlciBqc29uVGVzdFByb3ZpZGVyOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGVycm9yTWVzc2FnZTsKKworICAgIHB1YmxpYyBKc29uV2l0aFBhZGRpbmdUZXN0KGZpbmFsIEpzb25UZXN0UHJvdmlkZXIganNvblRlc3RQcm92aWRlcikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyKGNvbmZpZ3VyZUpheHJzQXBwbGljYXRpb24oanNvblRlc3RQcm92aWRlcikpOworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworCisgICAgICAgIHRoaXMuanNvblRlc3RQcm92aWRlciA9IGpzb25UZXN0UHJvdmlkZXI7CisgICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gU3RyaW5nLmZvcm1hdCgiJXM6IFJlY2VpdmVkIEpTT04gZW50aXR5IGNvbnRlbnQgZG9lcyBub3QgbWF0Y2ggZXhwZWN0ZWQgSlNPTiBlbnRpdHkgY29udGVudC4iLAorICAgICAgICAgICAgICAgIGpzb25UZXN0UHJvdmlkZXIuZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChmaW5hbCBDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5yZWdpc3Rlcihqc29uVGVzdFByb3ZpZGVyLmdldEZlYXR1cmUoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgQXBwbGljYXRpb24gY29uZmlndXJlSmF4cnNBcHBsaWNhdGlvbihmaW5hbCBKc29uVGVzdFByb3ZpZGVyIGpzb25UZXN0UHJvdmlkZXIpIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlckNsYXNzZXMoSnNvblJlc291cmNlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3Rlcihqc29uVGVzdFByb3ZpZGVyLmdldEZlYXR1cmUoKSk7CisKKyAgICAgICAgaWYgKGpzb25UZXN0UHJvdmlkZXIuZ2V0UHJvdmlkZXJzKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVzb3VyY2VDb25maWcucmVnaXN0ZXJJbnN0YW5jZXMoanNvblRlc3RQcm92aWRlci5nZXRQcm92aWRlcnMoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzb3VyY2VDb25maWc7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SnNvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgianNvbnAiKS5wYXRoKCJQdXJlSnNvbiIpLnJlcXVlc3QoImFwcGxpY2F0aW9uL2pzb24iKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpLnRvU3RyaW5nKCksIGVxdWFsVG8oImFwcGxpY2F0aW9uL2pzb24iKSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGVudGl0eSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRUaGF0KGVycm9yTWVzc2FnZSwgZW50aXR5LCBhbGxPZihub3Qoc3RhcnRzV2l0aCgiY2FsbGJhY2soIikpLCBub3QoZW5kc1dpdGgoIikiKSkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKc29uV2l0aEphdmFTY3JpcHRNZWRpYVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImpzb25wIikucGF0aCgiUHVyZUpzb24iKS5yZXF1ZXN0KCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKS5nZXQoKTsKKworICAgICAgICAvLyBNZXRob2QgaXMgaW52b2tlZCBidXQgd2UgZG8gbm90IGhhdmUgYSBNQlcgZm9yIGFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdC4KKyAgICAgICAgaWYgKGpzb25UZXN0UHJvdmlkZXIuZ2V0RmVhdHVyZSgpLmdldENsYXNzKCkgPT0gSmFja3NvbkZlYXR1cmUuY2xhc3MpIHsKKyAgICAgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oMjAwKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDUwMCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SnNvbldpdGhQYWRkaW5nRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0KCJKc29uV2l0aFBhZGRpbmdEZWZhdWx0IiwgImNhbGxiYWNrIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SnNvbldpdGhQYWRkaW5nUXVlcnlDYWxsYmFja1BhcmFtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3QoIkpzb25XaXRoUGFkZGluZ1F1ZXJ5Q2FsbGJhY2tQYXJhbSIsICJldmFsIiwgInBhcnNlIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SnNvbldpdGhQYWRkaW5nUXVlcnlDYWxsYmFja1BhcmFtRGVmYXVsdFF1ZXJ5UGFyYW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdCgiSnNvbldpdGhQYWRkaW5nUXVlcnlDYWxsYmFja1BhcmFtIiwgImNhbGxiYWNrIiwgInBhcnNlIiwgImNhbGxiYWNrIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SnNvbldpdGhQYWRkaW5nUXVlcnlDYWxsYmFja1BhcmFtRGVmYXVsdENhbGxiYWNrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3QoIkpzb25XaXRoUGFkZGluZ1F1ZXJ5Q2FsbGJhY2tQYXJhbSIsIG51bGwsICJjYWxsYmFjayIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpzb25XaXRoUGFkZGluZ1F1ZXJ5Q2FsbGJhY2tQYXJhbU5lZ2F0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3QoIkpzb25XaXRoUGFkZGluZ1F1ZXJ5Q2FsbGJhY2tQYXJhbSIsICJjYWxsIiwgInBhcnNlIiwgdHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SnNvbldpdGhQYWRkaW5nQ2FsbGJhY2tBbmRRdWVyeUNhbGxiYWNrUGFyYW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdCgiSnNvbldpdGhQYWRkaW5nQ2FsbGJhY2tBbmRRdWVyeUNhbGxiYWNrUGFyYW0iLCAiZXZhbCIsICJydW4iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKc29uV2l0aFBhZGRpbmdDYWxsYmFja0FuZFF1ZXJ5Q2FsbGJhY2tQYXJhbU5lZ2F0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3QoIkpzb25XaXRoUGFkZGluZ0NhbGxiYWNrQW5kUXVlcnlDYWxsYmFja1BhcmFtIiwgImV2YWwiLCAicnVuIiwgInBhcnNlIiwgdHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SnNvbldpdGhQYWRkaW5nQ2FsbGJhY2tBbmRRdWVyeUNhbGxiYWNrUGFyYW1EZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3QoIkpzb25XaXRoUGFkZGluZ0NhbGxiYWNrQW5kUXVlcnlDYWxsYmFja1BhcmFtIiwgImV2YWx4IiwgInBhcnNlIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SnNvbldpdGhQYWRkaW5nQ2FsbGJhY2tBbmRRdWVyeUNhbGxiYWNrUGFyYW1EZWZhdWx0TmVnYXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdCgiSnNvbldpdGhQYWRkaW5nQ2FsbGJhY2tBbmRRdWVyeUNhbGxiYWNrUGFyYW0iLCAiZXZhbHgiLCAieGxhdmUiLCAiZXZhbCIsIHRydWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpzb25XaXRoUGFkZGluZ0NhbGxiYWNrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3QoIkpzb25XaXRoUGFkZGluZ0NhbGxiYWNrIiwgImV2YWwiLCAiZXZhbCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpzb25XaXRoUGFkZGluZ0NhbGxiYWNrTmVnYXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdCgiSnNvbldpdGhQYWRkaW5nQ2FsbGJhY2siLCAiZXZhbCIsICJsYXZlIiwgdHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3QoZmluYWwgU3RyaW5nIHBhdGgsIGZpbmFsIFN0cmluZyBjYWxsYmFjaykgeworICAgICAgICB0ZXN0KHBhdGgsIG51bGwsIG51bGwsIGNhbGxiYWNrKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdChmaW5hbCBTdHJpbmcgcGF0aCwgZmluYWwgU3RyaW5nIHF1ZXJ5UGFyYW1OYW1lLCBmaW5hbCBTdHJpbmcgY2FsbGJhY2spIHsKKyAgICAgICAgdGVzdChwYXRoLCBxdWVyeVBhcmFtTmFtZSwgY2FsbGJhY2ssIGNhbGxiYWNrLCBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3QoZmluYWwgU3RyaW5nIHBhdGgsIGZpbmFsIFN0cmluZyBxdWVyeVBhcmFtTmFtZSwgZmluYWwgU3RyaW5nIGNhbGxiYWNrLCBmaW5hbCBib29sZWFuIGlzTmVnYXRpdmUpIHsKKyAgICAgICAgdGVzdChwYXRoLCBxdWVyeVBhcmFtTmFtZSwgY2FsbGJhY2ssIGNhbGxiYWNrLCBpc05lZ2F0aXZlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdChmaW5hbCBTdHJpbmcgcGF0aCwgZmluYWwgU3RyaW5nIHF1ZXJ5UGFyYW1OYW1lLCBmaW5hbCBTdHJpbmcgcXVlcnlQYXJhbVZhbHVlLCBmaW5hbCBTdHJpbmcgY2FsbGJhY2spIHsKKyAgICAgICAgdGVzdChwYXRoLCBxdWVyeVBhcmFtTmFtZSwgcXVlcnlQYXJhbVZhbHVlLCBjYWxsYmFjaywgZmFsc2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0KGZpbmFsIFN0cmluZyBwYXRoLCBmaW5hbCBTdHJpbmcgcXVlcnlQYXJhbU5hbWUsIGZpbmFsIFN0cmluZyBxdWVyeVBhcmFtVmFsdWUsIGZpbmFsIFN0cmluZyBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzTmVnYXRpdmUpIHsKKworICAgICAgICBXZWJUYXJnZXQgdGVtcFRhcmdldCA9IHRhcmdldCgianNvbnAiKS5wYXRoKHBhdGgpOworICAgICAgICBpZiAocXVlcnlQYXJhbU5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgdGVtcFRhcmdldCA9IHRlbXBUYXJnZXQucXVlcnlQYXJhbShxdWVyeVBhcmFtTmFtZSwgcXVlcnlQYXJhbVZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGVtcFRhcmdldC5yZXF1ZXN0KCJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpLnRvU3RyaW5nKCksIGVxdWFsVG8oImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIpKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgZW50aXR5ID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworCisgICAgICAgIC8vIENoZWNrIHRoZSBlbnRpdHkuCisgICAgICAgIGZpbmFsIE1hdGNoZXI8U3RyaW5nPiBzdGFydHNXaXRoID0gc3RhcnRzV2l0aChjYWxsYmFjayArICIoIik7CisgICAgICAgIGZpbmFsIE1hdGNoZXI8U3RyaW5nPiBlbmRzV2l0aCA9IGVuZHNXaXRoKCIpIik7CisKKyAgICAgICAgZmluYWwgTWF0Y2hlcjxTdHJpbmc+IGNhbGxiYWNrTWF0Y2hlciA9IGlzTmVnYXRpdmUgPyBub3Qoc3RhcnRzV2l0aCkgOiBzdGFydHNXaXRoOworCisgICAgICAgIGFzc2VydFRoYXQoZXJyb3JNZXNzYWdlLCBlbnRpdHksIGFsbE9mKGNhbGxiYWNrTWF0Y2hlciwgZW5kc1dpdGgpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9Qb2pvVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL1Bvam9UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY0NzViNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9Qb2pvVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb247CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eS5wb2pvLlBvam9BbmltYWw7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5LnBvam8uUG9qb0FuaW1hbExpc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5LnBvam8uUG9qb0NhdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHkucG9qby5Qb2pvRG9nOworCitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgUG9qb1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdEpzb25UZXN0IHsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMobmFtZSA9ICJ7MH0iKQorICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxKc29uVGVzdFNldHVwW10+IGdlbmVyYXRlVGVzdENhc2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIExpc3Q8SnNvblRlc3RTZXR1cFtdPiBqc29uVGVzdFNldHVwcyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICAgICAgZmluYWwgQ2xhc3M8Pz5bXSBjbGFzc2VzID0ge1Bvam9BbmltYWxMaXN0LmNsYXNzLCBQb2pvQW5pbWFsLmNsYXNzLCBQb2pvRG9nLmNsYXNzLCBQb2pvQ2F0LmNsYXNzfTsKKworICAgICAgICBmb3IgKGZpbmFsIEpzb25UZXN0UHJvdmlkZXIganNvblByb3ZpZGVyIDogSnNvblRlc3RQcm92aWRlci5QT0pPX1BST1ZJREVSUykgeworICAgICAgICAgICAganNvblRlc3RTZXR1cHMuYWRkKG5ldyBKc29uVGVzdFNldHVwW117CisgICAgICAgICAgICAgICAgICAgIG5ldyBKc29uVGVzdFNldHVwKGNsYXNzZXMsIGpzb25Qcm92aWRlcikKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGpzb25UZXN0U2V0dXBzOworICAgIH0KKworICAgIHB1YmxpYyBQb2pvVGVzdChmaW5hbCBKc29uVGVzdFNldHVwIGpzb25UZXN0U2V0dXApIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlcihqc29uVGVzdFNldHVwKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvQW5pbWFsLmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0FuaW1hbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNzM1ODkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0FuaW1hbC5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5OworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworLyoqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KKy8vIEphY2tzb24gMQorQG9yZy5jb2RlaGF1cy5qYWNrc29uLmFubm90YXRlLkpzb25UeXBlSW5mbygKKyAgICAgICAgdXNlID0gb3JnLmNvZGVoYXVzLmphY2tzb24uYW5ub3RhdGUuSnNvblR5cGVJbmZvLklkLk5BTUUsCisgICAgICAgIGluY2x1ZGUgPSBvcmcuY29kZWhhdXMuamFja3Nvbi5hbm5vdGF0ZS5Kc29uVHlwZUluZm8uQXMuUFJPUEVSVFkpCitAb3JnLmNvZGVoYXVzLmphY2tzb24uYW5ub3RhdGUuSnNvblN1YlR5cGVzKHsKKyAgICAgICAgQG9yZy5jb2RlaGF1cy5qYWNrc29uLmFubm90YXRlLkpzb25TdWJUeXBlcy5UeXBlKHZhbHVlID0gQ2F0LmNsYXNzKSwKKyAgICAgICAgQG9yZy5jb2RlaGF1cy5qYWNrc29uLmFubm90YXRlLkpzb25TdWJUeXBlcy5UeXBlKHZhbHVlID0gRG9nLmNsYXNzKSB9KQorLy8gSmFja3NvbiAyCitAY29tLmZhc3RlcnhtbC5qYWNrc29uLmFubm90YXRpb24uSnNvblR5cGVJbmZvKAorICAgICAgICB1c2UgPSBjb20uZmFzdGVyeG1sLmphY2tzb24uYW5ub3RhdGlvbi5Kc29uVHlwZUluZm8uSWQuTkFNRSwKKyAgICAgICAgaW5jbHVkZSA9IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5hbm5vdGF0aW9uLkpzb25UeXBlSW5mby5Bcy5QUk9QRVJUWSkKK0Bjb20uZmFzdGVyeG1sLmphY2tzb24uYW5ub3RhdGlvbi5Kc29uU3ViVHlwZXMoeworICAgICAgICBAY29tLmZhc3RlcnhtbC5qYWNrc29uLmFubm90YXRpb24uSnNvblN1YlR5cGVzLlR5cGUodmFsdWUgPSBDYXQuY2xhc3MpLAorICAgICAgICBAY29tLmZhc3RlcnhtbC5qYWNrc29uLmFubm90YXRpb24uSnNvblN1YlR5cGVzLlR5cGUodmFsdWUgPSBEb2cuY2xhc3MpIH0pCisvLworQFN1cHByZXNzV2FybmluZ3MoIlJlZHVuZGFudElmU3RhdGVtZW50IikKK0BYbWxSb290RWxlbWVudChuYW1lID0gImFuaW1hbCIpCitwdWJsaWMgY2xhc3MgQW5pbWFsIHsKKworICAgIHB1YmxpYyBTdHJpbmcgbmFtZTsKKworICAgIHB1YmxpYyBBbmltYWwoKSB7CisgICAgfQorCisgICAgcHVibGljIEFuaW1hbChmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgQW5pbWFsIG90aGVyID0gKEFuaW1hbCkgb2JqOworICAgICAgICBpZiAoKHRoaXMubmFtZSA9PSBudWxsKSA/IChvdGhlci5uYW1lICE9IG51bGwpIDogIXRoaXMubmFtZS5lcXVhbHMob3RoZXIubmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IDc7CisgICAgICAgIGhhc2ggPSA2NyAqIGhhc2ggKyAodGhpcy5uYW1lICE9IG51bGwgPyB0aGlzLm5hbWUuaGFzaENvZGUoKSA6IDApOworICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgieyBcIm5hbWVcIjpcIiVzXCJ9IiwgbmFtZSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0FuaW1hbExpc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvQW5pbWFsTGlzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZDdmYmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0FuaW1hbExpc3QuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eTsKKworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworLyoqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJSZWR1bmRhbnRJZlN0YXRlbWVudCIpCitAWG1sUm9vdEVsZW1lbnQobmFtZSA9ICJhbmltYWxMaXN0IikKK3B1YmxpYyBjbGFzcyBBbmltYWxMaXN0IHsKKworICAgIHB1YmxpYyBMaXN0PEFuaW1hbD4gYW5pbWFsczsKKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVRlc3RJbnN0YW5jZSgpIHsKKyAgICAgICAgZmluYWwgQW5pbWFsTGlzdCBhTGlzdCA9IG5ldyBBbmltYWxMaXN0KCk7CisgICAgICAgIGFMaXN0LmFuaW1hbHMgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIGFMaXN0LmFuaW1hbHMuYWRkKG5ldyBEb2coIkZpZmkiKSk7CisgICAgICAgIGFMaXN0LmFuaW1hbHMuYWRkKG5ldyBDYXQoIkRhaXN5IikpOworICAgICAgICByZXR1cm4gYUxpc3Q7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBBbmltYWxMaXN0IG90aGVyID0gKEFuaW1hbExpc3QpIG9iajsKKyAgICAgICAgaWYgKHRoaXMuYW5pbWFscyAhPSBvdGhlci5hbmltYWxzICYmICh0aGlzLmFuaW1hbHMgPT0gbnVsbCB8fCAhdGhpcy5hbmltYWxzLmVxdWFscyhvdGhlci5hbmltYWxzKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IDM7CisgICAgICAgIGhhc2ggPSA4OSAqIGhhc2ggKyAodGhpcy5hbmltYWxzICE9IG51bGwgPyB0aGlzLmFuaW1hbHMuaGFzaENvZGUoKSA6IDApOworICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gKGFuaW1hbHMgIT0gbnVsbCkgPyBhbmltYWxzLnRvU3RyaW5nKCkgOiBudWxsOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Bbm90aGVyQW5pbWFsLmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0Fub3RoZXJBbmltYWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDFiYmZjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Bbm90aGVyQW5pbWFsLmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHk7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCisvKioKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJSZWR1bmRhbnRJZlN0YXRlbWVudCIpCitAWG1sUm9vdEVsZW1lbnQobmFtZSA9ICJhbmltYWwiKQorcHVibGljIGNsYXNzIEFub3RoZXJBbmltYWwgeworCisgICAgcHVibGljIFN0cmluZyBuYW1lOworCisgICAgcHVibGljIEFub3RoZXJBbmltYWwoKSB7CisgICAgfQorCisgICAgcHVibGljIEFub3RoZXJBbmltYWwoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIEFub3RoZXJBbmltYWwgb3RoZXIgPSAoQW5vdGhlckFuaW1hbCkgb2JqOworICAgICAgICBpZiAoKHRoaXMubmFtZSA9PSBudWxsKSA/IChvdGhlci5uYW1lICE9IG51bGwpIDogIXRoaXMubmFtZS5lcXVhbHMob3RoZXIubmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IDc7CisgICAgICAgIGhhc2ggPSA2NyAqIGhhc2ggKyAodGhpcy5uYW1lICE9IG51bGwgPyB0aGlzLm5hbWUuaGFzaENvZGUoKSA6IDApOworICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgieyBcIm5hbWVcIjpcIiVzXCJ9IiwgbmFtZSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0Fub3RoZXJBcnJheVRlc3RCZWFuLmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0Fub3RoZXJBcnJheVRlc3RCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRhYTY2MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvQW5vdGhlckFycmF5VGVzdEJlYW4uamF2YQpAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHk7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5Gb3JtYXR0ZXI7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC5qc29uLmJpbmQuYW5ub3RhdGlvbi5Kc29uYlRyYW5zaWVudDsKK2ltcG9ydCBqYXZheC5qc29uLmJpbmQuYW5ub3RhdGlvbi5Kc29uYlZpc2liaWxpdHk7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUcmFuc2llbnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5Kc29uVGVzdEhlbHBlcjsKKworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiIsICJTaW1wbGlmaWFibGVJZlN0YXRlbWVudCIsICJTdHJpbmdFcXVhbGl0eSJ9KQorQFhtbFJvb3RFbGVtZW50KCkKK0BKc29uYlZpc2liaWxpdHkoQ3VzdG9tSnNvbmJWaXNpYmlsaXR5U3RyYXRlZ3kuY2xhc3MpCitwdWJsaWMgY2xhc3MgQW5vdGhlckFycmF5VGVzdEJlYW4geworCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlVGVzdEluc3RhbmNlKCkgeworICAgICAgICBBbm90aGVyQXJyYXlUZXN0QmVhbiBvbmUgPSBuZXcgQW5vdGhlckFycmF5VGVzdEJlYW4oKTsKKyAgICAgICAgQW5vdGhlckNhdCBjMSA9IG5ldyBBbm90aGVyQ2F0KCJGb28iLCAiS2l0dHkiKTsKKyAgICAgICAgb25lLmFkZENhdChjMSk7CisgICAgICAgIEFub3RoZXJDYXQgYzIgPSBuZXcgQW5vdGhlckNhdCgiQmFyIiwgIlB1c3MiKTsKKyAgICAgICAgb25lLmFkZENhdChjMik7CisKKyAgICAgICAgb25lLnNldFByb3AoInRlc3RQcm9wIik7CisKKyAgICAgICAgcmV0dXJuIG9uZTsKKyAgICB9CisKKyAgICBAWG1sRWxlbWVudChyZXF1aXJlZCA9IHRydWUpCisgICAgcHJvdGVjdGVkIExpc3Q8QW5vdGhlckNhdD4gY2F0czsKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHByb3A7CisKKyAgICBwdWJsaWMgQW5vdGhlckFycmF5VGVzdEJlYW4oKSB7CisgICAgICAgIHRoaXMuY2F0cyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENhdHMoTGlzdDxBbm90aGVyQ2F0PiBjYXRzKSB7CisgICAgICAgIHRoaXMuY2F0cyA9IGNhdHM7CisgICAgfQorCisgICAgQEpzb25iVHJhbnNpZW50CisgICAgQFhtbFRyYW5zaWVudAorICAgIHB1YmxpYyBMaXN0PEFub3RoZXJDYXQ+IGdldFRoZUNhdHMoKSB7CisgICAgICAgIHJldHVybiB0aGlzLmNhdHM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkQ2F0KEFub3RoZXJDYXQgYykgeworICAgICAgICB0aGlzLmNhdHMuYWRkKGMpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcCgpIHsKKyAgICAgICAgcmV0dXJuIHByb3A7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UHJvcChTdHJpbmcgcHJvcCkgeworICAgICAgICB0aGlzLnByb3AgPSBwcm9wOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgQW5vdGhlckFycmF5VGVzdEJlYW4gb3RoZXIgPSAoQW5vdGhlckFycmF5VGVzdEJlYW4pIG9iajsKKyAgICAgICAgaWYgKHRoaXMucHJvcCAhPSBvdGhlci5wcm9wICYmICh0aGlzLnByb3AgPT0gbnVsbCB8fCAhdGhpcy5wcm9wLmVxdWFscyhvdGhlci5wcm9wKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gSnNvblRlc3RIZWxwZXIuYXJlQ29sbGVjdGlvbnNFcXVhbChjYXRzLCBvdGhlci5jYXRzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IDU7CisgICAgICAgIGhhc2ggPSA3OSAqIGhhc2ggKyAodGhpcy5wcm9wICE9IG51bGwgPyB0aGlzLnByb3AuaGFzaENvZGUoKSA6IDApOworICAgICAgICBoYXNoID0gNzkgKiBoYXNoICsgKHRoaXMuY2F0cyAhPSBudWxsID8gdGhpcy5jYXRzLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIChuZXcgRm9ybWF0dGVyKCkpLmZvcm1hdCgiQUFUQihhPSVzLCBjZD0lcykiLCBwcm9wLCBjYXRzKS50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvQW5vdGhlckNhdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Bbm90aGVyQ2F0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QyNjBlYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvQW5vdGhlckNhdC5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5OworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworLyoqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAU3VwcHJlc3NXYXJuaW5ncygiVW51c2VkRGVjbGFyYXRpb24iKQorQFhtbFJvb3RFbGVtZW50KG5hbWUgPSAiY2F0IikKK3B1YmxpYyBjbGFzcyBBbm90aGVyQ2F0IGV4dGVuZHMgQW5vdGhlckFuaW1hbCB7CisKKyAgICBwcml2YXRlIFN0cmluZyBuaWNrTmFtZTsKKworICAgIHB1YmxpYyBBbm90aGVyQ2F0KCkgeworICAgIH0KKworICAgIHB1YmxpYyBBbm90aGVyQ2F0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBBbm90aGVyQ2F0KFN0cmluZyBuYW1lLCBTdHJpbmcgbmlja05hbWUpIHsKKyAgICAgICAgc3VwZXIobmFtZSk7CisgICAgICAgIHRoaXMubmlja05hbWUgPSBuaWNrTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROaWNrTmFtZShTdHJpbmcgbmlja05hbWUpIHsKKyAgICAgICAgdGhpcy5uaWNrTmFtZSA9IG5pY2tOYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Tmlja05hbWUoKSB7CisgICAgICAgIHJldHVybiB0aGlzLm5pY2tOYW1lOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJ7IFwiY2F0XCIgOiAlcyAsICVzfSIsIHN1cGVyLnRvU3RyaW5nKCksIHRoaXMubmlja05hbWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvQXR0ckFuZENoYXJEYXRhQmVhbi5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9BdHRyQW5kQ2hhckRhdGFCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM5Y2JmNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvQXR0ckFuZENoYXJEYXRhQmVhbi5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5OworCitpbXBvcnQgamF2YS51dGlsLkZvcm1hdHRlcjsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxWYWx1ZTsKKworLyoqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAU3VwcHJlc3NXYXJuaW5ncyh7IlN0cmluZ0VxdWFsaXR5IiwgIlJlZHVuZGFudElmU3RhdGVtZW50In0pCitAWG1sUm9vdEVsZW1lbnQobmFtZSA9ICJwYXJlbnQiKQorcHVibGljIGNsYXNzIEF0dHJBbmRDaGFyRGF0YUJlYW4geworCisgICAgQFhtbEF0dHJpYnV0ZQorICAgIHB1YmxpYyBTdHJpbmcgYXR0cjsKKyAgICBAWG1sVmFsdWUKKyAgICBwdWJsaWMgU3RyaW5nIHZhbHVlOworCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlVGVzdEluc3RhbmNlKCkgeworICAgICAgICBBdHRyQW5kQ2hhckRhdGFCZWFuIGluc3RhbmNlID0gbmV3IEF0dHJBbmRDaGFyRGF0YUJlYW4oKTsKKyAgICAgICAgaW5zdGFuY2UuYXR0ciA9ICJhdmFsIjsKKyAgICAgICAgaW5zdGFuY2UudmFsdWUgPSAicHZhbCI7CisgICAgICAgIHJldHVybiBpbnN0YW5jZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIEF0dHJBbmRDaGFyRGF0YUJlYW4gb3RoZXIgPSAoQXR0ckFuZENoYXJEYXRhQmVhbikgb2JqOworICAgICAgICBpZiAodGhpcy5hdHRyICE9IG90aGVyLmF0dHIgJiYgKHRoaXMuYXR0ciA9PSBudWxsIHx8ICF0aGlzLmF0dHIuZXF1YWxzKG90aGVyLmF0dHIpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLnZhbHVlICE9IG90aGVyLnZhbHVlICYmICh0aGlzLnZhbHVlID09IG51bGwgfHwgIXRoaXMudmFsdWUuZXF1YWxzKG90aGVyLnZhbHVlKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IDU7CisgICAgICAgIGhhc2ggPSA3OSAqIGhhc2ggKyAodGhpcy5hdHRyICE9IG51bGwgPyB0aGlzLmF0dHIuaGFzaENvZGUoKSA6IDApOworICAgICAgICBoYXNoID0gNzkgKiBoYXNoICsgKHRoaXMudmFsdWUgIT0gbnVsbCA/IHRoaXMudmFsdWUuaGFzaENvZGUoKSA6IDApOworICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gKG5ldyBGb3JtYXR0ZXIoKSkuZm9ybWF0KCJBQ0QoYT0lcywgY2Q9JXMpIiwgYXR0ciwgdmFsdWUpLnRvU3RyaW5nKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0NhdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9DYXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTYyZThiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9DYXQuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eTsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFN1cHByZXNzV2FybmluZ3MoIlVudXNlZERlY2xhcmF0aW9uIikKK0BYbWxSb290RWxlbWVudChuYW1lID0gImNhdCIpCitwdWJsaWMgY2xhc3MgQ2F0IGV4dGVuZHMgQW5pbWFsIHsKKworICAgIHByaXZhdGUgU3RyaW5nIG5pY2tOYW1lOworCisgICAgcHVibGljIENhdCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgQ2F0KGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIHB1YmxpYyBDYXQoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyBuaWNrTmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICAgICAgdGhpcy5uaWNrTmFtZSA9IG5pY2tOYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5pY2tOYW1lKGZpbmFsIFN0cmluZyBuaWNrTmFtZSkgeworICAgICAgICB0aGlzLm5pY2tOYW1lID0gbmlja05hbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROaWNrTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMubmlja05hbWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoInsgXCJjYXRcIiA6ICVzICwgJXN9Iiwgc3VwZXIudG9TdHJpbmcoKSwgdGhpcy5uaWNrTmFtZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Db2xvci5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Db2xvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MjcyYzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0NvbG9yLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHk7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBlbnVtIENvbG9yIHsKKyAgICBSRUQsCisgICAgR1JFRU4sCisgICAgQkxVRQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Db2xvckhvbGRlci5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Db2xvckhvbGRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZTVjZmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0NvbG9ySG9sZGVyLmphdmEKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHk7CisKK2ltcG9ydCBqYXZhLnV0aWwuRm9ybWF0dGVyOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uSnNvblRlc3RIZWxwZXI7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJVbnVzZWREZWNsYXJhdGlvbiIpCitAWG1sUm9vdEVsZW1lbnQKK3B1YmxpYyBjbGFzcyBDb2xvckhvbGRlciB7CisKKyAgICBwcml2YXRlIFNldDxDb2xvcj4gY29sb3JzOworCisgICAgcHVibGljIENvbG9ySG9sZGVyKCkgeworICAgIH0KKworICAgIHB1YmxpYyBDb2xvckhvbGRlcihmaW5hbCBTZXQ8Q29sb3I+IGNvbG9ycykgeworICAgICAgICB0aGlzLmNvbG9ycyA9IGNvbG9yczsKKyAgICB9CisKKyAgICBwdWJsaWMgU2V0PENvbG9yPiBnZXRDb2xvcnMoKSB7CisgICAgICAgIHJldHVybiBjb2xvcnM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Q29sb3JzKGZpbmFsIFNldDxDb2xvcj4gY29sb3JzKSB7CisgICAgICAgIHRoaXMuY29sb3JzID0gY29sb3JzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIENvbG9ySG9sZGVyKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgQ29sb3JIb2xkZXIgb3RoZXIgPSAoQ29sb3JIb2xkZXIpIG9iajsKKworICAgICAgICByZXR1cm4gSnNvblRlc3RIZWxwZXIuYXJlQ29sbGVjdGlvbnNFcXVhbCh0aGlzLmNvbG9ycywgb3RoZXIuY29sb3JzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gY29sb3JzID09IG51bGwgPyBzdXBlci5oYXNoQ29kZSgpIDogMTkgKiBjb2xvcnMuaGFzaENvZGUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gbmV3IEZvcm1hdHRlcigpLmZvcm1hdCgiQ0goJXMpIiwgY29sb3JzKS50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlcy5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZiYjQxZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlcy5qYXZhCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eTsKKworaW1wb3J0IGphdmEudXRpbC5Gb3JtYXR0ZXI7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC5qc29uLmJpbmQuYW5ub3RhdGlvbi5Kc29uYlZpc2liaWxpdHk7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5Kc29uVGVzdEhlbHBlcjsKKworLyoqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAU3VwcHJlc3NXYXJuaW5ncyh7IlN0cmluZ0VxdWFsaXR5IiwgIlJlZHVuZGFudElmU3RhdGVtZW50In0pCitAWG1sUm9vdEVsZW1lbnQKK0BKc29uYlZpc2liaWxpdHkoQ3VzdG9tSnNvbmJWaXNpYmlsaXR5U3RyYXRlZ3kuY2xhc3MpCitwdWJsaWMgY2xhc3MgQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlcyB7CisKKyAgICBAWG1sQXR0cmlidXRlCisgICAgcHVibGljIFN0cmluZyBhMTsKKyAgICBAWG1sQXR0cmlidXRlCisgICAgcHVibGljIGludCBhMjsKKyAgICBAWG1sRWxlbWVudAorICAgIHB1YmxpYyBTdHJpbmcgZmlsbGVyMTsKKyAgICBAWG1sRWxlbWVudAorICAgIHB1YmxpYyBMaXN0PFNpbXBsZUJlYW5XaXRoQXR0cmlidXRlcz4gbGlzdDsKKyAgICBAWG1sRWxlbWVudAorICAgIHB1YmxpYyBTdHJpbmcgZmlsbGVyMjsKKyAgICBAWG1sRWxlbWVudAorICAgIFNpbXBsZUJlYW5XaXRoQXR0cmlidXRlcyBiOworCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlVGVzdEluc3RhbmNlKCkgeworICAgICAgICBDb21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzIGluc3RhbmNlID0gbmV3IENvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMoKTsKKyAgICAgICAgaW5zdGFuY2UuYTEgPSAiaGVsbG8gZG9sbHkiOworICAgICAgICBpbnN0YW5jZS5hMiA9IDMxNDE1OTI2OworICAgICAgICBpbnN0YW5jZS5maWxsZXIxID0gIjExMSI7CisgICAgICAgIGluc3RhbmNlLmZpbGxlcjIgPSAiMjIyIjsKKyAgICAgICAgaW5zdGFuY2UuYiA9IEpzb25UZXN0SGVscGVyLmNyZWF0ZVRlc3RJbnN0YW5jZShTaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXMuY2xhc3MpOworICAgICAgICBpbnN0YW5jZS5saXN0ID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgICAgICBpbnN0YW5jZS5saXN0LmFkZChKc29uVGVzdEhlbHBlci5jcmVhdGVUZXN0SW5zdGFuY2UoU2ltcGxlQmVhbldpdGhBdHRyaWJ1dGVzLmNsYXNzKSk7CisgICAgICAgIGluc3RhbmNlLmxpc3QuYWRkKEpzb25UZXN0SGVscGVyLmNyZWF0ZVRlc3RJbnN0YW5jZShTaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXMuY2xhc3MpKTsKKyAgICAgICAgcmV0dXJuIGluc3RhbmNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIENvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlcyBvdGhlciA9IChDb21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzKSBvYmo7CisgICAgICAgIGlmICh0aGlzLmExICE9IG90aGVyLmExICYmICh0aGlzLmExID09IG51bGwgfHwgIXRoaXMuYTEuZXF1YWxzKG90aGVyLmExKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5hMiAhPSBvdGhlci5hMikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLmIgIT0gb3RoZXIuYiAmJiAodGhpcy5iID09IG51bGwgfHwgIXRoaXMuYi5lcXVhbHMob3RoZXIuYikpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMuZmlsbGVyMSAhPSBvdGhlci5maWxsZXIxICYmICh0aGlzLmZpbGxlcjEgPT0gbnVsbCB8fCAhdGhpcy5maWxsZXIxLmVxdWFscyhvdGhlci5maWxsZXIxKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5maWxsZXIyICE9IG90aGVyLmZpbGxlcjIgJiYgKHRoaXMuZmlsbGVyMiA9PSBudWxsIHx8ICF0aGlzLmZpbGxlcjIuZXF1YWxzKG90aGVyLmZpbGxlcjIpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLmxpc3QgIT0gb3RoZXIubGlzdCAmJiAodGhpcy5saXN0ID09IG51bGwgfHwgIXRoaXMubGlzdC5lcXVhbHMob3RoZXIubGlzdCkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGhhc2ggPSAzOworICAgICAgICBoYXNoID0gMTkgKiBoYXNoICsgKHRoaXMuYTEgIT0gbnVsbCA/IHRoaXMuYTEuaGFzaENvZGUoKSA6IDApOworICAgICAgICBoYXNoID0gMTkgKiBoYXNoICsgdGhpcy5hMjsKKyAgICAgICAgaGFzaCA9IDE5ICogaGFzaCArICh0aGlzLmIgIT0gbnVsbCA/IHRoaXMuYi5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIGhhc2ggPSAxOSAqIGhhc2ggKyAodGhpcy5maWxsZXIxICE9IG51bGwgPyB0aGlzLmZpbGxlcjEuaGFzaENvZGUoKSA6IDApOworICAgICAgICBoYXNoID0gMTkgKiBoYXNoICsgKHRoaXMuZmlsbGVyMiAhPSBudWxsID8gdGhpcy5maWxsZXIyLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgaGFzaCA9IDE5ICogaGFzaCArICh0aGlzLmxpc3QgIT0gbnVsbCA/IHRoaXMubGlzdC5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIHJldHVybiBoYXNoOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAobmV3IEZvcm1hdHRlcigpKS5mb3JtYXQoIkNCV0EoJXMsJWQsJXMpIiwgYTEsIGEyLCBiKS50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczIuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjQ3Y2E3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMi5qYXZhCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eTsKKworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXguanNvbi5iaW5kLmFubm90YXRpb24uSnNvbmJWaXNpYmlsaXR5OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uSnNvblRlc3RIZWxwZXI7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFN1cHByZXNzV2FybmluZ3MoIlN0cmluZ0VxdWFsaXR5IikKK0BYbWxSb290RWxlbWVudAorQEpzb25iVmlzaWJpbGl0eShDdXN0b21Kc29uYlZpc2liaWxpdHlTdHJhdGVneS5jbGFzcykKK3B1YmxpYyBjbGFzcyBDb21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMiB7CisKKyAgICBAWG1sQXR0cmlidXRlCisgICAgcHVibGljIFN0cmluZyBhMTsKKyAgICBAWG1sQXR0cmlidXRlCisgICAgcHVibGljIGludCBhMjsKKyAgICBAWG1sRWxlbWVudAorICAgIHB1YmxpYyBTdHJpbmcgZmlsbGVyMTsKKyAgICBAWG1sRWxlbWVudAorICAgIHB1YmxpYyBMaXN0PFNpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZT4gbGlzdDsKKyAgICBAWG1sRWxlbWVudAorICAgIHB1YmxpYyBTdHJpbmcgZmlsbGVyMjsKKyAgICBAWG1sRWxlbWVudAorICAgIFNpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZSBiOworCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlVGVzdEluc3RhbmNlKCkgeworICAgICAgICBDb21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMiBpbnN0YW5jZSA9IG5ldyBDb21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMigpOworICAgICAgICBpbnN0YW5jZS5hMSA9ICJoZWxsbyBkb2xseSI7CisgICAgICAgIGluc3RhbmNlLmEyID0gMzE0MTU5MjY7CisgICAgICAgIGluc3RhbmNlLmZpbGxlcjEgPSAiMTExIjsKKyAgICAgICAgaW5zdGFuY2UuZmlsbGVyMiA9ICIyMjIiOworICAgICAgICBpbnN0YW5jZS5iID0gSnNvblRlc3RIZWxwZXIuY3JlYXRlVGVzdEluc3RhbmNlKFNpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZS5jbGFzcyk7CisgICAgICAgIGluc3RhbmNlLmxpc3QgPSBuZXcgTGlua2VkTGlzdDxTaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGU+KCk7CisgICAgICAgIGluc3RhbmNlLmxpc3QuYWRkKEpzb25UZXN0SGVscGVyLmNyZWF0ZVRlc3RJbnN0YW5jZShTaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGUuY2xhc3MpKTsKKyAgICAgICAgaW5zdGFuY2UubGlzdC5hZGQoSnNvblRlc3RIZWxwZXIuY3JlYXRlVGVzdEluc3RhbmNlKFNpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZS5jbGFzcykpOworICAgICAgICByZXR1cm4gaW5zdGFuY2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczIpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczIgb3RoZXIgPSAoQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczIpIG9iajsKKyAgICAgICAgaWYgKHRoaXMuYTEgIT0gb3RoZXIuYTEgJiYgKHRoaXMuYTEgPT0gbnVsbCB8fCAhdGhpcy5hMS5lcXVhbHMob3RoZXIuYTEpKSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJhMSBkaWZmZXJzIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMuYTIgIT0gb3RoZXIuYTIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiYTIgZGlmZmVycyIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLmIgIT0gb3RoZXIuYiAmJiAodGhpcy5iID09IG51bGwgfHwgIXRoaXMuYi5lcXVhbHMob3RoZXIuYikpKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImIgZGlmZmVycyIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLmZpbGxlcjEgIT0gb3RoZXIuZmlsbGVyMSAmJiAodGhpcy5maWxsZXIxID09IG51bGwgfHwgIXRoaXMuZmlsbGVyMS5lcXVhbHMob3RoZXIuZmlsbGVyMSkpKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImYxIGRpZmZlcnMiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5maWxsZXIyICE9IG90aGVyLmZpbGxlcjIgJiYgKHRoaXMuZmlsbGVyMiA9PSBudWxsIHx8ICF0aGlzLmZpbGxlcjIuZXF1YWxzKG90aGVyLmZpbGxlcjIpKSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJmMiBkaWZmZXJzIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMubGlzdCAhPSBvdGhlci5saXN0ICYmICh0aGlzLmxpc3QgPT0gbnVsbCB8fCAhdGhpcy5saXN0LmVxdWFscyhvdGhlci5saXN0KSkpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibGlzdCBkaWZmZXJzIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGhhc2ggPSAzOworICAgICAgICBoYXNoID0gMTkgKiBoYXNoICsgKHRoaXMuYTEgIT0gbnVsbCA/IHRoaXMuYTEuaGFzaENvZGUoKSA6IDApOworICAgICAgICBoYXNoID0gMTkgKiBoYXNoICsgdGhpcy5hMjsKKyAgICAgICAgaGFzaCA9IDE5ICogaGFzaCArICh0aGlzLmIgIT0gbnVsbCA/IHRoaXMuYi5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIGhhc2ggPSAxOSAqIGhhc2ggKyAodGhpcy5maWxsZXIxICE9IG51bGwgPyB0aGlzLmZpbGxlcjEuaGFzaENvZGUoKSA6IDApOworICAgICAgICBoYXNoID0gMTkgKiBoYXNoICsgKHRoaXMuZmlsbGVyMiAhPSBudWxsID8gdGhpcy5maWxsZXIyLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgaGFzaCA9IDE5ICogaGFzaCArICh0aGlzLmxpc3QgIT0gbnVsbCA/IHRoaXMubGlzdC5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIHJldHVybiBoYXNoOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJDQldBMiglcywlZCwlcywlcykiLCBhMSwgYTIsIGIsIGxpc3RBc1N0cmluZygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBsaXN0QXNTdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAobGlzdCAhPSBudWxsKSA/IGxpc3QudG9TdHJpbmcoKSA6IG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMy5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3YjY3NzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMzLmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHk7CisKK2ltcG9ydCBqYXZheC5qc29uLmJpbmQuYW5ub3RhdGlvbi5Kc29uYlZpc2liaWxpdHk7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5Kc29uVGVzdEhlbHBlcjsKKworLyoqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAWG1sUm9vdEVsZW1lbnQKK0BKc29uYlZpc2liaWxpdHkoQ3VzdG9tSnNvbmJWaXNpYmlsaXR5U3RyYXRlZ3kuY2xhc3MpCitwdWJsaWMgY2xhc3MgQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczMgeworCisgICAgQFhtbEVsZW1lbnQKKyAgICBTaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGUgYiwgYzsKKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVRlc3RJbnN0YW5jZSgpIHsKKyAgICAgICAgQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczMgaW5zdGFuY2UgPSBuZXcgQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczMoKTsKKyAgICAgICAgaW5zdGFuY2UuYiA9IEpzb25UZXN0SGVscGVyLmNyZWF0ZVRlc3RJbnN0YW5jZShTaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGUuY2xhc3MpOworICAgICAgICBpbnN0YW5jZS5jID0gSnNvblRlc3RIZWxwZXIuY3JlYXRlVGVzdEluc3RhbmNlKFNpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZS5jbGFzcyk7CisgICAgICAgIHJldHVybiBpbnN0YW5jZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBDb21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMykpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBDb21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMyBvdGhlciA9IChDb21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMykgb2JqOworICAgICAgICBpZiAodGhpcy5iICE9IG90aGVyLmIgJiYgKHRoaXMuYiA9PSBudWxsIHx8ICF0aGlzLmIuZXF1YWxzKG90aGVyLmIpKSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJiIGRpZmZlcnMiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5jICE9IG90aGVyLmMgJiYgKHRoaXMuYyA9PSBudWxsIHx8ICF0aGlzLmMuZXF1YWxzKG90aGVyLmMpKSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJjIGRpZmZlcnMiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IDM7CisgICAgICAgIGhhc2ggPSAxOSAqIGhhc2ggKyAodGhpcy5iICE9IG51bGwgPyB0aGlzLmIuaGFzaENvZGUoKSA6IDApOworICAgICAgICBoYXNoID0gMTkgKiBoYXNoICsgKHRoaXMuYyAhPSBudWxsID8gdGhpcy5jLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIkNCV0EyKCVzLCVzKSIsIGIsIGMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczQuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTY3NGQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzNC5qYXZhCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eTsKKworaW1wb3J0IGphdmEudXRpbC5Gb3JtYXR0ZXI7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC5qc29uLmJpbmQuYW5ub3RhdGlvbi5Kc29uYlZpc2liaWxpdHk7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5Kc29uVGVzdEhlbHBlcjsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFN1cHByZXNzV2FybmluZ3MoeyJTdHJpbmdFcXVhbGl0eSIsICJSZWR1bmRhbnRJZlN0YXRlbWVudCIsICJOdW1iZXJFcXVhbGl0eSJ9KQorQFhtbFJvb3RFbGVtZW50CitASnNvbmJWaXNpYmlsaXR5KEN1c3RvbUpzb25iVmlzaWJpbGl0eVN0cmF0ZWd5LmNsYXNzKQorcHVibGljIGNsYXNzIENvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXM0IHsKKworICAgIEBYbWxBdHRyaWJ1dGUKKyAgICBwdWJsaWMgU3RyaW5nIGExOworICAgIEBYbWxBdHRyaWJ1dGUKKyAgICBwdWJsaWMgSW50ZWdlciBhMjsKKyAgICBAWG1sRWxlbWVudAorICAgIHB1YmxpYyBTdHJpbmcgZmlsbGVyMTsKKyAgICBAWG1sRWxlbWVudAorICAgIHB1YmxpYyBMaXN0PFNpbXBsZUJlYW5XaXRoT2JqZWN0QXR0cmlidXRlcz4gbGlzdDsKKyAgICBAWG1sRWxlbWVudAorICAgIHB1YmxpYyBTdHJpbmcgZmlsbGVyMjsKKyAgICBAWG1sRWxlbWVudAorICAgIFNpbXBsZUJlYW5XaXRoT2JqZWN0QXR0cmlidXRlcyBiOworCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlVGVzdEluc3RhbmNlKCkgeworICAgICAgICBDb21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzNCBpbnN0YW5jZSA9IG5ldyBDb21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzNCgpOworICAgICAgICBpbnN0YW5jZS5iID0gbmV3IFNpbXBsZUJlYW5XaXRoT2JqZWN0QXR0cmlidXRlcygpOworICAgICAgICBpbnN0YW5jZS5saXN0ID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgICAgICByZXR1cm4gaW5zdGFuY2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczQpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczQgb3RoZXIgPSAoQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczQpIG9iajsKKyAgICAgICAgaWYgKHRoaXMuYTEgIT0gb3RoZXIuYTEgJiYgKHRoaXMuYTEgPT0gbnVsbCB8fCAhdGhpcy5hMS5lcXVhbHMob3RoZXIuYTEpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLmEyICE9IG90aGVyLmEyICYmICh0aGlzLmEyID09IG51bGwgfHwgIXRoaXMuYTIuZXF1YWxzKG90aGVyLmEyKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5iICE9IG90aGVyLmIgJiYgKHRoaXMuYiA9PSBudWxsIHx8ICF0aGlzLmIuZXF1YWxzKG90aGVyLmIpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLmZpbGxlcjEgIT0gb3RoZXIuZmlsbGVyMSAmJiAodGhpcy5maWxsZXIxID09IG51bGwgfHwgIXRoaXMuZmlsbGVyMS5lcXVhbHMob3RoZXIuZmlsbGVyMSkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMuZmlsbGVyMiAhPSBvdGhlci5maWxsZXIyICYmICh0aGlzLmZpbGxlcjIgPT0gbnVsbCB8fCAhdGhpcy5maWxsZXIyLmVxdWFscyhvdGhlci5maWxsZXIyKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUpzb25UZXN0SGVscGVyLmFyZUNvbGxlY3Rpb25zRXF1YWwodGhpcy5saXN0LCBvdGhlci5saXN0KSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCBoYXNoID0gMzsKKyAgICAgICAgaGFzaCA9IDE5ICogaGFzaCArICh0aGlzLmExICE9IG51bGwgPyB0aGlzLmExLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgaGFzaCA9IDE5ICogaGFzaCArIHRoaXMuYTI7CisgICAgICAgIGhhc2ggPSAxOSAqIGhhc2ggKyAodGhpcy5iICE9IG51bGwgPyB0aGlzLmIuaGFzaENvZGUoKSA6IDApOworICAgICAgICBoYXNoID0gMTkgKiBoYXNoICsgKHRoaXMuZmlsbGVyMSAhPSBudWxsID8gdGhpcy5maWxsZXIxLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgaGFzaCA9IDE5ICogaGFzaCArICh0aGlzLmZpbGxlcjIgIT0gbnVsbCA/IHRoaXMuZmlsbGVyMi5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIGhhc2ggPSAxOSAqIGhhc2ggKyAodGhpcy5saXN0ICE9IG51bGwgPyB0aGlzLmxpc3QuaGFzaENvZGUoKSA6IDApOworICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gKG5ldyBGb3JtYXR0ZXIoKSkuZm9ybWF0KCJDQldBNCglcywgJWQsICVzKSIsIGExLCBhMiwgYikudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0N1c3RvbUpzb25iVmlzaWJpbGl0eVN0cmF0ZWd5LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0N1c3RvbUpzb25iVmlzaWJpbGl0eVN0cmF0ZWd5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ2NTMyZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvQ3VzdG9tSnNvbmJWaXNpYmlsaXR5U3RyYXRlZ3kuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eTsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKKworaW1wb3J0IGphdmF4Lmpzb24uYmluZC5jb25maWcuUHJvcGVydHlWaXNpYmlsaXR5U3RyYXRlZ3k7CisKKy8qKgorICogQ3VzdG9tLCBwZXJtaXNzaXZlIHtAbGluayBQcm9wZXJ0eVZpc2liaWxpdHlTdHJhdGVneX0uCisgKiA8cD4KKyAqIFVzZWQgdG8gYWxsb3cgSlNPTi1CIHByb3ZpZGVyIHRvICJzZWUiIHByb3RlY3RlZC9wcml2YXRlIGZpZWxkcyBmb3IgdGVzdCBwdXJwb3Nlcy4KKyAqLworcHVibGljIGNsYXNzIEN1c3RvbUpzb25iVmlzaWJpbGl0eVN0cmF0ZWd5IGltcGxlbWVudHMgUHJvcGVydHlWaXNpYmlsaXR5U3RyYXRlZ3kgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKEZpZWxkIGZpZWxkKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzVmlzaWJsZShNZXRob2QgbWV0aG9kKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvRG9nLmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0RvZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZTI2MzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0RvZy5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5OworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworLyoqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAU3VwcHJlc3NXYXJuaW5ncygiVW51c2VkRGVjbGFyYXRpb24iKQorQFhtbFJvb3RFbGVtZW50KG5hbWUgPSAiZG9nIikKK3B1YmxpYyBjbGFzcyBEb2cgZXh0ZW5kcyBBbmltYWwgeworCisgICAgcHVibGljIERvZygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgRG9nKGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJ7IFwiZG9nXCIgOiAlcyB9Iiwgc3VwZXIudG9TdHJpbmcoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9FbXB0eUVsZW1lbnRCZWFuLmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0VtcHR5RWxlbWVudEJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGMyMWU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9FbXB0eUVsZW1lbnRCZWFuLmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHk7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCisvKioKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJSZWR1bmRhbnRJZlN0YXRlbWVudCIpCitAWG1sUm9vdEVsZW1lbnQKK3B1YmxpYyBjbGFzcyBFbXB0eUVsZW1lbnRCZWFuIHsKKworICAgIHB1YmxpYyBTdHJpbmcgbnVsbE9ubHkgPSBudWxsOworCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlVGVzdEluc3RhbmNlKCkgeworICAgICAgICBFbXB0eUVsZW1lbnRCZWFuIHJlc3VsdCA9IG5ldyBFbXB0eUVsZW1lbnRCZWFuKCk7CisgICAgICAgIHJlc3VsdC5udWxsT25seSA9IG51bGw7CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIEVtcHR5RWxlbWVudEJlYW4gb3RoZXIgPSAoRW1wdHlFbGVtZW50QmVhbikgb2JqOworICAgICAgICBpZiAoKHRoaXMubnVsbE9ubHkgPT0gbnVsbCkgPyAob3RoZXIubnVsbE9ubHkgIT0gbnVsbCkgOiAhdGhpcy5udWxsT25seS5lcXVhbHMob3RoZXIubnVsbE9ubHkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGhhc2ggPSAzOworICAgICAgICBoYXNoID0gMTMgKiBoYXNoICsgKHRoaXMubnVsbE9ubHkgIT0gbnVsbCA/IHRoaXMubnVsbE9ubHkuaGFzaENvZGUoKSA6IDApOworICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgie251bGxPbmx5OiVzfSIsIG51bGxPbmx5KTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvRW1wdHlFbGVtZW50Q29udGFpbmluZ0JlYW4uamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvRW1wdHlFbGVtZW50Q29udGFpbmluZ0JlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTBjMjgwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9FbXB0eUVsZW1lbnRDb250YWluaW5nQmVhbi5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5OworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworLyoqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAU3VwcHJlc3NXYXJuaW5ncygiUmVkdW5kYW50SWZTdGF0ZW1lbnQiKQorQFhtbFJvb3RFbGVtZW50CitwdWJsaWMgY2xhc3MgRW1wdHlFbGVtZW50Q29udGFpbmluZ0JlYW4geworCisgICAgcHVibGljIEVtcHR5RWxlbWVudEJlYW4gZW1wdHlCZWFuOworICAgIHB1YmxpYyBTdHJpbmcgYzsKKyAgICBwdWJsaWMgU3RyaW5nIGQ7CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVUZXN0SW5zdGFuY2UoKSB7CisgICAgICAgIEVtcHR5RWxlbWVudENvbnRhaW5pbmdCZWFuIHJlc3VsdCA9IG5ldyBFbXB0eUVsZW1lbnRDb250YWluaW5nQmVhbigpOworICAgICAgICByZXN1bHQuYyA9ICJmb28iOworICAgICAgICByZXN1bHQuZCA9ICJiYXIiOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgRW1wdHlFbGVtZW50Q29udGFpbmluZ0JlYW4gb3RoZXIgPSAoRW1wdHlFbGVtZW50Q29udGFpbmluZ0JlYW4pIG9iajsKKyAgICAgICAgaWYgKHRoaXMuZW1wdHlCZWFuICE9IG90aGVyLmVtcHR5QmVhbiAmJiAodGhpcy5lbXB0eUJlYW4gPT0gbnVsbCB8fCAhdGhpcy5lbXB0eUJlYW4uZXF1YWxzKG90aGVyLmVtcHR5QmVhbikpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh0aGlzLmMgPT0gbnVsbCkgPyAob3RoZXIuYyAhPSBudWxsKSA6ICF0aGlzLmMuZXF1YWxzKG90aGVyLmMpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh0aGlzLmQgPT0gbnVsbCkgPyAob3RoZXIuZCAhPSBudWxsKSA6ICF0aGlzLmQuZXF1YWxzKG90aGVyLmQpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGhhc2ggPSAzOworICAgICAgICBoYXNoID0gNTkgKiBoYXNoICsgKHRoaXMuZW1wdHlCZWFuICE9IG51bGwgPyB0aGlzLmVtcHR5QmVhbi5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIGhhc2ggPSA1OSAqIGhhc2ggKyAodGhpcy5jICE9IG51bGwgPyB0aGlzLmMuaGFzaENvZGUoKSA6IDApOworICAgICAgICBoYXNoID0gNTkgKiBoYXNoICsgKHRoaXMuZCAhPSBudWxsID8gdGhpcy5kLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIntjOiVzLGQ6JXN9IiwgYywgZCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0VuY29kZWRDb250ZW50QmVhbi5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9FbmNvZGVkQ29udGVudEJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGZlZWU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9FbmNvZGVkQ29udGVudEJlYW4uamF2YQpAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eTsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFN1cHByZXNzV2FybmluZ3MoeyJSZWR1bmRhbnRJZlN0YXRlbWVudCIsICJTdHJpbmdFcXVhbGl0eSJ9KQorQFhtbFJvb3RFbGVtZW50CitwdWJsaWMgY2xhc3MgRW5jb2RlZENvbnRlbnRCZWFuIHsKKworICAgIHB1YmxpYyBTdHJpbmcgb25lOworICAgIHB1YmxpYyBTdHJpbmcgdHdvOworCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlVGVzdEluc3RhbmNlKCkgeworICAgICAgICBFbmNvZGVkQ29udGVudEJlYW4gaW5zdGFuY2UgPSBuZXcgRW5jb2RlZENvbnRlbnRCZWFuKCk7CisgICAgICAgIGluc3RhbmNlLm9uZSA9ICJcdG9uZVxuXHRiaWciOworICAgICAgICBpbnN0YW5jZS50d28gPSAiaGFmXHUwMTBDIjsKKyAgICAgICAgcmV0dXJuIGluc3RhbmNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgRW5jb2RlZENvbnRlbnRCZWFuIG90aGVyID0gKEVuY29kZWRDb250ZW50QmVhbikgb2JqOworICAgICAgICBpZiAodGhpcy5vbmUgIT0gb3RoZXIub25lICYmICh0aGlzLm9uZSA9PSBudWxsIHx8ICF0aGlzLm9uZS5lcXVhbHMob3RoZXIub25lKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy50d28gIT0gb3RoZXIudHdvICYmICh0aGlzLnR3byA9PSBudWxsIHx8ICF0aGlzLnR3by5lcXVhbHMob3RoZXIudHdvKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IDU7CisgICAgICAgIGhhc2ggPSAxNyAqIGhhc2ggKyAodGhpcy5vbmUgIT0gbnVsbCA/IHRoaXMub25lLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgaGFzaCA9IDE3ICogaGFzaCArICh0aGlzLnR3byAhPSBudWxsID8gdGhpcy50d28uaGFzaENvZGUoKSA6IDApOworICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiRUNCKCVzLCAlcykiLCBvbmUsIHR3byk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0Zha2VBcnJheUJlYW4uamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvRmFrZUFycmF5QmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MmM5ZDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0Zha2VBcnJheUJlYW4uamF2YQpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHk7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXguanNvbi5iaW5kLmFubm90YXRpb24uSnNvbmJWaXNpYmlsaXR5OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7CisKKy8qKgorICogVGVzdCBjYXNlIGZvciBpc3N1ZSMzMTAuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFN1cHByZXNzV2FybmluZ3MoeyJSZWR1bmRhbnRJZlN0YXRlbWVudCIsICJVbnVzZWREZWNsYXJhdGlvbiJ9KQorQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQorQFhtbFR5cGUobmFtZSA9ICIiLCBwcm9wT3JkZXIgPSB7CisgICAgICAgICJ3ZWlnaHQiLCAiY29sb3IiLCAibmFtZSIKK30pCitAWG1sUm9vdEVsZW1lbnQoKQorQEpzb25iVmlzaWJpbGl0eShDdXN0b21Kc29uYlZpc2liaWxpdHlTdHJhdGVneS5jbGFzcykKK3B1YmxpYyBjbGFzcyBGYWtlQXJyYXlCZWFuIHsKKworICAgIHByb3RlY3RlZCBMaXN0PFN0cmluZz4gd2VpZ2h0OworICAgIEBYbWxFbGVtZW50KHJlcXVpcmVkID0gdHJ1ZSkKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGNvbG9yOworICAgIEBYbWxFbGVtZW50KHJlcXVpcmVkID0gdHJ1ZSkKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIG5hbWU7CisKKyAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFdlaWdodCgpIHsKKyAgICAgICAgaWYgKHdlaWdodCA9PSBudWxsKSB7CisgICAgICAgICAgICB3ZWlnaHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpcy53ZWlnaHQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDb2xvcigpIHsKKyAgICAgICAgcmV0dXJuIGNvbG9yOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENvbG9yKFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0aGlzLmNvbG9yID0gdmFsdWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyB2YWx1ZSkgeworICAgICAgICB0aGlzLm5hbWUgPSB2YWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVUZXN0SW5zdGFuY2UoKSB7CisgICAgICAgIEZha2VBcnJheUJlYW4gcmVzdWx0ID0gbmV3IEZha2VBcnJheUJlYW4oKTsKKworICAgICAgICByZXN1bHQuZ2V0V2VpZ2h0KCkuYWRkKCIxa2ciKTsKKyAgICAgICAgcmVzdWx0LmdldFdlaWdodCgpLmFkZCgiMmtnIik7CisgICAgICAgIHJlc3VsdC5zZXRDb2xvcigicmVkIik7CisgICAgICAgIHJlc3VsdC5zZXROYW1lKCJidW1wZXIiKTsKKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgRmFrZUFycmF5QmVhbiBvdGhlciA9IChGYWtlQXJyYXlCZWFuKSBvYmo7CisgICAgICAgIGlmICh0aGlzLndlaWdodCAhPSBvdGhlci53ZWlnaHQgJiYgKHRoaXMud2VpZ2h0ID09IG51bGwgfHwgIXRoaXMud2VpZ2h0LmVxdWFscyhvdGhlci53ZWlnaHQpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICgodGhpcy5jb2xvciA9PSBudWxsKSA/IChvdGhlci5jb2xvciAhPSBudWxsKSA6ICF0aGlzLmNvbG9yLmVxdWFscyhvdGhlci5jb2xvcikpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHRoaXMubmFtZSA9PSBudWxsKSA/IChvdGhlci5uYW1lICE9IG51bGwpIDogIXRoaXMubmFtZS5lcXVhbHMob3RoZXIubmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IDc7CisgICAgICAgIGhhc2ggPSAyOSAqIGhhc2ggKyAodGhpcy53ZWlnaHQgIT0gbnVsbCA/IHRoaXMud2VpZ2h0Lmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgaGFzaCA9IDI5ICogaGFzaCArICh0aGlzLmNvbG9yICE9IG51bGwgPyB0aGlzLmNvbG9yLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgaGFzaCA9IDI5ICogaGFzaCArICh0aGlzLm5hbWUgIT0gbnVsbCA/IHRoaXMubmFtZS5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIHJldHVybiBoYXNoOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJ7bmFtZTolcywgY29sb3I6JXMsIHdlaWdodHM6JXN9IiwgbmFtZSwgY29sb3IsIHdlaWdodCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9JbnRBcnJheS5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9JbnRBcnJheS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0Mjg2NWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0ludEFycmF5LmphdmEKQEAgLTAsMCArMSw4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHk7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworLyoqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAU3VwcHJlc3NXYXJuaW5ncygiUmVkdW5kYW50SWZTdGF0ZW1lbnQiKQorQFhtbFJvb3RFbGVtZW50KG5hbWUgPSAiaW50QXJyYXkiKQorcHVibGljIGNsYXNzIEludEFycmF5IHsKKworICAgIHB1YmxpYyBpbnRbXSBpbnRBcnJheTsKKworICAgIHB1YmxpYyBJbnRlZ2VyW10gaW50ZWdlckFycmF5OworCisgICAgcHVibGljIGludCBudW1iZXI7CisKKyAgICBwdWJsaWMgSW50QXJyYXkoKSB7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBJbnRBcnJheSBvdGhlciA9IChJbnRBcnJheSkgb2JqOworICAgICAgICBpZiAoIUFycmF5cy5lcXVhbHModGhpcy5pbnRBcnJheSwgb3RoZXIuaW50QXJyYXkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFBcnJheXMuZGVlcEVxdWFscyh0aGlzLmludGVnZXJBcnJheSwgb3RoZXIuaW50ZWdlckFycmF5KSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLm51bWJlciAhPSBvdGhlci5udW1iZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IDc7CisgICAgICAgIGhhc2ggPSA4OSAqIGhhc2ggKyBBcnJheXMuaGFzaENvZGUodGhpcy5pbnRBcnJheSk7CisgICAgICAgIGhhc2ggPSA4OSAqIGhhc2ggKyBBcnJheXMuZGVlcEhhc2hDb2RlKHRoaXMuaW50ZWdlckFycmF5KTsKKyAgICAgICAgaGFzaCA9IDg5ICogaGFzaCArIHRoaXMubnVtYmVyOworICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgieyBcImludEFycmF5XCI6JXMsIFwiaW50ZWdlckFycmF5XCI6JXMsIFwibnVtYmVyXCI6JWR9IiwgQXJyYXlzLnRvU3RyaW5nKGludEFycmF5KSwKKyAgICAgICAgICAgICAgICBBcnJheXMudG9TdHJpbmcoaW50ZWdlckFycmF5KSwgbnVtYmVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVUZXN0SW5zdGFuY2UoKSB7CisgICAgICAgIEludEFycmF5IHJlc3VsdCA9IG5ldyBJbnRBcnJheSgpOworCisgICAgICAgIHJlc3VsdC5udW1iZXIgPSA4OworICAgICAgICByZXN1bHQuaW50QXJyYXkgPSBuZXcgaW50W117NH07CisgICAgICAgIHJlc3VsdC5pbnRlZ2VyQXJyYXkgPSBuZXcgSW50ZWdlcltdezN9OworCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0plcnNleTExOTlMaXN0LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0plcnNleTExOTlMaXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI5MzYyNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmVyc2V5MTE5OUxpc3QuamF2YQpAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHk7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworaW1wb3J0IGphdmEudXRpbC5Gb3JtYXR0ZXI7CisKK2ltcG9ydCBqYXZheC5qc29uLmJpbmQuYW5ub3RhdGlvbi5Kc29uYlR5cGVBZGFwdGVyOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5KZXJzZXkxMTk5VGVzdDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiIsICJOdW1iZXJFcXVhbGl0eSIsICJTaW1wbGlmaWFibGVJZlN0YXRlbWVudCJ9KQorQFhtbFJvb3RFbGVtZW50CitwdWJsaWMgY2xhc3MgSmVyc2V5MTE5OUxpc3QgeworCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlVGVzdEluc3RhbmNlKCkgeworICAgICAgICBmaW5hbCBDb2xvckhvbGRlciBvYmoxID0gbmV3IENvbG9ySG9sZGVyKEVudW1TZXQub2YoQ29sb3IuUkVELCBDb2xvci5CTFVFKSk7CisgICAgICAgIGZpbmFsIENvbG9ySG9sZGVyIG9iajIgPSBuZXcgQ29sb3JIb2xkZXIoRW51bVNldC5vZihDb2xvci5HUkVFTikpOworCisgICAgICAgIHJldHVybiBuZXcgSmVyc2V5MTE5OUxpc3QobmV3IE9iamVjdFtde29iajEsIG9iajJ9KTsKKyAgICB9CisKKyAgICBwcml2YXRlIE9iamVjdFtdIG9iamVjdHM7CisgICAgcHJpdmF0ZSBJbnRlZ2VyIG9mZnNldDsKKyAgICBwcml2YXRlIEludGVnZXIgdG90YWw7CisKKyAgICBwdWJsaWMgSmVyc2V5MTE5OUxpc3QoKSB7CisgICAgfQorCisgICAgcHVibGljIEplcnNleTExOTlMaXN0KGZpbmFsIE9iamVjdFtdIG9iamVjdHMpIHsKKyAgICAgICAgdGhpcy5vYmplY3RzID0gb2JqZWN0czsKKyAgICAgICAgdGhpcy5vZmZzZXQgPSAwOworICAgICAgICB0aGlzLnRvdGFsID0gb2JqZWN0cy5sZW5ndGg7CisgICAgfQorCisgICAgLy8gSmFja3NvbiAxCisgICAgQG9yZy5jb2RlaGF1cy5qYWNrc29uLmFubm90YXRlLkpzb25UeXBlSW5mbygKKyAgICAgICAgICAgIHVzZSA9IG9yZy5jb2RlaGF1cy5qYWNrc29uLmFubm90YXRlLkpzb25UeXBlSW5mby5JZC5OQU1FLAorICAgICAgICAgICAgaW5jbHVkZSA9IG9yZy5jb2RlaGF1cy5qYWNrc29uLmFubm90YXRlLkpzb25UeXBlSW5mby5Bcy5QUk9QRVJUWSkKKyAgICBAb3JnLmNvZGVoYXVzLmphY2tzb24uYW5ub3RhdGUuSnNvblN1YlR5cGVzKHsKKyAgICAgICAgICAgIEBvcmcuY29kZWhhdXMuamFja3Nvbi5hbm5vdGF0ZS5Kc29uU3ViVHlwZXMuVHlwZSh2YWx1ZSA9IENvbG9ySG9sZGVyLmNsYXNzKQorICAgIH0pCisgICAgLy8gSmFja3NvbiAyCisgICAgQGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5hbm5vdGF0aW9uLkpzb25UeXBlSW5mbygKKyAgICAgICAgICAgIHVzZSA9IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5hbm5vdGF0aW9uLkpzb25UeXBlSW5mby5JZC5OQU1FLAorICAgICAgICAgICAgaW5jbHVkZSA9IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5hbm5vdGF0aW9uLkpzb25UeXBlSW5mby5Bcy5QUk9QRVJUWSkKKyAgICBAY29tLmZhc3RlcnhtbC5qYWNrc29uLmFubm90YXRpb24uSnNvblN1YlR5cGVzKHsKKyAgICAgICAgICAgIEBjb20uZmFzdGVyeG1sLmphY2tzb24uYW5ub3RhdGlvbi5Kc29uU3ViVHlwZXMuVHlwZSh2YWx1ZSA9IENvbG9ySG9sZGVyLmNsYXNzKQorICAgIH0pCisgICAgLy8gSlNPTi1CCisgICAgQEpzb25iVHlwZUFkYXB0ZXIoSmVyc2V5MTE5OVRlc3QuSnNvbmJPYmplY3RUb0NvbG9ySG9sZGVyQWRhcHRlci5jbGFzcykKKyAgICBwdWJsaWMgT2JqZWN0W10gZ2V0T2JqZWN0cygpIHsKKyAgICAgICAgcmV0dXJuIG9iamVjdHM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0T2JqZWN0cyhmaW5hbCBPYmplY3RbXSBvYmplY3RzKSB7CisgICAgICAgIHRoaXMub2JqZWN0cyA9IG9iamVjdHM7CisgICAgfQorCisgICAgcHVibGljIEludGVnZXIgZ2V0T2Zmc2V0KCkgeworICAgICAgICByZXR1cm4gb2Zmc2V0OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE9mZnNldChmaW5hbCBJbnRlZ2VyIG9mZnNldCkgeworICAgICAgICB0aGlzLm9mZnNldCA9IG9mZnNldDsKKyAgICB9CisKKyAgICBwdWJsaWMgSW50ZWdlciBnZXRUb3RhbCgpIHsKKyAgICAgICAgcmV0dXJuIHRvdGFsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRvdGFsKGZpbmFsIEludGVnZXIgdG90YWwpIHsKKyAgICAgICAgdGhpcy50b3RhbCA9IHRvdGFsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIEplcnNleTExOTlMaXN0KSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgSmVyc2V5MTE5OUxpc3Qgb3RoZXIgPSAoSmVyc2V5MTE5OUxpc3QpIG9iajsKKworICAgICAgICBpZiAodGhpcy50b3RhbCAhPSBvdGhlci50b3RhbCAmJiAodGhpcy50b3RhbCA9PSBudWxsIHx8ICF0aGlzLnRvdGFsLmVxdWFscyhvdGhlci50b3RhbCkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMub2Zmc2V0ICE9IG90aGVyLm9mZnNldCAmJiAodGhpcy5vZmZzZXQgPT0gbnVsbCB8fCAhdGhpcy5vZmZzZXQuZXF1YWxzKG90aGVyLm9mZnNldCkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gQXJyYXlzLmVxdWFscyh0aGlzLm9iamVjdHMsIG90aGVyLm9iamVjdHMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBuZXcgRm9ybWF0dGVyKCkuZm9ybWF0KCJKZXJzZXkxMTk5TGlzdCglcywgJWQsICVkKSIsIEFycmF5cy50b1N0cmluZyhvYmplY3RzKSwgb2Zmc2V0LCB0b3RhbCkudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IDQzOworICAgICAgICBoYXNoICs9IChvZmZzZXQgIT0gbnVsbCA/IDE3ICogb2Zmc2V0IDogMCk7CisgICAgICAgIGhhc2ggKz0gKHRvdGFsICE9IG51bGwgPyAxNyAqIHRvdGFsIDogMCk7CisgICAgICAgIGhhc2ggKz0gQXJyYXlzLmhhc2hDb2RlKG9iamVjdHMpOworICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0xpc3RBbmROb25MaXN0QmVhbi5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9MaXN0QW5kTm9uTGlzdEJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjRmYmM4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9MaXN0QW5kTm9uTGlzdEJlYW4uamF2YQpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eTsKKworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworLyoqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAU3VwcHJlc3NXYXJuaW5ncyh7IlJlZHVuZGFudElmU3RhdGVtZW50IiwgIlN0cmluZ0VxdWFsaXR5In0pCitAWG1sUm9vdEVsZW1lbnQKK3B1YmxpYyBjbGFzcyBMaXN0QW5kTm9uTGlzdEJlYW4geworCisgICAgcHVibGljIExpc3Q8U3RyaW5nPiBhOworICAgIHB1YmxpYyBTdHJpbmcgZDsKKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVRlc3RJbnN0YW5jZSgpIHsKKyAgICAgICAgTGlzdEFuZE5vbkxpc3RCZWFuIGluc3RhbmNlID0gbmV3IExpc3RBbmROb25MaXN0QmVhbigpOworICAgICAgICBpbnN0YW5jZS5hID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPigpOworICAgICAgICBpbnN0YW5jZS5hLmFkZCgiMSIpOworICAgICAgICBpbnN0YW5jZS5kID0gIjIiOworICAgICAgICByZXR1cm4gaW5zdGFuY2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBMaXN0QW5kTm9uTGlzdEJlYW4gb3RoZXIgPSAoTGlzdEFuZE5vbkxpc3RCZWFuKSBvYmo7CisgICAgICAgIGlmICh0aGlzLmEgIT0gb3RoZXIuYSAmJiAodGhpcy5hID09IG51bGwgfHwgIXRoaXMuYS5lcXVhbHMob3RoZXIuYSkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMuZCAhPSBvdGhlci5kICYmICh0aGlzLmQgPT0gbnVsbCB8fCAhdGhpcy5kLmVxdWFscyhvdGhlci5kKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IDc7CisgICAgICAgIGhhc2ggPSA0NyAqIGhhc2ggKyAodGhpcy5hICE9IG51bGwgPyB0aGlzLmEuaGFzaENvZGUoKSA6IDApOworICAgICAgICBoYXNoID0gNDcgKiBoYXNoICsgKHRoaXMuZCAhPSBudWxsID8gdGhpcy5kLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0xpc3RFbXB0eUJlYW4uamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTGlzdEVtcHR5QmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZjYxM2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0xpc3RFbXB0eUJlYW4uamF2YQpAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eTsKKworaW1wb3J0IGphdmEudXRpbC5Gb3JtYXR0ZXI7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uSnNvblRlc3RIZWxwZXI7CisKKy8qKgorICogQGF1dGhvciBtY2hlbnJ5YworICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJVbnVzZWREZWNsYXJhdGlvbiIpCitAWG1sUm9vdEVsZW1lbnQobmFtZSA9ICJsaXN0RW1wdHlCZWFuIikKK3B1YmxpYyBjbGFzcyBMaXN0RW1wdHlCZWFuIHsKKworICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGVtcHR5OworCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlVGVzdEluc3RhbmNlKCkgeworICAgICAgICBMaXN0RW1wdHlCZWFuIGluc3RhbmNlID0gbmV3IExpc3RFbXB0eUJlYW4oKTsKKyAgICAgICAgaW5zdGFuY2UuZW1wdHkgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgIHJldHVybiBpbnN0YW5jZTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldEVtcHR5KCkgeworICAgICAgICByZXR1cm4gZW1wdHk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RW1wdHkoTGlzdDxTdHJpbmc+IGVtcHR5KSB7CisgICAgICAgIHRoaXMuZW1wdHkgPSBlbXB0eTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIExpc3RFbXB0eUJlYW4gb3RoZXIgPSAoTGlzdEVtcHR5QmVhbikgb2JqOworICAgICAgICByZXR1cm4gdGhpcy5lbXB0eSA9PSBvdGhlci5lbXB0eQorICAgICAgICAgICAgICAgIHx8IChKc29uVGVzdEhlbHBlci5pc0NvbGxlY3Rpb25FbXB0eSh0aGlzLmVtcHR5KSAmJiBKc29uVGVzdEhlbHBlci5pc0NvbGxlY3Rpb25FbXB0eShvdGhlci5lbXB0eSkpCisgICAgICAgICAgICAgICAgfHwgKHRoaXMuZW1wdHkgIT0gbnVsbCAmJiB0aGlzLmVtcHR5LmVxdWFscyhvdGhlci5lbXB0eSkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCBoYXNoID0gNzsKKyAgICAgICAgaGFzaCA9IDMxICogaGFzaCArICh0aGlzLmVtcHR5ICE9IG51bGwgPyB0aGlzLmVtcHR5Lmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIChuZXcgRm9ybWF0dGVyKCkpLmZvcm1hdCgiTHdOQihuPSVkLGlzTnVsbDolcykiLCAoZW1wdHkgIT0gbnVsbCkgPyBlbXB0eS5zaXplKCkgOiAwLCAoZW1wdHkgPT0gbnVsbCkpLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9MaXN0V3JhcHBlckJlYW4uamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTGlzdFdyYXBwZXJCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNiZDI0MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTGlzdFdyYXBwZXJCZWFuLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHk7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5Kc29uVGVzdEhlbHBlcjsKKworLyoqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAU3VwcHJlc3NXYXJuaW5ncygiUmVkdW5kYW50SWZTdGF0ZW1lbnQiKQorQFhtbFJvb3RFbGVtZW50KG5hbWUgPSAiaXRlbSIpCitwdWJsaWMgY2xhc3MgTGlzdFdyYXBwZXJCZWFuIHsKKworICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gcHJvcGVydHk7CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVUZXN0SW5zdGFuY2UoKSB7CisgICAgICAgIHJldHVybiBuZXcgTGlzdFdyYXBwZXJCZWFuKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBMaXN0V3JhcHBlckJlYW4gb3RoZXIgPSAoTGlzdFdyYXBwZXJCZWFuKSBvYmo7CisgICAgICAgIGlmICgodGhpcy5wcm9wZXJ0eSAhPSBvdGhlci5wcm9wZXJ0eQorICAgICAgICAgICAgICAgICYmIEpzb25UZXN0SGVscGVyLmlzQ29sbGVjdGlvbkVtcHR5KHRoaXMucHJvcGVydHkpICE9IEpzb25UZXN0SGVscGVyLmlzQ29sbGVjdGlvbkVtcHR5KG90aGVyLnByb3BlcnR5KSkKKyAgICAgICAgICAgICAgICAmJiAodGhpcy5wcm9wZXJ0eSA9PSBudWxsIHx8ICF0aGlzLnByb3BlcnR5LmVxdWFscyhvdGhlci5wcm9wZXJ0eSkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGhhc2ggPSA3OworICAgICAgICBoYXNoID0gMjMgKiBoYXNoICsgKHRoaXMucHJvcGVydHkgIT0gbnVsbCA/IHRoaXMucHJvcGVydHkuaGFzaENvZGUoKSA6IDApOworICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L015RXJyb3IuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTXlFcnJvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YWI4NmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L015RXJyb3IuamF2YQpAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHk7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOworCisvKioKKyAqIDxwPkphdmEgY2xhc3MgZm9yIGFub255bW91cyBjb21wbGV4IHR5cGUuCisgKiA8cC8+CisgKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgorICogPHAvPgorICogPHByZT4KKyAqICZsdDtjb21wbGV4VHlwZT4KKyAqICAgJmx0O2NvbXBsZXhDb250ZW50PgorICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+CisgKiAgICAgICAmbHQ7c2VxdWVuY2U+CisgKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImlkIiB0eXBlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9c3RyaW5nIi8+CisgKiAgICAgICAgICZsdDtlbGVtZW50IG5hbWU9ImRlc2MiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1zdHJpbmciLz4KKyAqICAgICAgICZsdDsvc2VxdWVuY2U+CisgKiAgICAgJmx0Oy9yZXN0cmljdGlvbj4KKyAqICAgJmx0Oy9jb21wbGV4Q29udGVudD4KKyAqICZsdDsvY29tcGxleFR5cGU+CisgKiA8L3ByZT4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAU3VwcHJlc3NXYXJuaW5ncygiUmVkdW5kYW50SWZTdGF0ZW1lbnQiKQorQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQorQFhtbFR5cGUobmFtZSA9ICIiLCBwcm9wT3JkZXIgPSB7CisgICAgICAgICJpZCIsICJkZXNjIgorfSkKK0BYbWxSb290RWxlbWVudChuYW1lID0gIm15RXJyb3IiKQorcHVibGljIGNsYXNzIE15RXJyb3IgeworCisgICAgQFhtbEVsZW1lbnQocmVxdWlyZWQgPSB0cnVlKQorICAgIHByb3RlY3RlZCBTdHJpbmcgaWQ7CisgICAgQFhtbEVsZW1lbnQocmVxdWlyZWQgPSB0cnVlKQorICAgIHByb3RlY3RlZCBTdHJpbmcgZGVzYzsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzCisgICAgICogICAgICAgICB7QGxpbmsgU3RyaW5nIH0KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgeworICAgICAgICByZXR1cm4gaWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzCisgICAgICoge0BsaW5rIFN0cmluZyB9CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHRoaXMuaWQgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZGVzYyBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzCisgICAgICogICAgICAgICB7QGxpbmsgU3RyaW5nIH0KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldERlc2MoKSB7CisgICAgICAgIHJldHVybiBkZXNjOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBkZXNjIHByb3BlcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzCisgICAgICoge0BsaW5rIFN0cmluZyB9CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0RGVzYyhTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgdGhpcy5kZXNjID0gdmFsdWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBNeUVycm9yIG90aGVyID0gKE15RXJyb3IpIG9iajsKKyAgICAgICAgaWYgKCh0aGlzLmlkID09IG51bGwpID8gKG90aGVyLmlkICE9IG51bGwpIDogIXRoaXMuaWQuZXF1YWxzKG90aGVyLmlkKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICgodGhpcy5kZXNjID09IG51bGwpID8gKG90aGVyLmRlc2MgIT0gbnVsbCkgOiAhdGhpcy5kZXNjLmVxdWFscyhvdGhlci5kZXNjKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCBoYXNoID0gNzsKKyAgICAgICAgaGFzaCA9IDE5ICogaGFzaCArICh0aGlzLmlkICE9IG51bGwgPyB0aGlzLmlkLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgaGFzaCA9IDE5ICogaGFzaCArICh0aGlzLmRlc2MgIT0gbnVsbCA/IHRoaXMuZGVzYy5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIHJldHVybiBoYXNoOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBzYi5hcHBlbmQoInsiKTsKKyAgICAgICAgc2IuYXBwZW5kKGdldElkKCkpOworICAgICAgICBzYi5hcHBlbmQoJywnKTsKKyAgICAgICAgc2IuYXBwZW5kKGdldERlc2MoKSk7CisgICAgICAgIHNiLmFwcGVuZCgnfScpOworICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTXlNZXNzYWdlLmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L015TWVzc2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyM2I3NjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L015TWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eTsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFR5cGU7CisKKy8qKgorICogPHA+SmF2YSBjbGFzcyBmb3IgYW5vbnltb3VzIGNvbXBsZXggdHlwZS4KKyAqIDxwLz4KKyAqIDxwPlRoZSBmb2xsb3dpbmcgc2NoZW1hIGZyYWdtZW50IHNwZWNpZmllcyB0aGUgZXhwZWN0ZWQgY29udGVudCBjb250YWluZWQgd2l0aGluIHRoaXMgY2xhc3MuCisgKiA8cC8+CisgKiA8cHJlPgorICogJmx0O2NvbXBsZXhUeXBlPgorICogICAmbHQ7Y29tcGxleENvbnRlbnQ+CisgKiAgICAgJmx0O3Jlc3RyaWN0aW9uIGJhc2U9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1hbnlUeXBlIj4KKyAqICAgICAgICZsdDtzZXF1ZW5jZT4KKyAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0iaWQiIHR5cGU9IntodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYX1zdHJpbmciLz4KKyAqICAgICAgICAgJmx0O2VsZW1lbnQgbmFtZT0idGV4dCIgdHlwZT0ie2h0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hfXN0cmluZyIvPgorICogICAgICAgJmx0Oy9zZXF1ZW5jZT4KKyAqICAgICAmbHQ7L3Jlc3RyaWN0aW9uPgorICogICAmbHQ7L2NvbXBsZXhDb250ZW50PgorICogJmx0Oy9jb21wbGV4VHlwZT4KKyAqIDwvcHJlPgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJSZWR1bmRhbnRJZlN0YXRlbWVudCIpCitAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCitAWG1sVHlwZShuYW1lID0gIiIsIHByb3BPcmRlciA9IHsKKyAgICAgICAgImlkIiwgInRleHQiCit9KQorQFhtbFJvb3RFbGVtZW50KG5hbWUgPSAibXlNZXNzYWdlIikKK3B1YmxpYyBjbGFzcyBNeU1lc3NhZ2UgeworCisgICAgQFhtbEVsZW1lbnQocmVxdWlyZWQgPSB0cnVlKQorICAgIHByb3RlY3RlZCBTdHJpbmcgaWQ7CisgICAgQFhtbEVsZW1lbnQocmVxdWlyZWQgPSB0cnVlKQorICAgIHByb3RlY3RlZCBTdHJpbmcgdGV4dDsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBpZCBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzCisgICAgICogICAgICAgICB7QGxpbmsgU3RyaW5nIH0KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgeworICAgICAgICByZXR1cm4gaWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGlkIHByb3BlcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzCisgICAgICoge0BsaW5rIFN0cmluZyB9CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0SWQoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHRoaXMuaWQgPSB2YWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgdGV4dCBwcm9wZXJ0eS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gcG9zc2libGUgb2JqZWN0IGlzCisgICAgICogICAgICAgICB7QGxpbmsgU3RyaW5nIH0KKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisgICAgICAgIHJldHVybiB0ZXh0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSB0ZXh0IHByb3BlcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzCisgICAgICoge0BsaW5rIFN0cmluZyB9CisgICAgICovCisgICAgcHVibGljIHZvaWQgc2V0VGV4dChTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgdGhpcy50ZXh0ID0gdmFsdWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBNeU1lc3NhZ2Ugb3RoZXIgPSAoTXlNZXNzYWdlKSBvYmo7CisgICAgICAgIGlmICgodGhpcy5pZCA9PSBudWxsKSA/IChvdGhlci5pZCAhPSBudWxsKSA6ICF0aGlzLmlkLmVxdWFscyhvdGhlci5pZCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHRoaXMudGV4dCA9PSBudWxsKSA/IChvdGhlci50ZXh0ICE9IG51bGwpIDogIXRoaXMudGV4dC5lcXVhbHMob3RoZXIudGV4dCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IDM7CisgICAgICAgIGhhc2ggPSA0NyAqIGhhc2ggKyAodGhpcy5pZCAhPSBudWxsID8gdGhpcy5pZC5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIGhhc2ggPSA0NyAqIGhhc2ggKyAodGhpcy50ZXh0ICE9IG51bGwgPyB0aGlzLnRleHQuaGFzaENvZGUoKSA6IDApOworICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgc2IuYXBwZW5kKCJ7Iik7CisgICAgICAgIHNiLmFwcGVuZChnZXRJZCgpKTsKKyAgICAgICAgc2IuYXBwZW5kKCcsJyk7CisgICAgICAgIHNiLmFwcGVuZChnZXRUZXh0KCkpOworICAgICAgICBzYi5hcHBlbmQoJ30nKTsKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9NeVJlc3BvbnNlLmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L015UmVzcG9uc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGY1M2QyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9NeVJlc3BvbnNlLmphdmEKQEAgLTAsMCArMSwxNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4Lmpzb24uYmluZC5hbm5vdGF0aW9uLkpzb25iVmlzaWJpbGl0eTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUeXBlOworCisvKioKKyAqIDxwPkphdmEgY2xhc3MgZm9yIGFub255bW91cyBjb21wbGV4IHR5cGUuCisgKiA8cC8+CisgKiA8cD5UaGUgZm9sbG93aW5nIHNjaGVtYSBmcmFnbWVudCBzcGVjaWZpZXMgdGhlIGV4cGVjdGVkIGNvbnRlbnQgY29udGFpbmVkIHdpdGhpbiB0aGlzIGNsYXNzLgorICogPHAvPgorICogPHByZT4KKyAqICZsdDtjb21wbGV4VHlwZT4KKyAqICAgJmx0O2NvbXBsZXhDb250ZW50PgorICogICAgICZsdDtyZXN0cmljdGlvbiBiYXNlPSJ7aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWF9YW55VHlwZSI+CisgKiAgICAgICAmbHQ7c2VxdWVuY2U+CisgKiAgICAgICAgICZsdDtlbGVtZW50IHJlZj0ie2h0dHA6Ly90ZXN0LmpheGIuY29tfW15TWVzc2FnZSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIG1pbk9jY3Vycz0iMCIvPgorICogICAgICAgICAmbHQ7ZWxlbWVudCByZWY9IntodHRwOi8vdGVzdC5qYXhiLmNvbX1teUVycm9yIi8+CisgKiAgICAgICAmbHQ7L3NlcXVlbmNlPgorICogICAgICZsdDsvcmVzdHJpY3Rpb24+CisgKiAgICZsdDsvY29tcGxleENvbnRlbnQ+CisgKiAmbHQ7L2NvbXBsZXhUeXBlPgorICogPC9wcmU+CisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFN1cHByZXNzV2FybmluZ3MoIlJlZHVuZGFudElmU3RhdGVtZW50IikKK0BYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKK0BYbWxUeXBlKG5hbWUgPSAiIiwgcHJvcE9yZGVyID0geworICAgICAgICAibXlNZXNzYWdlIiwgIm15RXJyb3IiCit9KQorQFhtbFJvb3RFbGVtZW50KG5hbWUgPSAibXlSZXNwb25zZSIpCitASnNvbmJWaXNpYmlsaXR5KEN1c3RvbUpzb25iVmlzaWJpbGl0eVN0cmF0ZWd5LmNsYXNzKQorcHVibGljIGNsYXNzIE15UmVzcG9uc2UgeworCisgICAgQFhtbEVsZW1lbnQobmFtZXNwYWNlID0gImh0dHA6Ly90ZXN0LmpheGIuY29tIikKKyAgICBwcm90ZWN0ZWQgTGlzdDxNeU1lc3NhZ2U+IG15TWVzc2FnZTsKKyAgICBAWG1sRWxlbWVudChuYW1lc3BhY2UgPSAiaHR0cDovL3Rlc3QuamF4Yi5jb20iLCByZXF1aXJlZCA9IHRydWUpCisgICAgcHJvdGVjdGVkIE15RXJyb3IgbXlFcnJvcjsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIHZhbHVlIG9mIHRoZSBteU1lc3NhZ2UgcHJvcGVydHkuCisgICAgICogPHAvPgorICAgICAqIDxwLz4KKyAgICAgKiBUaGlzIGFjY2Vzc29yIG1ldGhvZCByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBsaXZlIGxpc3QsCisgICAgICogbm90IGEgc25hcHNob3QuIFRoZXJlZm9yZSBhbnkgbW9kaWZpY2F0aW9uIHlvdSBtYWtlIHRvIHRoZQorICAgICAqIHJldHVybmVkIGxpc3Qgd2lsbCBiZSBwcmVzZW50IGluc2lkZSB0aGUgSkFYQiBvYmplY3QuCisgICAgICogVGhpcyBpcyB3aHkgdGhlcmUgaXMgbm90IGEgPENPREU+c2V0PC9DT0RFPiBtZXRob2QgZm9yIHRoZSBteU1lc3NhZ2UgcHJvcGVydHkuCisgICAgICogPHAvPgorICAgICAqIDxwLz4KKyAgICAgKiBGb3IgZXhhbXBsZSwgdG8gYWRkIGEgbmV3IGl0ZW0sIGRvIGFzIGZvbGxvd3M6CisgICAgICogPHByZT4KKyAgICAgKiAgICBnZXRNeU1lc3NhZ2UoKS5hZGQobmV3SXRlbSk7CisgICAgICogPC9wcmU+CisgICAgICogPHAvPgorICAgICAqIDxwLz4KKyAgICAgKiA8cC8+CisgICAgICogT2JqZWN0cyBvZiB0aGUgZm9sbG93aW5nIHR5cGUocykgYXJlIGFsbG93ZWQgaW4gdGhlIGxpc3QKKyAgICAgKiB7QGxpbmsgTXlNZXNzYWdlIH0KKyAgICAgKi8KKyAgICBwdWJsaWMgTGlzdDxNeU1lc3NhZ2U+IGdldE15TWVzc2FnZSgpIHsKKyAgICAgICAgaWYgKG15TWVzc2FnZSA9PSBudWxsKSB7CisgICAgICAgICAgICBteU1lc3NhZ2UgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGhpcy5teU1lc3NhZ2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdmFsdWUgb2YgdGhlIG15RXJyb3IgcHJvcGVydHkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHBvc3NpYmxlIG9iamVjdCBpcworICAgICAqICAgICAgICAge0BsaW5rIE15RXJyb3IgfQorICAgICAqLworICAgIHB1YmxpYyBNeUVycm9yIGdldE15RXJyb3IoKSB7CisgICAgICAgIHJldHVybiBteUVycm9yOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBteUVycm9yIHByb3BlcnR5LgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlIGFsbG93ZWQgb2JqZWN0IGlzCisgICAgICoge0BsaW5rIE15RXJyb3IgfQorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldE15RXJyb3IoTXlFcnJvciB2YWx1ZSkgeworICAgICAgICB0aGlzLm15RXJyb3IgPSB2YWx1ZTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVUZXN0SW5zdGFuY2UoKSB7CisKKyAgICAgICAgTXlSZXNwb25zZSBteVJlc3BvbnNlID0gbmV3IE15UmVzcG9uc2UoKTsKKworICAgICAgICBNeU1lc3NhZ2UgbXNnID0gbmV3IE15TWVzc2FnZSgpOworICAgICAgICBtc2cuc2V0SWQoIjAiKTsKKyAgICAgICAgbXNnLnNldFRleHQoIm9rIik7CisgICAgICAgIE15TWVzc2FnZSBtc2cyID0gbmV3IE15TWVzc2FnZSgpOworICAgICAgICBtc2cyLnNldElkKCIxIik7CisgICAgICAgIG1zZzIuc2V0VGV4dCgib2siKTsKKyAgICAgICAgbXlSZXNwb25zZS5nZXRNeU1lc3NhZ2UoKS5hZGQobXNnKTsKKyAgICAgICAgbXlSZXNwb25zZS5nZXRNeU1lc3NhZ2UoKS5hZGQobXNnMik7CisKKyAgICAgICAgTXlFcnJvciBlcnIgPSBuZXcgTXlFcnJvcigpOworICAgICAgICBlcnIuc2V0SWQoIi0xIik7CisgICAgICAgIGVyci5zZXREZXNjKCJlcnJvciIpOworICAgICAgICBteVJlc3BvbnNlLnNldE15RXJyb3IoZXJyKTsKKyAgICAgICAgcmV0dXJuIG15UmVzcG9uc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBNeVJlc3BvbnNlIG90aGVyID0gKE15UmVzcG9uc2UpIG9iajsKKyAgICAgICAgaWYgKHRoaXMubXlNZXNzYWdlICE9IG90aGVyLm15TWVzc2FnZSAmJiAodGhpcy5teU1lc3NhZ2UgPT0gbnVsbCB8fCAhdGhpcy5teU1lc3NhZ2UuZXF1YWxzKG90aGVyLm15TWVzc2FnZSkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMubXlFcnJvciAhPSBvdGhlci5teUVycm9yICYmICh0aGlzLm15RXJyb3IgPT0gbnVsbCB8fCAhdGhpcy5teUVycm9yLmVxdWFscyhvdGhlci5teUVycm9yKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IDM7CisgICAgICAgIGhhc2ggPSA5NyAqIGhhc2ggKyAodGhpcy5teU1lc3NhZ2UgIT0gbnVsbCA/IHRoaXMubXlNZXNzYWdlLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgaGFzaCA9IDk3ICogaGFzaCArICh0aGlzLm15RXJyb3IgIT0gbnVsbCA/IHRoaXMubXlFcnJvci5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIHJldHVybiBoYXNoOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBzYi5hcHBlbmQoInsiKTsKKyAgICAgICAgc2IuYXBwZW5kKGdldE15TWVzc2FnZSgpKTsKKyAgICAgICAgc2IuYXBwZW5kKCIsIik7CisgICAgICAgIHNiLmFwcGVuZChnZXRNeUVycm9yKCkpOworICAgICAgICBzYi5hcHBlbmQoIn0iKTsKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9OYW1lc3BhY2VCZWFuLmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L05hbWVzcGFjZUJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2JiMmM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9OYW1lc3BhY2VCZWFuLmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHk7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworLyoqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCisKK0BTdXBwcmVzc1dhcm5pbmdzKHsiUmVkdW5kYW50SWZTdGF0ZW1lbnQiLCAiVW51c2VkRGVjbGFyYXRpb24ifSkKK0BYbWxSb290RWxlbWVudAorcHVibGljIGNsYXNzIE5hbWVzcGFjZUJlYW4geworCisgICAgQFhtbEVsZW1lbnQKKyAgICBwdWJsaWMgU3RyaW5nIGE7CisKKyAgICBAWG1sRWxlbWVudChuYW1lc3BhY2UgPSAiaHR0cDovL2V4YW1wbGUuY29tIikKKyAgICBwdWJsaWMgU3RyaW5nIGI7CisKKyAgICBwdWJsaWMgTmFtZXNwYWNlQmVhbigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgTmFtZXNwYWNlQmVhbihTdHJpbmcgYSwgU3RyaW5nIGIpIHsKKyAgICAgICAgdGhpcy5hID0gYTsKKyAgICAgICAgdGhpcy5iID0gYjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIE5hbWVzcGFjZUJlYW4gb3RoZXIgPSAoTmFtZXNwYWNlQmVhbikgb2JqOworICAgICAgICBpZiAoKHRoaXMuYSA9PSBudWxsKSA/IChvdGhlci5hICE9IG51bGwpIDogIXRoaXMuYS5lcXVhbHMob3RoZXIuYSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKHRoaXMuYiA9PSBudWxsKSA/IChvdGhlci5iICE9IG51bGwpIDogIXRoaXMuYi5lcXVhbHMob3RoZXIuYikpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IDc7CisgICAgICAgIGhhc2ggPSAzNyAqIGhhc2ggKyAodGhpcy5hICE9IG51bGwgPyB0aGlzLmEuaGFzaENvZGUoKSA6IDApOworICAgICAgICBoYXNoID0gMzcgKiBoYXNoICsgKHRoaXMuYiAhPSBudWxsID8gdGhpcy5iLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlVGVzdEluc3RhbmNlKCkgeworICAgICAgICByZXR1cm4gbmV3IE5hbWVzcGFjZUJlYW4oImZvbyIsICJiYXIiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgie2E6JXMsIGI6JXMiLCBhLCBiKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTmFtZXNwYWNlQmVhbldpdGhBdHRyaWJ1dGUuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTmFtZXNwYWNlQmVhbldpdGhBdHRyaWJ1dGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDI1NGY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9OYW1lc3BhY2VCZWFuV2l0aEF0dHJpYnV0ZS5qYXZhCkBAIC0wLDAgKzEsODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5OworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBdHRyaWJ1dGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiIsICJSZWR1bmRhbnRJZlN0YXRlbWVudCJ9KQorQFhtbFJvb3RFbGVtZW50CitwdWJsaWMgY2xhc3MgTmFtZXNwYWNlQmVhbldpdGhBdHRyaWJ1dGUgeworCisgICAgQFhtbEF0dHJpYnV0ZShuYW1lc3BhY2UgPSAiaHR0cDovL2V4YW1wbGUuY29tIikKKyAgICBwdWJsaWMgU3RyaW5nIGF0dHI7CisKKyAgICBAWG1sRWxlbWVudAorICAgIHB1YmxpYyBTdHJpbmcgYTsKKworICAgIEBYbWxFbGVtZW50KG5hbWVzcGFjZSA9ICJodHRwOi8vZXhhbXBsZS5jb20iKQorICAgIHB1YmxpYyBTdHJpbmcgYjsKKworICAgIHB1YmxpYyBOYW1lc3BhY2VCZWFuV2l0aEF0dHJpYnV0ZSgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgTmFtZXNwYWNlQmVhbldpdGhBdHRyaWJ1dGUoU3RyaW5nIGF0dHIsIFN0cmluZyBhLCBTdHJpbmcgYikgeworICAgICAgICB0aGlzLmF0dHIgPSBhdHRyOworICAgICAgICB0aGlzLmEgPSBhOworICAgICAgICB0aGlzLmIgPSBiOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgTmFtZXNwYWNlQmVhbldpdGhBdHRyaWJ1dGUgb3RoZXIgPSAoTmFtZXNwYWNlQmVhbldpdGhBdHRyaWJ1dGUpIG9iajsKKyAgICAgICAgaWYgKCh0aGlzLmF0dHIgPT0gbnVsbCkgPyAob3RoZXIuYXR0ciAhPSBudWxsKSA6ICF0aGlzLmF0dHIuZXF1YWxzKG90aGVyLmF0dHIpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh0aGlzLmEgPT0gbnVsbCkgPyAob3RoZXIuYSAhPSBudWxsKSA6ICF0aGlzLmEuZXF1YWxzKG90aGVyLmEpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh0aGlzLmIgPT0gbnVsbCkgPyAob3RoZXIuYiAhPSBudWxsKSA6ICF0aGlzLmIuZXF1YWxzKG90aGVyLmIpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGhhc2ggPSA3OworICAgICAgICBoYXNoID0gMzcgKiBoYXNoICsgKHRoaXMuYXR0ciAhPSBudWxsID8gdGhpcy5hdHRyLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgaGFzaCA9IDM3ICogaGFzaCArICh0aGlzLmEgIT0gbnVsbCA/IHRoaXMuYS5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIGhhc2ggPSAzNyAqIGhhc2ggKyAodGhpcy5iICE9IG51bGwgPyB0aGlzLmIuaGFzaENvZGUoKSA6IDApOworICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVUZXN0SW5zdGFuY2UoKSB7CisgICAgICAgIHJldHVybiBuZXcgTmFtZXNwYWNlQmVhbldpdGhBdHRyaWJ1dGUoInZhbHVlIiwgImZvbyIsICJiYXIiKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgie2F0dHI6JXMsIGE6JXMsIGI6JXMiLCBhdHRyLCBhLCBiKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTnVsbFN0cmluZ0JlYW4uamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTnVsbFN0cmluZ0JlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTg1NWQzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9OdWxsU3RyaW5nQmVhbi5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5OworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFN1cHByZXNzV2FybmluZ3MoIlJlZHVuZGFudElmU3RhdGVtZW50IikKK0BYbWxSb290RWxlbWVudAorcHVibGljIGNsYXNzIE51bGxTdHJpbmdCZWFuIHsKKworICAgIEBYbWxFbGVtZW50KG5pbGxhYmxlID0gdHJ1ZSkKKyAgICBwdWJsaWMgU3RyaW5nIG51bGxTdHJpbmcgPSAibm90IG51bGwgdG8gdGVzdCBpZiBzZXQgdG8gbnVsbCB3b3JrcyI7CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVUZXN0SW5zdGFuY2UoKSB7CisgICAgICAgIHJldHVybiBuZXcgTnVsbFN0cmluZ0JlYW4oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIE51bGxTdHJpbmdCZWFuIG90aGVyID0gKE51bGxTdHJpbmdCZWFuKSBvYmo7CisgICAgICAgIGlmICgodGhpcy5udWxsU3RyaW5nID09IG51bGwpID8gKG90aGVyLm51bGxTdHJpbmcgIT0gbnVsbCkgOiAhdGhpcy5udWxsU3RyaW5nLmVxdWFscyhvdGhlci5udWxsU3RyaW5nKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCBoYXNoID0gMzsKKyAgICAgICAgaGFzaCA9IDE5ICogaGFzaCArICh0aGlzLm51bGxTdHJpbmcgIT0gbnVsbCA/IHRoaXMubnVsbFN0cmluZy5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIHJldHVybiBoYXNoOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJ7bnVsbFN0cmluZzolc30iLCBxdW90ZURlbGltaXRlZFN0cmluZ09yTnVsbChudWxsU3RyaW5nKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgcXVvdGVEZWxpbWl0ZWRTdHJpbmdPck51bGwoU3RyaW5nIHN0cmluZykgeworICAgICAgICByZXR1cm4gKHN0cmluZyA9PSBudWxsKSA/ICJudWxsIiA6IFN0cmluZy5mb3JtYXQoIlwiJXNcIiIsIHN0cmluZyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9QZXJzb24uamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvUGVyc29uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU3ODg3NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvUGVyc29uLmphdmEKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50V3JhcHBlcjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLkpzb25UZXN0SGVscGVyOworCisvKioKKyAqIEBhdXRob3IgSmF5IEZlZW5hbiAoamF5LmZlZW5hbiBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJVbnVzZWREZWNsYXJhdGlvbiIpCitAWG1sUm9vdEVsZW1lbnQobmFtZSA9ICJwZXJzb24iKQorQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLlBST1BFUlRZKQorQFhtbFR5cGUocHJvcE9yZGVyID0geyJuYW1lIiwgImNoaWxkcmVuIn0pCitwdWJsaWMgY2xhc3MgUGVyc29uIHsKKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVRlc3RJbnN0YW5jZSgpIHsKKyAgICAgICAgUGVyc29uIGRhdWdodGVyID0gbmV3IFBlcnNvbigpOworICAgICAgICBkYXVnaHRlci5zZXROYW1lKCJKaWxsIFNjaG1vIik7CisKKyAgICAgICAgUGVyc29uIHNvbiA9IG5ldyBQZXJzb24oKTsKKyAgICAgICAgc29uLnNldE5hbWUoIkphY2sgU2NobW8iKTsKKworICAgICAgICBQZXJzb24gcGVyc29uID0gbmV3IFBlcnNvbigpOworICAgICAgICBwZXJzb24uc2V0TmFtZSgiSm9lIFNjaG1vIik7CisgICAgICAgIHBlcnNvbi5zZXRDaGlsZHJlbihuZXcgUGVyc29uW117ZGF1Z2h0ZXIsIHNvbn0pOworCisgICAgICAgIHJldHVybiBwZXJzb247CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoIlNpbXBsaWZpYWJsZUlmU3RhdGVtZW50IikKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFBlcnNvbiBvdGhlciA9IChQZXJzb24pIG9iajsKKyAgICAgICAgaWYgKCh0aGlzLm1fbmFtZSA9PSBudWxsKSA/IChvdGhlci5tX25hbWUgIT0gbnVsbCkgOiAhdGhpcy5tX25hbWUuZXF1YWxzKG90aGVyLm1fbmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gSnNvblRlc3RIZWxwZXIuYXJlQXJyYXlzRXF1YWwobV9jaGlsZHJlbiwgb3RoZXIubV9jaGlsZHJlbik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGhhc2ggPSAzOworICAgICAgICBoYXNoID0gMTkgKiBoYXNoICsgKHRoaXMubV9uYW1lICE9IG51bGwgPyB0aGlzLm1fbmFtZS5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIGhhc2ggPSAxOSAqIGhhc2ggKyAodGhpcy5tX2NoaWxkcmVuICE9IG51bGwgPyBBcnJheXMuaGFzaENvZGUodGhpcy5tX2NoaWxkcmVuKSA6IDApOworICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgie3BlcnNvbjogJXMsICVzfSIsIG1fbmFtZSwgQXJyYXlzLnRvU3RyaW5nKG1fY2hpbGRyZW4pKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBtX25hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICBtX25hbWUgPSBuYW1lOworICAgIH0KKworICAgIEBYbWxFbGVtZW50V3JhcHBlcihuYW1lID0gImNoaWxkcmVuIikKKyAgICBAWG1sRWxlbWVudChuYW1lID0gImNoaWxkIikKKyAgICBwdWJsaWMgUGVyc29uW10gZ2V0Q2hpbGRyZW4oKSB7CisgICAgICAgIHJldHVybiBtX2NoaWxkcmVuOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldENoaWxkcmVuKFBlcnNvbltdIGNoaWxkcmVuKSB7CisgICAgICAgIG1fY2hpbGRyZW4gPSBjaGlsZHJlbjsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBtX25hbWU7CisgICAgcHJpdmF0ZSBQZXJzb25bXSBtX2NoaWxkcmVuOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9QdXJlQ2hhckRhdGFCZWFuLmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L1B1cmVDaGFyRGF0YUJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzIxODM0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9QdXJlQ2hhckRhdGFCZWFuLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHk7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVmFsdWU7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFN1cHByZXNzV2FybmluZ3MoeyJSZWR1bmRhbnRJZlN0YXRlbWVudCIsICJTdHJpbmdFcXVhbGl0eSJ9KQorQFhtbFJvb3RFbGVtZW50CitwdWJsaWMgY2xhc3MgUHVyZUNoYXJEYXRhQmVhbiB7CisKKyAgICBAWG1sVmFsdWUKKyAgICBwdWJsaWMgU3RyaW5nIGNvbnRlbnQ7CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVUZXN0SW5zdGFuY2UoKSB7CisgICAgICAgIFB1cmVDaGFyRGF0YUJlYW4gaW5zdGFuY2UgPSBuZXcgUHVyZUNoYXJEYXRhQmVhbigpOworICAgICAgICBpbnN0YW5jZS5jb250ZW50ID0gInNvbWUgdGV4dHVhbCBjb250ZW50IjsKKyAgICAgICAgcmV0dXJuIGluc3RhbmNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgUHVyZUNoYXJEYXRhQmVhbiBvdGhlciA9IChQdXJlQ2hhckRhdGFCZWFuKSBvYmo7CisgICAgICAgIGlmICh0aGlzLmNvbnRlbnQgIT0gb3RoZXIuY29udGVudCAmJiAodGhpcy5jb250ZW50ID09IG51bGwgfHwgIXRoaXMuY29udGVudC5lcXVhbHMob3RoZXIuY29udGVudCkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGhhc2ggPSA3OworICAgICAgICBoYXNoID0gNTkgKiBoYXNoICsgKHRoaXMuY29udGVudCAhPSBudWxsID8gdGhpcy5jb250ZW50Lmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9SZWdpc3Rlck1lc3NhZ2UuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvUmVnaXN0ZXJNZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhiNTMzMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvUmVnaXN0ZXJNZXNzYWdlLmphdmEKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHk7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCisvKioKKyAqIEBhdXRob3IgRGF2aWQgS2FzcGFyCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJSZWR1bmRhbnRJZlN0YXRlbWVudCIpCitAWG1sUm9vdEVsZW1lbnQKK3B1YmxpYyBmaW5hbCBjbGFzcyBSZWdpc3Rlck1lc3NhZ2UgeworCisgICAgQFhtbEF0dHJpYnV0ZQorICAgIHB1YmxpYyBTdHJpbmcgYWdlbnRVSUQ7CisKKyAgICBAWG1sQXR0cmlidXRlCisgICAgcHVibGljIGxvbmcgcmVxdWVzdFRpbWU7CisKKyAgICBwdWJsaWMgUmVnaXN0ZXJNZXNzYWdlKCkgeworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgUmVnaXN0ZXJNZXNzYWdlIG90aGVyID0gKFJlZ2lzdGVyTWVzc2FnZSkgb2JqOworICAgICAgICBpZiAoKHRoaXMuYWdlbnRVSUQgPT0gbnVsbCkgPyAob3RoZXIuYWdlbnRVSUQgIT0gbnVsbCkgOiAhdGhpcy5hZ2VudFVJRC5lcXVhbHMob3RoZXIuYWdlbnRVSUQpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMucmVxdWVzdFRpbWUgIT0gb3RoZXIucmVxdWVzdFRpbWUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IDc7CisgICAgICAgIGhhc2ggPSA4OSAqIGhhc2ggKyAodGhpcy5hZ2VudFVJRCAhPSBudWxsID8gdGhpcy5hZ2VudFVJRC5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIGhhc2ggPSA4OSAqIGhhc2ggKyAoaW50KSAodGhpcy5yZXF1ZXN0VGltZSBeICh0aGlzLnJlcXVlc3RUaW1lID4+PiAzMikpOworICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgie1wiYWdlbnRVSURcIjpcIiVzXCIsIFwicmVxdWVzdFRpbWVcIjolZH0iLCBhZ2VudFVJRCwgcmVxdWVzdFRpbWUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVRlc3RJbnN0YW5jZSgpIHsKKyAgICAgICAgUmVnaXN0ZXJNZXNzYWdlIHJtID0gbmV3IFJlZ2lzdGVyTWVzc2FnZSgpOworICAgICAgICBybS5hZ2VudFVJRCA9ICJhZ2VudEtvY2thIjsKKyAgICAgICAgcm0ucmVxdWVzdFRpbWUgPSAxMjM0TDsKKyAgICAgICAgcmV0dXJuIHJtOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9TaW1wbGVCZWFuLmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L1NpbXBsZUJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTI1MWRhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9TaW1wbGVCZWFuLmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHk7CisKK2ltcG9ydCBqYXZhLnV0aWwuRm9ybWF0dGVyOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFN1cHByZXNzV2FybmluZ3MoeyJSZWR1bmRhbnRJZlN0YXRlbWVudCIsICJTdHJpbmdFcXVhbGl0eSJ9KQorQFhtbFJvb3RFbGVtZW50KG5hbWUgPSAiRHVtbXlPbmUiKQorcHVibGljIGNsYXNzIFNpbXBsZUJlYW4geworCisgICAgQFhtbEVsZW1lbnQKKyAgICBwdWJsaWMgU3RyaW5nIGNoaWxkOworCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlVGVzdEluc3RhbmNlKCkgeworICAgICAgICBTaW1wbGVCZWFuIGluc3RhbmNlID0gbmV3IFNpbXBsZUJlYW4oKTsKKyAgICAgICAgaW5zdGFuY2UuY2hpbGQgPSAic2ltcGxlIjsKKyAgICAgICAgcmV0dXJuIGluc3RhbmNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgU2ltcGxlQmVhbiBvdGhlciA9IChTaW1wbGVCZWFuKSBvYmo7CisgICAgICAgIGlmICh0aGlzLmNoaWxkICE9IG90aGVyLmNoaWxkICYmICh0aGlzLmNoaWxkID09IG51bGwgfHwgIXRoaXMuY2hpbGQuZXF1YWxzKG90aGVyLmNoaWxkKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IDc7CisgICAgICAgIGhhc2ggPSA2NyAqIGhhc2ggKyAodGhpcy5jaGlsZCAhPSBudWxsID8gdGhpcy5jaGlsZC5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIHJldHVybiBoYXNoOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAobmV3IEZvcm1hdHRlcigpKS5mb3JtYXQoIlNCKCVzKSIsIGNoaWxkKS50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvU2ltcGxlQmVhbldpdGhBdHRyaWJ1dGVzLmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L1NpbXBsZUJlYW5XaXRoQXR0cmlidXRlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwODY3MzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L1NpbXBsZUJlYW5XaXRoQXR0cmlidXRlcy5qYXZhCkBAIC0wLDAgKzEsMTA1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eTsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5VUklTeW50YXhFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkZvcm1hdHRlcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCisvKioKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKHsiU3RyaW5nRXF1YWxpdHkiLCAiUmVkdW5kYW50SWZTdGF0ZW1lbnQifSkKK0BYbWxSb290RWxlbWVudAorcHVibGljIGNsYXNzIFNpbXBsZUJlYW5XaXRoQXR0cmlidXRlcyB7CisKKyAgICBAWG1sQXR0cmlidXRlCisgICAgcHVibGljIFVSSSB1cmk7CisgICAgcHVibGljIFN0cmluZyBzMTsKKyAgICBAWG1sQXR0cmlidXRlCisgICAgcHVibGljIGludCBpOworICAgIEBYbWxBdHRyaWJ1dGUKKyAgICBwdWJsaWMgU3RyaW5nIGo7CisKKyAgICBwdWJsaWMgU2ltcGxlQmVhbldpdGhBdHRyaWJ1dGVzKCkgeworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVRlc3RJbnN0YW5jZSgpIHsKKyAgICAgICAgU2ltcGxlQmVhbldpdGhBdHRyaWJ1dGVzIGluc3RhbmNlID0gbmV3IFNpbXBsZUJlYW5XaXRoQXR0cmlidXRlcygpOworICAgICAgICBpbnN0YW5jZS5zMSA9ICJoaSB0aGVyZSI7CisgICAgICAgIGluc3RhbmNlLmkgPSAzMTI7CisgICAgICAgIGluc3RhbmNlLmogPSAiYnVtcGVyIjsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgaW5zdGFuY2UudXJpID0gbmV3IFVSSSgiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyIpOworICAgICAgICB9IGNhdGNoIChVUklTeW50YXhFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoU2ltcGxlQmVhbldpdGhBdHRyaWJ1dGVzLmNsYXNzLmdldE5hbWUoKSkubG9nKExldmVsLlNFVkVSRSwgbnVsbCwgZXgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGluc3RhbmNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgU2ltcGxlQmVhbldpdGhBdHRyaWJ1dGVzIG90aGVyID0gKFNpbXBsZUJlYW5XaXRoQXR0cmlidXRlcykgb2JqOworICAgICAgICBpZiAodGhpcy5zMSAhPSBvdGhlci5zMSAmJiAodGhpcy5zMSA9PSBudWxsIHx8ICF0aGlzLnMxLmVxdWFscyhvdGhlci5zMSkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMuaiAhPSBvdGhlci5qICYmICh0aGlzLmogPT0gbnVsbCB8fCAhdGhpcy5qLmVxdWFscyhvdGhlci5qKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy51cmkgIT0gb3RoZXIudXJpICYmICh0aGlzLnVyaSA9PSBudWxsIHx8ICF0aGlzLnVyaS5lcXVhbHMob3RoZXIudXJpKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5pICE9IG90aGVyLmkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IDc7CisgICAgICAgIGlmIChudWxsICE9IHMxKSB7CisgICAgICAgICAgICBoYXNoICs9IDE3ICogczEuaGFzaENvZGUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobnVsbCAhPSBqKSB7CisgICAgICAgICAgICBoYXNoICs9IDE3ICogai5oYXNoQ29kZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChudWxsICE9IHVyaSkgeworICAgICAgICAgICAgaGFzaCArPSAxNyAqIHVyaS5oYXNoQ29kZSgpOworICAgICAgICB9CisgICAgICAgIGhhc2ggKz0gMTMgKiBpOworICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gKG5ldyBGb3JtYXR0ZXIoKSkuZm9ybWF0KCJTQldBKCVzLCVkLCVzLCVzKSIsIHMxLCBpLCBqLCB1cmkpLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGUuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMyMDdhYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlLmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHk7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5uZXQuVVJJU3ludGF4RXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQXR0cmlidXRlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFN1cHByZXNzV2FybmluZ3MoIlJlZHVuZGFudElmU3RhdGVtZW50IikKK0BYbWxSb290RWxlbWVudAorcHVibGljIGNsYXNzIFNpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZSB7CisKKyAgICBAWG1sQXR0cmlidXRlCisgICAgcHVibGljIFVSSSB1cmk7CisKKyAgICBwdWJsaWMgU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlKCkgeworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVRlc3RJbnN0YW5jZSgpIHsKKyAgICAgICAgU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlIGluc3RhbmNlID0gbmV3IFNpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZSgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnN0YW5jZS51cmkgPSBuZXcgVVJJKCJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIik7CisgICAgICAgIH0gY2F0Y2ggKFVSSVN5bnRheEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihTaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGUuY2xhc3MuZ2V0TmFtZSgpKS5sb2coTGV2ZWwuU0VWRVJFLCBudWxsLCBleCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gaW5zdGFuY2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBTaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGUgb3RoZXIgPSAoU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlKSBvYmo7CisgICAgICAgIGlmICh0aGlzLnVyaSAhPSBvdGhlci51cmkgJiYgKHRoaXMudXJpID09IG51bGwgfHwgIXRoaXMudXJpLmVxdWFscyhvdGhlci51cmkpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCBoYXNoID0gNzsKKyAgICAgICAgaWYgKG51bGwgIT0gdXJpKSB7CisgICAgICAgICAgICBoYXNoICs9IDE3ICogdXJpLmhhc2hDb2RlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIlNCV0pPQSglcykiLCB1cmkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlQW5kVmFsdWUuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlQW5kVmFsdWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWM3OTRmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVBbmRWYWx1ZS5qYXZhCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5OworCitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmV0LlVSSVN5bnRheEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVmFsdWU7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFN1cHByZXNzV2FybmluZ3MoeyJSZWR1bmRhbnRJZlN0YXRlbWVudCIsICJTdHJpbmdFcXVhbGl0eSJ9KQorQFhtbFJvb3RFbGVtZW50CitwdWJsaWMgY2xhc3MgU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlQW5kVmFsdWUgeworCisgICAgQFhtbEF0dHJpYnV0ZQorICAgIHB1YmxpYyBVUkkgdXJpOworICAgIEBYbWxWYWx1ZQorICAgIHB1YmxpYyBTdHJpbmcgdmFsdWU7CisKKyAgICBwdWJsaWMgU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlQW5kVmFsdWUoKSB7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlVGVzdEluc3RhbmNlKCkgeworICAgICAgICBTaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVBbmRWYWx1ZSBpbnN0YW5jZSA9IG5ldyBTaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVBbmRWYWx1ZSgpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBpbnN0YW5jZS51cmkgPSBuZXcgVVJJKCJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIik7CisgICAgICAgICAgICBpbnN0YW5jZS52YWx1ZSA9ICJjaGFyYWN0ZXJzIjsKKyAgICAgICAgfSBjYXRjaCAoVVJJU3ludGF4RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKFNpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZUFuZFZhbHVlLmNsYXNzLmdldE5hbWUoKSkubG9nKExldmVsLlNFVkVSRSwgbnVsbCwgZXgpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGluc3RhbmNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlQW5kVmFsdWUgb3RoZXIgPSAoU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlQW5kVmFsdWUpIG9iajsKKyAgICAgICAgaWYgKHRoaXMudXJpICE9IG90aGVyLnVyaSAmJiAodGhpcy51cmkgPT0gbnVsbCB8fCAhdGhpcy51cmkuZXF1YWxzKG90aGVyLnVyaSkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMudmFsdWUgIT0gb3RoZXIudmFsdWUgJiYgKHRoaXMudmFsdWUgPT0gbnVsbCB8fCAhdGhpcy52YWx1ZS5lcXVhbHMob3RoZXIudmFsdWUpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCBoYXNoID0gNzsKKyAgICAgICAgaWYgKG51bGwgIT0gdXJpKSB7CisgICAgICAgICAgICBoYXNoICs9IDE3ICogdXJpLmhhc2hDb2RlKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG51bGwgIT0gdmFsdWUpIHsKKyAgICAgICAgICAgIGhhc2ggKz0gMTcgKiB2YWx1ZS5oYXNoQ29kZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBoYXNoOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJTQldKT0FWKCVzLCVzKSIsIHVyaSwgdmFsdWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvU2ltcGxlQmVhbldpdGhPYmplY3RBdHRyaWJ1dGVzLmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L1NpbXBsZUJlYW5XaXRoT2JqZWN0QXR0cmlidXRlcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMTBkZjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L1NpbXBsZUJlYW5XaXRoT2JqZWN0QXR0cmlidXRlcy5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5OworCitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5Gb3JtYXR0ZXI7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAU3VwcHJlc3NXYXJuaW5ncyh7IlN0cmluZ0VxdWFsaXR5IiwgIlJlZHVuZGFudElmU3RhdGVtZW50IiwgIk51bWJlckVxdWFsaXR5In0pCitAWG1sUm9vdEVsZW1lbnQKK3B1YmxpYyBjbGFzcyBTaW1wbGVCZWFuV2l0aE9iamVjdEF0dHJpYnV0ZXMgeworCisgICAgQFhtbEF0dHJpYnV0ZQorICAgIHB1YmxpYyBVUkkgdXJpOworICAgIHB1YmxpYyBTdHJpbmcgczE7CisgICAgQFhtbEF0dHJpYnV0ZQorICAgIHB1YmxpYyBJbnRlZ2VyIGk7CisgICAgQFhtbEF0dHJpYnV0ZQorICAgIHB1YmxpYyBTdHJpbmcgajsKKworICAgIHB1YmxpYyBTaW1wbGVCZWFuV2l0aE9iamVjdEF0dHJpYnV0ZXMoKSB7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlVGVzdEluc3RhbmNlKCkgeworICAgICAgICByZXR1cm4gbmV3IFNpbXBsZUJlYW5XaXRoT2JqZWN0QXR0cmlidXRlcygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgU2ltcGxlQmVhbldpdGhPYmplY3RBdHRyaWJ1dGVzIG90aGVyID0gKFNpbXBsZUJlYW5XaXRoT2JqZWN0QXR0cmlidXRlcykgb2JqOworICAgICAgICBpZiAodGhpcy5zMSAhPSBvdGhlci5zMSAmJiAodGhpcy5zMSA9PSBudWxsIHx8ICF0aGlzLnMxLmVxdWFscyhvdGhlci5zMSkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMuaiAhPSBvdGhlci5qICYmICh0aGlzLmogPT0gbnVsbCB8fCAhdGhpcy5qLmVxdWFscyhvdGhlci5qKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy51cmkgIT0gb3RoZXIudXJpICYmICh0aGlzLnVyaSA9PSBudWxsIHx8ICF0aGlzLnVyaS5lcXVhbHMob3RoZXIudXJpKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5pICE9IG90aGVyLmkgJiYgKHRoaXMuaSA9PSBudWxsIHx8ICF0aGlzLmkuZXF1YWxzKG90aGVyLmkpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCBoYXNoID0gNzsKKyAgICAgICAgaWYgKG51bGwgIT0gczEpIHsKKyAgICAgICAgICAgIGhhc2ggKz0gMTcgKiBzMS5oYXNoQ29kZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChudWxsICE9IGopIHsKKyAgICAgICAgICAgIGhhc2ggKz0gMTcgKiBqLmhhc2hDb2RlKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG51bGwgIT0gdXJpKSB7CisgICAgICAgICAgICBoYXNoICs9IDE3ICogdXJpLmhhc2hDb2RlKCk7CisgICAgICAgIH0KKyAgICAgICAgaGFzaCArPSAxMyAqIGk7CisgICAgICAgIHJldHVybiBoYXNoOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAobmV3IEZvcm1hdHRlcigpKS5mb3JtYXQoIlNCV09BKCVzLCVkLCVzLCVzKSIsIHMxLCBpLCBqLCB1cmkpLnRvU3RyaW5nKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9TaW1wbGVYbWxUeXBlQmVhbi5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9TaW1wbGVYbWxUeXBlQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyY2Y5YWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L1NpbXBsZVhtbFR5cGVCZWFuLmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHk7CisKK2ltcG9ydCBqYXZhLnV0aWwuRm9ybWF0dGVyOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHlwZTsKKworLyoqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAU3VwcHJlc3NXYXJuaW5ncyh7IlN0cmluZ0VxdWFsaXR5IiwgIlJlZHVuZGFudElmU3RhdGVtZW50In0pCitAWG1sVHlwZQorcHVibGljIGNsYXNzIFNpbXBsZVhtbFR5cGVCZWFuIHsKKworICAgIEBYbWxFbGVtZW50CisgICAgcHVibGljIFN0cmluZyBjaGlsZDsKKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVRlc3RJbnN0YW5jZSgpIHsKKyAgICAgICAgU2ltcGxlWG1sVHlwZUJlYW4gaW5zdGFuY2UgPSBuZXcgU2ltcGxlWG1sVHlwZUJlYW4oKTsKKyAgICAgICAgaW5zdGFuY2UuY2hpbGQgPSAic2ltcGxlIjsKKyAgICAgICAgcmV0dXJuIGluc3RhbmNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgU2ltcGxlWG1sVHlwZUJlYW4gb3RoZXIgPSAoU2ltcGxlWG1sVHlwZUJlYW4pIG9iajsKKyAgICAgICAgaWYgKHRoaXMuY2hpbGQgIT0gb3RoZXIuY2hpbGQgJiYgKHRoaXMuY2hpbGQgPT0gbnVsbCB8fCAhdGhpcy5jaGlsZC5lcXVhbHMob3RoZXIuY2hpbGQpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCBoYXNoID0gNzsKKyAgICAgICAgaGFzaCA9IDY3ICogaGFzaCArICh0aGlzLmNoaWxkICE9IG51bGwgPyB0aGlzLmNoaWxkLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIChuZXcgRm9ybWF0dGVyKCkpLmZvcm1hdCgiU0VUQiglcykiLCBjaGlsZCkudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L1NpbmdsZUl0ZW1MaXN0V3JhcHBlckJlYW4uamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvU2luZ2xlSXRlbUxpc3RXcmFwcGVyQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3ZjE0YTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L1NpbmdsZUl0ZW1MaXN0V3JhcHBlckJlYW4uamF2YQpAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eTsKKworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworLyoqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAU3VwcHJlc3NXYXJuaW5ncygiUmVkdW5kYW50SWZTdGF0ZW1lbnQiKQorQFhtbFJvb3RFbGVtZW50KG5hbWUgPSAic2luZ2xlSXRlbUxpc3RXcmFwcGVyIikKK3B1YmxpYyBjbGFzcyBTaW5nbGVJdGVtTGlzdFdyYXBwZXJCZWFuIHsKKworICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gc2luZ2xlSXRlbUxpc3Q7CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVUZXN0SW5zdGFuY2UoKSB7CisgICAgICAgIFNpbmdsZUl0ZW1MaXN0V3JhcHBlckJlYW4gaW5zdGFuY2UgPSBuZXcgU2luZ2xlSXRlbUxpc3RXcmFwcGVyQmVhbigpOworICAgICAgICBpbnN0YW5jZS5zaW5nbGVJdGVtTGlzdCA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICAgICAgaW5zdGFuY2Uuc2luZ2xlSXRlbUxpc3QuYWRkKCIxIik7CisgICAgICAgIHJldHVybiBpbnN0YW5jZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFNpbmdsZUl0ZW1MaXN0V3JhcHBlckJlYW4gb3RoZXIgPSAoU2luZ2xlSXRlbUxpc3RXcmFwcGVyQmVhbikgb2JqOworICAgICAgICBpZiAodGhpcy5zaW5nbGVJdGVtTGlzdCAhPSBvdGhlci5zaW5nbGVJdGVtTGlzdCAmJiAodGhpcy5zaW5nbGVJdGVtTGlzdCA9PSBudWxsIHx8ICF0aGlzLnNpbmdsZUl0ZW1MaXN0CisgICAgICAgICAgICAgICAgLmVxdWFscyhvdGhlci5zaW5nbGVJdGVtTGlzdCkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGhhc2ggPSA3OworICAgICAgICBoYXNoID0gNTkgKiBoYXNoICsgKHRoaXMuc2luZ2xlSXRlbUxpc3QgIT0gbnVsbCA/IHRoaXMuc2luZ2xlSXRlbUxpc3QuaGFzaENvZGUoKSA6IDApOworICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgie3NpbmdsZUl0ZW1MaXN0V3JhcHBlckJlYW46e2w6JXN9fSIsIHNpbmdsZUl0ZW1MaXN0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L1RyZWVNb2RlbC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9UcmVlTW9kZWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzlkYzBmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9UcmVlTW9kZWwuamF2YQpAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHk7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uSnNvblRlc3RIZWxwZXI7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiIsICJSZWR1bmRhbnRJZlN0YXRlbWVudCJ9KQorQFhtbFJvb3RFbGVtZW50CitwdWJsaWMgY2xhc3MgVHJlZU1vZGVsIHsKKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24iLCAiU3RyaW5nRXF1YWxpdHkiLCAiUmVkdW5kYW50SWZTdGF0ZW1lbnQifSkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5vZGUgeworCisgICAgICAgIEBYbWxFbGVtZW50CisgICAgICAgIHB1YmxpYyBTdHJpbmcgbGFiZWw7CisgICAgICAgIEBYbWxFbGVtZW50CisgICAgICAgIHB1YmxpYyBib29sZWFuIGV4cGFuZGVkOworICAgICAgICBAWG1sRWxlbWVudAorICAgICAgICBwdWJsaWMgTGlzdDxOb2RlPiBjaGlsZHJlbjsKKworICAgICAgICBwdWJsaWMgTm9kZSgpIHsKKyAgICAgICAgICAgIHRoaXMoImR1bW15IG5vZGUiLCBudWxsKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBOb2RlKFN0cmluZyBsYWJlbCkgeworICAgICAgICAgICAgdGhpcyhsYWJlbCwgbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTm9kZShTdHJpbmcgbGFiZWwsIENvbGxlY3Rpb248Tm9kZT4gY2hpbGRyZW4pIHsKKyAgICAgICAgICAgIHRoaXMubGFiZWwgPSBsYWJlbDsKKyAgICAgICAgICAgIGlmICghSnNvblRlc3RIZWxwZXIuaXNDb2xsZWN0aW9uRW1wdHkoY2hpbGRyZW4pKSB7CisgICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0PE5vZGU+KCk7CisgICAgICAgICAgICAgICAgdGhpcy5jaGlsZHJlbi5hZGRBbGwoY2hpbGRyZW4pOworICAgICAgICAgICAgICAgIGV4cGFuZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgaW50IHJlc3VsdCA9IDEzOworICAgICAgICAgICAgcmVzdWx0ICs9IDE3ICogbGFiZWwuaGFzaENvZGUoKTsKKyAgICAgICAgICAgIGlmICghSnNvblRlc3RIZWxwZXIuaXNDb2xsZWN0aW9uRW1wdHkoY2hpbGRyZW4pKSB7CisgICAgICAgICAgICAgICAgZm9yIChOb2RlIG4gOiBjaGlsZHJlbikgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSA1ICsgMTcgKiBuLmhhc2hDb2RlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgTm9kZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBOb2RlIG90aGVyID0gKE5vZGUpIG9iajsKKyAgICAgICAgICAgIGlmICh0aGlzLmxhYmVsICE9IG90aGVyLmxhYmVsICYmICh0aGlzLmxhYmVsID09IG51bGwgfHwgIXRoaXMubGFiZWwuZXF1YWxzKG90aGVyLmxhYmVsKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHRoaXMuY2hpbGRyZW4gIT0gb3RoZXIuY2hpbGRyZW4KKyAgICAgICAgICAgICAgICAgICAgJiYgSnNvblRlc3RIZWxwZXIuaXNDb2xsZWN0aW9uRW1wdHkodGhpcy5jaGlsZHJlbikgIT0gSnNvblRlc3RIZWxwZXIuaXNDb2xsZWN0aW9uRW1wdHkob3RoZXIuY2hpbGRyZW4pKQorICAgICAgICAgICAgICAgICAgICAmJiAodGhpcy5jaGlsZHJlbiA9PSBudWxsIHx8ICF0aGlzLmNoaWxkcmVuLmVxdWFscyhvdGhlci5jaGlsZHJlbikpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSAiKCIgKyBsYWJlbCArICI6IjsKKyAgICAgICAgICAgIGlmICghSnNvblRlc3RIZWxwZXIuaXNDb2xsZWN0aW9uRW1wdHkoY2hpbGRyZW4pKSB7CisgICAgICAgICAgICAgICAgZm9yIChOb2RlIG4gOiBjaGlsZHJlbikgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgKz0gbi50b1N0cmluZygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgIikiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgIjAgY2hpbGRyZW4pIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBYbWxFbGVtZW50CisgICAgcHVibGljIE5vZGUgcm9vdDsKKworICAgIHB1YmxpYyBUcmVlTW9kZWwoKSB7CisgICAgfQorCisgICAgcHVibGljIFRyZWVNb2RlbChOb2RlIHJvb3QpIHsKKyAgICAgICAgdGhpcy5yb290ID0gcm9vdDsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVUZXN0SW5zdGFuY2UoKSB7CisgICAgICAgIFRyZWVNb2RlbCBpbnN0YW5jZSA9IG5ldyBUcmVlTW9kZWwoKTsKKyAgICAgICAgaW5zdGFuY2Uucm9vdCA9IG5ldyBOb2RlKCk7CisgICAgICAgIHJldHVybiBpbnN0YW5jZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpZiAobnVsbCAhPSByb290KSB7CisgICAgICAgICAgICByZXR1cm4gNyArIHJvb3QuaGFzaENvZGUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiA3OworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgVHJlZU1vZGVsKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFRyZWVNb2RlbCBvdGhlciA9IChUcmVlTW9kZWwpIG9iajsKKyAgICAgICAgaWYgKHRoaXMucm9vdCAhPSBvdGhlci5yb290ICYmICh0aGlzLnJvb3QgPT0gbnVsbCB8fCAhdGhpcy5yb290LmVxdWFscyhvdGhlci5yb290KSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gKG51bGwgIT0gcm9vdCkgPyByb290LnRvU3RyaW5nKCkgOiAiKE5VTExfUk9PVCkiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvVHdvTGlzdHNXcmFwcGVyQmVhbi5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Ud29MaXN0c1dyYXBwZXJCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTliNzZmMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvVHdvTGlzdHNXcmFwcGVyQmVhbi5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5OworCitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCisvKioKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJSZWR1bmRhbnRJZlN0YXRlbWVudCIpCitAWG1sUm9vdEVsZW1lbnQobmFtZSA9ICJpdGVtMiIpCitwdWJsaWMgY2xhc3MgVHdvTGlzdHNXcmFwcGVyQmVhbiB7CisKKyAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IHByb3BlcnR5MSwgcHJvcGVydHkyOworCisgICAgcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlVGVzdEluc3RhbmNlKCkgeworICAgICAgICBUd29MaXN0c1dyYXBwZXJCZWFuIGluc3RhbmNlID0gbmV3IFR3b0xpc3RzV3JhcHBlckJlYW4oKTsKKyAgICAgICAgaW5zdGFuY2UucHJvcGVydHkxID0gbmV3IExpbmtlZExpc3Q8U3RyaW5nPigpOworICAgICAgICBpbnN0YW5jZS5wcm9wZXJ0eTEuYWRkKCJhMSIpOworICAgICAgICBpbnN0YW5jZS5wcm9wZXJ0eTEuYWRkKCJhMSIpOworICAgICAgICBpbnN0YW5jZS5wcm9wZXJ0eTIgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCk7CisgICAgICAgIGluc3RhbmNlLnByb3BlcnR5Mi5hZGQoImIxIik7CisgICAgICAgIHJldHVybiBpbnN0YW5jZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFR3b0xpc3RzV3JhcHBlckJlYW4gb3RoZXIgPSAoVHdvTGlzdHNXcmFwcGVyQmVhbikgb2JqOworICAgICAgICBpZiAodGhpcy5wcm9wZXJ0eTEgIT0gb3RoZXIucHJvcGVydHkxICYmICh0aGlzLnByb3BlcnR5MSA9PSBudWxsIHx8ICF0aGlzLnByb3BlcnR5MS5lcXVhbHMob3RoZXIucHJvcGVydHkxKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5wcm9wZXJ0eTIgIT0gb3RoZXIucHJvcGVydHkyICYmICh0aGlzLnByb3BlcnR5MiA9PSBudWxsIHx8ICF0aGlzLnByb3BlcnR5Mi5lcXVhbHMob3RoZXIucHJvcGVydHkyKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IDc7CisgICAgICAgIGhhc2ggPSA1OSAqIGhhc2ggKyAodGhpcy5wcm9wZXJ0eTEgIT0gbnVsbCA/IHRoaXMucHJvcGVydHkxLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgaGFzaCA9IDU5ICogaGFzaCArICh0aGlzLnByb3BlcnR5MiAhPSBudWxsID8gdGhpcy5wcm9wZXJ0eTIuaGFzaENvZGUoKSA6IDApOworICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgie3R3b0xpc3RzV3JhcHBlckJlYW46e3Byb3BlcnR5MTolcywgcHJvcGVydHkyOiVzfX0iLCBwcm9wZXJ0eTEsIHByb3BlcnR5Mik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L1VzZXIuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvVXNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZjA2NDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L1VzZXIuamF2YQpAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eTsKKworaW1wb3J0IGphdmF4Lmpzb24uYmluZC5hbm5vdGF0aW9uLkpzb25iVHJhbnNpZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sVHJhbnNpZW50OworCisvKioKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKHsiU3RyaW5nRXF1YWxpdHkiLCAiUmVkdW5kYW50SWZTdGF0ZW1lbnQiLCAiVW51c2VkRGVjbGFyYXRpb24ifSkKK0BYbWxSb290RWxlbWVudAorcHVibGljIGNsYXNzIFVzZXIgeworCisgICAgQFhtbEVsZW1lbnQobmFtZSA9ICJ1c2VyaWQiKQorICAgIHB1YmxpYyBTdHJpbmcgaWQ7CisgICAgcHVibGljIFN0cmluZyBuYW1lOworICAgIEBYbWxUcmFuc2llbnQKKyAgICBASnNvbmJUcmFuc2llbnQKKyAgICBwdWJsaWMgU3RyaW5nIHBhc3N3b3JkOworCisgICAgcHVibGljIFVzZXIoKSB7CisgICAgfQorCisgICAgcHVibGljIFVzZXIoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHBhc3N3b3JkKSB7CisgICAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5wYXNzd29yZCA9IHBhc3N3b3JkOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFVzZXIpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgVXNlciBvdGhlciA9IChVc2VyKSBvYmo7CisgICAgICAgIGlmICh0aGlzLmlkICE9IG90aGVyLmlkICYmICh0aGlzLmlkID09IG51bGwgfHwgIXRoaXMuaWQuZXF1YWxzKG90aGVyLmlkKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5uYW1lICE9IG90aGVyLm5hbWUgJiYgKHRoaXMubmFtZSA9PSBudWxsIHx8ICF0aGlzLm5hbWUuZXF1YWxzKG90aGVyLm5hbWUpKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCBoYXNoID0gMzsKKyAgICAgICAgaWYgKG51bGwgIT0gaWQpIHsKKyAgICAgICAgICAgIGhhc2ggPSAxNyAqIGhhc2ggKyBpZC5oYXNoQ29kZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChudWxsICE9IG5hbWUpIHsKKyAgICAgICAgICAgIGhhc2ggPSAxNyAqIGhhc2ggKyBuYW1lLmhhc2hDb2RlKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJVc2VyKCIgKyBpZCArICIsICIgKyBuYW1lICsgIikiOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVRlc3RJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBVc2VyKCIxNjIxIiwgIkdyb3RlZmVuZCIsICJQZXJzZXBvbGlzIik7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L1VzZXJUYWJsZS5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Vc2VyVGFibGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzdkMTFjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Vc2VyVGFibGUuamF2YQpAQCAtMCwwICsxLDE4NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHk7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLkpzb25UZXN0SGVscGVyOworCisvKioKKyAqIE5vdGU6IFdpdGggTU9YeSB3ZSBuZWVkIHRvIGVuc3VyZSB0aGF0IGNvbGxlY3Rpb25zIChhIGxpc3QgaW4gdGhpcyBjYXNlKSB3aXRoIHByZWRlZmluZWQgdmFsdWVzIChhc3NpZ25lZCB0byB0aGUgbGlzdCBkdXJpbmcKKyAqIG9iamVjdCBpbml0aWFsaXphdGlvbikgYXJlIGVpdGhlciB1bmluaXRpYWxpemVkIG9yIGVtcHR5IGR1cmluZyB0aGUgb2JqZWN0IGNyZWF0aW9uLCBvdGhlcndpc2UgdGhlcmUgaXMgYSBwb3NzaWJpbGl0eSB0aGF0CisgKiB0aGVzZSBkZWZhdWx0IHZhbHVlcyBhcmUgZG91YmxlZCBpbiB0aGUgbGlzdCAobGlzdCBpcyBmaWxsZWQgd2l0aCBkZWZhdWx0IHZhbHVlcyB3aGVuIGEgbmV3IGluc3RhbmNlIGlzIGNyZWF0ZWQgYW5kIGFmdGVyCisgKiB1bm1hcnNoYWxsaW5nIFhNTC9KU09OIHN0cmVhbSBhZGRpdGlvbmFsIGVsZW1lbnRzIGFyZSBhZGRlZCB0byB0aGlzIGxpc3QgLSBNT1h5IGRvZXNuJ3Qgb3ZlcnJpZGUgdGhlIGV4aXN0aW5nIGxpc3Qgd2l0aCBhCisgKiBuZXcgb25lIGNyZWF0ZWQgZHVyaW5nIHVubWFyc2hhbGxpbmcpLgorICogPHAvPgorICogV29ya2Fyb3VuZDogU2V0IHtAbGluayBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZX0gdG8ge0BsaW5rIGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZSNGSUVMRH0sCisgKiBkbyBub3QgaW5pdGlhbGl6ZSB0aGUgbGlzdCBpbiB0aGUgZGVmYXVsdCBjb25zdHJ1Y3RvcgorICogKGZpZWxkIGluaXRpYWxpemVyKSBhbmQgYXNzaWduIHRoZSB2YWx1ZSB0byB0aGUgbGlzdCB0aGF0IHNob3VsZCBjb250YWluIHByZWRlZmluZWQgdmFsdWVzIG1hbnVhbGx5IChpbiB0aGlzIGNhc2UgdGhlIHZhbHVlCisgKiBvYmplY3QgaXMgcmVwcmVzZW50ZWQgYnkge0Bjb2RlICNERUZBVUxUX0hFQURFUlN9KS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJVbnVzZWREZWNsYXJhdGlvbiIpCitAWG1sUm9vdEVsZW1lbnQKK0BYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKK3B1YmxpYyBjbGFzcyBVc2VyVGFibGUgeworCisgICAgQFN1cHByZXNzV2FybmluZ3MoIlJlZHVuZGFudElmU3RhdGVtZW50IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpNYWtpVGFibGVIZWFkZXIgeworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgaWQ7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgbGFiZWw7CisKKyAgICAgICAgcHVibGljIEpNYWtpVGFibGVIZWFkZXIoKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSk1ha2lUYWJsZUhlYWRlcihTdHJpbmcgaWQsIFN0cmluZyBsYWJlbCkgeworICAgICAgICAgICAgdGhpcy5pZCA9IGlkOworICAgICAgICAgICAgdGhpcy5sYWJlbCA9IGxhYmVsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICBpbnQgaGFzaCA9IDEzOworICAgICAgICAgICAgaGFzaCA9IGlkICE9IG51bGwgPyAyOSAqIGlkLmhhc2hDb2RlKCkgOiBoYXNoOworICAgICAgICAgICAgaGFzaCA9IGxhYmVsICE9IG51bGwgPyAyOSAqIGxhYmVsLmhhc2hDb2RlKCkgOiBoYXNoOworICAgICAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIEpNYWtpVGFibGVIZWFkZXIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSk1ha2lUYWJsZUhlYWRlciB0aGF0ID0gKEpNYWtpVGFibGVIZWFkZXIpIG9iajsKKworICAgICAgICAgICAgaWYgKChpZCAhPSBudWxsICYmICFpZC5lcXVhbHModGhhdC5pZCkpICYmIHRoYXQuaWQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgobGFiZWwgIT0gbnVsbCAmJiAhbGFiZWwuZXF1YWxzKHRoYXQubGFiZWwpKSAmJiB0aGF0LmxhYmVsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIkpNYWtpVGFibGVIZWFkZXIoaWQgPSAiICsgaWQgKyAiLCBsYWJlbCA9ICIgKyBsYWJlbCArICIpIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVRlc3RJbnN0YW5jZSgpIHsKKyAgICAgICAgVXNlclRhYmxlIGluc3RhbmNlID0gbmV3IFVzZXJUYWJsZSgpOworICAgICAgICBpbnN0YW5jZS5yb3dzID0gbmV3IExpbmtlZExpc3Q8VXNlcj4oKTsKKyAgICAgICAgaW5zdGFuY2Uucm93cy5hZGQoSnNvblRlc3RIZWxwZXIuY3JlYXRlVGVzdEluc3RhbmNlKFVzZXIuY2xhc3MpKTsKKyAgICAgICAgaW5zdGFuY2UuY29sdW1ucyA9IERFRkFVTFRfSEVBREVSUzsKKyAgICAgICAgcmV0dXJuIGluc3RhbmNlOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVRlc3RJbnN0YW5jZTIoKSB7CisgICAgICAgIFVzZXJUYWJsZSBpbnN0YW5jZSA9IG5ldyBVc2VyVGFibGUoKTsKKyAgICAgICAgaW5zdGFuY2Uucm93cyA9IG5ldyBMaW5rZWRMaXN0PFVzZXI+KCk7CisgICAgICAgIGluc3RhbmNlLnJvd3MuYWRkKEpzb25UZXN0SGVscGVyLmNyZWF0ZVRlc3RJbnN0YW5jZShVc2VyLmNsYXNzKSk7CisgICAgICAgIGluc3RhbmNlLmFkZENvbHVtbihuZXcgSk1ha2lUYWJsZUhlYWRlcigicGFzc3dvcmQiLCAiUGFzc3dvcmQiKSk7CisgICAgICAgIHJldHVybiBpbnN0YW5jZTsKKyAgICB9CisKKyAgICBzdGF0aWMgTGlzdDxKTWFraVRhYmxlSGVhZGVyPiBpbml0SGVhZGVycygpIHsKKyAgICAgICAgTGlzdDxKTWFraVRhYmxlSGVhZGVyPiBoZWFkZXJzID0gbmV3IExpbmtlZExpc3Q8Sk1ha2lUYWJsZUhlYWRlcj4oKTsKKyAgICAgICAgaGVhZGVycy5hZGQobmV3IEpNYWtpVGFibGVIZWFkZXIoInVzZXJpZCIsICJVc2VySUQiKSk7CisgICAgICAgIGhlYWRlcnMuYWRkKG5ldyBKTWFraVRhYmxlSGVhZGVyKCJuYW1lIiwgIlVzZXIgTmFtZSIpKTsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoaGVhZGVycyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBMaXN0PEpNYWtpVGFibGVIZWFkZXI+IERFRkFVTFRfSEVBREVSUyA9IGluaXRIZWFkZXJzKCk7CisKKyAgICBwcml2YXRlIExpc3Q8Sk1ha2lUYWJsZUhlYWRlcj4gY29sdW1uczsKKyAgICBwcml2YXRlIExpc3Q8VXNlcj4gcm93czsKKworICAgIHB1YmxpYyBVc2VyVGFibGUoKSB7CisgICAgfQorCisgICAgcHVibGljIFVzZXJUYWJsZShMaXN0PFVzZXI+IHVzZXJzKSB7CisgICAgICAgIHRoaXMucm93cyA9IG5ldyBMaW5rZWRMaXN0PFVzZXI+KCk7CisgICAgICAgIHRoaXMucm93cy5hZGRBbGwodXNlcnMpOworICAgICAgICB0aGlzLmNvbHVtbnMgPSBERUZBVUxUX0hFQURFUlM7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgYWRkQ29sdW1uKGZpbmFsIEpNYWtpVGFibGVIZWFkZXIgY29sdW1uKSB7CisgICAgICAgIGdldENvbHVtbnMoKS5hZGQoY29sdW1uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgTGlzdDxKTWFraVRhYmxlSGVhZGVyPiBnZXRDb2x1bW5zKCkgeworICAgICAgICBpZiAoY29sdW1ucyA9PSBudWxsKSB7CisgICAgICAgICAgICBjb2x1bW5zID0gbmV3IExpbmtlZExpc3Q8Sk1ha2lUYWJsZUhlYWRlcj4oREVGQVVMVF9IRUFERVJTKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29sdW1uczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRDb2x1bW5zKGZpbmFsIExpc3Q8Sk1ha2lUYWJsZUhlYWRlcj4gY29sdW1ucykgeworICAgICAgICB0aGlzLmNvbHVtbnMgPSBjb2x1bW5zOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PFVzZXI+IGdldFJvd3MoKSB7CisgICAgICAgIHJldHVybiByb3dzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFJvd3MoZmluYWwgTGlzdDxVc2VyPiByb3dzKSB7CisgICAgICAgIHRoaXMucm93cyA9IHJvd3M7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgVXNlclRhYmxlKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFVzZXJUYWJsZSBvdGhlciA9IChVc2VyVGFibGUpIG9iajsKKworICAgICAgICByZXR1cm4gSnNvblRlc3RIZWxwZXIuYXJlQ29sbGVjdGlvbnNFcXVhbCh0aGlzLnJvd3MsIG90aGVyLnJvd3MpCisgICAgICAgICAgICAgICAgJiYgSnNvblRlc3RIZWxwZXIuYXJlQ29sbGVjdGlvbnNFcXVhbCh0aGlzLmNvbHVtbnMsIG90aGVyLmNvbHVtbnMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCBoYXNoID0gMTY7CisgICAgICAgIGlmIChudWxsICE9IHJvd3MpIHsKKyAgICAgICAgICAgIGZvciAoVXNlciB1IDogcm93cykgeworICAgICAgICAgICAgICAgIGhhc2ggPSAxNyAqIGhhc2ggKyB1Lmhhc2hDb2RlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG51bGwgIT0gY29sdW1ucykgeworICAgICAgICAgICAgZm9yIChKTWFraVRhYmxlSGVhZGVyIHUgOiBjb2x1bW5zKSB7CisgICAgICAgICAgICAgICAgaGFzaCA9IDE3ICogaGFzaCArIHUuaGFzaENvZGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiVXNlclRhYmxlKCVzLCVzKSIsIHJvd3MsIGNvbHVtbnMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvcG9qby9Qb2pvQW5pbWFsLmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L3Bvam8vUG9qb0FuaW1hbC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4YmQxMWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L3Bvam8vUG9qb0FuaW1hbC5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5LnBvam87CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCisvLyBKYWNrc29uIDEKK0BvcmcuY29kZWhhdXMuamFja3Nvbi5hbm5vdGF0ZS5Kc29uVHlwZUluZm8oCisgICAgICAgIHVzZSA9IG9yZy5jb2RlaGF1cy5qYWNrc29uLmFubm90YXRlLkpzb25UeXBlSW5mby5JZC5OQU1FLAorICAgICAgICBpbmNsdWRlID0gb3JnLmNvZGVoYXVzLmphY2tzb24uYW5ub3RhdGUuSnNvblR5cGVJbmZvLkFzLlBST1BFUlRZKQorQG9yZy5jb2RlaGF1cy5qYWNrc29uLmFubm90YXRlLkpzb25TdWJUeXBlcyh7CisgICAgICAgIEBvcmcuY29kZWhhdXMuamFja3Nvbi5hbm5vdGF0ZS5Kc29uU3ViVHlwZXMuVHlwZSh2YWx1ZSA9IFBvam9DYXQuY2xhc3MpLAorICAgICAgICBAb3JnLmNvZGVoYXVzLmphY2tzb24uYW5ub3RhdGUuSnNvblN1YlR5cGVzLlR5cGUodmFsdWUgPSBQb2pvRG9nLmNsYXNzKSB9KQorLy8gSmFja3NvbiAyCitAY29tLmZhc3RlcnhtbC5qYWNrc29uLmFubm90YXRpb24uSnNvblR5cGVJbmZvKAorICAgICAgICB1c2UgPSBjb20uZmFzdGVyeG1sLmphY2tzb24uYW5ub3RhdGlvbi5Kc29uVHlwZUluZm8uSWQuTkFNRSwKKyAgICAgICAgaW5jbHVkZSA9IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5hbm5vdGF0aW9uLkpzb25UeXBlSW5mby5Bcy5QUk9QRVJUWSkKK0Bjb20uZmFzdGVyeG1sLmphY2tzb24uYW5ub3RhdGlvbi5Kc29uU3ViVHlwZXMoeworICAgICAgICBAY29tLmZhc3RlcnhtbC5qYWNrc29uLmFubm90YXRpb24uSnNvblN1YlR5cGVzLlR5cGUodmFsdWUgPSBQb2pvQ2F0LmNsYXNzKSwKKyAgICAgICAgQGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5hbm5vdGF0aW9uLkpzb25TdWJUeXBlcy5UeXBlKHZhbHVlID0gUG9qb0RvZy5jbGFzcykgfSkKK0BTdXBwcmVzc1dhcm5pbmdzKCJSZWR1bmRhbnRJZlN0YXRlbWVudCIpCitwdWJsaWMgY2xhc3MgUG9qb0FuaW1hbCB7CisKKyAgICBwdWJsaWMgU3RyaW5nIG5hbWU7CisKKyAgICBwdWJsaWMgUG9qb0FuaW1hbCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgUG9qb0FuaW1hbChmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgUG9qb0FuaW1hbCBvdGhlciA9IChQb2pvQW5pbWFsKSBvYmo7CisgICAgICAgIGlmICgodGhpcy5uYW1lID09IG51bGwpID8gKG90aGVyLm5hbWUgIT0gbnVsbCkgOiAhdGhpcy5uYW1lLmVxdWFscyhvdGhlci5uYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCBoYXNoID0gNzsKKyAgICAgICAgaGFzaCA9IDY3ICogaGFzaCArICh0aGlzLm5hbWUgIT0gbnVsbCA/IHRoaXMubmFtZS5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIHJldHVybiBoYXNoOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJ7IFwibmFtZVwiOlwiJXNcIn0iLCBuYW1lKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvcG9qby9Qb2pvQW5pbWFsTGlzdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9wb2pvL1Bvam9BbmltYWxMaXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYwODJmNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvcG9qby9Qb2pvQW5pbWFsTGlzdC5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5LnBvam87CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworLyoqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJSZWR1bmRhbnRJZlN0YXRlbWVudCIpCitwdWJsaWMgY2xhc3MgUG9qb0FuaW1hbExpc3QgeworCisgICAgcHVibGljIExpc3Q8UG9qb0FuaW1hbD4gYW5pbWFsczsKKworICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVRlc3RJbnN0YW5jZSgpIHsKKyAgICAgICAgZmluYWwgUG9qb0FuaW1hbExpc3QgYUxpc3QgPSBuZXcgUG9qb0FuaW1hbExpc3QoKTsKKyAgICAgICAgYUxpc3QuYW5pbWFscyA9IG5ldyBMaW5rZWRMaXN0PD4oKTsKKyAgICAgICAgYUxpc3QuYW5pbWFscy5hZGQobmV3IFBvam9Eb2coIkZpZmkiKSk7CisgICAgICAgIGFMaXN0LmFuaW1hbHMuYWRkKG5ldyBQb2pvQ2F0KCJEYWlzeSIpKTsKKyAgICAgICAgcmV0dXJuIGFMaXN0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgUG9qb0FuaW1hbExpc3Qgb3RoZXIgPSAoUG9qb0FuaW1hbExpc3QpIG9iajsKKyAgICAgICAgaWYgKHRoaXMuYW5pbWFscyAhPSBvdGhlci5hbmltYWxzICYmICh0aGlzLmFuaW1hbHMgPT0gbnVsbCB8fCAhdGhpcy5hbmltYWxzLmVxdWFscyhvdGhlci5hbmltYWxzKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IDM7CisgICAgICAgIGhhc2ggPSA4OSAqIGhhc2ggKyAodGhpcy5hbmltYWxzICE9IG51bGwgPyB0aGlzLmFuaW1hbHMuaGFzaENvZGUoKSA6IDApOworICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gKGFuaW1hbHMgIT0gbnVsbCkgPyBhbmltYWxzLnRvU3RyaW5nKCkgOiBudWxsOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9wb2pvL1Bvam9DYXQuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvcG9qby9Qb2pvQ2F0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFjMWVjNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvcG9qby9Qb2pvQ2F0LmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuanNvbi5lbnRpdHkucG9qbzsKKworLyoqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKCJVbnVzZWREZWNsYXJhdGlvbiIpCitwdWJsaWMgY2xhc3MgUG9qb0NhdCBleHRlbmRzIFBvam9BbmltYWwgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgbmlja05hbWU7CisKKyAgICBwdWJsaWMgUG9qb0NhdCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgUG9qb0NhdChmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBwdWJsaWMgUG9qb0NhdChmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIG5pY2tOYW1lKSB7CisgICAgICAgIHN1cGVyKG5hbWUpOworICAgICAgICB0aGlzLm5pY2tOYW1lID0gbmlja05hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0Tmlja05hbWUoZmluYWwgU3RyaW5nIG5pY2tOYW1lKSB7CisgICAgICAgIHRoaXMubmlja05hbWUgPSBuaWNrTmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5pY2tOYW1lKCkgeworICAgICAgICByZXR1cm4gdGhpcy5uaWNrTmFtZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgieyBcImNhdFwiIDogJXMgLCAlc30iLCBzdXBlci50b1N0cmluZygpLCB0aGlzLm5pY2tOYW1lKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L3Bvam8vUG9qb0RvZy5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9wb2pvL1Bvam9Eb2cuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGM0ZDU5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9wb2pvL1Bvam9Eb2cuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5qc29uLmVudGl0eS5wb2pvOworCisvKioKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFN1cHByZXNzV2FybmluZ3MoIlVudXNlZERlY2xhcmF0aW9uIikKK3B1YmxpYyBjbGFzcyBQb2pvRG9nIGV4dGVuZHMgUG9qb0FuaW1hbCB7CisKKyAgICBwdWJsaWMgUG9qb0RvZygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgUG9qb0RvZyhmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICBzdXBlcihuYW1lKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgieyBcImRvZ1wiIDogJXMgfSIsIHN1cGVyLnRvU3RyaW5nKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc3NlL0Jyb2FkY2FzdGVyQ2xvc2VUZXN0LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NzZS9Ccm9hZGNhc3RlckNsb3NlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3Y2YzZDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NzZS9Ccm9hZGNhc3RlckNsb3NlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zc2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbXBsZXRhYmxlRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbXBsZXRpb25TdGFnZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5JbnRTdHJlYW07CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5zc2UuT3V0Ym91bmRTc2VFdmVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5zc2UuU3NlOworaW1wb3J0IGphdmF4LndzLnJzLnNzZS5Tc2VCcm9hZGNhc3RlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5zc2UuU3NlRXZlbnRTaW5rOworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFRlc3QgYnJvYWRjYXN0ZXIgYmVoYXZpb3VyIHdoZW4gY2xvc2luZy4KKyAqCisgKiBQcm92ZXMsIHRoYXQgYnJvYWRjYXN0ZXIgYXR0ZW1wdHMgdG8gc2VuZCB0aGUgbWVzc2FnZXMgcmVtYWluaW5nIGluIHRoZSBidWZmZXIgYWZ0ZXIgaXQgcmVjZWl2ZXMgdGhlIGNsb3NlIHNpZ25hbC4KKyAqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBCcm9hZGNhc3RlckNsb3NlVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNMT1dfU1VCU0NSSUJFUl9MQVRFTkNZID0gMjAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfQ09VTlQgPSA4OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvdW50RG93bkxhdGNoIG9uQ29tcGxldGVMYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoU3NlUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBQYXRoKCJldmVudHMiKQorICAgIEBTaW5nbGV0b24KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNzZVJlc291cmNlIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTc2Ugc3NlOworICAgICAgICBwcml2YXRlIGZpbmFsIFNzZUJyb2FkY2FzdGVyIGJyb2FkY2FzdGVyOworICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8U3RyaW5nPiBkYXRhID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICAgICAgcHVibGljIFNzZVJlc291cmNlKEBDb250ZXh0IGZpbmFsIFNzZSBzc2UpIHsKKyAgICAgICAgICAgIHRoaXMuc3NlID0gc3NlOworICAgICAgICAgICAgdGhpcy5icm9hZGNhc3RlciA9IHNzZS5uZXdCcm9hZGNhc3RlcigpOworICAgICAgICAgICAgdGhpcy5icm9hZGNhc3Rlci5yZWdpc3RlcihuZXcgU3NlRXZlbnRTaW5rKCkgeworCisgICAgICAgICAgICAgICAgdm9sYXRpbGUgYm9vbGVhbiBjbG9zZWQgPSBmYWxzZTsKKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xvc2VkOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBDb21wbGV0aW9uU3RhZ2U8Pz4gc2VuZChPdXRib3VuZFNzZUV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoU0xPV19TVUJTQ1JJQkVSX0xBVEVOQ1kpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlNsb3cgc3Vic2NyaWJlcidzIHNsZWVwIHdhcyBpbnRlcnJ1cHRlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkYXRhLmFkZCgiIiArIGV2ZW50LmdldERhdGEoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvbXBsZXRhYmxlRnV0dXJlLmNvbXBsZXRlZEZ1dHVyZShudWxsKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJTbG93IHN1YnNjcmliZXIgY29tcGxldGVkIik7CisgICAgICAgICAgICAgICAgICAgIG9uQ29tcGxldGVMYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlNFUlZFUl9TRU5UX0VWRU5UUykKKyAgICAgICAgcHVibGljIHZvaWQgZ2V0U2VydmVyU2VudEV2ZW50cyhAQ29udGV4dCBmaW5hbCBTc2VFdmVudFNpbmsgZXZlbnRTaW5rKSB7CisgICAgICAgICAgICBicm9hZGNhc3Rlci5yZWdpc3RlcihldmVudFNpbmspOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgicHVzaC97bXNnfSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgYWRkTWVzc2FnZShAUGF0aFBhcmFtKCJtc2ciKSBTdHJpbmcgbWVzc2FnZSkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGJyb2FkY2FzdGVyLmJyb2FkY2FzdChzc2UubmV3RXZlbnQobWVzc2FnZSkpOworICAgICAgICAgICAgcmV0dXJuICJNZXNzYWdlIGFkZGVkLiI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJjbG9zZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgY2xvc2VNZSgpIHsKKyAgICAgICAgICAgIGJyb2FkY2FzdGVyLmNsb3NlKCk7CisgICAgICAgICAgICByZXR1cm4gIkNsb3NlZCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJyZXN1bHQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFJlc3VsdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBkYXRhLnN0cmVhbSgpLmNvbGxlY3QoQ29sbGVjdG9ycy5qb2luaW5nKCIsIikpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnJvYWRjYXN0ZXJLZWVwc1NlbmRpbmdBZnRlckNMb3NlKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gcHVzaCBzb21lIGV2ZW50cyB0byB0aGUgYnJvYWRjYXN0ZXIKKyAgICAgICAgSW50U3RyZWFtLnJhbmdlKDAsIE1TR19DT1VOVCkuZm9yRWFjaCgoaSkgLT4geworICAgICAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKQorICAgICAgICAgICAgICAgICAgICAucGF0aCgiZXZlbnRzL3B1c2gve21zZ30iKQorICAgICAgICAgICAgICAgICAgICAucmVzb2x2ZVRlbXBsYXRlKCJtc2ciLCAibXNnIiArIGkpCisgICAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAgICAgLmdldCgpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhSZXNwb25zZS5TdGF0dXMuT0suZ2V0U3RhdHVzQ29kZSgpLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIH0pOworCisgICAgICAgIC8vIGluc3RydWN0IGJyb2FkY2FzdGVyIHRvIGNsb3NlCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiZXZlbnRzL2Nsb3NlIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFJlc3BvbnNlLlN0YXR1cy5PSy5nZXRTdGF0dXNDb2RlKCksIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICAvLyBzZW5kIG9uZSBtb3JlIG1lc3NhZ2UgKHNob3VsZCBiZSByZWplY3RlZCAtPiByZXF1ZXN0IHdpbGwgZmFpbCkKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgYmFkUmVzcG9uc2UgPSB0YXJnZXQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5wYXRoKCJldmVudHMvcHVzaC97bXNnfSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlc29sdmVUZW1wbGF0ZSgibXNnIiwgInRvby1sYXRlIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90RXF1YWxzKFJlc3BvbnNlLlN0YXR1cy5PSy5nZXRTdGF0dXNDb2RlKCksIGJhZFJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICAvLyB3YWl0IHVwIHRvIGxhdGVuY3kgKiBtc2djb3VudCAoKzEgYXMgcmVzZXJ2ZSkgYmVmb3JlIHRoZSBzZXJ2ZXIgc2h1dHMgZG93bgorICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShvbkNvbXBsZXRlTGF0Y2guYXdhaXQoU0xPV19TVUJTQ1JJQkVSX0xBVEVOQ1kgKiAoTVNHX0NPVU5UICsgMSksIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworCisgICAgICAgIC8vIGdldCBkYXRhIGdhdGhlcmVkIGJ5IHRoZSBzbG93IHN1YnNjaWJlcgorICAgICAgICBTdHJpbmcgcmVzdWx0ID0gdGFyZ2V0KCkucGF0aCgiZXZlbnRzL3Jlc3VsdCIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgZmluYWwgU3RyaW5nW10gcmVzdWx0QXJyYXkgPSByZXN1bHQuc3BsaXQoIiwiKTsKKworICAgICAgICAvLyBjaGVjaywgdGhhdCBicm9hZGNhc3RlciBzZW50IGFsbCB0aGUgYnVmZmVyZWQgZXZlbnRzIHRvIHRoZSBzdWJzY3JpYmVyIGJlZm9yZSBjb21wbGV0ZWx5IGNsb3NpbmcKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhNU0dfQ09VTlQsIHJlc3VsdEFycmF5Lmxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTVNHX0NPVU5UOyBpKyspIHsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIm1zZyIgKyBpLCByZXN1bHRBcnJheVtpXSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NzZS9Ccm9hZGNhc3RlckV4ZWN1dG9yVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zc2UvQnJvYWRjYXN0ZXJFeGVjdXRvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjcyYmY5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zc2UvQnJvYWRjYXN0ZXJFeGVjdXRvclRlc3QuamF2YQpAQCAtMCwwICsxLDE4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc3NlOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29tcGxldGlvblN0YWdlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5zc2UuT3V0Ym91bmRTc2VFdmVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5zc2UuU3NlOworaW1wb3J0IGphdmF4LndzLnJzLnNzZS5Tc2VCcm9hZGNhc3RlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5zc2UuU3NlRXZlbnRTaW5rOworaW1wb3J0IGphdmF4LndzLnJzLnNzZS5Tc2VFdmVudFNvdXJjZTsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50QXN5bmNFeGVjdXRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5NYW5hZ2VkQXN5bmNFeGVjdXRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLlRocmVhZFBvb2xFeGVjdXRvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogTWFuYWdlZCBleGVjdXRvciBzZXJ2aWNlIGluamVjdGlvbiBhbmQgcHJvcGFnYXRpb24gaW50byBicm9hZGNhc3RlciB0ZXN0LgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEJyb2FkY2FzdGVyRXhlY3V0b3JUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEhSRUFEX1BSRUZJWCA9ICJjdXN0b20tZXhlY3V0b3ItdGhyZWFkIjsKKyAgICBwcml2YXRlIHN0YXRpYyBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihCcm9hZGNhc3RlckV4ZWN1dG9yVGVzdC5jbGFzcy5nZXROYW1lKCkpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgQ291bnREb3duTGF0Y2ggY2xvc2VMYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICBwcml2YXRlIHN0YXRpYyBDb3VudERvd25MYXRjaCB0eExhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDIpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzZW5kVGhyZWFkT2sgPSBmYWxzZTsKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIG9uQ29tcGxldGVUaHJlYWRPayA9IGZhbHNlOworCisgICAgQFBhdGgoInNzZSIpCisgICAgQFNpbmdsZXRvbgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3NlUmVzb3VyY2UgeworICAgICAgICBwcml2YXRlIGZpbmFsIFNzZSBzc2U7CisgICAgICAgIHByaXZhdGUgU3NlQnJvYWRjYXN0ZXIgYnJvYWRjYXN0ZXI7CisKKyAgICAgICAgcHVibGljIFNzZVJlc291cmNlKEBDb250ZXh0IGZpbmFsIFNzZSBzc2UpIHsKKyAgICAgICAgICAgIHRoaXMuc3NlID0gc3NlOworICAgICAgICAgICAgYnJvYWRjYXN0ZXIgPSBzc2UubmV3QnJvYWRjYXN0ZXIoKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiQnJvYWRjYXN0ZXIgY3JlYXRlZDogIiArIGJyb2FkY2FzdGVyKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5TRVJWRVJfU0VOVF9FVkVOVFMpCisgICAgICAgIEBQYXRoKCJldmVudHMiKQorICAgICAgICBwdWJsaWMgdm9pZCBnZXRTZXJ2ZXJTZW50RXZlbnRzKEBDb250ZXh0IGZpbmFsIFNzZUV2ZW50U2luayBldmVudFNpbmssIEBDb250ZXh0IGZpbmFsIFNzZSBzc2UpIHsKKworICAgICAgICAgICAgLy8gVE9ETyBKQVgtUlMgMi4xCisgICAgICAgICAgICBicm9hZGNhc3Rlci5yZWdpc3RlcihuZXcgU3NlRXZlbnRTaW5rKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ2xvc2VkKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXZlbnRTaW5rLmlzQ2xvc2VkKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIENvbXBsZXRpb25TdGFnZTw/PiBzZW5kKE91dGJvdW5kU3NlRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmluZm8oIm9uTmV4dCBjYWxsZWQgd2l0aCBbIiArIGV2ZW50ICsgIl0gZnJvbSAiICsgbmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHNlbmRUaHJlYWRPayA9IG5hbWUuc3RhcnRzV2l0aChUSFJFQURfUFJFRklYKTsKKyAgICAgICAgICAgICAgICAgICAgdHhMYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV2ZW50U2luay5zZW5kKGV2ZW50KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmluZm8oIm9uQ29tcGxldGUgY2FsbGVkIGZyb20gIiArIG5hbWUpOworICAgICAgICAgICAgICAgICAgICBvbkNvbXBsZXRlVGhyZWFkT2sgPSBuYW1lLnN0YXJ0c1dpdGgoVEhSRUFEX1BSRUZJWCk7CisgICAgICAgICAgICAgICAgICAgIGNsb3NlTGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgICAgIGV2ZW50U2luay5jbG9zZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInB1c2gve21zZ30iKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcHVzaE1lc3NhZ2UoQFBhdGhQYXJhbSgibXNnIikgZmluYWwgU3RyaW5nIG1zZykgeworICAgICAgICAgICAgYnJvYWRjYXN0ZXIuYnJvYWRjYXN0KHNzZS5uZXdFdmVudEJ1aWxkZXIoKS5kYXRhKG1zZykuYnVpbGQoKSk7CisgICAgICAgICAgICByZXR1cm4gIkJyb2FkY2FzdGluZyBtZXNzYWdlOiAiICsgbXNnOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImNsb3NlIikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGNsb3NlKCkgeworICAgICAgICAgICAgYnJvYWRjYXN0ZXIuY2xvc2UoKTsKKyAgICAgICAgICAgIHJldHVybiAiQ2xvc2VkLiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByYyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhTc2VSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJjLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuV0FETF9GRUFUVVJFX0RJU0FCTEUsIHRydWUpOworICAgICAgICByYy5yZWdpc3RlcihuZXcgQ3VzdG9tTWFuYWdlZEFzeW5jRXhlY3V0b3JQcm92aWRlcigpKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihuZXcgQ3VzdG9tQ2xpZW50QXN5bmNFeGVjdXRvcigpKTsKKyAgICB9CisKKyAgICBATWFuYWdlZEFzeW5jRXhlY3V0b3IKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDdXN0b21NYW5hZ2VkQXN5bmNFeGVjdXRvclByb3ZpZGVyIGV4dGVuZHMgVGhyZWFkUG9vbEV4ZWN1dG9yUHJvdmlkZXIgeworICAgICAgICBDdXN0b21NYW5hZ2VkQXN5bmNFeGVjdXRvclByb3ZpZGVyKCkgeworICAgICAgICAgICAgc3VwZXIoImN1c3RvbS1leGVjdXRvci10aHJlYWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBDbGllbnRBc3luY0V4ZWN1dG9yCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ3VzdG9tQ2xpZW50QXN5bmNFeGVjdXRvciBleHRlbmRzIFRocmVhZFBvb2xFeGVjdXRvclByb3ZpZGVyIHsKKyAgICAgICAgQ3VzdG9tQ2xpZW50QXN5bmNFeGVjdXRvcigpIHsKKyAgICAgICAgICAgIHN1cGVyKCJjdXN0b20tY2xpZW50LWV4ZWN1dG9yIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3QoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmdbXSBvbkV2ZW50VGhyZWFkTmFtZSA9IHsiIn07CisgICAgICAgIFNzZUV2ZW50U291cmNlIGV2ZW50U291cmNlID0gU3NlRXZlbnRTb3VyY2UKKyAgICAgICAgICAgICAgICAudGFyZ2V0KHRhcmdldCgpLnBhdGgoInNzZS9ldmVudHMiKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICBldmVudFNvdXJjZS5yZWdpc3RlcigoZXZlbnQpIC0+IHsKKyAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmluZm8oIkV2ZW50OiAiICsgZXZlbnQgKyAiIGZyb206ICIgKyBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIG9uRXZlbnRUaHJlYWROYW1lWzBdID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICApOworCisgICAgICAgIGV2ZW50U291cmNlLm9wZW4oKTsKKworICAgICAgICB0YXJnZXQoKS5wYXRoKCJzc2UvcHVzaC9maXJzdEJyb2FkY2FzdCIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgdGFyZ2V0KCkucGF0aCgic3NlL3B1c2gvc2Vjb25kQnJvYWRjYXN0IikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgidHhMYXRjaCB0aW1lLW91dGVkLiIsIHR4TGF0Y2guYXdhaXQoMjAwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisKKyAgICAgICAgdGFyZ2V0KCkucGF0aCgic3NlL2Nsb3NlIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiY2xvc2VMYXRjaCB0aW1lLW91dGVkLiIsIGNsb3NlTGF0Y2guYXdhaXQoMjAwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoInNlbmQgZWl0aGVyIG5vdCBpbnZva2VkIGF0IGFsbCBvciBmcm9tIHdyb25nIHRocmVhZCIsIHNlbmRUaHJlYWRPayk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJvbkNvbXBsZXRlIGVpdGhlciBub3QgaW52b2tlZCBhdCBhbGwgb3IgZnJvbSB3cm9uZyB0aHJlYWQiLCBvbkNvbXBsZXRlVGhyZWFkT2spOworCisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJDbGllbnQgZXZlbnQgY2FsbGVkIGZyb20gd3JvbmcgdGhyZWFkICggIiArIG9uRXZlbnRUaHJlYWROYW1lWzBdICsgIikiLAorICAgICAgICAgICAgICAgb25FdmVudFRocmVhZE5hbWVbMF0uc3RhcnRzV2l0aCgiY3VzdG9tLWNsaWVudC1leGVjdXRvciIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NzZS9Ccm9hZGNhc3RlclRlc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc3NlL0Jyb2FkY2FzdGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZTI4NWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NzZS9Ccm9hZGNhc3RlclRlc3QuamF2YQpAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc3NlOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5zc2UuU3NlOworaW1wb3J0IGphdmF4LndzLnJzLnNzZS5Tc2VCcm9hZGNhc3RlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5zc2UuU3NlRXZlbnRTaW5rOworaW1wb3J0IGphdmF4LndzLnJzLnNzZS5Tc2VFdmVudFNvdXJjZTsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBKQVgtUlMge0BsaW5rIGphdmF4LndzLnJzLnNzZS5Tc2VCcm9hZGNhc3Rlcn0gdGVzdC4KKyAqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBCcm9hZGNhc3RlclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHN0YXRpYyBmaW5hbCBDb3VudERvd25MYXRjaCBjbG9zZUxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDQpOworICAgIHN0YXRpYyBmaW5hbCBDb3VudERvd25MYXRjaCB0eExhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDQpOworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNTaW5nbGV0b24gPSBmYWxzZTsKKworICAgIEBQYXRoKCJzc2UiKQorICAgIEBTaW5nbGV0b24KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNzZVJlc291cmNlIHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTc2Ugc3NlOworICAgICAgICBwcml2YXRlIFNzZUJyb2FkY2FzdGVyIGJyb2FkY2FzdGVyOworCisgICAgICAgIHB1YmxpYyBTc2VSZXNvdXJjZShAQ29udGV4dCBmaW5hbCBTc2Ugc3NlKSB7CisgICAgICAgICAgICB0aGlzLnNzZSA9IHNzZTsKKyAgICAgICAgICAgIGJyb2FkY2FzdGVyID0gc3NlLm5ld0Jyb2FkY2FzdGVyKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuU0VSVkVSX1NFTlRfRVZFTlRTKQorICAgICAgICBAUGF0aCgiZXZlbnRzIikKKyAgICAgICAgcHVibGljIHZvaWQgZ2V0U2VydmVyU2VudEV2ZW50cyhAQ29udGV4dCBmaW5hbCBTc2VFdmVudFNpbmsgZXZlbnRTaW5rLCBAQ29udGV4dCBmaW5hbCBTc2Ugc3NlKSB7CisgICAgICAgICAgICBpc1NpbmdsZXRvbiA9IHRoaXMuc3NlID09IHNzZTsKKyAgICAgICAgICAgIGV2ZW50U2luay5zZW5kKHNzZS5uZXdFdmVudEJ1aWxkZXIoKS5kYXRhKCJFdmVudDEiKS5idWlsZCgpKTsKKyAgICAgICAgICAgIGV2ZW50U2luay5zZW5kKHNzZS5uZXdFdmVudEJ1aWxkZXIoKS5kYXRhKCJFdmVudDIiKS5idWlsZCgpKTsKKyAgICAgICAgICAgIGV2ZW50U2luay5zZW5kKHNzZS5uZXdFdmVudEJ1aWxkZXIoKS5kYXRhKCJFdmVudDMiKS5idWlsZCgpKTsKKyAgICAgICAgICAgIGJyb2FkY2FzdGVyLnJlZ2lzdGVyKGV2ZW50U2luayk7CisgICAgICAgICAgICBicm9hZGNhc3Rlci5vbkNsb3NlKChzdWJzY3JpYmVyKSAtPiB7CisgICAgICAgICAgICAgICAgaWYgKHN1YnNjcmliZXIgPT0gZXZlbnRTaW5rKSB7CisgICAgICAgICAgICAgICAgICAgIGNsb3NlTGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB0eExhdGNoLmNvdW50RG93bigpOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInB1c2gve21zZ30iKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcHVzaE1lc3NhZ2UoQFBhdGhQYXJhbSgibXNnIikgZmluYWwgU3RyaW5nIG1zZykgeworICAgICAgICAgICAgYnJvYWRjYXN0ZXIuYnJvYWRjYXN0KHNzZS5uZXdFdmVudEJ1aWxkZXIoKS5kYXRhKG1zZykuYnVpbGQoKSk7CisgICAgICAgICAgICB0eExhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgcmV0dXJuICJCcm9hZGNhc3RpbmcgbWVzc2FnZTogIiArIG1zZzsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJjbG9zZSIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBjbG9zZSgpIHsKKyAgICAgICAgICAgIGJyb2FkY2FzdGVyLmNsb3NlKCk7CisgICAgICAgICAgICByZXR1cm4gIkNsb3NlZC4iOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmMgPSBuZXcgUmVzb3VyY2VDb25maWcoU3NlUmVzb3VyY2UuY2xhc3MpOworICAgICAgICByYy5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLldBRExfRkVBVFVSRV9ESVNBQkxFLCB0cnVlKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIFNzZUV2ZW50U291cmNlIGV2ZW50U291cmNlQSA9IFNzZUV2ZW50U291cmNlLnRhcmdldCh0YXJnZXQoKS5wYXRoKCJzc2UvZXZlbnRzIikpLmJ1aWxkKCk7CisgICAgICAgIExpc3Q8U3RyaW5nPiByZXN1bHRzQTEgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHJlc3VsdHNBMiA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBDb3VudERvd25MYXRjaCBhMUxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDUpOworICAgICAgICBDb3VudERvd25MYXRjaCBhMkxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDUpOworICAgICAgICBldmVudFNvdXJjZUEucmVnaXN0ZXIoKGV2ZW50KSAtPiB7CisgICAgICAgICAgICByZXN1bHRzQTEuYWRkKGV2ZW50LnJlYWREYXRhKCkpOworICAgICAgICAgICAgYTFMYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgfSk7CisgICAgICAgIGV2ZW50U291cmNlQS5yZWdpc3RlcigoZXZlbnQpIC0+IHsKKyAgICAgICAgICAgIHJlc3VsdHNBMi5hZGQoZXZlbnQucmVhZERhdGEoKSk7CisgICAgICAgICAgICBhMkxhdGNoLmNvdW50RG93bigpOworICAgICAgICB9KTsKKyAgICAgICAgZXZlbnRTb3VyY2VBLm9wZW4oKTsKKworICAgICAgICB0YXJnZXQoKS5wYXRoKCJzc2UvcHVzaC9maXJzdEJyb2FkY2FzdCIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKworCisgICAgICAgIFNzZUV2ZW50U291cmNlIGV2ZW50U291cmNlQiA9IFNzZUV2ZW50U291cmNlLnRhcmdldCh0YXJnZXQoKS5wYXRoKCJzc2UvZXZlbnRzIikpLmJ1aWxkKCk7CisgICAgICAgIExpc3Q8U3RyaW5nPiByZXN1bHRzQjEgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHJlc3VsdHNCMiA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBDb3VudERvd25MYXRjaCBiMUxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDQpOworICAgICAgICBDb3VudERvd25MYXRjaCBiMkxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDQpOworICAgICAgICBldmVudFNvdXJjZUIucmVnaXN0ZXIoKGV2ZW50KSAtPiB7CisgICAgICAgICAgICByZXN1bHRzQjEuYWRkKGV2ZW50LnJlYWREYXRhKCkpOworICAgICAgICAgICAgYjFMYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgfSk7CisgICAgICAgIGV2ZW50U291cmNlQi5yZWdpc3RlcigoZXZlbnQpIC0+IHsKKyAgICAgICAgICAgIHJlc3VsdHNCMi5hZGQoZXZlbnQucmVhZERhdGEoKSk7CisgICAgICAgICAgICBiMkxhdGNoLmNvdW50RG93bigpOworICAgICAgICB9KTsKKyAgICAgICAgZXZlbnRTb3VyY2VCLm9wZW4oKTsKKworICAgICAgICB0YXJnZXQoKS5wYXRoKCJzc2UvcHVzaC9zZWNvbmRCcm9hZGNhc3QiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIldhaXRpbmcgZm9yIHJlc3VsdHNBMSB0byBiZSBjb21wbGV0ZSBmYWlsZWQuIiwKKyAgICAgICAgICAgICAgICBhMUxhdGNoLmF3YWl0KDMwMDAsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiV2FpdGluZyBmb3IgcmVzdWx0c0EyIHRvIGJlIGNvbXBsZXRlIGZhaWxlZC4iLAorICAgICAgICAgICAgICAgIGEyTGF0Y2guYXdhaXQoMzAwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIldhaXRpbmcgZm9yIHJlc3VsdHNCMSB0byBiZSBjb21wbGV0ZSBmYWlsZWQuIiwKKyAgICAgICAgICAgICAgICBiMUxhdGNoLmF3YWl0KDMwMDAsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiV2FpdGluZyBmb3IgcmVzdWx0c0IyIHRvIGJlIGNvbXBsZXRlIGZhaWxlZC4iLAorICAgICAgICAgICAgICAgIGIyTGF0Y2guYXdhaXQoMzAwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUodHhMYXRjaC5hd2FpdCg1MDAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKworICAgICAgICAvLyBFdmVudDEsIEV2ZW50MiwgRXZlbnQzLCBmaXJzdEJyb2FkY2FzdCwgc2Vjb25kQnJvYWRjYXN0CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInJlc3VsdHNBMSBkb2VzIG5vdCBjb250YWluIDUgZWxlbWVudHMuIiwgNSwgcmVzdWx0c0ExLnNpemUoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInJlc3VsdHNBMiBkb2VzIG5vdCBjb250YWluIDUgZWxlbWVudHMuIiwgNSwgcmVzdWx0c0EyLnNpemUoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJyZXN1bHRzQTEgZG9lcyBub3QgY29udGFpbiBleHBlY3RlZCBkYXRhIiwKKyAgICAgICAgICAgICAgICByZXN1bHRzQTEuZ2V0KDApLmVxdWFscygiRXZlbnQxIikKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHJlc3VsdHNBMS5nZXQoMSkuZXF1YWxzKCJFdmVudDIiKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgcmVzdWx0c0ExLmdldCgyKS5lcXVhbHMoIkV2ZW50MyIpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiByZXN1bHRzQTEuZ2V0KDMpLmVxdWFscygiZmlyc3RCcm9hZGNhc3QiKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgcmVzdWx0c0ExLmdldCg0KS5lcXVhbHMoInNlY29uZEJyb2FkY2FzdCIpKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgicmVzdWx0c0EyIGRvZXMgbm90IGNvbnRhaW4gZXhwZWN0ZWQgZGF0YSIsCisgICAgICAgICAgICAgICAgcmVzdWx0c0EyLmdldCgwKS5lcXVhbHMoIkV2ZW50MSIpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiByZXN1bHRzQTIuZ2V0KDEpLmVxdWFscygiRXZlbnQyIikKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHJlc3VsdHNBMi5nZXQoMikuZXF1YWxzKCJFdmVudDMiKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgcmVzdWx0c0EyLmdldCgzKS5lcXVhbHMoImZpcnN0QnJvYWRjYXN0IikKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHJlc3VsdHNBMi5nZXQoNCkuZXF1YWxzKCJzZWNvbmRCcm9hZGNhc3QiKSk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygicmVzdWx0c0IxIGRvZXMgbm90IGNvbnRhaW4gNCBlbGVtZW50cy4iLCA0LCByZXN1bHRzQjEuc2l6ZSgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygicmVzdWx0c0IyIGRvZXMgbm90IGNvbnRhaW4gNCBlbGVtZW50cy4iLCA0LCByZXN1bHRzQjIuc2l6ZSgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoInJlc3VsdHNCMSBkb2VzIG5vdCBjb250YWluIGV4cGVjdGVkIGRhdGEiLAorICAgICAgICAgICAgICAgIHJlc3VsdHNCMS5nZXQoMCkuZXF1YWxzKCJFdmVudDEiKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgcmVzdWx0c0IxLmdldCgxKS5lcXVhbHMoIkV2ZW50MiIpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiByZXN1bHRzQjEuZ2V0KDIpLmVxdWFscygiRXZlbnQzIikKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHJlc3VsdHNCMS5nZXQoMykuZXF1YWxzKCJzZWNvbmRCcm9hZGNhc3QiKSk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoInJlc3VsdHNCMiBkb2VzIG5vdCBjb250YWluIGV4cGVjdGVkIGRhdGEiLAorICAgICAgICAgICAgICAgIHJlc3VsdHNCMi5nZXQoMCkuZXF1YWxzKCJFdmVudDEiKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgcmVzdWx0c0IyLmdldCgxKS5lcXVhbHMoIkV2ZW50MiIpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiByZXN1bHRzQjIuZ2V0KDIpLmVxdWFscygiRXZlbnQzIikKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHJlc3VsdHNCMi5nZXQoMykuZXF1YWxzKCJzZWNvbmRCcm9hZGNhc3QiKSk7CisgICAgICAgIHRhcmdldCgpLnBhdGgoInNzZS9jbG9zZSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoY2xvc2VMYXRjaC5hd2FpdCgzMDAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIlNzZSBpbnN0YW5jZXMgaW5qZWN0ZWQgaW50byByZXNvdXJjZSBhbmQgY29uc3RydWN0b3IgZGlmZmVyLiBTc2Ugc2hvdWxkIGhhdmUgYmVlbiBpbmplY3RlZCIKKyAgICAgICAgICAgICAgICArICJhcyBhIHNpbmdsZXRvbiIsIGlzU2luZ2xldG9uKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NzZS9FdmVudE91dHB1dFRlc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc3NlL0V2ZW50T3V0cHV0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMDlkMjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NzZS9FdmVudE91dHB1dFRlc3QuamF2YQpAQCAtMCwwICsxLDI3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc3NlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQXJyYXlCbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5LmNvbm5lY3Rvci5Hcml6emx5Q29ubmVjdG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLkV2ZW50SW5wdXQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLkV2ZW50TGlzdGVuZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLkV2ZW50T3V0cHV0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5FdmVudFNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5zc2UuSW5ib3VuZEV2ZW50OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5PdXRib3VuZEV2ZW50OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5Tc2VGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiBFdmVudCBvdXRwdXQgdGVzdHMuCisgKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBFdmVudE91dHB1dFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoU3NlVGVzdFJlc291cmNlLmNsYXNzLCBTc2VGZWF0dXJlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcucmVnaXN0ZXIoU3NlRmVhdHVyZS5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU1NFIFRlc3QgcmVzb3VyY2UuCisgICAgICovCisgICAgQFBhdGgoInRlc3QiKQorICAgIEBQcm9kdWNlcyhTc2VGZWF0dXJlLlNFUlZFUl9TRU5UX0VWRU5UUykKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNzZVRlc3RSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgic2luZ2xlIikKKyAgICAgICAgcHVibGljIEV2ZW50T3V0cHV0IGdldFNpbmdsZUV2ZW50KCkgeworICAgICAgICAgICAgZmluYWwgRXZlbnRPdXRwdXQgb3V0cHV0ID0gbmV3IEV2ZW50T3V0cHV0KCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIG5ldyBUaHJlYWQoKSB7CisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LndyaXRlKG5ldyBPdXRib3VuZEV2ZW50LkJ1aWxkZXIoKS5kYXRhKFN0cmluZy5jbGFzcywgInNpbmdsZSIpLmJ1aWxkKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0uc3RhcnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImNsb3NlZC1zaW5nbGUiKQorICAgICAgICBwdWJsaWMgRXZlbnRPdXRwdXQgZ2V0Q2xvc2VkU2luZ2xlRXZlbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgRXZlbnRPdXRwdXQgb3V0cHV0ID0gbmV3IEV2ZW50T3V0cHV0KCk7CisgICAgICAgICAgICBvdXRwdXQud3JpdGUobmV3IE91dGJvdW5kRXZlbnQuQnVpbGRlcigpLmRhdGEoU3RyaW5nLmNsYXNzLCAiY2xvc2VkIikuYnVpbGQoKSk7CisgICAgICAgICAgICBvdXRwdXQuY2xvc2UoKTsKKyAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJjbG9zZWQtZW1wdHkiKQorICAgICAgICBwdWJsaWMgRXZlbnRPdXRwdXQgZ2V0Q2xvc2VkRW1wdHkoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgRXZlbnRPdXRwdXQgb3V0cHV0ID0gbmV3IEV2ZW50T3V0cHV0KCk7CisgICAgICAgICAgICBvdXRwdXQuY2xvc2UoKTsKKyAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJjaGFyc2V0IikKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L2V2ZW50LXN0cmVhbTtjaGFyc2V0PXV0Zi04IikKKyAgICAgICAgcHVibGljIEV2ZW50T3V0cHV0IGdldFNzZVdpdGhDaGFyc2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIEV2ZW50T3V0cHV0IG91dHB1dCA9IG5ldyBFdmVudE91dHB1dCgpOworICAgICAgICAgICAgb3V0cHV0LndyaXRlKG5ldyBPdXRib3VuZEV2ZW50LkJ1aWxkZXIoKS5kYXRhKFN0cmluZy5jbGFzcywgImNoYXJzZXQiKS5idWlsZCgpKTsKKyAgICAgICAgICAgIG91dHB1dC5jbG9zZSgpOworICAgICAgICAgICAgcmV0dXJuIG91dHB1dDsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImNvbW1lbnRzLW9ubHkiKQorICAgICAgICBwdWJsaWMgRXZlbnRPdXRwdXQgZ2V0Q29tbWVudHNPbmx5U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIEV2ZW50T3V0cHV0IG91dHB1dCA9IG5ldyBFdmVudE91dHB1dCgpOworICAgICAgICAgICAgb3V0cHV0LndyaXRlKG5ldyBPdXRib3VuZEV2ZW50LkJ1aWxkZXIoKS5jb21tZW50KCJObyBjb21tZW50ICMxIikuYnVpbGQoKSk7CisgICAgICAgICAgICBvdXRwdXQud3JpdGUobmV3IE91dGJvdW5kRXZlbnQuQnVpbGRlcigpLmNvbW1lbnQoIk5vIGNvbW1lbnQgIzIiKS5idWlsZCgpKTsKKyAgICAgICAgICAgIG91dHB1dC5jbG9zZSgpOworICAgICAgICAgICAgcmV0dXJuIG91dHB1dDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRTc2VFdmVudEFzUGxhaW5TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgciA9IHRhcmdldCgpLnBhdGgoInRlc3Qvc2luZ2xlIikucmVxdWVzdCgpLmdldChSZXNwb25zZS5jbGFzcyk7CisgICAgICAgIGFzc2VydFRoYXQoci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGNvbnRhaW5zU3RyaW5nKCJzaW5nbGUiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcm9kdWNlciBmb3IgSkVSU0VZLTI5MTI6IFNlbmRpbmcgYW5kIHJlY2VpdmluZyBjb21tZW50cy1vbmx5IGV2ZW50cy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZENvbW1lbnRzT25seVNzZUV2ZW50cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDbGllbnRDb25maWcgY2xpZW50Q29uZmlnID0gbmV3IENsaWVudENvbmZpZygpOworICAgICAgICBjbGllbnRDb25maWcucHJvcGVydHkoQ2xpZW50UHJvcGVydGllcy5DT05ORUNUX1RJTUVPVVQsIDE1MDAwKTsKKyAgICAgICAgY2xpZW50Q29uZmlnLnByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuUkVBRF9USU1FT1VULCAwKTsKKyAgICAgICAgY2xpZW50Q29uZmlnLnByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuQVNZTkNfVEhSRUFEUE9PTF9TSVpFLCA4KTsKKyAgICAgICAgY2xpZW50Q29uZmlnLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBHcml6emx5Q29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgICAgIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0J1aWxkZXIoKS53aXRoQ29uZmlnKGNsaWVudENvbmZpZykuYnVpbGQoKTsKKworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgyKTsKKyAgICAgICAgZmluYWwgUXVldWU8U3RyaW5nPiBldmVudENvbW1lbnRzID0gbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTw+KDIpOworICAgICAgICBXZWJUYXJnZXQgc2luZ2xlID0gY2xpZW50LnRhcmdldChnZXRCYXNlVXJpKCkpLnBhdGgoInRlc3QvY29tbWVudHMtb25seSIpOworICAgICAgICBFdmVudFNvdXJjZSBlcyA9IEV2ZW50U291cmNlLnRhcmdldChzaW5nbGUpLmJ1aWxkKCk7CisgICAgICAgIGVzLnJlZ2lzdGVyKG5ldyBFdmVudExpc3RlbmVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkV2ZW50KEluYm91bmRFdmVudCBpbmJvdW5kRXZlbnQpIHsKKyAgICAgICAgICAgICAgICBldmVudENvbW1lbnRzLmFkZChpbmJvdW5kRXZlbnQuZ2V0Q29tbWVudCgpKTsKKyAgICAgICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgYm9vbGVhbiBsYXRjaFRpbWVkT3V0OworICAgICAgICBib29sZWFuIGNsb3NlVGltZWRPdXQ7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBlcy5vcGVuKCk7CisgICAgICAgICAgICBsYXRjaFRpbWVkT3V0ID0gbGF0Y2guYXdhaXQoNSAqIGdldEFzeW5jVGltZW91dE11bHRpcGxpZXIoKSwgVGltZVVuaXQuU0VDT05EUyk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBjbG9zZVRpbWVkT3V0ID0gZXMuY2xvc2UoNSwgVGltZVVuaXQuU0VDT05EUyk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgZXZlbnQgY291bnQiLCAyLCBldmVudENvbW1lbnRzLnNpemUoKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IDI7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGNvbW1lbnQgZGF0YSBvbiBldmVudCAjIiArIGksICJObyBjb21tZW50ICMiICsgaSwgZXZlbnRDb21tZW50cy5wb2xsKCkpOworICAgICAgICB9CisgICAgICAgIGFzc2VydFRydWUoIkV2ZW50IGxhdGNoIGhhcyB0aW1lZCBvdXQiLCBsYXRjaFRpbWVkT3V0KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRXZlbnRTb3VyY2UuY2xvc2UoKSBoYXMgdGltZWQgb3V0IiwgY2xvc2VUaW1lZE91dCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEZyb21DbG9zZWRPdXRwdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIE5lZWQgdG8gZGlzYWJsZSBIVFRQIEtlZXAtQWxpdmUgdG8gcHJldmVudCB0aGlzIHRlc3QgZnJvbSBoYW5naW5nIGluIEh0dHBVUkxDb25uZWN0aW9uCisgICAgICAgICAqIGR1ZSB0byBhbiBhdHRlbXB0IHRvIHJlYWQgZnJvbSBhIHN0YWxlLCBvdXQtb2Ytc3luYyBjb25uZWN0aW9uIGNsb3NlZCBieSB0aGUgc2VydmVyLgorICAgICAgICAgKiBUaHVzIHNldHRpbmcgdGhlICJDb25uZWN0aW9uOiBjbG9zZSIgSFRUUCBoZWFkZXIgb24gYWxsIHJlcXVlc3RzLgorICAgICAgICAgKi8KKyAgICAgICAgUmVzcG9uc2UgcjsKKyAgICAgICAgciA9IHRhcmdldCgpLnBhdGgoInRlc3QvY2xvc2VkLWVtcHR5IikucmVxdWVzdCgpLmhlYWRlcigiQ29ubmVjdGlvbiIsICJjbG9zZSIpLmdldCgpOworICAgICAgICBhc3NlcnRUcnVlKHIucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLmlzRW1wdHkoKSk7CisKKyAgICAgICAgciA9IHRhcmdldCgpLnBhdGgoInRlc3QvY2xvc2VkLXNpbmdsZSIpLnJlcXVlc3QoKS5oZWFkZXIoIkNvbm5lY3Rpb24iLCAiY2xvc2UiKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKS5jb250YWlucygiY2xvc2VkIikpOworCisgICAgICAgIC8vCisKKyAgICAgICAgRXZlbnRJbnB1dCBpbnB1dDsKKyAgICAgICAgaW5wdXQgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0L2Nsb3NlZC1zaW5nbGUiKS5yZXF1ZXN0KCkuaGVhZGVyKCJDb25uZWN0aW9uIiwgImNsb3NlIikuZ2V0KEV2ZW50SW5wdXQuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNsb3NlZCIsIGlucHV0LnJlYWQoKS5yZWFkRGF0YSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIGlucHV0LnJlYWQoKSk7CisgICAgICAgIGFzc2VydFRydWUoaW5wdXQuaXNDbG9zZWQoKSk7CisKKyAgICAgICAgaW5wdXQgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0L2Nsb3NlZC1lbXB0eSIpLnJlcXVlc3QoKS5oZWFkZXIoIkNvbm5lY3Rpb24iLCAiY2xvc2UiKS5nZXQoRXZlbnRJbnB1dC5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBpbnB1dC5yZWFkKCkpOworICAgICAgICBhc3NlcnRUcnVlKGlucHV0LmlzQ2xvc2VkKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNzZUNvbnRlbnRUeXBlV2l0aENoYXJzZXQoKSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBOZWVkIHRvIGRpc2FibGUgSFRUUCBLZWVwLUFsaXZlIHRvIHByZXZlbnQgdGhpcyB0ZXN0IGZyb20gaGFuZ2luZyBpbiBIdHRwVVJMQ29ubmVjdGlvbgorICAgICAgICAgKiBkdWUgdG8gYW4gYXR0ZW1wdCB0byByZWFkIGZyb20gYSBzdGFsZSwgb3V0LW9mLXN5bmMgY29ubmVjdGlvbiBjbG9zZWQgYnkgdGhlIHNlcnZlci4KKyAgICAgICAgICogVGh1cyBzZXR0aW5nIHRoZSAiQ29ubmVjdGlvbjogY2xvc2UiIEhUVFAgaGVhZGVyIG9uIGFsbCByZXF1ZXN0cy4KKyAgICAgICAgICovCisgICAgICAgIFJlc3BvbnNlIHI7CisgICAgICAgIHIgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0L2NoYXJzZXQiKS5yZXF1ZXN0KCkuaGVhZGVyKCJDb25uZWN0aW9uIiwgImNsb3NlIikuZ2V0KCk7CisgICAgICAgIGFzc2VydFRydWUoci5nZXRNZWRpYVR5cGUoKS5nZXRQYXJhbWV0ZXJzKCkuZ2V0KCJjaGFyc2V0IikuZXF1YWxzSWdub3JlQ2FzZSgidXRmLTgiKSk7CisgICAgICAgIGZpbmFsIEV2ZW50SW5wdXQgZXZlbnRJbnB1dCA9IHIucmVhZEVudGl0eShFdmVudElucHV0LmNsYXNzKTsKKyAgICAgICAgU3RyaW5nIGV2ZW50RGF0YSA9IGV2ZW50SW5wdXQucmVhZCgpLnJlYWREYXRhKCk7CisgICAgICAgIGFzc2VydEVxdWFscygiY2hhcnNldCIsIGV2ZW50RGF0YSk7CisgICAgICAgIGV2ZW50SW5wdXQuY2xvc2UoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHcml6emx5Q29ubmVjdG9yV2l0aEV2ZW50U291cmNlKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xpZW50Q29uZmlnIGNsaWVudENvbmZpZyA9IG5ldyBDbGllbnRDb25maWcoKTsKKyAgICAgICAgY2xpZW50Q29uZmlnLnByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuQ09OTkVDVF9USU1FT1VULCAxNTAwMCk7CisgICAgICAgIGNsaWVudENvbmZpZy5wcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLlJFQURfVElNRU9VVCwgMCk7CisgICAgICAgIGNsaWVudENvbmZpZy5wcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLkFTWU5DX1RIUkVBRFBPT0xfU0laRSwgOCk7CisgICAgICAgIGNsaWVudENvbmZpZy5jb25uZWN0b3JQcm92aWRlcihuZXcgR3JpenpseUNvbm5lY3RvclByb3ZpZGVyKCkpOworICAgICAgICBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdCdWlsZGVyKCkud2l0aENvbmZpZyhjbGllbnRDb25maWcpLmJ1aWxkKCk7CisKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgIGZpbmFsIEF0b21pY1JlZmVyZW5jZTxTdHJpbmc+IGV2ZW50RGF0YSA9IG5ldyBBdG9taWNSZWZlcmVuY2U8U3RyaW5nPigpOworICAgICAgICBmaW5hbCBBdG9taWNJbnRlZ2VyIGNvdW50ZXIgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKKyAgICAgICAgV2ViVGFyZ2V0IHNpbmdsZSA9IGNsaWVudC50YXJnZXQoZ2V0QmFzZVVyaSgpKS5wYXRoKCJ0ZXN0L3NpbmdsZSIpOworICAgICAgICBFdmVudFNvdXJjZSBlcyA9IEV2ZW50U291cmNlLnRhcmdldChzaW5nbGUpLmJ1aWxkKCk7CisgICAgICAgIGVzLnJlZ2lzdGVyKG5ldyBFdmVudExpc3RlbmVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkV2ZW50KEluYm91bmRFdmVudCBpbmJvdW5kRXZlbnQpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaSA9IGNvdW50ZXIuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICAgICAgICAgICAgaWYgKGkgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBldmVudERhdGEuc2V0KGluYm91bmRFdmVudC5yZWFkRGF0YSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIGJvb2xlYW4gbGF0Y2hUaW1lZE91dDsKKyAgICAgICAgYm9vbGVhbiBjbG9zZVRpbWVkT3V0OworICAgICAgICB0cnkgeworICAgICAgICAgICAgZXMub3BlbigpOworICAgICAgICAgICAgbGF0Y2hUaW1lZE91dCA9IGxhdGNoLmF3YWl0KDUgKiBnZXRBc3luY1RpbWVvdXRNdWx0aXBsaWVyKCksIFRpbWVVbml0LlNFQ09ORFMpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgY2xvc2VUaW1lZE91dCA9IGVzLmNsb3NlKDUsIFRpbWVVbml0LlNFQ09ORFMpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIGV2ZW50IGNvdW50IiwgMSwgY291bnRlci5nZXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBldmVudCBkYXRhIiwgInNpbmdsZSIsIGV2ZW50RGF0YS5nZXQoKSk7CisgICAgICAgIGFzc2VydFRydWUoIkV2ZW50IGxhdGNoIGhhcyB0aW1lZCBvdXQiLCBsYXRjaFRpbWVkT3V0KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRXZlbnRTb3VyY2UuY2xvc2UoKSBoYXMgdGltZWQgb3V0IiwgY2xvc2VUaW1lZE91dCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zc2UvRXZlbnRTb3VyY2VXaXRoTmFtZWRFdmVudHNUZXN0LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NzZS9FdmVudFNvdXJjZVdpdGhOYW1lZEV2ZW50c1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGY5ZWRmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zc2UvRXZlbnRTb3VyY2VXaXRoTmFtZWRFdmVudHNUZXN0LmphdmEKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNzZTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5zc2UuRXZlbnRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5zc2UuRXZlbnRPdXRwdXQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLkV2ZW50U291cmNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5JbmJvdW5kRXZlbnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLk91dGJvdW5kRXZlbnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLlNzZUZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGVzdHMgaGFuZGxpbmcgb2YgU1NFcyB3aXRoIG5hbWUgZGVmaW5lZCBpbiB7QGxpbmsgRXZlbnRTb3VyY2V9LgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBFdmVudFNvdXJjZVdpdGhOYW1lZEV2ZW50c1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNTRV9OQU1FID0gIm1lc3NhZ2UtdG8tY2xpZW50IjsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKFNzZVJlc291cmNlLmNsYXNzLCBTc2VGZWF0dXJlLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIHJlc291cmNlQ29uZmlnOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19DT1VOVCA9IDEwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKE1TR19DT1VOVCk7CisKKyAgICBAUGF0aCgiZXZlbnRzIikKKyAgICBAU2luZ2xldG9uCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTc2VSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoU3NlRmVhdHVyZS5TRVJWRVJfU0VOVF9FVkVOVFMpCisgICAgICAgIHB1YmxpYyBFdmVudE91dHB1dCBnZXRTZXJ2ZXJTZW50RXZlbnRzKCkgeworICAgICAgICAgICAgZmluYWwgRXZlbnRPdXRwdXQgZXZlbnRPdXRwdXQgPSBuZXcgRXZlbnRPdXRwdXQoKTsKKyAgICAgICAgICAgIG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChsYXRjaC5nZXRDb3VudCgpID4gMCkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VuZCBtZXNzYWdlIHdpdGggbmFtZSAibWVzc2FnZS10by1jbGllbnQiIC0+IHNob3VsZCBiZSByZWFkIGJ5IHRoZSBjbGllbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudE91dHB1dC53cml0ZShuZXcgT3V0Ym91bmRFdmVudC5CdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lKCJtZXNzYWdlLXRvLWNsaWVudCIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWVkaWFUeXBlKE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGF0YShJbnRlZ2VyLmNsYXNzLCBpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VuZCBhbm90aGVyIGV2ZW50IHdpdGggbmFtZSAiZm9vIiAtPiBzaG91bGQgYmUgaWdub3JlZCBieSB0aGUgY2xpZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRPdXRwdXQud3JpdGUobmV3IE91dGJvdW5kRXZlbnQuQnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubmFtZSgiZm9vIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tZWRpYVR5cGUoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5kYXRhKFN0cmluZy5jbGFzcywgImJhciIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZW5kIGFub3RoZXIgdW4tbWFtZWQgZXZlbnQgLT4gc2hvdWxkIGJlIGlnbm9yZWQgYnkgdGhlIGNsaWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50T3V0cHV0LndyaXRlKG5ldyBPdXRib3VuZEV2ZW50LkJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1lZGlhVHlwZShNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRhdGEoU3RyaW5nLmNsYXNzLCAiYmF6IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkVycm9yIHdoZW4gd3JpdGluZyB0aGUgZXZlbnQuIiwgZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50T3V0cHV0LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBpb0Nsb3NlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkVycm9yIHdoZW4gY2xvc2luZyB0aGUgZXZlbnQgb3V0cHV0LiIsIGlvQ2xvc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkuc3RhcnQoKTsKKyAgICAgICAgICAgIHJldHVybiBldmVudE91dHB1dDsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2l0aEV2ZW50U291cmNlKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBOb1N1Y2hBbGdvcml0aG1FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IGVuZHBvaW50ID0gdGFyZ2V0KCkucmVnaXN0ZXIoU3NlRmVhdHVyZS5jbGFzcykucGF0aCgiZXZlbnRzIik7CisgICAgICAgIEV2ZW50U291cmNlIGV2ZW50U291cmNlID0gRXZlbnRTb3VyY2UudGFyZ2V0KGVuZHBvaW50KS5idWlsZCgpOworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBjb3VudCA9IG5ldyBDb3VudERvd25MYXRjaChNU0dfQ09VTlQpOworCisgICAgICAgIGZpbmFsIEV2ZW50TGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgRXZlbnRMaXN0ZW5lcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25FdmVudChJbmJvdW5kRXZlbnQgaW5ib3VuZEV2ZW50KSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgSW50ZWdlciBkYXRhID0gaW5ib3VuZEV2ZW50LnJlYWREYXRhKEludGVnZXIuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oaW5ib3VuZEV2ZW50LmdldE5hbWUoKSArICI7ICIgKyBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhTU0VfTkFNRSwgaW5ib3VuZEV2ZW50LmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoTVNHX0NPVU5UIC0gY291bnQuZ2V0Q291bnQoKSwgZGF0YS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgY291bnQuY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoUHJvY2Vzc2luZ0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXJyb3Igd2hlbiBkZXNlcmlhbGl6aW5nIG9mIGRhdGEuIiwgZXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgZXZlbnRTb3VyY2UucmVnaXN0ZXIobGlzdGVuZXIsICJtZXNzYWdlLXRvLWNsaWVudCIpOworICAgICAgICBldmVudFNvdXJjZS5vcGVuKCk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gc2VudCA9IGxhdGNoLmF3YWl0KDUgKiBnZXRBc3luY1RpbWVvdXRNdWx0aXBsaWVyKCksIFRpbWVVbml0LlNFQ09ORFMpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiQXdhaXRpbmcgZm9yIFNTRSBtZXNzYWdlIGhhcyB0aW1lb3V0LiBOb3QgYWxsIG1lc3NhZ2Ugd2VyZSBzZW50LiIsIHNlbnQpOworICAgICAgICBmaW5hbCBib29sZWFuIGhhbmRsZWQgPSBjb3VudC5hd2FpdCg1ICogZ2V0QXN5bmNUaW1lb3V0TXVsdGlwbGllcigpLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkF3YWl0aW5nIGZvciBTU0UgbWVzc2FnZSBoYXMgdGltZW91dC4gTm90IGFsbCBtZXNzYWdlIHdlcmUgaGFuZGxlZCBieSB0aGUgbGlzdGVuZXIuIiwgaGFuZGxlZCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zc2UvR2VuZXJpY0VudGl0eVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc3NlL0dlbmVyaWNFbnRpdHlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JkM2U5YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc3NlL0dlbmVyaWNFbnRpdHlUZXN0LmphdmEKQEAgLTAsMCArMSwyNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNzZTsKKworaW1wb3J0IGphdmFmeC51dGlsLlBhaXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkdlbmVyaWNFbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworaW1wb3J0IGphdmF4LndzLnJzLnNzZS5Tc2U7CitpbXBvcnQgamF2YXgud3MucnMuc3NlLlNzZUV2ZW50U2luazsKK2ltcG9ydCBqYXZheC53cy5ycy5zc2UuU3NlRXZlbnRTb3VyY2U7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UuYXNzZXJ0VHJ1ZTsKKworcHVibGljIGNsYXNzIEdlbmVyaWNFbnRpdHlUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gMjA7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEdlbmVyaWNFbnRpdHlUZXN0LlNTRUdlbmVyaWNFbnRpdHlSZXNvdXJjZS5jbGFzcywgTGlzdFBhaXJNQlJXLmNsYXNzLCBQYWlyTUJSVy5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJpY1N0cmluZygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIFdlYlRhcmdldCBzc2VUYXJnZXQgPSB0YXJnZXQoImdlbmVyaWNlbnRpdHlyZXNvdXJjZS9zdHJpbmciKTsKKyAgICAgICAgQ291bnREb3duTGF0Y2ggY291bnREb3duTGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgIE1lc3NhZ2VMYXRjaDxTdHJpbmc+IG1lc3NhZ2VMYXRjaCA9IG5ldyBNZXNzYWdlTGF0Y2g8Pihjb3VudERvd25MYXRjaCk7CisgICAgICAgIHRyeSAoU3NlRXZlbnRTb3VyY2Ugc291cmNlID0gU3NlRXZlbnRTb3VyY2UudGFyZ2V0KHNzZVRhcmdldCkuYnVpbGQoKSkgeworICAgICAgICAgICAgc291cmNlLnJlZ2lzdGVyKGV2ZW50IC0+IG1lc3NhZ2VMYXRjaC5jb25zdW1lKGV2ZW50LnJlYWREYXRhKCkpKTsKKyAgICAgICAgICAgIHNvdXJjZS5vcGVuKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGNvdW50RG93bkxhdGNoLmF3YWl0KDUsIFRpbWVVbml0LlNFQ09ORFMpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiQ2luZHkiLCBtZXNzYWdlTGF0Y2guZGF0YSgpLmdldCgwKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmljUGFpcigpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIFdlYlRhcmdldCBzc2VUYXJnZXQgPSB0YXJnZXQoImdlbmVyaWNlbnRpdHlyZXNvdXJjZS9wYWlyIikucmVnaXN0ZXIoUGFpck1CUlcuY2xhc3MpOworICAgICAgICBDb3VudERvd25MYXRjaCBjb3VudERvd25MYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKyAgICAgICAgTWVzc2FnZUxhdGNoPFBhaXI8U3RyaW5nLCBJbnRlZ2VyPj4gbWVzc2FnZUxhdGNoID0gbmV3IE1lc3NhZ2VMYXRjaDw+KGNvdW50RG93bkxhdGNoKTsKKyAgICAgICAgdHJ5IChTc2VFdmVudFNvdXJjZSBzb3VyY2UgPSBTc2VFdmVudFNvdXJjZS50YXJnZXQoc3NlVGFyZ2V0KS5idWlsZCgpKSB7CisgICAgICAgICAgICBzb3VyY2UucmVnaXN0ZXIoZXZlbnQgLT4gbWVzc2FnZUxhdGNoLmNvbnN1bWUoZXZlbnQucmVhZERhdGEoUGFpci5jbGFzcykpKTsKKyAgICAgICAgICAgIHNvdXJjZS5vcGVuKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGNvdW50RG93bkxhdGNoLmF3YWl0KDUsIFRpbWVVbml0LlNFQ09ORFMpKTsKKyAgICAgICAgICAgIFBhaXI8U3RyaW5nLCBJbnRlZ2VyPiBwYWlyID0gbWVzc2FnZUxhdGNoLmRhdGEoKS5nZXQoMCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkNpbmR5IiwgcGFpci5nZXRLZXkoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMzAsIHBhaXIuZ2V0VmFsdWUoKS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdlbmVyaWNMaXN0KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgV2ViVGFyZ2V0IHNzZVRhcmdldCA9IHRhcmdldCgiZ2VuZXJpY2VudGl0eXJlc291cmNlL2xpc3QiKS5yZWdpc3RlcihMaXN0UGFpck1CUlcuY2xhc3MpOworICAgICAgICBDb3VudERvd25MYXRjaCBjb3VudERvd25MYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgyKTsKKyAgICAgICAgTWVzc2FnZUxhdGNoPFBhaXI8U3RyaW5nLCBJbnRlZ2VyPj4gbWVzc2FnZUxhdGNoID0gbmV3IE1lc3NhZ2VMYXRjaDw+KGNvdW50RG93bkxhdGNoKTsKKyAgICAgICAgdHJ5IChTc2VFdmVudFNvdXJjZSBzb3VyY2UgPSBTc2VFdmVudFNvdXJjZS50YXJnZXQoc3NlVGFyZ2V0KS5idWlsZCgpKSB7CisgICAgICAgICAgICBzb3VyY2UucmVnaXN0ZXIoZXZlbnQgLT4gbWVzc2FnZUxhdGNoLmNvbnN1bWUoKExpc3Q8UGFpcjxTdHJpbmcsIEludGVnZXI+PikgZXZlbnQucmVhZERhdGEoTGlzdC5jbGFzcykpKTsKKyAgICAgICAgICAgIHNvdXJjZS5vcGVuKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGNvdW50RG93bkxhdGNoLmF3YWl0KDUsIFRpbWVVbml0LlNFQ09ORFMpKTsKKyAgICAgICAgICAgIFBhaXI8U3RyaW5nLCBJbnRlZ2VyPiBjaW5keSA9IG1lc3NhZ2VMYXRjaC5kYXRhKCkuZ2V0KDApOworICAgICAgICAgICAgUGFpcjxTdHJpbmcsIEludGVnZXI+IGphY2sgPSBtZXNzYWdlTGF0Y2guZGF0YSgpLmdldCgxKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiQ2luZHkiLCBjaW5keS5nZXRLZXkoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMzAsIGNpbmR5LmdldFZhbHVlKCkuaW50VmFsdWUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkphY2siLCBqYWNrLmdldEtleSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzMiwgamFjay5nZXRWYWx1ZSgpLmludFZhbHVlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFNpbmdsZXRvbgorICAgIEBQYXRoKCJnZW5lcmljZW50aXR5cmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU1NFR2VuZXJpY0VudGl0eVJlc291cmNlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgic3RyaW5nIikKKyAgICAgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5TRVJWRVJfU0VOVF9FVkVOVFMpCisgICAgICAgIHB1YmxpYyB2b2lkIHNlbmRTdHJpbmcoQENvbnRleHQgU3NlRXZlbnRTaW5rIHNpbmssIEBDb250ZXh0IFNzZSBzc2UpIHsKKyAgICAgICAgICAgIEdlbmVyaWNFbnRpdHk8U3RyaW5nPiBnZXMgPSBuZXcgR2VuZXJpY0VudGl0eTxTdHJpbmc+KCJDaW5keSIpIHsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB0cnkgKFNzZUV2ZW50U2luayBzID0gc2luaykgeworICAgICAgICAgICAgICAgIHMuc2VuZChzc2UubmV3RXZlbnRCdWlsZGVyKCkuZGF0YShnZXMpLmJ1aWxkKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgicGFpciIpCisgICAgICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuU0VSVkVSX1NFTlRfRVZFTlRTKQorICAgICAgICBwdWJsaWMgdm9pZCBzZW5kUGFpcihAQ29udGV4dCBTc2VFdmVudFNpbmsgc2luaywgQENvbnRleHQgU3NlIHNzZSkgeworICAgICAgICAgICAgUGFpcjxTdHJpbmcsIEludGVnZXI+IHBlcnNvbiA9IG5ldyBQYWlyPD4oIkNpbmR5IiwgMzApOworICAgICAgICAgICAgR2VuZXJpY0VudGl0eTxQYWlyPFN0cmluZywgSW50ZWdlcj4+IGVudGl0eSA9IG5ldyBHZW5lcmljRW50aXR5PFBhaXI8U3RyaW5nLCBJbnRlZ2VyPj4ocGVyc29uKSB7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgdHJ5IChTc2VFdmVudFNpbmsgcyA9IHNpbmspIHsKKyAgICAgICAgICAgICAgICBzLnNlbmQoc3NlLm5ld0V2ZW50QnVpbGRlcigpLmRhdGEoZW50aXR5KS5idWlsZCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImxpc3QiKQorICAgICAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlNFUlZFUl9TRU5UX0VWRU5UUykKKyAgICAgICAgcHVibGljIHZvaWQgc2VuZExpc3QoQENvbnRleHQgU3NlRXZlbnRTaW5rIHNpbmssIEBDb250ZXh0IFNzZSBzc2UpIHsKKyAgICAgICAgICAgIFBhaXI8U3RyaW5nLCBJbnRlZ2VyPiBwZXJzb24xID0gbmV3IFBhaXI8PigiQ2luZHkiLCAzMCk7CisgICAgICAgICAgICBQYWlyPFN0cmluZywgSW50ZWdlcj4gcGVyc29uMiA9IG5ldyBQYWlyPD4oIkphY2siLCAzMik7CisgICAgICAgICAgICBMaXN0PFBhaXI8U3RyaW5nLCBJbnRlZ2VyPj4gcGVvcGxlID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgICAgICAgICAgcGVvcGxlLmFkZChwZXJzb24xKTsKKyAgICAgICAgICAgIHBlb3BsZS5hZGQocGVyc29uMik7CisgICAgICAgICAgICBHZW5lcmljRW50aXR5PExpc3Q8UGFpcjxTdHJpbmcsIEludGVnZXI+Pj4gZW50aXR5ID0gbmV3IEdlbmVyaWNFbnRpdHk8TGlzdDxQYWlyPFN0cmluZywgSW50ZWdlcj4+PihwZW9wbGUpIHsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICB0cnkgKFNzZUV2ZW50U2luayBzID0gc2luaykgeworICAgICAgICAgICAgICAgIHMuc2VuZChzc2UubmV3RXZlbnRCdWlsZGVyKCkuZGF0YShlbnRpdHkpLmJ1aWxkKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUGFpck1CUlcgaW1wbGVtZW50cworICAgICAgICAgICAgTWVzc2FnZUJvZHlXcml0ZXI8UGFpcjxTdHJpbmcsIEludGVnZXI+PiwgTWVzc2FnZUJvZHlSZWFkZXI8UGFpcjxTdHJpbmcsIEludGVnZXI+PiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSBQYWlyLmNsYXNzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBQYWlyPFN0cmluZywgSW50ZWdlcj4gcmVhZEZyb20oQ2xhc3M8UGFpcjxTdHJpbmcsIEludGVnZXI+PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtHZW5lcmljRW50aXR5VGVzdC5CVUZGRVJfU0laRV07CisgICAgICAgICAgICBlbnRpdHlTdHJlYW0ucmVhZChidWZmZXIpOworICAgICAgICAgICAgcmV0dXJuIHJlYWRGcm9tKG5ldyBTdHJpbmcoYnVmZmVyLCBDaGFyc2V0LmRlZmF1bHRDaGFyc2V0KCkpLnRyaW0oKSk7CisgICAgICAgIH0KKworICAgICAgICBzdGF0aWMgUGFpcjxTdHJpbmcsIEludGVnZXI+IHJlYWRGcm9tKFN0cmluZyBmcm9tKSB7CisgICAgICAgICAgICBTdHJpbmdbXSBzcGxpdCA9IGZyb20uc3BsaXQoIiwiLCAyKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUGFpcjxTdHJpbmcsIEludGVnZXI+KHNwbGl0WzBdLCBJbnRlZ2VyLnBhcnNlSW50KHNwbGl0WzFdKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSBQYWlyLmNsYXNzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oUGFpcjxTdHJpbmcsIEludGVnZXI+IHN0cmluZ0ludGVnZXJQYWlyLCBDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgd3JpdGVUbyhzdHJpbmdJbnRlZ2VyUGFpciwgZW50aXR5U3RyZWFtKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyB2b2lkIHdyaXRlVG8oUGFpcjxTdHJpbmcsIEludGVnZXI+IHN0cmluZ0ludGVnZXJQYWlyLCBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBzYi5hcHBlbmQoc3RyaW5nSW50ZWdlclBhaXIuZ2V0S2V5KCkpLmFwcGVuZCgiLCIpLmFwcGVuZChzdHJpbmdJbnRlZ2VyUGFpci5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZShzYi50b1N0cmluZygpLmdldEJ5dGVzKENoYXJzZXQuZGVmYXVsdENoYXJzZXQoKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTGlzdFBhaXJNQlJXIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8TGlzdDxQYWlyPFN0cmluZywgSW50ZWdlcj4+PiwKKyAgICAgICAgICAgIE1lc3NhZ2VCb2R5UmVhZGVyPExpc3Q8UGFpcjxTdHJpbmcsIEludGVnZXI+Pj4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gTGlzdC5jbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTGlzdDxQYWlyPFN0cmluZywgSW50ZWdlcj4+IHJlYWRGcm9tKENsYXNzPExpc3Q8UGFpcjxTdHJpbmcsIEludGVnZXI+Pj4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGVudGl0eVN0cmVhbSkKKyAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIExpc3Q8UGFpcjxTdHJpbmcsIEludGVnZXI+PiBsaXN0ID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgICAgICAgICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzIwXTsKKyAgICAgICAgICAgIGVudGl0eVN0cmVhbS5yZWFkKGJ1ZmZlcik7CisgICAgICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKG5ldyBTdHJpbmcoYnVmZmVyLCBDaGFyc2V0LmRlZmF1bHRDaGFyc2V0KCkpLnRyaW0oKSwgIjsiLCBmYWxzZSk7CisgICAgICAgICAgICB3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKSB7CisgICAgICAgICAgICAgICAgbGlzdC5hZGQoUGFpck1CUlcucmVhZEZyb20oc3QubmV4dFRva2VuKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBsaXN0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gTGlzdC5jbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKExpc3Q8UGFpcjxTdHJpbmcsIEludGVnZXI+PiBwYWlycywgQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZvciAoUGFpcjxTdHJpbmcsIEludGVnZXI+IHBhaXIgOiBwYWlycykgeworICAgICAgICAgICAgICAgIFBhaXJNQlJXLndyaXRlVG8ocGFpciwgZW50aXR5U3RyZWFtKTsKKyAgICAgICAgICAgICAgICBlbnRpdHlTdHJlYW0ud3JpdGUoIjsiLmdldEJ5dGVzKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTWVzc2FnZUxhdGNoPFQ+IHsKKyAgICAgICAgcHJpdmF0ZSBDb3VudERvd25MYXRjaCBjb3VudERvd25MYXRjaDsKKyAgICAgICAgcHJpdmF0ZSBMaXN0PFQ+IGRhdGEgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisKKyAgICAgICAgcHJpdmF0ZSBNZXNzYWdlTGF0Y2goQ291bnREb3duTGF0Y2ggY291bnREb3duTGF0Y2gpIHsKKyAgICAgICAgICAgIHRoaXMuY291bnREb3duTGF0Y2ggPSBjb3VudERvd25MYXRjaDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBjb25zdW1lKExpc3Q8VD4gbGlzdCkgeworICAgICAgICAgICAgZm9yIChUIG8gOiBsaXN0KSB7CisgICAgICAgICAgICAgICAgZGF0YS5hZGQobyk7CisgICAgICAgICAgICAgICAgY291bnREb3duTGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgY29uc3VtZShUIG8pIHsKKyAgICAgICAgICAgIGRhdGEuYWRkKG8pOworICAgICAgICAgICAgY291bnREb3duTGF0Y2guY291bnREb3duKCk7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIExpc3Q8VD4gZGF0YSgpIHsKKyAgICAgICAgICAgIHJldHVybiBkYXRhOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zc2UvU3NlQ3VzdG9tRXZlbnRJbXBsVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zc2UvU3NlQ3VzdG9tRXZlbnRJbXBsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNThkMDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NzZS9Tc2VDdXN0b21FdmVudEltcGxUZXN0LmphdmEKQEAgLTAsMCArMSwxODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNzZTsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLnNzZS5JbmJvdW5kU3NlRXZlbnQ7CitpbXBvcnQgamF2YXgud3MucnMuc3NlLk91dGJvdW5kU3NlRXZlbnQ7CitpbXBvcnQgamF2YXgud3MucnMuc3NlLlNzZUV2ZW50U2luazsKK2ltcG9ydCBqYXZheC53cy5ycy5zc2UuU3NlRXZlbnRTb3VyY2U7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLkV2ZW50TGlzdGVuZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLkV2ZW50U291cmNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFRlc3QgdGhhdCB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLk91dGJvdW5kRXZlbnRXcml0ZXJ9IHdvcmtzIHdpdGggY3VzdG9tCisgKiB7QGxpbmsgamF2YXgud3MucnMuc3NlLk91dGJvdW5kU3NlRXZlbnR9IGltcGxlbWVudGF0aW9uLgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFNzZUN1c3RvbUV2ZW50SW1wbFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTU0VfRVZFTlRfTkFNRSA9ICJjdXN0b20tbWVzc2FnZSI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFNzZVJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAUGF0aCgiZXZlbnRzIikKKyAgICBAU2luZ2xldG9uCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTc2VSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlNFUlZFUl9TRU5UX0VWRU5UUykKKyAgICAgICAgcHVibGljIHZvaWQgZ2V0U2VydmVyU2VudEV2ZW50cyhAQ29udGV4dCBmaW5hbCBTc2VFdmVudFNpbmsgZXZlbnRTaW5rKSB7CisgICAgICAgICAgICBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3IgPSBFeGVjdXRvcnMubmV3U2luZ2xlVGhyZWFkRXhlY3V0b3IoKTsKKyAgICAgICAgICAgIGV4ZWN1dG9yLnN1Ym1pdCgoKSAtPiB7CisgICAgICAgICAgICAgICAgZXZlbnRTaW5rLnNlbmQobmV3IE15T3V0Ym91bmRFdmVudCgiZm9vIikpOworICAgICAgICAgICAgICAgIGV2ZW50U2luay5zZW5kKG5ldyBNeU91dGJvdW5kRXZlbnQoImJhciIpKTsKKyAgICAgICAgICAgICAgICBldmVudFNpbmsuc2VuZChuZXcgTXlPdXRib3VuZEV2ZW50KCJiYXoiKSk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdpdGhKYXhSc0FQSSgpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IGVuZHBvaW50ID0gdGFyZ2V0KCkucGF0aCgiZXZlbnRzIik7CisgICAgICAgIGZpbmFsIExpc3Q8SW5ib3VuZFNzZUV2ZW50PiByZXN1bHRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIHRyeSAoZmluYWwgU3NlRXZlbnRTb3VyY2UgZXZlbnRTb3VyY2UgPSBTc2VFdmVudFNvdXJjZS50YXJnZXQoZW5kcG9pbnQpLmJ1aWxkKCkpIHsKKyAgICAgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIHJlY2VpdmVkTGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMyk7CisgICAgICAgICAgICBldmVudFNvdXJjZS5yZWdpc3RlcigoZXZlbnQpIC0+IHsKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChldmVudCk7CisgICAgICAgICAgICAgICAgcmVjZWl2ZWRMYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBldmVudFNvdXJjZS5vcGVuKCk7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGFsbFJlY2VpdmVkID0gcmVjZWl2ZWRMYXRjaC5hd2FpdCg1MDAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoYWxsUmVjZWl2ZWQpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzLCByZXN1bHRzLnNpemUoKSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJmb28iLCByZXN1bHRzLmdldCgwKS5yZWFkRGF0YSgpKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImJhciIsIHJlc3VsdHMuZ2V0KDEpLnJlYWREYXRhKCkpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiYmF6IiwgcmVzdWx0cy5nZXQoMikucmVhZERhdGEoKSk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaXRoSmVyc2V5QVBJKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IGVuZHBvaW50ID0gdGFyZ2V0KCkucGF0aCgiZXZlbnRzIik7CisgICAgICAgIGZpbmFsIEV2ZW50U291cmNlIGV2ZW50U291cmNlID0gRXZlbnRTb3VyY2UudGFyZ2V0KGVuZHBvaW50KS5idWlsZCgpOworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCByZWNlaXZlTGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMyk7CisKKyAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgZmluYWwgRXZlbnRMaXN0ZW5lciBsaXN0ZW5lciA9IGluYm91bmRFdmVudCAtPiB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJlc3VsdHMuYWRkKGluYm91bmRFdmVudC5yZWFkRGF0YSgpKTsKKyAgICAgICAgICAgICAgICByZWNlaXZlTGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhTU0VfRVZFTlRfTkFNRSwgaW5ib3VuZEV2ZW50LmdldE5hbWUoKSk7CisgICAgICAgICAgICB9IGNhdGNoIChQcm9jZXNzaW5nRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkVycm9yIHdoZW4gZGVzZXJpYWxpemluZyBvZiBkYXRhLiIsIGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICAgICAgZXZlbnRTb3VyY2UucmVnaXN0ZXIobGlzdGVuZXIsIFNTRV9FVkVOVF9OQU1FKTsKKyAgICAgICAgZXZlbnRTb3VyY2Uub3BlbigpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShyZWNlaXZlTGF0Y2guYXdhaXQoNTAwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMywgcmVzdWx0cy5zaXplKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJmb28iLCByZXN1bHRzLmdldCgwKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImJhciIsIHJlc3VsdHMuZ2V0KDEpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiYmF6IiwgcmVzdWx0cy5nZXQoMikpOworICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBNeU91dGJvdW5kRXZlbnQgaW1wbGVtZW50cyBPdXRib3VuZFNzZUV2ZW50IHsKKworICAgICAgICBwcml2YXRlIFN0cmluZyBkYXRhOworCisgICAgICAgIHB1YmxpYyBNeU91dGJvdW5kRXZlbnQoU3RyaW5nIGRhdGEpIHsKKyAgICAgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENsYXNzPD8+IGdldFR5cGUoKSB7CisgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmNsYXNzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBUeXBlIGdldEdlbmVyaWNUeXBlKCkgeworICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5jbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTWVkaWFUeXBlIGdldE1lZGlhVHlwZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGF0YSgpIHsKKyAgICAgICAgICAgIHJldHVybiBkYXRhOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gU1NFX0VWRU5UX05BTUU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb21tZW50KCkgeworICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldFJlY29ubmVjdERlbGF5KCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZWNvbm5lY3REZWxheVNldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc3NlL1NzZUV2ZW50U2lua1RvRXZlbnRTb3VyY2VUZXN0LmphdmEgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NzZS9Tc2VFdmVudFNpbmtUb0V2ZW50U291cmNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYzlhZjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NzZS9Tc2VFdmVudFNpbmtUb0V2ZW50U291cmNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjEwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zc2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5zc2UuSW5ib3VuZFNzZUV2ZW50OworaW1wb3J0IGphdmF4LndzLnJzLnNzZS5Tc2U7CitpbXBvcnQgamF2YXgud3MucnMuc3NlLlNzZUV2ZW50U2luazsKK2ltcG9ydCBqYXZheC53cy5ycy5zc2UuU3NlRXZlbnRTb3VyY2U7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLkV2ZW50TGlzdGVuZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLkV2ZW50U291cmNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIEpBWC1SUyB7QGxpbmsgU3NlRXZlbnRTb3VyY2V9IGFuZCB7QGxpbmsgU3NlRXZlbnRTaW5rfSB0ZXN0LgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFNzZUV2ZW50U2lua1RvRXZlbnRTb3VyY2VUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5URUdFUl9TU0VfTkFNRSA9ICJpbnRlZ2VyLW1lc3NhZ2UiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFNzZUV2ZW50U2lua1RvRXZlbnRTb3VyY2VUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFNzZVJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0NPVU5UID0gMTA7CisgICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgQ291bnREb3duTGF0Y2ggdHJhbnNtaXRMYXRjaDsKKworICAgIEBQYXRoKCJldmVudHMiKQorICAgIEBTaW5nbGV0b24KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNzZVJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuU0VSVkVSX1NFTlRfRVZFTlRTKQorICAgICAgICBwdWJsaWMgdm9pZCBnZXRTZXJ2ZXJTZW50RXZlbnRzKEBDb250ZXh0IGZpbmFsIFNzZUV2ZW50U2luayBldmVudFNpbmssIEBDb250ZXh0IGZpbmFsIFNzZSBzc2UpIHsKKyAgICAgICAgICAgIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvciA9IEV4ZWN1dG9ycy5uZXdTaW5nbGVUaHJlYWRFeGVjdXRvcigpOworICAgICAgICAgICAgZXhlY3V0b3Iuc3VibWl0KCgpIC0+IHsKKyAgICAgICAgICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgICAgICAgICAgd2hpbGUgKHRyYW5zbWl0TGF0Y2guZ2V0Q291bnQoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgZXZlbnRTaW5rLnNlbmQoc3NlLm5ld0V2ZW50QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5hbWUoSU5URUdFUl9TU0VfTkFNRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWVkaWFUeXBlKE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRhdGEoSW50ZWdlci5jbGFzcywgaSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gc2VuZCBhbm90aGVyIGV2ZW50IHdpdGggbmFtZSAiZm9vIiAtPiBzaG91bGQgYmUgaWdub3JlZCBieSB0aGUgY2xpZW50CisgICAgICAgICAgICAgICAgICAgIGV2ZW50U2luay5zZW5kKHNzZS5uZXdFdmVudEJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5uYW1lKCJmb28iKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tZWRpYVR5cGUoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGF0YShTdHJpbmcuY2xhc3MsICJiYXIiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBzZW5kIGFub3RoZXIgdW5uYW1lZCBldmVudCAtPiBzaG91bGQgYmUgaWdub3JlZCBieSB0aGUgY2xpZW50CisgICAgICAgICAgICAgICAgICAgIGV2ZW50U2luay5zZW5kKHNzZS5uZXdFdmVudEJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tZWRpYVR5cGUoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGF0YShTdHJpbmcuY2xhc3MsICJiYXoiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNtaXRMYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2l0aFNpbXBsZVN1YnNjcmliZXIoKSB7CisgICAgICAgIHRyYW5zbWl0TGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goTVNHX0NPVU5UKTsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IGVuZHBvaW50ID0gdGFyZ2V0KCkucGF0aCgiZXZlbnRzIik7CisgICAgICAgIGZpbmFsIExpc3Q8SW5ib3VuZFNzZUV2ZW50PiByZXN1bHRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIHRyeSAoZmluYWwgU3NlRXZlbnRTb3VyY2UgZXZlbnRTb3VyY2UgPSBTc2VFdmVudFNvdXJjZS50YXJnZXQoZW5kcG9pbnQpLmJ1aWxkKCkpIHsKKyAgICAgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIHJlY2VpdmVkTGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMyAqIE1TR19DT1VOVCk7CisgICAgICAgICAgICBldmVudFNvdXJjZS5yZWdpc3RlcigoZXZlbnQpIC0+IHsKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChldmVudCk7CisgICAgICAgICAgICAgICAgcmVjZWl2ZWRMYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBldmVudFNvdXJjZS5vcGVuKCk7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIGFsbFRyYW5zbWl0dGVkID0gdHJhbnNtaXRMYXRjaC5hd2FpdCg1MDAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBhbGxSZWNlaXZlZCA9IHJlY2VpdmVkTGF0Y2guYXdhaXQoNTAwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGFsbFRyYW5zbWl0dGVkKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGFsbFJlY2VpdmVkKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzAsIHJlc3VsdHMuc2l6ZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdpdGhKZXJzZXlBcGkoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgZW5kcG9pbnQgPSB0YXJnZXQoKS5wYXRoKCJldmVudHMiKTsKKyAgICAgICAgZmluYWwgRXZlbnRTb3VyY2UgZXZlbnRTb3VyY2UgPSBFdmVudFNvdXJjZS50YXJnZXQoZW5kcG9pbnQpLmJ1aWxkKCk7CisgICAgICAgIHRyYW5zbWl0TGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goTVNHX0NPVU5UKTsKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggcmVjZWl2ZUxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKE1TR19DT1VOVCk7CisKKyAgICAgICAgZmluYWwgTGlzdDxJbnRlZ2VyPiByZXN1bHRzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZpbmFsIEV2ZW50TGlzdGVuZXIgbGlzdGVuZXIgPSBpbmJvdW5kRXZlbnQgLT4geworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXN1bHRzLmFkZChpbmJvdW5kRXZlbnQucmVhZERhdGEoSW50ZWdlci5jbGFzcykpOworICAgICAgICAgICAgICAgIHJlY2VpdmVMYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKElOVEVHRVJfU1NFX05BTUUsIGluYm91bmRFdmVudC5nZXROYW1lKCkpOworICAgICAgICAgICAgfSBjYXRjaCAoUHJvY2Vzc2luZ0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFcnJvciB3aGVuIGRlc2VyaWFsaXppbmcgb2YgZGF0YS4iLCBleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIGV2ZW50U291cmNlLnJlZ2lzdGVyKGxpc3RlbmVyLCBJTlRFR0VSX1NTRV9OQU1FKTsKKyAgICAgICAgZXZlbnRTb3VyY2Uub3BlbigpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSh0cmFuc21pdExhdGNoLmF3YWl0KDUwMDAsIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShyZWNlaXZlTGF0Y2guYXdhaXQoNTAwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTAsIHJlc3VsdHMuc2l6ZSgpKTsKKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdpdGhFdmVudFNvdXJjZSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIHRyYW5zbWl0TGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMiAqIE1TR19DT1VOVCk7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCBlbmRwb2ludCA9IHRhcmdldCgpLnBhdGgoImV2ZW50cyIpOworICAgICAgICBmaW5hbCBTc2VFdmVudFNvdXJjZSBldmVudFNvdXJjZSA9IFNzZUV2ZW50U291cmNlLnRhcmdldChlbmRwb2ludCkuYnVpbGQoKTsKKworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBjb3VudDEgPSBuZXcgQ291bnREb3duTGF0Y2goMyAqIE1TR19DT1VOVCk7CisgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGNvdW50MiA9IG5ldyBDb3VudERvd25MYXRjaCgzICogTVNHX0NPVU5UKTsKKworICAgICAgICBldmVudFNvdXJjZS5yZWdpc3RlcihuZXcgSW5ib3VuZEhhbmRsZXIoImNvbnN1bWVyMSIsIGNvdW50MSkpOworICAgICAgICBldmVudFNvdXJjZS5yZWdpc3RlcihuZXcgSW5ib3VuZEhhbmRsZXIoImNvbnN1bWVyMiIsIGNvdW50MikpOworCisgICAgICAgIGV2ZW50U291cmNlLm9wZW4oKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBzZW50ID0gdHJhbnNtaXRMYXRjaC5hd2FpdCg1ICogZ2V0QXN5bmNUaW1lb3V0TXVsdGlwbGllcigpLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkF3YWl0aW5nIGZvciBTU0UgbWVzc2FnZSBoYXMgdGltZW91dC4gTm90IGFsbCBtZXNzYWdlIHdlcmUgc2VudC4iLCBzZW50KTsKKworICAgICAgICBmaW5hbCBib29sZWFuIGhhbmRsZWQyID0gY291bnQyLmF3YWl0KDUgKiBnZXRBc3luY1RpbWVvdXRNdWx0aXBsaWVyKCksIFRpbWVVbml0LlNFQ09ORFMpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICAiQXdhaXRpbmcgZm9yIFNTRSBtZXNzYWdlIGhhcyB0aW1lb3V0LiBOb3QgYWxsIG1lc3NhZ2Ugd2VyZSBoYW5kbGVkIGJ5IGV2ZW50U291cmNlMi4iLCBoYW5kbGVkMik7CisKKyAgICAgICAgZmluYWwgYm9vbGVhbiBoYW5kbGVkMSA9IGNvdW50MS5hd2FpdCg1ICogZ2V0QXN5bmNUaW1lb3V0TXVsdGlwbGllcigpLCBUaW1lVW5pdC5TRUNPTkRTKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCisgICAgICAgICAgICAgICAgIkF3YWl0aW5nIGZvciBTU0UgbWVzc2FnZSBoYXMgdGltZW91dC4gTm90IGFsbCBtZXNzYWdlIHdlcmUgaGFuZGxlZCBieSBldmVudFNvdXJjZTEuIiwgaGFuZGxlZDEpOworCisgICAgfQorCisgICAgcHJpdmF0ZSBjbGFzcyBJbmJvdW5kSGFuZGxlciBpbXBsZW1lbnRzIENvbnN1bWVyPEluYm91bmRTc2VFdmVudD4geworICAgICAgICBwcml2YXRlIGZpbmFsIENvdW50RG93bkxhdGNoIGxhdGNoOworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisgICAgICAgIEluYm91bmRIYW5kbGVyKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCkgeworICAgICAgICAgICAgdGhpcy5sYXRjaCA9IGxhdGNoOworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBhY2NlcHQoZmluYWwgSW5ib3VuZFNzZUV2ZW50IGluYm91bmRTc2VFdmVudCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBpZiAoSU5URUdFUl9TU0VfTkFNRS5lcXVhbHMoaW5ib3VuZFNzZUV2ZW50LmdldE5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgSW50ZWdlciBkYXRhID0gaW5ib3VuZFNzZUV2ZW50LnJlYWREYXRhKEludGVnZXIuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICBMT0dHRVIuaW5mbyhTdHJpbmcuZm9ybWF0KCJbJXNdIEludGVnZXIgZGF0YSByZWNlaXZlZDogW2lkPSVzIG5hbWU9JXMgY29tbWVudD0lcyByZWNvbm5lY3REZWxheT0lZCB2YWx1ZT0lZF0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5ib3VuZFNzZUV2ZW50LmdldElkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5ib3VuZFNzZUV2ZW50LmdldE5hbWUoKSwgaW5ib3VuZFNzZUV2ZW50LmdldENvbW1lbnQoKSwgaW5ib3VuZFNzZUV2ZW50LmdldFJlY29ubmVjdERlbGF5KCksIGRhdGEpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGF0YSA9IGluYm91bmRTc2VFdmVudC5yZWFkRGF0YSgpOworICAgICAgICAgICAgICAgICAgICBMT0dHRVIuaW5mbyhTdHJpbmcuZm9ybWF0KCJbJXNdIFN0cmluZyBkYXRhIHJlY2VpdmVkOiBbaWQ9JXMgbmFtZT0lcyBjb21tZW50PSVzIHJlY29ubmVjdERlbGF5PSVkIHZhbHVlPSVzXSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmJvdW5kU3NlRXZlbnQuZ2V0SWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmJvdW5kU3NlRXZlbnQuZ2V0TmFtZSgpLCBpbmJvdW5kU3NlRXZlbnQuZ2V0Q29tbWVudCgpLCBpbmJvdW5kU3NlRXZlbnQuZ2V0UmVjb25uZWN0RGVsYXkoKSwgZGF0YSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFByb2Nlc3NpbmdFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXJyb3Igd2hlbiBkZXNlcmlhbGl6aW5nIHRoZSBkYXRhLiIsIGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvSmVyc2V5X3llbGxvdy5wbmcgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0plcnNleV95ZWxsb3cucG5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNzRjZDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvZW50aXR5L0plcnNleV95ZWxsb3cucG5nCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZHVrZV9yb2NrZXQuZ2lmIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9kdWtlX3JvY2tldC5naWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIwMzA0ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvZHVrZV9yb2NrZXQuZ2lmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvbXVsdGlwYXJ0LXRlc3RjYXNlLnR4dCBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkvbXVsdGlwYXJ0LXRlc3RjYXNlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDU1N2NjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS9tdWx0aXBhcnQtdGVzdGNhc2UudHh0CkBAIC0wLDAgKzEsMTEgQEAKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tN2RjOTQxNTIwODg4CitDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9InRleHQiCisKK2JoaGtsYgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS03ZGM5NDE1MjA4ODgKK0NvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0iZmlsZSI7IGZpbGVuYW1lPSJDOlxqYXZhXHByb2plY3RzXG11bHRpcGFydC10ZXN0Y2FzZVxwb20ueG1sIgorQ29udGVudC1UeXBlOiB0ZXh0L3htbAorCis8cHJvamVjdC8+CisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tN2RjOTQxNTIwODg4LS0KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkveHhlLnR4dCBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9lbnRpdHkveHhlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWQyN2I1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2VudGl0eS94eGUudHh0CkBAIC0wLDAgKzEgQEAKK0NPTVBST01JU0VEClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9BbmltYWxMaXN0Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0FuaW1hbExpc3QuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTFjYWY2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9BbmltYWxMaXN0Lmpzb24KQEAgLTAsMCArMSBAQAoreyJhbmltYWxzIjpbeyJAdHlwZSI6IkRvZyIsIm5hbWUiOiJGaWZpIn0seyJAdHlwZSI6IkNhdCIsIm5hbWUiOiJEYWlzeSIsIm5pY2tOYW1lIjpudWxsfV19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9BbmltYWxMaXN0X01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfQW5pbWFsTGlzdF9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkxY2FmNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfQW5pbWFsTGlzdF9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJhbmltYWxzIjpbeyJAdHlwZSI6IkRvZyIsIm5hbWUiOiJGaWZpIn0seyJAdHlwZSI6IkNhdCIsIm5hbWUiOiJEYWlzeSIsIm5pY2tOYW1lIjpudWxsfV19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9Bbm90aGVyQXJyYXlUZXN0QmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9Bbm90aGVyQXJyYXlUZXN0QmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmYjM3MDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0Fub3RoZXJBcnJheVRlc3RCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJjYXRzIjpbeyJuYW1lIjoiRm9vIiwibmlja05hbWUiOiJLaXR0eSJ9LHsibmFtZSI6IkJhciIsIm5pY2tOYW1lIjoiUHVzcyJ9XSwicHJvcCI6InRlc3RQcm9wIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0Fub3RoZXJBcnJheVRlc3RCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfQW5vdGhlckFycmF5VGVzdEJlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmYjM3MDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0Fub3RoZXJBcnJheVRlc3RCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImNhdHMiOlt7Im5hbWUiOiJGb28iLCJuaWNrTmFtZSI6IktpdHR5In0seyJuYW1lIjoiQmFyIiwibmlja05hbWUiOiJQdXNzIn1dLCJwcm9wIjoidGVzdFByb3AifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfQXR0ckFuZENoYXJEYXRhQmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9BdHRyQW5kQ2hhckRhdGFCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY1ZTFmNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfQXR0ckFuZENoYXJEYXRhQmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3siYXR0ciI6ImF2YWwiLCJ2YWx1ZSI6InB2YWwifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfQXR0ckFuZENoYXJEYXRhQmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0F0dHJBbmRDaGFyRGF0YUJlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NWUxZjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0F0dHJBbmRDaGFyRGF0YUJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siYXR0ciI6ImF2YWwiLCJ2YWx1ZSI6InB2YWwifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlcy5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkyYzQxYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlcy5qc29uCkBAIC0wLDAgKzEgQEAKK3siYTEiOiJoZWxsbyBkb2xseSIsImEyIjozMTQxNTkyNiwiZmlsbGVyMSI6IjExMSIsImxpc3QiOlt7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8iLCJzMSI6ImhpIHRoZXJlIiwiaSI6MzEyLCJqIjoiYnVtcGVyIn0seyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIiwiczEiOiJoaSB0aGVyZSIsImkiOjMxMiwiaiI6ImJ1bXBlciJ9XSwiZmlsbGVyMiI6IjIyMiIsImIiOnsidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyIsInMxIjoiaGkgdGhlcmUiLCJpIjozMTIsImoiOiJidW1wZXIifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMyLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMyLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEzZGQ1NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczIuanNvbgpAQCAtMCwwICsxIEBACit7ImExIjoiaGVsbG8gZG9sbHkiLCJhMiI6MzE0MTU5MjYsImZpbGxlcjEiOiIxMTEiLCJsaXN0IjpbeyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIn0seyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIn1dLCJmaWxsZXIyIjoiMjIyIiwiYiI6eyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMyX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTNkZDU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJhMSI6ImhlbGxvIGRvbGx5IiwiYTIiOjMxNDE1OTI2LCJmaWxsZXIxIjoiMTExIiwibGlzdCI6W3sidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9LHsidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9XSwiZmlsbGVyMiI6IjIyMiIsImIiOnsidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczMuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczMuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGQ2Mzc5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMy5qc29uCkBAIC0wLDAgKzEgQEAKK3siYiI6eyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIn0sImMiOnsidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczNfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzM19NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RkNjM3OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczNfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siYiI6eyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIn0sImMiOnsidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczQuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczQuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjU0YTIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzNC5qc29uCkBAIC0wLDAgKzEgQEAKK3siYTEiOm51bGwsImEyIjpudWxsLCJsaXN0IjpbXSwiYiI6eyJ1cmkiOm51bGwsInMxIjpudWxsLCJpIjpudWxsLCJqIjpudWxsfX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXM0X01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczRfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2NTRhMjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXM0X01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImExIjpudWxsLCJhMiI6bnVsbCwibGlzdCI6W10sImIiOnsidXJpIjpudWxsLCJzMSI6bnVsbCwiaSI6bnVsbCwiaiI6bnVsbH19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlc19NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkyYzQxYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlc19NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJhMSI6ImhlbGxvIGRvbGx5IiwiYTIiOjMxNDE1OTI2LCJmaWxsZXIxIjoiMTExIiwibGlzdCI6W3sidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyIsInMxIjoiaGkgdGhlcmUiLCJpIjozMTIsImoiOiJidW1wZXIifSx7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8iLCJzMSI6ImhpIHRoZXJlIiwiaSI6MzEyLCJqIjoiYnVtcGVyIn1dLCJmaWxsZXIyIjoiMjIyIiwiYiI6eyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIiwiczEiOiJoaSB0aGVyZSIsImkiOjMxMiwiaiI6ImJ1bXBlciJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50QmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9FbXB0eUVsZW1lbnRCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQwY2YyZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50QmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3sibnVsbE9ubHkiOm51bGx9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9FbXB0eUVsZW1lbnRCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50QmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQwY2YyZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50QmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJudWxsT25seSI6bnVsbH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudENvbnRhaW5pbmdCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudENvbnRhaW5pbmdCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBhMTk5YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50Q29udGFpbmluZ0JlYW4uanNvbgpAQCAtMCwwICsxIEBACit7ImVtcHR5QmVhbiI6bnVsbCwiYyI6ImZvbyIsImQiOiJiYXIifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50Q29udGFpbmluZ0JlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9FbXB0eUVsZW1lbnRDb250YWluaW5nQmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBhMTk5YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50Q29udGFpbmluZ0JlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siZW1wdHlCZWFuIjpudWxsLCJjIjoiZm9vIiwiZCI6ImJhciJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9FbmNvZGVkQ29udGVudEJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfRW5jb2RlZENvbnRlbnRCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRkZTNhNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfRW5jb2RlZENvbnRlbnRCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJvbmUiOiJcdG9uZVxuXHRiaWciLCJ0d28iOiJoYWbEjCJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9FbmNvZGVkQ29udGVudEJlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9FbmNvZGVkQ29udGVudEJlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZGUzYTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0VuY29kZWRDb250ZW50QmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJvbmUiOiJcdG9uZVxuXHRiaWciLCJ0d28iOiJoYWbEjCJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9GYWtlQXJyYXlCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0Zha2VBcnJheUJlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzJiMDk4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9GYWtlQXJyYXlCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJ3ZWlnaHQiOlsiMWtnIiwiMmtnIl0sImNvbG9yIjoicmVkIiwibmFtZSI6ImJ1bXBlciJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9GYWtlQXJyYXlCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfRmFrZUFycmF5QmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMyYjA5OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfRmFrZUFycmF5QmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJ3ZWlnaHQiOlsiMWtnIiwiMmtnIl0sImNvbG9yIjoicmVkIiwibmFtZSI6ImJ1bXBlciJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9JbnRBcnJheS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9JbnRBcnJheS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NDU3MTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0ludEFycmF5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJpbnRBcnJheSI6WzRdLCJpbnRlZ2VyQXJyYXkiOlszXSwibnVtYmVyIjo4fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfSW50QXJyYXlfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9JbnRBcnJheV9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ0NTcxNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfSW50QXJyYXlfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siaW50QXJyYXkiOls0XSwiaW50ZWdlckFycmF5IjpbM10sIm51bWJlciI6OH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0plcnNleTExOTlMaXN0Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0plcnNleTExOTlMaXN0Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzViMjg3MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfSmVyc2V5MTE5OUxpc3QuanNvbgpAQCAtMCwwICsxIEBACit7Im9iamVjdHMiOlt7IkB0eXBlIjoiQ29sb3JIb2xkZXIiLCJjb2xvcnMiOlsiUkVEIiwiQkxVRSJdfSx7IkB0eXBlIjoiQ29sb3JIb2xkZXIiLCJjb2xvcnMiOlsiR1JFRU4iXX1dLCJvZmZzZXQiOjAsInRvdGFsIjoyfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfSmVyc2V5MTE5OUxpc3RfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9KZXJzZXkxMTk5TGlzdF9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzViMjg3MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfSmVyc2V5MTE5OUxpc3RfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sib2JqZWN0cyI6W3siQHR5cGUiOiJDb2xvckhvbGRlciIsImNvbG9ycyI6WyJSRUQiLCJCTFVFIl19LHsiQHR5cGUiOiJDb2xvckhvbGRlciIsImNvbG9ycyI6WyJHUkVFTiJdfV0sIm9mZnNldCI6MCwidG90YWwiOjJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9MaXN0QW5kTm9uTGlzdEJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfTGlzdEFuZE5vbkxpc3RCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg1Y2FkOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfTGlzdEFuZE5vbkxpc3RCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJhIjpbIjEiXSwiZCI6IjIifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfTGlzdEFuZE5vbkxpc3RCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfTGlzdEFuZE5vbkxpc3RCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODVjYWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9MaXN0QW5kTm9uTGlzdEJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siYSI6WyIxIl0sImQiOiIyIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0xpc3RFbXB0eUJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfTGlzdEVtcHR5QmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YTlmNTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0xpc3RFbXB0eUJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7ImVtcHR5IjpbXX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0xpc3RFbXB0eUJlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9MaXN0RW1wdHlCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWE5ZjUzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9MaXN0RW1wdHlCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImVtcHR5IjpbXX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX0xpc3RXcmFwcGVyQmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9MaXN0V3JhcHBlckJlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzkxNjBlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9MaXN0V3JhcHBlckJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7InByb3BlcnR5IjpudWxsfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfTGlzdFdyYXBwZXJCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfTGlzdFdyYXBwZXJCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzkxNjBlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9MaXN0V3JhcHBlckJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sicHJvcGVydHkiOm51bGx9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9NeVJlc3BvbnNlLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX015UmVzcG9uc2UuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTkxNDhlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9NeVJlc3BvbnNlLmpzb24KQEAgLTAsMCArMSBAQAoreyJteU1lc3NhZ2UiOlt7ImlkIjoiMCIsInRleHQiOiJvayJ9LHsiaWQiOiIxIiwidGV4dCI6Im9rIn1dLCJteUVycm9yIjp7ImlkIjoiLTEiLCJkZXNjIjoiZXJyb3IifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX015UmVzcG9uc2VfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9NeVJlc3BvbnNlX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTkxNDhlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9NeVJlc3BvbnNlX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7Im15TWVzc2FnZSI6W3siaWQiOiIwIiwidGV4dCI6Im9rIn0seyJpZCI6IjEiLCJ0ZXh0Ijoib2sifV0sIm15RXJyb3IiOnsiaWQiOiItMSIsImRlc2MiOiJlcnJvciJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfTmFtZXNwYWNlQmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM4NmQ1ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfTmFtZXNwYWNlQmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3siYSI6ImZvbyIsImIiOiJiYXIifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfTmFtZXNwYWNlQmVhbldpdGhBdHRyaWJ1dGUuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfTmFtZXNwYWNlQmVhbldpdGhBdHRyaWJ1dGUuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjNlOWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuV2l0aEF0dHJpYnV0ZS5qc29uCkBAIC0wLDAgKzEgQEAKK3siYXR0ciI6InZhbHVlIiwiYSI6ImZvbyIsImIiOiJiYXIifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfTmFtZXNwYWNlQmVhbldpdGhBdHRyaWJ1dGVfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuV2l0aEF0dHJpYnV0ZV9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIzZTlkNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfTmFtZXNwYWNlQmVhbldpdGhBdHRyaWJ1dGVfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siYXR0ciI6InZhbHVlIiwiYSI6ImZvbyIsImIiOiJiYXIifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfTmFtZXNwYWNlQmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzODZkNWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siYSI6ImZvbyIsImIiOiJiYXIifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfTnVsbFN0cmluZ0JlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfTnVsbFN0cmluZ0JlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YThjZDNkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9OdWxsU3RyaW5nQmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3sibnVsbFN0cmluZyI6Im5vdCBudWxsIHRvIHRlc3QgaWYgc2V0IHRvIG51bGwgd29ya3MifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfTnVsbFN0cmluZ0JlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9OdWxsU3RyaW5nQmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE4Y2QzZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfTnVsbFN0cmluZ0JlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sibnVsbFN0cmluZyI6Im5vdCBudWxsIHRvIHRlc3QgaWYgc2V0IHRvIG51bGwgd29ya3MifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfUGVyc29uLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1BlcnNvbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZGMwNjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1BlcnNvbi5qc29uCkBAIC0wLDAgKzEgQEAKK3sibmFtZSI6IkpvZSBTY2htbyIsImNoaWxkcmVuIjpbeyJuYW1lIjoiSmlsbCBTY2htbyJ9LHsibmFtZSI6IkphY2sgU2NobW8ifV19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9QZXJzb25fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9QZXJzb25fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZGMwNjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1BlcnNvbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJuYW1lIjoiSm9lIFNjaG1vIiwiY2hpbGRyZW4iOlt7Im5hbWUiOiJKaWxsIFNjaG1vIn0seyJuYW1lIjoiSmFjayBTY2htbyJ9XX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1Bvam9BbmltYWxMaXN0Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1Bvam9BbmltYWxMaXN0Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNmODFkZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfUG9qb0FuaW1hbExpc3QuanNvbgpAQCAtMCwwICsxIEBACit7ImFuaW1hbHMiOlt7IkB0eXBlIjoiUG9qb0RvZyIsIm5hbWUiOiJGaWZpIn0seyJAdHlwZSI6IlBvam9DYXQiLCJuYW1lIjoiRGFpc3kiLCJuaWNrTmFtZSI6bnVsbH1dfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfUG9qb0FuaW1hbExpc3RfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9Qb2pvQW5pbWFsTGlzdF9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNmODFkZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfUG9qb0FuaW1hbExpc3RfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siYW5pbWFscyI6W3siQHR5cGUiOiJQb2pvRG9nIiwibmFtZSI6IkZpZmkifSx7IkB0eXBlIjoiUG9qb0NhdCIsIm5hbWUiOiJEYWlzeSIsIm5pY2tOYW1lIjpudWxsfV19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9QdXJlQ2hhckRhdGFCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1B1cmVDaGFyRGF0YUJlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2QzMTUzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9QdXJlQ2hhckRhdGFCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJ2YWx1ZSI6InNvbWUgdGV4dHVhbCBjb250ZW50In0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1B1cmVDaGFyRGF0YUJlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9QdXJlQ2hhckRhdGFCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2QzMTUzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9QdXJlQ2hhckRhdGFCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7InZhbHVlIjoic29tZSB0ZXh0dWFsIGNvbnRlbnQifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfUmVnaXN0ZXJNZXNzYWdlLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1JlZ2lzdGVyTWVzc2FnZS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZjQ5YjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1JlZ2lzdGVyTWVzc2FnZS5qc29uCkBAIC0wLDAgKzEgQEAKK3siYWdlbnRVSUQiOiJhZ2VudEtvY2thIiwicmVxdWVzdFRpbWUiOjEyMzR9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9SZWdpc3Rlck1lc3NhZ2VfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9SZWdpc3Rlck1lc3NhZ2VfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZjQ5YjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1JlZ2lzdGVyTWVzc2FnZV9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJhZ2VudFVJRCI6ImFnZW50S29ja2EiLCJyZXF1ZXN0VGltZSI6MTIzNH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMzgwYjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7ImNoaWxkIjoic2ltcGxlIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoQXR0cmlidXRlcy5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXMuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODY4MzQxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXMuanNvbgpAQCAtMCwwICsxIEBACit7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8iLCJzMSI6ImhpIHRoZXJlIiwiaSI6MzEyLCJqIjoiYnVtcGVyIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoQXR0cmlidXRlc19NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoQXR0cmlidXRlc19NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg2ODM0MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhBdHRyaWJ1dGVzX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8iLCJzMSI6ImhpIHRoZXJlIiwiaSI6MzEyLCJqIjoiYnVtcGVyIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGUuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTg5ODk2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGUuanNvbgpAQCAtMCwwICsxIEBACit7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8ifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlQW5kVmFsdWUuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlQW5kVmFsdWUuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmVjYTIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVBbmRWYWx1ZS5qc29uCkBAIC0wLDAgKzEgQEAKK3sidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyIsInZhbHVlIjoiY2hhcmFjdGVycyJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVBbmRWYWx1ZV9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZUFuZFZhbHVlX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmVjYTIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVBbmRWYWx1ZV9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIiwidmFsdWUiOiJjaGFyYWN0ZXJzIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZV9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZV9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk4OTg5NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8ifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMzgwYjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siY2hpbGQiOiJzaW1wbGUifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfVHJlZU1vZGVsLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1RyZWVNb2RlbC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZmFkYjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1RyZWVNb2RlbC5qc29uCkBAIC0wLDAgKzEgQEAKK3sicm9vdCI6eyJsYWJlbCI6ImR1bW15IG5vZGUiLCJleHBhbmRlZCI6ZmFsc2V9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfVHJlZU1vZGVsX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfVHJlZU1vZGVsX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmZhZGIzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9UcmVlTW9kZWxfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sicm9vdCI6eyJsYWJlbCI6ImR1bW15IG5vZGUiLCJleHBhbmRlZCI6ZmFsc2V9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfVHdvTGlzdHNXcmFwcGVyQmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9Ud29MaXN0c1dyYXBwZXJCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRmZjIzOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfVHdvTGlzdHNXcmFwcGVyQmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3sicHJvcGVydHkxIjpbImExIiwiYTEiXSwicHJvcGVydHkyIjpbImIxIl19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9Ud29MaXN0c1dyYXBwZXJCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfVHdvTGlzdHNXcmFwcGVyQmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRmZjIzOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfVHdvTGlzdHNXcmFwcGVyQmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJwcm9wZXJ0eTEiOlsiYTEiLCJhMSJdLCJwcm9wZXJ0eTIiOlsiYjEiXX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1VzZXIuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfVXNlci5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMzJlZTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1VzZXIuanNvbgpAQCAtMCwwICsxIEBACit7Im5hbWUiOiJHcm90ZWZlbmQiLCJ1c2VyaWQiOiIxNjIxIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1VzZXJUYWJsZS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9Vc2VyVGFibGUuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yzk1NjFmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9Vc2VyVGFibGUuanNvbgpAQCAtMCwwICsxIEBACit7ImNvbHVtbnMiOlt7ImlkIjoidXNlcmlkIiwibGFiZWwiOiJVc2VySUQifSx7ImlkIjoibmFtZSIsImxhYmVsIjoiVXNlciBOYW1lIn1dLCJyb3dzIjpbeyJuYW1lIjoiR3JvdGVmZW5kIiwidXNlcmlkIjoiMTYyMSJ9XX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1VzZXJUYWJsZV9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1VzZXJUYWJsZV9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M5NTYxZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uMUpzb25UZXN0UHJvdmlkZXJfVXNlclRhYmxlX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImNvbHVtbnMiOlt7ImlkIjoidXNlcmlkIiwibGFiZWwiOiJVc2VySUQifSx7ImlkIjoibmFtZSIsImxhYmVsIjoiVXNlciBOYW1lIn1dLCJyb3dzIjpbeyJuYW1lIjoiR3JvdGVmZW5kIiwidXNlcmlkIjoiMTYyMSJ9XX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3NvbjFKc29uVGVzdFByb3ZpZGVyX1VzZXJfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9Vc2VyX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDMyZWU1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb24xSnNvblRlc3RQcm92aWRlcl9Vc2VyX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7Im5hbWUiOiJHcm90ZWZlbmQiLCJ1c2VyaWQiOiIxNjIxIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfQW5pbWFsTGlzdC5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0FuaW1hbExpc3QuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGEyNzdlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0FuaW1hbExpc3QuanNvbgpAQCAtMCwwICsxIEBACit7ImFuaW1hbHMiOlt7IkB0eXBlIjoiRG9nIiwibmFtZSI6IkZpZmkifSx7IkB0eXBlIjoiQ2F0Iiwibmlja05hbWUiOm51bGwsIm5hbWUiOiJEYWlzeSJ9XX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfQW5pbWFsTGlzdF9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfQW5pbWFsTGlzdF9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY4YWQyNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9BbmltYWxMaXN0X01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImFuaW1hbHMiOlt7IkB0eXBlIjoiRG9nIiwibmFtZSI6IkZpZmkifSx7IkB0eXBlIjoiQ2F0IiwibmFtZSI6IkRhaXN5Iiwibmlja05hbWUiOm51bGx9XX0KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9Bbm90aGVyQXJyYXlUZXN0QmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0Fub3RoZXJBcnJheVRlc3RCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM2NGYwMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9Bbm90aGVyQXJyYXlUZXN0QmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3sicHJvcCI6InRlc3RQcm9wIiwiY2F0cyI6W3sibmlja05hbWUiOiJLaXR0eSIsIm5hbWUiOiJGb28ifSx7Im5pY2tOYW1lIjoiUHVzcyIsIm5hbWUiOiJCYXIifV19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0Fub3RoZXJBcnJheVRlc3RCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9Bbm90aGVyQXJyYXlUZXN0QmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDlkYzAyZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9Bbm90aGVyQXJyYXlUZXN0QmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJjYXRzIjpbeyJuYW1lIjoiRm9vIiwibmlja05hbWUiOiJLaXR0eSJ9LHsibmFtZSI6IkJhciIsIm5pY2tOYW1lIjoiUHVzcyJ9XSwicHJvcCI6InRlc3RQcm9wIn0KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9BdHRyQW5kQ2hhckRhdGFCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfQXR0ckFuZENoYXJEYXRhQmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NWUxZjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfQXR0ckFuZENoYXJEYXRhQmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3siYXR0ciI6ImF2YWwiLCJ2YWx1ZSI6InB2YWwifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9BdHRyQW5kQ2hhckRhdGFCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9BdHRyQW5kQ2hhckRhdGFCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjVlMWY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0F0dHJBbmRDaGFyRGF0YUJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siYXR0ciI6ImF2YWwiLCJ2YWx1ZSI6InB2YWwifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlcy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MmM0MWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlcy5qc29uCkBAIC0wLDAgKzEgQEAKK3siYTEiOiJoZWxsbyBkb2xseSIsImEyIjozMTQxNTkyNiwiZmlsbGVyMSI6IjExMSIsImxpc3QiOlt7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8iLCJzMSI6ImhpIHRoZXJlIiwiaSI6MzEyLCJqIjoiYnVtcGVyIn0seyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIiwiczEiOiJoaSB0aGVyZSIsImkiOjMxMiwiaiI6ImJ1bXBlciJ9XSwiZmlsbGVyMiI6IjIyMiIsImIiOnsidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyIsInMxIjoiaGkgdGhlcmUiLCJpIjozMTIsImoiOiJidW1wZXIifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczIuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhM2RkNTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczIuanNvbgpAQCAtMCwwICsxIEBACit7ImExIjoiaGVsbG8gZG9sbHkiLCJhMiI6MzE0MTU5MjYsImZpbGxlcjEiOiIxMTEiLCJsaXN0IjpbeyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIn0seyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIn1dLCJmaWxsZXIyIjoiMjIyIiwiYiI6eyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMyX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEzZGQ1NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJhMSI6ImhlbGxvIGRvbGx5IiwiYTIiOjMxNDE1OTI2LCJmaWxsZXIxIjoiMTExIiwibGlzdCI6W3sidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9LHsidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9XSwiZmlsbGVyMiI6IjIyMiIsImIiOnsidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMy5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMzLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RkNjM3OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMy5qc29uCkBAIC0wLDAgKzEgQEAKK3siYiI6eyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIn0sImMiOnsidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzM19NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczNfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZDYzNzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczNfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siYiI6eyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIn0sImMiOnsidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzNC5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXM0Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY1NGEyMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzNC5qc29uCkBAIC0wLDAgKzEgQEAKK3siYTEiOm51bGwsImEyIjpudWxsLCJsaXN0IjpbXSwiYiI6eyJ1cmkiOm51bGwsInMxIjpudWxsLCJpIjpudWxsLCJqIjpudWxsfX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczRfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXM0X01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWE3Njc0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXM0X01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImExIjpudWxsLCJhMiI6bnVsbCwiZmlsbGVyMSI6bnVsbCwibGlzdCI6W10sImZpbGxlcjIiOm51bGwsImIiOnsidXJpIjpudWxsLCJzMSI6bnVsbCwiaSI6bnVsbCwiaiI6bnVsbH19CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlc19NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlc19NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkyYzQxYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImExIjoiaGVsbG8gZG9sbHkiLCJhMiI6MzE0MTU5MjYsImZpbGxlcjEiOiIxMTEiLCJsaXN0IjpbeyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIiwiczEiOiJoaSB0aGVyZSIsImkiOjMxMiwiaiI6ImJ1bXBlciJ9LHsidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyIsInMxIjoiaGkgdGhlcmUiLCJpIjozMTIsImoiOiJidW1wZXIifV0sImZpbGxlcjIiOiIyMjIiLCJiIjp7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8iLCJzMSI6ImhpIHRoZXJlIiwiaSI6MzEyLCJqIjoiYnVtcGVyIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudEJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9FbXB0eUVsZW1lbnRCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQwY2YyZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9FbXB0eUVsZW1lbnRCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJudWxsT25seSI6bnVsbH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50QmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50QmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQwY2YyZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9FbXB0eUVsZW1lbnRCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7Im51bGxPbmx5IjpudWxsfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9FbXB0eUVsZW1lbnRDb250YWluaW5nQmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudENvbnRhaW5pbmdCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBhMTk5YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9FbXB0eUVsZW1lbnRDb250YWluaW5nQmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3siZW1wdHlCZWFuIjpudWxsLCJjIjoiZm9vIiwiZCI6ImJhciJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudENvbnRhaW5pbmdCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9FbXB0eUVsZW1lbnRDb250YWluaW5nQmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBhMTk5YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9FbXB0eUVsZW1lbnRDb250YWluaW5nQmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJlbXB0eUJlYW4iOm51bGwsImMiOiJmb28iLCJkIjoiYmFyIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfRW5jb2RlZENvbnRlbnRCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfRW5jb2RlZENvbnRlbnRCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRkZTNhNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9FbmNvZGVkQ29udGVudEJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7Im9uZSI6Ilx0b25lXG5cdGJpZyIsInR3byI6ImhhZsSMIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfRW5jb2RlZENvbnRlbnRCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9FbmNvZGVkQ29udGVudEJlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZGUzYTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfRW5jb2RlZENvbnRlbnRCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7Im9uZSI6Ilx0b25lXG5cdGJpZyIsInR3byI6ImhhZsSMIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfRmFrZUFycmF5QmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0Zha2VBcnJheUJlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzJiMDk4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0Zha2VBcnJheUJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7IndlaWdodCI6WyIxa2ciLCIya2ciXSwiY29sb3IiOiJyZWQiLCJuYW1lIjoiYnVtcGVyIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfRmFrZUFycmF5QmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfRmFrZUFycmF5QmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMyYjA5OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9GYWtlQXJyYXlCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7IndlaWdodCI6WyIxa2ciLCIya2ciXSwiY29sb3IiOiJyZWQiLCJuYW1lIjoiYnVtcGVyIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfSW50QXJyYXkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9JbnRBcnJheS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NDU3MTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfSW50QXJyYXkuanNvbgpAQCAtMCwwICsxIEBACit7ImludEFycmF5IjpbNF0sImludGVnZXJBcnJheSI6WzNdLCJudW1iZXIiOjh9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0ludEFycmF5X01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9JbnRBcnJheV9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ0NTcxNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9JbnRBcnJheV9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJpbnRBcnJheSI6WzRdLCJpbnRlZ2VyQXJyYXkiOlszXSwibnVtYmVyIjo4fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9KZXJzZXkxMTk5TGlzdC5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0plcnNleTExOTlMaXN0Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzViMjg3MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9KZXJzZXkxMTk5TGlzdC5qc29uCkBAIC0wLDAgKzEgQEAKK3sib2JqZWN0cyI6W3siQHR5cGUiOiJDb2xvckhvbGRlciIsImNvbG9ycyI6WyJSRUQiLCJCTFVFIl19LHsiQHR5cGUiOiJDb2xvckhvbGRlciIsImNvbG9ycyI6WyJHUkVFTiJdfV0sIm9mZnNldCI6MCwidG90YWwiOjJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0plcnNleTExOTlMaXN0X01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9KZXJzZXkxMTk5TGlzdF9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzViMjg3MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9KZXJzZXkxMTk5TGlzdF9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJvYmplY3RzIjpbeyJAdHlwZSI6IkNvbG9ySG9sZGVyIiwiY29sb3JzIjpbIlJFRCIsIkJMVUUiXX0seyJAdHlwZSI6IkNvbG9ySG9sZGVyIiwiY29sb3JzIjpbIkdSRUVOIl19XSwib2Zmc2V0IjowLCJ0b3RhbCI6Mn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfTGlzdEFuZE5vbkxpc3RCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfTGlzdEFuZE5vbkxpc3RCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg1Y2FkOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9MaXN0QW5kTm9uTGlzdEJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7ImEiOlsiMSJdLCJkIjoiMiJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0xpc3RBbmROb25MaXN0QmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfTGlzdEFuZE5vbkxpc3RCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODVjYWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0xpc3RBbmROb25MaXN0QmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJhIjpbIjEiXSwiZCI6IjIifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9MaXN0RW1wdHlCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfTGlzdEVtcHR5QmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YTlmNTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfTGlzdEVtcHR5QmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3siZW1wdHkiOltdfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9MaXN0RW1wdHlCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9MaXN0RW1wdHlCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWE5ZjUzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0xpc3RFbXB0eUJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siZW1wdHkiOltdfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9MaXN0V3JhcHBlckJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9MaXN0V3JhcHBlckJlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzkxNjBlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0xpc3RXcmFwcGVyQmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3sicHJvcGVydHkiOm51bGx9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0xpc3RXcmFwcGVyQmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfTGlzdFdyYXBwZXJCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzkxNjBlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX0xpc3RXcmFwcGVyQmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJwcm9wZXJ0eSI6bnVsbH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfTXlSZXNwb25zZS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX015UmVzcG9uc2UuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTkxNDhlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX015UmVzcG9uc2UuanNvbgpAQCAtMCwwICsxIEBACit7Im15TWVzc2FnZSI6W3siaWQiOiIwIiwidGV4dCI6Im9rIn0seyJpZCI6IjEiLCJ0ZXh0Ijoib2sifV0sIm15RXJyb3IiOnsiaWQiOiItMSIsImRlc2MiOiJlcnJvciJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9NeVJlc3BvbnNlX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9NeVJlc3BvbnNlX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTkxNDhlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX015UmVzcG9uc2VfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sibXlNZXNzYWdlIjpbeyJpZCI6IjAiLCJ0ZXh0Ijoib2sifSx7ImlkIjoiMSIsInRleHQiOiJvayJ9XSwibXlFcnJvciI6eyJpZCI6Ii0xIiwiZGVzYyI6ImVycm9yIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM4NmQ1ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJhIjoiZm9vIiwiYiI6ImJhciJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW5XaXRoQXR0cmlidXRlLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfTmFtZXNwYWNlQmVhbldpdGhBdHRyaWJ1dGUuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjNlOWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW5XaXRoQXR0cmlidXRlLmpzb24KQEAgLTAsMCArMSBAQAoreyJhdHRyIjoidmFsdWUiLCJhIjoiZm9vIiwiYiI6ImJhciJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW5XaXRoQXR0cmlidXRlX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuV2l0aEF0dHJpYnV0ZV9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIzZTlkNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuV2l0aEF0dHJpYnV0ZV9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJhdHRyIjoidmFsdWUiLCJhIjoiZm9vIiwiYiI6ImJhciJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzODZkNWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfTmFtZXNwYWNlQmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJhIjoiZm9vIiwiYiI6ImJhciJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX051bGxTdHJpbmdCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfTnVsbFN0cmluZ0JlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YThjZDNkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX051bGxTdHJpbmdCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJudWxsU3RyaW5nIjoibm90IG51bGwgdG8gdGVzdCBpZiBzZXQgdG8gbnVsbCB3b3JrcyJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX051bGxTdHJpbmdCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9OdWxsU3RyaW5nQmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGE4Y2QzZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9OdWxsU3RyaW5nQmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJudWxsU3RyaW5nIjoibm90IG51bGwgdG8gdGVzdCBpZiBzZXQgdG8gbnVsbCB3b3JrcyJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1BlcnNvbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1BlcnNvbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NmVkYTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfUGVyc29uLmpzb24KQEAgLTAsMCArMSBAQAoreyJuYW1lIjoiSm9lIFNjaG1vIiwiY2hpbGQiOlt7Im5hbWUiOiJKaWxsIFNjaG1vIn0seyJuYW1lIjoiSmFjayBTY2htbyJ9XX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfUGVyc29uX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9QZXJzb25fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NmViMjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfUGVyc29uX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7Im5hbWUiOiJKb2UgU2NobW8iLCJjaGlsZCI6W3sibmFtZSI6IkppbGwgU2NobW8iLCJjaGlsZCI6bnVsbH0seyJuYW1lIjoiSmFjayBTY2htbyIsImNoaWxkIjpudWxsfV19CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfUG9qb0FuaW1hbExpc3QuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9Qb2pvQW5pbWFsTGlzdC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNDk1MjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfUG9qb0FuaW1hbExpc3QuanNvbgpAQCAtMCwwICsxIEBACit7ImFuaW1hbHMiOlt7IkB0eXBlIjoiUG9qb0RvZyIsIm5hbWUiOiJGaWZpIn0seyJAdHlwZSI6IlBvam9DYXQiLCJuaWNrTmFtZSI6bnVsbCwibmFtZSI6IkRhaXN5In1dfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9Qb2pvQW5pbWFsTGlzdF9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfUG9qb0FuaW1hbExpc3RfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzODc5NzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfUG9qb0FuaW1hbExpc3RfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siYW5pbWFscyI6W3siQHR5cGUiOiJQb2pvRG9nIiwibmFtZSI6IkZpZmkifSx7IkB0eXBlIjoiUG9qb0NhdCIsIm5hbWUiOiJEYWlzeSIsIm5pY2tOYW1lIjpudWxsfV19CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfUHVyZUNoYXJEYXRhQmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1B1cmVDaGFyRGF0YUJlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2QzMTUzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1B1cmVDaGFyRGF0YUJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7InZhbHVlIjoic29tZSB0ZXh0dWFsIGNvbnRlbnQifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9QdXJlQ2hhckRhdGFCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9QdXJlQ2hhckRhdGFCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2QzMTUzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1B1cmVDaGFyRGF0YUJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sidmFsdWUiOiJzb21lIHRleHR1YWwgY29udGVudCJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1JlZ2lzdGVyTWVzc2FnZS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1JlZ2lzdGVyTWVzc2FnZS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZjQ5YjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfUmVnaXN0ZXJNZXNzYWdlLmpzb24KQEAgLTAsMCArMSBAQAoreyJhZ2VudFVJRCI6ImFnZW50S29ja2EiLCJyZXF1ZXN0VGltZSI6MTIzNH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfUmVnaXN0ZXJNZXNzYWdlX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9SZWdpc3Rlck1lc3NhZ2VfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZjQ5YjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfUmVnaXN0ZXJNZXNzYWdlX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImFnZW50VUlEIjoiYWdlbnRLb2NrYSIsInJlcXVlc3RUaW1lIjoxMjM0fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMzgwYjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3siY2hpbGQiOiJzaW1wbGUifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXMuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXMuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODY4MzQxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoQXR0cmlidXRlcy5qc29uCkBAIC0wLDAgKzEgQEAKK3sidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyIsInMxIjoiaGkgdGhlcmUiLCJpIjozMTIsImoiOiJidW1wZXIifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXNfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoQXR0cmlidXRlc19NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg2ODM0MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXNfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyIsInMxIjoiaGkgdGhlcmUiLCJpIjozMTIsImoiOiJidW1wZXIifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGUuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGUuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTg5ODk2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZS5qc29uCkBAIC0wLDAgKzEgQEAKK3sidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZUFuZFZhbHVlLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlQW5kVmFsdWUuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmVjYTIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZUFuZFZhbHVlLmpzb24KQEAgLTAsMCArMSBAQAoreyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIiwidmFsdWUiOiJjaGFyYWN0ZXJzIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlQW5kVmFsdWVfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZUFuZFZhbHVlX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmVjYTIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZUFuZFZhbHVlX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8iLCJ2YWx1ZSI6ImNoYXJhY3RlcnMifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZV9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk4OTg5NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMzgwYjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJjaGlsZCI6InNpbXBsZSJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1RyZWVNb2RlbC5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1RyZWVNb2RlbC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZmFkYjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfVHJlZU1vZGVsLmpzb24KQEAgLTAsMCArMSBAQAoreyJyb290Ijp7ImxhYmVsIjoiZHVtbXkgbm9kZSIsImV4cGFuZGVkIjpmYWxzZX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1RyZWVNb2RlbF9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfVHJlZU1vZGVsX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmUwMDI3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1RyZWVNb2RlbF9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJyb290Ijp7ImxhYmVsIjoiZHVtbXkgbm9kZSIsImV4cGFuZGVkIjpmYWxzZSwiY2hpbGRyZW4iOm51bGx9fQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1R3b0xpc3RzV3JhcHBlckJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9Ud29MaXN0c1dyYXBwZXJCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRmZjIzOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9Ud29MaXN0c1dyYXBwZXJCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJwcm9wZXJ0eTEiOlsiYTEiLCJhMSJdLCJwcm9wZXJ0eTIiOlsiYjEiXX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfVHdvTGlzdHNXcmFwcGVyQmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfVHdvTGlzdHNXcmFwcGVyQmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRmZjIzOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9Ud29MaXN0c1dyYXBwZXJCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7InByb3BlcnR5MSI6WyJhMSIsImExIl0sInByb3BlcnR5MiI6WyJiMSJdfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9Vc2VyLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfVXNlci5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExYjkxYjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfVXNlci5qc29uCkBAIC0wLDAgKzEgQEAKK3sidXNlcmlkIjoiMTYyMSIsIm5hbWUiOiJHcm90ZWZlbmQifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9Vc2VyVGFibGUuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9Vc2VyVGFibGUuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjUyMTk1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1VzZXJUYWJsZS5qc29uCkBAIC0wLDAgKzEgQEAKK3siY29sdW1ucyI6W3siaWQiOiJ1c2VyaWQiLCJsYWJlbCI6IlVzZXJJRCJ9LHsiaWQiOiJuYW1lIiwibGFiZWwiOiJVc2VyIE5hbWUifV0sInJvd3MiOlt7InVzZXJpZCI6IjE2MjEiLCJuYW1lIjoiR3JvdGVmZW5kIn1dfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9Vc2VyVGFibGVfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1VzZXJUYWJsZV9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MzOGZjYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KYWNrc29uSnNvblRlc3RQcm92aWRlcl9Vc2VyVGFibGVfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siY29sdW1ucyI6W3siaWQiOiJ1c2VyaWQiLCJsYWJlbCI6IlVzZXJJRCJ9LHsiaWQiOiJuYW1lIiwibGFiZWwiOiJVc2VyIE5hbWUifV0sInJvd3MiOlt7Im5hbWUiOiJHcm90ZWZlbmQiLCJ1c2VyaWQiOiIxNjIxIn1dfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1VzZXJfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0phY2tzb25Kc29uVGVzdFByb3ZpZGVyX1VzZXJfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MTdlODQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmFja3Nvbkpzb25UZXN0UHJvdmlkZXJfVXNlcl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJuYW1lIjoiR3JvdGVmZW5kIiwidXNlcmlkIjoiMTYyMSJ9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9BbmltYWxMaXN0Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9BbmltYWxMaXN0Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdkZGEyNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0FuaW1hbExpc3QuanNvbgpAQCAtMCwwICsxIEBACit7ImFuaW1hbExpc3QiOnsiYW5pbWFscyI6W3siQHhtbG5zIjp7InhzaSI6Imh0dHA6XC9cL3d3dy53My5vcmdcLzIwMDFcL1hNTFNjaGVtYS1pbnN0YW5jZSJ9LCJAeHNpOnR5cGUiOiJkb2ciLCJuYW1lIjp7IiQiOiJGaWZpIn19LHsiQHhtbG5zIjp7InhzaSI6Imh0dHA6XC9cL3d3dy53My5vcmdcLzIwMDFcL1hNTFNjaGVtYS1pbnN0YW5jZSJ9LCJAeHNpOnR5cGUiOiJjYXQiLCJuYW1lIjp7IiQiOiJEYWlzeSJ9fV19fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0FuaW1hbExpc3RfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfQW5pbWFsTGlzdF9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdkZGEyNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0FuaW1hbExpc3RfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siYW5pbWFsTGlzdCI6eyJhbmltYWxzIjpbeyJAeG1sbnMiOnsieHNpIjoiaHR0cDpcL1wvd3d3LnczLm9yZ1wvMjAwMVwvWE1MU2NoZW1hLWluc3RhbmNlIn0sIkB4c2k6dHlwZSI6ImRvZyIsIm5hbWUiOnsiJCI6IkZpZmkifX0seyJAeG1sbnMiOnsieHNpIjoiaHR0cDpcL1wvd3d3LnczLm9yZ1wvMjAwMVwvWE1MU2NoZW1hLWluc3RhbmNlIn0sIkB4c2k6dHlwZSI6ImNhdCIsIm5hbWUiOnsiJCI6IkRhaXN5In19XX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfQW5vdGhlckFycmF5VGVzdEJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0Fub3RoZXJBcnJheVRlc3RCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRkMTQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0Fub3RoZXJBcnJheVRlc3RCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJhbm90aGVyQXJyYXlUZXN0QmVhbiI6eyJjYXRzIjpbeyJuYW1lIjp7IiQiOiJGb28ifSwibmlja05hbWUiOnsiJCI6IktpdHR5In19LHsibmFtZSI6eyIkIjoiQmFyIn0sIm5pY2tOYW1lIjp7IiQiOiJQdXNzIn19XSwicHJvcCI6eyIkIjoidGVzdFByb3AifX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfQW5vdGhlckFycmF5VGVzdEJlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfQW5vdGhlckFycmF5VGVzdEJlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZDE0OGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9Bbm90aGVyQXJyYXlUZXN0QmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJhbm90aGVyQXJyYXlUZXN0QmVhbiI6eyJjYXRzIjpbeyJuYW1lIjp7IiQiOiJGb28ifSwibmlja05hbWUiOnsiJCI6IktpdHR5In19LHsibmFtZSI6eyIkIjoiQmFyIn0sIm5pY2tOYW1lIjp7IiQiOiJQdXNzIn19XSwicHJvcCI6eyIkIjoidGVzdFByb3AifX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfQXR0ckFuZENoYXJEYXRhQmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfQXR0ckFuZENoYXJEYXRhQmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNDFjYzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9BdHRyQW5kQ2hhckRhdGFCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJwYXJlbnQiOnsiQGF0dHIiOiJhdmFsIiwiJCI6InB2YWwifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9BdHRyQW5kQ2hhckRhdGFCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0F0dHJBbmRDaGFyRGF0YUJlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNDFjYzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9BdHRyQW5kQ2hhckRhdGFCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7InBhcmVudCI6eyJAYXR0ciI6ImF2YWwiLCIkIjoicHZhbCJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmJiNWZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlcy5qc29uCkBAIC0wLDAgKzEgQEAKK3siY29tcGxleEJlYW5XaXRoQXR0cmlidXRlcyI6eyJAYTIiOiIzMTQxNTkyNiIsIkBhMSI6ImhlbGxvIGRvbGx5IiwiZmlsbGVyMSI6eyIkIjoiMTExIn0sImxpc3QiOlt7IkBqIjoiYnVtcGVyIiwiQGkiOiIzMTIiLCJAdXJpIjoiaHR0cDpcL1wvbG9jYWxob3N0OjgwODBcL2plZG5hXC9iZWRuYVwvIiwiczEiOnsiJCI6ImhpIHRoZXJlIn19LHsiQGoiOiJidW1wZXIiLCJAaSI6IjMxMiIsIkB1cmkiOiJodHRwOlwvXC9sb2NhbGhvc3Q6ODA4MFwvamVkbmFcL2JlZG5hXC8iLCJzMSI6eyIkIjoiaGkgdGhlcmUifX1dLCJmaWxsZXIyIjp7IiQiOiIyMjIifSwiYiI6eyJAaiI6ImJ1bXBlciIsIkBpIjoiMzEyIiwiQHVyaSI6Imh0dHA6XC9cL2xvY2FsaG9zdDo4MDgwXC9qZWRuYVwvYmVkbmFcLyIsInMxIjp7IiQiOiJoaSB0aGVyZSJ9fX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczIuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMyLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY4YjA0OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMyLmpzb24KQEAgLTAsMCArMSBAQAoreyJjb21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMiI6eyJAYTIiOiIzMTQxNTkyNiIsIkBhMSI6ImhlbGxvIGRvbGx5IiwiZmlsbGVyMSI6eyIkIjoiMTExIn0sImxpc3QiOlt7IkB1cmkiOiJodHRwOlwvXC9sb2NhbGhvc3Q6ODA4MFwvamVkbmFcL2JlZG5hXC8ifSx7IkB1cmkiOiJodHRwOlwvXC9sb2NhbGhvc3Q6ODA4MFwvamVkbmFcL2JlZG5hXC8ifV0sImZpbGxlcjIiOnsiJCI6IjIyMiJ9LCJiIjp7IkB1cmkiOiJodHRwOlwvXC9sb2NhbGhvc3Q6ODA4MFwvamVkbmFcL2JlZG5hXC8ifX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczJfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczJfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZTY4YWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJjb21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMiI6eyJAYTEiOiJoZWxsbyBkb2xseSIsIkBhMiI6IjMxNDE1OTI2IiwiZmlsbGVyMSI6eyIkIjoiMTExIn0sImxpc3QiOlt7IkB1cmkiOiJodHRwOlwvXC9sb2NhbGhvc3Q6ODA4MFwvamVkbmFcL2JlZG5hXC8ifSx7IkB1cmkiOiJodHRwOlwvXC9sb2NhbGhvc3Q6ODA4MFwvamVkbmFcL2JlZG5hXC8ifV0sImZpbGxlcjIiOnsiJCI6IjIyMiJ9LCJiIjp7IkB1cmkiOiJodHRwOlwvXC9sb2NhbGhvc3Q6ODA4MFwvamVkbmFcL2JlZG5hXC8ifX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczMuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMzLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY2ZDZjYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMzLmpzb24KQEAgLTAsMCArMSBAQAoreyJjb21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMyI6eyJiIjp7IkB1cmkiOiJodHRwOlwvXC9sb2NhbGhvc3Q6ODA4MFwvamVkbmFcL2JlZG5hXC8ifSwiYyI6eyJAdXJpIjoiaHR0cDpcL1wvbG9jYWxob3N0OjgwODBcL2plZG5hXC9iZWRuYVwvIn19fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMzX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMzX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjZkNmNhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczNfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siY29tcGxleEJlYW5XaXRoQXR0cmlidXRlczMiOnsiYiI6eyJAdXJpIjoiaHR0cDpcL1wvbG9jYWxob3N0OjgwODBcL2plZG5hXC9iZWRuYVwvIn0sImMiOnsiQHVyaSI6Imh0dHA6XC9cL2xvY2FsaG9zdDo4MDgwXC9qZWRuYVwvYmVkbmFcLyJ9fX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzNC5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczQuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTk5OTg4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczQuanNvbgpAQCAtMCwwICsxIEBACit7ImNvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXM0Ijp7ImIiOnt9fX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzNF9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzNF9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE5OTk4OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXM0X01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImNvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXM0Ijp7ImIiOnt9fX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXNfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxYWFjMWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImNvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMiOnsiQGExIjoiaGVsbG8gZG9sbHkiLCJAYTIiOiIzMTQxNTkyNiIsImZpbGxlcjEiOnsiJCI6IjExMSJ9LCJsaXN0IjpbeyJAdXJpIjoiaHR0cDpcL1wvbG9jYWxob3N0OjgwODBcL2plZG5hXC9iZWRuYVwvIiwiQGkiOiIzMTIiLCJAaiI6ImJ1bXBlciIsInMxIjp7IiQiOiJoaSB0aGVyZSJ9fSx7IkB1cmkiOiJodHRwOlwvXC9sb2NhbGhvc3Q6ODA4MFwvamVkbmFcL2JlZG5hXC8iLCJAaSI6IjMxMiIsIkBqIjoiYnVtcGVyIiwiczEiOnsiJCI6ImhpIHRoZXJlIn19XSwiZmlsbGVyMiI6eyIkIjoiMjIyIn0sImIiOnsiQHVyaSI6Imh0dHA6XC9cL2xvY2FsaG9zdDo4MDgwXC9qZWRuYVwvYmVkbmFcLyIsIkBpIjoiMzEyIiwiQGoiOiJidW1wZXIiLCJzMSI6eyIkIjoiaGkgdGhlcmUifX19fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudEJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudEJlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2ZiMWY2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50QmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3siZW1wdHlFbGVtZW50QmVhbiI6e319ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50QmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9FbXB0eUVsZW1lbnRCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44N2ZiMWY2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50QmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJlbXB0eUVsZW1lbnRCZWFuIjp7fX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9FbXB0eUVsZW1lbnRDb250YWluaW5nQmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50Q29udGFpbmluZ0JlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzExMWZmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50Q29udGFpbmluZ0JlYW4uanNvbgpAQCAtMCwwICsxIEBACit7ImVtcHR5RWxlbWVudENvbnRhaW5pbmdCZWFuIjp7ImMiOnsiJCI6ImZvbyJ9LCJkIjp7IiQiOiJiYXIifX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50Q29udGFpbmluZ0JlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50Q29udGFpbmluZ0JlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMTExZmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9FbXB0eUVsZW1lbnRDb250YWluaW5nQmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJlbXB0eUVsZW1lbnRDb250YWluaW5nQmVhbiI6eyJjIjp7IiQiOiJmb28ifSwiZCI6eyIkIjoiYmFyIn19fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0VuY29kZWRDb250ZW50QmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfRW5jb2RlZENvbnRlbnRCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNjOTEwMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0VuY29kZWRDb250ZW50QmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3siZW5jb2RlZENvbnRlbnRCZWFuIjp7Im9uZSI6eyIkIjoiXHRvbmVcblx0YmlnIn0sInR3byI6eyIkIjoiaGFmxIwifX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfRW5jb2RlZENvbnRlbnRCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0VuY29kZWRDb250ZW50QmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNjOTEwMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0VuY29kZWRDb250ZW50QmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJlbmNvZGVkQ29udGVudEJlYW4iOnsib25lIjp7IiQiOiJcdG9uZVxuXHRiaWcifSwidHdvIjp7IiQiOiJoYWbEjCJ9fX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9GYWtlQXJyYXlCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9GYWtlQXJyYXlCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM4ZjA0NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0Zha2VBcnJheUJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7ImZha2VBcnJheUJlYW4iOnsid2VpZ2h0IjpbeyIkIjoiMWtnIn0seyIkIjoiMmtnIn1dLCJjb2xvciI6eyIkIjoicmVkIn0sIm5hbWUiOnsiJCI6ImJ1bXBlciJ9fX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9GYWtlQXJyYXlCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0Zha2VBcnJheUJlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjOGYwNDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9GYWtlQXJyYXlCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImZha2VBcnJheUJlYW4iOnsid2VpZ2h0IjpbeyIkIjoiMWtnIn0seyIkIjoiMmtnIn1dLCJjb2xvciI6eyIkIjoicmVkIn0sIm5hbWUiOnsiJCI6ImJ1bXBlciJ9fX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9JbnRBcnJheS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfSW50QXJyYXkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTY0Mzg4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfSW50QXJyYXkuanNvbgpAQCAtMCwwICsxIEBACit7ImludEFycmF5Ijp7ImludEFycmF5Ijp7IiQiOiI0In0sImludGVnZXJBcnJheSI6eyIkIjoiMyJ9LCJudW1iZXIiOnsiJCI6IjgifX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfSW50QXJyYXlfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfSW50QXJyYXlfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNjQzODgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9JbnRBcnJheV9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJpbnRBcnJheSI6eyJpbnRBcnJheSI6eyIkIjoiNCJ9LCJpbnRlZ2VyQXJyYXkiOnsiJCI6IjMifSwibnVtYmVyIjp7IiQiOiI4In19fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0plcnNleTExOTlMaXN0Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9KZXJzZXkxMTk5TGlzdC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NGRjZGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9KZXJzZXkxMTk5TGlzdC5qc29uCkBAIC0wLDAgKzEgQEAKK3siamVyc2V5MTE5OUxpc3QiOnsib2JqZWN0cyI6W3siQHhtbG5zIjp7InhzaSI6Imh0dHA6XC9cL3d3dy53My5vcmdcLzIwMDFcL1hNTFNjaGVtYS1pbnN0YW5jZSJ9LCJAeHNpOnR5cGUiOiJjb2xvckhvbGRlciIsImNvbG9ycyI6W3siJCI6IlJFRCJ9LHsiJCI6IkJMVUUifV19LHsiQHhtbG5zIjp7InhzaSI6Imh0dHA6XC9cL3d3dy53My5vcmdcLzIwMDFcL1hNTFNjaGVtYS1pbnN0YW5jZSJ9LCJAeHNpOnR5cGUiOiJjb2xvckhvbGRlciIsImNvbG9ycyI6eyIkIjoiR1JFRU4ifX1dLCJvZmZzZXQiOnsiJCI6IjAifSwidG90YWwiOnsiJCI6IjIifX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfSmVyc2V5MTE5OUxpc3RfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfSmVyc2V5MTE5OUxpc3RfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0NGRjZGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9KZXJzZXkxMTk5TGlzdF9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJqZXJzZXkxMTk5TGlzdCI6eyJvYmplY3RzIjpbeyJAeG1sbnMiOnsieHNpIjoiaHR0cDpcL1wvd3d3LnczLm9yZ1wvMjAwMVwvWE1MU2NoZW1hLWluc3RhbmNlIn0sIkB4c2k6dHlwZSI6ImNvbG9ySG9sZGVyIiwiY29sb3JzIjpbeyIkIjoiUkVEIn0seyIkIjoiQkxVRSJ9XX0seyJAeG1sbnMiOnsieHNpIjoiaHR0cDpcL1wvd3d3LnczLm9yZ1wvMjAwMVwvWE1MU2NoZW1hLWluc3RhbmNlIn0sIkB4c2k6dHlwZSI6ImNvbG9ySG9sZGVyIiwiY29sb3JzIjp7IiQiOiJHUkVFTiJ9fV0sIm9mZnNldCI6eyIkIjoiMCJ9LCJ0b3RhbCI6eyIkIjoiMiJ9fX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9MaXN0QW5kTm9uTGlzdEJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0xpc3RBbmROb25MaXN0QmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZThlMjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9MaXN0QW5kTm9uTGlzdEJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7Imxpc3RBbmROb25MaXN0QmVhbiI6eyJhIjp7IiQiOiIxIn0sImQiOnsiJCI6IjIifX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfTGlzdEFuZE5vbkxpc3RCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0xpc3RBbmROb25MaXN0QmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFlOGUyNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0xpc3RBbmROb25MaXN0QmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJsaXN0QW5kTm9uTGlzdEJlYW4iOnsiYSI6eyIkIjoiMSJ9LCJkIjp7IiQiOiIyIn19fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0xpc3RFbXB0eUJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0xpc3RFbXB0eUJlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDlkMTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfTGlzdEVtcHR5QmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3sibGlzdEVtcHR5QmVhbiI6e319ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfTGlzdEVtcHR5QmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9MaXN0RW1wdHlCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDlkMTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfTGlzdEVtcHR5QmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJsaXN0RW1wdHlCZWFuIjp7fX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9MaXN0V3JhcHBlckJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0xpc3RXcmFwcGVyQmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZTlkZjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9MaXN0V3JhcHBlckJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7Iml0ZW0iOnt9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX0xpc3RXcmFwcGVyQmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9MaXN0V3JhcHBlckJlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlZTlkZjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9MaXN0V3JhcHBlckJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siaXRlbSI6e319ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfTXlSZXNwb25zZS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfTXlSZXNwb25zZS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNGJhY2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9NeVJlc3BvbnNlLmpzb24KQEAgLTAsMCArMSBAQAoreyJteVJlc3BvbnNlIjp7IkB4bWxucyI6eyJuczIiOiJodHRwOlwvXC90ZXN0LmpheGIuY29tIn0sIm5zMjpteU1lc3NhZ2UiOlt7ImlkIjp7IiQiOiIwIn0sInRleHQiOnsiJCI6Im9rIn19LHsiaWQiOnsiJCI6IjEifSwidGV4dCI6eyIkIjoib2sifX1dLCJuczI6bXlFcnJvciI6eyJpZCI6eyIkIjoiLTEifSwiZGVzYyI6eyIkIjoiZXJyb3IifX19fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX015UmVzcG9uc2VfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfTXlSZXNwb25zZV9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc1NjM1ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX015UmVzcG9uc2VfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sibXlSZXNwb25zZSI6eyJAeG1sbnMiOnsibnMwIjoiaHR0cDpcL1wvdGVzdC5qYXhiLmNvbSJ9LCJuczA6bXlNZXNzYWdlIjpbeyJpZCI6eyIkIjoiMCJ9LCJ0ZXh0Ijp7IiQiOiJvayJ9fSx7ImlkIjp7IiQiOiIxIn0sInRleHQiOnsiJCI6Im9rIn19XSwibnMwOm15RXJyb3IiOnsiaWQiOnsiJCI6Ii0xIn0sImRlc2MiOnsiJCI6ImVycm9yIn19fX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFmZmRlNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7Im5hbWVzcGFjZUJlYW4iOnsiQHhtbG5zIjp7Im5zMiI6Imh0dHA6XC9cL2V4YW1wbGUuY29tIn0sImEiOnsiJCI6ImZvbyJ9LCJuczI6YiI6eyIkIjoiYmFyIn19fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW5XaXRoQXR0cmlidXRlLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuV2l0aEF0dHJpYnV0ZS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyODdkYjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuV2l0aEF0dHJpYnV0ZS5qc29uCkBAIC0wLDAgKzEgQEAKK3sibmFtZXNwYWNlQmVhbldpdGhBdHRyaWJ1dGUiOnsiQHhtbG5zIjp7Im5zMSI6Imh0dHA6XC9cL2V4YW1wbGUuY29tIn0sIkBuczE6YXR0ciI6InZhbHVlIiwiYSI6eyIkIjoiZm9vIn0sIm5zMTpiIjp7IiQiOiJiYXIifX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfTmFtZXNwYWNlQmVhbldpdGhBdHRyaWJ1dGVfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfTmFtZXNwYWNlQmVhbldpdGhBdHRyaWJ1dGVfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMjMzOTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuV2l0aEF0dHJpYnV0ZV9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJuYW1lc3BhY2VCZWFuV2l0aEF0dHJpYnV0ZSI6eyJAeG1sbnMiOnsibnMwIjoiaHR0cDpcL1wvZXhhbXBsZS5jb20ifSwiQG5zMDphdHRyIjoidmFsdWUiLCJhIjp7IiQiOiJmb28ifSwibnMwOmIiOnsiJCI6ImJhciJ9fX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0OTQyYzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7Im5hbWVzcGFjZUJlYW4iOnsiQHhtbG5zIjp7Im5zMCI6Imh0dHA6XC9cL2V4YW1wbGUuY29tIn0sImEiOnsiJCI6ImZvbyJ9LCJuczA6YiI6eyIkIjoiYmFyIn19fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX051bGxTdHJpbmdCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9OdWxsU3RyaW5nQmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZWI4ZGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9OdWxsU3RyaW5nQmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3sibnVsbFN0cmluZ0JlYW4iOnsibnVsbFN0cmluZyI6eyIkIjoibm90IG51bGwgdG8gdGVzdCBpZiBzZXQgdG8gbnVsbCB3b3JrcyJ9fX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9OdWxsU3RyaW5nQmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9OdWxsU3RyaW5nQmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFlYjhkYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX051bGxTdHJpbmdCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7Im51bGxTdHJpbmdCZWFuIjp7Im51bGxTdHJpbmciOnsiJCI6Im5vdCBudWxsIHRvIHRlc3QgaWYgc2V0IHRvIG51bGwgd29ya3MifX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfUGVyc29uLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9QZXJzb24uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTk2YTIyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfUGVyc29uLmpzb24KQEAgLTAsMCArMSBAQAoreyJwZXJzb24iOnsibmFtZSI6eyIkIjoiSm9lIFNjaG1vIn0sImNoaWxkcmVuIjp7ImNoaWxkIjpbeyJuYW1lIjp7IiQiOiJKaWxsIFNjaG1vIn19LHsibmFtZSI6eyIkIjoiSmFjayBTY2htbyJ9fV19fX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9QZXJzb25fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfUGVyc29uX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTk2YTIyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfUGVyc29uX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7InBlcnNvbiI6eyJuYW1lIjp7IiQiOiJKb2UgU2NobW8ifSwiY2hpbGRyZW4iOnsiY2hpbGQiOlt7Im5hbWUiOnsiJCI6IkppbGwgU2NobW8ifX0seyJuYW1lIjp7IiQiOiJKYWNrIFNjaG1vIn19XX19fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX1B1cmVDaGFyRGF0YUJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX1B1cmVDaGFyRGF0YUJlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjA5OGJjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfUHVyZUNoYXJEYXRhQmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3sicHVyZUNoYXJEYXRhQmVhbiI6eyIkIjoic29tZSB0ZXh0dWFsIGNvbnRlbnQifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9QdXJlQ2hhckRhdGFCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX1B1cmVDaGFyRGF0YUJlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMDk4YmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9QdXJlQ2hhckRhdGFCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7InB1cmVDaGFyRGF0YUJlYW4iOnsiJCI6InNvbWUgdGV4dHVhbCBjb250ZW50In19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfUmVnaXN0ZXJNZXNzYWdlLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9SZWdpc3Rlck1lc3NhZ2UuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDhiNDJiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfUmVnaXN0ZXJNZXNzYWdlLmpzb24KQEAgLTAsMCArMSBAQAoreyJyZWdpc3Rlck1lc3NhZ2UiOnsiQHJlcXVlc3RUaW1lIjoiMTIzNCIsIkBhZ2VudFVJRCI6ImFnZW50S29ja2EifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9SZWdpc3Rlck1lc3NhZ2VfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfUmVnaXN0ZXJNZXNzYWdlX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjg4ZDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfUmVnaXN0ZXJNZXNzYWdlX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7InJlZ2lzdGVyTWVzc2FnZSI6eyJAYWdlbnRVSUQiOiJhZ2VudEtvY2thIiwiQHJlcXVlc3RUaW1lIjoiMTIzNCJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjY5MWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3siRHVtbXlPbmUiOnsiY2hpbGQiOnsiJCI6InNpbXBsZSJ9fX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXMuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoQXR0cmlidXRlcy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNDQwNjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXMuanNvbgpAQCAtMCwwICsxIEBACit7InNpbXBsZUJlYW5XaXRoQXR0cmlidXRlcyI6eyJAaiI6ImJ1bXBlciIsIkBpIjoiMzEyIiwiQHVyaSI6Imh0dHA6XC9cL2xvY2FsaG9zdDo4MDgwXC9qZWRuYVwvYmVkbmFcLyIsInMxIjp7IiQiOiJoaSB0aGVyZSJ9fX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXNfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhBdHRyaWJ1dGVzX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTFiOTYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhBdHRyaWJ1dGVzX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7InNpbXBsZUJlYW5XaXRoQXR0cmlidXRlcyI6eyJAdXJpIjoiaHR0cDpcL1wvbG9jYWxob3N0OjgwODBcL2plZG5hXC9iZWRuYVwvIiwiQGkiOiIzMTIiLCJAaiI6ImJ1bXBlciIsInMxIjp7IiQiOiJoaSB0aGVyZSJ9fX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGUuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZWMzZTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGUuanNvbgpAQCAtMCwwICsxIEBACit7InNpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZSI6eyJAdXJpIjoiaHR0cDpcL1wvbG9jYWxob3N0OjgwODBcL2plZG5hXC9iZWRuYVwvIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlQW5kVmFsdWUuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZUFuZFZhbHVlLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTExNjZjNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZUFuZFZhbHVlLmpzb24KQEAgLTAsMCArMSBAQAoreyJzaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVBbmRWYWx1ZSI6eyJAdXJpIjoiaHR0cDpcL1wvbG9jYWxob3N0OjgwODBcL2plZG5hXC9iZWRuYVwvIiwiJCI6ImNoYXJhY3RlcnMifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVBbmRWYWx1ZV9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVBbmRWYWx1ZV9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTExNjZjNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZUFuZFZhbHVlX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7InNpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZUFuZFZhbHVlIjp7IkB1cmkiOiJodHRwOlwvXC9sb2NhbGhvc3Q6ODA4MFwvamVkbmFcL2JlZG5hXC8iLCIkIjoiY2hhcmFjdGVycyJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZV9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZWMzZTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sic2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlIjp7IkB1cmkiOiJodHRwOlwvXC9sb2NhbGhvc3Q6ODA4MFwvamVkbmFcL2JlZG5hXC8ifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiNjkxZDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7IkR1bW15T25lIjp7ImNoaWxkIjp7IiQiOiJzaW1wbGUifX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfVHJlZU1vZGVsLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9UcmVlTW9kZWwuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWI2NDczCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfVHJlZU1vZGVsLmpzb24KQEAgLTAsMCArMSBAQAoreyJ0cmVlTW9kZWwiOnsicm9vdCI6eyJsYWJlbCI6eyIkIjoiZHVtbXkgbm9kZSJ9LCJleHBhbmRlZCI6eyIkIjoiZmFsc2UifX19fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX1RyZWVNb2RlbF9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9UcmVlTW9kZWxfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5YjY0NzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9UcmVlTW9kZWxfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sidHJlZU1vZGVsIjp7InJvb3QiOnsibGFiZWwiOnsiJCI6ImR1bW15IG5vZGUifSwiZXhwYW5kZWQiOnsiJCI6ImZhbHNlIn19fX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9Ud29MaXN0c1dyYXBwZXJCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9Ud29MaXN0c1dyYXBwZXJCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA2Y2IzNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX1R3b0xpc3RzV3JhcHBlckJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7Iml0ZW0yIjp7InByb3BlcnR5MSI6W3siJCI6ImExIn0seyIkIjoiYTEifV0sInByb3BlcnR5MiI6eyIkIjoiYjEifX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfVHdvTGlzdHNXcmFwcGVyQmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9Ud29MaXN0c1dyYXBwZXJCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDZjYjM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfVHdvTGlzdHNXcmFwcGVyQmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJpdGVtMiI6eyJwcm9wZXJ0eTEiOlt7IiQiOiJhMSJ9LHsiJCI6ImExIn1dLCJwcm9wZXJ0eTIiOnsiJCI6ImIxIn19fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX1VzZXIuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX1VzZXIuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjE0ZTU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfVXNlci5qc29uCkBAIC0wLDAgKzEgQEAKK3sidXNlciI6eyJ1c2VyaWQiOnsiJCI6IjE2MjEifSwibmFtZSI6eyIkIjoiR3JvdGVmZW5kIn19fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX1VzZXJUYWJsZS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfVXNlclRhYmxlLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhmMjEzZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX1VzZXJUYWJsZS5qc29uCkBAIC0wLDAgKzEgQEAKK3sidXNlclRhYmxlIjp7ImNvbHVtbnMiOlt7ImlkIjp7IiQiOiJ1c2VyaWQifSwibGFiZWwiOnsiJCI6IlVzZXJJRCJ9fSx7ImlkIjp7IiQiOiJuYW1lIn0sImxhYmVsIjp7IiQiOiJVc2VyIE5hbWUifX1dLCJyb3dzIjp7InVzZXJpZCI6eyIkIjoiMTYyMSJ9LCJuYW1lIjp7IiQiOiJHcm90ZWZlbmQifX19fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX1VzZXJUYWJsZV9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9Vc2VyVGFibGVfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZjIxM2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25CYWRnZXJmaXNoSnNvblRlc3RQcm92aWRlcl9Vc2VyVGFibGVfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sidXNlclRhYmxlIjp7ImNvbHVtbnMiOlt7ImlkIjp7IiQiOiJ1c2VyaWQifSwibGFiZWwiOnsiJCI6IlVzZXJJRCJ9fSx7ImlkIjp7IiQiOiJuYW1lIn0sImxhYmVsIjp7IiQiOiJVc2VyIE5hbWUifX1dLCJyb3dzIjp7InVzZXJpZCI6eyIkIjoiMTYyMSJ9LCJuYW1lIjp7IiQiOiJHcm90ZWZlbmQifX19fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX1VzZXJfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uQmFkZ2VyZmlzaEpzb25UZXN0UHJvdmlkZXJfVXNlcl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTYxNGU1NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbkJhZGdlcmZpc2hKc29uVGVzdFByb3ZpZGVyX1VzZXJfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sidXNlciI6eyJ1c2VyaWQiOnsiJCI6IjE2MjEifSwibmFtZSI6eyIkIjoiR3JvdGVmZW5kIn19fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfQW5pbWFsTGlzdC5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9BbmltYWxMaXN0Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM0MjU0OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfQW5pbWFsTGlzdC5qc29uCkBAIC0wLDAgKzEgQEAKK3siYW5pbWFsTGlzdCI6eyJhbmltYWxzIjpbeyJAeHNpLnR5cGUiOiJkb2ciLCJuYW1lIjoiRmlmaSJ9LHsiQHhzaS50eXBlIjoiY2F0IiwibmFtZSI6IkRhaXN5In1dfX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0FuaW1hbExpc3RfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9BbmltYWxMaXN0X01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzQyNTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9BbmltYWxMaXN0X01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImFuaW1hbExpc3QiOnsiYW5pbWFscyI6W3siQHhzaS50eXBlIjoiZG9nIiwibmFtZSI6IkZpZmkifSx7IkB4c2kudHlwZSI6ImNhdCIsIm5hbWUiOiJEYWlzeSJ9XX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9Bbm90aGVyQXJyYXlUZXN0QmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9Bbm90aGVyQXJyYXlUZXN0QmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMWM1ZDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0Fub3RoZXJBcnJheVRlc3RCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJhbm90aGVyQXJyYXlUZXN0QmVhbiI6eyJjYXRzIjpbeyJuYW1lIjoiRm9vIiwibmlja05hbWUiOiJLaXR0eSJ9LHsibmFtZSI6IkJhciIsIm5pY2tOYW1lIjoiUHVzcyJ9XSwicHJvcCI6InRlc3RQcm9wIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9Bbm90aGVyQXJyYXlUZXN0QmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0Fub3RoZXJBcnJheVRlc3RCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDFjNWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9Bbm90aGVyQXJyYXlUZXN0QmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJhbm90aGVyQXJyYXlUZXN0QmVhbiI6eyJjYXRzIjpbeyJuYW1lIjoiRm9vIiwibmlja05hbWUiOiJLaXR0eSJ9LHsibmFtZSI6IkJhciIsIm5pY2tOYW1lIjoiUHVzcyJ9XSwicHJvcCI6InRlc3RQcm9wIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9BdHRyQW5kQ2hhckRhdGFCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0F0dHJBbmRDaGFyRGF0YUJlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjQxY2M5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9BdHRyQW5kQ2hhckRhdGFCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJwYXJlbnQiOnsiQGF0dHIiOiJhdmFsIiwiJCI6InB2YWwifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0F0dHJBbmRDaGFyRGF0YUJlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9BdHRyQW5kQ2hhckRhdGFCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjQxY2M5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9BdHRyQW5kQ2hhckRhdGFCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7InBhcmVudCI6eyJAYXR0ciI6ImF2YWwiLCIkIjoicHZhbCJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlcy5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY4ZmY1NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlcy5qc29uCkBAIC0wLDAgKzEgQEAKK3siY29tcGxleEJlYW5XaXRoQXR0cmlidXRlcyI6eyJAYTIiOiIzMTQxNTkyNiIsIkBhMSI6ImhlbGxvIGRvbGx5IiwiZmlsbGVyMSI6MTExLCJsaXN0IjpbeyJAaiI6ImJ1bXBlciIsIkBpIjoiMzEyIiwiQHVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8iLCJzMSI6ImhpIHRoZXJlIn0seyJAaiI6ImJ1bXBlciIsIkBpIjoiMzEyIiwiQHVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8iLCJzMSI6ImhpIHRoZXJlIn1dLCJmaWxsZXIyIjoyMjIsImIiOnsiQGoiOiJidW1wZXIiLCJAaSI6IjMxMiIsIkB1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIiwiczEiOiJoaSB0aGVyZSJ9fX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMyLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMyLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTczOGYzNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczIuanNvbgpAQCAtMCwwICsxIEBACit7ImNvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMyIjp7IkBhMiI6IjMxNDE1OTI2IiwiQGExIjoiaGVsbG8gZG9sbHkiLCJmaWxsZXIxIjoxMTEsImxpc3QiOlt7IkB1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIn0seyJAdXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9XSwiZmlsbGVyMiI6MjIyLCJiIjp7IkB1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIn19fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczJfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU3YzkzNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczJfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siY29tcGxleEJlYW5XaXRoQXR0cmlidXRlczIiOnsiQGExIjoiaGVsbG8gZG9sbHkiLCJAYTIiOiIzMTQxNTkyNiIsImZpbGxlcjEiOjExMSwibGlzdCI6W3siQHVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8ifSx7IkB1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIn1dLCJmaWxsZXIyIjoyMjIsImIiOnsiQHVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8ifX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMy5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwYzkwZDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMzLmpzb24KQEAgLTAsMCArMSBAQAoreyJjb21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMyI6eyJiIjp7IkB1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIn0sImMiOnsiQHVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8ifX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzM19NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMzX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGM5MGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzM19NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJjb21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMyI6eyJiIjp7IkB1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIn0sImMiOnsiQHVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8ifX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzNC5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzNC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZTBmZTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXM0Lmpzb24KQEAgLTAsMCArMSBAQAoreyJjb21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzNCI6eyJiIjoiIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzNF9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXM0X01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmUwZmU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzNF9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJjb21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzNCI6eyJiIjoiIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlc19NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI2N2QwNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlc19NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJjb21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzIjp7IkBhMSI6ImhlbGxvIGRvbGx5IiwiQGEyIjoiMzE0MTU5MjYiLCJmaWxsZXIxIjoxMTEsImxpc3QiOlt7IkB1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIiwiQGkiOiIzMTIiLCJAaiI6ImJ1bXBlciIsInMxIjoiaGkgdGhlcmUifSx7IkB1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIiwiQGkiOiIzMTIiLCJAaiI6ImJ1bXBlciIsInMxIjoiaGkgdGhlcmUifV0sImZpbGxlcjIiOjIyMiwiYiI6eyJAdXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyIsIkBpIjoiMzEyIiwiQGoiOiJidW1wZXIiLCJzMSI6ImhpIHRoZXJlIn19fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50QmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9FbXB0eUVsZW1lbnRCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRjOTEzZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50QmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3siZW1wdHlFbGVtZW50QmVhbiI6IiJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9FbXB0eUVsZW1lbnRCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50QmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRjOTEzZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50QmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJlbXB0eUVsZW1lbnRCZWFuIjoiIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudENvbnRhaW5pbmdCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudENvbnRhaW5pbmdCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMyMGU3ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50Q29udGFpbmluZ0JlYW4uanNvbgpAQCAtMCwwICsxIEBACit7ImVtcHR5RWxlbWVudENvbnRhaW5pbmdCZWFuIjp7ImMiOiJmb28iLCJkIjoiYmFyIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9FbXB0eUVsZW1lbnRDb250YWluaW5nQmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudENvbnRhaW5pbmdCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzIwZTdmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9FbXB0eUVsZW1lbnRDb250YWluaW5nQmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJlbXB0eUVsZW1lbnRDb250YWluaW5nQmVhbiI6eyJjIjoiZm9vIiwiZCI6ImJhciJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfRW5jb2RlZENvbnRlbnRCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0VuY29kZWRDb250ZW50QmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MTE5YzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0VuY29kZWRDb250ZW50QmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3siZW5jb2RlZENvbnRlbnRCZWFuIjp7Im9uZSI6Ilx0b25lXG5cdGJpZyIsInR3byI6ImhhZsSMIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9FbmNvZGVkQ29udGVudEJlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9FbmNvZGVkQ29udGVudEJlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MTE5YzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0VuY29kZWRDb250ZW50QmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJlbmNvZGVkQ29udGVudEJlYW4iOnsib25lIjoiXHRvbmVcblx0YmlnIiwidHdvIjoiaGFmxIwifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0Zha2VBcnJheUJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfRmFrZUFycmF5QmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1N2EwMWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0Zha2VBcnJheUJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7ImZha2VBcnJheUJlYW4iOnsid2VpZ2h0IjpbIjFrZyIsIjJrZyJdLCJjb2xvciI6InJlZCIsIm5hbWUiOiJidW1wZXIifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0Zha2VBcnJheUJlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9GYWtlQXJyYXlCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTdhMDFhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9GYWtlQXJyYXlCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImZha2VBcnJheUJlYW4iOnsid2VpZ2h0IjpbIjFrZyIsIjJrZyJdLCJjb2xvciI6InJlZCIsIm5hbWUiOiJidW1wZXIifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0ludEFycmF5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0ludEFycmF5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE5ZDFiMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfSW50QXJyYXkuanNvbgpAQCAtMCwwICsxIEBACit7ImludEFycmF5Ijp7ImludEFycmF5Ijo0LCJpbnRlZ2VyQXJyYXkiOjMsIm51bWJlciI6OH19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9JbnRBcnJheV9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0ludEFycmF5X01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTlkMWIzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9JbnRBcnJheV9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJpbnRBcnJheSI6eyJpbnRBcnJheSI6NCwiaW50ZWdlckFycmF5IjozLCJudW1iZXIiOjh9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfSmVyc2V5MTE5OUxpc3QuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfSmVyc2V5MTE5OUxpc3QuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2YyZWJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9KZXJzZXkxMTk5TGlzdC5qc29uCkBAIC0wLDAgKzEgQEAKK3siamVyc2V5MTE5OUxpc3QiOnsib2JqZWN0cyI6W3siQHhzaS50eXBlIjoiY29sb3JIb2xkZXIiLCJjb2xvcnMiOlsiUkVEIiwiQkxVRSJdfSx7IkB4c2kudHlwZSI6ImNvbG9ySG9sZGVyIiwiY29sb3JzIjoiR1JFRU4ifV0sIm9mZnNldCI6MCwidG90YWwiOjJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfSmVyc2V5MTE5OUxpc3RfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9KZXJzZXkxMTk5TGlzdF9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNmMmViZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfSmVyc2V5MTE5OUxpc3RfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siamVyc2V5MTE5OUxpc3QiOnsib2JqZWN0cyI6W3siQHhzaS50eXBlIjoiY29sb3JIb2xkZXIiLCJjb2xvcnMiOlsiUkVEIiwiQkxVRSJdfSx7IkB4c2kudHlwZSI6ImNvbG9ySG9sZGVyIiwiY29sb3JzIjoiR1JFRU4ifV0sIm9mZnNldCI6MCwidG90YWwiOjJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfTGlzdEFuZE5vbkxpc3RCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0xpc3RBbmROb25MaXN0QmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4ZGI4OTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0xpc3RBbmROb25MaXN0QmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3sibGlzdEFuZE5vbkxpc3RCZWFuIjp7ImEiOjEsImQiOjJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfTGlzdEFuZE5vbkxpc3RCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfTGlzdEFuZE5vbkxpc3RCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOGRiODk3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9MaXN0QW5kTm9uTGlzdEJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sibGlzdEFuZE5vbkxpc3RCZWFuIjp7ImEiOjEsImQiOjJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfTGlzdEVtcHR5QmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9MaXN0RW1wdHlCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIwNjg5NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfTGlzdEVtcHR5QmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3sibGlzdEVtcHR5QmVhbiI6IiJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9MaXN0RW1wdHlCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfTGlzdEVtcHR5QmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIwNjg5NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfTGlzdEVtcHR5QmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJsaXN0RW1wdHlCZWFuIjoiIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX0xpc3RXcmFwcGVyQmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9MaXN0V3JhcHBlckJlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTA2OGU5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9MaXN0V3JhcHBlckJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7Iml0ZW0iOiIifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfTGlzdFdyYXBwZXJCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfTGlzdFdyYXBwZXJCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTA2OGU5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9MaXN0V3JhcHBlckJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siaXRlbSI6IiJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9NeVJlc3BvbnNlLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX015UmVzcG9uc2UuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjI5YjZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9NeVJlc3BvbnNlLmpzb24KQEAgLTAsMCArMSBAQAoreyJteVJlc3BvbnNlIjp7ImpheGIubXlNZXNzYWdlIjpbeyJpZCI6MCwidGV4dCI6Im9rIn0seyJpZCI6MSwidGV4dCI6Im9rIn1dLCJqYXhiLm15RXJyb3IiOnsiaWQiOi0xLCJkZXNjIjoiZXJyb3IifX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9NeVJlc3BvbnNlX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfTXlSZXNwb25zZV9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIyOWI2ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfTXlSZXNwb25zZV9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJteVJlc3BvbnNlIjp7ImpheGIubXlNZXNzYWdlIjpbeyJpZCI6MCwidGV4dCI6Im9rIn0seyJpZCI6MSwidGV4dCI6Im9rIn1dLCJqYXhiLm15RXJyb3IiOnsiaWQiOi0xLCJkZXNjIjoiZXJyb3IifX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Zjk1ZmE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJuYW1lc3BhY2VCZWFuIjp7ImEiOiJmb28iLCJleGFtcGxlLmIiOiJiYXIifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW5XaXRoQXR0cmlidXRlLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW5XaXRoQXR0cmlidXRlLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRlNDE4YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfTmFtZXNwYWNlQmVhbldpdGhBdHRyaWJ1dGUuanNvbgpAQCAtMCwwICsxIEBACit7Im5hbWVzcGFjZUJlYW5XaXRoQXR0cmlidXRlIjp7IkBleGFtcGxlLmF0dHIiOiJ2YWx1ZSIsImEiOiJmb28iLCJleGFtcGxlLmIiOiJiYXIifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW5XaXRoQXR0cmlidXRlX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfTmFtZXNwYWNlQmVhbldpdGhBdHRyaWJ1dGVfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0ZTQxOGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW5XaXRoQXR0cmlidXRlX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7Im5hbWVzcGFjZUJlYW5XaXRoQXR0cmlidXRlIjp7IkBleGFtcGxlLmF0dHIiOiJ2YWx1ZSIsImEiOiJmb28iLCJleGFtcGxlLmIiOiJiYXIifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Zjk1ZmE0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7Im5hbWVzcGFjZUJlYW4iOnsiYSI6ImZvbyIsImV4YW1wbGUuYiI6ImJhciJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfTnVsbFN0cmluZ0JlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfTnVsbFN0cmluZ0JlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2I0YTRkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9OdWxsU3RyaW5nQmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3sibnVsbFN0cmluZ0JlYW4iOnsibnVsbFN0cmluZyI6Im5vdCBudWxsIHRvIHRlc3QgaWYgc2V0IHRvIG51bGwgd29ya3MifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX051bGxTdHJpbmdCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfTnVsbFN0cmluZ0JlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzYjRhNGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX051bGxTdHJpbmdCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7Im51bGxTdHJpbmdCZWFuIjp7Im51bGxTdHJpbmciOiJub3QgbnVsbCB0byB0ZXN0IGlmIHNldCB0byBudWxsIHdvcmtzIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9QZXJzb24uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfUGVyc29uLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlhNzMyZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfUGVyc29uLmpzb24KQEAgLTAsMCArMSBAQAoreyJwZXJzb24iOnsibmFtZSI6IkpvZSBTY2htbyIsImNoaWxkcmVuIjp7ImNoaWxkIjpbeyJuYW1lIjoiSmlsbCBTY2htbyJ9LHsibmFtZSI6IkphY2sgU2NobW8ifV19fX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX1BlcnNvbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX1BlcnNvbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlhNzMyZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfUGVyc29uX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7InBlcnNvbiI6eyJuYW1lIjoiSm9lIFNjaG1vIiwiY2hpbGRyZW4iOnsiY2hpbGQiOlt7Im5hbWUiOiJKaWxsIFNjaG1vIn0seyJuYW1lIjoiSmFjayBTY2htbyJ9XX19fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfUHVyZUNoYXJEYXRhQmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9QdXJlQ2hhckRhdGFCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDMwNDRiZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfUHVyZUNoYXJEYXRhQmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3sicHVyZUNoYXJEYXRhQmVhbiI6InNvbWUgdGV4dHVhbCBjb250ZW50In0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX1B1cmVDaGFyRGF0YUJlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9QdXJlQ2hhckRhdGFCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzA0NGJlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9QdXJlQ2hhckRhdGFCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7InB1cmVDaGFyRGF0YUJlYW4iOiJzb21lIHRleHR1YWwgY29udGVudCJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9SZWdpc3Rlck1lc3NhZ2UuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfUmVnaXN0ZXJNZXNzYWdlLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA4YjQyYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfUmVnaXN0ZXJNZXNzYWdlLmpzb24KQEAgLTAsMCArMSBAQAoreyJyZWdpc3Rlck1lc3NhZ2UiOnsiQHJlcXVlc3RUaW1lIjoiMTIzNCIsIkBhZ2VudFVJRCI6ImFnZW50S29ja2EifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX1JlZ2lzdGVyTWVzc2FnZV9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX1JlZ2lzdGVyTWVzc2FnZV9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI4OGQ0OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfUmVnaXN0ZXJNZXNzYWdlX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7InJlZ2lzdGVyTWVzc2FnZSI6eyJAYWdlbnRVSUQiOiJhZ2VudEtvY2thIiwiQHJlcXVlc3RUaW1lIjoiMTIzNCJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBlYjMwYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3siRHVtbXlPbmUiOnsiY2hpbGQiOiJzaW1wbGUifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoQXR0cmlidXRlcy5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXMuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWJiMWY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXMuanNvbgpAQCAtMCwwICsxIEBACit7InNpbXBsZUJlYW5XaXRoQXR0cmlidXRlcyI6eyJAaiI6ImJ1bXBlciIsIkBpIjoiMzEyIiwiQHVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8iLCJzMSI6ImhpIHRoZXJlIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXNfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXNfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiZTAzYWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoQXR0cmlidXRlc19NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJzaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXMiOnsiQHVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8iLCJAaSI6IjMxMiIsIkBqIjoiYnVtcGVyIiwiczEiOiJoaSB0aGVyZSJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNDIxNzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZS5qc29uCkBAIC0wLDAgKzEgQEAKK3sic2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlIjp7IkB1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVBbmRWYWx1ZS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVBbmRWYWx1ZS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMThjZjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZUFuZFZhbHVlLmpzb24KQEAgLTAsMCArMSBAQAoreyJzaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVBbmRWYWx1ZSI6eyJAdXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyIsIiQiOiJjaGFyYWN0ZXJzIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVBbmRWYWx1ZV9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZUFuZFZhbHVlX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjE4Y2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVBbmRWYWx1ZV9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJzaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVBbmRWYWx1ZSI6eyJAdXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyIsIiQiOiJjaGFyYWN0ZXJzIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNDIxNzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZV9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJzaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGUiOnsiQHVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8ifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGViMzBiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7IkR1bW15T25lIjp7ImNoaWxkIjoic2ltcGxlIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9TaW5nbGVJdGVtTGlzdFdyYXBwZXJCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX1NpbmdsZUl0ZW1MaXN0V3JhcHBlckJlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDM1YWJiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9TaW5nbGVJdGVtTGlzdFdyYXBwZXJCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJzaW5nbGVJdGVtTGlzdFdyYXBwZXIiOnsic2luZ2xlSXRlbUxpc3QiOlsxXX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9TaW5nbGVJdGVtTGlzdFdyYXBwZXJCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfU2luZ2xlSXRlbUxpc3RXcmFwcGVyQmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQzNWFiYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfU2luZ2xlSXRlbUxpc3RXcmFwcGVyQmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJzaW5nbGVJdGVtTGlzdFdyYXBwZXIiOnsic2luZ2xlSXRlbUxpc3QiOlsxXX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9UcmVlTW9kZWwuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfVHJlZU1vZGVsLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI2MDFkNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfVHJlZU1vZGVsLmpzb24KQEAgLTAsMCArMSBAQAoreyJ0cmVlTW9kZWwiOnsicm9vdCI6eyJsYWJlbCI6ImR1bW15IG5vZGUiLCJleHBhbmRlZCI6ZmFsc2V9fX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX1RyZWVNb2RlbF9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX1RyZWVNb2RlbF9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWI2MDFkNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfVHJlZU1vZGVsX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7InRyZWVNb2RlbCI6eyJyb290Ijp7ImxhYmVsIjoiZHVtbXkgbm9kZSIsImV4cGFuZGVkIjpmYWxzZX19fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfVHdvTGlzdHNXcmFwcGVyQmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9Ud29MaXN0c1dyYXBwZXJCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEyMzMyNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfVHdvTGlzdHNXcmFwcGVyQmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3siaXRlbTIiOnsicHJvcGVydHkxIjpbImExIiwiYTEiXSwicHJvcGVydHkyIjoiYjEifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX1R3b0xpc3RzV3JhcHBlckJlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9Ud29MaXN0c1dyYXBwZXJCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTIzMzI2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9Ud29MaXN0c1dyYXBwZXJCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7Iml0ZW0yIjp7InByb3BlcnR5MSI6WyJhMSIsImExIl0sInByb3BlcnR5MiI6ImIxIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9Vc2VyLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX1VzZXIuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTdlZjgwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9Vc2VyLmpzb24KQEAgLTAsMCArMSBAQAoreyJ1c2VyIjp7InVzZXJpZCI6MTYyMSwibmFtZSI6Ikdyb3RlZmVuZCJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfVXNlclRhYmxlLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX1VzZXJUYWJsZS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZDJmMTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX1VzZXJUYWJsZS5qc29uCkBAIC0wLDAgKzEgQEAKK3sidXNlclRhYmxlIjp7ImNvbHVtbnMiOlt7ImlkIjoidXNlcmlkIiwibGFiZWwiOiJVc2VySUQifSx7ImlkIjoibmFtZSIsImxhYmVsIjoiVXNlciBOYW1lIn1dLCJyb3dzIjp7InVzZXJpZCI6MTYyMSwibmFtZSI6Ikdyb3RlZmVuZCJ9fX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX1VzZXJUYWJsZV9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSmV0dGlzb25NYXBwZWRKc29uVGVzdFByb3ZpZGVyX1VzZXJUYWJsZV9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVkMmYxOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfVXNlclRhYmxlX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7InVzZXJUYWJsZSI6eyJjb2x1bW5zIjpbeyJpZCI6InVzZXJpZCIsImxhYmVsIjoiVXNlcklEIn0seyJpZCI6Im5hbWUiLCJsYWJlbCI6IlVzZXIgTmFtZSJ9XSwicm93cyI6eyJ1c2VyaWQiOjE2MjEsIm5hbWUiOiJHcm90ZWZlbmQifX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pldHRpc29uTWFwcGVkSnNvblRlc3RQcm92aWRlcl9Vc2VyX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfVXNlcl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU3ZWY4MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9KZXR0aXNvbk1hcHBlZEpzb25UZXN0UHJvdmlkZXJfVXNlcl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJ1c2VyIjp7InVzZXJpZCI6MTYyMSwibmFtZSI6Ikdyb3RlZmVuZCJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9BbmltYWxMaXN0Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfQW5pbWFsTGlzdC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkYTI3N2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfQW5pbWFsTGlzdC5qc29uCkBAIC0wLDAgKzEgQEAKK3siYW5pbWFscyI6W3siQHR5cGUiOiJEb2ciLCJuYW1lIjoiRmlmaSJ9LHsiQHR5cGUiOiJDYXQiLCJuaWNrTmFtZSI6bnVsbCwibmFtZSI6IkRhaXN5In1dfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9BbmltYWxMaXN0X01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9BbmltYWxMaXN0X01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzZhZTliCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0FuaW1hbExpc3RfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siYW5pbWFscyI6W3siY2xhc3NOYW1lIjoib3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5LkRvZyIsImluc3RhbmNlIjp7Im5hbWUiOiJGaWZpIn19LHsiY2xhc3NOYW1lIjoib3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmpzb24uZW50aXR5LkNhdCIsImluc3RhbmNlIjp7Im5hbWUiOiJEYWlzeSJ9fV19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0Fub3RoZXJBcnJheVRlc3RCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfQW5vdGhlckFycmF5VGVzdEJlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWRjMDJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0Fub3RoZXJBcnJheVRlc3RCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJjYXRzIjpbeyJuYW1lIjoiRm9vIiwibmlja05hbWUiOiJLaXR0eSJ9LHsibmFtZSI6IkJhciIsIm5pY2tOYW1lIjoiUHVzcyJ9XSwicHJvcCI6InRlc3RQcm9wIn0KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9Bbm90aGVyQXJyYXlUZXN0QmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfQW5vdGhlckFycmF5VGVzdEJlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZGMwMmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfQW5vdGhlckFycmF5VGVzdEJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siY2F0cyI6W3sibmFtZSI6IkZvbyIsIm5pY2tOYW1lIjoiS2l0dHkifSx7Im5hbWUiOiJCYXIiLCJuaWNrTmFtZSI6IlB1c3MifV0sInByb3AiOiJ0ZXN0UHJvcCJ9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfQXR0ckFuZENoYXJEYXRhQmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0F0dHJBbmRDaGFyRGF0YUJlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjVlMWY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0F0dHJBbmRDaGFyRGF0YUJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7ImF0dHIiOiJhdmFsIiwidmFsdWUiOiJwdmFsIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfQXR0ckFuZENoYXJEYXRhQmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfQXR0ckFuZENoYXJEYXRhQmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY1ZTFmNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9BdHRyQW5kQ2hhckRhdGFCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImF0dHIiOiJhdmFsIiwidmFsdWUiOiJwdmFsIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlcy5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTg4YjNjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMuanNvbgpAQCAtMCwwICsxIEBACit7ImExIjoiaGVsbG8gZG9sbHkiLCJhMiI6MzE0MTU5MjYsImIiOnsiaSI6MzEyLCJqIjoiYnVtcGVyIiwiczEiOiJoaSB0aGVyZSIsInVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8ifSwiZmlsbGVyMSI6IjExMSIsImZpbGxlcjIiOiIyMjIiLCJsaXN0IjpbeyJpIjozMTIsImoiOiJidW1wZXIiLCJzMSI6ImhpIHRoZXJlIiwidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9LHsiaSI6MzEyLCJqIjoiYnVtcGVyIiwiczEiOiJoaSB0aGVyZSIsInVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8ifV19CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczIuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZDg3YjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczIuanNvbgpAQCAtMCwwICsxIEBACit7ImExIjoiaGVsbG8gZG9sbHkiLCJhMiI6MzE0MTU5MjYsImIiOnsidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9LCJmaWxsZXIxIjoiMTExIiwiZmlsbGVyMiI6IjIyMiIsImxpc3QiOlt7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8ifSx7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8ifV19CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczJfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMyX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGQ4N2IzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMyX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImExIjoiaGVsbG8gZG9sbHkiLCJhMiI6MzE0MTU5MjYsImIiOnsidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9LCJmaWxsZXIxIjoiMTExIiwiZmlsbGVyMiI6IjIyMiIsImxpc3QiOlt7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8ifSx7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8ifV19CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczMuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZDYzNzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczMuanNvbgpAQCAtMCwwICsxIEBACit7ImIiOnsidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9LCJjIjp7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8ifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczNfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMzX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGQ2Mzc5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMzX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImIiOnsidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9LCJjIjp7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8ifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczQuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzNC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMDAxMmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczQuanNvbgpAQCAtMCwwICsxIEBACit7ImIiOnt9LCJsaXN0IjpbXX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczRfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXM0X01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzAwMTJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXM0X01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImIiOnt9LCJsaXN0IjpbXX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlc19NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlc19NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU4OGIzYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImExIjoiaGVsbG8gZG9sbHkiLCJhMiI6MzE0MTU5MjYsImIiOnsiaSI6MzEyLCJqIjoiYnVtcGVyIiwiczEiOiJoaSB0aGVyZSIsInVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8ifSwiZmlsbGVyMSI6IjExMSIsImZpbGxlcjIiOiIyMjIiLCJsaXN0IjpbeyJpIjozMTIsImoiOiJidW1wZXIiLCJzMSI6ImhpIHRoZXJlIiwidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9LHsiaSI6MzEyLCJqIjoiYnVtcGVyIiwiczEiOiJoaSB0aGVyZSIsInVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8ifV19CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50QmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudEJlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTI2ZGZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudEJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9FbXB0eUVsZW1lbnRCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9FbXB0eUVsZW1lbnRCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTI2ZGZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudEJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3t9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudENvbnRhaW5pbmdCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50Q29udGFpbmluZ0JlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDgxOWY5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudENvbnRhaW5pbmdCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJjIjoiZm9vIiwiZCI6ImJhciJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudENvbnRhaW5pbmdCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9FbXB0eUVsZW1lbnRDb250YWluaW5nQmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQ4MTlmOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9FbXB0eUVsZW1lbnRDb250YWluaW5nQmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJjIjoiZm9vIiwiZCI6ImJhciJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0VuY29kZWRDb250ZW50QmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0VuY29kZWRDb250ZW50QmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZGUzYTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfRW5jb2RlZENvbnRlbnRCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJvbmUiOiJcdG9uZVxuXHRiaWciLCJ0d28iOiJoYWbEjCJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0VuY29kZWRDb250ZW50QmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfRW5jb2RlZENvbnRlbnRCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGRlM2E2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0VuY29kZWRDb250ZW50QmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJvbmUiOiJcdG9uZVxuXHRiaWciLCJ0d28iOiJoYWbEjCJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0Zha2VBcnJheUJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9GYWtlQXJyYXlCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM5MzMxNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9GYWtlQXJyYXlCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJjb2xvciI6InJlZCIsIm5hbWUiOiJidW1wZXIiLCJ3ZWlnaHQiOlsiMWtnIiwiMmtnIl19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0Zha2VBcnJheUJlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0Zha2VBcnJheUJlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzYzg4MjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfRmFrZUFycmF5QmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJjb2xvciI6InJlZCIsIm5hbWUiOiJidW1wZXIiLCJ3ZWlnaHQiOlsiMWtnIiwiMmtnIl19CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfSW50QXJyYXkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9JbnRBcnJheS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NDU3MTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfSW50QXJyYXkuanNvbgpAQCAtMCwwICsxIEBACit7ImludEFycmF5IjpbNF0sImludGVnZXJBcnJheSI6WzNdLCJudW1iZXIiOjh9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0ludEFycmF5X01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9JbnRBcnJheV9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ0NTcxNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9JbnRBcnJheV9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJpbnRBcnJheSI6WzRdLCJpbnRlZ2VyQXJyYXkiOlszXSwibnVtYmVyIjo4fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9KZXJzZXkxMTk5TGlzdC5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0plcnNleTExOTlMaXN0Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg4Y2JhMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9KZXJzZXkxMTk5TGlzdC5qc29uCkBAIC0wLDAgKzEgQEAKK3sib2JqZWN0cyI6W3siY29sb3JzIjpbIlJFRCIsIkJMVUUiXX0seyJjb2xvcnMiOlsiR1JFRU4iXX1dLCJvZmZzZXQiOjAsInRvdGFsIjoyfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0plcnNleTExOTlMaXN0X01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9KZXJzZXkxMTk5TGlzdF9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg4Y2JhMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9KZXJzZXkxMTk5TGlzdF9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJvYmplY3RzIjpbeyJjb2xvcnMiOlsiUkVEIiwiQkxVRSJdfSx7ImNvbG9ycyI6WyJHUkVFTiJdfV0sIm9mZnNldCI6MCwidG90YWwiOjJ9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfTGlzdEFuZE5vbkxpc3RCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfTGlzdEFuZE5vbkxpc3RCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg1Y2FkOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9MaXN0QW5kTm9uTGlzdEJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7ImEiOlsiMSJdLCJkIjoiMiJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0xpc3RBbmROb25MaXN0QmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfTGlzdEFuZE5vbkxpc3RCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODVjYWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0xpc3RBbmROb25MaXN0QmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJhIjpbIjEiXSwiZCI6IjIifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9MaXN0RW1wdHlCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfTGlzdEVtcHR5QmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YTlmNTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfTGlzdEVtcHR5QmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3siZW1wdHkiOltdfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9MaXN0RW1wdHlCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9MaXN0RW1wdHlCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWE5ZjUzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0xpc3RFbXB0eUJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siZW1wdHkiOltdfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9MaXN0V3JhcHBlckJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9MaXN0V3JhcHBlckJlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzkxNjBlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0xpc3RXcmFwcGVyQmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3sicHJvcGVydHkiOm51bGx9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0xpc3RXcmFwcGVyQmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfTGlzdFdyYXBwZXJCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzkxNjBlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX0xpc3RXcmFwcGVyQmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJwcm9wZXJ0eSI6bnVsbH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfTXlSZXNwb25zZS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX015UmVzcG9uc2UuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDNkMDRlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX015UmVzcG9uc2UuanNvbgpAQCAtMCwwICsxIEBACit7Im15RXJyb3IiOnsiZGVzYyI6ImVycm9yIiwiaWQiOiItMSJ9LCJteU1lc3NhZ2UiOlt7ImlkIjoiMCIsInRleHQiOiJvayJ9LHsiaWQiOiIxIiwidGV4dCI6Im9rIn1dfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9NeVJlc3BvbnNlX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9NeVJlc3BvbnNlX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDNkMDRlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX015UmVzcG9uc2VfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sibXlFcnJvciI6eyJkZXNjIjoiZXJyb3IiLCJpZCI6Ii0xIn0sIm15TWVzc2FnZSI6W3siaWQiOiIwIiwidGV4dCI6Im9rIn0seyJpZCI6IjEiLCJ0ZXh0Ijoib2sifV19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM4NmQ1ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJhIjoiZm9vIiwiYiI6ImJhciJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW5XaXRoQXR0cmlidXRlLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfTmFtZXNwYWNlQmVhbldpdGhBdHRyaWJ1dGUuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTE3Y2U1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW5XaXRoQXR0cmlidXRlLmpzb24KQEAgLTAsMCArMSBAQAoreyJhIjoiZm9vIiwiYXR0ciI6InZhbHVlIiwiYiI6ImJhciJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW5XaXRoQXR0cmlidXRlX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuV2l0aEF0dHJpYnV0ZV9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTkxNTcyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuV2l0aEF0dHJpYnV0ZV9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJhIjoiZm9vIiwiYXR0ciI6InZhbHVlIiwiYiI6ImJhciJ9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfTmFtZXNwYWNlQmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfTmFtZXNwYWNlQmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM4NmQ1ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImEiOiJmb28iLCJiIjoiYmFyIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfTnVsbFN0cmluZ0JlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9OdWxsU3RyaW5nQmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhOGNkM2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfTnVsbFN0cmluZ0JlYW4uanNvbgpAQCAtMCwwICsxIEBACit7Im51bGxTdHJpbmciOiJub3QgbnVsbCB0byB0ZXN0IGlmIHNldCB0byBudWxsIHdvcmtzIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfTnVsbFN0cmluZ0JlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX051bGxTdHJpbmdCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YThjZDNkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX051bGxTdHJpbmdCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7Im51bGxTdHJpbmciOiJub3QgbnVsbCB0byB0ZXN0IGlmIHNldCB0byBudWxsIHdvcmtzIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfUGVyc29uLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfUGVyc29uLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRmOWRjZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9QZXJzb24uanNvbgpAQCAtMCwwICsxIEBACit7ImNoaWxkcmVuIjpbeyJuYW1lIjoiSmlsbCBTY2htbyJ9LHsibmFtZSI6IkphY2sgU2NobW8ifV0sIm5hbWUiOiJKb2UgU2NobW8ifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9QZXJzb25fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1BlcnNvbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E2NjBlZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9QZXJzb25fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siY2hpbGRyZW4iOlt7Im5hbWUiOiJKaWxsIFNjaG1vIn0seyJuYW1lIjoiSmFjayBTY2htbyJ9XSwibmFtZSI6IkpvZSBTY2htbyJ9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfUG9qb0FuaW1hbExpc3QuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9Qb2pvQW5pbWFsTGlzdC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNDk1MjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfUG9qb0FuaW1hbExpc3QuanNvbgpAQCAtMCwwICsxIEBACit7ImFuaW1hbHMiOlt7IkB0eXBlIjoiUG9qb0RvZyIsIm5hbWUiOiJGaWZpIn0seyJAdHlwZSI6IlBvam9DYXQiLCJuaWNrTmFtZSI6bnVsbCwibmFtZSI6IkRhaXN5In1dfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9Qb2pvQW5pbWFsTGlzdF9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfUG9qb0FuaW1hbExpc3RfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNDk1MjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfUG9qb0FuaW1hbExpc3RfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siYW5pbWFscyI6W3siQHR5cGUiOiJQb2pvRG9nIiwibmFtZSI6IkZpZmkifSx7IkB0eXBlIjoiUG9qb0NhdCIsIm5pY2tOYW1lIjpudWxsLCJuYW1lIjoiRGFpc3kifV19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1B1cmVDaGFyRGF0YUJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9QdXJlQ2hhckRhdGFCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJkYmMyYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9QdXJlQ2hhckRhdGFCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJjb250ZW50Ijoic29tZSB0ZXh0dWFsIGNvbnRlbnQifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9QdXJlQ2hhckRhdGFCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9QdXJlQ2hhckRhdGFCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmRiYzJiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1B1cmVDaGFyRGF0YUJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siY29udGVudCI6InNvbWUgdGV4dHVhbCBjb250ZW50In0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfUmVnaXN0ZXJNZXNzYWdlLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfUmVnaXN0ZXJNZXNzYWdlLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlmNDliMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9SZWdpc3Rlck1lc3NhZ2UuanNvbgpAQCAtMCwwICsxIEBACit7ImFnZW50VUlEIjoiYWdlbnRLb2NrYSIsInJlcXVlc3RUaW1lIjoxMjM0fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9SZWdpc3Rlck1lc3NhZ2VfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1JlZ2lzdGVyTWVzc2FnZV9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlmNDliMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9SZWdpc3Rlck1lc3NhZ2VfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siYWdlbnRVSUQiOiJhZ2VudEtvY2thIiwicmVxdWVzdFRpbWUiOjEyMzR9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9TaW1wbGVCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYzODBiNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9TaW1wbGVCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJjaGlsZCI6InNpbXBsZSJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoQXR0cmlidXRlcy5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoQXR0cmlidXRlcy5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ODgxOGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhBdHRyaWJ1dGVzLmpzb24KQEAgLTAsMCArMSBAQAoreyJpIjozMTIsImoiOiJidW1wZXIiLCJzMSI6ImhpIHRoZXJlIiwidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoQXR0cmlidXRlc19NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhBdHRyaWJ1dGVzX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTg4MThhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoQXR0cmlidXRlc19NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJpIjozMTIsImoiOiJidW1wZXIiLCJzMSI6ImhpIHRoZXJlIiwidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ODk4OTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlLmpzb24KQEAgLTAsMCArMSBAQAoreyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlQW5kVmFsdWUuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVBbmRWYWx1ZS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZWNhMjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlQW5kVmFsdWUuanNvbgpAQCAtMCwwICsxIEBACit7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8iLCJ2YWx1ZSI6ImNoYXJhY3RlcnMifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVBbmRWYWx1ZV9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlQW5kVmFsdWVfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZWNhMjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlQW5kVmFsdWVfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyIsInZhbHVlIjoiY2hhcmFjdGVycyJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZV9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTg5ODk2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZV9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfU2ltcGxlQmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfU2ltcGxlQmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYzODBiNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9TaW1wbGVCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImNoaWxkIjoic2ltcGxlIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfVHJlZU1vZGVsLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfVHJlZU1vZGVsLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZkMzVjMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9UcmVlTW9kZWwuanNvbgpAQCAtMCwwICsxIEBACit7InJvb3QiOnsiZXhwYW5kZWQiOmZhbHNlLCJsYWJlbCI6ImR1bW15IG5vZGUifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfVHJlZU1vZGVsX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9UcmVlTW9kZWxfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNjc0NmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfVHJlZU1vZGVsX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7InJvb3QiOnsiZXhwYW5kZWQiOmZhbHNlLCJsYWJlbCI6ImR1bW15IG5vZGUifX0KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9Ud29MaXN0c1dyYXBwZXJCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfVHdvTGlzdHNXcmFwcGVyQmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZmYyMzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfVHdvTGlzdHNXcmFwcGVyQmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3sicHJvcGVydHkxIjpbImExIiwiYTEiXSwicHJvcGVydHkyIjpbImIxIl19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1R3b0xpc3RzV3JhcHBlckJlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1R3b0xpc3RzV3JhcHBlckJlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0ZmYyMzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfVHdvTGlzdHNXcmFwcGVyQmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJwcm9wZXJ0eTEiOlsiYTEiLCJhMSJdLCJwcm9wZXJ0eTIiOlsiYjEiXX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfVXNlci5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1VzZXIuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTYwZWYwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1VzZXIuanNvbgpAQCAtMCwwICsxIEBACit7ImlkIjoiMTYyMSIsIm5hbWUiOiJHcm90ZWZlbmQifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9Vc2VyVGFibGUuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9Vc2VyVGFibGUuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjE1YmJkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1VzZXJUYWJsZS5qc29uCkBAIC0wLDAgKzEgQEAKK3siY29sdW1ucyI6W3siaWQiOiJ1c2VyaWQiLCJsYWJlbCI6IlVzZXJJRCJ9LHsiaWQiOiJuYW1lIiwibGFiZWwiOiJVc2VyIE5hbWUifV0sInJvd3MiOlt7ImlkIjoiMTYyMSIsIm5hbWUiOiJHcm90ZWZlbmQifV19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1VzZXJUYWJsZV9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfVXNlclRhYmxlX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjE1YmJkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L0pzb25iVGVzdFByb3ZpZGVyX1VzZXJUYWJsZV9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJjb2x1bW5zIjpbeyJpZCI6InVzZXJpZCIsImxhYmVsIjoiVXNlcklEIn0seyJpZCI6Im5hbWUiLCJsYWJlbCI6IlVzZXIgTmFtZSJ9XSwicm93cyI6W3siaWQiOiIxNjIxIiwibmFtZSI6Ikdyb3RlZmVuZCJ9XX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfVXNlcl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvSnNvbmJUZXN0UHJvdmlkZXJfVXNlcl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU2MGVmMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Kc29uYlRlc3RQcm92aWRlcl9Vc2VyX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImlkIjoiMTYyMSIsIm5hbWUiOiJHcm90ZWZlbmQifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9BbmltYWxMaXN0Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfQW5pbWFsTGlzdC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZTM2MWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfQW5pbWFsTGlzdC5qc29uCkBAIC0wLDAgKzEgQEAKK3siYW5pbWFscyI6W3sieHNpOnR5cGUiOiJkb2ciLCJuYW1lIjoiRmlmaSJ9LHsieHNpOnR5cGUiOiJjYXQiLCJuYW1lIjoiRGFpc3kifV19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0FuaW1hbExpc3RfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0FuaW1hbExpc3RfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZTM2MWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfQW5pbWFsTGlzdF9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJhbmltYWxzIjpbeyJ4c2k6dHlwZSI6ImRvZyIsIm5hbWUiOiJGaWZpIn0seyJ4c2k6dHlwZSI6ImNhdCIsIm5hbWUiOiJEYWlzeSJ9XX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfQW5vdGhlckFycmF5VGVzdEJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9Bbm90aGVyQXJyYXlUZXN0QmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmYjM3MDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfQW5vdGhlckFycmF5VGVzdEJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7ImNhdHMiOlt7Im5hbWUiOiJGb28iLCJuaWNrTmFtZSI6IktpdHR5In0seyJuYW1lIjoiQmFyIiwibmlja05hbWUiOiJQdXNzIn1dLCJwcm9wIjoidGVzdFByb3AifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9Bbm90aGVyQXJyYXlUZXN0QmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfQW5vdGhlckFycmF5VGVzdEJlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmYjM3MDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfQW5vdGhlckFycmF5VGVzdEJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siY2F0cyI6W3sibmFtZSI6IkZvbyIsIm5pY2tOYW1lIjoiS2l0dHkifSx7Im5hbWUiOiJCYXIiLCJuaWNrTmFtZSI6IlB1c3MifV0sInByb3AiOiJ0ZXN0UHJvcCJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0F0dHJBbmRDaGFyRGF0YUJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9BdHRyQW5kQ2hhckRhdGFCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY1ZTFmNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9BdHRyQW5kQ2hhckRhdGFCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJhdHRyIjoiYXZhbCIsInZhbHVlIjoicHZhbCJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0F0dHJBbmRDaGFyRGF0YUJlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0F0dHJBbmRDaGFyRGF0YUJlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NWUxZjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfQXR0ckFuZENoYXJEYXRhQmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJhdHRyIjoiYXZhbCIsInZhbHVlIjoicHZhbCJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWUwNGFjYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzLmpzb24KQEAgLTAsMCArMSBAQAoreyJhMSI6ImhlbGxvIGRvbGx5IiwiYTIiOjMxNDE1OTI2LCJmaWxsZXIxIjoiMTExIiwibGlzdCI6W3sidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyIsImkiOjMxMiwiaiI6ImJ1bXBlciIsInMxIjoiaGkgdGhlcmUifSx7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8iLCJpIjozMTIsImoiOiJidW1wZXIiLCJzMSI6ImhpIHRoZXJlIn1dLCJmaWxsZXIyIjoiMjIyIiwiYiI6eyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIiwiaSI6MzEyLCJqIjoiYnVtcGVyIiwiczEiOiJoaSB0aGVyZSJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMyLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEzZGQ1NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzMi5qc29uCkBAIC0wLDAgKzEgQEAKK3siYTEiOiJoZWxsbyBkb2xseSIsImEyIjozMTQxNTkyNiwiZmlsbGVyMSI6IjExMSIsImxpc3QiOlt7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8ifSx7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8ifV0sImZpbGxlcjIiOiIyMjIiLCJiIjp7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8ifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczJfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMyX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTNkZDU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMyX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImExIjoiaGVsbG8gZG9sbHkiLCJhMiI6MzE0MTU5MjYsImZpbGxlcjEiOiIxMTEiLCJsaXN0IjpbeyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIn0seyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIn1dLCJmaWxsZXIyIjoiMjIyIiwiYiI6eyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMzLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczMuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGQ2Mzc5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMzLmpzb24KQEAgLTAsMCArMSBAQAoreyJiIjp7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8ifSwiYyI6eyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXMzX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzM19NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RkNjM3OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzM19NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJiIjp7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8ifSwiYyI6eyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXM0Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlczQuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzI0YjA5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXM0Lmpzb24KQEAgLTAsMCArMSBAQAoreyJsaXN0IjpbXSwiYiI6e319ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXM0X01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzNF9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcyNGIwOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9Db21wbGV4QmVhbldpdGhBdHRyaWJ1dGVzNF9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJsaXN0IjpbXSwiYiI6e319ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXNfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0NvbXBsZXhCZWFuV2l0aEF0dHJpYnV0ZXNfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlMDRhY2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfQ29tcGxleEJlYW5XaXRoQXR0cmlidXRlc19NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJhMSI6ImhlbGxvIGRvbGx5IiwiYTIiOjMxNDE1OTI2LCJmaWxsZXIxIjoiMTExIiwibGlzdCI6W3sidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyIsImkiOjMxMiwiaiI6ImJ1bXBlciIsInMxIjoiaGkgdGhlcmUifSx7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8iLCJpIjozMTIsImoiOiJidW1wZXIiLCJzMSI6ImhpIHRoZXJlIn1dLCJmaWxsZXIyIjoiMjIyIiwiYiI6eyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIiwiaSI6MzEyLCJqIjoiYnVtcGVyIiwiczEiOiJoaSB0aGVyZSJ9fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9FbXB0eUVsZW1lbnRCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50QmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMjZkZmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50QmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3t9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudEJlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudEJlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllMjZkZmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50QmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAore30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50Q29udGFpbmluZ0JlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9FbXB0eUVsZW1lbnRDb250YWluaW5nQmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ODE5ZjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50Q29udGFpbmluZ0JlYW4uanNvbgpAQCAtMCwwICsxIEBACit7ImMiOiJmb28iLCJkIjoiYmFyIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfRW1wdHlFbGVtZW50Q29udGFpbmluZ0JlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudENvbnRhaW5pbmdCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDgxOWY5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0VtcHR5RWxlbWVudENvbnRhaW5pbmdCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImMiOiJmb28iLCJkIjoiYmFyIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfRW5jb2RlZENvbnRlbnRCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfRW5jb2RlZENvbnRlbnRCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRkZTNhNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9FbmNvZGVkQ29udGVudEJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7Im9uZSI6Ilx0b25lXG5cdGJpZyIsInR3byI6ImhhZsSMIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfRW5jb2RlZENvbnRlbnRCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9FbmNvZGVkQ29udGVudEJlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0ZGUzYTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfRW5jb2RlZENvbnRlbnRCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7Im9uZSI6Ilx0b25lXG5cdGJpZyIsInR3byI6ImhhZsSMIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfRmFrZUFycmF5QmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0Zha2VBcnJheUJlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzJiMDk4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0Zha2VBcnJheUJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7IndlaWdodCI6WyIxa2ciLCIya2ciXSwiY29sb3IiOiJyZWQiLCJuYW1lIjoiYnVtcGVyIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfRmFrZUFycmF5QmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfRmFrZUFycmF5QmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMyYjA5OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9GYWtlQXJyYXlCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7IndlaWdodCI6WyIxa2ciLCIya2ciXSwiY29sb3IiOiJyZWQiLCJuYW1lIjoiYnVtcGVyIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfSW50QXJyYXkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9JbnRBcnJheS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0NDU3MTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfSW50QXJyYXkuanNvbgpAQCAtMCwwICsxIEBACit7ImludEFycmF5IjpbNF0sImludGVnZXJBcnJheSI6WzNdLCJudW1iZXIiOjh9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0ludEFycmF5X01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9JbnRBcnJheV9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQ0NTcxNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9JbnRBcnJheV9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJpbnRBcnJheSI6WzRdLCJpbnRlZ2VyQXJyYXkiOlszXSwibnVtYmVyIjo4fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9KZXJzZXkxMTk5TGlzdC5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0plcnNleTExOTlMaXN0Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ4MWFmMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9KZXJzZXkxMTk5TGlzdC5qc29uCkBAIC0wLDAgKzEgQEAKK3sib2JqZWN0cyI6W3sieHNpOnR5cGUiOiJjb2xvckhvbGRlciIsImNvbG9ycyI6WyJSRUQiLCJCTFVFIl19LHsieHNpOnR5cGUiOiJjb2xvckhvbGRlciIsImNvbG9ycyI6WyJHUkVFTiJdfV0sIm9mZnNldCI6MCwidG90YWwiOjJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0plcnNleTExOTlMaXN0X01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9KZXJzZXkxMTk5TGlzdF9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ4MWFmMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9KZXJzZXkxMTk5TGlzdF9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJvYmplY3RzIjpbeyJ4c2k6dHlwZSI6ImNvbG9ySG9sZGVyIiwiY29sb3JzIjpbIlJFRCIsIkJMVUUiXX0seyJ4c2k6dHlwZSI6ImNvbG9ySG9sZGVyIiwiY29sb3JzIjpbIkdSRUVOIl19XSwib2Zmc2V0IjowLCJ0b3RhbCI6Mn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfTGlzdEFuZE5vbkxpc3RCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfTGlzdEFuZE5vbkxpc3RCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg1Y2FkOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9MaXN0QW5kTm9uTGlzdEJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7ImEiOlsiMSJdLCJkIjoiMiJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0xpc3RBbmROb25MaXN0QmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfTGlzdEFuZE5vbkxpc3RCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODVjYWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0xpc3RBbmROb25MaXN0QmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJhIjpbIjEiXSwiZCI6IjIifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9MaXN0RW1wdHlCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfTGlzdEVtcHR5QmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YTlmNTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfTGlzdEVtcHR5QmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3siZW1wdHkiOltdfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9MaXN0RW1wdHlCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9MaXN0RW1wdHlCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWE5ZjUzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0xpc3RFbXB0eUJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siZW1wdHkiOltdfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9MaXN0V3JhcHBlckJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9MaXN0V3JhcHBlckJlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTI2ZGZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0xpc3RXcmFwcGVyQmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3t9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0xpc3RXcmFwcGVyQmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfTGlzdFdyYXBwZXJCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTI2ZGZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX0xpc3RXcmFwcGVyQmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAore30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfTXlSZXNwb25zZS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX015UmVzcG9uc2UuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDU0ZDY3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX015UmVzcG9uc2UuanNvbgpAQCAtMCwwICsxIEBACit7ImpheGI6bXlNZXNzYWdlIjpbeyJpZCI6IjAiLCJ0ZXh0Ijoib2sifSx7ImlkIjoiMSIsInRleHQiOiJvayJ9XSwiamF4YjpteUVycm9yIjp7ImlkIjoiLTEiLCJkZXNjIjoiZXJyb3IifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfTXlSZXNwb25zZV9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfTXlSZXNwb25zZV9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA1NGQ2NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9NeVJlc3BvbnNlX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImpheGI6bXlNZXNzYWdlIjpbeyJpZCI6IjAiLCJ0ZXh0Ijoib2sifSx7ImlkIjoiMSIsInRleHQiOiJvayJ9XSwiamF4YjpteUVycm9yIjp7ImlkIjoiLTEiLCJkZXNjIjoiZXJyb3IifX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfTmFtZXNwYWNlQmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGRmNjU1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7ImEiOiJmb28iLCJleGFtcGxlOmIiOiJiYXIifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuV2l0aEF0dHJpYnV0ZS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW5XaXRoQXR0cmlidXRlLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE1OGM4OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9OYW1lc3BhY2VCZWFuV2l0aEF0dHJpYnV0ZS5qc29uCkBAIC0wLDAgKzEgQEAKK3siZXhhbXBsZTphdHRyIjoidmFsdWUiLCJhIjoiZm9vIiwiZXhhbXBsZTpiIjoiYmFyIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfTmFtZXNwYWNlQmVhbldpdGhBdHRyaWJ1dGVfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW5XaXRoQXR0cmlidXRlX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTU4Yzg4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW5XaXRoQXR0cmlidXRlX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImV4YW1wbGU6YXR0ciI6InZhbHVlIiwiYSI6ImZvbyIsImV4YW1wbGU6YiI6ImJhciJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX05hbWVzcGFjZUJlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZGY2NTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfTmFtZXNwYWNlQmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJhIjoiZm9vIiwiZXhhbXBsZTpiIjoiYmFyIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfTnVsbFN0cmluZ0JlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9OdWxsU3RyaW5nQmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhOGNkM2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfTnVsbFN0cmluZ0JlYW4uanNvbgpAQCAtMCwwICsxIEBACit7Im51bGxTdHJpbmciOiJub3QgbnVsbCB0byB0ZXN0IGlmIHNldCB0byBudWxsIHdvcmtzIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfTnVsbFN0cmluZ0JlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX051bGxTdHJpbmdCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YThjZDNkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX051bGxTdHJpbmdCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7Im51bGxTdHJpbmciOiJub3QgbnVsbCB0byB0ZXN0IGlmIHNldCB0byBudWxsIHdvcmtzIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfUGVyc29uLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfUGVyc29uLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNjZDM5ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9QZXJzb24uanNvbgpAQCAtMCwwICsxIEBACit7Im5hbWUiOiJKb2UgU2NobW8iLCJjaGlsZHJlbiI6eyJjaGlsZCI6W3sibmFtZSI6IkppbGwgU2NobW8ifSx7Im5hbWUiOiJKYWNrIFNjaG1vIn1dfX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfUGVyc29uX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9QZXJzb25fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjY2QzOWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfUGVyc29uX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7Im5hbWUiOiJKb2UgU2NobW8iLCJjaGlsZHJlbiI6eyJjaGlsZCI6W3sibmFtZSI6IkppbGwgU2NobW8ifSx7Im5hbWUiOiJKYWNrIFNjaG1vIn1dfX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfUHVyZUNoYXJEYXRhQmVhbi5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX1B1cmVDaGFyRGF0YUJlYW4uanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2QzMTUzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX1B1cmVDaGFyRGF0YUJlYW4uanNvbgpAQCAtMCwwICsxIEBACit7InZhbHVlIjoic29tZSB0ZXh0dWFsIGNvbnRlbnQifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9QdXJlQ2hhckRhdGFCZWFuX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9QdXJlQ2hhckRhdGFCZWFuX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2QzMTUzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX1B1cmVDaGFyRGF0YUJlYW5fTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sidmFsdWUiOiJzb21lIHRleHR1YWwgY29udGVudCJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX1JlZ2lzdGVyTWVzc2FnZS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX1JlZ2lzdGVyTWVzc2FnZS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZjQ5YjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfUmVnaXN0ZXJNZXNzYWdlLmpzb24KQEAgLTAsMCArMSBAQAoreyJhZ2VudFVJRCI6ImFnZW50S29ja2EiLCJyZXF1ZXN0VGltZSI6MTIzNH0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfUmVnaXN0ZXJNZXNzYWdlX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9SZWdpc3Rlck1lc3NhZ2VfTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZjQ5YjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfUmVnaXN0ZXJNZXNzYWdlX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7ImFnZW50VUlEIjoiYWdlbnRLb2NrYSIsInJlcXVlc3RUaW1lIjoxMjM0fQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbi5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMzgwYjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbi5qc29uCkBAIC0wLDAgKzEgQEAKK3siY2hpbGQiOiJzaW1wbGUifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXMuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXMuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWQwOGQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoQXR0cmlidXRlcy5qc29uCkBAIC0wLDAgKzEgQEAKK3sidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyIsImkiOjMxMiwiaiI6ImJ1bXBlciIsInMxIjoiaGkgdGhlcmUifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXNfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoQXR0cmlidXRlc19NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVkMDhkNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEF0dHJpYnV0ZXNfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyIsImkiOjMxMiwiaiI6ImJ1bXBlciIsInMxIjoiaGkgdGhlcmUifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGUuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGUuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTg5ODk2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZS5qc29uCkBAIC0wLDAgKzEgQEAKK3sidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZUFuZFZhbHVlLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlQW5kVmFsdWUuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmVjYTIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZUFuZFZhbHVlLmpzb24KQEAgLTAsMCArMSBAQAoreyJ1cmkiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvamVkbmEvYmVkbmEvIiwidmFsdWUiOiJjaGFyYWN0ZXJzIn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbldpdGhKdXN0T25lQXR0cmlidXRlQW5kVmFsdWVfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZUFuZFZhbHVlX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmVjYTIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZUFuZFZhbHVlX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7InVyaSI6Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9qZWRuYS9iZWRuYS8iLCJ2YWx1ZSI6ImNoYXJhY3RlcnMifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5XaXRoSnVzdE9uZUF0dHJpYnV0ZV9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk4OTg5NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9TaW1wbGVCZWFuV2l0aEp1c3RPbmVBdHRyaWJ1dGVfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sidXJpIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2plZG5hL2JlZG5hLyJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5fTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX1NpbXBsZUJlYW5fTU9YeS5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMzgwYjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfU2ltcGxlQmVhbl9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJjaGlsZCI6InNpbXBsZSJ9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX1RyZWVNb2RlbC5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX1RyZWVNb2RlbC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZmFkYjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfVHJlZU1vZGVsLmpzb24KQEAgLTAsMCArMSBAQAoreyJyb290Ijp7ImxhYmVsIjoiZHVtbXkgbm9kZSIsImV4cGFuZGVkIjpmYWxzZX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX1RyZWVNb2RlbF9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfVHJlZU1vZGVsX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmZhZGIzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX1RyZWVNb2RlbF9NT1h5Lmpzb24KQEAgLTAsMCArMSBAQAoreyJyb290Ijp7ImxhYmVsIjoiZHVtbXkgbm9kZSIsImV4cGFuZGVkIjpmYWxzZX19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX1R3b0xpc3RzV3JhcHBlckJlYW4uanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9Ud29MaXN0c1dyYXBwZXJCZWFuLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRmZjIzOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9Ud29MaXN0c1dyYXBwZXJCZWFuLmpzb24KQEAgLTAsMCArMSBAQAoreyJwcm9wZXJ0eTEiOlsiYTEiLCJhMSJdLCJwcm9wZXJ0eTIiOlsiYjEiXX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfVHdvTGlzdHNXcmFwcGVyQmVhbl9NT1h5Lmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfVHdvTGlzdHNXcmFwcGVyQmVhbl9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDRmZjIzOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9Ud29MaXN0c1dyYXBwZXJCZWFuX01PWHkuanNvbgpAQCAtMCwwICsxIEBACit7InByb3BlcnR5MSI6WyJhMSIsImExIl0sInByb3BlcnR5MiI6WyJiMSJdfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9Vc2VyLmpzb24gYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfVXNlci5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExYjkxYjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtZW50aXR5L3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvanNvbi9lbnRpdHkvTW94eUpzb25UZXN0UHJvdmlkZXJfVXNlci5qc29uCkBAIC0wLDAgKzEgQEAKK3sidXNlcmlkIjoiMTYyMSIsIm5hbWUiOiJHcm90ZWZlbmQifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9Vc2VyVGFibGUuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9Vc2VyVGFibGUuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjUyMTk1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX1VzZXJUYWJsZS5qc29uCkBAIC0wLDAgKzEgQEAKK3siY29sdW1ucyI6W3siaWQiOiJ1c2VyaWQiLCJsYWJlbCI6IlVzZXJJRCJ9LHsiaWQiOiJuYW1lIiwibGFiZWwiOiJVc2VyIE5hbWUifV0sInJvd3MiOlt7InVzZXJpZCI6IjE2MjEiLCJuYW1lIjoiR3JvdGVmZW5kIn1dfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9Vc2VyVGFibGVfTU9YeS5qc29uIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX1VzZXJUYWJsZV9NT1h5Lmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY1MjE5NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9Vc2VyVGFibGVfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3siY29sdW1ucyI6W3siaWQiOiJ1c2VyaWQiLCJsYWJlbCI6IlVzZXJJRCJ9LHsiaWQiOiJuYW1lIiwibGFiZWwiOiJVc2VyIE5hbWUifV0sInJvd3MiOlt7InVzZXJpZCI6IjE2MjEiLCJuYW1lIjoiR3JvdGVmZW5kIn1dfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9Vc2VyX01PWHkuanNvbiBiL3Rlc3RzL2UyZS1lbnRpdHkvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9qc29uL2VudGl0eS9Nb3h5SnNvblRlc3RQcm92aWRlcl9Vc2VyX01PWHkuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWI5MWI2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWVudGl0eS9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2pzb24vZW50aXR5L01veHlKc29uVGVzdFByb3ZpZGVyX1VzZXJfTU9YeS5qc29uCkBAIC0wLDAgKzEgQEAKK3sidXNlcmlkIjoiMTYyMSIsIm5hbWUiOiJHcm90ZWZlbmQifQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9wb20ueG1sIGIvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZjOTE1NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9wb20ueG1sCkBAIC0wLDAgKzEsMTAwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5lMmUtaW5qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+ZTJlLWluamVjdC1jZGkyLXNlPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWUyZS1pbmplY3QtY2RpLXNlPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPkplcnNleSBFMkUgSW5qZWN0IENESSBTRSB0ZXN0czwvZGVzY3JpcHRpb24+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPGNkaS5hcGkudmVyc2lvbj4yLjA8L2NkaS5hcGkudmVyc2lvbj4KKyAgICAgICAgPHdlbGQudmVyc2lvbj4ke3dlbGQzLnZlcnNpb259PC93ZWxkLnZlcnNpb24+CisgICAgPC9wcm9wZXJ0aWVzPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY2RpMi1zZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktc2VydmVyPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXV0aWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuaGFtY3Jlc3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5oYW1jcmVzdC1saWJyYXJ5PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD54ZGs8L2lkPgorICAgICAgICAgICAgPHByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgPCEtLSBkbyBub3QgdXNlIHNlY3VyaXR5IG1hbmFnZXIgZm9yIHhkayAtLT4KKyAgICAgICAgICAgICAgICA8c3VyZWZpcmUuc2VjdXJpdHkuYXJnbGluZSAvPgorICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnNvbmFyPC9pZD4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZGlzYWJsZSBKYUNvQ28gbGlzdGVuZXIgYmVjYXVzZSBpdCdzIG5vdCB3b3JraW5nIHdpdGggPGZvcmtNb2RlPmFsd2F5czwvZm9yaz4gKDxyZXVzZUZvcmtzPmZhbHNlPC9yZXVzZUZvcmtzPiByZXNwZWN0aXZlbHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBzOi8vamlyYS5zb25hcnNvdXJjZS5jb20vYnJvd3NlL1NPTkFSSkFWQS03MjggKGh0dHBzOi8vZ2l0aHViLmNvbS9Tb25hclNvdXJjZS9zb25hci1qYXZhL3B1bGwvMzI0KSAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnRpZXMgY29tYmluZS5zZWxmPSJvdmVycmlkZSIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICA8L3Byb2ZpbGVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2UvQWNjb3VudC5qYXZhIGIvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2UvQWNjb3VudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NTE0NDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9BY2NvdW50LmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuaW5qZWN0LmNkaS5zZTsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5BcHBsaWNhdGlvblNjb3BlZDsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmV2ZW50Lk9ic2VydmVzOworCisvKioKKyAqIEtlZXBzIGN1cnJlbnQgc3RhdGUgb2YgbW9uZXkuCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK0BBcHBsaWNhdGlvblNjb3BlZAorcHVibGljIGNsYXNzIEFjY291bnQgeworCisgICAgcHJpdmF0ZSBsb25nIGN1cnJlbnQgPSAwOworCisgICAgcHVibGljIHZvaWQgb2JzZXJ2ZUNyZWRpdChAT2JzZXJ2ZXMgQENyZWRpdCBMb25nIGFtb3VudCkgeworICAgICAgICBjdXJyZW50ICs9IGFtb3VudDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBvYnNlcnZlRGViaXQoQE9ic2VydmVzIEBEZWJpdCBMb25nIGFtb3VudCkgeworICAgICAgICBjdXJyZW50IC09IGFtb3VudDsKKyAgICB9CisKKyAgICBwdWJsaWMgbG9uZyBnZXRDdXJyZW50KCkgeworICAgICAgICByZXR1cm4gY3VycmVudDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9BY2NvdW50UmVzb3VyY2UuamF2YSBiL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9pbmplY3QvY2RpL3NlL0FjY291bnRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNzNmYWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9BY2NvdW50UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5pbmplY3QuY2RpLnNlOworCitpbXBvcnQgamF2YXgud3MucnMuREVMRVRFOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuZXZlbnQuRXZlbnQ7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKKworLyoqCisgKiBUZXN0aW5nIHJlc291cmNlIGZvciBDREkgZXZlbnRzLgorICoKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitAUGF0aCgiYWNjb3VudCIpCitwdWJsaWMgY2xhc3MgQWNjb3VudFJlc291cmNlIHsKKworICAgIEBJbmplY3QKKyAgICBAQ3JlZGl0CisgICAgcHJpdmF0ZSBFdmVudDxMb25nPiBjcmVkaXRFdmVudDsKKworICAgIEBJbmplY3QKKyAgICBARGViaXQKKyAgICBwcml2YXRlIEV2ZW50PExvbmc+IGRlYml0RXZlbnQ7CisKKyAgICBASW5qZWN0CisgICAgcHJpdmF0ZSBBY2NvdW50IGFjY291bnQ7CisKKyAgICBAUE9TVAorICAgIHB1YmxpYyB2b2lkIGNyZWRpdChAUXVlcnlQYXJhbSgiYW1vdW50IikgbG9uZyBhbW91bnQpIHsKKyAgICAgICAgY3JlZGl0RXZlbnQuZmlyZShhbW91bnQpOworICAgIH0KKworICAgIEBERUxFVEUKKyAgICBwdWJsaWMgdm9pZCBkZWJpdChAUXVlcnlQYXJhbSgiYW1vdW50IikgbG9uZyBhbW91bnQpIHsKKyAgICAgICAgZGViaXRFdmVudC5maXJlKGFtb3VudCk7CisgICAgfQorCisgICAgQEdFVAorICAgIHB1YmxpYyBsb25nIGN1cnJlbnQoKSB7CisgICAgICAgIHJldHVybiBhY2NvdW50LmdldEN1cnJlbnQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9DcmVkaXQuamF2YSBiL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9pbmplY3QvY2RpL3NlL0NyZWRpdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlNjkzZGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9DcmVkaXQuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5pbmplY3QuY2RpLnNlOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworaW1wb3J0IGphdmF4LmluamVjdC5RdWFsaWZpZXI7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuRklFTEQ7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLk1FVEhPRDsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuUEFSQU1FVEVSOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKKworLyoqCisgKiBFdmVudCBxdWFsaWZpZXIuCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK0BRdWFsaWZpZXIKK0BUYXJnZXQoe01FVEhPRCwgRklFTEQsIFBBUkFNRVRFUiwgVFlQRX0pCitAUmV0ZW50aW9uKFJVTlRJTUUpCitwdWJsaWMgQGludGVyZmFjZSBDcmVkaXQgeworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2UvRGViaXQuamF2YSBiL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9pbmplY3QvY2RpL3NlL0RlYml0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWRlZjFmYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9pbmplY3QvY2RpL3NlL0RlYml0LmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuaW5qZWN0LmNkaS5zZTsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuUXVhbGlmaWVyOworCitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLkZJRUxEOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5NRVRIT0Q7CitpbXBvcnQgc3RhdGljIGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlLlBBUkFNRVRFUjsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuVFlQRTsKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5LlJVTlRJTUU7CisKKy8qKgorICogRXZlbnQgcXVhbGlmaWVyLgorICoKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitAUXVhbGlmaWVyCitAVGFyZ2V0KHtNRVRIT0QsIEZJRUxELCBQQVJBTUVURVIsIFRZUEV9KQorQFJldGVudGlvbihSVU5USU1FKQorcHVibGljIEBpbnRlcmZhY2UgRGViaXQgeworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2UvSGVsbG8uamF2YSBiL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9pbmplY3QvY2RpL3NlL0hlbGxvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE3NmExMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9pbmplY3QvY2RpL3NlL0hlbGxvLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuaW5qZWN0LmNkaS5zZTsKKworLyoqCisgKiBJbnRlcmZhY2UgdXNlZCB0byBhY3RpdmF0ZSBkZWNvcmF0b3IuCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgSGVsbG8geworCisgICAgU3RyaW5nIGhlbGxvKCk7CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9pbmplY3QvY2RpL3NlL0hlbGxvUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9pbmplY3QvY2RpL3NlL0hlbGxvUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzgwNDk0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2UvSGVsbG9SZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmluamVjdC5jZGkuc2U7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CisKKy8qKgorICogSW50ZXJjZXB0ZWQgYW5kIGRlY29yYXRlZCByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworQFNlY3VyZWQKK0BQYXRoKCJpbnRlcmNlcHRlZCIpCitwdWJsaWMgY2xhc3MgSGVsbG9SZXNvdXJjZSBpbXBsZW1lbnRzIEhlbGxvIHsKKworICAgIEBJbmplY3QKKyAgICBwcml2YXRlIE5hbWVTZXJ2aWNlIHNlcnZpY2U7CisKKyAgICBAR0VUCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBoZWxsbygpIHsKKyAgICAgICAgcmV0dXJuICJIZWxsbyAiICsgc2VydmljZS5nZXROYW1lKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2UvSGVsbG9TdGFyRGVjb3JhdG9yLmphdmEgYi90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9IZWxsb1N0YXJEZWNvcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmE5ZWJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2UvSGVsbG9TdGFyRGVjb3JhdG9yLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuaW5qZWN0LmNkaS5zZTsKKworaW1wb3J0IGphdmF4LmRlY29yYXRvci5EZWNvcmF0b3I7CitpbXBvcnQgamF2YXguZGVjb3JhdG9yLkRlbGVnYXRlOworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LkFueTsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworCisvKioKKyAqIERlY29yYXRvciB3cmFwcyB0aGUgaGVsbG8gcmVzb3VyY2UgYnkgc3RhcnMuCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK0BEZWNvcmF0b3IKK3B1YmxpYyBjbGFzcyBIZWxsb1N0YXJEZWNvcmF0b3IgaW1wbGVtZW50cyBIZWxsbyB7CisKKyAgICBASW5qZWN0CisgICAgQERlbGVnYXRlCisgICAgQEFueQorICAgIEhlbGxvIGFjY291bnQ7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGhlbGxvKCkgeworICAgICAgICByZXR1cm4gIioqKiIgKyBhY2NvdW50LmhlbGxvKCkgKyAiKioqIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9KYXhyc1NlcnZpY2UuamF2YSBiL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9pbmplY3QvY2RpL3NlL0pheHJzU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNzA4YmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9KYXhyc1NlcnZpY2UuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5pbmplY3QuY2RpLnNlOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5BcHBsaWNhdGlvblNjb3BlZDsKKworLyoqCisgKiBIb2xkZXIgZm9yIEpBWC1SUyBpbmZvcm1hdGlvbiB0byBpbmplY3QgdGhlbSBpbnRvIGludGVyY2VwdG9yLiBKQVgtUlMgZG9lcyBub3Qgd29yayBpbiBpbnRlcmNlcHRvci4KKyAqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworQEFwcGxpY2F0aW9uU2NvcGVkCitwdWJsaWMgY2xhc3MgSmF4cnNTZXJ2aWNlIHsKKworICAgIEBDb250ZXh0CisgICAgcHJpdmF0ZSBVcmlJbmZvIHVyaUluZm87CisKKyAgICBwdWJsaWMgVXJpSW5mbyBnZXRVcmlJbmZvKCkgeworICAgICAgICByZXR1cm4gdXJpSW5mbzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9OYW1lU2VydmljZS5qYXZhIGIvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2UvTmFtZVNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWE0NTU1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2UvTmFtZVNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5pbmplY3QuY2RpLnNlOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LkFwcGxpY2F0aW9uU2NvcGVkOworCisvKioKKyAqIFNlcnZpY2UgcmV0dXJuaW5nIHRoZSBuYW1lLgorICoKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitAQXBwbGljYXRpb25TY29wZWQKK3B1YmxpYyBjbGFzcyBOYW1lU2VydmljZSB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBOQU1FID0gIkphbWVzIjsKKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICByZXR1cm4gTkFNRTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9TZWN1cmVkLmphdmEgYi90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9TZWN1cmVkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYyY2EwZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9pbmplY3QvY2RpL3NlL1NlY3VyZWQuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5pbmplY3QuY2RpLnNlOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uSW5oZXJpdGVkOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKK2ltcG9ydCBqYXZheC5pbnRlcmNlcHRvci5JbnRlcmNlcHRvckJpbmRpbmc7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGUuTUVUSE9EOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZS5UWVBFOworaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3kuUlVOVElNRTsKKworLyoqCisgKiBTZWN1cml0eSBhbm5vdGF0aW9uIGJvdW5kIHRvIHtAbGluayBTZWN1cml0eUludGVyY2VwdG9yfS4KKyAqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworQEluaGVyaXRlZAorQEludGVyY2VwdG9yQmluZGluZworQFJldGVudGlvbihSVU5USU1FKQorQFRhcmdldCh7IE1FVEhPRCwgVFlQRSB9KQorcHVibGljIEBpbnRlcmZhY2UgU2VjdXJlZCB7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9TZWN1cml0eUludGVyY2VwdG9yLmphdmEgYi90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9TZWN1cml0eUludGVyY2VwdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJlYWU5NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9pbmplY3QvY2RpL3NlL1NlY3VyaXR5SW50ZXJjZXB0b3IuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5pbmplY3QuY2RpLnNlOworCitpbXBvcnQgamF2YXgud3MucnMuRm9yYmlkZGVuRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LmludGVyY2VwdG9yLkFyb3VuZEludm9rZTsKK2ltcG9ydCBqYXZheC5pbnRlcmNlcHRvci5JbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC5pbnRlcmNlcHRvci5JbnZvY2F0aW9uQ29udGV4dDsKKworLyoqCisgKiBJbnRlcmNlcHRvciBjaGVja2luZyBKYW1lcyBhcyBhIHVzZXIgaW4gcXVlcnkgcGFyYW1zLgorICoKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitAU2VjdXJlZAorQEludGVyY2VwdG9yCitwdWJsaWMgY2xhc3MgU2VjdXJpdHlJbnRlcmNlcHRvciB7CisKKyAgICBASW5qZWN0CisgICAgTmFtZVNlcnZpY2UgbmFtZVNlcnZpY2U7CisKKyAgICBASW5qZWN0CisgICAgSmF4cnNTZXJ2aWNlIGpheHJzU2VydmljZTsKKworICAgIEBBcm91bmRJbnZva2UKKyAgICBwdWJsaWMgT2JqZWN0IGxvZ01ldGhvZEVudHJ5KEludm9jYXRpb25Db250ZXh0IGN0eCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBwYXJhbXMgPSBqYXhyc1NlcnZpY2UuZ2V0VXJpSW5mbygpLmdldFF1ZXJ5UGFyYW1ldGVycygpOworICAgICAgICBTdHJpbmcgdXNlciA9IHBhcmFtcy5nZXRGaXJzdCgidXNlciIpOworCisgICAgICAgIGlmIChuYW1lU2VydmljZS5nZXROYW1lKCkuZXF1YWxzKHVzZXIpKSB7CisgICAgICAgICAgICByZXR1cm4gY3R4LnByb2NlZWQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBGb3JiaWRkZW5FeGNlcHRpb24oIkZvcmJpZGRlbiByZXNvdXJjZSBmb3IgdGhlIHVzZXI6ICIgKyB1c2VyKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9pbmplY3QvY2RpL3NlL3Njb3Blcy9BcHBsaWNhdGlvbkNvdW50ZXJCZWFuLmphdmEgYi90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9zY29wZXMvQXBwbGljYXRpb25Db3VudGVyQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MzA5NzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9zY29wZXMvQXBwbGljYXRpb25Db3VudGVyQmVhbi5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmluamVjdC5jZGkuc2Uuc2NvcGVzOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuQXBwbGljYXRpb25TY29wZWQ7CisKKy8qKgorICogUmVxdWVzdCBjb3VudGVyLgorICoKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitAQXBwbGljYXRpb25TY29wZWQKK3B1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbkNvdW50ZXJCZWFuIHsKKworICAgIHByaXZhdGUgQXRvbWljSW50ZWdlciBjb3VudGVyID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKworICAgIHB1YmxpYyBpbnQgZ2V0TnVtYmVyKCkgeworICAgICAgICByZXR1cm4gY291bnRlci5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9zY29wZXMvUmVxdWVzdFNjb3BlZFJlc291cmNlLmphdmEgYi90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9zY29wZXMvUmVxdWVzdFNjb3BlZFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ3NzY5MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9pbmplY3QvY2RpL3NlL3Njb3Blcy9SZXF1ZXN0U2NvcGVkUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5pbmplY3QuY2RpLnNlLnNjb3BlczsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWwuUmVxdWVzdFNjb3BlZDsKKworLyoqCisgKiBSZXF1ZXN0IHNjb3BlZCByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworQFJlcXVlc3RTY29wZWQKK0BQYXRoKCJyZXF1ZXN0IikKK3B1YmxpYyBjbGFzcyBSZXF1ZXN0U2NvcGVkUmVzb3VyY2UgeworCisgICAgQEluamVjdAorICAgIHByaXZhdGUgQXBwbGljYXRpb25Db3VudGVyQmVhbiBhcHBsaWNhdGlvbjsKKworICAgIEBQYXRoUGFyYW0oIm5hbWUiKQorICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgICBwcml2YXRlIFVyaUluZm8gdXJpSW5mbzsKKworICAgIHB1YmxpYyBSZXF1ZXN0U2NvcGVkUmVzb3VyY2UoQENvbnRleHQgVXJpSW5mbyB1cmlJbmZvKSB7CisgICAgICAgIHRoaXMudXJpSW5mbyA9IHVyaUluZm87CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJ7bmFtZX0iKQorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIFN0cmluZyBnZXRIZWxsbygpIHsKKyAgICAgICAgcmV0dXJuICJIZWxsb18iICsgbmFtZSArICIgWyIgKyBhcHBsaWNhdGlvbi5nZXROdW1iZXIoKSArICJdICIgKyAiWyIgKyB1cmlJbmZvLmdldFBhdGgoKSArICJdICIgKyB0aGlzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9pbmplY3QvY2RpL3NlL3Njb3Blcy9TaW5nbGV0b25TY29wZWRSZXNvdXJjZS5qYXZhIGIvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2Uvc2NvcGVzL1NpbmdsZXRvblNjb3BlZFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU1MWExZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9pbmplY3QvY2RpL3NlL3Njb3Blcy9TaW5nbGV0b25TY29wZWRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmluamVjdC5jZGkuc2Uuc2NvcGVzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKKy8qKgorICogU2luZ2xldG9uIFJlc291cmNlLgorICoKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitAU2luZ2xldG9uCitAUGF0aCgic2luZ2xldG9uIikKK3B1YmxpYyBjbGFzcyBTaW5nbGV0b25TY29wZWRSZXNvdXJjZSB7CisKKyAgICBASW5qZWN0CisgICAgcHJpdmF0ZSBBcHBsaWNhdGlvbkNvdW50ZXJCZWFuIGFwcGxpY2F0aW9uOworCisgICAgQENvbnRleHQKKyAgICBwcml2YXRlIFVyaUluZm8gdXJpSW5mbzsKKworICAgIEBHRVQKKyAgICBAUGF0aCgie25hbWV9IikKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0SGVsbG8oQFBhdGhQYXJhbSgibmFtZSIpIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiAiSGVsbG9fIiArIG5hbWUgKyAiIFsiICsgYXBwbGljYXRpb24uZ2V0TnVtYmVyKCkgKyAiXSAiICsgIlsiICsgdXJpSW5mby5nZXRQYXRoKCkgKyAiXSAiICsgdGhpczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9zdWJyZXNvdXJjZXMvTW9kZWxQcm9jZXNzb3JGZWF0dXJlLmphdmEgYi90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9zdWJyZXNvdXJjZXMvTW9kZWxQcm9jZXNzb3JGZWF0dXJlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ3ODBhZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9pbmplY3QvY2RpL3NlL3N1YnJlc291cmNlcy9Nb2RlbFByb2Nlc3NvckZlYXR1cmUuamF2YQpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuaW5qZWN0LmNkaS5zZS5zdWJyZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmVDb250ZXh0OworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qcmlvcml0eTsKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5JbmZsZWN0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLk1vZGVsUHJvY2Vzc29yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2VNb2RlbDsKKworcHVibGljIGNsYXNzIE1vZGVsUHJvY2Vzc29yRmVhdHVyZSBpbXBsZW1lbnRzIEZlYXR1cmUgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlKEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgY29udGV4dC5yZWdpc3RlcihTaW1wbGVNb2RlbFByb2Nlc3Nvci5jbGFzcyk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIEBQcmlvcml0eSg1MDAwKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2ltcGxlTW9kZWxQcm9jZXNzb3IgaW1wbGVtZW50cyBNb2RlbFByb2Nlc3NvciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNvdXJjZU1vZGVsIHByb2Nlc3NSZXNvdXJjZU1vZGVsKFJlc291cmNlTW9kZWwgcmVzb3VyY2VNb2RlbCwgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7CisgICAgICAgICAgICBSZXNvdXJjZU1vZGVsLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBSZXNvdXJjZU1vZGVsLkJ1aWxkZXIocmVzb3VyY2VNb2RlbC5nZXRSb290UmVzb3VyY2VzKCksIGZhbHNlKTsKKyAgICAgICAgICAgIGZpbmFsIFJlc291cmNlIHNpbmdsZXRvblJlc291cmNlID0gUmVzb3VyY2UuZnJvbShTaW5nbGV0b25SZXNvdXJjZS5jbGFzcyk7CisgICAgICAgICAgICBidWlsZGVyLmFkZFJlc291cmNlKHNpbmdsZXRvblJlc291cmNlKTsKKworICAgICAgICAgICAgZmluYWwgUmVzb3VyY2UgcmVxdWVzdFNjb3BlUmVzb3VyY2UgPSBSZXNvdXJjZS5mcm9tKFJlcXVlc3RTY29wZVJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgICAgIGJ1aWxkZXIuYWRkUmVzb3VyY2UocmVxdWVzdFNjb3BlUmVzb3VyY2UpOworCisgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZS5CdWlsZGVyIHJlc291cmNlQnVpbGRlciA9IFJlc291cmNlLmJ1aWxkZXIoImluc3RhbmNlIik7CisgICAgICAgICAgICByZXNvdXJjZUJ1aWxkZXIuYWRkTWV0aG9kKCJHRVQiKS5oYW5kbGVkQnkobmV3IEluZmxlY3RvcjxDb250YWluZXJSZXF1ZXN0Q29udGV4dCwgU3RyaW5nPigpIHsKKyAgICAgICAgICAgICAgICBwcml2YXRlIGludCBjb3VudGVyID0gMDsKKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgYXBwbHkoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgY29udGFpbmVyUmVxdWVzdENvbnRleHQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKCJJbmZsZWN0b3I6IiArIGNvdW50ZXIrKyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZSBpbnN0YW5jZVJlc291cmNlID0gcmVzb3VyY2VCdWlsZGVyLmJ1aWxkKCk7CisKKyAgICAgICAgICAgIGJ1aWxkZXIuYWRkUmVzb3VyY2UoaW5zdGFuY2VSZXNvdXJjZSk7CisKKyAgICAgICAgICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc291cmNlTW9kZWwgcHJvY2Vzc1N1YlJlc291cmNlKFJlc291cmNlTW9kZWwgc3ViUmVzb3VyY2UsIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbikgeworICAgICAgICAgICAgZmluYWwgUmVzb3VyY2UgcmVzb3VyY2UgPSBSZXNvdXJjZS5idWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgLm1lcmdlV2l0aChSZXNvdXJjZS5mcm9tKEVuaGFuY2VkU3ViUmVzb3VyY2VTaW5nbGV0b24uY2xhc3MpKQorICAgICAgICAgICAgICAgICAgICAubWVyZ2VXaXRoKFJlc291cmNlLmZyb20oRW5oYW5jZWRTdWJSZXNvdXJjZS5jbGFzcykpCisgICAgICAgICAgICAgICAgICAgIC5tZXJnZVdpdGgoc3ViUmVzb3VyY2UuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApKS5idWlsZCgpOworCisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlTW9kZWwuQnVpbGRlcih0cnVlKS5hZGRSZXNvdXJjZShyZXNvdXJjZSkuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBTaW5nbGV0b24KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEVuaGFuY2VkU3ViUmVzb3VyY2VTaW5nbGV0b24geworICAgICAgICBwcml2YXRlIGludCBjb3VudGVyID0gMDsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJlbmhhbmNlZC1zaW5nbGV0b24iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiRW5oYW5jZWRTdWJSZXNvdXJjZVNpbmdsZXRvbjoiICsgU3RyaW5nLnZhbHVlT2YoY291bnRlcisrKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRW5oYW5jZWRTdWJSZXNvdXJjZSB7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgY291bnRlciA9IDA7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiZW5oYW5jZWQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZigiRW5oYW5jZWRTdWJSZXNvdXJjZToiICsgY291bnRlcisrKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJyZXF1ZXN0LXNjb3BlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlcXVlc3RTY29wZVJlc291cmNlIHsKKyAgICAgICAgcHJpdmF0ZSBpbnQgY291bnRlciA9IDA7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZigiUmVxdWVzdFNjb3BlUmVzb3VyY2U6IiArIGNvdW50ZXIrKyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgic2luZ2xldG9uIikKKyAgICBAU2luZ2xldG9uCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTaW5nbGV0b25SZXNvdXJjZSB7CisgICAgICAgIHByaXZhdGUgaW50IGNvdW50ZXIgPSAwOworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gU3RyaW5nLnZhbHVlT2YoIlNpbmdsZXRvblJlc291cmNlOiIgKyBjb3VudGVyKyspOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2Uvc3VicmVzb3VyY2VzL1Jvb3RSZXNvdXJjZS5qYXZhIGIvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2Uvc3VicmVzb3VyY2VzL1Jvb3RSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlYTExZGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9zdWJyZXNvdXJjZXMvUm9vdFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuaW5qZWN0LmNkaS5zZS5zdWJyZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworQFBhdGgoInJvb3QiKQorcHVibGljIGNsYXNzIFJvb3RSZXNvdXJjZSB7CisKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgIHJldHVybiAicm9vdCI7CisgICAgfQorCisgICAgQFBhdGgoInN1Yi1yZXNvdXJjZS1zaW5nbGV0b24iKQorICAgIHB1YmxpYyBDbGFzczxTdWJSZXNvdXJjZVNpbmdsZXRvbj4gZ2V0U3ViUmVzb3VyY2VTaW5nbGV0b24oKSB7CisgICAgICAgIHJldHVybiBTdWJSZXNvdXJjZVNpbmdsZXRvbi5jbGFzczsKKyAgICB9CisKKyAgICBAUGF0aCgic3ViLXJlc291cmNlLWluc3RhbmNlIikKKyAgICBwdWJsaWMgU3ViUmVzb3VyY2VTaW5nbGV0b24gZ2V0U3ViUmVzb3VyY2VTaW5nbGV0b25JbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdWJSZXNvdXJjZVNpbmdsZXRvbigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9pbmplY3QvY2RpL3NlL3N1YnJlc291cmNlcy9Sb290U2luZ2xldG9uUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9pbmplY3QvY2RpL3NlL3N1YnJlc291cmNlcy9Sb290U2luZ2xldG9uUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTE3OGQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2Uvc3VicmVzb3VyY2VzL1Jvb3RTaW5nbGV0b25SZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmluamVjdC5jZGkuc2Uuc3VicmVzb3VyY2VzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitAUGF0aCgicm9vdC1zaW5nbGV0b24iKQorQFNpbmdsZXRvbgorcHVibGljIGNsYXNzIFJvb3RTaW5nbGV0b25SZXNvdXJjZSB7CisKKyAgICBwcml2YXRlIGludCBjb3VudGVyID0gMDsKKworICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgcmV0dXJuICJSb290U2luZ2xldG9uUmVzb3VyY2U6IiArIFN0cmluZy52YWx1ZU9mKGNvdW50ZXIrKyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2Uvc3VicmVzb3VyY2VzL1N1YlJlc291cmNlU2luZ2xldG9uLmphdmEgYi90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9zdWJyZXNvdXJjZXMvU3ViUmVzb3VyY2VTaW5nbGV0b24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWRiZDNiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2Uvc3VicmVzb3VyY2VzL1N1YlJlc291cmNlU2luZ2xldG9uLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuaW5qZWN0LmNkaS5zZS5zdWJyZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitAU2luZ2xldG9uCitwdWJsaWMgY2xhc3MgU3ViUmVzb3VyY2VTaW5nbGV0b24geworCisgICAgcHJpdmF0ZSBpbnQgY291bnRlciA9IDA7CisKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZigiU3ViUmVzb3VyY2VTaW5nbGV0b246IiArIGNvdW50ZXIrKyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9iZWFucy54bWwgYi90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2JlYW5zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTg0MjI0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9iZWFucy54bWwKQEAgLTAsMCArMSwyNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8YmVhbnM+CisgICAgPGludGVyY2VwdG9ycz4KKyAgICAgICAgPGNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5pbmplY3QuY2RpLnNlLlNlY3VyaXR5SW50ZXJjZXB0b3I8L2NsYXNzPgorICAgIDwvaW50ZXJjZXB0b3JzPgorICAgIDxkZWNvcmF0b3JzPgorICAgICAgICA8Y2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmluamVjdC5jZGkuc2UuSGVsbG9TdGFyRGVjb3JhdG9yPC9jbGFzcz4KKyAgICA8L2RlY29yYXRvcnM+Cis8L2JlYW5zPgpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2UvRXZlbnRzVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2UvRXZlbnRzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NDI3NTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9FdmVudHNUZXN0LmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuaW5qZWN0LmNkaS5zZTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0cyB0aGF0IHRoZSByZXNvdXJjZSBjYW4gZmlyZSBhbiBldmVudC4KKyAqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworcHVibGljIGNsYXNzIEV2ZW50c1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0eworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhBY2NvdW50UmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZpcmVkRXZlbnRzKCkgeworICAgICAgICBSZXNwb25zZSBjcmVkaXQgPSB0YXJnZXQoImFjY291bnQiKS5xdWVyeVBhcmFtKCJhbW91bnQiLCA1MCkucmVxdWVzdCgpLnBvc3QoRW50aXR5Lmpzb24oIiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwNCwgY3JlZGl0LmdldFN0YXR1cygpKTsKKworICAgICAgICBSZXNwb25zZSBkZWJpdCA9IHRhcmdldCgiYWNjb3VudCIpLnF1ZXJ5UGFyYW0oImFtb3VudCIsIDI1KS5yZXF1ZXN0KCkuZGVsZXRlKCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDQsIGRlYml0LmdldFN0YXR1cygpKTsKKworICAgICAgICBMb25nIGN1cnJlbnQgPSB0YXJnZXQoImFjY291bnQiKS5xdWVyeVBhcmFtKCJhbW91bnQiLCAyNSkucmVxdWVzdCgpLmdldChMb25nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDI1LCBjdXJyZW50LmxvbmdWYWx1ZSgpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9pbmplY3QvY2RpL3NlL0ludGVyY2VwdG9yRGVjb3JhdG9yVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2UvSW50ZXJjZXB0b3JEZWNvcmF0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNmNzBhMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9pbmplY3QvY2RpL3NlL0ludGVyY2VwdG9yRGVjb3JhdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmluamVjdC5jZGkuc2U7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3RzIHRoYXQgdGhlIHJlc291cmNlIGNhbiBiZSBpbnRlcmNlcHRlZCBhbmQgZGVjb3JhdGVkLgorICoKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitwdWJsaWMgY2xhc3MgSW50ZXJjZXB0b3JEZWNvcmF0b3JUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEhlbGxvUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEludGVyY2VwdGVkR2V0KCkgeworICAgICAgICBTdHJpbmcgaW50ZXJjZXB0ZWQgPSB0YXJnZXQoImludGVyY2VwdGVkIikucXVlcnlQYXJhbSgidXNlciIsIE5hbWVTZXJ2aWNlLk5BTUUpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqKipIZWxsbyBKYW1lcyoqKiIsIGludGVyY2VwdGVkKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JiaWRkZW5HZXQoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3VsdCA9IHRhcmdldCgiaW50ZXJjZXB0ZWQiKS5xdWVyeVBhcmFtKCJ1c2VyIiwgInVua25vd24iKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDMsIHJlc3VsdC5nZXRTdGF0dXMoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2UvUmVxdWVzdENvbnRleHRCdWlsZGVyLmphdmEgYi90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9SZXF1ZXN0Q29udGV4dEJ1aWxkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjA2YTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2UvUmVxdWVzdENvbnRleHRCdWlsZGVyLmphdmEKQEAgLTAsMCArMSwyMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmluamVjdC5jZGkuc2U7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db29raWU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY1R5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkSGFzaE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuU2VjdXJpdHlDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SdW50aW1lRGVsZWdhdGU7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuTWFwUHJvcGVydGllc0RlbGVnYXRlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLlByb3BlcnRpZXNEZWxlZ2F0ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLk1lc3NhZ2VCb2R5V29ya2VyczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkhlYWRlclV0aWxzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXF1ZXN0OworCisvKioKKyAqIFVzZWQgYnkgdGVzdHMgdG8gY3JlYXRlIG1vY2sgSmVyc2V5Q29udGFpbmVyUmVxdWVzdENvbnRleHQgaW5zdGFuY2VzLgorICoKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitwdWJsaWMgY2xhc3MgUmVxdWVzdENvbnRleHRCdWlsZGVyIHsKKworICAgIHB1YmxpYyBjbGFzcyBUZXN0Q29udGFpbmVyUmVxdWVzdCBleHRlbmRzIENvbnRhaW5lclJlcXVlc3QgeworCisgICAgICAgIHByaXZhdGUgT2JqZWN0IGVudGl0eTsKKyAgICAgICAgcHJpdmF0ZSBHZW5lcmljVHlwZSBlbnRpdHlUeXBlOworICAgICAgICBwcml2YXRlIGZpbmFsIFByb3BlcnRpZXNEZWxlZ2F0ZSBwcm9wZXJ0aWVzRGVsZWdhdGU7CisKKyAgICAgICAgcHVibGljIFRlc3RDb250YWluZXJSZXF1ZXN0KGZpbmFsIFVSSSBiYXNlVXJpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVVJJIHJlcXVlc3RVcmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWV0aG9kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU2VjdXJpdHlDb250ZXh0IHNlY3VyaXR5Q29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFByb3BlcnRpZXNEZWxlZ2F0ZSBwcm9wZXJ0aWVzRGVsZWdhdGUpIHsKKyAgICAgICAgICAgIHN1cGVyKGJhc2VVcmksIHJlcXVlc3RVcmksIG1ldGhvZCwgc2VjdXJpdHlDb250ZXh0LCBwcm9wZXJ0aWVzRGVsZWdhdGUpOworICAgICAgICAgICAgdGhpcy5wcm9wZXJ0aWVzRGVsZWdhdGUgPSBwcm9wZXJ0aWVzRGVsZWdhdGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRFbnRpdHkoZmluYWwgT2JqZWN0IGVudGl0eSkgeworICAgICAgICAgICAgaWYgKGVudGl0eSBpbnN0YW5jZW9mIEdlbmVyaWNFbnRpdHkpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmVudGl0eSA9ICgoR2VuZXJpY0VudGl0eSkgZW50aXR5KS5nZXRFbnRpdHkoKTsKKyAgICAgICAgICAgICAgICB0aGlzLmVudGl0eVR5cGUgPSBuZXcgR2VuZXJpY1R5cGUoKChHZW5lcmljRW50aXR5KSBlbnRpdHkpLmdldFR5cGUoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRoaXMuZW50aXR5ID0gZW50aXR5OworICAgICAgICAgICAgICAgIHRoaXMuZW50aXR5VHlwZSA9IG5ldyBHZW5lcmljVHlwZShlbnRpdHkuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgc2V0V29ya2VycyhmaW5hbCBNZXNzYWdlQm9keVdvcmtlcnMgd29ya2VycykgeworICAgICAgICAgICAgc3VwZXIuc2V0V29ya2Vycyh3b3JrZXJzKTsKKyAgICAgICAgICAgIGZpbmFsIGJ5dGVbXSBlbnRpdHlCeXRlczsKKyAgICAgICAgICAgIGlmIChlbnRpdHkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBteU1hcCA9IG5ldyBNdWx0aXZhbHVlZEhhc2hNYXA8U3RyaW5nLCBPYmplY3Q+KGdldEhlYWRlcnMoKSk7CisgICAgICAgICAgICAgICAgZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtID0gd29ya2Vycy53cml0ZVRvKGVudGl0eSwgZW50aXR5LmdldENsYXNzKCksIGVudGl0eVR5cGUuZ2V0VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBbm5vdGF0aW9uWzBdLCBnZXRNZWRpYVR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBteU1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzRGVsZWdhdGUsIGJhb3MsIENvbGxlY3Rpb25zLjxXcml0ZXJJbnRlcmNlcHRvcj5lbXB0eUxpc3QoKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gfCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKFRlc3RDb250YWluZXJSZXF1ZXN0LmNsYXNzLmdldE5hbWUoKSkubG9nKExldmVsLlNFVkVSRSwgbnVsbCwgZXgpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbnRpdHlCeXRlcyA9IGJhb3MudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZW50aXR5Qnl0ZXMgPSBuZXcgYnl0ZVswXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNldEVudGl0eVN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZW50aXR5Qnl0ZXMpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgZmluYWwgUnVudGltZURlbGVnYXRlIGRlbGVnYXRlID0gUnVudGltZURlbGVnYXRlLmdldEluc3RhbmNlKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBUZXN0Q29udGFpbmVyUmVxdWVzdCByZXF1ZXN0OworCisgICAgcHVibGljIHN0YXRpYyBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIgZnJvbShmaW5hbCBTdHJpbmcgcmVxdWVzdFVyaSwgZmluYWwgU3RyaW5nIG1ldGhvZCkgeworICAgICAgICByZXR1cm4gZnJvbShudWxsLCByZXF1ZXN0VXJpLCBtZXRob2QpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUmVxdWVzdENvbnRleHRCdWlsZGVyIGZyb20oZmluYWwgU3RyaW5nIGJhc2VVcmksIGZpbmFsIFN0cmluZyByZXF1ZXN0VXJpLCBmaW5hbCBTdHJpbmcgbWV0aG9kKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVxdWVzdENvbnRleHRCdWlsZGVyKGJhc2VVcmksIHJlcXVlc3RVcmksIG1ldGhvZCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIgZnJvbShmaW5hbCBVUkkgcmVxdWVzdFVyaSwgZmluYWwgU3RyaW5nIG1ldGhvZCkgeworICAgICAgICByZXR1cm4gZnJvbShudWxsLCByZXF1ZXN0VXJpLCBtZXRob2QpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUmVxdWVzdENvbnRleHRCdWlsZGVyIGZyb20oZmluYWwgVVJJIGJhc2VVcmksIGZpbmFsIFVSSSByZXF1ZXN0VXJpLCBmaW5hbCBTdHJpbmcgbWV0aG9kKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVxdWVzdENvbnRleHRCdWlsZGVyKGJhc2VVcmksIHJlcXVlc3RVcmksIG1ldGhvZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIoZmluYWwgU3RyaW5nIGJhc2VVcmksIGZpbmFsIFN0cmluZyByZXF1ZXN0VXJpLCBmaW5hbCBTdHJpbmcgbWV0aG9kKSB7CisgICAgICAgIHRoaXMoYmFzZVVyaSA9PSBudWxsIHx8IGJhc2VVcmkuaXNFbXB0eSgpID8gbnVsbCA6IFVSSS5jcmVhdGUoYmFzZVVyaSksIFVSSS5jcmVhdGUocmVxdWVzdFVyaSksIG1ldGhvZCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIoZmluYWwgVVJJIGJhc2VVcmksIGZpbmFsIFVSSSByZXF1ZXN0VXJpLCBmaW5hbCBTdHJpbmcgbWV0aG9kKSB7CisgICAgICAgIHJlcXVlc3QgPSBuZXcgVGVzdENvbnRhaW5lclJlcXVlc3QoYmFzZVVyaSwgcmVxdWVzdFVyaSwgbWV0aG9kLCBudWxsLAorICAgICAgICAgICAgICAgIG5ldyBNYXBQcm9wZXJ0aWVzRGVsZWdhdGUoKSk7CisgICAgfQorCisgICAgcHVibGljIENvbnRhaW5lclJlcXVlc3QgYnVpbGQoKSB7CisgICAgICAgIHJldHVybiByZXF1ZXN0OworICAgIH0KKworICAgIHB1YmxpYyBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIgYWNjZXB0KGZpbmFsIFN0cmluZy4uLiBhY2NlcHRIZWFkZXIpIHsKKyAgICAgICAgcHV0SGVhZGVycyhIdHRwSGVhZGVycy5BQ0NFUFQsIGFjY2VwdEhlYWRlcik7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIgYWNjZXB0KGZpbmFsIE1lZGlhVHlwZS4uLiBhY2NlcHRIZWFkZXIpIHsKKyAgICAgICAgcHV0SGVhZGVycyhIdHRwSGVhZGVycy5BQ0NFUFQsIChPYmplY3RbXSkgYWNjZXB0SGVhZGVyKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFJlcXVlc3RDb250ZXh0QnVpbGRlciBlbnRpdHkoZmluYWwgT2JqZWN0IGVudGl0eSkgeworICAgICAgICByZXF1ZXN0LnNldEVudGl0eShlbnRpdHkpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVxdWVzdENvbnRleHRCdWlsZGVyIHR5cGUoZmluYWwgU3RyaW5nIGNvbnRlbnRUeXBlKSB7CisgICAgICAgIHJlcXVlc3QuZ2V0SGVhZGVycygpLnB1dFNpbmdsZShIdHRwSGVhZGVycy5DT05URU5UX1RZUEUsIGNvbnRlbnRUeXBlKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisKKyAgICB9CisKKyAgICBwdWJsaWMgUmVxdWVzdENvbnRleHRCdWlsZGVyIHR5cGUoZmluYWwgTWVkaWFUeXBlIGNvbnRlbnRUeXBlKSB7CisgICAgICAgIHJlcXVlc3QuZ2V0SGVhZGVycygpLnB1dFNpbmdsZShIdHRwSGVhZGVycy5DT05URU5UX1RZUEUsIEhlYWRlclV0aWxzLmFzU3RyaW5nKGNvbnRlbnRUeXBlLCBkZWxlZ2F0ZSkpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgUmVxdWVzdENvbnRleHRCdWlsZGVyIGhlYWRlcihmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgT2JqZWN0IHZhbHVlKSB7CisgICAgICAgIHB1dEhlYWRlcihuYW1lLCB2YWx1ZSk7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIHB1YmxpYyBSZXF1ZXN0Q29udGV4dEJ1aWxkZXIgY29va2llKGZpbmFsIENvb2tpZSBjb29raWUpIHsKKyAgICAgICAgcHV0SGVhZGVyKEh0dHBIZWFkZXJzLkNPT0tJRSwgY29va2llKTsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIFJlcXVlc3RDb250ZXh0QnVpbGRlciBjb29raWVzKGZpbmFsIENvb2tpZS4uLiBjb29raWVzKSB7CisgICAgICAgIHB1dEhlYWRlcnMoSHR0cEhlYWRlcnMuQ09PS0lFLCAoT2JqZWN0W10pIGNvb2tpZXMpOworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHV0SGVhZGVyKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKKyAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlcXVlc3QuZ2V0SGVhZGVycygpLnJlbW92ZShuYW1lKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICByZXF1ZXN0LmhlYWRlcihuYW1lLCBIZWFkZXJVdGlscy5hc1N0cmluZyh2YWx1ZSwgZGVsZWdhdGUpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHV0SGVhZGVycyhmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgT2JqZWN0Li4uIHZhbHVlcykgeworICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlcXVlc3QuZ2V0SGVhZGVycygpLnJlbW92ZShuYW1lKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICByZXF1ZXN0LmdldEhlYWRlcnMoKS5hZGRBbGwobmFtZSwgSGVhZGVyVXRpbHMuYXNTdHJpbmdMaXN0KEFycmF5cy5hc0xpc3QodmFsdWVzKSwgZGVsZWdhdGUpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgcHV0SGVhZGVycyhmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nLi4uIHZhbHVlcykgeworICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlcXVlc3QuZ2V0SGVhZGVycygpLnJlbW92ZShuYW1lKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICByZXF1ZXN0LmdldEhlYWRlcnMoKS5hZGRBbGwobmFtZSwgdmFsdWVzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvaW5qZWN0L2NkaS9zZS9zY29wZXMvU2NvcGVzVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2Uvc2NvcGVzL1Njb3Blc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmJlMTc2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2Uvc2NvcGVzL1Njb3Blc1Rlc3QuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5pbmplY3QuY2RpLnNlLnNjb3BlczsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzOworCisvKioKKyAqIFRlc3RzIENESSByZXNvdXJjZXMuCisgKi8KK3B1YmxpYyBjbGFzcyBTY29wZXNUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlcXVlc3RTY29wZWRSZXNvdXJjZS5jbGFzcywgU2luZ2xldG9uU2NvcGVkUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENoZWNrUmVxdWVzdCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1tdIHJlc3BvbnNlMSA9IHRhcmdldCgpLnBhdGgoInJlcXVlc3QiKS5wYXRoKCJKYW1lcyIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKS5zcGxpdCgiICIpOworICAgICAgICBTdHJpbmdbXSByZXNwb25zZTIgPSB0YXJnZXQoKS5wYXRoKCJyZXF1ZXN0IikucGF0aCgiTWFyY3VzIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpLnNwbGl0KCIgIik7CisgICAgICAgIGFzc2VydFJlc3BvbnNlcygicmVxdWVzdCIsIHJlc3BvbnNlMSwgcmVzcG9uc2UyKTsKKyAgICAgICAgYXNzZXJ0Tm90RXF1YWxzKHJlc3BvbnNlMVszXSwgcmVzcG9uc2UyWzNdKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDaGVja1NpbmdsZXRvbigpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZ1tdIHJlc3BvbnNlMSA9IHRhcmdldCgpLnBhdGgoInNpbmdsZXRvbiIpLnBhdGgoIkphbWVzIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpLnNwbGl0KCIgIik7CisgICAgICAgIFN0cmluZ1tdIHJlc3BvbnNlMiA9IHRhcmdldCgpLnBhdGgoInNpbmdsZXRvbiIpLnBhdGgoIk1hcmN1cyIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKS5zcGxpdCgiICIpOworICAgICAgICBhc3NlcnRSZXNwb25zZXMoInNpbmdsZXRvbiIsIHJlc3BvbnNlMSwgcmVzcG9uc2UyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3BvbnNlMVszXSwgcmVzcG9uc2UyWzNdKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0UmVzcG9uc2VzKFN0cmluZyB0eXBlLCBTdHJpbmdbXSByZXNwb25zZTEsIFN0cmluZ1tdIHJlc3BvbnNlMikgeworICAgICAgICBhc3NlcnRFcXVhbHMoIkhlbGxvX0phbWVzIiwgcmVzcG9uc2UxWzBdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbMV0iLCByZXNwb25zZTFbMV0pOworICAgICAgICBhc3NlcnRFcXVhbHMoIlsiICsgdHlwZSArICIvSmFtZXNdIiwgcmVzcG9uc2UxWzJdKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIkhlbGxvX01hcmN1cyIsIHJlc3BvbnNlMlswXSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWzJdIiwgcmVzcG9uc2UyWzFdKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbIiArIHR5cGUgKyAiL01hcmN1c10iLCByZXNwb25zZTJbMl0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9pbmplY3QvY2RpL3NlL3N1YnJlc291cmNlcy9Nb2RlbFByb2Nlc3NvclNjb3BlVGVzdC5qYXZhIGIvdGVzdHMvZTJlLWluamVjdC9jZGkyLXNlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2luamVjdC9jZGkvc2Uvc3VicmVzb3VyY2VzL01vZGVsUHJvY2Vzc29yU2NvcGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQzMWE2NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9pbmplY3QvY2RpL3NlL3N1YnJlc291cmNlcy9Nb2RlbFByb2Nlc3NvclNjb3BlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5pbmplY3QuY2RpLnNlLnN1YnJlc291cmNlczsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuaW5qZWN0LmNkaS5zZS5SZXF1ZXN0Q29udGV4dEJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdCBzY29wZSBvZiByZXNvdXJjZXMgZW5oYW5jZWQgYnkgbW9kZWwgcHJvY2Vzc29ycy4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKgorICovCitwdWJsaWMgY2xhc3MgTW9kZWxQcm9jZXNzb3JTY29wZVRlc3QgeworCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0Q291bnRlcihBcHBsaWNhdGlvbkhhbmRsZXIgYXBwbGljYXRpb25IYW5kbGVyLCBTdHJpbmcgcmVxdWVzdFVyaSwgZmluYWwgU3RyaW5nIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZFNlY29uZEhpdCkgdGhyb3dzCisgICAgICAgICAgICBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgQ29udGFpbmVyUmVzcG9uc2UgcmVzcG9uc2UgPSBhcHBsaWNhdGlvbkhhbmRsZXIuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20ocmVxdWVzdFVyaSwKKyAgICAgICAgICAgICAgICAiR0VUIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHByZWZpeCArICI6MCIsIHJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICAgICAgcmVzcG9uc2UgPSBhcHBsaWNhdGlvbkhhbmRsZXIuYXBwbHkoUmVxdWVzdENvbnRleHRCdWlsZGVyLmZyb20ocmVxdWVzdFVyaSwKKyAgICAgICAgICAgICAgICAiR0VUIikuYnVpbGQoKSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhwcmVmaXggKyAiOiIgKyBleHBlY3RlZFNlY29uZEhpdCwgcmVzcG9uc2UuZ2V0RW50aXR5KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZXRvbigpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgQXBwbGljYXRpb25IYW5kbGVyIGFwcGxpY2F0aW9uSGFuZGxlciA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIobmV3IFJlc291cmNlQ29uZmlnKE1vZGVsUHJvY2Vzc29yRmVhdHVyZQorICAgICAgICAgICAgICAgIC5TaW5nbGV0b25SZXNvdXJjZS5jbGFzcykpOworICAgICAgICBmaW5hbCBTdHJpbmcgcmVxdWVzdFVyaSA9ICIvc2luZ2xldG9uIjsKKyAgICAgICAgX3Rlc3RDb3VudGVyKGFwcGxpY2F0aW9uSGFuZGxlciwgcmVxdWVzdFVyaSwgIlNpbmdsZXRvblJlc291cmNlIiwgIjEiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGV0b25Jbk1vZGVsUHJvY2Vzc29yKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwbGljYXRpb25IYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihuZXcgUmVzb3VyY2VDb25maWcoUm9vdFJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIE1vZGVsUHJvY2Vzc29yRmVhdHVyZS5jbGFzcykpOworICAgICAgICBmaW5hbCBTdHJpbmcgcmVxdWVzdFVyaSA9ICIvc2luZ2xldG9uIjsKKyAgICAgICAgX3Rlc3RDb3VudGVyKGFwcGxpY2F0aW9uSGFuZGxlciwgcmVxdWVzdFVyaSwgIlNpbmdsZXRvblJlc291cmNlIiwgIjEiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJSZXNvdXJjZVNpbmdsZXRvbkluT3JpZ2luYWxNb2RlbCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgQXBwbGljYXRpb25IYW5kbGVyIGFwcGxpY2F0aW9uSGFuZGxlciA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIobmV3IFJlc291cmNlQ29uZmlnKFJvb3RSZXNvdXJjZS5jbGFzcykpOworICAgICAgICBmaW5hbCBTdHJpbmcgcmVxdWVzdFVyaSA9ICIvcm9vdC9zdWItcmVzb3VyY2Utc2luZ2xldG9uIjsKKyAgICAgICAgX3Rlc3RDb3VudGVyKGFwcGxpY2F0aW9uSGFuZGxlciwgcmVxdWVzdFVyaSwgIlN1YlJlc291cmNlU2luZ2xldG9uIiwgIjEiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJSZXNvdXJjZUVuaGFuY2VkU2luZ2xldG9uKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwbGljYXRpb25IYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihuZXcgUmVzb3VyY2VDb25maWcoUm9vdFJlc291cmNlLmNsYXNzKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXF1ZXN0VXJpID0gIi9yb290L3N1Yi1yZXNvdXJjZS1zaW5nbGV0b24vZW5oYW5jZWQtc2luZ2xldG9uIjsKKyAgICAgICAgX3Rlc3RDb3VudGVyKGFwcGxpY2F0aW9uSGFuZGxlciwgcmVxdWVzdFVyaSwgIkVuaGFuY2VkU3ViUmVzb3VyY2VTaW5nbGV0b24iLCAiMSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN1YlJlc291cmNlSW5zdGFuY2VFbmhhbmNlZFNpbmdsZXRvbigpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgQXBwbGljYXRpb25IYW5kbGVyIGFwcGxpY2F0aW9uSGFuZGxlciA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIobmV3IFJlc291cmNlQ29uZmlnKFJvb3RSZXNvdXJjZS5jbGFzcykpOworICAgICAgICBmaW5hbCBTdHJpbmcgcmVxdWVzdFVyaSA9ICIvcm9vdC9zdWItcmVzb3VyY2UtaW5zdGFuY2UvZW5oYW5jZWQtc2luZ2xldG9uIjsKKyAgICAgICAgX3Rlc3RDb3VudGVyKGFwcGxpY2F0aW9uSGFuZGxlciwgcmVxdWVzdFVyaSwgIkVuaGFuY2VkU3ViUmVzb3VyY2VTaW5nbGV0b24iLCAiMSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN1YlJlc291cmNlSW5zdGFuY2VFbmhhbmNlZFN1YlJlc291cmNlKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwbGljYXRpb25IYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihuZXcgUmVzb3VyY2VDb25maWcoUm9vdFJlc291cmNlLmNsYXNzKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXF1ZXN0VXJpID0gIi9yb290L3N1Yi1yZXNvdXJjZS1pbnN0YW5jZS9lbmhhbmNlZCI7CisgICAgICAgIF90ZXN0Q291bnRlcihhcHBsaWNhdGlvbkhhbmRsZXIsIHJlcXVlc3RVcmksICJFbmhhbmNlZFN1YlJlc291cmNlIiwgIjAiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJSZXNvdXJjZUVuaGFuY2VkU3ViUmVzb3VyY2UoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbkhhbmRsZXIgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKG5ldyBSZXNvdXJjZUNvbmZpZyhSb290UmVzb3VyY2UuY2xhc3MpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlcXVlc3RVcmkgPSAiL3Jvb3Qvc3ViLXJlc291cmNlLXNpbmdsZXRvbi9lbmhhbmNlZCI7CisgICAgICAgIF90ZXN0Q291bnRlcihhcHBsaWNhdGlvbkhhbmRsZXIsIHJlcXVlc3RVcmksICJFbmhhbmNlZFN1YlJlc291cmNlIiwgIjAiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnN0YW5jZUluTW9kZWxQcm9jZXNzb3IoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbkhhbmRsZXIgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKG5ldyBSZXNvdXJjZUNvbmZpZyhSb290UmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgTW9kZWxQcm9jZXNzb3JGZWF0dXJlLmNsYXNzKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXF1ZXN0VXJpID0gIi9pbnN0YW5jZSI7CisgICAgICAgIF90ZXN0Q291bnRlcihhcHBsaWNhdGlvbkhhbmRsZXIsIHJlcXVlc3RVcmksICJJbmZsZWN0b3IiLCAiMSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJvb3RTaW5nbGV0b24oKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbkhhbmRsZXIgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKG5ldyBSZXNvdXJjZUNvbmZpZyhSb290UmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgUm9vdFNpbmdsZXRvblJlc291cmNlLmNsYXNzKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXF1ZXN0VXJpID0gIi9yb290LXNpbmdsZXRvbiI7CisgICAgICAgIF90ZXN0Q291bnRlcihhcHBsaWNhdGlvbkhhbmRsZXIsIHJlcXVlc3RVcmksICJSb290U2luZ2xldG9uUmVzb3VyY2UiLCAiMSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcXVlc3RTY29wZVJlc291cmNlKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBBcHBsaWNhdGlvbkhhbmRsZXIgYXBwbGljYXRpb25IYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihuZXcgUmVzb3VyY2VDb25maWcoUm9vdFJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIFJvb3RTaW5nbGV0b25SZXNvdXJjZS5jbGFzcywgTW9kZWxQcm9jZXNzb3JGZWF0dXJlLmNsYXNzKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXF1ZXN0VXJpID0gIi9yZXF1ZXN0LXNjb3BlIjsKKyAgICAgICAgX3Rlc3RDb3VudGVyKGFwcGxpY2F0aW9uSGFuZGxlciwgcmVxdWVzdFVyaSwgIlJlcXVlc3RTY29wZVJlc291cmNlIiwgIjAiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL3Rlc3QvcmVzb3VyY2VzL3N1cmVmaXJlLnBvbGljeSBiL3Rlc3RzL2UyZS1pbmplY3QvY2RpMi1zZS9zcmMvdGVzdC9yZXNvdXJjZXMvc3VyZWZpcmUucG9saWN5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlOTlhNWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtaW5qZWN0L2NkaTItc2Uvc3JjL3Rlc3QvcmVzb3VyY2VzL3N1cmVmaXJlLnBvbGljeQpAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvLyB3ZSBkbyBub3QgY2FyZSBhYm91dCBqYXZhIGxpYiBpdHNlbGYKK2dyYW50IGNvZGViYXNlICJmaWxlOiR7amF2YS5ob21lfS8tIiB7CisgIHBlcm1pc3Npb24gamF2YS5zZWN1cml0eS5BbGxQZXJtaXNzaW9uOworfTsKKworLy8gd2UgZG8gbm90IGNhcmUgYWJvdXQgb3VyIGRlcGVuZGVuY2llcworZ3JhbnQgY29kZWJhc2UgImZpbGU6JHtzZXR0aW5ncy5sb2NhbFJlcG9zaXRvcnl9Ly0iIHsKKyAgcGVybWlzc2lvbiBqYXZhLnNlY3VyaXR5LkFsbFBlcm1pc3Npb247Cit9OworCisvLyB0aGlzIGlzIHRvIGJlIGFibGUgdG8gc2V0IHJ1bnRpbWUgZGVsZWdhdGUgaW5zdGFuY2UgaW4gamF4LXJzIGZyb20gdGhlIHRlc3RzCisvLyBhbmQgdG8gcnVuIG11bHRpLXRocmVhZGVkIHRlc3RzCitncmFudCBjb2RlYmFzZSAiZmlsZToke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS90ZXN0LWNsYXNzZXMvLSIgeworICBwZXJtaXNzaW9uIGphdmEubGFuZy5yZWZsZWN0LlJlZmxlY3RQZXJtaXNzaW9uICJzdXBwcmVzc0FjY2Vzc0NoZWNrcyI7CisgIHBlcm1pc3Npb24gamF2YS5sYW5nLlJ1bnRpbWVQZXJtaXNzaW9uICJtb2RpZnlUaHJlYWQiOworICBwZXJtaXNzaW9uIGphdmEudXRpbC5Qcm9wZXJ0eVBlcm1pc3Npb24gIioiLCAid3JpdGUiOworICBwZXJtaXNzaW9uIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiAiZ2V0Q2xhc3NMb2FkZXIiOworICBwZXJtaXNzaW9uIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiAiYWNjZXNzQ2xhc3NJblBhY2thZ2Uuc3VuLm1pc2MiOworICBwZXJtaXNzaW9uIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiAiYWNjZXNzQ2xhc3NJblBhY2thZ2Uuc3VuLm1pc2MuKiI7CisgIHBlcm1pc3Npb24gamF2YS5sYW5nLnJlZmxlY3QuUmVmbGVjdFBlcm1pc3Npb24gInN1cHByZXNzQWNjZXNzQ2hlY2tzIjsKK307CisKK2dyYW50IGNvZGViYXNlICJmaWxlOiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2NsYXNzZXMvLSIgeworICBwZXJtaXNzaW9uIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiAiYWNjZXNzQ2xhc3NJblBhY2thZ2Uuc3VuLm1pc2MiOworICBwZXJtaXNzaW9uIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiAiYWNjZXNzRGVjbGFyZWRNZW1iZXJzIjsKKyAgcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gImdldENsYXNzTG9hZGVyIjsKKyAgcGVybWlzc2lvbiBqYXZhLmxhbmcuUnVudGltZVBlcm1pc3Npb24gIm1vZGlmeVRocmVhZCI7CisgIHBlcm1pc3Npb24gamF2YS51dGlsLlByb3BlcnR5UGVybWlzc2lvbiAiKiIsICJyZWFkIjsKKyAgcGVybWlzc2lvbiBqYXZhLmlvLkZpbGVQZXJtaXNzaW9uICI8PEFMTCBGSUxFUz4+IiwgInJlYWQiOworICBwZXJtaXNzaW9uIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiAiYWNjZXNzQ2xhc3NJblBhY2thZ2Uuc3VuLm1pc2MiOworICBwZXJtaXNzaW9uIGphdmEubGFuZy5SdW50aW1lUGVybWlzc2lvbiAiYWNjZXNzQ2xhc3NJblBhY2thZ2Uuc3VuLm1pc2MuKiI7CisgIHBlcm1pc3Npb24gamF2YS5sYW5nLnJlZmxlY3QuUmVmbGVjdFBlcm1pc3Npb24gInN1cHByZXNzQWNjZXNzQ2hlY2tzIjsKK307CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtaW5qZWN0L3BvbS54bWwgYi90ZXN0cy9lMmUtaW5qZWN0L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdlZDNmOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1pbmplY3QvcG9tLnhtbApAQCAtMCwwICsxLDM4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+ZTJlLWluamVjdDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1lMmUtaW5qZWN0PC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPkplcnNleSBFMkUgSW5qZWN0IHRlc3RzPC9kZXNjcmlwdGlvbj4KKworICAgIDxtb2R1bGVzPgorICAgICAgICA8bW9kdWxlPmNkaTItc2U8L21vZHVsZT4KKyAgICA8L21vZHVsZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3BvbS54bWwgYi90ZXN0cy9lMmUtc2VydmVyL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU3ZWNkOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvcG9tLnhtbApAQCAtMCwwICsxLDIyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0czwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmUyZS1zZXJ2ZXI8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtZTJlLXNlcnZlcjwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgRTJFIFNlcnZlciB0ZXN0czwvZGVzY3JpcHRpb24+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8Zm9ya0NvdW50PjE8L2ZvcmtDb3VudD4KKyAgICAgICAgICAgICAgICAgICAgPHJldXNlRm9ya3M+ZmFsc2U8L3JldXNlRm9ya3M+CisgICAgICAgICAgICAgICAgICAgIDxlbmFibGVBc3NlcnRpb25zPmZhbHNlPC9lbmFibGVBc3NlcnRpb25zPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LmFubm90YXRpb248L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5hbm5vdGF0aW9uLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tdmM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbXZjLWZyZWVtYXJrZXI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbXZjLW11c3RhY2hlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtanNvbi1qYWNrc29uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtanNvbi1qYWNrc29uMTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLWpzb24tamV0dGlzb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1tb3h5PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtanNvbi1wcm9jZXNzaW5nPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWJlYW4tdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1lbnRpdHktZmlsdGVyaW5nPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW12Yy1iZWFuLXZhbGlkYXRpb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1zc2U8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1tdWx0aXBhcnQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb25uZWN0b3JzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWFwYWNoZS1jb25uZWN0b3I8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb25uZWN0b3JzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWdyaXp6bHktY29ubmVjdG9yPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29ubmVjdG9yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1qZXR0eS1jb25uZWN0b3I8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZWN1cml0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm9hdXRoMS1zaWduYXR1cmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZWN1cml0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm9hdXRoMS1jbGllbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZWN1cml0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm9hdXRoMS1zZXJ2ZXI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZWN1cml0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm9hdXRoMi1jbGllbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZ3VhdmE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5ndWF2YTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7Z3VhdmEudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXV0aWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5oYW1jcmVzdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmhhbWNyZXN0LWxpYnJhcnk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPnhtbHVuaXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD54bWx1bml0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnhkazwvaWQ+CisgICAgICAgICAgICA8cHJvcGVydGllcz4KKyAgICAgICAgICAgICAgICA8IS0tIGRvIG5vdCB1c2Ugc2VjdXJpdHkgbWFuYWdlciBmb3IgeGRrIC0tPgorICAgICAgICAgICAgICAgIDxzdXJlZmlyZS5zZWN1cml0eS5hcmdsaW5lIC8+CisgICAgICAgICAgICA8L3Byb3BlcnRpZXM+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+c29uYXI8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5NYW5hZ2VtZW50PgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBkaXNhYmxlIEphQ29DbyBsaXN0ZW5lciBiZWNhdXNlIGl0J3Mgbm90IHdvcmtpbmcgd2l0aCA8Zm9ya01vZGU+YWx3YXlzPC9mb3JrPiAoPHJldXNlRm9ya3M+ZmFsc2U8L3JldXNlRm9ya3M+IHJlc3BlY3RpdmVseSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9qaXJhLnNvbmFyc291cmNlLmNvbS9icm93c2UvU09OQVJKQVZBLTcyOCAoaHR0cHM6Ly9naXRodWIuY29tL1NvbmFyU291cmNlL3NvbmFyLWphdmEvcHVsbC8zMjQpIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydGllcyBjb21iaW5lLnNlbGY9Im92ZXJyaWRlIiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5NYW5hZ2VtZW50PgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorCisgICAgPC9wcm9maWxlcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvQWJzdHJhY3REaXNhYmxlTWV0YWluZlNlcnZpY2VzTG9va3VwVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvQWJzdHJhY3REaXNhYmxlTWV0YWluZlNlcnZpY2VzTG9va3VwVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MjA2NzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9BYnN0cmFjdERpc2FibGVNZXRhaW5mU2VydmljZXNMb29rdXBUZXN0LmphdmEKQEAgLTAsMCArMSwyMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLlJ1bnRpbWVUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5FeGNlcHRpb25NYXBwZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLlNlcnZpY2VGaW5kZXJCaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkFic3RyYWN0QmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuQWJzdHJhY3RNZXNzYWdlUmVhZGVyV3JpdGVyUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CisKKy8qKgorICogVGhpcyBpcyBiYXNlIGZvciB0ZXN0cyB0ZXN0aW5nIGVuYWJsaW5nL2Rpc2FibGluZyBjb25maWd1cmF0aW9uIHByb3BlcnR5CisgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMjTUVUQUlORl9TRVJWSUNFU19MT09LVVBfRElTQUJMRX0uCisgKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0RGlzYWJsZU1ldGFpbmZTZXJ2aWNlc0xvb2t1cFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByb3RlY3RlZCB2b2lkIHRlc3RHZXQoaW50IGV4cGVjdGVkR2V0UmVzcG9uc2VDb2RlLCBpbnQgZXhwZWN0ZWRQb3N0UmVzcG9uc2VDb2RlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSAiSmVyc2V5IjsKKyAgICAgICAgeworICAgICAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoIi8iKS5wYXRoKG5hbWUpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZXhwZWN0ZWRHZXRSZXNwb25zZUNvZGUsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmdldFN0YXR1c0luZm8oKS5nZXRGYW1pbHkoKSA9PSBSZXNwb25zZS5TdGF0dXMuRmFtaWx5LlNVQ0NFU1NGVUwpIHsKKyAgICAgICAgICAgICAgICBVc2VsZXNzTWVzc2FnZSBlbnRpdHkgPSByZXNwb25zZS5yZWFkRW50aXR5KFVzZWxlc3NNZXNzYWdlLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBpZiAoZW50aXR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiSGVsbG8gIiArIG5hbWUsIGVudGl0eS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICBFbnRpdHk8VXNlbGVzc01lc3NhZ2U+IHVzZWxlc3NNZXNzYWdlRW50aXR5ID0gRW50aXR5LmVudGl0eShuZXcgVXNlbGVzc01lc3NhZ2UobmFtZSksIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpOworICAgICAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoIi8iKS5yZXF1ZXN0KCkucG9zdCh1c2VsZXNzTWVzc2FnZUVudGl0eSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGV4cGVjdGVkUG9zdFJlc3BvbnNlQ29kZSwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworCisgICAgICAgICAgICBpZiAocmVzcG9uc2UuZ2V0U3RhdHVzSW5mbygpLmdldEZhbWlseSgpID09IFJlc3BvbnNlLlN0YXR1cy5GYW1pbHkuU1VDQ0VTU0ZVTCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBlbnRpdHkgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICAgICAgaWYgKGVudGl0eS5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhuYW1lLCBlbnRpdHkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgY29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKG5ldyBNZXRhaW5mU2VydmljZXNCaW5kZXIoY29uZmlnKSk7CisgICAgICAgIHJldHVybiBjb25maWc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KGZpbmFsIENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKG5ldyBNZXRhaW5mU2VydmljZXNCaW5kZXIoY29uZmlnKSk7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgQENvbnN1bWVzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJ7bmFtZX0iKQorICAgICAgICBwdWJsaWMgVXNlbGVzc01lc3NhZ2UgZ2V0KEBQYXRoUGFyYW0oIm5hbWUiKSBmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgVXNlbGVzc01lc3NhZ2UgcmVzdWx0ID0gbmV3IFVzZWxlc3NNZXNzYWdlKCk7CisgICAgICAgICAgICByZXN1bHQuc2V0TWVzc2FnZSgiSGVsbG8gIiArIG5hbWUpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdChmaW5hbCBVc2VsZXNzTWVzc2FnZSBtZXNzYWdlKSB7CisgICAgICAgICAgICByZXR1cm4gbWVzc2FnZS5nZXRNZXNzYWdlKCk7CisgICAgICAgIH0KKworICAgIH0gLy8gY2xhc3MgUmVzb3VyY2UKKworCisgICAgLyoqCisgICAgICogTUVUQS1JTkYvc2VydmljZXMvamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyIE9SIE1FVEEtSU5GL3NlcnZpY2VzL2phdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlciA6CisgICAgICogb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5BYnN0cmFjdERpc2FibGVNZXRhaW5mU2VydmljZXNMb29rdXBUZXN0JFVzZWxlc3NNZXNzYWdlQm9keVdyaXRlcgorICAgICAqLworICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgQENvbnN1bWVzKCJ0ZXh0L3BsYWluIikKKyAgICBAU2luZ2xldG9uCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBVc2VsZXNzTWVzc2FnZVByb3ZpZGVyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlUmVhZGVyV3JpdGVyUHJvdmlkZXI8VXNlbGVzc01lc3NhZ2U+IHsKKworICAgICAgICBwdWJsaWMgVXNlbGVzc01lc3NhZ2VQcm92aWRlcigpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb24gYW5ub3RhdGlvbnNbXSwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gVXNlbGVzc01lc3NhZ2UuY2xhc3M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFVzZWxlc3NNZXNzYWdlIHJlYWRGcm9tKAorICAgICAgICAgICAgICAgIENsYXNzPFVzZWxlc3NNZXNzYWdlPiB0eXBlLAorICAgICAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uc1tdLAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVXNlbGVzc01lc3NhZ2UocmVhZEZyb21Bc1N0cmluZyhlbnRpdHlTdHJlYW0sIG1lZGlhVHlwZSkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb24gYW5ub3RhdGlvbnNbXSwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gVXNlbGVzc01lc3NhZ2UuY2xhc3M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShVc2VsZXNzTWVzc2FnZSBzLCBDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBzLmdldE1lc3NhZ2UoKS5sZW5ndGgoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKAorICAgICAgICAgICAgICAgIFVzZWxlc3NNZXNzYWdlIHQsCisgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gdHlwZSwKKyAgICAgICAgICAgICAgICBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgIEFubm90YXRpb24gYW5ub3RhdGlvbnNbXSwKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgd3JpdGVUb0FzU3RyaW5nKHQuZ2V0TWVzc2FnZSgpLCBlbnRpdHlTdHJlYW0sIG1lZGlhVHlwZSk7CisgICAgICAgIH0KKyAgICB9IC8vIGNsYXNzIFVzZWxlc3NNZXNzYWdlQm9keVdyaXRlcgorCisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFVzZWxlc3NNZXNzYWdlIHsKKworICAgICAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlOworCisgICAgICAgIHB1YmxpYyBVc2VsZXNzTWVzc2FnZSgpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBVc2VsZXNzTWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtZXNzYWdlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJVc2VsZXNzTWVzc2FnZXsiCisgICAgICAgICAgICAgICAgICAgICsgIm1lc3NhZ2U9JyIgKyBtZXNzYWdlICsgJ1wnJworICAgICAgICAgICAgICAgICAgICArICd9JzsKKyAgICAgICAgfQorICAgIH0gLy8gY2xhc3MgVXNlbGVzc01lc3NhZ2UKKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE1ldGFpbmZTZXJ2aWNlc0JpbmRlciBleHRlbmRzIEFic3RyYWN0QmluZGVyIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIE9iamVjdD4gcHJvcGVydGllczsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBSdW50aW1lVHlwZSBydW50aW1lVHlwZTsKKworICAgICAgICBwdWJsaWMgTWV0YWluZlNlcnZpY2VzQmluZGVyKGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlnKSB7CisgICAgICAgICAgICB0aGlzLnByb3BlcnRpZXMgPSBjb25maWcuZ2V0UHJvcGVydGllcygpOworICAgICAgICAgICAgdGhpcy5ydW50aW1lVHlwZSA9IGNvbmZpZy5nZXRSdW50aW1lVHlwZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIC8vIE1lc3NhZ2UgQm9keSBwcm92aWRlcnMuCisgICAgICAgICAgICBpbnN0YWxsKG5ldyBTZXJ2aWNlRmluZGVyQmluZGVyPD4oTWVzc2FnZUJvZHlSZWFkZXIuY2xhc3MsIHByb3BlcnRpZXMsIHJ1bnRpbWVUeXBlKSk7CisgICAgICAgICAgICBpbnN0YWxsKG5ldyBTZXJ2aWNlRmluZGVyQmluZGVyPD4oTWVzc2FnZUJvZHlXcml0ZXIuY2xhc3MsIHByb3BlcnRpZXMsIHJ1bnRpbWVUeXBlKSk7CisgICAgICAgICAgICAvLyBFeGNlcHRpb24gTWFwcGVycy4KKyAgICAgICAgICAgIGluc3RhbGwobmV3IFNlcnZpY2VGaW5kZXJCaW5kZXI8PihFeGNlcHRpb25NYXBwZXIuY2xhc3MsIHByb3BlcnRpZXMsIHJ1bnRpbWVUeXBlKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9BbGxJbmplY3RhYmxlc1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0FsbEluamVjdGFibGVzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2OWIwMzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9BbGxJbmplY3RhYmxlc1Rlc3QuamF2YQpAQCAtMCwwICsxLDIxMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5SZXNvdXJjZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXF1ZXN0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuU2VjdXJpdHlDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXJzOworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuTWVzc2FnZUJvZHlXb3JrZXJzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5FeHRlbmRlZFVyaUluZm87CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CisKKy8qKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitwdWJsaWMgY2xhc3MgQWxsSW5qZWN0YWJsZXNUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAUGF0aCgicGVyLXJlcXVlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGVyUmVxdWVzdENvbnRleHRSZXNvdXJjZSB7CisgICAgICAgIEBDb250ZXh0IEFwcGxpY2F0aW9uIGFwcDsKKyAgICAgICAgQENvbnRleHQgUmVzb3VyY2VDb250ZXh0IHJjOworICAgICAgICBAQ29udGV4dCBDb25maWd1cmF0aW9uIGNvbmZpZzsKKyAgICAgICAgQENvbnRleHQgTWVzc2FnZUJvZHlXb3JrZXJzIG1idzsKKyAgICAgICAgQENvbnRleHQgSHR0cEhlYWRlcnMgaHM7CisgICAgICAgIEBDb250ZXh0IFVyaUluZm8gdWk7CisgICAgICAgIEBDb250ZXh0IEV4dGVuZGVkVXJpSW5mbyBldWk7CisgICAgICAgIEBDb250ZXh0IFJlcXVlc3QgcjsKKyAgICAgICAgQENvbnRleHQgU2VjdXJpdHlDb250ZXh0IHNjOworICAgICAgICBAQ29udGV4dCBQcm92aWRlcnMgcDsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhcHApOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyYyk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGNvbmZpZyk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1idyk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGhzKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwodWkpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChldWkpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc2MpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChwKTsKKyAgICAgICAgICAgIHJldHVybiAiR0VUIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJwZXItcmVxdWVzdC1jb25zdHJ1Y3RvciIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQZXJSZXF1ZXN0Q29udGV4dENvbnN0cnVjdG9yUGFyYW1ldGVyUmVzb3VyY2UgeworICAgICAgICBwdWJsaWMgUGVyUmVxdWVzdENvbnRleHRDb25zdHJ1Y3RvclBhcmFtZXRlclJlc291cmNlKEBDb250ZXh0IGZpbmFsIEFwcGxpY2F0aW9uIGFwcCwgQENvbnRleHQgZmluYWwgUmVzb3VyY2VDb250ZXh0IHJjLAorICAgICAgICAgICAgICAgIEBDb250ZXh0IGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlnLCBAQ29udGV4dCBmaW5hbCBNZXNzYWdlQm9keVdvcmtlcnMgbWJ3LCBAQ29udGV4dCBmaW5hbCBIdHRwSGVhZGVycyBocywKKyAgICAgICAgICAgICAgICBAQ29udGV4dCBmaW5hbCBVcmlJbmZvIHVpLCBAQ29udGV4dCBmaW5hbCBFeHRlbmRlZFVyaUluZm8gZXVpLCBAQ29udGV4dCBmaW5hbCBSZXF1ZXN0IHIsCisgICAgICAgICAgICAgICAgQENvbnRleHQgZmluYWwgU2VjdXJpdHlDb250ZXh0IHNjLCBAQ29udGV4dCBmaW5hbCBQcm92aWRlcnMgcCkgeworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhcHApOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyYyk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGNvbmZpZyk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1idyk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGhzKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwodWkpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChldWkpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc2MpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChwKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gIkdFVCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicGVyLXJlcXVlc3QtbWV0aG9kIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBlclJlcXVlc3RDb250ZXh0TWV0aG9kUGFyYW1ldGVyUmVzb3VyY2UgeworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KEBDb250ZXh0IGZpbmFsIEFwcGxpY2F0aW9uIGFwcCwgQENvbnRleHQgZmluYWwgUmVzb3VyY2VDb250ZXh0IHJjLCBAQ29udGV4dCBmaW5hbCBDb25maWd1cmF0aW9uIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQENvbnRleHQgZmluYWwgTWVzc2FnZUJvZHlXb3JrZXJzIG1idywgQENvbnRleHQgZmluYWwgSHR0cEhlYWRlcnMgaHMsIEBDb250ZXh0IGZpbmFsIFVyaUluZm8gdWksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEBDb250ZXh0IGZpbmFsIEV4dGVuZGVkVXJpSW5mbyBldWksIEBDb250ZXh0IGZpbmFsIFJlcXVlc3QgciwgQENvbnRleHQgZmluYWwgU2VjdXJpdHlDb250ZXh0IHNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICBAQ29udGV4dCBmaW5hbCBQcm92aWRlcnMgcCkgeworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhcHApOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyYyk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGNvbmZpZyk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1idyk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGhzKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwodWkpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChldWkpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc2MpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChwKTsKKyAgICAgICAgICAgIHJldHVybiAiR0VUIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJzaW5nbGV0b24iKQorICAgIEBTaW5nbGV0b24KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNpbmdsZXRvbkNvbnRleHRSZXNvdXJjZSB7CisgICAgICAgIEBDb250ZXh0IEFwcGxpY2F0aW9uIGFwcDsKKyAgICAgICAgQENvbnRleHQgUmVzb3VyY2VDb250ZXh0IHJjOworICAgICAgICBAQ29udGV4dCBDb25maWd1cmF0aW9uIGNvbmZpZzsKKyAgICAgICAgQENvbnRleHQgTWVzc2FnZUJvZHlXb3JrZXJzIG1idzsKKyAgICAgICAgQENvbnRleHQgSHR0cEhlYWRlcnMgaHM7CisgICAgICAgIEBDb250ZXh0IFVyaUluZm8gdWk7CisgICAgICAgIEBDb250ZXh0IEV4dGVuZGVkVXJpSW5mbyBldWk7CisgICAgICAgIEBDb250ZXh0IFJlcXVlc3QgcjsKKyAgICAgICAgQENvbnRleHQgU2VjdXJpdHlDb250ZXh0IHNjOworICAgICAgICBAQ29udGV4dCBQcm92aWRlcnMgcDsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChhcHApOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyYyk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGNvbmZpZyk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKG1idyk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGhzKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwodWkpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChldWkpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoc2MpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChwKTsKKyAgICAgICAgICAgIHJldHVybiAiR0VUIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJzaW5nbGV0b24tY29uc3RydWN0b3IiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2luZ2xldG9uQ29udGV4dENvbnN0cnVjdG9yUGFyYW1ldGVyUmVzb3VyY2UgeworICAgICAgICBwdWJsaWMgU2luZ2xldG9uQ29udGV4dENvbnN0cnVjdG9yUGFyYW1ldGVyUmVzb3VyY2UoQENvbnRleHQgZmluYWwgQXBwbGljYXRpb24gYXBwLCBAQ29udGV4dCBmaW5hbCBSZXNvdXJjZUNvbnRleHQgcmMsCisgICAgICAgICAgICAgICAgQENvbnRleHQgZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWcsIEBDb250ZXh0IGZpbmFsIE1lc3NhZ2VCb2R5V29ya2VycyBtYncsIEBDb250ZXh0IGZpbmFsIEh0dHBIZWFkZXJzIGhzLAorICAgICAgICAgICAgICAgIEBDb250ZXh0IGZpbmFsIFVyaUluZm8gdWksIEBDb250ZXh0IGZpbmFsIEV4dGVuZGVkVXJpSW5mbyBldWksIEBDb250ZXh0IGZpbmFsIFJlcXVlc3QgciwKKyAgICAgICAgICAgICAgICBAQ29udGV4dCBmaW5hbCBTZWN1cml0eUNvbnRleHQgc2MsIEBDb250ZXh0IGZpbmFsIFByb3ZpZGVycyBwKSB7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGFwcCk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJjKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoY29uZmlnKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwobWJ3KTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoaHMpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbCh1aSk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGV1aSk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHIpOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChzYyk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHApOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiR0VUIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUGVyUmVxdWVzdENvbnRleHRSZXNvdXJjZS5jbGFzcywgUGVyUmVxdWVzdENvbnRleHRDb25zdHJ1Y3RvclBhcmFtZXRlclJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIFBlclJlcXVlc3RDb250ZXh0TWV0aG9kUGFyYW1ldGVyUmVzb3VyY2UuY2xhc3MsIFNpbmdsZXRvbkNvbnRleHRSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBTaW5nbGV0b25Db250ZXh0Q29uc3RydWN0b3JQYXJhbWV0ZXJSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGVyUmVxdWVzdEluamVjdGVkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJHRVQiLCB0YXJnZXQoKS5wYXRoKCIvcGVyLXJlcXVlc3QiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBlclJlcXVlc3RDb25zdHJ1Y3RvcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygiR0VUIiwgdGFyZ2V0KCkucGF0aCgiL3Blci1yZXF1ZXN0LWNvbnN0cnVjdG9yIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQZXJSZXF1ZXN0TWV0aG9kKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJHRVQiLCB0YXJnZXQoKS5wYXRoKCIvcGVyLXJlcXVlc3QtbWV0aG9kIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGV0b24oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCIsIHRhcmdldCgpLnBhdGgoIi9zaW5nbGV0b24iKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZXRvbkNvbnN0cnVjdG9yKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJHRVQiLCB0YXJnZXQoKS5wYXRoKCIvc2luZ2xldG9uLWNvbnN0cnVjdG9yIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0FtYmlnb3VzUmVzb3VyY2VNZXRob2RUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9BbWJpZ291c1Jlc291cmNlTWV0aG9kVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYjI0OWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9BbWJpZ291c1Jlc291cmNlTWV0aG9kVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3Qgb2YgdmFsaWRhdGlvbiBvZiByZXNvdXJjZXMgYXMgYW4gZW5kLXRvLWVuZCB0ZXN0LgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBBbWJpZ291c1Jlc291cmNlTWV0aG9kVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhUZXN0UmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcXVlc3RUb0FtYmlndW91c1Jlc291cmNlQ2xhc3MoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBzaW1wbGVOYW1lID0gVGVzdFJlc291cmNlLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInRlc3QiKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoc2ltcGxlTmFtZSArIHNpbXBsZU5hbWUsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0IikucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9IVE1MX1RZUEUpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhzaW1wbGVOYW1lLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgidGVzdCIpLnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfSFRNTF9UWVBFKS5wb3N0KEVudGl0eS5lbnRpdHkoImFhYWEiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHNpbXBsZU5hbWUgKyBzaW1wbGVOYW1lLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgidGVzdCIpLnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfSFRNTF9UWVBFKS5wb3N0KEVudGl0eS5lbnRpdHkoImFhYWEiLCBNZWRpYVR5cGUuVEVYVF9IVE1MX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoc2ltcGxlTmFtZSwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGFtYmlndW91cyByZXNvdXJjZSBjbGFzcy4KKyAgICAgKi8KKyAgICBAUGF0aCgidGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0UmVzb3VyY2UgeworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHN1YigpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBDb25zdW1lcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICAgICAgcHVibGljIFN0cmluZyBzdWJzdWIoKSB7CisgICAgICAgICAgICByZXR1cm4gc3ViKCkgKyBzdWIoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gc3ViKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gc3Vic3ViKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9BcHBOYW1lQmluZGluZ1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0FwcE5hbWVCaW5kaW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMWRmMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9BcHBOYW1lQmluZGluZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLk5hbWVCaW5kaW5nOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJpb3JpdHk7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitwdWJsaWMgY2xhc3MgQXBwTmFtZUJpbmRpbmdUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisgICAgQE5hbWVCaW5kaW5nCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgICBwcml2YXRlIHN0YXRpYyBAaW50ZXJmYWNlIEdsb2JhbCB7fQorCisgICAgQE5hbWVCaW5kaW5nCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgICBwcml2YXRlIHN0YXRpYyBAaW50ZXJmYWNlIE5hbWVCb3VuZFJlcXVlc3Qge30KKworICAgIEBHbG9iYWwKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEdsb2JhbE5hbWVCb3VuZEZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuYWJvcnRXaXRoKFJlc3BvbnNlLm9rKCJnbG9iYWwiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKS5idWlsZCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBOYW1lQm91bmRSZXF1ZXN0CisgICAgQFByaW9yaXR5KDEpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBOYW1lQm91bmRSZXF1ZXN0RmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5hYm9ydFdpdGgoUmVzcG9uc2Uub2soIm5hbWVCb3VuZFJlcXVlc3QiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKS5idWlsZCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBHbG9iYWwKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15UmVzb3VyY2VDb25maWcgZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisgICAgICAgIHB1YmxpYyBNeVJlc291cmNlQ29uZmlnKCkgeworICAgICAgICAgICAgc3VwZXIoCisgICAgICAgICAgICAgICAgICAgIE15UmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgIEdsb2JhbE5hbWVCb3VuZEZpbHRlci5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgTmFtZUJvdW5kUmVxdWVzdEZpbHRlci5jbGFzcworICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15UmVzb3VyY2UgeworICAgICAgICBAUGF0aCgibmFtZUJvdW5kUmVxdWVzdCIpCisgICAgICAgIEBHRVQKKyAgICAgICAgQE5hbWVCb3VuZFJlcXVlc3QKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lQm91bmRSZXF1ZXN0KCkgeworICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImdsb2JhbCIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRQb3N0TWF0Y2hpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IE15UmVzb3VyY2VDb25maWcoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lQm91bmRSZXF1ZXN0KCkgeworICAgICAgICB0ZXN0KCJuYW1lQm91bmRSZXF1ZXN0Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2xvYmFsKCkgeworICAgICAgICB0ZXN0KCJnbG9iYWwiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdChTdHJpbmcgbmFtZSkgeworICAgICAgICBSZXNwb25zZSByID0gdGFyZ2V0KG5hbWUpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgci5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuYW1lLCByLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvQXBwTmFtZUJpbmRpbmdUZXN0Mi5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvQXBwTmFtZUJpbmRpbmdUZXN0Mi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZTkwMDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9BcHBOYW1lQmluZGluZ1Rlc3QyLmphdmEKQEAgLTAsMCArMSwxOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuTmFtZUJpbmRpbmc7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlc3BvbnNlRmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvckNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdCB7QGxpbmsgTmFtZUJpbmRpbmcgbmFtZSBiaW5kaW5nfSBhbm5vdGF0aW9ucyBvbiB0aGUge0BsaW5rIEFwcGxpY2F0aW9ufSBjbGFzcy4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBBcHBOYW1lQmluZGluZ1Rlc3QyIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IE15QXBwKCk7CisgICAgfQorCisgICAgQE5hbWVCaW5kaW5nCisgICAgQFRhcmdldCh7RWxlbWVudFR5cGUuVFlQRSwgRWxlbWVudFR5cGUuTUVUSE9EfSkKKyAgICBAUmV0ZW50aW9uKHZhbHVlID0gUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCisgICAgcHVibGljIHN0YXRpYyBAaW50ZXJmYWNlIEZpcnN0R2xvYmFsTmFtZUJpbmRpbmcgeworICAgIH0KKworICAgIEBOYW1lQmluZGluZworICAgIEBUYXJnZXQoe0VsZW1lbnRUeXBlLlRZUEUsIEVsZW1lbnRUeXBlLk1FVEhPRH0pCisgICAgQFJldGVudGlvbih2YWx1ZSA9IFJldGVudGlvblBvbGljeS5SVU5USU1FKQorICAgIHB1YmxpYyBzdGF0aWMgQGludGVyZmFjZSBTZWNvbmRHbG9iYWxOYW1lQmluZGluZyB7CisgICAgfQorCisgICAgQE5hbWVCaW5kaW5nCisgICAgQFRhcmdldCh7RWxlbWVudFR5cGUuVFlQRSwgRWxlbWVudFR5cGUuTUVUSE9EfSkKKyAgICBAUmV0ZW50aW9uKHZhbHVlID0gUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCisgICAgcHVibGljIHN0YXRpYyBAaW50ZXJmYWNlIFRoaXJkR2xvYmFsTmFtZUJpbmRpbmcgeworICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIEBGaXJzdEdsb2JhbE5hbWVCaW5kaW5nCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBZGRPbmVJbnRlcmNlcHRvciBpbXBsZW1lbnRzCisgICAgICAgICAgICBXcml0ZXJJbnRlcmNlcHRvciB7CisgICAgICAgIHB1YmxpYyB2b2lkIGFyb3VuZFdyaXRlVG8oV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpCisgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBTdHJpbmcgZW50aXR5ID0gKFN0cmluZykgY29udGV4dC5nZXRFbnRpdHkoKTsKKyAgICAgICAgICAgIEludGVnZXIgaSA9IEludGVnZXIucGFyc2VJbnQoZW50aXR5KTsKKyAgICAgICAgICAgIGVudGl0eSA9IFN0cmluZy52YWx1ZU9mKGkgKyAxKTsKKyAgICAgICAgICAgIGNvbnRleHQuc2V0RW50aXR5KGVudGl0eSk7CisgICAgICAgICAgICBjb250ZXh0LnByb2NlZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIEBGaXJzdEdsb2JhbE5hbWVCaW5kaW5nCisgICAgQFNlY29uZEdsb2JhbE5hbWVCaW5kaW5nCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBZGRIdW5kcmVkSW50ZXJjZXB0b3IgaW1wbGVtZW50cworICAgICAgICAgICAgV3JpdGVySW50ZXJjZXB0b3IgeworICAgICAgICBwdWJsaWMgdm9pZCBhcm91bmRXcml0ZVRvKFdyaXRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KQorICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgU3RyaW5nIGVudGl0eSA9IChTdHJpbmcpIGNvbnRleHQuZ2V0RW50aXR5KCk7CisgICAgICAgICAgICBJbnRlZ2VyIGkgPSBJbnRlZ2VyLnBhcnNlSW50KGVudGl0eSk7CisgICAgICAgICAgICBlbnRpdHkgPSBTdHJpbmcudmFsdWVPZihpICsgMTAwKTsKKyAgICAgICAgICAgIGNvbnRleHQuc2V0RW50aXR5KGVudGl0eSk7CisgICAgICAgICAgICBjb250ZXh0LnByb2NlZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIEBGaXJzdEdsb2JhbE5hbWVCaW5kaW5nCisgICAgQFNlY29uZEdsb2JhbE5hbWVCaW5kaW5nCisgICAgQFRoaXJkR2xvYmFsTmFtZUJpbmRpbmcKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFkZFRob3VzYW5kSW50ZXJjZXB0b3IgaW1wbGVtZW50cworICAgICAgICAgICAgV3JpdGVySW50ZXJjZXB0b3IgeworICAgICAgICBwdWJsaWMgdm9pZCBhcm91bmRXcml0ZVRvKFdyaXRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KQorICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgU3RyaW5nIGVudGl0eSA9IChTdHJpbmcpIGNvbnRleHQuZ2V0RW50aXR5KCk7CisgICAgICAgICAgICBJbnRlZ2VyIGkgPSBJbnRlZ2VyLnBhcnNlSW50KGVudGl0eSk7CisgICAgICAgICAgICBlbnRpdHkgPSBTdHJpbmcudmFsdWVPZihpICsgMTAwMCk7CisgICAgICAgICAgICBjb250ZXh0LnNldEVudGl0eShlbnRpdHkpOworICAgICAgICAgICAgY29udGV4dC5wcm9jZWVkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBARmlyc3RHbG9iYWxOYW1lQmluZGluZworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQWRkVGVuRmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXIgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFN0cmluZyBlbnRpdHkgPSAoU3RyaW5nKSByZXNwb25zZUNvbnRleHQuZ2V0RW50aXR5KCk7CisgICAgICAgICAgICBJbnRlZ2VyIGkgPSBJbnRlZ2VyLnZhbHVlT2YoZW50aXR5KTsKKyAgICAgICAgICAgIGVudGl0eSA9IFN0cmluZy52YWx1ZU9mKGkgKyAxMCk7CisgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuc2V0RW50aXR5KGVudGl0eSwgKEFubm90YXRpb25bXSkgbnVsbCwKKyAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBARmlyc3RHbG9iYWxOYW1lQmluZGluZworICAgIEBTZWNvbmRHbG9iYWxOYW1lQmluZGluZworICAgIHB1YmxpYyBjbGFzcyBNeUFwcCBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKworICAgICAgICBwdWJsaWMgamF2YS51dGlsLlNldDxqYXZhLmxhbmcuQ2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgICAgICBTZXQ8Q2xhc3M8Pz4+IHJlc291cmNlcyA9IG5ldyBIYXNoU2V0PENsYXNzPD8+PigpOworICAgICAgICAgICAgcmVzb3VyY2VzLmFkZChSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgICAgICByZXNvdXJjZXMuYWRkKEFkZE9uZUludGVyY2VwdG9yLmNsYXNzKTsKKyAgICAgICAgICAgIHJlc291cmNlcy5hZGQoQWRkVGVuRmlsdGVyLmNsYXNzKTsKKyAgICAgICAgICAgIHJlc291cmNlcy5hZGQoQWRkSHVuZHJlZEludGVyY2VwdG9yLmNsYXNzKTsKKyAgICAgICAgICAgIHJlc291cmNlcy5hZGQoQWRkVGhvdXNhbmRJbnRlcmNlcHRvci5jbGFzcyk7CisgICAgICAgICAgICByZXR1cm4gcmVzb3VyY2VzOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgiYmluZCIpCisgICAgICAgIEBGaXJzdEdsb2JhbE5hbWVCaW5kaW5nCisgICAgICAgIEBUaGlyZEdsb2JhbE5hbWVCaW5kaW5nCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZWNob1dpdGhCaW5kKFN0cmluZyBlY2hvKSB7CisgICAgICAgICAgICAvLyBub3RlOiBBZGRUaG91c2FuZEludGVyY2VwdG9yIHdpbGwgbm90IGJlIHRyaWdnZXJlZCBldmVuIHdlIGhhdmUgaGVyZSBAVGhpcmRHbG9iYWxOYW1lQmluZGluZy4gQW5ub3RhdGlvbnMgZnJvbQorICAgICAgICAgICAgLy8gQXBwbGljYXRpb24gY2xhc3MgYW5kIGZyb20gcmVzb3VyY2UgbWV0aG9kcyBhcmUgZXZhbHVhdGVkIHNlcGFyYXRlbHkuCisKKyAgICAgICAgICAgIHJldHVybiBlY2hvOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoIm5vYmluZCIpCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZWNob05vQmluZChTdHJpbmcgZWNobykgeworICAgICAgICAgICAgcmV0dXJuIGVjaG87CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCaW5kKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlL2JpbmQiKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpLnBvc3QoCisgICAgICAgICAgICAgICAgRW50aXR5LmVudGl0eShJbnRlZ2VyLnZhbHVlT2YoMCksIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBmaW5hbCBJbnRlZ2VyIGludGVnZXIgPSByZXNwb25zZS5yZWFkRW50aXR5KEludGVnZXIuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTExLCBpbnRlZ2VyLmludFZhbHVlKCkpOworICAgIH0KKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9CaW5kKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlL25vYmluZCIpLnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkucG9zdCgKKyAgICAgICAgICAgICAgICBFbnRpdHkuZW50aXR5KEludGVnZXIudmFsdWVPZigwKSwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGZpbmFsIEludGVnZXIgaW50ZWdlciA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoSW50ZWdlci5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygxMTEsIGludGVnZXIuaW50VmFsdWUoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9Bc3luY0NhbGxiYWNrVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvQXN5bmNDYWxsYmFja1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGRmMDM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvQXN5bmNDYWxsYmFja1Rlc3QuamF2YQpAQCAtMCwwICsxLDE1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNCb29sZWFuOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkFzeW5jUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbm5lY3Rpb25DYWxsYmFjazsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuU3VzcGVuZGVkOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5DaHVua2VkT3V0cHV0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5NYW5hZ2VkQXN5bmM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBUZXN0cyB7QGxpbmsgQ29ubmVjdGlvbkNhbGxiYWNrIGNvbm5lY3Rpb24gY2FsbGJhY2t9LgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIEFzeW5jQ2FsbGJhY2tUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEF0b21pY0Jvb2xlYW4gb25EaXNjb25uZWN0Q2FsbGVkID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOworCisgICAgcHVibGljIHN0YXRpYyBDb3VudERvd25MYXRjaCBzdHJlYW1DbG9zZWRTaWduYWw7CisgICAgcHVibGljIHN0YXRpYyBDb3VudERvd25MYXRjaCBjYWxsYmFja0NhbGxlZFNpZ25hbDsKKworICAgIEBQYXRoKCJyZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBATWFuYWdlZEFzeW5jCisgICAgICAgIEBQYXRoKCJvdXRwdXRTdHJlYW0iKQorICAgICAgICBwdWJsaWMgdm9pZCBnZXQoQFN1c3BlbmRlZCBmaW5hbCBBc3luY1Jlc3BvbnNlIGFzeW5jUmVzcG9uc2UpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICAgICAgYXN5bmNSZXNwb25zZS5yZWdpc3RlcihNeUNvbm5lY3Rpb25DYWxsYmFjay5jbGFzcyk7CisgICAgICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBpcyA9IG5ldyBJbnB1dFN0cmVhbSgpIHsKKyAgICAgICAgICAgICAgICBwcml2YXRlIGludCBjb3VudGVyID0gMDsKKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiA2NSArICgrK2NvdW50ZXIgJSAzNSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9OworICAgICAgICAgICAgYXN5bmNSZXNwb25zZS5yZXN1bWUoaXMpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBATWFuYWdlZEFzeW5jCisgICAgICAgIEBQYXRoKCJjaHVua2VkIikKKyAgICAgICAgcHVibGljIHZvaWQgZ2V0Q2h1bmtlZE91dHB1dChAU3VzcGVuZGVkIEFzeW5jUmVzcG9uc2UgYXN5bmNSZXNwb25zZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBhc3luY1Jlc3BvbnNlLnJlZ2lzdGVyKE15Q29ubmVjdGlvbkNhbGxiYWNrLmNsYXNzKTsKKyAgICAgICAgICAgIENodW5rZWRPdXRwdXQ8U3RyaW5nPiBjaHVua2VkT3V0cHV0ID0gbmV3IENodW5rZWRPdXRwdXQ8U3RyaW5nPihTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgYXN5bmNSZXNwb25zZS5yZXN1bWUoY2h1bmtlZE91dHB1dCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDUwMDAwOyBpKyspIHsKKyAgICAgICAgICAgICAgICBjaHVua2VkT3V0cHV0LndyaXRlKCJzb21ldGhpbmctIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RMYXRjaCBleHRlbmRzIENvdW50RG93bkxhdGNoIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtdWx0aXBsaWVyOworCisgICAgICAgIHB1YmxpYyBUZXN0TGF0Y2goaW50IGNvdW50LCBTdHJpbmcgbmFtZSwgaW50IG11bHRpcGxpZXIpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvdW50KTsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgICAgICB0aGlzLm11bHRpcGxpZXIgPSBtdWx0aXBsaWVyOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNvdW50RG93bigpIHsKKyAgICAgICAgICAgIHN1cGVyLmNvdW50RG93bigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGF3YWl0KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gc3VjY2VzcyA9IHN1cGVyLmF3YWl0KDEwICogbXVsdGlwbGllciwgVGltZVVuaXQuU0VDT05EUyk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkgKyAiOiBMYXRjaCBbIiArIG5hbWUgKyAiXSBhd2FpdGluZyAtPiB0aW1lb3V0ISEhIiwKKyAgICAgICAgICAgICAgICAgICAgc3VjY2Vzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXAoKSB7CisgICAgICAgIG9uRGlzY29ubmVjdENhbGxlZC5zZXQoZmFsc2UpOworICAgICAgICBzdHJlYW1DbG9zZWRTaWduYWwgPSBuZXcgVGVzdExhdGNoKDEsICJzdHJlYW1DbG9zZWRTaWduYWwiLCBnZXRBc3luY1RpbWVvdXRNdWx0aXBsaWVyKCkpOworICAgICAgICBjYWxsYmFja0NhbGxlZFNpZ25hbCA9IG5ldyBUZXN0TGF0Y2goMSwgImNhbGxiYWNrQ2FsbGVkU2lnbmFsIiwgZ2V0QXN5bmNUaW1lb3V0TXVsdGlwbGllcigpKTsKKworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE91dHB1dFN0cmVhbSgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBfdGVzdENvbm5lY3Rpb25DYWxsYmFjaygicmVzb3VyY2Uvb3V0cHV0U3RyZWFtIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2h1bmtlZE91dHB1dCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBfdGVzdENvbm5lY3Rpb25DYWxsYmFjaygicmVzb3VyY2UvY2h1bmtlZCIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfdGVzdENvbm5lY3Rpb25DYWxsYmFjayhTdHJpbmcgcGF0aCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aChwYXRoKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gcmVzcG9uc2UucmVhZEVudGl0eShJbnB1dFN0cmVhbS5jbGFzcyk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTAwOyBpKyspIHsKKyAgICAgICAgICAgIGlucHV0U3RyZWFtLnJlYWQoKTsKKyAgICAgICAgfQorICAgICAgICByZXNwb25zZS5jbG9zZSgpOworICAgICAgICBzdHJlYW1DbG9zZWRTaWduYWwuY291bnREb3duKCk7CisgICAgICAgIGNhbGxiYWNrQ2FsbGVkU2lnbmFsLmF3YWl0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG9uRGlzY29ubmVjdENhbGxlZC5nZXQoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUNvbm5lY3Rpb25DYWxsYmFjayBpbXBsZW1lbnRzIENvbm5lY3Rpb25DYWxsYmFjayB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRGlzY29ubmVjdChBc3luY1Jlc3BvbnNlIGRpc2Nvbm5lY3RlZCkgeworICAgICAgICAgICAgb25EaXNjb25uZWN0Q2FsbGVkLnNldCh0cnVlKTsKKyAgICAgICAgICAgIGNhbGxiYWNrQ2FsbGVkU2lnbmFsLmNvdW50RG93bigpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvQXN5bmNSZXNwb25zZVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0FzeW5jUmVzcG9uc2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVhZmY1MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0FzeW5jUmVzcG9uc2VUZXN0LmphdmEKQEAgLTAsMCArMSwzMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQXJyYXlCbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkJsb2NraW5nUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkFzeW5jUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlN1c3BlbmRlZDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuRXhjZXB0aW9uTWFwcGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5NYW5hZ2VkQXN5bmM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pbnN0YW5jZU9mOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQXN5bmNSZXNwb25zZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHB1YmxpYyBzdGF0aWMgQ291bnREb3duTGF0Y2ggY2FsbGJhY2tDYWxsZWRTaWduYWwxOworICAgIHB1YmxpYyBzdGF0aWMgQ291bnREb3duTGF0Y2ggY2FsbGJhY2tDYWxsZWRTaWduYWwyOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgY2FsbGJhY2tDYWxsZWRTaWduYWwxID0gbmV3IEFzeW5jQ2FsbGJhY2tUZXN0LlRlc3RMYXRjaCgzLCAiY2FuY2VsKCkgcmV0dXJuIHZhbHVlMSIsIGdldEFzeW5jVGltZW91dE11bHRpcGxpZXIoKSk7CisgICAgICAgIGNhbGxiYWNrQ2FsbGVkU2lnbmFsMiA9IG5ldyBBc3luY0NhbGxiYWNrVGVzdC5UZXN0TGF0Y2goMywgImNhbmNlbCgpIHJldHVybiB2YWx1ZTIiLCBnZXRBc3luY1RpbWVvdXRNdWx0aXBsaWVyKCkpOworCisgICAgICAgIHNldChUZXN0UHJvcGVydGllcy5SRUNPUkRfTE9HX0xFVkVMLCBMZXZlbC5GSU5FLmludFZhbHVlKCkpOworCisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MsIEVycm9yUmVzb3VyY2UuY2xhc3MsIE1hcHBlZEV4Y2VwdGlvbk1hcHBlci5jbGFzcywKKyAgICAgICAgICAgICAgICBFbnRpdHlBbm5vdGF0aW9uQ2hlY2tlcldyaXRlci5jbGFzcywgQXN5bmNNZXNzYWdlQm9keVByb3ZpZGVyUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlQ2FuY2VsKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UvMSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSByZXNwb25zZS5yZWFkRW50aXR5KElucHV0U3RyZWFtLmNsYXNzKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1MDA7IGkrKykgeworICAgICAgICAgICAgaW5wdXRTdHJlYW0ucmVhZCgpOworICAgICAgICB9CisgICAgICAgIHJlc3BvbnNlLmNsb3NlKCk7CisgICAgICAgIGNhbGxiYWNrQ2FsbGVkU2lnbmFsMS5hd2FpdCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENhbmNlbEFmdGVyUmVzdW1lKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UvMiIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSByZXNwb25zZS5yZWFkRW50aXR5KElucHV0U3RyZWFtLmNsYXNzKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1MDA7IGkrKykgeworICAgICAgICAgICAgaW5wdXRTdHJlYW0ucmVhZCgpOworICAgICAgICB9CisgICAgICAgIHJlc3BvbnNlLmNsb3NlKCk7CisgICAgICAgIGNhbGxiYWNrQ2FsbGVkU2lnbmFsMi5hd2FpdCgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc3VtZVdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RSZXN1bWVFeGNlcHRpb24oInJlc3VtZVdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIiwgInJlc3VtZVdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzdW1lTWFwcGVkRXhjZXB0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RSZXN1bWVFeGNlcHRpb24oInJlc3VtZU1hcHBlZEV4Y2VwdGlvbiIsICJyZXN1bWVNYXBwZWRFeGNlcHRpb24iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXN1bWVSdW50aW1lRXhjZXB0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RSZXN1bWVFeGNlcHRpb24oInJlc3VtZVJ1bnRpbWVFeGNlcHRpb24iLCBudWxsKTsKKworICAgICAgICBhc3NlcnRUaGF0KGdldExhc3RMb2dnZWRSZWNvcmQoKS5nZXRUaHJvd24oKSwgaW5zdGFuY2VPZihSdW50aW1lRXhjZXB0aW9uLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzdW1lQ2hlY2tlZEV4Y2VwdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0UmVzdW1lRXhjZXB0aW9uKCJyZXN1bWVDaGVja2VkRXhjZXB0aW9uIiwgbnVsbCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChnZXRMYXN0TG9nZ2VkUmVjb3JkKCkuZ2V0VGhyb3duKCksIGluc3RhbmNlT2YoSU9FeGNlcHRpb24uY2xhc3MpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdFJlc3VtZUV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgcGF0aCwgZmluYWwgU3RyaW5nIGVudGl0eSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCBlcnJvclJlc291cmNlID0gdGFyZ2V0KCJlcnJvclJlc291cmNlIik7CisKKyAgICAgICAgZmluYWwgRnV0dXJlPFJlc3BvbnNlPiBzdXNwZW5kZWQgPSBlcnJvclJlc291cmNlLnBhdGgoInN1c3BlbmQiKS5yZXF1ZXN0KCkuYXN5bmMoKS5nZXQoKTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSBlcnJvclJlc291cmNlLnBhdGgocGF0aCkucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKCJvayIpKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSBzdXNwZW5kZWRSZXNwb25zZSA9IHN1c3BlbmRlZC5nZXQoKTsKKworICAgICAgICBhc3NlcnRUaGF0KHN1c3BlbmRlZFJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDUwMCkpOworICAgICAgICBpZiAoZW50aXR5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoc3VzcGVuZGVkUmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKGVudGl0eSkpOworICAgICAgICB9CisKKyAgICAgICAgc3VzcGVuZGVkUmVzcG9uc2UuY2xvc2UoKTsKKworICAgICAgICAvLyBDaGVjayB0aGVyZSBpcyBubyBOUEUuCisgICAgICAgIGZvciAoZmluYWwgTG9nUmVjb3JkIHJlY29yZCA6IGdldExvZ2dlZFJlY29yZHMoKSkgeworICAgICAgICAgICAgZmluYWwgVGhyb3dhYmxlIHRocm93biA9IHJlY29yZC5nZXRUaHJvd24oKTsKKyAgICAgICAgICAgIGlmICh0aHJvd24gIT0gbnVsbCAmJiB0aHJvd24gaW5zdGFuY2VvZiBOdWxsUG9pbnRlckV4Y2VwdGlvbikgeworICAgICAgICAgICAgICAgIGZhaWwoIlVuZXhwZWN0ZWQgTlBFLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCIxIikKKyAgICAgICAgQE1hbmFnZWRBc3luYworICAgICAgICBwdWJsaWMgdm9pZCBnZXQxKEBTdXNwZW5kZWQgZmluYWwgQXN5bmNSZXNwb25zZSBhc3luY1Jlc3BvbnNlKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChhc3luY1Jlc3BvbnNlLmNhbmNlbCgpKSB7CisgICAgICAgICAgICAgICAgY2FsbGJhY2tDYWxsZWRTaWduYWwxLmNvdW50RG93bigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFzeW5jUmVzcG9uc2UuY2FuY2VsKCkpIHsKKyAgICAgICAgICAgICAgICBjYWxsYmFja0NhbGxlZFNpZ25hbDEuY291bnREb3duKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYXN5bmNSZXNwb25zZS5jYW5jZWwoKSkgeworICAgICAgICAgICAgICAgIGNhbGxiYWNrQ2FsbGVkU2lnbmFsMS5jb3VudERvd24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIjIiKQorICAgICAgICBATWFuYWdlZEFzeW5jCisgICAgICAgIHB1YmxpYyB2b2lkIGdldDIoQFN1c3BlbmRlZCBmaW5hbCBBc3luY1Jlc3BvbnNlIGFzeW5jUmVzcG9uc2UpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICAgICAgYXN5bmNSZXNwb25zZS5yZXN1bWUoIm9rIik7CisKKyAgICAgICAgICAgIGlmICghYXN5bmNSZXNwb25zZS5jYW5jZWwoKSkgeworICAgICAgICAgICAgICAgIGNhbGxiYWNrQ2FsbGVkU2lnbmFsMi5jb3VudERvd24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghYXN5bmNSZXNwb25zZS5jYW5jZWwoKSkgeworICAgICAgICAgICAgICAgIGNhbGxiYWNrQ2FsbGVkU2lnbmFsMi5jb3VudERvd24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghYXN5bmNSZXNwb25zZS5jYW5jZWwoKSkgeworICAgICAgICAgICAgICAgIGNhbGxiYWNrQ2FsbGVkU2lnbmFsMi5jb3VudERvd24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWFwcGVkRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgcHVibGljIE1hcHBlZEV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICAgICAgc3VwZXIobWVzc2FnZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1hcHBlZEV4Y2VwdGlvbk1hcHBlciBpbXBsZW1lbnRzIEV4Y2VwdGlvbk1hcHBlcjxNYXBwZWRFeGNlcHRpb24+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHRvUmVzcG9uc2UoZmluYWwgTWFwcGVkRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnNlcnZlckVycm9yKCkuZW50aXR5KGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiZXJyb3JSZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFcnJvclJlc291cmNlIHsKKworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCbG9ja2luZ1F1ZXVlPEFzeW5jUmVzcG9uc2U+IHN1c3BlbmRlZCA9IG5ldyBBcnJheUJsb2NraW5nUXVldWU8QXN5bmNSZXNwb25zZT4oMSk7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgic3VzcGVuZCIpCisgICAgICAgIHB1YmxpYyB2b2lkIHN1c3BlbmQoQFN1c3BlbmRlZCBmaW5hbCBBc3luY1Jlc3BvbnNlIGFzeW5jUmVzcG9uc2UpIHsKKyAgICAgICAgICAgIHN1c3BlbmRlZC5hZGQoYXN5bmNSZXNwb25zZSk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJyZXN1bWVXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcmVzdW1lV2ViQXBwbGljYXRpb25FeGNlcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiByZXN1bWUobmV3IFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKFJlc3BvbnNlLnNlcnZlckVycm9yKCkuZW50aXR5KCJyZXN1bWVXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiIpLmJ1aWxkKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInJlc3VtZU1hcHBlZEV4Y2VwdGlvbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcmVzdW1lTWFwcGVkRXhjZXB0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gcmVzdW1lKG5ldyBNYXBwZWRFeGNlcHRpb24oInJlc3VtZU1hcHBlZEV4Y2VwdGlvbiIpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInJlc3VtZVJ1bnRpbWVFeGNlcHRpb24iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHJlc3VtZVJ1bnRpbWVFeGNlcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiByZXN1bWUobmV3IFJ1bnRpbWVFeGNlcHRpb24oInJlc3VtZVJ1bnRpbWVFeGNlcHRpb24iKSk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJyZXN1bWVDaGVja2VkRXhjZXB0aW9uIikKKyAgICAgICAgcHVibGljIFN0cmluZyByZXN1bWVDaGVja2VkRXhjZXB0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gcmVzdW1lKG5ldyBJT0V4Y2VwdGlvbigicmVzdW1lQ2hlY2tlZEV4Y2VwdGlvbiIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHJlc3VtZShmaW5hbCBUaHJvd2FibGUgdGhyb3dhYmxlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBzdXNwZW5kZWQudGFrZSgpLnJlc3VtZSh0aHJvd2FibGUpID8gIm9rIiA6ICJrbyI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEVudGl0eUFubm90YXRpb25DaGVja2VyIHsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEVudGl0eUFubm90YXRpb25DaGVja2VyV3JpdGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8RW50aXR5QW5ub3RhdGlvbkNoZWNrZXI+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKGZpbmFsIEVudGl0eUFubm90YXRpb25DaGVja2VyIGVudGl0eUFubm90YXRpb25DaGVja2VyLCBmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oZmluYWwgRW50aXR5QW5ub3RhdGlvbkNoZWNrZXIgZW50aXR5QW5ub3RhdGlvbkNoZWNrZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVudGl0eSA9IGFubm90YXRpb25zLmxlbmd0aCA+IDAgPyAib2siIDogImtvIjsKKworICAgICAgICAgICAgZW50aXR5U3RyZWFtLndyaXRlKGVudGl0eS5nZXRCeXRlcygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJhbm5vdGF0aW9ucyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBc3luY01lc3NhZ2VCb2R5UHJvdmlkZXJSZXNvdXJjZSB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQmxvY2tpbmdRdWV1ZTxBc3luY1Jlc3BvbnNlPiBzdXNwZW5kZWQgPSBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPEFzeW5jUmVzcG9uc2U+KDEpOworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInN1c3BlbmQiKQorICAgICAgICBwdWJsaWMgdm9pZCBzdXNwZW5kKEBTdXNwZW5kZWQgZmluYWwgQXN5bmNSZXNwb25zZSBhc3luY1Jlc3BvbnNlKSB7CisgICAgICAgICAgICBzdXNwZW5kZWQuYWRkKGFzeW5jUmVzcG9uc2UpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgic3VzcGVuZC1yZXN1bWUiKQorICAgICAgICBwdWJsaWMgdm9pZCBzdXNwZW5kUmVzdW1lKEBTdXNwZW5kZWQgZmluYWwgQXN5bmNSZXNwb25zZSBhc3luY1Jlc3BvbnNlKSB7CisgICAgICAgICAgICBhc3luY1Jlc3BvbnNlLnJlc3VtZShuZXcgRW50aXR5QW5ub3RhdGlvbkNoZWNrZXIoKSk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJyZXN1bWUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHJlc3VtZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIHN1c3BlbmRlZC50YWtlKCkucmVzdW1lKG5ldyBFbnRpdHlBbm5vdGF0aW9uQ2hlY2tlcigpKSA/ICJvayIgOiAia28iOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IGVycm9yUmVzb3VyY2UgPSB0YXJnZXQoImFubm90YXRpb25zIik7CisKKyAgICAgICAgZmluYWwgRnV0dXJlPFJlc3BvbnNlPiBzdXNwZW5kZWQgPSBlcnJvclJlc291cmNlLnBhdGgoInN1c3BlbmQiKS5yZXF1ZXN0KCkuYXN5bmMoKS5nZXQoKTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSBlcnJvclJlc291cmNlLnBhdGgoInJlc3VtZSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGlzKCJvayIpKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSBzdXNwZW5kZWRSZXNwb25zZSA9IHN1c3BlbmRlZC5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgiRW50aXR5IGFubm90YXRpb25zIGFyZSBub3QgcHJvcGFnYXRlZCB0byBNQlcuIiwgc3VzcGVuZGVkUmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBpcygib2siKSk7CisgICAgICAgIHN1c3BlbmRlZFJlc3BvbnNlLmNsb3NlKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGlvbnNTdXNwZW5kUmVzdW1lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJhbm5vdGF0aW9ucyIpLnBhdGgoInN1c3BlbmQtcmVzdW1lIikucmVxdWVzdCgpLmFzeW5jKCkuZ2V0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQoIkVudGl0eSBhbm5vdGF0aW9ucyBhcmUgbm90IHByb3BhZ2F0ZWQgdG8gTUJXLiIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoIm9rIikpOworICAgICAgICByZXNwb25zZS5jbG9zZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0JlYW5QYXJhbUV4Y2VwdGlvblRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0JlYW5QYXJhbUV4Y2VwdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTdmMzcxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvQmVhblBhcmFtRXhjZXB0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjEyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5CZWFuUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LkV4Y2VwdGlvbk1hcHBlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUGFyYW1Db252ZXJ0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlBhcmFtQ29udmVydGVyUHJvdmlkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamFja3Nvbi5pbnRlcm5hbC5qYWNrc29uLmpheHJzLmpzb24uSmFja3NvbkpheGJKc29uUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlBhcmFtRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uYW5ub3RhdGlvbi5Kc29uUHJvcGVydHk7CisKKy8qKgorICogVGVzdHMgdGhlIGFiaWxpdHkgdG8gY2F0Y2ggV2ViQXBwbGljYXRpb25FeGNlcHRpb24gdGhyb3duIGluIFBhcmFtQ29udmVydGVyCisgKiB1c2VkIGFsb25nIHdpdGggQmVhblBhcmFtIGFubm90YXRpb24uCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKiovCitwdWJsaWMgY2xhc3MgQmVhblBhcmFtRXhjZXB0aW9uVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBBUkFNX05PVF9GT1VORCA9ICJ7XCJtZXNzYWdlXCI6XCJUaGlzIHBhcmFtZXRlciB3YXMgbm90IGZvdW5kXCIsXCJzdGF0dXNcIjo0MDB9IjsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoCisgICAgICAgICAgICAgICAgQmVhblBhcmFtQ29udHJvbGxlci5jbGFzcywKKyAgICAgICAgICAgICAgICBNb2RlbE9iamVjdFBhcmFtQ29udmVydGVyLmNsYXNzLAorICAgICAgICAgICAgICAgIFF1ZXJ5UGFyYW1FcnJvck1hcHBlci5jbGFzcywKKyAgICAgICAgICAgICAgICBKYWNrc29uSmF4Ykpzb25Qcm92aWRlci5jbGFzcyk7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCZWFuUGFyYW1Db250cm9sbGVyIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCIvcXVlcnkiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHF1ZXJ5UGFyYW0oQFF1ZXJ5UGFyYW0oInF1ZXJ5UGFyYW0iKSBmaW5hbCBNb2RlbE9iamVjdCBtb2RlbE9iamVjdCkgeworICAgICAgICAgICAgcmV0dXJuICJRdWVyeSBQYXJhbTogIiArIG1vZGVsT2JqZWN0LnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCIvYmVhbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgYmVhblBhcmFtKEBCZWFuUGFyYW0gZmluYWwgQmVhblBhcmFtT2JqZWN0IGJlYW5QYXJhbU9iamVjdCkgeworICAgICAgICAgICAgcmV0dXJuICJCZWFuIFBhcmFtOiAiICsgYmVhblBhcmFtT2JqZWN0LmdldE1vZGVsT2JqZWN0KCkudG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNb2RlbE9iamVjdFBhcmFtQ29udmVydGVyIGltcGxlbWVudHMgUGFyYW1Db252ZXJ0ZXI8TW9kZWxPYmplY3Q+LCBQYXJhbUNvbnZlcnRlclByb3ZpZGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE1vZGVsT2JqZWN0IGZyb21TdHJpbmcoZmluYWwgU3RyaW5nIHMpIHsKKyAgICAgICAgICAgIGlmICgiZXhjZXB0aW9uIi5lcXVhbHNJZ25vcmVDYXNlKHMpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJhZFBhcmFtZXRlckV4Y2VwdGlvbigiVGhpcyBwYXJhbWV0ZXIgd2FzIG5vdCBmb3VuZCIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBNb2RlbE9iamVjdChzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKE1vZGVsT2JqZWN0IG1vZGVsT2JqZWN0KSB7CisgICAgICAgICAgICByZXR1cm4gbW9kZWxPYmplY3QudG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgcHVibGljIDxUPiBQYXJhbUNvbnZlcnRlcjxUPiBnZXRDb252ZXJ0ZXIoQ2xhc3M8VD4gYUNsYXNzLCBUeXBlIHR5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucykgeworICAgICAgICAgICAgcmV0dXJuIGFDbGFzcy5nZXROYW1lKCkuZXF1YWxzKE1vZGVsT2JqZWN0LmNsYXNzLmdldE5hbWUoKSkgPyAoUGFyYW1Db252ZXJ0ZXI8VD4pIHRoaXMgOiBudWxsOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBRdWVyeVBhcmFtRXJyb3JNYXBwZXIgaW1wbGVtZW50cyBFeGNlcHRpb25NYXBwZXI8UGFyYW1FeGNlcHRpb24uUXVlcnlQYXJhbUV4Y2VwdGlvbj4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgdG9SZXNwb25zZShmaW5hbCBQYXJhbUV4Y2VwdGlvbi5RdWVyeVBhcmFtRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFJlc3BvbnNlLlN0YXR1cyBzdGF0dXMgPSBSZXNwb25zZS5TdGF0dXMuQkFEX1JFUVVFU1Q7CisgICAgICAgICAgICBmaW5hbCBUaHJvd2FibGUgY2F1c2UgPSBlLmdldENhdXNlKCk7CisgICAgICAgICAgICBpZiAoY2F1c2UgaW5zdGFuY2VvZiBCYWRQYXJhbWV0ZXJFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKHN0YXR1cykuZW50aXR5KG5ldyBFcnJvck1lc3NhZ2Uoc3RhdHVzLmdldFN0YXR1c0NvZGUoKSwgY2F1c2UuZ2V0TWVzc2FnZSgpKSkuYnVpbGQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFyc2hhbGxFeGNlcHRpb25RdWVyeSgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJxdWVyeSIpLnF1ZXJ5UGFyYW0oInF1ZXJ5UGFyYW0iLCAiZXhjZXB0aW9uIikKKyAgICAgICAgICAgICAgICAucmVxdWVzdChNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhQQVJBTV9OT1RfRk9VTkQsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFyc2hhbGxFeGNlcHRpb25CZWFuKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoImJlYW4iKS5xdWVyeVBhcmFtKCJxdWVyeVBhcmFtIiwgImV4Y2VwdGlvbiIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUEFSQU1fTk9UX0ZPVU5ELCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hcnNoYWxsTW9kZWxRdWVyeSgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJxdWVyeSIpLnF1ZXJ5UGFyYW0oInF1ZXJ5UGFyYW0iLCAibW9kZWwiKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUpLmdldCgpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJRdWVyeSBQYXJhbTogbW9kZWwiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hcnNoYWxsTW9kZWxCZWFuKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoImJlYW4iKS5xdWVyeVBhcmFtKCJxdWVyeVBhcmFtIiwgIm1vZGVsIikKKyAgICAgICAgICAgICAgICAucmVxdWVzdChNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiQmVhbiBQYXJhbTogbW9kZWwiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEJhZFBhcmFtZXRlckV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworCisgICAgICAgIHB1YmxpYyBCYWRQYXJhbWV0ZXJFeGNlcHRpb24oZmluYWwgU3RyaW5nIHMpIHsKKyAgICAgICAgICAgIHN1cGVyKHMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCZWFuUGFyYW1PYmplY3QgeworCisgICAgICAgIGZpbmFsIE1vZGVsT2JqZWN0IG1vZGVsT2JqZWN0OworCisgICAgICAgIHB1YmxpYyBCZWFuUGFyYW1PYmplY3QoQFF1ZXJ5UGFyYW0oInF1ZXJ5UGFyYW0iKSBmaW5hbCBNb2RlbE9iamVjdCBtb2RlbE9iamVjdCkgeworICAgICAgICAgICAgdGhpcy5tb2RlbE9iamVjdCA9IG1vZGVsT2JqZWN0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE1vZGVsT2JqZWN0IGdldE1vZGVsT2JqZWN0KCkgeworICAgICAgICAgICAgcmV0dXJuIG1vZGVsT2JqZWN0OworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNb2RlbE9iamVjdCB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcHJpdmF0ZURhdGE7CisKKyAgICAgICAgcHVibGljIE1vZGVsT2JqZWN0KGZpbmFsIFN0cmluZyBwcml2YXRlRGF0YSkgeworICAgICAgICAgICAgdGhpcy5wcml2YXRlRGF0YSA9IHByaXZhdGVEYXRhOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gcHJpdmF0ZURhdGE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEVycm9yTWVzc2FnZSB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbWVzc2FnZTsKKworICAgICAgICBwcml2YXRlIGZpbmFsIGludCBzdGF0dXM7CisKKyAgICAgICAgcHVibGljIEVycm9yTWVzc2FnZShmaW5hbCBpbnQgc3RhdHVzLCBmaW5hbCBTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzOworICAgICAgICB9CisKKyAgICAgICAgQEpzb25Qcm9wZXJ0eQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CisgICAgICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICAgICAgfQorCisgICAgICAgIEBKc29uUHJvcGVydHkKKyAgICAgICAgcHVibGljIGludCBnZXRTdGF0dXMoKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9CZWFuUGFyYW1UZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9CZWFuUGFyYW1UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I3MmIzZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0JlYW5QYXJhbVRlc3QuamF2YQpAQCAtMCwwICsxLDQ5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworaW1wb3J0IGphdmF4LndzLnJzLkJlYW5QYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Db29raWVQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5FbmNvZGVkOworaW1wb3J0IGphdmF4LndzLnJzLkZvcm1QYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5IZWFkZXJQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5NYXRyaXhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZvcm07CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXF1ZXN0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBUZXN0cyB7QGxpbmsgQmVhblBhcmFtIGJlYW4gcGFyYW0gaW5qZWN0aW9uc30uCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgY2xhc3MgQmVhblBhcmFtVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBSZXNvdXJjZUluaXRpYWxpemVkQnlTZXR0ZXIuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgY29tcGFyZUJlYW5XaXRoU3RhbmRhcmRQYXJhbXMoKSB7CisgICAgICAgIEZ1bGxCZWFuIGJlYW4gPSBnZXRGdWxsQmVhbigpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IGRvUmVxdWVzdChiZWFuLCAicmVzb3VyY2UvY29tcGFyZUJlYW4iKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygidHJ1ZSIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlRnVsbEJlYW4oKSB7CisgICAgICAgIEZ1bGxCZWFuIGJlYW4gPSBnZXRGdWxsQmVhbigpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IGRvUmVxdWVzdChiZWFuLCAicmVzb3VyY2Uvc2luZ2xlQmVhbiIpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGJlYW4udG9TdHJpbmcoKSwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVDb25zdHJ1Y3RvckluaXRpYWxpemVkQmVhbigpIHsKKyAgICAgICAgRnVsbEJlYW4gYmVhbiA9IGdldEZ1bGxCZWFuKCk7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gZG9SZXF1ZXN0KGJlYW4sICJyZXNvdXJjZS9jb25zdHJ1Y3RvckJlYW4iKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhiZWFuLnRvU3RyaW5nKCksIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHdvRnVsbEJlYW5zKCkgeworICAgICAgICBGdWxsQmVhbiBiZWFuID0gZ2V0RnVsbEJlYW4oKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSBkb1JlcXVlc3QoYmVhbiwgInJlc291cmNlL3R3b0JlYW5zIik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYmVhbi50b1N0cmluZygpICsgIiAvICIgKyBiZWFuLnRvU3RyaW5nKCksIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHdvRGlmZmVyZW50QmVhbnMoKSB7CisgICAgICAgIEZ1bGxCZWFuIGZ1bGxCZWFuID0gZ2V0RnVsbEJlYW4oKTsKKyAgICAgICAgU21hbGxCZWFuIHNtYWxsQmVhbiA9IG5ldyBTbWFsbEJlYW4oZnVsbEJlYW4pOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IGRvUmVxdWVzdChmdWxsQmVhbiwgInJlc291cmNlL2RpZmZlcmVudEJlYW5zIik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZnVsbEJlYW4udG9TdHJpbmcoKSArICIgLyAiICsgc21hbGxCZWFuLnRvU3RyaW5nKCksIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW5jb2RlZEJlYW4oKSB7CisgICAgICAgIEZ1bGxCZWFuIGZ1bGxCZWFuID0gZ2V0RnVsbEJlYW4oKTsKKyAgICAgICAgZnVsbEJlYW4uc2V0UXVlcnlQYXJhbSgiZW5jb2RlZC9hPyYmKy4vPyIpOworICAgICAgICBmdWxsQmVhbi5zZXRNYXRyaXhQYXJhbSgibm90LWVuY29kZWQvYT8mJisuLz8iKTsKKworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IGRvUmVxdWVzdChmdWxsQmVhbiwgInJlc291cmNlL2VuY29kZWRCZWFuIik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgRW5jb2RlZEJlYW4gYmVhbiA9IG5ldyBFbmNvZGVkQmVhbigibm90LWVuY29kZWQvYT8mJisuLz8iLCAiZW5jb2RlZCUyRmElM0YlMjYlMjYlMkIuJTJGJTNGIik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYmVhbi50b1N0cmluZygpLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIHByaXZhdGUgUmVzcG9uc2UgZG9SZXF1ZXN0KEZ1bGxCZWFuIGJlYW4sIFN0cmluZyBwYXRoKSB7CisgICAgICAgIGZpbmFsIEZvcm0gZm9ybSA9IG5ldyBGb3JtKCk7CisgICAgICAgIGZvcm0uYXNNYXAoKS5wdXQoImZvcm0iLCBBcnJheXMuYXNMaXN0KGJlYW4uZ2V0Rm9ybVBhcmFtKCkpKTsKKworICAgICAgICByZXR1cm4gdGFyZ2V0KCkucGF0aChwYXRoKS5wYXRoKGJlYW4uZ2V0UGF0aFBhcmFtKCkpLm1hdHJpeFBhcmFtKCJtYXRyaXgiLAorICAgICAgICAgICAgICAgIGJlYW4uZ2V0TWF0cml4UGFyYW0oKSkucXVlcnlQYXJhbSgicXVlcnkiLAorICAgICAgICAgICAgICAgIGJlYW4uZ2V0UXVlcnlQYXJhbSgpKS5yZXF1ZXN0KCkuaGVhZGVyKCJoZWFkZXIiLCBiZWFuLmdldEhlYWRlclBhcmFtKCkpLmNvb2tpZSgiY29va2llIiwKKyAgICAgICAgICAgICAgICBiZWFuLmdldENvb2tpZSgpKS5wb3N0KEVudGl0eS5lbnRpdHkoZm9ybSwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0ZPUk1fVVJMRU5DT0RFRF9UWVBFKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBGdWxsQmVhbiBnZXRGdWxsQmVhbigpIHsKKyAgICAgICAgRnVsbEJlYW4gYmVhbiA9IG5ldyBGdWxsQmVhbigpOworICAgICAgICBiZWFuLnNldFBhdGhQYXJhbSgicGF0aFBhcmFtZXRlciIpOworICAgICAgICBiZWFuLnNldE1hdHJpeFBhcmFtKCJtYXRyaXhQYXJhbWV0ZXIiKTsKKyAgICAgICAgYmVhbi5zZXRRdWVyeVBhcmFtKCJxdWVyeVBhcmFtZXRlciIpOworICAgICAgICBiZWFuLnNldEhlYWRlclBhcmFtKCJoZWFkZXJQYXJhbWV0ZXIiKTsKKyAgICAgICAgYmVhbi5zZXRDb29raWUoImNvb2tpZVBhcmFtZXRlciIpOworICAgICAgICBiZWFuLnNldEZvcm1QYXJhbSgiZm9ybVBhcmFtZXRlciIpOworICAgICAgICBiZWFuLnNldE92ZXJyaWRlUmVxdWVzdE51bGwodHJ1ZSk7CisgICAgICAgIHJldHVybiBiZWFuOworICAgIH0KKworICAgIEBQYXRoKCJyZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoInNpbmdsZUJlYW4ve3BhdGh9IikKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0QmVhblBhcmFtKEBCZWFuUGFyYW0gRnVsbEJlYW4gYmVhbikgeworICAgICAgICAgICAgcmV0dXJuIGJlYW4gPT0gbnVsbCA/ICJmYWlsOiBiZWFuIHBhcmFtIGlzIG51bGwhISEiIDogYmVhbi50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoImNvbnN0cnVjdG9yQmVhbi97cGF0aH0iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGNvbnN0cnVjdG9yQmVhblBhcmFtKEBCZWFuUGFyYW0gQ29uc3RydWN0b3JJbml0aWFsaXplZEJlYW4gYmVhbikgeworICAgICAgICAgICAgcmV0dXJuIGJlYW4gPT0gbnVsbCA/ICJmYWlsOiBiZWFuIHBhcmFtIGlzIG51bGwhISEiIDogYmVhbi50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoImNvbXBhcmVCZWFuL3twYXRofSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgY29tcGFyZUJlYW5QYXJhbShAQmVhblBhcmFtIENvbnN0cnVjdG9ySW5pdGlhbGl6ZWRCZWFuIGJlYW4sIEBDb29raWVQYXJhbSgiY29va2llIikgU3RyaW5nIGNvb2tpZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBGb3JtUGFyYW0oImZvcm0iKSBTdHJpbmcgZm9ybVBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQEhlYWRlclBhcmFtKCJoZWFkZXIiKSBTdHJpbmcgaGVhZGVyUGFyYW0sIEBNYXRyaXhQYXJhbSgibWF0cml4IikgU3RyaW5nIG1hdHJpeFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQFF1ZXJ5UGFyYW0oInF1ZXJ5IikgU3RyaW5nIHF1ZXJ5UGFyYW0sIEBQYXRoUGFyYW0oInBhdGgiKSBTdHJpbmcgcGF0aFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQENvbnRleHQgUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgICAgICBDb25zdHJ1Y3RvckluaXRpYWxpemVkQmVhbiBuZXdCZWFuID0gbmV3IENvbnN0cnVjdG9ySW5pdGlhbGl6ZWRCZWFuKGNvb2tpZSwgZm9ybVBhcmFtLAorICAgICAgICAgICAgICAgICAgICBoZWFkZXJQYXJhbSwgbWF0cml4UGFyYW0sCisgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW0sIHBhdGhQYXJhbSwgcmVxdWVzdCk7CisKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZihiZWFuLnRvU3RyaW5nKCkuZXF1YWxzKG5ld0JlYW4udG9TdHJpbmcoKSkpOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoInR3b0JlYW5zL3twYXRofSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdFR3b1NhbWVCZWFucyhAQmVhblBhcmFtIEZ1bGxCZWFuIGJlYW4xLCBAQmVhblBhcmFtIEZ1bGxCZWFuIGJlYW4yKSB7CisgICAgICAgICAgICBpZiAoYmVhbjEgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiAiZmFpbDogYmVhbjEgcGFyYW0gaXMgbnVsbCEhISI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYmVhbjIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiAiZmFpbDogYmVhbjIgcGFyYW0gaXMgbnVsbCEhISI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYmVhbjEudG9TdHJpbmcoKSArICIgLyAiICsgYmVhbjIudG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJkaWZmZXJlbnRCZWFucy97cGF0aH0iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3RUd29EaWZmZXJlbnRCZWFucyhAQmVhblBhcmFtIEZ1bGxCZWFuIGJlYW4xLCBAQmVhblBhcmFtIFNtYWxsQmVhbiBiZWFuMikgeworICAgICAgICAgICAgaWYgKGJlYW4xID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gImZhaWw6IGJlYW4xIHBhcmFtIGlzIG51bGwhISEiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGJlYW4yID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gImZhaWw6IGJlYW4yIHBhcmFtIGlzIG51bGwhISEiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGJlYW4xLnRvU3RyaW5nKCkgKyAiIC8gIiArIGJlYW4yLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgiZW5jb2RlZEJlYW4ve3BhdGh9IikKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0RW5jb2RlZFBhcmFtKEBCZWFuUGFyYW0gRW5jb2RlZEJlYW4gYmVhbikgeworICAgICAgICAgICAgcmV0dXJuIGJlYW4gPT0gbnVsbCA/ICJmYWlsOiBiZWFuIHBhcmFtIGlzIG51bGwhISEiIDogYmVhbi50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNtYWxsQmVhbiB7CisKKyAgICAgICAgQEhlYWRlclBhcmFtKCJoZWFkZXIiKQorICAgICAgICBwcml2YXRlIFN0cmluZyBoZWFkZXJQYXJhbTsKKworICAgICAgICBAUGF0aFBhcmFtKCJwYXRoIikKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcGF0aFBhcmFtOworCisgICAgICAgIHB1YmxpYyBTbWFsbEJlYW4oRnVsbEJlYW4gYmVhbikgeworICAgICAgICAgICAgaGVhZGVyUGFyYW0gPSBiZWFuLmdldEhlYWRlclBhcmFtKCk7CisgICAgICAgICAgICBwYXRoUGFyYW0gPSBiZWFuLmdldFBhdGhQYXJhbSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFNtYWxsQmVhbigpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJTbWFsbEJlYW57IgorICAgICAgICAgICAgICAgICAgICArICJoZWFkZXJQYXJhbT0nIiArIGhlYWRlclBhcmFtICsgJ1wnJworICAgICAgICAgICAgICAgICAgICArICIsIHBhdGhQYXJhbT0nIiArIHBhdGhQYXJhbSArICdcJycKKyAgICAgICAgICAgICAgICAgICAgKyAnfSc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEVuY29kZWRCZWFuIHsKKworICAgICAgICBATWF0cml4UGFyYW0oIm1hdHJpeCIpCisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1hdHJpeFBhcmFtOworCisgICAgICAgIEBFbmNvZGVkCisgICAgICAgIEBRdWVyeVBhcmFtKCJxdWVyeSIpCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHF1ZXJ5UGFyYW07CisKKyAgICAgICAgcHVibGljIEVuY29kZWRCZWFuKFN0cmluZyBtYXRyaXhQYXJhbSwgU3RyaW5nIHF1ZXJ5UGFyYW0pIHsKKyAgICAgICAgICAgIHRoaXMubWF0cml4UGFyYW0gPSBtYXRyaXhQYXJhbTsKKyAgICAgICAgICAgIHRoaXMucXVlcnlQYXJhbSA9IHF1ZXJ5UGFyYW07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgRW5jb2RlZEJlYW4oKSB7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiRW5jb2RlZEJlYW57IgorICAgICAgICAgICAgICAgICAgICArICJtYXRyaXhQYXJhbT0nIiArIG1hdHJpeFBhcmFtICsgJ1wnJworICAgICAgICAgICAgICAgICAgICArICIsIHF1ZXJ5UGFyYW09JyIgKyBxdWVyeVBhcmFtICsgJ1wnJworICAgICAgICAgICAgICAgICAgICArICd9JzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRnVsbEJlYW4geworCisgICAgICAgIEBIZWFkZXJQYXJhbSgiaGVhZGVyIikKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgaGVhZGVyUGFyYW07CisKKyAgICAgICAgQFBhdGhQYXJhbSgicGF0aCIpCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHBhdGhQYXJhbTsKKworICAgICAgICBATWF0cml4UGFyYW0oIm1hdHJpeCIpCisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1hdHJpeFBhcmFtOworCisgICAgICAgIEBRdWVyeVBhcmFtKCJxdWVyeSIpCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHF1ZXJ5UGFyYW07CisKKyAgICAgICAgQENvb2tpZVBhcmFtKCJjb29raWUiKQorICAgICAgICBwcml2YXRlIFN0cmluZyBjb29raWU7CisKKyAgICAgICAgQEZvcm1QYXJhbSgiZm9ybSIpCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGZvcm1QYXJhbTsKKworICAgICAgICBAQ29udGV4dAorICAgICAgICBwcml2YXRlIFJlcXVlc3QgcmVxdWVzdDsKKworICAgICAgICBwcml2YXRlIGJvb2xlYW4gb3ZlcnJpZGVSZXF1ZXN0TnVsbDsKKworICAgICAgICBwdWJsaWMgRnVsbEJlYW4oKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvb2tpZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBjb29raWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRDb29raWUoU3RyaW5nIGNvb2tpZSkgeworICAgICAgICAgICAgdGhpcy5jb29raWUgPSBjb29raWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEZvcm1QYXJhbSgpIHsKKyAgICAgICAgICAgIHJldHVybiBmb3JtUGFyYW07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRGb3JtUGFyYW0oU3RyaW5nIGZvcm1QYXJhbSkgeworICAgICAgICAgICAgdGhpcy5mb3JtUGFyYW0gPSBmb3JtUGFyYW07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEhlYWRlclBhcmFtKCkgeworICAgICAgICAgICAgcmV0dXJuIGhlYWRlclBhcmFtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0SGVhZGVyUGFyYW0oU3RyaW5nIGhlYWRlclBhcmFtKSB7CisgICAgICAgICAgICB0aGlzLmhlYWRlclBhcmFtID0gaGVhZGVyUGFyYW07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1hdHJpeFBhcmFtKCkgeworICAgICAgICAgICAgcmV0dXJuIG1hdHJpeFBhcmFtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0TWF0cml4UGFyYW0oU3RyaW5nIG1hdHJpeFBhcmFtKSB7CisgICAgICAgICAgICB0aGlzLm1hdHJpeFBhcmFtID0gbWF0cml4UGFyYW07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGhQYXJhbSgpIHsKKyAgICAgICAgICAgIHJldHVybiBwYXRoUGFyYW07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRQYXRoUGFyYW0oU3RyaW5nIHBhdGhQYXJhbSkgeworICAgICAgICAgICAgdGhpcy5wYXRoUGFyYW0gPSBwYXRoUGFyYW07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFF1ZXJ5UGFyYW0oKSB7CisgICAgICAgICAgICByZXR1cm4gcXVlcnlQYXJhbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFF1ZXJ5UGFyYW0oU3RyaW5nIHF1ZXJ5UGFyYW0pIHsKKyAgICAgICAgICAgIHRoaXMucXVlcnlQYXJhbSA9IHF1ZXJ5UGFyYW07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgUmVxdWVzdCBnZXRSZXF1ZXN0KCkgeworICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3Q7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRSZXF1ZXN0KFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICAgICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzT3ZlcnJpZGVSZXF1ZXN0TnVsbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBvdmVycmlkZVJlcXVlc3ROdWxsOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0T3ZlcnJpZGVSZXF1ZXN0TnVsbChib29sZWFuIG92ZXJyaWRlUmVxdWVzdE51bGwpIHsKKyAgICAgICAgICAgIHRoaXMub3ZlcnJpZGVSZXF1ZXN0TnVsbCA9IG92ZXJyaWRlUmVxdWVzdE51bGw7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFN0cmluZyByZXF1ZXN0VG9TdHJpbmcoKSB7CisgICAgICAgICAgICBpZiAob3ZlcnJpZGVSZXF1ZXN0TnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiAibm90LW51bGwiOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVxdWVzdCA9PSBudWxsID8gIm51bGwiIDogIm5vdC1udWxsIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJCZWFueyIKKyAgICAgICAgICAgICAgICAgICAgKyAiY29va2llPSciICsgY29va2llICsgJ1wnJworICAgICAgICAgICAgICAgICAgICArICIsIGZvcm1QYXJhbT0nIiArIGZvcm1QYXJhbSArICdcJycKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBoZWFkZXJQYXJhbT0nIiArIGhlYWRlclBhcmFtICsgJ1wnJworICAgICAgICAgICAgICAgICAgICArICIsIG1hdHJpeFBhcmFtPSciICsgbWF0cml4UGFyYW0gKyAnXCcnCisgICAgICAgICAgICAgICAgICAgICsgIiwgcGF0aFBhcmFtPSciICsgcGF0aFBhcmFtICsgJ1wnJworICAgICAgICAgICAgICAgICAgICArICIsIHF1ZXJ5UGFyYW09JyIgKyBxdWVyeVBhcmFtICsgJ1wnJworICAgICAgICAgICAgICAgICAgICArICIsIHJlcXVlc3Q9JyIgKyByZXF1ZXN0VG9TdHJpbmcoKSArICInIgorICAgICAgICAgICAgICAgICAgICArICd9JzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29uc3RydWN0b3JJbml0aWFsaXplZEJlYW4geworCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGhlYWRlclBhcmFtOworICAgICAgICBwcml2YXRlIFN0cmluZyBwYXRoUGFyYW07CisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1hdHJpeFBhcmFtOworICAgICAgICBwcml2YXRlIFN0cmluZyBxdWVyeVBhcmFtOworICAgICAgICBwcml2YXRlIFN0cmluZyBjb29raWU7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIGZvcm1QYXJhbTsKKyAgICAgICAgcHJpdmF0ZSBSZXF1ZXN0IHJlcXVlc3Q7CisKKyAgICAgICAgcHVibGljIENvbnN0cnVjdG9ySW5pdGlhbGl6ZWRCZWFuKEBDb29raWVQYXJhbSgiY29va2llIikgU3RyaW5nIGNvb2tpZSwgQEZvcm1QYXJhbSgiZm9ybSIpIFN0cmluZyBmb3JtUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBASGVhZGVyUGFyYW0oImhlYWRlciIpIFN0cmluZyBoZWFkZXJQYXJhbSwgQE1hdHJpeFBhcmFtKCJtYXRyaXgiKSBTdHJpbmcgbWF0cml4UGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAUXVlcnlQYXJhbSgicXVlcnkiKSBTdHJpbmcgcXVlcnlQYXJhbSwgQFBhdGhQYXJhbSgicGF0aCIpIFN0cmluZyBwYXRoUGFyYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAQ29udGV4dCBSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgICAgIHRoaXMuY29va2llID0gY29va2llOworICAgICAgICAgICAgdGhpcy5mb3JtUGFyYW0gPSBmb3JtUGFyYW07CisgICAgICAgICAgICB0aGlzLmhlYWRlclBhcmFtID0gaGVhZGVyUGFyYW07CisgICAgICAgICAgICB0aGlzLm1hdHJpeFBhcmFtID0gbWF0cml4UGFyYW07CisgICAgICAgICAgICB0aGlzLnF1ZXJ5UGFyYW0gPSBxdWVyeVBhcmFtOworICAgICAgICAgICAgdGhpcy5wYXRoUGFyYW0gPSBwYXRoUGFyYW07CisgICAgICAgICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG92ZXJyaWRlUmVxdWVzdE51bGw7CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb29raWUoKSB7CisgICAgICAgICAgICByZXR1cm4gY29va2llOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Q29va2llKFN0cmluZyBjb29raWUpIHsKKyAgICAgICAgICAgIHRoaXMuY29va2llID0gY29va2llOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRGb3JtUGFyYW0oKSB7CisgICAgICAgICAgICByZXR1cm4gZm9ybVBhcmFtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Rm9ybVBhcmFtKFN0cmluZyBmb3JtUGFyYW0pIHsKKyAgICAgICAgICAgIHRoaXMuZm9ybVBhcmFtID0gZm9ybVBhcmFtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRIZWFkZXJQYXJhbSgpIHsKKyAgICAgICAgICAgIHJldHVybiBoZWFkZXJQYXJhbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEhlYWRlclBhcmFtKFN0cmluZyBoZWFkZXJQYXJhbSkgeworICAgICAgICAgICAgdGhpcy5oZWFkZXJQYXJhbSA9IGhlYWRlclBhcmFtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRNYXRyaXhQYXJhbSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtYXRyaXhQYXJhbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE1hdHJpeFBhcmFtKFN0cmluZyBtYXRyaXhQYXJhbSkgeworICAgICAgICAgICAgdGhpcy5tYXRyaXhQYXJhbSA9IG1hdHJpeFBhcmFtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRQYXRoUGFyYW0oKSB7CisgICAgICAgICAgICByZXR1cm4gcGF0aFBhcmFtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UGF0aFBhcmFtKFN0cmluZyBwYXRoUGFyYW0pIHsKKyAgICAgICAgICAgIHRoaXMucGF0aFBhcmFtID0gcGF0aFBhcmFtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRRdWVyeVBhcmFtKCkgeworICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5UGFyYW07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRRdWVyeVBhcmFtKFN0cmluZyBxdWVyeVBhcmFtKSB7CisgICAgICAgICAgICB0aGlzLnF1ZXJ5UGFyYW0gPSBxdWVyeVBhcmFtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFJlcXVlc3QgZ2V0UmVxdWVzdCgpIHsKKyAgICAgICAgICAgIHJldHVybiByZXF1ZXN0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UmVxdWVzdChSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc092ZXJyaWRlUmVxdWVzdE51bGwoKSB7CisgICAgICAgICAgICByZXR1cm4gb3ZlcnJpZGVSZXF1ZXN0TnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE92ZXJyaWRlUmVxdWVzdE51bGwoYm9vbGVhbiBvdmVycmlkZVJlcXVlc3ROdWxsKSB7CisgICAgICAgICAgICB0aGlzLm92ZXJyaWRlUmVxdWVzdE51bGwgPSBvdmVycmlkZVJlcXVlc3ROdWxsOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcmVxdWVzdFRvU3RyaW5nKCkgeworICAgICAgICAgICAgaWYgKG92ZXJyaWRlUmVxdWVzdE51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIm5vdC1udWxsIjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3QgPT0gbnVsbCA/ICJudWxsIiA6ICJub3QtbnVsbCI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiQmVhbnsiCisgICAgICAgICAgICAgICAgICAgICsgImNvb2tpZT0nIiArIGNvb2tpZSArICdcJycKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBmb3JtUGFyYW09JyIgKyBmb3JtUGFyYW0gKyAnXCcnCisgICAgICAgICAgICAgICAgICAgICsgIiwgaGVhZGVyUGFyYW09JyIgKyBoZWFkZXJQYXJhbSArICdcJycKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBtYXRyaXhQYXJhbT0nIiArIG1hdHJpeFBhcmFtICsgJ1wnJworICAgICAgICAgICAgICAgICAgICArICIsIHBhdGhQYXJhbT0nIiArIHBhdGhQYXJhbSArICdcJycKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBxdWVyeVBhcmFtPSciICsgcXVlcnlQYXJhbSArICdcJycKKyAgICAgICAgICAgICAgICAgICAgKyAiLCByZXF1ZXN0PSciICsgcmVxdWVzdFRvU3RyaW5nKCkgKyAiJyIKKyAgICAgICAgICAgICAgICAgICAgKyAnfSc7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicmVzb3VyY2Utc2V0dGVyIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlSW5pdGlhbGl6ZWRCeVNldHRlciB7CisKKyAgICAgICAgcHJpdmF0ZSBGdWxsQmVhbiBmdWxsQmVhbjsKKworICAgICAgICBAQmVhblBhcmFtCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEZ1bGxCZWFuKEZ1bGxCZWFuIGZ1bGxCZWFuKSB7CisgICAgICAgICAgICB0aGlzLmZ1bGxCZWFuID0gZnVsbEJlYW47CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgie3BhdGh9IikKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0KCkgeworICAgICAgICAgICAgcmV0dXJuIGZ1bGxCZWFuLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUluaXRpYWxpemVkQnlTZXR0ZXIoKSB7CisgICAgICAgIEZ1bGxCZWFuIGJlYW4gPSBnZXRGdWxsQmVhbigpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IGRvUmVxdWVzdChiZWFuLCAicmVzb3VyY2Utc2V0dGVyIik7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYmVhbi50b1N0cmluZygpLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvQnJvYWRjYXN0ZXJUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9Ccm9hZGNhc3RlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTk2N2NjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvQnJvYWRjYXN0ZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQnJvYWRjYXN0ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkJyb2FkY2FzdGVyTGlzdGVuZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNodW5rZWRPdXRwdXQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIEJyb2FkY2FzdGVyVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworICAgIHN0YXRpYyBCcm9hZGNhc3RlcjxTdHJpbmc+IGJyb2FkY2FzdGVyID0gbmV3IEJyb2FkY2FzdGVyPFN0cmluZz4oKSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkNsb3NlKENodW5rZWRPdXRwdXQ8U3RyaW5nPiBzdHJpbmdDaHVua2VkT3V0cHV0KSB7CisgICAgICAgICAgICBjbG9zZWRPdXRwdXRzLmFkZChzdHJpbmdDaHVua2VkT3V0cHV0KTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBzdGF0aWMgTGlzdDxDaHVua2VkT3V0cHV0PFN0cmluZz4+IG91dHB1dHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICBzdGF0aWMgTGlzdDxDaHVua2VkT3V0cHV0PFN0cmluZz4+IGNsb3NlZE91dHB1dHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICBzdGF0aWMgaW50IGxpc3RlbmVyQ2xvc2VkID0gMDsKKworICAgIEBQYXRoKCIvdGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVJlc291cmNlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgQ2h1bmtlZE91dHB1dDxTdHJpbmc+IGdldCgpIHsKKyAgICAgICAgICAgIENodW5rZWRPdXRwdXQ8U3RyaW5nPiByZXN1bHQgPSBuZXcgQ2h1bmtlZE91dHB1dDxTdHJpbmc+KCkge307CisKKyAgICAgICAgICAgIC8vIHdyaXRlIHNvbWV0aGluZyB0byBlbnN1cmUgdGhlIGNsaWVudCBkb2VzIG5vdCBnZXQgYmxvY2tlZCBvbiB3YWl0aW5nIGZvciB0aGUgZmlyc3QgYnl0ZQorICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXN1bHQud3JpdGUoImZpcnN0Q2h1bmsiKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvdXRwdXRzLmFkZChyZXN1bHQpOworICAgICAgICAgICAgYnJvYWRjYXN0ZXIuYWRkKHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0KFN0cmluZyB0ZXh0KSB7CisgICAgICAgICAgICBicm9hZGNhc3Rlci5icm9hZGNhc3QodGV4dCk7CisgICAgICAgICAgICByZXR1cm4gdGV4dDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoTXlSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QnJvYWRjYXN0ZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBJbnB1dFN0cmVhbSBpczEgPSBnZXRDaHVua1N0cmVhbSgpOworICAgICAgICBJbnB1dFN0cmVhbSBpczIgPSBnZXRDaHVua1N0cmVhbSgpOworICAgICAgICBJbnB1dFN0cmVhbSBpczMgPSBnZXRDaHVua1N0cmVhbSgpOworICAgICAgICBJbnB1dFN0cmVhbSBpczQgPSBnZXRDaHVua1N0cmVhbSgpOworCisgICAgICAgIHRhcmdldCgidGVzdCIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS50ZXh0KCJ0ZXh0MSIpKTsKKyAgICAgICAgY2hlY2tDbG9zZWQoMCk7CisgICAgICAgIGNoZWNrU3RyZWFtKCJmaXJzdENodW5rdGV4dDEiLCBpczEsIGlzMiwgaXMzLCBpczQpOworCisgICAgICAgIG91dHB1dHMucmVtb3ZlKDApLmNsb3NlKCk7CisKKyAgICAgICAgdGFyZ2V0KCJ0ZXN0IikucmVxdWVzdCgpLnBvc3QoRW50aXR5LnRleHQoInRleHQyIikpOworICAgICAgICBjaGVja1N0cmVhbSgidGV4dDIiLCBpczIsIGlzMywgaXM0KTsKKyAgICAgICAgY2hlY2tDbG9zZWQoMSk7CisKKyAgICAgICAgb3V0cHV0cy5yZW1vdmUoMCkuY2xvc2UoKTsKKworICAgICAgICBCcm9hZGNhc3Rlckxpc3RlbmVyPFN0cmluZz4gYmwgPSBuZXcgQnJvYWRjYXN0ZXJMaXN0ZW5lcjxTdHJpbmc+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkV4Y2VwdGlvbihDaHVua2VkT3V0cHV0PFN0cmluZz4gc3RyaW5nQ2h1bmtlZFJlc3BvbnNlLCBFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbG9zZShDaHVua2VkT3V0cHV0PFN0cmluZz4gc3RyaW5nQ2h1bmtlZFJlc3BvbnNlKSB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXJDbG9zZWQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBicm9hZGNhc3Rlci5hZGQoYmwpOworCisgICAgICAgIHRhcmdldCgidGVzdCIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS50ZXh0KCJ0ZXh0MyIpKTsKKyAgICAgICAgY2hlY2tDbG9zZWQoMik7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBsaXN0ZW5lckNsb3NlZCk7CisKKyAgICAgICAgYnJvYWRjYXN0ZXIucmVtb3ZlKGJsKTsKKyAgICAgICAgYnJvYWRjYXN0ZXIuY2xvc2VBbGwoKTsKKworICAgICAgICBjaGVja0Nsb3NlZCg0KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGxpc3RlbmVyQ2xvc2VkKTsKKworICAgICAgICBjaGVja1N0cmVhbSgidGV4dDMiLCBpczMsIGlzNCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBnZXRDaHVua1N0cmVhbSgpIHsKKyAgICAgICAgcmV0dXJuIHRhcmdldCgidGVzdCIpLnJlcXVlc3QoKS5nZXQoSW5wdXRTdHJlYW0uY2xhc3MpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja1N0cmVhbShTdHJpbmcgZ29sZGVuLCBJbnB1dFN0cmVhbS4uLiBpbnB1dFN0cmVhbXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGJ5dGVbXSBieXRlcyA9IGdvbGRlbi5nZXRCeXRlcygpOworICAgICAgICBieXRlW10gZW50aXR5ID0gbmV3IGJ5dGVbYnl0ZXMubGVuZ3RoXTsKKyAgICAgICAgZm9yIChJbnB1dFN0cmVhbSBpcyA6IGlucHV0U3RyZWFtcykgeworICAgICAgICAgICAgaW50IGJ5dGVzUmVhZCA9IDA7CisgICAgICAgICAgICBpbnQgcHJldmlvdXMgPSAwOworICAgICAgICAgICAgd2hpbGUgKChieXRlc1JlYWQgKz0gaXMucmVhZChlbnRpdHksIGJ5dGVzUmVhZCwgZW50aXR5Lmxlbmd0aCAtIGJ5dGVzUmVhZCkpIDwgZW50aXR5Lmxlbmd0aAorICAgICAgICAgICAgICAgICAgICAmJiBwcmV2aW91cyAhPSBieXRlc1JlYWQpIHsKKyAgICAgICAgICAgICAgICBwcmV2aW91cyA9IGJ5dGVzUmVhZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhnb2xkZW4sIG5ldyBTdHJpbmcoZW50aXR5KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tDbG9zZWQoaW50IGNvdW50KSB7CisgICAgICAgIGFzc2VydEVxdWFscygiQ2xvc2VkIGNvdW50IGRvZXMgbm90IG1hdGNoIiwgY291bnQsIGNsb3NlZE91dHB1dHMuc2l6ZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9DaHVua2VkSW5wdXRPdXRwdXRUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9DaHVua2VkSW5wdXRPdXRwdXRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlhZWMxMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0NodW5rZWRJbnB1dE91dHB1dFRlc3QuamF2YQpAQCAtMCwwICsxLDIzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuTmFtZUJpbmRpbmc7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY1R5cGU7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvckNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2h1bmtlZElucHV0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5DaHVua2VkT3V0cHV0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5ncmVhdGVyVGhhbk9yRXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBDaHVua2VkIGlucHV0L291dHB1dCB0ZXN0cy4KKyAqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIENodW5rZWRJbnB1dE91dHB1dFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihDaHVua2VkSW5wdXRPdXRwdXRUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHJlc291cmNlLgorICAgICAqLworICAgIEBQYXRoKCIvdGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0UmVzb3VyY2UgeworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IGNodW5rIHN0cmVhbS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBjaHVuayBzdHJlYW0uCisgICAgICAgICAqLworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBDaHVua2VkT3V0cHV0PFN0cmluZz4gZ2V0KCkgeworICAgICAgICAgICAgZmluYWwgQ2h1bmtlZE91dHB1dDxTdHJpbmc+IG91dHB1dCA9IG5ldyBDaHVua2VkT3V0cHV0PD4oU3RyaW5nLmNsYXNzLCAiXHJcbiIpOworCisgICAgICAgICAgICBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC53cml0ZSgidGVzdCIpOworICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LndyaXRlKCJ0ZXN0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQud3JpdGUoInRlc3QiKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5TRVZFUkUsICJFcnJvciB3cml0aW5nIGNodW5rLiIsIGUpOworICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLklORk8sICJFcnJvciBjbG9zaW5nIGNodW5rZWQgb3V0cHV0LiIsIGUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfS5zdGFydCgpOworCisgICAgICAgICAgICByZXR1cm4gb3V0cHV0OworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldCBjaHVuayBzdHJlYW0gd2l0aCBhbiBhdHRhY2hlZCBpbnRlcmNlcHRvci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBpbnRlcmNlcHRlZCBjaHVuayBzdHJlYW0uCisgICAgICAgICAqLworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJpbnRlcmNlcHRlZCIpCisgICAgICAgIEBJbnRlcmNlcHRlZAorICAgICAgICBwdWJsaWMgQ2h1bmtlZE91dHB1dDxTdHJpbmc+IGludGVyY2VwdGVkR2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIGdldCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBpbnRlcmNlcHRvciBiaW5kaW5nLgorICAgICAqLworICAgIEBOYW1lQmluZGluZworICAgIEBUYXJnZXQoe0VsZW1lbnRUeXBlLlRZUEUsIEVsZW1lbnRUeXBlLk1FVEhPRH0pCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgICBwdWJsaWMgc3RhdGljIEBpbnRlcmZhY2UgSW50ZXJjZXB0ZWQgeworCisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBpbnRlcmNlcHRvciAtIGNvdW50cyBudW1iZXIgb2YgaW50ZXJjZXB0aW9uIGFzIHdlbGwgYXMgbnVtYmVyIG9mIHdyYXBwZXIgb3V0cHV0IHN0cmVhbSBtZXRob2QgY2FsbHMuCisgICAgICovCisgICAgQEludGVyY2VwdGVkCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0V3JpdGVySW50ZXJjZXB0b3IgaW1wbGVtZW50cyBXcml0ZXJJbnRlcmNlcHRvciB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXRvbWljSW50ZWdlciBpbnRlcmNlcHRDb3VudGVyID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEF0b21pY0ludGVnZXIgd3JpdGVDb3VudGVyID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEF0b21pY0ludGVnZXIgZmx1c2hDb3VudGVyID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEF0b21pY0ludGVnZXIgY2xvc2VDb3VudGVyID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGFyb3VuZFdyaXRlVG8oZmluYWwgV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgaW50ZXJjZXB0Q291bnRlci5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbSBvdXQgPSBjb250ZXh0LmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgY29udGV4dC5zZXRPdXRwdXRTdHJlYW0obmV3IE91dHB1dFN0cmVhbSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShmaW5hbCBpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgd3JpdGVDb3VudGVyLmluY3JlbWVudEFuZEdldCgpOworICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGUoYik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoZmluYWwgYnl0ZVtdIGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIHdyaXRlQ291bnRlci5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlKGIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKGZpbmFsIGJ5dGVbXSBiLCBmaW5hbCBpbnQgb2ZmLCBmaW5hbCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICB3cml0ZUNvdW50ZXIuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICAgICAgICAgICAgICAgIG91dC53cml0ZShiLCBvZmYsIGxlbik7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICBmbHVzaENvdW50ZXIuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICAgICAgICAgICAgICAgIG91dC5mbHVzaCgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgY2xvc2VDb3VudGVyLmluY3JlbWVudEFuZEdldCgpOworICAgICAgICAgICAgICAgICAgICBvdXQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGNvbnRleHQucHJvY2VlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhUZXN0UmVzb3VyY2UuY2xhc3MsIFRlc3RXcml0ZXJJbnRlcmNlcHRvci5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCByZXRyaWV2aW5nIGNodW5rZWQgcmVzcG9uc2Ugc3RyZWFtIGFzIGEgc2luZ2xlIHJlc3BvbnNlIHN0cmluZy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGluIGNhc2Ugb2YgYSBmYWlsdXJlIGR1cmluZyB0aGUgdGVzdCBleGVjdXRpb24uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2h1bmtlZE91dHB1dFRvU2luZ2xlU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInRlc3QiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHZhbHVlIG9mIGNodW5rZWQgcmVzcG9uc2UgdW5tYXJzaGFsbGVkIGFzIGEgc2luZ2xlIHN0cmluZy4iLAorICAgICAgICAgICAgICAgICJ0ZXN0XHJcbnRlc3RcclxudGVzdFxyXG4iLCByZXNwb25zZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCByZXRyaWV2aW5nIGNodW5rZWQgcmVzcG9uc2Ugc3RyZWFtIHNlcXVlbnRpYWxseSBhcyBpbmRpdmlkdWFsIGNodW5rcyB1c2luZyBjaHVua2VkIGlucHV0LgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24gaW4gY2FzZSBvZiBhIGZhaWx1cmUgZHVyaW5nIHRoZSB0ZXN0IGV4ZWN1dGlvbi4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDaHVua2VkT3V0cHV0VG9DaHVua0lucHV0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENodW5rZWRJbnB1dDxTdHJpbmc+IGlucHV0ID0gdGFyZ2V0KCkucGF0aCgidGVzdCIpLnJlcXVlc3QoKS5nZXQobmV3IEdlbmVyaWNUeXBlPENodW5rZWRJbnB1dDxTdHJpbmc+PigpIHsKKyAgICAgICAgfSk7CisKKyAgICAgICAgaW50IGNvdW50ZXIgPSAwOworICAgICAgICBTdHJpbmcgY2h1bms7CisgICAgICAgIHdoaWxlICgoY2h1bmsgPSBpbnB1dC5yZWFkKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCB2YWx1ZSBvZiBjaHVuayAiICsgY291bnRlciwgInRlc3QiLCBjaHVuayk7CisgICAgICAgICAgICBjb3VudGVyKys7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbnVtYmVkIG9mIHJlY2VpdmVkIGNodW5rcy4iLCAzLCBjb3VudGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHJldHJpZXZpbmcgaW50ZXJjZXB0ZWQgY2h1bmtlZCByZXNwb25zZSBzdHJlYW0gc2VxdWVudGlhbGx5IGFzIGluZGl2aWR1YWwgY2h1bmtzIHVzaW5nIGNodW5rZWQgaW5wdXQuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgZmFpbHVyZSBkdXJpbmcgdGhlIHRlc3QgZXhlY3V0aW9uLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEludGVyY2VwdGVkQ2h1bmtlZE91dHB1dFRvQ2h1bmtJbnB1dCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBDaHVua2VkSW5wdXQ8U3RyaW5nPiBpbnB1dCA9IHRhcmdldCgpLnBhdGgoInRlc3QvaW50ZXJjZXB0ZWQiKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkuZ2V0KG5ldyBHZW5lcmljVHlwZTxDaHVua2VkSW5wdXQ8U3RyaW5nPj4oKSB7CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgaW50IGNvdW50ZXIgPSAwOworICAgICAgICBTdHJpbmcgY2h1bms7CisgICAgICAgIHdoaWxlICgoY2h1bmsgPSBpbnB1dC5yZWFkKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCB2YWx1ZSBvZiBjaHVuayAiICsgY291bnRlciwgInRlc3QiLCBjaHVuayk7CisgICAgICAgICAgICBjb3VudGVyKys7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRUaGF0KCJVbmV4cGVjdGVkIG51bWJlZCBvZiByZWNlaXZlZCBjaHVua3MuIiwKKyAgICAgICAgICAgICAgICBjb3VudGVyLCBlcXVhbFRvKDMpKTsKKworICAgICAgICBhc3NlcnRUaGF0KCJVbmV4cGVjdGVkIG51bWJlciBvZiBjaHVua2VkIG91dHB1dCBpbnRlcmNlcHRpb25zLiIsCisgICAgICAgICAgICAgICAgVGVzdFdyaXRlckludGVyY2VwdG9yLmludGVyY2VwdENvdW50ZXIuZ2V0KCksIGVxdWFsVG8oMSkpOworICAgICAgICBhc3NlcnRUaGF0KCJVbmV4cGVjdGVkIG51bWJlciBvZiBpbnRlcmNlcHRlZCBvdXRwdXQgd3JpdGUgY2FsbHMuIiwKKyAgICAgICAgICAgICAgICBUZXN0V3JpdGVySW50ZXJjZXB0b3Iud3JpdGVDb3VudGVyLmdldCgpLCBncmVhdGVyVGhhbk9yRXF1YWxUbygxKSk7CisgICAgICAgIGFzc2VydFRoYXQoIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIGludGVyY2VwdGVkIG91dHB1dCBmbHVzaCBjYWxscy4iLAorICAgICAgICAgICAgICAgIFRlc3RXcml0ZXJJbnRlcmNlcHRvci5mbHVzaENvdW50ZXIuZ2V0KCksIGdyZWF0ZXJUaGFuT3JFcXVhbFRvKDMpKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgiVW5leHBlY3RlZCBudW1iZXIgb2YgaW50ZXJjZXB0ZWQgb3V0cHV0IGNsb3NlIGNhbGxzLiIsCisgICAgICAgICAgICAgICAgVGVzdFdyaXRlckludGVyY2VwdG9yLmNsb3NlQ291bnRlci5nZXQoKSwgZXF1YWxUbygxKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvQ2xpZW50UmVzcG9uc2VPblNlcnZlclRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0NsaWVudFJlc3BvbnNlT25TZXJ2ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY0Mjg3NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0NsaWVudFJlc3BvbnNlT25TZXJ2ZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Vcmk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3QgZm9yIHN1cHBvcnQgb2YgY2xpZW50LXNpZGUgcmVzcG9uc2UgaW4gdGhlIHNlcnZlci1zaWRlIHJlc291cmNlIGltcGxlbWVudGF0aW9uLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBDbGllbnRSZXNwb25zZU9uU2VydmVyVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQFBhdGgoInJvb3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUm9vdFJlc291cmNlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgICAgIEBQYXRoKCJyZXNwb25zZSIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXRSZXNwb25zZShAVXJpKCJpbnRlcm5hbC9yZXNwb25zZSIpIFdlYlRhcmdldCB0YXJnZXQpIHsKKyAgICAgICAgICAgIC8vIHJldHVybnMgY2xpZW50LXNpZGUgcmVzcG9uc2UgaW5zdGFuY2UKKyAgICAgICAgICAgIHJldHVybiB0YXJnZXQucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9QTEFJTikuZ2V0KCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICAgICAgQFBhdGgoImVycm9yIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRFcnJvcihAVXJpKCJpbnRlcm5hbC9lcnJvciIpIFdlYlRhcmdldCB0YXJnZXQpIHsKKyAgICAgICAgICAgIC8vIHRocm93cyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB3aXRoIGFuIGVycm9yIHJlc3BvbnNlCisgICAgICAgICAgICByZXR1cm4gdGFyZ2V0LnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfUExBSU4pLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoImludGVybmFsIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEludGVybmFsUmVzb3VyY2UgeworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICAgICAgQFBhdGgoInJlc3BvbnNlIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRSZXNwb25zZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAicmVzcG9uc2UiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgICAgIEBQYXRoKCJlcnJvciIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXRFcnJvcigpIHsKKyAgICAgICAgICAgIC8vIFRlc3RpbmcgZm9yIGEgY3Jvc3Mtc3RhY2sgc3VwcG9ydCBvZiBhIGNvbXBsZXRlbHkgY3VzdG9tIHN0YXR1cyBjb2RlLgorICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyg2OTkpLnR5cGUoTWVkaWFUeXBlLlRFWFRfUExBSU4pLmVudGl0eSgiZXJyb3IiKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZygKKyAgICAgICAgICAgICAgICBSb290UmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgSW50ZXJuYWxSZXNvdXJjZS5jbGFzcworICAgICAgICApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsaWVudFJlc3BvbnNlVXNhZ2VPblNlcnZlcigpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgicm9vdC97dHlwZX0iKTsKKworICAgICAgICBSZXNwb25zZSByZXNwb25zZTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldC5yZXNvbHZlVGVtcGxhdGUoInR5cGUiLCAicmVzcG9uc2UiKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInJlc3BvbnNlIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldC5yZXNvbHZlVGVtcGxhdGUoInR5cGUiLCAiZXJyb3IiKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDY5OSwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImVycm9yIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9DbG9zZWFibGVUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9DbG9zZWFibGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODliZjM4ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0Nsb3NlYWJsZVRlc3QuamF2YQpAQCAtMCwwICsxLDkzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLmlvLkNsb3NlYWJsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5DbG9zZWFibGVTZXJ2aWNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIEBhdXRob3IgTWFyYyBIYWRsZXkKKyAqLworcHVibGljIGNsYXNzIENsb3NlYWJsZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBDb3VudERvd25MYXRjaCBwZXJSZXF1ZXN0Q2RsID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgIHByaXZhdGUgc3RhdGljIENvdW50RG93bkxhdGNoIHNpbmdsZXRvbkNkbCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKworICAgIEBQYXRoKCJwZXItcmVxdWVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQZXJSZXF1ZXN0UmVzb3VyY2UgaW1wbGVtZW50cyBDbG9zZWFibGUgeworICAgICAgICBzdGF0aWMgYm9vbGVhbiBpc0Nsb3NlZDsKKworICAgICAgICBAQ29udGV4dAorICAgICAgICBDbG9zZWFibGVTZXJ2aWNlIGNzOworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldCgpIHsKKyAgICAgICAgICAgIGlzQ2xvc2VkID0gZmFsc2U7CisgICAgICAgICAgICBjcy5hZGQodGhpcyk7CisgICAgICAgICAgICByZXR1cm4gIm9rIjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlzQ2xvc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIHBlclJlcXVlc3RDZGwuY291bnREb3duKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgic2luZ2xldG9uIikKKyAgICBAU2luZ2xldG9uCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTaW5nbGV0b25SZXNvdXJjZSBleHRlbmRzIFBlclJlcXVlc3RSZXNvdXJjZSB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHsKKyAgICAgICAgICAgIGlzQ2xvc2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIHNpbmdsZXRvbkNkbC5jb3VudERvd24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUGVyUmVxdWVzdFJlc291cmNlLmNsYXNzLCBTaW5nbGV0b25SZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGVyUmVxdWVzdCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIHRhcmdldCgpLnBhdGgoInBlci1yZXF1ZXN0IikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBwZXJSZXF1ZXN0Q2RsLmF3YWl0KDEwMDAsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgIGFzc2VydFRydWUoUGVyUmVxdWVzdFJlc291cmNlLmlzQ2xvc2VkKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGV0b24oKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICB0YXJnZXQoKS5wYXRoKCJzaW5nbGV0b24iKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIHBlclJlcXVlc3RDZGwuYXdhaXQoMTAwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShTaW5nbGV0b25SZXNvdXJjZS5pc0Nsb3NlZCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9Db21wbGV0aW9uU3RhZ2VUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9Db21wbGV0aW9uU3RhZ2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFjZTc0MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0NvbXBsZXRpb25TdGFnZVRlc3QuamF2YQpAQCAtMCwwICsxLDQ1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29tcGxldGFibGVGdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29tcGxldGlvblN0YWdlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkJpQ29uc3VtZXI7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkJpRnVuY3Rpb247CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkNvbnN1bWVyOworaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5GdW5jdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBDb21wbGV0aW9uU3RhZ2VUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVOVElUWSA9ICJlbnRpdHkiOworICAgIC8vIGRlbGF5IG9mIGFzeW5jIG9wZXJhdGlvbnMgaW4gc2Vjb25kcy4KKyAgICBzdGF0aWMgZmluYWwgaW50IERFTEFZID0gMTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoQ29tcGxldGlvblN0YWdlUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldENvbXBsZXRlZCgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImNzL2NvbXBsZXRlZCIpLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGlzKEVOVElUWSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEV4Y2VwdGlvbjQwMCgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImNzL2V4Y2VwdGlvbjQwMCIpLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcyg0MDApKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRFeGNlcHRpb240MDUoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJjcy9leGNlcHRpb240MDUiKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoNDA1KSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q2FuY2VsbGVkKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiY3MvY2FuY2VsbGVkIikucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDUwMykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldENvbXBsZXRlZEFzeW5jKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiY3MvY29tcGxldGVkQXN5bmMiKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBpcyhFTlRJVFkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRFeGNlcHRpb240MDBBc3luYygpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImNzL2V4Y2VwdGlvbjQwMEFzeW5jIikucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDQwMCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEV4Y2VwdGlvbjQwNUFzeW5jKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiY3MvZXhjZXB0aW9uNDA1QXN5bmMiKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoNDA1KSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q2FuY2VsbGVkQXN5bmMoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJjcy9jYW5jZWxsZWRBc3luYyIpLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcyg1MDMpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDdXN0b21Db21wbGV0ZWQoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJjcy9jdXN0b20iKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBpcyhFTlRJVFkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDdXN0b21Bc3luYygpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImNzL2N1c3RvbUFzeW5jIikucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoRU5USVRZKSk7CisgICAgfQorCisgICAgQFBhdGgoIi9jcyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb21wbGV0aW9uU3RhZ2VSZXNvdXJjZSB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIEVYRUNVVE9SX1NFUlZJQ0UgPSBFeGVjdXRvcnMubmV3Q2FjaGVkVGhyZWFkUG9vbCgpOworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIi9jb21wbGV0ZWQiKQorICAgICAgICBwdWJsaWMgQ29tcGxldGlvblN0YWdlPFN0cmluZz4gZ2V0Q29tcGxldGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIENvbXBsZXRhYmxlRnV0dXJlLmNvbXBsZXRlZEZ1dHVyZShFTlRJVFkpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiL2V4Y2VwdGlvbjQwMCIpCisgICAgICAgIHB1YmxpYyBDb21wbGV0aW9uU3RhZ2U8U3RyaW5nPiBnZXRFeGNlcHRpb240MDAoKSB7CisgICAgICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxTdHJpbmc+IGNzID0gbmV3IENvbXBsZXRhYmxlRnV0dXJlPD4oKTsKKyAgICAgICAgICAgIGNzLmNvbXBsZXRlRXhjZXB0aW9uYWxseShuZXcgV2ViQXBwbGljYXRpb25FeGNlcHRpb24oNDAwKSk7CisKKyAgICAgICAgICAgIHJldHVybiBjczsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIi9leGNlcHRpb240MDUiKQorICAgICAgICBwdWJsaWMgQ29tcGxldGlvblN0YWdlPFN0cmluZz4gZ2V0RXhjZXB0aW9uNDA1KCkgeworICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8U3RyaW5nPiBjcyA9IG5ldyBDb21wbGV0YWJsZUZ1dHVyZTw+KCk7CisgICAgICAgICAgICBjcy5jb21wbGV0ZUV4Y2VwdGlvbmFsbHkobmV3IFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKDQwNSkpOworCisgICAgICAgICAgICByZXR1cm4gY3M7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCIvY2FuY2VsbGVkIikKKyAgICAgICAgcHVibGljIENvbXBsZXRpb25TdGFnZTxTdHJpbmc+IGdldENhbmNlbGxlZCgpIHsKKyAgICAgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFN0cmluZz4gY3MgPSBuZXcgQ29tcGxldGFibGVGdXR1cmU8PigpOworICAgICAgICAgICAgY3MuY2FuY2VsKHRydWUpOworCisgICAgICAgICAgICByZXR1cm4gY3M7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCIvY29tcGxldGVkQXN5bmMiKQorICAgICAgICBwdWJsaWMgQ29tcGxldGlvblN0YWdlPFN0cmluZz4gZ2V0Q29tcGxldGVkQXN5bmMoKSB7CisgICAgICAgICAgICBDb21wbGV0YWJsZUZ1dHVyZTxTdHJpbmc+IGNzID0gbmV3IENvbXBsZXRhYmxlRnV0dXJlPD4oKTsKKyAgICAgICAgICAgIGRlbGF5U3VibWl0KCgpIC0+IGNzLmNvbXBsZXRlKEVOVElUWSkpOworICAgICAgICAgICAgcmV0dXJuIGNzOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiL2V4Y2VwdGlvbjQwMEFzeW5jIikKKyAgICAgICAgcHVibGljIENvbXBsZXRpb25TdGFnZTxTdHJpbmc+IGdldEV4Y2VwdGlvbjQwMEFzeW5jKCkgeworICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8U3RyaW5nPiBjcyA9IG5ldyBDb21wbGV0YWJsZUZ1dHVyZTw+KCk7CisgICAgICAgICAgICBkZWxheVN1Ym1pdCgoKSAtPiBjcy5jb21wbGV0ZUV4Y2VwdGlvbmFsbHkobmV3IFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKDQwMCkpKTsKKworICAgICAgICAgICAgcmV0dXJuIGNzOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiL2V4Y2VwdGlvbjQwNUFzeW5jIikKKyAgICAgICAgcHVibGljIENvbXBsZXRpb25TdGFnZTxTdHJpbmc+IGdldEV4Y2VwdGlvbjQwNUFzeW5jKCkgeworICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8U3RyaW5nPiBjcyA9IG5ldyBDb21wbGV0YWJsZUZ1dHVyZTw+KCk7CisgICAgICAgICAgICBkZWxheVN1Ym1pdCgoKSAtPiBjcy5jb21wbGV0ZUV4Y2VwdGlvbmFsbHkobmV3IFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKDQwNSkpKTsKKworICAgICAgICAgICAgcmV0dXJuIGNzOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiL2NhbmNlbGxlZEFzeW5jIikKKyAgICAgICAgcHVibGljIENvbXBsZXRpb25TdGFnZTxTdHJpbmc+IGdldENhbmNlbGxlZEFzeW5jKCkgeworICAgICAgICAgICAgQ29tcGxldGFibGVGdXR1cmU8U3RyaW5nPiBjcyA9IG5ldyBDb21wbGV0YWJsZUZ1dHVyZTw+KCk7CisgICAgICAgICAgICBkZWxheVN1Ym1pdCgoKSAtPiBjcy5jYW5jZWwodHJ1ZSkpOworCisgICAgICAgICAgICByZXR1cm4gY3M7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJuIGNvbXBsZXRlZCBDb21wbGV0aW9uU3RhZ2Ugd2hpY2ggZG9lc24ndCBzdXBwb3J0ICN0b0NvbXBsZXRhYmxlRnV0dXJlKCkuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gQ29tcGxldGlvblN0YWdlIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydCAjdG9Db21wbGV0YWJsZUZ1dHVyZSgpLgorICAgICAgICAgKi8KKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiL2N1c3RvbSIpCisgICAgICAgIHB1YmxpYyBDb21wbGV0aW9uU3RhZ2U8U3RyaW5nPiBnZXRDdXN0b21Db21wbGV0aW9uU3RhZ2UoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEN1c3RvbUNvbXBsZXRpb25TdGFnZTw+KENvbXBsZXRhYmxlRnV0dXJlLmNvbXBsZXRlZEZ1dHVyZShFTlRJVFkpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gdW5jb21wbGV0ZWQgQ29tcGxldGlvblN0YWdlIHdoaWNoIGRvZXNuJ3Qgc3VwcG9ydCAjdG9Db21wbGV0YWJsZUZ1dHVyZSgpLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIENvbXBsZXRpb25TdGFnZSB3aGljaCBkb2Vzbid0IHN1cHBvcnQgI3RvQ29tcGxldGFibGVGdXR1cmUoKS4KKyAgICAgICAgICovCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIi9jdXN0b21Bc3luYyIpCisgICAgICAgIHB1YmxpYyBDb21wbGV0aW9uU3RhZ2U8U3RyaW5nPiBnZXRDdXN0b21Db21wbGV0aW9uU3RhZ2VBc3luYygpIHsKKyAgICAgICAgICAgIENvbXBsZXRhYmxlRnV0dXJlPFN0cmluZz4gY2YgPSBuZXcgQ29tcGxldGFibGVGdXR1cmU8PigpOworICAgICAgICAgICAgQ3VzdG9tQ29tcGxldGlvblN0YWdlPFN0cmluZz4gY3MgPSBuZXcgQ3VzdG9tQ29tcGxldGlvblN0YWdlPD4oY2YpOworICAgICAgICAgICAgZGVsYXlTdWJtaXQoKCkgLT4gY2YuY29tcGxldGUoRU5USVRZKSk7CisKKyAgICAgICAgICAgIHJldHVybiBjczsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgdm9pZCBkZWxheVN1Ym1pdChSdW5uYWJsZSBydW5uYWJsZSkgeworICAgICAgICAgICAgRVhFQ1VUT1JfU0VSVklDRS5zdWJtaXQoKCkgLT4geworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcChERUxBWSAqIDEwMDApOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaWdub3JlCisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcnVubmFibGUucnVuKCk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEN1c3RvbUNvbXBsZXRpb25TdGFnZTxUPiBpbXBsZW1lbnRzIENvbXBsZXRpb25TdGFnZTxUPiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb21wbGV0aW9uU3RhZ2U8VD4gY29tcGxldGVkRnV0dXJlOworCisgICAgICAgIEN1c3RvbUNvbXBsZXRpb25TdGFnZShDb21wbGV0aW9uU3RhZ2U8VD4gY29tcGxldGVkRnV0dXJlKSB7CisgICAgICAgICAgICB0aGlzLmNvbXBsZXRlZEZ1dHVyZSA9IGNvbXBsZXRlZEZ1dHVyZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgPFU+IENvbXBsZXRpb25TdGFnZTxVPiB0aGVuQXBwbHkoRnVuY3Rpb248PyBzdXBlciBULCA/IGV4dGVuZHMgVT4gZm4pIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wbGV0ZWRGdXR1cmUudGhlbkFwcGx5KGZuKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgPFU+IENvbXBsZXRpb25TdGFnZTxVPiB0aGVuQXBwbHlBc3luYyhGdW5jdGlvbjw/IHN1cGVyIFQsID8gZXh0ZW5kcyBVPiBmbikgeworICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZEZ1dHVyZS50aGVuQXBwbHlBc3luYyhmbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIDxVPiBDb21wbGV0aW9uU3RhZ2U8VT4gdGhlbkFwcGx5QXN5bmMoRnVuY3Rpb248PyBzdXBlciBULCA/IGV4dGVuZHMgVT4gZm4sIEV4ZWN1dG9yIGV4ZWN1dG9yKSB7CisgICAgICAgICAgICByZXR1cm4gY29tcGxldGVkRnV0dXJlLnRoZW5BcHBseUFzeW5jKGZuLCBleGVjdXRvcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENvbXBsZXRpb25TdGFnZTxWb2lkPiB0aGVuQWNjZXB0KENvbnN1bWVyPD8gc3VwZXIgVD4gYWN0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gY29tcGxldGVkRnV0dXJlLnRoZW5BY2NlcHQoYWN0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ29tcGxldGlvblN0YWdlPFZvaWQ+IHRoZW5BY2NlcHRBc3luYyhDb25zdW1lcjw/IHN1cGVyIFQ+IGFjdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZEZ1dHVyZS50aGVuQWNjZXB0QXN5bmMoYWN0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ29tcGxldGlvblN0YWdlPFZvaWQ+IHRoZW5BY2NlcHRBc3luYyhDb25zdW1lcjw/IHN1cGVyIFQ+IGFjdGlvbiwgRXhlY3V0b3IgZXhlY3V0b3IpIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wbGV0ZWRGdXR1cmUudGhlbkFjY2VwdEFzeW5jKGFjdGlvbiwgZXhlY3V0b3IpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDb21wbGV0aW9uU3RhZ2U8Vm9pZD4gdGhlblJ1bihSdW5uYWJsZSBhY3Rpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wbGV0ZWRGdXR1cmUudGhlblJ1bihhY3Rpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDb21wbGV0aW9uU3RhZ2U8Vm9pZD4gdGhlblJ1bkFzeW5jKFJ1bm5hYmxlIGFjdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZEZ1dHVyZS50aGVuUnVuQXN5bmMoYWN0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ29tcGxldGlvblN0YWdlPFZvaWQ+IHRoZW5SdW5Bc3luYyhSdW5uYWJsZSBhY3Rpb24sIEV4ZWN1dG9yIGV4ZWN1dG9yKSB7CisgICAgICAgICAgICByZXR1cm4gY29tcGxldGVkRnV0dXJlLnRoZW5SdW5Bc3luYyhhY3Rpb24sIGV4ZWN1dG9yKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgPFUsIFY+IENvbXBsZXRpb25TdGFnZTxWPiB0aGVuQ29tYmluZShDb21wbGV0aW9uU3RhZ2U8PyBleHRlbmRzIFU+IG90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaUZ1bmN0aW9uPD8gc3VwZXIgVCwgPyBzdXBlciBVLCA/IGV4dGVuZHMgVj4gZm4pIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wbGV0ZWRGdXR1cmUudGhlbkNvbWJpbmUob3RoZXIsIGZuKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgPFUsIFY+IENvbXBsZXRpb25TdGFnZTxWPiB0aGVuQ29tYmluZUFzeW5jKENvbXBsZXRpb25TdGFnZTw/IGV4dGVuZHMgVT4gb3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlGdW5jdGlvbjw/IHN1cGVyIFQsID8gc3VwZXIgVSwgPyBleHRlbmRzIFY+IGZuKSB7CisgICAgICAgICAgICByZXR1cm4gY29tcGxldGVkRnV0dXJlLnRoZW5Db21iaW5lQXN5bmMob3RoZXIsIGZuKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgPFUsIFY+IENvbXBsZXRpb25TdGFnZTxWPiB0aGVuQ29tYmluZUFzeW5jKENvbXBsZXRpb25TdGFnZTw/IGV4dGVuZHMgVT4gb3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlGdW5jdGlvbjw/IHN1cGVyIFQsID8gc3VwZXIgVSwgPyBleHRlbmRzIFY+IGZuLCBFeGVjdXRvciBleGVjdXRvcikgeworICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZEZ1dHVyZS50aGVuQ29tYmluZUFzeW5jKG90aGVyLCBmbiwgZXhlY3V0b3IpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyA8VT4gQ29tcGxldGlvblN0YWdlPFZvaWQ+IHRoZW5BY2NlcHRCb3RoKENvbXBsZXRpb25TdGFnZTw/IGV4dGVuZHMgVT4gb3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpQ29uc3VtZXI8PyBzdXBlciBULCA/IHN1cGVyIFU+IGFjdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZEZ1dHVyZS50aGVuQWNjZXB0Qm90aChvdGhlciwgYWN0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgPFU+IENvbXBsZXRpb25TdGFnZTxWb2lkPiB0aGVuQWNjZXB0Qm90aEFzeW5jKENvbXBsZXRpb25TdGFnZTw/IGV4dGVuZHMgVT4gb3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlDb25zdW1lcjw/IHN1cGVyIFQsID8gc3VwZXIgVT4gYWN0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gY29tcGxldGVkRnV0dXJlLnRoZW5BY2NlcHRCb3RoQXN5bmMob3RoZXIsIGFjdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIDxVPiBDb21wbGV0aW9uU3RhZ2U8Vm9pZD4gdGhlbkFjY2VwdEJvdGhBc3luYyhDb21wbGV0aW9uU3RhZ2U8PyBleHRlbmRzIFU+IG90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpQ29uc3VtZXI8PyBzdXBlciBULCA/IHN1cGVyIFU+IGFjdGlvbiwgRXhlY3V0b3IgZXhlY3V0b3IpIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wbGV0ZWRGdXR1cmUudGhlbkFjY2VwdEJvdGhBc3luYyhvdGhlciwgYWN0aW9uLCBleGVjdXRvcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENvbXBsZXRpb25TdGFnZTxWb2lkPiBydW5BZnRlckJvdGgoQ29tcGxldGlvblN0YWdlPD8+IG90aGVyLCBSdW5uYWJsZSBhY3Rpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wbGV0ZWRGdXR1cmUucnVuQWZ0ZXJCb3RoKG90aGVyLCBhY3Rpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDb21wbGV0aW9uU3RhZ2U8Vm9pZD4gcnVuQWZ0ZXJCb3RoQXN5bmMoQ29tcGxldGlvblN0YWdlPD8+IG90aGVyLCBSdW5uYWJsZSBhY3Rpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wbGV0ZWRGdXR1cmUucnVuQWZ0ZXJCb3RoQXN5bmMob3RoZXIsIGFjdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENvbXBsZXRpb25TdGFnZTxWb2lkPiBydW5BZnRlckJvdGhBc3luYyhDb21wbGV0aW9uU3RhZ2U8Pz4gb3RoZXIsIFJ1bm5hYmxlIGFjdGlvbiwgRXhlY3V0b3IgZXhlY3V0b3IpIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wbGV0ZWRGdXR1cmUucnVuQWZ0ZXJCb3RoQXN5bmMob3RoZXIsIGFjdGlvbiwgZXhlY3V0b3IpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyA8VT4gQ29tcGxldGlvblN0YWdlPFU+IGFwcGx5VG9FaXRoZXIoQ29tcGxldGlvblN0YWdlPD8gZXh0ZW5kcyBUPiBvdGhlciwgRnVuY3Rpb248PyBzdXBlciBULCBVPiBmbikgeworICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZEZ1dHVyZS5hcHBseVRvRWl0aGVyKG90aGVyLCBmbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIDxVPiBDb21wbGV0aW9uU3RhZ2U8VT4gYXBwbHlUb0VpdGhlckFzeW5jKENvbXBsZXRpb25TdGFnZTw/IGV4dGVuZHMgVD4gb3RoZXIsIEZ1bmN0aW9uPD8gc3VwZXIgVCwgVT4gZm4pIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wbGV0ZWRGdXR1cmUuYXBwbHlUb0VpdGhlckFzeW5jKG90aGVyLCBmbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIDxVPiBDb21wbGV0aW9uU3RhZ2U8VT4gYXBwbHlUb0VpdGhlckFzeW5jKENvbXBsZXRpb25TdGFnZTw/IGV4dGVuZHMgVD4gb3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbjw/IHN1cGVyIFQsIFU+IGZuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhlY3V0b3IgZXhlY3V0b3IpIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wbGV0ZWRGdXR1cmUuYXBwbHlUb0VpdGhlckFzeW5jKG90aGVyLCBmbiwgZXhlY3V0b3IpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDb21wbGV0aW9uU3RhZ2U8Vm9pZD4gYWNjZXB0RWl0aGVyKENvbXBsZXRpb25TdGFnZTw/IGV4dGVuZHMgVD4gb3RoZXIsIENvbnN1bWVyPD8gc3VwZXIgVD4gYWN0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gY29tcGxldGVkRnV0dXJlLmFjY2VwdEVpdGhlcihvdGhlciwgYWN0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ29tcGxldGlvblN0YWdlPFZvaWQ+IGFjY2VwdEVpdGhlckFzeW5jKENvbXBsZXRpb25TdGFnZTw/IGV4dGVuZHMgVD4gb3RoZXIsIENvbnN1bWVyPD8gc3VwZXIgVD4gYWN0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gY29tcGxldGVkRnV0dXJlLmFjY2VwdEVpdGhlckFzeW5jKG90aGVyLCBhY3Rpb24pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDb21wbGV0aW9uU3RhZ2U8Vm9pZD4gYWNjZXB0RWl0aGVyQXN5bmMoQ29tcGxldGlvblN0YWdlPD8gZXh0ZW5kcyBUPiBvdGhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdW1lcjw/IHN1cGVyIFQ+IGFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGVjdXRvciBleGVjdXRvcikgeworICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZEZ1dHVyZS5hY2NlcHRFaXRoZXJBc3luYyhvdGhlciwgYWN0aW9uLCBleGVjdXRvcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENvbXBsZXRpb25TdGFnZTxWb2lkPiBydW5BZnRlckVpdGhlcihDb21wbGV0aW9uU3RhZ2U8Pz4gb3RoZXIsIFJ1bm5hYmxlIGFjdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZEZ1dHVyZS5ydW5BZnRlckVpdGhlcihvdGhlciwgYWN0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ29tcGxldGlvblN0YWdlPFZvaWQ+IHJ1bkFmdGVyRWl0aGVyQXN5bmMoQ29tcGxldGlvblN0YWdlPD8+IG90aGVyLCBSdW5uYWJsZSBhY3Rpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wbGV0ZWRGdXR1cmUucnVuQWZ0ZXJFaXRoZXJBc3luYyhvdGhlciwgYWN0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ29tcGxldGlvblN0YWdlPFZvaWQ+IHJ1bkFmdGVyRWl0aGVyQXN5bmMoQ29tcGxldGlvblN0YWdlPD8+IG90aGVyLCBSdW5uYWJsZSBhY3Rpb24sIEV4ZWN1dG9yIGV4ZWN1dG9yKSB7CisgICAgICAgICAgICByZXR1cm4gY29tcGxldGVkRnV0dXJlLnJ1bkFmdGVyRWl0aGVyQXN5bmMob3RoZXIsIGFjdGlvbiwgZXhlY3V0b3IpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyA8VT4gQ29tcGxldGlvblN0YWdlPFU+IHRoZW5Db21wb3NlKEZ1bmN0aW9uPD8gc3VwZXIgVCwgPyBleHRlbmRzIENvbXBsZXRpb25TdGFnZTxVPj4gZm4pIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wbGV0ZWRGdXR1cmUudGhlbkNvbXBvc2UoZm4pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyA8VT4gQ29tcGxldGlvblN0YWdlPFU+IHRoZW5Db21wb3NlQXN5bmMoRnVuY3Rpb248PyBzdXBlciBULCA/IGV4dGVuZHMgQ29tcGxldGlvblN0YWdlPFU+PiBmbikgeworICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZEZ1dHVyZS50aGVuQ29tcG9zZUFzeW5jKGZuKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgPFU+IENvbXBsZXRpb25TdGFnZTxVPiB0aGVuQ29tcG9zZUFzeW5jKEZ1bmN0aW9uPD8gc3VwZXIgVCwgPyBleHRlbmRzIENvbXBsZXRpb25TdGFnZTxVPj4gZm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhlY3V0b3IgZXhlY3V0b3IpIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wbGV0ZWRGdXR1cmUudGhlbkNvbXBvc2VBc3luYyhmbiwgZXhlY3V0b3IpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDb21wbGV0aW9uU3RhZ2U8VD4gZXhjZXB0aW9uYWxseShGdW5jdGlvbjxUaHJvd2FibGUsID8gZXh0ZW5kcyBUPiBmbikgeworICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZEZ1dHVyZS5leGNlcHRpb25hbGx5KGZuKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ29tcGxldGlvblN0YWdlPFQ+IHdoZW5Db21wbGV0ZShCaUNvbnN1bWVyPD8gc3VwZXIgVCwgPyBzdXBlciBUaHJvd2FibGU+IGFjdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZEZ1dHVyZS53aGVuQ29tcGxldGUoYWN0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ29tcGxldGlvblN0YWdlPFQ+IHdoZW5Db21wbGV0ZUFzeW5jKEJpQ29uc3VtZXI8PyBzdXBlciBULCA/IHN1cGVyIFRocm93YWJsZT4gYWN0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gY29tcGxldGVkRnV0dXJlLndoZW5Db21wbGV0ZUFzeW5jKGFjdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIENvbXBsZXRpb25TdGFnZTxUPiB3aGVuQ29tcGxldGVBc3luYyhCaUNvbnN1bWVyPD8gc3VwZXIgVCwgPyBzdXBlciBUaHJvd2FibGU+IGFjdGlvbiwgRXhlY3V0b3IgZXhlY3V0b3IpIHsKKyAgICAgICAgICAgIHJldHVybiBjb21wbGV0ZWRGdXR1cmUud2hlbkNvbXBsZXRlQXN5bmMoYWN0aW9uLCBleGVjdXRvcik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIDxVPiBDb21wbGV0aW9uU3RhZ2U8VT4gaGFuZGxlKEJpRnVuY3Rpb248PyBzdXBlciBULCBUaHJvd2FibGUsID8gZXh0ZW5kcyBVPiBmbikgeworICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZEZ1dHVyZS5oYW5kbGUoZm4pOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyA8VT4gQ29tcGxldGlvblN0YWdlPFU+IGhhbmRsZUFzeW5jKEJpRnVuY3Rpb248PyBzdXBlciBULCBUaHJvd2FibGUsID8gZXh0ZW5kcyBVPiBmbikgeworICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZEZ1dHVyZS5oYW5kbGVBc3luYyhmbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIDxVPiBDb21wbGV0aW9uU3RhZ2U8VT4gaGFuZGxlQXN5bmMoQmlGdW5jdGlvbjw/IHN1cGVyIFQsIFRocm93YWJsZSwgPyBleHRlbmRzIFU+IGZuLCBFeGVjdXRvciBleGVjdXRvcikgeworICAgICAgICAgICAgcmV0dXJuIGNvbXBsZXRlZEZ1dHVyZS5oYW5kbGVBc3luYyhmbiwgZXhlY3V0b3IpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDb21wbGV0YWJsZUZ1dHVyZTxUPiB0b0NvbXBsZXRhYmxlRnV0dXJlKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9Db250YWluZXJMaXN0ZW5lclJlZ2lzdHJhdGlvbkFzUHJvdmlkZXJzVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvQ29udGFpbmVyTGlzdGVuZXJSZWdpc3RyYXRpb25Bc1Byb3ZpZGVyc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzQ2YmVlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvQ29udGFpbmVyTGlzdGVuZXJSZWdpc3RyYXRpb25Bc1Byb3ZpZGVyc1Rlc3QuamF2YQpAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkFic3RyYWN0Q29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5Db250YWluZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBDb250YWluZXJMaXN0ZW5lclJlZ2lzdHJhdGlvbkFzUHJvdmlkZXJzVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgTXlMaXN0ZW5lciBsaXN0ZW5lcjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIGxpc3RlbmVyID0gbmV3IE15TGlzdGVuZXIoKTsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzdWx0ID0gbmV3IFJlc291cmNlQ29uZmlnKE9uZS5jbGFzcywgWWV0QW5vdGhlckxpc3RlbmVyLmNsYXNzKS5yZWdpc3Rlckluc3RhbmNlcyhsaXN0ZW5lcik7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIFlldEFub3RoZXJMaXN0ZW5lciBleHRlbmRzIEFic3RyYWN0Q29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXIgeworCisgICAgICAgIHN0YXRpYyBib29sZWFuIHN0YXJ0ZWQ7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnR1cChDb250YWluZXIgY29udGFpbmVyKSB7CisgICAgICAgICAgICBzdGFydGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBjbGFzcyBNeUxpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RDb250YWluZXJMaWZlY3ljbGVMaXN0ZW5lciB7CisKKyAgICAgICAgYm9vbGVhbiBzdGFydHVwSW52b2tlZDsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TdGFydHVwKENvbnRhaW5lciBjb250YWluZXIpIHsKKyAgICAgICAgICAgIHN0YXJ0dXBJbnZva2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExpc3RlbmVyKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIndoYXRldmVyIiwgdGFyZ2V0KCkucGF0aCgiZG9lc05vdE1hdHRlciIpLnJlcXVlc3QoKS5nZXQoKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnRUcnVlKGxpc3RlbmVyLnN0YXJ0dXBJbnZva2VkKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShZZXRBbm90aGVyTGlzdGVuZXIuc3RhcnRlZCk7CisgICAgfQorCisgICAgQFBhdGgoImRvZXNOb3RNYXR0ZXIiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgT25lIHsKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAid2hhdGV2ZXIiOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvQ29udGVudE5lZ290aWF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvQ29udGVudE5lZ290aWF0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NzMyYzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9Db250ZW50TmVnb3RpYXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSwyMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LmludGVybmFsLkh0dHBVcmxDb25uZWN0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBUZXN0cyBkZXRlcm1pbmluZyBtZWRpYSB0eXBlIG9mIHRoZSByZXNwb25zZSAoZXNwZWNpYWxseSB0aGF0IHFzIHF1YWxpdHkgcGFyYW1ldGVyIGlzIHJlc3BlY3RlZCB3aGVuCisgKiBtb3JlIG1lZGlhIHR5cGVzIGFyZSBkZWZpbmVkIG9uIHRoZSByZXNvdXJjZSBtZXRob2QpLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIENvbnRlbnROZWdvdGlhdGlvblRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBQYXRoKCJwZXJzb25zIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15UmVzb3VyY2UgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQZXJzb25bXSBMSVNUID0gbmV3IFBlcnNvbltdIHsKKyAgICAgICAgICAgICAgICBuZXcgUGVyc29uKCJQZW5ueSIsIDEpLAorICAgICAgICAgICAgICAgIG5ldyBQZXJzb24oIkhvd2FyZCIsIDIpLAorICAgICAgICAgICAgICAgIG5ldyBQZXJzb24oIlNoZWxkb24iLCAzKQorICAgICAgICB9OworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKHsiYXBwbGljYXRpb24veG1sO3FzPTAuNzUiLCAiYXBwbGljYXRpb24vanNvbjtxcz0xLjAifSkKKyAgICAgICAgcHVibGljIFBlcnNvbltdIGdldExpc3QoKSB7CisgICAgICAgICAgICByZXR1cm4gTElTVDsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKHsiYXBwbGljYXRpb24vanNvbjtxcz0xIiwgImFwcGxpY2F0aW9uL3htbDtxcz0wLjc1In0pCisgICAgICAgIEBQYXRoKCJyZW9yZGVyZWQiKQorICAgICAgICBwdWJsaWMgUGVyc29uW10gZ2V0TGlzdFJlb3JkZXJlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBMSVNUOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoeyJhcHBsaWNhdGlvbi9qc29uO3FzPTAuNzUiLCAiYXBwbGljYXRpb24veG1sO3FzPTEifSkKKyAgICAgICAgQFBhdGgoImludmVydGVkIikKKyAgICAgICAgcHVibGljIFBlcnNvbltdIGdldExpc3RJbnZlcnRlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBMSVNUOworICAgICAgICB9CisKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcyh7ImFwcGxpY2F0aW9uL3htbDtxcz0wLjc1IiwgImFwcGxpY2F0aW9uL2pzb247cXM9MC45IiwgInVua25vd24vaGVsbG87cXM9MS4wIn0pCisgICAgICAgIEBQYXRoKCJ1bmtvd25NVCIpCisgICAgICAgIHB1YmxpYyBQZXJzb25bXSBnZXRMaXN0V2l0aFVua293blR5cGUoKSB7CisgICAgICAgICAgICByZXR1cm4gTElTVDsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKHsiYXBwbGljYXRpb24vanNvbiIsICJhcHBsaWNhdGlvbi94bWwiLCAidGV4dC9wbGFpbiJ9KQorICAgICAgICBAUGF0aCgic2hvdWxkUGlja0ZpcnN0SnNvbiIpCisgICAgICAgIHB1YmxpYyBQZXJzb25bXSBnZXRKc29uQXJyYXlVbmxlc3NPdGhlcndpc2VTcGVjaWZpZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gTElTVDsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKHsiYXBwbGljYXRpb24veG1sIiwgInRleHQvcGxhaW4iLCAiYXBwbGljYXRpb24vanNvbiJ9KQorICAgICAgICBAUGF0aCgic2hvdWxkUGlja0ZpcnN0WG1sIikKKyAgICAgICAgcHVibGljIFBlcnNvbltdIGdldFhtbFVubGVzc090aGVyd2lzZVNwZWNpZmllZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBMSVNUOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2pzb247cXM9MC43NSIpCisgICAgICAgIEBQYXRoKCJ0d29NZXRob2RzT25lRW5kcG9pbnQiKQorICAgICAgICBwdWJsaWMgUGVyc29uW10gZ2V0SnNvbkFycmF5KCkgeworICAgICAgICAgICAgcmV0dXJuIExJU1Q7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24veG1sO3FzPTEiKQorICAgICAgICBAUGF0aCgidHdvTWV0aG9kc09uZUVuZHBvaW50IikKKyAgICAgICAgcHVibGljIFBlcnNvbltdIGdldFhtbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBMSVNUOworICAgICAgICB9CisgICAgfQorCisgICAgQFhtbFJvb3RFbGVtZW50CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQZXJzb24geworICAgICAgICBwcml2YXRlIFN0cmluZyBuYW1lOworICAgICAgICBwcml2YXRlIGludCBhZ2U7CisKKyAgICAgICAgcHVibGljIFBlcnNvbigpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBQZXJzb24oU3RyaW5nIG5hbWUsIGludCBhZ2UpIHsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgICAgICB0aGlzLmFnZSA9IGFnZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0QWdlKCkgeworICAgICAgICAgICAgcmV0dXJuIGFnZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEFnZShpbnQgYWdlKSB7CisgICAgICAgICAgICB0aGlzLmFnZSA9IGFnZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIG5hbWUgKyAiKCIgKyBhZ2UgKyAiKSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcucmVnaXN0ZXIoTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoTXlSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0BsaW5rIEh0dHBVcmxDb25uZWN0b3J9IGJ5IGRlZmF1bHQgYWRkcyBzb21lIG1lZGlhIHR5cGVzCisgICAgICogdG8gdGhlIEFjY2VwdCBoZWFkZXIgaWYgd2UgZG9uJ3Qgc3BlY2lmeSB0aGVtLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdpdGhvdXREZWZpbmVkUmVxdWVzdGVkTWVkaWFUeXBlKCkgeworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCkucGF0aCgiL3BlcnNvbnMiKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLmdldCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaXRob3V0RGVmaW5lZFJlcXVlc3RlZE1lZGlhVHlwZUFuZFR3b01ldGhvZHMoKSB7CisgICAgICAgIC8vV2UgY2FuIG5vdCByZWx5IG9uIG1ldGhvZCBkZWNsYXJhdGlvbiBvcmRlcmluZzoKKyAgICAgICAgLy9Gcm9tIENsYXNzIGphdmFkb2M6ICJUaGUgZWxlbWVudHMgaW4gdGhlIHJldHVybmVkIGFycmF5IGFyZSBub3Qgc29ydGVkIGFuZCBhcmUgbm90IGluIGFueSBwYXJ0aWN1bGFyIG9yZGVyLiIKKyAgICAgICAgLy9JZiB0aGVyZSBhcmUgc2FtZSBlbmRwb2ludHMgaXQgaXMgbmVjZXNzYXJ5IHRvIHVzZSBxdWFsaXR5IHBhcmFtZXRlciB0byBlbnN1cmUgb3JkZXJpbmcuCisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiL3BlcnNvbnMvdHdvTWV0aG9kc09uZUVuZHBvaW50IikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUxfVFlQRSwgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdpdGhvdXREZWZpbmVkUmVxdWVzdGVkTWVkaWFUeXBlT3JRdWFsaXR5TW9kaWZpZXJzSnNvbigpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCIvcGVyc29ucy9zaG91bGRQaWNrRmlyc3RKc29uIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaXRob3V0RGVmaW5lZFJlcXVlc3RlZE1lZGlhVHlwZU9yUXVhbGl0eU1vZGlmaWVyc1htbCgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCIvcGVyc29ucy9zaG91bGRQaWNrRmlyc3RYbWwiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTF9UWVBFLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0KCkgeworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCkucGF0aCgiL3BlcnNvbnMiKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdChNZWRpYVR5cGUuV0lMRENBUkQpLmdldCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZlcnRlZCgpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpLnBhdGgoIi9wZXJzb25zL2ludmVydGVkIik7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoTWVkaWFUeXBlLldJTERDQVJEKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MX1RZUEUsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZlcnRlZFdpdGhKU09OUHJlZmVycmVkQnlDbGllbnQoKSB7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKS5wYXRoKCIvcGVyc29ucy9pbnZlcnRlZCIpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCJhcHBsaWNhdGlvbi9qc29uO3E9MS4wIiwgImFwcGxpY2F0aW9uL3htbDtxPTAuOCIpLmdldCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZW9yZGVyZWQoKSB7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKS5wYXRoKCIvcGVyc29ucy9yZW9yZGVyZWQiKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdChNZWRpYVR5cGUuV0lMRENBUkQpLmdldCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDbGllbnQgYW5kIHNlcnZlciBwcmVmZXJzICJ1bmtub3duL2hlbGxvIiBidXQgdGhlcmUgaXMgbm8gTUJXIG9uIHNlcnZlciB0byB3cml0ZSBzdWNoIGEgdHlwZS4gVGhlcmVmb3JlCisgICAgICogdGhpcyB0eXBlIGlzIGlnbm9yZWQgYW5kICJhcHBsaWNhdGlvbi94bWwiIGlzIGNob3NlbiAoYmVjYXVzZSBpdCBpcyB0aGUgc2Vjb25kIHByZWZlcnJlZCB0eXBlIGJ5IHRoZSBjbGllbnQpLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdpdGhVbmtub3duVHlwZVByZWZlcnJlZEJ5Q2xpZW50KCkgeworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCkucGF0aCgiL3BlcnNvbnMvcmVvcmRlcmVkIik7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoImFwcGxpY2F0aW9uL2pzb247cT0wLjgiLCAiYXBwbGljYXRpb24veG1sO3E9MC45IiwKKyAgICAgICAgICAgICAgICAidW5rbm93bi9oZWxsbztxcz0xLjAiKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MX1RZUEUsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9DdXN0b21JbmplY3RhYmxlc0FwcGxpY2F0aW9uVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvQ3VzdG9tSW5qZWN0YWJsZXNBcHBsaWNhdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTRiZmY2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvQ3VzdG9tSW5qZWN0YWJsZXNBcHBsaWNhdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDI3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuUXVhbGlmaWVyOworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuaGsyLkhrMkluamVjdGlvbk1hbmFnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5oazIuSGsyUmVxdWVzdFNjb3BlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5BYnN0cmFjdEJpbmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQW5ub3RhdGlvbkxpdGVyYWw7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkJpbmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQmluZGluZ3M7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkNsYXNzQmluZGluZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5zdGFuY2VCaW5kaW5nOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWwuUmVxdWVzdFNjb3BlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWwuUmVxdWVzdFNjb3BlZDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5EZXBsb3ltZW50Q29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzdW1lOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdFNhbWU7CisKKy8qKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEN1c3RvbUluamVjdGFibGVzQXBwbGljYXRpb25UZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15QXBwbGljYXRpb24gZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBTZXQ8Q2xhc3M8Pz4+IGNsYXNzZXMgPSBuZXcgSGFzaFNldDxDbGFzczw/Pj4oKSB7eworICAgICAgICAgICAgYWRkKFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgfX07CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBwdWJsaWMgTXlBcHBsaWNhdGlvbihJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiUmVnaXN0ZXJpbmcgaW5qZWN0YWJsZXMuLi4iKTsKKyAgICAgICAgICAgIENsYXNzQmluZGluZzxNeUluamVjdGFibGVQZXJSZXF1ZXN0PiBpbmplY3RDbGFzc1JlcXVlc3QgPQorICAgICAgICAgICAgICAgICAgICBCaW5kaW5ncy5zZXJ2aWNlQXNDb250cmFjdChNeUluamVjdGFibGVQZXJSZXF1ZXN0LmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5pbihSZXF1ZXN0U2NvcGVkLmNsYXNzKTsKKworICAgICAgICAgICAgQ2xhc3NCaW5kaW5nPE15SW5qZWN0YWJsZVNpbmdsZXRvbj4gaW5qZWN0Q2xhc3NTaW5nbGV0b24gPQorICAgICAgICAgICAgICAgICAgICBCaW5kaW5ncy5zZXJ2aWNlQXNDb250cmFjdChNeUluamVjdGFibGVTaW5nbGV0b24uY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmluKFNpbmdsZXRvbi5jbGFzcyk7CisKKyAgICAgICAgICAgIEluc3RhbmNlQmluZGluZzxNeUluamVjdGFibGVTaW5nbGV0b24+IGluamVjdEluc3RhbmNlU2luZ2xldG9uID0KKyAgICAgICAgICAgICAgICAgICAgQmluZGluZ3Muc2VydmljZUFzQ29udHJhY3QobmV3IE15SW5qZWN0YWJsZVNpbmdsZXRvbigpKTsKKworICAgICAgICAgICAgQ2xhc3NCaW5kaW5nPE15SW5qZWN0YWJsZVBlclJlcXVlc3Q+IGluamVjdFF1YWxpZmllZENsYXNzUmVxdWVzdCA9CisgICAgICAgICAgICAgICAgICAgIEJpbmRpbmdzLnNlcnZpY2VBc0NvbnRyYWN0KE15SW5qZWN0YWJsZVBlclJlcXVlc3QuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnF1YWxpZmllZEJ5KG5ldyBNeVF1YWxpZmllckltcGwoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW4oUmVxdWVzdFNjb3BlZC5jbGFzcyk7CisKKyAgICAgICAgICAgIGluamVjdGlvbk1hbmFnZXIucmVnaXN0ZXIoQXJyYXlzLmFzTGlzdCgKKyAgICAgICAgICAgICAgICAgICAgaW5qZWN0Q2xhc3NSZXF1ZXN0LCBpbmplY3RDbGFzc1NpbmdsZXRvbiwgaW5qZWN0SW5zdGFuY2VTaW5nbGV0b24sIGluamVjdFF1YWxpZmllZENsYXNzUmVxdWVzdCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gY2xhc3NlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlJbmplY3RhYmxlUGVyUmVxdWVzdCB7CisgICAgICAgIHB1YmxpYyBpbnQgaSA9IDA7CisgICAgfQorCisgICAgQFNpbmdsZXRvbgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlJbmplY3RhYmxlU2luZ2xldG9uIHsKKyAgICAgICAgcHVibGljIGludCBpID0gMDsKKyAgICB9CisKKyAgICBAUmV0ZW50aW9uKGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FKQorICAgIEBUYXJnZXQoRWxlbWVudFR5cGUuRklFTEQpCisgICAgQFF1YWxpZmllcgorICAgIHB1YmxpYyBzdGF0aWMgQGludGVyZmFjZSBNeVF1YWxpZmllciB7CisKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNeVF1YWxpZmllckltcGwgZXh0ZW5kcyBBbm5vdGF0aW9uTGl0ZXJhbDxNeVF1YWxpZmllcj4gaW1wbGVtZW50cyBNeVF1YWxpZmllciB7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworICAgICAgICBASW5qZWN0CisgICAgICAgIE15SW5qZWN0YWJsZVBlclJlcXVlc3QgbXlJbmplY3RhYmxlUGVyUmVxdWVzdDsKKworICAgICAgICBASW5qZWN0CisgICAgICAgIE15SW5qZWN0YWJsZVNpbmdsZXRvbiBteUluamVjdGFibGVTaW5nbGV0b247CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBATXlRdWFsaWZpZXIKKyAgICAgICAgTXlJbmplY3RhYmxlUGVyUmVxdWVzdCBteUluamVjdGFibGVQZXJSZXF1ZXN0MjsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCIvcGVycmVxdWVzdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW5kSW5jUGVyUmVxdWVzdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnZhbHVlT2YoKytteUluamVjdGFibGVQZXJSZXF1ZXN0LmkpLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCIvcGVycmVxdWVzdEN1c3RvbVF1YWxpZmllciIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW5kSW5jUGVyUmVxdWVzdDIoKSB7CisgICAgICAgICAgICByZXR1cm4gSW50ZWdlci52YWx1ZU9mKCsrbXlJbmplY3RhYmxlUGVyUmVxdWVzdDIuaSkudG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIi9zaW5nbGV0b24iKQorICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEFuZEluY1NpbmdsZXRvbigpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihteUluamVjdGFibGVTaW5nbGV0b24pOworICAgICAgICAgICAgcmV0dXJuIEludGVnZXIudmFsdWVPZigrK215SW5qZWN0YWJsZVNpbmdsZXRvbi5pKS50b1N0cmluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldHVwKCkgeworICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZShIazJJbmplY3Rpb25NYW5hZ2VyRmFjdG9yeS5pc0ltbWVkaWF0ZVN0cmF0ZWd5KCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBEZXBsb3ltZW50Q29udGV4dCBjb25maWd1cmVEZXBsb3ltZW50KCkgeworICAgICAgICAvLyBJZiBzdHJhdGVneSBpcyBub3QgSU1NRURJQVRFIHRoZW4gdGVzdCB3aWxsIGZhaWwgZXZlbiBiZWZvcmUgQEJlZm9yZSBzZXR1cCBtZXRob2QgaW52b2NhdGlvbi4KKyAgICAgICAgLy8gSXQgaGFzIG5vIG90aGVyIHJlYXNvbiB0aGVuIGp1c3QgcnVuIHRoZSB0ZXN0cyBpbiBJTU1FRElBVEUgc3RyYXRlZ3kuCisgICAgICAgIGlmIChIazJJbmplY3Rpb25NYW5hZ2VyRmFjdG9yeS5pc0ltbWVkaWF0ZVN0cmF0ZWd5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBEZXBsb3ltZW50Q29udGV4dC5uZXdJbnN0YW5jZShNeUFwcGxpY2F0aW9uLmNsYXNzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBEZXBsb3ltZW50Q29udGV4dC5uZXdJbnN0YW5jZShuZXcgUmVzb3VyY2VDb25maWcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQZXJSZXF1ZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQgcGVycmVxdWVzdCA9IHRhcmdldCgpLnBhdGgoInBlcnJlcXVlc3QiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCBwZXJyZXF1ZXN0LnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMSIsIHBlcnJlcXVlc3QucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgcGVycmVxdWVzdC5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZXRvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0IHBlcnJlcXVlc3QgPSB0YXJnZXQoKS5wYXRoKCJzaW5nbGV0b24iKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCBwZXJyZXF1ZXN0LnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMiIsIHBlcnJlcXVlc3QucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIzIiwgcGVycmVxdWVzdC5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbVF1YWxpZmllcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0IHBlcnJlcXVlc3RDdXN0b21Bbm5vdGF0aW9uID0gdGFyZ2V0KCkucGF0aCgicGVycmVxdWVzdEN1c3RvbVF1YWxpZmllciIpOworCisgICAgICAgIGFzc2VydEVxdWFscygiMSIsIHBlcnJlcXVlc3RDdXN0b21Bbm5vdGF0aW9uLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMSIsIHBlcnJlcXVlc3RDdXN0b21Bbm5vdGF0aW9uLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMSIsIHBlcnJlcXVlc3RDdXN0b21Bbm5vdGF0aW9uLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwbGFpbkhLMlRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyID0gSW5qZWN0aW9ucy5jcmVhdGVJbmplY3Rpb25NYW5hZ2VyKAorICAgICAgICAgICAgICAgIG5ldyBBYnN0cmFjdEJpbmRlcigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoSGsyUmVxdWVzdFNjb3BlLmNsYXNzKS50byhSZXF1ZXN0U2NvcGUuY2xhc3MpLmluKFNpbmdsZXRvbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBiaW5kQXNDb250cmFjdChNeUluamVjdGFibGVQZXJSZXF1ZXN0LmNsYXNzKS5pbihSZXF1ZXN0U2NvcGVkLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRBc0NvbnRyYWN0KE15SW5qZWN0YWJsZVNpbmdsZXRvbi5jbGFzcykuaW4oU2luZ2xldG9uLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLmNvbXBsZXRlUmVnaXN0cmF0aW9uKCk7CisKKyAgICAgICAgZmluYWwgUmVxdWVzdFNjb3BlIHJlcXVlc3RTY29wZSA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoUmVxdWVzdFNjb3BlLmNsYXNzKTsKKworICAgICAgICBmaW5hbCBNeUluamVjdGFibGVTaW5nbGV0b24gbXlJbmplY3RhYmxlU2luZ2xldG9uID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShNeUluamVjdGFibGVTaW5nbGV0b24uY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMobXlJbmplY3RhYmxlU2luZ2xldG9uLCBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKE15SW5qZWN0YWJsZVNpbmdsZXRvbi5jbGFzcykpOworCisgICAgICAgIGZpbmFsIE15SW5qZWN0YWJsZVBlclJlcXVlc3QgbXlJbmplY3RhYmxlUGVyUmVxdWVzdCA9IHJlcXVlc3RTY29wZS5ydW5JblNjb3BlKG5ldyBDYWxsYWJsZTxNeUluamVjdGFibGVQZXJSZXF1ZXN0PigpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgTXlJbmplY3RhYmxlUGVyUmVxdWVzdCBjYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgZmluYWwgTXlJbmplY3RhYmxlUGVyUmVxdWVzdCBteUluamVjdGFibGVQZXJSZXF1ZXN0ID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShNeUluamVjdGFibGVQZXJSZXF1ZXN0LmNsYXNzKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMobXlJbmplY3RhYmxlUGVyUmVxdWVzdCwgaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShNeUluamVjdGFibGVQZXJSZXF1ZXN0LmNsYXNzKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG15SW5qZWN0YWJsZVBlclJlcXVlc3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIHJlcXVlc3RTY29wZS5ydW5JblNjb3BlKG5ldyBSdW5uYWJsZSgpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0Tm90U2FtZShteUluamVjdGFibGVQZXJSZXF1ZXN0LCBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKE15SW5qZWN0YWJsZVBlclJlcXVlc3QuY2xhc3MpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHBsYWluSEsyRHluYW1pY1Rlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQmluZGVyIGJpbmRlciA9IG5ldyBBYnN0cmFjdEJpbmRlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICAgICAgICAgIGJpbmQoSGsyUmVxdWVzdFNjb3BlLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgLnRvKFJlcXVlc3RTY29wZS5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5pbihTaW5nbGV0b24uY2xhc3MpOworCisgICAgICAgICAgICAgICAgYmluZEFzQ29udHJhY3QoTXlJbmplY3RhYmxlUGVyUmVxdWVzdC5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5pbihSZXF1ZXN0U2NvcGVkLmNsYXNzKTsKKworICAgICAgICAgICAgICAgIGJpbmRBc0NvbnRyYWN0KE15SW5qZWN0YWJsZVNpbmdsZXRvbi5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5pbihTaW5nbGV0b24uY2xhc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgICAgICBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIgPSBJbmplY3Rpb25zLmNyZWF0ZUluamVjdGlvbk1hbmFnZXIoKTsKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5yZWdpc3RlcihiaW5kZXIpOworICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLmNvbXBsZXRlUmVnaXN0cmF0aW9uKCk7CisKKyAgICAgICAgZmluYWwgUmVxdWVzdFNjb3BlIHJlcXVlc3RTY29wZSA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoUmVxdWVzdFNjb3BlLmNsYXNzKTsKKworICAgICAgICBmaW5hbCBNeUluamVjdGFibGVTaW5nbGV0b24gbXlJbmplY3RhYmxlU2luZ2xldG9uID0gaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShNeUluamVjdGFibGVTaW5nbGV0b24uY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMobXlJbmplY3RhYmxlU2luZ2xldG9uLCBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKE15SW5qZWN0YWJsZVNpbmdsZXRvbi5jbGFzcykpOworCisgICAgICAgIGZpbmFsIE15SW5qZWN0YWJsZVBlclJlcXVlc3QgbXlJbmplY3RhYmxlUGVyUmVxdWVzdCA9IHJlcXVlc3RTY29wZS5ydW5JblNjb3BlKG5ldyBDYWxsYWJsZTxNeUluamVjdGFibGVQZXJSZXF1ZXN0PigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIE15SW5qZWN0YWJsZVBlclJlcXVlc3QgY2FsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgICAgIGZpbmFsIE15SW5qZWN0YWJsZVBlclJlcXVlc3QgbXlJbmplY3RhYmxlUGVyUmVxdWVzdCA9IGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoTXlJbmplY3RhYmxlUGVyUmVxdWVzdC5jbGFzcyk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG15SW5qZWN0YWJsZVBlclJlcXVlc3QsIGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoTXlJbmplY3RhYmxlUGVyUmVxdWVzdC5jbGFzcykpOworICAgICAgICAgICAgICAgIHJldHVybiBteUluamVjdGFibGVQZXJSZXF1ZXN0OworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICByZXF1ZXN0U2NvcGUucnVuSW5TY29wZShuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnROb3RTYW1lKG15SW5qZWN0YWJsZVBlclJlcXVlc3QsIGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoTXlJbmplY3RhYmxlUGVyUmVxdWVzdC5jbGFzcykpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9DdXN0b21JbmplY3RhYmxlc1Jlc291cmNlQ29uZmlnVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvQ3VzdG9tSW5qZWN0YWJsZXNSZXNvdXJjZUNvbmZpZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzZmYjRkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvQ3VzdG9tSW5qZWN0YWJsZXNSZXNvdXJjZUNvbmZpZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDE1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LmluamVjdC5RdWFsaWZpZXI7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5BYnN0cmFjdEJpbmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQW5ub3RhdGlvbkxpdGVyYWw7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5pbnRlcm5hbC5SZXF1ZXN0U2NvcGVkOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEN1c3RvbUluamVjdGFibGVzUmVzb3VyY2VDb25maWdUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15SEsyQmluZGVyIGV4dGVuZHMgQWJzdHJhY3RCaW5kZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgICAgICAvLyByZXF1ZXN0IHNjb3BlIGJpbmRpbmcKKyAgICAgICAgICAgIGJpbmRBc0NvbnRyYWN0KE15SW5qZWN0YWJsZVBlclJlcXVlc3QuY2xhc3MpLmluKFJlcXVlc3RTY29wZWQuY2xhc3MpOworCisgICAgICAgICAgICAvLyBzaW5nbGV0b24gYmluZGluZworICAgICAgICAgICAgYmluZEFzQ29udHJhY3QoTXlJbmplY3RhYmxlU2luZ2xldG9uLmNsYXNzKS5pbihTaW5nbGV0b24uY2xhc3MpOworCisgICAgICAgICAgICAvLyBzaW5nbGV0b24gaW5zdGFuY2UgYmluZGluZworICAgICAgICAgICAgYmluZChuZXcgTXlJbmplY3RhYmxlU2luZ2xldG9uKCkpLnRvKE15SW5qZWN0YWJsZVNpbmdsZXRvbi5jbGFzcyk7CisKKyAgICAgICAgICAgIC8vIHJlcXVlc3Qgc2NvcGUgYmluZGluZyB3aXRoIHNwZWNpZmllZCBjdXN0b20gYW5ub3RhdGlvbgorICAgICAgICAgICAgYmluZEFzQ29udHJhY3QoTXlJbmplY3RhYmxlUGVyUmVxdWVzdC5jbGFzcykucXVhbGlmaWVkQnkobmV3IE15UXVhbGlmaWVySW1wbCgpKS5pbihSZXF1ZXN0U2NvcGVkLmNsYXNzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlJbmplY3RhYmxlUGVyUmVxdWVzdCB7CisgICAgICAgIHB1YmxpYyBpbnQgaSA9IDA7CisgICAgfQorCisgICAgQFNpbmdsZXRvbgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlJbmplY3RhYmxlU2luZ2xldG9uIHsKKyAgICAgICAgcHVibGljIGludCBpID0gMDsKKyAgICB9CisKKyAgICBAUmV0ZW50aW9uKGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeS5SVU5USU1FKQorICAgIEBUYXJnZXQoRWxlbWVudFR5cGUuRklFTEQpCisgICAgQFF1YWxpZmllcgorICAgIHB1YmxpYyBzdGF0aWMgQGludGVyZmFjZSBNeVF1YWxpZmllciB7CisKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNeVF1YWxpZmllckltcGwgZXh0ZW5kcyBBbm5vdGF0aW9uTGl0ZXJhbDxNeVF1YWxpZmllcj4gaW1wbGVtZW50cyBNeVF1YWxpZmllciB7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworICAgICAgICBASW5qZWN0CisgICAgICAgIE15SW5qZWN0YWJsZVBlclJlcXVlc3QgbXlJbmplY3RhYmxlUGVyUmVxdWVzdDsKKworICAgICAgICBASW5qZWN0CisgICAgICAgIE15SW5qZWN0YWJsZVNpbmdsZXRvbiBteUluamVjdGFibGVTaW5nbGV0b247CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBATXlRdWFsaWZpZXIKKyAgICAgICAgTXlJbmplY3RhYmxlUGVyUmVxdWVzdCBteUluamVjdGFibGVQZXJSZXF1ZXN0MjsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCIvcGVycmVxdWVzdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW5kSW5jUGVyUmVxdWVzdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnZhbHVlT2YoKytteUluamVjdGFibGVQZXJSZXF1ZXN0LmkpLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCIvcGVycmVxdWVzdEN1c3RvbVF1YWxpZmllciIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QW5kSW5jUGVyUmVxdWVzdDIoKSB7CisgICAgICAgICAgICByZXR1cm4gSW50ZWdlci52YWx1ZU9mKCsrbXlJbmplY3RhYmxlUGVyUmVxdWVzdDIuaSkudG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIi9zaW5nbGV0b24iKQorICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEFuZEluY1NpbmdsZXRvbigpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihteUluamVjdGFibGVTaW5nbGV0b24pOworICAgICAgICAgICAgcmV0dXJuIEludGVnZXIudmFsdWVPZigrK215SW5qZWN0YWJsZVNpbmdsZXRvbi5pKS50b1N0cmluZygpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgUmVzb3VyY2VDb25maWcgcmMgPSBuZXcgUmVzb3VyY2VDb25maWcoKTsKKyAgICAgICAgcmMucmVnaXN0ZXJDbGFzc2VzKFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgcmMucmVnaXN0ZXIobmV3IE15SEsyQmluZGVyKCkpOworCisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQZXJSZXF1ZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQgcGVyUmVxdWVzdCA9IHRhcmdldCgpLnBhdGgoInBlcnJlcXVlc3QiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCBwZXJSZXF1ZXN0LnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMSIsIHBlclJlcXVlc3QucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgcGVyUmVxdWVzdC5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZXRvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0IHBlclJlcXVlc3QgPSB0YXJnZXQoKS5wYXRoKCJzaW5nbGV0b24iKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCBwZXJSZXF1ZXN0LnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMiIsIHBlclJlcXVlc3QucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIzIiwgcGVyUmVxdWVzdC5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbUFubm90YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldCBwZXJSZXF1ZXN0Q3VzdG9tQW5ub3RhdGlvbiA9IHRhcmdldCgpLnBhdGgoInBlcnJlcXVlc3RDdXN0b21RdWFsaWZpZXIiKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCBwZXJSZXF1ZXN0Q3VzdG9tQW5ub3RhdGlvbi5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCBwZXJSZXF1ZXN0Q3VzdG9tQW5ub3RhdGlvbi5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCBwZXJSZXF1ZXN0Q3VzdG9tQW5ub3RhdGlvbi5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0N1c3RvbU11bHRpdmFsdWVkTWFwUHJvdmlkZXJUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9DdXN0b21NdWx0aXZhbHVlZE1hcFByb3ZpZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MDg4ZGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9DdXN0b21NdWx0aXZhbHVlZE1hcFByb3ZpZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRIYXNoTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZS5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdHMgdGhhdCB0aGUgQ3VzdG9tIE11bHRpdmFsdWVkTWFwIHByb3ZpZGVyIG92ZXJyaWRlcyB0aGUgZGVmYXVsdAorICogRW50aXR5UHJvdmlkZXIKKyAqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworcHVibGljIGNsYXNzIEN1c3RvbU11bHRpdmFsdWVkTWFwUHJvdmlkZXJUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKAorICAgICAgICAgICAgICAgIFRlc3RSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBDdXN0b21NdWx0aXZhbHVlZE1hcFByb3ZpZGVyLmNsYXNzKTsKKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0ZPUk1fVVJMRU5DT0RFRCkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEN1c3RvbU11bHRpdmFsdWVkTWFwUHJvdmlkZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVJlYWRlcjxNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZShDbGFzcyB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBNdWx0aXZhbHVlZE1hcC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICBwdWJsaWMgTXVsdGl2YWx1ZWRNYXAgcmVhZEZyb20oQ2xhc3MgdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwIGh0dHBIZWFkZXJzLCBJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXAgbWFwID0gbmV3IE11bHRpdmFsdWVkSGFzaE1hcCgpOworICAgICAgICAgICAgbWFwLmFkZChnZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSwgZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkucmVwbGFjZSgiUHJvdmlkZXIiLCAiUmVhZGVyIikpOworICAgICAgICAgICAgcmV0dXJuIG1hcDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJyZXNvdXJjZSIpCisgICAgQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9GT1JNX1VSTEVOQ09ERUQpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0UmVzb3VyY2UgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIEBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fRk9STV9VUkxFTkNPREVEKQorICAgICAgICBwdWJsaWMgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcChNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gbWFwKSB7CisgICAgICAgICAgICByZXR1cm4gbWFwOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsRm9ybVBhcmFtKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgicmVzb3VyY2UiKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KCJtYXAiLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fRk9STV9VUkxFTkNPREVEX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkN1c3RvbU11bHRpdmFsdWVkTWFwUHJvdmlkZXI9Q3VzdG9tTXVsdGl2YWx1ZWRNYXBSZWFkZXIiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvRW5jb2RlZEZvcm1QYXJhbVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0VuY29kZWRGb3JtUGFyYW1UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRkMDM3OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0VuY29kZWRGb3JtUGFyYW1UZXN0LmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5FbmNvZGVkOworaW1wb3J0IGphdmF4LndzLnJzLkZvcm1QYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFByb3BlciBlbmNvZGluZyBvZiBGb3JtIHBhcmFtcworICoKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitwdWJsaWMgY2xhc3MgRW5jb2RlZEZvcm1QYXJhbVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBQYXRoKCJlbmNvZGVkIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFVybEVuY29kZWRSZXNvdXJjZSB7CisKKyAgICAgICAgQEVuY29kZWQKKyAgICAgICAgQEZvcm1QYXJhbSgibmFtZSIpCisgICAgICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgICAgICAgQEZvcm1QYXJhbSgibmFtZSIpCisgICAgICAgIHByaXZhdGUgU3RyaW5nIG90aGVyTmFtZTsKKworICAgICAgICBAUE9TVAorICAgICAgICBAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0ZPUk1fVVJMRU5DT0RFRCkKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoQEZvcm1QYXJhbSgibmFtZSIpIExpc3Q8U3RyaW5nPiBuYW1lKSAgeworICAgICAgICAgICAgcmV0dXJuIG5hbWUudG9TdHJpbmcoKSArICIgIiArIHRoaXMubmFtZTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhVcmxFbmNvZGVkUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVuY29kZWRQYXJhbSgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzdWx0ID0gdGFyZ2V0KCkucGF0aCgiZW5jb2RlZCIpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkoIm5hbWUmbmFtZT1HZW9yZ2UiLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fRk9STV9VUkxFTkNPREVEX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbbnVsbCwgR2VvcmdlXSBudWxsIiwgcmVzdWx0LnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9FbmNvZGVkU2xhc2hJblBhdGhTZWdtZW50VGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvRW5jb2RlZFNsYXNoSW5QYXRoU2VnbWVudFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDgyOGY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvRW5jb2RlZFNsYXNoSW5QYXRoU2VnbWVudFRlc3QuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0IGZvciBKRVJTRVktMTE2Ny4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgRW5jb2RlZFNsYXNoSW5QYXRoU2VnbWVudFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoRW5jb2RlZFNsYXNoUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBQYXRoKCIvdGVzdC97cH0iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRW5jb2RlZFNsYXNoUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoQFBhdGhQYXJhbSgicCIpIFN0cmluZyBwKSB7CisgICAgICAgICAgICByZXR1cm4gcDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVuY29kZWRTbGFzaEluUGF0aFBhcmFtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0L29uZSUyRnR3byIpLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygib25lL3R3byIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9FbnRpdHlFeHBhbnNpb25UZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9FbnRpdHlFeHBhbnNpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVlN2RlNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0VudGl0eUV4cGFuc2lvblRlc3QuamF2YQpAQCAtMCwwICsxLDE3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuQmFkUmVxdWVzdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LkV4Y2VwdGlvbk1hcHBlcjsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5TYXhIZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LkFzc3VtZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYUGFyc2VFeGNlcHRpb247CisKKy8qKgorICogVGVzdHMgcHJvcGVydGllcyBjb25maWd1cmluZyBzZWN1cmUgc2F4IHBhcnNpbmcuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgY2xhc3MgRW50aXR5RXhwYW5zaW9uVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoRW50aXR5RXhwYW5zaW9uVGVzdC5jbGFzcy5nZXROYW1lKCkpOworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNYZGsgPSBmYWxzZTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiZW50aXR5RXhwYW5zaW9uTGltaXQiLCAiMTAiKTsKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJlbGVtZW50QXR0cmlidXRlTGltaXQiLCAiMSIpOworCisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKFRlc3RSZXNvdXJjZS5jbGFzcywgQmFkUmVxdWVzdE1hcHBlci5jbGFzcyk7CisgICAgICAgIHJldHVybiByZXNvdXJjZUNvbmZpZzsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJhZFJlcXVlc3RNYXBwZXIgaW1wbGVtZW50cyBFeGNlcHRpb25NYXBwZXI8QmFkUmVxdWVzdEV4Y2VwdGlvbj4geworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHRvUmVzcG9uc2UoQmFkUmVxdWVzdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgIFRocm93YWJsZSB0ID0gZXhjZXB0aW9uOworICAgICAgICAgICAgd2hpbGUgKHQgIT0gbnVsbCAmJiB0LmdldENsYXNzKCkgIT0gU0FYUGFyc2VFeGNlcHRpb24uY2xhc3MpIHsKKyAgICAgICAgICAgICAgICB0ID0gdC5nZXRDYXVzZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygpLmVudGl0eSgiUEFTU0VEOiIgKyB0LmdldE1lc3NhZ2UoKSkuYnVpbGQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoNTAwKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RSZXNvdXJjZSB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0KFRlc3RCZWFuIGJlYW4pIHsKKyAgICAgICAgICAgIHJldHVybiBiZWFuLmdldElucHV0KCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIEBYbWxSb290RWxlbWVudCgpCisgICAgQFhtbEFjY2Vzc29yVHlwZSh2YWx1ZSA9IFhtbEFjY2Vzc1R5cGUuRklFTEQpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0QmVhbiB7CisgICAgICAgIEBYbWxFbGVtZW50CisgICAgICAgIHByaXZhdGUgU3RyaW5nIGlucHV0OworCisgICAgICAgIEBYbWxBdHRyaWJ1dGUKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgc3RyOworCisgICAgICAgIEBYbWxBdHRyaWJ1dGUKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgc3RyMjsKKworICAgICAgICBAWG1sQXR0cmlidXRlCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHN0cjM7CisKKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFN0cjIoKSB7CisgICAgICAgICAgICByZXR1cm4gc3RyMjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFN0cjIoU3RyaW5nIHN0cjIpIHsKKyAgICAgICAgICAgIHRoaXMuc3RyMiA9IHN0cjI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFN0cigpIHsKKyAgICAgICAgICAgIHJldHVybiBzdHI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRTdHIoU3RyaW5nIHN0cikgeworICAgICAgICAgICAgdGhpcy5zdHIgPSBzdHI7CisgICAgICAgIH0KKworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyMygpIHsKKyAgICAgICAgICAgIHJldHVybiBzdHIzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0U3RyMyhTdHJpbmcgc3RyMykgeworICAgICAgICAgICAgdGhpcy5zdHIzID0gc3RyMzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5wdXQoKSB7CisgICAgICAgICAgICByZXR1cm4gaW5wdXQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRJbnB1dChTdHJpbmcgaW5wdXQpIHsKKyAgICAgICAgICAgIHRoaXMuaW5wdXQgPSBpbnB1dDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBCZWZvcmVDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRYZGtGbGFnKCkgeworICAgICAgICAvLyBYREsgU0FYUGFyc2VyIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBmZWF0dXJlLCBzbyB0aGUgdGVzdCBoYXMgdG8gYmUgc2tpcHBlZCBpZiBYREsgZGV0ZWN0ZWQuCisgICAgICAgIGlmIChTYXhIZWxwZXIuaXNYZGtQYXJzZXJGYWN0b3J5KFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKSkpIHsKKyAgICAgICAgICAgIExPRy53YXJuaW5nKCJYREsgU0FYUGFyc2VyIGRldGVjdGVkLCBGRUFUVVJFX1NFQ1VSRV9QUk9DRVNTSU5HIGlzIG5vdCBzdXBwb3J0ZWQuIFRlc3RzIHdpbGwgYmUgc2tpcHBlZC4iKTsKKyAgICAgICAgICAgIGlzWGRrID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZSghaXNYZGspOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVudGl0eUV4cGFuc2lvbigpIHsKKyAgICAgICAgU3RyaW5nIHN0ciA9ICI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiIHN0YW5kYWxvbmU9XCJ5ZXNcIj8+IgorICAgICAgICAgICAgICAgICsgIlxuPCFET0NUWVBFIGxvbHogW1xuIgorICAgICAgICAgICAgICAgICsgIiAgPCFFTlRJVFkgbG9sIFwibG9sbG9sbG9sbG9sbG9sbG9sbG9sWy4uLl1cIj5cbiIKKyAgICAgICAgICAgICAgICArICIgIDwhRU5USVRZIGxvbDIgXCImbG9sOyZsb2w7JmxvbDsmbG9sOyZsb2w7JmxvbDsmbG9sOyZsb2w7JmxvbDsmbG9sO1wiPlxuIgorICAgICAgICAgICAgICAgICsgIiAgPCFFTlRJVFkgbG9sMyBcIiZsb2wyOyZsb2wyOyZsb2wyOyZsb2wyOyZsb2wyOyZsb2wyOyZsb2wyOyZsb2wyOyZsb2wyOyZsb2wyO1wiPlxuIgorICAgICAgICAgICAgICAgICsgIl0+XG4iCisgICAgICAgICAgICAgICAgKyAiPHRlc3RCZWFuPjxpbnB1dD4mbG9sMzs8L2lucHV0PjwvdGVzdEJlYW4+IjsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShzdHIsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUwpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGVudGl0eSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoZW50aXR5LnN0YXJ0c1dpdGgoIlBBU1NFRCIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXhBdHRyaWJ1dGVzKCkgeworICAgICAgICBTdHJpbmcgc3RyID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCIgc3RhbmRhbG9uZT1cInllc1wiPz4iCisgICAgICAgICAgICAgICAgKyAiPHRlc3RCZWFuIHN0cj1cImFhYVwiIHN0cjI9XCJiYmJcIiBzdHIzPVwiY2NjXCI+PGlucHV0PnRlc3Q8L2lucHV0PjwvdGVzdEJlYW4+IjsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZSIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoc3RyLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBlbnRpdHkgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGVudGl0eS5zdGFydHNXaXRoKCJQQVNTRUQiKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9FeGNlcHRpb25Mb2dnaW5nVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvRXhjZXB0aW9uTG9nZ2luZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDMzYWU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvRXhjZXB0aW9uTG9nZ2luZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIE1ha2Ugc3VyZSBleGNlcHRpb25zLCB0aGF0IGFyZSBub3QgbWFwcGVkIHRvIHJlc3BvbnNlcyBnZXQgbG9nZ2VkLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBFeGNlcHRpb25Mb2dnaW5nVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTXlDaGVja2VkRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHt9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNeVJ1bnRpbWVFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHt9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeGNlcHRpb25SZXNvdXJjZSB7CisKKyAgICAgICAgQFBhdGgoInJ1bnRpbWUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHJ1bnRpbWVFeGNlcHRpb24oKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTXlSdW50aW1lRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiY2hlY2tlZCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgY2hlY2tlZEV4Y2VwdGlvbigpIHRocm93cyBNeUNoZWNrZWRFeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3cgbmV3IE15Q2hlY2tlZEV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgc2V0KFRlc3RQcm9wZXJ0aWVzLlJFQ09SRF9MT0dfTEVWRUwsIExldmVsLkZJTkUuaW50VmFsdWUoKSk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhFeGNlcHRpb25SZXNvdXJjZS5jbGFzcywgV3JpdGVyLmNsYXNzLCBSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UnVudGltZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJ1bnRpbWUiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyg1MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGdldExhc3RMb2dnZWRSZWNvcmQoKS5nZXRUaHJvd24oKS5nZXRDbGFzcygpLCBNeVJ1bnRpbWVFeGNlcHRpb24uY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENoZWNrZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJjaGVja2VkIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoNTAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhnZXRMYXN0TG9nZ2VkUmVjb3JkKCkuZ2V0VGhyb3duKCkuZ2V0Q2xhc3MoKSwgTXlDaGVja2VkRXhjZXB0aW9uLmNsYXNzKTsKKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLldJTERDQVJEKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgV3JpdGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8RXhjZXB0aW9uTG9nZ2luZ1Rlc3RQT0pPPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gRXhjZXB0aW9uTG9nZ2luZ1Rlc3RQT0pPLmNsYXNzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldFNpemUoRXhjZXB0aW9uTG9nZ2luZ1Rlc3RQT0pPIGVudGl0eUZvclJlYWRlciwgQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oRXhjZXB0aW9uTG9nZ2luZ1Rlc3RQT0pPIGVudGl0eUZvclJlYWRlciwgQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJ0ZXN0Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBQYXRoKCJlbnRpdHkiKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBFeGNlcHRpb25Mb2dnaW5nVGVzdFBPSk8gZW50aXR5KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBFeGNlcHRpb25Mb2dnaW5nVGVzdFBPSk8oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRlckZhaWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UvZW50aXR5IikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoNTAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGdldExhc3RMb2dnZWRSZWNvcmQoKS5nZXRUaHJvd24oKS5nZXRNZXNzYWdlKCksICJ0ZXN0Iik7CisgICAgfQorCisgICAgc3RhdGljIGNsYXNzIEV4Y2VwdGlvbkxvZ2dpbmdUZXN0UE9KTyB7CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9FeGNlcHRpb25NYXBwZXJQcmlvcml0eVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0V4Y2VwdGlvbk1hcHBlclByaW9yaXR5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMjUyMzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9FeGNlcHRpb25NYXBwZXJQcmlvcml0eVRlc3QuamF2YQpAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LkV4Y2VwdGlvbk1hcHBlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuY29yZS5Jcy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBFeGNlcHRpb25NYXBwZXJQcmlvcml0eVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoRXhjZXB0aW9uTWFwcGVyUHJpb3JpdHlSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNeUZpcnN0RXhjZXB0aW9uTWFwcGVyLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE15U2Vjb25kRXhjZXB0aW9uTWFwcGVyLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE15VGhpcmRFeGNlcHRpb25NYXBwZXIuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcHJpb3JpdHlUZXN0KCkgeworICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZSwgaXMoTXlTZWNvbmRFeGNlcHRpb25NYXBwZXIuY2xhc3MuZ2V0TmFtZSgpKSk7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXhjZXB0aW9uTWFwcGVyUHJpb3JpdHlSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHRocm93cyBNeUV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTXlFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworCisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgQFByaW9yaXR5KDMwMCkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15Rmlyc3RFeGNlcHRpb25NYXBwZXIgaW1wbGVtZW50cyBFeGNlcHRpb25NYXBwZXI8TXlFeGNlcHRpb24+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHRvUmVzcG9uc2UoTXlFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soTXlGaXJzdEV4Y2VwdGlvbk1hcHBlci5jbGFzcy5nZXROYW1lKCkpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBAUHJpb3JpdHkoMTAwKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlTZWNvbmRFeGNlcHRpb25NYXBwZXIgaW1wbGVtZW50cyBFeGNlcHRpb25NYXBwZXI8TXlFeGNlcHRpb24+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHRvUmVzcG9uc2UoTXlFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soTXlTZWNvbmRFeGNlcHRpb25NYXBwZXIuY2xhc3MuZ2V0TmFtZSgpKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgQFByaW9yaXR5KDIwMCkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15VGhpcmRFeGNlcHRpb25NYXBwZXIgaW1wbGVtZW50cyBFeGNlcHRpb25NYXBwZXI8TXlFeGNlcHRpb24+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHRvUmVzcG9uc2UoTXlFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soTXlUaGlyZEV4Y2VwdGlvbk1hcHBlci5jbGFzcy5nZXROYW1lKCkpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9FeGNlcHRpb25NYXBwZXJQcm9wYWdhdGlvblRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0V4Y2VwdGlvbk1hcHBlclByb3BhZ2F0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmOWRhZjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9FeGNlcHRpb25NYXBwZXJQcm9wYWdhdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDUyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkhlYWRlclBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlc3BvbnNlRmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5FeGNlcHRpb25NYXBwZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUmVhZGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJlYWRlckludGVyY2VwdG9yQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yQ29udGV4dDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC51dGlsLnJ1bm5lci5Db25jdXJyZW50UnVubmVyOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3QgZXhjZXB0aW9uIG1hcHBlcnMgaGFuZGxpbmcgZXhjZXB0aW9ucyB0aHJvd24gZnJvbSBkaWZmZXJlbnQgcGFydCBvZiBjb2RlLgorICogPHAvPgorICogVGhlcmUgYXJlIG1vcmUgdGVzdHMgZm9yIGV4Y2VwdGlvbiBtYXBwZXJzLiBUaGlzIG9uZSBmb2N1c2VzIG9uIHRlc3RpbmcgdGhhdCBleGNlcHRpb25zCisgKiB0aHJvd24gZnJvbSBwcm92aWRlcnMgYXJlIGNvcnJlY3RseSBwcm9wYWdhdGVkIHRvIHRoZSBleGNlcHRpb24gbWFwcGVyLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqCisgKi8KK0BSdW5XaXRoKENvbmN1cnJlbnRSdW5uZXIuY2xhc3MpCitwdWJsaWMgY2xhc3MgRXhjZXB0aW9uTWFwcGVyUHJvcGFnYXRpb25UZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWENFUFRJT05fVFlQRSA9ICJleGNlcHRpb24tdHlwZSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUFQUEVEID0gIi1tYXBwZWQtIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQVBQRURfV0FFID0gIi13YWUtIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9WSURFUiA9ICJwcm92aWRlciI7CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RSdW50aW1lRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgcHVibGljIFRlc3RSdW50aW1lRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgICAgICBzdXBlcihtZXNzYWdlKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0Q2hlY2tlZEV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgcHVibGljIFRlc3RDaGVja2VkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgICAgICBzdXBlcihtZXNzYWdlKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0V2ViQXBwRXhjZXB0aW9uIGV4dGVuZHMgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworCisgICAgICAgIHB1YmxpYyBUZXN0V2ViQXBwRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlLCBSZXNwb25zZSByZXNwb25zZSkgeworICAgICAgICAgICAgc3VwZXIobWVzc2FnZSwgcmVzcG9uc2UpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKAorICAgICAgICAgICAgICAgIFVuaXZlcnNhbFRocm93YWJsZU1hcHBlci5jbGFzcywKKyAgICAgICAgICAgICAgICBFeGNlcHRpb25SZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBUZXN0UmVzcG9uc2VGaWx0ZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgVGVzdFJlcXVlc3RGaWx0ZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgV2ViQXBwTWFwcGVyLmNsYXNzLAorICAgICAgICAgICAgICAgIFRlc3RNQlIuY2xhc3MsCisgICAgICAgICAgICAgICAgVGVzdE1CVy5jbGFzcywKKyAgICAgICAgICAgICAgICBUZXN0V3JpdGVySW50ZXJjZXB0b3IuY2xhc3MsCisgICAgICAgICAgICAgICAgVGVzdFJlYWRlckludGVyY2VwdG9yLmNsYXNzCisgICAgICAgICk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBVbml2ZXJzYWxUaHJvd2FibGVNYXBwZXIgaW1wbGVtZW50cyBFeGNlcHRpb25NYXBwZXI8VGhyb3dhYmxlPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSB0b1Jlc3BvbnNlKFRocm93YWJsZSBleGNlcHRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygpLmVudGl0eShleGNlcHRpb24uZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkgKyBNQVBQRUQgKyBleGNlcHRpb24uZ2V0TWVzc2FnZSgpKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFdlYkFwcE1hcHBlciBpbXBsZW1lbnRzIEV4Y2VwdGlvbk1hcHBlcjxUZXN0V2ViQXBwRXhjZXB0aW9uPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSB0b1Jlc3BvbnNlKFRlc3RXZWJBcHBFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IGV4Y2VwdGlvbi5nZXRSZXNwb25zZSgpOworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyhyZXNwb25zZS5nZXRTdGF0dXMoKSkKKyAgICAgICAgICAgICAgICAgICAgLmVudGl0eShleGNlcHRpb24uZ2V0Q2xhc3MoKS5nZXRTaW1wbGVOYW1lKCkgKyBNQVBQRURfV0FFICsgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGhyb3dFeGNlcHRpb24oU3RyaW5nIGV4Y2VwdGlvblR5cGUsIFN0cmluZyBwcm92aWRlciwgQ2xhc3M8Pz4gY3VycmVudENsYXNzKSB0aHJvd3MgVGhyb3dhYmxlIHsKKworICAgICAgICBpZiAoc2hvdWxkVGhyb3coZXhjZXB0aW9uVHlwZSwgcHJvdmlkZXIsIGN1cnJlbnRDbGFzcykpIHsKKyAgICAgICAgICAgIGlmIChleGNlcHRpb25UeXBlLmVxdWFscyhUZXN0Q2hlY2tlZEV4Y2VwdGlvbi5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRlc3RDaGVja2VkRXhjZXB0aW9uKHByb3ZpZGVyKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZXhjZXB0aW9uVHlwZS5lcXVhbHMoVGVzdFJ1bnRpbWVFeGNlcHRpb24uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUZXN0UnVudGltZUV4Y2VwdGlvbihwcm92aWRlcik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGV4Y2VwdGlvblR5cGUuZXF1YWxzKFRlc3RXZWJBcHBFeGNlcHRpb24uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUZXN0V2ViQXBwRXhjZXB0aW9uKHByb3ZpZGVyLCBSZXNwb25zZS5vaygpLmJ1aWxkKCkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChleGNlcHRpb25UeXBlLmVxdWFscyhQcm9jZXNzaW5nRXhjZXB0aW9uLmNsYXNzLmdldFNpbXBsZU5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUHJvY2Vzc2luZ0V4Y2VwdGlvbihwcm92aWRlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHNob3VsZFRocm93KFN0cmluZyBleGNlcHRpb25UeXBlLCBTdHJpbmcgcHJvdmlkZXIsIENsYXNzPD8+IGN1cnJlbnRDbGFzcykgeworICAgICAgICByZXR1cm4gZXhjZXB0aW9uVHlwZSAhPSBudWxsICYmIGN1cnJlbnRDbGFzcy5nZXRTaW1wbGVOYW1lKCkuZXF1YWxzKHByb3ZpZGVyKTsKKyAgICB9CisKKyAgICBAUGF0aCgiZXhjZXB0aW9uIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEV4Y2VwdGlvblJlc291cmNlIHsKKworICAgICAgICBAUGF0aCgiZ2VuZXJhbCIpCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBwb3N0KEBIZWFkZXJQYXJhbShFWENFUFRJT05fVFlQRSkgU3RyaW5nIGV4Y2VwdGlvblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBIZWFkZXJQYXJhbShQUk9WSURFUikgU3RyaW5nIHByb3ZpZGVyLCBTdHJpbmcgZW50aXR5KSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgICAgIHRocm93RXhjZXB0aW9uKGV4Y2VwdGlvblR5cGUsIHByb3ZpZGVyLCB0aGlzLmdldENsYXNzKCkpOworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCkuZW50aXR5KCJleGNlcHRpb24vZ2VuZXJhbCNnZXQgY2FsbGVkIikKKyAgICAgICAgICAgICAgICAgICAgLmhlYWRlcihFWENFUFRJT05fVFlQRSwgZXhjZXB0aW9uVHlwZSkKKyAgICAgICAgICAgICAgICAgICAgLmhlYWRlcihQUk9WSURFUiwgcHJvdmlkZXIpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgic3ViIikKKyAgICAgICAgcHVibGljIFN1YlJlc291cmNlTG9jYXRvciBzdWJSZXNvdXJjZUxvY2F0b3IoQEhlYWRlclBhcmFtKEVYQ0VQVElPTl9UWVBFKSBTdHJpbmcgZXhjZXB0aW9uVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQEhlYWRlclBhcmFtKFBST1ZJREVSKSBTdHJpbmcgcHJvdmlkZXIpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICAgICAgdGhyb3dFeGNlcHRpb24oZXhjZXB0aW9uVHlwZSwgcHJvdmlkZXIsIHRoaXMuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN1YlJlc291cmNlTG9jYXRvcigpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN1YlJlc291cmNlTG9jYXRvciB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0KEBIZWFkZXJQYXJhbShFWENFUFRJT05fVFlQRSkgU3RyaW5nIGV4Y2VwdGlvblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBASGVhZGVyUGFyYW0oUFJPVklERVIpIFN0cmluZyBwcm92aWRlciwgU3RyaW5nIGVudGl0eSkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgICAgICB0aHJvd0V4Y2VwdGlvbihleGNlcHRpb25UeXBlLCBwcm92aWRlciwgdGhpcy5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIHJldHVybiAic3ViLWdldCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RSZXNwb25zZUZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LCBDb250YWluZXJSZXNwb25zZUNvbnRleHQgcmVzcG9uc2VDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGV4Y2VwdGlvblR5cGUgPSByZXNwb25zZUNvbnRleHQuZ2V0SGVhZGVyU3RyaW5nKEVYQ0VQVElPTl9UWVBFKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcm92aWRlciA9IHJlc3BvbnNlQ29udGV4dC5nZXRIZWFkZXJTdHJpbmcoUFJPVklERVIpOworCisgICAgICAgICAgICB0aHJvd1J1bnRpbWVFeGNlcHRpb25BbmRJTyhleGNlcHRpb25UeXBlLCB0aGlzLmdldENsYXNzKCksIHByb3ZpZGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFJlcXVlc3RGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGV4Y2VwdGlvblR5cGUgPSByZXF1ZXN0Q29udGV4dC5nZXRIZWFkZXJTdHJpbmcoRVhDRVBUSU9OX1RZUEUpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByb3ZpZGVyID0gcmVxdWVzdENvbnRleHQuZ2V0SGVhZGVyU3RyaW5nKFBST1ZJREVSKTsKKworICAgICAgICAgICAgdGhyb3dSdW50aW1lRXhjZXB0aW9uQW5kSU8oZXhjZXB0aW9uVHlwZSwgdGhpcy5nZXRDbGFzcygpLCBwcm92aWRlcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAQ29uc3VtZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0TUJSIGltcGxlbWVudHMgTWVzc2FnZUJvZHlSZWFkZXI8U3RyaW5nPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSBTdHJpbmcuY2xhc3M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyByZWFkRnJvbShDbGFzczxTdHJpbmc+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaHR0cEhlYWRlcnMsIElucHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBleGNlcHRpb25UeXBlID0gaHR0cEhlYWRlcnMuZ2V0Rmlyc3QoRVhDRVBUSU9OX1RZUEUpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByb3ZpZGVyID0gaHR0cEhlYWRlcnMuZ2V0Rmlyc3QoUFJPVklERVIpOworICAgICAgICAgICAgdGhyb3dSdW50aW1lRXhjZXB0aW9uQW5kSU8oZXhjZXB0aW9uVHlwZSwgdGhpcy5nZXRDbGFzcygpLCBwcm92aWRlcik7CisKKyAgICAgICAgICAgIGJ5dGUgYjsKKyAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgd2hpbGUgKChiID0gKGJ5dGUpIGVudGl0eVN0cmVhbS5yZWFkKCkpICE9IC0xKSB7CisgICAgICAgICAgICAgICAgYmFvcy53cml0ZShiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJhb3MudG9CeXRlQXJyYXkoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvZHVjZXMoeyJ0ZXh0L3BsYWluIiwgIiovKiJ9KQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdE1CVyBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5V3JpdGVyPFN0cmluZz4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlID09IFN0cmluZy5jbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKFN0cmluZyBzLCBDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oU3RyaW5nIHMsIENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pCisgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZXhjZXB0aW9uVHlwZSA9IChTdHJpbmcpIGh0dHBIZWFkZXJzLmdldEZpcnN0KEVYQ0VQVElPTl9UWVBFKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcm92aWRlciA9IChTdHJpbmcpIGh0dHBIZWFkZXJzLmdldEZpcnN0KFBST1ZJREVSKTsKKyAgICAgICAgICAgIHRocm93UnVudGltZUV4Y2VwdGlvbkFuZElPKGV4Y2VwdGlvblR5cGUsIHRoaXMuZ2V0Q2xhc3MoKSwgcHJvdmlkZXIpOworCisgICAgICAgICAgICBlbnRpdHlTdHJlYW0ud3JpdGUocy5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgIGVudGl0eVN0cmVhbS5mbHVzaCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQENvbnN1bWVzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFJlYWRlckludGVyY2VwdG9yIGltcGxlbWVudHMgUmVhZGVySW50ZXJjZXB0b3IgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0IGFyb3VuZFJlYWRGcm9tKFJlYWRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBleGNlcHRpb25UeXBlID0gY29udGV4dC5nZXRIZWFkZXJzKCkuZ2V0Rmlyc3QoRVhDRVBUSU9OX1RZUEUpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByb3ZpZGVyID0gY29udGV4dC5nZXRIZWFkZXJzKCkuZ2V0Rmlyc3QoUFJPVklERVIpOworCisgICAgICAgICAgICB0aHJvd1J1bnRpbWVFeGNlcHRpb25BbmRJTyhleGNlcHRpb25UeXBlLCB0aGlzLmdldENsYXNzKCksIHByb3ZpZGVyKTsKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0LnByb2NlZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFdyaXRlckludGVyY2VwdG9yIGltcGxlbWVudHMgV3JpdGVySW50ZXJjZXB0b3IgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBhcm91bmRXcml0ZVRvKFdyaXRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBleGNlcHRpb25UeXBlID0gKFN0cmluZykgY29udGV4dC5nZXRIZWFkZXJzKCkuZ2V0Rmlyc3QoRVhDRVBUSU9OX1RZUEUpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHByb3ZpZGVyID0gKFN0cmluZykgY29udGV4dC5nZXRIZWFkZXJzKCkuZ2V0Rmlyc3QoUFJPVklERVIpOworCisgICAgICAgICAgICB0aHJvd1J1bnRpbWVFeGNlcHRpb25BbmRJTyhleGNlcHRpb25UeXBlLCB0aGlzLmdldENsYXNzKCksIHByb3ZpZGVyKTsKKyAgICAgICAgICAgIGNvbnRleHQucHJvY2VlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB0aHJvd1J1bnRpbWVFeGNlcHRpb25BbmRJTyhTdHJpbmcgZXhjZXB0aW9uVHlwZSwgQ2xhc3M8Pz4gcHJvdmlkZXJDbGFzcywgU3RyaW5nIHByb3ZpZGVyKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHNob3VsZFRocm93KGV4Y2VwdGlvblR5cGUsIHByb3ZpZGVyLCBwcm92aWRlckNsYXNzKSkgeworICAgICAgICAgICAgaWYgKGV4Y2VwdGlvblR5cGUuZXF1YWxzKFRlc3RSdW50aW1lRXhjZXB0aW9uLmNsYXNzLmdldFNpbXBsZU5hbWUoKSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVGVzdFJ1bnRpbWVFeGNlcHRpb24ocHJvdmlkZXJDbGFzcy5nZXRTaW1wbGVOYW1lKCkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChleGNlcHRpb25UeXBlLmVxdWFscyhJT0V4Y2VwdGlvbi5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKHByb3ZpZGVyQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZXhjZXB0aW9uVHlwZS5lcXVhbHMoVGVzdFdlYkFwcEV4Y2VwdGlvbi5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRlc3RXZWJBcHBFeGNlcHRpb24ocHJvdmlkZXJDbGFzcy5nZXRTaW1wbGVOYW1lKCksIFJlc3BvbnNlLm9rKCkuYnVpbGQoKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGV4Y2VwdGlvblR5cGUuZXF1YWxzKFByb2Nlc3NpbmdFeGNlcHRpb24uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBQcm9jZXNzaW5nRXhjZXB0aW9uKHByb3ZpZGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFJlc291cmNlCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tlZEV4Y2VwdGlvbkluUmVzb3VyY2UoKSB7CisgICAgICAgIF90ZXN0KFRlc3RDaGVja2VkRXhjZXB0aW9uLmNsYXNzLCBFeGNlcHRpb25SZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UnVudGltZUV4Y2VwdGlvbkluUmVzb3VyY2UoKSB7CisgICAgICAgIF90ZXN0KFRlc3RSdW50aW1lRXhjZXB0aW9uLmNsYXNzLCBFeGNlcHRpb25SZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2ViQXBwbGljYXRpb25FeGNlcHRpb25JblJlc291cmNlKCkgeworICAgICAgICBfdGVzdFdhZShFeGNlcHRpb25SZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvY2Vzc2luZ0V4Y2VwdGlvbkluUmVzb3VyY2UoKSB7CisgICAgICAgIF90ZXN0KFByb2Nlc3NpbmdFeGNlcHRpb24uY2xhc3MsIEV4Y2VwdGlvblJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICAvLyBTdWIgcmVzb3VyY2UKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDaGVja2VkRXhjZXB0aW9uSW5TdWJSZXNvdXJjZUxvY2F0b3JNZXRob2QoKSB7CisgICAgICAgIF90ZXN0KFRlc3RDaGVja2VkRXhjZXB0aW9uLmNsYXNzLCBFeGNlcHRpb25SZXNvdXJjZS5jbGFzcywgImV4Y2VwdGlvbi9zdWIiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSdW50aW1lRXhjZXB0aW9uSW5TdWJSZXNvdXJjZUxvY2F0b3JNZXRob2QoKSB7CisgICAgICAgIF90ZXN0KFRlc3RSdW50aW1lRXhjZXB0aW9uLmNsYXNzLCBFeGNlcHRpb25SZXNvdXJjZS5jbGFzcywgImV4Y2VwdGlvbi9zdWIiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXYWVJblN1YlJlc291cmNlTG9jYXRvck1ldGhvZCgpIHsKKyAgICAgICAgX3Rlc3RXYWUoRXhjZXB0aW9uUmVzb3VyY2UuY2xhc3MsICJleGNlcHRpb24vc3ViIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvY2Vzc2luZ0V4Y2VwdGlvbkluU3ViUmVzb3VyY2VMb2NhdG9yTWV0aG9kKCkgeworICAgICAgICBfdGVzdChQcm9jZXNzaW5nRXhjZXB0aW9uLmNsYXNzLCBFeGNlcHRpb25SZXNvdXJjZS5jbGFzcywgImV4Y2VwdGlvbi9zdWIiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDaGVja2VkRXhjZXB0aW9uSW5TdWJSZXNvdXJjZSgpIHsKKyAgICAgICAgX3Rlc3QoVGVzdENoZWNrZWRFeGNlcHRpb24uY2xhc3MsIFN1YlJlc291cmNlTG9jYXRvci5jbGFzcywgImV4Y2VwdGlvbi9zdWIiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSdW50aW1lRXhjZXB0aW9uSW5TdWJSZXNvdXJjZSgpIHsKKyAgICAgICAgX3Rlc3QoVGVzdFJ1bnRpbWVFeGNlcHRpb24uY2xhc3MsIFN1YlJlc291cmNlTG9jYXRvci5jbGFzcywgImV4Y2VwdGlvbi9zdWIiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXYWVJblN1YlJlc291cmNlKCkgeworICAgICAgICBfdGVzdFdhZShTdWJSZXNvdXJjZUxvY2F0b3IuY2xhc3MsICJleGNlcHRpb24vc3ViIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvY2Vzc2luZ0V4Y2VwdGlvbkluU3ViUmVzb3VyY2UoKSB7CisgICAgICAgIF90ZXN0KFByb2Nlc3NpbmdFeGNlcHRpb24uY2xhc3MsIFN1YlJlc291cmNlTG9jYXRvci5jbGFzcywgImV4Y2VwdGlvbi9zdWIiKTsKKyAgICB9CisKKyAgICAvLyByZXNwb25zZSBmaWx0ZXJzCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UnVudGltZUV4Y2VwdGlvbkluUmVzcG9uc2VGaWx0ZXIoKSB7CisgICAgICAgIF90ZXN0KFRlc3RSdW50aW1lRXhjZXB0aW9uLmNsYXNzLCBUZXN0UmVzcG9uc2VGaWx0ZXIuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElPRXhjZXB0aW9uSW5SZXNwb25zZUZpbHRlcigpIHsKKyAgICAgICAgX3Rlc3QoSU9FeGNlcHRpb24uY2xhc3MsIFRlc3RSZXNwb25zZUZpbHRlci5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2FlSW5SZXNwb25zZUZpbHRlcigpIHsKKyAgICAgICAgX3Rlc3RXYWUoVGVzdFJlc3BvbnNlRmlsdGVyLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9jZXNzaW5nRXhjZXB0aW9uSW5SZXNwb25zZUZpbHRlcigpIHsKKyAgICAgICAgX3Rlc3QoUHJvY2Vzc2luZ0V4Y2VwdGlvbi5jbGFzcywgVGVzdFJlc3BvbnNlRmlsdGVyLmNsYXNzKTsKKyAgICB9CisKKyAgICAvLyByZXNwb25zZSBmaWx0ZXJzCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UnVudGltZUV4Y2VwdGlvbkluUmVxdWVzdEZpbHRlcigpIHsKKyAgICAgICAgX3Rlc3QoVGVzdFJ1bnRpbWVFeGNlcHRpb24uY2xhc3MsIFRlc3RSZXF1ZXN0RmlsdGVyLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJT0V4Y2VwdGlvbkluUmVxdWVzdEZpbHRlcigpIHsKKyAgICAgICAgX3Rlc3QoSU9FeGNlcHRpb24uY2xhc3MsIFRlc3RSZXF1ZXN0RmlsdGVyLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXYWVJblJlcXVlc3RGaWx0ZXIoKSB7CisgICAgICAgIF90ZXN0V2FlKFRlc3RSZXF1ZXN0RmlsdGVyLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9jZXNzaW5nRXhjZXB0aW9uSW5SZXF1ZXN0RmlsdGVyKCkgeworICAgICAgICBfdGVzdChQcm9jZXNzaW5nRXhjZXB0aW9uLmNsYXNzLCBUZXN0UmVxdWVzdEZpbHRlci5jbGFzcyk7CisgICAgfQorCisgICAgLy8gTUJSL1cKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSdW50aW1lRXhjZXB0aW9uSW5NQlcoKSB7CisgICAgICAgIF90ZXN0KFRlc3RSdW50aW1lRXhjZXB0aW9uLmNsYXNzLCBUZXN0TUJXLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJT0V4Y2VwdGlvbkluTUJXKCkgeworICAgICAgICBfdGVzdChJT0V4Y2VwdGlvbi5jbGFzcywgVGVzdE1CVy5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2FlSW5NQlcoKSB7CisgICAgICAgIF90ZXN0V2FlKFRlc3RNQlcuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByb2Nlc3NpbmdFeGNlcHRpb25Jbk1CVygpIHsKKyAgICAgICAgX3Rlc3QoUHJvY2Vzc2luZ0V4Y2VwdGlvbi5jbGFzcywgVGVzdE1CVy5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UnVudGltZUV4Y2VwdGlvbkluTUJSKCkgeworICAgICAgICBfdGVzdChUZXN0UnVudGltZUV4Y2VwdGlvbi5jbGFzcywgVGVzdE1CUi5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SU9FeGNlcHRpb25Jbk1CUigpIHsKKyAgICAgICAgX3Rlc3QoSU9FeGNlcHRpb24uY2xhc3MsIFRlc3RNQlIuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdhZUluTUJSKCkgeworICAgICAgICBfdGVzdFdhZShUZXN0TUJSLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9jZXNzaW5nRXhjZXB0aW9uSW5NQlIoKSB7CisgICAgICAgIF90ZXN0KFByb2Nlc3NpbmdFeGNlcHRpb24uY2xhc3MsIFRlc3RNQlIuY2xhc3MpOworICAgIH0KKworICAgIC8vIGludGVyY2VwdG9ycworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJ1bnRpbWVFeGNlcHRpb25JblJlYWRlckludGVyY2VwdG9yKCkgeworICAgICAgICBfdGVzdChUZXN0UnVudGltZUV4Y2VwdGlvbi5jbGFzcywgVGVzdFJlYWRlckludGVyY2VwdG9yLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJT0V4Y2VwdGlvbkluUmVhZGVySW50ZXJjZXB0b3IoKSB7CisgICAgICAgIF90ZXN0KElPRXhjZXB0aW9uLmNsYXNzLCBUZXN0UmVhZGVySW50ZXJjZXB0b3IuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdhZUluUmVhZGVySW50ZXJjZXB0b3IoKSB7CisgICAgICAgIF90ZXN0V2FlKFRlc3RSZWFkZXJJbnRlcmNlcHRvci5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvY2Vzc2luZ0V4Y2VwdGlvbkluUmVhZGVySW50ZXJjZXB0b3IoKSB7CisgICAgICAgIF90ZXN0KFByb2Nlc3NpbmdFeGNlcHRpb24uY2xhc3MsIFRlc3RSZWFkZXJJbnRlcmNlcHRvci5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UnVudGltZUV4Y2VwdGlvbkluV3JpdGVySW50ZXJjZXB0b3IoKSB7CisgICAgICAgIF90ZXN0KFRlc3RSdW50aW1lRXhjZXB0aW9uLmNsYXNzLCBUZXN0V3JpdGVySW50ZXJjZXB0b3IuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElPRXhjZXB0aW9uSW5Xcml0ZXJJbnRlcmNlcHRvcigpIHsKKyAgICAgICAgX3Rlc3QoSU9FeGNlcHRpb24uY2xhc3MsIFRlc3RXcml0ZXJJbnRlcmNlcHRvci5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2FlSW5Xcml0ZXJJbnRlcmNlcHRvcigpIHsKKyAgICAgICAgX3Rlc3RXYWUoVGVzdFdyaXRlckludGVyY2VwdG9yLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9jZXNzaW5nRXhjZXB0aW9uSW5Xcml0ZXJJbnRlcmNlcHRvcigpIHsKKyAgICAgICAgX3Rlc3QoUHJvY2Vzc2luZ0V4Y2VwdGlvbi5jbGFzcywgVGVzdFdyaXRlckludGVyY2VwdG9yLmNsYXNzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3QoQ2xhc3M8Pz4gZXhjZXB0aW9uQ2xhc3MsIENsYXNzPD8+IHByb3ZpZGVyQ2xhc3MsIFN0cmluZyBwYXRoKSB7CisgICAgICAgIC8vIE5PVEU6IEh0dHBVcmxDb25uZWN0b3Igc2VuZHMgc2V2ZXJhbCBhY2NlcHRlZCB0eXBlcyBieSBkZWZhdWx0IHdoZW4gbm90IGV4cGxpY2l0bHkgc2V0IGJ5IHRoZSBjYWxsZXIuCisgICAgICAgIC8vIEluIHN1Y2ggY2FzZSwgdGhlIC5hY2NlcHQoInRleHQvaHRtbCIpIGNhbGwgaXMgbm90IG5lY2Vzc2FyeS4gSG93ZXZlciwgb3RoZXIgY29ubmVjdG9ycyBhY3QgaW4gYSBkaWZmZXJlbnQgd2F5IGFuZAorICAgICAgICAvLyB0aGlzIGxlYWRzIGluIGRpZmZlcmVudCBiZWhhdmlvdXIgd2hlbiBzZWxlY3RpbmcgdGhlIE1lc3NhZ2VCb2R5V3JpdGVyLiBMZWF2aW5nIHRoZSBkZWZpbml0aW9uIGV4cGxpY2l0IGZvciBicm9hZGVyCisgICAgICAgIC8vIGNvbXBhdGliaWxpdHkuCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KHBhdGgpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5oZWFkZXIoRVhDRVBUSU9OX1RZUEUsIGV4Y2VwdGlvbkNsYXNzLmdldFNpbXBsZU5hbWUoKSkuaGVhZGVyKFBST1ZJREVSLCBwcm92aWRlckNsYXNzLmdldFNpbXBsZU5hbWUoKSkKKyAgICAgICAgICAgICAgICAuYWNjZXB0KE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eSgicG9zdCIsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhjZXB0aW9uQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpICsgTUFQUEVEICsgcHJvdmlkZXJDbGFzcy5nZXRTaW1wbGVOYW1lKCksIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0V2FlKENsYXNzPD8+IHByb3ZpZGVyQ2xhc3MpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHBhdGggPSAiZXhjZXB0aW9uL2dlbmVyYWwiOworICAgICAgICBfdGVzdFdhZShwcm92aWRlckNsYXNzLCBwYXRoKTsKKworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfdGVzdFdhZShDbGFzczw/PiBwcm92aWRlckNsYXNzLCBTdHJpbmcgcGF0aCkgeworICAgICAgICBmaW5hbCBDbGFzczw/PiBleGNlcHRpb25DbGFzcyA9IFRlc3RXZWJBcHBFeGNlcHRpb24uY2xhc3M7CisKKyAgICAgICAgLy8gTk9URTogSHR0cFVybENvbm5lY3RvciBzZW5kcyBzZXZlcmFsIGFjY2VwdGVkIHR5cGVzIGJ5IGRlZmF1bHQgd2hlbiBub3QgZXhwbGljaXRseSBzZXQgYnkgdGhlIGNhbGxlci4KKyAgICAgICAgLy8gSW4gc3VjaCBjYXNlLCB0aGUgLmFjY2VwdCgidGV4dC9odG1sIikgY2FsbCBpcyBub3QgbmVjZXNzYXJ5LiBIb3dldmVyLCBvdGhlciBjb25uZWN0b3JzIGFjdCBpbiBhIGRpZmZlcmVudCB3YXkgYW5kCisgICAgICAgIC8vIHRoaXMgbGVhZHMgaW4gZGlmZmVyZW50IGJlaGF2aW91ciB3aGVuIHNlbGVjdGluZyB0aGUgTWVzc2FnZUJvZHlXcml0ZXIuIExlYXZpbmcgdGhlIGRlZmluaXRpb24gZXhwbGljaXQgZm9yIGJyb2FkZXIKKyAgICAgICAgLy8gY29tcGF0aWJpbGl0eS4KKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQocGF0aCkucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLmhlYWRlcihFWENFUFRJT05fVFlQRSwgZXhjZXB0aW9uQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpKS5oZWFkZXIoUFJPVklERVIsIHByb3ZpZGVyQ2xhc3MuZ2V0U2ltcGxlTmFtZSgpKQorICAgICAgICAgICAgICAgIC5hY2NlcHQoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KCJwb3N0IiwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhleGNlcHRpb25DbGFzcy5nZXRTaW1wbGVOYW1lKCkgKyBNQVBQRURfV0FFICsgcHJvdmlkZXJDbGFzcy5nZXRTaW1wbGVOYW1lKCksCisgICAgICAgICAgICAgICAgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3QoQ2xhc3M8Pz4gZXhjZXB0aW9uQ2xhc3MsIENsYXNzPD8+IHByb3ZpZGVyQ2xhc3MpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHBhdGggPSAiZXhjZXB0aW9uL2dlbmVyYWwiOworICAgICAgICBfdGVzdChleGNlcHRpb25DbGFzcywgcHJvdmlkZXJDbGFzcywgcGF0aCk7CisgICAgfQorCisgICAgLy8gc3ViIHJlc291cmNlIGxvY2F0b3IKKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvRXhjZXB0aW9uTWFwcGVyVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvRXhjZXB0aW9uTWFwcGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYmJhYzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9FeGNlcHRpb25NYXBwZXJUZXN0LmphdmEKQEAgLTAsMCArMSw2NTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbVdyaXRlcjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkNsaWVudEVycm9yRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5JbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLk5hbWVCaW5kaW5nOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXF1ZXN0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5FeGNlcHRpb25NYXBwZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyczsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuTWVzc2FnZUJvZHlQcm92aWRlck5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0cyB0aHJvd2luZyBleGNlcHRpb25zIGluIHtAbGluayBNZXNzYWdlQm9keVJlYWRlcn0gYW5kIHtAbGluayBNZXNzYWdlQm9keVdyaXRlcn0uCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgY2xhc3MgRXhjZXB0aW9uTWFwcGVyVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZygKKyAgICAgICAgICAgICAgICBSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBNeU1lc3NhZ2VCb2R5V3JpdHRlci5jbGFzcywKKyAgICAgICAgICAgICAgICBNeU1lc3NhZ2VCb2R5UmVhZGVyLmNsYXNzLAorICAgICAgICAgICAgICAgIENsaWVudEVycm9yRXhjZXB0aW9uTWFwcGVyLmNsYXNzLAorICAgICAgICAgICAgICAgIE15RXhjZXB0aW9uTWFwcGVyLmNsYXNzLAorICAgICAgICAgICAgICAgIFRocm93YWJsZU1hcHBlci5jbGFzcywKKyAgICAgICAgICAgICAgICBNeUV4Y2VwdGlvbk1hcHBlckNhdXNlQW5vdGhlckV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAvLyBKRVJTRVktMTUxNQorICAgICAgICAgICAgICAgIFRlc3RSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBWaXNpYmlsaXR5RXhjZXB0aW9uTWFwcGVyLmNsYXNzLAorICAgICAgICAgICAgICAgIC8vIEpFUlNFWS0xNTI1CisgICAgICAgICAgICAgICAgRXhjZXB0aW9uVGVzdFJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIEV4Y2VwdGlvblRocm93aW5nRmlsdGVyLmNsYXNzLAorICAgICAgICAgICAgICAgIElPRXhjZXB0aW9uTWFwcGVyLmNsYXNzLAorICAgICAgICAgICAgICAgIElPRXhjZXB0aW9uTWVzc2FnZVJlYWRlci5jbGFzcywKKyAgICAgICAgICAgICAgICBJT0V4Y2VwdGlvblJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIE1lc3NhZ2VCb2R5UHJvdmlkZXJOb3RGb3VuZFJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIFByb3ZpZGVyTm90Rm91bmRFeGNlcHRpb25NYXBwZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgLy8gSkVSU0VZLTE4ODcKKyAgICAgICAgICAgICAgICBKZXJzZXkxODg3UmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgSmVyc2V5MTg4N0V4Y2VwdGlvbk1hcHBlckltcGwuY2xhc3MsCisgICAgICAgICAgICAgICAgLy8gSkVSU0VZLTIzODIKKyAgICAgICAgICAgICAgICBKZXJzZXkyMzgyUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgSmVyc2V5MjM4MkV4Y2VwdGlvbk1hcHBlci5jbGFzcywKKyAgICAgICAgICAgICAgICBKZXJzZXkyMzgyUHJvdmlkZXIuY2xhc3MKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkZXJUaHJvd3NFeGNlcHRpb24oKSB7CisgICAgICAgIFJlc3BvbnNlIHJlcyA9IHRhcmdldCgpLnBhdGgoInRlc3QiKS5yZXF1ZXN0KCJ0ZXN0L3Rlc3QiKS5oZWFkZXIoInJlYWRlci1leGNlcHRpb24iLCAidGhyb3ciKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkoInBvc3QiLCAidGVzdC90ZXN0IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXMuZ2V0U3RhdHVzKCkpOworICAgICAgICBmaW5hbCBTdHJpbmcgZW50aXR5ID0gcmVzLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZWFkZXItZXhjZXB0aW9uLW1hcHBlciIsIGVudGl0eSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVyVGhyb3dzRXhjZXB0aW9uQmVmb3JlRmlyc3RCeXRlc0FyZVdyaXR0ZW4oKSB7CisgICAgICAgIFJlc3BvbnNlIHJlcyA9IHRhcmdldCgpLnBhdGgoInRlc3QvYmVmb3JlIikucmVxdWVzdCgidGVzdC90ZXN0IikuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlcy5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZXhjZXB0aW9uLWJlZm9yZS1maXJzdC1ieXRlcy1leGNlcHRpb24tbWFwcGVyIiwgcmVzLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVyVGhyb3dzRXhjZXB0aW9uQWZ0ZXJGaXJzdEJ5dGVzQXJlV3JpdHRlbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFJlc3BvbnNlIHJlcyA9IHRhcmdldCgpLnBhdGgoInRlc3QvYWZ0ZXIiKS5yZXF1ZXN0KCJ0ZXN0L3Rlc3QiKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzLmdldFN0YXR1cygpKTsKKyAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSByZXMucmVhZEVudGl0eShJbnB1dFN0cmVhbS5jbGFzcyk7CisgICAgICAgIGJ5dGUgYjsKKyAgICAgICAgaW5wdXRTdHJlYW0ucmVhZCgpOworICAgICAgICBNeU1lc3NhZ2VCb2R5V3JpdHRlci5maXJzdEJ5dGVzUmVjZWl2ZWQgPSB0cnVlOworICAgICAgICB3aGlsZSAoKGIgPSAoYnl0ZSkgaW5wdXRTdHJlYW0ucmVhZCgpKSA+PSAwKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoJ2EnLCBiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByZXZlbnRNdWx0aXBsZUV4Y2VwdGlvbk1hcHBpbmcoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlcyA9IHRhcmdldCgpLnBhdGgoInRlc3QvZXhjZXB0aW9uIikucmVxdWVzdCgidGVzdC90ZXN0IikuZ2V0KCk7CisgICAgICAgIC8vIGZpcnN0bHkgZXhjZXB0aW9uIGlzIHRocm93biBpbiB0aGUgcmVzb3VyY2UgbWV0aG9kIGFuZCBpcyBjb3JyZWN0bHkgbWFwcGVkLiBUaGVuIGl0IGlzIGFnYWluIHRocm93biBpbiBNQldyaXRlciBidXQKKyAgICAgICAgLy8gZXhjZXB0aW9uIGNhbiBiZSBtYXBwZWQgb25seSBvbmNlLCBzbyBzZWNvbmQgZXhjZXB0aW9uIGluIE1CV3JpdGVyIGNhdXNlIDUwMCByZXNwb25zZSBjb2RlLgorICAgICAgICBhc3NlcnRFcXVhbHMoNTAwLCByZXMuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBQYXRoKCJ0ZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJiZWZvcmUiKQorICAgICAgICBAUHJvZHVjZXMoInRlc3QvdGVzdCIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBleGNlcHRpb25CZWZvcmVGaXJzdEJ5dGVzQXJlV3JpdHRlbigpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoMjAwKS5oZWFkZXIoIndyaXRlci1leGNlcHRpb24iLCAiYmVmb3JlLWZpcnN0LWJ5dGUiKS5lbnRpdHkoIm9rIikuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImFmdGVyIikKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXN0L3Rlc3QiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZXhjZXB0aW9uQWZ0ZXJGaXJzdEJ5dGVzQXJlV3JpdHRlbigpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoMjAwKS5oZWFkZXIoIndyaXRlci1leGNlcHRpb24iLCAiYWZ0ZXItZmlyc3QtYnl0ZSIpLmVudGl0eSgiYWFhYWEiKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXN0L3Rlc3QiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3QoU3RyaW5nIHN0cikgeworICAgICAgICAgICAgcmV0dXJuICJwb3N0IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImV4Y2VwdGlvbiIpCisgICAgICAgIEBQcm9kdWNlcygidGVzdC90ZXN0IikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHRocm93c0V4Y2VwdGlvbigpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNeUFub3RoZXJFeGNlcHRpb24oInJlc291cmNlIik7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgidGhyb3dhYmxlIikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHRocm93c1Rocm93YWJsZSgpIHRocm93cyBUaHJvd2FibGUgeworICAgICAgICAgICAgdGhyb3cgbmV3IFRocm93YWJsZSgidGhyb3dhYmxlIiwKKyAgICAgICAgICAgICAgICAgICAgbmV3IFJ1bnRpbWVFeGNlcHRpb24oInJ1bnRpbWUtZXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2xpZW50RXJyb3JFeGNlcHRpb24oImNsaWVudC1lcnJvciIsIDQ5OSkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2xpZW50RXJyb3JFeGNlcHRpb25NYXBwZXIgaW1wbGVtZW50cyBFeGNlcHRpb25NYXBwZXI8Q2xpZW50RXJyb3JFeGNlcHRpb24+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHRvUmVzcG9uc2UoQ2xpZW50RXJyb3JFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKFJlc3BvbnNlLlN0YXR1cy5PSykuZW50aXR5KCJtYXBwZWQtY2xpZW50LWVycm9yLSIKKyAgICAgICAgICAgICAgICAgICAgKyBleGNlcHRpb24uZ2V0UmVzcG9uc2UoKS5nZXRTdGF0dXMoKSArICItIiArIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15RXhjZXB0aW9uTWFwcGVyIGltcGxlbWVudHMgRXhjZXB0aW9uTWFwcGVyPE15RXhjZXB0aW9uPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSB0b1Jlc3BvbnNlKE15RXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCkuZW50aXR5KGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkgKyAiLWV4Y2VwdGlvbi1tYXBwZXIiKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUaHJvd2FibGVNYXBwZXIgaW1wbGVtZW50cyBFeGNlcHRpb25NYXBwZXI8VGhyb3dhYmxlPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSB0b1Jlc3BvbnNlKFRocm93YWJsZSB0aHJvd2FibGUpIHsKKyAgICAgICAgICAgIHRocm93YWJsZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoUmVzcG9uc2UuU3RhdHVzLk9LKS5lbnRpdHkoIm1hcHBlZC10aHJvd2FibGUtIiArIHRocm93YWJsZS5nZXRNZXNzYWdlKCkpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlFeGNlcHRpb25NYXBwZXJDYXVzZUFub3RoZXJFeGNlcHRpb24gaW1wbGVtZW50cyBFeGNlcHRpb25NYXBwZXI8TXlBbm90aGVyRXhjZXB0aW9uPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSB0b1Jlc3BvbnNlKE15QW5vdGhlckV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgIC8vIHRoZSBoZWFkZXIgY2F1c2VzIGV4Y2VwdGlvbiB0byBiZSB0aHJvd24gYWdhaW4gaW4gTXlNZXNzYWdlQm9keVdyaXRlcgorICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCkuaGVhZGVyKCJ3cml0ZXItZXhjZXB0aW9uIiwgImJlZm9yZS1maXJzdC1ieXRlIikuZW50aXR5KGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkKKyAgICAgICAgICAgICAgICAgICAgKyAiLWFub3RoZXItZXhjZXB0aW9uLW1hcHBlciIpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvZHVjZXMoInRlc3QvdGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeU1lc3NhZ2VCb2R5V3JpdHRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5V3JpdGVyPFN0cmluZz4geworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9sYXRpbGUgYm9vbGVhbiBmaXJzdEJ5dGVzUmVjZWl2ZWQ7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gU3RyaW5nLmNsYXNzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldFNpemUoU3RyaW5nIHMsIENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHMubGVuZ3RoKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbyhTdHJpbmcgcywgQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpcnN0Qnl0ZXNSZWNlaXZlZCA9IGZhbHNlOworCisgICAgICAgICAgICBmaW5hbCBMaXN0PE9iamVjdD4gaGVhZGVyID0gaHR0cEhlYWRlcnMuZ2V0KCJ3cml0ZXItZXhjZXB0aW9uIik7CisKKyAgICAgICAgICAgIGlmIChoZWFkZXIgIT0gbnVsbCAmJiBoZWFkZXIuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIGlmIChoZWFkZXIuZ2V0KDApLmVxdWFscygiYmVmb3JlLWZpcnN0LWJ5dGUiKSkgeworICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTXlFeGNlcHRpb24oImV4Y2VwdGlvbi1iZWZvcmUtZmlyc3QtYnl0ZXMiKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGhlYWRlci5nZXQoMCkuZXF1YWxzKCJhZnRlci1maXJzdC1ieXRlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGkgPSAwOworICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIWZpcnN0Qnl0ZXNSZWNlaXZlZCAmJiBpKysgPCA1MDAwMDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZSgnYScpOworICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5U3RyZWFtLmZsdXNoKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE15RXhjZXB0aW9uKCJleGNlcHRpb24tYWZ0ZXItZmlyc3QtYnl0ZXMiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbVdyaXRlciBvc3cgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKGVudGl0eVN0cmVhbSk7CisgICAgICAgICAgICAgICAgb3N3LndyaXRlKHMpOworICAgICAgICAgICAgICAgIG9zdy5mbHVzaCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQENvbnN1bWVzKCJ0ZXN0L3Rlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlNZXNzYWdlQm9keVJlYWRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5UmVhZGVyPFN0cmluZz4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gU3RyaW5nLmNsYXNzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcmVhZEZyb20oQ2xhc3M8U3RyaW5nPiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGh0dHBIZWFkZXJzLCBJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gaGVhZGVyID0gaHR0cEhlYWRlcnMuZ2V0KCJyZWFkZXItZXhjZXB0aW9uIik7CisgICAgICAgICAgICBpZiAoaGVhZGVyICE9IG51bGwgJiYgaGVhZGVyLnNpemUoKSA+IDAgJiYgaGVhZGVyLmdldCgwKS5lcXVhbHMoInRocm93IikpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTXlFeGNlcHRpb24oInJlYWRlciIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICJhYWEiOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworCisgICAgICAgIHB1YmxpYyBNeUV4Y2VwdGlvbigpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNeUV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgICAgICAgIHN1cGVyKGNhdXNlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNeUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICAgICAgc3VwZXIobWVzc2FnZSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTXlFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UsIFRocm93YWJsZSBjYXVzZSkgeworICAgICAgICAgICAgc3VwZXIobWVzc2FnZSwgY2F1c2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUFub3RoZXJFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKworICAgICAgICBwdWJsaWMgTXlBbm90aGVyRXhjZXB0aW9uKCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE15QW5vdGhlckV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKKyAgICAgICAgICAgIHN1cGVyKGNhdXNlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNeUFub3RoZXJFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIHN1cGVyKG1lc3NhZ2UpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIE15QW5vdGhlckV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSwgVGhyb3dhYmxlIGNhdXNlKSB7CisgICAgICAgICAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCRUdJTjogSkVSU0VZLTE1MTUgcmVwcm9kdWNlciBjb2RlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBWaXNpYmlsaXR5RXhjZXB0aW9uIGV4dGVuZHMgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xMTU5NDA3MzEyNjkxMzcyNDI5TDsKKworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVmlzaWJpbGl0eUV4Y2VwdGlvbk1hcHBlciBpbXBsZW1lbnRzIEV4Y2VwdGlvbk1hcHBlcjxWaXNpYmlsaXR5RXhjZXB0aW9uPiB7CisKKyAgICAgICAgcHJpdmF0ZSBIdHRwSGVhZGVycyBoZWFkZXJzOworICAgICAgICBwcml2YXRlIFVyaUluZm8gaW5mbzsKKyAgICAgICAgcHJpdmF0ZSBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbjsKKyAgICAgICAgcHJpdmF0ZSBSZXF1ZXN0IHJlcXVlc3Q7CisgICAgICAgIHByaXZhdGUgUHJvdmlkZXJzIHByb3ZpZGVyOworCisgICAgICAgIHByb3RlY3RlZCBWaXNpYmlsaXR5RXhjZXB0aW9uTWFwcGVyKEBDb250ZXh0IEh0dHBIZWFkZXJzIGhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBDb250ZXh0IFVyaUluZm8gaW5mbywgQENvbnRleHQgQXBwbGljYXRpb24gYXBwbGljYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBDb250ZXh0IFJlcXVlc3QgcmVxdWVzdCwgQENvbnRleHQgUHJvdmlkZXJzIHByb3ZpZGVyKSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICAgICAgdGhpcy5oZWFkZXJzID0gaGVhZGVyczsKKyAgICAgICAgICAgIHRoaXMuaW5mbyA9IGluZm87CisgICAgICAgICAgICB0aGlzLmFwcGxpY2F0aW9uID0gYXBwbGljYXRpb247CisgICAgICAgICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OworICAgICAgICAgICAgdGhpcy5wcm92aWRlciA9IHByb3ZpZGVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFZpc2liaWxpdHlFeGNlcHRpb25NYXBwZXIoQENvbnRleHQgSHR0cEhlYWRlcnMgaGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQENvbnRleHQgVXJpSW5mbyBpbmZvLCBAQ29udGV4dCBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQENvbnRleHQgUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICAgICAgdGhpcy5oZWFkZXJzID0gaGVhZGVyczsKKyAgICAgICAgICAgIHRoaXMuaW5mbyA9IGluZm87CisgICAgICAgICAgICB0aGlzLmFwcGxpY2F0aW9uID0gYXBwbGljYXRpb247CisgICAgICAgICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFZpc2liaWxpdHlFeGNlcHRpb25NYXBwZXIoQENvbnRleHQgSHR0cEhlYWRlcnMgaGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQENvbnRleHQgVXJpSW5mbyBpbmZvLCBAQ29udGV4dCBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbikgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnM7CisgICAgICAgICAgICB0aGlzLmluZm8gPSBpbmZvOworICAgICAgICAgICAgdGhpcy5hcHBsaWNhdGlvbiA9IGFwcGxpY2F0aW9uOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFZpc2liaWxpdHlFeGNlcHRpb25NYXBwZXIoQENvbnRleHQgSHR0cEhlYWRlcnMgaGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQENvbnRleHQgVXJpSW5mbyBpbmZvKSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICAgICAgdGhpcy5oZWFkZXJzID0gaGVhZGVyczsKKyAgICAgICAgICAgIHRoaXMuaW5mbyA9IGluZm87CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgVmlzaWJpbGl0eUV4Y2VwdGlvbk1hcHBlcihAQ29udGV4dCBIdHRwSGVhZGVycyBoZWFkZXJzKSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICAgICAgdGhpcy5oZWFkZXJzID0gaGVhZGVyczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgdG9SZXNwb25zZShWaXNpYmlsaXR5RXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCJ2aXNpYmxlIikuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJ0ZXN0L3Zpc2libGUiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdGhyb3dWaXNpYmxlRXhjZXB0aW9uKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFZpc2liaWxpdHlFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEplcnNleTE1MTUoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlcyA9IHRhcmdldCgpLnBhdGgoInRlc3QvdmlzaWJsZSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ2aXNpYmxlIiwgcmVzLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorICAgIC8qKgorICAgICAqIEVORDogSkVSU0VZLTE1MTUgcmVwcm9kdWNlciBjb2RlCisgICAgICovCisKKyAgICAvKioKKyAgICAgKiBCRUdJTjogSkVSU0VZLTE1MjUgcmVwcm9kdWNlciBjb2RlLgorICAgICAqLworICAgIEBQYXRoKCJ0ZXN0L3Jlc3BvbnNlRmlsdGVyIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEV4Y2VwdGlvblRlc3RSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAVGhyb3dzTlBFCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGF0YSgpIHsKKyAgICAgICAgICAgIHJldHVybiAibWV0aG9kIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBOYW1lQmluZGluZworICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCisgICAgcHJpdmF0ZSBzdGF0aWMgQGludGVyZmFjZSBUaHJvd3NOUEUgeworICAgIH0KKworICAgIEBUaHJvd3NOUEUKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEV4Y2VwdGlvblRocm93aW5nRmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250YWluZXJSZXNwb25zZUNvbnRleHQgcmVzcG9uc2VDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgLy8gVGhlIGlmIGNsYXVzZSBwcmV2ZW50cyB0aHJvd2luZyBleGNlcHRpb24gb24gYSBtYXBwZWQgcmVzcG9uc2UuCisgICAgICAgICAgICAvLyBOb3QgZG9pbmcgc28gd291bGQgcmVzdWx0IGluIGEgc2Vjb25kIGV4Y2VwdGlvbiBiZWluZyB0aHJvd24KKyAgICAgICAgICAgIC8vIHdoaWNoIHdvdWxkIG5vdCBiZSBtYXBwZWQgYWdhaW47IGluc3RlYWQsIGl0IHdvdWxkIGJlIHByb3BhZ2F0ZWQKKyAgICAgICAgICAgIC8vIHRvIHRoZSBob3N0aW5nIGNvbnRhaW5lciBkaXJlY3RseS4KKyAgICAgICAgICAgIGlmICghIm1hcHBlZC10aHJvd2FibGUtcmVzcG9uc2UtZmlsdGVyLWV4Y2VwdGlvbiIuZXF1YWxzKHJlc3BvbnNlQ29udGV4dC5nZXRFbnRpdHkoKSkpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInJlc3BvbnNlLWZpbHRlci1leGNlcHRpb24iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEplcnNleTE1MjUoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlcyA9IHRhcmdldCgpLnBhdGgoInRlc3QvcmVzcG9uc2VGaWx0ZXIiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlcy5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygibWFwcGVkLXRocm93YWJsZS1yZXNwb25zZS1maWx0ZXItZXhjZXB0aW9uIiwgcmVzLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRU5EOiBKRVJTRVktMTUyNSByZXByb2R1Y2VyIGNvZGUKKyAgICAgKi8KKworICAgIEBQcm92aWRlcgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSU9FeGNlcHRpb25NZXNzYWdlUmVhZGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlSZWFkZXI8SU9CZWFuPiwgTWVzc2FnZUJvZHlXcml0ZXI8SU9CZWFuPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSBJT0JlYW4uY2xhc3M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIElPQmVhbiByZWFkRnJvbShDbGFzczxJT0JlYW4+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBodHRwSGVhZGVycywgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKQorICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJpby1leGNlcHRpb24iKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlID09IElPQmVhbi5jbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKElPQmVhbiBpb0JlYW4sIENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbyhJT0JlYW4gaW9CZWFuLCBDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLCBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sCisgICAgICAgICAgICAgICAgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgZW50aXR5U3RyZWFtLndyaXRlKGlvQmVhbi52YWx1ZS5nZXRCeXRlcygpKTsKKworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJT0JlYW4geworCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHZhbHVlOworCisgICAgICAgIHB1YmxpYyBJT0JlYW4oU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIElPRXhjZXB0aW9uTWFwcGVyIGltcGxlbWVudHMgRXhjZXB0aW9uTWFwcGVyPElPRXhjZXB0aW9uPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSB0b1Jlc3BvbnNlKElPRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCJwYXNzZWQiKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoImlvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIElPRXhjZXB0aW9uUmVzb3VyY2UgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdChJT0JlYW4gaW9iZWFuKSB7CisgICAgICAgICAgICByZXR1cm4gaW9iZWFuLnZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SU9FeGNlcHRpb24oKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucmVnaXN0ZXIoSU9FeGNlcHRpb25NZXNzYWdlUmVhZGVyLmNsYXNzKQorICAgICAgICAgICAgICAgIC5wYXRoKCJpbyIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobmV3IElPQmVhbigiaW8tYmVhbiIpLCBNZWRpYVR5cGUuVEVYVF9QTEFJTikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygicGFzc2VkIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUaHJvd2FibGVGcm9tUmVzb3VyY2VNZXRob2QoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlcyA9IHRhcmdldCgpLnBhdGgoInRlc3QvdGhyb3dhYmxlIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXMuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm1hcHBlZC10aHJvd2FibGUtdGhyb3dhYmxlIiwgcmVzLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFBhdGgoIm5vdC1mb3VuZCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNZXNzYWdlQm9keVByb3ZpZGVyTm90Rm91bmRSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFhL2JiYiIpCisgICAgICAgIHB1YmxpYyBVbmtub3duVHlwZSBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFVua25vd25UeXBlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFVua25vd25UeXBlIHsKKworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHJvdmlkZXJOb3RGb3VuZEV4Y2VwdGlvbk1hcHBlciBpbXBsZW1lbnRzIEV4Y2VwdGlvbk1hcHBlcjxJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSB0b1Jlc3BvbnNlKEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICBpZiAoZXhjZXB0aW9uLmdldENhdXNlKCkgaW5zdGFuY2VvZiBNZXNzYWdlQm9keVByb3ZpZGVyTm90Rm91bmRFeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soIm1hcHBlZC1ieS1Qcm92aWRlck5vdEZvdW5kRXhjZXB0aW9uTWFwcGVyIikuYnVpbGQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zZXJ2ZXJFcnJvcigpLmVudGl0eSgiVW5leHBlY3RlZCByb290IGNhdXNlIG9mIEludGVybmFsU2VydmVyRXJyb3IiKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgdGhhdCB7QGxpbmsgTWVzc2FnZUJvZHlQcm92aWRlck5vdEZvdW5kRXhjZXB0aW9ufSB3cmFwcGVkIGludG8ge0BsaW5rIGphdmF4LndzLnJzLkludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb259CisgICAgICogaXMgY29ycmVjdGx5IG1hcHBlZCB1c2luZyBhbiB7QGxpbmsgRXhjZXB0aW9uTWFwcGVyfS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb3RGb3VuZFJlc291cmNlKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoIm5vdC1mb3VuZCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm1hcHBlZC1ieS1Qcm92aWRlck5vdEZvdW5kRXhjZXB0aW9uTWFwcGVyIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEplcnNleTE4ODdFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBKZXJzZXkxODg3RXhjZXB0aW9uTWFwcGVyIGV4dGVuZHMgRXhjZXB0aW9uTWFwcGVyPEplcnNleTE4ODdFeGNlcHRpb24+IHsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEplcnNleTE4ODdFeGNlcHRpb25NYXBwZXJJbXBsIGltcGxlbWVudHMgSmVyc2V5MTg4N0V4Y2VwdGlvbk1hcHBlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSB0b1Jlc3BvbnNlKGZpbmFsIEplcnNleTE4ODdFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soImZvdW5kIikuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJqZXJzZXkxODg3IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEplcnNleTE4ODdSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0KCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEplcnNleTE4ODdFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCB3ZSdyZSBhYmxlIHRvIHVzZSBjb3JyZWN0IGV4Y2VwdGlvbiBtYXBwZXIgZXZlbiB3aGVuIHRoZSBtYXBwZXIgaGllcmFyY2h5IGhhcyBjb21wbGV4IGluaGVyaXRhbmNlLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEplcnNleTE4ODcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJqZXJzZXkxODg3IikucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKCJmb3VuZCIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEplcnNleTIzODJFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEplcnNleTIzODJFbnRpdHkgeworICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSmVyc2V5MjM4MlByb3ZpZGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8SmVyc2V5MjM4MkVudGl0eT4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldFNpemUoZmluYWwgSmVyc2V5MjM4MkVudGl0eSBqZXJzZXkyMzgyRW50aXR5LCBmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oZmluYWwgSmVyc2V5MjM4MkVudGl0eSBqZXJzZXkyMzgyRW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoSmVyc2V5MjM4MkVudGl0eS5jbGFzcyAhPSB0eXBlKSB7CisgICAgICAgICAgICAgICAgZW50aXR5U3RyZWFtLndyaXRlKCJ3cm9uZy10eXBlIi5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoSmVyc2V5MjM4MkVudGl0eS5jbGFzcyAhPSBnZW5lcmljVHlwZSkgeworICAgICAgICAgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZSgid3JvbmctZ2VuZXJpYy10eXBlIi5nZXRCeXRlcygpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZW50aXR5U3RyZWFtLndyaXRlKCJvayIuZ2V0Qnl0ZXMoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEplcnNleTIzODJFeGNlcHRpb25NYXBwZXIgaW1wbGVtZW50cyBFeGNlcHRpb25NYXBwZXI8SmVyc2V5MjM4MkV4Y2VwdGlvbj4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgdG9SZXNwb25zZShmaW5hbCBKZXJzZXkyMzgyRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKG5ldyBKZXJzZXkyMzgyRW50aXR5KCkpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiamVyc2V5MjM4MiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKZXJzZXkyMzgyUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIExpc3Q8TGlzdDxJbnRlZ2VyPj4gZ2V0KCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEplcnNleTIzODJFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCB3ZSdyZSBhYmxlIHRvIHVzZSBjb3JyZWN0IGV4Y2VwdGlvbiBtYXBwZXIgZXZlbiB3aGVuIHRoZSBtYXBwZXIgaGllcmFyY2h5IGhhcyBjb21wbGV4IGluaGVyaXRhbmNlLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEplcnNleTIzODIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJqZXJzZXkyMzgyIikucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKCJvayIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9FeHRlbmRlZEV4Y2VwdGlvbk1hcHBlclRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0V4dGVuZGVkRXhjZXB0aW9uTWFwcGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MGI4YzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9FeHRlbmRlZEV4Y2VwdGlvbk1hcHBlclRlc3QuamF2YQpAQCAtMCwwICsxLDI5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkOworCitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5FeGNlcHRpb25NYXBwZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLkxvY2FsaXphdGlvbk1lc3NhZ2VzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5FeHRlbmRlZEV4Y2VwdGlvbk1hcHBlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKgorICovCitwdWJsaWMgY2xhc3MgRXh0ZW5kZWRFeGNlcHRpb25NYXBwZXJUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBzZXQoVGVzdFByb3BlcnRpZXMuUkVDT1JEX0xPR19MRVZFTCwgTGV2ZWwuRklORS5pbnRWYWx1ZSgpKTsKKworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKAorICAgICAgICAgICAgICAgIFRlc3RSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBFeGNlcHRpb25NYXBwZXJBLmNsYXNzLAorICAgICAgICAgICAgICAgIEV4Y2VwdGlvbk1hcHBlckIuY2xhc3MsCisgICAgICAgICAgICAgICAgRXhjZXB0aW9uTWFwcGVyQy5jbGFzcywKKyAgICAgICAgICAgICAgICBFeGNlcHRpb25NYXBwZXJELmNsYXNzLAorICAgICAgICAgICAgICAgIEV4Y2VwdGlvbk1hcHBlckUuY2xhc3MsCisgICAgICAgICAgICAgICAgRXhjZXB0aW9uTWFwcGVyWC5jbGFzcworICAgICAgICApOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXhjZXB0aW9uQSBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworICAgICAgICBwdWJsaWMgRXhjZXB0aW9uQShTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICAgICAgc3VwZXIobWVzc2FnZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEV4Y2VwdGlvbkIgZXh0ZW5kcyBFeGNlcHRpb25BIHsKKyAgICAgICAgcHVibGljIEV4Y2VwdGlvbkIoU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIHN1cGVyKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeGNlcHRpb25DIGV4dGVuZHMgRXhjZXB0aW9uQiB7CisgICAgICAgIHB1YmxpYyBFeGNlcHRpb25DKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgICAgICBzdXBlcihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXhjZXB0aW9uRCBleHRlbmRzIEV4Y2VwdGlvbkMgeworICAgICAgICBwdWJsaWMgRXhjZXB0aW9uRChTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICAgICAgc3VwZXIobWVzc2FnZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEV4Y2VwdGlvbkUgZXh0ZW5kcyBFeGNlcHRpb25EIHsKKyAgICAgICAgcHVibGljIEV4Y2VwdGlvbkUoU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIHN1cGVyKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeGNlcHRpb25YIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisgICAgICAgIHB1YmxpYyBFeGNlcHRpb25YKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgICAgICBzdXBlcihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeGNlcHRpb25NYXBwZXJBIGltcGxlbWVudHMgRXh0ZW5kZWRFeGNlcHRpb25NYXBwZXI8RXhjZXB0aW9uQT4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc01hcHBhYmxlKEV4Y2VwdGlvbkEgZXhjZXB0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gZXhjZXB0aW9uLmdldE1lc3NhZ2UoKS5zdWJzdHJpbmcoMikuY29udGFpbnMoIkEiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgdG9SZXNwb25zZShFeGNlcHRpb25BIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCJBIikuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXhjZXB0aW9uTWFwcGVyQiBpbXBsZW1lbnRzIEV4dGVuZGVkRXhjZXB0aW9uTWFwcGVyPEV4Y2VwdGlvbkI+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNNYXBwYWJsZShFeGNlcHRpb25CIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkuc3Vic3RyaW5nKDIpLmNvbnRhaW5zKCJCIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHRvUmVzcG9uc2UoRXhjZXB0aW9uQiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygiQiIpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEV4Y2VwdGlvbk1hcHBlckMgaW1wbGVtZW50cyBFeGNlcHRpb25NYXBwZXI8RXhjZXB0aW9uQz4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgdG9SZXNwb25zZShFeGNlcHRpb25DIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCJDIikuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXhjZXB0aW9uTWFwcGVyRCBpbXBsZW1lbnRzIEV4dGVuZGVkRXhjZXB0aW9uTWFwcGVyPEV4Y2VwdGlvbkQ+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNNYXBwYWJsZShFeGNlcHRpb25EIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkuc3Vic3RyaW5nKDIpLmNvbnRhaW5zKCJEIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHRvUmVzcG9uc2UoRXhjZXB0aW9uRCBleGNlcHRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygiRCIpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEV4Y2VwdGlvbk1hcHBlckUgaW1wbGVtZW50cyBFeHRlbmRlZEV4Y2VwdGlvbk1hcHBlcjxFeGNlcHRpb25FPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzTWFwcGFibGUoRXhjZXB0aW9uRSBleGNlcHRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBleGNlcHRpb24uZ2V0TWVzc2FnZSgpLnN1YnN0cmluZygyKS5jb250YWlucygiRSIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSB0b1Jlc3BvbnNlKEV4Y2VwdGlvbkUgZXhjZXB0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soIkUiKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeGNlcHRpb25NYXBwZXJYIGltcGxlbWVudHMgRXh0ZW5kZWRFeGNlcHRpb25NYXBwZXI8RXhjZXB0aW9uWD4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc01hcHBhYmxlKEV4Y2VwdGlvblggZXhjZXB0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gZXhjZXB0aW9uLmdldE1lc3NhZ2UoKS5zdWJzdHJpbmcoMikuY29udGFpbnMoIlgiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgdG9SZXNwb25zZShFeGNlcHRpb25YIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCJYIikuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJyZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0UmVzb3VyY2UgeworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3QoU3RyaW5nIGUpIHsKKyAgICAgICAgICAgIGlmIChlLmNoYXJBdCgwKSA9PSAnQScpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uQShTdHJpbmcudmFsdWVPZihlKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGUuY2hhckF0KDApID09ICdCJykgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb25CKFN0cmluZy52YWx1ZU9mKGUpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5jaGFyQXQoMCkgPT0gJ0MnKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvbkMoU3RyaW5nLnZhbHVlT2YoZSkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChlLmNoYXJBdCgwKSA9PSAnRCcpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uRChTdHJpbmcudmFsdWVPZihlKSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGUuY2hhckF0KDApID09ICdFJykgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb25FKFN0cmluZy52YWx1ZU9mKGUpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZS5jaGFyQXQoMCkgPT0gJ1gnKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEV4Y2VwdGlvblgoU3RyaW5nLnZhbHVlT2YoZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICJnZXQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0KCkgeworICAgICAgICAvLyBGb3JtYXQgb2YgZmlyc3QgcGFyYW06IFtleGNlcHRpb24gdGhyb3duXS1bZXhjZXB0aW9uIG1hcHBlcnMgd2hpY2ggd2lsbCByZXR1cm4gdHJ1ZSBpbiBpc01hcHBhYmxlXQorICAgICAgICBfdGVzdCgiQS1BIiwgIkEiKTsKKyAgICAgICAgX3Rlc3QoIkEtQUIiLCAiQSIpOworICAgICAgICBfdGVzdCgiQS1BQkMiLCAiQSIpOworICAgICAgICBfdGVzdCgiQS1BQkNEIiwgIkEiKTsKKyAgICAgICAgX3Rlc3QoIkEtQUJDREUiLCAiQSIpOworICAgICAgICBfdGVzdCgiQS1BQkNERVgiLCAiQSIpOworICAgICAgICBfdGVzdCgiQS1DIiwgbnVsbCk7CisgICAgICAgIF90ZXN0KCJBLUQiLCBudWxsKTsKKyAgICAgICAgX3Rlc3QoIkEtRSIsIG51bGwpOworICAgICAgICBfdGVzdCgiQS1EIiwgbnVsbCk7CisgICAgICAgIF90ZXN0KCJBLUJDREVYIiwgbnVsbCk7CisgICAgICAgIF90ZXN0KCJBLTAwMDAwIiwgbnVsbCk7CisgICAgICAgIF90ZXN0KCJBLVgiLCBudWxsKTsKKworCisgICAgICAgIF90ZXN0KCJCLUEiLCAiQSIpOworICAgICAgICBfdGVzdCgiQi1CIiwgIkIiKTsKKyAgICAgICAgX3Rlc3QoIkItQUIiLCAiQiIpOworICAgICAgICBfdGVzdCgiQi1BQkMiLCAiQiIpOworICAgICAgICBfdGVzdCgiQi1BQkNEIiwgIkIiKTsKKyAgICAgICAgX3Rlc3QoIkItQUJDREUiLCAiQiIpOworICAgICAgICBfdGVzdCgiQi1BQkNERVgiLCAiQiIpOworICAgICAgICBfdGVzdCgiQi1DIiwgbnVsbCk7CisgICAgICAgIF90ZXN0KCJCLUQiLCBudWxsKTsKKyAgICAgICAgX3Rlc3QoIkItRSIsIG51bGwpOworICAgICAgICBfdGVzdCgiQi1DREVYIiwgbnVsbCk7CisgICAgICAgIF90ZXN0KCJCLVgiLCBudWxsKTsKKyAgICAgICAgX3Rlc3QoIkItMDAwIiwgbnVsbCk7CisKKyAgICAgICAgLy8gQyBpcyBub3QgYW4gRXh0ZW5kZWRFeGNlcHRpb25NYXBwZXIgYnV0IGp1c3QgRXhjZXB0aW9uTWFwcGVyIChhbHdheXMgbWFwcGFibGUpCisgICAgICAgIF90ZXN0KCJDLUMiLCAiQyIpOworICAgICAgICBfdGVzdCgiQy1BIiwgIkMiKTsKKyAgICAgICAgX3Rlc3QoIkMtQUIiLCAiQyIpOworICAgICAgICBfdGVzdCgiQy1BQkMiLCAiQyIpOworICAgICAgICBfdGVzdCgiQy1BRVgiLCAiQyIpOworICAgICAgICBfdGVzdCgiQy0wMDAwMCIsICJDIik7CisgICAgICAgIF90ZXN0KCJDLUFCQ0RFWCIsICJDIik7CisgICAgICAgIF90ZXN0KCJDLUUiLCAiQyIpOworICAgICAgICBfdGVzdCgiQy1ERSIsICJDIik7CisgICAgICAgIF90ZXN0KCJDLUQiLCAiQyIpOworICAgICAgICBfdGVzdCgiQy1YIiwgIkMiKTsKKworICAgICAgICBfdGVzdCgiRC0wMDAiLCAiQyIpOworICAgICAgICBfdGVzdCgiRC1BIiwgIkMiKTsKKyAgICAgICAgX3Rlc3QoIkQtQiIsICJDIik7CisgICAgICAgIF90ZXN0KCJELUMiLCAiQyIpOworICAgICAgICBfdGVzdCgiRC1EIiwgIkQiKTsKKyAgICAgICAgX3Rlc3QoIkQtRSIsICJDIik7CisgICAgICAgIF90ZXN0KCJELUFCQyIsICJDIik7CisgICAgICAgIF90ZXN0KCJELUFCQ0VYIiwgIkMiKTsKKyAgICAgICAgX3Rlc3QoIkQtQUJDREVYIiwgIkQiKTsKKyAgICAgICAgX3Rlc3QoIkQtREUiLCAiRCIpOworICAgICAgICBfdGVzdCgiRC1BQkVYIiwgIkMiKTsKKyAgICAgICAgX3Rlc3QoIkQtQUVYIiwgIkMiKTsKKyAgICAgICAgX3Rlc3QoIkQtWCIsICJDIik7CisKKyAgICAgICAgX3Rlc3QoIkUtQSIsICJDIik7CisgICAgICAgIF90ZXN0KCJFLUIiLCAiQyIpOworICAgICAgICBfdGVzdCgiRS1DIiwgIkMiKTsKKyAgICAgICAgX3Rlc3QoIkUtRCIsICJEIik7CisgICAgICAgIF90ZXN0KCJFLUUiLCAiRSIpOworICAgICAgICBfdGVzdCgiRS1BQkMiLCAiQyIpOworICAgICAgICBfdGVzdCgiRS1BQkNEIiwgIkQiKTsKKyAgICAgICAgX3Rlc3QoIkUtQUJDREUiLCAiRSIpOworICAgICAgICBfdGVzdCgiRS1BQkNERVgiLCAiRSIpOworICAgICAgICBfdGVzdCgiRS1ERSIsICJFIik7CisgICAgICAgIF90ZXN0KCJFLVgiLCAiQyIpOworICAgICAgICBfdGVzdCgiRS0wMDAwMDAiLCAiQyIpOworCisgICAgICAgIF90ZXN0KCJYLUEiLCBudWxsKTsKKyAgICAgICAgX3Rlc3QoIlgtQUJDREUiLCBudWxsKTsKKyAgICAgICAgX3Rlc3QoIlgtQUJDREVYIiwgIlgiKTsKKyAgICAgICAgX3Rlc3QoIlgtWCIsICJYIik7CisKKyAgICAgICAgLy8gQ2hlY2sgbG9ncy4gKD8/KQorICAgICAgICBmb3IgKGZpbmFsIExvZ1JlY29yZCBsb2dSZWNvcmQgOiBnZXRMb2dnZWRSZWNvcmRzKCkpIHsKKworICAgICAgICAgICAgLy8gVE9ETzogdGhpcyB0ZXN0IGlzIGZyYWdpbGUuCisgICAgICAgICAgICBpZiAobG9nUmVjb3JkLmdldExvZ2dlck5hbWUoKS5jb250YWlucygiQ2xpZW50RXhlY3V0b3JQcm92aWRlcnNDb25maWd1cmF0b3IiKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBtZXNzYWdlIDogbmV3IFN0cmluZ1tdeworICAgICAgICAgICAgICAgICAgICBMb2NhbGl6YXRpb25NZXNzYWdlcy5FUlJPUl9FWENFUFRJT05fTUFQUElOR19PUklHSU5BTF9FWENFUFRJT04oKSwKKyAgICAgICAgICAgICAgICAgICAgTG9jYWxpemF0aW9uTWVzc2FnZXMuRVJST1JfRVhDRVBUSU9OX01BUFBJTkdfVEhST1dOX1RPX0NPTlRBSU5FUigpfSkgeworCisgICAgICAgICAgICAgICAgaWYgKGxvZ1JlY29yZC5nZXRNZXNzYWdlKCkuY29udGFpbnMobWVzc2FnZSkgJiYgbG9nUmVjb3JkLmdldExldmVsKCkuaW50VmFsdWUoKSA+IExldmVsLkZJTkUuaW50VmFsdWUoKSkgeworICAgICAgICAgICAgICAgICAgICBmYWlsKCJMb2cgbWVzc2FnZSBzaG91bGQgYmUgbG9nZ2VkIGF0IGxvd2VyIChGSU5FKSBsZXZlbDogIiArIG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfdGVzdChTdHJpbmcgaW5wdXQsIFN0cmluZyBleHBlY3RlZE1hcHBlcikgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgicmVzb3VyY2UiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KGlucHV0LCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIGlmIChleHBlY3RlZE1hcHBlciA9PSBudWxsKSB7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZXhwZWN0ZWRNYXBwZXIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIH0KKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvRXh0ZW5kZWRVcmlJbmZvVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvRXh0ZW5kZWRVcmlJbmZvVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4OGY5NGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9FeHRlbmRlZFVyaUluZm9UZXN0LmphdmEKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5OYW1lQmluZGluZzsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LkV4Y2VwdGlvbk1hcHBlcjsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuRXh0ZW5kZWRVcmlJbmZvOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5jb250YWluc1N0cmluZzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIHtAbGluayBFeHRlbmRlZFVyaUluZm99IGUyZSB0ZXN0cyAtIHRlc3RpbmcgZS5nLiBnZXR0aW5nIG1hdGNoZWQgcmVzb3VyY2VzLCBtYXBwZWQgdGhyb3dhYmxlLCBldGMuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBFeHRlbmRlZFVyaUluZm9UZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFRocm93YWJsZVJlc291cmNlLmNsYXNzLCBNYXBwZWRUaHJvd2FibGVSZXNwb25zZUZpbHRlci5jbGFzcywgTWFwcGVkRXhjZXB0aW9uTWFwcGVyLmNsYXNzKTsKKyAgICB9CisKKyAgICBATmFtZUJpbmRpbmcKKyAgICBAVGFyZ2V0KHtFbGVtZW50VHlwZS5UWVBFLCBFbGVtZW50VHlwZS5NRVRIT0R9KQorICAgIEBSZXRlbnRpb24odmFsdWUgPSBSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgICBwdWJsaWMgc3RhdGljIEBpbnRlcmZhY2UgTWFwcGVkVGhyb3dhYmxlIHt9CisKKyAgICBAUGF0aCgibWFwcGVkLXRocm93YWJsZS10ZXN0IikKKyAgICBATWFwcGVkVGhyb3dhYmxlCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUaHJvd2FibGVSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgidW5tYXBwZWQiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgdW5tYXBwZWQoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgibWFwcGVkIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIG1hcHBlZCgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNYXBwZWRFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIndlYmFwcCIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSB3ZWJhcHAoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgicmVndWxhciIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSByZWd1bGFyKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCkuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWFwcGVkRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNYXBwZWRFeGNlcHRpb25NYXBwZXIgaW1wbGVtZW50cyBFeGNlcHRpb25NYXBwZXI8TWFwcGVkRXhjZXB0aW9uPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSB0b1Jlc3BvbnNlKGZpbmFsIE1hcHBlZEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBATWFwcGVkVGhyb3dhYmxlCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNYXBwZWRUaHJvd2FibGVSZXNwb25zZUZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyIHsKKworICAgICAgICBASW5qZWN0CisgICAgICAgIHByaXZhdGUgRXh0ZW5kZWRVcmlJbmZvIHVyaUluZm87CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihmaW5hbCBDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCwgZmluYWwgQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCkKKyAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LnNldEVudGl0eShPYmplY3RzLnRvU3RyaW5nKHVyaUluZm8uZ2V0TWFwcGVkVGhyb3dhYmxlKCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVubWFwcGVkVGhyb3dhYmxlVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0VGhhdCgiSW50ZXJuYWwgU2VydmVyIEVycm9yIGV4cGVjdGVkIC0gcmVzcG9uc2UgZmlsdGVyIG5vdCBpbnZva2VkIiwKKyAgICAgICAgICAgICAgICB0YXJnZXQoIm1hcHBlZC10aHJvd2FibGUtdGVzdC91bm1hcHBlZCIpLnJlcXVlc3QoKS5nZXQoKS5nZXRTdGF0dXMoKSwKKyAgICAgICAgICAgICAgICBpcyhSZXNwb25zZS5TdGF0dXMuSU5URVJOQUxfU0VSVkVSX0VSUk9SLmdldFN0YXR1c0NvZGUoKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hcHBlZFRocm93YWJsZVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFRoYXQoIk1hcHBlZEV4Y2VwdGlvbiBleHBlY3RlZCBpbiBFeHRlbmRlZFVyaUluZm8jZ2V0TWFwcGVkVGhyb3dhYmxlIiwKKyAgICAgICAgICAgICAgICB0YXJnZXQoIm1hcHBlZC10aHJvd2FibGUtdGVzdC9tYXBwZWQiKS5yZXF1ZXN0KCkuZ2V0KCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLAorICAgICAgICAgICAgICAgIGlzKCJvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLkV4dGVuZGVkVXJpSW5mb1Rlc3QkTWFwcGVkRXhjZXB0aW9uIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdlYkFwcFRocm93YWJsZVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFRoYXQoIkludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24gZXhwZWN0ZWQgaW4gRXh0ZW5kZWRVcmlJbmZvI2dldE1hcHBlZFRocm93YWJsZSIsCisgICAgICAgICAgICAgICAgdGFyZ2V0KCJtYXBwZWQtdGhyb3dhYmxlLXRlc3Qvd2ViYXBwIikucmVxdWVzdCgpLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwKKyAgICAgICAgICAgICAgICBjb250YWluc1N0cmluZygiamF2YXgud3MucnMuSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbiIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWd1bGFyUmVzb3VyY2VWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRUaGF0KCJudWxsIGV4cGVjdGVkIGluIEV4dGVuZGVkVXJpSW5mbyNnZXRNYXBwZWRUaHJvd2FibGUiLAorICAgICAgICAgICAgICAgIHRhcmdldCgibWFwcGVkLXRocm93YWJsZS10ZXN0L3JlZ3VsYXIiKS5yZXF1ZXN0KCkuZ2V0KCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLAorICAgICAgICAgICAgICAgIGlzKCJudWxsIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0Zvcm1QYXJhbU11bHRpdmFsdWVkSW5qZWN0aW9uVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvRm9ybVBhcmFtTXVsdGl2YWx1ZWRJbmplY3Rpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI3MDgwMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0Zvcm1QYXJhbU11bHRpdmFsdWVkSW5qZWN0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5FbmNvZGVkOworaW1wb3J0IGphdmF4LndzLnJzLkZvcm1QYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdHMgdGhhdCB0aGUgTXVsdGl2YWx1ZWRNYXAgaW5qZWN0aW9uIGRvZXMgbm90IGNsb3NlIHRoZSByZXF1ZXN0IGJ1ZmZlciBhbmQgYWxsb3dzCisgKiB0byBwcm9jZWVkIG90aGVyIEZvcm1QYXJhbSBpbmplY3Rpb25zLgorICoKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitwdWJsaWMgY2xhc3MgRm9ybVBhcmFtTXVsdGl2YWx1ZWRJbmplY3Rpb25UZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVERUZJTkVEX1JFU1BPTlNFID0gIkhlbGxvIEdlb3JnZSBKYXZhdGFyIjsKKworICAgIEBQYXRoKCJmb3JtIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZvcm1SZXNvdXJjZSB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoInNpbXBsZSIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBzaW1wbGUoTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGZvcm1QYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBARm9ybVBhcmFtKCJmaXJzdG5hbWUiKSBTdHJpbmcgZmlyc3RuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQEZvcm1QYXJhbSgibGFzdG5hbWUiKSBTdHJpbmcgbGFzdG5hbWUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBmb3JtUGFyYW1zLnNpemUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkdlb3JnZSIsIGZvcm1QYXJhbXMuZ2V0KCJmaXJzdG5hbWUiKS5nZXQoMCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJKYXZhdGFyIiwgZm9ybVBhcmFtcy5nZXQoImxhc3RuYW1lIikuZ2V0KDApKTsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoUmVzcG9uc2UuU3RhdHVzLk9LKS5lbnRpdHkoIkhlbGxvICIgKyBmaXJzdG5hbWUgKyAiICIgKyBsYXN0bmFtZSkuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJudWxsYWJsZSIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBudWxsYWJsZShNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gZm9ybVBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBGb3JtUGFyYW0oImZpcnN0bmFtZSIpIFN0cmluZyBmaXJzdG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBARm9ybVBhcmFtKCJsYXN0bmFtZSIpIFN0cmluZyBsYXN0bmFtZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGZvcm1QYXJhbXMuc2l6ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBmb3JtUGFyYW1zLmdldCgiZmlyc3RuYW1lIikuc2l6ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiR2VvcmdlIiwgZm9ybVBhcmFtcy5nZXQoImZpcnN0bmFtZSIpLmdldCgwKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkphdmF0YXIiLCBmb3JtUGFyYW1zLmdldCgibGFzdG5hbWUiKS5nZXQoMCkpOworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyhSZXNwb25zZS5TdGF0dXMuT0spLmVudGl0eSgiSGVsbG8gIiArIGZpcnN0bmFtZSArICIgIiArIGxhc3RuYW1lKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoIm1peGVkIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIG1peGVkKEBGb3JtUGFyYW0oImZpcnN0bmFtZSIpIFN0cmluZyBmaXJzdG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gZm9ybVBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBGb3JtUGFyYW0oImxhc3RuYW1lIikgU3RyaW5nIGxhc3RuYW1lKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgZm9ybVBhcmFtcy5zaXplKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGZvcm1QYXJhbXMuZ2V0KCJmaXJzdG5hbWUiKS5zaXplKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJHZW9yZ2UiLCBmb3JtUGFyYW1zLmdldCgiZmlyc3RuYW1lIikuZ2V0KDApKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSmF2YXRhciIsIGZvcm1QYXJhbXMuZ2V0KCJsYXN0bmFtZSIpLmdldCgwKSk7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKFJlc3BvbnNlLlN0YXR1cy5PSykuZW50aXR5KCJIZWxsbyAiICsgZmlyc3RuYW1lICsgIiAiICsgbGFzdG5hbWUpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgiZW5jb2RlZCIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBlbmNvZGVkKE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBmb3JtUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBFbmNvZGVkIEBGb3JtUGFyYW0oImZpcnN0bmFtZSIpIFN0cmluZyBmaXJzdG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQEZvcm1QYXJhbSgibGFzdG5hbWUiKSBTdHJpbmcgbGFzdG5hbWUpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyLCBmb3JtUGFyYW1zLnNpemUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkdlb3JnZSIsIGZvcm1QYXJhbXMuZ2V0KCJmaXJzdG5hbWUiKS5nZXQoMCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJKYXZhdGFyIiwgZm9ybVBhcmFtcy5nZXQoImxhc3RuYW1lIikuZ2V0KDApKTsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoUmVzcG9uc2UuU3RhdHVzLk9LKS5lbnRpdHkoIkhlbGxvICIgKyBmaXJzdG5hbWUgKyAiICIgKyBsYXN0bmFtZSkuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgQFBhdGgoImZvcm0tZXh0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZvcm1FeHRSZXNvdXJjZSB7CisKKyAgICAgICAgQEVuY29kZWQgQEZvcm1QYXJhbSgiZmlyc3RuYW1lIikgU3RyaW5nIGZpcnN0bmFtZTsKKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgiZW5jb2RlZCIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBlbmNvZGVkKE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBmb3JtUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBGb3JtUGFyYW0oImxhc3RuYW1lIikgU3RyaW5nIGxhc3RuYW1lKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgZm9ybVBhcmFtcy5zaXplKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJHZW9yZ2UiLCBmb3JtUGFyYW1zLmdldCgiZmlyc3RuYW1lIikuZ2V0KDApKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiSmF2YXRhciIsIGZvcm1QYXJhbXMuZ2V0KCJsYXN0bmFtZSIpLmdldCgwKSk7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKFJlc3BvbnNlLlN0YXR1cy5PSykuZW50aXR5KCJIZWxsbyAiICsgZmlyc3RuYW1lICsgIiAiICsgbGFzdG5hbWUpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoRm9ybVJlc291cmNlLmNsYXNzLCBGb3JtRXh0UmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZvcm1NdWx0aXZhbHVlZFBhcmFtKCkgeworICAgICAgICBSZXNwb25zZSByZXN1bHQgPSBjYWxsKCIvZm9ybS9zaW1wbGUiLCAiZmlyc3RuYW1lPUdlb3JnZSZsYXN0bmFtZT1KYXZhdGFyIik7CisgICAgICAgIGFzc2VydEVxdWFscyhQUkVERUZJTkVEX1JFU1BPTlNFLCByZXN1bHQucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JtTXVsdGl2YWx1ZWRQYXJhbVdpdGhOdWxsKCkgeworICAgICAgICBSZXNwb25zZSByZXN1bHQgPSBjYWxsKCIvZm9ybS9udWxsYWJsZSIsICJmaXJzdG5hbWU9R2VvcmdlJmZpcnN0bmFtZSZsYXN0bmFtZT1KYXZhdGFyIik7CisgICAgICAgIGFzc2VydEVxdWFscyhQUkVERUZJTkVEX1JFU1BPTlNFLCByZXN1bHQucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JtTXVsdGl2YWx1ZWRQYXJhbU1peGVkUGFyYW1PcmRlcigpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzdWx0ID0gY2FsbCgiL2Zvcm0vbWl4ZWQiLCAiZmlyc3RuYW1lPUdlb3JnZSZmaXJzdG5hbWUmbGFzdG5hbWU9SmF2YXRhciIpOworICAgICAgICBhc3NlcnRFcXVhbHMoUFJFREVGSU5FRF9SRVNQT05TRSwgcmVzdWx0LnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9ybU11bHRpdmFsdWVkUGFyYW1FbmNvZGVkKCkgeworICAgICAgICBSZXNwb25zZSByZXN1bHQgPSBjYWxsKCIvZm9ybS9lbmNvZGVkIiwgImZpcnN0bmFtZT1HZW9yZ2UmbGFzdG5hbWU9SmF2YXRhciIpOworICAgICAgICBhc3NlcnRFcXVhbHMoUFJFREVGSU5FRF9SRVNQT05TRSwgcmVzdWx0LnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9ybU11bHRpdmFsdWVkUGFyYW1FeHRlcm5hbEVuY29kZWRJbmplY3Rpb24oKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3VsdCA9IGNhbGwoIi9mb3JtLWV4dC9lbmNvZGVkIiwgImZpcnN0bmFtZT1HZW9yZ2UmbGFzdG5hbWU9SmF2YXRhciIpOworICAgICAgICBhc3NlcnRFcXVhbHMoUFJFREVGSU5FRF9SRVNQT05TRSwgcmVzdWx0LnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZXNwb25zZSBjYWxsKFN0cmluZyBwYXRoLCBTdHJpbmcgZW50aXR5KSB7CisgICAgICAgIHJldHVybiB0YXJnZXQoKS5wYXRoKHBhdGgpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkoZW50aXR5LCBNZWRpYVR5cGUuQVBQTElDQVRJT05fRk9STV9VUkxFTkNPREVEX1RZUEUpKTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0dsb2JhbE5hbWVCb3VuZEludGVyY2VwdG9yVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvR2xvYmFsTmFtZUJvdW5kSW50ZXJjZXB0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFhZWMzNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0dsb2JhbE5hbWVCb3VuZEludGVyY2VwdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjU0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLk5hbWVCaW5kaW5nOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuUHJlTWF0Y2hpbmc7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5FeGNlcHRpb25NYXBwZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJlYWRlckludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SZWFkZXJJbnRlcmNlcHRvckNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvckNvbnRleHQ7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGVzdHMgbmFtZSBib3VuZCBhbmQgZ2xvYmFsIGJvdW5kIGludGVyY2VwdG9ycy4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKgorICovCitwdWJsaWMgY2xhc3MgR2xvYmFsTmFtZUJvdW5kSW50ZXJjZXB0b3JUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKAorICAgICAgICAgICAgICAgIEludGVyY2VwdG9yVGVzdEJvdW5kLmNsYXNzLAorICAgICAgICAgICAgICAgIEludGVyY2VwdG9yR2xvYmFsLmNsYXNzLAorICAgICAgICAgICAgICAgIFByZU1hdGNoRmlsdGVyLmNsYXNzLAorICAgICAgICAgICAgICAgIFRlc3RSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBUZXN0RXhjZXB0aW9uTWFwcGVyLmNsYXNzLAorICAgICAgICAgICAgICAgIFJlcXVlc3RGaWx0ZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgUmVhZGVySW50ZXJjZXB0b3JHbG9iYWwuY2xhc3MsCisgICAgICAgICAgICAgICAgUmVhZGVySW50ZXJjZXB0b3JQb3N0Qm91bmQuY2xhc3MpOworICAgIH0KKworICAgIEBOYW1lQmluZGluZworICAgIEBUYXJnZXQoe0VsZW1lbnRUeXBlLlRZUEUsIEVsZW1lbnRUeXBlLk1FVEhPRH0pCisgICAgQFJldGVudGlvbih2YWx1ZSA9IFJldGVudGlvblBvbGljeS5SVU5USU1FKQorICAgIHB1YmxpYyBzdGF0aWMgQGludGVyZmFjZSBUZXN0Qm91bmQge30KKworICAgIEBOYW1lQmluZGluZworICAgIEBUYXJnZXQoe0VsZW1lbnRUeXBlLlRZUEUsIEVsZW1lbnRUeXBlLk1FVEhPRH0pCisgICAgQFJldGVudGlvbih2YWx1ZSA9IFJldGVudGlvblBvbGljeS5SVU5USU1FKQorICAgIHB1YmxpYyBzdGF0aWMgQGludGVyZmFjZSBQb3N0Qm91bmQge30KKworICAgIEBQYXRoKCJyZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0UmVzb3VyY2UgeworICAgICAgICBAR0VUCisgICAgICAgIEBUZXN0Qm91bmQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gImdldCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJzdGFuZGFyZCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhbmRhcmQoKSB7CisgICAgICAgICAgICByZXR1cm4gIm9rIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQb3N0Qm91bmQKKyAgICAgICAgQFBhdGgoInBvc3RCb3VuZCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdEJvdW5kKFN0cmluZyBzdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBzdHI7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgicG9zdEdsb2JhbCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdEdsb2JhbChTdHJpbmcgc3RyKSB7CisgICAgICAgICAgICByZXR1cm4gc3RyOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0RXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisgICAgICAgIHB1YmxpYyBUZXN0RXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgICAgICBzdXBlcihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdEV4Y2VwdGlvbk1hcHBlciBpbXBsZW1lbnRzIEV4Y2VwdGlvbk1hcHBlcjxUZXN0RXhjZXB0aW9uPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSB0b1Jlc3BvbnNlKFRlc3RFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soIm1hcHBlZC0iICsgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSkuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgQFByZU1hdGNoaW5nCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQcmVNYXRjaEZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoImV4Y2VwdGlvbiIuZXF1YWxzKHJlcXVlc3RDb250ZXh0LmdldEhlYWRlclN0cmluZygicHJlLWZpbHRlciIpKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUZXN0RXhjZXB0aW9uKCIocHJlLW1hdGNoaW5nLWV4Y2VwdGlvbikiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoImFib3J0Ii5lcXVhbHMocmVxdWVzdENvbnRleHQuZ2V0SGVhZGVyU3RyaW5nKCJwcmUtZmlsdGVyIikpKSB7CisgICAgICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuYWJvcnRXaXRoKFJlc3BvbnNlLm9rKCIocHJlLW1hdGNoaW5nLWFib3J0KSIpLmJ1aWxkKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXF1ZXN0RmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmICgiZXhjZXB0aW9uIi5lcXVhbHMocmVxdWVzdENvbnRleHQuZ2V0SGVhZGVyU3RyaW5nKCJyZXF1ZXN0LWZpbHRlciIpKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUZXN0RXhjZXB0aW9uKCIocmVxdWVzdC1maWx0ZXItZXhjZXB0aW9uKSIpOworICAgICAgICAgICAgfSBlbHNlIGlmICgiYWJvcnQiLmVxdWFscyhyZXF1ZXN0Q29udGV4dC5nZXRIZWFkZXJTdHJpbmcoInJlcXVlc3QtZmlsdGVyIikpKSB7CisgICAgICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuYWJvcnRXaXRoKFJlc3BvbnNlLm9rKCIocmVxdWVzdC1maWx0ZXItYWJvcnQpIikuYnVpbGQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdEJvdW5kCisgICAgQFByaW9yaXR5KDIwMCkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEludGVyY2VwdG9yVGVzdEJvdW5kIGltcGxlbWVudHMgV3JpdGVySW50ZXJjZXB0b3IgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBhcm91bmRXcml0ZVRvKFdyaXRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KQorICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgU3RyaW5nIGVudGl0eSA9IGNvbnRleHQuZ2V0RW50aXR5KCkgKyAiLVt0ZXN0LWJvdW5kXSI7CisgICAgICAgICAgICBjb250ZXh0LnNldEVudGl0eShlbnRpdHkpOworICAgICAgICAgICAgY29udGV4dC5wcm9jZWVkKCk7IC8vQWRkIG9uZQorICAgICAgICB9CisgICAgfQorCisgICAgQFByaW9yaXR5KDEwMCkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEludGVyY2VwdG9yR2xvYmFsIGltcGxlbWVudHMgV3JpdGVySW50ZXJjZXB0b3IgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBhcm91bmRXcml0ZVRvKFdyaXRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KQorICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgU3RyaW5nIGVudGl0eSA9IGNvbnRleHQuZ2V0RW50aXR5KCkgKyAiLVtnbG9iYWwtYm91bmRdIjsKKyAgICAgICAgICAgIGNvbnRleHQuc2V0RW50aXR5KGVudGl0eSk7CisgICAgICAgICAgICBjb250ZXh0LnByb2NlZWQoKTsgLy9BZGQgb25lCisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJpb3JpdHkoMjAwKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVhZGVySW50ZXJjZXB0b3JHbG9iYWwgaW1wbGVtZW50cyBSZWFkZXJJbnRlcmNlcHRvciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPYmplY3QgYXJvdW5kUmVhZEZyb20oUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVudGl0eSA9IChTdHJpbmcpIGNvbnRleHQucHJvY2VlZCgpOworICAgICAgICAgICAgcmV0dXJuIGVudGl0eSArICItW2dsb2JhbC1yZWFkZXItaW50ZXJjZXB0b3JdIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcmlvcml0eSgxMDApCisgICAgQFBvc3RCb3VuZAorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVhZGVySW50ZXJjZXB0b3JQb3N0Qm91bmQgaW1wbGVtZW50cyBSZWFkZXJJbnRlcmNlcHRvciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPYmplY3QgYXJvdW5kUmVhZEZyb20oUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVudGl0eSA9IChTdHJpbmcpIGNvbnRleHQucHJvY2VlZCgpOworICAgICAgICAgICAgcmV0dXJuIGVudGl0eSArICItW3Bvc3QtcmVhZGVyLWludGVyY2VwdG9yXSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVtYXRjaGluZ0V4Y2VwdGlvbigpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoInJlc291cmNlIikucmVxdWVzdCgpLmhlYWRlcigicHJlLWZpbHRlciIsICJleGNlcHRpb24iKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygibWFwcGVkLShwcmUtbWF0Y2hpbmctZXhjZXB0aW9uKS1bZ2xvYmFsLWJvdW5kXSIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlbWF0Y2hpbmdBYm9ydCgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoInJlc291cmNlIikucmVxdWVzdCgpLmhlYWRlcigicHJlLWZpbHRlciIsICJhYm9ydCIpLmdldCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIocHJlLW1hdGNoaW5nLWFib3J0KS1bZ2xvYmFsLWJvdW5kXSIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWVzdEZpbHRlckV4Y2VwdGlvbigpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoInJlc291cmNlIikucmVxdWVzdCgpLmhlYWRlcigicmVxdWVzdC1maWx0ZXIiLCAiZXhjZXB0aW9uIikuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIm1hcHBlZC0ocmVxdWVzdC1maWx0ZXItZXhjZXB0aW9uKS1bZ2xvYmFsLWJvdW5kXS1bdGVzdC1ib3VuZF0iLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcXVlc3RGaWx0ZXJBYm9ydCgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoInJlc291cmNlIikucmVxdWVzdCgpLmhlYWRlcigicmVxdWVzdC1maWx0ZXIiLCAiYWJvcnQiKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiKHJlcXVlc3QtZmlsdGVyLWFib3J0KS1bZ2xvYmFsLWJvdW5kXS1bdGVzdC1ib3VuZF0iLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YW5kYXJkUmVzb3VyY2UoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJyZXNvdXJjZS9zdGFuZGFyZCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygib2stW2dsb2JhbC1ib3VuZF0iLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRlc3RSZXNvdXJjZSgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoInJlc291cmNlIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJnZXQtW2dsb2JhbC1ib3VuZF0tW3Rlc3QtYm91bmRdIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc3QoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJyZXNvdXJjZS9wb3N0R2xvYmFsIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eSgicG9zdCIsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygicG9zdC1bZ2xvYmFsLXJlYWRlci1pbnRlcmNlcHRvcl0tW2dsb2JhbC1ib3VuZF0iLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc3RCb3VuZCgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoInJlc291cmNlL3Bvc3RCb3VuZCIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoInBvc3QiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInBvc3QtW2dsb2JhbC1yZWFkZXItaW50ZXJjZXB0b3JdLVtwb3N0LXJlYWRlci1pbnRlcmNlcHRvcl0tW2dsb2JhbC1ib3VuZF0iLAorICAgICAgICAgICAgICAgIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9HbG9iYWxseU5hbWVCb3VuZFJlc291cmNlRmlsdGVyVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvR2xvYmFsbHlOYW1lQm91bmRSZXNvdXJjZUZpbHRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTQ4Yjc5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvR2xvYmFsbHlOYW1lQm91bmRSZXNvdXJjZUZpbHRlclRlc3QuamF2YQpAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLk5hbWVCaW5kaW5nOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlc3BvbnNlRmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIEpBWC1SUyBnbG9iYWwgbmFtZS1ib3VuZCBmaWx0ZXIgdGVzdHMuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqIEBzZWUgUmVzb3VyY2VGaWx0ZXJUZXN0CisgKi8KK3B1YmxpYyBjbGFzcyBHbG9iYWxseU5hbWVCb3VuZFJlc291cmNlRmlsdGVyVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9SRVFVRVNUX0hFQURFUiA9ICJ0ZXN0LXJlcXVlc3QtaGVhZGVyIjsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgTXlBcHBsaWNhdGlvbigpOworICAgIH0KKworICAgIEBHbG9iYWxseUJvdW5kCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBNeUFwcGxpY2F0aW9uIGV4dGVuZHMgUmVzb3VyY2VDb25maWcgeworICAgICAgICBwdWJsaWMgTXlBcHBsaWNhdGlvbigpIHsKKyAgICAgICAgICAgIHN1cGVyKAorICAgICAgICAgICAgICAgICAgICBNeVJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICBHbG9iYWxseUJvdW5kUmVxdWVzdEZpbHRlci5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgR2xvYmFsbHlCb3VuZFJlc3BvbnNlRmlsdGVyLmNsYXNzCisKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHbG9iYWx5Qm91bmRQb3N0TWF0Y2hpbmcoKSB7CisgICAgICAgIFJlc3BvbnNlIHIgPSB0YXJnZXQoInBvc3RNYXRjaGluZyIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyLmdldFN0YXR1cygpLCBlcXVhbFRvKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHIuaGFzRW50aXR5KCksIGlzKHRydWUpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbygicmVxdWVzdEZpbHRlci1tZXRob2QtcmVzcG9uc2VGaWx0ZXIiKSk7CisgICAgfQorCisgICAgLy8gU2VlIEpFUlNFWS0xNTU0CisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2xvYmFseUJvdW5kUG9zdE1hdGNoaW5nUmVxdWVzdEZpbHRlck5vdEludm9rZWRPbjQwNCgpIHsKKyAgICAgICAgUmVzcG9uc2UgciA9IHRhcmdldCgibm90Rm91bmQiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDQsIHIuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRUaGF0KHIuaGFzRW50aXR5KCksIGlzKHRydWUpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbygicmVzcG9uc2VGaWx0ZXIiKSk7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlSZXNvdXJjZSB7CisKKyAgICAgICAgQFBhdGgoInBvc3RNYXRjaGluZyIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRQb3N0TWF0Y2hpbmcoQENvbnRleHQgSHR0cEhlYWRlcnMgaGVhZGVycykgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGhlYWRlciA9IGhlYWRlcnMuZ2V0SGVhZGVyU3RyaW5nKFRFU1RfUkVRVUVTVF9IRUFERVIpOworICAgICAgICAgICAgcmV0dXJuIGhlYWRlciArICItbWV0aG9kIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBOYW1lQmluZGluZworICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCisgICAgcHJpdmF0ZSBzdGF0aWMgQGludGVyZmFjZSBHbG9iYWxseUJvdW5kIHsKKyAgICB9CisKKyAgICBAR2xvYmFsbHlCb3VuZAorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgR2xvYmFsbHlCb3VuZFJlcXVlc3RGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LmdldEhlYWRlcnMoKS5wdXRTaW5nbGUoVEVTVF9SRVFVRVNUX0hFQURFUiwgInJlcXVlc3RGaWx0ZXIiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBHbG9iYWxseUJvdW5kCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBHbG9iYWxseUJvdW5kUmVzcG9uc2VGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXNwb25zZUZpbHRlciB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsIENvbnRhaW5lclJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuc2V0RW50aXR5KAorICAgICAgICAgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuaGFzRW50aXR5KCkgPyByZXNwb25zZUNvbnRleHQuZ2V0RW50aXR5KCkgKyAiLXJlc3BvbnNlRmlsdGVyIiA6ICJyZXNwb25zZUZpbHRlciIsCisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlQ29udGV4dC5nZXRFbnRpdHlBbm5vdGF0aW9ucygpLAorICAgICAgICAgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuZ2V0TWVkaWFUeXBlKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvR3JpenpseUluamVjdGlvblRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0dyaXp6bHlJbmplY3Rpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQwZmU2ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0dyaXp6bHlJbmplY3Rpb25UZXN0LmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5ncml6emx5Lmh0dHAuc2VydmVyLlJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5ncml6emx5Lmh0dHAuc2VydmVyLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5ncml6emx5LkdyaXp6bHlUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworCisvKioKKyAqIFRlc3QgZm9yIEpFUlNFWS0xMTcwCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitwdWJsaWMgY2xhc3MgR3JpenpseUluamVjdGlvblRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBHcml6emx5VGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisgICAgICAgIHByaXZhdGUgZmluYWwgUmVxdWVzdCByZXF1ZXN0OworCisgICAgICAgIHB1YmxpYyBSZXNvdXJjZSgKKyAgICAgICAgICAgICAgICBAQ29udGV4dCBSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgQENvbnRleHQgUmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmVxdWVzdCk7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsKKyAgICAgICAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0TWV0aG9kKCkuZ2V0TWV0aG9kU3RyaW5nKCkudG9VcHBlckNhc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgcyA9IHRhcmdldCgpLnBhdGgoIi8iKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiR0VUIiwgcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvSW5pdGlhbGl6YXRpb25Mb2dnaW5nVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvSW5pdGlhbGl6YXRpb25Mb2dnaW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMmFkMjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9Jbml0aWFsaXphdGlvbkxvZ2dpbmdUZXN0LmphdmEKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5Mb2NhbGl6YXRpb25NZXNzYWdlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEluaXRpYWxpemF0aW9uTG9nZ2luZ1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisgICAgICAgIHNldChUZXN0UHJvcGVydGllcy5SRUNPUkRfTE9HX0xFVkVMLCBMZXZlbC5GSU5FLmludFZhbHVlKCkpOworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEEuY2xhc3MpOworICAgIH0KKworICAgIEBQYXRoKCJ0ZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEEgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gInRlc3QiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0KCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByID0gdGFyZ2V0KCkucGF0aCgidGVzdCIpLnJlcXVlc3QoKS5nZXQoUmVzcG9uc2UuY2xhc3MpOworCisgICAgICAgIGFzc2VydFRydWUoci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykuY29udGFpbnMoInRlc3QiKSk7CisKKyAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworCisgICAgICAgIGZvciAoTG9nUmVjb3JkIGxvZ1JlY29yZCA6IGdldExvZ2dlZFJlY29yZHMoKSkgeworICAgICAgICAgICAgaWYgKGxvZ1JlY29yZC5nZXRNZXNzYWdlKCkuY29udGFpbnMoTG9jYWxpemF0aW9uTWVzc2FnZXMuTE9HR0lOR19BUFBMSUNBVElPTl9JTklUSUFMSVpFRCgpKSkgeworICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydFRydWUoZm91bmQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0luamVjdGlvbk1hbmFnZXJTZXJ2ZXJQcm92aWRlclRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0luamVjdGlvbk1hbmFnZXJTZXJ2ZXJQcm92aWRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDQ1MjFhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvSW5qZWN0aW9uTWFuYWdlclNlcnZlclByb3ZpZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjExIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCitpbXBvcnQgamF2YXgud3MucnMuTmFtZUJpbmRpbmc7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SZWFkZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0OworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LkluamVjdGlvbk1hbmFnZXJQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQWJzdHJhY3RCaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0cyB7QGxpbmsgSW5qZWN0aW9uTWFuYWdlclByb3ZpZGVyfS4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBJbmplY3Rpb25NYW5hZ2VyU2VydmVyUHJvdmlkZXJUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAUGF0aCgicmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFJlc291cmNlIHsKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoImZlYXR1cmUiKQorICAgICAgICBARmVhdHVyZUJvdW5kCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZWNob0ZlYXR1cmUoU3RyaW5nIGVudGl0eSkgeworICAgICAgICAgICAgcmV0dXJuIGVudGl0eTsKKyAgICAgICAgfQorCisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoInJlYWRlci1pbnRlcmNlcHRvciIpCisgICAgICAgIEBSZWFkZXJJbnRlcmNlcHRvckJvdW5kCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZWNob1JlYWRlckludGVyY2VwdG9yKFN0cmluZyBlbnRpdHkpIHsKKyAgICAgICAgICAgIHJldHVybiBlbnRpdHk7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgid3JpdGVyLWludGVyY2VwdG9yIikKKyAgICAgICAgQFdyaXRlckludGVyY2VwdG9yQm91bmQKKyAgICAgICAgcHVibGljIFN0cmluZyBlY2hvV3JpdGVySW50ZXJjZXB0b3IoU3RyaW5nIGVudGl0eSkgeworICAgICAgICAgICAgcmV0dXJuIGVudGl0eTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKFRlc3RSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVyKG5ldyBBYnN0cmFjdEJpbmRlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICAgICAgICAgIGJpbmQobmV3IE15SW5qZWN0ZWRTZXJ2aWNlKCJoZWxsbyIpKS50byhNeUluamVjdGVkU2VydmljZS5jbGFzcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICByZXNvdXJjZUNvbmZpZy5yZWdpc3RlcihuZXcgTXlGZWF0dXJlKCkpOworICAgICAgICByZXNvdXJjZUNvbmZpZy5yZWdpc3RlcihuZXcgTXlSZWFkZXJJbnRlcmNlcHRvcigpKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucmVnaXN0ZXIobmV3IE15V3JpdGVySW50ZXJjZXB0b3IoKSk7CisgICAgICAgIHJldHVybiByZXNvdXJjZUNvbmZpZzsKKyAgICB9CisKKworICAgIEBOYW1lQmluZGluZworICAgIEBUYXJnZXQoe0VsZW1lbnRUeXBlLlRZUEUsIEVsZW1lbnRUeXBlLk1FVEhPRH0pCisgICAgQFJldGVudGlvbih2YWx1ZSA9IFJldGVudGlvblBvbGljeS5SVU5USU1FKQorICAgIHB1YmxpYyBzdGF0aWMgQGludGVyZmFjZSBGZWF0dXJlQm91bmQgeworICAgIH0KKworICAgIEBOYW1lQmluZGluZworICAgIEBUYXJnZXQoe0VsZW1lbnRUeXBlLlRZUEUsIEVsZW1lbnRUeXBlLk1FVEhPRH0pCisgICAgQFJldGVudGlvbih2YWx1ZSA9IFJldGVudGlvblBvbGljeS5SVU5USU1FKQorICAgIHB1YmxpYyBzdGF0aWMgQGludGVyZmFjZSBSZWFkZXJJbnRlcmNlcHRvckJvdW5kIHsKKyAgICB9CisKKyAgICBATmFtZUJpbmRpbmcKKyAgICBAVGFyZ2V0KHtFbGVtZW50VHlwZS5UWVBFLCBFbGVtZW50VHlwZS5NRVRIT0R9KQorICAgIEBSZXRlbnRpb24odmFsdWUgPSBSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgICBwdWJsaWMgc3RhdGljIEBpbnRlcmZhY2UgV3JpdGVySW50ZXJjZXB0b3JCb3VuZCB7CisgICAgfQorCisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15SW5qZWN0ZWRTZXJ2aWNlIHsKKyAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBuYW1lOworCisgICAgICAgIHB1YmxpYyBNeUluamVjdGVkU2VydmljZShTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15RmVhdHVyZSBpbXBsZW1lbnRzIEZlYXR1cmUgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmUoRmVhdHVyZUNvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihNeUZlYXR1cmVJbnRlcmNlcHRvci5jbGFzcyk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisKKyAgICAgICAgQEZlYXR1cmVCb3VuZAorICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15RmVhdHVyZUludGVyY2VwdG9yIGltcGxlbWVudHMgV3JpdGVySW50ZXJjZXB0b3IgeworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworICAgICAgICAgICAgQEluamVjdAorICAgICAgICAgICAgcHVibGljIE15RmVhdHVyZUludGVyY2VwdG9yKE15SW5qZWN0ZWRTZXJ2aWNlIGluamVjdGVkU2VydmljZSkgeworICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IGluamVjdGVkU2VydmljZS5nZXROYW1lKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgYXJvdW5kV3JpdGVUbyhXcml0ZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgY29udGV4dC5zZXRFbnRpdHkoKChTdHJpbmcpIGNvbnRleHQuZ2V0RW50aXR5KCkpICsgIi1pbnRlcmNlcHRvcmZlYXR1cmUtIiArIG5hbWUpOworICAgICAgICAgICAgICAgIGNvbnRleHQucHJvY2VlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmVhdHVyZSgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZS9mZWF0dXJlIikKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eSgid2lsbC1iZS1leHRlbmRlZC1ieSIsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIndpbGwtYmUtZXh0ZW5kZWQtYnktaW50ZXJjZXB0b3JmZWF0dXJlLWhlbGxvIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAV3JpdGVySW50ZXJjZXB0b3JCb3VuZAorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlXcml0ZXJJbnRlcmNlcHRvciBpbXBsZW1lbnRzIFdyaXRlckludGVyY2VwdG9yIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYXJvdW5kV3JpdGVUbyhXcml0ZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBJbmplY3Rpb25NYW5hZ2VyIHNlcnZpY2VMb2NhdG9yID0gSW5qZWN0aW9uTWFuYWdlclByb3ZpZGVyLmdldEluamVjdGlvbk1hbmFnZXIoY29udGV4dCk7CisgICAgICAgICAgICBmaW5hbCBNeUluamVjdGVkU2VydmljZSBzZXJ2aWNlID0gc2VydmljZUxvY2F0b3IuZ2V0SW5zdGFuY2UoTXlJbmplY3RlZFNlcnZpY2UuY2xhc3MpOworICAgICAgICAgICAgY29udGV4dC5zZXRFbnRpdHkoKChTdHJpbmcpIGNvbnRleHQuZ2V0RW50aXR5KCkpICsgIi13cml0ZXItaW50ZXJjZXB0b3ItIiArIHNlcnZpY2UuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgIGNvbnRleHQucHJvY2VlZCgpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXcml0ZXJJbnRlcmNlcHRvcigpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZS93cml0ZXItaW50ZXJjZXB0b3IiKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KCJ3aWxsLWJlLWV4dGVuZGVkLWJ5IiwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygid2lsbC1iZS1leHRlbmRlZC1ieS13cml0ZXItaW50ZXJjZXB0b3ItaGVsbG8iLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworCisgICAgQFJlYWRlckludGVyY2VwdG9yQm91bmQKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15UmVhZGVySW50ZXJjZXB0b3IgaW1wbGVtZW50cyBSZWFkZXJJbnRlcmNlcHRvciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPYmplY3QgYXJvdW5kUmVhZEZyb20oUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgT2JqZWN0IGVudGl0eSA9IGNvbnRleHQucHJvY2VlZCgpOworICAgICAgICAgICAgaWYgKCEoZW50aXR5IGluc3RhbmNlb2YgU3RyaW5nKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBlbnRpdHk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc3RyaW5nRW50aXR5ID0gKFN0cmluZykgZW50aXR5OworICAgICAgICAgICAgZmluYWwgSW5qZWN0aW9uTWFuYWdlciBzZXJ2aWNlTG9jYXRvciA9IEluamVjdGlvbk1hbmFnZXJQcm92aWRlci5nZXRJbmplY3Rpb25NYW5hZ2VyKGNvbnRleHQpOworICAgICAgICAgICAgZmluYWwgTXlJbmplY3RlZFNlcnZpY2Ugc2VydmljZSA9IHNlcnZpY2VMb2NhdG9yLmdldEluc3RhbmNlKE15SW5qZWN0ZWRTZXJ2aWNlLmNsYXNzKTsKKyAgICAgICAgICAgIHJldHVybiBzdHJpbmdFbnRpdHkgKyAiLXJlYWRlci1pbnRlcmNlcHRvci0iICsgc2VydmljZS5nZXROYW1lKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkZXJJbnRlcmNlcHRvckluc3RhbmNlKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlL3JlYWRlci1pbnRlcmNlcHRvciIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoIndpbGwtYmUtZXh0ZW5kZWQtYnkiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ3aWxsLWJlLWV4dGVuZGVkLWJ5LXJlYWRlci1pbnRlcmNlcHRvci1oZWxsbyIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9JbmplY3Rpb25UZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9JbmplY3Rpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE4NDY1MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0luamVjdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworCitpbXBvcnQgamF2YXgud3MucnMuREVMRVRFOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Bc3luY1Jlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5TdXNwZW5kZWQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlcXVlc3Q7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlNlY3VyaXR5Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKKworLyoqCisgKiBJbmplY3Rpb24gRTJFIHRlc3RzLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBJbmplY3Rpb25UZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAUGF0aCgiaW5qZWN0aW9uIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEluamVjdGlvblRlc3RSZXNvdXJjZSB7CisKKyAgICAgICAgQERFTEVURQorICAgICAgICBAUGF0aCgiZGVsZXRlLXBhdGgtcGFyYW0ve2lkfSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZGVsZXRlUGF0aFBhcmFtKFN0cmluZyBib2R5LCBAUGF0aFBhcmFtKCJpZCIpIFN0cmluZyBpZCkgeworICAgICAgICAgICAgcmV0dXJuICJkZWxldGVkOiAiICsgaWQgKyAiLSIgKyBib2R5OworICAgICAgICB9CisKKyAgICAgICAgQERFTEVURQorICAgICAgICBAUGF0aCgiZGVsZXRlLXBhdGgtcGFyYW0tYXN5bmMve2lkfSIpCisgICAgICAgIHB1YmxpYyB2b2lkIGRlbGV0ZVBhdGhQYXJhbShTdHJpbmcgYm9keSwgQFBhdGhQYXJhbSgiaWQiKSBTdHJpbmcgaWQsIEBTdXNwZW5kZWQgQXN5bmNSZXNwb25zZSBhcikgeworICAgICAgICAgICAgYXIucmVzdW1lKCJkZWxldGVkOiAiICsgaWQgKyAiLSIgKyBib2R5KTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImFzeW5jIikKKyAgICAgICAgcHVibGljIHZvaWQgYXN5bmNHZXQoQENvbnRleHQgZmluYWwgVXJpSW5mbyB1cmlJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAQ29udGV4dCBmaW5hbCBSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBDb250ZXh0IGZpbmFsIEh0dHBIZWFkZXJzIGhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBDb250ZXh0IGZpbmFsIFNlY3VyaXR5Q29udGV4dCBzZWN1cml0eUNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBTdXNwZW5kZWQgZmluYWwgQXN5bmNSZXNwb25zZSByZXNwb25zZSkgeworCisgICAgICAgICAgICAvLyBub3cgc3VzcGVuZCBhbmQgcmVzdW1lIGxhdGVyIG9uIHdpdGgKKyAgICAgICAgICAgIEV4ZWN1dG9ycy5uZXdTaW5nbGVUaHJlYWRFeGVjdXRvcigpLnN1Ym1pdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UucmVzdW1lKFN0cmluZy5mb3JtYXQoImJhc2UgdXJpOiAlc1xuaGVhZGVyczogJXNcbm1ldGhvZDogJXNcbnByaW5jaXBhbDogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmlJbmZvLmdldEJhc2VVcmlCdWlsZGVyKCkuYnVpbGQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycy5nZXRSZXF1ZXN0SGVhZGVycygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmdldE1ldGhvZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN1cml0eUNvbnRleHQuZ2V0VXNlclByaW5jaXBhbCgpKSk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5yZXN1bWUoZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoSW5qZWN0aW9uVGVzdFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBKRVJTRVktMTcxMSByZXByb2R1Y2VyLgorICAgICAqCisgICAgICogVGhlIHRlc3QgaXMgaWdub3JlZCBhcyBpdCBjdXJyZW50bHkgZmFpbHMgb24gdGhlIGZvbGxvd2luZzoKKyAgICAgKiAtIEh0dHBVUkxDb25uZWN0aW9uIHRocm93cyBhIGphdmEubmV0LlByb3RvY29sRXhjZXB0aW9uIHdoZW4gdHJ5aW5nIHRvIHNlbmQgcmVxdWVzdCBkYXRhIHdpdGggSFRUUCBERUxFVEUKKyAgICAgKiAtIEdyaXp6bHkgY29udGFpbmVyIGlnbm9yZXMgYW55IERFTEVURSByZXF1ZXN0IGRhdGEgYW5kIGRvZXMgbm90IHBhc3MgdGhlbSB0byBKZXJzZXkKKyAgICAgKgorICAgICAqIFdlIHdvdWxkIG5lZWQgdG8gYnktcGFzcyB0aGVzZSBpc3N1ZXMgaW4gdW5kZXJseWluZyBsYXllciB0byB1bi1pZ25vcmUgdGhlIHRlc3QuCisgICAgICovCisgICAgQFRlc3QKKyAgICBASWdub3JlCisgICAgcHVibGljIHZvaWQgdGVzdEluamVjdGlvbkludG9EZWxldGVNZXRob2QoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCJpbmplY3Rpb24iKS5wYXRoKCJkZWxldGUtcGF0aC1wYXJhbS90ZXN0IikucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLnByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuU1VQUFJFU1NfSFRUUF9DT01QTElBTkNFX1ZBTElEQVRJT04sIHRydWUpCisgICAgICAgICAgICAgICAgLm1ldGhvZCgiREVMRVRFIiwgRW50aXR5LnRleHQoImJvZHkiKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIlJlc3BvbnNlIGlzIG51bGwuIiwgcmVzcG9uc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgcmVzcG9uc2Ugc3RhdHVzLiIsIDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgcmVzcG9uc2UgZW50aXR5LiIsICJkZWxldGVkOiB0ZXN0LWJvZHkiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCJpbmplY3Rpb24iKS5wYXRoKCJkZWxldGUtcGF0aC1wYXJhbS1hc3luYy90ZXN0IikucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLnByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuU1VQUFJFU1NfSFRUUF9DT01QTElBTkNFX1ZBTElEQVRJT04sIHRydWUpCisgICAgICAgICAgICAgICAgLm1ldGhvZCgiREVMRVRFIiwgRW50aXR5LnRleHQoImJvZHkiKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIlJlc3BvbnNlIGlzIG51bGwuIiwgcmVzcG9uc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgcmVzcG9uc2Ugc3RhdHVzLiIsIDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgcmVzcG9uc2UgZW50aXR5LiIsICJkZWxldGVkOiB0ZXN0LWJvZHkiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEpFUlNFWS0xNzYxIHJlcHJvZHVjZXIuCisgICAgICoKKyAgICAgKiBUaGlzIGlzIHRvIG1ha2Ugc3VyZSBubyBwcm94eSBnZXRzIGluamVjdGVkIGludG8gYXN5bmMgbWV0aG9kIHBhcmFtZXRlcnMuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNNZXRob2RQYXJhbUluamVjdGlvbigpIHsKKworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiaW5qZWN0aW9uIikucGF0aCgiYXN5bmMiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCByZXNwb25zZSBzdGF0dXMuIiwgMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIlJlc3BvbnNlIGlzIG51bGwuIiwgcmVzcG9uc2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0lucHV0U3RyZWFtUmVzcG9uc2VUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9JbnB1dFN0cmVhbVJlc3BvbnNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZWY2YjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9JbnB1dFN0cmVhbVJlc3BvbnNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGhpcyBpcyB0byBtYWtlIHN1cmUgeW91IGNhbiBqdXN0IHBhc3MgYW4gaW5wdXQgc3RyZWFtIHRvIEplcnNleSwKKyAqIHdoZXJlIGVudGl0eSBib2R5IGRhdGEgd291bGQgYmUgcmVhZCBmcm9tLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBJbnB1dFN0cmVhbVJlc3BvbnNlVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhJbnB1dFN0cmVhbVJlc291cmNlLmNsYXNzLCBXcmFwcGVkSW5wdXRTdHJlYW1SZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFBhdGgoIi9kaXJlY3RJbnB1dFN0cmVhbSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbnB1dFN0cmVhbVJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKCJKb3NlZmthIi5nZXRCeXRlcygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERpcmVjdElucHV0U3RyZWFtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBzID0gdGFyZ2V0KCkucGF0aCgiZGlyZWN0SW5wdXRTdHJlYW0iKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJKb3NlZmthIiwgcyk7CisgICAgfQorCisgICAgQFBhdGgoIi9yZXNwb25zZVdyYXBwZWRJbnB1dFN0cmVhbSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBXcmFwcGVkSW5wdXRTdHJlYW1SZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgiTWFyaWUiLmdldEJ5dGVzKCkpLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V3JhcHBlZElucHV0U3RyZWFtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzcG9uc2VXcmFwcGVkSW5wdXRTdHJlYW0iKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSwgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk1hcmllIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9JbnRlcmNlcHRvckh0dHBIZWFkZXJzSW5qZWN0aW9uVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvSW50ZXJjZXB0b3JIdHRwSGVhZGVyc0luamVjdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmJlOGZjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvSW50ZXJjZXB0b3JIdHRwSGVhZGVyc0luamVjdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUmVhZGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJlYWRlckludGVyY2VwdG9yQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yQ29udGV4dDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5jb250YWluc1N0cmluZzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIFRlc3QgZm9yIEpFUlNFWS0xNTQ1LgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBJbnRlcmNlcHRvckh0dHBIZWFkZXJzSW5qZWN0aW9uVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBXcml0ZXJIRUFERVIgPSAiY3VzdG9tLXdyaXRlci1oZWFkZXIiOworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgUmVhZGVySEVBREVSID0gImN1c3RvbS1yZWFkZXItaGVhZGVyIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFJhd0NPTlRFTlQgPSAiU0lNUExFIjsKKworICAgIEBQcm92aWRlcgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5qZWN0ZWRXcml0ZXJJbnRlcmNlcHRvciBpbXBsZW1lbnRzIFdyaXRlckludGVyY2VwdG9yIHsKKworICAgICAgICBAQ29udGV4dAorICAgICAgICBIdHRwSGVhZGVycyBoZWFkZXJzOworCisgICAgICAgIC8vIFJlcGxhY2UgY29udGVudCB3aXRoIFdyaXRlckhFQURFUiBoZWFkZXIgdmFsdWUgaWYgY29ycmVzcG9uZGluZyBoZWFkZXIgaXMgc2Vlbi4KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGFyb3VuZFdyaXRlVG8oV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHdyaXRlckhlYWRlclZhbHVlID0gaGVhZGVycy5nZXRIZWFkZXJTdHJpbmcoV3JpdGVySEVBREVSKTsKKworICAgICAgICAgICAgaWYgKHdyaXRlckhlYWRlclZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LmdldE91dHB1dFN0cmVhbSgpLndyaXRlKHdyaXRlckhlYWRlclZhbHVlLmdldEJ5dGVzKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb250ZXh0LnByb2NlZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5qZWN0ZWRSZWFkZXJJbnRlcmNlcHRvciBpbXBsZW1lbnRzIFJlYWRlckludGVyY2VwdG9yIHsKKworICAgICAgICBAQ29udGV4dAorICAgICAgICBIdHRwSGVhZGVycyBoZWFkZXJzOworCisgICAgICAgIC8vIFJlcGxhY2UgY29udGVudCB3aXRoIFJlYWRlckhFQURFUiBoZWFkZXIgdmFsdWUgaWYgY29ycmVzcG9uZGluZyBoZWFkZXIgaXMgc2Vlbi4KKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPYmplY3QgYXJvdW5kUmVhZEZyb20oUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJlYWRlckhlYWRlclZhbHVlID0gaGVhZGVycy5nZXRIZWFkZXJTdHJpbmcoUmVhZGVySEVBREVSKTsKKworICAgICAgICAgICAgaWYgKHJlYWRlckhlYWRlclZhbHVlICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVhZGVySGVhZGVyVmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5wcm9jZWVkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTaW1wbGVSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEl0KCkgeworICAgICAgICAgICAgcmV0dXJuIFJhd0NPTlRFTlQ7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGVjaG8oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIHJldHVybiBtZXNzYWdlOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhTaW1wbGVSZXNvdXJjZS5jbGFzcywgSW5qZWN0ZWRXcml0ZXJJbnRlcmNlcHRvci5jbGFzcywgSW5qZWN0ZWRSZWFkZXJJbnRlcmNlcHRvci5jbGFzcyk7CisgICAgfQorCisgICAgLy8gTm8gaW50ZXJjZXB0b3Igc2hvdWxkIHR3ZWFrIHRoZSBjb250ZW50IGlmIHRoZXJlIGlzIG5vdCBoZWFkZXIgcHJlc2VudC4KKyAgICBwcml2YXRlIHZvaWQgX2NoZWNrUmF3R2V0KCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzdWx0ID0gdGFyZ2V0KCkucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3VsdCwgY29udGFpbnNTdHJpbmcoUmF3Q09OVEVOVCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdyaXRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfY2hlY2tSYXdHZXQoKTsKKyAgICAgICAgX2NoZWNrV3JpdGVySW50ZXJjZXB0b3IoIndyaXRlci1vbmUiKTsKKyAgICAgICAgX2NoZWNrV3JpdGVySW50ZXJjZXB0b3IoIndyaXRlci10d28iKTsKKyAgICB9CisKKyAgICAvLyBzZXQgV3JpdGVySEVBREVSIGhlYWRlciBhbmQgY2hlY2sgdGhlIHNhbWUgdmFsdWUgaXMgcmV0dXJuZWQgYmFjaworICAgIHByaXZhdGUgdm9pZCBfY2hlY2tXcml0ZXJJbnRlcmNlcHRvcihmaW5hbCBTdHJpbmcgaGVhZGVyVmFsdWUpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IHRhcmdldCgpLnJlcXVlc3QoKS5oZWFkZXIoV3JpdGVySEVBREVSLCBoZWFkZXJWYWx1ZSkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRoYXQocmVzdWx0LCBjb250YWluc1N0cmluZyhoZWFkZXJWYWx1ZSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfY2hlY2tSYXdFY2hvKCk7CisgICAgICAgIF9jaGVja1JlYWRlckludGVyY2VwdG9yKCJyZWFkZXItb25lIik7CisgICAgICAgIF9jaGVja1JlYWRlckludGVyY2VwdG9yKCJyZWFkZXItdHdvIik7CisgICAgfQorCisgICAgLy8gTm8gaW50ZXJjZXB0b3Igc2hvdWxkIHR3ZWFrIHRoZSBjb250ZW50IGlmIHRoZXJlIGlzIG5vdCBoZWFkZXIgcHJlc2VudC4KKyAgICBwcml2YXRlIHZvaWQgX2NoZWNrUmF3RWNobygpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJhd1Jlc3VsdCA9IHRhcmdldCgpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS50ZXh0KFJhd0NPTlRFTlQpLCBTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KHJhd1Jlc3VsdCwgY29udGFpbnNTdHJpbmcoUmF3Q09OVEVOVCkpOworICAgIH0KKworICAgIC8vIHNldCBSZWFkZXJIRUFERVIgaGVhZGVyIGFuZCBjaGVjayB0aGUgc2FtZSB2YWx1ZSBpcyByZXR1cm5lZCBiYWNrCisgICAgcHJpdmF0ZSB2b2lkIF9jaGVja1JlYWRlckludGVyY2VwdG9yKFN0cmluZyBoZWFkZXJWYWx1ZSkgeworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzdWx0ID0gdGFyZ2V0KCkucmVxdWVzdCgpLmhlYWRlcihSZWFkZXJIRUFERVIsIGhlYWRlclZhbHVlKS5wb3N0KEVudGl0eS50ZXh0KFJhd0NPTlRFTlQpLCBTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3VsdCwgY29udGFpbnNTdHJpbmcoaGVhZGVyVmFsdWUpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9JbnRlcmNlcHRvck5hbWVBbmREeW5hbWljQmluZGluZ1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL0ludGVyY2VwdG9yTmFtZUFuZER5bmFtaWNCaW5kaW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5OTQyYzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9JbnRlcmNlcHRvck5hbWVBbmREeW5hbWljQmluZGluZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDI5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU2VxdWVuY2VJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLk5hbWVCaW5kaW5nOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5EeW5hbWljRmVhdHVyZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuUmVzb3VyY2VJbmZvOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SZWFkZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0OworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qcmlvcml0eTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEludGVyY2VwdG9yTmFtZUFuZER5bmFtaWNCaW5kaW5nVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFkgPSAiRU5USVRZIjsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIHN1cGVyLmNvbmZpZ3VyZUNsaWVudChjb25maWcpOworICAgIH0KKworICAgIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBQcmVmaXhBZGRpbmdSZWFkZXJJbnRlcmNlcHRvciBpbXBsZW1lbnRzIFJlYWRlckludGVyY2VwdG9yIHsKKworICAgICAgICBwdWJsaWMgUHJlZml4QWRkaW5nUmVhZGVySW50ZXJjZXB0b3IoKSB7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE9iamVjdCBhcm91bmRSZWFkRnJvbShSZWFkZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBjb250ZXh0LnNldElucHV0U3RyZWFtKAorICAgICAgICAgICAgICAgICAgICBuZXcgU2VxdWVuY2VJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oZ2V0UHJlZml4KCkuZ2V0Qnl0ZXMoKSksIGNvbnRleHQuZ2V0SW5wdXRTdHJlYW0oKSkpOworICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQucHJvY2VlZCgpOworICAgICAgICB9CisKKyAgICAgICAgYWJzdHJhY3QgU3RyaW5nIGdldFByZWZpeCgpOworICAgIH0KKworICAgIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBQcmVmaXhBZGRpbmdXcml0ZXJJbnRlcmNlcHRvciBpbXBsZW1lbnRzIFdyaXRlckludGVyY2VwdG9yIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYXJvdW5kV3JpdGVUbyhXcml0ZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBjb250ZXh0LmdldE91dHB1dFN0cmVhbSgpLndyaXRlKGdldFByZWZpeCgpLmdldEJ5dGVzKCkpOworICAgICAgICAgICAgY29udGV4dC5wcm9jZWVkKCk7CisgICAgICAgIH0KKworICAgICAgICBhYnN0cmFjdCBTdHJpbmcgZ2V0UHJlZml4KCk7CisgICAgfQorCisgICAgQE5hbWVCaW5kaW5nCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgICBzdGF0aWMgQGludGVyZmFjZSBOYW1lQm91bmRSZWFkZXIgeworICAgIH0KKworICAgIEBOYW1lQm91bmRSZWFkZXIKKyAgICBAUHJpb3JpdHkoNDApCisgICAgc3RhdGljIGNsYXNzIE5hbWVCb3VuZFJlYWRlckludGVyY2VwdG9yIGV4dGVuZHMgUHJlZml4QWRkaW5nUmVhZGVySW50ZXJjZXB0b3IgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBTdHJpbmcgZ2V0UHJlZml4KCkgeworICAgICAgICAgICAgcmV0dXJuICJuYW1lQm91bmRSZWFkZXIiOworICAgICAgICB9CisgICAgfQorCisgICAgQFByaW9yaXR5KDYwKQorICAgIHN0YXRpYyBjbGFzcyBEeW5hbWljYWxseUJvdW5kUmVhZGVySW50ZXJjZXB0b3IgZXh0ZW5kcyBQcmVmaXhBZGRpbmdSZWFkZXJJbnRlcmNlcHRvciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIFN0cmluZyBnZXRQcmVmaXgoKSB7CisgICAgICAgICAgICByZXR1cm4gImR5bmFtaWNhbGx5Qm91bmRSZWFkZXIiOworICAgICAgICB9CisgICAgfQorCisgICAgQE5hbWVCaW5kaW5nCisgICAgQFByaW9yaXR5KDQwKQorICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCisgICAgc3RhdGljIEBpbnRlcmZhY2UgTmFtZUJvdW5kV3JpdGVyIHsKKyAgICB9CisKKyAgICBATmFtZUJvdW5kV3JpdGVyCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBOYW1lQm91bmRXcml0ZXJJbnRlcmNlcHRvciBleHRlbmRzIFByZWZpeEFkZGluZ1dyaXRlckludGVyY2VwdG9yIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgU3RyaW5nIGdldFByZWZpeCgpIHsKKyAgICAgICAgICAgIHJldHVybiAibmFtZUJvdW5kV3JpdGVyIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcmlvcml0eSgyMCkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIER5bmFtaWNhbGx5Qm91bmRXcml0ZXJJbnRlcmNlcHRvciBleHRlbmRzIFByZWZpeEFkZGluZ1dyaXRlckludGVyY2VwdG9yIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgU3RyaW5nIGdldFByZWZpeCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiZHluYW1pY2FsbHlCb3VuZFdyaXRlciI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgibWV0aG9kIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1ldGhvZEJpbmRpbmdSZXNvdXJjZSB7CisKKyAgICAgICAgQFBhdGgoImR5bmFtaWNhbGx5Qm91bmRXcml0ZXIiKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RHluYW1pY2FsbHlCb3VuZFdyaXRlcigpIHsKKyAgICAgICAgICAgIHJldHVybiBFTlRJVFk7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgibmFtZUJvdW5kV3JpdGVyIikKKyAgICAgICAgQEdFVAorICAgICAgICBATmFtZUJvdW5kV3JpdGVyCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZUJvdW5kV3JpdGVyKCkgeworICAgICAgICAgICAgcmV0dXJuIEVOVElUWTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJkeW5hbWljYWxseUJvdW5kUmVhZGVyIikKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0RHluYW1pY2FsbHlCb3VuZFJlYWRlcihTdHJpbmcgaW5wdXQpIHsKKyAgICAgICAgICAgIHJldHVybiBpbnB1dDsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJuYW1lQm91bmRSZWFkZXIiKQorICAgICAgICBAUE9TVAorICAgICAgICBATmFtZUJvdW5kUmVhZGVyCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdE5hbWVCb3VuZFJlYWRlcihTdHJpbmcgaW5wdXQpIHsKKyAgICAgICAgICAgIHJldHVybiBpbnB1dDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJjbGFzcyIpCisgICAgQE5hbWVCb3VuZFdyaXRlcgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2xhc3NCaW5kaW5nUmVzb3VyY2UgeworCisgICAgICAgIEBQYXRoKCJuYW1lQm91bmRXcml0ZXIiKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZUJvdW5kV3JpdGVyKCkgeworICAgICAgICAgICAgcmV0dXJuIEVOVElUWTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJuYW1lQm91bmRSZWFkZXIiKQorICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3ROYW1lQm91bmRSZWFkZXIoU3RyaW5nIGlucHV0KSB7CisgICAgICAgICAgICByZXR1cm4gaW5wdXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgibWl4ZWQiKQorICAgIEBOYW1lQm91bmRXcml0ZXIKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1peGVkQmluZGluZ1Jlc291cmNlIHsKKworICAgICAgICBAUGF0aCgibmFtZUJvdW5kV3JpdGVyRHluYW1pY1JlYWRlciIpCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdE5hbWVCb3VuZFdyRHluYW1pY2FsbHlCb3VuZFJlYWRlcihTdHJpbmcgaW5wdXQpIHsKKyAgICAgICAgICAgIHJldHVybiBpbnB1dDsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJuYW1lQm91bmRXcml0ZXJEeW5hbWljV3JpdGVyTmFtZUJvdW5kUmVhZGVyIikKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQE5hbWVCb3VuZFJlYWRlcgorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3ROYW1lQm91bmRSZVdyRHluYW1pY2FsbHlCb3VuZFdyaXRlcihTdHJpbmcgaW5wdXQpIHsKKyAgICAgICAgICAgIHJldHVybiBpbnB1dDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIFJlYWRlck1FVEhPRCA9IFBhdHRlcm4uY29tcGlsZSgiLipEeW5hbWljYWxseS4qUmVhZGVyIik7CisgICAgc3RhdGljIGZpbmFsIFBhdHRlcm4gV3JpdGVyTUVUSE9EID0gUGF0dGVybi5jb21waWxlKCIuKkR5bmFtaWNhbGx5LipXcml0ZXIiKTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoTWV0aG9kQmluZGluZ1Jlc291cmNlLmNsYXNzLCBDbGFzc0JpbmRpbmdSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBNaXhlZEJpbmRpbmdSZXNvdXJjZS5jbGFzcywgTmFtZUJvdW5kUmVhZGVySW50ZXJjZXB0b3IuY2xhc3MsIE5hbWVCb3VuZFdyaXRlckludGVyY2VwdG9yLmNsYXNzKS5yZWdpc3Rlckluc3RhbmNlcygKKyAgICAgICAgICAgICAgICBuZXcgRHluYW1pY0ZlYXR1cmUoKSB7CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShmaW5hbCBSZXNvdXJjZUluZm8gcmVzb3VyY2VJbmZvLCBmaW5hbCBGZWF0dXJlQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUmVhZGVyTUVUSE9ELm1hdGNoZXIocmVzb3VyY2VJbmZvLmdldFJlc291cmNlTWV0aG9kKCkuZ2V0TmFtZSgpKS5tYXRjaGVzKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKER5bmFtaWNhbGx5Qm91bmRSZWFkZXJJbnRlcmNlcHRvci5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIG5ldyBEeW5hbWljRmVhdHVyZSgpIHsKKworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY29uZmlndXJlKGZpbmFsIFJlc291cmNlSW5mbyByZXNvdXJjZUluZm8sIGZpbmFsIEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChXcml0ZXJNRVRIT0QubWF0Y2hlcihyZXNvdXJjZUluZm8uZ2V0UmVzb3VyY2VNZXRob2QoKS5nZXROYW1lKCkpLm1hdGNoZXMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoRHluYW1pY2FsbHlCb3VuZFdyaXRlckludGVyY2VwdG9yLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lQm91bmRSZWFkZXJPbk1ldGhvZCgpIHsKKyAgICAgICAgX3Rlc3RSZWFkZXIoIm1ldGhvZCIsICJuYW1lQm91bmRSZWFkZXIiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lQm91bmRXcml0ZXJPbk1ldGhvZCgpIHsKKyAgICAgICAgX3Rlc3RXcml0ZXIoIm1ldGhvZCIsICJuYW1lQm91bmRXcml0ZXIiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lQm91bmRSZWFkZXJPbkNsYXNzKCkgeworICAgICAgICBfdGVzdFJlYWRlcigiY2xhc3MiLCAibmFtZUJvdW5kUmVhZGVyIiwgIm5hbWVCb3VuZFdyaXRlckVOVElUWSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5hbWVCb3VuZFdyaXRlck9uQ2xhc3MoKSB7CisgICAgICAgIF90ZXN0V3JpdGVyKCJjbGFzcyIsICJuYW1lQm91bmRXcml0ZXIiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljYWxseUJvdW5kUmVhZGVyT25NZXRob2QoKSB7CisgICAgICAgIF90ZXN0UmVhZGVyKCJtZXRob2QiLCAiZHluYW1pY2FsbHlCb3VuZFJlYWRlciIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdER5bmFtaWNhbGx5Qm91bmRXcml0ZXJPbk1ldGhvZCgpIHsKKyAgICAgICAgX3Rlc3RXcml0ZXIoIm1ldGhvZCIsICJkeW5hbWljYWxseUJvdW5kV3JpdGVyIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RHluYW1pY1JlYWRlck9uTWV0aG9kTmFtZWRXcml0ZXJPbkNsYXNzKCkgeworICAgICAgICBfdGVzdFJlYWRlcigibWl4ZWQiLCAibmFtZUJvdW5kV3JpdGVyRHluYW1pY1JlYWRlciIsICJuYW1lQm91bmRXcml0ZXJkeW5hbWljYWxseUJvdW5kUmVhZGVyRU5USVRZIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZUJvdW5kV3JpdGVyRHluYW1pY1dyaXRlck5hbWVCb3VuZFJlYWRlcigpIHsKKyAgICAgICAgX3Rlc3RSZWFkZXIoIm1peGVkIiwgIm5hbWVCb3VuZFdyaXRlckR5bmFtaWNXcml0ZXJOYW1lQm91bmRSZWFkZXIiLAorICAgICAgICAgICAgICAgICJkeW5hbWljYWxseUJvdW5kV3JpdGVybmFtZUJvdW5kV3JpdGVybmFtZUJvdW5kUmVhZGVyRU5USVRZIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0UmVhZGVyKFN0cmluZyByb290LCBTdHJpbmcgaWQpIHsKKyAgICAgICAgX3Rlc3RSZWFkZXIocm9vdCwgaWQsIGlkICsgRU5USVRZKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3RSZWFkZXIoU3RyaW5nIHJvb3QsIFN0cmluZyBpZCwgU3RyaW5nIGV4cGVjdGVkKSB7CisgICAgICAgIFJlc3BvbnNlIHIgPSB0YXJnZXQocm9vdCArICIvIiArIGlkKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KEVOVElUWSwgTWVkaWFUeXBlLlRFWFRfUExBSU4pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgci5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfdGVzdFdyaXRlcihTdHJpbmcgcm9vdCwgU3RyaW5nIGlkKSB7CisgICAgICAgIF90ZXN0V3JpdGVyKHJvb3QsIGlkLCBpZCArIEVOVElUWSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0V3JpdGVyKFN0cmluZyByb290LCBTdHJpbmcgaWQsIFN0cmluZyBleHBlY3RlZCkgeworICAgICAgICBSZXNwb25zZSByID0gdGFyZ2V0KHJvb3QgKyAiLyIgKyBpZCkucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCByLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvTWFuYWdlZENsaWVudEV4ZWN1dG9yVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvTWFuYWdlZENsaWVudEV4ZWN1dG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNDMyMjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9NYW5hZ2VkQ2xpZW50RXhlY3V0b3JUZXN0LmphdmEKQEAgLTAsMCArMSwyNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTcsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmEuVGhyZWFkRmFjdG9yeUJ1aWxkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNsaWVudEJpbmRpbmc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Vcmk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLlNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBUZXN0LCB0aGF0IG1hbmFnZWQgY2xpZW50IHVzZXMgdGhlIGN1c3RvbSBleGVjdXRvciBzZXJ2aWNlLgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIE1hbmFnZWRDbGllbnRFeGVjdXRvclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoVGVzdFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IEpBWC1SUyByZXNvdXJjZS4KKyAgICAgKi8KKyAgICBAUGF0aCh2YWx1ZSA9ICIvdGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0UmVzb3VyY2UgeworICAgICAgICAvKioKKyAgICAgICAgICogSW52b2tlIGFuIGFzeW5jaHJvbm91cyByZXF1ZXN0IHVzaW5nIHRoZSBpbmplY3RlZCBtYW5hZ2VkIGNsaWVudC4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoZSBjbGllbnQgaXMgY29uZmlndXJlZCB0byB1c2UgY3VzdG9tIG1lc3NhZ2UgYm9keSByZWFkZXIsIHRoYXQgY2hlY2tzIGl0cyB3b3JrZXIgdGhyZWFkIGFuZCByZXBsYWNlcyB0aGUgb3JpZ2luYWwKKyAgICAgICAgICogcmVzcG9uc2Ugd2l0aCB0aGUgdHJhbnNmZXIgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHRocmVhZCBuYW1lLiBUaGUgbmFtZSBpcyB0aGFuIHVzZWQgdG8gaWRlbnRpZnkgaWYgdGhlIGNvcnJlY3QKKyAgICAgICAgICogKGN1c3RvbSkgZXhlY3V0b3Igc2VydmljZSBpcyB1c2VkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIG5hbWUgb2YgdGhlIHRocmVhZCwgdGhhdCBleGVjdXRlZCB0aGUgYXN5bmNocm9ub3VzIHJlcXVlc3QKKyAgICAgICAgICovCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImV4ZWN1dG9yIikKKyAgICAgICAgcHVibGljIFN0cmluZyBtYW5hZ2VkQ2xpZW50V2l0aEV4ZWN1dG9yKEBDbGllbnRBIEBVcmkoImh0dHA6Ly9sb2NhbGhvc3Q6OTk5OC8iKSBXZWJUYXJnZXQgdGFyZ2V0KQorICAgICAgICAgICAgICAgIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIEZ1dHVyZTxUaHJlYWROYW1lPiBuYW1lRnV0dXJlID0gdGFyZ2V0LnBhdGgoInRlc3QvZHVtbXkiKS5yZXF1ZXN0KCkuYXN5bmMoKS5nZXQoVGhyZWFkTmFtZS5jbGFzcyk7CisgICAgICAgICAgICByZXR1cm4gbmFtZUZ1dHVyZS5nZXQoKS5nZXRUaHJlYWROYW1lKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSW52b2tlIGFuIGFzeW5jaHJvbm91cyByZXF1ZXN0IHVzaW5nIHRoZSBpbmplY3RlZCBtYW5hZ2VkIGNsaWVudC4KKyAgICAgICAgICogPHA+CisgICAgICAgICAqIFRoZSBjbGllbnQgaXMgY29uZmlndXJlZCB0byB1c2UgY3VzdG9tIG1lc3NhZ2UgYm9keSByZWFkZXIsIHRoYXQgdXNlcyBpbmplY3RlZCBzY2hlZHVsZWQgZXhlY3V0b3Igc2VydmljZSBhbmQKKyAgICAgICAgICogc2NoZWR1bGVzIGEgdGFzaywgdGhhdCBjaGVja3MgaXRzIHdvcmtlciB0aHJlYWQgbmFtZSwgdGhlbiBpdCBkb2VzIHRoZSBzYW1lIHdpdGggdGhlIGluamVjdGVkIHNjaGVkdWxlZCBleGVjdXRvcgorICAgICAgICAgKiBzZXJ2aWNlIHByb3ZpZGVyICh0byBjaGVjayB0aGF0IGJvdGggaW5qZWN0aW9uIGFwcHJvYWNoZXMgcHJvZHVjZSBzYW1lIHJlc3VsdCkgYW5kIHJldHVybnMgYm90aCB0aHJlYWQgbmFtZXMgaW4gYQorICAgICAgICAgKiB0cmFuc2ZlciBvYmplY3RzLiBUaGUgbmFtZXMgYXJlIHRoYW4gdXNlZCB0byBpZGVudGlmeSBpZiB0aGUgY29ycmVjdCAoY3VzdG9tKSBzY2hlZHVsZWQgZXhlY3V0b3Igc2VydmljZShzKSBpcyAoYXJlKQorICAgICAgICAgKiB1c2VkLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIG5hbWVzIG9mIHRoZSB0aHJlYWRzLCB0aGF0IGV4ZWN1dGVkIHRoZSBzY2hlZHVsZWQgdGFza3MKKyAgICAgICAgICovCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInNjaGVkdWxlZEV4ZWN1dG9yIikKKyAgICAgICAgcHVibGljIFN0cmluZyBtYW5hZ2VkQ2xpZW50V2l0aFNjaGVkdWxlZEV4ZWN1dG9yKEBDbGllbnRBIEBVcmkoImh0dHA6Ly9sb2NhbGhvc3Q6OTk5OC8iKSBXZWJUYXJnZXQgdGFyZ2V0KQorICAgICAgICAgICAgICAgIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIEZ1dHVyZTxTY2hlZHVsZXJUaHJlYWROYW1lPiBuYW1lc0Z1dHVyZSA9IHRhcmdldC5wYXRoKCJ0ZXN0L2R1bW15IikucmVxdWVzdCgpLmFzeW5jKCkuZ2V0KFNjaGVkdWxlclRocmVhZE5hbWUuY2xhc3MpOworICAgICAgICAgICAgcmV0dXJuIG5hbWVzRnV0dXJlLmdldCgpLmdldFRocmVhZE5hbWVGcm9tU2VydmljZSgpICsgIiAiICsgbmFtZXNGdXR1cmUuZ2V0KCkuZ2V0VGhyZWFkTmFtZUZyb21Qcm92aWRlcigpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIER1bW15IG1ldGhvZCwgdGhhdCBpcyBpbnZva2VkIGJ5IHRoZSBtYW5hZ2VkIGNsaWVudC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBkdW1teSByZXNwb25zZSwgZG9lcyBub3QgcmVhbGx5IG1hdHRlcgorICAgICAgICAgKi8KKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiZHVtbXkiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGR1bW15TWV0aG9kKCkgeworICAgICAgICAgICAgcmV0dXJuICJub3RoaW5nIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE1hbmFnZWQgY2xpZW50IGJpbmRpbmcuCisgICAgICovCisgICAgQENsaWVudEJpbmRpbmcoY29uZmlnQ2xhc3MgPSBNeUNsaWVudEFDb25maWcuY2xhc3MpCisgICAgQERvY3VtZW50ZWQKKyAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorICAgIEBUYXJnZXQoe0VsZW1lbnRUeXBlLkZJRUxELCBFbGVtZW50VHlwZS5QQVJBTUVURVJ9KQorICAgIHB1YmxpYyBAaW50ZXJmYWNlIENsaWVudEEgeworICAgIH0KKworICAgIC8qKgorICAgICAqIE1hbmFnZWQgY2xpZW50IGNvbmZpZy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15Q2xpZW50QUNvbmZpZyBleHRlbmRzIENsaWVudENvbmZpZyB7CisKKyAgICAgICAgcHVibGljIE15Q2xpZW50QUNvbmZpZygpIHsKKyAgICAgICAgICAgIGZpbmFsIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvciA9IEV4ZWN1dG9ycy5uZXdDYWNoZWRUaHJlYWRQb29sKG5ldyBUaHJlYWRGYWN0b3J5QnVpbGRlcigpCisgICAgICAgICAgICAgICAgICAgIC5zZXROYW1lRm9ybWF0KCJmb28tZXhlY3V0b3Itc2VydmljZS0lZCIpCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAgICAgZmluYWwgU2NoZWR1bGVkRXhlY3V0b3JTZXJ2aWNlIHNjaGVkdWxlciA9IEV4ZWN1dG9ycy5uZXdTaW5nbGVUaHJlYWRTY2hlZHVsZWRFeGVjdXRvcihuZXcgVGhyZWFkRmFjdG9yeUJ1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAuc2V0TmFtZUZvcm1hdCgiYmFyLWV4ZWN1dG9yLXNlcnZpY2UiKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgICAgIHRoaXMucmVnaXN0ZXIobmV3IFRocmVhZE5hbWVSZWFkZXIoKSkKKyAgICAgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKFNjaGVkdWxlclRocmVhZE5hbWVSZWFkZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIC5leGVjdXRvclNlcnZpY2UoZXhlY3V0b3IpCisgICAgICAgICAgICAgICAgICAgIC5zY2hlZHVsZWRFeGVjdXRvclNlcnZpY2Uoc2NoZWR1bGVyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRyYW5zZmVyIG9iamVjdCBmb3IgZXhlY3V0b3Igc2VydmljZSBuYW1lLgorICAgICAqLworICAgIHN0YXRpYyBjbGFzcyBUaHJlYWROYW1lIHsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdGhyZWFkTmFtZTsKKworICAgICAgICBUaHJlYWROYW1lKFN0cmluZyB0aHJlYWROYW1lKSB7CisgICAgICAgICAgICB0aGlzLnRocmVhZE5hbWUgPSB0aHJlYWROYW1lOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nIGdldFRocmVhZE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdGhyZWFkTmFtZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRyYW5zZmVyIG9iamVjdCBmb3Igc2NoZWR1bGVkIGV4ZWN1dG9yIHNlcnZpY2UocykgbmFtZShzKSwgYm90aCByZXNvbHZlZCBmcm9tIGRpcmVjdGx5IGluamVjdGVkIHNlcnZpY2UgYW5kIHZpYSBwcm92aWRlci4KKyAgICAgKi8KKyAgICBzdGF0aWMgY2xhc3MgU2NoZWR1bGVyVGhyZWFkTmFtZSB7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIHRocmVhZE5hbWVGcm9tU2VydmljZTsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdGhyZWFkTmFtZUZyb21Qcm92aWRlcjsKKworICAgICAgICBTY2hlZHVsZXJUaHJlYWROYW1lKFN0cmluZyB0aHJlYWROYW1lRnJvbVNlcnZpY2UsIFN0cmluZyB0aHJlYWROYW1lRnJvbVByb3ZpZGVyKSB7CisgICAgICAgICAgICB0aGlzLnRocmVhZE5hbWVGcm9tU2VydmljZSA9IHRocmVhZE5hbWVGcm9tU2VydmljZTsKKyAgICAgICAgICAgIHRoaXMudGhyZWFkTmFtZUZyb21Qcm92aWRlciA9IHRocmVhZE5hbWVGcm9tUHJvdmlkZXI7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgZ2V0VGhyZWFkTmFtZUZyb21TZXJ2aWNlKCkgeworICAgICAgICAgICAgcmV0dXJuIHRocmVhZE5hbWVGcm9tU2VydmljZTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBnZXRUaHJlYWROYW1lRnJvbVByb3ZpZGVyKCkgeworICAgICAgICAgICAgcmV0dXJuIHRocmVhZE5hbWVGcm9tUHJvdmlkZXI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDdXN0b20gcmVhZGVyLCB0aGF0IGNoZWNrcyBpdHMgb3duIHRocmVhZCdzIG5hbWUgYW5kIHJldHVybnMgaXQgYXMgYW4gZW50aXR5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGhyZWFkTmFtZVJlYWRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5UmVhZGVyPFRocmVhZE5hbWU+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBUaHJlYWROYW1lIHJlYWRGcm9tKENsYXNzPFRocmVhZE5hbWU+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGh0dHBIZWFkZXJzLCBJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pCisgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFRocmVhZE5hbWUoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3VzdG9tIHJlYWRlciwgdGhhdCBzY2hlZHVsZXMgb25lIHRhc2sgb24gZWFjaCBpbmplY3RlZCBzY2hlZHVsZXIgKGRpcmVjdGx5IGFuZCB2aWEgcHJvdmlkZXIpIGFuZCByZXR1cm5zIHRoZSBuYW1lcyBvZgorICAgICAqIHRoZSB0aHJlYWRzIHRoYXQgZXhlY3V0ZWQgdGhvc2UgdGFza3MgYXMgYW4gZW50aXR5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2NoZWR1bGVyVGhyZWFkTmFtZVJlYWRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5UmVhZGVyPFNjaGVkdWxlclRocmVhZE5hbWU+IHsKKworICAgICAgICBASW5qZWN0CisgICAgICAgIFNjaGVkdWxlZEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyIGluamVjdGVkUHJvdmlkZXI7CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBTY2hlZHVsZWRFeGVjdXRvclNlcnZpY2UgaW5qZWN0ZWRTZXJ2aWNlOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFNjaGVkdWxlclRocmVhZE5hbWUgcmVhZEZyb20oQ2xhc3M8U2NoZWR1bGVyVGhyZWFkTmFtZT4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIEF0b21pY1JlZmVyZW5jZTxTdHJpbmc+IG5hbWVGcm9tU2VydmljZSA9IG5ldyBBdG9taWNSZWZlcmVuY2U8PigpOworICAgICAgICAgICAgQXRvbWljUmVmZXJlbmNlPFN0cmluZz4gbmFtZUZyb21Qcm92aWRlciA9IG5ldyBBdG9taWNSZWZlcmVuY2U8PigpOworICAgICAgICAgICAgQ291bnREb3duTGF0Y2ggY2RsID0gbmV3IENvdW50RG93bkxhdGNoKDIpOworCisgICAgICAgICAgICBpbmplY3RlZFNlcnZpY2Uuc2NoZWR1bGUoKCkgLT4geworICAgICAgICAgICAgICAgIG5hbWVGcm9tU2VydmljZS5zZXQoVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIGNkbC5jb3VudERvd24oKTsKKyAgICAgICAgICAgIH0sIDEsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisKKyAgICAgICAgICAgIGluamVjdGVkUHJvdmlkZXIuZ2V0RXhlY3V0b3JTZXJ2aWNlKCkuc2NoZWR1bGUoKCkgLT4geworICAgICAgICAgICAgICAgIG5hbWVGcm9tUHJvdmlkZXIuc2V0KFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBjZGwuY291bnREb3duKCk7CisgICAgICAgICAgICB9LCAxLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNkbC5hd2FpdCgyMDAsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgbmFtZUZyb21TZXJ2aWNlLnNldCgiZmFpbGVkIik7CisgICAgICAgICAgICAgICAgbmFtZUZyb21Qcm92aWRlci5zZXQoImZhaWxlZCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbmV3IFNjaGVkdWxlclRocmVhZE5hbWUobmFtZUZyb21TZXJ2aWNlLmdldCgpLCBuYW1lRnJvbVByb3ZpZGVyLmdldCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hbmFnZWRDbGllbnRFeGVjdXRvcigpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgidGVzdC9leGVjdXRvciIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiZm9vLWV4ZWN1dG9yLXNlcnZpY2UtMCIsIHJlc3BvbnNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYW5hZ2VkQ2xpZW50U2NoZWR1bGVkRXhlY3V0b3IoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInRlc3Qvc2NoZWR1bGVkRXhlY3V0b3IiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImJhci1leGVjdXRvci1zZXJ2aWNlIGJhci1leGVjdXRvci1zZXJ2aWNlIiwgcmVzcG9uc2UpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVzcG9uc2UpOworICAgIH0KK30KKworCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL01lc3NhZ2VCb2R5UHJvdmlkZXJzRXhjZXB0aW9uc1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL01lc3NhZ2VCb2R5UHJvdmlkZXJzRXhjZXB0aW9uc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDM2MTUxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvTWVzc2FnZUJvZHlQcm92aWRlcnNFeGNlcHRpb25zVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5FeGNlcHRpb25NYXBwZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBKRVJTRVktMjUwMCByZXByb2R1Y2VyIHRlc3QuCisgKgorICogVGVzdHMsIHRoYXQgY29ycmVjdCBleGNlcHRpb25zIGFyZSB0aHJvd24gaW4gY2FzZSBubyBNZXNzYWdlQm9keVByb3ZpZGVyIHdhcyBtYXRjaGVkIG9uIHNlcnZlci4KKyAqCisgKiAtIEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24gZm9yIE1CVyAoSlNSMzM5LCBjaGFwdGVyIDQuMi4yLCBzdGVwIDcpCisgKiAtIE5vdFN1cHBvcnRlZEV4Y2VwdGlvbiBmb3IgTUJSIChKU1IzMzksIGNoYXB0ZXIgNC4yLjEsIHN0ZXAgNikKKyAqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBNZXNzYWdlQm9keVByb3ZpZGVyc0V4Y2VwdGlvbnNUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihNZXNzYWdlQm9keVByb3ZpZGVyc0V4Y2VwdGlvbnNUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKAorICAgICAgICAgICAgICAgIFJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIFdlYkFwcEV4Y2VwdGlvbk1hcHBlci5jbGFzcworICAgICAgICApOworICAgIH0KKworICAgIEBQYXRoKCJyZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgid3JpdGUiKQorICAgICAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgICAgIHB1YmxpYyBSZXNvdXJjZSBmYWlsT25Xcml0ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB0aGlzOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoInJlYWQiKQorICAgICAgICBAQ29uc3VtZXMoImZvby9iYXIiKQorICAgICAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZmFpbE9uUmVhZCgpIHsKKyAgICAgICAgICAgIHJldHVybiAidGhpcy1zaG91bGQtbmV2ZXItYmUtcmV0dXJuZWQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBXZWJBcHBFeGNlcHRpb25NYXBwZXIgaW1wbGVtZW50cyBFeGNlcHRpb25NYXBwZXI8V2ViQXBwbGljYXRpb25FeGNlcHRpb24+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHRvUmVzcG9uc2UoV2ViQXBwbGljYXRpb25FeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICBMT0dHRVIuZmluZSgiRXhjZXB0aW9uTWFwcGVyIHdhcyBpbnZva2VkLiIpOworICAgICAgICAgICAgLy8gcmV0dXJuIHRoZSBleGNlcHRpb24gY2xhc3MgbmFtZSBhcyBhbiBlbnRpdHkgZm9yIGZ1cnRoZXIgY29tcGFyaXNvbgorICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cygyMDApLmhlYWRlcigid3JpdGVyLWV4Y2VwdGlvbiIsICJhZnRlci1maXJzdC1ieXRlIikuZW50aXR5KGV4Y2VwdGlvbi5nZXRDbGFzcygpLmdldE5hbWUoKSkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkZXJUaHJvd3NDb3JyZWN0RXhjZXB0aW9uKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlL3dyaXRlIikucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9QTEFJTikuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgU3RyaW5nIHJlc1N0cmluZyA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgLy8gbm8gTUJXIHNob3VsZCBoYXZlIGJlZW4gZm91bmQsIEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24gZXhwZWN0ZWQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZheC53cy5ycy5JbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uIiwgcmVzU3RyaW5nKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXcml0ZXJUaHJvd3NDb3JyZWN0RXhjZXB0aW9uKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlL3JlYWQiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KCJIZWxsbywgd29ybGQiLCAidGV4dC9wbGFpbiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBTdHJpbmcgcmVzU3RyaW5nID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICAvLyBubyBNQlIgc2hvdWxkIGhhdmUgYmVlbiBmb3VuZCwgTm90U3VwcG9ydGVkRXhjZXB0aW9uIGV4cGVjdGVkCisgICAgICAgIGFzc2VydEVxdWFscygiamF2YXgud3MucnMuTm90U3VwcG9ydGVkRXhjZXB0aW9uIiwgcmVzU3RyaW5nKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9NZXRhaW5mU2VydmljZXNMb29rdXBEaXNhYmxlZFRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL01ldGFpbmZTZXJ2aWNlc0xvb2t1cERpc2FibGVkVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YzUxNGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9NZXRhaW5mU2VydmljZXNMb29rdXBEaXNhYmxlZFRlc3QuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogUHJvcGVydHkge0BsaW5rIFNlcnZlclByb3BlcnRpZXMjTUVUQUlORl9TRVJWSUNFU19MT09LVVBfRElTQUJMRX0gSVMgc2V0LgorICoKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBNZXRhaW5mU2VydmljZXNMb29rdXBEaXNhYmxlZFRlc3QgZXh0ZW5kcyBBYnN0cmFjdERpc2FibGVNZXRhaW5mU2VydmljZXNMb29rdXBUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0R2V0KDUwMCwgNDE1KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IChSZXNvdXJjZUNvbmZpZykgc3VwZXIuY29uZmlndXJlKCk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuTUVUQUlORl9TRVJWSUNFU19MT09LVVBfRElTQUJMRSwgdHJ1ZSk7CisKKyAgICAgICAgcmV0dXJuIHJlc291cmNlQ29uZmlnOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvTWV0YWluZlNlcnZpY2VzTG9va3VwRW5hYmxlZFRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL01ldGFpbmZTZXJ2aWNlc0xvb2t1cEVuYWJsZWRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU1OGYxMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL01ldGFpbmZTZXJ2aWNlc0xvb2t1cEVuYWJsZWRUZXN0LmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogUHJvcGVydHkge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzI01FVEFJTkZfU0VSVklDRVNfTE9PS1VQX0RJU0FCTEV9IGlzIE5PVCBzZXQuCisgKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIE1ldGFpbmZTZXJ2aWNlc0xvb2t1cEVuYWJsZWRUZXN0IGV4dGVuZHMgQWJzdHJhY3REaXNhYmxlTWV0YWluZlNlcnZpY2VzTG9va3VwVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdEdldCgyMDAsIDIwMCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9Nb2RlbFByb2Nlc3NvclRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL01vZGVsUHJvY2Vzc29yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYzFjOGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9Nb2RlbFByb2Nlc3NvclRlc3QuamF2YQpAQCAtMCwwICsxLDM0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuT1BUSU9OUzsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmVDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLkluZmxlY3RvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuRXh0ZW5kZWRSZXNvdXJjZUNvbnRleHQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5Nb2RlbFByb2Nlc3NvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTWV0aG9kOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1vZGVsOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnV0aWwucnVubmVyLkNvbmN1cnJlbnRSdW5uZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3QgbW9kZWwgcHJvY2Vzc29yLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqCisgKi8KK0BSdW5XaXRoKENvbmN1cnJlbnRSdW5uZXIuY2xhc3MpCitwdWJsaWMgY2xhc3MgTW9kZWxQcm9jZXNzb3JUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1vZGVsUHJvY2Vzc29yRmVhdHVyZSBpbXBsZW1lbnRzIEZlYXR1cmUgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmUoRmVhdHVyZUNvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihTaW1wbGVNb2RlbFByb2Nlc3Nvci5jbGFzcyk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFNpbXBsZU1vZGVsUHJvY2Vzc29yIGltcGxlbWVudHMgTW9kZWxQcm9jZXNzb3IgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBSZXNvdXJjZU1vZGVsIHByb2Nlc3NSZXNvdXJjZU1vZGVsKFJlc291cmNlTW9kZWwgcmVzb3VyY2VNb2RlbCwgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7CisgICAgICAgICAgICAgICAgUmVzb3VyY2VNb2RlbC5CdWlsZGVyIG1vZGVsQnVpbGRlciA9IG5ldyBSZXNvdXJjZU1vZGVsLkJ1aWxkZXIoZmFsc2UpOworICAgICAgICAgICAgICAgIGZpbmFsIFJlc291cmNlIG1vZGVsUmVzb3VyY2UgPSBSZXNvdXJjZS5mcm9tKE1vZGVsUmVzb3VyY2UuY2xhc3MpOworICAgICAgICAgICAgICAgIG1vZGVsQnVpbGRlci5hZGRSZXNvdXJjZShtb2RlbFJlc291cmNlKTsKKworICAgICAgICAgICAgICAgIGZvciAoZmluYWwgUmVzb3VyY2UgcmVzb3VyY2UgOiByZXNvdXJjZU1vZGVsLmdldFJvb3RSZXNvdXJjZXMoKSkgeworICAgICAgICAgICAgICAgICAgICBSZXNvdXJjZSBuZXdSZXNvdXJjZSA9IGVuaGFuY2VSZXNvdXJjZShyZXNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgIG1vZGVsQnVpbGRlci5hZGRSZXNvdXJjZShuZXdSZXNvdXJjZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIG1vZGVsQnVpbGRlci5idWlsZCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIFJlc291cmNlIGVuaGFuY2VSZXNvdXJjZShmaW5hbCBSZXNvdXJjZSByZXNvdXJjZSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFJlc291cmNlLkJ1aWxkZXIgcmVzQnVpbGRlciA9IFJlc291cmNlLmJ1aWxkZXIocmVzb3VyY2UpOworICAgICAgICAgICAgICAgIGJvb2xlYW4gb3B0aW9uc0ZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICAgICAgZm9yIChSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCA6IHJlc291cmNlLmdldFJlc291cmNlTWV0aG9kcygpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXNvdXJjZU1ldGhvZC5nZXRIdHRwTWV0aG9kKCkuZXF1YWxzKCJPUFRJT05TIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zRm91bmQpIHsKKworICAgICAgICAgICAgICAgICAgICByZXNCdWlsZGVyLmFkZE1ldGhvZCgiT1BUSU9OUyIpLnByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmhhbmRsZWRCeShuZXcgSW5mbGVjdG9yPENvbnRhaW5lclJlcXVlc3RDb250ZXh0LCBTdHJpbmc+KCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBhcHBseShDb250YWluZXJSZXF1ZXN0Q29udGV4dCBjb250YWluZXJSZXF1ZXN0Q29udGV4dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlLmdldFBhdGgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZpbmFsIEluZmxlY3RvcjxDb250YWluZXJSZXF1ZXN0Q29udGV4dCwgT2JqZWN0PiBpbmZsZWN0b3IgPSBuZXcgSW5mbGVjdG9yPENvbnRhaW5lclJlcXVlc3RDb250ZXh0LCBPYmplY3Q+KCkgeworCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGFwcGx5KENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgibXktcmVzb3VyY2U6Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGF0aCA9IHJlc291cmNlLmdldFBhdGgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChwYXRoID09IG51bGwgPyAiPG5vLXBhdGg+IiA6IHBhdGggKyAiLCIpOworCisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kIDogc29ydFJlc291cmNlTWV0aG9kcyhyZXNvdXJjZS5nZXRSZXNvdXJjZU1ldGhvZHMoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQocmVzb3VyY2VNZXRob2QuZ2V0SHR0cE1ldGhvZCgpKS5hcHBlbmQoIj0iKS5hcHBlbmQoIiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKHJlc291cmNlTWV0aG9kLmdldEludm9jYWJsZSgpLmdldEhhbmRsaW5nTWV0aG9kKCkuZ2V0TmFtZSgpKS5hcHBlbmQoInwiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIHJlc0J1aWxkZXIuYWRkQ2hpbGRSZXNvdXJjZSgibXktcmVzb3VyY2UiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFkZE1ldGhvZCgiR0VUIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5wcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKQorICAgICAgICAgICAgICAgICAgICAgICAgLmhhbmRsZWRCeShpbmZsZWN0b3IpLmJ1aWxkKCk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzQnVpbGRlci5idWlsZCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBSZXNvdXJjZU1vZGVsIHByb2Nlc3NTdWJSZXNvdXJjZShSZXNvdXJjZU1vZGVsIHN1YlJlc291cmNlLCBDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZSByZXNvdXJjZSA9IGVuaGFuY2VSZXNvdXJjZShzdWJSZXNvdXJjZS5nZXRSZXNvdXJjZXMoKS5nZXQoMCkpOworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VNb2RlbC5CdWlsZGVyKHRydWUpLmFkZFJlc291cmNlKHJlc291cmNlKS5idWlsZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoIm1vZGVsIikKKyAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNb2RlbFJlc291cmNlIHsKKworICAgICAgICAgICAgQENvbnRleHQKKyAgICAgICAgICAgIEV4dGVuZGVkUmVzb3VyY2VDb250ZXh0IHJlc291cmNlQ29udGV4dDsKKworICAgICAgICAgICAgQEdFVAorICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VNb2RlbCByZXNvdXJjZU1vZGVsID0gcmVzb3VyY2VDb250ZXh0LmdldFJlc291cmNlTW9kZWwoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgICAgICBMaXN0PFJlc291cmNlPiBzb3J0ZWRSZXNvdXJjZXMgPSByZXNvdXJjZU1vZGVsLmdldFJvb3RSZXNvdXJjZXMoKTsKKyAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHNvcnRlZFJlc291cmNlcywgbmV3IENvbXBhcmF0b3I8UmVzb3VyY2U+KCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIGludCBjb21wYXJlKFJlc291cmNlIG8xLCBSZXNvdXJjZSBvMikgeworICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBhdGgxID0gbzEuZ2V0UGF0aCgpID09IG51bGwgPyAiIiA6IG8xLmdldFBhdGgoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwYXRoMiA9IG8yLmdldFBhdGgoKSA9PSBudWxsID8gIiIgOiBvMi5nZXRQYXRoKCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGF0aDEuY29tcGFyZVRvKHBhdGgyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIGZvciAoUmVzb3VyY2UgcmVzb3VyY2UgOiBzb3J0ZWRSZXNvdXJjZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBhdGggPSByZXNvdXJjZS5nZXRQYXRoKCk7CisgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChwYXRoID09IG51bGwgPyAiPG5vLXBhdGg+IiA6IHBhdGgpLmFwcGVuZCgifCIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxSZXNvdXJjZU1ldGhvZD4gc29ydFJlc291cmNlTWV0aG9kcyhMaXN0PFJlc291cmNlTWV0aG9kPiByZXNvdXJjZU1ldGhvZHMpIHsKKyAgICAgICAgTGlzdDxSZXNvdXJjZU1ldGhvZD4gbmV3TGlzdCA9IG5ldyBBcnJheUxpc3Q8PihyZXNvdXJjZU1ldGhvZHMpOworICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KG5ld0xpc3QsIChvMSwgbzIpIC0+IG8xLmdldEh0dHBNZXRob2QoKS5jb21wYXJlVG8obzIuZ2V0SHR0cE1ldGhvZCgpKSk7CisgICAgICAgIHJldHVybiBuZXdMaXN0OworICAgIH0KKworICAgIEBQYXRoKCJhIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlQSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEZyb21BKCkgeworICAgICAgICAgICAgcmV0dXJuICJhLWdldCI7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3RGcm9tQShTdHJpbmcgZW50aXR5KSB7CisgICAgICAgICAgICByZXR1cm4gImEtcG9zdCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJjaGlsZCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hpbGQoKSB7CisgICAgICAgICAgICByZXR1cm4gImEtY2hpbGQtZ2V0IjsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJsb2NhdG9yIikKKyAgICAgICAgcHVibGljIFN1YlJlc291cmNlIGxvY2F0b3JGcm9tQSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3ViUmVzb3VyY2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3ViUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRGcm9tU3ViUmVzb3VyY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gInN1Yi1nZXQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoImIiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VCIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RnJvbUIoKSB7CisgICAgICAgICAgICByZXR1cm4gImItZ2V0IjsKKyAgICAgICAgfQorCisgICAgICAgIEBPUFRJT05TCisgICAgICAgIHB1YmxpYyBTdHJpbmcgb3B0aW9uc0Zyb21CKCkgeworICAgICAgICAgICAgcmV0dXJuICJiLW9wdGlvbnMiOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImxvY2F0b3IiKQorICAgICAgICBwdWJsaWMgU3ViUmVzb3VyY2UgbG9jYXRvckZyb21CKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdWJSZXNvdXJjZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2VBLmNsYXNzLCBSZXNvdXJjZUIuY2xhc3MsIE1vZGVsUHJvY2Vzc29yRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuV0FETF9GRUFUVVJFX0RJU0FCTEUsIHRydWUpOworICAgICAgICByZXR1cm4gcmVzb3VyY2VDb25maWc7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VBR2V0KCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiL2EiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGVudGl0eSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhLWdldCIsIGVudGl0eSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VBUG9zdCgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoIi9hIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eSgicG9zdCIsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBmaW5hbCBTdHJpbmcgZW50aXR5ID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEtcG9zdCIsIGVudGl0eSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VBT3B0aW9ucygpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoIi9hIikucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKS5vcHRpb25zKCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGVudGl0eSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhIiwgZW50aXR5KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUFDaGlsZEdldCgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoIi9hL2NoaWxkIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBlbnRpdHkgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiYS1jaGlsZC1nZXQiLCBlbnRpdHkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlQUxvY2F0b3JHZXQoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCIvYS9sb2NhdG9yIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBlbnRpdHkgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygic3ViLWdldCIsIGVudGl0eSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VBTG9jYXRvck9wdGlvbnMoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCIvYS9sb2NhdG9yIikucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKS5vcHRpb25zKCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDQsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGVudGl0eSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBlbnRpdHkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlQkdldCgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoIi9iIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBlbnRpdHkgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiYi1nZXQiLCBlbnRpdHkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlQk9wdGlvbnMoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCIvYiIpLnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkub3B0aW9ucygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBlbnRpdHkgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiYi1vcHRpb25zIiwgZW50aXR5KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUJMb2NhdG9yR2V0KCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiL2IvbG9jYXRvciIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBmaW5hbCBTdHJpbmcgZW50aXR5ID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoInN1Yi1nZXQiLCBlbnRpdHkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlQkxvY2F0b3JPcHRpb25zKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiL2IvbG9jYXRvciIpLnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkub3B0aW9ucygpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjA0LCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBlbnRpdHkgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiIiwgZW50aXR5KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUFNeVJlc291cmNlKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiL2EvbXktcmVzb3VyY2UiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGVudGl0eSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJteS1yZXNvdXJjZTphLEdFVD1nZXRGcm9tQXxQT1NUPXBvc3RGcm9tQXwiLCBlbnRpdHkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlQUxvY2F0b3JNeVJlc291cmNlKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiL2EvbG9jYXRvci9teS1yZXNvdXJjZSIpLnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGVudGl0eSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJteS1yZXNvdXJjZTo8bm8tcGF0aD5HRVQ9Z2V0RnJvbVN1YlJlc291cmNlfCIsIGVudGl0eSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VCTXlSZXNvdXJjZSgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoIi9iL215LXJlc291cmNlIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBlbnRpdHkgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygibXktcmVzb3VyY2U6YixHRVQ9Z2V0RnJvbUJ8T1BUSU9OUz1vcHRpb25zRnJvbUJ8IiwgZW50aXR5KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbmZvKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiL21vZGVsIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBlbnRpdHkgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiYXxifG1vZGVsfCIsIGVudGl0eSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9OYW1lQmluZGluZ1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL05hbWVCaW5kaW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYTc0MGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9OYW1lQmluZGluZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDMwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgamF2YXgud3MucnMuRGVmYXVsdFZhbHVlOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5IZWFkZXJQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5OYW1lQmluZGluZzsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuUHJlTWF0Y2hpbmc7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnV0aWwucnVubmVyLkNvbmN1cnJlbnRSdW5uZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5jb3JlLklzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogVGVzdC1zdWl0ZSBlbnN1cmluZyB0aGUgY29ycmVjdCBmdW5jdGlvbmFsaXR5IG9mIG5hbWUgYmluZGluZy4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFJ1bldpdGgoQ29uY3VycmVudFJ1bm5lci5jbGFzcykKK3B1YmxpYyBjbGFzcyBOYW1lQmluZGluZ1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MsIEZvb1Jlc291cmNlLmNsYXNzLCBCYXJSZXNvdXJjZS5jbGFzcywgRm9vQmFyUmVzb3VyY2UuY2xhc3MsIEZvb0ZpbHRlci5jbGFzcywKKyAgICAgICAgICAgICAgICBCYXJGaWx0ZXIuY2xhc3MsIEZvb0JhckZpbHRlci5jbGFzcywgUHJlTWF0Y2hpbmdGb29GaWx0ZXIuY2xhc3MpOworICAgIH0KKworICAgIEBQYXRoKCJyZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIG5vQmluZGluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAibm9CaW5kaW5nIjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQEZvb0JpbmRpbmcKKyAgICAgICAgQFBhdGgoImZvbyIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZm9vKCkgeworICAgICAgICAgICAgcmV0dXJuICJmb28iOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAQmFyQmluZGluZworICAgICAgICBAUGF0aCgiYmFyIikKKyAgICAgICAgcHVibGljIFN0cmluZyBiYXIoKSB7CisgICAgICAgICAgICByZXR1cm4gImJhciI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBGb29CaW5kaW5nCisgICAgICAgIEBCYXJCaW5kaW5nCisgICAgICAgIEBQYXRoKCJmb29iYXIiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGZvb2JhcigpIHsKKyAgICAgICAgICAgIHJldHVybiAiZm9vYmFyIjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInByZU1hdGNoaW5nTmFtZUJpbmRpbmciKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHByZU1hdGNoaW5nTmFtZUJpbmRpbmcoQEhlYWRlclBhcmFtKCJoZWFkZXIiKSBARGVmYXVsdFZhbHVlKCJiYXIiKSBmaW5hbCBTdHJpbmcgaGVhZGVyKSB7CisgICAgICAgICAgICByZXR1cm4gaGVhZGVyOworICAgICAgICB9CisgICAgfQorCisgICAgQE5hbWVCaW5kaW5nCisgICAgQFRhcmdldCh7RWxlbWVudFR5cGUuVFlQRSwgRWxlbWVudFR5cGUuTUVUSE9EfSkKKyAgICBAUmV0ZW50aW9uKHZhbHVlID0gUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCisgICAgcHVibGljIHN0YXRpYyBAaW50ZXJmYWNlIEZvb0JpbmRpbmcgeworCisgICAgfQorCisgICAgQE5hbWVCaW5kaW5nCisgICAgQFRhcmdldCh7RWxlbWVudFR5cGUuVFlQRSwgRWxlbWVudFR5cGUuTUVUSE9EfSkKKyAgICBAUmV0ZW50aW9uKHZhbHVlID0gUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCisgICAgcHVibGljIHN0YXRpYyBAaW50ZXJmYWNlIEJhckJpbmRpbmcgeworCisgICAgfQorCisgICAgQEZvb0JpbmRpbmcKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZvb0ZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKGZpbmFsIENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LCBmaW5hbCBDb250YWluZXJSZXNwb25zZUNvbnRleHQgcmVzcG9uc2VDb250ZXh0KSB0aHJvd3MKKyAgICAgICAgICAgICAgICBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuZ2V0SGVhZGVycygpLmFkZCh0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpLCAiY2FsbGVkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJlTWF0Y2hpbmcKKyAgICBARm9vQmluZGluZworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHJlTWF0Y2hpbmdGb29GaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKGZpbmFsIENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuZ2V0SGVhZGVycygpLnB1dFNpbmdsZSgiaGVhZGVyIiwgImZvbyIpOworICAgICAgICB9CisgICAgfQorCisgICAgQEJhckJpbmRpbmcKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJhckZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKGZpbmFsIENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LCBmaW5hbCBDb250YWluZXJSZXNwb25zZUNvbnRleHQgcmVzcG9uc2VDb250ZXh0KSB0aHJvd3MKKyAgICAgICAgICAgICAgICBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuZ2V0SGVhZGVycygpLmFkZCh0aGlzLmdldENsYXNzKCkuZ2V0U2ltcGxlTmFtZSgpLCAiY2FsbGVkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBARm9vQmluZGluZworICAgIEBCYXJCaW5kaW5nCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGb29CYXJGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXNwb25zZUZpbHRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihmaW5hbCBDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCwgZmluYWwgQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCkgdGhyb3dzCisgICAgICAgICAgICAgICAgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LmdldEhlYWRlcnMoKS5hZGQodGhpcy5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKSwgImNhbGxlZCIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PENsYXNzPD8+PiBGSUxURVJTID0gaW5pdGlhbGl6ZSgpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgU2V0PENsYXNzPD8+PiBpbml0aWFsaXplKCkgeworICAgICAgICBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IHNldCA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgc2V0LmFkZChGb29GaWx0ZXIuY2xhc3MpOworICAgICAgICBzZXQuYWRkKEJhckZpbHRlci5jbGFzcyk7CisgICAgICAgIHNldC5hZGQoRm9vQmFyRmlsdGVyLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIHNldDsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tDYWxsZWQoZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UsIGZpbmFsIENsYXNzPD8+Li4uIGZpbHRlcnNUaGF0U2hvdWxkQmVDYWxsZWQpIHsKKyAgICAgICAgZmluYWwgU2V0PENsYXNzPD8+PiBwb3NpdGl2ZUZpbHRlcnMgPSBBcnJheXMuc3RyZWFtKGZpbHRlcnNUaGF0U2hvdWxkQmVDYWxsZWQpLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKTsKKyAgICAgICAgZm9yIChmaW5hbCBDbGFzczw/PiBmaWx0ZXIgOiBGSUxURVJTKSB7CisgICAgICAgICAgICBpZiAocG9zaXRpdmVGaWx0ZXJzLmNvbnRhaW5zKGZpbHRlcikpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkZpbHRlciAnIiArIGZpbHRlci5nZXRTaW1wbGVOYW1lKCkgKyAiJyBzaG91bGQgYmUgY2FsbGVkLiIsICJjYWxsZWQiLCByZXNwb25zZS5nZXRIZWFkZXJzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaXJzdChmaWx0ZXIuZ2V0U2ltcGxlTmFtZSgpKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFzc2VydE51bGwoIkZpbHRlciAnIiArIGZpbHRlci5nZXRTaW1wbGVOYW1lKCkgKyAiJyBzaG91bGQgbm90IGJlIGNhbGxlZC4iLCByZXNwb25zZS5nZXRIZWFkZXJzKCkuZ2V0KGZpbHRlcgorICAgICAgICAgICAgICAgICAgICAgICAgLmdldFNpbXBsZU5hbWUoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBSZXNwb25zZSBfZ2V0UmVzcG9uc2UoZmluYWwgU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKHBhdGgpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICByZXR1cm4gcmVzcG9uc2U7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VOb0JpbmRpbmcoKSB7CisgICAgICAgIGNoZWNrQ2FsbGVkKF9nZXRSZXNwb25zZSgicmVzb3VyY2UiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VGb29CaW5kaW5nKCkgeworICAgICAgICBjaGVja0NhbGxlZChfZ2V0UmVzcG9uc2UoInJlc291cmNlL2ZvbyIpLCBGb29GaWx0ZXIuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJvZHVjZXIgZm9yIEpFUlNFWS0yNzM5LiBOYW1lIGJvdW5kIGFubm90YXRpb24gb24gYSBwcmUtbWF0Y2hpbmcgZmlsdGVyIHNob3VsZCBiZSBpZ25vcmVkIGFuZCB0aGUgZmlsdGVyIHNob3VsZCBiZQorICAgICAqIGludm9rZWQgZm9yIGVhY2ggcmVzb3VyY2UgbWV0aG9kIChnbG9iYWxseSkuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwcmVNYXRjaGluZ05hbWVCaW5kaW5nKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IF9nZXRSZXNwb25zZSgicmVzb3VyY2UvcHJlTWF0Y2hpbmdOYW1lQmluZGluZyIpOworCisgICAgICAgIC8vIFJlcXVlc3QgZmlsdGVyIC0gYXBwbGllZCwgZXZlbiB3aGVuIHRoZSBmaWx0ZXIgaXMgbmFtZSBib3VuZCBhbmQgdGhlIHJlc291cmNlIG1ldGhvZCBpcyBub3QuCisgICAgICAgIGFzc2VydFRoYXQoIk5hbWUgYmluZGluZyBvbiBhIEBQcmVNYXRjaGluZyBmaWx0ZXIgbm90IGlnbm9yZWQuIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBpcygiZm9vIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlQmFyQmluZGluZygpIHsKKyAgICAgICAgY2hlY2tDYWxsZWQoX2dldFJlc3BvbnNlKCJyZXNvdXJjZS9iYXIiKSwgQmFyRmlsdGVyLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUZvb0JhckJpbmRpbmcoKSB7CisgICAgICAgIGNoZWNrQ2FsbGVkKF9nZXRSZXNwb25zZSgicmVzb3VyY2UvZm9vYmFyIiksIEZvb0ZpbHRlci5jbGFzcywgQmFyRmlsdGVyLmNsYXNzLCBGb29CYXJGaWx0ZXIuY2xhc3MpOworICAgIH0KKworICAgIEBQYXRoKCJmb28tcmVzb3VyY2UiKQorICAgIEBGb29CaW5kaW5nCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGb29SZXNvdXJjZSBleHRlbmRzIFJlc291cmNlIHsKKworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZvb1Jlc291cmNlTm9CaW5kaW5nKCkgeworICAgICAgICBjaGVja0NhbGxlZChfZ2V0UmVzcG9uc2UoImZvby1yZXNvdXJjZSIpLCBGb29GaWx0ZXIuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZvb1Jlc291cmNlRm9vQmluZGluZygpIHsKKyAgICAgICAgY2hlY2tDYWxsZWQoX2dldFJlc3BvbnNlKCJmb28tcmVzb3VyY2UvZm9vIiksIEZvb0ZpbHRlci5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9vUmVzb3VyY2VCYXJCaW5kaW5nKCkgeworICAgICAgICBjaGVja0NhbGxlZChfZ2V0UmVzcG9uc2UoImZvby1yZXNvdXJjZS9iYXIiKSwgRm9vRmlsdGVyLmNsYXNzLCBCYXJGaWx0ZXIuY2xhc3MsIEZvb0JhckZpbHRlci5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9vUmVzb3VyY2VGb29CYXJCaW5kaW5nKCkgeworICAgICAgICBjaGVja0NhbGxlZChfZ2V0UmVzcG9uc2UoImZvby1yZXNvdXJjZS9mb29iYXIiKSwgRm9vRmlsdGVyLmNsYXNzLCBCYXJGaWx0ZXIuY2xhc3MsIEZvb0JhckZpbHRlci5jbGFzcyk7CisgICAgfQorCisgICAgQFBhdGgoImJhci1yZXNvdXJjZSIpCisgICAgQEJhckJpbmRpbmcKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJhclJlc291cmNlIGV4dGVuZHMgUmVzb3VyY2UgeworCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFyUmVzb3VyY2VOb0JpbmRpbmcoKSB7CisgICAgICAgIGNoZWNrQ2FsbGVkKF9nZXRSZXNwb25zZSgiYmFyLXJlc291cmNlIiksIEJhckZpbHRlci5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFyUmVzb3VyY2VGb29CaW5kaW5nKCkgeworICAgICAgICBjaGVja0NhbGxlZChfZ2V0UmVzcG9uc2UoImJhci1yZXNvdXJjZS9mb28iKSwgQmFyRmlsdGVyLmNsYXNzLCBGb29GaWx0ZXIuY2xhc3MsIEZvb0JhckZpbHRlci5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFyUmVzb3VyY2VCYXJCaW5kaW5nKCkgeworICAgICAgICBjaGVja0NhbGxlZChfZ2V0UmVzcG9uc2UoImJhci1yZXNvdXJjZS9iYXIiKSwgQmFyRmlsdGVyLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCYXJSZXNvdXJjZUZvb0JhckJpbmRpbmcoKSB7CisgICAgICAgIGNoZWNrQ2FsbGVkKF9nZXRSZXNwb25zZSgiYmFyLXJlc291cmNlL2Zvb2JhciIpLCBCYXJGaWx0ZXIuY2xhc3MsIEZvb0ZpbHRlci5jbGFzcywgRm9vQmFyRmlsdGVyLmNsYXNzKTsKKyAgICB9CisKKyAgICBAUGF0aCgiZm9vYmFyLXJlc291cmNlIikKKyAgICBAQmFyQmluZGluZworICAgIEBGb29CaW5kaW5nCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGb29CYXJSZXNvdXJjZSBleHRlbmRzIFJlc291cmNlIHsKKworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZvb0JhclJlc291cmNlTm9CaW5kaW5nKCkgeworICAgICAgICBjaGVja0NhbGxlZChfZ2V0UmVzcG9uc2UoImZvb2Jhci1yZXNvdXJjZSIpLCBCYXJGaWx0ZXIuY2xhc3MsIEZvb0ZpbHRlci5jbGFzcywgRm9vQmFyRmlsdGVyLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGb29CYXJSZXNvdXJjZUZvb0JpbmRpbmcoKSB7CisgICAgICAgIGNoZWNrQ2FsbGVkKF9nZXRSZXNwb25zZSgiZm9vYmFyLXJlc291cmNlL2ZvbyIpLCBCYXJGaWx0ZXIuY2xhc3MsIEZvb0ZpbHRlci5jbGFzcywgRm9vQmFyRmlsdGVyLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGb29CYXJSZXNvdXJjZUJhckJpbmRpbmcoKSB7CisgICAgICAgIGNoZWNrQ2FsbGVkKF9nZXRSZXNwb25zZSgiZm9vYmFyLXJlc291cmNlL2JhciIpLCBCYXJGaWx0ZXIuY2xhc3MsIEZvb0ZpbHRlci5jbGFzcywgRm9vQmFyRmlsdGVyLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGb29CYXJSZXNvdXJjZUZvb0JhckJpbmRpbmcoKSB7CisgICAgICAgIGNoZWNrQ2FsbGVkKF9nZXRSZXNwb25zZSgiZm9vYmFyLXJlc291cmNlL2Zvb2JhciIpLCBCYXJGaWx0ZXIuY2xhc3MsIEZvb0ZpbHRlci5jbGFzcywgRm9vQmFyRmlsdGVyLmNsYXNzKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL1BhcmFtQ29udmVydGVyUHJpb3JpdHlUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9QYXJhbUNvbnZlcnRlclByaW9yaXR5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMDU1MDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9QYXJhbUNvbnZlcnRlclByaW9yaXR5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5QYXJhbUNvbnZlcnRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUGFyYW1Db252ZXJ0ZXJQcm92aWRlcjsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJpb3JpdHk7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5ncmVhdGVyVGhhbk9yRXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLnR5cGVDb21wYXRpYmxlV2l0aDsKKworLyoqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgUGFyYW1Db252ZXJ0ZXJQcmlvcml0eVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3Q8Q2xhc3M8PyBleHRlbmRzIFBhcmFtQ29udmVydGVyUHJvdmlkZXI+PiBDT05WRVJURVJfUFJPVklERVJfQ0FMTF9PUkRFUiA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhQYXJhbUNvbnZlcnRlclByaW9yaXR5UmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXlQYXJhbUNvbnZlcnRlclByb3ZpZGVyMS5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNeVBhcmFtQ29udmVydGVyUHJvdmlkZXIyLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE15UGFyYW1Db252ZXJ0ZXJQcm92aWRlcjMuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdCgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5xdWVyeVBhcmFtKCJ0ZXN0IiwgInZhbHVlIikucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydFRoYXQoQ09OVkVSVEVSX1BST1ZJREVSX0NBTExfT1JERVIuc2l6ZSgpLCBncmVhdGVyVGhhbk9yRXF1YWxUbygzKSk7CisgICAgICAgIGFzc2VydFRoYXQoQ09OVkVSVEVSX1BST1ZJREVSX0NBTExfT1JERVIuZ2V0KDApLCB0eXBlQ29tcGF0aWJsZVdpdGgoTXlQYXJhbUNvbnZlcnRlclByb3ZpZGVyMi5jbGFzcykpOworICAgICAgICBhc3NlcnRUaGF0KENPTlZFUlRFUl9QUk9WSURFUl9DQUxMX09SREVSLmdldCgxKSwgdHlwZUNvbXBhdGlibGVXaXRoKE15UGFyYW1Db252ZXJ0ZXJQcm92aWRlcjEuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChDT05WRVJURVJfUFJPVklERVJfQ0FMTF9PUkRFUi5nZXQoMiksIHR5cGVDb21wYXRpYmxlV2l0aChNeVBhcmFtQ29udmVydGVyUHJvdmlkZXIzLmNsYXNzKSk7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGFyYW1Db252ZXJ0ZXJQcmlvcml0eVJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KEBRdWVyeVBhcmFtKCJ0ZXN0IikgU3RyaW5nIHBhcmFtKSB7CisgICAgICAgICAgICByZXR1cm4gcGFyYW07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJpb3JpdHkoMjAwKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlQYXJhbUNvbnZlcnRlclByb3ZpZGVyMSBpbXBsZW1lbnRzIFBhcmFtQ29udmVydGVyUHJvdmlkZXIgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIDxUPiBQYXJhbUNvbnZlcnRlcjxUPiBnZXRDb252ZXJ0ZXIoQ2xhc3M8VD4gcmF3VHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zKSB7CisgICAgICAgICAgICBDT05WRVJURVJfUFJPVklERVJfQ0FMTF9PUkRFUi5hZGQodGhpcy5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgQFByaW9yaXR5KDEwMCkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15UGFyYW1Db252ZXJ0ZXJQcm92aWRlcjIgaW1wbGVtZW50cyBQYXJhbUNvbnZlcnRlclByb3ZpZGVyIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyA8VD4gUGFyYW1Db252ZXJ0ZXI8VD4gZ2V0Q29udmVydGVyKENsYXNzPFQ+IHJhd1R5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucykgeworICAgICAgICAgICAgQ09OVkVSVEVSX1BST1ZJREVSX0NBTExfT1JERVIuYWRkKHRoaXMuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcmlvcml0eSgzMDApCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVBhcmFtQ29udmVydGVyUHJvdmlkZXIzIGltcGxlbWVudHMgUGFyYW1Db252ZXJ0ZXJQcm92aWRlciB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgPFQ+IFBhcmFtQ29udmVydGVyPFQ+IGdldENvbnZlcnRlcihDbGFzczxUPiByYXdUeXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgICAgIENPTlZFUlRFUl9QUk9WSURFUl9DQUxMX09SREVSLmFkZCh0aGlzLmdldENsYXNzKCkpOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9QYXJhbUNvbnZlcnRlclRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL1BhcmFtQ29udmVydGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlZjZiYzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9QYXJhbUNvbnZlcnRlclRlc3QuamF2YQpAQCAtMCwwICsxLDM3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLlNvcnRlZFNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvb2tpZVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLkRlZmF1bHRWYWx1ZTsKK2ltcG9ydCBqYXZheC53cy5ycy5Gb3JtUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLkhlYWRlclBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLk1hdHJpeFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Gb3JtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlBhcmFtQ29udmVydGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5QYXJhbUNvbnZlcnRlclByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5jb250YWluc1N0cmluZzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBUZXN0cyB7QGxpbmsgUGFyYW1Db252ZXJ0ZXIgcGFyYW0gY29udmVydGVyc30gYXMgZTJlIHRlc3QuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgY2xhc3MgUGFyYW1Db252ZXJ0ZXJUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzLCBNeVBhcmFtUHJvdmlkZXIuY2xhc3MsIE15U3RyaW5nUGFyYW1Qcm92aWRlci5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXlCZWFuUGFyYW0oKSB7CisgICAgICAgIEZvcm0gZm9ybSA9IG5ldyBGb3JtKCk7CisgICAgICAgIGZvcm0ucGFyYW0oImZvcm0iLCAiZm9ybVBhcmFtIik7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkKKyAgICAgICAgICAgICAgICAucGF0aCgicmVzb3VyY2UvbXlCZWFuIikucGF0aCgicGF0aFBhcmFtIikKKyAgICAgICAgICAgICAgICAubWF0cml4UGFyYW0oIm1hdHJpeCIsICJtYXRyaXhQYXJhbSIpCisgICAgICAgICAgICAgICAgLnF1ZXJ5UGFyYW0oInF1ZXJ5IiwgInF1ZXJ5UGFyYW0iKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAuaGVhZGVyKCJoZWFkZXIiLCAiaGVhZGVyUGFyYW0iKQorICAgICAgICAgICAgICAgIC5jb29raWUoImNvb2tpZSIsICJjb29raWVQYXJhbSIpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eShmb3JtLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fRk9STV9VUkxFTkNPREVEX1RZUEUpKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgc3RyID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIipwYXRoUGFyYW0qXyptYXRyaXhQYXJhbSpfKnF1ZXJ5UGFyYW0qXypoZWFkZXJQYXJhbSpfKmNvb2tpZVBhcmFtKl8qZm9ybVBhcmFtKiIsIHN0cik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGlzdE9mTXlCZWFuUGFyYW0oKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UvbXlCZWFuL2xpc3QiKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJxIiwgIkEiKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJxIiwgIkIiKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJxIiwgIkMiKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBzdHIgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiKkEqKkIqKkMqIiwgc3RyKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRPZk15QmVhblBhcmFtKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlL215QmVhbi9zZXQiKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJxIiwgIkEiKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJxIiwgIkIiKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJxIiwgIkMiKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBzdHIgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRoYXQoc3RyLCBjb250YWluc1N0cmluZygiKkEqIikpOworICAgICAgICBhc3NlcnRUaGF0KHN0ciwgY29udGFpbnNTdHJpbmcoIipCKiIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzdHIsIGNvbnRhaW5zU3RyaW5nKCIqQyoiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U29ydGVkU2V0T2ZNeUJlYW5QYXJhbSgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZS9teUJlYW4vc29ydGVkc2V0IikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgicSIsICJBIikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgicSIsICJCIikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgicSIsICJDIikKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpLmdldCgpOworICAgICAgICBmaW5hbCBTdHJpbmcgc3RyID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIipBKipCKipDKiIsIHN0cik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nUGFyYW0oKSB7CisgICAgICAgIEZvcm0gZm9ybSA9IG5ldyBGb3JtKCk7CisgICAgICAgIGZvcm0ucGFyYW0oImZvcm0iLCAiZm9ybVBhcmFtIik7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkKKyAgICAgICAgICAgICAgICAucGF0aCgicmVzb3VyY2Uvc3RyaW5nIikucGF0aCgicGF0aFBhcmFtIikKKyAgICAgICAgICAgICAgICAubWF0cml4UGFyYW0oIm1hdHJpeCIsICJtYXRyaXhQYXJhbSIpCisgICAgICAgICAgICAgICAgLnF1ZXJ5UGFyYW0oInF1ZXJ5IiwgInF1ZXJ5UGFyYW0iKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAuaGVhZGVyKCJoZWFkZXIiLCAiaGVhZGVyUGFyYW0iKQorICAgICAgICAgICAgICAgIC5jb29raWUoImNvb2tpZSIsICJjb29raWVQYXJhbSIpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eShmb3JtLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fRk9STV9VUkxFTkNPREVEX1RZUEUpKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgc3RyID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi1wYXRoUGFyYW0tXy1tYXRyaXhQYXJhbS1fLXF1ZXJ5UGFyYW0tXy1oZWFkZXJQYXJhbS1fLWNvb2tpZVBhcmFtLV8tZm9ybVBhcmFtLSIsIHN0cik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBASWdub3JlKCJUT0RPOiBQYXJhbUNvbnZlcnNpb24gbm90IHlldCBpbXBsZW1lbnRlZCBpbiB0aGUgUmVzcG9uc2VCdWlsZGVyIChKRVJTRVktMTM4NSkuIikKKyAgICAvLyBUT0RPOiBKRVJTRVktMTM4NTogYWZ0ZXIgY2xhcmlmeWluZyB3aXRoIHNwZWMgdGhlIFJlc3BvbnNlQnVpbGRlciBwYXJhbWNvbnZlcnNpb24gc2hvdWxkIGJlIGZpbmlzaGVkIChvciByZW1vdmVkKQorICAgIHB1YmxpYyB2b2lkIHRlc3RTdHJpbmdQYXJhbUluUmVzcG9uc2UoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UvcmVzcG9uc2UiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiLTpyZXMtaGVhZDotIiwgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJyZXNwb25zZS1oZWFkZXIiKSk7CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNeUJlYW5Gb3JtUGFyYW1EZWZhdWx0KCkgeworICAgICAgICBGb3JtIGZvcm0gPSBuZXcgRm9ybSgpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlL215QmVhbkZvcm1EZWZhdWx0IikKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShmb3JtLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fRk9STV9VUkxFTkNPREVEX1RZUEUpKTsKKyAgICAgICAgU3RyaW5nIHN0ciA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqZm9ybS1kZWZhdWx0KiIsIHN0cik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXlCZWFuUXVlcnlQYXJhbURlZmF1bHQoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UvbXlCZWFuUXVlcnlEZWZhdWx0IikKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpLmdldCgpOworICAgICAgICBmaW5hbCBTdHJpbmcgc3RyID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIipxdWVyeS1kZWZhdWx0KiIsIHN0cik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXlCZWFuTWF0cml4UGFyYW1EZWZhdWx0KCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlL215QmVhbk1hdHJpeERlZmF1bHQiKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBzdHIgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiKm1hdHJpeC1kZWZhdWx0KiIsIHN0cik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXlCZWFuQ29va2llUGFyYW1EZWZhdWx0KCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlL215QmVhbkNvb2tpZURlZmF1bHQiKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBzdHIgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiKmNvb2tpZS1kZWZhdWx0KiIsIHN0cik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXlCZWFuSGVhZGVyUGFyYW1EZWZhdWx0KCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlL215QmVhbkhlYWRlckRlZmF1bHQiKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBzdHIgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiKmhlYWRlci1kZWZhdWx0KiIsIHN0cik7CisgICAgfQorCisgICAgQFBhdGgoInJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgibXlCZWFuL3twYXRofSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdE15QmVhbihAUGF0aFBhcmFtKCJwYXRoIikgTXlCZWFuIHBhdGhQYXJhbSwgQE1hdHJpeFBhcmFtKCJtYXRyaXgiKSBNeUJlYW4gbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQFF1ZXJ5UGFyYW0oInF1ZXJ5IikgTXlCZWFuIHF1ZXJ5LCBASGVhZGVyUGFyYW0oImhlYWRlciIpIE15QmVhbiBoZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAQ29va2llUGFyYW0oImNvb2tpZSIpIE15QmVhbiBjb29raWUsIEBGb3JtUGFyYW0oImZvcm0iKSBNeUJlYW4gZm9ybSkgeworICAgICAgICAgICAgcmV0dXJuIHBhdGhQYXJhbS5nZXRWYWx1ZSgpICsgIl8iICsgbWF0cml4LmdldFZhbHVlKCkgKyAiXyIgKyBxdWVyeS5nZXRWYWx1ZSgpICsgIl8iICsgaGVhZGVyLmdldFZhbHVlKCkgKyAiXyIKKyAgICAgICAgICAgICAgICAgICAgKyBjb29raWUuZ2V0VmFsdWUoKSArICJfIiArIGZvcm0uZ2V0VmFsdWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIm15QmVhbi9saXN0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0TXlCZWFuKEBRdWVyeVBhcmFtKCJxIikgTGlzdDxNeUJlYW4+IHF1ZXJ5KSB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgICAgIGZvciAoTXlCZWFuIGJlYW4gOiBxdWVyeSkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChiZWFuLmdldFZhbHVlKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIm15QmVhbi9zZXQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3RNeUJlYW4oQFF1ZXJ5UGFyYW0oInEiKSBTZXQ8TXlCZWFuPiBxdWVyeSkgeworICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBmb3IgKE15QmVhbiBiZWFuIDogcXVlcnkpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoYmVhbi5nZXRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJteUJlYW4vc29ydGVkc2V0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0TXlCZWFuKEBRdWVyeVBhcmFtKCJxIikgU29ydGVkU2V0PE15QmVhbj4gcXVlcnkpIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgZm9yIChNeUJlYW4gYmVhbiA6IHF1ZXJ5KSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGJlYW4uZ2V0VmFsdWUoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoIm15QmVhbkZvcm1EZWZhdWx0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0TXlCZWFuRm9ybURlZmF1bHQoQERlZmF1bHRWYWx1ZSgiZm9ybS1kZWZhdWx0IikgQEZvcm1QYXJhbSgiZm9ybSIpIE15QmVhbiBwYXRoUGFyYW0pIHsKKyAgICAgICAgICAgIHJldHVybiBwYXRoUGFyYW0uZ2V0VmFsdWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIm15QmVhblF1ZXJ5RGVmYXVsdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TXlCZWFuUXVlcnlEZWZhdWx0KEBEZWZhdWx0VmFsdWUoInF1ZXJ5LWRlZmF1bHQiKSBAUXVlcnlQYXJhbSgicSIpIE15QmVhbiBxdWVyeVBhcmFtKSB7CisgICAgICAgICAgICByZXR1cm4gcXVlcnlQYXJhbS5nZXRWYWx1ZSgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgibXlCZWFuTWF0cml4RGVmYXVsdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TXlCZWFuTWF0cml4RGVmYXVsdChARGVmYXVsdFZhbHVlKCJtYXRyaXgtZGVmYXVsdCIpIEBNYXRyaXhQYXJhbSgibSIpIE15QmVhbiBtYXRyaXhQYXJhbSkgeworICAgICAgICAgICAgcmV0dXJuIG1hdHJpeFBhcmFtLmdldFZhbHVlKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJteUJlYW5Db29raWVEZWZhdWx0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRNeUJlYW5Db29raWVEZWZhdWx0KEBEZWZhdWx0VmFsdWUoImNvb2tpZS1kZWZhdWx0IikgQENvb2tpZVBhcmFtKCJjIikgTXlCZWFuIGNvb2tpZVBhcmFtKSB7CisgICAgICAgICAgICByZXR1cm4gY29va2llUGFyYW0uZ2V0VmFsdWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIm15QmVhbkhlYWRlckRlZmF1bHQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE15QmVhbkhlYWRlckRlZmF1bHQoQERlZmF1bHRWYWx1ZSgiaGVhZGVyLWRlZmF1bHQiKSBASGVhZGVyUGFyYW0oImgiKSBNeUJlYW4gaGVhZGVyUGFyYW0pIHsKKyAgICAgICAgICAgIHJldHVybiBoZWFkZXJQYXJhbS5nZXRWYWx1ZSgpOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoInN0cmluZy97cGF0aH0iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3RTdHJpbmcoQFBhdGhQYXJhbSgicGF0aCIpIFN0cmluZyBwYXRoUGFyYW0sIEBNYXRyaXhQYXJhbSgibWF0cml4IikgU3RyaW5nIG1hdHJpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBRdWVyeVBhcmFtKCJxdWVyeSIpIFN0cmluZyBxdWVyeSwgQEhlYWRlclBhcmFtKCJoZWFkZXIiKSBTdHJpbmcgaGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQENvb2tpZVBhcmFtKCJjb29raWUiKSBTdHJpbmcgY29va2llLCBARm9ybVBhcmFtKCJmb3JtIikgU3RyaW5nIGZvcm0pIHsKKyAgICAgICAgICAgIHJldHVybiBwYXRoUGFyYW0gKyAiXyIgKyBtYXRyaXggKyAiXyIgKyBxdWVyeSArICJfIiArIGhlYWRlciArICJfIgorICAgICAgICAgICAgICAgICAgICArIGNvb2tpZSArICJfIiArIGZvcm07CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJxIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoQFF1ZXJ5UGFyYW0oInF1ZXJ5IikgU3RyaW5nIHF1ZXJ5KSB7CisgICAgICAgICAgICByZXR1cm4gcXVlcnk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJyZXNwb25zZSIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXRSZXNwb25zZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygpLmhlYWRlcigicmVzcG9uc2UtaGVhZGVyIiwgInJlcy1oZWFkIikuZW50aXR5KCJhbnl0aGluZyIpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15UGFyYW1Qcm92aWRlciBpbXBsZW1lbnRzIFBhcmFtQ29udmVydGVyUHJvdmlkZXIgeworCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIDxUPiBQYXJhbUNvbnZlcnRlcjxUPiBnZXRDb252ZXJ0ZXIoQ2xhc3M8VD4gcmF3VHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zKSB7CisgICAgICAgICAgICBpZiAocmF3VHlwZSAhPSBNeUJlYW4uY2xhc3MpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIChQYXJhbUNvbnZlcnRlcjxUPikgbmV3IFBhcmFtQ29udmVydGVyPE15QmVhbj4oKSB7CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgTXlCZWFuIGZyb21TdHJpbmcoU3RyaW5nIHZhbHVlKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgTXlCZWFuIG15QmVhbiA9IG5ldyBNeUJlYW4oKTsKKyAgICAgICAgICAgICAgICAgICAgbXlCZWFuLnNldFZhbHVlKCIqIiArIHZhbHVlICsgIioiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG15QmVhbjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKE15QmVhbiBiZWFuKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIqOiIgKyBiZWFuLmdldFZhbHVlKCkgKyAiOioiOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlTdHJpbmdQYXJhbVByb3ZpZGVyIGltcGxlbWVudHMgUGFyYW1Db252ZXJ0ZXJQcm92aWRlciB7CisKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgPFQ+IFBhcmFtQ29udmVydGVyPFQ+IGdldENvbnZlcnRlcihDbGFzczxUPiByYXdUeXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgICAgIGlmIChyYXdUeXBlICE9IFN0cmluZy5jbGFzcykgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gKFBhcmFtQ29udmVydGVyPFQ+KSBuZXcgUGFyYW1Db252ZXJ0ZXI8U3RyaW5nPigpIHsKKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZnJvbVN0cmluZyhTdHJpbmcgdmFsdWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICByZXR1cm4gIi0iICsgdmFsdWUgKyAiLSI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZyhTdHJpbmcgc3RyKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICItOiIgKyBzdHIgKyAiOi0iOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlCZWFuIGltcGxlbWVudHMgQ29tcGFyYWJsZTxNeUJlYW4+IHsKKworICAgICAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiTXlCZWFueyIKKyAgICAgICAgICAgICAgICAgICAgKyAidmFsdWU9JyIgKyB2YWx1ZSArICdcJycKKyAgICAgICAgICAgICAgICAgICAgKyAnfSc7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgICAgICBpZiAodGhpcyA9PSBvKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgTXlCZWFuKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTXlCZWFuIG15QmVhbiA9IChNeUJlYW4pIG87CisKKyAgICAgICAgICAgIHJldHVybiAhKHZhbHVlICE9IG51bGwgPyAhdmFsdWUuZXF1YWxzKG15QmVhbi52YWx1ZSkgOiBteUJlYW4udmFsdWUgIT0gbnVsbCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsID8gdmFsdWUuaGFzaENvZGUoKSA6IDA7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBjb21wYXJlVG8oTXlCZWFuIG8pIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZS5jb21wYXJlVG8oby52YWx1ZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9QYXRoRW5jb2RpbmdUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9QYXRoRW5jb2RpbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlhYmNjMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL1BhdGhFbmNvZGluZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0aW5nIGVuY29kaW5nIG9mIHtAUGF0aCBwYXRoIGFubm90YXRpb25zfS4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBQYXRoRW5jb2RpbmdUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhQZXJjZW50RW5jb2RlZFRlc3QuY2xhc3MsIEFzdGVyaXNrUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdDEoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygib2siLCB0YXJnZXQoKS5wYXRoKCJ0ZXN0IikucGF0aCgiW10iKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdDIoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygib2siLCB0YXJnZXQoKS5wYXRoKCJ0ZXN0IikucGF0aCgiJTViJTVkIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3QzKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIm9rIiwgdGFyZ2V0KCkucGF0aCgidGVzdCIpLnBhdGgoIiU1YiU1RCIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGxleDEoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiYS1vayIsIHRhcmdldCgpLnBhdGgoInRlc3QiKS5wYXRoKCJ0ZXN0L2EvW10iKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbXBsZXgyKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoImEtb2siLCB0YXJnZXQoKS5wYXRoKCJ0ZXN0IikucGF0aCgidGVzdC9hLyU1YiU1RCIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGxleDMoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlcyA9IHRhcmdldCgpLnBhdGgoInRlc3QiKS5wYXRoKCJ0ZXN0L2EvcGF0aC8lNWIlNWQiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlcy5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYS1vayIsIHJlcy5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vdEZvdW5kKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXMgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0IikucGF0aCgidGVzdC9hL3BhdGgvJTVhYiIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwNCwgcmVzLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb21wbGV4NCgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhLW9rIiwgdGFyZ2V0KCkucGF0aCgidGVzdCIpLnBhdGgoInRlc3QvYS9wYXRoL1tdIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTbGFzaCgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJvayIsIHRhcmdldCgpLnBhdGgoInRlc3Qvc2xhc2gvIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaXRob3V0U2xhc2goKSB7CisgICAgICAgIGFzc2VydEVxdWFscygib2siLCB0YXJnZXQoKS5wYXRoKCJ0ZXN0L3NsYXNoIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBc3Rlcmlza0luUGF0aCgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCIqIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygib2siLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBQYXRoKCIqIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFzdGVyaXNrUmVzb3VyY2UgeworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJvayI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgidGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQZXJjZW50RW5jb2RlZFRlc3QgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIltdIikKKyAgICAgICAgcHVibGljIFN0cmluZyBzaW1wbGUoKSB7CisgICAgICAgICAgICByZXR1cm4gIm9rIjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInNsYXNoLyIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgc2xhc2goQENvbnRleHQgVXJpSW5mbyB1cmkpIHsKKyAgICAgICAgICAgIHJldHVybiAib2siOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgidGVzdC97YSA6IC4qIH0vW10iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGNvbXBsZXgoQFBhdGhQYXJhbSgiYSIpIFN0cmluZyBhKSB7CisgICAgICAgICAgICByZXR1cm4gYSArICItb2siOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgidGVzdC97YSA6IC4qIH0vcGF0aC8lNWIlNUQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGNvbXBsZXgyKEBQYXRoUGFyYW0oImEiKSBTdHJpbmcgYSkgeworICAgICAgICAgICAgcmV0dXJuIGEgKyAiLW9rIjsKKyAgICAgICAgfQorCisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9QZXJSZXF1ZXN0TGlmZWN5Y2xlVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvUGVyUmVxdWVzdExpZmVjeWNsZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTIzNDA0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvUGVyUmVxdWVzdExpZmVjeWNsZVRlc3QuamF2YQpAQCAtMCwwICsxLDI3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlJlc291cmNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0OworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJlRGVzdHJveTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworCisvKioKKyAqIEBhdXRob3IgTWFyYyBIYWRsZXkKKyAqLworcHVibGljIGNsYXNzIFBlclJlcXVlc3RMaWZlY3ljbGVUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICAvKioKKyAgICAgKiBFbnVtIHJlcHJlc2VudGluZyB0aGUgYWN0dWFsIHN0YXRlIG9mIHRoZSByZXNvdXJjZSBpbiB0aGUgbGlmZWN5Y2xlLgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGVudW0gUmVzb3VyY2VTdGF0ZSB7CisgICAgICAgIE5FVywKKyAgICAgICAgQ09OU1RSVUNURUQsCisgICAgICAgIERFU1RST1lFRAorICAgIH0KKworICAgIEBQYXRoKCIvcG9zdC1jb25zdHJ1Y3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUG9zdENvbnN0cnVjdFJlc291cmNlIHsKKyAgICAgICAgcHJpdmF0ZSBpbnQgY291bnQ7CisKKyAgICAgICAgQENvbnRleHQKKyAgICAgICAgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uOworCisgICAgICAgIHB1YmxpYyBQb3N0Q29uc3RydWN0UmVzb3VyY2UoKSB7CisgICAgICAgICAgICB0aGlzLmNvdW50ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIEBQb3N0Q29uc3RydWN0CisgICAgICAgIHB1YmxpYyB2b2lkIHBvc3RDb25zdHJ1Y3QoKSB7CisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKGNvbmZpZ3VyYXRpb24pOworICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKGNvdW50KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFJlc291cmNlU3RhdGUgcHJlRGVzdHJveVN0YXRlID0gUmVzb3VyY2VTdGF0ZS5ORVc7CisgICAgcHJpdmF0ZSBzdGF0aWMgQ291bnREb3duTGF0Y2ggcHJlRGVzdHJveUNkbCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKworICAgIEBQYXRoKCJwcmUtZGVzdHJveSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQcmVEZXN0cm95UmVzb3VyY2UgeworICAgICAgICBwdWJsaWMgUHJlRGVzdHJveVJlc291cmNlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHByZURlc3Ryb3lTdGF0ZSA9IFJlc291cmNlU3RhdGUuQ09OU1RSVUNURUQ7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsZU5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gcHJlRGVzdHJveVN0YXRlLm5hbWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQcmVEZXN0cm95CisgICAgICAgIHB1YmxpYyB2b2lkIHByZURlc3Ryb3koKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoUmVzb3VyY2VTdGF0ZS5DT05TVFJVQ1RFRCwgcHJlRGVzdHJveVN0YXRlKTsKKyAgICAgICAgICAgIHByZURlc3Ryb3lTdGF0ZSA9IFJlc291cmNlU3RhdGUuREVTVFJPWUVEOworICAgICAgICAgICAgcHJlRGVzdHJveUNkbC5jb3VudERvd24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJyZWZlcnJlZCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZWZlcnJlZFRvUmVzb3VyY2UgeworICAgICAgICBAUGF0aCgic3ViIikKKyAgICAgICAgcHVibGljIFJlZmVyZW5jaW5nT2ZSZXNvdXJjZSBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlZmVyZW5jaW5nT2ZSZXNvdXJjZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VTdGF0ZSBwcmVQb3N0U3RhdGUgPSBSZXNvdXJjZVN0YXRlLk5FVzsKKyAgICBwcml2YXRlIHN0YXRpYyBDb3VudERvd25MYXRjaCBwcmVQb3N0Q2RsID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworCisgICAgQFBhdGgoInByZS1wb3N0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFByZURlc3Ryb3lQb3N0Q29uc3RydWN0UmVzb3VyY2UgeworCisgICAgICAgIEBQb3N0Q29uc3RydWN0CisgICAgICAgIHB1YmxpYyB2b2lkIHBvc3RDb25zdHJ1Y3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcHJlUG9zdFN0YXRlID0gUmVzb3VyY2VTdGF0ZS5DT05TVFJVQ1RFRDsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRTdGF0ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBwcmVQb3N0U3RhdGUubmFtZSgpOworICAgICAgICB9CisKKyAgICAgICAgQFByZURlc3Ryb3kKKyAgICAgICAgcHVibGljIHZvaWQgcHJlRGVzdHJveSgpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhSZXNvdXJjZVN0YXRlLkNPTlNUUlVDVEVELCBwcmVQb3N0U3RhdGUpOworICAgICAgICAgICAgcHJlUG9zdFN0YXRlID0gUmVzb3VyY2VTdGF0ZS5ERVNUUk9ZRUQ7CisgICAgICAgICAgICBwcmVQb3N0Q2RsLmNvdW50RG93bigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VTdGF0ZSBwcmVQb3N0UHJpdmF0ZVN0YXRlID0gUmVzb3VyY2VTdGF0ZS5ORVc7CisgICAgcHJpdmF0ZSBzdGF0aWMgQ291bnREb3duTGF0Y2ggcHJlUG9zdFByaXZhdGVDZGwgPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisKKyAgICBAUGF0aCgicHJlLXBvc3QtcHJpdmF0ZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQcmVEZXN0cm95UG9zdENvbnN0cnVjdFJlc291cmNlUHJpdmF0ZSB7CisKKyAgICAgICAgQFBvc3RDb25zdHJ1Y3QKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHBvc3RDb25zdHJ1Y3QoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcHJlUG9zdFByaXZhdGVTdGF0ZSA9IFJlc291cmNlU3RhdGUuQ09OU1RSVUNURUQ7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhdGUoKSB7CisgICAgICAgICAgICByZXR1cm4gcHJlUG9zdFByaXZhdGVTdGF0ZS5uYW1lKCk7CisgICAgICAgIH0KKworICAgICAgICBAUHJlRGVzdHJveQorICAgICAgICBwcml2YXRlIHZvaWQgcHJlRGVzdHJveSgpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhSZXNvdXJjZVN0YXRlLkNPTlNUUlVDVEVELCBwcmVQb3N0UHJpdmF0ZVN0YXRlKTsKKyAgICAgICAgICAgIHByZVBvc3RQcml2YXRlU3RhdGUgPSBSZXNvdXJjZVN0YXRlLkRFU1RST1lFRDsKKyAgICAgICAgICAgIHByZVBvc3RQcml2YXRlQ2RsLmNvdW50RG93bigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VTdGF0ZSBwcmVQb3N0UHJvdGVjdGVkU3RhdGUgPSBSZXNvdXJjZVN0YXRlLk5FVzsKKyAgICBwcml2YXRlIHN0YXRpYyBDb3VudERvd25MYXRjaCBwcmVQb3N0UHJvdGVjdGVkQ2RsID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworCisgICAgQFBhdGgoInByZS1wb3N0LXByb3RlY3RlZCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQcmVEZXN0cm95UG9zdENvbnN0cnVjdFJlc291cmNlUHJvdGVjdGVkIHsKKworICAgICAgICBAUG9zdENvbnN0cnVjdAorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBwb3N0Q29uc3RydWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHByZVBvc3RQcm90ZWN0ZWRTdGF0ZSA9IFJlc291cmNlU3RhdGUuQ09OU1RSVUNURUQ7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhdGUoKSB7CisgICAgICAgICAgICByZXR1cm4gcHJlUG9zdFByb3RlY3RlZFN0YXRlLm5hbWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQcmVEZXN0cm95CisgICAgICAgIHByb3RlY3RlZCB2b2lkIHByZURlc3Ryb3koKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoUmVzb3VyY2VTdGF0ZS5DT05TVFJVQ1RFRCwgcHJlUG9zdFByb3RlY3RlZFN0YXRlKTsKKyAgICAgICAgICAgIHByZVBvc3RQcm90ZWN0ZWRTdGF0ZSA9IFJlc291cmNlU3RhdGUuREVTVFJPWUVEOworICAgICAgICAgICAgcHJlUG9zdFByb3RlY3RlZENkbC5jb3VudERvd24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIFJlc291cmNlU3RhdGUgaW5oZXJpdGVkU3RhdGUgPSBSZXNvdXJjZVN0YXRlLk5FVzsKKyAgICBwcml2YXRlIHN0YXRpYyBDb3VudERvd25MYXRjaCBpbmhlcml0ZWRDZGwgPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisKKyAgICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIFBvc3RDb25zdHJ1Y3RSZXNvdXJjZUluaGVyaXRlZCB7CisgICAgICAgIEBQb3N0Q29uc3RydWN0CisgICAgICAgIHByaXZhdGUgdm9pZCBwb3N0Q29uc3RydWN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGluaGVyaXRlZFN0YXRlID0gUmVzb3VyY2VTdGF0ZS5DT05TVFJVQ1RFRDsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRTdGF0ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBpbmhlcml0ZWRTdGF0ZS5uYW1lKCk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIEBQYXRoKCJpbmhlcml0ZWQiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHJlRGVzdHJveVJlc291cmNlSW5oZXJpdGVkIGV4dGVuZHMgUG9zdENvbnN0cnVjdFJlc291cmNlSW5oZXJpdGVkIHsKKworICAgICAgICBAUHJlRGVzdHJveQorICAgICAgICBwcml2YXRlIHZvaWQgcHJlRGVzdHJveSgpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhSZXNvdXJjZVN0YXRlLkNPTlNUUlVDVEVELCBpbmhlcml0ZWRTdGF0ZSk7CisgICAgICAgICAgICBpbmhlcml0ZWRTdGF0ZSA9IFJlc291cmNlU3RhdGUuREVTVFJPWUVEOworICAgICAgICAgICAgaW5oZXJpdGVkQ2RsLmNvdW50RG93bigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZWZlcmVuY2luZ09mUmVzb3VyY2UgeworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KEBDb250ZXh0IGZpbmFsIFJlc291cmNlQ29udGV4dCByYykgeworICAgICAgICAgICAgZmluYWwgUmVmZXJyZWRUb1Jlc291cmNlIHIxID0gcmMuZ2V0UmVzb3VyY2UoUmVmZXJyZWRUb1Jlc291cmNlLmNsYXNzKTsKKyAgICAgICAgICAgIGZpbmFsIFJlZmVycmVkVG9SZXNvdXJjZSByMiA9IHJjLmdldFJlc291cmNlKFJlZmVycmVkVG9SZXNvdXJjZS5jbGFzcyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMocjEsIHIyKTsKKyAgICAgICAgICAgIHJldHVybiAiR0VUIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUHJlRGVzdHJveVBvc3RDb25zdHJ1Y3RSZXNvdXJjZS5jbGFzcywgUHJlRGVzdHJveVBvc3RDb25zdHJ1Y3RSZXNvdXJjZVByaXZhdGUuY2xhc3MsCisgICAgICAgICAgICAgICAgUHJlRGVzdHJveVBvc3RDb25zdHJ1Y3RSZXNvdXJjZVByb3RlY3RlZC5jbGFzcywgUHJlRGVzdHJveVJlc291cmNlSW5oZXJpdGVkLmNsYXNzLAorICAgICAgICAgICAgICAgIFJlZmVycmVkVG9SZXNvdXJjZS5jbGFzcywgUHJlRGVzdHJveVJlc291cmNlLmNsYXNzLCBQb3N0Q29uc3RydWN0UmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc3RDb25zdHJ1Y3RSZXNvdXJjZSgpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpLnBhdGgoInBvc3QtY29uc3RydWN0Iik7CisgICAgICAgIGFzc2VydEVxdWFscygiMSIsIHRhcmdldC5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCB0YXJnZXQucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgdGFyZ2V0LnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlRGVzdHJveVJlc291cmNlKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHMgPSB0YXJnZXQoKS5wYXRoKCJwcmUtZGVzdHJveSIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJlc291cmNlU3RhdGUuQ09OU1RSVUNURUQubmFtZSgpLCBzKTsKKyAgICAgICAgcHJlRGVzdHJveUNkbC5hd2FpdCgxMDAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmVzb3VyY2VTdGF0ZS5ERVNUUk9ZRUQsIHByZURlc3Ryb3lTdGF0ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVmZXJyZWRUb1Jlc291cmNlKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCIsIHRhcmdldCgpLnBhdGgoInJlZmVycmVkL3N1YiIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVEZXN0cm95UG9zdENyZWF0ZVJlc291cmNlKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHMgPSB0YXJnZXQoKS5wYXRoKCJwcmUtcG9zdCIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJlc291cmNlU3RhdGUuQ09OU1RSVUNURUQubmFtZSgpLCBzKTsKKyAgICAgICAgcHJlUG9zdENkbC5hd2FpdCgxMDAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmVzb3VyY2VTdGF0ZS5ERVNUUk9ZRUQsIHByZVBvc3RTdGF0ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlRGVzdHJveVBvc3RDcmVhdGVSZXNvdXJjZVByaXZhdGUoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgcyA9IHRhcmdldCgpLnBhdGgoInByZS1wb3N0LXByaXZhdGUiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhSZXNvdXJjZVN0YXRlLkNPTlNUUlVDVEVELm5hbWUoKSwgcyk7CisgICAgICAgIHByZVBvc3RQcml2YXRlQ2RsLmF3YWl0KDEwMDAsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgIGFzc2VydEVxdWFscyhSZXNvdXJjZVN0YXRlLkRFU1RST1lFRCwgcHJlUG9zdFByaXZhdGVTdGF0ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJlRGVzdHJveVBvc3RDcmVhdGVSZXNvdXJjZVByb3RlY3RlZCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBzID0gdGFyZ2V0KCkucGF0aCgicHJlLXBvc3QtcHJvdGVjdGVkIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmVzb3VyY2VTdGF0ZS5DT05TVFJVQ1RFRC5uYW1lKCksIHMpOworICAgICAgICBwcmVQb3N0UHJvdGVjdGVkQ2RsLmF3YWl0KDEwMDAsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisgICAgICAgIGFzc2VydEVxdWFscyhSZXNvdXJjZVN0YXRlLkRFU1RST1lFRCwgcHJlUG9zdFByb3RlY3RlZFN0YXRlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcmVEZXN0cm95UG9zdENyZWF0ZVJlc291cmNlSW5oZXJpdGVkKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHMgPSB0YXJnZXQoKS5wYXRoKCJpbmhlcml0ZWQiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhSZXNvdXJjZVN0YXRlLkNPTlNUUlVDVEVELm5hbWUoKSwgcyk7CisgICAgICAgIGluaGVyaXRlZENkbC5hd2FpdCgxMDAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmVzb3VyY2VTdGF0ZS5ERVNUUk9ZRUQsIGluaGVyaXRlZFN0YXRlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9Qb3N0Q29uc3RydWN0VGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvUG9zdENvbnN0cnVjdFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzgxMmJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvUG9zdENvbnN0cnVjdFRlc3QuamF2YQpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlBvc3RDb25zdHJ1Y3Q7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuaGsyLkhrMkluamVjdGlvbk1hbmFnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkRlcGxveW1lbnRDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3N1bWU7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdGluZyB0aGF0IHtAbGluayBDb250ZXh0IGluamVjdGlvbn0gaXMgZG9uZSBiZWZvcmUgaW52b2tpbmcgbWV0aG9kIGFubm90YXRlZCB3aXRoIHtAbGluayBQb3N0Q29uc3RydWN0fS4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIFBvc3RDb25zdHJ1Y3RUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgdmFsdWU7CisKKyAgICAgICAgQENvbnRleHQKKyAgICAgICAgcHJpdmF0ZSBVcmlJbmZvIHVyaTsKKworICAgICAgICBAQ29udGV4dAorICAgICAgICBwcml2YXRlIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbjsKKworICAgICAgICBAUG9zdENvbnN0cnVjdAorICAgICAgICBwdWJsaWMgdm9pZCBwb3N0Q29uc3RydWN0KCkgeworICAgICAgICAgICAgdmFsdWUgPSBjb25maWd1cmF0aW9uICE9IG51bGwgPyAxIDogMDsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gInZhbHVlPSIgKyB2YWx1ZSArICJ8IiArIGNvbmZpZ3VyYXRpb24uZ2V0UHJvcGVydHkoInZhbHVlIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15QXBwbGljYXRpb24gZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgdmFsdWU7CisKKyAgICAgICAgQENvbnRleHQKKyAgICAgICAgcHJpdmF0ZSBVcmlJbmZvIHVyaUluZm87CisKKyAgICAgICAgQFBvc3RDb25zdHJ1Y3QKKyAgICAgICAgcHVibGljIHZvaWQgcG9zdENvbnN0cnVjdCgpIHsKKyAgICAgICAgICAgIHZhbHVlID0gdXJpSW5mbyAhPSBudWxsID8gMSA6IDA7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy5zaW5nbGV0b24oUmVzb3VyY2UuY2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFByb3BlcnRpZXMoKSB7CisgICAgICAgICAgICBmaW5hbCBIYXNoTWFwPFN0cmluZywgT2JqZWN0PiBtYXAgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgICAgICBtYXAucHV0KCJ2YWx1ZSIsIHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybiBtYXA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXAoKSB7CisgICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKEhrMkluamVjdGlvbk1hbmFnZXJGYWN0b3J5LmlzSW1tZWRpYXRlU3RyYXRlZ3koKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIERlcGxveW1lbnRDb250ZXh0IGNvbmZpZ3VyZURlcGxveW1lbnQoKSB7CisgICAgICAgIC8vIElmIHN0cmF0ZWd5IGlzIG5vdCBJTU1FRElBVEUgdGhlbiB0ZXN0IHdpbGwgZmFpbCBldmVuIGJlZm9yZSBAQmVmb3JlIHNldHVwIG1ldGhvZCBpbnZvY2F0aW9uLgorICAgICAgICAvLyBJdCBoYXMgbm8gb3RoZXIgcmVhc29uIHRoZW4ganVzdCBydW4gdGhlIHRlc3RzIGluIElNTUVESUFURSBzdHJhdGVneS4KKyAgICAgICAgaWYgKEhrMkluamVjdGlvbk1hbmFnZXJGYWN0b3J5LmlzSW1tZWRpYXRlU3RyYXRlZ3koKSkgeworICAgICAgICAgICAgcmV0dXJuIERlcGxveW1lbnRDb250ZXh0Lm5ld0luc3RhbmNlKE15QXBwbGljYXRpb24uY2xhc3MpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIERlcGxveW1lbnRDb250ZXh0Lm5ld0luc3RhbmNlKG5ldyBSZXNvdXJjZUNvbmZpZygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFwcGxpY2F0aW9uUmVzb3VyY2VQb3N0Q29uc3RydWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydEVxdWFscygidmFsdWU9MXwxIiwgdGFyZ2V0KCkucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9QcmltaXRpdmVUeXBlc1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL1ByaW1pdGl2ZVR5cGVzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYWJmOTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9QcmltaXRpdmVUeXBlc1Rlc3QuamF2YQpAQCAtMCwwICsxLDQzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CitpbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0xvbmc7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QudXRpbC5ydW5uZXIuQ29uY3VycmVudFJ1bm5lcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CisKKy8qKgorICogVGVzdHMgcHJpbWl0aXZlIHR5cGVzIGFzIGVudGl0eS4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK0BSdW5XaXRoKENvbmN1cnJlbnRSdW5uZXIuY2xhc3MpCitwdWJsaWMgY2xhc3MgUHJpbWl0aXZlVHlwZXNUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW50ZWdlcigpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHdlYiA9IHRhcmdldCgpLnBhdGgoInRlc3QiKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB3ZWIucGF0aCgiSW50ZWdlciIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoNSwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig2KSwgcmVzcG9uc2UucmVhZEVudGl0eShJbnRlZ2VyLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJpbWl0aXZlSW50KCkgeworICAgICAgICBXZWJUYXJnZXQgd2ViID0gdGFyZ2V0KCkucGF0aCgidGVzdCIpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHdlYi5wYXRoKCJpbnQiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KDUsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNiksIHJlc3BvbnNlLnJlYWRFbnRpdHkoSW50ZWdlci5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByaW1pdGl2ZUludE51bGwoKSB7CisgICAgICAgIFdlYlRhcmdldCB3ZWIgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0Iik7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gd2ViLnBhdGgoImludCIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoIiIsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9uZygpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHdlYiA9IHRhcmdldCgpLnBhdGgoInRlc3QiKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB3ZWIucGF0aCgiTG9uZyIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoNUwsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IExvbmcoNiksIHJlc3BvbnNlLnJlYWRFbnRpdHkoTG9uZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByaW1pdGl2ZUxvbmcoKSB7CisgICAgICAgIFdlYlRhcmdldCB3ZWIgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0Iik7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gd2ViLnBhdGgoImxvbmciKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KDVMLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDZMLCAobG9uZykgcmVzcG9uc2UucmVhZEVudGl0eShsb25nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJpbWl0aXZlTG9uZ051bGwoKSB7CisgICAgICAgIFdlYlRhcmdldCB3ZWIgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0Iik7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gd2ViLnBhdGgoImxvbmciKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KCIiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNob3J0KCkgeworICAgICAgICBXZWJUYXJnZXQgd2ViID0gdGFyZ2V0KCkucGF0aCgidGVzdCIpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHdlYi5wYXRoKCJTaG9ydCIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoKHNob3J0KSA1LCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBTaG9ydCgoc2hvcnQpIDYpLCByZXNwb25zZS5yZWFkRW50aXR5KFNob3J0LmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJpbWl0aXZlU2hvcnQoKSB7CisgICAgICAgIFdlYlRhcmdldCB3ZWIgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0Iik7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gd2ViLnBhdGgoInNob3J0IikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eSgoc2hvcnQpIDUsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoKHNob3J0KSA2LCAoc2hvcnQpIHJlc3BvbnNlLnJlYWRFbnRpdHkoc2hvcnQuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcmltaXRpdmVTaG9ydE51bGwoKSB7CisgICAgICAgIFdlYlRhcmdldCB3ZWIgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0Iik7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gd2ViLnBhdGgoInNob3J0IikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eSgiIiwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Qnl0ZSgpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHdlYiA9IHRhcmdldCgpLnBhdGgoInRlc3QiKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB3ZWIucGF0aCgiQnl0ZSIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoKGJ5dGUpIDUsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEJ5dGUoKGJ5dGUpIDYpLCByZXNwb25zZS5yZWFkRW50aXR5KEJ5dGUuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcmltaXRpdmVCeXRlKCkgeworICAgICAgICBXZWJUYXJnZXQgd2ViID0gdGFyZ2V0KCkucGF0aCgidGVzdCIpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHdlYi5wYXRoKCJieXRlIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eSgoYnl0ZSkgNSwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygoYnl0ZSkgNiwgKGJ5dGUpIHJlc3BvbnNlLnJlYWRFbnRpdHkoYnl0ZS5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByaW1pdGl2ZUJ5dGVOdWxsKCkgeworICAgICAgICBXZWJUYXJnZXQgd2ViID0gdGFyZ2V0KCkucGF0aCgidGVzdCIpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHdlYi5wYXRoKCJieXRlIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eSgiIiwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmxvYXQoKSB7CisgICAgICAgIFdlYlRhcmdldCB3ZWIgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0Iik7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gd2ViLnBhdGgoIkZsb2F0IikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eSgoZmxvYXQpIDUsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEZsb2F0KDYpLCByZXNwb25zZS5yZWFkRW50aXR5KEZsb2F0LmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJpbWl0aXZlRmxvYXQoKSB7CisgICAgICAgIFdlYlRhcmdldCB3ZWIgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0Iik7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gd2ViLnBhdGgoImZsb2F0IikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eSg1ZiwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg2ZiwgcmVzcG9uc2UucmVhZEVudGl0eShmbG9hdC5jbGFzcyksIDAuMGYpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByaW1pdGl2ZUZsb2F0TnVsbCgpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHdlYiA9IHRhcmdldCgpLnBhdGgoInRlc3QiKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB3ZWIucGF0aCgiZmxvYXQiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KCIiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REb3VibGUoKSB7CisgICAgICAgIFdlYlRhcmdldCB3ZWIgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0Iik7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gd2ViLnBhdGgoIkRvdWJsZSIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoKGRvdWJsZSkgNSwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgRG91YmxlKDYpLCByZXNwb25zZS5yZWFkRW50aXR5KERvdWJsZS5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByaW1pdGl2ZURvdWJsZSgpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHdlYiA9IHRhcmdldCgpLnBhdGgoInRlc3QiKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB3ZWIucGF0aCgiZG91YmxlIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eSg1ZCwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg2ZCwgcmVzcG9uc2UucmVhZEVudGl0eShkb3VibGUuY2xhc3MpLCAwLjBkKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcmltaXRpdmVEb3VibGVOdWxsKCkgeworICAgICAgICBXZWJUYXJnZXQgd2ViID0gdGFyZ2V0KCkucGF0aCgidGVzdCIpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHdlYi5wYXRoKCJkb3VibGUiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KCIiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDaGFyYWN0ZXIoKSB7CisgICAgICAgIFdlYlRhcmdldCB3ZWIgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0Iik7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gd2ViLnBhdGgoIkNoYXJhY3RlciIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoJ2EnLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBDaGFyYWN0ZXIoJ2InKSwgcmVzcG9uc2UucmVhZEVudGl0eShDaGFyYWN0ZXIuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcmltaXRpdmVDaGFyYWN0ZXIoKSB7CisgICAgICAgIFdlYlRhcmdldCB3ZWIgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0Iik7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gd2ViLnBhdGgoImNoYXIiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KCdhJywgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygnYicsIChjaGFyKSByZXNwb25zZS5yZWFkRW50aXR5KGNoYXIuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcmltaXRpdmVDaGFyYWN0ZXJOdWxsKCkgeworICAgICAgICBXZWJUYXJnZXQgd2ViID0gdGFyZ2V0KCkucGF0aCgidGVzdCIpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHdlYi5wYXRoKCJjaGFyIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eSgiIiwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3RyaW5nKCkgeworICAgICAgICBXZWJUYXJnZXQgd2ViID0gdGFyZ2V0KCkucGF0aCgidGVzdCIpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHdlYi5wYXRoKCJTdHJpbmciKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KCJTdHJpbmciLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTdHJpbmdQT1NUIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCb29sZWFuKCkgeworICAgICAgICBXZWJUYXJnZXQgd2ViID0gdGFyZ2V0KCkucGF0aCgidGVzdCIpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHdlYi5wYXRoKCJCb29sZWFuIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShCb29sZWFuLlRSVUUsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoQm9vbGVhbi5GQUxTRSwgcmVzcG9uc2UucmVhZEVudGl0eShCb29sZWFuLmNsYXNzKSk7CisgICAgfQorCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcmltaXRpdmVCb29sZWFuKCkgeworICAgICAgICBXZWJUYXJnZXQgd2ViID0gdGFyZ2V0KCkucGF0aCgidGVzdCIpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHdlYi5wYXRoKCJib29sZWFuIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eSh0cnVlLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocmVzcG9uc2UucmVhZEVudGl0eShib29sZWFuLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmlnRGVjaW1hbCgpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHdlYiA9IHRhcmdldCgpLnBhdGgoInRlc3QiKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB3ZWIucGF0aCgiYmlnRGVjaW1hbCIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobmV3IEJpZ0RlY2ltYWwoIjE1IiksIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEJpZ0RlY2ltYWwoIjE2IiksIHJlc3BvbnNlLnJlYWRFbnRpdHkoQmlnRGVjaW1hbC5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJpZ0ludGVnZXIoKSB7CisgICAgICAgIFdlYlRhcmdldCB3ZWIgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0Iik7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gd2ViLnBhdGgoImJpZ0ludGVnZXIiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG5ldyBCaWdJbnRlZ2VyKCIxNSIpLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBCaWdJbnRlZ2VyKCIxNiIpLCByZXNwb25zZS5yZWFkRW50aXR5KEJpZ0ludGVnZXIuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBdG9taWNJbnRlZ2VyKCkgeworICAgICAgICBXZWJUYXJnZXQgd2ViID0gdGFyZ2V0KCkucGF0aCgidGVzdCIpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHdlYi5wYXRoKCJhdG9taWNJbnRlZ2VyIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShuZXcgQXRvbWljSW50ZWdlcigxNSksCisgICAgICAgICAgICAgICAgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxNiwgcmVzcG9uc2UucmVhZEVudGl0eShBdG9taWNJbnRlZ2VyLmNsYXNzKS5nZXQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXRvbWljTG9uZygpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHdlYiA9IHRhcmdldCgpLnBhdGgoInRlc3QiKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB3ZWIucGF0aCgiYXRvbWljTG9uZyIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobmV3IEF0b21pY0xvbmcoMTUpLAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMTYsIHJlc3BvbnNlLnJlYWRFbnRpdHkoQXRvbWljTG9uZy5jbGFzcykuZ2V0KCkpOworICAgIH0KKworCisgICAgQFBhdGgoInRlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJ0ZXN0aWsiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRlc3QoQFF1ZXJ5UGFyYW0oImlkIikgaW50IGlkKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oaWQpOworICAgICAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKGlkKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJJbnRlZ2VyIikKKyAgICAgICAgcHVibGljIEludGVnZXIgcG9zdEludGVnZXIoSW50ZWdlciBpKSB7CisgICAgICAgICAgICByZXR1cm4gaSArIDE7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgiaW50IikKKyAgICAgICAgcHVibGljIGludCBwb3N0SW50KGludCBpKSB7CisgICAgICAgICAgICByZXR1cm4gaSArIDE7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgiTG9uZyIpCisgICAgICAgIHB1YmxpYyBMb25nIHBvc3RMb25nKExvbmcgbCkgeworICAgICAgICAgICAgcmV0dXJuIGwgKyAxOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoImxvbmciKQorICAgICAgICBwdWJsaWMgbG9uZyBwb3N0TG9uZyhsb25nIGwpIHsKKyAgICAgICAgICAgIHJldHVybiBsICsgMTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJTaG9ydCIpCisgICAgICAgIHB1YmxpYyBsb25nIHBvc3RTaG9ydChTaG9ydCBzKSB7CisgICAgICAgICAgICByZXR1cm4gcyArIDE7CisgICAgICAgIH0KKworCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJzaG9ydCIpCisgICAgICAgIHB1YmxpYyBsb25nIHBvc3RQcmltaXRpdmVTaG9ydChzaG9ydCBzKSB7CisgICAgICAgICAgICByZXR1cm4gcyArIDE7CisgICAgICAgIH0KKworCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJCeXRlIikKKyAgICAgICAgcHVibGljIEJ5dGUgcG9zdEJ5dGUoQnl0ZSBiKSB7CisgICAgICAgICAgICByZXR1cm4gKGJ5dGUpIChiICsgMSk7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgiYnl0ZSIpCisgICAgICAgIHB1YmxpYyBieXRlIHBvc3RQcmltaXRpdmVCeXRlKGJ5dGUgYikgeworICAgICAgICAgICAgcmV0dXJuIChieXRlKSAoYiArIDEpOworICAgICAgICB9CisKKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgiRmxvYXQiKQorICAgICAgICBwdWJsaWMgRmxvYXQgcG9zdEZsb2F0KEZsb2F0IGYpIHsKKyAgICAgICAgICAgIHJldHVybiBmICsgMWY7CisgICAgICAgIH0KKworCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJmbG9hdCIpCisgICAgICAgIHB1YmxpYyBmbG9hdCBwb3N0UHJpbWl0aXZlRmxvYXQoZmxvYXQgZikgeworICAgICAgICAgICAgcmV0dXJuIGYgKyAxOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoIkRvdWJsZSIpCisgICAgICAgIHB1YmxpYyBEb3VibGUgcG9zdERvdWJsZShEb3VibGUgZCkgeworICAgICAgICAgICAgcmV0dXJuIGQgKyAxZDsKKyAgICAgICAgfQorCisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoImRvdWJsZSIpCisgICAgICAgIHB1YmxpYyBkb3VibGUgcG9zdFByaW1pdGl2ZURvdWJsZShkb3VibGUgZCkgeworICAgICAgICAgICAgcmV0dXJuIGQgKyAxOworICAgICAgICB9CisKKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgiQ2hhcmFjdGVyIikKKyAgICAgICAgcHVibGljIENoYXJhY3RlciBwb3N0Q2hhcmFjdGVyKENoYXJhY3RlciBjKSB7CisgICAgICAgICAgICBieXRlIGIgPSAoYnl0ZSkgKGMuY2hhclZhbHVlKCkpOworICAgICAgICAgICAgYiA9IChieXRlKSAoYiArIDEpOworICAgICAgICAgICAgcmV0dXJuIChjaGFyKSBiOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoImNoYXIiKQorICAgICAgICBwdWJsaWMgY2hhciBwb3N0UHJpbWl0aXZlQ2hhcihjaGFyIGMpIHsKKyAgICAgICAgICAgIGJ5dGUgYiA9IChieXRlKSBjOworICAgICAgICAgICAgYiA9IChieXRlKSAoYiArIDEpOworICAgICAgICAgICAgcmV0dXJuIChjaGFyKSBiOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoIlN0cmluZyIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdFN0cmluZyhTdHJpbmcgc3RyKSB7CisgICAgICAgICAgICByZXR1cm4gc3RyICsgIlBPU1QiOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoIkJvb2xlYW4iKQorICAgICAgICBwdWJsaWMgQm9vbGVhbiBwb3N0Qm9vbGVhbihCb29sZWFuIGIpIHsKKyAgICAgICAgICAgIGJvb2xlYW4gYm9vbCA9IGI7CisgICAgICAgICAgICByZXR1cm4gIWJvb2w7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgiYm9vbGVhbiIpCisgICAgICAgIHB1YmxpYyBCb29sZWFuIHBvc3RQcmltaXRpdmVCb29sZWFuKGJvb2xlYW4gYikgeworICAgICAgICAgICAgcmV0dXJuICFiOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImJpZ0RlY2ltYWwiKQorICAgICAgICBAUE9TVAorICAgICAgICBAQ29uc3VtZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICAgICAgcHVibGljIEJpZ0RlY2ltYWwgbnVtYmVyKEJpZ0RlY2ltYWwgbnVtYmVyKSB7CisgICAgICAgICAgICByZXR1cm4gbnVtYmVyLmFkZChuZXcgQmlnRGVjaW1hbCgiMSIpKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgQFBhdGgoImJpZ0ludGVnZXIiKQorICAgICAgICBAUE9TVAorICAgICAgICBAQ29uc3VtZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICAgICAgcHVibGljIEJpZ0ludGVnZXIgYmlnSW50ZWdlcihCaWdJbnRlZ2VyIGJpZ0ludGVnZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBiaWdJbnRlZ2VyLmFkZChuZXcgQmlnSW50ZWdlcigiMSIpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJhdG9taWNJbnRlZ2VyIikKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQENvbnN1bWVzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgICAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgICAgIHB1YmxpYyBBdG9taWNJbnRlZ2VyIGF0b21pY0ludGVnZXIoQXRvbWljSW50ZWdlciBhdG9taWMpIHsKKyAgICAgICAgICAgIGF0b21pYy5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgICAgICAgIHJldHVybiBhdG9taWM7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiYXRvbWljTG9uZyIpCisgICAgICAgIEBQT1NUCisgICAgICAgIEBDb25zdW1lcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICAgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgICAgICBwdWJsaWMgQXRvbWljTG9uZyBhdG9taWNMb25nKEF0b21pY0xvbmcgYXRvbWljKSB7CisgICAgICAgICAgICBhdG9taWMuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICAgICAgICByZXR1cm4gYXRvbWljOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvUmVsb2FkVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvUmVsb2FkVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZDRmNmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9SZWxvYWRUZXN0LmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5BYnN0cmFjdENvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29udGFpbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBSZWxvYWQgY2FwYWJpbGl0eSB0ZXN0LgorICoKKyAqIEZvciBqZGsgaHR0cCBzZXJ2ZXIgdGVzdCBjb250YWluZXIsIHJ1biB3aXRoOgorICoKKyAqIG12biAtRHRlc3Q9UmVsb2FkVGVzdCAtRGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIuZmFjdG9yeT1vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0Lmpka2h0dHAuSmRrSHR0cFNlcnZlclRlc3RDb250YWluZXJGYWN0b3J5IGNsZWFuIHRlc3QKKyAqCisgKiBGb3Igc2ltcGxlIHRlc3QgY29udGFpbmVyLCBydW4gd2l0aDoKKyAqCisgKiBtdm4gLUR0ZXN0PVJlbG9hZFRlc3QgLURqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk9b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zaW1wbGUuU2ltcGxlVGVzdENvbnRhaW5lckZhY3RvcnkgY2xlYW4gdGVzdAorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBSZWxvYWRUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAUGF0aCgib25lIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE9uZSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gIm9uZSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgidHdvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFR3byB7CisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gInR3byI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSZWxvYWRlciBleHRlbmRzIEFic3RyYWN0Q29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXIgeworICAgICAgICBDb250YWluZXIgY29udGFpbmVyOworCisKKyAgICAgICAgcHVibGljIHZvaWQgcmVsb2FkKFJlc291cmNlQ29uZmlnIHJjKSB7CisgICAgICAgICAgICBjb250YWluZXIucmVsb2FkKHJjKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0dXAoQ29udGFpbmVyIGNvbnRhaW5lcikgeworICAgICAgICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBSZXNvdXJjZUNvbmZpZyByYzsKKyAgICBSZWxvYWRlciByZWxvYWRlcjsKKworICAgIHByaXZhdGUgUmVzb3VyY2VDb25maWcgX2NyZWF0ZVJDKFJlbG9hZGVyIHIpIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzdWx0ID0gbmV3IFJlc291cmNlQ29uZmlnKE9uZS5jbGFzcyk7CisgICAgICAgIHJlc3VsdC5yZWdpc3Rlckluc3RhbmNlcyhyKTsKKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIHJlbG9hZGVyID0gbmV3IFJlbG9hZGVyKCk7CisgICAgICAgIHJldHVybiByYyA9IF9jcmVhdGVSQyhyZWxvYWRlcik7CisgICAgfQorCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWxvYWQoKSB7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJvbmUiLCB0YXJnZXQoKS5wYXRoKCJvbmUiKS5yZXF1ZXN0KCkuZ2V0KCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwNCwgdGFyZ2V0KCkucGF0aCgidHdvIikucmVxdWVzdCgpLmdldCgpLmdldFN0YXR1cygpKTsKKworICAgICAgICByYyA9IF9jcmVhdGVSQyhyZWxvYWRlcikucmVnaXN0ZXJDbGFzc2VzKFR3by5jbGFzcyk7CisgICAgICAgIHJlbG9hZGVyLnJlbG9hZChyYyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJvbmUiLCB0YXJnZXQoKS5wYXRoKCJvbmUiKS5yZXF1ZXN0KCkuZ2V0KCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0d28iLCB0YXJnZXQoKS5wYXRoKCJ0d28iKS5yZXF1ZXN0KCkuZ2V0KCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9SZXF1ZXN0U2NvcGVkQW5kQXN5bmNUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9SZXF1ZXN0U2NvcGVkQW5kQXN5bmNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBlNDM3MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL1JlcXVlc3RTY29wZWRBbmRBc3luY1Rlc3QuamF2YQpAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQXN5bmNSZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuU3VzcGVuZGVkOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQWJzdHJhY3RCaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkRpc3Bvc2FibGVTdXBwbGllcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLmludGVybmFsLlJlcXVlc3RTY29wZWQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEpFUlNFWS0yNjc3IHJlcHJvZHVjZXIgLSB0ZXN0LCB0aGF0IHtAY29kZSBGYWN0b3J5LmRpc3Bvc2UoKX0gaXMgY29ycmVjdGx5IGNhbGxlZCBmb3IgYm90aCBzeW5jIGFuZCBhc3luYyBjYXNlcy4KKyAqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBSZXF1ZXN0U2NvcGVkQW5kQXN5bmNUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihSZXF1ZXN0U2NvcGVkQW5kQXN5bmNUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICAvLyBsYXRjaCB0byBwcmV2ZW50LCB0aGF0IHRoZSBiYWxhbmNlIGlzIGNoZWNrZWQgYmVmb3JlIGRpc3Bvc2UoKSBpcyBjYWxsZWQKKyAgICBwcml2YXRlIHN0YXRpYyBDb3VudERvd25MYXRjaCBjZGw7CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEluamVjdGFibGUgeworICAgICAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlID0gIkhlbGxvIjsKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEluamVjdGFibGVGYWN0b3J5IGltcGxlbWVudHMgRGlzcG9zYWJsZVN1cHBsaWVyPEluamVjdGFibGU+IHsKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgQXRvbWljSW50ZWdlciBwcm92aWRlZCA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOworICAgICAgICBwcml2YXRlIHN0YXRpYyBBdG9taWNJbnRlZ2VyIGJhbGFuY2UgPSBuZXcgQXRvbWljSW50ZWdlcigwKTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEluamVjdGFibGUgZ2V0KCkgeworICAgICAgICAgICAgTE9HR0VSLmZpbmUoIkZhY3RvcnkgcHJvdmlkZSgpIGNhbGxlZC4iKTsKKyAgICAgICAgICAgIHByb3ZpZGVkLmluY3JlbWVudEFuZEdldCgpOworICAgICAgICAgICAgYmFsYW5jZS5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSW5qZWN0YWJsZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoSW5qZWN0YWJsZSBpKSB7CisgICAgICAgICAgICBMT0dHRVIuZmluZSgiRmFjdG9yeSBkaXNwb3NlKCkgY2FsbGVkLiAiKTsKKyAgICAgICAgICAgIGJhbGFuY2UuZGVjcmVtZW50QW5kR2V0KCk7CisgICAgICAgICAgICBjZGwuY291bnREb3duKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgICAgICBMT0dHRVIuZmluZSgiRmFjdG9yeSByZXNldCgpIGNhbGxlZC4iKTsKKyAgICAgICAgICAgIHByb3ZpZGVkLnNldCgwKTsKKyAgICAgICAgICAgIGJhbGFuY2Uuc2V0KDApOworICAgICAgICAgICAgY2RsID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0UHJvdmlkZWRDb3VudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBwcm92aWRlZC5pbnRWYWx1ZSgpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0QmFsYW5jZVZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIGJhbGFuY2UuaW50VmFsdWUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJ0ZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RSZXNvdXJjZSB7CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBwcml2YXRlIEluamVjdGFibGUgaW5qZWN0YWJsZTsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJzeW5jIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHN5bmMoKSB7CisgICAgICAgICAgICBMT0dHRVIuZmluZSgiSW5qZWN0ZWQgbWVzc2FnZTogIiArIGluamVjdGFibGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5ub0NvbnRlbnQoKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiYXN5bmMiKQorICAgICAgICBwdWJsaWMgdm9pZCBhc3luYyhAU3VzcGVuZGVkIEFzeW5jUmVzcG9uc2UgYXIpIHsKKyAgICAgICAgICAgIExPR0dFUi5maW5lKCJJbmplY3RlZCBtZXNzYWdlOiAiICsgaW5qZWN0YWJsZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgYXIucmVzdW1lKFJlc3BvbnNlLm5vQ29udGVudCgpLmJ1aWxkKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHJlc2V0Q291bnRlcnMoKSB7CisgICAgICAgIEluamVjdGFibGVGYWN0b3J5LnJlc2V0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhUZXN0UmVzb3VyY2UuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKG5ldyBBYnN0cmFjdEJpbmRlcigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRGYWN0b3J5KEluamVjdGFibGVGYWN0b3J5LmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG8oSW5qZWN0YWJsZS5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmluKFJlcXVlc3RTY29wZWQuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFuY2VSZWxlYXNlQXN5bmMoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIEZ1dHVyZTxSZXNwb25zZT4gZnV0dXJlID0gdGFyZ2V0KCIvdGVzdC9hc3luYyIpLnJlcXVlc3QoKS5hc3luYygpLmdldCgpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IGZ1dHVyZS5nZXQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMjA0LCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBJbmplY3RhYmxlRmFjdG9yeS5nZXRQcm92aWRlZENvdW50KCkpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2RsLmF3YWl0KDUwMCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5JTkZPLCAiQ291bnREb3duTGF0Y2ggaW50ZXJydXB0ZWQ6ICIsIGUpOworICAgICAgICB9CisgICAgICAgIGFzc2VydEVxdWFscygwLCBJbmplY3RhYmxlRmFjdG9yeS5nZXRCYWxhbmNlVmFsdWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFuY2VSZWxlYXNlU3luYygpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwNCwgdGFyZ2V0KCIvdGVzdC9zeW5jIikucmVxdWVzdCgpLmdldCgpLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIEluamVjdGFibGVGYWN0b3J5LmdldFByb3ZpZGVkQ291bnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBJbmplY3RhYmxlRmFjdG9yeS5nZXRCYWxhbmNlVmFsdWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaG91bGRQcm92aWRlQW5kRGlzcG9zZVN5bmMyKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoMjA0LCB0YXJnZXQoIi90ZXN0L3N5bmMiKS5yZXF1ZXN0KCkuZ2V0KCkuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgSW5qZWN0YWJsZUZhY3RvcnkuZ2V0UHJvdmlkZWRDb3VudCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIEluamVjdGFibGVGYWN0b3J5LmdldEJhbGFuY2VWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHNob3VsZFByb3ZpZGVBbmREaXNwb3NlQXN5bmMyKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoMjA0LCB0YXJnZXQoIi90ZXN0L2FzeW5jIikucmVxdWVzdCgpLmdldCgpLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIEluamVjdGFibGVGYWN0b3J5LmdldFByb3ZpZGVkQ291bnQoKSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjZGwuYXdhaXQoNTAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLklORk8sICJDb3VudERvd25MYXRjaCBpbnRlcnJ1cHRlZDogIiwgZSk7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIEluamVjdGFibGVGYWN0b3J5LmdldEJhbGFuY2VWYWx1ZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9SZXNvdXJjZUNvbmZpZ1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL1Jlc291cmNlQ29uZmlnVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZjRmMDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9SZXNvdXJjZUNvbmZpZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDE2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YS51dGlsLkZvcm1hdHRlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dGlzb24uSmV0dGlzb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBFbmQgdG8gZW5kIHRlc3QgY2xhc3MgZm9yIHRlc3Rpbmcge0Bjb2RlIFJlc291cmNlQ29uZmlnfSBmZWF0dXJlcy4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIFJlc291cmNlQ29uZmlnVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQFN1cHByZXNzV2FybmluZ3MoeyJVbnVzZWREZWNsYXJhdGlvbiIsICJTdHJpbmdFcXVhbGl0eSIsICJSZWR1bmRhbnRJZlN0YXRlbWVudCJ9KQorICAgIEBYbWxSb290RWxlbWVudAorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHJvcGVydHkgeworCisgICAgICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlOworCisgICAgICAgIHB1YmxpYyBQcm9wZXJ0eSgpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBQcm9wZXJ0eShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBQcm9wZXJ0eSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBQcm9wZXJ0eSBvdGhlciA9IChQcm9wZXJ0eSkgb2JqOworICAgICAgICAgICAgaWYgKHRoaXMubmFtZSAhPSBvdGhlci5uYW1lICYmICh0aGlzLm5hbWUgPT0gbnVsbCB8fCAhdGhpcy5uYW1lLmVxdWFscyhvdGhlci5uYW1lKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodGhpcy52YWx1ZSAhPSBvdGhlci52YWx1ZSAmJiAodGhpcy52YWx1ZSA9PSBudWxsIHx8ICF0aGlzLnZhbHVlLmVxdWFscyhvdGhlci52YWx1ZSkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgICAgIGludCBoYXNoID0gNzsKKyAgICAgICAgICAgIGhhc2ggPSBoYXNoICogNDcgKyAobmFtZSA9PSBudWxsID8gMCA6IG5hbWUuaGFzaENvZGUoKSk7CisgICAgICAgICAgICBoYXNoID0gaGFzaCAqIDQ3ICsgKHZhbHVlID09IG51bGwgPyAwIDogdmFsdWUuaGFzaENvZGUoKSk7CisgICAgICAgICAgICByZXR1cm4gaGFzaDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBGb3JtYXR0ZXIoKS5mb3JtYXQoIlByb3BlcnR5KG5hbWU9JXMsdmFsdWU9JXMpIiwgbmFtZSwgdmFsdWUpLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFByb3BlcnR5IHBvc3QoZmluYWwgUHJvcGVydHkgcHJvcGVydHkpIHsKKyAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogQXBwbGljYXRpb24gc2ltaWxhciB0byB0aGUgb25lIHRoYXQgbmVlZHMgdG8gcmVnaXN0ZXIgYSBjdXN0b20ge0Bjb2RlIEZlYXR1cmV9IHRvIHJ1biBwcm9wZXJseQorICAgICAqIGFuZCBpcyBzdXBwb3NlZCB0byBiZSBwcmVzZW50IGluIFdBUiBmaWxlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEplcnNleTEwOTQgZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisKKyAgICAgICAgcHVibGljIEplcnNleTEwOTQoKSB7CisgICAgICAgICAgICByZWdpc3RlckNsYXNzZXMoUmVzb3VyY2UuY2xhc3MsIEpldHRpc29uRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIC8vIFNpbXVsYXRlIHRoZSBjcmVhdGlvbiBvZiB0aGUgUmVzb3VyY2VDb25maWcgYXMgaWYgaXQgd2FzIGNyZWF0ZWQgZHVyaW5nIHNlcnZsZXQgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgcmV0dXJuIFJlc291cmNlQ29uZmlnLmZvckFwcGxpY2F0aW9uQ2xhc3MoSmVyc2V5MTA5NC5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKG5ldyBKZXR0aXNvbkZlYXR1cmUoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgd2hldGhlciB0aGUge0Bjb2RlIEFwcGxpY2F0aW9uSGFuZGxlcn0gaXMgYWJsZSB0byByZWdpc3RlciBhbmQgdXNlIGN1c3RvbSBiaW5kZXJzIHByb3ZpZGVkIGJ5IGFuIGV4dGVuc2lvbiBvZgorICAgICAqIHtAY29kZSBSZXNvdXJjZUNvbmZpZ30gaWYgb25seSBhIGNsYXNzIHJlZmVyZW5jZSBvZiB0aGlzIGV4dGVuc2lvbiBpcyBwYXNzZWQgaW4gdGhlIHtAY29kZSBSZXNvdXJjZUNvbmZpZ30gdG8gdGhlCisgICAgICoge0Bjb2RlIEFwcGxpY2F0aW9uSGFuZGxlcn0uCisgICAgICogPHAvPgorICAgICAqIFRlc3QgaXMgdHJ5aW5nIHRvIHNpbXVsYXRlIHRoZSBiZWhhdmlvdXIgb2YgSmVyc2V5IGFzIGlmIHRoZSBhcHBsaWNhdGlvbiB3YXMgZGVwbG95ZWQgaW50byBhIHNlcnZsZXQgY29udGFpbmVyCisgICAgICogd2l0aCBhIHNlcnZsZXQgZGVmaW5lZCBpbiB7QGNvZGUgd2ViLnhtbH0gZmlsZSB1c2luZyB7QGNvZGUgaW5pdC1wYXJhbX0ge0Bjb2RlIGphdmF4LndzLnJzLkFwcGxpY2F0aW9ufS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKZXJzZXkxMDk0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFByb3BlcnR5IHRlc3RJbnN0YW5jZSA9IG5ldyBQcm9wZXJ0eSgibXlQcm9wIiwgIm15VmFsIik7CisKKyAgICAgICAgZmluYWwgUHJvcGVydHkgcmV0dXJuZWRWYWx1ZSA9IHRhcmdldCgpCisgICAgICAgICAgICAgICAgLnBhdGgoIi8iKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCJhcHBsaWNhdGlvbi9qc29uIikKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KHRlc3RJbnN0YW5jZSwgImFwcGxpY2F0aW9uL2pzb24iKSwgUHJvcGVydHkuY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscyh0ZXN0SW5zdGFuY2UsIHJldHVybmVkVmFsdWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgQElnbm9yZSgiVE9ETzogQWRkIHRlc3QgZm9yIHJlbG9hZGluZyByZXNvdXJjZSBjb25maWcgaW4gdGhlIGNvbnRhaW5lciAob25jZSBpdCBpcyBzdXBwb3J0ZWQpIikKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SmVyc2V5MTA5NFJlbG9hZFJlc291cmNlQ29uZmlnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIFRPRE8gdGVzdCByZWxvYWRpbmcgcmVzb3VyY2UgY29uZmlnIGluIHRoZSBjb250YWluZXIgKG9uY2UgaXQgaXMgc3VwcG9ydGVkKQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvUmVzb3VyY2VGaWx0ZXJUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9SZXNvdXJjZUZpbHRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2I0YTQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvUmVzb3VyY2VGaWx0ZXJUZXN0LmphdmEKQEAgLTAsMCArMSw0NTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLk5hbWVCaW5kaW5nOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlc3BvbnNlRmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5EeW5hbWljRmVhdHVyZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuUHJlTWF0Y2hpbmc7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlJlc291cmNlSW5mbzsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlNlY3VyaXR5Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuRXhjZXB0aW9uTWFwcGVyOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qcmlvcml0eTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5jb250YWluc1N0cmluZzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5ub3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIEpBWC1SUyBuYW1lLWJvdW5kIGZpbHRlciB0ZXN0cy4KKyAqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIE1pcm9zbGF2LkZ1a3NhCisgKiBAc2VlIEdsb2JhbGx5TmFtZUJvdW5kUmVzb3VyY2VGaWx0ZXJUZXN0CisgKi8KK3B1YmxpYyBjbGFzcyBSZXNvdXJjZUZpbHRlclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoCisgICAgICAgICAgICAgICAgTXlEeW5hbWljRmVhdHVyZS5jbGFzcywKKyAgICAgICAgICAgICAgICBCYXNpY1Rlc3RzUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgTmFtZUJvdW5kUmVxdWVzdEZpbHRlci5jbGFzcywKKyAgICAgICAgICAgICAgICBOYW1lQm91bmRSZXNwb25zZUZpbHRlci5jbGFzcywKKyAgICAgICAgICAgICAgICBQb3N0TWF0Y2hpbmdGaWx0ZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgLy8gZXhjZXB0aW9uIHRlc3RzCisgICAgICAgICAgICAgICAgRXhjZXB0aW9uVGVzdHNSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBFeGNlcHRpb25QcmVNYXRjaFJlcXVlc3RGaWx0ZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgRXhjZXB0aW9uUG9zdE1hdGNoUmVxdWVzdEZpbHRlci5jbGFzcywKKyAgICAgICAgICAgICAgICBFeGNlcHRpb25UZXN0Qm91bmRSZXNwb25zZUZpbHRlci5jbGFzcywKKyAgICAgICAgICAgICAgICBFeGNlcHRpb25UZXN0R2xvYmFsUmVzcG9uc2VGaWx0ZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgVGVzdEV4Y2VwdGlvbk1hcHBlci5jbGFzcywKKyAgICAgICAgICAgICAgICBBYm9ydFJlc3BvbnNlUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgQWJvcnRSZXNwb25zZUZpdGxlci5jbGFzcywKKyAgICAgICAgICAgICAgICBBYm9ydFJlcXVlc3RGaWx0ZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgRXhjZXB0aW9uUmVxdWVzdEZpbHRlci5jbGFzcworICAgICAgICApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdER5bmFtaWNCaW5kZXIoKSB7CisgICAgICAgIHRlc3QoImR5bmFtaWNCaW5kZXIiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROYW1lQm91bmRSZXF1ZXN0KCkgeworICAgICAgICB0ZXN0KCJuYW1lQm91bmRSZXF1ZXN0Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmFtZUJvdW5kUmVzcG9uc2UoKSB7CisgICAgICAgIHRlc3QoIm5hbWVCb3VuZFJlc3BvbnNlIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdE1hdGNoaW5nKCkgeworICAgICAgICB0ZXN0KCJwb3N0TWF0Y2hpbmciKTsKKyAgICB9CisKKyAgICAvLyBTZWUgSkVSU0VZLTE1NTQKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHbG9iYWxQb3N0TWF0Y2hpbmdOb3RJbnZva2VkT240MDQoKSB7CisgICAgICAgIFJlc3BvbnNlIHIgPSB0YXJnZXQoImJhc2ljIikucGF0aCgibm90LWZvdW5kIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDA0LCByLmdldFN0YXR1cygpKTsKKyAgICAgICAgaWYgKHIuaGFzRW50aXR5KCkpIHsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIG5vdChjb250YWluc1N0cmluZygicG9zdE1hdGNoaW5nIikpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0KFN0cmluZyBuYW1lKSB7CisgICAgICAgIFJlc3BvbnNlIHIgPSB0YXJnZXQoImJhc2ljIikucGF0aChuYW1lKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBIVFRQIHJlc3BvbnNlIHN0YXR1cyBjb2RlLiIsIDIwMCwgci5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydFRydWUoIlJlc3BvbnNlIGRvZXMgbm90IGhhdmUgZW50aXR5LiIsIHIuaGFzRW50aXR5KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgcmVzcG9uc2UgZW50aXR5IHZhbHVlLiIsIG5hbWUsIHIucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiL2Jhc2ljIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJhc2ljVGVzdHNSZXNvdXJjZSB7CisKKyAgICAgICAgQFBhdGgoImR5bmFtaWNCaW5kZXIiKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RHluYW1pY0JpbmRlcigpIHsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJuYW1lQm91bmRSZXF1ZXN0IikKKyAgICAgICAgQEdFVAorICAgICAgICBATmFtZUJvdW5kUmVxdWVzdAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVCb3VuZFJlcXVlc3QoKSB7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgibmFtZUJvdW5kUmVzcG9uc2UiKQorICAgICAgICBAR0VUCisgICAgICAgIEBOYW1lQm91bmRSZXNwb25zZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVCb3VuZFJlc3BvbnNlKCkgeworICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInBvc3RNYXRjaGluZyIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRQb3N0TWF0Y2hpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBATmFtZUJpbmRpbmcKKyAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorICAgIHByaXZhdGUgc3RhdGljIEBpbnRlcmZhY2UgTmFtZUJvdW5kUmVxdWVzdCB7fQorCisgICAgQE5hbWVCaW5kaW5nCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgICBwcml2YXRlIHN0YXRpYyBAaW50ZXJmYWNlIE5hbWVCb3VuZEFib3J0UmVzcG9uc2Uge30KKworICAgIEBOYW1lQm91bmRSZXF1ZXN0CisgICAgQFByaW9yaXR5KDEpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBOYW1lQm91bmRSZXF1ZXN0RmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LmFib3J0V2l0aChSZXNwb25zZS5vaygibmFtZUJvdW5kUmVxdWVzdCIsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpLmJ1aWxkKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE5hbWVCb3VuZFJlc3BvbnNlCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBOYW1lQm91bmRSZXNwb25zZUZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LCBDb250YWluZXJSZXNwb25zZUNvbnRleHQgcmVzcG9uc2VDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LnNldEVudGl0eSgibmFtZUJvdW5kUmVzcG9uc2UiLCByZXNwb25zZUNvbnRleHQuZ2V0RW50aXR5QW5ub3RhdGlvbnMoKSwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBvc3RNYXRjaGluZ0ZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAocmVxdWVzdENvbnRleHQuZ2V0VXJpSW5mbygpLmdldFBhdGgoKS5zdGFydHNXaXRoKCJiYXNpYyIpKSB7CisgICAgICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuYWJvcnRXaXRoKFJlc3BvbnNlLm9rKCJwb3N0TWF0Y2hpbmciLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKS5idWlsZCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcmlvcml0eSgxKQorICAgIEBQcmVNYXRjaGluZworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIERiRmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LmFib3J0V2l0aChSZXNwb25zZS5vaygiZHluYW1pY0JpbmRlciIsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpLmJ1aWxkKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUR5bmFtaWNGZWF0dXJlIGltcGxlbWVudHMgRHluYW1pY0ZlYXR1cmUgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgRGJGaWx0ZXIgZmlsdGVyID0gbmV3IERiRmlsdGVyKCk7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShmaW5hbCBSZXNvdXJjZUluZm8gcmVzb3VyY2VJbmZvLCBmaW5hbCBGZWF0dXJlQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICBpZiAoImdldER5bmFtaWNCaW5kZXIiLmVxdWFscyhyZXNvdXJjZUluZm8uZ2V0UmVzb3VyY2VNZXRob2QoKS5nZXROYW1lKCkpKSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihmaWx0ZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi9leGNlcHRpb24iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXhjZXB0aW9uVGVzdHNSZXNvdXJjZSB7CisKKyAgICAgICAgQFBhdGgoIm1hdGNoZWQiKQorICAgICAgICBAR0VUCisgICAgICAgIEBFeGNlcHRpb25UZXN0Qm91bmQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRQb3N0TWF0Y2hpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIm1ldGhvZCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJlTWF0Y2hpbmcKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEV4Y2VwdGlvblByZU1hdGNoUmVxdWVzdEZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoImV4Y2VwdGlvbi9ub3QtZm91bmQiLmVxdWFscyhyZXF1ZXN0Q29udGV4dC5nZXRVcmlJbmZvKCkuZ2V0UGF0aCgpKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBUZXN0RXhjZXB0aW9uKCJnbG9iYWxSZXF1ZXN0Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBATmFtZUJpbmRpbmcKKyAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorICAgIHByaXZhdGUgc3RhdGljIEBpbnRlcmZhY2UgRXhjZXB0aW9uVGVzdEJvdW5kIHt9CisKKyAgICBARXhjZXB0aW9uVGVzdEJvdW5kCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeGNlcHRpb25Qb3N0TWF0Y2hSZXF1ZXN0RmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUZXN0RXhjZXB0aW9uKCJuYW1lQm91bmRSZXF1ZXN0Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBARXhjZXB0aW9uVGVzdEJvdW5kCisgICAgQFByaW9yaXR5KDEwKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXhjZXB0aW9uVGVzdEJvdW5kUmVzcG9uc2VGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXNwb25zZUZpbHRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCwgQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJlc3BvbnNlQ29udGV4dC5zZXRFbnRpdHkoCisgICAgICAgICAgICAgICAgICAgIChyZXNwb25zZUNvbnRleHQuaGFzRW50aXR5KCkpID8gcmVzcG9uc2VDb250ZXh0LmdldEVudGl0eSgpICsgIi1uYW1lQm91bmRSZXNwb25zZSIgOiAibmFtZUJvdW5kUmVzcG9uc2UiLAorICAgICAgICAgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuZ2V0RW50aXR5QW5ub3RhdGlvbnMoKSwKKyAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJpb3JpdHkoMSkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEV4Y2VwdGlvblRlc3RHbG9iYWxSZXNwb25zZUZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LCBDb250YWluZXJSZXNwb25zZUNvbnRleHQgcmVzcG9uc2VDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKCFyZXF1ZXN0Q29udGV4dC5nZXRVcmlJbmZvKCkuZ2V0UGF0aCgpLnN0YXJ0c1dpdGgoImV4Y2VwdGlvbiIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuc2V0RW50aXR5KAorICAgICAgICAgICAgICAgICAgICAocmVzcG9uc2VDb250ZXh0Lmhhc0VudGl0eSgpKSA/IHJlc3BvbnNlQ29udGV4dC5nZXRFbnRpdHkoKSArICItZ2xvYmFsUmVzcG9uc2UiIDogImdsb2JhbFJlc3BvbnNlIiwKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LmdldEVudGl0eUFubm90YXRpb25zKCksCisgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0RXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgcHVibGljIFRlc3RFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIHN1cGVyKG1lc3NhZ2UpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0RXhjZXB0aW9uTWFwcGVyIGltcGxlbWVudHMgRXhjZXB0aW9uTWFwcGVyPFRlc3RFeGNlcHRpb24+IHsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQT1NURklYID0gIi1tYXBwZWRUZXN0RXhjZXB0aW9uIjsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHRvUmVzcG9uc2UoVGVzdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vayhleGNlcHRpb24uZ2V0TWVzc2FnZSgpICsgUE9TVEZJWCkuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5hbWVCb3VuZFJlc3BvbnNlRmlsdGVyTm90SW52b2tlZE9uUHJlTWF0Y2hGaWx0ZXJFeGNlcHRpb24oKSB7CisgICAgICAgIFJlc3BvbnNlIHIgPSB0YXJnZXQoImV4Y2VwdGlvbiIpLnBhdGgoIm5vdC1mb3VuZCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgci5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydFRydWUoci5oYXNFbnRpdHkoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZ2xvYmFsUmVxdWVzdC1tYXBwZWRUZXN0RXhjZXB0aW9uLWdsb2JhbFJlc3BvbnNlIiwgci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5hbWVCb3VuZFJlc3BvbnNlRmlsdGVySW52b2tlZE9uUG9zdE1hdGNoRmlsdGVyRXhjZXB0aW9uKCkgeworICAgICAgICBSZXNwb25zZSByID0gdGFyZ2V0KCJleGNlcHRpb24iKS5wYXRoKCJtYXRjaGVkIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyLmhhc0VudGl0eSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJuYW1lQm91bmRSZXF1ZXN0LW1hcHBlZFRlc3RFeGNlcHRpb24tbmFtZUJvdW5kUmVzcG9uc2UtZ2xvYmFsUmVzcG9uc2UiLCByLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQE5hbWVCb3VuZEFib3J0UmVzcG9uc2UKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBYm9ydFJlc3BvbnNlRml0bGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXIgeworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFCT1JUX0ZJTFRFUl9URVNUX1BBU1NFRCA9ICJhYm9ydC1maWx0ZXItdGVzdC1wYXNzZWQiOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsIENvbnRhaW5lclJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBib29sZWFuIHBhc3NlZCA9IHRydWU7CisKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgLy8gY2hlY2tzIHRoYXQgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlzIHRocm93biB3aGVuIHNldHRpbmcgZW50aXR5IHN0cmVhbQorICAgICAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LnNldEVudGl0eVN0cmVhbShuZXcgSW5wdXRTdHJlYW0oKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgcGFzc2VkID0gZmFsc2U7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWFlKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGlhZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIC8vIGNoZWNrcyB0aGF0IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpcyB0aHJvd24gd2hlbiBzZXR0aW5nIHNlY3VyaXR5IGNvbnRleHQKKyAgICAgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5zZXRTZWN1cml0eUNvbnRleHQobmV3IFNlY3VyaXR5Q29udGV4dCgpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBQcmluY2lwYWwgZ2V0VXNlclByaW5jaXBhbCgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzVXNlckluUm9sZShTdHJpbmcgcm9sZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzU2VjdXJlKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXV0aGVudGljYXRpb25TY2hlbWUoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlhZSkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihpYWUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAvLyBjaGVja3MgdGhhdCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaXMgdGhyb3duIHdoZW4gYWJvcnRpbmcgcmVxdWVzdAorICAgICAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LmFib3J0V2l0aChSZXNwb25zZS5zZXJ2ZXJFcnJvcigpLmJ1aWxkKCkpOworICAgICAgICAgICAgICAgIHBhc3NlZCA9IGZhbHNlOworICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlhZSkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihpYWUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3BvbnNlQ29udGV4dC5nZXRIZWFkZXJzKCkuYWRkKEFCT1JUX0ZJTFRFUl9URVNUX1BBU1NFRCwgcGFzc2VkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBOYW1lQm91bmRBYm9ydFJlcXVlc3QKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBYm9ydFJlcXVlc3RGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHsKKworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxURVJfQUJPUlRfRU5USVRZID0gImZpbHRlci1hYm9ydC1lbnRpdHkiOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5hYm9ydFdpdGgoUmVzcG9uc2Uub2soRklMVEVSX0FCT1JUX0VOVElUWSkuYnVpbGQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBATmFtZUJvdW5kRXhjZXB0aW9uSW5SZXF1ZXN0CisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRXhjZXB0aW9uUmVxdWVzdEZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIgeworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYQ0VQVElPTl9JTl9SRVFVRVNUX0ZJTFRFUiA9ICJleGNlcHRpb24taW4tcmVxdWVzdC1maWx0ZXIiOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVGVzdEV4Y2VwdGlvbihFWENFUFRJT05fSU5fUkVRVUVTVF9GSUxURVIpOworICAgICAgICB9CisgICAgfQorCisgICAgQE5hbWVCaW5kaW5nCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgICBwcml2YXRlIHN0YXRpYyBAaW50ZXJmYWNlIE5hbWVCb3VuZFJlc3BvbnNlIHt9CisKKyAgICBATmFtZUJpbmRpbmcKKyAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorICAgIHByaXZhdGUgc3RhdGljIEBpbnRlcmZhY2UgTmFtZUJvdW5kQWJvcnRSZXF1ZXN0IHt9CisKKyAgICBATmFtZUJpbmRpbmcKKyAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorICAgIHByaXZhdGUgc3RhdGljIEBpbnRlcmZhY2UgTmFtZUJvdW5kRXhjZXB0aW9uSW5SZXF1ZXN0IHt9CisKKyAgICBAUGF0aCgiYWJvcnQiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQWJvcnRSZXNwb25zZVJlc291cmNlIHsKKworICAgICAgICBAUGF0aCgicmVzcG9uc2UiKQorICAgICAgICBAR0VUCisgICAgICAgIEBOYW1lQm91bmRBYm9ydFJlc3BvbnNlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJnZXQiOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImFib3J0LWluLWZpbHRlciIpCisgICAgICAgIEBHRVQKKyAgICAgICAgQE5hbWVCb3VuZEFib3J0UmVzcG9uc2UKKyAgICAgICAgQE5hbWVCb3VuZEFib3J0UmVxdWVzdAorICAgICAgICBwdWJsaWMgU3RyaW5nIG5ldmVyQ2FsbGVkKCkgeworICAgICAgICAgICAgcmV0dXJuICJUaGlzIG1ldGhvZCB3aWxsIG5ldmVyIGJlIGNhbGxlZC4gUmVxdWVzdCB3aWxsIGJlIGFib3J0ZWQgaW4gYSByZXF1ZXN0IGZpbHRlci4iOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImV4Y2VwdGlvbiIpCisgICAgICAgIEBHRVQKKyAgICAgICAgQE5hbWVCb3VuZEFib3J0UmVzcG9uc2UKKyAgICAgICAgQE5hbWVCb3VuZEV4Y2VwdGlvbkluUmVxdWVzdAorICAgICAgICBwdWJsaWMgU3RyaW5nIGV4Y2VwdGlvbigpIHsKKyAgICAgICAgICAgIHJldHVybiAiVGhpcyBtZXRob2Qgd2lsbCBuZXZlciBiZSBjYWxsZWQuIEV4Y2VwdGlvbiB3aWxsIGJlIHRocm93biBpbiBhIHJlcXVlc3QgZmlsdGVyLiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBYm9ydFJlc3BvbnNlSW5SZXNwb25zZUZpbHRlcigpIHsKKyAgICAgICAgUmVzcG9uc2UgciA9IHRhcmdldCgiYWJvcnQiKS5wYXRoKCJyZXNwb25zZSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgci5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZ2V0Iiwgci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnROb3ROdWxsKHIuZ2V0SGVhZGVyU3RyaW5nKEFib3J0UmVzcG9uc2VGaXRsZXIuQUJPUlRfRklMVEVSX1RFU1RfUEFTU0VEKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidHJ1ZSIsIHIuZ2V0SGVhZGVyU3RyaW5nKEFib3J0UmVzcG9uc2VGaXRsZXIuQUJPUlRfRklMVEVSX1RFU1RfUEFTU0VEKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWJvcnRBYm9ydGVkUmVzcG9uc2VJblJlc3BvbnNlRmlsdGVyKCkgeworICAgICAgICBSZXNwb25zZSByID0gdGFyZ2V0KCJhYm9ydCIpLnBhdGgoImFib3J0LWluLWZpbHRlciIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgci5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhBYm9ydFJlcXVlc3RGaWx0ZXIuRklMVEVSX0FCT1JUX0VOVElUWSwgci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnROb3ROdWxsKHIuZ2V0SGVhZGVyU3RyaW5nKEFib3J0UmVzcG9uc2VGaXRsZXIuQUJPUlRfRklMVEVSX1RFU1RfUEFTU0VEKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidHJ1ZSIsIHIuZ2V0SGVhZGVyU3RyaW5nKEFib3J0UmVzcG9uc2VGaXRsZXIuQUJPUlRfRklMVEVSX1RFU1RfUEFTU0VEKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWJvcnRlZFJlc3BvbnNlRnJvbUV4Y2VwdGlvblJlc3BvbnNlKCkgeworICAgICAgICBSZXNwb25zZSByID0gdGFyZ2V0KCJhYm9ydCIpLnBhdGgoImV4Y2VwdGlvbiIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgci5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhFeGNlcHRpb25SZXF1ZXN0RmlsdGVyLkVYQ0VQVElPTl9JTl9SRVFVRVNUX0ZJTFRFUiArIFRlc3RFeGNlcHRpb25NYXBwZXIuUE9TVEZJWCwKKyAgICAgICAgICAgICAgICByLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoci5nZXRIZWFkZXJTdHJpbmcoQWJvcnRSZXNwb25zZUZpdGxlci5BQk9SVF9GSUxURVJfVEVTVF9QQVNTRUQpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0cnVlIiwgci5nZXRIZWFkZXJTdHJpbmcoQWJvcnRSZXNwb25zZUZpdGxlci5BQk9SVF9GSUxURVJfVEVTVF9QQVNTRUQpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9SZXNvdXJjZVJvdXRpbmdUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9SZXNvdXJjZVJvdXRpbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjI3NGM0YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL1Jlc291cmNlUm91dGluZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDkzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworCisvKioKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIFJlc291cmNlUm91dGluZ1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBQYXRoKCJhIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlQSB7CisgICAgICAgIEBQYXRoKCJiL2QiKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgLy8gdGhpcyBtZXRob2QgY2Fubm90IGJlIGNob3NlbiBhcyB0aGUgcmVxdWVzdCBwYXRoICJhL2IvLi4uIiBhbHdheXMgZmlyc3RseSBjaG9vc2UgdGhlIFJlc291cmNlQUIgYW5kIHJvdXRpbmcKKyAgICAgICAgICAgIC8vIHdpbGwgbmV2ZXIgY2hlY2sgdGhpcyByZXNvdXJjZS4gVGhpcyBpcyBiYXNlZCBvbiB0aGUgYWxnb3JpdGhtIGZyb20gdGhlIGpheC1ycyBzcGVjIDIKKyAgICAgICAgICAgIHJldHVybiAiYS9iL2QiOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInEiKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0USgpIHsKKyAgICAgICAgICAgIHJldHVybiAiYS9xIjsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgQFBhdGgoImEvYiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZUFCIHsKKyAgICAgICAgQFBhdGgoImMiKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJhL2IvYyI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlQS5jbGFzcywgUmVzb3VyY2VBQi5jbGFzcyk7CisgICAgfQorCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHN1Yldyb25nUGF0aCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiYS9iL2QiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDA0LCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjb3JyZWN0UGF0aCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiYS9iL2MiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImEvYi9jIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGNvcnJlY3RQYXRoMigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiYS9xIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJhL3EiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworfQorCisKKworCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9SZXNwb25zZVN0YXR1c1R5cGVUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9SZXNwb25zZVN0YXR1c1R5cGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M1OWFlOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL1Jlc3BvbnNlU3RhdHVzVHlwZVRlc3QuamF2YQpAQCAtMCwwICsxLDI4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5hcGFjaGUuY29ubmVjdG9yLkFwYWNoZUNvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseS5jb25uZWN0b3IuR3JpenpseUNvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5ncml6emx5LkdyaXp6bHlUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmlubWVtb3J5LkluTWVtb3J5VGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5qZGtodHRwLkpka0h0dHBTZXJ2ZXJUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNpbXBsZS5TaW1wbGVUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5TdWl0ZTsKKworLyoqCisgKiBUZXN0cyBjdXN0b20gcmVzcG9uc2Ugc3RhdHVzIHJlYXNvbiBwaHJhc2Ugd2l0aCBqZXJzZXkgY29udGFpbmVycyBhbmQgY29ubmVjdG9ycy4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK0BSdW5XaXRoKFN1aXRlLmNsYXNzKQorQFN1aXRlLlN1aXRlQ2xhc3Nlcyh7UmVzcG9uc2VTdGF0dXNUeXBlVGVzdC5Jbk1lbW9yeVRlc3QuY2xhc3MsCisgICAgICAgIFJlc3BvbnNlU3RhdHVzVHlwZVRlc3QuR3JpenpseUNvbnRhaW5lckdyaXp6bHlDb25uZWN0b3JUZXN0LmNsYXNzLAorICAgICAgICBSZXNwb25zZVN0YXR1c1R5cGVUZXN0LkdyaXp6bHlDb250YWluZXJBcGFjaGVDb25uZWN0b3JUZXN0LmNsYXNzLAorICAgICAgICBSZXNwb25zZVN0YXR1c1R5cGVUZXN0LlNpbXBsZUNvbnRhaW5lckh0dHBVcmxDb25uZWN0b3JUZXN0LmNsYXNzfSkKK3B1YmxpYyBjbGFzcyBSZXNwb25zZVN0YXR1c1R5cGVUZXN0IHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQVNPTl9QSFJBU0UgPSAibXktcGhyYXNlIjsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5NZW1vcnlUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhUZXN0UmVzb3VyY2UuY2xhc3MpOworCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIG5ldyBJbk1lbW9yeVRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tKCkgeworICAgICAgICAgICAgX3Rlc3RDdXN0b20odGFyZ2V0KCkpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdEJhZFJlcXVlc3QoKSB7CisgICAgICAgICAgICBfdGVzdEJhZFJlcXVlc3QodGFyZ2V0KCkpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbUJhZFJlcXVlc3QoKSB7CisgICAgICAgICAgICAvLyB3aXRoIEluTWVtb3J5IGNvbnRhaW5lciBhbmQgY29ubmVjdG9yIHN0YXR1cyBpbmZvIHNob3VsZCBiZSB0cmFuc2ZlcnJlZCBhcyBpdCBpcyBwcm9kdWNlZC4KKyAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UvY3VzdG9tLWJhZC1yZXF1ZXN0IikucmVxdWVzdCgpLmdldCgpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnROdWxsKHJlc3BvbnNlLmdldFN0YXR1c0luZm8oKS5nZXRSZWFzb25QaHJhc2UoKSk7CisKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBHcml6emx5Q29udGFpbmVyR3JpenpseUNvbm5lY3RvclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFRlc3RSZXNvdXJjZS5jbGFzcyk7CisKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEdyaXp6bHlUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgICAgICBjb25maWcuY29ubmVjdG9yUHJvdmlkZXIobmV3IEdyaXp6bHlDb25uZWN0b3JQcm92aWRlcigpKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbSgpIHsKKyAgICAgICAgICAgIF90ZXN0Q3VzdG9tKHRhcmdldCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RCYWRSZXF1ZXN0KCkgeworICAgICAgICAgICAgX3Rlc3RCYWRSZXF1ZXN0KHRhcmdldCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21CYWRSZXF1ZXN0KCkgeworICAgICAgICAgICAgX3Rlc3RDdXN0b21CYWRSZXF1ZXN0KHRhcmdldCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgR3JpenpseUNvbnRhaW5lckFwYWNoZUNvbm5lY3RvclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFRlc3RSZXNvdXJjZS5jbGFzcyk7CisKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICAgICAgY29uZmlnLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBBcGFjaGVDb25uZWN0b3JQcm92aWRlcigpKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbSgpIHsKKyAgICAgICAgICAgIF90ZXN0Q3VzdG9tKHRhcmdldCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RCYWRSZXF1ZXN0KCkgeworICAgICAgICAgICAgX3Rlc3RCYWRSZXF1ZXN0KHRhcmdldCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21CYWRSZXF1ZXN0KCkgeworICAgICAgICAgICAgX3Rlc3RDdXN0b21CYWRSZXF1ZXN0KHRhcmdldCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2ltcGxlQ29udGFpbmVySHR0cFVybENvbm5lY3RvclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFRlc3RSZXNvdXJjZS5jbGFzcyk7CisKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFNpbXBsZVRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tKCkgeworICAgICAgICAgICAgX3Rlc3RDdXN0b20odGFyZ2V0KCkpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdEJhZFJlcXVlc3QoKSB7CisgICAgICAgICAgICBfdGVzdEJhZFJlcXVlc3QodGFyZ2V0KCkpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbUJhZFJlcXVlc3QoKSB7CisgICAgICAgICAgICBfdGVzdEN1c3RvbUJhZFJlcXVlc3QodGFyZ2V0KCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKZGtIdHRwQ29udGFpbmVySHR0cFVybENvbm5lY3RvclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFRlc3RSZXNvdXJjZS5jbGFzcyk7CisKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEpka0h0dHBTZXJ2ZXJUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgQElnbm9yZSgiSmRrIGh0dHAgY29udGFpbmVyIGRvZXMgbm90IHN1cHBvcnQgY3VzdG9tIHJlc3BvbnNlIHJlYXNvbiBwaHJhc2VzLiIpCisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b20oKSB7CisgICAgICAgICAgICBfdGVzdEN1c3RvbSh0YXJnZXQoKSk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0QmFkUmVxdWVzdCgpIHsKKyAgICAgICAgICAgIF90ZXN0QmFkUmVxdWVzdCh0YXJnZXQoKSk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tQmFkUmVxdWVzdCgpIHsKKyAgICAgICAgICAgIF90ZXN0Q3VzdG9tQmFkUmVxdWVzdCh0YXJnZXQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJjdXN0b20iKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgdGVzdFN0YXR1c1R5cGUoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKG5ldyBDdXN0b200MjhUeXBlKCkpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJiYWQtcmVxdWVzdCIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBiYWRSZXF1ZXN0KCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyhSZXNwb25zZS5TdGF0dXMuQkFEX1JFUVVFU1QpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJjdXN0b20tYmFkLXJlcXVlc3QiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgY3VzdG9tQmFkUmVxdWVzdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMobmV3IEN1c3RvbUJhZFJlcXVlc3RXaXRob3V0UmVhc29uVHlwZSgpKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEN1c3RvbTQyOFR5cGUgaW1wbGVtZW50cyBSZXNwb25zZS5TdGF0dXNUeXBlIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0U3RhdHVzQ29kZSgpIHsKKyAgICAgICAgICAgIHJldHVybiA0Mjg7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRSZWFzb25QaHJhc2UoKSB7CisgICAgICAgICAgICByZXR1cm4gUkVBU09OX1BIUkFTRTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UuU3RhdHVzLkZhbWlseSBnZXRGYW1pbHkoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2UuU3RhdHVzLkZhbWlseS5DTElFTlRfRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEN1c3RvbUJhZFJlcXVlc3RXaXRob3V0UmVhc29uVHlwZSBpbXBsZW1lbnRzIFJlc3BvbnNlLlN0YXR1c1R5cGUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBnZXRTdGF0dXNDb2RlKCkgeworICAgICAgICAgICAgcmV0dXJuIDQwMDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFJlYXNvblBocmFzZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNwb25zZS5TdGF0dXMuRmFtaWx5IGdldEZhbWlseSgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5TdGF0dXMuRmFtaWx5LkNMSUVOVF9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBfdGVzdEN1c3RvbShXZWJUYXJnZXQgdGFyZ2V0KSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnBhdGgoInJlc291cmNlL2N1c3RvbSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MjgsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhSRUFTT05fUEhSQVNFLCByZXNwb25zZS5nZXRTdGF0dXNJbmZvKCkuZ2V0UmVhc29uUGhyYXNlKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBfdGVzdEJhZFJlcXVlc3QoV2ViVGFyZ2V0IHRhcmdldCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5wYXRoKCJyZXNvdXJjZS9iYWQtcmVxdWVzdCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhSZXNwb25zZS5TdGF0dXMuQkFEX1JFUVVFU1QuZ2V0UmVhc29uUGhyYXNlKCksIHJlc3BvbnNlLmdldFN0YXR1c0luZm8oKS5nZXRSZWFzb25QaHJhc2UoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIF90ZXN0Q3VzdG9tQmFkUmVxdWVzdChXZWJUYXJnZXQgdGFyZ2V0KSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnBhdGgoInJlc291cmNlL2N1c3RvbS1iYWQtcmVxdWVzdCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhSZXNwb25zZS5TdGF0dXMuQkFEX1JFUVVFU1QuZ2V0UmVhc29uUGhyYXNlKCksIHJlc3BvbnNlLmdldFN0YXR1c0luZm8oKS5nZXRSZWFzb25QaHJhc2UoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvUnVudGltZUNvbmZpZ1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL1J1bnRpbWVDb25maWdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFlMGQxYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL1J1bnRpbWVDb25maWdUZXN0LmphdmEKQEAgLTAsMCArMSwxMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmVDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJlYWRlckludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SZWFkZXJJbnRlcmNlcHRvckNvbnRleHQ7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuSW50ZXJuYWxQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5ub3ROdWxsVmFsdWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIFJ1bnRpbWVDb25maWdUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiZ2V0IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRW1wdHlGZWF0dXJlIGltcGxlbWVudHMgRmVhdHVyZSB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZShmaW5hbCBGZWF0dXJlQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2xpZW50RmVhdHVyZSBpbXBsZW1lbnRzIEZlYXR1cmUgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmUoZmluYWwgRmVhdHVyZUNvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihDbGllbnRSZWFkZXJJbnRlcmNlcHRvci5jbGFzcyk7CisgICAgICAgICAgICBjb250ZXh0LnByb3BlcnR5KCJmb28iLCAiYmFyIik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2xpZW50UmVhZGVySW50ZXJjZXB0b3IgaW1wbGVtZW50cyBSZWFkZXJJbnRlcmNlcHRvciB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb25maWd1cmF0aW9uIGNvbmZpZzsKKworICAgICAgICBASW5qZWN0CisgICAgICAgIHB1YmxpYyBDbGllbnRSZWFkZXJJbnRlcmNlcHRvcihmaW5hbCBDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlndXJhdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0IGFyb3VuZFJlYWRGcm9tKGZpbmFsIFJlYWRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoY29uZmlnLmlzUmVnaXN0ZXJlZChDbGllbnRGZWF0dXJlLmNsYXNzKSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGNvbmZpZy5pc1JlZ2lzdGVyZWQoQ2xpZW50UmVhZGVySW50ZXJjZXB0b3IuY2xhc3MpKTsKKworICAgICAgICAgICAgYXNzZXJ0VGhhdChjb25maWcuZ2V0UHJvcGVydGllcygpLnNpemUoKSwgaXMoMikpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChjb25maWcuZ2V0UHJvcGVydHkoImZvbyIpLnRvU3RyaW5nKCksIGlzKCJiYXIiKSk7CisKKyAgICAgICAgICAgIC8vIEpzb25GZWF0dXJlCisgICAgICAgICAgICBhc3NlcnRUaGF0KGNvbmZpZy5nZXRQcm9wZXJ0eShJbnRlcm5hbFByb3BlcnRpZXMuSlNPTl9GRUFUVVJFX0NMSUVOVCksIG5vdE51bGxWYWx1ZSgpKTsKKworICAgICAgICAgICAgLy8gTWV0YUluZkF1dG9EaXNjb3ZlcmFibGUKKyAgICAgICAgICAgIGFzc2VydFRoYXQoY29uZmlnLmdldEluc3RhbmNlcygpLnNpemUoKSwgaXMoMSkpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWcuaXNFbmFibGVkKENsaWVudEZlYXR1cmUuY2xhc3MpKTsKKworICAgICAgICAgICAgY29udGV4dC5nZXRIZWFkZXJzKCkuYWRkKCJDdXN0b21IZWFkZXIiLCAiQ2xpZW50UmVhZGVySW50ZXJjZXB0b3IiKTsKKworICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQucHJvY2VlZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UnVudGltZUNsaWVudENvbmZpZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCk7CisKKyAgICAgICAgdGFyZ2V0LnJlZ2lzdGVyKENsaWVudEZlYXR1cmUuY2xhc3MpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoTWVkaWFUeXBlLldJTERDQVJEX1RZUEUpLmdldChSZXNwb25zZS5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHRhcmdldC5nZXRDb25maWd1cmF0aW9uKCkuZ2V0Q2xhc3NlcygpLnNpemUoKSk7CisgICAgICAgIGFzc2VydFRydWUodGFyZ2V0LmdldENvbmZpZ3VyYXRpb24oKS5pc1JlZ2lzdGVyZWQoQ2xpZW50RmVhdHVyZS5jbGFzcykpOworICAgICAgICBhc3NlcnRUcnVlKHRhcmdldC5nZXRDb25maWd1cmF0aW9uKCkuZ2V0SW5zdGFuY2VzKCkuaXNFbXB0eSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSh0YXJnZXQuZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnRpZXMoKS5pc0VtcHR5KCkpOworICAgICAgICBhc3NlcnRGYWxzZSh0YXJnZXQuZ2V0Q29uZmlndXJhdGlvbigpLmlzRW5hYmxlZChDbGllbnRGZWF0dXJlLmNsYXNzKSk7CisKKyAgICAgICAgV2ViVGFyZ2V0IHQgPSB0YXJnZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHQuZ2V0Q29uZmlndXJhdGlvbigpLmdldENsYXNzZXMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRGYWxzZSh0LmdldENvbmZpZ3VyYXRpb24oKS5pc1JlZ2lzdGVyZWQoQ2xpZW50RmVhdHVyZS5jbGFzcykpOworICAgICAgICBhc3NlcnRUcnVlKHQuZ2V0Q29uZmlndXJhdGlvbigpLmdldEluc3RhbmNlcygpLmlzRW1wdHkoKSk7CisgICAgICAgIGFzc2VydFRydWUodC5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UHJvcGVydGllcygpLmlzRW1wdHkoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKHQuZ2V0Q29uZmlndXJhdGlvbigpLmlzRW5hYmxlZChDbGllbnRGZWF0dXJlLmNsYXNzKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXQiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkNsaWVudFJlYWRlckludGVyY2VwdG9yIiwgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJDdXN0b21IZWFkZXIiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvU2VjdXJpdHlDb250ZXh0RmlsdGVyVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvU2VjdXJpdHlDb250ZXh0RmlsdGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYzdkMmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9TZWN1cml0eUNvbnRleHRGaWx0ZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5QcmVNYXRjaGluZzsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlNlY3VyaXR5Q29udGV4dDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBFbmQgdG8gZW5kIHRlc3QgY2xhc3MgZm9yIHRlc3Rpbmcgc2VjdXJpdHkgY29udGV4dCBpbiB0aGUgRmlsdGVyIGFuZAorICogcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgY2xhc3MgU2VjdXJpdHlDb250ZXh0RmlsdGVyVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU5DSVBBTF9OQU1FID0gInRlc3RfcHJpbmNpcGFsX3NldEJ5RmlsdGVyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0tJUF9GSUxURVIgPSAic2tpcEZpbHRlciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFBSSU5DSVBBTF9JU19OVUxMID0gInByaW5jaXBhbElzTnVsbCI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFNlY3VyaXR5Q29udGV4dEZpbHRlci5jbGFzcywgUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgc2VjdXJpdHkgY29udGV4dCBjb250YWluZXIgcmVxdWVzdCBmaWx0ZXIuCisgICAgICovCisgICAgQFByZU1hdGNoaW5nCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTZWN1cml0eUNvbnRleHRGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHsKKworICAgICAgICAvLyBUT0RPOiB3b24ndCB3b3JrIHVudGlsIHdlIGhhdmUgcHJveGlhYmxlIHNjb3BlCisvLyAgICAgICAgQENvbnRleHQKKy8vICAgICAgICBTZWN1cml0eUNvbnRleHQgc2VjdXJpdHlDb250ZXh0OworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoY29udGV4dC5nZXRTZWN1cml0eUNvbnRleHQoKSk7CisKKyAgICAgICAgICAgIC8vIHRlc3QgaW5qZWN0aW9ucworICAgICAgICAgICAgLy8gVE9ETzogd29uJ3Qgd29yayB1bnRpbCBTZWN1cml0eUNvbnRleHQgaXMgcHJveGlhYmxlCisvLyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoY29udGV4dC5nZXRTZWN1cml0eUNvbnRleHQoKSwgc2VjdXJpdHlDb250ZXh0KTsKKworICAgICAgICAgICAgU3RyaW5nIGhlYWRlciA9IGNvbnRleHQuZ2V0SGVhZGVycygpLmdldEZpcnN0KFNLSVBfRklMVEVSKTsKKyAgICAgICAgICAgIGlmICgidHJ1ZSIuZXF1YWxzKGhlYWRlcikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnRleHQuc2V0U2VjdXJpdHlDb250ZXh0KG5ldyBTZWN1cml0eUNvbnRleHQoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNVc2VySW5Sb2xlKFN0cmluZyByb2xlKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1NlY3VyZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBQcmluY2lwYWwgZ2V0VXNlclByaW5jaXBhbCgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcmluY2lwYWwoKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQUklOQ0lQQUxfTkFNRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEF1dGhlbnRpY2F0aW9uU2NoZW1lKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIFNlY3VyaXR5Q29udGV4dCBpbiBmaWx0ZXIuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBUaHJvd24gd2hlbiByZXF1ZXN0IHByb2Nlc3NpbmcgZmFpbHMgaW4gdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VjdXJpdHlDb250ZXh0RmlsdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgidGVzdCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBTdHJpbmcgZW50aXR5ID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoUFJJTkNJUEFMX05BTUUsIGVudGl0eSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgU2VjdXJpdHlDb250ZXh0IGluIGZpbHRlci4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIFRocm93biB3aGVuIHJlcXVlc3QgcHJvY2Vzc2luZyBmYWlscyBpbiB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb250YWluZXJTZWN1cml0eUNvbnRleHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0IikucmVxdWVzdCgpLmhlYWRlcihTS0lQX0ZJTFRFUiwgInRydWUiKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBTdHJpbmcgZW50aXR5ID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSghZW50aXR5LmVxdWFscyhQUklOQ0lQQUxfTkFNRSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgcmVzb3VyY2UgY2xhc3MuCisgICAgICovCisgICAgQFBhdGgoInRlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUZXN0IHJlc291cmNlIG1ldGhvZC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNyYyBjb250YWluZXIgcmVxdWVzdCBjb250ZXh0LgorICAgICAgICAgKiBAcmV0dXJuIFN0cmluZyByZXNwb25zZSB3aXRoIHByaW5jaXBhbCBuYW1lLgorICAgICAgICAgKi8KKworICAgICAgICAvLyBUT0RPOiBpbmplY3QgU2VjdXJpdHlDb250ZXh0IGRpcmVjdGx5IG9uY2UgSkVSU0VZLTEyODIgaXMgZml4ZWQKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFByaW5jaXBhbChAQ29udGV4dCBDb250YWluZXJSZXF1ZXN0Q29udGV4dCBjcmMpIHsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGNyYy5nZXRTZWN1cml0eUNvbnRleHQoKSk7CisgICAgICAgICAgICBQcmluY2lwYWwgdXNlclByaW5jaXBhbCA9IGNyYy5nZXRTZWN1cml0eUNvbnRleHQoKS5nZXRVc2VyUHJpbmNpcGFsKCk7CisgICAgICAgICAgICByZXR1cm4gdXNlclByaW5jaXBhbCA9PSBudWxsID8gUFJJTkNJUEFMX0lTX05VTEwgOiB1c2VyUHJpbmNpcGFsLmdldE5hbWUoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL1NlcnZlckRlc3Ryb3lUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9TZXJ2ZXJEZXN0cm95VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyYTc2ZGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9TZXJ2ZXJEZXN0cm95VGVzdC5qYXZhCkBAIC0wLDAgKzEsMjM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlc3BvbnNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0OworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5QcmVEZXN0cm95OworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5BYnN0cmFjdEJpbmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuRGlzcG9zYWJsZVN1cHBsaWVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkFic3RyYWN0Q29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5Db250YWluZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5EZXBsb3ltZW50Q29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLm5vdE51bGxWYWx1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIEFzc2VydCB0aGF0IHByZSBkZXN0cm95IG1ldGhvZCBvbiBhcHBsaWNhdGlvbiwgcmVzb3VyY2VzIGFuZCBwcm92aWRlcnMgaXMgaW52b2tlZC4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBTZXJ2ZXJEZXN0cm95VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgQm9vbGVhbj4gZGVzdHJveWVkID0gbmV3IEhhc2hNYXA8PigpOworCisgICAgcHJpdmF0ZSBSZWxvYWRlciByZWxvYWRlcjsKKworICAgIEBPdmVycmlkZQorICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBkZXN0cm95ZWQuY2xlYXIoKTsKKyAgICAgICAgZGVzdHJveWVkLnB1dCgiYXBwbGljYXRpb24iLCBmYWxzZSk7CisgICAgICAgIGRlc3Ryb3llZC5wdXQoInNpbmdsZXRvbi1yZXNvdXJjZSIsIGZhbHNlKTsKKyAgICAgICAgZGVzdHJveWVkLnB1dCgiZmlsdGVyIiwgZmFsc2UpOworICAgICAgICBkZXN0cm95ZWQucHV0KCJ3cml0ZXIiLCBmYWxzZSk7CisgICAgICAgIGRlc3Ryb3llZC5wdXQoInNpbmdsZXRvbi1mYWN0b3J5IiwgZmFsc2UpOworICAgICAgICBkZXN0cm95ZWQucHV0KCJmZWF0dXJlIiwgZmFsc2UpOworCisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIEBTaW5nbGV0b24KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJyZXNvdXJjZSI7CisgICAgICAgIH0KKworICAgICAgICBAUHJlRGVzdHJveQorICAgICAgICBwdWJsaWMgdm9pZCBwcmVEZXN0cm95KCkgeworICAgICAgICAgICAgZGVzdHJveWVkLnB1dCgic2luZ2xldG9uLXJlc291cmNlIiwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15RmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoZmluYWwgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb250YWluZXJSZXNwb25zZUNvbnRleHQgcmVzcG9uc2VDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LmdldEhlYWRlcnMoKS5wdXRTaW5nbGUoImZvbyIsICJiYXIiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQcmVEZXN0cm95CisgICAgICAgIHB1YmxpYyB2b2lkIHByZURlc3Ryb3koKSB7CisgICAgICAgICAgICBkZXN0cm95ZWQucHV0KCJmaWx0ZXIiLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlXcml0ZXIgaW1wbGVtZW50cyBXcml0ZXJJbnRlcmNlcHRvciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGFyb3VuZFdyaXRlVG8oZmluYWwgV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgY29udGV4dC5zZXRFbnRpdHkoIndyaXRlci0iICsgY29udGV4dC5nZXRFbnRpdHkoKSk7CisgICAgICAgICAgICBjb250ZXh0LnByb2NlZWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQcmVEZXN0cm95CisgICAgICAgIHB1YmxpYyB2b2lkIHByZURlc3Ryb3koKSB7CisgICAgICAgICAgICBkZXN0cm95ZWQucHV0KCJ3cml0ZXIiLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlBcHBsaWNhdGlvbiBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKworICAgICAgICBAUHJlRGVzdHJveQorICAgICAgICBwdWJsaWMgdm9pZCBwcmVEZXN0cm95KCkgeworICAgICAgICAgICAgZGVzdHJveWVkLnB1dCgiYXBwbGljYXRpb24iLCB0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QoCisgICAgICAgICAgICAgICAgICAgIFJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICBNeUZpbHRlci5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgTXlXcml0ZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgIE15Q29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgIE15RmVhdHVyZS5jbGFzcykuc3RyZWFtKCkuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTZXQ8T2JqZWN0PiBnZXRTaW5nbGV0b25zKCkgeworICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbihuZXcgQWJzdHJhY3RCaW5kZXIoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICAgICAgICAgICAgICBiaW5kRmFjdG9yeShTaW5nbGV0b25GYWN0b3J5LmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50byhTaW5nbGV0b25JbnN0YW5jZS5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW4oU2luZ2xldG9uLmNsYXNzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2luZ2xldG9uSW5zdGFuY2UgeworCisgICAgICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7CisgICAgICAgICAgICBkZXN0cm95ZWQucHV0KCJzaW5nbGV0b24tZmFjdG9yeSIsIHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTaW5nbGV0b25GYWN0b3J5IGltcGxlbWVudHMgRGlzcG9zYWJsZVN1cHBsaWVyPFNpbmdsZXRvbkluc3RhbmNlPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTaW5nbGV0b25JbnN0YW5jZSBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFNpbmdsZXRvbkluc3RhbmNlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZShmaW5hbCBTaW5nbGV0b25JbnN0YW5jZSBpbnN0YW5jZSkgeworICAgICAgICAgICAgaW5zdGFuY2UuZGlzcG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVsb2FkZXIgZXh0ZW5kcyBBYnN0cmFjdENvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyIHsKKworICAgICAgICBDb250YWluZXIgY29udGFpbmVyOworCisgICAgICAgIHB1YmxpYyB2b2lkIHJlbG9hZChmaW5hbCBSZXNvdXJjZUNvbmZpZyBjb25maWcpIHsKKyAgICAgICAgICAgIGNvbnRhaW5lci5yZWxvYWQoY29uZmlnKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0dXAoZmluYWwgQ29udGFpbmVyIGNvbnRhaW5lcikgeworICAgICAgICAgICAgdGhpcy5jb250YWluZXIgPSBjb250YWluZXI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15Q29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXIgZXh0ZW5kcyBBYnN0cmFjdENvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyIHsKKworICAgICAgICBASW5qZWN0CisgICAgICAgIHByaXZhdGUgU2luZ2xldG9uSW5zdGFuY2UgaW5zdGFuY2U7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uU2h1dGRvd24oZmluYWwgQ29udGFpbmVyIGNvbnRhaW5lcikgeworICAgICAgICAgICAgYXNzZXJ0VGhhdChpbnN0YW5jZSwgbm90TnVsbFZhbHVlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUZlYXR1cmUgaW1wbGVtZW50cyBGZWF0dXJlIHsKKworICAgICAgICBAUHJlRGVzdHJveQorICAgICAgICBwdWJsaWMgdm9pZCBwcmVEZXN0cm95KCkgeworICAgICAgICAgICAgZGVzdHJveWVkLnB1dCgiZmVhdHVyZSIsIHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZShmaW5hbCBGZWF0dXJlQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBEZXBsb3ltZW50Q29udGV4dCBjb25maWd1cmVEZXBsb3ltZW50KCkgeworICAgICAgICByZWxvYWRlciA9IG5ldyBSZWxvYWRlcigpOworCisgICAgICAgIHJldHVybiBEZXBsb3ltZW50Q29udGV4dC5uZXdJbnN0YW5jZShSZXNvdXJjZUNvbmZpZy5mb3JBcHBsaWNhdGlvbkNsYXNzKE15QXBwbGljYXRpb24uY2xhc3MpLnJlZ2lzdGVyKHJlbG9hZGVyKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwbGljYXRpb25SZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGlzKCJ3cml0ZXItcmVzb3VyY2UiKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RyaW5nSGVhZGVycygpLmdldEZpcnN0KCJmb28iKSwgaXMoImJhciIpKTsKKworICAgICAgICBjaGVja0Rlc3Ryb3llZChmYWxzZSk7CisgICAgICAgIHJlbG9hZGVyLnJlbG9hZChuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MpKTsKKyAgICAgICAgY2hlY2tEZXN0cm95ZWQodHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrRGVzdHJveWVkKGZpbmFsIGJvb2xlYW4gc2hvdWxkQmVEZXN0cm95ZWQpIHsKKyAgICAgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8U3RyaW5nLCBCb29sZWFuPiBlbnRyeSA6IGRlc3Ryb3llZC5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGVudHJ5LmdldEtleSgpICsgICIgc2hvdWxkIiArIChzaG91bGRCZURlc3Ryb3llZCA/ICIiIDogIiBub3QiKSArICIgYmUgZGVzdHJveWVkIiwKKyAgICAgICAgICAgICAgICAgICAgZW50cnkuZ2V0VmFsdWUoKSwgaXMoc2hvdWxkQmVEZXN0cm95ZWQpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL1NpbmdsZXRvblByb3ZpZGVyVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvU2luZ2xldG9uUHJvdmlkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZlZTRhMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL1NpbmdsZXRvblByb3ZpZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjUyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLkhlYWRlclBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlBVVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LkNvbnRleHRSZXNvbHZlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuRXhjZXB0aW9uTWFwcGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuQWJzdHJhY3RNZXNzYWdlUmVhZGVyV3JpdGVyUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5Db250ZXh0UmVzb2x2ZXJzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogQ2xhc3MgdGVzdGluZyB0aGF0IHByb3ZpZGVycyBhcmUgbWFuYWdlZCBjb3JyZWN0bHkgaW4gdGhlIHNpbmdsZXRvbiBzY29wZS4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBTaW5nbGV0b25Qcm92aWRlclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFNpbmdsZXRvblJlc291cmNlLmNsYXNzLCBBbnlGaWx0ZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgRXhjZXB0aW9uTWFwcGluZ1Byb3ZpZGVyLmNsYXNzLCBTaW5nbGV0b25TdHJpbmdNZXNzYWdlUHJvdmlkZXIuY2xhc3MsIE15Q29udGV4dFJlc29sdmVyLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGZpbHRlclRlc3QoKSB7CisgICAgICAgIC8vIE5PVEU6IEV4cGxpY2l0IGFjY2VwdGVkTWVkaWEgdHlwZSBkZWZpbml0aW9uIGlzIG5vdCBuZWVkZWQgZm9yIEh0dHBVcmxDb25uZWN0b3IsIGFzIGl0IHNlbmRzIHNldmVyYWwgImRlZmF1bHQiIHR5cGVzCisgICAgICAgIC8vIHdoZW4gbm90IHNldCBkaXJlY3RseS4gRm9yIChzb21lKSBvdGhlciBjb25uZWN0b3JzIChuYW1lbHkgSmRrQ29ubmVjdG9yKSwgdGhpcyBpcyByZXF1aXJlZCwgYXMgdGhlIGluZmVycmVkIGFjY2VwdGVkCisgICAgICAgIC8vIG1lZGlhIHR5cGUgaXMgKi8qLCB3aGljaCB3b3VsZCBtYXRjaCB0aGUgcHJvdmlkZXIsIHRoYXQgcHJvZHVjZXMgdGV4dC90ZXN0LCB3aGljaCBpcyB3aGF0IHdlIGRvbid0IHdhbnQgaW4gdGhpcyBjYXNlLgorICAgICAgICBTdHJpbmcgc3RyOworICAgICAgICBzdHIgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZS9maWx0ZXIiKS5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikuZ2V0KCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZpbHRlcjoxIiwgc3RyKTsKKworICAgICAgICBzdHIgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZS9maWx0ZXIiKS5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikuZ2V0KCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZpbHRlcjoyIiwgc3RyKTsKKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZXhjZXB0aW9uTWFwcGVyVGVzdCgpIHsKKyAgICAgICAgLy8gTk9URTogRXhwbGljaXQgYWNjZXB0ZWRNZWRpYSB0eXBlIGRlZmluaXRpb24gaXMgbm90IG5lZWRlZCBmb3IgSHR0cFVybENvbm5lY3RvciwgYXMgaXQgc2VuZHMgc2V2ZXJhbCAiZGVmYXVsdCIgdHlwZXMKKyAgICAgICAgLy8gd2hlbiBub3Qgc2V0IGRpcmVjdGx5LiBGb3IgKHNvbWUpIG90aGVyIGNvbm5lY3RvcnMgKG5hbWVseSBKZGtDb25uZWN0b3IpLCB0aGlzIGlzIHJlcXVpcmVkLCBhcyB0aGUgaW5mZXJyZWQgYWNjZXB0ZWQKKyAgICAgICAgLy8gbWVkaWEgdHlwZSBpcyAqLyosIHdoaWNoIHdvdWxkIG1hdGNoIHRoZSBwcm92aWRlciwgdGhhdCBwcm9kdWNlcyB0ZXh0L3Rlc3QsIHdoaWNoIGlzIHdoYXQgd2UgZG9uJ3Qgd2FudCBpbiB0aGlzIGNhc2UuCisgICAgICAgIFN0cmluZyBzdHI7CisgICAgICAgIHN0ciA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlL2V4Y2VwdGlvbiIpLnJlcXVlc3QoInRleHQvcGxhaW4iKS5nZXQoKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygibWFwcGVyOjEiLCBzdHIpOworICAgICAgICBzdHIgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZS9leGNlcHRpb24iKS5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikuZ2V0KCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm1hcHBlcjoyIiwgc3RyKTsKKworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgbWVzc2FnZUJvZHlXcml0ZXJUZXN0KCkgeworICAgICAgICBTdHJpbmcgc3RyMTsKKyAgICAgICAgc3RyMSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlL21lc3NhZ2Vib2R5IikucmVxdWVzdCgidGV4dC90ZXN0IikuZ2V0KCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUcnVlKHN0cjEuZW5kc1dpdGgoIjoxIikpOworICAgICAgICBTdHJpbmcgc3RyMjsKKyAgICAgICAgc3RyMiA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlL21lc3NhZ2Vib2R5IikucmVxdWVzdCgidGV4dC90ZXN0IikuZ2V0KCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUcnVlKHN0cjIuZW5kc1dpdGgoIjoyIikpOworCisgICAgICAgIGFzc2VydEVxdWFscyhzdHIxLnN1YnN0cmluZygwLCBzdHIxLmxlbmd0aCgpIC0gMiksIHN0cjIuc3Vic3RyaW5nKDAsIHN0cjIubGVuZ3RoKCkgLSAyKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBtZXNzYWdlQm9keVJlYWRlclRlc3QoKSB7CisgICAgICAgIFN0cmluZyBzdHIxID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UvbWVzc2FnZWJvZHlyZWFkZXIiKS5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikKKyAgICAgICAgICAgICAgICAucHV0KEVudGl0eS5lbnRpdHkoImZyb20tY2xpZW50IiwgInRleHQvdGVzdCIpKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRydWUoc3RyMS5lbmRzV2l0aCgiOjEiKSk7CisgICAgICAgIFN0cmluZyBzdHIyID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UvbWVzc2FnZWJvZHlyZWFkZXIiKS5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikucHV0KEVudGl0eS5lbnRpdHkoImZyb20tY2xpZW50IiwKKyAgICAgICAgICAgICAgICAidGV4dC90ZXN0IikpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzdHIyLmVuZHNXaXRoKCI6MiIpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoc3RyMS5zdWJzdHJpbmcoMCwgc3RyMS5sZW5ndGgoKSAtIDIpLCBzdHIyLnN1YnN0cmluZygwLCBzdHIyLmxlbmd0aCgpIC0gMikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgY29udGV4dFJlc29sdmVyVGVzdCgpIHsKKyAgICAgICAgU3RyaW5nIHN0cjEgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZS9jb250ZXh0IikucmVxdWVzdCgidGV4dC9wbGFpbiIpLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb250ZXh0OjEiLCBzdHIxKTsKKworICAgICAgICBTdHJpbmcgc3RyMiA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlL2NvbnRleHQiKS5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikuZ2V0KCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbnRleHQ6MiIsIHN0cjIpOworICAgIH0KKworICAgIEBQYXRoKCJyZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTaW5nbGV0b25SZXNvdXJjZSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImZpbHRlciIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q291bnRlckZyb21GaWx0ZXIoQEhlYWRlclBhcmFtKCJjb3VudGVyIikgaW50IGNvdW50ZXIpIHsKKyAgICAgICAgICAgIHJldHVybiAiZmlsdGVyOiIgKyBjb3VudGVyOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiZXhjZXB0aW9uIikKKyAgICAgICAgcHVibGljIFN0cmluZyB0aHJvd0V4Y2VwdGlvbigpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBTaW5nbGV0b25UZXN0RXhjZXB0aW9uKCJ0ZXN0IGV4Y2VwdGlvbiIpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgibWVzc2FnZWJvZHkiKQorICAgICAgICBAUHJvZHVjZXMoInRleHQvdGVzdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgbWVzc2FnZUJvZHlUZXN0KCkgeworICAgICAgICAgICAgcmV0dXJuICJtZXNzYWdlYm9keToiOworICAgICAgICB9CisKKyAgICAgICAgQFBVVAorICAgICAgICBAUGF0aCgibWVzc2FnZWJvZHlyZWFkZXIiKQorICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgICAgICBAQ29uc3VtZXMoInRleHQvdGVzdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgbWVzc2FnZUJvZHlSZWFkZXJUZXN0KFN0cmluZyBlbnRpdHkpIHsKKyAgICAgICAgICAgIHJldHVybiAicHV0OiIgKyBlbnRpdHk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJjb250ZXh0IikKKyAgICAgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRlc3RDb250ZXh0UmVzb2x2ZXIoQENvbnRleHQgQ29udGV4dFJlc29sdmVycyByZXNvbHZlcnMpIHsKKyAgICAgICAgICAgIENvbnRleHRSZXNvbHZlcjxTdHJpbmc+IGNvbnRleHRSZXNvbHZlciA9IHJlc29sdmVycy5yZXNvbHZlKFN0cmluZy5jbGFzcywgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSk7CisgICAgICAgICAgICBTdHJpbmcgY29udGV4dCA9IGNvbnRleHRSZXNvbHZlci5nZXRDb250ZXh0KFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICByZXR1cm4gY29udGV4dDsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBbnlGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHsKKyAgICAgICAgcHJpdmF0ZSBpbnQgY291bnRlciA9IDE7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LmdldEhlYWRlcnMoKS5hZGQoImNvdW50ZXIiLCBTdHJpbmcudmFsdWVPZihjb3VudGVyKyspKTsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgQFByb3ZpZGVyCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeGNlcHRpb25NYXBwaW5nUHJvdmlkZXIgaW1wbGVtZW50cyBFeGNlcHRpb25NYXBwZXI8U2luZ2xldG9uVGVzdEV4Y2VwdGlvbj4geworICAgICAgICBwcml2YXRlIGludCBjb3VudGVyID0gMTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHRvUmVzcG9uc2UoU2luZ2xldG9uVGVzdEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoUmVzcG9uc2UuU3RhdHVzLklOVEVSTkFMX1NFUlZFUl9FUlJPUikuZW50aXR5KCJtYXBwZXI6IiArIGNvdW50ZXIrKykuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2luZ2xldG9uVGVzdEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworICAgICAgICBwdWJsaWMgU2luZ2xldG9uVGVzdEV4Y2VwdGlvbigpIHsKKyAgICAgICAgICAgIHN1cGVyKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU2luZ2xldG9uVGVzdEV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICAgICAgc3VwZXIobWVzc2FnZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUNvbnRleHRSZXNvbHZlciBpbXBsZW1lbnRzIENvbnRleHRSZXNvbHZlcjxTdHJpbmc+IHsKKyAgICAgICAgcHJpdmF0ZSBpbnQgaSA9IDE7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dChDbGFzczw/PiB0eXBlKSB7CisgICAgICAgICAgICBpZiAodHlwZSA9PSBTdHJpbmcuY2xhc3MpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gImNvbnRleHQ6IiArIGkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgQFByb2R1Y2VzKHsidGV4dC90ZXN0In0pCisgICAgQENvbnN1bWVzKHsidGV4dC90ZXN0In0pCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBTaW5nbGV0b25TdHJpbmdNZXNzYWdlUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VSZWFkZXJXcml0ZXJQcm92aWRlcjxTdHJpbmc+IHsKKyAgICAgICAgcHJpdmF0ZSBpbnQgY291bnRlciA9IDE7CisgICAgICAgIHByaXZhdGUgaW50IHJlYWRlckNvdW50ZXIgPSAxOworCisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbiBhbm5vdGF0aW9uc1tdLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSBTdHJpbmcuY2xhc3M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyByZWFkRnJvbSgKKyAgICAgICAgICAgICAgICBDbGFzczxTdHJpbmc+IHR5cGUsCisgICAgICAgICAgICAgICAgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb25zW10sCisgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIHJlYWRGcm9tQXNTdHJpbmcoZW50aXR5U3RyZWFtLCBtZWRpYVR5cGUpICsgdGhpcyArICI6IiArIHJlYWRlckNvdW50ZXIrKzsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uIGFubm90YXRpb25zW10sIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlID09IFN0cmluZy5jbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKFN0cmluZyBzLCBDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKAorICAgICAgICAgICAgICAgIFN0cmluZyB0LAorICAgICAgICAgICAgICAgIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb25zW10sCisgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHdyaXRlVG9Bc1N0cmluZyh0ICsgdGhpcyArICI6IiArIGNvdW50ZXIrKywgZW50aXR5U3RyZWFtLCBtZWRpYVR5cGUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvU2luZ2xldG9uUHJvdmlkZXJzUmVzb3VyY2VzVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvU2luZ2xldG9uUHJvdmlkZXJzUmVzb3VyY2VzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YTZmOGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9TaW5nbGV0b25Qcm92aWRlcnNSZXNvdXJjZXNUZXN0LmphdmEKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuSGVhZGVyUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlcXVlc3Q7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5QZXJMb29rdXA7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5JbmZsZWN0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90U2FtZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIFRlc3QgcmVzb3VyY2VzIHdoaWNoIGFsc28gYWN0cyBhcyBwcm92aWRlcnMuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgY2xhc3MgU2luZ2xldG9uUHJvdmlkZXJzUmVzb3VyY2VzVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2VTaW5nbGV0b24uY2xhc3MsIFJlc291cmNlTm90U2luZ2xldG9uLmNsYXNzKTsKKworICAgICAgICBmaW5hbCBSZXNvdXJjZS5CdWlsZGVyIHJlc291cmNlQnVpbGRlciA9IFJlc291cmNlLmJ1aWxkZXIoKTsKKyAgICAgICAgcmVzb3VyY2VCdWlsZGVyLm5hbWUoInByb2dyYW1tYXRpYyIpLnBhdGgoInByb2dyYW1tYXRpYyIpLmFkZE1ldGhvZCgiR0VUIikKKyAgICAgICAgICAgICAgICAuaGFuZGxlZEJ5KFJlc291cmNlUHJvZ3JhbW1hdGljTm90U2luZ2xldG9uLmNsYXNzKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucmVnaXN0ZXJSZXNvdXJjZXMocmVzb3VyY2VCdWlsZGVyLmJ1aWxkKCkpOworCisgICAgICAgIHJldHVybiByZXNvdXJjZUNvbmZpZzsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUFzRmlsdGVyKCkgeworICAgICAgICBTdHJpbmcgc3RyID0gdGFyZ2V0KCkucGF0aCgic2luZ2xldG9uIikucmVxdWVzdCgpLmhlYWRlcigic2luZ2xldG9uIiwgInNpbmdsZXRvbiIpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUcnVlKHN0ciwgc3RyLnN0YXJ0c1dpdGgoInRydWUvIikpOworICAgICAgICBTdHJpbmcgc3RyMiA9IHRhcmdldCgpLnBhdGgoInNpbmdsZXRvbiIpLnJlcXVlc3QoKS5oZWFkZXIoInNpbmdsZXRvbiIsICJzaW5nbGV0b24iKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzdHIyLCBzdHIyLnN0YXJ0c1dpdGgoInRydWUvIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoc3RyLCBzdHIyKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUFzRmlsdGVyQW5ub3RhdGVkUGVyTG9va3VwKCkgeworICAgICAgICBTdHJpbmcgc3RyID0gdGFyZ2V0KCkucGF0aCgicGVybG9va3VwIikucmVxdWVzdCgpLmhlYWRlcigibm90LXNpbmdsZXRvbiIsICJub3Qtc2luZ2xldG9uIikuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRydWUoc3RyLnN0YXJ0c1dpdGgoImZhbHNlLyIpKTsKKyAgICAgICAgU3RyaW5nIHN0cjIgPSB0YXJnZXQoKS5wYXRoKCJwZXJsb29rdXAiKS5yZXF1ZXN0KCkuaGVhZGVyKCJub3Qtc2luZ2xldG9uIiwgIm5vdC1zaW5nbGV0b24iKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzdHIyLnN0YXJ0c1dpdGgoImZhbHNlLyIpKTsKKyAgICAgICAgYXNzZXJ0Tm90U2FtZShzdHIsIHN0cjIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlUHJvZ3JhbW1hdGljKCkgeworICAgICAgICBTdHJpbmcgc3RyID0gdGFyZ2V0KCkucGF0aCgicHJvZ3JhbW1hdGljIikucmVxdWVzdCgpLmhlYWRlcigicHJvZ3JhbW1hdGljIiwgInByb2dyYW1tYXRpYyIpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUcnVlKHN0ci5zdGFydHNXaXRoKCJmYWxzZS8iKSk7CisgICAgICAgIFN0cmluZyBzdHIyID0gdGFyZ2V0KCkucGF0aCgicHJvZ3JhbW1hdGljIikucmVxdWVzdCgpLmhlYWRlcigicHJvZ3JhbW1hdGljIiwgInByb2dyYW1tYXRpYyIpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUcnVlKHN0cjIuc3RhcnRzV2l0aCgiZmFsc2UvIikpOworICAgICAgICBhc3NlcnROb3RTYW1lKHN0ciwgc3RyMik7CisgICAgfQorCisgICAgLy8gdGhpcyBzaG91bGQgYmUgc2luZ2xldG9uLCBpdCBtZWFucyB0aGUgc2FtZSBpbnN0YW5jZSBmb3IgdGhlIHVzYWdlIGFzIGEgZmlsdGVyIGFuZCBhcyBhbiByZXNvdXJjZQorICAgIEBQYXRoKCJzaW5nbGV0b24iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2VTaW5nbGV0b24gaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKHJlcXVlc3RDb250ZXh0LmdldEhlYWRlcnMoKS5jb250YWluc0tleSgic2luZ2xldG9uIikpIHsKKyAgICAgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5nZXRIZWFkZXJzKCkuYWRkKCJmaWx0ZXItY2xhc3MiLCB0aGlzLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldChASGVhZGVyUGFyYW0oImZpbHRlci1jbGFzcyIpIFN0cmluZyBmaWx0ZXJDbGFzcykgeworICAgICAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKFN0cmluZy52YWx1ZU9mKHRoaXMudG9TdHJpbmcoKS5lcXVhbHMoZmlsdGVyQ2xhc3MpKSArICIvIiArIHRoaXMudG9TdHJpbmcoKSArICI6IgorICAgICAgICAgICAgICAgICAgICArIGZpbHRlckNsYXNzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHRoaXMgc2hvdWxkIE5PVCBiZSBzaW5nbGV0b24sIGJlY2F1c2UgaXQgaXMgYW5ub3RhdGVkIGFzIHBlciBsb29rdXAKKyAgICBAUGF0aCgicGVybG9va3VwIikKKyAgICBAUGVyTG9va3VwCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZU5vdFNpbmdsZXRvbiBpbXBsZW1lbnRzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAocmVxdWVzdENvbnRleHQuZ2V0SGVhZGVycygpLmNvbnRhaW5zS2V5KCJub3Qtc2luZ2xldG9uIikpIHsKKyAgICAgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5nZXRIZWFkZXJzKCkuYWRkKCJmaWx0ZXItY2xhc3MiLCB0aGlzLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldChASGVhZGVyUGFyYW0oImZpbHRlci1jbGFzcyIpIFN0cmluZyBmaWx0ZXJDbGFzcykgeworICAgICAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKFN0cmluZy52YWx1ZU9mKHRoaXMudG9TdHJpbmcoKS5lcXVhbHMoZmlsdGVyQ2xhc3MpKSArICIvIiArIHRoaXMudG9TdHJpbmcoKSArICI6IgorICAgICAgICAgICAgICAgICAgICArIGZpbHRlckNsYXNzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHNob3VsZCBub3QgYmUgYSBzaW5nbGV0b24gYXMgdGhpcyBpcyBvbmx5IHByb2dyYW1tYXRpYyByZXNvdXJjZSBhbmQgaXMgbm90IHJlZ2lzdGVyZWQgYXMgcHJvdmlkZXIKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlUHJvZ3JhbW1hdGljTm90U2luZ2xldG9uIGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5mbGVjdG9yPFJlcXVlc3QsIFJlc3BvbnNlPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0Q29udGV4dC5nZXRIZWFkZXJzKCkuY29udGFpbnNLZXkoInByb2dyYW1tYXRpYyIpKSB7CisgICAgICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuZ2V0SGVhZGVycygpLmFkZCgiZmlsdGVyLWNsYXNzIiwgdGhpcy50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0plcnNleUNvbnRhaW5lclJlcXVlc3RDb250ZXh0CisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBhcHBseShSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgICAgIFN0cmluZyBmaWx0ZXJDbGFzcyA9ICgoQ29udGFpbmVyUmVxdWVzdENvbnRleHQpIHJlcXVlc3QpLmdldEhlYWRlcnMoKS5nZXRGaXJzdCgiZmlsdGVyLWNsYXNzIik7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soU3RyaW5nLnZhbHVlT2YoU3RyaW5nLnZhbHVlT2YodGhpcy50b1N0cmluZygpLmVxdWFscyhmaWx0ZXJDbGFzcykpICsgIi8iICsgdGhpcy50b1N0cmluZygpICsgIjoiCisgICAgICAgICAgICAgICAgICAgICsgZmlsdGVyQ2xhc3MpKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9TaW5nbGV0b25SZXNvdXJjZVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL1NpbmdsZXRvblJlc291cmNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNzNlMDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9TaW5nbGV0b25SZXNvdXJjZVRlc3QuamF2YQpAQCAtMCwwICsxLDM2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLkhlYWRlclBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVxdWVzdDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LlBlckxvb2t1cDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLkluZmxlY3RvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBDbGFzcyB0ZXN0aW5nIFJlc291cmNlcyBtYW5hZ2VkIGFzIHNpbmdsZXRvbnMuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgY2xhc3MgU2luZ2xldG9uUmVzb3VyY2VUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZygKKyAgICAgICAgICAgICAgICBTaW5nbGV0b25SZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBDaGlsZEluaGVyaXRzUGFyZW50QW5ub3RhdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICBDaGlsZEltcGxlbWVudHNJbnRlcmZhY2VBbm5vdGF0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgIFRlc3RSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBSZXF1ZXN0U2NvcGVSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBQZXJMb29rdXBTY29wZVJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIFNpbmdsZXRvblNjb3BlUmVzb3VyY2UuY2xhc3MpOworCisgICAgICAgIGZpbmFsIFJlc291cmNlLkJ1aWxkZXIgcmVzb3VyY2VCdWlsZGVyMSA9IFJlc291cmNlLmJ1aWxkZXIoKTsKKyAgICAgICAgcmVzb3VyY2VCdWlsZGVyMS5uYW1lKCJyZXNvdXJjZS1wcm9ncmFtbWF0aWMvaW5zdGFuY2UvIikucGF0aCgicHJvZ3JhbW1hdGljL2luc3RhbmNlLyIpLmFkZE1ldGhvZCgiR0VUIikKKyAgICAgICAgICAgICAgICAuaGFuZGxlZEJ5KG5ldyBJbmZsZWN0b3I8Q29udGFpbmVyUmVxdWVzdENvbnRleHQsIFJlc3BvbnNlPigpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSBpbnQgY291bnRlciA9IDE7CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBSZXNwb25zZSBhcHBseShDb250YWluZXJSZXF1ZXN0Q29udGV4dCBkYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soInByZy1pbnN0YW5jZToiICsgY291bnRlcisrKS5idWlsZCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVyUmVzb3VyY2VzKHJlc291cmNlQnVpbGRlcjEuYnVpbGQoKSk7CisKKyAgICAgICAgZmluYWwgUmVzb3VyY2UuQnVpbGRlciByZXNvdXJjZUJ1aWxkZXIyID0gUmVzb3VyY2UuYnVpbGRlcigpOworICAgICAgICByZXNvdXJjZUJ1aWxkZXIyLm5hbWUoInJlc291cmNlLXByb2dyYW1tYXRpYy9zaW5nbGV0b24vIikucGF0aCgicHJvZ3JhbW1hdGljL3NpbmdsZXRvbi8iKS5hZGRNZXRob2QoIkdFVCIpCisgICAgICAgICAgICAgICAgLmhhbmRsZWRCeShTaW5nbGV0b25Qcm9ncmFtbWF0aWMuY2xhc3MpOworICAgICAgICByZXNvdXJjZUNvbmZpZy5yZWdpc3RlclJlc291cmNlcyhyZXNvdXJjZUJ1aWxkZXIyLmJ1aWxkKCkpOworCisgICAgICAgIGZpbmFsIFJlc291cmNlLkJ1aWxkZXIgcmVzb3VyY2VCdWlsZGVyMyA9IFJlc291cmNlLmJ1aWxkZXIoKTsKKyAgICAgICAgcmVzb3VyY2VCdWlsZGVyMy5uYW1lKCJyZXNvdXJjZS1wcm9ncmFtbWF0aWMvcmV1c2VkLXNpbmdsZXRvbi8iKS5wYXRoKCJwcm9ncmFtbWF0aWMvcmV1c2VkLXNpbmdsZXRvbi8iKS5hZGRNZXRob2QoIkdFVCIpCisgICAgICAgICAgICAgICAgLmhhbmRsZWRCeShTdWJSZXNvdXJjZVNpbmdsZXRvbi5jbGFzcyk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVyUmVzb3VyY2VzKHJlc291cmNlQnVpbGRlcjMuYnVpbGQoKSk7CisKKyAgICAgICAgZmluYWwgUmVzb3VyY2UuQnVpbGRlciByZXNvdXJjZUJ1aWxkZXI0ID0gUmVzb3VyY2UuYnVpbGRlcigpOworICAgICAgICByZXNvdXJjZUJ1aWxkZXI0Lm5hbWUoInJlc291cmNlLXByb2dyYW1tYXRpYy9ub3Qtc2luZ2xldG9uLyIpLnBhdGgoInByb2dyYW1tYXRpYy9ub3Qtc2luZ2xldG9uLyIpLmFkZE1ldGhvZCgiR0VUIikKKyAgICAgICAgICAgICAgICAuaGFuZGxlZEJ5KE5vdFNpbmdsZXRvblByb2dyYW1tYXRpYy5jbGFzcyk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVyUmVzb3VyY2VzKHJlc291cmNlQnVpbGRlcjQuYnVpbGQoKSk7CisKKyAgICAgICAgcmV0dXJuIHJlc291cmNlQ29uZmlnOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2luZ2xldG9uUmVzb3VyY2VUZXN0KCkgeworICAgICAgICBTdHJpbmcgc3RyOworICAgICAgICBzdHIgPSB0YXJnZXQoKS5wYXRoKCJzaW5nbGV0b24iKS5yZXF1ZXN0KCkuZ2V0KCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoInJlczoxIiwgc3RyKTsKKworICAgICAgICBzdHIgPSB0YXJnZXQoKS5wYXRoKCJzaW5nbGV0b24iKS5yZXF1ZXN0KCkuZ2V0KCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoInJlczoyIiwgc3RyKTsKKworICAgICAgICBzdHIgPSB0YXJnZXQoKS5wYXRoKCJzaW5nbGV0b24vc3ViIikucmVxdWVzdCgpLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzdWI6MSIsIHN0cik7CisKKyAgICAgICAgc3RyID0gdGFyZ2V0KCkucGF0aCgic2luZ2xldG9uIikucmVxdWVzdCgpLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZXM6MyIsIHN0cik7CisKKyAgICAgICAgc3RyID0gdGFyZ2V0KCkucGF0aCgic2luZ2xldG9uL3N1YiIpLnJlcXVlc3QoKS5nZXQoKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygic3ViOjIiLCBzdHIpOworCisgICAgICAgIHN0ciA9IHRhcmdldCgpLnBhdGgoInNpbmdsZXRvbi9zdWItbm90LXNpbmdsZXRvbiIpLnJlcXVlc3QoKS5nZXQoKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygibm90LXNpbmdsZXRvbjoxIiwgc3RyKTsKKworICAgICAgICBzdHIgPSB0YXJnZXQoKS5wYXRoKCJzaW5nbGV0b24vc3ViLW5vdC1zaW5nbGV0b24iKS5yZXF1ZXN0KCkuZ2V0KCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm5vdC1zaW5nbGV0b246MSIsIHN0cik7CisKKyAgICAgICAgc3RyID0gdGFyZ2V0KCkucGF0aCgic2luZ2xldG9uL2luc3RhbmNlIikucmVxdWVzdCgpLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzdWI6MSIsIHN0cik7CisKKyAgICAgICAgc3RyID0gdGFyZ2V0KCkucGF0aCgic2luZ2xldG9uL2luc3RhbmNlIikucmVxdWVzdCgpLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzdWI6MSIsIHN0cik7CisKKyAgICAgICAgc3RyID0gdGFyZ2V0KCkucGF0aCgic2luZ2xldG9uL3N1YiIpLnJlcXVlc3QoKS5nZXQoKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygic3ViOjMiLCBzdHIpOworCisgICAgICAgIC8vIG9uZSBpbnN0YW5jZQorICAgICAgICBzdHIgPSB0YXJnZXQoKS5wYXRoKCJwcm9ncmFtbWF0aWMiKS5wYXRoKCJpbnN0YW5jZSIpLnJlcXVlc3QoKS5nZXQoKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygicHJnLWluc3RhbmNlOjEiLCBzdHIpOworCisgICAgICAgIHN0ciA9IHRhcmdldCgpLnBhdGgoInByb2dyYW1tYXRpYyIpLnBhdGgoImluc3RhbmNlIikucmVxdWVzdCgpLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwcmctaW5zdGFuY2U6MiIsIHN0cik7CisKKyAgICAgICAgLy8gc2luZ2xldG9uCisgICAgICAgIHN0ciA9IHRhcmdldCgpLnBhdGgoInByb2dyYW1tYXRpYyIpLnBhdGgoInNpbmdsZXRvbiIpLnJlcXVlc3QoKS5nZXQoKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygicHJnLXNpbmdsZXRvbjoxIiwgc3RyKTsKKworICAgICAgICBzdHIgPSB0YXJnZXQoKS5wYXRoKCJwcm9ncmFtbWF0aWMiKS5wYXRoKCJzaW5nbGV0b24iKS5yZXF1ZXN0KCkuZ2V0KCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoInByZy1zaW5nbGV0b246MiIsIHN0cik7CisKKyAgICAgICAgLy8gcmVxdWVzdCB0byB0aGUgU3ViUmVzb3VyY2VTaW5nbGV0b24gKHNhbWUgY2xhc3MgYXMgc3ViIHJlc291cmNlIG9uIHBhdGggInNpbmdsZXRvbi9zdWIiKQorICAgICAgICBzdHIgPSB0YXJnZXQoKS5wYXRoKCJwcm9ncmFtbWF0aWMiKS5wYXRoKCJyZXVzZWQtc2luZ2xldG9uIikucmVxdWVzdCgpLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZXVzZWQtc2luZ2xldG9uOjQiLCBzdHIpOworCisgICAgICAgIC8vIG5vdCBzaW5nbGV0b24KKyAgICAgICAgc3RyID0gdGFyZ2V0KCkucGF0aCgicHJvZ3JhbW1hdGljIikucGF0aCgibm90LXNpbmdsZXRvbiIpLnJlcXVlc3QoKS5nZXQoKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygicHJnLW5vdC1zaW5nbGV0b246MSIsIHN0cik7CisKKyAgICAgICAgc3RyID0gdGFyZ2V0KCkucGF0aCgicHJvZ3JhbW1hdGljIikucGF0aCgibm90LXNpbmdsZXRvbiIpLnJlcXVlc3QoKS5nZXQoKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygicHJnLW5vdC1zaW5nbGV0b246MSIsIHN0cik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaW5nbGV0b25Bbm5vdGF0aW9uSW5oZXJpdGVkVGVzdCgpIHsKKyAgICAgICAgLy8gU2luZ2xldG9uIGFubm90YXRpb24gaXMgbm90IGluaGVyaXRlZAorICAgICAgICBTdHJpbmcgc3RyOworICAgICAgICBzdHIgPSB0YXJnZXQoKS5wYXRoKCJpbmhlcml0IikucmVxdWVzdCgpLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbmhlcml0OjEiLCBzdHIpOworCisgICAgICAgIHN0ciA9IHRhcmdldCgpLnBhdGgoImluaGVyaXQiKS5yZXF1ZXN0KCkuZ2V0KCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoImluaGVyaXQ6MSIsIHN0cik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaW5nbGV0b25Bbm5vdGF0aW9uSW50ZXJmYWNlVGVzdCgpIHsKKyAgICAgICAgLy8gU2luZ2xldG9uIGFubm90YXRpb24gaXMgbm90IGluaGVyaXRlZAorICAgICAgICBTdHJpbmcgc3RyOworICAgICAgICBzdHIgPSB0YXJnZXQoKS5wYXRoKCJpbnRlcmZhY2UiKS5yZXF1ZXN0KCkuZ2V0KCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoImludGVyZmFjZToxIiwgc3RyKTsKKworICAgICAgICBzdHIgPSB0YXJnZXQoKS5wYXRoKCJpbnRlcmZhY2UiKS5yZXF1ZXN0KCkuZ2V0KCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoImludGVyZmFjZToxIiwgc3RyKTsKKworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQgcmVzb3VyY2VzIGFyZSBieSBkZWZhdWx0IG1hbmFnZWQgaW4ge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWwuUmVxdWVzdFNjb3BlIHJlcXVlc3Qgc2NvcGV9LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlSW5SZXF1ZXN0U2NvcGUoKSB7CisgICAgICAgIFN0cmluZyBzdHIgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0U2NvcGUvcmVxdWVzdCIpLnJlcXVlc3QoKS5nZXQoKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygic2FtZS1pbnN0YW5jZXMiLCBzdHIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlSW5QZXJMb29rdXBTY29wZSgpIHsKKyAgICAgICAgU3RyaW5nIHN0ciA9IHRhcmdldCgpLnBhdGgoInRlc3RTY29wZS9wZXJsb29rdXAiKS5yZXF1ZXN0KCkuZ2V0KCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoImRpZmZlcmVudC1pbnN0YW5jZXMiLCBzdHIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlSW5TaW5nbGV0b25TY29wZSgpIHsKKyAgICAgICAgU3RyaW5nIHN0ciA9IHRhcmdldCgpLnBhdGgoInRlc3RTY29wZS9zaW5nbGV0b24iKS5yZXF1ZXN0KCkuZ2V0KCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoInNhbWUtaW5zdGFuY2VzIiwgc3RyKTsKKyAgICB9CisKKyAgICBAUGF0aCgidGVzdC1yZXF1ZXN0U2NvcGUiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVxdWVzdFNjb3BlUmVzb3VyY2UgeworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJnZXQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInRlc3QtcGVybG9va3VwU2NvcGUiKQorICAgIEBQZXJMb29rdXAKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBlckxvb2t1cFNjb3BlUmVzb3VyY2UgeworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJnZXQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInRlc3Qtc2luZ2xldG9uU2NvcGUiKQorICAgIEBTaW5nbGV0b24KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNpbmdsZXRvblNjb3BlUmVzb3VyY2UgeworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJnZXQiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInRlc3RTY29wZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0UmVzb3VyY2UgeworCisgICAgICAgIEBJbmplY3QKKyAgICAgICAgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyOworCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGNvbXBhcmVJbnN0YW5jZXMoQ2xhc3M8Pz4gY2xhenopIHsKKyAgICAgICAgICAgIGZpbmFsIE9iamVjdCByZXMxID0gSW5qZWN0aW9ucy5nZXRPckNyZWF0ZShpbmplY3Rpb25NYW5hZ2VyLCBjbGF6eik7CisgICAgICAgICAgICBmaW5hbCBPYmplY3QgcmVzMiA9IEluamVjdGlvbnMuZ2V0T3JDcmVhdGUoaW5qZWN0aW9uTWFuYWdlciwgY2xhenopOworICAgICAgICAgICAgcmV0dXJuIChyZXMxID09IHJlczIpID8gInNhbWUtaW5zdGFuY2VzIiA6ICJkaWZmZXJlbnQtaW5zdGFuY2VzIjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInJlcXVlc3QiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGNvbXBhcmVSZXF1ZXN0U2NvcGVkSW5zdGFuY2VzKCkgeworICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVJbnN0YW5jZXMoUmVxdWVzdFNjb3BlUmVzb3VyY2UuY2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgicGVybG9va3VwIikKKyAgICAgICAgcHVibGljIFN0cmluZyBjb21wYXJlUGVyTG9va3VwU2NvcGVkSW5zdGFuY2VzKCkgeworICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVJbnN0YW5jZXMoUGVyTG9va3VwU2NvcGVSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJzaW5nbGV0b24iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGNvbXBhcmVTaW5nbGV0b25JbnN0YW5jZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gY29tcGFyZUluc3RhbmNlcyhTaW5nbGV0b25TY29wZVJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBTaW5nbGV0b24KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhcmVudCB7CisKKyAgICB9CisKKyAgICBAUGF0aCgiaW5oZXJpdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDaGlsZEluaGVyaXRzUGFyZW50QW5ub3RhdGlvbiBleHRlbmRzIFBhcmVudCB7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgY291bnRlciA9IDE7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiaW5oZXJpdDoiICsgY291bnRlcisrOworICAgICAgICB9CisgICAgfQorCisgICAgQFNpbmdsZXRvbgorICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEFubm90YXRlZEJ5U2luZ2xldG9uIHsKKyAgICB9CisKKyAgICBAUGF0aCgiaW50ZXJmYWNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENoaWxkSW1wbGVtZW50c0ludGVyZmFjZUFubm90YXRpb24gaW1wbGVtZW50cyBBbm5vdGF0ZWRCeVNpbmdsZXRvbiB7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgY291bnRlciA9IDE7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiaW50ZXJmYWNlOiIgKyBjb3VudGVyKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAU2luZ2xldG9uCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTaW5nbGV0b25Qcm9ncmFtbWF0aWMgaW1wbGVtZW50cyBJbmZsZWN0b3I8UmVxdWVzdCwgUmVzcG9uc2U+IHsKKworICAgICAgICBwcml2YXRlIGludCBjb3VudGVyID0gMTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGFwcGx5KFJlcXVlc3QgZGF0YSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCJwcmctc2luZ2xldG9uOiIgKyBjb3VudGVyKyspLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTm90U2luZ2xldG9uUHJvZ3JhbW1hdGljIGltcGxlbWVudHMgSW5mbGVjdG9yPFJlcXVlc3QsIFJlc3BvbnNlPiB7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgY291bnRlciA9IDE7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBhcHBseShSZXF1ZXN0IGRhdGEpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygicHJnLW5vdC1zaW5nbGV0b246IiArIGNvdW50ZXIrKykuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgQFNpbmdsZXRvbgorICAgIEBQYXRoKCJzaW5nbGV0b24iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2luZ2xldG9uUmVzb3VyY2UgeworCisgICAgICAgIHByaXZhdGUgaW50IGNvdW50ZXIgPSAxOworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L2h0bWwiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvdW50ZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gInJlczoiICsgKGNvdW50ZXIrKyk7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgic3ViIikKKyAgICAgICAgcHVibGljIENsYXNzIGdldFN1YlJlc291cmNlU2luZ2xldG9uKCkgeworICAgICAgICAgICAgcmV0dXJuIFN1YlJlc291cmNlU2luZ2xldG9uLmNsYXNzOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInN1Yi1ub3Qtc2luZ2xldG9uIikKKyAgICAgICAgcHVibGljIENsYXNzIGdldFN1YlJlc291cmNlKCkgeworICAgICAgICAgICAgcmV0dXJuIFN1YlJlc291cmNlLmNsYXNzOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImluc3RhbmNlIikKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRTdWJSZXNvdXJjZUluc3RhbmNlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdWJSZXNvdXJjZVNpbmdsZXRvbigpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiZmlsdGVyIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb3VudGVyRnJvbUZpbHRlcihASGVhZGVyUGFyYW0oImNvdW50ZXIiKSBpbnQgY291bnRlcikgeworICAgICAgICAgICAgcmV0dXJuICJmaWx0ZXI6IiArIGNvdW50ZXI7CisgICAgICAgIH0KKworICAgIH0KKworICAgIEBTaW5nbGV0b24KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN1YlJlc291cmNlU2luZ2xldG9uIGltcGxlbWVudHMgSW5mbGVjdG9yPFJlcXVlc3QsIFJlc3BvbnNlPiB7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgY291bnRlciA9IDE7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEludGVybmFsQ291bnRlcigpIHsKKyAgICAgICAgICAgIHJldHVybiAic3ViOiIgKyAoY291bnRlcisrKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgYXBwbHkoUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soInJldXNlZC1zaW5nbGV0b246IiArIGNvdW50ZXIrKykuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3ViUmVzb3VyY2UgeworCisgICAgICAgIHByaXZhdGUgaW50IGNvdW50ZXIgPSAxOworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRJbnRlcm5hbENvdW50ZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gIm5vdC1zaW5nbGV0b246IiArIChjb3VudGVyKyspOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvU3RyZWFtTWV0aG9kQ2FsbFRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL1N0cmVhbU1ldGhvZENhbGxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ0MzQ4OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL1N0cmVhbU1ldGhvZENhbGxUZXN0LmphdmEKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLnppcC5HWklQT3V0cHV0U3RyZWFtOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGVzdHMgdGhhdCBhcHByb3ByaWF0ZSBtZXRob2RzIGFyZSBjYWxsZWQgaW4gdGhlIGludGVyY2VwdGVkIG91dHB1dCBzdHJlYW0uCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICoKKyAqLworcHVibGljIGNsYXNzIFN0cmVhbU1ldGhvZENhbGxUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFRlc3RXcml0ZXJJbnRlcmNlcHRvci5jbGFzcywgVGVzdFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RXcml0ZXJJbnRlcmNlcHRvciBpbXBsZW1lbnRzIFdyaXRlckludGVyY2VwdG9yIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYXJvdW5kV3JpdGVUbyhXcml0ZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtb2xkT3MgPSBjb250ZXh0LmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgY29udGV4dC5zZXRPdXRwdXRTdHJlYW0obmV3IFRlc3RPdXRwdXRTdHJlYW0obmV3IEdaSVBPdXRwdXRTdHJlYW0ob3V0cHV0U3RyZWFtb2xkT3MpKSk7CisgICAgICAgICAgICBjb250ZXh0LnByb2NlZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdE91dHB1dFN0cmVhbSBleHRlbmRzIE91dHB1dFN0cmVhbSB7CisgICAgICAgIHByaXZhdGUgZmluYWwgR1pJUE91dHB1dFN0cmVhbSBnem9zOworICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gY2xvc2VDYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGZsdXNoQ2FsbGVkQmVmb3JlQ2xvc2UgPSBmYWxzZTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIHdyaXRlQ2FsbGVkID0gZmFsc2U7CisKKyAgICAgICAgcHVibGljIFRlc3RPdXRwdXRTdHJlYW0oR1pJUE91dHB1dFN0cmVhbSBnem9zKSB7CisgICAgICAgICAgICB0aGlzLmd6b3MgPSBnem9zOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgd3JpdGVDYWxsZWQgPSB0cnVlOworICAgICAgICAgICAgZ3pvcy53cml0ZShiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBUZXN0T3V0cHV0U3RyZWFtLmNsb3NlQ2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIGd6b3MuY2xvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBpZiAoIWNsb3NlQ2FsbGVkKSB7CisgICAgICAgICAgICAgICAgZmx1c2hDYWxsZWRCZWZvcmVDbG9zZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBnem9zLmZsdXNoKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFJlc291cmNlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiZ2V0IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENhbGxlZE1ldGhvZHMoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJjbG9zZSgpIGhhcyBub3QgYmVlbiBjYWxsZWQuIiwgVGVzdE91dHB1dFN0cmVhbS5jbG9zZUNhbGxlZCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKCJmbHVzaCgpIGhhcyBub3QgYmVlbiBjYWxsZWQgYmVmb3JlIGNsb3NlKCkuIiwgVGVzdE91dHB1dFN0cmVhbS5mbHVzaENhbGxlZEJlZm9yZUNsb3NlKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIndyaXRlKCkgaGFzIG5vdCBiZWVuIGNhbGxlZC4iLCBUZXN0T3V0cHV0U3RyZWFtLndyaXRlQ2FsbGVkKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9TdWJSZXNvdXJjZVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL1N1YlJlc291cmNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZTQ4MzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9TdWJSZXNvdXJjZVRlc3QuamF2YQpAQCAtMCwwICsxLDI0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogU3ViLXJlc291cmNlIGFjY2Vzcy9wcm9jZXNzaW5nIEUyRSB0ZXN0cy4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgY2xhc3MgU3ViUmVzb3VyY2VUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAUGF0aCgicm9vdC9zdWIiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworICAgICAgICBAUGF0aCgiLyIpCisgICAgICAgIHB1YmxpYyBTdWJSZXNvdXJjZSBnZXRTdWJSZXNvdXJjZUxvY2F0b3IoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN1YlJlc291cmNlKCk7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgic3ViMiIpCisgICAgICAgIHB1YmxpYyBTdWJSZXNvdXJjZSBnZXRTdWJSZXNvdXJjZUxvY2F0b3IyKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdWJSZXNvdXJjZSgpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZyBHRVQgPSAiZ2V0IjsKKworICAgICAgICBAUGF0aCgic29tZS9wYXRoIikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBHRVQ7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiZW1wdHktbG9jYXRvciIpCisgICAgICAgIHB1YmxpYyBFbXB0eVN1YlJlc291cmNlQ2xhc3MgZ2V0RW1wdHlMb2NhdG9yKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBFbXB0eVN1YlJlc291cmNlQ2xhc3MoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3ViUmVzb3VyY2UgeworICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFID0gIkdvdCBpdCEiOworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRJdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBNRVNTQUdFOworICAgICAgICB9CisKKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3QoU3RyaW5nIHN0cikgeworICAgICAgICAgICAgcmV0dXJuIHN0cjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MsIExvY2F0b3JBbmRNZXRob2RSZXNvdXJjZS5jbGFzcywgRW1wdHlSb290UmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgY29uY3VycmVudCBzdWItcmVzb3VyY2UgYWNjZXNzLiAoU2VlIEpFUlNFWS0xNDIxKS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGluIGNhc2Ugb2YgdGVzdCBmYWlsdXJlLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbmN1cnJlbnRTdWJSZXNvdXJjZUFjY2VzcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgc3ViUmVzb3VyY2UgPSB0YXJnZXQoInJvb3Qvc3ViL3N1YjIiKTsKKworICAgICAgICBmaW5hbCBpbnQgTUFYID0gMjU7CisKKyAgICAgICAgZmluYWwgTGlzdDxGdXR1cmU8U3RyaW5nPj4gcmVzdWx0cyA9IG5ldyBBcnJheUxpc3Q8RnV0dXJlPFN0cmluZz4+KE1BWCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYOyBpKyspIHsKKyAgICAgICAgICAgIHJlc3VsdHMuYWRkKHN1YlJlc291cmNlLnJlcXVlc3QoKS5hc3luYygpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoRnV0dXJlPFN0cmluZz4gcmVzdWx0RnV0dXJlIDogcmVzdWx0cykgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFN1YlJlc291cmNlLk1FU1NBR0UsIHJlc3VsdEZ1dHVyZS5nZXQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHN1YlJlc291cmNlVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgicm9vdC9zdWIvc3ViMiIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhTdWJSZXNvdXJjZS5NRVNTQUdFLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCJyb290L3N1Yi9zdWIyIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFN1YlJlc291cmNlLk1FU1NBR0UsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzdWJSZXNvdXJjZVdpdGhvdXRQYXRoVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgicm9vdC9zdWIiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoU3ViUmVzb3VyY2UuTUVTU0FHRSwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoInJvb3Qvc3ViL3NvbWUvcGF0aCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhSZXNvdXJjZS5HRVQsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgicm9vdC9zdWIvc3ViMiIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoInBvc3QiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInBvc3QiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIC8vIHRoaXMgcmVzb3VyY2UgY2xhc3Mgd2lsbCByZXBvcnQgd2FybmluZyBkdXJpbmcgdmFsaWRhdGlvbiwgYnV0IHNob3VsZCBiZSBsb2FkZWQKKyAgICBAUGF0aCgibG9jYXRvci1hbmQtbWV0aG9kIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIExvY2F0b3JBbmRNZXRob2RSZXNvdXJjZSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInN1YiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3ViKCkgeworICAgICAgICAgICAgcmV0dXJuICJnZXQiOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInN1YiIpCisgICAgICAgIHB1YmxpYyBQb3N0U3ViUmVzb3VyY2UgZ2V0U3ViUmVzb3VyY2VTdWIoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFBvc3RTdWJSZXNvdXJjZSgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiZ2V0IjsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCIvIikKKyAgICAgICAgcHVibGljIFBvc3RTdWJSZXNvdXJjZSBnZXRTdWJSZXNvdXJjZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUG9zdFN1YlJlc291cmNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBvc3RTdWJSZXNvdXJjZSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gImZhaWw6IGxvY2F0b3IgZ2V0IHNob3VsZCBuZXZlciBiZSBjYWxsZWQgISEhIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdChTdHJpbmcgcG9zdCkgeworICAgICAgICAgICAgcmV0dXJuICJmYWlsOiBwb3N0IHNob3VsZCBuZXZlciBiZSBjYWxsZWQgISEhIjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImlubmVyIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRJbm5lcigpIHsKKyAgICAgICAgICAgIHJldHVybiAiaW5uZXIiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SXNDYWxsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImxvY2F0b3ItYW5kLW1ldGhvZCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhSZXNwb25zZS5TdGF0dXMuT0suZ2V0U3RhdHVzQ29kZSgpLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImdldCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SXNDYWxsZWRJblN1YigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgibG9jYXRvci1hbmQtbWV0aG9kL3N1YiIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhSZXNwb25zZS5TdGF0dXMuT0suZ2V0U3RhdHVzQ29kZSgpLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImdldCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SXNDYWxsZWRJbklubmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJsb2NhdG9yLWFuZC1tZXRob2QvaW5uZXIiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoUmVzcG9uc2UuU3RhdHVzLk9LLmdldFN0YXR1c0NvZGUoKSwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJpbm5lciIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0SXNDYWxsZWRJblN1YklubmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJsb2NhdG9yLWFuZC1tZXRob2Qvc3ViL2lubmVyIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFJlc3BvbnNlLlN0YXR1cy5PSy5nZXRTdGF0dXNDb2RlKCksIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiaW5uZXIiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc3RTaG91bGROZXZlckJlQ2FsbGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJsb2NhdG9yLWFuZC1tZXRob2QiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KCJwb3N0IiwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFJlc3BvbnNlLlN0YXR1cy5NRVRIT0RfTk9UX0FMTE9XRUQuZ2V0U3RhdHVzQ29kZSgpLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdFNob3VsZE5ldmVyQmVDYWxsZWRJblN1YigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgibG9jYXRvci1hbmQtbWV0aG9kL3N1YiIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoInBvc3QiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoUmVzcG9uc2UuU3RhdHVzLk1FVEhPRF9OT1RfQUxMT1dFRC5nZXRTdGF0dXNDb2RlKCksIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiZW1wdHktcm9vdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFbXB0eVJvb3RSZXNvdXJjZSB7CisKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDYWxsRW1wdHlSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiZW1wdHktcm9vdCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhSZXNwb25zZS5TdGF0dXMuTk9UX0ZPVU5ELmdldFN0YXR1c0NvZGUoKSwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRW1wdHlTdWJSZXNvdXJjZUNsYXNzIHsKKyAgICAgICAgLy8gZW1wdHkKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDYWxsRW1wdHlTdWJSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiZW1wdHktbG9jYXRvciIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhSZXNwb25zZS5TdGF0dXMuTk9UX0ZPVU5ELmdldFN0YXR1c0NvZGUoKSwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL1N1YmplY3RTZWN1cml0eUNvbnRleHRUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9TdWJqZWN0U2VjdXJpdHlDb250ZXh0VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkMmQ1ODMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9TdWJqZWN0U2VjdXJpdHlDb250ZXh0VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTk1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpbmNpcGFsOworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJpdmlsZWdlZEFjdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5Ob3RBY2NlcHRhYmxlRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlByZU1hdGNoaW5nOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlN1YmplY3RTZWN1cml0eUNvbnRleHQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBUZXN0IHN1YmplY3QgYmFzZWQgc2VjdXJpdHkgY29udGV4dC4gTWFrZSBzdXJlIHJlc291cmNlCisgKiBhbmQgc3ViLXJlc291cmNlIG1ldGhvZHMvbG9jYXRvcnMgYXJlIGludm9rZWQKKyAqIHZpYSB7QGxpbmsgU3ViamVjdFNlY3VyaXR5Q29udGV4dCNkb0FzU3ViamVjdChqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRBY3Rpb24pfSBtZXRob2QuCisgKgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgU3ViamVjdFNlY3VyaXR5Q29udGV4dFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIC8vIGFjdHVhbCBmaWx0ZXIgcmVmZXJlbmNlIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGludm9jYXRpb25zCisgICAgU3ViamVjdFNlY3VyaXR5Q29udGV4dFNldHRpbmdGaWx0ZXIgc3ViamVjdEZpbHRlcjsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MpLnJlZ2lzdGVySW5zdGFuY2VzKHN1YmplY3RGaWx0ZXIgPSBuZXcgU3ViamVjdFNlY3VyaXR5Q29udGV4dFNldHRpbmdGaWx0ZXIoKSk7CisgICAgfQorCisgICAgQFBhdGgoIi9yZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHJlc291cmNlR2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJSZXNvdXJjZSBHRVQiOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInN1YnJlc291cmNlIikKKyAgICAgICAgcHVibGljIFN1YlJlc291cmNlIGdldFN1YlJlc291cmNlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdWJSZXNvdXJjZSgpOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInN1YnJlc291cmNlLXdhZSIpCisgICAgICAgIHB1YmxpYyBTdWJSZXNvdXJjZSBnZXRTdWJSZXNvdXJjZUV4KCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5vdEFjY2VwdGFibGVFeGNlcHRpb24oUmVzcG9uc2Uubm90QWNjZXB0YWJsZShudWxsKS5lbnRpdHkoIk5vdCBBY2NlcHRhYmxlIFNSTCIpLmJ1aWxkKCkpOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInN1Yi1nZXQiKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3ViKCkgeworICAgICAgICAgICAgcmV0dXJuICJSZXNvdXJjZSBzdWItR0VUIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJzdWItZ2V0LXdhZSIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRTdWJFeCgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOb3RBY2NlcHRhYmxlRXhjZXB0aW9uKFJlc3BvbnNlLm5vdEFjY2VwdGFibGUobnVsbCkuZW50aXR5KCJOb3QgQWNjZXB0YWJsZSBSZXNvdXJjZSBzdWItR0VUIikuYnVpbGQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN1YlJlc291cmNlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHN1YlJlc291cmNlR2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJTdWJSZXNvdXJjZSBHRVQiOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoIndhZSIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBzdWJSZXNvdXJjZUdldEV4KCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5vdEFjY2VwdGFibGVFeGNlcHRpb24oUmVzcG9uc2Uubm90QWNjZXB0YWJsZShudWxsKS5lbnRpdHkoIk5vdCBBY2NlcHRhYmxlIFN1YlJlc291cmNlIEdFVCIpLmJ1aWxkKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3VzdG9tIFN1YmplY3RTZWN1cml0eUNvbnRleHQgdGhhdCBrZWVwcyBudW1iZXIgb2YgZG9Bc1N1YmplY3QgaW52b2NhdGlvbnMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVN1YmplY3RTZWN1cml0eUNvbnRleHQgaW1wbGVtZW50cyBTdWJqZWN0U2VjdXJpdHlDb250ZXh0IHsKKworICAgICAgICAvLyBubyBoaXRzIHNvIGZhcgorICAgICAgICBpbnQgaGl0cyA9IDA7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPYmplY3QgZG9Bc1N1YmplY3QoUHJpdmlsZWdlZEFjdGlvbiBhY3Rpb24pIHsKKyAgICAgICAgICAgIGhpdHMrKzsKKyAgICAgICAgICAgIHJldHVybiBhY3Rpb24ucnVuKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFByaW5jaXBhbCBnZXRVc2VyUHJpbmNpcGFsKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIHlldC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1VzZXJJblJvbGUoU3RyaW5nIHN0cmluZykgeworICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb3Qgc3VwcG9ydGVkIHlldC4iKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1NlY3VyZSgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCB5ZXQuIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRBdXRoZW50aWNhdGlvblNjaGVtZSgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm90IHN1cHBvcnRlZCB5ZXQuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDdXN0b20gZmlsdGVyIHRvIHNldCB0aGUgY3VzdG9tIHN1YmplY3Qgc2VjdXJpdHkgY29udGV4dCBvbiBldmVyeSByZXF1ZXN0IGJlZm9yZSB0aGUgcmVxdWVzdCBnZXQgbWF0Y2hlZCwKKyAgICAgKiBzbyB0aGF0IHN1Yi1yZXNvdXJjZSBsb2NhdG9yIGludm9jYXRpb25zIGhhdmUgYSBjaGFuY2UgdG8gc2VlIHRoZSBzdWJqZWN0IHNlY3VyaXR5IGNvbnRleHQgc2V0LgorICAgICAqLworICAgIEBQcmVNYXRjaGluZworICAgIEBQcm92aWRlcgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3ViamVjdFNlY3VyaXR5Q29udGV4dFNldHRpbmdGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIE15U3ViamVjdFNlY3VyaXR5Q29udGV4dCBzZWN1cml0eUNvbnRleHQgPSBuZXcgTXlTdWJqZWN0U2VjdXJpdHlDb250ZXh0KCk7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LnNldFNlY3VyaXR5Q29udGV4dChzZWN1cml0eUNvbnRleHQpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFByb3ZpZGUgYWN0dWFsIGRvQXNTdWJqZWN0IGhpdCBjb3VudC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBudW1iZXIgb2YgZG9Bc1N1YmplY3QgaW52b2NhdGlvbnMuCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgaW50IGdldEhpdHMoKSB7CisgICAgICAgICAgICByZXR1cm4gc2VjdXJpdHlDb250ZXh0LmhpdHM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJqZWN0U2VjdXJpdHlDb250ZXh0KCkgeworCisgICAgICAgIFdlYlRhcmdldCByID0gdGFyZ2V0KCIvcmVzb3VyY2UiKTsKKworICAgICAgICBhc3NlcnRUaGF0KHIucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKCJSZXNvdXJjZSBHRVQiKSk7CisgICAgICAgIGFzc2VydFRoYXQoc3ViamVjdEZpbHRlci5nZXRIaXRzKCksIGVxdWFsVG8oMSkpOyAvLyBvbmUgcmVzb3VyY2UgbWV0aG9kIGludm9rZWQKKworICAgICAgICBhc3NlcnRUaGF0KHIucGF0aCgic3VicmVzb3VyY2UiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyksIGVxdWFsVG8oIlN1YlJlc291cmNlIEdFVCIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzdWJqZWN0RmlsdGVyLmdldEhpdHMoKSwgZXF1YWxUbygzKSk7IC8vICsgb25lIHN1Yi1yZXNvdXJjZSBsb2NhdG9yIGFuZCBvbmUgcmVzb3VyY2UgbWV0aG9kIGludm9rZWQKKworICAgICAgICBhc3NlcnRUaGF0KCJSZXNvdXJjZSBzdWItR0VUIiwgZXF1YWxUbyhyLnBhdGgoInN1Yi1nZXQiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzdWJqZWN0RmlsdGVyLmdldEhpdHMoKSwgZXF1YWxUbyg0KSk7IC8vICsgb25lIHN1Yi1yZXNvdXJjZSBtZXRob2QgaW52b2tlZAorCisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlOworCisgICAgICAgIHJlc3BvbnNlID0gci5wYXRoKCJzdWItZ2V0LXdhZSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgZXF1YWxUbyhSZXNwb25zZS5TdGF0dXMuTk9UX0FDQ0VQVEFCTEUuZ2V0U3RhdHVzQ29kZSgpKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKCJOb3QgQWNjZXB0YWJsZSBSZXNvdXJjZSBzdWItR0VUIikpOworICAgICAgICBhc3NlcnRUaGF0KHN1YmplY3RGaWx0ZXIuZ2V0SGl0cygpLCBlcXVhbFRvKDUpKTsgLy8gKyBvbmUgc3ViLXJlc291cmNlIG1ldGhvZCBpbnZva2VkCisKKyAgICAgICAgcmVzcG9uc2UgPSByLnBhdGgoInN1YnJlc291cmNlLXdhZSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgZXF1YWxUbyhSZXNwb25zZS5TdGF0dXMuTk9UX0FDQ0VQVEFCTEUuZ2V0U3RhdHVzQ29kZSgpKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKCJOb3QgQWNjZXB0YWJsZSBTUkwiKSk7CisgICAgICAgIGFzc2VydFRoYXQoc3ViamVjdEZpbHRlci5nZXRIaXRzKCksIGVxdWFsVG8oNikpOworCisgICAgICAgIHJlc3BvbnNlID0gci5wYXRoKCJzdWJyZXNvdXJjZS93YWUiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oUmVzcG9uc2UuU3RhdHVzLk5PVF9BQ0NFUFRBQkxFLmdldFN0YXR1c0NvZGUoKSkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbygiTm90IEFjY2VwdGFibGUgU3ViUmVzb3VyY2UgR0VUIikpOworICAgICAgICBhc3NlcnRUaGF0KHN1YmplY3RGaWx0ZXIuZ2V0SGl0cygpLCBlcXVhbFRvKDgpKTsgLy8gKyBvbmUgc3ViLXJlc291cmNlIGxvY2F0b3IgYW5kIG9uZSByZXNvdXJjZSBtZXRob2QgaW52b2tlZAorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL1VyaUJ1aWxkZXJUZW1wbGF0ZVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL1VyaUJ1aWxkZXJUZW1wbGF0ZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzBjODJjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvVXJpQnVpbGRlclRlbXBsYXRlVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3RpbmcgVVJJIHRlbXBsYXRlIGFzIGFuIGUyZSB0ZXN0LgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqCisgKi8KK3B1YmxpYyBjbGFzcyBVcmlCdWlsZGVyVGVtcGxhdGVUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TnVtZXJpY1Jlc291cmNlKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInRlc3QvbnVtZXJpYy81NSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgU3RyaW5nIHVyaSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJlc3BvbnNlLlN0YXR1cy5PSy5nZXRTdGF0dXNDb2RlKCksIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0L251bWVyaWMvNTUiLCB1cmkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFueVJlc291cmNlKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInRlc3QvYW55L2dldE51bWVyaWNSZXNvdXJjZSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgU3RyaW5nIHVyaSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFJlc3BvbnNlLlN0YXR1cy5PSy5nZXRTdGF0dXNDb2RlKCksIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0L251bWVyaWMvMTEiLCB1cmkpOworICAgIH0KKworICAgIEBQYXRoKCJ0ZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAUGF0aCgibnVtZXJpYy97IHJlc291cmNlTm8gOiBcXGQrfSIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROdW1lcmljUmVzb3VyY2UoQFBhdGhQYXJhbSgicmVzb3VyY2VObyIpIGludCByZXNvdXJjZU5vKSB7CisgICAgICAgICAgICBVUkkgYW55UmVzb3VyY2VVcmkgPSBVcmlCdWlsZGVyLmZyb21SZXNvdXJjZShSZXNvdXJjZS5jbGFzcykucGF0aChSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgImdldE51bWVyaWNSZXNvdXJjZSIpLmJ1aWxkKHJlc291cmNlTm8pOworICAgICAgICAgICAgcmV0dXJuIGFueVJlc291cmNlVXJpLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiYW55L3tyZXNvdXJjZU5hbWV9IikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEFueVJlc291cmNlKEBQYXRoUGFyYW0oInJlc291cmNlTmFtZSIpIFN0cmluZyByZXNvdXJjZU5hbWUpIHsKKyAgICAgICAgICAgIFVSSSBudW1SZXNvdXJjZVVyaSA9IFVyaUJ1aWxkZXIuZnJvbVJlc291cmNlKFJlc291cmNlLmNsYXNzKS5wYXRoKFJlc291cmNlLmNsYXNzLCAiZ2V0TnVtZXJpY1Jlc291cmNlIikuYnVpbGQoMTEpOworICAgICAgICAgICAgcmV0dXJuIG51bVJlc291cmNlVXJpLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdChleHBlY3RlZCA9IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb2x2ZVRlbXBsYXRlKCkgeworICAgICAgICBNYXA8U3RyaW5nLCBPYmplY3Q+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgT2JqZWN0PigpOworICAgICAgICBtYXAucHV0KCJhIiwgInh5eiIpOworICAgICAgICBtYXAucHV0KG51bGwsICJwYXRoIik7CisgICAgICAgIFVyaUJ1aWxkZXIgYnVpbGRlciA9IFVyaUJ1aWxkZXIuZnJvbVBhdGgoIiIpLnBhdGgoInthfS97Yn0iKTsKKyAgICAgICAgYnVpbGRlci5yZXNvbHZlVGVtcGxhdGVzKG1hcCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvV2ViQXBwbGljYXRpb25FeGNlcHRpb25Mb2dnaW5nVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvV2ViQXBwbGljYXRpb25FeGNlcHRpb25Mb2dnaW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMDcxOTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbkxvZ2dpbmdUZXN0LmphdmEKQEAgLTAsMCArMSwxNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlcjsKKworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5FeGNlcHRpb25NYXBwZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogVGVzdHMgdGhhdCB7QGxpbmsgV2ViQXBwbGljYXRpb25FeGNlcHRpb259IGlzIGxvZ2dlZCBvbiB0aGUgY29ycmVjdCBsZXZlbC4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbkxvZ2dpbmdUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAUGF0aCgiL3Rlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3RhdHVzUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgcHVibGljIFN0cmluZyB0ZXN0KEBOb3ROdWxsIEBRdWVyeVBhcmFtKCJpZCIpIGZpbmFsIFN0cmluZyBpZCkgeworICAgICAgICAgICAgcmV0dXJuICJvayI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJXQUUtbm8tZW50aXR5IikKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgcHVibGljIFN0cmluZyB0ZXN0V2l0aG91dEVudGl0eSgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbigiV0FFIHdpdGhvdXQgZW50aXR5IiwgUmVzcG9uc2Uuc3RhdHVzKDQwMCkuYnVpbGQoKSk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJXQUUtZW50aXR5IikKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgcHVibGljIFN0cmluZyB0ZXN0V2l0aEVudGl0eSgpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbigiV0FFIHdpdGggZW50aXR5IiwgUmVzcG9uc2Uuc3RhdHVzKDQwMCkuZW50aXR5KCJXQUUgd2l0aCBlbnRpdHkiKS5idWlsZCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVmFsaWRhdGlvbkV4Y2VwdGlvbk1hcHBlciBpbXBsZW1lbnRzIEV4Y2VwdGlvbk1hcHBlcjxWYWxpZGF0aW9uRXhjZXB0aW9uPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSB0b1Jlc3BvbnNlKGZpbmFsIFZhbGlkYXRpb25FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoMjAwKS5lbnRpdHkoIkVycm9yIG1hcHBlZDogIiArIGV4LnRvU3RyaW5nKCkpLnR5cGUoInRleHQvcGxhaW4iKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgc2V0KFRlc3RQcm9wZXJ0aWVzLlJFQ09SRF9MT0dfTEVWRUwsIExldmVsLkZJTkVSLmludFZhbHVlKCkpOworCisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoU3RhdHVzUmVzb3VyY2UuY2xhc3MsIFZhbGlkYXRpb25FeGNlcHRpb25NYXBwZXIuY2xhc3MpOworICAgIH0KKworICAgIHByaXZhdGUgTG9nUmVjb3JkIGdldExvZ1JlY29yZChmaW5hbCBTdHJpbmcgbWVzc2FnZVByZWZpeCkgeworICAgICAgICBmb3IgKGZpbmFsIExvZ1JlY29yZCBsb2dSZWNvcmQgOiBnZXRMb2dnZWRSZWNvcmRzKCkpIHsKKyAgICAgICAgICAgIGlmIChsb2dSZWNvcmQuZ2V0TWVzc2FnZSgpICE9IG51bGwgJiYgbG9nUmVjb3JkLmdldE1lc3NhZ2UoKS5zdGFydHNXaXRoKG1lc3NhZ2VQcmVmaXgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxvZ1JlY29yZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0aW9uRXhjZXB0aW9uKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInRlc3QiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgZW50aXR5ID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUcnVlKGVudGl0eS5zdGFydHNXaXRoKCJFcnJvciBtYXBwZWQ6IikpOworCisgICAgICAgIC8vIGNoZWNrIGxvZ3MKKyAgICAgICAgZmluYWwgTG9nUmVjb3JkIGxvZ1JlY29yZCA9IHRoaXMuZ2V0TG9nUmVjb3JkKCJTdGFydGluZyBtYXBwaW5nIG9mIHRoZSBleGNlcHRpb24iKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChsb2dSZWNvcmQpOworICAgICAgICBhc3NlcnRFcXVhbHMoTGV2ZWwuRklORVIsIGxvZ1JlY29yZC5nZXRMZXZlbCgpKTsKKworICAgICAgICAvLyBjaGVjayB0aGF0IHRoZXJlIGlzIG5vIGV4Y2VwdGlvbiBsb2dnZWQgb24gdGhlIGxldmVsIGhpZ2hlciB0aGFuIEZJTkUKKyAgICAgICAgZm9yIChmaW5hbCBMb2dSZWNvcmQgcmVjb3JkIDogZ2V0TG9nZ2VkUmVjb3JkcygpKSB7CisgICAgICAgICAgICBpZiAocmVjb3JkLmdldFRocm93bigpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKHJlY29yZC5nZXRMZXZlbCgpLmludFZhbHVlKCkgPD0gTGV2ZWwuRklORS5pbnRWYWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V0FFV2l0aEVudGl0eSgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0L1dBRS1lbnRpdHkiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGVudGl0eSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJXQUUgd2l0aCBlbnRpdHkiLCBlbnRpdHkpOworCisgICAgICAgIC8vIGNoZWNrIGxvZ3MKKyAgICAgICAgTG9nUmVjb3JkIGxvZ1JlY29yZCA9IHRoaXMuZ2V0TG9nUmVjb3JkKCJTdGFydGluZyBtYXBwaW5nIG9mIHRoZSBleGNlcHRpb24iKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChsb2dSZWNvcmQpOworICAgICAgICBhc3NlcnRFcXVhbHMoTGV2ZWwuRklORVIsIGxvZ1JlY29yZC5nZXRMZXZlbCgpKTsKKworICAgICAgICBsb2dSZWNvcmQgPSB0aGlzLmdldExvZ1JlY29yZCgiV2ViQXBwbGljYXRpb25FeGNlcHRpb24gKFdBRSkgd2l0aCBub24tbnVsbCBlbnRpdHkgdGhyb3duLiIpOworICAgICAgICBhc3NlcnROb3ROdWxsKGxvZ1JlY29yZCk7CisgICAgICAgIGFzc2VydEVxdWFscyhMZXZlbC5GSU5FLCBsb2dSZWNvcmQuZ2V0TGV2ZWwoKSk7CisgICAgICAgIGFzc2VydFRydWUobG9nUmVjb3JkLmdldFRocm93bigpIGluc3RhbmNlb2YgV2ViQXBwbGljYXRpb25FeGNlcHRpb24pOworICAgICAgICBsb2dSZWNvcmQuZ2V0VGhyb3duKCkucHJpbnRTdGFja1RyYWNlKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V0FFV2l0aG91dEVudGl0eSgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0L1dBRS1uby1lbnRpdHkiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocmVzcG9uc2UuaGFzRW50aXR5KCkpOworCisgICAgICAgIC8vIGNoZWNrIGxvZ3MKKyAgICAgICAgTG9nUmVjb3JkIGxvZ1JlY29yZCA9IHRoaXMuZ2V0TG9nUmVjb3JkKCJTdGFydGluZyBtYXBwaW5nIG9mIHRoZSBleGNlcHRpb24iKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChsb2dSZWNvcmQpOworICAgICAgICBhc3NlcnRFcXVhbHMoTGV2ZWwuRklORVIsIGxvZ1JlY29yZC5nZXRMZXZlbCgpKTsKKworICAgICAgICBsb2dSZWNvcmQgPSB0aGlzLmdldExvZ1JlY29yZCgiV2ViQXBwbGljYXRpb25FeGNlcHRpb24gKFdBRSkgd2l0aCBubyBlbnRpdHkgdGhyb3duIGFuZCBubyIpOworICAgICAgICBhc3NlcnROb3ROdWxsKGxvZ1JlY29yZCk7CisgICAgICAgIGFzc2VydEVxdWFscyhMZXZlbC5GSU5FLCBsb2dSZWNvcmQuZ2V0TGV2ZWwoKSk7CisgICAgICAgIGFzc2VydFRydWUobG9nUmVjb3JkLmdldFRocm93bigpIGluc3RhbmNlb2YgV2ViQXBwbGljYXRpb25FeGNlcHRpb24pOworICAgICAgICBsb2dSZWNvcmQuZ2V0VGhyb3duKCkucHJpbnRTdGFja1RyYWNlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvZmlsdGVyL1Bvc3RUb1B1dERlbGV0ZVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL2ZpbHRlci9Qb3N0VG9QdXREZWxldGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE0MTU5YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL2ZpbHRlci9Qb3N0VG9QdXREZWxldGVUZXN0LmphdmEKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5maWx0ZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5ERUxFVEU7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUFVUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZvcm07CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuZmlsdGVyLkh0dHBNZXRob2RPdmVycmlkZUZpbHRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICoKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitwdWJsaWMgY2xhc3MgUG9zdFRvUHV0RGVsZXRlVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoQFF1ZXJ5UGFyYW0oImEiKSBTdHJpbmcgYSkgeworICAgICAgICAgICAgcmV0dXJuICJHRVQ6ICIgKyBhOworICAgICAgICB9CisKKyAgICAgICAgQFBVVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHB1dCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiUFVUIjsKKyAgICAgICAgfQorCisgICAgICAgIEBERUxFVEUKKyAgICAgICAgcHVibGljIFN0cmluZyBkZWxldGUoKSB7CisgICAgICAgICAgICByZXR1cm4gIkRFTEVURSI7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3QoKSB7CisgICAgICAgICAgICByZXR1cm4gIlBPU1QiOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhIdHRwTWV0aG9kT3ZlcnJpZGVGaWx0ZXIuY2xhc3MsIFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQdXQoKSB7CisgICAgICAgIGFzc2VydFJlc3BvbnNlRXF1YWxzKCJQVVQsUFVULFBVVCwiLCBfdGVzdCgiUFVUIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlbGV0ZSgpIHsKKyAgICAgICAgYXNzZXJ0UmVzcG9uc2VFcXVhbHMoIkRFTEVURSxERUxFVEUsREVMRVRFLCIsIF90ZXN0KCJERUxFVEUiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgeworICAgICAgICBhc3NlcnRSZXNwb25zZUVxdWFscygiR0VUOiB0ZXN0LEdFVDogdGVzdCxHRVQ6IHRlc3QsIiwgX3Rlc3QoIkdFVCIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25mbGljdGluZ01ldGhvZHMoKSB7CisgICAgICAgIFJlc3BvbnNlIGNyID0gdGFyZ2V0KCIvIikucXVlcnlQYXJhbSgiX21ldGhvZCIsICJQVVQiKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAuaGVhZGVyKCJYLUhUVFAtTWV0aG9kLU92ZXJyaWRlIiwgIkRFTEVURSIpLnBvc3QoRW50aXR5LnRleHQoIiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMCwgY3IuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVuc3VwcG9ydGVkTWV0aG9kKCkgeworICAgICAgICBhc3NlcnRSZXNwb25zZUVxdWFscygiNDA1LDQwNSw0MDUsIiwgX3Rlc3QoIlBBVENIIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFdpdGhRdWVyeVBhcmFtKCkgeworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gdGFyZ2V0KCkucXVlcnlQYXJhbSgiX21ldGhvZCIsICJHRVQiKS5xdWVyeVBhcmFtKCJhIiwgInRlc3QiKS5yZXF1ZXN0KCkucG9zdChudWxsLCBTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVDogdGVzdCIsIHJlc3VsdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0V2l0aE90aGVyRW50aXR5KCkgeworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gdGFyZ2V0KCkucXVlcnlQYXJhbSgiX21ldGhvZCIsICJHRVQiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkudGV4dCgiYT10ZXN0IiksIFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiR0VUOiBudWxsIiwgcmVzdWx0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQbGFpblBvc3QoKSB7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSB0YXJnZXQoKS5yZXF1ZXN0KCkucG9zdChudWxsLCBTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlBPU1QiLCByZXN1bHQpOworICAgIH0KKworICAgIHB1YmxpYyBSZXNwb25zZVtdIF90ZXN0KFN0cmluZyBtZXRob2QpIHsKKyAgICAgICAgUmVzcG9uc2VbXSByZXN1bHQgPSBuZXcgUmVzcG9uc2VbM107CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKTsKKworICAgICAgICByZXN1bHRbMF0gPSB0YXJnZXQucmVxdWVzdCgpLmhlYWRlcigiWC1IVFRQLU1ldGhvZC1PdmVycmlkZSIsIG1ldGhvZCkKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZm9ybShuZXcgRm9ybSgpLnBhcmFtKCJhIiwgInRlc3QiKSkpOworICAgICAgICByZXN1bHRbMV0gPSB0YXJnZXQucXVlcnlQYXJhbSgiX21ldGhvZCIsIG1ldGhvZCkucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmZvcm0obmV3IEZvcm0oKS5wYXJhbSgiYSIsICJ0ZXN0IikpKTsKKyAgICAgICAgcmVzdWx0WzJdID0gdGFyZ2V0LnF1ZXJ5UGFyYW0oIl9tZXRob2QiLCBtZXRob2QpLnJlcXVlc3QoKS5oZWFkZXIoIlgtSFRUUC1NZXRob2QtT3ZlcnJpZGUiLCBtZXRob2QpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmZvcm0obmV3IEZvcm0oKS5wYXJhbSgiYSIsICJ0ZXN0IikpKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBhc3NlcnRSZXNwb25zZUVxdWFscyhTdHJpbmcgZXhwZWN0ZWQsIFJlc3BvbnNlW10gcmVzcG9uc2VzKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworICAgICAgICBmb3IgKFJlc3BvbnNlIHIgOiByZXNwb25zZXMpIHsKKyAgICAgICAgICAgIGlmIChyLmdldFN0YXR1cygpID09IFJlc3BvbnNlLlN0YXR1cy5PSy5nZXRTdGF0dXNDb2RlKCkpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHIucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChyLmdldFN0YXR1cygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiwiKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgcmVzdWx0LnRvU3RyaW5nKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL2ZpbHRlci9Sb2xlc0FsbG93ZWRUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9maWx0ZXIvUm9sZXNBbGxvd2VkVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZGE2ZjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9maWx0ZXIvUm9sZXNBbGxvd2VkVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTc1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIuZmlsdGVyOworCitpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByaW9yaXRpZXM7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlByZU1hdGNoaW5nOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlNlY3VyaXR5Q29udGV4dDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJpb3JpdHk7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5zZWN1cml0eS5EZW55QWxsOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uc2VjdXJpdHkuUGVybWl0QWxsOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uc2VjdXJpdHkuUm9sZXNBbGxvd2VkOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5maWx0ZXIuUm9sZXNBbGxvd2VkRHluYW1pY0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICoKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitwdWJsaWMgY2xhc3MgUm9sZXNBbGxvd2VkVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQFByZU1hdGNoaW5nCisgICAgQFByaW9yaXR5KFByaW9yaXRpZXMuQVVUSEVOVElDQVRJT04pCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTZWN1cml0eUZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIgeworCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihmaW5hbCBDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0KSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdXNlciA9IHJlcXVlc3QuZ2V0SGVhZGVycygpLmdldEZpcnN0KCJYLVVTRVIiKTsKKyAgICAgICAgICAgIHJlcXVlc3Quc2V0U2VjdXJpdHlDb250ZXh0KG5ldyBBdXRoZW50aWNhdG9yKHVzZXIpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEF1dGhlbnRpY2F0b3IgaW1wbGVtZW50cyBTZWN1cml0eUNvbnRleHQgeworCisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIFByaW5jaXBhbCBwcmluY2lwYWw7CisKKyAgICAgICAgICAgIEF1dGhlbnRpY2F0b3IoZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgICAgICBwcmluY2lwYWwgPSBuYW1lID09IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgID8gbnVsbAorICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgUHJpbmNpcGFsKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFByaW5jaXBhbCBnZXRVc2VyUHJpbmNpcGFsKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBwcmluY2lwYWw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzVXNlckluUm9sZShmaW5hbCBTdHJpbmcgcm9sZSkgeworICAgICAgICAgICAgICAgIHJldHVybiByb2xlLmVxdWFscyhwcmluY2lwYWwuZ2V0TmFtZSgpKSB8fCAoInVzZXIiLmVxdWFscyhyb2xlKSAmJiAiYWRtaW4iLmVxdWFscyhwcmluY2lwYWwuZ2V0TmFtZSgpKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGlzU2VjdXJlKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRBdXRoZW50aWNhdGlvblNjaGVtZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgQFBlcm1pdEFsbAorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBSb2xlc0FsbG93ZWQoInVzZXIiKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJHRVQiOworICAgICAgICB9CisKKyAgICAgICAgQFJvbGVzQWxsb3dlZCgiYWRtaW4iKQorICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3QoZmluYWwgU3RyaW5nIGNvbnRlbnQpIHsKKyAgICAgICAgICAgIHJldHVybiBjb250ZW50OworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInN1YiIpCisgICAgICAgIHB1YmxpYyBTdWJSZXNvdXJjZSBnZXRTdWJSZXNvdXJjZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3ViUmVzb3VyY2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBSb2xlc0FsbG93ZWQoImFkbWluIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN1YlJlc291cmNlIHsKKworICAgICAgICBAUGF0aCgiZGVueS1hbGwiKQorICAgICAgICBARGVueUFsbAorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZGVueUFsbCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiR0VUIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJwZXJtaXQtYWxsIikKKyAgICAgICAgQFBlcm1pdEFsbAorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcGVybWl0QWxsKCkgeworICAgICAgICAgICAgcmV0dXJuICJHRVQiOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcywgUm9sZXNBbGxvd2VkRHluYW1pY0ZlYXR1cmUuY2xhc3MsIFNlY3VyaXR5RmlsdGVyLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRBc1VzZXIoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiR0VUIiwgdGFyZ2V0KCkucmVxdWVzdCgpLmhlYWRlcigiWC1VU0VSIiwgInVzZXIiKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0QXNBZG1pbigpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJHRVQiLCB0YXJnZXQoKS5yZXF1ZXN0KCkuaGVhZGVyKCJYLVVTRVIiLCAiYWRtaW4iKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdEFzVXNlcigpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgY3IgPSB0YXJnZXQoKS5yZXF1ZXN0KCkuaGVhZGVyKCJYLVVTRVIiLCAidXNlciIpLnBvc3QoRW50aXR5LnRleHQoIlBPU1QiKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDMsIGNyLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0QXNBZG1pbigpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJQT1NUIiwgdGFyZ2V0KCkucmVxdWVzdCgpLmhlYWRlcigiWC1VU0VSIiwgImFkbWluIikucG9zdChFbnRpdHkudGV4dCgiUE9TVCIpLCBTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZW55QWxsKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoNDAzLCB0YXJnZXQoInN1Yi9kZW55LWFsbCIpLnJlcXVlc3QoKS5oZWFkZXIoIlgtVVNFUiIsICJhZG1pbiIpLmdldCgpLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQZXJtaXRBbGwoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiR0VUIiwgdGFyZ2V0KCJzdWIvcGVybWl0LWFsbCIpLnJlcXVlc3QoKS5oZWFkZXIoIlgtVVNFUiIsICJ4eXoiKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm90QXV0aG9yaXplZCgpIHsKKyAgICAgICAgYXNzZXJ0VGhhdCgiVXNlciBzaG91bGQgbm90IGJlIGF1dGhvcml6ZWQuIiwgdGFyZ2V0KCkucmVxdWVzdCgpLmdldCgpLmdldFN0YXR1cygpLCBpcyg0MDMpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9maWx0ZXIvVXJpQ29ubmVnTGFuZ3VhZ2VNZWRpYVR5cGVOZWdhdGl2ZVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL2ZpbHRlci9VcmlDb25uZWdMYW5ndWFnZU1lZGlhVHlwZU5lZ2F0aXZlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMTkxZGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9maWx0ZXIvVXJpQ29ubmVnTGFuZ3VhZ2VNZWRpYVR5cGVOZWdhdGl2ZVRlc3QuamF2YQpAQCAtMCwwICsxLDk1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIuZmlsdGVyOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXF1ZXN0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5WYXJpYW50OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIE5vIGFjdGl2YXRpb24gcHJvcGVydHkgKHtAdmFsdWUgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMjTEFOR1VBR0VfTUFQUElOR1N9LAorICoge0B2YWx1ZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcyNNRURJQV9UWVBFX01BUFBJTkdTfSkgaXMgc2V0IGludG8ge0BsaW5rIFJlc291cmNlQ29uZmlnfSB3aGljaCBzaG91bGQKKyAqIGxlYWQgdG8gcG9pbnQgdGhhdCB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmZpbHRlci5VcmlDb25uZWdGaWx0ZXJ9IGlzIG5vdCByZWdpc3RlcmVkLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgVXJpQ29ubmVnTGFuZ3VhZ2VNZWRpYVR5cGVOZWdhdGl2ZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBQYXRoKCIvYWJjIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIExhbmd1YWdlVmFyaWFudFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBkb0dldChAQ29udGV4dCBSZXF1ZXN0IHIpIHsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8VmFyaWFudD4gdmFyaWFudHMgPSBWYXJpYW50LlZhcmlhbnRMaXN0QnVpbGRlci5uZXdJbnN0YW5jZSgpCisgICAgICAgICAgICAgICAgICAgIC5tZWRpYVR5cGVzKE1lZGlhVHlwZS52YWx1ZU9mKCJhcHBsaWNhdGlvbi9mb28iKSkKKyAgICAgICAgICAgICAgICAgICAgLmxhbmd1YWdlcyhuZXcgTG9jYWxlKCJlbiIpKS5sYW5ndWFnZXMobmV3IExvY2FsZSgiZnIiKSkuYWRkKCkKKyAgICAgICAgICAgICAgICAgICAgLm1lZGlhVHlwZXMoTWVkaWFUeXBlLnZhbHVlT2YoImFwcGxpY2F0aW9uL2JhciIpKQorICAgICAgICAgICAgICAgICAgICAubGFuZ3VhZ2VzKG5ldyBMb2NhbGUoImVuIikpLmxhbmd1YWdlcyhuZXcgTG9jYWxlKCJmciIpKS5hZGQoKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICAgICAgZmluYWwgVmFyaWFudCB2YXJpYW50ID0gci5zZWxlY3RWYXJpYW50KHZhcmlhbnRzKTsKKyAgICAgICAgICAgIGlmICh2YXJpYW50ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uubm90QWNjZXB0YWJsZSh2YXJpYW50cykuYnVpbGQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKHZhcmlhbnQuZ2V0TWVkaWFUeXBlKCkudG9TdHJpbmcoKSArICIsICIgKyB2YXJpYW50LmdldExhbmd1YWdlKCksIHZhcmlhbnQpLmJ1aWxkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKExhbmd1YWdlVmFyaWFudFJlc291cmNlLmNsYXNzKS5yZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWVkaWFUeXBlc0FuZExhbmd1YWdlc05lZ2F0aXZlKCkgeworICAgICAgICBfdGVzdCgiZW5nbGlzaCIsICJmb28iLCAiZW4iLCAiYXBwbGljYXRpb24vZm9vIik7CisgICAgICAgIF90ZXN0KCJmcmVuY2giLCAiZm9vIiwgImZyIiwgImFwcGxpY2F0aW9uL2ZvbyIpOworCisgICAgICAgIF90ZXN0KCJlbmdsaXNoIiwgImJhciIsICJlbiIsICJhcHBsaWNhdGlvbi9iYXIiKTsKKyAgICAgICAgX3Rlc3QoImZyZW5jaCIsICJiYXIiLCAiZnIiLCAiYXBwbGljYXRpb24vYmFyIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0KFN0cmluZyB1bCwgU3RyaW5nIHVtLCBTdHJpbmcgbCwgU3RyaW5nIG0pIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJhYmMuIiArIHVsICsgIi4iICsgdW0pLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwNCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiYWJjLiIgKyB1bSArICIuIiArIHVsKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDQsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoImFiYyIpLnJlcXVlc3QobSkuaGVhZGVyKEh0dHBIZWFkZXJzLkFDQ0VQVF9MQU5HVUFHRSwgbCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhtICsgIiwgIiArIGwsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhsLCByZXNwb25zZS5nZXRMYW5ndWFnZSgpLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobSwgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkudG9TdHJpbmcoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvZmlsdGVyL1VyaUNvbm5lZ0xhbmd1YWdlTWVkaWFUeXBlVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvZmlsdGVyL1VyaUNvbm5lZ0xhbmd1YWdlTWVkaWFUeXBlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNWI0OTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9maWx0ZXIvVXJpQ29ubmVnTGFuZ3VhZ2VNZWRpYVR5cGVUZXN0LmphdmEKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5maWx0ZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVxdWVzdDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVmFyaWFudDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIFVyaUNvbm5lZ0xhbmd1YWdlTWVkaWFUeXBlVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQFBhdGgoIi9hYmMiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTGFuZ3VhZ2VWYXJpYW50UmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGRvR2V0KEBDb250ZXh0IFJlcXVlc3QgcikgeworICAgICAgICAgICAgZmluYWwgTGlzdDxWYXJpYW50PiB2YXJpYW50cyA9IFZhcmlhbnQuVmFyaWFudExpc3RCdWlsZGVyLm5ld0luc3RhbmNlKCkKKyAgICAgICAgICAgICAgICAgICAgLm1lZGlhVHlwZXMoTWVkaWFUeXBlLnZhbHVlT2YoImFwcGxpY2F0aW9uL2ZvbyIpKQorICAgICAgICAgICAgICAgICAgICAubGFuZ3VhZ2VzKG5ldyBMb2NhbGUoImVuIikpLmxhbmd1YWdlcyhuZXcgTG9jYWxlKCJmciIpKS5hZGQoKQorICAgICAgICAgICAgICAgICAgICAubWVkaWFUeXBlcyhNZWRpYVR5cGUudmFsdWVPZigiYXBwbGljYXRpb24vYmFyIikpCisgICAgICAgICAgICAgICAgICAgIC5sYW5ndWFnZXMobmV3IExvY2FsZSgiZW4iKSkubGFuZ3VhZ2VzKG5ldyBMb2NhbGUoImZyIikpLmFkZCgpCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgICAgICBmaW5hbCBWYXJpYW50IHZhcmlhbnQgPSByLnNlbGVjdFZhcmlhbnQodmFyaWFudHMpOworICAgICAgICAgICAgaWYgKHZhcmlhbnQgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5ub3RBY2NlcHRhYmxlKHZhcmlhbnRzKS5idWlsZCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2sodmFyaWFudC5nZXRNZWRpYVR5cGUoKS50b1N0cmluZygpICsgIiwgIiArIHZhcmlhbnQuZ2V0TGFuZ3VhZ2UoKSwgdmFyaWFudCkuYnVpbGQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIE1hcDxTdHJpbmcsIE1lZGlhVHlwZT4gbWVkaWFUeXBlcyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgbWVkaWFUeXBlcy5wdXQoImZvbyIsIE1lZGlhVHlwZS52YWx1ZU9mKCJhcHBsaWNhdGlvbi9mb28iKSk7CisgICAgICAgIG1lZGlhVHlwZXMucHV0KCJiYXIiLCBNZWRpYVR5cGUudmFsdWVPZigiYXBwbGljYXRpb24vYmFyIikpOworCisgICAgICAgIE1hcDxTdHJpbmcsIFN0cmluZz4gbGFuZ3VhZ2VzID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICBsYW5ndWFnZXMucHV0KCJlbmdsaXNoIiwgImVuIik7CisgICAgICAgIGxhbmd1YWdlcy5wdXQoImZyZW5jaCIsICJmciIpOworCisgICAgICAgIFJlc291cmNlQ29uZmlnIHJjID0gbmV3IFJlc291cmNlQ29uZmlnKExhbmd1YWdlVmFyaWFudFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgcmMucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5MQU5HVUFHRV9NQVBQSU5HUywgbGFuZ3VhZ2VzKTsKKyAgICAgICAgcmMucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5NRURJQV9UWVBFX01BUFBJTkdTLCBtZWRpYVR5cGVzKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1lZGlhVHlwZXNBbmRMYW5ndWFnZXMoKSB7CisgICAgICAgIF90ZXN0KCJlbmdsaXNoIiwgImZvbyIsICJlbiIsICJhcHBsaWNhdGlvbi9mb28iKTsKKyAgICAgICAgX3Rlc3QoImZyZW5jaCIsICJmb28iLCAiZnIiLCAiYXBwbGljYXRpb24vZm9vIik7CisKKyAgICAgICAgX3Rlc3QoImVuZ2xpc2giLCAiYmFyIiwgImVuIiwgImFwcGxpY2F0aW9uL2JhciIpOworICAgICAgICBfdGVzdCgiZnJlbmNoIiwgImJhciIsICJmciIsICJhcHBsaWNhdGlvbi9iYXIiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3QoU3RyaW5nIHVsLCBTdHJpbmcgdW0sIFN0cmluZyBsLCBTdHJpbmcgbSkgeworICAgICAgICBSZXNwb25zZSByID0gdGFyZ2V0KCkucGF0aCgiYWJjLiIgKyB1bCArICIuIiArIHVtKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhtICsgIiwgIiArIGwsIHIucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGwsIHIuZ2V0TGFuZ3VhZ2UoKS50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG0sIHIuZ2V0TWVkaWFUeXBlKCkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgciA9IHRhcmdldCgpLnBhdGgoImFiYy4iICsgdW0gKyAiLiIgKyB1bCkucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMobSArICIsICIgKyBsLCByLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhsLCByLmdldExhbmd1YWdlKCkudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtLCByLmdldE1lZGlhVHlwZSgpLnRvU3RyaW5nKCkpOworCisgICAgICAgIHIgPSB0YXJnZXQoKS5wYXRoKCJhYmMiKS5yZXF1ZXN0KG0pLmhlYWRlcihIdHRwSGVhZGVycy5BQ0NFUFRfTEFOR1VBR0UsIGwpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMobSArICIsICIgKyBsLCByLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhsLCByLmdldExhbmd1YWdlKCkudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhtLCByLmdldE1lZGlhVHlwZSgpLnRvU3RyaW5nKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL2ZpbHRlci9VcmlDb25uZWdMYW5ndWFnZVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL2ZpbHRlci9VcmlDb25uZWdMYW5ndWFnZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWI1MzdiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvZmlsdGVyL1VyaUNvbm5lZ0xhbmd1YWdlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIuZmlsdGVyOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlcXVlc3Q7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlZhcmlhbnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK3B1YmxpYyBjbGFzcyBVcmlDb25uZWdMYW5ndWFnZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBQYXRoKCIvYWJjIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIExhbmd1YWdlVmFyaWFudFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBkb0dldChAQ29udGV4dCBSZXF1ZXN0IHJlcXVlc3QsIEBDb250ZXh0IEh0dHBIZWFkZXJzIGhlYWRlcnMpIHsKKworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIGhlYWRlcnMuZ2V0QWNjZXB0YWJsZUxhbmd1YWdlcygpLnNpemUoKSk7CisKKyAgICAgICAgICAgIExpc3Q8VmFyaWFudD4gdnMgPSBWYXJpYW50LlZhcmlhbnRMaXN0QnVpbGRlci5uZXdJbnN0YW5jZSgpCisgICAgICAgICAgICAgICAgICAgIC5sYW5ndWFnZXMobmV3IExvY2FsZSgiemgiKSkKKyAgICAgICAgICAgICAgICAgICAgLmxhbmd1YWdlcyhuZXcgTG9jYWxlKCJmciIpKQorICAgICAgICAgICAgICAgICAgICAubGFuZ3VhZ2VzKG5ldyBMb2NhbGUoImVuIikpLmFkZCgpCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgICAgICBWYXJpYW50IHYgPSByZXF1ZXN0LnNlbGVjdFZhcmlhbnQodnMpOworICAgICAgICAgICAgaWYgKHYgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5ub3RBY2NlcHRhYmxlKHZzKS5idWlsZCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2sodi5nZXRMYW5ndWFnZSgpLnRvU3RyaW5nKCksIHYpLmJ1aWxkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGxhbmd1YWdlcyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgbGFuZ3VhZ2VzLnB1dCgiZW5nbGlzaCIsICJlbiIpOworICAgICAgICBsYW5ndWFnZXMucHV0KCJmcmVuY2giLCAiZnIiKTsKKworICAgICAgICBSZXNvdXJjZUNvbmZpZyByYyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhMYW5ndWFnZVZhcmlhbnRSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJjLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuTEFOR1VBR0VfTUFQUElOR1MsIGxhbmd1YWdlcyk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMYW5ndWFnZXMoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiYWJjLmVuZ2xpc2giKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiZW4iLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoImVuIiwgcmVzcG9uc2UuZ2V0TGFuZ3VhZ2UoKS50b1N0cmluZygpKTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoImFiYy5mcmVuY2giKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiZnIiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZyIiwgcmVzcG9uc2UuZ2V0TGFuZ3VhZ2UoKS50b1N0cmluZygpKTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoImFiYy5mcmVuY2giKS5yZXF1ZXN0KCkuaGVhZGVyKEh0dHBIZWFkZXJzLkFDQ0VQVF9MQU5HVUFHRSwgImVuIikuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiZnIiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZyIiwgcmVzcG9uc2UuZ2V0TGFuZ3VhZ2UoKS50b1N0cmluZygpKTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoImFiYyIpLnJlcXVlc3QoKS5oZWFkZXIoSHR0cEhlYWRlcnMuQUNDRVBUX0xBTkdVQUdFLCAiZW4iKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJlbiIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZW4iLCByZXNwb25zZS5nZXRMYW5ndWFnZSgpLnRvU3RyaW5nKCkpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiYWJjIikucmVxdWVzdCgpLmhlYWRlcihIdHRwSGVhZGVycy5BQ0NFUFRfTEFOR1VBR0UsICJmciIpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZyIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmciIsIHJlc3BvbnNlLmdldExhbmd1YWdlKCkudG9TdHJpbmcoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvZmlsdGVyL1VyaUNvbm5lZ01hcHBpbmdGcm9tUHJvcGVydHkuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL2ZpbHRlci9VcmlDb25uZWdNYXBwaW5nRnJvbVByb3BlcnR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzgwZWQ0OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL2ZpbHRlci9VcmlDb25uZWdNYXBwaW5nRnJvbVByb3BlcnR5LmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLmZpbHRlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXM7CisKKy8qKgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK3B1YmxpYyBjbGFzcyBVcmlDb25uZWdNYXBwaW5nRnJvbVByb3BlcnR5IGV4dGVuZHMgVXJpQ29ubmVnTGFuZ3VhZ2VNZWRpYVR5cGVUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIFJlc291cmNlQ29uZmlnIHJjID0gbmV3IFJlc291cmNlQ29uZmlnKFVyaUNvbm5lZ0xhbmd1YWdlTWVkaWFUeXBlVGVzdC5MYW5ndWFnZVZhcmlhbnRSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJjLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuTUVESUFfVFlQRV9NQVBQSU5HUywgImZvbyA6IGFwcGxpY2F0aW9uL2ZvbywgYmFyIDogYXBwbGljYXRpb24vYmFyIik7CisgICAgICAgIHJjLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuTEFOR1VBR0VfTUFQUElOR1MsICJlbmdsaXNoIDogZW4sIGZyZW5jaCA6IGZyIik7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9maWx0ZXIvVXJpQ29ubmVnTWFwcGluZ0Zyb21TdHJpbmdUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9maWx0ZXIvVXJpQ29ubmVnTWFwcGluZ0Zyb21TdHJpbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdlMDYyNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL2ZpbHRlci9VcmlDb25uZWdNYXBwaW5nRnJvbVN0cmluZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIuZmlsdGVyOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKKworLyoqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIFVyaUNvbm5lZ01hcHBpbmdGcm9tU3RyaW5nVGVzdCBleHRlbmRzIFVyaUNvbm5lZ0xhbmd1YWdlTWVkaWFUeXBlVGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBSZXNvdXJjZUNvbmZpZyByYyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhMYW5ndWFnZVZhcmlhbnRSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJjLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuTEFOR1VBR0VfTUFQUElOR1MsICAiZW5nbGlzaCA6IGVuLCBmcmVuY2ggOiBmciIpOworICAgICAgICByYy5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLk1FRElBX1RZUEVfTUFQUElOR1MsICJmb28gOiBhcHBsaWNhdGlvbi9mb28sIGJhciA6IGFwcGxpY2F0aW9uL2JhciIpOworICAgICAgICByZXR1cm4gcmM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvZmlsdGVyL1VyaUNvbm5lZ01lZGlhVHlwZVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL2ZpbHRlci9VcmlDb25uZWdNZWRpYVR5cGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg0MmEzMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL2ZpbHRlci9VcmlDb25uZWdNZWRpYVR5cGVUZXN0LmphdmEKQEAgLTAsMCArMSwyMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5maWx0ZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIFVyaUNvbm5lZ01lZGlhVHlwZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIE1hcDxTdHJpbmcsIE1lZGlhVHlwZT4gbWVkaWFUeXBlcyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgbWVkaWFUeXBlcy5wdXQoImZvbyIsIE1lZGlhVHlwZS52YWx1ZU9mKCJhcHBsaWNhdGlvbi9mb28iKSk7CisgICAgICAgIG1lZGlhVHlwZXMucHV0KCJiYXIiLCBNZWRpYVR5cGUudmFsdWVPZigiYXBwbGljYXRpb24vYmFyIikpOworICAgICAgICBtZWRpYVR5cGVzLnB1dCgiZm9vdCIsIE1lZGlhVHlwZS52YWx1ZU9mKCJhcHBsaWNhdGlvbi9mb290IikpOworCisgICAgICAgIFNldDxDbGFzczw/Pj4gY2xhc3NlcyA9IG5ldyBIYXNoU2V0PD4oKTsKKworICAgICAgICBmb3IgKENsYXNzPD8+IGMgOiBVcmlDb25uZWdNZWRpYVR5cGVUZXN0LmNsYXNzLmdldENsYXNzZXMoKSkgeworICAgICAgICAgICAgaWYgKGMuZ2V0QW5ub3RhdGlvbihQYXRoLmNsYXNzKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY2xhc3Nlcy5hZGQoYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBSZXNvdXJjZUNvbmZpZyByYyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhjbGFzc2VzKTsKKyAgICAgICAgcmMucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5NRURJQV9UWVBFX01BUFBJTkdTLCBtZWRpYVR5cGVzKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIHB1YmxpYyBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgQmFzZSB7CisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mb28iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0Rm9vKEBDb250ZXh0IEh0dHBIZWFkZXJzIGhlYWRlcnMpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBoZWFkZXJzLmdldEFjY2VwdGFibGVNZWRpYVR5cGVzKCkuc2l6ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAiZm9vIjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mb290IikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldEZvb3QoKSB7CisgICAgICAgICAgICByZXR1cm4gImZvb3QiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2JhciIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZG9HZXRCYXIoKSB7CisgICAgICAgICAgICByZXR1cm4gImJhciI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL2FiYyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTaW5nbGVTZWdtZW50IGV4dGVuZHMgQmFzZSB7CisgICAgfQorCisgICAgQFBhdGgoIi94eXovIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNpbmdsZVNlZ21lbnRTbGFzaCBleHRlbmRzIEJhc2UgeworICAgIH0KKworICAgIEBQYXRoKCIveHl6L2FiYyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNdWx0aXBsZVNlZ21lbnRzIGV4dGVuZHMgQmFzZSB7CisgICAgfQorCisgICAgQFBhdGgoIi94eXoveHh4LyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNdWx0aXBsZVNlZ21lbnRzU2xhc2ggZXh0ZW5kcyBCYXNlIHsKKyAgICB9CisKKyAgICBAUGF0aCgiL3h5ei9hYmMueG1sIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIERvdFByZWZpeFNlZ21lbnRzIGV4dGVuZHMgQmFzZSB7CisgICAgfQorCisgICAgQFBhdGgoIi9mb29fYmFyX2Zvb3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGF0aFdpdGhTdWZmaXhTZWdtZW50IGV4dGVuZHMgQmFzZSB7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3ViUmVzb3VyY2VNZXRob2RzIGV4dGVuZHMgQmFzZSB7CisgICAgICAgIEBQYXRoKCJzdWIiKQorICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vZm9vIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkb0dldEZvb1MoKSB7CisgICAgICAgICAgICByZXR1cm4gImZvbyI7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgic3ViIikKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Zvb3QiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0Rm9vdFMoKSB7CisgICAgICAgICAgICByZXR1cm4gImZvb3QiOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInN1YiIpCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9iYXIiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGRvR2V0QmFyUygpIHsKKyAgICAgICAgICAgIHJldHVybiAiYmFyIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNsYXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoIi8iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGVTZWdtZW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoIi8iLCAiYWJjIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlU2VnbWVudFNsYXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoIi8iLCAieHl6IiwgIi8iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZVNlZ21lbnRzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoIi94eXoiLCAiYWJjIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVTZWdtZW50c1NsYXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoIi94eXoiLCAieHh4IiwgIi8iKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REb3RQcmVmaXhTZWdtZW50cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCIveHl6IiwgImFiYy54bWwiKTsKKyAgICAgICAgX3Rlc3QoIi94eXoiLCAiYWJjIiwgIi54bWwiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RYWFhTZWdtZW50KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoIi8iLCAiZm9vX2Jhcl9mb290Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3ViUmVzb3VyY2VNZXRob2RzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoIi8iLCAic3ViIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0KFN0cmluZyBiYXNlKSB7CisgICAgICAgIF90ZXN0KGJhc2UsICIiLCAiIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0KFN0cmluZyBiYXNlLCBTdHJpbmcgcGF0aCkgeworICAgICAgICBfdGVzdChiYXNlLCBwYXRoLCAiIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0KFN0cmluZyBiYXNlLCBTdHJpbmcgcGF0aCwgU3RyaW5nIHRlcm1pbmF0ZSkgeworICAgICAgICBXZWJUYXJnZXQgciA9IHRhcmdldCgpLnBhdGgoYmFzZSk7CisKKyAgICAgICAgU3RyaW5nIHMgPSByLnBhdGgocGF0aCArICIuZm9vIiArIHRlcm1pbmF0ZSkucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsIHMpOworCisgICAgICAgIHMgPSByLnBhdGgocGF0aCArICIuZm9vIiArIHRlcm1pbmF0ZSkucmVxdWVzdCgiYXBwbGljYXRpb24vYmFyIikuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiZm9vIiwgcyk7CisKKyAgICAgICAgcyA9IHIucGF0aChwYXRoICsgIi5mb290IiArIHRlcm1pbmF0ZSkucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZvb3QiLCBzKTsKKworICAgICAgICBzID0gci5wYXRoKHBhdGggKyAiLmJhciIgKyB0ZXJtaW5hdGUpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYXIiLCBzKTsKKworICAgICAgICBzID0gci5wYXRoKHBhdGggKyB0ZXJtaW5hdGUpLnJlcXVlc3QoImFwcGxpY2F0aW9uL2ZvbyIpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsIHMpOworCisgICAgICAgIHMgPSByLnBhdGgocGF0aCArIHRlcm1pbmF0ZSkucmVxdWVzdCgiYXBwbGljYXRpb24vZm9vdCIpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZvb3QiLCBzKTsKKworICAgICAgICBzID0gci5wYXRoKHBhdGggKyB0ZXJtaW5hdGUpLnJlcXVlc3QoImFwcGxpY2F0aW9uL2ZvbztxPTAuMSIpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZvbyIsIHMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL21vbml0b3JpbmcvQXBwbGljYXRpb25JbmZvVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbW9uaXRvcmluZy9BcHBsaWNhdGlvbkluZm9UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU2Yjk1MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL21vbml0b3JpbmcvQXBwbGljYXRpb25JbmZvVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTc5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIubW9uaXRvcmluZzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdHJhaW5lZFRvOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlJ1bnRpbWVUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJpb3JpdHk7CitpbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuc3BpLkF1dG9EaXNjb3ZlcmFibGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuc3BpLkZvcmNlZEF1dG9EaXNjb3ZlcmFibGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5Qcm9wZXJ0aWVzSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5BcHBsaWNhdGlvbkluZm87CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKKworLyoqCisgKiBUaGUgdGVzdCB1c2VzIHNlcnZlciBwcm9wZXJ0aWVzIHtAbGluayBTZXJ2ZXJQcm9wZXJ0aWVzI01PTklUT1JJTkdfU1RBVElTVElDU19NQkVBTlNfRU5BQkxFRH0sCisgKiB7QGxpbmsgU2VydmVyUHJvcGVydGllcyNNT05JVE9SSU5HX1NUQVRJU1RJQ1NfTUJFQU5TX0VOQUJMRUR9LAorICoge0BsaW5rIFNlcnZlclByb3BlcnRpZXMjTU9OSVRPUklOR19TVEFUSVNUSUNTX01CRUFOU19FTkFCTEVEfQorICogYW5kIGl0IGFsc28gaW1wbGVtZW50cyB7QGxpbmsgRm9yY2VkQXV0b0Rpc2NvdmVyYWJsZX0gYW5kIHRlc3RzIGlmIGl0IGlzIHBvc3NpYmxlIHRvIGluamVjdAorICoge0BsaW5rIEFwcGxpY2F0aW9uSW5mb30gaW4gZGlmZmVyZW50IGNpcmN1bXN0YW5jZXMuCisgKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbkluZm9UZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRk9SQ0VfRU5BQkxFID0gIkZPUkNFX0VOQUJMRSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEVOQUJMRV9NT05JVE9SSU5HID0gIkVOQUJMRV9NT05JVE9SSU5HIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5BQkxFX01PTklUT1JJTkdfU1RBVElTVElDUyA9ICJFTkFCTEVfTU9OSVRPUklOR19TVEFUSVNUSUNTIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5BQkxFX01PTklUT1JJTkdfU1RBVElTVElDU19NQkVBTlMgPSAiRU5BQkxFX01PTklUT1JJTkdfU1RBVElTVElDU19NQkVBTlMiOworCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPYmplY3RbXT4gdGVzdERhdGEoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXVtdIHsKKyAgICAgICAgICAgICAgICAvL2ZvcmNlLCAzeCBBdXRvRGlzY292ZXJhYmxlLCAzeCBSZXNvdXJjZUNvbmZpZywgICByZXNwb25zZQorICAgICAgICAgICAgICAgIC8vIG5vIHByb3BlcnR5IHNldCA9PiA1MDAKKyAgICAgICAgICAgICAgICB7ZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwsIDUwMH0sCisgICAgICAgICAgICAgICAgLy8gcHJvcGVydHkgc2V0IGJ5IEZvcmNlZEF1dG9EaXNjb3ZlcmFibGUgPT4gMjAwCisgICAgICAgICAgICAgICAge2ZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwsIDIwMH0sCisgICAgICAgICAgICAgICAge2ZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIG51bGwsIG51bGwsIG51bGwsIDIwMH0sCisgICAgICAgICAgICAgICAge2ZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIG51bGwsIG51bGwsIG51bGwsIDIwMH0sCisgICAgICAgICAgICAgICAgLy8gcHJvcGVydHkgZGlzYWJsZSBieSBSZXNvdXJjZUNvbmZpZyA9PiA1MDAKKyAgICAgICAgICAgICAgICB7ZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgNTAwfSwKKyAgICAgICAgICAgICAgICB7ZmFsc2UsIGZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgNTAwfSwKKyAgICAgICAgICAgICAgICB7ZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgNTAwfSwKKyAgICAgICAgICAgICAgICAvLyBwcm9wZXJ0eSBkaXNhYmxlIGJ5IFJlc291cmNlQ29uZmlnIGJ1dCBmb3JjZWQgYnkgRm9yY2VkQXV0b0Rpc2NvdmVyYWJsZSA9PiAyMDAKKyAgICAgICAgICAgICAgICB7dHJ1ZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAyMDB9LAorICAgICAgICAgICAgICAgIHt0cnVlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIDIwMH0sCisgICAgICAgICAgICAgICAge3RydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgMjAwfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCByZXNwb25zZVN0YXR1czsKKworICAgIHB1YmxpYyBBcHBsaWNhdGlvbkluZm9UZXN0KGJvb2xlYW4gZm9yY2VFbmFibGUsIGJvb2xlYW4gZW5hYmxlTW9uaXRvcmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGVuYWJsZU1vbml0b3JpbmdTdGF0aXN0aWNzLCBib29sZWFuIGVuYWJsZU1vbml0b3JpbmdTdGF0aXN0aWNzTUJlYW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb2xlYW4gbW9uaXRvcmluZ0VuYWJsZWQsIEJvb2xlYW4gbW9uaXRvcmluZ1N0YXRpc3RpY3NFbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvb2xlYW4gbW9uaXRvcmluZ1N0YXRpc3RpY3NNQmVhbnNFbmFibGVkLCBpbnQgcmVzcG9uc2VTdGF0dXMpIHsKKyAgICAgICAgc3VwZXIoY3JlYXRlQXBwbGljYXRpb24oZm9yY2VFbmFibGUsIGVuYWJsZU1vbml0b3JpbmcsCisgICAgICAgICAgICAgICAgZW5hYmxlTW9uaXRvcmluZ1N0YXRpc3RpY3MsIGVuYWJsZU1vbml0b3JpbmdTdGF0aXN0aWNzTUJlYW5zLAorICAgICAgICAgICAgICAgIG1vbml0b3JpbmdFbmFibGVkLCBtb25pdG9yaW5nU3RhdGlzdGljc0VuYWJsZWQsCisgICAgICAgICAgICAgICAgbW9uaXRvcmluZ1N0YXRpc3RpY3NNQmVhbnNFbmFibGVkKSk7CisgICAgICAgIHRoaXMucmVzcG9uc2VTdGF0dXMgPSByZXNwb25zZVN0YXR1czsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBBcHBsaWNhdGlvbiBjcmVhdGVBcHBsaWNhdGlvbihib29sZWFuIGZvcmNlRW5hYmxlLCBib29sZWFuIGVuYWJsZU1vbml0b3JpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBlbmFibGVNb25pdG9yaW5nU3RhdGlzdGljcywgYm9vbGVhbiBlbmFibGVNb25pdG9yaW5nU3RhdGlzdGljc01CZWFucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb29sZWFuIG1vbml0b3JpbmdFbmFibGVkLCBCb29sZWFuIG1vbml0b3JpbmdTdGF0aXN0aWNzRW5hYmxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCb29sZWFuIG1vbml0b3JpbmdTdGF0aXN0aWNzTUJlYW5zRW5hYmxlZCkgeworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuQVBQTElDQVRJT05fTkFNRSwgInRlc3RBcHAiKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucHJvcGVydHkoRk9SQ0VfRU5BQkxFLCBmb3JjZUVuYWJsZSk7CisgICAgICAgIGlmIChlbmFibGVNb25pdG9yaW5nKSB7CisgICAgICAgICAgICByZXNvdXJjZUNvbmZpZy5wcm9wZXJ0eShFTkFCTEVfTU9OSVRPUklORywgdHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVuYWJsZU1vbml0b3JpbmdTdGF0aXN0aWNzKSB7CisgICAgICAgICAgICByZXNvdXJjZUNvbmZpZy5wcm9wZXJ0eShFTkFCTEVfTU9OSVRPUklOR19TVEFUSVNUSUNTLCB0cnVlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZW5hYmxlTW9uaXRvcmluZ1N0YXRpc3RpY3NNQmVhbnMpIHsKKyAgICAgICAgICAgIHJlc291cmNlQ29uZmlnLnByb3BlcnR5KEVOQUJMRV9NT05JVE9SSU5HX1NUQVRJU1RJQ1NfTUJFQU5TLCB0cnVlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobW9uaXRvcmluZ0VuYWJsZWQgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVzb3VyY2VDb25maWcucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5NT05JVE9SSU5HX0VOQUJMRUQsIG1vbml0b3JpbmdFbmFibGVkKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobW9uaXRvcmluZ1N0YXRpc3RpY3NFbmFibGVkICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlc291cmNlQ29uZmlnLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuTU9OSVRPUklOR19TVEFUSVNUSUNTX0VOQUJMRUQsIG1vbml0b3JpbmdTdGF0aXN0aWNzRW5hYmxlZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1vbml0b3JpbmdTdGF0aXN0aWNzTUJlYW5zRW5hYmxlZCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXNvdXJjZUNvbmZpZy5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLk1PTklUT1JJTkdfU1RBVElTVElDU19NQkVBTlNfRU5BQkxFRCwgbW9uaXRvcmluZ1N0YXRpc3RpY3NNQmVhbnNFbmFibGVkKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXNvdXJjZUNvbmZpZzsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3QoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMocmVzcG9uc2VTdGF0dXMsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgaWYgKHJlc3BvbnNlU3RhdHVzID09IDIwMCkgeworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygidGVzdEFwcCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBDb250ZXh0CisgICAgICAgIFByb3ZpZGVyPEFwcGxpY2F0aW9uSW5mbz4gYXBwbGljYXRpb25JbmZvUHJvdmlkZXI7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEFwcE5hbWUoKSB7CisgICAgICAgICAgICBmaW5hbCBBcHBsaWNhdGlvbkluZm8gYXBwbGljYXRpb25JbmZvID0gYXBwbGljYXRpb25JbmZvUHJvdmlkZXIuZ2V0KCk7CisgICAgICAgICAgICByZXR1cm4gYXBwbGljYXRpb25JbmZvLmdldFJlc291cmNlQ29uZmlnKCkuZ2V0QXBwbGljYXRpb25OYW1lKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAQ29uc3RyYWluZWRUbyhSdW50aW1lVHlwZS5TRVJWRVIpCisgICAgQFByaW9yaXR5KEF1dG9EaXNjb3ZlcmFibGUuREVGQVVMVF9QUklPUklUWSAtIDEpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGb3JjZWRBdXRvRGlzY292ZXJhYmxlSW1wbCBpbXBsZW1lbnRzIEZvcmNlZEF1dG9EaXNjb3ZlcmFibGUgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoZmluYWwgRmVhdHVyZUNvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBmb3JjZUVuYWJsZSA9IFByb3BlcnRpZXNIZWxwZXIuaXNQcm9wZXJ0eShjb250ZXh0LmdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0eShGT1JDRV9FTkFCTEUpKTsKKyAgICAgICAgICAgIGlmIChQcm9wZXJ0aWVzSGVscGVyLmlzUHJvcGVydHkoY29udGV4dC5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UHJvcGVydHkoRU5BQkxFX01PTklUT1JJTkcpKSkgeworICAgICAgICAgICAgICAgIGVuYWJsZShjb250ZXh0LCBmb3JjZUVuYWJsZSwgU2VydmVyUHJvcGVydGllcy5NT05JVE9SSU5HX0VOQUJMRUQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKFByb3BlcnRpZXNIZWxwZXIuaXNQcm9wZXJ0eShjb250ZXh0LmdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0eShFTkFCTEVfTU9OSVRPUklOR19TVEFUSVNUSUNTKSkpIHsKKyAgICAgICAgICAgICAgICBlbmFibGUoY29udGV4dCwgZm9yY2VFbmFibGUsIFNlcnZlclByb3BlcnRpZXMuTU9OSVRPUklOR19TVEFUSVNUSUNTX0VOQUJMRUQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKFByb3BlcnRpZXNIZWxwZXIuaXNQcm9wZXJ0eShjb250ZXh0LmdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0eShFTkFCTEVfTU9OSVRPUklOR19TVEFUSVNUSUNTX01CRUFOUykpKSB7CisgICAgICAgICAgICAgICAgZW5hYmxlKGNvbnRleHQsIGZvcmNlRW5hYmxlLCBTZXJ2ZXJQcm9wZXJ0aWVzLk1PTklUT1JJTkdfU1RBVElTVElDU19NQkVBTlNfRU5BQkxFRCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgZW5hYmxlKEZlYXR1cmVDb250ZXh0IGNvbnRleHQsIGJvb2xlYW4gZm9yY2VFbmFibGUsIFN0cmluZyBwcm9wZXJ0eU5hbWUpIHsKKyAgICAgICAgICAgIGlmIChmb3JjZUVuYWJsZSkgeworICAgICAgICAgICAgICAgIGNvbnRleHQucHJvcGVydHkocHJvcGVydHlOYW1lLCB0cnVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRleHQuZ2V0Q29uZmlndXJhdGlvbigpLmdldFByb3BlcnR5KHByb3BlcnR5TmFtZSkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnByb3BlcnR5KHByb3BlcnR5TmFtZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL21vbml0b3JpbmcvRXZlbnRMaXN0ZW5lclRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL21vbml0b3JpbmcvRXZlbnRMaXN0ZW5lclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmRhOWE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbW9uaXRvcmluZy9FdmVudExpc3RlbmVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDA3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIubW9uaXRvcmluZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQXN5bmNSZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlc3BvbnNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlByZU1hdGNoaW5nOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5TdXNwZW5kZWQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkSGFzaE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LkV4Y2VwdGlvbk1hcHBlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5NYW5hZ2VkQXN5bmM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1ldGhvZDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5BcHBsaWNhdGlvbkV2ZW50OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLkFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5SZXF1ZXN0RXZlbnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuUmVxdWVzdEV2ZW50TGlzdGVuZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworCisvKioKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIEV2ZW50TGlzdGVuZXJUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTElDQVRJT05fTkFNRSA9ICJNeUFwcGxpY2F0aW9uIjsKKyAgICBwcml2YXRlIHN0YXRpYyBBcHBFdmVudExpc3RlbmVyIGFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lcjsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIGFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lciA9IG5ldyBBcHBFdmVudExpc3RlbmVyKCk7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKE15UmVzb3VyY2UuY2xhc3MpOworICAgICAgICByZXNvdXJjZUNvbmZpZy5yZWdpc3RlcihhcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXIpOworICAgICAgICByZXNvdXJjZUNvbmZpZy5yZWdpc3RlcihSZXF1ZXN0RmlsdGVyLmNsYXNzKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucmVnaXN0ZXIoUHJlTWF0Y2hpbmdSZXF1ZXN0RmlsdGVyLmNsYXNzKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucmVnaXN0ZXIoUmVzcG9uc2VGaWx0ZXIuY2xhc3MpOworICAgICAgICByZXNvdXJjZUNvbmZpZy5yZWdpc3RlcihNeUV4Y2VwdGlvbk1hcHBlci5jbGFzcyk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnNldEFwcGxpY2F0aW9uTmFtZShBUFBMSUNBVElPTl9OQU1FKTsKKyAgICAgICAgcmV0dXJuIHJlc291cmNlQ29uZmlnOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQXBwRXZlbnRMaXN0ZW5lciBpbXBsZW1lbnRzIEFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lciB7CisgICAgICAgIHByaXZhdGUgQXBwbGljYXRpb25FdmVudCBhcHBFdmVudEluaXRTdGFydDsKKyAgICAgICAgcHJpdmF0ZSBBcHBsaWNhdGlvbkV2ZW50IGFwcEV2ZW50SW5pdEZpbmlzaGVkOworICAgICAgICBwcml2YXRlIFJlcXVlc3RFdmVudCBuZXdSZXF1ZXN0RXZlbnQ7CisgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgaW50IHJlc291cmNlTWV0aG9kRXZlbnRDb3VudCA9IDA7CisgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgQ291bnREb3duTGF0Y2ggZmluaXNoZWRDYWxsZWQgPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRXZlbnQoQXBwbGljYXRpb25FdmVudCBldmVudCkgeworICAgICAgICAgICAgc3dpdGNoIChldmVudC5nZXRUeXBlKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIElOSVRJQUxJWkFUSU9OX1NUQVJUOgorICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcEV2ZW50SW5pdFN0YXJ0ID0gZXZlbnQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgSU5JVElBTElaQVRJT05fQVBQX0ZJTklTSEVEOgorICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcEV2ZW50SW5pdEZpbmlzaGVkID0gZXZlbnQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXF1ZXN0RXZlbnRMaXN0ZW5lciBvblJlcXVlc3QoUmVxdWVzdEV2ZW50IG5ld1JlcXVlc3RFdmVudCkgeworICAgICAgICAgICAgdGhpcy5uZXdSZXF1ZXN0RXZlbnQgPSBuZXdSZXF1ZXN0RXZlbnQ7CisgICAgICAgICAgICBpZiAoIlBPU1QiLmVxdWFscyhuZXdSZXF1ZXN0RXZlbnQuZ2V0Q29udGFpbmVyUmVxdWVzdCgpLmdldE1ldGhvZCgpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gbmV3IFJlcUV2ZW50TGlzdGVuZXIodGhpcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlcUV2ZW50TGlzdGVuZXIgaW1wbGVtZW50cyBSZXF1ZXN0RXZlbnRMaXN0ZW5lciB7CisgICAgICAgIHByaXZhdGUgZmluYWwgQXBwRXZlbnRMaXN0ZW5lciBhcHBFdmVudExpc3RlbmVyOworCisgICAgICAgIHB1YmxpYyBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gZXZlbnREYXRhID0gbmV3IE11bHRpdmFsdWVkSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKworICAgICAgICBwdWJsaWMgUmVxRXZlbnRMaXN0ZW5lcihBcHBFdmVudExpc3RlbmVyIGFwcEV2ZW50TGlzdGVuZXIpIHsKKyAgICAgICAgICAgIHRoaXMuYXBwRXZlbnRMaXN0ZW5lciA9IGFwcEV2ZW50TGlzdGVuZXI7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIGludCBpbmRleCA9IDE7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIG9uRXZlbnQoUmVxdWVzdEV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LmdldFR5cGUoKSkgeworICAgICAgICAgICAgICAgIGNhc2UgUkVRVUVTVF9NQVRDSEVEOgorICAgICAgICAgICAgICAgICAgICBldmVudERhdGEuYWRkKCJSLlJFUV9GSUxURVJTX1NUQVJULm9yZGVyIiwgU3RyaW5nLnZhbHVlT2YoaW5kZXgrKykpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFJFUVVFU1RfRklMVEVSRUQ6CisgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YS5hZGQoIlIuUkVRX0ZJTFRFUlNfRklOSVNIRUQub3JkZXIiLCBTdHJpbmcudmFsdWVPZihpbmRleCsrKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgTE9DQVRPUl9NQVRDSEVEOgorICAgICAgICAgICAgICAgICAgICBldmVudERhdGEuYWRkKCJSLk1BVENIRURfTE9DQVRPUi5vcmRlciIsIFN0cmluZy52YWx1ZU9mKGluZGV4KyspKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxSZXNvdXJjZU1ldGhvZD4gbG9jYXRvcnMgPSBldmVudC5nZXRVcmlJbmZvKCkuZ2V0TWF0Y2hlZFJlc291cmNlTG9jYXRvcnMoKTsKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nIG1zZyA9IFN0cmluZy52YWx1ZU9mKGxvY2F0b3JzLnNpemUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI6IiArIGxvY2F0b3JzLmdldCgwKS5nZXRJbnZvY2FibGUoKS5nZXRIYW5kbGluZ01ldGhvZCgpLmdldE5hbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhLmFkZCgiUi5NQVRDSEVEX0xPQ0FUT1IiLCBtc2cpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNVQlJFU09VUkNFX0xPQ0FURUQ6CisgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YS5hZGQoIlIuTUFUQ0hFRF9TVUJfUkVTT1VSQ0Uub3JkZXIiLCBTdHJpbmcudmFsdWVPZihpbmRleCsrKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUkVTT1VSQ0VfTUVUSE9EX1NUQVJUOgorICAgICAgICAgICAgICAgICAgICBldmVudERhdGEuYWRkKCJSLlJFU09VUkNFX01FVEhPRF9TVEFSVC5vcmRlciIsIFN0cmluZy52YWx1ZU9mKGluZGV4KyspKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBFdmVudExpc3RlbmVyLnJlc291cmNlTWV0aG9kRXZlbnRDb3VudCsrOworICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZU1ldGhvZCByZXNvdXJjZU1ldGhvZCA9IGV2ZW50LmdldFVyaUluZm8oKS5nZXRNYXRjaGVkUmVzb3VyY2VNZXRob2QoKTsKKyAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhLmFkZCgiUi5SRVNPVVJDRV9NRVRIT0RfU1RBUlQubWV0aG9kIiwgcmVzb3VyY2VNZXRob2QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0SW52b2NhYmxlKCkuZ2V0SGFuZGxpbmdNZXRob2QoKS5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFJFU09VUkNFX01FVEhPRF9GSU5JU0hFRDoKKyAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhLmFkZCgiUi5SRVNPVVJDRV9NRVRIT0RfRklOSVNIRUQub3JkZXIiLCBTdHJpbmcudmFsdWVPZihpbmRleCsrKSk7CisgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YS5hZGQoIlIuUkVTT1VSQ0VfTUVUSE9EX0ZJTklTSEVEIiwgIm9rIik7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgUkVTUF9GSUxURVJTX1NUQVJUOgorICAgICAgICAgICAgICAgICAgICBldmVudERhdGEuYWRkKCJSLlJFU1BfRklMVEVSU19TVEFSVC5vcmRlciIsIFN0cmluZy52YWx1ZU9mKGluZGV4KyspKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBFWENFUFRJT05fTUFQUEVSX0ZPVU5EOgorICAgICAgICAgICAgICAgICAgICBldmVudERhdGEuYWRkKCJSLkVYQ0VQVElPTl9NQVBQRVJfRk9VTkQub3JkZXIiLCBTdHJpbmcudmFsdWVPZihpbmRleCsrKSk7CisgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YS5hZGQoIlIuRVhDRVBUSU9OX01BUFBFUl9GT1VORC5leGNlcHRpb24iLCBldmVudC5nZXRFeGNlcHRpb24oKS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFJFU1BfRklMVEVSU19GSU5JU0hFRDoKKyAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhLmFkZCgiUi5SRVNQX0ZJTFRFUlNfRklOSVNIRUQub3JkZXIiLCBTdHJpbmcudmFsdWVPZihpbmRleCsrKSk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoTWFwLkVudHJ5PFN0cmluZywgTGlzdDxTdHJpbmc+PiBlbnRyeSA6IGV2ZW50RGF0YS5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBldmVudC5nZXRDb250YWluZXJSZXNwb25zZSgpLmdldEhlYWRlcnMoKS5hZGRBbGwoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgRklOSVNIRUQ6CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGV2ZW50LmdldENvbnRhaW5lclJlc3BvbnNlKCkpOworICAgICAgICAgICAgICAgICAgICB0aGlzLmFwcEV2ZW50TGlzdGVuZXIuZmluaXNoZWRDYWxsZWQuY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeU1hcHBhYmxlRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisgICAgICAgIHB1YmxpYyBNeU1hcHBhYmxlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgICAgICBzdXBlcihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlFeGNlcHRpb25NYXBwZXIgaW1wbGVtZW50cyBFeGNlcHRpb25NYXBwZXI8TXlNYXBwYWJsZUV4Y2VwdGlvbj4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgdG9SZXNwb25zZShNeU1hcHBhYmxlRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCJtYXBwZWQiKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXF1ZXN0RmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcmVNYXRjaGluZworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHJlTWF0Y2hpbmdSZXF1ZXN0RmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgfQorICAgIH0KKworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNwb25zZUZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LCBDb250YWluZXJSZXNwb25zZUNvbnRleHQgcmVzcG9uc2VDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15UmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRNZXRob2QoKSB7CisgICAgICAgICAgICByZXR1cm4gImdldCI7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgdm9pZCBwb3N0KFN0cmluZyBlbnRpdHkpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJsb2NhdG9yIikKKyAgICAgICAgcHVibGljIFN1YlJlc291cmNlIGxvY2F0b3IoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN1YlJlc291cmNlKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJhc3luYyIpCisgICAgICAgIEBNYW5hZ2VkQXN5bmMKKyAgICAgICAgcHVibGljIHZvaWQgZ2V0QXN5bmMoQFN1c3BlbmRlZCBBc3luY1Jlc3BvbnNlIGFzeW5jUmVzcG9uc2UpIHsKKyAgICAgICAgICAgIGFzeW5jUmVzcG9uc2UucmVzdW1lKFJlc3BvbnNlLm9rKCJhc3luYyIpLmJ1aWxkKCkpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgd29ya3MgaW4gdGhlIGFzeW5jIHdheSBidXQgaXQgaXMgc2VydmVkIGJ5IG9ubHkgb25lIHRocmVhZC4KKyAgICAgICAgICogQHBhcmFtIGFzeW5jUmVzcG9uc2UKKyAgICAgICAgICovCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImFzeW5jT25lVGhyZWFkIikKKyAgICAgICAgcHVibGljIHZvaWQgZ2V0QXN5bmNPbmVUaHJlYWQoQFN1c3BlbmRlZCBBc3luY1Jlc3BvbnNlIGFzeW5jUmVzcG9uc2UpIHsKKyAgICAgICAgICAgIGFzeW5jUmVzcG9uc2UucmVzdW1lKFJlc3BvbnNlLm9rKCJhc3luYyIpLmJ1aWxkKCkpOworICAgICAgICB9CisgICAgfQorCisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN1YlJlc291cmNlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAic3ViIjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImV4Y2VwdGlvbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhjZXB0aW9uKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE15TWFwcGFibGVFeGNlcHRpb24oInRlc3QtZXJyb3IiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFwcGxpY2F0aW9uRXZlbnRzKCkgeworICAgICAgICBhc3NlcnROb3ROdWxsKGFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lci5hcHBFdmVudEluaXRTdGFydCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoYXBwbGljYXRpb25FdmVudExpc3RlbmVyLmFwcEV2ZW50SW5pdEZpbmlzaGVkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEFQUExJQ0FUSU9OX05BTUUsIGFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lci5hcHBFdmVudEluaXRTdGFydC5nZXRSZXNvdXJjZUNvbmZpZygpLmdldEFwcGxpY2F0aW9uTmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChhcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXIubmV3UmVxdWVzdEV2ZW50KTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnROb3ROdWxsKGFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lci5uZXdSZXF1ZXN0RXZlbnQpOworCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlUmVxdWVzdEV2ZW50KCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgYXBwbGljYXRpb25FdmVudExpc3RlbmVyLnJlc291cmNlTWV0aG9kRXZlbnRDb3VudCk7CisgICAgICAgIGFzc2VydE5vdE51bGwoYXBwbGljYXRpb25FdmVudExpc3RlbmVyLmFwcEV2ZW50SW5pdFN0YXJ0KTsKKyAgICAgICAgYXNzZXJ0TnVsbChhcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXIubmV3UmVxdWVzdEV2ZW50KTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZSIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoImVudGl0eSIsCisgICAgICAgICAgICAgICAgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjA0LCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydE5vdE51bGwoYXBwbGljYXRpb25FdmVudExpc3RlbmVyLm5ld1JlcXVlc3RFdmVudCk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBhcHBsaWNhdGlvbkV2ZW50TGlzdGVuZXIucmVzb3VyY2VNZXRob2RFdmVudENvdW50KTsKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgYXBwbGljYXRpb25FdmVudExpc3RlbmVyLnJlc291cmNlTWV0aG9kRXZlbnRDb3VudCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWF0Y2hlZExvY2F0b3IoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UvbG9jYXRvciIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInN1YiIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWzE6bG9jYXRvcl0iLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIlIuTUFUQ0hFRF9MT0NBVE9SIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hdGNoZWRNZXRob2QoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXQiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIltnZXRNZXRob2RdIiwgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJSLlJFU09VUkNFX01FVEhPRF9TVEFSVC5tZXRob2QiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiW29rXSIsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiUi5SRVNPVVJDRV9NRVRIT0RfRklOSVNIRUQiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhjZXB0aW9uKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlL2xvY2F0b3IvZXhjZXB0aW9uIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygibWFwcGVkIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5tb25pdG9yaW5nLkV2ZW50TGlzdGVuZXJUZXN0JE15TWFwcGFibGVFeGNlcHRpb246IHRlc3QtZXJyb3JdIiwKKyAgICAgICAgICAgICAgICByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIlIuRVhDRVBUSU9OX01BUFBFUl9GT1VORC5leGNlcHRpb24iKSk7CisgICAgfQorCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVQcm9jZXNzaW5nKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXQiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworCisKKyAgICAgICAgaW50IGkgPSAxOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVzcG9uc2UuZ2V0SGVhZGVycygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbIiArIGkrKyArICJdIiwgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJSLlJFUV9GSUxURVJTX1NUQVJULm9yZGVyIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlsiICsgaSsrICsgIl0iLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIlIuUkVRX0ZJTFRFUlNfRklOSVNIRUQub3JkZXIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWyIgKyBpKysgKyAiXSIsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiUi5SRVNPVVJDRV9NRVRIT0RfU1RBUlQub3JkZXIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWyIgKyBpKysgKyAiXSIsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiUi5SRVNPVVJDRV9NRVRIT0RfRklOSVNIRUQub3JkZXIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWyIgKyBpKysgKyAiXSIsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiUi5SRVNQX0ZJTFRFUlNfU1RBUlQub3JkZXIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWyIgKyBpICsgIl0iLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIlIuUkVTUF9GSUxURVJTX0ZJTklTSEVELm9yZGVyIikpOworICAgIH0KKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TG9jYXRvclByb2Nlc3NpbmcoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UvbG9jYXRvciIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygic3ViIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKworCisgICAgICAgIGludCBpID0gMTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKHJlc3BvbnNlLmdldEhlYWRlcnMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWyIgKyBpKysgKyAiXSIsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiUi5NQVRDSEVEX0xPQ0FUT1Iub3JkZXIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWyIgKyBpKysgKyAiXSIsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiUi5NQVRDSEVEX1NVQl9SRVNPVVJDRS5vcmRlciIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbIiArIGkrKyArICJdIiwgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJSLlJFUV9GSUxURVJTX1NUQVJULm9yZGVyIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlsiICsgaSsrICsgIl0iLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIlIuUkVRX0ZJTFRFUlNfRklOSVNIRUQub3JkZXIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWyIgKyBpKysgKyAiXSIsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiUi5SRVNPVVJDRV9NRVRIT0RfU1RBUlQub3JkZXIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWyIgKyBpKysgKyAiXSIsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiUi5SRVNPVVJDRV9NRVRIT0RfRklOSVNIRUQub3JkZXIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWyIgKyBpKysgKyAiXSIsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiUi5SRVNQX0ZJTFRFUlNfU1RBUlQub3JkZXIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWyIgKyBpICsgIl0iLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIlIuUkVTUF9GSUxURVJTX0ZJTklTSEVELm9yZGVyIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvblByb2Nlc3NpbmcoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UvbG9jYXRvci9leGNlcHRpb24iKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIm1hcHBlZCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisKKworICAgICAgICBpbnQgaSA9IDE7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZXNwb25zZS5nZXRIZWFkZXJzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlsiICsgaSsrICsgIl0iLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIlIuTUFUQ0hFRF9MT0NBVE9SLm9yZGVyIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlsiICsgaSsrICsgIl0iLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIlIuTUFUQ0hFRF9TVUJfUkVTT1VSQ0Uub3JkZXIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWyIgKyBpKysgKyAiXSIsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiUi5SRVFfRklMVEVSU19TVEFSVC5vcmRlciIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbIiArIGkrKyArICJdIiwgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJSLlJFUV9GSUxURVJTX0ZJTklTSEVELm9yZGVyIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlsiICsgaSsrICsgIl0iLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIlIuUkVTT1VSQ0VfTUVUSE9EX1NUQVJULm9yZGVyIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlsiICsgaSsrICsgIl0iLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIlIuUkVTT1VSQ0VfTUVUSE9EX0ZJTklTSEVELm9yZGVyIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlsiICsgaSsrICsgIl0iLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIlIuRVhDRVBUSU9OX01BUFBFUl9GT1VORC5vcmRlciIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbIiArIGkrKyArICJdIiwgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJSLlJFU1BfRklMVEVSU19TVEFSVC5vcmRlciIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbIiArIGkgKyAiXSIsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiUi5SRVNQX0ZJTFRFUlNfRklOSVNIRUQub3JkZXIiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNQcm9jZXNzaW5nKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZS9hc3luYyIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFzeW5jIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICBpbnQgaSA9IDE7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZXNwb25zZS5nZXRIZWFkZXJzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlsiICsgaSsrICsgIl0iLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIlIuUkVRX0ZJTFRFUlNfU1RBUlQub3JkZXIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWyIgKyBpKysgKyAiXSIsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiUi5SRVFfRklMVEVSU19GSU5JU0hFRC5vcmRlciIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbIiArIGkrKyArICJdIiwgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJSLlJFU09VUkNFX01FVEhPRF9TVEFSVC5vcmRlciIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbIiArIGkrKyArICJdIiwgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJSLlJFU1BfRklMVEVSU19TVEFSVC5vcmRlciIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbIiArIGkgKyAiXSIsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiUi5SRVNQX0ZJTFRFUlNfRklOSVNIRUQub3JkZXIiKSk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gc3VjY2VzcyA9IGFwcGxpY2F0aW9uRXZlbnRMaXN0ZW5lci5maW5pc2hlZENhbGxlZC5hd2FpdCgzICogZ2V0QXN5bmNUaW1lb3V0TXVsdGlwbGllcigpLAorICAgICAgICAgICAgICAgIFRpbWVVbml0LlNFQ09ORFMpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShzdWNjZXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luY1Byb2Nlc3NpbmdXaXRoT25lVGhyZWFkKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZS9hc3luY09uZVRocmVhZCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFzeW5jIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICBpbnQgaSA9IDE7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZXNwb25zZS5nZXRIZWFkZXJzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlsiICsgaSsrICsgIl0iLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIlIuUkVRX0ZJTFRFUlNfU1RBUlQub3JkZXIiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiWyIgKyBpKysgKyAiXSIsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiUi5SRVFfRklMVEVSU19GSU5JU0hFRC5vcmRlciIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbIiArIGkrKyArICJdIiwgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJSLlJFU09VUkNFX01FVEhPRF9TVEFSVC5vcmRlciIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbIiArIGkrKyArICJdIiwgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJSLlJFU1BfRklMVEVSU19TVEFSVC5vcmRlciIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJbIiArIGkgKyAiXSIsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiUi5SRVNQX0ZJTFRFUlNfRklOSVNIRUQub3JkZXIiKSk7CisKKyAgICAgICAgZmluYWwgYm9vbGVhbiBzdWNjZXNzID0gYXBwbGljYXRpb25FdmVudExpc3RlbmVyLmZpbmlzaGVkQ2FsbGVkLmF3YWl0KDMgKiBnZXRBc3luY1RpbWVvdXRNdWx0aXBsaWVyKCksCisgICAgICAgICAgICAgICAgVGltZVVuaXQuU0VDT05EUyk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHN1Y2Nlc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL21vbml0b3JpbmcvTUJlYW5zVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbW9uaXRvcmluZy9NQmVhbnNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVkMGI5NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL21vbml0b3JpbmcvTUJlYW5zVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjQ5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIubW9uaXRvcmluZzsKKworaW1wb3J0IGphdmEubGFuZy5tYW5hZ2VtZW50Lk1hbmFnZW1lbnRGYWN0b3J5OworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuRXhjZXB0aW9uTWFwcGVyOworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5JbnN0YW5jZU5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTUJlYW5TZXJ2ZXI7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuT2JqZWN0SW5zdGFuY2U7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLk1vbml0b3JpbmdTdGF0aXN0aWNzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLk1vbml0b3JpbmdTdGF0aXN0aWNzTGlzdGVuZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5BYnN0cmFjdENvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29udGFpbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5BZnRlcjsKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworCisvKioKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIE1CZWFuc1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKFRlc3RSZXNvdXJjZS5jbGFzcywgTXlFeGNlcHRpb25NYXBwZXIuY2xhc3MpOworICAgICAgICByZXNvdXJjZUNvbmZpZy5zZXRBcHBsaWNhdGlvbk5hbWUoIm15QXBwbGljYXRpb24iKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucHJvcGVydHkoInZlcnktaW1wb3J0YW50IiwgInllcyIpOworICAgICAgICByZXNvdXJjZUNvbmZpZy5wcm9wZXJ0eSgiYW5vdGhlci1wcm9wZXJ0eSIsIDQ4KTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5NT05JVE9SSU5HX1NUQVRJU1RJQ1NfTUJFQU5TX0VOQUJMRUQsIHRydWUpOworICAgICAgICByZXNvdXJjZUNvbmZpZy5yZWdpc3RlcihTdGF0aXN0aWNzTGlzdGVuZXIuY2xhc3MpOworICAgICAgICByZXR1cm4gcmVzb3VyY2VDb25maWc7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworCisgICAgICAgIHB1YmxpYyBNeUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICAgICAgc3VwZXIobWVzc2FnZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15RXhjZXB0aW9uTWFwcGVyIGltcGxlbWVudHMgRXhjZXB0aW9uTWFwcGVyPE15RXhjZXB0aW9uPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSB0b1Jlc3BvbnNlKE15RXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCJtYXBwZWQiKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHRlc3RHZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gImdldCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJ0ZXN0L3t0ZXN0OiBcXGQrfSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdGVzdEdldFBhdGhQYXR0ZXJuMSgpIHsKKyAgICAgICAgICAgIHJldHVybiAidGVzdEdldFBhdGhQYXR0ZXJuMSI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJ0ZXN0Mi97dGVzdDogaGVsbD9vfSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdGVzdEdldFBhdGhQYXR0ZXJuMigpIHsKKyAgICAgICAgICAgIHJldHVybiAidGVzdEdldFBhdGhQYXR0ZXJuMiI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJ0ZXN0My97dGVzdDogYWJjLiogKGEpKGIpW2EsY10/JFsxLTRda2t4fFl9IikKKyAgICAgICAgcHVibGljIFN0cmluZyB0ZXN0R2V0UGF0aFBhdHRlcm4zKCkgeworICAgICAgICAgICAgcmV0dXJuICJ0ZXN0R2V0UGF0aFBhdHRlcm4yIjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInRlc3Q0L3t0ZXN0OiBbYSxiXTpyfSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdGVzdEdldFBhdGhQYXR0ZXJuNCgpIHsKKyAgICAgICAgICAgIHJldHVybiAidGVzdEdldFBhdGhQYXR0ZXJuMiI7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHRlc3RQb3N0KCkgeworICAgICAgICAgICAgcmV0dXJuICJwb3N0IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInN1YiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdGVzdFN1YkdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAic3ViIjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImV4Y2VwdGlvbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdGVzdEV4Y2VwdGlvbigpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNeUV4Y2VwdGlvbigidGVzdCIpOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoInN1YjIiKQorICAgICAgICBAUHJvZHVjZXMoInRleHQvaHRtbCIpCisgICAgICAgIEBDb25zdW1lcygidGV4dC9wbGFpbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdGVzdFN1MmJQb3N0KFN0cmluZyBlbnRpdHkpIHsKKyAgICAgICAgICAgIHJldHVybiAicG9zdCI7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgibG9jYXRvciIpCisgICAgICAgIHB1YmxpYyBTdWJSZXNvdXJjZSBnZXRTdWJSZXNvdXJjZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3ViUmVzb3VyY2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3RhdGlzdGljc0xpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RDb250YWluZXJMaWZlY3ljbGVMaXN0ZW5lciBpbXBsZW1lbnRzIE1vbml0b3JpbmdTdGF0aXN0aWNzTGlzdGVuZXIgeworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBPTl9TSFVURE9XTl9DQUxMRUQgPSBmYWxzZTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TdGF0aXN0aWNzKE1vbml0b3JpbmdTdGF0aXN0aWNzIHN0YXRpc3RpY3MpIHsKKyAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvblNodXRkb3duKENvbnRhaW5lciBjb250YWluZXIpIHsKKyAgICAgICAgICAgIFN0YXRpc3RpY3NMaXN0ZW5lci5PTl9TSFVURE9XTl9DQUxMRUQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIudGVhckRvd24oKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoU3RhdGlzdGljc0xpc3RlbmVyLk9OX1NIVVRET1dOX0NBTExFRCk7CisKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN1YlJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJpbi1zdWJyZXNvdXJjZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJpblN1YlJlc291cmNlIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJsb2NhdG9yIikKKyAgICAgICAgcHVibGljIFN1YlJlc291cmNlIGdldFN1YlJlc291cmNlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdWJSZXNvdXJjZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBwYXRoID0gInJlc291cmNlIjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgdGFyZ2V0KCkucGF0aChwYXRoKS5yZXF1ZXN0KCkuZ2V0KCkuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCB0YXJnZXQoKS5wYXRoKHBhdGgpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoInBvc3QiLAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHRhcmdldCgpLnBhdGgocGF0aCkucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eSgicG9zdCIsCisgICAgICAgICAgICAgICAgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgdGFyZ2V0KCkucGF0aChwYXRoKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KCJwb3N0IiwKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSkuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCB0YXJnZXQoKS5wYXRoKHBhdGgpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoInBvc3QiLAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHRhcmdldCgpLnBhdGgocGF0aCArICIvc3ViMiIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoInBvc3QiLAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aChwYXRoICsgIi9leGNlcHRpb24iKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJtYXBwZWQiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHRhcmdldCgpLnBhdGgoInJlc291cmNlL3N1YiIpLnJlcXVlc3QoKS5nZXQoKS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHRhcmdldCgpLnBhdGgoInJlc291cmNlL3N1YiIpLnJlcXVlc3QoKS5nZXQoKS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHRhcmdldCgpLnBhdGgoInJlc291cmNlL2xvY2F0b3IvaW4tc3VicmVzb3VyY2UiKS5yZXF1ZXN0KCkuZ2V0KCkuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZS9sb2NhdG9yL2xvY2F0b3IvaW4tc3VicmVzb3VyY2UiKS5yZXF1ZXN0KCkuZ2V0KCkuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZS9sb2NhdG9yL2xvY2F0b3IvbG9jYXRvci9pbi1zdWJyZXNvdXJjZSIpLnJlcXVlc3QoKS5nZXQoKS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDQsIHRhcmdldCgpLnBhdGgoInJlc291cmNlL25vdC1mb3VuZC00MDQiKS5yZXF1ZXN0KCkuZ2V0KCkuZ2V0U3RhdHVzKCkpOworCisgICAgICAgIC8vIHdhaXQgdW50aWwgc3RhdGlzdGljcyBhcmUgcHJvcGFnYXRlZCB0byBteGJlYW5zCisgICAgICAgIFRocmVhZC5zbGVlcCgxNTAwKTsKKworICAgICAgICBmaW5hbCBNQmVhblNlcnZlciBtQmVhblNlcnZlciA9IE1hbmFnZW1lbnRGYWN0b3J5LmdldFBsYXRmb3JtTUJlYW5TZXJ2ZXIoKTsKKyAgICAgICAgZmluYWwgT2JqZWN0TmFtZSBuYW1lID0gbmV3IE9iamVjdE5hbWUoIm9yZy5nbGFzc2Zpc2guamVyc2V5OnR5cGU9bXlBcHBsaWNhdGlvbixzdWJUeXBlPUdsb2JhbCxnbG9iYWw9Q29uZmlndXJhdGlvbiIpOworICAgICAgICBmaW5hbCBTdHJpbmcgc3RyID0gKFN0cmluZykgbUJlYW5TZXJ2ZXIuZ2V0QXR0cmlidXRlKG5hbWUsICJBcHBsaWNhdGlvbk5hbWUiKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygibXlBcHBsaWNhdGlvbiIsIHN0cik7CisKKyAgICAgICAgY2hlY2tSZXNvdXJjZU1CZWFuKCIvcmVzb3VyY2UiKTsKKyAgICAgICAgY2hlY2tSZXNvdXJjZU1CZWFuKCIvcmVzb3VyY2Uvc3ViIik7CisgICAgICAgIGNoZWNrUmVzb3VyY2VNQmVhbigiL3Jlc291cmNlL2xvY2F0b3IiKTsKKyAgICAgICAgY2hlY2tSZXNvdXJjZU1CZWFuKCIvcmVzb3VyY2UvZXhjZXB0aW9uIik7CisgICAgICAgIGNoZWNrUmVzb3VyY2VNQmVhbigiL3Jlc291cmNlL3Rlc3Qve3Rlc3Q6IFxcXFxkK30iKTsKKyAgICAgICAgY2hlY2tSZXNvdXJjZU1CZWFuKCIvcmVzb3VyY2UvdGVzdDIve3Rlc3Q6IGhlbGxcXD9vfSIpOworICAgICAgICBjaGVja1Jlc291cmNlTUJlYW4oIi9yZXNvdXJjZS90ZXN0My97dGVzdDogYWJjLlxcKiAoYSkoYilbYSxjXVxcPyRbMS00XWtreHxZfSIpOworICAgICAgICBjaGVja1Jlc291cmNlTUJlYW4oIi9yZXNvdXJjZS90ZXN0NC97dGVzdDogW2EsYl06cn0iKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tSZXNvdXJjZU1CZWFuKFN0cmluZyBuYW1lKSB0aHJvd3MgTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIE1CZWFuU2VydmVyIG1CZWFuU2VydmVyID0gTWFuYWdlbWVudEZhY3RvcnkuZ2V0UGxhdGZvcm1NQmVhblNlcnZlcigpOworICAgICAgICBmaW5hbCBPYmplY3ROYW1lIG9iamVjdE5hbWUgPSBuZXcgT2JqZWN0TmFtZSgKKyAgICAgICAgICAgICAgICAib3JnLmdsYXNzZmlzaC5qZXJzZXk6dHlwZT1teUFwcGxpY2F0aW9uLHN1YlR5cGU9VXJpcyxyZXNvdXJjZT1cIiIgKyBuYW1lICsgIlwiIik7CisgICAgICAgIE9iamVjdEluc3RhbmNlIG1iZWFuID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIG1iZWFuID0gbUJlYW5TZXJ2ZXIuZ2V0T2JqZWN0SW5zdGFuY2Uob2JqZWN0TmFtZSk7CisgICAgICAgIH0gY2F0Y2ggKEluc3RhbmNlTm90Rm91bmRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgQXNzZXJ0LmZhaWwoIlJlc291cmNlIE1CZWFuIG5hbWUgJyIgKyBuYW1lICsgIicgbm90IGZvdW5kLiIpOworICAgICAgICB9CisgICAgICAgIGFzc2VydE5vdE51bGwobWJlYW4pOworICAgIH0KKworICAgIC8vIHRoaXMgdGVzdCBydW5zIHRoZSBqZXJzZXkgZW52aXJvbm1lbnRzLCBleHBvc2VzIG1iZWFucyBhbmQgbWFrZXMgcmVxdWVzdHMgdG8KKyAgICAvLyB0aGUgZGVwbG95ZWQgYXBwbGljYXRpb24uIFRoZSB0ZXN0IHdpbGwgbmV2ZXIgZmluaXNoZWQuIFRoaXMgc2hvdWxkIGJlIHVuY29tbWVudGVkCisgICAgLy8gb25seSBmb3IgZGV2ZWxvcG1lbnQgdGVzdGluZyBvZiBtYmVhbnMgaW4gamNvbnNvbGUuCisgICAgLy8gU3RlcHM6IHVuY29tbWVudCB0aGUgdGVzdDsgcnVuIGl0OyBydW4gamNvbnNvbGUgYW5kIGF0dGFjaCB0byB0aGUgcHJvY2VzcyBvZiB0aGUgdGVzdHMKKyAgICAvLyAgICBAVGVzdAorICAgIC8vICAgIHB1YmxpYyB2b2lkIHRlc3ROZXZlckZpbmlzaGVzQW5kTXVzdEJlQ29tbWVudGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgLy8gICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgLy8gICAgICAgICAgICB0ZXN0KCk7CisgICAgLy8gICAgICAgIH0KKyAgICAvLyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tb25pdG9yaW5nL01vbml0b3JpbmdTdGF0aXN0aWNzTG9jYXRvclRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL21vbml0b3JpbmcvTW9uaXRvcmluZ1N0YXRpc3RpY3NMb2NhdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNGRjNjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tb25pdG9yaW5nL01vbml0b3JpbmdTdGF0aXN0aWNzTG9jYXRvclRlc3QuamF2YQpAQCAtMCwwICsxLDM4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLm1vbml0b3Jpbmc7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IGphdmF4LmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTWV0aG9kOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLk1vbml0b3JpbmdTdGF0aXN0aWNzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLlJlc291cmNlTWV0aG9kU3RhdGlzdGljczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5SZXNvdXJjZVN0YXRpc3RpY3M7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwucHJvY2Vzc29yLldhZGxNb2RlbFByb2Nlc3NvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGF0IHtAbGluayBSZXNvdXJjZU1ldGhvZFN0YXRpc3RpY3N9IGFyZSBub3QgZHVwbGljYXRlZCBpbgorICoge0BsaW5rIE1vbml0b3JpbmdTdGF0aXN0aWNzfSB3aGVuIHN1YiByZXNvdXJjZSBsb2NhdG9ycyBhcmUgdXNlZC4gU3ViIHJlc291cmNlcyBhbmQgdGhlaXIKKyAqIG1ldGhvZHMgc2hvdWxkIGJlIG1hcHBlZCB0byBjdXJyZW50bHkgZXhpc3Rpbmcge0BsaW5rIFJlc291cmNlU3RhdGlzdGljc30gYW5kIHRoZWlyCisgKiB7QGxpbmsgUmVzb3VyY2VNZXRob2RTdGF0aXN0aWNzfS4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgTW9uaXRvcmluZ1N0YXRpc3RpY3NMb2NhdG9yVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoU3RhdGlzdGljc1Jlc291cmNlLmNsYXNzLCBBbm90aGVyUmVzb3VyY2UuY2xhc3MpOworICAgICAgICByZXNvdXJjZUNvbmZpZy5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLk1PTklUT1JJTkdfU1RBVElTVElDU19FTkFCTEVELCB0cnVlKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5BUFBMSUNBVElPTl9OQU1FLCAidGVzdEFwcCIpOworICAgICAgICByZXR1cm4gcmVzb3VyY2VDb25maWc7CisgICAgfQorCisgICAgQFBhdGgoInJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN0YXRpc3RpY3NSZXNvdXJjZSB7CisKKyAgICAgICAgQENvbnRleHQKKyAgICAgICAgUHJvdmlkZXI8TW9uaXRvcmluZ1N0YXRpc3RpY3M+IHN0YXRpc3RpY3M7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFN0YXRzKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIE1vbml0b3JpbmdTdGF0aXN0aWNzIG1vbml0b3JpbmdTdGF0aXN0aWNzID0gc3RhdGlzdGljcy5nZXQoKTsKKyAgICAgICAgICAgIGZpbmFsIFJlc291cmNlU3RhdGlzdGljcyByZXNvdXJjZVN0YXRpc3RpY3MgPSBtb25pdG9yaW5nU3RhdGlzdGljcy5nZXRSZXNvdXJjZUNsYXNzU3RhdGlzdGljcygpCisgICAgICAgICAgICAgICAgICAgIC5nZXQoU3ViUmVzb3VyY2UuY2xhc3MpOworICAgICAgICAgICAgaWYgKHJlc291cmNlU3RhdGlzdGljcyA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJudWxsIjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIHJlc3AgPSAiIjsKKworICAgICAgICAgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8UmVzb3VyY2VNZXRob2QsIFJlc291cmNlTWV0aG9kU3RhdGlzdGljcz4gZW50cnkKKyAgICAgICAgICAgICAgICAgICAgOiByZXNvdXJjZVN0YXRpc3RpY3MuZ2V0UmVzb3VyY2VNZXRob2RTdGF0aXN0aWNzKCkuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgIGlmIChlbnRyeS5nZXRLZXkoKS5nZXRIdHRwTWV0aG9kKCkuZXF1YWxzKCJHRVQiKSkgeworICAgICAgICAgICAgICAgICAgICByZXNwID0gcmVzcCArICJnZXRGb3VuZCI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlc3A7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJ1cmkiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFVyaVN0YXRzKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIE1vbml0b3JpbmdTdGF0aXN0aWNzIG1vbml0b3JpbmdTdGF0aXN0aWNzID0gc3RhdGlzdGljcy5nZXQoKTsKKyAgICAgICAgICAgIGZpbmFsIFJlc291cmNlU3RhdGlzdGljcyByZXNvdXJjZVN0YXRpc3RpY3MgPSBtb25pdG9yaW5nU3RhdGlzdGljcy5nZXRVcmlTdGF0aXN0aWNzKCkKKyAgICAgICAgICAgICAgICAgICAgLmdldCgiL3Jlc291cmNlL3Jlc291cmNlLWxvY2F0b3IiKTsKKyAgICAgICAgICAgIGlmIChyZXNvdXJjZVN0YXRpc3RpY3MgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiAibnVsbCI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyByZXNwID0gIiI7CisKKyAgICAgICAgICAgIGZvciAoZmluYWwgTWFwLkVudHJ5PFJlc291cmNlTWV0aG9kLCBSZXNvdXJjZU1ldGhvZFN0YXRpc3RpY3M+IGVudHJ5CisgICAgICAgICAgICAgICAgICAgIDogcmVzb3VyY2VTdGF0aXN0aWNzLmdldFJlc291cmNlTWV0aG9kU3RhdGlzdGljcygpLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnkuZ2V0S2V5KCkuZ2V0SHR0cE1ldGhvZCgpLmVxdWFscygiR0VUIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzcCA9IHJlc3AgKyAiZ2V0Rm91bmQiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHJlc3A7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgicmVzb3VyY2UtbG9jYXRvciIpCisgICAgICAgIHB1YmxpYyBTdWJSZXNvdXJjZSBsb2NhdG9yKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdWJSZXNvdXJjZSgpOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImhlbGxvIikKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGhlbGxvKCkgeworICAgICAgICAgICAgcmV0dXJuICJIZWxsbyEiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgicmVzb3VyY2VDbGFzc1N0YXRpc3RpY3NXYWRsT3B0aW9uc1Rlc3QiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFJlc291cmNlQ2xhc3NTdGF0aXN0aWNzV2FkbE9wdGlvbnNUZXN0KCkgeworICAgICAgICAgICAgcmV0dXJuIGdldFJlc291cmNlQ2xhc3NTdGF0aXN0aWNzVGVzdChXYWRsTW9kZWxQcm9jZXNzb3IuT3B0aW9uc0hhbmRsZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInJlc291cmNlQ2xhc3NTdGF0aXN0aWNzR2VuZXJpY09wdGlvbnNUZXN0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRSZXNvdXJjZUNsYXNzU3RhdGlzdGljc0dlbmVyaWNPcHRpb25zVGVzdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZXNvdXJjZUNsYXNzU3RhdGlzdGljc1Rlc3QoCisgICAgICAgICAgICAgICAgICAgICJvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5wcm9jZXNzb3IuT3B0aW9uc01ldGhvZFByb2Nlc3NvciRHZW5lcmljT3B0aW9uc0luZmxlY3RvciIpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgicmVzb3VyY2VDbGFzc1N0YXRpc3RpY3NQbGFpblRleHRPcHRpb25zVGVzdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVzb3VyY2VDbGFzc1N0YXRpc3RpY3NQbGFpblRlc3RPcHRpb25zVGVzdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRSZXNvdXJjZUNsYXNzU3RhdGlzdGljc1Rlc3QoCisgICAgICAgICAgICAgICAgICAgICJvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5wcm9jZXNzb3IuT3B0aW9uc01ldGhvZFByb2Nlc3NvciRQbGFpblRleHRPcHRpb25zSW5mbGVjdG9yIik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFN0cmluZyBnZXRSZXNvdXJjZUNsYXNzU3RhdGlzdGljc1Rlc3QoZmluYWwgU3RyaW5nIHJlc291cmNlQ2xhc3NOYW1lKSB7CisgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZVN0YXRpc3RpY3MgcmVzb3VyY2VNZXRob2RTdGF0aXN0aWNzID0gZmluZFJlc291cmNlQ2xhc3NTdGF0aXN0aWNzKHN0YXRpc3RpY3MuZ2V0KCksIHJlc291cmNlQ2xhc3NOYW1lKTsKKworICAgICAgICAgICAgYm9vbGVhbiByZXNvdXJjZUhlbGxvT3B0aW9ucyA9IGZhbHNlOworICAgICAgICAgICAgYm9vbGVhbiBhbm90aGVySGVsbG9PcHRpb25zID0gZmFsc2U7CisgICAgICAgICAgICBib29sZWFuIGFub3RoZXJYbWxPcHRpb25zID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxSZXNvdXJjZU1ldGhvZCwgUmVzb3VyY2VNZXRob2RTdGF0aXN0aWNzPiBlbnRyeSA6IHJlc291cmNlTWV0aG9kU3RhdGlzdGljcworICAgICAgICAgICAgICAgICAgICAuZ2V0UmVzb3VyY2VNZXRob2RTdGF0aXN0aWNzKCkuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kID0gZW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGZ1bGxQYXRoID0gZ2V0RnVsbFBhdGgocmVzb3VyY2VNZXRob2QpOworICAgICAgICAgICAgICAgIGlmICgiL3Jlc291cmNlL2hlbGxvIi5lcXVhbHMoZnVsbFBhdGgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc291cmNlSGVsbG9PcHRpb25zID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCIvYW5vdGhlci9oZWxsbyIuZXF1YWxzKGZ1bGxQYXRoKSkgeworICAgICAgICAgICAgICAgICAgICBhbm90aGVySGVsbG9PcHRpb25zID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCIvYW5vdGhlci94bWwiLmVxdWFscyhmdWxsUGF0aCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYW5vdGhlclhtbE9wdGlvbnMgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZXNvdXJjZUhlbGxvT3B0aW9ucyAmJiBhbm90aGVySGVsbG9PcHRpb25zICYmIGFub3RoZXJYbWxPcHRpb25zKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJPSyI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiAiRkFJTDogL3Jlc291cmNlL2hlbGxvPSIgKyByZXNvdXJjZUhlbGxvT3B0aW9ucyArICI7IC9hbm90aGVyL2hlbGxvPSIgKyBhbm90aGVySGVsbG9PcHRpb25zCisgICAgICAgICAgICAgICAgICAgICAgICArICI7IC9hbm90aGVyL3htbD0iICsgYW5vdGhlclhtbE9wdGlvbnM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJ1cmlTdGF0aXN0aWNzUmVzb3VyY2VIZWxsb1Rlc3QiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFVyaVN0YXRpc3RpY3NSZXNvdXJjZUhlbGxvVGVzdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRVcmlTdGF0aXN0aWNzVGVzdCgiL3Jlc291cmNlL2hlbGxvIik7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJ1cmlTdGF0aXN0aWNzQW5vdGhlckhlbGxvVGVzdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXJpU3RhdGlzdGljc0Fub3RoZXJIZWxsb1Rlc3QoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VXJpU3RhdGlzdGljc1Rlc3QoIi9hbm90aGVyL2hlbGxvIik7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJ1cmlTdGF0aXN0aWNzQW5vdGhlclhtbFRlc3QiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFVyaVN0YXRpc3RpY3NBbm90aGVyWG1sVGVzdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRVcmlTdGF0aXN0aWNzVGVzdCgiL2Fub3RoZXIveG1sIik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFN0cmluZyBnZXRVcmlTdGF0aXN0aWNzVGVzdChmaW5hbCBTdHJpbmcgdXJpKSB7CisgICAgICAgICAgICBib29sZWFuIHBsYWluVGV4dE9wdGlvbnMgPSBmYWxzZTsKKyAgICAgICAgICAgIGJvb2xlYW4gd2FkbE9wdGlvbnMgPSBmYWxzZTsKKyAgICAgICAgICAgIGJvb2xlYW4gZ2VuZXJpY09wdGlvbnMgPSBmYWxzZTsKKyAgICAgICAgICAgIGZpbmFsIFJlc291cmNlU3RhdGlzdGljcyByZXNvdXJjZVN0YXRpc3RpY3MgPSBzdGF0aXN0aWNzLmdldCgpLmdldFVyaVN0YXRpc3RpY3MoKS5nZXQodXJpKTsKKworICAgICAgICAgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8UmVzb3VyY2VNZXRob2QsIFJlc291cmNlTWV0aG9kU3RhdGlzdGljcz4gZW50cnkgOiByZXNvdXJjZVN0YXRpc3RpY3MKKyAgICAgICAgICAgICAgICAgICAgLmdldFJlc291cmNlTWV0aG9kU3RhdGlzdGljcygpLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnkuZ2V0S2V5KCkuZ2V0SHR0cE1ldGhvZCgpLmVxdWFscygiT1BUSU9OUyIpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kID0gZW50cnkuZ2V0S2V5KCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcm9kdWNlZFR5cGVzID0gcmVzb3VyY2VNZXRob2QuZ2V0UHJvZHVjZWRUeXBlcygpLnRvU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICgiW3RleHQvcGxhaW5dIi5lcXVhbHMocHJvZHVjZWRUeXBlcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBsYWluVGV4dE9wdGlvbnMgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJbYXBwbGljYXRpb24vdm5kLnN1bi53YWRsK3htbF0iLmVxdWFscyhwcm9kdWNlZFR5cGVzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgd2FkbE9wdGlvbnMgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCJbKi8qXSIuZXF1YWxzKHByb2R1Y2VkVHlwZXMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljT3B0aW9ucyA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocGxhaW5UZXh0T3B0aW9ucyAmJiB3YWRsT3B0aW9ucyAmJiBnZW5lcmljT3B0aW9ucykgeworICAgICAgICAgICAgICAgIHJldHVybiAiT0siOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIkZBSUw6IFt0ZXh0L3BsYWluXT0iICsgcGxhaW5UZXh0T3B0aW9ucyArICI7IFthcHBsaWNhdGlvbi92bmQuc3VuLndhZGwreG1sXT0iICsgd2FkbE9wdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIjsgWyovKl09IiArIGdlbmVyaWNPcHRpb25zOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBSZXNvdXJjZVN0YXRpc3RpY3MgZmluZFJlc291cmNlQ2xhc3NTdGF0aXN0aWNzKGZpbmFsIE1vbml0b3JpbmdTdGF0aXN0aWNzIG1vbml0b3JpbmdTdGF0aXN0aWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJlc291cmNlQ2xhc3NOYW1lKSB7CisgICAgICAgICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxDbGFzczw/PiwgUmVzb3VyY2VTdGF0aXN0aWNzPiBlbnRyeSA6IG1vbml0b3JpbmdTdGF0aXN0aWNzLmdldFJlc291cmNlQ2xhc3NTdGF0aXN0aWNzKCkKKyAgICAgICAgICAgICAgICAgICAgLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiBrZXkgPSBlbnRyeS5nZXRLZXkoKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgY2xhenogPSBrZXkuZ2V0TmFtZSgpOworCisgICAgICAgICAgICAgICAgaWYgKGNsYXp6LmVxdWFscyhyZXNvdXJjZUNsYXNzTmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5LmdldFZhbHVlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0RnVsbFBhdGgoZmluYWwgUmVzb3VyY2VNZXRob2QgcmVzb3VyY2VNZXRob2QpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgZnVsbFBhdGggPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICAgICAgaWYgKHJlc291cmNlTWV0aG9kICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBwcmVmaXhQYXRoKGZ1bGxQYXRoLCByZXNvdXJjZU1ldGhvZC5nZXRQYXJlbnQoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZnVsbFBhdGgudG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgcHJlZml4UGF0aChmaW5hbCBTdHJpbmdCdWlsZGVyIGZ1bGxQYXRoLCBmaW5hbCBSZXNvdXJjZSBwYXJlbnQpIHsKKyAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIFN0cmluZyBwYXRoID0gcGFyZW50LmdldFBhdGgoKTsKKyAgICAgICAgICAgICAgICBpZiAocGF0aC5zdGFydHNXaXRoKCIvIikpIHsKKyAgICAgICAgICAgICAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmdWxsUGF0aC5pbnNlcnQoMCwgIi8iICsgcGF0aCk7CisgICAgICAgICAgICAgICAgcHJlZml4UGF0aChmdWxsUGF0aCwgcGFyZW50LmdldFBhcmVudCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdWJSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiZ2V0IjsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJzdWIiKQorICAgICAgICBwdWJsaWMgU3ViUmVzb3VyY2Ugc3ViTG9jYXRvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3ViUmVzb3VyY2UoKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgQFBhdGgoIi9hbm90aGVyIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFub3RoZXJSZXNvdXJjZSB7CisKKyAgICAgICAgQFBhdGgoImhlbGxvIikKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHNheUhlbGxvKCkgeworICAgICAgICAgICAgcmV0dXJuICJIZWxsbywgYWdhaW4uIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJ4bWwiKQorICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9YTUwpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgc2F5WE1MSGVsbG8oKSB7CisgICAgICAgICAgICByZXR1cm4gIjw/eG1sIHZlcnNpb249XCIxLjBcIj8+PGhlbGxvPldvcmxkITwvaGVsbG8+IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJudWxsIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlL3Jlc291cmNlLWxvY2F0b3IiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXQiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UvcmVzb3VyY2UtbG9jYXRvciIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImdldCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZS9yZXNvdXJjZS1sb2NhdG9yL3N1YiIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImdldCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZS9oZWxsbyIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkhlbGxvISIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJhbm90aGVyL2hlbGxvIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiSGVsbG8sIGFnYWluLiIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJhbm90aGVyL3htbCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjw/eG1sIHZlcnNpb249XCIxLjBcIj8+PGhlbGxvPldvcmxkITwvaGVsbG8+IiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICBUaHJlYWQuc2xlZXAoNjAwKTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZ2V0Rm91bmQiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UvdXJpIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZ2V0Rm91bmQiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlQ2xhc3NTdGF0aXN0aWNzV2FkbE9wdGlvbnMoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UvcmVzb3VyY2VDbGFzc1N0YXRpc3RpY3NXYWRsT3B0aW9uc1Rlc3QiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJPSyIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VDbGFzc1N0YXRpc3RpY3NHZW5lcmljT3B0aW9ucygpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZS9yZXNvdXJjZUNsYXNzU3RhdGlzdGljc0dlbmVyaWNPcHRpb25zVGVzdCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk9LIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUNsYXNzU3RhdGlzdGljc1BsYWluVGV4dE9wdGlvbnMoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UvcmVzb3VyY2VDbGFzc1N0YXRpc3RpY3NQbGFpblRleHRPcHRpb25zVGVzdCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk9LIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVcmlTdGF0aXN0aWNzUmVzb3VyY2VIZWxsbygpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UvaGVsbG8iKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJIZWxsbyEiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworCisgICAgICAgIFRocmVhZC5zbGVlcCg2MDApOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UvdXJpU3RhdGlzdGljc1Jlc291cmNlSGVsbG9UZXN0IikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiT0siLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVyaVN0YXRpc3RpY3NBbm90aGVySGVsbG8oKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoImFub3RoZXIvaGVsbG8iKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJIZWxsbywgYWdhaW4uIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICBUaHJlYWQuc2xlZXAoNjAwKTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlL3VyaVN0YXRpc3RpY3NBbm90aGVySGVsbG9UZXN0IikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiT0siLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVyaVN0YXRpc3RpY3NBbm90aGVyWG1sKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJhbm90aGVyL3htbCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjw/eG1sIHZlcnNpb249XCIxLjBcIj8+PGhlbGxvPldvcmxkITwvaGVsbG8+IiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICBUaHJlYWQuc2xlZXAoNjAwKTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlL3VyaVN0YXRpc3RpY3NBbm90aGVyWG1sVGVzdCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk9LIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tb25pdG9yaW5nL1JlbG9hZEFwcGxpY2F0aW9uRXZlbnRUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tb25pdG9yaW5nL1JlbG9hZEFwcGxpY2F0aW9uRXZlbnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdhMzY5NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL21vbml0b3JpbmcvUmVsb2FkQXBwbGljYXRpb25FdmVudFRlc3QuamF2YQpAQCAtMCwwICsxLDM4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLm1vbml0b3Jpbmc7CisKK2ltcG9ydCBqYXZhLmxhbmcubWFuYWdlbWVudC5NYW5hZ2VtZW50RmFjdG9yeTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5BdHRyaWJ1dGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lkluc3RhbmNlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk1CZWFuU2VydmVyOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQuTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5SZWZsZWN0aW9uRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLkFwcGxpY2F0aW9uRXZlbnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuQXBwbGljYXRpb25FdmVudExpc3RlbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLlJlcXVlc3RFdmVudDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5SZXF1ZXN0RXZlbnRMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmdyaXp6bHkuR3JpenpseVRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuamRraHR0cC5KZGtIdHRwU2VydmVyVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5qZXR0eS5KZXR0eVRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc2ltcGxlLlNpbXBsZVRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5TdWl0ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBUaGlzIHRlc3QgdGVzdHMgdGhlIGxpZmVjeWNsZSBvZiB0aGUgYXBwbGljYXRpb24gaW4gYWNjb3JkYW5jZSB0byB0aGUgbW9uaXRvcmluZworICogYW5kIHtAbGluayBDb250YWluZXJMaWZlY3ljbGVMaXN0ZW5lciBjb250YWluZXIgZXZlbnRzfS4gQW1vbmcgb3RoZXJzLCBpdCBjaGVja3MgdGhhdAorICogTW9uaXRvcmluZyBNQmVhbnMgYXJlIGNvcnJlY3RseSBleHBvc2VkIGFuZCBkZXN0cm95ZWQgd2hlbiBhcHBsaWNhdGlvbiBpcyByZWxvYWRlZC4gVXNlcyBkaWZmZXJlbnQKKyAqIGNvbnRhaW5lcnMgdG8gdGVzdCBpdC4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK0BSdW5XaXRoKFN1aXRlLmNsYXNzKQorQFN1aXRlLlN1aXRlQ2xhc3Nlcyh7UmVsb2FkQXBwbGljYXRpb25FdmVudFRlc3QuR3JpenpseVRlc3RDYXNlLmNsYXNzLCBSZWxvYWRBcHBsaWNhdGlvbkV2ZW50VGVzdC5KZGtTZXJ2ZXJUZXN0Q2FzZS5jbGFzcywKKyAgICAgICAgUmVsb2FkQXBwbGljYXRpb25FdmVudFRlc3QuU2ltcGxlSHR0cFNlcnZlclRlc3RDYXNlLmNsYXNzfSkKK3B1YmxpYyBjbGFzcyBSZWxvYWRBcHBsaWNhdGlvbkV2ZW50VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgT1JJR0lOQUwgPSAib3JpZ2luYWwiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFTE9BREVEID0gInJlbG9hZGVkIjsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgR3JpenpseVRlc3RDYXNlIGV4dGVuZHMgUGFyZW50VGVzdCB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgR3JpenpseVRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpka1NlcnZlclRlc3RDYXNlIGV4dGVuZHMgUGFyZW50VGVzdCB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSmRrSHR0cFNlcnZlclRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXb3JrcyBvbmx5IHdpdGggSmF2YSA3CisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKZXR0eVNlcnZlclRlc3RDYXNlIGV4dGVuZHMgUGFyZW50VGVzdCB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSmV0dHlUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTaW1wbGVIdHRwU2VydmVyVGVzdENhc2UgZXh0ZW5kcyBQYXJlbnRUZXN0IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIG5ldyBTaW1wbGVUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXJlbnRUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgICAgICBPcmlnaW5hbFJlc3VsdC5yZXNldCgpOworICAgICAgICAgICAgUmVsb2FkZWRSZXN1bHQucmVzZXQoKTsKKyAgICAgICAgICAgIE9yaWdpbmFsUmVzdWx0IG9yaWdpbmFsUmVzdWx0ID0gbmV3IE9yaWdpbmFsUmVzdWx0KCk7CisgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IGdldFJlc291cmNlQ29uZmlnKCkKKyAgICAgICAgICAgICAgICAgICAgLnNldEFwcGxpY2F0aW9uTmFtZShPUklHSU5BTCkKKyAgICAgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKG5ldyBUZXN0UmVzb3VyY2Uob3JpZ2luYWxSZXN1bHQpKQorICAgICAgICAgICAgICAgICAgICAucmVnaXN0ZXIobmV3IEFwcEV2ZW50TGlzdGVuZXIob3JpZ2luYWxSZXN1bHQpKTsKKworICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlQ29uZmlnOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VDb25maWcgZ2V0UmVzb3VyY2VDb25maWcoKSB7CisgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZygpOworICAgICAgICAgICAgcmVzb3VyY2VDb25maWcucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5NT05JVE9SSU5HX1NUQVRJU1RJQ1NfTUJFQU5TX0VOQUJMRUQsIHRydWUpOworICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlQ29uZmlnOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgVGVzdFJlc3VsdFRyYWNrZXIgeworCisgICAgICAgICAgICBwdWJsaWMgdm9pZCByZWxvYWRlZCgpOworCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBzaHV0ZG93bigpOworCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBzdGFydHVwKCk7CisKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICoge0BsaW5rIEFwcGxpY2F0aW9uRXZlbnQuVHlwZSNSRUxPQURfRklOSVNIRUR9IGNhbGxlZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHZvaWQgcmVsb2FkZWRFdmVudCgpOworCisgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAqIHtAbGluayBBcHBsaWNhdGlvbkV2ZW50LlR5cGUjSU5JVElBTElaQVRJT05fRklOSVNIRUR9IGNhbGxlZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgcHVibGljIHZvaWQgaW5pdEV2ZW50KCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE9yaWdpbmFsUmVzdWx0IGltcGxlbWVudHMgVGVzdFJlc3VsdFRyYWNrZXIgeworCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVsb2FkZWRDYWxsZWQ7CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2h1dGRvd25DYWxsZWQ7CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RhcnR1cENhbGxlZDsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiByZWxvYWRlZEV2ZW50Q2FsbGVkOworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGluaXRFdmVudENhbGxlZDsKKworICAgICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICAgICAgICAgIHJlbG9hZGVkQ2FsbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgc2h1dGRvd25DYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBzdGFydHVwQ2FsbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcmVsb2FkZWRFdmVudENhbGxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGluaXRFdmVudENhbGxlZCA9IGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbG9hZGVkKCkgeworICAgICAgICAgICAgICAgIHJlbG9hZGVkQ2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHsKKyAgICAgICAgICAgICAgICBzaHV0ZG93bkNhbGxlZCA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgc3RhcnR1cCgpIHsKKyAgICAgICAgICAgICAgICBzdGFydHVwQ2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCByZWxvYWRlZEV2ZW50KCkgeworICAgICAgICAgICAgICAgIHJlbG9hZGVkRXZlbnRDYWxsZWQgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGluaXRFdmVudCgpIHsKKyAgICAgICAgICAgICAgICBpbml0RXZlbnRDYWxsZWQgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlbG9hZGVkUmVzdWx0IGltcGxlbWVudHMgVGVzdFJlc3VsdFRyYWNrZXIgeworCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc2h1dGRvd25DYWxsZWQ7CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVsb2FkZWRDYWxsZWQ7CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gcmVsb2FkZWRFdmVudENhbGxlZDsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpbml0RXZlbnRDYWxsZWQ7CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gc3RhcnR1cENhbGxlZDsKKworICAgICAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICAgICAgICAgIHJlbG9hZGVkQ2FsbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgc2h1dGRvd25DYWxsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBzdGFydHVwQ2FsbGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcmVsb2FkZWRFdmVudENhbGxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGluaXRFdmVudENhbGxlZCA9IGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbG9hZGVkKCkgeworICAgICAgICAgICAgICAgIHJlbG9hZGVkQ2FsbGVkID0gdHJ1ZTsKKworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNodXRkb3duKCkgeworICAgICAgICAgICAgICAgIHNodXRkb3duQ2FsbGVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBzdGFydHVwKCkgeworICAgICAgICAgICAgICAgIHN0YXJ0dXBDYWxsZWQgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbG9hZGVkRXZlbnQoKSB7CisgICAgICAgICAgICAgICAgcmVsb2FkZWRFdmVudENhbGxlZCA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgaW5pdEV2ZW50KCkgeworICAgICAgICAgICAgICAgIGluaXRFdmVudENhbGxlZCA9IHRydWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJyZXNvdXJjZSIpCisgICAgICAgIEBTaW5nbGV0b24KKyAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0UmVzb3VyY2UgaW1wbGVtZW50cyBDb250YWluZXJMaWZlY3ljbGVMaXN0ZW5lciB7CisKKyAgICAgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgQ29udGFpbmVyIGNvbnRhaW5lcjsKKworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBUZXN0UmVzdWx0VHJhY2tlciB0ZXN0UmVzdWx0VHJhY2tlcjsKKworICAgICAgICAgICAgcHVibGljIFRlc3RSZXNvdXJjZShUZXN0UmVzdWx0VHJhY2tlciB0ZXN0UmVzdWx0VHJhY2tlcikgeworICAgICAgICAgICAgICAgIHRoaXMudGVzdFJlc3VsdFRyYWNrZXIgPSB0ZXN0UmVzdWx0VHJhY2tlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQEdFVAorICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICAgICAgY29udGFpbmVyLnJlbG9hZChnZXRSZXNvdXJjZUNvbmZpZygpCisgICAgICAgICAgICAgICAgICAgICAgICAuc2V0QXBwbGljYXRpb25OYW1lKFJFTE9BREVEKQorICAgICAgICAgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKG5ldyBUZXN0UmVzb3VyY2UobmV3IFJlbG9hZGVkUmVzdWx0KCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKG5ldyBBcHBFdmVudExpc3RlbmVyKG5ldyBSZWxvYWRlZFJlc3VsdCgpKSkpOworICAgICAgICAgICAgICAgIHJldHVybiAiZ2V0IjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0dXAoQ29udGFpbmVyIGNvbnRhaW5lcikgeworICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyOworICAgICAgICAgICAgICAgIHRlc3RSZXN1bHRUcmFja2VyLnN0YXJ0dXAoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlbG9hZChDb250YWluZXIgY29udGFpbmVyKSB7CisgICAgICAgICAgICAgICAgdGVzdFJlc3VsdFRyYWNrZXIucmVsb2FkZWQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblNodXRkb3duKENvbnRhaW5lciBjb250YWluZXIpIHsKKyAgICAgICAgICAgICAgICB0ZXN0UmVzdWx0VHJhY2tlci5zaHV0ZG93bigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBcHBFdmVudExpc3RlbmVyIGltcGxlbWVudHMgQXBwbGljYXRpb25FdmVudExpc3RlbmVyIHsKKworICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBUZXN0UmVzdWx0VHJhY2tlciByZXN1bHRUcmFja2VyOworCisgICAgICAgICAgICBwdWJsaWMgQXBwRXZlbnRMaXN0ZW5lcihUZXN0UmVzdWx0VHJhY2tlciByZXN1bHRUcmFja2VyKSB7CisgICAgICAgICAgICAgICAgdGhpcy5yZXN1bHRUcmFja2VyID0gcmVzdWx0VHJhY2tlcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkV2ZW50KEFwcGxpY2F0aW9uRXZlbnQgZXZlbnQpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LmdldFR5cGUoKSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIElOSVRJQUxJWkFUSU9OX0ZJTklTSEVEOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0VHJhY2tlci5pbml0RXZlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIFJFTE9BRF9GSU5JU0hFRDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFRyYWNrZXIucmVsb2FkZWRFdmVudCgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBSZXF1ZXN0RXZlbnRMaXN0ZW5lciBvblJlcXVlc3QoUmVxdWVzdEV2ZW50IHJlcXVlc3RFdmVudCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRlc3RzIHRoYXQgbW9uaXRvcmluZyBhbmQgY29udGFpbmVyIGV2ZW50cyBhcmUgY29ycmVjdGx5IGNhbGxlZCB3aGVuIGFwcGxpY2F0aW9uIGlzIGNyZWF0ZWQgYW5kIHJlZGVwbG95ZWQuCisgICAgICAgICAqIEl0IGFsc28gY2hlY2tzIHRoYXQgTUJlYW5zIGFyZSBleHBvc2VkIGFuZCBkZXJlZ2lzdGVyZWQgd2hlbiB0aGUgYXBwbGljYXRpb24gaXMgdW5kZXBsb3llZC4gVGVzdCBjb250YWlucworICAgICAgICAgKiB3YWl0cyBhbmQgdGltZW91dHMgYXMgbW9uaXRvcmluZyBldmVudHMgYXJlIHByb2Nlc3NlZCBhc3luY2hyb25vdXNseSBhbmQgaXQgbWlnaHQgdGFrZSBzb21lIHRpbWUKKyAgICAgICAgICogdW50aWwgTUJlYW5zIGFyZSByZWdpc3RlcmVkLiBUaGUgdGVzdCBkZXBsb3lzIG9yaWdpbmFsIGFwcGxpY2F0aW9uLCB0aGVuIHJlbG9hZCBpcyBpbml0aWF0ZWQgYW5kCisgICAgICAgICAqIGFub3RoZXIgYXBwbGljYXRpb24gaXMgZGVwbG95ZWQuCisgICAgICAgICAqCisgICAgICAgICAqIEB0aHJvd3MgTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbgorICAgICAgICAgKiBAdGhyb3dzIEF0dHJpYnV0ZU5vdEZvdW5kRXhjZXB0aW9uCisgICAgICAgICAqIEB0aHJvd3MgTUJlYW5FeGNlcHRpb24KKyAgICAgICAgICogQHRocm93cyBSZWZsZWN0aW9uRXhjZXB0aW9uCisgICAgICAgICAqIEB0aHJvd3MgSW5zdGFuY2VOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCisgICAgICAgICAqLworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwbGljYXRpb25FdmVudHMoKSB0aHJvd3MgTWFsZm9ybWVkT2JqZWN0TmFtZUV4Y2VwdGlvbiwgQXR0cmlidXRlTm90Rm91bmRFeGNlcHRpb24sCisgICAgICAgICAgICAgICAgTUJlYW5FeGNlcHRpb24sIFJlZmxlY3Rpb25FeGNlcHRpb24sIEluc3RhbmNlTm90Rm91bmRFeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIC8vIHdhaXQgdG8gZXhwb3NlIE1CZWFucyBpbiB0aGUgT1JJR0lOQUwgYXBwbGljYXRpb24KKyAgICAgICAgICAgIFRocmVhZC5zbGVlcCg3MDApOworCisgICAgICAgICAgICAvLyBiZWZvcmUgcmVsb2FkCisgICAgICAgICAgICBhc3NlcnRUcnVlKE9yaWdpbmFsUmVzdWx0LnN0YXJ0dXBDYWxsZWQpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShPcmlnaW5hbFJlc3VsdC5pbml0RXZlbnRDYWxsZWQpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoT3JpZ2luYWxSZXN1bHQuc2h1dGRvd25DYWxsZWQpOworCisgICAgICAgICAgICBhc3NlcnRGYWxzZShSZWxvYWRlZFJlc3VsdC5yZWxvYWRlZENhbGxlZCk7CisgICAgICAgICAgICBhc3NlcnRGYWxzZShSZWxvYWRlZFJlc3VsdC5zdGFydHVwQ2FsbGVkKTsKKyAgICAgICAgICAgIGFzc2VydEZhbHNlKFJlbG9hZGVkUmVzdWx0LmluaXRFdmVudENhbGxlZCk7CisKKyAgICAgICAgICAgIGNoZWNrTUJlYW5SZWdpc3RyYXRpb24oT1JJR0lOQUwsIHRydWUpOworICAgICAgICAgICAgY2hlY2tNQmVhblJlZ2lzdHJhdGlvbihSRUxPQURFRCwgZmFsc2UpOworCisgICAgICAgICAgICAvLyBub3cgY2F1c2UgdGhlIHJlbG9hZDoKKyAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgICAgIGludCBjbnQgPSAwOworICAgICAgICAgICAgd2hpbGUgKCghUmVsb2FkZWRSZXN1bHQuaW5pdEV2ZW50Q2FsbGVkKSAmJiAoY250KysgPCAzMCkpIHsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMjAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydFRydWUoIlRpbWVvdXQ6IGFwcGxpY2F0aW9uIHdhcyBub3QgcmVsb2FkZWQgaW4gdGltZS4iLCBSZWxvYWRlZFJlc3VsdC5pbml0RXZlbnRDYWxsZWQpOworICAgICAgICAgICAgLy8gd2FpdCBhZ2FpbiBzb21lIHRpbWUgdW50aWwgZXZlbnRzIGFyZSBwcm9jZXNzZWQgYW5kIG1iZWFucyBhcmUgaW52b2tlZAorICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDcwMCk7CisKKyAgICAgICAgICAgIC8vIGFmdGVyIHJlbG9hZAorICAgICAgICAgICAgYXNzZXJ0RmFsc2UoT3JpZ2luYWxSZXN1bHQucmVsb2FkZWRDYWxsZWQpOworICAgICAgICAgICAgYXNzZXJ0RmFsc2UoT3JpZ2luYWxSZXN1bHQucmVsb2FkZWRFdmVudENhbGxlZCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKE9yaWdpbmFsUmVzdWx0LnNodXRkb3duQ2FsbGVkKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoUmVsb2FkZWRSZXN1bHQuc3RhcnR1cENhbGxlZCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKFJlbG9hZGVkUmVzdWx0LmluaXRFdmVudENhbGxlZCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKFJlbG9hZGVkUmVzdWx0LnJlbG9hZGVkQ2FsbGVkKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoUmVsb2FkZWRSZXN1bHQucmVsb2FkZWRFdmVudENhbGxlZCk7CisKKyAgICAgICAgICAgIGNoZWNrTUJlYW5SZWdpc3RyYXRpb24oT1JJR0lOQUwsIGZhbHNlKTsKKyAgICAgICAgICAgIGNoZWNrTUJlYW5SZWdpc3RyYXRpb24oUkVMT0FERUQsIHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIGNoZWNrTUJlYW5SZWdpc3RyYXRpb24oU3RyaW5nIGFwcE5hbWUsIGJvb2xlYW4gc2hvdWxkQmVSZWdpc3RlcmVkKQorICAgICAgICAgICAgICAgIHRocm93cyBNYWxmb3JtZWRPYmplY3ROYW1lRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgIE1CZWFuRXhjZXB0aW9uLCBBdHRyaWJ1dGVOb3RGb3VuZEV4Y2VwdGlvbiwgSW5zdGFuY2VOb3RGb3VuZEV4Y2VwdGlvbiwgUmVmbGVjdGlvbkV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIE1CZWFuU2VydmVyIG1CZWFuU2VydmVyID0gTWFuYWdlbWVudEZhY3RvcnkuZ2V0UGxhdGZvcm1NQmVhblNlcnZlcigpOworICAgICAgICAgICAgZmluYWwgT2JqZWN0TmFtZSBuYW1lID0gbmV3IE9iamVjdE5hbWUoCisgICAgICAgICAgICAgICAgICAgICJvcmcuZ2xhc3NmaXNoLmplcnNleTp0eXBlPSIgKyBhcHBOYW1lICsgIixzdWJUeXBlPUdsb2JhbCxnbG9iYWw9Q29uZmlndXJhdGlvbiIpOworICAgICAgICAgICAgYm9vbGVhbiByZWdpc3RlcmVkID0gbUJlYW5TZXJ2ZXIuaXNSZWdpc3RlcmVkKG5hbWUpOworCisgICAgICAgICAgICBpbnQgdGltZSA9IDA7CisgICAgICAgICAgICB3aGlsZSAoc2hvdWxkQmVSZWdpc3RlcmVkICYmICFyZWdpc3RlcmVkICYmIHRpbWUgPCA0MDAwKSB7CisgICAgICAgICAgICAgICAgLy8gd2FpdCB1bnRpbCBNQmVhbnMgYXJlIGFzeW5jaHJvbm91c2x5IGV4cG9zZWQKKyAgICAgICAgICAgICAgICBpbnQgd2FpdFRpbWUgPSAzMDA7CisgICAgICAgICAgICAgICAgdGltZSArPSB3YWl0VGltZTsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAod2FpdFRpbWUpOworICAgICAgICAgICAgICAgIHJlZ2lzdGVyZWQgPSBtQmVhblNlcnZlci5pc1JlZ2lzdGVyZWQobmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHNob3VsZEJlUmVnaXN0ZXJlZCwgcmVnaXN0ZXJlZCk7CisgICAgICAgICAgICBpZiAocmVnaXN0ZXJlZCkgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzdHIgPSAoU3RyaW5nKSBtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUobmFtZSwgIkFwcGxpY2F0aW9uTmFtZSIpOworICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYXBwTmFtZSwgc3RyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbW9uaXRvcmluZy9TdGF0aXN0aWNzRGVzdHJveVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL21vbml0b3JpbmcvU3RhdGlzdGljc0Rlc3Ryb3lUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZhNWQ3NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL21vbml0b3JpbmcvU3RhdGlzdGljc0Rlc3Ryb3lUZXN0LmphdmEKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5tb25pdG9yaW5nOworCitpbXBvcnQgamF2YS5sYW5nLm1hbmFnZW1lbnQuTWFuYWdlbWVudEZhY3Rvcnk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50Lk9iamVjdE5hbWU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuRGVzdHJveUxpc3RlbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLk1vbml0b3JpbmdTdGF0aXN0aWNzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLk1vbml0b3JpbmdTdGF0aXN0aWNzTGlzdGVuZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5BYnN0cmFjdENvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29udGFpbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmdyaXp6bHkuR3JpenpseVRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuamRraHR0cC5KZGtIdHRwU2VydmVyVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5qZXR0eS5KZXR0eVRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc2ltcGxlLlNpbXBsZVRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuU3VpdGU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworQFJ1bldpdGgoU3VpdGUuY2xhc3MpCitAU3VpdGUuU3VpdGVDbGFzc2VzKHtTdGF0aXN0aWNzRGVzdHJveVRlc3QuR3JpenpseVRlc3RDYXNlLmNsYXNzLCBTdGF0aXN0aWNzRGVzdHJveVRlc3QuSmRrU2VydmVyVGVzdENhc2UuY2xhc3MsCisgICAgICAgIFN0YXRpc3RpY3NEZXN0cm95VGVzdC5TaW1wbGVIdHRwU2VydmVyVGVzdENhc2UuY2xhc3N9KQorcHVibGljIGNsYXNzIFN0YXRpc3RpY3NEZXN0cm95VGVzdCB7CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhcmVudFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgICAgICBTdGF0aXN0aWNzTGlzdGVuZXIucmVzZXQoKTsKKyAgICAgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKFRlc3RSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgICAgICByZXNvdXJjZUNvbmZpZy5zZXRBcHBsaWNhdGlvbk5hbWUoIm15QXBwbGljYXRpb24iKTsKKyAgICAgICAgICAgIHJlc291cmNlQ29uZmlnLnByb3BlcnR5KCJ2ZXJ5LWltcG9ydGFudCIsICJ5ZXMiKTsKKyAgICAgICAgICAgIHJlc291cmNlQ29uZmlnLnByb3BlcnR5KCJhbm90aGVyLXByb3BlcnR5IiwgNDgpOworICAgICAgICAgICAgcmVzb3VyY2VDb25maWcucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5NT05JVE9SSU5HX1NUQVRJU1RJQ1NfTUJFQU5TX0VOQUJMRUQsIHRydWUpOworICAgICAgICAgICAgcmVzb3VyY2VDb25maWcucmVnaXN0ZXIoU3RhdGlzdGljc0xpc3RlbmVyLmNsYXNzKTsKKyAgICAgICAgICAgIHJldHVybiByZXNvdXJjZUNvbmZpZzsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBAQWZ0ZXIKKyAgICAgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKFN0YXRpc3RpY3NMaXN0ZW5lci5PTl9TSFVURE9XTl9DQUxMRUQpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShTdGF0aXN0aWNzTGlzdGVuZXIuT05fREVTVFJPWV9DQUxMRUQpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShTdGF0aXN0aWNzTGlzdGVuZXIuT05fU1RBVElTVElDU19DQUxMRUQpOworCisgICAgICAgICAgICBmaW5hbCBNQmVhblNlcnZlciBtQmVhblNlcnZlciA9IE1hbmFnZW1lbnRGYWN0b3J5LmdldFBsYXRmb3JtTUJlYW5TZXJ2ZXIoKTsKKyAgICAgICAgICAgIGZpbmFsIE9iamVjdE5hbWUgbmFtZSA9IG5ldyBPYmplY3ROYW1lKCJvcmcuZ2xhc3NmaXNoLmplcnNleTp0eXBlPW15QXBwbGljYXRpb24sc3ViVHlwZT1HbG9iYWwsZ2xvYmFsPUNvbmZpZ3VyYXRpb24iKTsKKyAgICAgICAgICAgIGJvb2xlYW4gcmVnaXN0ZXJlZCA9IG1CZWFuU2VydmVyLmlzUmVnaXN0ZXJlZChuYW1lKTsKKyAgICAgICAgICAgIGludCB0aW1lID0gMDsKKyAgICAgICAgICAgIHdoaWxlIChyZWdpc3RlcmVkICYmIHRpbWUgPCA0MDAwKSB7CisgICAgICAgICAgICAgICAgLy8gd2FpdCB1bnRpbCBNQmVhbnMgYXJlIGFzeW5jaHJvbm91c2x5IGV4cG9zZWQKKyAgICAgICAgICAgICAgICBpbnQgd2FpdFRpbWUgPSAzMDA7CisgICAgICAgICAgICAgICAgdGltZSArPSB3YWl0VGltZTsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAod2FpdFRpbWUpOworICAgICAgICAgICAgICAgIHJlZ2lzdGVyZWQgPSBtQmVhblNlcnZlci5pc1JlZ2lzdGVyZWQobmFtZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZSgiTUJlYW4gc2hvdWxkIGJlIGFscmVhZHkgdW5yZWdpc3RlcmVkISIsIG1CZWFuU2VydmVyLmlzUmVnaXN0ZXJlZChuYW1lKSk7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgicmVzb3VyY2UiKQorICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RSZXNvdXJjZSB7CisgICAgICAgICAgICBAR0VUCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHRlc3RHZXQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJnZXQiOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBhdGggPSAicmVzb3VyY2UiOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgdGFyZ2V0KCkucGF0aChwYXRoKS5yZXF1ZXN0KCkuZ2V0KCkuZ2V0U3RhdHVzKCkpOworICAgICAgICAgICAgZmluYWwgTUJlYW5TZXJ2ZXIgbUJlYW5TZXJ2ZXIgPSBNYW5hZ2VtZW50RmFjdG9yeS5nZXRQbGF0Zm9ybU1CZWFuU2VydmVyKCk7CisgICAgICAgICAgICBmaW5hbCBPYmplY3ROYW1lIG5hbWUgPSBuZXcgT2JqZWN0TmFtZSgib3JnLmdsYXNzZmlzaC5qZXJzZXk6dHlwZT1teUFwcGxpY2F0aW9uLHN1YlR5cGU9R2xvYmFsLGdsb2JhbD1Db25maWd1cmF0aW9uIik7CisgICAgICAgICAgICBib29sZWFuIHJlZ2lzdGVyZWQgPSBtQmVhblNlcnZlci5pc1JlZ2lzdGVyZWQobmFtZSk7CisKKyAgICAgICAgICAgIC8vIHdhaXQgKGV2ZW50cyBhcmUgcHJvY2Vzc2VkIGFzeW5jaHJvbm91c2x5IGFuZCBpdCBtaWdodCB0YWtlIHRpbWUgdG8gZXhwb3NlIG1iZWFucworICAgICAgICAgICAgaW50IHRpbWUgPSAwOworICAgICAgICAgICAgd2hpbGUgKCFyZWdpc3RlcmVkICYmIHRpbWUgPCA0MDAwKSB7CisgICAgICAgICAgICAgICAgLy8gd2FpdCB1bnRpbCBNQmVhbnMgYXJlIGFzeW5jaHJvbm91c2x5IGV4cG9zZWQKKyAgICAgICAgICAgICAgICBpbnQgd2FpdFRpbWUgPSAzMDA7CisgICAgICAgICAgICAgICAgdGltZSArPSB3YWl0VGltZTsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAod2FpdFRpbWUpOworICAgICAgICAgICAgICAgIHJlZ2lzdGVyZWQgPSBtQmVhblNlcnZlci5pc1JlZ2lzdGVyZWQobmFtZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFzc2VydFRydWUoIk1CZWFuIHNob3VsZCBiZSBhbHJlYWR5IHJlZ2lzdGVyZWQhIiwgbUJlYW5TZXJ2ZXIuaXNSZWdpc3RlcmVkKG5hbWUpKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzdHIgPSAoU3RyaW5nKSBtQmVhblNlcnZlci5nZXRBdHRyaWJ1dGUobmFtZSwgIkFwcGxpY2F0aW9uTmFtZSIpOworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygibXlBcHBsaWNhdGlvbiIsIHN0cik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEdyaXp6bHlUZXN0Q2FzZSBleHRlbmRzIFBhcmVudFRlc3QgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICAgICAgU3RhdGlzdGljc0xpc3RlbmVyLnJlc2V0KCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IEdyaXp6bHlUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKZGtTZXJ2ZXJUZXN0Q2FzZSBleHRlbmRzIFBhcmVudFRlc3QgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICAgICAgU3RhdGlzdGljc0xpc3RlbmVyLnJlc2V0KCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IEpka0h0dHBTZXJ2ZXJUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogV29ya3Mgb25seSB3aXRoIEphdmEgNworICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSmV0dHlTZXJ2ZXJUZXN0Q2FzZSBleHRlbmRzIFBhcmVudFRlc3QgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICAgICAgU3RhdGlzdGljc0xpc3RlbmVyLnJlc2V0KCk7CisgICAgICAgICAgICByZXR1cm4gbmV3IEpldHR5VGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2ltcGxlSHR0cFNlcnZlclRlc3RDYXNlIGV4dGVuZHMgUGFyZW50VGVzdCB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBTdGF0aXN0aWNzTGlzdGVuZXIucmVzZXQoKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU2ltcGxlVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3RhdGlzdGljc0xpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RDb250YWluZXJMaWZlY3ljbGVMaXN0ZW5lcgorICAgICAgICAgICAgaW1wbGVtZW50cyBNb25pdG9yaW5nU3RhdGlzdGljc0xpc3RlbmVyLCBEZXN0cm95TGlzdGVuZXIgeworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBPTl9TSFVURE9XTl9DQUxMRUQgPSBmYWxzZTsKKyAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIE9OX1NUQVRJU1RJQ1NfQ0FMTEVEID0gZmFsc2U7CisgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBPTl9ERVNUUk9ZX0NBTExFRCA9IGZhbHNlOworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgICAgIE9OX1NIVVRET1dOX0NBTExFRCA9IGZhbHNlOworICAgICAgICAgICAgT05fU1RBVElTVElDU19DQUxMRUQgPSBmYWxzZTsKKyAgICAgICAgICAgIE9OX0RFU1RST1lfQ0FMTEVEID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TdGF0aXN0aWNzKE1vbml0b3JpbmdTdGF0aXN0aWNzIHN0YXRpc3RpY3MpIHsKKyAgICAgICAgICAgIFN0YXRpc3RpY3NMaXN0ZW5lci5PTl9TVEFUSVNUSUNTX0NBTExFRCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgb25TaHV0ZG93bihDb250YWluZXIgY29udGFpbmVyKSB7CisgICAgICAgICAgICBTdGF0aXN0aWNzTGlzdGVuZXIuT05fU0hVVERPV05fQ0FMTEVEID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBvbkRlc3Ryb3koKSB7CisgICAgICAgICAgICBTdGF0aXN0aWNzTGlzdGVuZXIuT05fREVTVFJPWV9DQUxMRUQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0JlYW5WYWxpZGF0aW9uRXJyb3JUZW1wbGF0ZVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9CZWFuVmFsaWRhdGlvbkVycm9yVGVtcGxhdGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU1OGJiNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9CZWFuVmFsaWRhdGlvbkVycm9yVGVtcGxhdGVUZXN0LmphdmEKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5tdmM7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuRXJyb3JUZW1wbGF0ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLmJlYW52YWxpZGF0aW9uLk12Y0JlYW5WYWxpZGF0aW9uRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLm12Yy5wcm92aWRlci5UZXN0Vmlld1Byb2Nlc3NvcjsKKworaW1wb3J0IG9yZy5oaWJlcm5hdGUudmFsaWRhdG9yLmNvbnN0cmFpbnRzLkxlbmd0aDsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgQmVhblZhbGlkYXRpb25FcnJvclRlbXBsYXRlVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBQcm9wZXJ0aWVzIHByb3BzOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKKworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5EVU1QX0VOVElUWSk7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhFcnJvclRlbXBsYXRlUmVzb3VyY2UuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKE12Y0JlYW5WYWxpZGF0aW9uRmVhdHVyZS5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoVGVzdFZpZXdQcm9jZXNzb3IuY2xhc3MpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBAQ29uc3VtZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXJyb3JUZW1wbGF0ZVJlc291cmNlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgicGFyYW1zIikKKyAgICAgICAgQEVycm9yVGVtcGxhdGUKKyAgICAgICAgcHVibGljIFN0cmluZyBpbnZhbGlkUGFyYW1zKEBMZW5ndGgobWluID0gNSkgZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICBmYWlsKCJTaG91bGQgZmFpbCBvbiBCZWFuIFZhbGlkYXRpb24hIik7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgicmV0dXJuIikKKyAgICAgICAgQEVycm9yVGVtcGxhdGUKKyAgICAgICAgQExlbmd0aChtaW4gPSA1KQorICAgICAgICBwdWJsaWMgU3RyaW5nIGludmFsaWRSZXR1cm5WYWx1ZShmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRQYXJhbXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoInBhcmFtcyIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS50ZXh0KCJmb28iKSk7CisgICAgICAgIHByb3BzLmxvYWQocmVzcG9uc2UucmVhZEVudGl0eShJbnB1dFN0cmVhbS5jbGFzcykpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oNDAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocHJvcHMuZ2V0UHJvcGVydHkoIm1vZGVsIiksCisgICAgICAgICAgICAgICAgZXF1YWxUbygie29yZy5oaWJlcm5hdGUudmFsaWRhdG9yLmNvbnN0cmFpbnRzLkxlbmd0aC5tZXNzYWdlfV9FcnJvclRlbXBsYXRlUmVzb3VyY2UuaW52YWxpZFBhcmFtcy5hcmcwX2ZvbyIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkUmV0dXJuVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoInJldHVybiIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS50ZXh0KCJmb28iKSk7CisgICAgICAgIHByb3BzLmxvYWQocmVzcG9uc2UucmVhZEVudGl0eShJbnB1dFN0cmVhbS5jbGFzcykpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oNTAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocHJvcHMuZ2V0UHJvcGVydHkoIm1vZGVsIiksCisgICAgICAgICAgICAgICAgZXF1YWxUbygie29yZy5oaWJlcm5hdGUudmFsaWRhdG9yLmNvbnN0cmFpbnRzLkxlbmd0aC5tZXNzYWdlfV9FcnJvclRlbXBsYXRlUmVzb3VyY2UuaW52YWxpZFJldHVyblZhbHVlLiIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIjxyZXR1cm4gdmFsdWU+X2ZvbyIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvQ3VzdG9tVmlld2FibGVDb250ZXh0VGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0N1c3RvbVZpZXdhYmxlQ29udGV4dFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmNiNGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0N1c3RvbVZpZXdhYmxlQ29udGV4dFRlc3QuamF2YQpAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLm12YzsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuTXZjRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLlRlbXBsYXRlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuVmlld2FibGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5tdmMucHJvdmlkZXIuQ3VzdG9tVmlld2FibGVDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIubXZjLnByb3ZpZGVyLlRlc3RWaWV3UHJvY2Vzc29yOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgQ3VzdG9tVmlld2FibGVDb250ZXh0VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKTsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEV4cGxpY2l0VGVtcGxhdGUuY2xhc3MsIEltcGxpY2l0VGVtcGxhdGUuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKE12Y0ZlYXR1cmUuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKFRlc3RWaWV3UHJvY2Vzc29yLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihDdXN0b21WaWV3YWJsZUNvbnRleHQuY2xhc3MpOworICAgIH0KKworICAgIEBQYXRoKCIvZXhwbGljaXQiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXhwbGljaXRUZW1wbGF0ZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAVGVtcGxhdGUKKyAgICAgICAgcHVibGljIFZpZXdhYmxlIGdldFZpZXdhYmxlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBWaWV3YWJsZSgiIiwgIm1ldGhvZCIpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiYW5ub3RhdGlvbiIpCisgICAgICAgIEBUZW1wbGF0ZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRlbXBsYXRlKCkgeworICAgICAgICAgICAgcmV0dXJuICJhbm5vdGF0aW9uIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZW1wbGF0ZQorICAgIEBQYXRoKCIvaW1wbGljaXQiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGljaXRUZW1wbGF0ZSB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gImltcGxpY2l0IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEV4cGxpY2l0TWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RSZXNvdXJjZSgiZXhwbGljaXQiLCAibWV0aG9kIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhwbGljaXRBbm5vdGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RSZXNvdXJjZSgiZXhwbGljaXQvYW5ub3RhdGlvbiIsICJhbm5vdGF0aW9uIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wbGljaXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdFJlc291cmNlKCJpbXBsaWNpdCIsICJpbXBsaWNpdCIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0UmVzb3VyY2UoZmluYWwgU3RyaW5nIHBhdGgsIGZpbmFsIFN0cmluZyBtb2RlbFZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgcC5sb2FkKHRhcmdldChwYXRoKS5yZXF1ZXN0KCkuZ2V0KElucHV0U3RyZWFtLmNsYXNzKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvQ3VzdG9tVmlld2FibGVDb250ZXh0L2luZGV4LnRlc3RwIiwgcC5nZXRQcm9wZXJ0eSgicGF0aCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1vZGVsVmFsdWUsIHAuZ2V0UHJvcGVydHkoIm1vZGVsIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlRlc3RWaWV3UHJvY2Vzc29yIiwgcC5nZXRQcm9wZXJ0eSgibmFtZSIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXJyb3JUZW1wbGF0ZVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FcnJvclRlbXBsYXRlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmODQ3NWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXJyb3JUZW1wbGF0ZVRlc3QuamF2YQpAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLm12YzsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLkVycm9yVGVtcGxhdGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5NdmNGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIubXZjLnByb3ZpZGVyLlRlc3RWaWV3UHJvY2Vzc29yOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgRXJyb3JUZW1wbGF0ZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5EVU1QX0VOVElUWSk7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhFcnJvclRlbXBsYXRlUmVzb3VyY2UuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKE12Y0ZlYXR1cmUuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKFRlc3RWaWV3UHJvY2Vzc29yLmNsYXNzKTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFcnJvclRlbXBsYXRlUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQEVycm9yVGVtcGxhdGUKKyAgICAgICAgcHVibGljIFN0cmluZyBtZXRob2QoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXJyb3JUZW1wbGF0ZSIpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgibWV0aG9kUmVsYXRpdmVQYXRoIikKKyAgICAgICAgQEVycm9yVGVtcGxhdGUobmFtZSA9ICJyZWxhdGl2ZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgbWV0aG9kUmVsYXRpdmVQYXRoKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkVycm9yVGVtcGxhdGUiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIm1ldGhvZEFic29sdXRlUGF0aCIpCisgICAgICAgIEBFcnJvclRlbXBsYXRlKG5hbWUgPSAiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0Vycm9yVGVtcGxhdGVUZXN0L0Vycm9yVGVtcGxhdGVSZXNvdXJjZS9hYnNvbHV0ZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgbWV0aG9kQWJzb2x1dGVQYXRoKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkVycm9yVGVtcGxhdGUiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJzdWJSZXNvdXJjZSIpCisgICAgICAgIHB1YmxpYyBFcnJvclRlbXBsYXRlUmVzb3VyY2Ugc3ViUmVzb3VyY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEVycm9yVGVtcGxhdGVSZXNvdXJjZSgpOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInN1YlJlc291cmNlVGVtcGxhdGUiKQorICAgICAgICBARXJyb3JUZW1wbGF0ZQorICAgICAgICBwdWJsaWMgRXJyb3JUZW1wbGF0ZVN1YlJlc291cmNlIHN1YlJlc291cmNlVGVtcGxhdGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEVycm9yVGVtcGxhdGVTdWJSZXNvdXJjZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFcnJvclRlbXBsYXRlU3ViUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXJyb3JUZW1wbGF0ZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RFcnJvck1ldGhvZFRlbXBsYXRlU3ViUmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGFyZ2V0KCJzdWJSZXNvdXJjZVRlbXBsYXRlIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVycm9yVGVtcGxhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdEVycm9yVGVtcGxhdGUodGFyZ2V0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVycm9yVGVtcGxhdGVTdWJSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0RXJyb3JUZW1wbGF0ZSh0YXJnZXQoInN1YlJlc291cmNlIikpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0RXJyb3JUZW1wbGF0ZShmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIHByb3BzLmxvYWQodGFyZ2V0LnJlcXVlc3QoKS5nZXQoSW5wdXRTdHJlYW0uY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXJyb3JUZW1wbGF0ZVRlc3QvRXJyb3JUZW1wbGF0ZVJlc291cmNlL2luZGV4LnRlc3RwIiwKKyAgICAgICAgICAgICAgICBwcm9wcy5nZXRQcm9wZXJ0eSgicGF0aCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbjogRXJyb3JUZW1wbGF0ZSIsIHByb3BzLmdldFByb3BlcnR5KCJtb2RlbCIpKTsKKworICAgICAgICBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIHByb3BzLmxvYWQodGFyZ2V0LnBhdGgoIm1ldGhvZFJlbGF0aXZlUGF0aCIpLnJlcXVlc3QoKS5nZXQoSW5wdXRTdHJlYW0uY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXJyb3JUZW1wbGF0ZVRlc3QvRXJyb3JUZW1wbGF0ZVJlc291cmNlL3JlbGF0aXZlLnRlc3RwIiwKKyAgICAgICAgICAgICAgICBwcm9wcy5nZXRQcm9wZXJ0eSgicGF0aCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbjogRXJyb3JUZW1wbGF0ZSIsIHByb3BzLmdldFByb3BlcnR5KCJtb2RlbCIpKTsKKworICAgICAgICBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIHByb3BzLmxvYWQodGFyZ2V0LnBhdGgoIm1ldGhvZEFic29sdXRlUGF0aCIpLnJlcXVlc3QoKS5nZXQoSW5wdXRTdHJlYW0uY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXJyb3JUZW1wbGF0ZVRlc3QvRXJyb3JUZW1wbGF0ZVJlc291cmNlL2Fic29sdXRlLnRlc3RwIiwKKyAgICAgICAgICAgICAgICBwcm9wcy5nZXRQcm9wZXJ0eSgicGF0aCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqYXZhLmxhbmcuUnVudGltZUV4Y2VwdGlvbjogRXJyb3JUZW1wbGF0ZSIsIHByb3BzLmdldFByb3BlcnR5KCJtb2RlbCIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhjZXB0aW9uVmlld1Byb2Nlc3NvclRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeGNlcHRpb25WaWV3UHJvY2Vzc29yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MmMwOTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhjZXB0aW9uVmlld1Byb2Nlc3NvclRlc3QuamF2YQpAQCAtMCwwICsxLDEyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLm12YzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5JbnZvY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuRXhjZXB0aW9uTWFwcGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLk12Y0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5WaWV3YWJsZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLm12Yy5wcm92aWRlci5UZXN0Vmlld1Byb2Nlc3NvcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEV4Y2VwdGlvblZpZXdQcm9jZXNzb3JUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworCisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoRXhwbGljaXRUZW1wbGF0ZS5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoTXZjRmVhdHVyZS5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoVGVzdFZpZXdQcm9jZXNzb3IuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKFdlYkFwcEV4Y2VwdGlvbk1hcHBlci5jbGFzcyk7CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBXZWJBcHBFeGNlcHRpb25NYXBwZXIgaW1wbGVtZW50cyBFeGNlcHRpb25NYXBwZXI8V2ViQXBwbGljYXRpb25FeGNlcHRpb24+IHsKKworICAgICAgICBwdWJsaWMgUmVzcG9uc2UgdG9SZXNwb25zZShXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgIC8vIEFic29sdXRlLgorICAgICAgICAgICAgaWYgKGV4Y2VwdGlvbi5nZXRSZXNwb25zZSgpLmdldFN0YXR1cygpID09IDQwNCkgeworICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZQorICAgICAgICAgICAgICAgICAgICAgICAgLnN0YXR1cyg0MDQpCisgICAgICAgICAgICAgICAgICAgICAgICAuZW50aXR5KG5ldyBWaWV3YWJsZSgiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4Y2VwdGlvblZpZXdQcm9jZXNzb3JUZXN0LzQwNCIsICI0MDQiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBSZWxhdGl2ZS4KKyAgICAgICAgICAgIGlmIChleGNlcHRpb24uZ2V0UmVzcG9uc2UoKS5nZXRTdGF0dXMoKSA9PSA0MDYpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDQwNikuZW50aXR5KAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFZpZXdhYmxlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4Y2VwdGlvblZpZXdQcm9jZXNzb3JUZXN0L1dlYkFwcEV4Y2VwdGlvbk1hcHBlci80MDYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiNDA2IikpLmJ1aWxkKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBleGNlcHRpb24uZ2V0UmVzcG9uc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEV4cGxpY2l0VGVtcGxhdGUgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mb28iKQorICAgICAgICBwdWJsaWMgVmlld2FibGUgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBWaWV3YWJsZSgic2hvdyIsICJnZXQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFic29sdXRlRXhwbGljaXRUZW1wbGF0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEludm9jYXRpb24uQnVpbGRlciByZXF1ZXN0ID0gdGFyZ2V0KCIvZG9lcy1ub3QtZXhpc3QiKS5yZXF1ZXN0KCk7CisKKyAgICAgICAgUmVzcG9uc2UgY3IgPSByZXF1ZXN0LmdldChSZXNwb25zZS5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDQsIGNyLmdldFN0YXR1cygpKTsKKworICAgICAgICBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBwLmxvYWQoY3IucmVhZEVudGl0eShJbnB1dFN0cmVhbS5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeGNlcHRpb25WaWV3UHJvY2Vzc29yVGVzdC80MDQudGVzdHAiLCBwLmdldFByb3BlcnR5KCJwYXRoIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjQwNCIsIHAuZ2V0UHJvcGVydHkoIm1vZGVsIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc29sdmluZ0NsYXNzRXhwbGljaXRUZW1wbGF0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEludm9jYXRpb24uQnVpbGRlciByZXF1ZXN0ID0gdGFyZ2V0KCIvIikucmVxdWVzdCgiYXBwbGljYXRpb24vd3JvbmctbWVkaWEtdHlwZSIpOworCisgICAgICAgIFJlc3BvbnNlIGNyID0gcmVxdWVzdC5nZXQoUmVzcG9uc2UuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDA2LCBjci5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgcC5sb2FkKGNyLnJlYWRFbnRpdHkoSW5wdXRTdHJlYW0uY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhjZXB0aW9uVmlld1Byb2Nlc3NvclRlc3QvV2ViQXBwRXhjZXB0aW9uTWFwcGVyLzQwNi50ZXN0cCIsCisgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgicGF0aCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI0MDYiLCBwLmdldFByb3BlcnR5KCJtb2RlbCIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRQcm9kdWNlVGVtcGxhdGVUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRQcm9kdWNlVGVtcGxhdGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVkOTcwYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFByb2R1Y2VUZW1wbGF0ZVRlc3QuamF2YQpAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLm12YzsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5NdmNGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuVGVtcGxhdGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5tdmMucHJvdmlkZXIuQWJjVmlld1Byb2Nlc3NvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLm12Yy5wcm92aWRlci5EZWZWaWV3UHJvY2Vzc29yOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBFeHBsaWNpdFByb2R1Y2VUZW1wbGF0ZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5EVU1QX0VOVElUWSk7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhFeHBsaWNpdFR3b0dldFByb2R1Y2VzVGVtcGxhdGUuY2xhc3MsCisgICAgICAgICAgICAgICAgRXhwbGljaXROb1Byb2R1Y2VzVGVtcGxhdGUuY2xhc3MsIEV4cGxpY2l0V2lsZGNhcmRQcm9kdWNlc1RlbXBsYXRlLmNsYXNzLCBFeHBsaWNpdFRlbXBsYXRlUHJvZHVjZXNDbGFzcy5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoTXZjRmVhdHVyZS5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoQWJjVmlld1Byb2Nlc3Nvci5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoRGVmVmlld1Byb2Nlc3Nvci5jbGFzcyk7CisgICAgfQorCisgICAgQFBhdGgoIi9leHBsaWNpdC1uby1wcm9kdWNlcyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeHBsaWNpdE5vUHJvZHVjZXNUZW1wbGF0ZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAVGVtcGxhdGUKKyAgICAgICAgcHVibGljIFN0cmluZyBkZWYoKSB7CisgICAgICAgICAgICByZXR1cm4gImRlZiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL2V4cGxpY2l0LXdpbGRjYXJkLXByb2R1Y2VzIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEV4cGxpY2l0V2lsZGNhcmRQcm9kdWNlc1RlbXBsYXRlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBUZW1wbGF0ZQorICAgICAgICBAUHJvZHVjZXMoIiovKiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZGVmKCkgeworICAgICAgICAgICAgcmV0dXJuICJkZWYiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi9leHBsaWNpdC10d28tZ2V0LXByb2R1Y2VzIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEV4cGxpY2l0VHdvR2V0UHJvZHVjZXNUZW1wbGF0ZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAVGVtcGxhdGUKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9hYmMiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGFiYygpIHsKKyAgICAgICAgICAgIHJldHVybiAiYWJjIjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFRlbXBsYXRlCisgICAgICAgIEBQcm9kdWNlcygiKi8qIikKKyAgICAgICAgcHVibGljIFN0cmluZyBkZWYoKSB7CisgICAgICAgICAgICByZXR1cm4gImRlZiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiZXhwbGljaXRUZW1wbGF0ZVByb2R1Y2VzQ2xhc3MiKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vYWJjIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEV4cGxpY2l0VGVtcGxhdGVQcm9kdWNlc0NsYXNzIGV4dGVuZHMgRXhwbGljaXRUZW1wbGF0ZVRlc3QuRXhwbGljaXRUZW1wbGF0ZSB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvZHVjZXNXaWxkY2FyZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBwYXRoIDogbmV3IFN0cmluZ1tdIHsiZXhwbGljaXQtbm8tcHJvZHVjZXMiLCAiZXhwbGljaXQtd2lsZGNhcmQtcHJvZHVjZXMiLAorICAgICAgICAgICAgICAgICJleHBsaWNpdC10d28tZ2V0LXByb2R1Y2VzIn0pIHsKKyAgICAgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQocGF0aCk7CisKKyAgICAgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIG1lZGlhVHlwZSA6IG5ldyBTdHJpbmdbXSB7ImFwcGxpY2F0aW9uL2RlZiIsICJ0ZXh0L3BsYWluIn0pIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICAgICAgICAgIHAubG9hZCh0YXJnZXQucmVxdWVzdChtZWRpYVR5cGUpLmdldChJbnB1dFN0cmVhbS5jbGFzcykpOworCisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShwLmdldFByb3BlcnR5KCJwYXRoIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5tYXRjaGVzKCIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRQcm9kdWNlVGVtcGxhdGVUZXN0L0V4cGxpY2l0KFthLXpBLVpdKykiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlRlbXBsYXRlL2luZGV4LmRlZiIpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImRlZiIsIHAuZ2V0UHJvcGVydHkoIm1vZGVsIikpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiRGVmVmlld1Byb2Nlc3NvciIsIHAuZ2V0UHJvcGVydHkoIm5hbWUiKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQcm9kdWNlc1NwZWNpZmljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoImV4cGxpY2l0LXR3by1nZXQtcHJvZHVjZXMiKTsKKworICAgICAgICBmaW5hbCBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBwLmxvYWQodGFyZ2V0LnJlcXVlc3QoImFwcGxpY2F0aW9uL2FiYyIpLmdldChJbnB1dFN0cmVhbS5jbGFzcykpOworCisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0UHJvZHVjZVRlbXBsYXRlVGVzdC9FeHBsaWNpdFR3b0dldFByb2R1Y2VzVGVtcGxhdGUvaW5kZXguYWJjIiwKKyAgICAgICAgICAgICAgICBwLmdldFByb3BlcnR5KCJwYXRoIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFiYyIsIHAuZ2V0UHJvcGVydHkoIm1vZGVsIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkFiY1ZpZXdQcm9jZXNzb3IiLCBwLmdldFByb3BlcnR5KCJuYW1lIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEV4cGxpY2l0VGVtcGxhdGVQcm9kdWNlc0NsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoImV4cGxpY2l0VGVtcGxhdGVQcm9kdWNlc0NsYXNzIik7CisKKyAgICAgICAgUHJvcGVydGllcyBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIHByb3BzLmxvYWQodGFyZ2V0LnJlcXVlc3QoKS5nZXQoSW5wdXRTdHJlYW0uY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRQcm9kdWNlVGVtcGxhdGVUZXN0L0V4cGxpY2l0VGVtcGxhdGVQcm9kdWNlc0NsYXNzL2luZGV4LmFiYyIsCisgICAgICAgICAgICAgICAgcHJvcHMuZ2V0UHJvcGVydHkoInBhdGgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygibWV0aG9kIiwgcHJvcHMuZ2V0UHJvcGVydHkoIm1vZGVsIikpOworCisgICAgICAgIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgcHJvcHMubG9hZCh0YXJnZXQucGF0aCgibWV0aG9kUmVsYXRpdmVQYXRoIikucmVxdWVzdCgpLmdldChJbnB1dFN0cmVhbS5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFByb2R1Y2VUZW1wbGF0ZVRlc3QvRXhwbGljaXRUZW1wbGF0ZVByb2R1Y2VzQ2xhc3MvcmVsYXRpdmUiCisgICAgICAgICAgICAgICAgICAgICAgICArICIuYWJjIiwKKyAgICAgICAgICAgICAgICBwcm9wcy5nZXRQcm9wZXJ0eSgicGF0aCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJtZXRob2RSZWxhdGl2ZVBhdGgiLCBwcm9wcy5nZXRQcm9wZXJ0eSgibW9kZWwiKSk7CisKKyAgICAgICAgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBwcm9wcy5sb2FkKHRhcmdldC5wYXRoKCJtZXRob2RBYnNvbHV0ZVBhdGgiKS5yZXF1ZXN0KCkuZ2V0KElucHV0U3RyZWFtLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0VGVtcGxhdGVUZXN0L0V4cGxpY2l0VGVtcGxhdGUvYWJzb2x1dGUuYWJjIiwKKyAgICAgICAgICAgICAgICBwcm9wcy5nZXRQcm9wZXJ0eSgicGF0aCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJtZXRob2RBYnNvbHV0ZVBhdGgiLCBwcm9wcy5nZXRQcm9wZXJ0eSgibW9kZWwiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0VGVtcGxhdGVUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRUZW1wbGF0ZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmJkOGI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0VGVtcGxhdGVUZXN0LmphdmEKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5tdmM7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuTXZjRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLlRlbXBsYXRlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIubXZjLnByb3ZpZGVyLlRlc3RWaWV3UHJvY2Vzc29yOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgRXhwbGljaXRUZW1wbGF0ZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5EVU1QX0VOVElUWSk7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhFeHBsaWNpdFRlbXBsYXRlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihNdmNGZWF0dXJlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihUZXN0Vmlld1Byb2Nlc3Nvci5jbGFzcyk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDdXN0b21SZXNvbHZpbmdDbGFzcyB7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRXhwbGljaXRUZW1wbGF0ZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAVGVtcGxhdGUKKyAgICAgICAgcHVibGljIFN0cmluZyBtZXRob2QoKSB7CisgICAgICAgICAgICByZXR1cm4gIm1ldGhvZCI7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJtZXRob2RSZWxhdGl2ZVBhdGgiKQorICAgICAgICBAVGVtcGxhdGUobmFtZSA9ICJyZWxhdGl2ZSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgbWV0aG9kUmVsYXRpdmVQYXRoKCkgeworICAgICAgICAgICAgcmV0dXJuICJtZXRob2RSZWxhdGl2ZVBhdGgiOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgibWV0aG9kQWJzb2x1dGVQYXRoIikKKyAgICAgICAgQFRlbXBsYXRlKG5hbWUgPSAiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0VGVtcGxhdGVUZXN0L0V4cGxpY2l0VGVtcGxhdGUvYWJzb2x1dGUiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIG1ldGhvZEFic29sdXRlUGF0aCgpIHsKKyAgICAgICAgICAgIHJldHVybiAibWV0aG9kQWJzb2x1dGVQYXRoIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJzdWJSZXNvdXJjZSIpCisgICAgICAgIHB1YmxpYyBFeHBsaWNpdFRlbXBsYXRlIHN1YlJlc291cmNlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHBsaWNpdFRlbXBsYXRlKCk7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgic3ViUmVzb3VyY2VUZW1wbGF0ZSIpCisgICAgICAgIEBUZW1wbGF0ZQorICAgICAgICBwdWJsaWMgRXhwbGljaXRUZW1wbGF0ZVN1YlJlc291cmNlIHN1YlJlc291cmNlVGVtcGxhdGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEV4cGxpY2l0VGVtcGxhdGVTdWJSZXNvdXJjZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeHBsaWNpdFRlbXBsYXRlU3ViUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gImdldCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeHBsaWNpdE1ldGhvZFRlbXBsYXRlU3ViUmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXQiLCB0YXJnZXQoInN1YlJlc291cmNlVGVtcGxhdGUiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEV4cGxpY2l0VGVtcGxhdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RFeHBsaWNpdFRlbXBsYXRlKHRhcmdldCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeHBsaWNpdFRlbXBsYXRlU3ViUmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RFeHBsaWNpdFRlbXBsYXRlKHRhcmdldCgic3ViUmVzb3VyY2UiKSk7CisgICAgfQorCisgICAgdm9pZCBfdGVzdEV4cGxpY2l0VGVtcGxhdGUoZmluYWwgV2ViVGFyZ2V0IHRhcmdldCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFByb3BlcnRpZXMgcHJvcHMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBwcm9wcy5sb2FkKHRhcmdldC5yZXF1ZXN0KCkuZ2V0KElucHV0U3RyZWFtLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0VGVtcGxhdGVUZXN0L0V4cGxpY2l0VGVtcGxhdGUvaW5kZXgudGVzdHAiLAorICAgICAgICAgICAgICAgIHByb3BzLmdldFByb3BlcnR5KCJwYXRoIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm1ldGhvZCIsIHByb3BzLmdldFByb3BlcnR5KCJtb2RlbCIpKTsKKworICAgICAgICBwcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIHByb3BzLmxvYWQodGFyZ2V0LnBhdGgoIm1ldGhvZFJlbGF0aXZlUGF0aCIpLnJlcXVlc3QoKS5nZXQoSW5wdXRTdHJlYW0uY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRUZW1wbGF0ZVRlc3QvRXhwbGljaXRUZW1wbGF0ZS9yZWxhdGl2ZS50ZXN0cCIsCisgICAgICAgICAgICAgICAgcHJvcHMuZ2V0UHJvcGVydHkoInBhdGgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygibWV0aG9kUmVsYXRpdmVQYXRoIiwgcHJvcHMuZ2V0UHJvcGVydHkoIm1vZGVsIikpOworCisgICAgICAgIHByb3BzID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgcHJvcHMubG9hZCh0YXJnZXQucGF0aCgibWV0aG9kQWJzb2x1dGVQYXRoIikucmVxdWVzdCgpLmdldChJbnB1dFN0cmVhbS5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFRlbXBsYXRlVGVzdC9FeHBsaWNpdFRlbXBsYXRlL2Fic29sdXRlLnRlc3RwIiwKKyAgICAgICAgICAgICAgICBwcm9wcy5nZXRQcm9wZXJ0eSgicGF0aCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJtZXRob2RBYnNvbHV0ZVBhdGgiLCBwcm9wcy5nZXRQcm9wZXJ0eSgibW9kZWwiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ZsYXRJbmhlcml0ZWRWaWV3UHJvY2Vzc29yVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ZsYXRJbmhlcml0ZWRWaWV3UHJvY2Vzc29yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYzBkY2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRmxhdEluaGVyaXRlZFZpZXdQcm9jZXNzb3JUZXN0LmphdmEKQEAgLTAsMCArMSwxMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5tdmM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5NdmNGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuVGVtcGxhdGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5WaWV3YWJsZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLm12Yy5wcm92aWRlci5UZXN0Vmlld1Byb2Nlc3NvcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEZsYXRJbmhlcml0ZWRWaWV3UHJvY2Vzc29yVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKTsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEV4cGxpY2l0VGVtcGxhdGUuY2xhc3MsIEltcGxpY2l0VGVtcGxhdGUuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKE12Y0ZlYXR1cmUuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKFRlc3RWaWV3UHJvY2Vzc29yLmNsYXNzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEV4cGxpY2l0VGVtcGxhdGVCYXNlIHsKKyAgICB9CisKKyAgICBAUGF0aCgiL2V4cGxpY2l0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEV4cGxpY2l0VGVtcGxhdGUgZXh0ZW5kcyBFeHBsaWNpdFRlbXBsYXRlQmFzZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgVmlld2FibGUgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBWaWV3YWJsZSgic2hvdyIsICJnZXQiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJpbmhlcml0IikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgVmlld2FibGUgZ2V0SW5oZXJpdGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBWaWV3YWJsZSgiaW5oZXJpdCIsICJnZXQiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJvdmVycmlkZSIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFZpZXdhYmxlIGdldE92ZXJyaWRlbigpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVmlld2FibGUoIm92ZXJyaWRlIiwgImdldCIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhwbGljaXRUZW1wbGF0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoImV4cGxpY2l0Iik7CisKKyAgICAgICAgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgcC5sb2FkKHRhcmdldC5yZXF1ZXN0KCkuZ2V0KElucHV0U3RyZWFtLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ZsYXRJbmhlcml0ZWRWaWV3UHJvY2Vzc29yVGVzdC5FeHBsaWNpdFRlbXBsYXRlQmFzZS5zaG93LnRlc3RwIiwKKyAgICAgICAgICAgICAgICBwLmdldFByb3BlcnR5KCJwYXRoIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoImdldCIsIHAuZ2V0UHJvcGVydHkoIm1vZGVsIikpOworCisgICAgICAgIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBwLmxvYWQodGFyZ2V0LnBhdGgoImluaGVyaXQiKS5yZXF1ZXN0KCkuZ2V0KElucHV0U3RyZWFtLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ZsYXRJbmhlcml0ZWRWaWV3UHJvY2Vzc29yVGVzdC5FeHBsaWNpdFRlbXBsYXRlQmFzZS5pbmhlcml0LnRlc3RwIiwKKyAgICAgICAgICAgICAgICBwLmdldFByb3BlcnR5KCJwYXRoIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoImdldCIsIHAuZ2V0UHJvcGVydHkoIm1vZGVsIikpOworCisgICAgICAgIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBwLmxvYWQodGFyZ2V0LnBhdGgoIm92ZXJyaWRlIikucmVxdWVzdCgpLmdldChJbnB1dFN0cmVhbS5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9GbGF0SW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QuRXhwbGljaXRUZW1wbGF0ZS5vdmVycmlkZS50ZXN0cCIsCisgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgicGF0aCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXQiLCBwLmdldFByb3BlcnR5KCJtb2RlbCIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxpY2l0VGVtcGxhdGVCYXNlIHsKKyAgICB9CisKKyAgICBAUGF0aCgiL2ltcGxpY2l0IikKKyAgICBAVGVtcGxhdGUKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxpY2l0VGVtcGxhdGUgZXh0ZW5kcyBJbXBsaWNpdFRlbXBsYXRlQmFzZSB7CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiSW1wbGljaXRUZW1wbGF0ZSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbXBsaWNpdFRlbXBsYXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiaW1wbGljaXQiKTsKKworICAgICAgICBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBwLmxvYWQodGFyZ2V0LnJlcXVlc3QoKS5nZXQoSW5wdXRTdHJlYW0uY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRmxhdEluaGVyaXRlZFZpZXdQcm9jZXNzb3JUZXN0LkltcGxpY2l0VGVtcGxhdGVCYXNlLmluZGV4LnRlc3RwIiwKKyAgICAgICAgICAgICAgICBwLmdldFByb3BlcnR5KCJwYXRoIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkltcGxpY2l0VGVtcGxhdGUiLCBwLmdldFByb3BlcnR5KCJtb2RlbCIpKTsKKworICAgICAgICBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgcC5sb2FkKHRhcmdldC5wYXRoKCJpbmhlcml0IikucmVxdWVzdCgpLmdldChJbnB1dFN0cmVhbS5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9GbGF0SW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QuSW1wbGljaXRUZW1wbGF0ZUJhc2UuaW5oZXJpdC50ZXN0cCIsCisgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgicGF0aCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbXBsaWNpdFRlbXBsYXRlIiwgcC5nZXRQcm9wZXJ0eSgibW9kZWwiKSk7CisKKyAgICAgICAgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIHAubG9hZCh0YXJnZXQucGF0aCgib3ZlcnJpZGUiKS5yZXF1ZXN0KCkuZ2V0KElucHV0U3RyZWFtLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ZsYXRJbmhlcml0ZWRWaWV3UHJvY2Vzc29yVGVzdC5JbXBsaWNpdFRlbXBsYXRlLm92ZXJyaWRlLnRlc3RwIiwKKyAgICAgICAgICAgICAgICBwLmdldFByb3BlcnR5KCJwYXRoIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkltcGxpY2l0VGVtcGxhdGUiLCBwLmdldFByb3BlcnR5KCJtb2RlbCIpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9GbGF0Vmlld1Byb2Nlc3NvclRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9GbGF0Vmlld1Byb2Nlc3NvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmExZjM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ZsYXRWaWV3UHJvY2Vzc29yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjA1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIubXZjOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5JbnZvY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLk12Y0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5UZW1wbGF0ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLlZpZXdhYmxlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIubXZjLnByb3ZpZGVyLlRlc3RWaWV3UHJvY2Vzc29yOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgRmxhdFZpZXdQcm9jZXNzb3JUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworCisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoRXhwbGljaXRUZW1wbGF0ZS5jbGFzcywgSW1wbGljaXRUZW1wbGF0ZS5jbGFzcywgSW1wbGljaXRFeHBsaWNpdFRlbXBsYXRlLmNsYXNzLAorICAgICAgICAgICAgICAgIEltcGxpY2l0V2l0aEdldFRlbXBsYXRlLmNsYXNzLCBJbXBsaWNpdFdpdGhTdWJSZXNvdXJjZUdldFRlbXBsYXRlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihNdmNGZWF0dXJlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihUZXN0Vmlld1Byb2Nlc3Nvci5jbGFzcyk7CisgICAgfQorCisgICAgQFBhdGgoIi9leHBsaWNpdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeHBsaWNpdFRlbXBsYXRlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBWaWV3YWJsZSBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFZpZXdhYmxlKCJzaG93IiwgImdldCIpOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFZpZXdhYmxlIHBvc3QoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFZpZXdhYmxlKCJzaG93IiwgInBvc3QiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEV4cGxpY2l0VGVtcGxhdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBJbnZvY2F0aW9uLkJ1aWxkZXIgcmVxdWVzdCA9IHRhcmdldCgiZXhwbGljaXQiKS5yZXF1ZXN0KCk7CisKKyAgICAgICAgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgcC5sb2FkKHJlcXVlc3QuZ2V0KElucHV0U3RyZWFtLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ZsYXRWaWV3UHJvY2Vzc29yVGVzdC5FeHBsaWNpdFRlbXBsYXRlLnNob3cudGVzdHAiLAorICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInBhdGgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZ2V0IiwgcC5nZXRQcm9wZXJ0eSgibW9kZWwiKSk7CisKKyAgICAgICAgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIHAubG9hZChyZXF1ZXN0LnBvc3QoRW50aXR5LmVudGl0eSgiIiwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSksIElucHV0U3RyZWFtLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ZsYXRWaWV3UHJvY2Vzc29yVGVzdC5FeHBsaWNpdFRlbXBsYXRlLnNob3cudGVzdHAiLAorICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInBhdGgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygicG9zdCIsIHAuZ2V0UHJvcGVydHkoIm1vZGVsIikpOworICAgIH0KKworICAgIEBQYXRoKCIvaW1wbGljaXQiKQorICAgIEBUZW1wbGF0ZQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGljaXRUZW1wbGF0ZSB7CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiSW1wbGljaXRUZW1wbGF0ZSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbXBsaWNpdFRlbXBsYXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSW52b2NhdGlvbi5CdWlsZGVyIHJlcXVlc3QgPSB0YXJnZXQoImltcGxpY2l0IikucmVxdWVzdCgpOworCisgICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIHAubG9hZChyZXF1ZXN0LmdldChJbnB1dFN0cmVhbS5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9GbGF0Vmlld1Byb2Nlc3NvclRlc3QuSW1wbGljaXRUZW1wbGF0ZS5pbmRleC50ZXN0cCIsCisgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgicGF0aCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbXBsaWNpdFRlbXBsYXRlIiwgcC5nZXRQcm9wZXJ0eSgibW9kZWwiKSk7CisgICAgfQorCisgICAgQFBhdGgoIi9pbXBsaWNpdC1leHBsaWNpdCIpCisgICAgQFRlbXBsYXRlCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsaWNpdEV4cGxpY2l0VGVtcGxhdGUgeworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIkltcGxpY2l0RXhwbGljaXRUZW1wbGF0ZSI7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgVmlld2FibGUgcG9zdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVmlld2FibGUoInNob3ciLCAicG9zdCIpOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInN1YiIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFZpZXdhYmxlIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVmlld2FibGUoInNob3ciLCAiZ2V0Iik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbXBsaWNpdEV4cGxpY2l0VGVtcGxhdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBJbnZvY2F0aW9uLkJ1aWxkZXIgcmVxdWVzdCA9IHRhcmdldCgiaW1wbGljaXQtZXhwbGljaXQiKS5yZXF1ZXN0KCk7CisKKyAgICAgICAgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgcC5sb2FkKHJlcXVlc3QuZ2V0KElucHV0U3RyZWFtLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ZsYXRWaWV3UHJvY2Vzc29yVGVzdC5JbXBsaWNpdEV4cGxpY2l0VGVtcGxhdGUuaW5kZXgudGVzdHAiLAorICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInBhdGgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiSW1wbGljaXRFeHBsaWNpdFRlbXBsYXRlIiwgcC5nZXRQcm9wZXJ0eSgibW9kZWwiKSk7CisKKyAgICAgICAgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIHAubG9hZChyZXF1ZXN0LnBvc3QoRW50aXR5LmVudGl0eSgiIiwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSksIElucHV0U3RyZWFtLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ZsYXRWaWV3UHJvY2Vzc29yVGVzdC5JbXBsaWNpdEV4cGxpY2l0VGVtcGxhdGUuc2hvdy50ZXN0cCIsCisgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgicGF0aCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwb3N0IiwgcC5nZXRQcm9wZXJ0eSgibW9kZWwiKSk7CisKKyAgICAgICAgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIHAubG9hZCh0YXJnZXQoImltcGxpY2l0LWV4cGxpY2l0IikucGF0aCgic3ViIikucmVxdWVzdCgpLmdldChJbnB1dFN0cmVhbS5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9GbGF0Vmlld1Byb2Nlc3NvclRlc3QuSW1wbGljaXRFeHBsaWNpdFRlbXBsYXRlLnNob3cudGVzdHAiLAorICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInBhdGgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZ2V0IiwgcC5nZXRQcm9wZXJ0eSgibW9kZWwiKSk7CisgICAgfQorCisgICAgQFBhdGgoIi9pbXBsaWNpdC1nZXQiKQorICAgIEBUZW1wbGF0ZQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGljaXRXaXRoR2V0VGVtcGxhdGUgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mb28iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJJbXBsaWNpdFdpdGhHZXRUZW1wbGF0ZSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbXBsaWNpdFdpdGhHZXRUZW1wbGF0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoImltcGxpY2l0LWdldCIpOworCisgICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIHAubG9hZCh0YXJnZXQucmVxdWVzdCgidGV4dC9wbGFpbiIpLmdldChJbnB1dFN0cmVhbS5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9GbGF0Vmlld1Byb2Nlc3NvclRlc3QuSW1wbGljaXRXaXRoR2V0VGVtcGxhdGUuaW5kZXgudGVzdHAiLAorICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInBhdGgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiSW1wbGljaXRXaXRoR2V0VGVtcGxhdGUiLCBwLmdldFByb3BlcnR5KCJtb2RlbCIpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIkltcGxpY2l0V2l0aEdldFRlbXBsYXRlIiwgdGFyZ2V0LnJlcXVlc3QoImFwcGxpY2F0aW9uL2ZvbyIpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiL2ltcGxpY2l0LWdldC1zdWJyZXNvdXJjZSIpCisgICAgQFRlbXBsYXRlCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsaWNpdFdpdGhTdWJSZXNvdXJjZUdldFRlbXBsYXRlIHsKKworICAgICAgICBAUGF0aCgic3ViIikKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2ZvbyIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIkltcGxpY2l0V2l0aFN1YlJlc291cmNlR2V0VGVtcGxhdGUiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wbGljaXRXaXRoU3ViUmVzb3VyY2VHZXRUZW1wbGF0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoImltcGxpY2l0LWdldC1zdWJyZXNvdXJjZSIpLnBhdGgoInN1YiIpOworCisgICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIHAubG9hZCh0YXJnZXQucmVxdWVzdCgidGV4dC9wbGFpbiIpLmdldChJbnB1dFN0cmVhbS5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9GbGF0Vmlld1Byb2Nlc3NvclRlc3QuSW1wbGljaXRXaXRoU3ViUmVzb3VyY2VHZXRUZW1wbGF0ZS5zdWIudGVzdHAiLAorICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInBhdGgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiSW1wbGljaXRXaXRoU3ViUmVzb3VyY2VHZXRUZW1wbGF0ZSIsIHAuZ2V0UHJvcGVydHkoIm1vZGVsIikpOworCisgICAgICAgIGFzc2VydEVxdWFscygiSW1wbGljaXRXaXRoU3ViUmVzb3VyY2VHZXRUZW1wbGF0ZSIsIHRhcmdldC5yZXF1ZXN0KCJhcHBsaWNhdGlvbi9mb28iKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRQcm9kdWNlc1ZpZXdQcm9jZXNzb3JUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRQcm9kdWNlc1ZpZXdQcm9jZXNzb3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ3MDVmMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFByb2R1Y2VzVmlld1Byb2Nlc3NvclRlc3QuamF2YQpAQCAtMCwwICsxLDIzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLm12YzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuTXZjRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLlRlbXBsYXRlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIubXZjLnByb3ZpZGVyLlRlc3RWaWV3UHJvY2Vzc29yOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgSW1wbGljaXRQcm9kdWNlc1ZpZXdQcm9jZXNzb3JUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworCisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoCisgICAgICAgICAgICAgICAgSW1wbGljaXRUZW1wbGF0ZS5jbGFzcywKKyAgICAgICAgICAgICAgICBJbXBsaWNpdFdpdGhHZXRUZW1wbGF0ZS5jbGFzcywKKyAgICAgICAgICAgICAgICBJbXBsaWNpdFdpdGhTdWJSZXNvdXJjZUdldFRlbXBsYXRlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihNdmNGZWF0dXJlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihUZXN0Vmlld1Byb2Nlc3Nvci5jbGFzcykucHJvcGVydHkoImplcnNleS5jb25maWcuc2VydmVyLnRyYWNpbmciLCAiQUxMIik7CisgICAgfQorCisgICAgQFBhdGgoIi9pbXBsaWNpdCIpCisgICAgQFRlbXBsYXRlCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluO3FzPS41IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxpY2l0VGVtcGxhdGUgeworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIkltcGxpY2l0VGVtcGxhdGUiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wbGljaXRUZW1wbGF0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoImltcGxpY2l0Iik7CisKKyAgICAgICAgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgUmVzcG9uc2UgY3IgPSB0YXJnZXQucmVxdWVzdCgidGV4dC9wbGFpbiIsICJhcHBsaWNhdGlvbi9mb28iKS5nZXQoUmVzcG9uc2UuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSwgY3IuZ2V0TWVkaWFUeXBlKCkpOworICAgICAgICBwLmxvYWQoY3IucmVhZEVudGl0eShJbnB1dFN0cmVhbS5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFByb2R1Y2VzVmlld1Byb2Nlc3NvclRlc3QvSW1wbGljaXRUZW1wbGF0ZS9pbmRleC50ZXN0cCIsCisgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgicGF0aCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbXBsaWNpdFRlbXBsYXRlIiwgcC5nZXRQcm9wZXJ0eSgibW9kZWwiKSk7CisKKyAgICAgICAgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIGNyID0gdGFyZ2V0LnJlcXVlc3QoImFwcGxpY2F0aW9uL2ZvbyIsICJ0ZXh0L3BsYWluIikuZ2V0KFJlc3BvbnNlLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUsIGNyLmdldE1lZGlhVHlwZSgpKTsKKyAgICAgICAgcC5sb2FkKGNyLnJlYWRFbnRpdHkoSW5wdXRTdHJlYW0uY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRQcm9kdWNlc1ZpZXdQcm9jZXNzb3JUZXN0L0ltcGxpY2l0VGVtcGxhdGUvaW5kZXgudGVzdHAiLAorICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInBhdGgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiSW1wbGljaXRUZW1wbGF0ZSIsIHAuZ2V0UHJvcGVydHkoIm1vZGVsIikpOworCisgICAgICAgIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBjciA9IHRhcmdldC5yZXF1ZXN0KCJ0ZXh0L3BsYWluO3E9MC41IiwgImFwcGxpY2F0aW9uL2ZvbyIpLmdldChSZXNwb25zZS5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFLCBjci5nZXRNZWRpYVR5cGUoKSk7CisgICAgICAgIHAubG9hZChjci5yZWFkRW50aXR5KElucHV0U3RyZWFtLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0UHJvZHVjZXNWaWV3UHJvY2Vzc29yVGVzdC9JbXBsaWNpdFRlbXBsYXRlL2luZGV4LnRlc3RwIiwKKyAgICAgICAgICAgICAgICBwLmdldFByb3BlcnR5KCJwYXRoIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkltcGxpY2l0VGVtcGxhdGUiLCBwLmdldFByb3BlcnR5KCJtb2RlbCIpKTsKKworICAgICAgICBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgY3IgPSB0YXJnZXQucmVxdWVzdCgiYXBwbGljYXRpb24vZm9vIiwgInRleHQvcGxhaW47cT0wLjUiKS5nZXQoUmVzcG9uc2UuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSwgY3IuZ2V0TWVkaWFUeXBlKCkpOworICAgICAgICBwLmxvYWQoY3IucmVhZEVudGl0eShJbnB1dFN0cmVhbS5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFByb2R1Y2VzVmlld1Byb2Nlc3NvclRlc3QvSW1wbGljaXRUZW1wbGF0ZS9pbmRleC50ZXN0cCIsCisgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgicGF0aCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbXBsaWNpdFRlbXBsYXRlIiwgcC5nZXRQcm9wZXJ0eSgibW9kZWwiKSk7CisgICAgfQorCisgICAgQFBhdGgoIi9pbXBsaWNpdC1nZXQiKQorICAgIEBUZW1wbGF0ZQorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbjtxcz0wLjUiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGljaXRXaXRoR2V0VGVtcGxhdGUgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mb287cXM9MC4yIikKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiSW1wbGljaXRXaXRoR2V0VGVtcGxhdGUiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wbGljaXRXaXRoR2V0VGVtcGxhdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJpbXBsaWNpdC1nZXQiKTsKKworICAgICAgICBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBSZXNwb25zZSBjciA9IHRhcmdldC5yZXF1ZXN0KCJ0ZXh0L3BsYWluIiwgImFwcGxpY2F0aW9uL2ZvbyIpLmdldChSZXNwb25zZS5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFLCBjci5nZXRNZWRpYVR5cGUoKSk7CisgICAgICAgIHAubG9hZChjci5yZWFkRW50aXR5KElucHV0U3RyZWFtLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0UHJvZHVjZXNWaWV3UHJvY2Vzc29yVGVzdC9JbXBsaWNpdFdpdGhHZXRUZW1wbGF0ZS9pbmRleCIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIi50ZXN0cCIsCisgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgicGF0aCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbXBsaWNpdFdpdGhHZXRUZW1wbGF0ZSIsIHAuZ2V0UHJvcGVydHkoIm1vZGVsIikpOworCisgICAgICAgIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBjciA9IHRhcmdldC5yZXF1ZXN0KCJhcHBsaWNhdGlvbi9mb28iLCAidGV4dC9wbGFpbiIpLmdldChSZXNwb25zZS5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFLCBjci5nZXRNZWRpYVR5cGUoKSk7CisgICAgICAgIHAubG9hZChjci5yZWFkRW50aXR5KElucHV0U3RyZWFtLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0UHJvZHVjZXNWaWV3UHJvY2Vzc29yVGVzdC9JbXBsaWNpdFdpdGhHZXRUZW1wbGF0ZS9pbmRleCIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIi50ZXN0cCIsCisgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgicGF0aCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbXBsaWNpdFdpdGhHZXRUZW1wbGF0ZSIsIHAuZ2V0UHJvcGVydHkoIm1vZGVsIikpOworCisgICAgICAgIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBjciA9IHRhcmdldC5yZXF1ZXN0KCJ0ZXh0L3BsYWluIiwgImFwcGxpY2F0aW9uL2ZvbztxPTAuNSIpLmdldChSZXNwb25zZS5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFLCBjci5nZXRNZWRpYVR5cGUoKSk7CisgICAgICAgIHAubG9hZChjci5yZWFkRW50aXR5KElucHV0U3RyZWFtLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0UHJvZHVjZXNWaWV3UHJvY2Vzc29yVGVzdC9JbXBsaWNpdFdpdGhHZXRUZW1wbGF0ZS9pbmRleCIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIi50ZXN0cCIsCisgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgicGF0aCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbXBsaWNpdFdpdGhHZXRUZW1wbGF0ZSIsIHAuZ2V0UHJvcGVydHkoIm1vZGVsIikpOworCisgICAgICAgIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBjciA9IHRhcmdldC5yZXF1ZXN0KCJhcHBsaWNhdGlvbi9mb287cT0wLjUiLCAidGV4dC9wbGFpbiIpLmdldChSZXNwb25zZS5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFLCBjci5nZXRNZWRpYVR5cGUoKSk7CisgICAgICAgIHAubG9hZChjci5yZWFkRW50aXR5KElucHV0U3RyZWFtLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0UHJvZHVjZXNWaWV3UHJvY2Vzc29yVGVzdC9JbXBsaWNpdFdpdGhHZXRUZW1wbGF0ZS9pbmRleCIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIi50ZXN0cCIsCisgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgicGF0aCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbXBsaWNpdFdpdGhHZXRUZW1wbGF0ZSIsIHAuZ2V0UHJvcGVydHkoIm1vZGVsIikpOworCisgICAgICAgIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBjciA9IHRhcmdldC5yZXF1ZXN0KCIqLyoiKS5nZXQoUmVzcG9uc2UuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSwgY3IuZ2V0TWVkaWFUeXBlKCkpOworICAgICAgICBwLmxvYWQoY3IucmVhZEVudGl0eShJbnB1dFN0cmVhbS5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFByb2R1Y2VzVmlld1Byb2Nlc3NvclRlc3QvSW1wbGljaXRXaXRoR2V0VGVtcGxhdGUvaW5kZXgiCisgICAgICAgICAgICAgICAgICAgICAgICArICIudGVzdHAiLAorICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInBhdGgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiSW1wbGljaXRXaXRoR2V0VGVtcGxhdGUiLCBwLmdldFByb3BlcnR5KCJtb2RlbCIpKTsKKworICAgICAgICBjciA9IHRhcmdldC5yZXF1ZXN0KCJ0ZXh0L3BsYWluO3E9MC41IiwgImFwcGxpY2F0aW9uL2ZvbyIpLmdldChSZXNwb25zZS5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgTWVkaWFUeXBlKCJhcHBsaWNhdGlvbiIsICJmb28iKSwgY3IuZ2V0TWVkaWFUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkltcGxpY2l0V2l0aEdldFRlbXBsYXRlIiwgY3IucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiL2ltcGxpY2l0LWdldC1zdWJyZXNvdXJjZSIpCisgICAgQFRlbXBsYXRlCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluO3FzPTAuNSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsaWNpdFdpdGhTdWJSZXNvdXJjZUdldFRlbXBsYXRlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJzdWIiKQorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2Zvbztxcz0wLjIiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJJbXBsaWNpdFdpdGhTdWJSZXNvdXJjZUdldFRlbXBsYXRlIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEltcGxpY2l0V2l0aFN1YlJlc291cmNlR2V0VGVtcGxhdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJpbXBsaWNpdC1nZXQtc3VicmVzb3VyY2UiKS5wYXRoKCJzdWIiKTsKKworICAgICAgICBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBSZXNwb25zZSBjciA9IHRhcmdldC5yZXF1ZXN0KCJ0ZXh0L3BsYWluIiwgImFwcGxpY2F0aW9uL2ZvbyIpLmdldChSZXNwb25zZS5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFLCBjci5nZXRNZWRpYVR5cGUoKSk7CisgICAgICAgIHAubG9hZChjci5yZWFkRW50aXR5KElucHV0U3RyZWFtLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0UHJvZHVjZXNWaWV3UHJvY2Vzc29yVGVzdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIi9JbXBsaWNpdFdpdGhTdWJSZXNvdXJjZUdldFRlbXBsYXRlL3N1Yi50ZXN0cCIsCisgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgicGF0aCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbXBsaWNpdFdpdGhTdWJSZXNvdXJjZUdldFRlbXBsYXRlIiwgcC5nZXRQcm9wZXJ0eSgibW9kZWwiKSk7CisKKyAgICAgICAgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIGNyID0gdGFyZ2V0LnJlcXVlc3QoImFwcGxpY2F0aW9uL2ZvbyIsICJ0ZXh0L3BsYWluIikuZ2V0KFJlc3BvbnNlLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUsIGNyLmdldE1lZGlhVHlwZSgpKTsKKyAgICAgICAgcC5sb2FkKGNyLnJlYWRFbnRpdHkoSW5wdXRTdHJlYW0uY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRQcm9kdWNlc1ZpZXdQcm9jZXNzb3JUZXN0IgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiL0ltcGxpY2l0V2l0aFN1YlJlc291cmNlR2V0VGVtcGxhdGUvc3ViLnRlc3RwIiwKKyAgICAgICAgICAgICAgICBwLmdldFByb3BlcnR5KCJwYXRoIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkltcGxpY2l0V2l0aFN1YlJlc291cmNlR2V0VGVtcGxhdGUiLCBwLmdldFByb3BlcnR5KCJtb2RlbCIpKTsKKworICAgICAgICBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgY3IgPSB0YXJnZXQucmVxdWVzdCgidGV4dC9wbGFpbiIsICJhcHBsaWNhdGlvbi9mb287cT0wLjUiKS5nZXQoUmVzcG9uc2UuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSwgY3IuZ2V0TWVkaWFUeXBlKCkpOworICAgICAgICBwLmxvYWQoY3IucmVhZEVudGl0eShJbnB1dFN0cmVhbS5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoCisgICAgICAgICAgICAgICAgIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFByb2R1Y2VzVmlld1Byb2Nlc3NvclRlc3QiCisgICAgICAgICAgICAgICAgICAgICAgICArICIvSW1wbGljaXRXaXRoU3ViUmVzb3VyY2VHZXRUZW1wbGF0ZS9zdWIudGVzdHAiLAorICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInBhdGgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiSW1wbGljaXRXaXRoU3ViUmVzb3VyY2VHZXRUZW1wbGF0ZSIsIHAuZ2V0UHJvcGVydHkoIm1vZGVsIikpOworCisgICAgICAgIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBjciA9IHRhcmdldC5yZXF1ZXN0KCJhcHBsaWNhdGlvbi9mb287cT0wLjUiLCAidGV4dC9wbGFpbiIpLmdldChSZXNwb25zZS5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFLCBjci5nZXRNZWRpYVR5cGUoKSk7CisgICAgICAgIHAubG9hZChjci5yZWFkRW50aXR5KElucHV0U3RyZWFtLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0UHJvZHVjZXNWaWV3UHJvY2Vzc29yVGVzdCIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIi9JbXBsaWNpdFdpdGhTdWJSZXNvdXJjZUdldFRlbXBsYXRlL3N1Yi50ZXN0cCIsCisgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgicGF0aCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbXBsaWNpdFdpdGhTdWJSZXNvdXJjZUdldFRlbXBsYXRlIiwgcC5nZXRQcm9wZXJ0eSgibW9kZWwiKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbXBsaWNpdFdpdGhTdWJSZXNvdXJjZUdldFRlbXBsYXRlIiwgdGFyZ2V0LnJlcXVlc3QoImFwcGxpY2F0aW9uL2ZvbyIpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFRlbXBsYXRlUHJvZ3JhbW1hdGljVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0VGVtcGxhdGVQcm9ncmFtbWF0aWNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRlMzQ4NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFRlbXBsYXRlUHJvZ3JhbW1hdGljVGVzdC5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5tdmM7CisKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworaW1wb3J0IGphdmF4LndzLnJzLkh0dHBNZXRob2Q7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5NdmNGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuVGVtcGxhdGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIubXZjLnByb3ZpZGVyLlRlc3RWaWV3UHJvY2Vzc29yOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgSW1wbGljaXRUZW1wbGF0ZVByb2dyYW1tYXRpY1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBUZW1wbGF0ZQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSGFuZGxlciB7CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgY29uc3RydWN0b3IgPSAibm8tYXJnIjsKKworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygiVW51c2VkRGVjbGFyYXRpb24iKQorICAgICAgICBwdWJsaWMgSGFuZGxlcigpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBIYW5kbGVyKGZpbmFsIFN0cmluZyBjb25zdHJ1Y3RvcikgeworICAgICAgICAgICAgdGhpcy5jb25zdHJ1Y3RvciA9IGNvbnN0cnVjdG9yOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIlJlc291cmNlXyIgKyBjb25zdHJ1Y3RvcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIE1ldGhvZCB0b1N0cmluZ01ldGhvZCA9IG51bGw7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHRvU3RyaW5nTWV0aG9kID0gSGFuZGxlci5jbGFzcy5nZXRNZXRob2QoInRvU3RyaW5nIik7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBFYXQgdGhhdC4KKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFJlc291cmNlLkJ1aWxkZXIgcmVzb3VyY2VCdWlsZGVyID0gUmVzb3VyY2UuYnVpbGRlcigiaW1wbGljaXQiKTsKKworICAgICAgICByZXNvdXJjZUJ1aWxkZXIuYWRkTWV0aG9kKEh0dHBNZXRob2QuUE9TVCkuY29uc3VtZXMoImFwcGxpY2F0aW9uL2ZvbyIpLmhhbmRsZWRCeShIYW5kbGVyLmNsYXNzLCB0b1N0cmluZ01ldGhvZCk7CisgICAgICAgIHJlc291cmNlQnVpbGRlci5hZGRNZXRob2QoSHR0cE1ldGhvZC5QT1NUKS5jb25zdW1lcygiYXBwbGljYXRpb24vYmFyIikuaGFuZGxlZEJ5KG5ldyBIYW5kbGVyKCJhcmciKSwgdG9TdHJpbmdNZXRob2QpOworCisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlclJlc291cmNlcyhyZXNvdXJjZUJ1aWxkZXIuYnVpbGQoKSkKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoTXZjRmVhdHVyZS5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoVGVzdFZpZXdQcm9jZXNzb3IuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEltcGxpY2l0SGFuZGxlckNsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIHAubG9hZCh0YXJnZXQoImltcGxpY2l0IikucmVxdWVzdCgpLmdldChJbnB1dFN0cmVhbS5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFRlbXBsYXRlUHJvZ3JhbW1hdGljVGVzdC9IYW5kbGVyL2luZGV4LnRlc3RwIiwKKyAgICAgICAgICAgICAgICBwLmdldFByb3BlcnR5KCJwYXRoIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlJlc291cmNlX25vLWFyZyIsIHAuZ2V0UHJvcGVydHkoIm1vZGVsIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFRlbXBsYXRlVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0VGVtcGxhdGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZiMGJhOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFRlbXBsYXRlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjM3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIubXZjOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5NdmNGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuVGVtcGxhdGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5tdmMucHJvdmlkZXIuVGVzdFZpZXdQcm9jZXNzb3I7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBJbXBsaWNpdFRlbXBsYXRlVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKTsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKAorICAgICAgICAgICAgICAgIEltcGxpY2l0UmVzb3VyY2UuY2xhc3MsIEFub3RoZXJJbXBsaWNpdFJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIEltcGxpY2l0U2luZ2xldG9uUmVzb3VyY2UuY2xhc3MsIEltcGxpY2l0Um9vdFJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIEltcGxpY2l0R2V0UmVzb3VyY2UuY2xhc3MsIEFub3RoZXJJbXBsaWNpdEdldFJlc291cmNlLmNsYXNzLCBBbm90aGVyQW5vdGhlckltcGxpY2l0R2V0UmVzb3VyY2UuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKE12Y0ZlYXR1cmUuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKFRlc3RWaWV3UHJvY2Vzc29yLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVtcGxhdGUKKyAgICBAUGF0aCgiL2ltcGxpY2l0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxpY2l0UmVzb3VyY2UgeworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIkltcGxpY2l0VGVtcGxhdGUiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi9pbXBsaWNpdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBbm90aGVySW1wbGljaXRSZXNvdXJjZSB7CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiSW1wbGljaXRBbm90aGVyVGVtcGxhdGUiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wbGljaXRUZW1wbGF0ZVJlc291cmNlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBwYXRoIDogbmV3IFN0cmluZ1tdIHsiIiwgImluZGV4IiwgImdldCJ9KSB7CisgICAgICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJpbXBsaWNpdCIpOworICAgICAgICAgICAgU3RyaW5nIHRlbXBsYXRlTmFtZSA9ICJpbmRleCI7CisKKyAgICAgICAgICAgIGlmICghIiIuZXF1YWxzKHBhdGgpKSB7CisgICAgICAgICAgICAgICAgdGVtcGxhdGVOYW1lID0gcGF0aDsKKyAgICAgICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQucGF0aChwYXRoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgIHAubG9hZCh0YXJnZXQucmVxdWVzdCgpLmdldChJbnB1dFN0cmVhbS5jbGFzcykpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0VGVtcGxhdGVUZXN0L0ltcGxpY2l0UmVzb3VyY2UvIiArIHRlbXBsYXRlTmFtZSArICIudGVzdHAiLAorICAgICAgICAgICAgICAgICAgICBwLmdldFByb3BlcnR5KCJwYXRoIikpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbXBsaWNpdFRlbXBsYXRlIiwgcC5nZXRQcm9wZXJ0eSgibW9kZWwiKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbXBsaWNpdFRlbXBsYXRlUmVzb3VyY2VzTmVnYXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwNCwgdGFyZ2V0KCJpbXBsaWNpdCIpLnBhdGgoImRvLW5vdC1leGlzdCIpLnJlcXVlc3QoKS5nZXQoKS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFBhdGgoIi9pbXBsaWNpdC1nZXQiKQorICAgIEBQcm9kdWNlcygidGV4dC9odG1sIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxpY2l0R2V0UmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gdG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIkltcGxpY2l0R2V0VGVtcGxhdGUiOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi9pbXBsaWNpdC1nZXQiKQorICAgIEBUZW1wbGF0ZQorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBbm90aGVySW1wbGljaXRHZXRSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgic3ViIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gdG9TdHJpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIkFub3RoZXJJbXBsaWNpdEdldFRlbXBsYXRlIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvaW1wbGljaXQtZ2V0L2Fub3RoZXIiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQW5vdGhlckFub3RoZXJJbXBsaWNpdEdldFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIHRvU3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJBbm90aGVyQW5vdGhlckltcGxpY2l0R2V0VGVtcGxhdGUiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wbGljaXRHZXRUZW1wbGF0ZVJlc291cmNlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBwYXRoIDogbmV3IFN0cmluZ1tdIHsiIiwgImluZGV4IiwgImdldCJ9KSB7CisgICAgICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJpbXBsaWNpdC1nZXQiKTsKKyAgICAgICAgICAgIFN0cmluZyB0ZW1wbGF0ZU5hbWUgPSAiaW5kZXgiOworCisgICAgICAgICAgICBpZiAoISIiLmVxdWFscyhwYXRoKSkgeworICAgICAgICAgICAgICAgIHRlbXBsYXRlTmFtZSA9IHBhdGg7CisgICAgICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0LnBhdGgocGF0aCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICBwLmxvYWQodGFyZ2V0LnJlcXVlc3QoInRleHQvcGxhaW4iKS5nZXQoSW5wdXRTdHJlYW0uY2xhc3MpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFRlbXBsYXRlVGVzdC9Bbm90aGVySW1wbGljaXRHZXRSZXNvdXJjZS8iICsgdGVtcGxhdGVOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLnRlc3RwIiwKKyAgICAgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgicGF0aCIpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiQW5vdGhlckltcGxpY2l0R2V0VGVtcGxhdGUiLCBwLmdldFByb3BlcnR5KCJtb2RlbCIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZW1wbGF0ZQorICAgIEBTaW5nbGV0b24KKyAgICBAUGF0aCgiL2ltcGxpY2l0LXNpbmdsZXRvbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsaWNpdFNpbmdsZXRvblJlc291cmNlIHsKKworICAgICAgICBwcml2YXRlIGludCBjb3VudGVyID0gMDsKKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJJbXBsaWNpdFNpbmdsZXRvblRlbXBsYXRlIiArIGNvdW50ZXIrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEltcGxpY2l0VGVtcGxhdGVTaW5nbGV0b25SZXNvdXJjZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJpbXBsaWNpdC1zaW5nbGV0b24iKTsKKworICAgICAgICAgICAgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgICAgIHAubG9hZCh0YXJnZXQucmVxdWVzdCgpLmdldChJbnB1dFN0cmVhbS5jbGFzcykpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRUZW1wbGF0ZVRlc3QvSW1wbGljaXRTaW5nbGV0b25SZXNvdXJjZS9pbmRleC50ZXN0cCIsCisgICAgICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInBhdGgiKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkltcGxpY2l0U2luZ2xldG9uVGVtcGxhdGUiICsgaSwgcC5nZXRQcm9wZXJ0eSgibW9kZWwiKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL2ltcGxpY2l0LXN1Yi1yZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsaWNpdFJvb3RSZXNvdXJjZSB7CisKKyAgICAgICAgQFBhdGgoInN1YiIpCisgICAgICAgIHB1YmxpYyBJbXBsaWNpdFN1YlJlc291cmNlIGdldFN1YlJlc291cmNlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBJbXBsaWNpdFN1YlJlc291cmNlKCJJbXBsaWNpdFJvb3RSZXNvdXJjZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsaWNpdFN1YlJlc291cmNlIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBzdHJpbmc7CisKKyAgICAgICAgcHVibGljIEltcGxpY2l0U3ViUmVzb3VyY2UoZmluYWwgU3RyaW5nIHN0cmluZykgeworICAgICAgICAgICAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgic3ViIikKKyAgICAgICAgcHVibGljIEltcGxpY2l0U3ViU3ViUmVzb3VyY2UgZ2V0U3ViUmVzb3VyY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEltcGxpY2l0U3ViU3ViUmVzb3VyY2Uoc3RyaW5nICsgIkltcGxpY2l0U3ViUmVzb3VyY2UiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZW1wbGF0ZQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGljaXRTdWJTdWJSZXNvdXJjZSB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgc3RyaW5nOworCisgICAgICAgIHB1YmxpYyBJbXBsaWNpdFN1YlN1YlJlc291cmNlKGZpbmFsIFN0cmluZyBzdHJpbmcpIHsKKyAgICAgICAgICAgIHRoaXMuc3RyaW5nID0gc3RyaW5nOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gc3RyaW5nICsgIkltcGxpY2l0U3ViU3ViUmVzb3VyY2UiOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wbGljaXRUZW1wbGF0ZVN1YlJlc291cmNlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJpbXBsaWNpdC1zdWItcmVzb3VyY2UiKS5wYXRoKCJzdWIiKS5wYXRoKCJzdWIiKTsKKworICAgICAgICBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBwLmxvYWQodGFyZ2V0LnJlcXVlc3QoKS5nZXQoSW5wdXRTdHJlYW0uY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRUZW1wbGF0ZVRlc3QvSW1wbGljaXRTdWJTdWJSZXNvdXJjZS9pbmRleC50ZXN0cCIsCisgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgicGF0aCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbXBsaWNpdFJvb3RSZXNvdXJjZUltcGxpY2l0U3ViUmVzb3VyY2VJbXBsaWNpdFN1YlN1YlJlc291cmNlIiwgcC5nZXRQcm9wZXJ0eSgibW9kZWwiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0Vmlld1dpdGhSZXNvdXJjZUZpbHRlclRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFZpZXdXaXRoUmVzb3VyY2VGaWx0ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ4MTU3NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFZpZXdXaXRoUmVzb3VyY2VGaWx0ZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5tdmM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5JbnZvY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuTXZjRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLlRlbXBsYXRlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIubXZjLnByb3ZpZGVyLlRlc3RWaWV3UHJvY2Vzc29yOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CisKKy8qKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBJbXBsaWNpdFZpZXdXaXRoUmVzb3VyY2VGaWx0ZXJUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworCisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoSW1wbGljaXRUZW1wbGF0ZS5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoTXZjRmVhdHVyZS5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoRmlsdGVyT25lLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihGaWx0ZXJUd28uY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKFRlc3RWaWV3UHJvY2Vzc29yLmNsYXNzKTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgQFRlbXBsYXRlCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsaWNpdFRlbXBsYXRlIHsKKworICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJJbXBsaWNpdFRlbXBsYXRlIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcmlvcml0eSgxMCkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZpbHRlck9uZSBpbXBsZW1lbnRzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIsIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKGZpbmFsIENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHhUZXN0ID0gcmVxdWVzdENvbnRleHQuZ2V0SGVhZGVycygpLmdldCgiWC1URVNUIik7CisgICAgICAgICAgICBhc3NlcnROdWxsKHhUZXN0KTsKKworICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuZ2V0SGVhZGVycygpLmFkZCgiWC1URVNUIiwgIm9uZSIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihmaW5hbCBDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCwgZmluYWwgQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCkgdGhyb3dzCisgICAgICAgICAgICAgICAgSU9FeGNlcHRpb24geworICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHJ4VGVzdCA9IHJlcXVlc3RDb250ZXh0LmdldEhlYWRlcnMoKS5nZXQoIlgtVEVTVCIpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHJ4VGVzdC5zaXplKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJvbmUiLCByeFRlc3QuZ2V0KDApKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygidHdvIiwgcnhUZXN0LmdldCgxKSk7CisKKyAgICAgICAgICAgIExpc3Q8T2JqZWN0PiB4VGVzdCA9IHJlc3BvbnNlQ29udGV4dC5nZXRIZWFkZXJzKCkuZ2V0KCJYLVRFU1QiKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCB4VGVzdC5zaXplKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0d28iLCB4VGVzdC5nZXQoMCkpOworCisgICAgICAgICAgICBhc3NlcnROdWxsKHJlc3BvbnNlQ29udGV4dC5nZXRIZWFkZXJzKCkuZ2V0KCJZLVRFU1QiKSk7CisgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuZ2V0SGVhZGVycygpLmFkZCgiWS1URVNUIiwgIm9uZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFByaW9yaXR5KDIwKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmlsdGVyVHdvIGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciwgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoZmluYWwgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBMaXN0PFN0cmluZz4geFRlc3QgPSByZXF1ZXN0Q29udGV4dC5nZXRIZWFkZXJzKCkuZ2V0KCJYLVRFU1QiKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCB4VGVzdC5zaXplKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJvbmUiLCB4VGVzdC5nZXQoMCkpOworCisgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5nZXRIZWFkZXJzKCkuYWRkKCJYLVRFU1QiLCAidHdvIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKGZpbmFsIENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LCBmaW5hbCBDb250YWluZXJSZXNwb25zZUNvbnRleHQgcmVzcG9uc2VDb250ZXh0KSB0aHJvd3MKKyAgICAgICAgICAgICAgICBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBMaXN0PFN0cmluZz4gcnhUZXN0ID0gcmVxdWVzdENvbnRleHQuZ2V0SGVhZGVycygpLmdldCgiWC1URVNUIik7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMiwgcnhUZXN0LnNpemUoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIm9uZSIsIHJ4VGVzdC5nZXQoMCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0d28iLCByeFRlc3QuZ2V0KDEpKTsKKworICAgICAgICAgICAgYXNzZXJ0TnVsbChyZXNwb25zZUNvbnRleHQuZ2V0SGVhZGVycygpLmdldCgiWC1URVNUIikpOworICAgICAgICAgICAgYXNzZXJ0TnVsbChyZXNwb25zZUNvbnRleHQuZ2V0SGVhZGVycygpLmdldCgiWS1URVNUIikpOworCisgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuZ2V0SGVhZGVycygpLmFkZCgiWC1URVNUIiwgInR3byIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW1wbGljaXRUZW1wbGF0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEludm9jYXRpb24uQnVpbGRlciByZXF1ZXN0ID0gdGFyZ2V0KCIvIikucmVxdWVzdCgpOworCisgICAgICAgIFJlc3BvbnNlIGNyID0gcmVxdWVzdC5nZXQoUmVzcG9uc2UuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCBjci5nZXRTdGF0dXMoKSk7CisgICAgICAgIExpc3Q8T2JqZWN0PiB4VGVzdCA9IGNyLmdldE1ldGFkYXRhKCkuZ2V0KCJYLVRFU1QiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIHhUZXN0LnNpemUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidHdvIiwgeFRlc3QuZ2V0KDApKTsKKworICAgICAgICBMaXN0PE9iamVjdD4geVRlc3QgPSBjci5nZXRNZXRhZGF0YSgpLmdldCgiWS1URVNUIik7CisgICAgICAgIGFzc2VydEVxdWFscygxLCB5VGVzdC5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm9uZSIsIHlUZXN0LmdldCgwKSk7CisKKyAgICAgICAgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgcC5sb2FkKGNyLnJlYWRFbnRpdHkoSW5wdXRTdHJlYW0uY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRWaWV3V2l0aFJlc291cmNlRmlsdGVyVGVzdC9JbXBsaWNpdFRlbXBsYXRlL2luZGV4LnRlc3RwIiwKKyAgICAgICAgICAgICAgICBwLmdldFByb3BlcnR5KCJwYXRoIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkltcGxpY2l0VGVtcGxhdGUiLCBwLmdldFByb3BlcnR5KCJtb2RlbCIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9Jbmhlcml0ZWRWaWV3UHJvY2Vzc29yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZDg0N2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QuamF2YQpAQCAtMCwwICsxLDEzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLm12YzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLk12Y0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5UZW1wbGF0ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLlZpZXdhYmxlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIubXZjLnByb3ZpZGVyLlRlc3RWaWV3UHJvY2Vzc29yOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgSW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5EVU1QX0VOVElUWSk7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZygKKyAgICAgICAgICAgICAgICBFeHBsaWNpdFRlbXBsYXRlLmNsYXNzLAorICAgICAgICAgICAgICAgIEltcGxpY2l0VGVtcGxhdGUuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKE12Y0ZlYXR1cmUuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKFRlc3RWaWV3UHJvY2Vzc29yLmNsYXNzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEV4cGxpY2l0VGVtcGxhdGVCYXNlIHsKKyAgICB9CisKKyAgICBAUGF0aCgiL2V4cGxpY2l0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEV4cGxpY2l0VGVtcGxhdGUgZXh0ZW5kcyBFeHBsaWNpdFRlbXBsYXRlQmFzZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgVmlld2FibGUgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBWaWV3YWJsZSgic2hvdyIsICJnZXQiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJpbmhlcml0IikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgVmlld2FibGUgZ2V0SW5oZXJpdGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBWaWV3YWJsZSgiaW5oZXJpdCIsICJnZXQiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJvdmVycmlkZSIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFZpZXdhYmxlIGdldE92ZXJyaWRlbigpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVmlld2FibGUoIm92ZXJyaWRlIiwgImdldCIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhwbGljaXRUZW1wbGF0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoImV4cGxpY2l0Iik7CisKKyAgICAgICAgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgcC5sb2FkKHRhcmdldC5yZXF1ZXN0KCkuZ2V0KElucHV0U3RyZWFtLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0luaGVyaXRlZFZpZXdQcm9jZXNzb3JUZXN0L0V4cGxpY2l0VGVtcGxhdGVCYXNlL3Nob3cudGVzdHAiLAorICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInBhdGgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZ2V0IiwgcC5nZXRQcm9wZXJ0eSgibW9kZWwiKSk7CisKKyAgICAgICAgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIHAubG9hZCh0YXJnZXQucGF0aCgiaW5oZXJpdCIpLnJlcXVlc3QoKS5nZXQoSW5wdXRTdHJlYW0uY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QvRXhwbGljaXRUZW1wbGF0ZUJhc2UvaW5oZXJpdC50ZXN0cCIsCisgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgicGF0aCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXQiLCBwLmdldFByb3BlcnR5KCJtb2RlbCIpKTsKKworICAgICAgICBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgcC5sb2FkKHRhcmdldC5wYXRoKCJvdmVycmlkZSIpLnJlcXVlc3QoKS5nZXQoSW5wdXRTdHJlYW0uY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QvRXhwbGljaXRUZW1wbGF0ZS9vdmVycmlkZS50ZXN0cCIsCisgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgicGF0aCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXQiLCBwLmdldFByb3BlcnR5KCJtb2RlbCIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxpY2l0VGVtcGxhdGVCYXNlIHsKKyAgICB9CisKKyAgICBAUGF0aCgiL2ltcGxpY2l0IikKKyAgICBAVGVtcGxhdGUKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxpY2l0VGVtcGxhdGUgZXh0ZW5kcyBJbXBsaWNpdFRlbXBsYXRlQmFzZSB7CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiSW1wbGljaXRUZW1wbGF0ZSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbXBsaWNpdFRlbXBsYXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiaW1wbGljaXQiKTsKKworICAgICAgICBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBwLmxvYWQodGFyZ2V0LnJlcXVlc3QoKS5nZXQoSW5wdXRTdHJlYW0uY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QvSW1wbGljaXRUZW1wbGF0ZUJhc2UvaW5kZXgudGVzdHAiLAorICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInBhdGgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiSW1wbGljaXRUZW1wbGF0ZSIsIHAuZ2V0UHJvcGVydHkoIm1vZGVsIikpOworCisgICAgICAgIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBwLmxvYWQodGFyZ2V0LnBhdGgoImluaGVyaXQiKS5yZXF1ZXN0KCkuZ2V0KElucHV0U3RyZWFtLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0luaGVyaXRlZFZpZXdQcm9jZXNzb3JUZXN0L0ltcGxpY2l0VGVtcGxhdGVCYXNlL2luaGVyaXQudGVzdHAiLAorICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInBhdGgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiSW1wbGljaXRUZW1wbGF0ZSIsIHAuZ2V0UHJvcGVydHkoIm1vZGVsIikpOworCisgICAgICAgIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBwLmxvYWQodGFyZ2V0LnBhdGgoIm92ZXJyaWRlIikucmVxdWVzdCgpLmdldChJbnB1dFN0cmVhbS5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9Jbmhlcml0ZWRWaWV3UHJvY2Vzc29yVGVzdC9JbXBsaWNpdFRlbXBsYXRlL292ZXJyaWRlLnRlc3RwIiwKKyAgICAgICAgICAgICAgICBwLmdldFByb3BlcnR5KCJwYXRoIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkltcGxpY2l0VGVtcGxhdGUiLCBwLmdldFByb3BlcnR5KCJtb2RlbCIpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9NdmNFbmNvZGluZ1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9NdmNFbmNvZGluZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGFkMTIxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL012Y0VuY29kaW5nVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIubXZjOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5NdmNGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuVmlld2FibGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5mcmVlbWFya2VyLkZyZWVtYXJrZXJNdmNGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMubXVzdGFjaGUuTXVzdGFjaGVNdmNGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmdyaXp6bHkuR3JpenpseVRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworCisvKioKKyAqIE1WQyBlbmNvZGluZyBjaGFyc2V0IHRlc3RzLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBNdmNFbmNvZGluZ1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIE1FU1NBR0UgPSAiXFx1MDE2MVxcdTAxMGRcXHUwMTU5XFx1MDE3ZVxcdTAwZmRcXHUwMGUxXFx1MDBlZFxcdTAwZTkiOworCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycworICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxPYmplY3RbXT4gZGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW117CisgICAgICAgICAgICAgICAge25ldyBGcmVlbWFya2VyTXZjRmVhdHVyZSgpLCAiZnJlZW1hcmtlciIsICJGcmVlbWFya2VyUmVzb3VyY2UuZnRsIiwgIlVURi04In0sCisgICAgICAgICAgICAgICAge25ldyBGcmVlbWFya2VyTXZjRmVhdHVyZSgpLCAiZnJlZW1hcmtlciIsICJGcmVlbWFya2VyUmVzb3VyY2UuZnRsIiwgIlVURi0xNiJ9LAorICAgICAgICAgICAgICAgIHtuZXcgRnJlZW1hcmtlck12Y0ZlYXR1cmUoKSwgImZyZWVtYXJrZXIiLCAiRnJlZW1hcmtlclJlc291cmNlLmZ0bCIsICJ3aW5kb3dzLTEyNTAifSwKKyAgICAgICAgICAgICAgICB7bmV3IEZyZWVtYXJrZXJNdmNGZWF0dXJlKCksICJmcmVlbWFya2VyIiwgIkZyZWVtYXJrZXJSZXNvdXJjZS5mdGwiLCAiSVNPLTg4NTktMiJ9LAorICAgICAgICAgICAgICAgIHtuZXcgTXVzdGFjaGVNdmNGZWF0dXJlKCksICJtdXN0YWNoZSIsICJNdXN0YWNoZVJlc291cmNlLm11c3RhY2hlIiwgIlVURi04In0sCisgICAgICAgICAgICAgICAge25ldyBNdXN0YWNoZU12Y0ZlYXR1cmUoKSwgIm11c3RhY2hlIiwgIk11c3RhY2hlUmVzb3VyY2UubXVzdGFjaGUiLCAiVVRGLTE2In0sCisgICAgICAgICAgICAgICAge25ldyBNdXN0YWNoZU12Y0ZlYXR1cmUoKSwgIm11c3RhY2hlIiwgIk11c3RhY2hlUmVzb3VyY2UubXVzdGFjaGUiLCAid2luZG93cy0xMjUwIn0sCisgICAgICAgICAgICAgICAge25ldyBNdXN0YWNoZU12Y0ZlYXR1cmUoKSwgIm11c3RhY2hlIiwgIk11c3RhY2hlUmVzb3VyY2UubXVzdGFjaGUiLCAiSVNPLTg4NTktMiJ9LAorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdGVtcGxhdGVOYW1lOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGRlZmF1bHRFbmNvZGluZzsKKworICAgIHB1YmxpYyBNdmNFbmNvZGluZ1Rlc3QoRmVhdHVyZSBmZWF0dXJlLCBTdHJpbmcgcHJvcGVydHlTdWZmaXgsIFN0cmluZyB0ZW1wbGF0ZU5hbWUsIFN0cmluZyBkZWZhdWx0RW5jb2RpbmcpIHsKKyAgICAgICAgc3VwZXIobmV3IFJlc291cmNlQ29uZmlnKCkKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoZmVhdHVyZSkKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoRnJlZW1hcmtlclJlc291cmNlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShNdmNGZWF0dXJlLkVOQ09ESU5HICsgIi4iICsgcHJvcGVydHlTdWZmaXgsIGRlZmF1bHRFbmNvZGluZykpOworICAgICAgICBNdmNFbmNvZGluZ1Rlc3QudGVtcGxhdGVOYW1lID0gdGVtcGxhdGVOYW1lOworICAgICAgICB0aGlzLmRlZmF1bHRFbmNvZGluZyA9IGRlZmF1bHRFbmNvZGluZzsKKyAgICB9CisKKworICAgIEBQYXRoKCJyZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGcmVlbWFya2VyUmVzb3VyY2UgeworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBWaWV3YWJsZSBnZXQoKSB7CisgICAgICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgICAgICAgICAgbWFwLnB1dCgidXNlciIsIE1FU1NBR0UpOworCisgICAgICAgICAgICByZXR1cm4gbmV3IFZpZXdhYmxlKCIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvTXZjRW5jb2RpbmdUZXN0LyIgKyB0ZW1wbGF0ZU5hbWUsIG1hcCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJ0ZXh0cGxhaW4iKQorICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgICAgICBwdWJsaWMgVmlld2FibGUgZ2V0VGV4dFBsYWluKCkgeworICAgICAgICAgICAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBtYXAgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4oKTsKKyAgICAgICAgICAgIG1hcC5wdXQoInVzZXIiLCBNRVNTQUdFKTsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyBWaWV3YWJsZSgiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL012Y0VuY29kaW5nVGVzdC8iICsgdGVtcGxhdGVOYW1lLCBtYXApOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgidGV4dHBsYWluVVRGMTYiKQorICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW47Y2hhcnNldD1VVEYtMTYiKQorICAgICAgICBwdWJsaWMgVmlld2FibGUgZ2V0VGV4dFBsYWluVVRGMTYoKSB7CisgICAgICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IG1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgICAgICAgICAgbWFwLnB1dCgidXNlciIsIE1FU1NBR0UpOworCisgICAgICAgICAgICByZXR1cm4gbmV3IFZpZXdhYmxlKCIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvTXZjRW5jb2RpbmdUZXN0LyIgKyB0ZW1wbGF0ZU5hbWUsIG1hcCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgR3JpenpseVRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEVuY29kaW5nKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJNb2RlbDoiICsgTUVTU0FHRSwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiKi8qO2NoYXJzZXQ9IiArIGRlZmF1bHRFbmNvZGluZywgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkudG9TdHJpbmcoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZGVmYXVsdEVuY29kaW5nLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKS5nZXRQYXJhbWV0ZXJzKCkuZ2V0KE1lZGlhVHlwZS5DSEFSU0VUX1BBUkFNRVRFUikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRleHRQbGFpbkRlZmF1bHRFbmNvZGluZygpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZS90ZXh0cGxhaW4iKS5yZXF1ZXN0KCIqLyosdGV4dC9wbGFpbix0ZXh0L2h0bWwiKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiTW9kZWw6IiArIE1FU1NBR0UsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInRleHQvcGxhaW47Y2hhcnNldD0iICsgZGVmYXVsdEVuY29kaW5nLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKS50b1N0cmluZygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhkZWZhdWx0RW5jb2RpbmcsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpLmdldFBhcmFtZXRlcnMoKS5nZXQoTWVkaWFUeXBlLkNIQVJTRVRfUEFSQU1FVEVSKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGV4dFBsYWluNDA2KCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlL3RleHRwbGFpbiIpLnJlcXVlc3QoInRleHQvaHRtbCIpLmdldCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQwNiwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRleHRQbGFpblVURjE2KCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlL3RleHRwbGFpblVURjE2IikucmVxdWVzdCgiKi8qLHRleHQvcGxhaW4sdGV4dC9odG1sIikuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIk1vZGVsOiIgKyBNRVNTQUdFLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJ0ZXh0L3BsYWluO2NoYXJzZXQ9VVRGLTE2IiwgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkudG9TdHJpbmcoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIlVURi0xNiIsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpLmdldFBhcmFtZXRlcnMoKS5nZXQoTWVkaWFUeXBlLkNIQVJTRVRfUEFSQU1FVEVSKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1RlbXBsYXRlTWV0aG9kU2VsZWN0aW9uVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1RlbXBsYXRlTWV0aG9kU2VsZWN0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZDNmNzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVGVtcGxhdGVNZXRob2RTZWxlY3Rpb25UZXN0LmphdmEKQEAgLTAsMCArMSwyNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5tdmM7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb3h5Lmpzb24uTW94eUpzb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLk12Y0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5UZW1wbGF0ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLlZpZXdhYmxlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLm12Yy5wcm92aWRlci5UZXN0Vmlld1Byb2Nlc3NvcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmFueU9mOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogVGVzdHMgdGhhdCB7QGxpbmsgVGVtcGxhdGV9IGFubm90YXRlZCBtZXRob2RzIGFyZSBzZWxlY3RlZCBieSB0aGUgcm91dGluZyBhbGdvcml0aG1zIGFzIGlmIHRoZXkKKyAqIHdvdWxkIGFjdHVhbGx5IHJldHVybiB7QGxpbmsgVmlld2FibGV9IGluc3RlYWQgb2YgdGhlIG1vZGVsLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIFRlbXBsYXRlTWV0aG9kU2VsZWN0aW9uVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBNT0RFTCA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpIHt7CisgICAgICAgIHB1dCgiYSIsICJoZWxsbyIpOworICAgICAgICBwdXQoImIiLCAid29ybGQiKTsKKyAgICB9fTsKKworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZygKKyAgICAgICAgICAgICAgICBUZW1wbGF0ZUFubm90YXRlZFJlc291cmNlTWV0aG9kLmNsYXNzLAorICAgICAgICAgICAgICAgIFRlbXBsYXRlQW5ub3RhdGVkUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgQmFzaWNSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBBc1ZpZXdhYmxlUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgTm9UZW1wbGF0ZVJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIExvZ2dpbmdGZWF0dXJlLmNsYXNzLAorICAgICAgICAgICAgICAgIE12Y0ZlYXR1cmUuY2xhc3MsCisgICAgICAgICAgICAgICAgVGVzdFZpZXdQcm9jZXNzb3IuY2xhc3MsCisgICAgICAgICAgICAgICAgTW94eUpzb25GZWF0dXJlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoZmluYWwgQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcucmVnaXN0ZXIoTW94eUpzb25GZWF0dXJlLmNsYXNzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIE15QmVhbiBnZXRNeUJlYW4oKSB7CisgICAgICAgIGZpbmFsIE15QmVhbiBteUJlYW4gPSBuZXcgTXlCZWFuKCk7CisgICAgICAgIG15QmVhbi5zZXROYW1lKCJoZWxsbyIpOworICAgICAgICByZXR1cm4gbXlCZWFuOworICAgIH0KKworICAgIEBYbWxSb290RWxlbWVudAorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlCZWFuIHsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiYW5ub3RhdGVkTWV0aG9kIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlbXBsYXRlQW5ub3RhdGVkUmVzb3VyY2VNZXRob2QgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX0hUTUwpCisgICAgICAgIEBUZW1wbGF0ZSgpCisgICAgICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldEFzSFRNTCgpIHsKKyAgICAgICAgICAgIHJldHVybiBNT0RFTDsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9qc29uIikKKyAgICAgICAgcHVibGljIE15QmVhbiBnZXRBc0pTT04oKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0TXlCZWFuKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgibm9UZW1wbGF0ZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBOb1RlbXBsYXRlUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX0hUTUwpCisgICAgICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBTdHJpbmc+IGdldEFzSFRNTCgpIHsKKyAgICAgICAgICAgIHJldHVybiBNT0RFTDsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9qc29uIikKKyAgICAgICAgcHVibGljIE15QmVhbiBnZXRBc0pTT04oKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0TXlCZWFuKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiYW5ub3RhdGVkQ2xhc3MiKQorICAgIEBUZW1wbGF0ZQorICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9IVE1MKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVtcGxhdGVBbm5vdGF0ZWRSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgICAgICBwdWJsaWMgTXlCZWFuIGdldEFzSlNPTigpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRNeUJlYW4oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJUaGlzIHRvU3RyaW5nKCkgbWV0aG9kIHdpbGwgYmUgdXNlZCB0byBnZXQgbW9kZWwuIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJiYXNpYyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCYXNpY1Jlc291cmNlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfSFRNTCkKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRBc0hUTUwoKSB7CisgICAgICAgICAgICByZXR1cm4gIkhlbGxvIFdvcmxkIjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorICAgICAgICBwdWJsaWMgTXlCZWFuIGdldEFzSlNPTigpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRNeUJlYW4oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJ2aWV3YWJsZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBc1ZpZXdhYmxlUmVzb3VyY2UgeworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9IVE1MKQorICAgICAgICBwdWJsaWMgVmlld2FibGUgZ2V0QXNIVE1MKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBWaWV3YWJsZSgiaW5kZXgudGVzdHAiLCBNT0RFTCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKyAgICAgICAgcHVibGljIE15QmVhbiBnZXRBc0pTT04oKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0TXlCZWFuKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHRlc3QgbWFrZXMgcmVxdWVzdCBmb3IgdGV4dC9odG1sIHdoaWNoIGlzIHByZWZlcnJlZC4gVGhlIHJlc291cmNlIGRlZmluZXMgdGhlIG1ldGhvZAorICAgICAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLm12Yy5UZW1wbGF0ZU1ldGhvZFNlbGVjdGlvblRlc3QuVGVtcGxhdGVBbm5vdGF0ZWRSZXNvdXJjZU1ldGhvZCNnZXRBc0hUTUwoKX0KKyAgICAgKiB3aGljaCByZXR1cm5zIHtAbGluayBNYXB9IGZvciB3aGljaCB0aGVyZSBpcyBub3Qge0BsaW5rIGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcn0uIFRoZSBhYnNlbmNlIG9mIHRoZQorICAgICAqIHdyaXRlciB3b3VsZCBjYXVzZSB0aGF0IHRoZSBtZXRob2Qgd291bGQgbm90IGhhdmUgYmVlbiBzZWxlY3RlZCBidXQgYXMgdGhlIHtAbGluayBUZW1wbGF0ZX0gYW5ub3RhdGlvbgorICAgICAqIGlzIG9uIHRoZSBtZXRob2QsIHRoZSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLnJvdXRpbmcuTWV0aG9kU2VsZWN0aW5nUm91dGVyfSBjb25zaWRlcnMKKyAgICAgKiBpdCBhcyBpZiB0aGlzIHdvdWxkIGhhdmUgYmVlbiB7QGxpbmsgVmlld2FibGV9IGluc3RlYWQgb2YgdGhlIHtAbGluayBNYXB9LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFubm90YXRlZE1ldGhvZEJ5VGVtcGxhdGVIdG1sKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoImFubm90YXRlZE1ldGhvZCIpLnJlcXVlc3QoInRleHQvaHRtbDtxPTAuOCIsICJhcHBsaWNhdGlvbi9qc29uO3E9MC43IikuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS5URVhUX0hUTUxfVFlQRSwgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwKKyAgICAgICAgICAgICAgICBhbnlPZihjb250YWluc1N0cmluZygie2I9d29ybGQsIGE9aGVsbG99IiksIGNvbnRhaW5zU3RyaW5nKCJ7YT1oZWxsbywgYj13b3JsZH0iKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFubm90YXRlZE1ldGhvZEJ5VGVtcGxhdGVKc29uKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoImFubm90YXRlZE1ldGhvZCIpLnJlcXVlc3QoInRleHQvaHRtbDtxPTAuNiIsICJhcHBsaWNhdGlvbi9qc29uO3E9MC43IikuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJoZWxsbyIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoTXlCZWFuLmNsYXNzKS5nZXROYW1lKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFubm90YXRlZENsYXNzQnlUZW1wbGF0ZUh0bWwoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiYW5ub3RhdGVkQ2xhc3MiKS5yZXF1ZXN0KCJ0ZXh0L2h0bWw7cT0wLjgiLCAiYXBwbGljYXRpb24vanNvbjtxPTAuNyIpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUuVEVYVF9IVE1MX1RZUEUsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykuY29udGFpbnMoIm1vZGVsPVRoaXMgdG9TdHJpbmcoKSBtZXRob2Qgd2lsbCBiZSB1c2VkIHRvIGdldCBtb2RlbC4iKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QW5ub3RhdGVkQ2xhc3NCeVRlbXBsYXRlSnNvbigpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJhbm5vdGF0ZWRDbGFzcyIpLnJlcXVlc3QoInRleHQvaHRtbDtxPTAuNiIsICJhcHBsaWNhdGlvbi9qc29uO3E9MC43IikuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJoZWxsbyIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoTXlCZWFuLmNsYXNzKS5nZXROYW1lKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJhc2ljSHRtbCgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJiYXNpYyIpLnJlcXVlc3QoInRleHQvaHRtbDtxPTAuOCIsICJhcHBsaWNhdGlvbi9qc29uO3E9MC43IikuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS5URVhUX0hUTUxfVFlQRSwgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkpOworICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKS5jb250YWlucygiSGVsbG8gV29ybGQiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmFzaWNKc29uKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoImJhc2ljIikucmVxdWVzdCgidGV4dC9odG1sO3E9MC42IiwgImFwcGxpY2F0aW9uL2pzb247cT0wLjciKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSwgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImhlbGxvIiwgcmVzcG9uc2UucmVhZEVudGl0eShNeUJlYW4uY2xhc3MpLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXNWaWV3YWJsZUh0bWwoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgidmlld2FibGUiKS5yZXF1ZXN0KCJ0ZXh0L2h0bWw7cT0wLjgiLCAiYXBwbGljYXRpb24vanNvbjtxPTAuNyIpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUuVEVYVF9IVE1MX1RZUEUsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksCisgICAgICAgICAgICAgICAgYW55T2YoY29udGFpbnNTdHJpbmcoIntiPXdvcmxkLCBhPWhlbGxvfSIpLCBjb250YWluc1N0cmluZygie2E9aGVsbG8sIGI9d29ybGR9IikpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBc1ZpZXdhYmxlSnNvbigpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJ2aWV3YWJsZSIpLnJlcXVlc3QoInRleHQvaHRtbDtxPTAuNiIsICJhcHBsaWNhdGlvbi9qc29uO3E9MC43IikuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJoZWxsbyIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoTXlCZWFuLmNsYXNzKS5nZXROYW1lKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGF0IHRoZXJlIGlzIHJlYWxseSBubyB7QGxpbmsgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyfQorICAgICAqIGZvciB7QGNvZGUgTWFwPFN0cmluZyxTdHJpbmc+fX0uIHRleHQvaHRtbCBpcyByZXF1ZXN0ZWQgYnV0IGFwcGxpY2F0aW9uL2pzb24gaXMgY2hvc2VuIHRoZXJlIGlzIG5vCisgICAgICogTUJXIGZvciB7QGNvZGUgTWFwfS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb1RlbXBsYXRlSHRtbCgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJub1RlbXBsYXRlIikucmVxdWVzdCgidGV4dC9odG1sO3E9MC45IiwgImFwcGxpY2F0aW9uL2pzb247cT0wLjciKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSwgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImhlbGxvIiwgcmVzcG9uc2UucmVhZEVudGl0eShNeUJlYW4uY2xhc3MpLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9UZW1wbGF0ZUpzb24oKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgibm9UZW1wbGF0ZSIpLnJlcXVlc3QoInRleHQvaHRtbDtxPTAuNiIsICJhcHBsaWNhdGlvbi9qc29uO3E9MC43IikuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUsIHJlc3BvbnNlLmdldE1lZGlhVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJoZWxsbyIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoTXlCZWFuLmNsYXNzKS5nZXROYW1lKCkpOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVmlld1Byb2Nlc3NvclRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9WaWV3UHJvY2Vzc29yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1YmUzZjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVmlld1Byb2Nlc3NvclRlc3QuamF2YQpAQCAtMCwwICsxLDI0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLm12YzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuSW52b2NhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLk12Y0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5UZW1wbGF0ZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLlZpZXdhYmxlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIubXZjLnByb3ZpZGVyLlRlc3RWaWV3UHJvY2Vzc29yOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgVmlld1Byb2Nlc3NvclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5EVU1QX0VOVElUWSk7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisKKyAgICAgICAgUmVzb3VyY2VDb25maWcgcmVnaXN0ZXIgPSBuZXcgUmVzb3VyY2VDb25maWcoCisgICAgICAgICAgICAgICAgRXhwbGljaXRUZW1wbGF0ZS5jbGFzcywKKyAgICAgICAgICAgICAgICBJbXBsaWNpdFRlbXBsYXRlLmNsYXNzLAorICAgICAgICAgICAgICAgIEltcGxpY2l0RXhwbGljaXRUZW1wbGF0ZS5jbGFzcywKKyAgICAgICAgICAgICAgICBJbXBsaWNpdFdpdGhHZXRUZW1wbGF0ZS5jbGFzcywKKyAgICAgICAgICAgICAgICBJbXBsaWNpdFdpdGhTdWJSZXNvdXJjZUdldFRlbXBsYXRlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihNdmNGZWF0dXJlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihUZXN0Vmlld1Byb2Nlc3Nvci5jbGFzcyk7CisgICAgICAgIHJlZ2lzdGVyLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuV0FETF9GRUFUVVJFX0RJU0FCTEUsIHRydWUpOworICAgICAgICByZXR1cm4gcmVnaXN0ZXI7CisgICAgfQorCisgICAgQFRlbXBsYXRlCisgICAgQFBhdGgoIi9leHBsaWNpdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeHBsaWNpdFRlbXBsYXRlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBUZW1wbGF0ZQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCkuZW50aXR5KG5ldyBWaWV3YWJsZSgic2hvdyIsICJnZXQiKSkuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBWaWV3YWJsZSBwb3N0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBWaWV3YWJsZSgic2hvdyIsICJwb3N0Iik7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJhYnNvbHV0ZSIpCisgICAgICAgIHB1YmxpYyBWaWV3YWJsZSBnZXRBYnMoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFZpZXdhYmxlKCIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVmlld1Byb2Nlc3NvclRlc3QvRXhwbGljaXRUZW1wbGF0ZS9hYnNvbHV0ZS9zaG93IiwKKyAgICAgICAgICAgICAgICAgICAgImdldCIpOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoImFic29sdXRlIikKKyAgICAgICAgcHVibGljIFZpZXdhYmxlIHBvc3RBYnMoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFZpZXdhYmxlKCIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVmlld1Byb2Nlc3NvclRlc3QvRXhwbGljaXRUZW1wbGF0ZS9hYnNvbHV0ZS9zaG93IiwKKyAgICAgICAgICAgICAgICAgICAgInBvc3QiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEV4cGxpY2l0VGVtcGxhdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBJbnZvY2F0aW9uLkJ1aWxkZXIgcmVxdWVzdCA9IHRhcmdldCgiZXhwbGljaXQiKS5yZXF1ZXN0KCk7CisKKyAgICAgICAgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgcC5sb2FkKHJlcXVlc3QuZ2V0KElucHV0U3RyZWFtLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1ZpZXdQcm9jZXNzb3JUZXN0L0V4cGxpY2l0VGVtcGxhdGUvc2hvdy50ZXN0cCIsCisgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgicGF0aCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXQiLCBwLmdldFByb3BlcnR5KCJtb2RlbCIpKTsKKworICAgICAgICBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgcC5sb2FkKHJlcXVlc3QucG9zdChFbnRpdHkuZW50aXR5KCIiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSwgSW5wdXRTdHJlYW0uY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVmlld1Byb2Nlc3NvclRlc3QvRXhwbGljaXRUZW1wbGF0ZS9zaG93LnRlc3RwIiwKKyAgICAgICAgICAgICAgICBwLmdldFByb3BlcnR5KCJwYXRoIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBvc3QiLCBwLmdldFByb3BlcnR5KCJtb2RlbCIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeHBsaWNpdEFic29sdXRlVGVtcGxhdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBJbnZvY2F0aW9uLkJ1aWxkZXIgcmVxdWVzdCA9IHRhcmdldCgiZXhwbGljaXQiKS5wYXRoKCJhYnNvbHV0ZSIpLnJlcXVlc3QoKTsKKworICAgICAgICBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBwLmxvYWQocmVxdWVzdC5nZXQoSW5wdXRTdHJlYW0uY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVmlld1Byb2Nlc3NvclRlc3QvRXhwbGljaXRUZW1wbGF0ZS9hYnNvbHV0ZS9zaG93LnRlc3RwIiwKKyAgICAgICAgICAgICAgICBwLmdldFByb3BlcnR5KCJwYXRoIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoImdldCIsIHAuZ2V0UHJvcGVydHkoIm1vZGVsIikpOworCisgICAgICAgIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBwLmxvYWQocmVxdWVzdC5wb3N0KEVudGl0eS5lbnRpdHkoIiIsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpLCBJbnB1dFN0cmVhbS5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9WaWV3UHJvY2Vzc29yVGVzdC9FeHBsaWNpdFRlbXBsYXRlL2Fic29sdXRlL3Nob3cudGVzdHAiLAorICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInBhdGgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygicG9zdCIsIHAuZ2V0UHJvcGVydHkoIm1vZGVsIikpOworICAgIH0KKworICAgIEBQYXRoKCIvaW1wbGljaXQiKQorICAgIEBUZW1wbGF0ZQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGljaXRUZW1wbGF0ZSB7CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiSW1wbGljaXRUZW1wbGF0ZSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbXBsaWNpdFRlbXBsYXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSW52b2NhdGlvbi5CdWlsZGVyIHJlcXVlc3QgPSB0YXJnZXQoImltcGxpY2l0IikucmVxdWVzdCgpOworCisgICAgICAgIFByb3BlcnRpZXMgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIHAubG9hZChyZXF1ZXN0LmdldChJbnB1dFN0cmVhbS5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9WaWV3UHJvY2Vzc29yVGVzdC9JbXBsaWNpdFRlbXBsYXRlL2luZGV4LnRlc3RwIiwKKyAgICAgICAgICAgICAgICBwLmdldFByb3BlcnR5KCJwYXRoIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkltcGxpY2l0VGVtcGxhdGUiLCBwLmdldFByb3BlcnR5KCJtb2RlbCIpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiL2ltcGxpY2l0LWV4cGxpY2l0IikKKyAgICBAVGVtcGxhdGUKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEltcGxpY2l0RXhwbGljaXRUZW1wbGF0ZSB7CisKKyAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgICAgIHJldHVybiAiSW1wbGljaXRFeHBsaWNpdFRlbXBsYXRlIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBWaWV3YWJsZSBwb3N0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBWaWV3YWJsZSgic2hvdyIsICJwb3N0Iik7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJzdWIiKQorICAgICAgICBwdWJsaWMgVmlld2FibGUgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBWaWV3YWJsZSgic2hvdyIsICJnZXQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEltcGxpY2l0RXhwbGljaXRUZW1wbGF0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEludm9jYXRpb24uQnVpbGRlciByZXF1ZXN0ID0gdGFyZ2V0KCJpbXBsaWNpdC1leHBsaWNpdCIpLnJlcXVlc3QoKTsKKworICAgICAgICBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBwLmxvYWQocmVxdWVzdC5nZXQoSW5wdXRTdHJlYW0uY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVmlld1Byb2Nlc3NvclRlc3QvSW1wbGljaXRFeHBsaWNpdFRlbXBsYXRlL2luZGV4LnRlc3RwIiwKKyAgICAgICAgICAgICAgICBwLmdldFByb3BlcnR5KCJwYXRoIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkltcGxpY2l0RXhwbGljaXRUZW1wbGF0ZSIsIHAuZ2V0UHJvcGVydHkoIm1vZGVsIikpOworCisgICAgICAgIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBwLmxvYWQocmVxdWVzdC5wb3N0KEVudGl0eS5lbnRpdHkoIiIsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpLCBJbnB1dFN0cmVhbS5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9WaWV3UHJvY2Vzc29yVGVzdC9JbXBsaWNpdEV4cGxpY2l0VGVtcGxhdGUvc2hvdy50ZXN0cCIsCisgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgicGF0aCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwb3N0IiwgcC5nZXRQcm9wZXJ0eSgibW9kZWwiKSk7CisKKyAgICAgICAgcCA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgIHAubG9hZCh0YXJnZXQoImltcGxpY2l0LWV4cGxpY2l0IikucGF0aCgic3ViIikucmVxdWVzdCgpLmdldChJbnB1dFN0cmVhbS5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9WaWV3UHJvY2Vzc29yVGVzdC9JbXBsaWNpdEV4cGxpY2l0VGVtcGxhdGUvc2hvdy50ZXN0cCIsCisgICAgICAgICAgICAgICAgcC5nZXRQcm9wZXJ0eSgicGF0aCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXQiLCBwLmdldFByb3BlcnR5KCJtb2RlbCIpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiL2ltcGxpY2l0LWdldCIpCisgICAgQFRlbXBsYXRlCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbXBsaWNpdFdpdGhHZXRUZW1wbGF0ZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2ZvbyIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIkltcGxpY2l0V2l0aEdldFRlbXBsYXRlIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEltcGxpY2l0V2l0aEdldFRlbXBsYXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiaW1wbGljaXQtZ2V0Iik7CisKKyAgICAgICAgUHJvcGVydGllcyBwID0gbmV3IFByb3BlcnRpZXMoKTsKKyAgICAgICAgcC5sb2FkKHRhcmdldC5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikuZ2V0KElucHV0U3RyZWFtLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1ZpZXdQcm9jZXNzb3JUZXN0L0ltcGxpY2l0V2l0aEdldFRlbXBsYXRlL2luZGV4LnRlc3RwIiwKKyAgICAgICAgICAgICAgICBwLmdldFByb3BlcnR5KCJwYXRoIikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkltcGxpY2l0V2l0aEdldFRlbXBsYXRlIiwgcC5nZXRQcm9wZXJ0eSgibW9kZWwiKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJJbXBsaWNpdFdpdGhHZXRUZW1wbGF0ZSIsIHRhcmdldC5yZXF1ZXN0KCJhcHBsaWNhdGlvbi9mb28iKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFBhdGgoIi9pbXBsaWNpdC1nZXQtc3VicmVzb3VyY2UiKQorICAgIEBUZW1wbGF0ZQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW1wbGljaXRXaXRoU3ViUmVzb3VyY2VHZXRUZW1wbGF0ZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgic3ViIikKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9mb28iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJJbXBsaWNpdFdpdGhTdWJSZXNvdXJjZUdldFRlbXBsYXRlIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEltcGxpY2l0V2l0aFN1YlJlc291cmNlR2V0VGVtcGxhdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJpbXBsaWNpdC1nZXQtc3VicmVzb3VyY2UiKS5wYXRoKCJzdWIiKTsKKworICAgICAgICBQcm9wZXJ0aWVzIHAgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICBwLmxvYWQodGFyZ2V0LnJlcXVlc3QoInRleHQvcGxhaW4iKS5nZXQoSW5wdXRTdHJlYW0uY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVmlld1Byb2Nlc3NvclRlc3QvSW1wbGljaXRXaXRoU3ViUmVzb3VyY2VHZXRUZW1wbGF0ZS9zdWIudGVzdHAiLAorICAgICAgICAgICAgICAgIHAuZ2V0UHJvcGVydHkoInBhdGgiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiSW1wbGljaXRXaXRoU3ViUmVzb3VyY2VHZXRUZW1wbGF0ZSIsIHAuZ2V0UHJvcGVydHkoIm1vZGVsIikpOworCisgICAgICAgIGFzc2VydEVxdWFscygiSW1wbGljaXRXaXRoU3ViUmVzb3VyY2VHZXRUZW1wbGF0ZSIsIHRhcmdldC5yZXF1ZXN0KCJhcHBsaWNhdGlvbi9mb28iKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL3Byb3ZpZGVyL0FiY1ZpZXdQcm9jZXNzb3IuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9wcm92aWRlci9BYmNWaWV3UHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc3NzJjNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9wcm92aWRlci9BYmNWaWV3UHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLm12Yy5wcm92aWRlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgQWJjVmlld1Byb2Nlc3NvciBleHRlbmRzIFRlc3RWaWV3UHJvY2Vzc29yIHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXh0ZW5zaW9uKCkgeworICAgICAgICByZXR1cm4gIi5hYmMiOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Vmlld1Byb2Nlc3Nvck5hbWUoKSB7CisgICAgICAgIHJldHVybiAiQWJjVmlld1Byb2Nlc3NvciI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0TWVkaWFUeXBlKGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVR5cGUoImFwcGxpY2F0aW9uIiwgImFiYyIpLmVxdWFscyhtZWRpYVR5cGUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9wcm92aWRlci9DdXN0b21WaWV3YWJsZUNvbnRleHQuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9wcm92aWRlci9DdXN0b21WaWV3YWJsZUNvbnRleHQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGJkOGYzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL3Byb3ZpZGVyL0N1c3RvbVZpZXdhYmxlQ29udGV4dC5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5tdmMucHJvdmlkZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLlZpZXdhYmxlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuaW50ZXJuYWwuVGVtcGxhdGVIZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5zcGkuUmVzb2x2ZWRWaWV3YWJsZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLnNwaS5UZW1wbGF0ZVByb2Nlc3NvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLnNwaS5WaWV3YWJsZUNvbnRleHQ7CisKKy8qKgorICogQ3VzdG9tIHtAbGluayBWaWV3YWJsZUNvbnRleHQgdmlld2FibGUgY29udGV4dH0uCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BQcm92aWRlcgorcHVibGljIGNsYXNzIEN1c3RvbVZpZXdhYmxlQ29udGV4dCBpbXBsZW1lbnRzIFZpZXdhYmxlQ29udGV4dCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzb2x2ZWRWaWV3YWJsZSByZXNvbHZlVmlld2FibGUoZmluYWwgVmlld2FibGUgdmlld2FibGUsIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IHJlc291cmNlQ2xhc3MsIGZpbmFsIFRlbXBsYXRlUHJvY2Vzc29yIHRlbXBsYXRlUHJvY2Vzc29yKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBwYXRoID0gVGVtcGxhdGVIZWxwZXIuZ2V0VGVtcGxhdGVOYW1lKHZpZXdhYmxlKTsKKyAgICAgICAgZmluYWwgT2JqZWN0IHRlbXBsYXRlUmVmZXJlbmNlID0gdGVtcGxhdGVQcm9jZXNzb3IucmVzb2x2ZSgiL0N1c3RvbVZpZXdhYmxlQ29udGV4dC8iICsgcGF0aCwKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKTsKKworICAgICAgICBpZiAodGVtcGxhdGVSZWZlcmVuY2UgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvbHZlZFZpZXdhYmxlKHRlbXBsYXRlUHJvY2Vzc29yLCB0ZW1wbGF0ZVJlZmVyZW5jZSwgdmlld2FibGUsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL3Byb3ZpZGVyL0RlZlZpZXdQcm9jZXNzb3IuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9wcm92aWRlci9EZWZWaWV3UHJvY2Vzc29yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYzMDJkYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9wcm92aWRlci9EZWZWaWV3UHJvY2Vzc29yLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLm12Yy5wcm92aWRlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgRGVmVmlld1Byb2Nlc3NvciBleHRlbmRzIFRlc3RWaWV3UHJvY2Vzc29yIHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0RXh0ZW5zaW9uKCkgeworICAgICAgICByZXR1cm4gIi5kZWYiOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Vmlld1Byb2Nlc3Nvck5hbWUoKSB7CisgICAgICAgIHJldHVybiAiRGVmVmlld1Byb2Nlc3NvciI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0TWVkaWFUeXBlKGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuICFuZXcgTWVkaWFUeXBlKCJhcHBsaWNhdGlvbiIsICJhYmMiKS5lcXVhbHMobWVkaWFUeXBlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvcHJvdmlkZXIvVGVzdFZpZXdQcm9jZXNzb3IuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9wcm92aWRlci9UZXN0Vmlld1Byb2Nlc3Nvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMTI1NmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvcHJvdmlkZXIvVGVzdFZpZXdQcm9jZXNzb3IuamF2YQpAQCAtMCwwICsxLDk1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIubXZjLnByb3ZpZGVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOworaW1wb3J0IGphdmEubmV0LlVSTDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLlZpZXdhYmxlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuc3BpLlRlbXBsYXRlUHJvY2Vzc29yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci52YWxpZGF0aW9uLlZhbGlkYXRpb25FcnJvcjsKKworLyoqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIFRlc3RWaWV3UHJvY2Vzc29yIGltcGxlbWVudHMgVGVtcGxhdGVQcm9jZXNzb3I8U3RyaW5nPiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHJlc29sdmUoU3RyaW5nIHBhdGgsIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGV4dGVuc2lvbiA9IGdldEV4dGVuc2lvbigpOworCisgICAgICAgIGlmICghcGF0aC5lbmRzV2l0aChleHRlbnNpb24pKSB7CisgICAgICAgICAgICBwYXRoID0gcGF0aCArIGV4dGVuc2lvbjsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFVSTCB1ID0gdGhpcy5nZXRDbGFzcygpLmdldFJlc291cmNlKHBhdGgpOworICAgICAgICBpZiAodSA9PSBudWxsIHx8ICFhY2NlcHRNZWRpYVR5cGUobWVkaWFUeXBlKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhdGg7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0TWVkaWFUeXBlKGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGVUbyhTdHJpbmcgdGVtcGxhdGVSZWZlcmVuY2UsIFZpZXdhYmxlIHZpZXdhYmxlLCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLCBPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgIGZpbmFsIFByaW50U3RyZWFtIHBzID0gbmV3IFByaW50U3RyZWFtKG91dCk7CisgICAgICAgIHBzLnByaW50KCJuYW1lPSIpOworICAgICAgICBwcy5wcmludChnZXRWaWV3UHJvY2Vzc29yTmFtZSgpKTsKKyAgICAgICAgcHMucHJpbnRsbigpOworICAgICAgICBwcy5wcmludCgicGF0aD0iKTsKKyAgICAgICAgcHMucHJpbnQodGVtcGxhdGVSZWZlcmVuY2UpOworICAgICAgICBwcy5wcmludGxuKCk7CisgICAgICAgIHBzLnByaW50KCJtb2RlbD0iKTsKKyAgICAgICAgcHMucHJpbnQoZ2V0TW9kZWwodmlld2FibGUuZ2V0TW9kZWwoKSkpOworICAgICAgICBwcy5wcmludGxuKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0TW9kZWwoZmluYWwgT2JqZWN0IG1vZGVsKSB7CisgICAgICAgIGlmIChtb2RlbCBpbnN0YW5jZW9mIENvbGxlY3Rpb24pIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgICAgICBmb3IgKGZpbmFsIE9iamVjdCBvYmplY3QgOiAoQ29sbGVjdGlvbikgbW9kZWwpIHsKKyAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChnZXRNb2RlbChvYmplY3QpKS5hcHBlbmQoJywnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBidWlsZGVyLmRlbGV0ZShidWlsZGVyLmxlbmd0aCgpIC0gMSwgYnVpbGRlci5sZW5ndGgoKSkudG9TdHJpbmcoKTsKKyAgICAgICAgfSBlbHNlIGlmIChtb2RlbCBpbnN0YW5jZW9mIFZhbGlkYXRpb25FcnJvcikgeworICAgICAgICAgICAgZmluYWwgVmFsaWRhdGlvbkVycm9yIGVycm9yID0gKFZhbGlkYXRpb25FcnJvcikgbW9kZWw7CisgICAgICAgICAgICByZXR1cm4gZXJyb3IuZ2V0TWVzc2FnZVRlbXBsYXRlKCkgKyAiXyIgKyBlcnJvci5nZXRQYXRoKCkgKyAiXyIgKyBlcnJvci5nZXRJbnZhbGlkVmFsdWUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbW9kZWwudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEV4dGVuc2lvbigpIHsKKyAgICAgICAgcmV0dXJuICIudGVzdHAiOworICAgIH0KKworICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Vmlld1Byb2Nlc3Nvck5hbWUoKSB7CisgICAgICAgIHJldHVybiAiVGVzdFZpZXdQcm9jZXNzb3IiOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL3NwaS9BYnN0cmFjdFRlbXBsYXRlUHJvY2Vzc29yVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL3NwaS9BYnN0cmFjdFRlbXBsYXRlUHJvY2Vzc29yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxOWUxYTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvc3BpL0Fic3RyYWN0VGVtcGxhdGVQcm9jZXNzb3JUZXN0LmphdmEKQEAgLTAsMCArMSwyNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5tdmMuc3BpOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLlJlYWRlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uVmFsdWU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5jb2xsZWN0aW9uLlZhbHVlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5NdmNGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuVGVtcGxhdGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5WaWV3YWJsZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLnNwaS5BYnN0cmFjdFRlbXBsYXRlUHJvY2Vzc29yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlN1aXRlOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuaXM7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BSdW5XaXRoKFN1aXRlLmNsYXNzKQorQFN1aXRlLlN1aXRlQ2xhc3Nlcyh7CisgICAgICAgIEFic3RyYWN0VGVtcGxhdGVQcm9jZXNzb3JUZXN0LkZhY3RvcnlJbnN0YW5jZVRlc3QuY2xhc3MsCisgICAgICAgIEFic3RyYWN0VGVtcGxhdGVQcm9jZXNzb3JUZXN0LkZhY3RvcnlJbnN0YW5jZU5lZ2F0aXZlVGVzdC5jbGFzcywKKyAgICAgICAgQWJzdHJhY3RUZW1wbGF0ZVByb2Nlc3NvclRlc3QuRmFjdG9yeUNsYXNzVGVzdC5jbGFzcywKKyAgICAgICAgQWJzdHJhY3RUZW1wbGF0ZVByb2Nlc3NvclRlc3QuRmFjdG9yeUNsYXNzTmVnYXRpdmVUZXN0LmNsYXNzLAorICAgICAgICBBYnN0cmFjdFRlbXBsYXRlUHJvY2Vzc29yVGVzdC5GYWN0b3J5Q2xhc3NOYW1lVGVzdC5jbGFzcywKKyAgICAgICAgQWJzdHJhY3RUZW1wbGF0ZVByb2Nlc3NvclRlc3QuRmFjdG9yeUNsYXNzTmFtZU5lZ2F0aXZlVGVzdC5jbGFzcywKKyAgICAgICAgQWJzdHJhY3RUZW1wbGF0ZVByb2Nlc3NvclRlc3QuQ2FjaGVQb3NpdGl2ZVRlc3QuY2xhc3MsCisgICAgICAgIEFic3RyYWN0VGVtcGxhdGVQcm9jZXNzb3JUZXN0LkNhY2hlUG9zaXRpdmVTdHJpbmdUZXN0LmNsYXNzLAorICAgICAgICBBYnN0cmFjdFRlbXBsYXRlUHJvY2Vzc29yVGVzdC5DYWNoZU5lZ2F0aXZlVGVzdC5jbGFzcywKKyAgICAgICAgQWJzdHJhY3RUZW1wbGF0ZVByb2Nlc3NvclRlc3QuQ2FjaGVJbnZhbGlkVGVzdC5jbGFzcworfSkKK3B1YmxpYyBjbGFzcyBBYnN0cmFjdFRlbXBsYXRlUHJvY2Vzc29yVGVzdCB7CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAVGVtcGxhdGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gImtvIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdEZhY3RvcnkgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHZhbHVlOworCisgICAgICAgIHB1YmxpYyBUZXN0RmFjdG9yeSgpIHsKKyAgICAgICAgICAgIHRoaXMoIkluamVjdGVkIFRlc3QgRmFjdG9yeSIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFRlc3RGYWN0b3J5KGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5VGVtcGxhdGVQcm9jZXNzb3IgZXh0ZW5kcyBBYnN0cmFjdFRlbXBsYXRlUHJvY2Vzc29yPFN0cmluZz4geworCisgICAgICAgIHByaXZhdGUgZmluYWwgVGVzdEZhY3RvcnkgZmFjdG9yeTsKKworICAgICAgICBASW5qZWN0CisgICAgICAgIHB1YmxpYyBGYWN0b3J5VGVtcGxhdGVQcm9jZXNzb3IoQ29uZmlndXJhdGlvbiBjb25maWcsIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlcikgeworICAgICAgICAgICAgc3VwZXIoY29uZmlnLCBpbmplY3Rpb25NYW5hZ2VyLmdldEluc3RhbmNlKFNlcnZsZXRDb250ZXh0LmNsYXNzKSwgImZhY3RvcnkiLCAiZmN0Iik7CisKKyAgICAgICAgICAgIHRoaXMuZmFjdG9yeSA9IGdldFRlbXBsYXRlT2JqZWN0RmFjdG9yeShpbmplY3Rpb25NYW5hZ2VyOjpjcmVhdGVBbmRJbml0aWFsaXplLCBUZXN0RmFjdG9yeS5jbGFzcywgVmFsdWVzLmxhenkoCisgICAgICAgICAgICAgICAgICAgIChWYWx1ZTxUZXN0RmFjdG9yeT4pICgpIC0+IG5ldyBUZXN0RmFjdG9yeSgiRGVmYXVsdCBUZXN0IEZhY3RvcnkiKSkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZShmaW5hbCBTdHJpbmcgdGVtcGxhdGVQYXRoLCBmaW5hbCBSZWFkZXIgcmVhZGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBmYWN0b3J5LnZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oZmluYWwgU3RyaW5nIHRlbXBsYXRlUmVmZXJlbmNlLCBmaW5hbCBWaWV3YWJsZSB2aWV3YWJsZSwgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsIGZpbmFsIE91dHB1dFN0cmVhbSBvdXQpCisgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIG91dC53cml0ZSh0ZW1wbGF0ZVJlZmVyZW5jZS5nZXRCeXRlcygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgRmFjdG9yeVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBleHBlY3RlZE1lc3NhZ2U7CisKKyAgICAgICAgRmFjdG9yeVRlc3QoZmluYWwgT2JqZWN0IGZhY3RvcnksIGZpbmFsIFN0cmluZyBleHBlY3RlZE1lc3NhZ2UpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHN1cGVyKG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKE12Y0ZlYXR1cmUuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIC5yZWdpc3RlcihGYWN0b3J5VGVtcGxhdGVQcm9jZXNzb3IuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShNdmNGZWF0dXJlLlRFTVBMQVRFX09CSkVDVF9GQUNUT1JZICsgIi5mYWN0b3J5IiwgZmFjdG9yeSkpOworCisgICAgICAgICAgICB0aGlzLmV4cGVjdGVkTWVzc2FnZSA9IGV4cGVjdGVkTWVzc2FnZTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RGYWN0b3J5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoZXhwZWN0ZWRNZXNzYWdlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3RvcnlJbnN0YW5jZVRlc3QgZXh0ZW5kcyBGYWN0b3J5VGVzdCB7CisKKyAgICAgICAgcHVibGljIEZhY3RvcnlJbnN0YW5jZVRlc3QoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBzdXBlcihuZXcgVGVzdEZhY3RvcnkoKSwgIkluamVjdGVkIFRlc3QgRmFjdG9yeSIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5SW5zdGFuY2VOZWdhdGl2ZVRlc3QgZXh0ZW5kcyBGYWN0b3J5VGVzdCB7CisKKyAgICAgICAgcHVibGljIEZhY3RvcnlJbnN0YW5jZU5lZ2F0aXZlVGVzdCgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHN1cGVyKCJEZWZhdWx0IFRlc3QgRmFjdG9yeSIsICJEZWZhdWx0IFRlc3QgRmFjdG9yeSIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5Q2xhc3NUZXN0IGV4dGVuZHMgRmFjdG9yeVRlc3QgeworCisgICAgICAgIHB1YmxpYyBGYWN0b3J5Q2xhc3NUZXN0KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICAgICAgc3VwZXIoVGVzdEZhY3RvcnkuY2xhc3MsICJJbmplY3RlZCBUZXN0IEZhY3RvcnkiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeUNsYXNzTmVnYXRpdmVUZXN0IGV4dGVuZHMgRmFjdG9yeVRlc3QgeworCisgICAgICAgIHB1YmxpYyBGYWN0b3J5Q2xhc3NOZWdhdGl2ZVRlc3QoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBzdXBlcihTdHJpbmcuY2xhc3MsICJEZWZhdWx0IFRlc3QgRmFjdG9yeSIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5Q2xhc3NOYW1lVGVzdCBleHRlbmRzIEZhY3RvcnlUZXN0IHsKKworICAgICAgICBwdWJsaWMgRmFjdG9yeUNsYXNzTmFtZVRlc3QoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBzdXBlcihUZXN0RmFjdG9yeS5jbGFzcy5nZXROYW1lKCksICJJbmplY3RlZCBUZXN0IEZhY3RvcnkiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeUNsYXNzTmFtZU5lZ2F0aXZlVGVzdCBleHRlbmRzIEZhY3RvcnlUZXN0IHsKKworICAgICAgICBwdWJsaWMgRmFjdG9yeUNsYXNzTmFtZU5lZ2F0aXZlVGVzdCgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHN1cGVyKFN0cmluZy5jbGFzcy5nZXROYW1lKCksICJEZWZhdWx0IFRlc3QgRmFjdG9yeSIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDYWNoZVRlbXBsYXRlUHJvY2Vzc29yIGV4dGVuZHMgQWJzdHJhY3RUZW1wbGF0ZVByb2Nlc3NvcjxTdHJpbmc+IHsKKworICAgICAgICBwcml2YXRlIGludCBpID0gMDsKKworICAgICAgICBASW5qZWN0CisgICAgICAgIHB1YmxpYyBDYWNoZVRlbXBsYXRlUHJvY2Vzc29yKENvbmZpZ3VyYXRpb24gY29uZmlnLCBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIpIHsKKyAgICAgICAgICAgIHN1cGVyKGNvbmZpZywgaW5qZWN0aW9uTWFuYWdlci5nZXRJbnN0YW5jZShTZXJ2bGV0Q29udGV4dC5jbGFzcyksICJmYWN0b3J5IiwgImZjdCIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZShmaW5hbCBTdHJpbmcgdGVtcGxhdGVQYXRoLCBmaW5hbCBSZWFkZXIgcmVhZGVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiAiIiArIGkrKzsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIFN0cmluZyB0ZW1wbGF0ZVJlZmVyZW5jZSwgZmluYWwgVmlld2FibGUgdmlld2FibGUsIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBvdXQud3JpdGUodGVtcGxhdGVSZWZlcmVuY2UuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIENhY2hlVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBjYWNoZTsKKworICAgICAgICBDYWNoZVRlc3QoZmluYWwgT2JqZWN0IGNhY2hlKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBzdXBlcihuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIC5yZWdpc3RlcihNdmNGZWF0dXJlLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAucmVnaXN0ZXIoQ2FjaGVUZW1wbGF0ZVByb2Nlc3Nvci5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgLnByb3BlcnR5KE12Y0ZlYXR1cmUuQ0FDSEVfVEVNUExBVEVTICsgIi5mYWN0b3J5IiwgY2FjaGUpKTsKKworICAgICAgICAgICAgdGhpcy5jYWNoZSA9IEJvb2xlYW4udmFsdWVPZihjYWNoZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RDYWNoZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGlzKCIwIikpOworCisgICAgICAgICAgICByZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoY2FjaGUgPyAiMCIgOiAiMSIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2FjaGVQb3NpdGl2ZVRlc3QgZXh0ZW5kcyBDYWNoZVRlc3QgeworCisgICAgICAgIHB1YmxpYyBDYWNoZVBvc2l0aXZlVGVzdCgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHN1cGVyKHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDYWNoZVBvc2l0aXZlU3RyaW5nVGVzdCBleHRlbmRzIENhY2hlVGVzdCB7CisKKyAgICAgICAgcHVibGljIENhY2hlUG9zaXRpdmVTdHJpbmdUZXN0KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICAgICAgc3VwZXIoInRydWUiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2FjaGVOZWdhdGl2ZVRlc3QgZXh0ZW5kcyBDYWNoZVRlc3QgeworCisgICAgICAgIHB1YmxpYyBDYWNoZU5lZ2F0aXZlVGVzdCgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHN1cGVyKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2FjaGVJbnZhbGlkVGVzdCBleHRlbmRzIENhY2hlVGVzdCB7CisKKyAgICAgICAgcHVibGljIENhY2hlSW52YWxpZFRlc3QoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgICAgICBzdXBlcigiaW52YWxpZCIpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvcGFja2FnZS1pbmZvLmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGZiMDY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvcGFja2FnZS1pbmZvLmphdmEKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworLyoqCisgKiBKZXJzZXkgRW5kIHRvIEVuZCBzZXJ2ZXIgdGVzdCBjbGFzc2VzLgorICovCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXI7CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9yb3V0aW5nL0luaGVyaXRhbmNlVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvcm91dGluZy9Jbmhlcml0YW5jZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDcyOTc1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvcm91dGluZy9Jbmhlcml0YW5jZVRlc3QuamF2YQpAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLnJvdXRpbmc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgSW5oZXJpdGFuY2VUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzKS5yZWdpc3RlcihXcml0ZXJBLmNsYXNzKS5yZWdpc3RlcihXcml0ZXJCLmNsYXNzKS5yZWdpc3RlcihXcml0ZXJTdHJpbmcuY2xhc3MpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQSB7CisKKyAgICAgICAgU3RyaW5nIHZhbHVlOworCisgICAgICAgIHB1YmxpYyBBKCkgeworICAgICAgICAgICAgdGhpcy52YWx1ZSA9ICJhIjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBBKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCIGV4dGVuZHMgQSB7CisKKyAgICAgICAgcHVibGljIEIoKSB7CisgICAgICAgICAgICBzdXBlcigiYiIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEIoZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICBzdXBlcigiYiIgKyB2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgQSBnZXRBKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBCKCJhIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFdyaXRlckEgaW1wbGVtZW50cyBNZXNzYWdlQm9keVdyaXRlcjxBPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIEEuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0eXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKGZpbmFsIEEgYSwgZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIEEgYSwgZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUsIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZSgoImEiICsgYS52YWx1ZSkuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvZHVjZXMoeyJ0ZXh0L3BsYWluIn0pCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBXcml0ZXJTdHJpbmcgaW1wbGVtZW50cyBNZXNzYWdlQm9keVdyaXRlcjxTdHJpbmc+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKGZpbmFsIFN0cmluZyBzLCBmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oZmluYWwgU3RyaW5nIHMsIGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLCBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBlbnRpdHlTdHJlYW0ud3JpdGUocy5nZXRCeXRlcygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm9kdWNlcygiYi9iIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFdyaXRlckIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVdyaXRlcjxCPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIEIuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0eXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKGZpbmFsIEIgYiwgZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIEIgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgZW50aXR5U3RyZWFtLndyaXRlKCgiYiIgKyBiLnZhbHVlKS5nZXRCeXRlcygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdyaXRlckVudGl0eUluaGVyaXRhbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFRoYXQodGFyZ2V0KCkucmVxdWVzdCgiYS9iIikuZ2V0KFN0cmluZy5jbGFzcyksIGVxdWFsVG8oImFiYSIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9yb3V0aW5nL1Jlc3BvbnNlTWVkaWFUeXBlRnJvbVByb3ZpZGVyc1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3JvdXRpbmcvUmVzcG9uc2VNZWRpYVR5cGVGcm9tUHJvdmlkZXJzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5ZWQ3OGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9yb3V0aW5nL1Jlc3BvbnNlTWVkaWFUeXBlRnJvbVByb3ZpZGVyc1Rlc3QuamF2YQpAQCAtMCwwICsxLDI3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLnJvdXRpbmc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgUmVzcG9uc2VNZWRpYVR5cGVGcm9tUHJvdmlkZXJzVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQFBhdGgoInJlc3BvbnNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc3BvbnNlUmVzb3VyY2UgeworCisgICAgICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IGdldExpc3QoKSB7CisgICAgICAgICAgICAvLyBtdXN0IGJlIGFuIEFycmF5TGlzdC4gQXJyYXlzLmFzTGlzdCBjcmVhdGVzIEFycmF5cyRBcnJheUxpc3QuCisgICAgICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdCgiYXJyYXkiLCAibGlzdCIpLnN0cmVhbSgpLmNvbGxlY3QoQ29sbGVjdG9ycy50b0NvbGxlY3Rpb24oQXJyYXlMaXN0OjpuZXcpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImxpc3QiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgcmVzcG9uc2VMaXN0KCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKGdldExpc3QoKSkuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29sbGVjdGlvbk1lc3NhZ2VCb2R5V3JpdGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8Q29sbGVjdGlvbjw/Pj4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlLmVxdWFscyhBcnJheUxpc3QuY2xhc3MpICYmIGdlbmVyaWNUeXBlLmVxdWFscyhBcnJheUxpc3QuY2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldFNpemUoZmluYWwgQ29sbGVjdGlvbjw/PiBvYmplY3RzLCBmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oZmluYWwgQ29sbGVjdGlvbjw/PiBvYmplY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBlbnRpdHlTdHJlYW0ud3JpdGUoIk9LIi5nZXRCeXRlcygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5jb3JyZWN0Q29sbGVjdGlvbk1lc3NhZ2VCb2R5V3JpdGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8Q29sbGVjdGlvbjw/Pj4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAhbmV3IENvbGxlY3Rpb25NZXNzYWdlQm9keVdyaXRlcigpLmlzV3JpdGVhYmxlKHR5cGUsIGdlbmVyaWNUeXBlLCBhbm5vdGF0aW9ucywgbWVkaWFUeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKGZpbmFsIENvbGxlY3Rpb248Pz4gb2JqZWN0cywgZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIENvbGxlY3Rpb248Pz4gb2JqZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgZW50aXR5U3RyZWFtLndyaXRlKCJFUlJPUiIuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNwb25zZUxpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoInJlc3BvbnNlIikucGF0aCgibGlzdCIpLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbygiT0siKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdHJpbmdCZWFuIHsKKworICAgICAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworICAgICAgICBwdWJsaWMgU3RyaW5nQmVhbigpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmdCZWFuKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdHJpbmdCZWFuTWVzc2FnZUJvZHlXcml0ZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVdyaXRlcjxTdHJpbmdCZWFuPiB7CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBNZWRpYVR5cGUgU1RSSU5HX0JFQU5fTVQgPSBuZXcgTWVkaWFUeXBlKCJzdHJpbmciLCAiYmVhbiIpOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlLmVxdWFscyhTdHJpbmdCZWFuLmNsYXNzKSAmJiBTVFJJTkdfQkVBTl9NVC5lcXVhbHMobWVkaWFUeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKGZpbmFsIFN0cmluZ0JlYW4gb2JqZWN0cywgZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIFN0cmluZ0JlYW4gb2JqZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgZW50aXR5U3RyZWFtLndyaXRlKG9iamVjdHMuZ2V0VmFsdWUoKS5nZXRCeXRlcygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJBY2NlcHRhYmxlTm9uV3JpdGVhYmxlTWV0aG9kUmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQWNjZXB0YWJsZU5vbldyaXRlYWJsZU1ldGhvZFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmdCZWFuIGdldFN0cmluZ0JlYW4oKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ0JlYW4oImdldFN0cmluZ0JlYW4iKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L2h0bWwiKQorICAgICAgICBwdWJsaWMgU3RyaW5nQmVhbiBnZXRUZXh0SHRtbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nQmVhbigiZ2V0VGV4dEh0bWwiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3hodG1sIikKKyAgICAgICAgcHVibGljIFN0cmluZ0JlYW4gZ2V0VGV4dFhIdG1sKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdCZWFuKCJnZXRUZXh0WEh0bWwiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBDb25zdW1lcygic3RyaW5nL2JlYW4iKQorICAgICAgICBAUHJvZHVjZXMoInN0cmluZy9iZWFuIikKKyAgICAgICAgcHVibGljIFN0cmluZ0JlYW4gcG9zdFN0cmluZ0JlYW4oZmluYWwgU3RyaW5nQmVhbiBzdHJpbmdCZWFuKSB7CisgICAgICAgICAgICByZXR1cm4gc3RyaW5nQmVhbjsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQcm9kdWNlcygic3RyaW5nL2JlYW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nQmVhbiBwb3N0U3RyaW5nQmVhbihmaW5hbCBTdHJpbmcgc3RyaW5nKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ0JlYW4oInBvc3RTdHJpbmdCZWFuXyIgKyBzdHJpbmcpOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQENvbnN1bWVzKCJzdHJpbmcvYmVhbiIpCisgICAgICAgIEBQYXRoKCJyZXNwb25zZSIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBwb3N0UmVzcG9uc2UoZmluYWwgU3RyaW5nQmVhbiBzdHJpbmdCZWFuKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soc3RyaW5nQmVhbikudHlwZSgic3RyaW5nL2JlYW4iKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoInJlc3BvbnNlIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHBvc3RSZXNwb25zZShmaW5hbCBTdHJpbmcgc3RyaW5nKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2sobmV3IFN0cmluZ0JlYW4oInBvc3RTdHJpbmdCZWFuXyIgKyBzdHJpbmcpKS50eXBlKCJzdHJpbmcvYmVhbiIpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRNZXRob2RSb3V0aW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJBY2NlcHRhYmxlTm9uV3JpdGVhYmxlTWV0aG9kUmVzb3VyY2UiKS5yZXF1ZXN0KCJ0ZXh0L2h0bWwiLCAidGV4dC94aHRtbCIsCisgICAgICAgICAgICAgICAgInN0cmluZy9iZWFuO3E9MC4yIikuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgZXF1YWxUbygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRNZWRpYVR5cGUoKSwgZXF1YWxUbyhTdHJpbmdCZWFuTWVzc2FnZUJvZHlXcml0ZXIuU1RSSU5HX0JFQU5fTVQpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGVxdWFsVG8oImdldFN0cmluZ0JlYW4iKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdE1ldGhvZFJvdXRpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoIkFjY2VwdGFibGVOb25Xcml0ZWFibGVNZXRob2RSZXNvdXJjZSIpLnJlcXVlc3QoInRleHQvaHRtbCIsICJ0ZXh0L3hodG1sIiwKKyAgICAgICAgICAgICAgICAic3RyaW5nL2JlYW47cT0wLjIiKS5wb3N0KEVudGl0eS5lbnRpdHkoInZhbHVlIiwgInN0cmluZy9iZWFuIikpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCksIGVxdWFsVG8oU3RyaW5nQmVhbk1lc3NhZ2VCb2R5V3JpdGVyLlNUUklOR19CRUFOX01UKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKCJwb3N0U3RyaW5nQmVhbl92YWx1ZSIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0TWV0aG9kUm91dGluZ1dpbGRjYXJkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJBY2NlcHRhYmxlTm9uV3JpdGVhYmxlTWV0aG9kUmVzb3VyY2UiKS5yZXF1ZXN0KCIqLyoiKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkoInZhbHVlIiwgInN0cmluZy9iZWFuIikpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCksIGVxdWFsVG8oU3RyaW5nQmVhbk1lc3NhZ2VCb2R5V3JpdGVyLlNUUklOR19CRUFOX01UKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKCJwb3N0U3RyaW5nQmVhbl92YWx1ZSIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0TWV0aG9kUm91dGluZ1Jlc3BvbnNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJBY2NlcHRhYmxlTm9uV3JpdGVhYmxlTWV0aG9kUmVzb3VyY2UiKS5wYXRoKCJyZXNwb25zZSIpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkoInZhbHVlIiwgInN0cmluZy9iZWFuIikpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCksIGVxdWFsVG8oU3RyaW5nQmVhbk1lc3NhZ2VCb2R5V3JpdGVyLlNUUklOR19CRUFOX01UKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKCJwb3N0U3RyaW5nQmVhbl92YWx1ZSIpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlc3BvbnNlUmVzb3VyY2UuY2xhc3MsIEFjY2VwdGFibGVOb25Xcml0ZWFibGVNZXRob2RSZXNvdXJjZS5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoQ29sbGVjdGlvbk1lc3NhZ2VCb2R5V3JpdGVyLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihJbmNvcnJlY3RDb2xsZWN0aW9uTWVzc2FnZUJvZHlXcml0ZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKFN0cmluZ0JlYW5NZXNzYWdlQm9keVdyaXRlci5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvc2Nhbm5pbmcvQ3VzdG9tRmVhdHVyZS5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvc2Nhbm5pbmcvQ3VzdG9tRmVhdHVyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMzcyNjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9zY2FubmluZy9DdXN0b21GZWF0dXJlLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLnNjYW5uaW5nOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5zY2FubmluZy5leHQuRXh0MVdyaXRlckludGVyY2VwdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIuc2Nhbm5pbmcuZXh0LkV4dDJXcml0ZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLnNjYW5uaW5nLmV4dC5FeHQzV3JpdGVySW50ZXJjZXB0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5zY2FubmluZy5leHQuRXh0NFdyaXRlckludGVyY2VwdG9yOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUHJvdmlkZXIKK3B1YmxpYyBjbGFzcyBDdXN0b21GZWF0dXJlIGltcGxlbWVudHMgRmVhdHVyZSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmUoZmluYWwgRmVhdHVyZUNvbnRleHQgY29udGV4dCkgeworICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKEV4dDNXcml0ZXJJbnRlcmNlcHRvci5jbGFzcywgMTAwMCk7CisgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoRXh0MldyaXRlckludGVyY2VwdG9yLmNsYXNzLCAxMDApOworICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKEV4dDFXcml0ZXJJbnRlcmNlcHRvci5JTlNUQU5DRSwgNTAwKTsKKyAgICAgICAgY29udGV4dC5yZWdpc3RlcihFeHQ0V3JpdGVySW50ZXJjZXB0b3IuSU5TVEFOQ0UsIDEpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9zY2FubmluZy9SYW5rZWRQcm92aWRlclNjYW5uaW5nVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvc2Nhbm5pbmcvUmFua2VkUHJvdmlkZXJTY2FubmluZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjVkZWZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvc2Nhbm5pbmcvUmFua2VkUHJvdmlkZXJTY2FubmluZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIuc2Nhbm5pbmc7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIFJhbmtlZFByb3ZpZGVyU2Nhbm5pbmdUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKCkucGFja2FnZXMoZmFsc2UsIFJhbmtlZFByb3ZpZGVyU2Nhbm5pbmdUZXN0LmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJhbmtlZFByb3ZpZGVyU2Nhbm5pbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgV2ViVGFyZ2V0IHQgPSB0YXJnZXQoKTsKKyAgICAgICAgdC5yZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcyk7CisKKyAgICAgICAgUmVzcG9uc2UgciA9IHQucGF0aCgiLyIpLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXQtZXh0NC1leHQyLWV4dDEtZXh0MyIsIHIucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3NjYW5uaW5nL1Jlc291cmNlLmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9zY2FubmluZy9SZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNmVjMjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9zY2FubmluZy9SZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5zY2FubmluZzsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLnNjYW5uaW5nLmV4dC5FeHQxV3JpdGVySW50ZXJjZXB0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5zY2FubmluZy5leHQuRXh0MldyaXRlckludGVyY2VwdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIuc2Nhbm5pbmcuZXh0LkV4dDNXcml0ZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLnNjYW5uaW5nLmV4dC5FeHQ0V3JpdGVySW50ZXJjZXB0b3I7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisqLworQFBhdGgoIi8iKQorcHVibGljIGNsYXNzIFJlc291cmNlIHsKKworICAgIHByaXZhdGUgZmluYWwgQ29uZmlndXJhdGlvbiBjb25maWc7CisKKyAgICBASW5qZWN0CisgICAgcHVibGljIFJlc291cmNlKGZpbmFsIENvbmZpZ3VyYXRpb24gY29uZmlnKSB7CisgICAgICAgIHRoaXMuY29uZmlnID0gY29uZmlnOworICAgIH0KKworICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWcuZ2V0Q2xhc3NlcygpLnNpemUoKSA+PSA0KTsgLy8gZS5nLiBXQURMIHJlc291cmNlIGNhbiBiZSB0aGVyZSB0b28uCisgICAgICAgIGFzc2VydFRydWUoY29uZmlnLmlzUmVnaXN0ZXJlZChDdXN0b21GZWF0dXJlLmNsYXNzKSk7CisgICAgICAgIGFzc2VydFRydWUoY29uZmlnLmlzUmVnaXN0ZXJlZChFeHQyV3JpdGVySW50ZXJjZXB0b3IuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWcuaXNSZWdpc3RlcmVkKEV4dDNXcml0ZXJJbnRlcmNlcHRvci5jbGFzcykpOworICAgICAgICBhc3NlcnRUcnVlKGNvbmZpZy5pc1JlZ2lzdGVyZWQoUmVzb3VyY2UuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWcuZ2V0Q2xhc3NlcygpLmNvbnRhaW5zKEN1c3RvbUZlYXR1cmUuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWcuZ2V0Q2xhc3NlcygpLmNvbnRhaW5zKEV4dDJXcml0ZXJJbnRlcmNlcHRvci5jbGFzcykpOworICAgICAgICBhc3NlcnRUcnVlKGNvbmZpZy5nZXRDbGFzc2VzKCkuY29udGFpbnMoRXh0M1dyaXRlckludGVyY2VwdG9yLmNsYXNzKSk7CisgICAgICAgIGFzc2VydFRydWUoY29uZmlnLmdldENsYXNzZXMoKS5jb250YWlucyhSZXNvdXJjZS5jbGFzcykpOworCisgICAgICAgIGFzc2VydFRydWUoY29uZmlnLmdldEluc3RhbmNlcygpLnNpemUoKSA+PSAyKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb25maWcuZ2V0SW5zdGFuY2VzKCkuY29udGFpbnMoRXh0MVdyaXRlckludGVyY2VwdG9yLklOU1RBTkNFKSk7CisgICAgICAgIGFzc2VydFRydWUoY29uZmlnLmdldEluc3RhbmNlcygpLmNvbnRhaW5zKEV4dDRXcml0ZXJJbnRlcmNlcHRvci5JTlNUQU5DRSkpOworICAgICAgICBhc3NlcnRUcnVlKGNvbmZpZy5pc1JlZ2lzdGVyZWQoRXh0MVdyaXRlckludGVyY2VwdG9yLmNsYXNzKSk7CisgICAgICAgIGFzc2VydFRydWUoY29uZmlnLmlzUmVnaXN0ZXJlZChFeHQ0V3JpdGVySW50ZXJjZXB0b3IuY2xhc3MpKTsKKworICAgICAgICBhc3NlcnRUcnVlKGNvbmZpZy5pc0VuYWJsZWQoQ3VzdG9tRmVhdHVyZS5jbGFzcykpOworCisgICAgICAgIHJldHVybiAiZ2V0IjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9zY2FubmluZy9leHQvRXh0MVdyaXRlckludGVyY2VwdG9yLmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9zY2FubmluZy9leHQvRXh0MVdyaXRlckludGVyY2VwdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdhYjJlYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3NjYW5uaW5nL2V4dC9FeHQxV3JpdGVySW50ZXJjZXB0b3IuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIuc2Nhbm5pbmcuZXh0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yQ29udGV4dDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFByb3ZpZGVyCitwdWJsaWMgY2xhc3MgRXh0MVdyaXRlckludGVyY2VwdG9yIGltcGxlbWVudHMgV3JpdGVySW50ZXJjZXB0b3IgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFeHQxV3JpdGVySW50ZXJjZXB0b3IgSU5TVEFOQ0UgPSBuZXcgRXh0MVdyaXRlckludGVyY2VwdG9yKCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhcm91bmRXcml0ZVRvKGZpbmFsIFdyaXRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgY29udGV4dC5zZXRFbnRpdHkoY29udGV4dC5nZXRFbnRpdHkoKSArICItZXh0MSIpOworICAgICAgICBjb250ZXh0LnByb2NlZWQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9zY2FubmluZy9leHQvRXh0MldyaXRlckludGVyY2VwdG9yLmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9zY2FubmluZy9leHQvRXh0MldyaXRlckludGVyY2VwdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRhM2EyMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3NjYW5uaW5nL2V4dC9FeHQyV3JpdGVySW50ZXJjZXB0b3IuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIuc2Nhbm5pbmcuZXh0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yQ29udGV4dDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFByb3ZpZGVyCitwdWJsaWMgY2xhc3MgRXh0MldyaXRlckludGVyY2VwdG9yIGltcGxlbWVudHMgV3JpdGVySW50ZXJjZXB0b3IgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYXJvdW5kV3JpdGVUbyhmaW5hbCBXcml0ZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGNvbnRleHQuc2V0RW50aXR5KGNvbnRleHQuZ2V0RW50aXR5KCkgKyAiLWV4dDIiKTsKKyAgICAgICAgY29udGV4dC5wcm9jZWVkKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvc2Nhbm5pbmcvZXh0L0V4dDNXcml0ZXJJbnRlcmNlcHRvci5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvc2Nhbm5pbmcvZXh0L0V4dDNXcml0ZXJJbnRlcmNlcHRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMWU0NmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9zY2FubmluZy9leHQvRXh0M1dyaXRlckludGVyY2VwdG9yLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLnNjYW5uaW5nLmV4dDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvckNvbnRleHQ7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BQcm92aWRlcgorcHVibGljIGNsYXNzIEV4dDNXcml0ZXJJbnRlcmNlcHRvciBpbXBsZW1lbnRzIFdyaXRlckludGVyY2VwdG9yIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFyb3VuZFdyaXRlVG8oZmluYWwgV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICBjb250ZXh0LnNldEVudGl0eShjb250ZXh0LmdldEVudGl0eSgpICsgIi1leHQzIik7CisgICAgICAgIGNvbnRleHQucHJvY2VlZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3NjYW5uaW5nL2V4dC9FeHQ0V3JpdGVySW50ZXJjZXB0b3IuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3NjYW5uaW5nL2V4dC9FeHQ0V3JpdGVySW50ZXJjZXB0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWFjYTYzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvc2Nhbm5pbmcvZXh0L0V4dDRXcml0ZXJJbnRlcmNlcHRvci5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5zY2FubmluZy5leHQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0OworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUHJvdmlkZXIKK3B1YmxpYyBjbGFzcyBFeHQ0V3JpdGVySW50ZXJjZXB0b3IgaW1wbGVtZW50cyBXcml0ZXJJbnRlcmNlcHRvciB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEV4dDRXcml0ZXJJbnRlcmNlcHRvciBJTlNUQU5DRSA9IG5ldyBFeHQ0V3JpdGVySW50ZXJjZXB0b3IoKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFyb3VuZFdyaXRlVG8oZmluYWwgV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICBjb250ZXh0LnNldEVudGl0eShjb250ZXh0LmdldEVudGl0eSgpICsgIi1leHQ0Iik7CisgICAgICAgIGNvbnRleHQucHJvY2VlZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vQmFzaWNCYWRTdWJSZXNvdXJjZS5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi9CYXNpY0JhZFN1YlJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFhOWI4NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vQmFzaWNCYWRTdWJSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci52YWxpZGF0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5SZXNvdXJjZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworCitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5OdWxsOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgQmFzaWNCYWRTdWJSZXNvdXJjZSB7CisKKyAgICBAQ29udGV4dAorICAgIEBOdWxsCisgICAgcHJpdmF0ZSBSZXNvdXJjZUNvbnRleHQgcmVzb3VyY2VDb250ZXh0OworCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiU2hvdWxkIG5vdCBnZXQgaGVyZS4iKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL0Jhc2ljUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vQmFzaWNSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwYzU5MzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL0Jhc2ljUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLnZhbGlkYXRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5Db29raWVQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5EZWZhdWx0VmFsdWU7CitpbXBvcnQgamF2YXgud3MucnMuRm9ybVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5IZWFkZXJQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5NYXRyaXhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlJlc291cmNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXF1ZXN0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk51bGw7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5TaXplOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUGF0aCgiYmVhbnZhbGlkYXRpb24iKQorcHVibGljIGNsYXNzIEJhc2ljUmVzb3VyY2UgeworCisgICAgQE5vdE51bGwKKyAgICBAQ29udGV4dAorICAgIHByaXZhdGUgUmVzb3VyY2VDb250ZXh0IHJlc291cmNlQ29udGV4dDsKKworICAgIHByaXZhdGUgU3RyaW5nIGdldElucHV0UGFyYW1zUmVzcG9uc2UoZmluYWwgU3RyaW5nIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWF0cml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHF1ZXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjb29raWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZm9ybSkgeworCisgICAgICAgIHJldHVybiBwYXRoICsgJ18nICsgbWF0cml4ICsgJ18nICsgcXVlcnkgKyAnXycgKyBoZWFkZXIgKyAnXycgKyBjb29raWUgKyAnXycgKyBmb3JtOworICAgIH0KKworICAgIEBQT1NUCisgICAgQFBhdGgoImJhc2ljUGFyYW0ve3BhdGg6IC4qfSIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKQorICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJVbnVzZWRQYXJhbWV0ZXJzIikKKyAgICBwdWJsaWMgU3RyaW5nIHZhbGlkYXRlUGFyYW1ldGVyc0Jhc2ljQ29uc3RyYWludCgKKyAgICAgICAgICAgIEBOb3ROdWxsIEBQYXRoUGFyYW0oInBhdGgiKSBmaW5hbCBTdHJpbmcgcGF0aCwKKyAgICAgICAgICAgIEBOb3ROdWxsIEBNYXRyaXhQYXJhbSgibWF0cml4IikgZmluYWwgU3RyaW5nIG1hdHJpeCwKKyAgICAgICAgICAgIEBOb3ROdWxsIEBRdWVyeVBhcmFtKCJxdWVyeSIpIGZpbmFsIFN0cmluZyBxdWVyeSwKKyAgICAgICAgICAgIEBOb3ROdWxsIEBIZWFkZXJQYXJhbSgiaGVhZGVyIikgZmluYWwgU3RyaW5nIGhlYWRlciwKKyAgICAgICAgICAgIEBOb3ROdWxsIEBDb29raWVQYXJhbSgiY29va2llIikgZmluYWwgU3RyaW5nIGNvb2tpZSwKKyAgICAgICAgICAgIEBOb3ROdWxsIEBGb3JtUGFyYW0oImZvcm0iKSBmaW5hbCBTdHJpbmcgZm9ybSwKKyAgICAgICAgICAgIEBOb3ROdWxsIEBDb250ZXh0IGZpbmFsIFJlcXVlc3QgcmVxdWVzdCkgeworCisgICAgICAgIHJldHVybiBnZXRJbnB1dFBhcmFtc1Jlc3BvbnNlKHBhdGgsIG1hdHJpeCwgcXVlcnksIGhlYWRlciwgY29va2llLCBmb3JtKTsKKyAgICB9CisKKyAgICBAUE9TVAorICAgIEBQYXRoKCJiYXNpY0RlZmF1bHRQYXJhbS97cGF0aDogLip9IikKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCIpCisgICAgQFN1cHByZXNzV2FybmluZ3MoIlVudXNlZFBhcmFtZXRlcnMiKQorICAgIHB1YmxpYyBTdHJpbmcgdmFsaWRhdGVQYXJhbWV0ZXJzRGVmYXVsdEJhc2ljQ29uc3RyYWludCgKKyAgICAgICAgICAgIEBOb3ROdWxsIEBEZWZhdWx0VmFsdWUoInBhdGhQYXJhbSIpIEBQYXRoUGFyYW0oInBhdGgiKSBmaW5hbCBTdHJpbmcgcGF0aCwKKyAgICAgICAgICAgIEBOb3ROdWxsIEBEZWZhdWx0VmFsdWUoIm1hdHJpeFBhcmFtIikgQE1hdHJpeFBhcmFtKCJtYXRyaXgiKSBmaW5hbCBTdHJpbmcgbWF0cml4LAorICAgICAgICAgICAgQE5vdE51bGwgQERlZmF1bHRWYWx1ZSgicXVlcnlQYXJhbSIpIEBRdWVyeVBhcmFtKCJxdWVyeSIpIGZpbmFsIFN0cmluZyBxdWVyeSwKKyAgICAgICAgICAgIEBOb3ROdWxsIEBEZWZhdWx0VmFsdWUoImhlYWRlclBhcmFtIikgQEhlYWRlclBhcmFtKCJoZWFkZXIiKSBmaW5hbCBTdHJpbmcgaGVhZGVyLAorICAgICAgICAgICAgQE5vdE51bGwgQERlZmF1bHRWYWx1ZSgiY29va2llUGFyYW0iKSBAQ29va2llUGFyYW0oImNvb2tpZSIpIGZpbmFsIFN0cmluZyBjb29raWUsCisgICAgICAgICAgICBATm90TnVsbCBARGVmYXVsdFZhbHVlKCJmb3JtUGFyYW0iKSBARm9ybVBhcmFtKCJmb3JtIikgZmluYWwgU3RyaW5nIGZvcm0sCisgICAgICAgICAgICBATm90TnVsbCBAQ29udGV4dCBmaW5hbCBSZXF1ZXN0IHJlcXVlc3QpIHsKKworICAgICAgICByZXR1cm4gZ2V0SW5wdXRQYXJhbXNSZXNwb25zZShwYXRoLCBtYXRyaXgsIHF1ZXJ5LCBoZWFkZXIsIGNvb2tpZSwgZm9ybSk7CisgICAgfQorCisgICAgQFBPU1QKKyAgICBAUGF0aCgiY3VzdG9tUGFyYW0ve3BhdGg6IC4qfSIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKQorICAgIHB1YmxpYyBTdHJpbmcgdmFsaWRhdGVQYXJhbWV0ZXJzQ3VzdG9tQ29uc3RyYWludCgKKyAgICAgICAgICAgIEBQYXJhbUNvbnN0cmFpbnQgQFBhdGhQYXJhbSgicGF0aCIpIGZpbmFsIFN0cmluZyBwYXRoLAorICAgICAgICAgICAgQFBhcmFtQ29uc3RyYWludCBATWF0cml4UGFyYW0oIm1hdHJpeCIpIGZpbmFsIFN0cmluZyBtYXRyaXgsCisgICAgICAgICAgICBAUGFyYW1Db25zdHJhaW50IEBRdWVyeVBhcmFtKCJxdWVyeSIpIGZpbmFsIFN0cmluZyBxdWVyeSwKKyAgICAgICAgICAgIEBQYXJhbUNvbnN0cmFpbnQgQEhlYWRlclBhcmFtKCJoZWFkZXIiKSBmaW5hbCBTdHJpbmcgaGVhZGVyLAorICAgICAgICAgICAgQFBhcmFtQ29uc3RyYWludCBAQ29va2llUGFyYW0oImNvb2tpZSIpIGZpbmFsIFN0cmluZyBjb29raWUsCisgICAgICAgICAgICBAUGFyYW1Db25zdHJhaW50IEBGb3JtUGFyYW0oImZvcm0iKSBmaW5hbCBTdHJpbmcgZm9ybSkgeworCisgICAgICAgIHJldHVybiBnZXRJbnB1dFBhcmFtc1Jlc3BvbnNlKHBhdGgsIG1hdHJpeCwgcXVlcnksIGhlYWRlciwgY29va2llLCBmb3JtKTsKKyAgICB9CisKKyAgICBAUE9TVAorICAgIEBQYXRoKCJtaXhlZFBhcmFtL3twYXRoOiAuKn0iKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikKKyAgICBwdWJsaWMgU3RyaW5nIHZhbGlkYXRlUGFyYW1ldGVyc01peGVkQ29uc3RyYWludCgKKyAgICAgICAgICAgIEBTaXplKG1heCA9IDExKSBAUGFyYW1Db25zdHJhaW50IEBQYXRoUGFyYW0oInBhdGgiKSBmaW5hbCBTdHJpbmcgcGF0aCwKKyAgICAgICAgICAgIEBTaXplKG1heCA9IDExKSBAUGFyYW1Db25zdHJhaW50IEBNYXRyaXhQYXJhbSgibWF0cml4IikgZmluYWwgU3RyaW5nIG1hdHJpeCwKKyAgICAgICAgICAgIEBTaXplKG1heCA9IDExKSBAUGFyYW1Db25zdHJhaW50IEBRdWVyeVBhcmFtKCJxdWVyeSIpIGZpbmFsIFN0cmluZyBxdWVyeSwKKyAgICAgICAgICAgIEBTaXplKG1heCA9IDExKSBAUGFyYW1Db25zdHJhaW50IEBIZWFkZXJQYXJhbSgiaGVhZGVyIikgZmluYWwgU3RyaW5nIGhlYWRlciwKKyAgICAgICAgICAgIEBTaXplKG1heCA9IDExKSBAUGFyYW1Db25zdHJhaW50IEBDb29raWVQYXJhbSgiY29va2llIikgZmluYWwgU3RyaW5nIGNvb2tpZSwKKyAgICAgICAgICAgIEBTaXplKG1heCA9IDExKSBAUGFyYW1Db25zdHJhaW50IEBGb3JtUGFyYW0oImZvcm0iKSBmaW5hbCBTdHJpbmcgZm9ybSkgeworCisgICAgICAgIHJldHVybiBnZXRJbnB1dFBhcmFtc1Jlc3BvbnNlKHBhdGgsIG1hdHJpeCwgcXVlcnksIGhlYWRlciwgY29va2llLCBmb3JtKTsKKyAgICB9CisKKyAgICBAUE9TVAorICAgIEBQYXRoKCJtdWx0aXBsZVBhcmFtL3twYXRoOiAuKn0iKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikKKyAgICBwdWJsaWMgU3RyaW5nIHZhbGlkYXRlUGFyYW1ldGVyc011bHRpcGxlQ29uc3RyYWludCgKKyAgICAgICAgICAgIEBNdWx0aXBsZVBhcmFtQ29uc3RyYWludCBAUGF0aFBhcmFtKCJwYXRoIikgZmluYWwgU3RyaW5nIHBhdGgsCisgICAgICAgICAgICBATXVsdGlwbGVQYXJhbUNvbnN0cmFpbnQgQE1hdHJpeFBhcmFtKCJtYXRyaXgiKSBmaW5hbCBTdHJpbmcgbWF0cml4LAorICAgICAgICAgICAgQE11bHRpcGxlUGFyYW1Db25zdHJhaW50IEBRdWVyeVBhcmFtKCJxdWVyeSIpIGZpbmFsIFN0cmluZyBxdWVyeSwKKyAgICAgICAgICAgIEBNdWx0aXBsZVBhcmFtQ29uc3RyYWludCBASGVhZGVyUGFyYW0oImhlYWRlciIpIGZpbmFsIFN0cmluZyBoZWFkZXIsCisgICAgICAgICAgICBATXVsdGlwbGVQYXJhbUNvbnN0cmFpbnQgQENvb2tpZVBhcmFtKCJjb29raWUiKSBmaW5hbCBTdHJpbmcgY29va2llLAorICAgICAgICAgICAgQE11bHRpcGxlUGFyYW1Db25zdHJhaW50IEBGb3JtUGFyYW0oImZvcm0iKSBmaW5hbCBTdHJpbmcgZm9ybSkgeworCisgICAgICAgIHJldHVybiBnZXRJbnB1dFBhcmFtc1Jlc3BvbnNlKHBhdGgsIG1hdHJpeCwgcXVlcnksIGhlYWRlciwgY29va2llLCBmb3JtKTsKKyAgICB9CisKKyAgICBAUE9TVAorICAgIEBQYXRoKCJlbXB0eUJlYW5QYXJhbSIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9jb250YWN0QmVhbiIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9jb250YWN0QmVhbiIpCisgICAgcHVibGljIENvbnRhY3RCZWFuIHZhbGlkYXRlRW1wdHlCZWFuUGFyYW1Db25zdHJhaW50KEBOb3ROdWxsIGZpbmFsIENvbnRhY3RCZWFuIGJlYW4pIHsKKyAgICAgICAgcmV0dXJuIGJlYW47CisgICAgfQorCisgICAgQFBPU1QKKyAgICBAUGF0aCgidmFsaWRCZWFuUGFyYW0iKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vY29udGFjdEJlYW4iKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vY29udGFjdEJlYW4iKQorICAgIHB1YmxpYyBDb250YWN0QmVhbiB2YWxpZGF0ZVZhbGlkQmVhblBhcmFtQ29uc3RyYWludChATm90TnVsbCBAVmFsaWQgZmluYWwgQ29udGFjdEJlYW4gYmVhbikgeworICAgICAgICByZXR1cm4gYmVhbjsKKyAgICB9CisKKyAgICBAUE9TVAorICAgIEBQYXRoKCJjdXN0b21CZWFuUGFyYW0iKQorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vY29udGFjdEJlYW4iKQorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vY29udGFjdEJlYW4iKQorICAgIHB1YmxpYyBDb250YWN0QmVhbiB2YWxpZGF0ZUN1c3RvbUJlYW5QYXJhbUNvbnN0cmFpbnQoQE9uZUNvbnRhY3QgZmluYWwgQ29udGFjdEJlYW4gYmVhbikgeworICAgICAgICByZXR1cm4gYmVhbjsKKyAgICB9CisKKyAgICBAUE9TVAorICAgIEBQYXRoKCJlbXB0eUJlYW5SZXNwb25zZSIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9jb250YWN0QmVhbiIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9jb250YWN0QmVhbiIpCisgICAgQE5vdE51bGwKKyAgICBwdWJsaWMgQ29udGFjdEJlYW4gdmFsaWRhdGVFbXB0eUJlYW5SZXNwb25zZUNvbnN0cmFpbnQoZmluYWwgQ29udGFjdEJlYW4gYmVhbikgeworICAgICAgICByZXR1cm4gYmVhbjsKKyAgICB9CisKKyAgICBAUE9TVAorICAgIEBQYXRoKCJ2YWxpZEJlYW5SZXNwb25zZSIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9jb250YWN0QmVhbiIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9jb250YWN0QmVhbiIpCisgICAgQE5vdE51bGwKKyAgICBAVmFsaWQKKyAgICBwdWJsaWMgQ29udGFjdEJlYW4gdmFsaWRhdGVWYWxpZEJlYW5SZXNwb25zZUNvbnN0cmFpbnQoZmluYWwgQ29udGFjdEJlYW4gYmVhbikgeworICAgICAgICByZXR1cm4gYmVhbjsKKyAgICB9CisKKyAgICBAUE9TVAorICAgIEBQYXRoKCJ2YWxpZEJlYW5XcmFwcGVkSW5SZXNwb25zZSIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9jb250YWN0QmVhbiIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9jb250YWN0QmVhbiIpCisgICAgQE5vdE51bGwKKyAgICBAVmFsaWQKKyAgICBwdWJsaWMgUmVzcG9uc2UgdmFsaWRhdGVWYWxpZEJlYW5XcmFwcGVkSW5SZXNwb25zZUNvbnN0cmFpbnQoZmluYWwgQ29udGFjdEJlYW4gYmVhbikgeworICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soYmVhbikudHlwZSgiYXBwbGljYXRpb24vY29udGFjdEJlYW4iKS5idWlsZCgpOworICAgIH0KKworICAgIEBQT1NUCisgICAgQFBhdGgoImN1c3RvbUJlYW5SZXNwb25zZSIpCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9jb250YWN0QmVhbiIpCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9jb250YWN0QmVhbiIpCisgICAgQE9uZUNvbnRhY3QKKyAgICBwdWJsaWMgQ29udGFjdEJlYW4gdmFsaWRhdGVDdXN0b21CZWFuUmVzcG9uc2VDb25zdHJhaW50KGZpbmFsIENvbnRhY3RCZWFuIGJlYW4pIHsKKyAgICAgICAgcmV0dXJuIGJlYW47CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJpbnZhbGlkQ29udGV4dCIpCisgICAgQFN1cHByZXNzV2FybmluZ3MoIlVudXNlZFBhcmFtZXRlcnMiKQorICAgIHB1YmxpYyBSZXNwb25zZSBpbnZhbGlkQ29udGV4dChATnVsbCBAQ29udGV4dCBmaW5hbCBSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyg1MDApLmJ1aWxkKCk7CisgICAgfQorCisgICAgQFBhdGgoInN1Yi92YWxpZFJlc291cmNlQ29udGV4dEluc3RhbmNlIikKKyAgICBwdWJsaWMgQmFzaWNTdWJSZXNvdXJjZSBnZXRTdWJSZXNvdXJjZVZhbGlkUmVzb3VyY2VDb250ZXh0SW5zdGFuY2UoKSB7CisgICAgICAgIHJldHVybiByZXNvdXJjZUNvbnRleHQuaW5pdFJlc291cmNlKG5ldyBCYXNpY1N1YlJlc291cmNlKHJlc291cmNlQ29udGV4dCkpOworICAgIH0KKworICAgIEBQYXRoKCJzdWIvbnVsbFJlc291cmNlQ29udGV4dEluc3RhbmNlIikKKyAgICBwdWJsaWMgQmFzaWNTdWJSZXNvdXJjZSBnZXRTdWJSZXNvdXJjZU51bGxSZXNvdXJjZUNvbnRleHRJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIHJlc291cmNlQ29udGV4dC5pbml0UmVzb3VyY2UobmV3IEJhc2ljU3ViUmVzb3VyY2UobnVsbCkpOworICAgIH0KKworICAgIEBQYXRoKCJzdWIvbnVsbFJlc291cmNlQ29udGV4dENsYXNzIikKKyAgICBwdWJsaWMgQmFzaWNTdWJSZXNvdXJjZSBnZXRTdWJSZXNvdXJjZU51bGxSZXNvdXJjZUNvbnRleHRDbGFzcygpIHsKKyAgICAgICAgcmV0dXJuIHJlc291cmNlQ29udGV4dC5nZXRSZXNvdXJjZShCYXNpY1N1YlJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAUGF0aCgic3ViL3dyb25nIikKKyAgICBwdWJsaWMgQmFzaWNCYWRTdWJSZXNvdXJjZSBnZXRXcm9uZ1N1YlJlc291cmNlKCkgeworICAgICAgICByZXR1cm4gcmVzb3VyY2VDb250ZXh0LmdldFJlc291cmNlKEJhc2ljQmFkU3ViUmVzb3VyY2UuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vQmFzaWNTdWJSZXNvdXJjZS5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi9CYXNpY1N1YlJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVjMGUxNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vQmFzaWNTdWJSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci52YWxpZGF0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuRm9ybVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlJlc291cmNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CisKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLmV4ZWN1dGFibGUuRXhlY3V0YWJsZVR5cGU7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5leGVjdXRhYmxlLlZhbGlkYXRlT25FeGVjdXRpb247CisKK2ltcG9ydCBvcmcuaGliZXJuYXRlLnZhbGlkYXRvci5jb25zdHJhaW50cy5FbWFpbDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQE5vbkVtcHR5TmFtZXMKK0BWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5BTEwpCitwdWJsaWMgY2xhc3MgQmFzaWNTdWJSZXNvdXJjZSB7CisKKyAgICBATm90TnVsbAorICAgIEBGb3JtUGFyYW0oImZpcnN0TmFtZSIpCisgICAgcHJpdmF0ZSBTdHJpbmcgZmlyc3ROYW1lOworCisgICAgQE5vdE51bGwKKyAgICBARm9ybVBhcmFtKCJsYXN0TmFtZSIpCisgICAgcHJpdmF0ZSBTdHJpbmcgbGFzdE5hbWU7CisKKyAgICBwcml2YXRlIFN0cmluZyBlbWFpbDsKKworICAgIC8qKgorICAgICAqIE5vdGU6IENvbnN0cnVjdG9yIGlucHV0IHBhcmFtZXRlciBzaG91bGQgbm90IGJlIHZhbGlkYXRlZC4KKyAgICAgKi8KKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiVW51c2VkUGFyYW1ldGVycyIpCisgICAgcHVibGljIEJhc2ljU3ViUmVzb3VyY2UoQE5vdE51bGwgQENvbnRleHQgZmluYWwgUmVzb3VyY2VDb250ZXh0IHJlc291cmNlQ29udGV4dCkgeworICAgIH0KKworICAgIEBGb3JtUGFyYW0oImVtYWlsIikKKyAgICBwdWJsaWMgdm9pZCBzZXRFbWFpbChTdHJpbmcgZW1haWwpIHsKKyAgICAgICAgdGhpcy5lbWFpbCA9IGVtYWlsOworICAgIH0KKworICAgIEBOb3ROdWxsCisgICAgQEVtYWlsKHJlZ2V4cCA9ICJbYS16QS1aMC05Ll8lLV0rQFthLXpBLVowLTkuLV0rXFwuW2EtekEtWl17Miw0fSIpCisgICAgcHVibGljIFN0cmluZyBnZXRFbWFpbCgpIHsKKyAgICAgICAgcmV0dXJuIGVtYWlsOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rmlyc3ROYW1lKCkgeworICAgICAgICByZXR1cm4gZmlyc3ROYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFzdE5hbWUoKSB7CisgICAgICAgIHJldHVybiBsYXN0TmFtZTsKKyAgICB9CisKKyAgICBAUE9TVAorICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2NvbnRhY3RCZWFuIikKKyAgICBAVmFsaWQKKyAgICBwdWJsaWMgQ29udGFjdEJlYW4gcG9zdENvbnRhY3RWYWxpZGF0aW9uQmVhbigpIHsKKyAgICAgICAgZmluYWwgQ29udGFjdEJlYW4gY29udGFjdEJlYW4gPSBuZXcgQ29udGFjdEJlYW4oKTsKKyAgICAgICAgY29udGFjdEJlYW4uc2V0TmFtZShmaXJzdE5hbWUgKyAiICIgKyBsYXN0TmFtZSk7CisgICAgICAgIGNvbnRhY3RCZWFuLnNldEVtYWlsKGdldEVtYWlsKCkpOworICAgICAgICByZXR1cm4gY29udGFjdEJlYW47CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi9CYXNpY1ZhbGlkYXRpb25UZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL0Jhc2ljVmFsaWRhdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTRkNDcyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi9CYXNpY1ZhbGlkYXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSw2NzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci52YWxpZGF0aW9uOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5Db29raWVQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Gb3JtUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuSGVhZGVyUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuTWF0cml4UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuSW52b2NhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Gb3JtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW94eS54bWwuTW94eVhtbEZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBCYXNpY1ZhbGlkYXRpb25UZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworCisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKEJhc2ljUmVzb3VyY2UuY2xhc3MpOworCisgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVyKENvbnRhY3RCZWFuUHJvdmlkZXIuY2xhc3MpOworICAgICAgICByZXNvdXJjZUNvbmZpZy5yZWdpc3RlcihNb3h5WG1sRmVhdHVyZS5jbGFzcyk7CisKKyAgICAgICAgcmVzb3VyY2VDb25maWcucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5CVl9TRU5EX0VSUk9SX0lOX1JFU1BPTlNFLCB0cnVlKTsKKworICAgICAgICByZXR1cm4gcmVzb3VyY2VDb25maWc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KGZpbmFsIENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgc3VwZXIuY29uZmlndXJlQ2xpZW50KGNvbmZpZyk7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihDb250YWN0QmVhblByb3ZpZGVyLmNsYXNzKTsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKE1veHlYbWxGZWF0dXJlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL2NvbnRhY3RCZWFuIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2NvbnRhY3RCZWFuIikKKyAgICBAUHJvdmlkZXIKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbnRhY3RCZWFuUHJvdmlkZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVJlYWRlcjxDb250YWN0QmVhbj4sIE1lc3NhZ2VCb2R5V3JpdGVyPENvbnRhY3RCZWFuPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZS5lcXVhbHMoQ29udGFjdEJlYW4uY2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDb250YWN0QmVhbiByZWFkRnJvbShDbGFzczxDb250YWN0QmVhbj4gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0SW5wdXRTdHJlYW0gb2JqZWN0SW5wdXRTdHJlYW0gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oZW50aXR5U3RyZWFtKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gKENvbnRhY3RCZWFuKSBvYmplY3RJbnB1dFN0cmVhbS5yZWFkT2JqZWN0KCk7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcuCisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlLmVxdWFscyhDb250YWN0QmVhbi5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShDb250YWN0QmVhbiBjb250YWN0QmVhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKENvbnRhY3RCZWFuIGNvbnRhY3RCZWFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oZW50aXR5U3RyZWFtKS53cml0ZU9iamVjdChjb250YWN0QmVhbik7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcuCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBQYXJhbUJlYW4geworCisgICAgICAgIEBIZWFkZXJQYXJhbSgiaGVhZGVyIikKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgaGVhZGVyUGFyYW07CisKKyAgICAgICAgQFBhdGhQYXJhbSgicGF0aCIpCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHBhdGhQYXJhbTsKKworICAgICAgICBATWF0cml4UGFyYW0oIm1hdHJpeCIpCisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1hdHJpeFBhcmFtOworCisgICAgICAgIEBRdWVyeVBhcmFtKCJxdWVyeSIpCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHF1ZXJ5UGFyYW07CisKKyAgICAgICAgQENvb2tpZVBhcmFtKCJjb29raWUiKQorICAgICAgICBwcml2YXRlIFN0cmluZyBjb29raWU7CisKKyAgICAgICAgQEZvcm1QYXJhbSgiZm9ybSIpCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGZvcm1QYXJhbTsKKworICAgICAgICBwdWJsaWMgUGFyYW1CZWFuKCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb29raWUoKSB7CisgICAgICAgICAgICByZXR1cm4gY29va2llOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Q29va2llKFN0cmluZyBjb29raWUpIHsKKyAgICAgICAgICAgIHRoaXMuY29va2llID0gY29va2llOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRGb3JtUGFyYW0oKSB7CisgICAgICAgICAgICByZXR1cm4gZm9ybVBhcmFtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0Rm9ybVBhcmFtKFN0cmluZyBmb3JtUGFyYW0pIHsKKyAgICAgICAgICAgIHRoaXMuZm9ybVBhcmFtID0gZm9ybVBhcmFtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRIZWFkZXJQYXJhbSgpIHsKKyAgICAgICAgICAgIHJldHVybiBoZWFkZXJQYXJhbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEhlYWRlclBhcmFtKFN0cmluZyBoZWFkZXJQYXJhbSkgeworICAgICAgICAgICAgdGhpcy5oZWFkZXJQYXJhbSA9IGhlYWRlclBhcmFtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRNYXRyaXhQYXJhbSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtYXRyaXhQYXJhbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE1hdHJpeFBhcmFtKFN0cmluZyBtYXRyaXhQYXJhbSkgeworICAgICAgICAgICAgdGhpcy5tYXRyaXhQYXJhbSA9IG1hdHJpeFBhcmFtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRQYXRoUGFyYW0oKSB7CisgICAgICAgICAgICByZXR1cm4gcGF0aFBhcmFtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UGF0aFBhcmFtKFN0cmluZyBwYXRoUGFyYW0pIHsKKyAgICAgICAgICAgIHRoaXMucGF0aFBhcmFtID0gcGF0aFBhcmFtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRRdWVyeVBhcmFtKCkgeworICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5UGFyYW07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRRdWVyeVBhcmFtKFN0cmluZyBxdWVyeVBhcmFtKSB7CisgICAgICAgICAgICB0aGlzLnF1ZXJ5UGFyYW0gPSBxdWVyeVBhcmFtOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIkJlYW57IgorICAgICAgICAgICAgICAgICAgICArICJjb29raWU9JyIgKyBjb29raWUgKyAnXCcnCisgICAgICAgICAgICAgICAgICAgICsgIiwgZm9ybVBhcmFtPSciICsgZm9ybVBhcmFtICsgJ1wnJworICAgICAgICAgICAgICAgICAgICArICIsIGhlYWRlclBhcmFtPSciICsgaGVhZGVyUGFyYW0gKyAnXCcnCisgICAgICAgICAgICAgICAgICAgICsgIiwgbWF0cml4UGFyYW09JyIgKyBtYXRyaXhQYXJhbSArICdcJycKKyAgICAgICAgICAgICAgICAgICAgKyAiLCBwYXRoUGFyYW09JyIgKyBwYXRoUGFyYW0gKyAnXCcnCisgICAgICAgICAgICAgICAgICAgICsgIiwgcXVlcnlQYXJhbT0nIiArIHF1ZXJ5UGFyYW0gKyAnXCcnCisgICAgICAgICAgICAgICAgICAgICsgJ30nOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBQYXJhbUJlYW4gZ2V0RGVmYXVsdFBhcmFtQmVhbigpIHsKKyAgICAgICAgZmluYWwgUGFyYW1CZWFuIHBhcmFtQmVhbiA9IG5ldyBQYXJhbUJlYW4oKTsKKyAgICAgICAgcGFyYW1CZWFuLnNldENvb2tpZSgiY29va2llUGFyYW0iKTsKKyAgICAgICAgcGFyYW1CZWFuLnNldEZvcm1QYXJhbSgiZm9ybVBhcmFtIik7CisgICAgICAgIHBhcmFtQmVhbi5zZXRIZWFkZXJQYXJhbSgiaGVhZGVyUGFyYW0iKTsKKyAgICAgICAgcGFyYW1CZWFuLnNldE1hdHJpeFBhcmFtKCJtYXRyaXhQYXJhbSIpOworICAgICAgICBwYXJhbUJlYW4uc2V0UGF0aFBhcmFtKCJwYXRoUGFyYW0iKTsKKyAgICAgICAgcGFyYW1CZWFuLnNldFF1ZXJ5UGFyYW0oInF1ZXJ5UGFyYW0iKTsKKyAgICAgICAgcmV0dXJuIHBhcmFtQmVhbjsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlc3BvbnNlIHRlc3RJbnB1dFBhcmFtcyhmaW5hbCBTdHJpbmcgcGF0aCwgZmluYWwgUGFyYW1CZWFuIHBhcmFtQmVhbikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEZvcm0gZm9ybSA9IG5ldyBGb3JtKCk7CisgICAgICAgIGZvcm0uYXNNYXAoKS5wdXQoImZvcm0iLCBBcnJheXMuYXNMaXN0KHBhcmFtQmVhbi5nZXRGb3JtUGFyYW0oKSkpOworCisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoImJlYW52YWxpZGF0aW9uIikucGF0aChwYXRoKTsKKworICAgICAgICBpZiAocGFyYW1CZWFuLmdldFBhdGhQYXJhbSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRhcmdldCA9IHRhcmdldC5wYXRoKHBhcmFtQmVhbi5nZXRQYXRoUGFyYW0oKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQucGF0aCgiLyIpOworICAgICAgICB9CisKKyAgICAgICAgSW52b2NhdGlvbi5CdWlsZGVyIHJlcXVlc3QgPSB0YXJnZXQKKyAgICAgICAgICAgICAgICAubWF0cml4UGFyYW0oIm1hdHJpeCIsIHBhcmFtQmVhbi5nZXRNYXRyaXhQYXJhbSgpKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJxdWVyeSIsIHBhcmFtQmVhbi5nZXRRdWVyeVBhcmFtKCkpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKTsKKworICAgICAgICBpZiAocGFyYW1CZWFuLmdldEhlYWRlclBhcmFtKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgcmVxdWVzdCA9IHJlcXVlc3QuaGVhZGVyKCJoZWFkZXIiLCBwYXJhbUJlYW4uZ2V0SGVhZGVyUGFyYW0oKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocGFyYW1CZWFuLmdldENvb2tpZSgpICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJlcXVlc3QgPSByZXF1ZXN0LmNvb2tpZSgiY29va2llIiwgcGFyYW1CZWFuLmdldENvb2tpZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiByZXF1ZXN0LnBvc3QoRW50aXR5LmVudGl0eShmb3JtLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fRk9STV9VUkxFTkNPREVEX1RZUEUpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnB1dFBhcmFtc0Jhc2ljQ29uc3RyYWludHNQb3NpdGl2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRlc3RJbnB1dFBhcmFtcygiYmFzaWNQYXJhbSIsIGdldERlZmF1bHRQYXJhbUJlYW4oKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBhdGhQYXJhbV9tYXRyaXhQYXJhbV9xdWVyeVBhcmFtX2hlYWRlclBhcmFtX2Nvb2tpZVBhcmFtX2Zvcm1QYXJhbSIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5wdXRQYXJhbXNCYXNpY0NvbnN0cmFpbnRzTmVnYXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0ZXN0SW5wdXRQYXJhbXMoImJhc2ljUGFyYW0iLCBuZXcgUGFyYW1CZWFuKCkpOworCisgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmNvbnRhaW5zKCJhcmcxIikpOyAvLyBATWF0cml4UGFyYW0KKyAgICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmNvbnRhaW5zKCJhcmcyIikpOyAvLyBAUXVlcnlQYXJhbQorICAgICAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuY29udGFpbnMoImFyZzMiKSk7IC8vIEBIZWFkZXJQYXJhbQorICAgICAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuY29udGFpbnMoImFyZzQiKSk7IC8vIEBDb29raWVQYXJhbQorICAgICAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuY29udGFpbnMoImFyZzUiKSk7IC8vIEBGb3JtUGFyYW0KKworICAgICAgICBhc3NlcnRGYWxzZShtZXNzYWdlLmNvbnRhaW5zKCJhcmcwIikpOyAvLyBAUGF0aFBhcmFtCisgICAgICAgIGFzc2VydEZhbHNlKG1lc3NhZ2UuY29udGFpbnMoImFyZzYiKSk7IC8vIEBDb250ZXh0CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5wdXRQYXJhbXNEZWZhdWx0QmFzaWNDb25zdHJhaW50c1Bvc2l0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGVzdElucHV0UGFyYW1zKCJiYXNpY0RlZmF1bHRQYXJhbSIsIG5ldyBQYXJhbUJlYW4oKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIl9tYXRyaXhQYXJhbV9xdWVyeVBhcmFtX2hlYWRlclBhcmFtX2Nvb2tpZVBhcmFtX2Zvcm1QYXJhbSIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5wdXRQYXJhbXNDdXN0b21Db25zdHJhaW50c1Bvc2l0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGVzdElucHV0UGFyYW1zKCJjdXN0b21QYXJhbSIsIGdldERlZmF1bHRQYXJhbUJlYW4oKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBhdGhQYXJhbV9tYXRyaXhQYXJhbV9xdWVyeVBhcmFtX2hlYWRlclBhcmFtX2Nvb2tpZVBhcmFtX2Zvcm1QYXJhbSIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5wdXRQYXJhbXNDdXN0b21Db25zdHJhaW50c05lZ2F0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGVzdElucHV0UGFyYW1zKCJjdXN0b21QYXJhbSIsIG5ldyBQYXJhbUJlYW4oKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuY29udGFpbnMoImFyZzAiKSk7IC8vIEBQYXRoUGFyYW0KKyAgICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmNvbnRhaW5zKCJhcmcxIikpOyAvLyBATWF0cml4UGFyYW0KKyAgICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmNvbnRhaW5zKCJhcmcyIikpOyAvLyBAUXVlcnlQYXJhbQorICAgICAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuY29udGFpbnMoImFyZzMiKSk7IC8vIEBIZWFkZXJQYXJhbQorICAgICAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuY29udGFpbnMoImFyZzQiKSk7IC8vIEBDb29raWVQYXJhbQorICAgICAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuY29udGFpbnMoImFyZzUiKSk7IC8vIEBGb3JtUGFyYW0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnB1dFBhcmFtc01peGVkQ29uc3RyYWludHNQb3NpdGl2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRlc3RJbnB1dFBhcmFtcygibWl4ZWRQYXJhbSIsIGdldERlZmF1bHRQYXJhbUJlYW4oKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBhdGhQYXJhbV9tYXRyaXhQYXJhbV9xdWVyeVBhcmFtX2hlYWRlclBhcmFtX2Nvb2tpZVBhcmFtX2Zvcm1QYXJhbSIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5wdXRQYXJhbXNNaXhlZENvbnN0cmFpbnRzTmVnYXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0ZXN0SW5wdXRQYXJhbXMoIm1peGVkUGFyYW0iLCBuZXcgUGFyYW1CZWFuKCkpOworCisgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmNvbnRhaW5zKCJhcmcwIikpOyAvLyBAUGF0aFBhcmFtCisgICAgICAgIGFzc2VydFRydWUobWVzc2FnZS5jb250YWlucygiYXJnMSIpKTsgLy8gQE1hdHJpeFBhcmFtCisgICAgICAgIGFzc2VydFRydWUobWVzc2FnZS5jb250YWlucygiYXJnMiIpKTsgLy8gQFF1ZXJ5UGFyYW0KKyAgICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmNvbnRhaW5zKCJhcmczIikpOyAvLyBASGVhZGVyUGFyYW0KKyAgICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmNvbnRhaW5zKCJhcmc0IikpOyAvLyBAQ29va2llUGFyYW0KKyAgICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmNvbnRhaW5zKCJhcmc1IikpOyAvLyBARm9ybVBhcmFtCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5wdXRQYXJhbXNNaXhlZENvbnN0cmFpbnRzTmVnYXRpdmVUb29Mb25nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFBhcmFtQmVhbiBkZWZhdWx0UGFyYW1CZWFuID0gZ2V0RGVmYXVsdFBhcmFtQmVhbigpOworICAgICAgICBmaW5hbCBTdHJpbmcgZm9ybVBhcmFtID0gZGVmYXVsdFBhcmFtQmVhbi5nZXRGb3JtUGFyYW0oKTsKKyAgICAgICAgZGVmYXVsdFBhcmFtQmVhbi5zZXRGb3JtUGFyYW0oZm9ybVBhcmFtICsgZm9ybVBhcmFtKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRlc3RJbnB1dFBhcmFtcygibWl4ZWRQYXJhbSIsIGRlZmF1bHRQYXJhbUJlYW4pOworCisgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobWVzc2FnZS5jb250YWlucygiYXJnMCIpKTsgLy8gQFBhdGhQYXJhbQorICAgICAgICBhc3NlcnRGYWxzZShtZXNzYWdlLmNvbnRhaW5zKCJhcmcxIikpOyAvLyBATWF0cml4UGFyYW0KKyAgICAgICAgYXNzZXJ0RmFsc2UobWVzc2FnZS5jb250YWlucygiYXJnMiIpKTsgLy8gQFF1ZXJ5UGFyYW0KKyAgICAgICAgYXNzZXJ0RmFsc2UobWVzc2FnZS5jb250YWlucygiYXJnMyIpKTsgLy8gQEhlYWRlclBhcmFtCisgICAgICAgIGFzc2VydEZhbHNlKG1lc3NhZ2UuY29udGFpbnMoImFyZzQiKSk7IC8vIEBDb29raWVQYXJhbQorICAgICAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuY29udGFpbnMoImFyZzUiKSk7IC8vIEBGb3JtUGFyYW0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnB1dFBhcmFtc011bHRpcGxlQ29uc3RyYWludHNQb3NpdGl2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRlc3RJbnB1dFBhcmFtcygibXVsdGlwbGVQYXJhbSIsIGdldERlZmF1bHRQYXJhbUJlYW4oKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBhdGhQYXJhbV9tYXRyaXhQYXJhbV9xdWVyeVBhcmFtX2hlYWRlclBhcmFtX2Nvb2tpZVBhcmFtX2Zvcm1QYXJhbSIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5wdXRQYXJhbXNNdWx0aXBsZUNvbnN0cmFpbnRzTmVnYXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0ZXN0SW5wdXRQYXJhbXMoIm11bHRpcGxlUGFyYW0iLCBuZXcgUGFyYW1CZWFuKCkpOworCisgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmNvbnRhaW5zKCJhcmcwIikpOyAvLyBAUGF0aFBhcmFtCisgICAgICAgIGFzc2VydFRydWUobWVzc2FnZS5jb250YWlucygiYXJnMSIpKTsgLy8gQE1hdHJpeFBhcmFtCisgICAgICAgIGFzc2VydFRydWUobWVzc2FnZS5jb250YWlucygiYXJnMiIpKTsgLy8gQFF1ZXJ5UGFyYW0KKyAgICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmNvbnRhaW5zKCJhcmczIikpOyAvLyBASGVhZGVyUGFyYW0KKyAgICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmNvbnRhaW5zKCJhcmc0IikpOyAvLyBAQ29va2llUGFyYW0KKyAgICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmNvbnRhaW5zKCJhcmc1IikpOyAvLyBARm9ybVBhcmFtCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5wdXRQYXJhbXNNdWx0aXBsZUNvbnN0cmFpbnRzTmVnYXRpdmVUb29Mb25nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFBhcmFtQmVhbiBkZWZhdWx0UGFyYW1CZWFuID0gZ2V0RGVmYXVsdFBhcmFtQmVhbigpOworICAgICAgICBmaW5hbCBTdHJpbmcgZm9ybVBhcmFtID0gZGVmYXVsdFBhcmFtQmVhbi5nZXRGb3JtUGFyYW0oKTsKKyAgICAgICAgZGVmYXVsdFBhcmFtQmVhbi5zZXRGb3JtUGFyYW0oZm9ybVBhcmFtICsgZm9ybVBhcmFtKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRlc3RJbnB1dFBhcmFtcygibWl4ZWRQYXJhbSIsIGRlZmF1bHRQYXJhbUJlYW4pOworCisgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UobWVzc2FnZS5jb250YWlucygiYXJnMCIpKTsgLy8gQFBhdGhQYXJhbQorICAgICAgICBhc3NlcnRGYWxzZShtZXNzYWdlLmNvbnRhaW5zKCJhcmcxIikpOyAvLyBATWF0cml4UGFyYW0KKyAgICAgICAgYXNzZXJ0RmFsc2UobWVzc2FnZS5jb250YWlucygiYXJnMiIpKTsgLy8gQFF1ZXJ5UGFyYW0KKyAgICAgICAgYXNzZXJ0RmFsc2UobWVzc2FnZS5jb250YWlucygiYXJnMyIpKTsgLy8gQEhlYWRlclBhcmFtCisgICAgICAgIGFzc2VydEZhbHNlKG1lc3NhZ2UuY29udGFpbnMoImFyZzQiKSk7IC8vIEBDb29raWVQYXJhbQorICAgICAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuY29udGFpbnMoImFyZzUiKSk7IC8vIEBGb3JtUGFyYW0KKyAgICB9CisKKyAgICBwcml2YXRlIFJlc3BvbnNlIHRlc3RCZWFuKGZpbmFsIFN0cmluZyBwYXRoLCBmaW5hbCBDb250YWN0QmVhbiBjb250YWN0QmVhbikgeworICAgICAgICByZXR1cm4gdGFyZ2V0KCJiZWFudmFsaWRhdGlvbiIpCisgICAgICAgICAgICAgICAgLnBhdGgocGF0aCkKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgiYXBwbGljYXRpb24vY29udGFjdEJlYW4iKS5wb3N0KEVudGl0eS5lbnRpdHkoY29udGFjdEJlYW4sICJhcHBsaWNhdGlvbi9jb250YWN0QmVhbiIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUJlYW5QYXJhbVBvc2l0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENvbnRhY3RCZWFuIGNvbnRhY3RCZWFuID0gbmV3IENvbnRhY3RCZWFuKCk7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGVzdEJlYW4oImVtcHR5QmVhblBhcmFtIiwgY29udGFjdEJlYW4pOworCisgICAgICAgIGFzc2VydEVxdWFscyhjb250YWN0QmVhbiwgcmVzcG9uc2UucmVhZEVudGl0eShDb250YWN0QmVhbi5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5QmVhblBhcmFtTmVnYXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0ZXN0QmVhbigiZW1wdHlCZWFuUGFyYW0iLCBudWxsKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRydWUobWVzc2FnZS5jb250YWlucygiYXJnMCIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZEJlYW5QYXJhbVBvc2l0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENvbnRhY3RCZWFuIGNvbnRhY3RCZWFuID0gbmV3IENvbnRhY3RCZWFuKCk7CisgICAgICAgIGNvbnRhY3RCZWFuLnNldE5hbWUoIkplcnNleSIpOworICAgICAgICBjb250YWN0QmVhbi5zZXRFbWFpbCgiamVyc2V5QGV4YW1wbGUuY29tIik7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGVzdEJlYW4oInZhbGlkQmVhblBhcmFtIiwgY29udGFjdEJlYW4pOworCisgICAgICAgIGFzc2VydEVxdWFscyhjb250YWN0QmVhbiwgcmVzcG9uc2UucmVhZEVudGl0eShDb250YWN0QmVhbi5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZhbGlkQmVhblBhcmFtTmVnYXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ29udGFjdEJlYW4gY29udGFjdEJlYW4gPSBuZXcgQ29udGFjdEJlYW4oKTsKKyAgICAgICAgLy8gQWRkIHZhbHVlIHRvIHBhc3MgQE9uZUNvbnRhY3QgY29uc3RyYWludCBidXQgZmFpbHMgb24gQFBhdHRlcm4gY29uc3RyYWludCBkZWZpbmVkIG9uIGdldHRlci4KKyAgICAgICAgY29udGFjdEJlYW4uc2V0UGhvbmUoIjEyIik7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGVzdEJlYW4oInZhbGlkQmVhblBhcmFtIiwgY29udGFjdEJlYW4pOworCisgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmNvbnRhaW5zKCJhcmcwIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbUJlYW5QYXJhbVBvc2l0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENvbnRhY3RCZWFuIGNvbnRhY3RCZWFuID0gbmV3IENvbnRhY3RCZWFuKCk7CisgICAgICAgIGNvbnRhY3RCZWFuLnNldEVtYWlsKCJqZXJzZXlAZXhhbXBsZS5jb20iKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRlc3RCZWFuKCJjdXN0b21CZWFuUGFyYW0iLCBjb250YWN0QmVhbik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnRhY3RCZWFuLCByZXNwb25zZS5yZWFkRW50aXR5KENvbnRhY3RCZWFuLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tQmVhblBhcmFtTmVnYXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ29udGFjdEJlYW4gY29udGFjdEJlYW4gPSBuZXcgQ29udGFjdEJlYW4oKTsKKyAgICAgICAgY29udGFjdEJlYW4uc2V0RW1haWwoImplcnNleUBleGFtcGxlLmNvbSIpOworICAgICAgICBjb250YWN0QmVhbi5zZXRQaG9uZSgiMTM0NTM5Iik7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0ZXN0QmVhbigiY3VzdG9tQmVhblBhcmFtIiwgY29udGFjdEJlYW4pOworCisgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmNvbnRhaW5zKCJhcmcwIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVtcHR5QmVhblJlc3BvbnNlUG9zaXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ29udGFjdEJlYW4gY29udGFjdEJlYW4gPSBuZXcgQ29udGFjdEJlYW4oKTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0ZXN0QmVhbigiZW1wdHlCZWFuUmVzcG9uc2UiLCBjb250YWN0QmVhbik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnRhY3RCZWFuLCByZXNwb25zZS5yZWFkRW50aXR5KENvbnRhY3RCZWFuLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlCZWFuUmVzcG9uc2VOZWdhdGl2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRlc3RCZWFuKCJlbXB0eUJlYW5SZXNwb25zZSIsIG51bGwpOworCisgICAgICAgIGFzc2VydEVxdWFscyg1MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmNvbnRhaW5zKCJyZXR1cm4gdmFsdWUiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRCZWFuUmVzcG9uc2VQb3NpdGl2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBDb250YWN0QmVhbiBjb250YWN0QmVhbiA9IG5ldyBDb250YWN0QmVhbigpOworICAgICAgICBjb250YWN0QmVhbi5zZXROYW1lKCJKZXJzZXkiKTsKKyAgICAgICAgY29udGFjdEJlYW4uc2V0RW1haWwoImplcnNleUBleGFtcGxlLmNvbSIpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRlc3RCZWFuKCJ2YWxpZEJlYW5SZXNwb25zZSIsIGNvbnRhY3RCZWFuKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoY29udGFjdEJlYW4sIHJlc3BvbnNlLnJlYWRFbnRpdHkoQ29udGFjdEJlYW4uY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZEJlYW5SZXNwb25zZU5lZ2F0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENvbnRhY3RCZWFuIGNvbnRhY3RCZWFuID0gbmV3IENvbnRhY3RCZWFuKCk7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGVzdEJlYW4oInZhbGlkQmVhblJlc3BvbnNlIiwgY29udGFjdEJlYW4pOworCisgICAgICAgIGFzc2VydEVxdWFscyg1MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmNvbnRhaW5zKCJyZXR1cm4gdmFsdWUiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRCZWFuV3JhcHBlZEluUmVzcG9uc2VQb3NpdGl2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBDb250YWN0QmVhbiBjb250YWN0QmVhbiA9IG5ldyBDb250YWN0QmVhbigpOworICAgICAgICBjb250YWN0QmVhbi5zZXROYW1lKCJKZXJzZXkiKTsKKyAgICAgICAgY29udGFjdEJlYW4uc2V0RW1haWwoImplcnNleUBleGFtcGxlLmNvbSIpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRlc3RCZWFuKCJ2YWxpZEJlYW5XcmFwcGVkSW5SZXNwb25zZSIsIGNvbnRhY3RCZWFuKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoY29udGFjdEJlYW4sIHJlc3BvbnNlLnJlYWRFbnRpdHkoQ29udGFjdEJlYW4uY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZEJlYW5XcmFwcGVkSW5SZXNwb25zZU5lZ2F0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENvbnRhY3RCZWFuIGNvbnRhY3RCZWFuID0gbmV3IENvbnRhY3RCZWFuKCk7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGVzdEJlYW4oInZhbGlkQmVhbldyYXBwZWRJblJlc3BvbnNlIiwgY29udGFjdEJlYW4pOworCisgICAgICAgIGFzc2VydEVxdWFscyg1MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmNvbnRhaW5zKCJyZXR1cm4gdmFsdWUiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tQmVhblJlc3BvbnNlUG9zaXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ29udGFjdEJlYW4gY29udGFjdEJlYW4gPSBuZXcgQ29udGFjdEJlYW4oKTsKKyAgICAgICAgY29udGFjdEJlYW4uc2V0RW1haWwoImplcnNleUBleGFtcGxlLmNvbSIpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRlc3RCZWFuKCJjdXN0b21CZWFuUmVzcG9uc2UiLCBjb250YWN0QmVhbik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnRhY3RCZWFuLCByZXNwb25zZS5yZWFkRW50aXR5KENvbnRhY3RCZWFuLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tQmVhblJlc3BvbnNlTmVnYXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ29udGFjdEJlYW4gY29udGFjdEJlYW4gPSBuZXcgQ29udGFjdEJlYW4oKTsKKyAgICAgICAgY29udGFjdEJlYW4uc2V0RW1haWwoImplcnNleUBleGFtcGxlLmNvbSIpOworICAgICAgICBjb250YWN0QmVhbi5zZXRQaG9uZSgiMTM0NTM5Iik7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0ZXN0QmVhbigiY3VzdG9tQmVhblJlc3BvbnNlIiwgY29udGFjdEJlYW4pOworCisgICAgICAgIGFzc2VydEVxdWFscyg1MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmNvbnRhaW5zKCJyZXR1cm4gdmFsdWUiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZENvbnRleHRWYWxpZGF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJiZWFudmFsaWRhdGlvbiIpLnBhdGgoImludmFsaWRDb250ZXh0IikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRydWUobWVzc2FnZS5jb250YWlucygiYXJnMCIpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFJlc3BvbnNlIHRlc3RTdWJSZXNvdXJjZShmaW5hbCBTdHJpbmcgcGF0aCwgZmluYWwgRm9ybSBmb3JtKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHRhcmdldCgiYmVhbnZhbGlkYXRpb24iKQorICAgICAgICAgICAgICAgIC5wYXRoKCJzdWIiKQorICAgICAgICAgICAgICAgIC5wYXRoKHBhdGgpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkoZm9ybSwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0ZPUk1fVVJMRU5DT0RFRF9UWVBFKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RTdWJSZXNvdXJjZVBvc2l0aXZlKGZpbmFsIFN0cmluZyBwYXRoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdFN1YlJlc291cmNlKHBhdGgsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdFN1YlJlc291cmNlKGZpbmFsIFN0cmluZyBwYXRoLCBmaW5hbCBib29sZWFuIG9taXRFbWFpbCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEZvcm0gZm9ybSA9IG5ldyBGb3JtKCk7CisgICAgICAgIGZvcm0uYXNNYXAoKS5wdXQoImZpcnN0TmFtZSIsIEFycmF5cy5hc0xpc3QoIkplcnNleSIpKTsKKyAgICAgICAgZm9ybS5hc01hcCgpLnB1dCgibGFzdE5hbWUiLCBBcnJheXMuYXNMaXN0KCJKQVgtUlMiKSk7CisgICAgICAgIGlmICghb21pdEVtYWlsKSB7CisgICAgICAgICAgICBmb3JtLmFzTWFwKCkucHV0KCJlbWFpbCIsIEFycmF5cy5hc0xpc3QoImplcnNleUBleGFtcGxlLmNvbSIpKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIENvbnRhY3RCZWFuIGNvbnRhY3RCZWFuID0gbmV3IENvbnRhY3RCZWFuKCk7CisgICAgICAgIGNvbnRhY3RCZWFuLnNldE5hbWUoIkplcnNleSBKQVgtUlMiKTsKKyAgICAgICAgY29udGFjdEJlYW4uc2V0RW1haWwoImplcnNleUBleGFtcGxlLmNvbSIpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGVzdFN1YlJlc291cmNlKHBhdGgsIGZvcm0pOworCisgICAgICAgIGlmIChvbWl0RW1haWwpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyg0MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuY29udGFpbnMoImVtYWlsIikpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnRhY3RCZWFuLCByZXNwb25zZS5yZWFkRW50aXR5KENvbnRhY3RCZWFuLmNsYXNzKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdFN1YlJlc291cmNlTmVnYXRpdmUoZmluYWwgU3RyaW5nIHBhdGgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBGb3JtIGZvcm0gPSBuZXcgRm9ybSgpOworICAgICAgICBmb3JtLmFzTWFwKCkucHV0KCJmb28iLCBBcnJheXMuYXNMaXN0KCJiYXIiKSk7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0ZXN0U3ViUmVzb3VyY2UocGF0aCwgZm9ybSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuY29udGFpbnMoImZpcnN0TmFtZSIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmNvbnRhaW5zKCJsYXN0TmFtZSIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmNvbnRhaW5zKCJlbWFpbCIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJSZXNvdXJjZVZhbGlkUmVzb3VyY2VDb250ZXh0UG9zaXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdFN1YlJlc291cmNlUG9zaXRpdmUoInZhbGlkUmVzb3VyY2VDb250ZXh0SW5zdGFuY2UiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJSZXNvdXJjZU51bGxSZXNvdXJjZUNvbnRleHRQb3NpdGl2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0U3ViUmVzb3VyY2VQb3NpdGl2ZSgibnVsbFJlc291cmNlQ29udGV4dEluc3RhbmNlIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3ViUmVzb3VyY2VOdWxsUmVzb3VyY2VDb250ZXh0Q2xhc3NQb3NpdGl2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0U3ViUmVzb3VyY2VQb3NpdGl2ZSgibnVsbFJlc291cmNlQ29udGV4dENsYXNzIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3ViUmVzb3VyY2VWYWxpZFJlc291cmNlQ29udGV4dE5lZ2F0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3RTdWJSZXNvdXJjZU5lZ2F0aXZlKCJ2YWxpZFJlc291cmNlQ29udGV4dEluc3RhbmNlIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3ViUmVzb3VyY2VOdWxsUmVzb3VyY2VDb250ZXh0TmVnYXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdFN1YlJlc291cmNlTmVnYXRpdmUoIm51bGxSZXNvdXJjZUNvbnRleHRJbnN0YW5jZSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN1YlJlc291cmNlRW1wdHlOYW1lcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBGb3JtIGZvcm0gPSBuZXcgRm9ybSgpOworICAgICAgICBmb3JtLmFzTWFwKCkucHV0KCJmaXJzdE5hbWUiLCBBcnJheXMuYXNMaXN0KCIiKSk7CisgICAgICAgIGZvcm0uYXNNYXAoKS5wdXQoImxhc3ROYW1lIiwgQXJyYXlzLmFzTGlzdCgiIikpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGVzdFN1YlJlc291cmNlKCJudWxsUmVzb3VyY2VDb250ZXh0SW5zdGFuY2UiLCBmb3JtKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRydWUobWVzc2FnZS5jb250YWlucygiYXQgbGVhc3Qgb25lIG9mIHRoZSBuYW1lcyBpcyBlbXB0eSIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJSZXNvdXJjZVByb3BlcnR5TmVnYXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdFN1YlJlc291cmNlKCJ2YWxpZFJlc291cmNlQ29udGV4dEluc3RhbmNlIiwgdHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V3JvbmdTdWJSZXNvdXJjZU5lZ2F0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJiZWFudmFsaWRhdGlvbiIpCisgICAgICAgICAgICAgICAgLnBhdGgoInN1Yi93cm9uZyIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5nZXQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRydWUobWVzc2FnZS5jb250YWlucygicmVzb3VyY2VDb250ZXh0IikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vQ29udGFjdEJlYW4uamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vQ29udGFjdEJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWQxM2FlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi9Db250YWN0QmVhbi5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIudmFsaWRhdGlvbjsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuUGF0dGVybjsKKworaW1wb3J0IG9yZy5oaWJlcm5hdGUudmFsaWRhdG9yLmNvbnN0cmFpbnRzLkVtYWlsOworaW1wb3J0IG9yZy5oaWJlcm5hdGUudmFsaWRhdG9yLmNvbnN0cmFpbnRzLk5vdEJsYW5rOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAT25lQ29udGFjdAorcHVibGljIGNsYXNzIENvbnRhY3RCZWFuIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKKworICAgIEBFbWFpbChyZWdleHAgPSAiW2EtekEtWjAtOS5fJS1dK0BbYS16QS1aMC05Li1dK1xcLlthLXpBLVpdezIsNH0iKQorICAgIHByaXZhdGUgU3RyaW5nIGVtYWlsOworCisgICAgcHJpdmF0ZSBTdHJpbmcgcGhvbmU7CisKKyAgICBATm90QmxhbmsKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworCisgICAgQE5vdE51bGwoZ3JvdXBzID0ge0V4dGVuZGVkLmNsYXNzfSkKKyAgICBwcml2YXRlIFN0cmluZyBjaXR5OworCisgICAgcHVibGljIFN0cmluZyBnZXRFbWFpbCgpIHsKKyAgICAgICAgcmV0dXJuIGVtYWlsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEVtYWlsKGZpbmFsIFN0cmluZyBlbWFpbCkgeworICAgICAgICB0aGlzLmVtYWlsID0gZW1haWw7CisgICAgfQorCisgICAgQFBhdHRlcm4ocmVnZXhwID0gIlswLTldezMsOX0iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGhvbmUoKSB7CisgICAgICAgIHJldHVybiBwaG9uZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQaG9uZShmaW5hbCBTdHJpbmcgcGhvbmUpIHsKKyAgICAgICAgdGhpcy5waG9uZSA9IHBob25lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoZmluYWwgU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3QgbykgeworICAgICAgICBpZiAodGhpcyA9PSBvKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgQ29udGFjdEJlYW4pKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBDb250YWN0QmVhbiB0aGF0ID0gKENvbnRhY3RCZWFuKSBvOworCisgICAgICAgIGlmIChlbWFpbCAhPSBudWxsID8gIWVtYWlsLmVxdWFscyh0aGF0LmVtYWlsKSA6IHRoYXQuZW1haWwgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChuYW1lICE9IG51bGwgPyAhbmFtZS5lcXVhbHModGhhdC5uYW1lKSA6IHRoYXQubmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBob25lICE9IG51bGwgPyAhcGhvbmUuZXF1YWxzKHRoYXQucGhvbmUpIDogdGhhdC5waG9uZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgcmVzdWx0ID0gZW1haWwgIT0gbnVsbCA/IGVtYWlsLmhhc2hDb2RlKCkgOiAwOworICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIChwaG9uZSAhPSBudWxsID8gcGhvbmUuaGFzaENvZGUoKSA6IDApOworICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIChuYW1lICE9IG51bGwgPyBuYW1lLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIkNvbnRhY3RCZWFueyIKKyAgICAgICAgICAgICAgICArICJlbWFpbD0nIiArIGVtYWlsICsgJ1wnJworICAgICAgICAgICAgICAgICsgIiwgcGhvbmU9JyIgKyBwaG9uZSArICdcJycKKyAgICAgICAgICAgICAgICArICIsIG5hbWU9JyIgKyBuYW1lICsgJ1wnJworICAgICAgICAgICAgICAgICsgJ30nOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vQ3VzdG9tQmVhbi5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi9DdXN0b21CZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJhOTUzMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vQ3VzdG9tQmVhbi5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci52YWxpZGF0aW9uOworCitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUcmFuc2llbnQ7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BYbWxSb290RWxlbWVudAorQEN1c3RvbVZhbGlkYXRpb24KK3B1YmxpYyBjbGFzcyBDdXN0b21CZWFuIHsKKworICAgIEBOb3ROdWxsCisgICAgcHJpdmF0ZSBTdHJpbmcgcGF0aDsKKworICAgIHByaXZhdGUgYm9vbGVhbiB2YWxpZGF0ZSA9IHRydWU7CisKKyAgICBwdWJsaWMgdm9pZCBzZXRQYXRoKGZpbmFsIFN0cmluZyBwYXRoKSB7CisgICAgICAgIHRoaXMucGF0aCA9IHBhdGg7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgeworICAgICAgICByZXR1cm4gcGF0aDsKKyAgICB9CisKKyAgICBAWG1sVHJhbnNpZW50CisgICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHZhbGlkYXRlOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRlKGZpbmFsIGJvb2xlYW4gdmFsaWRhdGUpIHsKKyAgICAgICAgdGhpcy52YWxpZGF0ZSA9IHZhbGlkYXRlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vQ3VzdG9tQ29uZmlnVmFsaWRhdGlvblRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vQ3VzdG9tQ29uZmlnVmFsaWRhdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTVhZWZiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi9DdXN0b21Db25maWdWYWxpZGF0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjQzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIudmFsaWRhdGlvbjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkNvbnN0cnVjdG9yOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5IZWFkZXJQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuQ29udGV4dFJlc29sdmVyOworCitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5NZXNzYWdlSW50ZXJwb2xhdG9yOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGFyYW1ldGVyTmFtZVByb3ZpZGVyOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF0aDsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLlRyYXZlcnNhYmxlUmVzb2x2ZXI7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZDsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRpb247CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuU2l6ZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW94eS54bWwuTW94eVhtbEZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci52YWxpZGF0aW9uLlZhbGlkYXRpb25Db25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qYXhiLkJlYW5WYWxpZGF0aW9uTW9kZTsKK2ltcG9ydCBvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5qYXhiLk1hcnNoYWxsZXJQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgQ3VzdG9tQ29uZmlnVmFsaWRhdGlvblRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBqYXZheC53cy5ycy5QYXRoKCJjdXN0b21jb25maWd2YWxpZGF0aW9uL3twYXRoOiAuKn0iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ3VzdG9tQ29uZmlnUmVzb3VyY2UgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24veG1sIikKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi94bWwiKQorICAgICAgICBATm90TnVsbAorICAgICAgICBAVmFsaWQKKyAgICAgICAgcHVibGljIEN1c3RvbUJlYW4gcG9zdChAUGF0aFBhcmFtKCJwYXRoIikgZmluYWwgU3RyaW5nIHBhdGgsIGZpbmFsIEN1c3RvbUJlYW4gYmVhblBhcmFtZXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAU2l6ZShtaW4gPSA1KSBASGVhZGVyUGFyYW0oIm15SGVhZGVyIikgZmluYWwgU3RyaW5nIGhlYWRlcikgeworICAgICAgICAgICAgaWYgKCIiLmVxdWFscyhwYXRoKSkgeworICAgICAgICAgICAgICAgIGJlYW5QYXJhbWV0ZXIuc2V0UGF0aChudWxsKTsKKyAgICAgICAgICAgICAgICBiZWFuUGFyYW1ldGVyLnNldFZhbGlkYXRlKGZhbHNlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYmVhblBhcmFtZXRlci5zZXRQYXRoKHBhdGgpOworICAgICAgICAgICAgICAgIGJlYW5QYXJhbWV0ZXIuc2V0VmFsaWRhdGUodHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYmVhblBhcmFtZXRlcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5EVU1QX0VOVElUWSk7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoQ3VzdG9tQ29uZmlnUmVzb3VyY2UuY2xhc3MpOworCisgICAgICAgIC8vIFR1cm4gb2ZmIEJWIGluIE1PWHkgb3RoZXJ3aXNlIHRoZSBlbnRpdGllcyBvbiBzZXJ2ZXIgd291bGQgYmUgdmFsaWRhdGVkIGF0IGluY29ycmVjdCB0aW1lcy4KKyAgICAgICAgcmVzb3VyY2VDb25maWcucmVnaXN0ZXIobW94eVhtbEZlYXR1cmUoKSk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVyKFZhbGlkYXRpb25Db25maWd1cmF0aW9uQ29udGV4dFJlc29sdmVyLmNsYXNzKTsKKworICAgICAgICByZXNvdXJjZUNvbmZpZy5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLkJWX1NFTkRfRVJST1JfSU5fUkVTUE9OU0UsIHRydWUpOworCisgICAgICAgIHJldHVybiByZXNvdXJjZUNvbmZpZzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoZmluYWwgQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBzdXBlci5jb25maWd1cmVDbGllbnQoY29uZmlnKTsKKworICAgICAgICAvLyBUdXJuIG9mZiBCViBpbiBNT1h5IG90aGVyd2lzZSB0aGUgZW50aXRpZXMgb24gY2xpZW50IHdvdWxkIGJlIHZhbGlkYXRlZCBhcyB3ZWxsLgorICAgICAgICBjb25maWcucmVnaXN0ZXIobW94eVhtbEZlYXR1cmUoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBNb3h5WG1sRmVhdHVyZSBtb3h5WG1sRmVhdHVyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNb3h5WG1sRmVhdHVyZShuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKSB7eworICAgICAgICAgICAgICAgICAgICBwdXQoTWFyc2hhbGxlclByb3BlcnRpZXMuQkVBTl9WQUxJREFUSU9OX01PREUsIEJlYW5WYWxpZGF0aW9uTW9kZS5OT05FKTsKKyAgICAgICAgICAgICAgICB9fSwKKyAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldENvbnRleHRDbGFzc0xvYWRlcigpLAorICAgICAgICAgICAgICAgIGZhbHNlCisgICAgICAgICk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zaXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImN1c3RvbWNvbmZpZ3ZhbGlkYXRpb24iKQorICAgICAgICAgICAgICAgIC5wYXRoKCJvayIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5oZWFkZXIoIm15SGVhZGVyIiwgIjEyMzQ1IikKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KG5ldyBDdXN0b21CZWFuKCksIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUxfVFlQRSkpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJvayIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoQ3VzdG9tQmVhbi5jbGFzcykuZ2V0UGF0aCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJhbWV0ZXJOYW1lV2l0aEludGVycG9sYXRvcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiY3VzdG9tY29uZmlndmFsaWRhdGlvbiIpCisgICAgICAgICAgICAgICAgLnBhdGgoIm9rIikKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLmhlYWRlcigibXlIZWFkZXIiLCAiMTIzNCIpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eShuZXcgQ3VzdG9tQmVhbigpLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MX1RZUEUpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2UobWVzc2FnZS5jb250YWlucygiYXJnMiIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmNvbnRhaW5zKCJoZWFkZXIiKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG1lc3NhZ2UuY29udGFpbnMoInNpemUgbXVzdCBiZSBiZXR3ZWVuIikpOworICAgICAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuY29udGFpbnMoIm1lc3NhZ2UiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhdmVyc2FibGVSZXNvbHZlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiY3VzdG9tY29uZmlndmFsaWRhdGlvbi8iKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAuaGVhZGVyKCJteUhlYWRlciIsICIxMjM0NSIpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eShuZXcgQ3VzdG9tQmVhbigpLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MX1RZUEUpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIC8vIHJldHVybiB2YWx1ZSBwYXNzZWQgdmFsaWRhdGlvbiBiZWNhdXNlIG9mICJjb3JydXB0ZWQiIHRyYXZlcnNhYmxlcmVzb2x2ZXIKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG51bGwsIHJlc3BvbnNlLnJlYWRFbnRpdHkoQ3VzdG9tQmVhbi5jbGFzcykuZ2V0UGF0aCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFZhbGlkYXRpb25Db25maWd1cmF0aW9uQ29udGV4dFJlc29sdmVyIGltcGxlbWVudHMgQ29udGV4dFJlc29sdmVyPFZhbGlkYXRpb25Db25maWc+IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFZhbGlkYXRpb25Db25maWcgY29uZmlnOworCisgICAgICAgIHB1YmxpYyBWYWxpZGF0aW9uQ29uZmlndXJhdGlvbkNvbnRleHRSZXNvbHZlcigpIHsKKyAgICAgICAgICAgIGNvbmZpZyA9IG5ldyBWYWxpZGF0aW9uQ29uZmlnKCk7CisKKyAgICAgICAgICAgIC8vIENvbnN0cmFpbnRWYWxpZGF0b3JGYWN0b3J5IGlzIHNldCBieSBkZWZhdWx0LgorICAgICAgICAgICAgY29uZmlnLm1lc3NhZ2VJbnRlcnBvbGF0b3IobmV3IEN1c3RvbU1lc3NhZ2VJbnRlcnBvbGF0b3IoKSk7CisgICAgICAgICAgICBjb25maWcucGFyYW1ldGVyTmFtZVByb3ZpZGVyKG5ldyBDdXN0b21QYXJhbWV0ZXJOYW1lUHJvdmlkZXIoKSk7CisgICAgICAgICAgICBjb25maWcudHJhdmVyc2FibGVSZXNvbHZlcihuZXcgQ3VzdG9tVHJhdmVyc2FibGVSZXNvbHZlcigpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVmFsaWRhdGlvbkNvbmZpZyBnZXRDb250ZXh0KGZpbmFsIENsYXNzPD8+IHR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBWYWxpZGF0aW9uQ29uZmlnLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSkgPyBjb25maWcgOiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ3VzdG9tTWVzc2FnZUludGVycG9sYXRvciBpbXBsZW1lbnRzIE1lc3NhZ2VJbnRlcnBvbGF0b3IgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGludGVycG9sYXRlKGZpbmFsIFN0cmluZyBtZXNzYWdlVGVtcGxhdGUsIGZpbmFsIENvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgcmV0dXJuICJtZXNzYWdlIjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGludGVycG9sYXRlKGZpbmFsIFN0cmluZyBtZXNzYWdlVGVtcGxhdGUsIGZpbmFsIENvbnRleHQgY29udGV4dCwgZmluYWwgTG9jYWxlIGxvY2FsZSkgeworICAgICAgICAgICAgcmV0dXJuICJsb2NhbGl6ZWQgbWVzc2FnZSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDdXN0b21QYXJhbWV0ZXJOYW1lUHJvdmlkZXIgaW1wbGVtZW50cyBQYXJhbWV0ZXJOYW1lUHJvdmlkZXIgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgUGFyYW1ldGVyTmFtZVByb3ZpZGVyIG5hbWVQcm92aWRlcjsKKworICAgICAgICBwdWJsaWMgQ3VzdG9tUGFyYW1ldGVyTmFtZVByb3ZpZGVyKCkgeworICAgICAgICAgICAgbmFtZVByb3ZpZGVyID0gVmFsaWRhdGlvbi5ieURlZmF1bHRQcm92aWRlcigpLmNvbmZpZ3VyZSgpLmdldERlZmF1bHRQYXJhbWV0ZXJOYW1lUHJvdmlkZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFBhcmFtZXRlck5hbWVzKGZpbmFsIENvbnN0cnVjdG9yPD8+IGNvbnN0cnVjdG9yKSB7CisgICAgICAgICAgICByZXR1cm4gbmFtZVByb3ZpZGVyLmdldFBhcmFtZXRlck5hbWVzKGNvbnN0cnVjdG9yKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldFBhcmFtZXRlck5hbWVzKGZpbmFsIE1ldGhvZCBtZXRob2QpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgZmluYWwgTWV0aG9kIHBvc3QgPSBDdXN0b21Db25maWdSZXNvdXJjZS5jbGFzcy5nZXRNZXRob2QoInBvc3QiLCBTdHJpbmcuY2xhc3MsIEN1c3RvbUJlYW4uY2xhc3MsIFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgICAgICAgICBpZiAobWV0aG9kLmVxdWFscyhwb3N0KSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdCgicGF0aCIsICJiZWFuUGFyYW1ldGVyIiwgImhlYWRlciIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gRG8gbm90aGluZy4KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBuYW1lUHJvdmlkZXIuZ2V0UGFyYW1ldGVyTmFtZXMobWV0aG9kKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEN1c3RvbVRyYXZlcnNhYmxlUmVzb2x2ZXIgaW1wbGVtZW50cyBUcmF2ZXJzYWJsZVJlc29sdmVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZWFjaGFibGUoZmluYWwgT2JqZWN0IHRyYXZlcnNhYmxlT2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBQYXRoLk5vZGUgdHJhdmVyc2FibGVQcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gcm9vdEJlYW5UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBQYXRoIHBhdGhUb1RyYXZlcnNhYmxlT2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBFbGVtZW50VHlwZSBlbGVtZW50VHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ2FzY2FkYWJsZShmaW5hbCBPYmplY3QgdHJhdmVyc2FibGVPYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBQYXRoLk5vZGUgdHJhdmVyc2FibGVQcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IHJvb3RCZWFuVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFBhdGggcGF0aFRvVHJhdmVyc2FibGVPYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBFbGVtZW50VHlwZSBlbGVtZW50VHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi9DdXN0b21WYWxpZGF0aW9uLmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL0N1c3RvbVZhbGlkYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2EyZDIzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi9DdXN0b21WYWxpZGF0aW9uLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLnZhbGlkYXRpb247CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKKworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludDsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3I7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yQ29udGV4dDsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLlBheWxvYWQ7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorQE5vdE51bGwKK0BDb25zdHJhaW50KHZhbGlkYXRlZEJ5ID0gQ3VzdG9tVmFsaWRhdGlvbi5WYWxpZGF0b3IuY2xhc3MpCitwdWJsaWMgQGludGVyZmFjZSBDdXN0b21WYWxpZGF0aW9uIHsKKworICAgIFN0cmluZyBtZXNzYWdlKCkgZGVmYXVsdCAiY2xpZW50IHNob3VsZCBuZXZlciBzZWUgdGhpcyI7CisKKyAgICBDbGFzczw/PltdIGdyb3VwcygpIGRlZmF1bHQge307CisKKyAgICBDbGFzczw/IGV4dGVuZHMgUGF5bG9hZD5bXSBwYXlsb2FkKCkgZGVmYXVsdCB7fTsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVmFsaWRhdG9yIGltcGxlbWVudHMgQ29uc3RyYWludFZhbGlkYXRvcjxDdXN0b21WYWxpZGF0aW9uLCBDdXN0b21CZWFuPiB7CisKKyAgICAgICAgQENvbnRleHQKKyAgICAgICAgcHJpdmF0ZSBVcmlJbmZvIHVyaUluZm87CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoZmluYWwgQ3VzdG9tVmFsaWRhdGlvbiBjb25zdHJhaW50QW5ub3RhdGlvbikgeworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoZmluYWwgQ3VzdG9tQmVhbiBiZWFuLCBmaW5hbCBDb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICAvLyAhYmVhbi5pc1ZhbGlkYXRlKCkgLSB0byBtYWtlIHN1cmUgdGhpcyB2YWxpZGF0aW9uIHBhc3NlcyBmb3IgQ3VzdG9tQ29uZmlnVmFsaWRhdGlvblRlc3QjdGVzdFRyYXZlcnNhYmxlUmVzb2x2ZXIKKyAgICAgICAgICAgIC8vIChUcmF2ZXJzYWJsZVJlc29sdmVyIGlzIG5vdCBpbnZva2VkIGZvciBFbGVtZW50VHlwZS5UWVBFIGFueW1vcmUpLgorICAgICAgICAgICAgcmV0dXJuICFiZWFuLmlzVmFsaWRhdGUoKSB8fCB1cmlJbmZvLmdldFBhdGhQYXJhbWV0ZXJzKCkuZ2V0Rmlyc3QoInBhdGgiKS5lcXVhbHMoYmVhbi5nZXRQYXRoKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi9FbnRpdHlJbmhlcml0YW5jZVZhbGlkYXRpb25UZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL0VudGl0eUluaGVyaXRhbmNlVmFsaWRhdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTA1Mzc0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi9FbnRpdHlJbmhlcml0YW5jZVZhbGlkYXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSwxODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci52YWxpZGF0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWQ7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5NYXg7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5NaW47CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uLkphY2tzb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuaGliZXJuYXRlLnZhbGlkYXRvci5jb25zdHJhaW50cy5Ob3RCbGFuazsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBUZXN0cyB0byBlbnN1cmUgdGhhdCB2YWxpZGF0aW9uIGNvbnN0cmFpbnRzIG9uIGEgc3VwZXJjbGFzcyBhcmUgdmFsaWRhdGVkIGFzIHdlbGwuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBFbnRpdHlJbmhlcml0YW5jZVZhbGlkYXRpb25UZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9qc29uIikKKyAgICAgICAgcHVibGljIEVudGl0eSBwb3N0KEBWYWxpZCBmaW5hbCBFbnRpdHkgZW50aXR5KSB7CisgICAgICAgICAgICByZXR1cm4gZW50aXR5OworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBYnN0cmFjdEVudGl0eSB7CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdGV4dDsKKworICAgICAgICBwdWJsaWMgQWJzdHJhY3RFbnRpdHkoKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQWJzdHJhY3RFbnRpdHkoZmluYWwgU3RyaW5nIHRleHQpIHsKKyAgICAgICAgICAgIHRoaXMudGV4dCA9IHRleHQ7CisgICAgICAgIH0KKworICAgICAgICBATm90TnVsbAorICAgICAgICBATm90QmxhbmsKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgeworICAgICAgICAgICAgcmV0dXJuIHRleHQ7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KGZpbmFsIFN0cmluZyB0ZXh0KSB7CisgICAgICAgICAgICB0aGlzLnRleHQgPSB0ZXh0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3QgbykgeworICAgICAgICAgICAgaWYgKHRoaXMgPT0gbykgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgQWJzdHJhY3RFbnRpdHkgdGhhdCA9IChBYnN0cmFjdEVudGl0eSkgbzsKKworICAgICAgICAgICAgaWYgKCF0ZXh0LmVxdWFscyh0aGF0LnRleHQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICAgICAgcmV0dXJuIHRleHQuaGFzaENvZGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRW50aXR5IGV4dGVuZHMgQWJzdHJhY3RFbnRpdHkgeworCisgICAgICAgIHByaXZhdGUgSW50ZWdlciBudW1iZXI7CisKKyAgICAgICAgcHVibGljIEVudGl0eSgpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBFbnRpdHkoZmluYWwgU3RyaW5nIHRleHQsIGZpbmFsIEludGVnZXIgbnVtYmVyKSB7CisgICAgICAgICAgICBzdXBlcih0ZXh0KTsKKyAgICAgICAgICAgIHRoaXMubnVtYmVyID0gbnVtYmVyOworICAgICAgICB9CisKKyAgICAgICAgQE1pbigxMikKKyAgICAgICAgQE1heCgxNCkKKyAgICAgICAgQE5vdE51bGwKKyAgICAgICAgcHVibGljIEludGVnZXIgZ2V0TnVtYmVyKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bWJlcjsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE51bWJlcihmaW5hbCBJbnRlZ2VyIG51bWJlcikgeworICAgICAgICAgICAgdGhpcy5udW1iZXIgPSBudW1iZXI7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvKSB7CisgICAgICAgICAgICBpZiAodGhpcyA9PSBvKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobyA9PSBudWxsIHx8IGdldENsYXNzKCkgIT0gby5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFzdXBlci5lcXVhbHMobykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZpbmFsIEVudGl0eSBlbnRpdHkgPSAoRW50aXR5KSBvOworCisgICAgICAgICAgICBpZiAoIW51bWJlci5lcXVhbHMoZW50aXR5Lm51bWJlcikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgICAgICBpbnQgcmVzdWx0ID0gc3VwZXIuaGFzaENvZGUoKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgbnVtYmVyLmhhc2hDb2RlKCk7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoSmFja3NvbkZlYXR1cmUuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChmaW5hbCBDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihKYWNrc29uRmVhdHVyZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW50aXR5SW5oZXJpdGFuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgRW50aXR5IGVudGl0eSA9IG5ldyBFbnRpdHkoImZvbyIsIDEzKTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkucG9zdChqYXZheC53cy5ycy5jbGllbnQuRW50aXR5Lmpzb24oZW50aXR5KSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShFbnRpdHkuY2xhc3MpLCBpcyhlbnRpdHkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbnRpdHlJbmhlcml0YW5jZUJsYW5rVGV4dCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5wb3N0KGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHkuanNvbihuZXcgRW50aXR5KCIiLCAxMykpKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcyg0MDApKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbnRpdHlJbmhlcml0YW5jZUludmFsaWROdW1iZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkucG9zdChqYXZheC53cy5ycy5jbGllbnQuRW50aXR5Lmpzb24obmV3IEVudGl0eSgiZm9vIiwgMjMpKSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoNDAwKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi9FeHRlbmRlZC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi9FeHRlbmRlZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyOWZhMDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL0V4dGVuZGVkLmphdmEKQEAgLTAsMCArMSwyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLnZhbGlkYXRpb247CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRXh0ZW5kZWQgeworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi9GaWVsZFByb3BlcnR5VmFsaWRhdGlvbi5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi9GaWVsZFByb3BlcnR5VmFsaWRhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYmM1ZDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL0ZpZWxkUHJvcGVydHlWYWxpZGF0aW9uLmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLnZhbGlkYXRpb247CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnQ7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQ7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXlsb2FkOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorQENvbnN0cmFpbnQodmFsaWRhdGVkQnkgPSBGaWVsZFByb3BlcnR5VmFsaWRhdGlvbi5WYWxpZGF0b3IuY2xhc3MpCitwdWJsaWMgQGludGVyZmFjZSBGaWVsZFByb3BlcnR5VmFsaWRhdGlvbiB7CisKKyAgICBTdHJpbmcgbWVzc2FnZSgpIGRlZmF1bHQgIm9uZSBvciBtb3JlIGZpZWxkcyBhcmUgbm90IHZhbGlkIjsKKworICAgIENsYXNzPD8+W10gZ3JvdXBzKCkgZGVmYXVsdCB7fTsKKworICAgIENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPltdIHBheWxvYWQoKSBkZWZhdWx0IHt9OworCisgICAgU3RyaW5nW10gZWxlbWVudHMoKSBkZWZhdWx0IHt9OworCisgICAgcHVibGljIGNsYXNzIFZhbGlkYXRvciBpbXBsZW1lbnRzIENvbnN0cmFpbnRWYWxpZGF0b3I8RmllbGRQcm9wZXJ0eVZhbGlkYXRpb24sIEZpZWxkUHJvcGVydHlWYWxpZGF0aW9uUmVzb3VyY2UuU3ViUmVzb3VyY2U+IHsKKworICAgICAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBwcm9wZXJ0aWVzOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKGZpbmFsIEZpZWxkUHJvcGVydHlWYWxpZGF0aW9uIGFubm90YXRpb24pIHsKKyAgICAgICAgICAgIHRoaXMucHJvcGVydGllcyA9IEFycmF5cy5hc0xpc3QoYW5ub3RhdGlvbi5lbGVtZW50cygpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKGZpbmFsIEZpZWxkUHJvcGVydHlWYWxpZGF0aW9uUmVzb3VyY2UuU3ViUmVzb3VyY2UgYmVhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dCBjb25zdHJhaW50VmFsaWRhdG9yQ29udGV4dCkgeworICAgICAgICAgICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOworCisgICAgICAgICAgICBmb3IgKGZpbmFsIFN0cmluZyBwcm9wZXJ0eSA6IHByb3BlcnRpZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoImZpZWxkQW5kQ2xhc3MiLmVxdWFscyhwcm9wZXJ0eSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICY9IGJlYW4uZmllbGRBbmRDbGFzcyAhPSBudWxsOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoInByb3BlcnR5QW5kQ2xhc3MiLmVxdWFscyhwcm9wZXJ0eSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ICY9IGJlYW4uZ2V0UHJvcGVydHlBbmRDbGFzcygpICE9IG51bGw7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgicHJvcGVydHlHZXR0ZXJBbmRDbGFzcyIuZXF1YWxzKHByb3BlcnR5KSkgeworICAgICAgICAgICAgICAgICAgICByZXN1bHQgJj0gYmVhbi5nZXRQcm9wZXJ0eUdldHRlckFuZENsYXNzKCkgIT0gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL0ZpZWxkUHJvcGVydHlWYWxpZGF0aW9uUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vRmllbGRQcm9wZXJ0eVZhbGlkYXRpb25SZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhM2M4OTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL0ZpZWxkUHJvcGVydHlWYWxpZGF0aW9uUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLnZhbGlkYXRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlNpemU7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BQYXRoKCJmaWVsZFByb3BlcnR5VmFsaWRhdGlvblJlc291cmNlIikKK3B1YmxpYyBjbGFzcyBGaWVsZFByb3BlcnR5VmFsaWRhdGlvblJlc291cmNlIHsKKworICAgIEBQYXRoKCJ2YWxpZCIpCisgICAgcHVibGljIFN1YlJlc291cmNlIHZhbGlkKCkgeworICAgICAgICByZXR1cm4gbmV3IFN1YlJlc291cmNlKCJ2YWxpZCIsICJ2YWxpZCIsICJ2YWxpZCIsICJ2YWxpZCIsICJ2YWxpZCIsICJ2YWxpZCIpOworICAgIH0KKworICAgIEBQYXRoKCJpbnZhbGlkUHJvcGVydHlHZXR0ZXJBbmRDbGFzc051bGwiKQorICAgIHB1YmxpYyBTdWJSZXNvdXJjZSBpbnZhbGlkUHJvcGVydHlHZXR0ZXJBbmRDbGFzc051bGwoKSB7CisgICAgICAgIHJldHVybiBuZXcgU3ViUmVzb3VyY2UoInZhbGlkIiwgInZhbGlkIiwgInZhbGlkIiwgInZhbGlkIiwgInZhbGlkIiwgbnVsbCk7CisgICAgfQorCisgICAgQFBhdGgoImludmFsaWRQcm9wZXJ0eUdldHRlckFuZENsYXNzTG9uZyIpCisgICAgcHVibGljIFN1YlJlc291cmNlIGludmFsaWRQcm9wZXJ0eUdldHRlckFuZENsYXNzTG9uZygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdWJSZXNvdXJjZSgidmFsaWQiLCAidmFsaWQiLCAidmFsaWQiLCAidmFsaWQiLCAidmFsaWQiLCAidmFsaWQtdmFsaWQiKTsKKyAgICB9CisKKyAgICBAUGF0aCgiaW52YWxpZFByb3BlcnR5QW5kQ2xhc3NOdWxsIikKKyAgICBwdWJsaWMgU3ViUmVzb3VyY2UgaW52YWxpZFByb3BlcnR5QW5kQ2xhc3NOdWxsKCkgeworICAgICAgICByZXR1cm4gbmV3IFN1YlJlc291cmNlKCJ2YWxpZCIsICJ2YWxpZCIsICJ2YWxpZCIsICJ2YWxpZCIsIG51bGwsICJ2YWxpZCIpOworICAgIH0KKworICAgIEBQYXRoKCJpbnZhbGlkRmllbGRBbmRDbGFzc051bGwiKQorICAgIHB1YmxpYyBTdWJSZXNvdXJjZSBpbnZhbGlkRmllbGRBbmRDbGFzc051bGwoKSB7CisgICAgICAgIHJldHVybiBuZXcgU3ViUmVzb3VyY2UoInZhbGlkIiwgInZhbGlkIiwgInZhbGlkIiwgbnVsbCwgInZhbGlkIiwgInZhbGlkIik7CisgICAgfQorCisgICAgQFBhdGgoImludmFsaWRQcm9wZXJ0eUdldHRlck51bGwiKQorICAgIHB1YmxpYyBTdWJSZXNvdXJjZSBpbnZhbGlkUHJvcGVydHlHZXR0ZXJOdWxsKCkgeworICAgICAgICByZXR1cm4gbmV3IFN1YlJlc291cmNlKCJ2YWxpZCIsICJ2YWxpZCIsIG51bGwsICJ2YWxpZCIsICJ2YWxpZCIsICJ2YWxpZCIpOworICAgIH0KKworICAgIEBQYXRoKCJpbnZhbGlkUHJvcGVydHlHZXR0ZXJMb25nIikKKyAgICBwdWJsaWMgU3ViUmVzb3VyY2UgaW52YWxpZFByb3BlcnR5R2V0dGVyTG9uZygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdWJSZXNvdXJjZSgidmFsaWQiLCAidmFsaWQiLCAidmFsaWQtdmFsaWQiLCAidmFsaWQiLCAidmFsaWQiLCAidmFsaWQiKTsKKyAgICB9CisKKyAgICBAUGF0aCgiaW52YWxpZFByb3BlcnR5TnVsbCIpCisgICAgcHVibGljIFN1YlJlc291cmNlIGludmFsaWRQcm9wZXJ0eU51bGwoKSB7CisgICAgICAgIHJldHVybiBuZXcgU3ViUmVzb3VyY2UoInZhbGlkIiwgbnVsbCwgInZhbGlkIiwgInZhbGlkIiwgInZhbGlkIiwgInZhbGlkIik7CisgICAgfQorCisgICAgQFBhdGgoImludmFsaWRGaWVsZE51bGwiKQorICAgIHB1YmxpYyBTdWJSZXNvdXJjZSBpbnZhbGlkRmllbGROdWxsKCkgeworICAgICAgICByZXR1cm4gbmV3IFN1YlJlc291cmNlKG51bGwsICJ2YWxpZCIsICJ2YWxpZCIsIG51bGwsICJ2YWxpZCIsICJ2YWxpZCIpOworICAgIH0KKworICAgIEBGaWVsZFByb3BlcnR5VmFsaWRhdGlvbihlbGVtZW50cyA9IHsiZmllbGRBbmRDbGFzcyIsICJwcm9wZXJ0eUFuZENsYXNzIiwgInByb3BlcnR5R2V0dGVyQW5kQ2xhc3MifSkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN1YlJlc291cmNlIHsKKworICAgICAgICBATm90TnVsbAorICAgICAgICBAU2l6ZShtaW4gPSA1KQorICAgICAgICBmaW5hbCBTdHJpbmcgZmllbGQ7CisKKyAgICAgICAgQE5vdE51bGwKKyAgICAgICAgQFNpemUobWluID0gNSkKKyAgICAgICAgZmluYWwgU3RyaW5nIHByb3BlcnR5OworCisgICAgICAgIEBOb3ROdWxsCisgICAgICAgIEBTaXplKG1pbiA9IDUpCisgICAgICAgIGZpbmFsIFN0cmluZyBwcm9wZXJ0eUdldHRlcjsKKworICAgICAgICBmaW5hbCBTdHJpbmcgZmllbGRBbmRDbGFzczsKKworICAgICAgICBmaW5hbCBTdHJpbmcgcHJvcGVydHlBbmRDbGFzczsKKworICAgICAgICBmaW5hbCBTdHJpbmcgcHJvcGVydHlHZXR0ZXJBbmRDbGFzczsKKworICAgICAgICBwdWJsaWMgU3ViUmVzb3VyY2UoZmluYWwgU3RyaW5nIGZpZWxkLCBmaW5hbCBTdHJpbmcgcHJvcGVydHksIGZpbmFsIFN0cmluZyBwcm9wZXJ0eUFuZEdldHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBmaWVsZEFuZENsYXNzLCBmaW5hbCBTdHJpbmcgcHJvcGVydHlBbmRDbGFzcywgZmluYWwgU3RyaW5nIHByb3BlcnR5R2V0dGVyQW5kQ2xhc3MpIHsKKyAgICAgICAgICAgIHRoaXMuZmllbGQgPSBmaWVsZDsKKyAgICAgICAgICAgIHRoaXMucHJvcGVydHkgPSBwcm9wZXJ0eTsKKyAgICAgICAgICAgIHRoaXMucHJvcGVydHlHZXR0ZXIgPSBwcm9wZXJ0eUFuZEdldHRlcjsKKyAgICAgICAgICAgIHRoaXMuZmllbGRBbmRDbGFzcyA9IGZpZWxkQW5kQ2xhc3M7CisgICAgICAgICAgICB0aGlzLnByb3BlcnR5QW5kQ2xhc3MgPSBwcm9wZXJ0eUFuZENsYXNzOworICAgICAgICAgICAgdGhpcy5wcm9wZXJ0eUdldHRlckFuZENsYXNzID0gcHJvcGVydHlHZXR0ZXJBbmRDbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHkoKSB7CisgICAgICAgICAgICByZXR1cm4gcHJvcGVydHk7CisgICAgICAgIH0KKworICAgICAgICBAU2l6ZShtYXggPSA1KQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5R2V0dGVyKCkgeworICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5R2V0dGVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRQcm9wZXJ0eUFuZENsYXNzKCkgeworICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5QW5kQ2xhc3M7CisgICAgICAgIH0KKworICAgICAgICBAU2l6ZShtYXggPSA1KQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5R2V0dGVyQW5kQ2xhc3MoKSB7CisgICAgICAgICAgICByZXR1cm4gcHJvcGVydHlHZXR0ZXJBbmRDbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBtZXRob2QoKSB7CisgICAgICAgICAgICByZXR1cm4gIm9rIjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vRmllbGRQcm9wZXJ0eVZhbGlkYXRpb25UZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL0ZpZWxkUHJvcGVydHlWYWxpZGF0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NTA3NjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL0ZpZWxkUHJvcGVydHlWYWxpZGF0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci52YWxpZGF0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEZpZWxkUHJvcGVydHlWYWxpZGF0aW9uVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhGaWVsZFByb3BlcnR5VmFsaWRhdGlvblJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgidmFsaWQiLCAyMDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRQcm9wZXJ0eUdldHRlckFuZENsYXNzTnVsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgiaW52YWxpZFByb3BlcnR5R2V0dGVyQW5kQ2xhc3NOdWxsIiwgNDAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkUHJvcGVydHlHZXR0ZXJBbmRDbGFzc0xvbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoImludmFsaWRQcm9wZXJ0eUdldHRlckFuZENsYXNzTG9uZyIsIDQwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFByb3BlcnR5QW5kQ2xhc3NOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJpbnZhbGlkUHJvcGVydHlBbmRDbGFzc051bGwiLCA0MDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRGaWVsZEFuZENsYXNzTnVsbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgiaW52YWxpZEZpZWxkQW5kQ2xhc3NOdWxsIiwgNDAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkUHJvcGVydHlHZXR0ZXJOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJpbnZhbGlkUHJvcGVydHlHZXR0ZXJOdWxsIiwgNDAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkUHJvcGVydHlHZXR0ZXJMb25nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJpbnZhbGlkUHJvcGVydHlHZXR0ZXJMb25nIiwgNDAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkUHJvcGVydHlOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJpbnZhbGlkUHJvcGVydHlOdWxsIiwgNDAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkRmllbGROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJpbnZhbGlkRmllbGROdWxsIiwgNDAwKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3QoZmluYWwgU3RyaW5nIHBhdGgsIGZpbmFsIGludCBzdGF0dXMpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImZpZWxkUHJvcGVydHlWYWxpZGF0aW9uUmVzb3VyY2UiKQorICAgICAgICAgICAgICAgIC5wYXRoKHBhdGgpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5nZXQoKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKHN0YXR1cykpOworCisgICAgICAgIGlmIChzdGF0dXMgPT0gMjAwKSB7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbygib2siKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL0luaGVyaXRhbmNlVmFsaWRhdGlvblRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vSW5oZXJpdGFuY2VWYWxpZGF0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZmEyYzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL0luaGVyaXRhbmNlVmFsaWRhdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLnZhbGlkYXRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk1heDsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk1pbjsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgSW5oZXJpdGFuY2VWYWxpZGF0aW9uVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgUmVzb3VyY2VOdW1iZXJJbnRlcmZhY2U8VCBleHRlbmRzIE51bWJlcj4geworCisgICAgICAgIEBQT1NUCisgICAgICAgIEBNaW4oMCkKKyAgICAgICAgQE5vdE51bGwKKyAgICAgICAgcHVibGljIFQgcG9zdChATm90TnVsbCBATWF4KDEwMCkgZmluYWwgVCB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgUmVzb3VyY2VTdHJpbmdJbnRlcmZhY2UgeworCisgICAgICAgIEBNaW4oLTUwKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3QoQE1heCg1MCkgZmluYWwgU3RyaW5nIHZhbHVlKTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZU51bWJlclN0cmluZyBpbXBsZW1lbnRzIFJlc291cmNlTnVtYmVySW50ZXJmYWNlPEludGVnZXI+LCBSZXNvdXJjZVN0cmluZ0ludGVyZmFjZSB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBJbnRlZ2VyIHBvc3QoZmluYWwgSW50ZWdlciB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoInN0cmluZyIpCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3QoZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL3N1YiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdWJDbGFzc1Jlc291cmNlTnVtYmVyU3RyaW5nIGV4dGVuZHMgUmVzb3VyY2VOdW1iZXJTdHJpbmcgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgSW50ZWdlciBwb3N0KGZpbmFsIEludGVnZXIgdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2VOdW1iZXJTdHJpbmcuY2xhc3MsIFN1YkNsYXNzUmVzb3VyY2VOdW1iZXJTdHJpbmcuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlTnVtYmVyUG9zaXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoNzUsIDIwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVOdW1iZXJJbnB1dE5lZ2F0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KDE1MCwgNDAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZVN0cmluZ1Bvc2l0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJzdHJpbmciLCAiMjUiLCAyMDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlU3RyaW5nSW5wdXROZWdhdGl2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgic3RyaW5nIiwgIjE1MCIsIDQwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVOdW1iZXJTdWJDbGFzc1Bvc2l0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJzdWIiLCA3NSwgMjAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZU51bWJlcklucHV0U3ViQ2xhc3NOZWdhdGl2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgic3ViIiwgMTUwLCA0MDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRlU3RyaW5nU3ViQ2xhc3NQb3NpdGl2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgic3ViL3N0cmluZyIsICIyNSIsIDIwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGVTdHJpbmdJbnB1dFN1YkNsYXNzTmVnYXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoInN1Yi9zdHJpbmciLCAiMTUwIiwgNDAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZU51bWJlclJlc3BvbnNlTmVnYXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoLTE1MCwgNTAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZVN0cmluZ1Jlc3BvbnNlTmVnYXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoInN0cmluZyIsICItMTUwIiwgNTAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZU51bWJlclJlc3BvbnNlU3ViQ2xhc3NOZWdhdGl2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgic3ViIiwgLTE1MCwgNTAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0ZVN0cmluZ1Jlc3BvbnNlU3ViQ2xhc3NOZWdhdGl2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgic3ViL3N0cmluZyIsICItMTUwIiwgNTAwKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3QoZmluYWwgT2JqZWN0IHZhbHVlLCBmaW5hbCBpbnQgcmVzcG9uc2VTdGF0dXMpIHsKKyAgICAgICAgX3Rlc3QoIiIsIHZhbHVlLCByZXNwb25zZVN0YXR1cyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0KGZpbmFsIFN0cmluZyBwYXRoLCBmaW5hbCBPYmplY3QgdmFsdWUsIGZpbmFsIGludCByZXNwb25zZVN0YXR1cykgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldChwYXRoKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkudGV4dCh2YWx1ZSkpOworCisgICAgICAgIGFzc2VydFRoYXQoIldyb25nIHJlc3BvbnNlLiIsIHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKHJlc3BvbnNlU3RhdHVzKSk7CisKKyAgICAgICAgaWYgKHJlc3BvbnNlU3RhdHVzID09IDIwMCkgeworICAgICAgICAgICAgYXNzZXJ0VGhhdCgiSW52YWxpZCBlbnRpdHkuIiwgcmVzcG9uc2UucmVhZEVudGl0eSh2YWx1ZS5nZXRDbGFzcygpKSwgZXF1YWxUbyh2YWx1ZSkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi9NdWx0aXBsZVBhcmFtQ29uc3RyYWludC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi9NdWx0aXBsZVBhcmFtQ29uc3RyYWludC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxN2FmNDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL011bHRpcGxlUGFyYW1Db25zdHJhaW50LmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLnZhbGlkYXRpb247CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworCitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50OworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uUGF5bG9hZDsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlNpemU7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BSZXRlbnRpb24odmFsdWUgPSBSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BDb25zdHJhaW50KHZhbGlkYXRlZEJ5ID0ge30pCitAUGFyYW1Db25zdHJhaW50CitAU2l6ZShtYXggPSAxMSkKK3B1YmxpYyBAaW50ZXJmYWNlIE11bHRpcGxlUGFyYW1Db25zdHJhaW50IHsKKworICAgIFN0cmluZyBtZXNzYWdlKCkgZGVmYXVsdCAiaW52YWxpZCBwYXJhbWV0ZXIiOworCisgICAgQ2xhc3M8Pz5bXSBncm91cHMoKSBkZWZhdWx0IHt9OworCisgICAgQ2xhc3M8PyBleHRlbmRzIFBheWxvYWQ+W10gcGF5bG9hZCgpIGRlZmF1bHQge307Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL05vbkVtcHR5TmFtZXMuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vTm9uRW1wdHlOYW1lcy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMjllMDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL05vbkVtcHR5TmFtZXMuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIudmFsaWRhdGlvbjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CisKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnQ7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQ7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXlsb2FkOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUmV0ZW50aW9uKHZhbHVlID0gUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitAQ29uc3RyYWludCh2YWxpZGF0ZWRCeSA9IHsgTm9uRW1wdHlOYW1lcy5WYWxpZGF0b3IuY2xhc3MgfSkKK3B1YmxpYyBAaW50ZXJmYWNlIE5vbkVtcHR5TmFtZXMgeworCisgICAgU3RyaW5nIG1lc3NhZ2UoKSBkZWZhdWx0ICJ7b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci52YWxpZGF0aW9uLk5vbkVtcHR5TmFtZXMubWVzc2FnZX0iOworCisgICAgQ2xhc3M8Pz5bXSBncm91cHMoKSBkZWZhdWx0IHt9OworCisgICAgQ2xhc3M8PyBleHRlbmRzIFBheWxvYWQ+W10gcGF5bG9hZCgpIGRlZmF1bHQge307CisKKyAgICBwdWJsaWMgY2xhc3MgVmFsaWRhdG9yIGltcGxlbWVudHMgQ29uc3RyYWludFZhbGlkYXRvcjxOb25FbXB0eU5hbWVzLCBCYXNpY1N1YlJlc291cmNlPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoZmluYWwgTm9uRW1wdHlOYW1lcyBub25SZWN1cnNpdmUpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKGZpbmFsIEJhc2ljU3ViUmVzb3VyY2UgcmVzb3VyY2UsIGZpbmFsIENvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0IGNvbnN0cmFpbnRWYWxpZGF0b3JDb250ZXh0KSB7CisgICAgICAgICAgICByZXR1cm4gaXNWYWxpZChyZXNvdXJjZS5nZXRGaXJzdE5hbWUoKSkgJiYgaXNWYWxpZChyZXNvdXJjZS5nZXRMYXN0TmFtZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkKGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICAvLyBATm90TnVsbCBjaGVja3MgbnVsbCB2YWx1ZQorICAgICAgICAgICAgcmV0dXJuIG5hbWUgPT0gbnVsbCB8fCAhIiIuZXF1YWxzKG5hbWUudHJpbSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vT25lQ29udGFjdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi9PbmVDb250YWN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ5N2NiNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vT25lQ29udGFjdC5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci52YWxpZGF0aW9uOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKKworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludDsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWYWxpZGF0b3I7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmFsaWRhdG9yQ29udGV4dDsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLlBheWxvYWQ7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorQE5vdE51bGwKK0BDb25zdHJhaW50KHZhbGlkYXRlZEJ5ID0gT25lQ29udGFjdC5WYWxpZGF0b3IuY2xhc3MpCitwdWJsaWMgQGludGVyZmFjZSBPbmVDb250YWN0IHsKKworICAgIFN0cmluZyBtZXNzYWdlKCkgZGVmYXVsdCAibm9uZSBvciBtb3JlIHRoYW4gb25lIGNvbnRhY3QiOworCisgICAgQ2xhc3M8Pz5bXSBncm91cHMoKSBkZWZhdWx0IHt9OworCisgICAgQ2xhc3M8PyBleHRlbmRzIFBheWxvYWQ+W10gcGF5bG9hZCgpIGRlZmF1bHQge307CisKKyAgICBwdWJsaWMgY2xhc3MgVmFsaWRhdG9yIGltcGxlbWVudHMgQ29uc3RyYWludFZhbGlkYXRvcjxPbmVDb250YWN0LCBDb250YWN0QmVhbj4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKGZpbmFsIE9uZUNvbnRhY3Qgbm9uUmVjdXJzaXZlKSB7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZChmaW5hbCBDb250YWN0QmVhbiBjb250YWN0QmVhbiwgZmluYWwgQ29uc3RyYWludFZhbGlkYXRvckNvbnRleHQgY29uc3RyYWludFZhbGlkYXRvckNvbnRleHQpIHsKKyAgICAgICAgICAgIGlmIChjb250YWN0QmVhbi5nZXRFbWFpbCgpID09IG51bGwgJiYgY29udGFjdEJlYW4uZ2V0UGhvbmUoKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICEoY29udGFjdEJlYW4uZ2V0RW1haWwoKSAhPSBudWxsICYmIGNvbnRhY3RCZWFuLmdldFBob25lKCkgIT0gbnVsbCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL1BhcmFtQ29uc3RyYWludC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi9QYXJhbUNvbnN0cmFpbnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGQyNjJiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi9QYXJhbUNvbnN0cmFpbnQuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIudmFsaWRhdGlvbjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CisKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnQ7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5QYXlsb2FkOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLlBhdHRlcm47CisKKy8qKgorICogVmFsaWQ6IFthLXpBLVpdK1BhcmFtCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitAQ29uc3RyYWludCh2YWxpZGF0ZWRCeSA9IHt9KQorQE5vdE51bGwKK0BQYXR0ZXJuKHJlZ2V4cCA9ICJeW2EtekEtWl0rUGFyYW0kIikKK3B1YmxpYyBAaW50ZXJmYWNlIFBhcmFtQ29uc3RyYWludCB7CisKKyAgICBTdHJpbmcgbWVzc2FnZSgpIGRlZmF1bHQgImludmFsaWQgcGFyYW1ldGVyIjsKKworICAgIENsYXNzPD8+W10gZ3JvdXBzKCkgZGVmYXVsdCB7fTsKKworICAgIENsYXNzPD8gZXh0ZW5kcyBQYXlsb2FkPltdIHBheWxvYWQoKSBkZWZhdWx0IHt9OworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi9Qcm9ncmFtbWF0aWNWYWxpZGF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi9Qcm9ncmFtbWF0aWNWYWxpZGF0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMzA4MTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL1Byb2dyYW1tYXRpY1ZhbGlkYXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci52YWxpZGF0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5JbmZsZWN0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQmVhbiBWYWxpZGF0aW9uIHRlc3RzIGZvciBwcm9ncmFtbWF0aWNhbGx5IGNyZWF0ZWQgcmVzb3VyY2VzLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgUHJvZ3JhbW1hdGljVmFsaWRhdGlvblRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIGZpbmFsIFNldDxSZXNvdXJjZT4gcmVzb3VyY2VzID0gbmV3IEhhc2hTZXQ8PigpOworCisgICAgICAgIFJlc291cmNlLkJ1aWxkZXIgcmVzb3VyY2VCdWlsZGVyID0gUmVzb3VyY2UuYnVpbGRlcigiaW5zdGFuY2UiKTsKKyAgICAgICAgcmVzb3VyY2VCdWlsZGVyCisgICAgICAgICAgICAgICAgLmFkZE1ldGhvZCgiUE9TVCIpCisgICAgICAgICAgICAgICAgLmhhbmRsZWRCeShuZXcgVmFsaWRhdGlvbkluZmxlY3RvcigpKTsKKyAgICAgICAgcmVzb3VyY2VzLmFkZChyZXNvdXJjZUJ1aWxkZXIuYnVpbGQoKSk7CisKKyAgICAgICAgcmVzb3VyY2VCdWlsZGVyID0gUmVzb3VyY2UuYnVpbGRlcigiY2xhc3MiKTsKKyAgICAgICAgcmVzb3VyY2VCdWlsZGVyCisgICAgICAgICAgICAgICAgLmFkZE1ldGhvZCgiUE9TVCIpCisgICAgICAgICAgICAgICAgLmhhbmRsZWRCeShWYWxpZGF0aW9uSW5mbGVjdG9yLmNsYXNzKTsKKyAgICAgICAgcmVzb3VyY2VzLmFkZChyZXNvdXJjZUJ1aWxkZXIuYnVpbGQoKSk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc291cmNlQnVpbGRlciA9IFJlc291cmNlLmJ1aWxkZXIoIm1ldGhvZEluc3RhbmNlQ2xhc3MiKTsKKyAgICAgICAgICAgIHJlc291cmNlQnVpbGRlcgorICAgICAgICAgICAgICAgICAgICAuYWRkTWV0aG9kKCJQT1NUIikKKyAgICAgICAgICAgICAgICAgICAgLmhhbmRsZWRCeShuZXcgVmFsaWRhdGlvbkluZmxlY3RvcigpLCBWYWxpZGF0aW9uSW5mbGVjdG9yLmNsYXNzLmdldE1ldGhvZCgiZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250YWluZXJSZXF1ZXN0Q29udGV4dC5jbGFzcykpOworICAgICAgICAgICAgcmVzb3VyY2VzLmFkZChyZXNvdXJjZUJ1aWxkZXIuYnVpbGQoKSk7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc291cmNlQnVpbGRlciA9IFJlc291cmNlLmJ1aWxkZXIoIm1ldGhvZENsYXNzQ2xhc3MiKTsKKyAgICAgICAgICAgIHJlc291cmNlQnVpbGRlcgorICAgICAgICAgICAgICAgICAgICAuYWRkTWV0aG9kKCJQT1NUIikKKyAgICAgICAgICAgICAgICAgICAgLmhhbmRsZWRCeShWYWxpZGF0aW9uSW5mbGVjdG9yLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRpb25JbmZsZWN0b3IuY2xhc3MuZ2V0TWV0aG9kKCJnZXQiLCBDb250YWluZXJSZXF1ZXN0Q29udGV4dC5jbGFzcykpOworICAgICAgICAgICAgcmVzb3VyY2VzLmFkZChyZXNvdXJjZUJ1aWxkZXIuYnVpbGQoKSk7CisgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc291cmNlQnVpbGRlciA9IFJlc291cmNlLmJ1aWxkZXIoIm1ldGhvZEluc3RhbmNlSW50ZXJmYWNlIik7CisgICAgICAgICAgICByZXNvdXJjZUJ1aWxkZXIKKyAgICAgICAgICAgICAgICAgICAgLmFkZE1ldGhvZCgiUE9TVCIpCisgICAgICAgICAgICAgICAgICAgIC5oYW5kbGVkQnkobmV3IFZhbGlkYXRpb25JbmZsZWN0b3IoKSwgSW5mbGVjdG9yLmNsYXNzLmdldE1ldGhvZCgiYXBwbHkiLCBPYmplY3QuY2xhc3MpKTsKKyAgICAgICAgICAgIHJlc291cmNlcy5hZGQocmVzb3VyY2VCdWlsZGVyLmJ1aWxkKCkpOworICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXNvdXJjZUJ1aWxkZXIgPSBSZXNvdXJjZS5idWlsZGVyKCJtZXRob2RDbGFzc0ludGVyZmFjZSIpOworICAgICAgICAgICAgcmVzb3VyY2VCdWlsZGVyCisgICAgICAgICAgICAgICAgICAgIC5hZGRNZXRob2QoIlBPU1QiKQorICAgICAgICAgICAgICAgICAgICAuaGFuZGxlZEJ5KFZhbGlkYXRpb25JbmZsZWN0b3IuY2xhc3MsIEluZmxlY3Rvci5jbGFzcy5nZXRNZXRob2QoImFwcGx5IiwgT2JqZWN0LmNsYXNzKSk7CisgICAgICAgICAgICByZXNvdXJjZXMuYWRkKHJlc291cmNlQnVpbGRlci5idWlsZCgpKTsKKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKCkucmVnaXN0ZXIoTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpLnJlZ2lzdGVyUmVzb3VyY2VzKHJlc291cmNlcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5mbGVjdG9ySW5zdGFuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImluc3RhbmNlIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eSgidmFsdWUiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbmZsZWN0b3JJbnN0YW5jZU5lZ2F0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJpbnN0YW5jZSIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobnVsbCwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworCisgICAgICAgIGFzc2VydEVxdWFscyg1MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbmZsZWN0b3JDbGFzcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiY2xhc3MiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KCJ2YWx1ZSIsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidmFsdWUiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluZmxlY3RvckNsYXNzTmVnYXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImNsYXNzIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShudWxsLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluZmxlY3Rvck1ldGhvZEluc3RhbmNlQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoIm1ldGhvZEluc3RhbmNlQ2xhc3MiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KCJ2YWx1ZSIsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidmFsdWUiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluZmxlY3Rvck1ldGhvZEluc3RhbmNlQ2xhc3NOZWdhdGl2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgibWV0aG9kSW5zdGFuY2VDbGFzcyIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkobnVsbCwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworCisgICAgICAgIGFzc2VydEVxdWFscyg1MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbmZsZWN0b3JNZXRob2RDbGFzc0NsYXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJtZXRob2RDbGFzc0NsYXNzIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eSgidmFsdWUiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbmZsZWN0b3JNZXRob2RDbGFzc0NsYXNzTmVnYXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoIm1ldGhvZENsYXNzQ2xhc3MiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG51bGwsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNTAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5mbGVjdG9yTWV0aG9kSW5zdGFuY2VJbnRlcmZhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoIm1ldGhvZEluc3RhbmNlSW50ZXJmYWNlIikucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eSgidmFsdWUiLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbmZsZWN0b3JNZXRob2RJbnN0YW5jZUludGVyZmFjZU5lZ2F0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJtZXRob2RJbnN0YW5jZUludGVyZmFjZSIpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkobnVsbCwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworCisgICAgICAgIGFzc2VydEVxdWFscyg1MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbmZsZWN0b3JNZXRob2RDbGFzc0ludGVyZmFjZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgibWV0aG9kQ2xhc3NJbnRlcmZhY2UiKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KCJ2YWx1ZSIsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidmFsdWUiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluZmxlY3Rvck1ldGhvZENsYXNzSW50ZXJmYWNlTmVnYXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoIm1ldGhvZENsYXNzSW50ZXJmYWNlIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShudWxsLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vUHJvcGVydHlWYWxpZGF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi9Qcm9wZXJ0eVZhbGlkYXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTAxZmY1YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vUHJvcGVydHlWYWxpZGF0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTg5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIudmFsaWRhdGlvbjsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CisKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5NYXBQcm9wZXJ0aWVzRGVsZWdhdGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnZhbGlkYXRpb24uVmFsaWRhdGlvbkZlYXR1cmU7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdCB2YXJpb3VzIGNvbWJpbmF0aW9ucyBvZiBlbmFibGluZy9kaXNhYmxpbmc6IGF1dG8tZGlzY292ZXJ5LCBiZWFuIHZhbGlkYXRpb24sIHZhbGlkYXRpb24gZmVhdHVyZS4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9wZXJ0eVZhbGlkYXRpb25UZXN0IHsKKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBATm90TnVsbAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3QoZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWUuaXNFbXB0eSgpID8gbnVsbCA6IHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFZhbGlkYXRpb25EZWZhdWx0RGlzY292ZXJ5RmVhdHVyZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCg1MDAsIG51bGwsIG51bGwsIHRydWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRWYWxpZGF0aW9uRGVmYXVsdERpc2NvdmVyeU5vRmVhdHVyZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCg1MDAsIG51bGwsIG51bGwsIGZhbHNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0VmFsaWRhdGlvbkRpc2NvdmVyeUZlYXR1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoNTAwLCBudWxsLCBmYWxzZSwgdHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFZhbGlkYXRpb25EaXNjb3ZlcnlOb0ZlYXR1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoNTAwLCBudWxsLCBmYWxzZSwgZmFsc2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRWYWxpZGF0aW9uTm9EaXNjb3ZlcnlGZWF0dXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KDUwMCwgbnVsbCwgdHJ1ZSwgdHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdFZhbGlkYXRpb25Ob0Rpc2NvdmVyeU5vRmVhdHVyZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBFdmVuIHRob3VnaCBwcm9wZXJ0aWVzIGFyZSBkaXNhYmxlZCBCViBpcyByZWdpc3RlcmVkLgorICAgICAgICBfdGVzdCg1MDAsIG51bGwsIHRydWUsIGZhbHNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0aW9uRGVmYXVsdERpc2NvdmVyeUZlYXR1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoNTAwLCBmYWxzZSwgbnVsbCwgdHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGlvbkRlZmF1bHREaXNjb3ZlcnlOb0ZlYXR1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoNTAwLCBmYWxzZSwgbnVsbCwgZmFsc2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRpb25EaXNjb3ZlcnlGZWF0dXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KDUwMCwgZmFsc2UsIGZhbHNlLCB0cnVlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0aW9uRGlzY292ZXJ5Tm9GZWF0dXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KDUwMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGlvbk5vRGlzY292ZXJ5RmVhdHVyZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCg1MDAsIGZhbHNlLCB0cnVlLCB0cnVlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RWYWxpZGF0aW9uTm9EaXNjb3ZlcnlOb0ZlYXR1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gRXZlbiB0aG91Z2ggcHJvcGVydGllcyBhcmUgZGlzYWJsZWQgQlYgaXMgcmVnaXN0ZXJlZC4KKyAgICAgICAgX3Rlc3QoNTAwLCBmYWxzZSwgdHJ1ZSwgZmFsc2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vVmFsaWRhdGlvbkRlZmF1bHREaXNjb3ZlcnlGZWF0dXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KDIwNCwgdHJ1ZSwgbnVsbCwgdHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9WYWxpZGF0aW9uRGVmYXVsdERpc2NvdmVyeU5vRmVhdHVyZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgyMDQsIHRydWUsIG51bGwsIGZhbHNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb1ZhbGlkYXRpb25EaXNjb3ZlcnlGZWF0dXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KDIwNCwgdHJ1ZSwgZmFsc2UsIHRydWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vVmFsaWRhdGlvbkRpc2NvdmVyeU5vRmVhdHVyZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgyMDQsIHRydWUsIGZhbHNlLCBmYWxzZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9WYWxpZGF0aW9uTm9EaXNjb3ZlcnlGZWF0dXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KDIwNCwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9WYWxpZGF0aW9uTm9EaXNjb3ZlcnlOb0ZlYXR1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoMjA0LCB0cnVlLCB0cnVlLCBmYWxzZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0KGZpbmFsIGludCByZXNwb25zZVN0YXR1cywgZmluYWwgQm9vbGVhbiBkaXNhYmxlVmFsaWRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQm9vbGVhbiBkaXNhYmxlQXV0b0Rpc2NvdmVyeSwgZmluYWwgYm9vbGVhbiByZWdpc3RlckZlYXR1cmUpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBVUkkgdXJpID0gVVJJLmNyZWF0ZSgiLyIpOworCisgICAgICAgIGFzc2VydEFwcGx5KHJlc3BvbnNlU3RhdHVzLCBpbml0UmVzb3VyY2VDb25maWcoZGlzYWJsZVZhbGlkYXRpb24sIGRpc2FibGVBdXRvRGlzY292ZXJ5LCByZWdpc3RlckZlYXR1cmUpLCB1cmkpOworCisgICAgICAgIGlmIChyZXNwb25zZVN0YXR1cyA9PSA1MDApIHsKKyAgICAgICAgICAgIC8vIHZhbGlkYXRpb24gd29ya3MgLSBlbnZpcm9ubWVudCBpcyB2YWxpZGF0aW9uIGZyaWVuZGx5IC0+IGxldCdzIHRyeSB0byBkaXNhYmxlIE1FVEEtSU5GL3NlcnZpY2VzIGxvb2t1cAorICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBpbml0UmVzb3VyY2VDb25maWcoZGlzYWJsZVZhbGlkYXRpb24sIGRpc2FibGVBdXRvRGlzY292ZXJ5LCB0cnVlKTsKKyAgICAgICAgICAgIHJlc291cmNlQ29uZmlnLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuTUVUQUlORl9TRVJWSUNFU19MT09LVVBfRElTQUJMRSwgdHJ1ZSk7CisKKyAgICAgICAgICAgIGFzc2VydEFwcGx5KDUwMCwgcmVzb3VyY2VDb25maWcsIHVyaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIFJlc291cmNlQ29uZmlnIGluaXRSZXNvdXJjZUNvbmZpZyhmaW5hbCBCb29sZWFuIGRpc2FibGVWYWxpZGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEJvb2xlYW4gZGlzYWJsZUF1dG9EaXNjb3ZlcnksIGZpbmFsIGJvb2xlYW4gcmVnaXN0ZXJGZWF0dXJlKSB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzKS5yZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcyk7CisKKyAgICAgICAgaWYgKHJlZ2lzdGVyRmVhdHVyZSkgeworICAgICAgICAgICAgcmVzb3VyY2VDb25maWcucmVnaXN0ZXIoVmFsaWRhdGlvbkZlYXR1cmUuY2xhc3MpOworICAgICAgICB9CisgICAgICAgIGlmIChkaXNhYmxlQXV0b0Rpc2NvdmVyeSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXNvdXJjZUNvbmZpZy5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLkZFQVRVUkVfQVVUT19ESVNDT1ZFUllfRElTQUJMRSwgZGlzYWJsZUF1dG9EaXNjb3ZlcnkpOworICAgICAgICB9CisgICAgICAgIGlmIChkaXNhYmxlVmFsaWRhdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICByZXNvdXJjZUNvbmZpZy5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLkJWX0ZFQVRVUkVfRElTQUJMRSwgZGlzYWJsZVZhbGlkYXRpb24pOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXNvdXJjZUNvbmZpZzsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0QXBwbHkoaW50IHJlc3BvbnNlU3RhdHVzLCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZywgVVJJIHVyaSkKKyAgICAgICAgICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgRXhlY3V0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQXBwbGljYXRpb25IYW5kbGVyIGFwcGxpY2F0aW9uSGFuZGxlciA9IG5ldyBBcHBsaWNhdGlvbkhhbmRsZXIocmVzb3VyY2VDb25maWcpOworICAgICAgICBmaW5hbCBDb250YWluZXJSZXF1ZXN0IHJlcXVlc3RDb250ZXh0ID0gbmV3IENvbnRhaW5lclJlcXVlc3QodXJpLCB1cmksICJQT1NUIiwgbnVsbCwgbmV3IE1hcFByb3BlcnRpZXNEZWxlZ2F0ZSgpKTsKKyAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgY29udGFpbmVyUmVzcG9uc2UgPSBhcHBsaWNhdGlvbkhhbmRsZXIuYXBwbHkocmVxdWVzdENvbnRleHQpLmdldCgpOworCisgICAgICAgIGFzc2VydEVxdWFscyhyZXNwb25zZVN0YXR1cywgY29udGFpbmVyUmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi9WYWxpZGF0aW9uSW5mbGVjdG9yLmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL1ZhbGlkYXRpb25JbmZsZWN0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Zjc3NTVmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi9WYWxpZGF0aW9uSW5mbGVjdG9yLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLnZhbGlkYXRpb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworCitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5SZWFkZXJXcml0ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5JbmZsZWN0b3I7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBWYWxpZGF0aW9uSW5mbGVjdG9yIGltcGxlbWVudHMgSW5mbGVjdG9yPENvbnRhaW5lclJlcXVlc3RDb250ZXh0LCBTdHJpbmc+IHsKKworICAgIEBOb3ROdWxsCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBhcHBseShmaW5hbCBDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgeworICAgICAgICByZXR1cm4gZ2V0KHJlcXVlc3RDb250ZXh0KTsKKyAgICB9CisKKyAgICBATm90TnVsbAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KEBOb3ROdWxsIGZpbmFsIENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW50aXR5ID0gUmVhZGVyV3JpdGVyLnJlYWRGcm9tQXNTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LmdldEVudGl0eVN0cmVhbSgpLAorICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5nZXRNZWRpYVR5cGUoKSk7CisKKyAgICAgICAgICAgIHJldHVybiBlbnRpdHkuaXNFbXB0eSgpID8gbnVsbCA6IGVudGl0eTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgcmV0dXJuICJlcnJvciI7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL3ZhbGlkYXRlb25leGVjdXRpb24vQW5vdGhlckNvbnRhY3RCZWFuLmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL3ZhbGlkYXRlb25leGVjdXRpb24vQW5vdGhlckNvbnRhY3RCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUxYjc5MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vdmFsaWRhdGVvbmV4ZWN1dGlvbi9Bbm90aGVyQ29udGFjdEJlYW4uamF2YQpAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLnZhbGlkYXRpb24udmFsaWRhdGVvbmV4ZWN1dGlvbjsKKworaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOworCitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuUGF0dGVybjsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLmV4ZWN1dGFibGUuRXhlY3V0YWJsZVR5cGU7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5leGVjdXRhYmxlLlZhbGlkYXRlT25FeGVjdXRpb247CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIudmFsaWRhdGlvbi5FeHRlbmRlZDsKKworaW1wb3J0IG9yZy5oaWJlcm5hdGUudmFsaWRhdG9yLmNvbnN0cmFpbnRzLkVtYWlsOworaW1wb3J0IG9yZy5oaWJlcm5hdGUudmFsaWRhdG9yLmNvbnN0cmFpbnRzLk5vdEJsYW5rOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAWG1sUm9vdEVsZW1lbnQKK3B1YmxpYyBjbGFzcyBBbm90aGVyQ29udGFjdEJlYW4gaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgZW1haWw7CisKKyAgICBwcml2YXRlIFN0cmluZyBwaG9uZTsKKworICAgIEBOb3RCbGFuaworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgICBATm90TnVsbChncm91cHMgPSB7RXh0ZW5kZWQuY2xhc3N9KQorICAgIHByaXZhdGUgU3RyaW5nIGNpdHk7CisKKyAgICBwdWJsaWMgQW5vdGhlckNvbnRhY3RCZWFuKCkgeworICAgIH0KKworICAgIHB1YmxpYyBBbm90aGVyQ29udGFjdEJlYW4oZmluYWwgU3RyaW5nIGVtYWlsLCBmaW5hbCBTdHJpbmcgcGhvbmUsIGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTdHJpbmcgY2l0eSkgeworICAgICAgICB0aGlzLmVtYWlsID0gZW1haWw7CisgICAgICAgIHRoaXMucGhvbmUgPSBwaG9uZTsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5jaXR5ID0gY2l0eTsKKyAgICB9CisKKyAgICBARW1haWwocmVnZXhwID0gIlthLXpBLVowLTkuXyUtXStAW2EtekEtWjAtOS4tXStcXC5bYS16QS1aXXsyLDR9IikKKyAgICBwdWJsaWMgU3RyaW5nIGdldEVtYWlsKCkgeworICAgICAgICByZXR1cm4gZW1haWw7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0RW1haWwoZmluYWwgU3RyaW5nIGVtYWlsKSB7CisgICAgICAgIHRoaXMuZW1haWwgPSBlbWFpbDsKKyAgICB9CisKKyAgICBAUGF0dGVybihyZWdleHAgPSAiWzAtOV17Myw5fSIpCisgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLk5PTl9HRVRURVJfTUVUSE9EUykKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBob25lKCkgeworICAgICAgICByZXR1cm4gcGhvbmU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UGhvbmUoZmluYWwgU3RyaW5nIHBob25lKSB7CisgICAgICAgIHRoaXMucGhvbmUgPSBwaG9uZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKHRoaXMgPT0gbykgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIEFub3RoZXJDb250YWN0QmVhbikpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIEFub3RoZXJDb250YWN0QmVhbiB0aGF0ID0gKEFub3RoZXJDb250YWN0QmVhbikgbzsKKworICAgICAgICBpZiAoZW1haWwgIT0gbnVsbCA/ICFlbWFpbC5lcXVhbHModGhhdC5lbWFpbCkgOiB0aGF0LmVtYWlsICE9IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobmFtZSAhPSBudWxsID8gIW5hbWUuZXF1YWxzKHRoYXQubmFtZSkgOiB0aGF0Lm5hbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChwaG9uZSAhPSBudWxsID8gIXBob25lLmVxdWFscyh0aGF0LnBob25lKSA6IHRoYXQucGhvbmUgIT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IHJlc3VsdCA9IGVtYWlsICE9IG51bGwgPyBlbWFpbC5oYXNoQ29kZSgpIDogMDsKKyAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyAocGhvbmUgIT0gbnVsbCA/IHBob25lLmhhc2hDb2RlKCkgOiAwKTsKKyAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyAobmFtZSAhPSBudWxsID8gbmFtZS5oYXNoQ29kZSgpIDogMCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJBbm90aGVyQ29udGFjdEJlYW57IgorICAgICAgICAgICAgICAgICsgImVtYWlsPSciICsgZW1haWwgKyAnXCcnCisgICAgICAgICAgICAgICAgKyAiLCBwaG9uZT0nIiArIHBob25lICsgJ1wnJworICAgICAgICAgICAgICAgICsgIiwgbmFtZT0nIiArIG5hbWUgKyAnXCcnCisgICAgICAgICAgICAgICAgKyAnfSc7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi92YWxpZGF0ZW9uZXhlY3V0aW9uL1ZhbGlkYXRlT25FeGVjdXRpb25BYnN0cmFjdFRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vdmFsaWRhdGVvbmV4ZWN1dGlvbi9WYWxpZGF0ZU9uRXhlY3V0aW9uQWJzdHJhY3RUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZmYjY1OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vdmFsaWRhdGVvbmV4ZWN1dGlvbi9WYWxpZGF0ZU9uRXhlY3V0aW9uQWJzdHJhY3RUZXN0LmphdmEKQEAgLTAsMCArMSwyMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci52YWxpZGF0aW9uLnZhbGlkYXRlb25leGVjdXRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC51dGlsLnJ1bm5lci5SdW5TZXBhcmF0ZWx5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmFsaWRhdGVPbkV4ZWN1dGlvbkFic3RyYWN0VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25NZXRob2RWYWxpZGF0ZUlucHV0UGFzc1ZhbGlkYXRlRXhlY3V0YWJsZURlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RPbk1ldGhvZCgidmFsaWRhdGVFeGVjdXRhYmxlRGVmYXVsdCIsIDAsIDIwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25NZXRob2RWYWxpZGF0ZUlucHV0RmFpbFZhbGlkYXRlRXhlY3V0YWJsZURlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RPbk1ldGhvZCgidmFsaWRhdGVFeGVjdXRhYmxlRGVmYXVsdCIsIDE1LCA0MDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uTWV0aG9kVmFsaWRhdGVJbnB1dFBhc3NWYWxpZGF0ZUV4ZWN1dGFibGVNYXRjaCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdE9uTWV0aG9kKCJ2YWxpZGF0ZUV4ZWN1dGFibGVNYXRjaCIsIDAsIDIwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25NZXRob2RWYWxpZGF0ZUlucHV0RmFpbFZhbGlkYXRlRXhlY3V0YWJsZU1hdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0T25NZXRob2QoInZhbGlkYXRlRXhlY3V0YWJsZU1hdGNoIiwgMTUsIDQwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25NZXRob2RWYWxpZGF0ZUlucHV0UGFzc1ZhbGlkYXRlRXhlY3V0YWJsZU1pc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RPbk1ldGhvZCgidmFsaWRhdGVFeGVjdXRhYmxlTWlzcyIsIDAsIDIwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25NZXRob2RWYWxpZGF0ZUlucHV0UGFzc0JpZ2dlclZhbGlkYXRlRXhlY3V0YWJsZU1pc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RPbk1ldGhvZCgidmFsaWRhdGVFeGVjdXRhYmxlTWlzcyIsIDE1LCAyMDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uTWV0aG9kVmFsaWRhdGVJbnB1dFBhc3NWYWxpZGF0ZUV4ZWN1dGFibGVOb25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0T25NZXRob2QoInZhbGlkYXRlRXhlY3V0YWJsZU5vbmUiLCAwLCAyMDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uTWV0aG9kVmFsaWRhdGVJbnB1dFBhc3NCaWdnZXJWYWxpZGF0ZUV4ZWN1dGFibGVOb25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0T25NZXRob2QoInZhbGlkYXRlRXhlY3V0YWJsZU5vbmUiLCAxNSwgMjAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPbk1ldGhvZFZhbGlkYXRlUmVzdWx0UGFzc1ZhbGlkYXRlRXhlY3V0YWJsZURlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RPbk1ldGhvZCgidmFsaWRhdGVFeGVjdXRhYmxlRGVmYXVsdCIsIDAsIDIwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25NZXRob2RWYWxpZGF0ZVJlc3VsdEZhaWxWYWxpZGF0ZUV4ZWN1dGFibGVEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0T25NZXRob2QoInZhbGlkYXRlRXhlY3V0YWJsZURlZmF1bHQiLCAtMTUsIDUwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25NZXRob2RWYWxpZGF0ZVJlc3VsdFBhc3NWYWxpZGF0ZUV4ZWN1dGFibGVNYXRjaCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdE9uTWV0aG9kKCJ2YWxpZGF0ZUV4ZWN1dGFibGVNYXRjaCIsIDAsIDIwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25NZXRob2RWYWxpZGF0ZVJlc3VsdEZhaWxWYWxpZGF0ZUV4ZWN1dGFibGVNYXRjaCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdE9uTWV0aG9kKCJ2YWxpZGF0ZUV4ZWN1dGFibGVNYXRjaCIsIC0xNSwgNTAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPbk1ldGhvZFZhbGlkYXRlUmVzdWx0UGFzc1ZhbGlkYXRlRXhlY3V0YWJsZU1pc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RPbk1ldGhvZCgidmFsaWRhdGVFeGVjdXRhYmxlTWlzcyIsIDAsIDIwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25NZXRob2RWYWxpZGF0ZVJlc3VsdFBhc3NCaWdnZXJWYWxpZGF0ZUV4ZWN1dGFibGVNaXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0T25NZXRob2QoInZhbGlkYXRlRXhlY3V0YWJsZU1pc3MiLCAtMTUsIDIwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25NZXRob2RWYWxpZGF0ZVJlc3VsdFBhc3NWYWxpZGF0ZUV4ZWN1dGFibGVOb25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0T25NZXRob2QoInZhbGlkYXRlRXhlY3V0YWJsZU5vbmUiLCAwLCAyMDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uTWV0aG9kVmFsaWRhdGVSZXN1bHRQYXNzQmlnZ2VyVmFsaWRhdGVFeGVjdXRhYmxlTm9uZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdE9uTWV0aG9kKCJ2YWxpZGF0ZUV4ZWN1dGFibGVOb25lIiwgLTE1LCAyMDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uVHlwZVZhbGlkYXRlSW5wdXRQYXNzVmFsaWRhdGVFeGVjdXRhYmxlRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdE9uVHlwZSgiZGVmYXVsdCIsIDAsIDIwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25UeXBlVmFsaWRhdGVJbnB1dFBhc3NWYWxpZGF0ZUV4ZWN1dGFibGVNYXRjaCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdE9uVHlwZSgibWF0Y2giLCAwLCAyMDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uVHlwZVZhbGlkYXRlSW5wdXRGYWlsVmFsaWRhdGVFeGVjdXRhYmxlTWF0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RPblR5cGUoIm1hdGNoIiwgMTUsIDQwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25UeXBlVmFsaWRhdGVJbnB1dFBhc3NWYWxpZGF0ZUV4ZWN1dGFibGVNaXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0T25UeXBlKCJtaXNzIiwgMCwgMjAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPblR5cGVWYWxpZGF0ZUlucHV0UGFzc0JpZ2dlclZhbGlkYXRlRXhlY3V0YWJsZU1pc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RPblR5cGUoIm1pc3MiLCAxNSwgMjAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPblR5cGVWYWxpZGF0ZUlucHV0UGFzc1ZhbGlkYXRlRXhlY3V0YWJsZU5vbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RPblR5cGUoIm5vbmUiLCAwLCAyMDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uVHlwZVZhbGlkYXRlSW5wdXRQYXNzQmlnZ2VyVmFsaWRhdGVFeGVjdXRhYmxlTm9uZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdE9uVHlwZSgibm9uZSIsIDE1LCAyMDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uVHlwZVZhbGlkYXRlUmVzdWx0UGFzc1ZhbGlkYXRlRXhlY3V0YWJsZURlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RPblR5cGUoImRlZmF1bHQiLCAwLCAyMDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uVHlwZVZhbGlkYXRlUmVzdWx0UGFzc1ZhbGlkYXRlRXhlY3V0YWJsZU1hdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0T25UeXBlKCJtYXRjaCIsIDAsIDIwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAUnVuU2VwYXJhdGVseQorICAgIHB1YmxpYyB2b2lkIHRlc3RPblR5cGVWYWxpZGF0ZVJlc3VsdEZhaWxWYWxpZGF0ZUV4ZWN1dGFibGVNYXRjaCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdE9uVHlwZSgibWF0Y2giLCAtMTUsIDUwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25UeXBlVmFsaWRhdGVSZXN1bHRQYXNzVmFsaWRhdGVFeGVjdXRhYmxlTWlzcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdE9uVHlwZSgibWlzcyIsIDAsIDIwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAUnVuU2VwYXJhdGVseQorICAgIHB1YmxpYyB2b2lkIHRlc3RPblR5cGVWYWxpZGF0ZVJlc3VsdFBhc3NCaWdnZXJWYWxpZGF0ZUV4ZWN1dGFibGVNaXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0T25UeXBlKCJtaXNzIiwgLTE1LCAyMDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uVHlwZVZhbGlkYXRlUmVzdWx0UGFzc1ZhbGlkYXRlRXhlY3V0YWJsZU5vbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RPblR5cGUoIm5vbmUiLCAwLCAyMDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgQFJ1blNlcGFyYXRlbHkKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25UeXBlVmFsaWRhdGVSZXN1bHRQYXNzQmlnZ2VyVmFsaWRhdGVFeGVjdXRhYmxlTm9uZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdE9uVHlwZSgibm9uZSIsIC0xNSwgMjAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNaXhlZFZhbGlkYXRlUGFzc0RlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoIm1peGVkLWRlZmF1bHQiLCAwLCAyMDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1peGVkVmFsaWRhdGVJbnB1dEZhaWxEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJtaXhlZC1kZWZhdWx0IiwgMTUsIDQwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWl4ZWRWYWxpZGF0ZVJlc3VsdEZhaWxEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJtaXhlZC1kZWZhdWx0IiwgLTE1LCA1MDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1peGVkVmFsaWRhdGVQYXNzTm9uZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgibWl4ZWQtbm9uZSIsIDAsIDIwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWl4ZWRWYWxpZGF0ZUlucHV0UGFzc05vbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoIm1peGVkLW5vbmUiLCAxNSwgMjAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNaXhlZFZhbGlkYXRlUmVzdWx0UGFzc05vbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoIm1peGVkLW5vbmUiLCAtMTUsIDIwMCk7CisgICAgfQorCisgICAgdm9pZCBfdGVzdE9uTWV0aG9kKGZpbmFsIFN0cmluZyBwYXRoLCBmaW5hbCBJbnRlZ2VyIHZhbHVlLCBmaW5hbCBpbnQgcmV0dXJuU3RhdHVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoIm9uLW1ldGhvZC8iICsgcGF0aCwgdmFsdWUsIHJldHVyblN0YXR1cyk7CisgICAgfQorCisgICAgdm9pZCBfdGVzdE9uVHlwZShmaW5hbCBTdHJpbmcgcGF0aCwgZmluYWwgSW50ZWdlciB2YWx1ZSwgZmluYWwgaW50IHJldHVyblN0YXR1cykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJvbi10eXBlLSIgKyBwYXRoLCB2YWx1ZSwgcmV0dXJuU3RhdHVzKTsKKyAgICB9CisKKyAgICB2b2lkIF90ZXN0KGZpbmFsIFN0cmluZyBwYXRoLCBmaW5hbCBJbnRlZ2VyIHZhbHVlLCBmaW5hbCBpbnQgcmV0dXJuU3RhdHVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQocGF0aCkKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LnRleHQodmFsdWUpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMocmV0dXJuU3RhdHVzLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgaWYgKHJldHVyblN0YXR1cyA9PSAyMDApIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgcmVzcG9uc2UucmVhZEVudGl0eShJbnRlZ2VyLmNsYXNzKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL3ZhbGlkYXRlb25leGVjdXRpb24vVmFsaWRhdGVPbkV4ZWN1dGlvbkJhc2ljVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi92YWxpZGF0ZW9uZXhlY3V0aW9uL1ZhbGlkYXRlT25FeGVjdXRpb25CYXNpY1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTAwNDYxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi92YWxpZGF0ZW9uZXhlY3V0aW9uL1ZhbGlkYXRlT25FeGVjdXRpb25CYXNpY1Rlc3QuamF2YQpAQCAtMCwwICsxLDQ2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLnZhbGlkYXRpb24udmFsaWRhdGVvbmV4ZWN1dGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZDsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk1heDsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk1pbjsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5leGVjdXRhYmxlLkV4ZWN1dGFibGVUeXBlOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uZXhlY3V0YWJsZS5WYWxpZGF0ZU9uRXhlY3V0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC51dGlsLnJ1bm5lci5SdW5TZXBhcmF0ZWx5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCisvLyBAUnVuV2l0aChDb25jdXJyZW50UnVubmVyLmNsYXNzKQorcHVibGljIGNsYXNzIFZhbGlkYXRlT25FeGVjdXRpb25CYXNpY1Rlc3QgZXh0ZW5kcyBWYWxpZGF0ZU9uRXhlY3V0aW9uQWJzdHJhY3RUZXN0IHsKKworICAgIC8qKgorICAgICAqIE9uIE1FVEhPRC4KKyAgICAgKi8KKworICAgIEBQYXRoKCJvbi1tZXRob2QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVmFsaWRhdGVFeGVjdXRhYmxlT25NZXRob2RzUmVzb3VyY2UgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJ2YWxpZGF0ZUV4ZWN1dGFibGVEZWZhdWx0IikKKyAgICAgICAgQFZhbGlkYXRlT25FeGVjdXRpb24KKyAgICAgICAgQE1pbigwKQorICAgICAgICBwdWJsaWMgSW50ZWdlciB2YWxpZGF0ZUV4ZWN1dGFibGVEZWZhdWx0KEBNYXgoMTApIGZpbmFsIEludGVnZXIgdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJ2YWxpZGF0ZUV4ZWN1dGFibGVNYXRjaCIpCisgICAgICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5OT05fR0VUVEVSX01FVEhPRFMpCisgICAgICAgIEBNaW4oMCkKKyAgICAgICAgcHVibGljIEludGVnZXIgdmFsaWRhdGVFeGVjdXRhYmxlTWF0Y2goQE1heCgxMCkgZmluYWwgSW50ZWdlciB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoInZhbGlkYXRlRXhlY3V0YWJsZU1pc3MiKQorICAgICAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuQ09OU1RSVUNUT1JTKQorICAgICAgICBATWluKDApCisgICAgICAgIHB1YmxpYyBJbnRlZ2VyIHZhbGlkYXRlRXhlY3V0YWJsZU1pc3MoQE1heCgxMCkgZmluYWwgSW50ZWdlciB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoInZhbGlkYXRlRXhlY3V0YWJsZU5vbmUiKQorICAgICAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuTk9ORSkKKyAgICAgICAgQE1pbigwKQorICAgICAgICBwdWJsaWMgSW50ZWdlciB2YWxpZGF0ZUV4ZWN1dGFibGVOb25lKEBNYXgoMTApIGZpbmFsIEludGVnZXIgdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE9uIFRZUEUuCisgICAgICovCisKKyAgICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIFZhbGlkYXRlRXhlY3V0YWJsZU9uVHlwZSB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQE1pbigwKQorICAgICAgICBwdWJsaWMgSW50ZWdlciB2YWxpZGF0ZUV4ZWN1dGFibGUoQE1heCgxMCkgZmluYWwgSW50ZWdlciB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIm9uLXR5cGUtZGVmYXVsdCIpCisgICAgQFZhbGlkYXRlT25FeGVjdXRpb24KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFZhbGlkYXRlRXhlY3V0YWJsZU9uVHlwZURlZmF1bHQgZXh0ZW5kcyBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGUgeworICAgIH0KKworICAgIEBQYXRoKCJvbi10eXBlLW1hdGNoIikKKyAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuTk9OX0dFVFRFUl9NRVRIT0RTKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlTWF0Y2ggZXh0ZW5kcyBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGUgeworICAgIH0KKworICAgIEBQYXRoKCJvbi10eXBlLW1pc3MiKQorICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5DT05TVFJVQ1RPUlMpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGVNaXNzIGV4dGVuZHMgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlIHsKKyAgICB9CisKKyAgICBAUGF0aCgib24tdHlwZS1ub25lIikKKyAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuTk9ORSkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFZhbGlkYXRlRXhlY3V0YWJsZU9uVHlwZU5vbmUgZXh0ZW5kcyBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGUgeworICAgIH0KKworICAgIC8qKgorICAgICAqIE1JWEVELgorICAgICAqLworCisgICAgQFBhdGgoIm1peGVkLWRlZmF1bHQiKQorICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5OT05FKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVmFsaWRhdGVFeGVjdXRhYmxlTWl4ZWREZWZhdWx0IHsKKworICAgICAgICBAUE9TVAorICAgICAgICBATWluKDApCisgICAgICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uCisgICAgICAgIHB1YmxpYyBJbnRlZ2VyIHZhbGlkYXRlRXhlY3V0YWJsZShATWF4KDEwKSBmaW5hbCBJbnRlZ2VyIHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgibWl4ZWQtbm9uZSIpCisgICAgQFZhbGlkYXRlT25FeGVjdXRpb24KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFZhbGlkYXRlRXhlY3V0YWJsZU1peGVkTm9uZSB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQE1pbigwKQorICAgICAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuTk9ORSkKKyAgICAgICAgcHVibGljIEludGVnZXIgdmFsaWRhdGVFeGVjdXRhYmxlKEBNYXgoMTApIGZpbmFsIEludGVnZXIgdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEdFVFRFUlMuCisgICAgICovCisKKyAgICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIFZhbGlkYXRlR2V0dGVyRXhlY3V0YWJsZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgic2FuaXR5IikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRTYW5pdHkoKSB7CisgICAgICAgICAgICByZXR1cm4gIm9rIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJnZXR0ZXItb24tbWV0aG9kLWRlZmF1bHQiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVmFsaWRhdGVHZXR0ZXJFeGVjdXRhYmxlT25NZXRob2REZWZhdWx0IGV4dGVuZHMgVmFsaWRhdGVHZXR0ZXJFeGVjdXRhYmxlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uCisgICAgICAgIEBOb3ROdWxsCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoImdldHRlci1vbi1tZXRob2QtbWlzcyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBWYWxpZGF0ZUdldHRlckV4ZWN1dGFibGVPbk1ldGhvZE1pc3MgZXh0ZW5kcyBWYWxpZGF0ZUdldHRlckV4ZWN1dGFibGUgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLk5PTl9HRVRURVJfTUVUSE9EUykKKyAgICAgICAgQE5vdE51bGwKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRNaXNzKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiZ2V0dGVyLW9uLW1ldGhvZC1tYXRjaCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBWYWxpZGF0ZUdldHRlckV4ZWN1dGFibGVPbk1ldGhvZE1hdGNoIGV4dGVuZHMgVmFsaWRhdGVHZXR0ZXJFeGVjdXRhYmxlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSB7RXhlY3V0YWJsZVR5cGUuTk9OX0dFVFRFUl9NRVRIT0RTLCBFeGVjdXRhYmxlVHlwZS5HRVRURVJfTUVUSE9EU30pCisgICAgICAgIEBOb3ROdWxsCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWF0Y2goKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJnZXR0ZXItb24tdHlwZS1kZWZhdWx0IikKKyAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVmFsaWRhdGVHZXR0ZXJFeGVjdXRhYmxlT25UeXBlRGVmYXVsdCBleHRlbmRzIFZhbGlkYXRlR2V0dGVyRXhlY3V0YWJsZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBATm90TnVsbAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHQoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJnZXR0ZXItb24tdHlwZS1taXNzIikKKyAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuTk9OX0dFVFRFUl9NRVRIT0RTKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVmFsaWRhdGVHZXR0ZXJFeGVjdXRhYmxlT25UeXBlTWlzcyBleHRlbmRzIFZhbGlkYXRlR2V0dGVyRXhlY3V0YWJsZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBATm90TnVsbAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1pc3MoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJnZXR0ZXItb24tdHlwZS1tYXRjaCIpCisgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IHtFeGVjdXRhYmxlVHlwZS5OT05fR0VUVEVSX01FVEhPRFMsIEV4ZWN1dGFibGVUeXBlLkdFVFRFUl9NRVRIT0RTfSkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFZhbGlkYXRlR2V0dGVyRXhlY3V0YWJsZU9uVHlwZU1hdGNoIGV4dGVuZHMgVmFsaWRhdGVHZXR0ZXJFeGVjdXRhYmxlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBOb3ROdWxsCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWF0Y2goKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEJFQU5TLgorICAgICAqLworCisgICAgQFBhdGgoImdldHRlci1vbi1iZWFucyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBWYWxpZGF0ZUdldHRlckV4ZWN1dGFibGVPbkJlYW5zIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBAVmFsaWQKKyAgICAgICAgcHVibGljIEFub3RoZXJDb250YWN0QmVhbiBwb3N0KEBWYWxpZCBmaW5hbCBBbm90aGVyQ29udGFjdEJlYW4gYmVhbikgeworICAgICAgICAgICAgcmV0dXJuIGJlYW47CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgiaW52YWxpZE1haWwiKQorICAgICAgICBAVmFsaWQKKyAgICAgICAgcHVibGljIEFub3RoZXJDb250YWN0QmVhbiBpbnZhbGlkTWFpbChAVmFsaWQgZmluYWwgQW5vdGhlckNvbnRhY3RCZWFuIGJlYW4pIHsKKyAgICAgICAgICAgIGJlYW4uc2V0RW1haWwoImFiIik7CisgICAgICAgICAgICByZXR1cm4gYmVhbjsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJpbnZhbGlkUGhvbmUiKQorICAgICAgICBAVmFsaWQKKyAgICAgICAgcHVibGljIEFub3RoZXJDb250YWN0QmVhbiBpbnZhbGlkUGhvbmUoQFZhbGlkIGZpbmFsIEFub3RoZXJDb250YWN0QmVhbiBiZWFuKSB7CisgICAgICAgICAgICBiZWFuLnNldFBob25lKCIxMiIpOworICAgICAgICAgICAgcmV0dXJuIGJlYW47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiZ2V0dGVyLXJlc291cmNlLW1ldGhvZCIpCisgICAgQFNpbmdsZXRvbgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVmFsaWRhdGVHZXR0ZXJSZXNvdXJjZU1ldGhvZCB7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgY291bnQgPSAxOworCisgICAgICAgIEBHRVQKKyAgICAgICAgQE1heCgxKQorICAgICAgICBwdWJsaWMgaW50IGdldFZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIGNvdW50Kys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgib24tdHlwZS1nZXR0ZXItbnVsbCIpCisgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLk5PTl9HRVRURVJfTUVUSE9EUykKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFZhbGlkYXRlRXhlY3V0YWJsZVJlc291cmNlIHsKKworICAgICAgICBAUGF0aCgibm9nZXR0ZXIiKQorICAgICAgICBAR0VUCisgICAgICAgIEBOb3ROdWxsCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZGFOdWxsKCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiZ2V0dGVyIikKKyAgICAgICAgQEdFVAorICAgICAgICBATm90TnVsbAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE51bGwoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5EVU1QX0VOVElUWSk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhWYWxpZGF0ZUV4ZWN1dGFibGVPbk1ldGhvZHNSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGVEZWZhdWx0LmNsYXNzLAorICAgICAgICAgICAgICAgIFZhbGlkYXRlRXhlY3V0YWJsZU9uVHlwZU1hdGNoLmNsYXNzLAorICAgICAgICAgICAgICAgIFZhbGlkYXRlRXhlY3V0YWJsZU9uVHlwZU1pc3MuY2xhc3MsCisgICAgICAgICAgICAgICAgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlTm9uZS5jbGFzcywKKyAgICAgICAgICAgICAgICBWYWxpZGF0ZUV4ZWN1dGFibGVNaXhlZERlZmF1bHQuY2xhc3MsCisgICAgICAgICAgICAgICAgVmFsaWRhdGVFeGVjdXRhYmxlTWl4ZWROb25lLmNsYXNzLAorICAgICAgICAgICAgICAgIFZhbGlkYXRlR2V0dGVyRXhlY3V0YWJsZU9uTWV0aG9kRGVmYXVsdC5jbGFzcywKKyAgICAgICAgICAgICAgICBWYWxpZGF0ZUdldHRlckV4ZWN1dGFibGVPbk1ldGhvZE1pc3MuY2xhc3MsCisgICAgICAgICAgICAgICAgVmFsaWRhdGVHZXR0ZXJFeGVjdXRhYmxlT25NZXRob2RNYXRjaC5jbGFzcywKKyAgICAgICAgICAgICAgICBWYWxpZGF0ZUdldHRlckV4ZWN1dGFibGVPblR5cGVEZWZhdWx0LmNsYXNzLAorICAgICAgICAgICAgICAgIFZhbGlkYXRlR2V0dGVyRXhlY3V0YWJsZU9uVHlwZU1pc3MuY2xhc3MsCisgICAgICAgICAgICAgICAgVmFsaWRhdGVHZXR0ZXJFeGVjdXRhYmxlT25UeXBlTWF0Y2guY2xhc3MsCisgICAgICAgICAgICAgICAgVmFsaWRhdGVHZXR0ZXJFeGVjdXRhYmxlT25CZWFucy5jbGFzcywKKyAgICAgICAgICAgICAgICBWYWxpZGF0ZUdldHRlclJlc291cmNlTWV0aG9kLmNsYXNzLAorICAgICAgICAgICAgICAgIFZhbGlkYXRlRXhlY3V0YWJsZVJlc291cmNlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLkJWX0RJU0FCTEVfVkFMSURBVEVfT05fRVhFQ1VUQUJMRV9PVkVSUklERV9DSEVDSywgdHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25UeXBlVmFsaWRhdGVJbnB1dEZhaWxWYWxpZGF0ZUV4ZWN1dGFibGVEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0T25UeXBlKCJkZWZhdWx0IiwgMTUsIDQwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAUnVuU2VwYXJhdGVseQorICAgIHB1YmxpYyB2b2lkIHRlc3RPblR5cGVWYWxpZGF0ZVJlc3VsdEZhaWxWYWxpZGF0ZUV4ZWN1dGFibGVEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0T25UeXBlKCJkZWZhdWx0IiwgLTE1LCA1MDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uVHlwZVZhbGlkYXRlSW5wdXRQYXNzQmlnZ2VyVmFsaWRhdGVFeGVjdXRhYmxlTWlzcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdE9uVHlwZSgibWlzcyIsIDE1LCAyMDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uVHlwZVZhbGlkYXRlSW5wdXRQYXNzQmlnZ2VyVmFsaWRhdGVFeGVjdXRhYmxlTm9uZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdE9uVHlwZSgibm9uZSIsIDE1LCAyMDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9uTWV0aG9kR2V0dGVyRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJnZXR0ZXItb24tbWV0aG9kLWRlZmF1bHQiKTsKKworICAgICAgICBhc3NlcnRUaGF0KHRhcmdldC5yZXF1ZXN0KCkuZ2V0KCkuZ2V0U3RhdHVzKCksIGVxdWFsVG8oNDAwKSk7CisgICAgICAgIGFzc2VydFRoYXQodGFyZ2V0LnBhdGgoInNhbml0eSIpLnJlcXVlc3QoKS5nZXQoKS5nZXRTdGF0dXMoKSwgZXF1YWxUbyg0MDApKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPbk1ldGhvZEdldHRlck1pc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiZ2V0dGVyLW9uLW1ldGhvZC1taXNzIik7CisKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDQwMCkpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0LnBhdGgoInNhbml0eSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgZXF1YWxUbyg0MDApKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPbk1ldGhvZEdldHRlck1hdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoImdldHRlci1vbi1tZXRob2QtbWF0Y2giKTsKKworICAgICAgICBhc3NlcnRUaGF0KHRhcmdldC5yZXF1ZXN0KCkuZ2V0KCkuZ2V0U3RhdHVzKCksIGVxdWFsVG8oNDAwKSk7CisgICAgICAgIGFzc2VydFRoYXQodGFyZ2V0LnBhdGgoInNhbml0eSIpLnJlcXVlc3QoKS5nZXQoKS5nZXRTdGF0dXMoKSwgZXF1YWxUbyg0MDApKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPblR5cGVHZXR0ZXJEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoImdldHRlci1vbi10eXBlLWRlZmF1bHQiKTsKKworICAgICAgICBhc3NlcnRUaGF0KHRhcmdldC5yZXF1ZXN0KCkuZ2V0KCkuZ2V0U3RhdHVzKCksIGVxdWFsVG8oNDAwKSk7CisgICAgICAgIGFzc2VydFRoYXQodGFyZ2V0LnBhdGgoInNhbml0eSIpLnJlcXVlc3QoKS5nZXQoKS5nZXRTdGF0dXMoKSwgZXF1YWxUbyg0MDApKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPblR5cGVHZXR0ZXJNaXNzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoImdldHRlci1vbi10eXBlLW1pc3MiKTsKKworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oNDAwKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQucGF0aCgic2FuaXR5IikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDQwMCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZhbGlkYXRpb24gc2hvdWxkIGZhaWwgd2hlbiBnZXR0ZXIgKGFsc28gYSByZXNvdXJjZSBtZXRob2QpIGlzIGludm9rZWQgYW5kIG5vdCB3aGVuIHRoZSByZXNvdXJjZSBjbGFzcyBpcyB2YWxpZGF0ZWQuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0dGVyUmVzb3VyY2VNZXRob2QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiZ2V0dGVyLXJlc291cmNlLW1ldGhvZCIpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgZXF1YWxUbyg1MDApKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPblR5cGVHZXR0ZXJOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoIm9uLXR5cGUtZ2V0dGVyLW51bGwiKTsKKworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5wYXRoKCJub2dldHRlciIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgZXF1YWxUbyg0MDApKTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldC5wYXRoKCJnZXR0ZXIiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oNDAwKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25UeXBlR2V0dGVyTWF0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiZ2V0dGVyLW9uLXR5cGUtbWF0Y2giKTsKKworICAgICAgICBhc3NlcnRUaGF0KHRhcmdldC5yZXF1ZXN0KCkuZ2V0KCkuZ2V0U3RhdHVzKCksIGVxdWFsVG8oNDAwKSk7CisgICAgICAgIGFzc2VydFRoYXQodGFyZ2V0LnBhdGgoInNhbml0eSIpLnJlcXVlc3QoKS5nZXQoKS5nZXRTdGF0dXMoKSwgZXF1YWxUbyg0MDApKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCZWFuc1Bvc2l0aXZlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoImdldHRlci1vbi1iZWFucyIpOworICAgICAgICBmaW5hbCBBbm90aGVyQ29udGFjdEJlYW4gY29udGFjdEJlYW4gPSBuZXcgQW5vdGhlckNvbnRhY3RCZWFuKCJqZXJzZXlAZXhhbXBsZS5jb20iLCBudWxsLCAiSmVyc2V5IEpBWC1SUyIsIG51bGwpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5wb3N0KEVudGl0eS54bWwoY29udGFjdEJlYW4pKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoQW5vdGhlckNvbnRhY3RCZWFuLmNsYXNzKSwgZXF1YWxUbyhjb250YWN0QmVhbikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJlYW5zVmFsaWRhdGVHZXR0ZXJJbnZhbGlkRW1haWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiZ2V0dGVyLW9uLWJlYW5zIik7CisgICAgICAgIGZpbmFsIEFub3RoZXJDb250YWN0QmVhbiBjb250YWN0QmVhbiA9IG5ldyBBbm90aGVyQ29udGFjdEJlYW4oImplcnNleSIsIG51bGwsICJKZXJzZXkgSkFYLVJTIiwgbnVsbCk7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLnBvc3QoRW50aXR5LnhtbChjb250YWN0QmVhbikpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oNDAwKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmVhbnNWYWxpZGF0ZUdldHRlckludmFsaWRQaG9uZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJnZXR0ZXItb24tYmVhbnMiKTsKKyAgICAgICAgZmluYWwgQW5vdGhlckNvbnRhY3RCZWFuIGNvbnRhY3RCZWFuID0gbmV3IEFub3RoZXJDb250YWN0QmVhbigiamVyc2V5QGV4YW1wbGUuY29tIiwgIjEyIiwgIkplcnNleSBKQVgtUlMiLCBudWxsKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkueG1sKGNvbnRhY3RCZWFuKSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgZXF1YWxUbygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KEFub3RoZXJDb250YWN0QmVhbi5jbGFzcyksIGVxdWFsVG8oY29udGFjdEJlYW4pKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCZWFuc1ZhbGlkYXRlR2V0dGVySW52YWxpZFJldHVybk1haWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiZ2V0dGVyLW9uLWJlYW5zIikucGF0aCgiaW52YWxpZE1haWwiKTsKKyAgICAgICAgZmluYWwgQW5vdGhlckNvbnRhY3RCZWFuIGNvbnRhY3RCZWFuID0gbmV3IEFub3RoZXJDb250YWN0QmVhbigiamVyc2V5QGV4YW1wbGUuY29tIiwgbnVsbCwgIkplcnNleSBKQVgtUlMiLCBudWxsKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkueG1sKGNvbnRhY3RCZWFuKSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgZXF1YWxUbyg1MDApKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCZWFuc1ZhbGlkYXRlR2V0dGVySW52YWxpZFJldHVyblBob25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoImdldHRlci1vbi1iZWFucyIpLnBhdGgoImludmFsaWRQaG9uZSIpOworICAgICAgICBmaW5hbCBBbm90aGVyQ29udGFjdEJlYW4gY29udGFjdEJlYW4gPSBuZXcgQW5vdGhlckNvbnRhY3RCZWFuKCJqZXJzZXlAZXhhbXBsZS5jb20iLCBudWxsLCAiSmVyc2V5IEpBWC1SUyIsIG51bGwpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5wb3N0KEVudGl0eS54bWwoY29udGFjdEJlYW4pKTsKKyAgICAgICAgY29udGFjdEJlYW4uc2V0UGhvbmUoIjEyIik7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgZXF1YWxUbygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KEFub3RoZXJDb250YWN0QmVhbi5jbGFzcyksIGVxdWFsVG8oY29udGFjdEJlYW4pKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL3ZhbGlkYXRlb25leGVjdXRpb24vVmFsaWRhdGVPbkV4ZWN1dGlvbkluaGVyaXRhbmNlR2VuZXJpY3NUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL3ZhbGlkYXRlb25leGVjdXRpb24vVmFsaWRhdGVPbkV4ZWN1dGlvbkluaGVyaXRhbmNlR2VuZXJpY3NUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYyYmZkNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vdmFsaWRhdGVvbmV4ZWN1dGlvbi9WYWxpZGF0ZU9uRXhlY3V0aW9uSW5oZXJpdGFuY2VHZW5lcmljc1Rlc3QuamF2YQpAQCAtMCwwICsxLDQyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLnZhbGlkYXRpb24udmFsaWRhdGVvbmV4ZWN1dGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5NYXg7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5NaW47CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5leGVjdXRhYmxlLkV4ZWN1dGFibGVUeXBlOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uZXhlY3V0YWJsZS5WYWxpZGF0ZU9uRXhlY3V0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QudXRpbC5ydW5uZXIuQ29uY3VycmVudFJ1bm5lcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworLy8gQFJ1bldpdGgoQ29uY3VycmVudFJ1bm5lci5jbGFzcykKK3B1YmxpYyBjbGFzcyBWYWxpZGF0ZU9uRXhlY3V0aW9uSW5oZXJpdGFuY2VHZW5lcmljc1Rlc3QgZXh0ZW5kcyBWYWxpZGF0ZU9uRXhlY3V0aW9uQWJzdHJhY3RUZXN0IHsKKworICAgIC8qKgorICAgICAqIE9uIE1FVEhPRC4KKyAgICAgKi8KKworICAgIC8qKgorICAgICAqIHtAbGluayBWYWxpZGF0ZU9uRXhlY3V0aW9ufSBhbm5vdGF0aW9ucyBmcm9tIHRoaXMgaW50ZXJmYWNlIHNob3VsZCBiZSBjb25zaWRlcmVkIGR1cmluZyB2YWxpZGF0aW5nIHBoYXNlLgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24iLCAiSmF2YURvYyJ9KQorICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFZhbGlkYXRlRXhlY3V0YWJsZU9uTWV0aG9kc1ZhbGlkYXRpb248VCBleHRlbmRzIE51bWJlcj4geworCisgICAgICAgIEBNaW4oMCkKKyAgICAgICAgQFZhbGlkYXRlT25FeGVjdXRpb24KKyAgICAgICAgcHVibGljIFQgdmFsaWRhdGVFeGVjdXRhYmxlRGVmYXVsdChATWF4KDEwKSBmaW5hbCBUIHZhbHVlKTsKKworICAgICAgICBATWluKDApCisgICAgICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5OT05fR0VUVEVSX01FVEhPRFMpCisgICAgICAgIHB1YmxpYyBUIHZhbGlkYXRlRXhlY3V0YWJsZU1hdGNoKEBNYXgoMTApIGZpbmFsIFQgdmFsdWUpOworCisgICAgICAgIEBNaW4oMCkKKyAgICAgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLkNPTlNUUlVDVE9SUykKKyAgICAgICAgcHVibGljIFQgdmFsaWRhdGVFeGVjdXRhYmxlTWlzcyhATWF4KDEwKSBmaW5hbCBUIHZhbHVlKTsKKworICAgICAgICBATWluKDApCisgICAgICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5OT05FKQorICAgICAgICBwdWJsaWMgVCB2YWxpZGF0ZUV4ZWN1dGFibGVOb25lKEBNYXgoMTApIGZpbmFsIFQgdmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFdyb25nIGdlbmVyaWMgdHlwZXMuIHtAbGluayBWYWxpZGF0ZU9uRXhlY3V0aW9ufSBhbm5vdGF0aW9ucyBzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQgYXQgYWxsLgorICAgICAqCisgICAgICogQHBhcmFtIDxUPgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24iLCAiSmF2YURvYyJ9KQorICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFZhbGlkYXRlRXhlY3V0YWJsZU9uTWV0aG9kc0NoYXJTZXF1ZW5jZVZhbGlkYXRpb248VCBleHRlbmRzIENoYXJTZXF1ZW5jZT4geworCisgICAgICAgIEBNaW4oMTApCisgICAgICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5DT05TVFJVQ1RPUlMpCisgICAgICAgIHB1YmxpYyBUIHZhbGlkYXRlRXhlY3V0YWJsZURlZmF1bHQoQE1heCgwKSBmaW5hbCBUIHZhbHVlKTsKKworICAgICAgICBATWluKDEwKQorICAgICAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuTk9ORSkKKyAgICAgICAgcHVibGljIFQgdmFsaWRhdGVFeGVjdXRhYmxlTWF0Y2goQE1heCgwKSBmaW5hbCBUIHZhbHVlKTsKKworICAgICAgICBATWluKDEwKQorICAgICAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbgorICAgICAgICBwdWJsaWMgVCB2YWxpZGF0ZUV4ZWN1dGFibGVNaXNzKEBNYXgoMCkgZmluYWwgVCB2YWx1ZSk7CisKKyAgICAgICAgQE1pbigxMCkKKyAgICAgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLk5PTl9HRVRURVJfTUVUSE9EUykKKyAgICAgICAgcHVibGljIFQgdmFsaWRhdGVFeGVjdXRhYmxlTm9uZShATWF4KDApIGZpbmFsIFQgdmFsdWUpOworICAgIH0KKworICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5BTEwpCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgVmFsaWRhdGVFeGVjdXRhYmxlT25NZXRob2RzSmF4UnMgZXh0ZW5kcyBWYWxpZGF0ZUV4ZWN1dGFibGVPbk1ldGhvZHNWYWxpZGF0aW9uPEludGVnZXI+IHsKKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgidmFsaWRhdGVFeGVjdXRhYmxlRGVmYXVsdCIpCisgICAgICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5DT05TVFJVQ1RPUlMpCisgICAgICAgIEludGVnZXIgdmFsaWRhdGVFeGVjdXRhYmxlRGVmYXVsdChmaW5hbCBJbnRlZ2VyIHZhbHVlKTsKKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgidmFsaWRhdGVFeGVjdXRhYmxlTWF0Y2giKQorICAgICAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuR0VUVEVSX01FVEhPRFMpCisgICAgICAgIEludGVnZXIgdmFsaWRhdGVFeGVjdXRhYmxlTWF0Y2goZmluYWwgSW50ZWdlciB2YWx1ZSk7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoInZhbGlkYXRlRXhlY3V0YWJsZU1pc3MiKQorICAgICAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuTk9OX0dFVFRFUl9NRVRIT0RTKQorICAgICAgICBJbnRlZ2VyIHZhbGlkYXRlRXhlY3V0YWJsZU1pc3MoZmluYWwgSW50ZWdlciB2YWx1ZSk7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoInZhbGlkYXRlRXhlY3V0YWJsZU5vbmUiKQorICAgICAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuQUxMKQorICAgICAgICBJbnRlZ2VyIHZhbGlkYXRlRXhlY3V0YWJsZU5vbmUoZmluYWwgSW50ZWdlciB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBWYWxpZGF0ZUV4ZWN1dGFibGVPbk1ldGhvZHNBYnN0cmFjdFJlc291cmNlCisgICAgICAgICAgICBpbXBsZW1lbnRzIFZhbGlkYXRlRXhlY3V0YWJsZU9uTWV0aG9kc0pheFJzLCBWYWxpZGF0ZUV4ZWN1dGFibGVPbk1ldGhvZHNDaGFyU2VxdWVuY2VWYWxpZGF0aW9uPFN0cmluZz4geworCisgICAgICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5OT05FKQorICAgICAgICBwdWJsaWMgYWJzdHJhY3QgSW50ZWdlciB2YWxpZGF0ZUV4ZWN1dGFibGVEZWZhdWx0KGZpbmFsIEludGVnZXIgdmFsdWUpOworCisgICAgICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5DT05TVFJVQ1RPUlMpCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBJbnRlZ2VyIHZhbGlkYXRlRXhlY3V0YWJsZU1hdGNoKGZpbmFsIEludGVnZXIgdmFsdWUpOworCisgICAgICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5BTEwpCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBJbnRlZ2VyIHZhbGlkYXRlRXhlY3V0YWJsZU1pc3MoZmluYWwgSW50ZWdlciB2YWx1ZSk7CisKKyAgICAgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLk5PTl9HRVRURVJfTUVUSE9EUykKKyAgICAgICAgcHVibGljIGFic3RyYWN0IEludGVnZXIgdmFsaWRhdGVFeGVjdXRhYmxlTm9uZShmaW5hbCBJbnRlZ2VyIHZhbHVlKTsKKyAgICB9CisKKyAgICBAUGF0aCgib24tbWV0aG9kIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFZhbGlkYXRlRXhlY3V0YWJsZU9uTWV0aG9kc1Jlc291cmNlIGV4dGVuZHMgVmFsaWRhdGVFeGVjdXRhYmxlT25NZXRob2RzQWJzdHJhY3RSZXNvdXJjZSB7CisKKyAgICAgICAgcHVibGljIEludGVnZXIgdmFsaWRhdGVFeGVjdXRhYmxlRGVmYXVsdChmaW5hbCBJbnRlZ2VyIHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSW50ZWdlciB2YWxpZGF0ZUV4ZWN1dGFibGVNYXRjaChmaW5hbCBJbnRlZ2VyIHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSW50ZWdlciB2YWxpZGF0ZUV4ZWN1dGFibGVNaXNzKGZpbmFsIEludGVnZXIgdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJbnRlZ2VyIHZhbGlkYXRlRXhlY3V0YWJsZU5vbmUoZmluYWwgSW50ZWdlciB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyB2YWxpZGF0ZUV4ZWN1dGFibGVEZWZhdWx0KGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyB2YWxpZGF0ZUV4ZWN1dGFibGVNYXRjaChmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdmFsaWRhdGVFeGVjdXRhYmxlTWlzcyhmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdmFsaWRhdGVFeGVjdXRhYmxlTm9uZShmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIE9uIFRZUEUuCisgICAgICovCisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiSmF2YURvYyIpCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlPFQgZXh0ZW5kcyBOdW1iZXI+IHsKKworICAgICAgICBATWluKDApCisgICAgICAgIHB1YmxpYyBUIHZhbGlkYXRlRXhlY3V0YWJsZShATWF4KDEwKSBmaW5hbCBUIHZhbHVlKTsKKyAgICB9CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygiSmF2YURvYyIpCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgVmFsaWRhdGVFeGVjdXRhYmxlQ2hhclNlcXVlbmNlT25UeXBlPFggZXh0ZW5kcyBDaGFyU2VxdWVuY2U+IHsKKworICAgICAgICBATWluKDEwKQorICAgICAgICBwdWJsaWMgWCB2YWxpZGF0ZUV4ZWN1dGFibGUoQE1heCgwKSBmaW5hbCBYIHZhbHVlKTsKKyAgICB9CisKKyAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbgorICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFZhbGlkYXRlRXhlY3V0YWJsZU9uVHlwZURlZmF1bHQgZXh0ZW5kcyBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGU8SW50ZWdlcj4geworICAgIH0KKworICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgVmFsaWRhdGVFeGVjdXRhYmxlQ2hhclNlcXVlbmNlT25UeXBlRGVmYXVsdCBleHRlbmRzIFZhbGlkYXRlRXhlY3V0YWJsZUNoYXJTZXF1ZW5jZU9uVHlwZTxTdHJpbmc+IHsKKworICAgICAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbgorICAgICAgICBwdWJsaWMgU3RyaW5nIHZhbGlkYXRlRXhlY3V0YWJsZShmaW5hbCBTdHJpbmcgdmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMge0BsaW5rIFZhbGlkYXRlT25FeGVjdXRpb259IGFubm90YXRpb24gc2hvdWxkIGJlIGNvbnNpZGVyZWQgZHVyaW5nIHZhbGlkYXRpbmcgcGhhc2UuCisgICAgICovCisgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLkdFVFRFUl9NRVRIT0RTKQorICAgIHB1YmxpYyBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlRGVmYXVsdEFic3RyYWN0UmVzb3VyY2UgaW1wbGVtZW50cyBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGVEZWZhdWx0IHsKKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgSW50ZWdlciB2YWxpZGF0ZUV4ZWN1dGFibGUoZmluYWwgSW50ZWdlciB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIm9uLXR5cGUtZGVmYXVsdCIpCisgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLkNPTlNUUlVDVE9SUykKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFZhbGlkYXRlRXhlY3V0YWJsZU9uVHlwZURlZmF1bHRSZXNvdXJjZSBleHRlbmRzIFZhbGlkYXRlRXhlY3V0YWJsZU9uVHlwZURlZmF1bHRBYnN0cmFjdFJlc291cmNlCisgICAgICAgICAgICBpbXBsZW1lbnRzIFZhbGlkYXRlRXhlY3V0YWJsZUNoYXJTZXF1ZW5jZU9uVHlwZURlZmF1bHQgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJhbm90aGVyIikKKyAgICAgICAgcHVibGljIFN0cmluZyB2YWxpZGF0ZUV4ZWN1dGFibGUoZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHtAbGluayBWYWxpZGF0ZU9uRXhlY3V0aW9ufSBhbm5vdGF0aW9uIHNob3VsZCBiZSBjb25zaWRlcmVkIGR1cmluZyB2YWxpZGF0aW5nIHBoYXNlLgorICAgICAqLworICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5OT05fR0VUVEVSX01FVEhPRFMpCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlTWF0Y2ggZXh0ZW5kcyBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGU8SW50ZWdlcj4geworICAgIH0KKworICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgVmFsaWRhdGVFeGVjdXRhYmxlQ2hhclNlcXVlbmNlT25UeXBlTWF0Y2ggZXh0ZW5kcyBWYWxpZGF0ZUV4ZWN1dGFibGVDaGFyU2VxdWVuY2VPblR5cGU8U3RyaW5nPiB7CisKKyAgICAgICAgQFZhbGlkYXRlT25FeGVjdXRpb24KKyAgICAgICAgcHVibGljIFN0cmluZyB2YWxpZGF0ZUV4ZWN1dGFibGUoZmluYWwgU3RyaW5nIHZhbHVlKTsKKyAgICB9CisKKyAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuR0VUVEVSX01FVEhPRFMpCisgICAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGVNYXRjaEFic3RyYWN0UmVzb3VyY2UgaW1wbGVtZW50cyBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGVNYXRjaCB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIEludGVnZXIgdmFsaWRhdGVFeGVjdXRhYmxlKGZpbmFsIEludGVnZXIgdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJvbi10eXBlLW1hdGNoIikKKyAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuTk9ORSkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFZhbGlkYXRlRXhlY3V0YWJsZU9uVHlwZU1hdGNoUmVzb3VyY2UgZXh0ZW5kcyBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGVNYXRjaEFic3RyYWN0UmVzb3VyY2UKKyAgICAgICAgICAgIGltcGxlbWVudHMgVmFsaWRhdGVFeGVjdXRhYmxlQ2hhclNlcXVlbmNlT25UeXBlTWF0Y2ggeworCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJhbm90aGVyIikKKyAgICAgICAgcHVibGljIFN0cmluZyB2YWxpZGF0ZUV4ZWN1dGFibGUoZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHtAbGluayBWYWxpZGF0ZU9uRXhlY3V0aW9ufSBhbm5vdGF0aW9uIHNob3VsZCBiZSBjb25zaWRlcmVkIGR1cmluZyB2YWxpZGF0aW5nIHBoYXNlLgorICAgICAqLworICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5DT05TVFJVQ1RPUlMpCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlTWlzcyBleHRlbmRzIFZhbGlkYXRlRXhlY3V0YWJsZU9uVHlwZTxJbnRlZ2VyPiB7CisgICAgfQorCisgICAgQFZhbGlkYXRlT25FeGVjdXRpb24KKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBWYWxpZGF0ZUV4ZWN1dGFibGVDaGFyU2VxdWVuY2VPblR5cGVNaXNzIGV4dGVuZHMgVmFsaWRhdGVFeGVjdXRhYmxlQ2hhclNlcXVlbmNlT25UeXBlPFN0cmluZz4geworCisgICAgICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdmFsaWRhdGVFeGVjdXRhYmxlKGZpbmFsIFN0cmluZyB2YWx1ZSk7CisgICAgfQorCisgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLk5PTl9HRVRURVJfTUVUSE9EUykKKyAgICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIFZhbGlkYXRlRXhlY3V0YWJsZU9uVHlwZU1pc3NBYnN0cmFjdFJlc291cmNlIGltcGxlbWVudHMgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlTWlzcyB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIEludGVnZXIgdmFsaWRhdGVFeGVjdXRhYmxlKGZpbmFsIEludGVnZXIgdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJvbi10eXBlLW1pc3MiKQorICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGVNaXNzUmVzb3VyY2UgZXh0ZW5kcyBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGVNaXNzQWJzdHJhY3RSZXNvdXJjZQorICAgICAgICAgICAgaW1wbGVtZW50cyBWYWxpZGF0ZUV4ZWN1dGFibGVDaGFyU2VxdWVuY2VPblR5cGVNaXNzIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgiYW5vdGhlciIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdmFsaWRhdGVFeGVjdXRhYmxlKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyB7QGxpbmsgVmFsaWRhdGVPbkV4ZWN1dGlvbn0gYW5ub3RhdGlvbiBzaG91bGQgYmUgY29uc2lkZXJlZCBkdXJpbmcgdmFsaWRhdGluZyBwaGFzZS4KKyAgICAgKi8KKyAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuTk9ORSkKKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGVOb25lIGV4dGVuZHMgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlPEludGVnZXI+IHsKKyAgICB9CisKKyAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbgorICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFZhbGlkYXRlRXhlY3V0YWJsZUNoYXJTZXF1ZW5jZU9uVHlwZU5vbmUgZXh0ZW5kcyBWYWxpZGF0ZUV4ZWN1dGFibGVDaGFyU2VxdWVuY2VPblR5cGU8U3RyaW5nPiB7CisKKyAgICAgICAgQFZhbGlkYXRlT25FeGVjdXRpb24KKyAgICAgICAgcHVibGljIFN0cmluZyB2YWxpZGF0ZUV4ZWN1dGFibGUoZmluYWwgU3RyaW5nIHZhbHVlKTsKKyAgICB9CisKKyAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuQUxMKQorICAgIHB1YmxpYyBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlTm9uZUFic3RyYWN0UmVzb3VyY2UgaW1wbGVtZW50cyBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGVOb25lIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgSW50ZWdlciB2YWxpZGF0ZUV4ZWN1dGFibGUoZmluYWwgSW50ZWdlciB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIm9uLXR5cGUtbm9uZSIpCisgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IHtFeGVjdXRhYmxlVHlwZS5DT05TVFJVQ1RPUlMsIEV4ZWN1dGFibGVUeXBlLk5PTl9HRVRURVJfTUVUSE9EU30pCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGVOb25lUmVzb3VyY2UgZXh0ZW5kcyBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGVOb25lQWJzdHJhY3RSZXNvdXJjZQorICAgICAgICAgICAgaW1wbGVtZW50cyBWYWxpZGF0ZUV4ZWN1dGFibGVDaGFyU2VxdWVuY2VPblR5cGVOb25lIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgiYW5vdGhlciIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdmFsaWRhdGVFeGVjdXRhYmxlKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogTUlYRUQuCisgICAgICovCisKKyAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuTk9ORSkKKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBWYWxpZGF0ZUV4ZWN1dGFibGVNaXhlZERlZmF1bHQ8VCBleHRlbmRzIE51bWJlcj4geworCisgICAgICAgIEBNaW4oMCkKKyAgICAgICAgQFZhbGlkYXRlT25FeGVjdXRpb24KKyAgICAgICAgcHVibGljIFQgdmFsaWRhdGVFeGVjdXRhYmxlKEBNYXgoMTApIGZpbmFsIFQgdmFsdWUpOworICAgIH0KKworICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5OT05FKQorICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFZhbGlkYXRlRXhlY3V0YWJsZUNoYXJTZXF1ZW5jZU1peGVkRGVmYXVsdDxUIGV4dGVuZHMgQ2hhclNlcXVlbmNlPiB7CisKKyAgICAgICAgQE1pbigxMCkKKyAgICAgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLk5PTkUpCisgICAgICAgIHB1YmxpYyBUIHZhbGlkYXRlRXhlY3V0YWJsZShATWF4KDApIGZpbmFsIFQgdmFsdWUpOworICAgIH0KKworICAgIEBQYXRoKCJtaXhlZC1kZWZhdWx0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFZhbGlkYXRlRXhlY3V0YWJsZU1peGVkRGVmYXVsdFJlc291cmNlCisgICAgICAgICAgICBpbXBsZW1lbnRzIFZhbGlkYXRlRXhlY3V0YWJsZU1peGVkRGVmYXVsdDxJbnRlZ2VyPiwgVmFsaWRhdGVFeGVjdXRhYmxlQ2hhclNlcXVlbmNlTWl4ZWREZWZhdWx0PFN0cmluZz4geworCisgICAgICAgIEBQT1NUCisgICAgICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5DT05TVFJVQ1RPUlMpCisgICAgICAgIHB1YmxpYyBJbnRlZ2VyIHZhbGlkYXRlRXhlY3V0YWJsZShmaW5hbCBJbnRlZ2VyIHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgiYW5vdGhlciIpCisgICAgICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5DT05TVFJVQ1RPUlMpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdmFsaWRhdGVFeGVjdXRhYmxlKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgQFZhbGlkYXRlT25FeGVjdXRpb24KKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBWYWxpZGF0ZUV4ZWN1dGFibGVNaXhlZE5vbmU8VCBleHRlbmRzIE51bWJlcj4geworCisgICAgICAgIEBNaW4oMCkKKyAgICAgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLk5PTkUpCisgICAgICAgIHB1YmxpYyBUIHZhbGlkYXRlRXhlY3V0YWJsZShATWF4KDEwKSBmaW5hbCBUIHZhbHVlKTsKKyAgICB9CisKKyAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbgorICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFZhbGlkYXRlRXhlY3V0YWJsZUNoYXJTZXF1ZW5jZU1peGVkTm9uZTxUIGV4dGVuZHMgQ2hhclNlcXVlbmNlPiB7CisKKyAgICAgICAgQE1pbigxMCkKKyAgICAgICAgQFZhbGlkYXRlT25FeGVjdXRpb24KKyAgICAgICAgcHVibGljIFQgdmFsaWRhdGVFeGVjdXRhYmxlKEBNYXgoMCkgZmluYWwgVCB2YWx1ZSk7CisgICAgfQorCisgICAgQFBhdGgoIm1peGVkLW5vbmUiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVmFsaWRhdGVFeGVjdXRhYmxlTWl4ZWROb25lUmVzb3VyY2UKKyAgICAgICAgICAgIGltcGxlbWVudHMgVmFsaWRhdGVFeGVjdXRhYmxlTWl4ZWROb25lPEludGVnZXI+LCBWYWxpZGF0ZUV4ZWN1dGFibGVDaGFyU2VxdWVuY2VNaXhlZE5vbmU8U3RyaW5nPiB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLkFMTCkKKyAgICAgICAgcHVibGljIEludGVnZXIgdmFsaWRhdGVFeGVjdXRhYmxlKGZpbmFsIEludGVnZXIgdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJhbm90aGVyIikKKyAgICAgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLkFMTCkKKyAgICAgICAgcHVibGljIFN0cmluZyB2YWxpZGF0ZUV4ZWN1dGFibGUoZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFZhbGlkYXRlRXhlY3V0YWJsZU9uTWV0aG9kc1Jlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIFZhbGlkYXRlRXhlY3V0YWJsZU9uVHlwZURlZmF1bHRSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGVNYXRjaFJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIFZhbGlkYXRlRXhlY3V0YWJsZU9uVHlwZU1pc3NSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGVOb25lUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgVmFsaWRhdGVFeGVjdXRhYmxlTWl4ZWREZWZhdWx0UmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgVmFsaWRhdGVFeGVjdXRhYmxlTWl4ZWROb25lUmVzb3VyY2UuY2xhc3MpCisgICAgICAgICAgICAgICAgLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuQlZfRElTQUJMRV9WQUxJREFURV9PTl9FWEVDVVRBQkxFX09WRVJSSURFX0NIRUNLLCB0cnVlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPblR5cGVWYWxpZGF0ZUlucHV0UGFzc1ZhbGlkYXRlRXhlY3V0YWJsZURlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RPblR5cGUoImRlZmF1bHQiLCAxNSwgMjAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPblR5cGVWYWxpZGF0ZVJlc3VsdFBhc3NOb1ZhbGlkYXRlRXhlY3V0YWJsZURlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RPblR5cGUoImRlZmF1bHQiLCAtMTUsIDIwMCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvdmFsaWRhdGlvbi92YWxpZGF0ZW9uZXhlY3V0aW9uL1ZhbGlkYXRlT25FeGVjdXRpb25Jbmhlcml0YW5jZVRlc3QuamF2YSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vdmFsaWRhdGVvbmV4ZWN1dGlvbi9WYWxpZGF0ZU9uRXhlY3V0aW9uSW5oZXJpdGFuY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYwNmE2NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vdmFsaWRhdGVvbmV4ZWN1dGlvbi9WYWxpZGF0ZU9uRXhlY3V0aW9uSW5oZXJpdGFuY2VUZXN0LmphdmEKQEAgLTAsMCArMSwzNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci52YWxpZGF0aW9uLnZhbGlkYXRlb25leGVjdXRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTWF4OworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTWluOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uZXhlY3V0YWJsZS5FeGVjdXRhYmxlVHlwZTsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLmV4ZWN1dGFibGUuVmFsaWRhdGVPbkV4ZWN1dGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCisvLyBAUnVuV2l0aChDb25jdXJyZW50UnVubmVyLmNsYXNzKQorcHVibGljIGNsYXNzIFZhbGlkYXRlT25FeGVjdXRpb25Jbmhlcml0YW5jZVRlc3QgZXh0ZW5kcyBWYWxpZGF0ZU9uRXhlY3V0aW9uQWJzdHJhY3RUZXN0IHsKKworICAgIC8qKgorICAgICAqIE9uIE1FVEhPRC4KKyAgICAgKi8KKworICAgIC8qKgorICAgICAqIHtAbGluayBWYWxpZGF0ZU9uRXhlY3V0aW9ufSBhbm5vdGF0aW9ucyBmcm9tIHRoaXMgaW50ZXJmYWNlIHNob3VsZCBiZSBjb25zaWRlcmVkIGR1cmluZyB2YWxpZGF0aW5nIHBoYXNlLgorICAgICAqLworICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24iLCAiSmF2YURvYyJ9KQorICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFZhbGlkYXRlRXhlY3V0YWJsZU9uTWV0aG9kc1ZhbGlkYXRpb24geworCisgICAgICAgIEBNaW4oMCkKKyAgICAgICAgQFZhbGlkYXRlT25FeGVjdXRpb24KKyAgICAgICAgcHVibGljIEludGVnZXIgdmFsaWRhdGVFeGVjdXRhYmxlRGVmYXVsdChATWF4KDEwKSBmaW5hbCBJbnRlZ2VyIHZhbHVlKTsKKworICAgICAgICBATWluKDApCisgICAgICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5OT05fR0VUVEVSX01FVEhPRFMpCisgICAgICAgIHB1YmxpYyBJbnRlZ2VyIHZhbGlkYXRlRXhlY3V0YWJsZU1hdGNoKEBNYXgoMTApIGZpbmFsIEludGVnZXIgdmFsdWUpOworCisgICAgICAgIEBNaW4oMCkKKyAgICAgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLkNPTlNUUlVDVE9SUykKKyAgICAgICAgcHVibGljIEludGVnZXIgdmFsaWRhdGVFeGVjdXRhYmxlTWlzcyhATWF4KDEwKSBmaW5hbCBJbnRlZ2VyIHZhbHVlKTsKKworICAgICAgICBATWluKDApCisgICAgICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5OT05FKQorICAgICAgICBwdWJsaWMgSW50ZWdlciB2YWxpZGF0ZUV4ZWN1dGFibGVOb25lKEBNYXgoMTApIGZpbmFsIEludGVnZXIgdmFsdWUpOworICAgIH0KKworICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5BTEwpCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgVmFsaWRhdGVFeGVjdXRhYmxlT25NZXRob2RzSmF4UnMgZXh0ZW5kcyBWYWxpZGF0ZUV4ZWN1dGFibGVPbk1ldGhvZHNWYWxpZGF0aW9uIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgidmFsaWRhdGVFeGVjdXRhYmxlRGVmYXVsdCIpCisgICAgICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5DT05TVFJVQ1RPUlMpCisgICAgICAgIEludGVnZXIgdmFsaWRhdGVFeGVjdXRhYmxlRGVmYXVsdChmaW5hbCBJbnRlZ2VyIHZhbHVlKTsKKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgidmFsaWRhdGVFeGVjdXRhYmxlTWF0Y2giKQorICAgICAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuR0VUVEVSX01FVEhPRFMpCisgICAgICAgIEludGVnZXIgdmFsaWRhdGVFeGVjdXRhYmxlTWF0Y2goZmluYWwgSW50ZWdlciB2YWx1ZSk7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoInZhbGlkYXRlRXhlY3V0YWJsZU1pc3MiKQorICAgICAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuTk9OX0dFVFRFUl9NRVRIT0RTKQorICAgICAgICBJbnRlZ2VyIHZhbGlkYXRlRXhlY3V0YWJsZU1pc3MoZmluYWwgSW50ZWdlciB2YWx1ZSk7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoInZhbGlkYXRlRXhlY3V0YWJsZU5vbmUiKQorICAgICAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuQUxMKQorICAgICAgICBJbnRlZ2VyIHZhbGlkYXRlRXhlY3V0YWJsZU5vbmUoZmluYWwgSW50ZWdlciB2YWx1ZSk7CisgICAgfQorCisgICAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBWYWxpZGF0ZUV4ZWN1dGFibGVPbk1ldGhvZHNBYnN0cmFjdFJlc291cmNlIGltcGxlbWVudHMgVmFsaWRhdGVFeGVjdXRhYmxlT25NZXRob2RzSmF4UnMgeworCisgICAgICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5OT05FKQorICAgICAgICBwdWJsaWMgYWJzdHJhY3QgSW50ZWdlciB2YWxpZGF0ZUV4ZWN1dGFibGVEZWZhdWx0KGZpbmFsIEludGVnZXIgdmFsdWUpOworCisgICAgICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5DT05TVFJVQ1RPUlMpCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBJbnRlZ2VyIHZhbGlkYXRlRXhlY3V0YWJsZU1hdGNoKGZpbmFsIEludGVnZXIgdmFsdWUpOworCisgICAgICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5BTEwpCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBJbnRlZ2VyIHZhbGlkYXRlRXhlY3V0YWJsZU1pc3MoZmluYWwgSW50ZWdlciB2YWx1ZSk7CisKKyAgICAgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLk5PTl9HRVRURVJfTUVUSE9EUykKKyAgICAgICAgcHVibGljIGFic3RyYWN0IEludGVnZXIgdmFsaWRhdGVFeGVjdXRhYmxlTm9uZShmaW5hbCBJbnRlZ2VyIHZhbHVlKTsKKyAgICB9CisKKyAgICBAUGF0aCgib24tbWV0aG9kIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFZhbGlkYXRlRXhlY3V0YWJsZU9uTWV0aG9kc1Jlc291cmNlIGV4dGVuZHMgVmFsaWRhdGVFeGVjdXRhYmxlT25NZXRob2RzQWJzdHJhY3RSZXNvdXJjZSB7CisKKyAgICAgICAgcHVibGljIEludGVnZXIgdmFsaWRhdGVFeGVjdXRhYmxlRGVmYXVsdChmaW5hbCBJbnRlZ2VyIHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSW50ZWdlciB2YWxpZGF0ZUV4ZWN1dGFibGVNYXRjaChmaW5hbCBJbnRlZ2VyIHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSW50ZWdlciB2YWxpZGF0ZUV4ZWN1dGFibGVNaXNzKGZpbmFsIEludGVnZXIgdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBJbnRlZ2VyIHZhbGlkYXRlRXhlY3V0YWJsZU5vbmUoZmluYWwgSW50ZWdlciB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogT24gVFlQRS4KKyAgICAgKi8KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJKYXZhRG9jIikKKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGUgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIEBNaW4oMCkKKyAgICAgICAgcHVibGljIEludGVnZXIgdmFsaWRhdGVFeGVjdXRhYmxlKEBNYXgoMTApIGZpbmFsIEludGVnZXIgdmFsdWUpOworICAgIH0KKworICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlRGVmYXVsdCBleHRlbmRzIFZhbGlkYXRlRXhlY3V0YWJsZU9uVHlwZSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyB7QGxpbmsgVmFsaWRhdGVPbkV4ZWN1dGlvbn0gYW5ub3RhdGlvbiBzaG91bGQgYmUgY29uc2lkZXJlZCBkdXJpbmcgdmFsaWRhdGluZyBwaGFzZS4KKyAgICAgKi8KKyAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuR0VUVEVSX01FVEhPRFMpCisgICAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGVEZWZhdWx0QWJzdHJhY3RSZXNvdXJjZSBpbXBsZW1lbnRzIFZhbGlkYXRlRXhlY3V0YWJsZU9uVHlwZURlZmF1bHQgeworCisgICAgICAgIHB1YmxpYyBJbnRlZ2VyIHZhbGlkYXRlRXhlY3V0YWJsZShmaW5hbCBJbnRlZ2VyIHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgib24tdHlwZS1kZWZhdWx0IikKKyAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuQ09OU1RSVUNUT1JTKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlRGVmYXVsdFJlc291cmNlIGV4dGVuZHMgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlRGVmYXVsdEFic3RyYWN0UmVzb3VyY2UgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMge0BsaW5rIFZhbGlkYXRlT25FeGVjdXRpb259IGFubm90YXRpb24gc2hvdWxkIGJlIGNvbnNpZGVyZWQgZHVyaW5nIHZhbGlkYXRpbmcgcGhhc2UuCisgICAgICovCisgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLk5PTl9HRVRURVJfTUVUSE9EUykKKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGVNYXRjaCBleHRlbmRzIFZhbGlkYXRlRXhlY3V0YWJsZU9uVHlwZSB7CisgICAgfQorCisgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLkdFVFRFUl9NRVRIT0RTKQorICAgIHB1YmxpYyBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlTWF0Y2hBYnN0cmFjdFJlc291cmNlIGltcGxlbWVudHMgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlTWF0Y2ggeworCisgICAgICAgIHB1YmxpYyBJbnRlZ2VyIHZhbGlkYXRlRXhlY3V0YWJsZShmaW5hbCBJbnRlZ2VyIHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgib24tdHlwZS1tYXRjaCIpCisgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLk5PTkUpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGVNYXRjaFJlc291cmNlIGV4dGVuZHMgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlTWF0Y2hBYnN0cmFjdFJlc291cmNlIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHtAbGluayBWYWxpZGF0ZU9uRXhlY3V0aW9ufSBhbm5vdGF0aW9uIHNob3VsZCBiZSBjb25zaWRlcmVkIGR1cmluZyB2YWxpZGF0aW5nIHBoYXNlLgorICAgICAqLworICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5DT05TVFJVQ1RPUlMpCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlTWlzcyBleHRlbmRzIFZhbGlkYXRlRXhlY3V0YWJsZU9uVHlwZSB7CisgICAgfQorCisgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLk5PTl9HRVRURVJfTUVUSE9EUykKKyAgICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIFZhbGlkYXRlRXhlY3V0YWJsZU9uVHlwZU1pc3NBYnN0cmFjdFJlc291cmNlIGltcGxlbWVudHMgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlTWlzcyB7CisKKyAgICAgICAgcHVibGljIEludGVnZXIgdmFsaWRhdGVFeGVjdXRhYmxlKGZpbmFsIEludGVnZXIgdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJvbi10eXBlLW1pc3MiKQorICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGVNaXNzUmVzb3VyY2UgZXh0ZW5kcyBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGVNaXNzQWJzdHJhY3RSZXNvdXJjZSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyB7QGxpbmsgVmFsaWRhdGVPbkV4ZWN1dGlvbn0gYW5ub3RhdGlvbiBzaG91bGQgYmUgY29uc2lkZXJlZCBkdXJpbmcgdmFsaWRhdGluZyBwaGFzZS4KKyAgICAgKi8KKyAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuTk9ORSkKKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGVOb25lIGV4dGVuZHMgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlIHsKKyAgICB9CisKKyAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuQUxMKQorICAgIHB1YmxpYyBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlTm9uZUFic3RyYWN0UmVzb3VyY2UgaW1wbGVtZW50cyBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGVOb25lIHsKKworICAgICAgICBwdWJsaWMgSW50ZWdlciB2YWxpZGF0ZUV4ZWN1dGFibGUoZmluYWwgSW50ZWdlciB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIm9uLXR5cGUtbm9uZSIpCisgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IHtFeGVjdXRhYmxlVHlwZS5DT05TVFJVQ1RPUlMsIEV4ZWN1dGFibGVUeXBlLk5PTl9HRVRURVJfTUVUSE9EU30pCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGVOb25lUmVzb3VyY2UgZXh0ZW5kcyBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGVOb25lQWJzdHJhY3RSZXNvdXJjZSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogTUlYRUQuCisgICAgICovCisKKyAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuTk9ORSkKKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBWYWxpZGF0ZUV4ZWN1dGFibGVNaXhlZERlZmF1bHQgeworCisgICAgICAgIEBNaW4oMCkKKyAgICAgICAgQFZhbGlkYXRlT25FeGVjdXRpb24KKyAgICAgICAgcHVibGljIEludGVnZXIgdmFsaWRhdGVFeGVjdXRhYmxlKEBNYXgoMTApIGZpbmFsIEludGVnZXIgdmFsdWUpOworICAgIH0KKworICAgIEBQYXRoKCJtaXhlZC1kZWZhdWx0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFZhbGlkYXRlRXhlY3V0YWJsZU1peGVkRGVmYXVsdFJlc291cmNlIGltcGxlbWVudHMgVmFsaWRhdGVFeGVjdXRhYmxlTWl4ZWREZWZhdWx0IHsKKworICAgICAgICBAUE9TVAorICAgICAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuQ09OU1RSVUNUT1JTKQorICAgICAgICBwdWJsaWMgSW50ZWdlciB2YWxpZGF0ZUV4ZWN1dGFibGUoZmluYWwgSW50ZWdlciB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgQFZhbGlkYXRlT25FeGVjdXRpb24KKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBWYWxpZGF0ZUV4ZWN1dGFibGVNaXhlZE5vbmUgeworCisgICAgICAgIEBNaW4oMCkKKyAgICAgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLk5PTkUpCisgICAgICAgIHB1YmxpYyBJbnRlZ2VyIHZhbGlkYXRlRXhlY3V0YWJsZShATWF4KDEwKSBmaW5hbCBJbnRlZ2VyIHZhbHVlKTsKKyAgICB9CisKKyAgICBAUGF0aCgibWl4ZWQtbm9uZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBWYWxpZGF0ZUV4ZWN1dGFibGVNaXhlZE5vbmVSZXNvdXJjZSBpbXBsZW1lbnRzIFZhbGlkYXRlRXhlY3V0YWJsZU1peGVkTm9uZSB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLkFMTCkKKyAgICAgICAgcHVibGljIEludGVnZXIgdmFsaWRhdGVFeGVjdXRhYmxlKGZpbmFsIEludGVnZXIgdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgVmFsaWRhdGVFeGVjdXRhYmxlTWl4ZWRDbGFzc0RlZmF1bHQgeworCisgICAgICAgIEBNaW4oMCkKKyAgICAgICAgcHVibGljIEludGVnZXIgdmFsaWRhdGVFeGVjdXRhYmxlKEBNYXgoMTApIGZpbmFsIEludGVnZXIgdmFsdWUpOworICAgIH0KKworICAgIEBQYXRoKCJtaXhlZC1jbGFzcy1kZWZhdWx0IikKKyAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuTk9ORSkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFZhbGlkYXRlRXhlY3V0YWJsZU1peGVkQ2xhc3NEZWZhdWx0UmVzb3VyY2UgaW1wbGVtZW50cyBWYWxpZGF0ZUV4ZWN1dGFibGVNaXhlZENsYXNzRGVmYXVsdCB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLkNPTlNUUlVDVE9SUykKKyAgICAgICAgcHVibGljIEludGVnZXIgdmFsaWRhdGVFeGVjdXRhYmxlKGZpbmFsIEludGVnZXIgdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uKHR5cGUgPSBFeGVjdXRhYmxlVHlwZS5OT05FKQorICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFZhbGlkYXRlRXhlY3V0YWJsZU1peGVkQ2xhc3NOb25lIHsKKworICAgICAgICBATWluKDApCisgICAgICAgIHB1YmxpYyBJbnRlZ2VyIHZhbGlkYXRlRXhlY3V0YWJsZShATWF4KDEwKSBmaW5hbCBJbnRlZ2VyIHZhbHVlKTsKKyAgICB9CisKKyAgICBAUGF0aCgibWl4ZWQtY2xhc3Mtbm9uZSIpCisgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLk5PTl9HRVRURVJfTUVUSE9EUykKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFZhbGlkYXRlRXhlY3V0YWJsZU1peGVkQ2xhc3NOb25lUmVzb3VyY2UgaW1wbGVtZW50cyBWYWxpZGF0ZUV4ZWN1dGFibGVNaXhlZENsYXNzTm9uZSB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFZhbGlkYXRlT25FeGVjdXRpb24odHlwZSA9IEV4ZWN1dGFibGVUeXBlLkFMTCkKKyAgICAgICAgcHVibGljIEludGVnZXIgdmFsaWRhdGVFeGVjdXRhYmxlKGZpbmFsIEludGVnZXIgdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoVmFsaWRhdGVFeGVjdXRhYmxlT25NZXRob2RzUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgVmFsaWRhdGVFeGVjdXRhYmxlT25UeXBlTm9uZVJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIFZhbGlkYXRlRXhlY3V0YWJsZU9uVHlwZU1pc3NSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBWYWxpZGF0ZUV4ZWN1dGFibGVPblR5cGVNYXRjaFJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIFZhbGlkYXRlRXhlY3V0YWJsZU9uVHlwZURlZmF1bHRSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBWYWxpZGF0ZUV4ZWN1dGFibGVNaXhlZERlZmF1bHRSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBWYWxpZGF0ZUV4ZWN1dGFibGVNaXhlZE5vbmVSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBWYWxpZGF0ZUV4ZWN1dGFibGVNaXhlZENsYXNzTm9uZVJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIFZhbGlkYXRlRXhlY3V0YWJsZU1peGVkQ2xhc3NEZWZhdWx0UmVzb3VyY2UuY2xhc3MpCisgICAgICAgICAgICAgICAgLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuQlZfRElTQUJMRV9WQUxJREFURV9PTl9FWEVDVVRBQkxFX09WRVJSSURFX0NIRUNLLCB0cnVlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPblR5cGVWYWxpZGF0ZUlucHV0UGFzc1ZhbGlkYXRlRXhlY3V0YWJsZURlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RPblR5cGUoImRlZmF1bHQiLCAxNSwgMjAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPblR5cGVWYWxpZGF0ZVJlc3VsdFBhc3NOb1ZhbGlkYXRlRXhlY3V0YWJsZURlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RPblR5cGUoImRlZmF1bHQiLCAtMTUsIDIwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWl4ZWRDbGFzc1ZhbGlkYXRlUGFzc0RlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoIm1peGVkLWNsYXNzLWRlZmF1bHQiLCAwLCAyMDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1peGVkQ2xhc3NWYWxpZGF0ZUlucHV0UGFzc1ZhbGlkYXRlRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgibWl4ZWQtY2xhc3MtZGVmYXVsdCIsIDE1LCAyMDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1peGVkQ2xhc3NWYWxpZGF0ZVJlc3VsdFBhc3NOb1ZhbGlkYXRlRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgibWl4ZWQtY2xhc3MtZGVmYXVsdCIsIC0xNSwgMjAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNaXhlZENsYXNzVmFsaWRhdGVQYXNzTm9uZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgibWl4ZWQtY2xhc3Mtbm9uZSIsIDAsIDIwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWl4ZWRDbGFzc1ZhbGlkYXRlSW5wdXRQYXNzTm9uZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgibWl4ZWQtY2xhc3Mtbm9uZSIsIDE1LCAyMDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1peGVkQ2xhc3NWYWxpZGF0ZVJlc3VsdFBhc3NOb25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJtaXhlZC1jbGFzcy1ub25lIiwgLTE1LCAyMDApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3ZhbGlkYXRpb24vdmFsaWRhdGVvbmV4ZWN1dGlvbi9WYWxpZGF0ZU9uRXhlY3V0aW9uT3ZlcnJpZGVUZXN0LmphdmEgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL3ZhbGlkYXRlb25leGVjdXRpb24vVmFsaWRhdGVPbkV4ZWN1dGlvbk92ZXJyaWRlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNTRjNDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci92YWxpZGF0aW9uL3ZhbGlkYXRlb25leGVjdXRpb24vVmFsaWRhdGVPbkV4ZWN1dGlvbk92ZXJyaWRlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIudmFsaWRhdGlvbi52YWxpZGF0ZW9uZXhlY3V0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nUmVjb3JkOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWRhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5leGVjdXRhYmxlLkV4ZWN1dGFibGVUeXBlOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uZXhlY3V0YWJsZS5WYWxpZGF0ZU9uRXhlY3V0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pbnN0YW5jZU9mOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogVGVzdGluZyB3aGV0aGVyIGFuIHtAbGluayBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRpb25FeGNlcHRpb259IGlzIHJhaXNlZCB3aGVuIHtAbGluayBWYWxpZGF0ZU9uRXhlY3V0aW9ufSBpcyBwcmVzZW50IG9uCisgKiBvdmVycmlkaW5nL2ltcGxlbWVudGluZyBtZXRob2QgYXMgd2VsbC4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIFZhbGlkYXRlT25FeGVjdXRpb25PdmVycmlkZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFZhbGlkYXRpb24geworCisgICAgICAgIEBOb3ROdWxsCisgICAgICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uCisgICAgICAgIHB1YmxpYyBTdHJpbmcgaW50ZXJmYWNlTWVzc2FnZSgpOworICAgIH0KKworICAgIHB1YmxpYyBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgVmFsaWRhdGlvbkJhc2UgeworCisgICAgICAgIEBOb3ROdWxsCisgICAgICAgIEBWYWxpZGF0ZU9uRXhlY3V0aW9uCisgICAgICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgY2xhc3NNZXNzYWdlKCk7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVmFsaWRhdGlvblJlc291cmNlIGV4dGVuZHMgVmFsaWRhdGlvbkJhc2UgaW1wbGVtZW50cyBWYWxpZGF0aW9uIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJpbnRlcmZhY2UiKQorICAgICAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuR0VUVEVSX01FVEhPRFMpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgaW50ZXJmYWNlTWVzc2FnZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAia28iOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiY2xhc3MiKQorICAgICAgICBAVmFsaWRhdGVPbkV4ZWN1dGlvbih0eXBlID0gRXhlY3V0YWJsZVR5cGUuR0VUVEVSX01FVEhPRFMpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgY2xhc3NNZXNzYWdlKCkgeworICAgICAgICAgICAgcmV0dXJuICJrbyI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworCisgICAgICAgIHNldChUZXN0UHJvcGVydGllcy5SRUNPUkRfTE9HX0xFVkVMLCBMZXZlbC5XQVJOSU5HLmludFZhbHVlKCkpOworCisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoVmFsaWRhdGlvblJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPdmVycmlkaW5nQ2hlY2tPbkludGVyZmFjZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgiaW50ZXJmYWNlIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGluZ0NoZWNrT25DbGFzcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgiY2xhc3MiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3QoZmluYWwgU3RyaW5nIHBhdGgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRUaGF0KHRhcmdldChwYXRoKS5yZXF1ZXN0KCkuZ2V0KCkuZ2V0U3RhdHVzKCksIGVxdWFsVG8oNTAwKSk7CisKKyAgICAgICAgZmluYWwgTGlzdDxMb2dSZWNvcmQ+IGxvZ2dlZFJlY29yZHMgPSBnZXRMb2dnZWRSZWNvcmRzKCk7CisgICAgICAgIGFzc2VydFRoYXQobG9nZ2VkUmVjb3Jkcy5zaXplKCksIGVxdWFsVG8oMSkpOworICAgICAgICBhc3NlcnRUaGF0KGxvZ2dlZFJlY29yZHMuZ2V0KDApLmdldFRocm93bigpLCBpbnN0YW5jZU9mKFZhbGlkYXRpb25FeGNlcHRpb24uY2xhc3MpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci93YWRsL092ZXJyaWRlV2FkbFJlc291cmNlVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvd2FkbC9PdmVycmlkZVdhZGxSZXNvdXJjZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjM4MjYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvd2FkbC9PdmVycmlkZVdhZGxSZXNvdXJjZVRlc3QuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIud2FkbDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitwdWJsaWMgY2xhc3MgT3ZlcnJpZGVXYWRsUmVzb3VyY2VUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICAvLyBUaGUgZXhwbGljaXQgQFByb2R1Y2VzIGRlZmluaXRpb24gaW1wcm92ZXMgdGhlIGNvbXBhdGliaWxpdHkgb2YgdGhlIHRlc3QgY2FzZSB3aXRoIG90aGVyIGNvbm5lY3RvcnMuCisgICAgLy8gVW5saWtlIEh0dHBVcmxDb25uZWN0b3IsIG90aGVycyBtaWdodCBub3QgYmUgc2VuZGluZyBkZWZhdWx0IGFjY2VwdGVkIG1lZGlhIHR5cGVzICgobmFtZWx5IHRoZSBKZGtDb25uZWN0b3IpCisgICAgLy8gYW5kIHRoZSByZXNvdXJjZSB3b3VsZCBub3QgYmUgbWF0Y2hlZC4KKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIEBQYXRoKCJhcHBsaWNhdGlvbi53YWRsIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE92ZXJyaWRlV2FkbEFwcGxpY2F0aW9uUmVzb3VyY2UgeworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJPVkVSUklERSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKE92ZXJyaWRlV2FkbEFwcGxpY2F0aW9uUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE92ZXJyaWRlKCkgeworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCIvYXBwbGljYXRpb24ud2FkbCIpOworCisgICAgICAgIGFzc2VydEVxdWFscygiT1ZFUlJJREUiLCB0YXJnZXQucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci93YWRsL1Jlc291cmNlRXh0ZW5kZWRGbGFnVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvd2FkbC9SZXNvdXJjZUV4dGVuZGVkRmxhZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGE1OTE3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvd2FkbC9SZXNvdXJjZUV4dGVuZGVkRmxhZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDMzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLndhZGw7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5Eb2N1bWVudEJ1aWxkZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5PdXRwdXRLZXlzOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKK2ltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGg7CitpbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoQ29uc3RhbnRzOworaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aEV4cHJlc3Npb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoRmFjdG9yeTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuU2F4SGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuU2ltcGxlTmFtZXNwYWNlUmVzb2x2ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLk1lZGlhVHlwZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkV4dGVuZGVkUmVzb3VyY2VDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuRXh0ZW5kZWRSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTWV0aG9kOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZU1vZGVsOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLmludGVybmFsLldhZGxVdGlsczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0IHZlcmlmaWVzIGZ1bmN0aW9uYWxpdHkgb2Yge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZSNpc0V4dGVuZGVkKCl9IGFuZCBpdHMKKyAqIGluZmx1ZW5jZSBvbiBXQURMLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIFJlc291cmNlRXh0ZW5kZWRGbGFnVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhNeVJlc291cmNlLmNsYXNzLCBBbGxFeHRlbmRlZC5jbGFzcywgTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpOworICAgIH0KKworICAgIEBQYXRoKCJhbGwtZXh0ZW5kZWQiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQWxsRXh0ZW5kZWQgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQEV4dGVuZGVkUmVzb3VyY2UKKyAgICAgICAgcHVibGljIFN0cmluZyBhbGxFeHRlbmRlZEdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiZ2V0IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInN1YiIpCisgICAgICAgIEBFeHRlbmRlZFJlc291cmNlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgYWxsRXh0ZW5kZWRTdWJHZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gInN1Yi1nZXQiOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImxvY2F0b3IiKQorICAgICAgICBARXh0ZW5kZWRSZXNvdXJjZQorICAgICAgICBwdWJsaWMgU3ViUmVzb3VyY2VMb2NhdG9yIGFsbEV4dGVuZGVkU3ViTG9jYXRvcigpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3ViUmVzb3VyY2VMb2NhdG9yKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN1YlJlc291cmNlTG9jYXRvciB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiZ2V0IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJyZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVJlc291cmNlIHsKKworICAgICAgICBAQ29udGV4dAorICAgICAgICBwcml2YXRlIEV4dGVuZGVkUmVzb3VyY2VDb250ZXh0IGV4dGVuZGVkUmVzb3VyY2VDb250ZXh0OworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyByZXNvdXJjZUdldCgpIHsKKworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVycm9yID0gdmFsaWRhdGVNb2RlbCgpOworICAgICAgICAgICAgcmV0dXJuIGVycm9yID09IG51bGwgPyAib2siIDogZXJyb3I7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJleHRlbmRlZCIpCisgICAgICAgIEBFeHRlbmRlZFJlc291cmNlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcmVzb3VyY2VFeHRlbmRlZEdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiZXh0ZW5kZWQiOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQEV4dGVuZGVkUmVzb3VyY2UKKyAgICAgICAgcHVibGljIFN0cmluZyByZXNvdXJjZUV4dGVuZGVkUG9zdCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiZXh0ZW5kZWRwb3N0IjsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJ2aXNpYmxlIikKKyAgICAgICAgcHVibGljIFN0cmluZyByZXNvdXJjZVZpc2libGVQb3N0KCkgeworICAgICAgICAgICAgcmV0dXJuICJ2aXNpYmxlcG9zdCI7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIFN0cmluZyB2YWxpZGF0ZU1vZGVsKCkgeworICAgICAgICAgICAgTWFwPFN0cmluZywgQm9vbGVhbj4gZXh0ZW5kZWRNZXRob2RzID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICAgICAgZXh0ZW5kZWRNZXRob2RzLnB1dCgicmVzb3VyY2VFeHRlbmRlZEdldCIsIGZhbHNlKTsKKyAgICAgICAgICAgIGV4dGVuZGVkTWV0aG9kcy5wdXQoInJlc291cmNlRXh0ZW5kZWRQb3N0IiwgZmFsc2UpOworICAgICAgICAgICAgZXh0ZW5kZWRNZXRob2RzLnB1dCgiYWxsRXh0ZW5kZWRHZXQiLCBmYWxzZSk7CisgICAgICAgICAgICBleHRlbmRlZE1ldGhvZHMucHV0KCJhbGxFeHRlbmRlZFN1YkdldCIsIGZhbHNlKTsKKyAgICAgICAgICAgIGV4dGVuZGVkTWV0aG9kcy5wdXQoImFsbEV4dGVuZGVkU3ViTG9jYXRvciIsIGZhbHNlKTsKKworICAgICAgICAgICAgTWFwPFN0cmluZywgQm9vbGVhbj4gdmlzaWJsZU1ldGhvZHMgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgICAgICB2aXNpYmxlTWV0aG9kcy5wdXQoInJlc291cmNlVmlzaWJsZVBvc3QiLCBmYWxzZSk7CisgICAgICAgICAgICB2aXNpYmxlTWV0aG9kcy5wdXQoInJlc291cmNlR2V0IiwgZmFsc2UpOworCisgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZU1vZGVsIHJlc291cmNlTW9kZWwgPSBleHRlbmRlZFJlc291cmNlQ29udGV4dC5nZXRSZXNvdXJjZU1vZGVsKCk7CisgICAgICAgICAgICBmb3IgKFJlc291cmNlIHJvb3RSZXNvdXJjZSA6IHJlc291cmNlTW9kZWwuZ2V0Um9vdFJlc291cmNlcygpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVycm9yID0gY2hlY2tSZXNvdXJjZShyb290UmVzb3VyY2UsIGV4dGVuZGVkTWV0aG9kcywgdmlzaWJsZU1ldGhvZHMsICIiKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyb3IgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIEJvb2xlYW4+IGVudHJ5IDogZXh0ZW5kZWRNZXRob2RzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZW50cnkuZ2V0VmFsdWUoKSAhPSBudWxsICYmICFlbnRyeS5nZXRWYWx1ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiRXh0ZW5kZWQgbWV0aG9kICIgKyBlbnRyeS5nZXRLZXkoKSArICIgd2FzIG5vdCBmb3VuZCI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIEJvb2xlYW4+IGVudHJ5IDogdmlzaWJsZU1ldGhvZHMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgICAgIGlmIChlbnRyeS5nZXRWYWx1ZSgpICE9IG51bGwgJiYgIWVudHJ5LmdldFZhbHVlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJWaXNpYmxlIG1ldGhvZCAiICsgZW50cnkuZ2V0S2V5KCkgKyAiIHdhcyBub3QgZm91bmQiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgY2hlY2tSZXNvdXJjZShSZXNvdXJjZSByZXNvdXJjZSwgTWFwPFN0cmluZywgQm9vbGVhbj4gZXh0ZW5kZWRNZXRob2RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcDxTdHJpbmcsIEJvb2xlYW4+IHZpc2libGVNZXRob2RzLCBTdHJpbmcgcHJlZml4KSB7CisKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihwcmVmaXggKyAiUiBleHRlbmRlZD0iICsgcmVzb3VyY2UuaXNFeHRlbmRlZCgpICsgIiByZXNvdXJjZTogIiArIHJlc291cmNlKTsKKworICAgICAgICAgICAgYm9vbGVhbiBhbGxFeHRlbmRlZCA9IHRydWU7CisgICAgICAgICAgICBmb3IgKFJlc291cmNlTWV0aG9kIHJlc291cmNlTWV0aG9kIDogcmVzb3VyY2UuZ2V0QWxsTWV0aG9kcygpKSB7CisgICAgICAgICAgICAgICAgaWYgKCJPUFRJT05TIi5lcXVhbHMocmVzb3VyY2VNZXRob2QuZ2V0SHR0cE1ldGhvZCgpKSAmJiAhcmVzb3VyY2VNZXRob2QuaXNFeHRlbmRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAiT1BUSU9OUyBtZXRob2QgIiArIHJlc291cmNlTWV0aG9kICsgIiBpcyBub3QgZXh0ZW5kZWQiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIXJlc291cmNlTWV0aG9kLmlzRXh0ZW5kZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBhbGxFeHRlbmRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBtZXRob2ROYW1lID0gcmVzb3VyY2VNZXRob2QuZ2V0SW52b2NhYmxlKCkuZ2V0SGFuZGxpbmdNZXRob2QoKS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKGV4dGVuZGVkTWV0aG9kcy5nZXQobWV0aG9kTmFtZSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBleHRlbmRlZE1ldGhvZHMucHV0KG1ldGhvZE5hbWUsIHRydWUpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc291cmNlTWV0aG9kLmlzRXh0ZW5kZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJNZXRob2QgIiArIG1ldGhvZE5hbWUgKyAiIHNob3VsZCBiZSBleHRlbmRlZC4iOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHZpc2libGVNZXRob2RzLmdldChtZXRob2ROYW1lKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHZpc2libGVNZXRob2RzLnB1dChtZXRob2ROYW1lLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlTWV0aG9kLmlzRXh0ZW5kZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJNZXRob2QgIiArIG1ldGhvZE5hbWUgKyAiIHNob3VsZCBOT1QgYmUgZXh0ZW5kZWQuIjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocHJlZml4ICsgIiAgIE0gZXh0ZW5kZWQ9IiArIHJlc291cmNlTWV0aG9kLmlzRXh0ZW5kZWQoKSArICIgbWV0aG9kOiAiICsgbWV0aG9kTmFtZSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciAoUmVzb3VyY2UgY2hpbGQgOiByZXNvdXJjZS5nZXRDaGlsZFJlc291cmNlcygpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVycm9yID0gY2hlY2tSZXNvdXJjZShjaGlsZCwgZXh0ZW5kZWRNZXRob2RzLCB2aXNpYmxlTWV0aG9kcywgIiAgICAgIik7CisgICAgICAgICAgICAgICAgaWYgKGVycm9yICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGFsbEV4dGVuZGVkICE9IHJlc291cmNlLmlzRXh0ZW5kZWQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAiUmVzb3VyY2UgIiArIHJlc291cmNlICsgIlJlc291cmNlLmV4dGVuZGVkID0gIiArIHJlc291cmNlLmlzRXh0ZW5kZWQoKSArICIgYW5kIGFsbEV4dGVuZGVkPSIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgYWxsRXh0ZW5kZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEludm9rZXMgcmVzb3VyY2UgbWV0aG9kIHdoaWNoIGdvZXMgdHJvdWdoIHRoZSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlTW9kZWx9CisgICAgICogYW5kIGNoZWNrcyB3aGV0aGVyIHtAY29kZSBleHRlbmRlZH0gZmxhZyBpcyBjb3JyZWN0bHkgZGVmaW5lZCBvbiByZXNvdXJjZXMgYW5kIG1ldGhvZHMuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VNb2RlbCgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm9rIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBmdWxsIHdhZGwgd2l0aCBhbGwgImV4dGVuZGVkIiBkZXRhaWxzLgorICAgICAqCisgICAgICogQHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCisgICAgICogQHRocm93cyBYUGF0aEV4cHJlc3Npb25FeGNlcHRpb24KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCisgICAgICogQHRocm93cyBTQVhFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZXRhaWxlZFdhZGwoKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgWFBhdGhFeHByZXNzaW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwKKyAgICAgICAgICAgIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCIvYXBwbGljYXRpb24ud2FkbCIpLnF1ZXJ5UGFyYW0oV2FkbFV0aWxzLkRFVEFJTEVEX1dBRExfUVVFUllfUEFSQU0sICJ0cnVlIikKKyAgICAgICAgICAgICAgICAucmVxdWVzdChNZWRpYVR5cGVzLldBRExfVFlQRSkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgRmlsZSB0bXBGaWxlID0gcmVzcG9uc2UucmVhZEVudGl0eShGaWxlLmNsYXNzKTsKKyAgICAgICAgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBiZiA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgYmYuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7CisgICAgICAgIGJmLnNldFZhbGlkYXRpbmcoZmFsc2UpOworICAgICAgICBpZiAoIVNheEhlbHBlci5pc1hka0RvY3VtZW50QnVpbGRlckZhY3RvcnkoYmYpKSB7CisgICAgICAgICAgICBiZi5zZXRYSW5jbHVkZUF3YXJlKGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBEb2N1bWVudEJ1aWxkZXIgYiA9IGJmLm5ld0RvY3VtZW50QnVpbGRlcigpOworICAgICAgICBEb2N1bWVudCBkID0gYi5wYXJzZSh0bXBGaWxlKTsKKyAgICAgICAgcHJpbnRTb3VyY2UobmV3IERPTVNvdXJjZShkKSk7CisgICAgICAgIFhQYXRoIHhwID0gWFBhdGhGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3WFBhdGgoKTsKKyAgICAgICAgeHAuc2V0TmFtZXNwYWNlQ29udGV4dChuZXcgU2ltcGxlTmFtZXNwYWNlUmVzb2x2ZXIoIndhZGwiLCAiaHR0cDovL3dhZGwuZGV2LmphdmEubmV0LzIwMDkvMDIiKSk7CisKKyAgICAgICAgLy8gY2hlY2sgYmFzZSBVUkkKKyAgICAgICAgU3RyaW5nIHZhbCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKCIvd2FkbDphcHBsaWNhdGlvbi93YWRsOnJlc291cmNlcy9AYmFzZSIsIGQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgIGFzc2VydEVxdWFscyh2YWwsIGdldEJhc2VVcmkoKS50b1N0cmluZygpKTsKKyAgICAgICAgLy8gY2hlY2sgdG90YWwgbnVtYmVyIG9mIHJlc291cmNlcyBpcyA4CisgICAgICAgIHZhbCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKCJjb3VudCgvL3dhZGw6cmVzb3VyY2UpIiwgZCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI4IiwgdmFsKTsKKworICAgICAgICB2YWwgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZSgiY291bnQoLy93YWRsOnJlc291cmNlW0BwYXRoPSdhbGwtZXh0ZW5kZWQnXSkiLCBkLCBYUGF0aENvbnN0YW50cy5TVFJJTkcpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCB2YWwpOworCisgICAgICAgIHZhbCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKCJjb3VudCgvL3dhZGw6cmVzb3VyY2VbQHBhdGg9J3Jlc291cmNlJ10pIiwgZCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgdmFsKTsKKworICAgICAgICB2YWwgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZSgiY291bnQoLy93YWRsOnJlc291cmNlW0BwYXRoPSdhcHBsaWNhdGlvbi53YWRsJ10pIiwgZCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgdmFsKTsKKworICAgICAgICB4cC5zZXROYW1lc3BhY2VDb250ZXh0KG5ldyBTaW1wbGVOYW1lc3BhY2VSZXNvbHZlcigiamVyc2V5IiwgImh0dHA6Ly9qZXJzZXkuamF2YS5uZXQvIikpOworICAgICAgICB2YWwgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZSgiY291bnQoLy9qZXJzZXk6ZXh0ZW5kZWQpIiwgZCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIzMSIsIHZhbCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgbGltaXRlZCB3YWRsIHdpdGggb25seSB1c2VyIHJlc291cmNlcy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgWFBhdGhFeHByZXNzaW9uRXhjZXB0aW9uCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgU0FYRXhjZXB0aW9uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TGltaXRlZFdhZGwoKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgWFBhdGhFeHByZXNzaW9uRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwKKyAgICAgICAgICAgIFNBWEV4Y2VwdGlvbiB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCIvYXBwbGljYXRpb24ud2FkbCIpLnJlcXVlc3QoTWVkaWFUeXBlcy5XQURMX1RZUEUpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEZpbGUgdG1wRmlsZSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoRmlsZS5jbGFzcyk7CisgICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgYmYgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIGJmLnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOworICAgICAgICBiZi5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKKyAgICAgICAgaWYgKCFTYXhIZWxwZXIuaXNYZGtEb2N1bWVudEJ1aWxkZXJGYWN0b3J5KGJmKSkgeworICAgICAgICAgICAgYmYuc2V0WEluY2x1ZGVBd2FyZShmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgRG9jdW1lbnRCdWlsZGVyIGIgPSBiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICAgICAgRG9jdW1lbnQgZCA9IGIucGFyc2UodG1wRmlsZSk7CisgICAgICAgIHByaW50U291cmNlKG5ldyBET01Tb3VyY2UoZCkpOworICAgICAgICBYUGF0aCB4cCA9IFhQYXRoRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1hQYXRoKCk7CisgICAgICAgIHhwLnNldE5hbWVzcGFjZUNvbnRleHQobmV3IFNpbXBsZU5hbWVzcGFjZVJlc29sdmVyKCJ3YWRsIiwgImh0dHA6Ly93YWRsLmRldi5qYXZhLm5ldC8yMDA5LzAyIikpOworCisgICAgICAgIC8vIGNoZWNrIGJhc2UgVVJJCisgICAgICAgIFN0cmluZyB2YWwgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZSgiL3dhZGw6YXBwbGljYXRpb24vd2FkbDpyZXNvdXJjZXMvQGJhc2UiLCBkLCBYUGF0aENvbnN0YW50cy5TVFJJTkcpOworICAgICAgICBhc3NlcnRFcXVhbHModmFsLCBnZXRCYXNlVXJpKCkudG9TdHJpbmcoKSk7CisgICAgICAgIC8vIGNoZWNrIHRvdGFsIG51bWJlciBvZiByZXNvdXJjZXMgaXMgOAorICAgICAgICB2YWwgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZSgiY291bnQoLy93YWRsOnJlc291cmNlKSIsIGQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgIGFzc2VydEVxdWFscygiMiIsIHZhbCk7CisKKyAgICAgICAgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoImNvdW50KC8vd2FkbDpyZXNvdXJjZVtAcGF0aD0nYWxsLWV4dGVuZGVkJ10pIiwgZCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIwIiwgdmFsKTsKKworICAgICAgICB2YWwgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZSgiY291bnQoLy93YWRsOnJlc291cmNlW0BwYXRoPSdyZXNvdXJjZSddKSIsIGQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgIGFzc2VydEVxdWFscygiMSIsIHZhbCk7CisKKyAgICAgICAgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoImNvdW50KC8vd2FkbDpyZXNvdXJjZVtAcGF0aD0nYXBwbGljYXRpb24ud2FkbCddKSIsIGQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgIGFzc2VydEVxdWFscygiMCIsIHZhbCk7CisKKyAgICAgICAgeHAuc2V0TmFtZXNwYWNlQ29udGV4dChuZXcgU2ltcGxlTmFtZXNwYWNlUmVzb2x2ZXIoImplcnNleSIsICJodHRwOi8vamVyc2V5LmphdmEubmV0LyIpKTsKKyAgICAgICAgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoImNvdW50KC8vamVyc2V5OmV4dGVuZGVkKSIsIGQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgIGFzc2VydEVxdWFscygiMCIsIHZhbCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50U291cmNlKFNvdXJjZSBzb3VyY2UpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisgICAgICAgICAgICBUcmFuc2Zvcm1lciB0cmFucyA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7CisgICAgICAgICAgICBQcm9wZXJ0aWVzIG9wcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICBvcHJvcHMucHV0KE91dHB1dEtleXMuT01JVF9YTUxfREVDTEFSQVRJT04sICJ5ZXMiKTsKKyAgICAgICAgICAgIG9wcm9wcy5wdXQoT3V0cHV0S2V5cy5JTkRFTlQsICJ5ZXMiKTsKKyAgICAgICAgICAgIG9wcm9wcy5wdXQoT3V0cHV0S2V5cy5NRVRIT0QsICJ4bWwiKTsKKyAgICAgICAgICAgIHRyYW5zLnNldE91dHB1dFByb3BlcnRpZXMob3Byb3BzKTsKKyAgICAgICAgICAgIHRyYW5zLnRyYW5zZm9ybShzb3VyY2UsIG5ldyBTdHJlYW1SZXN1bHQoU3lzdGVtLm91dCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvd2FkbC9XYWRsQmVhblBhcmFtVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvd2FkbC9XYWRsQmVhblBhcmFtVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZGY4N2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci93YWRsL1dhZGxCZWFuUGFyYW1UZXN0LmphdmEKQEAgLTAsMCArMSw1MTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci53YWRsOworCitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworaW1wb3J0IGphdmF4LndzLnJzLkJlYW5QYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Db29raWVQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5FbmNvZGVkOworaW1wb3J0IGphdmF4LndzLnJzLkZvcm1QYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5IZWFkZXJQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5NYXRyaXhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXF1ZXN0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJFeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5kb20uRE9NU291cmNlOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKK2ltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGg7CitpbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoQ29uc3RhbnRzOworaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aEZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlNpbXBsZU5hbWVzcGFjZVJlc29sdmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuY3VzdG9tbW9ua2V5LnhtbHVuaXQuRGlmZjsKK2ltcG9ydCBvcmcuY3VzdG9tbW9ua2V5LnhtbHVuaXQuRWxlbWVudE5hbWVBbmRUZXh0UXVhbGlmaWVyOworaW1wb3J0IG9yZy5jdXN0b21tb25rZXkueG1sdW5pdC5TaW1wbGVOYW1lc3BhY2VDb250ZXh0OworaW1wb3J0IG9yZy5jdXN0b21tb25rZXkueG1sdW5pdC5YTUxBc3NlcnQ7CitpbXBvcnQgb3JnLmN1c3RvbW1vbmtleS54bWx1bml0LlhNTFVuaXQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uRWxlbWVudDsKK2ltcG9ydCBvcmcudzNjLmRvbS5Ob2RlOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CisKKy8qKgorICogVGVzdHMgd2hldGhlciBXQURMIGZvciBhIHtAbGluayBCZWFuUGFyYW19IGFubm90YXRlZCByZXNvdXJjZSBtZXRob2QgcGFyYW1ldGVyIGlzIGdlbmVyYXRlZCBwcm9wZXJseS4KKyAqIDxwLz4KKyAqIFRoZSB0ZXN0cyBvZiB0aGlzIGNsYXNzIHBlcmZvcm0gYSBjb21wYXJpc29uIG9mCisgKiA8cHJlPjx1bD4KKyAqICAgICA8bGk+YSBXQURMIG9mIGEgcmVmZXJlbmNlIHJlc291cmNlIHRoYXQgaGFzIHtAY29kZSAqUGFyYW19IGFubm90YXRlZCBjbGFzcyBmaWVsZHMgb3IgcmVzb3VyY2UgbWV0aG9kIHBhcmFtZXRlcnM8L2xpPgorICogICAgIDxsaT53aXRoIGEgcmVzb3VyY2UgY29uZmlndXJlZCB3aXRoIHtAbGluayBCZWFuUGFyYW19IGFubm90YXRlZCBwYXJhbWV0ZXJzIHdoZXJlIHNvbWUgb2YgdGhlIHJlZmVyZW5jZSByZXNvdXJjZSBwYXJhbWV0ZXJzCisgKiAgICAgICAgICBhcmUgYWdncmVnYXRlZCBpbiB0aGUgY2xhc3MgdGhhdCBpcyB1c2VkIGFzIGEgYmVhbiBwYXJhbTwvbGk+CisgKiA8L3VsPjwvcHJlPgorICoKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFdhZGxCZWFuUGFyYW1UZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIGZpbmFsIEVsZW1lbnROYW1lQW5kVGV4dFF1YWxpZmllciBlbGVtZW50UXVhbGlmaWVyID0gbmV3IEVsZW1lbnROYW1lQW5kVGV4dFF1YWxpZmllcigpIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogRm9yIHtAY29kZSA8cGFyYW0gPz8/IC8+fSBub2RlcywgdGhlIGNvbXBhcmlzb24gaXMgYmFzZWQgb24gbWF0Y2hpbmcge0Bjb2RlIG5hbWV9IGF0dHJpYnV0ZXMgd2hpbGUgaWdub3JpbmcKKyAgICAgICAgICogdGhlaXIgb3JkZXIuIEZvciBhbnkgb3RoZXIgbm9kZXMsIHN0cmljdCBjb21wYXJpc29uIChpbmNsdWRpbmcgb3JkZXJpbmcpIGlzIG1hZGUuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb250cm9sIFRoZSByZWZlcmVuY2UgZWxlbWVudCB0byBjb21wYXJlIHRoZSB7QGNvZGUgdGVzdH0gd2l0aC4KKyAgICAgICAgICogQHBhcmFtIHRlc3QgVGhlIHRlc3QgZWxlbWVudCB0byBjb21wYXJlIGFnYWluc3Qge0Bjb2RlIGNvbnRyb2x9LgorICAgICAgICAgKiBAcmV0dXJuIFdoZXRoZXIgZ2l2ZW4gbm9kZXMgcXVhbGlmeSBmb3IgY29tcGFyaXNvbi4KKyAgICAgICAgICovCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBxdWFsaWZ5Rm9yQ29tcGFyaXNvbihmaW5hbCBFbGVtZW50IGNvbnRyb2wsIGZpbmFsIEVsZW1lbnQgdGVzdCkgeworICAgICAgICAgICAgaWYgKHRlc3QgIT0gbnVsbCAmJiAhInBhcmFtIi5lcXVhbHModGVzdC5nZXROb2RlTmFtZSgpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5xdWFsaWZ5Rm9yQ29tcGFyaXNvbihjb250cm9sLCB0ZXN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghKGNvbnRyb2wgIT0gbnVsbCAmJiB0ZXN0ICE9IG51bGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZXF1YWxzTmFtZXNwYWNlKGNvbnRyb2wsIHRlc3QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGdldE5vbk5hbWVzcGFjZWROb2RlTmFtZShjb250cm9sKS5lcXVhbHMoZ2V0Tm9uTmFtZXNwYWNlZE5vZGVOYW1lKHRlc3QpKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29udHJvbC5oYXNBdHRyaWJ1dGUoIm5hbWUiKSAmJiB0ZXN0Lmhhc0F0dHJpYnV0ZSgibmFtZSIpKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wuZ2V0QXR0cmlidXRlKCJuYW1lIikuZXF1YWxzKHRlc3QuZ2V0QXR0cmlidXRlKCJuYW1lIikpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlZmVyZW5jZVJlc291cmNlQmVhblBhcmFtLmNsYXNzLCBUZXN0UmVzb3VyY2VCZWFuUGFyYW0uY2xhc3MsCisgICAgICAgICAgICAgICAgVGVzdFJlc291cmNlQ29uc3RydWN0b3JJbml0aWFsaXplZEJlYW5QYXJhbS5jbGFzcywgVGVzdFJlc291cmNlRmllbGRCZWFuUGFyYW0uY2xhc3MpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIG5vZGVBc1N0cmluZyhmaW5hbCBPYmplY3QgcmVzb3VyY2VOb2RlKSB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7CisgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKChOb2RlKSByZXNvdXJjZU5vZGUpLCBuZXcgU3RyZWFtUmVzdWx0KHdyaXRlcikpOworICAgICAgICByZXR1cm4gd3JpdGVyLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgd2hldGhlciBjbGFzcyB3aXRoIHtAY29kZSAqUGFyYW19IGFubm90YXRlZCBmaWVsZHMgaWYgdXNlZCBhcyBhIHtAY29kZSBCZWFuUGFyYW19IGFubm90YXRlZCByZXNvdXJjZSBtZXRob2QgcGFyYW1ldGVyCisgICAgICogcmVzdWx0cyBpbiBhIGNvcnJlY3RseSBnZW5lcmF0ZWQgV0FETC4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIEluIGNhc2Ugb2YgYW55IHByb2JsZW0uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmVhblBhcmFtRnVsbEJlYW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdEJlYW5QYXJhbUNvbnN0cnVjdG9ySW5pdGlhbGl6ZWRCZWFuKCJ3YWRsQmVhblBhcmFtVGVzdCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHdoZXRoZXIgY2xhc3Mgd2l0aCB7QGNvZGUgKlBhcmFtfSBhbm5vdGF0ZWQgY29uc3RydWN0b3IgcGFyYW1ldGVycyBpZiB1c2VkIGFzIGEge0Bjb2RlIEJlYW5QYXJhbX0gYW5ub3RhdGVkIHJlc291cmNlCisgICAgICogbWV0aG9kIHBhcmFtZXRlciByZXN1bHRzIGluIGEgY29ycmVjdGx5IGdlbmVyYXRlZCBXQURMLgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24gSW4gY2FzZSBvZiBhbnkgcHJvYmxlbS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCZWFuUGFyYW1Db25zdHJ1Y3RvckluaXRpYWxpemVkQmVhbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0QmVhblBhcmFtQ29uc3RydWN0b3JJbml0aWFsaXplZEJlYW4oIndhZGxCZWFuUGFyYW1Db25zdHJ1Y3RvckluaXRpYWxpemVkVGVzdCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHdoZXRoZXIgY2xhc3Mgd2l0aCB7QGNvZGUgKlBhcmFtfSBhbm5vdGF0ZWQgY29uc3RydWN0b3IgcGFyYW1ldGVycyBpZiB1c2VkIGFzIGEge0Bjb2RlIEJlYW5QYXJhbX0gYW5ub3RhdGVkIHJlc291cmNlCisgICAgICogY2xhc3MgZmllbGQgcGFyYW1ldGVyIHJlc3VsdHMgaW4gYSBjb3JyZWN0bHkgZ2VuZXJhdGVkIFdBREwuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBJbiBjYXNlIG9mIGFueSBwcm9ibGVtLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJlYW5QYXJhbUZpZWxkQmVhbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0QmVhblBhcmFtQ29uc3RydWN0b3JJbml0aWFsaXplZEJlYW4oIndhZGxCZWFuUGFyYW1GaWVsZFRlc3QiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdEJlYW5QYXJhbUNvbnN0cnVjdG9ySW5pdGlhbGl6ZWRCZWFuKFN0cmluZyByZXNvdXJjZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCIvYXBwbGljYXRpb24ud2FkbCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgZmluYWwgRG9jdW1lbnQgZCA9IFdhZGxSZXNvdXJjZVRlc3QuZXh0cmFjdFdhZGxBc0RvY3VtZW50KHJlc3BvbnNlKTsKKyAgICAgICAgZmluYWwgWFBhdGggeHAgPSBYUGF0aEZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdYUGF0aCgpOworICAgICAgICBmaW5hbCBTaW1wbGVOYW1lc3BhY2VSZXNvbHZlciBuc0NvbnRleHQgPSBuZXcgU2ltcGxlTmFtZXNwYWNlUmVzb2x2ZXIoIndhZGwiLCAiaHR0cDovL3dhZGwuZGV2LmphdmEubmV0LzIwMDkvMDIiKTsKKyAgICAgICAgeHAuc2V0TmFtZXNwYWNlQ29udGV4dChuc0NvbnRleHQpOworCisgICAgICAgIGZpbmFsIERpZmYgZGlmZiA9IFhNTFVuaXQuY29tcGFyZVhNTCgKKyAgICAgICAgICAgICAgICBub2RlQXNTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICB4cC5ldmFsdWF0ZSgiLy93YWRsOnJlc291cmNlW0BwYXRoPSd3YWRsQmVhblBhcmFtUmVmZXJlbmNlJ10vd2FkbDpyZXNvdXJjZSIsIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhQYXRoQ29uc3RhbnRzLk5PREUpKSwKKyAgICAgICAgICAgICAgICBub2RlQXNTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICB4cC5ldmFsdWF0ZSgiLy93YWRsOnJlc291cmNlW0BwYXRoPSciICsgcmVzb3VyY2UgKyAiJ10vd2FkbDpyZXNvdXJjZSIsIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhQYXRoQ29uc3RhbnRzLk5PREUpKQorICAgICAgICApOworICAgICAgICBYTUxVbml0LnNldFhwYXRoTmFtZXNwYWNlQ29udGV4dCgKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlTmFtZXNwYWNlQ29udGV4dChJbW11dGFibGVNYXAub2YoIndhZGwiLCAiaHR0cDovL3dhZGwuZGV2LmphdmEubmV0LzIwMDkvMDIiKSkpOworICAgICAgICBkaWZmLm92ZXJyaWRlRWxlbWVudFF1YWxpZmllcihlbGVtZW50UXVhbGlmaWVyKTsKKyAgICAgICAgWE1MQXNzZXJ0LmFzc2VydFhNTEVxdWFsKGRpZmYsIHRydWUpOworICAgIH0KKworICAgIEBQYXRoKCJ3YWRsQmVhblBhcmFtUmVmZXJlbmNlIikKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSZWZlcmVuY2VSZXNvdXJjZUJlYW5QYXJhbSB7CisKKyAgICAgICAgQFF1ZXJ5UGFyYW0oImNsYXNzRmllbGRRdWVyeVBhcmFtIikKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NGaWVsZFF1ZXJ5UGFyYW07CisKKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgIC8vIGZvbGxvd2luZyBmaWVsZHMgbWFrZSB0aGlzIGNsYXNzIGNvbXBhdGlibGUgd2l0aCAnRnVsbEJlYW4nLCAvLworICAgICAgICAvLyAnQ29uc3RydWN0b3JJbml0aWFsaXplZEJlYW4nIGFuZCAnU21hbGxCZWFuJyAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgQEhlYWRlclBhcmFtKCJoZWFkZXIiKQorICAgICAgICBwcml2YXRlIFN0cmluZyBoZWFkZXJQYXJhbTsKKworICAgICAgICBATWF0cml4UGFyYW0oIm1hdHJpeCIpCisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1hdHJpeFBhcmFtOworCisgICAgICAgIEBFbmNvZGVkCisgICAgICAgIEBRdWVyeVBhcmFtKCJxdWVyeSIpCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHF1ZXJ5UGFyYW07CisKKyAgICAgICAgQENvb2tpZVBhcmFtKCJjb29raWUiKQorICAgICAgICBwcml2YXRlIFN0cmluZyBjb29raWU7CisKKyAgICAgICAgQEZvcm1QYXJhbSgiZm9ybSIpCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGZvcm1QYXJhbTsKKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgic2luZ2xlQmVhbi97cGF0aH0iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3RCZWFuUGFyYW0oLyogcGF0aFBhcmFtIGlzIGFsc28gZXh0cmFjdGVkIGZyb20gRnVsbEJlYW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBQYXRoUGFyYW0oInBhdGgiKSBTdHJpbmcgcGF0aFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQFF1ZXJ5UGFyYW0oIm1ldGhvZFBhcmFtIikgaW50IG1ldGhvZFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQEhlYWRlclBhcmFtKCJoZWFkZXIiKSBTdHJpbmcgZHVwbGljYXRlSGVhZGVyUGFyYW0pIHsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgQFBhdGgoIndhZGxCZWFuUGFyYW1UZXN0IikKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUZXN0UmVzb3VyY2VCZWFuUGFyYW0geworCisgICAgICAgIEBRdWVyeVBhcmFtKCJjbGFzc0ZpZWxkUXVlcnlQYXJhbSIpCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzRmllbGRRdWVyeVBhcmFtOworCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJzaW5nbGVCZWFuL3twYXRofSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdEJlYW5QYXJhbShAQmVhblBhcmFtIFdhZGxGdWxsQmVhbiBiZWFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQEJlYW5QYXJhbSBXYWRsU21hbGxCZWFuIHdhZGxTbWFsbEJlYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAUXVlcnlQYXJhbSgibWV0aG9kUGFyYW0iKSBpbnQgbWV0aG9kUGFyYW0pIHsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgQFBhdGgoIndhZGxCZWFuUGFyYW1Db25zdHJ1Y3RvckluaXRpYWxpemVkVGVzdCIpCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGVzdFJlc291cmNlQ29uc3RydWN0b3JJbml0aWFsaXplZEJlYW5QYXJhbSB7CisKKyAgICAgICAgQFF1ZXJ5UGFyYW0oImNsYXNzRmllbGRRdWVyeVBhcmFtIikKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgY2xhc3NGaWVsZFF1ZXJ5UGFyYW07CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoInNpbmdsZUJlYW4ve3BhdGh9IikKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0QmVhblBhcmFtKEBCZWFuUGFyYW0gV2FkbENvbnN0cnVjdG9ySW5pdGlhbGl6ZWRCZWFuIGJlYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAQmVhblBhcmFtIFdhZGxTbWFsbEJlYW4gd2FkbFNtYWxsQmVhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBRdWVyeVBhcmFtKCJtZXRob2RQYXJhbSIpIGludCBtZXRob2RQYXJhbSkgeworICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAUGF0aCgid2FkbEJlYW5QYXJhbUZpZWxkVGVzdCIpCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGVzdFJlc291cmNlRmllbGRCZWFuUGFyYW0geworCisgICAgICAgIEBRdWVyeVBhcmFtKCJjbGFzc0ZpZWxkUXVlcnlQYXJhbSIpCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGNsYXNzRmllbGRRdWVyeVBhcmFtOworCisgICAgICAgIEBCZWFuUGFyYW0KKyAgICAgICAgcHJpdmF0ZSBXYWRsQ29uc3RydWN0b3JJbml0aWFsaXplZEJlYW4gYmVhbjsKKworICAgICAgICBAQmVhblBhcmFtCisgICAgICAgIHByaXZhdGUgV2FkbFNtYWxsQmVhbiB3YWRsU21hbGxCZWFuOworCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJzaW5nbGVCZWFuL3twYXRofSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdEJlYW5QYXJhbShAUXVlcnlQYXJhbSgibWV0aG9kUGFyYW0iKSBpbnQgbWV0aG9kUGFyYW0pIHsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIHB1cnBvc2Ugb2YgdGhpcyB1bmtub3duIGFubm90YXRpb24gaXMgdG8gdmVyaWZ5IHRoYXQgYSB1c2FnZSBvZiBhbiB1bmtub3duIGFubm90YXRpb24gaW4gYSB7QGxpbmsgQmVhblBhcmFtfSBhbm5vdGF0ZWQKKyAgICAgKiBjbGFzcyBkb2VzIG5vdCBjYXVzZSBhIGZhaWx1cmUgZHVyaW5nIFdBREwgZ2VuZXJhdGlvbi4KKyAgICAgKi8KKyAgICBAVGFyZ2V0KHtFbGVtZW50VHlwZS5QQVJBTUVURVIsIEVsZW1lbnRUeXBlLk1FVEhPRCwgRWxlbWVudFR5cGUuRklFTER9KQorICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCisgICAgQERvY3VtZW50ZWQKKyAgICBAaW50ZXJmYWNlIFdhZGxVbmtub3duQW5ub3RhdGlvbiB7CisKKyAgICAgICAgU3RyaW5nIHZhbHVlKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBXYWRsU21hbGxCZWFuIHsKKworICAgICAgICBASGVhZGVyUGFyYW0oImhlYWRlciIpCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGhlYWRlclBhcmFtOworCisgICAgICAgIEBQYXRoUGFyYW0oInBhdGgiKQorICAgICAgICBwcml2YXRlIFN0cmluZyBwYXRoUGFyYW07CisKKyAgICAgICAgcHVibGljIFdhZGxTbWFsbEJlYW4oV2FkbEZ1bGxCZWFuIGJlYW4pIHsKKyAgICAgICAgICAgIGhlYWRlclBhcmFtID0gYmVhbi5nZXRIZWFkZXJQYXJhbSgpOworICAgICAgICAgICAgcGF0aFBhcmFtID0gYmVhbi5nZXRQYXRoUGFyYW0oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgV2FkbEVuY29kZWRCZWFuIHsKKworICAgICAgICBATWF0cml4UGFyYW0oIm1hdHJpeCIpCisgICAgICAgIHByaXZhdGUgU3RyaW5nIG1hdHJpeFBhcmFtOworCisgICAgICAgIEBFbmNvZGVkCisgICAgICAgIEBRdWVyeVBhcmFtKCJxdWVyeSIpCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHF1ZXJ5UGFyYW07CisKKyAgICAgICAgcHVibGljIFdhZGxFbmNvZGVkQmVhbihTdHJpbmcgbWF0cml4UGFyYW0sIFN0cmluZyBxdWVyeVBhcmFtKSB7CisgICAgICAgICAgICB0aGlzLm1hdHJpeFBhcmFtID0gbWF0cml4UGFyYW07CisgICAgICAgICAgICB0aGlzLnF1ZXJ5UGFyYW0gPSBxdWVyeVBhcmFtOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFdhZGxGdWxsQmVhbiB7CisKKyAgICAgICAgQEhlYWRlclBhcmFtKCJoZWFkZXIiKQorICAgICAgICBwcml2YXRlIFN0cmluZyBoZWFkZXJQYXJhbTsKKworICAgICAgICBAUGF0aFBhcmFtKCJwYXRoIikKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcGF0aFBhcmFtOworCisgICAgICAgIEBNYXRyaXhQYXJhbSgibWF0cml4IikKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbWF0cml4UGFyYW07CisKKyAgICAgICAgQFF1ZXJ5UGFyYW0oInF1ZXJ5IikKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcXVlcnlQYXJhbTsKKworICAgICAgICBAQ29va2llUGFyYW0oImNvb2tpZSIpCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGNvb2tpZTsKKworICAgICAgICBARm9ybVBhcmFtKCJmb3JtIikKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZm9ybVBhcmFtOworCisgICAgICAgIEBXYWRsVW5rbm93bkFubm90YXRpb24oInVua25vd24iKQorICAgICAgICBwcml2YXRlIFN0cmluZyB1bmtub3duQW5ub3RhdGlvblBhcmFtOworCisgICAgICAgIEBDb250ZXh0CisgICAgICAgIHByaXZhdGUgUmVxdWVzdCByZXF1ZXN0OworCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBvdmVycmlkZVJlcXVlc3ROdWxsOworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29va2llKCkgeworICAgICAgICAgICAgcmV0dXJuIGNvb2tpZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldENvb2tpZShTdHJpbmcgY29va2llKSB7CisgICAgICAgICAgICB0aGlzLmNvb2tpZSA9IGNvb2tpZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9ybVBhcmFtKCkgeworICAgICAgICAgICAgcmV0dXJuIGZvcm1QYXJhbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEZvcm1QYXJhbShTdHJpbmcgZm9ybVBhcmFtKSB7CisgICAgICAgICAgICB0aGlzLmZvcm1QYXJhbSA9IGZvcm1QYXJhbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SGVhZGVyUGFyYW0oKSB7CisgICAgICAgICAgICByZXR1cm4gaGVhZGVyUGFyYW07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRIZWFkZXJQYXJhbShTdHJpbmcgaGVhZGVyUGFyYW0pIHsKKyAgICAgICAgICAgIHRoaXMuaGVhZGVyUGFyYW0gPSBoZWFkZXJQYXJhbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWF0cml4UGFyYW0oKSB7CisgICAgICAgICAgICByZXR1cm4gbWF0cml4UGFyYW07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRNYXRyaXhQYXJhbShTdHJpbmcgbWF0cml4UGFyYW0pIHsKKyAgICAgICAgICAgIHRoaXMubWF0cml4UGFyYW0gPSBtYXRyaXhQYXJhbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aFBhcmFtKCkgeworICAgICAgICAgICAgcmV0dXJuIHBhdGhQYXJhbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFBhdGhQYXJhbShTdHJpbmcgcGF0aFBhcmFtKSB7CisgICAgICAgICAgICB0aGlzLnBhdGhQYXJhbSA9IHBhdGhQYXJhbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UXVlcnlQYXJhbSgpIHsKKyAgICAgICAgICAgIHJldHVybiBxdWVyeVBhcmFtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UXVlcnlQYXJhbShTdHJpbmcgcXVlcnlQYXJhbSkgeworICAgICAgICAgICAgdGhpcy5xdWVyeVBhcmFtID0gcXVlcnlQYXJhbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBSZXF1ZXN0IGdldFJlcXVlc3QoKSB7CisgICAgICAgICAgICByZXR1cm4gcmVxdWVzdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNPdmVycmlkZVJlcXVlc3ROdWxsKCkgeworICAgICAgICAgICAgcmV0dXJuIG92ZXJyaWRlUmVxdWVzdE51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRPdmVycmlkZVJlcXVlc3ROdWxsKGJvb2xlYW4gb3ZlcnJpZGVSZXF1ZXN0TnVsbCkgeworICAgICAgICAgICAgdGhpcy5vdmVycmlkZVJlcXVlc3ROdWxsID0gb3ZlcnJpZGVSZXF1ZXN0TnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VW5rbm93bkFubm90YXRpb25QYXJhbSgpIHsKKyAgICAgICAgICAgIHJldHVybiB1bmtub3duQW5ub3RhdGlvblBhcmFtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VW5rbm93bkFubm90YXRpb25QYXJhbShTdHJpbmcgdW5rbm93bkFubm90YXRpb25QYXJhbSkgeworICAgICAgICAgICAgdGhpcy51bmtub3duQW5ub3RhdGlvblBhcmFtID0gdW5rbm93bkFubm90YXRpb25QYXJhbTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgV2FkbENvbnN0cnVjdG9ySW5pdGlhbGl6ZWRCZWFuIHsKKworICAgICAgICBwcml2YXRlIFN0cmluZyBoZWFkZXJQYXJhbTsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcGF0aFBhcmFtOworICAgICAgICBwcml2YXRlIFN0cmluZyBtYXRyaXhQYXJhbTsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcXVlcnlQYXJhbTsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgY29va2llOworICAgICAgICBwcml2YXRlIFN0cmluZyBmb3JtUGFyYW07CisgICAgICAgIHByaXZhdGUgU3RyaW5nIHVua25vd25Bbm5vdGF0aW9uUGFyYW07CisgICAgICAgIHByaXZhdGUgUmVxdWVzdCByZXF1ZXN0OworCisgICAgICAgIHB1YmxpYyBXYWRsQ29uc3RydWN0b3JJbml0aWFsaXplZEJlYW4oQENvb2tpZVBhcmFtKCJjb29raWUiKSBTdHJpbmcgY29va2llLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBGb3JtUGFyYW0oImZvcm0iKSBTdHJpbmcgZm9ybVBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBIZWFkZXJQYXJhbSgiaGVhZGVyIikgU3RyaW5nIGhlYWRlclBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBNYXRyaXhQYXJhbSgibWF0cml4IikgU3RyaW5nIG1hdHJpeFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBRdWVyeVBhcmFtKCJxdWVyeSIpIFN0cmluZyBxdWVyeVBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBQYXRoUGFyYW0oInBhdGgiKSBTdHJpbmcgcGF0aFBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBXYWRsVW5rbm93bkFubm90YXRpb24oInVua25vd24iKSBTdHJpbmcgdW5rbm93bkFubm90YXRpb25QYXJhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAQ29udGV4dCBSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgICAgIHRoaXMuY29va2llID0gY29va2llOworICAgICAgICAgICAgdGhpcy5mb3JtUGFyYW0gPSBmb3JtUGFyYW07CisgICAgICAgICAgICB0aGlzLmhlYWRlclBhcmFtID0gaGVhZGVyUGFyYW07CisgICAgICAgICAgICB0aGlzLm1hdHJpeFBhcmFtID0gbWF0cml4UGFyYW07CisgICAgICAgICAgICB0aGlzLnF1ZXJ5UGFyYW0gPSBxdWVyeVBhcmFtOworICAgICAgICAgICAgdGhpcy5wYXRoUGFyYW0gPSBwYXRoUGFyYW07CisgICAgICAgICAgICB0aGlzLnVua25vd25Bbm5vdGF0aW9uUGFyYW0gPSB1bmtub3duQW5ub3RhdGlvblBhcmFtOworICAgICAgICAgICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgYm9vbGVhbiBvdmVycmlkZVJlcXVlc3ROdWxsOworCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29va2llKCkgeworICAgICAgICAgICAgcmV0dXJuIGNvb2tpZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldENvb2tpZShTdHJpbmcgY29va2llKSB7CisgICAgICAgICAgICB0aGlzLmNvb2tpZSA9IGNvb2tpZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Rm9ybVBhcmFtKCkgeworICAgICAgICAgICAgcmV0dXJuIGZvcm1QYXJhbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEZvcm1QYXJhbShTdHJpbmcgZm9ybVBhcmFtKSB7CisgICAgICAgICAgICB0aGlzLmZvcm1QYXJhbSA9IGZvcm1QYXJhbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SGVhZGVyUGFyYW0oKSB7CisgICAgICAgICAgICByZXR1cm4gaGVhZGVyUGFyYW07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRIZWFkZXJQYXJhbShTdHJpbmcgaGVhZGVyUGFyYW0pIHsKKyAgICAgICAgICAgIHRoaXMuaGVhZGVyUGFyYW0gPSBoZWFkZXJQYXJhbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWF0cml4UGFyYW0oKSB7CisgICAgICAgICAgICByZXR1cm4gbWF0cml4UGFyYW07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRNYXRyaXhQYXJhbShTdHJpbmcgbWF0cml4UGFyYW0pIHsKKyAgICAgICAgICAgIHRoaXMubWF0cml4UGFyYW0gPSBtYXRyaXhQYXJhbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aFBhcmFtKCkgeworICAgICAgICAgICAgcmV0dXJuIHBhdGhQYXJhbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFBhdGhQYXJhbShTdHJpbmcgcGF0aFBhcmFtKSB7CisgICAgICAgICAgICB0aGlzLnBhdGhQYXJhbSA9IHBhdGhQYXJhbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UXVlcnlQYXJhbSgpIHsKKyAgICAgICAgICAgIHJldHVybiBxdWVyeVBhcmFtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0UXVlcnlQYXJhbShTdHJpbmcgcXVlcnlQYXJhbSkgeworICAgICAgICAgICAgdGhpcy5xdWVyeVBhcmFtID0gcXVlcnlQYXJhbTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBSZXF1ZXN0IGdldFJlcXVlc3QoKSB7CisgICAgICAgICAgICByZXR1cm4gcmVxdWVzdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFJlcXVlc3QoUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNPdmVycmlkZVJlcXVlc3ROdWxsKCkgeworICAgICAgICAgICAgcmV0dXJuIG92ZXJyaWRlUmVxdWVzdE51bGw7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRPdmVycmlkZVJlcXVlc3ROdWxsKGJvb2xlYW4gb3ZlcnJpZGVSZXF1ZXN0TnVsbCkgeworICAgICAgICAgICAgdGhpcy5vdmVycmlkZVJlcXVlc3ROdWxsID0gb3ZlcnJpZGVSZXF1ZXN0TnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VW5rbm93bkFubm90YXRpb25QYXJhbSgpIHsKKyAgICAgICAgICAgIHJldHVybiB1bmtub3duQW5ub3RhdGlvblBhcmFtOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VW5rbm93bkFubm90YXRpb25QYXJhbShTdHJpbmcgdW5rbm93bkFubm90YXRpb25QYXJhbSkgeworICAgICAgICAgICAgdGhpcy51bmtub3duQW5ub3RhdGlvblBhcmFtID0gdW5rbm93bkFubm90YXRpb25QYXJhbTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3dhZGwvV2FkbEVtcHR5TWVkaWFUeXBlVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvd2FkbC9XYWRsRW1wdHlNZWRpYVR5cGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg1YzIwYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3dhZGwvV2FkbEVtcHR5TWVkaWFUeXBlVGVzdC5qYXZhCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci53YWRsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGg7CitpbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoRXhwcmVzc2lvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGhGYWN0b3J5OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OworaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOworaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdHMsIHRoYXQgSmVyc2V5IHJldHVybnMgd2lsZGNhcmQgbWVkaWFUeXBlIGluIGNhc2Ugbm8gcmVzcG9uc2UgcmVwcmVzZW50YXRpb24gd2FzIHNwZWNpZmllZC4KKyAqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBXYWRsRW1wdHlNZWRpYVR5cGVUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAUGF0aCgidGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBXYWRsRW1wdHlNZWRpYVR5cGVUZXN0UmVzb3VyY2UgeworICAgICAgICBAUGF0aCgiZ2V0RW1wdHkiKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW1wdHkoKSB7CisgICAgICAgICAgICByZXR1cm4gIk5vIEBQcm9kdWNlcyBhbm5vdGF0aW9uIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJnZXRUZXh0IikKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRleHQoKSB7CisgICAgICAgICAgICByZXR1cm4gIlByb2R1Y2VzIHRleHQvcGxhaW4iOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhXYWRsRW1wdHlNZWRpYVR5cGVUZXN0UmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE92ZXJyaWRlKCkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIFhQYXRoRXhwcmVzc2lvbkV4Y2VwdGlvbiB7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoIi9hcHBsaWNhdGlvbi53YWRsIik7CisgICAgICAgIFN0cmluZyB3YWRsID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBJbnB1dFNvdXJjZSBpcyA9IG5ldyBJbnB1dFNvdXJjZShuZXcgU3RyaW5nUmVhZGVyKHdhZGwpKTsKKyAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3RG9jdW1lbnRCdWlsZGVyKCkucGFyc2UoaXMpOworCisgICAgICAgIFhQYXRoIHhwYXRoID0gWFBhdGhGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3WFBhdGgoKTsKKyAgICAgICAgU3RyaW5nIHZhbCA9IHhwYXRoLmV2YWx1YXRlKCIvL21ldGhvZFtAaWQ9J2dldEVtcHR5J10vcmVzcG9uc2UvcmVwcmVzZW50YXRpb24vQG1lZGlhVHlwZSIsIGRvY3VtZW50KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqLyoiLCB2YWwpOworCisgICAgICAgIHZhbCA9IHhwYXRoLmV2YWx1YXRlKCIvL21ldGhvZFtAaWQ9J2dldFRleHQnXS9yZXNwb25zZS9yZXByZXNlbnRhdGlvbi9AbWVkaWFUeXBlIiwgZG9jdW1lbnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQvcGxhaW4iLCB2YWwpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3dhZGwvV2FkbFJlc291cmNlVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvd2FkbC9XYWRsUmVzb3VyY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUyMTE1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL3dhZGwvV2FkbFJlc291cmNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTMxMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLndhZGw7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uSW5oZXJpdGVkOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkRFTEVURTsKK2ltcG9ydCBqYXZheC53cy5ycy5Gb3JtUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLkhlYWRlclBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLk1hdHJpeFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUFVUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRm9ybTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKKworaW1wb3J0IGphdmF4LmluamVjdC5OYW1lZDsKK2ltcG9ydCBqYXZheC54bWwuWE1MQ29uc3RhbnRzOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuRG9jdW1lbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLk91dHB1dEtleXM7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uZG9tLkRPTVNvdXJjZTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7CitpbXBvcnQgamF2YXgueG1sLnhwYXRoLlhQYXRoOworaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aENvbnN0YW50czsKK2ltcG9ydCBqYXZheC54bWwueHBhdGguWFBhdGhFeHByZXNzaW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnhtbC54cGF0aC5YUGF0aEZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5NYXBQcm9wZXJ0aWVzRGVsZWdhdGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5TYXhIZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5TaW1wbGVOYW1lc3BhY2VSZXNvbHZlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5NZWRpYVR5cGVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5XYWRsQXBwbGljYXRpb25Db250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci53YWRsLldhZGxHZW5lcmF0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuY29uZmlnLldhZGxHZW5lcmF0b3JDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLndhZGwuY29uZmlnLldhZGxHZW5lcmF0b3JEZXNjcmlwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5pbnRlcm5hbC5XYWRsR2VuZXJhdG9ySW1wbDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIud2FkbC5pbnRlcm5hbC5XYWRsVXRpbHM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuY3VzdG9tbW9ua2V5LnhtbHVuaXQuRGlmZjsKK2ltcG9ydCBvcmcuY3VzdG9tbW9ua2V5LnhtbHVuaXQuRWxlbWVudFF1YWxpZmllcjsKK2ltcG9ydCBvcmcuY3VzdG9tbW9ua2V5LnhtbHVuaXQuU2ltcGxlTmFtZXNwYWNlQ29udGV4dDsKK2ltcG9ydCBvcmcuY3VzdG9tbW9ua2V5LnhtbHVuaXQuWE1MQXNzZXJ0OworaW1wb3J0IG9yZy5jdXN0b21tb25rZXkueG1sdW5pdC5YTUxVbml0OworaW1wb3J0IG9yZy5jdXN0b21tb25rZXkueG1sdW5pdC5leGFtcGxlcy5SZWN1cnNpdmVFbGVtZW50TmFtZUFuZFRleHRRdWFsaWZpZXI7CitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuU3VpdGU7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnczYy5kb20uTmFtZWROb2RlTWFwOworaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7CitpbXBvcnQgb3JnLnczYy5kb20uTm9kZUxpc3Q7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMubm90TnVsbFZhbHVlOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uY29sbGVjdC5JbW11dGFibGVNYXA7CisKK2ltcG9ydCBjb20uc3VuLnJlc2VhcmNoLndzLndhZGwuTWV0aG9kOworaW1wb3J0IGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5QYXJhbTsKK2ltcG9ydCBjb20uc3VuLnJlc2VhcmNoLndzLndhZGwuUmVxdWVzdDsKK2ltcG9ydCBjb20uc3VuLnJlc2VhcmNoLndzLndhZGwuUmVzb3VyY2U7CitpbXBvcnQgY29tLnN1bi5yZXNlYXJjaC53cy53YWRsLlJlc291cmNlczsKKworLyoqCisgKiBXQURMIHVzZSBjYXNlIHRlc3RzLgorICoKKyAqIEBhdXRob3IgTWFyYyBIYWRsZXkKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSdW5XaXRoKFN1aXRlLmNsYXNzKQorQFN1aXRlLlN1aXRlQ2xhc3Nlcyh7CisgICAgICAgIFdhZGxSZXNvdXJjZVRlc3QuV2FkbDFUZXN0LmNsYXNzLAorICAgICAgICBXYWRsUmVzb3VyY2VUZXN0LldhZGwyVGVzdC5jbGFzcywKKyAgICAgICAgV2FkbFJlc291cmNlVGVzdC5XYWRsM1Rlc3QuY2xhc3MsCisgICAgICAgIFdhZGxSZXNvdXJjZVRlc3QuV2FkbDRUZXN0LmNsYXNzLAorICAgICAgICBXYWRsUmVzb3VyY2VUZXN0LldhZGw1VGVzdC5jbGFzcywKKyAgICAgICAgV2FkbFJlc291cmNlVGVzdC5XYWRsNlRlc3QuY2xhc3MsCisgICAgICAgIFdhZGxSZXNvdXJjZVRlc3QuV2FkbDdUZXN0LmNsYXNzLAorICAgICAgICBXYWRsUmVzb3VyY2VUZXN0LldhZGw4VGVzdC5jbGFzcywKKyAgICAgICAgV2FkbFJlc291cmNlVGVzdC5XYWRsOVRlc3QuY2xhc3MsCisgICAgICAgIFdhZGxSZXNvdXJjZVRlc3QuV2FkbDEwVGVzdC5jbGFzcywKKyAgICAgICAgV2FkbFJlc291cmNlVGVzdC5XYWRsMTFUZXN0LmNsYXNzLAorfSkKK3B1YmxpYyBjbGFzcyBXYWRsUmVzb3VyY2VUZXN0IHsKKworICAgIC8qKgorICAgICAqIEV4dHJhY3RzIFdBREwgYXMge0BsaW5rIERvY3VtZW50fSBmcm9tIGdpdmVuIHtAbGluayBSZXNwb25zZX0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzcG9uc2UgVGhlIHJlc3BvbnNlIHRvIGV4dHJhY3Qge0Bjb2RlIERvY3VtZW50fSBmcm9tLgorICAgICAqIEByZXR1cm4gVGhlIGV4dHJhY3RlZCB7QGNvZGUgRG9jdW1lbnR9LgorICAgICAqIEB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBJbiBjYXNlIG9mIHBhcnNlciBjb25maWd1cmF0aW9uIGlzc3Vlcy4KKyAgICAgKiBAdGhyb3dzIFNBWEV4Y2VwdGlvbiAgICAgICAgICAgICAgICAgSW4gY2FzZSBvZiBwYXJzaW5nIGlzc3Vlcy4KKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uICAgICAgICAgICAgICAgICAgSW4gY2FzZSBvZiBJTyBlcnJvci4KKyAgICAgKi8KKyAgICBzdGF0aWMgRG9jdW1lbnQgZXh0cmFjdFdhZGxBc0RvY3VtZW50KGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLAorICAgICAgICAgICAgSU9FeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGZpbmFsIEZpbGUgdG1wRmlsZSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoRmlsZS5jbGFzcyk7CisgICAgICAgIGZpbmFsIERvY3VtZW50QnVpbGRlckZhY3RvcnkgYmYgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgIGJmLnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOworICAgICAgICBiZi5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKKyAgICAgICAgaWYgKCFTYXhIZWxwZXIuaXNYZGtEb2N1bWVudEJ1aWxkZXJGYWN0b3J5KGJmKSkgeworICAgICAgICAgICAgYmYuc2V0WEluY2x1ZGVBd2FyZShmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgRG9jdW1lbnRCdWlsZGVyIGIgPSBiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICAgICAgZmluYWwgRG9jdW1lbnQgZCA9IGIucGFyc2UodG1wRmlsZSk7CisgICAgICAgIFdhZGw1VGVzdC5wcmludFNvdXJjZShuZXcgRE9NU291cmNlKGQpKTsKKyAgICAgICAgcmV0dXJuIGQ7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIG5vZGVBc1N0cmluZyhmaW5hbCBPYmplY3QgcmVzb3VyY2VOb2RlKSB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24geworICAgICAgICBTdHJpbmdXcml0ZXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOworICAgICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1RyYW5zZm9ybWVyKCk7CisgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgRE9NU291cmNlKChOb2RlKSByZXNvdXJjZU5vZGUpLCBuZXcgU3RyZWFtUmVzdWx0KHdyaXRlcikpOworICAgICAgICByZXR1cm4gd3JpdGVyLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBXYWRsN1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoVGVzdFJvb3RSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgicm9vdCIpCisgICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFJvb3RSZXNvdXJjZSB7CisKKyAgICAgICAgICAgIEBQYXRoKCJ7dGVtcGxhdGV9IikKKyAgICAgICAgICAgIEBHRVQKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3ViKCkgeworICAgICAgICAgICAgICAgIHJldHVybiAiZ2V0IjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQEdFVAorICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJnZXRyb290IjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RQYXRoVGVtcGxhdGVJblN1YlJlc291cmNlTWV0aG9kKCkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sCisgICAgICAgICAgICAgICAgWFBhdGhFeHByZXNzaW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJyb290L2ZvbyIpLnJlcXVlc3QoTWVkaWFUeXBlcy5XQURMX1RZUEUpLm9wdGlvbnMoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RQYXRoVGVtcGxhdGVJblN1YlJlc291cmNlTWV0aG9kMigpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgIFhQYXRoRXhwcmVzc2lvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgicm9vdCIpLnJlcXVlc3QoTWVkaWFUeXBlcy5XQURMX1RZUEUpLm9wdGlvbnMoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgV2FkbDVUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFdpZGdldHNSZXNvdXJjZS5jbGFzcywgRXh0cmFSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiZm9vIikKKyAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeHRyYVJlc291cmNlIHsKKworICAgICAgICAgICAgQEdFVAorICAgICAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi94bWwiKQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRSZXAoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgid2lkZ2V0cyIpCisgICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgV2lkZ2V0c1Jlc291cmNlIHsKKworICAgICAgICAgICAgQEdFVAorICAgICAgICAgICAgQFByb2R1Y2VzKHsiYXBwbGljYXRpb24veG1sIiwgImFwcGxpY2F0aW9uL2pzb24ifSkKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0V2lkZ2V0cygpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQFBPU1QKKyAgICAgICAgICAgIEBDb25zdW1lcyh7ImFwcGxpY2F0aW9uL3htbCJ9KQorICAgICAgICAgICAgQFByb2R1Y2VzKHsiYXBwbGljYXRpb24veG1sIiwgImFwcGxpY2F0aW9uL2pzb24ifSkKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgY3JlYXRlV2lkZ2V0KGZpbmFsIFN0cmluZyBiYXIsIEBNYXRyaXhQYXJhbSgidGVzdCIpIGZpbmFsIFN0cmluZyB0ZXN0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJhcjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQFBVVAorICAgICAgICAgICAgQFBhdGgoIntpZH0iKQorICAgICAgICAgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi94bWwiKQorICAgICAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlV2lkZ2V0KGZpbmFsIFN0cmluZyBiYXIsIEBQYXRoUGFyYW0oImlkIikgZmluYWwgaW50IGlkKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBHRVQKKyAgICAgICAgICAgIEBQYXRoKCJ7aWR9IikKKyAgICAgICAgICAgIEBQcm9kdWNlcyh7ImFwcGxpY2F0aW9uL3htbCIsICJhcHBsaWNhdGlvbi9qc29uIn0pCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFdpZGdldChAUGF0aFBhcmFtKCJpZCIpIGZpbmFsIGludCBpZCkgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAREVMRVRFCisgICAgICAgICAgICBAUGF0aCgie2lkfSIpCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBkZWxldGVXaWRnZXQoQFBhdGhQYXJhbSgiaWQiKSBmaW5hbCBpbnQgaWQpIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQFBhdGgoIntpZH0vdmVyYm9zZSIpCisgICAgICAgICAgICBwdWJsaWMgRXh0cmFSZXNvdXJjZSBnZXRWZXJib3NlKEBQYXRoUGFyYW0oImlkIikgZmluYWwgaW50IGlkKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFeHRyYVJlc291cmNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0RGlzYWJsZVdhZGwoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByYyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhXaWRnZXRzUmVzb3VyY2UuY2xhc3MsIEV4dHJhUmVzb3VyY2UuY2xhc3MpOworICAgICAgICAgICAgcmMucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5XQURMX0ZFQVRVUkVfRElTQUJMRSwgdHJ1ZSk7CisKKyAgICAgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbkhhbmRsZXIgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKHJjKTsKKworICAgICAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgY29udGFpbmVyUmVzcG9uc2UgPSBhcHBsaWNhdGlvbkhhbmRsZXIuYXBwbHkobmV3IENvbnRhaW5lclJlcXVlc3QoCisgICAgICAgICAgICAgICAgICAgIFVSSS5jcmVhdGUoIi8iKSwgVVJJLmNyZWF0ZSgiL2FwcGxpY2F0aW9uLndhZGwiKSwKKyAgICAgICAgICAgICAgICAgICAgIkdFVCIsIG51bGwsIG5ldyBNYXBQcm9wZXJ0aWVzRGVsZWdhdGUoKSkpLmdldCgpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoNDA0LCBjb250YWluZXJSZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0RW5hYmxlV2FkbCgpIHRocm93cyBFeGVjdXRpb25FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJjID0gbmV3IFJlc291cmNlQ29uZmlnKFdpZGdldHNSZXNvdXJjZS5jbGFzcywgRXh0cmFSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgICAgICByYy5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLldBRExfRkVBVFVSRV9ESVNBQkxFLCBmYWxzZSk7CisKKyAgICAgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbkhhbmRsZXIgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKHJjKTsKKworICAgICAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgY29udGFpbmVyUmVzcG9uc2UgPSBhcHBsaWNhdGlvbkhhbmRsZXIuYXBwbHkobmV3IENvbnRhaW5lclJlcXVlc3QoCisgICAgICAgICAgICAgICAgICAgIFVSSS5jcmVhdGUoIi8iKSwgVVJJLmNyZWF0ZSgiL2FwcGxpY2F0aW9uLndhZGwiKSwKKyAgICAgICAgICAgICAgICAgICAgIkdFVCIsIG51bGwsIG5ldyBNYXBQcm9wZXJ0aWVzRGVsZWdhdGUoKSkpLmdldCgpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCBjb250YWluZXJSZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRTb3VyY2UoZmluYWwgU291cmNlIHNvdXJjZSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIi0tLS0tLS0tLS0tLS0tLS0tLS0tLSIpOworICAgICAgICAgICAgICAgIGZpbmFsIFRyYW5zZm9ybWVyIHRyYW5zID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3VHJhbnNmb3JtZXIoKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBQcm9wZXJ0aWVzIG9wcm9wcyA9IG5ldyBQcm9wZXJ0aWVzKCk7CisgICAgICAgICAgICAgICAgb3Byb3BzLnB1dChPdXRwdXRLZXlzLk9NSVRfWE1MX0RFQ0xBUkFUSU9OLCAieWVzIik7CisgICAgICAgICAgICAgICAgb3Byb3BzLnB1dChPdXRwdXRLZXlzLklOREVOVCwgInllcyIpOworICAgICAgICAgICAgICAgIG9wcm9wcy5wdXQoT3V0cHV0S2V5cy5NRVRIT0QsICJ4bWwiKTsKKyAgICAgICAgICAgICAgICB0cmFucy5zZXRPdXRwdXRQcm9wZXJ0aWVzKG9wcm9wcyk7CisgICAgICAgICAgICAgICAgdHJhbnMudHJhbnNmb3JtKHNvdXJjZSwgbmV3IFN0cmVhbVJlc3VsdChTeXN0ZW0ub3V0KSk7CisgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRYbWxTY2hlbWFOYW1lc3BhY2VQcmVmaXgoZmluYWwgTm9kZSBlbGVtZW50Tm9kZSkgeworICAgICAgICAgICAgZmluYWwgTmFtZWROb2RlTWFwIGF0dHJpYnV0ZXMgPSBlbGVtZW50Tm9kZS5nZXRBdHRyaWJ1dGVzKCk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5nZXRMZW5ndGgoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgZmluYWwgTm9kZSBpdGVtID0gYXR0cmlidXRlcy5pdGVtKGkpOworICAgICAgICAgICAgICAgIGlmIChYTUxDb25zdGFudHMuVzNDX1hNTF9TQ0hFTUFfTlNfVVJJLmVxdWFscyhpdGVtLmdldE5vZGVWYWx1ZSgpKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5nZXRMb2NhbE5hbWUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiAieHMiOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRlc3QgV0FETCBnZW5lcmF0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpbiBjYXNlIG9mIHVuZXhwZWN0ZWQgdGVzdCBmYWlsdXJlLgorICAgICAgICAgKi8KKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdEdldFdhZGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIEZpbGUgdG1wRmlsZSA9IHRhcmdldCgiYXBwbGljYXRpb24ud2FkbCIpLnF1ZXJ5UGFyYW0oV2FkbFV0aWxzLkRFVEFJTEVEX1dBRExfUVVFUllfUEFSQU0sICJ0cnVlIikKKyAgICAgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5nZXQoRmlsZS5jbGFzcyk7CisKKyAgICAgICAgICAgIGZpbmFsIERvY3VtZW50QnVpbGRlckZhY3RvcnkgYmYgPSBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7CisgICAgICAgICAgICBiZi5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKKyAgICAgICAgICAgIGJmLnNldFZhbGlkYXRpbmcoZmFsc2UpOworICAgICAgICAgICAgaWYgKCFTYXhIZWxwZXIuaXNYZGtEb2N1bWVudEJ1aWxkZXJGYWN0b3J5KGJmKSkgeworICAgICAgICAgICAgICAgIGJmLnNldFhJbmNsdWRlQXdhcmUoZmFsc2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgRG9jdW1lbnRCdWlsZGVyIGIgPSBiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICAgICAgICAgIGZpbmFsIERvY3VtZW50IGQgPSBiLnBhcnNlKHRtcEZpbGUpOworICAgICAgICAgICAgcHJpbnRTb3VyY2UobmV3IERPTVNvdXJjZShkKSk7CisgICAgICAgICAgICBmaW5hbCBYUGF0aCB4cCA9IFhQYXRoRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1hQYXRoKCk7CisgICAgICAgICAgICB4cC5zZXROYW1lc3BhY2VDb250ZXh0KG5ldyBTaW1wbGVOYW1lc3BhY2VSZXNvbHZlcigid2FkbCIsICJodHRwOi8vd2FkbC5kZXYuamF2YS5uZXQvMjAwOS8wMiIpKTsKKyAgICAgICAgICAgIC8vIGNoZWNrIGJhc2UgVVJJCisgICAgICAgICAgICBTdHJpbmcgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoIi93YWRsOmFwcGxpY2F0aW9uL3dhZGw6cmVzb3VyY2VzL0BiYXNlIiwgZCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh2YWwsIGdldEJhc2VVcmkoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIC8vIGNoZWNrIHRvdGFsIG51bWJlciBvZiByZXNvdXJjZXMgaXMgNAorICAgICAgICAgICAgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoImNvdW50KC8vd2FkbDpyZXNvdXJjZSkiLCBkLCBYUGF0aENvbnN0YW50cy5TVFJJTkcpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCI2IiwgdmFsKTsKKyAgICAgICAgICAgIC8vIGNoZWNrIG9ubHkgb25jZSByZXNvdXJjZSB3aXRoIGZvciB7aWR9CisgICAgICAgICAgICB2YWwgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZSgiY291bnQoLy93YWRsOnJlc291cmNlW0BwYXRoPSd7aWR9J10pIiwgZCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMSIsIHZhbCk7CisgICAgICAgICAgICAvLyBjaGVjayBvbmx5IG9uY2UgcmVzb3VyY2Ugd2l0aCBmb3Ige2lkfS92ZXJib3NlCisgICAgICAgICAgICB2YWwgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZSgiY291bnQoLy93YWRsOnJlc291cmNlW0BwYXRoPSd7aWR9L3ZlcmJvc2UnXSkiLCBkLCBYUGF0aENvbnN0YW50cy5TVFJJTkcpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgdmFsKTsKKyAgICAgICAgICAgIC8vIGNoZWNrIG9ubHkgb25jZSByZXNvdXJjZSB3aXRoIGZvciB3aWRnZXRzCisgICAgICAgICAgICB2YWwgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZSgiY291bnQoLy93YWRsOnJlc291cmNlW0BwYXRoPSd3aWRnZXRzJ10pIiwgZCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMSIsIHZhbCk7CisgICAgICAgICAgICAvLyBjaGVjayAzIG1ldGhvZHMgZm9yIHtpZH0KKyAgICAgICAgICAgIHZhbCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKCJjb3VudCgvL3dhZGw6cmVzb3VyY2VbQHBhdGg9J3tpZH0nXS93YWRsOm1ldGhvZCkiLCBkLCBYUGF0aENvbnN0YW50cy5TVFJJTkcpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCI2IiwgdmFsKTsKKyAgICAgICAgICAgIC8vIGNoZWNrIDIgbWV0aG9kcyBmb3Igd2lkZ2V0cworICAgICAgICAgICAgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoImNvdW50KC8vd2FkbDpyZXNvdXJjZVtAcGF0aD0nd2lkZ2V0cyddL3dhZGw6bWV0aG9kKSIsIGQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjUiLCB2YWwpOworICAgICAgICAgICAgLy8gY2hlY2sgMSBtYXRyaXggcGFyYW0gb24gcmVzb3VyY2UKKyAgICAgICAgICAgIHZhbCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKCJjb3VudCgvL3dhZGw6cmVzb3VyY2VbQHBhdGg9J3dpZGdldHMnXS93YWRsOnBhcmFtW0BuYW1lPSd0ZXN0J10pIiwgZCwKKyAgICAgICAgICAgICAgICAgICAgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMSIsIHZhbCk7CisgICAgICAgICAgICAvLyBjaGVjayB0eXBlIG9mIHtpZH0gaXMgaW50CisgICAgICAgICAgICBTdHJpbmcgcHJlZml4ID0gZ2V0WG1sU2NoZW1hTmFtZXNwYWNlUHJlZml4KAorICAgICAgICAgICAgICAgICAgICAoTm9kZSkgeHAuZXZhbHVhdGUoIi8vd2FkbDpyZXNvdXJjZVtAcGF0aD0ne2lkfSddL3dhZGw6cGFyYW1bQG5hbWU9J2lkJ10iLCBkLCBYUGF0aENvbnN0YW50cy5OT0RFKSk7CisgICAgICAgICAgICB2YWwgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZSgiLy93YWRsOnJlc291cmNlW0BwYXRoPSd7aWR9J10vd2FkbDpwYXJhbVtAbmFtZT0naWQnXS9AdHlwZSIsIGQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModmFsLCAocHJlZml4ID09IG51bGwgPyAiIiA6IHByZWZpeCArICI6IikgKyAiaW50Iik7CisgICAgICAgICAgICAvLyBjaGVjayBudW1iZXIgb2Ygb3V0cHV0IHJlcHJlc2VudGF0aW9ucyBpcyB0d28KKyAgICAgICAgICAgIHZhbCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKCJjb3VudCgvL3dhZGw6cmVzb3VyY2VbQHBhdGg9J3dpZGdldHMnXS93YWRsOm1ldGhvZFtAbmFtZT0nR0VUJ10vd2FkbDpyZXNwb25zZS93YWRsIgorICAgICAgICAgICAgICAgICAgICArICI6cmVwcmVzZW50YXRpb24pIiwgZCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMiIsIHZhbCk7CisgICAgICAgICAgICAvLyBjaGVjayBudW1iZXIgb2Ygb3V0cHV0IHJlcHJlc2VudGF0aW9ucyBpcyBvbmUKKyAgICAgICAgICAgIHZhbCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKCJjb3VudCgvL3dhZGw6cmVzb3VyY2VbQHBhdGg9J3dpZGdldHMnXS93YWRsOm1ldGhvZFtAbmFtZT0nUE9TVCddL3dhZGw6cmVxdWVzdC93YWRsIgorICAgICAgICAgICAgICAgICAgICArICI6cmVwcmVzZW50YXRpb24pIiwgZCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMSIsIHZhbCk7CisgICAgICAgICAgICAvLyBjaGVjayB0eXBlIG9mIHtpZH0vdmVyYm9zZSBpcyBpbnQKKyAgICAgICAgICAgIHByZWZpeCA9IGdldFhtbFNjaGVtYU5hbWVzcGFjZVByZWZpeCgKKyAgICAgICAgICAgICAgICAgICAgKE5vZGUpIHhwLmV2YWx1YXRlKCIvL3dhZGw6cmVzb3VyY2VbQHBhdGg9J3tpZH0vdmVyYm9zZSddL3dhZGw6cGFyYW1bQG5hbWU9J2lkJ10iLCBkLCBYUGF0aENvbnN0YW50cy5OT0RFKSk7CisgICAgICAgICAgICB2YWwgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZSgiLy93YWRsOnJlc291cmNlW0BwYXRoPSd7aWR9L3ZlcmJvc2UnXS93YWRsOnBhcmFtW0BuYW1lPSdpZCddL0B0eXBlIiwgZCwKKyAgICAgICAgICAgICAgICAgICAgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh2YWwsIChwcmVmaXggPT0gbnVsbCA/ICIiIDogcHJlZml4ICsgIjoiKSArICJpbnQiKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RMYXN0TW9kaWZpZWRHRVQoKSB7CisgICAgICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCIvYXBwbGljYXRpb24ud2FkbCIpOworCisgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByID0gdGFyZ2V0LnF1ZXJ5UGFyYW0oV2FkbFV0aWxzLkRFVEFJTEVEX1dBRExfUVVFUllfUEFSQU0sICJ0cnVlIikucmVxdWVzdCgpLmdldChSZXNwb25zZS5jbGFzcyk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKHIuZ2V0SGVhZGVycygpLmNvbnRhaW5zS2V5KCJMYXN0LW1vZGlmaWVkIikpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdExhc3RNb2RpZmllZE9QVElPTlMoKSB7CisgICAgICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCIvd2lkZ2V0cy8zL3ZlcmJvc2UiKTsKKworICAgICAgICAgICAgZmluYWwgUmVzcG9uc2UgciA9IHRhcmdldC5xdWVyeVBhcmFtKFdhZGxVdGlscy5ERVRBSUxFRF9XQURMX1FVRVJZX1BBUkFNLCAidHJ1ZSIpLnJlcXVlc3QoTWVkaWFUeXBlcy5XQURMX1RZUEUpCisgICAgICAgICAgICAgICAgICAgIC5vcHRpb25zKCk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZShyLmdldEhlYWRlcnMoKS5jb250YWluc0tleSgiTGFzdC1tb2RpZmllZCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RPcHRpb25zUmVzb3VyY2VXYWRsKCkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFhQYXRoRXhwcmVzc2lvbkV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sCisgICAgICAgICAgICAgICAgU0FYRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIC8vIHRlc3QgV2lkZ2V0c1Jlc291cmNlCisgICAgICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiL3dpZGdldHMiKS5xdWVyeVBhcmFtKFdhZGxVdGlscy5ERVRBSUxFRF9XQURMX1FVRVJZX1BBUkFNLCAidHJ1ZSIpCisgICAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0KE1lZGlhVHlwZXMuV0FETF9UWVBFKS5vcHRpb25zKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgICAgICBGaWxlIHRtcEZpbGUgPSByZXNwb25zZS5yZWFkRW50aXR5KEZpbGUuY2xhc3MpOworICAgICAgICAgICAgZmluYWwgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBiZiA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIGJmLnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOworICAgICAgICAgICAgYmYuc2V0VmFsaWRhdGluZyhmYWxzZSk7CisgICAgICAgICAgICBpZiAoIVNheEhlbHBlci5pc1hka0RvY3VtZW50QnVpbGRlckZhY3RvcnkoYmYpKSB7CisgICAgICAgICAgICAgICAgYmYuc2V0WEluY2x1ZGVBd2FyZShmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEb2N1bWVudEJ1aWxkZXIgYiA9IGJmLm5ld0RvY3VtZW50QnVpbGRlcigpOworICAgICAgICAgICAgRG9jdW1lbnQgZCA9IGIucGFyc2UodG1wRmlsZSk7CisgICAgICAgICAgICBwcmludFNvdXJjZShuZXcgRE9NU291cmNlKGQpKTsKKyAgICAgICAgICAgIGZpbmFsIFhQYXRoIHhwID0gWFBhdGhGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3WFBhdGgoKTsKKyAgICAgICAgICAgIHhwLnNldE5hbWVzcGFjZUNvbnRleHQobmV3IFNpbXBsZU5hbWVzcGFjZVJlc29sdmVyKCJ3YWRsIiwgImh0dHA6Ly93YWRsLmRldi5qYXZhLm5ldC8yMDA5LzAyIikpOworCisgICAgICAgICAgICAvLyBjaGVjayBiYXNlIFVSSQorICAgICAgICAgICAgU3RyaW5nIHZhbCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKCIvd2FkbDphcHBsaWNhdGlvbi93YWRsOnJlc291cmNlcy9AYmFzZSIsIGQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModmFsLCBnZXRCYXNlVXJpKCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAvLyBjaGVjayB0b3RhbCBudW1iZXIgb2YgcmVzb3VyY2VzIGlzIDMgKG5vIEV4dHJhUmVzb3VyY2UgZGV0YWlscyBpbmNsdWRlZCkKKyAgICAgICAgICAgIHZhbCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKCJjb3VudCgvL3dhZGw6cmVzb3VyY2UpIiwgZCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMyIsIHZhbCk7CisgICAgICAgICAgICAvLyBjaGVjayBvbmx5IG9uY2UgcmVzb3VyY2Ugd2l0aCBmb3Ige2lkfQorICAgICAgICAgICAgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoImNvdW50KC8vd2FkbDpyZXNvdXJjZVtAcGF0aD0ne2lkfSddKSIsIGQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCB2YWwpOworICAgICAgICAgICAgLy8gY2hlY2sgb25seSBvbmNlIHJlc291cmNlIHdpdGggZm9yIHtpZH0vdmVyYm9zZQorICAgICAgICAgICAgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoImNvdW50KC8vd2FkbDpyZXNvdXJjZVtAcGF0aD0ne2lkfS92ZXJib3NlJ10pIiwgZCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMSIsIHZhbCk7CisgICAgICAgICAgICAvLyBjaGVjayBvbmx5IG9uY2UgcmVzb3VyY2Ugd2l0aCBmb3Igd2lkZ2V0cworICAgICAgICAgICAgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoImNvdW50KC8vd2FkbDpyZXNvdXJjZVtAcGF0aD0nd2lkZ2V0cyddKSIsIGQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCB2YWwpOworICAgICAgICAgICAgLy8gY2hlY2sgMyBtZXRob2RzIGZvciB7aWR9CisgICAgICAgICAgICB2YWwgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZSgiY291bnQoLy93YWRsOnJlc291cmNlW0BwYXRoPSd7aWR9J10vd2FkbDptZXRob2QpIiwgZCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiNiIsIHZhbCk7CisgICAgICAgICAgICAvLyBjaGVjayAyIG1ldGhvZHMgZm9yIHdpZGdldHMKKyAgICAgICAgICAgIHZhbCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKCJjb3VudCgvL3dhZGw6cmVzb3VyY2VbQHBhdGg9J3dpZGdldHMnXS93YWRsOm1ldGhvZCkiLCBkLCBYUGF0aENvbnN0YW50cy5TVFJJTkcpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCI1IiwgdmFsKTsKKyAgICAgICAgICAgIC8vIGNoZWNrIHR5cGUgb2Yge2lkfSBpcyBpbnQKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcmVmaXggPSBnZXRYbWxTY2hlbWFOYW1lc3BhY2VQcmVmaXgoCisgICAgICAgICAgICAgICAgICAgIChOb2RlKSB4cC5ldmFsdWF0ZSgiLy93YWRsOnJlc291cmNlW0BwYXRoPSd7aWR9J10vd2FkbDpwYXJhbVtAbmFtZT0naWQnXSIsIGQsIFhQYXRoQ29uc3RhbnRzLk5PREUpKTsKKyAgICAgICAgICAgIHZhbCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKCIvL3dhZGw6cmVzb3VyY2VbQHBhdGg9J3tpZH0nXS93YWRsOnBhcmFtW0BuYW1lPSdpZCddL0B0eXBlIiwgZCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh2YWwsIChwcmVmaXggPT0gbnVsbCA/ICIiIDogcHJlZml4ICsgIjoiKSArICJpbnQiKTsKKyAgICAgICAgICAgIC8vIGNoZWNrIG51bWJlciBvZiBvdXRwdXQgcmVwcmVzZW50YXRpb25zIGlzIHR3bworICAgICAgICAgICAgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoImNvdW50KC8vd2FkbDpyZXNvdXJjZVtAcGF0aD0nd2lkZ2V0cyddL3dhZGw6bWV0aG9kW0BuYW1lPSdHRVQnXS93YWRsOnJlc3BvbnNlL3dhZGwiCisgICAgICAgICAgICAgICAgICAgICsgIjpyZXByZXNlbnRhdGlvbikiLCBkLCBYUGF0aENvbnN0YW50cy5TVFJJTkcpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIyIiwgdmFsKTsKKyAgICAgICAgICAgIC8vIGNoZWNrIG51bWJlciBvZiBvdXRwdXQgcmVwcmVzZW50YXRpb25zIGlzIG9uZQorICAgICAgICAgICAgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoImNvdW50KC8vd2FkbDpyZXNvdXJjZVtAcGF0aD0nd2lkZ2V0cyddL3dhZGw6bWV0aG9kW0BuYW1lPSdQT1NUJ10vd2FkbDpyZXF1ZXN0L3dhZGwiCisgICAgICAgICAgICAgICAgICAgICsgIjpyZXByZXNlbnRhdGlvbikiLCBkLCBYUGF0aENvbnN0YW50cy5TVFJJTkcpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgdmFsKTsKKworICAgICAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQoIi9mb28iKS5xdWVyeVBhcmFtKFdhZGxVdGlscy5ERVRBSUxFRF9XQURMX1FVRVJZX1BBUkFNLCAidHJ1ZSIpCisgICAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0KE1lZGlhVHlwZXMuV0FETF9UWVBFKS5vcHRpb25zKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgICAgICB0bXBGaWxlID0gcmVzcG9uc2UucmVhZEVudGl0eShGaWxlLmNsYXNzKTsKKyAgICAgICAgICAgIGIgPSBiZi5uZXdEb2N1bWVudEJ1aWxkZXIoKTsKKyAgICAgICAgICAgIGQgPSBiLnBhcnNlKHRtcEZpbGUpOworICAgICAgICAgICAgcHJpbnRTb3VyY2UobmV3IERPTVNvdXJjZShkKSk7CisgICAgICAgICAgICAvLyBjaGVjayBiYXNlIFVSSQorICAgICAgICAgICAgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoIi93YWRsOmFwcGxpY2F0aW9uL3dhZGw6cmVzb3VyY2VzL0BiYXNlIiwgZCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh2YWwsIGdldEJhc2VVcmkoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIC8vIGNoZWNrIHRvdGFsIG51bWJlciBvZiByZXNvdXJjZXMgaXMgMSAobm8gRXh0cmFSZXNvdXJjZSBkZXRhaWxzIGluY2x1ZGVkKQorICAgICAgICAgICAgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoImNvdW50KC8vd2FkbDpyZXNvdXJjZSkiLCBkLCBYUGF0aENvbnN0YW50cy5TVFJJTkcpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgdmFsKTsKKyAgICAgICAgICAgIC8vIGNoZWNrIG9ubHkgb25jZSByZXNvdXJjZSB3aXRoIHBhdGggZm9vCisgICAgICAgICAgICB2YWwgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZSgiY291bnQoLy93YWRsOnJlc291cmNlW0BwYXRoPSdmb28nXSkiLCBkLCBYUGF0aENvbnN0YW50cy5TVFJJTkcpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgdmFsKTsKKyAgICAgICAgICAgIC8vIGNoZWNrIDEgbWV0aG9kcyBmb3IgZm9vCisgICAgICAgICAgICB2YWwgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZSgiY291bnQoLy93YWRsOnJlc291cmNlW0BwYXRoPSdmb28nXS93YWRsOm1ldGhvZCkiLCBkLCBYUGF0aENvbnN0YW50cy5TVFJJTkcpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCI0IiwgdmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RPcHRpb25zTG9jYXRvcldhZGwoKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICBYUGF0aEV4cHJlc3Npb25FeGNlcHRpb24geworCisgICAgICAgICAgICAvLyB0ZXN0IFdpZGdldHNSZXNvdXJjZQorICAgICAgICAgICAgZmluYWwgRmlsZSB0bXBGaWxlID0gdGFyZ2V0KCIvd2lkZ2V0cy8zL3ZlcmJvc2UiKS5xdWVyeVBhcmFtKFdhZGxVdGlscy5ERVRBSUxFRF9XQURMX1FVRVJZX1BBUkFNLCAidHJ1ZSIpCisgICAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0KE1lZGlhVHlwZXMuV0FETF9UWVBFKS5vcHRpb25zKEZpbGUuY2xhc3MpOworICAgICAgICAgICAgZmluYWwgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBiZiA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIGJmLnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOworICAgICAgICAgICAgYmYuc2V0VmFsaWRhdGluZyhmYWxzZSk7CisgICAgICAgICAgICBpZiAoIVNheEhlbHBlci5pc1hka0RvY3VtZW50QnVpbGRlckZhY3RvcnkoYmYpKSB7CisgICAgICAgICAgICAgICAgYmYuc2V0WEluY2x1ZGVBd2FyZShmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBEb2N1bWVudEJ1aWxkZXIgYiA9IGJmLm5ld0RvY3VtZW50QnVpbGRlcigpOworICAgICAgICAgICAgZmluYWwgRG9jdW1lbnQgZCA9IGIucGFyc2UodG1wRmlsZSk7CisgICAgICAgICAgICBwcmludFNvdXJjZShuZXcgRE9NU291cmNlKGQpKTsKKyAgICAgICAgICAgIGZpbmFsIFhQYXRoIHhwID0gWFBhdGhGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3WFBhdGgoKTsKKyAgICAgICAgICAgIHhwLnNldE5hbWVzcGFjZUNvbnRleHQobmV3IFNpbXBsZU5hbWVzcGFjZVJlc29sdmVyKCJ3YWRsIiwgImh0dHA6Ly93YWRsLmRldi5qYXZhLm5ldC8yMDA5LzAyIikpOworICAgICAgICAgICAgLy8gY2hlY2sgYmFzZSBVUkkKKyAgICAgICAgICAgIFN0cmluZyB2YWwgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZSgiL3dhZGw6YXBwbGljYXRpb24vd2FkbDpyZXNvdXJjZXMvQGJhc2UiLCBkLCBYUGF0aENvbnN0YW50cy5TVFJJTkcpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbCwgZ2V0QmFzZVVyaSgpLnRvU3RyaW5nKCkpOworICAgICAgICAgICAgLy8gY2hlY2sgdG90YWwgbnVtYmVyIG9mIHJlc291cmNlcyBpcyAxIChubyBFeHRyYVJlc291cmNlIGRldGFpbHMgaW5jbHVkZWQpCisgICAgICAgICAgICB2YWwgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZSgiY291bnQoLy93YWRsOnJlc291cmNlKSIsIGQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModmFsLCAiMSIpOworICAgICAgICAgICAgLy8gY2hlY2sgb25seSBvbmNlIHJlc291cmNlIHdpdGggcGF0aAorICAgICAgICAgICAgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoImNvdW50KC8vd2FkbDpyZXNvdXJjZVtAcGF0aD0nd2lkZ2V0cy8zL3ZlcmJvc2UnXSkiLCBkLCBYUGF0aENvbnN0YW50cy5TVFJJTkcpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbCwgIjEiKTsKKyAgICAgICAgICAgIC8vIGNoZWNrIDEgbWV0aG9kcworICAgICAgICAgICAgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoImNvdW50KC8vd2FkbDpyZXNvdXJjZVtAcGF0aD0nd2lkZ2V0cy8zL3ZlcmJvc2UnXS93YWRsOm1ldGhvZCkiLCBkLCBYUGF0aENvbnN0YW50cy5TVFJJTkcpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCI0IiwgdmFsKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RPcHRpb25zU3ViUmVzb3VyY2VXYWRsKCkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sCisgICAgICAgICAgICAgICAgWFBhdGhFeHByZXNzaW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIC8vIHRlc3QgV2lkZ2V0c1Jlc291cmNlCisgICAgICAgICAgICBmaW5hbCBGaWxlIHRtcEZpbGUgPSB0YXJnZXQoIi93aWRnZXRzLzMiKS5xdWVyeVBhcmFtKFdhZGxVdGlscy5ERVRBSUxFRF9XQURMX1FVRVJZX1BBUkFNLCAidHJ1ZSIpCisgICAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0KE1lZGlhVHlwZXMuV0FETF9UWVBFKS5vcHRpb25zKEZpbGUuY2xhc3MpOworICAgICAgICAgICAgZmluYWwgRG9jdW1lbnRCdWlsZGVyRmFjdG9yeSBiZiA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgICAgIGJmLnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOworICAgICAgICAgICAgYmYuc2V0VmFsaWRhdGluZyhmYWxzZSk7CisgICAgICAgICAgICBpZiAoIVNheEhlbHBlci5pc1hka0RvY3VtZW50QnVpbGRlckZhY3RvcnkoYmYpKSB7CisgICAgICAgICAgICAgICAgYmYuc2V0WEluY2x1ZGVBd2FyZShmYWxzZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBEb2N1bWVudEJ1aWxkZXIgYiA9IGJmLm5ld0RvY3VtZW50QnVpbGRlcigpOworICAgICAgICAgICAgZmluYWwgRG9jdW1lbnQgZCA9IGIucGFyc2UodG1wRmlsZSk7CisgICAgICAgICAgICBwcmludFNvdXJjZShuZXcgRE9NU291cmNlKGQpKTsKKyAgICAgICAgICAgIGZpbmFsIFhQYXRoIHhwID0gWFBhdGhGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3WFBhdGgoKTsKKyAgICAgICAgICAgIHhwLnNldE5hbWVzcGFjZUNvbnRleHQobmV3IFNpbXBsZU5hbWVzcGFjZVJlc29sdmVyKCJ3YWRsIiwgImh0dHA6Ly93YWRsLmRldi5qYXZhLm5ldC8yMDA5LzAyIikpOworICAgICAgICAgICAgU3RyaW5nIHZhbCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKCIvd2FkbDphcHBsaWNhdGlvbi93YWRsOnJlc291cmNlcy9AYmFzZSIsIGQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModmFsLCBnZXRCYXNlVXJpKCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAvLyBjaGVjayB0b3RhbCBudW1iZXIgb2YgcmVzb3VyY2VzIGlzIDEKKyAgICAgICAgICAgIHZhbCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKCJjb3VudCgvL3dhZGw6cmVzb3VyY2UpIiwgZCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiMSIsIHZhbCk7CisgICAgICAgICAgICAvLyBjaGVjayBvbmx5IG9uZSByZXNvdXJjZSB3aXRoIGZvciB7aWR9CisgICAgICAgICAgICB2YWwgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZSgiY291bnQoLy93YWRsOnJlc291cmNlW0BwYXRoPSd3aWRnZXRzLzMnXSkiLCBkLCBYUGF0aENvbnN0YW50cy5TVFJJTkcpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgdmFsKTsKKyAgICAgICAgICAgIC8vIGNoZWNrIDMgbWV0aG9kcworICAgICAgICAgICAgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoImNvdW50KC8vd2FkbDpyZXNvdXJjZVtAcGF0aD0nd2lkZ2V0cy8zJ10vd2FkbDptZXRob2QpIiwgZCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiNiIsIHZhbCk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15V2FkbEdlbmVyYXRvckNvbmZpZyBleHRlbmRzIFdhZGxHZW5lcmF0b3JDb25maWcgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBMaXN0PFdhZGxHZW5lcmF0b3JEZXNjcmlwdGlvbj4gY29uZmlndXJlKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBnZW5lcmF0b3IoTXlXYWRsR2VuZXJhdG9yLmNsYXNzKS5kZXNjcmlwdGlvbnMoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVdhZGxHZW5lcmF0b3IgZXh0ZW5kcyBXYWRsR2VuZXJhdG9ySW1wbCB7CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDVVNUT01fUkVTT1VSQ0VTX0JBU0VfVVJJID0gImh0dHA6Ly9teUJhc2VVcmkiOworCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIFJlc291cmNlcyBjcmVhdGVSZXNvdXJjZXMoKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlc291cmNlcyByZXNvdXJjZXMgPSBzdXBlci5jcmVhdGVSZXNvdXJjZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VzLnNldEJhc2UoQ1VTVE9NX1JFU09VUkNFU19CQVNFX1VSSSk7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc291cmNlczsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRXYWRsR2VuZXJhdG9yRGVsZWdhdGUoZmluYWwgV2FkbEdlbmVyYXRvciBkZWxlZ2F0ZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRlc3Qgb3ZlcnJpZGluZyBXQURMJ3MgL2FwcGxpY2F0aW9uL3Jlc291cmNlcy9AYmFzZSBhdHRyaWJ1dGUuCisgICAgICAgICAqCisgICAgICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGluIGNhc2Ugb2YgdW5leHBlY3RlZCB0ZXN0IGZhaWx1cmUuCisgICAgICAgICAqLworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tV2FkbFJlc291cmNlc0Jhc2VVcmkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJjID0gbmV3IFJlc291cmNlQ29uZmlnKFdpZGdldHNSZXNvdXJjZS5jbGFzcywgRXh0cmFSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgICAgICByYy5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLldBRExfR0VORVJBVE9SX0NPTkZJRywgTXlXYWRsR2VuZXJhdG9yQ29uZmlnLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICAgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbkhhbmRsZXIgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKHJjKTsKKworICAgICAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgY29udGFpbmVyUmVzcG9uc2UgPSBhcHBsaWNhdGlvbkhhbmRsZXIuYXBwbHkobmV3IENvbnRhaW5lclJlcXVlc3QoCisgICAgICAgICAgICAgICAgICAgIFVSSS5jcmVhdGUoIi8iKSwgVVJJLmNyZWF0ZSgiL2FwcGxpY2F0aW9uLndhZGwiKSwKKyAgICAgICAgICAgICAgICAgICAgIkdFVCIsIG51bGwsIG5ldyBNYXBQcm9wZXJ0aWVzRGVsZWdhdGUoKSkpLmdldCgpOworCisgICAgICAgICAgICBmaW5hbCBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGJmID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgYmYuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7CisgICAgICAgICAgICBiZi5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKKyAgICAgICAgICAgIGlmICghU2F4SGVscGVyLmlzWGRrRG9jdW1lbnRCdWlsZGVyRmFjdG9yeShiZikpIHsKKyAgICAgICAgICAgICAgICBiZi5zZXRYSW5jbHVkZUF3YXJlKGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIERvY3VtZW50QnVpbGRlciBiID0gYmYubmV3RG9jdW1lbnRCdWlsZGVyKCk7CisKKyAgICAgICAgICAgICgoQnl0ZUFycmF5SW5wdXRTdHJlYW0pIGNvbnRhaW5lclJlc3BvbnNlLmdldEVudGl0eSgpKS5yZXNldCgpOworCisgICAgICAgICAgICBmaW5hbCBEb2N1bWVudCBkID0gYi5wYXJzZSgoSW5wdXRTdHJlYW0pIGNvbnRhaW5lclJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICAgICAgICAgIHByaW50U291cmNlKG5ldyBET01Tb3VyY2UoZCkpOworICAgICAgICAgICAgZmluYWwgWFBhdGggeHAgPSBYUGF0aEZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdYUGF0aCgpOworICAgICAgICAgICAgeHAuc2V0TmFtZXNwYWNlQ29udGV4dChuZXcgU2ltcGxlTmFtZXNwYWNlUmVzb2x2ZXIoIndhZGwiLCAiaHR0cDovL3dhZGwuZGV2LmphdmEubmV0LzIwMDkvMDIiKSk7CisgICAgICAgICAgICAvLyBjaGVjayBiYXNlIFVSSQorICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZhbCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKCIvd2FkbDphcHBsaWNhdGlvbi93YWRsOnJlc291cmNlcy9AYmFzZSIsIGQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModmFsLCBNeVdhZGxHZW5lcmF0b3JDb25maWcuTXlXYWRsR2VuZXJhdG9yLkNVU1RPTV9SRVNPVVJDRVNfQkFTRV9VUkkpOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImVtcHR5cHJvZHVjZXMiKQorICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEVtcHR5UHJvZHVjZXNUZXN0UmVzb3VyY2UgeworCisgICAgICAgICAgICBAUFVUCisgICAgICAgICAgICBAUHJvZHVjZXMoe30pCisgICAgICAgICAgICBwdWJsaWMgUmVzcG9uc2UgcHV0KGZpbmFsIFN0cmluZyBzdHIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soKS5idWlsZCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAUE9TVAorICAgICAgICAgICAgQFBhdGgoIi9zdWIiKQorICAgICAgICAgICAgQFByb2R1Y2VzKHt9KQorICAgICAgICAgICAgcHVibGljIFJlc3BvbnNlIHBvc3QoZmluYWwgU3RyaW5nIHN0cikgeworICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygpLmJ1aWxkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlQcm9kdWNlcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmMgPSBuZXcgUmVzb3VyY2VDb25maWcoRW1wdHlQcm9kdWNlc1Rlc3RSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgICAgICByYy5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLldBRExfRkVBVFVSRV9ESVNBQkxFLCBmYWxzZSk7CisKKyAgICAgICAgICAgIGZpbmFsIEFwcGxpY2F0aW9uSGFuZGxlciBhcHBsaWNhdGlvbkhhbmRsZXIgPSBuZXcgQXBwbGljYXRpb25IYW5kbGVyKHJjKTsKKworICAgICAgICAgICAgZmluYWwgQ29udGFpbmVyUmVzcG9uc2UgY29udGFpbmVyUmVzcG9uc2UgPSBhcHBsaWNhdGlvbkhhbmRsZXIuYXBwbHkobmV3IENvbnRhaW5lclJlcXVlc3QoCisgICAgICAgICAgICAgICAgICAgIFVSSS5jcmVhdGUoIi8iKSwgVVJJLmNyZWF0ZSgiL2FwcGxpY2F0aW9uLndhZGwiKSwKKyAgICAgICAgICAgICAgICAgICAgIkdFVCIsIG51bGwsIG5ldyBNYXBQcm9wZXJ0aWVzRGVsZWdhdGUoKSkpLmdldCgpOworCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCBjb250YWluZXJSZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgICAgICgoQnl0ZUFycmF5SW5wdXRTdHJlYW0pIGNvbnRhaW5lclJlc3BvbnNlLmdldEVudGl0eSgpKS5yZXNldCgpOworCisgICAgICAgICAgICBmaW5hbCBEb2N1bWVudEJ1aWxkZXJGYWN0b3J5IGJmID0gRG9jdW1lbnRCdWlsZGVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICAgICAgYmYuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7CisgICAgICAgICAgICBiZi5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKKyAgICAgICAgICAgIGlmICghU2F4SGVscGVyLmlzWGRrRG9jdW1lbnRCdWlsZGVyRmFjdG9yeShiZikpIHsKKyAgICAgICAgICAgICAgICBiZi5zZXRYSW5jbHVkZUF3YXJlKGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIERvY3VtZW50QnVpbGRlciBiID0gYmYubmV3RG9jdW1lbnRCdWlsZGVyKCk7CisgICAgICAgICAgICBmaW5hbCBEb2N1bWVudCBkID0gYi5wYXJzZSgoSW5wdXRTdHJlYW0pIGNvbnRhaW5lclJlc3BvbnNlLmdldEVudGl0eSgpKTsKKyAgICAgICAgICAgIHByaW50U291cmNlKG5ldyBET01Tb3VyY2UoZCkpOworICAgICAgICAgICAgZmluYWwgWFBhdGggeHAgPSBYUGF0aEZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdYUGF0aCgpOworICAgICAgICAgICAgeHAuc2V0TmFtZXNwYWNlQ29udGV4dChuZXcgU2ltcGxlTmFtZXNwYWNlUmVzb2x2ZXIoIndhZGwiLCAiaHR0cDovL3dhZGwuZGV2LmphdmEubmV0LzIwMDkvMDIiKSk7CisKKyAgICAgICAgICAgIGZpbmFsIE5vZGVMaXN0IHJlc3BvbnNlRWxlbWVudHMgPSAoTm9kZUxpc3QpIHhwLmV2YWx1YXRlKAorICAgICAgICAgICAgICAgICAgICAiL3dhZGw6YXBwbGljYXRpb24vd2FkbDpyZXNvdXJjZXNbQHBhdGghPSdhcHBsaWNhdGlvbi53YWRsJ10vL3dhZGw6bWV0aG9kL3dhZGw6cmVzcG9uc2UiLCBkLAorICAgICAgICAgICAgICAgICAgICBYUGF0aENvbnN0YW50cy5OT0RFU0VUKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXNwb25zZUVsZW1lbnRzLmdldExlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBOb2RlIGl0ZW0gPSByZXNwb25zZUVsZW1lbnRzLml0ZW0oaSk7CisKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgaXRlbS5nZXRDaGlsZE5vZGVzKCkuZ2V0TGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygwLCBpdGVtLmdldEF0dHJpYnV0ZXMoKS5nZXRMZW5ndGgoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFdhZGwxVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSb290UmVzb3VyY2UuY2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInJvb3QiKQorICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJvb3RSZXNvdXJjZSB7CisKKyAgICAgICAgICAgIEBQYXRoKCJsb2MiKQorICAgICAgICAgICAgcHVibGljIE9iamVjdCBnZXRTdWIoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTdWJSZXNvdXJjZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAUGF0aCgic3dpdGNoIikKKyAgICAgICAgICAgIEBQT1NUCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBzd2l0Y2hNZXRob2QoQENvbnRleHQgZmluYWwgV2FkbEFwcGxpY2F0aW9uQ29udGV4dCB3YWRsQXBwbGljYXRpb25Db250ZXh0KSB7CisgICAgICAgICAgICAgICAgd2FkbEFwcGxpY2F0aW9uQ29udGV4dC5zZXRXYWRsR2VuZXJhdGlvbkVuYWJsZWQoIXdhZGxBcHBsaWNhdGlvbkNvbnRleHQuaXNXYWRsR2VuZXJhdGlvbkVuYWJsZWQoKSk7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3ViUmVzb3VyY2UgeworCisgICAgICAgICAgICBAUGF0aCgibG9jIikKKyAgICAgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0U3ViKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3ViUmVzb3VyY2UoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQEdFVAorICAgICAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgaGVsbG8oKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJIZWxsbyBXb3JsZCAhIjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQEdFVAorICAgICAgICAgICAgQFBhdGgoInN1YiIpCisgICAgICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBoZWxsb1N1YigpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIkhlbGxvIFdvcmxkICEiOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdFJlY3Vyc2l2ZSgpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBYUGF0aEV4cHJlc3Npb25FeGNlcHRpb24geworICAgICAgICAgICAgX3Rlc3RSZWN1cnNpdmVXYWRsKCJyb290L2xvYyIpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgbXl0ZXN0KCkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFhQYXRoRXhwcmVzc2lvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJvb3QvdGVzdCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdFJlY3Vyc2l2ZTIoKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgWFBhdGhFeHByZXNzaW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIF90ZXN0UmVjdXJzaXZlV2FkbCgicm9vdC9sb2MvbG9jIik7CisgICAgICAgIH0KKworICAgICAgICBwcml2YXRlIHZvaWQgX3Rlc3RSZWN1cnNpdmVXYWRsKGZpbmFsIFN0cmluZyBwYXRoKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICBYUGF0aEV4cHJlc3Npb25FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgRG9jdW1lbnQgZCA9IGV4dHJhY3RXYWRsQXNEb2N1bWVudCh0YXJnZXQocGF0aCkucmVxdWVzdChNZWRpYVR5cGVzLldBRExfVFlQRSkub3B0aW9ucygpKTsKKworICAgICAgICAgICAgZmluYWwgWFBhdGggeHAgPSBYUGF0aEZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdYUGF0aCgpOworICAgICAgICAgICAgeHAuc2V0TmFtZXNwYWNlQ29udGV4dChuZXcgU2ltcGxlTmFtZXNwYWNlUmVzb2x2ZXIoIndhZGwiLCAiaHR0cDovL3dhZGwuZGV2LmphdmEubmV0LzIwMDkvMDIiKSk7CisgICAgICAgICAgICBTdHJpbmcgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoIi93YWRsOmFwcGxpY2F0aW9uL3dhZGw6cmVzb3VyY2VzL0BiYXNlIiwgZCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh2YWwsIGdldEJhc2VVcmkoKS50b1N0cmluZygpKTsKKworICAgICAgICAgICAgLy8gY2hlY2sgb25seSBvbmUgcmVzb3VyY2Ugd2l0aCBmb3IgJ3Jvb3QvbG9jJworICAgICAgICAgICAgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoImNvdW50KC8vd2FkbDpyZXNvdXJjZVtAcGF0aD0nIiArIHBhdGggKyAiJ10pIiwgZCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh2YWwsICIxIik7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgV2FkbDJUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJvb3RSZXNvdXJjZTEuY2xhc3MsIFJvb3RSZXNvdXJjZTIuY2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInJvb3QxIikKKyAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSb290UmVzb3VyY2UxIHsKKworICAgICAgICAgICAgQFBhdGgoImxvYyIpCisgICAgICAgICAgICBwdWJsaWMgV2FkbDFUZXN0LlN1YlJlc291cmNlIGdldFN1YigpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdhZGwxVGVzdC5TdWJSZXNvdXJjZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInJvb3QyIikKKyAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSb290UmVzb3VyY2UyIHsKKworICAgICAgICAgICAgQFBhdGgoImxvYyIpCisgICAgICAgICAgICBwdWJsaWMgV2FkbDFUZXN0LlN1YlJlc291cmNlIGdldFN1YigpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFdhZGwxVGVzdC5TdWJSZXNvdXJjZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdFJlY3Vyc2l2ZTIoKSB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgWFBhdGhFeHByZXNzaW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIERvY3VtZW50IGQgPSBleHRyYWN0V2FkbEFzRG9jdW1lbnQodGFyZ2V0KCIvYXBwbGljYXRpb24ud2FkbCIpCisgICAgICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKFdhZGxVdGlscy5ERVRBSUxFRF9XQURMX1FVRVJZX1BBUkFNLCAidHJ1ZSIpLnJlcXVlc3QoKS5nZXQoKSk7CisKKyAgICAgICAgICAgIGZpbmFsIFhQYXRoIHhwID0gWFBhdGhGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3WFBhdGgoKTsKKyAgICAgICAgICAgIHhwLnNldE5hbWVzcGFjZUNvbnRleHQobmV3IFNpbXBsZU5hbWVzcGFjZVJlc29sdmVyKCJ3YWRsIiwgImh0dHA6Ly93YWRsLmRldi5qYXZhLm5ldC8yMDA5LzAyIikpOworICAgICAgICAgICAgU3RyaW5nIHZhbCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKCIvd2FkbDphcHBsaWNhdGlvbi93YWRsOnJlc291cmNlcy9AYmFzZSIsIGQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModmFsLCBnZXRCYXNlVXJpKCkudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAvLyBjaGVjayBvbmx5IG9uZSByZXNvdXJjZSB3aXRoIGZvciAncm9vdC9sb2MnCisgICAgICAgICAgICB2YWwgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZSgiY291bnQoLy93YWRsOnJlc291cmNlW0BwYXRoPSdsb2MnXSkiLCBkLCBYUGF0aENvbnN0YW50cy5TVFJJTkcpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCI0IiwgdmFsKTsKKyAgICAgICAgICAgIC8vIGNoZWNrIGZvciBtZXRob2Qgd2l0aCBpZCBvZiBoZWxsbworICAgICAgICAgICAgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUoImNvdW50KC8vd2FkbDpyZXNvdXJjZVtAcGF0aD0nbG9jJ10vd2FkbDptZXRob2RbQGlkPSdoZWxsbyddKSIsIGQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIjIiLCB2YWwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBXYWRsM1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoRm9ybVJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJmb3JtIikKKyAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGb3JtUmVzb3VyY2UgeworCisgICAgICAgICAgICBAUE9TVAorICAgICAgICAgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKQorICAgICAgICAgICAgcHVibGljIHZvaWQgcG9zdCgKKyAgICAgICAgICAgICAgICAgICAgQEZvcm1QYXJhbSgiYSIpIGZpbmFsIFN0cmluZyBhLAorICAgICAgICAgICAgICAgICAgICBARm9ybVBhcmFtKCJiIikgZmluYWwgU3RyaW5nIGIsCisgICAgICAgICAgICAgICAgICAgIEBGb3JtUGFyYW0oImMiKSBmaW5hbCBKYXhiQmVhbiBjLAorICAgICAgICAgICAgICAgICAgICBARm9ybVBhcmFtKCJjIikgZmluYWwgRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24gY2RjLAorICAgICAgICAgICAgICAgICAgICBmaW5hbCBGb3JtIGZvcm0pIHsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdEZvcm1QYXJhbSgpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIElPRXhjZXB0aW9uLCBYUGF0aEV4cHJlc3Npb25FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgRG9jdW1lbnQgZCA9IGV4dHJhY3RXYWRsQXNEb2N1bWVudCh0YXJnZXQoIi9hcHBsaWNhdGlvbi53YWRsIikucmVxdWVzdCgpLmdldCgpKTsKKyAgICAgICAgICAgIGZpbmFsIFhQYXRoIHhwID0gWFBhdGhGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3WFBhdGgoKTsKKyAgICAgICAgICAgIHhwLnNldE5hbWVzcGFjZUNvbnRleHQobmV3IFNpbXBsZU5hbWVzcGFjZVJlc29sdmVyKCJ3YWRsIiwgImh0dHA6Ly93YWRsLmRldi5qYXZhLm5ldC8yMDA5LzAyIikpOworCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVxdWVzdFBhdGggPSAiLy93YWRsOnJlc291cmNlW0BwYXRoPSdmb3JtJ10vd2FkbDptZXRob2RbQG5hbWU9J1BPU1QnXS93YWRsOnJlcXVlc3QiOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJlcHJlc2VudGF0aW9uUGF0aCA9IHJlcXVlc3RQYXRoICsgIi93YWRsOnJlcHJlc2VudGF0aW9uIjsKKworICAgICAgICAgICAgLy8gY2hlY2sgbnVtYmVyIG9mIHJlcXVlc3QgcGFyYW1zIGlzIHplcm8KKyAgICAgICAgICAgIGludCBjb3VudCA9ICgoRG91YmxlKSB4cC5ldmFsdWF0ZSgiY291bnQoIiArIHJlcXVlc3RQYXRoICsgIi93YWRsOnBhcmFtKSIsIGQsIFhQYXRoQ29uc3RhbnRzLk5VTUJFUikpLmludFZhbHVlKCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMCwgY291bnQpOworCisgICAgICAgICAgICAvLyBjaGVjayBudW1iZXIgb2YgcmVxdWVzdCByZXByZXNlbnRhdGlvbnMgaXMgb25lCisgICAgICAgICAgICBjb3VudCA9ICgoRG91YmxlKSB4cC5ldmFsdWF0ZSgiY291bnQoIiArIHJlcHJlc2VudGF0aW9uUGF0aCArICIpIiwgZCwgWFBhdGhDb25zdGFudHMuTlVNQkVSKSkuaW50VmFsdWUoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygxLCBjb3VudCk7CisKKyAgICAgICAgICAgIC8vIGNoZWNrIG51bWJlciBvZiByZXF1ZXN0IHJlcHJlc2VudGF0aW9uIHBhcmFtcyBpcyB0aHJlZQorICAgICAgICAgICAgY291bnQgPSAoKERvdWJsZSkgeHAuZXZhbHVhdGUoImNvdW50KCIgKyByZXByZXNlbnRhdGlvblBhdGggKyAiL3dhZGw6cGFyYW0pIiwgZCwgWFBhdGhDb25zdGFudHMuTlVNQkVSKSkuaW50VmFsdWUoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygzLCBjb3VudCk7CisKKyAgICAgICAgICAgIC8vIGNoZWNrIHRoZSBzdHlsZSBvZiB0aGUgcmVxdWVzdCByZXByZXNlbnRhdGlvbiBwYXJhbSBpcyAncXVlcnknCisgICAgICAgICAgICBTdHJpbmcgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUocmVwcmVzZW50YXRpb25QYXRoICsgIi93YWRsOnBhcmFtW0BuYW1lPSdhJ10vQHN0eWxlIiwgZCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygicXVlcnkiLCB2YWwpOworICAgICAgICAgICAgdmFsID0gKFN0cmluZykgeHAuZXZhbHVhdGUocmVwcmVzZW50YXRpb25QYXRoICsgIi93YWRsOnBhcmFtW0BuYW1lPSdiJ10vQHN0eWxlIiwgZCwgWFBhdGhDb25zdGFudHMuU1RSSU5HKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygicXVlcnkiLCB2YWwpOworCisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFdhZGw0VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhGaWVsZFBhcmFtUmVzb3VyY2UuY2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImZpZWxkUGFyYW0ve3BwfSIpCisgICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmllbGRQYXJhbVJlc291cmNlIHsKKworICAgICAgICAgICAgQEhlYWRlclBhcmFtKCJocCIpCisgICAgICAgICAgICBTdHJpbmcgaHA7CisgICAgICAgICAgICBATWF0cml4UGFyYW0oIm1wIikKKyAgICAgICAgICAgIFN0cmluZyBtcDsKKyAgICAgICAgICAgIEBQYXRoUGFyYW0oInBwIikKKyAgICAgICAgICAgIFN0cmluZyBwcDsKKworICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcTsKKworICAgICAgICAgICAgQFF1ZXJ5UGFyYW0oInEiKQorICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0UShmaW5hbCBTdHJpbmcgcSkgeworICAgICAgICAgICAgICAgIHRoaXMucSA9IHE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHRoZXNlIHNob3VsZCBub3QgYmUgaW5jbHVkZWQgaW4gV0FETAorICAgICAgICAgICAgQENvbnRleHQKKyAgICAgICAgICAgIFVyaUluZm8gdXJpSW5mbzsKKyAgICAgICAgICAgIEBOYW1lZCgiZmFrZVBhcmFtIikKKyAgICAgICAgICAgIFN0cmluZyBmYWtlUGFyYW07CisKKyAgICAgICAgICAgIEBHRVQKKyAgICAgICAgICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcHA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RGaWVsZFBhcmFtKCkgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24sIFhQYXRoRXhwcmVzc2lvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGF0aCA9ICJmaWVsZFBhcmFtIjsKKyAgICAgICAgICAgIF90ZXN0RmllbGRBbmRTZXR0ZXJQYXJhbSh0YXJnZXQoIi9hcHBsaWNhdGlvbi53YWRsIikucmVxdWVzdCgpLmdldCgpLCBwYXRoKTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgX3Rlc3RGaWVsZEFuZFNldHRlclBhcmFtKGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlLCBmaW5hbCBTdHJpbmcgcGF0aCkKKyAgICAgICAgICAgICAgICB0aHJvd3MgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgWFBhdGhFeHByZXNzaW9uRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgZmluYWwgRG9jdW1lbnQgZCA9IGV4dHJhY3RXYWRsQXNEb2N1bWVudChyZXNwb25zZSk7CisgICAgICAgICAgICBmaW5hbCBYUGF0aCB4cCA9IFhQYXRoRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1hQYXRoKCk7CisgICAgICAgICAgICB4cC5zZXROYW1lc3BhY2VDb250ZXh0KG5ldyBTaW1wbGVOYW1lc3BhY2VSZXNvbHZlcigid2FkbCIsICJodHRwOi8vd2FkbC5kZXYuamF2YS5uZXQvMjAwOS8wMiIpKTsKKworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJlc291cmNlUGF0aCA9IFN0cmluZy5mb3JtYXQoIi8vd2FkbDpyZXNvdXJjZVtAcGF0aD0nJXMve3BwfSddIiwgcGF0aCk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgbWV0aG9kUGF0aCA9IHJlc291cmNlUGF0aCArICIvd2FkbDptZXRob2RbQG5hbWU9J0dFVCddIjsKKworICAgICAgICAgICAgLy8gY2hlY2sgbnVtYmVyIG9mIHJlc291cmNlIG1ldGhvZHMgaXMgb25lCisgICAgICAgICAgICBmaW5hbCBpbnQgbWV0aG9kQ291bnQgPSAoKERvdWJsZSkgeHAuZXZhbHVhdGUoImNvdW50KCIgKyBtZXRob2RQYXRoICsgIikiLCBkLCBYUGF0aENvbnN0YW50cy5OVU1CRVIpKS5pbnRWYWx1ZSgpOworICAgICAgICAgICAgYXNzZXJ0VGhhdCgiVW5leHBlY3RlZCBudW1iZXIgb2YgbWV0aG9kcyBvbiBwYXRoICciICsgbWV0aG9kUGF0aCArICInIiwgbWV0aG9kQ291bnQsIGVxdWFsVG8oMSkpOworCisgICAgICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtU3R5bGVzID0gbmV3IEhhc2hNYXA8PigpOworICAgICAgICAgICAgcGFyYW1TdHlsZXMucHV0KCJtcCIsICJtYXRyaXgiKTsKKyAgICAgICAgICAgIHBhcmFtU3R5bGVzLnB1dCgicHAiLCAidGVtcGxhdGUiKTsKKworICAgICAgICAgICAgLy8gY2hlY2sgdGhlIG51bWJlciBvZiByZXNvdXJjZSBwYXJhbXMKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZXNvdXJjZVBhcmFtc0NvdW50WFBhdGggPSBTdHJpbmcuZm9ybWF0KCJjb3VudCglcy93YWRsOnBhcmFtKSIsIHJlc291cmNlUGF0aCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgcmVzb3VyY2VQYXJhbXNDb3VudCA9ICgoRG91YmxlKSB4cC5ldmFsdWF0ZShyZXNvdXJjZVBhcmFtc0NvdW50WFBhdGgsIGQsIFhQYXRoQ29uc3RhbnRzLk5VTUJFUikpLmludFZhbHVlKCk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KCJOdW1iZXIgb2YgcmVzb3VyY2UgcGFyYW1ldGVycyBkb2VzIG5vdCBtYXRjaC4iLCByZXNvdXJjZVBhcmFtc0NvdW50LCBlcXVhbFRvKDIpKTsKKworICAgICAgICAgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8U3RyaW5nLCBTdHJpbmc+IHBhcmFtIDogcGFyYW1TdHlsZXMuZW50cnlTZXQoKSkgeworCisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBOYW1lID0gcGFyYW0uZ2V0S2V5KCk7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBTdHlsZSA9IHBhcmFtLmdldFZhbHVlKCk7CisKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcGFyYW1YUGF0aCA9IFN0cmluZy5mb3JtYXQoIiVzL3dhZGw6cGFyYW1bQG5hbWU9JyVzJ10iLCByZXNvdXJjZVBhdGgsIHBOYW1lKTsKKworICAgICAgICAgICAgICAgIC8vIGNoZWNrIG51bWJlciBvZiBwYXJhbXMgaXMgb25lCisgICAgICAgICAgICAgICAgZmluYWwgaW50IHBjID0gKChEb3VibGUpIHhwLmV2YWx1YXRlKCJjb3VudCgiICsgcGFyYW1YUGF0aCArICIpIiwgZCwgWFBhdGhDb25zdGFudHMuTlVNQkVSKSkuaW50VmFsdWUoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUaGF0KCJOdW1iZXIgb2YgIiArIHBTdHlsZSArICIgcGFyYW1ldGVycyAnIiArIHBOYW1lICsgIicgZG9lcyBub3QgbWF0Y2guIiwgcGMsIGVxdWFsVG8oMSkpOworCisgICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhlIHN0eWxlIG9mIHRoZSBwYXJhbQorICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzdHlsZSA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKHBhcmFtWFBhdGggKyAiL0BzdHlsZSIsIGQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VGhhdCgiUGFyYW1ldGVyICciICsgcE5hbWUgKyAiJyBzdHlsZSBkb2VzIG5vdCBtYXRjaC4iLCBwU3R5bGUsIGVxdWFsVG8oc3R5bGUpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcGFyYW1TdHlsZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIHBhcmFtU3R5bGVzLnB1dCgiaHAiLCAiaGVhZGVyIik7CisgICAgICAgICAgICBwYXJhbVN0eWxlcy5wdXQoInEiLCAicXVlcnkiKTsKKworICAgICAgICAgICAgLy8gY2hlY2sgdGhlIG51bWJlciBvZiByZXF1ZXN0IHBhcmFtcworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJlcXVlc3RQYXJhbXNDb3VudFhQYXRoID0gU3RyaW5nLmZvcm1hdCgiY291bnQoJXMvd2FkbDpyZXF1ZXN0L3dhZGw6cGFyYW0pIiwgbWV0aG9kUGF0aCk7CisgICAgICAgICAgICBmaW5hbCBpbnQgcmVxdWVzdFBhcmFtc0NvdW50ID0gKChEb3VibGUpIHhwLmV2YWx1YXRlKHJlcXVlc3RQYXJhbXNDb3VudFhQYXRoLCBkLCBYUGF0aENvbnN0YW50cy5OVU1CRVIpKS5pbnRWYWx1ZSgpOworICAgICAgICAgICAgYXNzZXJ0VGhhdCgiTnVtYmVyIG9mIHJlcXVlc3QgcGFyYW1ldGVycyBkb2VzIG5vdCBtYXRjaC4iLCByZXF1ZXN0UGFyYW1zQ291bnQsIGVxdWFsVG8oMikpOworCisgICAgICAgICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxTdHJpbmcsIFN0cmluZz4gcGFyYW0gOiBwYXJhbVN0eWxlcy5lbnRyeVNldCgpKSB7CisKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcE5hbWUgPSBwYXJhbS5nZXRLZXkoKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcFN0eWxlID0gcGFyYW0uZ2V0VmFsdWUoKTsKKworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwYXJhbVhQYXRoID0gU3RyaW5nLmZvcm1hdCgiJXMvd2FkbDpyZXF1ZXN0L3dhZGw6cGFyYW1bQG5hbWU9JyVzJ10iLCBtZXRob2RQYXRoLCBwTmFtZSk7CisKKyAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGF0IHRoZSBudW1iZXIgb2YgcGFyYW1zIGlzIG9uZQorICAgICAgICAgICAgICAgIGZpbmFsIGludCBwYyA9ICgoRG91YmxlKSB4cC5ldmFsdWF0ZSgiY291bnQoIiArIHBhcmFtWFBhdGggKyAiKSIsIGQsIFhQYXRoQ29uc3RhbnRzLk5VTUJFUikpLmludFZhbHVlKCk7CisgICAgICAgICAgICAgICAgYXNzZXJ0VGhhdCgiTnVtYmVyIG9mICIgKyBwU3R5bGUgKyAiIHBhcmFtZXRlcnMgJyIgKyBwTmFtZSArICInIGRvZXMgbm90IG1hdGNoLiIsIHBjLCBlcXVhbFRvKDEpKTsKKworICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRoZSBzdHlsZSBvZiB0aGUgcGFyYW0KKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc3R5bGUgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZShwYXJhbVhQYXRoICsgIi9Ac3R5bGUiLCBkLCBYUGF0aENvbnN0YW50cy5TVFJJTkcpOworICAgICAgICAgICAgICAgIGFzc2VydFRoYXQoIlBhcmFtZXRlciAnIiArIHBOYW1lICsgIicgc3R5bGUgZG9lcyBub3QgbWF0Y2guIiwgcFN0eWxlLCBlcXVhbFRvKHN0eWxlKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBPUFRJT05TIG1ldGhvZCBvbiBhIHJlc291cmNlIG1ldGhvZCBhbm5vdGF0ZWQgd2l0aCBAUGF0aCBhbmQgY29udGFpbmluZyBhIGxlYWRpbmcgJy8nLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgV2FkbDZUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICAgICAgQFBhdGgoIndhZGw2dGVzdCIpCisgICAgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgICAgICBAR0VUCisgICAgICAgICAgICBAUGF0aCgiZm9vMSIpCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGZvbzEoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJmb28xIjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQEdFVAorICAgICAgICAgICAgQFBhdGgoIi9mb28yIikKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZm9vMigpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gImZvbzIiOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAR0VUCisgICAgICAgICAgICBAUGF0aCgiZm9vMy8iKQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBmb28zKCkgeworICAgICAgICAgICAgICAgIHJldHVybiAiZm9vMyI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBHRVQKKyAgICAgICAgICAgIEBQYXRoKCIvZm9vNC8iKQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBmb280KCkgeworICAgICAgICAgICAgICAgIHJldHVybiAiZm9vNCI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisgICAgICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworCisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRXaXRoUGF0aEFuZExlYWRpbmdTbGFzaCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCA1OyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmdbXSBwYXRocyA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICJmb28iICsgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICIvZm9vIiArIGksCisgICAgICAgICAgICAgICAgICAgICAgICAiZm9vIiArIGkgKyAnLycsCisgICAgICAgICAgICAgICAgICAgICAgICAiL2ZvbyIgKyBpICsgJy8nCisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIGZvciAoZmluYWwgU3RyaW5nIHBhdGggOiBwYXRocykgeworICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgid2FkbDZ0ZXN0IikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAucGF0aChwYXRoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCJhcHBsaWNhdGlvbi92bmQuc3VuLndhZGwreG1sIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAub3B0aW9ucygpOworICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBkb2N1bWVudCA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGF0IHRoZSByZXN1bHRpbmcgZG9jdW1lbnQgY29udGFpbnMgYSBtZXRob2QgZWxlbWVudCB3aXRoIGlkPSJmb29YIgorICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKGRvY3VtZW50LnJlcGxhY2VBbGwoIlxuIiwgIiAiKS5tYXRjaGVzKCIuKjxtZXRob2RbXj5dK2lkPVwiZm9vIiArIGkgKyAiXCJbXj5dKj4uKiIpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFdhZGw4VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZUEuY2xhc3MsIFJlc291cmNlQi5jbGFzcywgUmVzb3VyY2VTcGVjaWZpYy5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgie2F9IikKKyAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZUEgeworCisgICAgICAgICAgICBAR0VUCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEEoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJhIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJ7Yn0iKQorICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlQiB7CisKKyAgICAgICAgICAgIEBQT1NUCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3RCKGZpbmFsIFN0cmluZyBzdHIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gImIiOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInJlc291cmNlIikKKyAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZVNwZWNpZmljIHsKKworICAgICAgICAgICAgQEdFVAorICAgICAgICAgICAgQFBhdGgoInt0ZW1wbGF0ZUF9IikKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGVtcGxhdGVBKCkgeworICAgICAgICAgICAgICAgIHJldHVybiAidGVtcGxhdGUtYSI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBQT1NUCisgICAgICAgICAgICBAUGF0aCgie3RlbXBsYXRlQn0iKQorICAgICAgICAgICAgcHVibGljIFN0cmluZyBwb3N0VGVtcGxhdGVCKGZpbmFsIFN0cmluZyBzdHIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gInRlbXBsYXRlLWIiOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgQElnbm9yZSgiSkVSU0VZLTE2NzA6IFdBREwgT3B0aW9ucyBpbnZva2VkIG9uIHJlc291cmNlcyB3aXRoIHNhbWUgdGVtcGxhdGUgcmV0dXJucyBvbmx5IG1ldGhvZHMgZnJvbSBvbmUgb2YgdGhlbS4iKQorICAgICAgICAvLyBUT0RPOiBmaXgKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdFdhZGxGb3JBbWJpZ3VvdXNSZXNvdXJjZVRlbXBsYXRlcygpCisgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFhQYXRoRXhwcmVzc2lvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoImZvbyIpLnJlcXVlc3QoTWVkaWFUeXBlcy5XQURMX1RZUEUpLm9wdGlvbnMoKTsKKyAgICAgICAgICAgIGZpbmFsIERvY3VtZW50IGQgPSBleHRyYWN0V2FkbEFzRG9jdW1lbnQocmVzcG9uc2UpOworICAgICAgICAgICAgZmluYWwgWFBhdGggeHAgPSBYUGF0aEZhY3RvcnkubmV3SW5zdGFuY2UoKS5uZXdYUGF0aCgpOworICAgICAgICAgICAgeHAuc2V0TmFtZXNwYWNlQ29udGV4dChuZXcgU2ltcGxlTmFtZXNwYWNlUmVzb2x2ZXIoIndhZGwiLCAiaHR0cDovL3dhZGwuZGV2LmphdmEubmV0LzIwMDkvMDIiKSk7CisKKyAgICAgICAgICAgIFN0cmluZyByZXN1bHQgPSAoU3RyaW5nKSB4cC5ldmFsdWF0ZSgiLy93YWRsOnJlc291cmNlL3dhZGw6bWV0aG9kW0BuYW1lPSdHRVQnXS9AaWQiLCBkLCBYUGF0aENvbnN0YW50cy5TVFJJTkcpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJnZXRBIiwgcmVzdWx0KTsKKworICAgICAgICAgICAgcmVzdWx0ID0gKFN0cmluZykgeHAuZXZhbHVhdGUoIi8vd2FkbDpyZXNvdXJjZS93YWRsOm1ldGhvZFtAbmFtZT0nUE9TVCddL0BpZCIsIGQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInBvc3RCIiwgcmVzdWx0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIEBJZ25vcmUoIkpFUlNFWS0xNjcwOiBXQURMIE9wdGlvbnMgaW52b2tlZCBvbiByZXNvdXJjZXMgd2l0aCBzYW1lIHRlbXBsYXRlIHJldHVybnMgb25seSBtZXRob2RzIGZyb20gb25lIG9mIHRoZW0uIikKKyAgICAgICAgLy8gVE9ETzogZml4CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RXYWRsRm9yQW1iaWd1b3VzQ2hpbGRSZXNvdXJjZVRlbXBsYXRlcygpCisgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFhQYXRoRXhwcmVzc2lvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlL2JhciIpLnJlcXVlc3QoTWVkaWFUeXBlcy5XQURMX1RZUEUpLm9wdGlvbnMoKTsKKworICAgICAgICAgICAgZmluYWwgRG9jdW1lbnQgZCA9IGV4dHJhY3RXYWRsQXNEb2N1bWVudChyZXNwb25zZSk7CisgICAgICAgICAgICBmaW5hbCBYUGF0aCB4cCA9IFhQYXRoRmFjdG9yeS5uZXdJbnN0YW5jZSgpLm5ld1hQYXRoKCk7CisgICAgICAgICAgICB4cC5zZXROYW1lc3BhY2VDb250ZXh0KG5ldyBTaW1wbGVOYW1lc3BhY2VSZXNvbHZlcigid2FkbCIsICJodHRwOi8vd2FkbC5kZXYuamF2YS5uZXQvMjAwOS8wMiIpKTsKKworICAgICAgICAgICAgU3RyaW5nIHJlc3VsdCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKCIvL3dhZGw6cmVzb3VyY2Uvd2FkbDptZXRob2RbQG5hbWU9J0dFVCddL0BpZCIsIGQsIFhQYXRoQ29uc3RhbnRzLlNUUklORyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImdldFRlbXBsYXRlQSIsIHJlc3VsdCk7CisKKyAgICAgICAgICAgIHJlc3VsdCA9IChTdHJpbmcpIHhwLmV2YWx1YXRlKCIvL3dhZGw6cmVzb3VyY2Uvd2FkbDptZXRob2RbQG5hbWU9J1BPU1QnXS9AaWQiLCBkLCBYUGF0aENvbnN0YW50cy5TVFJJTkcpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJwb3N0VGVtcGxhdGVCIiwgcmVzdWx0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHVzYWdlIG9mIHByb3BlcnR5IHtAbGluayBTZXJ2ZXJQcm9wZXJ0aWVzI01FVEFJTkZfU0VSVklDRVNfTE9PS1VQX0RJU0FCTEV9LiBXYWRsIGlzIHJlZ2lzdGVyZWQgYXV0b21hdGljYWxseSBldmVyeQorICAgICAqIHRpbWUgYW5kIGNhbiBiZSB0dXJuZWQgb2ZmIG9ubHkgdmlhIHtAbGluayBTZXJ2ZXJQcm9wZXJ0aWVzI1dBRExfRkVBVFVSRV9ESVNBQkxFfS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFdhZGw5VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgICAgIEBQYXRoKCJ3YWRsOXRlc3QiKQorICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICAgICAgQEdFVAorICAgICAgICAgICAgcHVibGljIFN0cmluZyBmb28oKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICJmb28iOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gLy8gY2xhc3MgUmVzb3VyY2UKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgICAgIHJlc291cmNlQ29uZmlnLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuTUVUQUlORl9TRVJWSUNFU19MT09LVVBfRElTQUJMRSwgdHJ1ZSk7CisKKyAgICAgICAgICAgIHJldHVybiByZXNvdXJjZUNvbmZpZzsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RXYWRsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiL2FwcGxpY2F0aW9uLndhZGwiKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5oYXNFbnRpdHkoKSwgaXModHJ1ZSkpOworICAgICAgICB9CisKKyAgICB9IC8vIGNsYXNzIFdhZGw5VGVzdAorCisgICAgLyoqCisgICAgICogVGVzdHMgd2hldGhlciBib29sZWFuIGdldHRlcnMgaGF2ZSBiZWVuIGdlbmVyYXRlZCB3aXRoICJpcyIgcHJlZml4LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgV2FkbDEwVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgICAgIEBQYXRoKCJ3YWRsMTB0ZXN0IikKKyAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgICAgIEBHRVQKKyAgICAgICAgICAgIHB1YmxpYyBCb29sZWFuIGZvbyhAUXVlcnlQYXJhbSgicSIpIGZpbmFsIEJvb2xlYW4gcSkgeworICAgICAgICAgICAgICAgIHJldHVybiBxOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gLy8gY2xhc3MgUmVzb3VyY2UKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdFdhZGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCIvYXBwbGljYXRpb24ud2FkbCIpLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmhhc0VudGl0eSgpLCBpcyh0cnVlKSk7CisKKyAgICAgICAgICAgIGZpbmFsIE1ldGhvZCBtZXRob2QgPSAoTWV0aG9kKSByZXNwb25zZS5yZWFkRW50aXR5KGNvbS5zdW4ucmVzZWFyY2gud3Mud2FkbC5BcHBsaWNhdGlvbi5jbGFzcykgLy8gd2FkbAorICAgICAgICAgICAgICAgICAgICAuZ2V0UmVzb3VyY2VzKCkuZ2V0KDApLmdldFJlc291cmNlKCkuZ2V0KDApIC8vIHJlc291cmNlCisgICAgICAgICAgICAgICAgICAgIC5nZXRNZXRob2RPclJlc291cmNlKCkuZ2V0KDApOyAvLyBtZXRob2QKKyAgICAgICAgICAgIGZpbmFsIFBhcmFtIHBhcmFtID0gbWV0aG9kLmdldFJlcXVlc3QoKS5nZXRQYXJhbSgpLmdldCgwKTsgLy8gcGFyYW0KKworICAgICAgICAgICAgLy8gbm90IGludGVyZXN0ZWQgaW4gcmV0dXJuZWQgdmFsdWUsIG9ubHkgd2hldGhlciB3ZSBjYW4gY29tcGlsZS4KKyAgICAgICAgICAgIGFzc2VydFRoYXQocGFyYW0uaXNSZXF1aXJlZCgpLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHBhcmFtLmlzUmVwZWF0aW5nKCksIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgfQorCisgICAgfSAvLyBjbGFzcyBXYWRsMTBUZXN0CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB3aGV0aGVyIHVua25vd24gYW5ub3RhdGlvbiBhZmZlY3RzIGEgV0FETCBjb3JyZWN0bmVzcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFdhZGwxMVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgICAgICBAVGFyZ2V0KHtFbGVtZW50VHlwZS5QQVJBTUVURVIsIEVsZW1lbnRUeXBlLk1FVEhPRCwgRWxlbWVudFR5cGUuVFlQRX0pCisgICAgICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCisgICAgICAgIEBJbmhlcml0ZWQKKyAgICAgICAgcHVibGljIEBpbnRlcmZhY2UgVW5rbm93bkFubm90YXRpb24geworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImFubm90YXRlZCIpCisgICAgICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgICAgIEBVbmtub3duQW5ub3RhdGlvbgorICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFubm90YXRlZCB7CisKKyAgICAgICAgICAgIEBQYXRoKCJzdWJyZXNvdXJjZSIpCisgICAgICAgICAgICBAUE9TVAorICAgICAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9qc29uIikKKyAgICAgICAgICAgIEBVbmtub3duQW5ub3RhdGlvbgorICAgICAgICAgICAgcHVibGljIEVudGl0eSBteU1ldGhvZDEoQFVua25vd25Bbm5vdGF0aW9uIGZpbmFsIEVudGl0eSBlbnRpdHkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZW50aXR5OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAUGF0aCgic3VicmVzb3VyY2UiKQorICAgICAgICAgICAgQFBPU1QKKyAgICAgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24veG1sIikKKyAgICAgICAgICAgIHB1YmxpYyBFbnRpdHkgbXlNZXRob2QyKEBVbmtub3duQW5ub3RhdGlvbiBmaW5hbCBFbnRpdHkgZW50aXR5KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVudGl0eTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoIm5vdC1hbm5vdGF0ZWQiKQorICAgICAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBsYWluIHsKKworICAgICAgICAgICAgQFBhdGgoInN1YnJlc291cmNlIikKKyAgICAgICAgICAgIEBQT1NUCisgICAgICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgICAgICAgICAgcHVibGljIEVudGl0eSBteU1ldGhvZDEoZmluYWwgRW50aXR5IGVudGl0eSkgeworICAgICAgICAgICAgICAgIHJldHVybiBlbnRpdHk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBQYXRoKCJzdWJyZXNvdXJjZSIpCisgICAgICAgICAgICBAUE9TVAorICAgICAgICAgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi94bWwiKQorICAgICAgICAgICAgcHVibGljIEVudGl0eSBteU1ldGhvZDIoZmluYWwgRW50aXR5IGVudGl0eSkgeworICAgICAgICAgICAgICAgIHJldHVybiBlbnRpdHk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhBbm5vdGF0ZWQuY2xhc3MsIFBsYWluLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RXYWRsSXNDb21wbGV0ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoIi9hcHBsaWNhdGlvbi53YWRsIikucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcygyMDApKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuaGFzRW50aXR5KCksIGlzKHRydWUpKTsKKworICAgICAgICAgICAgZmluYWwgY29tLnN1bi5yZXNlYXJjaC53cy53YWRsLkFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UucmVhZEVudGl0eShjb20uc3VuLnJlc2VhcmNoLndzLndhZGwuQXBwbGljYXRpb24uY2xhc3MpOworCisgICAgICAgICAgICAvLyAiYW5ub3RhdGVkL3N1YnJlc291cmNlIgorICAgICAgICAgICAgZmluYWwgUmVzb3VyY2UgcmVzb3VyY2UgPQorICAgICAgICAgICAgICAgICAgICAoUmVzb3VyY2UpIGFwcGxpY2F0aW9uLmdldFJlc291cmNlcygpLmdldCgwKS5nZXRSZXNvdXJjZSgpLmdldCgwKS5nZXRNZXRob2RPclJlc291cmNlKCkuZ2V0KDApOworCisgICAgICAgICAgICBhc3NlcnRUaGF0TWV0aG9kQ29udGFpbnNSUihyZXNvdXJjZSwgIm15TWV0aG9kMSIsIDApOworICAgICAgICAgICAgYXNzZXJ0VGhhdE1ldGhvZENvbnRhaW5zUlIocmVzb3VyY2UsICJteU1ldGhvZDIiLCAxKTsKKworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRUaGF0TWV0aG9kQ29udGFpbnNSUihmaW5hbCBSZXNvdXJjZSByZXNvdXJjZSwgZmluYWwgU3RyaW5nIG1ldGhvZE5hbWUsIGZpbmFsIGludCBtZXRob2RJbmRleCkgeworICAgICAgICAgICAgZmluYWwgTWV0aG9kIG1ldGhvZCA9IChNZXRob2QpIHJlc291cmNlLmdldE1ldGhvZE9yUmVzb3VyY2UoKS5nZXQobWV0aG9kSW5kZXgpOworCisgICAgICAgICAgICBhc3NlcnRUaGF0KG1ldGhvZC5nZXRJZCgpLCBlcXVhbFRvKG1ldGhvZE5hbWUpKTsKKworICAgICAgICAgICAgZmluYWwgUmVxdWVzdCByZXF1ZXN0ID0gbWV0aG9kLmdldFJlcXVlc3QoKTsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8Y29tLnN1bi5yZXNlYXJjaC53cy53YWRsLlJlc3BvbnNlPiByZXNwb25zZSA9IG1ldGhvZC5nZXRSZXNwb25zZSgpOworCisgICAgICAgICAgICBhc3NlcnRUaGF0KHJlcXVlc3QsIG5vdE51bGxWYWx1ZSgpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuaXNFbXB0eSgpLCBpcyhmYWxzZSkpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdFdhZGxJc1NhbWVGb3JBbm5vdGF0ZWRBbmROb3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoIi9hcHBsaWNhdGlvbi53YWRsIikucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgICAgICBmaW5hbCBEb2N1bWVudCBkb2N1bWVudCA9IGV4dHJhY3RXYWRsQXNEb2N1bWVudChyZXNwb25zZSk7CisKKyAgICAgICAgICAgIGZpbmFsIFhQYXRoIHhwID0gWFBhdGhGYWN0b3J5Lm5ld0luc3RhbmNlKCkubmV3WFBhdGgoKTsKKyAgICAgICAgICAgIGZpbmFsIFNpbXBsZU5hbWVzcGFjZVJlc29sdmVyIG5zQ29udGV4dCA9IG5ldyBTaW1wbGVOYW1lc3BhY2VSZXNvbHZlcigid2FkbCIsICJodHRwOi8vd2FkbC5kZXYuamF2YS5uZXQvMjAwOS8wMiIpOworICAgICAgICAgICAgeHAuc2V0TmFtZXNwYWNlQ29udGV4dChuc0NvbnRleHQpOworCisgICAgICAgICAgICBmaW5hbCBEaWZmIGRpZmYgPSBYTUxVbml0LmNvbXBhcmVYTUwoCisgICAgICAgICAgICAgICAgICAgIG5vZGVBc1N0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4cC5ldmFsdWF0ZSgiLy93YWRsOnJlc291cmNlW0BwYXRoPSdhbm5vdGF0ZWQnXS93YWRsOnJlc291cmNlIiwgZG9jdW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYUGF0aENvbnN0YW50cy5OT0RFKSksCisgICAgICAgICAgICAgICAgICAgIG5vZGVBc1N0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB4cC5ldmFsdWF0ZSgiLy93YWRsOnJlc291cmNlW0BwYXRoPSdub3QtYW5ub3RhdGVkJ10vd2FkbDpyZXNvdXJjZSIsIGRvY3VtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWFBhdGhDb25zdGFudHMuTk9ERSkpCisgICAgICAgICAgICApOworICAgICAgICAgICAgWE1MVW5pdC5zZXRYcGF0aE5hbWVzcGFjZUNvbnRleHQoCisgICAgICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVOYW1lc3BhY2VDb250ZXh0KEltbXV0YWJsZU1hcC5vZigid2FkbCIsICJodHRwOi8vd2FkbC5kZXYuamF2YS5uZXQvMjAwOS8wMiIpKSk7CisgICAgICAgICAgICBmaW5hbCBFbGVtZW50UXVhbGlmaWVyIGVsZW1lbnRRdWFsaWZpZXIgPSBuZXcgUmVjdXJzaXZlRWxlbWVudE5hbWVBbmRUZXh0UXVhbGlmaWVyKCk7CisgICAgICAgICAgICBkaWZmLm92ZXJyaWRlRWxlbWVudFF1YWxpZmllcihlbGVtZW50UXVhbGlmaWVyKTsKKyAgICAgICAgICAgIFhNTEFzc2VydC5hc3NlcnRYTUxFcXVhbChkaWZmLCB0cnVlKTsKKworICAgICAgICB9CisKKyAgICB9IC8vIGNsYXNzIFdhZGwxMVRlc3QKKworCisgICAgQFhtbFJvb3RFbGVtZW50KG5hbWUgPSAiamF4YkJlYW4iKQorICAgIHB1YmxpYyBjbGFzcyBKYXhiQmVhbiB7CisKKyAgICAgICAgcHVibGljIFN0cmluZyB2YWx1ZTsKKworICAgICAgICBwdWJsaWMgSmF4YkJlYW4oKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSmF4YkJlYW4oU3RyaW5nIHN0cikgeworICAgICAgICAgICAgdmFsdWUgPSBzdHI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBKYXhiQmVhbikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKChKYXhiQmVhbikgbykudmFsdWUuZXF1YWxzKHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gIkpBWEJDbGFzczogIiArIHZhbHVlOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvQ3VzdG9tVmlld2FibGVDb250ZXh0L2luZGV4LnRlc3RwIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvQ3VzdG9tVmlld2FibGVDb250ZXh0L2luZGV4LnRlc3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9DdXN0b21WaWV3YWJsZUNvbnRleHQvaW5kZXgudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL2phdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlciBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL2phdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODEyMjdjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyCkBAIC0wLDAgKzEgQEAKK29yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5zZXJ2ZXIuQWJzdHJhY3REaXNhYmxlTWV0YWluZlNlcnZpY2VzTG9va3VwVGVzdCRVc2VsZXNzTWVzc2FnZVByb3ZpZGVyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4MTIyN2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9qYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXIKQEAgLTAsMCArMSBAQAorb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNlcnZlci5BYnN0cmFjdERpc2FibGVNZXRhaW5mU2VydmljZXNMb29rdXBUZXN0JFVzZWxlc3NNZXNzYWdlUHJvdmlkZXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5zcGkuRm9yY2VkQXV0b0Rpc2NvdmVyYWJsZSBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnNwaS5Gb3JjZWRBdXRvRGlzY292ZXJhYmxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjZGQ3NTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5zcGkuRm9yY2VkQXV0b0Rpc2NvdmVyYWJsZQpAQCAtMCwwICsxIEBACitvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLm1vbml0b3JpbmcuQXBwbGljYXRpb25JbmZvVGVzdCRGb3JjZWRBdXRvRGlzY292ZXJhYmxlSW1wbApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvVmFsaWRhdGlvbk1lc3NhZ2VzLnByb3BlcnRpZXMgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9WYWxpZGF0aW9uTWVzc2FnZXMucHJvcGVydGllcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDQ0MGU5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvVmFsaWRhdGlvbk1lc3NhZ2VzLnByb3BlcnRpZXMKQEAgLTAsMCArMSwxNyBAQAorIworIyBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisjIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyMKKyMgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorIyBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisjIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorIyB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisjCisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorIworCitvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuc2VydmVyLnZhbGlkYXRpb24uTm9uRW1wdHlOYW1lcy5tZXNzYWdlPWF0IGxlYXN0IG9uZSBvZiB0aGUgbmFtZXMgaXMgZW1wdHkKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0JlYW5WYWxpZGF0aW9uRXJyb3JUZW1wbGF0ZVRlc3QvRXJyb3JUZW1wbGF0ZVJlc291cmNlL2luZGV4LnRlc3RwIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvQmVhblZhbGlkYXRpb25FcnJvclRlbXBsYXRlVGVzdC9FcnJvclRlbXBsYXRlUmVzb3VyY2UvaW5kZXgudGVzdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0JlYW5WYWxpZGF0aW9uRXJyb3JUZW1wbGF0ZVRlc3QvRXJyb3JUZW1wbGF0ZVJlc291cmNlL2luZGV4LnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FcnJvclRlbXBsYXRlVGVzdC9DdXN0b21SZXNvbHZpbmdDbGFzcy9pbmRleC5hYmMgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FcnJvclRlbXBsYXRlVGVzdC9DdXN0b21SZXNvbHZpbmdDbGFzcy9pbmRleC5hYmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0Vycm9yVGVtcGxhdGVUZXN0L0N1c3RvbVJlc29sdmluZ0NsYXNzL2luZGV4LmFiYwpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXJyb3JUZW1wbGF0ZVRlc3QvQ3VzdG9tUmVzb2x2aW5nQ2xhc3MvaW5kZXgudGVzdHAgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FcnJvclRlbXBsYXRlVGVzdC9DdXN0b21SZXNvbHZpbmdDbGFzcy9pbmRleC50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXJyb3JUZW1wbGF0ZVRlc3QvQ3VzdG9tUmVzb2x2aW5nQ2xhc3MvaW5kZXgudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0Vycm9yVGVtcGxhdGVUZXN0L0N1c3RvbVJlc29sdmluZ0NsYXNzL3JlbGF0aXZlLmFiYyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0Vycm9yVGVtcGxhdGVUZXN0L0N1c3RvbVJlc29sdmluZ0NsYXNzL3JlbGF0aXZlLmFiYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXJyb3JUZW1wbGF0ZVRlc3QvQ3VzdG9tUmVzb2x2aW5nQ2xhc3MvcmVsYXRpdmUuYWJjCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FcnJvclRlbXBsYXRlVGVzdC9DdXN0b21SZXNvbHZpbmdDbGFzcy9yZWxhdGl2ZS50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0Vycm9yVGVtcGxhdGVUZXN0L0N1c3RvbVJlc29sdmluZ0NsYXNzL3JlbGF0aXZlLnRlc3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FcnJvclRlbXBsYXRlVGVzdC9DdXN0b21SZXNvbHZpbmdDbGFzcy9yZWxhdGl2ZS50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXJyb3JUZW1wbGF0ZVRlc3QvRXJyb3JUZW1wbGF0ZVJlc291cmNlL2Fic29sdXRlLmFiYyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0Vycm9yVGVtcGxhdGVUZXN0L0Vycm9yVGVtcGxhdGVSZXNvdXJjZS9hYnNvbHV0ZS5hYmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0Vycm9yVGVtcGxhdGVUZXN0L0Vycm9yVGVtcGxhdGVSZXNvdXJjZS9hYnNvbHV0ZS5hYmMKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0Vycm9yVGVtcGxhdGVUZXN0L0Vycm9yVGVtcGxhdGVSZXNvdXJjZS9hYnNvbHV0ZS50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0Vycm9yVGVtcGxhdGVUZXN0L0Vycm9yVGVtcGxhdGVSZXNvdXJjZS9hYnNvbHV0ZS50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXJyb3JUZW1wbGF0ZVRlc3QvRXJyb3JUZW1wbGF0ZVJlc291cmNlL2Fic29sdXRlLnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FcnJvclRlbXBsYXRlVGVzdC9FcnJvclRlbXBsYXRlUmVzb3VyY2UvaW5kZXgudGVzdHAgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FcnJvclRlbXBsYXRlVGVzdC9FcnJvclRlbXBsYXRlUmVzb3VyY2UvaW5kZXgudGVzdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0Vycm9yVGVtcGxhdGVUZXN0L0Vycm9yVGVtcGxhdGVSZXNvdXJjZS9pbmRleC50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXJyb3JUZW1wbGF0ZVRlc3QvRXJyb3JUZW1wbGF0ZVJlc291cmNlL3JlbGF0aXZlLnRlc3RwIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXJyb3JUZW1wbGF0ZVRlc3QvRXJyb3JUZW1wbGF0ZVJlc291cmNlL3JlbGF0aXZlLnRlc3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FcnJvclRlbXBsYXRlVGVzdC9FcnJvclRlbXBsYXRlUmVzb3VyY2UvcmVsYXRpdmUudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0Vycm9yVGVtcGxhdGVUZXN0L0Vycm9yVGVtcGxhdGVTdWJSZXNvdXJjZS9hYnNvbHV0ZS50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0Vycm9yVGVtcGxhdGVUZXN0L0Vycm9yVGVtcGxhdGVTdWJSZXNvdXJjZS9hYnNvbHV0ZS50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXJyb3JUZW1wbGF0ZVRlc3QvRXJyb3JUZW1wbGF0ZVN1YlJlc291cmNlL2Fic29sdXRlLnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FcnJvclRlbXBsYXRlVGVzdC9FcnJvclRlbXBsYXRlU3ViUmVzb3VyY2UvaW5kZXgudGVzdHAgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FcnJvclRlbXBsYXRlVGVzdC9FcnJvclRlbXBsYXRlU3ViUmVzb3VyY2UvaW5kZXgudGVzdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0Vycm9yVGVtcGxhdGVUZXN0L0Vycm9yVGVtcGxhdGVTdWJSZXNvdXJjZS9pbmRleC50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXJyb3JUZW1wbGF0ZVRlc3QvRXJyb3JUZW1wbGF0ZVN1YlJlc291cmNlL3JlbGF0aXZlLnRlc3RwIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXJyb3JUZW1wbGF0ZVRlc3QvRXJyb3JUZW1wbGF0ZVN1YlJlc291cmNlL3JlbGF0aXZlLnRlc3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FcnJvclRlbXBsYXRlVGVzdC9FcnJvclRlbXBsYXRlU3ViUmVzb3VyY2UvcmVsYXRpdmUudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4Y2VwdGlvblZpZXdQcm9jZXNzb3JUZXN0LzQwNC50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4Y2VwdGlvblZpZXdQcm9jZXNzb3JUZXN0LzQwNC50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhjZXB0aW9uVmlld1Byb2Nlc3NvclRlc3QvNDA0LnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeGNlcHRpb25WaWV3UHJvY2Vzc29yVGVzdC9XZWJBcHBFeGNlcHRpb25NYXBwZXIvNDA2LnRlc3RwIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhjZXB0aW9uVmlld1Byb2Nlc3NvclRlc3QvV2ViQXBwRXhjZXB0aW9uTWFwcGVyLzQwNi50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhjZXB0aW9uVmlld1Byb2Nlc3NvclRlc3QvV2ViQXBwRXhjZXB0aW9uTWFwcGVyLzQwNi50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRQcm9kdWNlVGVtcGxhdGVUZXN0L0V4cGxpY2l0Tm9Qcm9kdWNlc1RlbXBsYXRlL2luZGV4LmFiYyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0UHJvZHVjZVRlbXBsYXRlVGVzdC9FeHBsaWNpdE5vUHJvZHVjZXNUZW1wbGF0ZS9pbmRleC5hYmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0UHJvZHVjZVRlbXBsYXRlVGVzdC9FeHBsaWNpdE5vUHJvZHVjZXNUZW1wbGF0ZS9pbmRleC5hYmMKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0UHJvZHVjZVRlbXBsYXRlVGVzdC9FeHBsaWNpdE5vUHJvZHVjZXNUZW1wbGF0ZS9pbmRleC5kZWYgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFByb2R1Y2VUZW1wbGF0ZVRlc3QvRXhwbGljaXROb1Byb2R1Y2VzVGVtcGxhdGUvaW5kZXguZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFByb2R1Y2VUZW1wbGF0ZVRlc3QvRXhwbGljaXROb1Byb2R1Y2VzVGVtcGxhdGUvaW5kZXguZGVmCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFByb2R1Y2VUZW1wbGF0ZVRlc3QvRXhwbGljaXRUZW1wbGF0ZVByb2R1Y2VzQ2xhc3MvYWJzb2x1dGUuYWJjIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRQcm9kdWNlVGVtcGxhdGVUZXN0L0V4cGxpY2l0VGVtcGxhdGVQcm9kdWNlc0NsYXNzL2Fic29sdXRlLmFiYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRQcm9kdWNlVGVtcGxhdGVUZXN0L0V4cGxpY2l0VGVtcGxhdGVQcm9kdWNlc0NsYXNzL2Fic29sdXRlLmFiYwpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRQcm9kdWNlVGVtcGxhdGVUZXN0L0V4cGxpY2l0VGVtcGxhdGVQcm9kdWNlc0NsYXNzL2luZGV4LmFiYyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0UHJvZHVjZVRlbXBsYXRlVGVzdC9FeHBsaWNpdFRlbXBsYXRlUHJvZHVjZXNDbGFzcy9pbmRleC5hYmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0UHJvZHVjZVRlbXBsYXRlVGVzdC9FeHBsaWNpdFRlbXBsYXRlUHJvZHVjZXNDbGFzcy9pbmRleC5hYmMKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0UHJvZHVjZVRlbXBsYXRlVGVzdC9FeHBsaWNpdFRlbXBsYXRlUHJvZHVjZXNDbGFzcy9yZWxhdGl2ZS5hYmMgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFByb2R1Y2VUZW1wbGF0ZVRlc3QvRXhwbGljaXRUZW1wbGF0ZVByb2R1Y2VzQ2xhc3MvcmVsYXRpdmUuYWJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFByb2R1Y2VUZW1wbGF0ZVRlc3QvRXhwbGljaXRUZW1wbGF0ZVByb2R1Y2VzQ2xhc3MvcmVsYXRpdmUuYWJjCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFByb2R1Y2VUZW1wbGF0ZVRlc3QvRXhwbGljaXRUd29HZXRQcm9kdWNlc1RlbXBsYXRlL2luZGV4LmFiYyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0UHJvZHVjZVRlbXBsYXRlVGVzdC9FeHBsaWNpdFR3b0dldFByb2R1Y2VzVGVtcGxhdGUvaW5kZXguYWJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFByb2R1Y2VUZW1wbGF0ZVRlc3QvRXhwbGljaXRUd29HZXRQcm9kdWNlc1RlbXBsYXRlL2luZGV4LmFiYwpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRQcm9kdWNlVGVtcGxhdGVUZXN0L0V4cGxpY2l0VHdvR2V0UHJvZHVjZXNUZW1wbGF0ZS9pbmRleC5kZWYgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFByb2R1Y2VUZW1wbGF0ZVRlc3QvRXhwbGljaXRUd29HZXRQcm9kdWNlc1RlbXBsYXRlL2luZGV4LmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRQcm9kdWNlVGVtcGxhdGVUZXN0L0V4cGxpY2l0VHdvR2V0UHJvZHVjZXNUZW1wbGF0ZS9pbmRleC5kZWYKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0UHJvZHVjZVRlbXBsYXRlVGVzdC9FeHBsaWNpdFdpbGRjYXJkUHJvZHVjZXNUZW1wbGF0ZS9pbmRleC5hYmMgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFByb2R1Y2VUZW1wbGF0ZVRlc3QvRXhwbGljaXRXaWxkY2FyZFByb2R1Y2VzVGVtcGxhdGUvaW5kZXguYWJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFByb2R1Y2VUZW1wbGF0ZVRlc3QvRXhwbGljaXRXaWxkY2FyZFByb2R1Y2VzVGVtcGxhdGUvaW5kZXguYWJjCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFByb2R1Y2VUZW1wbGF0ZVRlc3QvRXhwbGljaXRXaWxkY2FyZFByb2R1Y2VzVGVtcGxhdGUvaW5kZXguZGVmIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRQcm9kdWNlVGVtcGxhdGVUZXN0L0V4cGxpY2l0V2lsZGNhcmRQcm9kdWNlc1RlbXBsYXRlL2luZGV4LmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRQcm9kdWNlVGVtcGxhdGVUZXN0L0V4cGxpY2l0V2lsZGNhcmRQcm9kdWNlc1RlbXBsYXRlL2luZGV4LmRlZgpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRUZW1wbGF0ZVRlc3QvQ3VzdG9tUmVzb2x2aW5nQ2xhc3MvaW5kZXguYWJjIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRUZW1wbGF0ZVRlc3QvQ3VzdG9tUmVzb2x2aW5nQ2xhc3MvaW5kZXguYWJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFRlbXBsYXRlVGVzdC9DdXN0b21SZXNvbHZpbmdDbGFzcy9pbmRleC5hYmMKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0VGVtcGxhdGVUZXN0L0N1c3RvbVJlc29sdmluZ0NsYXNzL2luZGV4LnRlc3RwIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRUZW1wbGF0ZVRlc3QvQ3VzdG9tUmVzb2x2aW5nQ2xhc3MvaW5kZXgudGVzdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0VGVtcGxhdGVUZXN0L0N1c3RvbVJlc29sdmluZ0NsYXNzL2luZGV4LnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFRlbXBsYXRlVGVzdC9DdXN0b21SZXNvbHZpbmdDbGFzcy9yZWxhdGl2ZS5hYmMgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFRlbXBsYXRlVGVzdC9DdXN0b21SZXNvbHZpbmdDbGFzcy9yZWxhdGl2ZS5hYmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0VGVtcGxhdGVUZXN0L0N1c3RvbVJlc29sdmluZ0NsYXNzL3JlbGF0aXZlLmFiYwpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRUZW1wbGF0ZVRlc3QvQ3VzdG9tUmVzb2x2aW5nQ2xhc3MvcmVsYXRpdmUudGVzdHAgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFRlbXBsYXRlVGVzdC9DdXN0b21SZXNvbHZpbmdDbGFzcy9yZWxhdGl2ZS50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRUZW1wbGF0ZVRlc3QvQ3VzdG9tUmVzb2x2aW5nQ2xhc3MvcmVsYXRpdmUudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0VGVtcGxhdGVUZXN0L0V4cGxpY2l0VGVtcGxhdGUvYWJzb2x1dGUuYWJjIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRUZW1wbGF0ZVRlc3QvRXhwbGljaXRUZW1wbGF0ZS9hYnNvbHV0ZS5hYmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0VGVtcGxhdGVUZXN0L0V4cGxpY2l0VGVtcGxhdGUvYWJzb2x1dGUuYWJjCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFRlbXBsYXRlVGVzdC9FeHBsaWNpdFRlbXBsYXRlL2Fic29sdXRlLnRlc3RwIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRUZW1wbGF0ZVRlc3QvRXhwbGljaXRUZW1wbGF0ZS9hYnNvbHV0ZS50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRUZW1wbGF0ZVRlc3QvRXhwbGljaXRUZW1wbGF0ZS9hYnNvbHV0ZS50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRUZW1wbGF0ZVRlc3QvRXhwbGljaXRUZW1wbGF0ZS9pbmRleC50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0VGVtcGxhdGVUZXN0L0V4cGxpY2l0VGVtcGxhdGUvaW5kZXgudGVzdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0VGVtcGxhdGVUZXN0L0V4cGxpY2l0VGVtcGxhdGUvaW5kZXgudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0VGVtcGxhdGVUZXN0L0V4cGxpY2l0VGVtcGxhdGUvcmVsYXRpdmUudGVzdHAgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFRlbXBsYXRlVGVzdC9FeHBsaWNpdFRlbXBsYXRlL3JlbGF0aXZlLnRlc3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFRlbXBsYXRlVGVzdC9FeHBsaWNpdFRlbXBsYXRlL3JlbGF0aXZlLnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFRlbXBsYXRlVGVzdC9FeHBsaWNpdFRlbXBsYXRlU3ViUmVzb3VyY2UvYWJzb2x1dGUudGVzdHAgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFRlbXBsYXRlVGVzdC9FeHBsaWNpdFRlbXBsYXRlU3ViUmVzb3VyY2UvYWJzb2x1dGUudGVzdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0VGVtcGxhdGVUZXN0L0V4cGxpY2l0VGVtcGxhdGVTdWJSZXNvdXJjZS9hYnNvbHV0ZS50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRUZW1wbGF0ZVRlc3QvRXhwbGljaXRUZW1wbGF0ZVN1YlJlc291cmNlL2luZGV4LnRlc3RwIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRUZW1wbGF0ZVRlc3QvRXhwbGljaXRUZW1wbGF0ZVN1YlJlc291cmNlL2luZGV4LnRlc3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9FeHBsaWNpdFRlbXBsYXRlVGVzdC9FeHBsaWNpdFRlbXBsYXRlU3ViUmVzb3VyY2UvaW5kZXgudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0VGVtcGxhdGVUZXN0L0V4cGxpY2l0VGVtcGxhdGVTdWJSZXNvdXJjZS9yZWxhdGl2ZS50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0V4cGxpY2l0VGVtcGxhdGVUZXN0L0V4cGxpY2l0VGVtcGxhdGVTdWJSZXNvdXJjZS9yZWxhdGl2ZS50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRXhwbGljaXRUZW1wbGF0ZVRlc3QvRXhwbGljaXRUZW1wbGF0ZVN1YlJlc291cmNlL3JlbGF0aXZlLnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9GbGF0SW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QuRXhwbGljaXRUZW1wbGF0ZS5vdmVycmlkZS50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ZsYXRJbmhlcml0ZWRWaWV3UHJvY2Vzc29yVGVzdC5FeHBsaWNpdFRlbXBsYXRlLm92ZXJyaWRlLnRlc3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9GbGF0SW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QuRXhwbGljaXRUZW1wbGF0ZS5vdmVycmlkZS50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRmxhdEluaGVyaXRlZFZpZXdQcm9jZXNzb3JUZXN0LkV4cGxpY2l0VGVtcGxhdGVCYXNlLmluaGVyaXQudGVzdHAgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9GbGF0SW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QuRXhwbGljaXRUZW1wbGF0ZUJhc2UuaW5oZXJpdC50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRmxhdEluaGVyaXRlZFZpZXdQcm9jZXNzb3JUZXN0LkV4cGxpY2l0VGVtcGxhdGVCYXNlLmluaGVyaXQudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ZsYXRJbmhlcml0ZWRWaWV3UHJvY2Vzc29yVGVzdC5FeHBsaWNpdFRlbXBsYXRlQmFzZS5zaG93LnRlc3RwIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRmxhdEluaGVyaXRlZFZpZXdQcm9jZXNzb3JUZXN0LkV4cGxpY2l0VGVtcGxhdGVCYXNlLnNob3cudGVzdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ZsYXRJbmhlcml0ZWRWaWV3UHJvY2Vzc29yVGVzdC5FeHBsaWNpdFRlbXBsYXRlQmFzZS5zaG93LnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9GbGF0SW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QuSW1wbGljaXRUZW1wbGF0ZS5vdmVycmlkZS50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ZsYXRJbmhlcml0ZWRWaWV3UHJvY2Vzc29yVGVzdC5JbXBsaWNpdFRlbXBsYXRlLm92ZXJyaWRlLnRlc3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9GbGF0SW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QuSW1wbGljaXRUZW1wbGF0ZS5vdmVycmlkZS50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRmxhdEluaGVyaXRlZFZpZXdQcm9jZXNzb3JUZXN0LkltcGxpY2l0VGVtcGxhdGVCYXNlLmluZGV4LnRlc3RwIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRmxhdEluaGVyaXRlZFZpZXdQcm9jZXNzb3JUZXN0LkltcGxpY2l0VGVtcGxhdGVCYXNlLmluZGV4LnRlc3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9GbGF0SW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QuSW1wbGljaXRUZW1wbGF0ZUJhc2UuaW5kZXgudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ZsYXRJbmhlcml0ZWRWaWV3UHJvY2Vzc29yVGVzdC5JbXBsaWNpdFRlbXBsYXRlQmFzZS5pbmhlcml0LnRlc3RwIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRmxhdEluaGVyaXRlZFZpZXdQcm9jZXNzb3JUZXN0LkltcGxpY2l0VGVtcGxhdGVCYXNlLmluaGVyaXQudGVzdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ZsYXRJbmhlcml0ZWRWaWV3UHJvY2Vzc29yVGVzdC5JbXBsaWNpdFRlbXBsYXRlQmFzZS5pbmhlcml0LnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9GbGF0Vmlld1Byb2Nlc3NvclRlc3QuRXhwbGljaXRUZW1wbGF0ZS5zaG93LnRlc3RwIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRmxhdFZpZXdQcm9jZXNzb3JUZXN0LkV4cGxpY2l0VGVtcGxhdGUuc2hvdy50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRmxhdFZpZXdQcm9jZXNzb3JUZXN0LkV4cGxpY2l0VGVtcGxhdGUuc2hvdy50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRmxhdFZpZXdQcm9jZXNzb3JUZXN0LkltcGxpY2l0RXhwbGljaXRUZW1wbGF0ZS5pbmRleC50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ZsYXRWaWV3UHJvY2Vzc29yVGVzdC5JbXBsaWNpdEV4cGxpY2l0VGVtcGxhdGUuaW5kZXgudGVzdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ZsYXRWaWV3UHJvY2Vzc29yVGVzdC5JbXBsaWNpdEV4cGxpY2l0VGVtcGxhdGUuaW5kZXgudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ZsYXRWaWV3UHJvY2Vzc29yVGVzdC5JbXBsaWNpdEV4cGxpY2l0VGVtcGxhdGUuc2hvdy50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ZsYXRWaWV3UHJvY2Vzc29yVGVzdC5JbXBsaWNpdEV4cGxpY2l0VGVtcGxhdGUuc2hvdy50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRmxhdFZpZXdQcm9jZXNzb3JUZXN0LkltcGxpY2l0RXhwbGljaXRUZW1wbGF0ZS5zaG93LnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9GbGF0Vmlld1Byb2Nlc3NvclRlc3QuSW1wbGljaXRUZW1wbGF0ZS5pbmRleC50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ZsYXRWaWV3UHJvY2Vzc29yVGVzdC5JbXBsaWNpdFRlbXBsYXRlLmluZGV4LnRlc3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9GbGF0Vmlld1Byb2Nlc3NvclRlc3QuSW1wbGljaXRUZW1wbGF0ZS5pbmRleC50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRmxhdFZpZXdQcm9jZXNzb3JUZXN0LkltcGxpY2l0V2l0aEdldFRlbXBsYXRlLmluZGV4LnRlc3RwIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRmxhdFZpZXdQcm9jZXNzb3JUZXN0LkltcGxpY2l0V2l0aEdldFRlbXBsYXRlLmluZGV4LnRlc3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9GbGF0Vmlld1Byb2Nlc3NvclRlc3QuSW1wbGljaXRXaXRoR2V0VGVtcGxhdGUuaW5kZXgudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ZsYXRWaWV3UHJvY2Vzc29yVGVzdC5JbXBsaWNpdFdpdGhTdWJSZXNvdXJjZUdldFRlbXBsYXRlLnN1Yi50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ZsYXRWaWV3UHJvY2Vzc29yVGVzdC5JbXBsaWNpdFdpdGhTdWJSZXNvdXJjZUdldFRlbXBsYXRlLnN1Yi50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvRmxhdFZpZXdQcm9jZXNzb3JUZXN0LkltcGxpY2l0V2l0aFN1YlJlc291cmNlR2V0VGVtcGxhdGUuc3ViLnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFByb2R1Y2VzVmlld1Byb2Nlc3NvclRlc3QvRXhwbGljaXRUZW1wbGF0ZS9zaG93LnRlc3RwIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRQcm9kdWNlc1ZpZXdQcm9jZXNzb3JUZXN0L0V4cGxpY2l0VGVtcGxhdGUvc2hvdy50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRQcm9kdWNlc1ZpZXdQcm9jZXNzb3JUZXN0L0V4cGxpY2l0VGVtcGxhdGUvc2hvdy50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRQcm9kdWNlc1ZpZXdQcm9jZXNzb3JUZXN0L0ltcGxpY2l0RXhwbGljaXRUZW1wbGF0ZS9pbmRleC50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0UHJvZHVjZXNWaWV3UHJvY2Vzc29yVGVzdC9JbXBsaWNpdEV4cGxpY2l0VGVtcGxhdGUvaW5kZXgudGVzdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0UHJvZHVjZXNWaWV3UHJvY2Vzc29yVGVzdC9JbXBsaWNpdEV4cGxpY2l0VGVtcGxhdGUvaW5kZXgudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0UHJvZHVjZXNWaWV3UHJvY2Vzc29yVGVzdC9JbXBsaWNpdEV4cGxpY2l0VGVtcGxhdGUvc2hvdy50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0UHJvZHVjZXNWaWV3UHJvY2Vzc29yVGVzdC9JbXBsaWNpdEV4cGxpY2l0VGVtcGxhdGUvc2hvdy50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRQcm9kdWNlc1ZpZXdQcm9jZXNzb3JUZXN0L0ltcGxpY2l0RXhwbGljaXRUZW1wbGF0ZS9zaG93LnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFByb2R1Y2VzVmlld1Byb2Nlc3NvclRlc3QvSW1wbGljaXRUZW1wbGF0ZS9pbmRleC50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0UHJvZHVjZXNWaWV3UHJvY2Vzc29yVGVzdC9JbXBsaWNpdFRlbXBsYXRlL2luZGV4LnRlc3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFByb2R1Y2VzVmlld1Byb2Nlc3NvclRlc3QvSW1wbGljaXRUZW1wbGF0ZS9pbmRleC50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRQcm9kdWNlc1ZpZXdQcm9jZXNzb3JUZXN0L0ltcGxpY2l0V2l0aEdldFRlbXBsYXRlL2luZGV4LnRlc3RwIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRQcm9kdWNlc1ZpZXdQcm9jZXNzb3JUZXN0L0ltcGxpY2l0V2l0aEdldFRlbXBsYXRlL2luZGV4LnRlc3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFByb2R1Y2VzVmlld1Byb2Nlc3NvclRlc3QvSW1wbGljaXRXaXRoR2V0VGVtcGxhdGUvaW5kZXgudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0UHJvZHVjZXNWaWV3UHJvY2Vzc29yVGVzdC9JbXBsaWNpdFdpdGhTdWJSZXNvdXJjZUdldFRlbXBsYXRlL3N1Yi50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0UHJvZHVjZXNWaWV3UHJvY2Vzc29yVGVzdC9JbXBsaWNpdFdpdGhTdWJSZXNvdXJjZUdldFRlbXBsYXRlL3N1Yi50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRQcm9kdWNlc1ZpZXdQcm9jZXNzb3JUZXN0L0ltcGxpY2l0V2l0aFN1YlJlc291cmNlR2V0VGVtcGxhdGUvc3ViLnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFRlbXBsYXRlUHJvZ3JhbW1hdGljVGVzdC9IYW5kbGVyL2luZGV4LnRlc3RwIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRUZW1wbGF0ZVByb2dyYW1tYXRpY1Rlc3QvSGFuZGxlci9pbmRleC50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRUZW1wbGF0ZVByb2dyYW1tYXRpY1Rlc3QvSGFuZGxlci9pbmRleC50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRUZW1wbGF0ZVRlc3QvQW5vdGhlckltcGxpY2l0R2V0UmVzb3VyY2UvZ2V0LnRlc3RwIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRUZW1wbGF0ZVRlc3QvQW5vdGhlckltcGxpY2l0R2V0UmVzb3VyY2UvZ2V0LnRlc3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFRlbXBsYXRlVGVzdC9Bbm90aGVySW1wbGljaXRHZXRSZXNvdXJjZS9nZXQudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0VGVtcGxhdGVUZXN0L0Fub3RoZXJJbXBsaWNpdEdldFJlc291cmNlL2luZGV4LnRlc3RwIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRUZW1wbGF0ZVRlc3QvQW5vdGhlckltcGxpY2l0R2V0UmVzb3VyY2UvaW5kZXgudGVzdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0VGVtcGxhdGVUZXN0L0Fub3RoZXJJbXBsaWNpdEdldFJlc291cmNlL2luZGV4LnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFRlbXBsYXRlVGVzdC9JbXBsaWNpdFJlc291cmNlL2dldC50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0VGVtcGxhdGVUZXN0L0ltcGxpY2l0UmVzb3VyY2UvZ2V0LnRlc3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFRlbXBsYXRlVGVzdC9JbXBsaWNpdFJlc291cmNlL2dldC50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRUZW1wbGF0ZVRlc3QvSW1wbGljaXRSZXNvdXJjZS9pbmRleC50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0VGVtcGxhdGVUZXN0L0ltcGxpY2l0UmVzb3VyY2UvaW5kZXgudGVzdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0VGVtcGxhdGVUZXN0L0ltcGxpY2l0UmVzb3VyY2UvaW5kZXgudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0ltcGxpY2l0VGVtcGxhdGVUZXN0L0ltcGxpY2l0U2luZ2xldG9uUmVzb3VyY2UvaW5kZXgudGVzdHAgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFRlbXBsYXRlVGVzdC9JbXBsaWNpdFNpbmdsZXRvblJlc291cmNlL2luZGV4LnRlc3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFRlbXBsYXRlVGVzdC9JbXBsaWNpdFNpbmdsZXRvblJlc291cmNlL2luZGV4LnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFRlbXBsYXRlVGVzdC9JbXBsaWNpdFN1YlN1YlJlc291cmNlL2luZGV4LnRlc3RwIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRUZW1wbGF0ZVRlc3QvSW1wbGljaXRTdWJTdWJSZXNvdXJjZS9pbmRleC50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRUZW1wbGF0ZVRlc3QvSW1wbGljaXRTdWJTdWJSZXNvdXJjZS9pbmRleC50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRWaWV3V2l0aFJlc291cmNlRmlsdGVyVGVzdC9JbXBsaWNpdFRlbXBsYXRlL2luZGV4LnRlc3RwIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW1wbGljaXRWaWV3V2l0aFJlc291cmNlRmlsdGVyVGVzdC9JbXBsaWNpdFRlbXBsYXRlL2luZGV4LnRlc3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9JbXBsaWNpdFZpZXdXaXRoUmVzb3VyY2VGaWx0ZXJUZXN0L0ltcGxpY2l0VGVtcGxhdGUvaW5kZXgudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0luaGVyaXRlZFZpZXdQcm9jZXNzb3JUZXN0L0V4cGxpY2l0VGVtcGxhdGUvb3ZlcnJpZGUudGVzdHAgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9Jbmhlcml0ZWRWaWV3UHJvY2Vzc29yVGVzdC9FeHBsaWNpdFRlbXBsYXRlL292ZXJyaWRlLnRlc3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9Jbmhlcml0ZWRWaWV3UHJvY2Vzc29yVGVzdC9FeHBsaWNpdFRlbXBsYXRlL292ZXJyaWRlLnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9Jbmhlcml0ZWRWaWV3UHJvY2Vzc29yVGVzdC9FeHBsaWNpdFRlbXBsYXRlQmFzZS9pbmhlcml0LnRlc3RwIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QvRXhwbGljaXRUZW1wbGF0ZUJhc2UvaW5oZXJpdC50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QvRXhwbGljaXRUZW1wbGF0ZUJhc2UvaW5oZXJpdC50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QvRXhwbGljaXRUZW1wbGF0ZUJhc2Uvb3ZlcnJpZGUudGVzdHAgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9Jbmhlcml0ZWRWaWV3UHJvY2Vzc29yVGVzdC9FeHBsaWNpdFRlbXBsYXRlQmFzZS9vdmVycmlkZS50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QvRXhwbGljaXRUZW1wbGF0ZUJhc2Uvb3ZlcnJpZGUudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0luaGVyaXRlZFZpZXdQcm9jZXNzb3JUZXN0L0V4cGxpY2l0VGVtcGxhdGVCYXNlL3Nob3cudGVzdHAgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9Jbmhlcml0ZWRWaWV3UHJvY2Vzc29yVGVzdC9FeHBsaWNpdFRlbXBsYXRlQmFzZS9zaG93LnRlc3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9Jbmhlcml0ZWRWaWV3UHJvY2Vzc29yVGVzdC9FeHBsaWNpdFRlbXBsYXRlQmFzZS9zaG93LnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9Jbmhlcml0ZWRWaWV3UHJvY2Vzc29yVGVzdC9JbXBsaWNpdFRlbXBsYXRlL292ZXJyaWRlLnRlc3RwIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QvSW1wbGljaXRUZW1wbGF0ZS9vdmVycmlkZS50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QvSW1wbGljaXRUZW1wbGF0ZS9vdmVycmlkZS50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QvSW1wbGljaXRUZW1wbGF0ZUJhc2UvaW5kZXgudGVzdHAgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9Jbmhlcml0ZWRWaWV3UHJvY2Vzc29yVGVzdC9JbXBsaWNpdFRlbXBsYXRlQmFzZS9pbmRleC50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvSW5oZXJpdGVkVmlld1Byb2Nlc3NvclRlc3QvSW1wbGljaXRUZW1wbGF0ZUJhc2UvaW5kZXgudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0luaGVyaXRlZFZpZXdQcm9jZXNzb3JUZXN0L0ltcGxpY2l0VGVtcGxhdGVCYXNlL2luaGVyaXQudGVzdHAgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9Jbmhlcml0ZWRWaWV3UHJvY2Vzc29yVGVzdC9JbXBsaWNpdFRlbXBsYXRlQmFzZS9pbmhlcml0LnRlc3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9Jbmhlcml0ZWRWaWV3UHJvY2Vzc29yVGVzdC9JbXBsaWNpdFRlbXBsYXRlQmFzZS9pbmhlcml0LnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9Jbmhlcml0ZWRWaWV3UHJvY2Vzc29yVGVzdC9JbXBsaWNpdFRlbXBsYXRlQmFzZS9vdmVycmlkZS50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL0luaGVyaXRlZFZpZXdQcm9jZXNzb3JUZXN0L0ltcGxpY2l0VGVtcGxhdGVCYXNlL292ZXJyaWRlLnRlc3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9Jbmhlcml0ZWRWaWV3UHJvY2Vzc29yVGVzdC9JbXBsaWNpdFRlbXBsYXRlQmFzZS9vdmVycmlkZS50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvTXZjRW5jb2RpbmdUZXN0L0ZyZWVtYXJrZXJSZXNvdXJjZS5mdGwgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9NdmNFbmNvZGluZ1Rlc3QvRnJlZW1hcmtlclJlc291cmNlLmZ0bApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzg2ODlmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvTXZjRW5jb2RpbmdUZXN0L0ZyZWVtYXJrZXJSZXNvdXJjZS5mdGwKQEAgLTAsMCArMSBAQAorTW9kZWw6JHt1c2VyfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL012Y0VuY29kaW5nVGVzdC9NdXN0YWNoZVJlc291cmNlLm11c3RhY2hlIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvTXZjRW5jb2RpbmdUZXN0L011c3RhY2hlUmVzb3VyY2UubXVzdGFjaGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBkOGZiZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL012Y0VuY29kaW5nVGVzdC9NdXN0YWNoZVJlc291cmNlLm11c3RhY2hlCkBAIC0wLDAgKzEgQEAKK01vZGVsOnt7dXNlcn19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvUmVzb2x2aW5nQ2xhc3NWaWV3UHJvY2Vzc29yVGVzdC9SZXNvbHZpbmdDbGFzcy9zaG93LnRlc3RwIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvUmVzb2x2aW5nQ2xhc3NWaWV3UHJvY2Vzc29yVGVzdC9SZXNvbHZpbmdDbGFzcy9zaG93LnRlc3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9SZXNvbHZpbmdDbGFzc1ZpZXdQcm9jZXNzb3JUZXN0L1Jlc29sdmluZ0NsYXNzL3Nob3cudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1RlbXBsYXRlTWV0aG9kU2VsZWN0aW9uVGVzdC9Bc1ZpZXdhYmxlUmVzb3VyY2UvZ2V0QXNIVE1MIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVGVtcGxhdGVNZXRob2RTZWxlY3Rpb25UZXN0L0FzVmlld2FibGVSZXNvdXJjZS9nZXRBc0hUTUwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1RlbXBsYXRlTWV0aG9kU2VsZWN0aW9uVGVzdC9Bc1ZpZXdhYmxlUmVzb3VyY2UvZ2V0QXNIVE1MCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9UZW1wbGF0ZU1ldGhvZFNlbGVjdGlvblRlc3QvQXNWaWV3YWJsZVJlc291cmNlL2luZGV4LnRlc3RwIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVGVtcGxhdGVNZXRob2RTZWxlY3Rpb25UZXN0L0FzVmlld2FibGVSZXNvdXJjZS9pbmRleC50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVGVtcGxhdGVNZXRob2RTZWxlY3Rpb25UZXN0L0FzVmlld2FibGVSZXNvdXJjZS9pbmRleC50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVGVtcGxhdGVNZXRob2RTZWxlY3Rpb25UZXN0L1RlbXBsYXRlQW5ub3RhdGVkUmVzb3VyY2UvZ2V0QXNIVE1MIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVGVtcGxhdGVNZXRob2RTZWxlY3Rpb25UZXN0L1RlbXBsYXRlQW5ub3RhdGVkUmVzb3VyY2UvZ2V0QXNIVE1MCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9UZW1wbGF0ZU1ldGhvZFNlbGVjdGlvblRlc3QvVGVtcGxhdGVBbm5vdGF0ZWRSZXNvdXJjZS9nZXRBc0hUTUwKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1RlbXBsYXRlTWV0aG9kU2VsZWN0aW9uVGVzdC9UZW1wbGF0ZUFubm90YXRlZFJlc291cmNlL2luZGV4LnRlc3RwIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVGVtcGxhdGVNZXRob2RTZWxlY3Rpb25UZXN0L1RlbXBsYXRlQW5ub3RhdGVkUmVzb3VyY2UvaW5kZXgudGVzdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1RlbXBsYXRlTWV0aG9kU2VsZWN0aW9uVGVzdC9UZW1wbGF0ZUFubm90YXRlZFJlc291cmNlL2luZGV4LnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9UZW1wbGF0ZU1ldGhvZFNlbGVjdGlvblRlc3QvVGVtcGxhdGVBbm5vdGF0ZWRSZXNvdXJjZU1ldGhvZC9nZXRBc0hUTUwgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9UZW1wbGF0ZU1ldGhvZFNlbGVjdGlvblRlc3QvVGVtcGxhdGVBbm5vdGF0ZWRSZXNvdXJjZU1ldGhvZC9nZXRBc0hUTUwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1RlbXBsYXRlTWV0aG9kU2VsZWN0aW9uVGVzdC9UZW1wbGF0ZUFubm90YXRlZFJlc291cmNlTWV0aG9kL2dldEFzSFRNTApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVGVtcGxhdGVNZXRob2RTZWxlY3Rpb25UZXN0L1RlbXBsYXRlQW5ub3RhdGVkUmVzb3VyY2VNZXRob2QvaW5kZXgudGVzdHAgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9UZW1wbGF0ZU1ldGhvZFNlbGVjdGlvblRlc3QvVGVtcGxhdGVBbm5vdGF0ZWRSZXNvdXJjZU1ldGhvZC9pbmRleC50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVGVtcGxhdGVNZXRob2RTZWxlY3Rpb25UZXN0L1RlbXBsYXRlQW5ub3RhdGVkUmVzb3VyY2VNZXRob2QvaW5kZXgudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1RlbXBsYXRlUHJvY2Vzc29yVGVzdC9FeHBsaWNpdFRlbXBsYXRlL2Fic29sdXRlL3Nob3cudGVzdHAgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9UZW1wbGF0ZVByb2Nlc3NvclRlc3QvRXhwbGljaXRUZW1wbGF0ZS9hYnNvbHV0ZS9zaG93LnRlc3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9UZW1wbGF0ZVByb2Nlc3NvclRlc3QvRXhwbGljaXRUZW1wbGF0ZS9hYnNvbHV0ZS9zaG93LnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9UZW1wbGF0ZVByb2Nlc3NvclRlc3QvRXhwbGljaXRUZW1wbGF0ZS9zaG93LnRlc3RwIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVGVtcGxhdGVQcm9jZXNzb3JUZXN0L0V4cGxpY2l0VGVtcGxhdGUvc2hvdy50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVGVtcGxhdGVQcm9jZXNzb3JUZXN0L0V4cGxpY2l0VGVtcGxhdGUvc2hvdy50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVGVtcGxhdGVQcm9jZXNzb3JUZXN0L0ltcGxpY2l0RXhwbGljaXRUZW1wbGF0ZS9pbmRleC50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1RlbXBsYXRlUHJvY2Vzc29yVGVzdC9JbXBsaWNpdEV4cGxpY2l0VGVtcGxhdGUvaW5kZXgudGVzdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1RlbXBsYXRlUHJvY2Vzc29yVGVzdC9JbXBsaWNpdEV4cGxpY2l0VGVtcGxhdGUvaW5kZXgudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1RlbXBsYXRlUHJvY2Vzc29yVGVzdC9JbXBsaWNpdEV4cGxpY2l0VGVtcGxhdGUvc2hvdy50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1RlbXBsYXRlUHJvY2Vzc29yVGVzdC9JbXBsaWNpdEV4cGxpY2l0VGVtcGxhdGUvc2hvdy50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVGVtcGxhdGVQcm9jZXNzb3JUZXN0L0ltcGxpY2l0RXhwbGljaXRUZW1wbGF0ZS9zaG93LnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9UZW1wbGF0ZVByb2Nlc3NvclRlc3QvSW1wbGljaXRUZW1wbGF0ZS9pbmRleC50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1RlbXBsYXRlUHJvY2Vzc29yVGVzdC9JbXBsaWNpdFRlbXBsYXRlL2luZGV4LnRlc3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9UZW1wbGF0ZVByb2Nlc3NvclRlc3QvSW1wbGljaXRUZW1wbGF0ZS9pbmRleC50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVGVtcGxhdGVQcm9jZXNzb3JUZXN0L0ltcGxpY2l0V2l0aEdldFRlbXBsYXRlL2luZGV4LnRlc3RwIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVGVtcGxhdGVQcm9jZXNzb3JUZXN0L0ltcGxpY2l0V2l0aEdldFRlbXBsYXRlL2luZGV4LnRlc3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9UZW1wbGF0ZVByb2Nlc3NvclRlc3QvSW1wbGljaXRXaXRoR2V0VGVtcGxhdGUvaW5kZXgudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1RlbXBsYXRlUHJvY2Vzc29yVGVzdC9JbXBsaWNpdFdpdGhTdWJSZXNvdXJjZUdldFRlbXBsYXRlL3N1Yi50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1RlbXBsYXRlUHJvY2Vzc29yVGVzdC9JbXBsaWNpdFdpdGhTdWJSZXNvdXJjZUdldFRlbXBsYXRlL3N1Yi50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVGVtcGxhdGVQcm9jZXNzb3JUZXN0L0ltcGxpY2l0V2l0aFN1YlJlc291cmNlR2V0VGVtcGxhdGUvc3ViLnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9WaWV3UHJvY2Vzc29yVGVzdC9FeHBsaWNpdFRlbXBsYXRlL2Fic29sdXRlL3Nob3cudGVzdHAgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9WaWV3UHJvY2Vzc29yVGVzdC9FeHBsaWNpdFRlbXBsYXRlL2Fic29sdXRlL3Nob3cudGVzdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1ZpZXdQcm9jZXNzb3JUZXN0L0V4cGxpY2l0VGVtcGxhdGUvYWJzb2x1dGUvc2hvdy50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVmlld1Byb2Nlc3NvclRlc3QvRXhwbGljaXRUZW1wbGF0ZS9zaG93LnRlc3RwIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVmlld1Byb2Nlc3NvclRlc3QvRXhwbGljaXRUZW1wbGF0ZS9zaG93LnRlc3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9WaWV3UHJvY2Vzc29yVGVzdC9FeHBsaWNpdFRlbXBsYXRlL3Nob3cudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1ZpZXdQcm9jZXNzb3JUZXN0L0ltcGxpY2l0RXhwbGljaXRUZW1wbGF0ZS9pbmRleC50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1ZpZXdQcm9jZXNzb3JUZXN0L0ltcGxpY2l0RXhwbGljaXRUZW1wbGF0ZS9pbmRleC50ZXN0cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkZTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVmlld1Byb2Nlc3NvclRlc3QvSW1wbGljaXRFeHBsaWNpdFRlbXBsYXRlL2luZGV4LnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9WaWV3UHJvY2Vzc29yVGVzdC9JbXBsaWNpdEV4cGxpY2l0VGVtcGxhdGUvc2hvdy50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1ZpZXdQcm9jZXNzb3JUZXN0L0ltcGxpY2l0RXhwbGljaXRUZW1wbGF0ZS9zaG93LnRlc3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9WaWV3UHJvY2Vzc29yVGVzdC9JbXBsaWNpdEV4cGxpY2l0VGVtcGxhdGUvc2hvdy50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVmlld1Byb2Nlc3NvclRlc3QvSW1wbGljaXRUZW1wbGF0ZS9pbmRleC50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1ZpZXdQcm9jZXNzb3JUZXN0L0ltcGxpY2l0VGVtcGxhdGUvaW5kZXgudGVzdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1ZpZXdQcm9jZXNzb3JUZXN0L0ltcGxpY2l0VGVtcGxhdGUvaW5kZXgudGVzdHAKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1ZpZXdQcm9jZXNzb3JUZXN0L0ltcGxpY2l0V2l0aEdldFRlbXBsYXRlL2luZGV4LnRlc3RwIGIvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvVmlld1Byb2Nlc3NvclRlc3QvSW1wbGljaXRXaXRoR2V0VGVtcGxhdGUvaW5kZXgudGVzdHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1ZpZXdQcm9jZXNzb3JUZXN0L0ltcGxpY2l0V2l0aEdldFRlbXBsYXRlL2luZGV4LnRlc3RwCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9WaWV3UHJvY2Vzc29yVGVzdC9JbXBsaWNpdFdpdGhTdWJSZXNvdXJjZUdldFRlbXBsYXRlL3N1Yi50ZXN0cCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL1ZpZXdQcm9jZXNzb3JUZXN0L0ltcGxpY2l0V2l0aFN1YlJlc291cmNlR2V0VGVtcGxhdGUvc3ViLnRlc3RwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OWRlMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtc2VydmVyL3NyYy90ZXN0L3Jlc291cmNlcy9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvc2VydmVyL212Yy9WaWV3UHJvY2Vzc29yVGVzdC9JbXBsaWNpdFdpdGhTdWJSZXNvdXJjZUdldFRlbXBsYXRlL3N1Yi50ZXN0cApkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXNlcnZlci9zcmMvdGVzdC9yZXNvdXJjZXMvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NlcnZlci9tdmMvc3BpL0Fic3RyYWN0VGVtcGxhdGVQcm9jZXNzb3JUZXN0L1Jlc291cmNlL2luZGV4LmZjdCBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL3NwaS9BYnN0cmFjdFRlbXBsYXRlUHJvY2Vzc29yVGVzdC9SZXNvdXJjZS9pbmRleC5mY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY5ZGUyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS1zZXJ2ZXIvc3JjL3Rlc3QvcmVzb3VyY2VzL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zZXJ2ZXIvbXZjL3NwaS9BYnN0cmFjdFRlbXBsYXRlUHJvY2Vzc29yVGVzdC9SZXNvdXJjZS9pbmRleC5mY3QKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS10ZXN0bmcvcG9tLnhtbCBiL3Rlc3RzL2UyZS10ZXN0bmcvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWE4MmI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXRlc3RuZy9wb20ueG1sCkBAIC0wLDAgKzEsOTYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5lMmUtdGVzdG5nPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWUyZS10ZXN0bmc8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+SmVyc2V5IEUyRSAoVGVzdE5HKSB0ZXN0czwvZGVzY3JpcHRpb24+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxmb3JrQ291bnQ+MTwvZm9ya0NvdW50PgorICAgICAgICAgICAgICAgICAgICA8cmV1c2VGb3Jrcz5mYWxzZTwvcmV1c2VGb3Jrcz4KKyAgICAgICAgICAgICAgICAgICAgPGVuYWJsZUFzc2VydGlvbnM+ZmFsc2U8L2VuYWJsZUFzc2VydGlvbnM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5zdXJlZmlyZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnN1cmVmaXJlLXRlc3RuZzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMTc8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY2llcz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnRlc3RuZzwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnRlc3RuZzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5zb25hcjwvaWQ+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGRpc2FibGUgSmFDb0NvIGxpc3RlbmVyIGJlY2F1c2UgaXQncyBub3Qgd29ya2luZyB3aXRoIDxmb3JrTW9kZT5hbHdheXM8L2Zvcms+ICg8cmV1c2VGb3Jrcz5mYWxzZTwvcmV1c2VGb3Jrcz4gcmVzcGVjdGl2ZWx5KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwczovL2ppcmEuc29uYXJzb3VyY2UuY29tL2Jyb3dzZS9TT05BUkpBVkEtNzI4IChodHRwczovL2dpdGh1Yi5jb20vU29uYXJTb3VyY2Uvc29uYXItamF2YS9wdWxsLzMyNCkgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwcm9wZXJ0aWVzIGNvbWJpbmUuc2VsZj0ib3ZlcnJpZGUiIC8+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXRlc3RuZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9BYnN0cmFjdFBhcmFsbGVsVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXRlc3RuZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9BYnN0cmFjdFBhcmFsbGVsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0Y2Q5MjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtdGVzdG5nL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL0Fic3RyYWN0UGFyYWxsZWxUZXN0LmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0Tmc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLnRlc3RuZy5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEJhc2UgZm9yIFRlc3RORyBwYXJhbGxlbCB0ZXN0cy4gQ29udGFpbnMgb25lIHNpbmdsZXRvbiByZXNvdXJjZSB3aXRoIEdFVCBtZXRob2QgcmV0dXJuaW5nIGluY3JlbWVudGFsIHNlcXVlbmNlIG9mIGludGVnZXJzLgorICogRXh0ZW5zaW9ucyBoYXMgdG8gaW1wbGVtZW50IHtAbGluayAjdGVzdFZhbHVlKEludGVnZXIpfS4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFRlc3QodGhyZWFkUG9vbFNpemUgPSA1LCBpbnZvY2F0aW9uQ291bnQgPSAxMykKK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFBhcmFsbGVsVGVzdCBleHRlbmRzIEplcnNleVRlc3ROZyB7CisKKyAgICBAUGF0aCgiLyIpCisgICAgQFNpbmdsZXRvbgorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgcHJpdmF0ZSBBdG9taWNJbnRlZ2VyIGFpID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgaW50IGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBhaS5nZXRBbmRJbmNyZW1lbnQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIC8vIEZpbmQgZmlyc3QgYXZhaWxhYmxlIHBvcnQuCisgICAgICAgIGZvcmNlU2V0KFRlc3RQcm9wZXJ0aWVzLkNPTlRBSU5FUl9QT1JULCAiMCIpOworCisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHRlc3QxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3QoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0KCk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgdGVzdDMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0KCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMocmVzcG9uc2UuZ2V0U3RhdHVzKCksIDIwMCk7CisgICAgICAgIHRlc3RWYWx1ZShyZXNwb25zZS5yZWFkRW50aXR5KEludGVnZXIuY2xhc3MpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB0ZXN0VmFsdWUoZmluYWwgSW50ZWdlciBhY3R1YWwpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXRlc3RuZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9CZWZvcmVDbGFzc1BhcmFsbGVsVGVzdC5qYXZhIGIvdGVzdHMvZTJlLXRlc3RuZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9CZWZvcmVDbGFzc1BhcmFsbGVsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYTAyYjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtdGVzdG5nL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL0JlZm9yZUNsYXNzUGFyYWxsZWxUZXN0LmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50SGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db25jdXJyZW50TWFwOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5Db250YWluZXJQZXJDbGFzc1Rlc3ROZ1N0cmF0ZWd5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3ROZ1N0cmF0ZWd5OworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5BZnRlckNsYXNzOworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQmVmb3JlQ2xhc3M7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMubnVsbFZhbHVlOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIFJ1bnMgYSBzZXQgb2YgdGVzdHMgKGluIHBhcmFsbGVsKSBhZ2FpbnN0IHNpbmdsZSB0ZXN0IGNvbnRhaW5lciBpbnN0YW5jZS4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEJlZm9yZUNsYXNzUGFyYWxsZWxUZXN0IGV4dGVuZHMgQWJzdHJhY3RQYXJhbGxlbFRlc3QgeworCisgICAgcHJpdmF0ZSBDb25jdXJyZW50TWFwPEludGVnZXIsIFN0cmluZz4gdmFsdWVzID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPD4oKTsKKworICAgIEBCZWZvcmVDbGFzcworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgfQorCisgICAgQEFmdGVyQ2xhc3MKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0TmdTdHJhdGVneSBjb25maWd1cmVTdHJhdGVneSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBDb250YWluZXJQZXJDbGFzc1Rlc3ROZ1N0cmF0ZWd5KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVzdFZhbHVlKGZpbmFsIEludGVnZXIgYWN0dWFsKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gdmFsdWVzLnB1dElmQWJzZW50KGFjdHVhbCwgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkpOworCisgICAgICAgIGFzc2VydFRoYXQoU3RyaW5nLmZvcm1hdCgiVmFsdWUgJWQgaGFzIGFscmVhZHkgYmVlbiByZXR1cm5lZCBieSBjbGllbnQgaW4gdGhyZWFkICVzLiIsIGFjdHVhbCwgbmFtZSksCisgICAgICAgICAgICAgICAgbmFtZSwgbnVsbFZhbHVlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS10ZXN0bmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvQmVmb3JlTWV0aG9kUGFyYWxsZWxUZXN0LmphdmEgYi90ZXN0cy9lMmUtdGVzdG5nL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL0JlZm9yZU1ldGhvZFBhcmFsbGVsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MGQyZDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUtdGVzdG5nL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL0JlZm9yZU1ldGhvZFBhcmFsbGVsVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5Db250YWluZXJQZXJNZXRob2RUZXN0TmdTdHJhdGVneTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0TmdTdHJhdGVneTsKKworaW1wb3J0IG9yZy50ZXN0bmcuYW5ub3RhdGlvbnMuQWZ0ZXJNZXRob2Q7CitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5CZWZvcmVNZXRob2Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogUnVucyBhIHNldCBvZiB0ZXN0cyAoaW4gcGFyYWxsZWwpIGVhY2ggYWdhaW5zdCBzZXBhcmF0ZSB0ZXN0IGNvbnRhaW5lciBpbnN0YW5jZS4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEJlZm9yZU1ldGhvZFBhcmFsbGVsVGVzdCBleHRlbmRzIEFic3RyYWN0UGFyYWxsZWxUZXN0IHsKKworICAgIEBCZWZvcmVNZXRob2QKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzdXBlci5zZXRVcCgpOworICAgIH0KKworICAgIEBBZnRlck1ldGhvZAorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3ROZ1N0cmF0ZWd5IGNvbmZpZ3VyZVN0cmF0ZWd5KCkgeworICAgICAgICByZXR1cm4gbmV3IENvbnRhaW5lclBlck1ldGhvZFRlc3ROZ1N0cmF0ZWd5KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgdGVzdFZhbHVlKGZpbmFsIEludGVnZXIgYWN0dWFsKSB7CisgICAgICAgIGFzc2VydFRoYXQoYWN0dWFsLCBpcygwKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXRlc3RuZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9Db250YWluZXJQZXJDbGFzc1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS10ZXN0bmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvQ29udGFpbmVyUGVyQ2xhc3NUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NmMmViNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS10ZXN0bmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvQ29udGFpbmVyUGVyQ2xhc3NUZXN0LmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdE5nOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdHMgdGhhdCBjb250YWluZXIgaXMgY3JlYXRlZCBvbmx5IG9uY2UgcGVyIGNsYXNzIGFuZCBlYWNoIHRlc3QgbWV0aG9kIHNlbmRzIHJlcXVlc3QgdG8gdGhlIHNhbWUgY29udGFpbmVyLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgQ29udGFpbmVyUGVyQ2xhc3NUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdE5nLkNvbnRhaW5lclBlckNsYXNzVGVzdCB7CisKKyAgICBAUGF0aCgiLyIpCisgICAgQFNpbmdsZXRvbgorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgcHJpdmF0ZSBpbnQgaSA9IDE7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgaW50IGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBpKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdChwcmlvcml0eSA9IDEpCisgICAgcHVibGljIHZvaWQgZmlyc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdCgxKTsKKyAgICB9CisKKyAgICBAVGVzdChwcmlvcml0eSA9IDIpCisgICAgcHVibGljIHZvaWQgc2Vjb25kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3QoMik7CisgICAgfQorCisgICAgQFRlc3QocHJpb3JpdHkgPSAzKQorICAgIHB1YmxpYyB2b2lkIHRoaXJkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3QoMyk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3QoZmluYWwgSW50ZWdlciBleHBlY3RlZCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMocmVzcG9uc2UuZ2V0U3RhdHVzKCksIDIwMCk7CisgICAgICAgIGFzc2VydEVxdWFscyhyZXNwb25zZS5yZWFkRW50aXR5KEludGVnZXIuY2xhc3MpLCBleHBlY3RlZCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlLXRlc3RuZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9Db250YWluZXJQZXJNZXRob2RUZXN0LmphdmEgYi90ZXN0cy9lMmUtdGVzdG5nL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL0NvbnRhaW5lclBlck1ldGhvZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjI5NDhlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlLXRlc3RuZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9Db250YWluZXJQZXJNZXRob2RUZXN0LmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdE5nOworCitpbXBvcnQgb3JnLnRlc3RuZy5hbm5vdGF0aW9ucy5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcudGVzdG5nLkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdHMgdGhhdCBuZXcgY29udGFpbmVyIGlzIGNyZWF0ZWQgZm9yIGVhY2ggdGVzdCBtZXRob2QuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBDb250YWluZXJQZXJNZXRob2RUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdE5nLkNvbnRhaW5lclBlck1ldGhvZFRlc3QgeworCisgICAgQFBhdGgoIi8iKQorICAgIEBTaW5nbGV0b24KKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIHByaXZhdGUgaW50IGkgPSAxOworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIGludCBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gaSsrOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QocHJpb3JpdHkgPSAxKQorICAgIHB1YmxpYyB2b2lkIGZpcnN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3QoMSk7CisgICAgfQorCisgICAgQFRlc3QocHJpb3JpdHkgPSAyKQorICAgIHB1YmxpYyB2b2lkIHNlY29uZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0KDEpOworICAgIH0KKworICAgIEBUZXN0KHByaW9yaXR5ID0gMykKKyAgICBwdWJsaWMgdm9pZCB0aGlyZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0KDEpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0KGZpbmFsIEludGVnZXIgZXhwZWN0ZWQpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3BvbnNlLmdldFN0YXR1cygpLCAyMDApOworICAgICAgICBhc3NlcnRFcXVhbHMocmVzcG9uc2UucmVhZEVudGl0eShJbnRlZ2VyLmNsYXNzKSwgZXhwZWN0ZWQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9SRUFETUUgYi90ZXN0cy9lMmUvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMjQ1NmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvUkVBRE1FCkBAIC0wLDAgKzEsMjAgQEAKKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCitFbmQtdG8tZW5kIHRlc3RzIG1vZHVsZQorPT09PT09PT09PT09PT09PT09PT09PT0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvcG9tLnhtbCBiL3Rlc3RzL2UyZS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkOTM0NmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvcG9tLnhtbApAQCAtMCwwICsxLDIyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0czwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmUyZTwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1lMmU8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+SmVyc2V5IEUyRSB0ZXN0czwvZGVzY3JpcHRpb24+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8Zm9ya0NvdW50PjE8L2ZvcmtDb3VudD4KKyAgICAgICAgICAgICAgICAgICAgPHJldXNlRm9ya3M+ZmFsc2U8L3JldXNlRm9ya3M+CisgICAgICAgICAgICAgICAgICAgIDxlbmFibGVBc3NlcnRpb25zPmZhbHNlPC9lbmFibGVBc3NlcnRpb25zPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LmFubm90YXRpb248L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5hbm5vdGF0aW9uLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tdmM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbXZjLWZyZWVtYXJrZXI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbXZjLW11c3RhY2hlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtanNvbi1qYWNrc29uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtanNvbi1qYWNrc29uMTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLWpzb24tamV0dGlzb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1tb3h5PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtanNvbi1wcm9jZXNzaW5nPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWJlYW4tdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1lbnRpdHktZmlsdGVyaW5nPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW12Yy1iZWFuLXZhbGlkYXRpb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1zc2U8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1tdWx0aXBhcnQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb25uZWN0b3JzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWFwYWNoZS1jb25uZWN0b3I8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb25uZWN0b3JzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWdyaXp6bHktY29ubmVjdG9yPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29ubmVjdG9yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1qZXR0eS1jb25uZWN0b3I8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb25uZWN0b3JzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWpkay1jb25uZWN0b3I8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZWN1cml0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm9hdXRoMS1zaWduYXR1cmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZWN1cml0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm9hdXRoMS1jbGllbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZWN1cml0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm9hdXRoMS1zZXJ2ZXI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZWN1cml0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm9hdXRoMi1jbGllbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZ3VhdmE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5ndWF2YTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7Z3VhdmEudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXV0aWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5oYW1jcmVzdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmhhbWNyZXN0LWxpYnJhcnk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPnhtbHVuaXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD54bWx1bml0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnhkazwvaWQ+CisgICAgICAgICAgICA8cHJvcGVydGllcz4KKyAgICAgICAgICAgICAgICA8IS0tIGRvIG5vdCB1c2Ugc2VjdXJpdHkgbWFuYWdlciBmb3IgeGRrIC0tPgorICAgICAgICAgICAgICAgIDxzdXJlZmlyZS5zZWN1cml0eS5hcmdsaW5lIC8+CisgICAgICAgICAgICA8L3Byb3BlcnRpZXM+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+c29uYXI8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5NYW5hZ2VtZW50PgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBkaXNhYmxlIEphQ29DbyBsaXN0ZW5lciBiZWNhdXNlIGl0J3Mgbm90IHdvcmtpbmcgd2l0aCA8Zm9ya01vZGU+YWx3YXlzPC9mb3JrPiAoPHJldXNlRm9ya3M+ZmFsc2U8L3JldXNlRm9ya3M+IHJlc3BlY3RpdmVseSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9qaXJhLnNvbmFyc291cmNlLmNvbS9icm93c2UvU09OQVJKQVZBLTcyOCAoaHR0cHM6Ly9naXRodWIuY29tL1NvbmFyU291cmNlL3NvbmFyLWphdmEvcHVsbC8zMjQpIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydGllcyBjb21iaW5lLnNlbGY9Im92ZXJyaWRlIiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5NYW5hZ2VtZW50PgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorCisgICAgPC9wcm9maWxlcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL0Fib3J0aW5nRmlsdGVyVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL0Fib3J0aW5nRmlsdGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MWMyNGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvQWJvcnRpbmdGaWx0ZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuYXBpOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlc3BvbnNlRmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5EeW5hbWljRmVhdHVyZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuUmVzb3VyY2VJbmZvOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmFwYWNoZS5jb25uZWN0b3IuQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBKRVJTRVktMjM0NSBSZXByb2R1Y2VyLgorICogPHAvPgorICogSWYgYW4gaW52YWxpZCBXV1ctQXV0aGVudGljYXRlIGhlYWRlciBpcyBzZW50IGZyb20gdGhlIHNlcnZlciBhbmQgSHR0cFVybENvbm5lY3RvciBpcyB1c2VkLAorICogZHVyaW5nIHByb2Nlc3NpbmcgaW4gdGhlIENvbm5lY3RvciBhbiBFeGNlcHRpb24gaXMgdGhyb3duIChIdHRwVXJsQ29ubmVjdGlvbiBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIEF1dGhlbnRpY2F0ZUhlYWRlciBjbGFzcworICogd2hpY2ggdHJpZXMgdG8gcGFyc2UgdGhlIGhlYWRlciB2YWx1ZSBkdXJpbmcgY29uc3RydWN0aW9uLiBJZiBhIHNjaGVtZSBpcyBtaXNzaW5nIChoZWFkZXIgdmFsdWUgaXMgb25lIHdvcmQpLAorICogdGhlIGNvbnN0cnVjdG9yIHRocm93cyBhbiBleGNlcHRpb24uCisgKiA8cC8+CisgKiBUaGlzIGNhbm5vdCBiZSAiZml4ZWQiIGluIEplcnNleS4KKyAqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBBYm9ydGluZ0ZpbHRlclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihBYm9ydGluZ0ZpbHRlclRlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIEBQYXRoKCJzaW1wbGUiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2ltcGxlVGVzdFJlc291cmNlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgUmVzcG9uc2Ugc2ltcGxlVGVzdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgicmVzcG9uc2UiKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBzaW1wbGVSZXNwb25zZVRlc3QoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImRpcmVjdCIpCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGRpcmVjdFJlc3BvbnNlVGVzdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoUmVzcG9uc2UuU3RhdHVzLlVOQVVUSE9SSVpFRCkuaGVhZGVyKCJXV1ctQXV0aGVudGljYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgIm9hdXRoX3Byb2JsZW09dG9rZW5fcmVqZWN0ZWQiKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBYm9ydGluZ0ZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgUmVzcG9uc2UuUmVzcG9uc2VCdWlsZGVyIGJ1aWxkZXIgPSBSZXNwb25zZS5zdGF0dXMoUmVzcG9uc2UuU3RhdHVzLlVOQVVUSE9SSVpFRCk7CisgICAgICAgICAgICBidWlsZGVyLmhlYWRlcigiV1dXLUF1dGhlbnRpY2F0ZSIsICJvYXV0aF9wcm9ibGVtPXRva2VuX3JlamVjdGVkIik7CisgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5hYm9ydFdpdGgoYnVpbGRlci5idWlsZCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQWJvcnRpbmdSZXNwb25zZUZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCwgQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlLlJlc3BvbnNlQnVpbGRlciBidWlsZGVyID0gUmVzcG9uc2Uuc3RhdHVzKFJlc3BvbnNlLlN0YXR1cy5VTkFVVEhPUklaRUQpOworICAgICAgICAgICAgYnVpbGRlci5oZWFkZXIoIldXVy1BdXRoZW50aWNhdGUiLCAib2F1dGhfcHJvYmxlbT10b2tlbl9yZWplY3RlZCIpOworICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuYWJvcnRXaXRoKGJ1aWxkZXIuYnVpbGQoKSk7CisKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoRmlsdGVyRHluYW1pY0JpbmRpbmcuY2xhc3MsIFNpbXBsZVRlc3RSZXNvdXJjZS5jbGFzcywgTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRyeSB0byBhYm9ydCByZXNwb25zZSBpbiB0aGUgY29udGFpbmVyIHJlc3BvbnNlIGZpbHRlci4gSG93ZXZlciwgaXQncyB0b28gbGF0ZSBhbmQgcHJvZHVjZXMgYW4gZXJyb3IuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWJvcnRpbmdSZXNwb25zZUZpbHRlcigpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJzaW1wbGUvcmVzcG9uc2UiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGludCBzdGF0dXMgPSByZXNwb25zZS5nZXRTdGF0dXMoKTsKKyAgICAgICAgbG9nZ2VyLmluZm8oIlJlc3BvbnNlIHN0YXR1cyBpczogIiArIHN0YXR1cyk7CisgICAgICAgIGFzc2VydEVxdWFscyhzdGF0dXMsIFJlc3BvbnNlLlN0YXR1cy5JTlRFUk5BTF9TRVJWRVJfRVJST1IuZ2V0U3RhdHVzQ29kZSgpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUcnkgdG8gYWJvcnQgcmVzcG9uc2UgaW4gYSBjb250YWluZXIgcmVxdWVzdCBmaWx0ZXIuIFdpdGggYW4gaW52YWxpZCBXV1ctQXV0aGVudGljYXRlIGhlYWRlciAoYWNjb3JkaW5nIHRvIEhUVFAgc3BlY3MpCisgICAgICogYW5kIEh0dHBVcmxDb25uZWN0b3IsIGl0IHRocm93cyBhbiBleGNlcHRpb24uIFRoaXMgaXMgYW4gb3JpZ2luYWwgc2NlbmFyaW8gcmVwb3J0ZWQgYnkganJoM2s1IG9uIGphdmEubmV0CisgICAgICovCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBQcm9jZXNzaW5nRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RBYm9ydGluZ0ZpbHRlcigpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJzaW1wbGUiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGludCBzdGF0dXMgPSByZXNwb25zZS5nZXRTdGF0dXMoKTsKKyAgICAgICAgbG9nZ2VyLmluZm8oIlJlc3BvbnNlIHN0YXR1cyBpczogIiArIHN0YXR1cyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG9yaWdpbmFsIHJlcHJvdGVkIHNjZW5hcmlvIHdpdGggYSBkaWZmZXJlbnQgQ29ubmVjdG9yLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFib3J0aW5nRmlsdGVyV2l0aEFwYWNoZUNvbm5lY3RvcigpIHsKKyAgICAgICAgQ2xpZW50Q29uZmlnIGNsaWVudENvbmZpZyA9IG5ldyBDbGllbnRDb25maWcoKTsKKyAgICAgICAgY2xpZW50Q29uZmlnLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBBcGFjaGVDb25uZWN0b3JQcm92aWRlcigpKTsKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KGNsaWVudENvbmZpZyk7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSBjbGllbnQudGFyZ2V0KGdldEJhc2VVcmkoKSkucGF0aCgiL3NpbXBsZSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgaW50IHN0YXR1cyA9IHJlc3BvbnNlLmdldFN0YXR1cygpOworICAgICAgICBsb2dnZXIuaW5mbygiUmVzcG9uc2Ugc3RhdHVzIGlzOiAiICsgc3RhdHVzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHN0YXR1cywgUmVzcG9uc2UuU3RhdHVzLlVOQVVUSE9SSVpFRC5nZXRTdGF0dXNDb2RlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgdGVzdCBzaG93cywgdGhhdCB0aGUgYmVoYXZpb3VyIGlzIG5vdCBjYXVzZWQgYnkgdGhlIHVzZSBvZiB0aGUgZmlsdGVycywgYnV0IGJ5IHRoZSByZXNwb25zZSBjb250ZW50IGl0c2VsZi4KKyAgICAgKi8KKyAgICBAVGVzdChleHBlY3RlZCA9IFByb2Nlc3NpbmdFeGNlcHRpb24uY2xhc3MpCisgICAgcHVibGljIHZvaWQgdGVzdERpcmVjdFJlc3BvbnNlKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInNpbXBsZS9kaXJlY3QiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGludCBzdGF0dXMgPSByZXNwb25zZS5nZXRTdGF0dXMoKTsKKyAgICAgICAgbG9nZ2VyLmluZm8oIlJlc3BvbnNlIHN0YXR1cyBpczogIiArIHN0YXR1cyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogRHluYW1pY2FsbHkgbGF1bmNoIHNwZWNpZmljIGZpbHRlcnMgZm9yIHNwZWNpZmljIHJlc291cmNlIG1ldGhvZHMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZpbHRlckR5bmFtaWNCaW5kaW5nIGltcGxlbWVudHMgRHluYW1pY0ZlYXR1cmUgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY29uZmlndXJlKFJlc291cmNlSW5mbyByZXNvdXJjZUluZm8sIEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIGlmIChTaW1wbGVUZXN0UmVzb3VyY2UuY2xhc3MuZXF1YWxzKHJlc291cmNlSW5mby5nZXRSZXNvdXJjZUNsYXNzKCkpKSB7CisgICAgICAgICAgICAgICAgU3RyaW5nIG1ldGhvZE5hbWUgPSByZXNvdXJjZUluZm8uZ2V0UmVzb3VyY2VNZXRob2QoKS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKG1ldGhvZE5hbWUuY29udGFpbnMoInNpbXBsZVJlc3BvbnNlVGVzdCIpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoQWJvcnRpbmdSZXNwb25zZUZpbHRlci5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJBYm9ydGluZyB3aWxsIHRha2UgcGxhY2UgaW4gUmVzcG9uc2VGaWx0ZXIuIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtZXRob2ROYW1lLmNvbnRhaW5zKCJzaW1wbGVUZXN0IikpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihBYm9ydGluZ0ZpbHRlci5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCJBYm9ydGluZyB3aWxsIHRha2UgcGxhY2UgaW4gUmVxdWVzdEZpbHRlci4iKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygiUmVzcG9uc2Ugd2lsbCBub3QgYmUgYWJvcnRlZC4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvQWNjZXB0TWVkaWFUeXBlUHJvdmlkZXJUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvQWNjZXB0TWVkaWFUeXBlUHJvdmlkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNhZTE2NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9BY2NlcHRNZWRpYVR5cGVQcm92aWRlclRlc3QuamF2YQpAQCAtMCwwICsxLDQxMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5hcGk7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuQWNjZXB0YWJsZU1lZGlhVHlwZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkh0dHBIZWFkZXJSZWFkZXI7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBAYXV0aG9yIHVua25vd24KKyAqLworcHVibGljIGNsYXNzIEFjY2VwdE1lZGlhVHlwZVByb3ZpZGVyVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPbmVNZWRpYVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGhlYWRlciA9ICJhcHBsaWNhdGlvbi94bWwiOworICAgICAgICBMaXN0PEFjY2VwdGFibGVNZWRpYVR5cGU+IGwgPSBIdHRwSGVhZGVyUmVhZGVyLnJlYWRBY2NlcHRNZWRpYVR5cGUoaGVhZGVyKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbC5zaXplKCkpOworCisgICAgICAgIE1lZGlhVHlwZSBtID0gbC5nZXQoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYXBwbGljYXRpb24iLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygieG1sIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPbmVNZWRpYVR5cGVXaXRoUGFyYW1ldGVycygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgaGVhZGVyID0gImFwcGxpY2F0aW9uL3htbDtjaGFyc2V0PXV0ZjgiOworICAgICAgICBMaXN0PEFjY2VwdGFibGVNZWRpYVR5cGU+IGwgPSBIdHRwSGVhZGVyUmVhZGVyLnJlYWRBY2NlcHRNZWRpYVR5cGUoaGVhZGVyKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbC5zaXplKCkpOworCisgICAgICAgIE1lZGlhVHlwZSBtID0gbC5nZXQoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygiYXBwbGljYXRpb24iLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygieG1sIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShtLmdldFBhcmFtZXRlcnMoKS5jb250YWluc0tleSgiY2hhcnNldCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ1dGY4IiwgbS5nZXRQYXJhbWV0ZXJzKCkuZ2V0KCJjaGFyc2V0IikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlTWVkaWFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBoZWFkZXIgPSAiYXBwbGljYXRpb24veG1sLCB0ZXh0L3htbCwgdGV4dC9odG1sIjsKKyAgICAgICAgTGlzdDxBY2NlcHRhYmxlTWVkaWFUeXBlPiBsID0gSHR0cEhlYWRlclJlYWRlci5yZWFkQWNjZXB0TWVkaWFUeXBlKGhlYWRlcik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGwuc2l6ZSgpKTsKKworICAgICAgICBNZWRpYVR5cGUgbTsKKyAgICAgICAgbSA9IGwuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoImFwcGxpY2F0aW9uIiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInhtbCIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCgxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInhtbCIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCgyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImh0bWwiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlTWVkaWFUeXBlV2l0aFF1YWxpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGhlYWRlciA9ICJhcHBsaWNhdGlvbi94bWw7cT0wLjEsIHRleHQveG1sO3E9MC4yLCB0ZXh0L2h0bWw7cT0wLjMiOworICAgICAgICBMaXN0PEFjY2VwdGFibGVNZWRpYVR5cGU+IGwgPSBIdHRwSGVhZGVyUmVhZGVyLnJlYWRBY2NlcHRNZWRpYVR5cGUoaGVhZGVyKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMywgbC5zaXplKCkpOworCisgICAgICAgIE1lZGlhVHlwZSBtOworICAgICAgICBtID0gbC5nZXQoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygidGV4dCIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJodG1sIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygieG1sIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFwcGxpY2F0aW9uIiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInhtbCIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SHR0cFVSTENvbm5lY3Rpb25BY2NlcHRIZWFkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGhlYWRlciA9ICJ0ZXh0L2h0bWwsIGltYWdlL2dpZiwgaW1hZ2UvanBlZywgKjsgcT0uMiwgKi8qOyBxPS4yIjsKKyAgICAgICAgTGlzdDxBY2NlcHRhYmxlTWVkaWFUeXBlPiBsID0gSHR0cEhlYWRlclJlYWRlci5yZWFkQWNjZXB0TWVkaWFUeXBlKGhlYWRlcik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIGwuc2l6ZSgpKTsKKworICAgICAgICBNZWRpYVR5cGUgbTsKKyAgICAgICAgbSA9IGwuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaHRtbCIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCgxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbWFnZSIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnaWYiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoMik7CisgICAgICAgIGFzc2VydEVxdWFscygiaW1hZ2UiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygianBlZyIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCgzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqIiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIioiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoNCk7CisgICAgICAgIGFzc2VydEVxdWFscygiKiIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGaXJlZm94QWNjZXB0SGVhZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBoZWFkZXIgPSAidGV4dC94bWwsYXBwbGljYXRpb24veG1sLGFwcGxpY2F0aW9uL3hodG1sK3htbCx0ZXh0L2h0bWw7cT0wLjksdGV4dC9wbGFpbjtxPTAuOCxpbWFnZS9wbmcsKi8qO3E9MC41IjsKKyAgICAgICAgTGlzdDxBY2NlcHRhYmxlTWVkaWFUeXBlPiBsID0gSHR0cEhlYWRlclJlYWRlci5yZWFkQWNjZXB0TWVkaWFUeXBlKGhlYWRlcik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDcsIGwuc2l6ZSgpKTsKKworICAgICAgICBNZWRpYVR5cGUgbTsKKyAgICAgICAgbSA9IGwuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygieG1sIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFwcGxpY2F0aW9uIiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInhtbCIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCgyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcHBsaWNhdGlvbiIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4aHRtbCt4bWwiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoMyk7CisgICAgICAgIGFzc2VydEVxdWFscygiaW1hZ2UiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygicG5nIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDQpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaHRtbCIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCg1KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBsYWluIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDYpOworICAgICAgICBhc3NlcnRFcXVhbHMoIioiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKiIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2l0aFN0YXJBY2NlcHRIZWFkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGhlYWRlciA9ICJhcHBsaWNhdGlvbi94bWw7cT0wLjEsIHRleHQveG1sO3E9MC4yLCAqO3E9MC4zIjsKKyAgICAgICAgTGlzdDxBY2NlcHRhYmxlTWVkaWFUeXBlPiBsID0gSHR0cEhlYWRlclJlYWRlci5yZWFkQWNjZXB0TWVkaWFUeXBlKGhlYWRlcik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGwuc2l6ZSgpKTsKKworICAgICAgICBNZWRpYVR5cGUgbTsKKyAgICAgICAgbSA9IGwuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoIioiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKiIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCgxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInhtbCIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCgyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcHBsaWNhdGlvbiIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4bWwiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1lZGlhVHlwZVNwZWNpZml0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgaGVhZGVyID0gIiovKiwgdGV4dC8qLCB0ZXh0L3BsYWluIjsKKyAgICAgICAgTGlzdDxBY2NlcHRhYmxlTWVkaWFUeXBlPiBsID0gSHR0cEhlYWRlclJlYWRlci5yZWFkQWNjZXB0TWVkaWFUeXBlKGhlYWRlcik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGwuc2l6ZSgpKTsKKworICAgICAgICBNZWRpYVR5cGUgbTsKKyAgICAgICAgbSA9IGwuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygicGxhaW4iLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoMSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGV4dCIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIioiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKiIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWVkaWFUeXBlU3BlY2lmaXR5V2l0aFF1YWxpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGhlYWRlciA9ICIqLyosICovKjtxPTAuNSwgdGV4dC8qLCB0ZXh0Lyo7cT0wLjUsIHRleHQvcGxhaW4sIHRleHQvcGxhaW47cT0wLjUiOworICAgICAgICBMaXN0PEFjY2VwdGFibGVNZWRpYVR5cGU+IGwgPSBIdHRwSGVhZGVyUmVhZGVyLnJlYWRBY2NlcHRNZWRpYVR5cGUoaGVhZGVyKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNiwgbC5zaXplKCkpOworCisgICAgICAgIE1lZGlhVHlwZSBtOworICAgICAgICBtID0gbC5nZXQoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygidGV4dCIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwbGFpbiIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCgxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIioiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoMik7CisgICAgICAgIGFzc2VydEVxdWFscygiKiIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDMpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygicGxhaW4iLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoNCk7CisgICAgICAgIGFzc2VydEVxdWFscygidGV4dCIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDUpOworICAgICAgICBhc3NlcnRFcXVhbHMoIioiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKiIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWVkaWFUeXBlU3BlY2lmaXR5SFRUUEV4YW1wbGUxKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBoZWFkZXIgPSAidGV4dC8qLCB0ZXh0L2h0bWwsIHRleHQvaHRtbDtsZXZlbD0xLCAqLyoiOworICAgICAgICBMaXN0PEFjY2VwdGFibGVNZWRpYVR5cGU+IGwgPSBIdHRwSGVhZGVyUmVhZGVyLnJlYWRBY2NlcHRNZWRpYVR5cGUoaGVhZGVyKTsKKworICAgICAgICBNZWRpYVR5cGUgbTsKKyAgICAgICAgbSA9IGwuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaHRtbCIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCgxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImh0bWwiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoMik7CisgICAgICAgIGFzc2VydEVxdWFscygidGV4dCIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDMpOworICAgICAgICBhc3NlcnRFcXVhbHMoIioiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKiIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWVkaWFUeXBlU3BlY2lmaXR5SFRUUEV4YW1wbGUyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBoZWFkZXIgPSAidGV4dC8qLCB0ZXh0L2h0bWw7bGV2ZWw9MSwgdGV4dC9odG1sLCAqLyoiOworICAgICAgICBMaXN0PEFjY2VwdGFibGVNZWRpYVR5cGU+IGwgPSBIdHRwSGVhZGVyUmVhZGVyLnJlYWRBY2NlcHRNZWRpYVR5cGUoaGVhZGVyKTsKKworICAgICAgICBNZWRpYVR5cGUgbTsKKyAgICAgICAgbSA9IGwuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaHRtbCIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCgxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImh0bWwiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoMik7CisgICAgICAgIGFzc2VydEVxdWFscygidGV4dCIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDMpOworICAgICAgICBhc3NlcnRFcXVhbHMoIioiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKiIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SHR0cFVSTENvbm5lY3Rpb25BY2NlcHRIZWFkZXJXaXRoUHJvcml0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgaGVhZGVyID0gInRleHQvaHRtbCwgaW1hZ2UvZ2lmLCBpbWFnZS9qcGVnLCAqOyBxPS4yLCAqLyo7IHE9LjIiOworCisgICAgICAgIExpc3Q8QWNjZXB0YWJsZU1lZGlhVHlwZT4gbCA9IEh0dHBIZWFkZXJSZWFkZXIucmVhZEFjY2VwdE1lZGlhVHlwZShoZWFkZXIsCisgICAgICAgICAgICAgICAgSHR0cEhlYWRlclJlYWRlci5yZWFkUXVhbGl0eVNvdXJjZU1lZGlhVHlwZShNZWRpYVR5cGUuVEVYVF9IVE1MKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUsIGwuc2l6ZSgpKTsKKworICAgICAgICBNZWRpYVR5cGUgbTsKKyAgICAgICAgbSA9IGwuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaHRtbCIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCgxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbWFnZSIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnaWYiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoMik7CisgICAgICAgIGFzc2VydEVxdWFscygiaW1hZ2UiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygianBlZyIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCgzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqIiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIioiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoNCk7CisgICAgICAgIGFzc2VydEVxdWFscygiKiIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGaXJlZm94QWNjZXB0SGVhZGVyV2l0aFByb3JpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGhlYWRlciA9ICJ0ZXh0L3htbCxhcHBsaWNhdGlvbi94bWwsYXBwbGljYXRpb24veGh0bWwreG1sLHRleHQvaHRtbDtxPTAuOSx0ZXh0L3BsYWluO3E9MC44LGltYWdlL3BuZywqLyo7cT0wLjUiOworICAgICAgICBMaXN0PEFjY2VwdGFibGVNZWRpYVR5cGU+IGwgPSBIdHRwSGVhZGVyUmVhZGVyLnJlYWRBY2NlcHRNZWRpYVR5cGUoCisgICAgICAgICAgICAgICAgaGVhZGVyLCBIdHRwSGVhZGVyUmVhZGVyLnJlYWRRdWFsaXR5U291cmNlTWVkaWFUeXBlKCJ0ZXh0L2h0bWw7cXM9MSIpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNywgbC5zaXplKCkpOworCisgICAgICAgIE1lZGlhVHlwZSBtOworICAgICAgICBtID0gbC5nZXQoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygidGV4dCIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJodG1sIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygieG1sIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFwcGxpY2F0aW9uIiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInhtbCIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCgzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcHBsaWNhdGlvbiIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4aHRtbCt4bWwiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoNCk7CisgICAgICAgIGFzc2VydEVxdWFscygiaW1hZ2UiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygicG5nIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDUpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygicGxhaW4iLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoNik7CisgICAgICAgIGFzc2VydEVxdWFscygiKiIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGaXJlZm94QWNjZXB0SGVhZGVyV2l0aFByb3JpdHkyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBoZWFkZXIgPSAidGV4dC94bWwsYXBwbGljYXRpb24veG1sLGFwcGxpY2F0aW9uL3hodG1sK3htbCx0ZXh0L2h0bWw7cT0wLjksdGV4dC9wbGFpbjtxPTAuOCxpbWFnZS9wbmcsKi8qO3E9MC41IjsKKyAgICAgICAgTGlzdDxBY2NlcHRhYmxlTWVkaWFUeXBlPiBsID0gSHR0cEhlYWRlclJlYWRlci5yZWFkQWNjZXB0TWVkaWFUeXBlKAorICAgICAgICAgICAgICAgIGhlYWRlciwKKyAgICAgICAgICAgICAgICBIdHRwSGVhZGVyUmVhZGVyLnJlYWRRdWFsaXR5U291cmNlTWVkaWFUeXBlKG5ldyBTdHJpbmdbXXsidGV4dC9odG1sO3FzPTAuOCIsICJhcHBsaWNhdGlvbi94bWw7cXM9MC4xIn0pKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNywgbC5zaXplKCkpOworCisgICAgICAgIE1lZGlhVHlwZSBtOworICAgICAgICBtID0gbC5nZXQoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygidGV4dCIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJodG1sIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFwcGxpY2F0aW9uIiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInhtbCIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCgyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInhtbCIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCgzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcHBsaWNhdGlvbiIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4aHRtbCt4bWwiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoNCk7CisgICAgICAgIGFzc2VydEVxdWFscygiaW1hZ2UiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygicG5nIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDUpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygicGxhaW4iLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoNik7CisgICAgICAgIGFzc2VydEVxdWFscygiKiIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvQW5ub3RhdGlvbkluaGVyaXRhbmNlVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL0Fubm90YXRpb25Jbmhlcml0YW5jZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmJiODZmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL0Fubm90YXRpb25Jbmhlcml0YW5jZVRlc3QuamF2YQpAQCAtMCwwICsxLDE2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5hcGk7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3QgdGhhdCBKQVgtUlMgYW5ub3RhdGlvbnMgYXJlIGNvcnJlY3RseSBpbmhlcml0ZWQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpY2F0aW9uLgorICoKKyAqIFRoZSBhbm5vdGF0aW9ucyBvbiBhIHN1cGVyLWNsYXNzIHNob3VsZCB0YWtlIHByZWNlZGVuY2Ugb3ZlciBhbm5vdGF0aW9ucyBvbiBhbiBpbnRlcmZhY2UuCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQW5ub3RhdGlvbkluaGVyaXRhbmNlVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoCisgICAgICAgICAgICAgICAgRm9vLmNsYXNzLCBCYXIuY2xhc3MKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50ZXJmYWNlIFN1cGVyRm9vYWJsZSBleHRlbmRzIEZvb2FibGUgeworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJzdXBlckZvb2FibGVXaGF0c1VwIikKKyAgICAgICAgU3RyaW5nIGdldFdoYXRzVXAoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgaW50ZXJmYWNlIEZvb2FibGUgeworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJmb29hYmxlSGVsbG8iKQorICAgICAgICBTdHJpbmcgZ2V0SGVsbG8oKTsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJmb29hYmxlSGkiKQorICAgICAgICBTdHJpbmcgZ2V0SGkoKTsKKworICAgIH0KKworICAgIHB1YmxpYyBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgU3VwZXJGb28gaW1wbGVtZW50cyBTdXBlckZvb2FibGUgeworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJzdXBlckZvb0hlbGxvIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRIZWxsbygpIHsKKyAgICAgICAgICAgIHJldHVybiAiLVdST05HIE1FU1NBR0UtIjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG5vIGFubm90YXRpb25zIGhlcmUgdGhpcyB0aW1lCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SGkoKSB7CisgICAgICAgICAgICByZXR1cm4gIi1XUk9ORyBNRVNTQUdFLSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCh2YWx1ZSA9ICIvZm9vIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZvbyBleHRlbmRzIFN1cGVyRm9vIGltcGxlbWVudHMgRm9vYWJsZSB7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SGVsbG8oKSB7CisgICAgICAgICAgICByZXR1cm4gIkhlbGxvISI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEhpKCkgeworICAgICAgICAgICAgcmV0dXJuICJIaSEiOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRXaGF0c1VwKCkgeworICAgICAgICAgICAgcmV0dXJuICJXaGF0J3MgdXA/IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJoeXBlckJhciIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBIeXBlckJhciB7CisKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN1cGVyQmFyIGV4dGVuZHMgSHlwZXJCYXIgeworICAgIH0KKworICAgIEBQYXRoKCJiYXJhYmxlIikKKyAgICBwdWJsaWMgaW50ZXJmYWNlIEJhcmFibGUgeworICAgIH0KKworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCYXIgZXh0ZW5kcyBTdXBlckJhciBpbXBsZW1lbnRzIEJhcmFibGUgeworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJiYXIiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEJhcigpIHsKKyAgICAgICAgICAgIHJldHVybiAiYmFyIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCB3aGVuIHRoZXJlIGFyZSBjb25mbGljdGluZyBhbm5vdGF0aW9ucyBvbiB0aGUgbWV0aG9kcywgdGhlIGFubm90YXRpb25zIGluIHRoZSBzdXBlcmNsYXNzIGhhcyBoaWdoZXIKKyAgICAgKiBwcmlvcml0eSB0aGFuIHRoZSBvbmUgaW4gdGhlIGludGVyZmFjZS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdXBlckNsYXNzUHJlY2VkZW5jZSgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHN1cGVyQ2xhc3NSZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoImZvby9zdXBlckZvb0hlbGxvIikucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9QTEFJTikuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiVGhlIHBhdGggZnJvbSB0aGUgc3VwZXItY2xhc3MgYW5ub3RhdGlvbiBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSBwYXRoIGZyb20gaW50ZXJmYWNlIiwKKyAgICAgICAgICAgICAgICAiSGVsbG8hIiwgc3VwZXJDbGFzc1Jlc3BvbnNlKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSBpZmFjZVJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiZm9vL2Zvb2FibGVIZWxsbyIpLnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfUExBSU4pLmdldChSZXNwb25zZS5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiVGhlIHBhdGggZGVmaW5lZCBpbiB0aGUgaW50ZXJmYWNlIGFubm90YXRpb24gc2hvdWxkIG5vdCBleGlzdC4iLCA0MDQsIGlmYWNlUmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCB0aGUgYW5ub3RhdGlvbiBpcyBpbmhlcml0ZWQgZnJvbSB0aGUgaW50ZXJmYWNlLCBpZiBpdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhlIGNoYWluIG9mIHN1cGVyY2xhc3Nlcy4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnRlcmZhY2VBbm5vdGF0aW9uSW5oZXJpdGFuY2UoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoImZvby9mb29hYmxlSGkiKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUaGUgcGF0aCBmcm9tIHRoZSBzdXBlci1jbGFzcyBhbm5vdGF0aW9uIHNob3VsZCBpbmhlcml0ZWQuIiwKKyAgICAgICAgICAgICAgICAiSGkhIiwgcmVzcG9uc2UpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCBpZiB0aGUgYW5ub3RhdGlvbiBpcyBub3QgZm91bmQgaW4gdGhlIGNoYWluIG9mIHN1cGVyY2xhc3NlcywgaXQgaXMgaW5oZXJpdGVkIGZyb20gdGhlIGludGVyZmFjZSwgdGhhdAorICAgICAqIGlzICJuZWFyZXN0IiBpdG8gdGhlIGNsYXNzLiBJbiB0aGlzIHBhcnRpY3VsYXIgY2FzZSAtIHN1cGVyY2xhc3NlcyBkbyBub3QgaGF2ZSBhbm5vdGF0aW9uLAorICAgICAqIHRoYXQgY291bGQgYmUgaW5oZXJpdGVkLCBuZWl0aGVyIGRvZXMgdGhlIGludGVyZmFjZSBkaXJlY3RseSBpbXBsZW1lbnRlZCBieSB0aGUgY2xhc3MsIHNvIHRoZSB0ZXN0IGV4cGVjdHMgdGhlCisgICAgICogYW5ub3RhdGlvbiB0byBiZSBpbmhlcml0ZWQgZnJvbSB0aGUgaW50ZXJmYWNlIG9mIHRoZSBzdXBlcmNsYXNzLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluaGVyaXRlbmNlRnJvbVN1cGVyY2xhc3NJbnRlcmZhY2UoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoImZvby9zdXBlckZvb2FibGVXaGF0c1VwIikucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9QTEFJTikuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiVGhlIHBhdGggZnJvbSB0aGUgaW50ZXJmYWNlIG9mIHRoZSBzdXBlcmNsYXNzIHNob3VsZCBpbmhlcml0ZWQuIiwKKyAgICAgICAgICAgICAgICAiV2hhdCdzIHVwPyIsIHJlc3BvbnNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoYXQgY2xhc3MtbGV2ZWwgYW5ub3RhdGlvbiBiZWhhdmUgaW4gdGhlIHNpbWlsYXIgbWFubmVyIGFzIHRoZSBtZXRob2QtbGV2ZWwgYW5ub3RhdGlvbnMsIGFsdGhvdWdoIHRoaXMKKyAgICAgKiBiZWhhdmlvdXIgaXMgbm90IGRpcmVjdGx5IHNwZWNpZmllZCBpbiB0aGUgSlNSLTMzOSAoaW4gdGhlIENoYXB0ZXIgMy42LiwgdGhlIHNwZWNpZmljYXRpb24gZXhwbGljaXRseSBzdGF0ZXMKKyAgICAgKiB0aGF0ICJOb3RlIHRoYXQgaW5oZXJpdGFuY2Ugb2YgY2xhc3Mgb3IgaW50ZXJmYWNlIGFubm90YXRpb25zIGlzIG5vdCBzdXBwb3J0ZWQiLgorICAgICAqCisgICAgICogSmVyc2V5IGRvZXMgc3VwcG9ydCBjbGFzcy1sZXZlbCBhbm5vdGF0aW9ucyBpbmhlcml0YW5jZSBhcyBpdHMgc3BlY2lmaWMgYmVoYXZpb3VyIGJleW9uZCB0aGUgSlNSIHNjb3BlLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsYXNzQW5ub3RhdGlvbkluaGVyaXRhbmNlKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgc3VwZXJDbGFzc1Jlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiaHlwZXJCYXIvYmFyIikucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9QTEFJTikuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiVGhlIHBhdGggZnJvbSB0aGUgc3VwZXJjbGFzcyBhbm5vdGF0aW9uIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIHBhdGggZnJvbSBpbnRlcmZhY2UiLAorICAgICAgICAgICAgICAgICJiYXIiLCBzdXBlckNsYXNzUmVzcG9uc2UpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIGlmYWNlUmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJiYXJhYmxlL2JhciIpLnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfUExBSU4pLmdldChSZXNwb25zZS5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiVGhlIHBhdGggZGVmaW5lZCBpbiB0aGUgaW50ZXJmYWNlIGFubm90YXRpb24gc2hvdWxkIG5vdCBleGlzdC4iLCA0MDQsIGlmYWNlUmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvQ2FjaGVDb250cm9sSW1wbFRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9DYWNoZUNvbnRyb2xJbXBsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3OGM5NjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvQ2FjaGVDb250cm9sSW1wbFRlc3QuamF2YQpAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5hcGk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNhY2hlQ29udHJvbDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuQ2FjaGVDb250cm9sUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQGF1dGhvciBNYXJjIEhhZGxleQorICovCitwdWJsaWMgY2xhc3MgQ2FjaGVDb250cm9sSW1wbFRlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7CisgICAgICAgIENhY2hlQ29udHJvbFByb3ZpZGVyIHAgPSBuZXcgQ2FjaGVDb250cm9sUHJvdmlkZXIoKTsKKyAgICAgICAgQ2FjaGVDb250cm9sIGluc3RhbmNlID0gbmV3IENhY2hlQ29udHJvbCgpOworCisgICAgICAgIGluc3RhbmNlLnNldE5vQ2FjaGUodHJ1ZSk7CisgICAgICAgIFN0cmluZyBleHBSZXN1bHQgPSAibm8tY2FjaGUsIG5vLXRyYW5zZm9ybSI7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSBwLnRvU3RyaW5nKGluc3RhbmNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cFJlc3VsdCwgcmVzdWx0KTsKKworICAgICAgICBpbnN0YW5jZS5zZXROb1N0b3JlKHRydWUpOworICAgICAgICBleHBSZXN1bHQgPSAibm8tY2FjaGUsIG5vLXN0b3JlLCBuby10cmFuc2Zvcm0iOworICAgICAgICByZXN1bHQgPSBwLnRvU3RyaW5nKGluc3RhbmNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cFJlc3VsdCwgcmVzdWx0KTsKKworICAgICAgICBpbnN0YW5jZS5zZXRQcml2YXRlKHRydWUpOworICAgICAgICBleHBSZXN1bHQgPSAicHJpdmF0ZSwgbm8tY2FjaGUsIG5vLXN0b3JlLCBuby10cmFuc2Zvcm0iOworICAgICAgICByZXN1bHQgPSBwLnRvU3RyaW5nKGluc3RhbmNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cFJlc3VsdCwgcmVzdWx0KTsKKworICAgICAgICBpbnN0YW5jZS5nZXRQcml2YXRlRmllbGRzKCkuYWRkKCJGcmVkIik7CisgICAgICAgIGV4cFJlc3VsdCA9ICJwcml2YXRlPVwiRnJlZFwiLCBuby1jYWNoZSwgbm8tc3RvcmUsIG5vLXRyYW5zZm9ybSI7CisgICAgICAgIHJlc3VsdCA9IHAudG9TdHJpbmcoaW5zdGFuY2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwUmVzdWx0LCByZXN1bHQpOworICAgICAgICBpbnN0YW5jZS5nZXRQcml2YXRlRmllbGRzKCkuYWRkKCJCb2IiKTsKKyAgICAgICAgZXhwUmVzdWx0ID0gInByaXZhdGU9XCJGcmVkLCBCb2JcIiwgbm8tY2FjaGUsIG5vLXN0b3JlLCBuby10cmFuc2Zvcm0iOworICAgICAgICByZXN1bHQgPSBwLnRvU3RyaW5nKGluc3RhbmNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cFJlc3VsdCwgcmVzdWx0KTsKKworICAgICAgICBpbnN0YW5jZSA9IG5ldyBDYWNoZUNvbnRyb2woKTsKKyAgICAgICAgaW5zdGFuY2UuZ2V0Q2FjaGVFeHRlbnNpb24oKS5wdXQoImtleTEiLCAidmFsdWUxIik7CisgICAgICAgIGV4cFJlc3VsdCA9ICJuby10cmFuc2Zvcm0sIGtleTE9dmFsdWUxIjsKKyAgICAgICAgcmVzdWx0ID0gcC50b1N0cmluZyhpbnN0YW5jZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBSZXN1bHQsIHJlc3VsdCk7CisgICAgICAgIGluc3RhbmNlLmdldENhY2hlRXh0ZW5zaW9uKCkucHV0KCJrZXkxIiwgInZhbHVlMSB3aXRoIHNwYWNlcyIpOworICAgICAgICBleHBSZXN1bHQgPSAibm8tdHJhbnNmb3JtLCBrZXkxPVwidmFsdWUxIHdpdGggc3BhY2VzXCIiOworICAgICAgICByZXN1bHQgPSBwLnRvU3RyaW5nKGluc3RhbmNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cFJlc3VsdCwgcmVzdWx0KTsKKworICAgICAgICBpbnN0YW5jZS5zZXROb1N0b3JlKHRydWUpOworICAgICAgICBleHBSZXN1bHQgPSAibm8tc3RvcmUsIG5vLXRyYW5zZm9ybSwga2V5MT1cInZhbHVlMSB3aXRoIHNwYWNlc1wiIjsKKyAgICAgICAgcmVzdWx0ID0gcC50b1N0cmluZyhpbnN0YW5jZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBSZXN1bHQsIHJlc3VsdCk7CisKKyAgICAgICAgaW5zdGFuY2UgPSBuZXcgQ2FjaGVDb250cm9sKCk7CisgICAgICAgIGluc3RhbmNlLmdldENhY2hlRXh0ZW5zaW9uKCkucHV0KCJrZXkxIiwgbnVsbCk7CisgICAgICAgIGV4cFJlc3VsdCA9ICJuby10cmFuc2Zvcm0sIGtleTEiOworICAgICAgICByZXN1bHQgPSBwLnRvU3RyaW5nKGluc3RhbmNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cFJlc3VsdCwgcmVzdWx0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSb3VuZFRyaXAoKSB7CisgICAgICAgIGNoZWNrUm91bmRUcmlwKCJuby1jYWNoZSwgbm8tdHJhbnNmb3JtIik7CisgICAgICAgIGNoZWNrUm91bmRUcmlwKCJuby1jYWNoZSwgbm8tc3RvcmUsIG5vLXRyYW5zZm9ybSIpOworICAgICAgICBjaGVja1JvdW5kVHJpcCgicHJpdmF0ZSwgbm8tY2FjaGUsIG5vLXN0b3JlLCBuby10cmFuc2Zvcm0iKTsKKyAgICAgICAgY2hlY2tSb3VuZFRyaXAoInByaXZhdGU9XCJGcmVkXCIsIG5vLWNhY2hlLCBuby1zdG9yZSwgbm8tdHJhbnNmb3JtIik7CisgICAgICAgIGNoZWNrUm91bmRUcmlwKCJwcml2YXRlPVwiRnJlZCwgQm9iXCIsIG5vLWNhY2hlLCBuby1zdG9yZSwgbm8tdHJhbnNmb3JtIik7CisgICAgICAgIGNoZWNrUm91bmRUcmlwKCJuby10cmFuc2Zvcm0sIGtleTE9dmFsdWUxIik7CisgICAgICAgIGNoZWNrUm91bmRUcmlwKCJuby10cmFuc2Zvcm0sIGtleTE9XCJ2YWx1ZTEgd2l0aCBzcGFjZXNcIiIpOworICAgICAgICBjaGVja1JvdW5kVHJpcCgibm8tc3RvcmUsIG5vLXRyYW5zZm9ybSwga2V5MT1cInZhbHVlMSB3aXRoIHNwYWNlc1wiIik7CisgICAgICAgIGNoZWNrUm91bmRUcmlwKCJuby10cmFuc2Zvcm0sIGtleTEiKTsKKyAgICAgICAgY2hlY2tSb3VuZFRyaXAoIm11c3QtcmV2YWxpZGF0ZSwgcHJveHktcmV2YWxpZGF0ZSIpOworICAgICAgICBjaGVja1JvdW5kVHJpcCgibWF4LWFnZT0xLCBzLW1heGFnZT0xIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGNoZWNrUm91bmRUcmlwKFN0cmluZyBzKSB7CisgICAgICAgIENhY2hlQ29udHJvbFByb3ZpZGVyIHAgPSBuZXcgQ2FjaGVDb250cm9sUHJvdmlkZXIoKTsKKworICAgICAgICBDYWNoZUNvbnRyb2wgY2MxID0gcC5mcm9tU3RyaW5nKHMpOworICAgICAgICBDYWNoZUNvbnRyb2wgY2MyID0gcC5mcm9tU3RyaW5nKGNjMS50b1N0cmluZygpKTsKKyAgICAgICAgY2MyLnRvU3RyaW5nKCk7CisKKyAgICAgICAgY2MxLmVxdWFscyhjYzIpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY2MxLCBjYzIpOworICAgICAgICB9IGNhdGNoIChSdW50aW1lRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9DbGllbnRJbnZvY2F0aW9uVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL0NsaWVudEludm9jYXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAwZjBlYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9DbGllbnRJbnZvY2F0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzQzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmFwaTsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5Bc3luY0ludm9rZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuSW52b2NhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuSW52b2NhdGlvbkNhbGxiYWNrOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuR2VuZXJpY1R5cGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiB7QGxpbmsgSW52b2NhdGlvbn0gRTJFIEFQSSB0ZXN0cy4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIENsaWVudEludm9jYXRpb25UZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5WT0NBVElPTlMgPSA1OworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gIk9LIjsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdChmaW5hbCBTdHJpbmcgZW50aXR5KSB7CisgICAgICAgICAgICByZXR1cm4gZW50aXR5OworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVTeW5jSW52b2tlckNhbGxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEludm9jYXRpb24uQnVpbGRlciByZXF1ZXN0ID0gdGFyZ2V0KCkucmVxdWVzdCgpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgSU5WT0NBVElPTlM7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXF1ZXN0LmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoIk9LIikpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVTeW5jSW52b2tlckNhbGxzQXNTdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSW52b2NhdGlvbi5CdWlsZGVyIHJlcXVlc3QgPSB0YXJnZXQoKS5yZXF1ZXN0KCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBJTlZPQ0FUSU9OUzsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHJlcXVlc3QuZ2V0KFN0cmluZy5jbGFzcyksIGlzKCJPSyIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlU3luY0ludm9rZXJDYWxsc0FzR2VuZXJpY1R5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSW52b2NhdGlvbi5CdWlsZGVyIHJlcXVlc3QgPSB0YXJnZXQoKS5yZXF1ZXN0KCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBJTlZPQ0FUSU9OUzsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHJlcXVlc3QuZ2V0KG5ldyBHZW5lcmljVHlwZTxTdHJpbmc+KCkge30pLCBpcygiT0siKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZVN5bmNJbnZva2VyQ2FsbHNXaXRoRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEludm9jYXRpb24uQnVpbGRlciByZXF1ZXN0ID0gdGFyZ2V0KCkucmVxdWVzdCgpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgSU5WT0NBVElPTlM7IGkrKykgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVudGl0eSA9ICJNZXNzYWdlOiAiICsgaTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQocmVxdWVzdC5wb3N0KEVudGl0eS50ZXh0KGVudGl0eSkpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoZW50aXR5KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZVN5bmNJbnZva2VyQ2FsbHNBc1N0cmluZ1dpdGhFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSW52b2NhdGlvbi5CdWlsZGVyIHJlcXVlc3QgPSB0YXJnZXQoKS5yZXF1ZXN0KCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBJTlZPQ0FUSU9OUzsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW50aXR5ID0gIk1lc3NhZ2U6ICIgKyBpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXF1ZXN0LnBvc3QoRW50aXR5LnRleHQoZW50aXR5KSwgU3RyaW5nLmNsYXNzKSwgaXMoZW50aXR5KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZVN5bmNJbnZva2VyQ2FsbHNBc0dlbmVyaWNUeXBlV2l0aEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBJbnZvY2F0aW9uLkJ1aWxkZXIgcmVxdWVzdCA9IHRhcmdldCgpLnJlcXVlc3QoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IElOVk9DQVRJT05TOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbnRpdHkgPSAiTWVzc2FnZTogIiArIGk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHJlcXVlc3QucG9zdChFbnRpdHkudGV4dChlbnRpdHkpLCBuZXcgR2VuZXJpY1R5cGU8U3RyaW5nPigpIHt9KSwgaXMoZW50aXR5KSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUFzeW5jSW52b2tlckNhbGxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEFzeW5jSW52b2tlciByZXF1ZXN0ID0gdGFyZ2V0KCkucmVxdWVzdCgpLmFzeW5jKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBJTlZPQ0FUSU9OUzsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHJlcXVlc3QuZ2V0KCkuZ2V0KCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBpcygiT0siKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUFzeW5jSW52b2tlckNhbGxzQXNTdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQXN5bmNJbnZva2VyIHJlcXVlc3QgPSB0YXJnZXQoKS5yZXF1ZXN0KCkuYXN5bmMoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IElOVk9DQVRJT05TOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydFRoYXQocmVxdWVzdC5nZXQoU3RyaW5nLmNsYXNzKS5nZXQoKSwgaXMoIk9LIikpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVBc3luY0ludm9rZXJDYWxsc0FzR2VuZXJpY1R5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQXN5bmNJbnZva2VyIHJlcXVlc3QgPSB0YXJnZXQoKS5yZXF1ZXN0KCkuYXN5bmMoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IElOVk9DQVRJT05TOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydFRoYXQocmVxdWVzdC5nZXQobmV3IEdlbmVyaWNUeXBlPFN0cmluZz4oKSB7fSkuZ2V0KCksIGlzKCJPSyIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlQXN5bmNJbnZva2VyQ2FsbHNXaXRoRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEFzeW5jSW52b2tlciByZXF1ZXN0ID0gdGFyZ2V0KCkucmVxdWVzdCgpLmFzeW5jKCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBJTlZPQ0FUSU9OUzsgaSsrKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW50aXR5ID0gIk1lc3NhZ2U6ICIgKyBpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXF1ZXN0LnBvc3QoRW50aXR5LnRleHQoZW50aXR5KSkuZ2V0KCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBpcyhlbnRpdHkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlQXN5bmNJbnZva2VyQ2FsbHNBc1N0cmluZ1dpdGhFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQXN5bmNJbnZva2VyIHJlcXVlc3QgPSB0YXJnZXQoKS5yZXF1ZXN0KCkuYXN5bmMoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IElOVk9DQVRJT05TOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBlbnRpdHkgPSAiTWVzc2FnZTogIiArIGk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHJlcXVlc3QucG9zdChFbnRpdHkudGV4dChlbnRpdHkpLCBTdHJpbmcuY2xhc3MpLmdldCgpLCBpcyhlbnRpdHkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlQXN5bmNJbnZva2VyQ2FsbHNBc0dlbmVyaWNUeXBlV2l0aEVudGl0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBBc3luY0ludm9rZXIgcmVxdWVzdCA9IHRhcmdldCgpLnJlcXVlc3QoKS5hc3luYygpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgSU5WT0NBVElPTlM7IGkrKykgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIGVudGl0eSA9ICJNZXNzYWdlOiAiICsgaTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQocmVxdWVzdC5wb3N0KEVudGl0eS50ZXh0KGVudGl0eSksIG5ldyBHZW5lcmljVHlwZTxTdHJpbmc+KCkge30pLmdldCgpLCBpcyhlbnRpdHkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlSW52b2NhdGlvbkludm9rZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSW52b2NhdGlvbiBpbnZvY2F0aW9uID0gdGFyZ2V0KCkucmVxdWVzdCgpLmJ1aWxkR2V0KCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBJTlZPQ0FUSU9OUzsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGludm9jYXRpb24uaW52b2tlKCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBpcygiT0siKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUludm9jYXRpb25JbnZva2VzQXNTdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSW52b2NhdGlvbiBpbnZvY2F0aW9uID0gdGFyZ2V0KCkucmVxdWVzdCgpLmJ1aWxkR2V0KCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBJTlZPQ0FUSU9OUzsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGludm9jYXRpb24uaW52b2tlKFN0cmluZy5jbGFzcyksIGlzKCJPSyIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlSW52b2NhdGlvbkludm9rZXNBc0dlbmVyaWNUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEludm9jYXRpb24gaW52b2NhdGlvbiA9IHRhcmdldCgpLnJlcXVlc3QoKS5idWlsZEdldCgpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgSU5WT0NBVElPTlM7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0VGhhdChpbnZvY2F0aW9uLmludm9rZShuZXcgR2VuZXJpY1R5cGU8U3RyaW5nPigpIHt9KSwgaXMoIk9LIikpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVJbnZvY2F0aW9uSW52b2tlc1dpdGhFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSW52b2NhdGlvbiBpbnZvY2F0aW9uID0gdGFyZ2V0KCkucmVxdWVzdCgpLmJ1aWxkUG9zdChFbnRpdHkudGV4dCgiT0siKSk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBJTlZPQ0FUSU9OUzsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGludm9jYXRpb24uaW52b2tlKCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBpcygiT0siKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUludm9jYXRpb25JbnZva2VzQXNTdHJpbmdXaXRoRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEludm9jYXRpb24gaW52b2NhdGlvbiA9IHRhcmdldCgpLnJlcXVlc3QoKS5idWlsZFBvc3QoRW50aXR5LnRleHQoIk9LIikpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgSU5WT0NBVElPTlM7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0VGhhdChpbnZvY2F0aW9uLmludm9rZShTdHJpbmcuY2xhc3MpLCBpcygiT0siKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUludm9jYXRpb25JbnZva2VzQXNHZW5lcmljVHlwZVdpdGhFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSW52b2NhdGlvbiBpbnZvY2F0aW9uID0gdGFyZ2V0KCkucmVxdWVzdCgpLmJ1aWxkUG9zdChFbnRpdHkudGV4dCgiT0siKSk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBJTlZPQ0FUSU9OUzsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGludm9jYXRpb24uaW52b2tlKG5ldyBHZW5lcmljVHlwZTxTdHJpbmc+KCkge30pLCBpcygiT0siKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUludm9jYXRpb25TdWJtaXRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEludm9jYXRpb24gaW52b2NhdGlvbiA9IHRhcmdldCgpLnJlcXVlc3QoKS5idWlsZEdldCgpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgSU5WT0NBVElPTlM7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0VGhhdChpbnZvY2F0aW9uLnN1Ym1pdCgpLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoIk9LIikpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVJbnZvY2F0aW9uU3VibWl0c0FzU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEludm9jYXRpb24gaW52b2NhdGlvbiA9IHRhcmdldCgpLnJlcXVlc3QoKS5idWlsZEdldCgpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgSU5WT0NBVElPTlM7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0VGhhdChpbnZvY2F0aW9uLnN1Ym1pdChTdHJpbmcuY2xhc3MpLmdldCgpLCBpcygiT0siKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUludm9jYXRpb25TdWJtaXRzQXNHZW5lcmljVHlwZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBJbnZvY2F0aW9uIGludm9jYXRpb24gPSB0YXJnZXQoKS5yZXF1ZXN0KCkuYnVpbGRHZXQoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IElOVk9DQVRJT05TOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoaW52b2NhdGlvbi5zdWJtaXQobmV3IEdlbmVyaWNUeXBlPFN0cmluZz4oKSB7fSkuZ2V0KCksIGlzKCJPSyIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlQ2FsbGJhY2tJbnZvY2F0aW9uU3VibWl0cygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBJbnZvY2F0aW9uIGludm9jYXRpb24gPSB0YXJnZXQoKS5yZXF1ZXN0KCkuYnVpbGRHZXQoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IElOVk9DQVRJT05TOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworICAgICAgICAgICAgZmluYWwgQXRvbWljUmVmZXJlbmNlPFN0cmluZz4gcmVzcG9uc2UgPSBuZXcgQXRvbWljUmVmZXJlbmNlPD4oKTsKKworICAgICAgICAgICAgaW52b2NhdGlvbi5zdWJtaXQobmV3IEludm9jYXRpb25DYWxsYmFjazxTdHJpbmc+KCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbXBsZXRlZChmaW5hbCBTdHJpbmcgcykgeworICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5zZXQocyk7CisgICAgICAgICAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZhaWxlZChmaW5hbCBUaHJvd2FibGUgdGhyb3dhYmxlKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldCh0aHJvd2FibGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIGxhdGNoLmF3YWl0KDUsIFRpbWVVbml0LlNFQ09ORFMpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXQoKSwgaXMoIk9LIikpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVJbnZvY2F0aW9uU3VibWl0c1dpdGhFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSW52b2NhdGlvbiBpbnZvY2F0aW9uID0gdGFyZ2V0KCkucmVxdWVzdCgpLmJ1aWxkUG9zdChFbnRpdHkudGV4dCgiT0siKSk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBJTlZPQ0FUSU9OUzsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGludm9jYXRpb24uc3VibWl0KCkuZ2V0KCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBpcygiT0siKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUludm9jYXRpb25TdWJtaXRzQXNTdHJpbmdXaXRoRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEludm9jYXRpb24gaW52b2NhdGlvbiA9IHRhcmdldCgpLnJlcXVlc3QoKS5idWlsZFBvc3QoRW50aXR5LnRleHQoIk9LIikpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgSU5WT0NBVElPTlM7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0VGhhdChpbnZvY2F0aW9uLnN1Ym1pdChTdHJpbmcuY2xhc3MpLmdldCgpLCBpcygiT0siKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUludm9jYXRpb25TdWJtaXRzQXNHZW5lcmljVHlwZVdpdGhFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgSW52b2NhdGlvbiBpbnZvY2F0aW9uID0gdGFyZ2V0KCkucmVxdWVzdCgpLmJ1aWxkUG9zdChFbnRpdHkudGV4dCgiT0siKSk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBJTlZPQ0FUSU9OUzsgaSsrKSB7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGludm9jYXRpb24uc3VibWl0KG5ldyBHZW5lcmljVHlwZTxTdHJpbmc+KCkge30pLmdldCgpLCBpcygiT0siKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNdWx0aXBsZUNhbGxiYWNrSW52b2NhdGlvblN1Ym1pdHNXaXRoRW50aXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEludm9jYXRpb24gaW52b2NhdGlvbiA9IHRhcmdldCgpLnJlcXVlc3QoKS5idWlsZFBvc3QoRW50aXR5LnRleHQoIk9LIikpOworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgSU5WT0NBVElPTlM7IGkrKykgeworICAgICAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgICAgICBmaW5hbCBBdG9taWNSZWZlcmVuY2U8U3RyaW5nPiByZXNwb25zZSA9IG5ldyBBdG9taWNSZWZlcmVuY2U8PigpOworCisgICAgICAgICAgICBpbnZvY2F0aW9uLnN1Ym1pdChuZXcgSW52b2NhdGlvbkNhbGxiYWNrPFN0cmluZz4oKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY29tcGxldGVkKGZpbmFsIFN0cmluZyBzKSB7CisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnNldChzKTsKKyAgICAgICAgICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZmFpbGVkKGZpbmFsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0KHRocm93YWJsZS5nZXRNZXNzYWdlKCkpOworICAgICAgICAgICAgICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKworICAgICAgICAgICAgbGF0Y2guYXdhaXQoNSwgVGltZVVuaXQuU0VDT05EUyk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldCgpLCBpcygiT0siKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9Db25zdHJ1Y3RvclNlbGVjdGlvblRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9Db25zdHJ1Y3RvclNlbGVjdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWM0ZDFkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL0NvbnN0cnVjdG9yU2VsZWN0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjI5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmFwaTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVxdWVzdDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcnM7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CisKKy8qKgorICogVGVzdCB0byB2ZXJpZnkgdGhlIHByb3BlciBjb25zdHJ1Y3RvciBpcyBzZWxlY3RlZC4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQ29uc3RydWN0b3JTZWxlY3Rpb25UZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICAvKioKKyAgICAgKiBBIHJlc291cmNlIHdpdGggbXVsdGlwbGUgY29uc3RydWN0b3JzLgorICAgICAqLworICAgIEBQYXRoKCJyZXNvdXJjZS10ZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE11bHRpcGxlQ29uc3RydWN0b3JSZXNvdXJjZSB7CisgICAgICAgIHByaXZhdGUgSHR0cEhlYWRlcnMgaGVhZGVyczsKKyAgICAgICAgcHJpdmF0ZSBVcmlJbmZvIGluZm87CisgICAgICAgIHByaXZhdGUgQXBwbGljYXRpb24gYXBwbGljYXRpb247CisgICAgICAgIHByaXZhdGUgUmVxdWVzdCByZXF1ZXN0OworICAgICAgICBwcml2YXRlIFByb3ZpZGVycyBwcm92aWRlcjsKKworICAgICAgICBwdWJsaWMgTXVsdGlwbGVDb25zdHJ1Y3RvclJlc291cmNlKCl7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTXVsdGlwbGVDb25zdHJ1Y3RvclJlc291cmNlKEBDb250ZXh0IEh0dHBIZWFkZXJzIGhlYWRlcnMpeworICAgICAgICAgICAgdGhpcy5oZWFkZXJzID0gaGVhZGVyczsKKyAgICAgICAgfQorCisKKyAgICAgICAgcHVibGljIE11bHRpcGxlQ29uc3RydWN0b3JSZXNvdXJjZShAQ29udGV4dCBIdHRwSGVhZGVycyBoZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBDb250ZXh0IFVyaUluZm8gaW5mbyl7CisgICAgICAgICAgICB0aGlzLmhlYWRlcnMgPSBoZWFkZXJzOworICAgICAgICAgICAgdGhpcy5pbmZvID0gaW5mbzsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBNdWx0aXBsZUNvbnN0cnVjdG9yUmVzb3VyY2UoQENvbnRleHQgSHR0cEhlYWRlcnMgaGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAQ29udGV4dCBVcmlJbmZvIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQENvbnRleHQgQXBwbGljYXRpb24gYXBwbGljYXRpb24peworICAgICAgICAgICAgdGhpcy5hcHBsaWNhdGlvbiA9IGFwcGxpY2F0aW9uOworICAgICAgICAgICAgdGhpcy5oZWFkZXJzID0gaGVhZGVyczsKKyAgICAgICAgICAgIHRoaXMuaW5mbyA9IGluZm87CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTXVsdGlwbGVDb25zdHJ1Y3RvclJlc291cmNlKEBDb250ZXh0IEh0dHBIZWFkZXJzIGhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQENvbnRleHQgVXJpSW5mbyBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBDb250ZXh0IEFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBDb250ZXh0IFJlcXVlc3QgcmVxdWVzdCl7CisgICAgICAgICAgICB0aGlzLmFwcGxpY2F0aW9uID0gYXBwbGljYXRpb247CisgICAgICAgICAgICB0aGlzLmhlYWRlcnMgPSBoZWFkZXJzOworICAgICAgICAgICAgdGhpcy5pbmZvID0gaW5mbzsKKyAgICAgICAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7CisgICAgICAgIH0KKworICAgICAgICBwcm90ZWN0ZWQgTXVsdGlwbGVDb25zdHJ1Y3RvclJlc291cmNlKEBDb250ZXh0IEh0dHBIZWFkZXJzIGhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQENvbnRleHQgVXJpSW5mbyBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBDb250ZXh0IEFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBDb250ZXh0IFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAQ29udGV4dCBQcm92aWRlcnMgcHJvdmlkZXIpeworICAgICAgICAgICAgdGhpcy5hcHBsaWNhdGlvbiA9IGFwcGxpY2F0aW9uOworICAgICAgICAgICAgdGhpcy5oZWFkZXJzID0gaGVhZGVyczsKKyAgICAgICAgICAgIHRoaXMuaW5mbyA9IGluZm87CisgICAgICAgICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OworICAgICAgICAgICAgdGhpcy5wcm92aWRlciA9IHByb3ZpZGVyOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgaXNVc2VkQ29uc3RydWN0b3JXaXRoTW9zdEF0dHJpYnV0ZXMoKXsKKyAgICAgICAgICAgIGJvb2xlYW4gb2sgPSBhcHBsaWNhdGlvbiAhPSBudWxsOworICAgICAgICAgICAgb2sgJj0gaGVhZGVycyAhPSBudWxsOworICAgICAgICAgICAgb2sgJj0gaW5mbyAhPSBudWxsOworICAgICAgICAgICAgb2sgJj0gcmVxdWVzdCAhPSBudWxsOworICAgICAgICAgICAgb2sgJj0gcHJvdmlkZXIgPT0gbnVsbDsKKyAgICAgICAgICAgIFJlc3BvbnNlLlN0YXR1cyBzdGF0dXMgPSBvayA/IFJlc3BvbnNlLlN0YXR1cy5PSyA6IFJlc3BvbnNlLlN0YXR1cy5JTlRFUk5BTF9TRVJWRVJfRVJST1I7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKHN0YXR1cykuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFByb3ZpZGVyIHdpdGggbXVsdGlwbGUgY29uc3RydWN0b3JzLgorICAgICAqLworICAgIEBQcm92aWRlcgorICAgIEBDb25zdW1lcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN0cmluZ1JlYWRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5UmVhZGVyPFN0cmluZz4geworICAgICAgICBwcml2YXRlIEh0dHBIZWFkZXJzIGhlYWRlcnM7CisgICAgICAgIHByaXZhdGUgVXJpSW5mbyBpbmZvOworICAgICAgICBwcml2YXRlIEFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uOworICAgICAgICBwcml2YXRlIFJlcXVlc3QgcmVxdWVzdDsKKyAgICAgICAgcHJpdmF0ZSBQcm92aWRlcnMgcHJvdmlkZXJzOworCisgICAgICAgIHByb3RlY3RlZCBTdHJpbmdSZWFkZXIoQENvbnRleHQgSHR0cEhlYWRlcnMgaGVhZGVycywgQENvbnRleHQgVXJpSW5mbyBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBDb250ZXh0IEFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uLCBAQ29udGV4dCBSZXF1ZXN0IHJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQENvbnRleHQgUHJvdmlkZXJzIHByb3ZpZGVycykgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnM7CisgICAgICAgICAgICB0aGlzLmluZm8gPSBpbmZvOworICAgICAgICAgICAgdGhpcy5hcHBsaWNhdGlvbiA9IGFwcGxpY2F0aW9uOworICAgICAgICAgICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDsKKyAgICAgICAgICAgIHRoaXMucHJvdmlkZXJzID0gcHJvdmlkZXJzOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZ1JlYWRlcihAQ29udGV4dCBIdHRwSGVhZGVycyBoZWFkZXJzLCBAQ29udGV4dCBVcmlJbmZvIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQENvbnRleHQgQXBwbGljYXRpb24gYXBwbGljYXRpb24sIEBDb250ZXh0IFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnM7CisgICAgICAgICAgICB0aGlzLmluZm8gPSBpbmZvOworICAgICAgICAgICAgdGhpcy5hcHBsaWNhdGlvbiA9IGFwcGxpY2F0aW9uOworICAgICAgICAgICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmdSZWFkZXIoQENvbnRleHQgSHR0cEhlYWRlcnMgaGVhZGVycywgQENvbnRleHQgVXJpSW5mbyBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBDb250ZXh0IEFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uKSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICAgICAgdGhpcy5oZWFkZXJzID0gaGVhZGVyczsKKyAgICAgICAgICAgIHRoaXMuaW5mbyA9IGluZm87CisgICAgICAgICAgICB0aGlzLmFwcGxpY2F0aW9uID0gYXBwbGljYXRpb247CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nUmVhZGVyKEBDb250ZXh0IEh0dHBIZWFkZXJzIGhlYWRlcnMsIEBDb250ZXh0IFVyaUluZm8gaW5mbykgeworICAgICAgICAgICAgc3VwZXIoKTsKKyAgICAgICAgICAgIHRoaXMuaGVhZGVycyA9IGhlYWRlcnM7CisgICAgICAgICAgICB0aGlzLmluZm8gPSBpbmZvOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZ1JlYWRlcihAQ29udGV4dCBIdHRwSGVhZGVycyBoZWFkZXJzKSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICAgICAgdGhpcy5oZWFkZXJzID0gaGVhZGVyczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSBTdHJpbmcuY2xhc3M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyByZWFkRnJvbShDbGFzczxTdHJpbmc+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBodHRwSGVhZGVycywgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKQorICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgaWYgKGhlYWRlcnMgPT0gbnVsbCB8fCBpbmZvID09IG51bGwgfHwgYXBwbGljYXRpb24gPT0gbnVsbCB8fCByZXF1ZXN0ID09IG51bGwgfHwgcHJvdmlkZXJzICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gImZhaWwiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuICJwYXNzIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJwcm92aWRlci10ZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFByb3ZpZGVyUmVzb3VyY2UgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZWNobyhTdHJpbmcgZW50aXR5KSB7CisgICAgICAgICAgICByZXR1cm4gZW50aXR5OworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKE11bHRpcGxlQ29uc3RydWN0b3JSZXNvdXJjZS5jbGFzcywgUHJvdmlkZXJSZXNvdXJjZS5jbGFzcywgU3RyaW5nUmVhZGVyLmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBKRVJTRVktMTUyOSByZXByb2R1Y2VyLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlQ29uc3RydWN0b3JTZWxlY3Rpb24oKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJyZXNvdXJjZS10ZXN0IikucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydE5vdE51bGwoIlJldHVybmVkIHJlc3BvbnNlIG11c3Qgbm90IGJlIG51bGwuIiwgcmVzcG9uc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlJlc291cmNlIGNvbnN0cnVjdG9yIHdpdGggbW9zdCBhcmd1bWVudHMgaGFzIG5vdCBiZWVuIHNlbGVjdGVkLiIsIDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEpFUlNFWS0xNzEyIHJlcHJvZHVjZXIuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvdmlkZXJDb25zdHJ1Y3RvclNlbGVjdGlvbigpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoInByb3ZpZGVyLXRlc3QiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkudGV4dCgiZWNobyIpKTsKKworICAgICAgICBhc3NlcnROb3ROdWxsKCJSZXR1cm5lZCByZXNwb25zZSBtdXN0IG5vdCBiZSBudWxsLiIsIHJlc3BvbnNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBhc3MiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9Db25zdW1lUHJvZHVjZVRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9Db25zdW1lUHJvZHVjZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzk0NjY3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL0NvbnN1bWVQcm9kdWNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmFwaTsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5NZWRpYVR5cGVzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqLworcHVibGljIGNsYXNzIENvbnN1bWVQcm9kdWNlVGVzdCB7CisgICAgQENvbnN1bWVzKHsiKi8qIiwgImEvKiIsICJiLyoiLCAiYS9iIiwgImMvZCJ9KQorICAgIGNsYXNzIENvbnN1bWVzQ2xhc3MgeworICAgIH0KKworICAgIEBQcm9kdWNlcyAoeyIqLyoiLCAiYS8qIiwgImIvKiIsICJhL2IiLCAiYy9kIn0pCisgICAgY2xhc3MgUHJvZHVjZXNDbGFzcyB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3VtZXMoKSB7CisgICAgICAgIGZpbmFsIENvbnN1bWVzIGMgPSBDb25zdW1lc0NsYXNzLmNsYXNzLmdldEFubm90YXRpb24oQ29uc3VtZXMuY2xhc3MpOworICAgICAgICBmaW5hbCBMaXN0PE1lZGlhVHlwZT4gbCA9IE1lZGlhVHlwZXMuY3JlYXRlRnJvbShjKTsKKyAgICAgICAgY2hlY2tNZWRpYVR5cGVzKGwpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByb2R1Y2VzKCkgeworICAgICAgICBmaW5hbCBQcm9kdWNlcyBwID0gUHJvZHVjZXNDbGFzcy5jbGFzcy5nZXRBbm5vdGF0aW9uKFByb2R1Y2VzLmNsYXNzKTsKKyAgICAgICAgZmluYWwgTGlzdDxNZWRpYVR5cGU+IGwgPSBNZWRpYVR5cGVzLmNyZWF0ZUZyb20ocCk7CisgICAgICAgIGNoZWNrTWVkaWFUeXBlcyhsKTsKKyAgICB9CisKKyAgICBAQ29uc3VtZXMoIiovKiwgYS8qLCBiLyosIGEvYiwgYy9kIikKKyAgICBjbGFzcyBDb25zdW1lc1N0cmluZ0NsYXNzIHsKKyAgICB9CisKKyAgICBAUHJvZHVjZXMoIiovKiwgYS8qLCBiLyosIGEvYiwgYy9kIikKKyAgICBjbGFzcyBQcm9kdWNlc1N0cmluZ0NsYXNzIHsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdW1lc1N0cmluZygpIHsKKyAgICAgICAgZmluYWwgQ29uc3VtZXMgYyA9IENvbnN1bWVzU3RyaW5nQ2xhc3MuY2xhc3MuZ2V0QW5ub3RhdGlvbihDb25zdW1lcy5jbGFzcyk7CisgICAgICAgIGZpbmFsIExpc3Q8TWVkaWFUeXBlPiBsID0gTWVkaWFUeXBlcy5jcmVhdGVGcm9tKGMpOworICAgICAgICBjaGVja01lZGlhVHlwZXMobCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvZHVjZXNTdHJpbmcoKSB7CisgICAgICAgIGZpbmFsIFByb2R1Y2VzIHAgPSBQcm9kdWNlc1N0cmluZ0NsYXNzLmNsYXNzLmdldEFubm90YXRpb24oUHJvZHVjZXMuY2xhc3MpOworICAgICAgICBmaW5hbCBMaXN0PE1lZGlhVHlwZT4gbCA9IE1lZGlhVHlwZXMuY3JlYXRlRnJvbShwKTsKKyAgICAgICAgY2hlY2tNZWRpYVR5cGVzKGwpOworICAgIH0KKworICAgIEBDb25zdW1lcyh7IiovKiwgYS8qIiwgImIvKiwgYS9iIiwgImMvZCJ9KQorICAgIGNsYXNzIENvbnN1bWVzU3RyaW5nc0NsYXNzIHsKKyAgICB9CisKKyAgICBAUHJvZHVjZXMoeyIqLyosIGEvKiIsICJiLyosIGEvYiIsICJjL2QifSkKKyAgICBjbGFzcyBQcm9kdWNlc1N0cmluZ3NDbGFzcyB7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3VtZXNTdHJpbmdzKCkgeworICAgICAgICBmaW5hbCBDb25zdW1lcyBjID0gQ29uc3VtZXNTdHJpbmdzQ2xhc3MuY2xhc3MuZ2V0QW5ub3RhdGlvbihDb25zdW1lcy5jbGFzcyk7CisgICAgICAgIGZpbmFsIExpc3Q8TWVkaWFUeXBlPiBsID0gTWVkaWFUeXBlcy5jcmVhdGVGcm9tKGMpOworICAgICAgICBjaGVja01lZGlhVHlwZXMobCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvZHVjZXNTdHJpbmdzKCkgeworICAgICAgICBmaW5hbCBQcm9kdWNlcyBwID0gUHJvZHVjZXNTdHJpbmdzQ2xhc3MuY2xhc3MuZ2V0QW5ub3RhdGlvbihQcm9kdWNlcy5jbGFzcyk7CisgICAgICAgIGZpbmFsIExpc3Q8TWVkaWFUeXBlPiBsID0gTWVkaWFUeXBlcy5jcmVhdGVGcm9tKHApOworICAgICAgICBjaGVja01lZGlhVHlwZXMobCk7CisgICAgfQorCisKKyAgICB2b2lkIGNoZWNrTWVkaWFUeXBlcyhmaW5hbCBMaXN0PE1lZGlhVHlwZT4gbCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoNSwgbC5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCBsLmdldCgwKS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImIiLCBsLmdldCgwKS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImMiLCBsLmdldCgxKS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImQiLCBsLmdldCgxKS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCBsLmdldCgyKS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIioiLCBsLmdldCgyKS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImIiLCBsLmdldCgzKS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIioiLCBsLmdldCgzKS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIioiLCBsLmdldCg0KS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIioiLCBsLmdldCg0KS5nZXRTdWJ0eXBlKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL0NvbnRlbnREaXNwb3NpdGlvblRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9Db250ZW50RGlzcG9zaXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNmMmNkMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9Db250ZW50RGlzcG9zaXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuYXBpOworCitpbXBvcnQgamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LkNvbnRlbnREaXNwb3NpdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkh0dHBEYXRlRm9ybWF0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuSHR0cEhlYWRlclJlYWRlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICogQGF1dGhvciBJbXJhbkBTbWFydElURW5naW5lZXJpbmcuQ29tCisgKi8KK3B1YmxpYyBjbGFzcyBDb250ZW50RGlzcG9zaXRpb25UZXN0IHsKKworICAgIHByb3RlY3RlZCBTdHJpbmcgY29udGVudERpc3Bvc2l0aW9uVHlwZTsKKworICAgIHB1YmxpYyBDb250ZW50RGlzcG9zaXRpb25UZXN0KCkgeworICAgICAgICBjb250ZW50RGlzcG9zaXRpb25UeXBlID0gImlubGluZSI7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlKCkgeworICAgICAgICBDb250ZW50RGlzcG9zaXRpb24gY29udGVudERpc3Bvc2l0aW9uID0gQ29udGVudERpc3Bvc2l0aW9uLnR5cGUobnVsbCkuYnVpbGQoKTsKKworICAgICAgICBhc3NlcnROb3ROdWxsKGNvbnRlbnREaXNwb3NpdGlvbik7CisgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCBjb250ZW50RGlzcG9zaXRpb24uZ2V0VHlwZSgpKTsKKworICAgICAgICBjb250ZW50RGlzcG9zaXRpb24gPSBDb250ZW50RGlzcG9zaXRpb24udHlwZShjb250ZW50RGlzcG9zaXRpb25UeXBlKS5idWlsZCgpOworCisgICAgICAgIGFzc2VydE5vdE51bGwoY29udGVudERpc3Bvc2l0aW9uKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnRlbnREaXNwb3NpdGlvblR5cGUsIGNvbnRlbnREaXNwb3NpdGlvbi5nZXRUeXBlKCkpOworCisgICAgICAgIGZpbmFsIERhdGUgZGF0ZSA9IG5ldyBEYXRlKCk7CisgICAgICAgIGNvbnRlbnREaXNwb3NpdGlvbiA9IENvbnRlbnREaXNwb3NpdGlvbi50eXBlKGNvbnRlbnREaXNwb3NpdGlvblR5cGUpLmZpbGVOYW1lKCJ0ZXN0LmZpbGUiKQorICAgICAgICAgICAgICAgIC5jcmVhdGlvbkRhdGUoZGF0ZSkubW9kaWZpY2F0aW9uRGF0ZShkYXRlKS5yZWFkRGF0ZShkYXRlKS5zaXplKDEyMjIpLmJ1aWxkKCk7CisKKyAgICAgICAgYXNzZXJ0Q29udGVudERpc3Bvc2l0aW9uKGNvbnRlbnREaXNwb3NpdGlvbiwgZGF0ZSk7CisgICAgICAgIFN0cmluZyBoZWFkZXIgPSBjb250ZW50RGlzcG9zaXRpb25UeXBlOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb250ZW50RGlzcG9zaXRpb24gPSBuZXcgQ29udGVudERpc3Bvc2l0aW9uKGNvbnRlbnREaXNwb3NpdGlvbi50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoY29udGVudERpc3Bvc2l0aW9uKTsKKyAgICAgICAgICAgIGNvbnRlbnREaXNwb3NpdGlvbiA9IG5ldyBDb250ZW50RGlzcG9zaXRpb24oaGVhZGVyKTsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwoY29udGVudERpc3Bvc2l0aW9uKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhjb250ZW50RGlzcG9zaXRpb25UeXBlLCBjb250ZW50RGlzcG9zaXRpb24uZ2V0VHlwZSgpKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBkYXRlU3RyaW5nID0gSHR0cERhdGVGb3JtYXQuZ2V0UHJlZmVycmVkRGF0ZUZvcm1hdCgpLmZvcm1hdChkYXRlKTsKKyAgICAgICAgICAgIGhlYWRlciA9IGNvbnRlbnREaXNwb3NpdGlvblR5cGUgKyAiO2ZpbGVuYW1lPVwidGVzdC5maWxlXCI7Y3JlYXRpb24tZGF0ZT1cIiIKKyAgICAgICAgICAgICAgICAgICAgKyBkYXRlU3RyaW5nICsgIlwiO21vZGlmaWNhdGlvbi1kYXRlPVwiIiArIGRhdGVTdHJpbmcgKyAiXCI7cmVhZC1kYXRlPVwiIgorICAgICAgICAgICAgICAgICAgICArIGRhdGVTdHJpbmcgKyAiXCI7c2l6ZT0xMjIyIjsKKworICAgICAgICAgICAgY29udGVudERpc3Bvc2l0aW9uID0gbmV3IENvbnRlbnREaXNwb3NpdGlvbihoZWFkZXIpOworICAgICAgICAgICAgYXNzZXJ0Q29udGVudERpc3Bvc2l0aW9uKGNvbnRlbnREaXNwb3NpdGlvbiwgZGF0ZSk7CisgICAgICAgICAgICBjb250ZW50RGlzcG9zaXRpb24gPSBuZXcgQ29udGVudERpc3Bvc2l0aW9uKEh0dHBIZWFkZXJSZWFkZXIubmV3SW5zdGFuY2UoaGVhZGVyKSwgdHJ1ZSk7CisgICAgICAgICAgICBhc3NlcnRDb250ZW50RGlzcG9zaXRpb24oY29udGVudERpc3Bvc2l0aW9uLCBkYXRlKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgUGFyc2VFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGZhaWwoZXguZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IENvbnRlbnREaXNwb3NpdGlvbigoSHR0cEhlYWRlclJlYWRlcikgbnVsbCwgdHJ1ZSk7CisgICAgICAgICAgICBmYWlsKCJOdWxsUG9pbnRlckV4Y2VwdGlvbiB3YXMgZXhwZWN0ZWQgdG8gYmUgdGhyb3duLiIpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBQYXJzZUV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgIGZhaWwoZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIE51bGxQb2ludGVyRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgLy9leHBlY3RlZAorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7CisgICAgICAgIGZpbmFsIERhdGUgZGF0ZSA9IG5ldyBEYXRlKCk7CisgICAgICAgIGZpbmFsIENvbnRlbnREaXNwb3NpdGlvbiBjb250ZW50RGlzcG9zaXRpb24gPSBDb250ZW50RGlzcG9zaXRpb24udHlwZShjb250ZW50RGlzcG9zaXRpb25UeXBlKS5maWxlTmFtZSgidGVzdC5maWxlIikKKyAgICAgICAgICAgICAgICAuY3JlYXRpb25EYXRlKGRhdGUpLm1vZGlmaWNhdGlvbkRhdGUoZGF0ZSkucmVhZERhdGUoZGF0ZSkuc2l6ZSgxMjIyKS5idWlsZCgpOworICAgICAgICBmaW5hbCBTdHJpbmcgZGF0ZVN0cmluZyA9IEh0dHBEYXRlRm9ybWF0LmdldFByZWZlcnJlZERhdGVGb3JtYXQoKS5mb3JtYXQoZGF0ZSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBoZWFkZXIgPSBjb250ZW50RGlzcG9zaXRpb25UeXBlICsgIjsgZmlsZW5hbWU9XCJ0ZXN0LmZpbGVcIjsgY3JlYXRpb24tZGF0ZT1cIiIKKyAgICAgICAgICAgICAgICArIGRhdGVTdHJpbmcgKyAiXCI7IG1vZGlmaWNhdGlvbi1kYXRlPVwiIiArIGRhdGVTdHJpbmcgKyAiXCI7IHJlYWQtZGF0ZT1cIiIgKyBkYXRlU3RyaW5nICsgIlwiOyBzaXplPTEyMjIiOworICAgICAgICBhc3NlcnRFcXVhbHMoaGVhZGVyLCBjb250ZW50RGlzcG9zaXRpb24udG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0Q29udGVudERpc3Bvc2l0aW9uKGZpbmFsIENvbnRlbnREaXNwb3NpdGlvbiBjb250ZW50RGlzcG9zaXRpb24sIERhdGUgZGF0ZSkgeworICAgICAgICBhc3NlcnROb3ROdWxsKGNvbnRlbnREaXNwb3NpdGlvbik7CisgICAgICAgIGFzc2VydEVxdWFscyhjb250ZW50RGlzcG9zaXRpb25UeXBlLCBjb250ZW50RGlzcG9zaXRpb24uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXN0LmZpbGUiLCBjb250ZW50RGlzcG9zaXRpb24uZ2V0RmlsZU5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhkYXRlLnRvU3RyaW5nKCksIGNvbnRlbnREaXNwb3NpdGlvbi5nZXRNb2RpZmljYXRpb25EYXRlKCkudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhkYXRlLnRvU3RyaW5nKCksIGNvbnRlbnREaXNwb3NpdGlvbi5nZXRSZWFkRGF0ZSgpLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZGF0ZS50b1N0cmluZygpLCBjb250ZW50RGlzcG9zaXRpb24uZ2V0Q3JlYXRpb25EYXRlKCkudG9TdHJpbmcoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxMjIyLCBjb250ZW50RGlzcG9zaXRpb24uZ2V0U2l6ZSgpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9Db29raWVJbXBsVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL0Nvb2tpZUltcGxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjRlMTQzNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9Db29raWVJbXBsVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTg4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmFwaTsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvb2tpZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk5ld0Nvb2tpZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuSHR0cEhlYWRlclJlYWRlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIEBhdXRob3IgTWFyYyBIYWRsZXkKKyAqLworcHVibGljIGNsYXNzIENvb2tpZUltcGxUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvb2tpZVRvU3RyaW5nKCkgeworICAgICAgICBDb29raWUgY29va2llID0gbmV3IENvb2tpZSgiZnJlZCIsICJmbGludHN0b25lIik7CisgICAgICAgIFN0cmluZyBleHBSZXN1bHQgPSAiJFZlcnNpb249MTtmcmVkPWZsaW50c3RvbmUiOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwUmVzdWx0LCBjb29raWUudG9TdHJpbmcoKSk7CisKKyAgICAgICAgY29va2llID0gbmV3IENvb2tpZSgiZnJlZCIsICJmbGludHN0b25lIiwgIi9wYXRoIiwgbnVsbCk7CisgICAgICAgIGV4cFJlc3VsdCA9ICIkVmVyc2lvbj0xO2ZyZWQ9ZmxpbnRzdG9uZTskUGF0aD0vcGF0aCI7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBSZXN1bHQsIGNvb2tpZS50b1N0cmluZygpKTsKKworICAgICAgICBjb29raWUgPSBuZXcgQ29va2llKCJmcmVkIiwgImZsaW50c3RvbmUiLCAiL3BhdGgiLCAiLnN1bi5jb20iKTsKKyAgICAgICAgZXhwUmVzdWx0ID0gIiRWZXJzaW9uPTE7ZnJlZD1mbGludHN0b25lOyREb21haW49LnN1bi5jb207JFBhdGg9L3BhdGgiOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwUmVzdWx0LCBjb29raWUudG9TdHJpbmcoKSk7CisKKyAgICAgICAgY29va2llID0gbmV3IENvb2tpZSgiZnJlZCIsICJmbGludHN0b25lIiwgIi9wYXRoIiwgIi5zdW4uY29tIiwgMik7CisgICAgICAgIGV4cFJlc3VsdCA9ICIkVmVyc2lvbj0yO2ZyZWQ9ZmxpbnRzdG9uZTskRG9tYWluPS5zdW4uY29tOyRQYXRoPS9wYXRoIjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cFJlc3VsdCwgY29va2llLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvb2tpZVZhbHVlT2YoKSB7CisgICAgICAgIENvb2tpZSBjb29raWUgPSBDb29raWUudmFsdWVPZigiJFZlcnNpb249MjtmcmVkPWZsaW50c3RvbmUiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmcmVkIiwgY29va2llLmdldE5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZmxpbnRzdG9uZSIsIGNvb2tpZS5nZXRWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGNvb2tpZS5nZXRWZXJzaW9uKCkpOworCisgICAgICAgIGNvb2tpZSA9IENvb2tpZS52YWx1ZU9mKCIkVmVyc2lvbj0xO2ZyZWQ9ZmxpbnRzdG9uZTskUGF0aD0vcGF0aCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZyZWQiLCBjb29raWUuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmbGludHN0b25lIiwgY29va2llLmdldFZhbHVlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY29va2llLmdldFZlcnNpb24oKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiL3BhdGgiLCBjb29raWUuZ2V0UGF0aCgpKTsKKworICAgICAgICBjb29raWUgPSBDb29raWUudmFsdWVPZigiJFZlcnNpb249MTtmcmVkPWZsaW50c3RvbmU7JERvbWFpbj0uc3VuLmNvbTskUGF0aD0vcGF0aCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZyZWQiLCBjb29raWUuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmbGludHN0b25lIiwgY29va2llLmdldFZhbHVlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY29va2llLmdldFZlcnNpb24oKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiLnN1bi5jb20iLCBjb29raWUuZ2V0RG9tYWluKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIi9wYXRoIiwgY29va2llLmdldFBhdGgoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3JlYXRlQ29va2llcygpIHsKKyAgICAgICAgU3RyaW5nIGNvb2tpZUhlYWRlciA9ICJmcmVkPWZsaW50c3RvbmUiOworICAgICAgICBNYXA8U3RyaW5nLCBDb29raWU+IGNvb2tpZXMgPSBIdHRwSGVhZGVyUmVhZGVyLnJlYWRDb29raWVzKGNvb2tpZUhlYWRlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhjb29raWVzLnNpemUoKSwgMSk7CisgICAgICAgIENvb2tpZSBjID0gY29va2llcy5nZXQoImZyZWQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGMuZ2V0VmVyc2lvbigpLCAwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZnJlZCIuZXF1YWxzKGMuZ2V0TmFtZSgpKSk7CisgICAgICAgIGFzc2VydFRydWUoImZsaW50c3RvbmUiLmVxdWFscyhjLmdldFZhbHVlKCkpKTsKKworICAgICAgICBjb29raWVIZWFkZXIgPSAiZnJlZD1mbGludHN0b25lLGJhcm5leT1ydWJibGUiOworICAgICAgICBjb29raWVzID0gSHR0cEhlYWRlclJlYWRlci5yZWFkQ29va2llcyhjb29raWVIZWFkZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoY29va2llcy5zaXplKCksIDIpOworICAgICAgICBjID0gY29va2llcy5nZXQoImZyZWQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGMuZ2V0VmVyc2lvbigpLCAwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZnJlZCIuZXF1YWxzKGMuZ2V0TmFtZSgpKSk7CisgICAgICAgIGFzc2VydFRydWUoImZsaW50c3RvbmUiLmVxdWFscyhjLmdldFZhbHVlKCkpKTsKKyAgICAgICAgYyA9IGNvb2tpZXMuZ2V0KCJiYXJuZXkiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGMuZ2V0VmVyc2lvbigpLCAwKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiYmFybmV5Ii5lcXVhbHMoYy5nZXROYW1lKCkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgicnViYmxlIi5lcXVhbHMoYy5nZXRWYWx1ZSgpKSk7CisKKyAgICAgICAgY29va2llSGVhZGVyID0gImZyZWQ9ZmxpbnRzdG9uZTtiYXJuZXk9cnViYmxlIjsKKyAgICAgICAgY29va2llcyA9IEh0dHBIZWFkZXJSZWFkZXIucmVhZENvb2tpZXMoY29va2llSGVhZGVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNvb2tpZXMuc2l6ZSgpLCAyKTsKKyAgICAgICAgYyA9IGNvb2tpZXMuZ2V0KCJmcmVkIik7CisgICAgICAgIGFzc2VydEVxdWFscyhjLmdldFZlcnNpb24oKSwgMCk7CisgICAgICAgIGFzc2VydFRydWUoImZyZWQiLmVxdWFscyhjLmdldE5hbWUoKSkpOworICAgICAgICBhc3NlcnRUcnVlKCJmbGludHN0b25lIi5lcXVhbHMoYy5nZXRWYWx1ZSgpKSk7CisgICAgICAgIGMgPSBjb29raWVzLmdldCgiYmFybmV5Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhjLmdldFZlcnNpb24oKSwgMCk7CisgICAgICAgIGFzc2VydFRydWUoImJhcm5leSIuZXF1YWxzKGMuZ2V0TmFtZSgpKSk7CisgICAgICAgIGFzc2VydFRydWUoInJ1YmJsZSIuZXF1YWxzKGMuZ2V0VmFsdWUoKSkpOworCisgICAgICAgIGNvb2tpZUhlYWRlciA9ICIkVmVyc2lvbj0xO2ZyZWQ9ZmxpbnRzdG9uZTskUGF0aD0vcGF0aDtiYXJuZXk9cnViYmxlIjsKKyAgICAgICAgY29va2llcyA9IEh0dHBIZWFkZXJSZWFkZXIucmVhZENvb2tpZXMoY29va2llSGVhZGVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNvb2tpZXMuc2l6ZSgpLCAyKTsKKyAgICAgICAgYyA9IGNvb2tpZXMuZ2V0KCJmcmVkIik7CisgICAgICAgIGFzc2VydEVxdWFscyhjLmdldFZlcnNpb24oKSwgMSk7CisgICAgICAgIGFzc2VydFRydWUoImZyZWQiLmVxdWFscyhjLmdldE5hbWUoKSkpOworICAgICAgICBhc3NlcnRUcnVlKCJmbGludHN0b25lIi5lcXVhbHMoYy5nZXRWYWx1ZSgpKSk7CisgICAgICAgIGFzc2VydFRydWUoIi9wYXRoIi5lcXVhbHMoYy5nZXRQYXRoKCkpKTsKKyAgICAgICAgYyA9IGNvb2tpZXMuZ2V0KCJiYXJuZXkiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGMuZ2V0VmVyc2lvbigpLCAxKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiYmFybmV5Ii5lcXVhbHMoYy5nZXROYW1lKCkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgicnViYmxlIi5lcXVhbHMoYy5nZXRWYWx1ZSgpKSk7CisKKyAgICAgICAgY29va2llSGVhZGVyID0gIiRWZXJzaW9uPTE7ZnJlZD1mbGludHN0b25lOyRQYXRoPS9wYXRoLGJhcm5leT1ydWJibGU7JERvbWFpbj0uc3VuLmNvbSI7CisgICAgICAgIGNvb2tpZXMgPSBIdHRwSGVhZGVyUmVhZGVyLnJlYWRDb29raWVzKGNvb2tpZUhlYWRlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhjb29raWVzLnNpemUoKSwgMik7CisgICAgICAgIGMgPSBjb29raWVzLmdldCgiZnJlZCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoYy5nZXRWZXJzaW9uKCksIDEpOworICAgICAgICBhc3NlcnRUcnVlKCJmcmVkIi5lcXVhbHMoYy5nZXROYW1lKCkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZmxpbnRzdG9uZSIuZXF1YWxzKGMuZ2V0VmFsdWUoKSkpOworICAgICAgICBhc3NlcnRUcnVlKCIvcGF0aCIuZXF1YWxzKGMuZ2V0UGF0aCgpKSk7CisgICAgICAgIGMgPSBjb29raWVzLmdldCgiYmFybmV5Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhjLmdldFZlcnNpb24oKSwgMSk7CisgICAgICAgIGFzc2VydFRydWUoImJhcm5leSIuZXF1YWxzKGMuZ2V0TmFtZSgpKSk7CisgICAgICAgIGFzc2VydFRydWUoInJ1YmJsZSIuZXF1YWxzKGMuZ2V0VmFsdWUoKSkpOworICAgICAgICBhc3NlcnRUcnVlKCIuc3VuLmNvbSIuZXF1YWxzKGMuZ2V0RG9tYWluKCkpKTsKKworICAgICAgICBjb29raWVIZWFkZXIgPSAiJFZlcnNpb249MTsgZnJlZCA9IGZsaW50c3RvbmUgOyAkUGF0aD0vcGF0aCwgYmFybmV5PXJ1YmJsZSA7JERvbWFpbj0uc3VuLmNvbSI7CisgICAgICAgIGNvb2tpZXMgPSBIdHRwSGVhZGVyUmVhZGVyLnJlYWRDb29raWVzKGNvb2tpZUhlYWRlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhjb29raWVzLnNpemUoKSwgMik7CisgICAgICAgIGMgPSBjb29raWVzLmdldCgiZnJlZCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoYy5nZXRWZXJzaW9uKCksIDEpOworICAgICAgICBhc3NlcnRUcnVlKCJmcmVkIi5lcXVhbHMoYy5nZXROYW1lKCkpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiZmxpbnRzdG9uZSIuZXF1YWxzKGMuZ2V0VmFsdWUoKSkpOworICAgICAgICBhc3NlcnRUcnVlKCIvcGF0aCIuZXF1YWxzKGMuZ2V0UGF0aCgpKSk7CisgICAgICAgIGMgPSBjb29raWVzLmdldCgiYmFybmV5Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhjLmdldFZlcnNpb24oKSwgMSk7CisgICAgICAgIGFzc2VydFRydWUoImJhcm5leSIuZXF1YWxzKGMuZ2V0TmFtZSgpKSk7CisgICAgICAgIGFzc2VydFRydWUoInJ1YmJsZSIuZXF1YWxzKGMuZ2V0VmFsdWUoKSkpOworICAgICAgICBhc3NlcnRUcnVlKCIuc3VuLmNvbSIuZXF1YWxzKGMuZ2V0RG9tYWluKCkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROZXdDb29raWVUb1N0cmluZygpIHsKKyAgICAgICAgTmV3Q29va2llIGNvb2tpZSA9IG5ldyBOZXdDb29raWUoImZyZWQiLCAiZmxpbnRzdG9uZSIpOworICAgICAgICBTdHJpbmcgZXhwUmVzdWx0ID0gImZyZWQ9ZmxpbnRzdG9uZTtWZXJzaW9uPTEiOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwUmVzdWx0LCBjb29raWUudG9TdHJpbmcoKSk7CisKKyAgICAgICAgY29va2llID0gbmV3IE5ld0Nvb2tpZSgiZnJlZCIsICJmbGludHN0b25lIiwgbnVsbCwgbnVsbCwgbnVsbCwgNjAsIGZhbHNlKTsKKyAgICAgICAgZXhwUmVzdWx0ID0gImZyZWQ9ZmxpbnRzdG9uZTtWZXJzaW9uPTE7TWF4LUFnZT02MCI7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBSZXN1bHQsIGNvb2tpZS50b1N0cmluZygpKTsKKworICAgICAgICBjb29raWUgPSBuZXcgTmV3Q29va2llKCJmcmVkIiwgImZsaW50c3RvbmUiLCBudWxsLCBudWxsLCAiYSBtb2Rlcm4gc3RvbmFnZSBmYW1pbHkiLCA2MCwgZmFsc2UpOworICAgICAgICBleHBSZXN1bHQgPSAiZnJlZD1mbGludHN0b25lO1ZlcnNpb249MTtDb21tZW50PVwiYSBtb2Rlcm4gc3RvbmFnZSBmYW1pbHlcIjtNYXgtQWdlPTYwIjsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cFJlc3VsdCwgY29va2llLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5ld0Nvb2tpZVZhbHVlT2YoKSB7CisgICAgICAgIE5ld0Nvb2tpZSBjb29raWUgPSBOZXdDb29raWUudmFsdWVPZigiZnJlZD1mbGludHN0b25lO1ZlcnNpb249MiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZyZWQiLCBjb29raWUuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmbGludHN0b25lIiwgY29va2llLmdldFZhbHVlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgY29va2llLmdldFZlcnNpb24oKSk7CisKKyAgICAgICAgY29va2llID0gTmV3Q29va2llLnZhbHVlT2YoImZyZWQ9ZmxpbnRzdG9uZTtWZXJzaW9uPTE7TWF4LUFnZT02MCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZyZWQiLCBjb29raWUuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmbGludHN0b25lIiwgY29va2llLmdldFZhbHVlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgY29va2llLmdldFZlcnNpb24oKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg2MCwgY29va2llLmdldE1heEFnZSgpKTsKKworICAgICAgICBjb29raWUgPSBOZXdDb29raWUudmFsdWVPZigiZnJlZD1mbGludHN0b25lO1ZlcnNpb249MTtDb21tZW50PVwiYSBtb2Rlcm4gc3RvbmFnZSBmYW1pbHlcIjtNYXgtQWdlPTYwO1NlY3VyZSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZyZWQiLCBjb29raWUuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJmbGludHN0b25lIiwgY29va2llLmdldFZhbHVlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEgbW9kZXJuIHN0b25hZ2UgZmFtaWx5IiwgY29va2llLmdldENvbW1lbnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjb29raWUuZ2V0VmVyc2lvbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDYwLCBjb29raWUuZ2V0TWF4QWdlKCkpOworICAgICAgICBhc3NlcnRUcnVlKGNvb2tpZS5pc1NlY3VyZSgpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9FbnRpdHlUYWdQcm92aWRlclRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9FbnRpdHlUYWdQcm92aWRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzZmODBiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL0VudGl0eVRhZ1Byb3ZpZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuYXBpOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5FbnRpdHlUYWc7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkVudGl0eVRhZ1Byb3ZpZGVyOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQGF1dGhvciBNYXJjIEhhZGxleQorICovCitwdWJsaWMgY2xhc3MgRW50aXR5VGFnUHJvdmlkZXJUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nV2VhaygpIHsKKyAgICAgICAgY2hlY2tUb1N0cmluZyhuZXcgRW50aXR5VGFnKCJIZWxsbyBcIldvcmxkXCIiLCB0cnVlKSwgIlcvXCJIZWxsbyBcXFwiV29ybGRcXFwiXCIiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZ1N0cm9uZygpIHsKKyAgICAgICAgY2hlY2tUb1N0cmluZyhuZXcgRW50aXR5VGFnKCJIZWxsbyBcIldvcmxkXCIiKSwgIlwiSGVsbG8gXFxcIldvcmxkXFxcIlwiIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RnJvbVN0cmluZ1dlYWsoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2tGcm9tU3RyaW5nKCJXL1wiSGVsbG8gXFxcIldvcmxkXFxcIlwiIiwgbmV3IEVudGl0eVRhZygiSGVsbG8gXCJXb3JsZFwiIiwgdHJ1ZSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZyb21TdHJpbmdTdHJvbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgY2hlY2tGcm9tU3RyaW5nKCJcIkhlbGxvIFxcXCJXb3JsZFxcXCJcIiIsIG5ldyBFbnRpdHlUYWcoIkhlbGxvIFwiV29ybGRcIiIpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tUb1N0cmluZyhmaW5hbCBFbnRpdHlUYWcgZSwgZmluYWwgU3RyaW5nIHJlc3VsdCkgeworICAgICAgICBmaW5hbCBFbnRpdHlUYWdQcm92aWRlciBpbnN0YW5jZSA9IG5ldyBFbnRpdHlUYWdQcm92aWRlcigpOworICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LCBpbnN0YW5jZS50b1N0cmluZyhlKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgY2hlY2tGcm9tU3RyaW5nKGZpbmFsIFN0cmluZyBlLCBmaW5hbCBFbnRpdHlUYWcgcmVzdWx0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgRW50aXR5VGFnUHJvdmlkZXIgaW5zdGFuY2UgPSBuZXcgRW50aXR5VGFnUHJvdmlkZXIoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdCwgaW5zdGFuY2UuZnJvbVN0cmluZyhlKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL0V4Y2VwdGlvblRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9FeGNlcHRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkwOGI4ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9FeGNlcHRpb25UZXN0LmphdmEKQEAgLTAsMCArMSw3MTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuYXBpOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXgud3MucnMuQmFkUmVxdWVzdEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5DbGllbnRFcnJvckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5Db29raWVQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5EZWZhdWx0VmFsdWU7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLkhlYWRlclBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLkludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuTWF0cml4UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuTm90QWNjZXB0YWJsZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5Ob3RBbGxvd2VkRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLk5vdEF1dGhvcml6ZWRFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuTm90U3VwcG9ydGVkRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUmVkaXJlY3Rpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuU2VydmVyRXJyb3JFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5JbnZvY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUGFyYW1Db252ZXJ0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlBhcmFtQ29udmVydGVyUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiBFeGNlcHRpb24gdGhyb3dpbmcgYW5kIGhhbmRsaW5nIHJlbGF0ZWQgdGVzdHM7IHN1Y2ggYXMKKyAqIHtAbGluayBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbn0gaGFuZGxpbmcgb24gYm90aCBzZXJ2ZXIgYW5kIGNsaWVudCBzaWRlLAorICogcHJvcGVyIGV4Y2VwdGlvbiB0aHJvd2luZyBldGMuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEV4Y2VwdGlvblRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoCisgICAgICAgICAgICAgICAgRXhjZXB0aW9uRHJpdmVuUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgUmVzcG9uc2VEcml2ZW5SZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICAvLyBKRVJTRVktMTUzMgorICAgICAgICAgICAgICAgIE5vbldhZVRocm93aW5nQ29udmVydGVyLmNsYXNzLAorICAgICAgICAgICAgICAgIFBhcmFtQ29udmVydGVyVGhyb3dpbmdOb25XYWVGaWVsZFRlc3RSZXNvdXJjZTEuY2xhc3MsCisgICAgICAgICAgICAgICAgUGFyYW1Db252ZXJ0ZXJUaHJvd2luZ05vbldhZUZpZWxkVGVzdFJlc291cmNlMi5jbGFzcywKKyAgICAgICAgICAgICAgICBQYXJhbUNvbnZlcnRlclRocm93aW5nTm9uV2FlRmllbGRUZXN0UmVzb3VyY2UzLmNsYXNzLAorICAgICAgICAgICAgICAgIFBhcmFtQ29udmVydGVyVGhyb3dpbmdOb25XYWVGaWVsZFRlc3RSZXNvdXJjZTQuY2xhc3MsCisgICAgICAgICAgICAgICAgUGFyYW1Db252ZXJ0ZXJUaHJvd2luZ05vbldhZUZpZWxkVGVzdFJlc291cmNlNS5jbGFzcywKKyAgICAgICAgICAgICAgICBQYXJhbUNvbnZlcnRlclRocm93aW5nTm9uV2FlRmllbGRUZXN0UmVzb3VyY2U2LmNsYXNzLAorICAgICAgICAgICAgICAgIFBhcmFtQ29udmVydGVyVGhyb3dpbmdOb25XYWVGaWVsZFRlc3RSZXNvdXJjZTcuY2xhc3MsCisgICAgICAgICAgICAgICAgUGFyYW1Db252ZXJ0ZXJUaHJvd2luZ05vbldhZUZpZWxkVGVzdFJlc291cmNlOC5jbGFzcywKKyAgICAgICAgICAgICAgICBQYXJhbUNvbnZlcnRlclRocm93aW5nTm9uV2FlRmllbGRUZXN0UmVzb3VyY2U5LmNsYXNzLAorICAgICAgICAgICAgICAgIFBhcmFtQ29udmVydGVyVGhyb3dpbmdOb25XYWVGaWVsZFRlc3RSZXNvdXJjZTEwLmNsYXNzLAorICAgICAgICAgICAgICAgIFBhcmFtQ29udmVydGVyVGhyb3dpbmdOb25XYWVNZXRob2RUZXN0UmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgV2FlVGhyb3dpbmdDb252ZXJ0ZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgUGFyYW1Db252ZXJ0ZXJUaHJvd2luZ1dhZUZpZWxkVGVzdFJlc291cmNlMS5jbGFzcywKKyAgICAgICAgICAgICAgICBQYXJhbUNvbnZlcnRlclRocm93aW5nV2FlRmllbGRUZXN0UmVzb3VyY2UyLmNsYXNzLAorICAgICAgICAgICAgICAgIFBhcmFtQ29udmVydGVyVGhyb3dpbmdXYWVGaWVsZFRlc3RSZXNvdXJjZTMuY2xhc3MsCisgICAgICAgICAgICAgICAgUGFyYW1Db252ZXJ0ZXJUaHJvd2luZ1dhZUZpZWxkVGVzdFJlc291cmNlNC5jbGFzcywKKyAgICAgICAgICAgICAgICBQYXJhbUNvbnZlcnRlclRocm93aW5nV2FlRmllbGRUZXN0UmVzb3VyY2U1LmNsYXNzLAorICAgICAgICAgICAgICAgIFBhcmFtQ29udmVydGVyVGhyb3dpbmdXYWVGaWVsZFRlc3RSZXNvdXJjZTYuY2xhc3MsCisgICAgICAgICAgICAgICAgUGFyYW1Db252ZXJ0ZXJUaHJvd2luZ1dhZUZpZWxkVGVzdFJlc291cmNlNy5jbGFzcywKKyAgICAgICAgICAgICAgICBQYXJhbUNvbnZlcnRlclRocm93aW5nV2FlRmllbGRUZXN0UmVzb3VyY2U4LmNsYXNzLAorICAgICAgICAgICAgICAgIFBhcmFtQ29udmVydGVyVGhyb3dpbmdXYWVGaWVsZFRlc3RSZXNvdXJjZTkuY2xhc3MsCisgICAgICAgICAgICAgICAgUGFyYW1Db252ZXJ0ZXJUaHJvd2luZ1dhZUZpZWxkVGVzdFJlc291cmNlMTAuY2xhc3MsCisgICAgICAgICAgICAgICAgUGFyYW1Db252ZXJ0ZXJUaHJvd2luZ1dhZU1ldGhvZFRlc3RSZXNvdXJjZS5jbGFzcworICAgICAgICApOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5wcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLkZPTExPV19SRURJUkVDVFMsIGZhbHNlKTsKKyAgICB9CisKKyAgICBzdGF0aWMgZmluYWwgVVJJIHRlc3RVcmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9qZXJzZXkuamF2YS5uZXQiKS5idWlsZCgpOworCisgICAgQFN1cHByZXNzV2FybmluZ3MoIlRocm93YWJsZVJlc3VsdE9mTWV0aG9kQ2FsbElnbm9yZWQiKQorICAgIHN0YXRpYyBNYXA8U3RyaW5nLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbj4gRXhjZXB0aW9uTUFQID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbj4oKSB7eworICAgICAgICBwdXQoIjMwMSIsIG5ldyBSZWRpcmVjdGlvbkV4Y2VwdGlvbihSZXNwb25zZS5TdGF0dXMuTU9WRURfUEVSTUFORU5UTFksIHRlc3RVcmkpKTsKKyAgICAgICAgcHV0KCIzMDIiLCBuZXcgUmVkaXJlY3Rpb25FeGNlcHRpb24oUmVzcG9uc2UuU3RhdHVzLkZPVU5ELCB0ZXN0VXJpKSk7CisgICAgICAgIHB1dCgiMzAzIiwgbmV3IFJlZGlyZWN0aW9uRXhjZXB0aW9uKFJlc3BvbnNlLlN0YXR1cy5TRUVfT1RIRVIsIHRlc3RVcmkpKTsKKyAgICAgICAgcHV0KCIzMDciLCBuZXcgUmVkaXJlY3Rpb25FeGNlcHRpb24oUmVzcG9uc2UuU3RhdHVzLlRFTVBPUkFSWV9SRURJUkVDVCwgdGVzdFVyaSkpOworICAgICAgICBwdXQoIjQwMCIsIG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKCkpOworICAgICAgICBwdXQoIjQwMSIsIG5ldyBOb3RBdXRob3JpemVkRXhjZXB0aW9uKCJjaGFsbGVuZ2UiKSk7CisgICAgICAgIHB1dCgiNDAyIiwgbmV3IENsaWVudEVycm9yRXhjZXB0aW9uKDQwMikpOworICAgICAgICBwdXQoIjQwNCIsIG5ldyBOb3RGb3VuZEV4Y2VwdGlvbigpKTsKKyAgICAgICAgcHV0KCI0MDUiLCBuZXcgTm90QWxsb3dlZEV4Y2VwdGlvbigiT1BUSU9OUyIpKTsKKyAgICAgICAgcHV0KCI0MDYiLCBuZXcgTm90QWNjZXB0YWJsZUV4Y2VwdGlvbigpKTsKKyAgICAgICAgcHV0KCI0MTUiLCBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCkpOworICAgICAgICBwdXQoIjUwMCIsIG5ldyBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uKCkpOworICAgICAgICBwdXQoIjUwMSIsIG5ldyBTZXJ2ZXJFcnJvckV4Y2VwdGlvbig1MDEpKTsKKyAgICAgICAgcHV0KCI1MDMiLCBuZXcgU2VydmljZVVuYXZhaWxhYmxlRXhjZXB0aW9uKCkpOworICAgIH19OworCisgICAgc3RhdGljIE1hcDxTdHJpbmcsIFJlc3BvbnNlPiBSZXNwb25zZU1BUCA9IG5ldyBIYXNoTWFwPFN0cmluZywgUmVzcG9uc2U+KCkge3sKKyAgICAgICAgcHV0KCIzMDEiLCBSZXNwb25zZS5zdGF0dXMoMzAxKS5sb2NhdGlvbih0ZXN0VXJpKS5idWlsZCgpKTsKKyAgICAgICAgcHV0KCIzMDIiLCBSZXNwb25zZS5zdGF0dXMoMzAyKS5sb2NhdGlvbih0ZXN0VXJpKS5idWlsZCgpKTsKKyAgICAgICAgcHV0KCIzMDMiLCBSZXNwb25zZS5zZWVPdGhlcih0ZXN0VXJpKS5idWlsZCgpKTsKKyAgICAgICAgcHV0KCIzMDciLCBSZXNwb25zZS50ZW1wb3JhcnlSZWRpcmVjdCh0ZXN0VXJpKS5idWlsZCgpKTsKKyAgICAgICAgcHV0KCI0MDAiLCBSZXNwb25zZS5zdGF0dXMoNDAwKS5idWlsZCgpKTsKKyAgICAgICAgcHV0KCI0MDEiLCBSZXNwb25zZS5zdGF0dXMoNDAxKS5idWlsZCgpKTsKKyAgICAgICAgcHV0KCI0MDIiLCBSZXNwb25zZS5zdGF0dXMoNDAyKS5idWlsZCgpKTsKKyAgICAgICAgcHV0KCI0MDQiLCBSZXNwb25zZS5zdGF0dXMoNDA0KS5idWlsZCgpKTsKKyAgICAgICAgcHV0KCI0MDUiLCBSZXNwb25zZS5zdGF0dXMoNDA1KS5hbGxvdygiT1BUSU9OUyIpLmJ1aWxkKCkpOworICAgICAgICBwdXQoIjQwNiIsIFJlc3BvbnNlLnN0YXR1cyg0MDYpLmJ1aWxkKCkpOworICAgICAgICBwdXQoIjQxNSIsIFJlc3BvbnNlLnN0YXR1cyg0MTUpLmJ1aWxkKCkpOworICAgICAgICBwdXQoIjUwMCIsIFJlc3BvbnNlLnNlcnZlckVycm9yKCkuYnVpbGQoKSk7CisgICAgICAgIHB1dCgiNTAxIiwgUmVzcG9uc2Uuc3RhdHVzKDUwMSkuYnVpbGQoKSk7CisgICAgICAgIHB1dCgiNTAzIiwgUmVzcG9uc2Uuc3RhdHVzKDUwMykuYnVpbGQoKSk7CisgICAgfX07CisKKyAgICBAUGF0aCgiZXhjZXB0aW9uRHJpdmVuIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEV4Y2VwdGlvbkRyaXZlblJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJ7c3RhdHVzfSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KEBQYXRoUGFyYW0oInN0YXR1cyIpIFN0cmluZyBzdGF0dXMpIHsKKyAgICAgICAgICAgIHRocm93IEV4Y2VwdGlvbk1BUC5nZXQoc3RhdHVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJyZXNwb25zZURyaXZlbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNwb25zZURyaXZlblJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJ7c3RhdHVzfSIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXQoQFBhdGhQYXJhbSgic3RhdHVzIikgU3RyaW5nIHN0YXR1cykgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlTUFQLmdldChzdGF0dXMpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0U3RhdHVzQ29kZShmaW5hbCBTdHJpbmcgc3RhdHVzKSB7CisgICAgICAgIF90ZXN0U3RhdHVzQ29kZVZpYUV4Y2VwdGlvbigiZXhjZXB0aW9uRHJpdmVuIiwgc3RhdHVzKTsKKyAgICAgICAgX3Rlc3RTdGF0dXNDb2RlRGlyZWN0bHkoImV4Y2VwdGlvbkRyaXZlbiIsIHN0YXR1cyk7CisgICAgICAgIF90ZXN0U3RhdHVzQ29kZVZpYUV4Y2VwdGlvbigicmVzcG9uc2VEcml2ZW4iLCBzdGF0dXMpOworICAgICAgICBfdGVzdFN0YXR1c0NvZGVEaXJlY3RseSgicmVzcG9uc2VEcml2ZW4iLCBzdGF0dXMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfdGVzdFN0YXR1c0NvZGVWaWFFeGNlcHRpb24oZmluYWwgU3RyaW5nIHByZWZpeCwgZmluYWwgU3RyaW5nIHN0YXR1cykgeworCisgICAgICAgIGZpbmFsIGludCBzdGF0dXNDb2RlID0gSW50ZWdlci5wYXJzZUludChzdGF0dXMpOworCisgICAgICAgIHRyeSB7CisKKyAgICAgICAgICAgIHRhcmdldCgpLnBhdGgocHJlZml4KS5wYXRoKHN0YXR1cykucmVxdWVzdCgpLmdldChDbGllbnRSZXNwb25zZS5jbGFzcyk7CisgICAgICAgICAgICBmYWlsKCJBbiBleGNlcHRpb24gZXhwZWN0ZWQiKTsKKyAgICAgICAgfSBjYXRjaCAoV2ViQXBwbGljYXRpb25FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vbm9pbnNwZWN0aW9uIFRocm93YWJsZVJlc3VsdE9mTWV0aG9kQ2FsbElnbm9yZWQKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhFeGNlcHRpb25NQVAuZ2V0KHN0YXR1cykuZ2V0Q2xhc3MoKSwgZXguZ2V0Q2xhc3MoKSk7CisKKyAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gZXguZ2V0UmVzcG9uc2UoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhzdGF0dXNDb2RlLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgICAgIGlmIChpczN4eENvZGUoc3RhdHVzQ29kZSkpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlLmdldExvY2F0aW9uKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0U3RhdHVzQ29kZURpcmVjdGx5KGZpbmFsIFN0cmluZyBwcmVmaXgsIGZpbmFsIFN0cmluZyBzdGF0dXMpIHsKKyAgICAgICAgZmluYWwgaW50IHN0YXR1c0NvZGUgPSBJbnRlZ2VyLnBhcnNlSW50KHN0YXR1cyk7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aChwcmVmaXgpLnBhdGgoc3RhdHVzKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhzdGF0dXNDb2RlLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGlmIChpczN4eENvZGUoc3RhdHVzQ29kZSkpIHsKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UuZ2V0TG9jYXRpb24oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBbGxTdGF0dXNDb2RlcygpIHsKKyAgICAgICAgZm9yIChTdHJpbmcgc3RhdHVzIDogRXhjZXB0aW9uTUFQLmtleVNldCgpKSB7CisgICAgICAgICAgICBfdGVzdFN0YXR1c0NvZGUoc3RhdHVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpczN4eENvZGUoZmluYWwgaW50IHN0YXR1c0NvZGUpIHsKKyAgICAgICAgcmV0dXJuIDI5OSA8IHN0YXR1c0NvZGUgJiYgc3RhdHVzQ29kZSA8IDQwMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCRUdJTjogSkVSU0VZLTE1MzIgcmVwcm9kdWNlciBjb2RlOgorICAgICAqCisgICAgICogRnJvbSBKQVgtUlMgMi4wIHNwZWMsIHNlY3QuIDMuMjoKKyAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAqIEEgV2ViQXBwbGljYXRpb25FeGNlcHRpb24gdGhyb3duIGR1cmluZyBjb25zdHJ1Y3Rpb24gb2YgZmllbGQgb3IgcHJvcGVydHkgdmFsdWVzIHVzaW5nIDMgb3IgNCBhYm92ZQorICAgICAqIGlzIHByb2Nlc3NlZCBkaXJlY3RseSBhcyBkZXNjcmliZWQgaW4gU2VjdGlvbiAzLjMuNC4gT3RoZXIgZXhjZXB0aW9ucyB0aHJvd24gZHVyaW5nIGNvbnN0cnVjdGlvbiBvZgorICAgICAqIGZpZWxkIG9yIHByb3BlcnR5IHZhbHVlcyB1c2luZyAzIG9yIDQgYWJvdmUgYXJlIHRyZWF0ZWQgYXMgY2xpZW50IGVycm9yczogaWYgdGhlIGZpZWxkIG9yIHByb3BlcnR5IGlzCisgICAgICogYW5ub3RhdGVkIHdpdGggQE1hdHJpeFBhcmFtLCBAUXVlcnlQYXJhbSBvciBAUGF0aFBhcmFtIHRoZW4gYW4gaW1wbGVtZW50YXRpb24gTVVTVCBnZW5lcmF0ZSBhbiBpbnN0YW5jZQorICAgICAqIG9mIE5vdEZvdW5kRXhjZXB0aW9uICg0MDQgc3RhdHVzKSB0aGF0IHdyYXBzIHRoZSB0aHJvd24gZXhjZXB0aW9uIGFuZCBubyBlbnRpdHk7IGlmIHRoZSBmaWVsZCBvciBwcm9wZXJ0eQorICAgICAqIGlzIGFubm90YXRlZCB3aXRoIEBIZWFkZXJQYXJhbSBvciBAQ29va2llUGFyYW0gdGhlbiBhbiBpbXBsZW1lbnRhdGlvbiBNVVNUIGdlbmVyYXRlIGFuIGluc3RhbmNlIG9mCisgICAgICogQmFkUmVxdWVzdEV4Y2VwdGlvbiAoNDAwIHN0YXR1cykgdGhhdCB3cmFwcyB0aGUgdGhyb3duIGV4Y2VwdGlvbiBhbmQgbm8gZW50aXR5LiBFeGNlcHRpb25zIE1VU1QgYmUKKyAgICAgKiBwcm9jZXNzZWQgYXMgZGVzY3JpYmVkIGluIFNlY3Rpb24gMy4zLjQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBOb25XYWVUeXBlIHsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5vbldhZUV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworICAgIH0KKworICAgIEBQYXJhbUNvbnZlcnRlci5MYXp5CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBOb25XYWVUaHJvd2luZ0NvbnZlcnRlciBpbXBsZW1lbnRzIFBhcmFtQ29udmVydGVyPE5vbldhZVR5cGU+LCBQYXJhbUNvbnZlcnRlclByb3ZpZGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE5vbldhZVR5cGUgZnJvbVN0cmluZyhTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOb25XYWVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKE5vbldhZVR5cGUgdmFsdWUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOb25XYWVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIDxUPiBQYXJhbUNvbnZlcnRlcjxUPiBnZXRDb252ZXJ0ZXIoQ2xhc3M8VD4gcmF3VHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zKSB7CisgICAgICAgICAgICBpZiAoTm9uV2FlVHlwZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHJhd1R5cGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChQYXJhbUNvbnZlcnRlcjxUPikgdGhpczsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicGFyYW0tY29udmVydGVyL25vbi13YWUvZmllbGQvZGVmYXVsdC1tYXRyaXgiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGFyYW1Db252ZXJ0ZXJUaHJvd2luZ05vbldhZUZpZWxkVGVzdFJlc291cmNlMSB7CisgICAgICAgIEBEZWZhdWx0VmFsdWUoInZhbHVlIikKKyAgICAgICAgQE1hdHJpeFBhcmFtKCJtaXNzaW5nIikKKyAgICAgICAgcHJpdmF0ZSBOb25XYWVUeXBlIGZpZWxkOworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoNTk5KS5lbnRpdHkoIlRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgaW52b2tlZCIpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicGFyYW0tY29udmVydGVyL25vbi13YWUvZmllbGQvZGVmYXVsdC1wYXRoIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhcmFtQ29udmVydGVyVGhyb3dpbmdOb25XYWVGaWVsZFRlc3RSZXNvdXJjZTIgeworICAgICAgICBARGVmYXVsdFZhbHVlKCJ2YWx1ZSIpCisgICAgICAgIEBQYXRoUGFyYW0oIm1pc3NpbmciKQorICAgICAgICBwcml2YXRlIE5vbldhZVR5cGUgZmllbGQ7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyg1OTkpLmVudGl0eSgiVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBpbnZva2VkIikuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJwYXJhbS1jb252ZXJ0ZXIvbm9uLXdhZS9maWVsZC9kZWZhdWx0LXF1ZXJ5IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhcmFtQ29udmVydGVyVGhyb3dpbmdOb25XYWVGaWVsZFRlc3RSZXNvdXJjZTMgeworICAgICAgICBARGVmYXVsdFZhbHVlKCJ2YWx1ZSIpCisgICAgICAgIEBRdWVyeVBhcmFtKCJtaXNzaW5nIikKKyAgICAgICAgcHJpdmF0ZSBOb25XYWVUeXBlIGZpZWxkOworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoNTk5KS5lbnRpdHkoIlRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgaW52b2tlZCIpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicGFyYW0tY29udmVydGVyL25vbi13YWUvZmllbGQvZGVmYXVsdC1oZWFkZXIiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGFyYW1Db252ZXJ0ZXJUaHJvd2luZ05vbldhZUZpZWxkVGVzdFJlc291cmNlNCB7CisgICAgICAgIEBEZWZhdWx0VmFsdWUoInZhbHVlIikKKyAgICAgICAgQEhlYWRlclBhcmFtKCJtaXNzaW5nIikKKyAgICAgICAgcHJpdmF0ZSBOb25XYWVUeXBlIGZpZWxkOworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoNTk5KS5lbnRpdHkoIlRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgaW52b2tlZCIpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicGFyYW0tY29udmVydGVyL25vbi13YWUvZmllbGQvZGVmYXVsdC1jb29raWUiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGFyYW1Db252ZXJ0ZXJUaHJvd2luZ05vbldhZUZpZWxkVGVzdFJlc291cmNlNSB7CisgICAgICAgIEBEZWZhdWx0VmFsdWUoInZhbHVlIikKKyAgICAgICAgQENvb2tpZVBhcmFtKCJtaXNzaW5nIikKKyAgICAgICAgcHJpdmF0ZSBOb25XYWVUeXBlIGZpZWxkOworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoNTk5KS5lbnRpdHkoIlRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgaW52b2tlZCIpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicGFyYW0tY29udmVydGVyL25vbi13YWUvZmllbGQvbWF0cml4IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhcmFtQ29udmVydGVyVGhyb3dpbmdOb25XYWVGaWVsZFRlc3RSZXNvdXJjZTYgeworICAgICAgICBATWF0cml4UGFyYW0oInRlc3QiKQorICAgICAgICBwcml2YXRlIE5vbldhZVR5cGUgZmllbGQ7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyg1OTkpLmVudGl0eSgiVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBpbnZva2VkIikuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJwYXJhbS1jb252ZXJ0ZXIvbm9uLXdhZS9maWVsZC9wYXRoL3t0ZXN0fSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXJhbUNvbnZlcnRlclRocm93aW5nTm9uV2FlRmllbGRUZXN0UmVzb3VyY2U3IHsKKyAgICAgICAgQFBhdGhQYXJhbSgidGVzdCIpCisgICAgICAgIHByaXZhdGUgTm9uV2FlVHlwZSBmaWVsZDsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDU5OSkuZW50aXR5KCJUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGludm9rZWQiKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInBhcmFtLWNvbnZlcnRlci9ub24td2FlL2ZpZWxkL3F1ZXJ5IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhcmFtQ29udmVydGVyVGhyb3dpbmdOb25XYWVGaWVsZFRlc3RSZXNvdXJjZTggeworICAgICAgICBAUXVlcnlQYXJhbSgidGVzdCIpCisgICAgICAgIHByaXZhdGUgTm9uV2FlVHlwZSBmaWVsZDsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDU5OSkuZW50aXR5KCJUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGludm9rZWQiKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInBhcmFtLWNvbnZlcnRlci9ub24td2FlL2ZpZWxkL2hlYWRlciIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXJhbUNvbnZlcnRlclRocm93aW5nTm9uV2FlRmllbGRUZXN0UmVzb3VyY2U5IHsKKyAgICAgICAgQEhlYWRlclBhcmFtKCJ0ZXN0IikKKyAgICAgICAgcHJpdmF0ZSBOb25XYWVUeXBlIGZpZWxkOworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoNTk5KS5lbnRpdHkoIlRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgaW52b2tlZCIpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicGFyYW0tY29udmVydGVyL25vbi13YWUvZmllbGQvY29va2llIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhcmFtQ29udmVydGVyVGhyb3dpbmdOb25XYWVGaWVsZFRlc3RSZXNvdXJjZTEwIHsKKyAgICAgICAgQENvb2tpZVBhcmFtKCJ0ZXN0IikKKyAgICAgICAgcHJpdmF0ZSBOb25XYWVUeXBlIGZpZWxkOworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoNTk5KS5lbnRpdHkoIlRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgaW52b2tlZCIpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicGFyYW0tY29udmVydGVyL25vbi13YWUvbWV0aG9kIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhcmFtQ29udmVydGVyVGhyb3dpbmdOb25XYWVNZXRob2RUZXN0UmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImRlZmF1bHQtbWF0cml4IikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGRlZmF1bHRNYXRyaXhUZXN0KEBEZWZhdWx0VmFsdWUoInZhbHVlIikgQE1hdHJpeFBhcmFtKCJtaXNzaW5nIikgTm9uV2FlVHlwZSBwYXJhbSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyg1OTkpLmVudGl0eSgiVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBpbnZva2VkIikuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImRlZmF1bHQtcGF0aCIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBkZWZhdWx0UGF0aFRlc3QoQERlZmF1bHRWYWx1ZSgidmFsdWUiKSBAUGF0aFBhcmFtKCJtaXNzaW5nIikgTm9uV2FlVHlwZSBwYXJhbSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyg1OTkpLmVudGl0eSgiVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBpbnZva2VkIikuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImRlZmF1bHQtcXVlcnkiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZGVmYXVsdFF1ZXJ5VGVzdChARGVmYXVsdFZhbHVlKCJ2YWx1ZSIpIEBRdWVyeVBhcmFtKCJtaXNzaW5nIikgTm9uV2FlVHlwZSBwYXJhbSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyg1OTkpLmVudGl0eSgiVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBpbnZva2VkIikuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImRlZmF1bHQtaGVhZGVyIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGRlZmF1bHRIZWFkZXJUZXN0KEBEZWZhdWx0VmFsdWUoInZhbHVlIikgQEhlYWRlclBhcmFtKCJtaXNzaW5nIikgTm9uV2FlVHlwZSBwYXJhbSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyg1OTkpLmVudGl0eSgiVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBpbnZva2VkIikuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImRlZmF1bHQtY29va2llIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGRlZmF1bHRDb29raWVUZXN0KEBEZWZhdWx0VmFsdWUoInZhbHVlIikgQENvb2tpZVBhcmFtKCJtaXNzaW5nIikgTm9uV2FlVHlwZSBwYXJhbSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyg1OTkpLmVudGl0eSgiVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBpbnZva2VkIikuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIm1hdHJpeCIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBtYXRyaXhUZXN0KEBNYXRyaXhQYXJhbSgidGVzdCIpIE5vbldhZVR5cGUgcGFyYW0pIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoNTk5KS5lbnRpdHkoIlRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgaW52b2tlZCIpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJwYXRoL3t0ZXN0fSIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBwYXRoVGVzdChAUGF0aFBhcmFtKCJ0ZXN0IikgTm9uV2FlVHlwZSBwYXJhbSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyg1OTkpLmVudGl0eSgiVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBpbnZva2VkIikuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInF1ZXJ5IikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHF1ZXJ5VGVzdChAUXVlcnlQYXJhbSgidGVzdCIpIE5vbldhZVR5cGUgcGFyYW0pIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoNTk5KS5lbnRpdHkoIlRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgaW52b2tlZCIpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJoZWFkZXIiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgaGVhZGVyVGVzdChASGVhZGVyUGFyYW0oInRlc3QiKSBOb25XYWVUeXBlIHBhcmFtKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDU5OSkuZW50aXR5KCJUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGludm9rZWQiKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiY29va2llIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGNvb2tpZVRlc3QoQENvb2tpZVBhcmFtKCJ0ZXN0IikgTm9uV2FlVHlwZSBwYXJhbSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyg1OTkpLmVudGl0eSgiVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBpbnZva2VkIikuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vbldhZUV4Y2VwdGlvblRocm93bkZyb21QYXJhbUNvbnZlcnRlcigpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgicGFyYW0tY29udmVydGVyL25vbi13YWUvIik7CisKKyAgICAgICAgdGVzdFNpbmdsZSgiZmllbGQtZGVmYXVsdC1tYXRyaXgiLCA0MDQsIHRhcmdldC5wYXRoKCJmaWVsZC9kZWZhdWx0LW1hdHJpeCIpLnJlcXVlc3QoKSk7CisgICAgICAgIHRlc3RTaW5nbGUoImZpZWxkLWRlZmF1bHQtcGF0aCIsIDQwNCwgdGFyZ2V0LnBhdGgoImZpZWxkL2RlZmF1bHQtcGF0aCIpLnJlcXVlc3QoKSk7CisgICAgICAgIHRlc3RTaW5nbGUoImZpZWxkLWRlZmF1bHQtcXVlcnkiLCA0MDQsIHRhcmdldC5wYXRoKCJmaWVsZC9kZWZhdWx0LXF1ZXJ5IikucmVxdWVzdCgpKTsKKyAgICAgICAgdGVzdFNpbmdsZSgiZmllbGQtZGVmYXVsdC1oZWFkZXIiLCA0MDAsIHRhcmdldC5wYXRoKCJmaWVsZC9kZWZhdWx0LWhlYWRlciIpLnJlcXVlc3QoKSk7CisgICAgICAgIHRlc3RTaW5nbGUoImZpZWxkLWRlZmF1bHQtY29va2llIiwgNDAwLCB0YXJnZXQucGF0aCgiZmllbGQvZGVmYXVsdC1jb29raWUiKS5yZXF1ZXN0KCkpOworCisgICAgICAgIHRlc3RTaW5nbGUoImZpZWxkLW1hdHJpeCIsIDQwNCwgdGFyZ2V0LnBhdGgoImZpZWxkL21hdHJpeDt0ZXN0PXZhbHVlIikucmVxdWVzdCgpKTsKKyAgICAgICAgdGVzdFNpbmdsZSgiZmllbGQtcGF0aCIsIDQwNCwgdGFyZ2V0LnBhdGgoImZpZWxkL3BhdGgvdmFsdWUiKS5yZXF1ZXN0KCkpOworICAgICAgICB0ZXN0U2luZ2xlKCJmaWVsZC1xdWVyeSIsIDQwNCwgdGFyZ2V0LnBhdGgoImZpZWxkL3F1ZXJ5IikucXVlcnlQYXJhbSgidGVzdCIsICJ2YWx1ZSIpLnJlcXVlc3QoKSk7CisgICAgICAgIHRlc3RTaW5nbGUoImZpZWxkLWhlYWRlciIsIDQwMCwgdGFyZ2V0LnBhdGgoImZpZWxkL2hlYWRlciIpLnJlcXVlc3QoKS5oZWFkZXIoInRlc3QiLCAidmFsdWUiKSk7CisgICAgICAgIHRlc3RTaW5nbGUoImZpZWxkLWNvb2tpZSIsIDQwMCwgdGFyZ2V0LnBhdGgoImZpZWxkL2Nvb2tpZSIpLnJlcXVlc3QoKS5jb29raWUoInRlc3QiLCAidmFsdWUiKSk7CisKKyAgICAgICAgdGVzdFNpbmdsZSgibWV0aG9kLWRlZmF1bHQtbWF0cml4IiwgNDA0LCB0YXJnZXQucGF0aCgibWV0aG9kL2RlZmF1bHQtbWF0cml4IikucmVxdWVzdCgpKTsKKyAgICAgICAgdGVzdFNpbmdsZSgibWV0aG9kLWRlZmF1bHQtcGF0aCIsIDQwNCwgdGFyZ2V0LnBhdGgoIm1ldGhvZC9kZWZhdWx0LXBhdGgiKS5yZXF1ZXN0KCkpOworICAgICAgICB0ZXN0U2luZ2xlKCJtZXRob2QtZGVmYXVsdC1xdWVyeSIsIDQwNCwgdGFyZ2V0LnBhdGgoIm1ldGhvZC9kZWZhdWx0LXF1ZXJ5IikucmVxdWVzdCgpKTsKKyAgICAgICAgdGVzdFNpbmdsZSgibWV0aG9kLWRlZmF1bHQtaGVhZGVyIiwgNDAwLCB0YXJnZXQucGF0aCgibWV0aG9kL2RlZmF1bHQtaGVhZGVyIikucmVxdWVzdCgpKTsKKyAgICAgICAgdGVzdFNpbmdsZSgibWV0aG9kLWRlZmF1bHQtY29va2llIiwgNDAwLCB0YXJnZXQucGF0aCgibWV0aG9kL2RlZmF1bHQtY29va2llIikucmVxdWVzdCgpKTsKKworICAgICAgICB0ZXN0U2luZ2xlKCJtZXRob2QtbWF0cml4IiwgNDA0LCB0YXJnZXQucGF0aCgibWV0aG9kL21hdHJpeDt0ZXN0PXZhbHVlIikucmVxdWVzdCgpKTsKKyAgICAgICAgdGVzdFNpbmdsZSgibWV0aG9kLXBhdGgiLCA0MDQsIHRhcmdldC5wYXRoKCJtZXRob2QvcGF0aC92YWx1ZSIpLnJlcXVlc3QoKSk7CisgICAgICAgIHRlc3RTaW5nbGUoIm1ldGhvZC1xdWVyeSIsIDQwNCwgdGFyZ2V0LnBhdGgoIm1ldGhvZC9xdWVyeSIpLnF1ZXJ5UGFyYW0oInRlc3QiLCAidmFsdWUiKS5yZXF1ZXN0KCkpOworICAgICAgICB0ZXN0U2luZ2xlKCJtZXRob2QtaGVhZGVyIiwgNDAwLCB0YXJnZXQucGF0aCgibWV0aG9kL2hlYWRlciIpLnJlcXVlc3QoKS5oZWFkZXIoInRlc3QiLCAidmFsdWUiKSk7CisgICAgICAgIHRlc3RTaW5nbGUoIm1ldGhvZC1jb29raWUiLCA0MDAsIHRhcmdldC5wYXRoKCJtZXRob2QvY29va2llIikucmVxdWVzdCgpLmNvb2tpZSgidGVzdCIsICJ2YWx1ZSIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFdhZVR5cGUgeworICAgIH0KKworICAgIEBQYXJhbUNvbnZlcnRlci5MYXp5CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBXYWVUaHJvd2luZ0NvbnZlcnRlciBpbXBsZW1lbnRzIFBhcmFtQ29udmVydGVyPFdhZVR5cGU+LCBQYXJhbUNvbnZlcnRlclByb3ZpZGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFdhZVR5cGUgZnJvbVN0cmluZyhTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbig1NTUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoV2FlVHlwZSB2YWx1ZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKDU1NSk7CisgICAgICAgIH0KKworICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyA8VD4gUGFyYW1Db252ZXJ0ZXI8VD4gZ2V0Q29udmVydGVyKENsYXNzPFQ+IHJhd1R5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucykgeworICAgICAgICAgICAgaWYgKFdhZVR5cGUuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShyYXdUeXBlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAoUGFyYW1Db252ZXJ0ZXI8VD4pIHRoaXM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInBhcmFtLWNvbnZlcnRlci93YWUvZmllbGQvZGVmYXVsdC1tYXRyaXgiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGFyYW1Db252ZXJ0ZXJUaHJvd2luZ1dhZUZpZWxkVGVzdFJlc291cmNlMSB7CisgICAgICAgIEBEZWZhdWx0VmFsdWUoInZhbHVlIikKKyAgICAgICAgQE1hdHJpeFBhcmFtKCJtaXNzaW5nIikKKyAgICAgICAgcHJpdmF0ZSBXYWVUeXBlIGZpZWxkOworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoNTk5KS5lbnRpdHkoIlRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgaW52b2tlZCIpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicGFyYW0tY29udmVydGVyL3dhZS9maWVsZC9kZWZhdWx0LXBhdGgiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGFyYW1Db252ZXJ0ZXJUaHJvd2luZ1dhZUZpZWxkVGVzdFJlc291cmNlMiB7CisgICAgICAgIEBEZWZhdWx0VmFsdWUoInZhbHVlIikKKyAgICAgICAgQFBhdGhQYXJhbSgibWlzc2luZyIpCisgICAgICAgIHByaXZhdGUgV2FlVHlwZSBmaWVsZDsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDU5OSkuZW50aXR5KCJUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGludm9rZWQiKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInBhcmFtLWNvbnZlcnRlci93YWUvZmllbGQvZGVmYXVsdC1xdWVyeSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXJhbUNvbnZlcnRlclRocm93aW5nV2FlRmllbGRUZXN0UmVzb3VyY2UzIHsKKyAgICAgICAgQERlZmF1bHRWYWx1ZSgidmFsdWUiKQorICAgICAgICBAUXVlcnlQYXJhbSgibWlzc2luZyIpCisgICAgICAgIHByaXZhdGUgV2FlVHlwZSBmaWVsZDsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDU5OSkuZW50aXR5KCJUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGludm9rZWQiKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInBhcmFtLWNvbnZlcnRlci93YWUvZmllbGQvZGVmYXVsdC1oZWFkZXIiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGFyYW1Db252ZXJ0ZXJUaHJvd2luZ1dhZUZpZWxkVGVzdFJlc291cmNlNCB7CisgICAgICAgIEBEZWZhdWx0VmFsdWUoInZhbHVlIikKKyAgICAgICAgQEhlYWRlclBhcmFtKCJtaXNzaW5nIikKKyAgICAgICAgcHJpdmF0ZSBXYWVUeXBlIGZpZWxkOworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoNTk5KS5lbnRpdHkoIlRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgaW52b2tlZCIpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicGFyYW0tY29udmVydGVyL3dhZS9maWVsZC9kZWZhdWx0LWNvb2tpZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXJhbUNvbnZlcnRlclRocm93aW5nV2FlRmllbGRUZXN0UmVzb3VyY2U1IHsKKyAgICAgICAgQERlZmF1bHRWYWx1ZSgidmFsdWUiKQorICAgICAgICBAQ29va2llUGFyYW0oIm1pc3NpbmciKQorICAgICAgICBwcml2YXRlIFdhZVR5cGUgZmllbGQ7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyg1OTkpLmVudGl0eSgiVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBpbnZva2VkIikuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJwYXJhbS1jb252ZXJ0ZXIvd2FlL2ZpZWxkL21hdHJpeCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXJhbUNvbnZlcnRlclRocm93aW5nV2FlRmllbGRUZXN0UmVzb3VyY2U2IHsKKyAgICAgICAgQE1hdHJpeFBhcmFtKCJ0ZXN0IikKKyAgICAgICAgcHJpdmF0ZSBXYWVUeXBlIGZpZWxkOworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoNTk5KS5lbnRpdHkoIlRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgaW52b2tlZCIpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicGFyYW0tY29udmVydGVyL3dhZS9maWVsZC9wYXRoL3t0ZXN0fSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXJhbUNvbnZlcnRlclRocm93aW5nV2FlRmllbGRUZXN0UmVzb3VyY2U3IHsKKyAgICAgICAgQFBhdGhQYXJhbSgidGVzdCIpCisgICAgICAgIHByaXZhdGUgV2FlVHlwZSBmaWVsZDsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDU5OSkuZW50aXR5KCJUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGludm9rZWQiKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInBhcmFtLWNvbnZlcnRlci93YWUvZmllbGQvcXVlcnkiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGFyYW1Db252ZXJ0ZXJUaHJvd2luZ1dhZUZpZWxkVGVzdFJlc291cmNlOCB7CisgICAgICAgIEBRdWVyeVBhcmFtKCJ0ZXN0IikKKyAgICAgICAgcHJpdmF0ZSBXYWVUeXBlIGZpZWxkOworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoNTk5KS5lbnRpdHkoIlRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgaW52b2tlZCIpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicGFyYW0tY29udmVydGVyL3dhZS9maWVsZC9oZWFkZXIiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGFyYW1Db252ZXJ0ZXJUaHJvd2luZ1dhZUZpZWxkVGVzdFJlc291cmNlOSB7CisgICAgICAgIEBIZWFkZXJQYXJhbSgidGVzdCIpCisgICAgICAgIHByaXZhdGUgV2FlVHlwZSBmaWVsZDsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDU5OSkuZW50aXR5KCJUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGludm9rZWQiKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInBhcmFtLWNvbnZlcnRlci93YWUvZmllbGQvY29va2llIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhcmFtQ29udmVydGVyVGhyb3dpbmdXYWVGaWVsZFRlc3RSZXNvdXJjZTEwIHsKKyAgICAgICAgQENvb2tpZVBhcmFtKCJ0ZXN0IikKKyAgICAgICAgcHJpdmF0ZSBXYWVUeXBlIGZpZWxkOworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoNTk5KS5lbnRpdHkoIlRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgaW52b2tlZCIpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicGFyYW0tY29udmVydGVyL3dhZS9tZXRob2QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGFyYW1Db252ZXJ0ZXJUaHJvd2luZ1dhZU1ldGhvZFRlc3RSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiZGVmYXVsdC1tYXRyaXgiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZGVmYXVsdE1hdHJpeFRlc3QoQERlZmF1bHRWYWx1ZSgidmFsdWUiKSBATWF0cml4UGFyYW0oIm1pc3NpbmciKSBXYWVUeXBlIHBhcmFtKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDU5OSkuZW50aXR5KCJUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGludm9rZWQiKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiZGVmYXVsdC1wYXRoIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGRlZmF1bHRQYXRoVGVzdChARGVmYXVsdFZhbHVlKCJ2YWx1ZSIpIEBQYXRoUGFyYW0oIm1pc3NpbmciKSBXYWVUeXBlIHBhcmFtKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDU5OSkuZW50aXR5KCJUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGludm9rZWQiKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiZGVmYXVsdC1xdWVyeSIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBkZWZhdWx0UXVlcnlUZXN0KEBEZWZhdWx0VmFsdWUoInZhbHVlIikgQFF1ZXJ5UGFyYW0oIm1pc3NpbmciKSBXYWVUeXBlIHBhcmFtKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDU5OSkuZW50aXR5KCJUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGludm9rZWQiKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiZGVmYXVsdC1oZWFkZXIiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZGVmYXVsdEhlYWRlclRlc3QoQERlZmF1bHRWYWx1ZSgidmFsdWUiKSBASGVhZGVyUGFyYW0oIm1pc3NpbmciKSBXYWVUeXBlIHBhcmFtKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDU5OSkuZW50aXR5KCJUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGludm9rZWQiKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiZGVmYXVsdC1jb29raWUiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZGVmYXVsdENvb2tpZVRlc3QoQERlZmF1bHRWYWx1ZSgidmFsdWUiKSBAQ29va2llUGFyYW0oIm1pc3NpbmciKSBXYWVUeXBlIHBhcmFtKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDU5OSkuZW50aXR5KCJUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGludm9rZWQiKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgibWF0cml4IikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIG1hdHJpeFRlc3QoQE1hdHJpeFBhcmFtKCJ0ZXN0IikgV2FlVHlwZSBwYXJhbSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyg1OTkpLmVudGl0eSgiVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBpbnZva2VkIikuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInBhdGgve3Rlc3R9IikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHBhdGhUZXN0KEBQYXRoUGFyYW0oInRlc3QiKSBXYWVUeXBlIHBhcmFtKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDU5OSkuZW50aXR5KCJUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGludm9rZWQiKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgicXVlcnkiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgcXVlcnlUZXN0KEBRdWVyeVBhcmFtKCJ0ZXN0IikgV2FlVHlwZSBwYXJhbSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyg1OTkpLmVudGl0eSgiVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBiZSBpbnZva2VkIikuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImhlYWRlciIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBoZWFkZXJUZXN0KEBIZWFkZXJQYXJhbSgidGVzdCIpIFdhZVR5cGUgcGFyYW0pIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoNTk5KS5lbnRpdHkoIlRoaXMgbWV0aG9kIHNob3VsZCBub3QgYmUgaW52b2tlZCIpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJjb29raWUiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgY29va2llVGVzdChAQ29va2llUGFyYW0oInRlc3QiKSBXYWVUeXBlIHBhcmFtKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDU5OSkuZW50aXR5KCJUaGlzIG1ldGhvZCBzaG91bGQgbm90IGJlIGludm9rZWQiKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2FlRXhjZXB0aW9uVGhyb3duRnJvbVBhcmFtQ29udmVydGVyKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCJwYXJhbS1jb252ZXJ0ZXIvd2FlLyIpOworCisgICAgICAgIHRlc3RTaW5nbGUoImZpZWxkLWRlZmF1bHQtbWF0cml4IiwgNTU1LCB0YXJnZXQucGF0aCgiZmllbGQvZGVmYXVsdC1tYXRyaXgiKS5yZXF1ZXN0KCkpOworICAgICAgICB0ZXN0U2luZ2xlKCJmaWVsZC1kZWZhdWx0LXBhdGgiLCA1NTUsIHRhcmdldC5wYXRoKCJmaWVsZC9kZWZhdWx0LXBhdGgiKS5yZXF1ZXN0KCkpOworICAgICAgICB0ZXN0U2luZ2xlKCJmaWVsZC1kZWZhdWx0LXF1ZXJ5IiwgNTU1LCB0YXJnZXQucGF0aCgiZmllbGQvZGVmYXVsdC1xdWVyeSIpLnJlcXVlc3QoKSk7CisgICAgICAgIHRlc3RTaW5nbGUoImZpZWxkLWRlZmF1bHQtaGVhZGVyIiwgNTU1LCB0YXJnZXQucGF0aCgiZmllbGQvZGVmYXVsdC1oZWFkZXIiKS5yZXF1ZXN0KCkpOworICAgICAgICB0ZXN0U2luZ2xlKCJmaWVsZC1kZWZhdWx0LWNvb2tpZSIsIDU1NSwgdGFyZ2V0LnBhdGgoImZpZWxkL2RlZmF1bHQtY29va2llIikucmVxdWVzdCgpKTsKKworICAgICAgICB0ZXN0U2luZ2xlKCJmaWVsZC1tYXRyaXgiLCA1NTUsIHRhcmdldC5wYXRoKCJmaWVsZC9tYXRyaXg7dGVzdD12YWx1ZSIpLnJlcXVlc3QoKSk7CisgICAgICAgIHRlc3RTaW5nbGUoImZpZWxkLXBhdGgiLCA1NTUsIHRhcmdldC5wYXRoKCJmaWVsZC9wYXRoL3ZhbHVlIikucmVxdWVzdCgpKTsKKyAgICAgICAgdGVzdFNpbmdsZSgiZmllbGQtcXVlcnkiLCA1NTUsIHRhcmdldC5wYXRoKCJmaWVsZC9xdWVyeSIpLnF1ZXJ5UGFyYW0oInRlc3QiLCAidmFsdWUiKS5yZXF1ZXN0KCkpOworICAgICAgICB0ZXN0U2luZ2xlKCJmaWVsZC1oZWFkZXIiLCA1NTUsIHRhcmdldC5wYXRoKCJmaWVsZC9oZWFkZXIiKS5yZXF1ZXN0KCkuaGVhZGVyKCJ0ZXN0IiwgInZhbHVlIikpOworICAgICAgICB0ZXN0U2luZ2xlKCJmaWVsZC1jb29raWUiLCA1NTUsIHRhcmdldC5wYXRoKCJmaWVsZC9jb29raWUiKS5yZXF1ZXN0KCkuY29va2llKCJ0ZXN0IiwgInZhbHVlIikpOworCisgICAgICAgIHRlc3RTaW5nbGUoIm1ldGhvZC1kZWZhdWx0LW1hdHJpeCIsIDU1NSwgdGFyZ2V0LnBhdGgoIm1ldGhvZC9kZWZhdWx0LW1hdHJpeCIpLnJlcXVlc3QoKSk7CisgICAgICAgIHRlc3RTaW5nbGUoIm1ldGhvZC1kZWZhdWx0LXBhdGgiLCA1NTUsIHRhcmdldC5wYXRoKCJtZXRob2QvZGVmYXVsdC1wYXRoIikucmVxdWVzdCgpKTsKKyAgICAgICAgdGVzdFNpbmdsZSgibWV0aG9kLWRlZmF1bHQtcXVlcnkiLCA1NTUsIHRhcmdldC5wYXRoKCJtZXRob2QvZGVmYXVsdC1xdWVyeSIpLnJlcXVlc3QoKSk7CisgICAgICAgIHRlc3RTaW5nbGUoIm1ldGhvZC1kZWZhdWx0LWhlYWRlciIsIDU1NSwgdGFyZ2V0LnBhdGgoIm1ldGhvZC9kZWZhdWx0LWhlYWRlciIpLnJlcXVlc3QoKSk7CisgICAgICAgIHRlc3RTaW5nbGUoIm1ldGhvZC1kZWZhdWx0LWNvb2tpZSIsIDU1NSwgdGFyZ2V0LnBhdGgoIm1ldGhvZC9kZWZhdWx0LWNvb2tpZSIpLnJlcXVlc3QoKSk7CisKKyAgICAgICAgdGVzdFNpbmdsZSgibWV0aG9kLW1hdHJpeCIsIDU1NSwgdGFyZ2V0LnBhdGgoIm1ldGhvZC9tYXRyaXg7dGVzdD12YWx1ZSIpLnJlcXVlc3QoKSk7CisgICAgICAgIHRlc3RTaW5nbGUoIm1ldGhvZC1wYXRoIiwgNTU1LCB0YXJnZXQucGF0aCgibWV0aG9kL3BhdGgvdmFsdWUiKS5yZXF1ZXN0KCkpOworICAgICAgICB0ZXN0U2luZ2xlKCJtZXRob2QtcXVlcnkiLCA1NTUsIHRhcmdldC5wYXRoKCJtZXRob2QvcXVlcnkiKS5xdWVyeVBhcmFtKCJ0ZXN0IiwgInZhbHVlIikucmVxdWVzdCgpKTsKKyAgICAgICAgdGVzdFNpbmdsZSgibWV0aG9kLWhlYWRlciIsIDU1NSwgdGFyZ2V0LnBhdGgoIm1ldGhvZC9oZWFkZXIiKS5yZXF1ZXN0KCkuaGVhZGVyKCJ0ZXN0IiwgInZhbHVlIikpOworICAgICAgICB0ZXN0U2luZ2xlKCJtZXRob2QtY29va2llIiwgNTU1LCB0YXJnZXQucGF0aCgibWV0aG9kL2Nvb2tpZSIpLnJlcXVlc3QoKS5jb29raWUoInRlc3QiLCAidmFsdWUiKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RTaW5nbGUoU3RyaW5nIGNhc2VOYW1lLCBpbnQgZXhwZWN0ZWRTdGF0dXMsIEludm9jYXRpb24uQnVpbGRlciByZXF1ZXN0KSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gcmVxdWVzdC5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUZXN0IG9mIGFuIGV4Y2VwdGlvbiB0aHJvd24gZHVyaW5nIGZpZWxkL3BhcmFtZXRlciBpbmplY3Rpb24gWyIgKyBjYXNlTmFtZSArICJdIGZhaWxlZC4iLAorICAgICAgICAgICAgICAgIGV4cGVjdGVkU3RhdHVzLAorICAgICAgICAgICAgICAgIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisgICAgLyoqCisgICAgICogRU5EOiBKRVJTRVktMTUzMiByZXByb2R1Y2VyIGNvZGUuCisgICAgICovCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb25UZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ3NDU0NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9Gb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5hcGk7CisKK2ltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5IdHRwRGF0ZUZvcm1hdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkh0dHBIZWFkZXJSZWFkZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiBAYXV0aG9yIEltcmFuQFNtYXJ0SVRFbmdpbmVlcmluZy5Db20KKyAqLworcHVibGljIGNsYXNzIEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uVGVzdCBleHRlbmRzIENvbnRlbnREaXNwb3NpdGlvblRlc3QgeworCisgICAgcHVibGljIEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uVGVzdCgpIHsKKyAgICAgICAgY29udGVudERpc3Bvc2l0aW9uVHlwZSA9ICJmb3JtLWRhdGEiOworICAgIH0KKworICAgIEBUZXN0CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVzdENyZWF0ZSgpIHsKKyAgICAgICAgZmluYWwgRGF0ZSBkYXRlID0gbmV3IERhdGUoKTsKKyAgICAgICAgRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24gY29udGVudERpc3Bvc2l0aW9uOworICAgICAgICBjb250ZW50RGlzcG9zaXRpb24gPSBGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbi5uYW1lKCJ0ZXN0RGF0YSIpLmZpbGVOYW1lKCJ0ZXN0LmZpbGUiKS5jcmVhdGlvbkRhdGUoZGF0ZSkKKyAgICAgICAgICAgICAgICAubW9kaWZpY2F0aW9uRGF0ZShkYXRlKS5yZWFkRGF0ZShkYXRlKS5zaXplKDEyMjIpLmJ1aWxkKCk7CisgICAgICAgIGFzc2VydEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uKGNvbnRlbnREaXNwb3NpdGlvbiwgZGF0ZSk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGF0ZVN0cmluZyA9IEh0dHBEYXRlRm9ybWF0LmdldFByZWZlcnJlZERhdGVGb3JtYXQoKS5mb3JtYXQoZGF0ZSk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaGVhZGVyID0gY29udGVudERpc3Bvc2l0aW9uVHlwZSArICI7ZmlsZW5hbWU9XCJ0ZXN0LmZpbGVcIjtjcmVhdGlvbi1kYXRlPVwiIiArIGRhdGVTdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgKyAiXCI7bW9kaWZpY2F0aW9uLWRhdGU9XCIiICsgZGF0ZVN0cmluZyArICJcIjtyZWFkLWRhdGU9XCIiICsgZGF0ZVN0cmluZyArICJcIjtzaXplPTEyMjIiCisgICAgICAgICAgICAgICAgICAgICsgIjtuYW1lPVwidGVzdERhdGFcIiI7CisKKyAgICAgICAgICAgIGNvbnRlbnREaXNwb3NpdGlvbiA9IG5ldyBGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbihjb250ZW50RGlzcG9zaXRpb24udG9TdHJpbmcoKSk7CisgICAgICAgICAgICBhc3NlcnRGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbihjb250ZW50RGlzcG9zaXRpb24sIGRhdGUpOworICAgICAgICAgICAgY29udGVudERpc3Bvc2l0aW9uID0gbmV3IEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uKGhlYWRlcik7CisgICAgICAgICAgICBhc3NlcnRGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbihjb250ZW50RGlzcG9zaXRpb24sIGRhdGUpOworICAgICAgICAgICAgY29udGVudERpc3Bvc2l0aW9uID0gbmV3IEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uKEh0dHBIZWFkZXJSZWFkZXIubmV3SW5zdGFuY2UoaGVhZGVyKSwgdHJ1ZSk7CisgICAgICAgICAgICBhc3NlcnRGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbihjb250ZW50RGlzcG9zaXRpb24sIGRhdGUpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBQYXJzZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgZmFpbChleC5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBuZXcgRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24oKEh0dHBIZWFkZXJSZWFkZXIpIG51bGwsIHRydWUpOworICAgICAgICAgICAgZmFpbCgiTnVsbFBvaW50ZXJFeGNlcHRpb24gd2FzIGV4cGVjdGVkIHRvIGJlIHRocm93bi4iKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgUGFyc2VFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICBmYWlsKGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBOdWxsUG9pbnRlckV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgICAgIC8vZXhwZWN0ZWQKKyAgICAgICAgfQorICAgICAgICB0cnkgeworICAgICAgICAgICAgbmV3IEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uKCJmb3JtLWRhdGE7ZmlsZW5hbWU9XCJ0ZXN0LmZpbGVcIiIpOworICAgICAgICAgICAgZmFpbCgiSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHdhcyBleHBlY3RlZCB0byBiZSB0aHJvd24uIik7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFBhcnNlRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgZmFpbChleGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgLy9leHBlY3RlZAorICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbi5uYW1lKG51bGwpLmJ1aWxkKCk7CisgICAgICAgICAgICBmYWlsKCJJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gd2FzIGV4cGVjdGVkIHRvIGJlIHRocm93bi4iKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICAgICAgLy9leHBlY3RlZAorICAgICAgICB9IGNhdGNoIChmaW5hbCBFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICBmYWlsKGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB7CisgICAgICAgIGZpbmFsIERhdGUgZGF0ZSA9IG5ldyBEYXRlKCk7CisgICAgICAgIGZpbmFsIEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uIGNvbnRlbnREaXNwb3NpdGlvbiA9IEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uLm5hbWUoInRlc3REYXRhIikKKyAgICAgICAgICAgICAgICAuZmlsZU5hbWUoInRlc3QuZmlsZSIpLmNyZWF0aW9uRGF0ZShkYXRlKS5tb2RpZmljYXRpb25EYXRlKGRhdGUpCisgICAgICAgICAgICAgICAgICAgICAgICAucmVhZERhdGUoZGF0ZSkuc2l6ZSgxMjIyKS5idWlsZCgpOworICAgICAgICBmaW5hbCBTdHJpbmcgZGF0ZVN0cmluZyA9IEh0dHBEYXRlRm9ybWF0LmdldFByZWZlcnJlZERhdGVGb3JtYXQoKS5mb3JtYXQoZGF0ZSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBoZWFkZXIgPSBjb250ZW50RGlzcG9zaXRpb25UeXBlICsgIjsgZmlsZW5hbWU9XCJ0ZXN0LmZpbGVcIjsgY3JlYXRpb24tZGF0ZT1cIiIgKyBkYXRlU3RyaW5nCisgICAgICAgICAgICAgICAgKyAiXCI7IG1vZGlmaWNhdGlvbi1kYXRlPVwiIiArIGRhdGVTdHJpbmcgKyAiXCI7IHJlYWQtZGF0ZT1cIiIgKyBkYXRlU3RyaW5nICsgIlwiOyBzaXplPTEyMjIiCisgICAgICAgICAgICAgICAgKyAiOyBuYW1lPVwidGVzdERhdGFcIiI7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGhlYWRlciwgY29udGVudERpc3Bvc2l0aW9uLnRvU3RyaW5nKCkpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uKGZpbmFsIEZvcm1EYXRhQ29udGVudERpc3Bvc2l0aW9uIGNvbnRlbnREaXNwb3NpdGlvbiwgZmluYWwgRGF0ZSBkYXRlKSB7CisgICAgICAgIGFzc2VydENvbnRlbnREaXNwb3NpdGlvbihjb250ZW50RGlzcG9zaXRpb24sIGRhdGUpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRlc3REYXRhIiwgY29udGVudERpc3Bvc2l0aW9uLmdldE5hbWUoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvSHR0cEhlYWRlclRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9IdHRwSGVhZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwZWNiZGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvSHR0cEhlYWRlclRlc3QuamF2YQpAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5hcGk7CisKK2ltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkRhdGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkFjY2VwdGFibGVMYW5ndWFnZVRhZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkFjY2VwdGFibGVUb2tlbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkh0dHBEYXRlRm9ybWF0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuSHR0cEhlYWRlclJlYWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkxhbmd1YWdlVGFnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuUGFyYW1ldGVyaXplZEhlYWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLlRva2VuOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqLworcHVibGljIGNsYXNzIEh0dHBIZWFkZXJUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRva2VucygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBoZWFkZXIgPSAidHlwZSAgLyAgY29udGVudDsgYSA9IFwiYXNkc2RcIiI7CisKKyAgICAgICAgZmluYWwgSHR0cEhlYWRlclJlYWRlciByID0gSHR0cEhlYWRlclJlYWRlci5uZXdJbnN0YW5jZShoZWFkZXIpOworICAgICAgICB3aGlsZSAoci5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgIHIubmV4dCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWVkaWFUeXBlKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIG1pbWVUeXBlID0gImFwcGxpY2F0aW9uL3htbDtjaGFyc2V0PVVURi04IjsKKyAgICAgICAgTWVkaWFUeXBlLnZhbHVlT2YobWltZVR5cGUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExhbmd1YWdlVGFnKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGxhbmd1YWdlVGFnID0gImVuLVVTIjsKKyAgICAgICAgbmV3IExhbmd1YWdlVGFnKGxhbmd1YWdlVGFnKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBY2NlcHRhYmxlTGFuZ3VhZ2VUYWcoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgbGFuZ3VhZ2VUYWcgPSAiZW4tVVM7cT0wLjEyMyI7CisgICAgICAgIG5ldyBBY2NlcHRhYmxlTGFuZ3VhZ2VUYWcobGFuZ3VhZ2VUYWcpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFjY2VwdGFibGVMYW5ndWFnZVRhZ0xpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGxhbmd1YWdlVGFncyA9ICJlbi1VUztxPTAuMTIzLCBmcjtxPTAuMiwgZW47cT0wLjMsICo7cT0wLjAxIjsKKyAgICAgICAgZmluYWwgTGlzdDxBY2NlcHRhYmxlTGFuZ3VhZ2VUYWc+IGwgPSBIdHRwSGVhZGVyUmVhZGVyLnJlYWRBY2NlcHRMYW5ndWFnZShsYW5ndWFnZVRhZ3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoImVuIiwgbC5nZXQoMCkuZ2V0VGFnKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImZyIiwgbC5nZXQoMSkuZ2V0VGFnKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImVuLVVTIiwgbC5nZXQoMikuZ2V0VGFnKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIioiLCBsLmdldCgzKS5nZXRUYWcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VG9rZW4oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgdG9rZW4gPSAiZ3ppcCI7CisgICAgICAgIG5ldyBUb2tlbih0b2tlbik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWNjZXB0YWJsZVRva2VuKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHRva2VuID0gImd6aXA7cT0wLjEyMyI7CisgICAgICAgIG5ldyBBY2NlcHRhYmxlVG9rZW4odG9rZW4pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFjY2VwdGFibGVUb2tlbkxpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHRva2VucyA9ICJnemlwO3E9MC4xMjMsIGNvbXByZXNzO3E9MC4yLCB6bGliO3E9MC4zLCAqO3E9MC4wMSI7CisgICAgICAgIGZpbmFsIExpc3Q8QWNjZXB0YWJsZVRva2VuPiBsID0gSHR0cEhlYWRlclJlYWRlci5yZWFkQWNjZXB0VG9rZW4odG9rZW5zKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ6bGliIiwgbC5nZXQoMCkuZ2V0VG9rZW4oKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tcHJlc3MiLCBsLmdldCgxKS5nZXRUb2tlbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJnemlwIiwgbC5nZXQoMikuZ2V0VG9rZW4oKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKiIsIGwuZ2V0KDMpLmdldFRva2VuKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERhdGVQYXJzaW5nKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGRhdGVfUkZDMTEyMyA9ICJTdW4sIDA2IE5vdiAxOTk0IDA4OjQ5OjM3IEdNVCI7CisgICAgICAgIGZpbmFsIFN0cmluZyBkYXRlX1JGQzEwMzYgPSAiU3VuZGF5LCAwNi1Ob3YtOTQgMDg6NDk6MzcgR01UIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIGRhdGVfQU5TSV9DID0gIlN1biBOb3YgIDYgMDg6NDk6MzcgMTk5NCI7CisKKyAgICAgICAgSHR0cEhlYWRlclJlYWRlci5yZWFkRGF0ZShkYXRlX1JGQzExMjMpOworICAgICAgICBIdHRwSGVhZGVyUmVhZGVyLnJlYWREYXRlKGRhdGVfUkZDMTAzNik7CisgICAgICAgIEh0dHBIZWFkZXJSZWFkZXIucmVhZERhdGUoZGF0ZV9BTlNJX0MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERhdGVGb3JtYXR0aW5nKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGRhdGVfUkZDMTEyMyA9ICJTdW4sIDA2IE5vdiAxOTk0IDA4OjQ5OjM3IEdNVCI7CisgICAgICAgIGZpbmFsIERhdGUgZGF0ZSA9IEh0dHBIZWFkZXJSZWFkZXIucmVhZERhdGUoZGF0ZV9SRkMxMTIzKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgZGF0ZV9mb3JtYXR0ZWQgPSBIdHRwRGF0ZUZvcm1hdC5nZXRQcmVmZXJyZWREYXRlRm9ybWF0KCkuZm9ybWF0KGRhdGUpOworICAgICAgICBhc3NlcnRFcXVhbHMoZGF0ZV9SRkMxMTIzLCBkYXRlX2Zvcm1hdHRlZCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyYW1ldGVyaXplZEhlYWRlcigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7CisgICAgICAgIFBhcmFtZXRlcml6ZWRIZWFkZXIgcGggPSBuZXcgUGFyYW1ldGVyaXplZEhlYWRlcigiYSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCBwaC5nZXRWYWx1ZSgpKTsKKworICAgICAgICBwaCA9IG5ldyBQYXJhbWV0ZXJpemVkSGVhZGVyKCJhL2IiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhL2IiLCBwaC5nZXRWYWx1ZSgpKTsKKworICAgICAgICBwaCA9IG5ldyBQYXJhbWV0ZXJpemVkSGVhZGVyKCIgIGEgIC8gIGIgICIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEvYiIsIHBoLmdldFZhbHVlKCkpOworCisgICAgICAgIHBoID0gbmV3IFBhcmFtZXRlcml6ZWRIZWFkZXIoIiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIHBoLmdldFZhbHVlKCkpOworCisgICAgICAgIHBoID0gbmV3IFBhcmFtZXRlcml6ZWRIZWFkZXIoIjsiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBwaC5nZXRWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHBoLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworCisgICAgICAgIHBoID0gbmV3IFBhcmFtZXRlcml6ZWRIZWFkZXIoIjs7OyIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIHBoLmdldFZhbHVlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgcGguZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisKKyAgICAgICAgcGggPSBuZXcgUGFyYW1ldGVyaXplZEhlYWRlcigiICA7ICA7ICA7ICAiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIiLCBwaC5nZXRWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIHBoLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworCisgICAgICAgIHBoID0gbmV3IFBhcmFtZXRlcml6ZWRIZWFkZXIoImE7eD0xO3k9MiIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCBwaC5nZXRWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHBoLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCBwaC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KCJ4IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjIiLCBwaC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KCJ5IikpOworCisgICAgICAgIHBoID0gbmV3IFBhcmFtZXRlcml6ZWRIZWFkZXIoImEgOyAgeD0xICA7ICB5PTIgICIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImEiLCBwaC5nZXRWYWx1ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIHBoLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjEiLCBwaC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KCJ4IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoIjIiLCBwaC5nZXRQYXJhbWV0ZXJzKCkuZ2V0KCJ5IikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9Mb2NhbGVQcm92aWRlclRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9Mb2NhbGVQcm92aWRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmNlNzE3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL0xvY2FsZVByb3ZpZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuYXBpOworCitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuTG9jYWxlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQGF1dGhvciBNYXJrIEhhZGxleQorICovCitwdWJsaWMgY2xhc3MgTG9jYWxlUHJvdmlkZXJUZXN0IHsKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKKyAgICAgICAgZmluYWwgTG9jYWxlUHJvdmlkZXIgaW5zdGFuY2UgPSBuZXcgTG9jYWxlUHJvdmlkZXIoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJlbiIsIGluc3RhbmNlLnRvU3RyaW5nKG5ldyBMb2NhbGUoImVuIikpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJlbi1VUyIsIGluc3RhbmNlLnRvU3RyaW5nKG5ldyBMb2NhbGUoImVuIiwgInVzIikpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGcm9tU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIExvY2FsZVByb3ZpZGVyIGluc3RhbmNlID0gbmV3IExvY2FsZVByb3ZpZGVyKCk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgTG9jYWxlKCJlbiIpLCBpbnN0YW5jZS5mcm9tU3RyaW5nKCJlbiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBMb2NhbGUoImVuIiwgInVzIiksIGluc3RhbmNlLmZyb21TdHJpbmcoImVuLXVzIikpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL0xvY2F0aW9uSGVhZGVyQXN5bmNUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvTG9jYXRpb25IZWFkZXJBc3luY1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTNmOTk5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL0xvY2F0aW9uSGVhZGVyQXN5bmNUZXN0LmphdmEKQEAgLTAsMCArMSwyNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuYXBpOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkFycmF5QmxvY2tpbmdRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5CbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljQm9vbGVhbjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQXN5bmNSZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuU3VzcGVuZGVkOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5NYW5hZ2VkQXN5bmM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QudXRpbC5ydW5uZXIuQ29uY3VycmVudFJ1bm5lcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBUZXN0IGlmIHRoZSBsb2NhdGlvbiByZWxhdGl2ZXIgVVJJIGlzIGNvcnJlY3RseSByZXNvbHZlZCB3aXRoaW4gYXN5bmNocm9ub3VzIHByb2Nlc3NpbmcgY2FzZXMuCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitAUnVuV2l0aChDb25jdXJyZW50UnVubmVyLmNsYXNzKQorcHVibGljIGNsYXNzIExvY2F0aW9uSGVhZGVyQXN5bmNUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihMb2NhdGlvbkhlYWRlckFzeW5jVGVzdC5jbGFzcy5nZXROYW1lKCkpOworICAgIHN0YXRpYyBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3I7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBdG9taWNCb29sZWFuIGV4ZWN1dG9yQ29tcGFyaXNvbkZhaWxlZCA9IG5ldyBBdG9taWNCb29sZWFuKGZhbHNlKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBdG9taWNCb29sZWFuIGludGVycnVwdGVkID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNwb25zZVRlc3QuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByZXBhcmUgdGVzdCBpbmZyYXN0cnVjdHVyZS4KKyAgICAgKgorICAgICAqIEluIHRoaXMgY2FzZSBpdCBwcmVwYXJlcyBleGVjdXRvciB0aHJlYWQgcG9vbCBvZiBzaXplIG9uZSBhbmQgaW5pdGlhbGl6ZXMgdGhlIHRocmVhZC4KKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIC8qIHRocmVhZCBwb29sIGZvciBjdXN0b20gZXhlY3V0b3IgYXN5bmMgdGVzdCAqLworICAgICAgICBMb2NhdGlvbkhlYWRlckFzeW5jVGVzdC5leGVjdXRvciA9IEV4ZWN1dG9ycy5uZXdGaXhlZFRocmVhZFBvb2woMSk7CisKKyAgICAgICAgLy8gRm9yY2UgdGhlIHRocmVhZCB0byBiZSBlYWdlcmx5IGluc3RhbnRpYXRlZCAtIHRoaXMgcHJldmVudHMgdGhlIGluc3RhbnRpYXRpb24gbGF0ZXIgYW5kIGVuc3VyZXMsIHRoYXQgdGhlIHRocmVhZAorICAgICAgICAvLyB3aWxsIG5vdCBiZSBhIGNoaWxkIHRocmVhZCBvZiB0aGUgcmVxdWVzdCBoYW5kbGluZyB0aHJlYWQsIHNvIHRoZSB0aHJlYWQtbG9jYWwgYmFzZVVyaSB2YXJpYWJsZSB3aWxsIG5vdCBiZSBpbmhlcml0ZWQuCisgICAgICAgIExvY2F0aW9uSGVhZGVyQXN5bmNUZXN0LmV4ZWN1dG9yLnN1Ym1pdChuZXcgUnVubmFibGUoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBMT0dHRVIuaW5mbygiVGhyZWFkIHBvb2wgaW5pdGlhbGl6ZWQuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgSkFYLVJTIHJlc291cmNlCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoIlZvaWRNZXRob2RBbm5vdGF0ZWRXaXRoR0VUIikKKyAgICBAUGF0aCh2YWx1ZSA9ICIvUmVzcG9uc2VUZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc3BvbnNlVGVzdCB7CisKKyAgICAgICAgLyogaW5qZWN0ZWQgcmVxdWVzdCBVUkkgZm9yIGFzc2VydGlvbnMgaW4gdGhlIHJlc291cmNlIG1ldGhvZHMgKi8KKyAgICAgICAgQENvbnRleHQKKyAgICAgICAgcHJpdmF0ZSBVcmlJbmZvIHVyaUluZm87CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFzeW5jaHJvbm91cyByZXNvdXJjZSBtZXRob2QgZm9yIHRlc3RpbmcgaWYgdGhlIFVSSSBpcyBhYnNvbHV0aXplZCBhbHNvIGluIGNhc2Ugb2YgYXN5bmNocm9ub3VzIHByb2Nlc3Npbmc7CisgICAgICAgICAqCisgICAgICAgICAqIFRoZSByZXNwb25zZSBpcyBjcmVhdGVkIGluIHRoZSBzZXBhcmF0ZSB0aHJlYWQuIFRoaXMgdGVzdHMsIHRoYXQgdGhlIHRocmVhZCBzdGlsbCBoYXMgYWNjZXNzIHRvIHRoZSByZXF1ZXN0IGJhc2VVcmkKKyAgICAgICAgICogdGhyZWFkLWxvY2FsIHZhcmlhYmxlIGluIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLk91dGJvdW5kSmF4cnNSZXNwb25zZS5CdWlsZGVyfS4KKyAgICAgICAgICovCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImxvY2F0aW9uQXN5bmMiKQorICAgICAgICBwdWJsaWMgdm9pZCBsb2NhdGlvbkFzeW5jKEBTdXNwZW5kZWQgZmluYWwgQXN5bmNSZXNwb25zZSBhc3luY1Jlc3BvbnNlKSB7CisgICAgICAgICAgICBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFVSSSB1cmkgPSBnZXRVcmlCdWlsZGVyKCkuc2VnbWVudCgibG9jYXRpb25Bc3luYyIpLmJ1aWxkKCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3VsdCA9IFJlc3BvbnNlLmNyZWF0ZWQodXJpKS5idWlsZCgpOworCisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFVSSSBsb2NhdGlvbiA9IHJlc3VsdC5nZXRMb2NhdGlvbigpOworICAgICAgICAgICAgICAgICAgICBpZiAodXJpSW5mby5nZXRBYnNvbHV0ZVBhdGgoKS5lcXVhbHMobG9jYXRpb24pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3luY1Jlc3BvbnNlLnJlc3VtZShyZXN1bHQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmNSZXNwb25zZS5yZXN1bWUoUmVzcG9uc2Uuc2VydmVyRXJyb3IoKS5lbnRpdHkobG9jYXRpb24udG9TdHJpbmcoKSkuYnVpbGQoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pLnN0YXJ0KCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVzb3VyY2UgbWV0aG9kIGZvciBhc3luYyB0ZXN0IHdpdGggY3VzdG9tIGV4ZWN1dG9yLgorICAgICAgICAgKgorICAgICAgICAgKiBJdCBydW5zIGluIGEgdGhyZWFkIHRoYXQgd2FzIG5vdCBjcmVhdGVkIHdpdGhpbiB0aGUgcmVxdWVzdCBzY29wZSwgc28gaXQgZG9lcyBub3QgaW5oZXJpdCB0aGUgYmFzZVVyaSB0aHJlYWQtbG9jYWwKKyAgICAgICAgICogdmFyaWFibGUgdmFsdWUuCisgICAgICAgICAqIEluIHRoaXMgY2FzZSwgVVJJIHdpbGwgbm90IGJlIGFic29sdXRpemVkIHVudGlsIGNhbGxpbmcge0BsaW5rIEFzeW5jUmVzcG9uc2UjcmVzdW1lKE9iamVjdCl9LgorICAgICAgICAgKi8KKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiZXhlY3V0b3JBc3luYyIpCisgICAgICAgIEBNYW5hZ2VkQXN5bmMKKyAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0b3JBc3luYyhAU3VzcGVuZGVkIGZpbmFsIEFzeW5jUmVzcG9uc2UgYXN5bmNSZXNwb25zZSkgeworICAgICAgICAgICAgTG9jYXRpb25IZWFkZXJBc3luY1Rlc3QuZXhlY3V0b3Iuc3VibWl0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFVSSSB1cmkgPSBnZXRVcmlCdWlsZGVyKCkuc2VnbWVudCgiZXhlY3V0b3JBc3luYyIpLmJ1aWxkKCk7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3VsdCA9IFJlc3BvbnNlLmNyZWF0ZWQodXJpKS5idWlsZCgpOworICAgICAgICAgICAgICAgICAgICBhc3luY1Jlc3BvbnNlLnJlc3VtZShyZXN1bHQpOworICAgICAgICAgICAgICAgICAgICBpZiAoIXVyaUluZm8uZ2V0QWJzb2x1dGVQYXRoKCkuZXF1YWxzKHJlc3VsdC5nZXRMb2NhdGlvbigpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0b3JDb21wYXJpc29uRmFpbGVkLnNldCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBsYWNlaG9sZGVyIGZvciB0aGUgc3VzcGVuZGVkIGFzeW5jIHJlc3BvbnNlczsKKyAgICAgICAgICogRm9yIHRoZSBjdXJyZW50IHRlc3QgYSBzaW1wbGUgc3RhdGljIGZpZWxkIHdvdWxkIGJlIGVub3VnaCwgYnV0IHRoaXMgaXMgZWFzaWx5IGV4dGVuc2libGU7CisgICAgICAgICAqCisgICAgICAgICAqIFRoaXMgaXMgaW5zcGlyZWQgYnkgdGhlIHtAbGluayBBc3luY1Jlc3BvbnNlfSBqYXZhZG9jIGV4YW1wbGUKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJsb2NraW5nUXVldWU8QXN5bmNSZXNwb25zZT4gc3VzcGVuZGVkID0gbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTw+KDUpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTdGFydCBvZiB0aGUgYXN5bmMgdGVzdCAtIHN0b3JlcyB0aGUgYXN5bmNocm9ub3VzIHJlc3BvbnNlIG9iamVjdAorICAgICAgICAgKi8KKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgibG9jYXRpb25Bc3luY1N0YXJ0IikKKyAgICAgICAgcHVibGljIHZvaWQgbG9jYXRpb25Bc3luY1N0YXJ0KEBTdXNwZW5kZWQgZmluYWwgQXN5bmNSZXNwb25zZSBhc3luY1Jlc3BvbnNlKSB7CisgICAgICAgICAgICBuZXcgVGhyZWFkKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdXNwZW5kZWQucHV0KGFzeW5jUmVzcG9uc2UpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3luY1Jlc3BvbnNlLmNhbmNlbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludGVycnVwdGVkLnNldCh0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pLnN0YXJ0KCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogRmluaXNoIG9mIHRoZSBhc3luYyB0ZXN0IC0gY3JlYXRlcyBhIHJlc3BvbnNlLCBjaGVja3MgdGhlIGxvY2F0aW9uIGhlYWRlciBhbmQgcmVzdW1lcyB0aGUgYXN5bmNSZXNwb25zZQorICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIFVSSSB3YXMgY29ycmVjdGx5IGFic29sdXRpemVkLCBmYWxzZSBpZiB0aGUgVVJJIGlzIHJlbGF0aXZlIG9yIGRpZmZlcnMgZnJvbSB0aGUgZXhwZWN0ZWQgVVJJCisgICAgICAgICAqLworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJsb2NhdGlvbkFzeW5jRmluaXNoIikKKyAgICAgICAgcHVibGljIEJvb2xlYW4gbG9jYXRpb25Bc3luY0ZpbmlzaCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBBc3luY1Jlc3BvbnNlIGFzeW5jUmVzcG9uc2UgPSBzdXNwZW5kZWQucG9sbCgyMDAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworCisgICAgICAgICAgICBmaW5hbCBVUkkgdXJpID0gZ2V0VXJpQnVpbGRlcigpLnNlZ21lbnQoImxvY2F0aW9uQXN5bmNGaW5pc2giKS5idWlsZCgpOworICAgICAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzdWx0ID0gUmVzcG9uc2UuY3JlYXRlZCh1cmkpLmJ1aWxkKCk7CisgICAgICAgICAgICBmaW5hbCBib29sZWFuIHdhc0VxdWFsID0gcmVzdWx0LmdldExvY2F0aW9uKCkuZXF1YWxzKHVyaUluZm8uZ2V0QWJzb2x1dGVQYXRoKCkpOworCisgICAgICAgICAgICBhc3luY1Jlc3BvbnNlLnJlc3VtZShyZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIHdhc0VxdWFsOworICAgICAgICB9CisKKyAgICAgICAgLyoqIFJldHVybiBVcmlCdWlsZGVyIHdpdGggYmFzZSBwcmUtc2V0IHtAY29kZSAvUmVzcG9uc2VUZXN0fSB1cmkgc2VnbWVudCBmb3IgdGhpcyByZXNvdXJjZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBVcmlCdWlsZGVyCisgICAgICAgICAqLworICAgICAgICBwcml2YXRlIFVyaUJ1aWxkZXIgZ2V0VXJpQnVpbGRlcigpIHsKKyAgICAgICAgICAgIHJldHVybiBVcmlCdWlsZGVyLmZyb21SZXNvdXJjZShSZXNwb25zZVRlc3QuY2xhc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQmFzaWMgYXN5bmNocm9ub3VzIHRlc3RjYXNlOyBjaGVja3MgaWYgdGhlIFVSSSBpcyBjb3JyZWN0bHkgYWJzb2x1dGl6ZWQgYWxzbyB3aXRoaW4gYSBzZXBhcmF0ZSB0aHJlYWQgZHVyaW5nCisgICAgICogYXN5bmMgcHJvY2Vzc2luZworICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFzeW5jKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWRVcmkgPSBnZXRCYXNlVXJpKCkgKyAiUmVzcG9uc2VUZXN0L2xvY2F0aW9uQXN5bmMiOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoIlJlc3BvbnNlVGVzdC9sb2NhdGlvbkFzeW5jIikucmVxdWVzdCgpLmdldChSZXNwb25zZS5jbGFzcyk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIG1zZyA9IFN0cmluZy5mb3JtYXQoIkNvbXBhcmlzb24gZmFpbGVkIGluIHRoZSByZXNvdXJjZSBtZXRob2QuIFxuRXhwZWN0ZWQ6ICUxJHNcbkFjdHVhbDogJTIkcyIsCisgICAgICAgICAgICAgICAgZXhwZWN0ZWRVcmksIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydE5vdEVxdWFscyhtc2csIHJlc3BvbnNlLmdldFN0YXR1cygpLCBSZXNwb25zZS5TdGF0dXMuSU5URVJOQUxfU0VSVkVSX0VSUk9SLmdldFN0YXR1c0NvZGUoKSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGxvY2F0aW9uID0gcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKEh0dHBIZWFkZXJzLkxPQ0FUSU9OKTsKKyAgICAgICAgTE9HR0VSLmluZm8oIkxvY2F0aW9uIHJlc29sdmVkIGZyb20gcmVzcG9uc2UgPiAiICsgbG9jYXRpb24pOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRVcmksIGxvY2F0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHdpdGggYSB0aHJlYWQgZnJvbSB0aHJlYWQtcG9vbCAoY3JlYXRlZCBvdXQgb2YgcmVxdWVzdCBzY29wZSkKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeGVjdXRvckFzeW5jKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoIlJlc3BvbnNlVGVzdC9leGVjdXRvckFzeW5jIikucmVxdWVzdCgpLmdldChSZXNwb25zZS5jbGFzcyk7CisgICAgICAgIGZpbmFsIFN0cmluZyBsb2NhdGlvbiA9IHJlc3BvbnNlLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5MT0NBVElPTik7CisgICAgICAgIExPR0dFUi5pbmZvKCJMb2NhdGlvbiByZXNvbHZlZCBmcm9tIHJlc3BvbnNlID4gIiArIGxvY2F0aW9uKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlRoZSBjb21wYXJpc29uIGZhaWxlZCBpbiB0aGUgcmVzb3VyY2UgbWV0aG9kLiIsIGV4ZWN1dG9yQ29tcGFyaXNvbkZhaWxlZC5nZXQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhnZXRCYXNlVXJpKCkgKyAiUmVzcG9uc2VUZXN0L2V4ZWN1dG9yQXN5bmMiLCBsb2NhdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXN5bmNocm9ub3VzIHRlc3RjYXNlIHNwbGl0IG92ZXIgdHdvIGRpc3RpbmN0IHJlcXVlc3RzCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VwYXJhdGVkQXN5bmMoKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEZ1dHVyZTxSZXNwb25zZT4gZnV0dXJlUmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJSZXNwb25zZVRlc3QvbG9jYXRpb25Bc3luY1N0YXJ0IikucmVxdWVzdCgpLmFzeW5jKCkuZ2V0KCk7CisgICAgICAgIGZpbmFsIEJvb2xlYW4gcmVzdWx0ID0gdGFyZ2V0KCkucGF0aCgiUmVzcG9uc2VUZXN0L2xvY2F0aW9uQXN5bmNGaW5pc2giKS5yZXF1ZXN0KCkuZ2V0KEJvb2xlYW4uY2xhc3MpOworICAgICAgICBhc3NlcnRGYWxzZSgiVGhyZWFkIHdhcyBpbnRlcnJ1cHRlZCBvbiBpbnNlcnRpbmcgaW50byBibG9ja2luZyBxdWV1ZS4iLCBpbnRlcnJ1cHRlZC5nZXQoKSk7CisgICAgICAgIGFzc2VydFRydWUocmVzdWx0KTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IGZ1dHVyZVJlc3BvbnNlLmdldCgpOworICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYXRpb24gPSByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoSHR0cEhlYWRlcnMuTE9DQVRJT04pOworICAgICAgICBhc3NlcnRFcXVhbHMoZ2V0QmFzZVVyaSgpICsgIlJlc3BvbnNlVGVzdC9sb2NhdGlvbkFzeW5jRmluaXNoIiwgbG9jYXRpb24pOworICAgIH0KK30KKworCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9Mb2NhdGlvbkhlYWRlckJhc2ljVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL0xvY2F0aW9uSGVhZGVyQmFzaWNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY3ZTJlMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9Mb2NhdGlvbkhlYWRlckJhc2ljVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzEyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmFwaTsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC51dGlsLnJ1bm5lci5Db25jdXJyZW50UnVubmVyOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICogVGVzdCBpZiB0aGUgbG9jYXRpb24gcmVsYXRpdmUgVVJJIGlzIGNvcnJlY3RseSByZXNvbHZlZCB3aXRoaW4gYmFzaWMgY2FzZXMuCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitAUnVuV2l0aChDb25jdXJyZW50UnVubmVyLmNsYXNzKQorcHVibGljIGNsYXNzIExvY2F0aW9uSGVhZGVyQmFzaWNUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihMb2NhdGlvbkhlYWRlckJhc2ljVGVzdC5jbGFzcy5nZXROYW1lKCkpOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNwb25zZVRlc3QuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChmaW5hbCBDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIHN1cGVyLmNvbmZpZ3VyZUNsaWVudChjb25maWcpOworICAgICAgICBjb25maWcucHJvcGVydHkoQ2xpZW50UHJvcGVydGllcy5GT0xMT1dfUkVESVJFQ1RTLCBmYWxzZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBKQVgtUlMgcmVzb3VyY2UKKyAgICAgKi8KKyAgICBAUGF0aCh2YWx1ZSA9ICIvUmVzcG9uc2VUZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc3BvbnNlVGVzdCB7CisKKyAgICAgICAgLyogaW5qZWN0ZWQgcmVxdWVzdCBVUkkgZm9yIGFzc2VydGlvbnMgaW4gdGhlIHJlc291cmNlIG1ldGhvZHMgKi8KKyAgICAgICAgQENvbnRleHQKKyAgICAgICAgcHJpdmF0ZSBVcmlJbmZvIHVyaUluZm87CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlc291cmNlIG1ldGhvZCBmb3IgdGhlIGJhc2ljIHVyaSBjb252ZXJzaW9uIHRlc3QKKyAgICAgICAgICogQHJldHVybiB0ZXN0IHJlc3BvbnNlIHdpdGggcmVsYXRpdmUgbG9jYXRpb24gdXJpCisgICAgICAgICAqLworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJsb2NhdGlvbiIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBsb2NhdGlvblRlc3QoKSB7CisgICAgICAgICAgICBmaW5hbCBVUkkgdXJpID0gVVJJLmNyZWF0ZSgibG9jYXRpb24iKTsKKyAgICAgICAgICAgIExPR0dFUi5pbmZvKCJVUkkgQ3JlYXRlZCBpbiB0aGUgcmVzb3VyY2UgbWV0aG9kID4gIiArIHVyaSk7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2UuY3JlYXRlZCh1cmkpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVzb3VyY2UgbWV0aG9kIGZvciB0aGUgdGVzdCB3aXRoIG51bGwgbG9jYXRpb24KKyAgICAgICAgICogQHJldHVybiB0ZXN0IHJlc3BvbnNlIHdpdGggbnVsbCBsb2NhdGlvbiB1cmkKKyAgICAgICAgICovCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImxvY2F0aW9uTnVsbCIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBsb2NhdGlvblRlc3ROdWxsKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLmNyZWF0ZWQobnVsbCkuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXNvdXJjZSBtZXRob2QgZm9yIHRoZSB0ZXN0IHdpdGggZW50aXR5IGNvbnRhaW5pbmcgcmVzcG9uc2UKKyAgICAgICAgICogQHJldHVybiB0ZXN0IHJlc3BvbnNlIHdpdGggcmVsYXRpdmUgdXJpIGFuZCB3aXRoIGVudGl0eQorICAgICAgICAgKi8KKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgibG9jYXRpb25XaXRoQm9keSIpCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBsb2NhdGlvblRlc3RXaXRoQm9keSgpIHsKKyAgICAgICAgICAgIGZpbmFsIFVSSSB1cmkgPSBVUkkuY3JlYXRlKCJsb2NhdGlvbldpdGhCb2R5Iik7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2UuY3JlYXRlZCh1cmkpLmVudGl0eSgiUmV0dXJuIGZyb20gbG9jYXRpb25XaXRoQm9keSIpLnR5cGUoInRleHQvcGxhaW4iKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlc291cmNlIG1ldGhvZCBmb3IgZGlyZWN0IHRlc3QgLSBsb2NhdGlvbiBoZWFkZXIgaXMgY2hlY2tlZCBpbW1lZGlhdGVseSBhZnRlciBjYWxsaW5nIFJlc3BvbnNlLmNyZWF0ZWQoKSBhbmQKKyAgICAgICAgICogdGhlIHJlc3VsdCBpcyByZXR1cm5lZCBhcyBhIGJvb2xlYW4gcmVzcG9uc2UgaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlICh7QGxpbmsgUmVzcG9uc2V9KSB0eXBlIGFuZCBjaGVja2luZyB0aGUKKyAgICAgICAgICogaGVhZGVyIGluIHRoZSBjYWxsaW5nIHRlc3QgbWV0aG9kLiBUaGlzIGlzb2xhdGVzIHRoZSBpbmZsdWVuY2Ugb2YgYWJzb2x1dGl6YXRpb24gcm91dGluZSBwZXJmb3JtZWQgaW4gdGhlCisgICAgICAgICAqICh7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclJ1bnRpbWV9IGJlZm9yZSBjbG9zaW5nIHRoZSBzdHJlYW0uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBVUkkgaXMgYWJzb2x1dGl6ZWQgY29ycmVjdGx5LCBmYWxzZSBpZiB0aGUgVVJJIHJlbWFpbnMgcmVsYXRpdmUgKG9yIGRvZXMgbm90IG1hdGNoIHRoZSBleHBlY3RlZCBvbmUpLgorICAgICAgICAgKi8KKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgibG9jYXRpb25EaXJlY3QiKQorICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgICAgICBwdWJsaWMgQm9vbGVhbiBsb2NhdGlvbkRpcmVjdFRlc3QoKSB7CisgICAgICAgICAgICBmaW5hbCBVUkkgdXJpID0gZ2V0VXJpQnVpbGRlcigpLnNlZ21lbnQoImxvY2F0aW9uRGlyZWN0IikuYnVpbGQoKTsKKyAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gUmVzcG9uc2UuY3JlYXRlZCh1cmkpLmJ1aWxkKCk7CisgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2UuZ2V0TG9jYXRpb24oKS5lcXVhbHModXJpSW5mby5nZXRBYnNvbHV0ZVBhdGgoKSk7CisgICAgICAgIH0KKworCisKKworICAgICAgICAvKioKKyAgICAgICAgICogUmVzb3VyY2UgbWV0aG9kIGZvciB0ZXN0aW5nIGNvcnJlY3QgYmFzZVVyaSBhbmQgcmVxdWVzdCBvdmVyd3JpdGUgaW4gdGhlIHByZW1hdGNoaW5nIGZpbHRlci4KKyAgICAgICAgICogU2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBieSB0aGUgdGVzdCwgYXMge0BsaW5rIFJlc3BvbnNlVGVzdCNyZWRpcmVjdGVkVXJpKCl9IHNob3VsZCBiZSBjYWxsZWQgaW5zdGVhZC4KKyAgICAgICAgICovCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImZpbHRlckNoYW5nZWRCYXNlVXJpIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGxvY2F0aW9uV2l0aENoYW5nZWRCYXNlVXJpKCkgeworICAgICAgICAgICAgZmFpbCgiTWV0aG9kIHNob3VsZCBub3QgZXhwZWN0ZWQgdG8gYmUgY2FsbGVkLCBhcyBwcmVtYXRjaGluZyBmaWx0ZXIgc2hvdWxkIGhhdmUgY2hhbmdlZCB0aGUgcmVxdWVzdCB1cmkuIik7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2UuY3JlYXRlZChVUkkuY3JlYXRlKCJuZXciKSkuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBOb3QgY2FsbGVkIGJ5IHRoZSB0ZXN0IGRpcmVjdGx5LCBidXQgYWZ0ZXIgcHJlbWF0Y2hpbmcgZmlsdGVyIHJlZGlyZWN0IGZyb20KKyAgICAgICAgICoge0BsaW5rIFJlc3BvbnNlVGVzdCNsb2NhdGlvbldpdGhDaGFuZ2VkQmFzZVVyaSgpfS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB7QGNvZGUgMjAxIENyZWF0ZWR9IHJlc3BvbnNlIHdpdGggbG9jYXRpb24gcmVzb2x2ZWQgYWdhaW5zdCBuZXcgYmFzZVVyaS4KKyAgICAgICAgICovCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIm5ld1VyaSIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSByZWRpcmVjdGVkVXJpKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLmNyZWF0ZWQoVVJJLmNyZWF0ZSgibmV3UmVkaXJlY3RlZCIpKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlc291cmNlIG1ldGhvZCBmb3IgdGVzdGluZyByZWxhdGl2ZSBVUkkgcmVzb2x1dGlvbiBpbiBjYXNlIG9mIHtAY29kZSBzZWVPdGhlcn0gcmVzcG9uc2UuCisgICAgICAgICAqIEByZXR1cm4ge0Bjb2RlIDMwMyBTZWUgT3RoZXJ9IHJlc3BvbnNlIHdpdGggcmVsYXRpdmUgVVJJCisgICAgICAgICAqLworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgic2VlT3RoZXIiKQorICAgICAgICBAQ29uc3VtZXMoInRleHQvcGxhaW4iKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2Ugc2VlT3RoZXIoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc2VlT3RoZXIoVVJJLmNyZWF0ZSgib3RoZXIiKSkuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXNvdXJjZSBtZXRob2QgZm9yIHRlc3RpbmcgcmVsYXRpdmUgVVJJIHJlc29sdXRpb24gaW4gY2FzZSBvZiB7QGNvZGUgc2VlT3RoZXJ9IHJlc3BvbnNlLgorICAgICAgICAgKiBAcmV0dXJuIHtAY29kZSAzMDMgU2VlIE90aGVyfSByZXNwb25zZSB3aXRoIHJlbGF0aXZlIFVSSQorICAgICAgICAgKi8KKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgic2VlT3RoZXJMZWFkaW5nIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHNlZU90aGVyV2l0aExlYWRpbmdTbGFzaCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zZWVPdGhlcihVUkkuY3JlYXRlKCIvb3RoZXIiKSkuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXNvdXJjZSBtZXRob2QgZm9yIHRlc3RpbmcgcmVsYXRpdmUgVVJJIHJlc29sdXRpb24gaW4gY2FzZSBvZiB7QGNvZGUgc2VlT3RoZXJ9IHJlc3BvbnNlLgorICAgICAgICAgKiBAcmV0dXJuIHtAY29kZSAzMDMgU2VlIE90aGVyfSByZXNwb25zZSB3aXRoIHJlbGF0aXZlIFVSSQorICAgICAgICAgKi8KKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgic2VlT3RoZXJUcmFpbGluZyIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBzZWVPdGhlcldpdGhUcmFpbGluZ1NsYXNoKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnNlZU90aGVyKFVSSS5jcmVhdGUoIm90aGVyLyIpKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlc291cmNlIG1ldGhvZCBmb3IgdGVzdGluZyByZWxhdGl2ZSBVUkkgcmVzb2x1dGlvbiBpbiBjYXNlIG9mIHtAY29kZSB0ZW1wb3JhcnlSZWRpcmVjdH0gcmVzcG9uc2UuCisgICAgICAgICAqIEByZXR1cm4ge0Bjb2RlIDMwNyBUZW1wb3JhcnkgUmVkaXJlY3R9IHJlc3BvbnNlIHdpdGggcmVsYXRpdmUgVVJJCisgICAgICAgICAqLworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJ0ZW1wb3JhcnlSZWRpcmVjdCIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSB0ZW1wb3JhcnlSZWRpcmVjdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS50ZW1wb3JhcnlSZWRpcmVjdChVUkkuY3JlYXRlKCJyZWRpcmVjdCIpKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlc291cmNlIG1ldGhvZCBmb3IgdGVzdGluZyByZWxhdGl2ZSBVUkkgcmVzb2x1dGlvbiBpbiBjYXNlIG9mIHtAY29kZSB0ZW1wb3JhcnlSZWRpcmVjdH0gcmVzcG9uc2UuCisgICAgICAgICAqIEByZXR1cm4ge0Bjb2RlIDMwNyBUZW1wb3JhcnkgUmVkaXJlY3R9IHJlc3BvbnNlIHdpdGggcmVsYXRpdmUgVVJJCisgICAgICAgICAqLworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJ0ZW1wb3JhcnlSZWRpcmVjdExlYWRpbmciKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgdGVtcG9yYXJ5UmVkaXJlY3RXaXRoTGVhZGluZ1NsYXNoKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnRlbXBvcmFyeVJlZGlyZWN0KFVSSS5jcmVhdGUoIi9yZWRpcmVjdCIpKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlc291cmNlIG1ldGhvZCBmb3IgdGVzdGluZyByZWxhdGl2ZSBVUkkgcmVzb2x1dGlvbiBpbiBjYXNlIG9mIHtAY29kZSB0ZW1wb3JhcnlSZWRpcmVjdH0gcmVzcG9uc2UuCisgICAgICAgICAqIEByZXR1cm4ge0Bjb2RlIDMwNyBUZW1wb3JhcnkgUmVkaXJlY3R9IHJlc3BvbnNlIHdpdGggcmVsYXRpdmUgVVJJCisgICAgICAgICAqLworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJ0ZW1wb3JhcnlSZWRpcmVjdFRyYWlsaW5nIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHRlbXBvcmFyeVJlZGlyZWN0V2l0aFRyYWlsaW5nU2xhc2goKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2UudGVtcG9yYXJ5UmVkaXJlY3QoVVJJLmNyZWF0ZSgicmVkaXJlY3QvIikpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICAvKiogUmV0dXJuIFVyaUJ1aWxkZXIgd2l0aCBiYXNlIHByZS1zZXQge0Bjb2RlIC9SZXNwb25zZVRlc3R9IHVyaSBzZWdtZW50IGZvciB0aGlzIHJlc291cmNlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIFVyaUJ1aWxkZXIKKyAgICAgICAgICovCisgICAgICAgIHByaXZhdGUgVXJpQnVpbGRlciBnZXRVcmlCdWlsZGVyKCkgeworICAgICAgICAgICAgcmV0dXJuIFVyaUJ1aWxkZXIuZnJvbVJlc291cmNlKFJlc3BvbnNlVGVzdC5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCYXNpYyB0ZXN0OyByZXNvdXJjZSBtZXRob2RzIHJldHVybnMgcmVsYXRpdmUgdXJpLCB0ZXN0IGV4cGVjdHMgdXJpIHRvIGJlIGFic29sdXRlCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udmVydFJlbGF0aXZlVXJpVG9BYnNvbHV0ZSgpIHsKKyAgICAgICAgY2hlY2tSZXNvdXJjZSgiUmVzcG9uc2VUZXN0L2xvY2F0aW9uIiwgImxvY2F0aW9uIik7CisgICAgICAgIC8vIGNoZWNrUmVzb3VyY2UoIlJlc3BvbnNlVGVzdC9sb2NhdGlvbiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgd2l0aCBlbnRpdHk7IG1vc3Qgb2YgdGhlIEhUVFAgMjAxIENyZWF0ZWQgcmVzcG9uc2VzIGRvIG5vdCBjb250YWluIGFueSBib2R5LCBqdXN0IGhlYWRlcnMuCisgICAgICogVGhpcyB0ZXN0IGVuc3VyZXMsIHRoYXQgdGhlIHVyaSBjb252ZXJzaW9uIHdvcmtzIGV2ZW4gaW4gY2FzZSB3aGVuIGVudGl0eSBpcyBwcmVzZW50LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFic29sdXRlVXJpV2l0aEVudGl0eSgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSBjaGVja1Jlc291cmNlKCJSZXNwb25zZVRlc3QvbG9jYXRpb25XaXRoQm9keSIsICJsb2NhdGlvbldpdGhCb2R5Iik7CisgICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UuZ2V0RW50aXR5KCkpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGVzdCB3aXRoIG51bGwgbG9jYXRpb247CisgICAgICogRW5zdXJlcywgdGhhdCB0aGUgbnVsbCBsb2NhdGlvbiBpcyBwcm9jZXNzZWQgY29ycmVjdGx5LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE51bGxMb2NhdGlvbigpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJSZXNwb25zZVRlc3QvbG9jYXRpb25OdWxsIikucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9QTEFJTikuZ2V0KFJlc3BvbnNlLmNsYXNzKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGxvY2F0aW9uID0gcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKEh0dHBIZWFkZXJzLkxPQ0FUSU9OKTsKKyAgICAgICAgTE9HR0VSLmluZm8oIkxvY2F0aW9uIHJlc29sdmVkIGZyb20gcmVzcG9uc2UgPiAiICsgbG9jYXRpb24pOworICAgICAgICBhc3NlcnROdWxsKCJMb2NhdGlvbiBoZWFkZXIgc2hvdWxkIGJlIGFic29sdXRlIFVSSSIsIGxvY2F0aW9uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBpZiB0aGUgVVJJIGlzIGFic29sdXRpemVkIGluIHRoZSBSZXNwb25zZSBkaXJlY3RseSBhZnRlciBSZXNwb25zZS5CdWlsZGVyLmNyZWF0ZWQoKSBpcyBjYWxsZWQKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb252ZXJzaW9uRGlyZWN0bHkoKSB7CisgICAgICAgIGZpbmFsIEJvb2xlYW4gcmVzdWx0ID0gdGFyZ2V0KCkucGF0aCgiUmVzcG9uc2VUZXN0L2xvY2F0aW9uRGlyZWN0IikucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9QTEFJTikuZ2V0KEJvb2xlYW4uY2xhc3MpOworICAgICAgICBhc3NlcnRUcnVlKHJlc3VsdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2VlT3RoZXIoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiUmVzcG9uc2VUZXN0L3NlZU90aGVyIikucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eSgiVEVYVCIsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgU3RyaW5nIGxvY2F0aW9uID0gcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKEh0dHBIZWFkZXJzLkxPQ0FUSU9OKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGdldEJhc2VVcmkoKS50b1N0cmluZygpICsgIm90aGVyIiwgbG9jYXRpb24pOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiUmVzcG9uc2VUZXN0L3NlZU90aGVyTGVhZGluZyIpLnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfUExBSU4pLmdldChSZXNwb25zZS5jbGFzcyk7CisgICAgICAgIGxvY2F0aW9uID0gcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKEh0dHBIZWFkZXJzLkxPQ0FUSU9OKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGdldEJhc2VVcmkoKS50b1N0cmluZygpICsgIm90aGVyIiwgbG9jYXRpb24pOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiUmVzcG9uc2VUZXN0L3NlZU90aGVyVHJhaWxpbmciKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOKS5nZXQoUmVzcG9uc2UuY2xhc3MpOworICAgICAgICBsb2NhdGlvbiA9IHJlc3BvbnNlLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5MT0NBVElPTik7CisgICAgICAgIGFzc2VydEVxdWFscyhnZXRCYXNlVXJpKCkudG9TdHJpbmcoKSArICJvdGhlci8iLCBsb2NhdGlvbik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGVtcG9yYXJ5UmVkaXJlY3QoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiUmVzcG9uc2VUZXN0L3RlbXBvcmFyeVJlZGlyZWN0IikucmVxdWVzdChNZWRpYVR5cGUuVEVYVF9QTEFJTikuZ2V0KFJlc3BvbnNlLmNsYXNzKTsKKyAgICAgICAgU3RyaW5nIGxvY2F0aW9uID0gcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKEh0dHBIZWFkZXJzLkxPQ0FUSU9OKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGdldEJhc2VVcmkoKS50b1N0cmluZygpICsgInJlZGlyZWN0IiwgbG9jYXRpb24pOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiUmVzcG9uc2VUZXN0L3RlbXBvcmFyeVJlZGlyZWN0TGVhZGluZyIpLnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfUExBSU4pLmdldChSZXNwb25zZS5jbGFzcyk7CisgICAgICAgIGxvY2F0aW9uID0gcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKEh0dHBIZWFkZXJzLkxPQ0FUSU9OKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGdldEJhc2VVcmkoKS50b1N0cmluZygpICsgInJlZGlyZWN0IiwgbG9jYXRpb24pOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiUmVzcG9uc2VUZXN0L3RlbXBvcmFyeVJlZGlyZWN0VHJhaWxpbmciKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOKS5nZXQoUmVzcG9uc2UuY2xhc3MpOworICAgICAgICBsb2NhdGlvbiA9IHJlc3BvbnNlLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5MT0NBVElPTik7CisgICAgICAgIGFzc2VydEVxdWFscyhnZXRCYXNlVXJpKCkudG9TdHJpbmcoKSArICJyZWRpcmVjdC8iLCBsb2NhdGlvbik7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZXNwb25zZSBjaGVja1Jlc291cmNlKGZpbmFsIFN0cmluZyByZXNvdXJjZVBhdGgsIGZpbmFsIFN0cmluZyBleHBlY3RlZFJlbGF0aXZlVXJpKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aChyZXNvdXJjZVBhdGgpLnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfUExBSU4pLmdldChSZXNwb25zZS5jbGFzcyk7CisgICAgICAgIGZpbmFsIFN0cmluZyBsb2NhdGlvbiA9IHJlc3BvbnNlLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5MT0NBVElPTik7CisgICAgICAgIExPR0dFUi5pbmZvKCJMb2NhdGlvbiByZXNvbHZlZCBmcm9tIHJlc3BvbnNlID4gIiArIGxvY2F0aW9uKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGdldEJhc2VVcmkoKSArIGV4cGVjdGVkUmVsYXRpdmVVcmksIGxvY2F0aW9uKTsKKyAgICAgICAgcmV0dXJuIHJlc3BvbnNlOworICAgIH0KK30KKworCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9Mb2NhdGlvbkhlYWRlckZpbHRlcnNUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvTG9jYXRpb25IZWFkZXJGaWx0ZXJzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2OTc1YWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvTG9jYXRpb25IZWFkZXJGaWx0ZXJzVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTk0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmFwaTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Bc3luY1Jlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuRHluYW1pY0ZlYXR1cmU7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlByZU1hdGNoaW5nOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5SZXNvdXJjZUluZm87CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlN1c3BlbmRlZDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CitpbXBvcnQgamF2YXgud3MucnMuZXh0LkV4Y2VwdGlvbk1hcHBlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yQ29udGV4dDsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCisvKioKKyAqIFRlc3QgaWYgdGhlIGxvY2F0aW9uIHJlc3BvbnNlIGhlYWRlciByZWxhdGl2ZSBVUkkgaXMgY29ycmVjdGx5IHJlc29sdmVkIHdpdGhpbiBjb21wbGV4IGNhc2VzIHdpdGggaW50ZXJjZXB0b3JzLCBmaWx0ZXJzLAorICogZXhjZXB0aW9uIG1hcHBlcnMsIGV0Yy4KKyAqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBMb2NhdGlvbkhlYWRlckZpbHRlcnNUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihMb2NhdGlvbkhlYWRlckJhc2ljVGVzdC5jbGFzcy5nZXROYW1lKCkpOworCisgICAgc3RhdGljIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvcjsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoCisgICAgICAgICAgICAgICAgTXlUZXN0LmNsYXNzLAorICAgICAgICAgICAgICAgIExvY2F0aW9uTWFuaXB1bGF0aW9uRHluYW1pY0JpbmRpbmcuY2xhc3MsCisgICAgICAgICAgICAgICAgQWJvcnRpbmdQcmVNYXRjaGluZ1JlcXVlc3RGaWx0ZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgQmFzZVVyaUNoYW5naW5nUHJlTWF0Y2hpbmdGaWx0ZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgVGVzdEV4Y2VwdGlvbk1hcHBlci5jbGFzcworICAgICAgICApOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByZXBhcmUgdGVzdCBpbmZyYXN0cnVjdHVyZS4KKyAgICAgKgorICAgICAqIEluIHRoaXMgY2FzZSBpdCBwcmVwYXJlcyBleGVjdXRvciB0aHJlYWQgcG9vbCBvZiBzaXplIG9uZSBhbmQgaW5pdGlhbGl6ZXMgdGhlIHRocmVhZC4KKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgICAgIC8qIHRocmVhZCBwb29sIGZvciBjdXN0b20gZXhlY3V0b3IgYXN5bmMgdGVzdCAqLworICAgICAgICBMb2NhdGlvbkhlYWRlckZpbHRlcnNUZXN0LmV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld0ZpeGVkVGhyZWFkUG9vbCgxKTsKKworICAgICAgICAvLyBGb3JjZSB0aGUgdGhyZWFkIHRvIGJlIGVhZ2VybHkgaW5zdGFudGlhdGVkIC0gdGhpcyBwcmV2ZW50cyB0aGUgaW5zdGFudGlhdGlvbiBsYXRlciBhbmQgZW5zdXJlcywgdGhhdCB0aGUgdGhyZWFkCisgICAgICAgIC8vIHdpbGwgbm90IGJlIGEgY2hpbGQgdGhyZWFkIG9mIHRoZSByZXF1ZXN0IGhhbmRsaW5nIHRocmVhZCwgc28gdGhlIHRocmVhZC1sb2NhbCBiYXNlVXJpIHZhcmlhYmxlIHdpbGwgbm90IGJlIGluaGVyaXRlZC4KKyAgICAgICAgTG9jYXRpb25IZWFkZXJGaWx0ZXJzVGVzdC5leGVjdXRvci5zdWJtaXQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmluZm8oIlRocmVhZCBwb29sIGluaXRpYWxpemVkLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKworICAgIC8qKgorICAgICAqIFRlc3QgSkFYLVJTIHJlc291cmNlCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoIlZvaWRNZXRob2RBbm5vdGF0ZWRXaXRoR0VUIikKKyAgICBAUGF0aCh2YWx1ZSA9ICIvUmVzcG9uc2VUZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15VGVzdCB7CisKKyAgICAgICAgLyogaW5qZWN0ZWQgcmVxdWVzdCBVUkkgZm9yIGFzc2VydGlvbnMgaW4gdGhlIHJlc291cmNlIG1ldGhvZHMgKi8KKyAgICAgICAgQENvbnRleHQKKyAgICAgICAgcHJpdmF0ZSBVcmlJbmZvIHVyaUluZm87CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlc291cmNlIG1ldGhvZCBmb3IgdGhlIHRlc3Qgd2l0aCB1cmkgcmV3cml0dGVuIGluIHRoZSBmaWx0ZXIKKyAgICAgICAgICogQHJldHVybiB0ZXN0IHJlc3BvbnNlIHdpdGggcmVsYXRpdmUgbG9jYXRpb24gdXJpCisgICAgICAgICAqLworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJsb2NhdGlvblRlc3RXaXRoRmlsdGVyIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGxvY2F0aW9uVGVzdFdpdGhGaWx0ZXIoKSB7CisgICAgICAgICAgICBmaW5hbCBVUkkgdXJpID0gVVJJLmNyZWF0ZSgibG9jYXRpb24iKTsKKyAgICAgICAgICAgIExPR0dFUi5pbmZvKCJVUkkgQ3JlYXRlZCBpbiB0aGUgcmVzb3VyY2UgbWV0aG9kID4gIiArIHVyaSk7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2UuY3JlYXRlZCh1cmkpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVzb3VyY2UgbWV0aG9kIGZvciB0aGUgdGVzdCB3aXRoIHVyaSByZXdyaXR0ZW4gaW4gdGhlIGludGVyY2VwdG9yCisgICAgICAgICAqIEByZXR1cm4gdGVzdCByZXNwb25zZSB3aXRoIHJlbGF0aXZlIGxvY2F0aW9uIHVyaSBhbmQgd2l0aCBib2R5CisgICAgICAgICAqICh3cml0ZSBpbnRlcmNlcHRvcnMgYXJlIG5vdCB0cmlnZ2VyZWQgZm9yIGVudGl0eS1sZXNzIHJlc3BvbnNlcykKKyAgICAgICAgICovCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImxvY2F0aW9uV2l0aEludGVyY2VwdG9yIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGxvY2F0aW9uVGVzdFdpdGhJbnRlcmNlcHRvcigpIHsKKyAgICAgICAgICAgIGZpbmFsIFVSSSB1cmkgPSBVUkkuY3JlYXRlKCJmb28iKTsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5jcmVhdGVkKHVyaSkuZW50aXR5KCJSZXR1cm4gZnJvbSBsb2NhdGlvblRlc3RXaXRoSW50ZXJjZXB0b3IiKS50eXBlKCJ0ZXh0L3BsYWluIikuYnVpbGQoKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlc291cmNlIG1ldGhvZCBmb3IgdGVzdGluZyBVUkkgYWJzb2x1dGl6YXRpb24gYWZ0ZXIgdGhlIGFib3J0aW9uIGluIHRoZSBwb3N0LW1hdGNoaW5nIGZpbHRlci4KKyAgICAgICAgICogQHJldHVybiBkdW1teSByZXNwb25zZSAtIHRoaXMgc3RyaW5nIHNob3VsZCBuZXZlciBiZSBwcm9wYWdhdGVkIHRvIHRoZSBjbGllbnQgKHRoZSBwcm9jZXNzaW5nIGNoYWluCisgICAgICAgICAqIHdpbGwgYmUgYWJvcnRlZCBpbiB0aGUgZmlsdGVyIGJlZm9yZSB0aGlzIHJlc291cmNlIG1ldGhvZCBpcyBldmVuIGNhbGxlZC4KKyAgICAgICAgICogSG93ZXZlciwgaXQgaXMgbmVlZGVkIGhlcmUsIGJlY2F1c2UgdGhlIGZpbHRlciBpcyBib3VuZCB0byB0aGUgcmVzb3VyY2UgbWV0aG9kIG5hbWUuCisgICAgICAgICAqLworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJsb2NhdGlvbkFib3J0ZWQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGxvY2F0aW9uVGVzdEFib3J0ZWQoKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJUaGUgcmVzb3VyY2UgbWV0aG9kIGxvY2F0aW9uVGVzdEFib3J0ZWQoKSBzaG91bGQgbm90IGhhdmUgYmVlbiBjYWxsZWQuIFRoZSBwb3N0LW1hdGNoaW5nIGZpbHRlciB3YXMgIgorICAgICAgICAgICAgICAgICAgICArICJub3QgY29uZmlndXJlZCBjb3JyZWN0bHkuICIsIGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybiAiRFVNTVlfUkVTUE9OU0UiOyAvLyB0aGlzIHN0cmluZyBzaG91bGQgbmV2ZXIgcmVhY2ggdGhlIGNsaWVudCAodGhlIHJlc291cmNlIG1ldGhvZCB3aWxsIG5vdCBiZSBjYWxsZWQpCisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVzb3VyY2UgbWV0aG9kIGZvciB0ZXN0aW5nIFVSSSBhYnNvbHV0aXphdGlvbiBhZnRlciB0aGUgYWJvcnRpb24gaW4gdGhlIHByZS1tYXRjaGluZyBmaWx0ZXIuCisgICAgICAgICAqIEByZXR1cm4gZHVtbXkgcmVzcG9uc2UgLSB0aGlzIHN0cmluZyBzaG91bGQgbmV2ZXIgYmUgcHJvcGFnYXRlZCB0byB0aGUgY2xpZW50ICh0aGUgcHJvY2Vzc2luZyBjaGFpbiB3aWxsIGJlCisgICAgICAgICAqIGV4ZWN1dG9yQ29tcGFyaXNvbkZhaWxlZCBpbiB0aGUgZmlsdGVyIGJlZm9yZSB0aGlzIHJlc291cmNlIG1ldGhvZCBpcyBldmVuIGNhbGxlZC4KKyAgICAgICAgICogSG93ZXZlciwgaXQgaXMgbmVlZGVkIGhlcmUsIGJlY2F1c2UgdGhlIGZpbHRlciBpcyBib3VuZCB0byB0aGUgcmVzb3VyY2UgbWV0aG9kIG5hbWUuCisgICAgICAgICAqLworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJsb2NhdGlvbkFib3J0ZWRQcmVNYXRjaGluZyIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgbG9jYXRpb25UZXN0UHJlTWF0Y2hpbmdBYm9ydGVkKCkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHJlc291cmNlIG1ldGhvZCBsb2NhdGlvblRlc3RQcmVNYXRjaGluZ0Fib3J0ZWQoKSBzaG91bGQgbm90IGhhdmUgYmVlbiBjYWxsZWQuIFRoZSBwcmUtbWF0Y2hpbmcgIgorICAgICAgICAgICAgICAgICAgICArICJmaWx0ZXIgd2FzIG5vdCBjb25maWd1cmVkIGNvcnJlY3RseS4gIiwgZmFsc2UpOworICAgICAgICAgICAgcmV0dXJuICJEVU1NWV9SRVNQT05TRSI7IC8vIHRoaXMgc3RyaW5nIHNob3VsZCBuZXZlciByZWFjaCB0aGUgY2xpZW50ICh0aGUgcmVzb3VyY2UgbWV0aG9kIHdpbGwgbm90IGJlIGNhbGxlZCkKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXNvdXJjZSBtZXRob2QgZm9yIHRoZSB0ZXN0IG9mIFJlc3BvbnNlRmlsdGVycyBpbiB0aGUgc3luYyBjYXNlLgorICAgICAgICAgKiBSZXR1cm5zIHJlc3BvbnNlIHdpdGggYSByZWxhdGl2ZSBVUkksIHdoaWNoIGlzIHRoYW4gYWJzb2x1dGl6ZWQgYnkgSmVyc2V5LgorICAgICAgICAgKiBMYXRlciB0aGUge0BsaW5rIFVyaUNoZWNraW5nUmVzcG9uc2VGaWx0ZXJ9IGlzIHRyaWdnZXJlZCBhbmQgY2hlY2tzIHRoZSBVUkkgYWdhaW4gLSB0aGUgY2hlY2sgaXRzZWxmIGlzIGRvbmUgaW4gdGhlCisgICAgICAgICAqIGZpbHRlci4KKyAgICAgICAgICogQmFzZWQgb24gdGhlIHJlc3VsdCBvZiB0aGUgY2hlY2ssIHRoZSBmaWx0ZXIgcmV0dXJucyB0aGUgb3JpZ2luYWwgc3RhdHVzICgyMDEgLSBDcmVhdGVkKSBvciBhbgorICAgICAgICAgKiBlcnJvciBzdGF0dXMgKDUwMCAtIEludGVybmFsIFNlcnZlciBFcnJvcikgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGluIHRoZSByZXNwb25zZSBib2R5LgorICAgICAgICAgKi8KKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgicmVzcG9uc2VGaWx0ZXJTeW5jIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHJlc3BvbnNlRmlsdGVyU3luYygpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5jcmVhdGVkKFVSSS5jcmVhdGUoInJlc3BvbnNlRmlsdGVyU3luYyIpKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlc291cmNlIG1ldGhvZCBmb3IgdGhlIHRlc3Qgb2YgUmVzcG9uc2VGaWx0ZXJzIGluIHRoZSBhc3luYyBjYXNlLiBJdCBydW5zIGluIHRoZSBzZXBhcmF0ZSB0aHJlYWQgY3JlYXRlZCBvbiByZXF1ZXN0LgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIHJlc3BvbnNlIHdpdGggYSByZWxhdGl2ZSBVUkksIHdoaWNoIGlzIHRoYW4gYWJzb2x1dGl6ZWQgYnkgSmVyc2V5LgorICAgICAgICAgKiBMYXRlciB0aGUge0BsaW5rIFVyaUNoZWNraW5nUmVzcG9uc2VGaWx0ZXJ9IGlzIHRyaWdnZXJlZCBhbmQgY2hlY2tzIHRoZSBVUkkgYWdhaW4gLSB0aGUgY2hlY2sgaXRzZWxmIGlzIGRvbmUgaW4gdGhlCisgICAgICAgICAqIGZpbHRlci4KKyAgICAgICAgICogQmFzZWQgb24gdGhlIHJlc3VsdCBvZiB0aGUgY2hlY2ssIHRoZSBmaWx0ZXIgcmV0dXJucyB0aGUgb3JpZ2luYWwgc3RhdHVzICgyMDEgLSBDcmVhdGVkKSBvciBhbgorICAgICAgICAgKiBlcnJvciBzdGF0dXMgKDUwMCAtIEludGVybmFsIFNlcnZlciBFcnJvcikgd2l0aCBhbiBlcnJvciBtZXNzYWdlIGluIHRoZSByZXNwb25zZSBib2R5LgorICAgICAgICAgKi8KKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgicmVzcG9uc2VGaWx0ZXJBc3luYyIpCisgICAgICAgIHB1YmxpYyB2b2lkIHJlc3BvbnNlRmlsdGVyQXN5bmMoQFN1c3BlbmRlZCBmaW5hbCBBc3luY1Jlc3BvbnNlIGFzeW5jUmVzcG9uc2UpIHsKKyAgICAgICAgICAgIG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzdWx0ID0gUmVzcG9uc2UuY3JlYXRlZChVUkkuY3JlYXRlKCJyZXNwb25zZUZpbHRlckFzeW5jIikpLmJ1aWxkKCk7CisgICAgICAgICAgICAgICAgICAgIGFzeW5jUmVzcG9uc2UucmVzdW1lKHJlc3VsdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkuc3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXNvdXJjZSBtZXRob2QgZm9yIHRoZSB0ZXN0IG9mIFJlc3BvbnNlRmlsdGVycyBpbiB0aGUgYXN5bmMvZXhlY3V0b3IgY2FzZS4gSXQgcnVucyBpbiBhIHRocmVhZCBjcmVhdGVkIG91dCBvZiB0aGUKKyAgICAgICAgICogcmVxdWVzdCBzY29wZS4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyByZXNwb25zZSB3aXRoIGEgcmVsYXRpdmUgVVJJLCB3aGljaCBpcyB0aGFuIGFic29sdXRpemVkIGJ5IEplcnNleS4KKyAgICAgICAgICogTGF0ZXIgdGhlIHtAbGluayBVcmlDaGVja2luZ1Jlc3BvbnNlRmlsdGVyfSBpcyB0cmlnZ2VyZWQgYW5kIGNoZWNrcyB0aGUgVVJJIGFnYWluIC0gdGhlIGNoZWNrIGl0c2VsZiBpcyBkb25lIGluIHRoZQorICAgICAgICAgKiBmaWx0ZXIuCisgICAgICAgICAqIEJhc2VkIG9uIHRoZSByZXN1bHQgb2YgdGhlIGNoZWNrLCB0aGUgZmlsdGVyIHJldHVybnMgdGhlIG9yaWdpbmFsIHN0YXR1cyAoMjAxIC0gQ3JlYXRlZCkgb3IgYW4KKyAgICAgICAgICogZXJyb3Igc3RhdHVzICg1MDAgLSBJbnRlcm5hbCBTZXJ2ZXIgRXJyb3IpIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpbiB0aGUgcmVzcG9uc2UgYm9keS4KKyAgICAgICAgICovCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInJlc3BvbnNlRmlsdGVyQXN5bmNFeGVjdXRvciIpCisgICAgICAgIHB1YmxpYyB2b2lkIHJlc3BvbnNlRmlsdGVyQXN5bmNFeGVjdXRvcihAU3VzcGVuZGVkIGZpbmFsIEFzeW5jUmVzcG9uc2UgYXN5bmNSZXNwb25zZSkgeworICAgICAgICAgICAgZXhlY3V0b3Iuc3VibWl0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3VsdCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2UuY3JlYXRlZChVUkkuY3JlYXRlKCJyZXNwb25zZUZpbHRlckFzeW5jRXhlY3V0b3IiKSkuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICAgICAgYXN5bmNSZXNwb25zZS5yZXN1bWUocmVzdWx0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXNvdXJjZSBtZXRob2QgZm9yIHRlc3RpbmcgZm9yIHRlc3RpbmcgdGhlIFVSSSBhYnNvbHV0aXphdGlvbiBpbiB0aGUgZXhjZXB0aW9uIG1hcHBlciBpbiB0aGUgc3luY2hyb25vdXMgY2FzZS4KKyAgICAgICAgICoKKyAgICAgICAgICogTWV0aG9kIGFsd2F5cyB0aHJvd3Mge0BsaW5rIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9ufSwgd2hpY2ggaXMgZGVmaW5lZCB0byBiZSBoYW5kbGVkIGJ5IHtAbGluayBUZXN0RXhjZXB0aW9uTWFwcGVyfS4KKyAgICAgICAgICogVGhlIGV4Y2VwdGlvbiBtYXBwZXIgdGhlbiBjcmVhdGVzIHRoZSByZXNwb25zZSB3aXRoIHJlbGF0aXZlIFVSSSBhbmQgcmVzcG9uc2UgaXMgcm91dGVkCisgICAgICAgICAqIGludG8ge0BsaW5rIFVyaUNoZWNraW5nUmVzcG9uc2VGaWx0ZXJ9LCB3aGljaCBjaGVja3MgaWYgdGggVVJJIHdhcyBjb3JyZWN0bHkgYWJzb2x1dGl6ZWQuCisgICAgICAgICAqIEByZXR1cm4gZG9lcyBub3QgcmV0dXJuIGFueSByZXNwb25zZQorICAgICAgICAgKi8KKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiZXhjZXB0aW9uTWFwcGVyU3luYyIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBleGNlcHRpb25NYXBwZXJTeW5jKCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVzb3VyY2UgbWV0aG9kIGZvciB0ZXN0aW5nIGZvciB0ZXN0aW5nIHRoZSBVUkkgYWJzb2x1dGl6YXRpb24gaW4gdGhlIGV4Y2VwdGlvbiBtYXBwZXIgaW4gdGhlIGFzeW5jaHJvbm91cyBjYXNlLgorICAgICAgICAgKiBOZXcgdGhyZWFkIGlzIHN0YXJ0ZWQgZm9yIHRoZSByZXNvdXJjZSBtZXRob2QgcHJvY2Vzc2luZy4KKyAgICAgICAgICoKKyAgICAgICAgICogTWV0aG9kIGFsd2F5cyAidGhyb3dzIiB7QGxpbmsgV2ViQXBwbGljYXRpb25FeGNlcHRpb259IChpbiBjYXNlIG9mIGFzeW5jIG1ldGhvZHMsCisgICAgICAgICAqIHRoZSBleGNlcHRpb25zIGFyZSBub3QgdGhyb3duIGRpcmVjdGx5LCBidXQgcGFzc2VkIHRvIHtAbGluayBBc3luY1Jlc3BvbnNlI3Jlc3VtZShUaHJvd2FibGUpfSksCisgICAgICAgICAqIHdoaWNoIGlzIGRlZmluZWQgdG8gYmUgaGFuZGxlZCBieSB7QGxpbmsgVGVzdEV4Y2VwdGlvbk1hcHBlcn0uICAgICAgICAgKgorICAgICAgICAgKiBUaGUgZXhjZXB0aW9uIG1hcHBlciB0aGVuIGNyZWF0ZXMgdGhlIHJlc3BvbnNlIHdpdGggcmVsYXRpdmUgVVJJIGFuZCByZXNwb25zZSBpcyByb3V0ZWQKKyAgICAgICAgICogaW50byB7QGxpbmsgVXJpQ2hlY2tpbmdSZXNwb25zZUZpbHRlcn0sIHdoaWNoIGNoZWNrcyBpZiB0aCBVUkkgd2FzIGNvcnJlY3RseSBhYnNvbHV0aXplZC4KKyAgICAgICAgICovCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImV4Y2VwdGlvbk1hcHBlckFzeW5jIikKKyAgICAgICAgcHVibGljIHZvaWQgZXhjZXB0aW9uTWFwcGVyQXN5bmMoQFN1c3BlbmRlZCBmaW5hbCBBc3luY1Jlc3BvbnNlIGFzeW5jUmVzcG9uc2UpIHsKKyAgICAgICAgICAgIG5ldyBUaHJlYWQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgYXN5bmNSZXNwb25zZS5yZXN1bWUobmV3IFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pLnN0YXJ0KCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVzb3VyY2UgbWV0aG9kIGZvciB0ZXN0aW5nIGZvciB0ZXN0aW5nIHRoZSBVUkkgYWJzb2x1dGl6YXRpb24gaW4gdGhlIGV4Y2VwdGlvbiBtYXBwZXIgaW4gdGhlIGFzeW5jaHJvbm91cyBjYXNlLgorICAgICAgICAgKiBBIHRocmVhZCBmcm9tIGV4ZWN1dG9yIHRocmVhZCBwb29sIChjcmVhdGVkIG91dCBvZiByZXF1ZXN0IHNjb3BlKSBpcyB1c2VkIGZvciBwcm9jZXNzaW5nIHRoZSByZXNvdXJjZSBtZXRob2QuCisgICAgICAgICAqCisgICAgICAgICAqIE1ldGhvZCBhbHdheXMgInRocm93cyIge0BsaW5rIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9ufSAoaW4gY2FzZSBvZiBhc3luYyBtZXRob2RzLAorICAgICAgICAgKiB0aGUgZXhjZXB0aW9ucyBhcmUgbm90IHRocm93biBkaXJlY3RseSwgYnV0IHBhc3NlZCB0byB7QGxpbmsgQXN5bmNSZXNwb25zZSNyZXN1bWUoVGhyb3dhYmxlKX0pLAorICAgICAgICAgKiB3aGljaCBpcyBkZWZpbmVkIHRvIGJlIGhhbmRsZWQgYnkge0BsaW5rIFRlc3RFeGNlcHRpb25NYXBwZXJ9LiAgICAgICAgICoKKyAgICAgICAgICogVGhlIGV4Y2VwdGlvbiBtYXBwZXIgdGhlbiBjcmVhdGVzIHRoZSByZXNwb25zZSB3aXRoIHJlbGF0aXZlIFVSSSBhbmQgcmVzcG9uc2UgaXMgcm91dGVkCisgICAgICAgICAqIGludG8ge0BsaW5rIFVyaUNoZWNraW5nUmVzcG9uc2VGaWx0ZXJ9LCB3aGljaCBjaGVja3MgaWYgdGggVVJJIHdhcyBjb3JyZWN0bHkgYWJzb2x1dGl6ZWQuCisgICAgICAgICAqLworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJleGNlcHRpb25NYXBwZXJFeGVjdXRvciIpCisgICAgICAgIHB1YmxpYyB2b2lkIGV4Y2VwdGlvbk1hcHBlckV4ZWN1dG9yKEBTdXNwZW5kZWQgZmluYWwgQXN5bmNSZXNwb25zZSBhc3luY1Jlc3BvbnNlKSB7CisgICAgICAgICAgICBleGVjdXRvci5zdWJtaXQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgYXN5bmNSZXNwb25zZS5yZXN1bWUobmV3IFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlc291cmNlIG1ldGhvZCBmb3IgdGVzdGluZyBjb3JyZWN0IGJhc2VVcmkgYW5kIHJlcXVlc3Qgb3ZlcndyaXRlIGluIHRoZSBwcmVtYXRjaGluZyBmaWx0ZXIuCisgICAgICAgICAqIFNob3VsZCBuZXZlciBiZSBjYWxsZWQgYnkgdGhlIHRlc3QsIGFzIHtAbGluayBNeVRlc3QjcmVkaXJlY3RlZFVyaSgpfSBzaG91bGQgYmUgY2FsbGVkIGluc3RlYWQuCisgICAgICAgICAqLworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJmaWx0ZXJDaGFuZ2VkQmFzZVVyaSIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBsb2NhdGlvbldpdGhDaGFuZ2VkQmFzZVVyaSgpIHsKKyAgICAgICAgICAgIGZhaWwoIk1ldGhvZCBzaG91bGQgbm90IGV4cGVjdGVkIHRvIGJlIGNhbGxlZCwgYXMgcHJlbWF0Y2hpbmcgZmlsdGVyIHNob3VsZCBoYXZlIGNoYW5nZWQgdGhlIHJlcXVlc3QgdXJpLiIpOworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLmNyZWF0ZWQoVVJJLmNyZWF0ZSgibmV3IikpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogTm90IGNhbGxlZCBieSB0aGUgdGVzdCBkaXJlY3RseSwgYnV0IGFmdGVyIHByZW1hdGNoaW5nIGZpbHRlciByZWRpcmVjdCBmcm9tCisgICAgICAgICAqIHtAbGluayBNeVRlc3QjbG9jYXRpb25XaXRoQ2hhbmdlZEJhc2VVcmkoKX0uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4ge0Bjb2RlIDIwMSBDcmVhdGVkfSByZXNwb25zZSB3aXRoIGxvY2F0aW9uIHJlc29sdmVkIGFnYWluc3QgbmV3IGJhc2VVcmkuCisgICAgICAgICAqLworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJuZXdVcmkiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgcmVkaXJlY3RlZFVyaSgpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5jcmVhdGVkKFVSSS5jcmVhdGUoIm5ld1JlZGlyZWN0ZWQiKSkuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoZSBVUkkgY3JlYXRlZCBpbiB0aGUgcG9zdC1tYXRjaGluZyByZXF1ZXN0IGZpbHRlci4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBYm9ydEZpbHRlcigpIHsKKyAgICAgICAgY2hlY2tSZXNwb25zZUZpbHRlcigiUmVzcG9uc2VUZXN0L2xvY2F0aW9uQWJvcnRlZCIsICJ1cmlBZnRlckFib3J0aW9uL1NVQ0NFU1MiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoZSBVUkkgY3JlYXRlZCBpbiB0aGUgcHJlLW1hdGNoaW5nIHJlcXVlc3QgZmlsdGVyLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFib3J0UHJlTWF0Y2hpbmdGaWx0ZXIoKSB7CisgICAgICAgIGNoZWNrUmVzb3VyY2UoIlJlc3BvbnNlVGVzdC9sb2NhdGlvbkFib3J0ZWRQcmVNYXRjaGluZyIsICJ1cmlBZnRlclByZU1hdGNoaW5nQWJvcnRpb24vU1VDQ0VTUyIpOworICAgIH0KKworCisgICAgLyoqCisgICAgICogVGVzdCB3aXRoIFVSSSBSZXdyaXR0ZW4gaW4gdGhlIGNvbnRhaW5lciByZXNwb25zZSBmaWx0ZXI7CisgICAgICogRmlsdGVycyBkbyBoYXZlIGFjY2VzcyB0byB0aGUgcmVzcG9uc2UgaGVhZGVycyBhbmQgY2FuIG1hbmlwdWxhdGUgdGhlIGxvY2F0aW9uIHVyaSBzbyB0aGF0IGl0IGNvbnRhaW5zIGEgcmVsYXRpdmUgYWRkcmVzcy4KKyAgICAgKiBUaGlzIHRlc3QgaW5jb3Jwb3JhdGVzIGEgZmlsdGVyIHdoaWNoIHJlcGxhY2VzIHRoZSB1cmkgd2l0aCBhIHJlbGF0aXZlIG9uZS4gSG93ZXZlciB3ZSBleHBlY3QgdG8gaGF2ZSBhYnNvbHV0ZSB1cmkgYXQKKyAgICAgKiB0aGUgZW5kIG9mIHRoZSBjaGFpbi4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBYnNvbHV0ZVVyaVdpdGhGaWx0ZXIoKSB7CisgICAgICAgIGNoZWNrUmVzb3VyY2UoIlJlc3BvbnNlVGVzdC9sb2NhdGlvblRlc3RXaXRoRmlsdGVyIiwgIlJlc3BvbnNlVGVzdC9VcmlDaGFuZ2VkQnlGaWx0ZXIiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHdpdGggVVJJIFJld3JpdHRlbiBpbiB0aGUgd3JpdGVyIGludGVyY2VwdG9yOworICAgICAqIEludGVyY2VwdG9ycyBkbyBoYXZlIGFjY2VzcyB0byB0aGUgcmVzcG9uc2UgaGVhZGVycyBhbmQgY2FuIG1hbmlwdWxhdGUgdGhlIGxvY2F0aW9uIHVyaSBzbyB0aGF0IGl0IGNvbnRhaW5zIGEgcmVsYXRpdmUKKyAgICAgKiBhZGRyZXNzLgorICAgICAqIFRoaXMgdGVzdCBpbmNvcnBvcmF0ZXMgYW4gaW50ZXJjZXB0b3Igd2hpY2ggcmVwbGFjZXMgdGhlIHVyaSB3aXRoIGEgcmVsYXRpdmUgb25lLiBIb3dldmVyIHdlIGV4cGVjdCB0byBoYXZlIGFic29sdXRlIHVyaQorICAgICAqIGF0IHRoZSBlbmQgb2YgdGhlIGNoYWluLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFic29sdXRlVXJpV2l0aEludGVyY2VwdG9yKCkgeworICAgICAgICBjaGVja1Jlc291cmNlKCJSZXNwb25zZVRlc3QvbG9jYXRpb25XaXRoSW50ZXJjZXB0b3IiLCAiUmVzcG9uc2VUZXN0L1VyaUNoYW5nZWRCeUludGVyY2VwdG9yIik7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBUZXN0LCB0aGF0IHVyaSBpcyBjb3JyZWN0IGluIHRoZSByZXNwb25zZSBmaWx0ZXIgd2hlbiBjcmVhdGVkIGluIHRoZSBleGNlcHRpb24gbWFwcGVyIChzeW5jaHJvbm91cykuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhjZXB0aW9uTWFwcGVyU3luYygpIHsKKyAgICAgICAgY2hlY2tSZXNwb25zZUZpbHRlcigiUmVzcG9uc2VUZXN0L2V4Y2VwdGlvbk1hcHBlclN5bmMiLCAiRVhDRVBUSU9OX01BUFBFUiIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QsIHRoYXQgdXJpIGlzIGNvcnJlY3QgaW4gdGhlIHJlc3BvbnNlIGZpbHRlciB3aGVuIGNyZWF0ZWQgaW4gdGhlIGV4Y2VwdGlvbiBtYXBwZXIgKGFzeW5jaHJvbm91cykuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhjZXB0aW9uTWFwcGVyQXN5bmMoKSB7CisgICAgICAgIGNoZWNrUmVzcG9uc2VGaWx0ZXIoIlJlc3BvbnNlVGVzdC9leGNlcHRpb25NYXBwZXJBc3luYyIsICJFWENFUFRJT05fTUFQUEVSIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCwgdGhhdCB1cmkgaXMgY29ycmVjdCBpbiB0aGUgcmVzcG9uc2UgZmlsdGVyIHdoZW4gY3JlYXRlZCBpbiB0aGUgZXhjZXB0aW9uIG1hcHBlciAoYXN5bmNocm9ub3VzL2V4ZWN1dG9yKS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFeGNlcHRpb25NYXBwZXJFeGVjdXRvcigpIHsKKyAgICAgICAgY2hlY2tSZXNwb25zZUZpbHRlcigiUmVzcG9uc2VUZXN0L2V4Y2VwdGlvbk1hcHBlckV4ZWN1dG9yIiwgIkVYQ0VQVElPTl9NQVBQRVIiKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoZSBiYXNlVXJpIGFuZCByZXF1ZXN0VXJpIGNoYW5nZSBpbiB0aGUgcHJlbWF0Y2hpbmcgZmlsdGVyLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvY2F0aW9uQmFzZVVyaUNoYW5nZWRCeVByZW1hdGNoaW5nRmlsdGVyKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoIlJlc3BvbnNlVGVzdC9maWx0ZXJDaGFuZ2VkQmFzZVVyaSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vd3d3LnNlcnZlci5jb20vbmV3UmVkaXJlY3RlZCIsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiTG9jYXRpb24iKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCwgdGhhdCB1cmkgaXMgY29ycmVjdCBpbiB0aGUgcmVzcG9uc2UgZmlsdGVyIChzeW5jaHJvbm91cykuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzcG9uc2VGaWx0ZXJTeW5jKCkgeworICAgICAgICBjaGVja1Jlc3BvbnNlRmlsdGVyKCJSZXNwb25zZVRlc3QvcmVzcG9uc2VGaWx0ZXJTeW5jIiwgInJlc3BvbnNlRmlsdGVyU3luYyIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QsIHRoYXQgdXJpIGlzIGNvcnJlY3QgaW4gdGhlIHJlc3BvbnNlIGZpbHRlciAoYXN5bmNocm9ub3VzKS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNwb25zZUZpbHRlckFzeW5jKCkgeworICAgICAgICBjaGVja1Jlc3BvbnNlRmlsdGVyKCJSZXNwb25zZVRlc3QvcmVzcG9uc2VGaWx0ZXJBc3luYyIsICJyZXNwb25zZUZpbHRlckFzeW5jIik7CisgICAgfQorCisKKworICAgIC8qKgorICAgICAqIFRlc3QsIHRoYXQgdXJpIGlzIGNvcnJlY3QgaW4gdGhlIHJlc3BvbnNlIGZpbHRlciAoYXN5bmNocm9ub3VzL2V4ZWN1dG9yKS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNwb25zZUZpbHRlckFzeW5jRXhlY3V0b3IoKSB7CisgICAgICAgIGNoZWNrUmVzcG9uc2VGaWx0ZXIoIlJlc3BvbnNlVGVzdC9yZXNwb25zZUZpbHRlckFzeW5jRXhlY3V0b3IiLCAicmVzcG9uc2VGaWx0ZXJBc3luY0V4ZWN1dG9yIik7CisgICAgfQorCisKKworICAgIC8qKgorICAgICAqIFJlc3BvbnNlIGZpbHRlciAtIHJlcGxhY2VzIHRoZSBMb2NhdGlvbiBoZWFkZXIgd2l0aCBhIHJlbGF0aXZlIHVyaS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIExvY2F0aW9uTWFuaXB1bGF0aW9uRmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoZmluYWwgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQpCisgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgPz4gaGVhZGVycyA9IHJlc3BvbnNlQ29udGV4dC5nZXRIZWFkZXJzKCk7CisgICAgICAgICAgICBmaW5hbCBMaXN0PFVSST4gbG9jYXRpb25zID0gKExpc3Q8VVJJPikgaGVhZGVycy5nZXQoSHR0cEhlYWRlcnMuTE9DQVRJT04pOworICAgICAgICAgICAgbG9jYXRpb25zLnNldCgwLCBVUkkuY3JlYXRlKCJSZXNwb25zZVRlc3QvVXJpQ2hhbmdlZEJ5RmlsdGVyIikpOworICAgICAgICAgICAgTE9HR0VSLmluZm8oIkxvY2F0aW9uTWFuaXB1bGF0aW9uRmlsdGVyIGFwcGxpZWQuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNwb25zZSBmaWx0ZXIgLSBjaGVjayBpZiB0aGUgVVJJIGlzIGFic29sdXRlLiBJZiBpdCBpcyBub3QgY29ycmVjdGx5IGFic29sdXRpemVkLAorICAgICAqIGl0IGNoYW5nZXMgdGhlIHJlc3BvbnNlIHRvIDUwMCAtIEludGVybmFsIFNlcnZlciBFcnJvciBhbmQgc2V0cyB0aGUgZXJyb3IgbWVzc2FnZSBpbnRvIHRoZSByZXNwb25zZSBib2R5LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVXJpQ2hlY2tpbmdSZXNwb25zZUZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKGZpbmFsIENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LCBmaW5hbCBDb250YWluZXJSZXNwb25zZUNvbnRleHQgcmVzcG9uc2VDb250ZXh0KQorICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBVUkkgbG9jYXRpb24gPSByZXNwb25zZUNvbnRleHQuZ2V0TG9jYXRpb24oKTsKKyAgICAgICAgICAgIGlmICghbG9jYXRpb24uaXNBYnNvbHV0ZSgpKSB7CisgICAgICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LnNldFN0YXR1cyhSZXNwb25zZS5TdGF0dXMuSU5URVJOQUxfU0VSVkVSX0VSUk9SLmdldFN0YXR1c0NvZGUoKSk7CisgICAgICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LnNldEVudGl0eSgiUmVzcG9uc2UgbG9jYXRpb24gd2FzIG5vdCBhYnNvbHV0ZSBpbiBVcmlDaGVja2luZ0ZpbHRlci4gTG9jYXRpb24gdmFsdWU6ICIgKyBsb2NhdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXF1ZXN0IEZpbHRlciB3aGljaCBhYm9ydHMgdGhlIGN1cnJlbnQgcmVxdWVzdCBjYWxsaW5nIENvbnRhaW5lclJlcXVlc3RDb250ZXh0LmFib3J0V2l0aCgpLgorICAgICAqCisgICAgICogVGhlIHJldHVybmVkIHJlc3BvbnNlIGlzIHBhc3NlZCB0byBSZXNwb25zZS5jcmVhdGVkKCkgYW5kIGltbWVkaWF0ZWx5IHRlc3RlZCBmb3IgYWJzb2x1dGl6YXRpb24uCisgICAgICogVGhpcyBpcyBuZWNlc3NhcnksIGFzIHRoZSByZWxhdGl2ZSBVUkkgd291bGQgYmUgYWJzb2x1dGl6ZWQgbGF0ZXIgYW55d2F5IGFuZCB3b3VsZCByZWFjaCB0aGUgY2FsbGluZyB0ZXN0IG1ldGhvZCBhcworICAgICAqIGFuIGFic29sdXRlIFVSSSBhbmQgdGhlcmUgd291bGQgYmUgbm8gd2F5IHRvIGRldGVybWluZSB3aGVyZSB0aGUgVVJJIGNvbnZlcnNpb24gd2FzIGRvbmUuCisgICAgICoKKyAgICAgKiBUaGUgcmVzdWx0IG9mIHRoZSB0ZXN0IGlzIHByb3BhZ2F0ZWQgYmFjayB0byB0aGUgdGVzdCBtZXRob2QgYnkgc2VwYXJhdGUgVVJJIHZhbHVlcyBpbiBjYXNlIG9mIGEgc3VjY2VzcyBvciBhIGZhaWx1cmUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBYm9ydGluZ1JlcXVlc3RGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKGZpbmFsIENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgTE9HR0VSLmluZm8oIkFib3J0aW5nIHJlcXVlc3QgaW4gdGhlIHJlcXVlc3QgZmlsdGVyLiBSZXR1cm5pbmcgc3RhdHVzIGNyZWF0ZWQuIik7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc3VjY2Vzc1JlbGF0aXZlVXJpID0gInVyaUFmdGVyQWJvcnRpb24vU1VDQ0VTUyI7CisgICAgICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IFJlc3BvbnNlLmNyZWF0ZWQoVVJJLmNyZWF0ZShzdWNjZXNzUmVsYXRpdmVVcmkpKS5idWlsZCgpOworCisgICAgICAgICAgICBpZiAoIXJlc3BvbnNlLmdldExvY2F0aW9uKCkudG9TdHJpbmcoKS5lcXVhbHMocmVxdWVzdENvbnRleHQuZ2V0VXJpSW5mbygpLmdldEJhc2VVcmkoKSArIHN1Y2Nlc3NSZWxhdGl2ZVVyaSkpIHsKKyAgICAgICAgICAgICAgICByZXNwb25zZSA9IFJlc3BvbnNlLmNyZWF0ZWQoVVJJLmNyZWF0ZSgidXJpQWZ0ZXJBYm9ydGlvbi9GQUlMVVJFIikpLmJ1aWxkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5hYm9ydFdpdGgocmVzcG9uc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVxdWVzdCBGaWx0ZXIgd2hpY2ggYWJvcnRzIHRoZSBjdXJyZW50IHJlcXVlc3QgY2FsbGluZyBDb250YWluZXJSZXF1ZXN0Q29udGV4dC5hYm9ydFdpdGgoKS4KKyAgICAgKgorICAgICAqIFRoZSByZXR1cm5lZCByZXNwb25zZSBpcyBwYXNzZWQgdG8gUmVzcG9uc2UuY3JlYXRlZCgpIGFuZCBpbW1lZGlhdGVseSB0ZXN0ZWQgZm9yIGFic29sdXRpemF0aW9uLgorICAgICAqIFRoaXMgaXMgbmVjZXNzYXJ5LCBhcyB0aGUgcmVsYXRpdmUgVVJJIHdvdWxkIGJlIGFic29sdXRpemVkIGxhdGVyIGFueXdheSBhbmQgd291bGQgcmVhY2ggdGhlIGNhbGxpbmcgdGVzdCBtZXRob2QgYXMKKyAgICAgKiBhbiBhYnNvbHV0ZSBVUkkgYW5kIHRoZXJlIHdvdWxkIGJlIG5vIHdheSB0byBkZXRlcm1pbmUgd2hlcmUgdGhlIFVSSSBjb252ZXJzaW9uIHdhcyBkb25lLgorICAgICAqCisgICAgICogVGhlIHJlc3VsdCBvZiB0aGUgdGVzdCBpcyBwcm9wYWdhdGVkIGJhY2sgdG8gdGhlIHRlc3QgbWV0aG9kIGJ5IHNlcGFyYXRlIFVSSSB2YWx1ZXMgaW4gY2FzZSBvZiBhIHN1Y2Nlc3Mgb3IgYSBmYWlsdXJlLgorICAgICAqLworICAgIEBQcmVNYXRjaGluZworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQWJvcnRpbmdQcmVNYXRjaGluZ1JlcXVlc3RGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKGZpbmFsIENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgICAgICBpZiAocmVxdWVzdENvbnRleHQuZ2V0VXJpSW5mbygpLmdldEFic29sdXRlUGF0aCgpLnRvU3RyaW5nKCkuZW5kc1dpdGgoImxvY2F0aW9uQWJvcnRlZFByZU1hdGNoaW5nIikpIHsKKyAgICAgICAgICAgICAgICBMT0dHRVIuaW5mbygiQWJvcnRpbmcgcmVxdWVzdCBpbiB0aGUgcmVxdWVzdCBmaWx0ZXIuIFJldHVybmluZyBzdGF0dXMgY3JlYXRlZC4iKTsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgc3VjY2Vzc1JlbGF0aXZlVXJpID0gInVyaUFmdGVyUHJlTWF0Y2hpbmdBYm9ydGlvbi9TVUNDRVNTIjsKKyAgICAgICAgICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IFJlc3BvbnNlLmNyZWF0ZWQoVVJJLmNyZWF0ZShzdWNjZXNzUmVsYXRpdmVVcmkpKS5idWlsZCgpOworICAgICAgICAgICAgICAgIGlmICghcmVzcG9uc2UuZ2V0TG9jYXRpb24oKS50b1N0cmluZygpLmVxdWFscyhyZXF1ZXN0Q29udGV4dC5nZXRVcmlJbmZvKCkuZ2V0QmFzZVVyaSgpICsgc3VjY2Vzc1JlbGF0aXZlVXJpKSkgeworICAgICAgICAgICAgICAgICAgICByZXNwb25zZSA9IFJlc3BvbnNlLmNyZWF0ZWQoVVJJLmNyZWF0ZSgidXJpQWZ0ZXJQcmVNYXRjaGluZ0Fib3J0aW9uL0ZBSUxVUkUiKSkuYnVpbGQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuYWJvcnRXaXRoKHJlc3BvbnNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcXVlc3QgcHJlbWF0Y2hpbmcgZmlsdGVyIHdoaWNoIGNoYW5nZXMgcmVxdWVzdCBVUkkgYW5kIGJhc2UgVVJJLgorICAgICAqCisgICAgICogQXMgYSByZXN1bHQsIGRpZmZlcmVudCByZXNvdXJjZSBtYXRob2Qgc2hvdWxkIGJlIG1hdGNoZWQgYW5kIGludm9rZWQgYW5kIHJldHVybiBsb2NhdGlvbiByZXNvbHZlZCBhZ2FpbnN0IHRoZSBuZXcKKyAgICAgKiBiYXNlIFVSSS4KKyAgICAgKi8KKyAgICBAUHJlTWF0Y2hpbmcKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJhc2VVcmlDaGFuZ2luZ1ByZU1hdGNoaW5nRmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihmaW5hbCBDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGlmIChyZXF1ZXN0Q29udGV4dC5nZXRVcmlJbmZvKCkuZ2V0QWJzb2x1dGVQYXRoKCkudG9TdHJpbmcoKS5lbmRzV2l0aCgiZmlsdGVyQ2hhbmdlZEJhc2VVcmkiKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFVSSSByZXF1ZXN0VXJpID0gcmVxdWVzdENvbnRleHQuZ2V0VXJpSW5mbygpLmdldFJlcXVlc3RVcmkoKTsKKyAgICAgICAgICAgICAgICAvLyBOT1RFLCB0aGF0IHRoZSB0cmFpbGluZyBzbGFzaCBtYXR0ZXJzLCB3aXRob3V0IGl0LCB0aGUgVVJJIGlzIG5vZCB2YWxpZCBhbmQgaXMgbm90IGNvcnJlY3RseSByZXNvbHZlZCBieSB0aGUKKyAgICAgICAgICAgICAgICAvLyBVUkkucmVzb2x2ZSgpIG1ldGhvZC4KKyAgICAgICAgICAgICAgICBmaW5hbCBVUkkgYmFzZVVyaSA9IFVSSS5jcmVhdGUoImh0dHA6Ly93d3cuc2VydmVyLmNvbS8iKTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5zZXRSZXF1ZXN0VXJpKGJhc2VVcmksIHJlcXVlc3RVcmkucmVzb2x2ZSgibmV3VXJpIikpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGVyIGludGVyY2VwdG9yIC0gcmVwbGFjZXMgdGhlIExvY2F0aW9uIGhlYWRlciB3aXRoIGEgcmVsYXRpdmUgdXJpLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTG9jYXRpb25NYW5pcHVsYXRpb25JbnRlcmNlcHRvciBpbXBsZW1lbnRzIFdyaXRlckludGVyY2VwdG9yIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYXJvdW5kV3JpdGVUbyhmaW5hbCBXcml0ZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsID8+IGhlYWRlcnMgPSBjb250ZXh0LmdldEhlYWRlcnMoKTsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8VVJJPiBsb2NhdGlvbnMgPSAoTGlzdDxVUkk+KSBoZWFkZXJzLmdldChIdHRwSGVhZGVycy5MT0NBVElPTik7CisgICAgICAgICAgICBsb2NhdGlvbnMuc2V0KDAsIFVSSS5jcmVhdGUoIlJlc3BvbnNlVGVzdC9VcmlDaGFuZ2VkQnlJbnRlcmNlcHRvciIpKTsKKyAgICAgICAgICAgIExPR0dFUi5pbmZvKCJMb2NhdGlvbk1hbmlwdWxhdGlvbkludGVyY2VwdG9yIGFwcGxpZWQuIik7CisgICAgICAgICAgICBjb250ZXh0LnByb2NlZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEV4Y2VwdGlvbiBtYXBwZXIgd2hpY2ggY3JlYXRlcyBhIHRlc3QgcmVzcG9uc2Ugd2l0aCBhIHJlbGF0aXZlIFVSSS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RFeGNlcHRpb25NYXBwZXIgaW1wbGVtZW50cyBFeGNlcHRpb25NYXBwZXI8V2ViQXBwbGljYXRpb25FeGNlcHRpb24+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHRvUmVzcG9uc2UoZmluYWwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgICAgICBleGNlcHRpb24ucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2UuY3JlYXRlZChVUkkuY3JlYXRlKCJFWENFUFRJT05fTUFQUEVSIikpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgdGhlIGZpbHRlciBhbmQgaW50ZXJjZXB0b3IgYW5kIGJpbmRzIGl0IHRvIHRoZSByZXNvdXJjZSBtZXRob2RzIG9mIGludGVyZXN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTG9jYXRpb25NYW5pcHVsYXRpb25EeW5hbWljQmluZGluZyBpbXBsZW1lbnRzIER5bmFtaWNGZWF0dXJlIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY29uZmlndXJlKGZpbmFsIFJlc291cmNlSW5mbyByZXNvdXJjZUluZm8sIGZpbmFsIEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIGlmIChNeVRlc3QuY2xhc3MuZXF1YWxzKHJlc291cmNlSW5mby5nZXRSZXNvdXJjZUNsYXNzKCkpKSB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1ldGhvZE5hbWUgPSByZXNvdXJjZUluZm8uZ2V0UmVzb3VyY2VNZXRob2QoKS5nZXROYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKG1ldGhvZE5hbWUuY29udGFpbnMoImxvY2F0aW9uVGVzdFdpdGhGaWx0ZXIiKSkgeworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKExvY2F0aW9uTWFuaXB1bGF0aW9uRmlsdGVyLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmluZm8oIkxvY2F0aW9uTWFuaXB1bGF0aW9uRmlsdGVyIHJlZ2lzdGVyZWQuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtZXRob2ROYW1lLmNvbnRhaW5zKCJsb2NhdGlvblRlc3RXaXRoSW50ZXJjZXB0b3IiKSkgeworICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKExvY2F0aW9uTWFuaXB1bGF0aW9uSW50ZXJjZXB0b3IuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICBMT0dHRVIuaW5mbygiTG9jYXRpb25NYW5pcHVsYXRpb25JbnRlcmNlcHRvciByZWdpc3RlcmVkLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobWV0aG9kTmFtZS5jb250YWlucygibG9jYXRpb25UZXN0QWJvcnRlZCIpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoQWJvcnRpbmdSZXF1ZXN0RmlsdGVyLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmluZm8oIkFib3J0aW5nUmVxdWVzdEZpbHRlciByZWdpc3RlcmVkLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobWV0aG9kTmFtZS5jb250YWlucygicmVzcG9uc2VGaWx0ZXJTeW5jIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1ldGhvZE5hbWUuY29udGFpbnMoInJlc3BvbnNlRmlsdGVyQXN5bmMiKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgbWV0aG9kTmFtZS5jb250YWlucygibG9jYXRpb25UZXN0QWJvcnRlZCIpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBtZXRob2ROYW1lLmNvbnRhaW5zKCJleGNlcHRpb25NYXBwZXJTeW5jIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1ldGhvZE5hbWUuY29udGFpbnMoImV4Y2VwdGlvbk1hcHBlckFzeW5jIikKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1ldGhvZE5hbWUuY29udGFpbnMoImV4Y2VwdGlvbk1hcHBlckV4ZWN1dG9yIikpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihVcmlDaGVja2luZ1Jlc3BvbnNlRmlsdGVyLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmluZm8oIlVyaUNoZWNraW5nUmVzcG9uc2VGaWx0ZXIgcmVnaXN0ZXJlZC4iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1ldGhvZE5hbWUuY29udGFpbnMoImxvY2F0aW9uV2l0aENoYW5nZWRCYXNlVXJpIikpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihCYXNlVXJpQ2hhbmdpbmdQcmVNYXRjaGluZ0ZpbHRlci5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgIExPR0dFUi5pbmZvKCJCYXNlVXJpQ2hhbmdpbmdQcmVNYXRjaGluZ0ZpbHRlciByZWdpc3RlcmVkLiIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgUmVzcG9uc2UgY2hlY2tSZXNvdXJjZShmaW5hbCBTdHJpbmcgcmVzb3VyY2VQYXRoLCBmaW5hbCBTdHJpbmcgZXhwZWN0ZWRSZWxhdGl2ZVVyaSkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgocmVzb3VyY2VQYXRoKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOKS5nZXQoUmVzcG9uc2UuY2xhc3MpOworICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYXRpb24gPSByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoSHR0cEhlYWRlcnMuTE9DQVRJT04pOworICAgICAgICBMT0dHRVIuaW5mbygiTG9jYXRpb24gcmVzb2x2ZWQgZnJvbSByZXNwb25zZSA+ICIgKyBsb2NhdGlvbik7CisgICAgICAgIGFzc2VydEVxdWFscyhnZXRCYXNlVXJpKCkgKyBleHBlY3RlZFJlbGF0aXZlVXJpLCBsb2NhdGlvbik7CisgICAgICAgIHJldHVybiByZXNwb25zZTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgY2hlY2tSZXNwb25zZUZpbHRlcihmaW5hbCBTdHJpbmcgcmVzb3VyY2VQYXRoLCBmaW5hbCBTdHJpbmcgZXhwZWN0ZWRSZWxhdGl2ZVVyaSkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgocmVzb3VyY2VQYXRoKS5yZXF1ZXN0KCkuZ2V0KFJlc3BvbnNlLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0Tm90RXF1YWxzKCJNZXNzYWdlIGZyb20gcmVzcG9uc2UgZmlsdGVyOiAiICsgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLAorICAgICAgICAgICAgICAgIHJlc3BvbnNlLmdldFN0YXR1cygpLCBSZXNwb25zZS5TdGF0dXMuSU5URVJOQUxfU0VSVkVSX0VSUk9SLmdldFN0YXR1c0NvZGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhnZXRCYXNlVXJpKCkgKyBleHBlY3RlZFJlbGF0aXZlVXJpLCByZXNwb25zZS5nZXRMb2NhdGlvbigpLnRvU3RyaW5nKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9Mb2NhdGlvbkhlYWRlcldpdGhBYnNvbHV0aXphdGlvbkRpc2FibGVkVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL0xvY2F0aW9uSGVhZGVyV2l0aEFic29sdXRpemF0aW9uRGlzYWJsZWRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZkODA5YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9Mb2NhdGlvbkhlYWRlcldpdGhBYnNvbHV0aXphdGlvbkRpc2FibGVkVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmFwaTsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworCisvKioKKyAqIFRlc3QgaWYgdGhlIGxvY2F0aW9uIHJlc3BvbnNlIGhlYWRlciBpcyBsZWZ0IGludGFjdCBpbiBjYXNlIHRoZQorICoge0BsaW5rIFNlcnZlclByb3BlcnRpZXMjTE9DQVRJT05fSEVBREVSX1JFTEFUSVZFX1VSSV9SRVNPTFVUSU9OX0RJU0FCTEVEfSBwcm9wZXJ0eSBpcyBzZXQgdG8ge0Bjb2RlIHRydWV9LgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIExvY2F0aW9uSGVhZGVyV2l0aEFic29sdXRpemF0aW9uRGlzYWJsZWRUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihMb2NhdGlvbkhlYWRlcldpdGhBYnNvbHV0aXphdGlvbkRpc2FibGVkVGVzdC5jbGFzcy5nZXROYW1lKCkpOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmMgPSBuZXcgUmVzb3VyY2VDb25maWcoUmVzcG9uc2VUZXN0LmNsYXNzKTsKKyAgICAgICAgcmMucHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5MT0NBVElPTl9IRUFERVJfUkVMQVRJVkVfVVJJX1JFU09MVVRJT05fRElTQUJMRUQsIEJvb2xlYW4uVFJVRSk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IEpBWC1SUyByZXNvdXJjZQorICAgICAqLworICAgIEBQYXRoKHZhbHVlID0gInRlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzcG9uc2VUZXN0IHsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmVzb3VyY2UgbWV0aG9kIGZvciB0aGUgYmFzaWMgdXJpIHRlc3QKKyAgICAgICAgICogQHJldHVybiB0ZXN0IHJlc3BvbnNlIHdpdGggcmVsYXRpdmUgbG9jYXRpb24gdXJpCisgICAgICAgICAqLworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJsb2NhdGlvbiIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBsb2NhdGlvblRlc3QoKSB7CisgICAgICAgICAgICBmaW5hbCBVUkkgdXJpID0gVVJJLmNyZWF0ZSgibG9jYXRpb24iKTsKKyAgICAgICAgICAgIExPR0dFUi5pbmZvKCJVUkkgQ3JlYXRlZCBpbiB0aGUgcmVzb3VyY2UgbWV0aG9kID4gIiArIHVyaSk7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2UuY3JlYXRlZCh1cmkpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVzb3VyY2UgbWV0aG9kIGZvciB0aGUgdGVzdCB3aXRoIG51bGwgbG9jYXRpb24KKyAgICAgICAgICogQHJldHVybiB0ZXN0IHJlc3BvbnNlIHdpdGggbnVsbCBsb2NhdGlvbiB1cmkKKyAgICAgICAgICovCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImxvY2F0aW9uTnVsbCIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBsb2NhdGlvblRlc3ROdWxsKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLmNyZWF0ZWQobnVsbCkuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXNvdXJjZSBtZXRob2QgZm9yIHRoZSB0ZXN0IHdpdGggbG9jYXRpb24gc3RhcnRpbmcgd2l0aCBzaW5nbGUgc2xhc2gKKyAgICAgICAgICogQHJldHVybiB0ZXN0IHJlc3BvbnNlIHdpdGggcmVsYXRpdmUgbG9jYXRpb24gdXJpIHN0YXJ0aW5nIHdpdGggc2xhc2gKKyAgICAgICAgICovCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImxvY2F0aW9uU2xhc2giKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgbG9jYXRpb25UZXN0U2xhc2goKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2UuY3JlYXRlZChVUkkuY3JlYXRlKCIvbG9jYXRpb24iKSkuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgd2l0aCByZWxhdGl2ZSBsb2NhdGlvbjsKKyAgICAgKiBFbnN1cmVzLCB0aGF0IHRoZSBsb2NhdGlvbiByZW1haW5zIGludGFjdAorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvY2F0aW9uKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInRlc3QvbG9jYXRpb24iKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOKS5nZXQoUmVzcG9uc2UuY2xhc3MpOworICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYXRpb24gPSByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoSHR0cEhlYWRlcnMuTE9DQVRJT04pOworICAgICAgICBMT0dHRVIuaW5mbygiTG9jYXRpb24gcmVzb2x2ZWQgZnJvbSByZXNwb25zZSA+ICIgKyBsb2NhdGlvbik7CisgICAgICAgIGFzc2VydEVxdWFscygibG9jYXRpb24iLCBsb2NhdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB3aXRoIHJlbGF0aXZlIGxvY2F0aW9uIHdpdGggbGVhZGluZyBzbGFzaAorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvY2F0aW9uV2l0aFNsYXNoKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInRlc3QvbG9jYXRpb25TbGFzaCIpLnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfUExBSU4pLmdldChSZXNwb25zZS5jbGFzcyk7CisgICAgICAgIGZpbmFsIFN0cmluZyBsb2NhdGlvbiA9IHJlc3BvbnNlLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5MT0NBVElPTik7CisgICAgICAgIExPR0dFUi5pbmZvKCJMb2NhdGlvbiByZXNvbHZlZCBmcm9tIHJlc3BvbnNlID4gIiArIGxvY2F0aW9uKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIvbG9jYXRpb24iLCBsb2NhdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB3aXRoIHJlbGF0aXZlIGxvY2F0aW9uIHdpdGggbGVhZGluZyBzbGFzaAorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE51bGxMb2NhdGlvbigpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0L2xvY2F0aW9uTnVsbCIpLnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfUExBSU4pLmdldChSZXNwb25zZS5jbGFzcyk7CisgICAgICAgIGZpbmFsIFN0cmluZyBsb2NhdGlvbiA9IHJlc3BvbnNlLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5MT0NBVElPTik7CisgICAgICAgIExPR0dFUi5pbmZvKCJMb2NhdGlvbiByZXNvbHZlZCBmcm9tIHJlc3BvbnNlID4gIiArIGxvY2F0aW9uKTsKKyAgICAgICAgYXNzZXJ0TnVsbChsb2NhdGlvbik7CisgICAgfQorfQorCisKKwpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL0xvY2F0aW9uSGVhZGVyV2l0aEluY29tcGF0aWJsZUZsYWdUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvTG9jYXRpb25IZWFkZXJXaXRoSW5jb21wYXRpYmxlRmxhZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWI2ZTVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL0xvY2F0aW9uSGVhZGVyV2l0aEluY29tcGF0aWJsZUZsYWdUZXN0LmphdmEKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuYXBpOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE51bGw7CisKKy8qKgorICogVGVzdCBpZiB0aGUgbG9jYXRpb24gcmVzcG9uc2UgaGVhZGVyIGlzIHJlc29sdmVkIGFjY29yZGluZyB0byBSRkM3MjMxIChpbiBhIEpBWC1SUyAyLjAgaW5jb21wYXRpYmxlIHdheSkgd2hlbgorICoge0BsaW5rIFNlcnZlclByb3BlcnRpZXMjTE9DQVRJT05fSEVBREVSX1JFTEFUSVZFX1VSSV9SRVNPTFVUSU9OX1JGQzcyMzF9IHByb3BlcnR5IGlzIHNldCB0byB7QGNvZGUgdHJ1ZX0gYW5kCisgKiB7QGxpbmsgU2VydmVyUHJvcGVydGllcyNMT0NBVElPTl9IRUFERVJfUkVMQVRJVkVfVVJJX1JFU09MVVRJT05fRElTQUJMRUR9IHRvIHtAY29kZSBmYWxzZX0KKyAqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBMb2NhdGlvbkhlYWRlcldpdGhJbmNvbXBhdGlibGVGbGFnVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoTG9jYXRpb25IZWFkZXJXaXRoSW5jb21wYXRpYmxlRmxhZ1Rlc3QuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJjID0gbmV3IFJlc291cmNlQ29uZmlnKFJlc3BvbnNlVGVzdC5jbGFzcyk7CisgICAgICAgIHJjLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuTE9DQVRJT05fSEVBREVSX1JFTEFUSVZFX1VSSV9SRVNPTFVUSU9OX1JGQzcyMzEsIEJvb2xlYW4uVFJVRSk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IEpBWC1SUyByZXNvdXJjZQorICAgICAqLworICAgIEBQYXRoKHZhbHVlID0gInRlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzcG9uc2VUZXN0IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlc291cmNlIG1ldGhvZCBmb3IgdGhlIGJhc2ljIHVyaSB0ZXN0CisgICAgICAgICAqIEByZXR1cm4gdGVzdCByZXNwb25zZSB3aXRoIHJlbGF0aXZlIGxvY2F0aW9uIHVyaQorICAgICAgICAgKi8KKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgibG9jYXRpb24iKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgbG9jYXRpb25UZXN0KCkgeworICAgICAgICAgICAgZmluYWwgVVJJIHVyaSA9IFVSSS5jcmVhdGUoImxvY2F0aW9uIik7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2UuY3JlYXRlZCh1cmkpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVzb3VyY2UgbWV0aG9kIGZvciB0aGUgdGVzdCB3aXRoIG51bGwgbG9jYXRpb24KKyAgICAgICAgICogQHJldHVybiB0ZXN0IHJlc3BvbnNlIHdpdGggbnVsbCBsb2NhdGlvbiB1cmkKKyAgICAgICAgICovCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImxvY2F0aW9uTnVsbCIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBsb2NhdGlvblRlc3ROdWxsKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLmNyZWF0ZWQobnVsbCkuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXNvdXJjZSBtZXRob2QgZm9yIHRoZSB0ZXN0IHdpdGggbG9jYXRpb24gc3RhcnRpbmcgd2l0aCBzaW5nbGUgc2xhc2gKKyAgICAgICAgICogQHJldHVybiB0ZXN0IHJlc3BvbnNlIHdpdGggcmVsYXRpdmUgbG9jYXRpb24gdXJpIHN0YXJ0aW5nIHdpdGggc2xhc2gKKyAgICAgICAgICovCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImxvY2F0aW9uU2xhc2giKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgbG9jYXRpb25UZXN0U2xhc2goKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2UuY3JlYXRlZChVUkkuY3JlYXRlKCIvbG9jYXRpb24iKSkuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgd2l0aCByZWxhdGl2ZSBsb2NhdGlvbjsKKyAgICAgKiBFbnN1cmVzLCB0aGF0IHRoZSBsb2NhdGlvbiByZW1haW5zIGludGFjdAorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdExvY2F0aW9uKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInRlc3QvbG9jYXRpb24iKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOKS5nZXQoUmVzcG9uc2UuY2xhc3MpOworICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYXRpb24gPSByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoSHR0cEhlYWRlcnMuTE9DQVRJT04pOworICAgICAgICBMT0dHRVIuaW5mbygiTG9jYXRpb24gcmVzb2x2ZWQgZnJvbSByZXNwb25zZSA+ICIgKyBsb2NhdGlvbik7CisgICAgICAgIGFzc2VydEVxdWFscyhnZXRCYXNlVXJpKCkudG9TdHJpbmcoKSArICJ0ZXN0L2xvY2F0aW9uIiwgbG9jYXRpb24pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3Qgd2l0aCByZWxhdGl2ZSBsb2NhdGlvbiB3aXRoIGxlYWRpbmcgc2xhc2gKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb2NhdGlvbldpdGhTbGFzaCgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0L2xvY2F0aW9uU2xhc2giKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX1BMQUlOKS5nZXQoUmVzcG9uc2UuY2xhc3MpOworICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYXRpb24gPSByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoSHR0cEhlYWRlcnMuTE9DQVRJT04pOworICAgICAgICBMT0dHRVIuaW5mbygiTG9jYXRpb24gcmVzb2x2ZWQgZnJvbSByZXNwb25zZSA+ICIgKyBsb2NhdGlvbik7CisgICAgICAgIGFzc2VydEVxdWFscyhnZXRCYXNlVXJpKCkgKyAibG9jYXRpb24iLCBsb2NhdGlvbik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB3aXRoIHJlbGF0aXZlIGxvY2F0aW9uIHdpdGggbGVhZGluZyBzbGFzaAorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE51bGxMb2NhdGlvbigpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0L2xvY2F0aW9uTnVsbCIpLnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfUExBSU4pLmdldChSZXNwb25zZS5jbGFzcyk7CisgICAgICAgIGZpbmFsIFN0cmluZyBsb2NhdGlvbiA9IHJlc3BvbnNlLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5MT0NBVElPTik7CisgICAgICAgIExPR0dFUi5pbmZvKCJMb2NhdGlvbiByZXNvbHZlZCBmcm9tIHJlc3BvbnNlID4gIiArIGxvY2F0aW9uKTsKKyAgICAgICAgYXNzZXJ0TnVsbChsb2NhdGlvbik7CisgICAgfQorfQorCisKKwpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL01lZGlhVHlwZVByb3ZpZGVyVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL01lZGlhVHlwZVByb3ZpZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MTQ3YjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvTWVkaWFUeXBlUHJvdmlkZXJUZXN0LmphdmEKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5hcGk7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5NZWRpYVR5cGVQcm92aWRlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogTWVkaWEgdHlwZSBwcm92aWRlciB0ZXN0cy4KKyAqCisgKiBAYXV0aG9yIE1hcmsgSGFkbGV5CisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBNZWRpYVR5cGVQcm92aWRlclRlc3QgeworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgeworICAgICAgICBmaW5hbCBNZWRpYVR5cGUgaGVhZGVyID0gbmV3IE1lZGlhVHlwZSgiYXBwbGljYXRpb24iLCAieG1sIik7CisgICAgICAgIGZpbmFsIE1lZGlhVHlwZVByb3ZpZGVyIGluc3RhbmNlID0gbmV3IE1lZGlhVHlwZVByb3ZpZGVyKCk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGV4cFJlc3VsdCA9ICJhcHBsaWNhdGlvbi94bWwiOworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzdWx0ID0gaW5zdGFuY2UudG9TdHJpbmcoaGVhZGVyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cFJlc3VsdCwgcmVzdWx0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZ1dpdGhQYXJhbXMoKSB7CisgICAgICAgIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtcyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgcGFyYW1zLnB1dCgiY2hhcnNldCIsICJ1dGY4Iik7CisgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBoZWFkZXIgPSBuZXcgTWVkaWFUeXBlKCJhcHBsaWNhdGlvbiIsICJ4bWwiLCBwYXJhbXMpOworICAgICAgICBmaW5hbCBNZWRpYVR5cGVQcm92aWRlciBpbnN0YW5jZSA9IG5ldyBNZWRpYVR5cGVQcm92aWRlcigpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBleHBSZXN1bHQgPSAiYXBwbGljYXRpb24veG1sO2NoYXJzZXQ9dXRmOCI7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQgPSBpbnN0YW5jZS50b1N0cmluZyhoZWFkZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoZXhwUmVzdWx0LCByZXN1bHQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZyb21TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgTWVkaWFUeXBlUHJvdmlkZXIgaW5zdGFuY2UgPSBuZXcgTWVkaWFUeXBlUHJvdmlkZXIoKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgaGVhZGVyID0gImFwcGxpY2F0aW9uL3htbCI7CisgICAgICAgIGZpbmFsIE1lZGlhVHlwZSByZXN1bHQgPSBpbnN0YW5jZS5mcm9tU3RyaW5nKGhlYWRlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VHlwZSgpLCAiYXBwbGljYXRpb24iKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRTdWJ0eXBlKCksICJ4bWwiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpLCAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGcm9tU3RyaW5nV2l0aFBhcmFtcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgaGVhZGVyID0gImFwcGxpY2F0aW9uL3htbDtjaGFyc2V0PXV0ZjgiOworICAgICAgICBmaW5hbCBNZWRpYVR5cGVQcm92aWRlciBpbnN0YW5jZSA9IG5ldyBNZWRpYVR5cGVQcm92aWRlcigpOworCisgICAgICAgIGZpbmFsIE1lZGlhVHlwZSByZXN1bHQgPSBpbnN0YW5jZS5mcm9tU3RyaW5nKGhlYWRlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0VHlwZSgpLCAiYXBwbGljYXRpb24iKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRTdWJ0eXBlKCksICJ4bWwiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpLCAxKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXN1bHQuZ2V0UGFyYW1ldGVycygpLmNvbnRhaW5zS2V5KCJjaGFyc2V0IikpOworICAgICAgICBhc3NlcnRFcXVhbHMocmVzdWx0LmdldFBhcmFtZXRlcnMoKS5nZXQoImNoYXJzZXQiKSwgInV0ZjgiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaXRoUXVvdGVkUGFyYW0oKSB7CisgICAgICAgIGZpbmFsIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IHBhcmFtcyA9IG5ldyBIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpOworICAgICAgICBwYXJhbXMucHV0KCJmb28iLCAiXCJiYXJcIiIpOworICAgICAgICBmaW5hbCBNZWRpYVR5cGUgaGVhZGVyID0gbmV3IE1lZGlhVHlwZSgiYXBwbGljYXRpb24iLCAieG1sIiwgcGFyYW1zKTsKKyAgICAgICAgZmluYWwgTWVkaWFUeXBlUHJvdmlkZXIgaW5zdGFuY2UgPSBuZXcgTWVkaWFUeXBlUHJvdmlkZXIoKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzdWx0ID0gaW5zdGFuY2UudG9TdHJpbmcoaGVhZGVyKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGV4cFJlc3VsdCA9ICJhcHBsaWNhdGlvbi94bWw7Zm9vPVwiXFxcImJhclxcXCJcIiI7CisgICAgICAgIGFzc2VydEVxdWFscyhleHBSZXN1bHQsIHJlc3VsdCk7CisKKyAgICAgICAgZmluYWwgTWVkaWFUeXBlIG0gPSBpbnN0YW5jZS5mcm9tU3RyaW5nKHJlc3VsdCk7CisgICAgICAgIGFzc2VydEVxdWFscygiXCJiYXJcIiIsIG0uZ2V0UGFyYW1ldGVycygpLmdldCgiZm9vIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9NZXNzYWdlQm9keVJlYWRlclRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9NZXNzYWdlQm9keVJlYWRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGJkN2Y2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL01lc3NhZ2VCb2R5UmVhZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTI3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmFwaTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLlJlYWRlcldyaXRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLkh0dHBSZXNwb25zZTsKK2ltcG9ydCBvcmcuYXBhY2hlLmh0dHAuY2xpZW50Lkh0dHBDbGllbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5odHRwLmNsaWVudC5tZXRob2RzLkh0dHBQb3N0OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5lbnRpdHkuQnl0ZUFycmF5RW50aXR5OworaW1wb3J0IG9yZy5hcGFjaGUuaHR0cC5pbXBsLmNsaWVudC5IdHRwQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQGF1dGhvciBKYW4gU3Vwb2wgKGphbi5zdXBvbCBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBNZXNzYWdlQm9keVJlYWRlclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBQYXRoKCJyZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQENvbnRleHQKKyAgICAgICAgcHJpdmF0ZSBIdHRwSGVhZGVycyBoZWFkZXJzOworCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJwbGFpbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcGxhaW4oZmluYWwgRW50aXR5Rm9yUmVhZGVyIGVudGl0eSkgeworICAgICAgICAgICAgcmV0dXJuIGVudGl0eS5nZXRWYWx1ZSgpICsgIjsiICsgaGVhZGVycy5nZXRIZWFkZXJTdHJpbmcoSHR0cEhlYWRlcnMuQ09OVEVOVF9UWVBFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIEBDb25zdW1lcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fT0NURVRfU1RSRUFNKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQXBwT2N0ZXRSZWFkZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVJlYWRlcjxFbnRpdHlGb3JSZWFkZXI+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZShmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9PQ1RFVF9TVFJFQU1fVFlQRS5lcXVhbHMobWVkaWFUeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRW50aXR5Rm9yUmVhZGVyIHJlYWRGcm9tKGZpbmFsIENsYXNzPEVudGl0eUZvclJlYWRlcj4gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgLy8gVW5kZXJseWluZyBzdHJlYW0gc2hvdWxkIG5vdCBiZSBjbG9zZWQgYW5kIEplcnNleSBpcyBwcmV2ZW50aW5nIGZyb20gY2xvc2luZyBpdC4KKyAgICAgICAgICAgIGVudGl0eVN0cmVhbS5jbG9zZSgpOworCisgICAgICAgICAgICByZXR1cm4gbmV3IEVudGl0eUZvclJlYWRlcihSZWFkZXJXcml0ZXIucmVhZEZyb21Bc1N0cmluZyhlbnRpdHlTdHJlYW0sIG1lZGlhVHlwZSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFbnRpdHlGb3JSZWFkZXIgeworCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlOworCisgICAgICAgIHB1YmxpYyBFbnRpdHlGb3JSZWFkZXIoZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcykucmVnaXN0ZXIoTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpLnJlZ2lzdGVyKEFwcE9jdGV0UmVhZGVyLmNsYXNzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHdoZXRoZXIgdGhlIGRlZmF1bHQge0BsaW5rIE1lZGlhVHlwZX0gKHtAdmFsdWUgTWVkaWFUeXBlI0FQUExJQ0FUSU9OX09DVEVUX1NUUkVBTX0pIGlzIHBhc3NlZCB0byBhIHJlYWRlciBpZiBubworICAgICAqIHtAdmFsdWUgSHR0cEhlYWRlcnMjQ09OVEVOVF9UWVBFfSB2YWx1ZSBpcyBwcm92aWRlZCBpbiBhIHJlcXVlc3QuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdENvbnRlbnRUeXBlRm9yUmVhZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEh0dHBQb3N0IGh0dHBQb3N0ID0gbmV3IEh0dHBQb3N0KFVyaUJ1aWxkZXIuZnJvbVVyaShnZXRCYXNlVXJpKCkpLnBhdGgoInJlc291cmNlL3BsYWluIikuYnVpbGQoKSk7CisgICAgICAgIGh0dHBQb3N0LnNldEVudGl0eShuZXcgQnl0ZUFycmF5RW50aXR5KCJ2YWx1ZSIuZ2V0Qnl0ZXMoKSkpOworICAgICAgICBodHRwUG9zdC5yZW1vdmVIZWFkZXJzKCJDb250ZW50LVR5cGUiKTsKKworICAgICAgICBmaW5hbCBIdHRwQ2xpZW50IGh0dHBDbGllbnQgPSBIdHRwQ2xpZW50QnVpbGRlci5jcmVhdGUoKS5idWlsZCgpOworICAgICAgICBmaW5hbCBIdHRwUmVzcG9uc2UgcmVzcG9uc2UgPSBodHRwQ2xpZW50LmV4ZWN1dGUoaHR0cFBvc3QpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1c0xpbmUoKS5nZXRTdGF0dXNDb2RlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlO251bGwiLCBSZWFkZXJXcml0ZXIucmVhZEZyb21Bc1N0cmluZyhyZXNwb25zZS5nZXRFbnRpdHkoKS5nZXRDb250ZW50KCksIG51bGwpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvTWVzc2FnZUJvZHlXcml0ZXJUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvTWVzc2FnZUJvZHlXcml0ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlmMDUxZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9NZXNzYWdlQm9keVdyaXRlclRlc3QuamF2YQpAQCAtMCwwICsxLDI0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5hcGk7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5IZWFkZXJQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuUnVudGltZVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuU2VydmVyRXJyb3JFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuTWVkaWFUeXBlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBWYXJpb3VzIE1lc3NhZ2VCb2R5V3JpdGVyIHRlc3RzLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIE1lc3NhZ2VCb2R5V3JpdGVyVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9OQU1FID0gIk1lc3NhZ2VCb2R5V3JpdGVyVGVzdEhlYWRlciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9WQUxVRV9DTElFTlQgPSAiQ2xpZW50IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1ZBTFVFX1NFUlZFUiA9ICJTZXJ2ZXIiOworCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzLCBPdmVycmlkaW5nU3RyaW5nUHJvdmlkZXIuY2xhc3MsIEh0bWxTdHJpbmdQcm92aWRlci5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KGZpbmFsIENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKE92ZXJyaWRpbmdTdHJpbmdQcm92aWRlci5jbGFzcyk7CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE92ZXJyaWRpbmdTdHJpbmdQcm92aWRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5V3JpdGVyPFN0cmluZz4geworCisgICAgICAgIEBDb250ZXh0CisgICAgICAgIHByaXZhdGUgQ29uZmlndXJhdGlvbiBjb25maWc7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKAorICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gU3RyaW5nLmNsYXNzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldFNpemUoCisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHQsCisgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gdHlwZSwKKyAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbygKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgdCwKKyAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgICAgIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgLy8gVW5kZXJseWluZyBzdHJlYW0gc2hvdWxkIG5vdCBiZSBjbG9zZWQgYW5kIEplcnNleSBpcyBwcmV2ZW50aW5nIGZyb20gY2xvc2luZyBpdC4KKyAgICAgICAgICAgIGVudGl0eVN0cmVhbS5jbG9zZSgpOworCisgICAgICAgICAgICBodHRwSGVhZGVycy5wdXRTaW5nbGUoSEVBREVSX05BTUUsCisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5nZXRSdW50aW1lVHlwZSgpID09IFJ1bnRpbWVUeXBlLlNFUlZFUiA/IEhFQURFUl9WQUxVRV9TRVJWRVIgOiBIRUFERVJfVkFMVUVfQ0xJRU5UKTsKKworICAgICAgICAgICAgZW50aXR5U3RyZWFtLndyaXRlKHQuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBAUHJvZHVjZXMoInRleHQvaHRtbCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBIdG1sU3RyaW5nUHJvdmlkZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVdyaXRlcjxTdHJpbmc+IHsKKworICAgICAgICBAQ29udGV4dAorICAgICAgICBwcml2YXRlIENvbmZpZ3VyYXRpb24gY29uZmlnOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZSgKKyAgICAgICAgICAgICAgICBmaW5hbCBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgICAgIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKworICAgICAgICAgICAgaWYgKE1lZGlhVHlwZXMudHlwZUVxdWFsKE1lZGlhVHlwZS5URVhUX0hUTUxfVFlQRSwgbWVkaWFUeXBlKSkgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjaGFyc2V0ID0gbWVkaWFUeXBlLmdldFBhcmFtZXRlcnMoKS5nZXQoImNoYXJzZXQiKTsKKyAgICAgICAgICAgICAgICBpZiAoY2hhcnNldCA9PSBudWxsIHx8ICEidXRmLTgiLmVxdWFsc0lnbm9yZUNhc2UoY2hhcnNldCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZlckVycm9yRXhjZXB0aW9uKCJDaGFyc2V0IG5vdCByZWNlaXZlZCBpbiBpc1dyaXRhYmxlKCkiLCA1MDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gU3RyaW5nLmNsYXNzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldFNpemUoCisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHQsCisgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gdHlwZSwKKyAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbygKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZW50aXR5LAorICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBjaGFyc2V0ID0gbWVkaWFUeXBlLmdldFBhcmFtZXRlcnMoKS5nZXQoImNoYXJzZXQiKTsKKyAgICAgICAgICAgIGlmIChjaGFyc2V0ID09IG51bGwgfHwgISJ1dGYtOCIuZXF1YWxzSWdub3JlQ2FzZShjaGFyc2V0KSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2ZXJFcnJvckV4Y2VwdGlvbigiQ2hhcnNldCBub3QgcmVjZWl2ZWQgaW4gd3JpdGVUbygpIiwgNTAyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU3RyaW5nIGh0bWwgPSAiPGh0bWw+PGJvZHk+IiArIGVudGl0eSArICI8L2JvZHk+PC9odG1sPiI7CisgICAgICAgICAgICBlbnRpdHlTdHJlYW0ud3JpdGUoaHRtbC5nZXRCeXRlcygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgcmVzb3VyY2UuCisgICAgICovCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdChASGVhZGVyUGFyYW0oSEVBREVSX05BTUUpIGZpbmFsIFN0cmluZyBoZWFkZXIsIGZpbmFsIFN0cmluZyBwb3N0KSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoSEVBREVSX1ZBTFVFX0NMSUVOVCwgaGVhZGVyKTsKKyAgICAgICAgICAgIHJldHVybiBwb3N0OworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoInRleHQvaHRtbDtjaGFyc2V0PXV0Zi04IikKKyAgICAgICAgQFBhdGgoImh0bWwtY2hhcnNldC1pbi1wcm9kdWNlcyIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SHRtbEZvckNoYXJzZXRJblByb2R1Y2VzKCkgeworICAgICAgICAgICAgcmV0dXJuICJmb28iOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiaHRtbC1jaGFyc2V0LWV4cGxpY2l0LWluLXJlc3BvbnNlIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldEh0bWxGb3JFeHBsaWNpdENoYXJzZXRJblJlc3BvbnNlKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCJmb28iLCBNZWRpYVR5cGUuVEVYVF9IVE1MX1RZUEUud2l0aENoYXJzZXQoInV0Zi04IikpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9odG1sIikKKyAgICAgICAgQFBhdGgoImh0bWwtY2hhcnNldC1pbi1hY2NlcHRzIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRIdG1sRm9yQ2hhcnNldEluQWNjZXB0cygpIHsKKyAgICAgICAgICAgIHJldHVybiAiZm9vIjsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0aGF0IGl0J3MgcG9zc2libGUgdG8gb3ZlcnJpZGUgZGVmYXVsdCBNZXNzYWdlQm9keVdyaXRlciBpbnN0YW5jZXMuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T3ZlcnJpZGUoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgidGV4dC9wbGFpbiIpLnBvc3QoRW50aXR5LnRleHQoImNvbnRlbnQiKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb250ZW50IiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEhFQURFUl9WQUxVRV9TRVJWRVIsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZyhIRUFERVJfTkFNRSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhhdCBtZWRpYSB0eXBlIHBhcmFtZXRlcnMgc3BlY2lmaWVkIGluIEBQcm9kdWNlcyBvciBleHBsaWNpdGx5IGluIGEgc2VydmVyIHJlc3BvbnNlIGFyZSByZWNlaXZlZAorICAgICAqIGluIHRoZSBzZWxlY3RlZCBtZXNzYWdlIGJvZHkgd3JpdGVyLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1lZGlhVHlwZVBhcmFtZXRlcnNJbk1lc3NhZ2VCb2R5V3JpdGVyKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoImh0bWwtY2hhcnNldC1pbi1wcm9kdWNlcyIpLnJlcXVlc3QoInRleHQvaHRtbCIpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KCJNZWRpYVR5cGUgY2hhcnNldCBwYXJhbWV0ZXIgaW4gQFByb2R1Y2VzIGZhaWxlZCB0byBwcm9wYWdhdGUgaW50byBNZXNzYWdlQm9keVdyaXRlciIsCisgICAgICAgICAgICAgICAgcmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQoIlVuZXhwZWN0ZWQgcmVzcG9uc2UgY29udGVudCByZXR1cm5lZCBmcm9tIHNlcnZlci4iLAorICAgICAgICAgICAgICAgIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbygiPGh0bWw+PGJvZHk+Zm9vPC9ib2R5PjwvaHRtbD4iKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJodG1sLWNoYXJzZXQtZXhwbGljaXQtaW4tcmVzcG9uc2UiKS5yZXF1ZXN0KCJ0ZXh0L2h0bWwiKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgiTWVkaWFUeXBlIGNoYXJzZXQgcGFyYW1ldGVyIGV4cGxpY2l0bHkgc2V0IGluIFJlc3BvbnNlIGZhaWxlZCB0byBwcm9wYWdhdGUgaW50byBNZXNzYWdlQm9keVdyaXRlciIsCisgICAgICAgICAgICAgICAgcmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQoIlVuZXhwZWN0ZWQgcmVzcG9uc2UgY29udGVudCByZXR1cm5lZCBmcm9tIHNlcnZlci4iLAorICAgICAgICAgICAgICAgIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbygiPGh0bWw+PGJvZHk+Zm9vPC9ib2R5PjwvaHRtbD4iKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJodG1sLWNoYXJzZXQtaW4tYWNjZXB0cyIpLnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfSFRNTF9UWVBFLndpdGhDaGFyc2V0KCJ1dGYtOCIpKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgiTWVkaWFUeXBlIGNoYXJzZXQgcGFyYW1ldGVyIHNlbnQgd2l0aCByZXF1ZXN0IGluIEFjY2VwdCBoZWFkZXIgZmFpbGVkIHRvIHByb3BhZ2F0ZSBpbnRvIE1lc3NhZ2VCb2R5V3JpdGVyIiwKKyAgICAgICAgICAgICAgICByZXNwb25zZS5nZXRTdGF0dXMoKSwgZXF1YWxUbygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgiVW5leHBlY3RlZCByZXNwb25zZSBjb250ZW50IHJldHVybmVkIGZyb20gc2VydmVyLiIsCisgICAgICAgICAgICAgICAgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKCI8aHRtbD48Ym9keT5mb288L2JvZHk+PC9odG1sPiIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvT3B0aW9uc1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9PcHRpb25zVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjYzFhMDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvT3B0aW9uc1Rlc3QuamF2YQpAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmFwaTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIE9wdGlvbnNUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEh0dHBPcHRpb25zVGVzdC5jbGFzcyk7CisgICAgfQorCisgICAgQFBhdGgoIi9PcHRpb25zVGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBIdHRwT3B0aW9uc1Rlc3QgeworCisgICAgICAgIHN0YXRpYyBTdHJpbmcgaHRtbF9jb250ZW50ID0KKyAgICAgICAgICAgICAgICAiPGh0bWw+PGhlYWQ+PHRpdGxlPmdldCB0ZXh0L2h0bWw8L3RpdGxlPjwvaGVhZD4iCisgICAgICAgICAgICAgICAgICAgICAgICArICI8Ym9keT5nZXQgdGV4dC9odG1sPC9ib2R5PjwvaHRtbD4iOworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldFBsYWluKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCJDVFMtZ2V0IHRleHQvcGxhaW4iKS5oZWFkZXIoIlRFU1QtSEVBRCIsICJ0ZXh0LXBsYWluIikKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9odG1sIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldEh0bWwoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soaHRtbF9jb250ZW50KS5oZWFkZXIoIlRFU1QtSEVBRCIsICJ0ZXh0LWh0bWwiKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIi9zdWIiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0U3ViKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCJURVNULWdldCB0ZXh0L3BsYWluIikuaGVhZGVyKCJURVNULUhFQUQiLAorICAgICAgICAgICAgICAgICAgICAic3ViLXRleHQtcGxhaW4iKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIi9zdWIiKQorICAgICAgICBAUHJvZHVjZXModmFsdWUgPSAidGV4dC9odG1sIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGhlYWRTdWIoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soaHRtbF9jb250ZW50KS5oZWFkZXIoIlRFU1QtSEVBRCIsICJzdWItdGV4dC1odG1sIikKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIENsaWVudCBpbnZva2VzIE9QVElPTlMgb24gYSBzdWIgcmVzb3VyY2UgYXQgL09wdGlvbnNUZXN0L3N1YjsKKyAgICAgKiB3aGljaCBubyByZXF1ZXN0IG1ldGhvZCBkZXNpZ25hdGVkIGZvciBPUFRJT05TLgorICAgICAqIFZlcmlmeSB0aGF0IGFuIGF1dG9tYXRpYyByZXNwb25zZSBpcyBnZW5lcmF0ZWQuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBPcHRpb25TdWJUZXN0KCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoIi9PcHRpb25zVGVzdC9zdWIiKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX0hUTUxfVFlQRSkub3B0aW9ucygpOworCisgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuZ2V0QWxsb3dlZE1ldGhvZHMoKS5jb250YWlucygiR0VUIikpOworICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmdldEFsbG93ZWRNZXRob2RzKCkuY29udGFpbnMoIkhFQUQiKSk7CisgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuZ2V0QWxsb3dlZE1ldGhvZHMoKS5jb250YWlucygiT1BUSU9OUyIpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMocmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCksIE1lZGlhVHlwZS5URVhUX0hUTUxfVFlQRSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL1F1YWxpdHlTb3VyY2VNZWRpYVR5cGVQcm92aWRlclRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9RdWFsaXR5U291cmNlTWVkaWFUeXBlUHJvdmlkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM3MTkwOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9RdWFsaXR5U291cmNlTWVkaWFUeXBlUHJvdmlkZXJUZXN0LmphdmEKQEAgLTAsMCArMSwyOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuYXBpOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuSHR0cEhlYWRlclJlYWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLlF1YWxpdHlTb3VyY2VNZWRpYVR5cGU7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBAYXV0aG9yIHVua25vd24KKyAqLworcHVibGljIGNsYXNzIFF1YWxpdHlTb3VyY2VNZWRpYVR5cGVQcm92aWRlclRlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25lTWVkaWFUeXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBoZWFkZXIgPSAiYXBwbGljYXRpb24veG1sIjsKKyAgICAgICAgZmluYWwgTGlzdDxRdWFsaXR5U291cmNlTWVkaWFUeXBlPiBsID0gSHR0cEhlYWRlclJlYWRlci5yZWFkUXVhbGl0eVNvdXJjZU1lZGlhVHlwZShoZWFkZXIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbC5zaXplKCkpOworICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbSA9IGwuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoImFwcGxpY2F0aW9uIiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInhtbCIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T25lTWVkaWFUeXBlV2l0aFBhcmFtZXRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGhlYWRlciA9ICJhcHBsaWNhdGlvbi94bWw7Y2hhcnNldD11dGY4IjsKKyAgICAgICAgZmluYWwgTGlzdDxRdWFsaXR5U291cmNlTWVkaWFUeXBlPiBsID0gSHR0cEhlYWRlclJlYWRlci5yZWFkUXVhbGl0eVNvdXJjZU1lZGlhVHlwZShoZWFkZXIpOworCisgICAgICAgIGFzc2VydEVxdWFscygxLCBsLnNpemUoKSk7CisKKyAgICAgICAgZmluYWwgTWVkaWFUeXBlIG0gPSBsLmdldCgwKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcHBsaWNhdGlvbiIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4bWwiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBhc3NlcnRUcnVlKG0uZ2V0UGFyYW1ldGVycygpLmNvbnRhaW5zS2V5KCJjaGFyc2V0IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoInV0ZjgiLCBtLmdldFBhcmFtZXRlcnMoKS5nZXQoImNoYXJzZXQiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlwbGVNZWRpYVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGhlYWRlciA9ICJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sLCB0ZXh0L2h0bWwiOworICAgICAgICBmaW5hbCBMaXN0PFF1YWxpdHlTb3VyY2VNZWRpYVR5cGU+IGwgPSBIdHRwSGVhZGVyUmVhZGVyLnJlYWRRdWFsaXR5U291cmNlTWVkaWFUeXBlKGhlYWRlcik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGwuc2l6ZSgpKTsKKworICAgICAgICBNZWRpYVR5cGUgbTsKKyAgICAgICAgbSA9IGwuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoImFwcGxpY2F0aW9uIiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInhtbCIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCgxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInhtbCIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCgyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImh0bWwiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlTWVkaWFUeXBlV2l0aFF1YWxpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGhlYWRlciA9ICJhcHBsaWNhdGlvbi94bWw7cXM9MC4xLCB0ZXh0L3htbDtxcz0wLjIsIHRleHQvaHRtbDtxcz0wLjMiOworICAgICAgICBmaW5hbCBMaXN0PFF1YWxpdHlTb3VyY2VNZWRpYVR5cGU+IGwgPSBIdHRwSGVhZGVyUmVhZGVyLnJlYWRRdWFsaXR5U291cmNlTWVkaWFUeXBlKGhlYWRlcik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGwuc2l6ZSgpKTsKKworICAgICAgICBNZWRpYVR5cGUgbTsKKyAgICAgICAgbSA9IGwuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaHRtbCIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCgxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInhtbCIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCgyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcHBsaWNhdGlvbiIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4bWwiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlTWVkaWFUeXBlV2l0aFF1YWxpdHkyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBoZWFkZXIgPSAiYXBwbGljYXRpb24veG1sO3FzPTAuMSwgdGV4dC94bWw7cXM9MC4yLCB0ZXh0L2h0bWw7cXM9MC45MyI7CisgICAgICAgIGZpbmFsIExpc3Q8UXVhbGl0eVNvdXJjZU1lZGlhVHlwZT4gbCA9IEh0dHBIZWFkZXJSZWFkZXIucmVhZFF1YWxpdHlTb3VyY2VNZWRpYVR5cGUoaGVhZGVyKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMywgbC5zaXplKCkpOworCisgICAgICAgIE1lZGlhVHlwZSBtOworICAgICAgICBtID0gbC5nZXQoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygidGV4dCIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJodG1sIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygieG1sIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDIpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFwcGxpY2F0aW9uIiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInhtbCIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SHR0cFVSTENvbm5lY3Rpb25BY2NlcHRIZWFkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGhlYWRlciA9ICJ0ZXh0L2h0bWwsIGltYWdlL2dpZiwgaW1hZ2UvanBlZywgKi8qOyBxcz0uMiI7CisgICAgICAgIGZpbmFsIExpc3Q8UXVhbGl0eVNvdXJjZU1lZGlhVHlwZT4gbCA9IEh0dHBIZWFkZXJSZWFkZXIucmVhZFF1YWxpdHlTb3VyY2VNZWRpYVR5cGUoaGVhZGVyKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNCwgbC5zaXplKCkpOworCisgICAgICAgIE1lZGlhVHlwZSBtOworICAgICAgICBtID0gbC5nZXQoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygidGV4dCIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJodG1sIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoImltYWdlIiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImdpZiIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCgyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpbWFnZSIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJqcGVnIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDMpOworICAgICAgICBhc3NlcnRFcXVhbHMoIioiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKiIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmlyZWZveEFjY2VwdEhlYWRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgaGVhZGVyID0gInRleHQveG1sLGFwcGxpY2F0aW9uL3htbCxhcHBsaWNhdGlvbi94aHRtbCt4bWwsdGV4dC9odG1sO3FzPTAuOSx0ZXh0L3BsYWluO3FzPTAuOCxpbWFnZS9wbmcsKi8qOyIKKyAgICAgICAgICAgICAgICArICJxcz0wLjUiOworICAgICAgICBmaW5hbCBMaXN0PFF1YWxpdHlTb3VyY2VNZWRpYVR5cGU+IGwgPSBIdHRwSGVhZGVyUmVhZGVyLnJlYWRRdWFsaXR5U291cmNlTWVkaWFUeXBlKGhlYWRlcik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDcsIGwuc2l6ZSgpKTsKKworICAgICAgICBNZWRpYVR5cGUgbTsKKyAgICAgICAgbSA9IGwuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygieG1sIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFwcGxpY2F0aW9uIiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInhtbCIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCgyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhcHBsaWNhdGlvbiIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ4aHRtbCt4bWwiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoMyk7CisgICAgICAgIGFzc2VydEVxdWFscygiaW1hZ2UiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygicG5nIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDQpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaHRtbCIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCg1KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBsYWluIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDYpOworICAgICAgICBhc3NlcnRFcXVhbHMoIioiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKiIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWVkaWFUeXBlU3BlY2lmaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBoZWFkZXIgPSAiKi8qLCB0ZXh0LyosIHRleHQvcGxhaW4iOworICAgICAgICBmaW5hbCBMaXN0PFF1YWxpdHlTb3VyY2VNZWRpYVR5cGU+IGwgPSBIdHRwSGVhZGVyUmVhZGVyLnJlYWRRdWFsaXR5U291cmNlTWVkaWFUeXBlKGhlYWRlcik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGwuc2l6ZSgpKTsKKworICAgICAgICBNZWRpYVR5cGUgbTsKKyAgICAgICAgbSA9IGwuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygicGxhaW4iLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoMSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGV4dCIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIioiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKiIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWVkaWFUeXBlU3BlY2lmaXR5V2l0aFF1YWxpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGhlYWRlciA9ICIqLyosICovKjtxcz0wLjUsIHRleHQvKiwgdGV4dC8qO3FzPTAuNSwgdGV4dC9wbGFpbiwgdGV4dC9wbGFpbjtxcz0wLjUiOworICAgICAgICBmaW5hbCBMaXN0PFF1YWxpdHlTb3VyY2VNZWRpYVR5cGU+IGwgPSBIdHRwSGVhZGVyUmVhZGVyLnJlYWRRdWFsaXR5U291cmNlTWVkaWFUeXBlKGhlYWRlcik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDYsIGwuc2l6ZSgpKTsKKworICAgICAgICBNZWRpYVR5cGUgbTsKKyAgICAgICAgbSA9IGwuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygicGxhaW4iLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoMSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGV4dCIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDIpOworICAgICAgICBhc3NlcnRFcXVhbHMoIioiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKiIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCgzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInBsYWluIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDQpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKiIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCg1KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqIiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIioiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1lZGlhVHlwZVNwZWNpZml0eUhUVFBFeGFtcGxlMSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgaGVhZGVyID0gInRleHQvKiwgdGV4dC9odG1sLCB0ZXh0L2h0bWw7bGV2ZWw9MSwgKi8qIjsKKyAgICAgICAgZmluYWwgTGlzdDxRdWFsaXR5U291cmNlTWVkaWFUeXBlPiBsID0gSHR0cEhlYWRlclJlYWRlci5yZWFkUXVhbGl0eVNvdXJjZU1lZGlhVHlwZShoZWFkZXIpOworCisgICAgICAgIE1lZGlhVHlwZSBtOworICAgICAgICBtID0gbC5nZXQoMCk7CisgICAgICAgIGFzc2VydEVxdWFscygidGV4dCIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJodG1sIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDEpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaHRtbCIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCgyKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIioiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoMyk7CisgICAgICAgIGFzc2VydEVxdWFscygiKiIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNZWRpYVR5cGVTcGVjaWZpdHlIVFRQRXhhbXBsZTIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGhlYWRlciA9ICJ0ZXh0LyosIHRleHQvaHRtbDtsZXZlbD0xLCB0ZXh0L2h0bWwsICovKiI7CisgICAgICAgIGZpbmFsIExpc3Q8UXVhbGl0eVNvdXJjZU1lZGlhVHlwZT4gbCA9IEh0dHBIZWFkZXJSZWFkZXIucmVhZFF1YWxpdHlTb3VyY2VNZWRpYVR5cGUoaGVhZGVyKTsKKworICAgICAgICBNZWRpYVR5cGUgbTsKKyAgICAgICAgbSA9IGwuZ2V0KDApOworICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiaHRtbCIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgICAgIG0gPSBsLmdldCgxKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgbS5nZXRUeXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImh0bWwiLCBtLmdldFN1YnR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygwLCBtLmdldFBhcmFtZXRlcnMoKS5zaXplKCkpOworICAgICAgICBtID0gbC5nZXQoMik7CisgICAgICAgIGFzc2VydEVxdWFscygidGV4dCIsIG0uZ2V0VHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIqIiwgbS5nZXRTdWJ0eXBlKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbS5nZXRQYXJhbWV0ZXJzKCkuc2l6ZSgpKTsKKyAgICAgICAgbSA9IGwuZ2V0KDMpOworICAgICAgICBhc3NlcnRFcXVhbHMoIioiLCBtLmdldFR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiKiIsIG0uZ2V0U3VidHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG0uZ2V0UGFyYW1ldGVycygpLnNpemUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL1Jlc291cmNlQ29udGV4dFRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9SZXNvdXJjZUNvbnRleHRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQyYWNkYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9SZXNvdXJjZUNvbnRleHRUZXN0LmphdmEKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuYXBpOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5SZXNvdXJjZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0LmhrMi5IazJJbmplY3Rpb25NYW5hZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LkFzc3VtZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0IHtAbGluayBSZXNvdXJjZUNvbnRleHR9OiByZXNvdXJjZSBjb250ZXh0IG11c3QgcHJvdmlkZSBhY2Nlc3MgdG8KKyAqIHN1Yi1yZXNvdXJjZXMgdGhhdCBjYW4gYmUgcHJvdmlkZWQgYnkgYSBjdXN0b20gY29tcG9uZW50IHByb3ZpZGVyLgorICoKKyAqIEBhdXRob3IgTWFydGluIEdyb3R6a2UKKyAqIEBhdXRob3IgUGF1bCBTYW5kb3oKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNvdXJjZUNvbnRleHRUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgc2V0dXAoKSB7CisgICAgICAgIEFzc3VtZS5hc3N1bWVUcnVlKEhrMkluamVjdGlvbk1hbmFnZXJGYWN0b3J5LmlzSW1tZWRpYXRlU3RyYXRlZ3koKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhNeVJvb3RSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlSb290UmVzb3VyY2UgeworCisgICAgICAgIEBDb250ZXh0CisgICAgICAgIFJlc291cmNlQ29udGV4dCByZXNvdXJjZUNvbnRleHQ7CisKKyAgICAgICAgQFBhdGgoInNpbmdsZXRvbiIpCisgICAgICAgIHB1YmxpYyBTaW5nbGV0b25SZXNvdXJjZSBnZXRTaW5nbGV0b25SZXNvdXJjZSgpIHsKKyAgICAgICAgICAgIHJldHVybiByZXNvdXJjZUNvbnRleHQuZ2V0UmVzb3VyY2UoU2luZ2xldG9uUmVzb3VyY2UuY2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoInBlcnJlcXVlc3QiKQorICAgICAgICBwdWJsaWMgUGVyUmVxdWVzdFJlc291cmNlIGdldFBlclJlcXVlc3RTdWJSZXNvdXJjZSgpIHsKKyAgICAgICAgICAgIHJldHVybiByZXNvdXJjZUNvbnRleHQuZ2V0UmVzb3VyY2UoUGVyUmVxdWVzdFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCJpbmplY3Qve3BhdGh9IikKKyAgICAgICAgcHVibGljIEluamVjdFJlc291cmNlIGdldEluamVjdFJlc291cmNlKCkgeworICAgICAgICAgICAgZmluYWwgSW5qZWN0UmVzb3VyY2UgcmVzb3VyY2UgPSByZXNvdXJjZUNvbnRleHQuZ2V0UmVzb3VyY2UoSW5qZWN0UmVzb3VyY2UuY2xhc3MpOworICAgICAgICAgICAgcmVzb3VyY2Uuc2V0UGF0aCgic29tZXRoaW5nIik7CisgICAgICAgICAgICByZXR1cm4gcmVzb3VyY2VDb250ZXh0LmluaXRSZXNvdXJjZShyZXNvdXJjZSk7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiaW5qZWN0RnJvbU5ld1Jlc291cmNlL3twYXRofSIpCisgICAgICAgIHB1YmxpYyBJbmplY3RSZXNvdXJjZSBnZXRJbmplY3RSZXNvdXJjZUZyb21OZXcoKSB7CisgICAgICAgICAgICBmaW5hbCBJbmplY3RSZXNvdXJjZSByZXNvdXJjZSA9IG5ldyBJbmplY3RSZXNvdXJjZSgpOworICAgICAgICAgICAgcmVzb3VyY2Uuc2V0UGF0aCgic29tZXRoaW5nIik7CisgICAgICAgICAgICByZXR1cm4gcmVzb3VyY2VDb250ZXh0LmluaXRSZXNvdXJjZShyZXNvdXJjZSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSW5qZWN0UmVzb3VyY2UgeworICAgICAgICBAUGF0aFBhcmFtKCJwYXRoIikKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgcGF0aDsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIHBhdGg7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7CisgICAgICAgICAgICByZXR1cm4gcGF0aDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFBhdGgoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgICAgIHRoaXMucGF0aCA9IHBhdGg7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIEBTaW5nbGV0b24KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNpbmdsZXRvblJlc291cmNlIHsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKGkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQZXJSZXF1ZXN0UmVzb3VyY2UgeworICAgICAgICBpbnQgaTsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgcmV0dXJuIEludGVnZXIudG9TdHJpbmcoaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRSZXNvdXJjZUZyb21SZXNvdXJjZUNvbnRleHQoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiMSIsIHRhcmdldCgiL3NpbmdsZXRvbiIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMiIsIHRhcmdldCgiL3NpbmdsZXRvbiIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxIiwgdGFyZ2V0KCIvcGVycmVxdWVzdCIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMSIsIHRhcmdldCgiL3BlcnJlcXVlc3QiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgIH0KKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5pdGlhbGl6ZVJlc291cmNlRnJvbVJlc291cmNlQ29udGV4dCgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhYWEiLCB0YXJnZXQoIi9pbmplY3QvYWFhIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJiYmIiLCB0YXJnZXQoIi9pbmplY3QvYmJiIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbml0aWFsaXplUmVzb3VyY2VGcm9tTmV3UmVzb3VyY2UoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiYWFhIiwgdGFyZ2V0KCIvaW5qZWN0RnJvbU5ld1Jlc291cmNlL2FhYSIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYmJiIiwgdGFyZ2V0KCIvaW5qZWN0RnJvbU5ld1Jlc291cmNlL2JiYiIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvUmVzcG9uc2VFMkVUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvUmVzcG9uc2VFMkVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIwNjU1MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9SZXNwb25zZUUyRVRlc3QuamF2YQpAQCAtMCwwICsxLDM0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5hcGk7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QVVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkVudGl0eVRhZzsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkdlbmVyaWNUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTGluazsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTmV3Q29va2llOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJ1bnRpbWVEZWxlZ2F0ZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuVXJpOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworCisvKioKKyAqIFJlc3BvbnNlIEUyRSB0ZXN0cy4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgUmVzcG9uc2VFMkVUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICAvKioKKyAgICAgKiBDdXN0b20gT0sgcmVzcG9uc2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBPa1Jlc3BvbnNlIGV4dGVuZHMgUmVzcG9uc2UgeworCisgICAgICAgIHByaXZhdGUgUmVzcG9uc2UgcjsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3VzdG9tIE9LIHJlc3BvbnNlIGNvbnN0cnVjdG9yLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZW50aXR5IGVudGl0eSBjb250ZW50LgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIE9rUmVzcG9uc2UoU3RyaW5nIGVudGl0eSkgeworICAgICAgICAgICAgciA9IFJlc3BvbnNlLm9rKGVudGl0eSkuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGdldFN0YXR1cygpIHsKKyAgICAgICAgICAgIHJldHVybiByLmdldFN0YXR1cygpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdGF0dXNUeXBlIGdldFN0YXR1c0luZm8oKSB7CisgICAgICAgICAgICByZXR1cm4gci5nZXRTdGF0dXNJbmZvKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE9iamVjdCBnZXRFbnRpdHkoKSB7CisgICAgICAgICAgICByZXR1cm4gci5nZXRFbnRpdHkoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgPFQ+IFQgcmVhZEVudGl0eShDbGFzczxUPiBlbnRpdHlUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gci5yZWFkRW50aXR5KGVudGl0eVR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyA8VD4gVCByZWFkRW50aXR5KEdlbmVyaWNUeXBlPFQ+IGVudGl0eVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiByLnJlYWRFbnRpdHkoZW50aXR5VHlwZSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIDxUPiBUIHJlYWRFbnRpdHkoQ2xhc3M8VD4gZW50aXR5VHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zKSB7CisgICAgICAgICAgICByZXR1cm4gci5yZWFkRW50aXR5KGVudGl0eVR5cGUsIGFubm90YXRpb25zKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgPFQ+IFQgcmVhZEVudGl0eShHZW5lcmljVHlwZTxUPiBlbnRpdHlUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgICAgIHJldHVybiByLnJlYWRFbnRpdHkoZW50aXR5VHlwZSwgYW5ub3RhdGlvbnMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0VudGl0eSgpIHsKKyAgICAgICAgICAgIHJldHVybiByLmhhc0VudGl0eSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGJ1ZmZlckVudGl0eSgpIHsKKyAgICAgICAgICAgIHJldHVybiByLmJ1ZmZlckVudGl0eSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICAgICAgci5jbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBNZWRpYVR5cGUgZ2V0TWVkaWFUeXBlKCkgeworICAgICAgICAgICAgcmV0dXJuIHIuZ2V0TWVkaWFUeXBlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIExvY2FsZSBnZXRMYW5ndWFnZSgpIHsKKyAgICAgICAgICAgIHJldHVybiByLmdldExhbmd1YWdlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBnZXRMZW5ndGgoKSB7CisgICAgICAgICAgICByZXR1cm4gci5nZXRMZW5ndGgoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU2V0PFN0cmluZz4gZ2V0QWxsb3dlZE1ldGhvZHMoKSB7CisgICAgICAgICAgICByZXR1cm4gci5nZXRBbGxvd2VkTWV0aG9kcygpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBOZXdDb29raWU+IGdldENvb2tpZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gci5nZXRDb29raWVzKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEVudGl0eVRhZyBnZXRFbnRpdHlUYWcoKSB7CisgICAgICAgICAgICByZXR1cm4gci5nZXRFbnRpdHlUYWcoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRGF0ZSBnZXREYXRlKCkgeworICAgICAgICAgICAgcmV0dXJuIHIuZ2V0RGF0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBEYXRlIGdldExhc3RNb2RpZmllZCgpIHsKKyAgICAgICAgICAgIHJldHVybiByLmdldExhc3RNb2RpZmllZCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBVUkkgZ2V0TG9jYXRpb24oKSB7CisgICAgICAgICAgICByZXR1cm4gci5nZXRMb2NhdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTZXQ8TGluaz4gZ2V0TGlua3MoKSB7CisgICAgICAgICAgICByZXR1cm4gci5nZXRMaW5rcygpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0xpbmsoU3RyaW5nIHJlbGF0aW9uKSB7CisgICAgICAgICAgICByZXR1cm4gci5oYXNMaW5rKHJlbGF0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTGluayBnZXRMaW5rKFN0cmluZyByZWxhdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIHIuZ2V0TGluayhyZWxhdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIExpbmsuQnVpbGRlciBnZXRMaW5rQnVpbGRlcihTdHJpbmcgcmVsYXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiByLmdldExpbmtCdWlsZGVyKHJlbGF0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGdldE1ldGFkYXRhKCkgeworICAgICAgICAgICAgcmV0dXJuIHIuZ2V0TWV0YWRhdGEoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGdldEhlYWRlcnMoKSB7CisgICAgICAgICAgICByZXR1cm4gci5nZXRIZWFkZXJzKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBnZXRTdHJpbmdIZWFkZXJzKCkgeworICAgICAgICAgICAgcmV0dXJuIHIuZ2V0U3RyaW5nSGVhZGVycygpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SGVhZGVyU3RyaW5nKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICByZXR1cm4gci5nZXRIZWFkZXJTdHJpbmcobmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicmVzcG9uc2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzcG9uc2VUZXN0UmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImN1c3RvbSIpCisgICAgICAgIHB1YmxpYyBPa1Jlc3BvbnNlIHN1YnJlc3BvbnNlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBPa1Jlc3BvbnNlKCJzdWJyZXNwb25zZSIpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgibnVsbCIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBudWxsUmVzcG9uc2UoKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIm5vLXN0YXR1cy13aXRoLWVudGl0eSIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBlbnRpdHlSZXNwb25zZVRlc3QoKSB7CisgICAgICAgICAgICByZXR1cm4gUnVudGltZURlbGVnYXRlLmdldEluc3RhbmNlKCkuY3JlYXRlUmVzcG9uc2VCdWlsZGVyKCkuZW50aXR5KCIxMjM0NTY3ODkwIikuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIm5vLXN0YXR1cy13aXRob3V0LWVudGl0eSIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBub0VudGl0eVJlc3BvbnNlVGVzdCgpIHsKKyAgICAgICAgICAgIHJldHVybiBSdW50aW1lRGVsZWdhdGUuZ2V0SW5zdGFuY2UoKS5jcmVhdGVSZXNwb25zZUJ1aWxkZXIoKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQFVyaSgicmVzcG9uc2UvaW50ZXJuYWwiKQorICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0OworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImV4dGVybmFsIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGV4dGVybmFsKCkgeworICAgICAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2U7CisgICAgICAgICAgICBpZiAodGFyZ2V0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXNwb25zZSA9IFJlc3BvbnNlLnNlcnZlckVycm9yKCkuZW50aXR5KCJpbmplY3RlZCBXZWJUYXJnZXQgaXMgbnVsbCIpLmJ1aWxkKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5idWlsZEdldCgpLmludm9rZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiaW50ZXJuYWwiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGludGVybmFsKCkgeworICAgICAgICAgICAgcmV0dXJuICJpbnRlcm5hbCI7CisgICAgICAgIH0KKworICAgICAgICBAUFVUCisgICAgICAgIEBQYXRoKCJub3QtbW9kaWZpZWQtcHV0IikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIG5vdE1vZGlmaWVkUHV0KFN0cmluZyBkYXRhKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uubm90TW9kaWZpZWQoKS5lbnRpdHkoIm5vdC1tb2RpZmllZC0iICsgZGF0YSkuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzcG9uc2VUZXN0UmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEpFUlNFWS0xNTE2IHJlcHJvZHVjZXIuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tUmVzcG9uc2UoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJyZXNwb25zZSIpLnBhdGgoImN1c3RvbSIpLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICBhc3NlcnROb3ROdWxsKCJSZXNwb25zZSBpcyBudWxsLiIsIHJlc3BvbnNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHJlc3BvbnNlIHN0YXR1cy4iLCAyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHJlc3BvbnNlIGVudGl0eS4iLCAic3VicmVzcG9uc2UiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEpFUlNFWS0xNTI3IHJlcHJvZHVjZXIuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9TdGF0dXNSZXNwb25zZSgpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgicmVzcG9uc2UiKS5wYXRoKCJuby1zdGF0dXMte3BhcmFtfS1lbnRpdHkiKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2U7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQucmVzb2x2ZVRlbXBsYXRlKCJwYXJhbSIsICJ3aXRoIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJSZXNwb25zZSBpcyBudWxsLiIsIHJlc3BvbnNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHJlc3BvbnNlIHN0YXR1cy4iLCAyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHJlc3BvbnNlIGVudGl0eS4iLCAiMTIzNDU2Nzg5MCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQucmVzb2x2ZVRlbXBsYXRlKCJwYXJhbSIsICJ3aXRob3V0IikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJSZXNwb25zZSBpcyBudWxsLiIsIHJlc3BvbnNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHJlc3BvbnNlIHN0YXR1cy4iLCAyMDQsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlVuZXhwZWN0ZWQgbm9uLWVtcHR5IHJlc3BvbnNlIGVudGl0eS4iLCByZXNwb25zZS5oYXNFbnRpdHkoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSkVSU0VZLTE1MjggcmVwcm9kdWNlci4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROdWxsUmVzcG9uc2UoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJyZXNwb25zZSIpLnBhdGgoIm51bGwiKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiUmVzcG9uc2UgaXMgbnVsbC4iLCByZXNwb25zZSk7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCByZXNwb25zZSBzdGF0dXMuIiwgMjA0LCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKCJVbmV4cGVjdGVkIG5vbi1lbXB0eSByZXNwb25zZSBlbnRpdHkuIiwgcmVzcG9uc2UuaGFzRW50aXR5KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEpFUlNFWS0xNTMxIHJlcHJvZHVjZXIuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5ib3VuZE91dGJvdW5kUmVzcG9uc2VNaXhpbmcoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoInJlc3BvbnNlIikucGF0aCgiZXh0ZXJuYWwiKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2U7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnROb3ROdWxsKCJSZXNwb25zZSBpcyBudWxsLiIsIHJlc3BvbnNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHJlc3BvbnNlIHN0YXR1cy4iLCAyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHJlc3BvbnNlIGVudGl0eS4iLCAiaW50ZXJuYWwiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEpFUlNFWS04NDUgcmVwcm9kdWNlci4KKyAgICAgKgorICAgICAqIFZlcmlmaWVzIGNvbnNpc3RlbnQgYmVoYXZpb3Igb3ZlciB0aW1lICgid29ya3MgYXMgZGVzaWduZWQiKS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbnRpdHlJbk5vdE1vZGlmaWVkUHV0UmVzcG9zbmUoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoInJlc3BvbnNlIikucGF0aCgibm90LW1vZGlmaWVkLXB1dCIpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkucHV0KEVudGl0eS50ZXh0KCJwdXQtZGF0YSIpKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiUmVzcG9uc2UgaXMgbnVsbC4iLCByZXNwb25zZSk7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCByZXNwb25zZSBzdGF0dXMuIiwgUmVzcG9uc2UuU3RhdHVzLk5PVF9NT0RJRklFRC5nZXRTdGF0dXNDb2RlKCksIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgLy8gcmVzcG9uc2UgZW50aXR5IGlzIGRyb3BwZWQgYnkgc2VydmVyIGNvbnRhaW5lciBpbiBjb21wbGlhbmNlIHdpdGggSFRUUCAxLjEgc3BlYworICAgICAgICBhc3NlcnRGYWxzZSgiVW5leHBlY3RlZCByZXNwb25zZSBlbnRpdHkuIiwgcmVzcG9uc2UuaGFzRW50aXR5KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9SZXNwb25zZUludGVncmF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL1Jlc3BvbnNlSW50ZWdyYXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM2M2FiNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9SZXNwb25zZUludGVncmF0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTc1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmFwaTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFJlc3BvbnNlSW50ZWdyYXRpb25UZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlc3BvbnNlSW50ZWdyYXRpb25UZXN0LlJlc3BvbnNlVGVzdC5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuRk9MTE9XX1JFRElSRUNUUywgZmFsc2UpOworICAgIH0KKworICAgIEBQYXRoKHZhbHVlID0gIi9SZXNwb25zZVRlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzcG9uc2VUZXN0IHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcyh2YWx1ZSA9ICJ0ZXh0L3BsYWluIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHN0YXR1c1Rlc3QoQFF1ZXJ5UGFyYW0oInN0YXR1cyIpIGludCBzdGF0dXMpIHsKKyAgICAgICAgICAgIFJlc3BvbnNlIHJlczsKKyAgICAgICAgICAgIFJlc3BvbnNlLlJlc3BvbnNlQnVpbGRlciByZXNwOworCisgICAgICAgICAgICBzd2l0Y2ggKHN0YXR1cykgeworICAgICAgICAgICAgICAgIGNhc2UgMjAwOgorICAgICAgICAgICAgICAgICAgICByZXNwID0gUmVzcG9uc2Uub2soKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyMDQ6CisgICAgICAgICAgICAgICAgY2FzZSAyMDE6CisgICAgICAgICAgICAgICAgY2FzZSAyMDI6CisgICAgICAgICAgICAgICAgY2FzZSAzMDM6CisgICAgICAgICAgICAgICAgY2FzZSAzMDQ6CisgICAgICAgICAgICAgICAgY2FzZSAzMDc6CisgICAgICAgICAgICAgICAgY2FzZSA0MDA6CisgICAgICAgICAgICAgICAgY2FzZSA0MDE6CisgICAgICAgICAgICAgICAgY2FzZSA0MDM6CisgICAgICAgICAgICAgICAgY2FzZSA0MDQ6CisgICAgICAgICAgICAgICAgY2FzZSA0MDY6CisgICAgICAgICAgICAgICAgY2FzZSA0MDk6CisgICAgICAgICAgICAgICAgY2FzZSA0MTA6CisgICAgICAgICAgICAgICAgY2FzZSA0MTU6CisgICAgICAgICAgICAgICAgY2FzZSA1MDA6CisgICAgICAgICAgICAgICAgY2FzZSA1MDM6CisgICAgICAgICAgICAgICAgY2FzZSA0MTE6CisgICAgICAgICAgICAgICAgY2FzZSA0MTI6CisgICAgICAgICAgICAgICAgICAgIHJlc3AgPSBSZXNwb25zZS5zdGF0dXMoc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgcmVzcCA9IFJlc3BvbnNlLm9rKCkuZW50aXR5KCJVbmV4cGVjdGVkIHBhcmFtZXRlciBpbiByZXF1ZXN0OiAiICsgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJlcyA9IHJlc3AuaGVhZGVyKCJURVNUSEVBREVSIiwgInN0YXR1cyBjb2RlIGluIHJlcXVlc3QgPSAiICsgc3RhdHVzKS5idWlsZCgpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0U3RhdHVzKGludCBzdGF0dXMpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJSZXNwb25zZVRlc3QiKS5xdWVyeVBhcmFtKCJzdGF0dXMiLCBzdGF0dXMpLnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgICAgICAgICAgICAgLmdldChSZXNwb25zZS5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHN0YXR1cywgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0R2VuZXJpY1N0YXR1cyhpbnQgc3RhdHVzKSB7CisgICAgICAgIGZpbmFsIEdlbmVyaWNUeXBlPFJlc3BvbnNlPiBnZW5lcmljVHlwZSA9IG5ldyBHZW5lcmljVHlwZTw+KFJlc3BvbnNlLmNsYXNzKTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJSZXNwb25zZVRlc3QiKS5xdWVyeVBhcmFtKCJzdGF0dXMiLCBzdGF0dXMpLnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgICAgICAgICAgICAgLmdldChnZW5lcmljVHlwZSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHN0YXR1cywgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIC8qCisgICAgICogQ2xpZW50IHNlbmQgcmVxdWVzdCB0byBhIHJlc291cmNlLAorICAgICAqIHZlcmlmeSB0aGF0IGNvcnJlY3Qgc3RhdHVzIGNvZGUgcmV0dXJuZWQKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGF0dXNlcygpIHsKKyAgICAgICAgZmluYWwgaW50W10gc3RhdHVzZXMgPSBuZXcgaW50W10geworICAgICAgICAgICAgICAgIDIwMCwKKyAgICAgICAgICAgICAgICAyMDEsCisgICAgICAgICAgICAgICAgMjAyLAorICAgICAgICAgICAgICAgIDIwNCwKKyAgICAgICAgICAgICAgICAzMDMsCisgICAgICAgICAgICAgICAgMzA0LAorICAgICAgICAgICAgICAgIDMwNywKKyAgICAgICAgICAgICAgICA0MDEsCisgICAgICAgICAgICAgICAgNDAzLAorICAgICAgICAgICAgICAgIDQwNCwKKyAgICAgICAgICAgICAgICA0MDYsCisgICAgICAgICAgICAgICAgNDA5LAorICAgICAgICAgICAgICAgIDQxMCwKKyAgICAgICAgICAgICAgICA0MTEsCisgICAgICAgICAgICAgICAgNDEyLAorICAgICAgICAgICAgICAgIDQxNSwKKyAgICAgICAgICAgICAgICA1MDAsCisgICAgICAgICAgICAgICAgNTAzCisgICAgICAgIH07CisKKyAgICAgICAgZm9yIChJbnRlZ2VyIGkgOiBzdGF0dXNlcykgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIjIyMgVGVzdGluZyBzdGF0dXM6ICIgKyBpKTsKKyAgICAgICAgICAgIHRlc3RTdGF0dXMoaSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIENsaWVudCBzZW5kIHJlcXVlc3QgdG8gYSByZXNvdXJjZSwKKyAgICAgKiB2ZXJpZnkgdGhhdCBjb3JyZWN0IHN0YXR1cyBjb2RlIHJldHVybmVkCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJpY1N0YXR1c2VzKCkgeworICAgICAgICBmaW5hbCBpbnRbXSBzdGF0dXNlcyA9IG5ldyBpbnRbXSB7CisgICAgICAgICAgICAgICAgMjAwLAorICAgICAgICAgICAgICAgIDIwMSwKKyAgICAgICAgICAgICAgICAyMDIsCisgICAgICAgICAgICAgICAgMjA0LAorICAgICAgICAgICAgICAgIDMwMywKKyAgICAgICAgICAgICAgICAzMDQsCisgICAgICAgICAgICAgICAgMzA3LAorICAgICAgICAgICAgICAgIDQwMSwKKyAgICAgICAgICAgICAgICA0MDMsCisgICAgICAgICAgICAgICAgNDA0LAorICAgICAgICAgICAgICAgIDQwNiwKKyAgICAgICAgICAgICAgICA0MDksCisgICAgICAgICAgICAgICAgNDEwLAorICAgICAgICAgICAgICAgIDQxMSwKKyAgICAgICAgICAgICAgICA0MTIsCisgICAgICAgICAgICAgICAgNDE1LAorICAgICAgICAgICAgICAgIDUwMCwKKyAgICAgICAgICAgICAgICA1MDMKKyAgICAgICAgfTsKKworICAgICAgICBmb3IgKEludGVnZXIgaSA6IHN0YXR1c2VzKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiMjIyBUZXN0aW5nIHN0YXR1czogIiArIGkpOworICAgICAgICAgICAgdGVzdEdlbmVyaWNTdGF0dXMoaSk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9SZXNwb25zZVRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9SZXNwb25zZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTAxOGNjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL1Jlc3BvbnNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTA1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmFwaTsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29va2llOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk5ld0Nvb2tpZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVmFyaWFudDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUHJvcGVydGllc0hlbHBlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkhlYWRlclV0aWxzOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNwb25zZVRlc3QgeworCisgICAgLyoKKyAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgUmVzcG9uc2UgdXNpbmcgUmVzcG9uc2Uub2soU3RyaW5nLCBWYXJpYW50KS5idWlsZCgpCisgICAgICogdmVyaWZ5IHRoYXQgY29ycmVjdCBzdGF0dXMgY29kZSBpcyByZXR1cm5lZAorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgT2tUZXN0NSgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcDsKKyAgICAgICAgaW50IHN0YXR1cyA9IDIwMDsKKyAgICAgICAgU3RyaW5nIGNvbnRlbnQgPSAiVGVzdCBPbmx5IjsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGVuY29kaW5nID0gQXJyYXlzLmFzTGlzdCgiZ3ppcCIsICJjb21wcmVzcyIpOworICAgICAgICBMaXN0PFN0cmluZz4gbGFuZyA9IEFycmF5cy5hc0xpc3QoImVuLVVTIiwgImVuLUdCIiwgInpoLUNOIik7CisKKyAgICAgICAgTWVkaWFUeXBlIG10ID0gbmV3IE1lZGlhVHlwZSgidGV4dCIsICJwbGFpbiIpOworICAgICAgICBMaXN0PFZhcmlhbnQ+IHZ0cyA9IFZhcmlhbnQuVmFyaWFudExpc3RCdWlsZGVyLm5ld0luc3RhbmNlKCkubWVkaWFUeXBlcyhtdCkKKyAgICAgICAgICAgICAgICAubGFuZ3VhZ2VzKG5ldyBMb2NhbGUoImVuIiwgIlVTIiksIG5ldyBMb2NhbGUoImVuIiwgIkdCIiksCisgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTG9jYWxlKCJ6aCIsICJDTiIpKS5lbmNvZGluZ3MoKFN0cmluZ1tdKSBlbmNvZGluZy50b0FycmF5KCkpCisgICAgICAgICAgICAgICAgLmFkZCgpLmJ1aWxkKCk7CisKKyAgICAgICAgU3RyaW5nIHRtcDsKKyAgICAgICAgZm9yIChWYXJpYW50IHZ0IDogdnRzKSB7CisgICAgICAgICAgICByZXNwID0gUmVzcG9uc2Uub2soY29udGVudCwgdnQpLmJ1aWxkKCk7CisgICAgICAgICAgICB0bXAgPSB2ZXJpZnlSZXNwb25zZShyZXNwLCBjb250ZW50LCBzdGF0dXMsIGVuY29kaW5nLCBsYW5nLCBudWxsLAorICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIGlmICh0bXAuZW5kc1dpdGgoImZhbHNlIikpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiMjIyAiICsgdG1wKTsKKyAgICAgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBSZXNwb25zZSB1c2luZworICAgICAqIFJlc3BvbnNlLlJlc3BvbnNlQnVpbGRlci5jbG9uZSgpCisgICAgICogdmVyaWZ5IHRoYXQgY29ycmVjdCBzdGF0dXMgY29kZSBpcyByZXR1cm5lZAorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgY2xvbmVUZXN0KCkgdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKyAgICAgICAgaW50IHN0YXR1cyA9IDIwMDsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHR5cGUgPSBBcnJheXMuYXNMaXN0KCJ0ZXh0L3BsYWluIiwgInRleHQvaHRtbCIpOworICAgICAgICBMaXN0PFN0cmluZz4gZW5jb2RpbmcgPSBBcnJheXMuYXNMaXN0KCJnemlwIiwgImNvbXByZXNzIik7CisgICAgICAgIExpc3Q8U3RyaW5nPiBsYW5nID0gQXJyYXlzLmFzTGlzdCgiZW4tVVMiLCAiZW4tR0IiLCAiemgtQ04iKTsKKworICAgICAgICBTdHJpbmcgbmFtZSA9ICJuYW1lXzEiOworICAgICAgICBTdHJpbmcgdmFsdWUgPSAidmFsdWVfMSI7CisgICAgICAgIENvb2tpZSBjazEgPSBuZXcgQ29va2llKG5hbWUsIHZhbHVlKTsKKyAgICAgICAgTmV3Q29va2llIG5jazEgPSBuZXcgTmV3Q29va2llKGNrMSk7CisKKyAgICAgICAgTGlzdDxTdHJpbmc+IGNvb2tpZXMgPSBBcnJheXMuYXNMaXN0KG5jazEudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKTsKKworICAgICAgICBSZXNwb25zZS5SZXNwb25zZUJ1aWxkZXIgcmVzcGIxID0gUmVzcG9uc2Uuc3RhdHVzKHN0YXR1cykKKyAgICAgICAgICAgICAgICAuaGVhZGVyKCJDb250ZW50LXR5cGUiLCAidGV4dC9wbGFpbiIpLmhlYWRlcigiQ29udGVudC10eXBlIiwKKyAgICAgICAgICAgICAgICAidGV4dC9odG1sIikuaGVhZGVyKCJDb250ZW50LUxhbmd1YWdlIiwgImVuLVVTIikKKyAgICAgICAgICAgICAgICAuaGVhZGVyKCJDb250ZW50LUxhbmd1YWdlIiwgImVuLUdCIikuaGVhZGVyKCJDb250ZW50LUxhbmd1YWdlIiwKKyAgICAgICAgICAgICAgICAiemgtQ04iKS5oZWFkZXIoIkNhY2hlLUNvbnRyb2wiLCAibm8tdHJhbnNmb3JtIikKKyAgICAgICAgICAgICAgICAuaGVhZGVyKCJTZXQtQ29va2llIiwgIm5hbWVfMT12YWx1ZV8xO3ZlcnNpb249MSIpOworICAgICAgICBSZXNwb25zZS5SZXNwb25zZUJ1aWxkZXIgcmVzcGIyID0gcmVzcGIxLmNsb25lKCk7CisKKyAgICAgICAgUmVzcG9uc2UgcmVzcDIgPSByZXNwYjIuYnVpbGQoKTsKKworICAgICAgICBTdHJpbmcgdG1wID0gdmVyaWZ5UmVzcG9uc2UocmVzcDIsIG51bGwsIHN0YXR1cywgZW5jb2RpbmcsIGxhbmcsIHR5cGUsCisgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgY29va2llcyk7CisgICAgICAgIGlmICh0bXAuZW5kc1dpdGgoImZhbHNlIikpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiIyMjICIgKyBzYi50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfQorICAgICAgICBzYi5hcHBlbmQodG1wKS5hcHBlbmQobmV3bGluZSk7CisKKyAgICAgICAgU3RyaW5nIGNvbnRlbnQgPSAiVGVzdE9ubHkiOworICAgICAgICBSZXNwb25zZSByZXNwMSA9IHJlc3BiMS5lbnRpdHkoY29udGVudCkuY29va2llKChOZXdDb29raWUpIG51bGwpLmJ1aWxkKCk7CisgICAgICAgIHRtcCA9IHZlcmlmeVJlc3BvbnNlKHJlc3AxLCBjb250ZW50LCBzdGF0dXMsIGVuY29kaW5nLCBsYW5nLCB0eXBlLAorICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwpOworICAgICAgICBpZiAodG1wLmVuZHNXaXRoKCJmYWxzZSIpKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiMjIyAiICsgc2IudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0KKworICAgICAgICBNdWx0aXZhbHVlZE1hcDxqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0PiBtdnAgPQorICAgICAgICAgICAgICAgIHJlc3AxLmdldE1ldGFkYXRhKCk7CisgICAgICAgIGlmIChtdnAuY29udGFpbnNLZXkoIlNldC1Db29raWUiKSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCJSZXNwb25zZSBjb250YWlucyB1bmV4cGVjdGVkIFNldC1Db29raWU6ICIpLmFwcGVuZChtdnAuZ2V0Rmlyc3QoIlNldC1Db29raWUiKS50b1N0cmluZygpKS5hcHBlbmQobmV3bGluZSk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiMjIyAiICsgc2IudG9TdHJpbmcoKSk7CisgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgIH0KKyAgICAgICAgc2IuYXBwZW5kKHRtcCkuYXBwZW5kKG5ld2xpbmUpOworICAgIH0KKworICAgIC8qCisgICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFJlc3BvbnNlIHVzaW5nCisgICAgICogUmVzcG9uc2UuZnJvbVJlc3BvbnNlKFJlc3BvbnNlKS5idWlsZCgpCisgICAgICogdmVyaWZ5IHRoYXQgY29ycmVjdCBzdGF0dXMgY29kZSBpcyByZXR1cm5lZAorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZnJvbVJlc3BvbnNlVGVzdCgpIHsKKyAgICAgICAgaW50IHN0YXR1cyA9IDIwMDsKKyAgICAgICAgU3RyaW5nIGNvbnRlbnQgPSAiVGVzdCBPbmx5IjsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHR5cGUgPSBBcnJheXMuYXNMaXN0KCJ0ZXh0L3BsYWluIiwgInRleHQvaHRtbCIpOworICAgICAgICBMaXN0PFN0cmluZz4gZW5jb2RpbmcgPSBBcnJheXMuYXNMaXN0KCJnemlwIiwgImNvbXByZXNzIik7CisgICAgICAgIExpc3Q8U3RyaW5nPiBsYW5nID0gQXJyYXlzLmFzTGlzdCgiZW4tVVMiLCAiZW4tR0IiLCAiemgtQ04iKTsKKworICAgICAgICBNZWRpYVR5cGUgbXQxID0gbmV3IE1lZGlhVHlwZSgidGV4dCIsICJwbGFpbiIpOworICAgICAgICBNZWRpYVR5cGUgbXQyID0gbmV3IE1lZGlhVHlwZSgidGV4dCIsICJodG1sIik7CisgICAgICAgIExpc3Q8VmFyaWFudD4gdnRzID0gVmFyaWFudC5WYXJpYW50TGlzdEJ1aWxkZXIubmV3SW5zdGFuY2UoKS5tZWRpYVR5cGVzKG10MSwgbXQyKQorICAgICAgICAgICAgICAgIC5sYW5ndWFnZXMobmV3IExvY2FsZSgiZW4iLCAiVVMiKSwgbmV3IExvY2FsZSgiZW4iLCAiR0IiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBMb2NhbGUoInpoIiwgIkNOIikpLmVuY29kaW5ncygoU3RyaW5nW10pIGVuY29kaW5nLnRvQXJyYXkoKSkKKyAgICAgICAgICAgICAgICAuYWRkKCkuYnVpbGQoKTsKKworICAgICAgICBTdHJpbmcgdG1wOworICAgICAgICBmb3IgKFZhcmlhbnQgdnQgOiB2dHMpIHsKKyAgICAgICAgICAgIFJlc3BvbnNlIHJlc3AxID0gUmVzcG9uc2Uub2soY29udGVudCwgdnQpLmJ1aWxkKCk7CisgICAgICAgICAgICBSZXNwb25zZSByZXNwID0gUmVzcG9uc2UuZnJvbVJlc3BvbnNlKHJlc3AxKS5idWlsZCgpOworICAgICAgICAgICAgdG1wID0gdmVyaWZ5UmVzcG9uc2UocmVzcCwgY29udGVudCwgc3RhdHVzLCBlbmNvZGluZywgbGFuZywgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICBpZiAodG1wLmVuZHNXaXRoKCJmYWxzZSIpKSB7CisgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCIjIyMgIiArIHRtcCk7CisgICAgICAgICAgICAgICAgZmFpbCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgUmVzcG9uc2UgdXNpbmcKKyAgICAgKiBSZXNwb25zZS5SZXNwb25zZUJ1aWxkZXIuaGVhZGVyKFN0cmluZywgT2JqZWN0KS5idWlsZCgpCisgICAgICogdmVyaWZ5IHRoYXQgY29ycmVjdCBzdGF0dXMgY29kZSBpcyByZXR1cm5lZAorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgaGVhZGVyVGVzdCgpIHsKKyAgICAgICAgaW50IHN0YXR1cyA9IDIwMDsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHR5cGUgPSBBcnJheXMuYXNMaXN0KCJ0ZXh0L3BsYWluIiwgInRleHQvaHRtbCIpOworICAgICAgICBMaXN0PFN0cmluZz4gZW5jb2RpbmcgPSBBcnJheXMuYXNMaXN0KCJnemlwIiwgImNvbXByZXNzIik7CisgICAgICAgIExpc3Q8U3RyaW5nPiBsYW5nID0gQXJyYXlzLmFzTGlzdCgiZW4tVVMiLCAiZW4tR0IiLCAiemgtQ04iKTsKKworICAgICAgICBTdHJpbmcgbmFtZSA9ICJuYW1lXzEiOworICAgICAgICBTdHJpbmcgdmFsdWUgPSAidmFsdWVfMSI7CisgICAgICAgIENvb2tpZSBjazEgPSBuZXcgQ29va2llKG5hbWUsIHZhbHVlKTsKKyAgICAgICAgTmV3Q29va2llIG5jazEgPSBuZXcgTmV3Q29va2llKGNrMSk7CisKKyAgICAgICAgTGlzdDxTdHJpbmc+IGNvb2tpZXMgPSBBcnJheXMuYXNMaXN0KG5jazEudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKTsKKworICAgICAgICBSZXNwb25zZSByZXNwID0gUmVzcG9uc2Uuc3RhdHVzKHN0YXR1cykuaGVhZGVyKCJDb250ZW50LXR5cGUiLAorICAgICAgICAgICAgICAgICJ0ZXh0L3BsYWluIikuaGVhZGVyKCJDb250ZW50LXR5cGUiLCAidGV4dC9odG1sIikuaGVhZGVyKCJDb250ZW50LUxhbmd1YWdlIiwgImVuLVVTIikKKyAgICAgICAgICAgICAgICAuaGVhZGVyKCJDb250ZW50LUxhbmd1YWdlIiwgImVuLUdCIikuaGVhZGVyKCJDb250ZW50LUxhbmd1YWdlIiwKKyAgICAgICAgICAgICAgICAiemgtQ04iKS5oZWFkZXIoIkNhY2hlLUNvbnRyb2wiLCAibm8tdHJhbnNmb3JtIikKKyAgICAgICAgICAgICAgICAuaGVhZGVyKCJTZXQtQ29va2llIiwgIm5hbWVfMT12YWx1ZV8xO3ZlcnNpb249MSIpLmJ1aWxkKCk7CisgICAgICAgIFN0cmluZyB0bXAgPSB2ZXJpZnlSZXNwb25zZShyZXNwLCBudWxsLCBzdGF0dXMsIGVuY29kaW5nLCBsYW5nLCB0eXBlLAorICAgICAgICAgICAgICAgIG51bGwsIG51bGwsIGNvb2tpZXMpOworICAgICAgICBpZiAodG1wLmVuZHNXaXRoKCJmYWxzZSIpKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiMjIyAiICsgdG1wKTsKKyAgICAgICAgICAgIGZhaWwoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogQ3JlYXRlIGFuIGluc3RhbmNlIG9mIFJlc3BvbnNlIHVzaW5nCisgICAgICogUmVzcG9uc2Uuc3RhdHVzKGludCkudmFyaWFudChWYXJpYW50KS5idWlsZCgpCisgICAgICogdmVyaWZ5IHRoYXQgY29ycmVjdCBzdGF0dXMgY29kZSBpcyByZXR1cm5lZAorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdmFyaWFudFRlc3QoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3A7CisgICAgICAgIGludCBzdGF0dXMgPSAyMDA7CisgICAgICAgIExpc3Q8U3RyaW5nPiBlbmNvZGluZyA9IEFycmF5cy5hc0xpc3QoImd6aXAiLCAiY29tcHJlc3MiKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGxhbmcgPSBBcnJheXMuYXNMaXN0KCJlbi1VUyIsICJlbi1HQiIsICJ6aC1DTiIpOworCisgICAgICAgIE1lZGlhVHlwZSBtdCA9IG5ldyBNZWRpYVR5cGUoInRleHQiLCAicGxhaW4iKTsKKyAgICAgICAgTGlzdDxWYXJpYW50PiB2dHMgPSBWYXJpYW50LlZhcmlhbnRMaXN0QnVpbGRlci5uZXdJbnN0YW5jZSgpLm1lZGlhVHlwZXMobXQpCisgICAgICAgICAgICAgICAgLmxhbmd1YWdlcyhuZXcgTG9jYWxlKCJlbiIsICJVUyIpLCBuZXcgTG9jYWxlKCJlbiIsICJHQiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExvY2FsZSgiemgiLCAiQ04iKSkuZW5jb2RpbmdzKChTdHJpbmdbXSkgZW5jb2RpbmcudG9BcnJheSgpKQorICAgICAgICAgICAgICAgIC5hZGQoKS5idWlsZCgpOworCisgICAgICAgIFN0cmluZyB0bXA7CisgICAgICAgIGZvciAoVmFyaWFudCB2dCA6IHZ0cykgeworICAgICAgICAgICAgcmVzcCA9IFJlc3BvbnNlLnN0YXR1cyhzdGF0dXMpLnZhcmlhbnQodnQpLmJ1aWxkKCk7CisgICAgICAgICAgICB0bXAgPSB2ZXJpZnlSZXNwb25zZShyZXNwLCBudWxsLCBzdGF0dXMsIGVuY29kaW5nLCBsYW5nLCBudWxsLCBudWxsLAorICAgICAgICAgICAgICAgICAgICBudWxsLCBudWxsKTsKKyAgICAgICAgICAgIGlmICh0bXAuZW5kc1dpdGgoImZhbHNlIikpIHsKKyAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiMjIyAiICsgdG1wKTsKKyAgICAgICAgICAgICAgICBmYWlsKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgaW5kZW50ID0gIiAgICAiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBuZXdsaW5lID0gQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoUHJvcGVydGllc0hlbHBlci5nZXRTeXN0ZW1Qcm9wZXJ0eSgibGluZS5zZXBhcmF0b3IiKSk7CisKKyAgICBwcml2YXRlIFN0cmluZyB2ZXJpZnlSZXNwb25zZShSZXNwb25zZSByZXNwLCBTdHJpbmcgY29udGVudCwgaW50IHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gZW5jb2RpbmcsIExpc3Q8U3RyaW5nPiBsYW5ndWFnZSwgTGlzdDxTdHJpbmc+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdDxTdHJpbmc+IHZhciwgTGlzdDxTdHJpbmc+IGNjbCwgTGlzdDxTdHJpbmc+IGNvb2tpZXMpIHsKKyAgICAgICAgYm9vbGVhbiBwYXNzID0gdHJ1ZTsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKyAgICAgICAgc2IuYXBwZW5kKCI9PT09PT09PT09IFZlcmlmeWluZyBhIFJlc3BvbnNlOiAiKS5hcHBlbmQobmV3bGluZSk7CisKKyAgICAgICAgU3RyaW5nIHRtcCA9IHZlcmlmeVJlc3BvbnNlKHJlc3AsIGNvbnRlbnQsIHN0YXR1cywgbnVsbCk7CisgICAgICAgIHNiLmFwcGVuZChpbmRlbnQpLmFwcGVuZCh0bXApLmFwcGVuZChuZXdsaW5lKTsKKyAgICAgICAgaWYgKHRtcC5lbmRzV2l0aCgiZmFsc2UiKSkgeworICAgICAgICAgICAgcGFzcyA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IG12cCA9IEhlYWRlclV0aWxzLmFzU3RyaW5nSGVhZGVycygKKyAgICAgICAgICAgICAgICByZXNwLmdldE1ldGFkYXRhKCkpOworCisgICAgICAgIGZvciAoU3RyaW5nIGtleSA6IG12cC5rZXlTZXQoKSkgeworICAgICAgICAgICAgc2IuYXBwZW5kKGluZGVudCArICJQcm9jZXNzaW5nIEtleSBmb3VuZCBpbiByZXNwb25zZTogIikuYXBwZW5kKGtleSkuYXBwZW5kKCI6ICIpLmFwcGVuZChtdnAuZ2V0KGtleSkpLmFwcGVuZCgiOyAiKQorICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKG5ld2xpbmUpOworCisgICAgICAgICAgICBpZiAoa2V5LmVxdWFsc0lnbm9yZUNhc2UoIlZhcnkiKSkgeworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHZhbHVlIDogdmFyKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhY3R1YWwgPSBtdnAuZ2V0KGtleSkudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWFjdHVhbC5jb250YWlucyh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChpbmRlbnQgKyBpbmRlbnQgKyAiRXhwZWN0ZWQgaGVhZGVyICIpLmFwcGVuZCh2YWx1ZSkuYXBwZW5kKCIgbm90IHNldCBpbiBWYXJ5LiIpLmFwcGVuZChuZXdsaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChpbmRlbnQgKyBpbmRlbnQgKyAiRm91bmQgZXhwZWN0ZWQgaGVhZGVyICIpLmFwcGVuZCh2YWx1ZSkuYXBwZW5kKCIuIikuYXBwZW5kKG5ld2xpbmUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZW5jb2RpbmcgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChrZXkuZXF1YWxzSWdub3JlQ2FzZSgiQ29udGVudC1lbmNvZGluZyIpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IGVuYyA6IG12cC5nZXQoa2V5KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbmNvZGluZy5jb250YWlucyhlbmMudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoaW5kZW50ICsgaW5kZW50ICsgIkVuY29kaW5nIHRlc3QgZmFpbGVkOiAiKS5hcHBlbmQobmV3bGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsYW5ndWFnZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKCJDb250ZW50LWxhbmd1YWdlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgbGFuZyA6IG12cC5nZXQoa2V5KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFsYW5ndWFnZS5jb250YWlucyhsYW5nKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoaW5kZW50ICsgaW5kZW50ICsgImxhbmd1YWdlIHRlc3QgZmFpbGVkOiAiKS5hcHBlbmQobGFuZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIiBpcyBub3QgZXhwZWN0ZWQgaW4gUmVzcG9uc2UiKS5hcHBlbmQobmV3bGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgdHQgOiBsYW5ndWFnZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoaW5kZW50ICsgaW5kZW50ICsgIkV4cGVjdGluZyBDb250ZW50LUxhbmd1YWdlICIpLmFwcGVuZCh0dCkuYXBwZW5kKG5ld2xpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHR5cGUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGlmIChrZXkuZXF1YWxzSWdub3JlQ2FzZSgiQ29udGVudC1UeXBlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChPYmplY3QgbGFuZyA6IG12cC5nZXQoa2V5KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0eXBlLmNvbnRhaW5zKGxhbmcudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoaW5kZW50ICsgaW5kZW50ICsgIkNvbnRlbnQtVHlwZSB0ZXN0IGZhaWxlZDogIikuYXBwZW5kKGxhbmcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIgaXMgbm90IGV4cGVjdGVkIGluIFJlc3BvbnNlIikuYXBwZW5kKG5ld2xpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY2NsICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyB0dCA6IGNjbCkgeworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIkV4cGVjdGluZyBDYWNoZS1Db250cm9sICIpLmFwcGVuZCh0dCkuYXBwZW5kKG5ld2xpbmUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoa2V5LmVxdWFsc0lnbm9yZUNhc2UoIkNhY2hlLUNvbnRyb2wiKSkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKE9iamVjdCBhbGxfY2NsIDogbXZwLmdldChrZXkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBjYyA6IGNjbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGFsbF9jY2wudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLmNvbnRhaW5zKGNjLnRvTG93ZXJDYXNlKCkpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChpbmRlbnQgKyBpbmRlbnQgKyAiQ2FjaGUtQ29udHJvbCB0ZXN0IGZhaWxlZDogIikuYXBwZW5kKGNjKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIiBpcyBub3QgZm91bmQgaW4gUmVzcG9uc2UuIikuYXBwZW5kKG5ld2xpbmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvb2tpZXMgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHR0IDogY29va2llcykgeworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoaW5kZW50ICsgaW5kZW50ICsgIkV4cGVjdGluZyBTZXQtQ29va2llIikuYXBwZW5kKHR0KS5hcHBlbmQobmV3bGluZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChrZXkuZXF1YWxzSWdub3JlQ2FzZSgiU2V0LUNvb2tpZSIpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoT2JqZWN0IG5ja19hY3R1YWwgOiBtdnAuZ2V0KGtleSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChpbmRlbnQgKyBpbmRlbnQgKyAiUHJvY2Vzc2luZyAiKS5hcHBlbmQobmNrX2FjdHVhbC50b1N0cmluZygpKS5hcHBlbmQobmV3bGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvb2tpZXMuY29udGFpbnMobmNrX2FjdHVhbC50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoIiAiLCAiIikpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChpbmRlbnQgKyBpbmRlbnQgKyAiU2V0LUNvb2tpZSB0ZXN0IGZhaWxlZDogIikuYXBwZW5kKG5ja19hY3R1YWwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIgaXMgbm90IGV4cGVjdGVkIGluIFJlc3BvbnNlLiIpLmFwcGVuZChuZXdsaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGluZGVudCArIGluZGVudCArICJFeHBlY3RlZCBTZXQtQ29va2llOiAiKS5hcHBlbmQobmNrX2FjdHVhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIiBpcyBmb3VuZCBpbiBSZXNwb25zZS4iKS5hcHBlbmQobmV3bGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzYi5hcHBlbmQoaW5kZW50KS5hcHBlbmQocGFzcyk7CisKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgdmVyaWZ5UmVzcG9uc2UoUmVzcG9uc2UgcmVzcCwgU3RyaW5nIGNvbnRlbnQsIGludCBzdGF0dXMsIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+IGV4cGVjdGVkX21hcCkgeworICAgICAgICBib29sZWFuIHBhc3MgPSB0cnVlOworICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworICAgICAgICBzYi5hcHBlbmQoIj09PT09PT09PT0gVmVyaWZ5aW5nIGEgUmVzcG9uc2Ugd2l0aCBNYXA6ICIpLmFwcGVuZChuZXdsaW5lKTsKKworICAgICAgICBpZiAoKGNvbnRlbnQgPT0gbnVsbCkgfHwgKGNvbnRlbnQuZXF1YWxzKCIiKSkpIHsKKyAgICAgICAgICAgIGlmICghKHJlc3AuZ2V0RW50aXR5KCkgPT0gbnVsbCkgfHwgIiIuZXF1YWxzKHJlc3AuZ2V0RW50aXR5KCkpKSB7CisgICAgICAgICAgICAgICAgcGFzcyA9IGZhbHNlOworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChpbmRlbnQgKyAiRW50aXR5IHZlcmlmaWNhdGlvbiBmYWlsZWQ6IGV4cGVjdGluZyBubyBjb250ZW50LCBnb3QgIikuYXBwZW5kKChTdHJpbmcpIHJlc3AuZ2V0RW50aXR5KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKG5ld2xpbmUpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCFjb250ZW50LmVxdWFscyhyZXNwLmdldEVudGl0eSgpKSkgeworICAgICAgICAgICAgcGFzcyA9IGZhbHNlOworICAgICAgICAgICAgc2IuYXBwZW5kKGluZGVudCArICJFbnRpdHkgdmVyaWZpY2F0aW9uIGZhaWxlZDogZXhwZWN0aW5nICIpLmFwcGVuZChjb250ZW50KS5hcHBlbmQoIiwgZ290ICIpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoKFN0cmluZykgcmVzcC5nZXRFbnRpdHkoKSkuYXBwZW5kKG5ld2xpbmUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2IuYXBwZW5kKGluZGVudCArICJDb3JyZWN0IGNvbnRlbnQgZm91bmQgaW4gUmVzcG9uc2U6ICIpLmFwcGVuZCgoU3RyaW5nKSByZXNwLmdldEVudGl0eSgpKS5hcHBlbmQobmV3bGluZSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVzcC5nZXRTdGF0dXMoKSAhPSBzdGF0dXMpIHsKKyAgICAgICAgICAgIHBhc3MgPSBmYWxzZTsKKyAgICAgICAgICAgIHNiLmFwcGVuZChpbmRlbnQgKyAiU3RhdHVzIGNvZGUgdmVyaWZpY2F0aW9uIGZhaWxlZDogZXhwZWN0aW5nICIpLmFwcGVuZChzdGF0dXMpLmFwcGVuZCgiLCBnb3QgIikKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChyZXNwLmdldFN0YXR1cygpKS5hcHBlbmQobmV3bGluZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoaW5kZW50ICsgIkNvcnJlY3Qgc3RhdHVzIGZvdW5kIGluIFJlc3BvbnNlOiAiKS5hcHBlbmQoc3RhdHVzKS5hcHBlbmQobmV3bGluZSk7CisgICAgICAgIH0KKworICAgICAgICBNdWx0aXZhbHVlZE1hcDxqYXZhLmxhbmcuU3RyaW5nLCBqYXZhLmxhbmcuT2JqZWN0PiBtdnAgPQorICAgICAgICAgICAgICAgIHJlc3AuZ2V0TWV0YWRhdGEoKTsKKyAgICAgICAgaWYgKGV4cGVjdGVkX21hcCA9PSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoaW5kZW50ICsgIk5vIGtleXMgdG8gdmVyaWZ5IG9yIGV4cGVjdGVkLCBidXQgZm91bmQgdGhlIGZvbGxvd2luZyBrZXlzIGluIFJlc3BvbnNlOiIpLmFwcGVuZChuZXdsaW5lKTsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIGtleSA6IG12cC5rZXlTZXQoKSkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZChpbmRlbnQgKyBpbmRlbnQgKyAiS2V5OiAiKS5hcHBlbmQoa2V5KS5hcHBlbmQoIjsgIikuYXBwZW5kKG12cC5nZXRGaXJzdChrZXkpKS5hcHBlbmQoIjsiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChuZXdsaW5lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIGtleV9hY3R1YWwgOiBtdnAua2V5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoaW5kZW50ICsgIlJlc3BvbnNlIGNvbnRhaW5zIGtleTogIikuYXBwZW5kKGtleV9hY3R1YWwpLmFwcGVuZChuZXdsaW5lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNiLmFwcGVuZChpbmRlbnQgKyAiVmVyaWZ5aW5nIHRoZSBmb2xsb3dpbmcga2V5cyBpbiBSZXNwb25zZToiKS5hcHBlbmQobmV3bGluZSk7CisgICAgICAgICAgICBTdHJpbmcgYWN0dWFsLCBleHBlY3RlZDsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIGtleSA6IGV4cGVjdGVkX21hcC5rZXlTZXQoKSkgeworICAgICAgICAgICAgICAgIGlmICghbXZwLmNvbnRhaW5zS2V5KGtleSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFzcyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoaW5kZW50ICsgaW5kZW50ICsgIktleTogIikuYXBwZW5kKGtleSkuYXBwZW5kKCIgaXMgbm90IGZvdW5kIGluIFJlc3BvbnNlOyIpLmFwcGVuZChuZXdsaW5lKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtleS5lcXVhbHNJZ25vcmVDYXNlKCJsYXN0LW1vZGlmaWVkIikpIHsKKyAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGluZGVudCArIGluZGVudCArICJLZXkgTGFzdC1Nb2RpZmllZCBpcyBmb3VuZCBpbiByZXNwb25zZSIpLmFwcGVuZChuZXdsaW5lKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCA9IGV4cGVjdGVkX21hcC5nZXQoa2V5KS50b0xvd2VyQ2FzZSgpOworICAgICAgICAgICAgICAgICAgICBhY3R1YWwgPSBtdnAuZ2V0Rmlyc3Qoa2V5KS50b1N0cmluZygpLnRvTG93ZXJDYXNlKCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjdHVhbC5zdGFydHNXaXRoKCJcIiIpICYmIGFjdHVhbC5lbmRzV2l0aCgiXCIiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsID0gYWN0dWFsLnN1YnN0cmluZygxLCBhY3R1YWwubGVuZ3RoKCkgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmICghYWN0dWFsLmVxdWFscyhleHBlY3RlZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhc3MgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChpbmRlbnQgKyBpbmRlbnQgKyAiS2V5OiAiKS5hcHBlbmQoa2V5KS5hcHBlbmQoIiBmb3VuZCBpbiBSZXNwb25zZSwgYnV0IHdpdGggZGlmZmVyZW50IHZhbHVlOyIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQobmV3bGluZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoaW5kZW50ICsgaW5kZW50ICsgIkV4cGVjdGluZyAiKS5hcHBlbmQoZXhwZWN0ZWRfbWFwLmdldChrZXkpKS5hcHBlbmQoIjsgZ290ICIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQobXZwLmdldEZpcnN0KGtleSkpLmFwcGVuZChuZXdsaW5lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzYi5hcHBlbmQoaW5kZW50ICsgaW5kZW50ICsgIlByb2Nlc3NlZCBrZXkgIikuYXBwZW5kKGtleSkuYXBwZW5kKCIgd2l0aCBleHBlY3RlZCB2YWx1ZSAiKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoZXhwZWN0ZWRfbWFwLmdldChrZXkpKS5hcHBlbmQobmV3bGluZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNiLmFwcGVuZChpbmRlbnQpLmFwcGVuZChwYXNzKTsKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWxsb3dTdHJpbmcoKSB7CisgICAgICAgIFJlc3BvbnNlLlJlc3BvbnNlQnVpbGRlciByZXNwb25zZUJ1aWxkZXIgPSBSZXNwb25zZS5vaygpOworCisgICAgICAgIHJlc3BvbnNlQnVpbGRlciA9IHJlc3BvbnNlQnVpbGRlci5hbGxvdygiR0VUIik7CisgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VCdWlsZGVyLmJ1aWxkKCkuZ2V0SGVhZGVyU3RyaW5nKEh0dHBIZWFkZXJzLkFMTE9XKS5jb250YWlucygiR0VUIikpOworICAgICAgICByZXNwb25zZUJ1aWxkZXIgPSByZXNwb25zZUJ1aWxkZXIuYWxsb3coKFN0cmluZykgbnVsbCk7CisgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2VCdWlsZGVyLmJ1aWxkKCkuZ2V0SGVhZGVyU3RyaW5nKEh0dHBIZWFkZXJzLkFMTE9XKSA9PSBudWxsKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBbGxvd1NldCgpIHsKKyAgICAgICAgUmVzcG9uc2UuUmVzcG9uc2VCdWlsZGVyIHJlc3BvbnNlQnVpbGRlciA9IFJlc3BvbnNlLm9rKCk7CisKKyAgICAgICAgcmVzcG9uc2VCdWlsZGVyID0gcmVzcG9uc2VCdWlsZGVyLmFsbG93KG5ldyBIYXNoU2V0PD4oQXJyYXlzLmFzTGlzdCgiR0VUIikpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZUJ1aWxkZXIuYnVpbGQoKS5nZXRIZWFkZXJTdHJpbmcoSHR0cEhlYWRlcnMuQUxMT1cpLmNvbnRhaW5zKCJHRVQiKSk7CisgICAgICAgIHJlc3BvbnNlQnVpbGRlciA9IHJlc3BvbnNlQnVpbGRlci5hbGxvdygoU2V0PFN0cmluZz4pIG51bGwpOworICAgICAgICBhc3NlcnRFcXVhbHMobnVsbCwgcmVzcG9uc2VCdWlsZGVyLmJ1aWxkKCkuZ2V0SGVhZGVyU3RyaW5nKEh0dHBIZWFkZXJzLkFMTE9XKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWxsb3dWYXJpYW50KCkgeworICAgICAgICBSZXNwb25zZS5SZXNwb25zZUJ1aWxkZXIgcmVzcG9uc2VCdWlsZGVyID0gUmVzcG9uc2Uub2soKTsKKworICAgICAgICByZXNwb25zZUJ1aWxkZXIgPSByZXNwb25zZUJ1aWxkZXIuYWxsb3cobmV3IEhhc2hTZXQ8PihBcnJheXMuYXNMaXN0KCJHRVQiKSkpOworICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlQnVpbGRlci5idWlsZCgpLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5BTExPVykuY29udGFpbnMoIkdFVCIpKTsKKyAgICAgICAgcmVzcG9uc2VCdWlsZGVyID0gcmVzcG9uc2VCdWlsZGVyLmFsbG93KChTdHJpbmdbXSkgbnVsbCk7CisgICAgICAgIGFzc2VydEVxdWFscyhudWxsLCByZXNwb25zZUJ1aWxkZXIuYnVpbGQoKS5nZXRIZWFkZXJTdHJpbmcoSHR0cEhlYWRlcnMuQUxMT1cpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGJ1ZmZlckVudGl0eVRlc3QoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gUmVzcG9uc2Uub2soKS5idWlsZCgpOworICAgICAgICByZXNwb25zZS5jbG9zZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVzcG9uc2UuYnVmZmVyRW50aXR5KCk7CisgICAgICAgICAgICBmYWlsKCJJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXhwZWN0ZWQgd2hlbiByZWFkaW5nIGVudGl0eSBhZnRlciByZXNwb25zZSBoYXMgYmVlbiBjbG9zZWQuIik7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgLy8gZXhwZWN0ZWQKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZ2V0RW50aXR5VGVzdCgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSBSZXNwb25zZS5vaygpLmJ1aWxkKCk7CisgICAgICAgIHJlc3BvbnNlLmNsb3NlKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXNwb25zZS5nZXRFbnRpdHkoKTsKKyAgICAgICAgICAgIGZhaWwoIklsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBleHBlY3RlZCB3aGVuIHJlYWRpbmcgZW50aXR5IGFmdGVyIHJlc3BvbnNlIGhhcyBiZWVuIGNsb3NlZC4iKTsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAvLyBleHBlY3RlZAorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBoYXNFbnRpdHlUZXN0KCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IFJlc3BvbnNlLm9rKCkuYnVpbGQoKTsKKyAgICAgICAgcmVzcG9uc2UuY2xvc2UoKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJlc3BvbnNlLmhhc0VudGl0eSgpOworICAgICAgICAgICAgZmFpbCgiSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGV4cGVjdGVkIHdoZW4gcmVhZGluZyBlbnRpdHkgYWZ0ZXIgcmVzcG9uc2UgaGFzIGJlZW4gY2xvc2VkLiIpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIC8vIGV4cGVjdGVkCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBSZXByb2R1Y2VyIGZvciBKRVJTRVktMTU1MworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZhcmlhbnRzKCkgeworICAgICAgICBMaXN0PFN0cmluZz4gZW5jb2RpbmcgPSBBcnJheXMuYXNMaXN0KCJnemlwIiwgImNvbXByZXNzIik7CisgICAgICAgIExpc3Q8VmFyaWFudD4gbGlzdCA9IFZhcmlhbnQuVmFyaWFudExpc3RCdWlsZGVyCisgICAgICAgICAgICAgICAgLm5ld0luc3RhbmNlKCkKKyAgICAgICAgICAgICAgICAubWVkaWFUeXBlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKQorICAgICAgICAgICAgICAgIC5sYW5ndWFnZXMobmV3IExvY2FsZSgiZW4iLCAiVVMiKSwgbmV3IExvY2FsZSgiZW4iLCAiR0IiKSkKKyAgICAgICAgICAgICAgICAuZW5jb2RpbmdzKGVuY29kaW5nLnRvQXJyYXkobmV3IFN0cmluZ1tlbmNvZGluZy5zaXplKCldKSkuYWRkKCkuYnVpbGQoKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSByMSA9IFJlc3BvbnNlLm9rKCkudmFyaWFudHMobGlzdCkuYnVpbGQoKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbChyMSk7CisgICAgICAgIGFzc2VydE5vdE51bGwocjEuZ2V0SGVhZGVyU3RyaW5nKEh0dHBIZWFkZXJzLlZBUlkpKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSByMiA9IFJlc3BvbnNlLm9rKCkudmFyaWFudHMobGlzdC50b0FycmF5KG5ldyBWYXJpYW50W2xpc3Quc2l6ZSgpXSkpLmJ1aWxkKCk7CisgICAgICAgIGFzc2VydE5vdE51bGwocjIpOworICAgICAgICBhc3NlcnROb3ROdWxsKHIyLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5WQVJZKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL1Jlc3RyaWN0ZWRIZWFkZXJUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvUmVzdHJpY3RlZEhlYWRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjU2OGJkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL1Jlc3RyaWN0ZWRIZWFkZXJUZXN0LmphdmEKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuYXBpOworCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuSW52b2NhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5hcGFjaGUuY29ubmVjdG9yLkFwYWNoZUNvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGVzdCBzZXR0aW5nIGhlYWRlcnMgdGhhdCBhcmUgcmVzdHJpY3RlZCBieSB7QGxpbmsgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb259LgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIFJlc3RyaWN0ZWRIZWFkZXJUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihSZXN0cmljdGVkSGVhZGVyVGVzdC5jbGFzcy5nZXROYW1lKCkpOworCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0T3B0aW9ucyhAQ29udGV4dCBIdHRwSGVhZGVycyBoZWFkZXJzKSB7CisgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gcmVxdWVzdEhlYWRlcnMgPSBoZWFkZXJzLmdldFJlcXVlc3RIZWFkZXJzKCk7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkhlYWRlcnM6ICIgKyByZXF1ZXN0SGVhZGVycyk7CisgICAgICAgICAgICBpZiAocmVxdWVzdEhlYWRlcnMuY29udGFpbnNLZXkoIk9yaWdpbiIpIHx8IHJlcXVlc3RIZWFkZXJzLmNvbnRhaW5zS2V5KCJBY2Nlc3MtQ29udHJvbC1SZXF1ZXN0LU1ldGhvZCIpKSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmluZm8oIkNPUlMgaGVhZGVycyBmb3VuZC4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soKS5idWlsZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTE9HR0VSLmluZm8oIkNPUlMgaGVhZGVycyBhcmUgbWlzc2luZy4gIik7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc2VydmVyRXJyb3IoKS5lbnRpdHkoIkNPUlMgaGVhZGVycyBhcmUgbWlzc2luZyIpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKE15UmVzb3VyY2UuY2xhc3MsIExvZ2dpbmdGZWF0dXJlLmNsYXNzKTsKKyAgICB9CisKKyAgICBASWdub3JlKCJUaGUgc2V0dGluZyBvZiBhbGxvd1Jlc3RyaWN0ZWRIZWFkZXJzIHN5c3RlbSBwcm9wZXJ0eSBpcyBnbG9iYWwgYW5kIGNhY2hlZC4gT25seSAiCisgICAgICAgICAgICArICJvbmUgb2YgYm90aCB0ZXN0Rm9yYmlkZGVuSGVhZGVyc05vdEFsbG93ZWQoKSBhbmQgdGVzdEZvcmJpZGRlbkhlYWRlcnNBbGxvd2VkKCkgY2FuIGJlIHJ1biBkdXJpbmcgb25lIHRlc3QuIikKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JiaWRkZW5IZWFkZXJzTm90QWxsb3dlZCgpIHsKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KCk7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGVzdEhlYWRlcnMoY2xpZW50KTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBzZW5kaW5nIG9mIHJlc3RyaWN0ZWQgaGVhZGVycyAoT3JpZ2luIGFuZCBBY2Nlc3MtQ29udHJvbC1SZXF1ZXN0LU1ldGhvZCkgd2hpY2ggYXJlCisgICAgICogdXNlZCBmb3IgQ09SUy4gVGhlc2UgaGVhZGVycyBhcmUgYnkgZGVmYXVsdCBza2lwcGVkIGJ5IHRoZSB7QGxpbmsgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb259LgorICAgICAqIFRoZSBzeXN0ZW0gcHJvcGVydHkge0Bjb2RlIHN1bi5uZXQuaHR0cC5hbGxvd1Jlc3RyaWN0ZWRIZWFkZXJzfSBtdXN0IGJlIGRlZmluZWQgaW4gb3JkZXIgdG8KKyAgICAgKiBhbGxvdyB0aGVzZSBoZWFkZXJzLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZvcmJpZGRlbkhlYWRlcnNBbGxvd2VkKCkgeworICAgICAgICBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKTsKKyAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJzdW4ubmV0Lmh0dHAuYWxsb3dSZXN0cmljdGVkSGVhZGVycyIsICJ0cnVlIik7CisKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0ZXN0SGVhZGVycyhjbGllbnQpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4ocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTYW1lIGFzIHtAbGluayAjdGVzdEZvcmJpZGRlbkhlYWRlcnNBbGxvd2VkKCl9ICgpfSBidXQgdXNlcyB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuYXBhY2hlLmNvbm5lY3RvcgorICAgICAqIC5BcGFjaGVDb25uZWN0b3J9IGNvbm5lY3RvcgorICAgICAqIHdoaWNoIGFsbG93cyBtb2RpZmljYXRpb24gb2YgdGhlc2UgaGVhZGVycy4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JiaWRkZW5IZWFkZXJzV2l0aEFwYWNoZUNvbm5lY3RvcigpIHsKKyAgICAgICAgQ2xpZW50Q29uZmlnIGNsaWVudENvbmZpZyA9IG5ldyBDbGllbnRDb25maWcoKTsKKyAgICAgICAgY2xpZW50Q29uZmlnLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBBcGFjaGVDb25uZWN0b3JQcm92aWRlcigpKTsKKyAgICAgICAgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KGNsaWVudENvbmZpZyk7CisgICAgICAgIHRlc3RIZWFkZXJzKGNsaWVudCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBSZXNwb25zZSB0ZXN0SGVhZGVycyhDbGllbnQgY2xpZW50KSB7CisgICAgICAgIGNsaWVudC5yZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIEludm9jYXRpb24uQnVpbGRlciBidWlsZGVyID0gY2xpZW50LnRhcmdldChnZXRCYXNlVXJpKCkpLnBhdGgoIi8iKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAuaGVhZGVyKCJPcmlnaW4iLCAiaHR0cDovL2V4YW1wbGUuY29tIikKKyAgICAgICAgICAgICAgICAuaGVhZGVyKCJBY2Nlc3MtQ29udHJvbC1SZXF1ZXN0LU1ldGhvZCIsICJQT1NUIikKKyAgICAgICAgICAgICAgICAuaGVhZGVyKCJUZXN0dXMiLCAiSGVsbG8iKTsKKyAgICAgICAgcmV0dXJuIGJ1aWxkZXIuZ2V0KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL1NvdXJjZUVudGl0eVByb3ZpZGVyVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL1NvdXJjZUVudGl0eVByb3ZpZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3YjYxNzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvU291cmNlRW50aXR5UHJvdmlkZXJUZXN0LmphdmEKQEAgLTAsMCArMSwyMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuYXBpOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBVVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlLlN0YXR1czsKKworaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7CitpbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0OworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvcjsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7CitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYU291cmNlOworaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKK2ltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnQ7CitpbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7CitpbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIFRlc3Qgb2Yge0BsaW5rIGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlIFNvdXJjZX0gTWVzc2FnZUJvZHkgUHJvdmlkZXIKKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKgorICovCitwdWJsaWMgY2xhc3MgU291cmNlRW50aXR5UHJvdmlkZXJUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgcHJlZml4ID0gIjw/eG1sIHZlcnNpb249XCIxLjBcIiBlbmNvZGluZz1cIlVURi04XCIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyB4ZGtQcmVmaXggPSAiPD94bWwgdmVyc2lvbiA9ICcxLjAnIGVuY29kaW5nID0gJ1VURi04Jz8+IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgZW50aXR5ID0gcHJlZml4ICsgIj8+PHRlc3Q+PGFhYS8+PC90ZXN0PiI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFRlc3RSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGV4dHJhY3RDb250ZW50KFNvdXJjZSBzb3VyY2UpIHRocm93cyBUcmFuc2Zvcm1lckZhY3RvcnlDb25maWd1cmF0aW9uRXJyb3IsCisgICAgICAgICAgICBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFRyYW5zZm9ybWVyRXhjZXB0aW9uIHsKKyAgICAgICAgVHJhbnNmb3JtZXJGYWN0b3J5IHRyYW5zRmFjdG9yeSA9IFRyYW5zZm9ybWVyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworCisgICAgICAgIC8vIGlkZW50aXR5IHRyYW5zZm9ybWF0aW9uCisgICAgICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyID0gdHJhbnNGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKCk7CisKKyAgICAgICAgU3RyaW5nV3JpdGVyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKKyAgICAgICAgUmVzdWx0IHJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQod3JpdGVyKTsKKyAgICAgICAgdHJhbnNmb3JtZXIudHJhbnNmb3JtKHNvdXJjZSwgcmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIHdyaXRlci50b1N0cmluZygpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc291cmNlUHJvdmlkZXJUZXN0KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFRyYW5zZm9ybWVyRmFjdG9yeUNvbmZpZ3VyYXRpb25FcnJvciwKKyAgICAgICAgICAgIFRyYW5zZm9ybWVyRXhjZXB0aW9uIHsKKyAgICAgICAgU291cmNlIHNvdXJjZSA9IG5ldyBTdHJlYW1Tb3VyY2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGVudGl0eS5nZXRCeXRlcygpKSk7CisKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0IikucGF0aCgic291cmNlIikucmVxdWVzdCgpLnB1dChFbnRpdHkuZW50aXR5KHNvdXJjZSwgTWVkaWFUeXBlLlRFWFRfWE1MX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFN0YXR1cy5PSy5nZXRTdGF0dXNDb2RlKCksIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykuc3RhcnRzV2l0aChTdHJlYW1Tb3VyY2UuY2xhc3MudG9TdHJpbmcoKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc3RyZWFtUHJvdmlkZXJUZXN0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyZWFtU291cmNlIHNvdXJjZSA9IG5ldyBTdHJlYW1Tb3VyY2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGVudGl0eS5nZXRCeXRlcygpKSk7CisKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0IikucGF0aCgic3RyZWFtIikucmVxdWVzdCgpLnB1dChFbnRpdHkuZW50aXR5KHNvdXJjZSwgTWVkaWFUeXBlLlRFWFRfWE1MX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFN0YXR1cy5PSy5nZXRTdGF0dXNDb2RlKCksIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykuc3RhcnRzV2l0aChTdHJlYW1Tb3VyY2UuY2xhc3MudG9TdHJpbmcoKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgc2F4UHJvdmlkZXJUZXN0KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24geworICAgICAgICBTQVhTb3VyY2Ugc291cmNlID0gY3JlYXRlU0FYU291cmNlKGVudGl0eSk7CisKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0IikucGF0aCgic2F4IikucmVxdWVzdCgpLnB1dChFbnRpdHkuZW50aXR5KHNvdXJjZSwgTWVkaWFUeXBlLlRFWFRfWE1MX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFN0YXR1cy5PSy5nZXRTdGF0dXNDb2RlKCksIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykuc3RhcnRzV2l0aChTQVhTb3VyY2UuY2xhc3MudG9TdHJpbmcoKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZG9tUHJvdmlkZXJUZXN0KCkgdGhyb3dzIElPRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24sIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24geworICAgICAgICBET01Tb3VyY2Ugc291cmNlID0gY3JlYXRlRE9NU29ydWNlKGVudGl0eSk7CisKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0IikucGF0aCgiZG9tIikucmVxdWVzdCgpLnB1dChFbnRpdHkuZW50aXR5KHNvdXJjZSwgTWVkaWFUeXBlLlRFWFRfWE1MX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFN0YXR1cy5PSy5nZXRTdGF0dXNDb2RlKCksIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykuc3RhcnRzV2l0aChET01Tb3VyY2UuY2xhc3MudG9TdHJpbmcoKSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZ2V0U291cmNlVGVzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInRlc3QiKS5wYXRoKCJzb3VyY2UiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhTdGF0dXMuT0suZ2V0U3RhdHVzQ29kZSgpLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIFN0cmluZyBjb250ZW50ID0gZXh0cmFjdENvbnRlbnQocmVzcG9uc2UucmVhZEVudGl0eShTb3VyY2UuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb250ZW50LnN0YXJ0c1dpdGgocHJlZml4KSB8fCBjb250ZW50LnN0YXJ0c1dpdGgoeGRrUHJlZml4KSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBnZXRTdHJlYW1Tb3VyY2VUZXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgidGVzdCIpLnBhdGgoInN0cmVhbSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFN0YXR1cy5PSy5nZXRTdGF0dXNDb2RlKCksIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgU3RyaW5nIGNvbnRlbnQgPSBleHRyYWN0Q29udGVudChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmVhbVNvdXJjZS5jbGFzcykpOworICAgICAgICBhc3NlcnRUcnVlKGNvbnRlbnQuc3RhcnRzV2l0aChwcmVmaXgpIHx8IGNvbnRlbnQuc3RhcnRzV2l0aCh4ZGtQcmVmaXgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGdldFNheFNvdXJjZVRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0IikucGF0aCgic2F4IikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoU3RhdHVzLk9LLmdldFN0YXR1c0NvZGUoKSwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBTdHJpbmcgY29udGVudCA9IGV4dHJhY3RDb250ZW50KHJlc3BvbnNlLnJlYWRFbnRpdHkoU0FYU291cmNlLmNsYXNzKSk7CisgICAgICAgIGFzc2VydFRydWUoIkNvbnRlbnQgJyIgKyBjb250ZW50ICsgIicgZG9lcyBub3Qgc3RhcnQgd2l0aCB0aGUgZXhwZWN0ZWQgcHJlZml4ICciICsgcHJlZml4ICsgIiciLAorICAgICAgICAgICAgICAgIGNvbnRlbnQuc3RhcnRzV2l0aChwcmVmaXgpIHx8IGNvbnRlbnQuc3RhcnRzV2l0aCh4ZGtQcmVmaXgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGdldERvbVNvdXJjZVRlc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0IikucGF0aCgiZG9tIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoU3RhdHVzLk9LLmdldFN0YXR1c0NvZGUoKSwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBTdHJpbmcgY29udGVudCA9IGV4dHJhY3RDb250ZW50KHJlc3BvbnNlLnJlYWRFbnRpdHkoRE9NU291cmNlLmNsYXNzKSk7CisgICAgICAgIGFzc2VydFRydWUoIkNvbnRlbnQgJyIgKyBjb250ZW50ICsgIicgZG9lcyBub3Qgc3RhcnQgd2l0aCB0aGUgZXhwZWN0ZWQgcHJlZml4ICciICsgcHJlZml4ICsgIiciLAorICAgICAgICAgICAgICAgIGNvbnRlbnQuc3RhcnRzV2l0aChwcmVmaXgpIHx8IGNvbnRlbnQuc3RhcnRzV2l0aCh4ZGtQcmVmaXgpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTQVhTb3VyY2UgY3JlYXRlU0FYU291cmNlKFN0cmluZyBjb250ZW50KSB0aHJvd3MgU0FYRXhjZXB0aW9uLCBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgU0FYUGFyc2VyRmFjdG9yeSBzYXhGYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOworICAgICAgICByZXR1cm4gbmV3IFNBWFNvdXJjZShzYXhGYWN0b3J5Lm5ld1NBWFBhcnNlcigpLmdldFhNTFJlYWRlcigpLCBuZXcgSW5wdXRTb3VyY2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKAorICAgICAgICAgICAgICAgIGNvbnRlbnQuZ2V0Qnl0ZXMoKSkpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBET01Tb3VyY2UgY3JlYXRlRE9NU29ydWNlKFN0cmluZyBjb250ZW50KSB0aHJvd3MgU0FYRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiwgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZG9jdW1lbnRCdWlsZGVyRmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKKyAgICAgICAgRG9jdW1lbnQgZCA9IGRvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCkucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGNvbnRlbnQuZ2V0Qnl0ZXMoKSkpOworICAgICAgICByZXR1cm4gbmV3IERPTVNvdXJjZShkKTsKKyAgICB9CisKKyAgICBAUGF0aCgidGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0UmVzb3VyY2UgeworCisgICAgICAgIEBQVVQKKyAgICAgICAgQENvbnN1bWVzKCJ0ZXh0L3htbCIpCisgICAgICAgIEBQYXRoKCJzb3VyY2UiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHB1dFNvdXJjZUFuZFJldHVyblN0cmluZyhTb3VyY2Ugc291cmNlKSB0aHJvd3MgSU9FeGNlcHRpb24sIFRyYW5zZm9ybWVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBzb3VyY2UuZ2V0Q2xhc3MoKSArIGV4dHJhY3RDb250ZW50KHNvdXJjZSk7CisgICAgICAgIH0KKworICAgICAgICBAUFVUCisgICAgICAgIEBDb25zdW1lcygidGV4dC94bWwiKQorICAgICAgICBAUGF0aCgic3RyZWFtIikKKyAgICAgICAgcHVibGljIFN0cmluZyBwdXRTdHJlYW1Tb3VyY2VBbmRSZXR1cm5TdHJpbmcoU3RyZWFtU291cmNlIHNvdXJjZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBUcmFuc2Zvcm1lckV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gc291cmNlLmdldENsYXNzKCkgKyBleHRyYWN0Q29udGVudChzb3VyY2UpOworICAgICAgICB9CisKKyAgICAgICAgQFBVVAorICAgICAgICBAQ29uc3VtZXMoInRleHQveG1sIikKKyAgICAgICAgQFBhdGgoInNheCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcHV0U2F4U291cmNlQW5kUmV0dXJuU3RyaW5nKFNBWFNvdXJjZSBzb3VyY2UpIHRocm93cyBJT0V4Y2VwdGlvbiwgVHJhbnNmb3JtZXJFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5nZXRDbGFzcygpICsgZXh0cmFjdENvbnRlbnQoc291cmNlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQVVQKKyAgICAgICAgQENvbnN1bWVzKCJ0ZXh0L3htbCIpCisgICAgICAgIEBQYXRoKCJkb20iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHB1dERvbVNvdXJjZUFuZFJldHVyblN0cmluZyhET01Tb3VyY2Ugc291cmNlKSB0aHJvd3MgSU9FeGNlcHRpb24sIFRyYW5zZm9ybWVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBzb3VyY2UuZ2V0Q2xhc3MoKSArIGV4dHJhY3RDb250ZW50KHNvdXJjZSk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24veG1sIikKKyAgICAgICAgQFBhdGgoInNvdXJjZSIpCisgICAgICAgIHB1YmxpYyBTdHJlYW1Tb3VyY2UgZ2V0U291cmNlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJlYW1Tb3VyY2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGVudGl0eS5nZXRCeXRlcygpKSk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24veG1sIikKKyAgICAgICAgQFBhdGgoInN0cmVhbSIpCisgICAgICAgIHB1YmxpYyBTdHJlYW1Tb3VyY2UgZ2V0U3RyZWFtU291cmNlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJlYW1Tb3VyY2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGVudGl0eS5nZXRCeXRlcygpKSk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24veG1sIikKKyAgICAgICAgQFBhdGgoInNheCIpCisgICAgICAgIHB1YmxpYyBTQVhTb3VyY2UgZ2V0U2F4U291cmNlKCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiwgUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gY3JlYXRlU0FYU291cmNlKGVudGl0eSk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24veG1sIikKKyAgICAgICAgQFBhdGgoImRvbSIpCisgICAgICAgIHB1YmxpYyBET01Tb3VyY2UgZ2V0RG9tU291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gY3JlYXRlRE9NU29ydWNlKGVudGl0eSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvVW5zYWZlQ2hhcnNJblVyaVRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9VbnNhZmVDaGFyc0luVXJpVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZWRkM2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9hcGkvVW5zYWZlQ2hhcnNJblVyaVRlc3QuamF2YQpAQCAtMCwwICsxLDEyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5hcGk7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0OworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5EZWZhdWx0VmFsdWU7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEFycmF5RXF1YWxzOworCisvKioKKyAqIFRlc3QgaWYgVVJJIGNhbiBjb250YWluIHVuc2FmZSBjaGFyYWN0ZXJzIGluIHRoZSBxdWVyeSBwYXJhbWV0ZXIsIGUuZy4gZm9yIHNlbmRpbmcgSlNPTgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFVuc2FmZUNoYXJzSW5VcmlUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgUmVzb3VyY2VDb25maWcgcmMgPSBuZXcgUmVzb3VyY2VDb25maWcoVW5zYWZlQ2hhcnNJblVyaVRlc3QuUmVzcG9uc2VUZXN0LmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgcmVzb3VyY2UKKyAgICAgKi8KKyAgICBAUGF0aCh2YWx1ZSA9ICIvYXBwIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc3BvbnNlVGVzdCB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUZXN0IHJlc291cmNlIG1ldGhvZCByZXR1cm5pbmcgdGhlIGNvbnRlbnQgb2YgdGhlIHtAY29kZSBtc2d9IHF1ZXJ5IHBhcmFtZXRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB0aGUge0Bjb2RlIG1zZ30gcXVlcnkgcGFyYW1ldGVyIChhcyByZWNlaXZlZCkKKyAgICAgICAgICovCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoInRlc3QiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UganNvblF1ZXJ5UGFyYW1UZXN0KEBEZWZhdWx0VmFsdWUoIiIpIEBRdWVyeVBhcmFtKCJtc2ciKSBmaW5hbCBTdHJpbmcgbXNnKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soKS5lbnRpdHkobXNnKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0LCB0aGF0IHNlcnZlciBjYW4gY29uc3VtZSBKU09OIChjdXJseSBicmFja2V0cykgYW5kIG90aGVyIHVuc2FmZSBjaGFyYWN0ZXJzIHNlbnQgaW4gdGhlIHF1ZXJ5IHBhcmFtZXRlcgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNwZWNDaGFyc0luVXJpV2l0aFNvY2tldHMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBxdW90ZXMgYXJlIGVuY29kZWQgYnkgYnJvd3NlcnMsIGN1cmx5IGJyYWNrZXRzIGFyZSBub3QsIHNvIHRoZSBxdW90ZXMgd2lsbCBiZSBzZW50IHByZS1lbmNvZGVkCisgICAgICAgIC8vIEhUVFAgMS4wIGlzIHVzZWQgZm9yIHNpbXBsaWNpdHkKKyAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gc2VuZEdldFJlcXVlc3RPdmVyU29ja2V0KGdldEJhc2VVcmkoKSwgIkdFVCAvYXBwL3Rlc3Q/bXNnPXslMjJmb28lMjI6JTIyYmFyJTIyfSBIVFRQLzEuMCIpOworICAgICAgICBhc3NlcnRBcnJheUVxdWFscygie1wiZm9vXCI6XCJiYXJcIn0iLmdldEJ5dGVzKENoYXJzZXQuZm9yTmFtZSgiSVNPLTg4NTktMSIpKSwgcmVzcG9uc2UuZ2V0Qnl0ZXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBASWdub3JlKCJJbmNvcnJlY3RseSB3cml0dGVuIHRlc3QgKGRvZXNuJ3QgZGVhbCB3aXRoIGh0dHAgZW5jb2RpbmcpLiIpCisgICAgcHVibGljIHZvaWQgdGVzdFNlY2lhbENoYXJzSW5RdWVyeVBhcmFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gcXVvdGVzIGFyZSBlbmNvZGVkIGJ5IGJyb3dzZXJzLCBjdXJseSBicmFja2V0cyBhcmUgbm90LCBzbyB0aGUgcXVvdGVzIHdpbGwgYmUgc2VudCBwcmUtZW5jb2RlZAorICAgICAgICAvLyBIVFRQIDEuMCBpcyB1c2VkIGZvciBzaW1wbGljaXR5CisgICAgICAgIFN0cmluZyByZXNwb25zZSA9IHNlbmRHZXRSZXF1ZXN0T3ZlclNvY2tldChnZXRCYXNlVXJpKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHRVQgL2FwcC90ZXN0P21zZz1IZWxsb1xcV29ybGQrV2l0aCtTcGVjQ2hhcnMrwqcqKSQhwrFALV89O2A6XFwsfnwgSFRUUC8xLjAiKTsKKworICAgICAgICBhc3NlcnRBcnJheUVxdWFscygiSGVsbG9cXFdvcmxkIFdpdGggU3BlY0NoYXJzIMKnKikkIcKxQC1fPTtgOlxcLH58Ii5nZXRCeXRlcyhDaGFyc2V0LmZvck5hbWUoIklTTy04ODU5LTEiKSksCisgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5nZXRCeXRlcygpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyBzZW5kR2V0UmVxdWVzdE92ZXJTb2NrZXQoZmluYWwgVVJJIGJhc2VVcmksIGZpbmFsIFN0cmluZyByZXF1ZXN0TGluZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gTG93IGxldmVsIGFwcHJvYWNoIHdpdGggc29ja2V0cyBpcyB1c2VkLCBiZWNhdXNlIGNvbW1vbiBKYXZhIEhUVFAgY2xpZW50cyBhcmUgdXNpbmcgamF2YS5uZXQuVVJJLAorICAgICAgICAvLyB3aGljaCBmYWlscyB3aGVuIHVuZW5jb2RlZCBjdXJseSBicmFja2V0IGlzIHBhcnQgb2YgdGhlIFVSSQorICAgICAgICBmaW5hbCBTb2NrZXQgc29ja2V0ID0gbmV3IFNvY2tldChiYXNlVXJpLmdldEhvc3QoKSwgYmFzZVVyaS5nZXRQb3J0KCkpOworICAgICAgICBmaW5hbCBQcmludFdyaXRlciBwdyA9CisgICAgICAgICAgICAgICAgbmV3IFByaW50V3JpdGVyKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIoc29ja2V0LmdldE91dHB1dFN0cmVhbSgpLCBDaGFyc2V0LmZvck5hbWUoIklTTy04ODU5LTEiKSkpKTsKKworICAgICAgICBwdy5wcmludGxuKHJlcXVlc3RMaW5lKTsKKyAgICAgICAgcHcucHJpbnRsbigpOyAvLyBodHRwIHJlcXVlc3Qgc2hvdWxkIGVuZCB3aXRoIGEgYmxhbmsgbGluZQorICAgICAgICBwdy5mbHVzaCgpOworCisgICAgICAgIGZpbmFsIEJ1ZmZlcmVkUmVhZGVyIGJyID0KKyAgICAgICAgICAgICAgICBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKHNvY2tldC5nZXRJbnB1dFN0cmVhbSgpLCBDaGFyc2V0LmZvck5hbWUoIlVURi04IikpKTsKKworICAgICAgICBTdHJpbmcgbGFzdExpbmUgPSBudWxsOworICAgICAgICBTdHJpbmcgbGluZTsKKyAgICAgICAgd2hpbGUgKChsaW5lID0gYnIucmVhZExpbmUoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgLy8gcmVhZCB0aGUgcmVzcG9uc2UgYW5kIHJlbWVtYmVyIHRoZSBsYXN0IGxpbmUKKyAgICAgICAgICAgIGxhc3RMaW5lID0gbGluZTsKKyAgICAgICAgfQorICAgICAgICBwdy5jbG9zZSgpOworICAgICAgICBici5jbG9zZSgpOworCisgICAgICAgIHJldHVybiBsYXN0TGluZTsKKyAgICB9Cit9CisKKworCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9WYXJpYW50c1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2FwaS9WYXJpYW50c1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmMwZjc0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvYXBpL1ZhcmlhbnRzVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzE1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmFwaTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVxdWVzdDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVmFyaWFudDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuTWVkaWFUeXBlczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBTZXJ2ZXItc2lkZSB2YXJpYW50IHNlbGVjdGlvbiAmIGhhbmRsaW5nIHRlc3QuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFZhcmlhbnRzVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZygKKyAgICAgICAgICAgICAgICBMYW5ndWFnZVZhcmlhbnRSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBDb21wbGV4VmFyaWFudFJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZVF1YWxpdHlTb3VyY2VSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFBhdGgoIi9sdnIiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTGFuZ3VhZ2VWYXJpYW50UmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGRvR2V0KEBDb250ZXh0IFJlcXVlc3QgcikgeworICAgICAgICAgICAgTGlzdDxWYXJpYW50PiB2cyA9IFZhcmlhbnQuVmFyaWFudExpc3RCdWlsZGVyLm5ld0luc3RhbmNlKCkKKyAgICAgICAgICAgICAgICAgICAgLmxhbmd1YWdlcyhuZXcgTG9jYWxlKCJ6aCIpKQorICAgICAgICAgICAgICAgICAgICAubGFuZ3VhZ2VzKG5ldyBMb2NhbGUoImZyIikpCisgICAgICAgICAgICAgICAgICAgIC5sYW5ndWFnZXMobmV3IExvY2FsZSgiZW4iKSkKKyAgICAgICAgICAgICAgICAgICAgLmFkZCgpCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgICAgICBWYXJpYW50IHYgPSByLnNlbGVjdFZhcmlhbnQodnMpOworICAgICAgICAgICAgaWYgKHYgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5ub3RBY2NlcHRhYmxlKHZzKS5idWlsZCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2sodi5nZXRMYW5ndWFnZSgpLnRvU3RyaW5nKCksIHYpLmJ1aWxkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRMYW5ndWFnZUVuKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgV2ViVGFyZ2V0IHJwID0gdGFyZ2V0KCIvbHZyIik7CisKKyAgICAgICAgUmVzcG9uc2UgciA9IHJwLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5oZWFkZXIoIkFjY2VwdC1MYW5ndWFnZSIsICJlbiIpCisgICAgICAgICAgICAgICAgLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoImVuIiwgci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoImVuIiwgci5nZXRMYW5ndWFnZSgpLnRvU3RyaW5nKCkpOworICAgICAgICBTdHJpbmcgdmFyeSA9IHIuZ2V0SGVhZGVyU3RyaW5nKCJWYXJ5Iik7CisgICAgICAgIGFzc2VydE5vdE51bGwodmFyeSk7CisgICAgICAgIGFzc2VydFRydWUoIWNvbnRhaW5zKHZhcnksICJBY2NlcHQiKSk7CisgICAgICAgIGFzc2VydFRydWUoY29udGFpbnModmFyeSwgIkFjY2VwdC1MYW5ndWFnZSIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRMYW5ndWFnZVpoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgV2ViVGFyZ2V0IHJwID0gdGFyZ2V0KCIvbHZyIik7CisKKyAgICAgICAgUmVzcG9uc2UgciA9IHJwLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5oZWFkZXIoIkFjY2VwdC1MYW5ndWFnZSIsICJ6aCIpCisgICAgICAgICAgICAgICAgLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoInpoIiwgci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMoInpoIiwgci5nZXRMYW5ndWFnZSgpLnRvU3RyaW5nKCkpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oci5nZXRNZXRhZGF0YSgpLmdldEZpcnN0KCJWYXJ5IikpOworICAgICAgICBTdHJpbmcgdmFyeSA9IHIuZ2V0SGVhZGVyU3RyaW5nKCJWYXJ5Iik7CisgICAgICAgIGFzc2VydE5vdE51bGwodmFyeSk7CisgICAgICAgIGFzc2VydFRydWUoIWNvbnRhaW5zKHZhcnksICJBY2NlcHQiKSk7CisgICAgICAgIGFzc2VydFRydWUoY29udGFpbnModmFyeSwgIkFjY2VwdC1MYW5ndWFnZSIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRMYW5ndWFnZU11bHRpcGxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgV2ViVGFyZ2V0IHJwID0gdGFyZ2V0KCIvbHZyIik7CisKKyAgICAgICAgUmVzcG9uc2UgciA9IHJwCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5oZWFkZXIoIkFjY2VwdC1MYW5ndWFnZSIsICJlbjtxPTAuMywgemg7cT0wLjQsIGZyIikKKyAgICAgICAgICAgICAgICAuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiZnIiLCByLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZnIiLCByLmdldExhbmd1YWdlKCkudG9TdHJpbmcoKSk7CisgICAgICAgIFN0cmluZyB2YXJ5ID0gci5nZXRIZWFkZXJTdHJpbmcoIlZhcnkiKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh2YXJ5KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSghY29udGFpbnModmFyeSwgIkFjY2VwdCIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb250YWlucyh2YXJ5LCAiQWNjZXB0LUxhbmd1YWdlIikpOworICAgIH0KKworICAgIEBQYXRoKCIvY3ZyIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbXBsZXhWYXJpYW50UmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGRvR2V0KEBDb250ZXh0IFJlcXVlc3QgcikgeworICAgICAgICAgICAgTGlzdDxWYXJpYW50PiB2cyA9IFZhcmlhbnQuVmFyaWFudExpc3RCdWlsZGVyLm5ld0luc3RhbmNlKCkKKyAgICAgICAgICAgICAgICAgICAgLm1lZGlhVHlwZXMoTWVkaWFUeXBlLnZhbHVlT2YoImltYWdlL2pwZWciKSkKKyAgICAgICAgICAgICAgICAgICAgLmFkZCgpCisgICAgICAgICAgICAgICAgICAgIC5tZWRpYVR5cGVzKE1lZGlhVHlwZS52YWx1ZU9mKCJhcHBsaWNhdGlvbi94bWwiKSkKKyAgICAgICAgICAgICAgICAgICAgLmxhbmd1YWdlcyhuZXcgTG9jYWxlKCJlbiIsICJ1cyIpKQorICAgICAgICAgICAgICAgICAgICAuYWRkKCkKKyAgICAgICAgICAgICAgICAgICAgLm1lZGlhVHlwZXMoTWVkaWFUeXBlLnZhbHVlT2YoInRleHQveG1sIikpCisgICAgICAgICAgICAgICAgICAgIC5sYW5ndWFnZXMobmV3IExvY2FsZSgiZW4iKSkKKyAgICAgICAgICAgICAgICAgICAgLmFkZCgpCisgICAgICAgICAgICAgICAgICAgIC5tZWRpYVR5cGVzKE1lZGlhVHlwZS52YWx1ZU9mKCJ0ZXh0L3htbCIpKQorICAgICAgICAgICAgICAgICAgICAubGFuZ3VhZ2VzKG5ldyBMb2NhbGUoImVuIiwgInVzIikpCisgICAgICAgICAgICAgICAgICAgIC5hZGQoKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICAgICAgVmFyaWFudCB2ID0gci5zZWxlY3RWYXJpYW50KHZzKTsKKyAgICAgICAgICAgIGlmICh2ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uubm90QWNjZXB0YWJsZSh2cykuYnVpbGQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCJHRVQiLCB2KS5idWlsZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q29tcGxleDEoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBXZWJUYXJnZXQgcnAgPSB0YXJnZXQoIi9jdnIiKTsKKworICAgICAgICBSZXNwb25zZSByID0gcnAucmVxdWVzdCgidGV4dC94bWwiLAorICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi94bWwiLAorICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi94aHRtbCt4bWwiLAorICAgICAgICAgICAgICAgICJpbWFnZS9wbmciLAorICAgICAgICAgICAgICAgICJ0ZXh0L2h0bWw7cT0wLjkiLAorICAgICAgICAgICAgICAgICJ0ZXh0L3BsYWluO3E9MC44IiwKKyAgICAgICAgICAgICAgICAiKi8qO3E9MC41IikKKyAgICAgICAgICAgICAgICAuaGVhZGVyKCJBY2NlcHQtTGFuZ3VhZ2UiLCAiZW4tdXMsZW47cT0wLjUiKQorICAgICAgICAgICAgICAgIC5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJHRVQiLCByLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUudmFsdWVPZigidGV4dC94bWwiKSwgci5nZXRNZWRpYVR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZW4iLCByLmdldExhbmd1YWdlKCkuZ2V0TGFuZ3VhZ2UoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiVVMiLCByLmdldExhbmd1YWdlKCkuZ2V0Q291bnRyeSgpKTsKKyAgICAgICAgU3RyaW5nIHZhcnkgPSByLmdldEhlYWRlclN0cmluZygiVmFyeSIpOworICAgICAgICBhc3NlcnROb3ROdWxsKHZhcnkpOworICAgICAgICBhc3NlcnRUcnVlKGNvbnRhaW5zKHZhcnksICJBY2NlcHQiKSk7CisgICAgICAgIGFzc2VydFRydWUoY29udGFpbnModmFyeSwgIkFjY2VwdC1MYW5ndWFnZSIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDb21wbGV4MigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFdlYlRhcmdldCBycCA9IHRhcmdldCgiL2N2ciIpOworCisgICAgICAgIFJlc3BvbnNlIHIgPSBycC5yZXF1ZXN0KCJ0ZXh0L3htbCIsCisgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3htbCIsCisgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3hodG1sK3htbCIsCisgICAgICAgICAgICAgICAgImltYWdlL3BuZyIsCisgICAgICAgICAgICAgICAgInRleHQvaHRtbDtxPTAuOSIsCisgICAgICAgICAgICAgICAgInRleHQvcGxhaW47cT0wLjgiLAorICAgICAgICAgICAgICAgICIqLyo7cT0wLjUiKQorICAgICAgICAgICAgICAgIC5oZWFkZXIoIkFjY2VwdC1MYW5ndWFnZSIsICJlbixlbi11cyIpCisgICAgICAgICAgICAgICAgLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCIsIHIucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS52YWx1ZU9mKCJ0ZXh0L3htbCIpLCByLmdldE1lZGlhVHlwZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJlbiIsIHIuZ2V0TGFuZ3VhZ2UoKS50b1N0cmluZygpKTsKKyAgICAgICAgU3RyaW5nIHZhcnkgPSByLmdldEhlYWRlclN0cmluZygiVmFyeSIpOworICAgICAgICBhc3NlcnROb3ROdWxsKHZhcnkpOworICAgICAgICBhc3NlcnRUcnVlKGNvbnRhaW5zKHZhcnksICJBY2NlcHQiKSk7CisgICAgICAgIGFzc2VydFRydWUoY29udGFpbnModmFyeSwgIkFjY2VwdC1MYW5ndWFnZSIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDb21wbGV4MygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFdlYlRhcmdldCBycCA9IHRhcmdldCgiL2N2ciIpOworCisgICAgICAgIFJlc3BvbnNlIHIgPSBycC5yZXF1ZXN0KCJhcHBsaWNhdGlvbi94bWwiLAorICAgICAgICAgICAgICAgICJ0ZXh0L3htbCIsCisgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3hodG1sK3htbCIsCisgICAgICAgICAgICAgICAgImltYWdlL3BuZyIsCisgICAgICAgICAgICAgICAgInRleHQvaHRtbDtxPTAuOSIsCisgICAgICAgICAgICAgICAgInRleHQvcGxhaW47cT0wLjgiLAorICAgICAgICAgICAgICAgICIqLyo7cT0wLjUiKQorICAgICAgICAgICAgICAgIC5oZWFkZXIoIkFjY2VwdC1MYW5ndWFnZSIsICJlbi11cyxlbjtxPTAuNSIpCisgICAgICAgICAgICAgICAgLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVCIsIHIucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhVHlwZS52YWx1ZU9mKCJhcHBsaWNhdGlvbi94bWwiKSwgci5nZXRNZWRpYVR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZW4iLCByLmdldExhbmd1YWdlKCkuZ2V0TGFuZ3VhZ2UoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiVVMiLCByLmdldExhbmd1YWdlKCkuZ2V0Q291bnRyeSgpKTsKKyAgICAgICAgU3RyaW5nIHZhcnkgPSByLmdldEhlYWRlclN0cmluZygiVmFyeSIpOworICAgICAgICBhc3NlcnROb3ROdWxsKHZhcnkpOworICAgICAgICBhc3NlcnRUcnVlKGNvbnRhaW5zKHZhcnksICJBY2NlcHQiKSk7CisgICAgICAgIGFzc2VydFRydWUoY29udGFpbnModmFyeSwgIkFjY2VwdC1MYW5ndWFnZSIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDb21wbGV4Tm90QWNjZXB0YWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFdlYlRhcmdldCBycCA9IHRhcmdldCgiL2N2ciIpOworCisgICAgICAgIFJlc3BvbnNlIHIgPSBycC5yZXF1ZXN0KCJhcHBsaWNhdGlvbi9hdG9tK3htbCIpCisgICAgICAgICAgICAgICAgLmhlYWRlcigiQWNjZXB0LUxhbmd1YWdlIiwgImVuLXVzLGVuIikKKyAgICAgICAgICAgICAgICAuZ2V0KCk7CisgICAgICAgIFN0cmluZyB2YXJ5ID0gci5nZXRIZWFkZXJTdHJpbmcoIlZhcnkiKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh2YXJ5KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb250YWlucyh2YXJ5LCAiQWNjZXB0IikpOworICAgICAgICBhc3NlcnRUcnVlKGNvbnRhaW5zKHZhcnksICJBY2NlcHQtTGFuZ3VhZ2UiKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDYsIHIuZ2V0U3RhdHVzKCkpOworCisgICAgICAgIHIgPSBycC5yZXF1ZXN0KCJhcHBsaWNhdGlvbi94bWwiKQorICAgICAgICAgICAgICAgIC5oZWFkZXIoIkFjY2VwdC1MYW5ndWFnZSIsICJmciIpCisgICAgICAgICAgICAgICAgLmdldCgpOworICAgICAgICB2YXJ5ID0gci5nZXRIZWFkZXJTdHJpbmcoIlZhcnkiKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh2YXJ5KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb250YWlucyh2YXJ5LCAiQWNjZXB0IikpOworICAgICAgICBhc3NlcnRUcnVlKGNvbnRhaW5zKHZhcnksICJBY2NlcHQtTGFuZ3VhZ2UiKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDYsIHIuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBQYXRoKCIvbXRxc3IiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWVkaWFUeXBlUXVhbGl0eVNvdXJjZVJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBkb0dldChAQ29udGV4dCBSZXF1ZXN0IHIpIHsKKyAgICAgICAgICAgIExpc3Q8VmFyaWFudD4gdnMgPSBWYXJpYW50LlZhcmlhbnRMaXN0QnVpbGRlci5uZXdJbnN0YW5jZSgpCisgICAgICAgICAgICAgICAgICAgIC5tZWRpYVR5cGVzKE1lZGlhVHlwZS52YWx1ZU9mKCJhcHBsaWNhdGlvbi94bWw7cXM9MC44IikpCisgICAgICAgICAgICAgICAgICAgIC5tZWRpYVR5cGVzKE1lZGlhVHlwZS52YWx1ZU9mKCJ0ZXh0L2h0bWw7cXM9MS4wIikpCisgICAgICAgICAgICAgICAgICAgIC5hZGQoKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICAgICAgVmFyaWFudCB2ID0gci5zZWxlY3RWYXJpYW50KHZzKTsKKyAgICAgICAgICAgIGlmICh2ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uubm90QWNjZXB0YWJsZSh2cykuYnVpbGQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCJHRVQiLCB2KS5idWlsZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWVkaWFUeXBlUXVhbGl0eVNvdXJjZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFdlYlRhcmdldCBycCA9IHRhcmdldCgiL210cXNyIik7CisKKyAgICAgICAgUmVzcG9uc2UgciA9IHJwLnJlcXVlc3QoCisgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3htbCIsCisgICAgICAgICAgICAgICAgInRleHQvaHRtbDtxPTAuOSIpCisgICAgICAgICAgICAgICAgLmdldCgpOworICAgICAgICBhc3NlcnRUcnVlKE1lZGlhVHlwZXMudHlwZUVxdWFsKE1lZGlhVHlwZS52YWx1ZU9mKCJ0ZXh0L2h0bWwiKSwgci5nZXRNZWRpYVR5cGUoKSkpOworICAgICAgICBTdHJpbmcgdmFyeSA9IHIuZ2V0SGVhZGVyU3RyaW5nKCJWYXJ5Iik7CisgICAgICAgIGFzc2VydE5vdE51bGwodmFyeSk7CisgICAgICAgIGFzc2VydFRydWUoY29udGFpbnModmFyeSwgIkFjY2VwdCIpKTsKKworICAgICAgICByID0gcnAucmVxdWVzdCgKKyAgICAgICAgICAgICAgICAidGV4dC9odG1sIiwKKyAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24veG1sIikKKyAgICAgICAgICAgICAgICAuZ2V0KCk7CisgICAgICAgIGFzc2VydFRydWUoTWVkaWFUeXBlcy50eXBlRXF1YWwoTWVkaWFUeXBlLnZhbHVlT2YoInRleHQvaHRtbCIpLCByLmdldE1lZGlhVHlwZSgpKSk7CisgICAgICAgIHZhcnkgPSByLmdldEhlYWRlclN0cmluZygiVmFyeSIpOworICAgICAgICBhc3NlcnROb3ROdWxsKHZhcnkpOworICAgICAgICBhc3NlcnRUcnVlKGNvbnRhaW5zKHZhcnksICJBY2NlcHQiKSk7CisKKyAgICAgICAgciA9IHJwLnJlcXVlc3QoCisgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3htbCIsCisgICAgICAgICAgICAgICAgInRleHQvaHRtbCIpCisgICAgICAgICAgICAgICAgLmdldCgpOworICAgICAgICBhc3NlcnRUcnVlKE1lZGlhVHlwZXMudHlwZUVxdWFsKE1lZGlhVHlwZS52YWx1ZU9mKCJ0ZXh0L2h0bWwiKSwgci5nZXRNZWRpYVR5cGUoKSkpOworICAgICAgICB2YXJ5ID0gci5nZXRIZWFkZXJTdHJpbmcoIlZhcnkiKTsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCh2YXJ5KTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShjb250YWlucyh2YXJ5LCAiQWNjZXB0IikpOworCisgICAgICAgIHIgPSBycC5yZXF1ZXN0KAorICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi94bWwiKQorICAgICAgICAgICAgICAgIC5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShNZWRpYVR5cGVzLnR5cGVFcXVhbChNZWRpYVR5cGUudmFsdWVPZigiYXBwbGljYXRpb24veG1sIiksIHIuZ2V0TWVkaWFUeXBlKCkpKTsKKyAgICAgICAgdmFyeSA9IHIuZ2V0SGVhZGVyU3RyaW5nKCJWYXJ5Iik7CisgICAgICAgIGFzc2VydE5vdE51bGwodmFyeSk7CisgICAgICAgIGFzc2VydFRydWUoY29udGFpbnModmFyeSwgIkFjY2VwdCIpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGJvb2xlYW4gY29udGFpbnMoU3RyaW5nIGwsIFN0cmluZyB2KSB7CisgICAgICAgIFN0cmluZ1tdIHZzID0gbC5zcGxpdCgiLCIpOworICAgICAgICBmb3IgKFN0cmluZyBzIDogdnMpIHsKKyAgICAgICAgICAgIHMgPSBzLnRyaW0oKTsKKyAgICAgICAgICAgIGlmIChzLmVxdWFsc0lnbm9yZUNhc2UodikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvQ2xpZW50VGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL0NsaWVudFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZmVkYjRkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL0NsaWVudFRlc3QuamF2YQpAQCAtMCwwICsxLDE1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmU7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLkhlYWRlclBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5JbnZvY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlZhcmlhbnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQ2xpZW50VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQFBhdGgoImhlbGxvd29ybGQiKQorICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICBAQ29uc3VtZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBIZWxsb1dvcmxkUmVzb3VyY2UgeworCisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFID0gIkhlbGxvIHdvcmxkISI7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENsaWNoZWRNZXNzYWdlKCkgeworICAgICAgICAgICAgcmV0dXJuIE1FU1NBR0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiaGVhZGVycyIpCisgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSGVhZGVyc1Rlc3RSZXNvdXJjZSB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoImNvbnRlbnQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGNvbnRlbnRIZWFkZXJzKEBIZWFkZXJQYXJhbSgiY3VzdG9tLWhlYWRlciIpIGZpbmFsIFN0cmluZyBjdXN0b21IZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQENvbnRleHQgZmluYWwgSHR0cEhlYWRlcnMgaGVhZGVycywgZmluYWwgU3RyaW5nIGVudGl0eSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKGVudGl0eSkuYXBwZW5kKCdcbicpOworCisgICAgICAgICAgICBzYi5hcHBlbmQoImN1c3RvbS1oZWFkZXI6IikuYXBwZW5kKGN1c3RvbUhlYWRlcikuYXBwZW5kKCdcbicpOworCisgICAgICAgICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8U3RyaW5nPj4gaGVhZGVyIDogaGVhZGVycy5nZXRSZXF1ZXN0SGVhZGVycygpLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoaGVhZGVyLmdldEtleSgpKS5hcHBlbmQoJzonKS5hcHBlbmQoaGVhZGVyLmdldFZhbHVlKCkudG9TdHJpbmcoKSkuYXBwZW5kKCdcbicpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoSGVsbG9Xb3JsZFJlc291cmNlLmNsYXNzLCBIZWFkZXJzVGVzdFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBY2Nlc2luZ0hlbGxvd29ybGRSZXNvdXJjZSgpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHJlc291cmNlID0gdGFyZ2V0KCkucGF0aCgiaGVsbG93b3JsZCIpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByID0gcmVzb3VyY2UucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByLmdldFN0YXR1cygpKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzcG9uc2VNZXNzYWdlID0gcmVzb3VyY2UucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoSGVsbG9Xb3JsZFJlc291cmNlLk1FU1NBR0UsIHJlc3BvbnNlTWVzc2FnZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWNjZXNpbmdNaXNzaW5nUmVzb3VyY2UoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCBtaXNzaW5nUmVzb3VyY2UgPSB0YXJnZXQoKS5wYXRoKCJtaXNzaW5nIik7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHIgPSBtaXNzaW5nUmVzb3VyY2UucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDA0LCByLmdldFN0YXR1cygpKTsKKworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtaXNzaW5nUmVzb3VyY2UucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKDQwNCwgZXguZ2V0UmVzcG9uc2UoKS5nZXRTdGF0dXMoKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmYWlsKCJFeHBlY3RlZCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiBoYXMgbm90IGJlZW4gdGhyb3duLiIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgLy8gSW5zcGlyZWQgYnkgSkVSU0VZLTE1MDIKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGV4dEhlYWRlcnMoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKS5wYXRoKCJoZWFkZXJzIikucGF0aCgiY29udGVudCIpOworCisgICAgICAgIEludm9jYXRpb24uQnVpbGRlciBpYjsKKyAgICAgICAgSW52b2NhdGlvbiBpOworICAgICAgICBSZXNwb25zZSByOworICAgICAgICBTdHJpbmcgcmVxSGVhZGVyczsKKworICAgICAgICBpYiA9IHRhcmdldC5yZXF1ZXN0KCIqLyoiKTsKKyAgICAgICAgaWIuaGVhZGVyKCJjdXN0b20taGVhZGVyIiwgImN1c3RvbS12YWx1ZSIpOworICAgICAgICBpYi5oZWFkZXIoImNvbnRlbnQtZW5jb2RpbmciLCAiZGVmbGF0ZSIpOworICAgICAgICBpID0gaWIuYnVpbGQoIlBPU1QiLCBFbnRpdHkuZW50aXR5KCJhYWEiLCBNZWRpYVR5cGUuV0lMRENBUkRfVFlQRSkpOworICAgICAgICByID0gaS5pbnZva2UoKTsKKworICAgICAgICByZXFIZWFkZXJzID0gci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykudG9Mb3dlckNhc2UoKTsKKyAgICAgICAgZm9yIChmaW5hbCBTdHJpbmcgZXhwZWN0ZWQgOiBuZXcgU3RyaW5nW10geyJjdXN0b20taGVhZGVyOltjdXN0b20tdmFsdWVdIiwgImN1c3RvbS1oZWFkZXI6Y3VzdG9tLXZhbHVlIn0pIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoU3RyaW5nLmZvcm1hdCgiUmVxdWVzdCBoZWFkZXJzIGRvIG5vdCBjb250YWluIGV4cGVjdGVkICclcycgZW50cnk6XG4lcyIsIGV4cGVjdGVkLCByZXFIZWFkZXJzKSwKKyAgICAgICAgICAgICAgICAgICAgcmVxSGVhZGVycy5jb250YWlucyhleHBlY3RlZCkpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFN0cmluZyB1bmV4cGVjdGVkID0gImNvbnRlbnQtZW5jb2RpbmciOworICAgICAgICBhc3NlcnRGYWxzZShTdHJpbmcuZm9ybWF0KCJSZXF1ZXN0IGhlYWRlcnMgY29udGFpbnMgdW5leHBlY3RlZCAnJXMnIGVudHJ5OlxuJXMiLCB1bmV4cGVjdGVkLCByZXFIZWFkZXJzKSwKKyAgICAgICAgICAgICAgICByZXFIZWFkZXJzLmNvbnRhaW5zKHVuZXhwZWN0ZWQpKTsKKworICAgICAgICBpYiA9IHRhcmdldC5yZXF1ZXN0KCIqLyoiKTsKKyAgICAgICAgaSA9IGliLmJ1aWxkKCJQT1NUIiwKKyAgICAgICAgICAgICAgICBFbnRpdHkuZW50aXR5KCJhYWEiLCBWYXJpYW50Lm1lZGlhVHlwZXMoTWVkaWFUeXBlLldJTERDQVJEX1RZUEUpLmVuY29kaW5ncygiZGVmbGF0ZSIpLmJ1aWxkKCkuZ2V0KDApKSk7CisgICAgICAgIHIgPSBpLmludm9rZSgpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZCA9ICJjb250ZW50LWVuY29kaW5nOltkZWZsYXRlXSI7CisgICAgICAgIHJlcUhlYWRlcnMgPSByLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKS50b0xvd2VyQ2FzZSgpOworICAgICAgICBhc3NlcnRUcnVlKFN0cmluZy5mb3JtYXQoIlJlcXVlc3QgaGVhZGVycyBkbyBub3QgY29udGFpbiBleHBlY3RlZCAnJXMnIGVudHJ5OlxuJXMiLCBleHBlY3RlZCwgcmVxSGVhZGVycyksCisgICAgICAgICAgICAgICAgcmVxSGVhZGVycy5jb250YWlucyhleHBlY3RlZCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9FeGVjdXRvclNlcnZpY2VQcm92aWRlclRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9FeGVjdXRvclNlcnZpY2VQcm92aWRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTdmNTc0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL0V4ZWN1dG9yU2VydmljZVByb3ZpZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzU4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZTsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuSWRlbnRpdHlIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVvdXRFeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0Jvb2xlYW47CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LmluamVjdC5OYW1lZDsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Bc3luY1Jlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5TdXNwZW5kZWQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudEFzeW5jRXhlY3V0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmEuVGhyZWFkRmFjdG9yeUJ1aWxkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5KZXJzZXlQcm9jZXNzaW5nVW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5NYW5hZ2VkQXN5bmM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLk1hbmFnZWRBc3luY0V4ZWN1dG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLkV4ZWN1dG9yU2VydmljZVByb3ZpZGVyfSBFMkUgdGVzdHMuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQFBhdGgoInJlc291cmNlIikKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFJlc291cmNlQSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFN5bmMoKSB7CisgICAgICAgICAgICByZXR1cm4gInJlc291cmNlIjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImFzeW5jIikKKyAgICAgICAgQE1hbmFnZWRBc3luYworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEFzeW5jKCkgeworICAgICAgICAgICAgcmV0dXJuICJhc3luYy1yZXNvdXJjZS0iICsgRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXJUZXN0LmdldFJlc3BvbnNlT25UaHJlYWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEEgc2VwYXJhdGUgcmVzb3VyY2UgY2xhc3MgZm9yIHRoZSBjdXN0b20tYXN5bmMgc3ViLXBhdGggdG8gZW5zdXJlIHRoYXQKKyAgICAvLyB0aGUgbmFtZWQgRXhlY3V0b3JTZXJ2aWNlIGluamVjdGlvbiBpcyBvbmx5IHBlcmZvcm1lZCBmb3IgdGhlICIvcmVzb3VyY2UvY3VzdG9tLWFzeW5jIiBwYXRoLgorICAgIEBQYXRoKCJyZXNvdXJjZSIpCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RSZXNvdXJjZUIgeworCisgICAgICAgIEBJbmplY3QKKyAgICAgICAgQE5hbWVkKCJjdXN0b20iKQorICAgICAgICBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlOworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImN1c3RvbS1hc3luYyIpCisgICAgICAgIHB1YmxpYyB2b2lkIGdldEN1c3RvbUFzeW5jKEBTdXNwZW5kZWQgZmluYWwgQXN5bmNSZXNwb25zZSBhc3luY1Jlc3BvbnNlKSB7CisgICAgICAgICAgICBleGVjdXRvclNlcnZpY2Uuc3VibWl0KG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgIGFzeW5jUmVzcG9uc2UucmVzdW1lKCJjdXN0b20tYXN5bmMtcmVzb3VyY2UtIiArIEV4ZWN1dG9yU2VydmljZVByb3ZpZGVyVGVzdC5nZXRSZXNwb25zZU9uVGhyZWFkKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIFN0cmluZyBnZXRSZXNwb25zZU9uVGhyZWFkKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgdGhyZWFkTmFtZSA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpOworICAgICAgICBpZiAodGhyZWFkTmFtZS5zdGFydHNXaXRoKCJhc3luYy1yZXF1ZXN0LSIpKSB7CisgICAgICAgICAgICByZXR1cm4gInBhc3NlZCI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gImVycm9yIC0gdW5leHBlY3RlZCBjdXN0b20gdGhyZWFkIG5hbWU6ICIgKyB0aHJlYWROYW1lOworICAgICAgICB9CisgICAgfQorCisgICAgQENsaWVudEFzeW5jRXhlY3V0b3IKKyAgICBATWFuYWdlZEFzeW5jRXhlY3V0b3IKKyAgICBATmFtZWQoImN1c3RvbSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDdXN0b21FeGVjdXRvclByb3ZpZGVyIGltcGxlbWVudHMgRXhlY3V0b3JTZXJ2aWNlUHJvdmlkZXIgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgU2V0PEV4ZWN1dG9yU2VydmljZT4gZXhlY3V0b3JzID0gQ29sbGVjdGlvbnMubmV3U2V0RnJvbU1hcChuZXcgSWRlbnRpdHlIYXNoTWFwPD4oKSk7CisgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgaW50IGV4ZWN1dG9yQ3JlYXRpb25Db3VudCA9IDA7CisgICAgICAgIHByaXZhdGUgdm9sYXRpbGUgaW50IGV4ZWN1dG9yUmVsZWFzZUNvdW50ID0gMDsKKworICAgICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKKyAgICAgICAgICAgIGZvciAoRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yIDogZXhlY3V0b3JzKSB7CisgICAgICAgICAgICAgICAgZXhlY3V0b3Iuc2h1dGRvd25Ob3coKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZXhlY3V0b3JzLmNsZWFyKCk7CisgICAgICAgICAgICBleGVjdXRvckNyZWF0aW9uQ291bnQgPSAwOworICAgICAgICAgICAgZXhlY3V0b3JSZWxlYXNlQ291bnQgPSAwOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBFeGVjdXRvclNlcnZpY2UgZ2V0RXhlY3V0b3JTZXJ2aWNlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDdXN0b21FeGVjdXRvclNlcnZpY2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKGZpbmFsIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvclNlcnZpY2UpIHsKKyAgICAgICAgICAgIGV4ZWN1dG9yU2VydmljZS5zaHV0ZG93bk5vdygpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBjbGFzcyBDdXN0b21FeGVjdXRvclNlcnZpY2UgaW1wbGVtZW50cyBFeGVjdXRvclNlcnZpY2UgeworCisgICAgICAgICAgICBwcml2YXRlIGZpbmFsIEV4ZWN1dG9yU2VydmljZSBkZWxlZ2F0ZTsKKyAgICAgICAgICAgIHByaXZhdGUgZmluYWwgQXRvbWljQm9vbGVhbiBpc0NsZWFuZWRVcDsKKworICAgICAgICAgICAgcHVibGljIEN1c3RvbUV4ZWN1dG9yU2VydmljZSgpIHsKKyAgICAgICAgICAgICAgICB0aGlzLmlzQ2xlYW5lZFVwID0gbmV3IEF0b21pY0Jvb2xlYW4oZmFsc2UpOworICAgICAgICAgICAgICAgIHRoaXMuZGVsZWdhdGUgPSBFeGVjdXRvcnMubmV3U2luZ2xlVGhyZWFkRXhlY3V0b3IobmV3IFRocmVhZEZhY3RvcnlCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXROYW1lRm9ybWF0KCJhc3luYy1yZXF1ZXN0LSVkIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIobmV3IEplcnNleVByb2Nlc3NpbmdVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAgICAgICAgIGV4ZWN1dG9yQ3JlYXRpb25Db3VudCsrOworICAgICAgICAgICAgICAgIGV4ZWN1dG9ycy5hZGQodGhpcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgc2h1dGRvd24oKSB7CisgICAgICAgICAgICAgICAgdHJ5Q2xlYW5VcCgpOworICAgICAgICAgICAgICAgIGRlbGVnYXRlLnNodXRkb3duKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIExpc3Q8UnVubmFibGU+IHNodXRkb3duTm93KCkgeworICAgICAgICAgICAgICAgIHRyeUNsZWFuVXAoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuc2h1dGRvd25Ob3coKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1NodXRkb3duKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5pc1NodXRkb3duKCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaXNUZXJtaW5hdGVkKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5pc1Rlcm1pbmF0ZWQoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBhd2FpdFRlcm1pbmF0aW9uKGxvbmcgdGltZW91dCwgVGltZVVuaXQgdW5pdCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuYXdhaXRUZXJtaW5hdGlvbih0aW1lb3V0LCB1bml0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgPFQ+IEZ1dHVyZTxUPiBzdWJtaXQoQ2FsbGFibGU8VD4gdGFzaykgeworICAgICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5zdWJtaXQodGFzayk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIDxUPiBGdXR1cmU8VD4gc3VibWl0KFJ1bm5hYmxlIHRhc2ssIFQgcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLnN1Ym1pdCh0YXNrLCByZXN1bHQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBGdXR1cmU8Pz4gc3VibWl0KFJ1bm5hYmxlIHRhc2spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuc3VibWl0KHRhc2spOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyA8VD4gTGlzdDxGdXR1cmU8VD4+IGludm9rZUFsbChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBDYWxsYWJsZTxUPj4gdGFza3MpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmludm9rZUFsbCh0YXNrcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIDxUPiBMaXN0PEZ1dHVyZTxUPj4gaW52b2tlQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIENhbGxhYmxlPFQ+PiB0YXNrcywgbG9uZyB0aW1lb3V0LCBUaW1lVW5pdCB1bml0KQorICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5pbnZva2VBbGwodGFza3MsIHRpbWVvdXQsIHVuaXQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyA8VD4gVCBpbnZva2VBbnkoQ29sbGVjdGlvbjw/IGV4dGVuZHMgQ2FsbGFibGU8VD4+IHRhc2tzKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIEV4ZWN1dGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmludm9rZUFueSh0YXNrcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIDxUPiBUIGludm9rZUFueShDb2xsZWN0aW9uPD8gZXh0ZW5kcyBDYWxsYWJsZTxUPj4gdGFza3MsIGxvbmcgdGltZW91dCwgVGltZVVuaXQgdW5pdCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBFeGVjdXRpb25FeGNlcHRpb24sIFRpbWVvdXRFeGNlcHRpb24geworICAgICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5pbnZva2VBbnkodGFza3MsIHRpbWVvdXQsIHVuaXQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcml2YXRlIHZvaWQgdHJ5Q2xlYW5VcCgpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNDbGVhbmVkVXAuY29tcGFyZUFuZFNldChmYWxzZSwgdHJ1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZXhlY3V0b3JzLnJlbW92ZSh0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgZXhlY3V0b3JSZWxlYXNlQ291bnQrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZShSdW5uYWJsZSBjb21tYW5kKSB7CisgICAgICAgICAgICAgICAgZGVsZWdhdGUuZXhlY3V0ZShjb21tYW5kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEN1c3RvbUV4ZWN1dG9yUHJvdmlkZXIgc2VydmVyRXhlY3V0b3JQcm92aWRlciA9IG5ldyBDdXN0b21FeGVjdXRvclByb3ZpZGVyKCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICAvLyBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworICAgICAgICAvLyBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFRlc3RSZXNvdXJjZUEuY2xhc3MsIFRlc3RSZXNvdXJjZUIuY2xhc3MpLnJlZ2lzdGVyKHNlcnZlckV4ZWN1dG9yUHJvdmlkZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJvZHVjZXIgZm9yIEpFUlNFWS0yMjA1IChjbGllbnQtc2lkZSkuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGVzdCBlcnJvci4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21DbGllbnRFeGVjdXRvcnNJbmplY3Rpb25BbmRSZWxlYXNpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ3VzdG9tRXhlY3V0b3JQcm92aWRlciBwcm92aWRlciA9IG5ldyBDdXN0b21FeGVjdXRvclByb3ZpZGVyKCk7CisgICAgICAgIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpLnJlZ2lzdGVyKHByb3ZpZGVyKTsKKworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IGNsaWVudC50YXJnZXQoZ2V0QmFzZVVyaSgpKS5wYXRoKCJyZXNvdXJjZSIpLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygicmVzb3VyY2UiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworCisgICAgICAgIC8vIG5vIGV4ZWN1dG9ycyBzaG91bGQgYmUgY3JlYXRlZCBvciByZWxlYXNlZCBhdCB0aGlzIHBvaW50IHlldAorICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIGNyZWF0ZWQgY2xpZW50IGV4ZWN1dG9ycyIsIDAsIHByb3ZpZGVyLmV4ZWN1dG9yQ3JlYXRpb25Db3VudCk7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBudW1iZXIgb2YgcmVsZWFzZWQgY2xpZW50IGV4ZWN1dG9ycyIsIDAsIHByb3ZpZGVyLmV4ZWN1dG9yUmVsZWFzZUNvdW50KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG51bWJlciBvZiBjbGllbnQgZXhlY3V0b3JzIHN0b3JlZCBpbiB0aGUgc2V0LiIsCisgICAgICAgICAgICAgICAgMCwgcHJvdmlkZXIuZXhlY3V0b3JzLnNpemUoKSk7CisKKyAgICAgICAgRnV0dXJlPFJlc3BvbnNlPiBmciA9IGNsaWVudC50YXJnZXQoZ2V0QmFzZVVyaSgpKS5wYXRoKCJyZXNvdXJjZSIpLnJlcXVlc3QoKS5hc3luYygpLmdldCgpOworICAgICAgICByZXNwb25zZSA9IGZyLmdldCgpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZXNvdXJjZSIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgLy8gc2luZ2xlIGV4ZWN1dG9yIHNob3VsZCBiZSBjcmVhdGVkIGJ1dCBub3QgcmVsZWFzZWQgYXQgdGhpcyBwb2ludCB5ZXQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG51bWJlciBvZiBjcmVhdGVkIGNsaWVudCBleGVjdXRvcnMiLCAxLCBwcm92aWRlci5leGVjdXRvckNyZWF0aW9uQ291bnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIHJlbGVhc2VkIGNsaWVudCBleGVjdXRvcnMiLCAwLCBwcm92aWRlci5leGVjdXRvclJlbGVhc2VDb3VudCk7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBudW1iZXIgb2YgY2xpZW50IGV4ZWN1dG9ycyBzdG9yZWQgaW4gdGhlIHNldC4iLAorICAgICAgICAgICAgICAgIDEsIHByb3ZpZGVyLmV4ZWN1dG9ycy5zaXplKCkpOworCisgICAgICAgIGNsaWVudC5jbG9zZSgpOworCisgICAgICAgIC8vIHRoZSBjcmVhdGVkIGV4ZWN1dG9yIG5lZWRzIHRvIGJlIHJlbGVhc2VkIGJ5IG5vdzsgbm8gbW9yZSBleGVjdXRvcnMgc2hvdWxkIGJlIGNyZWF0ZWQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG51bWJlciBvZiBjcmVhdGVkIGNsaWVudCBleGVjdXRvcnMiLCAxLCBwcm92aWRlci5leGVjdXRvckNyZWF0aW9uQ291bnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIHJlbGVhc2VkIGNsaWVudCBleGVjdXRvcnMiLCAxLCBwcm92aWRlci5leGVjdXRvclJlbGVhc2VDb3VudCk7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBudW1iZXIgb2YgY2xpZW50IGV4ZWN1dG9ycyBzdG9yZWQgaW4gdGhlIHNldC4iLAorICAgICAgICAgICAgICAgIDAsIHByb3ZpZGVyLmV4ZWN1dG9ycy5zaXplKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJvZHVjZXIgZm9yIEpFUlNFWS0yMjA1IChzZXJ2ZXItc2lkZSkuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGVzdCBlcnJvci4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21TZXJ2ZXJFeGVjdXRvcnNJbmplY3Rpb25BbmRSZWxlYXNpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gcmVzZXQgc2VydmVyIGV4ZWN1dG9yIHN0YXRpc3RpY3MgdG8gYXZvaWQgZGF0YSBwb2xsdXRpb24gZnJvbSBvdGhlciB0ZXN0IG1ldGhvZHMKKyAgICAgICAgc2VydmVyRXhlY3V0b3JQcm92aWRlci5yZXNldCgpOworCisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJyZXNvdXJjZSIpLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygicmVzb3VyY2UiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworCisgICAgICAgIC8vIG5vIGV4ZWN1dG9ycyBzaG91bGQgYmUgY3JlYXRlZCBvciByZWxlYXNlZCBhdCB0aGlzIHBvaW50IHlldAorICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIGNyZWF0ZWQgc2VydmVyIGV4ZWN1dG9ycyIsIDAsIHNlcnZlckV4ZWN1dG9yUHJvdmlkZXIuZXhlY3V0b3JDcmVhdGlvbkNvdW50KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG51bWJlciBvZiByZWxlYXNlZCBzZXJ2ZXIgZXhlY3V0b3JzIiwgMCwgc2VydmVyRXhlY3V0b3JQcm92aWRlci5leGVjdXRvclJlbGVhc2VDb3VudCk7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBudW1iZXIgb2Ygc2VydmVyIGV4ZWN1dG9ycyBzdG9yZWQgaW4gdGhlIHNldC4iLAorICAgICAgICAgICAgICAgIDAsIHNlcnZlckV4ZWN1dG9yUHJvdmlkZXIuZXhlY3V0b3JzLnNpemUoKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQoInJlc291cmNlL2FzeW5jIikucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhc3luYy1yZXNvdXJjZS1wYXNzZWQiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworCisgICAgICAgIC8vIHNpbmdsZSBleGVjdXRvciBzaG91bGQgYmUgY3JlYXRlZCBidXQgbm90IHJlbGVhc2VkIGF0IHRoaXMgcG9pbnQgeWV0CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBudW1iZXIgb2YgY3JlYXRlZCBzZXJ2ZXIgZXhlY3V0b3JzIiwgMSwgc2VydmVyRXhlY3V0b3JQcm92aWRlci5leGVjdXRvckNyZWF0aW9uQ291bnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIHJlbGVhc2VkIHNlcnZlciBleGVjdXRvcnMiLCAwLCBzZXJ2ZXJFeGVjdXRvclByb3ZpZGVyLmV4ZWN1dG9yUmVsZWFzZUNvdW50KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG51bWJlciBvZiBzZXJ2ZXIgZXhlY3V0b3JzIHN0b3JlZCBpbiB0aGUgc2V0LiIsCisgICAgICAgICAgICAgICAgMSwgc2VydmVyRXhlY3V0b3JQcm92aWRlci5leGVjdXRvcnMuc2l6ZSgpKTsKKworICAgICAgICB0ZWFyRG93bigpOyAvLyBzdG9wcGluZyB0ZXN0IGNvbnRhaW5lcgorCisgICAgICAgIC8vIHRoZSBjcmVhdGVkIGV4ZWN1dG9yIG5lZWRzIHRvIGJlIHJlbGVhc2VkIGJ5IG5vdzsgbm8gbW9yZSBleGVjdXRvcnMgc2hvdWxkIGJlIGNyZWF0ZWQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG51bWJlciBvZiBjcmVhdGVkIHNlcnZlciBleGVjdXRvcnMiLCAxLCBzZXJ2ZXJFeGVjdXRvclByb3ZpZGVyLmV4ZWN1dG9yQ3JlYXRpb25Db3VudCk7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBudW1iZXIgb2YgcmVsZWFzZWQgc2VydmVyIGV4ZWN1dG9ycyIsIDEsIHNlcnZlckV4ZWN1dG9yUHJvdmlkZXIuZXhlY3V0b3JSZWxlYXNlQ291bnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIHNlcnZlciBleGVjdXRvcnMgc3RvcmVkIGluIHRoZSBzZXQuIiwKKyAgICAgICAgICAgICAgICAwLCBzZXJ2ZXJFeGVjdXRvclByb3ZpZGVyLmV4ZWN1dG9ycy5zaXplKCkpOworCisgICAgICAgIHNldFVwKCk7IC8vIHJlLXN0YXJ0aW5nIHRlc3QgY29udGFpbmVyIHRvIGVuc3VyZSBwcm9wZXIgcG9zdC10ZXN0IHRlYXJEb3duLgorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgbmFtZWQgY3VzdG9tIGV4ZWN1dG9yIGluamVjdGlvbiBhbmQgcmVsZWFzZSBtZWNoYW5pc20uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGVzdCBlcnJvci4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21OYW1lZFNlcnZlckV4ZWN1dG9yc0luamVjdGlvbkFuZFJlbGVhc2luZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzZXJ2ZXJFeGVjdXRvclByb3ZpZGVyLnJlc2V0KCk7CisKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoInJlc291cmNlL2N1c3RvbS1hc3luYyIpLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY3VzdG9tLWFzeW5jLXJlc291cmNlLXBhc3NlZCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgLy8gc2luZ2xlIGV4ZWN1dG9yIHNob3VsZCBiZSBjcmVhdGVkIGJ1dCBub3QgcmVsZWFzZWQgYXQgdGhpcyBwb2ludCB5ZXQKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG51bWJlciBvZiBjcmVhdGVkIHNlcnZlciBleGVjdXRvcnMiLCAxLCBzZXJ2ZXJFeGVjdXRvclByb3ZpZGVyLmV4ZWN1dG9yQ3JlYXRpb25Db3VudCk7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBudW1iZXIgb2YgcmVsZWFzZWQgc2VydmVyIGV4ZWN1dG9ycyIsIDAsIHNlcnZlckV4ZWN1dG9yUHJvdmlkZXIuZXhlY3V0b3JSZWxlYXNlQ291bnQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIHNlcnZlciBleGVjdXRvcnMgc3RvcmVkIGluIHRoZSBzZXQuIiwKKyAgICAgICAgICAgICAgICAxLCBzZXJ2ZXJFeGVjdXRvclByb3ZpZGVyLmV4ZWN1dG9ycy5zaXplKCkpOworCisgICAgICAgIHRlYXJEb3duKCk7IC8vIHN0b3BwaW5nIHRlc3QgY29udGFpbmVyCisKKyAgICAgICAgLy8gdGhlIGNyZWF0ZWQgZXhlY3V0b3IgbmVlZHMgdG8gYmUgcmVsZWFzZWQgYnkgbm93OyBubyBtb3JlIGV4ZWN1dG9ycyBzaG91bGQgYmUgY3JlYXRlZAorICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbnVtYmVyIG9mIGNyZWF0ZWQgc2VydmVyIGV4ZWN1dG9ycyIsIDEsIHNlcnZlckV4ZWN1dG9yUHJvdmlkZXIuZXhlY3V0b3JDcmVhdGlvbkNvdW50KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG51bWJlciBvZiByZWxlYXNlZCBzZXJ2ZXIgZXhlY3V0b3JzIiwgMSwgc2VydmVyRXhlY3V0b3JQcm92aWRlci5leGVjdXRvclJlbGVhc2VDb3VudCk7CisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBudW1iZXIgb2Ygc2VydmVyIGV4ZWN1dG9ycyBzdG9yZWQgaW4gdGhlIHNldC4iLAorICAgICAgICAgICAgICAgIDAsIHNlcnZlckV4ZWN1dG9yUHJvdmlkZXIuZXhlY3V0b3JzLnNpemUoKSk7CisKKyAgICAgICAgc2V0VXAoKTsgLy8gcmUtc3RhcnRpbmcgdGVzdCBjb250YWluZXIgdG8gZW5zdXJlIHByb3BlciBwb3N0LXRlc3QgdGVhckRvd24uCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL0ludGVyY2VwdG9yQ3VzdG9tVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL0ludGVyY2VwdG9yQ3VzdG9tVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYWFjOTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvSW50ZXJjZXB0b3JDdXN0b21UZXN0LmphdmEKQEAgLTAsMCArMSwyMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5QVVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5JbnRlcmNlcHRvckNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SZWFkZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0OworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qcmlvcml0eTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuSW50ZXJjZXB0b3JHemlwVGVzdC5HWklQUmVhZGVyVGVzdEludGVyY2VwdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5JbnRlcmNlcHRvckd6aXBUZXN0LkdaSVBXcml0ZXJUZXN0SW50ZXJjZXB0b3I7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCisvKioKKyAqIFRlc3RzIGludGVyY2VwdG9ycy4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEludGVyY2VwdG9yQ3VzdG9tVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZST01fUkVTT1VSQ0UgPSAiLWZyb21fcmVzb3VyY2UiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFkgPSAiaGVsbG8sIHRoaXMgaXMgdGV4dCBlbnRpdHkiOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhUZXN0UmVzb3VyY2UuY2xhc3MsIEdaSVBXcml0ZXJUZXN0SW50ZXJjZXB0b3IuY2xhc3MsIEdaSVBSZWFkZXJUZXN0SW50ZXJjZXB0b3IuY2xhc3MsCisgICAgICAgICAgICAgICAgUGx1c09uZVdyaXRlckludGVyY2VwdG9yLmNsYXNzLCBNaW51c09uZVJlYWRlckludGVyY2VwdG9yLmNsYXNzLCBBbm5vdGF0aW9uc1JlYWRlcldyaXRlckludGVyY2VwdG9yLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoZmluYWwgQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcucmVnaXN0ZXIoR1pJUFJlYWRlclRlc3RJbnRlcmNlcHRvci5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoR1pJUFdyaXRlclRlc3RJbnRlcmNlcHRvci5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoUGx1c09uZVdyaXRlckludGVyY2VwdG9yLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihNaW51c09uZVJlYWRlckludGVyY2VwdG9yLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihBbm5vdGF0aW9uc1JlYWRlcldyaXRlckludGVyY2VwdG9yLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNb3JlSW50ZXJjZXB0b3JzQW5kRmlsdGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpLnBhdGgoInRlc3QiKTsKKworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkucHV0KEVudGl0eS5lbnRpdHkoRU5USVRZLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIFN0cmluZyBzdHIgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhFTlRJVFkgKyBGUk9NX1JFU09VUkNFLCBzdHIpOworICAgIH0KKworICAgIEBQYXRoKCJ0ZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RSZXNvdXJjZSB7CisKKyAgICAgICAgQFBVVAorICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgICAgICBAQ29uc3VtZXMoInRleHQvcGxhaW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHB1dChTdHJpbmcgc3RyKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInJlc291cmNlOiAiICsgc3RyKTsKKyAgICAgICAgICAgIHJldHVybiBzdHIgKyBGUk9NX1JFU09VUkNFOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogSW50ZXJjZXB0b3Igd2hpY2ggYWRkcyArMSB0byBlYWNoIGJ5dGUgd3JpdHRlbiBpbnRvIHRoZSBzdHJlYW0uCisgICAgICovCisgICAgQFByb3ZpZGVyCisgICAgQFByaW9yaXR5KDMwMCkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBsdXNPbmVXcml0ZXJJbnRlcmNlcHRvciBpbXBsZW1lbnRzIFdyaXRlckludGVyY2VwdG9yIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYXJvdW5kV3JpdGVUbyhXcml0ZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gb2xkID0gY29udGV4dC5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIGNvbnRleHQuc2V0T3V0cHV0U3RyZWFtKG5ldyBPdXRwdXRTdHJlYW0oKSB7CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGIgPT0gMjU1KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvbGQud3JpdGUoMCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvbGQud3JpdGUoYiArIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBjb250ZXh0LnByb2NlZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEludGVyY2VwdG9yIHdoaWNoIGFkZHMgKzEgdG8gZWFjaCBieXRlIHJlYWQgZnJvbSB0aGUgc3RyZWFtLgorICAgICAqLworICAgIEBQcm92aWRlcgorICAgIEBQcmlvcml0eSgzMDApCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNaW51c09uZVJlYWRlckludGVyY2VwdG9yIGltcGxlbWVudHMgUmVhZGVySW50ZXJjZXB0b3IgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgT2JqZWN0IGFyb3VuZFJlYWRGcm9tKFJlYWRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIElucHV0U3RyZWFtIG9sZCA9IGNvbnRleHQuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIGNvbnRleHQuc2V0SW5wdXRTdHJlYW0obmV3IElucHV0U3RyZWFtKCkgeworCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGIgPSBvbGQucmVhZCgpOworICAgICAgICAgICAgICAgICAgICBpZiAoYiA9PSAtMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGIgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDI1NTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBiIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICByZXR1cm4gY29udGV4dC5wcm9jZWVkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnRlcmNlcHRvciB0aGF0IHRyaWVzIHRvIHNldCBhbm5vdGF0aW9ucyBvZiB7QGxpbmsgSW50ZXJjZXB0b3JDb250ZXh0fSB0byB7QGNvZGUgbnVsbH0sCisgICAgICogZW1wdHkgYXJyYXkgYW5kIGZpbmFsbHkgdG8gdGhlIG9yaWdpbmFsIHZhbHVlLgorICAgICAqLworICAgIEBQcm92aWRlcgorICAgIEBQcmlvcml0eSgzMDApCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBbm5vdGF0aW9uc1JlYWRlcldyaXRlckludGVyY2VwdG9yIGltcGxlbWVudHMgUmVhZGVySW50ZXJjZXB0b3IsIFdyaXRlckludGVyY2VwdG9yIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE9iamVjdCBhcm91bmRSZWFkRnJvbShmaW5hbCBSZWFkZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMgPSBjb250ZXh0LmdldEFubm90YXRpb25zKCk7CisKKyAgICAgICAgICAgIC8vIEZhaWxzIGlmIG5vIE5QRSBpcyB0aHJvd24uCisgICAgICAgICAgICB1bnNldEFubm90YXRpb25zKGNvbnRleHQpOworICAgICAgICAgICAgLy8gT2suCisgICAgICAgICAgICBzZXRBbm5vdGF0aW9ucyhjb250ZXh0LCBuZXcgQW5ub3RhdGlvblswXSk7CisgICAgICAgICAgICAvLyBPay4KKyAgICAgICAgICAgIHNldEFubm90YXRpb25zKGNvbnRleHQsIGFubm90YXRpb25zKTsKKworICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQucHJvY2VlZCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGFyb3VuZFdyaXRlVG8oZmluYWwgV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zID0gY29udGV4dC5nZXRBbm5vdGF0aW9ucygpOworCisgICAgICAgICAgICAvLyBGYWlscyBpZiBubyBOUEUgaXMgdGhyb3duLgorICAgICAgICAgICAgdW5zZXRBbm5vdGF0aW9ucyhjb250ZXh0KTsKKyAgICAgICAgICAgIC8vIE9rLgorICAgICAgICAgICAgc2V0QW5ub3RhdGlvbnMoY29udGV4dCwgbmV3IEFubm90YXRpb25bMF0pOworICAgICAgICAgICAgLy8gT2suCisgICAgICAgICAgICBzZXRBbm5vdGF0aW9ucyhjb250ZXh0LCBhbm5vdGF0aW9ucyk7CisKKyAgICAgICAgICAgIGNvbnRleHQucHJvY2VlZCgpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHNldEFubm90YXRpb25zKGZpbmFsIEludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0LCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMpIHsKKyAgICAgICAgICAgIGlmIChjb250ZXh0LmdldEFubm90YXRpb25zKCkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSB2b2lkIHVuc2V0QW5ub3RhdGlvbnMoZmluYWwgSW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5zZXRBbm5vdGF0aW9ucyhudWxsKTsKKworICAgICAgICAgICAgICAgIGZhaWwoIk51bGxQb2ludGVyRXhjZXB0aW9uIGV4cGVjdGVkLiIpOworICAgICAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gbnBlKSB7CisgICAgICAgICAgICAgICAgLy8gT0suCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBAUHJpb3JpdHkoMTAwKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSU9FeGNlcHRpb25SZWFkZXJJbnRlcmNlcHRvciBpbXBsZW1lbnRzIFJlYWRlckludGVyY2VwdG9yIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE9iamVjdCBhcm91bmRSZWFkRnJvbShmaW5hbCBSZWFkZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oImNsaWVudCBpbyIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SU9FeGNlcHRpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjbGllbnQoKS5yZWdpc3RlcihJT0V4Y2VwdGlvblJlYWRlckludGVyY2VwdG9yLmNsYXNzKTsKKworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCkucGF0aCgidGVzdCIpOworCisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5wdXQoRW50aXR5LmVudGl0eShFTlRJVFksIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgZmFpbCgiUHJvY2Vzc2luZ0V4Y2VwdGlvbiBleHBlY3RlZC4iKTsKKyAgICAgICAgfSBjYXRjaCAoUHJvY2Vzc2luZ0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKGUuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL0ludGVyY2VwdG9yR3ppcFRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9JbnRlcmNlcHRvckd6aXBUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY0NzVhYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9JbnRlcmNlcHRvckd6aXBUZXN0LmphdmEKQEAgLTAsMCArMSwxNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC56aXAuR1pJUElucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC56aXAuR1pJUE91dHB1dFN0cmVhbTsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLlBVVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SZWFkZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0OworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qcmlvcml0eTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdHMgZ3ppcCBpbnRlcmNlcHRvcnMuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICoKKyAqLworcHVibGljIGNsYXNzIEludGVyY2VwdG9yR3ppcFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGUk9NX1JFU09VUkNFID0gIi1mcm9tX3Jlc291cmNlIjsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoVGVzdFJlc291cmNlLmNsYXNzLCBHWklQV3JpdGVyVGVzdEludGVyY2VwdG9yLmNsYXNzLAorICAgICAgICAgICAgICAgIEdaSVBSZWFkZXJUZXN0SW50ZXJjZXB0b3IuY2xhc3MpOyAvLyBHWklQSW50ZXJjZXB0b3IuY2xhc3MKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHemlwSW50ZXJjZXB0b3JPbmx5T25TZXJ2ZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBjbGllbnQoKS5yZWdpc3RlcihHWklQV3JpdGVyVGVzdEludGVyY2VwdG9yLmNsYXNzKTsKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpLnBhdGgoInRlc3QiKTsKKyAgICAgICAgU3RyaW5nIGVudGl0eSA9ICJoZWxsbywgdGhpcyBpcyB0ZXh0IGVudGl0eSI7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5wdXQoRW50aXR5LmVudGl0eShlbnRpdHksIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSByZXNwb25zZS5yZWFkRW50aXR5KElucHV0U3RyZWFtLmNsYXNzKTsKKyAgICAgICAgR1pJUElucHV0U3RyZWFtIGd6aXBJcyA9IG5ldyBHWklQSW5wdXRTdHJlYW0oaXMpOworICAgICAgICBCdWZmZXJlZFJlYWRlciBiciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgSW5wdXRTdHJlYW1SZWFkZXIoZ3ppcElzKSk7CisgICAgICAgIFN0cmluZyBzdHIgPSBici5yZWFkTGluZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoZW50aXR5ICsgRlJPTV9SRVNPVVJDRSwgc3RyKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHemlwSW50ZXJjZXB0b3JPblNlcnZlcmFuZENsaWVudCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGNsaWVudCgpLnJlZ2lzdGVyKEdaSVBSZWFkZXJUZXN0SW50ZXJjZXB0b3IuY2xhc3MpLnJlZ2lzdGVyKEdaSVBXcml0ZXJUZXN0SW50ZXJjZXB0b3IuY2xhc3MpOworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCkucGF0aCgidGVzdCIpOworICAgICAgICBTdHJpbmcgZW50aXR5ID0gImhlbGxvLCB0aGlzIGlzIHRleHQgZW50aXR5IjsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLnB1dChFbnRpdHkuZW50aXR5KGVudGl0eSwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBTdHJpbmcgc3RyID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoZW50aXR5ICsgRlJPTV9SRVNPVVJDRSwgc3RyKTsKKyAgICB9CisKKyAgICBAUGF0aCgidGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0UmVzb3VyY2UgeworCisgICAgICAgIEBQVVQKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgQENvbnN1bWVzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgcHVibGljIFN0cmluZyBwdXQoU3RyaW5nIHN0cikgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJyZXNvdXJjZTogIiArIHN0cik7CisgICAgICAgICAgICByZXR1cm4gc3RyICsgRlJPTV9SRVNPVVJDRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIEBQcmlvcml0eSgyMDApCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDdXN0b21Xcml0ZXJJbnRlcmNlcHRvciBpbXBsZW1lbnRzIFdyaXRlckludGVyY2VwdG9yIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgYXJvdW5kV3JpdGVUbyhXcml0ZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gb2xkID0gY29udGV4dC5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbSBuZXdPdXQgPSBuZXcgT3V0cHV0U3RyZWFtKCkgeworCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIGlmIChiID09IEJ5dGUuTUFYX1ZBTFVFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvbGQud3JpdGUoQnl0ZS5NSU5fVkFMVUUpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgb2xkLndyaXRlKGIgKyAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBjb250ZXh0LnNldE91dHB1dFN0cmVhbShuZXdPdXQpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LnByb2NlZWQoKTsKKyAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5zZXRPdXRwdXRTdHJlYW0ob2xkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIEBQcmlvcml0eSgyMDApCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBHWklQV3JpdGVyVGVzdEludGVyY2VwdG9yIGltcGxlbWVudHMgV3JpdGVySW50ZXJjZXB0b3IgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBhcm91bmRXcml0ZVRvKFdyaXRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIE91dHB1dFN0cmVhbSBvbGQgPSBjb250ZXh0LmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgR1pJUE91dHB1dFN0cmVhbSBuZXdTdHJlYW0gPSBuZXcgR1pJUE91dHB1dFN0cmVhbShvbGQpOworICAgICAgICAgICAgY29udGV4dC5zZXRPdXRwdXRTdHJlYW0obmV3U3RyZWFtKTsKKyAgICAgICAgICAgIGlmIChjb250ZXh0LmdldEhlYWRlcnMoKS5jb250YWluc0tleShIdHRwSGVhZGVycy5DT05URU5UX0xFTkdUSCkpIHsKKyAgICAgICAgICAgICAgICBMaXN0PE9iamVjdD4gY2xlbiA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICAgICAgICAgIGNsZW4uYWRkKC0xTCk7CisgICAgICAgICAgICAgICAgY29udGV4dC5nZXRIZWFkZXJzKCkucHV0KEh0dHBIZWFkZXJzLkNPTlRFTlRfTEVOR1RILCBjbGVuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5wcm9jZWVkKCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIG5ld1N0cmVhbS5maW5pc2goKTsKKyAgICAgICAgICAgICAgICBjb250ZXh0LnNldE91dHB1dFN0cmVhbShvbGQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgQFByaW9yaXR5KDIwMCkKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEdaSVBSZWFkZXJUZXN0SW50ZXJjZXB0b3IgaW1wbGVtZW50cyBSZWFkZXJJbnRlcmNlcHRvciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPYmplY3QgYXJvdW5kUmVhZEZyb20oUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgSW5wdXRTdHJlYW0gb2xkID0gY29udGV4dC5nZXRJbnB1dFN0cmVhbSgpOworICAgICAgICAgICAgY29udGV4dC5zZXRJbnB1dFN0cmVhbShuZXcgR1pJUElucHV0U3RyZWFtKG9sZCkpOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5wcm9jZWVkKCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0SW5wdXRTdHJlYW0ob2xkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL0xpbmtUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvTGlua1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzAzM2VkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL0xpbmtUZXN0LmphdmEKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5MaW5rOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS51cmkuVXJpVGVtcGxhdGU7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitwdWJsaWMgY2xhc3MgTGlua1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBQYXRoKCJyZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFByb2R1Y2VzKHsKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUuQVBQTElDQVRJT05fWEhUTUxfWE1MLAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9BVE9NX1hNTCwKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUuQVBQTElDQVRJT05fU1ZHX1hNTAorICAgICAgICB9KQorICAgICAgICBAUGF0aCgicHJvZHVjZXN4bWwiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHByb2R1Y2VzWG1sKCkgeworICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcywgTGlua1Rlc3RSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkgeworICAgICAgICBMaW5rIGxpbmsgPSBMaW5rLmZyb21NZXRob2QoUmVzb3VyY2UuY2xhc3MsICJwcm9kdWNlc1htbCIpLmJ1aWxkKCk7CisgICAgICAgIFN0cmluZyBzdHJpbmcgPSBsaW5rLnRvU3RyaW5nKCk7CisgICAgICAgIExpbmsgZnJvbVZhbHVlT2YgPSBMaW5rLnZhbHVlT2Yoc3RyaW5nKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGxpbmssIGZyb21WYWx1ZU9mKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGcm9tUmVzb3VyY2VNZXRob2QoKSB7CisgICAgICAgIExpbmsgbGluayA9IExpbmsuZnJvbU1ldGhvZChSZXNvdXJjZS5jbGFzcywgInByb2R1Y2VzWG1sIikuYnVpbGQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJwcm9kdWNlc3htbCIsIGxpbmsuZ2V0VXJpKCkudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVsaW1pdGVycygpIHsKKyAgICAgICAgTGluay5CdWlsZGVyIGJ1aWxkZXIgPSBMaW5rLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3Q6ODAiKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlID0gInBhcmFtMXZhbHVlMSAgICBwYXJhbTF2YWx1ZTIiOworICAgICAgICBidWlsZGVyID0gYnVpbGRlci5wYXJhbSgicGFyYW0xIiwgdmFsdWUpOworICAgICAgICBMaW5rIGxpbmsgPSBidWlsZGVyLmJ1aWxkKCk7CisgICAgICAgIGZpbmFsIE1hcDxTdHJpbmcsIFN0cmluZz4gcGFyYW1zID0gbGluay5nZXRQYXJhbXMoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlLCBwYXJhbXMuZ2V0KCJwYXJhbTEiKSk7CisgICAgfQorCisgICAgQFBhdGgoImxpbmt0ZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIExpbmtUZXN0UmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldChAQ29udGV4dCBVcmlJbmZvIHVyaUluZm8pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgVVJJIHRlc3QxID0gVVJJLmNyZWF0ZSh1cmlJbmZvLmdldEFic29sdXRlUGF0aCgpLnRvU3RyaW5nKCkgKyAidGVzdDEiKTsKKyAgICAgICAgICAgIFVSSSB0ZXN0MiA9IFVSSS5jcmVhdGUodXJpSW5mby5nZXRBYnNvbHV0ZVBhdGgoKS50b1N0cmluZygpICsgInRlc3QyIik7CisKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygpCisgICAgICAgICAgICAgICAgICAgIC5saW5rKCJodHRwOi8vb3JhY2xlLmNvbSIsICJwYXJlbnQiKQorICAgICAgICAgICAgICAgICAgICAubGluayhuZXcgVVJJKCJodHRwOi8vamVyc2V5LmphdmEubmV0IiksICJmcmFtZXdvcmsiKQorICAgICAgICAgICAgICAgICAgICAubGlua3MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGluay5mcm9tVXJpKHVyaUluZm8ucmVsYXRpdml6ZSh0ZXN0MSkpLnJlbCgidGVzdDEiKS5idWlsZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbmsuZnJvbVVyaSh0ZXN0MikucmVsKCJ0ZXN0MiIpLmJ1aWxkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGluay5mcm9tVXJpKHVyaUluZm8ucmVsYXRpdml6ZShVUkkuY3JlYXRlKCJsaW5rdGVzdC90ZXN0MyIpKSkucmVsKCJ0ZXN0MyIpLmJ1aWxkKCkKKyAgICAgICAgICAgICAgICAgICAgKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBzaW1wbGVMaW5rVGVzdCgpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgiL2xpbmt0ZXN0LyIpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oMjAwKSk7CisKKyAgICAgICAgZmluYWwgVVJJIHRhcmdldFVyaSA9IHRhcmdldC5nZXRVcmkoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRMaW5rKCJwYXJlbnQiKS5nZXRVcmkoKSwgZXF1YWxUbyhVUkkuY3JlYXRlKCJodHRwOi8vb3JhY2xlLmNvbSIpKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0TGluaygiZnJhbWV3b3JrIikuZ2V0VXJpKCksIGVxdWFsVG8oVVJJLmNyZWF0ZSgiaHR0cDovL2plcnNleS5qYXZhLm5ldCIpKSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRMaW5rKCJ0ZXN0MSIpLmdldFVyaSgpLCBlcXVhbFRvKFVyaVRlbXBsYXRlLnJlc29sdmUodGFyZ2V0VXJpLCAidGVzdDEiKSkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldExpbmsoInRlc3QyIikuZ2V0VXJpKCksIGVxdWFsVG8oVXJpVGVtcGxhdGUucmVzb2x2ZSh0YXJnZXRVcmksICJ0ZXN0MiIpKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0TGluaygidGVzdDMiKS5nZXRVcmkoKSwgZXF1YWxUbyhVcmlUZW1wbGF0ZS5yZXNvbHZlKHRhcmdldFVyaSwgInRlc3QzIikpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvTWVzc2FnZUJvZHlFeGNlcHRpb25XcmFwcGluZ1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9NZXNzYWdlQm9keUV4Y2VwdGlvbldyYXBwaW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNWQyZTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvTWVzc2FnZUJvZHlFeGNlcHRpb25XcmFwcGluZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDE0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworCitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworCitpbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCitpbXBvcnQgc3RhdGljIGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHkuZW50aXR5OworCisvKioKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIE1lc3NhZ2VCb2R5RXhjZXB0aW9uV3JhcHBpbmdUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFRlc3RSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgd2hldGhlciBmYWlsIG9mIG1lc3NhZ2UgYm9keSB3cml0ZXIgY2F1c2VzIHRocm93aW5nIGV4Y2VwdGlvbi4gUHJldmlvdXNseSB0aGUKKyAgICAgKiBleGNlcHRpb24gd2FzIG5vdCB0aHJvd24gYW5kIDUwMCBzdGF0dXMgY29kZSB3YXMgcmV0dXJuZWQgaW4gdGhlIHJlc3BvbnNlLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdyYXBwaW5nKCkgeworICAgICAgICBXZWJUYXJnZXQgcmVzb3VyY2UgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0Iik7CisgICAgICAgIFN0cmVhbVNvdXJjZSBzb3VyY2UgPSBuZXcgU3RyZWFtU291cmNlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKDU1NSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHJlc291cmNlLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoc291cmNlLCBNZWRpYVR5cGUuVEVYVF9YTUxfVFlQRSkpOworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIGV4cGVjdGVkLCBpbnN0ZWFkIHJlc3BvbnNlIHdpdGggIiArIHJlc3BvbnNlLmdldFN0YXR1cygpICsgIiBzdGF0dXMgaGFzIGJlZW4gcmV0dXJuZWQuIik7CisgICAgICAgIH0gY2F0Y2ggKFByb2Nlc3NpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uLmNsYXNzLCBlLmdldENhdXNlKCkuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoNTU1LCAoKFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKSBlLmdldENhdXNlKCkpLmdldFJlc3BvbnNlKCkuZ2V0U3RhdHVzKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInRlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFJlc291cmNlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGVjaG8oU3RyaW5nIGVudGl0eSkgeworICAgICAgICAgICAgcmV0dXJuIGVudGl0eTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFByb3ZpZGVyIHJlcHJvZHVjaW5nIEpFUlNFWS0xOTkwLgorICAgICAqLworICAgIEBQcm9kdWNlcygidGV4dC9mb28iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGhyb3dpbmdVcFByb3ZpZGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8U3RyaW5nPiwgTWVzc2FnZUJvZHlSZWFkZXI8U3RyaW5nPiB7CisgICAgICAgIHB1YmxpYyB2b2xhdGlsZSBpbnQgY291bnRlciA9IDA7CisKKyAgICAgICAgcHVibGljIGludCBnZXRJbnZvY2F0aW9uQ291bnQoKSB7CisgICAgICAgICAgICByZXR1cm4gY291bnRlcjsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIGNvdW50ZXIrKzsKKyAgICAgICAgICAgIGZpbmFsIFJ1bnRpbWVFeGNlcHRpb24gdXAgPSBuZXcgUnVudGltZUV4Y2VwdGlvbigibHVuY2giKTsKKyAgICAgICAgICAgIHRocm93IHVwOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldFNpemUoU3RyaW5nIHMsIENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oU3RyaW5nIHMsIENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRoaXMgbWV0aG9kIHNob3VsZCBub3QgaGF2ZSBldmVyIGJlZW4gY2FsbGVkLiIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICBjb3VudGVyKys7CisgICAgICAgICAgICBmaW5hbCBSdW50aW1lRXhjZXB0aW9uIHVwID0gbmV3IFJ1bnRpbWVFeGNlcHRpb24oImRpbm5lciIpOworICAgICAgICAgICAgdGhyb3cgdXA7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyByZWFkRnJvbShDbGFzczxTdHJpbmc+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhpcyBtZXRob2Qgc2hvdWxkIG5vdCBoYXZlIGV2ZXIgYmVlbiBjYWxsZWQuIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByb2R1Y2VyIGZvciBKRVJTRVktMTk5MC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYndIYW5kbGluZ0V4Y2VwdGlvbkluSXNSZWFkYWJsZVdyaXRhYmxlKCkgeworICAgICAgICBUaHJvd2luZ1VwUHJvdmlkZXIgdGhyb3dpbmdVcFByb3ZpZGVyID0gbmV3IFRocm93aW5nVXBQcm92aWRlcigpOworCisgICAgICAgIGZpbmFsIFN0cmluZyByZXNwb25zZSA9CisgICAgICAgICAgICAgICAgdGFyZ2V0KCJ0ZXN0IikucmVnaXN0ZXIodGhyb3dpbmdVcFByb3ZpZGVyKS5yZXF1ZXN0KCJ0ZXh0L2ZvbyIpLnBvc3QoZW50aXR5KCJoZWxsbyIsICJ0ZXh0L2ZvbyIpLCBTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscygiaGVsbG8iLCByZXNwb25zZSk7CisgICAgICAgIGFzc2VydEVxdWFscygyLCB0aHJvd2luZ1VwUHJvdmlkZXIuZ2V0SW52b2NhdGlvbkNvdW50KCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NsaWVudC9jb25uZWN0b3IvSHVnZUVudGl0eVRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvY29ubmVjdG9yL0h1Z2VFbnRpdHlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y2ZTBhNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvY29ubmVjdG9yL0h1Z2VFbnRpdHlUZXN0LmphdmEKQEAgLTAsMCArMSwyMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNsaWVudC5jb25uZWN0b3I7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOworCitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuUmVxdWVzdEVudGl0eVByb2Nlc3Npbmc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnNwaS5Db25uZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5LmNvbm5lY3Rvci5Hcml6emx5Q29ubmVjdG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamRrLmNvbm5lY3Rvci5KZGtDb25uZWN0b3JQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBUZXN0IHRvIG1ha2Ugc3VyZSBodWdlIGVudGl0eSBnZXRzIGNodW5rLWVuY29kZWQuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBIdWdlRW50aXR5VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9MRU5HVEggPSAxMDI0ICogMTAyNDsgLy8gMU0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEhVR0VfREFUQV9MRU5HVEggPSAyMEwgKiAxMDI0TCAqIDEwMjRMICogMTAyNEw7IC8vIDIwRyBzZWVtcyBzdWZmaWNpZW50CisKKyAgICAvKioKKyAgICAgKiBKRVJTRVktMjMzNyByZXByb2R1Y2VyLiBUaGUgcmVzb3VyY2UgaXMgdXNlZCB0byBjaGVjayB0aGUgcmlnaHQgYW1vdW50IG9mIGRhdGEKKyAgICAgKiBpcyBiZWluZyByZWNlaXZlZCBmcm9tIHRoZSBjbGllbnQgYW5kIGFsc28gZ2l2ZXMgdXMgYWJpbGl0eSB0byBjaGVjayB3ZSByZWNlaXZlCisgICAgICogY29ycmVjdCBkYXRhLgorICAgICAqLworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbnN1bWVyUmVzb3VyY2UgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gYmFjayB0aGUgY291bnQgb2YgYnl0ZXMgcmVjZWl2ZWQuCisgICAgICAgICAqIFRoaXMgd2F5LCB3ZSBzaG91bGQgYmUgYWJsZSB0byBjb25zdW1lIGEgaHVnZSBhbW91bnQgb2YgZGF0YS4KKyAgICAgICAgICovCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJzaXplIikKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0KElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24geworCisgICAgICAgICAgICBsb25nIHRvdGFsQnl0ZXNSZWFkID0gMEw7CisKKyAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtCVUZGRVJfTEVOR1RIXTsKKyAgICAgICAgICAgIGludCByZWFkOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIHJlYWQgPSBpbi5yZWFkKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgaWYgKHJlYWQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHRvdGFsQnl0ZXNSZWFkICs9IHJlYWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAocmVhZCAhPSAtMSk7CisKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZih0b3RhbEJ5dGVzUmVhZCk7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgiZWNobyIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZWNobyhTdHJpbmcgcykgeworICAgICAgICAgICAgcmV0dXJuIHM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIENvbm5lY3RvclByb3ZpZGVyIGNvbm5lY3RvclByb3ZpZGVyOworCisgICAgcHVibGljIEh1Z2VFbnRpdHlUZXN0KENvbm5lY3RvclByb3ZpZGVyIGNvbm5lY3RvclByb3ZpZGVyKSB7CisgICAgICAgIHRoaXMuY29ubmVjdG9yUHJvdmlkZXIgPSBjb25uZWN0b3JQcm92aWRlcjsKKyAgICB9CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzCisgICAgcHVibGljIHN0YXRpYyBMaXN0PD8gZXh0ZW5kcyBDb25uZWN0b3JQcm92aWRlcj4gdGVzdERhdGEoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBHcml6emx5Q29ubmVjdG9yUHJvdmlkZXIoKSwgbmV3IEpka0Nvbm5lY3RvclByb3ZpZGVyKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoQ29uc3VtZXJSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKFRlc3RFbnRpdHlXcml0ZXIuY2xhc3MpOworICAgICAgICBjb25maWcucHJvcGVydHkoQ2xpZW50UHJvcGVydGllcy5SRVFVRVNUX0VOVElUWV9QUk9DRVNTSU5HLCBSZXF1ZXN0RW50aXR5UHJvY2Vzc2luZy5DSFVOS0VEKTsKKyAgICAgICAgY29uZmlnLmNvbm5lY3RvclByb3ZpZGVyKGNvbm5lY3RvclByb3ZpZGVyKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RFbnRpdHkgeworCisgICAgICAgIGZpbmFsIGxvbmcgc2l6ZTsKKworICAgICAgICBwdWJsaWMgVGVzdEVudGl0eShsb25nIHNpemUpIHsKKyAgICAgICAgICAgIHRoaXMuc2l6ZSA9IHNpemU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IHdyaXRlciB0aGF0IGdlbmVyYXRlcyB0aGF0IG1hbnkgemVybyBieXRlcyBhcyBnaXZlbiBieSB0aGUgaW5wdXQgZW50aXR5IHNpemUgZmllbGQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0RW50aXR5V3JpdGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8VGVzdEVudGl0eT4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlID09IFRlc3RFbnRpdHkuY2xhc3M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShUZXN0RW50aXR5IHQsIENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOyAvLyBubyBtYXR0ZXIgd2hhdCB3ZSByZXR1cm4gaGVyZSwgdGhlIG91dHB1dCB3aWxsIGdldCBjaHVuay1lbmNvZGVkCisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbyhUZXN0RW50aXR5IHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgZmluYWwgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlW0JVRkZFUl9MRU5HVEhdOworICAgICAgICAgICAgZmluYWwgbG9uZyBidWZmZXJDb3VudCA9IHQuc2l6ZSAvIEJVRkZFUl9MRU5HVEg7CisgICAgICAgICAgICBmaW5hbCBpbnQgcmVtYWluZGVyID0gKGludCkgKHQuc2l6ZSAlIEJVRkZFUl9MRU5HVEgpOworCisgICAgICAgICAgICBmb3IgKGxvbmcgYiA9IDA7IGIgPCBidWZmZXJDb3VudDsgYisrKSB7CisgICAgICAgICAgICAgICAgZW50aXR5U3RyZWFtLndyaXRlKGJ1ZmZlcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChyZW1haW5kZXIgPiAwKSB7CisgICAgICAgICAgICAgICAgZW50aXR5U3RyZWFtLndyaXRlKGJ1ZmZlciwgMCwgcmVtYWluZGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEpFUlNFWS0yMzM3IHJlcHJvZHVjZXIuIFdlIGFyZSBnb2luZyB0byBzZW5kIGh1Z2UgYW1vdW50IG9mIGRhdGEgb3ZlciB0aGUgd2lyZS4KKyAgICAgKiBTaG91bGQgbm90IHRoZSBkYXRhIGhhdmUgYmVlbiBjaHVuay1lbmNvZGVkLCB3ZSB3b3VsZCBlYXNpbHkgcnVuIG91dCBvZiBtZW1vcnkuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGVzdCBlcnJvci4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCIvc2l6ZSIpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkobmV3IFRlc3RFbnRpdHkoSFVHRV9EQVRBX0xFTkdUSCksIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9PQ1RFVF9TVFJFQU1fVFlQRSkpOworICAgICAgICBTdHJpbmcgY29udGVudCA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VGhhdChMb25nLnBhcnNlTG9uZyhjb250ZW50KSwgZXF1YWxUbyhIVUdFX0RBVEFfTEVOR1RIKSk7CisKKyAgICAgICAgLy8ganVzdCB0byBjaGVjayB0aGUgcmlnaHQgZGF0YSBoYXZlIGJlZW4gdHJhbnNmZXJlZC4KKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQoIi9lY2hvIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LnRleHQoIkhleSBTeW5jISIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGVxdWFsVG8oIkhleSBTeW5jISIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBKRVJTRVktMjMzNyByZXByb2R1Y2VyLiBXZSBhcmUgZ29pbmcgdG8gc2VuZCBodWdlIGFtb3VudCBvZiBkYXRhIG92ZXIgdGhlIHdpcmUuIFRoaXMgdGltZSBpbiBhbiBhc3luYyBmYXNoaW9uLgorICAgICAqIFNob3VsZCBub3QgdGhlIGRhdGEgaGF2ZSBiZWVuIGNodW5rLWVuY29kZWQsIHdlIHdvdWxkIGVhc2lseSBydW4gb3V0IG9mIG1lbW9yeS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGluIGNhc2Ugb2YgYSB0ZXN0IGVycm9yLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEFzeW5jUG9zdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBGdXR1cmU8UmVzcG9uc2U+IHJlc3BvbnNlID0gdGFyZ2V0KCIvc2l6ZSIpLnJlcXVlc3QoKS5hc3luYygpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eShuZXcgVGVzdEVudGl0eShIVUdFX0RBVEFfTEVOR1RIKSwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX09DVEVUX1NUUkVBTV9UWVBFKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBjb250ZW50ID0gcmVzcG9uc2UuZ2V0KCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KExvbmcucGFyc2VMb25nKGNvbnRlbnQpLCBlcXVhbFRvKEhVR0VfREFUQV9MRU5HVEgpKTsKKworICAgICAgICAvLyBqdXN0IHRvIGNoZWNrIHRoZSByaWdodCBkYXRhIGhhdmUgYmVlbiB0cmFuc2ZlcmVkLgorICAgICAgICByZXNwb25zZSA9IHRhcmdldCgiL2VjaG8iKS5yZXF1ZXN0KCkuYXN5bmMoKS5wb3N0KEVudGl0eS50ZXh0KCJIZXkgQXN5bmMhIikpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldCgpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbygiSGV5IEFzeW5jISIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L2Nvbm5lY3Rvci9NZXRob2RUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY2xpZW50L2Nvbm5lY3Rvci9NZXRob2RUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNkMmQwZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jbGllbnQvY29ubmVjdG9yL01ldGhvZFRlc3QuamF2YQpAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY2xpZW50LmNvbm5lY3RvcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5ERUxFVEU7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUFVUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5zcGkuQ29ubmVjdG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseS5jb25uZWN0b3IuR3JpenpseUNvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lmpkay5jb25uZWN0b3IuSmRrQ29ubmVjdG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0cyB0aGUgSHR0cCBtZXRob2RzLgorICoKKyAqIEBhdXRob3IgU3RlcGFuIEtvcHJpdmEKKyAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBNZXRob2RUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFUSCA9ICJ0ZXN0IjsKKworICAgIEBQYXRoKCIvdGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBIdHRwTWV0aG9kUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gIkdFVCI7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3QoU3RyaW5nIGVudGl0eSkgeworICAgICAgICAgICAgcmV0dXJuIGVudGl0eTsKKyAgICAgICAgfQorCisgICAgICAgIEBQVVQKKyAgICAgICAgcHVibGljIFN0cmluZyBwdXQoU3RyaW5nIGVudGl0eSkgeworICAgICAgICAgICAgcmV0dXJuIGVudGl0eTsKKyAgICAgICAgfQorCisgICAgICAgIEBERUxFVEUKKyAgICAgICAgcHVibGljIFN0cmluZyBkZWxldGUoKSB7CisgICAgICAgICAgICByZXR1cm4gIkRFTEVURSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIENvbm5lY3RvclByb3ZpZGVyIGNvbm5lY3RvclByb3ZpZGVyOworCisgICAgcHVibGljIE1ldGhvZFRlc3QoQ29ubmVjdG9yUHJvdmlkZXIgY29ubmVjdG9yUHJvdmlkZXIpIHsKKyAgICAgICAgdGhpcy5jb25uZWN0b3JQcm92aWRlciA9IGNvbm5lY3RvclByb3ZpZGVyOworICAgIH0KKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8PyBleHRlbmRzIENvbm5lY3RvclByb3ZpZGVyPiB0ZXN0RGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IEdyaXp6bHlDb25uZWN0b3JQcm92aWRlcigpLCBuZXcgSmRrQ29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhIdHRwTWV0aG9kUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5jb25uZWN0b3JQcm92aWRlcihjb25uZWN0b3JQcm92aWRlcik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldChQQVRIKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiR0VUIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0KCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldChQQVRIKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KCJQT1NUIiwgTWVkaWFUeXBlLlRFWFRfUExBSU4pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJQT1NUIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQdXQoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KFBBVEgpLnJlcXVlc3QoKS5wdXQoRW50aXR5LmVudGl0eSgiUFVUIiwgTWVkaWFUeXBlLlRFWFRfUExBSU4pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJQVVQiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlbGV0ZSgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoUEFUSCkucmVxdWVzdCgpLmRlbGV0ZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkRFTEVURSIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9BdXRvRGlzY292ZXJhYmxlVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9BdXRvRGlzY292ZXJhYmxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMGI3YzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL0F1dG9EaXNjb3ZlcmFibGVUZXN0LmphdmEKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdHJhaW5lZFRvOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5SdW50aW1lVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5zcGkuQXV0b0Rpc2NvdmVyYWJsZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlByb3BlcnRpZXNIZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBOb3RlOiBBdXRvLWRpc2NvdmVyYWJsZXMgZnJvbSB0aGlzIHRlc3QgImFmZmVjdHMiIGFsbCBvdGhlciB0ZXN0cyBpbiBzdWl0LgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgQXV0b0Rpc2NvdmVyYWJsZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWSA9ICJBdXRvRGlzY292ZXJhYmxlVGVzdCI7CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbW1vbkF1dG9EaXNjb3ZlcmFibGUgaW1wbGVtZW50cyBBdXRvRGlzY292ZXJhYmxlIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY29uZmlndXJlKGZpbmFsIEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIC8vIFJldHVybiBpZiBQUk9QRVJUWSBpcyBub3QgdHJ1ZSAtIGFwcGxpY2FibGUgZm9yIG90aGVyIHRlc3RzLgorICAgICAgICAgICAgaWYgKCFQcm9wZXJ0aWVzSGVscGVyLmlzUHJvcGVydHkoY29udGV4dC5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UHJvcGVydHkoUFJPUEVSVFkpKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihuZXcgV3JpdGVySW50ZXJjZXB0b3IoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYXJvdW5kV3JpdGVUbyhmaW5hbCBXcml0ZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0RW50aXR5KGNvbnRleHQuZ2V0RW50aXR5KCkgKyAiLWNvbW1vbiIpOworCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQucHJvY2VlZCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sIDEpOworICAgICAgICB9CisgICAgfQorCisgICAgQENvbnN0cmFpbmVkVG8oUnVudGltZVR5cGUuQ0xJRU5UKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2xpZW50QXV0b0Rpc2NvdmVyYWJsZSBpbXBsZW1lbnRzIEF1dG9EaXNjb3ZlcmFibGUgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoZmluYWwgRmVhdHVyZUNvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgLy8gUmV0dXJuIGlmIFBST1BFUlRZIGlzIG5vdCB0cnVlIC0gYXBwbGljYWJsZSBmb3Igb3RoZXIgdGVzdHMuCisgICAgICAgICAgICBpZiAoIVByb3BlcnRpZXNIZWxwZXIuaXNQcm9wZXJ0eShjb250ZXh0LmdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0eShQUk9QRVJUWSkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKG5ldyBXcml0ZXJJbnRlcmNlcHRvcigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhcm91bmRXcml0ZVRvKGZpbmFsIFdyaXRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zZXRFbnRpdHkoY29udGV4dC5nZXRFbnRpdHkoKSArICItY2xpZW50Iik7CisKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5wcm9jZWVkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwgMTApOworICAgICAgICB9CisgICAgfQorCisgICAgQENvbnN0cmFpbmVkVG8oUnVudGltZVR5cGUuU0VSVkVSKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2VydmVyQXV0b0Rpc2NvdmVyYWJsZSBpbXBsZW1lbnRzIEF1dG9EaXNjb3ZlcmFibGUgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoZmluYWwgRmVhdHVyZUNvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgLy8gUmV0dXJuIGlmIFBST1BFUlRZIGlzIG5vdCB0cnVlIC0gYXBwbGljYWJsZSBmb3Igb3RoZXIgdGVzdHMuCisgICAgICAgICAgICBpZiAoIVByb3BlcnRpZXNIZWxwZXIuaXNQcm9wZXJ0eShjb250ZXh0LmdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0eShQUk9QRVJUWSkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKG5ldyBXcml0ZXJJbnRlcmNlcHRvcigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhcm91bmRXcml0ZVRvKGZpbmFsIFdyaXRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zZXRFbnRpdHkoY29udGV4dC5nZXRFbnRpdHkoKSArICItc2VydmVyIik7CisKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5wcm9jZWVkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwgMTApOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdChmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MpLnByb3BlcnR5KFBST1BFUlRZLCB0cnVlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoZmluYWwgQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcucHJvcGVydHkoUFJPUEVSVFksIHRydWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEF1dG9EaXNjb3ZlcmFibGVDb25zdHJhaW5lZFRvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLnBvc3QoRW50aXR5LnRleHQoInZhbHVlIikpOworCisgICAgICAgIGFzc2VydEVxdWFscygidmFsdWUtY29tbW9uLWNsaWVudC1jb21tb24tc2VydmVyIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL0NvbnN0cmFpbmVkVG9UZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL0NvbnN0cmFpbmVkVG9UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzliYmM1ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vQ29uc3RyYWluZWRUb1Rlc3QuamF2YQpAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN0cmFpbmVkVG87CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUnVudGltZVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlc3BvbnNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVzcG9uc2VGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBUZXN0cyB3aGV0aGVyIHByb3ZpZGVycyBhcmUgY29ycmVjdGx5IHZhbGlkYXRlZCBpbiB0aGUgY2xpZW50IHJ1bnRpbWUgKGZvciBleGFtcGxlIGlmIHByb3ZpZGVyIGNvbnN0cmFpbmVkIHRvCisgKiBzZXJ2ZXIgcnVudGltZSBpcyBza2lwcGVkIGluIHRoZSBjbGllbnQpLgorCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKgorICovCitwdWJsaWMgY2xhc3MgQ29uc3RyYWluZWRUb1Rlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsaWVudFdpdGhQcm92aWRlckNsYXNzZXMoKSB7CisgICAgICAgIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudChuZXcgQ2xpZW50Q29uZmlnKENsaWVudEZpbHRlckNvbnN0cmFpbmVkVG9TZXJ2ZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgQ2xpZW50RmlsdGVyQ29uc3RyYWluZWRUb0NsaWVudC5jbGFzcywgQ2xpZW50RmlsdGVyLmNsYXNzKSk7CisKKyAgICAgICAgX3Rlc3RGaWx0ZXJzKGNsaWVudCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xpZW50V2l0aFByb3ZpZGVySW5zdGFuY2VzKCkgeworICAgICAgICBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQobmV3IENsaWVudENvbmZpZyhuZXcgQ2xpZW50RmlsdGVyQ29uc3RyYWluZWRUb1NlcnZlcigpLAorICAgICAgICAgICAgICAgIG5ldyBDbGllbnRGaWx0ZXJDb25zdHJhaW5lZFRvQ2xpZW50KCksIG5ldyBDbGllbnRGaWx0ZXIoKSkpOworCisgICAgICAgIF90ZXN0RmlsdGVycyhjbGllbnQpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfdGVzdEZpbHRlcnMoQ2xpZW50IGNsaWVudCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IGNsaWVudC50YXJnZXQoZ2V0QmFzZVVyaSgpKS5wYXRoKCJyZXNvdXJjZSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiY2FsbGVkIiwgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJDbGllbnRGaWx0ZXJDb25zdHJhaW5lZFRvQ2xpZW50IikpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJjYWxsZWQiLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIkNsaWVudEZpbHRlciIpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydE51bGwoIlRoZSBDbGllbnRGaWx0ZXJDb25zdHJhaW5lZFRvU2VydmVyIHNob3VsZCBub3QgYmUgY2FsbGVkIGFzIGl0IGlzIGNvbnN0cmFpbmVkIHRvIHNlcnZlci4iLAorICAgICAgICAgICAgICAgIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiQ2xpZW50RmlsdGVyQ29uc3RyYWluZWRUb1NlcnZlciIpKTsKKyAgICB9CisKKyAgICBAQ29uc3RyYWluZWRUbyhSdW50aW1lVHlwZS5DTElFTlQpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDbGllbnRGaWx0ZXJDb25zdHJhaW5lZFRvQ2xpZW50IGltcGxlbWVudHMgQ2xpZW50UmVzcG9uc2VGaWx0ZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ2xpZW50UmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsIENsaWVudFJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuZ2V0SGVhZGVycygpLmFkZCgiQ2xpZW50RmlsdGVyQ29uc3RyYWluZWRUb0NsaWVudCIsICJjYWxsZWQiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2xpZW50RmlsdGVyIGltcGxlbWVudHMgQ2xpZW50UmVzcG9uc2VGaWx0ZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ2xpZW50UmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsIENsaWVudFJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuZ2V0SGVhZGVycygpLmFkZCgiQ2xpZW50RmlsdGVyIiwgImNhbGxlZCIpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JvbmcgY29uZmlndXJhdGlvbiBvZiBDbGllbnQgZmlsdGVyIHdoaWNoIGlzIGNvbnN0cmFpbmVkIHRvIHNlcnZlci4gVGhpcyBmaWx0ZXIgd2lsbCBiZSBuZXZlciBjYWxsZWQuCisgICAgICovCisgICAgQENvbnN0cmFpbmVkVG8oUnVudGltZVR5cGUuU0VSVkVSKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2xpZW50RmlsdGVyQ29uc3RyYWluZWRUb1NlcnZlciBpbXBsZW1lbnRzIENsaWVudFJlc3BvbnNlRmlsdGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENsaWVudFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LCBDbGllbnRSZXNwb25zZUNvbnRleHQgcmVzcG9uc2VDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LmdldEhlYWRlcnMoKS5hZGQoIkNsaWVudEZpbHRlckNvbnN0cmFpbmVkVG9TZXJ2ZXIiLCAiY2FsbGVkIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJnZXQiOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9Db250ZW50TGVuZ3RoVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9Db250ZW50TGVuZ3RoVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlODc4NWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL0NvbnRlbnRMZW5ndGhUZXN0LmphdmEKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBDb250ZW50TGVuZ3RoVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHVibGljIHN0YXRpYyBTdHJpbmcgU1RSID0gInN0cmluZyI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBSZXNvdXJjZUNvbmZpZyByYyA9IG5ldyBSZXNvdXJjZUNvbmZpZygpOworICAgICAgICByYy5yZWdpc3RlckNsYXNzZXMoTXlUeXBlUmVzb3VyY2UuY2xhc3MsIE15VHlwZVdyaXRlci5jbGFzcywgUmVzb3VyY2VHZXRCeXRlTm9IZWFkLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIHJjOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlUeXBlIHsKKworICAgICAgICBwdWJsaWMgU3RyaW5nIHMgPSBTVFI7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlUeXBlUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIE15VHlwZSBnZXRNeVR5cGUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE15VHlwZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVR5cGVXcml0ZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVdyaXRlcjxNeVR5cGU+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoQ2xhc3M8Pz4gYUNsYXNzLCBUeXBlIHR5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIGFDbGFzcy5lcXVhbHMoTXlUeXBlLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKE15VHlwZSBteVR5cGUsIENsYXNzPD8+IGFDbGFzcywgVHlwZSB0eXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBteVR5cGUucy5sZW5ndGgoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKE15VHlwZSBteVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gYUNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gc3RyaW5nT2JqZWN0TXVsdGl2YWx1ZWRNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBvdXRwdXRTdHJlYW0ud3JpdGUobXlUeXBlLnMuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDb250ZW50TGVuZ3RoQ3VzdG9tV3JpdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLmdldChSZXNwb25zZS5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNUUi5sZW5ndGgoKSwgSW50ZWdlci5wYXJzZUludChyZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoSHR0cEhlYWRlcnMuQ09OVEVOVF9MRU5HVEgpKSk7CisgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UuaGFzRW50aXR5KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhlYWRDb250ZW50TGVuZ3RoQ3VzdG9tV3JpdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLmhlYWQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoU1RSLmxlbmd0aCgpLCBJbnRlZ2VyLnBhcnNlSW50KHJlc3BvbnNlLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5DT05URU5UX0xFTkdUSCkpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocmVzcG9uc2UuaGFzRW50aXR5KCkpOworICAgIH0KKworICAgIEBQYXRoKCIvYnl0ZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZUdldEJ5dGVOb0hlYWQgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIGJ5dGVbXSBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gIkdFVCIuZ2V0Qnl0ZXMoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEJ5dGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJieXRlIikucmVxdWVzdCgpLmdldChSZXNwb25zZS5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIEludGVnZXIucGFyc2VJbnQocmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKEh0dHBIZWFkZXJzLkNPTlRFTlRfTEVOR1RIKSkpOworICAgICAgICBhc3NlcnRUcnVlKHJlc3BvbnNlLmhhc0VudGl0eSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIZWFkQnl0ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoImJ5dGUiKS5yZXF1ZXN0KCkuaGVhZCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygzLCBJbnRlZ2VyLnBhcnNlSW50KHJlc3BvbnNlLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5DT05URU5UX0xFTkdUSCkpKTsKKyAgICAgICAgYXNzZXJ0RmFsc2UocmVzcG9uc2UuaGFzRW50aXR5KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vQ29udGVudFR5cGVUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL0NvbnRlbnRUeXBlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkNjVmMzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL0NvbnRlbnRUeXBlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjUwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuSGVhZGVyUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVzcG9uc2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXNwb25zZUZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5EeW5hbWljRmVhdHVyZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuUmVzb3VyY2VJbmZvOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SZWFkZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIENvbnRlbnRUeXBlVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoQ29udGVudFR5cGVUZXN0LmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBAUGF0aCh2YWx1ZSA9ICIvQ29udGVudFR5cGUiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29udGVudFR5cGVSZXNvdXJjZSB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoIlVudXNlZFBhcmFtZXRlcnMiKQorICAgICAgICBwdWJsaWMgdm9pZCBwb3N0VGVzdChmaW5hbCBTdHJpbmcgc3RyKSB7CisgICAgICAgICAgICAvLyBJZ25vcmUgdG8gZ2VuZXJhdGUgcmVzcG9uc2UgMjA0IC0gTm9Db250ZW50LgorICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoImNoYW5nZVRlc3QiKQorICAgICAgICBAUHJvZHVjZXMoImZvby9iYXIiKQorICAgICAgICBAQ3RGaXgoQ29udGFpbmVyUmVxdWVzdEZpbHRlci5jbGFzcykKKyAgICAgICAgcHVibGljIFN0cmluZyBjaGFuZ2VDb250ZW50VHlwZVRlc3QoU3RyaW5nIGVjaG8pIHsKKyAgICAgICAgICAgIHJldHVybiBlY2hvOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoIm51bGwtY29udGVudCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcHJvY2VzcyhASGVhZGVyUGFyYW0oSHR0cEhlYWRlcnMuQ09OVEVOVF9UWVBFKSBTdHJpbmcgbWVkaWFUeXBlLCBAQ29udGV4dCBDb250YWluZXJSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgICAgIHJldHVybiBtZWRpYVR5cGUgKyAiLSIgKyByZXF1ZXN0Lmhhc0VudGl0eSgpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorICAgIEBUYXJnZXQoe0VsZW1lbnRUeXBlLlRZUEUsIEVsZW1lbnRUeXBlLk1FVEhPRH0pCisgICAgQGludGVyZmFjZSBDdEZpeCB7CisKKyAgICAgICAgQ2xhc3M8PyBzdXBlciBDb250ZW50VHlwZUZpeFByb3ZpZGVyPiB2YWx1ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29udGVudFR5cGVGaXhQcm92aWRlcgorICAgICAgICAgICAgaW1wbGVtZW50cyBSZWFkZXJJbnRlcmNlcHRvciwgQ29udGFpbmVyUmVxdWVzdEZpbHRlciwgQ2xpZW50UmVzcG9uc2VGaWx0ZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ2xpZW50UmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsIENsaWVudFJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImZpbHRlcjEiKTsKKyAgICAgICAgICAgIGlmIChyZXNwb25zZUNvbnRleHQuZ2V0TWVkaWFUeXBlKCkudG9TdHJpbmcoKS5lcXVhbHMoImZvby9iYXIiKSkgeworICAgICAgICAgICAgICAgIHJlc3BvbnNlQ29udGV4dC5nZXRIZWFkZXJzKCkucHV0U2luZ2xlKEh0dHBIZWFkZXJzLkNPTlRFTlRfVFlQRSwgTWVkaWFUeXBlLlRFWFRfUExBSU4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJmaWx0ZXIyIik7CisgICAgICAgICAgICBpZiAoY29udGV4dC5nZXRNZWRpYVR5cGUoKS50b1N0cmluZygpLmVxdWFscygiZm9vL2JhciIpKSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5nZXRIZWFkZXJzKCkucHV0U2luZ2xlKEh0dHBIZWFkZXJzLkNPTlRFTlRfVFlQRSwgTWVkaWFUeXBlLlRFWFRfUExBSU4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPYmplY3QgYXJvdW5kUmVhZEZyb20oUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJyZWFkZXIiKTsKKyAgICAgICAgICAgIGlmIChjb250ZXh0LmdldE1lZGlhVHlwZSgpLnRvU3RyaW5nKCkuZXF1YWxzKCJmb28vYmFyIikpIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LmdldEhlYWRlcnMoKS5wdXRTaW5nbGUoSHR0cEhlYWRlcnMuQ09OVEVOVF9UWVBFLCBNZWRpYVR5cGUuVEVYVF9QTEFJTik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0LnByb2NlZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29udGVudFR5cGVGaXhGZWF0dXJlIGltcGxlbWVudHMgRHluYW1pY0ZlYXR1cmUgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoUmVzb3VyY2VJbmZvIHJlc291cmNlSW5mbywgRmVhdHVyZUNvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgZmluYWwgQ3RGaXggYW5ub3RhdGlvbiA9IHJlc291cmNlSW5mby5nZXRSZXNvdXJjZU1ldGhvZCgpLmdldEFubm90YXRpb24oQ3RGaXguY2xhc3MpOworICAgICAgICAgICAgaWYgKGFubm90YXRpb24gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoQ29udGVudFR5cGVGaXhQcm92aWRlci5jbGFzcywgYW5ub3RhdGlvbi52YWx1ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm9kdWNlcygiZm9vL2JhciIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGb29CYXJTdHJpbmdXcml0ZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVdyaXRlcjxTdHJpbmc+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSBTdHJpbmcuY2xhc3MgJiYgbWVkaWFUeXBlLnRvU3RyaW5nKCkuZXF1YWxzKCJmb28vYmFyIik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShTdHJpbmcgcywgQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gcy5sZW5ndGgoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKFN0cmluZyBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZShzLmdldEJ5dGVzKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKTsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKCkKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXJDbGFzc2VzKENvbnRlbnRUeXBlUmVzb3VyY2UuY2xhc3MsIENvbnRlbnRUeXBlRml4RmVhdHVyZS5jbGFzcywgRm9vQmFyU3RyaW5nV3JpdGVyLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3Rlckluc3RhbmNlcyhuZXcgTG9nZ2luZ0ZlYXR1cmUoTE9HR0VSLCBMb2dnaW5nRmVhdHVyZS5WZXJib3NpdHkuUEFZTE9BRF9BTlkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb250ZW50VHlwZUhlYWRlckZvck5vQ29udGVudFJlc3BvbnNlKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoIkNvbnRlbnRUeXBlIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eSgiIiwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDQsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0TnVsbChyZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIkNvbnRlbnQtVHlwZSIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkQ29udGVudFR5cGVIZWFkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgVVJMIHVybCA9IG5ldyBVUkwoZ2V0QmFzZVVyaSgpLnRvU3RyaW5nKCkgKyAiQ29udGVudFR5cGUiKTsKKyAgICAgICAgZmluYWwgSHR0cFVSTENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IChIdHRwVVJMQ29ubmVjdGlvbikgdXJsLm9wZW5Db25uZWN0aW9uKCk7CisKKyAgICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0TWV0aG9kKCJQT1NUIik7CisgICAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KCJBY2NlcHQiLCAidGV4dC9wbGFpbiIpOworICAgICAgICBjb25uZWN0aW9uLnNldFJlcXVlc3RQcm9wZXJ0eSgiQ29udGVudC1UeXBlIiwgIl5eXiIpOworCisgICAgICAgIGNvbm5lY3Rpb24uc2V0RG9PdXRwdXQodHJ1ZSk7CisgICAgICAgIGNvbm5lY3Rpb24uY29ubmVjdCgpOworCisgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBjb25uZWN0aW9uLmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICBvdXRwdXRTdHJlYW0ud3JpdGUoIkhlbGxvV29ybGQhIi5nZXRCeXRlcygpKTsKKyAgICAgICAgb3V0cHV0U3RyZWFtLndyaXRlKCdcbicpOworICAgICAgICBvdXRwdXRTdHJlYW0uZmx1c2goKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCBjb25uZWN0aW9uLmdldFJlc3BvbnNlQ29kZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDaGFuZ2VDb250ZW50VHlwZUhlYWRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0OworICAgICAgICBSZXNwb25zZSByZXNwb25zZTsKKworICAgICAgICAvLyBmaWx0ZXIgdGVzdAorICAgICAgICB0YXJnZXQgPSB0YXJnZXQoKS5wYXRoKCJDb250ZW50VHlwZSIpLnBhdGgoImNoYW5nZVRlc3QiKTsKKyAgICAgICAgdGFyZ2V0LnJlZ2lzdGVyKENvbnRlbnRUeXBlRml4UHJvdmlkZXIuY2xhc3MsIENsaWVudFJlc3BvbnNlRmlsdGVyLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihGb29CYXJTdHJpbmdXcml0ZXIuY2xhc3MpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0CisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoInRlc3QiLCAiZm9vL2JhciIpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKSk7CisKKyAgICAgICAgLy8gaW50ZXJjZXB0b3IgdGVzdAorICAgICAgICB0YXJnZXQgPSB0YXJnZXQoKS5wYXRoKCJDb250ZW50VHlwZSIpLnBhdGgoImNoYW5nZVRlc3QiKTsKKyAgICAgICAgdGFyZ2V0LnJlZ2lzdGVyKENvbnRlbnRUeXBlRml4UHJvdmlkZXIuY2xhc3MsIFJlYWRlckludGVyY2VwdG9yLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihGb29CYXJTdHJpbmdXcml0ZXIuY2xhc3MpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0CisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoInRlc3QiLCAiZm9vL2JhciIpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUudmFsdWVPZigiZm9vL2JhciIpLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidGVzdCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlQb3N0UmVxdWVzdFdpdGhDb250ZW50VHlwZSgpIHsKKyAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiQ29udGVudFR5cGUvbnVsbC1jb250ZW50IikucmVxdWVzdCgidGV4dC9wbGFpbiIpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eShudWxsLCAiZm9vL2JhciIpLCBTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscygiZm9vL2Jhci1mYWxzZSIsIHJlc3BvbnNlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL0RldGVybWluZUNvbnRlbnRMZW5ndGhUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL0RldGVybWluZUNvbnRlbnRMZW5ndGhUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVjYWIwYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vRGV0ZXJtaW5lQ29udGVudExlbmd0aFRlc3QuamF2YQpAQCAtMCwwICsxLDIzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuRGVmYXVsdFZhbHVlOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5IZWFkZXJQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUmVhZGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJlYWRlckludGVyY2VwdG9yQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yQ29udGV4dDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJpb3JpdHk7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5Db21tb25Qcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmlubWVtb3J5LkluTWVtb3J5VGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0IGRldGVybWluaW5nIG9mIHRoZSBjb250ZW50IGxlbmd0aC4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBEZXRlcm1pbmVDb250ZW50TGVuZ3RoVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSX1NJWkUgPSAyMDsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNUUjAgPSAiIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTVFI2ID0gIjEyMzQ1NiI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1RSMTIgPSAiMTIzNDU2Nzg5QUJDIjsKKworICAgIEBQYXRoKCJyb290IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCI2IikKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQ2KCkgeworICAgICAgICAgICAgcmV0dXJuIFNUUjY7CisgICAgICAgIH0KKworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIjAiKQorICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldDAoKSB7CisgICAgICAgICAgICByZXR1cm4gU1RSMDsKKyAgICAgICAgfQorCisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgICAgICBAUGF0aCgiMTIiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldDUoKSB7CisgICAgICAgICAgICByZXR1cm4gU1RSMTI7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgidGVzdCIpCisgICAgICAgIEBQT1NUCisgICAgICAgIEBDb25zdW1lcygidGV4dC9wbGFpbiIpCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgdGVzdExlbmd0aChTdHJpbmcgZW50aXR5LCBARGVmYXVsdFZhbHVlKCItMSIpIEBIZWFkZXJQYXJhbShIdHRwSGVhZGVycy5DT05URU5UX0xFTkdUSCkgU3RyaW5nIGxlbmd0aCkgeworICAgICAgICAgICAgcmV0dXJuIGxlbmd0aDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcmlvcml0eSgzMDApCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBEb3VibGVJbnRlcmNlcHRvciBpbXBsZW1lbnRzIFdyaXRlckludGVyY2VwdG9yLCBSZWFkZXJJbnRlcmNlcHRvciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGFyb3VuZFdyaXRlVG8oV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtIG9sZCA9IGNvbnRleHQuZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICBjb250ZXh0LnNldE91dHB1dFN0cmVhbShuZXcgT3V0cHV0U3RyZWFtKCkgeworCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIG9sZC53cml0ZShiKTsKKyAgICAgICAgICAgICAgICAgICAgb2xkLndyaXRlKGIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgY29udGV4dC5wcm9jZWVkKCk7CisgICAgICAgICAgICBjb250ZXh0LnNldE91dHB1dFN0cmVhbShvbGQpOworICAgICAgICB9CisKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE9iamVjdCBhcm91bmRSZWFkRnJvbShSZWFkZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBvbGQgPSBjb250ZXh0LmdldElucHV0U3RyZWFtKCk7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0SW5wdXRTdHJlYW0obmV3IElucHV0U3RyZWFtKCkgeworCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICAgICAgb2xkLnJlYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvbGQucmVhZCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5wcm9jZWVkKCk7CisgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0SW5wdXRTdHJlYW0ob2xkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEluTWVtb3J5VGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcywgRG91YmxlSW50ZXJjZXB0b3IuY2xhc3MpOworICAgICAgICByZXNvdXJjZUNvbmZpZy5wcm9wZXJ0eShDb21tb25Qcm9wZXJ0aWVzLk9VVEJPVU5EX0NPTlRFTlRfTEVOR1RIX0JVRkZFUiwgQlVGRkVSX1NJWkUpOworICAgICAgICByZXR1cm4gcmVzb3VyY2VDb25maWc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnByb3BlcnR5KENvbW1vblByb3BlcnRpZXMuT1VUQk9VTkRfQ09OVEVOVF9MRU5HVEhfQlVGRkVSLCBCVUZGRVJfU0laRSk7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihEb3VibGVJbnRlcmNlcHRvci5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MCgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyb290LzAiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgZmluYWwgT2JqZWN0IGhlYWRlckNvbnRlbnRMZW5ndGggPSBJbnRlZ2VyLnZhbHVlT2YocmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKEh0dHBIZWFkZXJzLkNPTlRFTlRfTEVOR1RIKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTVFIwLmxlbmd0aCgpICogMiwgaGVhZGVyQ29udGVudExlbmd0aCk7CisgICAgICAgIGFzc2VydEVxdWFscyhTVFIwLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhlYWQwKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJvb3QvMCIpLnJlcXVlc3QoKS5oZWFkKCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgZmluYWwgT2JqZWN0IGhlYWRlckNvbnRlbnRMZW5ndGggPSBJbnRlZ2VyLnZhbHVlT2YocmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKEh0dHBIZWFkZXJzLkNPTlRFTlRfTEVOR1RIKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTVFIwLmxlbmd0aCgpICogMiwgaGVhZGVyQ29udGVudExlbmd0aCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0NigpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyb290LzYiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgZmluYWwgT2JqZWN0IGhlYWRlckNvbnRlbnRMZW5ndGggPSBJbnRlZ2VyLnZhbHVlT2YocmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKEh0dHBIZWFkZXJzLkNPTlRFTlRfTEVOR1RIKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTVFI2Lmxlbmd0aCgpICogMiwgaGVhZGVyQ29udGVudExlbmd0aCk7CisgICAgICAgIGFzc2VydEVxdWFscyhTVFI2LCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhlYWQ2KCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJvb3QvNiIpLnJlcXVlc3QoKS5oZWFkKCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgZmluYWwgT2JqZWN0IGhlYWRlckNvbnRlbnRMZW5ndGggPSBJbnRlZ2VyLnZhbHVlT2YocmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKEh0dHBIZWFkZXJzLkNPTlRFTlRfTEVOR1RIKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTVFI2Lmxlbmd0aCgpICogMiwgaGVhZGVyQ29udGVudExlbmd0aCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0MTIoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicm9vdC8xMiIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBjaGVja0VtcHR5Q29udGVudExlbmd0aChyZXNwb25zZSk7CisgICAgICAgIGFzc2VydEVxdWFscyhTVFIxMiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIZWFkMTIoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicm9vdC8xMiIpLnJlcXVlc3QoKS5oZWFkKCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgY2hlY2tFbXB0eUNvbnRlbnRMZW5ndGgocmVzcG9uc2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja0VtcHR5Q29udGVudExlbmd0aChSZXNwb25zZSByZXNwb25zZSkgeworICAgICAgICBmaW5hbCBTdHJpbmcgaGVhZGVyU3RyaW5nID0gcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKEh0dHBIZWFkZXJzLkNPTlRFTlRfTEVOR1RIKTsKKyAgICAgICAgaWYgKGhlYWRlclN0cmluZyAhPSBudWxsKSB7CisgICAgICAgICAgICBmaW5hbCBPYmplY3QgaGVhZGVyQ29udGVudExlbmd0aCA9IEludGVnZXIudmFsdWVPZihoZWFkZXJTdHJpbmcpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBoZWFkZXJDb250ZW50TGVuZ3RoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsaWVudExlbmd0aDAoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicm9vdC90ZXN0IikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShTVFIwLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNUUjAubGVuZ3RoKCkgKiAyLCByZXNwb25zZS5yZWFkRW50aXR5KEludGVnZXIuY2xhc3MpLmludFZhbHVlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsaWVudExlbmd0aDYoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicm9vdC90ZXN0IikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShTVFI2LCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFNUUjYubGVuZ3RoKCkgKiAyLCByZXNwb25zZS5yZWFkRW50aXR5KEludGVnZXIuY2xhc3MpLmludFZhbHVlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENsaWVudExlbmd0aDEyKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJvb3QvdGVzdCIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoU1RSMTIsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIHJlc3BvbnNlLnJlYWRFbnRpdHkoSW50ZWdlci5jbGFzcykuaW50VmFsdWUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9FbmNvZGluZ1Rlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vRW5jb2RpbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU0Y2U4YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vRW5jb2RpbmdUZXN0LmphdmEKQEAgLTAsMCArMSwxOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbjsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC56aXAuR1pJUElucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC56aXAuSW5mbGF0ZXJJbnB1dFN0cmVhbTsKKworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5JbnZvY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuZmlsdGVyLkVuY29kaW5nRmlsdGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuRGVmbGF0ZUVuY29kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5HWmlwRW5jb2RlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0QXJyYXlFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitwdWJsaWMgY2xhc3MgRW5jb2RpbmdUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRWNob1Jlc291cmNlIHsKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIFN0cmluZyBwb3N0KFN0cmluZyB0ZXh0KSB7CisgICAgICAgICAgICByZXR1cm4gdGV4dDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoCisgICAgICAgICAgICAgICAgRWNob1Jlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5maWx0ZXIuRW5jb2RpbmdGaWx0ZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgR1ppcEVuY29kZXIuY2xhc3MsCisgICAgICAgICAgICAgICAgRGVmbGF0ZUVuY29kZXIuY2xhc3MKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHWmlwKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdChuZXcgVGVzdFNwZWMoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBkZWNvZGUoSW5wdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgR1pJUElucHV0U3RyZWFtKHN0cmVhbSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgY2hlY2tIZWFkZXJzQW5kU3RhdHVzKFJlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJnemlwIiwgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKEh0dHBIZWFkZXJzLkNPTlRFTlRfRU5DT0RJTkcpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgSW52b2NhdGlvbi5CdWlsZGVyIHNldEhlYWRlcnMoSW52b2NhdGlvbi5CdWlsZGVyIGludkJ1aWxkZXIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW52QnVpbGRlci5oZWFkZXIoSHR0cEhlYWRlcnMuQUNDRVBUX0VOQ09ESU5HLCAiZ3ppcCIpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZWZsYXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdChuZXcgVGVzdFNwZWMoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBJbnB1dFN0cmVhbSBkZWNvZGUoSW5wdXRTdHJlYW0gc3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSW5mbGF0ZXJJbnB1dFN0cmVhbShzdHJlYW0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNoZWNrSGVhZGVyc0FuZFN0YXR1cyhSZXNwb25zZSByZXNwb25zZSkgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygiZGVmbGF0ZSIsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5DT05URU5UX0VOQ09ESU5HKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEludm9jYXRpb24uQnVpbGRlciBzZXRIZWFkZXJzKEludm9jYXRpb24uQnVpbGRlciBpbnZCdWlsZGVyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGludkJ1aWxkZXIuaGVhZGVyKEh0dHBIZWFkZXJzLkFDQ0VQVF9FTkNPRElORywgImRlZmxhdGUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R1ppcFByZWZlcnJlZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRlc3QobmV3IFRlc3RTcGVjKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZGVjb2RlKElucHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEdaSVBJbnB1dFN0cmVhbShzdHJlYW0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNoZWNrSGVhZGVyc0FuZFN0YXR1cyhSZXNwb25zZSByZXNwb25zZSkgeworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygieC1nemlwIiwgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKEh0dHBIZWFkZXJzLkNPTlRFTlRfRU5DT0RJTkcpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgSW52b2NhdGlvbi5CdWlsZGVyIHNldEhlYWRlcnMoSW52b2NhdGlvbi5CdWlsZGVyIGludkJ1aWxkZXIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW52QnVpbGRlci5oZWFkZXIoSHR0cEhlYWRlcnMuQUNDRVBUX0VOQ09ESU5HLCAiZGVmbGF0ZTsgcT0uNSwgeC1nemlwIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdaaXBDbGllbnRTZXJ2ZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICB0ZXN0KG5ldyBUZXN0U3BlYygpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFdlYlRhcmdldCBjb25maWd1cmUoV2ViVGFyZ2V0IHRhcmdldCkgeworICAgICAgICAgICAgICAgIHRhcmdldC5yZWdpc3RlcihHWmlwRW5jb2Rlci5jbGFzcykucmVnaXN0ZXIoRW5jb2RpbmdGaWx0ZXIuY2xhc3MpOworICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgY2hlY2tIZWFkZXJzQW5kU3RhdHVzKFJlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJnemlwIiwgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKEh0dHBIZWFkZXJzLkNPTlRFTlRfRU5DT0RJTkcpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGVmbGF0ZVByZWZlcnJlZENsaWVudFNlcnZlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRlc3QobmV3IFRlc3RTcGVjKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgSW52b2NhdGlvbi5CdWlsZGVyIHNldEhlYWRlcnMoSW52b2NhdGlvbi5CdWlsZGVyIGludkJ1aWxkZXIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW52QnVpbGRlci5oZWFkZXIoSHR0cEhlYWRlcnMuQUNDRVBUX0VOQ09ESU5HLCAiZGVmbGF0ZSxnemlwPS41Iik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFdlYlRhcmdldCBjb25maWd1cmUoV2ViVGFyZ2V0IHRhcmdldCkgeworICAgICAgICAgICAgICAgIHRhcmdldC5yZWdpc3RlcihEZWZsYXRlRW5jb2Rlci5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgICAgIC5yZWdpc3RlcihHWmlwRW5jb2Rlci5jbGFzcykucmVnaXN0ZXIoRW5jb2RpbmdGaWx0ZXIuY2xhc3MpOworICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgY2hlY2tIZWFkZXJzQW5kU3RhdHVzKFJlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJkZWZsYXRlIiwgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKEh0dHBIZWFkZXJzLkNPTlRFTlRfRU5DT0RJTkcpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3QoVGVzdFNwZWMgdGVzdFNwZWMpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBpbnB1dCA9ICJoZWxsbyI7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGVzdFNwZWMuc2V0SGVhZGVycyh0ZXN0U3BlYy5jb25maWd1cmUodGFyZ2V0KCkpLnJlcXVlc3QoKSkKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkudGV4dChpbnB1dCkpOworICAgICAgICBieXRlW10gb3V0cHV0ID0gcmVzcG9uc2UucmVhZEVudGl0eShieXRlW10uY2xhc3MpOworICAgICAgICB0ZXN0U3BlYy5jaGVja0hlYWRlcnNBbmRTdGF0dXMocmVzcG9uc2UpOworICAgICAgICBJbnB1dFN0cmVhbSBkZWNvZGVkID0gdGVzdFNwZWMuZGVjb2RlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXRwdXQpKTsKKyAgICAgICAgYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW2lucHV0LmdldEJ5dGVzKCkubGVuZ3RoXTsKKyAgICAgICAgaW50IGxlbiA9IGRlY29kZWQucmVhZChyZXN1bHQpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIGRlY29kZWQucmVhZCgpKTsKKyAgICAgICAgZGVjb2RlZC5jbG9zZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoaW5wdXQuZ2V0Qnl0ZXMoKS5sZW5ndGgsIGxlbik7CisgICAgICAgIGFzc2VydEFycmF5RXF1YWxzKGlucHV0LmdldEJ5dGVzKCksIHJlc3VsdCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgVGVzdFNwZWMgeworICAgICAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZGVjb2RlKElucHV0U3RyZWFtIHN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBzdHJlYW07CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSW52b2NhdGlvbi5CdWlsZGVyIHNldEhlYWRlcnMoSW52b2NhdGlvbi5CdWlsZGVyIGludkJ1aWxkZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBpbnZCdWlsZGVyOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFdlYlRhcmdldCBjb25maWd1cmUoV2ViVGFyZ2V0IHRhcmdldCkgeworICAgICAgICAgICAgcmV0dXJuIHRhcmdldDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIGNoZWNrSGVhZGVyc0FuZFN0YXR1cyhSZXNwb25zZSByZXNwb25zZSkgeworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9Gb3JjZWRBdXRvRGlzY292ZXJhYmxlVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9Gb3JjZWRBdXRvRGlzY292ZXJhYmxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZWZhMmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL0ZvcmNlZEF1dG9EaXNjb3ZlcmFibGVUZXN0LmphdmEKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdHJhaW5lZFRvOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5SdW50aW1lVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuQ29tbW9uUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnNwaS5Gb3JjZWRBdXRvRGlzY292ZXJhYmxlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUHJvcGVydGllc0hlbHBlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBOb3RlOiBBdXRvLWRpc2NvdmVyYWJsZXMgZnJvbSB0aGlzIHRlc3QgImFmZmVjdHMiIGFsbCBvdGhlciB0ZXN0cyBpbiBzdWl0LgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgRm9yY2VkQXV0b0Rpc2NvdmVyYWJsZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWSA9ICJGb3JjZWRBdXRvRGlzY292ZXJhYmxlVGVzdCI7CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbW1vbkF1dG9EaXNjb3ZlcmFibGUgaW1wbGVtZW50cyBGb3JjZWRBdXRvRGlzY292ZXJhYmxlIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY29uZmlndXJlKGZpbmFsIEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgICAgIC8vIFJldHVybiBpZiBQUk9QRVJUWSBpcyBub3QgdHJ1ZSAtIGFwcGxpY2FibGUgZm9yIG90aGVyIHRlc3RzLgorICAgICAgICAgICAgaWYgKCFQcm9wZXJ0aWVzSGVscGVyLmlzUHJvcGVydHkoY29udGV4dC5nZXRDb25maWd1cmF0aW9uKCkuZ2V0UHJvcGVydHkoUFJPUEVSVFkpKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihuZXcgV3JpdGVySW50ZXJjZXB0b3IoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYXJvdW5kV3JpdGVUbyhmaW5hbCBXcml0ZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc2V0RW50aXR5KGNvbnRleHQuZ2V0RW50aXR5KCkgKyAiLWNvbW1vbiIpOworCisgICAgICAgICAgICAgICAgICAgIGNvbnRleHQucHJvY2VlZCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0sIDEpOworICAgICAgICB9CisgICAgfQorCisgICAgQENvbnN0cmFpbmVkVG8oUnVudGltZVR5cGUuQ0xJRU5UKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2xpZW50QXV0b0Rpc2NvdmVyYWJsZSBpbXBsZW1lbnRzIEZvcmNlZEF1dG9EaXNjb3ZlcmFibGUgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoZmluYWwgRmVhdHVyZUNvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgLy8gUmV0dXJuIGlmIFBST1BFUlRZIGlzIG5vdCB0cnVlIC0gYXBwbGljYWJsZSBmb3Igb3RoZXIgdGVzdHMuCisgICAgICAgICAgICBpZiAoIVByb3BlcnRpZXNIZWxwZXIuaXNQcm9wZXJ0eShjb250ZXh0LmdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0eShQUk9QRVJUWSkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKG5ldyBXcml0ZXJJbnRlcmNlcHRvcigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhcm91bmRXcml0ZVRvKGZpbmFsIFdyaXRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zZXRFbnRpdHkoY29udGV4dC5nZXRFbnRpdHkoKSArICItY2xpZW50Iik7CisKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5wcm9jZWVkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwgMTApOworICAgICAgICB9CisgICAgfQorCisgICAgQENvbnN0cmFpbmVkVG8oUnVudGltZVR5cGUuU0VSVkVSKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2VydmVyQXV0b0Rpc2NvdmVyYWJsZSBpbXBsZW1lbnRzIEZvcmNlZEF1dG9EaXNjb3ZlcmFibGUgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoZmluYWwgRmVhdHVyZUNvbnRleHQgY29udGV4dCkgeworICAgICAgICAgICAgLy8gUmV0dXJuIGlmIFBST1BFUlRZIGlzIG5vdCB0cnVlIC0gYXBwbGljYWJsZSBmb3Igb3RoZXIgdGVzdHMuCisgICAgICAgICAgICBpZiAoIVByb3BlcnRpZXNIZWxwZXIuaXNQcm9wZXJ0eShjb250ZXh0LmdldENvbmZpZ3VyYXRpb24oKS5nZXRQcm9wZXJ0eShQUk9QRVJUWSkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKG5ldyBXcml0ZXJJbnRlcmNlcHRvcigpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhcm91bmRXcml0ZVRvKGZpbmFsIFdyaXRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5zZXRFbnRpdHkoY29udGV4dC5nZXRFbnRpdHkoKSArICItc2VydmVyIik7CisKKyAgICAgICAgICAgICAgICAgICAgY29udGV4dC5wcm9jZWVkKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwgMTApOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcG9zdChmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MpCisgICAgICAgICAgICAgICAgLnByb3BlcnR5KFBST1BFUlRZLCB0cnVlKQorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShDb21tb25Qcm9wZXJ0aWVzLk1FVEFJTkZfU0VSVklDRVNfTE9PS1VQX0RJU0FCTEVfU0VSVkVSLCB0cnVlKQorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShDb21tb25Qcm9wZXJ0aWVzLkZFQVRVUkVfQVVUT19ESVNDT1ZFUllfRElTQUJMRV9TRVJWRVIsIHRydWUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChmaW5hbCBDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5wcm9wZXJ0eShQUk9QRVJUWSwgdHJ1ZSkKKyAgICAgICAgLnByb3BlcnR5KENvbW1vblByb3BlcnRpZXMuRkVBVFVSRV9BVVRPX0RJU0NPVkVSWV9ESVNBQkxFX0NMSUVOVCwgdHJ1ZSkKKyAgICAgICAgLnByb3BlcnR5KENvbW1vblByb3BlcnRpZXMuTUVUQUlORl9TRVJWSUNFU19MT09LVVBfRElTQUJMRV9DTElFTlQsIHRydWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZvcmNlZEF1dG9EaXNjb3ZlcmFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkudGV4dCgidmFsdWUiKSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGlzKCJ2YWx1ZS1jb21tb24tY2xpZW50LWNvbW1vbi1zZXJ2ZXIiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9IZWFkZXJQYXJhbVRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vSGVhZGVyUGFyYW1UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEzMjhmNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vSGVhZGVyUGFyYW1UZXN0LmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uOworCitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuSGVhZGVyUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuUmVhZGVyV3JpdGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIEhlYWRlclBhcmFtVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhNeVJlc291cmNlLmNsYXNzLCBMb2dnaW5nRmVhdHVyZS5jbGFzcyk7CisgICAgfQorCisgICAgQFBhdGgoInJlc291cmNlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15UmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoQEhlYWRlclBhcmFtKCJoZWxsbyIpIExpc3Q8U3RyaW5nPiBoZWFkZXJzKSB7CisgICAgICAgICAgICByZXR1cm4gaGVhZGVycy5zaXplKCkgKyAiOiIgKyBoZWFkZXJzOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVhZGVyTGlzdFNpbmdsZUhlYWRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIikucmVxdWVzdCgpLmhlYWRlcigiaGVsbG8iLCAid29ybGQiKS5oZWFkZXIoImhlbGxvIiwgInVuaXZlcnNlIikuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgZXF1YWxUbygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGVxdWFsVG8oIjE6W3dvcmxkLHVuaXZlcnNlXSIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayB0aGF0IG11bHRpIHZhbHVlIGh0dHAgaGVhZGVycyBhcmUgY29ycmVjdGx5IHJlYWQgYnkgdGhlIHNlcnZlci4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIZWFkZXJMaXN0TXVsdGlwbGVIZWFkZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFVSTCB1cmwgPSBuZXcgVVJMKGdldEJhc2VVcmkoKS50b1N0cmluZygpICsgInJlc291cmNlIik7CisgICAgICAgIGZpbmFsIEh0dHBVUkxDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSAoSHR0cFVSTENvbm5lY3Rpb24pIHVybC5vcGVuQ29ubmVjdGlvbigpOworCisgICAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdE1ldGhvZCgiR0VUIik7CisgICAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KCJBY2NlcHQiLCAidGV4dC9wbGFpbiIpOworICAgICAgICBjb25uZWN0aW9uLnNldFJlcXVlc3RQcm9wZXJ0eSgiaGVsbG8iLCAid29ybGQiKTsKKyAgICAgICAgY29ubmVjdGlvbi5hZGRSZXF1ZXN0UHJvcGVydHkoImhlbGxvIiwgInVuaXZlcnNlIik7CisKKyAgICAgICAgY29ubmVjdGlvbi5zZXREb091dHB1dChmYWxzZSk7CisgICAgICAgIGNvbm5lY3Rpb24uY29ubmVjdCgpOworCisgICAgICAgIGFzc2VydFRoYXQoY29ubmVjdGlvbi5nZXRSZXNwb25zZUNvZGUoKSwgZXF1YWxUbygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChSZWFkZXJXcml0ZXIucmVhZEZyb21Bc1N0cmluZyhuZXcgSW5wdXRTdHJlYW1SZWFkZXIoY29ubmVjdGlvbi5nZXRJbnB1dFN0cmVhbSgpKSksCisgICAgICAgICAgICAgICAgZXF1YWxUbygiMjpbd29ybGQsIHVuaXZlcnNlXSIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL0hlYWRlclZhbHVlRXhjZXB0aW9uVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9IZWFkZXJWYWx1ZUV4Y2VwdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2Y1MzA1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9IZWFkZXJWYWx1ZUV4Y2VwdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlc3BvbnNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGVzdHMgSGVhZGVyVmFsdWVFeGNlcHRpb24uCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgY2xhc3MgSGVhZGVyVmFsdWVFeGNlcHRpb25UZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlc3BvbnNlRmlsdGVyLmNsYXNzLCBUZXN0UmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluYm91bmRIZWFkZXJUaHJvd3NFeGNlcHRpb24oKSB0aHJvd3MgRXhlY3V0aW9uRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJyZXNvdXJjZS9pbmJvdW5kIikucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLmhlYWRlcihIdHRwSGVhZGVycy5EQVRFLCAiZm9vIikKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KCJpbmJvdW5kIiwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE91dGJvdW5kSGVhZGVyVGhyb3dzRXhjZXB0aW9uKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgicmVzb3VyY2Uvb3V0Ym91bmQiKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KCJvdXRib3VuZCIsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPdXRib3VuZFJlc3BvbnNlSGVhZGVyVGhyb3dzRXhjZXB0aW9uKCkgdGhyb3dzIEV4ZWN1dGlvbkV4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgicmVzb3VyY2Uvb3V0Ym91bmQtUmVzcG9uc2UiKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KCJvdXRib3VuZCIsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzcG9uc2VGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXNwb25zZUZpbHRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCwgQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIC8vIHRoaXMgY2FsbCBzaG91bGQgdGhyb3cgSGVhZGVyVmFsdWVFeGNlcHRpb24gd2hpY2ggd2lsbCBiZSBjb252ZXJ0ZWQgdG8gSFRUUCA1MDAgcmVzcG9uc2UKKyAgICAgICAgICAgIHJlc3BvbnNlQ29udGV4dC5nZXREYXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFJlc291cmNlIHsKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoImluYm91bmQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3RJbmJvdW5kKFN0cmluZyBlbnRpdHksIEBDb250ZXh0IEh0dHBIZWFkZXJzIGhlYWRlcnMpIHsKKyAgICAgICAgICAgIC8vIHRoaXMgY2FsbCBzaG91bGQgdGhyb3cgSGVhZGVyVmFsdWVFeGNlcHRpb24gd2hpY2ggd2lsbCBiZSBjb252ZXJ0ZWQgdG8gSFRUUCA0MDAgcmVzcG9uc2UKKyAgICAgICAgICAgIGhlYWRlcnMuZ2V0RGF0ZSgpOworICAgICAgICAgICAgcmV0dXJuIGVudGl0eTsKKyAgICAgICAgfQorCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJvdXRib3VuZCIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBwb3N0T3V0Ym91bmQoU3RyaW5nIGVudGl0eSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCkuZW50aXR5KGVudGl0eSkuaGVhZGVyKEh0dHBIZWFkZXJzLkRBVEUsICJiYXIiKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoIm91dGJvdW5kLVJlc3BvbnNlIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIHBvc3RPdXRib3VuZFJlc3BvbnNlKFN0cmluZyBlbnRpdHkpIHsKKyAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gUmVzcG9uc2Uub2soZW50aXR5KS5oZWFkZXIoSHR0cEhlYWRlcnMuREFURSwgImZvbyIpLmJ1aWxkKCk7CisgICAgICAgICAgICAvLyB0aGlzIGNhbGwgc2hvdWxkIHRocm93IEhlYWRlclZhbHVlRXhjZXB0aW9uIHdoaWNoIHdpbGwgYmUgY29udmVydGVkIHRvIEhUVFAgNTAwIHJlc3BvbnNlCisgICAgICAgICAgICByZXNwb25zZS5nZXREYXRlKCk7CisgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL0hrMkJpbmRlclN1cHBvcnRUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL0hrMkJpbmRlclN1cHBvcnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VjYjYxNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vSGsyQmluZGVyU3VwcG9ydFRlc3QuamF2YQpAQCAtMCwwICsxLDkwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuTmFtZWQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIudXRpbGl0aWVzLmJpbmRpbmcuQWJzdHJhY3RCaW5kZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdHMgdGhhdCBISzJCaW5kZXIgYW5kIEplcnNleSBCaW5kZXIgd29yayB0b2dldGhlci4KKyAqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworcHVibGljIGNsYXNzIEhrMkJpbmRlclN1cHBvcnRUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBSZXNvdXJjZUNvbmZpZyBjb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoKTsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKEhlbGxvV29ybGRSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihuZXcgSGsyQmluZGVyKCkpOworICAgICAgICBjb25maWcucmVnaXN0ZXIobmV3IEplcnNleUJpbmRlcigpKTsKKyAgICAgICAgcmV0dXJuIGNvbmZpZzsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNwb25zZSgpIHsKKyAgICAgICAgU3RyaW5nIHMgPSB0YXJnZXQoKS5wYXRoKCJoZWxsb3dvcmxkIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoSGsyQmluZGVyLkhLMl9IRUxMT19NRVNTQUdFICsgIi8iICsgSmVyc2V5QmluZGVyLkpFUlNFWV9IRUxMT19NRVNTQUdFLCBzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBIazJCaW5kZXIgZXh0ZW5kcyBBYnN0cmFjdEJpbmRlciB7CisgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBISzJfSEVMTE9fTUVTU0FHRSA9ICJIZWxsbyBISzIhIjsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICAgICAgYmluZChISzJfSEVMTE9fTUVTU0FHRSkudG8oU3RyaW5nLmNsYXNzKS5uYW1lZCgiaGsyIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBKZXJzZXlCaW5kZXIgZXh0ZW5kcyBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQWJzdHJhY3RCaW5kZXIgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSkVSU0VZX0hFTExPX01FU1NBR0UgPSAiSGVsbG8gSmVyc2V5ISI7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIGJpbmQoSkVSU0VZX0hFTExPX01FU1NBR0UpLnRvKFN0cmluZy5jbGFzcykubmFtZWQoImplcnNleSIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoImhlbGxvd29ybGQiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSGVsbG9Xb3JsZFJlc291cmNlIHsKKworICAgICAgICBASW5qZWN0CisgICAgICAgIEBOYW1lZCgiaGsyIikKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgaGsySGVsbG87CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBATmFtZWQoImplcnNleSIpCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGplcnNleUhlbGxvOworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRIZWxsbygpIHsKKyAgICAgICAgICAgIHJldHVybiBoazJIZWxsbyArICIvIiArIGplcnNleUhlbGxvOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9Mb2dnaW5nRmVhdHVyZVRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vTG9nZ2luZ0ZlYXR1cmVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE1ZTVkOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vTG9nZ2luZ0ZlYXR1cmVUZXN0LmphdmEKQEAgLTAsMCArMSw0NTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dSZWNvcmQ7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlc3BvbnNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVzcG9uc2VGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlc3BvbnNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qcmlvcml0eTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlN1aXRlOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMubm90OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMubGVzc1RoYW47CisKKy8qKgorICoge0BsaW5rIExvZ2dpbmdGZWF0dXJlfSBlbmQtdG8tZW5kIHRlc3RzLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUnVuV2l0aChTdWl0ZS5jbGFzcykKK0BTdWl0ZS5TdWl0ZUNsYXNzZXMoeworICAgICAgICBMb2dnaW5nRmVhdHVyZVRlc3QuQ2xpZW50VGVzdC5jbGFzcywKKyAgICAgICAgTG9nZ2luZ0ZlYXR1cmVUZXN0LkNvbnRhaW5lclRlc3QuY2xhc3MsCisgICAgICAgIExvZ2dpbmdGZWF0dXJlVGVzdC5Db250YWluZXJBdXRvZGlzY292ZXJ5VGVzdC5jbGFzcywKKyAgICAgICAgTG9nZ2luZ0ZlYXR1cmVUZXN0LkZpbHRlcnNPcmRlclRlc3QuY2xhc3MKK30pCitwdWJsaWMgY2xhc3MgTG9nZ2luZ0ZlYXR1cmVUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMT0dHRVJfTkFNRSA9ICJvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLmZlYXR1cmUiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCSU5BUllfTUVESUFfVFlQRSA9ICJhcHBsaWNhdGlvbi9iaW5hcnkiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVhUX01FRElBX1RZUEUgPSBNZWRpYVR5cGUuVEVYVF9QTEFJTjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRU5USVRZID0gIlRoaXMgZW50aXR5IG11c3QgKG5vdCkgYmUgbG9nZ2VkIjsKKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15UmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKEJJTkFSWV9NRURJQV9UWVBFKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0SGVhZGVyc0FuZEJpbmFyeVBheWxvYWQoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2UKKyAgICAgICAgICAgICAgICAgICAgLm9rKEVOVElUWSkKKyAgICAgICAgICAgICAgICAgICAgLmhlYWRlcigiMDAxIiwgIkZpcnN0IEhlYWRlciBWYWx1ZSIpCisgICAgICAgICAgICAgICAgICAgIC5oZWFkZXIoIjAwMiIsICJTZWNvbmQgSGVhZGVyIFZhbHVlIikKKyAgICAgICAgICAgICAgICAgICAgLmhlYWRlcigiMDAzIiwgIlRoaXJkIEhlYWRlciBWYWx1ZSIpCisgICAgICAgICAgICAgICAgICAgIC5oZWFkZXIoIjAwNCIsICJGb3VydGggSGVhZGVyIFZhbHVlIikKKyAgICAgICAgICAgICAgICAgICAgLmhlYWRlcigiMDA1IiwgIkZpZnRoIEhlYWRlciBWYWx1ZSIpCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoIi90ZXh0IikKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoVEVYVF9NRURJQV9UWVBFKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0SGVhZGVyc0FuZFRleHRQYXlsb2FkKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlCisgICAgICAgICAgICAgICAgICAgIC5vayhFTlRJVFkpCisgICAgICAgICAgICAgICAgICAgIC5oZWFkZXIoIjAwMSIsICJGaXJzdCBIZWFkZXIgVmFsdWUiKQorICAgICAgICAgICAgICAgICAgICAuaGVhZGVyKCIwMDIiLCAiU2Vjb25kIEhlYWRlciBWYWx1ZSIpCisgICAgICAgICAgICAgICAgICAgIC5oZWFkZXIoIjAwMyIsICJUaGlyZCBIZWFkZXIgVmFsdWUiKQorICAgICAgICAgICAgICAgICAgICAuaGVhZGVyKCIwMDQiLCAiRm91cnRoIEhlYWRlciBWYWx1ZSIpCisgICAgICAgICAgICAgICAgICAgIC5oZWFkZXIoIjAwNSIsICJGaWZ0aCBIZWFkZXIgVmFsdWUiKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBQYXRoKCIvdGV4dCIpCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQcm9kdWNlcyhURVhUX01FRElBX1RZUEUpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBwb3N0KFN0cmluZyB0ZXh0KSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2UKKyAgICAgICAgICAgICAgICAgICAgLm9rKEVOVElUWSkKKyAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYWwgY2xpZW50IHNpZGUgdGVzdHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDbGllbnRUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgICAgICBzZXQoVGVzdFByb3BlcnRpZXMuUkVDT1JEX0xPR19MRVZFTCwgTGV2ZWwuRklORS5pbnRWYWx1ZSgpKTsKKworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhNeVJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJBc0NsaWVudFJlcXVlc3RGaWx0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkKKyAgICAgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKG5ldyBMb2dnaW5nRmVhdHVyZShMb2dnZXIuZ2V0TG9nZ2VyKExPR0dFUl9OQU1FKSkpCisgICAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAgICAgLmdldCgpOworCisgICAgICAgICAgICAvLyBDb3JyZWN0IHJlc3BvbnNlIHN0YXR1cy4KKyAgICAgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKFJlc3BvbnNlLlN0YXR1cy5PSy5nZXRTdGF0dXNDb2RlKCkpKTsKKyAgICAgICAgICAgIC8vIENoZWNrIGxvZ3MgZm9yIHByb3BlciBpZC4KKyAgICAgICAgICAgIGFzc2VydFRoYXQoZ2V0TG9nZ2luZ0ZpbHRlclJlcXVlc3RMb2dSZWNvcmQoZ2V0TG9nZ2VkUmVjb3JkcygpKS5nZXRNZXNzYWdlKCksIGNvbnRhaW5zU3RyaW5nKCIxICoiKSk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0T3JkZXJPZkhlYWRlcnNPbkNsaWVudCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKQorICAgICAgICAgICAgICAgICAgICAucmVnaXN0ZXIobmV3IExvZ2dpbmdGZWF0dXJlKExvZ2dlci5nZXRMb2dnZXIoTE9HR0VSX05BTUUpKSkKKyAgICAgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgICAgICAuZ2V0KCk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbyhFTlRJVFkpKTsKKworICAgICAgICAgICAgZmluYWwgTG9nUmVjb3JkIHJlY29yZCA9IGdldExvZ2dpbmdGaWx0ZXJSZXNwb25zZUxvZ1JlY29yZChnZXRMb2dnZWRSZWNvcmRzKCkpOworICAgICAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSByZWNvcmQuZ2V0TWVzc2FnZSgpOworCisgICAgICAgICAgICBpbnQgaSA9IDE7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGgxID0gIjAwIiArIGkrKzsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaDIgPSAiMDAiICsgaTsKKworICAgICAgICAgICAgICAgIGZpbmFsIGludCBpMSA9IG1lc3NhZ2UuaW5kZXhPZihoMSk7CisgICAgICAgICAgICAgICAgZmluYWwgaW50IGkyID0gbWVzc2FnZS5pbmRleE9mKGgyKTsKKworICAgICAgICAgICAgICAgIGFzc2VydFRoYXQoIkhlYWRlciAiICsgaDEgKyAiIGhhcyBiZWVuIGxvZ2dlZCBzb29uZXIgdGhhbiBoZWFkZXIgIiArIGgyLCBpMSwgbGVzc1RoYW4oaTIpKTsKKyAgICAgICAgICAgIH0gd2hpbGUgKGkgPCA1KTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJib3NpdHlBbnlQYXlsb2FkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpCisgICAgICAgICAgICAgICAgICAgIC5yZWdpc3RlcihuZXcgTG9nZ2luZ0ZlYXR1cmUoTG9nZ2VyLmdldExvZ2dlcihMT0dHRVJfTkFNRSksIExvZ2dpbmdGZWF0dXJlLlZlcmJvc2l0eS5QQVlMT0FEX0FOWSkpCisgICAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAgICAgLmdldCgpOworCisgICAgICAgICAgICAvLyBDb3JyZWN0IHJlc3BvbnNlIHN0YXR1cy4KKyAgICAgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKFJlc3BvbnNlLlN0YXR1cy5PSy5nZXRTdGF0dXNDb2RlKCkpKTsKKyAgICAgICAgICAgIC8vIENoZWNrIGxvZ3MgZm9yIHByb3BlciBpZC4KKyAgICAgICAgICAgIGFzc2VydFRoYXQoZ2V0TG9nZ2luZ0ZpbHRlckxvZ1JlY29yZChnZXRMb2dnZWRSZWNvcmRzKCkpLmdldCgxKS5nZXRNZXNzYWdlKCksIGNvbnRhaW5zU3RyaW5nKEVOVElUWSkpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdFZlcmJvc2l0eUFueVBheWxvYWRTZXRWZXJib3NpdHlBc1RleHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkKKyAgICAgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKG5ldyBMb2dnaW5nRmVhdHVyZShMb2dnZXIuZ2V0TG9nZ2VyKExPR0dFUl9OQU1FKSkpCisgICAgICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShMb2dnaW5nRmVhdHVyZS5MT0dHSU5HX0ZFQVRVUkVfVkVSQk9TSVRZLCAiUEFZTE9BRF9BTlkiKQorICAgICAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgICAgIC5nZXQoKTsKKworICAgICAgICAgICAgLy8gQ29ycmVjdCByZXNwb25zZSBzdGF0dXMuCisgICAgICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcyhSZXNwb25zZS5TdGF0dXMuT0suZ2V0U3RhdHVzQ29kZSgpKSk7CisgICAgICAgICAgICAvLyBDaGVjayBsb2dzIGZvciBwcm9wZXIgaWQuCisgICAgICAgICAgICBhc3NlcnRUaGF0KGdldExvZ2dpbmdGaWx0ZXJMb2dSZWNvcmQoZ2V0TG9nZ2VkUmVjb3JkcygpKS5nZXQoMSkuZ2V0TWVzc2FnZSgpLCBjb250YWluc1N0cmluZyhFTlRJVFkpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RWZXJib3NpdHlUZXh0UGF5bG9hZEJpbmFyeUZpbHRlcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpCisgICAgICAgICAgICAgICAgICAgIC5yZWdpc3RlcihuZXcgTG9nZ2luZ0ZlYXR1cmUoTG9nZ2VyLmdldExvZ2dlcihMT0dHRVJfTkFNRSksIExvZ2dpbmdGZWF0dXJlLlZlcmJvc2l0eS5QQVlMT0FEX1RFWFQpKQorICAgICAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgICAgIC5nZXQoKTsKKworICAgICAgICAgICAgLy8gQ29ycmVjdCByZXNwb25zZSBzdGF0dXMuCisgICAgICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcyhSZXNwb25zZS5TdGF0dXMuT0suZ2V0U3RhdHVzQ29kZSgpKSk7CisgICAgICAgICAgICAvLyBDaGVjayBsb2dzIGZvciBwcm9wZXIgaWQuCisgICAgICAgICAgICBhc3NlcnRUaGF0KGdldExvZ2dpbmdGaWx0ZXJMb2dSZWNvcmQoZ2V0TG9nZ2VkUmVjb3JkcygpKS5nZXQoMSkuZ2V0TWVzc2FnZSgpLCBub3QoY29udGFpbnNTdHJpbmcoRU5USVRZKSkpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdFZlcmJvc2l0eVRleHRQYXlsb2FkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiL3RleHQiKQorICAgICAgICAgICAgICAgICAgICAucmVnaXN0ZXIobmV3IExvZ2dpbmdGZWF0dXJlKExvZ2dlci5nZXRMb2dnZXIoTE9HR0VSX05BTUUpLCBMb2dnaW5nRmVhdHVyZS5WZXJib3NpdHkuUEFZTE9BRF9URVhUKSkKKyAgICAgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgICAgICAuZ2V0KCk7CisKKyAgICAgICAgICAgIC8vIENvcnJlY3QgcmVzcG9uc2Ugc3RhdHVzLgorICAgICAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoUmVzcG9uc2UuU3RhdHVzLk9LLmdldFN0YXR1c0NvZGUoKSkpOworICAgICAgICAgICAgLy8gQ2hlY2sgbG9ncyBmb3IgcHJvcGVyIGlkLgorICAgICAgICAgICAgYXNzZXJ0VGhhdChnZXRMb2dnaW5nRmlsdGVyTG9nUmVjb3JkKGdldExvZ2dlZFJlY29yZHMoKSkuZ2V0KDEpLmdldE1lc3NhZ2UoKSwgY29udGFpbnNTdHJpbmcoRU5USVRZKSk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0VmVyYm9zaXR5SGVhZGVyc1BheWxvYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkKKyAgICAgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKG5ldyBMb2dnaW5nRmVhdHVyZShMb2dnZXIuZ2V0TG9nZ2VyKExPR0dFUl9OQU1FKSwgTG9nZ2luZ0ZlYXR1cmUuVmVyYm9zaXR5LkhFQURFUlNfT05MWSkpCisgICAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAgICAgLmdldCgpOworCisgICAgICAgICAgICAvLyBDb3JyZWN0IHJlc3BvbnNlIHN0YXR1cy4KKyAgICAgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKFJlc3BvbnNlLlN0YXR1cy5PSy5nZXRTdGF0dXNDb2RlKCkpKTsKKyAgICAgICAgICAgIC8vIENoZWNrIGxvZ3MgZm9yIHByb3BlciBpZC4KKyAgICAgICAgICAgIGFzc2VydFRoYXQoZ2V0TG9nZ2luZ0ZpbHRlckxvZ1JlY29yZChnZXRMb2dnZWRSZWNvcmRzKCkpLmdldCgxKS5nZXRNZXNzYWdlKCksIG5vdChjb250YWluc1N0cmluZyhFTlRJVFkpKSk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGVkRW50aXR5TG9nZ2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiL3RleHQiKQorICAgICAgICAgICAgICAgICAgICAucmVnaXN0ZXIobmV3IExvZ2dpbmdGZWF0dXJlKExvZ2dlci5nZXRMb2dnZXIoTE9HR0VSX05BTUUpLCBMb2dnaW5nRmVhdHVyZS5WZXJib3NpdHkuUEFZTE9BRF9URVhUKSkKKyAgICAgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkudGV4dChFTlRJVFkpKTsKKworICAgICAgICAgICAgLy8gQ29ycmVjdCByZXNwb25zZSBzdGF0dXMuCisgICAgICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcyhSZXNwb25zZS5TdGF0dXMuT0suZ2V0U3RhdHVzQ29kZSgpKSk7CisgICAgICAgICAgICAvLyBDaGVjayBsb2dzIGZvciBwcm9wZXIgaWQuCisgICAgICAgICAgICBhc3NlcnRUaGF0KGdldExvZ2dpbmdGaWx0ZXJMb2dSZWNvcmQoZ2V0TG9nZ2VkUmVjb3JkcygpKS5nZXQoMCkuZ2V0TWVzc2FnZSgpLCBjb250YWluc1N0cmluZyhFTlRJVFkpKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhbCBjbGllbnQgc2lkZSB0ZXN0cy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbnRhaW5lclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIHNldChUZXN0UHJvcGVydGllcy5SRUNPUkRfTE9HX0xFVkVMLCBMZXZlbC5GSU5FLmludFZhbHVlKCkpOworCisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKE15UmVzb3VyY2UuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIC5yZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgLnByb3BlcnR5KExvZ2dpbmdGZWF0dXJlLkxPR0dJTkdfRkVBVFVSRV9MT0dHRVJfTkFNRV9TRVJWRVIsIExPR0dFUl9OQU1FKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RMb2dnaW5nQXNDb250YWluZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIC8vIENvcnJlY3QgcmVzcG9uc2Ugc3RhdHVzLgorICAgICAgICAgICAgYXNzZXJ0VGhhdCh0YXJnZXQoKS5yZXF1ZXN0KCkuZ2V0KCkuZ2V0U3RhdHVzKCksIGlzKFJlc3BvbnNlLlN0YXR1cy5PSy5nZXRTdGF0dXNDb2RlKCkpKTsKKworICAgICAgICAgICAgLy8gQ2hlY2sgbG9ncyBmb3IgcHJvcGVyIGlkLgorICAgICAgICAgICAgYXNzZXJ0VGhhdChnZXRMb2dnaW5nRmlsdGVyUmVxdWVzdExvZ1JlY29yZChnZXRMb2dnZWRSZWNvcmRzKCkpLmdldE1lc3NhZ2UoKSwgY29udGFpbnNTdHJpbmcoIjEgKiIpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoZ2V0TG9nZ2luZ0ZpbHRlclJlc3BvbnNlTG9nUmVjb3JkKGdldExvZ2dlZFJlY29yZHMoKSkuZ2V0TWVzc2FnZSgpLCBjb250YWluc1N0cmluZygiMSAqIikpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdExvZ2dpbmdBc0NvbnRhaW5lclRleHRQYXlsb2FkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAvLyBDb3JyZWN0IHJlc3BvbnNlIHN0YXR1cy4KKyAgICAgICAgICAgIGFzc2VydFRoYXQodGFyZ2V0KCIvdGV4dCIpLnJlcXVlc3QoKS5nZXQoKS5nZXRTdGF0dXMoKSwgaXMoUmVzcG9uc2UuU3RhdHVzLk9LLmdldFN0YXR1c0NvZGUoKSkpOworCisgICAgICAgICAgICAvLyBDaGVjayBsb2dzIGZvciBwcm9wZXIgaWQuCisgICAgICAgICAgICBhc3NlcnRUaGF0KGdldExvZ2dpbmdGaWx0ZXJSZXF1ZXN0TG9nUmVjb3JkKGdldExvZ2dlZFJlY29yZHMoKSkuZ2V0TWVzc2FnZSgpLCBjb250YWluc1N0cmluZygiMSAqIikpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChnZXRMb2dnaW5nRmlsdGVyUmVzcG9uc2VMb2dSZWNvcmQoZ2V0TG9nZ2VkUmVjb3JkcygpKS5nZXRNZXNzYWdlKCksIGNvbnRhaW5zU3RyaW5nKCIxICoiKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGdldExvZ2dpbmdGaWx0ZXJMb2dSZWNvcmQoZ2V0TG9nZ2VkUmVjb3JkcygpKS5nZXQoMSkuZ2V0TWVzc2FnZSgpLCBjb250YWluc1N0cmluZyhFTlRJVFkpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RMb2dnaW5nQXNDb250YWluZXJCaW5hcnlQYXlsb2FkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAvLyBDb3JyZWN0IHJlc3BvbnNlIHN0YXR1cy4KKyAgICAgICAgICAgIGFzc2VydFRoYXQodGFyZ2V0KCkucmVxdWVzdCgpLmdldCgpLmdldFN0YXR1cygpLCBpcyhSZXNwb25zZS5TdGF0dXMuT0suZ2V0U3RhdHVzQ29kZSgpKSk7CisKKyAgICAgICAgICAgIC8vIENoZWNrIGxvZ3MgZm9yIHByb3BlciBpZC4KKyAgICAgICAgICAgIGFzc2VydFRoYXQoZ2V0TG9nZ2luZ0ZpbHRlclJlcXVlc3RMb2dSZWNvcmQoZ2V0TG9nZ2VkUmVjb3JkcygpKS5nZXRNZXNzYWdlKCksIGNvbnRhaW5zU3RyaW5nKCIxICoiKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGdldExvZ2dpbmdGaWx0ZXJSZXNwb25zZUxvZ1JlY29yZChnZXRMb2dnZWRSZWNvcmRzKCkpLmdldE1lc3NhZ2UoKSwgY29udGFpbnNTdHJpbmcoIjEgKiIpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoZ2V0TG9nZ2luZ0ZpbHRlckxvZ1JlY29yZChnZXRMb2dnZWRSZWNvcmRzKCkpLmdldCgxKS5nZXRNZXNzYWdlKCksIG5vdChjb250YWluc1N0cmluZyhFTlRJVFkpKSk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdGVkRW50aXR5TG9nZ2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiL3RleHQiKQorICAgICAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS50ZXh0KEVOVElUWSkpOworCisgICAgICAgICAgICAvLyBDb3JyZWN0IHJlc3BvbnNlIHN0YXR1cy4KKyAgICAgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKFJlc3BvbnNlLlN0YXR1cy5PSy5nZXRTdGF0dXNDb2RlKCkpKTsKKyAgICAgICAgICAgIC8vIENoZWNrIGxvZ3MgZm9yIHByb3BlciBpZC4KKyAgICAgICAgICAgIGFzc2VydFRoYXQoZ2V0TG9nZ2luZ0ZpbHRlckxvZ1JlY29yZChnZXRMb2dnZWRSZWNvcmRzKCkpLmdldCgwKS5nZXRNZXNzYWdlKCksIGNvbnRhaW5zU3RyaW5nKEVOVElUWSkpOworCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmFsIGNsaWVudCBzaWRlIHRlc3RzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29udGFpbmVyQXV0b2Rpc2NvdmVyeVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIHNldChUZXN0UHJvcGVydGllcy5SRUNPUkRfTE9HX0xFVkVMLCBMZXZlbC5JTkZPLmludFZhbHVlKCkpOworCisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKE15UmVzb3VyY2UuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShMb2dnaW5nRmVhdHVyZS5MT0dHSU5HX0ZFQVRVUkVfTE9HR0VSX05BTUVfU0VSVkVSLCBMT0dHRVJfTkFNRSkKKyAgICAgICAgICAgICAgICAgICAgLnByb3BlcnR5KExvZ2dpbmdGZWF0dXJlLkxPR0dJTkdfRkVBVFVSRV9MT0dHRVJfTEVWRUxfU0VSVkVSLCAiSU5GTyIpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdEZpbHRlckFzQ29udGFpbmVyRmlsdGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAvLyBDb3JyZWN0IHJlc3BvbnNlIHN0YXR1cy4KKyAgICAgICAgICAgIGFzc2VydFRoYXQodGFyZ2V0KCkucmVxdWVzdCgpLmdldCgpLmdldFN0YXR1cygpLCBpcyhSZXNwb25zZS5TdGF0dXMuT0suZ2V0U3RhdHVzQ29kZSgpKSk7CisKKyAgICAgICAgICAgIC8vIENoZWNrIGxvZ3MgZm9yIHByb3BlciBpZC4KKyAgICAgICAgICAgIGFzc2VydFRoYXQoZ2V0TG9nZ2luZ0ZpbHRlclJlcXVlc3RMb2dSZWNvcmQoZ2V0TG9nZ2VkUmVjb3JkcygpKS5nZXRNZXNzYWdlKCksIGNvbnRhaW5zU3RyaW5nKCIxICoiKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGdldExvZ2dpbmdGaWx0ZXJSZXNwb25zZUxvZ1JlY29yZChnZXRMb2dnZWRSZWNvcmRzKCkpLmdldE1lc3NhZ2UoKSwgY29udGFpbnNTdHJpbmcoIjEgKiIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIExvZ1JlY29yZCBnZXRMb2dnaW5nRmlsdGVyUmVxdWVzdExvZ1JlY29yZChmaW5hbCBMaXN0PExvZ1JlY29yZD4gcmVjb3JkcykgeworICAgICAgICByZXR1cm4gZ2V0TG9nZ2luZ0ZpbHRlckxvZ1JlY29yZChyZWNvcmRzLCB0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBMb2dSZWNvcmQgZ2V0TG9nZ2luZ0ZpbHRlclJlc3BvbnNlTG9nUmVjb3JkKGZpbmFsIExpc3Q8TG9nUmVjb3JkPiByZWNvcmRzKSB7CisgICAgICAgIHJldHVybiBnZXRMb2dnaW5nRmlsdGVyTG9nUmVjb3JkKHJlY29yZHMsIGZhbHNlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBMb2dSZWNvcmQgZ2V0TG9nZ2luZ0ZpbHRlckxvZ1JlY29yZChmaW5hbCBMaXN0PExvZ1JlY29yZD4gcmVjb3JkcywgZmluYWwgYm9vbGVhbiByZXF1ZXN0UXVlcnkpIHsKKyAgICAgICAgZm9yIChmaW5hbCBMb2dSZWNvcmQgcmVjb3JkIDogZ2V0TG9nZ2luZ0ZpbHRlckxvZ1JlY29yZChyZWNvcmRzKSkgeworICAgICAgICAgICAgaWYgKHJlY29yZC5nZXRNZXNzYWdlKCkuY29udGFpbnMocmVxdWVzdFF1ZXJ5ID8gInJlcXVlc3QiIDogInJlc3BvbnNlIikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVjb3JkOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJVbmFibGUgdG8gZmluZCBwcm9wZXIgbG9nIHJlY29yZC4iKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBMaXN0PExvZ1JlY29yZD4gZ2V0TG9nZ2luZ0ZpbHRlckxvZ1JlY29yZChmaW5hbCBMaXN0PExvZ1JlY29yZD4gcmVjb3JkcykgeworICAgICAgICBmaW5hbCBMaXN0PExvZ1JlY29yZD4gbG9nZ2luZ0ZpbHRlclJlY29yZHMgPSBuZXcgQXJyYXlMaXN0PD4ocmVjb3Jkcy5zaXplKCkpOworCisgICAgICAgIGZvciAoZmluYWwgTG9nUmVjb3JkIHJlY29yZCA6IHJlY29yZHMpIHsKKyAgICAgICAgICAgIGlmIChyZWNvcmQuZ2V0TG9nZ2VyTmFtZSgpLnN0YXJ0c1dpdGgoTE9HR0VSX05BTUUpKSB7CisgICAgICAgICAgICAgICAgbG9nZ2luZ0ZpbHRlclJlY29yZHMuYWRkKHJlY29yZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbG9nZ2luZ0ZpbHRlclJlY29yZHM7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGaWx0ZXJzT3JkZXJUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICAgICAgQFByaW9yaXR5KDEwMDApCisgICAgICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEN1c3RvbUZpbHRlciBpbXBsZW1lbnRzIENsaWVudFJlcXVlc3RGaWx0ZXIsIENsaWVudFJlc3BvbnNlRmlsdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250YWluZXJSZXF1ZXN0RmlsdGVyLCBDb250YWluZXJSZXNwb25zZUZpbHRlciB7CisKKyAgICAgICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ1VTVE9NX0hFQURFUiA9ICJjdXN0b21faGVhZGVyIjsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoZmluYWwgQ2xpZW50UmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuZ2V0SGVhZGVycygpLmFkZChDVVNUT01fSEVBREVSLCAiY2xpZW50L3JlcXVlc3QiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoZmluYWwgQ2xpZW50UmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsIGZpbmFsIENsaWVudFJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQpCisgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LmdldEhlYWRlcnMoKS5hZGQoQ1VTVE9NX0hFQURFUiwgImNsaWVudC9yZXNwb25zZSIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihmaW5hbCBDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5nZXRIZWFkZXJzKCkuYWRkKENVU1RPTV9IRUFERVIsICJjb250YWluZXIvcmVxdWVzdCIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihmaW5hbCBDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCwgZmluYWwgQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCkKKyAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICByZXNwb25zZUNvbnRleHQuZ2V0SGVhZGVycygpLmFkZChDVVNUT01fSEVBREVSLCAiY29udGFpbmVyL3Jlc3BvbnNlIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIHNldChUZXN0UHJvcGVydGllcy5SRUNPUkRfTE9HX0xFVkVMLCBMZXZlbC5JTkZPLmludFZhbHVlKCkpOworCisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKE15UmVzb3VyY2UuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShMb2dnaW5nRmVhdHVyZS5MT0dHSU5HX0ZFQVRVUkVfTE9HR0VSX05BTUUsIExPR0dFUl9OQU1FKQorICAgICAgICAgICAgICAgICAgICAucHJvcGVydHkoTG9nZ2luZ0ZlYXR1cmUuTE9HR0lOR19GRUFUVVJFX0xPR0dFUl9MRVZFTCwgIklORk8iKQorICAgICAgICAgICAgICAgICAgICAucmVnaXN0ZXIoQ3VzdG9tRmlsdGVyLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RGaWx0ZXJBc0NvbnRhaW5lckZpbHRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAgICAgLy8gQ29ycmVjdCByZXNwb25zZSBzdGF0dXMuCisgICAgICAgICAgICBhc3NlcnRUaGF0KHRhcmdldCgpCisgICAgICAgICAgICAgICAgICAgIC5yZWdpc3RlcihDdXN0b21GaWx0ZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIC5yZWdpc3RlcihuZXcgTG9nZ2luZ0ZlYXR1cmUoTG9nZ2VyLmdldExvZ2dlcihMT0dHRVJfTkFNRSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGV2ZWwuSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2dnaW5nRmVhdHVyZS5WZXJib3NpdHkuSEVBREVSU19PTkxZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApKQorICAgICAgICAgICAgICAgICAgICAucmVxdWVzdCgpLmdldCgpLmdldFN0YXR1cygpLCBpcyhSZXNwb25zZS5TdGF0dXMuT0suZ2V0U3RhdHVzQ29kZSgpKSk7CisKKyAgICAgICAgICAgIGZvciAoTG9nUmVjb3JkIHJlY29yZCA6IGdldExvZ2dlZFJlY29yZHMoKSkgeworICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihyZWNvcmQuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gLS0tIGNsaWVudCByZXF1ZXN0IGxvZyBlbnRyeQorICAgICAgICAgICAgLy8gY2xpZW50IGFkZGVkIGhlYWRlciBiZWZvcmUgcmVxdWVzdCBoYXMgc2VudCAoYW5kIGxvZ2dlZCkKKyAgICAgICAgICAgIGFzc2VydFRoYXQoZ2V0TG9nZ2VkUmVjb3JkcygpLmdldCgwKS5nZXRNZXNzYWdlKCksCisgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zU3RyaW5nKCIxID4gY3VzdG9tX2hlYWRlcjogY2xpZW50L3JlcXVlc3RcbiIpKTsKKworCisgICAgICAgICAgICAvLyAtLS0gY29udGFpbmVyIHJlcXVlc3QgbG9nIGVudHJ5CisgICAgICAgICAgICAvLyBjb250YWluZXIgcmVjZWl2ZXMgaGVhZGVyIGZyb20gY2xpZW50IHJlcXVlc3QKKyAgICAgICAgICAgIGFzc2VydFRoYXQoZ2V0TG9nZ2VkUmVjb3JkcygpLmdldCgxKS5nZXRNZXNzYWdlKCksCisgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zU3RyaW5nKCIxID4gY3VzdG9tX2hlYWRlcjogY2xpZW50L3JlcXVlc3RcbiIpKTsKKyAgICAgICAgICAgIC8vIGNvbnRhaW5lciBoYXMgYWRkZWQgaXRzIG93biBoZWFkZXIgYWZ0ZXIgbG9nZ2luZyBmaWx0ZXIgbG9nZ2VkIG1lc3NhZ2UKKyAgICAgICAgICAgIGFzc2VydFRoYXQoZ2V0TG9nZ2VkUmVjb3JkcygpLmdldCgxKS5nZXRNZXNzYWdlKCksCisgICAgICAgICAgICAgICAgICAgIG5vdChjb250YWluc1N0cmluZygiMSA+IGN1c3RvbV9oZWFkZXI6IGNvbnRhaW5lci9yZXF1ZXN0XG4iKSkpOworCisKKyAgICAgICAgICAgIC8vIC0tLSBjb250YWluZXIgcmVzcG9uc2UgbG9nIGVudHJ5CisgICAgICAgICAgICAvLyBjb250YWluZXIgYWRkZWQgaGVhZGVyIHRvIHRoZSByZXNwb25zZSBhbmQgaXQgd2FzIGxvZ2dlZAorICAgICAgICAgICAgYXNzZXJ0VGhhdChnZXRMb2dnZWRSZWNvcmRzKCkuZ2V0KDIpLmdldE1lc3NhZ2UoKSwKKyAgICAgICAgICAgICAgICAgICAgY29udGFpbnNTdHJpbmcoIjEgPCBjdXN0b21faGVhZGVyOiBjb250YWluZXIvcmVzcG9uc2VcbiIpKTsKKworICAgICAgICAgICAgLy8gLS0tIGNsaWVudCByZXNwb25zZSBsb2cgZW50cnkKKyAgICAgICAgICAgIC8vIGNsaWVudCByZWNlaXZlZCBoZWFkZXIKKyAgICAgICAgICAgIGFzc2VydFRoYXQoZ2V0TG9nZ2VkUmVjb3JkcygpLmdldCgzKS5nZXRNZXNzYWdlKCksCisgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zU3RyaW5nKCIxIDwgY3VzdG9tX2hlYWRlcjogY29udGFpbmVyL3Jlc3BvbnNlXG4iKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGdldExvZ2dlZFJlY29yZHMoKS5nZXQoMykuZ2V0TWVzc2FnZSgpLAorICAgICAgICAgICAgICAgICAgICBub3QoY29udGFpbnNTdHJpbmcoIjEgPCBjdXN0b21faGVhZGVyOiBjbGllbnQvcmVzcG9uc2VcbiIpKSk7CisKKyAgICAgICAgfQorCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9NZXNzYWdlQm9keVJlYWRlclVuc3VwcG9ydGVkVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9NZXNzYWdlQm9keVJlYWRlclVuc3VwcG9ydGVkVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZDQ5NjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL01lc3NhZ2VCb2R5UmVhZGVyVW5zdXBwb3J0ZWRUZXN0LmphdmEKQEAgLTAsMCArMSwxODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZS5TdGF0dXM7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5UmVhZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuUmVhZGVyV3JpdGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBUZXN0IGNhc2UgZm9yIHVuc3VwcG9ydGVkIG1lZGlhIHR5cGUuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgY2xhc3MgTWVzc2FnZUJvZHlSZWFkZXJVbnN1cHBvcnRlZFRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIC8vIFRlc3RFbnRpdHlQcm92aWRlciBtdXN0IG5vdCBiZSByZWdpc3RlcmVkIGluIHRoZSBhcHBsaWNhdGlvbiBmb3IgdGhpcyB0ZXN0IGNhc2UuCisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlbmQgcmVxdWVzdCB0byB3aXRoIGFwcGxpY2F0aW9uL2pzb24gY29udGVudCB0byBzZXJ2ZXIgd2hlcmUgSnNvbkpheGJCaW5kZXIgaXMgbm90IHJlZ2lzdGVyZWQuIFVOU1VQUE9SVEVEX01FRElBX1RZUEUKKyAgICAgKiBzaG91bGQgYmUgcmV0dXJuZWQuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5zdXBwb3J0ZWRNZXNzYWdlQm9keVJlYWRlcigpIHsKKyAgICAgICAgY2xpZW50KCkucmVnaXN0ZXIobmV3IFRlc3RFbnRpdHlQcm92aWRlcigpKTsKKyAgICAgICAgVGVzdEVudGl0eSBlbnRpdHkgPSBuZXcgVGVzdEVudGl0eSgidGVzdEVudGl0eSIpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInRlc3QiKS5yZXF1ZXN0KFRlc3RFbnRpdHlQcm92aWRlci5URVNUX0VOVElUWV9UWVBFKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkoZW50aXR5LCBUZXN0RW50aXR5UHJvdmlkZXIuVEVTVF9FTlRJVFlfVFlQRSkpOworCisgICAgICAgIC8vIFRlc3RFbnRpdHlQcm92aWRlciBpcyBub3QgcmVnaXN0ZXJlZCBvbiB0aGUgc2VydmVyIGFuZCB0aGVyZWZvcmUgdGhlIHNlcnZlciBzaG91bGQgcmV0dXJuIFVOU1VQUE9SVEVEX01FRElBX1RZUEUKKyAgICAgICAgYXNzZXJ0RXF1YWxzKFN0YXR1cy5VTlNVUFBPUlRFRF9NRURJQV9UWVBFLmdldFN0YXR1c0NvZGUoKSwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRGYWxzZShSZXNvdXJjZS5tZXRob2RDYWxsZWQpOworICAgICAgICBTdHJpbmcgcmVzcG9uc2VFbnRpdHkgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRydWUoKHJlc3BvbnNlRW50aXR5ID09IG51bGwpIHx8IChyZXNwb25zZUVudGl0eS5sZW5ndGgoKSA9PSAwKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBSZXNvdXJjZSBjbGFzcy4KKyAgICAgKgorICAgICAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAgICAgKi8KKyAgICBAUGF0aCgidGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgYm9vbGVhbiBtZXRob2RDYWxsZWQ7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlc291cmNlIG1ldGhvZCBwcm9kdWNpbmcgYSB7QGNvZGUgbnVsbH0gcmVzdWx0LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gZW50aXR5IHRlc3QgZW50aXR5LgorICAgICAgICAgKiBAcmV0dXJuIHtAY29kZSBudWxsfS4KKyAgICAgICAgICovCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQcm9kdWNlcyhUZXN0RW50aXR5UHJvdmlkZXIuVEVTVF9FTlRJVFkpCisgICAgICAgIEBDb25zdW1lcyhUZXN0RW50aXR5UHJvdmlkZXIuVEVTVF9FTlRJVFkpCisgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJVbnVzZWRQYXJhbWV0ZXJzIikKKyAgICAgICAgcHVibGljIFRlc3RFbnRpdHkgcHJvY2Vzc0VudGl0eUFuZFByb2R1Y2VOdWxsKFRlc3RFbnRpdHkgZW50aXR5KSB7CisgICAgICAgICAgICBtZXRob2RDYWxsZWQgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGJlYW4uCisgICAgICoKKyAgICAgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0RW50aXR5IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB2YWx1ZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0IHZhbHVlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHZhbHVlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGUgbmV3IHRlc3QgZW50aXR5LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gdmFsdWUgZW50aXR5IHZhbHVlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIFRlc3RFbnRpdHkoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICBzdXBlcigpOworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3VzdG9tIHRlc3QgZW50aXR5IHByb3ZpZGVyLgorICAgICAqLworICAgIEBQcm9kdWNlcygidGVzdC9lbnRpdHkiKQorICAgIEBDb25zdW1lcygidGVzdC9lbnRpdHkiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdEVudGl0eVByb3ZpZGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlSZWFkZXI8VGVzdEVudGl0eT4sIE1lc3NhZ2VCb2R5V3JpdGVyPFRlc3RFbnRpdHk+IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRlc3QgYmVhbiBtZWRpYSB0eXBlIHN0cmluZy4KKyAgICAgICAgICovCisgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfRU5USVRZID0gInRlc3QvZW50aXR5IjsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRlc3QgYmVhbiBtZWRpYSB0eXBlLgorICAgICAgICAgKi8KKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBNZWRpYVR5cGUgVEVTVF9FTlRJVFlfVFlQRSA9IE1lZGlhVHlwZS52YWx1ZU9mKFRFU1RfRU5USVRZKTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBUZXN0RW50aXR5LmNsYXNzID09IHR5cGUgJiYgVEVTVF9FTlRJVFlfVFlQRS5lcXVhbHMobWVkaWFUeXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVGVzdEVudGl0eSByZWFkRnJvbShDbGFzczxUZXN0RW50aXR5PiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgVGVzdEVudGl0eShSZWFkZXJXcml0ZXIucmVhZEZyb21Bc1N0cmluZyhlbnRpdHlTdHJlYW0sIG1lZGlhVHlwZSkpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIFRlc3RFbnRpdHkuY2xhc3MgPT0gdHlwZSAmJiBURVNUX0VOVElUWV9UWVBFLmVxdWFscyhtZWRpYVR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldFNpemUoVGVzdEVudGl0eSB0ZXN0RW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oVGVzdEVudGl0eSB0ZXN0RW50aXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBSZWFkZXJXcml0ZXIud3JpdGVUb0FzU3RyaW5nKHRlc3RFbnRpdHkuZ2V0VmFsdWUoKSwgZW50aXR5U3RyZWFtLCBtZWRpYVR5cGUpOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL01lc3NhZ2VCb2R5V29ya2VySW5oZXJpdGFuY2VUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL01lc3NhZ2VCb2R5V29ya2VySW5oZXJpdGFuY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFkMmZhOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vTWVzc2FnZUJvZHlXb3JrZXJJbmhlcml0YW5jZVRlc3QuamF2YQpAQCAtMCwwICsxLDIwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uSmFja3NvbkZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0LWNhc2UgZm9yIEpFUlNFWS0xNDgxLgorICoKKyAqIHtAbGluayBKYWNrc29uRmVhdHVyZSBKYWNrc29uIHByb3ZpZGVyfSBzaG91bGQgbm90IHRha2UgcHJlY2VkZW5jZSBvdmVyIG91cgorICogY3VzdG9tIHByb3ZpZGVyLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgTWVzc2FnZUJvZHlXb3JrZXJJbmhlcml0YW5jZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIE1vZGVsPFQ+IHsKKworICAgICAgICBwdWJsaWMgVCBnZXRWYWx1ZSgpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3RyaW5nTW9kZWwgaW1wbGVtZW50cyBNb2RlbDxTdHJpbmc+IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB2YWx1ZTsKKworICAgICAgICBwdWJsaWMgU3RyaW5nTW9kZWwoZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEludGVyZmFjZVR5cGUgZXh0ZW5kcyBNb2RlbCB7CisgICAgfQorCisgICAgQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorICAgIEBQcm92aWRlcgorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTW9kZWxSZWFkZXI8VCBleHRlbmRzIE1vZGVsPiBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5UmVhZGVyPFQ+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZWFkYWJsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworCisgICAgICAgICAgICByZXR1cm4gTW9kZWwuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbSh0eXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVCByZWFkRnJvbSgKKyAgICAgICAgICAgICAgICAgICAgQ2xhc3M8VD4gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgICAgIHJldHVybiAoVCkgbmV3IEludGVyZmFjZVR5cGUoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJmcm9tSW50ZXJmYWNlVHlwZVJlYWRlciI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIHB1YmxpYyBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgQmFzZVByb3ZpZGVyPFQ+IGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8VD4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShmaW5hbCBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgICAgIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldFNpemUoZmluYWwgVCB0LAorICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oZmluYWwgVCB0LAorICAgICAgICAgICAgICAgIGZpbmFsIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBlbnRpdHlTdHJlYW0ud3JpdGUoZ2V0Q29udGVudCh0KS5nZXRCeXRlcygiVVRGLTgiKSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldENvbnRlbnQoVCBwcm94eSk7CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgR2VuZXJpY01vZGVsV3JpdGVyIGV4dGVuZHMgQmFzZVByb3ZpZGVyPE1vZGVsPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudChmaW5hbCBNb2RlbCBwcm94eSkgeworICAgICAgICAgICAgcmV0dXJuICJ7XCJiYXJcIjpcIiIgKyBwcm94eS5nZXRWYWx1ZSgpICsgIlwifSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbnRlZ2VyTW9kZWxXcml0ZXIgZXh0ZW5kcyBCYXNlUHJvdmlkZXI8TW9kZWw8SW50ZWdlcj4+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50KGZpbmFsIE1vZGVsPEludGVnZXI+IHByb3h5KSB7CisgICAgICAgICAgICByZXR1cm4gIntcImZvb1wiOlwiIiArIHByb3h5LmdldFZhbHVlKCkgKyAiXCJ9IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJyZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgTW9kZWw8U3RyaW5nPiBnZXRTdHJpbmdNb2RlbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nTW9kZWwoImZvbyIpOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3QoSW50ZXJmYWNlVHlwZSB0KSB7CisgICAgICAgICAgICByZXR1cm4gdC5nZXRWYWx1ZSgpLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihHZW5lcmljTW9kZWxXcml0ZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKE1vZGVsUmVhZGVyLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihKYWNrc29uRmVhdHVyZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWVzc2FnZUJvZHlXb3JrZXJJbmhlcml0YW5jZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRFcXVhbHMoIntcImJhclwiOlwiZm9vXCJ9IiwgdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKS5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNZXNzYWdlQm9keVdvcmtlckludGVyZmFjZUluaGVyaXRhbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5qc29uKCJ7XCJ2YWx1ZVwiOlwiaWdub3JlZFwifSIpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiZnJvbUludGVyZmFjZVR5cGVSZWFkZXIiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vTWVzc2FnZUJvZHlXcml0ZXJPYmplY3REaXN0YW5jZVRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vTWVzc2FnZUJvZHlXcml0ZXJPYmplY3REaXN0YW5jZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTc5MmUwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9NZXNzYWdlQm9keVdyaXRlck9iamVjdERpc3RhbmNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBPYmplY3QuY2xhc3MgbmVlZHMgc3BlY2lhbCBoYW5kbGluZyB3aGVuIGNvbXB1dGluZyB0eXBlIGRpc3RhbmNlIC0gaXQgc2hvdWxkIGJlIGFsd2F5cyBmdXJ0aGVyIHRoYW4gYW55IG90aGVyCisgKiBpbXBsZW1lbnRlZCBpbnRlcmZhY2UuCisgKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFN1cHByZXNzV2FybmluZ3MoIldlYWtlckFjY2VzcyIpCitwdWJsaWMgY2xhc3MgTWVzc2FnZUJvZHlXcml0ZXJPYmplY3REaXN0YW5jZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHB1YmxpYyBpbnRlcmZhY2UgSW50ZXJmYWNlQSB7CisKKyAgICB9CisKKyAgICBwdWJsaWMgaW50ZXJmYWNlIEludGVyZmFjZUIgZXh0ZW5kcyBJbnRlcmZhY2VBIHsKKworICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vdGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBPYmplY3RXcml0ZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVdyaXRlcjxPYmplY3Q+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKE9iamVjdCBvLCBDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKE9iamVjdCBvLCBDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLCBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sCisgICAgICAgICAgICAgICAgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgZW50aXR5U3RyZWFtLndyaXRlKCJvYmplY3QiLmdldEJ5dGVzKCJVVEYtOCIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vdGVzdCIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbnRlcmZhY2VBV3JpdGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8SW50ZXJmYWNlQT4geworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gSW50ZXJmYWNlQS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldFNpemUoSW50ZXJmYWNlQSBpbnRlcmZhY2VBLCBDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oSW50ZXJmYWNlQSBpbnRlcmZhY2VBLCBDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLCBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKQorICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgZW50aXR5U3RyZWFtLndyaXRlKEludGVyZmFjZUEuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLmdldEJ5dGVzKCJVVEYtOCIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJyZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3Rlc3QiKQorICAgICAgICBwdWJsaWMgSW50ZXJmYWNlQiBnZXRTdHJpbmdNb2RlbCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSW50ZXJmYWNlQigpIHsKKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihPYmplY3RXcml0ZXIuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKEludGVyZmFjZUFXcml0ZXIuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1lc3NhZ2VCb2R5V3JpdGVyT2JqZWN0RGlzdGFuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEludGVyZmFjZUEuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKS5yZXF1ZXN0KCJhcHBsaWNhdGlvbi90ZXN0IikuZ2V0KFN0cmluZy5jbGFzcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vTm9FbnRpdHlUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL05vRW50aXR5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwMWY4NDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL05vRW50aXR5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTU5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb247CisKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1veHkuanNvbi5Nb3h5SnNvbkZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNpbXBsZS5TaW1wbGVUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0TnVsbDsKKworLyoqCisgKiBUZXN0cyB0aGF0IG5vIGNvbnRlbnQgdHlwZSBpcyBzZW50IHdoZW4gYW4gZW50aXR5IGlzIG5vdCBwcmVzZW50LgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIE5vRW50aXR5VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoTXlSZXNvdXJjZS5jbGFzcywgTW94eUpzb25GZWF0dXJlLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIHJlc291cmNlQ29uZmlnOworICAgIH0KKworICAgIEBYbWxSb290RWxlbWVudAorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlFbnRpdHkgeworCisgICAgICAgIEBYbWxBdHRyaWJ1dGUKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgICAgICBAUGF0aCgibm8tZW50aXR5IikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldE5vRW50aXR5KCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cygyMDQpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24vanNvbiIpCisgICAgICAgIEBQYXRoKCJlbnRpdHkiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0RW50aXR5KCkgeworICAgICAgICAgICAgTXlFbnRpdHkgbXlFbnRpdHkgPSBuZXcgTXlFbnRpdHkoKTsKKyAgICAgICAgICAgIG15RW50aXR5LnNldE5hbWUoImhlbGxvIik7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDIwMCkuZW50aXR5KG15RW50aXR5KS5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgICAgICBAUGF0aCgic3RyaW5nIikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldEVtcHR5U3RyaW5nKCkgeworCisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDIwNCkuZW50aXR5KCIiKS5idWlsZCgpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcucmVnaXN0ZXIoCisgICAgICAgICAgICAgICAgbmV3IExvZ2dpbmdGZWF0dXJlKExvZ2dlci5nZXRMb2dnZXIoTm9FbnRpdHlUZXN0LmNsYXNzLnRvU3RyaW5nKCkpLCBMb2dnaW5nRmVhdHVyZS5WZXJib3NpdHkuUEFZTE9BRF9BTlkpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyB0aGF0IHJldHVybmVkIG1lZGlhIHR5cGUgaXMgbnVsbCB3aGVuIG5vIGVudGl0eSBpcyBzZW50LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vRW50aXR5KCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlL25vLWVudGl0eSIpLnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSkuZ2V0KCk7CisgICAgICAgIE15RW50aXR5IG15RW50aXR5ID0gcmVzcG9uc2UucmVhZEVudGl0eShNeUVudGl0eS5jbGFzcyk7CisgICAgICAgIGFzc2VydE51bGwobXlFbnRpdHkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjA0LCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydE51bGwocmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQgY29ycmVjdCBtZWRpYSB0eXBlIGlzIHJldHVybmVkLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVudGl0eSgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZS9lbnRpdHkiKS5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUpLmdldCgpOworICAgICAgICBNeUVudGl0eSBteUVudGl0eSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoTXlFbnRpdHkuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoImhlbGxvIiwgbXlFbnRpdHkuZ2V0TmFtZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSwgcmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHRoYXQgZW50aXR5IGlzIHJlYWQgYXMgbnVsbCB3aGVuIG5vIGVudGl0eSBpcyBzZW50IHdpdGggMjA0IHJlc3BvbnNlIHN0YXR1cy4KKyAgICAgKiBDdXJyZW50bHkgdGhpcyB0ZXN0IHRocm93cyBhbiBleGNlcHRpb24gd2hlbiB0cnlpbmcgdG8gcmVhZCB0aGUgZW50aXR5LgorICAgICAqIDxwLz4KKyAgICAgKiBFeGNlcHRpb246CisgICAgICogPHAvPgorICAgICAqIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuTWVzc2FnZUJvZHlQcm92aWRlck5vdEZvdW5kRXhjZXB0aW9uOgorICAgICAqIE1lc3NhZ2VCb2R5UmVhZGVyIG5vdCBmb3VuZCBmb3IgbWVkaWEgdHlwZT10ZXh0L3BsYWluLAorICAgICAqIHR5cGU9Y2xhc3Mgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbi5Ob0VudGl0eVRlc3QkTXlFbnRpdHksCisgICAgICogZ2VuZXJpY1R5cGU9Y2xhc3Mgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbi5Ob0VudGl0eVRlc3QkTXlFbnRpdHkuCisgICAgICogPHAvPgorICAgICAqIGh0dHBzOi8vamF2YS5uZXQvamlyYS9icm93c2UvSkVSU0VZLTE5OTQKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIEBJZ25vcmUoInNlZSBodHRwczovL2phdmEubmV0L2ppcmEvYnJvd3NlL0pFUlNFWS0xOTk0IikKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9FbnRpdHlTdHJpbmcoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2Uvc3RyaW5nIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBNeUVudGl0eSBteUVudGl0eSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoTXlFbnRpdHkuY2xhc3MpOworICAgICAgICBhc3NlcnROdWxsKG15RW50aXR5KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwNCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRleHQvcGxhaW4iLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IFNpbXBsZVRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9Ob25QdWJsaWNOb25TdGF0aWNUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL05vblB1YmxpY05vblN0YXRpY1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjg5MDVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9Ob25QdWJsaWNOb25TdGF0aWNUZXN0LmphdmEKQEAgLTAsMCArMSw1MzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ1JlY29yZDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5JbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlN1aXRlOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogVGVzdHMgZGVwbG95bWVudCBvZiBub24tc3RhbmRhcmQgb3IgaW52YWxpZCByZXNvdXJjZXMgYW5kIHByb3ZpZGVycy4KKyAqIDxwLz4KKyAqIFRoZSB0ZXN0cyBhcmUgY2hlY2tpbmcsIHRoYXQgdGhlIGZhaWx1cmUgKGlmIGV4cGVjdGVkKSB0YWtlcyBwbGFjZSBpbiB0aGUgZXhwZWN0ZWQgdGltZSAoZHVyaW5nIGRlcGxveW1lbnQsCisgKiBvciBvbiBmaXJzdCByZXF1ZXN0KS4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSdW5XaXRoKFN1aXRlLmNsYXNzKQorQFN1aXRlLlN1aXRlQ2xhc3Nlcyh7Tm9uUHVibGljTm9uU3RhdGljVGVzdC5Ob25TdGF0aWNSZXNvdXJjZVRlc3QuY2xhc3MsCisgICAgICAgIE5vblB1YmxpY05vblN0YXRpY1Rlc3QuTm9uU3RhdGljUmVzb3VyY2VTdWJSZXNvdXJjZVRlc3QuY2xhc3MsCisgICAgICAgIE5vblB1YmxpY05vblN0YXRpY1Rlc3QuTm9uUHVibGljUmVzb3VyY2VUZXN0LmNsYXNzLAorICAgICAgICBOb25QdWJsaWNOb25TdGF0aWNUZXN0Lk5vblB1YmxpY1Jlc291cmNlU3ViUmVzb3VyY2VUZXN0LmNsYXNzLAorICAgICAgICBOb25QdWJsaWNOb25TdGF0aWNUZXN0LkFic3RyYWN0UmVzb3VyY2VUZXN0LmNsYXNzLAorICAgICAgICBOb25QdWJsaWNOb25TdGF0aWNUZXN0LkFic3RyYWN0UmVzb3VyY2VTdWJSZXNvdXJjZVRlc3QuY2xhc3MsCisgICAgICAgIE5vblB1YmxpY05vblN0YXRpY1Rlc3QuSW50ZXJmYWNlUmVzb3VyY2VUZXN0LmNsYXNzLAorICAgICAgICBOb25QdWJsaWNOb25TdGF0aWNUZXN0LkludGVyZmFjZVJlc291cmNlU3ViUmVzb3VyY2VUZXN0LmNsYXNzLAorICAgICAgICBOb25QdWJsaWNOb25TdGF0aWNUZXN0Lk5vblB1YmxpY1Jlc291cmNlV2l0aENvbnN0cnVjdG9yVGVzdC5jbGFzcywKKyAgICAgICAgTm9uUHVibGljTm9uU3RhdGljVGVzdC5Ob25QdWJsaWNSZXNvdXJjZVN1YnJlc291cmNlV2l0aENvbnN0cnVjdG9yVGVzdC5jbGFzcywKKyAgICAgICAgTm9uUHVibGljTm9uU3RhdGljVGVzdC5QdWJsaWNSZXNvdXJjZVdpdGhQcml2YXRlQ29uc3RydWN0b3JUZXN0LmNsYXNzLAorICAgICAgICBOb25QdWJsaWNOb25TdGF0aWNUZXN0Lk5vblN0YXRpY1Byb3ZpZGVyVGVzdC5jbGFzcywKKyAgICAgICAgTm9uUHVibGljTm9uU3RhdGljVGVzdC5Ob25QdWJsaWNQcm92aWRlclRlc3QuY2xhc3MsCisgICAgICAgIE5vblB1YmxpY05vblN0YXRpY1Rlc3QuUHVibGljUHJvdmlkZXJXaXRoUHJpdmF0ZUNvbnN0cnVjdG9yVGVzdC5jbGFzc30pCitwdWJsaWMgY2xhc3MgTm9uUHVibGljTm9uU3RhdGljVGVzdCB7CisKKyAgICAvLyB2YXJpb3VzIHJlc291cmNlcyBhbmQgcHJvdmlkZXJzIGZvciB0aGUgdGVzdCBiZWxsb3cKKyAgICAvLyBhcyB3ZSBuZWVkIHRvIGNyZWF0ZSBhbmQgZGVwbG95IHNlcGFyYXRlIGFuZCBjdXN0b21pemVkIHJlc291cmNlQ29uZmlncyBmb3IgZWFjaCB0ZXN0IGNhc2UsCisgICAgLy8gdGhlIHRlc3RjYXNlcyBhcmUgZW5jYXBzdWxhdGVkIGluIGlubmVyLWNsYXNzZXMsIHdoaWNoIGFyZSBzdWJjbGFzc2VzIG9mIEplcnNleVRlc3QuCisgICAgLy8gVGhvc2UgcmVzb3VyY2VzIGFuZCBwcm92aWRlcnMgYXJlLCBob3dldmVyIGluIHRoZSBvdXR0ZXIgY2xhc3MgKGNhbiBiZSByZXVzZWQgaW5zaWRlIHJlc291cmNlIGNvbmZpZ3MpCisKKyAgICBAUGF0aCgiL25vbi1zdGF0aWMiKQorICAgIHB1YmxpYyBjbGFzcyBOb25TdGF0aWNSZXNvdXJjZSB7CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gIkhpIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvbm9uLXN0YXRpYy1zdWIiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTm9uU3RhdGljUmVzb3VyY2VTdWJSZXNvdXJjZSB7CisKKyAgICAgICAgQFBhdGgoImNsYXNzIikKKyAgICAgICAgcHVibGljIENsYXNzPE5vblN0YXRpY1Jlc291cmNlPiBnZXRDbGF6eigpIHsKKyAgICAgICAgICAgIHJldHVybiBOb25TdGF0aWNSZXNvdXJjZS5jbGFzczsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvbm9uLXB1YmxpYyIpCisgICAgc3RhdGljIGNsYXNzIE5vblB1YmxpY1Jlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICJoaSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL25vbi1wdWJsaWMtc3ViIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5vblB1YmxpY1Jlc291cmNlU3ViUmVzb3VyY2UgeworCisgICAgICAgIEBQYXRoKCJjbGFzcyIpCisgICAgICAgIHB1YmxpYyBDbGFzczxOb25QdWJsaWNSZXNvdXJjZT4gZ2V0Q2xhenooKSB7CisgICAgICAgICAgICByZXR1cm4gTm9uUHVibGljUmVzb3VyY2UuY2xhc3M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL2Fic3RyYWN0IikKKyAgICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIEFic3RyYWN0UmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gIkhpISI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiL2Fic3RyYWN0LXN1YiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBYnN0cmFjdFJlc291cmNlU3ViUmVzb3VyY2UgeworCisgICAgICAgIEBQYXRoKCJjbGFzcyIpCisgICAgICAgIHB1YmxpYyBDbGFzczxBYnN0cmFjdFJlc291cmNlPiBnZXRDbGF6eigpIHsKKyAgICAgICAgICAgIHJldHVybiBBYnN0cmFjdFJlc291cmNlLmNsYXNzOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoImludGVyZmFjZSIpCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgSW50ZXJmYWNlUmVzb3VyY2UgeworICAgIH0KKworICAgIEBQYXRoKCJpbnRlcmZhY2Utc3ViIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEludGVyZmFjZVJlc291cmNlU3ViUmVzb3VyY2UgeworCisgICAgICAgIEBQYXRoKCJjbGFzcyIpCisgICAgICAgIHB1YmxpYyBDbGFzczxJbnRlcmZhY2VSZXNvdXJjZT4gZ2V0Q2xhenooKSB7CisgICAgICAgICAgICByZXR1cm4gSW50ZXJmYWNlUmVzb3VyY2UuY2xhc3M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgibm9uLXB1YmxpYy13aXRoLWNvbnN0cnVjdG9yIikKKyAgICBzdGF0aWMgY2xhc3MgTm9uUHVibGljUmVzb3VyY2VXaXRoQ29uc3RydWN0b3IgeworCisgICAgICAgIHB1YmxpYyBOb25QdWJsaWNSZXNvdXJjZVdpdGhDb25zdHJ1Y3RvcigpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gIkhpISI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgibm9uLXB1YmxpYy1zdWItd2l0aC1jb25zdHJ1Y3RvciIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBOb25QdWJsaWNSZXNvdXJjZVN1YlJlc291cmNlV2l0aENvbnN0cnVjdG9yIHsKKworICAgICAgICBAUGF0aCgiY2xhc3MiKQorICAgICAgICBwdWJsaWMgQ2xhc3M8Tm9uUHVibGljUmVzb3VyY2VXaXRoQ29uc3RydWN0b3I+IGdldENsYXp6KCkgeworICAgICAgICAgICAgcmV0dXJuIE5vblB1YmxpY1Jlc291cmNlV2l0aENvbnN0cnVjdG9yLmNsYXNzOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInB1YmxpYy13aXRoLXByaXZhdGUtY29uc3RydWN0b3IiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHVibGljUmVzb3VyY2VXaXRoUHJpdmF0ZUNvbnN0cnVjdG9yIHsKKworICAgICAgICBwcml2YXRlIFB1YmxpY1Jlc291cmNlV2l0aFByaXZhdGVDb25zdHJ1Y3RvcigpIHsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gIkhpISI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgicHJvdmlkZXItcmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHJvdmlkZXJSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiAiSGkhIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIHB1YmxpYyBjbGFzcyBOb25TdGF0aWNQcm92aWRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5V3JpdGVyPFN0cmluZz4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlID09IFN0cmluZy5jbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKGZpbmFsIFN0cmluZyBzLCBmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oZmluYWwgU3RyaW5nIHMsIGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLCBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBlbnRpdHlTdHJlYW0ud3JpdGUocy5nZXRCeXRlcygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm92aWRlcgorICAgIHN0YXRpYyBjbGFzcyBOb25QdWJsaWNQcm92aWRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5V3JpdGVyPFN0cmluZz4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlID09IFN0cmluZy5jbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKGZpbmFsIFN0cmluZyBzLCBmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oZmluYWwgU3RyaW5nIHMsIGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLCBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgd3JhcHBlZCA9ICI+PiAiICsgcyArICIgPDwiOworICAgICAgICAgICAgZW50aXR5U3RyZWFtLndyaXRlKHdyYXBwZWQuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBzdGF0aWMgY2xhc3MgUHVibGljUHJvdmlkZXJXaXRoUHJpdmF0ZUNvbnN0cnVjdG9yIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8U3RyaW5nPiB7CisKKyAgICAgICAgcHJpdmF0ZSBQdWJsaWNQcm92aWRlcldpdGhQcml2YXRlQ29uc3RydWN0b3IoKSB7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSBTdHJpbmcuY2xhc3M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShmaW5hbCBTdHJpbmcgcywgZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIFN0cmluZyBzLCBmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgZW50aXR5U3RyZWFtLndyaXRlKHMuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvdmlkZXIKKyAgICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIEFic3RyYWN0UHJvdmlkZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVdyaXRlcjxTdHJpbmc+IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gdHlwZSA9PSBTdHJpbmcuY2xhc3M7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShmaW5hbCBTdHJpbmcgcywgZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIFN0cmluZyBzLCBmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgZW50aXR5U3RyZWFtLndyaXRlKHMuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJbm5lciB0ZXN0IGNsYXNzZXMgLSBlYWNoIG5lZWRlZCByZXNvdXJjZSBjb25maWcgdmFyaWF0aW9uIGhhcyBpdHMgb3duIGlubmVyIGNsYXNzCisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5vblN0YXRpY1Jlc291cmNlVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICAgICAgc2V0KFRlc3RQcm9wZXJ0aWVzLlJFQ09SRF9MT0dfTEVWRUwsIExldmVsLldBUk5JTkcuaW50VmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKE5vblN0YXRpY1Jlc291cmNlLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3ROb25TdGF0aWNSZXNvdXJjZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBMaXN0PExvZ1JlY29yZD4gbG9nZ2VkUmVjb3JkcyA9IGdldExvZ2dlZFJlY29yZHMoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gZmlyc3RGb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgYm9vbGVhbiBzZWNvbmRGb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChMb2dSZWNvcmQgcmVjb3JkIDogbG9nZ2VkUmVjb3JkcykgeworICAgICAgICAgICAgICAgIGlmIChyZWNvcmQuZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKCJjYW5ub3QgYmUgaW5zdGFudGlhdGVkIGFuZCB3aWxsIGJlIGlnbm9yZWQiKSkgeworICAgICAgICAgICAgICAgICAgICBmaXJzdEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC5nZXRNZXNzYWdlKCkuY29udGFpbnMoImlzIGVtcHR5LiBJdCBoYXMgbm8gcmVzb3VyY2UiKSkgeworICAgICAgICAgICAgICAgICAgICBzZWNvbmRGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChmaXJzdEZvdW5kICYmIHNlY29uZEZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFzc2VydFRydWUoIkV4cGVjdGVkIGxvZyBtZXNzYWdlICgxc3QpIHdhcyBub3QgZm91bmQuIiwgZmlyc3RGb3VuZCk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCBsb2cgbWVzc2FnZSAoMm5kKSB3YXMgbm90IGZvdW5kLiIsIHNlY29uZEZvdW5kKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTm9uU3RhdGljUmVzb3VyY2VTdWJSZXNvdXJjZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoTm9uU3RhdGljUmVzb3VyY2VTdWJSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdChleHBlY3RlZCA9IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24uY2xhc3MpCisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3ROb25TdGF0aWNSZXNvdXJjZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICB0YXJnZXQoKS5wYXRoKCIvbm9uLXN0YXRpYy1zdWIvY2xhc3MiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5vblB1YmxpY1Jlc291cmNlVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhOb25QdWJsaWNSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdChleHBlY3RlZCA9IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24uY2xhc3MpCisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3ROb25QdWJsaWNSZXNvdXJjZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICB0YXJnZXQoKS5wYXRoKCIvbm9uLXB1YmxpYyIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTm9uUHVibGljUmVzb3VyY2VTdWJSZXNvdXJjZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoTm9uUHVibGljUmVzb3VyY2VTdWJSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdChleHBlY3RlZCA9IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24uY2xhc3MpCisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3ROb25QdWJsaWNSZXNvdXJjZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICB0YXJnZXQoKS5wYXRoKCIvbm9uLXB1YmxpYy1zdWIvY2xhc3MiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFic3RyYWN0UmVzb3VyY2VUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgICAgICBzZXQoVGVzdFByb3BlcnRpZXMuUkVDT1JEX0xPR19MRVZFTCwgTGV2ZWwuV0FSTklORy5pbnRWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoQWJzdHJhY3RSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0QWJzdHJhY3RSZXNvdXJjZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBMaXN0PExvZ1JlY29yZD4gbG9nZ2VkUmVjb3JkcyA9IGdldExvZ2dlZFJlY29yZHMoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoTG9nUmVjb3JkIHJlY29yZCA6IGxvZ2dlZFJlY29yZHMpIHsKKyAgICAgICAgICAgICAgICBpZiAocmVjb3JkLmdldE1lc3NhZ2UoKS5jb250YWlucygiY2Fubm90IGJlIGluc3RhbnRpYXRlZCBhbmQgd2lsbCBiZSBpZ25vcmVkIikpIHsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCBsb2cgcmVjb3JkIHdhcyBub3QgZm91bmQuIiwgZm91bmQpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBYnN0cmFjdFJlc291cmNlU3ViUmVzb3VyY2VUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEFic3RyYWN0UmVzb3VyY2VTdWJSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdChleHBlY3RlZCA9IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24uY2xhc3MpCisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RBYnN0cmFjdFJlc291cmNlU3ViUmVzb3VyY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgdGFyZ2V0KCkucGF0aCgiYWJzdHJhY3Qtc3ViL2NsYXNzIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBJbnRlcmZhY2VSZXNvdXJjZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIHNldChUZXN0UHJvcGVydGllcy5SRUNPUkRfTE9HX0xFVkVMLCBMZXZlbC5XQVJOSU5HLmludFZhbHVlKCkpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhJbnRlcmZhY2VSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0SW50ZXJmYWNlUmVzb3VyY2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgZmluYWwgTGlzdDxMb2dSZWNvcmQ+IGxvZ2dlZFJlY29yZHMgPSBnZXRMb2dnZWRSZWNvcmRzKCk7CisgICAgICAgICAgICBib29sZWFuIGZpcnN0Rm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgIGJvb2xlYW4gc2Vjb25kRm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoTG9nUmVjb3JkIHJlY29yZCA6IGxvZ2dlZFJlY29yZHMpIHsKKyAgICAgICAgICAgICAgICBpZiAocmVjb3JkLmdldE1lc3NhZ2UoKS5jb250YWlucygiY2Fubm90IGJlIGluc3RhbnRpYXRlZCBhbmQgd2lsbCBiZSBpZ25vcmVkIikpIHsKKyAgICAgICAgICAgICAgICAgICAgZmlyc3RGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZWNvcmQuZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKCJpcyBlbXB0eS4gSXQgaGFzIG5vIHJlc291cmNlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgc2Vjb25kRm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZmlyc3RGb3VuZCAmJiBzZWNvbmRGb3VuZCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJFeHBlY3RlZCBsb2cgbWVzc2FnZSAoMXN0KSB3YXMgbm90IGZvdW5kLiIsIGZpcnN0Rm91bmQpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgbG9nIG1lc3NhZ2UgKDJuZCkgd2FzIG5vdCBmb3VuZC4iLCBzZWNvbmRGb3VuZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEludGVyZmFjZVJlc291cmNlU3ViUmVzb3VyY2VUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEludGVyZmFjZVJlc291cmNlU3ViUmVzb3VyY2UuY2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QoZXhwZWN0ZWQgPSBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uLmNsYXNzKQorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0SW50ZXJmYWNlUmVzb3VyY2VTdWJSZXNvdXJjZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICB0YXJnZXQoKS5wYXRoKCJpbnRlcmZhY2Utc3ViL2NsYXNzIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBOb25QdWJsaWNSZXNvdXJjZVdpdGhDb25zdHJ1Y3RvclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoTm9uUHVibGljUmVzb3VyY2VXaXRoQ29uc3RydWN0b3IuY2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QoZXhwZWN0ZWQgPSBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uLmNsYXNzKQorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uUHVibGljUmVzb3VyY2VXaXRoQ29uc3RydWN0b3IoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgdGFyZ2V0KCkucGF0aCgibm9uLXB1YmxpYy13aXRoLWNvbnN0cnVjdG9yIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBOb25QdWJsaWNSZXNvdXJjZVN1YnJlc291cmNlV2l0aENvbnN0cnVjdG9yVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhOb25QdWJsaWNSZXNvdXJjZVN1YlJlc291cmNlV2l0aENvbnN0cnVjdG9yLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0KGV4cGVjdGVkID0gSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbi5jbGFzcykKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdE5vblB1YmxpY1Jlc291cmNlU3ViUmVzb3VyY2VXaXRoQ29uc3RydWN0b3IoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgdGFyZ2V0KCkucGF0aCgibm9uLXB1YmxpYy1zdWItd2l0aC1jb25zdHJ1Y3Rvci9jbGFzcyIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUHVibGljUmVzb3VyY2VXaXRoUHJpdmF0ZUNvbnN0cnVjdG9yVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICAgICAgc2V0KFRlc3RQcm9wZXJ0aWVzLlJFQ09SRF9MT0dfTEVWRUwsIExldmVsLldBUk5JTkcuaW50VmFsdWUoKSk7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFB1YmxpY1Jlc291cmNlV2l0aFByaXZhdGVDb25zdHJ1Y3Rvci5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBAVGVzdChleHBlY3RlZCA9IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24uY2xhc3MpCisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3RQdWJsaWNSZXNvdXJjZVdpdGhQcml2YXRlQ29uc3RydWN0b3IoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgdGFyZ2V0KCkucGF0aCgicHVibGljLXdpdGgtcHJpdmF0ZS1jb25zdHJ1Y3RvciIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTm9uU3RhdGljUHJvdmlkZXJUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgICAgICBzZXQoVGVzdFByb3BlcnRpZXMuUkVDT1JEX0xPR19MRVZFTCwgTGV2ZWwuV0FSTklORy5pbnRWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUHJvdmlkZXJSZXNvdXJjZS5jbGFzcywgTm9uU3RhdGljUHJvdmlkZXIuY2xhc3MpOworICAgICAgICB9CisKKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdE5vblN0YXRpY1Byb3ZpZGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8TG9nUmVjb3JkPiBsb2dnZWRSZWNvcmRzID0gZ2V0TG9nZ2VkUmVjb3JkcygpOworICAgICAgICAgICAgYm9vbGVhbiBmb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChMb2dSZWNvcmQgcmVjb3JkIDogbG9nZ2VkUmVjb3JkcykgeworICAgICAgICAgICAgICAgIGlmIChyZWNvcmQuZ2V0TWVzc2FnZSgpLmNvbnRhaW5zKCJJbnN0YW50aWF0aW9uIG9mIG5vbi1zdGF0aWMgbWVtYmVyIGNsYXNzZXMgaXMgbm90IHN1cHBvcnRlZCIpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgbG9nIHJlY29yZCB3YXMgbm90IGZvdW5kLiIsIGZvdW5kKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTm9uUHVibGljUHJvdmlkZXJUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFByb3ZpZGVyUmVzb3VyY2UuY2xhc3MsIE5vblB1YmxpY1Byb3ZpZGVyLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3ROb25QdWJsaWNQcm92aWRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAvLyBOT1RFOiBIdHRwVXJsQ29ubmVjdG9yIHNlbmRzIHNldmVyYWwgYWNjZXB0ZWQgdHlwZXMgYnkgZGVmYXVsdCB3aGVuIG5vdCBleHBsaWNpdGx5IHNldCBieSB0aGUgY2FsbGVyLgorICAgICAgICAgICAgLy8gSW4gc3VjaCBjYXNlLCB0aGUgLmFjY2VwdCgidGV4dC9odG1sIikgY2FsbCBpcyBub3QgbmVjZXNzYXJ5LiBIb3dldmVyLCBvdGhlciBjb25uZWN0b3JzIGFjdCBpbiBhIGRpZmZlcmVudCB3YXkgYW5kCisgICAgICAgICAgICAvLyB0aGlzIGxlYWRzIGluIGRpZmZlcmVudCBiZWhhdmlvdXIgd2hlbiBzZWxlY3RpbmcgdGhlIE1lc3NhZ2VCb2R5V3JpdGVyLiBMZWF2aW5nIHRoZSBkZWZpbml0aW9uIGV4cGxpY2l0IGZvciBicm9hZGVyCisgICAgICAgICAgICAvLyBjb21wYXRpYmlsaXR5LgorICAgICAgICAgICAgZmluYWwgU3RyaW5nIHMgPSB0YXJnZXQoKS5wYXRoKCJwcm92aWRlci1yZXNvdXJjZSIpLnJlcXVlc3QoInRleHQvaHRtbCIpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCI+PiBIaSEgPDwiLCBzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIE5PVEUgLSB0aGUgb3JpZ2luYWwgSmVyc2V5IDEgdGVzdCBub25QdWJsaWNQcm92aWRlcldpdGhDb25zdHJ1Y3RvciBkb2VzIG5vdCBtYWtlIHNlbnNlIGNvbnNpZGVyaW5nIHRoYXQgaXQgd29ya3MgZXZlbgorICAgIC8vIHcvbyBjb25zdHJ1Y3RvcgorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQdWJsaWNQcm92aWRlcldpdGhQcml2YXRlQ29uc3RydWN0b3JUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgICAgICBzZXQoVGVzdFByb3BlcnRpZXMuUkVDT1JEX0xPR19MRVZFTCwgTGV2ZWwuV0FSTklORy5pbnRWYWx1ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUHJvdmlkZXJSZXNvdXJjZS5jbGFzcywgUHVibGljUHJvdmlkZXJXaXRoUHJpdmF0ZUNvbnN0cnVjdG9yLmNsYXNzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBUZXN0CisgICAgICAgIHB1YmxpYyB2b2lkIHRlc3ROb25QdWJsaWNQcm92aWRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBmaW5hbCBMaXN0PExvZ1JlY29yZD4gbG9nZ2VkUmVjb3JkcyA9IGdldExvZ2dlZFJlY29yZHMoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gZm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoTG9nUmVjb3JkIHJlY29yZCA6IGxvZ2dlZFJlY29yZHMpIHsKKyAgICAgICAgICAgICAgICBpZiAocmVjb3JkLmdldE1lc3NhZ2UoKS5jb250YWlucygiQ291bGQgbm90IGZpbmQgYSBzdWl0YWJsZSBjb25zdHJ1Y3RvciIpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRXhwZWN0ZWQgbG9nIHJlY29yZCB3YXMgbm90IGZvdW5kLiIsIGZvdW5kKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGFic3RyYWN0IHByb3ZpZGVyIC0gdGhyb3dzIE11bHRpRXhjZXB0aW9uIGFmdGVyIGNhbGxpbmcgY29uZmlndXJlKCksIGJ1dCBiZWZvcmUgcnVubmluZyB0aGUgQFRlc3QgbWV0aG9kCisgICAgLy8gdGhlIHNhbWUgZm9yIGludGVyZmFjZSBwcm92aWRlciB0ZXN0CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vUHJvdmlkZXJzTGVnYWN5T3JkZXJpbmdUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL1Byb3ZpZGVyc0xlZ2FjeU9yZGVyaW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMmRjODgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL1Byb3ZpZGVyc0xlZ2FjeU9yZGVyaW5nVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTQzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb247CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuTWVzc2FnZUJvZHlXb3JrZXJzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuTWVzc2FnZVByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5NZWRpYVR5cGVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFByb3ZpZGVyc0xlZ2FjeU9yZGVyaW5nVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi94bWwiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlNQlc1IGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8T2JqZWN0PiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldFNpemUoT2JqZWN0IG15VHlwZSwgQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbyhPYmplY3QgbXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uLyoiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlNQlc2IGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8T2JqZWN0PiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldFNpemUoT2JqZWN0IG15VHlwZSwgQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbyhPYmplY3QgbXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVJlc291cmNlIHsKKworICAgICAgICBAQ29udGV4dAorICAgICAgICBNZXNzYWdlQm9keVdvcmtlcnMgbWVzc2FnZUJvZHlXb3JrZXJzOworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRNeVR5cGUoKSB7CisKKyAgICAgICAgICAgIGZpbmFsIE1hcDxNZWRpYVR5cGUsIExpc3Q8TWVzc2FnZUJvZHlXcml0ZXI+PiB3cml0ZXJzID0gbWVzc2FnZUJvZHlXb3JrZXJzLmdldFdyaXRlcnMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTF9UWVBFKTsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8TWVzc2FnZUJvZHlXcml0ZXI+IG1lc3NhZ2VCb2R5V3JpdGVyczEgPSB3cml0ZXJzLmdldChNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MX1RZUEUpOworICAgICAgICAgICAgZmluYWwgTGlzdDxNZXNzYWdlQm9keVdyaXRlcj4gbWVzc2FnZUJvZHlXcml0ZXJzMiA9IHdyaXRlcnMKKyAgICAgICAgICAgICAgICAgICAgLmdldChNZWRpYVR5cGVzLmdldFR5cGVXaWxkQ2FydChNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MX1RZUEUpKTsKKworICAgICAgICAgICAgLy8gY3VzdG9tIHByb3ZpZGVyIGhhcyBwcmlvcml0eSAtIGl0IGhhcyB0byBiZSBmaXJzdAorICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlQm9keVdyaXRlcnMxLmdldCgwKSBpbnN0YW5jZW9mIE15TUJXNSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKG1lc3NhZ2VCb2R5V3JpdGVyczIuZ2V0KDApIGluc3RhbmNlb2YgTXlNQlc2KTsKKworICAgICAgICAgICAgcmV0dXJuICIiOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoTXlSZXNvdXJjZS5jbGFzcywgTXlNQlc1LmNsYXNzLCBNeU1CVzYuY2xhc3MpOworICAgICAgICByZXNvdXJjZUNvbmZpZy5wcm9wZXJ0eShNZXNzYWdlUHJvcGVydGllcy5MRUdBQ1lfV09SS0VSU19PUkRFUklORywgdHJ1ZSk7CisgICAgICAgIHJldHVybiByZXNvdXJjZUNvbmZpZzsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIG9yZGVyaW5nVGVzdCgpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgiYXBwbGljYXRpb24vdGVzdDEiKS5nZXQoUmVzcG9uc2UuY2xhc3MpOworCisgICAgICAgICAgICBhc3NlcnROb3ROdWxsKHJlc3BvbnNlKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiUmVxdWVzdCB3YXMgbm90IGhhbmRsZWQgY29ycmVjdGx5LCBtb3N0IGxpa2VseSBmYXVsdCBpbiBNZXNzYWdlQm9keVdvcmtlciBzZWxlY3Rpb24uIiwKKyAgICAgICAgICAgICAgICAgICAgMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBmYWlsKCJSZXF1ZXN0IHdhcyBub3QgaGFuZGxlZCBjb3JyZWN0bHksIG1vc3QgbGlrZWx5IGZhdWx0IGluIE1lc3NhZ2VCb2R5V29ya2VyIHNlbGVjdGlvbi4iKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vUHJvdmlkZXJzT3JkZXJpbmdUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL1Byb3ZpZGVyc09yZGVyaW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNWI3NDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL1Byb3ZpZGVyc09yZGVyaW5nVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb247CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QVVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLk1lc3NhZ2VCb2R5V29ya2VyczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLkFic3RyYWN0TWVzc2FnZVJlYWRlcldyaXRlclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFByb3ZpZGVyc09yZGVyaW5nVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVR5cGUgeworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlUeXBlRXh0IGV4dGVuZHMgTXlUeXBlIHsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15VHlwZUV4dEV4dCBleHRlbmRzIE15VHlwZUV4dCB7CisgICAgfQorCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi90ZXN0MSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeU1CVzEgaW1wbGVtZW50cyBNZXNzYWdlQm9keVdyaXRlcjxNeVR5cGU+IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8Q2xhc3M8Pz4+IGNhbGxMaXN0OworCisgICAgICAgIHB1YmxpYyBNeU1CVzEoTGlzdDxDbGFzczw/Pj4gY2FsbExpc3QpIHsKKyAgICAgICAgICAgIHRoaXMuY2FsbExpc3QgPSBjYWxsTGlzdDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIGNhbGxMaXN0LmFkZCh0aGlzLmdldENsYXNzKCkpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldFNpemUoTXlUeXBlIG15VHlwZSwgQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbyhNeVR5cGUgbXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uLyoiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlNQlcyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8TXlUeXBlPiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PENsYXNzPD8+PiBjYWxsTGlzdDsKKworICAgICAgICBwdWJsaWMgTXlNQlcyKExpc3Q8Q2xhc3M8Pz4+IGNhbGxMaXN0KSB7CisgICAgICAgICAgICB0aGlzLmNhbGxMaXN0ID0gY2FsbExpc3Q7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICBjYWxsTGlzdC5hZGQodGhpcy5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKE15VHlwZSBteVR5cGUsIENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oTXlUeXBlIG15VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICB9CisgICAgfQorCisgICAgQFByb2R1Y2VzKCIqLyoiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlNQlczIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8TXlUeXBlPiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaXN0PENsYXNzPD8+PiBjYWxsTGlzdDsKKworICAgICAgICBwdWJsaWMgTXlNQlczKExpc3Q8Q2xhc3M8Pz4+IGNhbGxMaXN0KSB7CisgICAgICAgICAgICB0aGlzLmNhbGxMaXN0ID0gY2FsbExpc3Q7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICBjYWxsTGlzdC5hZGQodGhpcy5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldFNpemUoTXlUeXBlIG15VHlwZSwgQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbyhNeVR5cGUgbXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICBlbnRpdHlTdHJlYW0ud3JpdGUoInRlc3QiLmdldEJ5dGVzKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi8qIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15TUJXNCBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5V3JpdGVyPE15VHlwZUV4dD4geworCisgICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxDbGFzczw/Pj4gY2FsbExpc3Q7CisKKyAgICAgICAgcHVibGljIE15TUJXNChMaXN0PENsYXNzPD8+PiBjYWxsTGlzdCkgeworICAgICAgICAgICAgdGhpcy5jYWxsTGlzdCA9IGNhbGxMaXN0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgY2FsbExpc3QuYWRkKHRoaXMuZ2V0Q2xhc3MoKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShNeVR5cGVFeHQgbXlUeXBlLCBDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKE15VHlwZUV4dCBteVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcm9kdWNlcygiYXBwbGljYXRpb24veG1sIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15TUJXNSBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5V3JpdGVyPE9iamVjdD4geworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKE9iamVjdCBteVR5cGUsIENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oT2JqZWN0IG15VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICB9CisgICAgfQorCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi90ZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15TUJSMSBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5UmVhZGVyPE15VHlwZT4geworCisgICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxDbGFzczw/Pj4gY2FsbExpc3Q7CisKKyAgICAgICAgcHVibGljIE15TUJSMShMaXN0PENsYXNzPD8+PiBjYWxsTGlzdCkgeworICAgICAgICAgICAgdGhpcy5jYWxsTGlzdCA9IGNhbGxMaXN0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICBjYWxsTGlzdC5hZGQodGhpcy5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTXlUeXBlIHJlYWRGcm9tKENsYXNzPE15VHlwZT4gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL3Rlc3QxIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15TUJSMiBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5UmVhZGVyPE15VHlwZUV4dD4geworCisgICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxDbGFzczw/Pj4gY2FsbExpc3Q7CisKKyAgICAgICAgcHVibGljIE15TUJSMihMaXN0PENsYXNzPD8+PiBjYWxsTGlzdCkgeworICAgICAgICAgICAgdGhpcy5jYWxsTGlzdCA9IGNhbGxMaXN0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICBjYWxsTGlzdC5hZGQodGhpcy5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTXlUeXBlRXh0IHJlYWRGcm9tKENsYXNzPE15VHlwZUV4dD4gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAQ29uc3VtZXMoImFwcGxpY2F0aW9uL3Rlc3QxIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15TUJSMyBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5UmVhZGVyPE15VHlwZUV4dEV4dD4geworCisgICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxDbGFzczw/Pj4gY2FsbExpc3Q7CisKKyAgICAgICAgcHVibGljIE15TUJSMyhMaXN0PENsYXNzPD8+PiBjYWxsTGlzdCkgeworICAgICAgICAgICAgdGhpcy5jYWxsTGlzdCA9IGNhbGxMaXN0OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICBjYWxsTGlzdC5hZGQodGhpcy5nZXRDbGFzcygpKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBNeVR5cGVFeHRFeHQgcmVhZEZyb20oQ2xhc3M8TXlUeXBlRXh0RXh0PiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE15VHlwZUV4dEV4dCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlSZXNvdXJjZSB7CisKKyAgICAgICAgQENvbnRleHQKKyAgICAgICAgTWVzc2FnZUJvZHlXb3JrZXJzIG1lc3NhZ2VCb2R5V29ya2VyczsKKworICAgICAgICBAUFVUCisgICAgICAgIEBDb25zdW1lcygiYXBwbGljYXRpb24vdGVzdDEiKQorICAgICAgICBwdWJsaWMgTXlUeXBlIGdldE15VHlwZShNeVR5cGVFeHRFeHQgbXlUeXBlKSB7CisKKyAgICAgICAgICAgIGZpbmFsIE1hcDxNZWRpYVR5cGUsIExpc3Q8TWVzc2FnZUJvZHlXcml0ZXI+PiB3cml0ZXJzID0gbWVzc2FnZUJvZHlXb3JrZXJzLmdldFdyaXRlcnMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTF9UWVBFKTsKKyAgICAgICAgICAgIGZpbmFsIExpc3Q8TWVzc2FnZUJvZHlXcml0ZXI+IG1lc3NhZ2VCb2R5V3JpdGVycyA9IHdyaXRlcnMuZ2V0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUxfVFlQRSk7CisKKyAgICAgICAgICAgIGFzc2VydFRydWUobWVzc2FnZUJvZHlXcml0ZXJzLmdldCgwKSBpbnN0YW5jZW9mIE15TUJXNSk7CisKKyAgICAgICAgICAgIHJldHVybiBteVR5cGU7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiYnl0ZWFycmF5IikKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIGJ5dGVbXSBieXRlYXJyYXkoYnl0ZVtdIGJ5dGVzKSB7CisgICAgICAgICAgICByZXR1cm4gYnl0ZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIExpc3Q8Q2xhc3M8Pz4+IGNhbGxMaXN0OworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgY2FsbExpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhNeVJlc291cmNlLmNsYXNzLCBNeU1CVzUuY2xhc3MpOworICAgICAgICByZXNvdXJjZUNvbmZpZy5yZWdpc3Rlckluc3RhbmNlcyhuZXcgTXlNQlcxKGNhbGxMaXN0KSwgbmV3IE15TUJXMihjYWxsTGlzdCksIG5ldyBNeU1CVzMoY2FsbExpc3QpLCBuZXcgTXlNQlc0KGNhbGxMaXN0KSwKKyAgICAgICAgICAgICAgICBuZXcgTXlNQlIxKGNhbGxMaXN0KSwgbmV3IE15TUJSMihjYWxsTGlzdCksIG5ldyBNeU1CUjMoY2FsbExpc3QpLCBuZXcgTXlCeXRlQXJyYXlQcm92aWRlcigpKTsKKyAgICAgICAgcmV0dXJuIHJlc291cmNlQ29uZmlnOworICAgIH0KKworICAgIEBUZXN0CisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIHZvaWQgb3JkZXJpbmdUZXN0KCkgeworICAgICAgICBjYWxsTGlzdC5jbGVhcigpOworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoImFwcGxpY2F0aW9uL3Rlc3QxIikKKyAgICAgICAgICAgICAgICAgICAgLnB1dChFbnRpdHkuZW50aXR5KCJ0ZXN0IiwgImFwcGxpY2F0aW9uL3Rlc3QxIiksIFJlc3BvbnNlLmNsYXNzKTsKKworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChyZXNwb25zZSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlJlcXVlc3Qgd2FzIG5vdCBoYW5kbGVkIGNvcnJlY3RseSwgbW9zdCBsaWtlbHkgZmF1bHQgaW4gTWVzc2FnZUJvZHlXb3JrZXIgc2VsZWN0aW9uLiIsCisgICAgICAgICAgICAgICAgICAgIDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKGUuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICBmYWlsKCJSZXF1ZXN0IHdhcyBub3QgaGFuZGxlZCBjb3JyZWN0bHksIG1vc3QgbGlrZWx5IGZhdWx0IGluIE1lc3NhZ2VCb2R5V29ya2VyIHNlbGVjdGlvbi4iKTsKKyAgICAgICAgfQorCisgICAgICAgIExpc3Q8Q2xhc3M8Pz4+IGNsYXNzZXMgPSBBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgICAgIE15TUJSMy5jbGFzcywgLy8gTUJSIC0gc21hbGxlc3QgdHlwZSBkaXN0YW5jZSAoTUJSMSBhbmQgTUJSMiBhcmUgbm90IGNhbGxlZCBiZWNhdXNlIG9mIHRoYXQpCisgICAgICAgICAgICAgICAgTXlNQlc0LmNsYXNzLCAvLyBNQlcgLSB0eXBlIGRpc3RhbmNlCisgICAgICAgICAgICAgICAgTXlNQlcxLmNsYXNzLCAvLyBNQlcgLSBtb3N0IHNwZWNpZmljIG1lZGlhIHR5cGUgYXBwbGljYXRpb24vdGVzdDEKKyAgICAgICAgICAgICAgICBNeU1CVzIuY2xhc3MsIC8vIE1CVyAtIGFwcGxpY2F0aW9uLyoKKyAgICAgICAgICAgICAgICBNeU1CVzMuY2xhc3MgIC8vIE1CVyAtICovKiwgZmlyc3QgdXNhYmxlIHdyaXRlciAocmV0dXJucyB0cnVlIHRvIGlzV3JpdGVhYmxlIGNhbGwpCisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGNsYXNzZXMsIGNhbGxMaXN0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHJlcGxhY2VCdWlsdEluUHJvdmlkZXIoKSB7CisgICAgICAgIGNhbGxMaXN0LmNsZWFyKCk7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoImJ5dGVhcnJheSIpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkudGV4dCgicmVwbGFjZUJ1aWx0SW5Qcm92aWRlciIpLCBSZXNwb25zZS5jbGFzcyk7CisKKyAgICAgICAgICAgIGFzc2VydE5vdE51bGwocmVzcG9uc2UpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJSZXF1ZXN0IHdhcyBub3QgaGFuZGxlZCBjb3JyZWN0bHksIG1vc3QgbGlrZWx5IGZhdWx0IGluIE1lc3NhZ2VCb2R5V29ya2VyIHNlbGVjdGlvbi4iLAorICAgICAgICAgICAgICAgICAgICAyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbihlLmdldE1lc3NhZ2UoKSk7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgZmFpbCgiUmVxdWVzdCB3YXMgbm90IGhhbmRsZWQgY29ycmVjdGx5LCBtb3N0IGxpa2VseSBmYXVsdCBpbiBNZXNzYWdlQm9keVdvcmtlciBzZWxlY3Rpb24uIik7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRUcnVlKE15Qnl0ZUFycmF5UHJvdmlkZXIuY291bnRlciA9PSAyKTsgLy8gdXNlZCB0byByZWFkIGFuZCB3cml0ZSBlbnRpdHkgb24gc2VydmVyIHNpZGUuCisKKyAgICB9CisKKyAgICBAUHJvZHVjZXMoeyJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iLCAiKi8qIn0pCisgICAgQENvbnN1bWVzKHsiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIiwgIiovKiJ9KQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgTXlCeXRlQXJyYXlQcm92aWRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVJlYWRlcldyaXRlclByb3ZpZGVyPGJ5dGVbXT4geworCisgICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGNvdW50ZXIgPSAwOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlYWRhYmxlKENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gYnl0ZVtdLmNsYXNzOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBieXRlW10gcmVhZEZyb20oCisgICAgICAgICAgICAgICAgQ2xhc3M8Ynl0ZVtdPiB0eXBlLAorICAgICAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgQW5ub3RhdGlvbiBhbm5vdGF0aW9uc1tdLAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICB3cml0ZVRvKGVudGl0eVN0cmVhbSwgb3V0KTsKKyAgICAgICAgICAgIGNvdW50ZXIrKzsKKyAgICAgICAgICAgIHJldHVybiBvdXQudG9CeXRlQXJyYXkoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0eXBlID09IGJ5dGVbXS5jbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKAorICAgICAgICAgICAgICAgIGJ5dGVbXSB0LAorICAgICAgICAgICAgICAgIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICBBbm5vdGF0aW9uIGFubm90YXRpb25zW10sCisgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGNvdW50ZXIrKzsKKyAgICAgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZSh0KTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKGJ5dGVbXSB0LCBDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgICAgIHJldHVybiB0Lmxlbmd0aDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vUXVlcnlQYXJhbUVuY29kaW5nVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9RdWVyeVBhcmFtRW5jb2RpbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU5OTFkOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vUXVlcnlQYXJhbUVuY29kaW5nVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkVuY29kZWQ7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKgorICovCitwdWJsaWMgY2xhc3MgUXVlcnlQYXJhbUVuY29kaW5nVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoVGVzdFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAUGF0aCgicmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgVGVzdFJlc291cmNlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiZW5jb2RlZCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RlZChARW5jb2RlZCBAUXVlcnlQYXJhbSgicXVlcnkiKSBTdHJpbmcgcXVlcnlQYXJhbSkgeworICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5UGFyYW0uZXF1YWxzKCIlMjVkdW1teTIzJTJCYSIpICsgIjoiICsgcXVlcnlQYXJhbTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImRlY29kZWQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlY29kZWQoQFF1ZXJ5UGFyYW0oInF1ZXJ5IikgU3RyaW5nIHF1ZXJ5UGFyYW0pIHsKKyAgICAgICAgICAgIHJldHVybiBxdWVyeVBhcmFtLmVxdWFscygiJWR1bW15MjMrYSIpICsgIjoiICsgcXVlcnlQYXJhbTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVuY29kZWQoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UvZW5jb2RlZCIpLnF1ZXJ5UGFyYW0oInF1ZXJ5IiwgIiVkdW1teTIzK2EiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInRydWU6JTI1ZHVtbXkyMyUyQmEiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdERlY29kZWQoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UvZGVjb2RlZCIpLnF1ZXJ5UGFyYW0oInF1ZXJ5IiwgIiVkdW1teTIzK2EiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInRydWU6JWR1bW15MjMrYSIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9SZWFkZXJQcm92aWRlclRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vUmVhZGVyUHJvdmlkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIzOTJiY2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL1JlYWRlclByb3ZpZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb247CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5SZWFkZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworCisvKioKKyAqIFRlc3Rpbmcge0BsaW5rIFJlYWRlcn0gb24gY2xpZW50IGFuZCBzZXJ2ZXIuCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitwdWJsaWMgY2xhc3MgUmVhZGVyUHJvdmlkZXJUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBHRVRfUkVBREVSX1JFU1BPTlNFID0gIkdFVF9SRUFERVJfUkVTUE9OU0UiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEdFVF9QT1NUX1JFU1BPTlNFID0gIkdFVF9QT1NUX1JFU1BPTlNFIjsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVhZGVyUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlYWRlcigpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0L3Bvc3RSZWFkZXJHZXRSZWFkZXIiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KEdFVF9QT1NUX1JFU1BPTlNFLAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZS5URVhUX1BMQUlOKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEdFVF9QT1NUX1JFU1BPTlNFLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFJlYWRlcigpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0L2dldFJlYWRlciIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoR0VUX1JFQURFUl9SRVNQT05TRSwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eVJlYWRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgidGVzdC9nZXRFbXB0eSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwNCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBmaW5hbCBSZWFkZXIgcmVhZGVyID0gcmVzcG9uc2UucmVhZEVudGl0eShSZWFkZXIuY2xhc3MpOworICAgICAgICBhc3NlcnROb3ROdWxsKHJlYWRlcik7CisgICAgICAgIGFzc2VydEVxdWFscygtMSwgcmVhZGVyLnJlYWQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVhZGVyT25DbGllbnRBc1Jlc3BvbnNlRW50aXR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0L2dldFJlYWRlciIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBmaW5hbCBSZWFkZXIgcmVhZGVyID0gcmVzcG9uc2UucmVhZEVudGl0eShSZWFkZXIuY2xhc3MpOworICAgICAgICBhc3NlcnROb3ROdWxsKHJlYWRlcik7CisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIGJyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKHJlYWRlcik7CisgICAgICAgIGFzc2VydEVxdWFscyhHRVRfUkVBREVSX1JFU1BPTlNFLCBici5yZWFkTGluZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWFkZXJPbkNsaWVudEFzUmVxdWVzdEVudGl0eSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgidGVzdC9wb3N0UmVhZGVyR2V0UmVhZGVyIikucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eShuZXcgU3RyaW5nUmVhZGVyKEdFVF9QT1NUX1JFU1BPTlNFKSwgTWVkaWFUeXBlLlRFWFRfUExBSU4pKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoR0VUX1BPU1RfUkVTUE9OU0UsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFBhdGgoInRlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVhZGVyUmVzb3VyY2UgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIEBQYXRoKCJwb3N0UmVhZGVyR2V0UmVhZGVyIikKKyAgICAgICAgcHVibGljIFJlYWRlciBwb3N0UmVhZGVyKFJlYWRlciByZWFkZXIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gcmVhZGVyOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiZ2V0UmVhZGVyIikKKyAgICAgICAgcHVibGljIFJlYWRlciBnZXRSZWFkZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdSZWFkZXIoR0VUX1JFQURFUl9SRVNQT05TRSk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJnZXRFbXB0eSIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0ZW1wdHlSZXNwb25zZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vUmVxdWVzdFNjb3BlVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9SZXF1ZXN0U2NvcGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlhMDNmMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vUmVxdWVzdFNjb3BlVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb247CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQWJzdHJhY3RCaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkRpc3Bvc2FibGVTdXBwbGllcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLmludGVybmFsLlJlcXVlc3RTY29wZWQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBFMkUgUmVxdWVzdCBTY29wZSBUZXN0cy4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQElnbm9yZSgiVGVzdCBTdXBwbGllciBJbmplY3Rpb24gLT4gdGhpcyB0ZXN0IHJlcXVpcmUgZGlzcG9zZSgpIG1ldGhvZCBmcm9tIEZhY3RvcnkiKQorcHVibGljIGNsYXNzIFJlcXVlc3RTY29wZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVtb3ZlUmVzb3VyY2UuY2xhc3MpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKG5ldyBBYnN0cmFjdEJpbmRlcigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRGYWN0b3J5KENsb3NlTWVGYWN0b3J5LmNsYXNzLCBSZXF1ZXN0U2NvcGVkLmNsYXNzKS50byhDbG9zZU1lLmNsYXNzKS5pbihSZXF1ZXN0U2NvcGVkLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyBpbnRlcmZhY2UgQ2xvc2VNZSB7CisKKyAgICAgICAgU3RyaW5nIGV2YWwoKTsKKworICAgICAgICB2b2lkIGNsb3NlKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBDbG9zZU1lRmFjdG9yeSBpbXBsZW1lbnRzIERpc3Bvc2FibGVTdXBwbGllcjxDbG9zZU1lPiB7CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ291bnREb3duTGF0Y2ggQ0xPU0VEX0xBVENIID0gbmV3IENvdW50RG93bkxhdGNoKDEpOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ2xvc2VNZSBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IENsb3NlTWUoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBldmFsKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gImZvbyI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB7CisgICAgICAgICAgICAgICAgICAgIENMT1NFRF9MQVRDSC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoZmluYWwgQ2xvc2VNZSBpbnN0YW5jZSkgeworICAgICAgICAgICAgaW5zdGFuY2UuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJyZW1vdmUiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVtb3ZlUmVzb3VyY2UgeworCisgICAgICAgIHByaXZhdGUgQ2xvc2VNZSBjbG9zZU1lOworCisgICAgICAgIEBJbmplY3QKKyAgICAgICAgcHVibGljIFJlbW92ZVJlc291cmNlKGZpbmFsIENsb3NlTWUgY2xvc2VNZSkgeworICAgICAgICAgICAgdGhpcy5jbG9zZU1lID0gY2xvc2VNZTsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gY2xvc2VNZS5ldmFsKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoYXQgRmFjdG9yeS5kaXNwb3NlIG1ldGhvZCBpcyBjYWxsZWQgZHVyaW5nIHJlbGVhc2Ugb2YgUmVxdWVzdCBTY29wZS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZW1vdmUiKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBpcygiZm9vIikpOworCisgICAgICAgIGFzc2VydFRydWUoQ2xvc2VNZUZhY3RvcnkuQ0xPU0VEX0xBVENILmF3YWl0KDMsIFRpbWVVbml0LlNFQ09ORFMpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL1Jlc3BvbnNlTGlua3NUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL1Jlc3BvbnNlTGlua3NUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQxYjNhYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vUmVzcG9uc2VMaW5rc1Rlc3QuamF2YQpAQCAtMCwwICsxLDEyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTGluazsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBAYXV0aG9yIExpYm9yIEthbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNwb25zZUxpbmtzVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQFBhdGgoIi90ZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15UmVzb3VyY2UgeworCisgICAgICAgIEBDb250ZXh0CisgICAgICAgIHByaXZhdGUgVXJpSW5mbyB1cmlJbmZvOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXByb2R1Y2VyIGZvciBKRVJTRVktMjE2OAorICAgICAgICAgKi8KKyAgICAgICAgQFBhdGgoIjEiKQorICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcyh7TWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT059KQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0TGluaygpIHsKKyAgICAgICAgICAgIFVSSSBsaW5rID0gdXJpSW5mby5nZXRBYnNvbHV0ZVBhdGhCdWlsZGVyKCkucXVlcnlQYXJhbSgibGltaXQiLCA1MCkuYnVpbGQoKTsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoUmVzcG9uc2UuU3RhdHVzLk9LKS5saW5rKGxpbmssICJwcmV2IikuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXByb2R1Y2VyIGZvciBKRVJTRVktMjE2OAorICAgICAgICAgKi8KKyAgICAgICAgQFBhdGgoIjIiKQorICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcyh7TWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT059KQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0TGlua3MoKSB7CisgICAgICAgICAgICBMaW5rIGxpbmsxID0gTGluay5mcm9tVXJpKHVyaUluZm8uZ2V0QWJzb2x1dGVQYXRoQnVpbGRlcigpLnF1ZXJ5UGFyYW0oImxpbWl0IiwgNTApLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgICAgIC5yZWwoInByZXYiKS5idWlsZCgpOworICAgICAgICAgICAgTGluayBsaW5rMiA9IExpbmsuZnJvbVVyaSgKKyAgICAgICAgICAgICAgICAgICAgdXJpSW5mby5nZXRBYnNvbHV0ZVBhdGhCdWlsZGVyKCkucXVlcnlQYXJhbSgibGltaXQiLCA1MCkucXVlcnlQYXJhbSgiYWN0aW9uIiwgIm5leHQiKS5idWlsZCgpKS5yZWwoIm5leHQiKQorICAgICAgICAgICAgICAgICAgICAudGl0bGUoIm5leHQgcGFnZSIpLmJ1aWxkKCk7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKFJlc3BvbnNlLlN0YXR1cy5PSykubGlua3MobGluazEsIGxpbmsyKS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoTXlSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVyKExvZ2dpbmdGZWF0dXJlLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIHJlc291cmNlQ29uZmlnOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIHN1cGVyLmNvbmZpZ3VyZUNsaWVudChjb25maWcpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJvZHVjZXIgZm9yIEpFUlNFWS0yMTY4CisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0TGluaygpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgidGVzdCIpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5wYXRoKCIxIikucmVxdWVzdChNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikuZ2V0KCk7CisgICAgICAgIFNldDxMaW5rPiBsaW5rcyA9IHJlc3BvbnNlLmdldExpbmtzKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgbGlua3Muc2l6ZSgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwocmVzcG9uc2UuZ2V0TGluaygicHJldiIpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocmVzcG9uc2UuZ2V0TGluaygicHJldiIpLmdldFVyaSgpLnRvU3RyaW5nKCkuZW5kc1dpdGgoIjE/bGltaXQ9NTAiKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcm9kdWNlciBmb3IgSkVSU0VZLTIxNjgKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRMaW5rcygpIHsKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgidGVzdCIpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5wYXRoKCIyIikucmVxdWVzdChNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikuZ2V0KCk7CisgICAgICAgIFNldDxMaW5rPiBsaW5rcyA9IHJlc3BvbnNlLmdldExpbmtzKCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbGlua3Muc2l6ZSgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwocmVzcG9uc2UuZ2V0TGluaygicHJldiIpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocmVzcG9uc2UuZ2V0TGluaygicHJldiIpLmdldFVyaSgpLnRvU3RyaW5nKCkuZW5kc1dpdGgoIjI/bGltaXQ9NTAiKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKHJlc3BvbnNlLmdldExpbmsoIm5leHQiKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIm5leHQgcGFnZSIsIHJlc3BvbnNlLmdldExpbmsoIm5leHQiKS5nZXRUaXRsZSgpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUocmVzcG9uc2UuZ2V0TGluaygibmV4dCIpLmdldFVyaSgpLnRvU3RyaW5nKCkuZW5kc1dpdGgoIjI/bGltaXQ9NTAmYWN0aW9uPW5leHQiKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL1VyaUNvbXBvbmVudFRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb21tb24vVXJpQ29tcG9uZW50VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNDRiNjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL1VyaUNvbXBvbmVudFRlc3QuamF2YQpAQCAtMCwwICsxLDkyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudXJpLlVyaUNvbXBvbmVudDsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogQGF1dGhvciBMaWJvciBLYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgVXJpQ29tcG9uZW50VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTFVFX1BSRUZJWCA9ICItPCNbIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVkFMVUVfU1VGRklYID0gIl0jPi0iOworCisgICAgQFBhdGgoIi90ZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15UmVzb3VyY2UgeworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJ0ZXh0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRUZXh0VmFsdWUoQFF1ZXJ5UGFyYW0oInRleHQiKSBTdHJpbmcgdGV4dCkgeworICAgICAgICAgICAgcmV0dXJuIFZBTFVFX1BSRUZJWCArIHRleHQgKyBWQUxVRV9TVUZGSVg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhNeVJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucmVnaXN0ZXIoTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpOworICAgICAgICByZXR1cm4gcmVzb3VyY2VDb25maWc7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKExvZ2dpbmdGZWF0dXJlLmNsYXNzKTsKKyAgICAgICAgc3VwZXIuY29uZmlndXJlQ2xpZW50KGNvbmZpZyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcm9kdWNlciBmb3IgSkVSU0VZLTIyNjAKKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUZXh0KCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgUVVFUllfUkVTRVJWRURfQ0hBUlMgPSAiOy8/OkAmPSssJCI7CisgICAgICAgIGZpbmFsIFN0cmluZyBPVEhFUl9TUEVDSUFMX0NIQVJTID0gIlwiXHQtIFxuJyI7CisKKyAgICAgICAgdGVzdFRleHRJbXBsKCJxdWVyeSByZXNlcnZlZCBjaGFyYWN0ZXJzIiwgUVVFUllfUkVTRVJWRURfQ0hBUlMpOworICAgICAgICB0ZXN0VGV4dEltcGwoIm90aGVyIHNwZWNpYWwgY2hhcmFjdGVycyIsIE9USEVSX1NQRUNJQUxfQ0hBUlMpOworCisgICAgICAgIHRlc3RUZXh0SW1wbCgicXVlcnkgcmVzZXJ2ZWQgY2hhcmFjdGVycyBiZXR3ZWVuIHRlbXBsYXRlIGJyYWNrZXRzIiwgInthYmMiICsgUVVFUllfUkVTRVJWRURfQ0hBUlMgKyAiWFlafSIpOworICAgICAgICB0ZXN0VGV4dEltcGwoIm90aGVyIHNwZWNpYWwgY2hhcmFjdGVycyBiZXR3ZWVuIHRlbXBsYXRlIGJyYWNrZXRzIiwgInthYmMiICsgT1RIRVJfU1BFQ0lBTF9DSEFSUyArICJYWVp9Iik7CisKKyAgICAgICAgdGVzdFRleHRJbXBsKCJqc29uIC0gZG91YmxlIHF1b3RlIiwgInsgXCJqbWVub1wiIDogXCJob2Rub3RhXCIgfSIpOworICAgICAgICB0ZXN0VGV4dEltcGwoImpzb24gLSBzaW5nbGUgcXVvdGUiLCAieyAnam1lbm8nIDogJ2hvZG5vdGEnIH0iKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdFRleHRJbXBsKFN0cmluZyBtZXNzYWdlLCBmaW5hbCBTdHJpbmcgdGV4dCkgeworICAgICAgICBTdHJpbmcgZW5jb2RlZCA9IFVyaUNvbXBvbmVudC5lbmNvZGUodGV4dCwgVXJpQ29tcG9uZW50LlR5cGUuUVVFUllfUEFSQU1fU1BBQ0VfRU5DT0RFRCk7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoInRlc3QvdGV4dCIpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5xdWVyeVBhcmFtKCJ0ZXh0IiwgZW5jb2RlZCkucmVxdWVzdCgpLmdldCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBTdHJpbmcgYWN0dWFsID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIFZBTFVFX1BSRUZJWCArIHRleHQgKyBWQUxVRV9TVUZGSVgsIGFjdHVhbCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29tbW9uL3BhY2thZ2UtaW5mby5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9wYWNrYWdlLWluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWQ5ZDU1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbW1vbi9wYWNrYWdlLWluZm8uamF2YQpAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCisvKioKKyAqIEplcnNleSBFbmQgdG8gRW5kIGNvbW1vbiB0ZXN0IGNsYXNzZXMuCisgKi8KK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbjsKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb250YWluZXIvQWJzdHJhY3RTbGFzaGVzV2l0aENvbnRleHRQYXRoVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbnRhaW5lci9BYnN0cmFjdFNsYXNoZXNXaXRoQ29udGV4dFBhdGhUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVjNDE2OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb250YWluZXIvQWJzdHJhY3RTbGFzaGVzV2l0aENvbnRleHRQYXRoVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTI0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb250YWluZXI7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5FbmNvZGVkOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCisvKioKKyAqIEFic3RyYWN0IEplcnNleSB0ZXN0IHdpdGggcHJlcGFyZWQgcmVzb3VyY2VzIGZvciBVUkwgbWF0Y2gKKyAqIHRlc3Rpbmcgb24gZGlmZmVyZW50IGNvbnRhaW5lcnMuCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK3B1YmxpYyBjbGFzcyBBYnN0cmFjdFNsYXNoZXNXaXRoQ29udGV4dFBhdGhUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UQUlORVJfUkVTUE9OU0UgPSAiQ29udGFpbmVyLVJlc3BvbnNlIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URVhUX1BBVEggPSAiYmFzZSI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhTaW1wbGVSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBQYXRoUGFyYW1SZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBFbXB0eVJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIEVtcHR5UGF0aFBhcmFtUmVzb3VyY2UuY2xhc3MpOworCisgICAgICAgIHJlc291cmNlQ29uZmlnLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuUkVEVUNFX0NPTlRFWFRfUEFUSF9TTEFTSEVTX0VOQUJMRUQsIHRydWUpOworICAgICAgICByZXR1cm4gcmVzb3VyY2VDb25maWc7CisgICAgfQorCisgICAgQFBhdGgoInNpbXBsZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTaW1wbGVSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGVuY29kZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gQ09OVEFJTkVSX1JFU1BPTlNFOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAUGF0aCgicGF0aHBhcmFtIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhdGhQYXJhbVJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJ7YmFyOi4qfS97YmF6Oi4qfS90ZXN0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBoZWxsbyhAUGF0aFBhcmFtKCJiYXIiKSBmaW5hbCBTdHJpbmcgYmFyLCBAUGF0aFBhcmFtKCJiYXoiKSBmaW5hbCBTdHJpbmcgYmF6KSB7CisgICAgICAgICAgICByZXR1cm4gYmFyICsgIi0iICsgYmF6OworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRW1wdHlQYXRoUGFyYW1SZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgie2JhcjouKn0ve2JhejouKn0vdGVzdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgaGVsbG8oQFBhdGhQYXJhbSgiYmFyIikgZmluYWwgU3RyaW5nIGJhciwgQFBhdGhQYXJhbSgiYmF6IikgZmluYWwgU3RyaW5nIGJheikgeworICAgICAgICAgICAgcmV0dXJuIGJhciArICItIiArIGJhejsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIntiYXI6Lip9L3tiYXo6Lip9L3Rlc3RQYXJhbXMiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGhlbGxvV2l0aFF1ZXJ5UGFyYW1zKEBQYXRoUGFyYW0oImJhciIpIGZpbmFsIFN0cmluZyBiYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQFBhdGhQYXJhbSgiYmF6IikgZmluYWwgU3RyaW5nIGJheiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAUXVlcnlQYXJhbSgiYmFyIikgZmluYWwgU3RyaW5nIHF1ZXJ5QmFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBRdWVyeVBhcmFtKCJiYXoiKSBmaW5hbCBTdHJpbmcgcXVlcnlCYXopIHsKKyAgICAgICAgICAgIHJldHVybiAiUEFUSCBQQVJBTTogIiArIGJhciArICItIiArIGJheiArICIsIFFVRVJZIFBBUkFNICIgKyBxdWVyeUJhciArICItIiArIHF1ZXJ5QmF6OworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgie2JhcjouKn0ve2JhejouKn0vZW5jb2RlZCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RW5jb2RlZChARW5jb2RlZCBAUXVlcnlQYXJhbSgicXVlcnkiKSBTdHJpbmcgcXVlcnlQYXJhbSkgeworICAgICAgICAgICAgcmV0dXJuIHF1ZXJ5UGFyYW0uZXF1YWxzKCIlMjVkdW1teTIzJTJCYSIpICsgIjoiICsgcXVlcnlQYXJhbTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEVtcHR5UmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIi90ZXN0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBoZWxsbygpIHsKKyAgICAgICAgICAgIHJldHVybiBDT05UQUlORVJfUkVTUE9OU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgUmVzcG9uc2UgY2FsbChTdHJpbmcgcGF0aCkgeworICAgICAgICBVUkkgaG9zdFBvcnQgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3QiKS5wb3J0KGdldFBvcnQoKSkuYnVpbGQoKTsKKyAgICAgICAgcmV0dXJuIGNsaWVudCgpLnRhcmdldChob3N0UG9ydCkucGF0aChwYXRoKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udGV4dCBwYXRoIGNvbmZpZ3VyYXRpb24KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVVJJIGdldEJhc2VVcmkoKSB7CisgICAgICAgIFVSSSBiYXNlVXJpID0gc3VwZXIuZ2V0QmFzZVVyaSgpOworICAgICAgICByZXR1cm4gVXJpQnVpbGRlci5mcm9tVXJpKGJhc2VVcmkpLnBhdGgoQ09OVEVYVF9QQVRIKS5idWlsZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb250YWluZXIvRXNjYXBlZFVyaVRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb250YWluZXIvRXNjYXBlZFVyaVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWFhMmM5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbnRhaW5lci9Fc2NhcGVkVXJpVGVzdC5qYXZhCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbnRhaW5lcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgRXNjYXBlZFVyaVRlc3QgZXh0ZW5kcyBKZXJzZXlDb250YWluZXJUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNQT05TRSA9ICJDT05URU5UIjsKKworICAgIEBQYXRoKCJ4JTIweSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFc2NhcGVkVXJpUmVzb3VyY2UgeworCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGNvbnRleHQ7CisKKyAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoIlVudXNlZERlY2xhcmF0aW9uIikKKyAgICAgICAgcHVibGljIEVzY2FwZWRVcmlSZXNvdXJjZSgpIHsKKyAgICAgICAgICAgIHRoaXMoIiIpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIEVzY2FwZWRVcmlSZXNvdXJjZShmaW5hbCBTdHJpbmcgY29udGV4dCkgeworICAgICAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoQENvbnRleHQgZmluYWwgVXJpSW5mbyBpbmZvKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoY29udGV4dCArICIveCUyMHkiLCBpbmZvLmdldEFic29sdXRlUGF0aCgpLmdldFJhd1BhdGgoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIi8iLCBpbmZvLmdldEJhc2VVcmkoKS5nZXRSYXdQYXRoKCkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGNvbnRleHQgKyAiL3ggeSIsICIvIiArIGluZm8uZ2V0UGF0aCgpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhjb250ZXh0ICsgIi94JTIweSIsICIvIiArIGluZm8uZ2V0UGF0aChmYWxzZSkpOworCisgICAgICAgICAgICByZXR1cm4gUkVTUE9OU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgibm9uL3ggeSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBOb25Fc2NhcGVkVXJpUmVzb3VyY2UgZXh0ZW5kcyBFc2NhcGVkVXJpUmVzb3VyY2UgeworCisgICAgICAgIHB1YmxpYyBOb25Fc2NhcGVkVXJpUmVzb3VyY2UoKSB7CisgICAgICAgICAgICBzdXBlcigiL25vbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhFc2NhcGVkVXJpUmVzb3VyY2UuY2xhc3MsIE5vbkVzY2FwZWRVcmlSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXNjYXBlZCgpIHsKKyAgICAgICAgYXNzZXJ0VGhhdCh0YXJnZXQoInglMjB5IikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpLCBpcyhSRVNQT05TRSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vbkVzY2FwZWQoKSB7CisgICAgICAgIGFzc2VydFRoYXQodGFyZ2V0KCJub24veCB5IikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpLCBpcyhSRVNQT05TRSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb250YWluZXIvR3JpenpseVNsYXNoZXNXaXRoQ29udGV4dFBhdGhUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29udGFpbmVyL0dyaXp6bHlTbGFzaGVzV2l0aENvbnRleHRQYXRoVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwOWZkY2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29udGFpbmVyL0dyaXp6bHlTbGFzaGVzV2l0aENvbnRleHRQYXRoVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb250YWluZXI7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5ncml6emx5LkdyaXp6bHlUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZS5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdCBKZXJzZXkgY29udGFpbmVyIGltcGxlbWVudGF0aW9uIG9mIFVSTCByZXNvbHZpbmcuCisgKiBTbGFzaGVzIGJlZm9yZSBhIGNvbnRleHQgcGF0aCBjYW4gYmUgb21pdHRlZCBkZXBlbmRpbmcgb24KKyAqIHRoZSBnaXZlbiBwcm9wZXJ0eS4KKyAqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworcHVibGljIGNsYXNzIEdyaXp6bHlTbGFzaGVzV2l0aENvbnRleHRQYXRoVGVzdCBleHRlbmRzIEFic3RyYWN0U2xhc2hlc1dpdGhDb250ZXh0UGF0aFRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEdyaXp6bHlUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZVNsYXNoZXMoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3VsdCA9IGNhbGwoQ09OVEVYVF9QQVRIICsgIi9zaW1wbGUiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKENPTlRBSU5FUl9SRVNQT05TRSwgcmVzdWx0LnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgcmVzdWx0ID0gY2FsbCgiLyIgKyBDT05URVhUX1BBVEggKyAiL3NpbXBsZSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoQ09OVEFJTkVSX1JFU1BPTlNFLCByZXN1bHQucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICByZXN1bHQgPSBjYWxsKCIvLyIgKyBDT05URVhUX1BBVEggKyAiL3NpbXBsZSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoQ09OVEFJTkVSX1JFU1BPTlNFLCByZXN1bHQucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICByZXN1bHQgPSBjYWxsKCIvLy8iICsgQ09OVEVYVF9QQVRIICsgIi9zaW1wbGUiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKENPTlRBSU5FUl9SRVNQT05TRSwgcmVzdWx0LnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgcmVzdWx0ID0gY2FsbCgiLy8vLyIgKyBDT05URVhUX1BBVEggKyAiL3NpbXBsZSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoQ09OVEFJTkVSX1JFU1BPTlNFLCByZXN1bHQucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTbGFzaGVzV2l0aFBhdGhQYXJhbSgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzdWx0ID0gY2FsbCgiLy8iICsgQ09OVEVYVF9QQVRIICsgIi9wYXRocGFyYW0vQ29udGFpbmVyL1Jlc3BvbnNlL3Rlc3QiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKENPTlRBSU5FUl9SRVNQT05TRSwgcmVzdWx0LnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2xhc2hlc1dpdGhFbXB0eVBhdGhQYXJhbSgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzdWx0ID0gY2FsbCgiLy8iICsgQ09OVEVYVF9QQVRIICsgIi9wYXRocGFyYW0vLy90ZXN0Iik7CisgICAgICAgIGFzc2VydEVxdWFscygiLSIsIHJlc3VsdC5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNsYXNoZXNXaXRoQmVnaW5uaW5nRW1wdHlQYXRoUGFyYW0oKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3VsdCA9IGNhbGwoIi8vIiArIENPTlRFWFRfUEFUSCArICIvLy90ZXN0Iik7CisgICAgICAgIGFzc2VydEVxdWFscygiLSIsIHJlc3VsdC5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVuY29kZWRRdWVyeVBhcmFtcygpIHsKKyAgICAgICAgVVJJIGhvc3RQb3J0ID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0LyIpLnBvcnQoZ2V0UG9ydCgpKS5idWlsZCgpOworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gY2xpZW50KCkudGFyZ2V0KGhvc3RQb3J0KS5wYXRoKCIvLyIgKyBDT05URVhUX1BBVEggKyAiLy8vZW5jb2RlZCIpCisgICAgICAgICAgICAgICAgLnF1ZXJ5UGFyYW0oInF1ZXJ5IiwgIiVkdW1teTIzK2EiKTsKKworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0cnVlOiUyNWR1bW15MjMlMkJhIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTbGFzaGVzV2l0aEJlZ2lubmluZ0VtcHR5UGF0aFBhcmFtV2l0aFF1ZXJ5UGFyYW1zKCkgeworICAgICAgICBVUkkgaG9zdFBvcnQgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3QvIikucG9ydChnZXRQb3J0KCkpLmJ1aWxkKCk7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSBjbGllbnQoKS50YXJnZXQoaG9zdFBvcnQpLnBhdGgoIi8vIiArIENPTlRFWFRfUEFUSCArICIvLy90ZXN0UGFyYW1zIikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgiYmFyIiwgIkNvbnRhaW5lciIpCisgICAgICAgICAgICAgICAgLnF1ZXJ5UGFyYW0oImJheiIsICJSZXNwb25zZSIpOworCisgICAgICAgIFJlc3BvbnNlIHJlc3VsdCA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiUEFUSCBQQVJBTTogLSwgUVVFUlkgUEFSQU0gQ29udGFpbmVyLVJlc3BvbnNlIiwgcmVzdWx0LnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbnRhaW5lci9HemlwQ29udGVudEVuY29kaW5nVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbnRhaW5lci9HemlwQ29udGVudEVuY29kaW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxYzQ2M2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29udGFpbmVyL0d6aXBDb250ZW50RW5jb2RpbmdUZXN0LmphdmEKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29udGFpbmVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuemlwLkdaSVBJbnB1dFN0cmVhbTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUmVhZGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJlYWRlckludGVyY2VwdG9yQ29udGV4dDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5HWmlwRW5jb2RlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmZpbHRlci5FbmNvZGluZ0ZpbHRlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBHemlwQ29udGVudEVuY29kaW5nVGVzdCBleHRlbmRzIEplcnNleUNvbnRhaW5lclRlc3QgeworCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gIkdFVCI7CisgICAgICAgIH0KKworICAgICAgICBAUE9TVAorICAgICAgICBwdWJsaWMgU3RyaW5nIHBvc3QoZmluYWwgU3RyaW5nIGNvbnRlbnQpIHsKKyAgICAgICAgICAgIHJldHVybiBjb250ZW50OworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcywgRW5jb2RpbmdGaWx0ZXIuY2xhc3MsIEdaaXBFbmNvZGVyLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoZmluYWwgQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcucmVnaXN0ZXIobmV3IFJlYWRlckludGVyY2VwdG9yKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGFyb3VuZFJlYWRGcm9tKGZpbmFsIFJlYWRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBjb250ZXh0LnNldElucHV0U3RyZWFtKG5ldyBHWklQSW5wdXRTdHJlYW0oY29udGV4dC5nZXRJbnB1dFN0cmVhbSgpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQucHJvY2VlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXQoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLmhlYWRlcihIdHRwSGVhZGVycy5BQ0NFUFRfRU5DT0RJTkcsICJnemlwIikKKyAgICAgICAgICAgICAgICAuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGlzKCJHRVQiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdCgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAuaGVhZGVyKEh0dHBIZWFkZXJzLkFDQ0VQVF9FTkNPRElORywgImd6aXAiKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS50ZXh0KCJQT1NUIikpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBpcygiUE9TVCIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29udGFpbmVyL0hlYWRUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29udGFpbmVyL0hlYWRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE0M2QwZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb250YWluZXIvSGVhZFRlc3QuamF2YQpAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29udGFpbmVyOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5ncml6emx5LkdyaXp6bHlUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmlubWVtb3J5LkluTWVtb3J5VGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5qZXR0eS5KZXR0eVRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc2ltcGxlLlNpbXBsZVRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLm5vdE51bGxWYWx1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGNsYXNzIEhlYWRUZXN0IGV4dGVuZHMgSmVyc2V5Q29udGFpbmVyVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMaXN0PFRlc3RDb250YWluZXJGYWN0b3J5PiBGQUNUT1JJRVMgPSBBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgbmV3IEdyaXp6bHlUZXN0Q29udGFpbmVyRmFjdG9yeSgpLAorICAgICAgICAgICAgbmV3IEluTWVtb3J5VGVzdENvbnRhaW5lckZhY3RvcnkoKSwKKyAgICAgICAgICAgIG5ldyBTaW1wbGVUZXN0Q29udGFpbmVyRmFjdG9yeSgpLAorICAgICAgICAgICAgbmV3IEpldHR5VGVzdENvbnRhaW5lckZhY3RvcnkoKSk7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKG5hbWUgPSAiezB9IikKKyAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248VGVzdENvbnRhaW5lckZhY3RvcnlbXT4gcGFyYW1ldGVycygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXR1cm4gRkFDVE9SSUVTLnN0cmVhbSgpLm1hcChpbnB1dCAtPiBuZXcgVGVzdENvbnRhaW5lckZhY3RvcnlbXXtpbnB1dH0pLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBQYXRoKCJzdHJpbmciKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuICJHRVQiOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoImJ5dGUiKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBieXRlW10gZ2V0Qnl0ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAiR0VUIi5nZXRCeXRlcygpOworICAgICAgICB9CisKKyAgICAgICAgQFBhdGgoIkJ5dGVBcnJheUlucHV0U3RyZWFtIikKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgSW5wdXRTdHJlYW0gZ2V0SW5wdXRTdHJlYW0oKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKCJHRVQiLmdldEJ5dGVzKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVhZFN0cmluZygpIHsKKyAgICAgICAgX3Rlc3RIZWFkKCJzdHJpbmciLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIZWFkQnl0ZSgpIHsKKyAgICAgICAgX3Rlc3RIZWFkKCJieXRlIiwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX09DVEVUX1NUUkVBTV9UWVBFKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIZWFkQnl0ZUFycmF5SW5wdXRTdHJlYW0oKSB7CisgICAgICAgIF90ZXN0SGVhZCgiQnl0ZUFycmF5SW5wdXRTdHJlYW0iLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fT0NURVRfU1RSRUFNX1RZUEUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfdGVzdEhlYWQoZmluYWwgU3RyaW5nIHBhdGgsIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQocGF0aCkucmVxdWVzdChtZWRpYVR5cGUpLmhlYWQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGxlbmd0aFN0ciA9IHJlc3BvbnNlLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5DT05URU5UX0xFTkdUSCk7CisgICAgICAgIGFzc2VydFRoYXQobGVuZ3RoU3RyLCBub3ROdWxsVmFsdWUoKSk7CisgICAgICAgIGFzc2VydFRoYXQoSW50ZWdlci5wYXJzZUludChsZW5ndGhTdHIpLCBpcygzKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0TWVkaWFUeXBlKCksIGlzKG1lZGlhVHlwZSkpOworICAgICAgICBhc3NlcnRGYWxzZShyZXNwb25zZS5oYXNFbnRpdHkoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbnRhaW5lci9KZGtTbGFzaGVzV2l0aENvbnRleHRQYXRoVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbnRhaW5lci9KZGtTbGFzaGVzV2l0aENvbnRleHRQYXRoVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMjc2ZjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29udGFpbmVyL0pka1NsYXNoZXNXaXRoQ29udGV4dFBhdGhUZXN0LmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29udGFpbmVyOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuamRraHR0cC5KZGtIdHRwU2VydmVyVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2UuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3QgSmVyc2V5IGNvbnRhaW5lciBpbXBsZW1lbnRhdGlvbiBvZiBVUkwgcmVzb2x2aW5nLgorICogSkRLIFNlcnZlciBkb2VzIG5vdCBzdXBwb3J0IG11bHRpcGxlIHNsYXNoZXMgYmVmb3JlIHRoZSBjb250ZXh0LXBhdGgsCisgKiBpbiBjYXNlIG9mIG11bHRpcGxlIHNsYXNoZXMgc2VydmVyIGRvZXMgbm90IG1hdGNoIHRoZSBwcm9jZXNzaW5nIGhhbmRsZXIgYW5kCisgKiB0aGVyZWZvcmUgSmVyc2V5IFJlcXVlc3QgY2Fubm90IGJlIGNyZWF0ZWQgYW5kIHByb2Nlc3NlZC4KKyAqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworcHVibGljIGNsYXNzIEpka1NsYXNoZXNXaXRoQ29udGV4dFBhdGhUZXN0IGV4dGVuZHMgQWJzdHJhY3RTbGFzaGVzV2l0aENvbnRleHRQYXRoVGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgSmRrSHR0cFNlcnZlclRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlU2xhc2hlcygpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzdWx0ID0gY2FsbChDT05URVhUX1BBVEggKyAiL3NpbXBsZSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoQ09OVEFJTkVSX1JFU1BPTlNFLCByZXN1bHQucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICByZXN1bHQgPSBjYWxsKCIvIiArIENPTlRFWFRfUEFUSCArICIvc2ltcGxlIik7CisgICAgICAgIGFzc2VydEVxdWFscyhDT05UQUlORVJfUkVTUE9OU0UsIHJlc3VsdC5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNsYXNoZXNXaXRoUGF0aFBhcmFtKCkgeworICAgICAgICBSZXNwb25zZSByZXN1bHQgPSBjYWxsKENPTlRFWFRfUEFUSCArICIvcGF0aHBhcmFtL0NvbnRhaW5lci9SZXNwb25zZS90ZXN0Iik7CisgICAgICAgIGFzc2VydEVxdWFscyhDT05UQUlORVJfUkVTUE9OU0UsIHJlc3VsdC5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNsYXNoZXNXaXRoRW1wdHlQYXRoUGFyYW0oKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3VsdCA9IGNhbGwoQ09OVEVYVF9QQVRIICsgIi9wYXRocGFyYW0vLy90ZXN0Iik7CisgICAgICAgIGFzc2VydEVxdWFscygiLSIsIHJlc3VsdC5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNsYXNoZXNXaXRoQmVnaW5uaW5nRW1wdHlQYXRoUGFyYW0oKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3VsdCA9IGNhbGwoQ09OVEVYVF9QQVRIICsgIi8vL3Rlc3QiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCItIiwgcmVzdWx0LnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2xhc2hlc1dpdGhCZWdpbm5pbmdFbXB0eVBhdGhQYXJhbVdpdGhRdWVyeVBhcmFtcygpIHsKKyAgICAgICAgVVJJIGhvc3RQb3J0ID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0LyIpLnBvcnQoZ2V0UG9ydCgpKS5idWlsZCgpOworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gY2xpZW50KCkudGFyZ2V0KGhvc3RQb3J0KS5wYXRoKENPTlRFWFRfUEFUSCArICIvLy90ZXN0UGFyYW1zIikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgiYmFyIiwgIkNvbnRhaW5lciIpCisgICAgICAgICAgICAgICAgLnF1ZXJ5UGFyYW0oImJheiIsICJSZXNwb25zZSIpOworCisgICAgICAgIFJlc3BvbnNlIHJlc3VsdCA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiUEFUSCBQQVJBTTogLSwgUVVFUlkgUEFSQU0gQ29udGFpbmVyLVJlc3BvbnNlIiwgcmVzdWx0LnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBASWdub3JlKCJmYWlsaW5nIHdpdGggSkRLIGNvbnRhaW5lci4iKQorICAgIHB1YmxpYyB2b2lkIHRlc3RFbmNvZGVkUXVlcnlQYXJhbXMoKSB7CisgICAgICAgIFVSSSBob3N0UG9ydCA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdC8iKS5wb3J0KGdldFBvcnQoKSkuYnVpbGQoKTsKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IGNsaWVudCgpLnRhcmdldChob3N0UG9ydCkucGF0aCgiLy8iICsgQ09OVEVYVF9QQVRIICsgIi8vL2VuY29kZWQiKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJxdWVyeSIsICIlZHVtbXkyMythIik7CisKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygidHJ1ZTolMjVkdW1teTIzJTJCYSIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbnRhaW5lci9KZXJzZXkyNDYyVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbnRhaW5lci9KZXJzZXkyNDYyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3YzhjNjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29udGFpbmVyL0plcnNleTI0NjJUZXN0LmphdmEKQEAgLTAsMCArMSwyODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbnRhaW5lcjsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5QcmVNYXRjaGluZzsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5EZXBsb3ltZW50Q29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5ncml6emx5LkdyaXp6bHlUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmpldHR5LkpldHR5VGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zaW1wbGUuU2ltcGxlVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5TdWl0ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogUmVwcm9kdWNlciB0ZXN0cyBmb3IgSkVSU0VZLTI0NjIgb24gR3JpenpseSwgSmV0dHkgYW5kIFNpbXBsZSBIVFRQIHNlcnZlci4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitAUnVuV2l0aChTdWl0ZS5jbGFzcykKK0BTdWl0ZS5TdWl0ZUNsYXNzZXMoe0plcnNleTI0NjJUZXN0LkdyaXp6bHlDb250YWluZXJUZXN0LmNsYXNzLAorICAgICAgICBKZXJzZXkyNDYyVGVzdC5KZXR0eUNvbnRhaW5lclRlc3QuY2xhc3MsCisgICAgICAgIEplcnNleTI0NjJUZXN0LlNpbXBsZUNvbnRhaW5lclRlc3QuY2xhc3N9KQorcHVibGljIGNsYXNzIEplcnNleTI0NjJUZXN0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVRVUVTVF9OVU1CRVIgPSAicmVxdWVzdC1udW1iZXIiOworCisgICAgLyoqCisgICAgICogVGVzdCByZXNvdXJjZS4KKyAgICAgKgorICAgICAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgICAgICovCisgICAgQFBhdGgoImVjaG8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRWNob1Jlc291cmNlIHsKKworICAgICAgICAvKioKKyAgICAgICAgICogRWNob2VzIHRoZSBpbnB1dCBtZXNzYWdlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbWVzc2FnZSBpbnB1dCBtZXNzYWdlLgorICAgICAgICAgKiBAcmV0dXJuIGVjaG9lZCBpbnB1dCBtZXNzYWdlLgorICAgICAgICAgKi8KKyAgICAgICAgQFBPU1QKKyAgICAgICAgQENvbnN1bWVzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgcHVibGljIFN0cmluZyBlY2hvKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgICAgICByZXR1cm4gbWVzc2FnZSArICIiICsgdGhpcy5nZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaWx0ZXIgdGVzdGluZyBHcml6emx5IHJlcXVlc3QvcmVzcG9uc2UgaW5qZWN0aW9uIHN1cHBvcnQgaW50byBzaW5nbGV0b24gcHJvdmlkZXJzLgorICAgICAqLworICAgIEBQcmVNYXRjaGluZworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgR3JpenpseVJlcXVlc3RGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHsKKyAgICAgICAgQEluamVjdAorICAgICAgICBwcml2YXRlIFByb3ZpZGVyPG9yZy5nbGFzc2Zpc2guZ3JpenpseS5odHRwLnNlcnZlci5SZXF1ZXN0PiBncml6emx5UmVxdWVzdDsKKyAgICAgICAgQEluamVjdAorICAgICAgICBwcml2YXRlIG9yZy5nbGFzc2Zpc2guZ3JpenpseS5odHRwLnNlcnZlci5SZXNwb25zZSBncml6emx5UmVzcG9uc2U7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCBjdHgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKworICAgICAgICAgICAgLy8gRmlyc3QsIG1ha2Ugc3VyZSB0aGVyZSBhcmUgbm8gbnVsbCBpbmplY3Rpb25zLgorICAgICAgICAgICAgaWYgKGdyaXp6bHlSZXF1ZXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIkdyaXp6bHkgUmVxdWVzdCBpcyBudWxsLlxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZ3JpenpseVJlc3BvbnNlID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIkdyaXp6bHkgUmVzcG9uc2UgaXMgbnVsbC5cbiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc2IubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgY3R4LmFib3J0V2l0aChSZXNwb25zZS5zZXJ2ZXJFcnJvcigpLmVudGl0eShzYi50b1N0cmluZygpKS5idWlsZCgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gbGV0J3MgYWxzbyB0ZXN0IHNvbWUgbWV0aG9kIGNhbGxzCisgICAgICAgICAgICBpbnQgZmxhZ3MgPSAwOworCisgICAgICAgICAgICBpZiAoIi9qZXJzZXktMjQ2MiIuZXF1YWxzKGdyaXp6bHlSZXF1ZXN0LmdldCgpLmdldENvbnRleHRQYXRoKCkpKSB7CisgICAgICAgICAgICAgICAgZmxhZ3MgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZ3JpenpseVJlc3BvbnNlLmlzQ29tbWl0dGVkKCkpIHsKKyAgICAgICAgICAgICAgICBmbGFncyArPSAxMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBoZWFkZXIgPSBncml6emx5UmVxdWVzdC5nZXQoKS5nZXRIZWFkZXIoUkVRVUVTVF9OVU1CRVIpOworCisgICAgICAgICAgICBjdHguc2V0RW50aXR5U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgoImZpbHRlcmVkLSIgKyBmbGFncyArICItIiArIGhlYWRlcikuZ2V0Qnl0ZXMoKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBHcml6emx5Q29udGFpbmVyVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIERlcGxveW1lbnRDb250ZXh0IGNvbmZpZ3VyZURlcGxveW1lbnQoKSB7CisgICAgICAgICAgICByZXR1cm4gRGVwbG95bWVudENvbnRleHQuYnVpbGRlcihuZXcgUmVzb3VyY2VDb25maWcoRWNob1Jlc291cmNlLmNsYXNzLCBHcml6emx5UmVxdWVzdEZpbHRlci5jbGFzcykpCisgICAgICAgICAgICAgICAgICAgIC5jb250ZXh0UGF0aCgiamVyc2V5LTI0NjIiKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEdyaXp6bHlUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlcHJvZHVjZXIgZm9yIEpFUlNFWS0yNDYyIG9uIEdyaXp6bHkgY29udGFpbmVyLgorICAgICAgICAgKi8KKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdFJlcWVzdFJlcG9uc2VJbmplY3Rpb25JbnRvU2luZ2xldG9uUHJvdmlkZXIoKSB7CisgICAgICAgICAgICBKZXJzZXkyNDYyVGVzdC50ZXN0UmVxZXN0UmVwb25zZUluamVjdGlvbkludG9TaW5nbGV0b25Qcm92aWRlcih0YXJnZXQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaWx0ZXIgdGVzdGluZyBKZXR0eSByZXF1ZXN0L3Jlc3BvbnNlIGluamVjdGlvbiBzdXBwb3J0IGludG8gc2luZ2xldG9uIHByb3ZpZGVycy4KKyAgICAgKi8KKyAgICBAUHJlTWF0Y2hpbmcKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpldHR5UmVxdWVzdEZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIgeworICAgICAgICBASW5qZWN0CisgICAgICAgIHByaXZhdGUgUHJvdmlkZXI8b3JnLmVjbGlwc2UuamV0dHkuc2VydmVyLlJlcXVlc3Q+IGpldHR5UmVxdWVzdDsKKyAgICAgICAgQEluamVjdAorICAgICAgICBwcml2YXRlIFByb3ZpZGVyPG9yZy5lY2xpcHNlLmpldHR5LnNlcnZlci5SZXNwb25zZT4gamV0dHlSZXNwb25zZTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IGN0eCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisgICAgICAgICAgICAvLyBGaXJzdCwgbWFrZSBzdXJlIHRoZXJlIGFyZSBubyBudWxsIGluamVjdGlvbnMuCisgICAgICAgICAgICBpZiAoamV0dHlSZXF1ZXN0ID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICBzYi5hcHBlbmQoIkpldHR5IFJlcXVlc3QgaXMgbnVsbC5cbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGpldHR5UmVzcG9uc2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiSmV0dHkgUmVzcG9uc2UgaXMgbnVsbC5cbiIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoc2IubGVuZ3RoKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgY3R4LmFib3J0V2l0aChSZXNwb25zZS5zZXJ2ZXJFcnJvcigpLmVudGl0eShzYi50b1N0cmluZygpKS5idWlsZCgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gbGV0J3MgYWxzbyB0ZXN0IHNvbWUgbWV0aG9kIGNhbGxzCisgICAgICAgICAgICBpbnQgZmxhZ3MgPSAwOworCisgICAgICAgICAgICBpZiAoIi9lY2hvIi5lcXVhbHMoamV0dHlSZXF1ZXN0LmdldCgpLmdldFBhdGhJbmZvKCkpKSB7CisgICAgICAgICAgICAgICAgZmxhZ3MgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghamV0dHlSZXNwb25zZS5nZXQoKS5pc0NvbW1pdHRlZCgpKSB7CisgICAgICAgICAgICAgICAgZmxhZ3MgKz0gMTA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaGVhZGVyID0gamV0dHlSZXF1ZXN0LmdldCgpLmdldEhlYWRlcihSRVFVRVNUX05VTUJFUik7CisKKyAgICAgICAgICAgIGN0eC5zZXRFbnRpdHlTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKCgiZmlsdGVyZWQtIiArIGZsYWdzICsgIi0iICsgaGVhZGVyKS5nZXRCeXRlcygpKSk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSmV0dHlDb250YWluZXJUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgRGVwbG95bWVudENvbnRleHQgY29uZmlndXJlRGVwbG95bWVudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBEZXBsb3ltZW50Q29udGV4dC5idWlsZGVyKG5ldyBSZXNvdXJjZUNvbmZpZyhFY2hvUmVzb3VyY2UuY2xhc3MsIEpldHR5UmVxdWVzdEZpbHRlci5jbGFzcykpCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSmV0dHlUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJlcHJvZHVjZXIgZm9yIEpFUlNFWS0yNDYyIG9uIEdyaXp6bHkgY29udGFpbmVyLgorICAgICAgICAgKi8KKyAgICAgICAgQFRlc3QKKyAgICAgICAgcHVibGljIHZvaWQgdGVzdFJlcWVzdFJlcG9uc2VJbmplY3Rpb25JbnRvU2luZ2xldG9uUHJvdmlkZXIoKSB7CisgICAgICAgICAgICBKZXJzZXkyNDYyVGVzdC50ZXN0UmVxZXN0UmVwb25zZUluamVjdGlvbkludG9TaW5nbGV0b25Qcm92aWRlcih0YXJnZXQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBGaWx0ZXIgdGVzdGluZyBTaW1wbGUgZnJhbWV3b3JrIHJlcXVlc3QvcmVzcG9uc2UgaW5qZWN0aW9uIHN1cHBvcnQgaW50byBzaW5nbGV0b24gcHJvdmlkZXJzLgorICAgICAqLworICAgIEBQcmVNYXRjaGluZworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU2ltcGxlUmVxdWVzdEZpbHRlciBpbXBsZW1lbnRzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIgeworICAgICAgICBASW5qZWN0CisgICAgICAgIHByaXZhdGUgb3JnLnNpbXBsZWZyYW1ld29yay5odHRwLlJlcXVlc3Qgc2ltcGxlUmVxdWVzdDsKKyAgICAgICAgQEluamVjdAorICAgICAgICBwcml2YXRlIG9yZy5zaW1wbGVmcmFtZXdvcmsuaHR0cC5SZXNwb25zZSBzaW1wbGVSZXNwb25zZTsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IGN0eCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisgICAgICAgICAgICAvLyBGaXJzdCwgbWFrZSBzdXJlIHRoZXJlIGFyZSBubyBudWxsIGluamVjdGlvbnMuCisgICAgICAgICAgICBpZiAoc2ltcGxlUmVxdWVzdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2IuYXBwZW5kKCJTaW1wbGUgSFRUUCBmcmFtZXdvcmsgUmVxdWVzdCBpcyBudWxsLlxuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2ltcGxlUmVzcG9uc2UgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHNiLmFwcGVuZCgiU2ltcGxlIEhUVFAgZnJhbWV3b3JrIFJlc3BvbnNlIGlzIG51bGwuXG4iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHNiLmxlbmd0aCgpID4gMCkgeworICAgICAgICAgICAgICAgIGN0eC5hYm9ydFdpdGgoUmVzcG9uc2Uuc2VydmVyRXJyb3IoKS5lbnRpdHkoc2IudG9TdHJpbmcoKSkuYnVpbGQoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGxldCdzIGFsc28gdGVzdCBzb21lIG1ldGhvZCBjYWxscworICAgICAgICAgICAgaW50IGZsYWdzID0gMDsKKworICAgICAgICAgICAgaWYgKCIvZWNobyIuZXF1YWxzKHNpbXBsZVJlcXVlc3QuZ2V0QWRkcmVzcygpLmdldFBhdGgoKS5nZXRQYXRoKCkpKSB7CisgICAgICAgICAgICAgICAgZmxhZ3MgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghc2ltcGxlUmVzcG9uc2UuaXNDb21taXR0ZWQoKSkgeworICAgICAgICAgICAgICAgIGZsYWdzICs9IDEwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZmluYWwgU3RyaW5nIGhlYWRlciA9IHNpbXBsZVJlcXVlc3QuZ2V0VmFsdWUoUkVRVUVTVF9OVU1CRVIpOworCisgICAgICAgICAgICBjdHguc2V0RW50aXR5U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgoImZpbHRlcmVkLSIgKyBmbGFncyArICItIiArIGhlYWRlcikuZ2V0Qnl0ZXMoKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTaW1wbGVDb250YWluZXJUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgRGVwbG95bWVudENvbnRleHQgY29uZmlndXJlRGVwbG95bWVudCgpIHsKKyAgICAgICAgICAgIHJldHVybiBEZXBsb3ltZW50Q29udGV4dC5idWlsZGVyKG5ldyBSZXNvdXJjZUNvbmZpZyhFY2hvUmVzb3VyY2UuY2xhc3MsIFNpbXBsZVJlcXVlc3RGaWx0ZXIuY2xhc3MpKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFNpbXBsZVRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmVwcm9kdWNlciBmb3IgSkVSU0VZLTI0NjIgb24gR3JpenpseSBjb250YWluZXIuCisgICAgICAgICAqLworICAgICAgICBAVGVzdAorICAgICAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxZXN0UmVwb25zZUluamVjdGlvbkludG9TaW5nbGV0b25Qcm92aWRlcigpIHsKKyAgICAgICAgICAgIEplcnNleTI0NjJUZXN0LnRlc3RSZXFlc3RSZXBvbnNlSW5qZWN0aW9uSW50b1NpbmdsZXRvblByb3ZpZGVyKHRhcmdldCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJlcHJvZHVjZXIgbWV0aG9kIGZvciBKRVJTRVktMjQ2Mi4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVzdFJlcWVzdFJlcG9uc2VJbmplY3Rpb25JbnRvU2luZ2xldG9uUHJvdmlkZXIoV2ViVGFyZ2V0IHRhcmdldCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICAgICAgICAgIFN0cmluZyByZXNwb25zZSA9IHRhcmdldC5wYXRoKCJlY2hvIikucmVxdWVzdCgpLmhlYWRlcihSRVFVRVNUX05VTUJFUiwgaSkKKyAgICAgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LnRleHQoInRlc3QiKSwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgIC8vIEFzc2VydCB0aGF0IHRoZSByZXF1ZXN0IGhhcyBiZWVuIGZpbHRlcmVkIGFuZCBwcm9jZXNzZWQgYnkgdGhlIGVjaG8gbWV0aG9kLgorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBFY2hvUmVzb3VyY2UoKS5lY2hvKCJmaWx0ZXJlZC0xMS0iICsgaSksIHJlc3BvbnNlKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb250YWluZXIvSmVyc2V5Q29udGFpbmVyVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbnRhaW5lci9KZXJzZXlDb250YWluZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUyYjA4NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb250YWluZXIvSmVyc2V5Q29udGFpbmVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbnRhaW5lcjsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZ3JpenpseS5Hcml6emx5VGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5pbm1lbW9yeS5Jbk1lbW9yeVRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuamRraHR0cC5KZGtIdHRwU2VydmVyVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5qZXR0eS5KZXR0eVRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QubmV0dHkuTmV0dHlUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNpbXBsZS5TaW1wbGVUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGFic3RyYWN0IGNsYXNzIEplcnNleUNvbnRhaW5lclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3Q8VGVzdENvbnRhaW5lckZhY3Rvcnk+IEZBQ1RPUklFUyA9IEFycmF5cy5hc0xpc3QoCisgICAgICAgICAgICBuZXcgR3JpenpseVRlc3RDb250YWluZXJGYWN0b3J5KCksCisgICAgICAgICAgICBuZXcgSW5NZW1vcnlUZXN0Q29udGFpbmVyRmFjdG9yeSgpLAorICAgICAgICAgICAgbmV3IFNpbXBsZVRlc3RDb250YWluZXJGYWN0b3J5KCksCisgICAgICAgICAgICBuZXcgSmRrSHR0cFNlcnZlclRlc3RDb250YWluZXJGYWN0b3J5KCksCisgICAgICAgICAgICBuZXcgSmV0dHlUZXN0Q29udGFpbmVyRmFjdG9yeSgpLAorICAgICAgICAgICAgbmV3IE5ldHR5VGVzdENvbnRhaW5lckZhY3RvcnkoKQorICAgICk7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKG5hbWUgPSAiezB9IikKKyAgICBwdWJsaWMgc3RhdGljIENvbGxlY3Rpb248VGVzdENvbnRhaW5lckZhY3RvcnlbXT4gcGFyYW1ldGVycygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXR1cm4gRkFDVE9SSUVTLnN0cmVhbSgpLm1hcChpbnB1dCAtPiBuZXcgVGVzdENvbnRhaW5lckZhY3RvcnlbXXtpbnB1dH0pLmNvbGxlY3QoQ29sbGVjdG9ycy50b0xpc3QoKSk7CisgICAgfQorCisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXIoMCkKKyAgICBwdWJsaWMgVGVzdENvbnRhaW5lckZhY3RvcnkgZmFjdG9yeTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGZhY3Rvcnk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbnRhaW5lci9KZXR0eUVtcHR5SGVhZGVyUGFyYW1UZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29udGFpbmVyL0pldHR5RW1wdHlIZWFkZXJQYXJhbVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWYwM2M2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbnRhaW5lci9KZXR0eUVtcHR5SGVhZGVyUGFyYW1UZXN0LmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29udGFpbmVyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLkhlYWRlclBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5qZXR0eS5KZXR0eVRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdHMgSmV0dHkgZ2V0SGVhZGVyKCkgLSByZXR1cm5zIG51bGwgaW4gd2hlbiB0aGUgaGVhZGVyCisgKiBpcyBub3QgcHJlc2VudCBhbmQgZXZlbiB0aG91Z2ggdGhlIGhlYWRlciBpcyBlbXB0eSBzdHJpbmcuCisgKgorICogSVNTVUU6IEpFUlNFWS0yOTE3CisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKiAqLworcHVibGljIGNsYXNzIEpldHR5RW1wdHlIZWFkZXJQYXJhbVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoSGVhZGVyUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKZXR0eVRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFBhdGgoInRlc3QiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSGVhZGVyUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoQEhlYWRlclBhcmFtKCJhIikgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE51bGxIZWFkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gdGFyZ2V0KCJ0ZXN0IikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIHJlc3BvbnNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUhlYWRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSB0YXJnZXQoInRlc3QiKS5yZXF1ZXN0KCkuaGVhZGVyKCJhIiwgIiIpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIiIsIHJlc3BvbnNlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29udGFpbmVyL0xlYWRpbmdTbGFzaGVzVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbnRhaW5lci9MZWFkaW5nU2xhc2hlc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOWIzYmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbnRhaW5lci9MZWFkaW5nU2xhc2hlc1Rlc3QuamF2YQpAQCAtMCwwICsxLDE1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29udGFpbmVyOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworCitpbXBvcnQgamF2YXgud3MucnMuRW5jb2RlZDsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3RFcXVhbHM7CisKK2ltcG9ydCBzdGF0aWMganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlLmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0IEplcnNleSBjb250YWluZXIgaW1wbGVtZW50YXRpb24gb2YgVVJMIHJlc29sdmluZy4KKyAqIEluIHRoaXMgdGVzdCB0aGVyZSBpcyBubyBjb250ZXh0IHBhdGggdGhhdCBtZWFucyB0aGF0CisgKiBzbGFzaGVzIGluIFVSTCBhcmUgcGFydCBvZiBSZXNvdXJjZSBhZGRyZXNzIGFuZCBjb3VsZG4ndAorICogYmUgZGVsZXRlZC4KKyAqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworcHVibGljIGNsYXNzIExlYWRpbmdTbGFzaGVzVGVzdCBleHRlbmRzIEplcnNleUNvbnRhaW5lclRlc3QgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEFJTkVSX1JFU1BPTlNFID0gIkNvbnRhaW5lci1SZXNwb25zZSI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhTaW1wbGVSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBFbXB0eVJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIEVtcHR5UGF0aFBhcmFtUmVzb3VyY2UuY2xhc3MpOworCisgICAgICAgIHJlc291cmNlQ29uZmlnLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuUkVEVUNFX0NPTlRFWFRfUEFUSF9TTEFTSEVTX0VOQUJMRUQsIHRydWUpOworICAgICAgICByZXR1cm4gcmVzb3VyY2VDb25maWc7CisgICAgfQorCisgICAgQFBhdGgoInNpbXBsZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTaW1wbGVSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGVuY29kZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gQ09OVEFJTkVSX1JFU1BPTlNFOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFbXB0eVBhdGhQYXJhbVJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCJ7YmFyOi4qfS97YmF6Oi4qfS90ZXN0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRIZWxsbyhAUGF0aFBhcmFtKCJiYXIiKSBmaW5hbCBTdHJpbmcgYmFyLCBAUGF0aFBhcmFtKCJiYXoiKSBmaW5hbCBTdHJpbmcgYmF6KSB7CisgICAgICAgICAgICByZXR1cm4gYmFyICsgIi0iICsgYmF6OworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgie2JhcjouKn0ve2JhejouKn0vdGVzdFBhcmFtcyIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgaGVsbG9XaXRoUXVlcnlQYXJhbXMoQFBhdGhQYXJhbSgiYmFyIikgZmluYWwgU3RyaW5nIGJhciwgQFBhdGhQYXJhbSgiYmF6IikgZmluYWwgU3RyaW5nIGJheiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAUXVlcnlQYXJhbSgiYmFyIikgZmluYWwgU3RyaW5nIHF1ZXJ5QmFyLCBAUXVlcnlQYXJhbSgiYmF6IikgZmluYWwgU3RyaW5nIHF1ZXJ5QmF6KSB7CisgICAgICAgICAgICByZXR1cm4gIlBBVEggUEFSQU06ICIgKyBiYXIgKyAiLSIgKyBiYXogKyAiLCBRVUVSWSBQQVJBTSAiICsgcXVlcnlCYXIgKyAiLSIgKyBxdWVyeUJhejsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIntiYXI6Lip9L3tiYXo6Lip9L2VuY29kZWQiKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEVuY29kZWQoQEVuY29kZWQgQFF1ZXJ5UGFyYW0oInF1ZXJ5IikgU3RyaW5nIHF1ZXJ5UGFyYW0pIHsKKyAgICAgICAgICAgIHJldHVybiBxdWVyeVBhcmFtLmVxdWFscygiJTI1ZHVtbXkyMyUyQmEiKSArICI6IiArIHF1ZXJ5UGFyYW07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFbXB0eVJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCIvdGVzdCIpCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SGVsbG8oKSB7CisgICAgICAgICAgICByZXR1cm4gQ09OVEFJTkVSX1JFU1BPTlNFOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlU2xhc2hlcygpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzdWx0ID0gY2FsbCgiL3NpbXBsZSIpOworICAgICAgICBhc3NlcnRFcXVhbHMoQ09OVEFJTkVSX1JFU1BPTlNFLCByZXN1bHQucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICByZXN1bHQgPSBjYWxsKCIvL3NpbXBsZSIpOworICAgICAgICBhc3NlcnROb3RFcXVhbHMoQ09OVEFJTkVSX1JFU1BPTlNFLCByZXN1bHQucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTbGFzaGVzV2l0aEJlZ2lubmluZ0VtcHR5KCkgeworICAgICAgICBSZXNwb25zZSByZXN1bHQgPSBjYWxsKCIvdGVzdCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoQ09OVEFJTkVSX1JFU1BPTlNFLCByZXN1bHQucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTbGFzaGVzV2l0aEJlZ2lubmluZ0VtcHR5UGF0aFBhcmFtKCkgeworICAgICAgICBSZXNwb25zZSByZXN1bHQgPSBjYWxsKCIvLy90ZXN0Iik7CisgICAgICAgIGFzc2VydEVxdWFscygiLSIsIHJlc3VsdC5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNsYXNoZXNXaXRoQmVnaW5uaW5nRW1wdHlQYXRoUGFyYW1XaXRoUXVlcnlQYXJhbXMoKSB7CisgICAgICAgIFVSSSBob3N0UG9ydCA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdC8iKS5wb3J0KGdldFBvcnQoKSkuYnVpbGQoKTsKKyAgICAgICAgV2ViVGFyZ2V0IHRhcmdldCA9IGNsaWVudCgpLnRhcmdldChob3N0UG9ydCkucGF0aCgiLy8vdGVzdFBhcmFtcyIpCisgICAgICAgICAgICAgICAgLnF1ZXJ5UGFyYW0oImJhciIsICJDb250YWluZXIiKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJiYXoiLCAiUmVzcG9uc2UiKTsKKworICAgICAgICBSZXNwb25zZSByZXN1bHQgPSB0YXJnZXQucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlBBVEggUEFSQU06IC0sIFFVRVJZIFBBUkFNIENvbnRhaW5lci1SZXNwb25zZSIsIHJlc3VsdC5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVuY29kZWRRdWVyeVBhcmFtcygpIHsKKyAgICAgICAgVVJJIGhvc3RQb3J0ID0gVXJpQnVpbGRlci5mcm9tVXJpKCJodHRwOi8vbG9jYWxob3N0LyIpLnBvcnQoZ2V0UG9ydCgpKS5idWlsZCgpOworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gY2xpZW50KCkudGFyZ2V0KGhvc3RQb3J0KS5wYXRoKCIvLy9lbmNvZGVkIikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgicXVlcnkiLCAiJWR1bW15MjMrYSIpOworCisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInRydWU6JTI1ZHVtbXkyMyUyQmEiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworCisgICAgcHJpdmF0ZSBSZXNwb25zZSBjYWxsKFN0cmluZyBwYXRoKSB7CisgICAgICAgIFVSSSBob3N0UG9ydCA9IFVyaUJ1aWxkZXIuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdC8iKS5wb3J0KGdldFBvcnQoKSkuYnVpbGQoKTsKKyAgICAgICAgcmV0dXJuIGNsaWVudCgpLnRhcmdldChob3N0UG9ydCkucGF0aChwYXRoKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29udGFpbmVyL01hdHJpeFBhcmFtVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbnRhaW5lci9NYXRyaXhQYXJhbVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDk2ZjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbnRhaW5lci9NYXRyaXhQYXJhbVRlc3QuamF2YQpAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb250YWluZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuTWF0cml4UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIE1hdHJpeFBhcmFtVGVzdCBleHRlbmRzIEplcnNleUNvbnRhaW5lclRlc3QgeworCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoQE1hdHJpeFBhcmFtKCJ4IikgZmluYWwgU3RyaW5nIHgsIEBNYXRyaXhQYXJhbSgieSIpIGZpbmFsIFN0cmluZyB5KSB7CisgICAgICAgICAgICByZXR1cm4geTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hdHJpeFBhcmFtKCkgeworICAgICAgICBhc3NlcnRUaGF0KHRhcmdldCgpLm1hdHJpeFBhcmFtKCJ5IiwgIjEiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyksIGlzKCIxIikpOworICAgICAgICBhc3NlcnRUaGF0KHRhcmdldCgpLm1hdHJpeFBhcmFtKCJ4IiwgIjEiKS5tYXRyaXhQYXJhbSgieSIsICIxJTIwJTJCJTIwMiIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSwgaXMoIjEgKyAyIikpOworICAgICAgICBhc3NlcnRUaGF0KHRhcmdldCgpLm1hdHJpeFBhcmFtKCJ4IiwgIjEiKS5tYXRyaXhQYXJhbSgieSIsICIxJTIwJTI2JTIwMiIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSwgaXMoIjEgJiAyIikpOworICAgICAgICBhc3NlcnRUaGF0KHRhcmdldCgpLm1hdHJpeFBhcmFtKCJ4IiwgIjEiKS5tYXRyaXhQYXJhbSgieSIsICIxJTIwJTdDJTdDJTIwMiIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSwgaXMoIjEgfHwgMiIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29udGFpbmVyL1F1ZXJ5UGFyYW1UZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29udGFpbmVyL1F1ZXJ5UGFyYW1UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U5NTQ3NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb250YWluZXIvUXVlcnlQYXJhbVRlc3QuamF2YQpAQCAtMCwwICsxLDU1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb250YWluZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgUXVlcnlQYXJhbVRlc3QgZXh0ZW5kcyBKZXJzZXlDb250YWluZXJUZXN0IHsKKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKyAgICAgICAgQEdFVAorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldChAUXVlcnlQYXJhbSgieCIpIGZpbmFsIFN0cmluZyB4LCBAUXVlcnlQYXJhbSgieSIpIGZpbmFsIFN0cmluZyB5KSB7CisgICAgICAgICAgICByZXR1cm4geTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFF1ZXJ5UGFyYW0oKSB7CisgICAgICAgIGFzc2VydFRoYXQodGFyZ2V0KCkucXVlcnlQYXJhbSgieSIsICIxICUyQiAyIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpLCBpcygiMSArIDIiKSk7CisgICAgICAgIGFzc2VydFRoYXQodGFyZ2V0KCkucXVlcnlQYXJhbSgieCIsICIxIikucXVlcnlQYXJhbSgieSIsICIxICsgMiIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSwgaXMoIjEgKyAyIikpOworICAgICAgICBhc3NlcnRUaGF0KHRhcmdldCgpLnF1ZXJ5UGFyYW0oIngiLCAiMSIpLnF1ZXJ5UGFyYW0oInkiLCAiMSAlMjYgMiIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSwgaXMoIjEgJiAyIikpOworICAgICAgICBhc3NlcnRUaGF0KHRhcmdldCgpLnF1ZXJ5UGFyYW0oIngiLCAiMSIpLnF1ZXJ5UGFyYW0oInkiLCAiMSAlN0MlN0MgMiIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSwgaXMoIjEgfHwgMiIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29udGFpbmVyL1Jlc3BvbnNlV3JpdGVyTWV0YWRhdGFUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29udGFpbmVyL1Jlc3BvbnNlV3JpdGVyTWV0YWRhdGFUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAzNTQ4OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9jb250YWluZXIvUmVzcG9uc2VXcml0ZXJNZXRhZGF0YVRlc3QuamF2YQpAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29udGFpbmVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZ3JpenpseS5Hcml6emx5VGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5pbm1lbW9yeS5Jbk1lbW9yeVRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuamRraHR0cC5KZGtIdHRwU2VydmVyVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5udWxsVmFsdWU7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNwb25zZVdyaXRlck1ldGFkYXRhVGVzdCBleHRlbmRzIEplcnNleUNvbnRhaW5lclRlc3QgeworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBWYWx1ZUhvbGRlciB7CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgdmFsdWU7CisKKyAgICAgICAgcHVibGljIFZhbHVlSG9sZGVyKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyB2b2lkIHNldFZhbHVlKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisgICAgfQorCisgICAgQFByb3ZpZGVyCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFZhbHVlSG9sZGVyV3JpdGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8VmFsdWVIb2xkZXI+IHsKKworICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShmaW5hbCBDbGFzczw/PiBjLCBmaW5hbCBUeXBlIHQsIGZpbmFsIEFubm90YXRpb25bXSBhcywgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIFZhbHVlSG9sZGVyLmNsYXNzID09IGM7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgbG9uZyBnZXRTaXplKGZpbmFsIFZhbHVlSG9sZGVyIHMsIGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIFZhbHVlSG9sZGVyIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUeXBlIHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICAgICAgaGVhZGVycy5hZGQoIlgtQkVGT1JFLVdSSVRFIiwgImZvbyIpOworICAgICAgICAgICAgb3V0LndyaXRlKHMudmFsdWUuZ2V0Qnl0ZXMoKSk7CisgICAgICAgICAgICBoZWFkZXJzLmFkZCgiWC1BRlRFUi1XUklURSIsICJiYXIiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBWYWx1ZUhvbGRlciBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlSG9sZGVyKCJvbmUiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MsIFZhbHVlSG9sZGVyV3JpdGVyLmNsYXNzKQorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLk9VVEJPVU5EX0NPTlRFTlRfTEVOR1RIX0JVRkZFUiwgMSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzcG9uc2UoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBpcygib25lIikpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiWC1CRUZPUkUtV1JJVEUiKSwgaXMoImZvbyIpKTsKKworICAgICAgICBpZiAoZmFjdG9yeSBpbnN0YW5jZW9mIEluTWVtb3J5VGVzdENvbnRhaW5lckZhY3RvcnkpIHsKKyAgICAgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJYLUFGVEVSLVdSSVRFIiksIGlzKCJiYXIiKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiWC1BRlRFUi1XUklURSIpLCBudWxsVmFsdWUoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29udGFpbmVyL1Jlc3BvbnNlV3JpdGVyT3V0cHV0U3RyZWFtVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbnRhaW5lci9SZXNwb25zZVdyaXRlck91dHB1dFN0cmVhbVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWRjYmM0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbnRhaW5lci9SZXNwb25zZVdyaXRlck91dHB1dFN0cmVhbVRlc3QuamF2YQpAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb250YWluZXI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGhpcyBpcyByZWFsbHkgd2VpcmQgYXBwcm9hY2ggYW5kIHRlc3QuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBSZXNwb25zZVdyaXRlck91dHB1dFN0cmVhbVRlc3QgZXh0ZW5kcyBKZXJzZXlDb250YWluZXJUZXN0IHsKKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgICAgIHB1YmxpYyB2b2lkIGdldChmaW5hbCBDb250YWluZXJSZXF1ZXN0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGNvbnRleHQuZ2V0TWV0aG9kKCksIGlzKCJHRVQiKSk7CisKKyAgICAgICAgICAgIGZpbmFsIENvbnRhaW5lclJlc3BvbnNlIHJlc3BvbnNlID0gbmV3IENvbnRhaW5lclJlc3BvbnNlKGNvbnRleHQsIFJlc3BvbnNlLm9rKCkuYnVpbGQoKSk7CisgICAgICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gb3MgPSBjb250ZXh0LmdldFJlc3BvbnNlV3JpdGVyKCkKKyAgICAgICAgICAgICAgICAgICAgLndyaXRlUmVzcG9uc2VTdGF0dXNBbmRIZWFkZXJzKCJSRVNPVVJDRSIuZ2V0Qnl0ZXMoKS5sZW5ndGgsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgIG9zLndyaXRlKCJSRVNPVVJDRSIuZ2V0Qnl0ZXMoKSk7CisgICAgICAgICAgICBvcy5jbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICAgICAgcHVibGljIHZvaWQgcG9zdChmaW5hbCBDb250YWluZXJSZXF1ZXN0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGNvbnRleHQuZ2V0TWV0aG9kKCksIGlzKCJQT1NUIikpOworCisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcyA9IGNvbnRleHQucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJSRVNPVVJDRSIsIHMpOworCisgICAgICAgICAgICBmaW5hbCBDb250YWluZXJSZXNwb25zZSByZXNwb25zZSA9IG5ldyBDb250YWluZXJSZXNwb25zZShjb250ZXh0LCBSZXNwb25zZS5vaygpLmJ1aWxkKCkpOworICAgICAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtIG9zID0gY29udGV4dC5nZXRSZXNwb25zZVdyaXRlcigpCisgICAgICAgICAgICAgICAgICAgIC53cml0ZVJlc3BvbnNlU3RhdHVzQW5kSGVhZGVycygiUkVTT1VSQ0UiLmdldEJ5dGVzKCkubGVuZ3RoLCByZXNwb25zZSk7CisgICAgICAgICAgICBvcy53cml0ZSgiUkVTT1VSQ0UiLmdldEJ5dGVzKCkpOworICAgICAgICAgICAgb3MuY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldCgpIHsKKyAgICAgICAgYXNzZXJ0VGhhdCh0YXJnZXQoKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyksIGlzKCJSRVNPVVJDRSIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0KCkgeworICAgICAgICBhc3NlcnRUaGF0KHRhcmdldCgpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS50ZXh0KCJSRVNPVVJDRSIpLCBTdHJpbmcuY2xhc3MpLCBpcygiUkVTT1VSQ0UiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QWxsKCkgeworICAgICAgICB0ZXN0R2V0KCk7CisgICAgICAgIHRlc3RQb3N0KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbnRhaW5lci9UcmFpbGluZ1NsYXNoVGVzdC5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL2NvbnRhaW5lci9UcmFpbGluZ1NsYXNoVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NWNiMzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvY29udGFpbmVyL1RyYWlsaW5nU2xhc2hUZXN0LmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29udGFpbmVyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIFRyYWlsaW5nU2xhc2hUZXN0IGV4dGVuZHMgSmVyc2V5Q29udGFpbmVyVGVzdCB7CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiZ2V0IikKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gImdldCI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTbGFzaCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgiZ2V0LyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vU2xhc2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoImdldCIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfdGVzdChmaW5hbCBTdHJpbmcgcGF0aCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldChwYXRoKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBpcygiZ2V0IikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9vYXV0aC9BY2Nlc3NUb2tlblJlc291cmNlLmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvb2F1dGgvQWNjZXNzVG9rZW5SZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMTA4MjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvb2F1dGgvQWNjZXNzVG9rZW5SZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLm9hdXRoOworCitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkub2F1dGgxLnNpZ25hdHVyZS5PQXV0aDFQYXJhbWV0ZXJzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9hdXRoMS5zaWduYXR1cmUuT0F1dGgxU2VjcmV0czsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5vYXV0aDEuc2lnbmF0dXJlLk9BdXRoMVNpZ25hdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5vYXV0aDEuc2lnbmF0dXJlLk9BdXRoMVNpZ25hdHVyZUV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIub2F1dGgxLmludGVybmFsLk9BdXRoU2VydmVyUmVxdWVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKK0BQYXRoKCIvYWNjZXNzX3Rva2VuIikKK3B1YmxpYyBjbGFzcyBBY2Nlc3NUb2tlblJlc291cmNlIHsKKworICAgIEBJbmplY3QKKyAgICBwcml2YXRlIE9BdXRoMVNpZ25hdHVyZSBvQXV0aDFTaWduYXR1cmU7CisKKyAgICBAUE9TVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIFN0cmluZyBwb3N0KEBDb250ZXh0IENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3QpIHsKKworICAgICAgICBPQXV0aFNlcnZlclJlcXVlc3Qgb3NyID0gbmV3IE9BdXRoU2VydmVyUmVxdWVzdChyZXF1ZXN0KTsKKworICAgICAgICBPQXV0aDFTZWNyZXRzIHNlY3JldHMgPSBuZXcgT0F1dGgxU2VjcmV0cygpCisgICAgICAgICAgICAgICAgLmNvbnN1bWVyU2VjcmV0KCJrZDk0aGY5M2s0MjNrZjQ0IikudG9rZW5TZWNyZXQoImhkaGQwMjQ0azlqN2FvMDMiKTsKKworICAgICAgICBPQXV0aDFQYXJhbWV0ZXJzIHBhcmFtcyA9IG5ldyBPQXV0aDFQYXJhbWV0ZXJzKCkucmVhZFJlcXVlc3Qob3NyKTsKKworICAgICAgICAvLyBlbnN1cmUgcXVlcnkgcGFyYW1ldGVycyBjb3JyZWN0bHkgcGFyc2VkIGludG8gT0F1dGggcGFyYW1ldGVycyBvYmplY3QKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBhcmFtcy5nZXRDb25zdW1lcktleSgpLCAiZHBmNDNmM3AybDRrM2wwMyIpOworICAgICAgICBhc3NlcnRFcXVhbHMocGFyYW1zLmdldFRva2VuKCksICJoaDVzOTNqNGhkaWRwb2xhIik7CisgICAgICAgIGFzc2VydEVxdWFscyhwYXJhbXMuZ2V0U2lnbmF0dXJlTWV0aG9kKCksICJQTEFJTlRFWFQiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBhcmFtcy5nZXRTaWduYXR1cmUoKSwgc2VjcmV0cy5nZXRDb25zdW1lclNlY3JldCgpICsgIiYiICsgc2VjcmV0cy5nZXRUb2tlblNlY3JldCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBhcmFtcy5nZXRUaW1lc3RhbXAoKSwgIjExOTEyNDIwOTIiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBhcmFtcy5nZXROb25jZSgpLCAiZGppNDMwc3BsbXgzMzQ0OCIpOworICAgICAgICBhc3NlcnRFcXVhbHMocGFyYW1zLmdldFZlcnNpb24oKSwgIjEuMCIpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyB2ZXJpZnkgdGhlIHBsYWludGV4dCBzaWduYXR1cmUKKyAgICAgICAgICAgIGFzc2VydFRydWUob0F1dGgxU2lnbmF0dXJlLnZlcmlmeShvc3IsIHBhcmFtcywgc2VjcmV0cykpOworICAgICAgICB9IGNhdGNoIChPQXV0aDFTaWduYXR1cmVFeGNlcHRpb24gb3NlKSB7CisgICAgICAgICAgICBmYWlsKG9zZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICJvYXV0aF90b2tlbj1ubmNoNzM0ZDAwc2wyamRrJm9hdXRoX3Rva2VuX3NlY3JldD1wZmtrZGhpOXNsM3I0czAwIjsKKyAgICB9CisKK30KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL29hdXRoL09BdXRoMlRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9vYXV0aC9PQXV0aDJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzczMjNjNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9vYXV0aC9PQXV0aDJUZXN0LmphdmEKQEAgLTAsMCArMSwyNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLm9hdXRoOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5CYWRSZXF1ZXN0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLkRlZmF1bHRWYWx1ZTsKK2ltcG9ydCBqYXZheC53cy5ycy5Gb3JtUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLkhlYWRlclBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEF0dHJpYnV0ZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50Lm9hdXRoMi5DbGllbnRJZGVudGlmaWVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5vYXV0aDIuT0F1dGgyQ2xpZW50U3VwcG9ydDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQub2F1dGgyLk9BdXRoMkNvZGVHcmFudEZsb3c7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50Lm9hdXRoMi5PQXV0aDJQYXJhbWV0ZXJzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5vYXV0aDIuVG9rZW5SZXN1bHQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb3h5Lmpzb24uTW94eUpzb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5oYXNJdGVtOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIFRlc3RzIE9BdXRoIDIgY2xpZW50LgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIE9BdXRoMlRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTVEFURSA9ICI0NTY0ZHNmNTQ2NTRmc2RhNjU0YWYiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT0RFID0gImNvZGUteHl6IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJRU5UX1BVQkxJQyA9ICJjbGllbnRQdWJsaWMiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTElFTlRfU0VDUkVUID0gImNsaWVudFNlY3JldCI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKE1veHlKc29uRmVhdHVyZS5jbGFzcywgQXV0aG9yaXphdGlvblJlc291cmNlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihuZXcgTG9nZ2luZ0ZlYXR1cmUoTG9nZ2VyLmdldEFub255bW91c0xvZ2dlcigpLCBMb2dnaW5nRmVhdHVyZS5WZXJib3NpdHkuUEFZTE9BRF9BTlkpKTsKKyAgICB9CisKKyAgICBAUGF0aCgib2F1dGgiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQXV0aG9yaXphdGlvblJlc291cmNlIHsKKworICAgICAgICBAUE9TVAorICAgICAgICBAUGF0aCgiYWNjZXNzLXRva2VuIikKKyAgICAgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorICAgICAgICBwdWJsaWMgTXlUb2tlblJlc3VsdCBnZXRBY2Nlc3NUb2tlbihARm9ybVBhcmFtKCJncmFudF90eXBlIikgU3RyaW5nIGdyYW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQEZvcm1QYXJhbSgiY29kZSIpIFN0cmluZyBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBARm9ybVBhcmFtKCJyZWRpcmVjdF91cmkiKSBTdHJpbmcgcmVkaXJlY3RVcmksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBGb3JtUGFyYW0oImNsaWVudF9pZCIpIFN0cmluZyBjbGllbnRJZCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImF1dGhvcml6YXRpb25fY29kZSIsIGdyYW50VHlwZSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ1cm46aWV0Zjp3ZzpvYXV0aDoyLjA6b29iIiwgcmVkaXJlY3RVcmkpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhDT0RFLCBjb2RlKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoQ0xJRU5UX1BVQkxJQywgY2xpZW50SWQpOworICAgICAgICAgICAgfSBjYXRjaCAoQXNzZXJ0aW9uRXJyb3IgZSkgeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oUmVzcG9uc2Uuc3RhdHVzKDQwMCkuZW50aXR5KGUuZ2V0TWVzc2FnZSgpKS5idWlsZCgpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgTXlUb2tlblJlc3VsdCBteVRva2VuUmVzdWx0ID0gbmV3IE15VG9rZW5SZXN1bHQoKTsKKyAgICAgICAgICAgIG15VG9rZW5SZXN1bHQuc2V0QWNjZXNzVG9rZW4oImFjY2Vzcy10b2tlbi1hYWI5OTlmIik7CisgICAgICAgICAgICBteVRva2VuUmVzdWx0LnNldEV4cGlyZXNJbigiMzYwMCIpOworICAgICAgICAgICAgbXlUb2tlblJlc3VsdC5zZXRUb2tlblR5cGUoImFjY2Vzcy10b2tlbiIpOworICAgICAgICAgICAgbXlUb2tlblJlc3VsdC5zZXRSZWZyZXNoVG9rZW4oInJlZnJlc2gteHl6Iik7CisgICAgICAgICAgICByZXR1cm4gbXlUb2tlblJlc3VsdDsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoImF1dGhvcml6YXRpb24iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGF1dGhvcml6YXRpb24oQFF1ZXJ5UGFyYW0oInN0YXRlIikgU3RyaW5nIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQFF1ZXJ5UGFyYW0oInJlc3BvbnNlX3R5cGUiKSBTdHJpbmcgcmVzcG9uc2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQFF1ZXJ5UGFyYW0oInNjb3BlIikgU3RyaW5nIHNjb3BlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQFF1ZXJ5UGFyYW0oInJlYWRPbmx5IikgU3RyaW5nIHJlYWRPbmx5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQFF1ZXJ5UGFyYW0oInJlZGlyZWN0X3VyaSIpIFN0cmluZyByZWRpcmVjdFVyaSkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImNvZGUiLCByZXNwb25zZVR5cGUpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscyhTVEFURSwgc3RhdGUpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygidXJuOmlldGY6d2c6b2F1dGg6Mi4wOm9vYiIsIHJlZGlyZWN0VXJpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoImNvbnRhY3QiLCBzY29wZSk7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0cnVlIiwgcmVhZE9ubHkpOworICAgICAgICAgICAgfSBjYXRjaCAoQXNzZXJ0aW9uRXJyb3IgZSkgeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oUmVzcG9uc2Uuc3RhdHVzKDQwMCkuZW50aXR5KGUuZ2V0TWVzc2FnZSgpKS5idWlsZCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDT0RFOworICAgICAgICB9CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFBhdGgoInJlZnJlc2gtdG9rZW4iKQorICAgICAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisgICAgICAgIHB1YmxpYyBTdHJpbmcgcmVmcmVzaFRva2VuKEBGb3JtUGFyYW0oImdyYW50X3R5cGUiKSBTdHJpbmcgZ3JhbnRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBARm9ybVBhcmFtKCJyZWZyZXNoX3Rva2VuIikgU3RyaW5nIHJlZnJlc2hUb2tlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQEhlYWRlclBhcmFtKCJpc0FycmF5IikgQERlZmF1bHRWYWx1ZSgiZmFsc2UiKSBib29sZWFuIGlzQXJyYXkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZWZyZXNoX3Rva2VuIiwgZ3JhbnRUeXBlKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInJlZnJlc2gteHl6IiwgcmVmcmVzaFRva2VuKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEFzc2VydGlvbkVycm9yIGUpIHsKKyAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKFJlc3BvbnNlLnN0YXR1cyg0MDApLmVudGl0eShlLmdldE1lc3NhZ2UoKSkuYnVpbGQoKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHJldHVybiBpc0FycmF5CisgICAgICAgICAgICAgICAgICAgID8gIntcImFjY2Vzc190b2tlblwiOltcImFjY2Vzcy10b2tlbi1uZXdcIl0sXCJleHBpcmVzX2luXCI6XCIzNjAwXCIsXCJ0b2tlbl90eXBlXCI6XCJhY2Nlc3MtdG9rZW5cIn0iCisgICAgICAgICAgICAgICAgICAgIDogIntcImFjY2Vzc190b2tlblwiOlwiYWNjZXNzLXRva2VuLW5ld1wiLFwiZXhwaXJlc19pblwiOlwiMzYwMFwiLFwidG9rZW5fdHlwZVwiOlwiYWNjZXNzLXRva2VuXCJ9IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZsb3coKSB7CisgICAgICAgIHRlc3RGbG93KGZhbHNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGbG93V2l0aEFycmF5SW5SZXNwb25zZSgpIHsKKyAgICAgICAgdGVzdEZsb3codHJ1ZSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RGbG93KGZpbmFsIGJvb2xlYW4gaXNBcnJheSkgeworICAgICAgICBDbGllbnRJZGVudGlmaWVyIGNsaWVudElkID0gbmV3IENsaWVudElkZW50aWZpZXIoQ0xJRU5UX1BVQkxJQywgQ0xJRU5UX1NFQ1JFVCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBhdXRoVXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKGdldEJhc2VVcmkoKSkucGF0aCgib2F1dGgiKS5wYXRoKCJhdXRob3JpemF0aW9uIikuYnVpbGQoKS50b1N0cmluZygpOworICAgICAgICBmaW5hbCBTdHJpbmcgYWNjZXNzVG9rZW5VcmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoZ2V0QmFzZVVyaSgpKS5wYXRoKCJvYXV0aCIpLnBhdGgoImFjY2Vzcy10b2tlbiIpLmJ1aWxkKCkudG9TdHJpbmcoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlZnJlc2hUb2tlblVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaShnZXRCYXNlVXJpKCkpLnBhdGgoIm9hdXRoIikucGF0aCgicmVmcmVzaC10b2tlbiIpLmJ1aWxkKCkudG9TdHJpbmcoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHN0YXRlID0gU1RBVEU7CisKKyAgICAgICAgZmluYWwgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KCk7CisgICAgICAgIGlmIChpc0FycmF5KSB7CisgICAgICAgICAgICBjbGllbnQucmVnaXN0ZXIobmV3IENsaWVudFJlcXVlc3RGaWx0ZXIoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZmlsdGVyKGZpbmFsIENsaWVudFJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Q29udGV4dC5nZXRIZWFkZXJzKCkucHV0U2luZ2xlKCJpc0FycmF5IiwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBPQXV0aDJDb2RlR3JhbnRGbG93LkJ1aWxkZXIgYnVpbGRlciA9CisgICAgICAgICAgICAgICAgT0F1dGgyQ2xpZW50U3VwcG9ydC5hdXRob3JpemF0aW9uQ29kZUdyYW50Rmxvd0J1aWxkZXIoY2xpZW50SWQsIGF1dGhVcmksIGFjY2Vzc1Rva2VuVXJpKTsKKyAgICAgICAgZmluYWwgT0F1dGgyQ29kZUdyYW50RmxvdyBmbG93ID0gYnVpbGRlcgorICAgICAgICAgICAgICAgIC5jbGllbnQoY2xpZW50KQorICAgICAgICAgICAgICAgIC5yZWZyZXNoVG9rZW5VcmkocmVmcmVzaFRva2VuVXJpKQorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShPQXV0aDJDb2RlR3JhbnRGbG93LlBoYXNlLkFVVEhPUklaQVRJT04sICJyZWFkT25seSIsICJ0cnVlIikKKyAgICAgICAgICAgICAgICAucHJvcGVydHkoT0F1dGgyQ29kZUdyYW50Rmxvdy5QaGFzZS5BVVRIT1JJWkFUSU9OLCBPQXV0aDJQYXJhbWV0ZXJzLlNUQVRFLCBzdGF0ZSkKKyAgICAgICAgICAgICAgICAuc2NvcGUoImNvbnRhY3QiKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgICAgICBmaW5hbCBTdHJpbmcgZmluYWxBdXRob3JpemF0aW9uVXJpID0gZmxvdy5zdGFydCgpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKS50YXJnZXQoZmluYWxBdXRob3JpemF0aW9uVXJpKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgY29kZSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKENPREUsIGNvZGUpOworCisgICAgICAgIGZpbmFsIFRva2VuUmVzdWx0IHJlc3VsdCA9IGZsb3cuZmluaXNoKGNvZGUsIHN0YXRlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJhY2Nlc3MtdG9rZW4tYWFiOTk5ZiIsIHJlc3VsdC5nZXRBY2Nlc3NUb2tlbigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBMb25nKDM2MDApLCByZXN1bHQuZ2V0RXhwaXJlc0luKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImFjY2Vzcy10b2tlbiIsIHJlc3VsdC5nZXRUb2tlblR5cGUoKSk7CisKKyAgICAgICAgZmluYWwgVG9rZW5SZXN1bHQgcmVmcmVzaFJlc3VsdCA9IGZsb3cucmVmcmVzaEFjY2Vzc1Rva2VuKHJlc3VsdC5nZXRSZWZyZXNoVG9rZW4oKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYWNjZXNzLXRva2VuLW5ldyIsIHJlZnJlc2hSZXN1bHQuZ2V0QWNjZXNzVG9rZW4oKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhuZXcgTG9uZygzNjAwKSwgcmVmcmVzaFJlc3VsdC5nZXRFeHBpcmVzSW4oKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYWNjZXNzLXRva2VuIiwgcmVmcmVzaFJlc3VsdC5nZXRUb2tlblR5cGUoKSk7CisKKyAgICAgICAgaWYgKGlzQXJyYXkpIHsKKyAgICAgICAgICAgIGZpbmFsIENvbGxlY3Rpb248U3RyaW5nPiBhcnJheSA9IChDb2xsZWN0aW9uPFN0cmluZz4pIHJlZnJlc2hSZXN1bHQuZ2V0QWxsUHJvcGVydGllcygpLmdldCgiYWNjZXNzX3Rva2VuIik7CisKKyAgICAgICAgICAgIGFzc2VydFRoYXQoYXJyYXkuc2l6ZSgpLCBpcygxKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KGFycmF5LCBoYXNJdGVtKCJhY2Nlc3MtdG9rZW4tbmV3IikpOworICAgICAgICB9CisgICAgfQorCisgICAgQFhtbFJvb3RFbGVtZW50CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVRva2VuUmVzdWx0IHsKKworICAgICAgICBAWG1sQXR0cmlidXRlKG5hbWUgPSAiYWNjZXNzX3Rva2VuIikKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgYWNjZXNzVG9rZW47CisgICAgICAgIEBYbWxBdHRyaWJ1dGUobmFtZSA9ICJleHBpcmVzX2luIikKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZXhwaXJlc0luOworICAgICAgICBAWG1sQXR0cmlidXRlKG5hbWUgPSAidG9rZW5fdHlwZSIpCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHRva2VuVHlwZTsKKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFJlZnJlc2hUb2tlbigpIHsKKyAgICAgICAgICAgIHJldHVybiByZWZyZXNoVG9rZW47CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRSZWZyZXNoVG9rZW4oU3RyaW5nIHJlZnJlc2hUb2tlbikgeworICAgICAgICAgICAgdGhpcy5yZWZyZXNoVG9rZW4gPSByZWZyZXNoVG9rZW47CisgICAgICAgIH0KKworICAgICAgICBAWG1sQXR0cmlidXRlKG5hbWUgPSAicmVmcmVzaF90b2tlbiIpCisgICAgICAgIHByaXZhdGUgU3RyaW5nIHJlZnJlc2hUb2tlbjsKKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEFjY2Vzc1Rva2VuKCkgeworICAgICAgICAgICAgcmV0dXJuIGFjY2Vzc1Rva2VuOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0QWNjZXNzVG9rZW4oU3RyaW5nIGFjY2Vzc1Rva2VuKSB7CisgICAgICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuID0gYWNjZXNzVG9rZW47CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEV4cGlyZXNJbigpIHsKKyAgICAgICAgICAgIHJldHVybiBleHBpcmVzSW47CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRFeHBpcmVzSW4oU3RyaW5nIGV4cGlyZXNJbikgeworICAgICAgICAgICAgdGhpcy5leHBpcmVzSW4gPSBleHBpcmVzSW47CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFRva2VuVHlwZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB0b2tlblR5cGU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRUb2tlblR5cGUoU3RyaW5nIHRva2VuVHlwZSkgeworICAgICAgICAgICAgdGhpcy50b2tlblR5cGUgPSB0b2tlblR5cGU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvb2F1dGgvT0F1dGhDbGllbnRTZXJ2ZXJUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvb2F1dGgvT0F1dGhDbGllbnRTZXJ2ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMzZTcyNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9vYXV0aC9PQXV0aENsaWVudFNlcnZlclRlc3QuamF2YQpAQCAtMCwwICsxLDIzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUub2F1dGg7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS5zZWN1cml0eS5QcmluY2lwYWw7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkSGFzaE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuU2VjdXJpdHlDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQub2F1dGgxLkFjY2Vzc1Rva2VuOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5vYXV0aDEuQ29uc3VtZXJDcmVkZW50aWFsczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQub2F1dGgxLk9BdXRoMUF1dGhvcml6YXRpb25GbG93OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5vYXV0aDEuT0F1dGgxQ2xpZW50U3VwcG9ydDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIub2F1dGgxLkRlZmF1bHRPQXV0aDFQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIub2F1dGgxLk9BdXRoMVByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5vYXV0aDEuT0F1dGgxU2VydmVyRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIub2F1dGgxLk9BdXRoMVNlcnZlclByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitpbXBvcnQgY29tLnN1bi5zZWN1cml0eS5hdXRoLlVzZXJQcmluY2lwYWw7CisKKy8qKgorICogVGVzdHMgY2xpZW50IGFuZCBzZXJ2ZXIgT0F1dGggMSBmdW5jdGlvbmFsaXR5LgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIE9BdXRoQ2xpZW50U2VydmVyVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFNFQ1JFVF9DT05TVU1FUl9LRVkgPSAic2VjcmV0LWNvbnN1bWVyLWtleSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlNVTUVSX0tFWSA9ICJteS1jb25zdW1lci1rZXkiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05TVU1FUl9OQU1FID0gIm15LWNvbnN1bWVyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPTUVUSEVVU19UT0tFTiA9ICJwcm9tZXRoZXVzLXRva2VuIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJPTUVUSEVVU19TRUNSRVQgPSAicHJvbWV0aGV1cy1zZWNyZXQiOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKworICAgICAgICBmaW5hbCBEZWZhdWx0T0F1dGgxUHJvdmlkZXIgb0F1dGhQcm92aWRlciA9IG5ldyBEZWZhdWx0T0F1dGgxUHJvdmlkZXIoKTsKKyAgICAgICAgb0F1dGhQcm92aWRlci5yZWdpc3RlckNvbnN1bWVyKENPTlNVTUVSX05BTUUsIENPTlNVTUVSX0tFWSwKKyAgICAgICAgICAgICAgICBTRUNSRVRfQ09OU1VNRVJfS0VZLCBuZXcgTXVsdGl2YWx1ZWRIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpKTsKKworICAgICAgICBmaW5hbCBQcmluY2lwYWwgcHJvbWV0aGV1c1ByaW5jaXBhbCA9IG5ldyBQcmluY2lwYWwoKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gInByb21ldGhldXMiOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIG9BdXRoUHJvdmlkZXIuYWRkQWNjZXNzVG9rZW4oUFJPTUVUSEVVU19UT0tFTiwgUFJPTUVUSEVVU19TRUNSRVQsIENPTlNVTUVSX0tFWSwKKyAgICAgICAgICAgICAgICAiaHR0cDovL2NhbGxiYWNrLnVybCIsIHByb21ldGhldXNQcmluY2lwYWwsCisgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgiYWRtaW4iLCAidXNlciIpLnN0cmVhbSgpLmNvbGxlY3QoQ29sbGVjdG9ycy50b1NldCgpKSwKKyAgICAgICAgICAgICAgICBuZXcgTXVsdGl2YWx1ZWRIYXNoTWFwPFN0cmluZywgU3RyaW5nPigpKTsKKyAgICAgICAgZmluYWwgT0F1dGgxU2VydmVyRmVhdHVyZSBvQXV0aDFTZXJ2ZXJGZWF0dXJlID0gbmV3IE9BdXRoMVNlcnZlckZlYXR1cmUob0F1dGhQcm92aWRlciwKKyAgICAgICAgICAgICAgICAicmVxdWVzdFRva2VuU3BlY2lhbFVyaSIsICJhY2Nlc3NUb2tlblNwZWNpYWxVcmkiKTsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucmVnaXN0ZXIob0F1dGgxU2VydmVyRmVhdHVyZSk7CisgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVyKE15UHJvdGVjdGVkUmVzb3VyY2UuY2xhc3MpOworICAgICAgICByZXNvdXJjZUNvbmZpZy5yZWdpc3RlcihuZXcgTG9nZ2luZ0ZlYXR1cmUoTG9nZ2VyLmdldExvZ2dlcihPQXV0aENsaWVudFNlcnZlclRlc3QuY2xhc3MuZ2V0TmFtZSgpKSwKKyAgICAgICAgICAgICAgICBMb2dnaW5nRmVhdHVyZS5WZXJib3NpdHkuUEFZTE9BRF9BTlkpKTsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucmVnaXN0ZXIoT0F1dGhBdXRob3JpemF0aW9uUmVzb3VyY2UuY2xhc3MpOworICAgICAgICByZXNvdXJjZUNvbmZpZy5wcm9wZXJ0eShPQXV0aDFTZXJ2ZXJQcm9wZXJ0aWVzLlRJTUVTVEFNUF9VTklULCAiU0VDT05EUyIpOworICAgICAgICByZXNvdXJjZUNvbmZpZy5wcm9wZXJ0eShPQXV0aDFTZXJ2ZXJQcm9wZXJ0aWVzLk1BWF9OT05DRV9DQUNIRV9TSVpFLCAyMCk7CisgICAgICAgIHJldHVybiByZXNvdXJjZUNvbmZpZzsKKyAgICB9CisKKyAgICBAUGF0aCgicmVzb3VyY2UiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlQcm90ZWN0ZWRSZXNvdXJjZSB7CisKKyAgICAgICAgQENvbnRleHQKKyAgICAgICAgcHJpdmF0ZSBTZWN1cml0eUNvbnRleHQgc2VjdXJpdHlDb250ZXh0OworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gc2VjdXJpdHlDb250ZXh0LmdldFVzZXJQcmluY2lwYWwoKS5nZXROYW1lKCk7CisgICAgICAgIH0KKworICAgICAgICBAUGF0aCgiYWRtaW4iKQorICAgICAgICBAR0VUCisgICAgICAgIHB1YmxpYyBib29sZWFuIGdldEZvbygpIHsKKyAgICAgICAgICAgIHJldHVybiBzZWN1cml0eUNvbnRleHQuaXNVc2VySW5Sb2xlKCJhZG1pbiIpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInVzZXItYXV0aG9yaXphdGlvbiIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBPQXV0aEF1dGhvcml6YXRpb25SZXNvdXJjZSB7CisKKyAgICAgICAgQEluamVjdAorICAgICAgICBwcml2YXRlIE9BdXRoMVByb3ZpZGVyIHByb3ZpZGVyOworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBtdXN0QmVHZXRNZXRob2QoQFF1ZXJ5UGFyYW0oIm9hdXRoX3Rva2VuIikgU3RyaW5nIHRva2VuKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlRva2VuIHJlY2VpdmVkIGZyb20gdXNlcjogIiArIHRva2VuKTsKKyAgICAgICAgICAgIGZpbmFsIERlZmF1bHRPQXV0aDFQcm92aWRlciBkZWZQcm92aWRlciA9IChEZWZhdWx0T0F1dGgxUHJvdmlkZXIpIHByb3ZpZGVyOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJodHRwOi8vY29uc3VtZXIvY2FsbGJhY2svaG9tZXIiLCBkZWZQcm92aWRlci5nZXRSZXF1ZXN0VG9rZW4odG9rZW4pLmdldENhbGxiYWNrVXJsKCkpOworCisgICAgICAgICAgICByZXR1cm4gZGVmUHJvdmlkZXIuYXV0aG9yaXplVG9rZW4oCisgICAgICAgICAgICAgICAgICAgIGRlZlByb3ZpZGVyLmdldFJlcXVlc3RUb2tlbih0b2tlbiksCisgICAgICAgICAgICAgICAgICAgIG5ldyBVc2VyUHJpbmNpcGFsKCJob21lciIpLAorICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zaW5nbGV0b24oInVzZXIiKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBjbGllbnQgYW5kIHNlcnZlciBPQXV0aC4KKyAgICAgKiA8cC8+CisgICAgICogVGVzdHMgYXV0aG9yaXphdGlvbiBmbG93IGluY2x1ZGluZyB0aGUgcmVxdWVzdCB0byBhIHByb3RlY3RlZCByZXNvdXJjZS4gVGhlIHRlc3QgdXNlcyB7QGxpbmsgT0F1dGgxQXV0aG9yaXphdGlvbkZsb3d9CisgICAgICogdG8gcGVyZm9ybSB1c2VyIGF1dGhvcml6YXRpb24gYW5kIHVzZXMgYXV0aG9yaXplZCBjbGllbnQgZm9yIHJlcXVlc3RpbmcgcHJvdGVjdGVkIHJlc291cmNlLgorICAgICAqIDxwLz4KKyAgICAgKiBUaGUgcmVzb3VyY2Uge0BsaW5rIE9BdXRoQXV0aG9yaXphdGlvblJlc291cmNlfSBpcyB1c2VkIHRvIHBlcmZvcm0gdXNlciBhdXRob3JpemF0aW9uICh0aGlzIGlzIGRvbmUKKyAgICAgKiBwcm9ncmFtbWF0aWNhbGx5IGZyb20gdGhlIHRlc3QpLiBGaW5hbGx5LCB0aGUgQWNjZXNzIFRva2VuIGlzIHJldHJpZXZlZCBhbmQgdXNlZCB0byByZXF1ZXN0IHRoZQorICAgICAqIHByb3RlY3RlZCByZXNvdXJjZS4gSW4gdGhpcyByZXNvdXJjZSB0aGUgdXNlciBwcmluY2lwYWwgaXMgdXNlZCB0byByZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHVzZXIgc3RvcmVkCisgICAgICogaW4ge0BsaW5rIFNlY3VyaXR5Q29udGV4dH0uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXV0aG9yaXphdGlvbkZsb3coKSB7CisgICAgICAgIFN0cmluZyB0ZW1wQ3JlZFVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaShnZXRCYXNlVXJpKCkpLnBhdGgoInJlcXVlc3RUb2tlblNwZWNpYWxVcmkiKS5idWlsZCgpLnRvU3RyaW5nKCk7CisgICAgICAgIFN0cmluZyBhY2Nlc3NUb2tlblVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaShnZXRCYXNlVXJpKCkpLnBhdGgoImFjY2Vzc1Rva2VuU3BlY2lhbFVyaSIpLmJ1aWxkKCkudG9TdHJpbmcoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHVzZXJBdXRob3JpemF0aW9uVXJpID0gVXJpQnVpbGRlci5mcm9tVXJpKGdldEJhc2VVcmkoKSkucGF0aCgidXNlci1hdXRob3JpemF0aW9uIikuYnVpbGQoKS50b1N0cmluZygpOworICAgICAgICBmaW5hbCBPQXV0aDFBdXRob3JpemF0aW9uRmxvdyBhdXRoRmxvdyA9IE9BdXRoMUNsaWVudFN1cHBvcnQKKyAgICAgICAgICAgICAgICAuYnVpbGRlcihuZXcgQ29uc3VtZXJDcmVkZW50aWFscyhDT05TVU1FUl9LRVksIFNFQ1JFVF9DT05TVU1FUl9LRVkpKQorICAgICAgICAgICAgICAgIC5hdXRob3JpemF0aW9uRmxvdyh0ZW1wQ3JlZFVyaSwgYWNjZXNzVG9rZW5VcmksIHVzZXJBdXRob3JpemF0aW9uVXJpKQorICAgICAgICAgICAgICAgIC5jYWxsYmFja1VyaSgiaHR0cDovL2NvbnN1bWVyL2NhbGxiYWNrL2hvbWVyIikuYnVpbGQoKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgYXV0aFVyaSA9IGF1dGhGbG93LnN0YXJ0KCk7CisgICAgICAgIC8vIGF1dGhvcml6ZSBieSBhIHJlcXVlc3QgdG8gYXV0aG9yaXphdGlvbiBVUkkKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgdXNlckF1dGhSZXNwb25zZSA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KCkudGFyZ2V0KGF1dGhVcmkpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgdXNlckF1dGhSZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyB2ZXJpZmllciA9IHVzZXJBdXRoUmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlZlcmlmaWVyOiAiICsgdmVyaWZpZXIpOworCisgICAgICAgIGF1dGhGbG93LmZpbmlzaCh2ZXJpZmllcik7CisgICAgICAgIGZpbmFsIENsaWVudCBhdXRob3JpemVkQ2xpZW50ID0gYXV0aEZsb3cuZ2V0QXV0aG9yaXplZENsaWVudCgpOworCisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gYXV0aG9yaXplZENsaWVudC50YXJnZXQoZ2V0QmFzZVVyaSgpKS5wYXRoKCJyZXNvdXJjZSIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImhvbWVyIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICByZXNwb25zZSA9IGF1dGhvcml6ZWRDbGllbnQudGFyZ2V0KGdldEJhc2VVcmkoKSkucGF0aCgicmVzb3VyY2UiKS5wYXRoKCJhZG1pbiIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHJlc3BvbnNlLnJlYWRFbnRpdHkoYm9vbGVhbi5jbGFzcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQub2F1dGgxLk9BdXRoMUNsaWVudEZpbHRlcn0gYWxyZWFkeSBjb25maWd1cmVkIHdpdGggQWNjZXNzIFRva2VuIGZvciBzaWduYXR1cmUKKyAgICAgKiBwdXJwb3NlcyBvbmx5LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcXVlc3RTaWduaW5nKCkgeworICAgICAgICBmaW5hbCBGZWF0dXJlIGZpbHRlckZlYXR1cmUgPSBPQXV0aDFDbGllbnRTdXBwb3J0LmJ1aWxkZXIoCisgICAgICAgICAgICAgICAgbmV3IENvbnN1bWVyQ3JlZGVudGlhbHMoQ09OU1VNRVJfS0VZLCBTRUNSRVRfQ09OU1VNRVJfS0VZKSkuZmVhdHVyZSgpCisgICAgICAgICAgICAgICAgLmFjY2Vzc1Rva2VuKG5ldyBBY2Nlc3NUb2tlbihQUk9NRVRIRVVTX1RPS0VOLCBQUk9NRVRIRVVTX1NFQ1JFVCkpLmJ1aWxkKCk7CisgICAgICAgIGZpbmFsIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihmaWx0ZXJGZWF0dXJlKS5idWlsZCgpOworICAgICAgICBmaW5hbCBVUkkgcmVzb3VyY2VVcmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoZ2V0QmFzZVVyaSgpKS5wYXRoKCJyZXNvdXJjZSIpLmJ1aWxkKCk7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSBjbGllbnQudGFyZ2V0KHJlc291cmNlVXJpKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTU7IGkrKykgeworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJyZXF1ZXN0OiAiICsgaSk7CisgICAgICAgICAgICByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoInByb21ldGhldXMiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQucGF0aCgiYWRtaW4iKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVzcG9uc2UucmVhZEVudGl0eShib29sZWFuLmNsYXNzKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0cyBjb25maWd1cmF0aW9uIG9mIHRoZSBub25jZSBjYWNoZSBvbiB0aGUgc2VydmVyIHNpZGUuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWVzdFNpZ25pbmdXaXRoRXhjZWVkaW5nQ2FjaGUoKSB7CisgICAgICAgIGZpbmFsIEZlYXR1cmUgZmlsdGVyRmVhdHVyZSA9IE9BdXRoMUNsaWVudFN1cHBvcnQuYnVpbGRlcigKKyAgICAgICAgICAgICAgICBuZXcgQ29uc3VtZXJDcmVkZW50aWFscyhDT05TVU1FUl9LRVksIFNFQ1JFVF9DT05TVU1FUl9LRVkpKS5mZWF0dXJlKCkKKyAgICAgICAgICAgICAgICAuYWNjZXNzVG9rZW4obmV3IEFjY2Vzc1Rva2VuKFBST01FVEhFVVNfVE9LRU4sIFBST01FVEhFVVNfU0VDUkVUKSkuYnVpbGQoKTsKKyAgICAgICAgZmluYWwgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3QnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKGZpbHRlckZlYXR1cmUpLmJ1aWxkKCk7CisgICAgICAgIGZpbmFsIFVSSSByZXNvdXJjZVVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaShnZXRCYXNlVXJpKCkpLnBhdGgoInJlc291cmNlIikuYnVpbGQoKTsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IGNsaWVudC50YXJnZXQocmVzb3VyY2VVcmkpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInJlcXVlc3Q6ICIgKyBpKTsKKyAgICAgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygicHJvbWV0aGV1cyIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgICAgICBpKys7CisgICAgICAgICAgICByZXNwb25zZSA9IHRhcmdldC5wYXRoKCJhZG1pbiIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyh0cnVlLCByZXNwb25zZS5yZWFkRW50aXR5KGJvb2xlYW4uY2xhc3MpKTsKKyAgICAgICAgfQorICAgICAgICAvLyBub3cgdGhlIG5vbmNlIGNhY2hlIGlzIGZ1bGwKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDAxLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL29hdXRoL09hdXRoQ2xpZW50QXV0aG9yaXphdGlvbkZsb3dUZXN0LmphdmEgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvb2F1dGgvT2F1dGhDbGllbnRBdXRob3JpemF0aW9uRmxvd1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDc3NzJlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL29hdXRoL09hdXRoQ2xpZW50QXV0aG9yaXphdGlvbkZsb3dUZXN0LmphdmEKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLm9hdXRoOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CitpbXBvcnQgamF2YS5uZXQuVVJJOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQub2F1dGgxLkFjY2Vzc1Rva2VuOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5vYXV0aDEuQ29uc3VtZXJDcmVkZW50aWFsczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQub2F1dGgxLk9BdXRoMUF1dGhvcml6YXRpb25GbG93OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5vYXV0aDEuT0F1dGgxQnVpbGRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQub2F1dGgxLk9BdXRoMUNsaWVudFN1cHBvcnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5vYXV0aDEuc2lnbmF0dXJlLk9BdXRoMVBhcmFtZXRlcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkub2F1dGgxLnNpZ25hdHVyZS5PQXV0aDFTaWduYXR1cmVGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9hdXRoMS5zaWduYXR1cmUuUGxhaW50ZXh0TWV0aG9kOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5ncml6emx5LkdyaXp6bHlUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuY29udGFpbnNTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworcHVibGljIGNsYXNzIE9hdXRoQ2xpZW50QXV0aG9yaXphdGlvbkZsb3dUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEFjY2Vzc1Rva2VuUmVzb3VyY2UuY2xhc3MsIFBob3Rvc1Jlc291cmNlLmNsYXNzLCBSZXF1ZXN0VG9rZW5SZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBPQXV0aDFTaWduYXR1cmVGZWF0dXJlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgR3JpenpseVRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgbWFpbmx5IHRoZSBjbGllbnQgZnVuY3Rpb25hbGl0eS4gVGhlIHRlc3QgY2xpZW50IHJlZ2lzdGVycworICAgICAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQub2F1dGgxLk9BdXRoMUNsaWVudEZpbHRlcn0gYW5kIHVzZXMgdGhlIGZpbHRlciBvbmx5IHRvIHNpZ24gcmVxdWVzdHMuIFNvLCBpdCBkb2VzIG5vdAorICAgICAqIHVzZSB0aGUgZmlsdGVyIHRvIHBlcmZvcm0gYXV0aG9yaXphdGlvbiBmbG93LiBIb3dldmVyLCBlYWNoIHJlcXVlc3QgdGhhdCB0aGlzIHRlc3QgcGVyZm9ybXMgaXMgYWN0dWFsbHkgYSByZXF1ZXN0IHVzZWQKKyAgICAgKiBkdXJpbmcgdGhlIGF1dGhvcml6YXRpb24gZmxvdy4KKyAgICAgKiA8cC8+CisgICAgICogVGhlIHNlcnZlciBzaWRlIG9mIHRoaXMgdGVzdCBleHRyYWN0cyBoZWFkZXIgYXV0aG9yaXphdGlvbiB2YWx1ZXMgYW5kIHRlc3RzIHRoYXQgc2lnbmF0dXJlcyBhcmUKKyAgICAgKiBjb3JyZWN0IGZvciBlYWNoIHJlcXVlc3QgdHlwZS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPQXV0aENsaWVudEZlYXR1cmUoKSB7CisgICAgICAgIGZpbmFsIFVSSSBiYXNlVXJpID0gZ2V0QmFzZVVyaSgpOworCisgICAgICAgIC8vIGJhc2VsaW5lIGZvciByZXF1ZXN0cworICAgICAgICBmaW5hbCBPQXV0aDFCdWlsZGVyIG9BdXRoMUJ1aWxkZXIgPSBPQXV0aDFDbGllbnRTdXBwb3J0LmJ1aWxkZXIobmV3IENvbnN1bWVyQ3JlZGVudGlhbHMoImRwZjQzZjNwMmw0azNsMDMiLAorICAgICAgICAgICAgICAgICJrZDk0aGY5M2s0MjNrZjQ0IikpLnRpbWVzdGFtcCgiMTE5MTI0MjA5MCIpLm5vbmNlKCJoc3U5NGozODg0amRvcHNsIikuc2lnbmF0dXJlTWV0aG9kKFBsYWludGV4dE1ldGhvZC5OQU1FKQorICAgICAgICAgICAgICAgIC52ZXJzaW9uKCIxLjAiKTsKKyAgICAgICAgZmluYWwgRmVhdHVyZSBmZWF0dXJlID0gb0F1dGgxQnVpbGRlci5mZWF0dXJlKCkuYnVpbGQoKTsKKworICAgICAgICBmaW5hbCBDbGllbnQgY2xpZW50ID0gY2xpZW50KCk7CisgICAgICAgIGNsaWVudC5yZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSBjbGllbnQudGFyZ2V0KGJhc2VVcmkpOworCisgICAgICAgIC8vIHNpbXVsYXRlIHJlcXVlc3QgZm9yIFJlcXVlc3QgVG9rZW4gKHRlbXBvcmFyeSBjcmVkZW50aWFscykKKyAgICAgICAgU3RyaW5nIHJlc3BvbnNlRW50aXR5ID0gdGFyZ2V0LnBhdGgoInJlcXVlc3RfdG9rZW4iKS5yZWdpc3RlcihmZWF0dXJlKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KCJlbnRpdHkiLAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpLCBTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMocmVzcG9uc2VFbnRpdHksICJvYXV0aF90b2tlbj1oaDVzOTNqNGhkaWRwb2xhJm9hdXRoX3Rva2VuX3NlY3JldD1oZGhkMDI0NGs5ajdhbzAzIik7CisKKyAgICAgICAgZmluYWwgRmVhdHVyZSBmZWF0dXJlMiA9IG9BdXRoMUJ1aWxkZXIudGltZXN0YW1wKCIxMTkxMjQyMDkyIikubm9uY2UoImRqaTQzMHNwbG14MzM0NDgiKS5mZWF0dXJlKCkuYWNjZXNzVG9rZW4obmV3CisgICAgICAgICAgICAgICAgQWNjZXNzVG9rZW4oImhoNXM5M2o0aGRpZHBvbGEiLCAiaGRoZDAyNDRrOWo3YW8wMyIpKS5idWlsZCgpOworCisgICAgICAgIC8vIHNpbXVsYXRlIHJlcXVlc3QgZm9yIEFjY2VzcyBUb2tlbgorICAgICAgICByZXNwb25zZUVudGl0eSA9IHRhcmdldC5wYXRoKCJhY2Nlc3NfdG9rZW4iKS5yZWdpc3RlcihmZWF0dXJlMikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eSgiZW50aXR5IiwKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHJlc3BvbnNlRW50aXR5LCAib2F1dGhfdG9rZW49bm5jaDczNGQwMHNsMmpkayZvYXV0aF90b2tlbl9zZWNyZXQ9cGZra2RoaTlzbDNyNHMwMCIpOworCisgICAgICAgIGZpbmFsIEZlYXR1cmUgZmVhdHVyZTMgPSBvQXV0aDFCdWlsZGVyLm5vbmNlKCJrbGxvOTk0MHBkOTMzM2poIikuc2lnbmF0dXJlTWV0aG9kKCJITUFDLVNIQTEiKS50aW1lc3RhbXAoIjExOTEyNDIwOTYiKQorICAgICAgICAgICAgICAgIC5mZWF0dXJlKCkuYWNjZXNzVG9rZW4obmV3IEFjY2Vzc1Rva2VuKCJubmNoNzM0ZDAwc2wyamRrIiwgInBma2tkaGk5c2wzcjRzMDAiKSkuYnVpbGQoKTsKKworICAgICAgICAvLyBiYXNlZCBvbiBBY2Nlc3MgVG9rZW4KKyAgICAgICAgcmVzcG9uc2VFbnRpdHkgPSB0YXJnZXQucGF0aCgiL3Bob3RvcyIpLnJlZ2lzdGVyKGZlYXR1cmUzKS5xdWVyeVBhcmFtKCJmaWxlIiwgInZhY2F0aW9uLmpwZyIpLnF1ZXJ5UGFyYW0oInNpemUiLAorICAgICAgICAgICAgICAgICJvcmlnaW5hbCIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMocmVzcG9uc2VFbnRpdHksICJQSE9UTyIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9BdXRoQ2xpZW50RmxvdygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgdXJpID0gZ2V0QmFzZVVyaSgpLnRvU3RyaW5nKCk7CisKKyAgICAgICAgZmluYWwgT0F1dGgxQXV0aG9yaXphdGlvbkZsb3cgYXV0aEZsb3cgPSBPQXV0aDFDbGllbnRTdXBwb3J0CisgICAgICAgICAgICAgICAgLmJ1aWxkZXIobmV3IENvbnN1bWVyQ3JlZGVudGlhbHMoImRwZjQzZjNwMmw0azNsMDMiLCAia2Q5NGhmOTNrNDIza2Y0NCIpKQorICAgICAgICAgICAgICAgIC50aW1lc3RhbXAoIjExOTEyNDIwOTAiKQorICAgICAgICAgICAgICAgIC5ub25jZSgiaHN1OTRqMzg4NGpkb3BzbCIpCisgICAgICAgICAgICAgICAgLnNpZ25hdHVyZU1ldGhvZCgiUExBSU5URVhUIikKKyAgICAgICAgICAgICAgICAuYXV0aG9yaXphdGlvbkZsb3coCisgICAgICAgICAgICAgICAgICAgICAgICB1cmkgKyAicmVxdWVzdF90b2tlbiIsCisgICAgICAgICAgICAgICAgICAgICAgICB1cmkgKyAiYWNjZXNzX3Rva2VuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVyaSArICJhdXRob3JpemUiKQorICAgICAgICAgICAgICAgIC5lbmFibGVMb2dnaW5nKCkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICAvLyBDaGVjayB3ZSBoYXZlIGNvcnJlY3QgYXV0aG9yaXphdGlvbiBVUkkuCisgICAgICAgIGZpbmFsIFN0cmluZyBhdXRob3JpemF0aW9uVXJpID0gYXV0aEZsb3cuc3RhcnQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChhdXRob3JpemF0aW9uVXJpLCBjb250YWluc1N0cmluZygiYXV0aG9yaXplP29hdXRoX3Rva2VuPWhoNXM5M2o0aGRpZHBvbGEiKSk7CisKKyAgICAgICAgLy8gRm9yIHRoZSBwdXJwb3NlIG9mIHRoZSB0ZXN0IEkgbmVlZCBwYXJhbWV0ZXJzIChhbmQgdGhlcmUgaXMgbm8gd2F5IGhvdyB0byBkbyBpdCBub3cpLgorICAgICAgICBmaW5hbCBGaWVsZCBwYXJhbUZpZWxkID0gYXV0aEZsb3cuZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZEZpZWxkKCJwYXJhbWV0ZXJzIik7CisgICAgICAgIHBhcmFtRmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKKyAgICAgICAgZmluYWwgT0F1dGgxUGFyYW1ldGVycyBwYXJhbXMgPSAoT0F1dGgxUGFyYW1ldGVycykgcGFyYW1GaWVsZC5nZXQoYXV0aEZsb3cpOworCisgICAgICAgIC8vIFVwZGF0ZSBwYXJhbWV0ZXJzLgorICAgICAgICBwYXJhbXMudGltZXN0YW1wKCIxMTkxMjQyMDkyIikubm9uY2UoImRqaTQzMHNwbG14MzM0NDgiKTsKKworICAgICAgICBmaW5hbCBBY2Nlc3NUb2tlbiBhY2Nlc3NUb2tlbiA9IGF1dGhGbG93LmZpbmlzaCgpOworICAgICAgICBhc3NlcnRUaGF0KGFjY2Vzc1Rva2VuLCBlcXVhbFRvKG5ldyBBY2Nlc3NUb2tlbigibm5jaDczNGQwMHNsMmpkayIsICJwZmtrZGhpOXNsM3I0czAwIikpKTsKKworICAgICAgICAvLyBVcGRhdGUgcGFyYW1ldGVycyBiZWZvcmUgY3JlYXRpbmcgYSBmZWF0dXJlIChpLmUuIGNoYW5naW5nIHNpZ25hdHVyZSBtZXRob2QpLgorICAgICAgICBwYXJhbXMubm9uY2UoImtsbG85OTQwcGQ5MzMzamgiKS5zaWduYXR1cmVNZXRob2QoIkhNQUMtU0hBMSIpLnRpbWVzdGFtcCgiMTE5MTI0MjA5NiIpOworCisgICAgICAgIC8vIENoZWNrIEF1dGhvcml6ZWQgQ2xpZW50LgorICAgICAgICBmaW5hbCBDbGllbnQgZmxvd0NsaWVudCA9IGF1dGhGbG93LmdldEF1dGhvcml6ZWRDbGllbnQoKS5yZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcyk7CisKKyAgICAgICAgU3RyaW5nIHJlc3BvbnNlRW50aXR5ID0gZmxvd0NsaWVudC50YXJnZXQodXJpKS5wYXRoKCIvcGhvdG9zIikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgiZmlsZSIsICJ2YWNhdGlvbi5qcGciKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJzaXplIiwgIm9yaWdpbmFsIikKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLmdldChTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydFRoYXQoIkZsb3cgQXV0aG9yaXplZCBDbGllbnQiLCByZXNwb25zZUVudGl0eSwgZXF1YWxUbygiUEhPVE8iKSk7CisKKyAgICAgICAgLy8gQ2hlY2sgRmVhdHVyZS4KKyAgICAgICAgZmluYWwgQ2xpZW50IGZlYXR1cmVDbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKGF1dGhGbG93LmdldE9BdXRoMUZlYXR1cmUoKSkucmVnaXN0ZXIoTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpOworCisgICAgICAgIHJlc3BvbnNlRW50aXR5ID0gZmVhdHVyZUNsaWVudC50YXJnZXQodXJpKS5wYXRoKCIvcGhvdG9zIikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgiZmlsZSIsICJ2YWNhdGlvbi5qcGciKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJzaXplIiwgIm9yaWdpbmFsIikKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLmdldChTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydFRoYXQoIkZlYXR1cmUgQ2xpZW50IiwgcmVzcG9uc2VFbnRpdHksIGVxdWFsVG8oIlBIT1RPIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9vYXV0aC9QaG90b3NSZXNvdXJjZS5qYXZhIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL29hdXRoL1Bob3Rvc1Jlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTljYzJjZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9vYXV0aC9QaG90b3NSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLm9hdXRoOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9hdXRoMS5zaWduYXR1cmUuT0F1dGgxUGFyYW1ldGVyczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5vYXV0aDEuc2lnbmF0dXJlLk9BdXRoMVNlY3JldHM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkub2F1dGgxLnNpZ25hdHVyZS5PQXV0aDFTaWduYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkub2F1dGgxLnNpZ25hdHVyZS5PQXV0aDFTaWduYXR1cmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm9hdXRoMS5pbnRlcm5hbC5PQXV0aFNlcnZlclJlcXVlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCitAUGF0aCgiL3Bob3RvcyIpCitwdWJsaWMgY2xhc3MgUGhvdG9zUmVzb3VyY2UgeworCisgICAgQEluamVjdAorICAgIHByaXZhdGUgT0F1dGgxU2lnbmF0dXJlIG9BdXRoMVNpZ25hdHVyZTsKKworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBTdHJpbmcgaGFuZGxlKAorICAgICAgICAgICAgQFF1ZXJ5UGFyYW0oImZpbGUiKSBTdHJpbmcgZmlsZSwKKyAgICAgICAgICAgIEBRdWVyeVBhcmFtKCJzaXplIikgU3RyaW5nIHNpemUsCisgICAgICAgICAgICBAQ29udGV4dCBDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0KSB7CisKKyAgICAgICAgT0F1dGhTZXJ2ZXJSZXF1ZXN0IG9zciA9IG5ldyBPQXV0aFNlcnZlclJlcXVlc3QocmVxdWVzdCk7CisKKyAgICAgICAgT0F1dGgxU2VjcmV0cyBzZWNyZXRzID0gbmV3IE9BdXRoMVNlY3JldHMoKQorICAgICAgICAgICAgICAgIC5jb25zdW1lclNlY3JldCgia2Q5NGhmOTNrNDIza2Y0NCIpLnRva2VuU2VjcmV0KCJwZmtrZGhpOXNsM3I0czAwIik7CisKKyAgICAgICAgT0F1dGgxUGFyYW1ldGVycyBwYXJhbXMgPSBuZXcgT0F1dGgxUGFyYW1ldGVycygpLnJlYWRSZXF1ZXN0KG9zcik7CisKKyAgICAgICAgLy8gZW5zdXJlIHF1ZXJ5IHBhcmFtZXRlcnMgYXJlIGFzIGV4cGVjdGVkCisgICAgICAgIGFzc2VydEVxdWFscyhmaWxlLCAidmFjYXRpb24uanBnIik7CisgICAgICAgIGFzc2VydEVxdWFscyhzaXplLCAib3JpZ2luYWwiKTsKKworICAgICAgICAvLyBlbnN1cmUgcXVlcnkgcGFyYW1ldGVycyBjb3JyZWN0bHkgcGFyc2VkIGludG8gT0F1dGggcGFyYW1ldGVycyBvYmplY3QKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBhcmFtcy5nZXRDb25zdW1lcktleSgpLCAiZHBmNDNmM3AybDRrM2wwMyIpOworICAgICAgICBhc3NlcnRFcXVhbHMocGFyYW1zLmdldFRva2VuKCksICJubmNoNzM0ZDAwc2wyamRrIik7CisgICAgICAgIGFzc2VydEVxdWFscyhwYXJhbXMuZ2V0U2lnbmF0dXJlTWV0aG9kKCksICJITUFDLVNIQTEiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBhcmFtcy5nZXRUaW1lc3RhbXAoKSwgIjExOTEyNDIwOTYiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBhcmFtcy5nZXROb25jZSgpLCAia2xsbzk5NDBwZDkzMzNqaCIpOworICAgICAgICBhc3NlcnRFcXVhbHMocGFyYW1zLmdldFZlcnNpb24oKSwgIjEuMCIpOworCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICAvLyB2ZXJpZnkgdGhlIEhNQUMtU0hBMSBzaWduYXR1cmUKKyAgICAgICAgICAgIGFzc2VydFRydWUob0F1dGgxU2lnbmF0dXJlLnZlcmlmeShvc3IsIHBhcmFtcywgc2VjcmV0cykpOworICAgICAgICB9IGNhdGNoIChPQXV0aDFTaWduYXR1cmVFeGNlcHRpb24gb3NlKSB7CisgICAgICAgICAgICBmYWlsKG9zZS5nZXRNZXNzYWdlKCkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuICJQSE9UTyI7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvb2F1dGgvUmVxdWVzdFRva2VuUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9vYXV0aC9SZXF1ZXN0VG9rZW5SZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NTVlNjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lMmUvb2F1dGgvUmVxdWVzdFRva2VuUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5vYXV0aDsKKworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9hdXRoMS5zaWduYXR1cmUuT0F1dGgxUGFyYW1ldGVyczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5vYXV0aDEuc2lnbmF0dXJlLk9BdXRoMVNlY3JldHM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkub2F1dGgxLnNpZ25hdHVyZS5PQXV0aDFTaWduYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkub2F1dGgxLnNpZ25hdHVyZS5PQXV0aDFTaWduYXR1cmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm9hdXRoMS5pbnRlcm5hbC5PQXV0aFNlcnZlclJlcXVlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCitAUGF0aCgiL3JlcXVlc3RfdG9rZW4iKQorcHVibGljIGNsYXNzIFJlcXVlc3RUb2tlblJlc291cmNlIHsKKworICAgIEBJbmplY3QKKyAgICBwcml2YXRlIE9BdXRoMVNpZ25hdHVyZSBvQXV0aDFTaWduYXR1cmU7CisKKyAgICBAUE9TVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIFN0cmluZyBnZXQoQENvbnRleHQgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdCkgeworCisgICAgICAgIE9BdXRoU2VydmVyUmVxdWVzdCBvc3IgPSBuZXcgT0F1dGhTZXJ2ZXJSZXF1ZXN0KHJlcXVlc3QpOworCisgICAgICAgIE9BdXRoMVNlY3JldHMgc2VjcmV0cyA9IG5ldyBPQXV0aDFTZWNyZXRzKCkuY29uc3VtZXJTZWNyZXQoImtkOTRoZjkzazQyM2tmNDQiKTsKKworICAgICAgICBPQXV0aDFQYXJhbWV0ZXJzIHBhcmFtcyA9IG5ldyBPQXV0aDFQYXJhbWV0ZXJzKCkucmVhZFJlcXVlc3Qob3NyKTsKKworICAgICAgICAvLyBlbnN1cmUgcGFyYW1ldGVycyBjb3JyZWN0bHkgcGFyc2VkIGludG8gT0F1dGggcGFyYW1ldGVycyBvYmplY3QKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBhcmFtcy5nZXRDb25zdW1lcktleSgpLCAiZHBmNDNmM3AybDRrM2wwMyIpOworICAgICAgICBhc3NlcnRFcXVhbHMocGFyYW1zLmdldFNpZ25hdHVyZU1ldGhvZCgpLCAiUExBSU5URVhUIik7CisgICAgICAgIGFzc2VydEVxdWFscyhwYXJhbXMuZ2V0U2lnbmF0dXJlKCksIHNlY3JldHMuZ2V0Q29uc3VtZXJTZWNyZXQoKSArICImIik7CisgICAgICAgIGFzc2VydEVxdWFscyhwYXJhbXMuZ2V0VGltZXN0YW1wKCksICIxMTkxMjQyMDkwIik7CisgICAgICAgIGFzc2VydEVxdWFscyhwYXJhbXMuZ2V0Tm9uY2UoKSwgImhzdTk0ajM4ODRqZG9wc2wiKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKHBhcmFtcy5nZXRWZXJzaW9uKCksICIxLjAiKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gdmVyaWZ5IHRoZSBwbGFpbnRleHQgc2lnbmF0dXJlCisgICAgICAgICAgICBhc3NlcnRUcnVlKG9BdXRoMVNpZ25hdHVyZS52ZXJpZnkob3NyLCBwYXJhbXMsIHNlY3JldHMpKTsKKyAgICAgICAgfSBjYXRjaCAoT0F1dGgxU2lnbmF0dXJlRXhjZXB0aW9uIG9zZSkgeworICAgICAgICAgICAgZmFpbChvc2UuZ2V0TWVzc2FnZSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAib2F1dGhfdG9rZW49aGg1czkzajRoZGlkcG9sYSZvYXV0aF90b2tlbl9zZWNyZXQ9aGRoZDAyNDRrOWo3YW8wMyI7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zb25hci9Tb25hckplcnNleUUyRVRlc3QuamF2YSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2UyZS9zb25hci9Tb25hckplcnNleUUyRVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzEyNDhiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvZTJlL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZTJlL3NvbmFyL1NvbmFySmVyc2V5RTJFVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLnNvbmFyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuc29uYXIuU29uYXJKZXJzZXlDb21tb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLnNvbmFyLlNvbmFySmVyc2V5U2VydmVyOworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBTb25hckplcnNleUUyRVRlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SmVyc2V5Q29tbW9uRTJFKCkgeworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJjb21tb24gZTJlIiwgbmV3IFNvbmFySmVyc2V5Q29tbW9uKCkuZTJlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEplcnNleUNvcmVFMkUoKSB7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInNlcnZlciBlMmUiLCBuZXcgU29uYXJKZXJzZXlTZXJ2ZXIoKS5lMmUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5zcGkuQXV0b0Rpc2NvdmVyYWJsZSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuc3BpLkF1dG9EaXNjb3ZlcmFibGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ1YzdhMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuc3BpLkF1dG9EaXNjb3ZlcmFibGUKQEAgLTAsMCArMSwzIEBACitvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uLkF1dG9EaXNjb3ZlcmFibGVUZXN0JENvbW1vbkF1dG9EaXNjb3ZlcmFibGUKK29yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb24uQXV0b0Rpc2NvdmVyYWJsZVRlc3QkQ2xpZW50QXV0b0Rpc2NvdmVyYWJsZQorb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbi5BdXRvRGlzY292ZXJhYmxlVGVzdCRTZXJ2ZXJBdXRvRGlzY292ZXJhYmxlClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvZTJlL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5zcGkuRm9yY2VkQXV0b0Rpc2NvdmVyYWJsZSBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuc3BpLkZvcmNlZEF1dG9EaXNjb3ZlcmFibGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk1YmQ1NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuc3BpLkZvcmNlZEF1dG9EaXNjb3ZlcmFibGUKQEAgLTAsMCArMSwzIEBACitvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lMmUuY29tbW9uLkZvcmNlZEF1dG9EaXNjb3ZlcmFibGVUZXN0JENvbW1vbkF1dG9EaXNjb3ZlcmFibGUKK29yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmUyZS5jb21tb24uRm9yY2VkQXV0b0Rpc2NvdmVyYWJsZVRlc3QkQ2xpZW50QXV0b0Rpc2NvdmVyYWJsZQorb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZTJlLmNvbW1vbi5Gb3JjZWRBdXRvRGlzY292ZXJhYmxlVGVzdCRTZXJ2ZXJBdXRvRGlzY292ZXJhYmxlCmRpZmYgLS1naXQgYS90ZXN0cy9lMmUvc3JjL3Rlc3QvcmVzb3VyY2VzL2xvZzRqLnByb3BlcnRpZXMgYi90ZXN0cy9lMmUvc3JjL3Rlc3QvcmVzb3VyY2VzL2xvZzRqLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M3NGVmYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2UyZS9zcmMvdGVzdC9yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcwpAQCAtMCwwICsxLDIwIEBACisjCisjIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorIworIyBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisjIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyMgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisjIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyMKKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisjCisKK2xvZzRqLnJvb3RDYXRlZ29yeT1BTEwsIHN0ZG91dAorbG9nNGouYXBwZW5kZXIuc3Rkb3V0PW9yZy5hcGFjaGUubG9nNGouQ29uc29sZUFwcGVuZGVyCitsb2c0ai5hcHBlbmRlci5zdGRvdXQubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPVslMzAuMzBjezF9XSAtICVtJW4KK2xvZzRqLmFwcGVuZGVyLnN0ZG91dC5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9KRVJTRVktMjk4OC9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vSkVSU0VZLTI5ODgvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmRjMzRhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vSkVSU0VZLTI5ODgvcG9tLnhtbApAQCAtMCwwICsxLDg5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjIzLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LTI5ODg8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tamVyc2V5LTI5ODg8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIFJlcHJvZHVjZXIgb2YgSkVSU0VZLTI5ODguCisKKyAgICAgICAgSmVyc2V5IGRvZXMgbm90IHNldCBsb2NhdG9yIHByb3Blcmx5IGZvciBTaW5nbGVIazJMb2NhdG9yTWFuYWdlci4KKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxmYWlsT25NaXNzaW5nV2ViWG1sPmZhbHNlPC9mYWlsT25NaXNzaW5nV2ViWG1sPgorICAgIDwvcHJvcGVydGllcz4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDwhLS0gSmVyc2V5IC0tPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNkaTF4PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPCEtLSBXZWxkIC0tPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVudGVycHJpc2U8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jZGktYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+Mi4wLUVEUjE8L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuamJvc3Mud2VsZC5zZXJ2bGV0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+d2VsZC1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4zLjAuMC5BbHBoYTEzPC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vSkVSU0VZLTI5ODgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyOTg4L0NvbnRleHRBd2FyZUJlYW4uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL0pFUlNFWS0yOTg4L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjk4OC9Db250ZXh0QXdhcmVCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFmN2U2YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL0pFUlNFWS0yOTg4L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjk4OC9Db250ZXh0QXdhcmVCZWFuLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyOTg4OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmF0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LkFwcGxpY2F0aW9uU2NvcGVkOworCitAQXBwbGljYXRpb25TY29wZWQKK3B1YmxpYyBjbGFzcyBDb250ZXh0QXdhcmVCZWFuIHsKKworICAgIEBDb250ZXh0CisgICAgcHJpdmF0ZSBDb25maWd1cmF0aW9uIGZpZWxkOworCisgICAgcHJpdmF0ZSBDb25maWd1cmF0aW9uIHNldHRlcjsKKworICAgIHB1YmxpYyBSZXNwb25zZSBmaWVsZENvbmZpZygpIHsKKyAgICAgICAgcmV0dXJuIGZpZWxkID09IG51bGwKKyAgICAgICAgICAgICAgICA/IFJlc3BvbnNlLnNlcnZlckVycm9yKCkuYnVpbGQoKQorICAgICAgICAgICAgICAgIDogUmVzcG9uc2Uub2soKS5idWlsZCgpOworICAgIH0KKworICAgIHB1YmxpYyBSZXNwb25zZSBzZXR0ZXJDb25maWcoKSB7CisgICAgICAgIHJldHVybiBzZXR0ZXIgPT0gbnVsbAorICAgICAgICAgICAgICAgID8gUmVzcG9uc2Uuc2VydmVyRXJyb3IoKS5idWlsZCgpCisgICAgICAgICAgICAgICAgOiBSZXNwb25zZS5vaygpLmJ1aWxkKCk7CisgICAgfQorCisgICAgQENvbnRleHQKKyAgICBwdWJsaWMgdm9pZCBzZXRDb25maWcoQ29uZmlndXJhdGlvbiBzZXR0ZXIpIHsKKyAgICAgICAgdGhpcy5zZXR0ZXIgPSBzZXR0ZXI7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9KRVJTRVktMjk4OC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI5ODgvRmllbGRDb250ZXh0RXhjZXB0aW9uTWFwcGVyLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9KRVJTRVktMjk4OC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI5ODgvRmllbGRDb250ZXh0RXhjZXB0aW9uTWFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhkZGQzMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL0pFUlNFWS0yOTg4L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjk4OC9GaWVsZENvbnRleHRFeGNlcHRpb25NYXBwZXIuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI5ODg7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5FeGNlcHRpb25NYXBwZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitAUHJvdmlkZXIKK3B1YmxpYyBjbGFzcyBGaWVsZENvbnRleHRFeGNlcHRpb25NYXBwZXIgaW1wbGVtZW50cyBFeGNlcHRpb25NYXBwZXI8SWxsZWdhbFN0YXRlRXhjZXB0aW9uPiB7CisKKyAgICBAQ29udGV4dAorICAgIHByaXZhdGUgSHR0cEhlYWRlcnMgZmllbGQ7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzcG9uc2UgdG9SZXNwb25zZShJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyg1MjApCisgICAgICAgICAgICAgICAgLmhlYWRlcigieC10ZXN0LWhlYWRlciIsIGZpZWxkLmdldEhlYWRlclN0cmluZygieC10ZXN0LWhlYWRlciIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL0pFUlNFWS0yOTg4L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjk4OC9TZXR0ZXJDb250ZXh0RXhjZXB0aW9uTWFwcGVyLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9KRVJTRVktMjk4OC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI5ODgvU2V0dGVyQ29udGV4dEV4Y2VwdGlvbk1hcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNTNlOWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9KRVJTRVktMjk4OC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI5ODgvU2V0dGVyQ29udGV4dEV4Y2VwdGlvbk1hcHBlci5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5Mjk4ODsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LkV4Y2VwdGlvbk1hcHBlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKK0BQcm92aWRlcgorcHVibGljIGNsYXNzIFNldHRlckNvbnRleHRFeGNlcHRpb25NYXBwZXIgaW1wbGVtZW50cyBFeGNlcHRpb25NYXBwZXI8TnVsbFBvaW50ZXJFeGNlcHRpb24+IHsKKworICAgIHByaXZhdGUgSHR0cEhlYWRlcnMgc2V0dGVyOworCisgICAgQENvbnRleHQKKyAgICBwdWJsaWMgdm9pZCBzZXRTZXR0ZXIoSHR0cEhlYWRlcnMgc2V0dGVyKSB7CisgICAgICAgIHRoaXMuc2V0dGVyID0gc2V0dGVyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNwb25zZSB0b1Jlc3BvbnNlKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4KSB7CisgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoNTIwKQorICAgICAgICAgICAgICAgIC5oZWFkZXIoIngtdGVzdC1oZWFkZXIiLCBzZXR0ZXIuZ2V0SGVhZGVyU3RyaW5nKCJ4LXRlc3QtaGVhZGVyIikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vSkVSU0VZLTI5ODgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyOTg4L1Rlc3RBcHBsaWNhdGlvbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vSkVSU0VZLTI5ODgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyOTg4L1Rlc3RBcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMDJiZmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9KRVJTRVktMjk4OC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI5ODgvVGVzdEFwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyOTg4OworCitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK0BBcHBsaWNhdGlvblBhdGgoIi8iKQorcHVibGljIGNsYXNzIFRlc3RBcHBsaWNhdGlvbiBleHRlbmRzIGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb24geworCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9KRVJTRVktMjk4OC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI5ODgvVGVzdFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9KRVJTRVktMjk4OC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI5ODgvVGVzdFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGMxOGZlNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL0pFUlNFWS0yOTg4L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjk4OC9UZXN0UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDU3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI5ODg7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworCitAUGF0aCgiL3Rlc3QiKQorcHVibGljIGNsYXNzIFRlc3RSZXNvdXJjZSB7CisKKyAgICBASW5qZWN0CisgICAgcHJpdmF0ZSBDb250ZXh0QXdhcmVCZWFuIGNvbnRleHRBd2FyZUJlYW47CisKKyAgICBAR0VUCisgICAgQFBhdGgoImZpZWxkIikKKyAgICBwdWJsaWMgUmVzcG9uc2UgZmllbGQoKSB7CisgICAgICAgIHJldHVybiBjb250ZXh0QXdhcmVCZWFuLmZpZWxkQ29uZmlnKCk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJzZXR0ZXIiKQorICAgIHB1YmxpYyBSZXNwb25zZSBzZXR0ZXIoKSB7CisgICAgICAgIHJldHVybiBjb250ZXh0QXdhcmVCZWFuLnNldHRlckNvbmZpZygpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiZXgvZmllbGQiKQorICAgIHB1YmxpYyBTdHJpbmcgZmllbGRFeGNlcHRpb25NYXBwZXIoKSB7CisgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk15IGhhbmRsZWQgZXhjZXB0aW9uLiIpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiZXgvc2V0dGVyIikKKyAgICBwdWJsaWMgU3RyaW5nIHNldHRlckV4Y2VwdGlvbk1hcHBlcigpIHsKKyAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJNeSBoYW5kbGVkIGV4Y2VwdGlvbi4iKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL0pFUlNFWS0yOTg4L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2JlYW5zLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL0pFUlNFWS0yOTg4L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2JlYW5zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGNkNmU4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vSkVSU0VZLTI5ODgvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvYmVhbnMueG1sCkBAIC0wLDAgKzEsMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxiZWFucyB4bWxucz0iaHR0cDovL3htbG5zLmpjcC5vcmcveG1sL25zL2phdmFlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly94bWxucy5qY3Aub3JnL3htbC9ucy9qYXZhZWUgaHR0cDovL3htbG5zLmpjcC5vcmcveG1sL25zL2phdmFlZS9iZWFuc18xXzEueHNkIgorICAgICAgIHZlcnNpb249IjEuMSIgYmVhbi1kaXNjb3ZlcnktbW9kZT0iYWxsIj4KKworPC9iZWFucz4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL0pFUlNFWS0yOTg4L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2pldHR5LXdlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9KRVJTRVktMjk4OC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9qZXR0eS13ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNjkyNTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9KRVJTRVktMjk4OC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9qZXR0eS13ZWIueG1sCkBAIC0wLDAgKzEsMjcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzwhRE9DVFlQRSBDb25maWd1cmUgUFVCTElDICItLy9KZXR0eS8vQ29uZmlndXJlLy9FTiIgImh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvamV0dHkvY29uZmlndXJlLmR0ZCI+Cis8Q29uZmlndXJlIGNsYXNzPSJvcmcuZWNsaXBzZS5qZXR0eS53ZWJhcHAuV2ViQXBwQ29udGV4dCI+CisgICAgPFNldCBuYW1lPSJzZXJ2ZXJDbGFzc2VzIj4KKyAgICAgICAgPEFycmF5IHR5cGU9ImphdmEubGFuZy5TdHJpbmciPgorICAgICAgICAgICAgPEl0ZW0+LW9yZy5lY2xpcHNlLmpldHR5LnNlcnZsZXQuU2VydmxldENvbnRleHRIYW5kbGVyLkRlY29yYXRvcjwvSXRlbT4KKyAgICAgICAgPC9BcnJheT4KKyAgICA8L1NldD4KKzwvQ29uZmlndXJlPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vSkVSU0VZLTI5ODgvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyOTg4L0plcnNleTI5ODhJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL0pFUlNFWS0yOTg4L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjk4OC9KZXJzZXkyOTg4SVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjViYzQ5ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL0pFUlNFWS0yOTg4L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjk4OC9KZXJzZXkyOTg4SVRDYXNlLmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyOTg4OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiBKRVJTRVktMjk4OCByZXByb2R1Y2VyIGFuZCBKRVJTRVktMjk5MCAoZHVwbGljYXRlIG9mIHRoZSBwcmV2aW91cyBvbmUpCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXkyOTg4SVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX05BTUUgPSAieC10ZXN0LWhlYWRlciI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEhFQURFUl9WQUxVRSA9ICJjb29sLWhlYWRlciI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RBcHBsaWNhdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcm9kdWNlciBmb3IgSkVSU0VZLTI5ODgKKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjb250ZXh0RmllbGRJbmplY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdENkaUJlYW5Db250ZXh0SW5qZWN0aW9uKCJmaWVsZCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgY29udGV4dFNldHRlckluamVjdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0Q2RpQmVhbkNvbnRleHRJbmplY3Rpb24oInNldHRlciIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0Q2RpQmVhbkNvbnRleHRJbmplY3Rpb24oU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgaW50IHN0YXR1cyA9IHRhcmdldCgidGVzdC8iICsgcGF0aCkucmVxdWVzdCgpLmdldCgpLmdldFN0YXR1cygpOworICAgICAgICBpZiAoc3RhdHVzICE9IDIwMCkgeworICAgICAgICAgICAgZmFpbCgiQENvbnRleHQgZmllbGQgaXMgbm90IHByb3Blcmx5IGluamVjdGVkIGludG8gQ0RJIEJlYW4uIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByb2R1Y2VyIGZvciBKRVJTRVktMjk5MAorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGNvbnRleHRGaWVsZEluamVjdGlvbkV4Y2VwdGlvbk1hcHBlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0RXhjZXB0aW9uTWFwcGVyQ29udGV4dEluamVjdGlvbigiZmllbGQiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGNvbnRleHRTZXR0ZXJFeGNlcHRpb25NYXBwZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdGVzdEV4Y2VwdGlvbk1hcHBlckNvbnRleHRJbmplY3Rpb24oInNldHRlciIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0RXhjZXB0aW9uTWFwcGVyQ29udGV4dEluamVjdGlvbihTdHJpbmcgcGF0aCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgidGVzdC9leC8iICsgcGF0aCkucmVxdWVzdCgpLmhlYWRlcihIRUFERVJfTkFNRSwgSEVBREVSX1ZBTFVFKS5nZXQoKTsKKyAgICAgICAgaWYgKHJlc3BvbnNlLmdldFN0YXR1cygpICE9IDUyMCB8fCAhSEVBREVSX1ZBTFVFLmVxdWFscyhyZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoSEVBREVSX05BTUUpKSkgeworICAgICAgICAgICAgZmFpbCgiQENvbnRleHQgbWV0aG9kIHdhcyBub3QgcHJvcGVybHkgaW5qZWN0ZWQgaW50byBFeGNlcHRpb25NYXBwZXIuIik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9hc3luYy1qZXJzZXktZmlsdGVyL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9hc3luYy1qZXJzZXktZmlsdGVyL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE4Y2Q5YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2FzeW5jLWplcnNleS1maWx0ZXIvcG9tLnhtbApAQCAtMCwwICsxLDc0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+YXN5bmMtamVyc2V5LWZpbHRlcjwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1qZXJzZXktYXN5bmMtZmlsdGVyPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBUaGlzIHdlYiBwcm9qZWN0IHJlcHJvZHVjZXMgdGlja2V0czoKKyAgICAgICAgSkVSU0VZLTI3MzAKKyAgICAgICAgSkVSU0VZLTI4MTIKKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtzZXJ2bGV0My52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2FzeW5jLWplcnNleS1maWx0ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9hc3luYy9UZXN0QXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2FzeW5jLWplcnNleS1maWx0ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9hc3luYy9UZXN0QXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjNmYTE2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vYXN5bmMtamVyc2V5LWZpbHRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2FzeW5jL1Rlc3RBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uYXN5bmM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGg7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyNzMwLlRlc3RFeGNlcHRpb25SZXNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyNzMwLmV4Y2VwdGlvbi5NYXBwZWRFeGNlcHRpb25NYXBwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjgxMi5UZXN0V2FpdFJlc291cmNlOworCisvKioKKyAqIEplcnNleSBhcHBsaWNhdGlvbiBmb3IgSkVSU0VZLTI3MzAuCisgKgorICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYSBhdCBvcmFjbGUuY29tKQorICovCitAQXBwbGljYXRpb25QYXRoKCIvIikKK3B1YmxpYyBjbGFzcyBUZXN0QXBwbGljYXRpb24gZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisKKyAgICBwdWJsaWMgVGVzdEFwcGxpY2F0aW9uKCkgeworICAgICAgICByZWdpc3RlcihUZXN0RXhjZXB0aW9uUmVzb3VyY2UuY2xhc3MpOworICAgICAgICByZWdpc3RlcihNYXBwZWRFeGNlcHRpb25NYXBwZXIuY2xhc3MpOworICAgICAgICByZWdpc3RlcihUZXN0V2FpdFJlc291cmNlLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9hc3luYy1qZXJzZXktZmlsdGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjczMC9UZXN0RXhjZXB0aW9uUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2FzeW5jLWplcnNleS1maWx0ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNzMwL1Rlc3RFeGNlcHRpb25SZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MzE3NjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9hc3luYy1qZXJzZXktZmlsdGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjczMC9UZXN0RXhjZXB0aW9uUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyNzMwOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkFzeW5jUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlN1c3BlbmRlZDsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LmludGVybmFsLlJlc3BvbnNlV3JpdGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI3MzAuZXhjZXB0aW9uLk1hcHBlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyNzMwLmV4Y2VwdGlvbi5Vbm1hcHBlZEV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyNzMwLmV4Y2VwdGlvbi5Vbm1hcHBlZFJ1bnRpbWVFeGNlcHRpb247CisKKy8qKgorICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYSBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiL2V4Y2VwdGlvbiIpCitAU2luZ2xldG9uCitwdWJsaWMgY2xhc3MgVGVzdEV4Y2VwdGlvblJlc291cmNlIHsKKworICAgIC8qKgorICAgICAqIEFuIGluc3RhbmNlIG9mIHRocmVhZCB0aGF0IHdhcyBwcm9jZXNzaW5nIGEgbGFzdCByZXF1ZXN0IHRvIHRoaXMgcmVzb3VyY2UuCisgICAgICovCisgICAgcHJpdmF0ZSBUaHJlYWQgbGFzdFByb2Nlc3NpbmdUaHJlYWQ7CisKKyAgICBAR0VUCisgICAgQFBhdGgoIm51bGwiKQorICAgIHB1YmxpYyB2b2lkIGdldChAU3VzcGVuZGVkIGZpbmFsIEFzeW5jUmVzcG9uc2UgYXN5bmNSZXNwb25zZSkgeworICAgICAgICBsYXN0UHJvY2Vzc2luZ1RocmVhZCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7CisgICAgICAgIGFzeW5jUmVzcG9uc2UucmVzdW1lKChUaHJvd2FibGUpIG51bGwpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgibWFwcGVkIikKKyAgICBwdWJsaWMgdm9pZCBnZXRNYXBwZWRFeGNlcHRpb24oQFN1c3BlbmRlZCBmaW5hbCBBc3luY1Jlc3BvbnNlIGFzeW5jUmVzcG9uc2UpIHsKKyAgICAgICAgbGFzdFByb2Nlc3NpbmdUaHJlYWQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOworICAgICAgICBhc3luY1Jlc3BvbnNlLnJlc3VtZShuZXcgTWFwcGVkRXhjZXB0aW9uKCkpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgidW5tYXBwZWQiKQorICAgIHB1YmxpYyB2b2lkIGdldFVubWFwcGVkRXhjZXB0aW9uKEBTdXNwZW5kZWQgZmluYWwgQXN5bmNSZXNwb25zZSBhc3luY1Jlc3BvbnNlKSB7CisgICAgICAgIGxhc3RQcm9jZXNzaW5nVGhyZWFkID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKKyAgICAgICAgYXN5bmNSZXNwb25zZS5yZXN1bWUobmV3IFVubWFwcGVkRXhjZXB0aW9uKCkpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgicnVudGltZSIpCisgICAgcHVibGljIHZvaWQgZ2V0VW5tYXBwZWRSdW50aW1lRXhjZXB0aW9uKEBTdXNwZW5kZWQgZmluYWwgQXN5bmNSZXNwb25zZSBhc3luY1Jlc3BvbnNlKSB7CisgICAgICAgIGxhc3RQcm9jZXNzaW5nVGhyZWFkID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKTsKKyAgICAgICAgYXN5bmNSZXNwb25zZS5yZXN1bWUobmV3IFVubWFwcGVkUnVudGltZUV4Y2VwdGlvbigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYSB0aHJlYWQgdGhhdCB3YXMgcHJvY2Vzc2luZyBhIGxhc3QgcmVxdWVzdCBnb3Qgc3R1Y2sgaW4ge0BsaW5rIFJlc3BvbnNlV3JpdGVyfS4KKyAgICAgKiA8cC8+CisgICAgICogVW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMsIHRoZSBsYXN0IHByb2Nlc3NpbmcgdGhyZWFkIHNob3VsZCByZXR1cm4gYmFjayB0byB0aGUgc2VydmxldCBjb250YWluZXIKKyAgICAgKiBhbmQgaXRzIHBvb2wuCisgICAgICogPHAvPgorICAgICAqIE1heSBub3Qgd29yayB3aGVuIGV4ZWN1dGVkIGluIHBhcmFsbGVsLgorICAgICAqCisgICAgICogQHJldHVybgorICAgICAqLworICAgIEBHRVQKKyAgICBAUGF0aCgicnBjL2xhc3R0aHJlYWRzdHVjayIpCisgICAgcHVibGljIGJvb2xlYW4gbGFzdFRocmVhZFN0dWNrUnBjKCkgeworICAgICAgICBpZiAobGFzdFByb2Nlc3NpbmdUaHJlYWQgPT0gbnVsbCB8fCBUaHJlYWQuY3VycmVudFRocmVhZCgpID09IGxhc3RQcm9jZXNzaW5nVGhyZWFkKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGxhc3RQcm9jZXNzaW5nVGhyZWFkLmdldFN0YXRlKCkpIHsKKyAgICAgICAgICAgIGNhc2UgQkxPQ0tFRDoKKyAgICAgICAgICAgIGNhc2UgVElNRURfV0FJVElORzoKKyAgICAgICAgICAgIGNhc2UgV0FJVElORzoKKyAgICAgICAgICAgICAgICBmb3IgKFN0YWNrVHJhY2VFbGVtZW50IHN0YWNrVHJhY2VFbGVtZW50IDogbGFzdFByb2Nlc3NpbmdUaHJlYWQuZ2V0U3RhY2tUcmFjZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChSZXNwb25zZVdyaXRlci5jbGFzcy5nZXROYW1lKCkuZXF1YWxzKHN0YWNrVHJhY2VFbGVtZW50LmdldENsYXNzTmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vYXN5bmMtamVyc2V5LWZpbHRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI3MzAvZXhjZXB0aW9uL01hcHBlZEV4Y2VwdGlvbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vYXN5bmMtamVyc2V5LWZpbHRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI3MzAvZXhjZXB0aW9uL01hcHBlZEV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMGFiMGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9hc3luYy1qZXJzZXktZmlsdGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjczMC9leGNlcHRpb24vTWFwcGVkRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyNzMwLmV4Y2VwdGlvbjsKKworLyoqCisgKiBUaGlzIGV4Y2VwdGlvbiB3aWxsIGdldCBtYXBwZWQgdG8gYSA0MzIgcmVzcG9uc2Ugd2l0aCB0aGUgYXBwbGljYXRpb24gZXhjZXB0aW9uIG1hcHBlcgorICogaW1wbGVtZW50ZWQgYnkge0BsaW5rIE1hcHBlZEV4Y2VwdGlvbk1hcHBlcn0gY2xhc3MuCisgKgorICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYSBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgTWFwcGVkRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vYXN5bmMtamVyc2V5LWZpbHRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI3MzAvZXhjZXB0aW9uL01hcHBlZEV4Y2VwdGlvbk1hcHBlci5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vYXN5bmMtamVyc2V5LWZpbHRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI3MzAvZXhjZXB0aW9uL01hcHBlZEV4Y2VwdGlvbk1hcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MmRiYzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9hc3luYy1qZXJzZXktZmlsdGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjczMC9leGNlcHRpb24vTWFwcGVkRXhjZXB0aW9uTWFwcGVyLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyNzMwLmV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LkV4Y2VwdGlvbk1hcHBlcjsKKworLyoqCisgKiBBbiBleGNlcHRpb24gbWFwcGVyIHRvIHJldHVybiA0MzIgZXJyb3IgcmVzcG9uc2Ugd2hlbiBhIHtAbGluayBNYXBwZWRFeGNlcHRpb259IGlzIHRocm93bi4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBNYXBwZWRFeGNlcHRpb25NYXBwZXIgaW1wbGVtZW50cyBFeGNlcHRpb25NYXBwZXI8TWFwcGVkRXhjZXB0aW9uPiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzcG9uc2UgdG9SZXNwb25zZShNYXBwZWRFeGNlcHRpb24gZXhjZXB0aW9uKSB7CisgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoNDMyKS5idWlsZCgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vYXN5bmMtamVyc2V5LWZpbHRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI3MzAvZXhjZXB0aW9uL1VubWFwcGVkRXhjZXB0aW9uLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9hc3luYy1qZXJzZXktZmlsdGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjczMC9leGNlcHRpb24vVW5tYXBwZWRFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTE4NzJjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vYXN5bmMtamVyc2V5LWZpbHRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI3MzAvZXhjZXB0aW9uL1VubWFwcGVkRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyNzMwLmV4Y2VwdGlvbjsKKworLyoqCisgKiBBbiBleGNlcHRpb24gdGhhdCB3aWxsIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIHNlcnZsZXQgY29udGFpbmVyLgorICoKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFVubWFwcGVkRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vYXN5bmMtamVyc2V5LWZpbHRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI3MzAvZXhjZXB0aW9uL1VubWFwcGVkUnVudGltZUV4Y2VwdGlvbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vYXN5bmMtamVyc2V5LWZpbHRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI3MzAvZXhjZXB0aW9uL1VubWFwcGVkUnVudGltZUV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NGRjNmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9hc3luYy1qZXJzZXktZmlsdGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjczMC9leGNlcHRpb24vVW5tYXBwZWRSdW50aW1lRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyNzMwLmV4Y2VwdGlvbjsKKworLyoqCisgKiBBbiBleGNlcHRpb24gdGhhdCB3aWxsIGJlIHByb3BhZ2F0ZWQgdG8gdGhlIHNlcnZsZXQgY29udGFpbmVyLgorICoKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFVubWFwcGVkUnVudGltZUV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9hc3luYy1qZXJzZXktZmlsdGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjgxMi9UZXN0RmlsdGVyLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9hc3luYy1qZXJzZXktZmlsdGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjgxMi9UZXN0RmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZkM2NkOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2FzeW5jLWplcnNleS1maWx0ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyODEyL1Rlc3RGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI4MTI7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ2hhaW47CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXJDb25maWc7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2U7CisKKy8qKgorICogVGhpcyBzZXJ2bGV0IGZpbHRlciBjbGFzcyBwcm92aWRlcyBhIG1lYW5zIHRvIGRldGVjdCB3aGV0aGVyIEplcnNleSAoaW4gc2VydmxldCBmaWx0ZXIgYmFzZWQgc2V0dXApIHByb3Blcmx5IGZyZWVkIHRoZQorICogc2VydmVyLXNpZGUgdGhyZWFkIHByb2Nlc3NpbmcgdGhlIGh0dHAgcmVxdWVzdCB0byBhbiBhc3luYyBSRVNUZnVsIHJlc291cmNlIHdoZXJlIHtAbGluayBqYXZheC53cy5ycy5jb250YWluZXIuQXN5bmNSZXNwb25zZX0KKyAqIHdhc24ndCByZXN1bWVkLgorICogPHAvPgorICogUmVwb3J0ZWQgYXMgSkVSU0VZLTI4MTIuCisgKgorICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYSBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgVGVzdEZpbHRlciBpbXBsZW1lbnRzIEZpbHRlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihUZXN0RmlsdGVyLmNsYXNzLmdldE5hbWUoKSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0RMX0ZJTklTSEVEID0gIkNETC1maW5pc2hlZCI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBpbml0KGZpbmFsIEZpbHRlckNvbmZpZyBmaWx0ZXJDb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRvRmlsdGVyKGZpbmFsIFNlcnZsZXRSZXF1ZXN0IHNlcnZsZXRSZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNlcnZsZXRSZXNwb25zZSBzZXJ2bGV0UmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsdGVyQ2hhaW4gZmlsdGVyQ2hhaW4pCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICBMT0dHRVIuZmluZXN0KG5ldyBEYXRlKCkgKyAiIFRocmVhZCAiICsgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXROYW1lKCkgKyAiIGlzIGJlaW5nIGFjcXVpcmVkLi4uIik7CisKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggY2RsRmluaXNoZWQgPSBuZXcgQ291bnREb3duTGF0Y2goMSk7CisgICAgICAgIHNlcnZsZXRSZXF1ZXN0LnNldEF0dHJpYnV0ZShDRExfRklOSVNIRUQsIGNkbEZpbmlzaGVkKTsKKworICAgICAgICBmaWx0ZXJDaGFpbi5kb0ZpbHRlcihzZXJ2bGV0UmVxdWVzdCwgc2VydmxldFJlc3BvbnNlKTsKKworICAgICAgICAvLyB0aGUgdGhyZWFkIGRpZCByZXR1cm4gZnJvbSBKZXJzZXkKKyAgICAgICAgY2RsRmluaXNoZWQuY291bnREb3duKCk7CisKKyAgICAgICAgTE9HR0VSLmZpbmVzdChuZXcgRGF0ZSgpICsgIiBUaHJlYWQgIiArIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0TmFtZSgpICsgIiBpcyBiZWluZyByZWxlYXNlZC4iKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgeworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vYXN5bmMtamVyc2V5LWZpbHRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI4MTIvVGVzdFdhaXRSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vYXN5bmMtamVyc2V5LWZpbHRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI4MTIvVGVzdFdhaXRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NTcxMDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9hc3luYy1qZXJzZXktZmlsdGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjgxMi9UZXN0V2FpdFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjgxMjsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRNYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLk5vdEFjY2VwdGFibGVFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Bc3luY1Jlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5TdXNwZW5kZWQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworCisvKioKKyAqIFRoaXMgcmVzb3VyY2UgcHJvdmlkZXMgYSB3YXkgdG8gcmVwcm9kdWNlIEpFUlNFWS0yODE4LgorICoKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIi9hc3luYyIpCitAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorQFNpbmdsZXRvbgorcHVibGljIGNsYXNzIFRlc3RXYWl0UmVzb3VyY2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoVGVzdFdhaXRSZXNvdXJjZS5jbGFzcy5nZXROYW1lKCkpOworCisgICAgLyoqCisgICAgICogVGVzdCBjb250ZXh0IGlkZW50aWZpZWQgYnkgVVVJRCBjaG9zZW4gYnkgY2xpZW50LgorICAgICAqLworICAgIHByaXZhdGUgZmluYWwgQ29uY3VycmVudE1hcDxTdHJpbmcsIFRlc3RDb250ZXh0PiB0ZXN0Q29udGV4dE1hcCA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDw+KCk7CisKKyAgICBwcml2YXRlIFRlc3RDb250ZXh0IHRlc3RDb250ZXh0Rm9yVVVJRChTdHJpbmcgdXVpZCkgeworICAgICAgICB0ZXN0Q29udGV4dE1hcC5wdXRJZkFic2VudCh1dWlkLCBuZXcgVGVzdENvbnRleHQoKSk7CisgICAgICAgIHJldHVybiB0ZXN0Q29udGV4dE1hcC5nZXQodXVpZCk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJ3YWl0L3t1dWlkfSIpCisgICAgcHVibGljIHZvaWQgd2FpdEZvckV2ZW50KEBTdXNwZW5kZWQgQXN5bmNSZXNwb25zZSBhc3luY1Jlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAQ29udGV4dCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQFBhdGhQYXJhbSgidXVpZCIpIFN0cmluZyB1dWlkKSB7CisKKyAgICAgICAgTE9HR0VSLmZpbmVyKCJBZGRpbmcgcmVzcG9uc2U6ICIgKyBhc3luY1Jlc3BvbnNlKTsKKworICAgICAgICBmaW5hbCBUZXN0Q29udGV4dCB0ZXN0Q29udGV4dCA9IHRlc3RDb250ZXh0Rm9yVVVJRCh1dWlkKTsKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggZmluaXNoZWRDZGwgPSAoQ291bnREb3duTGF0Y2gpIHJlcXVlc3QuZ2V0QXR0cmlidXRlKFRlc3RGaWx0ZXIuQ0RMX0ZJTklTSEVEKTsKKworICAgICAgICBpZiAoZmluaXNoZWRDZGwgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlICIgKyBUZXN0RmlsdGVyLmNsYXNzICsgIiB3YXMgbm90IHByb3Blcmx5IHByb2Nlc3NlZCBiZWZvcmUgdGhpcyByZXF1ZXN0ISIpOworICAgICAgICB9CisKKyAgICAgICAgdGVzdENvbnRleHQuYXN5bmNSZXNwb25zZSA9IGFzeW5jUmVzcG9uc2U7CisgICAgICAgIHRlc3RDb250ZXh0LmZpbmlzaGVkQ2RsID0gZmluaXNoZWRDZGw7CisgICAgICAgIHRlc3RDb250ZXh0LnN0YXJ0ZWRDZGwuY291bnREb3duKCk7CisKKyAgICAgICAgTE9HR0VSLmZpbmVyKCJEZWNyZWFzaW5nIHN0YXJ0ZWQgY2RsOiAiICsgdGVzdENvbnRleHQuc3RhcnRlZENkbCk7CisgICAgfQorCisgICAgQFBPU1QKKyAgICBAUGF0aCgicmVsZWFzZS97dXVpZH0iKQorICAgIHB1YmxpYyBTdHJpbmcgcmVsZWFzZUxhc3RTdXNwZW5kZWRBc3luY1JlcXVlc3QoQFBhdGhQYXJhbSgidXVpZCIpIFN0cmluZyB1dWlkKSB7CisKKyAgICAgICAgTE9HR0VSLmZpbmVyKCJSZWxlYXNpbmcgYXN5bmMgcmVzcG9uc2UiKTsKKworICAgICAgICBpZiAoIXRlc3RDb250ZXh0TWFwLmNvbnRhaW5zS2V5KHV1aWQpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm90QWNjZXB0YWJsZUV4Y2VwdGlvbigiVVVJRCBub3QgZm91bmQhIiArIHV1aWQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gY2xlYW4gaXQgdXAKKyAgICAgICAgZmluYWwgVGVzdENvbnRleHQgcmVsZWFzZWRUZXN0Q29udGV4dCA9IHRlc3RDb250ZXh0TWFwLnJlbW92ZSh1dWlkKTsKKyAgICAgICAgcmVsZWFzZWRUZXN0Q29udGV4dC5maW5pc2hlZENkbC5jb3VudERvd24oKTsKKyAgICAgICAgcmVsZWFzZWRUZXN0Q29udGV4dC5zdGFydGVkQ2RsLmNvdW50RG93bigpOworICAgICAgICByZWxlYXNlZFRlc3RDb250ZXh0LmFzeW5jUmVzcG9uc2UucmVzdW1lKCJhc3luYy1PSy0iICsgdXVpZCk7CisKKyAgICAgICAgcmV0dXJuICJSRUxFQVNFRCI7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJhd2FpdC97dXVpZH0vc3RhcnRlZCIpCisgICAgcHVibGljIGJvb2xlYW4gYXdhaXRGb3JUaGVBc3luY1JlcXVlc3RUaHJlYWRUb1N0YXJ0KEBQYXRoUGFyYW0oInV1aWQiKSBTdHJpbmcgdXVpZCwgQFF1ZXJ5UGFyYW0oIm1pbGxpcyIpIExvbmcgbWlsbGlzKSB7CisgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIHN0YXJ0ZWRDZGwgPSB0ZXN0Q29udGV4dEZvclVVSUQodXVpZCkuc3RhcnRlZENkbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIExPR0dFUi5maW5lcigiQ2hlY2tpbmcgc3RhcnRlZCBjZGw6ICIgKyBzdGFydGVkQ2RsKTsKKyAgICAgICAgICAgIHJldHVybiBzdGFydGVkQ2RsLmF3YWl0KG1pbGxpcywgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiSW50ZXJydXB0ZWQgd2hpbGUgd2FpdGluZyBmb3IgdGhlIHRocmVhZCB0byBmaW5pc2ghIiwgZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImF3YWl0L3t1dWlkfS9maW5pc2hlZCIpCisgICAgcHVibGljIGJvb2xlYW4gYXdhaXRGb3JUaGVBc3luY1JlcXVlc3RUaHJlYWRUb0ZpbmlzaChAUGF0aFBhcmFtKCJ1dWlkIikgU3RyaW5nIHV1aWQsIEBRdWVyeVBhcmFtKCJtaWxsaXMiKSBMb25nIG1pbGxpcykgeworICAgICAgICBpZiAoIXRlc3RDb250ZXh0TWFwLmNvbnRhaW5zS2V5KHV1aWQpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTm90QWNjZXB0YWJsZUV4Y2VwdGlvbigiVVVJRCBub3QgZm91bmQhIiArIHV1aWQpOworICAgICAgICB9CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBMT0dHRVIuZmluZXIoIkRlY3JlYXNpbmcgZmluaXNoZWQgY2RsOiAiICsgdGVzdENvbnRleHRNYXAuZ2V0KHV1aWQpLmZpbmlzaGVkQ2RsKTsKKyAgICAgICAgICAgIHJldHVybiB0ZXN0Q29udGV4dE1hcC5nZXQodXVpZCkuZmluaXNoZWRDZGwuYXdhaXQobWlsbGlzLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJJbnRlcnJ1cHRlZCB3aGlsZSB3YWl0aW5nIGZvciB0aGUgdGhyZWFkIHRvIGZpbmlzaCEiLCBlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgY29udGV4dCBob2xkZXIgY2xhc3MuCisgICAgICogPHAvPgorICAgICAqIEhvbGRzIHRoZSBpbmZvcm1hdGlvbiBmb3Igb25lIHRlc3QgaWRlbnRpZmllZCBieSBVVUlEIGNob3NlbiBieSBjbGllbnQuCisgICAgICoKKyAgICAgKiBAc2VlICN0ZXN0Q29udGV4dE1hcAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFRlc3RDb250ZXh0IHsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBDREwgZW5zdXJlcyB0aGUgc2VydmVyLXNpZGUgdGhyZWFkIHByb2Nlc3NpbmcgdGhlIHJlcXVlc3QgdG8gL2FzeW5jL3dhaXQve3V1aWR9IGhhcyBzdGFydGVkIGhhbmRsaW5nIHRoZSByZXF1ZXN0LgorICAgICAgICAgKi8KKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggc3RhcnRlZENkbCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBDREwgZW5zdXJlcyB0aGUgc2VydmVyLXNpZGUgdGhyZWFkIHByb2Nlc3NpbmcgdGhlIHJlcXVlc3QgdG8gL2FzeW5jL3dhaXQve3V1aWR9IHdhcyByZXR1cm5lZCB0byB0aGUgdGhyZWFkLXBvb2wuCisgICAgICAgICAqLworICAgICAgICB2b2xhdGlsZSBDb3VudERvd25MYXRjaCBmaW5pc2hlZENkbDsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGFzeW5jIHJlc3BvbnNlIHRoYXQgZG9lcyBnZXQgcmVzdW1lZCBvdXRzaWRlIG9mIHRoZSByZXF1ZXN0IHRvIC9hc3luYy93YWl0L3t1dWlkfS4gVGhpcyByZXByb2R1Y2VzIHRoZSBKRVJTRVktMjgxMgorICAgICAgICAgKiBidWcuCisgICAgICAgICAqLworICAgICAgICB2b2xhdGlsZSBBc3luY1Jlc3BvbnNlIGFzeW5jUmVzcG9uc2U7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9hc3luYy1qZXJzZXktZmlsdGVyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9hc3luYy1qZXJzZXktZmlsdGVyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFkMTY2YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2FzeW5jLWplcnNleS1maWx0ZXIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDYxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjMuMCIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfM18wLnhzZCIKKyAgICAgICAgbWV0YWRhdGEtY29tcGxldGU9InRydWUiPgorCisgICAgPGZpbHRlcj4KKyAgICAgICAgPGZpbHRlci1uYW1lPmplcnNleTI4MTI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8ZmlsdGVyLWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI4MTIuVGVzdEZpbHRlcjwvZmlsdGVyLWNsYXNzPgorICAgICAgICA8YXN5bmMtc3VwcG9ydGVkPnRydWU8L2FzeW5jLXN1cHBvcnRlZD4KKyAgICA8L2ZpbHRlcj4KKworICAgIDxmaWx0ZXI+CisgICAgICAgIDxmaWx0ZXItbmFtZT5qZXJzZXk8L2ZpbHRlci1uYW1lPgorICAgICAgICA8ZmlsdGVyLWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvZmlsdGVyLWNsYXNzPgorICAgICAgICA8YXN5bmMtc3VwcG9ydGVkPnRydWU8L2FzeW5jLXN1cHBvcnRlZD4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC53cy5ycy5BcHBsaWNhdGlvbjwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5hc3luYy5UZXN0QXBwbGljYXRpb248L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDwhLS0gbGV0IFNlcnZsZXRDb250YWluZXIjZG9GaWx0ZXIoSHR0cFNlcnZsZXRSZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlLCBGaWx0ZXJDaGFpbiwgU3RyaW5nLCBTdHJpbmcsIFN0cmluZykKKyAgICAgICAgICAgIHJlc29sdmUgdGhlIHJlc3BvbnNlIHN0YXR1cyAtLT4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qZXJzZXkuY29uZmlnLnNlcnZsZXQuZmlsdGVyLmZvcndhcmRPbjQwNDwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgIDwvZmlsdGVyPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+amVyc2V5MjgxMjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vYXN5bmNUZXN0L2FzeW5jL3dhaXQvKjwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPmplcnNleTwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vZXhjZXB0aW9uVGVzdC8qPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPmplcnNleTwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vYXN5bmNUZXN0Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8YWJzb2x1dGUtb3JkZXJpbmcgLz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2FzeW5jLWplcnNleS1maWx0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9hc3luYy9BYnN0cmFjdEFzeW5jSmVyc2V5VGVzdC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vYXN5bmMtamVyc2V5LWZpbHRlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2FzeW5jL0Fic3RyYWN0QXN5bmNKZXJzZXlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTJlMTkyNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2FzeW5jLWplcnNleS1maWx0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9hc3luYy9BYnN0cmFjdEFzeW5jSmVyc2V5VGVzdC5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uYXN5bmM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworLyoqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBBYnN0cmFjdEFzeW5jSmVyc2V5VGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhUZXN0QXBwbGljYXRpb24uY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vYXN5bmMtamVyc2V5LWZpbHRlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI3MzAvSmVyc2V5MjczMElUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vYXN5bmMtamVyc2V5LWZpbHRlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI3MzAvSmVyc2V5MjczMElUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzY2E3MjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9hc3luYy1qZXJzZXktZmlsdGVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjczMC9KZXJzZXkyNzMwSVRDYXNlLmphdmEKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyNzMwOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmFzeW5jLkFic3RyYWN0QXN5bmNKZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworCisvKioKKyAqIEpFUlNFWS0yNzMwIHJlcHJvZHVjZXIuCisgKiA8cC8+CisgKiBUaGlzIHRlc3QgbXVzdCBub3QgcnVuIGluIHBhcmFsbGVsLgorICoKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEplcnNleTI3MzBJVENhc2UgZXh0ZW5kcyBBYnN0cmFjdEFzeW5jSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHZvaWQgYXNzZXJ0TGFzdFRocmVhZE5vdFN0dWNrKCkgeworICAgICAgICBmaW5hbCBib29sZWFuIGxhc3RUaHJlYWRHb3RTdHVjayA9IHRhcmdldCgiL2V4Y2VwdGlvblRlc3QvZXhjZXB0aW9uL3JwYy9sYXN0dGhyZWFkc3R1Y2siKS5yZXF1ZXN0KCkuZ2V0KGJvb2xlYW4uY2xhc3MpOworCisgICAgICAgIGFzc2VydEZhbHNlKCJUaHJlYWQgcHJvY2Vzc2luZyBsYXN0IHJlcXVlc3QgZ290IHN0dWNrIHdoaWxlIHByb2Nlc3NpbmcgdGhlIHJlcXVlc3QgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgVGVzdEV4Y2VwdGlvblJlc291cmNlLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKSwKKyAgICAgICAgICAgICAgICBsYXN0VGhyZWFkR290U3R1Y2spOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYXN5bmNSZXNvdXJjZU51bGxUaHJvd2FibGVSZXR1cm5zNTAwQW5kRG9lc05vdFN0dWNrKCkgdGhyb3dzIEV4Y2VwdGlvbiAgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiL2V4Y2VwdGlvblRlc3QvZXhjZXB0aW9uL251bGwiKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRMYXN0VGhyZWFkTm90U3R1Y2soKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGFzeW5jUmVzb3VyY2VVbm1hcHBlZEV4Y2VwdGlvblJldHVybnM1MDBBbmREb2VzTm90U3R1Y2soKSB0aHJvd3MgRXhjZXB0aW9uICB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCIvZXhjZXB0aW9uVGVzdC9leGNlcHRpb24vdW5tYXBwZWQiKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRMYXN0VGhyZWFkTm90U3R1Y2soKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGFzeW5jUmVzb3VyY2VVbm1hcHBlZFJ1bnRpbWVFeGNlcHRpb25SZXR1cm5zNTAwQW5kRG9lc05vdFN0dWNrKCkgdGhyb3dzIEV4Y2VwdGlvbiAgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiL2V4Y2VwdGlvblRlc3QvZXhjZXB0aW9uL3J1bnRpbWUiKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRMYXN0VGhyZWFkTm90U3R1Y2soKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGFzeW5jUmVzb3VyY2VNYXBwZWRFeGNlcHRpb25SZXR1cm5zNDMyKCkgdGhyb3dzIEV4Y2VwdGlvbiAgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiL2V4Y2VwdGlvblRlc3QvZXhjZXB0aW9uL21hcHBlZCIpLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoNDMyLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydExhc3RUaHJlYWROb3RTdHVjaygpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYXN5bmNSZXNvdXJjZU5vbkV4aXN0ZW50UmV0dXJuczQwNCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiL2V4Y2VwdGlvblRlc3QvZXhjZXB0aW9uL25vdGZvdW5kIikucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydEVxdWFscyg0MDQsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2FzeW5jLWplcnNleS1maWx0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyODEyL0plcnNleTI4MTJJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2FzeW5jLWplcnNleS1maWx0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyODEyL0plcnNleTI4MTJJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODZhOGY0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vYXN5bmMtamVyc2V5LWZpbHRlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI4MTIvSmVyc2V5MjgxMklUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI4MTI7CisKK2ltcG9ydCBqYXZhLnV0aWwuVVVJRDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNSZWZlcmVuY2U7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkFzeW5jUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ2hhaW47CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhLlRocmVhZEZhY3RvcnlCdWlsZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmFzeW5jLkFic3RyYWN0QXN5bmNKZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogSkVSU0VZLTI4MTIgcmVwcm9kdWNlci4KKyAqIDxwLz4KKyAqIFRoaXMgdGVzdCBtdXN0IG5vdCBydW4gaW4gcGFyYWxsZWwuCisgKgorICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYSBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSmVyc2V5MjgxMklUQ2FzZSBleHRlbmRzIEFic3RyYWN0QXN5bmNKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEplcnNleTI4MTJJVENhc2UuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICBwcml2YXRlIHN0YXRpYyBsb25nIFdBSVRfVElNRU9VVCA9IDUwMDA7CisKKyAgICBwcml2YXRlIEF0b21pY1JlZmVyZW5jZTxTdHJpbmc+IGFzeW5jUmVzdWx0ID0gbmV3IEF0b21pY1JlZmVyZW5jZTw+KCk7CisgICAgcHJpdmF0ZSBTdHJpbmcgdXVpZCA9IFVVSUQucmFuZG9tVVVJRCgpLnRvU3RyaW5nKCk7CisgICAgcHJpdmF0ZSBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3JTZXJ2aWNlID0gRXhlY3V0b3JzCisgICAgICAgICAgICAubmV3U2luZ2xlVGhyZWFkRXhlY3V0b3IobmV3IFRocmVhZEZhY3RvcnlCdWlsZGVyKCkuc2V0RGFlbW9uKHRydWUpLmJ1aWxkKCkpOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHRyaWdnZXJUaGVXYWl0UmVxdWVzdEluU2VwYXJhdGVUaHJlYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZXhlY3V0b3JTZXJ2aWNlLmV4ZWN1dGUobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgTE9HR0VSLmZpbmVyKCJSdW5uaW5nIGEgcmVxdWVzdCB0byAvYXN5bmMvd2FpdCBpbiBhIHNlcGFyYXRlIHRocmVhZC4iKTsKKyAgICAgICAgICAgICAgICBhc3luY1Jlc3VsdC5zZXQodGFyZ2V0KCIvYXN5bmNUZXN0L2FzeW5jL3dhaXQiKS5wYXRoKHV1aWQpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHdoZXRoZXIgdGhlIHNlcnZlci1zaWRlIHRocmVhZCB0aGF0IGlzIHByb2Nlc3NpbmcgYSBodHRwIHJlcXVlc3QgdG8gdGhlIHNlcnZsZXQtZmlsdGVyLWJhc2VkIEplcnNleSBzZXR1cCBlbmRzIHVwCisgICAgICogc3R1Y2sgb3IgcmV0dXJuZWQgYmFjayB0byB0aGUgcG9vbCBvZiBhdmFpbGFibGUgdGhyZWFkcy4KKyAgICAgKiA8cC8+CisgICAgICogVGhpcyB0ZXN0IHByZXZlbnRzIGEgcmVncmVzc2lvbiByZXBvcnRlZCBpbiBKRVJTRVktMjgxMi4KKyAgICAgKiA8cC8+CisgICAgICogV2hlbiB0aGUge0BsaW5rIGphdmF4LndzLnJzLmNvbnRhaW5lci5Bc3luY1Jlc3BvbnNlfSB3YXMgbGVmdCBpbnRhY3QgaW4gdGhlIFJFU1RmdWwgcmVzb3VyY2UgKGFzIGltcGxlbWVudGVkIGluIHtAbGluaworICAgICAqIFRlc3RXYWl0UmVzb3VyY2Ujd2FpdEZvckV2ZW50KEFzeW5jUmVzcG9uc2UsIEh0dHBTZXJ2bGV0UmVxdWVzdCwgU3RyaW5nKX0pLCB0aGUgc2VydmVyLXNpZGUgSmVyc2V5IHRocmVhZCBlbmRlZCB1cCBpbgorICAgICAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LmludGVybmFsLlJlc3BvbnNlV3JpdGVyI2dldFJlc3BvbnNlQ29udGV4dCgpfSBibG9ja2VkIGJlY2F1c2Ugb2YgdGhlIHJlc29sdXRpb24gb2YgaHR0cAorICAgICAqIHJlc3BvbnNlIHN0YXR1cyBmcm9tIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXIjZG9GaWx0ZXIoSHR0cFNlcnZsZXRSZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlLAorICAgICAqIEZpbHRlckNoYWluLCBTdHJpbmcsIFN0cmluZywgU3RyaW5nKX0KKyAgICAgKiA8cC8+CisgICAgICogVGhpcyB0ZXN0IHVzZXMgYSBzZXBhcmF0ZSB0aHJlYWQgdG8gY2FsbCB7QGNvZGUgL2FzeW5jL3dhaXQve3V1aWR9fSByZXNvdXJjZSB3aGljaCBibG9ja3MgdW50aWwgdGhlIHtAY29kZQorICAgICAqIC9hc3luYy9yZWxlYXNlL3t1dWlkfX0gaXMgY2FsbGVkLiBJbiB0aGUgbWVhbnRpbWUgdGhlIEpVbml0IHRocmVhZCBjYWxscyB7QGNvZGUgL2FzeW5jL2F3YWl0L3t1dWlkfX0gdG8gZGlzY292ZXIgd2hldGhlcgorICAgICAqIHRoZSBzZXJ2ZXItc2lkZSB0aHJlYWQgcHJvY2Vzc2luZyB0aGUgcmVxdWVzdCB0byB7QGNvZGUgL2FzeW5jL2F3YWl0L3t1dWlkfS9zdGFydGVkfSBkaWQgc3RhcnQgcHJvY2Vzc2luZyBvZiB0aGUgcmVxdWVzdC4KKyAgICAgKiBDb25zZWN1dGl2ZWx5LCB0aGUgSlVuaXQgdGhyZWFkIGNhbGxzIHtAY29kZSAvYXN5bmMvYXdhaXQve3V1aWR9L2ZpbmlzaGVkfSB3aXRoIGEgdGltZW91dCB7QGNvZGUgI1dBSVRfVElNRU9VVH0gdG8gZGlzY292ZXIKKyAgICAgKiB3aGV0aGVyIHRoZSBzZXJ2ZXItc2lkZSB0aHJlYWQgZ290IHN0dWNrICh3aGljaCBpcyB3aGF0IEpFUlNFWS0yODEyIHJlcG9ydGVkKSBvciBub3QuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgYXN5bmNTdXNwZW5kZWRSZXNvdXJjZURvZXNOb3RHZXRTdHVjaygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBbMV0gd2FpdCBmb3IgdGhlIC9hc3luYy93YWl0IHJlcXVlc3QgdG8gYmUgcHJvY2Vzc2VkCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHN0YXJ0UmVzcG9uc2UgPSB0YXJnZXQoIi9hc3luY1Rlc3QvYXN5bmMvYXdhaXQiKS5wYXRoKHV1aWQpLnBhdGgoInN0YXJ0ZWQiKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJtaWxsaXMiLCBXQUlUX1RJTUVPVVQpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiVGhlIHNlcnZlci1zaWRlIHRocmVhZCBoYW5kbGluZyB0aGUgcmVxdWVzdCB0byAvYXN5bmMvd2FpdCBkaWRuJ3Qgc3RhcnQgaW4gdGltZWx5IGZhc2hpb24uICIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIlRoaXMgZXJyb3IgaW5kaWNhdGVzIHRoaXMgdGVzdCBpcyBub3QgZXhlY3V0ZWQgLyBkZXNpZ25lZCBwcm9wZXJseSByYXRoZXIgdGhhbiBhIHJlZ3Jlc3Npb24gaW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiSkVSU0VZLTI4MTIgZml4LiIsCisgICAgICAgICAgICAgICAgc3RhcnRSZXNwb25zZS5yZWFkRW50aXR5KEJvb2xlYW4uY2xhc3MpKTsKKworICAgICAgICAvLyBbMl0gd2FpdCBmb3IgdGhlIC9hc3luYy93YWl0IHJlcXVlc3QgdG8gZmluaXNoCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIGZpbmlzaFJlc3BvbnNlID0gdGFyZ2V0KCIvYXN5bmNUZXN0L2FzeW5jL2F3YWl0IikucGF0aCh1dWlkKS5wYXRoKCJmaW5pc2hlZCIpCisgICAgICAgICAgICAgICAgLnF1ZXJ5UGFyYW0oIm1pbGxpcyIsIFdBSVRfVElNRU9VVCkucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUcnVlKCJUaGUgdGhyZWFkIHByb2Nlc3NpbmcgdGhlIC9hc3luYy93YWl0IHJlcXVlc3QgZGlkIG5vdCByZXNwb25kIGluIHRpbWVseSBmYXNoaW9uLiAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJNZW1vcnkgbGVhayAvIHRocmVhZCBnb3Qgc3R1Y2sgZGV0ZWN0ZWQhIiwKKyAgICAgICAgICAgICAgICBmaW5pc2hSZXNwb25zZS5yZWFkRW50aXR5KEJvb2xlYW4uY2xhc3MpKTsKKworICAgICAgICAvLyBbM10gcmVsZWFzZSB0aGUgYmxvY2tlZCBodHRwIGNhbGwgdG8gL2FzeW5jL3dhaXQKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlbGVhc2VSZXNwb25zZSA9IHRhcmdldCgiL2FzeW5jVGVzdC9hc3luYy9yZWxlYXNlIikucGF0aCh1dWlkKS5yZXF1ZXN0KCkucG9zdChudWxsLCBTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlJFTEVBU0VEIiwgcmVsZWFzZVJlc3BvbnNlKTsKKworICAgICAgICAvLyBbNF0gdGVzdCB3aGV0aGVyIGV2ZXJ5dGhpbmcgZW5kZWQgYXMgZXhwZWN0ZWQKKyAgICAgICAgZXhlY3V0b3JTZXJ2aWNlLnNodXRkb3duKCk7CisgICAgICAgIGFzc2VydFRydWUoIlRoZSB0ZXN0IHRocmVhZCBkaWQgbm90IGZpbmlzaCBpbiB0aW1lbHkgZmFzaGlvbiEiLAorICAgICAgICAgICAgICAgIGV4ZWN1dG9yU2VydmljZS5hd2FpdFRlcm1pbmF0aW9uKFdBSVRfVElNRU9VVCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiYXN5bmMtT0stIiArIHV1aWQsIGFzeW5jUmVzdWx0LmdldCgpKTsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCByZWxlYXNlUmVzb3VyY2VzKCkgeworICAgICAgICAvLyByZWxlYXNlIHRoZSBzZXJ2ZXItc2lkZSB0aHJlYWQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIGxlZnQgdW4tYXR0ZW5kZWQKKyAgICAgICAgdGFyZ2V0KCIvYXN5bmNUZXN0L2FzeW5jL3JlbGVhc2UiKS5wYXRoKHV1aWQpLnJlcXVlc3QoKS5wb3N0KG51bGwpOworICAgIH0KKworICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIHRlcm1pbmF0ZVRocmVhZCgpIHsKKyAgICAgICAgLy8gZm9yY2libHkgdGVybWluYXRlIHRoZSB0ZXN0IGNsaWVudCB0aHJlYWQKKyAgICAgICAgZXhlY3V0b3JTZXJ2aWNlLnNodXRkb3duTm93KCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGYyMDFkMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvcG9tLnhtbApAQCAtMCwwICsxLDExNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWNkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHA8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+SmVyc2V5IENESS9CZWFuIFZhbGlkYXRpb24gdGVzdCB3ZWIgYXBwbGljYXRpb248L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC53cy5yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LndzLnJzLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5hbm5vdGF0aW9uPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguYW5ub3RhdGlvbi1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguZW50ZXJwcmlzZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmNkaS1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWJlYW4tdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuaGliZXJuYXRlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGliZXJuYXRlLXZhbGlkYXRvci1jZGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS13ZWxkMi1zZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNkaTF4PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jZGkxeC12YWxpZGF0aW9uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5ydW4tZXh0ZXJuYWwtdGVzdHM8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN5c3RlbVByb3BlcnR5VmFyaWFibGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5mYWN0b3J5PiR7ZXh0ZXJuYWwuY29udGFpbmVyLmZhY3Rvcnl9PC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+JHtleHRlcm5hbC5jb250YWluZXIucG9ydH08L2plcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N5c3RlbVByb3BlcnR5VmFyaWFibGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICAgICAgPHByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgPCEtLSBFeHRlcm5hbCB0ZXN0IGNvbnRhaW5lciBjb25maWd1cmF0aW9uIGlzIGRvbmUgdmlhIHByb3BlcnRpZXMgdG8gYWxsb3cgb3ZlcnJpZGluZyB2aWEgY29tbWFuZCBsaW5lLiAtLT4KKyAgICAgICAgICAgICAgICA8ZXh0ZXJuYWwuY29udGFpbmVyLmZhY3Rvcnk+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5PC9leHRlcm5hbC5jb250YWluZXIuZmFjdG9yeT4KKyAgICAgICAgICAgICAgICA8ZXh0ZXJuYWwuY29udGFpbmVyLnBvcnQ+ODA4MDwvZXh0ZXJuYWwuY29udGFpbmVyLnBvcnQ+CisgICAgICAgICAgICAgICAgPG1hdmVuLnRlc3Quc2tpcD5mYWxzZTwvbWF2ZW4udGVzdC5za2lwPgorICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKyAgICA8YnVpbGQ+CisgICAgICAgIDxmaW5hbE5hbWU+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9maW5hbE5hbWU+CisgICAgPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvQ2RpQXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvQ2RpQXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWRjYzEyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9idi9DZGlBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLmJ2OworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5BcHBsaWNhdGlvblNjb3BlZDsKK2ltcG9ydCBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworLyoqCisgKiBKQVgtUlMgYXBwbGljYXRpb24gdG8gY29uZmlndXJlIHJlc291cmNlcy4KKyAqIFRoaXMgb25lIGlzIGNvbmZpZ3VyZWQgYXMgYSBDREkgYmVhbi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAQXBwbGljYXRpb25QYXRoKCIvY2RpIikKK0BBcHBsaWNhdGlvblNjb3BlZAorcHVibGljIGNsYXNzIENkaUFwcGxpY2F0aW9uIGV4dGVuZHMgQXBwbGljYXRpb24geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBIYXNoU2V0PENsYXNzPD8+PigpIHt7CisgICAgICAgICAgICBhZGQoQ2RpRmllbGRJbmplY3RlZFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgICAgIGFkZChDZGlQYXJhbUluamVjdGVkUmVzb3VyY2UuY2xhc3MpOworICAgICAgICAgICAgYWRkKENkaVByb3BlcnR5SW5qZWN0ZWRSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgICAgICBhZGQoQ2RpT2xkRmFzaGlvbmVkUmVzb3VyY2UuY2xhc3MpOworCisgICAgICAgICAgICBhZGQoQ2RpVmFsaWRhdGlvbkludGVyY2VwdG9yLmNsYXNzKTsKKyAgICAgICAgfX07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9idi9DZGlGaWVsZEluamVjdGVkUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvQ2RpRmllbGRJbmplY3RlZFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFkMDVjZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvQ2RpRmllbGRJbmplY3RlZFJlc291cmNlLmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkuYnY7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuUmVxdWVzdFNjb3BlZDsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CisKKy8qKgorICogVGhpcyBDREkgYmFja2VkIHJlc291cmNlIHNob3VsZCBnZXQgdmFsaWRhdGVkIGFuZCB2YWxpZGF0aW9uIHJlc3VsdCBmaWVsZCBpbmplY3RlZC4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgidmFsaWRhdGVkL2ZpZWxkIikKK0BSZXF1ZXN0U2NvcGVkCitwdWJsaWMgY2xhc3MgQ2RpRmllbGRJbmplY3RlZFJlc291cmNlIHsKKworICAgIEBJbmplY3QKKyAgICBWYWxpZGF0aW9uUmVzdWx0IHZhbGlkYXRpb25SZXN1bHQ7CisKKyAgICBASW5qZWN0CisgICAgTm9uSmF4UnNWYWxpZGF0ZWRCZWFuIGNkaUJlYW47CisKKyAgICBAUXVlcnlQYXJhbSgicSIpCisgICAgQE5vdE51bGwKKyAgICBTdHJpbmcgcTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBudW1iZXIgb2YgdmFsaWRhdGlvbiBpc3N1ZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHZhbHVlIGZyb20gZmllbGQgaW5qZWN0ZWQgdmFsaWRhdGlvbiBiZWFuLgorICAgICAqLworICAgIEBQYXRoKCJ2YWxpZGF0ZSIpCisgICAgQEdFVAorICAgIHB1YmxpYyBpbnQgZ2V0VmFsaWRhdGUoKSB7CisKKyAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25SZXN1bHQuZ2V0VmlvbGF0aW9uQ291bnQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gbnVtYmVyIG9mIHZhbGlkYXRpb24gaXNzdWVzIGZvciBub24gSkFYLVJTIGJlYW4uCisgICAgICogVGhpcyBpcyB0byBtYWtlIHN1cmUgdGhlIGltcGxpY2l0IEhpYmVybmF0ZSB2YWxpZGF0b3IKKyAgICAgKiBpcyBmdW5jdGlvbmluZyBmb3IgcmF3IENESSBiZWFucywgd2hlcmUgSmVyc2V5CisgICAgICogaXMgbm90IGludm9sdmVkIGluIG1ldGhvZCBpbnZvY2F0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBudW1iZXIgb2YgdmFsaWRhdGlvbiBpc3N1ZXMgcmV2ZWFsZWQgd2hlbiBpbnZva2luZyBpbmplY3RlZCBDREkgYmVhbi4KKyAgICAgKi8KKyAgICBAUGF0aCgidmFsaWRhdGUvbm9uLWpheHJzIikKKyAgICBAR0VUCisgICAgcHVibGljIGludCBnZXRWYWxpZGF0ZU5vbkpheFJzKEBRdWVyeVBhcmFtKCJoIikgU3RyaW5nIGgpIHsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2RpQmVhbi5lY2hvKGgpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0gY2F0Y2ggKENvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIHJldHVybiBleC5nZXRDb25zdHJhaW50VmlvbGF0aW9ucygpLnNpemUoKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9idi9DZGlPbGRGYXNoaW9uZWRSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9idi9DZGlPbGRGYXNoaW9uZWRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3YTU4MDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL2J2L0NkaU9sZEZhc2hpb25lZFJlc291cmNlLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkuYnY7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LlJlcXVlc3RTY29wZWQ7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOworCisvKioKKyAqIFRoaXMgQ0RJIGJhY2tlZCByZXNvdXJjZSBzaG91bGQgZ2V0IHZhbGlkYXRlZC4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgib2xkL2Zhc2hpb25lZCIpCitAUmVxdWVzdFNjb3BlZAorcHVibGljIGNsYXNzIENkaU9sZEZhc2hpb25lZFJlc291cmNlIHsKKworICAgIC8qKgorICAgICAqIFF1ZXJ5IHBhcmFtIGdldHRlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gcXVlcnkgcGFyYW0gdmFsdWUuCisgICAgICovCisgICAgQFBhdGgoInZhbGlkYXRlIikKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBnZXRRKEBRdWVyeVBhcmFtKCJxIikgQE5vdE51bGwgU3RyaW5nIHEpIHsKKworICAgICAgICByZXR1cm4gcTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL2J2L0NkaVBhcmFtSW5qZWN0ZWRSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9idi9DZGlQYXJhbUluamVjdGVkUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGY3NGM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9idi9DZGlQYXJhbUluamVjdGVkUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5idjsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5SZXF1ZXN0U2NvcGVkOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuTm90TnVsbDsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKKworLyoqCisgKiBUaGlzIENESSBiYWNrZWQgcmVzb3VyY2Ugc2hvdWxkIGdldCB2YWxpZGF0ZWQuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoInZhbGlkYXRlZC9wYXJhbSIpCitAUmVxdWVzdFNjb3BlZAorcHVibGljIGNsYXNzIENkaVBhcmFtSW5qZWN0ZWRSZXNvdXJjZSB7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gbnVtYmVyIG9mIHZhbGlkYXRpb24gaXNzdWVzLgorICAgICAqCisgICAgICogQHJldHVybiB2YWx1ZSBmcm9tIHBhcmFtIGluamVjdGVkIHZhbGlkYXRpb24gYmVhbi4KKyAgICAgKi8KKyAgICBAUGF0aCgidmFsaWRhdGUiKQorICAgIEBHRVQKKyAgICBwdWJsaWMgaW50IGdldFZhbGlkYXRlKEBRdWVyeVBhcmFtKCJxIikgQE5vdE51bGwgU3RyaW5nIHEsIEBDb250ZXh0IFZhbGlkYXRpb25SZXN1bHQgdmFsaWRhdGlvblJlc3VsdCkgeworCisgICAgICAgIHJldHVybiB2YWxpZGF0aW9uUmVzdWx0LmdldFZpb2xhdGlvbkNvdW50KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9idi9DZGlQcm9wZXJ0eUluamVjdGVkUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvQ2RpUHJvcGVydHlJbmplY3RlZFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFmOGE4NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvQ2RpUHJvcGVydHlJbmplY3RlZFJlc291cmNlLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkuYnY7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuUmVxdWVzdFNjb3BlZDsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LmludGVyY2VwdG9yLkFyb3VuZEludm9rZTsKK2ltcG9ydCBqYXZheC5pbnRlcmNlcHRvci5JbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC5pbnRlcmNlcHRvci5JbnRlcmNlcHRvcnM7CitpbXBvcnQgamF2YXguaW50ZXJjZXB0b3IuSW52b2NhdGlvbkNvbnRleHQ7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CisKKy8qKgorICogVGhpcyBDREkgYmFja2VkIHJlc291cmNlIHNob3VsZCBnZXQgdmFsaWRhdGVkIGFuZCB2YWxpZGF0aW9uIHJlc3VsdCBwcm9wZXJ0eSBpbmplY3RlZC4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgidmFsaWRhdGVkL3Byb3BlcnR5IikKK0BSZXF1ZXN0U2NvcGVkCitwdWJsaWMgY2xhc3MgQ2RpUHJvcGVydHlJbmplY3RlZFJlc291cmNlIHsKKworICAgIHByaXZhdGUgVmFsaWRhdGlvblJlc3VsdCB2YWxpZGF0aW9uUmVzdWx0OworCisgICAgQEluamVjdAorICAgIHB1YmxpYyB2b2lkIHNldFZhbGlkYXRpb25SZXN1bHQoVmFsaWRhdGlvblJlc3VsdCB2YWxpZGF0aW9uUmVzdWx0KSB7CisgICAgICAgIHRoaXMudmFsaWRhdGlvblJlc3VsdCA9IHZhbGlkYXRpb25SZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIFZhbGlkYXRpb25SZXN1bHQgZ2V0VmFsaWRhdGlvblJlc3VsdCgpIHsKKyAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25SZXN1bHQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIG51bWJlciBvZiB2YWxpZGF0aW9uIGlzc3Vlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdmFsdWUgZnJvbSBmaWVsZCBpbmplY3RlZCB2YWxpZGF0aW9uIGJlYW4uCisgICAgICovCisgICAgQFBhdGgoInZhbGlkYXRlIikKKyAgICBAR0VUCisgICAgcHVibGljIGludCBnZXRWYWxpZGF0ZShAUXVlcnlQYXJhbSgicSIpIEBOb3ROdWxsIFN0cmluZyBxKSB7CisKKyAgICAgICAgcmV0dXJuIGdldFZhbGlkYXRpb25SZXN1bHQoKS5nZXRWaW9sYXRpb25Db3VudCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvQ2RpVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL2J2L0NkaVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZjlkOWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL2J2L0NkaVZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCkBAIC0wLDAgKzEsMTEzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5idjsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5BcHBsaWNhdGlvblNjb3BlZDsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkYXRpb25FeGNlcHRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLlZhbGlkYXRpb25JbnRlcmNlcHRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLlZhbGlkYXRpb25JbnRlcmNlcHRvckNvbnRleHQ7CisKK2ltcG9ydCBvcmcuamJvc3Mud2VsZC5pbnRlcmNlcHRvci51dGlsLnByb3h5LlRhcmdldEluc3RhbmNlUHJveHk7CisKKy8qKgorICogQ0RJIGJhY2tlZCBpbnRlcmNlcHRvciB0byBoYW5kbGUgdmFsaWRhdGlvbiBpc3N1ZXMuCisgKgorICogQGF1dGhvciBKYWt1IFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAQXBwbGljYXRpb25TY29wZWQKK3B1YmxpYyBjbGFzcyBDZGlWYWxpZGF0aW9uSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBWYWxpZGF0aW9uSW50ZXJjZXB0b3IgeworCisgICAgcHJpdmF0ZSBmaW5hbCBDZGlWYWxpZGF0aW9uUmVzdWx0IHZhbGlkYXRpb25SZXN1bHQ7CisgICAgcHJpdmF0ZSBmaW5hbCBDZGlQcm9wZXJ0eUluamVjdGVkUmVzb3VyY2UgcGlyOworCisgICAgLyoqCisgICAgICogRW1wdHkgY29uc3RydWN0b3IgdG8gbWFrZSBDREkgaGFwcHkuCisgICAgICovCisgICAgQFN1cHByZXNzV2FybmluZ3MoIlVudXNlZERlY2xhcmF0aW9uIikKKyAgICBwdWJsaWMgQ2RpVmFsaWRhdGlvbkludGVyY2VwdG9yKCkgeworICAgICAgICB0aGlzLnZhbGlkYXRpb25SZXN1bHQgPSBudWxsOworICAgICAgICB0aGlzLnBpciA9IG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogSW5qZWN0aW9uIGNvbnN0cnVjdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbGlkYXRpb25SZXN1bHQgIENESSBpbXBsZW1lbnRhdGlvbiBvZiB2YWxpZGF0aW9uIHJlc3VsdC4KKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgQ0RJIHByb3BlcnR5LWluamVjdGVkIEpBWC1SUyByZXNvdXJjZS4KKyAgICAgKi8KKyAgICBASW5qZWN0CisgICAgcHVibGljIENkaVZhbGlkYXRpb25JbnRlcmNlcHRvcihDZGlWYWxpZGF0aW9uUmVzdWx0IHZhbGlkYXRpb25SZXN1bHQsIENkaVByb3BlcnR5SW5qZWN0ZWRSZXNvdXJjZSByZXNvdXJjZSkgeworICAgICAgICB0aGlzLnZhbGlkYXRpb25SZXN1bHQgPSB2YWxpZGF0aW9uUmVzdWx0OworICAgICAgICB0aGlzLnBpciA9IHJlc291cmNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uVmFsaWRhdGUoVmFsaWRhdGlvbkludGVyY2VwdG9yQ29udGV4dCBjdHgpIHRocm93cyBWYWxpZGF0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICBmaW5hbCBPYmplY3QgcmVzb3VyY2UgPSBjdHguZ2V0UmVzb3VyY2UoKTsKKyAgICAgICAgaWYgKHJlc291cmNlIGluc3RhbmNlb2YgVGFyZ2V0SW5zdGFuY2VQcm94eSkgeworICAgICAgICAgICAgY3R4LnNldFJlc291cmNlKCgoVGFyZ2V0SW5zdGFuY2VQcm94eSkgcmVzb3VyY2UpLmdldFRhcmdldEluc3RhbmNlKCkpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGN0eC5wcm9jZWVkKCk7CisgICAgICAgIH0gY2F0Y2ggKENvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24gY29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbikgeworCisgICAgICAgICAgICAvLyBGaXJzdCBjaGVjayBmb3IgYSBwcm9wZXJ0eQorICAgICAgICAgICAgaWYgKFZhbGlkYXRpb25SZXN1bHRVdGlsLmhhc1ZhbGlkYXRpb25SZXN1bHRQcm9wZXJ0eShyZXNvdXJjZSkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBNZXRob2QgdmFsaWRhdGlvblJlc3VsdEdldHRlciA9IFZhbGlkYXRpb25SZXN1bHRVdGlsLmdldFZhbGlkYXRpb25SZXN1bHRHZXR0ZXIocmVzb3VyY2UpOworICAgICAgICAgICAgICAgIFZhbGlkYXRpb25SZXN1bHRVdGlsLnVwZGF0ZVZhbGlkYXRpb25SZXN1bHRQcm9wZXJ0eShyZXNvdXJjZSwgdmFsaWRhdGlvblJlc3VsdEdldHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24uZ2V0Q29uc3RyYWludFZpb2xhdGlvbnMoKSk7CisgICAgICAgICAgICAgICAgcGlyLnNldFZhbGlkYXRpb25SZXN1bHQodmFsaWRhdGlvblJlc3VsdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFRoZW4gY2hlY2sgZm9yIGEgZmllbGQKKyAgICAgICAgICAgICAgICBmaW5hbCBGaWVsZCB2ciA9IFZhbGlkYXRpb25SZXN1bHRVdGlsLmdldFZhbGlkYXRpb25SZXN1bHRGaWVsZChyZXNvdXJjZSk7CisgICAgICAgICAgICAgICAgaWYgKHZyICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB0aGUgcmlnaHQgZ3V5LCBubyBuZWVkIHRvIHVzZSByZWZsZWN0aW9uOgorICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uUmVzdWx0LnNldFZpb2xhdGlvbnMoY29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbi5nZXRDb25zdHJhaW50VmlvbGF0aW9ucygpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoaXNWYWxpZGF0aW9uUmVzdWx0SW5BcmdzKGN0eC5nZXRBcmdzKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYXRpb25SZXN1bHQuc2V0VmlvbGF0aW9ucyhjb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uLmdldENvbnN0cmFpbnRWaW9sYXRpb25zKCkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgY29uc3RyYWludFZpb2xhdGlvbkV4Y2VwdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkYXRpb25SZXN1bHRJbkFyZ3MoT2JqZWN0W10gYXJncykgeworICAgICAgICBmb3IgKE9iamVjdCBhIDogYXJncykgeworICAgICAgICAgICAgaWYgKGEgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIENsYXNzPD8+IGFyZ0NsYXNzID0gYS5nZXRDbGFzcygpOworICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFZhbGlkYXRpb25SZXN1bHQuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShhcmdDbGFzcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGFyZ0NsYXNzID0gYXJnQ2xhc3MuZ2V0U3VwZXJjbGFzcygpOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKGFyZ0NsYXNzICE9IE9iamVjdC5jbGFzcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvQ2RpVmFsaWRhdGlvblJlc3VsdC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9idi9DZGlWYWxpZGF0aW9uUmVzdWx0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJlZDNmZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvQ2RpVmFsaWRhdGlvblJlc3VsdC5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLmJ2OworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5SZXF1ZXN0U2NvcGVkOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uQ29uc3RyYWludFZpb2xhdGlvbjsKKworLyoqCisgKiBDREkgaW1wbGVtZW50YXRpb24gb2YgdmFsaWRhdGlvbiByZXN1bHQuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJlcXVlc3RTY29wZWQKK3B1YmxpYyBjbGFzcyBDZGlWYWxpZGF0aW9uUmVzdWx0IGltcGxlbWVudHMgVmFsaWRhdGlvblJlc3VsdCB7CisKKyAgICBwcml2YXRlIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPD8+PiBjb25zdHJhaW50VmlvbGF0aW9uU2V0OworCisgICAgcHVibGljIHZvaWQgc2V0VmlvbGF0aW9ucyhTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjw/Pj4gdmlvbGF0aW9ucykgeworICAgICAgICB0aGlzLmNvbnN0cmFpbnRWaW9sYXRpb25TZXQgPSBuZXcgSGFzaFNldDw+KHZpb2xhdGlvbnMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjw/Pj4gZ2V0QWxsVmlvbGF0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIGNvbnN0cmFpbnRWaW9sYXRpb25TZXQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNGYWlsZWQoKSB7CisgICAgICAgIHJldHVybiAoY29uc3RyYWludFZpb2xhdGlvblNldCAhPSBudWxsKSA/ICFjb25zdHJhaW50VmlvbGF0aW9uU2V0LmlzRW1wdHkoKSA6IGZhbHNlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0VmlvbGF0aW9uQ291bnQoKSB7CisgICAgICAgIHJldHVybiAoY29uc3RyYWludFZpb2xhdGlvblNldCAhPSBudWxsKSA/IGNvbnN0cmFpbnRWaW9sYXRpb25TZXQuc2l6ZSgpIDogMDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL2J2L0NkaVZhbGlkYXRpb25SZXN1bHRCaW5kZXIuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvQ2RpVmFsaWRhdGlvblJlc3VsdEJpbmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyYmRiNzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL2J2L0NkaVZhbGlkYXRpb25SZXN1bHRCaW5kZXIuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5idjsKKworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuQmVhbk1hbmFnZXI7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkV4dGVuc2lvbjsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTF4LmludGVybmFsLkNkaVV0aWw7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTF4LmludGVybmFsLkdlbmVyaWNDZGlCZWFuU3VwcGxpZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkJpbmRpbmc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkJpbmRpbmdzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29tcG9uZW50UHJvdmlkZXI7CisKKy8qKgorICogVXRpbGl0eSB0aGF0IGJpbmRzIEhLMiBmYWN0b3J5IHRvIHByb3ZpZGUgQ0RJIG1hbmFnZWQgdmFsaWRhdGlvbiByZXN1bHQgYmVhbi4KKyAqIFRoaXMgaXMgdG8gbWFrZSBzdXJlIHZhbGlkYXRpb24gcmVzdWx0IGNvdWxkIGJlIGluamVjdGVkIGFzIGEgcmVzb3VyY2UgbWV0aG9kIHBhcmFtZXRlcgorICogZXZlbiB3aGVuIHJ1bm5pbmcgaW4gQ0RJIGVudmlyb25tZW50LgorICovCitwdWJsaWMgY2xhc3MgQ2RpVmFsaWRhdGlvblJlc3VsdEJpbmRlciBpbXBsZW1lbnRzIEV4dGVuc2lvbiwgQ29tcG9uZW50UHJvdmlkZXIgeworCisgICAgQEluamVjdAorICAgIEJlYW5NYW5hZ2VyIGJlYW5NYW5hZ2VyOworCisgICAgSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIpIHsKKyAgICAgICAgdGhpcy5pbmplY3Rpb25NYW5hZ2VyID0gaW5qZWN0aW9uTWFuYWdlcjsKKyAgICAgICAgdGhpcy5iZWFuTWFuYWdlciA9IENkaVV0aWwuZ2V0QmVhbk1hbmFnZXIoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBiaW5kKENsYXNzPD8+IGNvbXBvbmVudCwgU2V0PENsYXNzPD8+PiBwcm92aWRlckNvbnRyYWN0cykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIHZvaWQgZG9uZSgpIHsKKyAgICAgICAgaWYgKGJlYW5NYW5hZ2VyICE9IG51bGwpIHsgLy8gaW4gQ0RJIGVudmlyb25tZW50CisgICAgICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSBCaW5kaW5ncworICAgICAgICAgICAgICAgICAgICAuc3VwcGxpZXIobmV3IEdlbmVyaWNDZGlCZWFuU3VwcGxpZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2RpVmFsaWRhdGlvblJlc3VsdC5jbGFzcywgaW5qZWN0aW9uTWFuYWdlciwgYmVhbk1hbmFnZXIsIHRydWUpKQorICAgICAgICAgICAgICAgICAgICAudG8oQ2RpVmFsaWRhdGlvblJlc3VsdC5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgLnRvKFZhbGlkYXRpb25SZXN1bHQuY2xhc3MpOworCisgICAgICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLnJlZ2lzdGVyKGJpbmRpbmcpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9idi9IazJBcHBsaWNhdGlvbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9idi9IazJBcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZWZiMTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL2J2L0hrMkFwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkuYnY7CisKK2ltcG9ydCBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGg7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5WZXRvZWQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQWJzdHJhY3RCaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5pbnRlcm5hbC5SZXF1ZXN0U2NvcGVkOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworLyoqCisgKiBKQVgtUlMgYXBwbGljYXRpb24gdG8gY29uZmlndXJlIHJlc291cmNlcy4KKyAqIFRoaXMgb25lIHdpbGwgZ2V0IGZ1bGx5IG1hbmFnZWQgYnkgSEsyLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BBcHBsaWNhdGlvblBhdGgoIi9oazIiKQorQFZldG9lZAorcHVibGljIGNsYXNzIEhrMkFwcGxpY2F0aW9uIGV4dGVuZHMgUmVzb3VyY2VDb25maWcgeworCisgICAgcHVibGljIEhrMkFwcGxpY2F0aW9uKCkgeworICAgICAgICBzdXBlcihIazJQYXJhbUluamVjdGVkUmVzb3VyY2UuY2xhc3MsCisgICAgICAgICAgICAgICAgSGsyRmllbGRJbmplY3RlZFJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgIEhrMlByb3BlcnR5SW5qZWN0ZWRSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICBIazJPbGRGYXNoaW9uZWRSZXNvdXJjZS5jbGFzcyk7CisKKyAgICAgICAgcmVnaXN0ZXIobmV3IEhrMlZhbGlkYXRpb25JbnRlcmNlcHRvci5CaW5kZXIoKSk7CisgICAgICAgIHJlZ2lzdGVyKG5ldyBBYnN0cmFjdEJpbmRlcigpeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgICAgICBiaW5kQXNDb250cmFjdChIazJWYWxpZGF0aW9uUmVzdWx0LmNsYXNzKS50byhWYWxpZGF0aW9uUmVzdWx0LmNsYXNzKS5pbihSZXF1ZXN0U2NvcGVkLmNsYXNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL2J2L0hrMkZpZWxkSW5qZWN0ZWRSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9idi9IazJGaWVsZEluamVjdGVkUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDNiODUwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9idi9IazJGaWVsZEluamVjdGVkUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5idjsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LlZldG9lZDsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CisKKy8qKgorICogVGhpcyBvbmUgc2hvdWxkIGdldCB2YWxpZGF0ZWQuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoInZhbGlkYXRlZC9maWVsZCIpCitAVmV0b2VkCitwdWJsaWMgY2xhc3MgSGsyRmllbGRJbmplY3RlZFJlc291cmNlIHsKKworICAgIEBRdWVyeVBhcmFtKCJxIikKKyAgICBATm90TnVsbAorICAgIFN0cmluZyBxOworCisgICAgQENvbnRleHQKKyAgICBWYWxpZGF0aW9uUmVzdWx0IHZhbGlkYXRpb25SZXN1bHQ7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gbnVtYmVyIG9mIHZhbGlkYXRpb24gaXNzdWVzLgorICAgICAqCisgICAgICogQHJldHVybiB2YWx1ZSBmcm9tIGZpZWxkIHByb2R1Y2VkIGJlYW4uCisgICAgICovCisgICAgQFBhdGgoInZhbGlkYXRlIikKKyAgICBAR0VUCisgICAgcHVibGljIGludCBnZXRWYWxpZGF0ZSgpIHsKKyAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25SZXN1bHQuZ2V0VmlvbGF0aW9uQ291bnQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL2J2L0hrMk9sZEZhc2hpb25lZFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL2J2L0hrMk9sZEZhc2hpb25lZFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFjODU5NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvSGsyT2xkRmFzaGlvbmVkUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5idjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5WZXRvZWQ7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOworCisvKioKKyAqIFRoaXMgSEsyIG1hbmFnZWQgcmVzb3VyY2Ugc2hvdWxkIGdldCB2YWxpZGF0ZWQuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIm9sZC9mYXNoaW9uZWQiKQorQFZldG9lZAorcHVibGljIGNsYXNzIEhrMk9sZEZhc2hpb25lZFJlc291cmNlIHsKKworICAgIC8qKgorICAgICAqIFF1ZXJ5IHBhcmFtIGdldHRlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gcXVlcnkgcGFyYW1ldGVyIHZhbHVlLgorICAgICAqLworICAgIEBQYXRoKCJ2YWxpZGF0ZSIpCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UShAUXVlcnlQYXJhbSgicSIpIEBOb3ROdWxsIFN0cmluZyBxKSB7CisKKyAgICAgICAgcmV0dXJuIHE7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9idi9IazJQYXJhbUluamVjdGVkUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvSGsyUGFyYW1JbmplY3RlZFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU5YTZmYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvSGsyUGFyYW1JbmplY3RlZFJlc291cmNlLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkuYnY7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5WZXRvZWQ7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworCisvKioKKyAqIFRoaXMgSEsyIG1hbmFnZWQgcmVzb3VyY2Ugc2hvdWxkIGdldCB2YWxpZGF0ZWQgYW5kIHZhbGlkYXRpb24KKyAqIHJlc3VsdCBpbmplY3RlZCB2aWEgcmVzb3VyY2UgbWV0aG9kIHBhcmFtZXRlci4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgidmFsaWRhdGVkL3BhcmFtIikKK0BWZXRvZWQKK3B1YmxpYyBjbGFzcyBIazJQYXJhbUluamVjdGVkUmVzb3VyY2UgeworCisgICAgLyoqCisgICAgICogUmV0dXJuIG51bWJlciBvZiB2YWxpZGF0aW9uIGlzc3Vlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdmFsdWUgZnJvbSBmaWVsZCBwcm9kdWNlZCBiZWFuLgorICAgICAqLworICAgIEBQYXRoKCJ2YWxpZGF0ZSIpCisgICAgQEdFVAorICAgIHB1YmxpYyBpbnQgZ2V0VmFsaWRhdGUoQFF1ZXJ5UGFyYW0oInEiKSBATm90TnVsbCBTdHJpbmcgcSwgQENvbnRleHQgSGsyVmFsaWRhdGlvblJlc3VsdCB2YWxpZGF0aW9uUmVzdWx0KSB7CisKKyAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25SZXN1bHQuZ2V0VmlvbGF0aW9uQ291bnQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL2J2L0hrMlByb3BlcnR5SW5qZWN0ZWRSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9idi9IazJQcm9wZXJ0eUluamVjdGVkUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTAyYjA5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9idi9IazJQcm9wZXJ0eUluamVjdGVkUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5idjsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LlZldG9lZDsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CisKKy8qKgorICogVGhpcyBvbmUgc2hvdWxkIGdldCB2YWxpZGF0ZWQuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoInZhbGlkYXRlZC9wcm9wZXJ0eSIpCitAVmV0b2VkCitwdWJsaWMgY2xhc3MgSGsyUHJvcGVydHlJbmplY3RlZFJlc291cmNlIHsKKworICAgIEBRdWVyeVBhcmFtKCJxIikKKyAgICBATm90TnVsbAorICAgIFN0cmluZyBxOworCisgICAgVmFsaWRhdGlvblJlc3VsdCB2YWxpZGF0aW9uUmVzdWx0OworCisgICAgcHVibGljIFZhbGlkYXRpb25SZXN1bHQgZ2V0VmFsaWRhdGlvblJlc3VsdCgpIHsKKyAgICAgICAgcmV0dXJuIHZhbGlkYXRpb25SZXN1bHQ7CisgICAgfQorCisgICAgQENvbnRleHQKKyAgICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0aW9uUmVzdWx0KFZhbGlkYXRpb25SZXN1bHQgdmFsaWRhdGlvblJlc3VsdCkgeworICAgICAgICB0aGlzLnZhbGlkYXRpb25SZXN1bHQgPSB2YWxpZGF0aW9uUmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybiBudW1iZXIgb2YgdmFsaWRhdGlvbiBpc3N1ZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHZhbHVlIGZyb20gZmllbGQgcHJvZHVjZWQgYmVhbi4KKyAgICAgKi8KKyAgICBAUGF0aCgidmFsaWRhdGUiKQorICAgIEBHRVQKKyAgICBwdWJsaWMgaW50IGdldFZhbGlkYXRlKCkgeworICAgICAgICByZXR1cm4gdmFsaWRhdGlvblJlc3VsdC5nZXRWaW9sYXRpb25Db3VudCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvSGsyVmFsaWRhdGlvbkludGVyY2VwdG9yLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL2J2L0hrMlZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4NTQ1M2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL2J2L0hrMlZhbGlkYXRpb25JbnRlcmNlcHRvci5qYXZhCkBAIC0wLDAgKzEsMTkzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5idjsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKK2ltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uU3VwcGxpZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5WZXRvZWQ7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZGF0aW9uRXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkFic3RyYWN0QmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuVmFsaWRhdGlvbkludGVyY2VwdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuVmFsaWRhdGlvbkludGVyY2VwdG9yQ29udGV4dDsKKworLyoqCisgKiBISzIgbWFuYWdlZCB2YWxpZGF0aW9uIGludGVyY2VwdG9yLgorICovCitAVmV0b2VkCitwdWJsaWMgY2xhc3MgSGsyVmFsaWRhdGlvbkludGVyY2VwdG9yIGltcGxlbWVudHMgVmFsaWRhdGlvbkludGVyY2VwdG9yIHsKKworCisgICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlcjxIazJWYWxpZGF0aW9uUmVzdWx0PiB2YWxpZGF0aW9uUmVzdWx0OworCisgICAgcHVibGljIEhrMlZhbGlkYXRpb25JbnRlcmNlcHRvcihQcm92aWRlcjxIazJWYWxpZGF0aW9uUmVzdWx0PiB2YWxpZGF0aW9uUmVzdWx0KSB7CisgICAgICAgIHRoaXMudmFsaWRhdGlvblJlc3VsdCA9IHZhbGlkYXRpb25SZXN1bHQ7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCaW5kZXIgZXh0ZW5kcyBBYnN0cmFjdEJpbmRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgIGJpbmRGYWN0b3J5KFZhbGlkYXRpb25JbnRlcmNlcHRvckZhY3RvcnkuY2xhc3MsIFNpbmdsZXRvbi5jbGFzcykKKyAgICAgICAgICAgICAgICAgICAgLnRvKFZhbGlkYXRpb25JbnRlcmNlcHRvci5jbGFzcyk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFZhbGlkYXRpb25JbnRlcmNlcHRvckZhY3RvcnkgaW1wbGVtZW50cyBTdXBwbGllcjxWYWxpZGF0aW9uSW50ZXJjZXB0b3I+IHsKKworICAgICAgICBASW5qZWN0CisgICAgICAgIFByb3ZpZGVyPEhrMlZhbGlkYXRpb25SZXN1bHQ+IHZhbGlkYXRpb25SZXN1bHRQcm92aWRlcjsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFZhbGlkYXRpb25JbnRlcmNlcHRvciBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEhrMlZhbGlkYXRpb25JbnRlcmNlcHRvcih2YWxpZGF0aW9uUmVzdWx0UHJvdmlkZXIpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25WYWxpZGF0ZSgKKyAgICAgICAgICAgIFZhbGlkYXRpb25JbnRlcmNlcHRvckNvbnRleHQgY3R4KSB0aHJvd3MgVmFsaWRhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjdHgucHJvY2VlZCgpOworICAgICAgICB9IGNhdGNoIChDb25zdHJhaW50VmlvbGF0aW9uRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBlbnN1cmVWYWxpZGF0aW9uUmVzdWx0SW5qZWN0ZWQoY3R4LCBleCk7CisgICAgICAgICAgICB2YWxpZGF0aW9uUmVzdWx0LmdldCgpLnNldFZpb2xhdGlvbnMoZXguZ2V0Q29uc3RyYWludFZpb2xhdGlvbnMoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5zdXJlVmFsaWRhdGlvblJlc3VsdEluamVjdGVkKAorICAgICAgICAgICAgZmluYWwgVmFsaWRhdGlvbkludGVyY2VwdG9yQ29udGV4dCBjdHgsIGZpbmFsIENvbnN0cmFpbnRWaW9sYXRpb25FeGNlcHRpb24gZXgpIHsKKworICAgICAgICBpZiAoIWlzVmFsaWRhdGlvblJlc3VsdEluQXJncyhjdHguZ2V0QXJncygpKQorICAgICAgICAgICAgICAgICYmICFpc1ZhbGlkYXRpb25SZXN1bHRJblJlc291cmNlKGN0eCkKKyAgICAgICAgICAgICAgICAmJiAhaGFzVmFsaWRhdGlvblJlc3VsdFByb3BlcnR5KGN0eC5nZXRSZXNvdXJjZSgpKSkgeworCisgICAgICAgICAgICB0aHJvdyBleDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgYm9vbGVhbiBpc1ZhbGlkYXRpb25SZXN1bHRJblJlc291cmNlKFZhbGlkYXRpb25JbnRlcmNlcHRvckNvbnRleHQgY3R4KSB7CisgICAgICAgIENsYXNzPD8+IGNsYXp6ID0gY3R4LmdldFJlc291cmNlKCkuZ2V0Q2xhc3MoKTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgZm9yIChGaWVsZCBmIDogY2xhenouZ2V0RGVjbGFyZWRGaWVsZHMoKSkgeworICAgICAgICAgICAgICAgIC8vIE9mIFZhbGlkYXRpb25SZXN1bHQgYW5kIEpBWC1SUyBpbmplY3RhYmxlCisgICAgICAgICAgICAgICAgaWYgKFZhbGlkYXRpb25SZXN1bHQuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShmLmdldFR5cGUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGYuZ2V0QW5ub3RhdGlvbihDb250ZXh0LmNsYXNzKSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsYXp6ID0gY2xhenouZ2V0U3VwZXJjbGFzcygpOworICAgICAgICB9IHdoaWxlIChjbGF6eiAhPSBPYmplY3QuY2xhc3MpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIGlzVmFsaWRhdGlvblJlc3VsdEluQXJncyhPYmplY3RbXSBhcmdzKSB7CisgICAgICAgIGZvciAoT2JqZWN0IGEgOiBhcmdzKSB7CisgICAgICAgICAgICBpZiAoYSAhPSBudWxsICYmIFZhbGlkYXRpb25SZXN1bHQuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShhLmdldENsYXNzKCkpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZXMgaWYgYSByZXNvdXJjZSBoYXMgYSBwcm9wZXJ0eSBvZiB0eXBlIHtAY29kZSBqYXZheC5tdmMudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0fS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZSByZXNvdXJjZSBpbnN0YW5jZS4KKyAgICAgKiBAcmV0dXJuIG91dGNvbWUgb2YgdGVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzVmFsaWRhdGlvblJlc3VsdFByb3BlcnR5KGZpbmFsIE9iamVjdCByZXNvdXJjZSkgeworICAgICAgICByZXR1cm4gZ2V0VmFsaWRhdGlvblJlc3VsdEdldHRlcihyZXNvdXJjZSkgIT0gbnVsbCAmJiBnZXRWYWxpZGF0aW9uUmVzdWx0U2V0dGVyKHJlc291cmNlKSAhPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBnZXR0ZXIgZm9yIHtAY29kZSBqYXZheC5tdmMudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0fSBvciB7QGNvZGUgbnVsbH0KKyAgICAgKiBpZiBvbmUgY2Fubm90IGJlIGZvdW5kLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlIHJlc291cmNlIGluc3RhbmNlLgorICAgICAqIEByZXR1cm4gZ2V0dGVyIG9yIHtAY29kZSBudWxsfSBpZiBub3QgYXZhaWxhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldFZhbGlkYXRpb25SZXN1bHRHZXR0ZXIoZmluYWwgT2JqZWN0IHJlc291cmNlKSB7CisgICAgICAgIENsYXNzPD8+IGNsYXp6ID0gcmVzb3VyY2UuZ2V0Q2xhc3MoKTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgZm9yIChNZXRob2QgbSA6IGNsYXp6LmdldERlY2xhcmVkTWV0aG9kcygpKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzVmFsaWRhdGlvblJlc3VsdEdldHRlcihtKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbGF6eiA9IGNsYXp6LmdldFN1cGVyY2xhc3MoKTsKKyAgICAgICAgfSB3aGlsZSAoY2xhenogIT0gT2JqZWN0LmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lcyBpZiBhIG1ldGhvZCBpcyBhIGdldHRlciBmb3Ige0Bjb2RlIGphdmF4Lm12Yy52YWxpZGF0aW9uLlZhbGlkYXRpb25SZXN1bHR9LgorICAgICAqCisgICAgICogQHBhcmFtIG0gbWV0aG9kIHRvIHRlc3QuCisgICAgICogQHJldHVybiBvdXRjb21lIG9mIHRlc3QuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkYXRpb25SZXN1bHRHZXR0ZXIoTWV0aG9kIG0pIHsKKyAgICAgICAgcmV0dXJuIG0uZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoImdldCIpCisgICAgICAgICAgICAgICAgJiYgVmFsaWRhdGlvblJlc3VsdC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKG0uZ2V0UmV0dXJuVHlwZSgpKQorICAgICAgICAgICAgICAgICYmIE1vZGlmaWVyLmlzUHVibGljKG0uZ2V0TW9kaWZpZXJzKCkpICYmIG0uZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGggPT0gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgc2V0dGVyIGZvciB7QGNvZGUgamF2YXgubXZjLnZhbGlkYXRpb24uVmFsaWRhdGlvblJlc3VsdH0gb3Ige0Bjb2RlIG51bGx9CisgICAgICogaWYgb25lIGNhbm5vdCBiZSBmb3VuZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZSByZXNvdXJjZSBpbnN0YW5jZS4KKyAgICAgKiBAcmV0dXJuIHNldHRlciBvciB7QGNvZGUgbnVsbH0gaWYgbm90IGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIE1ldGhvZCBnZXRWYWxpZGF0aW9uUmVzdWx0U2V0dGVyKGZpbmFsIE9iamVjdCByZXNvdXJjZSkgeworICAgICAgICBDbGFzczw/PiBjbGF6eiA9IHJlc291cmNlLmdldENsYXNzKCk7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGZvciAoTWV0aG9kIG0gOiBjbGF6ei5nZXREZWNsYXJlZE1ldGhvZHMoKSkgeworICAgICAgICAgICAgICAgIGlmIChpc1ZhbGlkYXRpb25SZXN1bHRTZXR0ZXIobSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2xhenogPSBjbGF6ei5nZXRTdXBlcmNsYXNzKCk7CisgICAgICAgIH0gd2hpbGUgKGNsYXp6ICE9IE9iamVjdC5jbGFzcyk7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZXMgaWYgYSBtZXRob2QgaXMgYSBzZXR0ZXIgZm9yIHtAY29kZSBqYXZheC5tdmMudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0fS4KKyAgICAgKiBBcyBhIENESSBpbml0aWFsaXplciBtZXRob2QsIGl0IG11c3QgYmUgYW5ub3RhdGVkIHdpdGgge0BsaW5rIGphdmF4LmluamVjdC5JbmplY3R9LgorICAgICAqCisgICAgICogQHBhcmFtIG0gbWV0aG9kIHRvIHRlc3QuCisgICAgICogQHJldHVybiBvdXRjb21lIG9mIHRlc3QuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkYXRpb25SZXN1bHRTZXR0ZXIoTWV0aG9kIG0pIHsKKyAgICAgICAgcmV0dXJuIG0uZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoInNldCIpICYmIG0uZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGggPT0gMQorICAgICAgICAgICAgICAgICYmIFZhbGlkYXRpb25SZXN1bHQuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShtLmdldFBhcmFtZXRlclR5cGVzKClbMF0pCisgICAgICAgICAgICAgICAgJiYgbS5nZXRSZXR1cm5UeXBlKCkgPT0gVm9pZC5UWVBFICYmIE1vZGlmaWVyLmlzUHVibGljKG0uZ2V0TW9kaWZpZXJzKCkpCisgICAgICAgICAgICAgICAgJiYgbS5nZXRBbm5vdGF0aW9uKENvbnRleHQuY2xhc3MpICE9IG51bGw7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL2J2L0hrMlZhbGlkYXRpb25SZXN1bHQuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvSGsyVmFsaWRhdGlvblJlc3VsdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyODYxMDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL2J2L0hrMlZhbGlkYXRpb25SZXN1bHQuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5idjsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5WZXRvZWQ7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmlvbGF0aW9uOworCisvKioKKyAqIEhLMiBtYW5hZ2VkIHZhbGlkYXRpb24gcmVzdWx0IGJlYW4uCisgKi8KK0BWZXRvZWQKK3B1YmxpYyBjbGFzcyBIazJWYWxpZGF0aW9uUmVzdWx0IGltcGxlbWVudHMgVmFsaWRhdGlvblJlc3VsdCB7CisKKyAgICBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjw/Pj4gY29uc3RyYWludFZpb2xhdGlvblNldDsKKworICAgIHB1YmxpYyB2b2lkIHNldFZpb2xhdGlvbnMoU2V0PENvbnN0cmFpbnRWaW9sYXRpb248Pz4+IHZpb2xhdGlvbnMpIHsKKyAgICAgICAgdGhpcy5jb25zdHJhaW50VmlvbGF0aW9uU2V0ID0gbmV3IEhhc2hTZXQ8Pih2aW9sYXRpb25zKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENvbnN0cmFpbnRWaW9sYXRpb248Pz4+IGdldEFsbFZpb2xhdGlvbnMoKSB7CisgICAgICAgIHJldHVybiBjb25zdHJhaW50VmlvbGF0aW9uU2V0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzRmFpbGVkKCkgeworICAgICAgICByZXR1cm4gKGNvbnN0cmFpbnRWaW9sYXRpb25TZXQgIT0gbnVsbCkgPyAhY29uc3RyYWludFZpb2xhdGlvblNldC5pc0VtcHR5KCkgOiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGdldFZpb2xhdGlvbkNvdW50KCkgeworICAgICAgICByZXR1cm4gKGNvbnN0cmFpbnRWaW9sYXRpb25TZXQgIT0gbnVsbCkgPyBjb25zdHJhaW50VmlvbGF0aW9uU2V0LnNpemUoKSA6IDA7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9idi9Ob25KYXhSc1ZhbGlkYXRlZEJlYW4uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvTm9uSmF4UnNWYWxpZGF0ZWRCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEwYWNhMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvTm9uSmF4UnNWYWxpZGF0ZWRCZWFuLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkuYnY7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuUmVxdWVzdFNjb3BlZDsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7CisKKy8qKgorICogQ0RJIGJlYW4gdGhhdCBnZXRzIHZhbGlkYXRlZCBieSBIaWJlcm5hdGUgdmFsaWRhdG9yIGRpcmVjdGx5LgorICogVGhpcyBpcyB0byBlbnN1cmUgSmVyc2V5IGludGVyY2VwdG9yIHdyYXBwZXIKKyAqIGRvZXMgbm90IGJsb2NrIHRoZSBvcmlnaW5hbCB2YWxpZGF0b3IgZnJvbSBmdW5jdGlvbmluZworICogb24gcmF3IENESSBiZWFucy4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUmVxdWVzdFNjb3BlZAorcHVibGljIGNsYXNzIE5vbkpheFJzVmFsaWRhdGVkQmVhbiB7CisKKyAgICBwdWJsaWMgU3RyaW5nIGVjaG8oQE5vdE51bGwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL2J2L1ZhbGlkYXRpb25SZXN1bHQuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvVmFsaWRhdGlvblJlc3VsdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3MjM3OTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL2J2L1ZhbGlkYXRpb25SZXN1bHQuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5idjsKKworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLkNvbnN0cmFpbnRWaW9sYXRpb247CisKKy8qKgorICogQW4gaW50ZXJmYWNlIHRvIGJlIHV0aWxpemVkIHdoZW4gcmVzb3VyY2UgbWV0aG9kIHZhbGlkYXRpb24gaXNzdWVzCisgKiBhcmUgdG8gYmUgaGFuZGxlZCB3aXRoaW4gYWN0dWFsIHJlc291cmNlIG1ldGhvZC4KKyAqLworcHVibGljIGludGVyZmFjZSBWYWxpZGF0aW9uUmVzdWx0IHsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYW4gaW1tdXRhYmxlIHNldCBvZiBhbGwgY29uc3RyYWludCB2aW9sYXRpb25zIGRldGVjdGVkLgorICAgICAqCisgICAgICogQHJldHVybiBBbGwgY29uc3RyYWludCB2aW9sYXRpb25zIGRldGVjdGVkCisgICAgICovCisgICAgcHVibGljIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPD8+PiBnZXRBbGxWaW9sYXRpb25zKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBjb25zdHJhaW50IHZpb2xhdGlvbi4KKyAgICAgKiBTYW1lIGFzIGNoZWNraW5nIHdoZXRoZXIge0BsaW5rICNnZXRWaW9sYXRpb25Db3VudCgpfSBpcyBncmVhdGVyIHRoYW4gemVyby4KKyAgICAgKgorICAgICAqIEByZXR1cm4gPGNvZGU+dHJ1ZTwvY29kZT4gaWYgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIGNvbnN0cmFpbnQgdmlvbGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBib29sZWFuIGlzRmFpbGVkKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0b3RhbCBudW1iZXIgb2YgY29uc3RyYWludCB2aW9sYXRpb25zIGRldGVjdGVkLiBTYW1lIGFzIGNhbGxpbmcKKyAgICAgKiA8Y29kZT5nZXRBbGxWaW9sYXRpb25zKCkuc2l6ZSgpPC9jb2RlPi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiBjb25zdHJhaW50IHZpb2xhdGlvbnMKKyAgICAgKi8KKyAgICBpbnQgZ2V0VmlvbGF0aW9uQ291bnQoKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvVmFsaWRhdGlvblJlc3VsdFV0aWwuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvVmFsaWRhdGlvblJlc3VsdFV0aWwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDZkYTEzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9idi9WYWxpZGF0aW9uUmVzdWx0VXRpbC5qYXZhCkBAIC0wLDAgKzEsMjA3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5idjsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5WZXRvZWQ7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkJlYW5NYW5hZ2VyOworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5Db25zdHJhaW50VmlvbGF0aW9uOworCisvKioKKyAqIEhlbHBlciBjbGFzcyB0byBpbXBsZW1lbnQgc3VwcG9ydCBmb3Ige0Bjb2RlIGphdmF4Lm12Yy52YWxpZGF0aW9uLlZhbGlkYXRpb25SZXN1bHR9LgorICoKKyAqIEBhdXRob3IgU2FudGlhZ28gUGVyaWNhcy1HZWVydHNlbgorICovCitAVmV0b2VkCitwdWJsaWMgZmluYWwgY2xhc3MgVmFsaWRhdGlvblJlc3VsdFV0aWwgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRJT05fUkVTVUxUID0gVmFsaWRhdGlvblJlc3VsdC5jbGFzcy5nZXROYW1lKCk7CisKKyAgICBwcml2YXRlIFZhbGlkYXRpb25SZXN1bHRVdGlsKCkgeworICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoIkluc3RhbnRpYXRpb24gbm90IGFsbG93ZWQuIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VhcmNoIGZvciBhIHtAY29kZSBqYXZheC5tdmMudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0fSBmaWVsZCBpbiB0aGUgcmVzb3VyY2UncworICAgICAqIGNsYXNzIGhpZXJhcmNoeS4gRmllbGQgbXVzdCBiZSBhbm5vdGF0ZWQgd2l0aCB7QGxpbmsgamF2YXguaW5qZWN0LkluamVjdH0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgcmVzb3VyY2UgaW5zdGFuY2UuCisgICAgICogQHJldHVybiBmaWVsZCBvciB7QGNvZGUgbnVsbH0gaWYgbm9uZSBpcyBmb3VuZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEZpZWxkIGdldFZhbGlkYXRpb25SZXN1bHRGaWVsZChmaW5hbCBPYmplY3QgcmVzb3VyY2UpIHsKKyAgICAgICAgQ2xhc3M8Pz4gY2xhenogPSByZXNvdXJjZS5nZXRDbGFzcygpOworICAgICAgICBkbyB7CisgICAgICAgICAgICBmb3IgKEZpZWxkIGYgOiBjbGF6ei5nZXREZWNsYXJlZEZpZWxkcygpKSB7CisgICAgICAgICAgICAgICAgLy8gT2YgVmFsaWRhdGlvblJlc3VsdCBhbmQgQ0RJIGluamVjdGFibGUKKyAgICAgICAgICAgICAgICBpZiAoZi5nZXRUeXBlKCkuZ2V0TmFtZSgpLmVxdWFscyhWQUxJREFUSU9OX1JFU1VMVCkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGYuZ2V0QW5ub3RhdGlvbihJbmplY3QuY2xhc3MpICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2xhenogPSBjbGF6ei5nZXRTdXBlcmNsYXNzKCk7CisgICAgICAgIH0gd2hpbGUgKGNsYXp6ICE9IE9iamVjdC5jbGFzcyk7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFVwZGF0ZXMgYSB7QGNvZGUgamF2YXgubXZjLnZhbGlkYXRpb24uVmFsaWRhdGlvblJlc3VsdH0gZmllbGQuIEluIHBzZXVkby1jb2RlOgorICAgICAqIDxwLz4KKyAgICAgKiByZXNvdXJjZS5maWVsZC5zZXRWaW9sYXRpb25zKGNvbnN0cmFpbnRzKQorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlICAgIHJlc291cmNlIGluc3RhbmNlLgorICAgICAqIEBwYXJhbSBmaWVsZCAgICAgICBmaWVsZCB0byBiZSB1cGRhdGVkLgorICAgICAqIEBwYXJhbSBjb25zdHJhaW50cyBuZXcgc2V0IG9mIGNvbnN0cmFpbnRzLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB1cGRhdGVWYWxpZGF0aW9uUmVzdWx0RmllbGQoT2JqZWN0IHJlc291cmNlLCBGaWVsZCBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNldDxDb25zdHJhaW50VmlvbGF0aW9uPD8+PiBjb25zdHJhaW50cykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKKyAgICAgICAgICAgIGZpbmFsIE9iamVjdCBvYmogPSBmaWVsZC5nZXQocmVzb3VyY2UpOworICAgICAgICAgICAgTWV0aG9kIHNldHRlcjsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc2V0dGVyID0gb2JqLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJzZXRWaW9sYXRpb25zIiwgU2V0LmNsYXNzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgc2V0dGVyID0gb2JqLmdldENsYXNzKCkuZ2V0U3VwZXJjbGFzcygpLmdldE1ldGhvZCgic2V0VmlvbGF0aW9ucyIsIFNldC5jbGFzcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXR0ZXIuaW52b2tlKG9iaiwgY29uc3RyYWludHMpOworICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gfCBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHwgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyBpZ25vcmUgZm9yIG5vdworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJEYW1uIGl0Li4uIik7CisgICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIldoYXQgdGhlIGhlY2suLi4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFVwZGF0ZXMgYSB7QGNvZGUgamF2YXgubXZjLnZhbGlkYXRpb24uVmFsaWRhdGlvblJlc3VsdH0gcHJvcGVydHkuIEluIHBzZXVkby1jb2RlOgorICAgICAqIDxwLz4KKyAgICAgKiBvYmogPSBnZXR0ZXIuaW52b2tlKHJlc291cmNlKTsKKyAgICAgKiBvYmouc2V0VmlvbGF0aW9ucyhjb25zdHJhaW50cyk7CisgICAgICogc2V0dGVyLmludm9rZShyZXNvdXJjZSwgb2JqKTsKKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZSAgICByZXNvdXJjZSBpbnN0YW5jZS4KKyAgICAgKiBAcGFyYW0gZ2V0dGVyICAgICAgZ2V0dGVyIHRvIGJlIHVzZWQuCisgICAgICogQHBhcmFtIGNvbnN0cmFpbnRzIG5ldyBzZXQgb2YgY29uc3RyYWludHMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyB2b2lkIHVwZGF0ZVZhbGlkYXRpb25SZXN1bHRQcm9wZXJ0eShPYmplY3QgcmVzb3VyY2UsIE1ldGhvZCBnZXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQ8Q29uc3RyYWludFZpb2xhdGlvbjw/Pj4gY29uc3RyYWludHMpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZpbmFsIE9iamVjdCBvYmogPSBnZXR0ZXIuaW52b2tlKHJlc291cmNlKTsKKyAgICAgICAgICAgIE1ldGhvZCBzZXRWaW9sYXRpb25zOworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBzZXRWaW9sYXRpb25zID0gb2JqLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJzZXRWaW9sYXRpb25zIiwgU2V0LmNsYXNzKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgc2V0VmlvbGF0aW9ucyA9IG9iai5nZXRDbGFzcygpLmdldFN1cGVyY2xhc3MoKS5nZXRNZXRob2QoInNldFZpb2xhdGlvbnMiLCBTZXQuY2xhc3MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0VmlvbGF0aW9ucy5pbnZva2Uob2JqLCBjb25zdHJhaW50cyk7CisKKyAgICAgICAgICAgIGZpbmFsIE1ldGhvZCBzZXR0ZXIgPSBnZXRWYWxpZGF0aW9uUmVzdWx0U2V0dGVyKHJlc291cmNlKTsKKworICAgICAgICAgICAgaWYgKHNldHRlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2V0dGVyLmludm9rZShyZXNvdXJjZSwgb2JqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIHwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB8IElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gaWdub3JlIGZvciBub3cKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZXMgaWYgYSByZXNvdXJjZSBoYXMgYSBwcm9wZXJ0eSBvZiB0eXBlIHtAY29kZSBqYXZheC5tdmMudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0fS4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZSByZXNvdXJjZSBpbnN0YW5jZS4KKyAgICAgKiBAcmV0dXJuIG91dGNvbWUgb2YgdGVzdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaGFzVmFsaWRhdGlvblJlc3VsdFByb3BlcnR5KGZpbmFsIE9iamVjdCByZXNvdXJjZSkgeworICAgICAgICByZXR1cm4gZ2V0VmFsaWRhdGlvblJlc3VsdEdldHRlcihyZXNvdXJjZSkgIT0gbnVsbCAmJiBnZXRWYWxpZGF0aW9uUmVzdWx0U2V0dGVyKHJlc291cmNlKSAhPSBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBnZXR0ZXIgZm9yIHtAY29kZSBqYXZheC5tdmMudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0fSBvciB7QGNvZGUgbnVsbH0KKyAgICAgKiBpZiBvbmUgY2Fubm90IGJlIGZvdW5kLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlIHJlc291cmNlIGluc3RhbmNlLgorICAgICAqIEByZXR1cm4gZ2V0dGVyIG9yIHtAY29kZSBudWxsfSBpZiBub3QgYXZhaWxhYmxlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTWV0aG9kIGdldFZhbGlkYXRpb25SZXN1bHRHZXR0ZXIoZmluYWwgT2JqZWN0IHJlc291cmNlKSB7CisgICAgICAgIENsYXNzPD8+IGNsYXp6ID0gcmVzb3VyY2UuZ2V0Q2xhc3MoKTsKKyAgICAgICAgZG8geworICAgICAgICAgICAgZm9yIChNZXRob2QgbSA6IGNsYXp6LmdldERlY2xhcmVkTWV0aG9kcygpKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzVmFsaWRhdGlvblJlc3VsdEdldHRlcihtKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbGF6eiA9IGNsYXp6LmdldFN1cGVyY2xhc3MoKTsKKyAgICAgICAgfSB3aGlsZSAoY2xhenogIT0gT2JqZWN0LmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lcyBpZiBhIG1ldGhvZCBpcyBhIGdldHRlciBmb3Ige0Bjb2RlIGphdmF4Lm12Yy52YWxpZGF0aW9uLlZhbGlkYXRpb25SZXN1bHR9LgorICAgICAqCisgICAgICogQHBhcmFtIG0gbWV0aG9kIHRvIHRlc3QuCisgICAgICogQHJldHVybiBvdXRjb21lIG9mIHRlc3QuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkYXRpb25SZXN1bHRHZXR0ZXIoTWV0aG9kIG0pIHsKKyAgICAgICAgcmV0dXJuIG0uZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoImdldCIpCisgICAgICAgICAgICAgICAgJiYgbS5nZXRSZXR1cm5UeXBlKCkuZ2V0TmFtZSgpLmVxdWFscyhWQUxJREFUSU9OX1JFU1VMVCkKKyAgICAgICAgICAgICAgICAmJiBNb2RpZmllci5pc1B1YmxpYyhtLmdldE1vZGlmaWVycygpKSAmJiBtLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHNldHRlciBmb3Ige0Bjb2RlIGphdmF4Lm12Yy52YWxpZGF0aW9uLlZhbGlkYXRpb25SZXN1bHR9IG9yIHtAY29kZSBudWxsfQorICAgICAqIGlmIG9uZSBjYW5ub3QgYmUgZm91bmQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgcmVzb3VyY2UgaW5zdGFuY2UuCisgICAgICogQHJldHVybiBzZXR0ZXIgb3Ige0Bjb2RlIG51bGx9IGlmIG5vdCBhdmFpbGFibGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBNZXRob2QgZ2V0VmFsaWRhdGlvblJlc3VsdFNldHRlcihmaW5hbCBPYmplY3QgcmVzb3VyY2UpIHsKKyAgICAgICAgcmV0dXJuIGdldFZhbGlkYXRpb25SZXN1bHRTZXR0ZXIocmVzb3VyY2UuZ2V0Q2xhc3MoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgTWV0aG9kIGdldFZhbGlkYXRpb25SZXN1bHRTZXR0ZXIoZmluYWwgQ2xhc3M8Pz4gcmVzb3VyY2VDbGFzcykgeworICAgICAgICBDbGFzczw/PiBjbGF6eiA9IHJlc291cmNlQ2xhc3M7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGZvciAoTWV0aG9kIG0gOiBjbGF6ei5nZXREZWNsYXJlZE1ldGhvZHMoKSkgeworICAgICAgICAgICAgICAgIGlmIChpc1ZhbGlkYXRpb25SZXN1bHRTZXR0ZXIobSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2xhenogPSBjbGF6ei5nZXRTdXBlcmNsYXNzKCk7CisgICAgICAgIH0gd2hpbGUgKGNsYXp6ICE9IE9iamVjdC5jbGFzcyk7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIC8qKgorICAgICAqIERldGVybWluZXMgaWYgYSBtZXRob2QgaXMgYSBzZXR0ZXIgZm9yIHtAY29kZSBqYXZheC5tdmMudmFsaWRhdGlvbi5WYWxpZGF0aW9uUmVzdWx0fS4KKyAgICAgKiBBcyBhIENESSBpbml0aWFsaXplciBtZXRob2QsIGl0IG11c3QgYmUgYW5ub3RhdGVkIHdpdGgge0BsaW5rIGphdmF4LmluamVjdC5JbmplY3R9LgorICAgICAqCisgICAgICogQHBhcmFtIG0gbWV0aG9kIHRvIHRlc3QuCisgICAgICogQHJldHVybiBvdXRjb21lIG9mIHRlc3QuCisgICAgICovCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkYXRpb25SZXN1bHRTZXR0ZXIoTWV0aG9kIG0pIHsKKyAgICAgICAgcmV0dXJuIG0uZ2V0TmFtZSgpLnN0YXJ0c1dpdGgoInNldCIpICYmIG0uZ2V0UGFyYW1ldGVyVHlwZXMoKS5sZW5ndGggPT0gMQorICAgICAgICAgICAgICAgICYmIG0uZ2V0UGFyYW1ldGVyVHlwZXMoKVswXS5nZXROYW1lKCkuZXF1YWxzKFZBTElEQVRJT05fUkVTVUxUKQorICAgICAgICAgICAgICAgICYmIG0uZ2V0UmV0dXJuVHlwZSgpID09IFZvaWQuVFlQRSAmJiBNb2RpZmllci5pc1B1YmxpYyhtLmdldE1vZGlmaWVycygpKQorICAgICAgICAgICAgICAgICYmIG0uZ2V0QW5ub3RhdGlvbihJbmplY3QuY2xhc3MpICE9IG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvYmVhbnMueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvYmVhbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZGYzNjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9iZWFucy54bWwKQEAgLTAsMCArMSwyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8YmVhbnMvPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkV4dGVuc2lvbiBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL2phdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5FeHRlbnNpb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDAzNmQ2MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL2phdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5FeHRlbnNpb24KQEAgLTAsMCArMSBAQAorb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLmJ2LkNkaVZhbGlkYXRpb25SZXN1bHRCaW5kZXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbXBvbmVudFByb3ZpZGVyIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5Db21wb25lbnRQcm92aWRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDM2ZDYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5Db21wb25lbnRQcm92aWRlcgpAQCAtMCwwICsxIEBACitvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkuYnYuQ2RpVmFsaWRhdGlvblJlc3VsdEJpbmRlcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvYmVhbnMueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9iZWFucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ5Y2M2YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvYmVhbnMueG1sCkBAIC0wLDAgKzEsMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPGJlYW5zLz4KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9idi9CYXNlVmFsaWRhdGlvblRlc3QuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvQmFzZVZhbGlkYXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJlYjNmYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvQmFzZVZhbGlkYXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSwxNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLmJ2OworCitpbXBvcnQgamF2YS5uZXQuVVJJOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBDb21tb24gdGVzdCBmb3IgcmVzb3VyY2UgdmFsaWRhdGlvbi4gVGhlIHNhbWUgc2V0IG9mIHRlc3RzIGlzIHVzZWQKKyAqIGZvciB0aGUgZm9sbG93aW5nIHNjZW5hcmlvczogR3JpenpseSBiYXNlZCBjb21iaW5lZCBkZXBsb3ltZW50IHdpdGggQ0RJIGVuYWJsZWQsCisgKiBXQVIgYmFzZWQgY29tYmluZWQgZGVwbG95bWVudCB3aXRoIENESSBlbmFibGVkLCBHcml6emx5IGJhc2VkIGRlcGxveW1lbnQgd2l0aG91dCBDREkgZW5hYmxlZC4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzZVZhbGlkYXRpb25UZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldEFwcFBhdGgoKTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBVUkkgZ2V0QmFzZVVyaSgpIHsKKyAgICAgICAgcmV0dXJuIFVyaUJ1aWxkZXIuZnJvbVVyaShzdXBlci5nZXRCYXNlVXJpKCkpLnBhdGgoImNkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAiKS5wYXRoKGdldEFwcFBhdGgoKSkuYnVpbGQoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJhbVZhbGlkYXRlZFJlc291cmNlTm9QYXJhbSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdFBhcmFtVmFsaWRhdGVkUmVzb3VyY2VOb1BhcmFtKHRhcmdldCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgX3Rlc3RQYXJhbVZhbGlkYXRlZFJlc291cmNlTm9QYXJhbShmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICBJbnRlZ2VyIGVycm9ycyA9IHRhcmdldC5yZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcykKKyAgICAgICAgICAgICAgICAucGF0aCgidmFsaWRhdGVkIikucGF0aCgicGFyYW0iKS5wYXRoKCJ2YWxpZGF0ZSIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5nZXQoSW50ZWdlci5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChlcnJvcnMsIGlzKDEpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXJhbVZhbGlkYXRlZFJlc291cmNlUGFyYW1Qcm92aWRlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdFBhcmFtVmFsaWRhdGVkUmVzb3VyY2VQYXJhbVByb3ZpZGVkKHRhcmdldCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgX3Rlc3RQYXJhbVZhbGlkYXRlZFJlc291cmNlUGFyYW1Qcm92aWRlZChXZWJUYXJnZXQgdGFyZ2V0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgSW50ZWdlciBlcnJvcnMgPSB0YXJnZXQucmVnaXN0ZXIoTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpLnBhdGgoInZhbGlkYXRlZCIpLnBhdGgoImZpZWxkIikucGF0aCgidmFsaWRhdGUiKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJxIiwgIm9uZSIpLnJlcXVlc3QoKS5nZXQoSW50ZWdlci5jbGFzcyk7CisgICAgICAgIGFzc2VydFRoYXQoZXJyb3JzLCBpcygwKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmllbGRWYWxpZGF0ZWRSZXNvdXJjZU5vUGFyYW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RGaWVsZFZhbGlkYXRlZFJlc291cmNlTm9QYXJhbSh0YXJnZXQoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIF90ZXN0RmllbGRWYWxpZGF0ZWRSZXNvdXJjZU5vUGFyYW0oZmluYWwgV2ViVGFyZ2V0IHRhcmdldCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisKKyAgICAgICAgSW50ZWdlciBlcnJvcnMgPSB0YXJnZXQucmVnaXN0ZXIoTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpCisgICAgICAgICAgICAgICAgLnBhdGgoInZhbGlkYXRlZCIpLnBhdGgoImZpZWxkIikucGF0aCgidmFsaWRhdGUiKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkuZ2V0KEludGVnZXIuY2xhc3MpOworCisgICAgICAgIGFzc2VydFRoYXQoZXJyb3JzLCBpcygxKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmllbGRWYWxpZGF0ZWRSZXNvdXJjZVBhcmFtUHJvdmlkZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RGaWVsZFZhbGlkYXRlZFJlc291cmNlUGFyYW1Qcm92aWRlZCh0YXJnZXQoKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIF90ZXN0RmllbGRWYWxpZGF0ZWRSZXNvdXJjZVBhcmFtUHJvdmlkZWQoZmluYWwgV2ViVGFyZ2V0IHRhcmdldCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEludGVnZXIgZXJyb3JzID0gdGFyZ2V0LnJlZ2lzdGVyKExvZ2dpbmdGZWF0dXJlLmNsYXNzKS5wYXRoKCJ2YWxpZGF0ZWQiKS5wYXRoKCJmaWVsZCIpLnBhdGgoInZhbGlkYXRlIikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgicSIsICJvbmUiKS5yZXF1ZXN0KCkuZ2V0KEludGVnZXIuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KGVycm9ycywgaXMoMCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByb3BlcnR5VmFsaWRhdGVkUmVzb3VyY2VOb1BhcmFtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0UHJvcGVydHlWYWxpZGF0ZWRSZXNvdXJjZU5vUGFyYW0odGFyZ2V0KCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBfdGVzdFByb3BlcnR5VmFsaWRhdGVkUmVzb3VyY2VOb1BhcmFtKGZpbmFsIFdlYlRhcmdldCB0YXJnZXQpIHRocm93cyBFeGNlcHRpb24geworCisgICAgICAgIEludGVnZXIgZXJyb3JzID0gdGFyZ2V0LnJlZ2lzdGVyKExvZ2dpbmdGZWF0dXJlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5wYXRoKCJ2YWxpZGF0ZWQiKS5wYXRoKCJwcm9wZXJ0eSIpLnBhdGgoInZhbGlkYXRlIikKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpLmdldChJbnRlZ2VyLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRUaGF0KGVycm9ycywgaXMoMSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFByb3BlcnR5VmFsaWRhdGVkUmVzb3VyY2VQYXJhbVByb3ZpZGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0UHJvcGVydHlWYWxpZGF0ZWRSZXNvdXJjZVBhcmFtUHJvdmlkZWQodGFyZ2V0KCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBfdGVzdFByb3BlcnR5VmFsaWRhdGVkUmVzb3VyY2VQYXJhbVByb3ZpZGVkKGZpbmFsIFdlYlRhcmdldCB0YXJnZXQpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJbnRlZ2VyIGVycm9ycyA9IHRhcmdldC5yZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcykucGF0aCgidmFsaWRhdGVkIikucGF0aCgicHJvcGVydHkiKS5wYXRoKCJ2YWxpZGF0ZSIpCisgICAgICAgICAgICAgICAgLnF1ZXJ5UGFyYW0oInEiLCAib25lIikucmVxdWVzdCgpLmdldChJbnRlZ2VyLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlcnJvcnMsIGlzKDApKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPbGRGYXNoaW9uZWRSZXNvdXJjZU5vUGFyYW0oKSB7CisgICAgICAgIF90ZXN0T2xkRmFzaGlvbmVkUmVzb3VyY2VOb1BhcmFtKHRhcmdldCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgX3Rlc3RPbGRGYXNoaW9uZWRSZXNvdXJjZU5vUGFyYW0oZmluYWwgV2ViVGFyZ2V0IHRhcmdldCkgeworCisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlZ2lzdGVyKExvZ2dpbmdGZWF0dXJlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5wYXRoKCJvbGQiKS5wYXRoKCJmYXNoaW9uZWQiKS5wYXRoKCJ2YWxpZGF0ZSIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcyg0MDApKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPbGRGYXNoaW9uZWRSZXNvdXJjZVBhcmFtUHJvdmlkZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RPbGRGYXNoaW9uZWRSZXNvdXJjZVBhcmFtUHJvdmlkZWQodGFyZ2V0KCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBfdGVzdE9sZEZhc2hpb25lZFJlc291cmNlUGFyYW1Qcm92aWRlZChmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gdGFyZ2V0LnJlZ2lzdGVyKExvZ2dpbmdGZWF0dXJlLmNsYXNzKS5wYXRoKCJvbGQiKS5wYXRoKCJmYXNoaW9uZWQiKS5wYXRoKCJ2YWxpZGF0ZSIpCisgICAgICAgICAgICAgICAgLnF1ZXJ5UGFyYW0oInEiLCAib25lIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLCBpcygib25lIikpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBfdGVzdE5vbkpheFJzVmFsaWRhdGlvbkZpZWxkVmFsaWRhdGVkUmVzb3VyY2VOb1BhcmFtKGZpbmFsIFdlYlRhcmdldCB0YXJnZXQpIHsKKyAgICAgICAgSW50ZWdlciBlcnJvcnMgPSB0YXJnZXQucmVnaXN0ZXIoTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpCisgICAgICAgICAgICAgICAgLnBhdGgoInZhbGlkYXRlZCIpLnBhdGgoImZpZWxkIikucGF0aCgidmFsaWRhdGUiKS5wYXRoKCJub24tamF4cnMiKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJxIiwgIm5vdC1pbXBvcnRhbnQtanVzdC10by1nZXQtdGhpcy10aHJvdWdoLWpheC1ycyIpLnJlcXVlc3QoKS5nZXQoSW50ZWdlci5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChlcnJvcnMsIGlzKDEpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgX3Rlc3ROb25KYXhSc1ZhbGlkYXRpb25GaWVsZFZhbGlkYXRlZFJlc291cmNlUGFyYW1Qcm92aWRlZChmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0KSB7CisgICAgICAgIEludGVnZXIgZXJyb3JzID0gdGFyZ2V0LnJlZ2lzdGVyKExvZ2dpbmdGZWF0dXJlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5wYXRoKCJ2YWxpZGF0ZWQiKS5wYXRoKCJmaWVsZCIpLnBhdGgoInZhbGlkYXRlIikucGF0aCgibm9uLWpheHJzIikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgicSIsICJub3QtaW1wb3J0YW50LWp1c3QtdG8tZ2V0LXRoaXMtdGhyb3VnaC1qYXgtcnMiKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJoIiwgImJ1bW1lciIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5nZXQoSW50ZWdlci5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChlcnJvcnMsIGlzKDApKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktYmVhbnZhbGlkYXRpb24td2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL2J2L0NvbWJpbmVkVGVzdC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9idi9Db21iaW5lZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDdiMGVmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9idi9Db21iaW5lZFRlc3QuamF2YQpAQCAtMCwwICsxLDE5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkuYnY7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkyLmh0dHBzZXJ2ZXIuR3JpenpseUh0dHBDb250YWluZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseTIuaHR0cHNlcnZlci5Hcml6emx5SHR0cENvbnRhaW5lclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkyLmh0dHBzZXJ2ZXIuR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5oazIuSGsySW5qZWN0aW9uTWFuYWdlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmdyaXp6bHkuaHR0cC5zZXJ2ZXIuSHR0cEhhbmRsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5ncml6emx5Lmh0dHAuc2VydmVyLkh0dHBTZXJ2ZXI7CisKK2ltcG9ydCBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzOworaW1wb3J0IG9yZy5qYm9zcy53ZWxkLmVudmlyb25tZW50LnNlLldlbGQ7CitpbXBvcnQgb3JnLmp1bml0LkFmdGVyOworaW1wb3J0IG9yZy5qdW5pdC5Bc3N1bWU7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBUZXN0IGJvdGggSmVyc2V5IGFwcHMgcnVubmluZyBzaW11bHRhbmVvdXNseSB3aXRoaW4gYSBzaW5nbGUgR3JpenpseSBIVFRQIHNlcnZlcgorICogdG8gbWFrZSBzdXJlIGluamVjdGlvbiBtYW5hZ2VycyBkbyBub3QgaW50ZXJmZXJlLiBUaGUgdGVzdCBpcyBub3QgZXhlY3V0ZWQKKyAqIGlmIG90aGVyIHRoYW4gdGhlIGRlZmF1bHQgKEdyaXp6bHkpIHRlc3QgY29udGFpbmVyIGhhcyBiZWVuIHNldC4KKyAqIEZvciBTZXJ2bGV0IGJhc2VkIGNvbnRhaW5lciB0ZXN0aW5nLCB0aGUgb3RoZXIgdHdvIHRlc3RzLCB7QGxpbmsgUmF3Q2RpVGVzdH0gYW5kIHtAbGluayBSYXdIazJUZXN0fSwKKyAqIGRvIHRoZSBzYW1lIGpvYiwgYmVjYXVzZSB0aGUgV0FSIGFwcGxpY2F0aW9uIGNvbnRhaW5zIGJvdGggSmVyc2V5IGFwcHMgYWxyZWFkeS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQ29tYmluZWRUZXN0IHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENESV9VUkkgPSAiL2NkaSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEsyX1VSSSA9ICIvaGsyIjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBPUlRfTlVNQkVSID0gZ2V0U3lzdGVtUHJvcGVydHkoVGVzdFByb3BlcnRpZXMuQ09OVEFJTkVSX1BPUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhUZXN0UHJvcGVydGllcy5ERUZBVUxUX0NPTlRBSU5FUl9QT1JUKSk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgQkFTRV9ISzJfVVJJID0gVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDoiICsgUE9SVF9OVU1CRVIgKyBISzJfVVJJKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgQkFTRV9DRElfVVJJID0gVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDoiICsgUE9SVF9OVU1CRVIgKyBDRElfVVJJKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNEZWZhdWx0VGVzdENvbnRhaW5lckZhY3RvcnlTZXQgPSBpc0RlZmF1bHRUZXN0Q29udGFpbmVyRmFjdG9yeVNldCgpOworCisgICAgV2VsZCB3ZWxkOworICAgIEh0dHBTZXJ2ZXIgY2RpU2VydmVyOworCisgICAgQ2xpZW50IGNsaWVudDsKKyAgICBXZWJUYXJnZXQgY2RpVGFyZ2V0LCBoazJUYXJnZXQ7CisKKyAgICBAQmVmb3JlCisgICAgcHVibGljIHZvaWQgYmVmb3JlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKGlzRGVmYXVsdFRlc3RDb250YWluZXJGYWN0b3J5U2V0ICYmIEhrMkluamVjdGlvbk1hbmFnZXJGYWN0b3J5LmlzSW1tZWRpYXRlU3RyYXRlZ3koKSkgeworICAgICAgICAgICAgaW5pdGlhbGl6ZVdlbGQoKTsKKyAgICAgICAgICAgIHN0YXJ0R3JpenpseUNvbnRhaW5lcigpOworICAgICAgICAgICAgaW5pdGlhbGl6ZUNsaWVudCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIGJlZm9yZUlzSW1tZWRpYXRlKCkgeworICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZShIazJJbmplY3Rpb25NYW5hZ2VyRmFjdG9yeS5pc0ltbWVkaWF0ZVN0cmF0ZWd5KCkpOworICAgIH0KKworICAgIEBBZnRlcgorICAgIHB1YmxpYyB2b2lkIGFmdGVyKCkgeworICAgICAgICBpZiAoaXNEZWZhdWx0VGVzdENvbnRhaW5lckZhY3RvcnlTZXQgJiYgSGsySW5qZWN0aW9uTWFuYWdlckZhY3RvcnkuaXNJbW1lZGlhdGVTdHJhdGVneSgpKSB7CisgICAgICAgICAgICBjZGlTZXJ2ZXIuc2h1dGRvd25Ob3coKTsKKyAgICAgICAgICAgIHdlbGQuc2h1dGRvd24oKTsKKyAgICAgICAgICAgIGNsaWVudC5jbG9zZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyYW1WYWxpZGF0ZWRSZXNvdXJjZU5vUGFyYW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQXNzdW1lLmFzc3VtZVRoYXQoaXNEZWZhdWx0VGVzdENvbnRhaW5lckZhY3RvcnlTZXQsIENvcmVNYXRjaGVycy5pcyh0cnVlKSk7CisgICAgICAgIEJhc2VWYWxpZGF0aW9uVGVzdC5fdGVzdFBhcmFtVmFsaWRhdGVkUmVzb3VyY2VOb1BhcmFtKGNkaVRhcmdldCk7CisgICAgICAgIEJhc2VWYWxpZGF0aW9uVGVzdC5fdGVzdFBhcmFtVmFsaWRhdGVkUmVzb3VyY2VOb1BhcmFtKGhrMlRhcmdldCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFyYW1WYWxpZGF0ZWRSZXNvdXJjZVBhcmFtUHJvdmlkZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQXNzdW1lLmFzc3VtZVRoYXQoaXNEZWZhdWx0VGVzdENvbnRhaW5lckZhY3RvcnlTZXQsIENvcmVNYXRjaGVycy5pcyh0cnVlKSk7CisgICAgICAgIEJhc2VWYWxpZGF0aW9uVGVzdC5fdGVzdFBhcmFtVmFsaWRhdGVkUmVzb3VyY2VQYXJhbVByb3ZpZGVkKGNkaVRhcmdldCk7CisgICAgICAgIEJhc2VWYWxpZGF0aW9uVGVzdC5fdGVzdFBhcmFtVmFsaWRhdGVkUmVzb3VyY2VQYXJhbVByb3ZpZGVkKGhrMlRhcmdldCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmllbGRWYWxpZGF0ZWRSZXNvdXJjZU5vUGFyYW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQXNzdW1lLmFzc3VtZVRoYXQoaXNEZWZhdWx0VGVzdENvbnRhaW5lckZhY3RvcnlTZXQsIENvcmVNYXRjaGVycy5pcyh0cnVlKSk7CisgICAgICAgIEJhc2VWYWxpZGF0aW9uVGVzdC5fdGVzdEZpZWxkVmFsaWRhdGVkUmVzb3VyY2VOb1BhcmFtKGNkaVRhcmdldCk7CisgICAgICAgIEJhc2VWYWxpZGF0aW9uVGVzdC5fdGVzdEZpZWxkVmFsaWRhdGVkUmVzb3VyY2VOb1BhcmFtKGhrMlRhcmdldCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmllbGRWYWxpZGF0ZWRSZXNvdXJjZVBhcmFtUHJvdmlkZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQXNzdW1lLmFzc3VtZVRoYXQoaXNEZWZhdWx0VGVzdENvbnRhaW5lckZhY3RvcnlTZXQsIENvcmVNYXRjaGVycy5pcyh0cnVlKSk7CisgICAgICAgIEJhc2VWYWxpZGF0aW9uVGVzdC5fdGVzdEZpZWxkVmFsaWRhdGVkUmVzb3VyY2VQYXJhbVByb3ZpZGVkKGNkaVRhcmdldCk7CisgICAgICAgIEJhc2VWYWxpZGF0aW9uVGVzdC5fdGVzdEZpZWxkVmFsaWRhdGVkUmVzb3VyY2VQYXJhbVByb3ZpZGVkKGhrMlRhcmdldCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlWYWxpZGF0ZWRSZXNvdXJjZU5vUGFyYW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQXNzdW1lLmFzc3VtZVRoYXQoaXNEZWZhdWx0VGVzdENvbnRhaW5lckZhY3RvcnlTZXQsIENvcmVNYXRjaGVycy5pcyh0cnVlKSk7CisgICAgICAgIEJhc2VWYWxpZGF0aW9uVGVzdC5fdGVzdFByb3BlcnR5VmFsaWRhdGVkUmVzb3VyY2VOb1BhcmFtKGNkaVRhcmdldCk7CisgICAgICAgIEJhc2VWYWxpZGF0aW9uVGVzdC5fdGVzdFByb3BlcnR5VmFsaWRhdGVkUmVzb3VyY2VOb1BhcmFtKGhrMlRhcmdldCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvcGVydHlWYWxpZGF0ZWRSZXNvdXJjZVBhcmFtUHJvdmlkZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQXNzdW1lLmFzc3VtZVRoYXQoaXNEZWZhdWx0VGVzdENvbnRhaW5lckZhY3RvcnlTZXQsIENvcmVNYXRjaGVycy5pcyh0cnVlKSk7CisgICAgICAgIEJhc2VWYWxpZGF0aW9uVGVzdC5fdGVzdFByb3BlcnR5VmFsaWRhdGVkUmVzb3VyY2VQYXJhbVByb3ZpZGVkKGNkaVRhcmdldCk7CisgICAgICAgIEJhc2VWYWxpZGF0aW9uVGVzdC5fdGVzdFByb3BlcnR5VmFsaWRhdGVkUmVzb3VyY2VQYXJhbVByb3ZpZGVkKGhrMlRhcmdldCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0T2xkRmFzaGlvbmVkUmVzb3VyY2VOb1BhcmFtKCkgeworICAgICAgICBBc3N1bWUuYXNzdW1lVGhhdChpc0RlZmF1bHRUZXN0Q29udGFpbmVyRmFjdG9yeVNldCwgQ29yZU1hdGNoZXJzLmlzKHRydWUpKTsKKyAgICAgICAgQmFzZVZhbGlkYXRpb25UZXN0Ll90ZXN0T2xkRmFzaGlvbmVkUmVzb3VyY2VOb1BhcmFtKGNkaVRhcmdldCk7CisgICAgICAgIEJhc2VWYWxpZGF0aW9uVGVzdC5fdGVzdE9sZEZhc2hpb25lZFJlc291cmNlTm9QYXJhbShoazJUYXJnZXQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE9sZEZhc2hpb25lZFJlc291cmNlUGFyYW1Qcm92aWRlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBBc3N1bWUuYXNzdW1lVGhhdChpc0RlZmF1bHRUZXN0Q29udGFpbmVyRmFjdG9yeVNldCwgQ29yZU1hdGNoZXJzLmlzKHRydWUpKTsKKyAgICAgICAgQmFzZVZhbGlkYXRpb25UZXN0Ll90ZXN0T2xkRmFzaGlvbmVkUmVzb3VyY2VQYXJhbVByb3ZpZGVkKGNkaVRhcmdldCk7CisgICAgICAgIEJhc2VWYWxpZGF0aW9uVGVzdC5fdGVzdE9sZEZhc2hpb25lZFJlc291cmNlUGFyYW1Qcm92aWRlZChoazJUYXJnZXQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5vbkpheFJzVmFsaWRhdGlvbkZpZWxkVmFsaWRhdGVkUmVzb3VyY2VOb1BhcmFtKCkgeworICAgICAgICBBc3N1bWUuYXNzdW1lVGhhdChpc0RlZmF1bHRUZXN0Q29udGFpbmVyRmFjdG9yeVNldCwgQ29yZU1hdGNoZXJzLmlzKHRydWUpKTsKKyAgICAgICAgQmFzZVZhbGlkYXRpb25UZXN0Ll90ZXN0Tm9uSmF4UnNWYWxpZGF0aW9uRmllbGRWYWxpZGF0ZWRSZXNvdXJjZU5vUGFyYW0oY2RpVGFyZ2V0KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb25KYXhSc1ZhbGlkYXRpb25GaWVsZFZhbGlkYXRlZFJlc291cmNlUGFyYW1Qcm92aWRlZCgpIHsKKyAgICAgICAgQXNzdW1lLmFzc3VtZVRoYXQoaXNEZWZhdWx0VGVzdENvbnRhaW5lckZhY3RvcnlTZXQsIENvcmVNYXRjaGVycy5pcyh0cnVlKSk7CisgICAgICAgIEJhc2VWYWxpZGF0aW9uVGVzdC5fdGVzdE5vbkpheFJzVmFsaWRhdGlvbkZpZWxkVmFsaWRhdGVkUmVzb3VyY2VQYXJhbVByb3ZpZGVkKGNkaVRhcmdldCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVXZWxkKCkgeworICAgICAgICB3ZWxkID0gbmV3IFdlbGQoKTsKKyAgICAgICAgd2VsZC5pbml0aWFsaXplKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0R3JpenpseUNvbnRhaW5lcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIGNkaUNvbmZpZyA9IFJlc291cmNlQ29uZmlnLmZvckFwcGxpY2F0aW9uQ2xhc3MoQ2RpQXBwbGljYXRpb24uY2xhc3MpOworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyBoazJDb25maWcgPSBSZXNvdXJjZUNvbmZpZy5mb3JBcHBsaWNhdGlvbkNsYXNzKEhrMkFwcGxpY2F0aW9uLmNsYXNzKTsKKworICAgICAgICBjZGlTZXJ2ZXIgPSBHcml6emx5SHR0cFNlcnZlckZhY3RvcnkuY3JlYXRlSHR0cFNlcnZlcihCQVNFX0NESV9VUkksIGNkaUNvbmZpZywgZmFsc2UpOworICAgICAgICBmaW5hbCBIdHRwSGFuZGxlciBoazJIYW5kbGVyID0gY3JlYXRlR3JpenpseUNvbnRhaW5lcihoazJDb25maWcpOworICAgICAgICBjZGlTZXJ2ZXIuZ2V0U2VydmVyQ29uZmlndXJhdGlvbigpLmFkZEh0dHBIYW5kbGVyKGhrMkhhbmRsZXIsIEhLMl9VUkkpOworICAgICAgICBjZGlTZXJ2ZXIuc3RhcnQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZUNsaWVudCgpIHsKKyAgICAgICAgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKTsKKyAgICAgICAgY2RpVGFyZ2V0ID0gY2xpZW50LnRhcmdldChCQVNFX0NESV9VUkkpOworICAgICAgICBoazJUYXJnZXQgPSBjbGllbnQudGFyZ2V0KEJBU0VfSEsyX1VSSSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBHcml6emx5SHR0cENvbnRhaW5lciBjcmVhdGVHcml6emx5Q29udGFpbmVyKFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnKSB7CisgICAgICAgIHJldHVybiAobmV3IEdyaXp6bHlIdHRwQ29udGFpbmVyUHJvdmlkZXIoKSkuY3JlYXRlQ29udGFpbmVyKEdyaXp6bHlIdHRwQ29udGFpbmVyLmNsYXNzLCByZXNvdXJjZUNvbmZpZyk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0RlZmF1bHRUZXN0Q29udGFpbmVyRmFjdG9yeVNldCgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHRlc3RDb250YWluZXJGYWN0b3J5ID0gZ2V0U3lzdGVtUHJvcGVydHkoVGVzdFByb3BlcnRpZXMuQ09OVEFJTkVSX0ZBQ1RPUlksIG51bGwpOworICAgICAgICByZXR1cm4gdGVzdENvbnRhaW5lckZhY3RvcnkgPT0gbnVsbCB8fCBUZXN0UHJvcGVydGllcy5ERUZBVUxUX0NPTlRBSU5FUl9GQUNUT1JZLmVxdWFscyh0ZXN0Q29udGFpbmVyRmFjdG9yeSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFN5c3RlbVByb3BlcnR5KGZpbmFsIFN0cmluZyBwcm9wZXJ0eU5hbWUsIGZpbmFsIFN0cmluZyBkZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgZmluYWwgUHJvcGVydGllcyBzeXN0ZW1Qcm9wZXJ0aWVzID0gU3lzdGVtLmdldFByb3BlcnRpZXMoKTsKKyAgICAgICAgcmV0dXJuIHN5c3RlbVByb3BlcnRpZXMuZ2V0UHJvcGVydHkocHJvcGVydHlOYW1lLCBkZWZhdWx0VmFsdWUpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvUmF3Q2RpVGVzdC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9idi9SYXdDZGlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBiOTk2YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvUmF3Q2RpVGVzdC5qYXZhCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLmJ2OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5oazIuSGsySW5qZWN0aW9uTWFuYWdlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qYm9zcy53ZWxkLmVudmlyb25tZW50LnNlLldlbGQ7CitpbXBvcnQgb3JnLmp1bml0LkFzc3VtZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisKKy8qKgorICogVmFsaWRhdGlvbiByZXN1bHQgdGVzdCBmb3IgQ0RJIGVudmlyb25tZW50LgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBSYXdDZGlUZXN0IGV4dGVuZHMgQmFzZVZhbGlkYXRpb25UZXN0IHsKKworICAgIFdlbGQgd2VsZDsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBzZXR1cCgpIHsKKyAgICAgICAgQXNzdW1lLmFzc3VtZVRydWUoSGsySW5qZWN0aW9uTWFuYWdlckZhY3RvcnkuaXNJbW1lZGlhdGVTdHJhdGVneSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpZiAoSGsySW5qZWN0aW9uTWFuYWdlckZhY3RvcnkuaXNJbW1lZGlhdGVTdHJhdGVneSgpKSB7CisgICAgICAgICAgICBpZiAoIUV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpLmdldENsYXNzKCkpKSB7CisgICAgICAgICAgICAgICAgd2VsZCA9IG5ldyBXZWxkKCk7CisgICAgICAgICAgICAgICAgd2VsZC5pbml0aWFsaXplKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdXBlci5zZXRVcCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKEhrMkluamVjdGlvbk1hbmFnZXJGYWN0b3J5LmlzSW1tZWRpYXRlU3RyYXRlZ3koKSkgeworICAgICAgICAgICAgaWYgKCFFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5LmNsYXNzLmlzQXNzaWduYWJsZUZyb20oZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKS5nZXRDbGFzcygpKSkgeworICAgICAgICAgICAgICAgIHdlbGQuc2h1dGRvd24oKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN1cGVyLnRlYXJEb3duKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gUmVzb3VyY2VDb25maWcuZm9yQXBwbGljYXRpb25DbGFzcyhDZGlBcHBsaWNhdGlvbi5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRBcHBQYXRoKCkgeworICAgICAgICByZXR1cm4gImNkaSI7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9uSmF4UnNWYWxpZGF0aW9uRmllbGRWYWxpZGF0ZWRSZXNvdXJjZU5vUGFyYW0oKSB7CisgICAgICAgIEJhc2VWYWxpZGF0aW9uVGVzdC5fdGVzdE5vbkpheFJzVmFsaWRhdGlvbkZpZWxkVmFsaWRhdGVkUmVzb3VyY2VOb1BhcmFtKHRhcmdldCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROb25KYXhSc1ZhbGlkYXRpb25GaWVsZFZhbGlkYXRlZFJlc291cmNlUGFyYW1Qcm92aWRlZCgpIHsKKyAgICAgICAgQmFzZVZhbGlkYXRpb25UZXN0Ll90ZXN0Tm9uSmF4UnNWYWxpZGF0aW9uRmllbGRWYWxpZGF0ZWRSZXNvdXJjZVBhcmFtUHJvdmlkZWQodGFyZ2V0KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvUmF3SGsyVGVzdC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9idi9SYXdIazJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgzZWE2MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1iZWFudmFsaWRhdGlvbi13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvYnYvUmF3SGsyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLmJ2OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVmFsaWRhdGlvbiByZXN1bHQgdGVzdCBmb3IgcmF3IEhLMiBlbnZpcm9ubWVudC4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgUmF3SGsyVGVzdCBleHRlbmRzIEJhc2VWYWxpZGF0aW9uVGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gUmVzb3VyY2VDb25maWcuZm9yQXBwbGljYXRpb25DbGFzcyhIazJBcHBsaWNhdGlvbi5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRBcHBQYXRoKCkgeworICAgICAgICByZXR1cm4gImhrMiI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWVqYi10ZXN0LXdlYmFwcC9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWVqYi10ZXN0LXdlYmFwcC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5YjA1MjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktZWpiLXRlc3Qtd2ViYXBwL3BvbS54bWwKQEAgLTAsMCArMSw4MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5jZGktZWpiLXRlc3Qtd2ViYXBwPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWNkaS1lamItd2ViYXBwPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPkplcnNleSBDREkvRUpCIHRlc3Qgd2ViIGFwcGxpY2F0aW9uPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgud3MucnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC53cy5ycy1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguYW5ub3RhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LmFubm90YXRpb24tYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVudGVycHJpc2U8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jZGktYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVqYjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LmVqYi1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1idW5kbGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dHlwZT5wb208L3R5cGU+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKyAgICA8YnVpbGQ+CisgICAgICAgIDxmaW5hbE5hbWU+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9maW5hbE5hbWU+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxza2lwVGVzdHM+JHtza2lwVGVzdHN9PC9za2lwVGVzdHM+CisgICAgICAgICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk+JHt0ZXN0Q29udGFpbmVyRmFjdG9yeX08L2plcnNleS5jb25maWcudGVzdC5jb250YWluZXIuZmFjdG9yeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+JHt0ZXN0Q29udGFpbmVyUG9ydH08L2plcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydD4KKyAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxza2lwVGVzdHM+dHJ1ZTwvc2tpcFRlc3RzPgorICAgICAgICA8dGVzdENvbnRhaW5lckZhY3Rvcnk+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5PC90ZXN0Q29udGFpbmVyRmFjdG9yeT4KKyAgICAgICAgPHRlc3RDb250YWluZXJQb3J0PjgwODA8L3Rlc3RDb250YWluZXJQb3J0PgorICAgIDwvcHJvcGVydGllcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0Jhc2ljVGltZXIuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0Jhc2ljVGltZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzVmYWUwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWVqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQmFzaWNUaW1lci5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUG9zdENvbnN0cnVjdDsKKworLyoqCisgKiBCYXNpYyB0aW1lciBpbXBsZW1lbnRhdGlvbiB0byBiZSByZXVzZWQgZm9yIHZhcmlvdXMgdHlwZXMgb2YgYmVhbnMuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhaworICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQmFzaWNUaW1lciB7CisKKyAgICBsb25nIG1zOworCisgICAvKioKKyAgICAqIFByb3ZpZGUgaW5mb3JtYXRpb24gb24gaW50ZXJuYWwgdGltZXIgbWlsbGlzZWNvbmQgdmFsdWUuCisgICAgKgorICAgICogQHJldHVybiBtaWxsaXNlY29uZHMgd2hlbiB0aGUgY3VycmVudCBiZWFuIGhhcyBiZWVuIHBvc3QtY29uc3RydWN0ZWQuCisgICAgKi8KKyAgIHB1YmxpYyBsb25nIGdldE1pbGlzZWNvbmRzKCkgeworICAgICAgIHJldHVybiBtczsKKyAgIH0KKworICAgLyoqCisgICAgKiBJbml0aWFsaXplIHRoaXMgdGltZXIgd2l0aCB0aGUgY3VycmVudCB0aW1lLgorICAgICovCisgICBAUG9zdENvbnN0cnVjdAorICAgcHVibGljIHZvaWQgaW5pdCgpIHsKKyAgICAgICB0aGlzLm1zID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9DZGlBcHBTY29wZWRUaW1lci5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWVqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQ2RpQXBwU2NvcGVkVGltZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTllNjY5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWVqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQ2RpQXBwU2NvcGVkVGltZXIuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuQXBwbGljYXRpb25TY29wZWQ7CisKKy8qKgorICogQXBwbGljYXRpb24gc2NvcGVkIENESSBiZWFuIHRvIGJlIGluamVjdGVkIGludG8gRUpCIHJlc291cmNlcy4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAQXBwbGljYXRpb25TY29wZWQKK3B1YmxpYyBjbGFzcyBDZGlBcHBTY29wZWRUaW1lciBleHRlbmRzIEJhc2ljVGltZXIgeworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWVqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQ2RpUmVxdWVzdFNjb3BlZFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9DZGlSZXF1ZXN0U2NvcGVkUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmU2MjA0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWVqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQ2RpUmVxdWVzdFNjb3BlZFJlc291cmNlLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXguZWpiLkVKQjsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuUmVxdWVzdFNjb3BlZDsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CisKKy8qKgorICogUmVxdWVzdCBzY29wZWQgQ0RJIGJlYW4gaW5qZWN0ZWQgd2l0aCBFSkIgdGltZXJzLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSZXF1ZXN0U2NvcGVkCitAUGF0aCgicmVxdWVzdC1zY29wZWQiKQorcHVibGljIGNsYXNzIENkaVJlcXVlc3RTY29wZWRSZXNvdXJjZSB7CisKKyAgICBARUpCIEVqYlNpbmdsZXRvblRpbWVyIGVqYkluamVjdGVkVGltZXI7CisgICAgQEluamVjdCBFamJTaW5nbGV0b25UaW1lciBqc3IzMzBJbmplY3RlZFRpbWVyOworICAgIEBJbmplY3QgQ2RpQXBwU2NvcGVkVGltZXIgY2RpVGltZXI7CisKKyAgICBAR0VUCisgICAgQFBhdGgoImVqYi1pbmplY3RlZC10aW1lciIpCisgICAgcHVibGljIFN0cmluZyBnZXRFamJUaW1lKCkgeworICAgICAgICByZXR1cm4gTG9uZy50b1N0cmluZyhlamJJbmplY3RlZFRpbWVyLmdldE1pbGlzZWNvbmRzKCkpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgianNyMzMwLWluamVjdGVkLXRpbWVyIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldEpzcjMzMFRpbWUoKSB7CisgICAgICAgIHJldHVybiBMb25nLnRvU3RyaW5nKGpzcjMzMEluamVjdGVkVGltZXIuZ2V0TWlsaXNlY29uZHMoKSk7CisgICAgfQorCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TXlzZWxmKCkgeworICAgICAgICByZXR1cm4gdGhpcy50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0NkaVJlcXVlc3RTY29wZWRUaW1lci5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWVqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQ2RpUmVxdWVzdFNjb3BlZFRpbWVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ4ZTFmNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0NkaVJlcXVlc3RTY29wZWRUaW1lci5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5SZXF1ZXN0U2NvcGVkOworCisvKioKKyAqIFJlcXVlc3Qgc2NvcGVkIENESSB0aW1lci4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUmVxdWVzdFNjb3BlZAorcHVibGljIGNsYXNzIENkaVJlcXVlc3RTY29wZWRUaW1lciBleHRlbmRzIEJhc2ljVGltZXIgeworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWVqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvRWpiU2luZ2xldG9uUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0VqYlNpbmdsZXRvblJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM0NzJkOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0VqYlNpbmdsZXRvblJlc291cmNlLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXguZWpiLlNpbmdsZXRvbjsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworCisvKioKKyAqIEVKQiBzaW5nbGV0b24gc2Vzc2lvbiBiZWFuIGluamVjdGVkIHdpdGggQ0RJIHRpbWVycy4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAU2luZ2xldG9uCitAUGF0aCgic2luZ2xldG9uIikKK3B1YmxpYyBjbGFzcyBFamJTaW5nbGV0b25SZXNvdXJjZSB7CisKKyAgICBASW5qZWN0IENkaVJlcXVlc3RTY29wZWRUaW1lciByZXF1ZXN0U2NvcGVkVGltZXI7CisgICAgQEluamVjdCBDZGlBcHBTY29wZWRUaW1lciBhcHBTY29wZWRUaW1lcjsKKworICAgIEBHRVQKKyAgICBAUGF0aCgicmVxdWVzdC1zY29wZWQtdGltZXIiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxVGltZSgpIHsKKyAgICAgICAgcmV0dXJuIExvbmcudG9TdHJpbmcocmVxdWVzdFNjb3BlZFRpbWVyLmdldE1pbGlzZWNvbmRzKCkpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiYXBwLXNjb3BlZC10aW1lciIpCisgICAgcHVibGljIFN0cmluZyBnZXRBcHBUaW1lKCkgeworICAgICAgICByZXR1cm4gTG9uZy50b1N0cmluZyhhcHBTY29wZWRUaW1lci5nZXRNaWxpc2Vjb25kcygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9FamJTaW5nbGV0b25UaW1lci5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWVqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvRWpiU2luZ2xldG9uVGltZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmVjMDRkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWVqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvRWpiU2luZ2xldG9uVGltZXIuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC5lamIuU2luZ2xldG9uOworCisvKioKKyAqIEVKQiBzaW5nbGV0b24gdGltZXIuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFNpbmdsZXRvbgorcHVibGljIGNsYXNzIEVqYlNpbmdsZXRvblRpbWVyIGV4dGVuZHMgQmFzaWNUaW1lciB7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9FamJTdGF0ZWZ1bFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9FamJTdGF0ZWZ1bFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVmYmM5ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0VqYlN0YXRlZnVsUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC5lamIuU3RhdGVmdWw7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworLyoqCisgKiBFSkIgYmFja2VkIEpBWC1SUyByZXNvdXJjZSBpbmplY3RlZCB3aXRoIENESSBzZXJ2aWNlIHByb3ZpZGVycy4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAU3RhdGVmdWwKK0BQYXRoKCJzdGF0ZWZ1bCIpCitwdWJsaWMgY2xhc3MgRWpiU3RhdGVmdWxSZXNvdXJjZSB7CisKKyAgICBASW5qZWN0IENkaVJlcXVlc3RTY29wZWRUaW1lciByZXF1ZXN0U2NvcGVkVGltZXI7CisgICAgQEluamVjdCBDZGlBcHBTY29wZWRUaW1lciBhcHBTY29wZWRUaW1lcjsKKworICAgIEBHRVQKKyAgICBAUGF0aCgicmVxdWVzdC1zY29wZWQtdGltZXIiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxVGltZSgpIHsKKyAgICAgICAgcmV0dXJuIExvbmcudG9TdHJpbmcocmVxdWVzdFNjb3BlZFRpbWVyLmdldE1pbGlzZWNvbmRzKCkpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiYXBwLXNjb3BlZC10aW1lciIpCisgICAgcHVibGljIFN0cmluZyBnZXRBcHBUaW1lKCkgeworICAgICAgICByZXR1cm4gTG9uZy50b1N0cmluZyhhcHBTY29wZWRUaW1lci5nZXRNaWxpc2Vjb25kcygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9FamJTdGF0ZWxlc3NSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWVqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvRWpiU3RhdGVsZXNzUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWRhMWNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWVqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvRWpiU3RhdGVsZXNzUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC5lamIuU3RhdGVsZXNzOworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CisKKy8qKgorICogRUpCIHNlc3Npb24gYmVhbiBpbmplY3RlZCB3aXRoIENESSBzZXJ2aWNlIHByb3ZpZGVycy4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAU3RhdGVsZXNzCitAUGF0aCgic3RhdGVsZXNzIikKK3B1YmxpYyBjbGFzcyBFamJTdGF0ZWxlc3NSZXNvdXJjZSB7CisKKyAgICBASW5qZWN0IENkaVJlcXVlc3RTY29wZWRUaW1lciByZXF1ZXN0U2NvcGVkVGltZXI7CisgICAgQEluamVjdCBDZGlBcHBTY29wZWRUaW1lciBhcHBTY29wZWRUaW1lcjsKKworICAgIEBHRVQKKyAgICBAUGF0aCgicmVxdWVzdC1zY29wZWQtdGltZXIiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxVGltZSgpIHsKKyAgICAgICAgcmV0dXJuIExvbmcudG9TdHJpbmcocmVxdWVzdFNjb3BlZFRpbWVyLmdldE1pbGlzZWNvbmRzKCkpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiYXBwLXNjb3BlZC10aW1lciIpCisgICAgcHVibGljIFN0cmluZyBnZXRBcHBUaW1lKCkgeworICAgICAgICByZXR1cm4gTG9uZy50b1N0cmluZyhhcHBTY29wZWRUaW1lci5nZXRNaWxpc2Vjb25kcygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9FamJTdGF0ZWxlc3NUaW1lci5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWVqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvRWpiU3RhdGVsZXNzVGltZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjFhYTE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWVqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvRWpiU3RhdGVsZXNzVGltZXIuamF2YQpAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC5lamIuU3RhdGVsZXNzOworCisvKioKKyAqIEVKQiBzZXNzaW9uIHRpbWVyIGJlYW4uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFN0YXRlbGVzcworcHVibGljIGNsYXNzIEVqYlN0YXRlbGVzc1RpbWVyIGV4dGVuZHMgQmFzaWNUaW1lciB7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9NeUFwcGxpY2F0aW9uLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9NeUFwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjllMzk1ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL015QXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKKy8qKgorICogSkFYLVJTIGFwcGxpY2F0aW9uIHRvIGNvbmZpZ3VyZSByZXNvdXJjZXMuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uUGF0aCgiLyoiKQorcHVibGljIGNsYXNzIE15QXBwbGljYXRpb24gZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgZmluYWwgU2V0PENsYXNzPD8+PiBjbGFzc2VzID0gbmV3IEhhc2hTZXQ8Q2xhc3M8Pz4+KCk7CisgICAgICAgIGNsYXNzZXMuYWRkKENkaVJlcXVlc3RTY29wZWRSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIGNsYXNzZXMuYWRkKENkaVJlcXVlc3RTY29wZWRUaW1lci5jbGFzcyk7CisgICAgICAgIGNsYXNzZXMuYWRkKENkaUFwcFNjb3BlZFRpbWVyLmNsYXNzKTsKKyAgICAgICAgY2xhc3Nlcy5hZGQoRWpiU3RhdGVsZXNzUmVzb3VyY2UuY2xhc3MpOworICAgICAgICBjbGFzc2VzLmFkZChFamJTdGF0ZWZ1bFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgY2xhc3Nlcy5hZGQoRWpiU2luZ2xldG9uUmVzb3VyY2UuY2xhc3MpOworICAgICAgICByZXR1cm4gY2xhc3NlczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2JlYW5zLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1lamItdGVzdC13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvYmVhbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZGYzNjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2JlYW5zLnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxiZWFucy8+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFlNmI2ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1lamItdGVzdC13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCit4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfM18wLnhzZCIKKyAgICAgIHZlcnNpb249IjMuMCI+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktZWpiLXRlc3Qtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9DZGlJbnRvRWpiVGVzdC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWVqYi10ZXN0LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQ2RpSW50b0VqYlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGU4MjI2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWVqYi10ZXN0LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQ2RpSW50b0VqYlRlc3QuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIFRlc3QgQ0RJIHRpbWVycyBpbmplY3RlZCBpbnRvIEVKQiBiZWFucy4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQ2RpSW50b0VqYlRlc3QgZXh0ZW5kcyBUZXN0QmFzZSB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGF0ZWxlc3MoKSB7CisgICAgICAgIF90ZXN0UmVxdWVzdFNjb3BlZCgic3RhdGVsZXNzIik7CisgICAgICAgIF90ZXN0QXBwU2NvcGVkKCJzdGF0ZWxlc3MiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdGF0ZWZ1bCgpIHsKKyAgICAgICAgX3Rlc3RSZXF1ZXN0U2NvcGVkKCJzdGF0ZWZ1bCIpOworICAgICAgICBfdGVzdEFwcFNjb3BlZCgic3RhdGVmdWwiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGV0b24oKSB7CisgICAgICAgIF90ZXN0UmVxdWVzdFNjb3BlZCgic2luZ2xldG9uIik7CisgICAgICAgIF90ZXN0QXBwU2NvcGVkKCJzaW5nbGV0b24iKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3RSZXF1ZXN0U2NvcGVkKGZpbmFsIFN0cmluZyBlamJUeXBlKSB7CisKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpLnBhdGgoZWpiVHlwZSkucGF0aCgicmVxdWVzdC1zY29wZWQtdGltZXIiKTsKKyAgICAgICAgbG9uZyBmaXJzdE1pbGxpcyA9IF9nZXRNaWxsaXModGFyZ2V0KTsKKyAgICAgICAgc2xlZXAoMik7CisgICAgICAgIGxvbmcgc2Vjb25kTWlsbGlzID0gX2dldE1pbGxpcyh0YXJnZXQpOworCisgICAgICAgIGFzc2VydFRydWUoIlNlY29uZCByZXF1ZXN0IHNob3VsZCBoYXZlIGdyZWF0ZXIgbWlsbGlzISIsIHNlY29uZE1pbGxpcyA+IGZpcnN0TWlsbGlzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3RBcHBTY29wZWQoZmluYWwgU3RyaW5nIGVqYlR5cGUpIHsKKworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCkucGF0aChlamJUeXBlKS5wYXRoKCJhcHAtc2NvcGVkLXRpbWVyIik7CisgICAgICAgIGxvbmcgZmlyc3RNaWxsaXMgPSBfZ2V0TWlsbGlzKHRhcmdldCk7CisgICAgICAgIHNsZWVwKDIpOworICAgICAgICBsb25nIHNlY29uZE1pbGxpcyA9IF9nZXRNaWxsaXModGFyZ2V0KTsKKworICAgICAgICBhc3NlcnRUcnVlKCJTZWNvbmQgcmVxdWVzdCBzaG91bGQgaGF2ZSB0aGUgc2FtZSBtaWxsaXMhIiwgc2Vjb25kTWlsbGlzID09IGZpcnN0TWlsbGlzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktZWpiLXRlc3Qtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9FamJJbnRvQ2RpVGVzdC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWVqYi10ZXN0LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvRWpiSW50b0NkaVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzE4MzZjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWVqYi10ZXN0LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvRWpiSW50b0NkaVRlc3QuamF2YQpAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLm5vdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworCisvKioKKyAqIFRlc3QgRUpCIHRpbWVycyBpbmplY3RlZCBpbnRvIENESSBiZWFucy4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgRWpiSW50b0NkaVRlc3QgZXh0ZW5kcyBUZXN0QmFzZSB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbmplY3Rpb24oKSB7CisKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IGNkaVJlc291cmNlID0gdGFyZ2V0KCkucGF0aCgicmVxdWVzdC1zY29wZWQiKTsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IGVqYkluamVjdGVkVGltZXIgPSBjZGlSZXNvdXJjZS5wYXRoKCJlamItaW5qZWN0ZWQtdGltZXIiKTsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IGpzcjMzMEluamVjdGVkVGltZXIgPSBjZGlSZXNvdXJjZS5wYXRoKCJqc3IzMzAtaW5qZWN0ZWQtdGltZXIiKTsKKworICAgICAgICBTdHJpbmcgZmlyc3RSZXNvdXJjZSA9IGNkaVJlc291cmNlLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgbG9uZyBmaXJzdE1pbGxpcyA9IF9nZXRNaWxsaXMoZWpiSW5qZWN0ZWRUaW1lcik7CisgICAgICAgIHNsZWVwKDIpOworICAgICAgICBTdHJpbmcgc2Vjb25kUmVzb3VyY2UgPSBjZGlSZXNvdXJjZS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGxvbmcgc2Vjb25kTWlsbGlzID0gX2dldE1pbGxpcyhqc3IzMzBJbmplY3RlZFRpbWVyKTsKKworICAgICAgICBhc3NlcnRUaGF0KGZpcnN0TWlsbGlzLCBlcXVhbFRvKHNlY29uZE1pbGxpcykpOworICAgICAgICBhc3NlcnRUaGF0KGZpcnN0UmVzb3VyY2UsIG5vdChlcXVhbFRvKHNlY29uZFJlc291cmNlKSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1lamItdGVzdC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1Rlc3RCYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktZWpiLXRlc3Qtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9UZXN0QmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxMTE4OWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktZWpiLXRlc3Qtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9UZXN0QmFzZS5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworCisvKioKKyAqIFRlc3QgZm9yIENESSB3ZWIgYXBwbGljYXRpb24gcmVzb3VyY2VzLgorICogUnVuIHdpdGg6CisgKiA8cHJlPgorICogbXZuIGNsZWFuIHBhY2thZ2UKKyAqICRBU19IT01FL2Jpbi9hc2FkbWluIGRlcGxveSB0YXJnZXQvY2RpLXRlc3Qtd2ViYXBwCisgKiBtdm4gLURza2lwVGVzdHM9ZmFsc2UgdGVzdDwvcHJlPgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0QmFzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNeUFwcGxpY2F0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFVSSSBnZXRCYXNlVXJpKCkgeworICAgICAgICByZXR1cm4gVXJpQnVpbGRlci5mcm9tVXJpKHN1cGVyLmdldEJhc2VVcmkoKSkucGF0aCgiY2RpLWVqYi10ZXN0LXdlYmFwcCIpLmJ1aWxkKCk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGxvbmcgX2dldE1pbGxpcyhmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0KSB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcygyMDApKTsKKyAgICAgICAgcmV0dXJuIExvbmcuZGVjb2RlKHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2xlZXAobG9uZyBtcykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKG1zKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoQ2RpSW50b0VqYlRlc3QuY2xhc3MuZ2V0TmFtZSgpKS5sb2coTGV2ZWwuU0VWRVJFLCBudWxsLCBleCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1pZmFjZS13aXRoLW5vbi1qYXhycy1pbXBsLXRlc3Qtd2ViYXBwL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktaWZhY2Utd2l0aC1ub24tamF4cnMtaW1wbC10ZXN0LXdlYmFwcC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwY2YyOWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktaWZhY2Utd2l0aC1ub24tamF4cnMtaW1wbC10ZXN0LXdlYmFwcC9wb20ueG1sCkBAIC0wLDAgKzEsNzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+Y2RpLWlmYWNlLXdpdGgtbm9uLWpheHJzLWltcGwtdGVzdC13ZWJhcHA8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtY2RpLWlmYWNlLXdpdGgtbm9uLWpheHJzLWltcGwtdGVzdC13ZWJhcHA8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+SmVyc2V5IENESSB1c2luZyBub24gSkFYLVJTIGltcGxlbWVudGF0aW9uIGZvciBDREkgaW5qZWN0aW9uPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgud3MucnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC53cy5ycy1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguZW50ZXJwcmlzZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmNkaS1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8ZmluYWxOYW1lPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvZmluYWxOYW1lPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c2tpcFRlc3RzPiR7c2tpcFRlc3RzfTwvc2tpcFRlc3RzPgorICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5mYWN0b3J5PiR7dGVzdENvbnRhaW5lckZhY3Rvcnl9PC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0PiR7dGVzdENvbnRhaW5lclBvcnR9PC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+CisgICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxza2lwVGVzdHM+dHJ1ZTwvc2tpcFRlc3RzPgorICAgICAgICA8dGVzdENvbnRhaW5lckZhY3Rvcnk+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5PC90ZXN0Q29udGFpbmVyRmFjdG9yeT4KKyAgICAgICAgPHRlc3RDb250YWluZXJQb3J0PjgwODA8L3Rlc3RDb250YWluZXJQb3J0PgorICAgIDwvcHJvcGVydGllcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1pZmFjZS13aXRoLW5vbi1qYXhycy1pbXBsLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9DZGlFY2hvLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktaWZhY2Utd2l0aC1ub24tamF4cnMtaW1wbC10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQ2RpRWNoby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxN2E5OTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktaWZhY2Utd2l0aC1ub24tamF4cnMtaW1wbC10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQ2RpRWNoby5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworLyoqCisgKiBSYXcgQ0RJIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBFY2hvfSBzZXJ2aWNlLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBDZGlFY2hvIGltcGxlbWVudHMgRWNobyB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGVjaG8oU3RyaW5nIHMpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIkNESSBFQ0hPRUQgJXMiLCBzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktaWZhY2Utd2l0aC1ub24tamF4cnMtaW1wbC10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvRWNoby5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWlmYWNlLXdpdGgtbm9uLWpheHJzLWltcGwtdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0VjaG8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTczZDZjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWlmYWNlLXdpdGgtbm9uLWpheHJzLWltcGwtdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0VjaG8uamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKKy8qKgorICogRWNobyBzZXJ2aWNlIGludGVyZmFjZS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgaW50ZXJmYWNlIEVjaG8geworCisgICAgLyoqCisgICAgICogRWNobyBzZXJ2aWNlIG1ldGhvZDsKKyAgICAgKgorICAgICAqIEBwYXJhbSBzIGlucHV0CisgICAgICogQHJldHVybiBlY2hvZWQgaW5wdXQKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGVjaG8oU3RyaW5nIHMpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWlmYWNlLXdpdGgtbm9uLWpheHJzLWltcGwtdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0VjaG9SZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWlmYWNlLXdpdGgtbm9uLWpheHJzLWltcGwtdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0VjaG9SZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjYTBjN2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktaWZhY2Utd2l0aC1ub24tamF4cnMtaW1wbC10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvRWNob1Jlc291cmNlLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworCisvKioKKyAqIEpBWC1SUyByZXNvdXJjZSBjbGFzcyBiYWNrZWQgYnkgQ0RJIGJlYW4uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoImVjaG8iKQorcHVibGljIGNsYXNzIEVjaG9SZXNvdXJjZSB7CisKKyAgICAvLyBDREkgaW5qZWN0aW9uLCBISzIgc2hvdWxkIGJhY2sgb2ZmCisgICAgLy8gZXZlbiBpZiBFY2hvSW1wbCBpcyBub3QgZGlyZWN0bHkgdXNlZCBoZXJlCisgICAgLy8gYW5kIGNvdWxkIGFwcGVhciBhcyBISzIgY3VzdG9tIGJvdW5kIHR5cGUKKyAgICAvLyB0byBKZXJzZXkgQ0RJIGV4dGVuc2lvbgorICAgIEBJbmplY3QgRWNobyBlY2hvU2VydmljZTsKKworICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGNkaUVjaG8oQFF1ZXJ5UGFyYW0oInMiKSBTdHJpbmcgcykgeworICAgICAgICByZXR1cm4gZWNob1NlcnZpY2UuZWNobyhzKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1pZmFjZS13aXRoLW5vbi1qYXhycy1pbXBsLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9NeUFwcGxpY2F0aW9uLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktaWZhY2Utd2l0aC1ub24tamF4cnMtaW1wbC10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvTXlBcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1NTA2YTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktaWZhY2Utd2l0aC1ub24tamF4cnMtaW1wbC10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvTXlBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworLyoqCisgKiBKQVgtUlMgYXBwbGljYXRpb24gdG8gY29uZmlndXJlIHJlc291cmNlcy4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAQXBwbGljYXRpb25QYXRoKCIvKiIpCitwdWJsaWMgY2xhc3MgTXlBcHBsaWNhdGlvbiBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgIGZpbmFsIFNldDxDbGFzczw/Pj4gY2xhc3NlcyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgY2xhc3Nlcy5hZGQoRWNob1Jlc291cmNlLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIGNsYXNzZXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWlmYWNlLXdpdGgtbm9uLWpheHJzLWltcGwtdGVzdC13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvYmVhbnMueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWlmYWNlLXdpdGgtbm9uLWpheHJzLWltcGwtdGVzdC13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvYmVhbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZGYzNjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktaWZhY2Utd2l0aC1ub24tamF4cnMtaW1wbC10ZXN0LXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9iZWFucy54bWwKQEAgLTAsMCArMSwyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8YmVhbnMvPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWlmYWNlLXdpdGgtbm9uLWpheHJzLWltcGwtdGVzdC13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1pZmFjZS13aXRoLW5vbi1qYXhycy1pbXBsLXRlc3Qtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFlNmI2ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1pZmFjZS13aXRoLW5vbi1qYXhycy1pbXBsLXRlc3Qtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwyNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgoreG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzNfMC54c2QiCisgICAgICB2ZXJzaW9uPSIzLjAiPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLWlmYWNlLXdpdGgtbm9uLWpheHJzLWltcGwtdGVzdC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0VjaG9SZXNvdXJjZVRlc3QuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1pZmFjZS13aXRoLW5vbi1qYXhycy1pbXBsLXRlc3Qtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9FY2hvUmVzb3VyY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZlNThiMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1pZmFjZS13aXRoLW5vbi1qYXhycy1pbXBsLXRlc3Qtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9FY2hvUmVzb3VyY2VUZXN0LmphdmEKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLnN0YXJ0c1dpdGg7CisKKy8qKgorICogVGVzdCBmb3IgQ0RJIHdlYiBhcHBsaWNhdGlvbiByZXNvdXJjZXMuCisgKiBSdW4gd2l0aDoKKyAqIDxwcmU+CisgKiBtdm4gY2xlYW4gcGFja2FnZQorICogJEFTX0hPTUUvYmluL2FzYWRtaW4gZGVwbG95IHRhcmdldC9jZGktdGVzdC13ZWJhcHAKKyAqIG12biAtRHNraXBUZXN0cz1mYWxzZSB0ZXN0PC9wcmU+CisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEVjaG9SZXNvdXJjZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgTXlBcHBsaWNhdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBVUkkgZ2V0QmFzZVVyaSgpIHsKKyAgICAgICAgcmV0dXJuIFVyaUJ1aWxkZXIuZnJvbVVyaShzdXBlci5nZXRCYXNlVXJpKCkpLnBhdGgoImNkaS1pZmFjZS13aXRoLW5vbi1qYXhycy1pbXBsLXRlc3Qtd2ViYXBwIikuYnVpbGQoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDZGlJbmplY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJlY2hvIikucXVlcnlQYXJhbSgicyIsICJJIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIHN0YXJ0c1dpdGgoIkNESSBFQ0hPRUQiKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgc2xlZXAobG9uZyBtcykgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKG1zKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIExvZ2dlci5nZXRMb2dnZXIoRWNob1Jlc291cmNlVGVzdC5jbGFzcy5nZXROYW1lKCkpLmxvZyhMZXZlbC5TRVZFUkUsIG51bGwsIGV4KTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aW1vZHVsZS9lYXIvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aW1vZHVsZS9lYXIvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjAxZDFlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpbW9kdWxlL2Vhci9wb20ueG1sCkBAIC0wLDAgKzEsODUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+Y2RpLW11bHRpbW9kdWxlLWVhcjwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmVhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1jZGktbXVsdGltb2R1bGUtZWFyPC9uYW1lPgorCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxwcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPlVURi04PC9wcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPgorICAgIDwvcHJvcGVydGllcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1lYXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj42PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICA8ZGVmYXVsdExpYkJ1bmRsZURpcj5BUFAtSU5GL2xpYjwvZGVmYXVsdExpYkJ1bmRsZURpcj4KKyAgICAgICAgICAgICAgICAgICAgPG1vZHVsZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8d2ViTW9kdWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNkaS1tdWx0aW1vZHVsZS13YXIxPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPC93ZWJNb2R1bGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgPHdlYk1vZHVsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jZGktbXVsdGltb2R1bGUtd2FyMjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvd2ViTW9kdWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGphck1vZHVsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jZGktbXVsdGltb2R1bGUtbGliPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9qYXJNb2R1bGU+CisgICAgICAgICAgICAgICAgICAgIDwvbW9kdWxlcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2RpLW11bHRpbW9kdWxlLXdhcjE8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dHlwZT53YXI8L3R5cGU+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jZGktbXVsdGltb2R1bGUtd2FyMjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPndhcjwvdHlwZT4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2RpLW11bHRpbW9kdWxlLWxpYjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPmphcjwvdHlwZT4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpbW9kdWxlL2xpYi9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpbW9kdWxlL2xpYi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMzhjOTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktbXVsdGltb2R1bGUvbGliL3BvbS54bWwKQEAgLTAsMCArMSw2OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi8uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5jZGktbXVsdGltb2R1bGUtbGliPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLWNkaS1tdWx0aW1vZHVsZS1saWI8L25hbWU+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LndzLnJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXgud3MucnMtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVqYjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LmVqYi1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVudGVycHJpc2U8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jZGktYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LmFubm90YXRpb248L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5hbm5vdGF0aW9uLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1pbnN0YWxsLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHNraXA+ZmFsc2U8L3NraXA+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktbXVsdGltb2R1bGUvbGliL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvY2RpL2xpYi9KYXhSc0luamVjdGVkRGVwZW5kZW50QmVhbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpbW9kdWxlL2xpYi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2NkaS9saWIvSmF4UnNJbmplY3RlZERlcGVuZGVudEJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGVjYTRhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpbW9kdWxlL2xpYi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2NkaS9saWIvSmF4UnNJbmplY3RlZERlcGVuZGVudEJlYW4uamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLm11bHRpbW9kdWxlLmNkaS5saWI7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuQXBwbGljYXRpb25TY29wZWQ7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LlJlcXVlc3RTY29wZWQ7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC53cy5ycy5IZWFkZXJQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXF1ZXN0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKKworLyoqCisgKiBDREkgbWFuYWdlZCBiZWFuLCB0aGF0IGdldHMgSkFYLVJTIGluamVjdGVkLiBUaGlzIGJlYW4gaXMgYmVpbmcgY29uc3VtZWQKKyAqIGJ5IGFsbCB3ZWIgYXBwcyB3aXRoaW4gYW4gRUFSIHBhY2thZ2VkIGVudGVycHJpc2UgYXBwbGljYXRpb24uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEpheFJzSW5qZWN0ZWREZXBlbmRlbnRCZWFuIHsKKworICAgIEBDb250ZXh0CisgICAgVXJpSW5mbyB1cmlJbmZvOworCisgICAgQEhlYWRlclBhcmFtKCJ4LXRlc3QiKQorICAgIFN0cmluZyB0ZXN0SGVhZGVyOworCisgICAgLyoqCisgICAgICogR2V0IG1lIFVSSSBpbmZvLgorICAgICAqCisgICAgICogQHJldHVybiBVUkkgaW5mbyBmcm9tIHRoZSBKQVgtUlMgbGF5ZXIuCisgICAgICovCisgICAgcHVibGljIFVyaUluZm8gZ2V0VXJpSW5mbygpIHsKKyAgICAgICAgcmV0dXJuIHVyaUluZm87CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IG1lIHRoZSBhY3R1YWwgcmVxdWVzdCB0ZXN0IGhlYWRlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYWN0dWFsIHJlcXVlc3QgVVJJIGluZm8uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXRUZXN0SGVhZGVyKCkgeworICAgICAgICByZXR1cm4gdGVzdEhlYWRlcjsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aW1vZHVsZS9saWIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9jZGkvbGliL0pheFJzSW5qZWN0ZWRSZXF1ZXN0U2NvcGVkQmVhbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpbW9kdWxlL2xpYi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2NkaS9saWIvSmF4UnNJbmplY3RlZFJlcXVlc3RTY29wZWRCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY2NGVkOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aW1vZHVsZS9saWIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9jZGkvbGliL0pheFJzSW5qZWN0ZWRSZXF1ZXN0U2NvcGVkQmVhbi5qYXZhCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24ubXVsdGltb2R1bGUuY2RpLmxpYjsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5SZXF1ZXN0U2NvcGVkOworaW1wb3J0IGphdmF4LndzLnJzLkhlYWRlclBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CisKKy8qKgorICogQ0RJIG1hbmFnZWQgYmVhbiwgdGhhdCBnZXRzIEpBWC1SUyBpbmplY3RlZC4gVGhpcyBiZWFuIGlzIGJlaW5nIGNvbnN1bWVkCisgKiBieSBhbGwgd2ViIGFwcHMgd2l0aGluIGFuIEVBUiBwYWNrYWdlZCBlbnRlcnByaXNlIGFwcGxpY2F0aW9uLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSZXF1ZXN0U2NvcGVkCitwdWJsaWMgY2xhc3MgSmF4UnNJbmplY3RlZFJlcXVlc3RTY29wZWRCZWFuIHsKKworICAgIEBDb250ZXh0CisgICAgVXJpSW5mbyB1cmlJbmZvOworCisgICAgQEhlYWRlclBhcmFtKCJ4LXRlc3QiKQorICAgIFN0cmluZyB0ZXN0SGVhZGVyOworCisgICAgLyoqCisgICAgICogR2V0IG1lIHRoZSBhY3R1YWwgSkFYLVJTIHJlcXVlc3QgVVJJIGluZm8uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFjdHVhbCByZXF1ZXN0IFVSSSBpbmZvLgorICAgICAqLworICAgIHB1YmxpYyBVcmlJbmZvIGdldFVyaUluZm8oKSB7CisgICAgICAgIHJldHVybiB1cmlJbmZvOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBtZSB0aGUgYWN0dWFsIHJlcXVlc3QgdGVzdCBoZWFkZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFjdHVhbCByZXF1ZXN0IFVSSSBpbmZvLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGVzdEhlYWRlcigpIHsKKyAgICAgICAgcmV0dXJuIHRlc3RIZWFkZXI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpbW9kdWxlL2xpYi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvYmVhbnMueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpbW9kdWxlL2xpYi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvYmVhbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNDZkNjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktbXVsdGltb2R1bGUvbGliL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9iZWFucy54bWwKQEAgLTAsMCArMSwyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8YmVhbnMvPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpbW9kdWxlL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktbXVsdGltb2R1bGUvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDNmOTcyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpbW9kdWxlL3BvbS54bWwKQEAgLTAsMCArMSw0MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmNkaS1tdWx0aW1vZHVsZTwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1jZGktbXVsdGltb2R1bGU8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIENESSBNdWx0aS1Nb2R1bGUKKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPG1vZHVsZXM+CisgICAgICAgIDxtb2R1bGU+ZWFyPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+bGliPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+d2FyMTwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPndhcjI8L21vZHVsZT4KKyAgICA8L21vZHVsZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktbXVsdGltb2R1bGUvd2FyMS9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpbW9kdWxlL3dhcjEvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzljZWE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpbW9kdWxlL3dhcjEvcG9tLnhtbApAQCAtMCwwICsxLDExMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi8uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5jZGktbXVsdGltb2R1bGUtd2FyMTwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1jZGktbXVsdGltb2R1bGUtd2FyPC9uYW1lPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC53cy5yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LndzLnJzLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguc2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4zLjEuMDwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD4ke3Byb2plY3QuZ3JvdXBJZH08L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jZGktbXVsdGltb2R1bGUtbGliPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVudGVycHJpc2U8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jZGktYXBpPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgICAgIDxleGNsdXNpb25zPgorICAgICAgICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5oYW1jcmVzdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGFtY3Jlc3QtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5oYW1jcmVzdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmhhbWNyZXN0LWxpYnJhcnk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPGZpbmFsTmFtZT4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2ZpbmFsTmFtZT4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi13YXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8ZmFpbE9uTWlzc2luZ1dlYlhtbD5mYWxzZTwvZmFpbE9uTWlzc2luZ1dlYlhtbD4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c2tpcFRlc3RzPiR7c2tpcFRlc3RzfTwvc2tpcFRlc3RzPgorICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5mYWN0b3J5PiR7dGVzdENvbnRhaW5lckZhY3Rvcnl9PC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0PiR7dGVzdENvbnRhaW5lclBvcnR9PC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+CisgICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1pbnN0YWxsLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHNraXA+ZmFsc2U8L3NraXA+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxmYWlsT25NaXNzaW5nV2ViWG1sPmZhbHNlPC9mYWlsT25NaXNzaW5nV2ViWG1sPgorICAgICAgICA8c2tpcFRlc3RzPnRydWU8L3NraXBUZXN0cz4KKyAgICAgICAgPHRlc3RDb250YWluZXJGYWN0b3J5Pm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTwvdGVzdENvbnRhaW5lckZhY3Rvcnk+CisgICAgICAgIDx0ZXN0Q29udGFpbmVyUG9ydD44MDgwPC90ZXN0Q29udGFpbmVyUG9ydD4KKyAgICA8L3Byb3BlcnRpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktbXVsdGltb2R1bGUvd2FyMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2NkaS93ZWIxL0FwcFNjb3BlZEpheFJzUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aW1vZHVsZS93YXIxL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvY2RpL3dlYjEvQXBwU2NvcGVkSmF4UnNSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMWE2OWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktbXVsdGltb2R1bGUvd2FyMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2NkaS93ZWIxL0FwcFNjb3BlZEpheFJzUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLm11bHRpbW9kdWxlLmNkaS53ZWIxOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LkFwcGxpY2F0aW9uU2NvcGVkOworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5tdWx0aW1vZHVsZS5jZGkubGliLkpheFJzSW5qZWN0ZWREZXBlbmRlbnRCZWFuOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLm11bHRpbW9kdWxlLmNkaS5saWIuSmF4UnNJbmplY3RlZFJlcXVlc3RTY29wZWRCZWFuOworCisvKioKKyAqIEpBWC1SUyByZXNvdXJjZSBiYWNrZWQgYnkgYW4gYXBwbGljYXRpb24gc2NvcGVkIENESSBiZWFuLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgICovCitAUGF0aCgiYXBwLXNjb3BlZCIpCitAQXBwbGljYXRpb25TY29wZWQKK3B1YmxpYyBjbGFzcyBBcHBTY29wZWRKYXhSc1Jlc291cmNlIHsKKworICAgIEBJbmplY3QKKyAgICBKYXhSc0luamVjdGVkUmVxdWVzdFNjb3BlZEJlYW4gcmVxU2NvcGVkQmVhbjsKKworICAgIEBQYXRoKCJyZXEvaGVhZGVyIikKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBnZXRSZXFIZWFkZXIoKSB7CisgICAgICAgIHJldHVybiByZXFTY29wZWRCZWFuLmdldFRlc3RIZWFkZXIoKTsKKyAgICB9CisKKyAgICBAUGF0aCgicmVxL3VyaS97cH0iKQorICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlcVVyaSgpIHsKKyAgICAgICAgcmV0dXJuIHJlcVNjb3BlZEJlYW4uZ2V0VXJpSW5mbygpLmdldFJlcXVlc3RVcmkoKS50b1N0cmluZygpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpbW9kdWxlL3dhcjEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9jZGkvd2ViMS9KYXhSc0FwcC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpbW9kdWxlL3dhcjEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9jZGkvd2ViMS9KYXhSc0FwcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YjY0ZGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktbXVsdGltb2R1bGUvd2FyMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2NkaS93ZWIxL0pheFJzQXBwLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5tdWx0aW1vZHVsZS5jZGkud2ViMTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworLyoqCisgKiBKQVgtUlMgYXBwbGljYXRpb24gcmVzb3VyY2UgY29uZmlndXJhdGlvbi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAQXBwbGljYXRpb25QYXRoKCIvIikKK3B1YmxpYyBjbGFzcyBKYXhSc0FwcCBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgIHJldHVybiBuZXcgSGFzaFNldDxDbGFzczw/Pj4oKSB7eworICAgICAgICAgICAgYWRkKFJlcXVlc3RTY29wZWRKYXhSc1Jlc291cmNlLmNsYXNzKTsKKyAgICAgICAgICAgIGFkZChBcHBTY29wZWRKYXhSc1Jlc291cmNlLmNsYXNzKTsKKyAgICAgICAgfX07CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpbW9kdWxlL3dhcjEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9jZGkvd2ViMS9SZXF1ZXN0U2NvcGVkSmF4UnNSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpbW9kdWxlL3dhcjEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9jZGkvd2ViMS9SZXF1ZXN0U2NvcGVkSmF4UnNSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMGZmM2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktbXVsdGltb2R1bGUvd2FyMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2NkaS93ZWIxL1JlcXVlc3RTY29wZWRKYXhSc1Jlc291cmNlLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5tdWx0aW1vZHVsZS5jZGkud2ViMTsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5SZXF1ZXN0U2NvcGVkOworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5tdWx0aW1vZHVsZS5jZGkubGliLkpheFJzSW5qZWN0ZWREZXBlbmRlbnRCZWFuOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLm11bHRpbW9kdWxlLmNkaS5saWIuSmF4UnNJbmplY3RlZFJlcXVlc3RTY29wZWRCZWFuOworCisvKioKKyAqIEpBWC1SUyByZXNvdXJjZSBiYWNrZWQgYnkgYSByZXF1ZXN0IHNjb3BlZCBDREkgYmVhbi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICAqLworQFBhdGgoInJlcXVlc3Qtc2NvcGVkIikKK0BSZXF1ZXN0U2NvcGVkCitwdWJsaWMgY2xhc3MgUmVxdWVzdFNjb3BlZEpheFJzUmVzb3VyY2UgeworCisgICAgQEluamVjdAorICAgIEpheFJzSW5qZWN0ZWREZXBlbmRlbnRCZWFuIGRlcGVuZGVudEJlYW47CisKKyAgICBASW5qZWN0CisgICAgSmF4UnNJbmplY3RlZFJlcXVlc3RTY29wZWRCZWFuIHJlcVNjb3BlZEJlYW47CisKKyAgICBAUGF0aCgicmVxL2hlYWRlciIpCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxSGVhZGVyKCkgeworICAgICAgICByZXR1cm4gcmVxU2NvcGVkQmVhbi5nZXRUZXN0SGVhZGVyKCk7CisgICAgfQorCisgICAgQFBhdGgoImRlcGVuZGVudC9oZWFkZXIiKQorICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlcGVuZGVudEhlYWRlcigpIHsKKyAgICAgICAgcmV0dXJuIGRlcGVuZGVudEJlYW4uZ2V0VGVzdEhlYWRlcigpOworICAgIH0KKworICAgIEBQYXRoKCJyZXEvdXJpL3twfSIpCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxVXJpKCkgeworICAgICAgICByZXR1cm4gcmVxU2NvcGVkQmVhbi5nZXRVcmlJbmZvKCkuZ2V0UmVxdWVzdFVyaSgpLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgQFBhdGgoImRlcGVuZGVudC91cmkve3B9IikKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBnZXRBcHBVcmkoKSB7CisgICAgICAgIHJldHVybiBkZXBlbmRlbnRCZWFuLmdldFVyaUluZm8oKS5nZXRSZXF1ZXN0VXJpKCkudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktbXVsdGltb2R1bGUvd2FyMS9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpbW9kdWxlL3dhcjEvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWMwMmU1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpbW9kdWxlL3dhcjEvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcApAQCAtMCwwICsxLDMxIEBACis8JS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLSU+CisKKzwlQHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbCIgcGFnZUVuY29kaW5nPSJVVEYtOCIlPgorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKKyAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorCis8aHRtbD4KKyAgICA8aGVhZD4KKyAgICAgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgorICAgICAgICA8dGl0bGU+SlNQIFBhZ2U8L3RpdGxlPgorICAgIDwvaGVhZD4KKyAgICA8Ym9keT4KKyAgICAgICAgPGgxPkhlbGxvIFdvcmxkITwvaDE+CisgICAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpbW9kdWxlL3dhcjEvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9jZGkvd2ViMS9KYXhSc0NkaUludGVncmF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpbW9kdWxlL3dhcjEvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9jZGkvd2ViMS9KYXhSc0NkaUludGVncmF0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyY2YyOTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktbXVsdGltb2R1bGUvd2FyMS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2NkaS93ZWIxL0pheFJzQ2RpSW50ZWdyYXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24ubXVsdGltb2R1bGUuY2RpLndlYjE7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogVGVzdCBmb3IgQ0RJIHdlYiBhcHBsaWNhdGlvbiByZXNvdXJjZXMuIFRoZSBKQVgtUlMgcmVzb3VyY2VzIHVzZSBDREkgY29tcG9uZW50cyBmcm9tIGEgbGlicmFyeSBqYXIuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEpheFJzQ2RpSW50ZWdyYXRpb25UZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IEpheFJzQXBwKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFVSSSBnZXRCYXNlVXJpKCkgeworICAgICAgICByZXR1cm4gVXJpQnVpbGRlci5mcm9tVXJpKHN1cGVyLmdldEJhc2VVcmkoKSkucGF0aCgiY2RpLW11bHRpbW9kdWxlLXdhcjEiKS5idWlsZCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChmaW5hbCBDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXJpSW5mb0luamVjdGlvblJlcVNjb3BlZFJlc291cmNlRGVwZW5kZW50QmVhbigpIHsKKyAgICAgICAgX3Rlc3RSZXNvdXJjZSgicmVxdWVzdC1zY29wZWQvZGVwZW5kZW50Iik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXJpSW5mb0luamVjdGlvblJlcVNjb3BlZFJlc291cmNlUmVxdWVzdFNjb3BlZEJlYW4oKSB7CisgICAgICAgIF90ZXN0UmVzb3VyY2UoInJlcXVlc3Qtc2NvcGVkL3JlcSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVyaUluZm9JbmplY3Rpb25BcHBTY29wZWRSZXNvdXJjZVJlcXVlc3RTY29wZWRCZWFuKCkgeworICAgICAgICBfdGVzdFJlc291cmNlKCJhcHAtc2NvcGVkL3JlcSIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfdGVzdFJlc291cmNlKFN0cmluZyByZXNvdXJjZVBhdGgpIHsKKyAgICAgICAgX3Rlc3RVcmlJbmZvKHJlc291cmNlUGF0aCk7CisgICAgICAgIF90ZXN0SGVhZGVyKHJlc291cmNlUGF0aCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0VXJpSW5mbyhTdHJpbmcgcmVzb3VyY2VQYXRoKSB7CisKKyAgICAgICAgX3Rlc3RTaW5nbGVQYXRoVXJpVW5mbyhyZXNvdXJjZVBhdGgsICJvbmUiKTsKKyAgICAgICAgX3Rlc3RTaW5nbGVQYXRoVXJpVW5mbyhyZXNvdXJjZVBhdGgsICJ0d28iKTsKKyAgICAgICAgX3Rlc3RTaW5nbGVQYXRoVXJpVW5mbyhyZXNvdXJjZVBhdGgsICJ0aHJlZSIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfdGVzdFNpbmdsZVBhdGhVcmlVbmZvKGZpbmFsIFN0cmluZyByZXNvdXJjZVBhdGgsIGZpbmFsIFN0cmluZyBwYXRoUGFyYW0pIHsKKworICAgICAgICBmaW5hbCBVUkkgYmFzZVVyaSA9IGdldEJhc2VVcmkoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkUmVzdWx0ID0gYmFzZVVyaS5yZXNvbHZlKHJlc291cmNlUGF0aCArICIvdXJpLyIgKyBwYXRoUGFyYW0pLnRvU3RyaW5nKCk7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKHJlc291cmNlUGF0aCkucGF0aCgidXJpIikucGF0aChwYXRoUGFyYW0pLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKGV4cGVjdGVkUmVzdWx0KSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0SGVhZGVyKGZpbmFsIFN0cmluZyByZXNvdXJjZVBhdGgpIHsKKworICAgICAgICBfdGVzdFNpbmdsZUhlYWRlcihyZXNvdXJjZVBhdGgsICJvbmUiKTsKKyAgICAgICAgX3Rlc3RTaW5nbGVIZWFkZXIocmVzb3VyY2VQYXRoLCAidHdvIik7CisgICAgICAgIF90ZXN0U2luZ2xlSGVhZGVyKHJlc291cmNlUGF0aCwgInRocmVlIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0U2luZ2xlSGVhZGVyKGZpbmFsIFN0cmluZyByZXNvdXJjZVBhdGgsIGZpbmFsIFN0cmluZyBoZWFkZXJWYWx1ZSkgeworCisgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZFJlc3VsdCA9IGhlYWRlclZhbHVlOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aChyZXNvdXJjZVBhdGgpLnBhdGgoImhlYWRlciIpLnJlcXVlc3QoKS5oZWFkZXIoIngtdGVzdCIsIGhlYWRlclZhbHVlKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKGV4cGVjdGVkUmVzdWx0KSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpbW9kdWxlL3dhcjIvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aW1vZHVsZS93YXIyL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM0MzUyYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aW1vZHVsZS93YXIyL3BvbS54bWwKQEAgLTAsMCArMSwxMDUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+Y2RpLW11bHRpbW9kdWxlLXdhcjI8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tY2RpLW11bHRpbW9kdWxlLXdhcjI8L25hbWU+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LndzLnJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXgud3MucnMtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPiR7cHJvamVjdC5ncm91cElkfTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmNkaS1tdWx0aW1vZHVsZS1saWI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguZW50ZXJwcmlzZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmNkaS1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItYnVuZGxlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHR5cGU+cG9tPC90eXBlPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmhhbWNyZXN0PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5oYW1jcmVzdC1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICAgICAgPC9leGNsdXNpb25zPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmhhbWNyZXN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGFtY3Jlc3QtbGlicmFyeTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8ZmluYWxOYW1lPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvZmluYWxOYW1lPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXdhci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxmYWlsT25NaXNzaW5nV2ViWG1sPmZhbHNlPC9mYWlsT25NaXNzaW5nV2ViWG1sPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxza2lwVGVzdHM+JHtza2lwVGVzdHN9PC9za2lwVGVzdHM+CisgICAgICAgICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk+JHt0ZXN0Q29udGFpbmVyRmFjdG9yeX08L2plcnNleS5jb25maWcudGVzdC5jb250YWluZXIuZmFjdG9yeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+JHt0ZXN0Q29udGFpbmVyUG9ydH08L2plcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydD4KKyAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWluc3RhbGwtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c2tpcD5mYWxzZTwvc2tpcD4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPGZhaWxPbk1pc3NpbmdXZWJYbWw+ZmFsc2U8L2ZhaWxPbk1pc3NpbmdXZWJYbWw+CisgICAgICAgIDxza2lwVGVzdHM+dHJ1ZTwvc2tpcFRlc3RzPgorICAgICAgICA8dGVzdENvbnRhaW5lckZhY3Rvcnk+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5PC90ZXN0Q29udGFpbmVyRmFjdG9yeT4KKyAgICAgICAgPHRlc3RDb250YWluZXJQb3J0PjgwODA8L3Rlc3RDb250YWluZXJQb3J0PgorICAgIDwvcHJvcGVydGllcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aW1vZHVsZS93YXIyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvY2RpL3dlYjIvSmF4UnNBcHBPbmUuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aW1vZHVsZS93YXIyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvY2RpL3dlYjIvSmF4UnNBcHBPbmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWQ1Y2IzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpbW9kdWxlL3dhcjIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9jZGkvd2ViMi9KYXhSc0FwcE9uZS5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24ubXVsdGltb2R1bGUuY2RpLndlYjI7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKKy8qKgorICogRmlyc3QgSkFYLVJTIGFwcGxpY2F0aW9uIHJlc291cmNlIGNvbmZpZ3VyYXRpb24uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uUGF0aCgib25lIikKK3B1YmxpYyBjbGFzcyBKYXhSc0FwcE9uZSBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgIHJldHVybiBuZXcgSGFzaFNldDxDbGFzczw/Pj4oKSB7eworICAgICAgICAgICAgYWRkKFNoYXJlZFJlcXVlc3RTY29wZWRKYXhSc1Jlc291cmNlLmNsYXNzKTsKKyAgICAgICAgICAgIGFkZChTaGFyZWRBcHBTY29wZWRKYXhSc1Jlc291cmNlLmNsYXNzKTsKKyAgICAgICAgfX07CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktbXVsdGltb2R1bGUvd2FyMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2NkaS93ZWIyL0pheFJzQXBwVHdvLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktbXVsdGltb2R1bGUvd2FyMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2NkaS93ZWIyL0pheFJzQXBwVHdvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRiZTc3MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aW1vZHVsZS93YXIyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvY2RpL3dlYjIvSmF4UnNBcHBUd28uamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLm11bHRpbW9kdWxlLmNkaS53ZWIyOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCisvKioKKyAqIFNlY29uZCBKQVgtUlMgYXBwbGljYXRpb24gcmVzb3VyY2UgY29uZmlndXJhdGlvbi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAQXBwbGljYXRpb25QYXRoKCJ0d28iKQorcHVibGljIGNsYXNzIEpheFJzQXBwVHdvIGV4dGVuZHMgQXBwbGljYXRpb24geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBIYXNoU2V0PENsYXNzPD8+PigpIHt7CisgICAgICAgICAgICBhZGQoU2hhcmVkUmVxdWVzdFNjb3BlZEpheFJzUmVzb3VyY2UuY2xhc3MpOworICAgICAgICAgICAgYWRkKFNoYXJlZEFwcFNjb3BlZEpheFJzUmVzb3VyY2UuY2xhc3MpOworICAgICAgICB9fTsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aW1vZHVsZS93YXIyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvY2RpL3dlYjIvU2hhcmVkQXBwU2NvcGVkSmF4UnNSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpbW9kdWxlL3dhcjIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9jZGkvd2ViMi9TaGFyZWRBcHBTY29wZWRKYXhSc1Jlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE3MjJiNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aW1vZHVsZS93YXIyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvY2RpL3dlYjIvU2hhcmVkQXBwU2NvcGVkSmF4UnNSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24ubXVsdGltb2R1bGUuY2RpLndlYjI7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuQXBwbGljYXRpb25TY29wZWQ7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLm11bHRpbW9kdWxlLmNkaS5saWIuSmF4UnNJbmplY3RlZERlcGVuZGVudEJlYW47CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24ubXVsdGltb2R1bGUuY2RpLmxpYi5KYXhSc0luamVjdGVkUmVxdWVzdFNjb3BlZEJlYW47CisKKy8qKgorICogSkFYLVJTIHJlc291cmNlIGJhY2tlZCBieSBhbiBhcHBsaWNhdGlvbiBzY29wZWQgQ0RJIGJlYW4uCisgKiBUaGlzIG9uZSBpcyBiZWluZyBzaGFyZWQgYmV0d2VlbiB0aGUgdHdvIEpBWC1SUyBhcHBzCisgKiB7QGxpbmsgSmF4UnNBcHBPbmV9IGFuZCB7QGxpbmsgSmF4UnNBcHBUd299LgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJhcHAtc2NvcGVkIikKK0BBcHBsaWNhdGlvblNjb3BlZAorcHVibGljIGNsYXNzIFNoYXJlZEFwcFNjb3BlZEpheFJzUmVzb3VyY2UgeworCisgICAgQEluamVjdAorICAgIEpheFJzSW5qZWN0ZWREZXBlbmRlbnRCZWFuIGRlcGVuZGVudEJlYW47CisKKyAgICBASW5qZWN0CisgICAgSmF4UnNJbmplY3RlZFJlcXVlc3RTY29wZWRCZWFuIHJlcVNjb3BlZEJlYW47CisKKyAgICBAUGF0aCgicmVxL2hlYWRlciIpCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxSGVhZGVyKCkgeworICAgICAgICByZXR1cm4gcmVxU2NvcGVkQmVhbi5nZXRUZXN0SGVhZGVyKCk7CisgICAgfQorCisgICAgQFBhdGgoImRlcGVuZGVudC9oZWFkZXIiKQorICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlcGVuZGVudEhlYWRlcigpIHsKKyAgICAgICAgcmV0dXJuIGRlcGVuZGVudEJlYW4uZ2V0VGVzdEhlYWRlcigpOworICAgIH0KKworICAgIEBQYXRoKCJyZXEvdXJpL3twfSIpCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxVXJpKCkgeworICAgICAgICByZXR1cm4gcmVxU2NvcGVkQmVhbi5nZXRVcmlJbmZvKCkuZ2V0UmVxdWVzdFVyaSgpLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgQFBhdGgoImRlcGVuZGVudC91cmkve3B9IikKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBnZXRBcHBVcmkoKSB7CisgICAgICAgIHJldHVybiBkZXBlbmRlbnRCZWFuLmdldFVyaUluZm8oKS5nZXRSZXF1ZXN0VXJpKCkudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktbXVsdGltb2R1bGUvd2FyMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2NkaS93ZWIyL1NoYXJlZFJlcXVlc3RTY29wZWRKYXhSc1Jlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktbXVsdGltb2R1bGUvd2FyMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2NkaS93ZWIyL1NoYXJlZFJlcXVlc3RTY29wZWRKYXhSc1Jlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc2ZWU3ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aW1vZHVsZS93YXIyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvY2RpL3dlYjIvU2hhcmVkUmVxdWVzdFNjb3BlZEpheFJzUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLm11bHRpbW9kdWxlLmNkaS53ZWIyOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LlJlcXVlc3RTY29wZWQ7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLm11bHRpbW9kdWxlLmNkaS5saWIuSmF4UnNJbmplY3RlZERlcGVuZGVudEJlYW47CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24ubXVsdGltb2R1bGUuY2RpLmxpYi5KYXhSc0luamVjdGVkUmVxdWVzdFNjb3BlZEJlYW47CisKKy8qKgorICogSkFYLVJTIHJlc291cmNlIGJhY2tlZCBieSBhIHJlcXVlc3Qgc2NvcGVkIENESSBiZWFuLgorICogVGhpcyBvbmUgaXMgYmVpbmcgc2hhcmVkIGJldHdlZW4gdGhlIHR3byBKQVgtUlMgYXBwcworICoge0BsaW5rIEpheFJzQXBwT25lfSBhbmQge0BsaW5rIEpheFJzQXBwVHdvfS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICAqLworQFBhdGgoInJlcXVlc3Qtc2NvcGVkIikKK0BSZXF1ZXN0U2NvcGVkCitwdWJsaWMgY2xhc3MgU2hhcmVkUmVxdWVzdFNjb3BlZEpheFJzUmVzb3VyY2UgeworCisgICAgQEluamVjdAorICAgIEpheFJzSW5qZWN0ZWREZXBlbmRlbnRCZWFuIGRlcGVuZGVudEJlYW47CisKKyAgICBASW5qZWN0CisgICAgSmF4UnNJbmplY3RlZFJlcXVlc3RTY29wZWRCZWFuIHJlcVNjb3BlZEJlYW47CisKKyAgICBAUGF0aCgicmVxL2hlYWRlciIpCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxSGVhZGVyKCkgeworICAgICAgICByZXR1cm4gcmVxU2NvcGVkQmVhbi5nZXRUZXN0SGVhZGVyKCk7CisgICAgfQorCisgICAgQFBhdGgoImRlcGVuZGVudC9oZWFkZXIiKQorICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdldERlcGVuZGVudEhlYWRlcigpIHsKKyAgICAgICAgcmV0dXJuIGRlcGVuZGVudEJlYW4uZ2V0VGVzdEhlYWRlcigpOworICAgIH0KKworICAgIEBQYXRoKCJyZXEvdXJpL3twfSIpCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxVXJpKCkgeworICAgICAgICByZXR1cm4gcmVxU2NvcGVkQmVhbi5nZXRVcmlJbmZvKCkuZ2V0UmVxdWVzdFVyaSgpLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgQFBhdGgoImRlcGVuZGVudC91cmkve3B9IikKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBnZXRBcHBVcmkoKSB7CisgICAgICAgIHJldHVybiBkZXBlbmRlbnRCZWFuLmdldFVyaUluZm8oKS5nZXRSZXF1ZXN0VXJpKCkudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktbXVsdGltb2R1bGUvd2FyMi9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpbW9kdWxlL3dhcjIvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWMwMmU1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpbW9kdWxlL3dhcjIvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcApAQCAtMCwwICsxLDMxIEBACis8JS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLSU+CisKKzwlQHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbCIgcGFnZUVuY29kaW5nPSJVVEYtOCIlPgorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKKyAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorCis8aHRtbD4KKyAgICA8aGVhZD4KKyAgICAgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgorICAgICAgICA8dGl0bGU+SlNQIFBhZ2U8L3RpdGxlPgorICAgIDwvaGVhZD4KKyAgICA8Ym9keT4KKyAgICAgICAgPGgxPkhlbGxvIFdvcmxkITwvaDE+CisgICAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpbW9kdWxlL3dhcjIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9jZGkvd2ViMi9KYXhSc0NkaUludGVncmF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpbW9kdWxlL3dhcjIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9jZGkvd2ViMi9KYXhSc0NkaUludGVncmF0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzM2Y5NTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktbXVsdGltb2R1bGUvd2FyMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2NkaS93ZWIyL0pheFJzQ2RpSW50ZWdyYXRpb25UZXN0LmphdmEKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24ubXVsdGltb2R1bGUuY2RpLndlYjI7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogVGVzdCBmb3IgQ0RJIHdlYiBhcHBsaWNhdGlvbiByZXNvdXJjZXMuIFRoZSBKQVgtUlMgcmVzb3VyY2VzIHVzZSBDREkgY29tcG9uZW50cyBmcm9tIGEgbGlicmFyeSBqYXIuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEpheFJzQ2RpSW50ZWdyYXRpb25UZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IEpheFJzQXBwT25lKCk7CisgICAgfQorCisvLyAgICBAT3ZlcnJpZGUKKy8vICAgIHByb3RlY3RlZCBVUkkgZ2V0QmFzZVVyaSgpIHsKKy8vICAgICAgICByZXR1cm4gVXJpQnVpbGRlci5mcm9tVXJpKHN1cGVyLmdldEJhc2VVcmkoKSkucGF0aCgiY2RpLW11bHRpbW9kdWxlLXdhcjEiKS5idWlsZCgpOworLy8gICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KGZpbmFsIENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKExvZ2dpbmdGZWF0dXJlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVcmlJbmZvSW5qZWN0aW9uUmVxU2NvcGVkUmVzb3VyY2VEZXBlbmRlbnRCZWFuKCkgeworCisgICAgICAgIF90ZXN0UmVzb3VyY2UoImNkaS1tdWx0aW1vZHVsZS13YXIyL29uZS9yZXF1ZXN0LXNjb3BlZC9kZXBlbmRlbnQiKTsKKyAgICAgICAgX3Rlc3RSZXNvdXJjZSgiY2RpLW11bHRpbW9kdWxlLXdhcjIvdHdvL3JlcXVlc3Qtc2NvcGVkL2RlcGVuZGVudCIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVyaUluZm9JbmplY3Rpb25SZXFTY29wZWRSZXNvdXJjZVJlcXVlc3RTY29wZWRCZWFuKCkgeworCisgICAgICAgIF90ZXN0UmVzb3VyY2UoImNkaS1tdWx0aW1vZHVsZS13YXIyL29uZS9yZXF1ZXN0LXNjb3BlZC9yZXEiKTsKKyAgICAgICAgX3Rlc3RSZXNvdXJjZSgiY2RpLW11bHRpbW9kdWxlLXdhcjIvdHdvL3JlcXVlc3Qtc2NvcGVkL3JlcSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVyaUluZm9JbmplY3Rpb25BcHBTY29wZWRSZXNvdXJjZVJlcXVlc3RTY29wZWRCZWFuKCkgeworCisgICAgICAgIF90ZXN0UmVzb3VyY2UoImNkaS1tdWx0aW1vZHVsZS13YXIyL29uZS9hcHAtc2NvcGVkL3JlcSIpOworICAgICAgICBfdGVzdFJlc291cmNlKCJjZGktbXVsdGltb2R1bGUtd2FyMi90d28vYXBwLXNjb3BlZC9yZXEiKTsKKyAgICB9CisKKyAgICBASWdub3JlKCJ1bnRpbCBKRVJTRVktMjkxNCBnZXRzIHJlc29sdmVkIikKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVcmlJbmZvSW5qZWN0aW9uQXBwU2NvcGVkUmVzb3VyY2VEZXBlbmRlbnRCZWFuKCkgeworCisgICAgICAgIF90ZXN0UmVzb3VyY2UoImNkaS1tdWx0aW1vZHVsZS13YXIyL29uZS9hcHAtc2NvcGVkL2RlcGVuZGVudCIpOworICAgICAgICBfdGVzdFJlc291cmNlKCJjZGktbXVsdGltb2R1bGUtd2FyMi90d28vYXBwLXNjb3BlZC9kZXBlbmRlbnQiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3RSZXNvdXJjZShTdHJpbmcgcmVzb3VyY2VQYXRoKSB7CisgICAgICAgIF90ZXN0VXJpSW5mbyhyZXNvdXJjZVBhdGgpOworICAgICAgICBfdGVzdEhlYWRlcihyZXNvdXJjZVBhdGgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfdGVzdFVyaUluZm8oU3RyaW5nIHJlc291cmNlUGF0aCkgeworCisgICAgICAgIF90ZXN0U2luZ2xlUGF0aFVyaVVuZm8ocmVzb3VyY2VQYXRoLCAib25lIik7CisgICAgICAgIF90ZXN0U2luZ2xlUGF0aFVyaVVuZm8ocmVzb3VyY2VQYXRoLCAidHdvIik7CisgICAgICAgIF90ZXN0U2luZ2xlUGF0aFVyaVVuZm8ocmVzb3VyY2VQYXRoLCAidGhyZWUiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3RTaW5nbGVQYXRoVXJpVW5mbyhmaW5hbCBTdHJpbmcgcmVzb3VyY2VQYXRoLCBmaW5hbCBTdHJpbmcgcGF0aFBhcmFtKSB7CisKKyAgICAgICAgZmluYWwgVVJJIGJhc2VVcmkgPSBnZXRCYXNlVXJpKCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZFJlc3VsdCA9IGJhc2VVcmkucmVzb2x2ZShyZXNvdXJjZVBhdGggKyAiL3VyaS8iICsgcGF0aFBhcmFtKS50b1N0cmluZygpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aChyZXNvdXJjZVBhdGgpLnBhdGgoInVyaSIpLnBhdGgocGF0aFBhcmFtKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbyhleHBlY3RlZFJlc3VsdCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfdGVzdEhlYWRlcihmaW5hbCBTdHJpbmcgcmVzb3VyY2VQYXRoKSB7CisKKyAgICAgICAgX3Rlc3RTaW5nbGVIZWFkZXIocmVzb3VyY2VQYXRoLCAib25lIik7CisgICAgICAgIF90ZXN0U2luZ2xlSGVhZGVyKHJlc291cmNlUGF0aCwgInR3byIpOworICAgICAgICBfdGVzdFNpbmdsZUhlYWRlcihyZXNvdXJjZVBhdGgsICJ0aHJlZSIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfdGVzdFNpbmdsZUhlYWRlcihmaW5hbCBTdHJpbmcgcmVzb3VyY2VQYXRoLCBmaW5hbCBTdHJpbmcgaGVhZGVyVmFsdWUpIHsKKworICAgICAgICBmaW5hbCBTdHJpbmcgZXhwZWN0ZWRSZXN1bHQgPSBoZWFkZXJWYWx1ZTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgocmVzb3VyY2VQYXRoKS5wYXRoKCJoZWFkZXIiKS5yZXF1ZXN0KCkuaGVhZGVyKCJ4LXRlc3QiLCBoZWFkZXJWYWx1ZSkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbyhleHBlY3RlZFJlc3VsdCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aXBhcnQtd2ViYXBwL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktbXVsdGlwYXJ0LXdlYmFwcC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZjBiZjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktbXVsdGlwYXJ0LXdlYmFwcC9wb20ueG1sCkBAIC0wLDAgKzEsODIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+Y2RpLW11bHRpcGFydC13ZWJhcHA8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtY2RpLW11bHRpcGFydC13ZWJhcHA8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+SmVyc2V5IENESSB0ZXN0IHdlYiBhcHBsaWNhdGlvbiB0aGF0IHVzZXMgbXVsdGlwYXJ0IGZlYXR1cmU8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC53cy5yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LndzLnJzLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5hbm5vdGF0aW9uPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguYW5ub3RhdGlvbi1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguZW50ZXJwcmlzZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmNkaS1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtbXVsdGlwYXJ0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1idW5kbGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dHlwZT5wb208L3R5cGU+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKyAgICA8YnVpbGQ+CisgICAgICAgIDxmaW5hbE5hbWU+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9maW5hbE5hbWU+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxza2lwVGVzdHM+JHtza2lwVGVzdHN9PC9za2lwVGVzdHM+CisgICAgICAgICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk+JHt0ZXN0Q29udGFpbmVyRmFjdG9yeX08L2plcnNleS5jb25maWcudGVzdC5jb250YWluZXIuZmFjdG9yeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+JHt0ZXN0Q29udGFpbmVyUG9ydH08L2plcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydD4KKyAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxza2lwVGVzdHM+dHJ1ZTwvc2tpcFRlc3RzPgorICAgICAgICA8dGVzdENvbnRhaW5lckZhY3Rvcnk+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5PC90ZXN0Q29udGFpbmVyRmFjdG9yeT4KKyAgICAgICAgPHRlc3RDb250YWluZXJQb3J0PjgwODA8L3Rlc3RDb250YWluZXJQb3J0PgorICAgIDwvcHJvcGVydGllcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aXBhcnQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9FY2hvUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aXBhcnQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9FY2hvUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjRhMjYzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpcGFydC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0VjaG9SZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5SZXF1ZXN0U2NvcGVkOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5Gb3JtRGF0YVBhcmFtOworCisKKy8qKgorICogR0YtMjEwMzMgcmVwcm9kdWNlci4gSnVzdCBhIHJlc291cmNlIHVzaW5nIG11bHRpLXBhcnQgc3VwcG9ydC4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiL2VjaG8iKQorQFJlcXVlc3RTY29wZWQKK3B1YmxpYyBjbGFzcyBFY2hvUmVzb3VyY2UgeworCisgICAgLyoqCisgICAgICogV2Ugd2FudCB0byBjb25zdW1lIGZvcm0gZGF0YSB1c2luZyBtdWx0aS1wYXJ0IHByb3ZpZGVyLgorICAgICAqCisgICAgICogQHBhcmFtIGlucHV0IGZvcm0gZGF0YQorICAgICAqIEByZXR1cm4gaW5wdXQgZGF0YQorICAgICAqLworICAgIEBQT1NUCisgICAgcHVibGljIFJlc3BvbnNlIGVjaG9NdWx0aXBhcnQoQEZvcm1EYXRhUGFyYW0gKCJpbnB1dCIpIFN0cmluZyBpbnB1dCkgeworICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soaW5wdXQpLmJ1aWxkKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpcGFydC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL015QXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aXBhcnQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9NeUFwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTczMDc1NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS1tdWx0aXBhcnQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9NeUFwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0Lk11bHRpUGFydEZlYXR1cmU7CisKKy8qKgorICogR0YtMjEwMzMgcmVwcm9kdWNlci4gVGhpcyBpcyB0byBtYWtlIHN1cmUgSmVyc2V5J3MgbXVsdGlwYXJ0CisgKiBmZWF0dXJlIGNvdWxkIHdvcmsgaW4gR0Ygd2l0aCBDREkuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uUGF0aCgiLyoiKQorcHVibGljIGNsYXNzIE15QXBwbGljYXRpb24gZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKyAgICBzdGF0aWMgZmluYWwgU2V0PENsYXNzPD8+PiBjbGFzc2VzID0gbmV3IEhhc2hTZXQ8Q2xhc3M8Pz4+KCk7CisKKyAgICBzdGF0aWMgeworICAgICAgICBjbGFzc2VzLmFkZChFY2hvUmVzb3VyY2UuY2xhc3MpOworICAgICAgICBjbGFzc2VzLmFkZChNdWx0aVBhcnRGZWF0dXJlLmNsYXNzKTsKKyAgICB9CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgcmV0dXJuIGNsYXNzZXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpcGFydC13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvYmVhbnMueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpcGFydC13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvYmVhbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZjA1NDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktbXVsdGlwYXJ0LXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9iZWFucy54bWwKQEAgLTAsMCArMSwyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8YmVhbnMvPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpcGFydC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL011bHRpcGFydEZlYXR1cmVUZXN0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktbXVsdGlwYXJ0LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvTXVsdGlwYXJ0RmVhdHVyZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmIxMTg1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLW11bHRpcGFydC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL011bHRpcGFydEZlYXR1cmVUZXN0LmphdmEKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LkZvcm1EYXRhTXVsdGlQYXJ0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5NdWx0aVBhcnRGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogUGFydCBvZiBHRi0yMTAzMyByZXByb2R1Y2VyLiBNYWtlIHN1cmUgZm9ybSBkYXRhIHByb2Nlc3NlZCBieSB0aGUgSmVyc2V5IG11bHRpLXBhcnQKKyAqIGZlYXR1cmUgbWFrZSBpdCBmb3J0aCBhbmQgYmFjayBhbGwgcmlnaHQuCisgKgorICogPHAvPlJ1biB3aXRoOgorICogPHByZT4KKyAqIG12biBjbGVhbiBwYWNrYWdlCisgKiAkQVNfSE9NRS9iaW4vYXNhZG1pbiBkZXBsb3kgdGFyZ2V0L2NkaS10ZXN0LXdlYmFwcAorICogbXZuIC1Ec2tpcFRlc3RzPWZhbHNlIHRlc3Q8L3ByZT4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGNsYXNzIE11bHRpcGFydEZlYXR1cmVUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBmaW5hbCBTdHJpbmcgVGVzdEZvcm1EQVRBOworCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPYmplY3RbXT4gdGVzdERhdGEoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXVtdIHsKKyAgICAgICAgICAgICAgICB7Ik5vIG1hdHRlciB3aGF0In0sCisgICAgICAgICAgICAgICAgeyJZb3Ugc2hvdWxkIG5ldmVyIn0sCisgICAgICAgICAgICAgICAgeyJldmVyIn0sCisgICAgICAgICAgICAgICAgeyJqdXN0IGdpdmUgdXAifQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBwdWJsaWMgTXVsdGlwYXJ0RmVhdHVyZVRlc3QoU3RyaW5nIFRlc3RGb3JtREFUQSkgeworICAgICAgICB0aGlzLlRlc3RGb3JtREFUQSA9IFRlc3RGb3JtREFUQTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IE15QXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVVJJIGdldEJhc2VVcmkoKSB7CisgICAgICAgIHJldHVybiBVcmlCdWlsZGVyLmZyb21Vcmkoc3VwZXIuZ2V0QmFzZVVyaSgpKS5wYXRoKCJjZGktbXVsdGlwYXJ0LXdlYmFwcCIpLmJ1aWxkKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKE11bHRpUGFydEZlYXR1cmUuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc3RGb3JtRGF0YSgpIHsKKworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCkucGF0aCgiZWNobyIpOworCisgICAgICAgIEZvcm1EYXRhTXVsdGlQYXJ0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhTXVsdGlQYXJ0KCkuZmllbGQoImlucHV0IiwgVGVzdEZvcm1EQVRBKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KGZvcm1EYXRhLCBNZWRpYVR5cGUuTVVMVElQQVJUX0ZPUk1fREFUQV9UWVBFKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoVGVzdEZvcm1EQVRBKSk7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZGRiMGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvcG9tLnhtbApAQCAtMCwwICsxLDkyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmNkaS10ZXN0LXdlYmFwcDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1jZGktd2ViYXBwPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPkplcnNleSBDREkgdGVzdCB3ZWIgYXBwbGljYXRpb248L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC53cy5yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LndzLnJzLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5hbm5vdGF0aW9uPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguYW5ub3RhdGlvbi1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguZW50ZXJwcmlzZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmNkaS1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktd2VsZDItc2U8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPGZpbmFsTmFtZT4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2ZpbmFsTmFtZT4KKyAgICA8L2J1aWxkPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5ydW4tZXh0ZXJuYWwtdGVzdHM8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN5c3RlbVByb3BlcnR5VmFyaWFibGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5mYWN0b3J5PiR7ZXh0ZXJuYWwuY29udGFpbmVyLmZhY3Rvcnl9PC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+JHtleHRlcm5hbC5jb250YWluZXIucG9ydH08L2plcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N5c3RlbVByb3BlcnR5VmFyaWFibGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICAgICAgPHByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgPCEtLSBFeHRlcm5hbCB0ZXN0IGNvbnRhaW5lciBjb25maWd1cmF0aW9uIGlzIGRvbmUgdmlhIHByb3BlcnRpZXMgdG8gYWxsb3cgb3ZlcnJpZGluZyB2aWEgY29tbWFuZCBsaW5lLiAtLT4KKyAgICAgICAgICAgICAgICA8ZXh0ZXJuYWwuY29udGFpbmVyLmZhY3Rvcnk+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5PC9leHRlcm5hbC5jb250YWluZXIuZmFjdG9yeT4KKyAgICAgICAgICAgICAgICA8ZXh0ZXJuYWwuY29udGFpbmVyLnBvcnQ+ODA4MDwvZXh0ZXJuYWwuY29udGFpbmVyLnBvcnQ+CisgICAgICAgICAgICAgICAgPG1hdmVuLnRlc3Quc2tpcD5mYWxzZTwvbWF2ZW4udGVzdC5za2lwPgorICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQ29uc3RydWN0b3JJbmplY3RlZFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0NvbnN0cnVjdG9ySW5qZWN0ZWRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNmRmYjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0NvbnN0cnVjdG9ySW5qZWN0ZWRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5SZXF1ZXN0U2NvcGVkOworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5IZWFkZXJQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5NYXRyaXhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCisvKioKKyAqIEpFUlNFWS0yNTI2IHJlcHJvZHVjZXIuIENESSBtYW5hZ2VkIEpBWC1SUyByb290IHJlc291cmNlCisgKiB0aGF0IGlzIGNvbnN0cnVjdG9yIGluamVjdGVkIHdpdGggSkFYLVJTIHBhcmFtZXRlcnMgcHJvdmlkZWQgYnkgSmVyc2V5CisgKiBhbmQgYSBzaW5nbGUgU3RyaW5nIHBhcmFtZXRlciBjb21pbmcgZnJvbSBhcHBsaWNhdGlvbiBwcm92aWRlZCBDREkgcHJvZHVjZXIsCisgKiB7QGxpbmsgQ3VzdG9tQ2RpUHJvZHVjZXJ9LgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJjdG9yLWluamVjdGVkL3twfSIpCitAUmVxdWVzdFNjb3BlZAorcHVibGljIGNsYXNzIENvbnN0cnVjdG9ySW5qZWN0ZWRSZXNvdXJjZSB7CisKKyAgICBTdHJpbmcgcGF0aFBhcmFtOworICAgIFN0cmluZyBxdWVyeVBhcmFtOworICAgIFN0cmluZyBtYXRyaXhQYXJhbTsKKyAgICBTdHJpbmcgaGVhZGVyUGFyYW07CisgICAgU3RyaW5nIGNkaVBhcmFtOworCisgICAgLyoqCisgICAgICogV0xTIHJlcXVpcmVzIHRoaXMuCisgICAgICovCisgICAgcHVibGljIENvbnN0cnVjdG9ySW5qZWN0ZWRSZXNvdXJjZSgpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIHdpbGwgZ2V0IENESSBpbmplY3RlZCB3aXRoIEpBWC1SUyBwcm92aWRlZCBwYXJhbWV0ZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGhQYXJhbSBwYXRoIHBhcmFtZXRlciBmcm9tIHRoZSBhY3R1YWwgcmVxdWVzdC4KKyAgICAgKiBAcGFyYW0gcXVlcnlQYXJhbSBxdWVyeSBwYXJhbWV0ZXIgcSBmcm9tIHRoZSBhY3R1YWwgcmVxdWVzdC4KKyAgICAgKiBAcGFyYW0gbWF0cml4UGFyYW0gbWF0cml4IHBhcmFtZXRlciBtIGZyb20gdGhlIGFjdHVhbCByZXF1ZXN0LgorICAgICAqIEBwYXJhbSBoZWFkZXJQYXJhbSBBY2NlcHQgaGVhZGVyIHBhcmFtZXRlciBmcm9tIHRoZSBhY3R1YWwgcmVxdWVzdC4KKyAgICAgKiBAcGFyYW0gY2RpUGFyYW0gY3VzdG9tIENESSBwcm9kdWNlZCBzdHJpbmcuCisgICAgICovCisgICAgQEluamVjdAorICAgIHB1YmxpYyBDb25zdHJ1Y3RvckluamVjdGVkUmVzb3VyY2UoCisgICAgICAgICAgICBAUGF0aFBhcmFtKCJwIikgU3RyaW5nIHBhdGhQYXJhbSwKKyAgICAgICAgICAgIEBRdWVyeVBhcmFtKCJxIikgU3RyaW5nIHF1ZXJ5UGFyYW0sCisgICAgICAgICAgICBATWF0cml4UGFyYW0oIm0iKSBTdHJpbmcgbWF0cml4UGFyYW0sCisgICAgICAgICAgICBASGVhZGVyUGFyYW0oIkN1c3RvbS1IZWFkZXIiKSBTdHJpbmcgaGVhZGVyUGFyYW0sCisgICAgICAgICAgICBAQ3VzdG9tQ2RpUHJvZHVjZXIuUXVhbGlmaWVyIFN0cmluZyBjZGlQYXJhbSkgeworCisgICAgICAgIHRoaXMucGF0aFBhcmFtID0gcGF0aFBhcmFtOworICAgICAgICB0aGlzLnF1ZXJ5UGFyYW0gPSBxdWVyeVBhcmFtOworICAgICAgICB0aGlzLm1hdHJpeFBhcmFtID0gbWF0cml4UGFyYW07CisgICAgICAgIHRoaXMuaGVhZGVyUGFyYW0gPSBoZWFkZXJQYXJhbTsKKyAgICAgICAgdGhpcy5jZGlQYXJhbSA9IGNkaVBhcmFtOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByb3ZpZGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgc2luZ2xlIGluamVjdGVkIHBhcmFtZXRlcgorICAgICAqIGdpdmVuIGJ5IHRoZSBhY3R1YWwgcGF0aCBwYXJhbWV0ZXIgKHRoYXQgaXMgYWxzbyBpbmplY3RlZCkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGEgc2luZ2xlIHBhcmFtZXRlciB2YWx1ZS4KKyAgICAgKi8KKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBnZXRQYXJhbWV0ZXIoKSB7CisKKyAgICAgICAgc3dpdGNoIChwYXRoUGFyYW0pIHsKKworICAgICAgICAgICAgY2FzZSAicGF0aFBhcmFtIjogcmV0dXJuIHBhdGhQYXJhbTsKKyAgICAgICAgICAgIGNhc2UgInF1ZXJ5UGFyYW0iOiByZXR1cm4gcXVlcnlQYXJhbTsKKyAgICAgICAgICAgIGNhc2UgIm1hdHJpeFBhcmFtIjogcmV0dXJuIG1hdHJpeFBhcmFtOworICAgICAgICAgICAgY2FzZSAiaGVhZGVyUGFyYW0iOiByZXR1cm4gaGVhZGVyUGFyYW07CisgICAgICAgICAgICBjYXNlICJjZGlQYXJhbSI6IHJldHVybiBjZGlQYXJhbTsKKworICAgICAgICAgICAgZGVmYXVsdDogdGhyb3cgbmV3IFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKFJlc3BvbnNlLlN0YXR1cy5CQURfUkVRVUVTVCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0NvdW50ZXJSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9Db3VudGVyUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzQyYTBjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9Db3VudGVyUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuUmVxdWVzdFNjb3BlZDsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworCisvKioKKyAqIFBhcnQgb2YgSkVSU0VZLTI0NjEgcmVwcm9kdWNlci4gVGhpcyBvbmUgd2lsbCBnZXQgaW5qZWN0ZWQgd2l0aCBhIENESSBleHRlbnNpb24uCisgKiBISzIgc2hvdWxkIG5vdCBtZXNzIHVwIHdpdGggdGhpcy4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUmVxdWVzdFNjb3BlZAorQFBhdGgoImNvdW50ZXIiKQorcHVibGljIGNsYXNzIENvdW50ZXJSZXNvdXJjZSB7CisKKyAgICBmaW5hbCBDdXN0b21FeHRlbnNpb24gZTsKKworICAgIC8qKgorICAgICAqIFRvIG1ha2UgQ0RJIGhhcHB5Li4uIG5hbWVseSB0byBtYWtlIHRoZSBiZWFuIHByb3h5LWFibGUuCisgICAgICovCisgICAgcHVibGljIENvdW50ZXJSZXNvdXJjZSgpIHsKKyAgICAgICAgdGhpcy5lID0gbnVsbDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUaGlzIG9uZSB3aWxsIGdldCB1c2VkIGF0IHJ1bnRpbWUgYWN0dWFsbHkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZXh0ZW5zaW9uIGN1cnJlbnQgYXBwbGljYXRpb24gQ0RJIGN1c3RvbSBleHRlbnNpb24uCisgICAgICovCisgICAgQEluamVjdAorICAgIHB1YmxpYyBDb3VudGVyUmVzb3VyY2UoQ3VzdG9tRXh0ZW5zaW9uIGV4dGVuc2lvbikgeworICAgICAgICB0aGlzLmUgPSBleHRlbnNpb247CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIGN1c3RvbSBleHRlbnNpb24gY291bnRlciBzdGF0ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbmV4dCBjb3VudC4KKyAgICAgKi8KKyAgICBAR0VUCisgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIGUuZ2V0Q291bnQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0N1c3RvbUNkaVByb2R1Y2VyLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0N1c3RvbUNkaVByb2R1Y2VyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYwMDgzOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQ3VzdG9tQ2RpUHJvZHVjZXIuamF2YQpAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuaW5qZWN0LlByb2R1Y2VzOworCisvKioKKyAqIENESSBwcm9kdWNlciB0byBoZWxwIHVzIG1ha2Ugc3VyZSBISzIgZG8gbm90IG1lc3MgdXAgd2l0aAorICogdHlwZXMgYmFja2VkIGJ5IENESSBwcm9kdWNlcnMuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEN1c3RvbUNkaVByb2R1Y2VyIHsKKworICAgIC8qKgorICAgICAqIEN1c3RvbSBxdWFsaWZpZXIgdG8gd29yayBhcm91bmQgaHR0cHM6Ly9qYXZhLm5ldC9qaXJhL2Jyb3dzZS9HTEFTU0ZJU0gtMjAyODUKKyAgICAgKi8KKyAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorICAgIEBUYXJnZXQoe0VsZW1lbnRUeXBlLlBBUkFNRVRFUiwgRWxlbWVudFR5cGUuRklFTEQsIEVsZW1lbnRUeXBlLk1FVEhPRCwgRWxlbWVudFR5cGUuVFlQRX0pCisgICAgQGphdmF4LmluamVjdC5RdWFsaWZpZXIKKyAgICBwdWJsaWMgc3RhdGljIEBpbnRlcmZhY2UgUXVhbGlmaWVyIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUbyBjb3ZlciBmaWVsZCBwcm9kdWNlci4KKyAgICAgKi8KKyAgICBAUHJvZHVjZXMKKyAgICBwdWJsaWMgc3RhdGljIEZpZWxkUHJvZHVjZWRCZWFuPFN0cmluZz4gZmllbGQgPSBuZXcgRmllbGRQcm9kdWNlZEJlYW48PigiZmllbGQiKTsKKworICAgIC8qKgorICAgICAqIFRvIGNvdmVyIG1ldGhvZCBwcm9kdWNlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYmVhbiBpbnN0YW5jZSB0byBpbmplY3QKKyAgICAgKi8KKyAgICBAUHJvZHVjZXMKKyAgICBwdWJsaWMgTWV0aG9kUHJvZHVjZWRCZWFuPFN0cmluZz4gcHJvZHVjZUJlYW4oKSB7CisgICAgICAgIHJldHVybiBuZXcgTWV0aG9kUHJvZHVjZWRCZWFuPD4oIm1ldGhvZCIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBhcnQgb2YgSkVSU0VZLTI1MjYgcmVwcm9kdWNlci4gVGhpcyBvbmUgaXMgdXNlZAorICAgICAqIHRvIGluamVjdCBjb25zdHJ1Y3RvciBvZiB7QGxpbmsgQ29uc3RydWN0b3JJbmplY3RlZFJlc291cmNlfS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gZml4ZWQgc3RyaW5nIHZhbHVlLgorICAgICAqLworICAgIEBQcm9kdWNlcworICAgIEBRdWFsaWZpZXIKKyAgICBwdWJsaWMgU3RyaW5nIHByb2R1Y2VTdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiY2RpLXByb2R1Y2VkIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0N1c3RvbUV4dGVuc2lvbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9DdXN0b21FeHRlbnNpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODFiYzUxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9DdXN0b21FeHRlbnNpb24uamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuRXh0ZW5zaW9uOworCisvKioKKyAqIFBhcnQgb2YgSkVSU0VZLTI0NjEgcmVwcm9kdWNlci4gV2UgbmVlZCBhbiBleHRlbnNpb24gdGhhdCB3ZSBjb3VsZCBpbmplY3QsCisgKiB0byBtYWtlIHN1cmUgSEsyIGN1c3RvbSBiaW5kaW5nIGRvZXMgbm90IGF0dGVtcHQgdG8gbWVzcyB1cC4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQ3VzdG9tRXh0ZW5zaW9uIGltcGxlbWVudHMgRXh0ZW5zaW9uIHsKKworICAgIHByaXZhdGUgQXRvbWljSW50ZWdlciBjb3VudGVyID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKworICAgIC8qKgorICAgICAqIEEgbWFkZSB1cCBmdW5jdGlvbmFsaXR5LiBEb2VzIG5vdCByZWFsbHkgbWF0dGVyLiBDREkKKyAgICAgKiB3b3VsZCByZWZ1c2UgdG8gZGVwbG95IHRoZSBhcHBsaWNhdGlvbiBpZiBzb21ldGhpbmcgd2VudCB3cm9uZy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbmV4dCBjb3VudC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGdldENvdW50KCkgeworICAgICAgICByZXR1cm4gY291bnRlci5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0VjaG9TZXJ2aWNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0VjaG9TZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg3ZDczNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvRWNob1NlcnZpY2UuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuUXVhbGlmaWVyOworCisvKioKKyAqIFNpbXBsZSBlY2hvIHNlcnZpY2UgdG8gdGVzdCBpbmplY3Rpb25zIHVzaW5nIHtAbGluayBRdWFsaWZpZXJ9LgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRWNob1NlcnZpY2UgeworCisgICAgLyoqCisgICAgICogUHJvdmlkZSBhbiBlY2hvZWQgcmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcyBTdHJpbmcgdG8gYmUgZWNob2VkLgorICAgICAqIEByZXR1cm4gZWNob2VkIGlucHV0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZWNobyhTdHJpbmcgcyk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0ZpZWxkUHJvZHVjZWRCZWFuLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0ZpZWxkUHJvZHVjZWRCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmRiYjZjNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvRmllbGRQcm9kdWNlZEJlYW4uamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5WZXRvZWQ7CisKKy8qKgorICogQSBiZWFuIHRoYXQgd291bGQgYmUgcHJvZHVjZWQgYnkgYSBDREkgcHJvZHVjZXIgZmllbGQuCisgKiBUaGlzIGlzIHRvIG1ha2Ugc3VyZSB3ZSBkbyBub3QgbWVzcyB1cCB3aXRoIENESSBwcm9kdWNlcnMgd2l0aCBISzIuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFZldG9lZAorcHVibGljIGNsYXNzIEZpZWxkUHJvZHVjZWRCZWFuPFQ+IGltcGxlbWVudHMgVmFsdWVIb2xkZXI8VD4geworCisgICAgcHJpdmF0ZSBmaW5hbCBUIHZhbHVlOworCisgICAgLyoqCisgICAgICogTWFrZSBhbiBpbnN0YW5jZSB3aXRoIGdpdmVuIHZhbHVlLgorICAgICAqCisgICAgICogQHBhcmFtIHZhbHVlCisgICAgICovCisgICAgcHVibGljIEZpZWxkUHJvZHVjZWRCZWFuKFQgdmFsdWUpIHsKKyAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBUIGdldFZhbHVlKCkgeworICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9GaXJzdE5vbkpheFJzQmVhbkluamVjdGVkUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvRmlyc3ROb25KYXhSc0JlYW5JbmplY3RlZFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBiNTUyZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvRmlyc3ROb25KYXhSc0JlYW5JbmplY3RlZFJlc291cmNlLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LlJlcXVlc3RTY29wZWQ7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworLyoqCisgKiBKQVgtUlMgcmVzb3VyY2UgdGhhdCBnZXRzIGluamVjdGVkIHdpdGggYSBDREkgbWFuYWdlZCBiZWFuLAorICogdGhhdCBpbmNsdWRlcyBKQVgtUlMgaW5qZWN0aW9uIHBvaW50cy4gVGhlIHZlcnkgc2FtZSBiZWFuCisgKiBnZXRzIGluamVjdGVkIGFsc28gdG8ge0BsaW5rIEZpcnN0Tm9uSmF4UnNCZWFuSW5qZWN0ZWRSZXNvdXJjZX0uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIm5vbi1qYXhycy1iZWFuLWluamVjdGVkIikKK0BSZXF1ZXN0U2NvcGVkCitwdWJsaWMgY2xhc3MgRmlyc3ROb25KYXhSc0JlYW5JbmplY3RlZFJlc291cmNlIHsKKworICAgIEBJbmplY3QKKyAgICBKYXhSc0luamVjdGVkQmVhbiBiZWFuOworCisgICAgQEdFVAorICAgIEBQYXRoKCJwYXRoLzEiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIGJlYW4uZ2V0VXJpSW5mbygpLmdldFBhdGgoKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImhlYWRlci8xIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldEFjY2VwdEhlYWRlcigpIHsKKyAgICAgICAgcmV0dXJuIGJlYW4uZ2V0VGVzdEhlYWRlcigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvSkNESUJlYW5EZXBlbmRlbnRFeGNlcHRpb25NYXBwZXIuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvSkNESUJlYW5EZXBlbmRlbnRFeGNlcHRpb25NYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTBkYzk3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9KQ0RJQmVhbkRlcGVuZGVudEV4Y2VwdGlvbk1hcHBlci5qYXZhCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5SZXNvdXJjZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5FeGNlcHRpb25NYXBwZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5NYW5hZ2VkQmVhbjsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlBvc3RDb25zdHJ1Y3Q7CisKKy8qKgorICogSkFYLVJTIGV4Y2VwdGlvbiBtYXBwZXIgcmVnaXN0ZXJlZCBhcyBhIENESSBtYW5hZ2VkIGJlYW4uCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFByb3ZpZGVyCitATWFuYWdlZEJlYW4KK3B1YmxpYyBjbGFzcyBKQ0RJQmVhbkRlcGVuZGVudEV4Y2VwdGlvbk1hcHBlciBpbXBsZW1lbnRzIEV4Y2VwdGlvbk1hcHBlcjxKRENJQmVhbkRlcGVuZGVudEV4Y2VwdGlvbj4geworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoSkNESUJlYW5EZXBlbmRlbnRFeGNlcHRpb25NYXBwZXIuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIEBDb250ZXh0CisgICAgcHJpdmF0ZSBVcmlJbmZvIHVpRmllbGRJbmplY3Q7CisKKyAgICBAQ29udGV4dAorICAgIHByaXZhdGUgUmVzb3VyY2VDb250ZXh0IHJlc291cmNlQ29udGV4dDsKKworICAgIHByaXZhdGUgVXJpSW5mbyB1aU1ldGhvZEluamVjdDsKKworICAgIEBDb250ZXh0CisgICAgcHVibGljIHZvaWQgc2V0KFVyaUluZm8gdWkpIHsKKyAgICAgICAgdGhpcy51aU1ldGhvZEluamVjdCA9IHVpOworICAgIH0KKworICAgIEBQb3N0Q29uc3RydWN0CisgICAgcHVibGljIHZvaWQgcG9zdENvbnN0cnVjdCgpIHsKKyAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5JTkZPLCBTdHJpbmcuZm9ybWF0KCJJbiBwb3N0IGNvbnN0cnVjdCBvZiAlcyIsIHRoaXMpKTsKKyAgICAgICAgZW5zdXJlSW5qZWN0ZWQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzcG9uc2UgdG9SZXNwb25zZShKRENJQmVhbkRlcGVuZGVudEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKKyAgICAgICAgZW5zdXJlSW5qZWN0ZWQoKTsKKyAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnNlcnZlckVycm9yKCkuZW50aXR5KCJKRENJQmVhbkRlcGVuZGVudEV4Y2VwdGlvbiIpLmJ1aWxkKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGVuc3VyZUluamVjdGVkKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgIGlmICh1aUZpZWxkSW5qZWN0ID09IG51bGwgfHwgdWlNZXRob2RJbmplY3QgPT0gbnVsbCB8fCByZXNvdXJjZUNvbnRleHQgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9KQ0RJQmVhbkRlcGVuZGVudFBlclJlcXVlc3RSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9KQ0RJQmVhbkRlcGVuZGVudFBlclJlcXVlc3RSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMzZlZmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0pDRElCZWFuRGVwZW5kZW50UGVyUmVxdWVzdFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwxMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlJlc291cmNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5NYW5hZ2VkQmVhbjsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUG9zdENvbnN0cnVjdDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByZURlc3Ryb3k7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LlJlcXVlc3RTY29wZWQ7CisKKworLyoqCisgKiBSZXF1ZXN0IHNjb3BlZCBKQVgtUlMgcmVzb3VyY2UgcmVnaXN0ZXJlZCBhcyBhIENESSBtYW5hZ2VkIGJlYW4uCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIi9qY2RpYmVhbi9kZXBlbmRlbnQvcGVyLXJlcXVlc3QiKQorQE1hbmFnZWRCZWFuCitAUmVxdWVzdFNjb3BlZAorcHVibGljIGNsYXNzIEpDRElCZWFuRGVwZW5kZW50UGVyUmVxdWVzdFJlc291cmNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEpDRElCZWFuRGVwZW5kZW50UGVyUmVxdWVzdFJlc291cmNlLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBAUmVzb3VyY2UobmFtZSA9ICJpbmplY3RlZFJlc291cmNlIikKKyAgICBwcml2YXRlIGludCBpbmplY3RlZFJlc291cmNlID0gMDsKKworICAgIEBDb250ZXh0CisgICAgcHJpdmF0ZSBVcmlJbmZvIHVpRmllbGRJbmplY3Q7CisKKyAgICBAQ29udGV4dAorICAgIHByaXZhdGUgUmVzb3VyY2VDb250ZXh0IHJjOworCisgICAgQFF1ZXJ5UGFyYW0oIngiKQorICAgIHByaXZhdGUgU3RyaW5nIHg7CisKKyAgICBwcml2YXRlIFVyaUluZm8gdWlNZXRob2RJbmplY3Q7CisKKyAgICBAQ29udGV4dAorICAgIHB1YmxpYyB2b2lkIHNldChVcmlJbmZvIHVpKSB7CisgICAgICAgIHRoaXMudWlNZXRob2RJbmplY3QgPSB1aTsKKyAgICB9CisKKyAgICBAUG9zdENvbnN0cnVjdAorICAgIHB1YmxpYyB2b2lkIHBvc3RDb25zdHJ1Y3QoKSB7CisKKyAgICAgICAgZW5zdXJlSW5qZWN0ZWQoKTsKKworICAgICAgICBMT0dHRVIuaW5mbyhTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICJJbiBwb3N0IGNvbnN0cnVjdCBvZiAlczsgdWlGaWVsZEluamVjdDogJXM7IHVpTWV0aG9kSW5qZWN0OiAlcyIsCisgICAgICAgICAgICAgICAgdGhpcywgdWlGaWVsZEluamVjdCwgdWlNZXRob2RJbmplY3QpKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CisKKyAgICAgICAgZW5zdXJlSW5qZWN0ZWQoKTsKKworICAgICAgICBMT0dHRVIuaW5mbyhTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICJJbiBnZXRNZXNzYWdlIG9mICVzOyB1aUZpZWxkSW5qZWN0OiAlczsgdWlNZXRob2RJbmplY3Q6ICVzIiwKKyAgICAgICAgICAgICAgICB0aGlzLCB1aUZpZWxkSW5qZWN0LCB1aU1ldGhvZEluamVjdCkpOworCisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlczogcXVlcnlQYXJhbT0lcyAlZCIsIHVpRmllbGRJbmplY3QuZ2V0UmVxdWVzdFVyaSgpLnRvU3RyaW5nKCksIHgsIGluamVjdGVkUmVzb3VyY2UrKyk7CisgICAgfQorCisgICAgQFByZURlc3Ryb3kKKyAgICBwdWJsaWMgdm9pZCBwcmVEZXN0cm95KCkgeworICAgICAgICBMT0dHRVIuaW5mbyhTdHJpbmcuZm9ybWF0KCJJbiBwcmUgZGVzdHJveSBvZiAlcyIsIHRoaXMpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5zdXJlSW5qZWN0ZWQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHVpRmllbGRJbmplY3QgPT0gbnVsbCB8fCB1aU1ldGhvZEluamVjdCA9PSBudWxsIHx8IHJjID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvSkNESUJlYW5EZXBlbmRlbnRSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9KQ0RJQmVhbkRlcGVuZGVudFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg5ZGU0OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvSkNESUJlYW5EZXBlbmRlbnRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CisKKy8qKgorICogVGVzdCBjYXNlIGZvciBKRVJTRVktMTc0Ny4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiL2pjZGliZWFuL2RlcGVuZGVudC90aW1lciIpCitwdWJsaWMgY2xhc3MgSkNESUJlYW5EZXBlbmRlbnRSZXNvdXJjZSB7CisKKyAgIEBJbmplY3QKKyAgIEpDRElCZWFuUmVxdWVzdFNjb3BlZFRpbWVyIHRpbWVyOworCisgICBAR0VUCisgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKyAgICAgICByZXR1cm4gTG9uZy50b1N0cmluZyh0aW1lci5nZXRNaWxpc2Vjb25kcygpKTsKKyAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvSkNESUJlYW5EZXBlbmRlbnRTaW5nbGV0b25SZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9KQ0RJQmVhbkRlcGVuZGVudFNpbmdsZXRvblJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDllY2Y4MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvSkNESUJlYW5EZXBlbmRlbnRTaW5nbGV0b25SZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUFVUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5SZXNvdXJjZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uTWFuYWdlZEJlYW47CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0OworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJlRGVzdHJveTsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlJlc291cmNlOworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5BcHBsaWNhdGlvblNjb3BlZDsKKworLyoqCisgKiBBcHBsaWNhdGlvbiBzY29wZWQgSkFYLVJTIHJlc291cmNlIHJlZ2lzdGVyZWQgYXMgQ0RJIG1hbmFnZWQgYmVhbi4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiL2pjZGliZWFuL2RlcGVuZGVudC9zaW5nbGV0b24ve3B9IikKK0BBcHBsaWNhdGlvblNjb3BlZAorQE1hbmFnZWRCZWFuCitwdWJsaWMgY2xhc3MgSkNESUJlYW5EZXBlbmRlbnRTaW5nbGV0b25SZXNvdXJjZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihKQ0RJQmVhbkRlcGVuZGVudFNpbmdsZXRvblJlc291cmNlLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBAUmVzb3VyY2UobmFtZSA9ICJpbmplY3RlZFJlc291cmNlIikKKyAgICBwcml2YXRlIGludCBjb3VudGVyID0gMDsKKworICAgIEBDb250ZXh0CisgICAgcHJpdmF0ZSBVcmlJbmZvIHVpRmllbGRpbmplY3Q7CisKKyAgICBAQ29udGV4dAorICAgIHByaXZhdGUgUmVzb3VyY2VDb250ZXh0IHJlc291cmNlQ29udGV4dDsKKworICAgIHByaXZhdGUgVXJpSW5mbyB1aU1ldGhvZEluamVjdDsKKworICAgIEBDb250ZXh0CisgICAgcHVibGljIHZvaWQgc2V0KFVyaUluZm8gdWkpIHsKKyAgICAgICAgdGhpcy51aU1ldGhvZEluamVjdCA9IHVpOworICAgIH0KKworICAgIEBQb3N0Q29uc3RydWN0CisgICAgcHVibGljIHZvaWQgcG9zdENvbnN0cnVjdCgpIHsKKyAgICAgICAgTE9HR0VSLmluZm8oU3RyaW5nLmZvcm1hdCgiSW4gcG9zdCBjb25zdHJ1Y3Qgb2YgJXMiLCB0aGlzKSk7CisgICAgICAgIGVuc3VyZUluamVjdGVkKCk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKEBQYXRoUGFyYW0oInAiKSBTdHJpbmcgcCkgeworICAgICAgICBMT0dHRVIuaW5mbyhTdHJpbmcuZm9ybWF0KAorICAgICAgICAgICAgICAgICJJbiBnZXRNZXNzYWdlIGluICVzOyB1aUZpZWxkSW5qZWN0OiAlczsgdWlNZXRob2RJbmplY3Q6ICVzIiwgdGhpcywgdWlGaWVsZGluamVjdCwgdWlNZXRob2RJbmplY3QpKTsKKyAgICAgICAgZW5zdXJlSW5qZWN0ZWQoKTsKKworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJXM6IHA9JXMsIHF1ZXJ5UGFyYW09JXMiLAorICAgICAgICAgICAgICAgIHVpRmllbGRpbmplY3QuZ2V0UmVxdWVzdFVyaSgpLnRvU3RyaW5nKCksIHAsIHVpTWV0aG9kSW5qZWN0LmdldFF1ZXJ5UGFyYW1ldGVycygpLmdldEZpcnN0KCJ4IikpOworICAgIH0KKworICAgIEBQYXRoKCJleGNlcHRpb24iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhjZXB0aW9uKCkgeworICAgICAgICB0aHJvdyBuZXcgSkRDSUJlYW5EZXBlbmRlbnRFeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAUGF0aCgiY291bnRlciIpCisgICAgQEdFVAorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGdldENvdW50ZXIoKSB7CisgICAgICAgIHJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKGNvdW50ZXIrKyk7CisgICAgfQorCisgICAgQFBhdGgoImNvdW50ZXIiKQorICAgIEBQVVQKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0Q291bnRlcihTdHJpbmcgY291bnRlcikgeworICAgICAgICB0aGlzLmNvdW50ZXIgPSBJbnRlZ2VyLmRlY29kZShjb3VudGVyKTsKKyAgICB9CisKKyAgICBAUHJlRGVzdHJveQorICAgIHB1YmxpYyB2b2lkIHByZURlc3Ryb3koKSB7CisgICAgICAgIExPR0dFUi5pbmZvKFN0cmluZy5mb3JtYXQoIkluIHByZSBkZXN0cm95IG9mICVzIiwgdGhpcykpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBlbnN1cmVJbmplY3RlZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgICAgICBpZiAodWlGaWVsZGluamVjdCA9PSBudWxsIHx8IHVpTWV0aG9kSW5qZWN0ID09IG51bGwgfHwgcmVzb3VyY2VDb250ZXh0ID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvSkNESUJlYW5FeGNlcHRpb25NYXBwZXIuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvSkNESUJlYW5FeGNlcHRpb25NYXBwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmEwNmVkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9KQ0RJQmVhbkV4Y2VwdGlvbk1hcHBlci5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5SZXNvdXJjZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5FeGNlcHRpb25NYXBwZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0OworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5BcHBsaWNhdGlvblNjb3BlZDsKKworLyoqCisgKiBKQVgtUlMgZXhjZXB0aW9uIG1hcHBlciByZWdpc3RlcmVkIGFzIENESSBtYW5hZ2VkIGJlYW4uCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitAUHJvdmlkZXIKK0BBcHBsaWNhdGlvblNjb3BlZAorcHVibGljIGNsYXNzIEpDRElCZWFuRXhjZXB0aW9uTWFwcGVyIGltcGxlbWVudHMgRXhjZXB0aW9uTWFwcGVyPEpEQ0lCZWFuRXhjZXB0aW9uPiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihKQ0RJQmVhbkV4Y2VwdGlvbk1hcHBlci5jbGFzcy5nZXROYW1lKCkpOworCisgICAgQENvbnRleHQKKyAgICBwcml2YXRlIFVyaUluZm8gdWlGaWVsZEluamVjdDsKKworICAgIEBDb250ZXh0CisgICAgcHJpdmF0ZSBSZXNvdXJjZUNvbnRleHQgcmM7CisKKyAgICBwcml2YXRlIFVyaUluZm8gdWlNZXRob2RJbmplY3Q7CisKKyAgICBAQ29udGV4dAorICAgIHB1YmxpYyB2b2lkIHNldChVcmlJbmZvIHVpKSB7CisgICAgICAgIHRoaXMudWlNZXRob2RJbmplY3QgPSB1aTsKKyAgICB9CisKKyAgICBAUG9zdENvbnN0cnVjdAorICAgIHB1YmxpYyB2b2lkIHBvc3RDb25zdHJ1Y3QoKSB7CisgICAgICAgIGVuc3VyZUluamVjdGVkKCk7CisgICAgICAgIExPR0dFUi5pbmZvKFN0cmluZy5mb3JtYXQoIkluIHBvc3QgY29uc3RydWN0IG9mICVzIiwgdGhpcykpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNwb25zZSB0b1Jlc3BvbnNlKEpEQ0lCZWFuRXhjZXB0aW9uIGV4Y2VwdGlvbikgeworICAgICAgICBlbnN1cmVJbmplY3RlZCgpOworICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc2VydmVyRXJyb3IoKS5lbnRpdHkoIkpEQ0lCZWFuRXhjZXB0aW9uIikuYnVpbGQoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgZW5zdXJlSW5qZWN0ZWQoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHVpRmllbGRJbmplY3QgPT0gbnVsbCB8fCB1aU1ldGhvZEluamVjdCA9PSBudWxsIHx8IHJjID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvSkNESUJlYW5QZXJSZXF1ZXN0UmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvSkNESUJlYW5QZXJSZXF1ZXN0UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDNlOWFkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9KQ0RJQmVhblBlclJlcXVlc3RSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUG9zdENvbnN0cnVjdDsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByZURlc3Ryb3k7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5SZXNvdXJjZTsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuUmVxdWVzdFNjb3BlZDsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5SZXNvdXJjZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKKworLyoqCisgKiBSZXF1ZXN0IHNjb3BlZCBKQVgtUlMgcmVzb3VyY2UgcmVnaXN0ZXJlZC4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiL2pjZGliZWFuL3Blci1yZXF1ZXN0IikKK0BSZXF1ZXN0U2NvcGVkCitwdWJsaWMgY2xhc3MgSkNESUJlYW5QZXJSZXF1ZXN0UmVzb3VyY2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoSkNESUJlYW5QZXJSZXF1ZXN0UmVzb3VyY2UuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIEBSZXNvdXJjZShuYW1lID0gImluamVjdGVkUmVzb3VyY2UiKQorICAgIHByaXZhdGUgaW50IGluamVjdGVkUmVzb3VyY2UgPSAwOworCisgICAgQENvbnRleHQKKyAgICBwcml2YXRlIFVyaUluZm8gdWlGaWVsZEluamVjdDsKKworICAgIEBDb250ZXh0CisgICAgcHJpdmF0ZSBSZXNvdXJjZUNvbnRleHQgcmM7CisKKyAgICBAUXVlcnlQYXJhbSgieCIpCisgICAgcHJpdmF0ZSBTdHJpbmcgeDsKKworICAgIHByaXZhdGUgVXJpSW5mbyB1aU1ldGhvZEluamVjdDsKKworICAgIEBDb250ZXh0CisgICAgcHVibGljIHZvaWQgc2V0KFVyaUluZm8gdWkpIHsKKyAgICAgICAgdGhpcy51aU1ldGhvZEluamVjdCA9IHVpOworICAgIH0KKworICAgIEBQb3N0Q29uc3RydWN0CisgICAgcHVibGljIHZvaWQgcG9zdENvbnN0cnVjdCgpIHsKKworICAgICAgICBlbnN1cmVJbmplY3RlZCgpOworCisgICAgICAgIExPR0dFUi5pbmZvKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgIkluIHBvc3QgY29uc3RydWN0IG9mICVzOyB1aUZpZWxkSW5qZWN0OiAlczsgdWlNZXRob2RJbmplY3Q6ICVzIiwKKyAgICAgICAgICAgICAgICB0aGlzLCB1aUZpZWxkSW5qZWN0LCB1aU1ldGhvZEluamVjdCkpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKKworICAgICAgICBlbnN1cmVJbmplY3RlZCgpOworCisgICAgICAgIExPR0dFUi5pbmZvKFN0cmluZy5mb3JtYXQoCisgICAgICAgICAgICAgICAgIkluIGdldE1lc3NhZ2Ugb2YgJXM7IHVpRmllbGRJbmplY3Q6ICVzOyB1aU1ldGhvZEluamVjdDogJXMiLAorICAgICAgICAgICAgICAgIHRoaXMsIHVpRmllbGRJbmplY3QsIHVpTWV0aG9kSW5qZWN0KSk7CisKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiVzOiBxdWVyeVBhcmFtPSVzICVkIiwgdWlGaWVsZEluamVjdC5nZXRSZXF1ZXN0VXJpKCkudG9TdHJpbmcoKSwgeCwgaW5qZWN0ZWRSZXNvdXJjZSsrKTsKKyAgICB9CisKKyAgICBAUHJlRGVzdHJveQorICAgIHB1YmxpYyB2b2lkIHByZURlc3Ryb3koKSB7CisgICAgICAgIExPR0dFUi5pbmZvKFN0cmluZy5mb3JtYXQoIkluIHByZSBkZXN0cm95IG9mICVzIiwgdGhpcykpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBlbnN1cmVJbmplY3RlZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgICAgICBpZiAodWlGaWVsZEluamVjdCA9PSBudWxsIHx8IHVpTWV0aG9kSW5qZWN0ID09IG51bGwgfHwgcmMgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9KQ0RJQmVhblJlcXVlc3RTY29wZWRUaW1lci5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9KQ0RJQmVhblJlcXVlc3RTY29wZWRUaW1lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxOWY1YTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0pDRElCZWFuUmVxdWVzdFNjb3BlZFRpbWVyLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0OworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5SZXF1ZXN0U2NvcGVkOworCisvKioKKyAqIFJlcXVlc3Qgc2NvcGVkIENESSBiZWFuIHRvIGJlIGluamVjdGVkIGludG8ge0BsaW5rIEpDRElCZWFuRGVwZW5kZW50UmVzb3VyY2V9LgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSZXF1ZXN0U2NvcGVkCitwdWJsaWMgY2xhc3MgSkNESUJlYW5SZXF1ZXN0U2NvcGVkVGltZXIgeworCisgICBwcml2YXRlIGxvbmcgbXM7CisKKyAgIC8qKgorICAgICogUHJvdmlkZSBpbmZvcm1hdGlvbiBvbiBhY3R1YWwgcmVxdWVzdCB0aW1lLgorICAgICoKKyAgICAqIEByZXR1cm4gbWlsbGlzZWNvbmRzIHdoZW4gdGhlIGN1cnJlbnQgYmVhbiB3YXMgcG9zdC1jb25zdHJ1Y3RlZC4KKyAgICAqLworICAgcHVibGljIGxvbmcgZ2V0TWlsaXNlY29uZHMoKSB7CisgICAgICAgcmV0dXJuIG1zOworICAgfQorCisgICBAUG9zdENvbnN0cnVjdAorICAgcHVibGljIHZvaWQgaW5pdCgpIHsKKyAgICAgICB0aGlzLm1zID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7CisgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0pDRElCZWFuU2luZ2xldG9uUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvSkNESUJlYW5TaW5nbGV0b25SZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExODFmNGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0pDRElCZWFuU2luZ2xldG9uUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDExNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBVVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuUmVzb3VyY2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlBvc3RDb25zdHJ1Y3Q7CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5QcmVEZXN0cm95OworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUmVzb3VyY2U7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LkFwcGxpY2F0aW9uU2NvcGVkOworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOworCisvKioKKyAqIEFwcGxpY2F0aW9uIHNjb3BlZCBKQVgtUlMgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIi9qY2RpYmVhbi9zaW5nbGV0b24ve3B9IikKK0BBcHBsaWNhdGlvblNjb3BlZAorcHVibGljIGNsYXNzIEpDRElCZWFuU2luZ2xldG9uUmVzb3VyY2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoSkNESUJlYW5TaW5nbGV0b25SZXNvdXJjZS5jbGFzcy5nZXROYW1lKCkpOworCisgICAgQFJlc291cmNlKG5hbWUgPSAiaW5qZWN0ZWRSZXNvdXJjZSIpCisgICAgcHJpdmF0ZSBpbnQgY291bnRlciA9IDA7CisKKyAgICBAQ29udGV4dAorICAgIHByaXZhdGUgVXJpSW5mbyB1aUZpZWxkaW5qZWN0OworCisgICAgQENvbnRleHQKKyAgICBwcml2YXRlCisgICAgUmVzb3VyY2VDb250ZXh0IHJlc291cmNlQ29udGV4dDsKKworICAgIHByaXZhdGUgVXJpSW5mbyB1aU1ldGhvZEluamVjdDsKKworICAgIEBJbmplY3QKKyAgICBQcm92aWRlcjxKQ0RJQmVhbkV4Y2VwdGlvbk1hcHBlcj4gbWFwcGVyUHJvdmlkZXI7CisKKyAgICBAQ29udGV4dAorICAgIHB1YmxpYyB2b2lkIHNldChVcmlJbmZvIHVpKSB7CisgICAgICAgIHRoaXMudWlNZXRob2RJbmplY3QgPSB1aTsKKyAgICB9CisKKyAgICBAUG9zdENvbnN0cnVjdAorICAgIHB1YmxpYyB2b2lkIHBvc3RDb25zdHJ1Y3QoKSB7CisgICAgICAgIExPR0dFUi5pbmZvKFN0cmluZy5mb3JtYXQoIkluIHBvc3QgY29uc3RydWN0IG9mICVzIiwgdGhpcykpOworICAgICAgICBlbnN1cmVJbmplY3RlZCgpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZShAUGF0aFBhcmFtKCJwIikgU3RyaW5nIHApIHsKKyAgICAgICAgTE9HR0VSLmluZm8oU3RyaW5nLmZvcm1hdCgKKyAgICAgICAgICAgICAgICAiSW4gZ2V0TWVzc2FnZSBpbiAlczsgdWlGaWVsZEluamVjdDogJXM7IHVpTWV0aG9kSW5qZWN0OiAlczsgcHJvdmlkZXI6ICVzOyBwcm92aWRlci5nZXQoKTogJXMiLCB0aGlzLAorICAgICAgICAgICAgICAgIHVpRmllbGRpbmplY3QsIHVpTWV0aG9kSW5qZWN0LCBtYXBwZXJQcm92aWRlciwgbWFwcGVyUHJvdmlkZXIuZ2V0KCkpKTsKKyAgICAgICAgZW5zdXJlSW5qZWN0ZWQoKTsKKworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJXM6IHA9JXMsIHF1ZXJ5UGFyYW09JXMiLAorICAgICAgICAgICAgICAgIHVpRmllbGRpbmplY3QuZ2V0UmVxdWVzdFVyaSgpLnRvU3RyaW5nKCksIHAsIHVpTWV0aG9kSW5qZWN0LmdldFF1ZXJ5UGFyYW1ldGVycygpLmdldEZpcnN0KCJ4IikpOworICAgIH0KKworICAgIEBQYXRoKCJleGNlcHRpb24iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhjZXB0aW9uKCkgeworICAgICAgICB0aHJvdyBuZXcgSkRDSUJlYW5FeGNlcHRpb24oKTsKKyAgICB9CisKKyAgICBAUGF0aCgiY291bnRlciIpCisgICAgQEdFVAorICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGdldENvdW50ZXIoKSB7CisgICAgICAgIHJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKGNvdW50ZXIrKyk7CisgICAgfQorCisgICAgQFBhdGgoImNvdW50ZXIiKQorICAgIEBQVVQKKyAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgc2V0Q291bnRlcihTdHJpbmcgY291bnRlcikgeworICAgICAgICB0aGlzLmNvdW50ZXIgPSBJbnRlZ2VyLmRlY29kZShjb3VudGVyKTsKKyAgICB9CisKKyAgICBAUHJlRGVzdHJveQorICAgIHB1YmxpYyB2b2lkIHByZURlc3Ryb3koKSB7CisgICAgICAgIExPR0dFUi5pbmZvKFN0cmluZy5mb3JtYXQoIkluIHByZSBkZXN0cm95IG9mICVzIiwgdGhpcykpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBlbnN1cmVJbmplY3RlZCgpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgICAgICBpZiAodWlGaWVsZGluamVjdCA9PSBudWxsIHx8IHVpTWV0aG9kSW5qZWN0ID09IG51bGwKKyAgICAgICAgICAgICAgICB8fCByZXNvdXJjZUNvbnRleHQgPT0gbnVsbCB8fCBtYXBwZXJQcm92aWRlci5nZXQoKSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0pEQ0lCZWFuRGVwZW5kZW50RXhjZXB0aW9uLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0pEQ0lCZWFuRGVwZW5kZW50RXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNlODM3YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvSkRDSUJlYW5EZXBlbmRlbnRFeGNlcHRpb24uamF2YQpAQCAtMCwwICsxLDI1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKKy8qKgorICogRXhjZXB0aW9uIHRvIGJlIHRyZWF0ZWQgYnkge0BsaW5rIEpDRElCZWFuRGVwZW5kZW50RXhjZXB0aW9uTWFwcGVyfS4KKyAqCisgKiBAYXV0aG9yIFBhdWwgU2FuZG96CisgKi8KK3B1YmxpYyBjbGFzcyBKRENJQmVhbkRlcGVuZGVudEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9KRENJQmVhbkV4Y2VwdGlvbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9KRENJQmVhbkV4Y2VwdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiODBhMGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0pEQ0lCZWFuRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCisvKioKKyAqIEV4Y2VwdGlvbiB0byBiZSB0cmVhdGVkIGJ5IHtAbGluayBKQ0RJQmVhbkV4Y2VwdGlvbk1hcHBlcn0uCisgKgorICogQGF1dGhvciBQYXVsIFNhbmRvegorICovCitwdWJsaWMgY2xhc3MgSkRDSUJlYW5FeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvSmF4UnNJbmplY3RlZEJlYW4uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvSmF4UnNJbmplY3RlZEJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZDdhODg0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9KYXhSc0luamVjdGVkQmVhbi5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5SZXF1ZXN0U2NvcGVkOworaW1wb3J0IGphdmF4LndzLnJzLkhlYWRlclBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CisKKy8qKgorICogVGhpcyBpcyB0byBiZSBKQVgtUlMgaW5qZWN0ZWQgYXQgcnVudGltZS4KKyAqIFRoZSBiZWFuIGlzIGZ1bGx5IENESSBtYW5hZ2VkLCBjb250YWlucyBKQVgtUlMgaW5qZWN0aW9uIHBvaW50cyBhbmQgaXMgZ2V0dGluZyBpbmplY3RlZCBpbnRvIEpBWC1SUworICogcmVzb3VyY2VzIGluY2x1ZGVkIGluIHR3byBkaXN0aW5jdCBKQVgtUlMgYXBwbGljYXRpb25zIHJ1bm5pbmcgaW4gcGFyYWxsZWwuCisgKi8KK0BSZXF1ZXN0U2NvcGVkCitwdWJsaWMgY2xhc3MgSmF4UnNJbmplY3RlZEJlYW4geworCisgICAgQEhlYWRlclBhcmFtKCJ4LXRlc3QiKQorICAgIFN0cmluZyB0ZXN0SGVhZGVyOworCisgICAgQENvbnRleHQKKyAgICBVcmlJbmZvIHVyaUluZm87CisKKyAgICBwdWJsaWMgVXJpSW5mbyBnZXRVcmlJbmZvKCkgeworICAgICAgICByZXR1cm4gdXJpSW5mbzsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRlc3RIZWFkZXIoKSB7CisgICAgICAgIHJldHVybiB0ZXN0SGVhZGVyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvTWFpbkFwcGxpY2F0aW9uLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL01haW5BcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZWMwZTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL01haW5BcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0OworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJlRGVzdHJveTsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5BcHBsaWNhdGlvblNjb3BlZDsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuQmVhbk1hbmFnZXI7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKKy8qKgorICogSkFYLVJTIGFwcGxpY2F0aW9uIHRvIGNvbmZpZ3VyZSByZXNvdXJjZXMuCisgKgorICogQGF1dGhvciBKb25hdGhhbiBCZW5vaXQgKGpvbmF0aGFuLmJlbm9pdCBhdCBvcmFjbGUuY29tKQorICovCitAQXBwbGljYXRpb25QYXRoKCJtYWluIikKK0BBcHBsaWNhdGlvblNjb3BlZAorcHVibGljIGNsYXNzIE1haW5BcHBsaWNhdGlvbiBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKworICAgIHN0YXRpYyBBdG9taWNJbnRlZ2VyIHBvc3RDb25zdHJ1Y3RDb3VudGVyID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKworICAgIEBJbmplY3QgQmVhbk1hbmFnZXIgYm07CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihNYWluQXBwbGljYXRpb24uY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgIGZpbmFsIFNldDxDbGFzczw/Pj4gY2xhc3NlcyA9IG5ldyBIYXNoU2V0PENsYXNzPD8+PigpOworICAgICAgICBjbGFzc2VzLmFkZChKQ0RJQmVhbkRlcGVuZGVudFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgY2xhc3Nlcy5hZGQoSkRDSUJlYW5FeGNlcHRpb24uY2xhc3MpOworICAgICAgICBjbGFzc2VzLmFkZChKRENJQmVhbkRlcGVuZGVudEV4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIGNsYXNzZXMuYWRkKEpDRElCZWFuU2luZ2xldG9uUmVzb3VyY2UuY2xhc3MpOworICAgICAgICBjbGFzc2VzLmFkZChKQ0RJQmVhblBlclJlcXVlc3RSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIGNsYXNzZXMuYWRkKEpDRElCZWFuRXhjZXB0aW9uTWFwcGVyLmNsYXNzKTsKKyAgICAgICAgY2xhc3Nlcy5hZGQoSkNESUJlYW5EZXBlbmRlbnRTaW5nbGV0b25SZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIGNsYXNzZXMuYWRkKEpDRElCZWFuRGVwZW5kZW50UGVyUmVxdWVzdFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgY2xhc3Nlcy5hZGQoSkNESUJlYW5EZXBlbmRlbnRFeGNlcHRpb25NYXBwZXIuY2xhc3MpOworICAgICAgICBjbGFzc2VzLmFkZChTdHV0dGVyaW5nRWNob1Jlc291cmNlLmNsYXNzKTsKKyAgICAgICAgY2xhc3Nlcy5hZGQoU3R1dHRlcmluZ0VjaG8uY2xhc3MpOworICAgICAgICBjbGFzc2VzLmFkZChSZXZlcnNpbmdFY2hvUmVzb3VyY2UuY2xhc3MpOworICAgICAgICBjbGFzc2VzLmFkZChDb3VudGVyUmVzb3VyY2UuY2xhc3MpOworICAgICAgICBjbGFzc2VzLmFkZChDb25zdHJ1Y3RvckluamVjdGVkUmVzb3VyY2UuY2xhc3MpOworICAgICAgICBjbGFzc2VzLmFkZChQcm9kdWNlclJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgY2xhc3Nlcy5hZGQoRmlyc3ROb25KYXhSc0JlYW5JbmplY3RlZFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIGNsYXNzZXM7CisgICAgfQorCisgICAgLy8gSkVSU0VZLTI1MzE6IG1ha2Ugc3VyZSB0aGlzIHR5cGUgZ2V0cyBtYW5hZ2VkIGJ5IENESQorICAgIEBQb3N0Q29uc3RydWN0CisgICAgcHVibGljIHZvaWQgcG9zdENvbnN0cnVjdCgpIHsKKyAgICAgICAgTE9HR0VSLmluZm8oU3RyaW5nLmZvcm1hdCgiJXM6IFBPU1QgQ09OU1RSVUNULiIsIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKKyAgICAgICAgcG9zdENvbnN0cnVjdENvdW50ZXIuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICAgIGlmIChibSA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJCZWFuTWFuYWdlciBzaG91bGQgaGF2ZSBiZWVuIGluamVjdGVkIGludG8gYSBDREkgbWFuYWdlZCBiZWFuLiIpOworICAgICAgICB9CisgICAgICAgIGlmIChwb3N0Q29uc3RydWN0Q291bnRlci5pbnRWYWx1ZSgpID4gMSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigicG9zdENvbnN0cnVjdCBzaG91bGQgaGF2ZSBiZWVuIGludm9rZWQgb25seSBvbmNlIG9uIGFwcCBzY29wZWQgYmVhbi4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQcmVEZXN0cm95CisgICAgcHVibGljIHZvaWQgcHJlRGVzdHJveSgpIHsKKyAgICAgICAgTE9HR0VSLmluZm8oU3RyaW5nLmZvcm1hdCgiJXM6IFBSRSBERVNUUk9ZLiIsIHRoaXMuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL01ldGhvZFByb2R1Y2VkQmVhbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9NZXRob2RQcm9kdWNlZEJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGY4NDJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9NZXRob2RQcm9kdWNlZEJlYW4uamF2YQpAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5WZXRvZWQ7CisKKy8qKgorICogQSBiZWFuIHRoYXQgd291bGQgYmUgcHJvZHVjZWQgYnkgYSBDREkgcHJvZHVjZXIgbWV0aG9kLgorICogVGhpcyBpcyB0byBtYWtlIHN1cmUgd2UgZG8gbm90IG1lc3MgdXAgd2l0aCBDREkgcHJvZHVjZXJzIHdpdGggSEsyLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BWZXRvZWQKK3B1YmxpYyBjbGFzcyBNZXRob2RQcm9kdWNlZEJlYW48VD4gaW1wbGVtZW50cyBWYWx1ZUhvbGRlcjxUPiB7CisKKyAgICBwcml2YXRlIGZpbmFsIFQgdmFsdWU7CisKKyAgICAvKioKKyAgICAgKiBNYWtlIGFuIGluc3RhbmNlIHdpdGggZ2l2ZW4gdmFsdWUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgTWV0aG9kUHJvZHVjZWRCZWFuKFQgdmFsdWUpIHsKKyAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFZhbHVlIGdldHRlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdmFsdWUuCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFQgZ2V0VmFsdWUoKSB7CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1Byb2R1Y2VyUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUHJvZHVjZXJSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ODg2OTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1Byb2R1Y2VyUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuUmVxdWVzdFNjb3BlZDsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworCisvKioKKyAqIFRoaXMgb25lIHdpbGwgZ2V0IGluamVjdGVkIHdpdGggYSBDREkgcHJvZHVjZXIuCisgKiBISzIgc2hvdWxkIG5vdCBtZXNzIHVwIHdpdGggdGhpcy4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUmVxdWVzdFNjb3BlZAorQFBhdGgoInByb2R1Y2VyIikKK3B1YmxpYyBjbGFzcyBQcm9kdWNlclJlc291cmNlIHsKKworICAgIEBJbmplY3QKKyAgICBNZXRob2RQcm9kdWNlZEJlYW48U3RyaW5nPiBtOworCisgICAgQEluamVjdAorICAgIEZpZWxkUHJvZHVjZWRCZWFuPFN0cmluZz4gZjsKKworICAgIC8qKgorICAgICAqIFJldHVybiBmaWVsZCBwcm9kdWNlZCBiZWFuIHZhbHVlLgorICAgICAqCisgICAgICogQHJldHVybiB2YWx1ZSBmcm9tIGZpZWxkIHByb2R1Y2VkIGJlYW4uCisgICAgICovCisgICAgQFBhdGgoImYiKQorICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdldEZpZWxkVmFsdWUoKSB7CisgICAgICAgIHJldHVybiBmLmdldFZhbHVlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIG1ldGhvZCBwcm9kdWNlZCBiZWFuIHZhbHVlLgorICAgICAqCisgICAgICogQHJldHVybiB2YWx1ZSBmcm9tIG1ldGhvZCBwcm9kdWNlZCBiZWFuLgorICAgICAqLworICAgIEBQYXRoKCJtIikKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBnZXRNZXRob2RWYWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIG0uZ2V0VmFsdWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1JldmVyc2VFY2hvLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1JldmVyc2VFY2hvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM4NTY1NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUmV2ZXJzZUVjaG8uamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKKy8qKgorICogRWNobyBpbXBsZW1lbnRhdGlvbiB0byByZXZlcnNlIGdpdmVuIGlucHV0LgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSZXZlcnNpbmcKK3B1YmxpYyBjbGFzcyBSZXZlcnNlRWNobyBpbXBsZW1lbnRzIEVjaG9TZXJ2aWNlIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZWNobyhTdHJpbmcgcykgeworICAgICAgICByZXR1cm4gcmV2ZXJzZVN0cmluZyhzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZyByZXZlcnNlU3RyaW5nKGZpbmFsIFN0cmluZyBzKSB7CisgICAgICAgIGZpbmFsIGludCBsZW4gPSBzLmxlbmd0aCgpOworCisgICAgICAgIGNoYXJbXSBjaGFycyA9IG5ldyBjaGFyW2xlbl07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgICAgIGNoYXJzW2ldID0gcy5jaGFyQXQobGVuIC0gaSAtIDEpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGNoYXJzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1JldmVyc2luZy5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9SZXZlcnNpbmcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmUwZmY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9SZXZlcnNpbmcuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YXguaW5qZWN0LlF1YWxpZmllcjsKKworLyoqCisgKiBRdWFsaWZpZXIgZm9yIHJldmVyc2luZyBlY2hvIHNlcnZpY2UuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQERvY3VtZW50ZWQKK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitAUXVhbGlmaWVyCitwdWJsaWMgQGludGVyZmFjZSBSZXZlcnNpbmcgeworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9SZXZlcnNpbmdFY2hvUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUmV2ZXJzaW5nRWNob1Jlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFlZWY1OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUmV2ZXJzaW5nRWNob1Jlc291cmNlLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5SZXF1ZXN0U2NvcGVkOworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CisKKy8qKgorICogQ0RJIGJhY2tlZCBKQVgtUlMgcmVzb3VyY2UgdG8gcmV2ZXJzZSBpbnB1dCBxdWVyeSBwYXJhbWV0ZXIgdXNpbmcKKyAqIHF1YWxpZmllZCBpbmplY3Rpb24gdG8gZ2V0IGEgQ0RJIGJhY2tlZCBzZXJ2aWNlIHByb3ZpZGVyLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSZXF1ZXN0U2NvcGVkCitAUGF0aCgicmV2ZXJzZSIpCitwdWJsaWMgY2xhc3MgUmV2ZXJzaW5nRWNob1Jlc291cmNlIHsKKworICAgIEBJbmplY3QgQFJldmVyc2luZyBFY2hvU2VydmljZSBlY2hvU2VydmljZTsKKworICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGVjaG8oQFF1ZXJ5UGFyYW0oInMiKSBTdHJpbmcgcykgeworICAgICAgICByZXR1cm4gZWNob1NlcnZpY2UuZWNobyhzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1NlY29uZE5vbkpheFJzQmVhbkluamVjdGVkUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvU2Vjb25kTm9uSmF4UnNCZWFuSW5qZWN0ZWRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNDY1MGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1NlY29uZE5vbkpheFJzQmVhbkluamVjdGVkUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuUmVxdWVzdFNjb3BlZDsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworCisvKioKKyAqIEpBWC1SUyByZXNvdXJjZSB0aGF0IGdldHMgaW5qZWN0ZWQgd2l0aCBhIENESSBtYW5hZ2VkIGJlYW4sCisgKiB0aGF0IGluY2x1ZGVzIEpBWC1SUyBpbmplY3Rpb24gcG9pbnRzLiBUaGUgdmVyeSBzYW1lIGJlYW4KKyAqIGdldHMgaW5qZWN0ZWQgYWxzbyB0byB7QGxpbmsgRmlyc3ROb25KYXhSc0JlYW5JbmplY3RlZFJlc291cmNlfS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgibm9uLWpheHJzLWJlYW4taW5qZWN0ZWQiKQorQFJlcXVlc3RTY29wZWQKK3B1YmxpYyBjbGFzcyBTZWNvbmROb25KYXhSc0JlYW5JbmplY3RlZFJlc291cmNlIHsKKworICAgIEBJbmplY3QKKyAgICBKYXhSc0luamVjdGVkQmVhbiBiZWFuOworCisgICAgQEdFVAorICAgIEBQYXRoKCJwYXRoLzIiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIGJlYW4uZ2V0VXJpSW5mbygpLmdldFBhdGgoKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImhlYWRlci8yIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldEFjY2VwdEhlYWRlcigpIHsKKyAgICAgICAgcmV0dXJuIGJlYW4uZ2V0VGVzdEhlYWRlcigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvU2Vjb25kYXJ5QXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvU2Vjb25kYXJ5QXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2NjMDMxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9TZWNvbmRhcnlBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0OworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJlRGVzdHJveTsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuQXBwbGljYXRpb25TY29wZWQ7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkJlYW5NYW5hZ2VyOworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKKy8qKgorICogU2Vjb25kYXJ5IEpBWC1SUyBhcHBsaWNhdGlvbiB0byBjb25maWd1cmUgcmVzb3VyY2VzLgorICogVGhpcyBvbmUgaXMgdG8gbWFrZSBzdXJlIHR3byBKZXJzZXkgYXBwcyBjb3VsZCBjby1leGlzdAorICogaW4gQ0RJIG1hbmFnZWQgZW52aXJvbm1lbnQgYW5kIEpBWC1SUyBpbmplY3Rpb24ga2VlcHMKKyAqIGZ1bmN0aW9uaW5nIGFzIGV4cGVjdGVkLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BBcHBsaWNhdGlvblBhdGgoInNlY29uZGFyeSIpCitAQXBwbGljYXRpb25TY29wZWQKK3B1YmxpYyBjbGFzcyBTZWNvbmRhcnlBcHBsaWNhdGlvbiBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgZmluYWwgU2V0PENsYXNzPD8+PiBjbGFzc2VzID0gbmV3IEhhc2hTZXQ8Q2xhc3M8Pz4+KCk7CisgICAgICAgIGNsYXNzZXMuYWRkKFNlY29uZE5vbkpheFJzQmVhbkluamVjdGVkUmVzb3VyY2UuY2xhc3MpOworICAgICAgICByZXR1cm4gY2xhc3NlczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1N0dXR0ZXJpbmcuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvU3R1dHRlcmluZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExY2MxYTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1N0dXR0ZXJpbmcuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YXguaW5qZWN0LlF1YWxpZmllcjsKKworLyoqCisgKiBRdWFsaWZpZXIgZm9yIHN0dXR0ZXJpbmcgZWNobyBzZXJ2aWNlLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BEb2N1bWVudGVkCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorQFF1YWxpZmllcgorcHVibGljIEBpbnRlcmZhY2UgU3R1dHRlcmluZyB7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1N0dXR0ZXJpbmdFY2hvLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1N0dXR0ZXJpbmdFY2hvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU3OWY4YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvU3R1dHRlcmluZ0VjaG8uamF2YQpAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUFVUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LkFwcGxpY2F0aW9uU2NvcGVkOworCisvKioKKyAqIEVjaG8gaW1wbGVtZW50YXRpb24gdG8gc3R1dHRlciBnaXZlbiBpbnB1dCBuLXRpbWVzLgorICogVGhlIHN0dXR0ZXIgZmFjdG9yIGNvdWxkIGJlIHNldCB2aWEgSkFYLVJTIGludGVyZmFjZS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAU3R1dHRlcmluZworQEFwcGxpY2F0aW9uU2NvcGVkCitAUGF0aCgic3R1dHRlci1zZXJ2aWNlLWZhY3RvciIpCitwdWJsaWMgY2xhc3MgU3R1dHRlcmluZ0VjaG8gaW1wbGVtZW50cyBFY2hvU2VydmljZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0ZBQ1RPUiA9IDI7CisgICAgcHJpdmF0ZSBpbnQgZmFjdG9yID0gTUlOX0ZBQ1RPUjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZWNobyhTdHJpbmcgcykgeworICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmFjdG9yOyBpKyspIHsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQocyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOworICAgIH0KKworICAgIEBQVVQKKyAgICBwdWJsaWMgdm9pZCBzZXRGYWN0b3IoU3RyaW5nIGZhY3RvcikgeworICAgICAgICB0aGlzLmZhY3RvciA9IGVuc3VyZVZhbGlkSW5wdXQoZmFjdG9yKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBnZXRGYWN0b3IoKSB7CisgICAgICAgIHJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKGZhY3Rvcik7CisgICAgfQorCisgICAgcHJpdmF0ZSBpbnQgZW5zdXJlVmFsaWRJbnB1dChTdHJpbmcgZmFjdG9yKSB0aHJvd3MgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgZmluYWwgaW50IG5ld1ZhbHVlID0gSW50ZWdlci5wYXJzZUludChmYWN0b3IpOworICAgICAgICAgICAgaWYgKG5ld1ZhbHVlIDwgTUlOX0ZBQ1RPUikgeworICAgICAgICAgICAgICAgIHRocm93IGNyZWF0ZVdlYkFwcEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KCJOZXcgZmFjdG9yIGNhbiBub3QgYmUgbGVzc2VyIHRoZW4gJWQhIiwgTUlOX0ZBQ1RPUikpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ld1ZhbHVlOworICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gbmZlKSB7CisgICAgICAgICAgICB0aHJvdyBjcmVhdGVXZWJBcHBFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiRXJyb3IgcGFyc2luZyAlcyBhcyBhbiBpbnRlZ2VyISIsIGZhY3RvcikpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiBjcmVhdGVXZWJBcHBFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKworICAgICAgICByZXR1cm4gbmV3IFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKAorCisgICAgICAgICAgICAgICAgUmVzcG9uc2Uuc3RhdHVzKFJlc3BvbnNlLlN0YXR1cy5CQURfUkVRVUVTVCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC50eXBlKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgICAgICAgICAgICAgICAgICAgICAgLmVudGl0eShFbnRpdHkudGV4dChtZXNzYWdlKSkuYnVpbGQoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9TdHV0dGVyaW5nRWNob1Jlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1N0dXR0ZXJpbmdFY2hvUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2Q1YTU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9TdHV0dGVyaW5nRWNob1Jlc291cmNlLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LkFwcGxpY2F0aW9uU2NvcGVkOworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKKworLyoqCisgKiBDREkgYmFja2VkIEpBWC1SUyByZXNvdXJjZSB0byBzdHV0dGVyIGlucHV0IHF1ZXJ5IHBhcmFtZXRlci4KKyAqIFVzZXMgcXVhbGlmaWVkIGluamVjdGlvbiB0byBnZXQgYSBDREkgYmFja2VkIHNlcnZpY2UgcHJvdmlkZXIuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uU2NvcGVkCitAUGF0aCgic3R1dHRlciIpCitwdWJsaWMgY2xhc3MgU3R1dHRlcmluZ0VjaG9SZXNvdXJjZSB7CisKKyAgICBASW5qZWN0IEBTdHV0dGVyaW5nIEVjaG9TZXJ2aWNlIGVjaG9TZXJ2aWNlOworCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZWNobyhAUXVlcnlQYXJhbSgicyIpIFN0cmluZyBzKSB7CisgICAgICAgIHJldHVybiBlY2hvU2VydmljZS5lY2hvKHMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvVmFsdWVIb2xkZXIuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvVmFsdWVIb2xkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTA0NmZjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9WYWx1ZUhvbGRlci5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworLyoqCisgKiBIZWxwZXIgdHlwZSB0byBjaGVjayBDREkgcHJvZHVjZXIgbWVjaGFuaXNtIGlzIG5vdCBicm9rZW4KKyAqIGJ5IGF1dG9tYXRpYyBISzIvQ0RJIGJpbmRpbmdzLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgVmFsdWVIb2xkZXI8VD4geworCisgICAgLyoqCisgICAgICogVmFsdWUgZ2V0dGVyLgorICAgICAqCisgICAgICogQHJldHVybiB2YWx1ZS4KKyAgICAgKi8KKyAgICBUIGdldFZhbHVlKCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2JlYW5zLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvYmVhbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZGYzNjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2JlYW5zLnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxiZWFucy8+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL2phdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5FeHRlbnNpb24gYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL2phdmF4LmVudGVycHJpc2UuaW5qZWN0LnNwaS5FeHRlbnNpb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMzMTYxNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkV4dGVuc2lvbgpAQCAtMCwwICsxIEBACitvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzLkN1c3RvbUV4dGVuc2lvbgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2JlYW5zLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9iZWFucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdkZjM2OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9iZWFucy54bWwKQEAgLTAsMCArMSwyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8YmVhbnMvPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjY3Y2E1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgoreG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzNfMC54c2QiCisgICAgICB2ZXJzaW9uPSIzLjAiPgorICAgIDxlbnYtZW50cnk+CisgICAgICAgIDxlbnYtZW50cnktbmFtZT5pbmplY3RlZFJlc291cmNlPC9lbnYtZW50cnktbmFtZT4KKyAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KKyAgICAgICAgPGVudi1lbnRyeS12YWx1ZT4xMDwvZW52LWVudHJ5LXZhbHVlPgorICAgIDwvZW52LWVudHJ5PgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9DZGlUZXN0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0NkaVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzEzN2E5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9DZGlUZXN0LmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuamJvc3Mud2VsZC5lbnZpcm9ubWVudC5zZS5XZWxkOworCisvKioKKyAqIFRlc3QgZm9yIENESSB3ZWIgYXBwbGljYXRpb24gcmVzb3VyY2VzLgorICogUnVuIHdpdGg6CisgKiA8cHJlPgorICogbXZuIGNsZWFuIHBhY2thZ2UKKyAqICRBU19IT01FL2Jpbi9hc2FkbWluIGRlcGxveSB0YXJnZXQvY2RpLXRlc3Qtd2ViYXBwCisgKiBtdm4gLURza2lwVGVzdHM9ZmFsc2UgdGVzdDwvcHJlPgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBDZGlUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBXZWxkIHdlbGQ7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB3ZWxkID0gbmV3IFdlbGQoKTsKKyAgICAgICAgd2VsZC5pbml0aWFsaXplKCk7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgd2VsZC5zaHV0ZG93bigpOworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgTWFpbkFwcGxpY2F0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFVSSSBnZXRCYXNlVXJpKCkgeworICAgICAgICByZXR1cm4gVXJpQnVpbGRlci5mcm9tVXJpKHN1cGVyLmdldEJhc2VVcmkoKSkucGF0aCgiY2RpLXRlc3Qtd2ViYXBwL21haW4iKS5idWlsZCgpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9Db25zdHJ1Y3RvckluamVjdGlvblRlc3QuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQ29uc3RydWN0b3JJbmplY3Rpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDI2MzA4NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQ29uc3RydWN0b3JJbmplY3Rpb25UZXN0LmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogUGFydCBvZiBKRVJTRVktMjUyNiByZXByb2R1Y2VyLiBXaXRob3V0IHRoZSBmaXgsIHRoZSBhcHBsaWNhdGlvbiB3b3VsZAorICogbm90IGRlcGxveSBhdCBhbGwuIFRoaXMgaXMganVzdCB0byBtYWtlIHN1cmUgdGhlIEpBWC1SUyBwYXJhbWV0ZXIgcHJvZHVjZXIKKyAqIGtlZXBzIHdvcmtpbmcgYXMgZXhwZWN0ZWQgd2l0aG91dCByZWdyZXNzaW9ucy4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFsYy5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBDb25zdHJ1Y3RvckluamVjdGlvblRlc3QgZXh0ZW5kcyBDZGlUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbnN0cnVjdG9ySW5qZWN0ZWRSZXNvdXJjZSgpIHsKKworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCkucGF0aCgiY3Rvci1pbmplY3RlZCIpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHBhdGhQYXJhbVJlc3BvbnNlID0gdGFyZ2V0LnBhdGgoInBhdGhQYXJhbSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChwYXRoUGFyYW1SZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocGF0aFBhcmFtUmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBpcygicGF0aFBhcmFtIikpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHF1ZXJ5UGFyYW1SZXNwb25zZSA9IHRhcmdldC5wYXRoKCJxdWVyeVBhcmFtIikucXVlcnlQYXJhbSgicSIsICIxMjMiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQocXVlcnlQYXJhbVJlc3BvbnNlLmdldFN0YXR1cygpLCBpcygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChxdWVyeVBhcmFtUmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBpcygiMTIzIikpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIG1hdHJpeFBhcmFtUmVzcG9uc2UgPSB0YXJnZXQucGF0aCgibWF0cml4UGFyYW0iKS5tYXRyaXhQYXJhbSgibSIsICI0NTYiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQobWF0cml4UGFyYW1SZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQobWF0cml4UGFyYW1SZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGlzKCI0NTYiKSk7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgaGVhZGVyUGFyYW1SZXNwb25zZSA9IHRhcmdldC5wYXRoKCJoZWFkZXJQYXJhbSIpLnJlcXVlc3QoKS5oZWFkZXIoIkN1c3RvbS1IZWFkZXIiLCAiNzg5IikuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQoaGVhZGVyUGFyYW1SZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQoaGVhZGVyUGFyYW1SZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGlzKCI3ODkiKSk7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgY2RpUGFyYW1SZXNwb25zZSA9IHRhcmdldC5wYXRoKCJjZGlQYXJhbSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjZGlQYXJhbVJlc3BvbnNlLmdldFN0YXR1cygpLCBpcygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChjZGlQYXJhbVJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoImNkaS1wcm9kdWNlZCIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0NvdW50ZXJUZXN0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0NvdW50ZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJmNGY1ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQ291bnRlclRlc3QuamF2YQpAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CisKKy8qKgorICogUGFydCBvZiBKRVJTRVktMjY0MSByZXByb2R1Y2VyLiBBY2Nlc3NpbmcgQ0RJIGJlYW4gdGhhdCBoYXMgY3VzdG9tIENESQorICogZXh0ZW5zaW9uIGluamVjdGVkLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBDb3VudGVyVGVzdCBleHRlbmRzIENkaVRlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgeworCisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKS5wYXRoKCJjb3VudGVyIik7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgZmlyc3RSZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQoZmlyc3RSZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgIGludCBmaXJzdE51bWJlciA9IEludGVnZXIuZGVjb2RlKGZpcnN0UmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSBzZWNvbmRSZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQoc2Vjb25kUmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICBpbnQgc2Vjb25kTnVtYmVyID0gSW50ZWdlci5kZWNvZGUoc2Vjb25kUmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICBhc3NlcnRUcnVlKCJTZWNvbmQgcmVxdWVzdCBzaG91bGQgaGF2ZSBncmVhdGVyIG51bWJlciEiLCBzZWNvbmROdW1iZXIgPiBmaXJzdE51bWJlcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9KYXhSc0luamVjdGVkQ2RpQmVhblRlc3QuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvSmF4UnNJbmplY3RlZENkaUJlYW5UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZjYzg3YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvSmF4UnNJbmplY3RlZENkaUJlYW5UZXN0LmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogVGVzdCB0aGF0IGEgcmF3IENESSBtYW5hZ2VkIGJlYW4gZ2V0cyBKQVgtUlMgaW5qZWN0ZWQuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEpheFJzSW5qZWN0ZWRDZGlCZWFuVGVzdCBleHRlbmRzIENkaVRlc3QgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGF0aEFuZEhlYWRlcigpIHsKKyAgICAgICAgX3Rlc3RQYXRoQW5kSGVhZGVyKHRhcmdldCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgX3Rlc3RQYXRoQW5kSGVhZGVyKGZpbmFsIFdlYlRhcmdldCB3ZWJUYXJnZXQpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHdlYlRhcmdldC5wYXRoKCJub24tamF4cnMtYmVhbi1pbmplY3RlZCIpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHBhdGhSZXNwb25zZSA9IHRhcmdldC5wYXRoKCJwYXRoLzEiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQocGF0aFJlc3BvbnNlLmdldFN0YXR1cygpLCBpcygyMDApKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHBhdGggPSBwYXRoUmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworCisgICAgICAgIGFzc2VydFRoYXQocGF0aCwgaXMoIm5vbi1qYXhycy1iZWFuLWluamVjdGVkL3BhdGgvMSIpKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSBoZWFkZXJSZXNwb25zZSA9IHRhcmdldC5wYXRoKCJoZWFkZXIvMSIpLnJlcXVlc3QoKS5oZWFkZXIoIngtdGVzdCIsICJidW1tZXIiKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChoZWFkZXJSZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBoZWFkZXIgPSBoZWFkZXJSZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChoZWFkZXIsIGlzKCJidW1tZXIiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9Ob25KYXhSc0JlYW5KYXhSc0luamVjdGlvblRlc3QuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvTm9uSmF4UnNCZWFuSmF4UnNJbmplY3Rpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc3NWViZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvTm9uSmF4UnNCZWFuSmF4UnNJbmplY3Rpb25UZXN0LmphdmEKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseTIuaHR0cHNlcnZlci5Hcml6emx5SHR0cENvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5Mi5odHRwc2VydmVyLkdyaXp6bHlIdHRwQ29udGFpbmVyUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseTIuaHR0cHNlcnZlci5Hcml6emx5SHR0cFNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0LmhrMi5IazJJbmplY3Rpb25NYW5hZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guZ3JpenpseS5odHRwLnNlcnZlci5IdHRwSGFuZGxlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmdyaXp6bHkuaHR0cC5zZXJ2ZXIuSHR0cFNlcnZlcjsKKworaW1wb3J0IG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnM7CitpbXBvcnQgb3JnLmpib3NzLndlbGQuZW52aXJvbm1lbnQuc2UuV2VsZDsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkFzc3VtZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFRlc3QgdHdvIEplcnNleSBhcHBzIHJ1bm5pbmcgc2ltdWx0YW5lb3VzbHkgd2l0aGluIGEgc2luZ2xlIEdyaXp6bHkgSFRUUCBzZXJ2ZXIKKyAqIHRvIG1ha2Ugc3VyZSB0d28gaW5qZWN0aW9uIG1hbmFnZXJzIGRvIG5vdCBpbnRlcmZlcmUuIFRoZSB0ZXN0IGlzIG5vdCBleGVjdXRlZAorICogaWYgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdCAoR3JpenpseSkgdGVzdCBjb250YWluZXIgaGFzIGJlZW4gc2V0LgorICogRm9yIFNlcnZsZXQgYmFzZWQgY29udGFpbmVyIHRlc3RpbmcsIHRoZSBvdGhlciB0d28gdGVzdHMsIHtAbGluayBKYXhSc0luamVjdGVkQ2RpQmVhblRlc3R9CisgKiBhbmQge0BsaW5rIFNlY29uZEpheFJzSW5qZWN0ZWRDZGlCZWFuVGVzdH0sCisgKiBkbyB0aGUgc2FtZSBqb2IsIGJlY2F1c2UgdGhlIFdBUiBhcHBsaWNhdGlvbiBjb250YWlucyBib3RoIEplcnNleSBhcHBzIGFscmVhZHkuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIE5vbkpheFJzQmVhbkpheFJzSW5qZWN0aW9uVGVzdCB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBNQUlOX1VSSSA9ICIvbWFpbiI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VDT05EQVJZX1VSSSA9ICIvc2Vjb25kYXJ5IjsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBPUlRfTlVNQkVSID0gZ2V0U3lzdGVtUHJvcGVydHkoVGVzdFByb3BlcnRpZXMuQ09OVEFJTkVSX1BPUlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlci50b1N0cmluZyhUZXN0UHJvcGVydGllcy5ERUZBVUxUX0NPTlRBSU5FUl9QT1JUKSk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgTUFJTl9BUFBfVVJJID0gVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDoiICsgUE9SVF9OVU1CRVIgKyBNQUlOX1VSSSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIFNFQ09OREFSWV9BUFBfVVJJID0gVVJJLmNyZWF0ZSgiaHR0cDovL2xvY2FsaG9zdDoiICsgUE9SVF9OVU1CRVIgKyBTRUNPTkRBUllfVVJJKTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNEZWZhdWx0VGVzdENvbnRhaW5lckZhY3RvcnlTZXQgPSBpc0RlZmF1bHRUZXN0Q29udGFpbmVyRmFjdG9yeVNldCgpOworCisgICAgV2VsZCB3ZWxkOworICAgIEh0dHBTZXJ2ZXIgaHR0cFNlcnZlcjsKKworICAgIENsaWVudCBjbGllbnQ7CisgICAgV2ViVGFyZ2V0IG1haW5UYXJnZXQsIHNlY29uZGFyeVRhcmdldDsKKworICAgIEBCZWZvcmUKKyAgICBwdWJsaWMgdm9pZCBiZWZvcmUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZShIazJJbmplY3Rpb25NYW5hZ2VyRmFjdG9yeS5pc0ltbWVkaWF0ZVN0cmF0ZWd5KCkpOworCisgICAgICAgIGlmIChpc0RlZmF1bHRUZXN0Q29udGFpbmVyRmFjdG9yeVNldCkgeworICAgICAgICAgICAgaW5pdGlhbGl6ZVdlbGQoKTsKKyAgICAgICAgICAgIHN0YXJ0R3JpenpseUNvbnRhaW5lcigpOworICAgICAgICAgICAgaW5pdGlhbGl6ZUNsaWVudCgpOworICAgICAgICB9CisgICAgfQorCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgYWZ0ZXIoKSB7CisgICAgICAgIGlmIChIazJJbmplY3Rpb25NYW5hZ2VyRmFjdG9yeS5pc0ltbWVkaWF0ZVN0cmF0ZWd5KCkpIHsKKyAgICAgICAgICAgIGlmIChpc0RlZmF1bHRUZXN0Q29udGFpbmVyRmFjdG9yeVNldCkgeworICAgICAgICAgICAgICAgIGh0dHBTZXJ2ZXIuc2h1dGRvd25Ob3coKTsKKyAgICAgICAgICAgICAgICB3ZWxkLnNodXRkb3duKCk7CisgICAgICAgICAgICAgICAgY2xpZW50LmNsb3NlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXRoQW5kSGVhZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEFzc3VtZS5hc3N1bWVUaGF0KGlzRGVmYXVsdFRlc3RDb250YWluZXJGYWN0b3J5U2V0LCBDb3JlTWF0Y2hlcnMuaXModHJ1ZSkpOworICAgICAgICBKYXhSc0luamVjdGVkQ2RpQmVhblRlc3QuX3Rlc3RQYXRoQW5kSGVhZGVyKG1haW5UYXJnZXQpOworICAgICAgICBTZWNvbmRKYXhSc0luamVjdGVkQ2RpQmVhblRlc3QuX3Rlc3RQYXRoQW5kSGVhZGVyKHNlY29uZGFyeVRhcmdldCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemVXZWxkKCkgeworICAgICAgICB3ZWxkID0gbmV3IFdlbGQoKTsKKyAgICAgICAgd2VsZC5pbml0aWFsaXplKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHN0YXJ0R3JpenpseUNvbnRhaW5lcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIGZpcnN0Q29uZmlnID0gUmVzb3VyY2VDb25maWcuZm9yQXBwbGljYXRpb25DbGFzcyhNYWluQXBwbGljYXRpb24uY2xhc3MpOworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyBzZWNvbmRDb25maWcgPSBSZXNvdXJjZUNvbmZpZy5mb3JBcHBsaWNhdGlvbkNsYXNzKFNlY29uZGFyeUFwcGxpY2F0aW9uLmNsYXNzKTsKKworICAgICAgICBodHRwU2VydmVyID0gR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5LmNyZWF0ZUh0dHBTZXJ2ZXIoTUFJTl9BUFBfVVJJLCBmaXJzdENvbmZpZywgZmFsc2UpOworICAgICAgICBmaW5hbCBIdHRwSGFuZGxlciBzZWNvbmRIYW5kbGVyID0gY3JlYXRlR3JpenpseUNvbnRhaW5lcihzZWNvbmRDb25maWcpOworICAgICAgICBodHRwU2VydmVyLmdldFNlcnZlckNvbmZpZ3VyYXRpb24oKS5hZGRIdHRwSGFuZGxlcihzZWNvbmRIYW5kbGVyLCBTRUNPTkRBUllfVVJJKTsKKyAgICAgICAgaHR0cFNlcnZlci5zdGFydCgpOworICAgIH0KKworICAgIHByaXZhdGUgR3JpenpseUh0dHBDb250YWluZXIgY3JlYXRlR3JpenpseUNvbnRhaW5lcihmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZykgeworICAgICAgICByZXR1cm4gKG5ldyBHcml6emx5SHR0cENvbnRhaW5lclByb3ZpZGVyKCkpLmNyZWF0ZUNvbnRhaW5lcihHcml6emx5SHR0cENvbnRhaW5lci5jbGFzcywgcmVzb3VyY2VDb25maWcpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplQ2xpZW50KCkgeworICAgICAgICBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpOworICAgICAgICBtYWluVGFyZ2V0ID0gY2xpZW50LnRhcmdldChNQUlOX0FQUF9VUkkpOworICAgICAgICBzZWNvbmRhcnlUYXJnZXQgPSBjbGllbnQudGFyZ2V0KFNFQ09OREFSWV9BUFBfVVJJKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzRGVmYXVsdFRlc3RDb250YWluZXJGYWN0b3J5U2V0KCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgdGVzdENvbnRhaW5lckZhY3RvcnkgPSBnZXRTeXN0ZW1Qcm9wZXJ0eShUZXN0UHJvcGVydGllcy5DT05UQUlORVJfRkFDVE9SWSwgbnVsbCk7CisgICAgICAgIHJldHVybiB0ZXN0Q29udGFpbmVyRmFjdG9yeSA9PSBudWxsIHx8IFRlc3RQcm9wZXJ0aWVzLkRFRkFVTFRfQ09OVEFJTkVSX0ZBQ1RPUlkuZXF1YWxzKHRlc3RDb250YWluZXJGYWN0b3J5KTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0U3lzdGVtUHJvcGVydHkoZmluYWwgU3RyaW5nIHByb3BlcnR5TmFtZSwgZmluYWwgU3RyaW5nIGRlZmF1bHRWYWx1ZSkgeworICAgICAgICBmaW5hbCBQcm9wZXJ0aWVzIHN5c3RlbVByb3BlcnRpZXMgPSBTeXN0ZW0uZ2V0UHJvcGVydGllcygpOworICAgICAgICByZXR1cm4gc3lzdGVtUHJvcGVydGllcy5nZXRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUsIGRlZmF1bHRWYWx1ZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9QZXJSZXF1ZXN0QmVhblRlc3QuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUGVyUmVxdWVzdEJlYW5UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTlkMzk4NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUGVyUmVxdWVzdEJlYW5UZXN0LmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5jb250YWluc1N0cmluZzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIFRlc3QgZm9yIHRoZSByZXF1ZXN0IHNjb3BlZCByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGNsYXNzIFBlclJlcXVlc3RCZWFuVGVzdCBleHRlbmRzIENkaVRlc3QgeworCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPYmplY3RbXT4gdGVzdERhdGEoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXVtdIHsKKyAgICAgICAgICAgICAgICB7ImFscGhhIn0sCisgICAgICAgICAgICAgICAgeyJBQUEifSwKKyAgICAgICAgICAgICAgICB7IiQlXiJ9LAorICAgICAgICAgICAgICAgIHsiYSBiIn0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgZmluYWwgU3RyaW5nIHg7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgeCBuZXcgdGVzdCBjYXNlIGJhc2VkIG9uIHRoZSBhYm92ZSBkZWZpbmVkIHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0geCBxdWVyeSBwYXJhbWV0ZXIgdmFsdWUKKyAgICAgKi8KKyAgICBwdWJsaWMgUGVyUmVxdWVzdEJlYW5UZXN0KFN0cmluZyB4KSB7CisgICAgICAgIHRoaXMueCA9IHg7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgeworCisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKS5wYXRoKCJqY2RpYmVhbi9wZXItcmVxdWVzdCIpLnF1ZXJ5UGFyYW0oIngiLCB4KTsKKworICAgICAgICBTdHJpbmcgcyA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChzLCBjb250YWluc1N0cmluZyh0YXJnZXQuZ2V0VXJpKCkudG9TdHJpbmcoKSkpOworICAgICAgICBhc3NlcnRUaGF0KHMsIGNvbnRhaW5zU3RyaW5nKFN0cmluZy5mb3JtYXQoInF1ZXJ5UGFyYW09JXMiLCB4KSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUGVyUmVxdWVzdERlcGVuZGVudEJlYW5UZXN0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1BlclJlcXVlc3REZXBlbmRlbnRCZWFuVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMmU4NzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1BlclJlcXVlc3REZXBlbmRlbnRCZWFuVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuY29udGFpbnNTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBUZXN0IGZvciB0aGUgcmVxdWVzdCBzY29wZWQgbWFuYWdlZCBiZWFuIHJlc291cmNlLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgUGVyUmVxdWVzdERlcGVuZGVudEJlYW5UZXN0IGV4dGVuZHMgQ2RpVGVzdCB7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzCisgICAgcHVibGljIHN0YXRpYyBMaXN0PE9iamVjdFtdPiB0ZXN0RGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW10geworICAgICAgICAgICAgICAgIHsiYWxwaGEifSwKKyAgICAgICAgICAgICAgICB7IkFBQSJ9LAorICAgICAgICAgICAgICAgIHsiJCVeIn0sCisgICAgICAgICAgICAgICAgeyJhIGIifQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBmaW5hbCBTdHJpbmcgeDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSB4IG5ldyB0ZXN0IGNhc2UgYmFzZWQgb24gdGhlIGFib3ZlIGRlZmluZWQgcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB4IHF1ZXJ5IHBhcmFtZXRlciB2YWx1ZQorICAgICAqLworICAgIHB1YmxpYyBQZXJSZXF1ZXN0RGVwZW5kZW50QmVhblRlc3QoU3RyaW5nIHgpIHsKKyAgICAgICAgdGhpcy54ID0geDsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXQoKSB7CisKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpLnBhdGgoImpjZGliZWFuL2RlcGVuZGVudC9wZXItcmVxdWVzdCIpLnF1ZXJ5UGFyYW0oIngiLCB4KTsKKworICAgICAgICBTdHJpbmcgcyA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChzLCBjb250YWluc1N0cmluZyh0YXJnZXQuZ2V0VXJpKCkudG9TdHJpbmcoKSkpOworICAgICAgICBhc3NlcnRUaGF0KHMsIGNvbnRhaW5zU3RyaW5nKFN0cmluZy5mb3JtYXQoInF1ZXJ5UGFyYW09JXMiLCB4KSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUHJvZHVjZXJUZXN0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1Byb2R1Y2VyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlY2Y4Y2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1Byb2R1Y2VyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CisKKy8qKgorICogQ2hlY2sgdGhhdCBhdXRvbWF0aWMgSEsyIGJpbmRpbmdzIGRvIG5vdCBicmVhayBDREkgcHJvZHVjZXIgbWVjaGFuaXNtLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBQcm9kdWNlclRlc3QgZXh0ZW5kcyBDZGlUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldCgpIHsKKworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCkucGF0aCgicHJvZHVjZXIiKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSBmaWVsZFJlc3BvbnNlID0gdGFyZ2V0LnBhdGgoImYiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQoZmllbGRSZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQoZmllbGRSZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGlzKCJmaWVsZCIpKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSBtZXRob2RSZXNwb25zZSA9IHRhcmdldC5wYXRoKCJtIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KG1ldGhvZFJlc3BvbnNlLmdldFN0YXR1cygpLCBpcygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChtZXRob2RSZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGlzKCJtZXRob2QiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9RdWFsaWZpZWRJbmplY3Rpb25TZXRHZXRUZXN0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1F1YWxpZmllZEluamVjdGlvblNldEdldFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTAxNzY0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9RdWFsaWZpZWRJbmplY3Rpb25TZXRHZXRUZXN0LmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXguaW5qZWN0LlF1YWxpZmllcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworCisvKioKKyAqIFRlc3QgQ0RJIGJlYW4gaW5qZWN0ZWQgdXNpbmcgYSB7QGxpbmsgUXVhbGlmaWVyfQorICogaXMgc2V0dXAgdmlhIEpBWC1SUyBpbnRlcmZhY2UgZmlyc3QuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFF1YWxpZmllZEluamVjdGlvblNldEdldFRlc3QgZXh0ZW5kcyBDZGlUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNldEdldCgpIHsKKworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgZmFjdG9yVGFyZ2V0ID0gdGFyZ2V0KCkucGF0aCgic3R1dHRlci1zZXJ2aWNlLWZhY3RvciIpOworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgc3R1dHRlclRhcmdldCA9IHRhcmdldCgpLnBhdGgoInN0dXR0ZXIiKTsKKworICAgICAgICBmYWN0b3JUYXJnZXQucmVxdWVzdCgpLnB1dChFbnRpdHkudGV4dCgiMyIpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHNob3VsZEJlVHJpcHBsZWQgPSBzdHV0dGVyVGFyZ2V0LnF1ZXJ5UGFyYW0oInMiLCAibGluY29sbiIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRUaGF0KHNob3VsZEJlVHJpcHBsZWQsIGlzKCJsaW5jb2xubGluY29sbmxpbmNvbG4iKSk7CisKKyAgICAgICAgZmFjdG9yVGFyZ2V0LnJlcXVlc3QoKS5wdXQoRW50aXR5LnRleHQoIjIiKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBzaG91bGRCZURvdWJsZWQgPSBzdHV0dGVyVGFyZ2V0LnF1ZXJ5UGFyYW0oInMiLCAibGluY29sbiIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRUaGF0KHNob3VsZEJlRG91YmxlZCwgaXMoImxpbmNvbG5saW5jb2xuIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUmV2ZXJzZUVjaG9UZXN0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1JldmVyc2VFY2hvVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjM2M1Y2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1JldmVyc2VFY2hvVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIFRlc3QgZm9yIHF1YWxpZmllZCBpbmplY3Rpb24uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBSZXZlcnNlRWNob1Rlc3QgZXh0ZW5kcyBDZGlUZXN0IHsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8T2JqZWN0W10+IHRlc3REYXRhKCkgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W11bXSB7CisgICAgICAgICAgICAgICAgeyJhbHBoYSIsICJhaHBsYSJ9LAorICAgICAgICAgICAgICAgIHsiZ29nb2wiLCAibG9nb2cifSwKKyAgICAgICAgICAgICAgICB7ImVsY2FybyIsICJvcmFjbGUifQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBmaW5hbCBTdHJpbmcgaW4sIG91dDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBpbnN0YW5jZSB3aXRoIHRoZSBhYm92ZSB0ZXN0IGRhdGEgaW5qZWN0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW4gcXVlcnkgcGFyYW1ldGVyLgorICAgICAqIEBwYXJhbSBvdXQgZXhwZWN0ZWQgb3V0cHV0LgorICAgICAqLworICAgIHB1YmxpYyBSZXZlcnNlRWNob1Rlc3QoU3RyaW5nIGluLCBTdHJpbmcgb3V0KSB7CisgICAgICAgIHRoaXMuaW4gPSBpbjsKKyAgICAgICAgdGhpcy5vdXQgPSBvdXQ7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgeworICAgICAgICBXZWJUYXJnZXQgcmV2ZXJzZVNlcnZpY2UgPSB0YXJnZXQoKS5wYXRoKCJyZXZlcnNlIikucXVlcnlQYXJhbSgicyIsIGluKTsKKyAgICAgICAgU3RyaW5nIHMgPSByZXZlcnNlU2VydmljZS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRoYXQocywgZXF1YWxUbyhvdXQpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1NlY29uZEpheFJzSW5qZWN0ZWRDZGlCZWFuVGVzdC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9TZWNvbmRKYXhSc0luamVjdGVkQ2RpQmVhblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjczZGU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9TZWNvbmRKYXhSc0luamVjdGVkQ2RpQmVhblRlc3QuamF2YQpAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuamJvc3Mud2VsZC5lbnZpcm9ubWVudC5zZS5XZWxkOworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIFRlc3QgdGhhdCBhIHJhdyBDREkgbWFuYWdlZCBiZWFuIGdldHMgSkFYLVJTIGluamVjdGVkLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBTZWNvbmRKYXhSc0luamVjdGVkQ2RpQmVhblRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKyAgICBXZWxkIHdlbGQ7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB3ZWxkID0gbmV3IFdlbGQoKTsKKyAgICAgICAgd2VsZC5pbml0aWFsaXplKCk7CisgICAgICAgIHN1cGVyLnNldFVwKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgd2VsZC5zaHV0ZG93bigpOworICAgICAgICBzdXBlci50ZWFyRG93bigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgU2Vjb25kYXJ5QXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVVJJIGdldEJhc2VVcmkoKSB7CisgICAgICAgIHJldHVybiBVcmlCdWlsZGVyLmZyb21Vcmkoc3VwZXIuZ2V0QmFzZVVyaSgpKS5wYXRoKCJjZGktdGVzdC13ZWJhcHAvc2Vjb25kYXJ5IikuYnVpbGQoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXRoQW5kSGVhZGVyKCkgeworICAgICAgICBfdGVzdFBhdGhBbmRIZWFkZXIodGFyZ2V0KCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBfdGVzdFBhdGhBbmRIZWFkZXIoZmluYWwgV2ViVGFyZ2V0IHdlYlRhcmdldCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gd2ViVGFyZ2V0LnBhdGgoIm5vbi1qYXhycy1iZWFuLWluamVjdGVkIik7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcGF0aFJlc3BvbnNlID0gdGFyZ2V0LnBhdGgoInBhdGgvMiIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChwYXRoUmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICBmaW5hbCBTdHJpbmcgcGF0aCA9IHBhdGhSZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChwYXRoLCBpcygibm9uLWpheHJzLWJlYW4taW5qZWN0ZWQvcGF0aC8yIikpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIGhlYWRlclJlc3BvbnNlID0gdGFyZ2V0LnBhdGgoImhlYWRlci8yIikucmVxdWVzdCgpLmhlYWRlcigieC10ZXN0IiwgImJ1bW1lcjIiKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChoZWFkZXJSZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBoZWFkZXIgPSBoZWFkZXJSZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChoZWFkZXIsIGlzKCJidW1tZXIyIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvU2luZ2xldG9uQmVhblRlc3QuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvU2luZ2xldG9uQmVhblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjM1ZTMwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9TaW5nbGV0b25CZWFuVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuY29udGFpbnNTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBUZXN0IGZvciB0aGUgYXBwbGljYXRpb24gc2NvcGVkIHJlc291cmNlLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgU2luZ2xldG9uQmVhblRlc3QgZXh0ZW5kcyBDZGlUZXN0IHsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8T2JqZWN0W10+IHRlc3REYXRhKCkgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W11bXSB7CisgICAgICAgICAgICAgICAgeyJhbHBoYSIsICJiZXRhIn0sCisgICAgICAgICAgICAgICAgeyIxIiwgIjIifQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBmaW5hbCBTdHJpbmcgcCwgeDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBpbnN0YW5jZSB3aXRoIHRoZSBhYm92ZSB0ZXN0IGRhdGEgaW5qZWN0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcCBwYXRoIHBhcmFtZXRlci4KKyAgICAgKiBAcGFyYW0geCBxdWVyeSBwYXJhbWV0ZXIuCisgICAgICovCisgICAgcHVibGljIFNpbmdsZXRvbkJlYW5UZXN0KFN0cmluZyBwLCBTdHJpbmcgeCkgeworICAgICAgICB0aGlzLnAgPSBwOworICAgICAgICB0aGlzLnggPSB4OworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldCgpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHNpbmdsZXRvbiA9IHRhcmdldCgpLnBhdGgoImpjZGliZWFuL3NpbmdsZXRvbiIpLnBhdGgocCkucXVlcnlQYXJhbSgieCIsIHgpOworICAgICAgICBTdHJpbmcgcyA9IHNpbmdsZXRvbi5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRoYXQocywgY29udGFpbnNTdHJpbmcoc2luZ2xldG9uLmdldFVyaSgpLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzLCBjb250YWluc1N0cmluZyhTdHJpbmcuZm9ybWF0KCJwPSVzIiwgcCkpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzLCBjb250YWluc1N0cmluZyhTdHJpbmcuZm9ybWF0KCJxdWVyeVBhcmFtPSVzIiwgeCkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb3VudGVyKCkgeworCisgICAgICAgIGZpbmFsIFdlYlRhcmdldCBjb3VudGVyID0gdGFyZ2V0KCkucGF0aCgiamNkaWJlYW4vc2luZ2xldG9uIikucGF0aChwKS5xdWVyeVBhcmFtKCJ4IiwgeCkucGF0aCgiY291bnRlciIpOworCisgICAgICAgIGlmICghRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkuZ2V0Q2xhc3MoKSkpIHsKKyAgICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgdGhpcyB3b3JrYXJvdW5kIG9uY2UgSkVSU0VZLTI3NDQgaXMgcmVzb2x2ZWQKKyAgICAgICAgICAgIGNvdW50ZXIucmVxdWVzdCgpLnB1dChFbnRpdHkudGV4dCgiMTAiKSk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgYzEwID0gY291bnRlci5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRoYXQoYzEwLCBjb250YWluc1N0cmluZygiMTAiKSk7CisKKyAgICAgICAgU3RyaW5nIGMxMSA9IGNvdW50ZXIucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KGMxMSwgY29udGFpbnNTdHJpbmcoIjExIikpOworCisgICAgICAgIGNvdW50ZXIucmVxdWVzdCgpLnB1dChFbnRpdHkudGV4dCgiMzIiKSk7CisKKyAgICAgICAgU3RyaW5nIGMzMiA9IGNvdW50ZXIucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KGMzMiwgY29udGFpbnNTdHJpbmcoIjMyIikpOworCisgICAgICAgIGNvdW50ZXIucmVxdWVzdCgpLnB1dChFbnRpdHkudGV4dCgiMTAiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhjZXB0aW9uKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgZXhjZXB0aW9uID0gdGFyZ2V0KCkucGF0aCgiamNkaWJlYW4vc2luZ2xldG9uIikucGF0aChwKS5xdWVyeVBhcmFtKCJ4IiwgeCkucGF0aCgiZXhjZXB0aW9uIik7CisgICAgICAgIGFzc2VydFRoYXQoZXhjZXB0aW9uLnJlcXVlc3QoKS5nZXQoKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGNvbnRhaW5zU3RyaW5nKCJKRENJQmVhbkV4Y2VwdGlvbiIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1NpbmdsZXRvbkRlcGVuZGVudEJlYW5UZXN0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktdGVzdC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1NpbmdsZXRvbkRlcGVuZGVudEJlYW5UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWEyMWFlOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvU2luZ2xldG9uRGVwZW5kZW50QmVhblRlc3QuamF2YQpAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmNvbnRhaW5zU3RyaW5nOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogVGVzdCBmb3IgdGhlIGFwcGxpY2F0aW9uIHNjb3BlZCBtYW5hZ2VkIGJlYW4gcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBTaW5nbGV0b25EZXBlbmRlbnRCZWFuVGVzdCBleHRlbmRzIENkaVRlc3QgeworCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPYmplY3RbXT4gdGVzdERhdGEoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXVtdIHsKKyAgICAgICAgICAgICAgICB7ImFscGhhIiwgImJldGEifSwKKyAgICAgICAgICAgICAgICB7IjEiLCAiMiJ9CisgICAgICAgIH0pOworICAgIH0KKworICAgIGZpbmFsIFN0cmluZyBwLCB4OworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGluc3RhbmNlIHdpdGggdGhlIGFib3ZlIHRlc3QgZGF0YSBpbmplY3RlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwIHBhdGggcGFyYW1ldGVyLgorICAgICAqIEBwYXJhbSB4IHF1ZXJ5IHBhcmFtZXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgU2luZ2xldG9uRGVwZW5kZW50QmVhblRlc3QoU3RyaW5nIHAsIFN0cmluZyB4KSB7CisgICAgICAgIHRoaXMucCA9IHA7CisgICAgICAgIHRoaXMueCA9IHg7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgc2luZ2xldG9uID0gdGFyZ2V0KCkucGF0aCgiamNkaWJlYW4vZGVwZW5kZW50L3NpbmdsZXRvbiIpLnBhdGgocCkucXVlcnlQYXJhbSgieCIsIHgpOworICAgICAgICBTdHJpbmcgcyA9IHNpbmdsZXRvbi5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRoYXQocywgY29udGFpbnNTdHJpbmcoc2luZ2xldG9uLmdldFVyaSgpLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzLCBjb250YWluc1N0cmluZyhTdHJpbmcuZm9ybWF0KCJwPSVzIiwgcCkpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzLCBjb250YWluc1N0cmluZyhTdHJpbmcuZm9ybWF0KCJxdWVyeVBhcmFtPSVzIiwgeCkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb3VudGVyKCkgeworCisgICAgICAgIGZpbmFsIFdlYlRhcmdldCBjb3VudGVyID0gdGFyZ2V0KCkucGF0aCgiamNkaWJlYW4vZGVwZW5kZW50L3NpbmdsZXRvbiIpLnBhdGgocCkucXVlcnlQYXJhbSgieCIsIHgpLnBhdGgoImNvdW50ZXIiKTsKKworICAgICAgICBpZiAoIUV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpLmdldENsYXNzKCkpKSB7CisgICAgICAgICAgICAvLyBUT0RPOiByZW1vdmUgdGhpcyB3b3JrYXJvdW5kIG9uY2UgSkVSU0VZLTI3NDQgaXMgcmVzb2x2ZWQKKyAgICAgICAgICAgIGNvdW50ZXIucmVxdWVzdCgpLnB1dChFbnRpdHkudGV4dCgiMTAiKSk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmcgYzEwID0gY291bnRlci5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRoYXQoYzEwLCBjb250YWluc1N0cmluZygiMTAiKSk7CisKKyAgICAgICAgU3RyaW5nIGMxMSA9IGNvdW50ZXIucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KGMxMSwgY29udGFpbnNTdHJpbmcoIjExIikpOworCisgICAgICAgIGNvdW50ZXIucmVxdWVzdCgpLnB1dChFbnRpdHkudGV4dCgiMzIiKSk7CisKKyAgICAgICAgU3RyaW5nIGMzMiA9IGNvdW50ZXIucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KGMzMiwgY29udGFpbnNTdHJpbmcoIjMyIikpOworCisgICAgICAgIGNvdW50ZXIucmVxdWVzdCgpLnB1dChFbnRpdHkudGV4dCgiMTAiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXhjZXB0aW9uKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgZXhjZXB0aW9uID0gdGFyZ2V0KCkucGF0aCgiamNkaWJlYW4vZGVwZW5kZW50L3NpbmdsZXRvbiIpLnBhdGgocCkucXVlcnlQYXJhbSgieCIsIHgpLnBhdGgoImV4Y2VwdGlvbiIpOworICAgICAgICBhc3NlcnRUaGF0KGV4Y2VwdGlvbi5yZXF1ZXN0KCkuZ2V0KCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBjb250YWluc1N0cmluZygiSkRDSUJlYW5EZXBlbmRlbnRFeGNlcHRpb24iKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9TdHV0dGVyRWNob1Rlc3QuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvU3R1dHRlckVjaG9UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMwZGMyNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvU3R1dHRlckVjaG9UZXN0LmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBUZXN0IGZvciBxdWFsaWZpZWQgaW5qZWN0aW9uLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgU3R1dHRlckVjaG9UZXN0IGV4dGVuZHMgQ2RpVGVzdCB7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzCisgICAgcHVibGljIHN0YXRpYyBMaXN0PE9iamVjdFtdPiB0ZXN0RGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW117CisgICAgICAgICAgICB7ImFscGhhIiwgImFscGhhYWxwaGEifSwKKyAgICAgICAgICAgIHsiZ29nb2wiLCAiZ29nb2xnb2dvbCJ9LAorICAgICAgICAgICAgeyJlbGNhcm8iLCAiZWxjYXJvZWxjYXJvIn0KKyAgICAgICAgfSk7CisgICAgfTsKKworICAgIGZpbmFsIFN0cmluZyBpbiwgb3V0OworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGluc3RhbmNlIHdpdGggdGhlIGFib3ZlIHRlc3QgZGF0YSBpbmplY3RlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbiBxdWVyeSBwYXJhbWV0ZXIuCisgICAgICogQHBhcmFtIG91dCBleHBlY3RlZCBvdXRwdXQuCisgICAgICovCisgICAgcHVibGljIFN0dXR0ZXJFY2hvVGVzdChTdHJpbmcgaW4sIFN0cmluZyBvdXQpIHsKKyAgICAgICAgdGhpcy5pbiA9IGluOworICAgICAgICB0aGlzLm91dCA9IG91dDsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXQoKSB7CisgICAgICAgIFN0cmluZyBzID0gdGFyZ2V0KCkucGF0aCgic3R1dHRlciIpLnF1ZXJ5UGFyYW0oInMiLCBpbikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KHMsIGVxdWFsVG8ob3V0KSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXRlc3Qtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9UaW1lclRlc3QuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvVGltZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE0YmEzMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS10ZXN0LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvVGltZXJUZXN0LmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKKworLyoqCisgKiBSZXByb2R1Y2VyIGZvciBKRVJTRVktMTc0Ny4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgVGltZXJUZXN0IGV4dGVuZHMgQ2RpVGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXQoKSB7CisKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpLnBhdGgoImpjZGliZWFuL2RlcGVuZGVudC90aW1lciIpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIGZpcnN0UmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KGZpcnN0UmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICBsb25nIGZpcnN0TWlsbGlzID0gTG9uZy5kZWNvZGUoZmlyc3RSZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICBzbGVlcCgyKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSBzZWNvbmRSZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQoc2Vjb25kUmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICBsb25nIHNlY29uZE1pbGxpcyA9IExvbmcuZGVjb2RlKHNlY29uZFJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiU2Vjb25kIHJlcXVlc3Qgc2hvdWxkIGhhdmUgZ3JlYXRlciBtaWxsaXMhIiwgc2Vjb25kTWlsbGlzID4gZmlyc3RNaWxsaXMpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzbGVlcChsb25nIG1zKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAobXMpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihUaW1lclRlc3QuY2xhc3MuZ2V0TmFtZSgpKS5sb2coTGV2ZWwuU0VWRVJFLCBudWxsLCBleCk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDkxZWM0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20tY2ZnLXdlYmFwcC9wb20ueG1sCkBAIC0wLDAgKzEsOTggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1jZmctd2ViYXBwPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWNkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHA8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIEplcnNleSBDREkgdGVzdCB3ZWIgYXBwbGljYXRpb24sIHRoaXMgb25lIHVzZXMgSmVyc2V5IChub24gSkFYLVJTKSBjb21wb25lbnQgaW5qZWN0aW9uIGFuZCBKZXJzZXkvQ0RJIFNQSSB0byBjb25maWcKKyAgICAgICAgSEsyIGN1c3RvbSBiaW5kaW5ncy4KKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNkaTF4PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY2RpMXgtdHJhbnNhY3Rpb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktc2VydmVyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LmFubm90YXRpb248L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5hbm5vdGF0aW9uLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC50cmFuc2FjdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LnRyYW5zYWN0aW9uLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lbnRlcnByaXNlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2RpLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItYnVuZGxlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHR5cGU+cG9tPC90eXBlPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxmaW5hbE5hbWU+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9maW5hbE5hbWU+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxza2lwVGVzdHM+JHtza2lwVGVzdHN9PC9za2lwVGVzdHM+CisgICAgICAgICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk+JHt0ZXN0Q29udGFpbmVyRmFjdG9yeX08L2plcnNleS5jb25maWcudGVzdC5jb250YWluZXIuZmFjdG9yeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+JHt0ZXN0Q29udGFpbmVyUG9ydH08L2plcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydD4KKyAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPHNraXBUZXN0cz50cnVlPC9za2lwVGVzdHM+CisgICAgICAgIDx0ZXN0Q29udGFpbmVyRmFjdG9yeT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk8L3Rlc3RDb250YWluZXJGYWN0b3J5PgorICAgICAgICA8dGVzdENvbnRhaW5lclBvcnQ+ODA4MDwvdGVzdENvbnRhaW5lclBvcnQ+CisgICAgPC9wcm9wZXJ0aWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20tY2ZnLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQXBwRWNoby5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20tY2ZnLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQXBwRWNoby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZjNlZmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1jZmctd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9BcHBFY2hvLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LkFwcGxpY2F0aW9uU2NvcGVkOworCisKKy8qKgorICogQXBwbGljYXRpb24gc3BlY2lmaWMgZWNobyBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAQXBwU3BlY2lmaWMKK0BBcHBsaWNhdGlvblNjb3BlZAorcHVibGljIGNsYXNzIEFwcEVjaG8gaW1wbGVtZW50cyBFY2hvU2VydmljZSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGVjaG8oU3RyaW5nIHMpIHsKKyAgICAgICAgcmV0dXJuICJBcHA6ICIgKyBzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0FwcFNjb3BlZEN0b3JJbmplY3RlZFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1jZmctd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9BcHBTY29wZWRDdG9ySW5qZWN0ZWRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNTNjMDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1jZmctd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9BcHBTY29wZWRDdG9ySW5qZWN0ZWRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LkFwcGxpY2F0aW9uU2NvcGVkOworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuTW9uaXRvcmluZ1N0YXRpc3RpY3M7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLkV4Y2VwdGlvbk1hcHBlcnM7CisKKy8qKgorICogQ0RJIGJhY2tlZCwgYXBwbGljYXRpb24gc2NvcGVkLCBKQVgtUlMgcmVzb3VyY2UgdG8gYmUgaW5qZWN0ZWQKKyAqIHZpYSBpdCdzIGNvbnN0cnVjdG9yIGZyb20gYm90aCBDREkgYW5kIEplcnNleSBISzIuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uU2NvcGVkCitAUGF0aCgiYXBwLWN0b3ItaW5qZWN0ZWQiKQorcHVibGljIGNsYXNzIEFwcFNjb3BlZEN0b3JJbmplY3RlZFJlc291cmNlIHsKKworICAgIC8vIENESSBpbmplY3RlZAorICAgIEVjaG9TZXJ2aWNlIGVjaG9TZXJ2aWNlOworCisgICAgLy8gSmVyc2V5IGluamVjdGVkCisgICAgUHJvdmlkZXI8Q29udGFpbmVyUmVxdWVzdD4gcmVxdWVzdDsKKyAgICBFeGNlcHRpb25NYXBwZXJzIG1hcHBlcnM7CisgICAgUHJvdmlkZXI8TW9uaXRvcmluZ1N0YXRpc3RpY3M+IHN0YXRzOworCisgICAgLy8gSmVyc2V5L0hLMiBjdXN0b20gaW5qZWN0ZWQKKyAgICBNeUFwcGxpY2F0aW9uLk15SW5qZWN0aW9uIGN1c3RvbUluamVjdGVkOworICAgIC8vIEplcnNleS9ISzIgY3VzdG9tIGluamVjdGVkCisgICAgQEluamVjdAorICAgIEhrMkluamVjdGVkVHlwZSBoazJJbmplY3RlZDsKKworICAgIC8vIHRvIG1ha2Ugd2VsZCBoYXBweQorICAgIHB1YmxpYyBBcHBTY29wZWRDdG9ySW5qZWN0ZWRSZXNvdXJjZSgpIHsKKyAgICB9CisKKyAgICBASW5qZWN0CisgICAgcHVibGljIEFwcFNjb3BlZEN0b3JJbmplY3RlZFJlc291cmNlKEBBcHBTcGVjaWZpYyBmaW5hbCBFY2hvU2VydmljZSBlY2hvU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUHJvdmlkZXI8Q29udGFpbmVyUmVxdWVzdD4gcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRXhjZXB0aW9uTWFwcGVycyBtYXBwZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBQcm92aWRlcjxNb25pdG9yaW5nU3RhdGlzdGljcz4gc3RhdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE15QXBwbGljYXRpb24uTXlJbmplY3Rpb24gY3VzdG9tSW5qZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEhrMkluamVjdGVkVHlwZSBoazJJbmplY3RlZCkgeworICAgICAgICB0aGlzLmVjaG9TZXJ2aWNlID0gZWNob1NlcnZpY2U7CisgICAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7CisgICAgICAgIHRoaXMubWFwcGVycyA9IG1hcHBlcnM7CisgICAgICAgIHRoaXMuc3RhdHMgPSBzdGF0czsKKyAgICAgICAgdGhpcy5jdXN0b21JbmplY3RlZCA9IGN1c3RvbUluamVjdGVkOworICAgICAgICB0aGlzLmhrMkluamVjdGVkID0gaGsySW5qZWN0ZWQ7CisgICAgfQorCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZWNobyhAUXVlcnlQYXJhbSgicyIpIGZpbmFsIFN0cmluZyBzKSB7CisgICAgICAgIHJldHVybiBlY2hvU2VydmljZS5lY2hvKHMpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgicGF0aC97cGFyYW19IikKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7CisgICAgICAgIHJldHVybiByZXF1ZXN0LmdldCgpLmdldFBhdGgodHJ1ZSk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJtYXBwZXJzIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1hcHBlcnMoKSB7CisgICAgICAgIHJldHVybiBtYXBwZXJzLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJyZXF1ZXN0Q291bnQiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhdGlzdGljc1Byb3BlcnR5KCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLnZhbHVlT2Yoc3RhdHMuZ2V0KCkuc25hcHNob3QoKS5nZXRSZXF1ZXN0U3RhdGlzdGljcygpLmdldFRpbWVXaW5kb3dTdGF0aXN0aWNzKCkuZ2V0KDBMKS5nZXRSZXF1ZXN0Q291bnQoKSk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJjdXN0b20iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3VzdG9tKCkgeworICAgICAgICByZXR1cm4gY3VzdG9tSW5qZWN0ZWQuZ2V0TmFtZSgpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiY3VzdG9tMiIpCisgICAgcHVibGljIFN0cmluZyBnZXRDdXN0b20yKCkgeworICAgICAgICByZXR1cm4gaGsySW5qZWN0ZWQuZ2V0TmFtZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0FwcFNjb3BlZEZpZWxkSW5qZWN0ZWRSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20tY2ZnLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQXBwU2NvcGVkRmllbGRJbmplY3RlZFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk5OWY2YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0FwcFNjb3BlZEZpZWxkSW5qZWN0ZWRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuQXBwbGljYXRpb25TY29wZWQ7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5Nb25pdG9yaW5nU3RhdGlzdGljczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuRXhjZXB0aW9uTWFwcGVyczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzLk15QXBwbGljYXRpb24uTXlJbmplY3Rpb247CisKKy8qKgorICogQ0RJIGJhY2tlZCwgYXBwbGljYXRpb24gc2NvcGVkLCBKQVgtUlMgcmVzb3VyY2UuCisgKiBJdCdzIGZpZWxkcyBhcmUgaW5qZWN0ZWQgZnJvbSBib3RoIENESSBhbmQgSmVyc2V5IEhLMi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAQXBwbGljYXRpb25TY29wZWQKK0BQYXRoKCJhcHAtZmllbGQtaW5qZWN0ZWQiKQorcHVibGljIGNsYXNzIEFwcFNjb3BlZEZpZWxkSW5qZWN0ZWRSZXNvdXJjZSB7CisKKyAgICAvLyBDREkgaW5qZWN0ZWQKKyAgICBASW5qZWN0CisgICAgQEFwcFNwZWNpZmljCisgICAgRWNob1NlcnZpY2UgZWNob1NlcnZpY2U7CisKKyAgICAvLyBKZXJzZXkgaW5qZWN0ZWQKKyAgICBASW5qZWN0CisgICAgUHJvdmlkZXI8Q29udGFpbmVyUmVxdWVzdD4gcmVxdWVzdDsKKyAgICBASW5qZWN0CisgICAgRXhjZXB0aW9uTWFwcGVycyBtYXBwZXJzOworICAgIEBJbmplY3QKKyAgICBQcm92aWRlcjxNb25pdG9yaW5nU3RhdGlzdGljcz4gc3RhdHM7CisKKyAgICAvLyBKZXJzZXkvSEsyIGN1c3RvbSBpbmplY3Rpb24KKyAgICBASW5qZWN0CisgICAgTXlJbmplY3Rpb24gY3VzdG9tSW5qZWN0ZWQ7CisgICAgLy8gSmVyc2V5L0hLMiBjdXN0b20gaW5qZWN0aW9uCisgICAgQEluamVjdAorICAgIEhrMkluamVjdGVkVHlwZSBoazJJbmplY3RlZDsKKworICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGVjaG8oQFF1ZXJ5UGFyYW0oInMiKSBTdHJpbmcgcykgeworICAgICAgICByZXR1cm4gZWNob1NlcnZpY2UuZWNobyhzKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInBhdGgve3BhcmFtfSIpCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgeworICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXQoKS5nZXRQYXRoKHRydWUpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgibWFwcGVycyIpCisgICAgcHVibGljIFN0cmluZyBnZXRNYXBwZXJzKCkgeworICAgICAgICByZXR1cm4gbWFwcGVycy50b1N0cmluZygpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgicmVxdWVzdENvdW50IikKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0YXRpc3RpY3NQcm9wZXJ0eSgpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKHN0YXRzLmdldCgpLnNuYXBzaG90KCkuZ2V0UmVxdWVzdFN0YXRpc3RpY3MoKS5nZXRUaW1lV2luZG93U3RhdGlzdGljcygpLmdldCgwTCkuZ2V0UmVxdWVzdENvdW50KCkpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiY3VzdG9tIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldEN1c3RvbSgpIHsKKyAgICAgICAgcmV0dXJuIGN1c3RvbUluamVjdGVkLmdldE5hbWUoKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImN1c3RvbTIiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3VzdG9tMigpIHsKKyAgICAgICAgcmV0dXJuIGhrMkluamVjdGVkLmdldE5hbWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1jZmctd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9BcHBTcGVjaWZpYy5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20tY2ZnLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQXBwU3BlY2lmaWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDBmYzZkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20tY2ZnLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQXBwU3BlY2lmaWMuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YXguaW5qZWN0LlF1YWxpZmllcjsKKworLyoqCisgKiBRdWFsaWZpZXIgZm9yIGFwcGxpY2F0aW9uIHNwZWNpZmljIGVjaG8gc2VydmljZS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitARG9jdW1lbnRlZAorQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BRdWFsaWZpZXIKK3B1YmxpYyBAaW50ZXJmYWNlIEFwcFNwZWNpZmljIHsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0VjaG9TZXJ2aWNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1jZmctd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9FY2hvU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NDViMjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1jZmctd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9FY2hvU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4LmluamVjdC5RdWFsaWZpZXI7CisKKy8qKgorICogU2ltcGxlIGVjaG8gc2VydmljZSB0byB0ZXN0IGluamVjdGlvbnMgdXNpbmcge0BsaW5rIFF1YWxpZmllcn0uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGludGVyZmFjZSBFY2hvU2VydmljZSB7CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlIGFuIGVjaG9lZCByZXNwb25zZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzIFN0cmluZyB0byBiZSBlY2hvZWQuCisgICAgICogQHJldHVybiBlY2hvZWQgaW5wdXQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBlY2hvKFN0cmluZyBzKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0hrMkluamVjdGVkVHlwZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20tY2ZnLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvSGsySW5qZWN0ZWRUeXBlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdkNzNlZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0hrMkluamVjdGVkVHlwZS5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworLyoqCisgKiBDREkgY29tcGxpYW50IGJlYW4uIEluamVjdGlvbiB3aWxsIGJlIGRlbGVnYXRlZCB0byBISzIgYW55d2F5LgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBIazJJbmplY3RlZFR5cGUgeworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworICAgIC8qKgorICAgICAqIE5vLWFyZyBjb25zdHJ1Y3RvciBtYWtlcyB0aGlzIGJlYW4gc3VpdGFibGUgZm9yIENESSBpbmplY3Rpb24uCisgICAgICovCisgICAgcHVibGljIEhrMkluamVjdGVkVHlwZSgpIHsKKyAgICAgICAgbmFtZSA9ICJDREkgd291bGQgbG92ZSB0aGlzIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBIazIgY3VzdG9tIGJpbmRlciBpcyBnb2luZyB0byB1c2UgdGhpcyBvbmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZQorICAgICAqLworICAgIHB1YmxpYyBIazJJbmplY3RlZFR5cGUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTaW1wbGUgZ2V0dGVyIHRvIHByb3ZlIHdoZXJlIHRoaXMgYmVhbiB3YXMgaW5pdGlhbGl6ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIG5hbWUgYXMgZGVmaW5lZCBhdCBiZWFuIGluaXRpYWxpemF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20tY2ZnLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvTXlBcHBsaWNhdGlvbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20tY2ZnLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvTXlBcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZmMyNDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1jZmctd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9NeUFwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkFic3RyYWN0QmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuaW50ZXJuYWwubW9uaXRvcmluZy5Nb25pdG9yaW5nRmVhdHVyZTsKKworLyoqCisgKiBKQVgtUlMgYXBwbGljYXRpb24gdG8gY29uZmlndXJlIHJlc291cmNlcy4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAQXBwbGljYXRpb25QYXRoKCIvKiIpCitwdWJsaWMgY2xhc3MgTXlBcHBsaWNhdGlvbiBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlJbmplY3Rpb24geworCisgICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7CisKKyAgICAgICAgcHVibGljIE15SW5qZWN0aW9uKFN0cmluZyBuYW1lKSB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgTXlBcHBsaWNhdGlvbigpIHsKKworICAgICAgICAvLyBKQVgtUlMgcmVzb3VyY2UgY2xhc3NlcworICAgICAgICByZWdpc3RlcihBcHBTY29wZWRGaWVsZEluamVjdGVkUmVzb3VyY2UuY2xhc3MpOworICAgICAgICByZWdpc3RlcihBcHBTY29wZWRDdG9ySW5qZWN0ZWRSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJlZ2lzdGVyKFJlcXVlc3RTY29wZWRGaWVsZEluamVjdGVkUmVzb3VyY2UuY2xhc3MpOworICAgICAgICByZWdpc3RlcihSZXF1ZXN0U2NvcGVkQ3RvckluamVjdGVkUmVzb3VyY2UuY2xhc3MpOworCisgICAgICAgIHJlZ2lzdGVyKG5ldyBBYnN0cmFjdEJpbmRlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICAgICAgICAgIGJpbmQobmV3IE15SW5qZWN0aW9uKCIxc3Q6IG5vIHdheSBDREkgd291bGQgY2hpbWUgaW4iKSkudG8oTXlJbmplY3Rpb24uY2xhc3MpOworICAgICAgICAgICAgICAgIGJpbmQobmV3IEhrMkluamVjdGVkVHlwZSgiMm5kOiBubyB3YXkgQ0RJIHdvdWxkIGNoaW1lIGluIikpLnRvKEhrMkluamVjdGVkVHlwZS5jbGFzcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIC8vIEplcnNleSBtb25pdG9yaW5nCisgICAgICAgIHJlZ2lzdGVyKE1vbml0b3JpbmdGZWF0dXJlLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1jZmctd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9NeUhrMlR5cGVzUHJvdmlkZXIuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL015SGsyVHlwZXNQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2NWU0MWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1jZmctd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9NeUhrMlR5cGVzUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpMXguc3BpLkhrMkN1c3RvbUJvdW5kVHlwZXNQcm92aWRlcjsKKworLyoqCisgKiBUZWxsIEplcnNleSBDREkgZXh0ZW5zaW9uIHdoYXQgdHlwZXMgc2hvdWxkIGJlIGJyaWRnZWQgZnJvbSBISzIgdG8gQ0RJLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBNeUhrMlR5cGVzUHJvdmlkZXIgaW1wbGVtZW50cyBIazJDdXN0b21Cb3VuZFR5cGVzUHJvdmlkZXIgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxUeXBlPiBnZXRIazJUeXBlcygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBIYXNoU2V0PFR5cGU+KCkge3sKKyAgICAgICAgICAgIGFkZChIazJJbmplY3RlZFR5cGUuY2xhc3MpOworICAgICAgICAgICAgYWRkKE15QXBwbGljYXRpb24uTXlJbmplY3Rpb24uY2xhc3MpOworICAgICAgICB9fTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1jZmctd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9SZXF1ZXN0RWNoby5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20tY2ZnLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUmVxdWVzdEVjaG8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGMyNmJjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20tY2ZnLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUmVxdWVzdEVjaG8uamF2YQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKKy8qKgorICogUmVxdWVzdCBzcGVjaWZpYyBlY2hvIGltcGxlbWVudGF0aW9uLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSZXF1ZXN0U3BlY2lmaWMKK3B1YmxpYyBjbGFzcyBSZXF1ZXN0RWNobyBpbXBsZW1lbnRzIEVjaG9TZXJ2aWNlIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZWNobyhTdHJpbmcgcykgeworICAgICAgICByZXR1cm4gIlJlcXVlc3Q6ICIgKyBzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1JlcXVlc3RTY29wZWRDdG9ySW5qZWN0ZWRSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20tY2ZnLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUmVxdWVzdFNjb3BlZEN0b3JJbmplY3RlZFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODgxODk1ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1JlcXVlc3RTY29wZWRDdG9ySW5qZWN0ZWRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LlJlcXVlc3RTY29wZWQ7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5Nb25pdG9yaW5nU3RhdGlzdGljczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuRXhjZXB0aW9uTWFwcGVyczsKKworLyoqCisgKiBDREkgYmFja2VkLCByZXF1ZXN0IHNjb3BlZCwgSkFYLVJTIHJlc291cmNlIHRvIGJlIGluamVjdGVkCisgKiB2aWEgaXQncyBjb25zdHJ1Y3RvciBmcm9tIGJvdGggQ0RJIGFuZCBKZXJzZXkgSEsyLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSZXF1ZXN0U2NvcGVkCitAUGF0aCgicmVxdWVzdC1jdG9yLWluamVjdGVkIikKK3B1YmxpYyBjbGFzcyBSZXF1ZXN0U2NvcGVkQ3RvckluamVjdGVkUmVzb3VyY2UgeworCisgICAgLy8gQ0RJIGluamVjdGVkCisgICAgRWNob1NlcnZpY2UgZWNob1NlcnZpY2U7CisKKyAgICAvLyBKZXJzZXkgaW5qZWN0ZWQKKyAgICBDb250YWluZXJSZXF1ZXN0IHJlcXVlc3Q7CisgICAgRXhjZXB0aW9uTWFwcGVycyBtYXBwZXJzOworICAgIFByb3ZpZGVyPE1vbml0b3JpbmdTdGF0aXN0aWNzPiBzdGF0czsKKworICAgIC8vIEplcnNleS9ISzIgY3VzdG9tIGluamVjdGVkCisgICAgTXlBcHBsaWNhdGlvbi5NeUluamVjdGlvbiBjdXN0b21JbmplY3RlZDsKKyAgICAvLyBKZXJzZXkvSEsyIGN1c3RvbSBpbmplY3RlZAorICAgIEhrMkluamVjdGVkVHlwZSBoazJJbmplY3RlZDsKKworICAgIC8vIHRvIG1ha2Ugd2VsZCBoYXBweQorICAgIHB1YmxpYyBSZXF1ZXN0U2NvcGVkQ3RvckluamVjdGVkUmVzb3VyY2UoKSB7CisgICAgfQorCisgICAgQEluamVjdAorICAgIHB1YmxpYyBSZXF1ZXN0U2NvcGVkQ3RvckluamVjdGVkUmVzb3VyY2UoQFJlcXVlc3RTcGVjaWZpYyBmaW5hbCBFY2hvU2VydmljZSBlY2hvU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbnRhaW5lclJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEV4Y2VwdGlvbk1hcHBlcnMgbWFwcGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFByb3ZpZGVyPE1vbml0b3JpbmdTdGF0aXN0aWNzPiBzdGF0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE15QXBwbGljYXRpb24uTXlJbmplY3Rpb24gY3VzdG9tSW5qZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBIazJJbmplY3RlZFR5cGUgaGsySW5qZWN0ZWQpIHsKKworICAgICAgICB0aGlzLmVjaG9TZXJ2aWNlID0gZWNob1NlcnZpY2U7CisgICAgICAgIHRoaXMubWFwcGVycyA9IG1hcHBlcnM7CisgICAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7CisgICAgICAgIHRoaXMuc3RhdHMgPSBzdGF0czsKKyAgICAgICAgdGhpcy5jdXN0b21JbmplY3RlZCA9IGN1c3RvbUluamVjdGVkOworICAgICAgICB0aGlzLmhrMkluamVjdGVkID0gaGsySW5qZWN0ZWQ7CisgICAgfQorCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZWNobyhAUXVlcnlQYXJhbSgicyIpIGZpbmFsIFN0cmluZyBzKSB7CisgICAgICAgIHJldHVybiBlY2hvU2VydmljZS5lY2hvKHMpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgicGF0aC97cGFyYW19IikKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7CisgICAgICAgIHJldHVybiByZXF1ZXN0LmdldFBhdGgodHJ1ZSk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJtYXBwZXJzIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1hcHBlcnMoKSB7CisgICAgICAgIHJldHVybiBtYXBwZXJzLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJyZXF1ZXN0Q291bnQiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhdGlzdGljc1Byb3BlcnR5KCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLnZhbHVlT2Yoc3RhdHMuZ2V0KCkuc25hcHNob3QoKS5nZXRSZXF1ZXN0U3RhdGlzdGljcygpLmdldFRpbWVXaW5kb3dTdGF0aXN0aWNzKCkuZ2V0KDBMKS5nZXRSZXF1ZXN0Q291bnQoKSk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJjdXN0b20iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3VzdG9tKCkgeworICAgICAgICByZXR1cm4gY3VzdG9tSW5qZWN0ZWQuZ2V0TmFtZSgpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiY3VzdG9tMiIpCisgICAgcHVibGljIFN0cmluZyBnZXRDdXN0b20yKCkgeworICAgICAgICByZXR1cm4gaGsySW5qZWN0ZWQuZ2V0TmFtZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1JlcXVlc3RTY29wZWRGaWVsZEluamVjdGVkUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1JlcXVlc3RTY29wZWRGaWVsZEluamVjdGVkUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjRmODhmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20tY2ZnLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUmVxdWVzdFNjb3BlZEZpZWxkSW5qZWN0ZWRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LlJlcXVlc3RTY29wZWQ7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkJlYW5NYW5hZ2VyOworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuTW9uaXRvcmluZ1N0YXRpc3RpY3M7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLkV4Y2VwdGlvbk1hcHBlcnM7CisKKy8qKgorICogQ0RJIGJhY2tlZCwgcmVxdWVzdCBzY29wZWQsIEpBWC1SUyByZXNvdXJjZS4KKyAqIEl0J3MgZmllbGRzIGFyZSBpbmplY3RlZCBmcm9tIGJvdGggQ0RJIGFuZCBKZXJzZXkgSEsyLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSZXF1ZXN0U2NvcGVkCitAUGF0aCgicmVxdWVzdC1maWVsZC1pbmplY3RlZCIpCitwdWJsaWMgY2xhc3MgUmVxdWVzdFNjb3BlZEZpZWxkSW5qZWN0ZWRSZXNvdXJjZSB7CisKKyAgICAvLyBidWlsdC1pbiBDREkgYmVhbgorICAgIEBJbmplY3QKKyAgICBCZWFuTWFuYWdlciBiZWFuTWFuYWdlcjsKKworICAgIC8vIENESSBpbmplY3RlZAorICAgIEBJbmplY3QKKyAgICBAUmVxdWVzdFNwZWNpZmljCisgICAgRWNob1NlcnZpY2UgZWNob1NlcnZpY2U7CisKKyAgICAvLyBKZXJzZXkgaW5qZWN0ZWQKKyAgICBASW5qZWN0CisgICAgQ29udGFpbmVyUmVxdWVzdCByZXF1ZXN0OworICAgIEBJbmplY3QKKyAgICBFeGNlcHRpb25NYXBwZXJzIG1hcHBlcnM7CisgICAgQEluamVjdAorICAgIFByb3ZpZGVyPE1vbml0b3JpbmdTdGF0aXN0aWNzPiBzdGF0czsKKworICAgIC8vIEN1c3RvbSBKZXJzZXkvSEsyIGluamVjdGVkCisgICAgQEluamVjdAorICAgIE15QXBwbGljYXRpb24uTXlJbmplY3Rpb24gY3VzdG9tSW5qZWN0ZWQ7CisgICAgLy8gQ3VzdG9tIEplcnNleS9ISzIgaW5qZWN0ZWQKKyAgICBASW5qZWN0CisgICAgSGsySW5qZWN0ZWRUeXBlIGhrMkluamVjdGVkOworCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZWNobyhAUXVlcnlQYXJhbSgicyIpIFN0cmluZyBzKSB7CisgICAgICAgIHJldHVybiBlY2hvU2VydmljZS5lY2hvKHMpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgicGF0aC97cGFyYW19IikKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7CisgICAgICAgIHJldHVybiByZXF1ZXN0LmdldFBhdGgodHJ1ZSk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJtYXBwZXJzIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1hcHBlcnMoKSB7CisgICAgICAgIHJldHVybiBtYXBwZXJzLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJyZXF1ZXN0Q291bnQiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhdGlzdGljc1Byb3BlcnR5KCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLnZhbHVlT2Yoc3RhdHMuZ2V0KCkuc25hcHNob3QoKS5nZXRSZXF1ZXN0U3RhdGlzdGljcygpLmdldFRpbWVXaW5kb3dTdGF0aXN0aWNzKCkuZ2V0KDBMKS5nZXRSZXF1ZXN0Q291bnQoKSk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJjdXN0b20iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3VzdG9tKCkgeworICAgICAgICByZXR1cm4gY3VzdG9tSW5qZWN0ZWQuZ2V0TmFtZSgpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiY3VzdG9tMiIpCisgICAgcHVibGljIFN0cmluZyBnZXRDdXN0b20yKCkgeworICAgICAgICByZXR1cm4gaGsySW5qZWN0ZWQuZ2V0TmFtZSgpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiYm0iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Qm0oKSB7CisgICAgICAgIHJldHVybiBiZWFuTWFuYWdlci50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1JlcXVlc3RTcGVjaWZpYy5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20tY2ZnLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUmVxdWVzdFNwZWNpZmljLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVmMDQ4ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1JlcXVlc3RTcGVjaWZpYy5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZheC5pbmplY3QuUXVhbGlmaWVyOworCisvKioKKyAqIFF1YWxpZmllciBmb3IgcmVxdWVzdCBzcGVjaWZpYyBlY2hvIHNlcnZpY2UuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQERvY3VtZW50ZWQKK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitAUXVhbGlmaWVyCitwdWJsaWMgQGludGVyZmFjZSBSZXF1ZXN0U3BlY2lmaWMgeworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20tY2ZnLXdlYmFwcC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTF4LnNwaS5IazJDdXN0b21Cb3VuZFR5cGVzUHJvdmlkZXIgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1jZmctd2ViYXBwL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpMXguc3BpLkhrMkN1c3RvbUJvdW5kVHlwZXNQcm92aWRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWQzNWY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20tY2ZnLXdlYmFwcC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTF4LnNwaS5IazJDdXN0b21Cb3VuZFR5cGVzUHJvdmlkZXIKQEAgLTAsMCArMSBAQAorb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlcy5NeUhrMlR5cGVzUHJvdmlkZXIKZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvYmVhbnMueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20tY2ZnLXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9iZWFucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdkZjM2OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvYmVhbnMueG1sCkBAIC0wLDAgKzEsMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPGJlYW5zLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjY3Y2E1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20tY2ZnLXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMjkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKK3htbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8zXzAueHNkIgorICAgICAgdmVyc2lvbj0iMy4wIj4KKyAgICA8ZW52LWVudHJ5PgorICAgICAgICA8ZW52LWVudHJ5LW5hbWU+aW5qZWN0ZWRSZXNvdXJjZTwvZW52LWVudHJ5LW5hbWU+CisgICAgICAgIDxlbnYtZW50cnktdHlwZT5qYXZhLmxhbmcuSW50ZWdlcjwvZW52LWVudHJ5LXR5cGU+CisgICAgICAgIDxlbnYtZW50cnktdmFsdWU+MTA8L2Vudi1lbnRyeS12YWx1ZT4KKyAgICA8L2Vudi1lbnRyeT4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0NkaVRlc3QuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0NkaVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWZlOTY0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20tY2ZnLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQ2RpVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCisvKioKKyAqIFRlc3QgZm9yIENESSB3ZWIgYXBwbGljYXRpb24gcmVzb3VyY2VzLgorICogUnVuIHdpdGg6CisgKiA8cHJlPgorICogbXZuIGNsZWFuIHBhY2thZ2UKKyAqICRBU19IT01FL2Jpbi9hc2FkbWluIGRlcGxveSB0YXJnZXQvY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAKKyAqIG12biAtRHNraXBUZXN0cz1mYWxzZSB0ZXN0PC9wcmU+CisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIENkaVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgTXlBcHBsaWNhdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBVUkkgZ2V0QmFzZVVyaSgpIHsKKyAgICAgICAgcmV0dXJuIFVyaUJ1aWxkZXIuZnJvbVVyaShzdXBlci5nZXRCYXNlVXJpKCkpLnBhdGgoImNkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAiKS5idWlsZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0N1c3RvbUluamVjdGlvblRlc3QuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0N1c3RvbUluamVjdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjU4ZjZkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20tY2ZnLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQ3VzdG9tSW5qZWN0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogVGVzdCBjdXN0b20gSEsyIGluamVjdGlvbi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGNsYXNzIEN1c3RvbUluamVjdGlvblRlc3QgZXh0ZW5kcyBDZGlUZXN0IHsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8T2JqZWN0W10+IHRlc3REYXRhKCkgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W11bXSB7CisgICAgICAgICAgICAgICAgeyJhcHAtZmllbGQtaW5qZWN0ZWQifSwKKyAgICAgICAgICAgICAgICB7ImFwcC1jdG9yLWluamVjdGVkIn0sCisgICAgICAgICAgICAgICAgeyJyZXF1ZXN0LWZpZWxkLWluamVjdGVkIn0sCisgICAgICAgICAgICAgICAgeyJyZXF1ZXN0LWN0b3ItaW5qZWN0ZWQifSwKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgZmluYWwgU3RyaW5nIHJlc291cmNlOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGluc3RhbmNlIHdpdGggdGhlIGFib3ZlIHRlc3QgZGF0YSBpbmplY3RlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZSBxdWVyeSBwYXJhbWV0ZXIuCisgICAgICovCisgICAgcHVibGljIEN1c3RvbUluamVjdGlvblRlc3QoZmluYWwgU3RyaW5nIHJlc291cmNlKSB7CisgICAgICAgIHRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayB0aGF0IGZvciBvbmUgbm8gTlBFIGhhcHBlbnMgb24gdGhlIHNlcnZlciBzaWRlLAorICAgICAqIGFuZCB0aGUgY3VzdG9tIGJvdW5kIGluc3RhbmNlIG9mIHtAbGluayBIazJJbmplY3RlZFR5cGV9IGdldHMgaW5qZWN0ZWQuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tSGsySW5qZWN0aW9uMSgpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpLnBhdGgocmVzb3VyY2UpLnBhdGgoImN1c3RvbSIpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKCIxc3Q6IG5vIHdheSBDREkgd291bGQgY2hpbWUgaW4iKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgdGhhdCBmb3Igb25lIG5vIE5QRSBoYXBwZW5zIG9uIHRoZSBzZXJ2ZXIgc2lkZSwKKyAgICAgKiBhbmQgdGhlIGN1c3RvbSBib3VuZCBpbnN0YW5jZSBvZiB7QGxpbmsgTXlBcHBsaWNhdGlvbi5NeUluamVjdGlvbn0gZ2V0cyBpbmplY3RlZC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21IazJJbmplY3Rpb24yKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCkucGF0aChyZXNvdXJjZSkucGF0aCgiY3VzdG9tMiIpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKCIybmQ6IG5vIHdheSBDREkgd291bGQgY2hpbWUgaW4iKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20tY2ZnLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvRXhjZXB0aW9uTWFwcGVyc1Rlc3QuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0V4Y2VwdGlvbk1hcHBlcnNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY3NTM0OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0V4Y2VwdGlvbk1hcHBlcnNUZXN0LmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBUZXN0IGZvciBleGNlcHRpb24gbWFwcGVyIGluamVjdGlvbi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGNsYXNzIEV4Y2VwdGlvbk1hcHBlcnNUZXN0IGV4dGVuZHMgQ2RpVGVzdCB7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzCisgICAgcHVibGljIHN0YXRpYyBMaXN0PE9iamVjdFtdPiB0ZXN0RGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW10geworICAgICAgICAgICAgICAgIHsiYXBwLWZpZWxkLWluamVjdGVkIn0sCisgICAgICAgICAgICAgICAgeyJhcHAtY3Rvci1pbmplY3RlZCJ9LAorICAgICAgICAgICAgICAgIHsicmVxdWVzdC1maWVsZC1pbmplY3RlZCJ9LAorICAgICAgICAgICAgICAgIHsicmVxdWVzdC1jdG9yLWluamVjdGVkIn0sCisgICAgICAgIH0pOworICAgIH0KKworICAgIGZpbmFsIFN0cmluZyByZXNvdXJjZTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBpbnN0YW5jZSB3aXRoIHRoZSBhYm92ZSB0ZXN0IGRhdGEgaW5qZWN0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgcXVlcnkgcGFyYW1ldGVyLgorICAgICAqLworICAgIHB1YmxpYyBFeGNlcHRpb25NYXBwZXJzVGVzdChmaW5hbCBTdHJpbmcgcmVzb3VyY2UpIHsKKyAgICAgICAgdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIHRoYXQgZm9yIG9uZSBubyBOUEUgaGFwcGVucyBvbiB0aGUgc2VydmVyIHNpZGUsIGFuZCBmb3IgdHdvCisgICAgICogdGhlIGluamVjdGVkIG1hcHBlcnMgcmVtYWlucyB0aGUgc2FtZSBhY3Jvc3MgcmVxdWVzdHMuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFwcGVyc05vdE51bGwoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKS5wYXRoKHJlc291cmNlKS5wYXRoKCJtYXBwZXJzIik7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIGZpcnN0UmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KGZpcnN0UmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oMjAwKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBmaXJzdFZhbHVlID0gZmlyc3RSZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRoYXQodGFyZ2V0LnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbyhmaXJzdFZhbHVlKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20tY2ZnLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvTW9uaXRvcmluZ1Rlc3QuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL01vbml0b3JpbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjVhZWQ4NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL01vbml0b3JpbmdUZXN0LmphdmEKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogVGVzdCBmb3IgbW9uaXRvcmluZyBzdGF0aXN0aWNzIGluamVjdGlvbi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGNsYXNzIE1vbml0b3JpbmdUZXN0IGV4dGVuZHMgQ2RpVGVzdCB7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzCisgICAgcHVibGljIHN0YXRpYyBMaXN0PE9iamVjdFtdPiB0ZXN0RGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW10geworICAgICAgICAgICAgICAgIHsiYXBwLWZpZWxkLWluamVjdGVkIn0sCisgICAgICAgICAgICAgICAgeyJhcHAtY3Rvci1pbmplY3RlZCJ9LAorICAgICAgICAgICAgICAgIHsicmVxdWVzdC1maWVsZC1pbmplY3RlZCJ9LAorICAgICAgICAgICAgICAgIHsicmVxdWVzdC1jdG9yLWluamVjdGVkIn0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgZmluYWwgU3RyaW5nIHJlc291cmNlOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGluc3RhbmNlIHdpdGggdGhlIGFib3ZlIHRlc3QgZGF0YSBpbmplY3RlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZSB1cmkgb2YgcmVzb3VyY2UgdG8gYmUgdGVzdGVkLgorICAgICAqLworICAgIHB1YmxpYyBNb25pdG9yaW5nVGVzdChmaW5hbCBTdHJpbmcgcmVzb3VyY2UpIHsKKyAgICAgICAgdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIE1ha2Ugc2V2ZXJhbCByZXF1ZXN0cyBhbmQgY2hlY2sgdGhlIGNvdW50ZXIga2VlcHMgaW5jcmVtZW50aW5nLgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24gaW4gY2FzZSBvZiB1bmV4cGVjdGVkIHRlc3QgZmFpbHVyZS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1ZXN0Q291bnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpLnBhdGgocmVzb3VyY2UpLnBhdGgoInJlcXVlc3RDb3VudCIpOworICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7IC8vIHRoaXMgaXMgdG8gYWxsb3cgc3RhdGlzdGljcyBvbiB0aGUgc2VydmVyIHNpZGUgdG8gZ2V0IHVwZGF0ZWQKKyAgICAgICAgZmluYWwgaW50IHN0YXJ0ID0gSW50ZWdlci5kZWNvZGUodGFyZ2V0LnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgNDsgaSsrKSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMCk7IC8vIHRoaXMgaXMgdG8gYWxsb3cgc3RhdGlzdGljcyBvbiB0aGUgc2VydmVyIHNpZGUgdG8gZ2V0IHVwZGF0ZWQKKyAgICAgICAgICAgIGZpbmFsIGludCBuZXh0ID0gSW50ZWdlci5kZWNvZGUodGFyZ2V0LnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgICAgICBhc3NlcnRUaGF0KFN0cmluZy5mb3JtYXQoInRlc3RpbmcgJXMiLCByZXNvdXJjZSksIG5leHQsIGVxdWFsVG8oc3RhcnQgKyBpKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1jZmctd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9SZXF1ZXN0U2Vuc2l0aXZlVGVzdC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20tY2ZnLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUmVxdWVzdFNlbnNpdGl2ZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzFiZWZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20tY2ZnLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUmVxdWVzdFNlbnNpdGl2ZVRlc3QuamF2YQpAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIFRlc3QgaW5qZWN0aW9uIG9mIHJlcXVlc3QgZGVwZW5kaW5nIGluc3RhbmNlcyB3b3JrcyBhcyBleHBlY3RlZC4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGNsYXNzIFJlcXVlc3RTZW5zaXRpdmVUZXN0IGV4dGVuZHMgQ2RpVGVzdCB7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzCisgICAgcHVibGljIHN0YXRpYyBMaXN0PE9iamVjdFtdPiB0ZXN0RGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW10geworICAgICAgICAgICAgICAgIHsiYXBwLWZpZWxkLWluamVjdGVkIiwgImFscGhhIiwgIkFwcDogYWxwaGEifSwKKyAgICAgICAgICAgICAgICB7ImFwcC1maWVsZC1pbmplY3RlZCIsICJnb2dvbCIsICJBcHA6IGdvZ29sIn0sCisgICAgICAgICAgICAgICAgeyJhcHAtZmllbGQtaW5qZWN0ZWQiLCAiZWxjYXJvIiwgIkFwcDogZWxjYXJvIn0sCisgICAgICAgICAgICAgICAgeyJhcHAtY3Rvci1pbmplY3RlZCIsICJhbHBoYSIsICJBcHA6IGFscGhhIn0sCisgICAgICAgICAgICAgICAgeyJhcHAtY3Rvci1pbmplY3RlZCIsICJnb2dvbCIsICJBcHA6IGdvZ29sIn0sCisgICAgICAgICAgICAgICAgeyJhcHAtY3Rvci1pbmplY3RlZCIsICJlbGNhcm8iLCAiQXBwOiBlbGNhcm8ifSwKKyAgICAgICAgICAgICAgICB7InJlcXVlc3QtZmllbGQtaW5qZWN0ZWQiLCAiYWxwaGEiLCAiUmVxdWVzdDogYWxwaGEifSwKKyAgICAgICAgICAgICAgICB7InJlcXVlc3QtZmllbGQtaW5qZWN0ZWQiLCAiZ29nb2wiLCAiUmVxdWVzdDogZ29nb2wifSwKKyAgICAgICAgICAgICAgICB7InJlcXVlc3QtZmllbGQtaW5qZWN0ZWQiLCAib3JhY2xlIiwgIlJlcXVlc3Q6IG9yYWNsZSJ9LAorICAgICAgICAgICAgICAgIHsicmVxdWVzdC1jdG9yLWluamVjdGVkIiwgImFscGhhIiwgIlJlcXVlc3Q6IGFscGhhIn0sCisgICAgICAgICAgICAgICAgeyJyZXF1ZXN0LWN0b3ItaW5qZWN0ZWQiLCAiZ29nb2wiLCAiUmVxdWVzdDogZ29nb2wifSwKKyAgICAgICAgICAgICAgICB7InJlcXVlc3QtY3Rvci1pbmplY3RlZCIsICJvcmFjbGUiLCAiUmVxdWVzdDogb3JhY2xlIn0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgZmluYWwgU3RyaW5nIHJlc291cmNlLCBzdHJhaWdodCwgZWNob2VkOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGluc3RhbmNlIHdpdGggdGhlIGFib3ZlIHRlc3QgZGF0YSBpbmplY3RlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZSB1cmkgb2YgdGhlIHJlc291cmNlIHRvIGJlIHRlc3RlZC4KKyAgICAgKiBAcGFyYW0gc3RyYWlnaHQgcmVxdWVzdCBzcGVjaWZpYyBpbnB1dC4KKyAgICAgKiBAcGFyYW0gZWNob2VkICAgQ0RJIGluamVjdGVkIHNlcnZpY2Ugc2hvdWxkIHByb2R1Y2UgdGhpcyBvdXQgb2YgcHJldmlvdXMsIHN0cmFpZ2h0LCBwYXJhbWV0ZXIuCisgICAgICovCisgICAgcHVibGljIFJlcXVlc3RTZW5zaXRpdmVUZXN0KGZpbmFsIFN0cmluZyByZXNvdXJjZSwgZmluYWwgU3RyaW5nIHN0cmFpZ2h0LCBmaW5hbCBTdHJpbmcgZWNob2VkKSB7CisgICAgICAgIHRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsKKyAgICAgICAgdGhpcy5zdHJhaWdodCA9IHN0cmFpZ2h0OworICAgICAgICB0aGlzLmVjaG9lZCA9IGVjaG9lZDsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDZGlJbmplY3Rpb24oKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBzID0gdGFyZ2V0KCkucGF0aChyZXNvdXJjZSkucXVlcnlQYXJhbSgicyIsIHN0cmFpZ2h0KS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRoYXQocywgZXF1YWxUbyhlY2hvZWQpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIazJJbmplY3Rpb24oKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBzID0gdGFyZ2V0KCkucGF0aChyZXNvdXJjZSkucGF0aCgicGF0aCIpLnBhdGgoc3RyYWlnaHQpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzLCBlcXVhbFRvKFN0cmluZy5mb3JtYXQoIiVzL3BhdGgvJXMiLCByZXNvdXJjZSwgc3RyYWlnaHQpKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20taGsyLWJhbm5lZC13ZWJhcHAvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWhrMi1iYW5uZWQtd2ViYXBwL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk4MDIzOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWhrMi1iYW5uZWQtd2ViYXBwL3BvbS54bWwKQEAgLTAsMCArMSwxMTIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+Y2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20taGsyLWJhbm5lZC13ZWJhcHA8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20taGsyLWJhbm5lZC13ZWJhcHA8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIEplcnNleSBDREkgdGVzdCB3ZWIgYXBwbGljYXRpb24sIHRoaXMgb25lIHVzZXMgSmVyc2V5IChub24gSkFYLVJTKSBjb21wb25lbnQgaW5qZWN0aW9uIEhLMiBjdXN0b20gYmluZGluZyBoYXMgYmVlbiBiYW5uZWQuCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jZGkxeDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNkaTF4LXRyYW5zYWN0aW9uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnRyYW5zYWN0aW9uPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXgudHJhbnNhY3Rpb24tYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY2RpMXgtYmFuLWN1c3RvbS1oazItYmluZGluZzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KKyAgICAgICAgICAgIDxleGNsdXNpb25zPgorICAgICAgICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb21tb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgud3MucnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LndzLnJzLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXNlcnZlcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5hbm5vdGF0aW9uPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguYW5ub3RhdGlvbi1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguZW50ZXJwcmlzZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmNkaS1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItYnVuZGxlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHR5cGU+cG9tPC90eXBlPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxmaW5hbE5hbWU+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9maW5hbE5hbWU+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxza2lwVGVzdHM+JHtza2lwVGVzdHN9PC9za2lwVGVzdHM+CisgICAgICAgICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk+JHt0ZXN0Q29udGFpbmVyRmFjdG9yeX08L2plcnNleS5jb25maWcudGVzdC5jb250YWluZXIuZmFjdG9yeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+JHt0ZXN0Q29udGFpbmVyUG9ydH08L2plcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydD4KKyAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPHNraXBUZXN0cz50cnVlPC9za2lwVGVzdHM+CisgICAgICAgIDx0ZXN0Q29udGFpbmVyRmFjdG9yeT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk8L3Rlc3RDb250YWluZXJGYWN0b3J5PgorICAgICAgICA8dGVzdENvbnRhaW5lclBvcnQ+ODA4MDwvdGVzdENvbnRhaW5lclBvcnQ+CisgICAgPC9wcm9wZXJ0aWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20taGsyLWJhbm5lZC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0FwcEVjaG8uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWhrMi1iYW5uZWQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9BcHBFY2hvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTZmM2VmYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWhrMi1iYW5uZWQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9BcHBFY2hvLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LkFwcGxpY2F0aW9uU2NvcGVkOworCisKKy8qKgorICogQXBwbGljYXRpb24gc3BlY2lmaWMgZWNobyBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAQXBwU3BlY2lmaWMKK0BBcHBsaWNhdGlvblNjb3BlZAorcHVibGljIGNsYXNzIEFwcEVjaG8gaW1wbGVtZW50cyBFY2hvU2VydmljZSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGVjaG8oU3RyaW5nIHMpIHsKKyAgICAgICAgcmV0dXJuICJBcHA6ICIgKyBzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWhrMi1iYW5uZWQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9BcHBTY29wZWRDdG9ySW5qZWN0ZWRSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20taGsyLWJhbm5lZC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0FwcFNjb3BlZEN0b3JJbmplY3RlZFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUwYTY4OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWhrMi1iYW5uZWQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9BcHBTY29wZWRDdG9ySW5qZWN0ZWRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LkFwcGxpY2F0aW9uU2NvcGVkOworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuTW9uaXRvcmluZ1N0YXRpc3RpY3M7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLkV4Y2VwdGlvbk1hcHBlcnM7CisKKy8qKgorICogQ0RJIGJhY2tlZCwgYXBwbGljYXRpb24gc2NvcGVkLCBKQVgtUlMgcmVzb3VyY2UgdG8gYmUgaW5qZWN0ZWQKKyAqIHZpYSBpdCdzIGNvbnN0cnVjdG9yIGZyb20gYm90aCBDREkgYW5kIEplcnNleSBISzIuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uU2NvcGVkCitAUGF0aCgiYXBwLWN0b3ItaW5qZWN0ZWQiKQorcHVibGljIGNsYXNzIEFwcFNjb3BlZEN0b3JJbmplY3RlZFJlc291cmNlIHsKKworICAgIC8vIENESSBpbmplY3RlZAorICAgIEVjaG9TZXJ2aWNlIGVjaG9TZXJ2aWNlOworCisgICAgLy8gSmVyc2V5IGluamVjdGVkCisgICAgUHJvdmlkZXI8Q29udGFpbmVyUmVxdWVzdD4gcmVxdWVzdDsKKyAgICBFeGNlcHRpb25NYXBwZXJzIG1hcHBlcnM7CisgICAgUHJvdmlkZXI8TW9uaXRvcmluZ1N0YXRpc3RpY3M+IHN0YXRzOworCisgICAgLy8gSmVyc2V5L0hLMiBjdXN0b20gaW5qZWN0ZWQKKyAgICBNeUFwcGxpY2F0aW9uLk15SW5qZWN0aW9uIGN1c3RvbUluamVjdGVkOworICAgIC8vIEplcnNleS9ISzIgY3VzdG9tIGluamVjdGVkCisgICAgQEluamVjdAorICAgIENkaUluamVjdGVkVHlwZSBoazJJbmplY3RlZDsKKworICAgIC8vIHRvIG1ha2Ugd2VsZCBoYXBweQorICAgIHB1YmxpYyBBcHBTY29wZWRDdG9ySW5qZWN0ZWRSZXNvdXJjZSgpIHsKKyAgICB9CisKKyAgICBASW5qZWN0CisgICAgcHVibGljIEFwcFNjb3BlZEN0b3JJbmplY3RlZFJlc291cmNlKEBBcHBTcGVjaWZpYyBmaW5hbCBFY2hvU2VydmljZSBlY2hvU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUHJvdmlkZXI8Q29udGFpbmVyUmVxdWVzdD4gcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRXhjZXB0aW9uTWFwcGVycyBtYXBwZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBQcm92aWRlcjxNb25pdG9yaW5nU3RhdGlzdGljcz4gc3RhdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE15QXBwbGljYXRpb24uTXlJbmplY3Rpb24gY3VzdG9tSW5qZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENkaUluamVjdGVkVHlwZSBoazJJbmplY3RlZCkgeworICAgICAgICB0aGlzLmVjaG9TZXJ2aWNlID0gZWNob1NlcnZpY2U7CisgICAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7CisgICAgICAgIHRoaXMubWFwcGVycyA9IG1hcHBlcnM7CisgICAgICAgIHRoaXMuc3RhdHMgPSBzdGF0czsKKyAgICAgICAgdGhpcy5jdXN0b21JbmplY3RlZCA9IGN1c3RvbUluamVjdGVkOworICAgICAgICB0aGlzLmhrMkluamVjdGVkID0gaGsySW5qZWN0ZWQ7CisgICAgfQorCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZWNobyhAUXVlcnlQYXJhbSgicyIpIGZpbmFsIFN0cmluZyBzKSB7CisgICAgICAgIHJldHVybiBlY2hvU2VydmljZS5lY2hvKHMpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgicGF0aC97cGFyYW19IikKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7CisgICAgICAgIHJldHVybiByZXF1ZXN0LmdldCgpLmdldFBhdGgodHJ1ZSk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJtYXBwZXJzIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1hcHBlcnMoKSB7CisgICAgICAgIHJldHVybiBtYXBwZXJzLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJyZXF1ZXN0Q291bnQiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhdGlzdGljc1Byb3BlcnR5KCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLnZhbHVlT2Yoc3RhdHMuZ2V0KCkuc25hcHNob3QoKS5nZXRSZXF1ZXN0U3RhdGlzdGljcygpLmdldFRpbWVXaW5kb3dTdGF0aXN0aWNzKCkuZ2V0KDBMKS5nZXRSZXF1ZXN0Q291bnQoKSk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJjdXN0b20iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3VzdG9tKCkgeworICAgICAgICByZXR1cm4gY3VzdG9tSW5qZWN0ZWQuZ2V0TmFtZSgpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiY3VzdG9tMiIpCisgICAgcHVibGljIFN0cmluZyBnZXRDdXN0b20yKCkgeworICAgICAgICByZXR1cm4gaGsySW5qZWN0ZWQuZ2V0TmFtZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWhrMi1iYW5uZWQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9BcHBTY29wZWRGaWVsZEluamVjdGVkUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWhrMi1iYW5uZWQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9BcHBTY29wZWRGaWVsZEluamVjdGVkUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzE2NDc0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20taGsyLWJhbm5lZC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0FwcFNjb3BlZEZpZWxkSW5qZWN0ZWRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuQXBwbGljYXRpb25TY29wZWQ7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5Nb25pdG9yaW5nU3RhdGlzdGljczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuRXhjZXB0aW9uTWFwcGVyczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzLk15QXBwbGljYXRpb24uTXlJbmplY3Rpb247CisKKy8qKgorICogQ0RJIGJhY2tlZCwgYXBwbGljYXRpb24gc2NvcGVkLCBKQVgtUlMgcmVzb3VyY2UuCisgKiBJdCdzIGZpZWxkcyBhcmUgaW5qZWN0ZWQgZnJvbSBib3RoIENESSBhbmQgSmVyc2V5IEhLMi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAQXBwbGljYXRpb25TY29wZWQKK0BQYXRoKCJhcHAtZmllbGQtaW5qZWN0ZWQiKQorcHVibGljIGNsYXNzIEFwcFNjb3BlZEZpZWxkSW5qZWN0ZWRSZXNvdXJjZSB7CisKKyAgICAvLyBDREkgaW5qZWN0ZWQKKyAgICBASW5qZWN0CisgICAgQEFwcFNwZWNpZmljCisgICAgRWNob1NlcnZpY2UgZWNob1NlcnZpY2U7CisKKyAgICAvLyBKZXJzZXkgaW5qZWN0ZWQKKyAgICBASW5qZWN0CisgICAgUHJvdmlkZXI8Q29udGFpbmVyUmVxdWVzdD4gcmVxdWVzdDsKKyAgICBASW5qZWN0CisgICAgRXhjZXB0aW9uTWFwcGVycyBtYXBwZXJzOworICAgIEBJbmplY3QKKyAgICBQcm92aWRlcjxNb25pdG9yaW5nU3RhdGlzdGljcz4gc3RhdHM7CisKKyAgICAvLyBKZXJzZXkvSEsyIGN1c3RvbSBpbmplY3Rpb24KKyAgICBASW5qZWN0CisgICAgTXlJbmplY3Rpb24gY3VzdG9tSW5qZWN0ZWQ7CisgICAgLy8gSmVyc2V5L0hLMiBjdXN0b20gaW5qZWN0aW9uCisgICAgQEluamVjdAorICAgIENkaUluamVjdGVkVHlwZSBoazJJbmplY3RlZDsKKworICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGVjaG8oQFF1ZXJ5UGFyYW0oInMiKSBTdHJpbmcgcykgeworICAgICAgICByZXR1cm4gZWNob1NlcnZpY2UuZWNobyhzKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInBhdGgve3BhcmFtfSIpCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgeworICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXQoKS5nZXRQYXRoKHRydWUpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgibWFwcGVycyIpCisgICAgcHVibGljIFN0cmluZyBnZXRNYXBwZXJzKCkgeworICAgICAgICByZXR1cm4gbWFwcGVycy50b1N0cmluZygpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgicmVxdWVzdENvdW50IikKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0YXRpc3RpY3NQcm9wZXJ0eSgpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKHN0YXRzLmdldCgpLnNuYXBzaG90KCkuZ2V0UmVxdWVzdFN0YXRpc3RpY3MoKS5nZXRUaW1lV2luZG93U3RhdGlzdGljcygpLmdldCgwTCkuZ2V0UmVxdWVzdENvdW50KCkpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiY3VzdG9tIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldEN1c3RvbSgpIHsKKyAgICAgICAgcmV0dXJuIGN1c3RvbUluamVjdGVkLmdldE5hbWUoKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImN1c3RvbTIiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3VzdG9tMigpIHsKKyAgICAgICAgcmV0dXJuIGhrMkluamVjdGVkLmdldE5hbWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1oazItYmFubmVkLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQXBwU3BlY2lmaWMuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWhrMi1iYW5uZWQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9BcHBTcGVjaWZpYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMGZjNmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1oazItYmFubmVkLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQXBwU3BlY2lmaWMuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YXguaW5qZWN0LlF1YWxpZmllcjsKKworLyoqCisgKiBRdWFsaWZpZXIgZm9yIGFwcGxpY2F0aW9uIHNwZWNpZmljIGVjaG8gc2VydmljZS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitARG9jdW1lbnRlZAorQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BRdWFsaWZpZXIKK3B1YmxpYyBAaW50ZXJmYWNlIEFwcFNwZWNpZmljIHsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWhrMi1iYW5uZWQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9DZGlJbmplY3RlZFR5cGUuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWhrMi1iYW5uZWQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9DZGlJbmplY3RlZFR5cGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGIxZmMyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20taGsyLWJhbm5lZC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0NkaUluamVjdGVkVHlwZS5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworLyoqCisgKiBDREkgY29tcGxpYW50IGJlYW4uIEluamVjdGlvbiB3aWxsIGJlIGRvbmUgYnkgQ0RJIGluIHRoaXMgYXBwbGljYXRpb24uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIENkaUluamVjdGVkVHlwZSB7CisKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisgICAgLyoqCisgICAgICogTm8tYXJnIGNvbnN0cnVjdG9yIG1ha2VzIHRoaXMgYmVhbiBzdWl0YWJsZSBmb3IgQ0RJIGluamVjdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQ2RpSW5qZWN0ZWRUeXBlKCkgeworICAgICAgICBuYW1lID0gIkNESSB3b3VsZCBsb3ZlIHRoaXMiOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhrMiBjdXN0b20gYmluZGVyIGlzIGdvaW5nIHRvIHVzZSB0aGlzIG9uZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW1lCisgICAgICovCisgICAgcHVibGljIENkaUluamVjdGVkVHlwZShTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNpbXBsZSBnZXR0ZXIgdG8gcHJvdmUgd2hlcmUgdGhpcyBiZWFuIHdhcyBpbml0aWFsaXplZC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbmFtZSBhcyBkZWZpbmVkIGF0IGJlYW4gaW5pdGlhbGl6YXRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1oazItYmFubmVkLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvRWNob1NlcnZpY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWhrMi1iYW5uZWQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9FY2hvU2VydmljZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3NDViMjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1oazItYmFubmVkLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvRWNob1NlcnZpY2UuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuUXVhbGlmaWVyOworCisvKioKKyAqIFNpbXBsZSBlY2hvIHNlcnZpY2UgdG8gdGVzdCBpbmplY3Rpb25zIHVzaW5nIHtAbGluayBRdWFsaWZpZXJ9LgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgRWNob1NlcnZpY2UgeworCisgICAgLyoqCisgICAgICogUHJvdmlkZSBhbiBlY2hvZWQgcmVzcG9uc2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcyBTdHJpbmcgdG8gYmUgZWNob2VkLgorICAgICAqIEByZXR1cm4gZWNob2VkIGlucHV0LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZWNobyhTdHJpbmcgcyk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1oazItYmFubmVkLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvTXlBcHBsaWNhdGlvbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20taGsyLWJhbm5lZC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL015QXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjlmNDNhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20taGsyLWJhbm5lZC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL015QXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGg7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQWJzdHJhY3RCaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5tb25pdG9yaW5nLk1vbml0b3JpbmdGZWF0dXJlOworCisvKioKKyAqIEpBWC1SUyBhcHBsaWNhdGlvbiB0byBjb25maWd1cmUgcmVzb3VyY2VzLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BBcHBsaWNhdGlvblBhdGgoIi8qIikKK3B1YmxpYyBjbGFzcyBNeUFwcGxpY2F0aW9uIGV4dGVuZHMgUmVzb3VyY2VDb25maWcgeworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeUluamVjdGlvbiB7CisKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbmFtZTsKKworICAgICAgICBwdWJsaWMgTXlJbmplY3Rpb24oKSB7CisgICAgICAgICAgICBuYW1lID0gIkNESSBpbmplY3RlZCI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgTXlJbmplY3Rpb24oU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gbmFtZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBNeUFwcGxpY2F0aW9uKCkgeworCisgICAgICAgIC8vIEpBWC1SUyByZXNvdXJjZSBjbGFzc2VzCisgICAgICAgIHJlZ2lzdGVyKEFwcFNjb3BlZEZpZWxkSW5qZWN0ZWRSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJlZ2lzdGVyKEFwcFNjb3BlZEN0b3JJbmplY3RlZFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgcmVnaXN0ZXIoUmVxdWVzdFNjb3BlZEZpZWxkSW5qZWN0ZWRSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJlZ2lzdGVyKFJlcXVlc3RTY29wZWRDdG9ySW5qZWN0ZWRSZXNvdXJjZS5jbGFzcyk7CisKKyAgICAgICAgcmVnaXN0ZXIobmV3IEFic3RyYWN0QmluZGVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgICAgICAgICAgYmluZChuZXcgTXlJbmplY3Rpb24oIjFzdDogdW51c2VkIEhLMiBiaW5kaW5nIikpLnRvKE15SW5qZWN0aW9uLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBiaW5kKG5ldyBDZGlJbmplY3RlZFR5cGUoIjJuZDogdW51c2VkIEhLMiBiaW5kaW5nIikpLnRvKENkaUluamVjdGVkVHlwZS5jbGFzcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworCisgICAgICAgIC8vIEplcnNleSBtb25pdG9yaW5nCisgICAgICAgIHJlZ2lzdGVyKE1vbml0b3JpbmdGZWF0dXJlLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1oazItYmFubmVkLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUmVxdWVzdEVjaG8uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWhrMi1iYW5uZWQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9SZXF1ZXN0RWNoby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYzI2YmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1oazItYmFubmVkLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUmVxdWVzdEVjaG8uamF2YQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKKy8qKgorICogUmVxdWVzdCBzcGVjaWZpYyBlY2hvIGltcGxlbWVudGF0aW9uLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSZXF1ZXN0U3BlY2lmaWMKK3B1YmxpYyBjbGFzcyBSZXF1ZXN0RWNobyBpbXBsZW1lbnRzIEVjaG9TZXJ2aWNlIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZWNobyhTdHJpbmcgcykgeworICAgICAgICByZXR1cm4gIlJlcXVlc3Q6ICIgKyBzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWhrMi1iYW5uZWQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9SZXF1ZXN0U2NvcGVkQ3RvckluamVjdGVkUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWhrMi1iYW5uZWQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9SZXF1ZXN0U2NvcGVkQ3RvckluamVjdGVkUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDgwZTBkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20taGsyLWJhbm5lZC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1JlcXVlc3RTY29wZWRDdG9ySW5qZWN0ZWRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LlJlcXVlc3RTY29wZWQ7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5Nb25pdG9yaW5nU3RhdGlzdGljczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuRXhjZXB0aW9uTWFwcGVyczsKKworLyoqCisgKiBDREkgYmFja2VkLCByZXF1ZXN0IHNjb3BlZCwgSkFYLVJTIHJlc291cmNlIHRvIGJlIGluamVjdGVkCisgKiB2aWEgaXQncyBjb25zdHJ1Y3RvciBmcm9tIGJvdGggQ0RJIGFuZCBKZXJzZXkgSEsyLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSZXF1ZXN0U2NvcGVkCitAUGF0aCgicmVxdWVzdC1jdG9yLWluamVjdGVkIikKK3B1YmxpYyBjbGFzcyBSZXF1ZXN0U2NvcGVkQ3RvckluamVjdGVkUmVzb3VyY2UgeworCisgICAgLy8gQ0RJIGluamVjdGVkCisgICAgRWNob1NlcnZpY2UgZWNob1NlcnZpY2U7CisKKyAgICAvLyBKZXJzZXkgaW5qZWN0ZWQKKyAgICBDb250YWluZXJSZXF1ZXN0IHJlcXVlc3Q7CisgICAgRXhjZXB0aW9uTWFwcGVycyBtYXBwZXJzOworICAgIFByb3ZpZGVyPE1vbml0b3JpbmdTdGF0aXN0aWNzPiBzdGF0czsKKworICAgIC8vIEplcnNleS9ISzIgY3VzdG9tIGluamVjdGVkCisgICAgTXlBcHBsaWNhdGlvbi5NeUluamVjdGlvbiBjdXN0b21JbmplY3RlZDsKKyAgICAvLyBKZXJzZXkvSEsyIGN1c3RvbSBpbmplY3RlZAorICAgIENkaUluamVjdGVkVHlwZSBoazJJbmplY3RlZDsKKworICAgIC8vIHRvIG1ha2Ugd2VsZCBoYXBweQorICAgIHB1YmxpYyBSZXF1ZXN0U2NvcGVkQ3RvckluamVjdGVkUmVzb3VyY2UoKSB7CisgICAgfQorCisgICAgQEluamVjdAorICAgIHB1YmxpYyBSZXF1ZXN0U2NvcGVkQ3RvckluamVjdGVkUmVzb3VyY2UoQFJlcXVlc3RTcGVjaWZpYyBmaW5hbCBFY2hvU2VydmljZSBlY2hvU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIENvbnRhaW5lclJlcXVlc3QgcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEV4Y2VwdGlvbk1hcHBlcnMgbWFwcGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFByb3ZpZGVyPE1vbml0b3JpbmdTdGF0aXN0aWNzPiBzdGF0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE15QXBwbGljYXRpb24uTXlJbmplY3Rpb24gY3VzdG9tSW5qZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDZGlJbmplY3RlZFR5cGUgaGsySW5qZWN0ZWQpIHsKKworICAgICAgICB0aGlzLmVjaG9TZXJ2aWNlID0gZWNob1NlcnZpY2U7CisgICAgICAgIHRoaXMubWFwcGVycyA9IG1hcHBlcnM7CisgICAgICAgIHRoaXMucmVxdWVzdCA9IHJlcXVlc3Q7CisgICAgICAgIHRoaXMuc3RhdHMgPSBzdGF0czsKKyAgICAgICAgdGhpcy5jdXN0b21JbmplY3RlZCA9IGN1c3RvbUluamVjdGVkOworICAgICAgICB0aGlzLmhrMkluamVjdGVkID0gaGsySW5qZWN0ZWQ7CisgICAgfQorCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZWNobyhAUXVlcnlQYXJhbSgicyIpIGZpbmFsIFN0cmluZyBzKSB7CisgICAgICAgIHJldHVybiBlY2hvU2VydmljZS5lY2hvKHMpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgicGF0aC97cGFyYW19IikKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7CisgICAgICAgIHJldHVybiByZXF1ZXN0LmdldFBhdGgodHJ1ZSk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJtYXBwZXJzIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1hcHBlcnMoKSB7CisgICAgICAgIHJldHVybiBtYXBwZXJzLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJyZXF1ZXN0Q291bnQiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhdGlzdGljc1Byb3BlcnR5KCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLnZhbHVlT2Yoc3RhdHMuZ2V0KCkuc25hcHNob3QoKS5nZXRSZXF1ZXN0U3RhdGlzdGljcygpLmdldFRpbWVXaW5kb3dTdGF0aXN0aWNzKCkuZ2V0KDBMKS5nZXRSZXF1ZXN0Q291bnQoKSk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJjdXN0b20iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3VzdG9tKCkgeworICAgICAgICByZXR1cm4gY3VzdG9tSW5qZWN0ZWQuZ2V0TmFtZSgpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiY3VzdG9tMiIpCisgICAgcHVibGljIFN0cmluZyBnZXRDdXN0b20yKCkgeworICAgICAgICByZXR1cm4gaGsySW5qZWN0ZWQuZ2V0TmFtZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWhrMi1iYW5uZWQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9SZXF1ZXN0U2NvcGVkRmllbGRJbmplY3RlZFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1oazItYmFubmVkLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUmVxdWVzdFNjb3BlZEZpZWxkSW5qZWN0ZWRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlY2YwMWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1oazItYmFubmVkLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUmVxdWVzdFNjb3BlZEZpZWxkSW5qZWN0ZWRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LlJlcXVlc3RTY29wZWQ7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5pbmplY3Quc3BpLkJlYW5NYW5hZ2VyOworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuTW9uaXRvcmluZ1N0YXRpc3RpY3M7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLkV4Y2VwdGlvbk1hcHBlcnM7CisKKy8qKgorICogQ0RJIGJhY2tlZCwgcmVxdWVzdCBzY29wZWQsIEpBWC1SUyByZXNvdXJjZS4KKyAqIEl0J3MgZmllbGRzIGFyZSBpbmplY3RlZCBmcm9tIGJvdGggQ0RJIGFuZCBKZXJzZXkgSEsyLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSZXF1ZXN0U2NvcGVkCitAUGF0aCgicmVxdWVzdC1maWVsZC1pbmplY3RlZCIpCitwdWJsaWMgY2xhc3MgUmVxdWVzdFNjb3BlZEZpZWxkSW5qZWN0ZWRSZXNvdXJjZSB7CisKKyAgICAvLyBidWlsdC1pbiBDREkgYmVhbgorICAgIEBJbmplY3QKKyAgICBCZWFuTWFuYWdlciBiZWFuTWFuYWdlcjsKKworICAgIC8vIENESSBpbmplY3RlZAorICAgIEBJbmplY3QKKyAgICBAUmVxdWVzdFNwZWNpZmljCisgICAgRWNob1NlcnZpY2UgZWNob1NlcnZpY2U7CisKKyAgICAvLyBKZXJzZXkgaW5qZWN0ZWQKKyAgICBASW5qZWN0CisgICAgQ29udGFpbmVyUmVxdWVzdCByZXF1ZXN0OworICAgIEBJbmplY3QKKyAgICBFeGNlcHRpb25NYXBwZXJzIG1hcHBlcnM7CisgICAgQEluamVjdAorICAgIFByb3ZpZGVyPE1vbml0b3JpbmdTdGF0aXN0aWNzPiBzdGF0czsKKworICAgIC8vIEN1c3RvbSBKZXJzZXkvSEsyIGluamVjdGVkCisgICAgQEluamVjdAorICAgIE15QXBwbGljYXRpb24uTXlJbmplY3Rpb24gY3VzdG9tSW5qZWN0ZWQ7CisgICAgLy8gQ3VzdG9tIEplcnNleS9ISzIgaW5qZWN0ZWQKKyAgICBASW5qZWN0CisgICAgQ2RpSW5qZWN0ZWRUeXBlIGhrMkluamVjdGVkOworCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZWNobyhAUXVlcnlQYXJhbSgicyIpIFN0cmluZyBzKSB7CisgICAgICAgIHJldHVybiBlY2hvU2VydmljZS5lY2hvKHMpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgicGF0aC97cGFyYW19IikKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7CisgICAgICAgIHJldHVybiByZXF1ZXN0LmdldFBhdGgodHJ1ZSk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJtYXBwZXJzIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1hcHBlcnMoKSB7CisgICAgICAgIHJldHVybiBtYXBwZXJzLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJyZXF1ZXN0Q291bnQiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhdGlzdGljc1Byb3BlcnR5KCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLnZhbHVlT2Yoc3RhdHMuZ2V0KCkuc25hcHNob3QoKS5nZXRSZXF1ZXN0U3RhdGlzdGljcygpLmdldFRpbWVXaW5kb3dTdGF0aXN0aWNzKCkuZ2V0KDBMKS5nZXRSZXF1ZXN0Q291bnQoKSk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJjdXN0b20iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3VzdG9tKCkgeworICAgICAgICByZXR1cm4gY3VzdG9tSW5qZWN0ZWQuZ2V0TmFtZSgpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiY3VzdG9tMiIpCisgICAgcHVibGljIFN0cmluZyBnZXRDdXN0b20yKCkgeworICAgICAgICByZXR1cm4gaGsySW5qZWN0ZWQuZ2V0TmFtZSgpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiYm0iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Qm0oKSB7CisgICAgICAgIHJldHVybiBiZWFuTWFuYWdlci50b1N0cmluZygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWhrMi1iYW5uZWQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9SZXF1ZXN0U3BlY2lmaWMuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWhrMi1iYW5uZWQtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9SZXF1ZXN0U3BlY2lmaWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWYwNDhkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20taGsyLWJhbm5lZC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1JlcXVlc3RTcGVjaWZpYy5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZheC5pbmplY3QuUXVhbGlmaWVyOworCisvKioKKyAqIFF1YWxpZmllciBmb3IgcmVxdWVzdCBzcGVjaWZpYyBlY2hvIHNlcnZpY2UuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQERvY3VtZW50ZWQKK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitAUXVhbGlmaWVyCitwdWJsaWMgQGludGVyZmFjZSBSZXF1ZXN0U3BlY2lmaWMgeworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20taGsyLWJhbm5lZC13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvYmVhbnMueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20taGsyLWJhbm5lZC13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvYmVhbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZGYzNjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1oazItYmFubmVkLXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9iZWFucy54bWwKQEAgLTAsMCArMSwyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8YmVhbnMvPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20taGsyLWJhbm5lZC13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWhrMi1iYW5uZWQtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY2N2NhNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWhrMi1iYW5uZWQtd2ViYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgoreG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzNfMC54c2QiCisgICAgICB2ZXJzaW9uPSIzLjAiPgorICAgIDxlbnYtZW50cnk+CisgICAgICAgIDxlbnYtZW50cnktbmFtZT5pbmplY3RlZFJlc291cmNlPC9lbnYtZW50cnktbmFtZT4KKyAgICAgICAgPGVudi1lbnRyeS10eXBlPmphdmEubGFuZy5JbnRlZ2VyPC9lbnYtZW50cnktdHlwZT4KKyAgICAgICAgPGVudi1lbnRyeS12YWx1ZT4xMDwvZW52LWVudHJ5LXZhbHVlPgorICAgIDwvZW52LWVudHJ5PgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20taGsyLWJhbm5lZC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0NkaVRlc3QuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWhrMi1iYW5uZWQtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9DZGlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODljZjIzOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWhrMi1iYW5uZWQtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9DZGlUZXN0LmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKKy8qKgorICogVGVzdCBmb3IgQ0RJIHdlYiBhcHBsaWNhdGlvbiByZXNvdXJjZXMuCisgKiBSdW4gd2l0aDoKKyAqIDxwcmU+CisgKiBtdm4gY2xlYW4gcGFja2FnZQorICogJEFTX0hPTUUvYmluL2FzYWRtaW4gZGVwbG95IHRhcmdldC9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLXdlYmFwcAorICogbXZuIC1Ec2tpcFRlc3RzPWZhbHNlIHRlc3Q8L3ByZT4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQ2RpVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNeUFwcGxpY2F0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFVSSSBnZXRCYXNlVXJpKCkgeworICAgICAgICByZXR1cm4gVXJpQnVpbGRlci5mcm9tVXJpKHN1cGVyLmdldEJhc2VVcmkoKSkucGF0aCgiY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20taGsyLWJhbm5lZC13ZWJhcHAiKS5idWlsZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWhrMi1iYW5uZWQtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9DdXN0b21JbmplY3Rpb25UZXN0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1oazItYmFubmVkLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQ3VzdG9tSW5qZWN0aW9uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0OTg3MjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1oazItYmFubmVkLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQ3VzdG9tSW5qZWN0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogVGVzdCBjdXN0b20gSEsyIGluamVjdGlvbi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGNsYXNzIEN1c3RvbUluamVjdGlvblRlc3QgZXh0ZW5kcyBDZGlUZXN0IHsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8T2JqZWN0W10+IHRlc3REYXRhKCkgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W11bXSB7CisgICAgICAgICAgICAgICAgeyJhcHAtZmllbGQtaW5qZWN0ZWQifSwKKyAgICAgICAgICAgICAgICB7ImFwcC1jdG9yLWluamVjdGVkIn0sCisgICAgICAgICAgICAgICAgeyJyZXF1ZXN0LWZpZWxkLWluamVjdGVkIn0sCisgICAgICAgICAgICAgICAgeyJyZXF1ZXN0LWN0b3ItaW5qZWN0ZWQifSwKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgZmluYWwgU3RyaW5nIHJlc291cmNlOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGluc3RhbmNlIHdpdGggdGhlIGFib3ZlIHRlc3QgZGF0YSBpbmplY3RlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZSBxdWVyeSBwYXJhbWV0ZXIuCisgICAgICovCisgICAgcHVibGljIEN1c3RvbUluamVjdGlvblRlc3QoZmluYWwgU3RyaW5nIHJlc291cmNlKSB7CisgICAgICAgIHRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayB0aGF0IGZvciBvbmUgbm8gTlBFIGhhcHBlbnMgb24gdGhlIHNlcnZlciBzaWRlLAorICAgICAqIGFuZCB0aGUgY3VzdG9tIGJvdW5kIGluc3RhbmNlIG9mIHtAbGluayBDZGlJbmplY3RlZFR5cGV9IGdldHMgQ0RJIGluamVjdGVkLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbUhrMkluamVjdGlvbjEoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKS5wYXRoKHJlc291cmNlKS5wYXRoKCJjdXN0b20iKTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbygiQ0RJIGluamVjdGVkIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrIHRoYXQgZm9yIG9uZSBubyBOUEUgaGFwcGVucyBvbiB0aGUgc2VydmVyIHNpZGUsCisgICAgICogYW5kIHRoZSBjdXN0b20gYm91bmQgaW5zdGFuY2Ugb2Yge0BsaW5rIE15QXBwbGljYXRpb24uTXlJbmplY3Rpb259IGdldHMgQ0RJIGluamVjdGVkLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbUhrMkluamVjdGlvbjIoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKS5wYXRoKHJlc291cmNlKS5wYXRoKCJjdXN0b20yIik7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgZXF1YWxUbygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGVxdWFsVG8oIkNESSB3b3VsZCBsb3ZlIHRoaXMiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20taGsyLWJhbm5lZC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0V4Y2VwdGlvbk1hcHBlcnNUZXN0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1oazItYmFubmVkLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvRXhjZXB0aW9uTWFwcGVyc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODczNjlmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20taGsyLWJhbm5lZC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0V4Y2VwdGlvbk1hcHBlcnNUZXN0LmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBUZXN0IGZvciBleGNlcHRpb24gbWFwcGVyIGluamVjdGlvbi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGNsYXNzIEV4Y2VwdGlvbk1hcHBlcnNUZXN0IGV4dGVuZHMgQ2RpVGVzdCB7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzCisgICAgcHVibGljIHN0YXRpYyBMaXN0PE9iamVjdFtdPiB0ZXN0RGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW10geworICAgICAgICAgICAgICAgIHsiYXBwLWZpZWxkLWluamVjdGVkIn0sCisgICAgICAgICAgICAgICAgeyJhcHAtY3Rvci1pbmplY3RlZCJ9LAorICAgICAgICAgICAgICAgIHsicmVxdWVzdC1maWVsZC1pbmplY3RlZCJ9LAorICAgICAgICAgICAgICAgIHsicmVxdWVzdC1jdG9yLWluamVjdGVkIn0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgZmluYWwgU3RyaW5nIHJlc291cmNlOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGluc3RhbmNlIHdpdGggdGhlIGFib3ZlIHRlc3QgZGF0YSBpbmplY3RlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNvdXJjZSBxdWVyeSBwYXJhbWV0ZXIuCisgICAgICovCisgICAgcHVibGljIEV4Y2VwdGlvbk1hcHBlcnNUZXN0KGZpbmFsIFN0cmluZyByZXNvdXJjZSkgeworICAgICAgICB0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgdGhhdCBmb3Igb25lIG5vIE5QRSBoYXBwZW5zIG9uIHRoZSBzZXJ2ZXIgc2lkZSwgYW5kIGZvciB0d28KKyAgICAgKiB0aGUgaW5qZWN0ZWQgbWFwcGVycyByZW1haW5zIHRoZSBzYW1lIGFjcm9zcyByZXF1ZXN0cy4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNYXBwZXJzTm90TnVsbCgpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IHRhcmdldCgpLnBhdGgocmVzb3VyY2UpLnBhdGgoIm1hcHBlcnMiKTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgZmlyc3RSZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQoZmlyc3RSZXNwb25zZS5nZXRTdGF0dXMoKSwgZXF1YWxUbygyMDApKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGZpcnN0VmFsdWUgPSBmaXJzdFJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VGhhdCh0YXJnZXQucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKGZpcnN0VmFsdWUpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1oazItYmFubmVkLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvTW9uaXRvcmluZ1Rlc3QuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWhrMi1iYW5uZWQtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9Nb25pdG9yaW5nVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YWVkODYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1oazItYmFubmVkLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvTW9uaXRvcmluZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBUZXN0IGZvciBtb25pdG9yaW5nIHN0YXRpc3RpY3MgaW5qZWN0aW9uLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgTW9uaXRvcmluZ1Rlc3QgZXh0ZW5kcyBDZGlUZXN0IHsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8T2JqZWN0W10+IHRlc3REYXRhKCkgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W11bXSB7CisgICAgICAgICAgICAgICAgeyJhcHAtZmllbGQtaW5qZWN0ZWQifSwKKyAgICAgICAgICAgICAgICB7ImFwcC1jdG9yLWluamVjdGVkIn0sCisgICAgICAgICAgICAgICAgeyJyZXF1ZXN0LWZpZWxkLWluamVjdGVkIn0sCisgICAgICAgICAgICAgICAgeyJyZXF1ZXN0LWN0b3ItaW5qZWN0ZWQifQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBmaW5hbCBTdHJpbmcgcmVzb3VyY2U7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgaW5zdGFuY2Ugd2l0aCB0aGUgYWJvdmUgdGVzdCBkYXRhIGluamVjdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlIHVyaSBvZiByZXNvdXJjZSB0byBiZSB0ZXN0ZWQuCisgICAgICovCisgICAgcHVibGljIE1vbml0b3JpbmdUZXN0KGZpbmFsIFN0cmluZyByZXNvdXJjZSkgeworICAgICAgICB0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogTWFrZSBzZXZlcmFsIHJlcXVlc3RzIGFuZCBjaGVjayB0aGUgY291bnRlciBrZWVwcyBpbmNyZW1lbnRpbmcuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpbiBjYXNlIG9mIHVuZXhwZWN0ZWQgdGVzdCBmYWlsdXJlLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcXVlc3RDb3VudCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCkucGF0aChyZXNvdXJjZSkucGF0aCgicmVxdWVzdENvdW50Iik7CisgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsgLy8gdGhpcyBpcyB0byBhbGxvdyBzdGF0aXN0aWNzIG9uIHRoZSBzZXJ2ZXIgc2lkZSB0byBnZXQgdXBkYXRlZAorICAgICAgICBmaW5hbCBpbnQgc3RhcnQgPSBJbnRlZ2VyLmRlY29kZSh0YXJnZXQucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsgLy8gdGhpcyBpcyB0byBhbGxvdyBzdGF0aXN0aWNzIG9uIHRoZSBzZXJ2ZXIgc2lkZSB0byBnZXQgdXBkYXRlZAorICAgICAgICAgICAgZmluYWwgaW50IG5leHQgPSBJbnRlZ2VyLmRlY29kZSh0YXJnZXQucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoU3RyaW5nLmZvcm1hdCgidGVzdGluZyAlcyIsIHJlc291cmNlKSwgbmV4dCwgZXF1YWxUbyhzdGFydCArIGkpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWhrMi1iYW5uZWQtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9SZXF1ZXN0U2Vuc2l0aXZlVGVzdC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi1jdXN0b20taGsyLWJhbm5lZC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1JlcXVlc3RTZW5zaXRpdmVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMxYmVmYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWhrMi1iYW5uZWQtd2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9SZXF1ZXN0U2Vuc2l0aXZlVGVzdC5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogVGVzdCBpbmplY3Rpb24gb2YgcmVxdWVzdCBkZXBlbmRpbmcgaW5zdGFuY2VzIHdvcmtzIGFzIGV4cGVjdGVkLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgUmVxdWVzdFNlbnNpdGl2ZVRlc3QgZXh0ZW5kcyBDZGlUZXN0IHsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8T2JqZWN0W10+IHRlc3REYXRhKCkgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W11bXSB7CisgICAgICAgICAgICAgICAgeyJhcHAtZmllbGQtaW5qZWN0ZWQiLCAiYWxwaGEiLCAiQXBwOiBhbHBoYSJ9LAorICAgICAgICAgICAgICAgIHsiYXBwLWZpZWxkLWluamVjdGVkIiwgImdvZ29sIiwgIkFwcDogZ29nb2wifSwKKyAgICAgICAgICAgICAgICB7ImFwcC1maWVsZC1pbmplY3RlZCIsICJlbGNhcm8iLCAiQXBwOiBlbGNhcm8ifSwKKyAgICAgICAgICAgICAgICB7ImFwcC1jdG9yLWluamVjdGVkIiwgImFscGhhIiwgIkFwcDogYWxwaGEifSwKKyAgICAgICAgICAgICAgICB7ImFwcC1jdG9yLWluamVjdGVkIiwgImdvZ29sIiwgIkFwcDogZ29nb2wifSwKKyAgICAgICAgICAgICAgICB7ImFwcC1jdG9yLWluamVjdGVkIiwgImVsY2FybyIsICJBcHA6IGVsY2FybyJ9LAorICAgICAgICAgICAgICAgIHsicmVxdWVzdC1maWVsZC1pbmplY3RlZCIsICJhbHBoYSIsICJSZXF1ZXN0OiBhbHBoYSJ9LAorICAgICAgICAgICAgICAgIHsicmVxdWVzdC1maWVsZC1pbmplY3RlZCIsICJnb2dvbCIsICJSZXF1ZXN0OiBnb2dvbCJ9LAorICAgICAgICAgICAgICAgIHsicmVxdWVzdC1maWVsZC1pbmplY3RlZCIsICJvcmFjbGUiLCAiUmVxdWVzdDogb3JhY2xlIn0sCisgICAgICAgICAgICAgICAgeyJyZXF1ZXN0LWN0b3ItaW5qZWN0ZWQiLCAiYWxwaGEiLCAiUmVxdWVzdDogYWxwaGEifSwKKyAgICAgICAgICAgICAgICB7InJlcXVlc3QtY3Rvci1pbmplY3RlZCIsICJnb2dvbCIsICJSZXF1ZXN0OiBnb2dvbCJ9LAorICAgICAgICAgICAgICAgIHsicmVxdWVzdC1jdG9yLWluamVjdGVkIiwgIm9yYWNsZSIsICJSZXF1ZXN0OiBvcmFjbGUifQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBmaW5hbCBTdHJpbmcgcmVzb3VyY2UsIHN0cmFpZ2h0LCBlY2hvZWQ7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgaW5zdGFuY2Ugd2l0aCB0aGUgYWJvdmUgdGVzdCBkYXRhIGluamVjdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlIHVyaSBvZiB0aGUgcmVzb3VyY2UgdG8gYmUgdGVzdGVkLgorICAgICAqIEBwYXJhbSBzdHJhaWdodCByZXF1ZXN0IHNwZWNpZmljIGlucHV0LgorICAgICAqIEBwYXJhbSBlY2hvZWQgICBDREkgaW5qZWN0ZWQgc2VydmljZSBzaG91bGQgcHJvZHVjZSB0aGlzIG91dCBvZiBwcmV2aW91cywgc3RyYWlnaHQsIHBhcmFtZXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVxdWVzdFNlbnNpdGl2ZVRlc3QoZmluYWwgU3RyaW5nIHJlc291cmNlLCBmaW5hbCBTdHJpbmcgc3RyYWlnaHQsIGZpbmFsIFN0cmluZyBlY2hvZWQpIHsKKyAgICAgICAgdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOworICAgICAgICB0aGlzLnN0cmFpZ2h0ID0gc3RyYWlnaHQ7CisgICAgICAgIHRoaXMuZWNob2VkID0gZWNob2VkOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENkaUluamVjdGlvbigpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHMgPSB0YXJnZXQoKS5wYXRoKHJlc291cmNlKS5xdWVyeVBhcmFtKCJzIiwgc3RyYWlnaHQpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzLCBlcXVhbFRvKGVjaG9lZCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhrMkluamVjdGlvbigpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHMgPSB0YXJnZXQoKS5wYXRoKHJlc291cmNlKS5wYXRoKCJwYXRoIikucGF0aChzdHJhaWdodCkucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KHMsIGVxdWFsVG8oU3RyaW5nLmZvcm1hdCgiJXMvcGF0aC8lcyIsIHJlc291cmNlLCBzdHJhaWdodCkpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLXdlYmFwcC9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGUwYzQyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAvcG9tLnhtbApAQCAtMCwwICsxLDg3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmNkaS13aXRoLWplcnNleS1pbmplY3Rpb24td2ViYXBwPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWNkaS13aXRoLWplcnNleS1pbmplY3Rpb24td2ViYXBwPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPkplcnNleSBDREkgdGVzdCB3ZWIgYXBwbGljYXRpb24sIHRoaXMgb25lIHVzZXMgSmVyc2V5IChub24gSkFYLVJTKSBjb21wb25lbnQgaW5qZWN0aW9uPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jZGkxeDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNkaTF4LXRyYW5zYWN0aW9uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktc2VydmVyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LmFubm90YXRpb248L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5hbm5vdGF0aW9uLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5lbnRlcnByaXNlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2RpLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItYnVuZGxlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHR5cGU+cG9tPC90eXBlPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisgICAgPGJ1aWxkPgorICAgICAgICA8ZmluYWxOYW1lPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvZmluYWxOYW1lPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c2tpcFRlc3RzPiR7c2tpcFRlc3RzfTwvc2tpcFRlc3RzPgorICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5mYWN0b3J5PiR7dGVzdENvbnRhaW5lckZhY3Rvcnl9PC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0PiR7dGVzdENvbnRhaW5lclBvcnR9PC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+CisgICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8c2tpcFRlc3RzPnRydWU8L3NraXBUZXN0cz4KKyAgICAgICAgPHRlc3RDb250YWluZXJGYWN0b3J5Pm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTwvdGVzdENvbnRhaW5lckZhY3Rvcnk+CisgICAgICAgIDx0ZXN0Q29udGFpbmVyUG9ydD44MDgwPC90ZXN0Q29udGFpbmVyUG9ydD4KKyAgICA8L3Byb3BlcnRpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQXBwRWNoby5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0FwcEVjaG8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmYzZWZiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0FwcEVjaG8uamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuQXBwbGljYXRpb25TY29wZWQ7CisKKworLyoqCisgKiBBcHBsaWNhdGlvbiBzcGVjaWZpYyBlY2hvIGltcGxlbWVudGF0aW9uLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BBcHBTcGVjaWZpYworQEFwcGxpY2F0aW9uU2NvcGVkCitwdWJsaWMgY2xhc3MgQXBwRWNobyBpbXBsZW1lbnRzIEVjaG9TZXJ2aWNlIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZWNobyhTdHJpbmcgcykgeworICAgICAgICByZXR1cm4gIkFwcDogIiArIHM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0FwcFNjb3BlZEN0b3JJbmplY3RlZFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQXBwU2NvcGVkQ3RvckluamVjdGVkUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmZmZWVhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0FwcFNjb3BlZEN0b3JJbmplY3RlZFJlc291cmNlLmphdmEKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5BcHBsaWNhdGlvblNjb3BlZDsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLk1vbml0b3JpbmdTdGF0aXN0aWNzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5FeGNlcHRpb25NYXBwZXJzOworCisvKioKKyAqIENESSBiYWNrZWQsIGFwcGxpY2F0aW9uIHNjb3BlZCwgSkFYLVJTIHJlc291cmNlIHRvIGJlIGluamVjdGVkCisgKiB2aWEgaXQncyBjb25zdHJ1Y3RvciBmcm9tIGJvdGggQ0RJIGFuZCBKZXJzZXkgSEsyLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BBcHBsaWNhdGlvblNjb3BlZAorQFBhdGgoImFwcC1jdG9yLWluamVjdGVkIikKK3B1YmxpYyBjbGFzcyBBcHBTY29wZWRDdG9ySW5qZWN0ZWRSZXNvdXJjZSB7CisKKyAgICAvLyBDREkgaW5qZWN0ZWQKKyAgICBFY2hvU2VydmljZSBlY2hvU2VydmljZTsKKworICAgIC8vIEplcnNleSBpbmplY3RlZAorICAgIFByb3ZpZGVyPENvbnRhaW5lclJlcXVlc3Q+IHJlcXVlc3Q7CisgICAgRXhjZXB0aW9uTWFwcGVycyBtYXBwZXJzOworICAgIFByb3ZpZGVyPE1vbml0b3JpbmdTdGF0aXN0aWNzPiBzdGF0czsKKworICAgIC8vIEplcnNleS9ISzIgY3VzdG9tIGluamVjdGVkCisgICAgTXlBcHBsaWNhdGlvbi5NeUluamVjdGlvbiBjdXN0b21JbmplY3RlZDsKKworICAgIC8vIHRvIG1ha2Ugd2VsZCBoYXBweQorICAgIHB1YmxpYyBBcHBTY29wZWRDdG9ySW5qZWN0ZWRSZXNvdXJjZSgpIHsKKyAgICB9CisKKyAgICBASW5qZWN0CisgICAgcHVibGljIEFwcFNjb3BlZEN0b3JJbmplY3RlZFJlc291cmNlKEBBcHBTcGVjaWZpYyBmaW5hbCBFY2hvU2VydmljZSBlY2hvU2VydmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUHJvdmlkZXI8Q29udGFpbmVyUmVxdWVzdD4gcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRXhjZXB0aW9uTWFwcGVycyBtYXBwZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBQcm92aWRlcjxNb25pdG9yaW5nU3RhdGlzdGljcz4gc3RhdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE15QXBwbGljYXRpb24uTXlJbmplY3Rpb24gY3VzdG9tSW5qZWN0ZWQpIHsKKyAgICAgICAgdGhpcy5lY2hvU2VydmljZSA9IGVjaG9TZXJ2aWNlOworICAgICAgICB0aGlzLnJlcXVlc3QgPSByZXF1ZXN0OworICAgICAgICB0aGlzLm1hcHBlcnMgPSBtYXBwZXJzOworICAgICAgICB0aGlzLnN0YXRzID0gc3RhdHM7CisgICAgICAgIHRoaXMuY3VzdG9tSW5qZWN0ZWQgPSBjdXN0b21JbmplY3RlZDsKKyAgICB9CisKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBlY2hvKEBRdWVyeVBhcmFtKCJzIikgZmluYWwgU3RyaW5nIHMpIHsKKyAgICAgICAgcmV0dXJuIGVjaG9TZXJ2aWNlLmVjaG8ocyk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJwYXRoL3twYXJhbX0iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0KCkuZ2V0UGF0aCh0cnVlKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoIm1hcHBlcnMiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWFwcGVycygpIHsKKyAgICAgICAgcmV0dXJuIG1hcHBlcnMudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInJlcXVlc3RDb3VudCIpCisgICAgcHVibGljIFN0cmluZyBnZXRTdGF0aXN0aWNzUHJvcGVydHkoKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZihzdGF0cy5nZXQoKS5zbmFwc2hvdCgpLmdldFJlcXVlc3RTdGF0aXN0aWNzKCkuZ2V0VGltZVdpbmRvd1N0YXRpc3RpY3MoKS5nZXQoMEwpLmdldFJlcXVlc3RDb3VudCgpKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImN1c3RvbSIpCisgICAgcHVibGljIFN0cmluZyBnZXRDdXN0b20oKSB7CisgICAgICAgIHJldHVybiBjdXN0b21JbmplY3RlZC5nZXROYW1lKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0FwcFNjb3BlZEZpZWxkSW5qZWN0ZWRSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0FwcFNjb3BlZEZpZWxkSW5qZWN0ZWRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMTk2ZDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQXBwU2NvcGVkRmllbGRJbmplY3RlZFJlc291cmNlLmphdmEKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5BcHBsaWNhdGlvblNjb3BlZDsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LmluamVjdC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb25pdG9yaW5nLk1vbml0b3JpbmdTdGF0aXN0aWNzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNwaS5FeGNlcHRpb25NYXBwZXJzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXMuTXlBcHBsaWNhdGlvbi5NeUluamVjdGlvbjsKKworLyoqCisgKiBDREkgYmFja2VkLCBhcHBsaWNhdGlvbiBzY29wZWQsIEpBWC1SUyByZXNvdXJjZS4KKyAqIEl0J3MgZmllbGRzIGFyZSBpbmplY3RlZCBmcm9tIGJvdGggQ0RJIGFuZCBKZXJzZXkgSEsyLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BBcHBsaWNhdGlvblNjb3BlZAorQFBhdGgoImFwcC1maWVsZC1pbmplY3RlZCIpCitwdWJsaWMgY2xhc3MgQXBwU2NvcGVkRmllbGRJbmplY3RlZFJlc291cmNlIHsKKworICAgIC8vIENESSBpbmplY3RlZAorICAgIEBJbmplY3QKKyAgICBAQXBwU3BlY2lmaWMKKyAgICBFY2hvU2VydmljZSBlY2hvU2VydmljZTsKKworICAgIC8vIEplcnNleSBpbmplY3RlZAorICAgIEBJbmplY3QKKyAgICBQcm92aWRlcjxDb250YWluZXJSZXF1ZXN0PiByZXF1ZXN0OworICAgIEBJbmplY3QKKyAgICBFeGNlcHRpb25NYXBwZXJzIG1hcHBlcnM7CisgICAgQEluamVjdAorICAgIFByb3ZpZGVyPE1vbml0b3JpbmdTdGF0aXN0aWNzPiBzdGF0czsKKworICAgIC8vIEplcnNleS9ISzIgY3VzdG9tIGluamVjdGlvbgorICAgIEBJbmplY3QKKyAgICBNeUluamVjdGlvbiBjdXN0b21JbmplY3RlZDsKKworICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGVjaG8oQFF1ZXJ5UGFyYW0oInMiKSBTdHJpbmcgcykgeworICAgICAgICByZXR1cm4gZWNob1NlcnZpY2UuZWNobyhzKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInBhdGgve3BhcmFtfSIpCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgeworICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXQoKS5nZXRQYXRoKHRydWUpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgibWFwcGVycyIpCisgICAgcHVibGljIFN0cmluZyBnZXRNYXBwZXJzKCkgeworICAgICAgICByZXR1cm4gbWFwcGVycy50b1N0cmluZygpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgicmVxdWVzdENvdW50IikKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0YXRpc3RpY3NQcm9wZXJ0eSgpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKHN0YXRzLmdldCgpLnNuYXBzaG90KCkuZ2V0UmVxdWVzdFN0YXRpc3RpY3MoKS5nZXRUaW1lV2luZG93U3RhdGlzdGljcygpLmdldCgwTCkuZ2V0UmVxdWVzdENvdW50KCkpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiY3VzdG9tIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldEN1c3RvbSgpIHsKKyAgICAgICAgcmV0dXJuIGN1c3RvbUluamVjdGVkLmdldE5hbWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQXBwU3BlY2lmaWMuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9BcHBTcGVjaWZpYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwMGZjNmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQXBwU3BlY2lmaWMuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YXguaW5qZWN0LlF1YWxpZmllcjsKKworLyoqCisgKiBRdWFsaWZpZXIgZm9yIGFwcGxpY2F0aW9uIHNwZWNpZmljIGVjaG8gc2VydmljZS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitARG9jdW1lbnRlZAorQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK0BRdWFsaWZpZXIKK3B1YmxpYyBAaW50ZXJmYWNlIEFwcFNwZWNpZmljIHsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9FY2hvU2VydmljZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0VjaG9TZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc0NWIyMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9FY2hvU2VydmljZS5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4LmluamVjdC5RdWFsaWZpZXI7CisKKy8qKgorICogU2ltcGxlIGVjaG8gc2VydmljZSB0byB0ZXN0IGluamVjdGlvbnMgdXNpbmcge0BsaW5rIFF1YWxpZmllcn0uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGludGVyZmFjZSBFY2hvU2VydmljZSB7CisKKyAgICAvKioKKyAgICAgKiBQcm92aWRlIGFuIGVjaG9lZCByZXNwb25zZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzIFN0cmluZyB0byBiZSBlY2hvZWQuCisgICAgICogQHJldHVybiBlY2hvZWQgaW5wdXQuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBlY2hvKFN0cmluZyBzKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9NeUFwcGxpY2F0aW9uLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvTXlBcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyN2M5MDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvTXlBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5BYnN0cmFjdEJpbmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLm1vbml0b3JpbmcuTW9uaXRvcmluZ0ZlYXR1cmU7CisKKy8qKgorICogSkFYLVJTIGFwcGxpY2F0aW9uIHRvIGNvbmZpZ3VyZSByZXNvdXJjZXMuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uUGF0aCgiLyoiKQorcHVibGljIGNsYXNzIE15QXBwbGljYXRpb24gZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15SW5qZWN0aW9uIHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisgICAgICAgIHB1YmxpYyBNeUluamVjdGlvbihmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIE15QXBwbGljYXRpb24oKSB7CisgICAgICAgIC8vIEpBWC1SUyByZXNvdXJjZSBjbGFzc2VzCisgICAgICAgIHJlZ2lzdGVyKEFwcFNjb3BlZEZpZWxkSW5qZWN0ZWRSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJlZ2lzdGVyKEFwcFNjb3BlZEN0b3JJbmplY3RlZFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgcmVnaXN0ZXIoUmVxdWVzdFNjb3BlZEZpZWxkSW5qZWN0ZWRSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJlZ2lzdGVyKFJlcXVlc3RTY29wZWRDdG9ySW5qZWN0ZWRSZXNvdXJjZS5jbGFzcyk7CisKKyAgICAgICAgcmVnaXN0ZXIobmV3IEFic3RyYWN0QmluZGVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgICAgICAgICAgYmluZChuZXcgTXlJbmplY3Rpb24oIm5vIHdheSBDREkgd291bGQgY2hpbWUgaW4iKSkudG8oTXlJbmplY3Rpb24uY2xhc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICAvLyBKZXJzZXkgbW9uaXRvcmluZworICAgICAgICByZWdpc3RlcihNb25pdG9yaW5nRmVhdHVyZS5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL015SGsyVHlwZXNQcm92aWRlci5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL015SGsyVHlwZXNQcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MmFkZjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvTXlIazJUeXBlc1Byb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTF4LnNwaS5IazJDdXN0b21Cb3VuZFR5cGVzUHJvdmlkZXI7CisKKy8qKgorICogVGVsbCBKZXJzZXkgQ0RJIGV4dGVuc2lvbiB3aGF0IHR5cGVzIHNob3VsZCBiZSBicmlkZ2VkIGZyb20gSEsyIHRvIENESS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgTXlIazJUeXBlc1Byb3ZpZGVyIGltcGxlbWVudHMgSGsyQ3VzdG9tQm91bmRUeXBlc1Byb3ZpZGVyIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8VHlwZT4gZ2V0SGsyVHlwZXMoKSB7CisgICAgICAgIHJldHVybiBuZXcgSGFzaFNldDxUeXBlPigpIHt7CisgICAgICAgICAgICBhZGQoTXlBcHBsaWNhdGlvbi5NeUluamVjdGlvbi5jbGFzcyk7CisgICAgICAgIH19OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9SZXF1ZXN0RWNoby5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1JlcXVlc3RFY2hvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBjMjZiYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9SZXF1ZXN0RWNoby5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworLyoqCisgKiBSZXF1ZXN0IHNwZWNpZmljIGVjaG8gaW1wbGVtZW50YXRpb24uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJlcXVlc3RTcGVjaWZpYworcHVibGljIGNsYXNzIFJlcXVlc3RFY2hvIGltcGxlbWVudHMgRWNob1NlcnZpY2UgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBlY2hvKFN0cmluZyBzKSB7CisgICAgICAgIHJldHVybiAiUmVxdWVzdDogIiArIHM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1JlcXVlc3RTY29wZWRDdG9ySW5qZWN0ZWRSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1JlcXVlc3RTY29wZWRDdG9ySW5qZWN0ZWRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1MGMwZDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUmVxdWVzdFNjb3BlZEN0b3JJbmplY3RlZFJlc291cmNlLmphdmEKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5SZXF1ZXN0U2NvcGVkOworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vbml0b3JpbmcuTW9uaXRvcmluZ1N0YXRpc3RpY3M7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLkV4Y2VwdGlvbk1hcHBlcnM7CisKKy8qKgorICogQ0RJIGJhY2tlZCwgcmVxdWVzdCBzY29wZWQsIEpBWC1SUyByZXNvdXJjZSB0byBiZSBpbmplY3RlZAorICogdmlhIGl0J3MgY29uc3RydWN0b3IgZnJvbSBib3RoIENESSBhbmQgSmVyc2V5IEhLMi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUmVxdWVzdFNjb3BlZAorQFBhdGgoInJlcXVlc3QtY3Rvci1pbmplY3RlZCIpCitwdWJsaWMgY2xhc3MgUmVxdWVzdFNjb3BlZEN0b3JJbmplY3RlZFJlc291cmNlIHsKKworICAgIC8vIENESSBpbmplY3RlZAorICAgIEVjaG9TZXJ2aWNlIGVjaG9TZXJ2aWNlOworCisgICAgLy8gSmVyc2V5IGluamVjdGVkCisgICAgQ29udGFpbmVyUmVxdWVzdCByZXF1ZXN0OworICAgIEV4Y2VwdGlvbk1hcHBlcnMgbWFwcGVyczsKKyAgICBQcm92aWRlcjxNb25pdG9yaW5nU3RhdGlzdGljcz4gc3RhdHM7CisKKyAgICAvLyBKZXJzZXkvSEsyIGN1c3RvbSBpbmplY3RlZAorICAgIE15QXBwbGljYXRpb24uTXlJbmplY3Rpb24gY3VzdG9tSW5qZWN0ZWQ7CisKKyAgICAvLyB0byBtYWtlIHdlbGQgaGFwcHkKKyAgICBwdWJsaWMgUmVxdWVzdFNjb3BlZEN0b3JJbmplY3RlZFJlc291cmNlKCkgeworICAgIH0KKworICAgIEBJbmplY3QKKyAgICBwdWJsaWMgUmVxdWVzdFNjb3BlZEN0b3JJbmplY3RlZFJlc291cmNlKEBSZXF1ZXN0U3BlY2lmaWMgRWNob1NlcnZpY2UgZWNob1NlcnZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250YWluZXJSZXF1ZXN0IHJlcXVlc3QsIEV4Y2VwdGlvbk1hcHBlcnMgbWFwcGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3ZpZGVyPE1vbml0b3JpbmdTdGF0aXN0aWNzPiBzdGF0cywgTXlBcHBsaWNhdGlvbi5NeUluamVjdGlvbiBjdXN0b21JbmplY3RlZCkgeworCisgICAgICAgIHRoaXMuZWNob1NlcnZpY2UgPSBlY2hvU2VydmljZTsKKyAgICAgICAgdGhpcy5tYXBwZXJzID0gbWFwcGVyczsKKyAgICAgICAgdGhpcy5yZXF1ZXN0ID0gcmVxdWVzdDsKKyAgICAgICAgdGhpcy5zdGF0cyA9IHN0YXRzOworICAgICAgICB0aGlzLmN1c3RvbUluamVjdGVkID0gY3VzdG9tSW5qZWN0ZWQ7CisgICAgfQorCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZWNobyhAUXVlcnlQYXJhbSgicyIpIFN0cmluZyBzKSB7CisgICAgICAgIHJldHVybiBlY2hvU2VydmljZS5lY2hvKHMpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgicGF0aC97cGFyYW19IikKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7CisgICAgICAgIHJldHVybiByZXF1ZXN0LmdldFBhdGgodHJ1ZSk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJtYXBwZXJzIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1hcHBlcnMoKSB7CisgICAgICAgIHJldHVybiBtYXBwZXJzLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJyZXF1ZXN0Q291bnQiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RhdGlzdGljc1Byb3BlcnR5KCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLnZhbHVlT2Yoc3RhdHMuZ2V0KCkuc25hcHNob3QoKS5nZXRSZXF1ZXN0U3RhdGlzdGljcygpLmdldFRpbWVXaW5kb3dTdGF0aXN0aWNzKCkuZ2V0KDBMKS5nZXRSZXF1ZXN0Q291bnQoKSk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJjdXN0b20iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q3VzdG9tKCkgeworICAgICAgICByZXR1cm4gY3VzdG9tSW5qZWN0ZWQuZ2V0TmFtZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9SZXF1ZXN0U2NvcGVkRmllbGRJbmplY3RlZFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUmVxdWVzdFNjb3BlZEZpZWxkSW5qZWN0ZWRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3NjI2MDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUmVxdWVzdFNjb3BlZEZpZWxkSW5qZWN0ZWRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuUmVxdWVzdFNjb3BlZDsKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmluamVjdC5zcGkuQmVhbk1hbmFnZXI7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9uaXRvcmluZy5Nb25pdG9yaW5nU3RhdGlzdGljczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuRXhjZXB0aW9uTWFwcGVyczsKKworLyoqCisgKiBDREkgYmFja2VkLCByZXF1ZXN0IHNjb3BlZCwgSkFYLVJTIHJlc291cmNlLgorICogSXQncyBmaWVsZHMgYXJlIGluamVjdGVkIGZyb20gYm90aCBDREkgYW5kIEplcnNleSBISzIuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJlcXVlc3RTY29wZWQKK0BQYXRoKCJyZXF1ZXN0LWZpZWxkLWluamVjdGVkIikKK3B1YmxpYyBjbGFzcyBSZXF1ZXN0U2NvcGVkRmllbGRJbmplY3RlZFJlc291cmNlIHsKKworICAgIC8vIGJ1aWx0LWluIENESSBiZWFuCisgICAgQEluamVjdAorICAgIEJlYW5NYW5hZ2VyIGJlYW5NYW5hZ2VyOworCisgICAgLy8gQ0RJIGluamVjdGVkCisgICAgQEluamVjdAorICAgIEBSZXF1ZXN0U3BlY2lmaWMKKyAgICBFY2hvU2VydmljZSBlY2hvU2VydmljZTsKKworICAgIC8vIEplcnNleSBpbmplY3RlZAorICAgIEBJbmplY3QKKyAgICBDb250YWluZXJSZXF1ZXN0IHJlcXVlc3Q7CisgICAgQEluamVjdAorICAgIEV4Y2VwdGlvbk1hcHBlcnMgbWFwcGVyczsKKyAgICBASW5qZWN0CisgICAgUHJvdmlkZXI8TW9uaXRvcmluZ1N0YXRpc3RpY3M+IHN0YXRzOworCisgICAgLy8gQ3VzdG9tIEplcnNleS9ISzIgaW5qZWN0ZWQKKyAgICBASW5qZWN0CisgICAgTXlBcHBsaWNhdGlvbi5NeUluamVjdGlvbiBjdXN0b21JbmplY3RlZDsKKworICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGVjaG8oQFF1ZXJ5UGFyYW0oInMiKSBTdHJpbmcgcykgeworICAgICAgICByZXR1cm4gZWNob1NlcnZpY2UuZWNobyhzKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInBhdGgve3BhcmFtfSIpCisgICAgcHVibGljIFN0cmluZyBnZXRQYXRoKCkgeworICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRQYXRoKHRydWUpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgibWFwcGVycyIpCisgICAgcHVibGljIFN0cmluZyBnZXRNYXBwZXJzKCkgeworICAgICAgICByZXR1cm4gbWFwcGVycy50b1N0cmluZygpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgicmVxdWVzdENvdW50IikKKyAgICBwdWJsaWMgU3RyaW5nIGdldFN0YXRpc3RpY3NQcm9wZXJ0eSgpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKHN0YXRzLmdldCgpLnNuYXBzaG90KCkuZ2V0UmVxdWVzdFN0YXRpc3RpY3MoKS5nZXRUaW1lV2luZG93U3RhdGlzdGljcygpLmdldCgwTCkuZ2V0UmVxdWVzdENvdW50KCkpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiY3VzdG9tIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldEN1c3RvbSgpIHsKKyAgICAgICAgcmV0dXJuIGN1c3RvbUluamVjdGVkLmdldE5hbWUoKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImJtIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldEJtKCkgeworICAgICAgICByZXR1cm4gYmVhbk1hbmFnZXIudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUmVxdWVzdFNwZWNpZmljLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUmVxdWVzdFNwZWNpZmljLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVmMDQ4ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24td2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9SZXF1ZXN0U3BlY2lmaWMuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7CitpbXBvcnQgamF2YXguaW5qZWN0LlF1YWxpZmllcjsKKworLyoqCisgKiBRdWFsaWZpZXIgZm9yIHJlcXVlc3Qgc3BlY2lmaWMgZWNobyBzZXJ2aWNlLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BEb2N1bWVudGVkCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorQFF1YWxpZmllcgorcHVibGljIEBpbnRlcmZhY2UgUmVxdWVzdFNwZWNpZmljIHsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24td2ViYXBwL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpMXguc3BpLkhrMkN1c3RvbUJvdW5kVHlwZXNQcm92aWRlciBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24td2ViYXBwL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpMXguc3BpLkhrMkN1c3RvbUJvdW5kVHlwZXNQcm92aWRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWQzNWY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LmV4dC5jZGkxeC5zcGkuSGsyQ3VzdG9tQm91bmRUeXBlc1Byb3ZpZGVyCkBAIC0wLDAgKzEgQEAKK29yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXMuTXlIazJUeXBlc1Byb3ZpZGVyCmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9iZWFucy54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9iZWFucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdkZjM2OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24td2ViYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2JlYW5zLnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxiZWFucy8+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLXdlYmFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjY3Y2E1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDI5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCit4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfM18wLnhzZCIKKyAgICAgIHZlcnNpb249IjMuMCI+CisgICAgPGVudi1lbnRyeT4KKyAgICAgICAgPGVudi1lbnRyeS1uYW1lPmluamVjdGVkUmVzb3VyY2U8L2Vudi1lbnRyeS1uYW1lPgorICAgICAgICA8ZW52LWVudHJ5LXR5cGU+amF2YS5sYW5nLkludGVnZXI8L2Vudi1lbnRyeS10eXBlPgorICAgICAgICA8ZW52LWVudHJ5LXZhbHVlPjEwPC9lbnYtZW50cnktdmFsdWU+CisgICAgPC9lbnYtZW50cnk+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvQ2RpVGVzdC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0NkaVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjczZGQxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0NkaVRlc3QuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworLyoqCisgKiBUZXN0IGZvciBDREkgd2ViIGFwcGxpY2F0aW9uIHJlc291cmNlcy4KKyAqIFJ1biB3aXRoOgorICogPHByZT4KKyAqIG12biBjbGVhbiBwYWNrYWdlCisgKiAkQVNfSE9NRS9iaW4vYXNhZG1pbiBkZXBsb3kgdGFyZ2V0L2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24td2ViYXBwCisgKiBtdm4gLURza2lwVGVzdHM9ZmFsc2UgdGVzdDwvcHJlPgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBDZGlUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IE15QXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVVJJIGdldEJhc2VVcmkoKSB7CisgICAgICAgIHJldHVybiBVcmlCdWlsZGVyLmZyb21Vcmkoc3VwZXIuZ2V0QmFzZVVyaSgpKS5wYXRoKCJjZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLXdlYmFwcCIpLmJ1aWxkKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL0N1c3RvbUluamVjdGlvblRlc3QuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24td2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9DdXN0b21JbmplY3Rpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg3ODQyNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24td2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9DdXN0b21JbmplY3Rpb25UZXN0LmphdmEKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBUZXN0IGN1c3RvbSBISzIgaW5qZWN0aW9uLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgQ3VzdG9tSW5qZWN0aW9uVGVzdCBleHRlbmRzIENkaVRlc3QgeworCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPYmplY3RbXT4gdGVzdERhdGEoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXVtdIHsKKyAgICAgICAgICAgICAgICB7ImFwcC1maWVsZC1pbmplY3RlZCJ9LAorICAgICAgICAgICAgICAgIHsiYXBwLWN0b3ItaW5qZWN0ZWQifSwKKyAgICAgICAgICAgICAgICB7InJlcXVlc3QtZmllbGQtaW5qZWN0ZWQifSwKKyAgICAgICAgICAgICAgICB7InJlcXVlc3QtY3Rvci1pbmplY3RlZCJ9CisgICAgICAgIH0pOworICAgIH0KKworICAgIGZpbmFsIFN0cmluZyByZXNvdXJjZTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBpbnN0YW5jZSB3aXRoIHRoZSBhYm92ZSB0ZXN0IGRhdGEgaW5qZWN0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgcXVlcnkgcGFyYW1ldGVyLgorICAgICAqLworICAgIHB1YmxpYyBDdXN0b21JbmplY3Rpb25UZXN0KFN0cmluZyByZXNvdXJjZSkgeworICAgICAgICB0aGlzLnJlc291cmNlID0gcmVzb3VyY2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgdGhhdCBmb3Igb25lIG5vIE5QRSBoYXBwZW5zIG9uIHRoZSBzZXJ2ZXIgc2lkZSwKKyAgICAgKiBhbmQgdGhlIGN1c3RvbSBib3VuZCBpbnN0YW5jZSBnZXRzIGluamVjdGVkLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbUhrMkluamVjdGlvbk51bGwoKSB7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKS5wYXRoKHJlc291cmNlKS5wYXRoKCJjdXN0b20iKTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbygibm8gd2F5IENESSB3b3VsZCBjaGltZSBpbiIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvRXhjZXB0aW9uTWFwcGVyc1Rlc3QuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24td2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9FeGNlcHRpb25NYXBwZXJzVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMjBkYjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvRXhjZXB0aW9uTWFwcGVyc1Rlc3QuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmNkaS5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIFRlc3QgZm9yIGV4Y2VwdGlvbiBtYXBwZXIgaW5qZWN0aW9uLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgRXhjZXB0aW9uTWFwcGVyc1Rlc3QgZXh0ZW5kcyBDZGlUZXN0IHsKKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8T2JqZWN0W10+IHRlc3REYXRhKCkgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W11bXSB7CisgICAgICAgICAgICAgICAgeyJhcHAtZmllbGQtaW5qZWN0ZWQifSwKKyAgICAgICAgICAgICAgICB7ImFwcC1jdG9yLWluamVjdGVkIn0sCisgICAgICAgICAgICAgICAgeyJyZXF1ZXN0LWZpZWxkLWluamVjdGVkIn0sCisgICAgICAgICAgICAgICAgeyJyZXF1ZXN0LWN0b3ItaW5qZWN0ZWQifQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBmaW5hbCBTdHJpbmcgcmVzb3VyY2U7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgaW5zdGFuY2Ugd2l0aCB0aGUgYWJvdmUgdGVzdCBkYXRhIGluamVjdGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHJlc291cmNlIHF1ZXJ5IHBhcmFtZXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgRXhjZXB0aW9uTWFwcGVyc1Rlc3QoU3RyaW5nIHJlc291cmNlKSB7CisgICAgICAgIHRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVjayB0aGF0IGZvciBvbmUgbm8gTlBFIGhhcHBlbnMgb24gdGhlIHNlcnZlciBzaWRlLCBhbmQgZm9yIHR3bworICAgICAqIHRoZSBpbmplY3RlZCBtYXBwZXJzIHJlbWFpbnMgdGhlIHNhbWUgYWNyb3NzIHJlcXVlc3RzLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1hcHBlcnNOb3ROdWxsKCkgeworICAgICAgICBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCkucGF0aChyZXNvdXJjZSkucGF0aCgibWFwcGVycyIpOworICAgICAgICBmaW5hbCBSZXNwb25zZSBmaXJzdFJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChmaXJzdFJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDIwMCkpOworICAgICAgICBTdHJpbmcgZmlyc3RWYWx1ZSA9IGZpcnN0UmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KHRhcmdldC5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyksIGVxdWFsVG8oZmlyc3RWYWx1ZSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24td2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9Nb25pdG9yaW5nVGVzdC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL01vbml0b3JpbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM2NGJlMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NkaS13aXRoLWplcnNleS1pbmplY3Rpb24td2ViYXBwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvY2RpL3Jlc291cmNlcy9Nb25pdG9yaW5nVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuY2RpLnJlc291cmNlczsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIFRlc3QgZm9yIG1vbml0b3Jpbmcgc3RhdGlzdGljcyBpbmplY3Rpb24uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBNb25pdG9yaW5nVGVzdCBleHRlbmRzIENkaVRlc3QgeworCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPYmplY3RbXT4gdGVzdERhdGEoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXVtdIHsKKyAgICAgICAgICAgICAgICB7ImFwcC1maWVsZC1pbmplY3RlZCJ9LAorICAgICAgICAgICAgICAgIHsiYXBwLWN0b3ItaW5qZWN0ZWQifSwKKyAgICAgICAgICAgICAgICB7InJlcXVlc3QtZmllbGQtaW5qZWN0ZWQifSwKKyAgICAgICAgICAgICAgICB7InJlcXVlc3QtY3Rvci1pbmplY3RlZCJ9CisgICAgICAgIH0pOworICAgIH0KKworICAgIGZpbmFsIFN0cmluZyByZXNvdXJjZTsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBpbnN0YW5jZSB3aXRoIHRoZSBhYm92ZSB0ZXN0IGRhdGEgaW5qZWN0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgdXJpIG9mIHJlc291cmNlIHRvIGJlIHRlc3RlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgTW9uaXRvcmluZ1Rlc3QoU3RyaW5nIHJlc291cmNlKSB7CisgICAgICAgIHRoaXMucmVzb3VyY2UgPSByZXNvdXJjZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBNYWtlIHNldmVyYWwgcmVxdWVzdHMgYW5kIGNoZWNrIHRoZSBjb3VudGVyIGtlZXBzIGluY3JlbWVudGluZy4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgRXhjZXB0aW9uIGluIGNhc2Ugb2YgdW5leHBlY3RlZCB0ZXN0IGZhaWx1cmUuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWVzdENvdW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKS5wYXRoKHJlc291cmNlKS5wYXRoKCJyZXF1ZXN0Q291bnQiKTsKKyAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOyAvLyB0aGlzIGlzIHRvIGFsbG93IHN0YXRpc3RpY3Mgb24gdGhlIHNlcnZlciBzaWRlIHRvIGdldCB1cGRhdGVkCisgICAgICAgIGludCBzdGFydCA9IEludGVnZXIuZGVjb2RlKHRhcmdldC5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IDQ7IGkrKykgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOyAvLyB0aGlzIGlzIHRvIGFsbG93IHN0YXRpc3RpY3Mgb24gdGhlIHNlcnZlciBzaWRlIHRvIGdldCB1cGRhdGVkCisgICAgICAgICAgICBpbnQgbmV4dCA9IEludGVnZXIuZGVjb2RlKHRhcmdldC5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgICAgICAgICAgYXNzZXJ0VGhhdChTdHJpbmcuZm9ybWF0KCJ0ZXN0aW5nICVzIiwgcmVzb3VyY2UpLCBuZXh0LCBlcXVhbFRvKHN0YXJ0ICsgaSkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1JlcXVlc3RTZW5zaXRpdmVUZXN0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2NkaS9yZXNvdXJjZXMvUmVxdWVzdFNlbnNpdGl2ZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjQxOTA5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2RpLXdpdGgtamVyc2V5LWluamVjdGlvbi13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9jZGkvcmVzb3VyY2VzL1JlcXVlc3RTZW5zaXRpdmVUZXN0LmphdmEKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5jZGkucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBUZXN0IGluamVjdGlvbiBvZiByZXF1ZXN0IGRlcGVuZGluZyBpbnN0YW5jZXMgd29ya3MgYXMgZXhwZWN0ZWQuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBSZXF1ZXN0U2Vuc2l0aXZlVGVzdCBleHRlbmRzIENkaVRlc3QgeworCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPYmplY3RbXT4gdGVzdERhdGEoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXVtdIHsKKyAgICAgICAgICAgICAgICB7ImFwcC1maWVsZC1pbmplY3RlZCIsICJhbHBoYSIsICJBcHA6IGFscGhhIn0sCisgICAgICAgICAgICAgICAgeyJhcHAtZmllbGQtaW5qZWN0ZWQiLCAiZ29nb2wiLCAiQXBwOiBnb2dvbCJ9LAorICAgICAgICAgICAgICAgIHsiYXBwLWZpZWxkLWluamVjdGVkIiwgImVsY2FybyIsICJBcHA6IGVsY2FybyJ9LAorICAgICAgICAgICAgICAgIHsiYXBwLWN0b3ItaW5qZWN0ZWQiLCAiYWxwaGEiLCAiQXBwOiBhbHBoYSJ9LAorICAgICAgICAgICAgICAgIHsiYXBwLWN0b3ItaW5qZWN0ZWQiLCAiZ29nb2wiLCAiQXBwOiBnb2dvbCJ9LAorICAgICAgICAgICAgICAgIHsiYXBwLWN0b3ItaW5qZWN0ZWQiLCAiZWxjYXJvIiwgIkFwcDogZWxjYXJvIn0sCisgICAgICAgICAgICAgICAgeyJyZXF1ZXN0LWZpZWxkLWluamVjdGVkIiwgImFscGhhIiwgIlJlcXVlc3Q6IGFscGhhIn0sCisgICAgICAgICAgICAgICAgeyJyZXF1ZXN0LWZpZWxkLWluamVjdGVkIiwgImdvZ29sIiwgIlJlcXVlc3Q6IGdvZ29sIn0sCisgICAgICAgICAgICAgICAgeyJyZXF1ZXN0LWZpZWxkLWluamVjdGVkIiwgIm9yYWNsZSIsICJSZXF1ZXN0OiBvcmFjbGUifSwKKyAgICAgICAgICAgICAgICB7InJlcXVlc3QtY3Rvci1pbmplY3RlZCIsICJhbHBoYSIsICJSZXF1ZXN0OiBhbHBoYSJ9LAorICAgICAgICAgICAgICAgIHsicmVxdWVzdC1jdG9yLWluamVjdGVkIiwgImdvZ29sIiwgIlJlcXVlc3Q6IGdvZ29sIn0sCisgICAgICAgICAgICAgICAgeyJyZXF1ZXN0LWN0b3ItaW5qZWN0ZWQiLCAib3JhY2xlIiwgIlJlcXVlc3Q6IG9yYWNsZSJ9CisgICAgICAgIH0pOworICAgIH0KKworICAgIGZpbmFsIFN0cmluZyByZXNvdXJjZSwgc3RyYWlnaHQsIGVjaG9lZDsKKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBpbnN0YW5jZSB3aXRoIHRoZSBhYm92ZSB0ZXN0IGRhdGEgaW5qZWN0ZWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVzb3VyY2UgdXJpIG9mIHRoZSByZXNvdXJjZSB0byBiZSB0ZXN0ZWQuCisgICAgICogQHBhcmFtIHN0cmFpZ2h0IHJlcXVlc3Qgc3BlY2lmaWMgaW5wdXQuCisgICAgICogQHBhcmFtIGVjaG9lZCBDREkgaW5qZWN0ZWQgc2VydmljZSBzaG91bGQgcHJvZHVjZSB0aGlzIG91dCBvZiBwcmV2aW91cywgc3RyYWlnaHQsIHBhcmFtZXRlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgUmVxdWVzdFNlbnNpdGl2ZVRlc3QoU3RyaW5nIHJlc291cmNlLCBTdHJpbmcgc3RyYWlnaHQsIFN0cmluZyBlY2hvZWQpIHsKKyAgICAgICAgdGhpcy5yZXNvdXJjZSA9IHJlc291cmNlOworICAgICAgICB0aGlzLnN0cmFpZ2h0ID0gc3RyYWlnaHQ7CisgICAgICAgIHRoaXMuZWNob2VkID0gZWNob2VkOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENkaUluamVjdGlvbigpIHsKKyAgICAgICAgU3RyaW5nIHMgPSB0YXJnZXQoKS5wYXRoKHJlc291cmNlKS5xdWVyeVBhcmFtKCJzIiwgc3RyYWlnaHQpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzLCBlcXVhbFRvKGVjaG9lZCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhrMkluamVjdGlvbigpIHsKKyAgICAgICAgU3RyaW5nIHMgPSB0YXJnZXQoKS5wYXRoKHJlc291cmNlKS5wYXRoKCJwYXRoIikucGF0aChzdHJhaWdodCkucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KHMsIGVxdWFsVG8oU3RyaW5nLmZvcm1hdCgiJXMvcGF0aC8lcyIsIHJlc291cmNlLCBzdHJhaWdodCkpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jbGllbnQtY29ubmVjdG9yLXByb3ZpZGVyL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jbGllbnQtY29ubmVjdG9yLXByb3ZpZGVyL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY1ZjhlNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2NsaWVudC1jb25uZWN0b3ItcHJvdmlkZXIvcG9tLnhtbApAQCAtMCwwICsxLDYwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmNsaWVudC1jb25uZWN0b3ItcHJvdmlkZXI8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5jbGllbnQtY29ubmVjdG9yLXByb3ZpZGVyPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPkNsaWVudCBDb25uZWN0b3IgcHJvdmlkZXIgdGVzdDwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LndzLnJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXgud3MucnMtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LmFubm90YXRpb248L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5hbm5vdGF0aW9uLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNsaWVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItYnVuZGxlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHR5cGU+cG9tPC90eXBlPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisgICAgPGJ1aWxkPgorICAgICAgICA8ZmluYWxOYW1lPiR7cHJvamVjdC5hcnRpZmFjdElkfTwvZmluYWxOYW1lPgorICAgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jbGllbnQtY29ubmVjdG9yLXByb3ZpZGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vY2xpZW50L2Nvbm5lY3Rvci9wcm92aWRlci9DdXN0b21Db25uZWN0b3JQcm92aWRlci5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vY2xpZW50LWNvbm5lY3Rvci1wcm92aWRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2NsaWVudC9jb25uZWN0b3IvcHJvdmlkZXIvQ3VzdG9tQ29ubmVjdG9yUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTRlNzBiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2xpZW50LWNvbm5lY3Rvci1wcm92aWRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2NsaWVudC9jb25uZWN0b3IvcHJvdmlkZXIvQ3VzdG9tQ29ubmVjdG9yUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmNsaWVudC5jb25uZWN0b3IucHJvdmlkZXI7CisKK2ltcG9ydCBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuSHR0cFVybENvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5KZXJzZXlDbGllbnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LmludGVybmFsLkh0dHBVcmxDb25uZWN0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnNwaS5Db25uZWN0b3I7CisKKy8qKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGZpbmFsIGNsYXNzIEN1c3RvbUNvbm5lY3RvclByb3ZpZGVyIGV4dGVuZHMgSHR0cFVybENvbm5lY3RvclByb3ZpZGVyIHsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9sYXRpbGUgYm9vbGVhbiBpbnZva2VkID0gZmFsc2U7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQ29ubmVjdG9yIGNyZWF0ZUh0dHBVcmxDb25uZWN0b3IoQ2xpZW50IGNsaWVudCwgQ29ubmVjdGlvbkZhY3RvcnkgY29ubmVjdGlvbkZhY3RvcnksIGludCBjaHVua1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZml4TGVuZ3RoU3RyZWFtaW5nLCBib29sZWFuIHNldE1ldGhvZFdvcmthcm91bmQpIHsKKworICAgICAgICByZXR1cm4gbmV3IEh0dHBVcmxDb25uZWN0b3IoCisgICAgICAgICAgICAgICAgY2xpZW50LAorICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25GYWN0b3J5LAorICAgICAgICAgICAgICAgIGNodW5rU2l6ZSwKKyAgICAgICAgICAgICAgICBmaXhMZW5ndGhTdHJlYW1pbmcsCisgICAgICAgICAgICAgICAgc2V0TWV0aG9kV29ya2Fyb3VuZCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIHNlY3VyZUNvbm5lY3Rpb24oSmVyc2V5Q2xpZW50IGNsaWVudCwgSHR0cFVSTENvbm5lY3Rpb24gdWMpIHsKKyAgICAgICAgICAgICAgICBpbnZva2VkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jbGllbnQtY29ubmVjdG9yLXByb3ZpZGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vY2xpZW50L2Nvbm5lY3Rvci9wcm92aWRlci9UZXN0UmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NsaWVudC1jb25uZWN0b3ItcHJvdmlkZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9jbGllbnQvY29ubmVjdG9yL3Byb3ZpZGVyL1Rlc3RSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5NDFiODkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jbGllbnQtY29ubmVjdG9yLXByb3ZpZGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vY2xpZW50L2Nvbm5lY3Rvci9wcm92aWRlci9UZXN0UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmNsaWVudC5jb25uZWN0b3IucHJvdmlkZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworLyoqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgidGVzdCIpCitwdWJsaWMgY2xhc3MgVGVzdFJlc291cmNlIHsKKworICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgcmV0dXJuICJ0ZXN0IjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jbGllbnQtY29ubmVjdG9yLXByb3ZpZGVyL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuc3BpLkNvbm5lY3RvclByb3ZpZGVyIGIvdGVzdHMvaW50ZWdyYXRpb24vY2xpZW50LWNvbm5lY3Rvci1wcm92aWRlci9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnNwaS5Db25uZWN0b3JQcm92aWRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2JiOTdlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vY2xpZW50LWNvbm5lY3Rvci1wcm92aWRlci9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnNwaS5Db25uZWN0b3JQcm92aWRlcgpAQCAtMCwwICsxIEBACitvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5jbGllbnQuY29ubmVjdG9yLnByb3ZpZGVyLkN1c3RvbUNvbm5lY3RvclByb3ZpZGVyCmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9jbGllbnQtY29ubmVjdG9yLXByb3ZpZGVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vY2xpZW50L2Nvbm5lY3Rvci9wcm92aWRlci9DdXN0b21Db25uZWN0b3JQcm92aWRlclRlc3QuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2NsaWVudC1jb25uZWN0b3ItcHJvdmlkZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9jbGllbnQvY29ubmVjdG9yL3Byb3ZpZGVyL0N1c3RvbUNvbm5lY3RvclByb3ZpZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNGRhZjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9jbGllbnQtY29ubmVjdG9yLXByb3ZpZGVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vY2xpZW50L2Nvbm5lY3Rvci9wcm92aWRlci9DdXN0b21Db25uZWN0b3JQcm92aWRlclRlc3QuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmNsaWVudC5jb25uZWN0b3IucHJvdmlkZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBDdXN0b21Db25uZWN0b3JQcm92aWRlclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoVGVzdFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZva2VkKCkgeworICAgICAgICBhc3NlcnRGYWxzZShDdXN0b21Db25uZWN0b3JQcm92aWRlci5pbnZva2VkKTsKKworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInRlc3QiKS5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICBhc3NlcnRUcnVlKEN1c3RvbUNvbm5lY3RvclByb3ZpZGVyLmludm9rZWQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS1yZWxvYWQvZWFyL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUtcmVsb2FkL2Vhci9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5MTgzY2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUtcmVsb2FkL2Vhci9wb20ueG1sCkBAIC0wLDAgKzEsODUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+ZWpiLW11bHRpbW9kdWxlLXJlbG9hZC1lYXI8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5lYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tZWpiLW11bHRpbW9kdWxlLXJlbG9hZC1lYXI8L25hbWU+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPHByb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+VVRGLTg8L3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+CisgICAgPC9wcm9wZXJ0aWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWVhci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjY8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgIDxkZWZhdWx0TGliQnVuZGxlRGlyPkFQUC1JTkYvbGliPC9kZWZhdWx0TGliQnVuZGxlRGlyPgorICAgICAgICAgICAgICAgICAgICA8bW9kdWxlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx3ZWJNb2R1bGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZWpiLW11bHRpbW9kdWxlLXJlbG9hZC13YXIxPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPC93ZWJNb2R1bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8d2ViTW9kdWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmVqYi1tdWx0aW1vZHVsZS1yZWxvYWQtd2FyMjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvd2ViTW9kdWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGVqYk1vZHVsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5lamItbXVsdGltb2R1bGUtcmVsb2FkLWxpYjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZWpiTW9kdWxlPgorICAgICAgICAgICAgICAgICAgICA8L21vZHVsZXM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmVqYi1tdWx0aW1vZHVsZS1yZWxvYWQtd2FyMTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPndhcjwvdHlwZT4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZWpiLW11bHRpbW9kdWxlLXJlbG9hZC13YXIyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHR5cGU+d2FyPC90eXBlPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5lamItbXVsdGltb2R1bGUtcmVsb2FkLWxpYjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPmVqYjwvdHlwZT4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlLXJlbG9hZC9saWIvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS1yZWxvYWQvbGliL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMwZDI5NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS1yZWxvYWQvbGliL3BvbS54bWwKQEAgLTAsMCArMSw2OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi8uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5lamItbXVsdGltb2R1bGUtcmVsb2FkLWxpYjwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1lamItbXVsdGltb2R1bGUtcmVsb2FkLWxpYjwvbmFtZT4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgud3MucnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC53cy5ycy1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1zZXJ2ZXI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguZWpiPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguZWpiLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5hbm5vdGF0aW9uPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguYW5ub3RhdGlvbi1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4taW5zdGFsbC1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxza2lwPmZhbHNlPC9za2lwPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlLXJlbG9hZC9saWIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9lamIvcmVsb2FkL2xpYi9Db250YWluZXJMaXN0ZW5lci5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlLXJlbG9hZC9saWIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9lamIvcmVsb2FkL2xpYi9Db250YWluZXJMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZGU5YzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUtcmVsb2FkL2xpYi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2VqYi9yZWxvYWQvbGliL0NvbnRhaW5lckxpc3RlbmVyLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5tdWx0aW1vZHVsZS5lamIucmVsb2FkLmxpYjsKKworaW1wb3J0IGphdmF4LmVqYi5FSkI7CitpbXBvcnQgamF2YXguZWpiLlNpbmdsZXRvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkFic3RyYWN0Q29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5Db250YWluZXI7CisKKy8qKgorICogSkFYLVJTIHJlc291cmNlIHRoYXQga2VlcHMgbnVtYmVyIG9mIHJlbG9hZHMuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFByb3ZpZGVyCitAU2luZ2xldG9uCitwdWJsaWMgY2xhc3MgQ29udGFpbmVyTGlzdGVuZXIgZXh0ZW5kcyBBYnN0cmFjdENvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyIHsKKworICAgIEBFSkIgRWpiUmVsb2FkZXJTZXJ2aWNlIHJlbG9hZGVyOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TdGFydHVwKGZpbmFsIENvbnRhaW5lciBjb250YWluZXIpIHsKKyAgICAgICAgcmVsb2FkZXIuc2V0Q29udGFpbmVyKGNvbnRhaW5lcik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlLXJlbG9hZC9saWIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9lamIvcmVsb2FkL2xpYi9FamJSZWxvYWRlclNlcnZpY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS1yZWxvYWQvbGliL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvZWpiL3JlbG9hZC9saWIvRWpiUmVsb2FkZXJTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmM5NWNhOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS1yZWxvYWQvbGliL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvZWpiL3JlbG9hZC9saWIvRWpiUmVsb2FkZXJTZXJ2aWNlLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5tdWx0aW1vZHVsZS5lamIucmVsb2FkLmxpYjsKKworaW1wb3J0IGphdmF4LmVqYi5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5Db250YWluZXI7CisKKy8qKgorICogU2luZ2xldG9uIEVKQiBiZWFuIHRoYXQgaXMgdXNlZCB0byByZWxvYWQgdGhlIGZpcnN0IHdlYiBhcHBsaWNhdGlvbi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAU2luZ2xldG9uCitwdWJsaWMgY2xhc3MgRWpiUmVsb2FkZXJTZXJ2aWNlIHsKKworICAgIENvbnRhaW5lciBjb250YWluZXI7CisKKyAgICBwdWJsaWMgdm9pZCByZWxvYWQoKSB7CisgICAgICAgIGNvbnRhaW5lci5yZWxvYWQobmV3QXBwKCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgcmVzb3VyY2UgY29uZmlnIHRoYXQgY29udGFpbnMge0BsaW5rIFJlbG9hZERldGVjdGlvblJlc291cmNlfSBzaW5nbGV0b24KKyAgICAgKiB3aXRoIGN1cnJlbnQgbmFubyB0aW1lLCBzbyB0aGF0IHdlIGNhbiBkZXRlY3Qgd2hlbiB0aGUgYXBwbGljYXRpb24gaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIG5ldyByZXNvdXJjZSBjb25maWcuCisgICAgICovCisgICAgcHJpdmF0ZSBSZXNvdXJjZUNvbmZpZyBuZXdBcHAoKSB7CisKKyAgICAgICAgUmVzb3VyY2VDb25maWcgcmVzdWx0ID0gbmV3IFJlc291cmNlQ29uZmlnKCk7CisgICAgICAgIHJlc3VsdC5yZWdpc3RlcihSZWxvYWREZXRlY3Rpb25SZXNvdXJjZS5jcmVhdGVOZXdJbnN0YW5jZSgpKTsKKyAgICAgICAgcmVzdWx0LnJlZ2lzdGVyKENvbnRhaW5lckxpc3RlbmVyLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGNvbnRhaW5lciB0byBiZSByZWxvYWRlZC4gSW52b2tlZCBmcm9tIHtAbGluayBDb250YWluZXJMaXN0ZW5lcn0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGFpbmVyIHRvIGJlIHJlbG9hZGVkLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIHNldENvbnRhaW5lcihDb250YWluZXIgY29udGFpbmVyKSB7CisgICAgICAgIHRoaXMuY29udGFpbmVyID0gY29udGFpbmVyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS1yZWxvYWQvbGliL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvZWpiL3JlbG9hZC9saWIvUmVsb2FkRGV0ZWN0aW9uUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS1yZWxvYWQvbGliL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvZWpiL3JlbG9hZC9saWIvUmVsb2FkRGV0ZWN0aW9uUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWNiZjViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlLXJlbG9hZC9saWIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9lamIvcmVsb2FkL2xpYi9SZWxvYWREZXRlY3Rpb25SZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24ubXVsdGltb2R1bGUuZWpiLnJlbG9hZC5saWI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKKy8qKgorICogSkFYLVJTIHJlc291cmNlIHJlZ2lzdGVyZWQgYXMgYSBzaW5nbGV0b24KKyAqIGFsbG93cyB0byBkZXRlY3Qgd2hlbiBhcHBsaWNhdGlvbiBnb3QgaW5pdGlhdGVkIGFzIHRoZSB2YWx1ZQorICogcmV0dXJuZWQgZnJvbSBpdHMgZ2V0TmFubyByZXNvdXJjZSBtZXRob2QKKyAqIHdpbGwgZ2V0IGFkanVzdGVkIHdpdGggZWFjaCByZWxvYWQuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoImxhc3QtaW5pdC1uYW5vLXRpbWUiKQorcHVibGljIGNsYXNzIFJlbG9hZERldGVjdGlvblJlc291cmNlIHsKKworICAgIGZpbmFsIGxvbmcgbnMgPSBTeXN0ZW0ubmFub1RpbWUoKTsKKworICAgIHByaXZhdGUgUmVsb2FkRGV0ZWN0aW9uUmVzb3VyY2UoKSB7CisgICAgICAgIC8vIHByZXZlbnQgaW5zdGFudGlhdGlvbgorICAgIH0KKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgdGhlIG9ubHkgbWVhbiBob3cgdG8gZ2V0IGEgbmV3IGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbmV3IHJlbG9hZCBkZXRlY3Rpb24gcmVzb3VyY2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBSZWxvYWREZXRlY3Rpb25SZXNvdXJjZSBjcmVhdGVOZXdJbnN0YW5jZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZWxvYWREZXRlY3Rpb25SZXNvdXJjZSgpOworICAgIH0KKworCisgICAgQEdFVAorICAgIHB1YmxpYyBsb25nIGdldE5hbm8oKSB7CisgICAgICAgIHJldHVybiBuczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUtcmVsb2FkL2xpYi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2VqYi9yZWxvYWQvbGliL1JlbG9hZGVyUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS1yZWxvYWQvbGliL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvZWpiL3JlbG9hZC9saWIvUmVsb2FkZXJSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMmNlNmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUtcmVsb2FkL2xpYi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2VqYi9yZWxvYWQvbGliL1JlbG9hZGVyUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLm11bHRpbW9kdWxlLmVqYi5yZWxvYWQubGliOworCitpbXBvcnQgamF2YXguZWpiLkVKQjsKK2ltcG9ydCBqYXZheC5lamIuU3RhdGVsZXNzOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworCisvKioKKyAqIEpBWC1SUyByZXNvdXJjZSB1c2VkIHRvIHJlbG9hZCB0aGUgZmlyc3QgYXBwbGljYXRpb24uCisgKiBUaGlzIHJlc291cmNlIGlzIG9ubHkgcmVnaXN0ZXJlZCBpbnNpZGUgdGhlIHNlY29uZCBhcHBsaWNhdGlvbi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAU3RhdGVsZXNzCitAUGF0aCgicmVsb2FkIikKK3B1YmxpYyBjbGFzcyBSZWxvYWRlclJlc291cmNlIHsKKworICAgIEBFSkIgRWpiUmVsb2FkZXJTZXJ2aWNlIGVqYlJlbG9hZGVyU2VydmljZTsKKworICAgIEBHRVQKKyAgICBwdWJsaWMgdm9pZCByZWxvYWRUaGVPdGhlckFwcCgpIHsKKyAgICAgICAgZWpiUmVsb2FkZXJTZXJ2aWNlLnJlbG9hZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS1yZWxvYWQvbGliL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9iZWFucy54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUtcmVsb2FkL2xpYi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvYmVhbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNDZkNjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUtcmVsb2FkL2xpYi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvYmVhbnMueG1sCkBAIC0wLDAgKzEsMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPGJlYW5zLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS1yZWxvYWQvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS1yZWxvYWQvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWZkNDZmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlLXJlbG9hZC9wb20ueG1sCkBAIC0wLDAgKzEsNDMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5lamItbXVsdGltb2R1bGUtcmVsb2FkPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLWVqYi1tdWx0aW1vZHVsZS1yZWxvYWQ8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIEVKQiBNdWx0aS1Nb2R1bGUgUmVsb2FkCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxtb2R1bGVzPgorICAgICAgICA8bW9kdWxlPmVhcjwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmxpYjwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPndhcjE8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT53YXIyPC9tb2R1bGU+CisgICAgPC9tb2R1bGVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlLXJlbG9hZC93YXIxL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUtcmVsb2FkL3dhcjEvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTBlNjU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlLXJlbG9hZC93YXIxL3BvbS54bWwKQEAgLTAsMCArMSwxMjEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+ZWpiLW11bHRpbW9kdWxlLXJlbG9hZC13YXIxPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLWVqYi1tdWx0aW1vZHVsZS1yZWxvYWQtd2FyMTwvbmFtZT4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgud3MucnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC53cy5ycy1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1zZXJ2ZXI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+JHtwcm9qZWN0Lmdyb3VwSWR9PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZWpiLW11bHRpbW9kdWxlLXJlbG9hZC1saWI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguZWpiPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguZWpiLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guaGsyLmV4dGVybmFsPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguaW5qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguaW5qZWN0PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5pbmplY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgICAgIDxleGNsdXNpb25zPgorICAgICAgICAgICAgICAgIDxleGNsdXNpb24+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5oYW1jcmVzdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGFtY3Jlc3QtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5oYW1jcmVzdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmhhbWNyZXN0LWxpYnJhcnk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPGZpbmFsTmFtZT4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2ZpbmFsTmFtZT4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi13YXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8ZmFpbE9uTWlzc2luZ1dlYlhtbD5mYWxzZTwvZmFpbE9uTWlzc2luZ1dlYlhtbD4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c2tpcFRlc3RzPiR7c2tpcFRlc3RzfTwvc2tpcFRlc3RzPgorICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5mYWN0b3J5PiR7dGVzdENvbnRhaW5lckZhY3Rvcnl9PC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk+CisgICAgICAgICAgICAgICAgICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0PiR7dGVzdENvbnRhaW5lclBvcnR9PC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+CisgICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1pbnN0YWxsLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHNraXA+ZmFsc2U8L3NraXA+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxmYWlsT25NaXNzaW5nV2ViWG1sPmZhbHNlPC9mYWlsT25NaXNzaW5nV2ViWG1sPgorICAgICAgICA8c2tpcFRlc3RzPnRydWU8L3NraXBUZXN0cz4KKyAgICAgICAgPHRlc3RDb250YWluZXJGYWN0b3J5Pm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTwvdGVzdENvbnRhaW5lckZhY3Rvcnk+CisgICAgICAgIDx0ZXN0Q29udGFpbmVyUG9ydD44MDgwPC90ZXN0Q29udGFpbmVyUG9ydD4KKyAgICA8L3Byb3BlcnRpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUtcmVsb2FkL3dhcjEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9lamIvcmVsb2FkL3dlYjEvRmlyc3RBcHAuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS1yZWxvYWQvd2FyMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2VqYi9yZWxvYWQvd2ViMS9GaXJzdEFwcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNGQ1NDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUtcmVsb2FkL3dhcjEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9lamIvcmVsb2FkL3dlYjEvRmlyc3RBcHAuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLm11bHRpbW9kdWxlLmVqYi5yZWxvYWQud2ViMTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLm11bHRpbW9kdWxlLmVqYi5yZWxvYWQubGliLkNvbnRhaW5lckxpc3RlbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLm11bHRpbW9kdWxlLmVqYi5yZWxvYWQubGliLlJlbG9hZERldGVjdGlvblJlc291cmNlOworCisvKioKKyAqIEluaXRpYWwgSkFYLVJTIGFwcGxpY2F0aW9uIGZvciB0aGUgZmlyc3Qgd2ViIGFwcGxpY2F0aW9uLgorICogVGhpcyBvbmUgd2lsbCBnZXQgcmVsb2FkZWQuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uUGF0aCgiLyIpCitwdWJsaWMgY2xhc3MgRmlyc3RBcHAgZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKyAgICBzdGF0aWMgZmluYWwgU2V0PE9iamVjdD4gU0lOR0xFVE9OUyA9IG5ldyBIYXNoU2V0PE9iamVjdD4oKSB7eworICAgICAgICBhZGQoUmVsb2FkRGV0ZWN0aW9uUmVzb3VyY2UuY3JlYXRlTmV3SW5zdGFuY2UoKSk7CisgICAgfX07CisKKyAgICBzdGF0aWMgZmluYWwgU2V0PENsYXNzPD8+PiBDTEFTU0VTID0gbmV3IEhhc2hTZXQ8Q2xhc3M8Pz4+KCkge3sKKyAgICAgICAgYWRkKENvbnRhaW5lckxpc3RlbmVyLmNsYXNzKTsKKyAgICB9fTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8T2JqZWN0PiBnZXRTaW5nbGV0b25zKCkgeworICAgICAgICByZXR1cm4gU0lOR0xFVE9OUzsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICByZXR1cm4gQ0xBU1NFUzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUtcmVsb2FkL3dhcjEvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2JlYW5zLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS1yZWxvYWQvd2FyMS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvYmVhbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZGYzNjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUtcmVsb2FkL3dhcjEvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2JlYW5zLnhtbApAQCAtMCwwICsxLDIwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxiZWFucy8+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUtcmVsb2FkL3dhcjEvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9lamIvcmVsb2FkL3dlYjEvUmVsb2FkVGVzdC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlLXJlbG9hZC93YXIxL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvZWpiL3JlbG9hZC93ZWIxL1JlbG9hZFRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDg1NGIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlLXJlbG9hZC93YXIxL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvZWpiL3JlbG9hZC93ZWIxL1JlbG9hZFRlc3QuamF2YQpAQCAtMCwwICsxLDk1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLm11bHRpbW9kdWxlLmVqYi5yZWxvYWQud2ViMTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogVGVzdCByZWxvYWQgZnVuY3Rpb25hbGl0eSBmb3IgdHdvIHdlYiBhcHAgdGVzdCBjYXNlLgorICogUnVuIHdpdGg6CisgKiA8cHJlPgorICogbXZuIGNsZWFuIHBhY2thZ2UKKyAqICRBU19IT01FL2Jpbi9hc2FkbWluIGRlcGxveSAuLi9lYXIvdGFyZ2V0L2VqYi1tdWx0aW1vZHVsZS1yZWxvYWQtZWFyLSouZWFyCisgKiBtdm4gLURza2lwVGVzdHM9ZmFsc2UgdGVzdDwvcHJlPgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBSZWxvYWRUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IEZpcnN0QXBwKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KGZpbmFsIENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKExvZ2dpbmdGZWF0dXJlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWxvYWQoKSB7CisKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IG5hbm9zVGFyZ2V0ID0gdGFyZ2V0KCkucGF0aCgiZWpiLW11bHRpbW9kdWxlLXJlbG9hZC13YXIxL2xhc3QtaW5pdC1uYW5vLXRpbWUiKTsKKworICAgICAgICBmaW5hbCBsb25nIG5hbm9zMSA9IF9yZWFkSW5pdFRpbWVOYW5vcyhuYW5vc1RhcmdldCk7CisgICAgICAgIGZpbmFsIGxvbmcgbmFub3MyID0gX3JlYWRJbml0VGltZU5hbm9zKG5hbm9zVGFyZ2V0KTsKKworICAgICAgICBhc3NlcnRUaGF0KG5hbm9zMiwgaXMoZXF1YWxUbyhuYW5vczEpKSk7CisKKyAgICAgICAgLy8gSi01OTIgcmVwcm9kdWNlcjoKKworLy8gICAgICAgIHJlbG9hZCgpOworLy8KKy8vICAgICAgICBmaW5hbCBsb25nIG5hbm9zMyA9IF9yZWFkSW5pdFRpbWVOYW5vcyhuYW5vc1RhcmdldCk7CisvLyAgICAgICAgZmluYWwgbG9uZyBuYW5vczQgPSBfcmVhZEluaXRUaW1lTmFub3MobmFub3NUYXJnZXQpOworLy8KKy8vICAgICAgICBhc3NlcnRUaGF0KG5hbm9zNCwgaXMoZXF1YWxUbyhuYW5vczMpKSk7CisvLyAgICAgICAgYXNzZXJ0VGhhdChuYW5vczMsIGlzKGdyZWF0ZXJUaGFuKG5hbm9zMikpKTsKKy8vCisvLyAgICAgICAgcmVsb2FkKCk7CisvLworLy8gICAgICAgIGZpbmFsIGxvbmcgbmFub3M1ID0gX3JlYWRJbml0VGltZU5hbm9zKG5hbm9zVGFyZ2V0KTsKKy8vICAgICAgICBmaW5hbCBsb25nIG5hbm9zNiA9IF9yZWFkSW5pdFRpbWVOYW5vcyhuYW5vc1RhcmdldCk7CisvLworLy8gICAgICAgIGFzc2VydFRoYXQobmFub3M2LCBpcyhlcXVhbFRvKG5hbm9zNSkpKTsKKy8vICAgICAgICBhc3NlcnRUaGF0KG5hbm9zNSwgaXMoZ3JlYXRlclRoYW4obmFub3M0KSkpOworCisgICAgICAgIC8vIEVORDogSi01OTIgcmVwcm9kdWNlcgorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZWxvYWQoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCByZWxvYWRUYXJnZXQgPSB0YXJnZXQoKS5wYXRoKCJlamItbXVsdGltb2R1bGUtcmVsb2FkLXdhcjIvcmVsb2FkIik7CisgICAgICAgIGFzc2VydFRoYXQocmVsb2FkVGFyZ2V0LnJlcXVlc3QoKS5nZXQoKS5nZXRTdGF0dXMoKSwgaXMoMjA0KSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBsb25nIF9yZWFkSW5pdFRpbWVOYW5vcyhmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0KSB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcygyMDApKTsKKyAgICAgICAgcmV0dXJuIExvbmcucGFyc2VMb25nKHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlLXJlbG9hZC93YXIyL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUtcmVsb2FkL3dhcjIvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTNiZjI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlLXJlbG9hZC93YXIyL3BvbS54bWwKQEAgLTAsMCArMSwxMDUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+ZWpiLW11bHRpbW9kdWxlLXJlbG9hZC13YXIyPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLWVqYi1tdWx0aW1vZHVsZS1yZWxvYWQtd2FyMjwvbmFtZT4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgud3MucnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC53cy5ycy1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+JHtwcm9qZWN0Lmdyb3VwSWR9PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZWpiLW11bHRpbW9kdWxlLXJlbG9hZC1saWI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguZWpiPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguZWpiLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1idW5kbGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dHlwZT5wb208L3R5cGU+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuaGFtY3Jlc3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmhhbWNyZXN0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuaGFtY3Jlc3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5oYW1jcmVzdC1saWJyYXJ5PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxmaW5hbE5hbWU+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9maW5hbE5hbWU+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4td2FyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGZhaWxPbk1pc3NpbmdXZWJYbWw+ZmFsc2U8L2ZhaWxPbk1pc3NpbmdXZWJYbWw+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHNraXBUZXN0cz4ke3NraXBUZXN0c308L3NraXBUZXN0cz4KKyAgICAgICAgICAgICAgICAgICAgPHN5c3RlbVByb3BlcnR5VmFyaWFibGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIuZmFjdG9yeT4ke3Rlc3RDb250YWluZXJGYWN0b3J5fTwvamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5mYWN0b3J5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydD4ke3Rlc3RDb250YWluZXJQb3J0fTwvamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0PgorICAgICAgICAgICAgICAgICAgICA8L3N5c3RlbVByb3BlcnR5VmFyaWFibGVzPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4taW5zdGFsbC1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxza2lwPmZhbHNlPC9za2lwPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8ZmFpbE9uTWlzc2luZ1dlYlhtbD5mYWxzZTwvZmFpbE9uTWlzc2luZ1dlYlhtbD4KKyAgICAgICAgPHNraXBUZXN0cz50cnVlPC9za2lwVGVzdHM+CisgICAgICAgIDx0ZXN0Q29udGFpbmVyRmFjdG9yeT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk8L3Rlc3RDb250YWluZXJGYWN0b3J5PgorICAgICAgICA8dGVzdENvbnRhaW5lclBvcnQ+ODA4MDwvdGVzdENvbnRhaW5lclBvcnQ+CisgICAgPC9wcm9wZXJ0aWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlLXJlbG9hZC93YXIyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvZWpiL3JlbG9hZC93ZWIyL1NlY29uZEFwcC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlLXJlbG9hZC93YXIyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvZWpiL3JlbG9hZC93ZWIyL1NlY29uZEFwcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZDIzMDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUtcmVsb2FkL3dhcjIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9lamIvcmVsb2FkL3dlYjIvU2Vjb25kQXBwLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5tdWx0aW1vZHVsZS5lamIucmVsb2FkLndlYjI7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5tdWx0aW1vZHVsZS5lamIucmVsb2FkLmxpYi5SZWxvYWRlclJlc291cmNlOworCisvKioKKyAqIEpBWC1SUyBhcHBsaWNhdGlvbiBmcm9tIHdoaWNoIHdlIGFyZSBnb2luZyB0byByZWxvYWQKKyAqIHRoZSBvdGhlciBvbmUuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uUGF0aCgiLyIpCitwdWJsaWMgY2xhc3MgU2Vjb25kQXBwIGV4dGVuZHMgQXBwbGljYXRpb24geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBIYXNoU2V0PENsYXNzPD8+PigpIHt7CisgICAgICAgICAgICBhZGQoUmVsb2FkZXJSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIH19OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS1yZWxvYWQvd2FyMi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvYmVhbnMueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlLXJlbG9hZC93YXIyL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9iZWFucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdkZjM2OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS1yZWxvYWQvd2FyMi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvYmVhbnMueG1sCkBAIC0wLDAgKzEsMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPGJlYW5zLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS1yZWxvYWQvd2FyMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2VqYi9yZWxvYWQvd2ViMi9KYXhSc0Zyb21FamJMaWJyYXJ5VGVzdC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlLXJlbG9hZC93YXIyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvZWpiL3JlbG9hZC93ZWIyL0pheFJzRnJvbUVqYkxpYnJhcnlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RjMzJkYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS1yZWxvYWQvd2FyMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2VqYi9yZWxvYWQvd2ViMi9KYXhSc0Zyb21FamJMaWJyYXJ5VGVzdC5qYXZhCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLm11bHRpbW9kdWxlLmVqYi5yZWxvYWQud2ViMjsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuZ3JlYXRlclRoYW47CisKKy8qKgorICogVGVzdCBmb3IgRUpCIHdlYiBhcHBsaWNhdGlvbiByZXNvdXJjZXMuIFRoZSBKQVgtUlMgcmVzb3VyY2VzIGNvbWUgZnJvbSBidW5kbGVkIEVKQiBsaWJyYXJ5IGphci4KKyAqIFJ1biB3aXRoOgorICogPHByZT4KKyAqIG12biBjbGVhbiBwYWNrYWdlCisgKiAkQVNfSE9NRS9iaW4vYXNhZG1pbiBkZXBsb3kgLi4vZWFyL3RhcmdldC9lamItbXVsdGltb2R1bGUtZWFyLSouZWFyCisgKiBtdm4gLURza2lwVGVzdHM9ZmFsc2UgdGVzdDwvcHJlPgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSmF4UnNGcm9tRWpiTGlicmFyeVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgU2Vjb25kQXBwKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFVSSSBnZXRCYXNlVXJpKCkgeworICAgICAgICByZXR1cm4gVXJpQnVpbGRlci5mcm9tVXJpKHN1cGVyLmdldEJhc2VVcmkoKSkucGF0aCgiZWpiLW11bHRpbW9kdWxlLXdhciIpLnBhdGgoInJlc291cmNlcyIpLmJ1aWxkKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KGZpbmFsIENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKExvZ2dpbmdGZWF0dXJlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1ZXN0Q291bnRHZXRzSW5jcmVtZW50ZWQoKSB7CisgICAgICAgIGZpbmFsIGludCByZXF1ZXN0Q291bnQxID0gX25leHRDb3VudCh0YXJnZXQoKS5wYXRoKCJjb3VudGVyIikpOworCisgICAgICAgIGZpbmFsIGludCByZXF1ZXN0Q291bnQyID0gX25leHRDb3VudCh0YXJnZXQoKS5wYXRoKCJjb3VudGVyIikpOworICAgICAgICBhc3NlcnRUaGF0KHJlcXVlc3RDb3VudDIsIGlzKGdyZWF0ZXJUaGFuKHJlcXVlc3RDb3VudDEpKSk7CisKKyAgICAgICAgZmluYWwgaW50IHJlcXVlc3RDb3VudDMgPSBfbmV4dENvdW50KHRhcmdldCgpLnBhdGgoInN0YXRlbGVzcyIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXF1ZXN0Q291bnQzLCBpcyhncmVhdGVyVGhhbihyZXF1ZXN0Q291bnQyKSkpOworCisgICAgICAgIGZpbmFsIGludCByZXF1ZXN0Q291bnQ0ID0gX25leHRDb3VudCh0YXJnZXQoKS5wYXRoKCJzdGF0ZWxlc3MiKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVxdWVzdENvdW50NCwgaXMoZ3JlYXRlclRoYW4ocmVxdWVzdENvdW50MykpKTsKKworICAgICAgICBmaW5hbCBpbnQgcmVxdWVzdENvdW50NSA9IF9uZXh0Q291bnQodGFyZ2V0KCkucGF0aCgic3RhdGVmdWwiKS5wYXRoKCJjb3VudCIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXF1ZXN0Q291bnQ1LCBpcyhncmVhdGVyVGhhbihyZXF1ZXN0Q291bnQ0KSkpOworCisgICAgICAgIGZpbmFsIGludCByZXF1ZXN0Q291bnQ2ID0gX25leHRDb3VudCh0YXJnZXQoKS5wYXRoKCJzdGF0ZWZ1bCIpLnBhdGgoImNvdW50IikpOworICAgICAgICBhc3NlcnRUaGF0KHJlcXVlc3RDb3VudDYsIGlzKGdyZWF0ZXJUaGFuKHJlcXVlc3RDb3VudDUpKSk7CisKKyAgICAgICAgZmluYWwgaW50IHJlcXVlc3RDb3VudDcgPSBfbmV4dENvdW50KHRhcmdldCgpLnBhdGgoIndhci1zdGF0ZWxlc3MiKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVxdWVzdENvdW50NywgaXMoZ3JlYXRlclRoYW4ocmVxdWVzdENvdW50NikpKTsKKworICAgICAgICBmaW5hbCBpbnQgcmVxdWVzdENvdW50OCA9IF9uZXh0Q291bnQodGFyZ2V0KCkucGF0aCgid2FyLXN0YXRlbGVzcyIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXF1ZXN0Q291bnQ4LCBpcyhncmVhdGVyVGhhbihyZXF1ZXN0Q291bnQ3KSkpOworICAgIH0KKworICAgIHByaXZhdGUgaW50IF9uZXh0Q291bnQoZmluYWwgV2ViVGFyZ2V0IHRhcmdldCkgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VXJpSW5mb0luamVjdGlvbigpIHsKKyAgICAgICAgX3Rlc3RQYXRoKHRhcmdldCgpLnBhdGgoImNvdW50ZXIiKS5wYXRoKCJvbmUiKSwgImNvdW50ZXIvb25lIik7CisgICAgICAgIF90ZXN0UGF0aCh0YXJnZXQoKS5wYXRoKCJjb3VudGVyIikucGF0aCgidHdvIiksICJjb3VudGVyL3R3byIpOworICAgICAgICBfdGVzdFBhdGgodGFyZ2V0KCkucGF0aCgic3RhdGVsZXNzIikucGF0aCgidGhyZWUiKSwgInN0YXRlbGVzcy90aHJlZSIpOworICAgICAgICBfdGVzdFBhdGgodGFyZ2V0KCkucGF0aCgic3RhdGVsZXNzIikucGF0aCgiZm91ciIpLCAic3RhdGVsZXNzL2ZvdXIiKTsKKyAgICAgICAgX3Rlc3RQYXRoKHRhcmdldCgpLnBhdGgoIndhci1zdGF0ZWxlc3MiKS5wYXRoKCJmaXZlIiksICJ3YXItc3RhdGVsZXNzL2ZpdmUiKTsKKyAgICAgICAgX3Rlc3RQYXRoKHRhcmdldCgpLnBhdGgoIndhci1zdGF0ZWxlc3MiKS5wYXRoKCJzaXgiKSwgIndhci1zdGF0ZWxlc3Mvc2l4Iik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0UGF0aChmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0LCBmaW5hbCBTdHJpbmcgZXhwZWN0ZWRSZXN1bHQpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGVxdWFsVG8oZXhwZWN0ZWRSZXN1bHQpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUvZWFyL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUvZWFyL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQyZjEzZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS9lYXIvcG9tLnhtbApAQCAtMCwwICsxLDc1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgICA8cmVsYXRpdmVQYXRoPi4uLy4uL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmVqYi1tdWx0aW1vZHVsZS1lYXI8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5lYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tZWpiLW11bHRpbW9kdWxlLWVhcjwvbmFtZT4KKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8cHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz5VVEYtODwvcHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz4KKyAgICA8L3Byb3BlcnRpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZWFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+NjwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPGRlZmF1bHRMaWJCdW5kbGVEaXI+QVBQLUlORi9saWI8L2RlZmF1bHRMaWJCdW5kbGVEaXI+CisgICAgICAgICAgICAgICAgICAgIDxtb2R1bGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHdlYk1vZHVsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5lamItbXVsdGltb2R1bGUtd2FyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPC93ZWJNb2R1bGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZWpiTW9kdWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmVqYi1tdWx0aW1vZHVsZS1saWI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2VqYk1vZHVsZT4KKyAgICAgICAgICAgICAgICAgICAgPC9tb2R1bGVzPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5lamItbXVsdGltb2R1bGUtd2FyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHR5cGU+d2FyPC90eXBlPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5lamItbXVsdGltb2R1bGUtbGliPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHR5cGU+ZWpiPC90eXBlPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUvZWFyL3NyYy9tYWluL2FwcGxpY2F0aW9uL01FVEEtSU5GL01BTklGRVNULk1GIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlL2Vhci9zcmMvbWFpbi9hcHBsaWNhdGlvbi9NRVRBLUlORi9NQU5JRkVTVC5NRgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTQ5OWJjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlL2Vhci9zcmMvbWFpbi9hcHBsaWNhdGlvbi9NRVRBLUlORi9NQU5JRkVTVC5NRgpAQCAtMCwwICsxLDIgQEAKK01hbmlmZXN0LVZlcnNpb246IDEuMAorCmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUvbGliL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUvbGliL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE2ZWFkNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS9saWIvcG9tLnhtbApAQCAtMCwwICsxLDY0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgICA8cmVsYXRpdmVQYXRoPi4uLy4uL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmVqYi1tdWx0aW1vZHVsZS1saWI8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tZWpiLW11bHRpbW9kdWxlLWxpYjwvbmFtZT4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgud3MucnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC53cy5ycy1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguZWpiPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguZWpiLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5hbm5vdGF0aW9uPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguYW5ub3RhdGlvbi1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4taW5zdGFsbC1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxza2lwPmZhbHNlPC9za2lwPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlL2xpYi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2VqYi9saWIvRWpiQ291bnRlclJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUvbGliL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvZWpiL2xpYi9FamJDb3VudGVyUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWZjZjIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlL2xpYi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2VqYi9saWIvRWpiQ291bnRlclJlc291cmNlLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5tdWx0aW1vZHVsZS5lamIubGliOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CisKK2ltcG9ydCBqYXZheC5lamIuU2luZ2xldG9uOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKKworLyoqCisgKiBTaW5nbGV0b24gRUpCIGNvdW50ZXIgYmVhbiBhcyBhIEpBWC1SUyByZXNvdXJjZS4KKyAqIFRoZSBiZWFuIGlzIGZvciBvbmUgcHVibGlzaGVkIGFzIGEgc3RhbmRhbG9uZSBKQVgtUlMgcmVzb3VyY2UKKyAqIGFuZCBmb3IgdHdvIHVzZWQgdG8gaW5qZWN0IG90aGVyIEVKQiBiYXNlZCBKQVgtUlMgcmVzb3VyY2VzLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTaW5nbGV0b24KK0BQYXRoKCJjb3VudGVyIikKK3B1YmxpYyBjbGFzcyBFamJDb3VudGVyUmVzb3VyY2UgeworCisgICAgZmluYWwgQXRvbWljSW50ZWdlciBjb3VudGVyID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKworICAgIEBDb250ZXh0IFVyaUluZm8gdWk7CisKKyAgICBAR0VUCisgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIGNvdW50ZXIuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgfQorCisgICAgQFBhdGgoInt1aX0iKQorICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdldFVpKCkgeworICAgICAgICByZXR1cm4gdWkgIT0gbnVsbCA/IHVpLmdldFBhdGgoKSA6ICJVcmlJbmZvIGlzIG51bGwiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS9saWIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9lamIvbGliL1N0YXRlZnVsUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS9saWIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9lamIvbGliL1N0YXRlZnVsUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjUwYzJkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlL2xpYi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2VqYi9saWIvU3RhdGVmdWxSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24ubXVsdGltb2R1bGUuZWpiLmxpYjsKKworaW1wb3J0IGphdmF4LmVqYi5FSkI7CitpbXBvcnQgamF2YXguZWpiLlN0YXRlZnVsOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CisKKy8qKgorICogSkFYLVJTIHJlc291cmNlIGJhY2tlZCB3aXRoIGEgc3RhdGVmdWwgRUpCIGJlYW4uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFN0YXRlZnVsCitAUGF0aCgic3RhdGVmdWwiKQorcHVibGljIGNsYXNzIFN0YXRlZnVsUmVzb3VyY2UgeworCisgICAgQEVKQiBFamJDb3VudGVyUmVzb3VyY2UgY291bnRlcjsKKworICAgIEBHRVQKKyAgICBAUGF0aCgiY291bnQiKQorICAgIHB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7CisgICAgICAgIHJldHVybiBjb3VudGVyLmdldENvdW50KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlL2xpYi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2VqYi9saWIvU3RhdGVsZXNzUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS9saWIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9lamIvbGliL1N0YXRlbGVzc1Jlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM0OTA5NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS9saWIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9lamIvbGliL1N0YXRlbGVzc1Jlc291cmNlLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5tdWx0aW1vZHVsZS5lamIubGliOworCitpbXBvcnQgamF2YXguZWpiLkVKQjsKK2ltcG9ydCBqYXZheC5lamIuU3RhdGVsZXNzOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CisKKy8qKgorICogSkFYLVJTIHJlc291cmNlIGJhY2tlZCBieSBhIHN0YXRlbGVzcyBFSkIgYmVhbi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAU3RhdGVsZXNzCitAUGF0aCgic3RhdGVsZXNzIikKK3B1YmxpYyBjbGFzcyBTdGF0ZWxlc3NSZXNvdXJjZSB7CisKKyAgICBARUpCIEVqYkNvdW50ZXJSZXNvdXJjZSBjb3VudGVyOworICAgIEBDb250ZXh0IFVyaUluZm8gdXJpSW5mbzsKKworICAgIEBHRVQKKyAgICBwdWJsaWMgaW50IGdldENvdW50KCkgeworICAgICAgICByZXR1cm4gY291bnRlci5nZXRDb3VudCgpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgie3VyaUluZm99IikKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7CisgICAgICAgIHJldHVybiB1cmlJbmZvICE9IG51bGwgPyB1cmlJbmZvLmdldFBhdGgoKSA6ICJ1cmkgaW5mbyBpcyBudWxsIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4YTM5YzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUvcG9tLnhtbApAQCAtMCwwICsxLDQyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+ZWpiLW11bHRpbW9kdWxlPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLWVqYi1tdWx0aW1vZHVsZTwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgRUpCIE11bHRpLU1vZHVsZQorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8bW9kdWxlcz4KKyAgICAgICAgPG1vZHVsZT5lYXI8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5saWI8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT53YXI8L21vZHVsZT4KKyAgICA8L21vZHVsZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUvd2FyL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUvd2FyL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM0MGI2OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS93YXIvcG9tLnhtbApAQCAtMCwwICsxLDExMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi8uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5lamItbXVsdGltb2R1bGUtd2FyPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLWVqYi1tdWx0aW1vZHVsZS13YXI8L25hbWU+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LndzLnJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXgud3MucnMtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPiR7cHJvamVjdC5ncm91cElkfTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmVqYi1tdWx0aW1vZHVsZS1saWI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguZWpiPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguZWpiLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1idW5kbGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dHlwZT5wb208L3R5cGU+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuaGFtY3Jlc3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmhhbWNyZXN0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPC9leGNsdXNpb24+CisgICAgICAgICAgICA8L2V4Y2x1c2lvbnM+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuaGFtY3Jlc3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5oYW1jcmVzdC1saWJyYXJ5PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxmaW5hbE5hbWU+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9maW5hbE5hbWU+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4td2FyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGZhaWxPbk1pc3NpbmdXZWJYbWw+ZmFsc2U8L2ZhaWxPbk1pc3NpbmdXZWJYbWw+CisgICAgICAgICAgICAgICAgICAgIDwhLS1hcmNoaXZlPgorICAgICAgICAgICAgICAgICAgICAgIDxtYW5pZmVzdEVudHJpZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8Q2xhc3MtUGF0aD5lamItbGliLSR7cHJvamVjdC52ZXJzaW9ufS5qYXI8L0NsYXNzLVBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgPC9tYW5pZmVzdEVudHJpZXM+CisgICAgICAgICAgICAgICAgICAgIDwvYXJjaGl2ZS0tPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxza2lwVGVzdHM+JHtza2lwVGVzdHN9PC9za2lwVGVzdHM+CisgICAgICAgICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk+JHt0ZXN0Q29udGFpbmVyRmFjdG9yeX08L2plcnNleS5jb25maWcudGVzdC5jb250YWluZXIuZmFjdG9yeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+JHt0ZXN0Q29udGFpbmVyUG9ydH08L2plcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydD4KKyAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWluc3RhbGwtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c2tpcD5mYWxzZTwvc2tpcD4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPGZhaWxPbk1pc3NpbmdXZWJYbWw+ZmFsc2U8L2ZhaWxPbk1pc3NpbmdXZWJYbWw+CisgICAgICAgIDxza2lwVGVzdHM+dHJ1ZTwvc2tpcFRlc3RzPgorICAgICAgICA8dGVzdENvbnRhaW5lckZhY3Rvcnk+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5PC90ZXN0Q29udGFpbmVyRmFjdG9yeT4KKyAgICAgICAgPHRlc3RDb250YWluZXJQb3J0PjgwODA8L3Rlc3RDb250YWluZXJQb3J0PgorICAgIDwvcHJvcGVydGllcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS93YXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9lamIvd2ViMS9KYXhSc0NvbmZpZ3VyYXRpb24uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS93YXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9lamIvd2ViMS9KYXhSc0NvbmZpZ3VyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGFiNGNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlL3dhci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2VqYi93ZWIxL0pheFJzQ29uZmlndXJhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24ubXVsdGltb2R1bGUuZWpiLndlYjE7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5tdWx0aW1vZHVsZS5lamIubGliLkVqYkNvdW50ZXJSZXNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5tdWx0aW1vZHVsZS5lamIubGliLlN0YXRlZnVsUmVzb3VyY2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24ubXVsdGltb2R1bGUuZWpiLmxpYi5TdGF0ZWxlc3NSZXNvdXJjZTsKKworLyoqCisgKiBKQVgtUlMgYXBwbGljYXRpb24gcmVzb3VyY2UgY29uZmlndXJhdGlvbiB0aGF0IGluY2x1ZGVzIG9ubHkKKyAqIHRob3NlIEpBWC1SUyBjb21wb25lbnRzIGltcG9ydGVkIGZyb20gRUpCIGxpYnJhcnkgamFyLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BBcHBsaWNhdGlvblBhdGgoInJlc291cmNlcyIpCitwdWJsaWMgY2xhc3MgSmF4UnNDb25maWd1cmF0aW9uIGV4dGVuZHMgQXBwbGljYXRpb24geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBIYXNoU2V0PENsYXNzPD8+PigpIHt7CisgICAgICAgICAgICBhZGQoRWpiQ291bnRlclJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgICAgIGFkZChTdGF0ZWxlc3NSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgICAgICBhZGQoU3RhdGVmdWxSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgICAgICBhZGQoV2FyU3RhdGVsZXNzUmVzb3VyY2UuY2xhc3MpOworICAgICAgICB9fTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUvd2FyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvZWpiL3dlYjEvV2FyU3RhdGVsZXNzUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS93YXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9tdWx0aW1vZHVsZS9lamIvd2ViMS9XYXJTdGF0ZWxlc3NSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwODUzOWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUvd2FyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvZWpiL3dlYjEvV2FyU3RhdGVsZXNzUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLm11bHRpbW9kdWxlLmVqYi53ZWIxOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKKworaW1wb3J0IGphdmF4LmVqYi5FSkI7CitpbXBvcnQgamF2YXguZWpiLlN0YXRlbGVzczsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLm11bHRpbW9kdWxlLmVqYi5saWIuRWpiQ291bnRlclJlc291cmNlOworCisvKioKKyAqIEpBWC1SUyByZXNvdXJjZSBiYWNrZWQgYnkgYSBzdGF0ZWxlc3MgRUpCIGJlYW4gcGxhY2VkIGluIFdBUiBtb2R1bGUuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTdGF0ZWxlc3MKK0BQYXRoKCJ3YXItc3RhdGVsZXNzIikKK3B1YmxpYyBjbGFzcyBXYXJTdGF0ZWxlc3NSZXNvdXJjZSB7CisKKyAgICBARUpCIEVqYkNvdW50ZXJSZXNvdXJjZSBjb3VudGVyOworICAgIEBDb250ZXh0IFVyaUluZm8gdXJpSW5mbzsKKworICAgIEBHRVQKKyAgICBwdWJsaWMgaW50IGdldENvdW50KCkgeworICAgICAgICByZXR1cm4gY291bnRlci5nZXRDb3VudCgpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgie3VyaUluZm99IikKKyAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGgoKSB7CisgICAgICAgIHJldHVybiB1cmlJbmZvICE9IG51bGwgPyB1cmlJbmZvLmdldFBhdGgoKSA6ICJ1cmkgaW5mbyBpcyBudWxsIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUvd2FyL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUvd2FyL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDljMDJlNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi1tdWx0aW1vZHVsZS93YXIvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcApAQCAtMCwwICsxLDMxIEBACis8JS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLSU+CisKKzwlQHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbCIgcGFnZUVuY29kaW5nPSJVVEYtOCIlPgorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKKyAgICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorCis8aHRtbD4KKyAgICA8aGVhZD4KKyAgICAgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgorICAgICAgICA8dGl0bGU+SlNQIFBhZ2U8L3RpdGxlPgorICAgIDwvaGVhZD4KKyAgICA8Ym9keT4KKyAgICAgICAgPGgxPkhlbGxvIFdvcmxkITwvaDE+CisgICAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlL3dhci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2VqYi93ZWIxL0pheFJzRnJvbUVqYkxpYnJhcnlUZXN0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItbXVsdGltb2R1bGUvd2FyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vbXVsdGltb2R1bGUvZWpiL3dlYjEvSmF4UnNGcm9tRWpiTGlicmFyeVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZWI2YWEwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLW11bHRpbW9kdWxlL3dhci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL211bHRpbW9kdWxlL2VqYi93ZWIxL0pheFJzRnJvbUVqYkxpYnJhcnlUZXN0LmphdmEKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24ubXVsdGltb2R1bGUuZWpiLndlYjE7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJzLmdyZWF0ZXJUaGFuOworCisvKioKKyAqIFRlc3QgZm9yIEVKQiB3ZWIgYXBwbGljYXRpb24gcmVzb3VyY2VzLiBUaGUgSkFYLVJTIHJlc291cmNlcyBjb21lIGZyb20gYnVuZGxlZCBFSkIgbGlicmFyeSBqYXIuCisgKiBSdW4gd2l0aDoKKyAqIDxwcmU+CisgKiBtdm4gY2xlYW4gcGFja2FnZQorICogJEFTX0hPTUUvYmluL2FzYWRtaW4gZGVwbG95IC4uL2Vhci90YXJnZXQvZWpiLW11bHRpbW9kdWxlLWVhci0qLmVhcgorICogbXZuIC1Ec2tpcFRlc3RzPWZhbHNlIHRlc3Q8L3ByZT4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEpheFJzRnJvbUVqYkxpYnJhcnlUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IEpheFJzQ29uZmlndXJhdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBVUkkgZ2V0QmFzZVVyaSgpIHsKKyAgICAgICAgcmV0dXJuIFVyaUJ1aWxkZXIuZnJvbVVyaShzdXBlci5nZXRCYXNlVXJpKCkpLnBhdGgoImVqYi1tdWx0aW1vZHVsZS13YXIiKS5wYXRoKCJyZXNvdXJjZXMiKS5idWlsZCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChmaW5hbCBDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWVzdENvdW50R2V0c0luY3JlbWVudGVkKCkgeworICAgICAgICBmaW5hbCBpbnQgcmVxdWVzdENvdW50MSA9IF9uZXh0Q291bnQodGFyZ2V0KCkucGF0aCgiY291bnRlciIpKTsKKworICAgICAgICBmaW5hbCBpbnQgcmVxdWVzdENvdW50MiA9IF9uZXh0Q291bnQodGFyZ2V0KCkucGF0aCgiY291bnRlciIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXF1ZXN0Q291bnQyLCBpcyhncmVhdGVyVGhhbihyZXF1ZXN0Q291bnQxKSkpOworCisgICAgICAgIGZpbmFsIGludCByZXF1ZXN0Q291bnQzID0gX25leHRDb3VudCh0YXJnZXQoKS5wYXRoKCJzdGF0ZWxlc3MiKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVxdWVzdENvdW50MywgaXMoZ3JlYXRlclRoYW4ocmVxdWVzdENvdW50MikpKTsKKworICAgICAgICBmaW5hbCBpbnQgcmVxdWVzdENvdW50NCA9IF9uZXh0Q291bnQodGFyZ2V0KCkucGF0aCgic3RhdGVsZXNzIikpOworICAgICAgICBhc3NlcnRUaGF0KHJlcXVlc3RDb3VudDQsIGlzKGdyZWF0ZXJUaGFuKHJlcXVlc3RDb3VudDMpKSk7CisKKyAgICAgICAgZmluYWwgaW50IHJlcXVlc3RDb3VudDUgPSBfbmV4dENvdW50KHRhcmdldCgpLnBhdGgoInN0YXRlZnVsIikucGF0aCgiY291bnQiKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVxdWVzdENvdW50NSwgaXMoZ3JlYXRlclRoYW4ocmVxdWVzdENvdW50NCkpKTsKKworICAgICAgICBmaW5hbCBpbnQgcmVxdWVzdENvdW50NiA9IF9uZXh0Q291bnQodGFyZ2V0KCkucGF0aCgic3RhdGVmdWwiKS5wYXRoKCJjb3VudCIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXF1ZXN0Q291bnQ2LCBpcyhncmVhdGVyVGhhbihyZXF1ZXN0Q291bnQ1KSkpOworCisgICAgICAgIGZpbmFsIGludCByZXF1ZXN0Q291bnQ3ID0gX25leHRDb3VudCh0YXJnZXQoKS5wYXRoKCJ3YXItc3RhdGVsZXNzIikpOworICAgICAgICBhc3NlcnRUaGF0KHJlcXVlc3RDb3VudDcsIGlzKGdyZWF0ZXJUaGFuKHJlcXVlc3RDb3VudDYpKSk7CisKKyAgICAgICAgZmluYWwgaW50IHJlcXVlc3RDb3VudDggPSBfbmV4dENvdW50KHRhcmdldCgpLnBhdGgoIndhci1zdGF0ZWxlc3MiKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVxdWVzdENvdW50OCwgaXMoZ3JlYXRlclRoYW4ocmVxdWVzdENvdW50NykpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBfbmV4dENvdW50KGZpbmFsIFdlYlRhcmdldCB0YXJnZXQpIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVyaUluZm9JbmplY3Rpb24oKSB7CisgICAgICAgIF90ZXN0UGF0aCh0YXJnZXQoKS5wYXRoKCJjb3VudGVyIikucGF0aCgib25lIiksICJjb3VudGVyL29uZSIpOworICAgICAgICBfdGVzdFBhdGgodGFyZ2V0KCkucGF0aCgiY291bnRlciIpLnBhdGgoInR3byIpLCAiY291bnRlci90d28iKTsKKyAgICAgICAgX3Rlc3RQYXRoKHRhcmdldCgpLnBhdGgoInN0YXRlbGVzcyIpLnBhdGgoInRocmVlIiksICJzdGF0ZWxlc3MvdGhyZWUiKTsKKyAgICAgICAgX3Rlc3RQYXRoKHRhcmdldCgpLnBhdGgoInN0YXRlbGVzcyIpLnBhdGgoImZvdXIiKSwgInN0YXRlbGVzcy9mb3VyIik7CisgICAgICAgIF90ZXN0UGF0aCh0YXJnZXQoKS5wYXRoKCJ3YXItc3RhdGVsZXNzIikucGF0aCgiZml2ZSIpLCAid2FyLXN0YXRlbGVzcy9maXZlIik7CisgICAgICAgIF90ZXN0UGF0aCh0YXJnZXQoKS5wYXRoKCJ3YXItc3RhdGVsZXNzIikucGF0aCgic2l4IiksICJ3YXItc3RhdGVsZXNzL3NpeCIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfdGVzdFBhdGgoZmluYWwgV2ViVGFyZ2V0IHRhcmdldCwgZmluYWwgU3RyaW5nIGV4cGVjdGVkUmVzdWx0KSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKGV4cGVjdGVkUmVzdWx0KSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vZWpiLXRlc3Qtd2ViYXBwL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItdGVzdC13ZWJhcHAvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2E2OWZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLXRlc3Qtd2ViYXBwL3BvbS54bWwKQEAgLTAsMCArMSw5NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5lamItdGVzdC13ZWJhcHA8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtZWpiLXdlYmFwcDwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgRUpCIHRlc3Qgd2ViIGFwcGxpY2F0aW9uPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgud3MucnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC53cy5ycy1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+My4xLWIwNzwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguYW5ub3RhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LmFubm90YXRpb24tYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVqYjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LmVqYi1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgICAgIDxleGNsdXNpb25zPgorICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5oYW1jcmVzdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5oYW1jcmVzdC1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICA8Z3JvdXBJZD5vcmcuaGFtY3Jlc3Q8L2dyb3VwSWQ+CisgICAgICAgICAgPGFydGlmYWN0SWQ+aGFtY3Jlc3QtbGlicmFyeTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgIDwvZGVwZW5kZW5jaWVzPgorICAgIDxidWlsZD4KKyAgICAgICAgPGZpbmFsTmFtZT4ke3Byb2plY3QuYXJ0aWZhY3RJZH08L2ZpbmFsTmFtZT4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHNraXBUZXN0cz4ke3NraXBUZXN0c308L3NraXBUZXN0cz4KKyAgICAgICAgICAgICAgICAgICAgPHN5c3RlbVByb3BlcnR5VmFyaWFibGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIuZmFjdG9yeT4ke3Rlc3RDb250YWluZXJGYWN0b3J5fTwvamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5mYWN0b3J5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydD4ke3Rlc3RDb250YWluZXJQb3J0fTwvamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0PgorICAgICAgICAgICAgICAgICAgICA8L3N5c3RlbVByb3BlcnR5VmFyaWFibGVzPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPGZhaWxPbk1pc3NpbmdXZWJYbWw+ZmFsc2U8L2ZhaWxPbk1pc3NpbmdXZWJYbWw+CisgICAgICAgIDxza2lwVGVzdHM+dHJ1ZTwvc2tpcFRlc3RzPgorICAgICAgICA8dGVzdENvbnRhaW5lckZhY3Rvcnk+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5PC90ZXN0Q29udGFpbmVyRmFjdG9yeT4KKyAgICAgICAgPHRlc3RDb250YWluZXJQb3J0PjgwODA8L3Rlc3RDb250YWluZXJQb3J0PgorICAgIDwvcHJvcGVydGllcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2VqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2VqYi9yZXNvdXJjZXMvQXBwUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2VqYi9yZXNvdXJjZXMvQXBwUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTAzZDE3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZWpiL3Jlc291cmNlcy9BcHBSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZWpiLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4LmVqYi5FSkI7CitpbXBvcnQgamF2YXguZWpiLlN0YXRlbGVzczsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworLyoqCisgKiBUZXN0IHJlc291cmNlIHRoYXQgZXhwb3NlcyBjb3VudGVyIGZyb20gdGhlIEpBWC1SUyBhcHBsaWNhdGlvbiBzdWJjbGFzcy4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAU3RhdGVsZXNzCitAUGF0aCgiYXBwIikKK3B1YmxpYyBjbGFzcyBBcHBSZXNvdXJjZSB7CisKKyAgICBARUpCIE15QXBwbGljYXRpb24gYXBwOworCisgICAgQFBhdGgoImNvdW50IikKKyAgICBAR0VUCisgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKKyAgICAgICAgcmV0dXJuIGFwcC5pbmNyZW1lbnRBbmRHZXRDb3VudCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2VqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2VqYi9yZXNvdXJjZXMvQXN5bmNSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZWpiL3Jlc291cmNlcy9Bc3luY1Jlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTVjNjdmYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2VqYi9yZXNvdXJjZXMvQXN5bmNSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZWpiLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Bc3luY1Jlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5TdXNwZW5kZWQ7CisKK2ltcG9ydCBqYXZheC5lamIuRUpCOworCisvKioKKyAqIEBhdXRob3IgSmFuIEFsZ2VybWlzc2VuCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK0BQYXRoKCJhc3luYy10ZXN0IikKK3B1YmxpYyBjbGFzcyBBc3luY1Jlc291cmNlIHsKKworICAgIEBFSkIKKyAgICBBc3luY1NlcnZpY2UgYXN5bmNTZXJ2aWNlOworCisgICAgQEdFVAorICAgIEBQYXRoKCJzeW5jIikKKyAgICBwdWJsaWMgU3RyaW5nIHN5bmNocm9ub3VzR2V0KCkgeworICAgICAgICByZXR1cm4gInN5bmMiOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiYXN5bmMiKQorICAgIHB1YmxpYyB2b2lkIGFzeW5jaHJvbm91c0dldChAU3VzcGVuZGVkIEFzeW5jUmVzcG9uc2UgYXIpIHsKKyAgICAgICAgYXN5bmNTZXJ2aWNlLmdldEFzeW5jKGFyKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lamIvcmVzb3VyY2VzL0FzeW5jU2VydmljZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZWpiL3Jlc291cmNlcy9Bc3luY1NlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWExYWM0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZWpiL3Jlc291cmNlcy9Bc3luY1NlcnZpY2UuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmVqYi5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC5lamIuQXN5bmNocm9ub3VzOworaW1wb3J0IGphdmF4LmVqYi5TdGF0ZWxlc3M7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkFzeW5jUmVzcG9uc2U7CisKKy8qKgorICogQGF1dGhvciBKYW4gQWxnZXJtaXNzZW4KKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworQFN0YXRlbGVzcworcHVibGljIGNsYXNzIEFzeW5jU2VydmljZSB7CisgICAgcHJpdmF0ZSBzdGF0aWMgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoQXN5bmNTZXJ2aWNlLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBAQXN5bmNocm9ub3VzCisgICAgcHVibGljIHZvaWQgZ2V0QXN5bmMoQXN5bmNSZXNwb25zZSBhcikgeworICAgICAgICBhci5yZXN1bWUoImFzeW5jIik7CisgICAgfQorfQorCmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lamIvcmVzb3VyY2VzL0NvdW50ZXJCZWFuLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lamIvcmVzb3VyY2VzL0NvdW50ZXJCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U0M2U1OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2VqYi9yZXNvdXJjZXMvQ291bnRlckJlYW4uamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmVqYi5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKK2ltcG9ydCBqYXZheC5lamIuU2luZ2xldG9uOworCisvKioKKyAqIEVKQiBzaW5nbGV0b24gdXRpbGl6ZWQgYXMgcmVxdWVzdCBjb3VudGVyIGluIHRoaXMgdGVzdCBhcHBsaWNhdGlvbi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAU2luZ2xldG9uCitwdWJsaWMgY2xhc3MgQ291bnRlckJlYW4geworCisgICAgQXRvbWljSW50ZWdlciBjb3VudGVyID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKworICAgIHB1YmxpYyBpbnQgaW5jcmVtZW50QW5kR2V0KCkgeworICAgICAgICByZXR1cm4gY291bnRlci5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lamIvcmVzb3VyY2VzL0NvdW50ZXJGaWx0ZXIuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2VqYi9yZXNvdXJjZXMvQ291bnRlckZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2N2VkYzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lamIvcmVzb3VyY2VzL0NvdW50ZXJGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmVqYi5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXguZWpiLkVKQjsKK2ltcG9ydCBqYXZheC5lamIuU3RhdGVsZXNzOworCitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlc3BvbnNlRmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworLyoqCisgKiBSZXNwb25zZSBmaWx0ZXIgaW1wbGVtZW50ZWQgYXMgRUpCIGJlYW4uIFRoZSBmaWx0ZXIgYWRkcyBSZXF1ZXN0LUNvdW50IHJlc3BvbnNlIGhlYWRlciB0byBlYWNoIHJlc3BvbnNlLgorICogQW5vdGhlciBFSkIgc2luZ2xldG9uIGJlYW4sIENvdW50ZXJCZWFuLCBpcyBpbmplY3RlZCB0aGF0IGhvbGRzIHRoZSBhY3R1YWwgcmVxdWVzdCBjb3VudC4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUHJvdmlkZXIKK0BTdGF0ZWxlc3MKK3B1YmxpYyBjbGFzcyBDb3VudGVyRmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXJ7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSZXF1ZXN0Q291bnRIRUFERVIgPSAiUmVxdWVzdC1Db3VudCI7CisKKyAgICBARUpCIENvdW50ZXJCZWFuIGNvdW50ZXI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsIENvbnRhaW5lclJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJlc3BvbnNlQ29udGV4dC5nZXRIZWFkZXJzKCkuYWRkKFJlcXVlc3RDb3VudEhFQURFUiwgY291bnRlci5pbmNyZW1lbnRBbmRHZXQoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZWpiL3Jlc291cmNlcy9DdXN0b21CYXNlRXhjZXB0aW9uLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lamIvcmVzb3VyY2VzL0N1c3RvbUJhc2VFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGE2ZWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZWpiL3Jlc291cmNlcy9DdXN0b21CYXNlRXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lamIucmVzb3VyY2VzOworCisvKioKKyAqIEN1c3RvbSBleGNlcHRpb24uIFBhcnQgb2YgSkVSU0VZLTIzMjAgcmVwcm9kdWNlci4KKyAqIFRoaXMgb25lIHNlcnZlcyBhcyBhIGJhc2UgZm9yIG90aGVyIGV4Y2VwdGlvbnMKKyAqIG1hcHBlZCBieSB7QGxpbmsgRWpiRXhjZXB0aW9uTWFwcGVyT25lfSBhbmQge0BsaW5rIEVqYkV4Y2VwdGlvbk1hcHBlclR3b30uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEN1c3RvbUJhc2VFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24geworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZWpiL3Jlc291cmNlcy9DdXN0b21FeGNlcHRpb25PbmUuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2VqYi9yZXNvdXJjZXMvQ3VzdG9tRXhjZXB0aW9uT25lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE3MWI2ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2VqYi9yZXNvdXJjZXMvQ3VzdG9tRXhjZXB0aW9uT25lLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lamIucmVzb3VyY2VzOworCisvKioKKyAqIEN1c3RvbSBleGNlcHRpb24uIFBhcnQgb2YgSkVSU0VZLTIzMjAgcmVwcm9kdWNlci4KKyAqIFRoaXMgb25lIGdldHMgbWFwcGVkIGJ5IHtAbGluayBFamJFeGNlcHRpb25NYXBwZXJPbmV9LgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBDdXN0b21FeGNlcHRpb25PbmUgZXh0ZW5kcyBDdXN0b21CYXNlRXhjZXB0aW9uIHsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2VqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2VqYi9yZXNvdXJjZXMvQ3VzdG9tRXhjZXB0aW9uVHdvLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lamIvcmVzb3VyY2VzL0N1c3RvbUV4Y2VwdGlvblR3by5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyMWRiZGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lamIvcmVzb3VyY2VzL0N1c3RvbUV4Y2VwdGlvblR3by5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZWpiLnJlc291cmNlczsKKworLyoqCisgKiBDdXN0b20gZXhjZXB0aW9uLiBQYXJ0IG9mIEpFUlNFWS0yMzIwIHJlcHJvZHVjZXIuCisgKiBUaGlzIG9uZSBnZXRzIG1hcHBlZCBieSB7QGxpbmsgRWpiRXhjZXB0aW9uTWFwcGVyVHdvfS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQ3VzdG9tRXhjZXB0aW9uVHdvIGV4dGVuZHMgQ3VzdG9tQmFzZUV4Y2VwdGlvbiB7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lamIvcmVzb3VyY2VzL0VjaG8uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2VqYi9yZXNvdXJjZXMvRWNoby5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNTQ0YmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lamIvcmVzb3VyY2VzL0VjaG8uamF2YQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmVqYi5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC5lamIuUmVtb3RlOworCisvKioKKyAqIEVKQiByZW1vdGUgaW50ZXJmYWNlLiBQYXJ0IG9mIHRoZSByZXByb2R1Y2VyIGZvciBHTEFTU0ZJU0gtMTYxOTkuCisgKiBTZWUgYWxzbyB0aGUgb3RoZXIgdGVzdCBjYXNlIGltcGxlbWVudGVkIGJ5IHtAbGluayBSYXdFY2hvUmVzb3VyY2V9LgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSZW1vdGUKK3B1YmxpYyBpbnRlcmZhY2UgIEVjaG8geworCisgICAgU3RyaW5nIGVjaG8oU3RyaW5nIG1lc3NhZ2UpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZWpiL3Jlc291cmNlcy9FY2hvQmVhbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZWpiL3Jlc291cmNlcy9FY2hvQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NjNlZDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lamIvcmVzb3VyY2VzL0VjaG9CZWFuLmphdmEKQEAgLTAsMCArMSw0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lamIucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXguZWpiLlN0YXRlZnVsOworCisvKioKKyAqIFNlc3Npb24gYmVhbiBjYXBhYmxlIG9mIHJldHVybmluZyBhbiBlY2hvZWQgbWVzc2FnZSBiYWNrLgorICogVGhpcyBpcyB0byBwcm92ZSBFSkIgY29udGFpbmVyIGlzIHVzZWQgaW4ge0BsaW5rIEVjaG9SZXNvdXJjZX0KKyAqIGFuZCB7QGxpbmsgUmF3RWNob1Jlc291cmNlfSByZXNvdXJjZXMuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFN0YXRlZnVsCitwdWJsaWMgY2xhc3MgRWNob0JlYW4geworCisgICAgLyoqCisgICAgICogUHJlZml4LCB7QHZhbHVlfSwgdG8gYmUgYXR0YWNoZWQgdG8gZWFjaCBtZXNzYWdlIHByb2Nlc3NlZCBieSB0aGlzIGJlYW4uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYID0gIkVDSE9FRDogIjsKKworICAgIC8qKgorICAgICAqIEVjaG8gbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlIHRvIGJlIGVjaG9lZC4KKyAgICAgKiBAcmV0dXJuIGluY29taW5nIG1lc3NhZ2UgcHJlZml4ZWQgd2l0aCB7QGxpbmsgI1BSRUZJWH0uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBlY2hvKGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlcyVzIiwgUFJFRklYLCBtZXNzYWdlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lamIvcmVzb3VyY2VzL0VjaG9SZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZWpiL3Jlc291cmNlcy9FY2hvUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDE0ZTMyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZWpiL3Jlc291cmNlcy9FY2hvUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmVqYi5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC5lamIuRUpCOworaW1wb3J0IGphdmF4LmVqYi5Mb2NhbDsKK2ltcG9ydCBqYXZheC5lamIuUmVtb3RlOworaW1wb3J0IGphdmF4LmVqYi5TdGF0ZWxlc3M7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworCisvKioKKyAqIEpBWC1SUyByZXNvdXJjZSBiZWFuIGJhY2tlZCBieSBhbiBFSkIgc2Vzc2lvbiBiZWFuCisgKiBpbXBsZW1lbnRpbmcgRUpCIGludGVyZmFjZSB0aGF0IGlzIGFubm90YXRlZCB3aXRoIGJvdGgge0BsaW5rIExvY2FsfQorICogYW5kIHtAbGluayBSZW1vdGV9IGFubm90YXRpb25zLgorICogUmVwcm9kdWNpYmxlIHRlc3QgY2FzZSBmb3IgR0xBU1NGSVNILTE2MTk5LgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTdGF0ZWxlc3MKK0BQYXRoKCJlY2hvIikKK3B1YmxpYyBjbGFzcyBFY2hvUmVzb3VyY2UgaW1wbGVtZW50cyBFY2hvIHsKKworICAgIEBFSkIgRWNob0JlYW4gZWNob1NlcnZpY2U7CisKKyAgICBAR0VUCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBlY2hvKEBRdWVyeVBhcmFtKCJtZXNzYWdlIikgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgcmV0dXJuIGVjaG9TZXJ2aWNlLmVjaG8obWVzc2FnZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZWpiL3Jlc291cmNlcy9FamJFeGNlcHRpb25NYXBwZXJCYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lamIvcmVzb3VyY2VzL0VqYkV4Y2VwdGlvbk1hcHBlckJhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTVkNDgxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZWpiL3Jlc291cmNlcy9FamJFeGNlcHRpb25NYXBwZXJCYXNlLmphdmEKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lamIucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXgud3MucnMuZXh0LkV4Y2VwdGlvbk1hcHBlcjsKKworLyoqCisgKiBKRVJTRVktMjMyMCByZXByb2R1Y2VyLiB7QGxpbmsgQ3VzdG9tQmFzZUV4Y2VwdGlvbn0gd2lsbCBnZXQgbWFwcGVkCisgKiB0byBhbiBvcmRpbmFyeSByZXNwb25zZS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgRWpiRXhjZXB0aW9uTWFwcGVyQmFzZTxUIGV4dGVuZHMgQ3VzdG9tQmFzZUV4Y2VwdGlvbj4gaW1wbGVtZW50cyBFeGNlcHRpb25NYXBwZXI8VD4geworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZWpiL3Jlc291cmNlcy9FamJFeGNlcHRpb25NYXBwZXJPbmUuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2VqYi9yZXNvdXJjZXMvRWpiRXhjZXB0aW9uTWFwcGVyT25lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI5YTU1OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2VqYi9yZXNvdXJjZXMvRWpiRXhjZXB0aW9uTWFwcGVyT25lLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lamIucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXguZWpiLkVKQjsKK2ltcG9ydCBqYXZheC5lamIuU2luZ2xldG9uOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworCisvKioKKyAqIEpFUlNFWS0yMzIwIHJlcHJvZHVjZXIuIHtAbGluayBDdXN0b21FeGNlcHRpb25PbmV9IHdpbGwgZ2V0IG1hcHBlZAorICogdG8gYW4gb3JkaW5hcnkgcmVzcG9uc2UuIFdlIG1ha2Ugc3VyZSB0aGUgbWFwcGVyIGdldHMgaW5qZWN0ZWQgcHJvcGVybHkKKyAqIGJ5IGJvdGggSmVyc2V5IHJ1bnRpbWUgYW5kIEVKQiBjb250YWluZXIuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFNpbmdsZXRvbgorcHVibGljIGNsYXNzIEVqYkV4Y2VwdGlvbk1hcHBlck9uZSBleHRlbmRzIEVqYkV4Y2VwdGlvbk1hcHBlckJhc2U8Q3VzdG9tRXhjZXB0aW9uT25lPiB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNQT05TRV9CT0RZID0gImN1c3RvbSBleGNlcHRpb24gb25lIHRocm93biI7CisKKyAgICBAQ29udGV4dCBVcmlJbmZvIHVyaUluZm87CisgICAgQEVKQiBFY2hvQmVhbiBlY2hvQmVhbjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNwb25zZSB0b1Jlc3BvbnNlKGZpbmFsIEN1c3RvbUV4Y2VwdGlvbk9uZSBleGNlcHRpb24pIHsKKyAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKFJFU1BPTlNFX0JPRFkpCisgICAgICAgICAgICAgICAgLmhlYWRlcigiTXktTG9jYXRpb24iLCB1cmlJbmZvLmdldFBhdGgoKSkKKyAgICAgICAgICAgICAgICAuaGVhZGVyKCJNeS1FY2hvIiwgZWNob0JlYW4uZWNobygiMSIpKS5idWlsZCgpOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lamIvcmVzb3VyY2VzL0VqYkV4Y2VwdGlvbk1hcHBlclR3by5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZWpiL3Jlc291cmNlcy9FamJFeGNlcHRpb25NYXBwZXJUd28uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTIyN2U5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZWpiL3Jlc291cmNlcy9FamJFeGNlcHRpb25NYXBwZXJUd28uamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmVqYi5yZXNvdXJjZXM7CisKK2ltcG9ydCBqYXZheC5lamIuRUpCOworaW1wb3J0IGphdmF4LmVqYi5TdGF0ZWxlc3M7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CisKKy8qKgorICogSkVSU0VZLTIzMjAgcmVwcm9kdWNlci4ge0BsaW5rIEN1c3RvbUV4Y2VwdGlvblR3b30gd2lsbCBnZXQgbWFwcGVkCisgKiB0byBhbiBvcmRpbmFyeSByZXNwb25zZS4gV2UgbWFrZSBzdXJlIHRoZSBtYXBwZXIgZ2V0cyBpbmplY3RlZCBwcm9wZXJseQorICogYnkgYm90aCBKZXJzZXkgcnVudGltZSBhbmQgRUpCIGNvbnRhaW5lci4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAU3RhdGVsZXNzCitwdWJsaWMgY2xhc3MgRWpiRXhjZXB0aW9uTWFwcGVyVHdvIGV4dGVuZHMgRWpiRXhjZXB0aW9uTWFwcGVyQmFzZTxDdXN0b21FeGNlcHRpb25Ud28+IHsKKworICAgIEBDb250ZXh0IFVyaUluZm8gdXJpSW5mbzsKKyAgICBARUpCIEVjaG9CZWFuIGVjaG9CZWFuOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTUE9OU0VfQk9EWSA9ICJjdXN0b20gZXhjZXB0aW9uIHR3byB0aHJvd24iOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc3BvbnNlIHRvUmVzcG9uc2UoZmluYWwgQ3VzdG9tRXhjZXB0aW9uVHdvIGV4Y2VwdGlvbikgeworICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soUkVTUE9OU0VfQk9EWSkKKyAgICAgICAgICAgICAgICAuaGVhZGVyKCJNeS1Mb2NhdGlvbiIsIHVyaUluZm8uZ2V0UGF0aCgpKQorICAgICAgICAgICAgICAgIC5oZWFkZXIoIk15LUVjaG8iLCBlY2hvQmVhbi5lY2hvKCIyIikpLmJ1aWxkKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZWpiL3Jlc291cmNlcy9FeGNlcHRpb25FamJSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZWpiL3Jlc291cmNlcy9FeGNlcHRpb25FamJSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMTI0NTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lamIvcmVzb3VyY2VzL0V4Y2VwdGlvbkVqYlJlc291cmNlLmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lamIucmVzb3VyY2VzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CisKK2ltcG9ydCBqYXZheC5lamIuRUpCRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LmVqYi5TaW5nbGV0b247CisKKy8qKgorICogRUpCIGJhY2tlZCBKQVgtUlMgcmVzb3VyY2UgdG8gdGVzdCBpZiBhIGN1c3RvbSBleGNlcHRpb24gaW5mbyBtYWtlcyBpdCB0byB0aGUgY2xpZW50LgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTaW5nbGV0b24KK0BQYXRoKCJleGNlcHRpb24iKQorcHVibGljIGNsYXNzIEV4Y2VwdGlvbkVqYlJlc291cmNlIHsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlDaGVja2VkRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKKworICAgICAgICBwdWJsaWMgTXlDaGVja2VkRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgICAgICBzdXBlcihtZXNzYWdlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlSdW50aW1lRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisKKyAgICAgICAgcHVibGljIE15UnVudGltZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICAgICAgc3VwZXIobWVzc2FnZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFamJFeGNlcHRpb25NRVNTQUdFID0gImVqYiBleGNlcHRpb24gdGhyb3duIGRpcmVjdGx5IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDaGVja2VkRXhjZXB0aW9uTUVTU0FHRSA9ICJjaGVja2VkIGV4Y2VwdGlvbiB0aHJvd24gZGlyZWN0bHkiOworCisgICAgQEdFVAorICAgIEBQYXRoKCJlamIiKQorICAgIHB1YmxpYyBTdHJpbmcgdGhyb3dFamJFeGNlcHRpb24oKSB7CisgICAgICAgIHRocm93IG5ldyBFSkJFeGNlcHRpb24oRWpiRXhjZXB0aW9uTUVTU0FHRSk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJjaGVja2VkIikKKyAgICBwdWJsaWMgU3RyaW5nIHRocm93Q2hlY2tlZEV4Y2VwdGlvbigpIHRocm93cyBNeUNoZWNrZWRFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgTXlDaGVja2VkRXhjZXB0aW9uKENoZWNrZWRFeGNlcHRpb25NRVNTQUdFKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImN1c3RvbTEve3B9IikKKyAgICBwdWJsaWMgU3RyaW5nIHRocm93Q3VzdG9tRXhjZXB0aW9uT25lKCkgdGhyb3dzIEN1c3RvbUJhc2VFeGNlcHRpb24geworICAgICAgICB0aHJvdyBuZXcgQ3VzdG9tRXhjZXB0aW9uT25lKCk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJjdXN0b20yL3twfSIpCisgICAgcHVibGljIFN0cmluZyB0aHJvd0N1c3RvbUV4Y2VwdGlvblR3bygpIHRocm93cyBDdXN0b21CYXNlRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IEN1c3RvbUV4Y2VwdGlvblR3bygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2VqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2VqYi9yZXNvdXJjZXMvTXlBcHBsaWNhdGlvbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZWpiL3Jlc291cmNlcy9NeUFwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzljODRhMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2VqYi9yZXNvdXJjZXMvTXlBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZWpiLnJlc291cmNlczsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKKworaW1wb3J0IGphdmF4LmVqYi5TaW5nbGV0b247CitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKKy8qKgorICogSkFYLVJTIGFwcGxpY2F0aW9uIHRvIGNvbmZpZ3VyZSByZXNvdXJjZXMuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uUGF0aCgiL3Jlc3QiKQorQFNpbmdsZXRvbgorcHVibGljIGNsYXNzIE15QXBwbGljYXRpb24gZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKyAgICBwcml2YXRlIEF0b21pY0ludGVnZXIgY291bnRlcjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNYXA8U3RyaW5nLCBPYmplY3Q+IGdldFByb3BlcnRpZXMoKSB7CisgICAgICAgIHJldHVybiBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKSB7eworICAgICAgICAgICAgcHV0KCJqZXJzZXkuY29uZmlnLnNlcnZlci5yZXNwb25zZS5zZXRTdGF0dXNPdmVyU2VuZEVycm9yIiwgdHJ1ZSk7CisgICAgICAgIH19OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisKKyAgICAgICAgdGhpcy5jb3VudGVyID0gbmV3IEF0b21pY0ludGVnZXIoKTsKKworICAgICAgICByZXR1cm4gbmV3IEhhc2hTZXQ8Q2xhc3M8Pz4+KCkge3sKKyAgICAgICAgICAgIGFkZChBcHBSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgICAgICBhZGQoRXhjZXB0aW9uRWpiUmVzb3VyY2UuY2xhc3MpOworICAgICAgICAgICAgYWRkKEVjaG9SZXNvdXJjZS5jbGFzcyk7CisgICAgICAgICAgICBhZGQoUmF3RWNob1Jlc291cmNlLmNsYXNzKTsKKyAgICAgICAgICAgIGFkZChDb3VudGVyRmlsdGVyLmNsYXNzKTsKKyAgICAgICAgICAgIGFkZChBc3luY1Jlc291cmNlLmNsYXNzKTsKKyAgICAgICAgICAgIGFkZChFamJFeGNlcHRpb25NYXBwZXJPbmUuY2xhc3MpOworICAgICAgICAgICAgYWRkKEVqYkV4Y2VwdGlvbk1hcHBlclR3by5jbGFzcyk7CisgICAgICAgIH19OworICAgIH0KKworICAgIHB1YmxpYyBpbnQgaW5jcmVtZW50QW5kR2V0Q291bnQoKSB7CisgICAgICAgIHJldHVybiBjb3VudGVyLmluY3JlbWVudEFuZEdldCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2VqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2VqYi9yZXNvdXJjZXMvUmF3RWNoby5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZWpiL3Jlc291cmNlcy9SYXdFY2hvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI1MzM0NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2VqYi9yZXNvdXJjZXMvUmF3RWNoby5qYXZhCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZWpiLnJlc291cmNlczsKKworLyoqCisgKiBQYXJ0IG9mIHRoZSByZXByb2R1Y2VyIGZvciBHTEFTU0ZJU0gtMTYxOTkuIFRoaXMgRUpCIGJ1c2luZXNzIGludGVyZmFjZQorICogaXMgYmVpbmcgcmVnaXN0ZXJlZCBieSBhbiBhbm5vdGF0aW9uIG9uIHRoZSBFSkIgY29tcG9uZW50IGNsYXNzLCB7QGxpbmsgUmF3RWNob1Jlc291cmNlfS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgaW50ZXJmYWNlICBSYXdFY2hvIHsKKworICAgIFN0cmluZyBlY2hvKFN0cmluZyBtZXNzYWdlKTsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2VqYi10ZXN0LXdlYmFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2VqYi9yZXNvdXJjZXMvUmF3RWNob1Jlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lamIvcmVzb3VyY2VzL1Jhd0VjaG9SZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiYmU3N2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lamIvcmVzb3VyY2VzL1Jhd0VjaG9SZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuZWpiLnJlc291cmNlczsKKworaW1wb3J0IGphdmF4LmVqYi5FSkI7CitpbXBvcnQgamF2YXguZWpiLlJlbW90ZTsKK2ltcG9ydCBqYXZheC5lamIuU3RhdGVsZXNzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKKworLyoqCisgKiBKQVgtUlMgcmVzb3VyY2UgYmVhbiBiYWNrZWQgYnkgYW4gRUpCIHNlc3Npb24gYmVhbgorICogaW1wbGVtZW50aW5nIEVKQiBpbnRlcmZhY2UsIHtAbGluayBSYXdFY2hvfSwgdGhhdCBpcyByZWdpc3RlcmVkIHVzaW5nIHtAbGluayBSZW1vdGV9IGFubm90YXRpb25zLgorICogUmVwcm9kdWNpYmxlIHRlc3QgY2FzZSBmb3IgR0xBU1NGSVNILTE2MTk5LgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTdGF0ZWxlc3MKK0BQYXRoKCJyYXctZWNobyIpCitAUmVtb3RlKFJhd0VjaG8uY2xhc3MpCitwdWJsaWMgY2xhc3MgUmF3RWNob1Jlc291cmNlIHsKKworICAgIEBFSkIgRWNob0JlYW4gZWNob1NlcnZpY2U7CisKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBlY2hvKEBRdWVyeVBhcmFtKCJtZXNzYWdlIikgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgcmV0dXJuIGVjaG9TZXJ2aWNlLmVjaG8obWVzc2FnZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZWpiL3Jlc291cmNlcy9TdGFuZGFsb25lU2VydmxldC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vZWpiLXRlc3Qtd2ViYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvZWpiL3Jlc291cmNlcy9TdGFuZGFsb25lU2VydmxldC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5ZTlhZDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItdGVzdC13ZWJhcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lamIvcmVzb3VyY2VzL1N0YW5kYWxvbmVTZXJ2bGV0LmphdmEKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lamIucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LmVqYi5FSkI7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5hbm5vdGF0aW9uLldlYlNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKKy8qKgorICogU3RhbmRhbG9uZSBTZXJ2bGV0IGluc3RhbmNlIHRoYXQgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCBKZXJzZXkuCisgKiBJdCBoZWxwcyB0byBjb21wYXJlIEplcnNleSBhbmQgbm9uLUplcnNleSBzcGVjaWZpYyBleGNlcHRpb24gaGFuZGxpbmcKKyAqIHByb2Nlc3NpbmcuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFdlYlNlcnZsZXQobmFtZSA9ICJTdGFuZGFsb25lU2VydmxldCIsIHVybFBhdHRlcm5zID0geyIvc2VydmxldCJ9KQorcHVibGljIGNsYXNzIFN0YW5kYWxvbmVTZXJ2bGV0IGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBUaHJvd0NoZWNrZWRFeGNlcHRpb25BQ1RJT04gPSAidGhyb3dDaGVja2VkRXhjZXB0aW9uIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRocm93RWpiRXhjZXB0aW9uQUNUSU9OID0gInRocm93RWpiRXhjZXB0aW9uIjsKKworICAgIEBFSkIgRXhjZXB0aW9uRWpiUmVzb3VyY2UgZWpiUmVzb3VyY2U7CisKKyAgICAvKioKKyAgICAgKiBIYW5kbGVzIHRoZSBIVFRQIDxjb2RlPkdFVDwvY29kZT4gbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIHJlcXVlc3Qgc2VydmxldCByZXF1ZXN0LgorICAgICAqIEBwYXJhbSByZXNwb25zZSBzZXJ2bGV0IHJlc3BvbnNlLgorICAgICAqIEB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiBpZiBhIHNlcnZsZXQtc3BlY2lmaWMgZXJyb3Igb2NjdXJzLgorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgYW4gSS9PIGVycm9yIG9jY3Vycy4KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkKKyAgICAgICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGFjdGlvbiA9IHJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJhY3Rpb24iKTsKKworICAgICAgICBpZiAoVGhyb3dDaGVja2VkRXhjZXB0aW9uQUNUSU9OLmVxdWFscyhhY3Rpb24pKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIGVqYlJlc291cmNlLnRocm93Q2hlY2tlZEV4Y2VwdGlvbigpOworICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uRWpiUmVzb3VyY2UuTXlDaGVja2VkRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFNlcnZsZXRFeGNlcHRpb24oZXgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKFRocm93RWpiRXhjZXB0aW9uQUNUSU9OLmVxdWFscyhhY3Rpb24pKSB7CisgICAgICAgICAgICBlamJSZXNvdXJjZS50aHJvd0VqYkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgc2F5SGVsbG8ocmVzcG9uc2UpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzYXlIZWxsbyhIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICByZXNwb25zZS5zZXRIZWFkZXIoIkNvbnRlbnQtdHlwZSIsICJ0ZXh0L3BsYWluIik7CisgICAgICAgIHJlc3BvbnNlLmdldE91dHB1dFN0cmVhbSgpLnByaW50KAorICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIlVzZSBhY3Rpb24gcGFyYW1ldGVyIHRvIHNwZWNpZnkgZXhjZXB0aW9uLiIKKyAgICAgICAgICAgICAgICArICIgXG5TdXBwb3J0ZWQgb3B0aW9uczogJXMsICVzLiIsIFRocm93Q2hlY2tlZEV4Y2VwdGlvbkFDVElPTiwgVGhyb3dFamJFeGNlcHRpb25BQ1RJT04pKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9lamItdGVzdC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lamIvcmVzb3VyY2VzL0VqYlRlc3QuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2VqYi10ZXN0LXdlYmFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2VqYi9yZXNvdXJjZXMvRWpiVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ODhjZjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9lamItdGVzdC13ZWJhcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9lamIvcmVzb3VyY2VzL0VqYlRlc3QuamF2YQpAQCAtMCwwICsxLDE5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5lamIucmVzb3VyY2VzOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5jb250YWluc1N0cmluZzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lbmRzV2l0aDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5zdGFydHNXaXRoOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlcnMuZ3JlYXRlclRoYW47CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVycy5sZXNzVGhhbjsKKworLyoqCisgKiBUZXN0IGZvciBFSkIgd2ViIGFwcGxpY2F0aW9uIHJlc291cmNlcy4KKyAqIFJ1biB3aXRoOgorICogPHByZT4KKyAqIG12biBjbGVhbiBwYWNrYWdlCisgKiAkQVNfSE9NRS9iaW4vYXNhZG1pbiBkZXBsb3kgdGFyZ2V0L2VqYi10ZXN0LXdlYmFwcAorICogbXZuIC1Ec2tpcFRlc3RzPWZhbHNlIHRlc3Q8L3ByZT4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgRWpiVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNeUFwcGxpY2F0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFVSSSBnZXRCYXNlVXJpKCkgeworICAgICAgICByZXR1cm4gVXJpQnVpbGRlci5mcm9tVXJpKHN1cGVyLmdldEJhc2VVcmkoKSkucGF0aCgiZWpiLXRlc3Qtd2ViYXBwIikuYnVpbGQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcucmVnaXN0ZXIoTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVqYkV4Y2VwdGlvbigpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgamVyc2V5UmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXN0L2V4Y2VwdGlvbi9lamIiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIF9jaGVjazUwMFJlc3BvbnNlKGplcnNleVJlc3BvbnNlLCBFeGNlcHRpb25FamJSZXNvdXJjZS5FamJFeGNlcHRpb25NRVNTQUdFKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSBzZXJ2bGV0UmVzcG9uc2UgPQorICAgICAgICAgICAgICAgIHRhcmdldCgpLnBhdGgoInNlcnZsZXQiKQorICAgICAgICAgICAgICAgICAgLnF1ZXJ5UGFyYW0oImFjdGlvbiIsIFN0YW5kYWxvbmVTZXJ2bGV0LlRocm93RWpiRXhjZXB0aW9uQUNUSU9OKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIF9jaGVjazUwMFJlc3BvbnNlKHNlcnZsZXRSZXNwb25zZSwgRXhjZXB0aW9uRWpiUmVzb3VyY2UuRWpiRXhjZXB0aW9uTUVTU0FHRSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tlZEV4Y2VwdGlvbigpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgamVyc2V5UmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXN0L2V4Y2VwdGlvbi9jaGVja2VkIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBfY2hlY2s1MDBSZXNwb25zZShqZXJzZXlSZXNwb25zZSwgRXhjZXB0aW9uRWpiUmVzb3VyY2UuQ2hlY2tlZEV4Y2VwdGlvbk1FU1NBR0UpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHNlcnZsZXRSZXNwb25zZSA9CisgICAgICAgICAgICAgICAgdGFyZ2V0KCkucGF0aCgic2VydmxldCIpCisgICAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgiYWN0aW9uIiwgU3RhbmRhbG9uZVNlcnZsZXQuVGhyb3dDaGVja2VkRXhjZXB0aW9uQUNUSU9OKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIF9jaGVjazUwMFJlc3BvbnNlKHNlcnZsZXRSZXNwb25zZSwgRXhjZXB0aW9uRWpiUmVzb3VyY2UuQ2hlY2tlZEV4Y2VwdGlvbk1FU1NBR0UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbUV4Y2VwdGlvbjEoKSB7CisgICAgICAgIFJlc3BvbnNlIGplcnNleVJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzdC9leGNlcHRpb24vY3VzdG9tMS9iaWciKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQoamVyc2V5UmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KGplcnNleVJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoRWpiRXhjZXB0aW9uTWFwcGVyT25lLlJFU1BPTlNFX0JPRFkpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChqZXJzZXlSZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIk15LUxvY2F0aW9uIiksIGlzKCJleGNlcHRpb24vY3VzdG9tMS9iaWciKSk7CisgICAgICAgIGFzc2VydFRoYXQoamVyc2V5UmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJNeS1FY2hvIiksIGlzKCJFQ0hPRUQ6IDEiKSk7CisKKyAgICAgICAgamVyc2V5UmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXN0L2V4Y2VwdGlvbi9jdXN0b20xL29uZSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChqZXJzZXlSZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQoamVyc2V5UmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBpcyhFamJFeGNlcHRpb25NYXBwZXJPbmUuUkVTUE9OU0VfQk9EWSkpOworICAgICAgICBhc3NlcnRUaGF0KGplcnNleVJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiTXktTG9jYXRpb24iKSwgaXMoImV4Y2VwdGlvbi9jdXN0b20xL29uZSIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChqZXJzZXlSZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIk15LUVjaG8iKSwgaXMoIkVDSE9FRDogMSIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21FeGNlcHRpb24yKCkgeworICAgICAgICBSZXNwb25zZSBqZXJzZXlSZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc3QvZXhjZXB0aW9uL2N1c3RvbTIvc21hbGwiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQoamVyc2V5UmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KGplcnNleVJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoRWpiRXhjZXB0aW9uTWFwcGVyVHdvLlJFU1BPTlNFX0JPRFkpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChqZXJzZXlSZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIk15LUxvY2F0aW9uIiksIGlzKCJleGNlcHRpb24vY3VzdG9tMi9zbWFsbCIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChqZXJzZXlSZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoIk15LUVjaG8iKSwgaXMoIkVDSE9FRDogMiIpKTsKKworICAgICAgICBqZXJzZXlSZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc3QvZXhjZXB0aW9uL2N1c3RvbTIvb25lIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KGplcnNleVJlc3BvbnNlLmdldFN0YXR1cygpLCBpcygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChqZXJzZXlSZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGlzKEVqYkV4Y2VwdGlvbk1hcHBlclR3by5SRVNQT05TRV9CT0RZKSk7CisgICAgICAgIGFzc2VydFRoYXQoamVyc2V5UmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKCJNeS1Mb2NhdGlvbiIpLCBpcygiZXhjZXB0aW9uL2N1c3RvbTIvb25lIikpOworICAgICAgICBhc3NlcnRUaGF0KGplcnNleVJlc3BvbnNlLmdldEhlYWRlclN0cmluZygiTXktRWNobyIpLCBpcygiRUNIT0VEOiAyIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlbW90ZUxvY2FsRUpCSW50ZXJmYWNlKCkgeworCisgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gIkhpIHRoZXJlIjsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXN0L2VjaG8iKS5xdWVyeVBhcmFtKCJtZXNzYWdlIiwgbWVzc2FnZSkucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworCisgICAgICAgIGZpbmFsIFN0cmluZyByZXNwb25zZU1lc3NhZ2UgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZU1lc3NhZ2UsIHN0YXJ0c1dpdGgoRWNob0JlYW4uUFJFRklYKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2VNZXNzYWdlLCBlbmRzV2l0aChtZXNzYWdlKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3RlQW5ub3RhdGlvblJlZ2lzdGVyZWRFSkJJbnRlcmZhY2UoKSB7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSAiSGkgdGhlcmUiOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc3QvcmF3LWVjaG8iKS5xdWVyeVBhcmFtKCJtZXNzYWdlIiwgbWVzc2FnZSkucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworCisgICAgICAgIGZpbmFsIFN0cmluZyByZXNwb25zZU1lc3NhZ2UgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZU1lc3NhZ2UsIHN0YXJ0c1dpdGgoRWNob0JlYW4uUFJFRklYKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2VNZXNzYWdlLCBlbmRzV2l0aChtZXNzYWdlKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWVzdENvdW50R2V0c0luY3JlbWVudGVkKCkgeworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlMSA9IHRhcmdldCgpLnBhdGgoInJlc3QvZWNobyIpLnF1ZXJ5UGFyYW0oIm1lc3NhZ2UiLCAid2hhdGV2ZXIiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UxLmdldFN0YXR1cygpLCBpcygyMDApKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGNvdW50ZXJIZWFkZXIxID0gcmVzcG9uc2UxLmdldEhlYWRlclN0cmluZyhDb3VudGVyRmlsdGVyLlJlcXVlc3RDb3VudEhFQURFUik7CisgICAgICAgIGZpbmFsIGludCByZXF1ZXN0Q291bnQxID0gSW50ZWdlci5wYXJzZUludChjb3VudGVySGVhZGVyMSk7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UyID0gdGFyZ2V0KCkucGF0aCgicmVzdC9lY2hvIikucXVlcnlQYXJhbSgibWVzc2FnZSIsIHJlcXVlc3RDb3VudDEpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZTIuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICBmaW5hbCBpbnQgcmVxdWVzdENvdW50MiA9IEludGVnZXIucGFyc2VJbnQocmVzcG9uc2UyLmdldEhlYWRlclN0cmluZyhDb3VudGVyRmlsdGVyLlJlcXVlc3RDb3VudEhFQURFUikpOworCisgICAgICAgIGFzc2VydFRoYXQocmVxdWVzdENvdW50MiwgaXMoZ3JlYXRlclRoYW4ocmVxdWVzdENvdW50MSkpKTsKKyAgICB9CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN5bmMoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzdC9hc3luYy10ZXN0L3N5bmMiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoInN5bmMiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmMoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzdC9hc3luYy10ZXN0L2FzeW5jIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGlzKCJhc3luYyIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBJc0VqYlNpbmdsZXRvbigpIHsKKworICAgICAgICBpbnQgYzEgPSB0YXJnZXQoKS5wYXRoKCJyZXN0L2FwcC9jb3VudCIpLnJlcXVlc3QoKS5nZXQoSW50ZWdlci5jbGFzcyk7CisgICAgICAgIGludCBjMiA9IHRhcmdldCgpLnBhdGgoInJlc3QvYXBwL2NvdW50IikucmVxdWVzdCgpLmdldChJbnRlZ2VyLmNsYXNzKTsKKyAgICAgICAgaW50IGMzID0gdGFyZ2V0KCkucGF0aCgicmVzdC9hcHAvY291bnQiKS5yZXF1ZXN0KCkuZ2V0KEludGVnZXIuY2xhc3MpOworCisgICAgICAgIGFzc2VydFRoYXQoInRoZSBmaXJzdCBjb3VudCBzaG91bGQgYmUgbGVzcyB0aGFuIHRoZSBzZWNvbmQgb25lIiwgYzEsIGlzKGxlc3NUaGFuKGMyKSkpOworICAgICAgICBhc3NlcnRUaGF0KCJ0aGUgc2Vjb25kIGNvdW50IHNob3VsZCBiZSBsZXNzIHRoYW4gdGhlIHRoaXJkIG9uZSIsIGMyLCBpcyhsZXNzVGhhbihjMykpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX2NoZWNrNTAwUmVzcG9uc2UoZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UsIGZpbmFsIFN0cmluZyBleHBlY3RlZFN1YnN0cmluZykgeworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcyg1MDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGNvbnRhaW5zU3RyaW5nKGV4cGVjdGVkU3Vic3RyaW5nKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vai0zNzYvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2otMzc2L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDkwOGU3YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2otMzc2L3BvbS54bWwKQEAgLTAsMCArMSwxMTIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICAgIDxwYXJlbnQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+ai0zNzY8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qLTM3Ni1yZXByb2R1Y2VyPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPkplcnNleSB0ZXN0IHdlYiBhcHBsaWNhdGlvbiAtIEotMzc2IHJlcHJvZHVjZXI8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LndzLnJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXgud3MucnMtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguZW50ZXJwcmlzZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmNkaS1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LmFubm90YXRpb248L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5hbm5vdGF0aW9uLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgudmFsaWRhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnZhbGlkYXRpb24tYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorICAgICAgICAgICAgPHZlcnNpb24+MS4xLjAuRmluYWw8L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktc2VydmVyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQuY2RpPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXdlbGQyLXNlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0LmNkaTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jZGkxeDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guZ3JpenpseTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmdyaXp6bHktaHR0cC1zZXJ2ZXI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4yLjMuMTY8L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLWdyaXp6bHkyLWh0dHA8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhlYy1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxtYWluQ2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uajM3Ni5Hcml6emx5QXBwPC9tYWluQ2xhc3M+CisgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGhTY29wZT50ZXN0PC9jbGFzc3BhdGhTY29wZT4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qLTM3Ni9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2ozNzYvQXBwbGljYXRpb25TY29wZWRCZWFuLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTM3Ni9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2ozNzYvQXBwbGljYXRpb25TY29wZWRCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY1ZTc4ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2otMzc2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajM3Ni9BcHBsaWNhdGlvblNjb3BlZEJlYW4uamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmozNzY7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuQXBwbGljYXRpb25TY29wZWQ7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworCisKKy8qKgorICogVGVzdCB7QGNvZGUgQXBwbGljYXRpb25TY29wZWR9IGJlYW4gdG8gYmUgaW5qZWN0ZWQgdG8gdGhlIHRlc3QgcmVzb3VyY2UsIHdoaWxlIGFub3RoZXIge0Bjb2RlIFJlcXVlc3RTY29wZWR9CisgKiBiZWFuIGJlaW5nIGluamVjdGVkIGludG8gdGhpcyBjbGFzcy4KKyAqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK0BBcHBsaWNhdGlvblNjb3BlZAorcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uU2NvcGVkQmVhbiB7CisKKyAgICAvKiogUmVxdWVzdCBzY29wZWQgYmVhbiBpbmplY3RlZCB2aWEgQ0RJICovCisgICAgQEluamVjdAorICAgIHByaXZhdGUgU2Vjb25kQmVhbiBiZWFuOworCisgICAgLyoqIEpBWC1SUyB7QGNvZGUgQ29udGV4dH0gaW5qZWN0aW9uIG9mIHJlcXVlc3Qge0Bjb2RlIFVyaUluZm99ICovCisgICAgQENvbnRleHQKKyAgICBwcml2YXRlIFVyaUluZm8gdXJpOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZSA9ICJBcHBsaWNhdGlvblNjb3BlZEJlYW4iOworCisgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgeworICAgICAgICByZXR1cm4gbmFtZSArICI6IiArIGJlYW4uZ2V0TWVzc2FnZSgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VXJpKCkgeworICAgICAgICByZXR1cm4gdXJpLmdldFBhdGgoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qLTM3Ni9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2ozNzYvQXBwbGljYXRpb25TY29wZWRSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vai0zNzYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qMzc2L0FwcGxpY2F0aW9uU2NvcGVkUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGJmMDU1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vai0zNzYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qMzc2L0FwcGxpY2F0aW9uU2NvcGVkUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmozNzY7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuQXBwbGljYXRpb25TY29wZWQ7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC53cy5ycy5CZWFuUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKKworLyoqCisgKiBSZXNvdXJjZSB0byB0ZXN0IENESSBpbmplY3Rpb24gaW50byB7QGNvZGUgQXBwbGljYXRpb25TY29wZWR9IEpBWC1SUyByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJhcHBTY29wZSIpCitAQXBwbGljYXRpb25TY29wZWQKK3B1YmxpYyBjbGFzcyBBcHBsaWNhdGlvblNjb3BlZFJlc291cmNlIHsKKworICAgIC8qKiBBcHBsaWNhdGlvbiBzY29wZWQgQ0RJIGluamVjdGVkIGJlYW4gKi8KKyAgICBASW5qZWN0CisgICAgcHJpdmF0ZSBBcHBsaWNhdGlvblNjb3BlZEJlYW4gYXBwU2NvcGVkOworCisgICAgLyoqIFJlcXVlc3Qgc2NvcGVkIENESSBpbmplY3RlZCBiZWFuICovCisgICAgQEluamVjdAorICAgIHByaXZhdGUgU2Vjb25kQmVhbiByZXFTY29wZWQ7CisKKyAgICAvKiogQmVhbiBjb250YWluaW5nIGZvcm0gcGFyYW1ldGVycyBpbmplY3RlZCBieSBKQVgtUlMgKi8KKyAgICBASW5qZWN0CisgICAgQEJlYW5QYXJhbQorICAgIHByaXZhdGUgRm9ybURhdGFCZWFuIGJlYW47CisKKyAgICBAUE9TVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgIHJldHVybiBiZWFuLmdldE5hbWUoKSArICI6IiArIGJlYW4uZ2V0QWdlKCkgKyAiOiIKKyAgICAgICAgICAgICAgICArIGJlYW4uZ2V0SW5qZWN0ZWRCZWFuKCkuZ2V0TWVzc2FnZSgpICsgIjoiICsgYmVhbi5nZXRJbmplY3RlZFBhdGgoKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoIm1zZyIpCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgU3RyaW5nIHRlc3RBcHBTY29wZWQoKSB7CisgICAgICAgIHJldHVybiBhcHBTY29wZWQuZ2V0TWVzc2FnZSgpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgidXJpIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldFVyaSgpIHsKKyAgICAgICAgcmV0dXJuIGFwcFNjb3BlZC5nZXRVcmkoKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInJlcSIpCisgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgeworICAgICAgICByZXR1cm4gcmVxU2NvcGVkLmdldE1lc3NhZ2UoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qLTM3Ni9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2ozNzYvQ29uc3RydWN0b3JJbmplY3Rpb25SZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vai0zNzYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qMzc2L0NvbnN0cnVjdG9ySW5qZWN0aW9uUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDE2NzMzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vai0zNzYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qMzc2L0NvbnN0cnVjdG9ySW5qZWN0aW9uUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmozNzY7CisKK2ltcG9ydCBqYXZheC53cy5ycy5CZWFuUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LlJlcXVlc3RTY29wZWQ7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkOworCisvKioKKyAqIFJlc291cmNlIHRvIHRlc3QgQ0RJIGluamVjdGlvbiBpbnRvIEpBWC1SUyByZXNvdXJjZSB2aWEgY29uc3RydWN0b3IgcGFyYW1ldGVyLgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoImNvbnN0cnVjdG9yIikKK0BSZXF1ZXN0U2NvcGVkCitwdWJsaWMgY2xhc3MgQ29uc3RydWN0b3JJbmplY3Rpb25SZXNvdXJjZSB7CisKKyAgICBwcml2YXRlIEZvcm1EYXRhQmVhbiBiZWFuOworCisgICAgcHVibGljIENvbnN0cnVjdG9ySW5qZWN0aW9uUmVzb3VyY2UoKSB7CisgICAgfQorCisgICAgQEluamVjdAorICAgIHB1YmxpYyBDb25zdHJ1Y3RvckluamVjdGlvblJlc291cmNlKEBWYWxpZCBAQmVhblBhcmFtIGZpbmFsIEZvcm1EYXRhQmVhbiBmb3JtKSB7CisgICAgICAgIGJlYW4gPSBmb3JtOworICAgIH0KKworICAgIEBQT1NUCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgcmV0dXJuIGJlYW4uZ2V0TmFtZSgpICsgIjoiICsgYmVhbi5nZXRBZ2UoKSArICI6IgorICAgICAgICAgICAgICAgICsgYmVhbi5nZXRJbmplY3RlZEJlYW4oKS5nZXRNZXNzYWdlKCkgKyAiOiIgKyBiZWFuLmdldEluamVjdGVkUGF0aCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2otMzc2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajM3Ni9GaWVsZEluamVjdGlvblJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTM3Ni9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2ozNzYvRmllbGRJbmplY3Rpb25SZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0YzZlYzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTM3Ni9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2ozNzYvRmllbGRJbmplY3Rpb25SZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uajM3NjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuUmVxdWVzdFNjb3BlZDsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWQ7CitpbXBvcnQgamF2YXgud3MucnMuQmVhblBhcmFtOworCisvKioKKyAqIFJlc291cmNlIHRvIHRlc3QgQ0RJIGluamVjdGlvbiBpbnRvIEpBWC1SUyByZXNvdXJjZSB2aWEgZmllbGQuCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiZmllbGQiKQorQFJlcXVlc3RTY29wZWQKK3B1YmxpYyBjbGFzcyBGaWVsZEluamVjdGlvblJlc291cmNlIHsKKworICAgIC8qKiBDREkgaW5qZWN0ZWQgcmVxdWVzdCBzY29wZWQgZmllbGQgKi8KKyAgICBASW5qZWN0CisgICAgQFZhbGlkCisgICAgQEJlYW5QYXJhbQorICAgIHByaXZhdGUgRm9ybURhdGFCZWFuIGJlYW47CisKKyAgICAvKiogQ0RJIGluamVjdGVkIGFwcGxjaWF0aW9uIHNjb3BlZCBiZWFuICovCisgICAgQEluamVjdAorICAgIHByaXZhdGUgQXBwbGljYXRpb25TY29wZWRCZWFuIGFwcFNjb3BlZDsKKworICAgIC8qKgorICAgICAqIFJldHVybiBzdHJpbmcgY29udGFpbmluZyBvZiBmaWVsZHMgZnJvbSB0aGUgaW5qZWN0ZWQgbm9uIEpBWC1SUyByZXF1ZXN0IHNjb3BlZCBiZWFuLAorICAgICAqIHBhdGggaW5qZWN0ZWQgaW50byBpdCB2aWEge0Bjb2RlIENvbnRleHR9IGFubm90YXRpb24gYW5kIGFub3RoZXIgYmVhbiBpbmplY3RlZCBpbnRvIGl0LgorICAgICAqCisgICAgICogU2hvd3MsIHRoYXQge0Bjb2RlIEluamVjdH0gYW5kIHtAY29kZSBDb250ZXh0fSBhbm5vdGF0aW9ucyBjYW4gYmUgdXNlZCBvbiBvbmUgcGFydGljdWxhciBub24gSkFYLVJTIGNsYXNzLgorICAgICAqKi8KKyAgICBAUE9TVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgIHJldHVybiBiZWFuLmdldE5hbWUoKSArICI6IiArIGJlYW4uZ2V0QWdlKCkgKyAiOiIKKyAgICAgICAgICAgICAgICArIGJlYW4uZ2V0SW5qZWN0ZWRCZWFuKCkuZ2V0TWVzc2FnZSgpICsgIjoiICsgYmVhbi5nZXRJbmplY3RlZFBhdGgoKTsKKyAgICB9CisKKyAgICAvKiogUmV0dXJuIHN0cmluZyBmcm9tIHRoZSB7QGNvZGUgQXBwbGljYXRpb25TY29wZWR9IG5vbiBKQVhfUlMgYmVhbiBpbmplY3RlZCBpbnRvIHRoaXMgSkFYLVJTIHJlc291cmNlLiAqLworICAgIEBHRVQKKyAgICBAUGF0aCgiYXBwU2NvcGVkIikKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKKyAgICAgICAgcmV0dXJuIGFwcFNjb3BlZC5nZXRNZXNzYWdlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJuIHBhdGggaW5qZWN0ZWQgdmlhIHtAY29kZSBDb250ZXh0fSBhbm5vdGF0aW9uIGludG8ge0Bjb2RlIEFwcGxpY2F0aW9uU2NvcGVkfSBub24gSkFYLVJTIGJlYW4sIHRoYXQgaXMKKyAgICAgKiBmdXJ0aGVyIGluamVjdGVkIGludG8gdGhpcyBKQVgtUlMgcmVzb3VyY2UgdmlhIENESS4KKyAgICAgKi8KKyAgICBAR0VUCisgICAgQFBhdGgoImFwcFNjb3BlZFVyaSIpCisgICAgcHVibGljIFN0cmluZyBnZXRVcmkoKSB7CisgICAgICAgIHJldHVybiBhcHBTY29wZWQuZ2V0VXJpKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vai0zNzYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qMzc2L0Zvcm1EYXRhQmVhbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vai0zNzYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qMzc2L0Zvcm1EYXRhQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxOWM0OTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTM3Ni9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2ozNzYvRm9ybURhdGFCZWFuLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qMzc2OworCitpbXBvcnQgamF2YXgud3MucnMuRm9ybVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlBvc3RDb25zdHJ1Y3Q7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LlJlcXVlc3RTY29wZWQ7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk1pbjsKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5TaXplOworCisvKioKKyAqIFRlc3QgYmVhbiBjb250YWluaW5nYm90aCBKQVgtUlMgYW5kIENESSBpbmplY3Rpb24gcG9pbnRzLgorICovCitAUmVxdWVzdFNjb3BlZAorcHVibGljIGNsYXNzIEZvcm1EYXRhQmVhbiB7CisKKyAgICBwcml2YXRlIFN0cmluZyBpbmplY3RlZFBhdGggPSBudWxsOworCisgICAgQE5vdE51bGwKKyAgICBAU2l6ZShtaW4gPSA0KQorICAgIEBGb3JtUGFyYW0oIm5hbWUiKQorICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgICBATWluKDE4KQorICAgIEBGb3JtUGFyYW0oImFnZSIpCisgICAgcHJpdmF0ZSBpbnQgYWdlOworCisgICAgQEluamVjdAorICAgIHByaXZhdGUgU2Vjb25kQmVhbiBpbmplY3RlZEJlYW47CisKKyAgICBAQ29udGV4dAorICAgIHByaXZhdGUgVXJpSW5mbyB1cmk7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBpbnQgZ2V0QWdlKCkgeworICAgICAgICByZXR1cm4gYWdlOworICAgIH0KKworICAgIC8qKgorICAgICAqIEV4cG9zZXMgdGhlIHN0YXRlIG9mIGluamVjdGVkIHtAY29kZSBVcmlJbmZvfSBpbiB0aGUgdGltZSBvZiB0aGUgY2FsbCBvZiB7QGxpbmsgamF2YXguYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0fQorICAgICAqIGFubm90YXRlZCBtZXRob2QuIFRoZSByZXR1cm5lZCB2YWx1ZSB3aWxsIGJlIHVzZWQgaW4gdGVzdCB0byBlbnN1cmUsIHRoYXQge0Bjb2RlIFVyaUluZm99IGlzIGluamVjdGVkIGluIHRpbWUKKyAgICAgKgorICAgICAqIEByZXR1cm4gcGF0aCBpbmplY3RlZCB2aWEge0Bjb2RlIFVyaUluZm99IGF0IHRoZSB0aW1lLXBvaW50IG9mIHRoZSB7QGxpbmsgI3Bvc3RDb25zdHJ1Y3QoKX0gbWV0aG9kIGNhbGwuCisKKyAgICAgKi8KKyAgICBwdWJsaWMgU3RyaW5nIGdldEluamVjdGVkUGF0aCgpIHsKKyAgICAgICAgcmV0dXJuIGluamVjdGVkUGF0aDsKKyAgICB9CisKKyAgICBwdWJsaWMgU2Vjb25kQmVhbiBnZXRJbmplY3RlZEJlYW4oKSB7CisgICAgICAgIHJldHVybiBpbmplY3RlZEJlYW47CisgICAgfQorCisgICAgQFBvc3RDb25zdHJ1Y3QKKyAgICBwdWJsaWMgdm9pZCBwb3N0Q29uc3RydWN0KCkgeworICAgICAgICB0aGlzLmluamVjdGVkUGF0aCA9IHVyaS5nZXRQYXRoKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qLTM3Ni9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2ozNzYvR3JpenpseUFwcC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vai0zNzYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qMzc2L0dyaXp6bHlBcHAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGU2ZDljCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vai0zNzYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qMzc2L0dyaXp6bHlBcHAuamF2YQpAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmozNzY7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmdyaXp6bHkuaHR0cC5zZXJ2ZXIuSHR0cFNlcnZlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5Mi5odHRwc2VydmVyLkdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmpib3NzLndlbGQuZW52aXJvbm1lbnQuc2UuV2VsZDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworLyoqCisgKiBDREkgVGVzdCBBcHAgbGF1bmNoZXIuIFN0YXJ0cyB0aGUgR3JpenpseSBzZXJ2ZXIgYW5kIGluaXRpYWxpemVzIHdlbGQuCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgR3JpenpseUFwcCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBXZWxkIHdlbGQ7CisgICAgcHJpdmF0ZSBzdGF0aWMgSHR0cFNlcnZlciBzZXJ2ZXI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgQkFTRV9VUkkgPSBVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvajM3Ni8iKTsKKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSmVyc2V5IENESSBUZXN0IEFwcCIpOworCisgICAgICAgICAgICBzdGFydCgpOworCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oU3RyaW5nLmZvcm1hdCgiQXBwbGljYXRpb24gc3RhcnRlZC5cblRyeSBvdXQgJXMlc1xuSGl0IGVudGVyIHRvIHN0b3AgaXQuLi4iLAorICAgICAgICAgICAgICAgICAgICBCQVNFX1VSSSwgImFwcGxpY2F0aW9uLndhZGwiKSk7CisgICAgICAgICAgICBTeXN0ZW0uaW4ucmVhZCgpOworICAgICAgICAgICAgc3RvcCgpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgTG9nZ2VyLmdldExvZ2dlcihHcml6emx5QXBwLmNsYXNzLmdldE5hbWUoKSkubG9nKExldmVsLlNFVkVSRSwgbnVsbCwgZXgpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgc3RvcCgpIHsKKyAgICAgICAgc2VydmVyLnNodXRkb3duTm93KCk7CisgICAgICAgIHdlbGQuc2h1dGRvd24oKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgc3RhcnQoKSB7CisgICAgICAgIHdlbGQgPSBuZXcgV2VsZCgpOworICAgICAgICB3ZWxkLmluaXRpYWxpemUoKTsKKworICAgICAgICBzZXJ2ZXIgPSBHcml6emx5SHR0cFNlcnZlckZhY3RvcnkuY3JlYXRlSHR0cFNlcnZlcihCQVNFX1VSSSwgY3JlYXRlSmF4UnNBcHAoKSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBVUkkgZ2V0QmFzZVVyaSgpIHsKKyAgICAgICAgcmV0dXJuIEJBU0VfVVJJOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VDb25maWcgY3JlYXRlSmF4UnNBcHAoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcobmV3IE15QXBwbGljYXRpb24oKS5nZXRDbGFzc2VzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2otMzc2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajM3Ni9NZXRob2RJbmplY3Rpb25SZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vai0zNzYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qMzc2L01ldGhvZEluamVjdGlvblJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YxOTY3NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2otMzc2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajM3Ni9NZXRob2RJbmplY3Rpb25SZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uajM3NjsKKworCitpbXBvcnQgamF2YXgud3MucnMuQmVhblBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKKworaW1wb3J0IGphdmF4LmVudGVycHJpc2UuY29udGV4dC5SZXF1ZXN0U2NvcGVkOworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5WYWxpZDsKKworLyoqCisgKiBSZXNvdXJjZSB0byB0ZXN0IENESSBpbmplY3Rpb24gaW50byBKQVgtUlMgcmVzb3VyY2UgdmlhIHNldHRlci4KKyAqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJtZXRob2QiKQorQFJlcXVlc3RTY29wZWQKK3B1YmxpYyBjbGFzcyBNZXRob2RJbmplY3Rpb25SZXNvdXJjZSB7CisKKyAgICBwcml2YXRlIEZvcm1EYXRhQmVhbiBiZWFuOworCisgICAgQEluamVjdAorICAgIHB1YmxpYyB2b2lkIHNldEZvcm1EYXRhQmVhbihAVmFsaWQgQEJlYW5QYXJhbSBmaW5hbCBGb3JtRGF0YUJlYW4gZm9ybSkgeworICAgICAgICBiZWFuID0gZm9ybTsKKyAgICB9CisKKyAgICBAUE9TVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgIHJldHVybiBiZWFuLmdldE5hbWUoKSArICI6IiArIGJlYW4uZ2V0QWdlKCkgKyAiOiIKKyAgICAgICAgICAgICAgICArIGJlYW4uZ2V0SW5qZWN0ZWRCZWFuKCkuZ2V0TWVzc2FnZSgpICsgIjoiICsgYmVhbi5nZXRJbmplY3RlZFBhdGgoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qLTM3Ni9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2ozNzYvTXlBcHBsaWNhdGlvbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vai0zNzYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qMzc2L015QXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWMwYmViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vai0zNzYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qMzc2L015QXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmozNzY7CisKK2ltcG9ydCBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIEpBWC1SUyBBcHBsaWNhdGlvbiBzdWJjbGFzcywgZGVmaW5lcyB0aGUgdGVzdCBhcHBsaWNhdGlvbiByZXNvdXJjZXMuCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitAQXBwbGljYXRpb25QYXRoKCIvKiIpCitwdWJsaWMgY2xhc3MgTXlBcHBsaWNhdGlvbiBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IGNsYXNzZXMgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgIGNsYXNzZXMuYWRkKE1ldGhvZEluamVjdGlvblJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgY2xhc3Nlcy5hZGQoQ29uc3RydWN0b3JJbmplY3Rpb25SZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIGNsYXNzZXMuYWRkKEZpZWxkSW5qZWN0aW9uUmVzb3VyY2UuY2xhc3MpOworICAgICAgICBjbGFzc2VzLmFkZChBcHBsaWNhdGlvblNjb3BlZFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIGNsYXNzZXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vai0zNzYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qMzc2L1NlY29uZEJlYW4uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2otMzc2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajM3Ni9TZWNvbmRCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU1ZWFkNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2otMzc2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajM3Ni9TZWNvbmRCZWFuLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qMzc2OworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LlJlcXVlc3RTY29wZWQ7CisKKy8qKgorICogQmVhbiB0byBiZSBpbmplY3RlZCBpbnRvIGFub3RoZXIgYmVhbiBieSBDREkuCisgKgorICogVGhlIHB1cnBvc2UgaXMgdG8gdGVzdCwgdGhhdCBDREkgYW5kIGhrMiBpbmplY3Rpb25zIGFyZSB3b3JraW5nIHRvZ2V0aGVyIHNvIHRoYXQgb25lIGNsYXNzIGJlIGluamVjdGVkIGJ5CisgKiBib3RoIENESSBhbmQgSmVyc2V5L2hrMi4KKyAqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSZXF1ZXN0U2NvcGVkCitwdWJsaWMgY2xhc3MgU2Vjb25kQmVhbiB7CisgICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZSA9ICJIZWxsbyI7CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vai0zNzYvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2JlYW5zLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2otMzc2L3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9iZWFucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2I0NmQ2OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2otMzc2L3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9iZWFucy54bWwKQEAgLTAsMCArMSwyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8YmVhbnMvPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vai0zNzYvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qMzc2L0ozNzZUZXN0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTM3Ni9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2ozNzYvSjM3NlRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTM5MDIxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vai0zNzYvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qMzc2L0ozNzZUZXN0LmphdmEKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uajM3NjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgb3JnLmp1bml0LkFmdGVyQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEozNzZUZXN0IHsKKyAgICBmaW5hbCBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKTsKKyAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gY2xpZW50LnRhcmdldChHcml6emx5QXBwLmdldEJhc2VVcmkoKSk7CisKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VXBUZXN0KCkgeworICAgICAgICBHcml6emx5QXBwLnN0YXJ0KCk7CisgICAgfQorCisgICAgQEFmdGVyQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGVhckRvd25UZXN0KCkgeworICAgICAgICBHcml6emx5QXBwLnN0b3AoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDb25zdHJ1Y3RvckluamVjdGlvbigpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3BvbnNlID0gdGFyZ2V0LnBhdGgoImNvbnN0cnVjdG9yIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eSgibmFtZT1Kb2huJmFnZT0zMiIsCisgICAgICAgICAgICAgICAgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0ZPUk1fVVJMRU5DT0RFRF9UWVBFKSwgU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIkpvaG46MzI6SGVsbG86Y29uc3RydWN0b3IiLCByZXNwb25zZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmllbGRJbmplY3Rpb24oKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXNwb25zZSA9IHRhcmdldC5wYXRoKCJmaWVsZCIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoIm5hbWU9QmlsbCZhZ2U9MjEiLAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9GT1JNX1VSTEVOQ09ERURfVFlQRSksIFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJCaWxsOjIxOkhlbGxvOmZpZWxkIiwgcmVzcG9uc2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZEluamVjdGlvbigpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3BvbnNlID0gdGFyZ2V0LnBhdGgoIm1ldGhvZCIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoIm5hbWU9TWlrZSZhZ2U9NDIiLAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9GT1JNX1VSTEVOQ09ERURfVFlQRSksIFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJNaWtlOjQyOkhlbGxvOm1ldGhvZCIsIHJlc3BvbnNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBTY29wZWRCZWFuSW5SZXFTY29wZWRSZXNvdXJjZSgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3BvbnNlID0gdGFyZ2V0LnBhdGgoImZpZWxkL2FwcFNjb3BlZCIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJBcHBsaWNhdGlvblNjb3BlZEJlYW46SGVsbG8iLCByZXNwb25zZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXBwU2NvcGVkUmVzb3VyY2UoKSB7CisgICAgICAgIFN0cmluZyByZXNwb25zZSA9IHRhcmdldC5wYXRoKCJhcHBTY29wZS9tc2ciKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiQXBwbGljYXRpb25TY29wZWRCZWFuOkhlbGxvIiwgcmVzcG9uc2UpOworICAgICAgICByZXNwb25zZSA9IHRhcmdldC5wYXRoKCJhcHBTY29wZS91cmkiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiYXBwU2NvcGUvdXJpIiwgcmVzcG9uc2UpOworICAgICAgICByZXNwb25zZSA9IHRhcmdldC5wYXRoKCJhcHBTY29wZS9yZXEiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiSGVsbG8iLCByZXNwb25zZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmVhblBhcmFtSW5BcHBTY29wZWQoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXNwb25zZSA9IHRhcmdldC5wYXRoKCJhcHBTY29wZSIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5lbnRpdHkoIm5hbWU9Sm9obiZhZ2U9MzUiLAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9GT1JNX1VSTEVOQ09ERURfVFlQRSksIFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJKb2huOjM1OkhlbGxvOmFwcFNjb3BlIiwgcmVzcG9uc2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbnRleHRJbmplY3Rpb25JbkFwcFNjb3BlZEJlYW4oKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXNwb25zZSA9IHRhcmdldC5wYXRoKCJmaWVsZC9hcHBTY29wZWRVcmkiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiZmllbGQvYXBwU2NvcGVkVXJpIiwgcmVzcG9uc2UpOworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vai00NDEvZWFyL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTQ0MS9lYXIvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmViNTlmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vai00NDEvZWFyL3BvbS54bWwKQEAgLTAsMCArMSw3NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICAgIDwvcGFyZW50PgorICAgIDxhcnRpZmFjdElkPmotNDQxLWVhcjwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmVhcjwvcGFja2FnaW5nPgorCisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLWotNDQxLWVhcjwvbmFtZT4KKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8cHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz5VVEYtODwvcHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz4KKyAgICA8L3Byb3BlcnRpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZWFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+NjwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPGRlZmF1bHRMaWJCdW5kbGVEaXI+QVBQLUlORi9saWI8L2RlZmF1bHRMaWJCdW5kbGVEaXI+CisgICAgICAgICAgICAgICAgICAgIDxtb2R1bGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHdlYk1vZHVsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qLTQ0MS13YXIxPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb250ZXh0Um9vdD4vb25lPC9jb250ZXh0Um9vdD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvd2ViTW9kdWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgPHdlYk1vZHVsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qLTQ0MS13YXIyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb250ZXh0Um9vdD4vdHdvPC9jb250ZXh0Um9vdD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvd2ViTW9kdWxlPgorICAgICAgICAgICAgICAgICAgICA8L21vZHVsZXM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmotNDQxLXdhcjE8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dHlwZT53YXI8L3R5cGU+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmotNDQxLXdhcjI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dHlwZT53YXI8L3R5cGU+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2otNDQxL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTQ0MS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MTA5YmYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTQ0MS9wb20ueG1sCkBAIC0wLDAgKzEsNDIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qLTQ0MTwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1qLTQ0MTwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgSi00NDEgUmVwcm9kdWNlcjogVHdvIFdBUnMgd2l0aCBlbmFibGVkIENESSBpbiBhbiBFQVIuCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxtb2R1bGVzPgorICAgICAgICA8bW9kdWxlPmVhcjwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPndhcjE8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT53YXIyPC9tb2R1bGU+CisgICAgPC9tb2R1bGVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vai00NDEvd2FyMS9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vai00NDEvd2FyMS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2N2VmNWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTQ0MS93YXIxL3BvbS54bWwKQEAgLTAsMCArMSw5NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi8uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qLTQ0MS13YXIxPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisKKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tai00NDEtd2FyMTwvbmFtZT4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7c2VydmxldDMudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguZW50ZXJwcmlzZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmNkaS1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItYnVuZGxlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHR5cGU+cG9tPC90eXBlPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4td2FyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGZhaWxPbk1pc3NpbmdXZWJYbWw+ZmFsc2U8L2ZhaWxPbk1pc3NpbmdXZWJYbWw+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHNraXBUZXN0cz4ke3NraXBUZXN0c308L3NraXBUZXN0cz4KKyAgICAgICAgICAgICAgICAgICAgPHN5c3RlbVByb3BlcnR5VmFyaWFibGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIuZmFjdG9yeT4ke3Rlc3RDb250YWluZXJGYWN0b3J5fTwvamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5mYWN0b3J5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydD4ke3Rlc3RDb250YWluZXJQb3J0fTwvamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0PgorICAgICAgICAgICAgICAgICAgICA8L3N5c3RlbVByb3BlcnR5VmFyaWFibGVzPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4taW5zdGFsbC1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxza2lwPmZhbHNlPC9za2lwPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8c2tpcFRlc3RzPnRydWU8L3NraXBUZXN0cz4KKyAgICAgICAgPHRlc3RDb250YWluZXJGYWN0b3J5Pm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTwvdGVzdENvbnRhaW5lckZhY3Rvcnk+CisgICAgICAgIDx0ZXN0Q29udGFpbmVyUG9ydD44MDgwPC90ZXN0Q29udGFpbmVyUG9ydD4KKyAgICA8L3Byb3BlcnRpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qLTQ0MS93YXIxL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajQ0MS9vbmUvQ2RpUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2otNDQxL3dhcjEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qNDQxL29uZS9DZGlSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzY2U4ZGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTQ0MS93YXIxL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajQ0MS9vbmUvQ2RpUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmo0NDEub25lOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LlJlcXVlc3RTY29wZWQ7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworCisvKioKKyAqIENESSBiYWNrZWQgSkFYLVJTIHJlc291cmNlLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCIvdGVzdCIpCitAUmVxdWVzdFNjb3BlZAorcHVibGljIGNsYXNzIENkaVJlc291cmNlIHsKKworICAgIEBDb250ZXh0CisgICAgcHJpdmF0ZSBTZXJ2bGV0Q29udGV4dCBzY0ZpZWxkOworCisgICAgcHJpdmF0ZSBTZXJ2bGV0Q29udGV4dCBzY0N0b3JQYXJhbTsKKworICAgIC8qIHRvIG1ha2UgQ0RJIGhhcHB5ICovCisgICAgcHVibGljIENkaVJlc291cmNlKCkgeworICAgIH0KKworICAgIEBJbmplY3QKKyAgICBwdWJsaWMgQ2RpUmVzb3VyY2UoQENvbnRleHQgZmluYWwgU2VydmxldENvbnRleHQgc2MpIHsKKyAgICAgICAgdGhpcy5zY0N0b3JQYXJhbSA9IHNjOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiY3Rvci1wYXJhbSIpCisgICAgcHVibGljIFN0cmluZyBnZXRDdG9yUGFyYW0oKSB7CisgICAgICAgIHJldHVybiBzY0N0b3JQYXJhbS5nZXRDb250ZXh0UGF0aCgpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgibWV0aG9kLXBhcmFtIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1ldGhvZFBhcmFtKEBDb250ZXh0IGZpbmFsIFNlcnZsZXRDb250ZXh0IHNjKSB7CisgICAgICAgIHJldHVybiBzYy5nZXRDb250ZXh0UGF0aCgpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiZmllbGQiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmllbGQoKSB7CisgICAgICAgIHJldHVybiBzY0ZpZWxkLmdldENvbnRleHRQYXRoKCk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJleGNlcHRpb24iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhjZXB0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oKSB7fTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qLTQ0MS93YXIxL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajQ0MS9vbmUvQ3VzdG9tRXhjZXB0aW9uTWFwcGVyLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTQ0MS93YXIxL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajQ0MS9vbmUvQ3VzdG9tRXhjZXB0aW9uTWFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVhYTcxYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2otNDQxL3dhcjEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qNDQxL29uZS9DdXN0b21FeGNlcHRpb25NYXBwZXIuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmo0NDEub25lOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LkV4Y2VwdGlvbk1hcHBlcjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CisKKy8qKgorICogSkFYLVJTIHByb3ZpZGVyIGFkZGVkIGp1c3QgdG8gbWFrZSBzdXJlIHRoZSBhcHBsaWNhdGlvbgorICogZGVwbG95cyBmaW5lLiBTaW5jZSBKQVgtUlMgcHJvdmlkZXJzIGdldCBpbml0aWFsaXplZAorICogYXQgSmVyc2V5IGJvb3RzdHJhcHBpbmcgcGhhc2UsIHdlIHdvdWxkIGdldCBhIGRlcGxveQorICogZXJyb3IgaWYgc29tZXRoaW5nIHdlbnQgd3JvbmcuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEN1c3RvbUV4Y2VwdGlvbk1hcHBlciBpbXBsZW1lbnRzIEV4Y2VwdGlvbk1hcHBlcjxFeGNlcHRpb24+IHsKKworICAgIEBDb250ZXh0CisgICAgcHJpdmF0ZSBTZXJ2bGV0Q29udGV4dCBzYzsKKworICAgIHB1YmxpYyBSZXNwb25zZSB0b1Jlc3BvbnNlKGZpbmFsIEV4Y2VwdGlvbiBleCkgeworICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDIwMCkuZW50aXR5KHNjLmdldENvbnRleHRQYXRoKCkpLmJ1aWxkKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vai00NDEvd2FyMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2o0NDEvb25lL015QXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2otNDQxL3dhcjEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qNDQxL29uZS9NeUFwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDczYjg0YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2otNDQxL3dhcjEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qNDQxL29uZS9NeUFwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qNDQxLm9uZTsKKworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworLyoqCisgKiBUZXN0IGNhc2UgdG8gZW5zdXJlIHByb3BlciBXQVIgaXNvbGF0aW9uIG9uIEplcnNleSBsZXZlbC4KKyAqIERlZmluZSBKQVgtUlMgYXBwbGljYXRpb24gY29udGFpbmluZyBhIHNpbXBsZSBDREkgYmFja2VkIEpBWC1SUyByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAQXBwbGljYXRpb25QYXRoKCIvIikKK3B1YmxpYyBjbGFzcyBNeUFwcGxpY2F0aW9uIGV4dGVuZHMgUmVzb3VyY2VDb25maWcgeworCisgICAgcHVibGljIE15QXBwbGljYXRpb24oKSB7CisgICAgICAgIHN1cGVyKENkaVJlc291cmNlLmNsYXNzLCBDdXN0b21FeGNlcHRpb25NYXBwZXIuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2otNDQxL3dhcjEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvYmVhbnMueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vai00NDEvd2FyMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9iZWFucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNjZmVkNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2otNDQxL3dhcjEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvYmVhbnMueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPGJlYW5zIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCisgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvYmVhbnNfMV8wLnhzZCI+Cis8L2JlYW5zPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vai00NDEvd2FyMS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2o0NDEvb25lL0NvbnRleHRQYXRoVGVzdC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vai00NDEvd2FyMS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2o0NDEvb25lL0NvbnRleHRQYXRoVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NTg1OWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTQ0MS93YXIxL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajQ0MS9vbmUvQ29udGV4dFBhdGhUZXN0LmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qNDQxLm9uZTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBUaGlzIGlzIHRvIG1ha2Ugc3VyZSB0d28gSmVyc2V5IHdhcnMgYXJlIHNlcGFyYXRlZCB3ZWxsIGluIGEgc2luZ2xlIGVhci4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIENvbnRleHRQYXRoVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBcHBsaWNhdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmllbGRJbmplY3Rpb24oKSB7CisgICAgICAgIGFzc2VydFRoYXQodGFyZ2V0KCJvbmUvdGVzdC9maWVsZCIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSwgaXMoIi9vbmUiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JJbmplY3Rpb24oKSB7CisgICAgICAgIGFzc2VydFRoYXQodGFyZ2V0KCJvbmUvdGVzdC9jdG9yLXBhcmFtIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpLCBpcygiL29uZSIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2RJbmplY3Rpb24oKSB7CisgICAgICAgIGFzc2VydFRoYXQodGFyZ2V0KCJvbmUvdGVzdC9tZXRob2QtcGFyYW0iKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyksIGlzKCIvb25lIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvbk1hcHBlckluamVjdGlvbigpIHsKKyAgICAgICAgYXNzZXJ0VGhhdCh0YXJnZXQoIm9uZS90ZXN0L2V4Y2VwdGlvbiIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSwgaXMoIi9vbmUiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vai00NDEvd2FyMi9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vai00NDEvd2FyMi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMzg1YWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTQ0MS93YXIyL3BvbS54bWwKQEAgLTAsMCArMSw5NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi8uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qLTQ0MS13YXIyPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisKKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tai00NDEtd2FyMjwvbmFtZT4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7c2VydmxldDMudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguZW50ZXJwcmlzZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmNkaS1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItYnVuZGxlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHR5cGU+cG9tPC90eXBlPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4td2FyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGZhaWxPbk1pc3NpbmdXZWJYbWw+ZmFsc2U8L2ZhaWxPbk1pc3NpbmdXZWJYbWw+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHNraXBUZXN0cz4ke3NraXBUZXN0c308L3NraXBUZXN0cz4KKyAgICAgICAgICAgICAgICAgICAgPHN5c3RlbVByb3BlcnR5VmFyaWFibGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIuZmFjdG9yeT4ke3Rlc3RDb250YWluZXJGYWN0b3J5fTwvamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5mYWN0b3J5PgorICAgICAgICAgICAgICAgICAgICAgICAgPGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydD4ke3Rlc3RDb250YWluZXJQb3J0fTwvamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0PgorICAgICAgICAgICAgICAgICAgICA8L3N5c3RlbVByb3BlcnR5VmFyaWFibGVzPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4taW5zdGFsbC1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxza2lwPmZhbHNlPC9za2lwPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8c2tpcFRlc3RzPnRydWU8L3NraXBUZXN0cz4KKyAgICAgICAgPHRlc3RDb250YWluZXJGYWN0b3J5Pm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTwvdGVzdENvbnRhaW5lckZhY3Rvcnk+CisgICAgICAgIDx0ZXN0Q29udGFpbmVyUG9ydD44MDgwPC90ZXN0Q29udGFpbmVyUG9ydD4KKyAgICA8L3Byb3BlcnRpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qLTQ0MS93YXIyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajQ0MS90d28vQ2RpUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2otNDQxL3dhcjIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qNDQxL3R3by9DZGlSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MjkyNzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTQ0MS93YXIyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajQ0MS90d28vQ2RpUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmo0NDEudHdvOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworCitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LlJlcXVlc3RTY29wZWQ7CitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworCisvKioKKyAqIENESSBiYWNrZWQgSkFYLVJTIHJlc291cmNlLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCIvdGVzdCIpCitAUmVxdWVzdFNjb3BlZAorcHVibGljIGNsYXNzIENkaVJlc291cmNlIHsKKworICAgIEBDb250ZXh0CisgICAgcHJpdmF0ZSBTZXJ2bGV0Q29udGV4dCBzY0ZpZWxkOworCisgICAgcHJpdmF0ZSBTZXJ2bGV0Q29udGV4dCBzY0N0b3JQYXJhbTsKKworICAgIC8qIHRvIG1ha2UgQ0RJIGhhcHB5ICovCisgICAgcHVibGljIENkaVJlc291cmNlKCkgeworICAgIH0KKworICAgIEBJbmplY3QKKyAgICBwdWJsaWMgQ2RpUmVzb3VyY2UoQENvbnRleHQgZmluYWwgU2VydmxldENvbnRleHQgc2MpIHsKKyAgICAgICAgdGhpcy5zY0N0b3JQYXJhbSA9IHNjOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiY3Rvci1wYXJhbSIpCisgICAgcHVibGljIFN0cmluZyBnZXRDdG9yUGFyYW0oKSB7CisgICAgICAgIHJldHVybiBzY0N0b3JQYXJhbS5nZXRDb250ZXh0UGF0aCgpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgibWV0aG9kLXBhcmFtIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1ldGhvZFBhcmFtKEBDb250ZXh0IGZpbmFsIFNlcnZsZXRDb250ZXh0IHNjKSB7CisgICAgICAgIHJldHVybiBzYy5nZXRDb250ZXh0UGF0aCgpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiZmllbGQiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmllbGQoKSB7CisgICAgICAgIHJldHVybiBzY0ZpZWxkLmdldENvbnRleHRQYXRoKCk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJleGNlcHRpb24iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RXhjZXB0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oKSB7fTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qLTQ0MS93YXIyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajQ0MS90d28vQ3VzdG9tRXhjZXB0aW9uTWFwcGVyLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTQ0MS93YXIyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajQ0MS90d28vQ3VzdG9tRXhjZXB0aW9uTWFwcGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU0NDEwMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2otNDQxL3dhcjIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qNDQxL3R3by9DdXN0b21FeGNlcHRpb25NYXBwZXIuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmo0NDEudHdvOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LkV4Y2VwdGlvbk1hcHBlcjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CisKKy8qKgorICogSkFYLVJTIHByb3ZpZGVyIGFkZGVkIGp1c3QgdG8gbWFrZSBzdXJlIHRoZSBhcHBsaWNhdGlvbgorICogZGVwbG95cyBmaW5lLiBTaW5jZSBKQVgtUlMgcHJvdmlkZXJzIGdldCBpbml0aWFsaXplZAorICogYXQgSmVyc2V5IGJvb3RzdHJhcHBpbmcgcGhhc2UsIHdlIHdvdWxkIGdldCBhIGRlcGxveQorICogZXJyb3IgaWYgc29tZXRoaW5nIHdlbnQgd3JvbmcuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEN1c3RvbUV4Y2VwdGlvbk1hcHBlciBpbXBsZW1lbnRzIEV4Y2VwdGlvbk1hcHBlcjxFeGNlcHRpb24+IHsKKworICAgIEBDb250ZXh0CisgICAgcHJpdmF0ZSBTZXJ2bGV0Q29udGV4dCBzYzsKKworICAgIHB1YmxpYyBSZXNwb25zZSB0b1Jlc3BvbnNlKGZpbmFsIEV4Y2VwdGlvbiBleCkgeworICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDIwMCkuZW50aXR5KHNjLmdldENvbnRleHRQYXRoKCkpLmJ1aWxkKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vai00NDEvd2FyMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2o0NDEvdHdvL015QXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2otNDQxL3dhcjIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qNDQxL3R3by9NeUFwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY2ZDNlMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2otNDQxL3dhcjIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qNDQxL3R3by9NeUFwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qNDQxLnR3bzsKKworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworLyoqCisgKiBUZXN0IGNhc2UgdG8gZW5zdXJlIHByb3BlciBXQVIgaXNvbGF0aW9uIG9uIEplcnNleSBsZXZlbC4KKyAqIERlZmluZSBKQVgtUlMgYXBwbGljYXRpb24gY29udGFpbmluZyBhIHNpbXBsZSBDREkgYmFja2VkIEpBWC1SUyByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAQXBwbGljYXRpb25QYXRoKCIvIikKK3B1YmxpYyBjbGFzcyBNeUFwcGxpY2F0aW9uIGV4dGVuZHMgUmVzb3VyY2VDb25maWcgeworCisgICAgcHVibGljIE15QXBwbGljYXRpb24oKSB7CisgICAgICAgIHN1cGVyKENkaVJlc291cmNlLmNsYXNzLCBDdXN0b21FeGNlcHRpb25NYXBwZXIuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2otNDQxL3dhcjIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvYmVhbnMueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vai00NDEvd2FyMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9iZWFucy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNjZmVkNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2otNDQxL3dhcjIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvYmVhbnMueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPGJlYW5zIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCisgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvYmVhbnNfMV8wLnhzZCI+Cis8L2JlYW5zPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vai00NDEvd2FyMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2o0NDEvdHdvL0NvbnRleHRQYXRoVGVzdC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vai00NDEvd2FyMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2o0NDEvdHdvL0NvbnRleHRQYXRoVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNGY2OGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTQ0MS93YXIyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajQ0MS90d28vQ29udGV4dFBhdGhUZXN0LmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qNDQxLnR3bzsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBUaGlzIGlzIHRvIG1ha2Ugc3VyZSB0d28gSmVyc2V5IHdhcnMgYXJlIHNlcGFyYXRlZCB3ZWxsIGluIGEgc2luZ2xlIGVhci4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIENvbnRleHRQYXRoVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBcHBsaWNhdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RmllbGRJbmplY3Rpb24oKSB7CisgICAgICAgIGFzc2VydFRoYXQodGFyZ2V0KCJ0d28vdGVzdC9maWVsZCIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSwgaXMoIi90d28iKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29uc3RydWN0b3JJbmplY3Rpb24oKSB7CisgICAgICAgIGFzc2VydFRoYXQodGFyZ2V0KCJ0d28vdGVzdC9jdG9yLXBhcmFtIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpLCBpcygiL3R3byIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RNZXRob2RJbmplY3Rpb24oKSB7CisgICAgICAgIGFzc2VydFRoYXQodGFyZ2V0KCJ0d28vdGVzdC9tZXRob2QtcGFyYW0iKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyksIGlzKCIvdHdvIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEV4Y2VwdGlvbk1hcHBlckluamVjdGlvbigpIHsKKyAgICAgICAgYXNzZXJ0VGhhdCh0YXJnZXQoInR3by90ZXN0L2V4Y2VwdGlvbiIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSwgaXMoIi90d28iKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vai01OS9lYXIvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2otNTkvZWFyL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRjZTMxYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2otNTkvZWFyL3BvbS54bWwKQEAgLTAsMCArMSw3NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICAgICAgPHJlbGF0aXZlUGF0aD4uLi8uLi9wb20ueG1sPC9yZWxhdGl2ZVBhdGg+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qLTU5LWVhcjwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmVhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1qLTU5LWVhcjwvbmFtZT4KKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8cHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz5VVEYtODwvcHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz4KKyAgICA8L3Byb3BlcnRpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZWFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+NjwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPGRlZmF1bHRMaWJCdW5kbGVEaXI+QVBQLUlORi9saWI8L2RlZmF1bHRMaWJCdW5kbGVEaXI+CisgICAgICAgICAgICAgICAgICAgIDxtb2R1bGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHdlYk1vZHVsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qLTU5LWNkaS13YXI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3dlYk1vZHVsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxlamJNb2R1bGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ai01OS1lamItbGliPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9lamJNb2R1bGU+CisgICAgICAgICAgICAgICAgICAgIDwvbW9kdWxlcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+ai01OS1jZGktd2FyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHR5cGU+d2FyPC90eXBlPgorICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qLTU5LWVqYi1saWI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dHlwZT5lamI8L3R5cGU+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2otNTkvbGliL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTU5L2xpYi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MGU1MjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTU5L2xpYi9wb20ueG1sCkBAIC0wLDAgKzEsNjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgICAgIDxyZWxhdGl2ZVBhdGg+Li4vLi4vcG9tLnhtbDwvcmVsYXRpdmVQYXRoPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+ai01OS1lamItbGliPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLWotNTktZWpiLWxpYjwvbmFtZT4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgud3MucnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC53cy5ycy1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguZWpiPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguZWpiLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5hbm5vdGF0aW9uPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguYW5ub3RhdGlvbi1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4taW5zdGFsbC1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxza2lwPmZhbHNlPC9za2lwPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2otNTkvbGliL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajU5L2VqYi9saWIvTG9jYWxCZWFuV2l0aFJlbW90ZUludGVyZmFjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vai01OS9saWIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qNTkvZWpiL2xpYi9Mb2NhbEJlYW5XaXRoUmVtb3RlSW50ZXJmYWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg2OTc2YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2otNTkvbGliL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajU5L2VqYi9saWIvTG9jYWxCZWFuV2l0aFJlbW90ZUludGVyZmFjZS5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uajU5LmVqYi5saWI7CisKK2ltcG9ydCBqYXZheC5lamIuTG9jYWxCZWFuOworaW1wb3J0IGphdmF4LmVqYi5SZW1vdGU7CitpbXBvcnQgamF2YXguZWpiLlN0YXRlbGVzczsKKworLyoqCisgKiBMb2NhbCBzdGF0ZWxlc3Mgc2Vzc2lvbiBiZWFuIGltcGxlbWVudGluZyBhIHJlbW90ZSBpbnRlcmZhY2UuCisgKiBQYXJ0IG9mIENESSBleHRlbnNpb24gbG9va3VwIGlzc3VlIHJlcHJvZHVjZXIuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFN0YXRlbGVzcworQExvY2FsQmVhbgorQFJlbW90ZShNeVJlbW90ZUludGVyZmFjZS5jbGFzcykKK3B1YmxpYyBjbGFzcyBMb2NhbEJlYW5XaXRoUmVtb3RlSW50ZXJmYWNlIHsKKworICAgIC8qKgorICAgICAqIFNpbXBsZSBnZXR0ZXIgdG8gYmUgaW52b2tlZCBmcm9tIGEgQ0RJIGJhY2tlZCBKQVgtUlMgcmVzb3VyY2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEpvc2ggc3RyaW5nIGxpdGVyYWwuCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gIkpvc2giOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2otNTkvbGliL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajU5L2VqYi9saWIvTXlSZW1vdGVJbnRlcmZhY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2otNTkvbGliL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajU5L2VqYi9saWIvTXlSZW1vdGVJbnRlcmZhY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjUzNDg0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vai01OS9saWIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qNTkvZWpiL2xpYi9NeVJlbW90ZUludGVyZmFjZS5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uajU5LmVqYi5saWI7CisKKy8qKgorICogTWFya2VyIGludGVyZmFjZSBmb3IgcmVtb3RlIGJlYW5zLiBQYXJ0IG9mIENESSBleHRlbnNpb24gbG9va3VwIGlzc3VlIHJlcHJvZHVjZXIuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGludGVyZmFjZSBNeVJlbW90ZUludGVyZmFjZSB7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qLTU5L3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTU5L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUxMjQwMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2otNTkvcG9tLnhtbApAQCAtMCwwICsxLDQyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+ai01OTwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1qLTU5PC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBKLTU5IFJlcHJvZHVjZXI6IENESSBleHRlbnNpb24gbG9va3VwIGluIG11bHRpLW1vZHVsZSBhcHAgdG8gSmVyc2V5IDIuCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxtb2R1bGVzPgorICAgICAgICA8bW9kdWxlPmVhcjwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmxpYjwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPndhcjwvbW9kdWxlPgorICAgIDwvbW9kdWxlcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2otNTkvd2FyL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTU5L3dhci9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ODM1NDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qLTU5L3dhci9wb20ueG1sCkBAIC0wLDAgKzEsMTA1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgICA8cmVsYXRpdmVQYXRoPi4uLy4uL3BvbS54bWw8L3JlbGF0aXZlUGF0aD4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmotNTktY2RpLXdhcjwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1qLTU5LWNkaS13YXI8L25hbWU+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LndzLnJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXgud3MucnMtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVudGVycHJpc2U8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jZGktYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPiR7cHJvamVjdC5ncm91cElkfTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmotNTktZWpiLWxpYjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItYnVuZGxlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHR5cGU+cG9tPC90eXBlPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICAgICAgPGV4Y2x1c2lvbnM+CisgICAgICAgICAgICAgICAgPGV4Y2x1c2lvbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmhhbWNyZXN0PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5oYW1jcmVzdC1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDwvZXhjbHVzaW9uPgorICAgICAgICAgICAgPC9leGNsdXNpb25zPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmhhbWNyZXN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGFtY3Jlc3QtbGlicmFyeTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXdhci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxmYWlsT25NaXNzaW5nV2ViWG1sPmZhbHNlPC9mYWlsT25NaXNzaW5nV2ViWG1sPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxza2lwVGVzdHM+JHtza2lwVGVzdHN9PC9za2lwVGVzdHM+CisgICAgICAgICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk+JHt0ZXN0Q29udGFpbmVyRmFjdG9yeX08L2plcnNleS5jb25maWcudGVzdC5jb250YWluZXIuZmFjdG9yeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+JHt0ZXN0Q29udGFpbmVyUG9ydH08L2plcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydD4KKyAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWluc3RhbGwtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c2tpcD5mYWxzZTwvc2tpcD4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPGZhaWxPbk1pc3NpbmdXZWJYbWw+ZmFsc2U8L2ZhaWxPbk1pc3NpbmdXZWJYbWw+CisgICAgICAgIDxza2lwVGVzdHM+dHJ1ZTwvc2tpcFRlc3RzPgorICAgICAgICA8dGVzdENvbnRhaW5lckZhY3Rvcnk+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5PC90ZXN0Q29udGFpbmVyRmFjdG9yeT4KKyAgICAgICAgPHRlc3RDb250YWluZXJQb3J0PjgwODA8L3Rlc3RDb250YWluZXJQb3J0PgorICAgIDwvcHJvcGVydGllcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2otNTkvd2FyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajU5L2NkaS93ZWIvQ2RpQmFja2VkUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2otNTkvd2FyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajU5L2NkaS93ZWIvQ2RpQmFja2VkUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzQ4M2RkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vai01OS93YXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qNTkvY2RpL3dlYi9DZGlCYWNrZWRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uajU5LmNkaS53ZWI7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuUmVxdWVzdFNjb3BlZDsKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgamF2YXguandzLldlYlJlc3VsdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uajU5LmVqYi5saWIuTG9jYWxCZWFuV2l0aFJlbW90ZUludGVyZmFjZTsKKworLyoqCisgKiBQYXJ0IG9mIENESSBleHRlbnNpb24gbG9va3VwIGlzc3VlIHJlcHJvZHVjZXIuCisgKiBUaGlzIGJlYW4gd2lsbCBDREktaW5qZWN0IGEgbG9jYWwgRUpCIGJlYW4uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIm5hbWUiKQorQFJlcXVlc3RTY29wZWQKK3B1YmxpYyBjbGFzcyBDZGlCYWNrZWRSZXNvdXJjZSBpbXBsZW1lbnRzIFJlc291cmNlTWFya2VySW50ZXJmYWNlIHsKKworICAgIEBJbmplY3QKKyAgICBwcml2YXRlIExvY2FsQmVhbldpdGhSZW1vdGVJbnRlcmZhY2UgbG9jYWxCZWFuOworCisgICAgQEdFVAorICAgIEBQYXRoKCJoZWxsbyIpCisgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgIEBXZWJSZXN1bHQobmFtZSA9ICJoZWxsbyIpCisgICAgcHVibGljIFN0cmluZyBzYXlIZWxsbygpIHsKKyAgICAgICAgcmV0dXJuICJIZWxsbyAiICsgbG9jYWxCZWFuLmdldE5hbWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qLTU5L3dhci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2o1OS9jZGkvd2ViL0pheFJzQ29uZmlndXJhdGlvbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vai01OS93YXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qNTkvY2RpL3dlYi9KYXhSc0NvbmZpZ3VyYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzYxMjVhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vai01OS93YXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qNTkvY2RpL3dlYi9KYXhSc0NvbmZpZ3VyYXRpb24uamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmo1OS5jZGkud2ViOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworLyoqCisgKiBDREkgZXh0ZW5zaW9uIGxvb2t1cCBpc3N1ZSByZXByb2R1Y2VyIGFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uUGF0aCgicmVzb3VyY2VzIikKK3B1YmxpYyBjbGFzcyBKYXhSc0NvbmZpZ3VyYXRpb24gZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICByZXR1cm4gbmV3IEhhc2hTZXQ8Q2xhc3M8Pz4+KCkge3sKKyAgICAgICAgICAgIGFkZChDZGlCYWNrZWRSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIH19OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2otNTkvd2FyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajU5L2NkaS93ZWIvUmVzb3VyY2VNYXJrZXJJbnRlcmZhY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2otNTkvd2FyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vajU5L2NkaS93ZWIvUmVzb3VyY2VNYXJrZXJJbnRlcmZhY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTU0OGM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vai01OS93YXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qNTkvY2RpL3dlYi9SZXNvdXJjZU1hcmtlckludGVyZmFjZS5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uajU5LmNkaS53ZWI7CisKKy8qKgorICogTWFya2VyIGludGVyZmFjZSBmb3IgQ0RJIGJhY2tlZCBKQVgtUlMgYmVhbi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgaW50ZXJmYWNlIFJlc291cmNlTWFya2VySW50ZXJmYWNlIHsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2otNTkvd2FyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2JlYW5zLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2otNTkvd2FyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2JlYW5zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDVjMmMxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vai01OS93YXIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvYmVhbnMueG1sCkBAIC0wLDAgKzEsMjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPGJlYW5zIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCisgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvYmVhbnNfMV8wLnhzZCI+Cis8L2JlYW5zPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vai01OS93YXIvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcCBiL3Rlc3RzL2ludGVncmF0aW9uL2otNTkvd2FyL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU5YTJhNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2otNTkvd2FyL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKQEAgLTAsMCArMSwyOSBAQAorPCVAcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sIiBwYWdlRW5jb2Rpbmc9IlVURi04IiU+Cis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgorICAgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKzxodG1sPgorICAgIDxoZWFkPgorICAgICAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+CisgICAgICAgIDx0aXRsZT5DREkgRXh0ZW5zaW9uIExvb2t1cCBJc3N1ZSBSZXByb2R1Y2VyPC90aXRsZT4KKyAgICA8L2hlYWQ+CisgICAgPGJvZHk+CisgICAgICAgIFZpc2l0IDxhIGhyZWY9InJlc291cmNlcy9uYW1lL2hlbGxvIj5yZXNvdXJjZXMvbmFtZS9oZWxsbzwvYT4KKyAgICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qLTU5L3dhci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2o1OS9jZGkvd2ViL05hbWVCZWFuVGVzdC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vai01OS93YXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qNTkvY2RpL3dlYi9OYW1lQmVhblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjg3MGE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vai01OS93YXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qNTkvY2RpL3dlYi9OYW1lQmVhblRlc3QuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmo1OS5jZGkud2ViOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBUZXN0IGZvciBDREkgZXh0ZW5zaW9uIGxvb2t1cCBpc3N1ZS4gU2hvdWxkIHRoZSBleHRlbnNpb24gbG9va3VwIGhhdmUgZmFpbGVkLAorICogd2Ugd291bGQgbm90IGdldCB0aGUgY29ycmVjdCByZXNwb25zZSBoZXJlLgorICogPHAvPgorICogUnVuIHdpdGg6CisgKiA8cHJlPgorICogbXZuIGNsZWFuIHBhY2thZ2UKKyAqICRBU19IT01FL2Jpbi9hc2FkbWluIGRlcGxveSAuLi9lamItamF4LXJzLWVhcjEvdGFyZ2V0L2VqYi1qYXgtcnMtZWFyMQorICogbXZuIC1Ec2tpcFRlc3RzPWZhbHNlIHRlc3Q8L3ByZT4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgTmFtZUJlYW5UZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IEpheFJzQ29uZmlndXJhdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBVUkkgZ2V0QmFzZVVyaSgpIHsKKyAgICAgICAgcmV0dXJuIFVyaUJ1aWxkZXIuZnJvbVVyaShzdXBlci5nZXRCYXNlVXJpKCkpLnBhdGgoImotNTktY2RpLXdhciIpLnBhdGgoInJlc291cmNlcyIpLmJ1aWxkKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2RpUmVzb3VyY2UoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHIgPSB0YXJnZXQoKS5wYXRoKCJuYW1lIikucGF0aCgiaGVsbG8iKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBjb250ZW50ID0gci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRoYXQoci5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQoY29udGVudCwgZXF1YWxUbygiSGVsbG8gSm9zaCIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qYXhycy1jb21wb25lbnQtaW5qZWN0L3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qYXhycy1jb21wb25lbnQtaW5qZWN0L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEzOTJhYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2pheHJzLWNvbXBvbmVudC1pbmplY3QvcG9tLnhtbApAQCAtMCwwICsxLDYyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmpheHJzLWNvbXBvbmVudC1pbmplY3Q8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtY29tcG9uZW50LWluamVjdDwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5KZXJzZXkgSmF4cnMgQ29tcG9uZW50IEluamVjdDwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qYXhycy1jb21wb25lbnQtaW5qZWN0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvamF4cnMvaW5qZWN0L1ByaW50aW5nRXJyb3JIYW5kbGVyLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qYXhycy1jb21wb25lbnQtaW5qZWN0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvamF4cnMvaW5qZWN0L1ByaW50aW5nRXJyb3JIYW5kbGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg3NjlmMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2pheHJzLWNvbXBvbmVudC1pbmplY3Qvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9qYXhycy9pbmplY3QvUHJpbnRpbmdFcnJvckhhbmRsZXIuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmpheHJzLmluamVjdDsKKworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CitpbXBvcnQgamF2YS5pby5Xcml0ZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2UuU3RhdHVzOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5FeGNlcHRpb25NYXBwZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCisvKioKKyAqIEV4Y2VwdGlvbiBtYXBwZXIgcHJpbnRpbmcgdGhlIHtAbGluayBTdGF0dXMjTk9UX0FDQ0VQVEFCTEV9IGVycm9yLgorICovCitAUHJvdmlkZXIKK3B1YmxpYyBjbGFzcyBQcmludGluZ0Vycm9ySGFuZGxlciBpbXBsZW1lbnRzIEV4Y2VwdGlvbk1hcHBlcjxUaHJvd2FibGU+IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBSZXNwb25zZSB0b1Jlc3BvbnNlKFRocm93YWJsZSB0aHJvd2FibGUpIHsKKyAgICAgICAgdGhyb3dhYmxlLnByaW50U3RhY2tUcmFjZSgpOworCisgICAgICAgIFdyaXRlciByZXN1bHQgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIFByaW50V3JpdGVyIHByaW50V3JpdGVyID0gbmV3IFByaW50V3JpdGVyKHJlc3VsdCk7CisgICAgICAgIHRocm93YWJsZS5wcmludFN0YWNrVHJhY2UocHJpbnRXcml0ZXIpOworICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKFN0YXR1cy5OT1RfQUNDRVBUQUJMRSkuZW50aXR5KHJlc3VsdC50b1N0cmluZygpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2pheHJzLWNvbXBvbmVudC1pbmplY3Qvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9qYXhycy9pbmplY3QvUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2pheHJzLWNvbXBvbmVudC1pbmplY3Qvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9qYXhycy9pbmplY3QvUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzJhOTY1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamF4cnMtY29tcG9uZW50LWluamVjdC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2pheHJzL2luamVjdC9SZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmpheHJzLmluamVjdDsKKworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5SZXNvdXJjZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXF1ZXN0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuU2VjdXJpdHlDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXJzOworCisvKioKKyAqIFJlc291cmNlIHdpdGgge0BsaW5rIENvbnRleHR9IGluamVjdGlvbiBwb2ludHMuCisgKi8KK0BQYXRoKCJyZXNvdXJjZSIpCitwdWJsaWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgQENvbnRleHQKKyAgICBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbjsKKyAgICBAQ29udGV4dAorICAgIFVyaUluZm8gaW5mbzsKKyAgICBAQ29udGV4dAorICAgIFJlcXVlc3QgcmVxdWVzdDsKKyAgICBAQ29udGV4dAorICAgIEh0dHBIZWFkZXJzIGhlYWRlcnM7CisgICAgQENvbnRleHQKKyAgICBTZWN1cml0eUNvbnRleHQgc2VjdXJpdHk7CisgICAgQENvbnRleHQKKyAgICBQcm92aWRlcnMgcHJvdmlkZXJzOworICAgIEBDb250ZXh0CisgICAgUmVzb3VyY2VDb250ZXh0IHJlc291cmNlczsKKyAgICBAQ29udGV4dAorICAgIENvbmZpZ3VyYXRpb24gY29uZmlncmF0aW9uOworCisgICAgQFBPU1QKKyAgICBAUGF0aCgiZWNobyIpCisgICAgcHVibGljIFN0cmluZyByZXR1cm5HaXZlblN0cmluZyhTdHJpbmcgc3RyaW5nKSB7CisgICAgICAgIHJldHVybiBzdHJpbmc7CisgICAgfQorCisgICAgQFBPU1QKKyAgICBAUGF0aCgicmVhZGVyIikKKyAgICBwdWJsaWMgU3RyaW5nIHJlYWRlcihTdHJpbmdCZWFuIGJlYW4pIHsKKyAgICAgICAgcmV0dXJuIGJlYW4uZ2V0KCk7CisgICAgfQorCisgICAgQFBPU1QKKyAgICBAUGF0aCgid3JpdGVyIikKKyAgICBwdWJsaWMgU3RyaW5nQmVhbiB3cml0ZXIoU3RyaW5nIGVudGl0eSkgeworICAgICAgICByZXR1cm4gbmV3IFN0cmluZ0JlYW4oZW50aXR5KTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImluc3RhbmNlIikKKyAgICBwdWJsaWMgU3RyaW5nIGluc3RhbmNlKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nQmVhbkVudGl0eVByb3ZpZGVyV2l0aEluamVjdGFibGVzLmNvbXB1dGVNYXNrKGFwcGxpY2F0aW9uLAorICAgICAgICAgICAgICAgIGluZm8sIHJlcXVlc3QsIGhlYWRlcnMsIHNlY3VyaXR5LCBwcm92aWRlcnMsIHJlc291cmNlcywKKyAgICAgICAgICAgICAgICBjb25maWdyYXRpb24pOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgibWV0aG9kIikKKyAgICBwdWJsaWMgU3RyaW5nIG1ldGhvZChAQ29udGV4dCBBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiwKKyAgICAgICAgICAgIEBDb250ZXh0IFVyaUluZm8gaW5mbywgQENvbnRleHQgUmVxdWVzdCByZXF1ZXN0LAorICAgICAgICAgICAgQENvbnRleHQgSHR0cEhlYWRlcnMgaGVhZGVycywgQENvbnRleHQgU2VjdXJpdHlDb250ZXh0IHNlY3VyaXR5LAorICAgICAgICAgICAgQENvbnRleHQgUHJvdmlkZXJzIHByb3ZpZGVycywgQENvbnRleHQgUmVzb3VyY2VDb250ZXh0IHJlc291cmNlcykgeworICAgICAgICByZXR1cm4gU3RyaW5nQmVhbkVudGl0eVByb3ZpZGVyV2l0aEluamVjdGFibGVzLmNvbXB1dGVNYXNrKGFwcGxpY2F0aW9uLAorICAgICAgICAgICAgICAgIGluZm8sIHJlcXVlc3QsIGhlYWRlcnMsIHNlY3VyaXR5LCBwcm92aWRlcnMsIHJlc291cmNlcywKKyAgICAgICAgICAgICAgICBjb25maWdyYXRpb24pOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiYXBwbGljYXRpb24iKQorICAgIHB1YmxpYyBTdHJpbmcgYXBwbGljYXRpb24oQENvbnRleHQgQXBwbGljYXRpb24gYXBwbGljYXRpb24pIHsKKyAgICAgICAgU2V0PE9iamVjdD4gc2luZ2xldG9ucyA9IGFwcGxpY2F0aW9uLmdldFNpbmdsZXRvbnMoKTsKKyAgICAgICAgU2luZ2xldG9uV2l0aEluamVjdGFibGVzIHNpbmdsZXRvbiA9IChTaW5nbGV0b25XaXRoSW5qZWN0YWJsZXMpIHNpbmdsZXRvbnMKKyAgICAgICAgICAgICAgICAuaXRlcmF0b3IoKS5uZXh0KCk7CisgICAgICAgIHJldHVybiBzaW5nbGV0b24uZ2V0SW5qZWN0ZWRDb250ZXh0VmFsdWVzKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qYXhycy1jb21wb25lbnQtaW5qZWN0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvamF4cnMvaW5qZWN0L1NpbmdsZXRvbldpdGhJbmplY3RhYmxlcy5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamF4cnMtY29tcG9uZW50LWluamVjdC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2pheHJzL2luamVjdC9TaW5nbGV0b25XaXRoSW5qZWN0YWJsZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmNhODRhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamF4cnMtY29tcG9uZW50LWluamVjdC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2pheHJzL2luamVjdC9TaW5nbGV0b25XaXRoSW5qZWN0YWJsZXMuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmpheHJzLmluamVjdDsKKworLyoqCisgKiBIb2xkZXIgZm9yIGFwcGxpY2F0aW9uIGNvbmZpZ3VyYXRpb24uCisgKi8KK3B1YmxpYyBjbGFzcyBTaW5nbGV0b25XaXRoSW5qZWN0YWJsZXMgeworCisgICAgcHJpdmF0ZSBUU0FwcENvbmZpZyBjb25maWc7CisKKyAgICBwdWJsaWMgU2luZ2xldG9uV2l0aEluamVjdGFibGVzKFRTQXBwQ29uZmlnIGNvbmZpZykgeworICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZzsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEluamVjdGVkQ29udGV4dFZhbHVlcygpIHsKKyAgICAgICAgcmV0dXJuIGNvbmZpZy5nZXRJbmplY3RlZENvbnRleHRWYWx1ZXMoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qYXhycy1jb21wb25lbnQtaW5qZWN0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvamF4cnMvaW5qZWN0L1N0cmluZ0JlYW4uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2pheHJzLWNvbXBvbmVudC1pbmplY3Qvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9qYXhycy9pbmplY3QvU3RyaW5nQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwYmQ5OGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qYXhycy1jb21wb25lbnQtaW5qZWN0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvamF4cnMvaW5qZWN0L1N0cmluZ0JlYW4uamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmpheHJzLmluamVjdDsKKworLyoqCisgKiBUaGlzIGlzIHRoZSBvYmplY3Qgd2hpY2ggc3RhbmRhcmQgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgaGF2ZSBhIHByb3ZpZGVyCisgKiBmb3IsIGV2ZW4gdGhvdWdoIGl0cyBzb21lIHNpbXBsZSBTdHJpbmcgaG9sZGVyLiBJdCBjYW4gYWxzbyBiZSB1c2VkIGFzIG11dGFibGUKKyAqIHN0cmluZy4KKyAqLworcHVibGljIGNsYXNzIFN0cmluZ0JlYW4geworICAgIHByaXZhdGUgU3RyaW5nIGhlYWRlcjsKKworICAgIHB1YmxpYyBTdHJpbmdCZWFuKFN0cmluZyBoZWFkZXIpIHsKKyAgICAgICAgdGhpcy5oZWFkZXIgPSBoZWFkZXI7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgIHJldHVybiBoZWFkZXI7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0KFN0cmluZyBoZWFkZXIpIHsKKyAgICAgICAgdGhpcy5oZWFkZXIgPSBoZWFkZXI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJTdHJpbmdCZWFuLiBUbyBnZXQgYSB2YWx1ZSwgdXNlIHJhdGhlciAjZ2V0KCkgbWV0aG9kLiI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamF4cnMtY29tcG9uZW50LWluamVjdC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2pheHJzL2luamVjdC9TdHJpbmdCZWFuRW50aXR5UHJvdmlkZXIuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2pheHJzLWNvbXBvbmVudC1pbmplY3Qvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9qYXhycy9pbmplY3QvU3RyaW5nQmVhbkVudGl0eVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg1MjBhYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2pheHJzLWNvbXBvbmVudC1pbmplY3Qvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9qYXhycy9pbmplY3QvU3RyaW5nQmVhbkVudGl0eVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5qYXhycy5pbmplY3Q7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworCitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworLyoqCisgKiBQcm92aWRlciBmb3IgSkFYLVJTIHR5cGVzIHtAbGluayBNZXNzYWdlQm9keVJlYWRlcn0gYW5kIHtAbGluayBNZXNzYWdlQm9keVdyaXRlcn0uCisgKi8KK0BQcm92aWRlcgorcHVibGljIGNsYXNzIFN0cmluZ0JlYW5FbnRpdHlQcm92aWRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5UmVhZGVyPFN0cmluZ0JlYW4+LCBNZXNzYWdlQm9keVdyaXRlcjxTdHJpbmdCZWFuPiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiBTdHJpbmdCZWFuLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShTdHJpbmdCZWFuIHQsIENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHQuZ2V0KCkubGVuZ3RoKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGVUbyhTdHJpbmdCZWFuIHQsIENsYXNzPD8+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sCisgICAgICAgICAgICBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZSh0LmdldCgpLmdldEJ5dGVzKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICByZXR1cm4gaXNXcml0ZWFibGUodHlwZSwgZ2VuZXJpY1R5cGUsIGFubm90YXRpb25zLCBtZWRpYVR5cGUpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmdCZWFuIHJlYWRGcm9tKENsYXNzPFN0cmluZ0JlYW4+IHR5cGUsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaHR0cEhlYWRlcnMsIElucHV0U3RyZWFtIGVudGl0eVN0cmVhbSkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICByZXR1cm4gbnVsbDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qYXhycy1jb21wb25lbnQtaW5qZWN0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvamF4cnMvaW5qZWN0L1N0cmluZ0JlYW5FbnRpdHlQcm92aWRlcldpdGhJbmplY3RhYmxlcy5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamF4cnMtY29tcG9uZW50LWluamVjdC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2pheHJzL2luamVjdC9TdHJpbmdCZWFuRW50aXR5UHJvdmlkZXJXaXRoSW5qZWN0YWJsZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45Yjg1MDZmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamF4cnMtY29tcG9uZW50LWluamVjdC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2pheHJzL2luamVjdC9TdHJpbmdCZWFuRW50aXR5UHJvdmlkZXJXaXRoSW5qZWN0YWJsZXMuamF2YQpAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5qYXhycy5pbmplY3Q7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworCitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlJlc291cmNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVxdWVzdDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlNlY3VyaXR5Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcnM7CisKKy8qKgorICogUHJvdmlkZXIgd2l0aCB7QGxpbmsgQ29udGV4dH0gaW5qZWN0aW9uIHBvaW50cy4KKyAqLworQFByb3ZpZGVyCitwdWJsaWMgY2xhc3MgU3RyaW5nQmVhbkVudGl0eVByb3ZpZGVyV2l0aEluamVjdGFibGVzIGV4dGVuZHMgU3RyaW5nQmVhbkVudGl0eVByb3ZpZGVyIHsKKworICAgIEBDb250ZXh0CisgICAgQXBwbGljYXRpb24gYXBwbGljYXRpb247CisgICAgQENvbnRleHQKKyAgICBVcmlJbmZvIGluZm87CisgICAgQENvbnRleHQKKyAgICBSZXF1ZXN0IHJlcXVlc3Q7CisgICAgQENvbnRleHQKKyAgICBIdHRwSGVhZGVycyBoZWFkZXJzOworICAgIEBDb250ZXh0CisgICAgU2VjdXJpdHlDb250ZXh0IHNlY3VyaXR5OworICAgIEBDb250ZXh0CisgICAgUHJvdmlkZXJzIHByb3ZpZGVyczsKKyAgICBAQ29udGV4dAorICAgIFJlc291cmNlQ29udGV4dCByZXNvdXJjZXM7CisgICAgQENvbnRleHQKKyAgICBDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb247CisKKyAgICAvKioKKyAgICAgKiBDaG9zZW4gZGVjaW1hbCBhcyBhIHJlcHJlc2VudGF0aW9uIHRvIGJlIG1vcmUgaHVtYW4gcmVhZGFibGUKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBjb21wdXRlTWFzayhBcHBsaWNhdGlvbiBhcHBsaWNhdGlvbiwgVXJpSW5mbyBpbmZvLAorICAgICAgICAgICAgUmVxdWVzdCByZXF1ZXN0LCBIdHRwSGVhZGVycyBoZWFkZXJzLCBTZWN1cml0eUNvbnRleHQgc2VjdXJpdHksCisgICAgICAgICAgICBQcm92aWRlcnMgcHJvdmlkZXJzLCBSZXNvdXJjZUNvbnRleHQgcmVzb3VyY2VzLAorICAgICAgICAgICAgQ29uZmlndXJhdGlvbiBjb25maWd1cmF0aW9uKSB7CisgICAgICAgIGludCBtYXNrID0gMTsKKyAgICAgICAgbWFzayA9IDEwICogbWFzayArIChhcHBsaWNhdGlvbiA9PSBudWxsID8gMCA6IDEpOworICAgICAgICBtYXNrID0gMTAgKiBtYXNrICsgKGluZm8gPT0gbnVsbCA/IDAgOiAxKTsKKyAgICAgICAgbWFzayA9IDEwICogbWFzayArIChyZXF1ZXN0ID09IG51bGwgPyAwIDogMSk7CisgICAgICAgIG1hc2sgPSAxMCAqIG1hc2sgKyAoaGVhZGVycyA9PSBudWxsID8gMCA6IDEpOworICAgICAgICBtYXNrID0gMTAgKiBtYXNrICsgKHNlY3VyaXR5ID09IG51bGwgPyAwIDogMSk7CisgICAgICAgIG1hc2sgPSAxMCAqIG1hc2sgKyAocHJvdmlkZXJzID09IG51bGwgPyAwIDogMSk7CisgICAgICAgIG1hc2sgPSAxMCAqIG1hc2sgKyAocmVzb3VyY2VzID09IG51bGwgPyAwIDogMSk7CisgICAgICAgIG1hc2sgPSAxMCAqIG1hc2sgKyAoY29uZmlndXJhdGlvbiA9PSBudWxsID8gMCA6IDEpOworICAgICAgICByZXR1cm4gU3RyaW5nLnZhbHVlT2YobWFzayk7CisgICAgfQorCisgICAgLyoqCisgICAgICogSGVyZSwgdGhlIGJpdHdpc2Ugb3BlcmF0aW9uIHdpdGggbWFzayB2YXJpYWJsZSB3b3VsZCBiZSBtb3JlIGVmZmljaWVudCwKKyAgICAgKiBidXQgbGVzcyBodW1hbiByZWFkYWJsZSB3aGVuIHNlbmRpbmcgb3ZlciB0aGUgbGluayBhcyBhIGJpbmFyeSBudW1iZXIuCisgICAgICogSGVuY2UsIHNNYXNrIGlzIHN1cHBvc2VkIHRvIGJlIGRlY2ltYWwgbnVtYmVyIGNyZWF0ZWQgYnkgd3JpdGVUbyBtZXRob2QuCisgICAgICogPHA+CisgICAgICogSWYgc29tZXRoaW5nIGhhcyBub3QgYmVlbiBpbmplY3RlZCwgYW5kIHRodXMgbm90IHdyaXR0ZW4gYnkgd3JpdGVUbywgdGhpcworICAgICAqIHN0YXRpYyBtZXRob2QgcGFyc2VzIHdoYXQgaXQgd2FzIG5vdCBpbmplY3RlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBub3RJbmplY3RlZChTdHJpbmcgc01hc2spIHsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpICE9IHNNYXNrLmxlbmd0aCgpOyBpKyspIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZChub3RJbmplY3RlZChzTWFzaywgaSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEhlcmUsIHRoZSBiaXR3aXNlIG9wZXJhdGlvbiB3aXRoIG1hc2sgdmFyaWFibGUgd291bGQgYmUgbW9yZSBlZmZpY2llbnQsCisgICAgICogYnV0IGxlc3MgaHVtYW4gcmVhZGFibGUgd2hlbiBzZW5kaW5nIG92ZXIgdGhlIGxpbmsgYXMgYSBiaW5hcnkgbnVtYmVyLgorICAgICAqIEhlbmNlLCBzTWFzayBpcyBzdXBwb3NlZCB0byBiZSBkZWNpbWFsIG51bWJlciBjcmVhdGVkIGJ5IHdyaXRlVG8gbWV0aG9kLgorICAgICAqIDxwPgorICAgICAqIElmIHNvbWV0aGluZyBoYXMgbm90IGJlZW4gaW5qZWN0ZWQsIGFuZCB0aHVzIG5vdCB3cml0dGVuIGJ5IHdyaXRlVG8sIHRoaXMKKyAgICAgKiBzdGF0aWMgbWV0aG9kIHBhcnNlcyB3aGF0IGl0IHdhcyBub3QgaW5qZWN0ZWQuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgbm90SW5qZWN0ZWQoU3RyaW5nIHNNYXNrLCBpbnQgaW5kZXgpIHsKKyAgICAgICAgU3RyaW5nW10gbGFiZWxzID0geworICAgICAgICAgICAgICAgICJBcHBsaWNhdGlvbiwiLCAiVXJpSW5mbywiLCAiUmVxdWVzdCwiLAorICAgICAgICAgICAgICAgICJIdHRwSGVhZGVycywiLCAiU2VjdXJpdHlDb250ZXh0LCIsICJQcm92aWRlcnMsIiwKKyAgICAgICAgICAgICAgICAiUmVzb3VyY2VDb250ZXh0IiwgIkNvbmZpZ3VyYXRpb24iCisgICAgICAgIH07CisgICAgICAgIFN0cmluZyBsYWJlbCA9ICIiOworICAgICAgICBpZiAoc01hc2suY2hhckF0KGluZGV4KSA9PSAnMCcpIHsKKyAgICAgICAgICAgIGxhYmVsID0gbGFiZWxzW2luZGV4IC0gMV07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxhYmVsOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGdldFNpemUoU3RyaW5nQmVhbiB0LCBDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiA5OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oU3RyaW5nQmVhbiB0LCBDbGFzczw/PiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLAorICAgICAgICAgICAgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICBlbnRpdHlTdHJlYW0ud3JpdGUoY29tcHV0ZU1hc2soYXBwbGljYXRpb24sIGluZm8sIHJlcXVlc3QsIGhlYWRlcnMsCisgICAgICAgICAgICAgICAgc2VjdXJpdHksIHByb3ZpZGVycywgcmVzb3VyY2VzLCBjb25maWd1cmF0aW9uKS5nZXRCeXRlcygpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nQmVhbiByZWFkRnJvbShDbGFzczxTdHJpbmdCZWFuPiB0eXBlLCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGh0dHBIZWFkZXJzLCBJbnB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdCZWFuKGNvbXB1dGVNYXNrKGFwcGxpY2F0aW9uLCBpbmZvLCByZXF1ZXN0LCBoZWFkZXJzLAorICAgICAgICAgICAgICAgIHNlY3VyaXR5LCBwcm92aWRlcnMsIHJlc291cmNlcywgY29uZmlndXJhdGlvbikpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamF4cnMtY29tcG9uZW50LWluamVjdC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2pheHJzL2luamVjdC9UU0FwcENvbmZpZy5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamF4cnMtY29tcG9uZW50LWluamVjdC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2pheHJzL2luamVjdC9UU0FwcENvbmZpZy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MTAxYzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qYXhycy1jb21wb25lbnQtaW5qZWN0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvamF4cnMvaW5qZWN0L1RTQXBwQ29uZmlnLmphdmEKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5qYXhycy5pbmplY3Q7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5SZXNvdXJjZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlcXVlc3Q7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5TZWN1cml0eUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcnM7CisKKy8qKgorICogQXBwbGljYXRpb24gQ29uZmlndXJhdGlvbiB3aXRoIHtAbGluayBDb250ZXh0fSBpbmplY3Rpb24gcG9pbnRzLgorICovCitwdWJsaWMgY2xhc3MgVFNBcHBDb25maWcgZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKyAgICBAQ29udGV4dAorICAgIFVyaUluZm8gaW5mbzsKKyAgICBAQ29udGV4dAorICAgIFJlcXVlc3QgcmVxdWVzdDsKKyAgICBAQ29udGV4dAorICAgIEh0dHBIZWFkZXJzIGhlYWRlcnM7CisgICAgQENvbnRleHQKKyAgICBTZWN1cml0eUNvbnRleHQgc2VjdXJpdHk7CisgICAgQENvbnRleHQKKyAgICBQcm92aWRlcnMgcHJvdmlkZXJzOworICAgIEBDb250ZXh0CisgICAgUmVzb3VyY2VDb250ZXh0IHJlc291cmNlczsKKworICAgIHB1YmxpYyBqYXZhLnV0aWwuU2V0PGphdmEubGFuZy5DbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgU2V0PENsYXNzPD8+PiByZXNvdXJjZXMgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgIHJlc291cmNlcy5hZGQoUmVzb3VyY2UuY2xhc3MpOworICAgICAgICByZXNvdXJjZXMuYWRkKFN0cmluZ0JlYW5FbnRpdHlQcm92aWRlcldpdGhJbmplY3RhYmxlcy5jbGFzcyk7CisgICAgICAgIHJlc291cmNlcy5hZGQoUHJpbnRpbmdFcnJvckhhbmRsZXIuY2xhc3MpOworICAgICAgICByZXR1cm4gcmVzb3VyY2VzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8T2JqZWN0PiBnZXRTaW5nbGV0b25zKCkgeworICAgICAgICBPYmplY3Qgc2luZ2xlID0gbmV3IFNpbmdsZXRvbldpdGhJbmplY3RhYmxlcyh0aGlzKTsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbihzaW5nbGUpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0SW5qZWN0ZWRDb250ZXh0VmFsdWVzKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nQmVhbkVudGl0eVByb3ZpZGVyV2l0aEluamVjdGFibGVzLmNvbXB1dGVNYXNrKAorICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogU3BlYzogOS4yLjEgQXBwbGljYXRpb24gTm90ZSB0aGF0IHRoaXMgY2Fubm90IGJlIGluamVjdGVkIGludG8gdGhlIEFwcGxpY2F0aW9uIHN1YmNsYXNzIGl0c2VsZiBzaW5jZSB0aGlzIHdvdWxkCisgICAgICAgICAgICAgICAgICogY3JlYXRlIGEgY2lyY3VsYXIgZGVwZW5kZW5jeS4KKyAgICAgICAgICAgICAgICAgKiAqLworICAgICAgICAgICAgICAgIHRoaXMsIGluZm8sIHJlcXVlc3QsIGhlYWRlcnMsIHNlY3VyaXR5LCBwcm92aWRlcnMsIHJlc291cmNlcywKKyAgICAgICAgICAgICAgICAvLyBDb25maWd1cmF0aW9uIGluamVjdGlvbiBOL0Egb24gQXBwbGljYXRpb24KKyAgICAgICAgICAgICAgICBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpLmdldENvbmZpZ3VyYXRpb24oKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamF4cnMtY29tcG9uZW50LWluamVjdC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vamF4cnMtY29tcG9uZW50LWluamVjdC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMDc4NDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qYXhycy1jb21wb25lbnQtaW5qZWN0L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwzOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIyLjUiIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzJfNS54c2QiPgorICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkNUU0pBWFJTQ29udGV4dFNlcnZlcjwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuamF4cnMuaW5qZWN0LlRTQXBwQ29uZmlnPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5DVFNKQVhSU0NvbnRleHRTZXJ2ZXI8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKyAgICA8c2Vzc2lvbi1jb25maWc+CisgICAgICAgIDxzZXNzaW9uLXRpbWVvdXQ+MzA8L3Nlc3Npb24tdGltZW91dD4KKyAgICA8L3Nlc3Npb24tY29uZmlnPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamF4cnMtY29tcG9uZW50LWluamVjdC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2pheHJzL2luamVjdC9BcHBsaWNhdGlvbkluamVjdElUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamF4cnMtY29tcG9uZW50LWluamVjdC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2pheHJzL2luamVjdC9BcHBsaWNhdGlvbkluamVjdElUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwYzFmZjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qYXhycy1jb21wb25lbnQtaW5qZWN0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvamF4cnMvaW5qZWN0L0FwcGxpY2F0aW9uSW5qZWN0SVRDYXNlLmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5qYXhycy5pbmplY3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3RzIHtAbGluayBqYXZheC53cy5ycy5jb3JlLkNvbnRleHR9IGluamVjdGlvbiBpbnRvIEpBWC1SUyBjb21wb25lbnRzIFByb3ZpZGVyLCBSZXNvdXJjZSwgQXBwbGljYXRpb24uCisgKgorICogQGF1dGhvciBQZXRyIEJvdWRhCisgKi8KK3B1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbkluamVjdElUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBcHBsaWNhdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5zdGFuY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgV2ViVGFyZ2V0IHQgPSB0YXJnZXQoKTsKKyAgICAgICAgdC5yZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIFJlc3BvbnNlIHIgPSB0LnBhdGgoIi9yZXNvdXJjZS9pbnN0YW5jZSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgci5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMTExMTExMTExIiwgci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBXZWJUYXJnZXQgdCA9IHRhcmdldCgpOworICAgICAgICB0LnJlZ2lzdGVyKExvZ2dpbmdGZWF0dXJlLmNsYXNzKTsKKyAgICAgICAgUmVzcG9uc2UgciA9IHQucGF0aCgiL3Jlc291cmNlL21ldGhvZCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgci5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiMTExMTExMTExIiwgci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBcHBsaWNhdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBXZWJUYXJnZXQgdCA9IHRhcmdldCgpOworICAgICAgICB0LnJlZ2lzdGVyKExvZ2dpbmdGZWF0dXJlLmNsYXNzKTsKKyAgICAgICAgUmVzcG9uc2UgciA9IHQucGF0aCgiL3Jlc291cmNlL2FwcGxpY2F0aW9uIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCIxMTExMTExMTEiLCByLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTExMDcvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xMTA3L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJlYTkzMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xMTA3L3BvbS54bWwKQEAgLTAsMCArMSw2NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmplcnNleS0xMTA3PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLWplcnNleS0xMTA3PC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPlNlcnZsZXQgaW50ZWdyYXRpb24gdGVzdCAtIEpFUlNFWS0xMTA3IC0gVGhyZWFkIGdldHMgc3R1Y2tlZCBpZiBubyBNZXNzYWdlQm9keVdyaXRlciBpcyBmb3VuZCBpbiBBcHBsaWNhdGlvbkhhbmRsZXIjd3JpdGVSZXNwb25zZTwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xMTA3L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTEwNy9KZXJzZXkxMTA3LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTEwNy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTExMDcvSmVyc2V5MTEwNy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNzNkNzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTEwNy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTExMDcvSmVyc2V5MTEwNy5qYXZhCkBAIC0wLDAgKzEsMTI4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTExMDc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXkxMTA3IGV4dGVuZHMgQXBwbGljYXRpb24geworCisgICAgLyoqCisgICAgICogVGhpcyBNZXNzYWdlQm9keVdyaXRlciBkb2VzIG5vdCBzdXBwb3J0IHRoZSAiZXhjZXB0aW9uL251bGxwb2ludGVyZXhjZXB0aW9uIiBtZWRpYSB0eXBlIHJlcXVpcmVkIGJ5IHRoZQorICAgICAqIHtAY29kZSBSZXNvdXJjZSNnZXROcGUoKX0gbWV0aG9kIHdoaWNoIHNob3VsZCByZXN1bHQgaW4gYW4gZW1wdHkge0Bjb2RlIE1lc3NhZ2VCb2R5V3JpdGVyfSBhbmQgdGhlcmVmb3JlCisgICAgICogYW4gTlBFIGluIHtAY29kZSBBcHBsaWNhdGlvbkhhbmRsZXJ9LgorICAgICAqCisgICAgICogQHNlZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkxMTA3LkplcnNleTExMDcuUmVzb3VyY2UjZ2V0TnBlKCkKKyAgICAgKi8KKyAgICBAUHJvdmlkZXIKKyAgICBAUHJvZHVjZXMoeyJleGNlcHRpb24vaW9leGNlcHRpb24iLCAiZXhjZXB0aW9uL3dlYmFwcGxpY2F0aW9uZXhjZXB0aW9uIn0pCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBFeGNlcHRpb25UaHJvd2VyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8RXhjZXB0aW9uPiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKAorICAgICAgICAgICAgICAgIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICAgICAgcmV0dXJuIElPRXhjZXB0aW9uLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSkgfHwgUnVudGltZUV4Y2VwdGlvbi5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBsb25nIGdldFNpemUoCisgICAgICAgICAgICAgICAgRXhjZXB0aW9uIHQsCisgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gdHlwZSwKKyAgICAgICAgICAgICAgICBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgd3JpdGVUbygKKyAgICAgICAgICAgICAgICBFeGNlcHRpb24gZSwKKyAgICAgICAgICAgICAgICBDbGFzczw/PiB0eXBlLAorICAgICAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAgICAgLy8gQ2Fubm90IHdyaXRlIGFueXRoaW5nIGludG8gdGhlIGVudGl0eVN0cmVhbSB0byBlbnN1cmUgdGhlIENvbnRhaW5lclJlc3BvbnNlV3JpdGVyI3dyaXRlUmVzcG9uc2VTdGF0dXNBbmRIZWFkZXJzCisgICAgICAgICAgICAvLyBpbiBBcHBsaWNhdGlvbkhhbmRsZXIjd3JpdGVSZXNwb25zZSBpcyBub3QgaW52b2tlZC4KKworICAgICAgICAgICAgLy8gU2ltcGx5IHRocm93IHRoZSBnaXZlbiBleGNlcHRpb24uCisgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIElPRXhjZXB0aW9uKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgKElPRXhjZXB0aW9uKSBlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbikgZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIi9pb2UiKQorICAgICAgICBAUHJvZHVjZXMoImV4Y2VwdGlvbi9pb2V4Y2VwdGlvbiIpCisgICAgICAgIHB1YmxpYyBJT0V4Y2VwdGlvbiBnZXRJb2UoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IElPRXhjZXB0aW9uKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCIvd2FlIikKKyAgICAgICAgQFByb2R1Y2VzKCJleGNlcHRpb24vd2ViYXBwbGljYXRpb25leGNlcHRpb24iKQorICAgICAgICBwdWJsaWMgV2ViQXBwbGljYXRpb25FeGNlcHRpb24gZ2V0V2FlKCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbigpOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUGF0aCgiL25wZSIpCisgICAgICAgIEBQcm9kdWNlcygiZXhjZXB0aW9uL251bGxwb2ludGVyZXhjZXB0aW9uIikKKyAgICAgICAgcHVibGljIE51bGxQb2ludGVyRXhjZXB0aW9uIGdldE5wZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIlRoaXMgbWVzc2FnZSBzaG91bGQgbmV2ZXIgZ2V0IHRvIHRoZSBjbGllbnQhIik7CisgICAgICAgIH0KKworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgIHJldHVybiBuZXcgSGFzaFNldDxDbGFzczw/Pj4oKSB7eworICAgICAgICAgICAgYWRkKFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgICAgIGFkZChFeGNlcHRpb25UaHJvd2VyLmNsYXNzKTsKKyAgICAgICAgfX07CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTEwNy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTExMDcvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzE0NGY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTExMDcvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjIuNSIKKyAgICAgICAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKKyAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT50ZXN0U2VydmxldDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LndzLnJzLkFwcGxpY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTExMDcuSmVyc2V5MTEwNzwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT50ZXN0U2VydmxldDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTExMDcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxMTA3L0FwcGxpY2F0aW9uSGFuZGxlcklUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTExMDcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxMTA3L0FwcGxpY2F0aW9uSGFuZGxlcklUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExY2IyMTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTEwNy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTExMDcvQXBwbGljYXRpb25IYW5kbGVySVRDYXNlLmphdmEKQEAgLTAsMCArMSwxMTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MTEwNzsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNhbGxhYmxlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBUZXN0cyBmb3IgSkVSU0VZLTExMDc6IFRocmVhZCBnZXRzIHN0dWNrIGlmIG5vIE1lc3NhZ2VCb2R5V3JpdGVyIGlzIGZvdW5kIGluIEFwcGxpY2F0aW9uSGFuZGxlciN3cml0ZVJlc3BvbnNlLgorICogPHAvPgorICogSWYgYW4gZXhjZXB0aW9uIChlLmcuIE5QRSBjYXVzZWQgYnkgbm9uLWV4aXN0ZW50IE1lc3NhZ2VCb2R5V3JpdGVyKSBpcyB0aHJvd24gaW4gQXBwbGljYXRpb25IYW5kbGVyI3dyaXRlUmVzcG9uc2UgYmVmb3JlCisgKiBoZWFkZXJzIGFuZCByZXNwb25zZSBzdGF0dXMgYXJlIHdyaXR0ZW4gYnkgQ29udGFpbmVyUmVzcG9uc2VXcml0ZXIjd3JpdGVSZXNwb25zZVN0YXR1c0FuZEhlYWRlcnMgdGhlbiB0aGUKKyAqIENvbnRhaW5lclJlc3BvbnNlV3JpdGVyI2NvbW1pdCBpbiB0aGUgZmluYWxseSBjbGF1c2Ugd2lsbCBzdHVjayB0aGUgdGhyZWFkLgorICogPHAvPgorICogVGhlIHB1cnBvc2Ugb2YgdGhlIHRlc3RzIGJlbG93IGlzIHRvIHNob3cgdGhhdCBhIHJlc3BvbnNlIGlzIHJldHVybmVkIGZyb20gdGhlIHNlcnZlciBhbmQgbm9uZSBvZiB0aGUgdGhyZWFkcyBnZXRzIHN0dWNrLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgQXBwbGljYXRpb25IYW5kbGVySVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKCkucmVnaXN0ZXJJbnN0YW5jZXMobmV3IEplcnNleTExMDcoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgYSB0aHJlYWQgZ2V0cyBzdHVjayB3aGVuIGFuIHtAY29kZSBJT0V4Y2VwdGlvbn0gaXMgdGhyb3duIGZyb20gdGhlIHtAY29kZQorICAgICAqIE1lc3NhZ2VCb2R5V3JpdGVyI3dyaXRlVG99LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdElPRXhjZXB0aW9uSW5Xcml0ZVJlc3BvbnNlTWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0RXhjZXB0aW9uSW5Xcml0ZVJlc3BvbnNlTWV0aG9kKCJpb2UiLCAiZXhjZXB0aW9uL2lvZXhjZXB0aW9uIiwgUmVzcG9uc2UuU3RhdHVzLklOVEVSTkFMX1NFUlZFUl9FUlJPUik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIGlmIGEgdGhyZWFkIGdldHMgc3R1Y2sgd2hlbiBhbiB7QGNvZGUgV2ViQXBwbGljYXRpb25FeGNlcHRpb259IGlzIHRocm93biBmcm9tIHRoZSB7QGNvZGUKKyAgICAgKiBNZXNzYWdlQm9keVdyaXRlciN3cml0ZVRvfS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbkluV3JpdGVSZXNwb25zZU1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdEV4Y2VwdGlvbkluV3JpdGVSZXNwb25zZU1ldGhvZCgid2FlIiwgImV4Y2VwdGlvbi93ZWJhcHBsaWNhdGlvbmV4Y2VwdGlvbiIsIFJlc3BvbnNlLlN0YXR1cy5JTlRFUk5BTF9TRVJWRVJfRVJST1IpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyBpZiBhIHRocmVhZCBnZXRzIHN0dWNrIHdoZW4gbm8ge0Bjb2RlIE1lc3NhZ2VCb2R5V3JpdGVyfSBpcyBmb3VuZCBhbmQgdGhlcmVmb3JlIGFuIHtAY29kZSBOUEV9IGlzIHRocm93bgorICAgICAqIHdoZW4gdHJ5aW5nIHRvIGludm9rZSB7QGNvZGUgTWVzc2FnZUJvZHlXcml0ZXIjd3JpdGVUb30gb24gYW4gZW1wdHkgb2JqZWN0LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE51bGxQb2ludGVyRXhjZXB0aW9uSW5Xcml0ZVJlc3BvbnNlTWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0RXhjZXB0aW9uSW5Xcml0ZVJlc3BvbnNlTWV0aG9kKCJucGUiLCAiZXhjZXB0aW9uL251bGxwb2ludGVyZXhjZXB0aW9uIiwgUmVzcG9uc2UuU3RhdHVzLklOVEVSTkFMX1NFUlZFUl9FUlJPUik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHJlcXVlc3QgdG8gdGhlIHNlcnZlciAod2l0aCB0aGUgd2hvbGUgcHJvY2VzcyB0aW1lIHNldCB0byB0aGUgbWF4aW11bSBvZiA1IHNlY29uZHMpIGZvciB0aGUgZ2l2ZW4ge0Bjb2RlIHBhdGh9CisgICAgICogYW5kIHtAY29kZSBtZWRpYVR5cGV9IHRoYXQgc2hvdWxkIHJlc3VsdCBpbiB0aGUge0Bjb2RlIGV4cGVjdGVkUmVzcG9uc2V9LgorICAgICAqLworICAgIHByaXZhdGUgdm9pZCBfdGVzdEV4Y2VwdGlvbkluV3JpdGVSZXNwb25zZU1ldGhvZChmaW5hbCBTdHJpbmcgcGF0aCwgZmluYWwgU3RyaW5nIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVzcG9uc2UuU3RhdHVzIGV4cGVjdGVkUmVzcG9uc2UpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICAvLyBFeGVjdXRvci4KKyAgICAgICAgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yKCk7CisKKyAgICAgICAgZmluYWwgRnV0dXJlPFJlc3BvbnNlPiByZXNwb25zZUZ1dHVyZSA9IGV4ZWN1dG9yLnN1Ym1pdChuZXcgQ2FsbGFibGU8UmVzcG9uc2U+KCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBSZXNwb25zZSBjYWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldCgpLnBhdGgocGF0aCkucmVxdWVzdChtZWRpYVR5cGUpLmdldCgpOworICAgICAgICAgICAgfQorCisgICAgICAgIH0pOworCisgICAgICAgIGV4ZWN1dG9yLnNodXRkb3duKCk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gaW5UaW1lID0gZXhlY3V0b3IuYXdhaXRUZXJtaW5hdGlvbig1MDAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworCisgICAgICAgIC8vIEFzc2VydHMuCisgICAgICAgIGFzc2VydFRydWUoaW5UaW1lKTsKKworICAgICAgICAvLyBSZXNwb25zZS4KKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSByZXNwb25zZUZ1dHVyZS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkUmVzcG9uc2UuZ2V0U3RhdHVzQ29kZSgpLCByZXNwb25zZS5nZXRTdGF0dXNJbmZvKCkuZ2V0U3RhdHVzQ29kZSgpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xMjIzL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTIyMy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYzlkMTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTIyMy9wb20ueG1sCkBAIC0wLDAgKzEsNjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAgPHBhcmVudD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICAgIDxhcnRpZmFjdElkPmplcnNleS0xMjIzPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLWplcnNleS0xMjIzPC9uYW1lPgorICAgIDx1cmw+aHR0cDovL21hdmVuLmFwYWNoZS5vcmc8L3VybD4KKworICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgU2VydmxldCBpbnRlZ3JhdGlvbiB0ZXN0IC0gSkVSU0VZLTEyMjMgLSAiNTAwIEludGVybmFsIFNlcnZlciBFcnJvciIgZm9yIFBPU1QgcmVxdWVzdCB3aXRoIGdhcmJhZ2UgaW5zdGVhZCBvZgorICAgICAgICAiQ29udGVudC1UeXBlIgorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTEyMjMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxMjIzL0plcnNleTEyMjMuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xMjIzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTIyMy9KZXJzZXkxMjIzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBmY2QzYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xMjIzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTIyMy9KZXJzZXkxMjIzLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkxMjIzOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEplcnNleTEyMjMgZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKyAgICBAUGF0aCh2YWx1ZSA9ICIvQ29udGVudFR5cGUiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29udGVudFR5cGVSZXNvdXJjZSB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgQFByb2R1Y2VzKHZhbHVlID0gInRleHQvcGxhaW4iKQorICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZFBhcmFtZXRlcnMiLCAiSmF2YURvYyJ9KQorICAgICAgICBwdWJsaWMgdm9pZCBwb3N0VGVzdChmaW5hbCBTdHJpbmcgc3RyKSB7CisgICAgICAgICAgICAvLyBJZ25vcmUgdG8gZ2VuZXJhdGUgcmVzcG9uc2UgMjA0IC0gTm9Db250ZW50LgorICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLjxDbGFzczw/Pj5zaW5nbGV0b24oQ29udGVudFR5cGVSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTEyMjMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xMjIzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYzNDgyNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xMjIzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSw0NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8IURPQ1RZUEUgd2ViLWFwcCBQVUJMSUMKKyAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIFdlYiBBcHBsaWNhdGlvbiAyLjMvL0VOIgorICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItYXBwXzJfMy5kdGQiID4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi41IgorICAgICAgICAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKKyAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIj4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPnRlc3RTZXJ2bGV0MTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MTIyMy5KZXJzZXkxMjIzPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPnRlc3RTZXJ2bGV0MTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCis8L3dlYi1hcHA+CisKKwpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTEyMjMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxMjIzL0FwcGxpY2F0aW9uSGFuZGxlcklUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTEyMjMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxMjIzL0FwcGxpY2F0aW9uSGFuZGxlcklUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYTM0NzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTIyMy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTEyMjMvQXBwbGljYXRpb25IYW5kbGVySVRDYXNlLmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkxMjIzOworCitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0cyBKRVJTRVkgaXNzdWUgMTIyMy4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uSGFuZGxlcklUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhKZXJzZXkxMjIzLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEludmFsaWRDb250ZW50VHlwZUhlYWRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBVUkwgdXJsID0gbmV3IFVSTChnZXRCYXNlVXJpKCkudG9TdHJpbmcoKSArICJDb250ZW50VHlwZSIpOworICAgICAgICBmaW5hbCBIdHRwVVJMQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gKEh0dHBVUkxDb25uZWN0aW9uKSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKKworICAgICAgICBjb25uZWN0aW9uLnNldFJlcXVlc3RNZXRob2QoIlBPU1QiKTsKKyAgICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0UHJvcGVydHkoIkFjY2VwdCIsICJ0ZXh0L3BsYWluIik7CisgICAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KCJDb250ZW50LVR5cGUiLCAiYXBwbGljYXRpb24vanNvbiwgYXBwL2pzb24iKTsKKworICAgICAgICBjb25uZWN0aW9uLnNldERvT3V0cHV0KHRydWUpOworICAgICAgICBjb25uZWN0aW9uLmNvbm5lY3QoKTsKKworICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gY29ubmVjdGlvbi5nZXRPdXRwdXRTdHJlYW0oKTsKKyAgICAgICAgb3V0cHV0U3RyZWFtLndyaXRlKCJIZWxsb1dvcmxkISIuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIG91dHB1dFN0cmVhbS53cml0ZSgnXG4nKTsKKyAgICAgICAgb3V0cHV0U3RyZWFtLmZsdXNoKCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMCwgY29ubmVjdGlvbi5nZXRSZXNwb25zZUNvZGUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE2MDQvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xNjA0L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdlYzdiMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xNjA0L3BvbS54bWwKQEAgLTAsMCArMSw2OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgICA8cGFyZW50PgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgICAgPGFydGlmYWN0SWQ+amVyc2V5LTE2MDQ8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tamVyc2V5LTE2MDQ8L25hbWU+CisgICAgPHVybD5odHRwOi8vbWF2ZW4uYXBhY2hlLm9yZzwvdXJsPgorCisgICAgPGRlc2NyaXB0aW9uPlNlcnZsZXQgaW50ZWdyYXRpb24gdGVzdCAtIEpFUlNFWS0xNjA0IC0gSU9FeGNlcHRpb24gImNvbm5lY3Rpb24gY2xvc2VkIiBoYXBwZW5zIG9uIGNhbGxpbmcgZGVsZXRlIHdpdGhvdXQgcGFyYW1ldGVyczwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29ubmVjdG9yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1hcGFjaGUtY29ubmVjdG9yPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTYwNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE2MDQvSmVyc2V5MTYwNC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE2MDQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxNjA0L0plcnNleTE2MDQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGEyYmJkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE2MDQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxNjA0L0plcnNleTE2MDQuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTE2MDQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLkRFTEVURTsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworLyoqCisgKiBBcHBsaWNhdGlvbiBjbGFzcyB3aXRoIHRlc3QgcmVzb3VyY2UgdGhhdCBzZXRzIHtAY29kZSBDb25uZWN0aW9ufSBoZWFkZXIgdG8ge0Bjb2RlIGNsb3NlfS4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEplcnNleTE2MDQgZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuPENsYXNzPD8+PnNpbmdsZXRvbihUZXN0UmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBQYXRoKCIvIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFRlc3RSZXNvdXJjZSB7CisKKyAgICAgICAgQERFTEVURQorICAgICAgICBwdWJsaWMgUmVzcG9uc2UgZGVsZXRlKCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlCisgICAgICAgICAgICAgICAgICAgIC5vaygpCisgICAgICAgICAgICAgICAgICAgIC50eXBlKE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpCisgICAgICAgICAgICAgICAgICAgIC5oZWFkZXIoIkNvbm5lY3Rpb24iLCAiY2xvc2UiKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xNjA0L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTYwNC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYWFhNzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTYwNC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsNDYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPCFET0NUWVBFIHdlYi1hcHAgUFVCTElDCisgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBXZWIgQXBwbGljYXRpb24gMi4zLy9FTiIKKyAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWFwcF8yXzMuZHRkIiA+CisKKzx3ZWItYXBwIHZlcnNpb249IjIuNSIKKyAgICAgICAgIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCisgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT50ZXN0U2VydmxldDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LndzLnJzLkFwcGxpY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTE2MDQuSmVyc2V5MTYwNDwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT50ZXN0U2VydmxldDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworPC93ZWItYXBwPgorCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xNjA0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTYwNC9Db25uZWN0aW9uQ2xvc2VJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xNjA0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTYwNC9Db25uZWN0aW9uQ2xvc2VJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjdjYmZmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE2MDQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxNjA0L0Nvbm5lY3Rpb25DbG9zZUlUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MTYwNDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5hcGFjaGUuY29ubmVjdG9yLkFwYWNoZUNvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogVGVzdHMgSkVSU0VZIGlzc3VlIDE2MDQuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBDb25uZWN0aW9uQ2xvc2VJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoSmVyc2V5MTYwNC5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcuY29ubmVjdG9yUHJvdmlkZXIobmV3IEFwYWNoZUNvbm5lY3RvclByb3ZpZGVyKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbm5lY3Rpb25DbG9zZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5oZWFkZXIoIkNvbm5lY3Rpb24iLCAiY2xvc2UiKS5kZWxldGUoKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmhhc0VudGl0eSgpLCBpcyhmYWxzZSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xNjY3L3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTY2Ny9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMDI0M2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTY2Ny9wb20ueG1sCkBAIC0wLDAgKzEsNzYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktMTY2NzwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1qZXJzZXktMTY2NzwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5TZXJ2bGV0IGludGVncmF0aW9uIHRlc3QgLSBKRVJTRVktMTY2NyAtIEluY29ycmVjdCBoYW5kbGluZyBvZiBmaWxlIHVwbG9hZCBlcnJvcnMgd2hlbiB0ZW1wIGZpbGVzIGNhbm5vdCBiZSB3cml0dGVuPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtzZXJ2bGV0Mi52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLW11bHRpcGFydDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTY2Ny9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE2NjcvSXNzdWUxNjY3UmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xNjY3L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTY2Ny9Jc3N1ZTE2NjdSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2YmE2NGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTY2Ny9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE2NjcvSXNzdWUxNjY3UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTE2Njc7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LkZvcm1EYXRhUGFyYW07CisKKy8qKgorICogVGVzdCByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFBhdGgoIi8iKQorcHVibGljIGNsYXNzIElzc3VlMTY2N1Jlc291cmNlIHsKKworICAgIEBQT1NUCisgICAgQFBhdGgoInBhcnQtZmlsZS1uYW1lIikKKyAgICBAQ29uc3VtZXMoTWVkaWFUeXBlLk1VTFRJUEFSVF9GT1JNX0RBVEEpCisgICAgcHVibGljIFN0cmluZyBwb3N0KAorICAgICAgICAgICAgQEZvcm1EYXRhUGFyYW0oInBhcnQiKSBTdHJpbmcgcywKKyAgICAgICAgICAgIEBGb3JtRGF0YVBhcmFtKCJwYXJ0IikgRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24gZCkgeworICAgICAgICByZXR1cm4gcyArICI6IiArIGQuZ2V0RmlsZU5hbWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTY2Ny9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE2NjcvSmVyc2V5MTY2Ny5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE2Njcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxNjY3L0plcnNleTE2NjcuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjY2MjNjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE2Njcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxNjY3L0plcnNleTE2NjcuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTE2Njc7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuTXVsdGlQYXJ0RmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuTXVsdGlQYXJ0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKKy8qKgorICogSkFYLVJTIGFwcGxpY2F0aW9uIGZvciB0aGUgSkVSU0VZLTE2NjcgcmVwcm9kdWNlciB0ZXN0LgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgSmVyc2V5MTY2NyBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKworICAgIHB1YmxpYyBKZXJzZXkxNjY3KCkgeworICAgICAgICByZWdpc3RlcihJc3N1ZTE2NjdSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJlZ2lzdGVyKE11bHRpUGFydEZlYXR1cmUuY2xhc3MpOworCisgICAgICAgIHJlZ2lzdGVyKG5ldyBNdWx0aVBhcnRQcm9wZXJ0aWVzKCkuYnVmZmVyVGhyZXNob2xkKDgxOTIpLnRlbXBEaXIoIi9ub24tZXhpc3RlbnQtZGlyZWN0b3J5IikucmVzb2x2ZXIoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE2Njcvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xNjY3L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg5NzcwNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xNjY3L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIyLjUiIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIj4KKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5qZXJzZXkxNjY3U2VydmxldDwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MTY2Ny5KZXJzZXkxNjY3PC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5qZXJzZXkxNjY3U2VydmxldDwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE2Njcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxNjY3L0plcnNleTE2NjdJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xNjY3L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTY2Ny9KZXJzZXkxNjY3SVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU5NTIzZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xNjY3L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTY2Ny9KZXJzZXkxNjY3SVRDYXNlLmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkxNjY3OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5Gb3JtRGF0YUJvZHlQYXJ0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5Gb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuRm9ybURhdGFNdWx0aVBhcnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0Lk11bHRpUGFydEZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogUmVwcm9kdWNlciB0ZXN0cyBmb3IgSkVSU0VZLTIxNjAuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXkxNjY3SVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KGZpbmFsIENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKE11bHRpUGFydEZlYXR1cmUuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcm9kdWNlciBtZXRob2QgZm9yIEpFUlNFWS0xNjY3LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEplcnNleTE2NjdGaXgoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKS5wYXRoKCJwYXJ0LWZpbGUtbmFtZSIpOworCisgICAgICAgIGNoYXJbXSBjaGFycyA9IG5ldyBjaGFyWzEwICogMTAyNF07CisgICAgICAgIEFycmF5cy5maWxsKGNoYXJzLCAnYScpOworICAgICAgICBmaW5hbCBTdHJpbmcgYm9keSA9IG5ldyBTdHJpbmcoY2hhcnMpOworCisgICAgICAgIGZpbmFsIEZvcm1EYXRhTXVsdGlQYXJ0IG11bHRpUGFydCA9IG5ldyBGb3JtRGF0YU11bHRpUGFydCgpOworICAgICAgICBmaW5hbCBGb3JtRGF0YUJvZHlQYXJ0IGJvZHlQYXJ0ID0gbmV3IEZvcm1EYXRhQm9keVBhcnQoRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb24ubmFtZSgicGFydCIpLmZpbGVOYW1lKCJmaWxlIikuYnVpbGQoKSwKKyAgICAgICAgICAgICAgICBib2R5KTsKKyAgICAgICAgbXVsdGlQYXJ0LmJvZHlQYXJ0KGJvZHlQYXJ0KTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KG11bHRpUGFydCwgTWVkaWFUeXBlLk1VTFRJUEFSVF9GT1JNX0RBVEFfVFlQRSkpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oNTAwKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE4MjkvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xODI5L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRmMTU5OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xODI5L3BvbS54bWwKQEAgLTAsMCArMSw2NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKyAgICA8cGFyZW50PgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgICAgPGFydGlmYWN0SWQ+amVyc2V5LTE4Mjk8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tamVyc2V5LTE4Mjk8L25hbWU+CisgICAgPHVybD5odHRwOi8vbWF2ZW4uYXBhY2hlLm9yZzwvdXJsPgorCisKKyAgICA8ZGVzY3JpcHRpb24+U2VydmxldCBpbnRlZ3JhdGlvbiB0ZXN0IC0gSkVSU0VZLTE4MjkgLSBDdXN0b20gcmVhc29uIHBocmFzZSBpbiByZXNwb25zZSBzdGF0dXMgZG9lcyBub3Qgd29yazwvZGVzY3JpcHRpb24+CisKKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldC1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xODI5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTgyOS9KZXJzZXkxODI5LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTgyOS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE4MjkvSmVyc2V5MTgyOS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMzk4ZjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTgyOS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE4MjkvSmVyc2V5MTgyOS5qYXZhCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MTgyOTsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCisvKioKKyAqIEFwcGxpY2F0aW9uIGNsYXNzIHdpdGggdGVzdCByZXNvdXJjZSB0aGF0IHJldHVybnMgY3VzdG9tIHN0YXR1cyByZWFzb24gcGhyYXNlLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIEplcnNleTE4MjkgZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRUFTT05fUEhSQVNFID0gIm15LXBocmFzZSI7CisKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuPENsYXNzPD8+PnNpbmdsZXRvbihUZXN0UmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBQYXRoKCJyZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBUZXN0UmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIjQyOCIpCisgICAgICAgIHB1YmxpYyBSZXNwb25zZSBnZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKG5ldyBDdXN0b200MjhUeXBlKCkpLmJ1aWxkKCk7CisgICAgICAgIH0KKworICAgICAgICBAR0VUCisgICAgICAgIEBQYXRoKCI0MjgtZW50aXR5IikKKyAgICAgICAgcHVibGljIFJlc3BvbnNlIGdldFdpdGhFbnRpdHkoKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKG5ldyBDdXN0b200MjhUeXBlKCkpLmVudGl0eSgiZW50aXR5IikuYnVpbGQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ3VzdG9tNDI4VHlwZSBpbXBsZW1lbnRzIFJlc3BvbnNlLlN0YXR1c1R5cGUgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGdldFN0YXR1c0NvZGUoKSB7CisgICAgICAgICAgICByZXR1cm4gNDI4OworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVhc29uUGhyYXNlKCkgeworICAgICAgICAgICAgcmV0dXJuIFJFQVNPTl9QSFJBU0U7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFJlc3BvbnNlLlN0YXR1cy5GYW1pbHkgZ2V0RmFtaWx5KCkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLlN0YXR1cy5GYW1pbHkuQ0xJRU5UX0VSUk9SOworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTgyOS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE4Mjkvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZTUxMjEwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE4Mjkvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDQ2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzwhRE9DVFlQRSB3ZWItYXBwIFBVQkxJQworICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgV2ViIEFwcGxpY2F0aW9uIDIuMy8vRU4iCisgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1hcHBfMl8zLmR0ZCIgPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIyLjUiCisgICAgICAgICB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgorICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzJfNS54c2QiPgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+dGVzdFNlcnZsZXQxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC53cy5ycy5BcHBsaWNhdGlvbjwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkxODI5LkplcnNleTE4Mjk8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+dGVzdFNlcnZsZXQxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKzwvd2ViLWFwcD4KKworCmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTgyOS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE4MjkvQXBwbGljYXRpb25IYW5kbGVySVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTgyOS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE4MjkvQXBwbGljYXRpb25IYW5kbGVySVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFmODFhZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xODI5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTgyOS9BcHBsaWNhdGlvbkhhbmRsZXJJVENhc2UuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTE4Mjk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGVzdHMgSkVSU0VZIGlzc3VlIDE3NDQuIEN1c3RvbSBzdGF0dXMgcmVhc29uIHBocmFzZSByZXR1cm5lZCBmcm9tIHRoZSByZXNvdXJjZSBtZXRob2Qgd2FzIG5vdCBwcm9wYWdhdGVkIG91dCBvZiB0aGUKKyAqIHNlcnZsZXQgY29udGFpbmVyLgorICoKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uSGFuZGxlcklUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhKZXJzZXkxODI5LmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbVJlc3BvbnNlNDI4KCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlLzQyOCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MjgsIHJlc3BvbnNlLmdldFN0YXR1c0luZm8oKS5nZXRTdGF0dXNDb2RlKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJteS1waHJhc2UiLCByZXNwb25zZS5nZXRTdGF0dXNJbmZvKCkuZ2V0UmVhc29uUGhyYXNlKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEN1c3RvbVJlc3BvbnNlNDI4V2l0aEVudGl0eSgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZS80MjgtZW50aXR5IikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQyOCwgcmVzcG9uc2UuZ2V0U3RhdHVzSW5mbygpLmdldFN0YXR1c0NvZGUoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIm15LXBocmFzZSIsIHJlc3BvbnNlLmdldFN0YXR1c0luZm8oKS5nZXRSZWFzb25QaHJhc2UoKSk7CisKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTg4My9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE4ODMvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWM4ZmMwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE4ODMvcG9tLnhtbApAQCAtMCwwICsxLDY1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LTE4ODM8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tamVyc2V5LTE4ODM8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+U2VydmxldCBpbnRlZ3JhdGlvbiB0ZXN0IC0gSkVSU0VZLTE4ODMgLSBAUG9zdENvbnN0cnVjdCBtZXRob2QgY2FsbGVkIHR3aWNlIG9uIEBTaW5nbGV0b248L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xODgzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTg4My9MaWZlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTg4My9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE4ODMvTGlmZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZWZmYTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTg4My9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE4ODMvTGlmZS5qYXZhCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MTg4MzsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUG9zdENvbnN0cnVjdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCisvKioKKyAqIEpBWC1SUyBhcHBsaWNhdGlvbiBtaXhlZCB3aXRoIHJlc291cmNlLgorICoKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BBcHBsaWNhdGlvblBhdGgoIi9yZXN0MyIpCitAUGF0aCgiL2xpZmUiKQorcHVibGljIGNsYXNzIExpZmUgZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgcG9zdENvbnN0cnVjdENvdW50ID0gMDsKKworICAgIEBQb3N0Q29uc3RydWN0CisgICAgcHVibGljIHZvaWQgcG9zdF9jb25zdHJ1Y3QoKSB7CisgICAgICAgIHBvc3RDb25zdHJ1Y3RDb3VudCsrOworICAgIH0KKworICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdyZWV0KCkgeworICAgICAgICByZXR1cm4gImhpICMiICsgcG9zdENvbnN0cnVjdENvdW50OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xODgzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTg4My9NeUFwcGxpY2F0aW9uLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTg4My9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE4ODMvTXlBcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NGE3YjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTg4My9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE4ODMvTXlBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MTg4MzsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKKy8qKgorICogRXhwbGljaXRseSByZWdpc3RlciB7QGNvZGUgQFNpbmdsZXRvbn0gcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uUGF0aCgiL3Jlc3QxIikKK3B1YmxpYyBjbGFzcyBNeUFwcGxpY2F0aW9uIGV4dGVuZHMgQXBwbGljYXRpb24geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbihOb0xpZmUuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xODgzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTg4My9Ob0xpZmUuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xODgzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTg4My9Ob0xpZmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTgyMjIzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE4ODMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxODgzL05vTGlmZS5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MTg4MzsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUG9zdENvbnN0cnVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKKy8qKgorICogRXhwbGljaXRseSByZWdpc3RlcmVkIHNpbmdsZXRvbiByZXNvdXJjZSBieSB7QGxpbmsgTXlBcHBsaWNhdGlvbn0uCisgKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworQFNpbmdsZXRvbgorQFBhdGgoIi9uby1saWZlIikKK3B1YmxpYyBjbGFzcyBOb0xpZmUgZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgcG9zdENvbnN0cnVjdENvdW50ID0gMDsKKworICAgIEBQb3N0Q29uc3RydWN0CisgICAgcHVibGljIHZvaWQgcG9zdF9jb25zdHJ1Y3QoKSB7CisgICAgICAgIHBvc3RDb25zdHJ1Y3RDb3VudCsrOworICAgIH0KKworICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdyZWV0KCkgeworICAgICAgICByZXR1cm4gImNpYW8gIyIgKyBwb3N0Q29uc3RydWN0Q291bnQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE4ODMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxODgzL1NpbmdsZXRvbkxpZmUuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xODgzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTg4My9TaW5nbGV0b25MaWZlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZhZTgwYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xODgzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTg4My9TaW5nbGV0b25MaWZlLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkxODgzOworCitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qb3N0Q29uc3RydWN0OworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKKy8qKgorICogSkFYLVJTIGFwcGxpY2F0aW9uIG1peGVkIHdpdGggcmVzb3VyY2UgLSBzaW5nbGV0b24gY2xhc3MuCisgKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworQFNpbmdsZXRvbgorQEFwcGxpY2F0aW9uUGF0aCgiL3Jlc3QyIikKK0BQYXRoKCIvc2luZ2xldG9uLWxpZmUiKQorcHVibGljIGNsYXNzIFNpbmdsZXRvbkxpZmUgZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBpbnQgcG9zdENvbnN0cnVjdENvdW50ID0gMDsKKworICAgIEBQb3N0Q29uc3RydWN0CisgICAgcHVibGljIHZvaWQgcG9zdF9jb25zdHJ1Y3QoKSB7CisgICAgICAgIHBvc3RDb25zdHJ1Y3RDb3VudCsrOworICAgIH0KKworICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdyZWV0KCkgeworICAgICAgICByZXR1cm4gImhlbGxvICMiICsgcG9zdENvbnN0cnVjdENvdW50OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xODgzL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTg4My9KZXJzZXkxODgzSVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTg4My9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE4ODMvSmVyc2V5MTg4M0lUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyZmIzMDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTg4My9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE4ODMvSmVyc2V5MTg4M0lUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTE4ODM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0LmhrMi5IazJJbmplY3Rpb25NYW5hZ2VyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzdW1lOworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSmVyc2V5MTg4M0lUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldHVwKCkgeworICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZShIazJJbmplY3Rpb25NYW5hZ2VyRmFjdG9yeS5pc0ltbWVkaWF0ZVN0cmF0ZWd5KCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5EVU1QX0VOVElUWSk7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldFJlc3ROb0xpZmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoInJlc3QxIikucGF0aCgibm8tbGlmZSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGVxdWFsVG8oImNpYW8gIzEiKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQoInJlc3QxIikucGF0aCgibm8tbGlmZSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGVxdWFsVG8oImNpYW8gIzEiKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQoInJlc3QxIikucGF0aCgibm8tbGlmZSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGVxdWFsVG8oImNpYW8gIzEiKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQoInJlc3QxIikucGF0aCgibm8tbGlmZSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGVxdWFsVG8oImNpYW8gIzEiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0UmVzdFNpbmdsZXRvbkxpZmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoInJlc3QyIikucGF0aCgic2luZ2xldG9uLWxpZmUiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKCJoZWxsbyAjMSIpKTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldCgicmVzdDIiKS5wYXRoKCJzaW5nbGV0b24tbGlmZSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGVxdWFsVG8oImhlbGxvICMxIikpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCJyZXN0MiIpLnBhdGgoInNpbmdsZXRvbi1saWZlIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbygiaGVsbG8gIzEiKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQoInJlc3QyIikucGF0aCgic2luZ2xldG9uLWxpZmUiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKCJoZWxsbyAjMSIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRSZXN0TGlmZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgicmVzdDMiKS5wYXRoKCJsaWZlIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbygiaGkgIzIiKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQoInJlc3QzIikucGF0aCgibGlmZSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGVxdWFsVG8oImhpICMzIikpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCJyZXN0MyIpLnBhdGgoImxpZmUiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKCJoaSAjNCIpKTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldCgicmVzdDMiKS5wYXRoKCJsaWZlIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbygiaGkgIzUiKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTkyOC9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE5MjgvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmJjNzc4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE5MjgvcG9tLnhtbApAQCAtMCwwICsxLDY1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorICAgIDxwYXJlbnQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktMTkyODwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1qZXJzZXktMTkyODwvbmFtZT4KKyAgICA8dXJsPmh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnPC91cmw+CisKKworICAgIDxkZXNjcmlwdGlvbj5TZXJ2bGV0IGludGVncmF0aW9uIHRlc3QgLSBKRVJTRVktMTkyOCAtIE9kZCBiZWhhdmlvdXIgd2l0aCBlbXB0eSAicGF0aCBpbmZvIjwvZGVzY3JpcHRpb24+CisKKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE5Mjgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxOTI4L0plcnNleTE5MjguamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xOTI4L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTkyOC9KZXJzZXkxOTI4LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRlMjE1OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xOTI4L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTkyOC9KZXJzZXkxOTI4LmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkxOTI4OworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BBcHBsaWNhdGlvblBhdGgoIi9qZXJzZXkxOTI4IikKK3B1YmxpYyBjbGFzcyBKZXJzZXkxOTI4IGV4dGVuZHMgQXBwbGljYXRpb24geworCisgICAgQFBhdGgoIi8iKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBsaXN0KCkgeworICAgICAgICAgICAgcmV0dXJuICJsaXN0IjsKKyAgICAgICAgfQorCisgICAgICAgIEBHRVQKKyAgICAgICAgQFBhdGgoIntpZH0iKQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldChAUGF0aFBhcmFtKCJpZCIpIGZpbmFsIFN0cmluZyBpZCkgeworICAgICAgICAgICAgcmV0dXJuIGlkOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLjxDbGFzczw/Pj5zaW5nbGV0b24oUmVzb3VyY2UuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xOTI4L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTkyOC9KZXJzZXkxOTI4SVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTkyOC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE5MjgvSmVyc2V5MTkyOElUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYTc5N2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTkyOC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE5MjgvSmVyc2V5MTkyOElUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MTkyODsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBUZXN0cyBKRVJTRVkgaXNzdWUgMTkyOC4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEplcnNleTE5MjhJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEplcnNleTE5MjhMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJqZXJzZXkxOTI4IikucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKCJsaXN0IikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEplcnNleTE5MjhJZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiamVyc2V5MTkyOCIpLnBhdGgoImlkIikucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKCJpZCIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTk2MC9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE5NjAvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGU5NmNiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE5NjAvcG9tLnhtbApAQCAtMCwwICsxLDcyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LTE5NjA8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tamVyc2V5LTE5NjA8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+U2VydmxldCBpbnRlZ3JhdGlvbiB0ZXN0IC0gSkVSU0VZLTE5NjAgLSBTZXJ2bGV0IGFydGlmYWN0IGluamVjdGlvbiBpbnRvIHNpbmdsZXRvbiBwcm92aWRlcnMuPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtzZXJ2bGV0Mi52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTk2MC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE5NjAvRWNob1Jlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTk2MC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE5NjAvRWNob1Jlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EzYjFhOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xOTYwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTk2MC9FY2hvUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTE5NjA7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CisKKy8qKgorICogVGVzdCByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiZWNobyIpCitwdWJsaWMgY2xhc3MgRWNob1Jlc291cmNlIHsKKworICAgIEBQT1NUCisgICAgQENvbnN1bWVzKCJ0ZXh0L3BsYWluIikKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBTdHJpbmcgZWNobyhTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICByZXR1cm4gbWVzc2FnZSArICIuIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xOTYwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTk2MC9KZXJzZXkxOTYwQXBwLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTk2MC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE5NjAvSmVyc2V5MTk2MEFwcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhODdmMGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTk2MC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE5NjAvSmVyc2V5MTk2MEFwcC5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MTk2MDsKKworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOworCitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKKy8qKgorICogSkFYLVJTIGFwcGxpY2F0aW9uIGZvciB0aGUgSkVSU0VZLTE5NjAgcmVwcm9kdWNlciB0ZXN0LgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK0BBcHBsaWNhdGlvblBhdGgoImFwcGxpY2F0aW9uX3BhdGgiKQorcHVibGljIGNsYXNzIEplcnNleTE5NjBBcHAgZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisgICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICByZXR1cm4gU3RyZWFtLm9mKEVjaG9SZXNvdXJjZS5jbGFzcywgUmVxdWVzdEZpbHRlci5jbGFzcykuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xOTYwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTk2MC9SZXF1ZXN0RmlsdGVyLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTk2MC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE5NjAvUmVxdWVzdEZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZTZkMjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTk2MC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE5NjAvUmVxdWVzdEZpbHRlci5qYXZhCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MTk2MDsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuUHJlTWF0Y2hpbmc7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb25maWc7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5NZXNzYWdlVXRpbHM7CisKKy8qKgorICogRmlsdGVyIHRlc3RpbmcgaW5qZWN0aW9uIHN1cHBvcnQgZm9yIG9mIHNlcnZsZXQgYXJ0aWZhY3RzLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQcmVNYXRjaGluZworcHVibGljIGNsYXNzIFJlcXVlc3RGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVRVNUX05VTUJFUiA9ICJyZXF1ZXN0LW51bWJlciI7CisgICAgQENvbnRleHQKKyAgICBwcml2YXRlIEh0dHBTZXJ2bGV0UmVxdWVzdCBoc1JlcTsKKyAgICBAQ29udGV4dAorICAgIHByaXZhdGUgSHR0cFNlcnZsZXRSZXNwb25zZSBoc1Jlc3A7CisgICAgQENvbnRleHQKKyAgICBwcml2YXRlIFNlcnZsZXRDb250ZXh0IHNDdHg7CisgICAgQENvbnRleHQKKyAgICBwcml2YXRlIFNlcnZsZXRDb25maWcgc0NmZzsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZpbHRlcihmaW5hbCBDb250YWluZXJSZXF1ZXN0Q29udGV4dCBjdHgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisgICAgICAgIC8vIEZpcnN0LCBtYWtlIHN1cmUgdGhlcmUgYXJlIG5vIG51bGwgaW5qZWN0aW9ucy4KKyAgICAgICAgaWYgKGhzUmVxID09IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiSHR0cFNlcnZsZXRSZXF1ZXN0IGlzIG51bGwuXG4iKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaHNSZXNwID09IG51bGwpIHsKKyAgICAgICAgICAgIHNiLmFwcGVuZCgiSHR0cFNlcnZsZXRSZXNwb25zZSBpcyBudWxsLlxuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNDdHggPT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCJTZXJ2bGV0Q29udGV4dCBpcyBudWxsLlxuIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNDZmcgPT0gbnVsbCkgeworICAgICAgICAgICAgc2IuYXBwZW5kKCJTZXJ2bGV0Q29uZmlnIGlzIG51bGwuXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzYi5sZW5ndGgoKSA+IDApIHsKKyAgICAgICAgICAgIGN0eC5hYm9ydFdpdGgoUmVzcG9uc2Uuc2VydmVyRXJyb3IoKS5lbnRpdHkoc2IudG9TdHJpbmcoKSkuYnVpbGQoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBsZXQncyBhbHNvIHRlc3Qgc29tZSBtZXRob2QgY2FsbHMKKyAgICAgICAgaW50IGZsYWdzID0gMDsKKworICAgICAgICBpZiAoIi9qZXJzZXktMTk2MCIuZXF1YWxzKGhzUmVxLmdldFNlcnZsZXRQYXRoKCkpKSB7CisgICAgICAgICAgICBmbGFncyArPSAxOworICAgICAgICB9CisgICAgICAgIGlmICghaHNSZXNwLmlzQ29tbWl0dGVkKCkpIHsKKyAgICAgICAgICAgIGZsYWdzICs9IDEwOworICAgICAgICB9CisgICAgICAgIGlmICghc0N0eC5nZXRTZXJ2ZXJJbmZvKCkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBmbGFncyArPSAxMDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNDZmcuZ2V0U2VydmxldENvbnRleHQoKSA9PSBzQ3R4KSB7CisgICAgICAgICAgICBmbGFncyArPSAxMDAwOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFN0cmluZyBoZWFkZXIgPSBoc1JlcS5nZXRIZWFkZXIoUkVRVUVTVF9OVU1CRVIpOworCisgICAgICAgIGN0eC5zZXRFbnRpdHlTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKCgiZmlsdGVyZWQtIiArIGZsYWdzICsgIi0iICsgaGVhZGVyKS5nZXRCeXRlcygKKyAgICAgICAgICAgICAgICBNZXNzYWdlVXRpbHMuZ2V0Q2hhcnNldChjdHguZ2V0TWVkaWFUeXBlKCkpKSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xOTYwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTk2MC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiYTkwYzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTk2MC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi41IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI+CisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+amVyc2V5MTk2MFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LndzLnJzLkFwcGxpY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTE5NjAuSmVyc2V5MTk2MEFwcDwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+amVyc2V5MTk2MFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9qZXJzZXktMTk2MC8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xOTYwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTk2MC9KZXJzZXkxOTYwSVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTk2MC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE5NjAvSmVyc2V5MTk2MElUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhMDNlYWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTk2MC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE5NjAvSmVyc2V5MTk2MElUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MTk2MDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBSZXByb2R1Y2VyIHRlc3RzIGZvciBKRVJTRVktMTk2MC4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSmVyc2V5MTk2MElUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKZXJzZXkxOTYwQXBwKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByb2R1Y2VyIG1ldGhvZCBmb3IgSkVSU0VZLTE5NjAuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SmVyc2V5MTk2MEZpeCgpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgICAgICAgICBTdHJpbmcgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJqZXJzZXktMTk2MC9lY2hvIikucmVxdWVzdCgpLmhlYWRlcihSZXF1ZXN0RmlsdGVyLlJFUVVFU1RfTlVNQkVSLCBpKQorICAgICAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkudGV4dCgidGVzdCIpLCBTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgLy8gQXNzZXJ0IHRoYXQgdGhlIHJlcXVlc3QgaGFzIGJlZW4gZmlsdGVyZWQgYW5kIHByb2Nlc3NlZCBieSB0aGUgZWNobyBtZXRob2QuCisgICAgICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEVjaG9SZXNvdXJjZSgpLmVjaG8oImZpbHRlcmVkLTExMTEtIiArIGkpLCByZXNwb25zZSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTk2NC9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE5NjQvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjYxNWM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE5NjQvcG9tLnhtbApAQCAtMCwwICsxLDczIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LTE5NjQ8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tamVyc2V5LTE5NjQ8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+U2VydmxldCBpbnRlZ3JhdGlvbiB0ZXN0IC0gSkVSU0VZLTE5NjQgLSBOUEUgd2l0aCBKZXJzZXkgMSArIEphY2tzb24gMiBKQVgtUlMgSlNPTiBwcm92aWRlcjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLWpzb24tamFja3NvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZXRhaW5mLXNlcnZpY2VzPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xOTY0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTk2NC9Jc3N1ZTE5NjRSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE5NjQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxOTY0L0lzc3VlMTk2NFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM5ZmM1MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xOTY0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTk2NC9Jc3N1ZTE5NjRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MTk2NDsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLlBVVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCisvKioKKyAqIFRlc3QgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BQYXRoKCIvIikKK3B1YmxpYyBjbGFzcyBJc3N1ZTE5NjRSZXNvdXJjZSB7CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEpzb25TdHJpbmdXcmFwcGVyIHsKKworICAgICAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworICAgICAgICBwdWJsaWMgSnNvblN0cmluZ1dyYXBwZXIoKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgSnNvblN0cmluZ1dyYXBwZXIoZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCkgeworICAgICAgICAgICAgcmV0dXJuIHZhbHVlOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoZmluYWwgU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUFVUCisgICAgQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9qc29uIikKKyAgICBAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2pzb24iKQorICAgIHB1YmxpYyBKc29uU3RyaW5nV3JhcHBlciBwdXQoZmluYWwgSnNvblN0cmluZ1dyYXBwZXIgd3JhcHBlcikgeworICAgICAgICByZXR1cm4gd3JhcHBlcjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMTk2NC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTE5NjQvSmVyc2V5MTk2NC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE5NjQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxOTY0L0plcnNleTE5NjQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGQxYjZiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE5NjQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxOTY0L0plcnNleTE5NjQuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTE5NjQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKKy8qKgorICogSkFYLVJTIGFwcGxpY2F0aW9uIGZvciB0aGUgSkVSU0VZLTE5NjQgcmVwcm9kdWNlciB0ZXN0LgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgSmVyc2V5MTk2NCBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKworICAgIHB1YmxpYyBKZXJzZXkxOTY0KCkgeworICAgICAgICByZWdpc3RlcihJc3N1ZTE5NjRSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE5NjQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xOTY0L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzczNmY0OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xOTY0L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIyLjUiIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIj4KKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5qZXJzZXkxOTY0U2VydmxldDwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MTk2NC5KZXJzZXkxOTY0PC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5qZXJzZXkxOTY0U2VydmxldDwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTE5NjQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkxOTY0L0plcnNleTE5NjRJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xOTY0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTk2NC9KZXJzZXkxOTY0SVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMyOWZkNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0xOTY0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MTk2NC9KZXJzZXkxOTY0SVRDYXNlLmphdmEKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkxOTY0OworCitpbXBvcnQgamF2YS5uZXQuQ29ubmVjdEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICogUmVwcm9kdWNlciB0ZXN0cyBmb3IgSkVSU0VZLTE5NjQuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXkxOTY0SVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IEplcnNleTE5NjQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEphY2tzb24ySnNvblB1dCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5wdXQoRW50aXR5Lmpzb24obmV3IElzc3VlMTk2NFJlc291cmNlLkpzb25TdHJpbmdXcmFwcGVyKCJmb28iKSkpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShJc3N1ZTE5NjRSZXNvdXJjZS5Kc29uU3RyaW5nV3JhcHBlci5jbGFzcykuZ2V0VmFsdWUoKSwgZXF1YWxUbygiZm9vIikpOworICAgIH0KKworICAgIEBUZXN0KGV4cGVjdGVkID0gQ29ubmVjdEV4Y2VwdGlvbi5jbGFzcykKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SmFja3NvbjJKc29uR2V0SW52YWxpZEVuZHBvaW50KCkgdGhyb3dzIFRocm93YWJsZSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpCisgICAgICAgICAgICAgICAgICAgIC50YXJnZXQoImh0dHA6Ly9sb2NhbGhvc3Q6MTIzNCIpCisgICAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAgICAgLmdldCgpOworCisgICAgICAgICAgICBmYWlsKCJFbmQtcG9pbnQgc2hvdWxkbid0IGV4aXN0LiIpOworICAgICAgICB9IGNhdGNoIChmaW5hbCBQcm9jZXNzaW5nRXhjZXB0aW9uIHBlKSB7CisgICAgICAgICAgICB0aHJvdyBwZS5nZXRDYXVzZSgpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBDb25uZWN0RXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RKYWNrc29uMkpzb25QdXRJbnZhbGlkRW5kcG9pbnQoKSB0aHJvd3MgVGhyb3dhYmxlIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KCkKKyAgICAgICAgICAgICAgICAgICAgLnRhcmdldCgiaHR0cDovL2xvY2FsaG9zdDoxMjM0IikKKyAgICAgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgICAgICAucHV0KEVudGl0eS5qc29uKG5ldyBJc3N1ZTE5NjRSZXNvdXJjZS5Kc29uU3RyaW5nV3JhcHBlcigiZm9vIikpKTsKKworICAgICAgICAgICAgZmFpbCgiRW5kLXBvaW50IHNob3VsZG4ndCBleGlzdC4iKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgUHJvY2Vzc2luZ0V4Y2VwdGlvbiBwZSkgeworICAgICAgICAgICAgdGhyb3cgcGUuZ2V0Q2F1c2UoKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMDMxL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjAzMS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiMGVlYTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjAzMS9wb20ueG1sCkBAIC0wLDAgKzEsNzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktMjAzMTwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1qZXJzZXktMjAzMTwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5TZXJ2bGV0IGludGVncmF0aW9uIHRlc3QgLSBKRVJTRVktMjAzMSAtIGplcnNleSAyLjEgZXhwbGljaXQgdmlld2FibGUgcmVzb2x2aW5nQ2xhc3MgbWlzc2VkIHdoZW4gZG8gYSBqc3AgdGFnPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldC1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW12Yy1qc3A8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7c2VydmxldDIudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIwMzEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMDMxL0lzc3VlMjAzMVJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjAzMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIwMzEvSXNzdWUyMDMxUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTlmYTU5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIwMzEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMDMxL0lzc3VlMjAzMVJlc291cmNlLmphdmEKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyMDMxOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLlRlbXBsYXRlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuVmlld2FibGU7CisKKy8qKgorICogVGVzdCByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFBhdGgoIi8iKQorcHVibGljIGNsYXNzIElzc3VlMjAzMVJlc291cmNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1vZGVsIG1vZGVsOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBhYnNvbHV0ZVBhdGg7CisKKyAgICBzdGF0aWMgeworICAgICAgICBhYnNvbHV0ZVBhdGggPSAiLyIgKyBJc3N1ZTIwMzFSZXNvdXJjZS5jbGFzcy5nZXROYW1lKCkucmVwbGFjZUFsbCgiXFwuIiwgIi8iKS5yZXBsYWNlKCckJywgJy8nKSArICIvaW5kZXguanNwIjsKKyAgICAgICAgbW9kZWwgPSBuZXcgTW9kZWwoKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInZpZXdhYmxlLXJlbGF0aXZlIikKKyAgICBAUHJvZHVjZXMoInRleHQvaHRtbCIpCisgICAgcHVibGljIFZpZXdhYmxlIHZpZXdhYmxlUmVsYXRpdmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgVmlld2FibGUoImluZGV4IiwgbW9kZWwpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgidmlld2FibGUtYWJzb2x1dGUiKQorICAgIEBQcm9kdWNlcygidGV4dC9odG1sIikKKyAgICBwdWJsaWMgVmlld2FibGUgdmlld2FibGVBYnNvbHV0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBWaWV3YWJsZShhYnNvbHV0ZVBhdGgsIG1vZGVsKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInRlbXBsYXRlLXJlbGF0aXZlIikKKyAgICBAUHJvZHVjZXMoInRleHQvaHRtbCIpCisgICAgQFRlbXBsYXRlKG5hbWUgPSAiaW5kZXgiKQorICAgIHB1YmxpYyBNb2RlbCB0ZW1wbGF0ZVJlbGF0aXZlKCkgeworICAgICAgICByZXR1cm4gbW9kZWw7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJ0ZW1wbGF0ZS1hYnNvbHV0ZSIpCisgICAgQFByb2R1Y2VzKCJ0ZXh0L2h0bWwiKQorICAgIEBUZW1wbGF0ZSgKKyAgICAgICAgICAgIG5hbWUgPSAiL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIwMzEvSXNzdWUyMDMxUmVzb3VyY2UvaW5kZXguanNwIikKKyAgICBwdWJsaWMgTW9kZWwgdGVtcGxhdGVBYnNvbHV0ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1vZGVsOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTW9kZWwgeworCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGluZGV4ID0gImluZGV4IjsKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgaW5jbHVkZSA9ICJpbmNsdWRlIjsKKworICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEluZGV4KCkgeworICAgICAgICAgICAgcmV0dXJuIGluZGV4OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRJbmNsdWRlKCkgeworICAgICAgICAgICAgcmV0dXJuIGluY2x1ZGU7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjAzMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIwMzEvSmVyc2V5MjAzMS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIwMzEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMDMxL0plcnNleTIwMzEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzY3M2ViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIwMzEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMDMxL0plcnNleTIwMzEuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIwMzE7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5qc3AuSnNwTXZjRmVhdHVyZTsKKworLyoqCisgKiBKQVgtUlMgYXBwbGljYXRpb24gZm9yIHRoZSBKRVJTRVktMjAzMSByZXByb2R1Y2VyIHRlc3QuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXkyMDMxIGV4dGVuZHMgUmVzb3VyY2VDb25maWcgeworCisgICAgcHVibGljIEplcnNleTIwMzEoKSB7CisgICAgICAgIHJlZ2lzdGVyKElzc3VlMjAzMVJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgcmVnaXN0ZXIoSnNwTXZjRmVhdHVyZS5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIwMzEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMDMxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThmYzRlMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMDMxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwzNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIyLjUiIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIj4KKyAgICA8ZmlsdGVyPgorICAgICAgICA8ZmlsdGVyLW5hbWU+amVyc2V5MjAzMTwvZmlsdGVyLW5hbWU+CisgICAgICAgIDxmaWx0ZXItY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9maWx0ZXItY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjAzMS5KZXJzZXkyMDMxPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgIDwvZmlsdGVyPgorICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPmplcnNleTIwMzE8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjAzMS9zcmMvbWFpbi93ZWJhcHAvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjAzMS9Jc3N1ZTIwMzFSZXNvdXJjZS9pbmNsdWRlLmpzcCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMDMxL3NyYy9tYWluL3dlYmFwcC9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMDMxL0lzc3VlMjAzMVJlc291cmNlL2luY2x1ZGUuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjOTE0YzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjAzMS9zcmMvbWFpbi93ZWJhcHAvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjAzMS9Jc3N1ZTIwMzFSZXNvdXJjZS9pbmNsdWRlLmpzcApAQCAtMCwwICsxLDIyIEBACis8JS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLSU+CisKKzwlQHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbCIlPgorPCVAcGFnZSBwYWdlRW5jb2Rpbmc9IlVURi04IiU+CisKKyR7bW9kZWwuaW5jbHVkZX0KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMDMxL3NyYy9tYWluL3dlYmFwcC9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMDMxL0lzc3VlMjAzMVJlc291cmNlL2luZGV4LmpzcCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMDMxL3NyYy9tYWluL3dlYmFwcC9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMDMxL0lzc3VlMjAzMVJlc291cmNlL2luZGV4LmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYmViZWRiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIwMzEvc3JjL21haW4vd2ViYXBwL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIwMzEvSXNzdWUyMDMxUmVzb3VyY2UvaW5kZXguanNwCkBAIC0wLDAgKzEsMzkgQEAKKzwlLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tJT4KKworPCVAcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sIiU+Cis8JUBwYWdlIHBhZ2VFbmNvZGluZz0iVVRGLTgiJT4KKworPCVAdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc3AvanN0bC9jb3JlIiBwcmVmaXg9ImMiJT4KKzwlQHRhZ2xpYiBwcmVmaXg9InJidCIgdXJpPSJ1cm46b3JnOmdsYXNzZmlzaDpqZXJzZXk6c2VydmxldDptdmMiICU+CisKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorCis8aHRtbD4KKyAgICA8aGVhZD4KKyAgICAgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgorICAgICAgICA8dGl0bGU+Qm9vazwvdGl0bGU+CisgICAgPC9oZWFkPgorICAgIDxib2R5PgorCisgICAgJHttb2RlbC5pbmRleH0KKworICAgIDxyYnQ6aW5jbHVkZSBwYWdlPSJpbmNsdWRlLmpzcCIvPgorCisgICAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIwMzEvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMDMxL0plcnNleTIwMzFJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMDMxL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjAzMS9KZXJzZXkyMDMxSVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk0MTI5YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMDMxL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjAzMS9KZXJzZXkyMDMxSVRDYXNlLmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyMDMxOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuY29udGFpbnNTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBSZXByb2R1Y2VyIHRlc3RzIGZvciBKRVJTRVktMjE2NC4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEplcnNleTIwMzFJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgSmVyc2V5MjAzMSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGVtcGxhdGVSZWxhdGl2ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgidGVtcGxhdGUtcmVsYXRpdmUiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUZW1wbGF0ZUFic29sdXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KCJ0ZW1wbGF0ZS1hYnNvbHV0ZSIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZpZXdhYmxlUmVsYXRpdmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3QoInZpZXdhYmxlLXJlbGF0aXZlIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Vmlld2FibGVBYnNvbHV0ZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdCgidmlld2FibGUtYWJzb2x1dGUiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3QoZmluYWwgU3RyaW5nIHBhdGgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldChwYXRoKS5yZXF1ZXN0KCJ0ZXh0L2h0bWwiKS5nZXQoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHBhZ2UgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgZXF1YWxUbygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChwYWdlLCBjb250YWluc1N0cmluZygiaW5kZXgiKSk7CisgICAgICAgIGFzc2VydFRoYXQocGFnZSwgY29udGFpbnNTdHJpbmcoImluY2x1ZGUiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxMzYvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTM2L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU3OTdkYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTM2L3BvbS54bWwKQEAgLTAsMCArMSw5NiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmplcnNleS0yMTM2PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLWplcnNleS0yMTM2PC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPlNlcnZsZXQgaW50ZWdyYXRpb24gdGVzdCAtIEpFUlNFWS0yMTM2IC0gSmVyc2V5IDIgZG9lc24ndCB3b3JrIHdpdGggR29vZ2xlIEFwcGxpY2F0aW9uIEVuZ2luZTwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS5nb29nbGUuYXBwZW5naW5lPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+YXBwZW5naW5lLWFwaS0xLjAtc2RrPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtnYWUudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorCisgICAgICAgICAgICA8IS0tIFRPRE86IFRoZSB0ZXN0IHdhcyBza2lwcGVkLCBpbmNsdWRpbmcgdGhlIGhvb2tlZCBhcHAtZW5naW5lIHN0YXJ0ICYmIHN0b3AuIFRoZSBhcHAtZW5naW5lIHByb2Nlc3Mgd2FzIHNvbWV0aW1lcworICAgICAgICAgICAgbGVmdCBoYW5naW5nIGFmdGVyIHRoZSBlbmQgb2YgdGhlIGJ1aWxkIGFuZCBrZXB0IGJsb2NraW5nIHRoZSBwb3J0LiAtLT4KKworICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8IS0tPHBsdWdpbj4tLT4KKyAgICAgICAgICAgICAgICA8IS0tPGdyb3VwSWQ+Y29tLmdvb2dsZS5hcHBlbmdpbmU8L2dyb3VwSWQ+LS0+CisgICAgICAgICAgICAgICAgPCEtLTxhcnRpZmFjdElkPmFwcGVuZ2luZS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+LS0+CisgICAgICAgICAgICAgICAgPCEtLTx2ZXJzaW9uPiR7Z2FlLnZlcnNpb259PC92ZXJzaW9uPi0tPgorICAgICAgICAgICAgICAgIDwhLS08Y29uZmlndXJhdGlvbj4tLT4KKworICAgICAgICAgICAgICAgICAgICA8IS0tPHBvcnQ+JHtqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnR9PC9wb3J0Pi0tPgorICAgICAgICAgICAgICAgICAgICA8IS0tPG9mZmxpbmU+dHJ1ZTwvb2ZmbGluZT4tLT4KKyAgICAgICAgICAgICAgICA8IS0tPC9jb25maWd1cmF0aW9uPi0tPgorICAgICAgICAgICAgICAgIDwhLS08ZXhlY3V0aW9ucz4tLT4KKyAgICAgICAgICAgICAgICAgICAgPCEtLTxleGVjdXRpb24+LS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8IS0tPGlkPnN0YXJ0LWdhZTwvaWQ+LS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8IS0tPHBoYXNlPnByZS1pbnRlZ3JhdGlvbi10ZXN0PC9waGFzZT4tLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwhLS08Z29hbHM+LS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLTxnb2FsPmRldnNlcnZlcl9zdGFydDwvZ29hbD4tLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwhLS08L2dvYWxzPi0tPgorICAgICAgICAgICAgICAgICAgICA8IS0tPC9leGVjdXRpb24+LS0+CisgICAgICAgICAgICAgICAgICAgIDwhLS08ZXhlY3V0aW9uPi0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPCEtLTxpZD5zdG9wLWdhZTwvaWQ+LS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8IS0tPHBoYXNlPnBvc3QtaW50ZWdyYXRpb24tdGVzdDwvcGhhc2U+LS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8IS0tPGdvYWxzPi0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS08Z29hbD5kZXZzZXJ2ZXJfc3RvcDwvZ29hbD4tLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwhLS08L2dvYWxzPi0tPgorICAgICAgICAgICAgICAgICAgICA8IS0tPC9leGVjdXRpb24+LS0+CisgICAgICAgICAgICAgICAgPCEtLTwvZXhlY3V0aW9ucz4tLT4KKyAgICAgICAgICAgIDwhLS08L3BsdWdpbj4tLT4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTM2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjEzNi9Jc3N1ZTIxMzZSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxMzYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTM2L0lzc3VlMjEzNlJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRlNTk1NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTM2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjEzNi9Jc3N1ZTIxMzZSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjEzNjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworCisvKioKKyAqIFRlc3QgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BQYXRoKCIvIikKK3B1YmxpYyBjbGFzcyBJc3N1ZTIxMzZSZXNvdXJjZSB7CisKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgIHJldHVybiAiSGVsbG8sIEdBRSEiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTM2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjEzNi9KZXJzZXkyMTM2LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjEzNi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxMzYvSmVyc2V5MjEzNi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZjYwNGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjEzNi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxMzYvSmVyc2V5MjEzNi5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjEzNjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworLyoqCisgKiBKQVgtUlMgYXBwbGljYXRpb24gZm9yIHRoZSBKRVJTRVktMjEzNiByZXByb2R1Y2VyIHRlc3QuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXkyMTM2IGV4dGVuZHMgUmVzb3VyY2VDb25maWcgeworCisgICAgcHVibGljIEplcnNleTIxMzYoKSB7CisgICAgICAgIHJlZ2lzdGVyKElzc3VlMjEzNlJlc291cmNlLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjEzNi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9hcHBlbmdpbmUtd2ViLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTM2L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2FwcGVuZ2luZS13ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMjkxYTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjEzNi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9hcHBlbmdpbmUtd2ViLnhtbApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxhcHBlbmdpbmUtd2ViLWFwcCB4bWxucz0iaHR0cDovL2FwcGVuZ2luZS5nb29nbGUuY29tL25zLzEuMCI+CisgICAgPGFwcGxpY2F0aW9uPmplcnNleTIxMzY8L2FwcGxpY2F0aW9uPgorICAgIDx2ZXJzaW9uPjE8L3ZlcnNpb24+CisgICAgPHRocmVhZHNhZmU+dHJ1ZTwvdGhyZWFkc2FmZT4KKzwvYXBwZW5naW5lLXdlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjEzNi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxMzYvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzY3MTU3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxMzYvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDM1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjIuNSIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI+CisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+amVyc2V5MjEzNlNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LndzLnJzLkFwcGxpY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIxMzYuSmVyc2V5MjEzNjwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+amVyc2V5MjEzNlNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTM2L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjEzNi9KZXJzZXkyMTM2SVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjEzNi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxMzYvSmVyc2V5MjEzNklUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxODY2NmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjEzNi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxMzYvSmVyc2V5MjEzNklUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjEzNjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBSZXByb2R1Y2VyIHRlc3RzIGZvciBKRVJTRVktMjE2NC4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEplcnNleTIxMzZJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgSmVyc2V5MjEzNigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgLy8gVGhpcyB0ZXN0IHJlcXVpcmVzIGFwcCBlbmdpbmUgdG8gYmUgbGF1bmNoZWQgYnkgYSBtYXZlbiBwbHVnaW4sCisgICAgLy8gd2hpY2ggd2FzIGNhdXNpbmcgaW50ZXJtaXR0ZW50IHByb2JsZW1zIHdpdGggaGFuZ2luZyBhcHAgZW5naW5lIHByb2Nlc3MuCisgICAgLy8gQWZ0ZXIgdW4taWdub3JpbmcgdGhpcyB0ZXN0LCBtYWtlIHN1cmUgdG8gdW5jb21tZW50IHRoZSBhcHAgZW5naW5lIHBsdWdpbgorICAgIC8vIGV4ZWN1dGlvbiBpbiB0aGUgcHJvamVjdCdzIHBvbS54bWwKKyAgICBASWdub3JlCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKCJIZWxsbywgR0FFISIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjEzNy9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxMzcvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWI0OGM1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxMzcvcG9tLnhtbApAQCAtMCwwICsxLDg3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmplcnNleS0yMTM3PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLWplcnNleS0yMTM3PC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPkplcnNleSBDREkvSlRBIHRlc3Qgd2ViIGFwcGxpY2F0aW9uLCBKRVJTRVktMjEzNyByZXByb2R1Y2VyPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgud3MucnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC53cy5ycy1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguYW5ub3RhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LmFubm90YXRpb24tYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVudGVycHJpc2U8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jZGktYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnRyYW5zYWN0aW9uPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXgudHJhbnNhY3Rpb24tYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnBlcnNpc3RlbmNlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGVyc2lzdGVuY2UtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1idW5kbGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dHlwZT5wb208L3R5cGU+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKyAgICA8YnVpbGQ+CisgICAgICAgIDxmaW5hbE5hbWU+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9maW5hbE5hbWU+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxza2lwVGVzdHM+JHtza2lwVGVzdHN9PC9za2lwVGVzdHM+CisgICAgICAgICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk+JHt0ZXN0Q29udGFpbmVyRmFjdG9yeX08L2plcnNleS5jb25maWcudGVzdC5jb250YWluZXIuZmFjdG9yeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+JHt0ZXN0Q29udGFpbmVyUG9ydH08L2plcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydD4KKyAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxza2lwVGVzdHM+dHJ1ZTwvc2tpcFRlc3RzPgorICAgICAgICA8dGVzdENvbnRhaW5lckZhY3Rvcnk+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5PC90ZXN0Q29udGFpbmVyRmFjdG9yeT4KKyAgICAgICAgPHRlc3RDb250YWluZXJQb3J0PjgwODA8L3Rlc3RDb250YWluZXJQb3J0PgorICAgIDwvcHJvcGVydGllcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTM3L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjEzNy9BY2NvdW50LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjEzNy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxMzcvQWNjb3VudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNDE0YjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjEzNy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxMzcvQWNjb3VudC5qYXZhCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIxMzc7CisKK2ltcG9ydCBqYXZhLmlvLlNlcmlhbGl6YWJsZTsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHk7CitpbXBvcnQgamF2YXgucGVyc2lzdGVuY2UuSWQ7CisKKy8qKgorICogRW50aXR5IGJlYW4gdGhhdCBtYWludGFpbnMgaW5mb3JtYXRpb24gb24gYWNjb3VudCBiYWxhbmNlLgorICogVGhpcyBpcyB0byBoZWxwIGRldGVybWluZSBpZiByb2xsYmFjayBoYXBwZW5zIG9yIG5vdCwgd2hlbgorICogZW50aXR5IGJlYW4gaXMgYWNjZXNzZWQgZnJvbSBhIHRyYW5zYWN0aW9uYWwgQ0RJIGJlYW5zLgorICogRW50aXR5IGJlYW5zIGhhdmUgaW1wbGljaXQgSlRBIHN1cHBvcnQsIHNvIHRoaXMgd2lsbAorICogc2F2ZSB1cyBzb21lIGxpbmVzIG9mIGNvZGUuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQEVudGl0eQorcHVibGljIGNsYXNzIEFjY291bnQgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7CisKKyAgICBASWQKKyAgICBwcml2YXRlIExvbmcgaWQ7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGFjY291bnQgaWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGFjY291bnQgaWQuCisgICAgICovCisgICAgcHVibGljIExvbmcgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiBpZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGFjY291bnQgaWQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaWQgYWNjb3VudCBpZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRJZChMb25nIGlkKSB7CisgICAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICB9CisKKyAgICBwcml2YXRlIGxvbmcgYmFsYW5jZTsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgdmFsdWUgb2YgYmFsYW5jZQorICAgICAqCisgICAgICogQHJldHVybiB0aGUgdmFsdWUgb2YgYmFsYW5jZQorICAgICAqLworICAgIHB1YmxpYyBsb25nIGdldEJhbGFuY2UoKSB7CisgICAgICAgIHJldHVybiBiYWxhbmNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgdmFsdWUgb2YgYmFsYW5jZQorICAgICAqCisgICAgICogQHBhcmFtIGJhbGFuY2UgbmV3IHZhbHVlIG9mIGJhbGFuY2UKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXRCYWxhbmNlKGxvbmcgYmFsYW5jZSkgeworICAgICAgICB0aGlzLmJhbGFuY2UgPSBiYWxhbmNlOworICAgIH0KKworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGhhc2ggPSAwOworICAgICAgICBoYXNoICs9IChpZCAhPSBudWxsID8gaWQuaGFzaENvZGUoKSA6IDApOworICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iamVjdCkgeworICAgICAgICBpZiAoIShvYmplY3QgaW5zdGFuY2VvZiBBY2NvdW50KSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIEFjY291bnQgb3RoZXIgPSAoQWNjb3VudCkgb2JqZWN0OworICAgICAgICBpZiAoKHRoaXMuaWQgPT0gbnVsbCAmJiBvdGhlci5pZCAhPSBudWxsKSB8fCAodGhpcy5pZCAhPSBudWxsICYmICF0aGlzLmlkLmVxdWFscyhvdGhlci5pZCkpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyMTM3LkFjY291bnRbIGlkPSIgKyBpZCArICIgXSI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxMzcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTM3L0NkaVRyYW5zYWN0aW9uYWxOb1JvbGxiYWNrUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTM3L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjEzNy9DZGlUcmFuc2FjdGlvbmFsTm9Sb2xsYmFja1Jlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NlNTliMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTM3L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjEzNy9DZGlUcmFuc2FjdGlvbmFsTm9Sb2xsYmFja1Jlc291cmNlLmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyMTM3OworCitpbXBvcnQgamF2YXgud3MucnMuUFVUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuUmVxdWVzdFNjb3BlZDsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHlNYW5hZ2VyOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsOworCisvKioKKyAqIFJlcXVlc3Qgc2NvcGVkIHRyYW5zYWN0aW9uYWwgQ0RJIGJlYW4gcmVnaXN0ZXJlZCBhcyBKQVgtUlMgcmVzb3VyY2UgY2xhc3MuCisgKiBQYXJ0IG9mIEpFUlNFWS0yMTM3IHJlcHJvZHVjZXIuIHtAbGluayBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbn0KKyAqIHRocm93biBpbiB0aGUgcmVzb3VyY2UgbWV0aG9kIGJlbG93IHNob3VsZCBkcml2ZSB0aGUgcmVzcG9uc2UgYXMgc3BlY2lmaWVkCisgKiBpbiB0aGUgSkFYLVJTIHNwZWMgcmVnYXJkbGVzcworICogb24gdGhlIHtAbGluayBqYXZheC50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsI2RvbnRSb2xsYmFja09uKCl9IHZhbHVlLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSZXF1ZXN0U2NvcGVkCitAVHJhbnNhY3Rpb25hbChkb250Um9sbGJhY2tPbiA9IFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uLmNsYXNzKQorQFBhdGgoImNkaS10cmFuc2FjdGlvbmFsLW5vLXJvbGxiYWNrIikKK3B1YmxpYyBjbGFzcyBDZGlUcmFuc2FjdGlvbmFsTm9Sb2xsYmFja1Jlc291cmNlIHsKKworICAgIEBQZXJzaXN0ZW5jZUNvbnRleHQodW5pdE5hbWUgPSAiSmVyc2V5MjEzN1BVIikKKyAgICBwcml2YXRlIEVudGl0eU1hbmFnZXIgZW50aXR5TWFuYWdlcjsKKworICAgIEBQYXRoKCJ7YX0iKQorICAgIEBQVVQKKyAgICBwdWJsaWMgdm9pZCBwdXRCYWxhbmNlKEBQYXRoUGFyYW0oImEiKSBsb25nIGEsIFN0cmluZyBiYWxhbmNlKSB7CisgICAgICAgIGZpbmFsIEFjY291bnQgYWNjb3VudCA9IGVudGl0eU1hbmFnZXIuZmluZChBY2NvdW50LmNsYXNzLCBhKTsKKyAgICAgICAgaWYgKGFjY291bnQgPT0gbnVsbCkgeworICAgICAgICAgICAgQWNjb3VudCBuZXdBY2NvdW50ID0gbmV3IEFjY291bnQoKTsKKyAgICAgICAgICAgIG5ld0FjY291bnQuc2V0SWQoYSk7CisgICAgICAgICAgICBuZXdBY2NvdW50LnNldEJhbGFuY2UoTG9uZy5kZWNvZGUoYmFsYW5jZSkpOworICAgICAgICAgICAgZW50aXR5TWFuYWdlci5wZXJzaXN0KG5ld0FjY291bnQpOworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKFJlc3BvbnNlLm9rKCJOZXcgYWNjb3V0IGNyZWF0ZWQuIikuYnVpbGQoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhY2NvdW50LnNldEJhbGFuY2UoTG9uZy5kZWNvZGUoYmFsYW5jZSkpOworICAgICAgICAgICAgZW50aXR5TWFuYWdlci5tZXJnZShhY2NvdW50KTsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbihSZXNwb25zZS5vaygiQmFsYW5jZSB1cGRhdGVkLiIpLmJ1aWxkKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxMzcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTM3L0NkaVRyYW5zYWN0aW9uYWxSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxMzcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTM3L0NkaVRyYW5zYWN0aW9uYWxSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMzJhOTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjEzNy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxMzcvQ2RpVHJhbnNhY3Rpb25hbFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjEzNzsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBVVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC5lbnRlcnByaXNlLmNvbnRleHQuUmVxdWVzdFNjb3BlZDsKK2ltcG9ydCBqYXZheC5wZXJzaXN0ZW5jZS5FbnRpdHlNYW5hZ2VyOworaW1wb3J0IGphdmF4LnBlcnNpc3RlbmNlLlBlcnNpc3RlbmNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsOworCisvKioKKyAqIFJlcXVlc3Qgc2NvcGVkIHRyYW5zYWN0aW9uYWwgQ0RJIGJlYW4gcmVnaXN0ZXJlZCBhcyBKQVgtUlMgcmVzb3VyY2UgY2xhc3MuCisgKiBQYXJ0IG9mIEpFUlNFWS0yMTM3IHJlcHJvZHVjZXIuIHtAbGluayBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbn0KKyAqIHRocm93biBpbiB0aGUgcmVzb3VyY2UgbWV0aG9kIGJlbG93IHNob3VsZCBkcml2ZSB0aGUgcmVzcG9uc2UgYXMgc3BlY2lmaWVkCisgKiBpbiB0aGUgSkFYLVJTIHNwZWMuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJlcXVlc3RTY29wZWQKK0BUcmFuc2FjdGlvbmFsCitAUGF0aCgiY2RpLXRyYW5zYWN0aW9uYWwiKQorcHVibGljIGNsYXNzIENkaVRyYW5zYWN0aW9uYWxSZXNvdXJjZSB7CisKKyAgICBAUGVyc2lzdGVuY2VDb250ZXh0KHVuaXROYW1lID0gIkplcnNleTIxMzdQVSIpCisgICAgcHJpdmF0ZSBFbnRpdHlNYW5hZ2VyIGVudGl0eU1hbmFnZXI7CisKKyAgICBAUGF0aCgie2F9IikKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBnZXRCYWxhbmNlKEBQYXRoUGFyYW0oImEiKSBsb25nIGEpIHsKKyAgICAgICAgZmluYWwgQWNjb3VudCBhY2NvdW50ID0gZW50aXR5TWFuYWdlci5maW5kKEFjY291bnQuY2xhc3MsIGEpOworICAgICAgICBpZiAoYWNjb3VudCA9PSBudWxsKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViQXBwbGljYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlLnN0YXR1cyhSZXNwb25zZS5TdGF0dXMuQkFEX1JFUVVFU1QpLmVudGl0eShTdHJpbmcuZm9ybWF0KCJBY2NvdW50ICVkIG5vdCBmb3VuZCIsIGEpKS5idWlsZCgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCIlZCIsIGFjY291bnQuZ2V0QmFsYW5jZSgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBQYXRoKCJ7YX0iKQorICAgIEBQVVQKKyAgICBwdWJsaWMgdm9pZCBwdXRCYWxhbmNlKEBQYXRoUGFyYW0oImEiKSBsb25nIGEsIFN0cmluZyBiYWxhbmNlKSB7CisgICAgICAgIGZpbmFsIEFjY291bnQgYWNjb3VudCA9IGVudGl0eU1hbmFnZXIuZmluZChBY2NvdW50LmNsYXNzLCBhKTsKKyAgICAgICAgaWYgKGFjY291bnQgPT0gbnVsbCkgeworICAgICAgICAgICAgQWNjb3VudCBuZXdBY2NvdW50ID0gbmV3IEFjY291bnQoKTsKKyAgICAgICAgICAgIG5ld0FjY291bnQuc2V0SWQoYSk7CisgICAgICAgICAgICBuZXdBY2NvdW50LnNldEJhbGFuY2UoTG9uZy5kZWNvZGUoYmFsYW5jZSkpOworICAgICAgICAgICAgZW50aXR5TWFuYWdlci5wZXJzaXN0KG5ld0FjY291bnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWNjb3VudC5zZXRCYWxhbmNlKExvbmcuZGVjb2RlKGJhbGFuY2UpKTsKKyAgICAgICAgICAgIGVudGl0eU1hbmFnZXIubWVyZ2UoYWNjb3VudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUE9TVAorICAgIHB1YmxpYyBTdHJpbmcgdHJhbnNmZXJNb25leShAUXVlcnlQYXJhbSgiZnJvbSIpIGxvbmcgZnJvbSwgQFF1ZXJ5UGFyYW0oInRvIikgbG9uZyB0bywgU3RyaW5nIGFtb3VudCkgeworCisgICAgICAgIGZpbmFsIEFjY291bnQgdG9BY2NvdW50ID0gZW50aXR5TWFuYWdlci5maW5kKEFjY291bnQuY2xhc3MsIHRvKTsKKworICAgICAgICBpZiAodG9BY2NvdW50ICE9IG51bGwpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgdG9BY2NvdW50LnNldEJhbGFuY2UodG9BY2NvdW50LmdldEJhbGFuY2UoKSArIExvbmcuZGVjb2RlKGFtb3VudCkpOworICAgICAgICAgICAgICAgIGVudGl0eU1hbmFnZXIubWVyZ2UodG9BY2NvdW50KTsKKyAgICAgICAgICAgICAgICBmaW5hbCBBY2NvdW50IGZyb21BY2NvdW50ID0gZW50aXR5TWFuYWdlci5maW5kKEFjY291bnQuY2xhc3MsIGZyb20pOworICAgICAgICAgICAgICAgIGZyb21BY2NvdW50LnNldEJhbGFuY2UoZnJvbUFjY291bnQuZ2V0QmFsYW5jZSgpIC0gTG9uZy5kZWNvZGUoYW1vdW50KSk7CisgICAgICAgICAgICAgICAgaWYgKGZyb21BY2NvdW50LmdldEJhbGFuY2UoKSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKFJlc3BvbnNlLnN0YXR1cyhSZXNwb25zZS5TdGF0dXMuQkFEX1JFUVVFU1QpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmVudGl0eSgiVHJhbnNhY3Rpb24gZmFpbGVkLiBOb3QgZW5vdWdoIG1vbmV5IG9uIHRoZSBmdW5kaW5nIGFjY291bnQuIikuYnVpbGQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVudGl0eU1hbmFnZXIubWVyZ2UoZnJvbUFjY291bnQpOworICAgICAgICAgICAgICAgIHJldHVybiAiVHJhbnNhY3Rpb24gc3VjZXNzZnVsLiI7CisgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgV2ViQXBwbGljYXRpb25FeGNlcHRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyb3cgKFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKSBlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXNwb25zZS5zdGF0dXMoUmVzcG9uc2UuU3RhdHVzLkJBRF9SRVFVRVNUKS5lbnRpdHkoIlNvbWV0aGluZyBiYWQgaGFwcGVuZWQuIikuYnVpbGQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyb3cgbmV3IFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBSZXNwb25zZS5zdGF0dXMoUmVzcG9uc2UuU3RhdHVzLkJBRF9SRVFVRVNUKS5lbnRpdHkoIlRhcmdldCBhY2NvdW50IG5vdCBmb3VuZC4iKS5idWlsZCgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTM3L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjEzNy9UZXN0QXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTM3L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjEzNy9UZXN0QXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTNmNmQwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxMzcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTM3L1Rlc3RBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjEzNzsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworLyoqCisgKiBKQVgtUlMgYXBwbGljYXRpb24gdG8gY29uZmlndXJlIHJlc291cmNlcyBmb3IgSkVSU0VZLTIxMzcgcmVwcm9kdWNlci4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAQXBwbGljYXRpb25QYXRoKCIvKiIpCitwdWJsaWMgY2xhc3MgVGVzdEFwcGxpY2F0aW9uIGV4dGVuZHMgQXBwbGljYXRpb24geworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgIGZpbmFsIFNldDxDbGFzczw/Pj4gY2xhc3NlcyA9IG5ldyBIYXNoU2V0PENsYXNzPD8+PigpOworICAgICAgICBjbGFzc2VzLmFkZChDZGlUcmFuc2FjdGlvbmFsUmVzb3VyY2UuY2xhc3MpOworICAgICAgICBjbGFzc2VzLmFkZChDZGlUcmFuc2FjdGlvbmFsTm9Sb2xsYmFja1Jlc291cmNlLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIGNsYXNzZXM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxMzcvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvYmVhbnMueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxMzcvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvYmVhbnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZGYzNjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjEzNy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9iZWFucy54bWwKQEAgLTAsMCArMSwyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8YmVhbnMvPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxMzcvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTM3L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2MxODM3MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTM3L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwyNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgoreG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzNfMC54c2QiCisgICAgICB2ZXJzaW9uPSIzLjAiPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxMzcvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2VibG9naWMueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxMzcvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2VibG9naWMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMmE5ZWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjEzNy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWJsb2dpYy54bWwKQEAgLTAsMCArMSwyOSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2xzOndlYmxvZ2ljLXdlYi1hcHAgeG1sbnM6d2xzPSJodHRwOi8veG1sbnMub3JhY2xlLmNvbS93ZWJsb2dpYy93ZWJsb2dpYy13ZWItYXBwIgorICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly94bWxucy5vcmFjbGUuY29tL3dlYmxvZ2ljL3dlYmxvZ2ljLXdlYi1hcHAgaHR0cDovL3htbG5zLm9yYWNsZS5jb20vd2VibG9naWMvd2VibG9naWMtd2ViLWFwcC8xLjAvd2VibG9naWMtd2ViLWFwcC54c2QiPgorCisgICAgPHdsczpsaWJyYXJ5LXJlZj4KKyAgICAgICAgPHdsczpsaWJyYXJ5LW5hbWU+amF4LXJzPC93bHM6bGlicmFyeS1uYW1lPgorICAgICAgICA8d2xzOnNwZWNpZmljYXRpb24tdmVyc2lvbj4yLjA8L3dsczpzcGVjaWZpY2F0aW9uLXZlcnNpb24+CisgICAgICAgIDx3bHM6ZXhhY3QtbWF0Y2g+dHJ1ZTwvd2xzOmV4YWN0LW1hdGNoPgorICAgIDwvd2xzOmxpYnJhcnktcmVmPgorPC93bHM6d2VibG9naWMtd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTM3L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjEzNy9XYWVFeGNlcHRpb25NYXBwaW5nVGVzdC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxMzcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTM3L1dhZUV4Y2VwdGlvbk1hcHBpbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzcyMmI5MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTM3L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjEzNy9XYWVFeGNlcHRpb25NYXBwaW5nVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIxMzc7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKKworLyoqCisgKiBSZXByb2R1Y2VyIGZvciBKRVJTRVktMjEzNy4KKyAqIEVuc3VyZSB0aGF0IGdlbmVyYXRlZCB7QGxpbmsgV2ViQXBwbGljYXRpb25FeGNlcHRpb259IGlzIHByb3BhZ2F0ZWQKKyAqIHZpYSB0cmFuc2FjdGlvbmFsIENESSBjYWxsIGFuZCBtYXBwZWQgdG8gcmVzcG9uc2UgYWNjb3JkaW5nIHRvIEpBWC1SUyBzcGVjLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBXYWVFeGNlcHRpb25NYXBwaW5nVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0QXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVVJJIGdldEJhc2VVcmkoKSB7CisgICAgICAgIHJldHVybiBVcmlCdWlsZGVyLmZyb21Vcmkoc3VwZXIuZ2V0QmFzZVVyaSgpKS5wYXRoKCJqZXJzZXktMjEzNyIpLmJ1aWxkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBhbGwge0BqYXZheC50cmFuc2FjdGlvbi5UcmFuc2FjdGlvbmFsfQorICAgICAqIGFubm90YXRlZCBDREkgYmVhbnMuIFRoZSB0ZXN0IHNjZW5hcmlvIGlzIGFzIGZvbGxvd3MuCisgICAgICogU2V0IHR3byBhY2NvdW50cyB2aWEgdGhlIENESSBiZWFuIHRoYXQgYXZvaWRzIHJvbGxiYWNrLgorICAgICAqIFNob3VsZCBhbnkgcm9sbGJhY2sgaGFwcGVuIHRoZXJlLCB3ZSB3b3VsZCBub3QgYmUgYWJsZQorICAgICAqIHRvIHN0b3JlIGFueSBkYXRhIGluIEpQQS4gTmV4dCB0cnkgdG8gbWFrZSB0d28gdHJhbnNhY3Rpb25zLAorICAgICAqIGZpcnN0IG9mIHRoZW0gc2hvdWxkIGJlIGZpbmlzaGVkIHdpdGhvdXQgZXJyb3JzLAorICAgICAqIGR1cmluZyB0aGUgb3RoZXIgb25lLCBhIHJvbGxiYWNrIGlzIGV4cGVjdGVkLgorICAgICAqIFRoZSByb2xsYmFjayBzaG91bGQgYXZvaWQgcGFydGlhbCBkYXRhIHRvIGJlIHdyaXR0ZW4KKyAgICAgKiB0byB0aGUgZmlyc3QgYWNjb3VudC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFuc2FjdGlvbnMoKSB7CisKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IGNkaVJlc291cmNlID0gdGFyZ2V0KCkucGF0aCgiY2RpLXRyYW5zYWN0aW9uYWwiKTsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IGNkaVJlc291cmNlTm9Sb2xsYmFjayA9IHRhcmdldCgpLnBhdGgoImNkaS10cmFuc2FjdGlvbmFsLW5vLXJvbGxiYWNrIik7CisKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2U7CisgICAgICAgIFN0cmluZyByZXNwb25zZUJvZHk7CisKKyAgICAgICAgLy8gYWNjb3VudCAxMiAtPiBpbnNlcnQgMTAwMDoKKyAgICAgICAgcmVzcG9uc2UgPSBjZGlSZXNvdXJjZU5vUm9sbGJhY2sucGF0aCgiMTIiKS5yZXF1ZXN0KCkucHV0KEVudGl0eS50ZXh0KCIxMDAwIikpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDIwMCkpOworCisgICAgICAgIC8vIGFjY291bnQgMTMgLT4gaW5zZXJ0IDEwMDA6CisgICAgICAgIHJlc3BvbnNlID0gY2RpUmVzb3VyY2VOb1JvbGxiYWNrLnBhdGgoIjEzIikucmVxdWVzdCgpLnB1dChFbnRpdHkudGV4dCgiMTAwMCIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgZXF1YWxUbygyMDApKTsKKworICAgICAgICAvLyB0cmFuc2ZlciAxMDAwIGZyb20gMTMgdG8gMTI6CisgICAgICAgIHJlc3BvbnNlID0gY2RpUmVzb3VyY2UucXVlcnlQYXJhbSgiZnJvbSIsICIxMyIpLnF1ZXJ5UGFyYW0oInRvIiwgIjEyIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LnRleHQoIjEwMDAiKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oMjAwKSk7CisKKyAgICAgICAgLy8gZW5zdXJlIDEyIGhhcyBiYWxhbmNlIDIwMDA6CisgICAgICAgIHJlc3BvbnNlID0gY2RpUmVzb3VyY2UucGF0aCgiMTIiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oMjAwKSk7CisgICAgICAgIHJlc3BvbnNlQm9keSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZUJvZHksIGVxdWFsVG8oIjIwMDAiKSk7CisKKyAgICAgICAgLy8gdHJ5IHRvIHRyYW5zZmVyIDEwMDAgZnJvbSBub24tZXhpc3RpbmcgOCB0byAxMiwgdGhpcyB0aW1lIHRoZSB0cmFuc2FjdGlvbiBzaG91bGQgZmFpbDoKKyAgICAgICAgcmVzcG9uc2UgPSBjZGlSZXNvdXJjZS5xdWVyeVBhcmFtKCJmcm9tIiwgIjgiKS5xdWVyeVBhcmFtKCJ0byIsICIxMiIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS50ZXh0KCIxMDAwIikpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDQwMCkpOworCisgICAgICAgIC8vIGVuc3VyZSAxMiBiYWxhbmNlIGhhcyBub3QgY2hhbmdlZDoKKyAgICAgICAgcmVzcG9uc2UgPSBjZGlSZXNvdXJjZS5wYXRoKCIxMiIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgZXF1YWxUbygyMDApKTsKKyAgICAgICAgcmVzcG9uc2VCb2R5ID0gcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlQm9keSwgZXF1YWxUbygiMjAwMCIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE1NC9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNTQvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGMyOTBmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNTQvcG9tLnhtbApAQCAtMCwwICsxLDgyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmplcnNleS0yMTU0PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLWplcnNleS0yMTU0PC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPkplcnNleSBDREkvRUpCIHRlc3Qgd2ViIGFwcGxpY2F0aW9uLCBKRVJTRVktMjE1NCByZXByb2R1Y2VyPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgud3MucnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC53cy5ycy1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguYW5ub3RhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LmFubm90YXRpb24tYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVudGVycHJpc2U8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jZGktYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LmVqYjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LmVqYi1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1idW5kbGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dHlwZT5wb208L3R5cGU+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKyAgICA8YnVpbGQ+CisgICAgICAgIDxmaW5hbE5hbWU+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9maW5hbE5hbWU+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxza2lwVGVzdHM+JHtza2lwVGVzdHN9PC9za2lwVGVzdHM+CisgICAgICAgICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk+JHt0ZXN0Q29udGFpbmVyRmFjdG9yeX08L2plcnNleS5jb25maWcudGVzdC5jb250YWluZXIuZmFjdG9yeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+JHt0ZXN0Q29udGFpbmVyUG9ydH08L2plcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydD4KKyAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxza2lwVGVzdHM+dHJ1ZTwvc2tpcFRlc3RzPgorICAgICAgICA8dGVzdENvbnRhaW5lckZhY3Rvcnk+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5PC90ZXN0Q29udGFpbmVyRmFjdG9yeT4KKyAgICAgICAgPHRlc3RDb250YWluZXJQb3J0PjgwODA8L3Rlc3RDb250YWluZXJQb3J0PgorICAgIDwvcHJvcGVydGllcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTU0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE1NC9DZGlSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNTQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTU0L0NkaVJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUzOWZjNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTU0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE1NC9DZGlSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjE1NDsKKworaW1wb3J0IGphdmF4LmVqYi5FSkI7CitpbXBvcnQgamF2YXguZW50ZXJwcmlzZS5jb250ZXh0LlJlcXVlc3RTY29wZWQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworLyoqCisgKiBSZXF1ZXN0IHNjb3BlZCBDREkgYmVhbiBpbmplY3RlZCB3aXRoIEVKQiBiZWFuLgorICogUGFydCBvZiBKRVJTRVktMjE1NCByZXByb2R1Y2VyLiB7QGxpbmsgamF2YXguZWpiLkVKQkV4Y2VwdGlvbn0KKyAqIHRocm93biBpbiB0aGUgaW5qZWN0ZWQgRUpCIGJlYW4gc2hvdWxkIGdldCB1bndyYXBwZWQKKyAqIGV2ZW4gd2hlbiBubyBFSkItYmFja2VkIEpBWC1SUyByZXNvdXJjZXMgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJlcXVlc3RTY29wZWQKK0BQYXRoKCJjZGkiKQorcHVibGljIGNsYXNzIENkaVJlc291cmNlIHsKKworICAgIEBFSkIgRWpiQmVhbiBlamJCZWFuOworCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICByZXR1cm4gZWpiQmVhbi5leGNlcHRpb25Ecml2ZW5SZXNwb25zZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTU0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE1NC9FamJCZWFuLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE1NC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNTQvRWpiQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMTkyMjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE1NC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNTQvRWpiQmVhbi5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjE1NDsKKworaW1wb3J0IGphdmF4LmVqYi5FSkJFeGNlcHRpb247CitpbXBvcnQgamF2YXguZWpiLlN0YXRlbGVzczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCisvKioKKyAqIEVKQiBiZWFuIHRvIHJlcHJvZHVjZSBKRVJTRVktMjE1NC4gQmVsbG93IGdlbmVyYXRlZCB7QGxpbmsgV2ViQXBwbGljYXRpb25FeGNlcHRpb259CisgKiBzaG91bGQgZ2V0IG1hcHBlZCB0byByZXNwb25zZSBldmVuIHdoZW4gd3JhcHBlZCBpbnRvIGFuIHtAbGluayBFSkJFeGNlcHRpb259CisgKiBieSB0aGUgdW5kZXJseWluZyBFSkIgY29udGFpbmVyLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BTdGF0ZWxlc3MKK3B1YmxpYyBjbGFzcyBFamJCZWFuIHsKKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgdG8gbWFrZSBzdXJlIHRoZSBleGNlcHRpb24gdGhyb3duIGdldHMgd3JhcHBlZCB3aXRoIGFuIHtAbGluayBFSkJFeGNlcHRpb259LgorICAgICAqCisgICAgICogQHJldHVybiBub3RoaW5nLCBqdXN0IHRocm93cyBhbiBleGNlcHRpb24uCisgICAgICovCisgICAgcHVibGljIFN0cmluZyBleGNlcHRpb25Ecml2ZW5SZXNwb25zZSgpIHsKKyAgICAgICAgdGhyb3cgbmV3IFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uKFJlc3BvbnNlLm9rKCJJZiB5b3UgcmVhZCB0aGlzLCB0aGUgZXhjZXB0aW9uIGdvdCBtYXBwZWQgc3VjY2Vzc2Z1bGx5ISIpLmJ1aWxkKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTU0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE1NC9UZXN0QXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTU0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE1NC9UZXN0QXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzk0YWY5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNTQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTU0L1Rlc3RBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjE1NDsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworLyoqCisgKiBKQVgtUlMgYXBwbGljYXRpb24gdG8gY29uZmlndXJlIHJlc291cmNlcyBmb3IgSkVSU0VZLTIxNTQgcmVwcm9kdWNlci4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAQXBwbGljYXRpb25QYXRoKCIvKiIpCitwdWJsaWMgY2xhc3MgVGVzdEFwcGxpY2F0aW9uIGV4dGVuZHMgQXBwbGljYXRpb24geworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgIGZpbmFsIFNldDxDbGFzczw/Pj4gY2xhc3NlcyA9IG5ldyBIYXNoU2V0PENsYXNzPD8+PigpOworICAgICAgICBjbGFzc2VzLmFkZChDZGlSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJldHVybiBjbGFzc2VzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTU0L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2JlYW5zLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTU0L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2JlYW5zLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2RmMzY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNTQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvYmVhbnMueG1sCkBAIC0wLDAgKzEsMjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPGJlYW5zLz4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTU0L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE1NC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMTgzNzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE1NC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKK3htbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8zXzAueHNkIgorICAgICAgdmVyc2lvbj0iMy4wIj4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTU0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE1NC9FamJFeGNlcHRpb25NYXBwaW5nVGVzdC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNTQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTU0L0VqYkV4Y2VwdGlvbk1hcHBpbmdUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY0ZmMxNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTU0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE1NC9FamJFeGNlcHRpb25NYXBwaW5nVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjE1NDsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZheC5lamIuRUpCRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuY29yZS5TdHJpbmdDb250YWlucy5jb250YWluc1N0cmluZzsKKworLyoqCisgKiBSZXByb2R1Y2VyIGZvciBKRVJTRVktMjE1NC4KKyAqIFRlc3QgZ2VuZXJhdGVkIHtAbGluayBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbn0gaXMgcHJvcGFnYXRlZAorICogdmlhIENESSBjYWxsIGFuZCBtYXBwZWQgdG8gMjAwIHJlc3BvbnNlLCBldmVuIHdoZW4gd3JhcHBlZCB3aXRoIGFuIHtAbGluayBFSkJFeGNlcHRpb259LgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBFamJFeGNlcHRpb25NYXBwaW5nVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0QXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVVJJIGdldEJhc2VVcmkoKSB7CisgICAgICAgIHJldHVybiBVcmlCdWlsZGVyLmZyb21Vcmkoc3VwZXIuZ2V0QmFzZVVyaSgpKS5wYXRoKCJqZXJzZXktMjE1NCIpLmJ1aWxkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhlIG9ubHkgdGVzdCBuZWVkZWQuIFNob3VsZCB0aGUgb3JpZ2luYWwge0BsaW5rIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9ufQorICAgICAqIG5vdCBnZXQgdW53cmFwcGVkLCB3ZSB3b3VsZCBlbmQgdXAgd2l0aCA1MDAgc3RhdHVzIGNvZGUuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5qZWN0aW9uKCkgeworCisgICAgICAgIGZpbmFsIFdlYlRhcmdldCBjZGlSZXNvdXJjZSA9IHRhcmdldCgpLnBhdGgoImNkaSIpOworCisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gY2RpUmVzb3VyY2UucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBjb250YWluc1N0cmluZygiZXhjZXB0aW9uIGdvdCBtYXBwZWQiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNjAvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTYwL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUzMmFhYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTYwL3BvbS54bWwKQEAgLTAsMCArMSw3MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmplcnNleS0yMTYwPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLWplcnNleS0yMTYwPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPlNlcnZsZXQgaW50ZWdyYXRpb24gdGVzdCAtIEpFUlNFWS0yMTYwIC0gSHR0cFNlcnZsZXRSZXF1ZXN0L0h0dHBTZXJ2bGV0UmVzcG9uc2UgZG8gbm90IGdldCBpbmplY3RlZCBhcyBhIHByb3h5IGludG8gbWV0aG9kIHBhcmFtZXRlcnM8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3NlcnZsZXQyLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldC1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTYwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE2MC9Jc3N1ZTIxNjBSZXByb2R1Y2VyUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTYwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE2MC9Jc3N1ZTIxNjBSZXByb2R1Y2VyUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDk3ZWYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNjAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTYwL0lzc3VlMjE2MFJlcHJvZHVjZXJSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjE2MDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi5hcGkuUHJveHlDdGw7CisKKy8qKgorICogVGVzdCByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgic2VydmxldEluamVjdGVlcyIpCitwdWJsaWMgY2xhc3MgSXNzdWUyMTYwUmVwcm9kdWNlclJlc291cmNlIHsKKworICAgIEBDb250ZXh0CisgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3RGaWVsZDsKKyAgICBAQ29udGV4dAorICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2VGaWVsZDsKKworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBTdHJpbmcgZW5zdXJlTm9Qcm94eUluamVjdGVkKEBDb250ZXh0IEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0UGFyYW0sIEBDb250ZXh0IEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2VQYXJhbSkgeworCisgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgaW5qZWN0ZWVzIGFyZSBzYW1lIG5vIG1hdHRlciBob3cgdGhleSBnb3QgaW5qZWN0ZWQKKyAgICAgICAgaWYgKHJlcXVlc3RQYXJhbSAhPSByZXF1ZXN0RmllbGQgfHwgcmVzcG9uc2VQYXJhbSAhPSByZXNwb25zZUZpZWxkKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbmplY3RlZCBmaWVsZCBhbmQgcGFyYW1ldGVyIHNob3VsZCByZWZlciB0byB0aGUgc2FtZSBpbnN0YW5jZSIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gbWFrZSBzdXJlIHdlIGhhdmUgbm90IGdvdCBwcm94aWVzCisgICAgICAgIGlmIChyZXF1ZXN0UGFyYW0gaW5zdGFuY2VvZiBQcm94eUN0bCB8fCByZXNwb25zZVBhcmFtIGluc3RhbmNlb2YgUHJveHlDdGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm5vIHByb3h5IGV4cGVjdGVkISIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIChTdHJpbmcpIHJlcXVlc3RQYXJhbS5nZXRBdHRyaWJ1dGUoUmVxdWVzdEZpbHRlci5SRVFVRVNUX05VTUJFUl9QUk9QRVJUWSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNjAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTYwL0plcnNleTIxNjBBcHAuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTYwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE2MC9KZXJzZXkyMTYwQXBwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlmMjFjNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTYwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE2MC9KZXJzZXkyMTYwQXBwLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyMTYwOworCitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CisKKy8qKgorICogSkFYLVJTIGFwcGxpY2F0aW9uIGZvciB0aGUgSkVSU0VZLTE5NjAgcmVwcm9kdWNlciB0ZXN0LgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXkyMTYwQXBwIGV4dGVuZHMgQXBwbGljYXRpb24geworCisgICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICByZXR1cm4gbmV3IEhhc2hTZXQ8Q2xhc3M8Pz4+KCkgeworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGFkZChSZXF1ZXN0RmlsdGVyLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBhZGQoSXNzdWUyMTYwUmVwcm9kdWNlclJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE2MC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNjAvUmVxdWVzdEZpbHRlci5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNjAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTYwL1JlcXVlc3RGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTQ0ZjBjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNjAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTYwL1JlcXVlc3RGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIxNjA7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5QcmVNYXRjaGluZzsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CisKKy8qKgorICogRmlsdGVyIHRoYXQgc2V0IGEgcHJvcGVydHkgb24gYWN0dWFsIHJlcXVlc3QuIFRoZSBwcm9wZXJ0eSB2YWx1ZQorICogaXMgZXhwZWN0ZWQgdG8gYmUgcHJvcGFnYXRlZCB0byB0aGUgcmVzb3VyY2UgbWV0aG9kIHZpYSBpbmplY3RlZAorICoge0BsaW5rIEh0dHBTZXJ2bGV0UmVxdWVzdH0gcGFyYW1ldGVyLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQcmVNYXRjaGluZworcHVibGljIGNsYXNzIFJlcXVlc3RGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFJFUVVFU1RfTlVNQkVSX1BST1BFUlRZID0gInJlcXVlc3QtbnVtYmVyIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBSRVFVRVNUX05VTUJFUl9IRUFERVIgPSAibnVtYmVyIjsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCBjdHgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBudW1iZXIgPSBjdHguZ2V0SGVhZGVyU3RyaW5nKFJFUVVFU1RfTlVNQkVSX0hFQURFUik7CisgICAgICAgIGN0eC5zZXRQcm9wZXJ0eShSRVFVRVNUX05VTUJFUl9QUk9QRVJUWSwgbnVtYmVyKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE2MC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNjAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjk3NDU5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNjAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDM1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjIuNSIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzJfNS54c2QiPgorICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPmplcnNleTIxNjBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC53cy5ycy5BcHBsaWNhdGlvbjwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyMTYwLkplcnNleTIxNjBBcHA8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPmplcnNleTIxNjBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vamVyc2V5LTIxNjAvKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE2MC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNjAvSmVyc2V5MjE2MElUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNjAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTYwL0plcnNleTIxNjBJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDdmMGI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNjAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTYwL0plcnNleTIxNjBJVENhc2UuamF2YQpAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIxNjA7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogUmVwcm9kdWNlciB0ZXN0cyBmb3IgSkVSU0VZLTIxNjAuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEplcnNleTIxNjBJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgSmVyc2V5MjE2MEFwcCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVwcm9kdWNlciBtZXRob2QgZm9yIEpFUlNFWS0yMTYwLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEplcnNleTIxNjBGaXgoKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgICAgICAgICAgU3RyaW5nIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiamVyc2V5LTIxNjAvc2VydmxldEluamVjdGVlcyIpCisgICAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkuaGVhZGVyKFJlcXVlc3RGaWx0ZXIuUkVRVUVTVF9OVU1CRVJfSEVBREVSLCBpKQorICAgICAgICAgICAgICAgICAgICAuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoSW50ZWdlci5wYXJzZUludChyZXNwb25zZSksIGkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNjQvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTY0L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRmNjc4MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTY0L3BvbS54bWwKQEAgLTAsMCArMSw2OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmplcnNleS0yMTY0PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLWplcnNleS0yMTY0PC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPlNlcnZsZXQgaW50ZWdyYXRpb24gdGVzdCAtIEpFUlNFWS0yMTY0IC0gTXVsdGkgdmFsdWUgaHR0cCBoZWFkZXJzIGFyZSBub3QgY29ycmVjdGx5IHJlYWQgYnkgdGhlIHNlcnZlcjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLWpzb24tamFja3NvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE2NC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNjQvSXNzdWUyMTY0UmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTY0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE2NC9Jc3N1ZTIxNjRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwYjlkYTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE2NC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNjQvSXNzdWUyMTY0UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIxNjQ7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5IZWFkZXJQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworCisvKioKKyAqIFRlc3QgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BQYXRoKCIvIikKK3B1YmxpYyBjbGFzcyBJc3N1ZTIxNjRSZXNvdXJjZSB7CisKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBnZXQoQEhlYWRlclBhcmFtKCJoZWxsbyIpIGZpbmFsIExpc3Q8U3RyaW5nPiBoZWFkZXJzKSB7CisgICAgICAgIHJldHVybiBoZWFkZXJzLnNpemUoKSArICI6IiArIGhlYWRlcnM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNjQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTY0L0plcnNleTIxNjQuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTY0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE2NC9KZXJzZXkyMTY0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI0Y2ZmNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTY0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE2NC9KZXJzZXkyMTY0LmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyMTY0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCisvKioKKyAqIEpBWC1SUyBhcHBsaWNhdGlvbiBmb3IgdGhlIEpFUlNFWS0yMTY0IHJlcHJvZHVjZXIgdGVzdC4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEplcnNleTIxNjQgZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisKKyAgICBwdWJsaWMgSmVyc2V5MjE2NCgpIHsKKyAgICAgICAgcmVnaXN0ZXIoSXNzdWUyMTY0UmVzb3VyY2UuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTY0L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE2NC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNzdhOTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE2NC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi41IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI+CisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+amVyc2V5MjE2NFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LndzLnJzLkFwcGxpY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIxNjQuSmVyc2V5MjE2NDwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+amVyc2V5MjE2NFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTY0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE2NC9KZXJzZXkyMTY0SVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE2NC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNjQvSmVyc2V5MjE2NElUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5YzI0YzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE2NC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNjQvSmVyc2V5MjE2NElUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjE2NDsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5SZWFkZXJXcml0ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBSZXByb2R1Y2VyIHRlc3RzIGZvciBKRVJTRVktMjE2NC4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEplcnNleTIxNjRJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgSmVyc2V5MjE2NCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVhZGVyTGlzdFNpbmdsZUhlYWRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5oZWFkZXIoImhlbGxvIiwgIndvcmxkIikuaGVhZGVyKCJoZWxsbyIsICJ1bml2ZXJzZSIpLmdldCgpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKCIxOlt3b3JsZCx1bml2ZXJzZV0iKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2sgdGhhdCBtdWx0aSB2YWx1ZSBodHRwIGhlYWRlcnMgYXJlIGNvcnJlY3RseSByZWFkIGJ5IHRoZSBzZXJ2ZXIuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVhZGVyTGlzdE11bHRpcGxlSGVhZGVycygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBVUkwgdXJsID0gbmV3IFVSTChnZXRCYXNlVXJpKCkudG9TdHJpbmcoKSk7CisgICAgICAgIGZpbmFsIEh0dHBVUkxDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSAoSHR0cFVSTENvbm5lY3Rpb24pIHVybC5vcGVuQ29ubmVjdGlvbigpOworCisgICAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdE1ldGhvZCgiR0VUIik7CisgICAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KCJBY2NlcHQiLCAidGV4dC9wbGFpbiIpOworICAgICAgICBjb25uZWN0aW9uLnNldFJlcXVlc3RQcm9wZXJ0eSgiaGVsbG8iLCAid29ybGQiKTsKKyAgICAgICAgY29ubmVjdGlvbi5hZGRSZXF1ZXN0UHJvcGVydHkoImhlbGxvIiwgInVuaXZlcnNlIik7CisKKyAgICAgICAgY29ubmVjdGlvbi5zZXREb091dHB1dChmYWxzZSk7CisgICAgICAgIGNvbm5lY3Rpb24uY29ubmVjdCgpOworCisgICAgICAgIGFzc2VydFRoYXQoY29ubmVjdGlvbi5nZXRSZXNwb25zZUNvZGUoKSwgZXF1YWxUbygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChSZWFkZXJXcml0ZXIucmVhZEZyb21Bc1N0cmluZyhuZXcgSW5wdXRTdHJlYW1SZWFkZXIoY29ubmVjdGlvbi5nZXRJbnB1dFN0cmVhbSgpKSksCisgICAgICAgICAgICAgICAgZXF1YWxUbygiMjpbd29ybGQsIHVuaXZlcnNlXSIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE2Ny9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNjcvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDNlODk0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNjcvcG9tLnhtbApAQCAtMCwwICsxLDY1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LTIxNjc8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tamVyc2V5LTIxNjc8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+SkVSU0VZLTIxNjcgcmVwcm9kdWNlciAtIEluamVjdGluZyBhIGN1c3RvbSBwYXJhbWV0ZXIgdHlwZSBjYXVzZXMgUkVTVCBtZXRob2QgdG8gcnVuIHR3aWNlPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldC1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTY3L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE2Ny9Jc3N1ZTIxNjdSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNjcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTY3L0lzc3VlMjE2N1Jlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhjY2VmOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTY3L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE2Ny9Jc3N1ZTIxNjdSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjE2NzsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCisvKioKKyAqIFRlc3QgcmVzb3VyY2UgZm9yIEpFUlNFWS0yMTY3IHJlcHJvZHVjZXIuCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCisKK0BQYXRoKCIvTXlSZXNvdXJjZSIpCitwdWJsaWMgY2xhc3MgSXNzdWUyMTY3UmVzb3VyY2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKElzc3VlMjE2N1Jlc291cmNlLmNsYXNzLmdldE5hbWUoKSk7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgTVNHID0gIlJlc291cmNlIG1ldGhvZCBkb0EoKSBjYWxsZWQgYXQgIjsKKworICAgIEBQYXRoKCJ0ZXN0IikKKyAgICBAR0VUCisgICAgcHVibGljIFJlc3BvbnNlIGRvQShATXlBbm5vdGF0aW9uIFN0cmluZyBwYXJhbSkgeworICAgICAgICBMT0dHRVIubG9nKExldmVsLklORk8sIE1TRyArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgIjsgcGFyYW09IiArIHBhcmFtKTsKKyAgICAgICAgaWYgKHBhcmFtID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5zZXJ2ZXJFcnJvcigpLmJ1aWxkKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCkuYnVpbGQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE2Ny9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNjcvSmVyc2V5MjE2N0FwcC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNjcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTY3L0plcnNleTIxNjdBcHAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWRjM2NjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNjcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTY3L0plcnNleTIxNjdBcHAuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIxNjc7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKKy8qKgorICogSkFYLVJTIGFwcGxpY2F0aW9uIGZvciB0aGUgSkVSU0VZLTIxNjcgcmVwcm9kdWNlciB0ZXN0LgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEplcnNleTIxNjdBcHAgZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisKKyAgICBwdWJsaWMgSmVyc2V5MjE2N0FwcCgpIHsKKyAgICAgICAgcmVnaXN0ZXIoSXNzdWUyMTY3UmVzb3VyY2UuY2xhc3MpOworICAgICAgICByZWdpc3RlcihuZXcgTXlCaW5kZXIoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNjcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTY3L015QW5ub3RhdGlvbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNjcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTY3L015QW5ub3RhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZWM2NmUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE2Ny9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNjcvTXlBbm5vdGF0aW9uLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyMTY3OworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKKy8qKgorICogQ3VzdG9tIGFubm90YXRpb24gZm9yIEpFUlNFWS0yMTY3IHJlcHJvZHVjZXIgdGVzdC4KKyAqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KKworQFRhcmdldChFbGVtZW50VHlwZS5QQVJBTUVURVIpCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorcHVibGljIEBpbnRlcmZhY2UgTXlBbm5vdGF0aW9uIHsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTY3L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE2Ny9NeUJpbmRlci5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNjcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTY3L015QmluZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZkZTJjOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTY3L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE2Ny9NeUJpbmRlci5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjE2NzsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQWJzdHJhY3RCaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5pbnRlcm5hbC5WYWx1ZVBhcmFtUHJvdmlkZXI7CisKKy8qKgorICogQ3VzdG9tIGFubm90YXRpb24gYmluZGVyIGZvciBKRVJTRVktMjE2NyByZXByb2R1Y2VyLgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIE15QmluZGVyIGV4dGVuZHMgQWJzdHJhY3RCaW5kZXIgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICBiaW5kKE15VmFsdWVQYXJhbVByb3ZpZGVyLmNsYXNzKS50byhWYWx1ZVBhcmFtUHJvdmlkZXIuY2xhc3MpLmluKFNpbmdsZXRvbi5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNjcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTY3L015VmFsdWVQYXJhbVByb3ZpZGVyLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE2Ny9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNjcvTXlWYWx1ZVBhcmFtUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWFlNWFlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNjcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTY3L015VmFsdWVQYXJhbVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyMTY3OworCitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkZ1bmN0aW9uOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5Db250YWluZXJSZXF1ZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5pbmplY3QuQWJzdHJhY3RWYWx1ZVBhcmFtUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLmluamVjdC5NdWx0aXZhbHVlZFBhcmFtZXRlckV4dHJhY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5QYXJhbWV0ZXI7CisKKy8qKgorICogQ3VzdG9tIGFubm90YXRpb24gdmFsdWUgc3VwcGxpZXIgcHJvdmlkZXIgZm9yIEpFUlNFWS0yMTY3IHJlcHJvZHVjZXIuCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitAU2luZ2xldG9uCitwdWJsaWMgY2xhc3MgTXlWYWx1ZVBhcmFtUHJvdmlkZXIgZXh0ZW5kcyBBYnN0cmFjdFZhbHVlUGFyYW1Qcm92aWRlciB7CisKKyAgICBASW5qZWN0CisgICAgcHVibGljIE15VmFsdWVQYXJhbVByb3ZpZGVyKFByb3ZpZGVyPE11bHRpdmFsdWVkUGFyYW1ldGVyRXh0cmFjdG9yUHJvdmlkZXI+IG1wZXApIHsKKyAgICAgICAgc3VwZXIobXBlcCwgUGFyYW1ldGVyLlNvdXJjZS5VTktOT1dOKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgRnVuY3Rpb248Q29udGFpbmVyUmVxdWVzdCwgPz4gY3JlYXRlVmFsdWVQcm92aWRlcihQYXJhbWV0ZXIgcGFyYW1ldGVyKSB7CisgICAgICAgIHJldHVybiBuZXcgTXlWYWx1ZVN1cHBsaWVyKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgTXlWYWx1ZVN1cHBsaWVyIGltcGxlbWVudHMgRnVuY3Rpb248Q29udGFpbmVyUmVxdWVzdCwgT2JqZWN0PiB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPYmplY3QgYXBwbHkoQ29udGFpbmVyUmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgICAgICAvLyByZXR1cm5zIHNvbWUgdGVzdGluZyB2YWx1ZQorICAgICAgICAgICAgcmV0dXJuICJpbmplY3RlZCB0aW1lc3RhbXA9IiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNjcvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTY3L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmUxZmI5ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTY3L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIyLjUiIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIj4KKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5qZXJzZXkyMTY3U2VydmxldDwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjE2Ny5KZXJzZXkyMTY3QXBwPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5qZXJzZXkyMTY3U2VydmxldDwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNjcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTY3L0plcnNleTIxNjdJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTY3L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE2Ny9KZXJzZXkyMTY3SVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZmNThjNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTY3L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE2Ny9KZXJzZXkyMTY3SVRDYXNlLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyMTY3OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogUmVwcm9kdWNlciB0ZXN0cyBmb3IgSkVSU0VZLTIxNjcuCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSmVyc2V5MjE2N0lUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKyAgICAgICAgcmV0dXJuIG5ldyBKZXJzZXkyMTY3QXBwKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZU1ldGhvZENhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJNeVJlc291cmNlL3Rlc3QiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIC8vIGlmIHBhcmFtZXRlciB3YXMgbm90IGluamVjdGVkLCByZXNvdXJjZSByZXR1cm5zIFJlc3BvbnNlLlN0YXR1cy5TRVJWRVJfRVJST1IgKDUwMCkuIE1pc3NpbmcgcGFyYW1ldGVyIG1lYW5zLAorICAgICAgICAvLyB0aGF0IGhrMiBpbmplY3RlZCB0aGUgcGFyYW1ldGVyIGFuZCBpbnZva2VkIHRoZSBtZXRob2QgcHJlbGltaW5hcnkgYW5kIGR1cmluZyBKZXJzZXktZHJpdmVuIGludm9jYXRpb24sCisgICAgICAgIC8vIHRoZXJlIHdhcyBubyBwYXJhbWV0ZXIgaW5qZWN0aW9uIGFueSBtb3JlLiBJZiBwYXJhbWV0ZXIgd2FzIGluamVjdGVkIGFuZCBSZXNwb25zZS5TdGF0dXMuT0sgKDIwMCkgcmV0dXJuZWQsCisgICAgICAgIC8vIHRoZSByZXNvdXJjZSBtZXRob2Qgd2FzIGNhbGxlZCBvbmx5IG9uY2UgKGJ5IEplcnNleSkuCisgICAgICAgIGFzc2VydEVxdWFscygiUGFyYW1ldGVyIG5vdCBpbmplY3RlZCBpbnRvIHJlc291cmNlIG1ldGhvZC4gUmVzb3VyY2UgbWV0aG9kIGNvdWxkIGhhdmUgYmVlbiBjYWxsZWQgdHdpY2UuICIsCisgICAgICAgICAgICAgICAgcmVzcG9uc2UuZ2V0U3RhdHVzKCksIFJlc3BvbnNlLlN0YXR1cy5PSy5nZXRTdGF0dXNDb2RlKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTc2L3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE3Ni9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YzM4NzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE3Ni9wb20ueG1sCkBAIC0wLDAgKzEsNzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktMjE3NjwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1qZXJzZXktMjE3NjwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5TZXJ2bGV0IGludGVncmF0aW9uIHRlc3QgLSBKRVJTRVktMjE3NiAtIFByb2JsZW1zIHdpdGggY2FsbGluZyBjbG9zZSgpIGFuZCBmbHVzaCgpCisgICAgICAgIG1ldGhvZHMgb24gdW5kZXJseWluZyBvdXRwdXQgc3RyZWFtLjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguc2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3NlcnZsZXQzLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE3Ni9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNzYvSXNzdWUyMTc2UmVwcm9kdWNlclJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE3Ni9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNzYvSXNzdWUyMTc2UmVwcm9kdWNlclJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIwZDA5MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTc2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE3Ni9Jc3N1ZTIxNzZSZXByb2R1Y2VyUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIxNzY7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworLyoqCisgKiBUZXN0IHJlc291cmNlLgorICoKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCIvcmVzb3VyY2UiKQorcHVibGljIGNsYXNzIElzc3VlMjE3NlJlcHJvZHVjZXJSZXNvdXJjZSB7CisKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFhfRkFJTF9IRUFERVIgPSAiWC1GQUlMIjsKKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFhfUkVTUE9OU0VfRU5USVRZX0hFQURFUiA9ICJYLVJFU1BPTlNFLUVOVElUWSI7CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBAUGF0aCgie3N0YXR1c30iKQorICAgIHB1YmxpYyBSZXNwb25zZSBnZXRUZXh0KEBQYXRoUGFyYW0oInN0YXR1cyIpIGludCB1YywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBAQ29udGV4dCBIdHRwSGVhZGVycyBoZWFkZXJzKSB0aHJvd3MgTXlFeGNlcHRpb24geworICAgICAgICBpZiAodWMgPT0gLTEpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNeUV4Y2VwdGlvbigiVUM9ICIgKyB1Yyk7CisgICAgICAgIH0gZWxzZSBpZiAodWMgPT0gLTIpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVDPSAiICsgdWMpOworICAgICAgICB9IGVsc2UgaWYgKHVjID09IC0zKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgV2ViQXBwbGljYXRpb25FeGNlcHRpb24oIlVDPSAiICsgdWMsIDMyMSk7CisgICAgICAgIH0gZWxzZSBpZiAodWMgPT0gLTQpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbigiVUM9ICIgKyB1YywgNDMyKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFJlc3BvbnNlLlJlc3BvbnNlQnVpbGRlciByZXNwb25zZUJ1aWxkZXIgPSBSZXNwb25zZS5zdGF0dXModWMpOworICAgICAgICBpZiAoaGVhZGVycy5nZXRSZXF1ZXN0SGVhZGVycygpLmNvbnRhaW5zS2V5KFhfUkVTUE9OU0VfRU5USVRZX0hFQURFUikpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlQnVpbGRlci5lbnRpdHkoIkVOVElUWSIpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gcmVzcG9uc2VCdWlsZGVyLmJ1aWxkKCk7CisgICAgICAgIGlmIChoZWFkZXJzLmdldFJlcXVlc3RIZWFkZXJzKCkuY29udGFpbnNLZXkoWF9SRVNQT05TRV9FTlRJVFlfSEVBREVSKSkgeworICAgICAgICAgICAgcmVzcG9uc2UuZ2V0SGVhZGVycygpLmFkZChYX1JFU1BPTlNFX0VOVElUWV9IRUFERVIsICJ0cnVlIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhlYWRlcnMuZ2V0UmVxdWVzdEhlYWRlcnMoKS5jb250YWluc0tleShYX0ZBSUxfSEVBREVSKSkgeworICAgICAgICAgICAgcmVzcG9uc2UuZ2V0SGVhZGVycygpLmFkZChYX0ZBSUxfSEVBREVSLCAidHJ1ZSIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXNwb25zZTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTc2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE3Ni9KZXJzZXkyMTc2QXBwLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE3Ni9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNzYvSmVyc2V5MjE3NkFwcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyOGNmYzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE3Ni9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNzYvSmVyc2V5MjE3NkFwcC5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjE3NjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKKworLyoqCisgKiBKQVgtUlMgYXBwbGljYXRpb24gZm9yIHRoZSBKRVJTRVktMjE3NiByZXByb2R1Y2VyIHRlc3QuCisgKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworYWJzdHJhY3QgY2xhc3MgSmVyc2V5MjE3NkFwcCBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKworICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBzZXRTdGF0dXNPdmVyU2VuZEVycm9yOworCisgICAgcHVibGljIEplcnNleTIxNzZBcHAoYm9vbGVhbiBzZXRTdGF0dXNPdmVyU2VuZEVycm9yKSB7CisgICAgICAgIHRoaXMuc2V0U3RhdHVzT3ZlclNlbmRFcnJvciA9IHNldFN0YXR1c092ZXJTZW5kRXJyb3I7CisKKyAgICAgICAgcHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5SRVNQT05TRV9TRVRfU1RBVFVTX09WRVJfU0VORF9FUlJPUiwgc2V0U3RhdHVzT3ZlclNlbmRFcnJvcik7CisgICAgICAgIHJlZ2lzdGVyKE15V3JpdGVySW50ZXJjZXB0b3IuY2xhc3MpOworICAgICAgICByZWdpc3RlcihJc3N1ZTIxNzZSZXByb2R1Y2VyUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIHB1YmxpYyBib29sZWFuIGlzU2V0U3RhdHVzT3ZlclNlbmRFcnJvcigpIHsKKyAgICAgICAgcmV0dXJuIHNldFN0YXR1c092ZXJTZW5kRXJyb3I7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNzYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTc2L0plcnNleTIxNzZTZW5kRXJyb3JBcHAuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTc2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE3Ni9KZXJzZXkyMTc2U2VuZEVycm9yQXBwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNkY2FlZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTc2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE3Ni9KZXJzZXkyMTc2U2VuZEVycm9yQXBwLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyMTc2OworCitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworCisvKioKKyAqIENvbmZpZ3VyZSB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXMjUkVTUE9OU0VfU0VUX1NUQVRVU19PVkVSX1NFTkRfRVJST1J9IGJ5IHtAY29kZSB0cnVlfSAtCisgKiBtZXRob2Qge0BsaW5rIGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlc3BvbnNlI3NlbmRFcnJvcn0gd2lsbCBiZSBjYWxsZWQgaW4gY2FzZSBvZiBlcnJvcnMKKyAqIChzdGF0dXMge0Bjb2RlIDR4eH0gb3Ige0Bjb2RlIDV4eH0pLgorICoKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BBcHBsaWNhdGlvblBhdGgoSmVyc2V5MjE3NlNlbmRFcnJvckFwcC5BUFBfUEFUSCkKK3B1YmxpYyBjbGFzcyBKZXJzZXkyMTc2U2VuZEVycm9yQXBwIGV4dGVuZHMgSmVyc2V5MjE3NkFwcCB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBUFBfUEFUSCA9ICJzZW5kLWVycm9yIjsKKworICAgIHB1YmxpYyBKZXJzZXkyMTc2U2VuZEVycm9yQXBwKCkgeworICAgICAgICBzdXBlcihmYWxzZSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE3Ni9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNzYvSmVyc2V5MjE3NlNldFN0YXR1c0FwcC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNzYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTc2L0plcnNleTIxNzZTZXRTdGF0dXNBcHAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDFkZjAyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNzYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTc2L0plcnNleTIxNzZTZXRTdGF0dXNBcHAuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIxNzY7CisKK2ltcG9ydCBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGg7CisKKy8qKgorICogQ29uZmlndXJlIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllcyNSRVNQT05TRV9TRVRfU1RBVFVTX09WRVJfU0VORF9FUlJPUn0gYnkge0Bjb2RlIHRydWV9IC0KKyAqIG1ldGhvZCB7QGxpbmsgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2Ujc2V0U3RhdHVzfSB3aWxsIGJlIGNhbGxlZCBpbiBjYXNlIG9mIGVycm9ycworICogKHN0YXR1cyB7QGNvZGUgNHh4fSBvciB7QGNvZGUgNXh4fSkuCisgKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uUGF0aChKZXJzZXkyMTc2U2V0U3RhdHVzQXBwLkFQUF9QQVRIKQorcHVibGljIGNsYXNzIEplcnNleTIxNzZTZXRTdGF0dXNBcHAgZXh0ZW5kcyBKZXJzZXkyMTc2QXBwIHsKKworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFQUF9QQVRIID0gInNldC1zdGF0dXMiOworCisgICAgcHVibGljIEplcnNleTIxNzZTZXRTdGF0dXNBcHAoKSB7CisgICAgICAgIHN1cGVyKHRydWUpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNzYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTc2L015RXhjZXB0aW9uLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE3Ni9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNzYvTXlFeGNlcHRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lN2RhZjIxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNzYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTc2L015RXhjZXB0aW9uLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyMTc2OworCisvKioKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBNeUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7CisKKyAgICBwdWJsaWMgTXlFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgc3VwZXIobWVzc2FnZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNzYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTc2L015V3JpdGVySW50ZXJjZXB0b3IuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTc2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE3Ni9NeVdyaXRlckludGVyY2VwdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRhNGZjZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTc2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE3Ni9NeVdyaXRlckludGVyY2VwdG9yLmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyMTc2OworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yQ29udGV4dDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuTWVzc2FnZVV0aWxzOworCisKKy8qKgorICogVGhpcyBqdXN0IHNldCBuZXcgY29udGV4dCBvdXRwdXQgc3RyZWFtIGFuZCB0ZXN0IGEgY2xvbmUgbWV0aG9kIG9uIHNldCBvdXRwdXQgc3RyZWFtIGluc3RhbmNlIGlzIGNhbGxlZC4KKyAqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgTXlXcml0ZXJJbnRlcmNlcHRvciBpbXBsZW1lbnRzIFdyaXRlckludGVyY2VwdG9yIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFyb3VuZFdyaXRlVG8oZmluYWwgV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gZmFpbCA9IGNvbnRleHQuZ2V0SGVhZGVycygpLmNvbnRhaW5zS2V5KElzc3VlMjE3NlJlcHJvZHVjZXJSZXNvdXJjZS5YX0ZBSUxfSEVBREVSKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiByZXNwb25zZUVudGl0eSA9IGNvbnRleHQuZ2V0SGVhZGVycygpLmNvbnRhaW5zS2V5KElzc3VlMjE3NlJlcHJvZHVjZXJSZXNvdXJjZS5YX1JFU1BPTlNFX0VOVElUWV9IRUFERVIpOworCisgICAgICAgIGlmIChyZXNwb25zZUVudGl0eSkgeworICAgICAgICAgICAgY29udGV4dC5zZXRPdXRwdXRTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgIG5ldyBNeU91dHB1dFN0cmVhbShjb250ZXh0LmdldE91dHB1dFN0cmVhbSgpLCBNZXNzYWdlVXRpbHMuZ2V0Q2hhcnNldChjb250ZXh0LmdldE1lZGlhVHlwZSgpKSkpOworICAgICAgICB9CisgICAgICAgIGNvbnRleHQucHJvY2VlZCgpOworICAgICAgICBpZiAoZmFpbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRnJvbSBNeVdyaXRlckludGVyY2VwdG9yIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNeU91dHB1dFN0cmVhbSBleHRlbmRzIE91dHB1dFN0cmVhbSB7CisgICAgICAgIHByaXZhdGUgZmluYWwgT3V0cHV0U3RyZWFtIGRlbGVnYXRlOworICAgICAgICBmaW5hbCBDaGFyc2V0IGNoYXJzZXQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGxvY2FsU3RyZWFtOworCisgICAgICAgIHByaXZhdGUgTXlPdXRwdXRTdHJlYW0oZmluYWwgT3V0cHV0U3RyZWFtIGRlbGVnYXRlLCBmaW5hbCBDaGFyc2V0IGNoYXJzZXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICB0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7CisgICAgICAgICAgICB0aGlzLmNoYXJzZXQgPSBjaGFyc2V0OworCisgICAgICAgICAgICB0aGlzLmxvY2FsU3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICAgICAgbG9jYWxTdHJlYW0ud3JpdGUoIltJTlRFUkNFUFRPUl0iLmdldEJ5dGVzKGNoYXJzZXQpKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCB3cml0ZShmaW5hbCBpbnQgYikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGxvY2FsU3RyZWFtLndyaXRlKGIpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGRlbGVnYXRlLndyaXRlKGxvY2FsU3RyZWFtLnRvQnl0ZUFycmF5KCkpOworICAgICAgICAgICAgbG9jYWxTdHJlYW0ucmVzZXQoKTsKKyAgICAgICAgICAgIGRlbGVnYXRlLmZsdXNoKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgbG9jYWxTdHJlYW0ud3JpdGUoIlsvSU5URVJDRVBUT1JdIi5nZXRCeXRlcyhjaGFyc2V0KSk7CisKKyAgICAgICAgICAgIGRlbGVnYXRlLndyaXRlKGxvY2FsU3RyZWFtLnRvQnl0ZUFycmF5KCkpOworCisgICAgICAgICAgICBkZWxlZ2F0ZS5jbG9zZSgpOworICAgICAgICAgICAgbG9jYWxTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNzYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTc2L1RyYWNlUmVzcG9uc2VGaWx0ZXIuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTc2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE3Ni9UcmFjZVJlc3BvbnNlRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIwZWNmMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTc2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE3Ni9UcmFjZVJlc3BvbnNlRmlsdGVyLmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyMTc2OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlckNoYWluOworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ29uZmlnOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CisKKy8qKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFRyYWNlUmVzcG9uc2VGaWx0ZXIgaW1wbGVtZW50cyBGaWx0ZXIgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgWF9TRVJWRVJfRFVSQVRJT05fSEVBREVSID0gIlgtU0VSVkVSLURVUkFUSU9OIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBYX1NUQVRVU19IRUFERVIgPSAiWC1TVEFUVVMiOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFhfTk9fRklMVEVSX0hFQURFUiA9ICJYLU5PLUZJTFRFUiI7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBpbml0KGZpbmFsIEZpbHRlckNvbmZpZyBmaWx0ZXJDb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgeworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRvRmlsdGVyKGZpbmFsIFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwgZmluYWwgRmlsdGVyQ2hhaW4gY2hhaW4pCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24sIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICBUcmFjZVJlc3BvbnNlV3JhcHBlciB3cmFwcGVkUmVzcG9uc2UgPSBudWxsOworICAgICAgICBpZiAoKChIdHRwU2VydmxldFJlcXVlc3QpIHJlcXVlc3QpLmdldEhlYWRlcihYX05PX0ZJTFRFUl9IRUFERVIpID09IG51bGwpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlID0gd3JhcHBlZFJlc3BvbnNlID0gbmV3IFRyYWNlUmVzcG9uc2VXcmFwcGVyKChIdHRwU2VydmxldFJlc3BvbnNlKSByZXNwb25zZSk7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nIHN0YXR1cyA9ICJuL2EiOworICAgICAgICBmaW5hbCBsb25nIHN0YXJ0VGltZSA9IFN5c3RlbS5uYW5vVGltZSgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY2hhaW4uZG9GaWx0ZXIocmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICAgICAgc3RhdHVzID0gIk9LIjsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgVGhyb3dhYmxlIHRoKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAiRkFJTCI7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBmaW5hbCBsb25nIGR1cmF0aW9uID0gU3lzdGVtLm5hbm9UaW1lKCkgLSBzdGFydFRpbWU7CisgICAgICAgICAgICAoKEh0dHBTZXJ2bGV0UmVzcG9uc2UpIHJlc3BvbnNlKS5hZGRIZWFkZXIoWF9TRVJWRVJfRFVSQVRJT05fSEVBREVSLCBTdHJpbmcudmFsdWVPZihkdXJhdGlvbikpOworICAgICAgICAgICAgKChIdHRwU2VydmxldFJlc3BvbnNlKSByZXNwb25zZSkuYWRkSGVhZGVyKFhfU1RBVFVTX0hFQURFUiwgc3RhdHVzKTsKKyAgICAgICAgICAgIGlmICh3cmFwcGVkUmVzcG9uc2UgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICgoSHR0cFNlcnZsZXRSZXNwb25zZSkgcmVzcG9uc2UpLnNldEhlYWRlcihIdHRwSGVhZGVycy5DT05URU5UX0xFTkdUSCwgd3JhcHBlZFJlc3BvbnNlLmdldENvbnRlbnRMZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgd3JhcHBlZFJlc3BvbnNlLndyaXRlQm9keUFuZENsb3NlKHJlc3BvbnNlLmdldENoYXJhY3RlckVuY29kaW5nKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE3Ni9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNzYvVHJhY2VSZXNwb25zZVdyYXBwZXIuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTc2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE3Ni9UcmFjZVJlc3BvbnNlV3JhcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlMmY2NzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE3Ni9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNzYvVHJhY2VSZXNwb25zZVdyYXBwZXIuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIxNzY7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyOworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKKworLyoqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgVHJhY2VSZXNwb25zZVdyYXBwZXIgZXh0ZW5kcyBIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlciB7CisgICAgcHJpdmF0ZSBmaW5hbCBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gbG9jYWxTdHJlYW07CisKKyAgICBwdWJsaWMgVHJhY2VSZXNwb25zZVdyYXBwZXIoZmluYWwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgc3VwZXIocmVzcG9uc2UpOworCisgICAgICAgIGxvY2FsU3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBsb2NhbFN0cmVhbS53cml0ZSgiW0ZJTFRFUl0iLmdldEJ5dGVzKHJlc3BvbnNlLmdldENoYXJhY3RlckVuY29kaW5nKCkpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUHJpbnRXcml0ZXIgZ2V0V3JpdGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXJ2bGV0T3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgU2VydmxldE91dHB1dFN0cmVhbSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgd3JpdGUoZmluYWwgaW50IGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgbG9jYWxTdHJlYW0ud3JpdGUoYik7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgfQorCisgICAgcHVibGljIHZvaWQgd3JpdGVCb2R5QW5kQ2xvc2UoZmluYWwgU3RyaW5nIGVuY29kaW5nKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBsb2NhbFN0cmVhbS53cml0ZSgiWy9GSUxURVJdIi5nZXRCeXRlcyhlbmNvZGluZykpOworCisgICAgICAgIHN1cGVyLmdldE91dHB1dFN0cmVhbSgpLndyaXRlKGxvY2FsU3RyZWFtLnRvQnl0ZUFycmF5KCkpOworICAgICAgICBzdXBlci5nZXRPdXRwdXRTdHJlYW0oKS5jbG9zZSgpOworICAgICAgICBsb2NhbFN0cmVhbS5jbG9zZSgpOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGVudExlbmd0aCgpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy52YWx1ZU9mKGxvY2FsU3RyZWFtLnNpemUoKSArICJbL0ZJTFRFUl0iLmxlbmd0aCgpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTc2L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE3Ni9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjOTEwOWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE3Ni9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi41IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI+CisgICAgPGZpbHRlcj4KKyAgICAgICAgPGZpbHRlci1uYW1lPlRyYWNlRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPGZpbHRlci1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyMTc2LlRyYWNlUmVzcG9uc2VGaWx0ZXI8L2ZpbHRlci1jbGFzcz4KKyAgICA8L2ZpbHRlcj4KKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5UcmFjZUZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTc2L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE3Ni9KZXJzZXkyMTc2SVRDYXNlQmFzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxNzYvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTc2L0plcnNleTIxNzZJVENhc2VCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZlZWMzNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTc2L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE3Ni9KZXJzZXkyMTc2SVRDYXNlQmFzZS5qYXZhCkBAIC0wLDAgKzEsMTY3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIxNzY7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuSW52b2NhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFJlcHJvZHVjZXIgdGVzdHMgZm9yIEpFUlNFWS0yMTc2LgorICoKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBKZXJzZXkyMTc2SVRDYXNlQmFzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDb250ZW50MjIyKCkgeworICAgICAgICB0ZXN0R2V0Q29udGVudCgyMjIsIHRydWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldENvbnRlbnQzMzMoKSB7CisgICAgICAgIHRlc3RHZXRDb250ZW50KDMzMywgdHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udGVudDQ0NCgpIHsKKyAgICAgICAgdGVzdEdldENvbnRlbnQoNDQ0LCB0cnVlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDb250ZW50NTU1KCkgeworICAgICAgICB0ZXN0R2V0Q29udGVudCg1NTUsIHRydWUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldENvbnRlbnQyMjJOb1Jlc3BvbnNlRW50aXR5KCkgeworICAgICAgICB0ZXN0R2V0Q29udGVudCgyMjIsIGZhbHNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRDb250ZW50MzMzTm9SZXNwb25zZUVudGl0eSgpIHsKKyAgICAgICAgdGVzdEdldENvbnRlbnQoMzMzLCBmYWxzZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q29udGVudDQ0NE5vUmVzcG9uc2VFbnRpdHkoKSB7CisgICAgICAgIHRlc3RHZXRDb250ZW50KDQ0NCwgZmFsc2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldENvbnRlbnQ1NTVOb1Jlc3BvbnNlRW50aXR5KCkgeworICAgICAgICB0ZXN0R2V0Q29udGVudCg1NTUsIGZhbHNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRFeGNlcHRpb25fMSgpIHsKKyAgICAgICAgdGVzdEdldEV4Y2VwdGlvbigtMSwgNTAwLCBmYWxzZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RXhjZXB0aW9uXzIoKSB7CisgICAgICAgIHRlc3RHZXRFeGNlcHRpb24oLTIsIDUwMCwgZmFsc2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldEV4Y2VwdGlvbl8zKCkgeworICAgICAgICB0ZXN0R2V0RXhjZXB0aW9uKC0zLCAzMjEsIGZhbHNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRFeGNlcHRpb25fNCgpIHsKKyAgICAgICAgdGVzdEdldEV4Y2VwdGlvbigtNCwgNDMyLCBmYWxzZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RXhjZXB0aW9uMjIyKCkgeworICAgICAgICB0ZXN0R2V0RXhjZXB0aW9uKDIyMiwgNTAwLCB0cnVlKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdEdldENvbnRlbnQoaW50IHVjLCBib29sZWFuIHJlc3BvbnNlRW50aXR5KSB7CisgICAgICAgIFN0cmluZyBleHBlY3RlZENvbnRlbnQgPSAiRU5USVRZIjsKKyAgICAgICAgZXhwZWN0ZWRDb250ZW50ID0gIltJTlRFUkNFUFRPUl0iICsgZXhwZWN0ZWRDb250ZW50ICsgIlsvSU5URVJDRVBUT1JdIjsKKyAgICAgICAgZXhwZWN0ZWRDb250ZW50ID0gIltGSUxURVJdIiArIGV4cGVjdGVkQ29udGVudCArICJbL0ZJTFRFUl0iOworCisgICAgICAgIEludm9jYXRpb24uQnVpbGRlciBidWlsZGVyID0gdGFyZ2V0KCkucGF0aCgiL3Jlc291cmNlLyIgKyB1YykucmVxdWVzdCgpOworICAgICAgICBpZiAocmVzcG9uc2VFbnRpdHkpIHsKKyAgICAgICAgICAgIGJ1aWxkZXIuaGVhZGVyKElzc3VlMjE3NlJlcHJvZHVjZXJSZXNvdXJjZS5YX1JFU1BPTlNFX0VOVElUWV9IRUFERVIsIHRydWUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYnVpbGRlci5oZWFkZXIoVHJhY2VSZXNwb25zZUZpbHRlci5YX05PX0ZJTFRFUl9IRUFERVIsIHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSBidWlsZGVyLmdldCgpOworICAgICAgICBmaW5hbCBTdHJpbmcgYXNzZXJ0TWVzc2FnZSA9IHVjICsgInwiICsgcmVzcG9uc2VFbnRpdHk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhhc3NlcnRNZXNzYWdlLCB1YywgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBpZiAoIXNlbmRFcnJvckV4cGVjdGVkKHVjLCByZXNwb25zZUVudGl0eSkpIHsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYXNzZXJ0TWVzc2FnZSwgIk9LIiwgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKFRyYWNlUmVzcG9uc2VGaWx0ZXIuWF9TVEFUVVNfSEVBREVSKSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChhc3NlcnRNZXNzYWdlLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoVHJhY2VSZXNwb25zZUZpbHRlci5YX1NFUlZFUl9EVVJBVElPTl9IRUFERVIpKTsKKyAgICAgICAgICAgIGlmIChyZXNwb25zZUVudGl0eSkgeworICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYXNzZXJ0TWVzc2FnZSwgZXhwZWN0ZWRDb250ZW50LCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYXNzZXJ0TWVzc2FnZSwgU3RyaW5nLnZhbHVlT2YoZXhwZWN0ZWRDb250ZW50Lmxlbmd0aCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5DT05URU5UX0xFTkdUSCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQXNzZXJ0LmFzc2VydE51bGwoYXNzZXJ0TWVzc2FnZSwgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKFRyYWNlUmVzcG9uc2VGaWx0ZXIuWF9TVEFUVVNfSEVBREVSKSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0TnVsbChhc3NlcnRNZXNzYWdlLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoVHJhY2VSZXNwb25zZUZpbHRlci5YX1NFUlZFUl9EVVJBVElPTl9IRUFERVIpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0R2V0RXhjZXB0aW9uKGludCB1YywgaW50IGV4cGVjdGVkU3RhdHVzLCBib29sZWFuIGZhaWwpIHsKKyAgICAgICAgSW52b2NhdGlvbi5CdWlsZGVyIGJ1aWxkZXIgPSB0YXJnZXQoKS5wYXRoKCIvcmVzb3VyY2UvIiArIHVjKS5yZXF1ZXN0KCk7CisgICAgICAgIGJ1aWxkZXIgPSBidWlsZGVyLmhlYWRlcihJc3N1ZTIxNzZSZXByb2R1Y2VyUmVzb3VyY2UuWF9SRVNQT05TRV9FTlRJVFlfSEVBREVSLCB0cnVlKTsKKyAgICAgICAgaWYgKGZhaWwpIHsKKyAgICAgICAgICAgIGJ1aWxkZXIgPSBidWlsZGVyLmhlYWRlcihJc3N1ZTIxNzZSZXByb2R1Y2VyUmVzb3VyY2UuWF9GQUlMX0hFQURFUiwgdHJ1ZSk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IGJ1aWxkZXIuZ2V0KCk7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkQ29udGVudCA9ICJbRklMVEVSXVsvRklMVEVSXSI7CisgICAgICAgIGZpbmFsIFN0cmluZyBhc3NlcnRNZXNzYWdlID0gdWMgKyAiOiIgKyBleHBlY3RlZFN0YXR1cyArICJ8IiArIGZhaWw7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhhc3NlcnRNZXNzYWdlLCBleHBlY3RlZFN0YXR1cywgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBpZiAoIXNlbmRFcnJvckV4cGVjdGVkKGV4cGVjdGVkU3RhdHVzLCBmYWxzZSkpIHsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYXNzZXJ0TWVzc2FnZSwgZXhwZWN0ZWRTdGF0dXMgPT0gNTAwID8gIkZBSUwiIDogIk9LIiwKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKFRyYWNlUmVzcG9uc2VGaWx0ZXIuWF9TVEFUVVNfSEVBREVSKSk7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChhc3NlcnRNZXNzYWdlLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoVHJhY2VSZXNwb25zZUZpbHRlci5YX1NFUlZFUl9EVVJBVElPTl9IRUFERVIpKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYXNzZXJ0TWVzc2FnZSwgU3RyaW5nLnZhbHVlT2YoZXhwZWN0ZWRDb250ZW50Lmxlbmd0aCgpKSwKKyAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZ2V0SGVhZGVyU3RyaW5nKEh0dHBIZWFkZXJzLkNPTlRFTlRfTEVOR1RIKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0TnVsbChhc3NlcnRNZXNzYWdlLCByZXNwb25zZS5nZXRIZWFkZXJTdHJpbmcoVHJhY2VSZXNwb25zZUZpbHRlci5YX1NUQVRVU19IRUFERVIpKTsKKyAgICAgICAgICAgIEFzc2VydC5hc3NlcnROdWxsKGFzc2VydE1lc3NhZ2UsIHJlc3BvbnNlLmdldEhlYWRlclN0cmluZyhUcmFjZVJlc3BvbnNlRmlsdGVyLlhfU0VSVkVSX0RVUkFUSU9OX0hFQURFUikpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBib29sZWFuIHNlbmRFcnJvckV4cGVjdGVkKGZpbmFsIGludCB1YywgZmluYWwgYm9vbGVhbiByZXNwb25zZUVudGl0eSkgeworICAgICAgICByZXR1cm4gISgoSmVyc2V5MjE3NkFwcCkgY29uZmlndXJlKCkpLmlzU2V0U3RhdHVzT3ZlclNlbmRFcnJvcigpICYmICh1YyA+PSA0MDApICYmICFyZXNwb25zZUVudGl0eTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTc2L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE3Ni9KZXJzZXkyMTc2U2VuZEVycm9ySVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE3Ni9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNzYvSmVyc2V5MjE3NlNlbmRFcnJvcklUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYjI2NDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE3Ni9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNzYvSmVyc2V5MjE3NlNlbmRFcnJvcklUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjE3NjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworaW1wb3J0IGphdmEubmV0LlVSSTsKKworLyoqCisgKiBSZXByb2R1Y2VyIHRlc3RzIGZvciBKRVJTRVktMjE3Ni4KKyAqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSmVyc2V5MjE3NlNlbmRFcnJvcklUQ2FzZSBleHRlbmRzIEplcnNleTIxNzZJVENhc2VCYXNlIHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgSmVyc2V5MjE3NlNlbmRFcnJvckFwcCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBVUkkgZ2V0QmFzZVVyaSgpIHsKKyAgICAgICAgcmV0dXJuIFVyaUJ1aWxkZXIuZnJvbVVyaShzdXBlci5nZXRCYXNlVXJpKCkpLnBhdGgoSmVyc2V5MjE3NlNlbmRFcnJvckFwcC5BUFBfUEFUSCkuYnVpbGQoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTc2L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE3Ni9KZXJzZXkyMTc2U2V0U3RhdHVzSVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE3Ni9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNzYvSmVyc2V5MjE3NlNldFN0YXR1c0lUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4OTRlZTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE3Ni9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxNzYvSmVyc2V5MjE3NlNldFN0YXR1c0lUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjE3NjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworaW1wb3J0IGphdmEubmV0LlVSSTsKKworLyoqCisgKiBSZXByb2R1Y2VyIHRlc3RzIGZvciBKRVJTRVktMjE3Ni4KKyAqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSmVyc2V5MjE3NlNldFN0YXR1c0lUQ2FzZSBleHRlbmRzIEplcnNleTIxNzZJVENhc2VCYXNlIHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgSmVyc2V5MjE3NlNldFN0YXR1c0FwcCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBVUkkgZ2V0QmFzZVVyaSgpIHsKKyAgICAgICAgcmV0dXJuIFVyaUJ1aWxkZXIuZnJvbVVyaShzdXBlci5nZXRCYXNlVXJpKCkpLnBhdGgoSmVyc2V5MjE3NlNldFN0YXR1c0FwcC5BUFBfUEFUSCkuYnVpbGQoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTg0L3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE4NC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1NTE1NmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE4NC9wb20ueG1sCkBAIC0wLDAgKzEsNzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktMjE4NDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1qZXJzZXktMjE4NDwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgU2VydmxldCBpbnRlZ3JhdGlvbiB0ZXN0IC0gSkVSU0VZLTIxODQgLSBTZXJ2bGV0Q29udGV4dCBpbmplY3Rpb24gaW50byBBcHBsaWNhdGlvbiBzdWJjbGFzcyBjb25zdHJ1Y3Rvci4KKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtzZXJ2bGV0My52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxODQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTg0L0FwcC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxODQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTg0L0FwcC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0YTI3OWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE4NC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIxODQvQXBwLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyMTg0OworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dDsKKworLyoqCisgKiBUZXN0IEFwcGxpY2F0aW9uIHN1YmNsYXNzIGZvciBKRVJTRVktMjE4NCBpbnRlZ3JhdGlvbiB0ZXN0LgorICoKKyAqIFRlc3RzIHRoZSBhYmlsaXR5IHRvIGluamVjdCB7QGxpbmsgU2VydmxldENvbnRleHR9IGludG8gYXBwbGljYXRpb24gc3ViY2xhc3MgY29uc3RydWN0b3IKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEFwcCBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKworICAgIC8qKiBjb25zdHJ1Y3Rvci1pbmplY3RlZCBzZXJ2bGV0Q29udGV4dCAqLworICAgIHByaXZhdGUgU2VydmxldENvbnRleHQgY3R4OworCisgICAgcHVibGljIEFwcChAQ29udGV4dCBTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCkgeworICAgICAgICB0aGlzLmN0eCA9IHNlcnZsZXRDb250ZXh0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgIEhhc2hTZXQ8Q2xhc3M8Pz4+IGNsYXNzZXMgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgIFN0cmluZyBkeW5hbWljQ2xhc3NOYW1lID0gY3R4LmdldEluaXRQYXJhbWV0ZXIoImR5bmFtaWNDbGFzc05hbWUiKTsKKyAgICAgICAgQ2xhc3M8Pz4gY2xhenogPSBudWxsOworICAgICAgICBpZiAoY2xhc3Nlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgY2xhenogPSBDbGFzcy5mb3JOYW1lKGR5bmFtaWNDbGFzc05hbWUpOworICAgICAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gc3dhbGxvdyB0aGUgZXhjZXB0aW9uIC0gaWYgY2xhc3MgaXMgbm90IGxvYWRlZCwgdGhlIGludGVncmF0aW9uIHRlc3Qgd2lsbCBmYWlsCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjbGF6eiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY2xhc3Nlcy5hZGQoY2xhenopOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBjbGFzc2VzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTg0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE4NC9Nb25rZXlSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxODQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTg0L01vbmtleVJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ5MzU2YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTg0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE4NC9Nb25rZXlSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjE4NDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCisvKioKKyAqIFRlc3QgcmVzb3VyY2UgZm9yIHRoZSBzZXJ2bGV0My13ZWJhcHAgZXhhbXBsZS4KKyAqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJtb25rZXkiKQorcHVibGljIGNsYXNzIE1vbmtleVJlc291cmNlIHsKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgU3RyaW5nIGNoYXR0ZXIoKSB7CisgICAgICAgIHJldHVybiAiT29vaCEiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTg0L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE4NC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4YjE2NWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjE4NC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMy4wIiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfM18wLnhzZCI+CisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjE4NC5BcHA8L3NlcnZsZXQtbmFtZT4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyMTg0LkFwcDwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L3pvby8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKyAgICA8Y29udGV4dC1wYXJhbT4KKyAgICAgICAgPGRlc2NyaXB0aW9uPkNvbnRleHQgcGFyYW1ldGVyIHRvIHRlc3QgdGhlIGNvcnJlY3QgU2VydmxldENvbnRleHQgaW5qZWN0aW9uIGludG8gQXBwbGljYXRpb24gc3ViY2xhc3MuPC9kZXNjcmlwdGlvbj4KKyAgICAgICAgPHBhcmFtLW5hbWU+ZHluYW1pY0NsYXNzTmFtZTwvcGFyYW0tbmFtZT4KKyAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIxODQuTW9ua2V5UmVzb3VyY2U8L3BhcmFtLXZhbHVlPgorICAgIDwvY29udGV4dC1wYXJhbT4KKzwvd2ViLWFwcD4KKwpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIxODQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMTg0L0plcnNleTIxODRJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTg0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE4NC9KZXJzZXkyMTg0SVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk0MjAzZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMTg0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjE4NC9KZXJzZXkyMTg0SVRDYXNlLmphdmEKQEAgLTAsMCArMSw3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyMTg0OworCitpbXBvcnQgamF2YS5uZXQuVVJJOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3QuaGsyLkhrMkluamVjdGlvbk1hbmFnZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LkFzc3VtZTsKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0cyB0aGUgSkVSU0VZLTIxODQgZml4ICh0aGUgYWJpbGl0eSB0byBpbmplY3QgU2VydmxldENvbnRleHQgaW50byBhcHBsaWNhdGlvbiBzdWJjbGFzcyBjb25zdHJ1Y3RvcikuCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSmVyc2V5MjE4NElUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldHVwKCkgeworICAgICAgICBBc3N1bWUuYXNzdW1lVHJ1ZShIazJJbmplY3Rpb25NYW5hZ2VyRmFjdG9yeS5pc0ltbWVkaWF0ZVN0cmF0ZWd5KCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisgICAgICAgIHJldHVybiBuZXcgQXBwbGljYXRpb24oKTsgIC8vIGR1bW15IEFwcGxpY2F0aW9uIGluc3RhbmNlIGZvciB0aGUgdGVzdCBmcmFtZXdvcmsgLSB3aWxsIG5vIGJlIHVzZWQuCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVVJJIGdldEJhc2VVcmkoKSB7CisgICAgICAgIHJldHVybiBVcmlCdWlsZGVyLmZyb21Vcmkoc3VwZXIuZ2V0QmFzZVVyaSgpKS5wYXRoKCJ6b28iKS5idWlsZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIGlmIHtAbGluayBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0fSBoYXMgYmVlbiBjb3JyZWN0bHkgaW5qZWN0ZWQgaW50byB7QGxpbmsgQXBwfSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXI7CisgICAgICogVGhlIHJlc291cmNlIHVuZGVyIHRoaXMgVVJMIGlzIGJlaW5nIGxvYWRlZCBkeW5hbWljYWxseSBiYXNlZCBvbiBhIGNvbnRleHQgcGFyYW1ldGVyIGluIHRoZSB3ZWIueG1sLAorICAgICAqIHNvIGlmIGluamVjdGlvbiBmYWlscywgdGhlIHJlc291cmNlIHdpbGwgbm90IGJlIGF2YWlsYWJsZS4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbmplY3Rpb24oKSB7CisgICAgICAgIFN0cmluZyBzID0gdGFyZ2V0KCkucGF0aCgibW9ua2V5IikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk9vb2ghIiwgcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIyNTUvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMjU1L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IxZjJhZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMjU1L3BvbS54bWwKQEAgLTAsMCArMSw3MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmplcnNleS0yMjU1PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLWplcnNleS0yMjU1PC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPkZpbHRlcmluZyBoaWVyYXJjaHkgdGVzdCAtIEpFUlNFWS0yMjU1IC0gRW50aXR5IERhdGEgRmlsdGVyaW5nIHNob3VsZCBzdXBwb3J0IGluaGVyaXRlZCBmaWVsZHM8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgIAk8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQ8L2dyb3VwSWQ+CisgICAgICAgIAk8YXJ0aWZhY3RJZD5qZXJzZXktZW50aXR5LWZpbHRlcmluZzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgCTxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAJPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLW1veHk8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIyNTUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMjU1L0lzc3VlMjI1NVJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjI1NS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIyNTUvSXNzdWUyMjU1UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWMyZjM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIyNTUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMjU1L0lzc3VlMjI1NVJlc291cmNlLmphdmEKQEAgLTAsMCArMSwxMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjI1NTsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5Bbm5vdGF0aW9uTGl0ZXJhbDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5FbnRpdHlGaWx0ZXJpbmc7CisKKy8qKgorICogVGVzdCByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIEVyaWMgTWlsZXMgKGVtaWxlc3Z0IGF0IGdtYWlsLmNvbSkKKyAqLworQFBhdGgoIi8iKQorQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9qc29uIikKK0BQcm9kdWNlcygiYXBwbGljYXRpb24vanNvbiIpCitwdWJsaWMgY2xhc3MgSXNzdWUyMjU1UmVzb3VyY2UgeworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBIHsKKworICAgICAgICBwdWJsaWMgQSgpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBBKFN0cmluZyBmaWVsZEExKSB7CisgICAgICAgICAgICB0aGlzLmZpZWxkQTEgPSBmaWVsZEExOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZmllbGRBMTsKKworICAgICAgICBARGV0YWlsZWQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRGaWVsZEExKCkgeworICAgICAgICAgICAgcmV0dXJuIGZpZWxkQTE7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRGaWVsZEExKGZpbmFsIFN0cmluZyBmaWVsZEExKSB7CisgICAgICAgICAgICB0aGlzLmZpZWxkQTEgPSBmaWVsZEExOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCIGV4dGVuZHMgQSB7CisKKyAgICAgICAgcHVibGljIEIoKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQihTdHJpbmcgZmllbGRBMSwgU3RyaW5nIGZpZWxkQjEpIHsKKyAgICAgICAgICAgIHN1cGVyKGZpZWxkQTEpOworICAgICAgICAgICAgdGhpcy5maWVsZEIxID0gZmllbGRCMTsKKyAgICAgICAgfQorCisgICAgICAgIHByaXZhdGUgU3RyaW5nIGZpZWxkQjE7CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRGaWVsZEIxKCkgeworICAgICAgICAgICAgcmV0dXJuIGZpZWxkQjE7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgdm9pZCBzZXRGaWVsZEIxKGZpbmFsIFN0cmluZyBmaWVsZEIxKSB7CisgICAgICAgICAgICB0aGlzLmZpZWxkQjEgPSBmaWVsZEIxOworICAgICAgICB9CisgICAgfQorCisgICAgQFRhcmdldCh7RWxlbWVudFR5cGUuVFlQRSwgRWxlbWVudFR5cGUuTUVUSE9ELCBFbGVtZW50VHlwZS5GSUVMRH0pCisgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKKyAgICBARG9jdW1lbnRlZAorICAgIEBFbnRpdHlGaWx0ZXJpbmcKKyAgICBwdWJsaWMgc3RhdGljIEBpbnRlcmZhY2UgRGV0YWlsZWQgeworCisgICAgICAgIC8qKgorICAgICAgICAgKiBGYWN0b3J5IGNsYXNzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMgb2Yge0Bjb2RlIFByb2plY3REZXRhaWxlZFZpZXd9IGFubm90YXRpb24uCisgICAgICAgICAqLworICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEZhY3RvcnkKKyAgICAgICAgICAgICAgICBleHRlbmRzIEFubm90YXRpb25MaXRlcmFsPERldGFpbGVkPgorICAgICAgICAgICAgICAgIGltcGxlbWVudHMgRGV0YWlsZWQgeworCisgICAgICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgRGV0YWlsZWQgZ2V0KCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmFjdG9yeSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoIkEiKQorICAgIEBHRVQKKyAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0QShAUXVlcnlQYXJhbSgiZGV0YWlsZWQiKSBmaW5hbCBib29sZWFuIGlzRGV0YWlsZWQpIHsKKyAgICAgICAgcmV0dXJuIFJlc3BvbnNlCisgICAgICAgICAgICAgICAgLm9rKCkKKyAgICAgICAgICAgICAgICAuZW50aXR5KG5ldyBBKCJmaWVsZEExVmFsdWUiKSwgaXNEZXRhaWxlZCA/IG5ldyBBbm5vdGF0aW9uW10ge0RldGFpbGVkLkZhY3RvcnkuZ2V0KCl9IDogbmV3IEFubm90YXRpb25bMF0pCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgfQorCisgICAgQFBhdGgoIkIiKQorICAgIEBHRVQKKyAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0QihAUXVlcnlQYXJhbSgiZGV0YWlsZWQiKSBmaW5hbCBib29sZWFuIGlzRGV0YWlsZWQpIHsKKyAgICAgICAgcmV0dXJuIFJlc3BvbnNlCisgICAgICAgICAgICAgICAgLm9rKCkKKyAgICAgICAgICAgICAgICAuZW50aXR5KG5ldyBCKCJmaWVsZEExVmFsdWUiLCAiZmllbGRCMVZhbHVlIiksCisgICAgICAgICAgICAgICAgICAgICAgICBpc0RldGFpbGVkID8gbmV3IEFubm90YXRpb25bXSB7RGV0YWlsZWQuRmFjdG9yeS5nZXQoKX0gOiBuZXcgQW5ub3RhdGlvblswXSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMjU1L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjI1NS9KZXJzZXkyMjU1LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjI1NS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIyNTUvSmVyc2V5MjI1NS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZGQxYjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjI1NS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIyNTUvSmVyc2V5MjI1NS5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjI1NTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLkVudGl0eUZpbHRlcmluZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCisvKioKKyAqIEpBWC1SUyBhcHBsaWNhdGlvbiBmb3IgdGhlIEpFUlNFWS0yMjU1IHJlcHJvZHVjZXIgdGVzdC4KKyAqCisgKiBAYXV0aG9yIEVyaWMgTWlsZXMgKGVtaWxlc3Z0IGF0IGdtYWlsLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEplcnNleTIyNTUgZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisKKyAgICBwdWJsaWMgSmVyc2V5MjI1NSgpIHsKKyAgICAgICAgcmVnaXN0ZXIoSXNzdWUyMjU1UmVzb3VyY2UuY2xhc3MpOworICAgICAgICByZWdpc3RlcihFbnRpdHlGaWx0ZXJpbmdGZWF0dXJlLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjI1NS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIyNTUvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmIwNTBjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIyNTUvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDM1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjIuNSIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzJfNS54c2QiPgorICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPmplcnNleTIyNTVTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC53cy5ycy5BcHBsaWNhdGlvbjwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyMjU1LkplcnNleTIyNTU8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPmplcnNleTIyNTVTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjI1NS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIyNTUvSmVyc2V5MjI1NUlUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIyNTUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMjU1L0plcnNleTIyNTVJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTk2ZWJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIyNTUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMjU1L0plcnNleTIyNTVJVENhc2UuamF2YQpAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIyNTU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyMjU1Lklzc3VlMjI1NVJlc291cmNlLkE7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjI1NS5Jc3N1ZTIyNTVSZXNvdXJjZS5COworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworCisvKioKKyAqIFJlcHJvZHVjZXIgdGVzdHMgZm9yIEpFUlNFWS0yMjU1LgorICoKKyAqIEBhdXRob3IgRXJpYyBNaWxlcyAoZW1pbGVzdnQgYXQgZ21haWwuY29tKQorICovCitwdWJsaWMgY2xhc3MgSmVyc2V5MjI1NUlUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKTsKKworICAgICAgICByZXR1cm4gbmV3IEplcnNleTIyNTUoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlcnZlciBzaWRlIHJlc3BvbnNlIGlzIHdyYXBwZWQsIG5lZWRzIHRvIGJlIHJlYWQgdG8gd3JhcHBlciBjbGFzcy4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDbGFzc0FHZXQoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJBIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBmaW5hbCBBIGVudGl0eSA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoQS5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgZXF1YWxUbygyMDApKTsKKyAgICAgICAgYXNzZXJ0TnVsbChlbnRpdHkuZ2V0RmllbGRBMSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZXRhaWxlZENsYXNzQUdldCgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoIkEiKS5xdWVyeVBhcmFtKCJkZXRhaWxlZCIsIHRydWUpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgZmluYWwgQSBlbnRpdHkgPSByZXNwb25zZS5yZWFkRW50aXR5KEEuY2xhc3MpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmdldEZpZWxkQTEoKSwgZXF1YWxUbygiZmllbGRBMVZhbHVlIikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlcnZlciBzaWRlIHJlc3BvbnNlIGlzIHJldHVybmVkIGFzIG9yaWcgY2xhc3MuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RGV0YWlsZWRDbGFzc0JHZXQoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJCIikucXVlcnlQYXJhbSgiZGV0YWlsZWQiLCB0cnVlKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGZpbmFsIEIgZW50aXR5ID0gcmVzcG9uc2UucmVhZEVudGl0eShCLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KGVudGl0eS5nZXRGaWVsZEExKCksIGVxdWFsVG8oImZpZWxkQTFWYWx1ZSIpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChlbnRpdHkuZ2V0RmllbGRCMSgpLCBlcXVhbFRvKCJmaWVsZEIxVmFsdWUiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q2xhc3NCR2V0KCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiQiIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgZmluYWwgQiBlbnRpdHkgPSByZXNwb25zZS5yZWFkRW50aXR5KEIuY2xhc3MpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oMjAwKSk7CisgICAgICAgIGFzc2VydE51bGwoZW50aXR5LmdldEZpZWxkQTEoKSk7CisgICAgICAgIGFzc2VydFRoYXQoZW50aXR5LmdldEZpZWxkQjEoKSwgZXF1YWxUbygiZmllbGRCMVZhbHVlIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMzIyL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjMyMi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NGFhNmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjMyMi9wb20ueG1sCkBAIC0wLDAgKzEsNzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktMjMyMjwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1qZXJzZXktMjMyMjwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5TZXJ2bGV0IGludGVncmF0aW9uIHRlc3QgLSBKRVJTRVktMjMyMiAtIE5vIHdheSB0byBjb25maWd1cmUgYXV0by1kaXNjb3ZlcmVkIEphY2tzb24gMi54IE9iamVjdE1hcHBlcjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLWpzb24tamFja3NvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZXRhaW5mLXNlcnZpY2VzPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMzIyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjMyMi9Jc3N1ZTIzMjJSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIzMjIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMzIyL0lzc3VlMjMyMlJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U4YjA1ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMzIyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjMyMi9Jc3N1ZTIzMjJSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjMyMjsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLlBVVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCisvKioKKyAqIFRlc3QgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIi8iKQorQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9qc29uIikKK0BQcm9kdWNlcygiYXBwbGljYXRpb24vanNvbiIpCitwdWJsaWMgY2xhc3MgSXNzdWUyMzIyUmVzb3VyY2UgeworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBKc29uU3RyaW5nMSB7CisgICAgICAgIHByaXZhdGUgU3RyaW5nIHZhbHVlOworCisgICAgICAgIHB1YmxpYyBKc29uU3RyaW5nMSgpIHsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgSnNvblN0cmluZzEoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpIHsKKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSnNvblN0cmluZzIgeworICAgICAgICBwcml2YXRlIFN0cmluZyB2YWx1ZTsKKworICAgICAgICBwdWJsaWMgSnNvblN0cmluZzIoKSB7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIEpzb25TdHJpbmcyKFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOworICAgICAgICB9CisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nIHZhbHVlKSB7CisgICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAUGF0aCgiMSIpCisgICAgQFBVVAorICAgIHB1YmxpYyBKc29uU3RyaW5nMSBwdXQoZmluYWwgSnNvblN0cmluZzEgd3JhcHBlcikgeworICAgICAgICByZXR1cm4gbmV3IEpzb25TdHJpbmcxKCJIZWxsbyAiICsgd3JhcHBlci5nZXRWYWx1ZSgpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiMiIpCisgICAgQFBVVAorICAgIHB1YmxpYyBKc29uU3RyaW5nMiBwdXQoZmluYWwgSnNvblN0cmluZzIgd3JhcHBlcikgeworICAgICAgICByZXR1cm4gbmV3IEpzb25TdHJpbmcyKCJIaSAiICsgd3JhcHBlci5nZXRWYWx1ZSgpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMzIyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjMyMi9KZXJzZXkyMzIyLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjMyMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIzMjIvSmVyc2V5MjMyMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNzljMWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjMyMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIzMjIvSmVyc2V5MjMyMi5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjMyMjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uSmFja3NvbkZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCisvKioKKyAqIEpBWC1SUyBhcHBsaWNhdGlvbiBmb3IgdGhlIEpFUlNFWS0yMzIyIHJlcHJvZHVjZXIgdGVzdC4KKyAqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSmVyc2V5MjMyMiBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKworICAgIHB1YmxpYyBKZXJzZXkyMzIyKCkgeworICAgICAgICByZWdpc3RlcihJc3N1ZTIzMjJSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJlZ2lzdGVyKEphY2tzb25GZWF0dXJlLmNsYXNzKTsKKyAgICAgICAgcmVnaXN0ZXIoTXlPYmplY3RNYXBwZXJQcm92aWRlci5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIzMjIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMzIyL015T2JqZWN0TWFwcGVyUHJvdmlkZXIuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMzIyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjMyMi9NeU9iamVjdE1hcHBlclByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFmZTYzMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMzIyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjMyMi9NeU9iamVjdE1hcHBlclByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyMzIyOworCitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLkRlc2VyaWFsaXphdGlvbkZlYXR1cmU7CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLk9iamVjdE1hcHBlcjsKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uZGF0YWJpbmQuU2VyaWFsaXphdGlvbkZlYXR1cmU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuQ29udGV4dFJlc29sdmVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworLyoqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitAUHJvdmlkZXIKK3B1YmxpYyBjbGFzcyBNeU9iamVjdE1hcHBlclByb3ZpZGVyIGltcGxlbWVudHMgQ29udGV4dFJlc29sdmVyPE9iamVjdE1hcHBlcj4geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdE1hcHBlciBnZXRDb250ZXh0KENsYXNzPD8+IHR5cGUpIHsKKyAgICAgICAgaWYgKHR5cGUgPT0gSXNzdWUyMzIyUmVzb3VyY2UuSnNvblN0cmluZzEuY2xhc3MpIHsKKyAgICAgICAgICAgIE9iamVjdE1hcHBlciByZXN1bHQgPSBuZXcgT2JqZWN0TWFwcGVyKCk7CisgICAgICAgICAgICByZXN1bHQuY29uZmlndXJlKFNlcmlhbGl6YXRpb25GZWF0dXJlLldSQVBfUk9PVF9WQUxVRSwgdHJ1ZSk7CisgICAgICAgICAgICByZXN1bHQuY29uZmlndXJlKERlc2VyaWFsaXphdGlvbkZlYXR1cmUuVU5XUkFQX1JPT1RfVkFMVUUsIGZhbHNlKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE9iamVjdE1hcHBlcigpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIzMjIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMzIyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI3YWQyNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMzIyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIyLjUiIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIj4KKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5qZXJzZXkyMzIyU2VydmxldDwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjMyMi5KZXJzZXkyMzIyPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5qZXJzZXkyMzIyU2VydmxldDwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIzMjIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMzIyL0plcnNleTIzMjJJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMzIyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjMyMi9KZXJzZXkyMzIySVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY5NzNhOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMzIyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjMyMi9KZXJzZXkyMzIySVRDYXNlLmphdmEKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyMzIyOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBjb20uZmFzdGVyeG1sLmphY2tzb24uYW5ub3RhdGlvbi5Kc29uUHJvcGVydHk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIFJlcHJvZHVjZXIgdGVzdHMgZm9yIEpFUlNFWS0yMzIyLgorICoKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXkyMzIySVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworICAgICAgICByZXR1cm4gbmV3IEplcnNleTIzMjIoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFNlcnZlciBzaWRlIHJlc3BvbnNlIGlzIHdyYXBwZWQsIG5lZWRzIHRvIGJlIHJlYWQgdG8gd3JhcHBlciBjbGFzcy4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKYWNrc29uMkpzb25QdXQxKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiMSIpLnJlcXVlc3QoKS5wdXQoRW50aXR5Lmpzb24obmV3IElzc3VlMjMyMlJlc291cmNlLkpzb25TdHJpbmcxKCJmb28iKSkpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShXcmFwcGVyMS5jbGFzcykuZ2V0SnNvblN0cmluZzEoKS5nZXRWYWx1ZSgpLCBlcXVhbFRvKCJIZWxsbyBmb28iKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2VydmVyIHNpZGUgcmVzcG9uc2UgaXMgcmV0dXJuZWQgYXMgb3JpZyBjbGFzcy4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKYWNrc29uMkpzb25QdXQyKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiMiIpLnJlcXVlc3QoKS5wdXQoRW50aXR5Lmpzb24obmV3IElzc3VlMjMyMlJlc291cmNlLkpzb25TdHJpbmcyKCJmb28iKSkpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShJc3N1ZTIzMjJSZXNvdXJjZS5Kc29uU3RyaW5nMi5jbGFzcykuZ2V0VmFsdWUoKSwgZXF1YWxUbygiSGkgZm9vIikpOworICAgIH0KKworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBXcmFwcGVyMSB7CisgICAgICAgIEBKc29uUHJvcGVydHkoIkpzb25TdHJpbmcxIikKKyAgICAgICAgSXNzdWUyMzIyUmVzb3VyY2UuSnNvblN0cmluZzEganNvblN0cmluZzE7CisKKyAgICAgICAgcHVibGljIElzc3VlMjMyMlJlc291cmNlLkpzb25TdHJpbmcxIGdldEpzb25TdHJpbmcxKCkgeworICAgICAgICAgICAgcmV0dXJuIGpzb25TdHJpbmcxOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHZvaWQgc2V0SnNvblN0cmluZzEoSXNzdWUyMzIyUmVzb3VyY2UuSnNvblN0cmluZzEganNvblN0cmluZzEpIHsKKyAgICAgICAgICAgIHRoaXMuanNvblN0cmluZzEgPSBqc29uU3RyaW5nMTsKKyAgICAgICAgfQorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIzMzUvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMzM1L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc1YmVkOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMzM1L3BvbS54bWwKQEAgLTAsMCArMSw2OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmplcnNleS0yMzM1PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLWplcnNleS0yMzM1PC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPlNlcnZsZXQgaW50ZWdyYXRpb24gdGVzdCAtIEpFUlNFWS0yMzM1IC0gUHJvdmlkZXJzIGRvIG5vdCBnZXQgaW5qZWN0ZWQgcHJvcGVybHk8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWV0YWluZi1zZXJ2aWNlczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjMzNS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIzMzUvQ29uc3RydWN0b3JJbmplY3RlZFByb3ZpZGVyLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjMzNS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIzMzUvQ29uc3RydWN0b3JJbmplY3RlZFByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y1OWQwMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMzM1L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjMzNS9Db25zdHJ1Y3RvckluamVjdGVkUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIzMzU7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKKworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyczsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuTWVzc2FnZVV0aWxzOworCisvKioKKyAqIENvbnN0cnVjdG9yIGluamVjdGVkIHByb3ZpZGVyIHRvIHByb3ZlIHRoYXQgcHJvdmlkZXIgcmVnaXN0ZXJlZCB2aWEgbWV0YS1pbmYvc2VydmljZXMKKyAqIG1lY2hhbmlzbSBnZXRzIGNvbnN0cnVjdGVkIHZpYSBISzIgYW5kIHNvIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXJzIGFyZSBwcm9wZXJseSBpbmplY3RlZC4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUHJvdmlkZXIKK0BQcm9kdWNlcygidGV4dC9jdG9yLWluamVjdGVkIikKK3B1YmxpYyBjbGFzcyBDb25zdHJ1Y3RvckluamVjdGVkUHJvdmlkZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVdyaXRlcjxTdHJpbmc+IHsKKworICAgIFByb3ZpZGVycyBwcm92aWRlcnM7CisKKyAgICBwdWJsaWMgQ29uc3RydWN0b3JJbmplY3RlZFByb3ZpZGVyKEBDb250ZXh0IGZpbmFsIFByb3ZpZGVycyBwcm92aWRlcnMpIHsKKyAgICAgICAgdGhpcy5wcm92aWRlcnMgPSBwcm92aWRlcnM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHR5cGUgPT0gU3RyaW5nLmNsYXNzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGdldFNpemUoZmluYWwgU3RyaW5nIHQsIGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oZmluYWwgU3RyaW5nIHQsIGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUsIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICBmaW5hbCBNZXNzYWdlQm9keVdyaXRlcjxTdHJpbmc+IHBsYWluVGV4dFdyaXRlciA9CisgICAgICAgICAgICAgICAgcHJvdmlkZXJzLmdldE1lc3NhZ2VCb2R5V3JpdGVyKFN0cmluZy5jbGFzcywgZ2VuZXJpY1R5cGUsIGFubm90YXRpb25zLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKTsKKyAgICAgICAgZW50aXR5U3RyZWFtLndyaXRlKCJ2aWEgY3RvciBpbmplY3RlZCBwcm92aWRlcjoiLmdldEJ5dGVzKE1lc3NhZ2VVdGlscy5nZXRDaGFyc2V0KG1lZGlhVHlwZSkpKTsKKyAgICAgICAgcGxhaW5UZXh0V3JpdGVyLndyaXRlVG8odCwgdHlwZSwgZ2VuZXJpY1R5cGUsIGFubm90YXRpb25zLCBtZWRpYVR5cGUsIGh0dHBIZWFkZXJzLCBlbnRpdHlTdHJlYW0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMzM1L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjMzNS9GaWVsZEluamVjdGVkUHJvdmlkZXIuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMzM1L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjMzNS9GaWVsZEluamVjdGVkUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzZiYzA4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIzMzUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMzM1L0ZpZWxkSW5qZWN0ZWRQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjMzNTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworCitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXJzOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5NZXNzYWdlVXRpbHM7CisKKy8qKgorICogRmllbGQgaW5qZWN0ZWQgcHJvdmlkZXIgdG8gcHJvdmUgdGhhdCBwcm92aWRlciByZWdpc3RlcmVkIHZpYSBtZXRhLWluZi9zZXJ2aWNlcworICogbWVjaGFuaXNtIGdldHMgaW5qZWN0ZWQgdmlhIEhLMi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUHJvdmlkZXIKK0BQcm9kdWNlcygidGV4dC9maWVsZC1pbmplY3RlZCIpCitwdWJsaWMgY2xhc3MgRmllbGRJbmplY3RlZFByb3ZpZGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8U3RyaW5nPiB7CisKKyAgICBAQ29udGV4dCBQcm92aWRlcnMgcHJvdmlkZXJzOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHR5cGUgPT0gU3RyaW5nLmNsYXNzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGdldFNpemUoZmluYWwgU3RyaW5nIHQsIGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oZmluYWwgU3RyaW5nIHQsIGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUsIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICBmaW5hbCBNZXNzYWdlQm9keVdyaXRlcjxTdHJpbmc+IHBsYWluVGV4dFdyaXRlciA9CisgICAgICAgICAgICAgICAgcHJvdmlkZXJzLmdldE1lc3NhZ2VCb2R5V3JpdGVyKFN0cmluZy5jbGFzcywgZ2VuZXJpY1R5cGUsIGFubm90YXRpb25zLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKTsKKyAgICAgICAgZW50aXR5U3RyZWFtLndyaXRlKCJ2aWEgZmllbGQgaW5qZWN0ZWQgcHJvdmlkZXI6Ii5nZXRCeXRlcyhNZXNzYWdlVXRpbHMuZ2V0Q2hhcnNldChtZWRpYVR5cGUpKSk7CisgICAgICAgIHBsYWluVGV4dFdyaXRlci53cml0ZVRvKHQsIHR5cGUsIGdlbmVyaWNUeXBlLCBhbm5vdGF0aW9ucywgbWVkaWFUeXBlLCBodHRwSGVhZGVycywgZW50aXR5U3RyZWFtKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjMzNS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIzMzUvSXNzdWUyMzM1UmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMzM1L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjMzNS9Jc3N1ZTIzMzVSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YTQ0ZjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjMzNS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIzMzUvSXNzdWUyMzM1UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIzMzU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKKworLyoqCisgKiBUZXN0IHJlc291cmNlIHRoYXQgcHJvdmlkZXMgYSBzaW1wbGUgdGV4dCByZXNwb25zZS4KKyAqIFRoZSByZXNwb25zZSB0ZXh0IHRoZW4gZ2V0cyBzZXJpYWxpemVkIHVzaW5nIG1lc3NhZ2UgYm9keSB3cml0ZXIKKyAqIHNwZWNpZmllZCBieSBtZWRpYSB0eXBlLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCIvdGV4dCIpCitwdWJsaWMgY2xhc3MgSXNzdWUyMzM1UmVzb3VyY2UgeworCisgICAgQEdFVAorICAgIEBQcm9kdWNlcygidGV4dC8qIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgcmV0dXJuICJIZXkiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMzM1L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjMzNS9KZXJzZXkyMzM1LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjMzNS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIzMzUvSmVyc2V5MjMzNS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZmY3ZTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjMzNS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTIzMzUvSmVyc2V5MjMzNS5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjMzNTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworLyoqCisgKiBKQVgtUlMgYXBwbGljYXRpb24gZm9yIHRoZSBKRVJTRVktMjMzNSByZXByb2R1Y2VyIHRlc3QuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEplcnNleTIzMzUgZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisKKyAgICBwdWJsaWMgSmVyc2V5MjMzNSgpIHsKKyAgICAgICAgcmVnaXN0ZXIoSXNzdWUyMzM1UmVzb3VyY2UuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMzM1L3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9qYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXIgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjMzNS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1YmNhOGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjMzNS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyCkBAIC0wLDAgKzEsMiBAQAorb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjMzNS5GaWVsZEluamVjdGVkUHJvdmlkZXIKK29yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTIzMzUuQ29uc3RydWN0b3JJbmplY3RlZFByb3ZpZGVyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIzMzUvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMzM1L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZkOGI0YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMzM1L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIyLjUiIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIj4KKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5qZXJzZXkyMzM1U2VydmxldDwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjMzNS5KZXJzZXkyMzM1PC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5qZXJzZXkyMzM1U2VydmxldDwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTIzMzUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyMzM1L0plcnNleTIzMzVJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMzM1L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjMzNS9KZXJzZXkyMzM1SVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZhNTczMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yMzM1L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjMzNS9KZXJzZXkyMzM1SVRDYXNlLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyMzM1OworCitpbXBvcnQgamF2YS5uZXQuQ29ubmVjdEV4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLlByb2Nlc3NpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICogUmVwcm9kdWNlciB0ZXN0cyBmb3IgSkVSU0VZLTIzMzUuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEplcnNleTIzMzVJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgSmVyc2V5MjMzNSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0RmllbGRJbmplY3RlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInRleHQiKS5yZXF1ZXN0KCkuYWNjZXB0KCJ0ZXh0L2ZpZWxkLWluamVjdGVkIikuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgZXF1YWxUbygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGVxdWFsVG8oInZpYSBmaWVsZCBpbmplY3RlZCBwcm92aWRlcjpIZXkiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0Q29uc3RydWN0b3JJbmplY3RlZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInRleHQiKS5yZXF1ZXN0KCkuYWNjZXB0KCJ0ZXh0L2N0b3ItaW5qZWN0ZWQiKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBlcXVhbFRvKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgZXF1YWxUbygidmlhIGN0b3IgaW5qZWN0ZWQgcHJvdmlkZXI6SGV5IikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNDIxL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjQyMS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYWUwMTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjQyMS9wb20ueG1sCkBAIC0wLDAgKzEsNjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktMjQyMTwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1qZXJzZXktMjQyMTwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5DbGllbnQgaW50ZWdyYXRpb24gdGVzdCAtIEpFUlNFWS0yNDIxIC0gTXVsdGlQYXJ0RmVhdHVyZSByZXF1aXJlcyBqZXJzZXktc2VydmVyIHRvIGJlIG9uIHRoZSBjbGFzcy1wYXRoPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jbGllbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1tdWx0aXBhcnQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNDIxL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjQyMS9KZXJzZXkyNDIxVGVzdC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI0MjEvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNDIxL0plcnNleTI0MjFUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM3MTE4NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNDIxL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjQyMS9KZXJzZXkyNDIxVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTIyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI0MjE7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5zcGkuQXN5bmNDb25uZWN0b3JDYWxsYmFjazsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuc3BpLkNvbm5lY3RvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuc3BpLkNvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5Gb3JtRGF0YUJvZHlQYXJ0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5Gb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuRm9ybURhdGFNdWx0aVBhcnQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0Lk11bHRpUGFydDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuTXVsdGlQYXJ0RmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmludGVybmFsLk51bGxPdXRwdXRTdHJlYW07CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5pbnRlcm5hbC5PdXRib3VuZE1lc3NhZ2VDb250ZXh0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogUmVwcm9kdWNlciB0ZXN0cyBmb3IgSkVSU0VZLTI0MjEuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXkyNDIxVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBUZXN0Q29ubmVjdG9yIGltcGxlbWVudHMgQ29ubmVjdG9yLCBDb25uZWN0b3JQcm92aWRlciB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDbGllbnRSZXNwb25zZSBhcHBseShmaW5hbCBDbGllbnRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmVxdWVzdC5zZXRTdHJlYW1Qcm92aWRlcihuZXcgT3V0Ym91bmRNZXNzYWdlQ29udGV4dC5TdHJlYW1Qcm92aWRlcigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBPdXRwdXRTdHJlYW0gZ2V0T3V0cHV0U3RyZWFtKGZpbmFsIGludCBjb250ZW50TGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBOdWxsT3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LndyaXRlRW50aXR5KCk7CisKKyAgICAgICAgICAgICAgICBpZiAocmVxdWVzdC5nZXRIZWFkZXJTdHJpbmcoIkNvbnRlbnQtVHlwZSIpLmNvbnRhaW5zKCJib3VuZGFyeSIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ2xpZW50UmVzcG9uc2UoUmVzcG9uc2UuU3RhdHVzLk9LLCByZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBpb2UpIHsKKyAgICAgICAgICAgICAgICAvLyBOT09QCisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbmV3IENsaWVudFJlc3BvbnNlKFJlc3BvbnNlLlN0YXR1cy5CQURfUkVRVUVTVCwgcmVxdWVzdCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEZ1dHVyZTw/PiBhcHBseShmaW5hbCBDbGllbnRSZXF1ZXN0IHJlcXVlc3QsIGZpbmFsIEFzeW5jQ29ubmVjdG9yQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIGNsb3NlKCkgeworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDb25uZWN0b3IgZ2V0Q29ubmVjdG9yKGZpbmFsIENsaWVudCBjbGllbnQsIGZpbmFsIENvbmZpZ3VyYXRpb24gcnVudGltZUNvbmZpZykgeworICAgICAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoYXQgbXVsdGlwYXJ0IGZlYXR1cmUgd29ya3Mgb24gdGhlIGNsaWVudC1zaWRlIC0gY3VzdG9tIGNvbm5lY3RvciBjaGVja3MgcHJlc2VuY2Ugb2Yge0Bjb2RlIGJvdW5kYXJ5fSBwYXJhbWV0ZXIgaW4KKyAgICAgKiB0aGUge0Bjb2RlIENvbnRlbnQtVHlwZX0gaGVhZGVyICh0aGUgaGVhZGVyIGlzIGFkZGVkIHRvIHRoZSByZXF1ZXN0IGluIE1CVykuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlQYXJ0RmVhdHVyZU9uQ2xpZW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudChuZXcgQ2xpZW50Q29uZmlnKCkuY29ubmVjdG9yUHJvdmlkZXIobmV3IFRlc3RDb25uZWN0b3IoKSkpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKE11bHRpUGFydEZlYXR1cmUuY2xhc3MpOworCisgICAgICAgIGZpbmFsIE11bHRpUGFydCBlbnRpdHkgPSBuZXcgRm9ybURhdGFNdWx0aVBhcnQoKQorICAgICAgICAgICAgICAgIC5ib2R5UGFydChuZXcgRm9ybURhdGFCb2R5UGFydChGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbi5uYW1lKCJwYXJ0IikuYnVpbGQoKSwgIkNPTlRFTlQiKSk7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSBjbGllbnQudGFyZ2V0KCJodHRwOi8vbG9jYWxob3N0IikucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eShlbnRpdHksIE1lZGlhVHlwZS5NVUxUSVBBUlRfRk9STV9EQVRBX1RZUEUpKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcygyMDApKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRoYXQgY2xhc3NlcyBmcm9tIGplcnNleS1zZXJ2ZXIgbW9kdWxlIGNhbm5vdCBiZSBsb2FkZWQuCisgICAgICovCisgICAgQFRlc3QoZXhwZWN0ZWQgPSBDbGFzc05vdEZvdW5kRXhjZXB0aW9uLmNsYXNzKQorICAgIHB1YmxpYyB2b2lkIHRlc3RMb2FkSmVyc2V5U2VydmVyQ2xhc3MoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgQ2xhc3MuZm9yTmFtZSgib3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI1NTEvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNTUxL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNmZDhmYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNTUxL3BvbS54bWwKQEAgLTAsMCArMSw2NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmplcnNleS0yNTUxPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLWplcnNleS0yNTUxPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPlNlcnZsZXQgaW50ZWdyYXRpb24gdGVzdCAtIEpFUlNFWS0yNTUxIC0gSW5qZWN0aW9ucyNnZW5lcmF0b3IgZmllbGQgaXMgaGFyZCBjb2RlZCB0byBTZXJ2aWNlTG9jYXRvckdlbmVyYXRvckltcGw8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI1NTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNTUxL0plcnNleTI1NTEuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNTUxL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjU1MS9KZXJzZXkyNTUxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNmMzI3NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNTUxL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjU1MS9KZXJzZXkyNTUxLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyNTUxOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCisvKioKKyAqIEpBWC1SUyBhcHBsaWNhdGlvbiBmb3IgdGhlIEpFUlNFWS0yNTUxIHJlcHJvZHVjZXIgdGVzdC4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEplcnNleTI1NTEgZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisKKyAgICBwdWJsaWMgSmVyc2V5MjU1MSgpIHsKKyAgICAgICAgcmVnaXN0ZXIoUmVzb3VyY2UuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNTUxL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjU1MS9SZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI1NTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNTUxL1Jlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRkYmU4OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNTUxL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjU1MS9SZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjU1MTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIuYXBpLlNlcnZpY2VMb2NhdG9yOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUGF0aCgiLyIpCitwdWJsaWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgQEluamVjdAorICAgIHByaXZhdGUgU2VydmljZUxvY2F0b3IgbG9jYXRvcjsKKworICAgIEBHRVQKKyAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0KCkgeworICAgICAgICByZXR1cm4gbG9jYXRvciBpbnN0YW5jZW9mIFNlcnZpY2VMb2NhdG9yR2VuZXJhdG9yLkN1c3RvbVNlcnZpY2VMb2NhdG9yCisgICAgICAgICAgICA/IFJlc3BvbnNlLm9rKCkuYnVpbGQoKSA6IFJlc3BvbnNlLnNlcnZlckVycm9yKCkuYnVpbGQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjU1MS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI1NTEvU2VydmljZUxvY2F0b3JHZW5lcmF0b3IuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNTUxL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjU1MS9TZXJ2aWNlTG9jYXRvckdlbmVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMGJhNDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjU1MS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI1NTEvU2VydmljZUxvY2F0b3JHZW5lcmF0b3IuamF2YQpAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI1NTE7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIuYXBpLkR5bmFtaWNDb25maWd1cmF0aW9uU2VydmljZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi5hcGkuU2VydmljZUxvY2F0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIudXRpbGl0aWVzLkJ1aWxkZXJIZWxwZXI7CisKK2ltcG9ydCBvcmcuanZuZXQuaGsyLmV4dGVybmFsLmdlbmVyYXRvci5TZXJ2aWNlTG9jYXRvckdlbmVyYXRvckltcGw7CitpbXBvcnQgb3JnLmp2bmV0LmhrMi5pbnRlcm5hbC5EZWZhdWx0Q2xhc3NBbmFseXplcjsKK2ltcG9ydCBvcmcuanZuZXQuaGsyLmludGVybmFsLkR5bmFtaWNDb25maWd1cmF0aW9uSW1wbDsKK2ltcG9ydCBvcmcuanZuZXQuaGsyLmludGVybmFsLkR5bmFtaWNDb25maWd1cmF0aW9uU2VydmljZUltcGw7CitpbXBvcnQgb3JnLmp2bmV0LmhrMi5pbnRlcm5hbC5TZXJ2aWNlTG9jYXRvckltcGw7CitpbXBvcnQgb3JnLmp2bmV0LmhrMi5pbnRlcm5hbC5VdGlsaXRpZXM7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBTZXJ2aWNlTG9jYXRvckdlbmVyYXRvciBleHRlbmRzIFNlcnZpY2VMb2NhdG9yR2VuZXJhdG9ySW1wbCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2VydmljZUxvY2F0b3IgY3JlYXRlKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBTZXJ2aWNlTG9jYXRvciBwYXJlbnQpIHsKKyAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsICYmICEocGFyZW50IGluc3RhbmNlb2YgU2VydmljZUxvY2F0b3JJbXBsKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCJwYXJlbnQgbXVzdCBiZSBhICIgKyBTZXJ2aWNlTG9jYXRvckltcGwuY2xhc3MuZ2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICsgIiBpbnN0ZWFkIGl0IGlzIGEgIiArIHBhcmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBTZXJ2aWNlTG9jYXRvckltcGwgc2xpID0gbmV3IEN1c3RvbVNlcnZpY2VMb2NhdG9yKG5hbWUsIChTZXJ2aWNlTG9jYXRvckltcGwpIHBhcmVudCk7CisKKyAgICAgICAgZmluYWwgRHluYW1pY0NvbmZpZ3VyYXRpb25JbXBsIGRjaSA9IG5ldyBEeW5hbWljQ29uZmlndXJhdGlvbkltcGwoc2xpKTsKKworICAgICAgICAvLyBUaGUgc2VydmljZSBsb2NhdG9yIGl0c2VsZgorICAgICAgICBkY2kuYmluZChVdGlsaXRpZXMuZ2V0TG9jYXRvckRlc2NyaXB0b3Ioc2xpKSk7CisKKyAgICAgICAgLy8gVGhlIGluamVjdGlvbiByZXNvbHZlciBmb3IgdGhyZWUgdGhpcnR5CisgICAgICAgIGRjaS5hZGRBY3RpdmVEZXNjcmlwdG9yKFV0aWxpdGllcy5nZXRUaHJlZVRoaXJ0eURlc2NyaXB0b3Ioc2xpKSk7CisKKyAgICAgICAgLy8gVGhlIGR5bmFtaWMgY29uZmlndXJhdGlvbiB1dGlsaXR5CisgICAgICAgIGRjaS5iaW5kKEJ1aWxkZXJIZWxwZXIubGluayhEeW5hbWljQ29uZmlndXJhdGlvblNlcnZpY2VJbXBsLmNsYXNzLCBmYWxzZSkKKyAgICAgICAgICAgICAgICAudG8oRHluYW1pY0NvbmZpZ3VyYXRpb25TZXJ2aWNlLmNsYXNzKQorICAgICAgICAgICAgICAgIC5pbihTaW5nbGV0b24uY2xhc3MuZ2V0TmFtZSgpKQorICAgICAgICAgICAgICAgIC5sb2NhbE9ubHkoKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBkY2kuYmluZChCdWlsZGVySGVscGVyLmNyZWF0ZUNvbnN0YW50RGVzY3JpcHRvcigKKyAgICAgICAgICAgICAgICBuZXcgRGVmYXVsdENsYXNzQW5hbHl6ZXIoc2xpKSkpOworCisgICAgICAgIGRjaS5jb21taXQoKTsKKworICAgICAgICByZXR1cm4gc2xpOworICAgIH0KKworICAgIGNsYXNzIEN1c3RvbVNlcnZpY2VMb2NhdG9yIGV4dGVuZHMgU2VydmljZUxvY2F0b3JJbXBsIHsKKworICAgICAgICBwdWJsaWMgQ3VzdG9tU2VydmljZUxvY2F0b3IoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFNlcnZpY2VMb2NhdG9ySW1wbCBwYXJlbnQpIHsKKyAgICAgICAgICAgIHN1cGVyKG5hbWUsIHBhcmVudCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjU1MS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5oazIuZXh0ZW5zaW9uLlNlcnZpY2VMb2NhdG9yR2VuZXJhdG9yIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI1NTEvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guaGsyLmV4dGVuc2lvbi5TZXJ2aWNlTG9jYXRvckdlbmVyYXRvcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDcwZjZmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI1NTEvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guaGsyLmV4dGVuc2lvbi5TZXJ2aWNlTG9jYXRvckdlbmVyYXRvcgpAQCAtMCwwICsxIEBACitvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyNTUxLlNlcnZpY2VMb2NhdG9yR2VuZXJhdG9yClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI1NTEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNTUxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWExYmQ1MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNTUxL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIyLjUiIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIj4KKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5qZXJzZXkyNTUxU2VydmxldDwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjU1MS5KZXJzZXkyNTUxPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5qZXJzZXkyNTUxU2VydmxldDwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI1NTEvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNTUxL0plcnNleTI1NTFJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNTUxL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjU1MS9KZXJzZXkyNTUxSVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ1ZTFiNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNTUxL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjU1MS9KZXJzZXkyNTUxSVRDYXNlLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyNTUxOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIFJlcHJvZHVjZXIgdGVzdHMgZm9yIEpFUlNFWS0yNTUxLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgSmVyc2V5MjU1MUlUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKZXJzZXkyNTUxKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2aWNlTG9jYXRvclNlcnZlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBhc3NlcnRUaGF0KHRhcmdldCgpLnJlcXVlc3QoKS5nZXQoKS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2MTIvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjEyL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZlNTVhYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjEyL3BvbS54bWwKQEAgLTAsMCArMSw3MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmplcnNleS0yNjEyPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLWplcnNleS0yNjEyPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPlNlcnZsZXQgaW50ZWdyYXRpb24gdGVzdCAtIEpFUlNFWS0yNjEyIC0gU2luZ2xlVmFsdWVFeHRyYWN0b3IgbWFrZXMgaXQgaW1wb3NzaWJsZSB0byBzdXBwb3J0IGphdmEudXRpbC5PcHRpb25hbCAob3IgR3VhdmEgT3B0aW9uYWwpLjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5ndWF2YTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmd1YXZhPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjEyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjYxMi9KZXJzZXkyNjEyLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjYxMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2MTIvSmVyc2V5MjYxMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYjY3OTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjYxMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2MTIvSmVyc2V5MjYxMi5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjYxMjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworLyoqCisgKiBKQVgtUlMgYXBwbGljYXRpb24gZm9yIHRoZSBKRVJTRVktMjYxMiByZXByb2R1Y2VyIHRlc3QuCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXkyNjEyIGV4dGVuZHMgUmVzb3VyY2VDb25maWcgeworCisgICAgcHVibGljIEplcnNleTI2MTIoKSB7CisgICAgICAgIHJlZ2lzdGVyKFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgcmVnaXN0ZXIoT3B0aW9uYWxQYXJhbUZlYXR1cmUuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjEyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjYxMi9PcHRpb25hbFBhcmFtQmluZGVyLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjYxMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2MTIvT3B0aW9uYWxQYXJhbUJpbmRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ODA4ZjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjYxMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2MTIvT3B0aW9uYWxQYXJhbUJpbmRlci5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjYxMjsKKworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5QYXJhbUNvbnZlcnRlclByb3ZpZGVyOworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5BYnN0cmFjdEJpbmRlcjsKKworZmluYWwgY2xhc3MgT3B0aW9uYWxQYXJhbUJpbmRlciBleHRlbmRzIEFic3RyYWN0QmluZGVyIHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgLy8gUGFyYW0gY29udmVydGVyIHByb3ZpZGVycworICAgICAgICBiaW5kKE9wdGlvbmFsUGFyYW1Db252ZXJ0ZXJQcm92aWRlci5jbGFzcykudG8oUGFyYW1Db252ZXJ0ZXJQcm92aWRlci5jbGFzcykuaW4oU2luZ2xldG9uLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjYxMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2MTIvT3B0aW9uYWxQYXJhbUNvbnZlcnRlclByb3ZpZGVyLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjYxMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2MTIvT3B0aW9uYWxQYXJhbUNvbnZlcnRlclByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjViNmVkZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjEyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjYxMi9PcHRpb25hbFBhcmFtQ29udmVydGVyUHJvdmlkZXIuamF2YQpAQCAtMCwwICsxLDg3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI2MTI7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5QYXJhbUNvbnZlcnRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUGFyYW1Db252ZXJ0ZXJQcm92aWRlcjsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5Qcm92aWRlcnM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5SZWZsZWN0aW9uSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5DbGFzc1R5cGVQYWlyOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5GdW5jdGlvbjsKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLk9wdGlvbmFsOworCitAU2luZ2xldG9uCitwdWJsaWMgY2xhc3MgT3B0aW9uYWxQYXJhbUNvbnZlcnRlclByb3ZpZGVyIGltcGxlbWVudHMgUGFyYW1Db252ZXJ0ZXJQcm92aWRlciB7CisKKyAgICBwcml2YXRlIGZpbmFsIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlcjsKKworICAgIEBJbmplY3QKKyAgICBwdWJsaWMgT3B0aW9uYWxQYXJhbUNvbnZlcnRlclByb3ZpZGVyKGZpbmFsIEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlcikgeworICAgICAgICB0aGlzLmluamVjdGlvbk1hbmFnZXIgPSBpbmplY3Rpb25NYW5hZ2VyOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyA8VD4gUGFyYW1Db252ZXJ0ZXI8VD4gZ2V0Q29udmVydGVyKGZpbmFsIENsYXNzPFQ+IHJhd1R5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucykgeworICAgICAgICBmaW5hbCBMaXN0PENsYXNzVHlwZVBhaXI+IGN0cHMgPSBSZWZsZWN0aW9uSGVscGVyLmdldFR5cGVBcmd1bWVudEFuZENsYXNzKGdlbmVyaWNUeXBlKTsKKyAgICAgICAgZmluYWwgQ2xhc3NUeXBlUGFpciBjdHAgPSAoY3Rwcy5zaXplKCkgPT0gMSkgPyBjdHBzLmdldCgwKSA6IG51bGw7CisgICAgICAgIGlmIChjdHAgPT0gbnVsbCB8fCBjdHAucmF3Q2xhc3MoKSA9PSBTdHJpbmcuY2xhc3MpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUGFyYW1Db252ZXJ0ZXI8VD4oKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIFQgZnJvbVN0cmluZyhmaW5hbCBTdHJpbmcgdmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJhd1R5cGUuY2FzdChPcHRpb25hbC5mcm9tTnVsbGFibGUodmFsdWUpKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKGZpbmFsIFQgdmFsdWUpIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworICAgICAgICB9CisgICAgICAgIGZpbmFsIFNldDxQYXJhbUNvbnZlcnRlclByb3ZpZGVyPiBjb252ZXJ0ZXJQcm92aWRlcnMgPQorICAgICAgICAgICAgICAgIFByb3ZpZGVycy5nZXRQcm92aWRlcnMoaW5qZWN0aW9uTWFuYWdlciwgUGFyYW1Db252ZXJ0ZXJQcm92aWRlci5jbGFzcyk7CisgICAgICAgIGZvciAoUGFyYW1Db252ZXJ0ZXJQcm92aWRlciBwcm92aWRlciA6IGNvbnZlcnRlclByb3ZpZGVycykgeworICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgICAgICAgICBmaW5hbCBQYXJhbUNvbnZlcnRlcjw/PiBjb252ZXJ0ZXIgPSBwcm92aWRlci5nZXRDb252ZXJ0ZXIoY3RwLnJhd0NsYXNzKCksIGN0cC50eXBlKCksIGFubm90YXRpb25zKTsKKyAgICAgICAgICAgIGlmIChjb252ZXJ0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUGFyYW1Db252ZXJ0ZXI8VD4oKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgVCBmcm9tU3RyaW5nKGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJhd1R5cGUuY2FzdChPcHRpb25hbC5mcm9tTnVsbGFibGUodmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRyYW5zZm9ybSgoRnVuY3Rpb248U3RyaW5nLCBPYmplY3Q+KSBzIC0+IGNvbnZlcnRlci5mcm9tU3RyaW5nKHZhbHVlKSkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoZmluYWwgVCB2YWx1ZSkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2MTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNjEyL09wdGlvbmFsUGFyYW1GZWF0dXJlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjYxMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2MTIvT3B0aW9uYWxQYXJhbUZlYXR1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmFmNGQxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2MTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNjEyL09wdGlvbmFsUGFyYW1GZWF0dXJlLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyNjEyOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CisKK3B1YmxpYyBjbGFzcyBPcHRpb25hbFBhcmFtRmVhdHVyZSBpbXBsZW1lbnRzIEZlYXR1cmUgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gY29uZmlndXJlKGZpbmFsIEZlYXR1cmVDb250ZXh0IGNvbnRleHQpIHsKKyAgICAgICAgY29udGV4dC5yZWdpc3RlcihuZXcgT3B0aW9uYWxQYXJhbUJpbmRlcigpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCit9CisKZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjEyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjYxMi9SZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2MTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNjEyL1Jlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQxYmUyNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjEyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjYxMi9SZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjYxMjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkZ1bmN0aW9uOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmJhc2UuT3B0aW9uYWw7CisKKy8qKgorICogVGVzdCByZXNvdXJjZS4KKyAqLworQFBhdGgoIi8iKQorcHVibGljIGNsYXNzIFJlc291cmNlIHsKKworICAgIEBQYXRoKCJoZWxsbyIpCisgICAgQEdFVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIFN0cmluZyBoZWxsbyhAUXVlcnlQYXJhbSgibmFtZSIpIGZpbmFsIE9wdGlvbmFsPFN0cmluZz4gbmFtZSkgeworICAgICAgICByZXR1cm4gIkhlbGxvICIgKyBuYW1lLm9yKCJXb3JsZCIpICsgIiEiOworICAgIH0KKworICAgIEBQYXRoKCJzcXVhcmUiKQorICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBpbnQgZWNobyhAUXVlcnlQYXJhbSgidmFsdWUiKSBmaW5hbCBPcHRpb25hbDxJbnRlZ2VyPiB2YWx1ZSkgeworICAgICAgICByZXR1cm4gdmFsdWUudHJhbnNmb3JtKG5ldyBGdW5jdGlvbjxJbnRlZ2VyLCBJbnRlZ2VyPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEludGVnZXIgYXBwbHkoZmluYWwgSW50ZWdlciBpbnRlZ2VyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGludGVnZXIgKiBpbnRlZ2VyOworICAgICAgICAgICAgfQorICAgICAgICB9KS5vcigwKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjEyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjYxMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1MDY4MDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjYxMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi41IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI+CisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+amVyc2V5MjYxMlNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LndzLnJzLkFwcGxpY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI2MTIuSmVyc2V5MjYxMjwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+amVyc2V5MjYxMlNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjEyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjYxMi9KZXJzZXkyNjEySVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjYxMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2MTIvSmVyc2V5MjYxMklUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmZmJhZDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjYxMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2MTIvSmVyc2V5MjYxMklUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjYxMjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIFJlcHJvZHVjZXIgdGVzdHMgZm9yIEpFUlNFWS0yNjEyLgorICovCitwdWJsaWMgY2xhc3MgSmVyc2V5MjYxMklUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKZXJzZXkyNjEyKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZU1ldGhvZFdpdGhPcHRpb25hbEdpdmVuTm9RdWVyeVBhcmFtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCIvaGVsbG8iKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoIkhlbGxvIFdvcmxkISIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZU1ldGhvZFdpdGhPcHRpb25hbEdpdmVuUXVlcnlQYXJhbSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiL2hlbGxvIikucXVlcnlQYXJhbSgibmFtZSIsICJKZXJzZXkiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoIkhlbGxvIEplcnNleSEiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VNZXRob2RXaXRoT3B0aW9uYWxJbnRHaXZlbk5vUXVlcnlQYXJhbSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiL3NxdWFyZSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBpcygiMCIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZU1ldGhvZFdpdGhPcHRpb25hbEludEdpdmVuUXVlcnlQYXJhbSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiL3NxdWFyZSIpLnF1ZXJ5UGFyYW0oInZhbHVlIiwgIjQyIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGlzKCIxNzY0IikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjM3L3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjYzNy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MTU3OTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjYzNy9wb20ueG1sCkBAIC0wLDAgKzEsNzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktMjYzNzwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1qZXJzZXktMjYzNzwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgU2VydmxldCBpbnRlZ3JhdGlvbiB0ZXN0IC0gSkVSU0VZLTI2MzcgLSBzZW5zaXRpdmUgcGFyYW1zIGNhbiBiZSBleHBvc2VkIGluIGxvZ3MgZXZlbiBmb3IgUE9TVCByZXF1ZXN0cy4KKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3NlcnZsZXQyLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldC1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjM3L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjYzNy9KZXJzZXkyNjM3LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjYzNy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2MzcvSmVyc2V5MjYzNy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMjE2ZWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjYzNy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2MzcvSmVyc2V5MjYzNy5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjYzNzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworLyoqCisgKiBKQVgtUlMgYXBwbGljYXRpb24gZm9yIHRoZSBKRVJTRVktMjYzNyByZXByb2R1Y2VyIHRlc3QuCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXkyNjM3IGV4dGVuZHMgUmVzb3VyY2VDb25maWcgeworCisgICAgcHVibGljIEplcnNleTI2MzcoKSB7CisgICAgICAgIHJlZ2lzdGVyKFJlc291cmNlLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjYzNy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2MzcvUGFyYW1FYXRpbmdGaWx0ZXIuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjM3L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjYzNy9QYXJhbUVhdGluZ0ZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNTIyYzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjYzNy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2MzcvUGFyYW1FYXRpbmdGaWx0ZXIuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI2Mzc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXJDaGFpbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlckNvbmZpZzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZTsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIFBhcmFtRWF0aW5nRmlsdGVyIGltcGxlbWVudHMgRmlsdGVyIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGluaXQoZmluYWwgRmlsdGVyQ29uZmlnIGZpbHRlckNvbmZpZykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24geworICAgICAgICAvLyBOT09QCisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZG9GaWx0ZXIoZmluYWwgU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgZmluYWwgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBmaW5hbCBGaWx0ZXJDaGFpbiBjaGFpbikKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIE5PTS1OT00uCisgICAgICAgIHJlcXVlc3QuZ2V0UGFyYW1ldGVyTWFwKCk7CisKKyAgICAgICAgLy8gQ29udGludWUuCisgICAgICAgIGNoYWluLmRvRmlsdGVyKHJlcXVlc3QsIHJlc3BvbnNlKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgeworICAgICAgICAvLyBOT09QCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2Mzcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNjM3L1Jlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjYzNy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2MzcvUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTQwMWNmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2Mzcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNjM3L1Jlc291cmNlLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyNjM3OworCitpbXBvcnQgamF2YXgud3MucnMuRGVmYXVsdFZhbHVlOworaW1wb3J0IGphdmF4LndzLnJzLkZvcm1QYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CisKKy8qKgorICogVGVzdCByZXNvdXJjZS4KKyAqLworQFBhdGgoIi8iKQorcHVibGljIGNsYXNzIFJlc291cmNlIHsKKworICAgIEBQT1NUCisgICAgcHVibGljIFN0cmluZyBwYXJhbXMoQEZvcm1QYXJhbSgidXNlcm5hbWUiKSBARGVmYXVsdFZhbHVlKCJrbyIpIGZpbmFsIFN0cmluZyB1c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBARm9ybVBhcmFtKCJwYXNzd29yZCIpIEBEZWZhdWx0VmFsdWUoImtvIikgZmluYWwgU3RyaW5nIHBhc3N3b3JkKSB7CisgICAgICAgIHJldHVybiB1c2VybmFtZSArICJfIiArIHBhc3N3b3JkOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjM3L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjYzNy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MWQ0M2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjYzNy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsODAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi41IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI+CisgICAgPGZpbHRlcj4KKyAgICAgICAgPGZpbHRlci1uYW1lPmplcnNleTI2MzdGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8ZmlsdGVyLWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI2MzcuUGFyYW1FYXRpbmdGaWx0ZXI8L2ZpbHRlci1jbGFzcz4KKyAgICA8L2ZpbHRlcj4KKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5qZXJzZXkyNjM3RmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+ZGVmYXVsdDwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjYzNy5KZXJzZXkyNjM3PC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5kZWZhdWx0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vZGVmYXVsdC8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPmVuYWJsZWQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LndzLnJzLkFwcGxpY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI2MzcuSmVyc2V5MjYzNzwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qZXJzZXkuY29uZmlnLnNlcnZsZXQuZm9ybS5xdWVyeVBhcmFtcy5kaXNhYmxlZDwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5mYWxzZTwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+ZW5hYmxlZDwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L2VuYWJsZWQvKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5kaXNhYmxlZDwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjYzNy5KZXJzZXkyNjM3PC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmplcnNleS5jb25maWcuc2VydmxldC5mb3JtLnF1ZXJ5UGFyYW1zLmRpc2FibGVkPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPmRpc2FibGVkPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vZGlzYWJsZWQvKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjYzNy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2MzcvSmVyc2V5MjYzN0Rpc2FibGVkSVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjYzNy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2MzcvSmVyc2V5MjYzN0Rpc2FibGVkSVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU2YjY4ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjM3L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjYzNy9KZXJzZXkyNjM3RGlzYWJsZWRJVENhc2UuamF2YQpAQCAtMCwwICsxLDExOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyNjM3OworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRm9ybTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5NYXRjaGVyQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogUmVwcm9kdWNlciB0ZXN0cyBmb3IgSkVSU0VZLTI2MzcgLSBRdWVyeSBwYXJhbXMgY2Fubm90IGJlIGluamVjdGVkIHVzaW5nIHtAbGluayBqYXZheC53cy5ycy5Gb3JtUGFyYW19LgorICovCitwdWJsaWMgY2xhc3MgSmVyc2V5MjYzN0Rpc2FibGVkSVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IEplcnNleTI2MzcoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZvcm1QYXJhbXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgRm9ybSBmb3JtID0gbmV3IEZvcm0oKQorICAgICAgICAgICAgICAgIC5wYXJhbSgidXNlcm5hbWUiLCAidXNlciIpCisgICAgICAgICAgICAgICAgLnBhcmFtKCJwYXNzd29yZCIsICJwYXNzIik7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImRpc2FibGVkIikucmVxdWVzdCgpLnBvc3QoRW50aXR5LmZvcm0oZm9ybSkpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBpcygidXNlcl9wYXNzIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFF1ZXJ5UGFyYW1zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJkaXNhYmxlZCIpCisgICAgICAgICAgICAgICAgLnF1ZXJ5UGFyYW0oInVzZXJuYW1lIiwgInVzZXIiKS5xdWVyeVBhcmFtKCJwYXNzd29yZCIsICJwYXNzIikKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmZvcm0obmV3IEZvcm0oKSkpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBpcygia29fa28iKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RG91YmxlUXVlcnlQYXJhbXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImRpc2FibGVkIikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgidXNlcm5hbWUiLCAidXNlciIpLnF1ZXJ5UGFyYW0oInBhc3N3b3JkIiwgInBhc3MiKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJ1c2VybmFtZSIsICJ1c2VyIikucXVlcnlQYXJhbSgicGFzc3dvcmQiLCAicGFzcyIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5mb3JtKG5ldyBGb3JtKCkpKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoImtvX2tvIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVuY29kZWRRdWVyeVBhcmFtcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiZGlzYWJsZWQiKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJ1c2VybmFtZSIsICJ1cyUyMGVyIikucXVlcnlQYXJhbSgicGFzc3dvcmQiLCAicGFzcyIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5mb3JtKG5ldyBGb3JtKCkpKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoImtvX2tvIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEZvcm1BbmRRdWVyeVBhcmFtcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBGb3JtIGZvcm0gPSBuZXcgRm9ybSgpCisgICAgICAgICAgICAgICAgLnBhcmFtKCJ1c2VybmFtZSIsICJ1c2VyIikKKyAgICAgICAgICAgICAgICAucGFyYW0oInBhc3N3b3JkIiwgInBhc3MiKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiZGlzYWJsZWQiKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJ1c2VybmFtZSIsICJ1c2VyIikucXVlcnlQYXJhbSgicGFzc3dvcmQiLCAicGFzcyIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5mb3JtKGZvcm0pKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoInVzZXJfcGFzcyIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JtQW5kRG91YmxlUXVlcnlQYXJhbXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgRm9ybSBmb3JtID0gbmV3IEZvcm0oKQorICAgICAgICAgICAgICAgIC5wYXJhbSgidXNlcm5hbWUiLCAidXNlciIpCisgICAgICAgICAgICAgICAgLnBhcmFtKCJwYXNzd29yZCIsICJwYXNzIik7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoImRpc2FibGVkIikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbSgidXNlcm5hbWUiLCAidXNlciIpLnF1ZXJ5UGFyYW0oInBhc3N3b3JkIiwgInBhc3MiKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJ1c2VybmFtZSIsICJ1c2VyIikucXVlcnlQYXJhbSgicGFzc3dvcmQiLCAicGFzcyIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5mb3JtKGZvcm0pKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoInVzZXJfcGFzcyIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjYzNy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2MzcvSmVyc2V5MjYzN0VuYWJsZWRJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjM3L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjYzNy9KZXJzZXkyNjM3RW5hYmxlZElUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNDBiYzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjYzNy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2MzcvSmVyc2V5MjYzN0VuYWJsZWRJVENhc2UuamF2YQpAQCAtMCwwICsxLDExNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyNjM3OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZvcm07CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIFJlcHJvZHVjZXIgdGVzdHMgZm9yIEpFUlNFWS0yNjM3IC0gUXVlcnkgcGFyYW1zIGNhbiBiZSBpbmplY3RlZCB1c2luZyB7QGxpbmsgamF2YXgud3MucnMuRm9ybVBhcmFtfS4KKyAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBKZXJzZXkyNjM3RW5hYmxlZElUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gInBhdGggPSB7MH0iKQorICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxPYmplY3RbXT4gcGF0aHMoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXVtde3siZGVmYXV0In0sIHsiZW5hYmxlZCJ9fSk7CisgICAgfQorCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyCisgICAgcHVibGljIFN0cmluZyBwYXRoOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKZXJzZXkyNjM3KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RGb3JtUGFyYW1zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEZvcm0gZm9ybSA9IG5ldyBGb3JtKCkKKyAgICAgICAgICAgICAgICAucGFyYW0oInVzZXJuYW1lIiwgInVzZXIiKQorICAgICAgICAgICAgICAgIC5wYXJhbSgicGFzc3dvcmQiLCAicGFzcyIpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KHBhdGgpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5mb3JtKGZvcm0pKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoInVzZXJfcGFzcyIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RRdWVyeVBhcmFtcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldChwYXRoKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJ1c2VybmFtZSIsICJ1c2VyIikucXVlcnlQYXJhbSgicGFzc3dvcmQiLCAicGFzcyIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5mb3JtKG5ldyBGb3JtKCkpKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoInVzZXJfcGFzcyIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REb3VibGVRdWVyeVBhcmFtcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldChwYXRoKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJ1c2VybmFtZSIsICJ1c2VyIikucXVlcnlQYXJhbSgicGFzc3dvcmQiLCAicGFzcyIpCisgICAgICAgICAgICAgICAgLnF1ZXJ5UGFyYW0oInVzZXJuYW1lIiwgInVzZXIiKS5xdWVyeVBhcmFtKCJwYXNzd29yZCIsICJwYXNzIikKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmZvcm0obmV3IEZvcm0oKSkpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBpcygidXNlcl9wYXNzIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEVuY29kZWRRdWVyeVBhcmFtcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldChwYXRoKQorICAgICAgICAgICAgICAgIC5xdWVyeVBhcmFtKCJ1c2VybmFtZSIsICJ1cyUyMGVyIikucXVlcnlQYXJhbSgicGFzc3dvcmQiLCAicGFzcyIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5mb3JtKG5ldyBGb3JtKCkpKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoInVzIGVyX3Bhc3MiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Rm9ybUFuZFF1ZXJ5UGFyYW1zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIEZvcm0gZm9ybSA9IG5ldyBGb3JtKCkKKyAgICAgICAgICAgICAgICAucGFyYW0oInVzZXJuYW1lIiwgInVzZXIiKQorICAgICAgICAgICAgICAgIC5wYXJhbSgicGFzc3dvcmQiLCAicGFzcyIpOworCisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KHBhdGgpCisgICAgICAgICAgICAgICAgLnF1ZXJ5UGFyYW0oInVzZXJuYW1lIiwgInVzZXIiKS5xdWVyeVBhcmFtKCJwYXNzd29yZCIsICJwYXNzIikKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmZvcm0oZm9ybSkpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBpcygidXNlcl9wYXNzIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjU0L3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjY1NC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZTc2NTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjY1NC9wb20ueG1sCkBAIC0wLDAgKzEsNjMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LTI2NTQ8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tamVyc2V5LTI2NTQ8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+SmVyc2V5IHRlc3Qgd2ViIGFwcGxpY2F0aW9uIC0gc2VydmxldC9maWx0ZXIsIEpFUlNFWS0yNjU0IHJlcHJvZHVjZXI8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjU0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjY1NC9TZXJ2bGV0RmlsdGVyVGVzdFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjY1NC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2NTQvU2VydmxldEZpbHRlclRlc3RSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmYzA2MmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjY1NC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2NTQvU2VydmxldEZpbHRlclRlc3RSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjY1NDsKKworCitpbXBvcnQgamF2YXgud3MucnMuRGVmYXVsdFZhbHVlOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworLyoqCisgKiBUZXN0IHJlc291cmNlIHRvIGJlIGNhbGxlZCB3aXRoaW4gYW4gU2VydmxldENvbnRhaW5lciByZWdpc3RlcmVkIGFzIHNlcnZsZXQgZmlsdGVyLgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoImZpbHRlciIpCitwdWJsaWMgY2xhc3MgU2VydmxldEZpbHRlclRlc3RSZXNvdXJjZSB7CisKKyAgICBAR0VUCisgICAgcHVibGljIFJlc3BvbnNlIHdoYXRZb3VTZW5kSXNXaGF0WW91R2V0KEBEZWZhdWx0VmFsdWUoIiIpIEBRdWVyeVBhcmFtKCJqc29uIikgZmluYWwgU3RyaW5nIGpzb24pIHsKKyAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKCkuZW50aXR5KGpzb24pLmJ1aWxkKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2NTQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNjU0L1Rlc3RBcHBsaWNhdGlvbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2NTQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNjU0L1Rlc3RBcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5OTAwOGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjY1NC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2NTQvVGVzdEFwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyNjU0OworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKKy8qKgorICogSkFYLVJTIGFwcGxpY2F0aW9uIHRvIGNvbmZpZ3VyZSByZXNvdXJjZXMgZm9yIEpFUlNFWS0yNTI1IHJlcHJvZHVjZXIuCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgVGVzdEFwcGxpY2F0aW9uIGV4dGVuZHMgQXBwbGljYXRpb24geworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgIGZpbmFsIFNldDxDbGFzczw/Pj4gY2xhc3NlcyA9IG5ldyBIYXNoU2V0PD4oKTsKKyAgICAgICAgY2xhc3Nlcy5hZGQoU2VydmxldEZpbHRlclRlc3RSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJldHVybiBjbGFzc2VzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjU0L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjY1NC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NWMyMGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjY1NC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKKyAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8zXzAueHNkIgorICAgICAgICAgdmVyc2lvbj0iMy4wIj4KKyAgICA8ZmlsdGVyPgorICAgICAgICA8ZmlsdGVyLW5hbWU+TXlBcHBsaWNhdGlvbjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDxmaWx0ZXItY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9maWx0ZXItY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjY1NC5UZXN0QXBwbGljYXRpb248L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgPC9maWx0ZXI+CisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+TXlBcHBsaWNhdGlvbjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKzwvd2ViLWFwcD4KKworCmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjY1NC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2NTQvSmVyc2V5MjY1NElUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2NTQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNjU0L0plcnNleTI2NTRJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTg5YjY0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2NTQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNjU0L0plcnNleTI2NTRJVENhc2UuamF2YQpAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI2NTQ7CisKK2ltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtV3JpdGVyOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5uZXQuU29ja2V0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFJlcHJvZHVjZXIgZm9yIEpFUlNFWS0yNjU0CisgKgorICogVGVzdHMsIHRoYXQgdW5lbmNvZGVkIGN1cmx5IGJyYWNrZXRzICh0eXBpY2FsbHkgdXNlZCBpbiBVUkkgcXVlcmllcyBjb250YWluaW5nIEpTT04pIGRvIG5vdCBjYXVzZSB0aGUgcmVxdWVzdCB0bworICogZmFpbCB3aGVuIHJ1bm5pbmcgaW4gYSBzZXJ2bGV0IGVudmlyb25tZW50IGFuZCBjb25maWd1cmVkIGFzIGEgZmlsdGVyLgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEplcnNleTI2NTRJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgVGVzdEFwcGxpY2F0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RKc29uSW5VcmlXaXRoU29ja2V0cygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIExvdyBsZXZlbCBhcHByb2FjaCB3aXRoIHNvY2tldHMgaXMgdXNlZCwgYmVjYXVzZSBjb21tb24gSmF2YSBIVFRQIGNsaWVudHMgYXJlIHVzaW5nIGphdmEubmV0LlVSSSwKKyAgICAgICAgLy8gd2hpY2ggZmFpbHMgd2hlbiB1bmVuY29kZWQgY3VybHkgYnJhY2tldCBpcyBwYXJ0IG9mIHRoZSBVUkkKKyAgICAgICAgZmluYWwgU29ja2V0IHNvY2tldCA9IG5ldyBTb2NrZXQoZ2V0QmFzZVVyaSgpLmdldEhvc3QoKSwgZ2V0QmFzZVVyaSgpLmdldFBvcnQoKSk7CisgICAgICAgIGZpbmFsIFByaW50V3JpdGVyIHB3ID0gbmV3IFByaW50V3JpdGVyKG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKHNvY2tldC5nZXRPdXRwdXRTdHJlYW0oKSkpKTsKKworICAgICAgICAvLyBxdW90ZXMgYXJlIGVuY29kZWQgYnkgYnJvd3NlcnMsIGN1cmx5IGJyYWNrZXRzIGFyZSBub3QsIHNvIHRoZSBxdW90ZXMgd2lsbCBiZSBzZW50IHByZS1lbmNvZGVkCisgICAgICAgIC8vIEhUVFAgMS4wIGlzIHVzZWQgZm9yIHNpbXBsaWNpdHkKKyAgICAgICAgcHcucHJpbnRsbigiR0VUIC9maWx0ZXI/anNvbj17JTIyZm9vJTIyOiUyMmJhciUyMn0gSFRUUC8xLjAiKTsKKyAgICAgICAgcHcucHJpbnRsbigpOyAgIC8vIGh0dHAgcmVxdWVzdCBzaG91bGQgZW5kIHdpdGggYSBibGFuayBsaW5lCisgICAgICAgIHB3LmZsdXNoKCk7CisKKyAgICAgICAgZmluYWwgQnVmZmVyZWRSZWFkZXIgYnIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKHNvY2tldC5nZXRJbnB1dFN0cmVhbSgpKSk7CisKKyAgICAgICAgU3RyaW5nIGxhc3RMaW5lID0gbnVsbDsKKyAgICAgICAgU3RyaW5nIGxpbmU7CisgICAgICAgIHdoaWxlICgobGluZSA9IGJyLnJlYWRMaW5lKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgIC8vIHJlYWQgdGhlIHJlc3BvbnNlIGFuZCByZW1lbWJlciB0aGUgbGFzdCBsaW5lCisgICAgICAgICAgICBsYXN0TGluZSA9IGxpbmU7CisgICAgICAgIH0KKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ7XCJmb29cIjpcImJhclwifSIsIGxhc3RMaW5lKTsKKyAgICAgICAgYnIuY2xvc2UoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjY3My9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2NzMvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjdhYTMwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2NzMvcG9tLnhtbApAQCAtMCwwICsxLDcxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmplcnNleS0yNjczPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLWplcnNleS0yNjczPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPkplcnNleSB0ZXN0IHdlYiBhcHBsaWNhdGlvbiAtIHNlcnZsZXQvZmlsdGVyLCBKRVJTRVktMjY3MyByZXByb2R1Y2VyPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldC1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWJlYW4tdmFsaWRhdGlvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLWpzb24tamFja3NvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2NzMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNjczL0plcnNleTI2NzMuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjczL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjY3My9KZXJzZXkyNjczLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZmNjI3NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjczL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjY3My9KZXJzZXkyNjczLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyNjczOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamFja3Nvbi5KYWNrc29uRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlNlcnZlclByb3BlcnRpZXM7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXkyNjczIGV4dGVuZHMgUmVzb3VyY2VDb25maWcgeworCisgICAgcHVibGljIEplcnNleTI2NzMoKSB7CisgICAgICAgIC8vIFJlc291cmNlcy4KKyAgICAgICAgcmVnaXN0ZXIoUmVzb3VyY2UuY2xhc3MpOworCisgICAgICAgIC8vIFByb3ZpZGVycy4KKyAgICAgICAgcmVnaXN0ZXIoSmFja3NvbkZlYXR1cmUuY2xhc3MpOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB2YWxpZGF0aW9ucyBlcnJvcnMgYXJlIHJldHVybmVkIHRvIHRoZSBjbGllbnQuCisgICAgICAgIHByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuQlZfU0VORF9FUlJPUl9JTl9SRVNQT05TRSwgdHJ1ZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2NzMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNjczL1Jlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjY3My9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2NzMvUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjZhMzllCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2NzMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNjczL1Jlc291cmNlLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyNjczOworCitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLlZhbGlkOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUGF0aCgiLyIpCitAUHJvZHVjZXMoImFwcGxpY2F0aW9uL2pzb24iKQorcHVibGljIGNsYXNzIFJlc291cmNlIHsKKworICAgIEBQT1NUCisgICAgQFZhbGlkCisgICAgcHVibGljIFJlc3BvbnNlIHByb2Nlc3NCZWFuKEBWYWxpZCBmaW5hbCBTYW1wbGVCZWFuIGJlYW4pIHsKKyAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKG5ldyBTYW1wbGVCZWFuKCkpLmJ1aWxkKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2NzMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNjczL1NhbXBsZUJlYW4uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjczL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjY3My9TYW1wbGVCZWFuLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFhYzAyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjczL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjY3My9TYW1wbGVCZWFuLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyNjczOworCitpbXBvcnQgb3JnLmhpYmVybmF0ZS52YWxpZGF0b3IuY29uc3RyYWludHMuTm90RW1wdHk7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBTYW1wbGVCZWFuIHsKKworICAgIEBOb3RFbXB0eQorICAgIHByaXZhdGUgYnl0ZVtdIGFycmF5OworCisgICAgcHVibGljIGJ5dGVbXSBnZXRBcnJheSgpIHsKKyAgICAgICAgcmV0dXJuIGFycmF5OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEFycmF5KGZpbmFsIGJ5dGVbXSBhcnJheSkgeworICAgICAgICB0aGlzLmFycmF5ID0gYXJyYXk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2NzMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjczL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzEyODc5ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjczL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIyLjUiCisgICAgICAgIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCisgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzJfNS54c2QiPgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+amVyc2V5PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC53cy5ycy5BcHBsaWNhdGlvbjwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyNjczLkplcnNleTI2NzM8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+amVyc2V5PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjczL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjY3My9KZXJzZXkyNjczSVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjY3My9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2NzMvSmVyc2V5MjY3M0lUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNTcwMDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjY3My9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2NzMvSmVyc2V5MjY3M0lUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjY3MzsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkdlbmVyaWNUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnZhbGlkYXRpb24uVmFsaWRhdGlvbkVycm9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogUmVwcm9kdWNlciBmb3IgSkVSU0VZLTI2NzM6IDQwMCBlcnJvcnMgZ2VuZXJhdGVkIGJ5IGEgVmFsaWRhdGlvbkV4Y2VwdGlvbiBhcmUgcmV0dXJuaW5nIGRlZmF1bHQgZXJyb3IgcGFnZSBpbnN0ZWFkIG9mCisgKiB0aGUgQmVhbiBWYWxpZGF0aW9uJ3MgcmVzcG9uc2UgZW50aXR5LgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgSmVyc2V5MjY3M0lUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKZXJzZXkyNjczKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnB1dFBhcmFtcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoImFwcGxpY2F0aW9uL2pzb24iKS5wb3N0KEVudGl0eS5qc29uKG5ldyBTYW1wbGVCZWFuKCkpKTsKKworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldFN0YXR1c0luZm8oKS5nZXRTdGF0dXNDb2RlKCksIGlzKFJlc3BvbnNlLlN0YXR1cy5CQURfUkVRVUVTVC5nZXRTdGF0dXNDb2RlKCkpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KG5ldyBHZW5lcmljVHlwZTxMaXN0PFZhbGlkYXRpb25FcnJvcj4+KCkge30pLnNpemUoKSwgaXMoMSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE91dHB1dFBhcmFtcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTYW1wbGVCZWFuIGVudGl0eSA9IG5ldyBTYW1wbGVCZWFuKCk7CisgICAgICAgIGVudGl0eS5zZXRBcnJheShuZXcgYnl0ZVtdIHs0Mn0pOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoImFwcGxpY2F0aW9uL2pzb24iKS5wb3N0KEVudGl0eS5qc29uKGVudGl0eSkpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzSW5mbygpLmdldFN0YXR1c0NvZGUoKSwgaXMoUmVzcG9uc2UuU3RhdHVzLklOVEVSTkFMX1NFUlZFUl9FUlJPUi5nZXRTdGF0dXNDb2RlKCkpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5yZWFkRW50aXR5KG5ldyBHZW5lcmljVHlwZTxMaXN0PFZhbGlkYXRpb25FcnJvcj4+KCkge30pLnNpemUoKSwgaXMoMSkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2ODkvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjg5L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ1ODNjOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjg5L3BvbS54bWwKQEAgLTAsMCArMSw5MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmplcnNleS0yNjg5PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLWplcnNleS0yNjg5PC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPlNlcnZsZXQgaW50ZWdyYXRpb24gdGVzdCAtIEpFUlNFWS0yNjg5IC0gUHJvYmxlbSB3aXRoIHZhbGlkYXRpb24gZXJyb3JzIG9uIHByaW1pdGl2ZSB0eXBlIGFycmF5czwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1iZWFuLXZhbGlkYXRpb248L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amFja3Nvbi1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtqYWNrc29uLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmZhc3RlcnhtbC5qYWNrc29uLmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYWNrc29uLWFubm90YXRpb25zPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtqYWNrc29uLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmZhc3RlcnhtbC5qYWNrc29uLmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYWNrc29uLWRhdGFiaW5kPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtqYWNrc29uLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmZhc3RlcnhtbC5qYWNrc29uLmpheHJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amFja3Nvbi1qYXhycy1qc29uLXByb3ZpZGVyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtqYWNrc29uLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjg5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjY4OS9KZXJzZXkyNjg5LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjY4OS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2ODkvSmVyc2V5MjY4OS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMTgzNTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjY4OS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2ODkvSmVyc2V5MjY4OS5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjY4OTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKKworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5PYmplY3RNYXBwZXI7CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLlNlcmlhbGl6YXRpb25GZWF0dXJlOworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5qYXhycy5qc29uLkphY2tzb25KYXhiSnNvblByb3ZpZGVyOworCisvKioKKyAqIEBhdXRob3IgT3NjYXIgR3VpbmR6YmVyZworICovCitwdWJsaWMgY2xhc3MgSmVyc2V5MjY4OSBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKworICAgIHB1YmxpYyBKZXJzZXkyNjg5KCkgeworICAgICAgICAvLyBTZXQgcGFja2FnZSB0byBsb29rIGZvciByZXNvdXJjZXMgaW4KKyAgICAgICAgcGFja2FnZXMoIm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI2ODkiKTsKKworICAgICAgICB0aGlzLnByb3BlcnR5KFNlcnZlclByb3BlcnRpZXMuQlZfU0VORF9FUlJPUl9JTl9SRVNQT05TRSwgdHJ1ZSk7CisKKyAgICAgICAgLy8gY3JlYXRlIGN1c3RvbSBPYmplY3RNYXBwZXIKKyAgICAgICAgZmluYWwgT2JqZWN0TWFwcGVyIG1hcHBlciA9IG5ldyBPYmplY3RNYXBwZXIoKTsKKyAgICAgICAgbWFwcGVyLmVuYWJsZShTZXJpYWxpemF0aW9uRmVhdHVyZS5JTkRFTlRfT1VUUFVUKTsKKworICAgICAgICAvLyBjcmVhdGUgSnNvblByb3ZpZGVyIHRvIHByb3ZpZGUgY3VzdG9tIE9iamVjdE1hcHBlcgorICAgICAgICBmaW5hbCBKYWNrc29uSmF4Ykpzb25Qcm92aWRlciBwcm92aWRlciA9IG5ldyBKYWNrc29uSmF4Ykpzb25Qcm92aWRlcigpOworICAgICAgICBwcm92aWRlci5zZXRNYXBwZXIobWFwcGVyKTsKKyAgICAgICAgdGhpcy5yZWdpc3Rlcihwcm92aWRlcik7CisKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjg5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjY4OS9SZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2ODkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNjg5L1Jlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmU5N2I5ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjg5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjY4OS9SZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjY4OTsKKworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uVmFsaWQ7CisKK0BQYXRoKCIvIikKK3B1YmxpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICBAUE9TVAorICAgIEBQYXRoKCIvcG9zdC1iZWFuIikKKyAgICBwdWJsaWMgdm9pZCBwcm9jZXNzQmVhbihAVmFsaWQgZmluYWwgU2FtcGxlQmVhbiBiZWFuKSB7CisgICAgICAgIC8vZG8tbm90aGluZworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjg5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjY4OS9TYW1wbGVCZWFuLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjY4OS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2ODkvU2FtcGxlQmVhbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZTc1OWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjY4OS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2ODkvU2FtcGxlQmVhbi5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjY4OTsKKworaW1wb3J0IG9yZy5oaWJlcm5hdGUudmFsaWRhdG9yLmNvbnN0cmFpbnRzLk5vdEVtcHR5OworCitwdWJsaWMgY2xhc3MgU2FtcGxlQmVhbiB7CisKKyAgICBATm90RW1wdHkKKyAgICBwcml2YXRlIGJ5dGVbXSBhcnJheTsKKworICAgIHB1YmxpYyBieXRlW10gZ2V0QXJyYXkoKSB7CisgICAgICAgIHJldHVybiBhcnJheTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRBcnJheShieXRlW10gYXJyYXkpIHsKKyAgICAgICAgdGhpcy5hcnJheSA9IGFycmF5OworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI2ODkvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjg5L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzg0Mjg0NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjg5L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIyLjUiCisgICAgICAgIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCisgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzJfNS54c2QiPgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+dGVzdFNlcnZsZXQxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC53cy5ycy5BcHBsaWNhdGlvbjwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyNjg5LkplcnNleTI2ODk8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+dGVzdFNlcnZsZXQxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNjg5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjY4OS9KZXJzZXkyNjg5SVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjY4OS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2ODkvSmVyc2V5MjY4OUlUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYjJlZmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjY4OS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI2ODkvSmVyc2V5MjY4OUlUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI2ODk7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DYWxsYWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5kYXRhYmluZC5PYmplY3RNYXBwZXI7CitpbXBvcnQgY29tLmZhc3RlcnhtbC5qYWNrc29uLmRhdGFiaW5kLlNlcmlhbGl6YXRpb25GZWF0dXJlOworaW1wb3J0IGNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5qYXhycy5qc29uLkphY2tzb25KYXhiSnNvblByb3ZpZGVyOworCisvKioKKyAqIFRlc3RzIGZvciBKRVJTRVktMjY4OTogUHJvYmxlbSB3aXRoIHZhbGlkYXRpb24gZXJyb3JzIG9uIHByaW1pdGl2ZSB0eXBlIGFycmF5cy4KKyAqIDxwLz4gVGhlcmUgaXMgYSBidWcgd2hlbiBhIHZhbGlkYXRpb24gZmFpbHMgZm9yIGEgcHJpbWl0aXZlIGRhdGEgYXJyYXkuIEVnIGEgTm90TnVsbCBmYWlsZWQgdmFsaWRhdGlvbiBvbiBhIGJ5dGVbXSBjYXVzZXMgdGhlIGNvZGUgdG8gdGhyb3cgYSBDbGFzc0Nhc3RFeGNlcHRpb24uIFRoZSBwcm9ibGVtIGlzIGNhdXNlZCBieSBWYWxpZGF0aW9uSGVscGVyLmdldFZpb2xhdGlvbkludmFsaWRWYWx1ZShPYmplY3QgaW52YWxpZFZhbHVlKSBJdCB0cmllcyB0byBjYXN0IGFueSBhcnJheSB0byBhIE9iamVjdFtdIEEgYnl0ZVtdIHBhcmFtZXRlciB3b3VsZCBnZW5lcmF0ZSBhIENsYXNzQ2FzdEV4Y2VwdGlvbi4qCisgKiBAYXV0aG9yIE9zY2FyIEd1aW5kemJlcmcgKG9zY2FyLmd1aW5kemJlcmcgYXQgZ21haWwuY29tKQorICovCitwdWJsaWMgY2xhc3MgSmVyc2V5MjY4OUlUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IEplcnNleTI2ODkoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENoZWNrcyBpZiBhIHRocmVhZCBnZXRzIHN0dWNrIHdoZW4gYW4ge0Bjb2RlIElPRXhjZXB0aW9ufSBpcyB0aHJvd24gZnJvbSB0aGUge0Bjb2RlCisgICAgICogTWVzc2FnZUJvZHlXcml0ZXIjd3JpdGVUb30uCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Qnl0ZUFycmF5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIEV4ZWN1dG9yLgorICAgICAgICBmaW5hbCBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3IgPSBFeGVjdXRvcnMubmV3U2luZ2xlVGhyZWFkRXhlY3V0b3IoKTsKKworICAgICAgICBmaW5hbCBGdXR1cmU8UmVzcG9uc2U+IHJlc3BvbnNlRnV0dXJlID0gZXhlY3V0b3Iuc3VibWl0KG5ldyBDYWxsYWJsZTxSZXNwb25zZT4oKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIFJlc3BvbnNlIGNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBTYW1wbGVCZWFuIGJlYW4gPSBuZXcgU2FtcGxlQmVhbigpOworICAgICAgICAgICAgICAgIGJlYW4uc2V0QXJyYXkobmV3IGJ5dGVbXXt9KTsKKworICAgICAgICAgICAgICAgIE9iamVjdE1hcHBlciBtYXBwZXIgPSBuZXcgT2JqZWN0TWFwcGVyKCk7CisgICAgICAgICAgICAgICAgbWFwcGVyLmVuYWJsZShTZXJpYWxpemF0aW9uRmVhdHVyZS5JTkRFTlRfT1VUUFVUKTsKKyAgICAgICAgICAgICAgICBKYWNrc29uSmF4Ykpzb25Qcm92aWRlciBwcm92aWRlciA9IG5ldyBKYWNrc29uSmF4Ykpzb25Qcm92aWRlcigpOworICAgICAgICAgICAgICAgIHByb3ZpZGVyLnNldE1hcHBlcihtYXBwZXIpOworICAgICAgICAgICAgICAgIGNsaWVudCgpLnJlZ2lzdGVyKHByb3ZpZGVyKTsKKworICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQoKS5wYXRoKCJwb3N0LWJlYW4iKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZW50aXR5KGJlYW4sIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfSk7CisKKyAgICAgICAgZXhlY3V0b3Iuc2h1dGRvd24oKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBpblRpbWUgPSBleGVjdXRvci5hd2FpdFRlcm1pbmF0aW9uKDUwMDAsIFRpbWVVbml0Lk1JTExJU0VDT05EUyk7CisKKyAgICAgICAgLy8gQXNzZXJ0cy4KKyAgICAgICAgYXNzZXJ0VHJ1ZShpblRpbWUpOworCisgICAgICAgIC8vIFJlc3BvbnNlLgorICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHJlc3BvbnNlRnV0dXJlLmdldCgpOworCisgICAgICAgIC8vTWFrZSBzdXJlIHdlIGdldCBhIDQwMCBlcnJvciBhbmQgbm90IGEgNTAwIGVycm9yCisgICAgICAgIGFzc2VydEVxdWFscyhSZXNwb25zZS5TdGF0dXMuQkFEX1JFUVVFU1QuZ2V0U3RhdHVzQ29kZSgpLCByZXNwb25zZS5nZXRTdGF0dXNJbmZvKCkuZ2V0U3RhdHVzQ29kZSgpKTsKKworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjcwNC9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI3MDQvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGVhMzYwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI3MDQvcG9tLnhtbApAQCAtMCwwICsxLDY3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LTI3MDQ8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tamVyc2V5LTI3MDQ8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIFRoaXMgdGVzdCBpcyB0byB2ZXJpZnkgaWYgU2VydmljZUxvY2F0b3IgY2FuIGJlIGNvbmZpZ3VyZWQgd2l0aGluIHRoZSBzZXJ2ZXIgY29udGV4dAorICAgICAgICBpbiBzdWNoIGEgd2F5IHRoYXQgSmVyc2V5IGNhbiB1c2UgaXQgYXMgYSBwYXJlbnQgU2VydmljZUxvY2F0b3IgaW4gdGhlIFdlYkNvbXBvbmVudC4KKyAgICAgICAgTW9yZSBkZXRhaWxzIGNhbiBiZSBmb3VuZCBpbiBKRVJTRVktMjcwNC4KKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI3MDQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNzA0L1NlcnZpY2VMb2NhdG9yU2V0dXAuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNzA0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjcwNC9TZXJ2aWNlTG9jYXRvclNldHVwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ViOGJlOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNzA0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjcwNC9TZXJ2aWNlTG9jYXRvclNldHVwLmphdmEKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyNzA0OworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dEV2ZW50OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHRMaXN0ZW5lcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLmFwaS5TZXJ2aWNlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi51dGlsaXRpZXMuU2VydmljZUxvY2F0b3JVdGlsaXRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyNzA0LnNlcnZpY2VzLkhhcHB5U2VydmljZTsKKworCisvKioKKyAqIFRoaXMgY2xhc3MgaXMgdG8gbGlzdGVuIGZvciB7QGxpbmsgU2VydmxldENvbnRleHRFdmVudH0gZ2VuZXJhdGVkIHdoZW5ldmVyIGNvbnRleHQKKyAqIGlzIGluaXRpYWxpemVkIGFuZCBzZXQge0BsaW5rIFNlcnZsZXRQcm9wZXJ0aWVzI1NFUlZJQ0VfTE9DQVRPUn0gYXR0cmlidXRlIHRvIHBvaW50CisgKiB7QGxpbmsgU2VydmljZUxvY2F0b3J9IHByZS1wb3B1bGF0ZWQgd2l0aCB7QGxpbmsgSGFwcHlTZXJ2aWNlfSBpbnN0YW5jZS4KKyAqCisgKiBAYXV0aG9yIEJhcnRvc3ogRmlyeW4gKHNhcnhvcykKKyAqLworcHVibGljIGNsYXNzIFNlcnZpY2VMb2NhdG9yU2V0dXAgaW1wbGVtZW50cyBTZXJ2bGV0Q29udGV4dExpc3RlbmVyIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNvbnRleHRJbml0aWFsaXplZChTZXJ2bGV0Q29udGV4dEV2ZW50IGV2ZW50KSB7CisgICAgICAgIFNlcnZpY2VMb2NhdG9yIGxvY2F0b3IgPSBTZXJ2aWNlTG9jYXRvclV0aWxpdGllcy5jcmVhdGVBbmRQb3B1bGF0ZVNlcnZpY2VMb2NhdG9yKCk7CisgICAgICAgIFNlcnZpY2VMb2NhdG9yVXRpbGl0aWVzLmFkZE9uZUNvbnN0YW50KGxvY2F0b3IsIG5ldyBIYXBweVNlcnZpY2UoKSk7CisgICAgICAgIGV2ZW50LmdldFNlcnZsZXRDb250ZXh0KCkuc2V0QXR0cmlidXRlKFNlcnZsZXRQcm9wZXJ0aWVzLlNFUlZJQ0VfTE9DQVRPUiwgbG9jYXRvcik7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgY29udGV4dERlc3Ryb3llZChTZXJ2bGV0Q29udGV4dEV2ZW50IGV2ZW50KSB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI3MDQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNzA0L1Rlc3RBcHBsaWNhdGlvbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI3MDQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNzA0L1Rlc3RBcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjN2JjNTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjcwNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI3MDQvVGVzdEFwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyNzA0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCisKKy8qKgorICogSmVyc2V5IGFwcGxpY2F0aW9uLgorICoKKyAqIEBhdXRob3IgQmFydG9zeiBGaXJ5biAoYmFydG9zemZpcnluIGF0IGdtYWlsLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFRlc3RBcHBsaWNhdGlvbiBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKworICAgIHB1YmxpYyBUZXN0QXBwbGljYXRpb24oKSB7CisgICAgICAgIHJlZ2lzdGVyKFRlc3RSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI3MDQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNzA0L1Rlc3RSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI3MDQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNzA0L1Rlc3RSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMDdmOTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjcwNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI3MDQvVGVzdFJlc291cmNlLmphdmEKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyNzA0OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CisKKy8qKgorICogVGhpcyByZXNvdXJjZSBpcyB1c2VkIHRvIHRlc3QgaWYgc3BlY2lmaWMgc2VydmljZSBjbGFzcyBpbnN0YW5jZSBpcyBhdmFpbGFibGUgaW4gdGhlCisgKiB7QGxpbmsgSW5qZWN0aW9uTWFuYWdlcn0gdGhhdCBjb21lcyBmcm9tIEplcnNleSBjb250ZXh0LgorICoKKyAqIEBhdXRob3IgQmFydG9zeiBGaXJ5biAoYmFydG9zemZpcnluIGF0IGdtYWlsLmNvbSkKKyAqLworQFBhdGgoInRlc3QiKQorcHVibGljIGNsYXNzIFRlc3RSZXNvdXJjZSB7CisKKyAgICBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXI7CisKKyAgICAvKioKKyAgICAgKiBJbmplY3Qge0BsaW5rIEluamVjdGlvbk1hbmFnZXJ9IGZyb20gSmVyc2V5IGNvbnRleHQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5qZWN0aW9uTWFuYWdlciB0aGUge0BsaW5rIEluamVjdGlvbk1hbmFnZXJ9CisgICAgICovCisgICAgQEluamVjdAorICAgIHB1YmxpYyBUZXN0UmVzb3VyY2UoSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyKSB7CisgICAgICAgIHRoaXMuaW5qZWN0aW9uTWFuYWdlciA9IGluamVjdGlvbk1hbmFnZXI7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtZXRob2Qgd2lsbCB0ZXN0IGdpdmVuIGNsYXNzIGJ5IGNoZWNraW5nIGlmIGl0IGlzIGF2YWlsYWJsZSBpbiB7QGxpbmsgSW5qZWN0aW9uTWFuYWdlcn0KKyAgICAgKiB0aGF0IGhhcyBiZWVuIGluamVjdGVkIGZyb20gdGhlIEplcnNleSBjb250ZXh0LgorICAgICAqCisgICAgICogQHBhcmFtIGNsYXp6IHRoZSBzZXJ2aWNlIGNsYXNzIG5hbWUgdG8gY2hlY2sKKyAgICAgKiBAcmV0dXJuIHtAbGluayBSZXNwb25zZX0gd2l0aCBzdGF0dXMgY29kZSAyMDAgaWYgc2VydmljZSBpcyBhdmFpbGFibGUsIDYwMCBvdGhlcndpc2UKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpbiBjYXNlIHdoZW4gdGhlcmUgYXJlIGFueSBlcnJvciAoZS5nLiBjbGFzcyBub3QgZXhpc3QpCisgICAgICovCisgICAgQEdFVAorICAgIEBQYXRoKCJ7Y2xhenp9IikKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBSZXNwb25zZSB0ZXN0KEBQYXRoUGFyYW0oImNsYXp6IikgU3RyaW5nIGNsYXp6KSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIFJlc3BvbnNlCisgICAgICAgICAgICAuc3RhdHVzKGluamVjdGlvbk1hbmFnZXIuZ2V0SW5zdGFuY2UoQ2xhc3MuZm9yTmFtZShjbGF6eikpICE9IG51bGwgPyAyMDAgOiA2MDApCisgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjcwNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI3MDQvc2VydmljZXMvSGFwcHlTZXJ2aWNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjcwNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI3MDQvc2VydmljZXMvSGFwcHlTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM4N2Q5NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNzA0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjcwNC9zZXJ2aWNlcy9IYXBweVNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI3MDQuc2VydmljZXM7CisKK2ltcG9ydCBvcmcuanZuZXQuaGsyLmFubm90YXRpb25zLlNlcnZpY2U7CisKKworLyoqCisgKiBUaGlzIHNlcnZpY2UgaXMgcmVnaXN0ZXJlZCBpbiB0aGUge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyfSBhbmQgdGhlcmVmb3JlCisgKiBjYW4gYmUgdXNlZCBpbiBKZXJzZXkgcmVzb3VyY2VzLgorICoKKyAqIEBhdXRob3IgQmFydG9zeiBGaXJ5biAoYmFydG9zemZpcnluIGF0IGdtYWlsLmNvbSkKKyAqLworQFNlcnZpY2UKK3B1YmxpYyBjbGFzcyBIYXBweVNlcnZpY2UgeworCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjcwNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI3MDQvc2VydmljZXMvU2FkU2VydmljZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI3MDQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNzA0L3NlcnZpY2VzL1NhZFNlcnZpY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDRkZjI4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI3MDQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNzA0L3NlcnZpY2VzL1NhZFNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI3MDQuc2VydmljZXM7CisKK2ltcG9ydCBvcmcuanZuZXQuaGsyLmFubm90YXRpb25zLlNlcnZpY2U7CisKKworLyoqCisgKiBUaGlzIHNlcnZpY2UgaXMgbm90IHJlZ2lzdGVyZWQgaW4ge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5JbmplY3Rpb25NYW5hZ2VyfSBhbmQgdGhlcmVmb3JlIGNhbm5vdAorICogYmUgdXNlZCBpbiB0aGUgSmVyc2V5IHJlc291cmNlcy4KKyAqCisgKiBAYXV0aG9yIEJhcnRvc3ogRmlyeW4gKGJhcnRvc3pmaXJ5biBhdCBnbWFpbC5jb20pCisgKi8KK0BTZXJ2aWNlCitwdWJsaWMgY2xhc3MgU2FkU2VydmljZSB7CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNzA0L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjcwNC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0YTI1NDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjcwNC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi41IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIj4KKyAgICA8bGlzdGVuZXI+CisgICAgICAgIDxsaXN0ZW5lci1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyNzA0LlNlcnZpY2VMb2NhdG9yU2V0dXA8L2xpc3RlbmVyLWNsYXNzPgorICAgIDwvbGlzdGVuZXI+CisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+dGVzdDwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjcwNC5UZXN0QXBwbGljYXRpb248L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPnRlc3Q8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNzA0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5MjcwNC9KZXJzZXkyNzA0SVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjcwNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI3MDQvSmVyc2V5MjcwNElUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZDgyOWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjcwNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI3MDQvSmVyc2V5MjcwNElUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjcwNDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLmFwaS5TZXJ2aWNlTG9jYXRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjcwNC5zZXJ2aWNlcy5IYXBweVNlcnZpY2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5MjcwNC5zZXJ2aWNlcy5TYWRTZXJ2aWNlOworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKworLyoqCisgKiBUaGlzIHRlc3QgY2FzZSBpcyB0byBjb3ZlciBlbmhhbmNlbWVudCBpbXBsZW1lbnRlZCBpbiBKRVJTRVktMjcwNC4gVGhlIGdvYWwgb2YgdGhpcyBlbmhhbmNlbWVudAorICogaXMgdG8gZ2l2ZSB1c2VycyBwb3NzaWJpbGl0eSB0byByZWdpc3RlciBtYWluIHtAbGluayBTZXJ2aWNlTG9jYXRvcn0gaW4gdGhlIHNlcnZsZXQgY29udGV4dCwgc28KKyAqIGl0IGNhbiBiZSBsYXRlciB1c2VkIGJ5IEplcnNleS4gVGhpcyBjcmVhdGVzIHRoZSBvcHBvcnR1bml0eSB0byB3aXJlIEplcnNleS1zcGVjaWZpYyBjbGFzc2VzIHdpdGgKKyAqIHRoZSBzZXJ2aWNlcyBjcmVhdGVkIG91dHNpZGUgdGhlIEplcnNleSBjb250ZXh0LgorICoKKyAqIEBhdXRob3IgQmFydG9zeiBGaXJ5biAoYmFydG9zemZpcnluIGF0IGdtYWlsLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEplcnNleTI3MDRJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgVGVzdEFwcGxpY2F0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJbnZva2VzIFJFU1QgZW5kcG9pbnQgdG8gY2hlY2sgd2hldGhlciBzcGVjaWZpYyBjbGFzcyBzZXJ2aWNlIGlzIHJlZ2lzdGVyZWQgaW4gdGhlCisgICAgICoge0BsaW5rIFNlcnZpY2VMb2NhdG9yfS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzZXJ2aWNlIHRoZSBzZXJ2aWNlIGNsYXNzCisgICAgICogQHJldHVybiBIVFRQIHN0YXR1cyBjb2RlLCAyMDAgd2hlbiBzZXJ2aWNlIGlzIGF2YWlsYWJsZSBhbmQgNjAwIG90aGVyd2lzZQorICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaW4gY2FzZSBvZiBwcm9ibGVtcyB3aXRoIEhUVFAgY29tbXVuaWNhdGlvbgorICAgICAqLworICAgIHByaXZhdGUgaW50IHRlc3QoQ2xhc3M8Pz4gc2VydmljZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKworICAgICAgICBTdHJpbmcgbmFtZSA9IHNlcnZpY2UuZ2V0Q2Fub25pY2FsTmFtZSgpOworICAgICAgICBTdHJpbmcgcGF0aCA9IGdldEJhc2VVcmkoKS50b1N0cmluZygpICsgInRlc3QvIiArIG5hbWU7CisKKyAgICAgICAgSHR0cFVSTENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IChIdHRwVVJMQ29ubmVjdGlvbikgbmV3IFVSTChwYXRoKS5vcGVuQ29ubmVjdGlvbigpOworICAgICAgICBjb25uZWN0aW9uLnNldFJlcXVlc3RNZXRob2QoIkdFVCIpOworICAgICAgICBjb25uZWN0aW9uLmNvbm5lY3QoKTsKKyAgICAgICAgY29ubmVjdGlvbi5kaXNjb25uZWN0KCk7CisKKyAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24uZ2V0UmVzcG9uc2VDb2RlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0byBjb3ZlciBzdW5ueSBkYXkgc2NlbmFyaW8sIGkuZS4gc3BlY2lmaWMgc2VydmljZSBoYXMgYmVlbiByZWdpc3RlcmVkIGluIHRoZSBwYXJlbnQKKyAgICAgKiB7QGxpbmsgU2VydmljZUxvY2F0b3J9IHNvIGl0IHdpbGwgYmUgYXZhaWxhYmxlIGluIHRoZSBvbmUgdGhhdCBpcyB1c2VkIGluIEplcnNleSBjb250ZXh0LgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvcnJlY3RJbmplY3Rpb24oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgdGVzdChIYXBweVNlcnZpY2UuY2xhc3MpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHRvIGNvdmVyIHJhaW55IGRheSBzY2VuYXJpbywgaS5lLiBzcGVjaWZpYyBzZXJ2aWNlIGhhcyA8Yj5ub3Q8L2I+IGJlZW4gcmVnaXN0ZXJlZCBpbiB0aGUKKyAgICAgKiBwYXJlbnQge0BsaW5rIFNlcnZpY2VMb2NhdG9yfSBzbyBpdCBjYW5ub3QgYmUgdXNlZCB0byB3aXJlIEplcnNleSBjbGFzc2VzLgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE1pc2luZ0luamVjdGlvbigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjAwLCB0ZXN0KFNhZFNlcnZpY2UuY2xhc3MpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjc3Ni9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI3NzYvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjQ4NGE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI3NzYvcG9tLnhtbApAQCAtMCwwICsxLDgyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LTI3NzY8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tamVyc2V5LTI3NzY8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIFRoaXMgdGVzdCBpcyB0byB2ZXJpZnkgdGhhdCBtdWx0aXBhcnQgc3VwcG9ydCAoc2VydmVyIHNpZGUpIHdvcmtzIGV2ZW4gaWYgYXBhY2hlIENYRidzIFJ1bnRpbWVEZWxlZ2F0ZUltcGwgaXMgdXNlZCBpbnN0ZWFkCisgICAgICAgIG9mIHRoZSBSdW50aW1lRGVsZWdhdGVJbXBsIHNoaXBwZWQgd2l0aCBKZXJzZXkuCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDwhLS0gRm9yIHRlc3RpbmcgbXVsdGlwYXJ0IHN1cHBvcnQgd2l0aCBhbm90aGVyIGh0dHAgY2xpZW50IC0tPgorICAgICAgICA8IS0tIFRoZSBvcmRlciBvZiB0aGVzZSBpbXBvcnRzIGFyZSBpbXBvcnRhbnQgYXMgaXQncyB0aGUgZmlyc3QgZGVwZW5kZW5jeSB0aGF0IGhhcyBhIGphdmF4LndzLnJzLmV4dC5SdW50aW1lRGVsZWdhdGUgaW4KKyAgICAgICAgICAgICB0aGUgc2VydmljZXMgdGhhdCB3aWxsIGJlIHVzZWQuIC0tPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuY3hmPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y3hmLXJ0LXJzLWNsaWVudDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjMuMC4zPC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtbXVsdGlwYXJ0PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNzc2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjc3Ni9UZXN0QXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNzc2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjc3Ni9UZXN0QXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzM5YmEzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI3NzYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNzc2L1Rlc3RBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5Mjc3NjsKKworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5NdWx0aVBhcnRGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworLyoqCisgKiBKZXJzZXkgYXBwbGljYXRpb24uCisgKi8KK0BBcHBsaWNhdGlvblBhdGgoIi8iKQorcHVibGljIGNsYXNzIFRlc3RBcHBsaWNhdGlvbiBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKworICAgIHB1YmxpYyBUZXN0QXBwbGljYXRpb24oKSB7CisgICAgICAgIHJlZ2lzdGVyKFRlc3RSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJlZ2lzdGVyKE11bHRpUGFydEZlYXR1cmUuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNzc2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjc3Ni9UZXN0UmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNzc2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjc3Ni9UZXN0UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjA1ZTkxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI3NzYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNzc2L1Rlc3RSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5Mjc3NjsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5Gb3JtRGF0YUJvZHlQYXJ0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5Gb3JtRGF0YVBhcmFtOworCitAUGF0aCgiL2ZpbGVzIikKK3B1YmxpYyBjbGFzcyBUZXN0UmVzb3VyY2UgeworCisgICAgQFBPU1QKKyAgICBAQ29uc3VtZXMoTWVkaWFUeXBlLk1VTFRJUEFSVF9GT1JNX0RBVEEpCisgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgIHB1YmxpYyBTdHJpbmcgdXBsb2FkRG9jdW1lbnQoQEZvcm1EYXRhUGFyYW0oImZpbGVfcGF0aCIpIGZpbmFsIEZvcm1EYXRhQm9keVBhcnQgYm9keSkgeworICAgICAgICByZXR1cm4gYm9keS5nZXRWYWx1ZUFzKFN0cmluZy5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI3NzYvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNzc2L0plcnNleTI3NzZJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNzc2L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjc3Ni9KZXJzZXkyNzc2SVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E2ZDJhZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNzc2L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjc3Ni9KZXJzZXkyNzc2SVRDYXNlLmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyNzc2OworCitpbXBvcnQgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuaW50ZXJuYWwuTXVsdGlQYXJ0UmVhZGVyQ2xpZW50U2lkZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuYXBhY2hlLmN4Zi5qYXhycy5jbGllbnQuSkFYUlNDbGllbnRGYWN0b3J5QmVhbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmN4Zi5qYXhycy5leHQubXVsdGlwYXJ0LkF0dGFjaG1lbnQ7CitpbXBvcnQgb3JnLmFwYWNoZS5jeGYuamF4cnMuZXh0Lm11bHRpcGFydC5BdHRhY2htZW50QnVpbGRlcjsKK2ltcG9ydCBvcmcuYXBhY2hlLmN4Zi5qYXhycy5leHQubXVsdGlwYXJ0LkNvbnRlbnREaXNwb3NpdGlvbjsKK2ltcG9ydCBvcmcuYXBhY2hlLmN4Zi5qYXhycy5leHQubXVsdGlwYXJ0Lk11bHRpcGFydEJvZHk7CitpbXBvcnQgb3JnLmp1bml0Lklnbm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5lcXVhbFRvOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogQ29kZSB1bmRlciB0ZXN0OiB7QGxpbmsgTXVsdGlQYXJ0UmVhZGVyQ2xpZW50U2lkZX0gKHVucXVvdGVNZWRpYVR5cGVQYXJhbWV0ZXJzKQorICoKKyAqIEBhdXRob3IgSm9uYXRhbiBKw7Zuc3NvbiAoam9udGVqaiBhdCBnbWFpbC5jb20pCisgKi8KK0BJZ25vcmUKK3B1YmxpYyBjbGFzcyBKZXJzZXkyNzc2SVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RBcHBsaWNhdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFBhdGgoIi9maWxlcyIpCisgICAgcHVibGljIGludGVyZmFjZSBBcGFjaGVDeGZNdWx0aXBhcnRDbGllbnQgeworCisgICAgICAgIEBQT1NUCisgICAgICAgIEBDb25zdW1lcyhNZWRpYVR5cGUuTVVMVElQQVJUX0ZPUk1fREFUQSkKKyAgICAgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgICAgICBTdHJpbmcgdXBsb2FkRG9jdW1lbnQoTXVsdGlwYXJ0Qm9keSBjb250ZW50KTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUaGF0TXVsdGlwYXJ0U2VydmVyU3VwcG9ydHNCb3VuZGFyeVF1b3Rlc0V2ZW5XaXRoSW50ZXJmZXJpbmdSdW50aW1lRGVsZWdhdGUoKSB7CisgICAgICAgIGZpbmFsIEpBWFJTQ2xpZW50RmFjdG9yeUJlYW4gYmVhbiA9IG5ldyBKQVhSU0NsaWVudEZhY3RvcnlCZWFuKCk7CisgICAgICAgIGJlYW4uc2V0QWRkcmVzcyhnZXRCYXNlVXJpKCkudG9TdHJpbmcoKSk7CisgICAgICAgIGJlYW4uc2V0U2VydmljZUNsYXNzKEFwYWNoZUN4Zk11bHRpcGFydENsaWVudC5jbGFzcyk7CisgICAgICAgIGZpbmFsIEFwYWNoZUN4Zk11bHRpcGFydENsaWVudCBjeGZDbGllbnQgPSBiZWFuLmNyZWF0ZShBcGFjaGVDeGZNdWx0aXBhcnRDbGllbnQuY2xhc3MpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBvcmlnaW5hbENvbnRlbnQgPSAiYWJjIjsKKyAgICAgICAgZmluYWwgYnl0ZVtdIGNvbnRlbnQgPSBvcmlnaW5hbENvbnRlbnQuZ2V0Qnl0ZXMoU3RhbmRhcmRDaGFyc2V0cy5VU19BU0NJSSk7CisgICAgICAgIGZpbmFsIEF0dGFjaG1lbnQgZmlsZUF0dGFjaG1lbnQgPSBuZXcgQXR0YWNobWVudEJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5vYmplY3QoY29udGVudCkKKyAgICAgICAgICAgICAgICAuY29udGVudERpc3Bvc2l0aW9uKG5ldyBDb250ZW50RGlzcG9zaXRpb24oImZvcm0tZGF0YTsgZmlsZW5hbWU9XCJhYmMtZmlsZVwiOyBuYW1lPVwiZmlsZV9wYXRoXCIiKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgZmlsZUNvbnRlbnRSZXR1cm5lZEZyb21TZXJ2ZXIgPSBjeGZDbGllbnQudXBsb2FkRG9jdW1lbnQobmV3IE11bHRpcGFydEJvZHkoZmlsZUF0dGFjaG1lbnQpKTsKKyAgICAgICAgYXNzZXJ0VGhhdChmaWxlQ29udGVudFJldHVybmVkRnJvbVNlcnZlciwgZXF1YWxUbyhvcmlnaW5hbENvbnRlbnQpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjc5NC9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI3OTQvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDA5NjQxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI3OTQvcG9tLnhtbApAQCAtMCwwICsxLDcyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+amVyc2V5LTI3OTQ8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tamVyc2V5LTI3OTQ8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIFJlcHJvZHVjZXIgb2YgSkVSU0VZLTI3OTQuIFRoaXMgdGVzdCBtYWtlcyBzdXJlIHRoYXQgdGVtcG9yYXJ5IGZpbGVzIGNyZWF0ZWQgdmlhIG1pbWVwdWxsIGxpYnJhcnkgYXJlIGRlbGV0ZWQgcmlnaHQgYWZ0ZXIKKyAgICAgICAgdGhlIHJlcXVlc3QgcHJvY2Vzc2luZyBmYWlsZWQgYW5kIG5vdCB3aGVuIHRoZSBKVk0gaXMgc2h1dCBkb3duLgorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1tdWx0aXBhcnQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI3OTQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNzk0L1Rlc3RBcHBsaWNhdGlvbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI3OTQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNzk0L1Rlc3RBcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNWRmMDcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjc5NC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI3OTQvVGVzdEFwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyNzk0OworCitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0Lk11bHRpUGFydEZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCisvKioKKyAqIEplcnNleSBhcHBsaWNhdGlvbiBmb3IgSkVSU0VZLTI3OTQuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BBcHBsaWNhdGlvblBhdGgoIi8iKQorcHVibGljIGNsYXNzIFRlc3RBcHBsaWNhdGlvbiBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKworICAgIHB1YmxpYyBUZXN0QXBwbGljYXRpb24oKSB7CisgICAgICAgIHJlZ2lzdGVyKFRlc3RSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJlZ2lzdGVyKE11bHRpUGFydEZlYXR1cmUuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNzk0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjc5NC9UZXN0UmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yNzk0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjc5NC9UZXN0UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYThiODlmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI3OTQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNzk0L1Rlc3RSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5Mjc5NDsKKworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5QVVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5Gb3JtRGF0YVBhcmFtOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUGF0aCgiLyIpCitwdWJsaWMgY2xhc3MgVGVzdFJlc291cmNlIHsKKworICAgIEBQVVQKKyAgICBAQ29uc3VtZXMoIm11bHRpcGFydC9mb3JtLWRhdGEiKQorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIFN0cmluZyBwdXQoQEZvcm1EYXRhUGFyYW0oInN0cmVhbSIpIGZpbmFsIElucHV0U3RyZWFtIHN0cmVhbSkgeworICAgICAgICByZXR1cm4gIk9LIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjc5NC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI3OTQvSmVyc2V5Mjc5NElUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI3OTQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNzk0L0plcnNleTI3OTRJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGE1NGNhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI3OTQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyNzk0L0plcnNleTI3OTRJVENhc2UuamF2YQpAQCAtMCwwICsxLDEyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyNzk0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlVmlzaXRSZXN1bHQ7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlNpbXBsZUZpbGVWaXNpdG9yOworaW1wb3J0IGphdmEubmlvLmZpbGUuYXR0cmlidXRlLkJhc2ljRmlsZUF0dHJpYnV0ZXM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuYXRvbWljLkF0b21pY0ludGVnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBKRVJTRVktMjc5NCByZXByb2R1Y2VyLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgSmVyc2V5Mjc5NElUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBcHBsaWNhdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBtaW1lVGVtcEZpbGVSZW1vdmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyB0ZW1wRGlyID0gU3lzdGVtLmdldFByb3BlcnR5KCJqYXZhLmlvLnRtcGRpciIpOworCisgICAgICAgIC8vIEdldCBudW1iZXIgb2YgbWF0Y2hpbmcgTUlNRSp0bXAgZmlsZXMgKHRoZSBudW1iZXIgc2hvdWxkIGJlIHRoZSBzYW1lIGF0IHRoZSBlbmQgb2YgdGhlIHRlc3QpLgorICAgICAgICBmaW5hbCBpbnQgZXhwZWN0ZWRUZW1wRmlsZXMgPSBtYXRjaGluZ1RlbXBGaWxlcyh0ZW1wRGlyKTsKKworICAgICAgICBmaW5hbCBVUkwgdXJsID0gbmV3IFVSTChnZXRCYXNlVXJpKCkudG9TdHJpbmcoKSk7CisgICAgICAgIGZpbmFsIEh0dHBVUkxDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSAoSHR0cFVSTENvbm5lY3Rpb24pIHVybC5vcGVuQ29ubmVjdGlvbigpOworCisgICAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdE1ldGhvZCgiUFVUIik7CisgICAgICAgIGNvbm5lY3Rpb24uc2V0UmVxdWVzdFByb3BlcnR5KCJBY2NlcHQiLCAidGV4dC9wbGFpbiIpOworICAgICAgICBjb25uZWN0aW9uLnNldFJlcXVlc3RQcm9wZXJ0eSgiQ29udGVudC1UeXBlIiwgIm11bHRpcGFydC9mb3JtLWRhdGE7IGJvdW5kYXJ5PVhYWFhfWVlZWSIpOworCisgICAgICAgIGNvbm5lY3Rpb24uc2V0RG9PdXRwdXQodHJ1ZSk7CisgICAgICAgIGNvbm5lY3Rpb24uY29ubmVjdCgpOworCisgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0gPSBjb25uZWN0aW9uLmdldE91dHB1dFN0cmVhbSgpOworICAgICAgICBvdXRwdXRTdHJlYW0ud3JpdGUoIi0tWFhYWF9ZWVlZIi5nZXRCeXRlcygpKTsKKyAgICAgICAgb3V0cHV0U3RyZWFtLndyaXRlKCdcbicpOworICAgICAgICBvdXRwdXRTdHJlYW0ud3JpdGUoIkNvbnRlbnQtVHlwZTogdGV4dC9wbGFpbiIuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIG91dHB1dFN0cmVhbS53cml0ZSgnXG4nKTsKKyAgICAgICAgb3V0cHV0U3RyZWFtLndyaXRlKCJDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9XCJiaWctcGFydFwiIi5nZXRCeXRlcygpKTsKKyAgICAgICAgb3V0cHV0U3RyZWFtLndyaXRlKCdcbicpOworICAgICAgICBvdXRwdXRTdHJlYW0ud3JpdGUoJ1xuJyk7CisKKyAgICAgICAgLy8gU2VuZCBiaWcgY2h1bmsgb2YgZGF0YS4KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNiAqIDQwOTY7IGkrKykgeworICAgICAgICAgICAgb3V0cHV0U3RyZWFtLndyaXRlKCdFJyk7CisgICAgICAgICAgICBpZiAoaSAlIDEwMjQgPT0gMCkgeworICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS5mbHVzaCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gRG8gTk9UIHNlbmQgZW5kIG9mIHRoZSBNdWx0aVBhcnQgbWVzc2FnZSB0byBzaW11bGF0ZSB0aGUgaXNzdWUuCisKKyAgICAgICAgLy8gR2V0IFJlc3BvbnNlIC4uLgorICAgICAgICBhc3NlcnRUaGF0KCJCYWQgUmVxdWVzdCBleHBlY3RlZCIsIGNvbm5lY3Rpb24uZ2V0UmVzcG9uc2VDb2RlKCksIGlzKDQwMCkpOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBNaW1lcHVsbCBtZXNzYWdlIGFuZCBpdCdzIHBhcnRzIGhhdmUgYmVlbiBjbG9zZWQgYW5kIHRlbXBvcmFyeSBmaWxlcyBkZWxldGVkLgorICAgICAgICBhc3NlcnRUaGF0KCJUZW1wb3JhcnkgbWltZXB1bGwgZmlsZXMgd2VyZSBub3QgZGVsZXRlZCIsIG1hdGNoaW5nVGVtcEZpbGVzKHRlbXBEaXIpLCBpcyhleHBlY3RlZFRlbXBGaWxlcykpOworCisgICAgICAgIC8vIC4uLiBEaXNjb25uZWN0LgorICAgICAgICBjb25uZWN0aW9uLmRpc2Nvbm5lY3QoKTsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBtYXRjaGluZ1RlbXBGaWxlcyhmaW5hbCBTdHJpbmcgdGVtcERpcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgQXRvbWljSW50ZWdlciBjb3VudCA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOworICAgICAgICBGaWxlcy53YWxrRmlsZVRyZWUoUGF0aHMuZ2V0KHRlbXBEaXIpLCBuZXcgU2ltcGxlRmlsZVZpc2l0b3I8UGF0aD4oKSB7CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBGaWxlVmlzaXRSZXN1bHQgdmlzaXRGaWxlKFBhdGggZmlsZSwgQmFzaWNGaWxlQXR0cmlidXRlcyBhdHRycykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlsZS5nZXRGaWxlTmFtZSgpLnN0YXJ0c1dpdGgoIk1JTUUiKSAmJiBmaWxlLmdldEZpbGVOYW1lKCkuZW5kc1dpdGgoInRtcCIpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50LmluY3JlbWVudEFuZEdldCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gRmlsZVZpc2l0UmVzdWx0LkNPTlRJTlVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBGaWxlVmlzaXRSZXN1bHQgdmlzaXRGaWxlRmFpbGVkKFBhdGggZmlsZSwgSU9FeGNlcHRpb24gZXhjKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIHJldHVybiBGaWxlVmlzaXRSZXN1bHQuQ09OVElOVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEZpbGVWaXNpdFJlc3VsdCBwb3N0VmlzaXREaXJlY3RvcnkoUGF0aCBkaXIsIElPRXhjZXB0aW9uIGV4YykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRmlsZVZpc2l0UmVzdWx0LkNPTlRJTlVFOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIGNvdW50LmdldCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yODQ2L3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjg0Ni9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNTQ4MTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjg0Ni9wb20ueG1sCkBAIC0wLDAgKzEsNzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktMjg0NjwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1qZXJzZXktMjg0NjwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgUmVwcm9kdWNlciBvZiBKRVJTRVktMjg0Ni4gVGhpcyB0ZXN0IG1ha2VzIHN1cmUgdGhhdCB0ZW1wb3JhcnkgZmlsZXMgY3JlYXRlZCB2aWEgbWltZXB1bGwgKGFuZCBtb3ZlZCBieSBKZXJzZXkpIGxpYnJhcnkKKyAgICAgICAgYXJlIGRlbGV0ZWQgcmlnaHQgYWZ0ZXIgdGhlIHJlcXVlc3QgcHJvY2Vzc2luZyAoZWl0aGVyIHN1Y2Nlc3NmdWwgb3IgdW5zdWNjZXNzZnVsKSBhbmQgbm90IHdoZW4gdGhlIEpWTSBpcyBzaHV0IGRvd24uCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLW11bHRpcGFydDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjg0Ni9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI4NDYvVGVzdEFwcGxpY2F0aW9uLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjg0Ni9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI4NDYvVGVzdEFwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJkYWZiZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yODQ2L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjg0Ni9UZXN0QXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI4NDY7CisKK2ltcG9ydCBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGg7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuTXVsdGlQYXJ0RmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKKy8qKgorICogSmVyc2V5IGFwcGxpY2F0aW9uIGZvciBKRVJTRVktMjg0Ni4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQEFwcGxpY2F0aW9uUGF0aCgiLyIpCitwdWJsaWMgY2xhc3MgVGVzdEFwcGxpY2F0aW9uIGV4dGVuZHMgUmVzb3VyY2VDb25maWcgeworCisgICAgcHVibGljIFRlc3RBcHBsaWNhdGlvbigpIHsKKyAgICAgICAgcmVnaXN0ZXIoVGVzdFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgcmVnaXN0ZXIoTXVsdGlQYXJ0RmVhdHVyZS5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI4NDYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyODQ2L1Rlc3RSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI4NDYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyODQ2L1Rlc3RSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNTZmY2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjg0Ni9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI4NDYvVGVzdFJlc291cmNlLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyODQ2OworCitpbXBvcnQgamF2YS5pby5GaWxlOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuRm9ybURhdGFQYXJhbTsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFBhdGgoIi8iKQorQENvbnN1bWVzKCJtdWx0aXBhcnQvZm9ybS1kYXRhIikKK0BQcm9kdWNlcygidGV4dC9wbGFpbiIpCitwdWJsaWMgY2xhc3MgVGVzdFJlc291cmNlIHsKKworICAgIEBQT1NUCisgICAgQFBhdGgoIkV4Y2VwdGlvbkluTWV0aG9kIikKKyAgICBwdWJsaWMgU3RyaW5nIGV4Y2VwdGlvbkluTWV0aG9kKEBGb3JtRGF0YVBhcmFtKCJmaWxlIikgZmluYWwgRmlsZSBmaWxlKSB7CisgICAgICAgIHRocm93IG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbihSZXNwb25zZS5zZXJ2ZXJFcnJvcigpLmVudGl0eShmaWxlLmdldEFic29sdXRlUGF0aCgpKS5idWlsZCgpKTsKKyAgICB9CisKKyAgICBAUE9TVAorICAgIEBQYXRoKCJTdWNjZXNzZnVsTWV0aG9kIikKKyAgICBwdWJsaWMgU3RyaW5nIHN1Y2Nlc3NmdWxNZXRob2QoQEZvcm1EYXRhUGFyYW0oImZpbGUiKSBmaW5hbCBGaWxlIGZpbGUpIHsKKyAgICAgICAgcmV0dXJuIGZpbGUuZ2V0QWJzb2x1dGVQYXRoKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI4NDYvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyODQ2L0plcnNleTI4NDZJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yODQ2L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjg0Ni9KZXJzZXkyODQ2SVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFlY2FhMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yODQ2L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjg0Ni9KZXJzZXkyODQ2SVRDYXNlLmphdmEKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5Mjg0NjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlVmlzaXRSZXN1bHQ7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlNpbXBsZUZpbGVWaXNpdG9yOworaW1wb3J0IGphdmEubmlvLmZpbGUuYXR0cmlidXRlLkJhc2ljRmlsZUF0dHJpYnV0ZXM7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuRm9ybURhdGFCb2R5UGFydDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuRm9ybURhdGFDb250ZW50RGlzcG9zaXRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0LkZvcm1EYXRhTXVsdGlQYXJ0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5NdWx0aVBhcnRGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogSkVSU0VZLTI4NDYgcmVwcm9kdWNlci4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEplcnNleTI4NDZJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgQXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChmaW5hbCBDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihNdWx0aVBhcnRGZWF0dXJlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlbXBGaWxlRGVsZXRlZEFmdGVyU3VjY2Vzc2Z1bFByb2Nlc3NpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RTbWFsbCgiU3VjY2Vzc2Z1bE1ldGhvZCIsIDIwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZW1wRmlsZURlbGV0ZWRBZnRlckV4Y2VwdGlvbkluTWV0aG9kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0U21hbGwoIkV4Y2VwdGlvbkluTWV0aG9kIiwgNTAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlbXBGaWxlRGVsZXRlZEFmdGVyU3VjY2Vzc2Z1bFByb2Nlc3NpbmdCaWdFbnRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RCaWcoIlN1Y2Nlc3NmdWxNZXRob2QiLCAyMDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVtcEZpbGVEZWxldGVkQWZ0ZXJFeGNlcHRpb25Jbk1ldGhvZEJpZ0VudGl0eSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdEJpZygiRXhjZXB0aW9uSW5NZXRob2QiLCA1MDApOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIF90ZXN0QmlnKGZpbmFsIFN0cmluZyBwYXRoLCBmaW5hbCBpbnQgc3RhdHVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgYnl0ZVtdIGFycmF5ID0gbmV3IGJ5dGVbODE5Nl07CisgICAgICAgIEFycmF5cy5maWxsKGFycmF5LCAoYnl0ZSkgNTIpOworCisgICAgICAgIF90ZXN0KHBhdGgsIHN0YXR1cywgYXJyYXkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIF90ZXN0U21hbGwoZmluYWwgU3RyaW5nIHBhdGgsIGZpbmFsIGludCBzdGF0dXMpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdChwYXRoLCBzdGF0dXMsICJDT05URU5UIik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgX3Rlc3QoZmluYWwgU3RyaW5nIHBhdGgsIGZpbmFsIGludCBzdGF0dXMsIGZpbmFsIE9iamVjdCBlbnRpdHkpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgdGVtcERpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiamF2YS5pby50bXBkaXIiKTsKKworICAgICAgICAvLyBHZXQgbnVtYmVyIG9mIG1hdGNoaW5nIE1JTUUqdG1wIGZpbGVzICh0aGUgbnVtYmVyIHNob3VsZCBiZSB0aGUgc2FtZSBhdCB0aGUgZW5kIG9mIHRoZSB0ZXN0KS4KKyAgICAgICAgZmluYWwgaW50IGV4cGVjdGVkVGVtcEZpbGVzID0gbWF0Y2hpbmdUZW1wRmlsZXModGVtcERpcik7CisKKyAgICAgICAgZmluYWwgRm9ybURhdGFNdWx0aVBhcnQgbXVsdGlwYXJ0ID0gbmV3IEZvcm1EYXRhTXVsdGlQYXJ0KCk7CisgICAgICAgIGZpbmFsIEZvcm1EYXRhQm9keVBhcnQgYm9keXBhcnQgPSBuZXcgRm9ybURhdGFCb2R5UGFydChGb3JtRGF0YUNvbnRlbnREaXNwb3NpdGlvbi5uYW1lKCJmaWxlIikuZmlsZU5hbWUoImZpbGUiKS5idWlsZCgpLAorICAgICAgICAgICAgICAgIGVudGl0eSwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSk7CisgICAgICAgIG11bHRpcGFydC5ib2R5UGFydChib2R5cGFydCk7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKHBhdGgpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkobXVsdGlwYXJ0LCBNZWRpYVR5cGUuTVVMVElQQVJUX0ZPUk1fREFUQSkpOworCisgICAgICAgIC8vIEdldCBSZXNwb25zZSAuLi4KKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoc3RhdHVzKSk7CisgICAgICAgIC8vIFdhaXQgYSBzZWNvbmQgdG8gbWFrZSBzdXJlIHRoZSBmaWxlcyBkb24ndCBleGlzdC4KKyAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOworCisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBtZXNzYWdlIGFuZCBpdCdzIHBhcnRzIGhhdmUgYmVlbiBjbG9zZWQgYW5kIHRlbXBvcmFyeSBmaWxlcyBkZWxldGVkLgorICAgICAgICBhc3NlcnRUaGF0KCJUZW1wb3JhcnkgZmlsZXMgd2VyZSBub3QgZGVsZXRlZCIsIG1hdGNoaW5nVGVtcEZpbGVzKHRlbXBEaXIpLCBpcyhleHBlY3RlZFRlbXBGaWxlcykpOworICAgIH0KKworICAgIHByaXZhdGUgaW50IG1hdGNoaW5nVGVtcEZpbGVzKGZpbmFsIFN0cmluZyB0ZW1wRGlyKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBBdG9taWNJbnRlZ2VyIGNvdW50ID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CisgICAgICAgIEZpbGVzLndhbGtGaWxlVHJlZShQYXRocy5nZXQodGVtcERpciksIG5ldyBTaW1wbGVGaWxlVmlzaXRvcjxQYXRoPigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEZpbGVWaXNpdFJlc3VsdCB2aXNpdEZpbGUoUGF0aCBmaWxlLCBCYXNpY0ZpbGVBdHRyaWJ1dGVzIGF0dHJzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIFBhdGggbmFtZSA9IGZpbGUuZ2V0RmlsZU5hbWUoKTsKKyAgICAgICAgICAgICAgICBpZiAoKG5hbWUuc3RhcnRzV2l0aCgicmVwIikgfHwgbmFtZS5zdGFydHNXaXRoKCJNSU1FIikpICYmIG5hbWUuZW5kc1dpdGgoInRtcCIpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvdW50LmluY3JlbWVudEFuZEdldCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gRmlsZVZpc2l0UmVzdWx0LkNPTlRJTlVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBGaWxlVmlzaXRSZXN1bHQgdmlzaXRGaWxlRmFpbGVkKFBhdGggZmlsZSwgSU9FeGNlcHRpb24gZXhjKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgIHJldHVybiBGaWxlVmlzaXRSZXN1bHQuQ09OVElOVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIEZpbGVWaXNpdFJlc3VsdCBwb3N0VmlzaXREaXJlY3RvcnkoUGF0aCBkaXIsIElPRXhjZXB0aW9uIGV4YykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRmlsZVZpc2l0UmVzdWx0LkNPTlRJTlVFOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIGNvdW50LmdldCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yODc4L3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjg3OC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZjZhZTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjg3OC9wb20ueG1sCkBAIC0wLDAgKzEsNzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktMjg3ODwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1qZXJzZXktMjg3ODwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgUmVwcm9kdWNlciBvZiBKRVJTRVktMjg3OC4KKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbm5lY3RvcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktYXBhY2hlLWNvbm5lY3RvcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI4Nzgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyODc4L1Rlc3RBcHBsaWNhdGlvbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI4Nzgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyODc4L1Rlc3RBcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZjUzM2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjg3OC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI4NzgvVGVzdEFwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyODc4OworCitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCisvKioKKyAqIEplcnNleSBhcHBsaWNhdGlvbiBmb3IgSkVSU0VZLTI4NzguCisgKgorICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYSBhdCBvcmFjbGUuY29tKQorICovCitAQXBwbGljYXRpb25QYXRoKCIvIikKK3B1YmxpYyBjbGFzcyBUZXN0QXBwbGljYXRpb24gZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisKKyAgICBwdWJsaWMgVGVzdEFwcGxpY2F0aW9uKCkgeworICAgICAgICByZWdpc3RlcihUZXN0UmVzb3VyY2UuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yODc4L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjg3OC9UZXN0UmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yODc4L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjg3OC9UZXN0UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWFkYTZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI4Nzgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyODc4L1Rlc3RSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5Mjg3ODsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworCisvKioKKyAqIEEgc2ltcGxlIHJlc291cmNlIHRoYXQgcmV0dXJucyBhIHN0cmluZy4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJzdHJpbmciKQorcHVibGljIGNsYXNzIFRlc3RSZXNvdXJjZSB7CisKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBzdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiSGVsbG8sIFdvcmxkISAiCisgICAgICAgICAgICAgICAgKyAiSW4gcHJvZHVjdGlvbiB0aGlzIHJlc3BvbnNlIHdvdWxkIGJlIGxhcmdlLCAiCisgICAgICAgICAgICAgICAgKyAiYW5kIHVuc3VpdGFibGUgZm9yIGJ1ZmZlcmluZyBpbiBtZW1vcnkiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yODc4L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjg3OC9KZXJzZXkyODc4QXBhY2hlSVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjg3OC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI4NzgvSmVyc2V5Mjg3OEFwYWNoZUlUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ODZiNTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjg3OC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI4NzgvSmVyc2V5Mjg3OEFwYWNoZUlUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5Mjg3ODsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmFwYWNoZS5jb25uZWN0b3IuQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKKworLyoqCisgKiBBZGRpdGlvbmFsIHRlc3QgY2xhc3MgdGhhdCB0ZXN0cyBqZXJzZXkgY2xpZW50IGNvbmZpZ3VyZWQgd2l0aCB0aGUgYXBhY2hlIGh0dHAuCisgKgorICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYSBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSmVyc2V5Mjg3OEFwYWNoZUlUQ2FzZSBleHRlbmRzIEplcnNleTI4NzhJVENhc2UgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KGZpbmFsIENsaWVudENvbmZpZyBjb25maWcpIHsKKyAgICAgICAgY29uZmlnLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBBcGFjaGVDb25uZWN0b3JQcm92aWRlcigpKTsKKworICAgICAgICBzdXBlci5jb25maWd1cmVDbGllbnQoY29uZmlnKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjg3OC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI4NzgvSmVyc2V5Mjg3OElUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI4Nzgvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyODc4L0plcnNleTI4NzhJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzFmNDlmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI4Nzgvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyODc4L0plcnNleTI4NzhJVENhc2UuamF2YQpAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyODc4OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudFJlc3BvbnNlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50UmVzcG9uc2VGaWx0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCitwdWJsaWMgY2xhc3MgSmVyc2V5Mjg3OElUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBMaXN0PElucHV0U3RyZWFtPiByZXNwb25zZUlucHV0U3RyZWFtcyA9IG5ldyBBcnJheUxpc3Q8PigpOworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RBcHBsaWNhdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIENsaWVudFJlc3BvbnNlRmlsdGVyIHRyYWNrSW5wdXRTdHJlYW1zID0gbmV3IENsaWVudFJlc3BvbnNlRmlsdGVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ2xpZW50UmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsIENsaWVudFJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgcmVzcG9uc2VJbnB1dFN0cmVhbXMuYWRkKHJlc3BvbnNlQ29udGV4dC5nZXRFbnRpdHlTdHJlYW0oKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgY29uZmlnLnJlZ2lzdGVyKHRyYWNrSW5wdXRTdHJlYW1zKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNvbnN1bWVTdHJlYW1GdWxseShJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgd2hpbGUgKGlucHV0U3RyZWFtLnJlYWQoKSAhPSAtMSkgeworICAgICAgICAgICAgLy9jb25zdW1lIHRoZSBzdHJlYW0gZnVsbHkKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGhpc1Nob3VsZFdvcmtCdXRGYWlscygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSB0YXJnZXQoInN0cmluZyIpLnJlcXVlc3QoKS5nZXQoSW5wdXRTdHJlYW0uY2xhc3MpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29uc3VtZVN0cmVhbUZ1bGx5KHN0cmVhbSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdHJlYW0ucmVhZCgpOworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIHdoZW4gcmVhZCgpIHdhcyBjYWxsZWQgb24gY2xvc2VkIHN0cmVhbSEgU3RyZWFtIGltcGxlbWVudGF0aW9uOiAiICsgc3RyZWFtLmdldENsYXNzKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyB0aGlzIGlzIGRlc2lyZWQKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydFRoYXRBbGxJbnB1dFN0cmVhbXNBcmVDbG9zZWQoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRoaXNXb3Jrc0J1dElzUmVhbGx5VWdseSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgic3RyaW5nIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBpZiAocmVzcG9uc2UuZ2V0U3RhdHVzSW5mbygpLmdldEZhbWlseSgpICE9IFJlc3BvbnNlLlN0YXR1cy5GYW1pbHkuU1VDQ0VTU0ZVTCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIldlIGhhdmUgdG8gbWFudWFsbHkgY2hlY2sgdGhhdCB0aGUgcmVzcG9uc2Ugd2FzIHN1Y2Nlc3NmdWwiKTsKKyAgICAgICAgfQorICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSByZXNwb25zZS5yZWFkRW50aXR5KElucHV0U3RyZWFtLmNsYXNzKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbnN1bWVTdHJlYW1GdWxseShzdHJlYW0pOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgcmVzcG9uc2UuY2xvc2UoKTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBzdHJlYW0ucmVhZCgpOworICAgICAgICAgICAgZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIHdoZW4gcmVhZCgpIHdhcyBjYWxsZWQgb24gY2xvc2VkIHN0cmVhbSEgU3RyZWFtIGltcGxlbWVudGF0aW9uOiAiICsgc3RyZWFtLmdldENsYXNzKCkpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAvLyB0aGlzIGlzIGRlc2lyZWQKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydFRoYXRBbGxJbnB1dFN0cmVhbXNBcmVDbG9zZWQoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRoaXNBbHNvRmFpbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoInN0cmluZyIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgaWYgKHJlc3BvbnNlLmdldFN0YXR1c0luZm8oKS5nZXRGYW1pbHkoKSAhPSBSZXNwb25zZS5TdGF0dXMuRmFtaWx5LlNVQ0NFU1NGVUwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJXZSBoYXZlIHRvIG1hbnVhbGx5IGNoZWNrIHRoYXQgdGhlIHJlc3BvbnNlIHdhcyBzdWNjZXNzZnVsIik7CisgICAgICAgIH0KKworICAgICAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSByZXNwb25zZS5yZWFkRW50aXR5KElucHV0U3RyZWFtLmNsYXNzKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbnN1bWVTdHJlYW1GdWxseShzdHJlYW0pOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7CisgICAgICAgIH0KKworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3RyZWFtLnJlYWQoKTsKKyAgICAgICAgICAgIGZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biB3aGVuIHJlYWQoKSB3YXMgY2FsbGVkIG9uIGNsb3NlZCBzdHJlYW0hIFN0cmVhbSBpbXBsZW1lbnRhdGlvbjogIiArIHN0cmVhbS5nZXRDbGFzcygpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gdGhpcyBpcyBkZXNpcmVkCisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRUaGF0QWxsSW5wdXRTdHJlYW1zQXJlQ2xvc2VkKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB3b3Jrc1dpdGhBQ2FzdF9pZllvdUtub3dUaGF0WW91Q2FuQ2FzdCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgic3RyaW5nIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBpZiAocmVzcG9uc2UuZ2V0U3RhdHVzSW5mbygpLmdldEZhbWlseSgpICE9IFJlc3BvbnNlLlN0YXR1cy5GYW1pbHkuU1VDQ0VTU0ZVTCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIldlIGhhdmUgdG8gbWFudWFsbHkgY2hlY2sgdGhhdCB0aGUgcmVzcG9uc2Ugd2FzIHN1Y2Nlc3NmdWwiKTsKKyAgICAgICAgfQorCisgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IChJbnB1dFN0cmVhbSkgcmVzcG9uc2UuZ2V0RW50aXR5KCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBjb25zdW1lU3RyZWFtRnVsbHkoc3RyZWFtKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOworICAgICAgICB9CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN0cmVhbS5yZWFkKCk7CisgICAgICAgICAgICBmYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24gd2hlbiByZWFkKCkgd2FzIGNhbGxlZCBvbiBjbG9zZWQgc3RyZWFtISBTdHJlYW0gaW1wbGVtZW50YXRpb246ICIgKyBzdHJlYW0uZ2V0Q2xhc3MoKSk7CisgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIHRoaXMgaXMgZGVzaXJlZAorICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0VGhhdEFsbElucHV0U3RyZWFtc0FyZUNsb3NlZCgpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRUaGF0QWxsSW5wdXRTdHJlYW1zQXJlQ2xvc2VkKCkgeworICAgICAgICBpZiAocmVzcG9uc2VJbnB1dFN0cmVhbXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIGZhaWwoIm5vIGlucHV0IHN0cmVhbSB0byBjaGVjayIpOworICAgICAgICB9CisgICAgICAgIGZvciAoSW5wdXRTdHJlYW0gc3RyZWFtIDogcmVzcG9uc2VJbnB1dFN0cmVhbXMpIHsKKyAgICAgICAgICAgIGFzc2VydENsb3NlZChzdHJlYW0pOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydENsb3NlZChJbnB1dFN0cmVhbSBzdHJlYW0pIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVsyNTZdOworICAgICAgICAgICAgc3RyZWFtLnJlYWQoYnVmZmVyKTsgLy9pdCdzIG5vdCBpZ25vcmVkIOKAlCB3ZSdyZSBjaGVja2luZyBmb3IgdGhlIGV4Y2VwdGlvbgorICAgICAgICAgICAgZmFpbCgiU3RyZWFtIGlzIG5vdCBjbG9zZWQhIFN0cmVhbSBpbXBsZW1lbnRhdGlvbjogIiArIHN0cmVhbS5nZXRDbGFzcygpKTsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgLy8gYW4gZXhjZXB0aW9uIGlzIGRlc2lyZWQKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yODkyL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjg5Mi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNDY0N2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjg5Mi9wb20ueG1sCkBAIC0wLDAgKzEsNzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktMjg5MjwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1qZXJzZXktMjg5MjwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgUmVwcm9kdWNlciBvZiBKRVJTRVktMjg5Mi4KKworICAgICAgICBSZXBlYXRpbmcgY2xhc3NlcyBpbiBvYmplY3QgZ3JhcGggb2YgZW50aXR5IGZpbHRlcmluZyBmYWNpbGl0eSBzaG91bGQgbm90IGJlIGFsd2F5cyBmaWx0ZXJlZCBvdXQuCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPCEtLSB3aGljaCBqZXJzZXkgbWVkaWEgcHJvdmlkZXIgdG8gdXNlIGlzIGRldGVybWluZWQgaW4gd2ViLnhtbCBieSB1c2luZyAnamVyc2V5LmNvbmZpZy5qc29uRmVhdHVyZScgaW5pdCBwYXJhbSAtLT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1tb3h5PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtanNvbi1qYWNrc29uPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjg5Mi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI4OTIvVGVzdEFwcGxpY2F0aW9uLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjg5Mi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI4OTIvVGVzdEFwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjFiNWViMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yODkyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjg5Mi9UZXN0QXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLmplcnNleTI4OTI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGg7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5FbnRpdHlGaWx0ZXJpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworLyoqCisgKiBKZXJzZXkgYXBwbGljYXRpb24gZm9yIEpFUlNFWS0yODc4IGFuZCBhbHNvIEotNjA1ICh3aGljaCBpcyBkZXJpdmVkIGZyb20gdGhlIGZvcm1lciBvbmUpLgorICoKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uUGF0aCgiLyIpCitwdWJsaWMgY2xhc3MgVGVzdEFwcGxpY2F0aW9uIGV4dGVuZHMgUmVzb3VyY2VDb25maWcgeworCisgICAgcHVibGljIFRlc3RBcHBsaWNhdGlvbigpIHsKKyAgICAgICAgcmVnaXN0ZXIoVGVzdFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgcmVnaXN0ZXIoRW50aXR5RmlsdGVyaW5nRmVhdHVyZS5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI4OTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyODkyL1Rlc3RSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI4OTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyODkyL1Rlc3RSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1OWIyNTIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjg5Mi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTI4OTIvVGVzdFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5Mjg5MjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxUcmFuc2llbnQ7CisKKy8qKgorICogQSByZXNvdXJjZSB0aGF0IHByb3ZpZGVzIGEgbWVhbnMgdG8gdGVzdCB3aGV0aGVyIHJlcGVhdGluZyBjbGFzc2VzIGluIG9iamVjdCBncmFwaCBhcmUgY29ycmVjdGx5IGZpbHRlcmVkIG91dC4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCIvIikKK0BQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKK3B1YmxpYyBjbGFzcyBUZXN0UmVzb3VyY2UgeworCisgICAgQEdFVAorICAgIEBQYXRoKCJwb2ludGVyIikKKyAgICBwdWJsaWMgUG9pbnRlciBwb2ludGVyKCkgeworICAgICAgICByZXR1cm4gbmV3IFBvaW50ZXIoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFBvaW50ZXIgeworCisgICAgICAgIHB1YmxpYyBmaW5hbCBQZXJzb25zIHBlcnNvbnMgPSBuZXcgUGVyc29ucygpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgidGVzdCIpCisgICAgcHVibGljIFBlcnNvbnMgaXNzdWUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUGVyc29ucygpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGVyc29ucyB7CisKKyAgICAgICAgcHVibGljIGZpbmFsIFBlcnNvbiBmaXJzdCA9IG5ldyBQZXJzb24oIkxhcnJ5IiwgIkFtcGhpdGhlYXRyZSBQa3d5IiwgMTYwMCwgIk1vdW50YWluIFZpZXciKTsKKyAgICAgICAgcHVibGljIGZpbmFsIFBlcnNvbiBzZWNvbmQgPSBuZXcgUGVyc29uKCJCaWxsIiwgIk1pY3Jvc29mdCBXYXkiLCAxLCAiUmVkbW9uZCIpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGVyc29uIHsKKworICAgICAgICBwdWJsaWMgUGVyc29uKCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFBlcnNvbihmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIHN0cmVldE5hbWUsIGZpbmFsIGludCBzdHJlZXROdW1iZXIsIGZpbmFsIFN0cmluZyBjaXR5KSB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICAgICAgYWRkcmVzcyA9IG5ldyBBZGRyZXNzKHN0cmVldE5hbWUsIHN0cmVldE51bWJlciwgY2l0eSk7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgQWRkcmVzcyBhZGRyZXNzOworICAgICAgICBwdWJsaWMgU3RyaW5nIG5hbWU7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBBZGRyZXNzIHsKKworICAgICAgICBwdWJsaWMgQWRkcmVzcygpIHsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBBZGRyZXNzKGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBpbnQgbnVtYmVyLCBmaW5hbCBTdHJpbmcgY2l0eSkgeworICAgICAgICAgICAgdGhpcy5jaXR5ID0gY2l0eTsKKyAgICAgICAgICAgIHN0cmVldCA9IG5ldyBTdHJlZXQobmFtZSwgbnVtYmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJlZXQgc3RyZWV0OworICAgICAgICBwdWJsaWMgU3RyaW5nIGNpdHk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdHJlZXQgeworCisgICAgICAgIHB1YmxpYyBTdHJlZXQoKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyZWV0KGZpbmFsIFN0cmluZyBuYW1lLCBmaW5hbCBpbnQgbnVtYmVyKSB7CisgICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICAgICAgdGhpcy5udW1iZXIgPSBudW1iZXI7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgU3RyaW5nIG5hbWU7CisgICAgICAgIHB1YmxpYyBpbnQgbnVtYmVyOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgicmVjdXJzaXZlIikKKyAgICBwdWJsaWMgUmVjdXJzaXZlIHJlY3Vyc2l2ZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZWN1cnNpdmUoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJlY3Vyc2l2ZSB7CisKKyAgICAgICAgcHVibGljIFN0cmluZyBpZFJlY3Vyc2l2ZSA9ICJhIjsKKyAgICAgICAgcHVibGljIFN1YkZpZWxkIHN1YkZpZWxkID0gbmV3IFN1YkZpZWxkKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBTdWJGaWVsZCB7CisKKyAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBpZFN1YkZpZWxkID0gImIiOworICAgICAgICBwdWJsaWMgZmluYWwgU3ViU3ViRmllbGQgc3ViU3ViRmllbGQ7CisKKyAgICAgICAgcHVibGljIFN1YkZpZWxkKCkgeworICAgICAgICAgICAgc3ViU3ViRmllbGQgPSBuZXcgU3ViU3ViRmllbGQodGhpcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN1YlN1YkZpZWxkIHsKKworICAgICAgICBwdWJsaWMgZmluYWwgU3RyaW5nIGlkU3ViU3ViRmllbGQgPSAiYyI7CisKKyAgICAgICAgQFhtbFRyYW5zaWVudAorICAgICAgICBwdWJsaWMgU3ViRmllbGQgc3ViRmllbGQ7CisKKyAgICAgICAgcHVibGljIFN1YlN1YkZpZWxkKCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN1YlN1YkZpZWxkKGZpbmFsIFN1YkZpZWxkIHN1YkZpZWxkKSB7CisgICAgICAgICAgICB0aGlzLnN1YkZpZWxkID0gc3ViRmllbGQ7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktMjg5Mi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI4OTIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTJhNDM1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI4OTIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDU5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjIuNSIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5qZXJzZXlNb3h5RmlsdGVyaW5nRmVhdHVyZTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5Mjg5Mi5UZXN0QXBwbGljYXRpb248L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amVyc2V5LmNvbmZpZy5qc29uRmVhdHVyZTwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5Nb3h5SnNvbkZlYXR1cmU8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPmplcnNleU1veHlGaWx0ZXJpbmdGZWF0dXJlPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vbW94eS8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPmplcnNleUphY2tzb25GaWx0ZXJpbmdGZWF0dXJlPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC53cy5ycy5BcHBsaWNhdGlvbjwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXkyODkyLlRlc3RBcHBsaWNhdGlvbjwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qZXJzZXkuY29uZmlnLmpzb25GZWF0dXJlPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPkphY2tzb25GZWF0dXJlPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5qZXJzZXlKYWNrc29uRmlsdGVyaW5nRmVhdHVyZTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L2phY2tzb24vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yODkyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjg5Mi9BYnN0cmFjdEplcnNleUVudGl0eUZpbHRlcmluZ0lUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI4OTIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyODkyL0Fic3RyYWN0SmVyc2V5RW50aXR5RmlsdGVyaW5nSVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM1YTdhYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yODkyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjg5Mi9BYnN0cmFjdEplcnNleUVudGl0eUZpbHRlcmluZ0lUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5Mjg5MjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGVzdHMgd2hldGhlciBjbGFzc2VzIHJlcGVhdGluZyBpbiB0aGUgb2JqZWN0IGdyYXBoIGFyZSBmaWx0ZXJlZCBvdXQgY29ycmVjdGx5LgorICoKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SmVyc2V5RW50aXR5RmlsdGVyaW5nSVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFRlc3RBcHBsaWNhdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgd2hldGhlciBzdWItc3ViLWZpZWxkLCB7QGxpbmsgVGVzdFJlc291cmNlLlN0cmVldH0gaW4gcGFydGljdWxhciwKKyAgICAgKiBpcyBub3QgZmlsdGVyZWQgb3V0LgorICAgICAqIDxwLz4KKyAgICAgKiBUaGlzIGNvcnJlc3BvbmRzIHdpdGggdGhlIEpFUlNFWS0yODkyIHJlcG9ydGVkIGNhc2UuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2hldGhlclN1YlN1YkZpbGVkSXNOb3RGaWx0ZXJlZE91dCgpIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQocHJvdmlkZXIoKSArICIvdGVzdCIpLnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSkuZ2V0KCk7CisKKyAgICAgICAgZmluYWwgVGVzdFJlc291cmNlLlBlcnNvbnMgcGVyc29ucyA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoVGVzdFJlc291cmNlLlBlcnNvbnMuY2xhc3MpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkFtcGhpdGhlYXRyZSBQa3d5IiwgcGVyc29ucy5maXJzdC5hZGRyZXNzLnN0cmVldC5uYW1lKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiTWljcm9zb2Z0IFdheSIsIHBlcnNvbnMuc2Vjb25kLmFkZHJlc3Muc3RyZWV0Lm5hbWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3RzIHdoZXRoZXIgYSBkZS1yZWZlcmVuY2VkIGNhc2Ugb2YgdGhlIHJlcG9ydGVkIHByb2JsZW0gaXMgc3RpbGwgY29ycmVjdGx5IG5vdCBmaWx0ZXJlZCBvdXQuIEluIHBhcnRpY3VsYXIsIGEKKyAgICAgKiBzdWItc3ViLXN1Yi1maWVsZCBvZiB0aGUgc2FtZSBjbGFzcyBpcyBub3QgZmlsdGVyZWQgb3V0LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFdoZXRoZXJTdWJTdWJTdWJGaWVsZElzTm90RmlsdGVyZWRPdXQoKSB7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KHByb3ZpZGVyKCkgKyAiL3BvaW50ZXIiKS5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUpLmdldCgpOworCisgICAgICAgIGZpbmFsIFRlc3RSZXNvdXJjZS5Qb2ludGVyIHBvaW50ZXIgPSByZXNwb25zZS5yZWFkRW50aXR5KFRlc3RSZXNvdXJjZS5Qb2ludGVyLmNsYXNzKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJBbXBoaXRoZWF0cmUgUGt3eSIsIHBvaW50ZXIucGVyc29ucy5maXJzdC5hZGRyZXNzLnN0cmVldC5uYW1lKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiTWljcm9zb2Z0IFdheSIsIHBvaW50ZXIucGVyc29ucy5zZWNvbmQuYWRkcmVzcy5zdHJlZXQubmFtZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdHMgd2hldGhlciBhIHJlZmVyZW5jZSBjeWNsZSBpcyBkZXRlY3RlZCBhbmQgaW5maW5pdGUgcmVjdXJzaW9uIGlzIHByZXZlbnRlZC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXaGV0aGVyUmVmZXJlbmNlQ3ljbGVJc0RldGVjdGVkKCkgeworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldChwcm92aWRlcigpICsgIi9yZWN1cnNpdmUiKS5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUpLmdldCgpOworCisgICAgICAgIGZpbmFsIFRlc3RSZXNvdXJjZS5SZWN1cnNpdmUgcmVjdXJzaXZlID0gcmVzcG9uc2UucmVhZEVudGl0eShUZXN0UmVzb3VyY2UuUmVjdXJzaXZlLmNsYXNzKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJjIiwgcmVjdXJzaXZlLnN1YkZpZWxkLnN1YlN1YkZpZWxkLmlkU3ViU3ViRmllbGQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEplcnNleSBFbnRpdHkgZmlsdGVyaW5nIGZlYXR1cmUgcHJvdmlkZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBwcm92aWRlciBzdHJpbmcgdG8gbWF0Y2ggd2l0aCBhcHByb3ByaWF0ZSBKZXJzZXkgYXBwIGNvbmZpZ3VyZWQgaW4gd2ViLnhtbC4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIHByb3ZpZGVyKCk7CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yODkyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjg5Mi9KNjA1TW94eUlUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI4OTIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyODkyL0o2MDVNb3h5SVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAxZGY0MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yODkyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjg5Mi9KNjA1TW94eUlUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5Mjg5MjsKKworLyoqCisgKiBUZXN0cyB3aGV0aGVyIGNsYXNzZXMgcmVwZWF0aW5nIGluIHRoZSBvYmplY3QgZ3JhcGggYXJlIGZpbHRlcmVkIG91dCBjb3JyZWN0bHkgd2hlbiB1c2luZyBNT1hZIGpzb24gcHJvdmlkZXIuCisgKgorICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYSBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSjYwNU1veHlJVENhc2UgZXh0ZW5kcyBBYnN0cmFjdEplcnNleUVudGl0eUZpbHRlcmluZ0lUQ2FzZSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHByb3ZpZGVyKCkgeworICAgICAgICByZXR1cm4gIm1veHkiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yODkyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjg5Mi9KZXJzZXkyODkySmFja3NvbklUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTI4OTIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXkyODkyL0plcnNleTI4OTJKYWNrc29uSVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNlODU4ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS0yODkyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5Mjg5Mi9KZXJzZXkyODkySmFja3NvbklUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5Mjg5MjsKKworLyoqCisgKiBUZXN0cyB3aGV0aGVyIGNsYXNzZXMgcmVwZWF0aW5nIGluIHRoZSBvYmplY3QgZ3JhcGggYXJlIGZpbHRlcmVkIG91dCBjb3JyZWN0bHkgd2hlbiB1c2luZyBKYWNrc29uIGpzb24gcHJvdmlkZXIuCisgKgorICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYSBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSmVyc2V5Mjg5MkphY2tzb25JVENhc2UgZXh0ZW5kcyBBYnN0cmFjdEplcnNleUVudGl0eUZpbHRlcmluZ0lUQ2FzZSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIHByb3ZpZGVyKCkgeworICAgICAgICByZXR1cm4gImphY2tzb24iOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS03ODAvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS03ODAvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTYyMTcxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTc4MC9wb20ueG1sCkBAIC0wLDAgKzEsNjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktNzgwPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLWplcnNleS03ODA8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+U2VydmxldCBpbnRlZ3JhdGlvbiB0ZXN0IC0gSkVSU0VZLTc4MCAtIE1hbGZvcm1lZCBVUkwgcmV0dXJucyBhIDUwMCBpbnN0ZWFkIG9mIGEgNDAwPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldC1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5LTc4MC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL2plcnNleTc4MC9IZWxsb1dvcmxkUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS03ODAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXk3ODAvSGVsbG9Xb3JsZFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA0OWMzNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS03ODAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXk3ODAvSGVsbG9Xb3JsZFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXk3ODA7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFBhdGgoImhlbGxvd29ybGQiKQorcHVibGljIGNsYXNzIEhlbGxvV29ybGRSZXNvdXJjZSB7CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgcmV0dXJuICJIZWxsbyBXb3JsZCEgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS03ODAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXk3ODAvSmVyc2V5NzgwLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktNzgwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5NzgwL0plcnNleTc4MC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlYTg1MGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktNzgwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5NzgwL0plcnNleTc4MC5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5NzgwOworCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgSmVyc2V5NzgwIGV4dGVuZHMgQXBwbGljYXRpb24geworICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIn0pCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLjxDbGFzczw/Pj5zaW5nbGV0b24oSGVsbG9Xb3JsZFJlc291cmNlLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktNzgwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktNzgwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDA3ZDYwOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS03ODAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDM0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjIuNSIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI+CisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+dGVzdFNlcnZsZXQxPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC53cy5ycy5BcHBsaWNhdGlvbjwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5qZXJzZXk3ODAuSmVyc2V5NzgwPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT50ZXN0U2VydmxldDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL2plcnNleS03ODAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXk3ODAvSGVsbG9Xb3JsZFJlc291cmNlSVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktNzgwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5NzgwL0hlbGxvV29ybGRSZXNvdXJjZUlUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1NGQ1MzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9qZXJzZXktNzgwL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vamVyc2V5NzgwL0hlbGxvV29ybGRSZXNvdXJjZUlUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uamVyc2V5NzgwOworCitpbXBvcnQgamF2YS5uZXQuSHR0cFVSTENvbm5lY3Rpb247CitpbXBvcnQgamF2YS5uZXQuVVJMOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkUmVzb3VyY2VJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoKS5yZWdpc3Rlckluc3RhbmNlcyhuZXcgSmVyc2V5NzgwKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFVybCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMaXN0PEludGVnZXI+IGV4cGVjdGVkQ29kZXMgPSBBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgICAgIFJlc3BvbnNlLlN0YXR1cy5CQURfUkVRVUVTVC5nZXRTdGF0dXNDb2RlKCksIFJlc3BvbnNlLlN0YXR1cy5OT1RfRk9VTkQuZ2V0U3RhdHVzQ29kZSgpKTsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGV4cGVjdGVkUGhyYXNlcyA9IEFycmF5cy5hc0xpc3QoCisgICAgICAgICAgICAgICAgUmVzcG9uc2UuU3RhdHVzLkJBRF9SRVFVRVNULmdldFJlYXNvblBocmFzZSgpLCBSZXNwb25zZS5TdGF0dXMuTk9UX0ZPVU5ELmdldFJlYXNvblBocmFzZSgpKTsKKworICAgICAgICBmaW5hbCBVUkwgdXJsID0gbmV3IFVSTChnZXRCYXNlVXJpKCkudG9TdHJpbmcoKSArICJeIik7CisgICAgICAgIGZpbmFsIEh0dHBVUkxDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSAoSHR0cFVSTENvbm5lY3Rpb24pIHVybC5vcGVuQ29ubmVjdGlvbigpOworICAgICAgICBjb25uZWN0aW9uLnNldFJlcXVlc3RNZXRob2QoIkdFVCIpOworCisgICAgICAgIGNvbm5lY3Rpb24uY29ubmVjdCgpOworCisgICAgICAgIGZpbmFsIGludCBzdGF0dXNDb2RlID0gY29ubmVjdGlvbi5nZXRSZXNwb25zZUNvZGUoKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIHN0YXR1c01lc3NhZ2UgPSBjb25uZWN0aW9uLmdldFJlc3BvbnNlTWVzc2FnZSgpOworCisgICAgICAgIGNvbm5lY3Rpb24uZGlzY29ubmVjdCgpOworCisgICAgICAgIGFzc2VydFRydWUoIldyb25nIHJlc3BvbnNlIHN0YXR1cyBjb2RlOiAiICsgc3RhdHVzQ29kZSwKKyAgICAgICAgICAgICAgICBleHBlY3RlZENvZGVzLmNvbnRhaW5zKHN0YXR1c0NvZGUpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiV3JvbmcgcmVzcG9uc2Ugc3RhdHVzIHJlYXNvbjogIiArIHN0YXR1c01lc3NhZ2UsCisgICAgICAgICAgICAgICAgZXhwZWN0ZWRQaHJhc2VzLmNvbnRhaW5zKHN0YXR1c01lc3NhZ2UpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjg4NjVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vcG9tLnhtbApAQCAtMCwwICsxLDI0MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0czwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb248L25hbWU+CisKKyAgICA8bW9kdWxlcz4KKyAgICAgICAgPG1vZHVsZT5hc3luYy1qZXJzZXktZmlsdGVyPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+Y2RpLWJlYW52YWxpZGF0aW9uLXdlYmFwcDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmNkaS1lamItdGVzdC13ZWJhcHA8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5jZGktaWZhY2Utd2l0aC1ub24tamF4cnMtaW1wbC10ZXN0LXdlYmFwcDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmNkaS1tdWx0aW1vZHVsZTwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmVqYi1tdWx0aW1vZHVsZS1yZWxvYWQ8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5jZGktbXVsdGlwYXJ0LXdlYmFwcDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmNkaS10ZXN0LXdlYmFwcDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmNkaS13aXRoLWplcnNleS1pbmplY3Rpb24tY3VzdG9tLWNmZy13ZWJhcHA8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5jZGktd2l0aC1qZXJzZXktaW5qZWN0aW9uLWN1c3RvbS1oazItYmFubmVkLXdlYmFwcDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmNkaS13aXRoLWplcnNleS1pbmplY3Rpb24td2ViYXBwPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+Y2xpZW50LWNvbm5lY3Rvci1wcm92aWRlcjwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmVqYi1tdWx0aW1vZHVsZTwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmVqYi10ZXN0LXdlYmFwcDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmotMzc2PC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+ai00NDE8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5qLTU5PC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+amF4cnMtY29tcG9uZW50LWluamVjdDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmplcnNleS0xMTA3PC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+amVyc2V5LTEyMjM8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5qZXJzZXktMTYwNDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmplcnNleS0xNjY3PC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+amVyc2V5LTE4Mjk8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5qZXJzZXktMTg4MzwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmplcnNleS0xOTI4PC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+amVyc2V5LTE5NjA8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5qZXJzZXktMTk2NDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmplcnNleS0yMDMxPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+amVyc2V5LTIxMzY8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5qZXJzZXktMjEzNzwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmplcnNleS0yMTU0PC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+amVyc2V5LTIxNjA8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5qZXJzZXktMjE2NDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmplcnNleS0yMTY3PC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+amVyc2V5LTIxNzY8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5qZXJzZXktMjE4NDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmplcnNleS0yMjU1PC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+amVyc2V5LTIzMjI8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5qZXJzZXktMjMzNTwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmplcnNleS0yNDIxPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+amVyc2V5LTI1NTE8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5qZXJzZXktMjYxMjwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmplcnNleS0yNjM3PC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+amVyc2V5LTI2NTQ8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5qZXJzZXktMjY3MzwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmplcnNleS0yNjg5PC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+amVyc2V5LTI3MDQ8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5qZXJzZXktMjc3NjwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmplcnNleS0yNzk0PC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+amVyc2V5LTI4NDY8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5qZXJzZXktMjg3ODwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmplcnNleS0yODkyPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+amVyc2V5LTc4MDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnBvcnRhYmlsaXR5LWplcnNleS0xPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+cG9ydGFiaWxpdHktamVyc2V5LTI8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5wcm9wZXJ0eS1jaGVjazwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnNlY3VyaXR5LWRpZ2VzdDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnNlcnZsZXQtMi41LWF1dG9kaXNjb3ZlcnktMTwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnNlcnZsZXQtMi41LWF1dG9kaXNjb3ZlcnktMjwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnNlcnZsZXQtMi41LWZpbHRlcjwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnNlcnZsZXQtMi41LWluZmxlY3Rvci0xPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+c2VydmxldC0yLjUtaW5pdC0xPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+c2VydmxldC0yLjUtaW5pdC0yPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+c2VydmxldC0yLjUtaW5pdC0zPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+c2VydmxldC0yLjUtaW5pdC00PC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+c2VydmxldC0yLjUtaW5pdC01PC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+c2VydmxldC0yLjUtaW5pdC02PC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+c2VydmxldC0yLjUtaW5pdC03PC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+c2VydmxldC0yLjUtaW5pdC04PC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+c2VydmxldC0yLjUtbXZjLTE8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5zZXJ2bGV0LTIuNS1tdmMtMjwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnNlcnZsZXQtMi41LW12Yy0zPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+c2VydmxldC0yLjUtcmVsb2FkPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+c2VydmxldC0zLWFzeW5jPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+c2VydmxldC0zLWNodW5rZWQtaW88L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5zZXJ2bGV0LTMtZmlsdGVyPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+c2VydmxldC0zLWdmLWFzeW5jPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+c2VydmxldC0zLWluZmxlY3Rvci0xPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+c2VydmxldC0zLWluaXQtMTwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnNlcnZsZXQtMy1pbml0LTI8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5zZXJ2bGV0LTMtaW5pdC0zPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+c2VydmxldC0zLWluaXQtNDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnNlcnZsZXQtMy1pbml0LTU8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5zZXJ2bGV0LTMtaW5pdC02PC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+c2VydmxldC0zLWluaXQtNzwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnNlcnZsZXQtMy1pbml0LTg8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5zZXJ2bGV0LTMtaW5pdC1wcm92aWRlcjwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnNlcnZsZXQtMy1wYXJhbXM8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5zZXJ2bGV0LTMtc3NlLTE8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5zZXJ2bGV0LXJlcXVlc3Qtd3JhcHBlci1iaW5kaW5nLTI8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5zZXJ2bGV0LXJlcXVlc3Qtd3JhcHBlci1iaW5kaW5nPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+c2VydmxldC10ZXN0czwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnNvbmFyLXRlc3Q8L21vZHVsZT4KKyAgICAgICAgPCEtLSBUT0RPOiB0ZW1wb3JhcmlseSByZW1vdmluZyBzcHJpbmcgNCBpbnRlZ3JhdGlvbiB0ZXN0IC0tPgorICAgICAgICA8IS0tIFRPRE86IGNvbmZsaWN0IGluIEFTTSB2ZXJzaW9uICh0b28gb2xkKSBvZiBqZXR0eSBwbHVnaW4gLS0+CisgICAgICAgIDwhLS08bW9kdWxlPnNwcmluZzQ8L21vZHVsZT4tLT4KKyAgICAgICAgPG1vZHVsZT50cmFjaW5nLXN1cHBvcnQ8L21vZHVsZT4KKyAgICA8L21vZHVsZXM+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPmRlZmF1bHQ8L2lkPgorICAgICAgICAgICAgPHByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgPGVudj5kZWZhdWx0PC9lbnY+CisgICAgICAgICAgICAgICAgPGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydD45OTk4PC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+CisgICAgICAgICAgICA8L3Byb3BlcnRpZXM+CisgICAgICAgICAgICA8YWN0aXZhdGlvbj4KKyAgICAgICAgICAgICAgICA8YWN0aXZlQnlEZWZhdWx0PnRydWU8L2FjdGl2ZUJ5RGVmYXVsdD4KKyAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KKyAgICAgICAgPC9wcm9maWxlPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5zb25hcjwvaWQ+CisgICAgICAgICAgICA8cHJvcGVydGllcz4KKyAgICAgICAgICAgICAgICA8ZW52PmRlZmF1bHQ8L2Vudj4KKyAgICAgICAgICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0Pjk5OTg8L2plcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydD4KKyAgICAgICAgICAgICAgICA8amV0dHkubG9nLmZpbGU+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vamV0dHktb3V0LmxvZzwvamV0dHkubG9nLmZpbGU+CisgICAgICAgICAgICA8L3Byb3BlcnRpZXM+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBjb25maWd1cmUgSmV0dHkgdG8gcnVuIGluIGEgc2VwYXJhdGVkIEpWTSBpbiBvcmRlciB0byBnZXQgcHJvcGVyIGNvdmVyYWdlIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+c3RhcnQtamV0dHktZm9ya2VkPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wcmUtaW50ZWdyYXRpb24tdGVzdDwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cnVuLWZvcmtlZDwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29udGV4dFBhdGg+LzwvY29udGV4dFBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNjYW5JbnRlcnZhbFNlY29uZHM+MDwvc2NhbkludGVydmFsU2Vjb25kcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d2FpdEZvckNoaWxkPmZhbHNlPC93YWl0Rm9yQ2hpbGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGp2bUFyZ3M+JHtzZXJ2ZXIuY292ZXJhZ2UuYXJnbGluZX0gLURqZXR0eS5wb3J0PSR7amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtRG9yZy5zbGY0ai5zaW1wbGVMb2dnZXIubG9nRmlsZT0ke2pldHR5LmxvZy5maWxlfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvanZtQXJncz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+c3RhcnQtamV0dHk8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPm5vbmU8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuc2xmNGo8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zbGY0ai1zaW1wbGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjcuNTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisKKyAgICA8L3Byb2ZpbGVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPHNraXA+JHtza2lwLnRlc3RzfTwvc2tpcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzY2FuSW50ZXJ2YWxTZWNvbmRzPjEwPC9zY2FuSW50ZXJ2YWxTZWNvbmRzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3BQb3J0Pjk5OTk8L3N0b3BQb3J0PgorICAgICAgICAgICAgICAgICAgICAgICAgPHN0b3BLZXk+U1RPUDwvc3RvcEtleT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx3ZWJBcHA+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbnRleHRQYXRoPi88L2NvbnRleHRQYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx3ZWJJbmZJbmNsdWRlSmFyUGF0dGVybj4uKi8uKmplcnNleS1bXi9dXC5qYXIkPC93ZWJJbmZJbmNsdWRlSmFyUGF0dGVybj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvd2ViQXBwPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbm5lY3RvcnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbm5lY3RvciBpbXBsZW1lbnRhdGlvbj0ib3JnLmVjbGlwc2UuamV0dHkuc2VydmVyLm5pby5TZWxlY3RDaGFubmVsQ29ubmVjdG9yIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvcnQ+JHtqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnR9PC9wb3J0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF4SWRsZVRpbWU+NjAwMDA8L21heElkbGVUaW1lPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29ubmVjdG9yPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25uZWN0b3JzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGp2bUFyZ3M+JHtzZXJ2ZXIuY292ZXJhZ2UuYXJnbGluZX08L2p2bUFyZ3M+CisgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5zdGFydC1qZXR0eTwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnByZS1pbnRlZ3JhdGlvbi10ZXN0PC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2NhbkludGVydmFsU2Vjb25kcz4wPC9zY2FuSW50ZXJ2YWxTZWNvbmRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGFlbW9uPnRydWU8L2RhZW1vbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPnN0b3AtamV0dHk8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wb3N0LWludGVncmF0aW9uLXRlc3Q8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+c3RvcDwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgPC9wbHVnaW5NYW5hZ2VtZW50PgorICAgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS1qZXJzZXktMS9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHktamVyc2V5LTEvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODQ5OWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHktamVyc2V5LTEvcG9tLnhtbApAQCAtMCwwICsxLDg4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+cG9ydGFiaWxpdHktamVyc2V5LTE8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tcG9ydGFiaWxpdHktamVyc2V5LTE8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+U2VydmxldCBwb3J0YWJpbGl0eSB0ZXN0IC0gdGVzdGluZyBjby1idW5kbGluZyB3aXRoIEplcnNleSAxPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXNlcnZsZXQtcG9ydGFiaWxpdHk8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLmplcnNleS5qZXJzZXktdGVzdC1mcmFtZXdvcms8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke2plcnNleTEudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLmplcnNleS5qZXJzZXktdGVzdC1mcmFtZXdvcms8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7amVyc2V5MS52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktc2VydmVyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS5zdW4uamVyc2V5PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke2plcnNleTEudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGhEZXBlbmRlbmN5RXhjbHVkZXM+IDwhLS0gdGhpcyBpcyB0byBlbnN1cmUgb25seSBvbmUgSmVyc2V5IHZlcnNpb24gaXMgcHJlc2VudCBpbiB0aGUgY2xhc3NwYXRoIC0tPgorICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoRGVwZW5kZW5jeUV4Y2x1ZGU+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZTpqZXJzZXktY29tbW9uPC9jbGFzc3BhdGhEZXBlbmRlbmN5RXhjbHVkZT4KKyAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aERlcGVuZGVuY3lFeGNsdWRlPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU6amVyc2V5LXNlcnZlcjwvY2xhc3NwYXRoRGVwZW5kZW5jeUV4Y2x1ZGU+CisgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGhEZXBlbmRlbmN5RXhjbHVkZT5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlOmplcnNleS1jbGllbnQ8L2NsYXNzcGF0aERlcGVuZGVuY3lFeGNsdWRlPgorICAgICAgICAgICAgICAgICAgPC9jbGFzc3BhdGhEZXBlbmRlbmN5RXhjbHVkZXM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS1qZXJzZXktMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5L0hlbGxvV29ybGRSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHktamVyc2V5LTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS9IZWxsb1dvcmxkUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjM0ZDViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHktamVyc2V5LTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS9IZWxsb1dvcmxkUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnBvcnRhYmlsaXR5OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CisKKy8qKgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK0BQYXRoKCJoZWxsb3dvcmxkIikKK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkUmVzb3VyY2UgeworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICByZXR1cm4gIkhlbGxvIFdvcmxkISI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHktamVyc2V5LTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS9KZXJzZXkxQXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5LWplcnNleS0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHkvSmVyc2V5MUFwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU2YjlmYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5LWplcnNleS0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHkvSmVyc2V5MUFwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5wb3J0YWJpbGl0eTsKKworaW1wb3J0IGNvbS5zdW4uamVyc2V5LmFwaS5jb3JlLlBhY2thZ2VzUmVzb3VyY2VDb25maWc7CisKKy8qKgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXkxQXBwbGljYXRpb24gZXh0ZW5kcyBQYWNrYWdlc1Jlc291cmNlQ29uZmlnIHsKKyAgICBwdWJsaWMgSmVyc2V5MUFwcGxpY2F0aW9uKCkgeworICAgICAgICAvLyBkbyB0aGUgcGFja2FnZSBzY2FubmluZworICAgICAgICBzdXBlcigib3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24ucG9ydGFiaWxpdHkiKTsKKworICAgICAgICAvLyBleHBsaWNpdGx5IGFkZCB1bmFubm90YXRlZCBKZXJzZXkgMSBzcGVjaWZpYyByZXNvdXJjZQorICAgICAgICBnZXRFeHBsaWNpdFJvb3RSZXNvdXJjZXMoKS5wdXQoImplcnNleSIsIEplcnNleTFSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHktamVyc2V5LTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS9KZXJzZXkxUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5LWplcnNleS0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHkvSmVyc2V5MVJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ0NGZjZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5LWplcnNleS0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHkvSmVyc2V5MVJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5wb3J0YWJpbGl0eTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworLyoqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIEplcnNleTFSZXNvdXJjZSB7CisgICAgQEdFVAorICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICBwdWJsaWMgU3RyaW5nIGdldEplcnNleTEoKSB7CisgICAgICAgIHJldHVybiAiVXNpbmcgSmVyc2V5IDEueCI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHktamVyc2V5LTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS9KZXJzZXkyQXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5LWplcnNleS0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHkvSmVyc2V5MkFwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFlMGUxYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5LWplcnNleS0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHkvSmVyc2V5MkFwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5wb3J0YWJpbGl0eTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2U7CisKKy8qKgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXkyQXBwbGljYXRpb24gZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisKKyAgICBwdWJsaWMgSmVyc2V5MkFwcGxpY2F0aW9uKCkgeworICAgICAgICAvLyBkbyB0aGUgcGFja2FnZSBzY2FubmluZworICAgICAgICBwYWNrYWdlcygib3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24ucG9ydGFiaWxpdHkiKTsKKworICAgICAgICAvLyBleHBsaWNpdGx5IGFkZCB1bmFubm90YXRlZCBKZXJzZXkgMiBzcGVjaWZpYyByZXNvdXJjZQorICAgICAgICBSZXNvdXJjZS5CdWlsZGVyIHJiID0gUmVzb3VyY2UuYnVpbGRlcihKZXJzZXkyUmVzb3VyY2UuY2xhc3MpOworICAgICAgICByZWdpc3RlclJlc291cmNlcyhyYi5wYXRoKCJqZXJzZXkiKS5idWlsZCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS1qZXJzZXktMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5L0plcnNleTJSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHktamVyc2V5LTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS9KZXJzZXkyUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzY4M2UzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHktamVyc2V5LTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS9KZXJzZXkyUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnBvcnRhYmlsaXR5OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCisvKioKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitwdWJsaWMgY2xhc3MgSmVyc2V5MlJlc291cmNlIHsKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0SmVyc2V5MigpIHsKKyAgICAgICAgcmV0dXJuICJVc2luZyBKZXJzZXkgMi54IjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS1qZXJzZXktMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHktamVyc2V5LTEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2QzZTRjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHktamVyc2V5LTEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDM4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjIuNSIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI+CisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SmVyc2V5IFdlYiBBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LnBvcnRhYmlsaXR5LlBvcnRhYmxlU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qZXJzZXkxI2NvbS5zdW4uamVyc2V5LmNvbmZpZy5wcm9wZXJ0eS5yZXNvdXJjZUNvbmZpZ0NsYXNzPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnBvcnRhYmlsaXR5LkplcnNleTFBcHBsaWNhdGlvbjwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qZXJzZXkyI2phdmF4LndzLnJzLkFwcGxpY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnBvcnRhYmlsaXR5LkplcnNleTJBcHBsaWNhdGlvbjwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SmVyc2V5IFdlYiBBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHktamVyc2V5LTEvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS9Qb3J0YWJpbGl0eUlUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHktamVyc2V5LTEvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS9Qb3J0YWJpbGl0eUlUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkODA1ZTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS1qZXJzZXktMS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5L1BvcnRhYmlsaXR5SVRDYXNlLmphdmEKQEAgLTAsMCArMSw4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5wb3J0YWJpbGl0eTsKKworaW1wb3J0IGNvbS5zdW4uamVyc2V5LmFwaS5jbGllbnQuQ2xpZW50UmVzcG9uc2U7CitpbXBvcnQgY29tLnN1bi5qZXJzZXkudGVzdC5mcmFtZXdvcmsuQXBwRGVzY3JpcHRvcjsKK2ltcG9ydCBjb20uc3VuLmplcnNleS50ZXN0LmZyYW1ld29yay5KZXJzZXlUZXN0OworaW1wb3J0IGNvbS5zdW4uamVyc2V5LnRlc3QuZnJhbWV3b3JrLldlYkFwcERlc2NyaXB0b3I7CitpbXBvcnQgY29tLnN1bi5qZXJzZXkudGVzdC5mcmFtZXdvcmsuc3BpLmNvbnRhaW5lci5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IGNvbS5zdW4uamVyc2V5LnRlc3QuZnJhbWV3b3JrLnNwaS5jb250YWluZXIuVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgY29tLnN1bi5qZXJzZXkudGVzdC5mcmFtZXdvcmsuc3BpLmNvbnRhaW5lci5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitwdWJsaWMgY2xhc3MgUG9ydGFiaWxpdHlJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBEZXNjcmlwdG9yIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBXZWJBcHBEZXNjcmlwdG9yLkJ1aWxkZXIoKS5idWlsZCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVsbG9Xb3JsZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgcyA9IHJlc291cmNlKCkucGF0aCgiaGVsbG93b3JsZCIpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkhlbGxvIFdvcmxkISIsIHMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEplcnNleSgpIHsKKyAgICAgICAgQ2xpZW50UmVzcG9uc2UgciA9IHJlc291cmNlKCkucGF0aCgiamVyc2V5IikuZ2V0KENsaWVudFJlc3BvbnNlLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgci5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiVXNpbmcgSmVyc2V5IDEueCIsIHIuZ2V0RW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRoZSB3aG9sZSBwcm9qZWN0IGlzIHNldHVwIGZvciBKZXJzZXkgMi4gTmVlZCB0byBnZXQgdGhlIGVmZmVjdGl2ZSBwb3J0IG51bWJlcgorICAgICAqIGZyb20gSmVyc2V5IDIgcHJvcGVydGllcyB0byBtYWtlIEh1ZHNvbiBoYXBweS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBkZWZhdWx0UG9ydCB0byB1c2UgaWYgbm8gb3RoZXIgY29uZmlndXJhdGlvbiBpcyBhdmFpbGFibGUKKyAgICAgKiBAcmV0dXJuIHBvcnQgbnVtYmVyIHRvIHVzZSBieSB0aGUgY2xpZW50CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIGludCBnZXRQb3J0KGludCBkZWZhdWx0UG9ydCkgeworCisgICAgICAgIFN0cmluZyBwb3J0ID0gU3lzdGVtLmdldFByb3BlcnR5KCJqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQiKTsKKyAgICAgICAgaWYgKG51bGwgIT0gcG9ydCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSW50ZWdlci5wYXJzZUludChwb3J0KTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRlc3RDb250YWluZXJFeGNlcHRpb24oImplcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydCB3aXRoIGEgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAidmFsdWUgb2YgXCIiICsgcG9ydCArICJcIiBpcyBub3QgYSB2YWxpZCBpbnRlZ2VyLiIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcG9ydCA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgiSkVSU0VZX1RFU1RfUE9SVCIpOworICAgICAgICBpZiAobnVsbCAhPSBwb3J0KSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHJldHVybiBJbnRlZ2VyLnBhcnNlSW50KHBvcnQpOworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVGVzdENvbnRhaW5lckV4Y2VwdGlvbigiSkVSU0VZX1RFU1RfUE9SVCB3aXRoIGEgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAidmFsdWUgb2YgXCIiICsgcG9ydCArICJcIiBpcyBub3QgYSB2YWxpZCBpbnRlZ2VyLiIsIGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBkZWZhdWx0UG9ydDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS1qZXJzZXktMi9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHktamVyc2V5LTIvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTYzNTQyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHktamVyc2V5LTIvcG9tLnhtbApAQCAtMCwwICsxLDgxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+cG9ydGFiaWxpdHktamVyc2V5LTI8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tcG9ydGFiaWxpdHktamVyc2V5LTI8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+U2VydmxldCBwb3J0YWJpbGl0eSB0ZXN0IC0gdGVzdGluZyBjby1idW5kbGluZyB3aXRoIEplcnNleSAyPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXNlcnZsZXQtcG9ydGFiaWxpdHk8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLmplcnNleTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtqZXJzZXkxLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aERlcGVuZGVuY3lFeGNsdWRlcz4gPCEtLSB0aGlzIGlzIHRvIGVuc3VyZSBvbmx5IG9uZSBKZXJzZXkgdmVyc2lvbiBpcyBwcmVzZW50IGluIHRoZSBjbGFzc3BhdGggLS0+CisgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGhEZXBlbmRlbmN5RXhjbHVkZT5jb20uc3VuLmplcnNleTpqZXJzZXktY29yZTwvY2xhc3NwYXRoRGVwZW5kZW5jeUV4Y2x1ZGU+CisgICAgICAgICAgICAgICAgICAgIDxjbGFzc3BhdGhEZXBlbmRlbmN5RXhjbHVkZT5jb20uc3VuLmplcnNleTpqZXJzZXktc2VydmVyPC9jbGFzc3BhdGhEZXBlbmRlbmN5RXhjbHVkZT4KKyAgICAgICAgICAgICAgICAgICAgPGNsYXNzcGF0aERlcGVuZGVuY3lFeGNsdWRlPmNvbS5zdW4uamVyc2V5OmplcnNleS1zZXJ2bGV0PC9jbGFzc3BhdGhEZXBlbmRlbmN5RXhjbHVkZT4KKyAgICAgICAgICAgICAgICAgIDwvY2xhc3NwYXRoRGVwZW5kZW5jeUV4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5LWplcnNleS0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHkvSGVsbG9Xb3JsZFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS1qZXJzZXktMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5L0hlbGxvV29ybGRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmMzRkNWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS1qZXJzZXktMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5L0hlbGxvV29ybGRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24ucG9ydGFiaWxpdHk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKKworLyoqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworQFBhdGgoImhlbGxvd29ybGQiKQorcHVibGljIGNsYXNzIEhlbGxvV29ybGRSZXNvdXJjZSB7CisgICAgQEdFVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgIHJldHVybiAiSGVsbG8gV29ybGQhIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS1qZXJzZXktMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5L0plcnNleTFBcHBsaWNhdGlvbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHktamVyc2V5LTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS9KZXJzZXkxQXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTZiOWZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHktamVyc2V5LTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS9KZXJzZXkxQXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnBvcnRhYmlsaXR5OworCitpbXBvcnQgY29tLnN1bi5qZXJzZXkuYXBpLmNvcmUuUGFja2FnZXNSZXNvdXJjZUNvbmZpZzsKKworLyoqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIEplcnNleTFBcHBsaWNhdGlvbiBleHRlbmRzIFBhY2thZ2VzUmVzb3VyY2VDb25maWcgeworICAgIHB1YmxpYyBKZXJzZXkxQXBwbGljYXRpb24oKSB7CisgICAgICAgIC8vIGRvIHRoZSBwYWNrYWdlIHNjYW5uaW5nCisgICAgICAgIHN1cGVyKCJvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5wb3J0YWJpbGl0eSIpOworCisgICAgICAgIC8vIGV4cGxpY2l0bHkgYWRkIHVuYW5ub3RhdGVkIEplcnNleSAxIHNwZWNpZmljIHJlc291cmNlCisgICAgICAgIGdldEV4cGxpY2l0Um9vdFJlc291cmNlcygpLnB1dCgiamVyc2V5IiwgSmVyc2V5MVJlc291cmNlLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS1qZXJzZXktMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5L0plcnNleTFSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHktamVyc2V5LTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS9KZXJzZXkxUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDQ0ZmNkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHktamVyc2V5LTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS9KZXJzZXkxUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnBvcnRhYmlsaXR5OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCisvKioKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitwdWJsaWMgY2xhc3MgSmVyc2V5MVJlc291cmNlIHsKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0SmVyc2V5MSgpIHsKKyAgICAgICAgcmV0dXJuICJVc2luZyBKZXJzZXkgMS54IjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS1qZXJzZXktMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5L0plcnNleTJBcHBsaWNhdGlvbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHktamVyc2V5LTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS9KZXJzZXkyQXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWUwZTFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHktamVyc2V5LTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS9KZXJzZXkyQXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnBvcnRhYmlsaXR5OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tb2RlbC5SZXNvdXJjZTsKKworLyoqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIEplcnNleTJBcHBsaWNhdGlvbiBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKworICAgIHB1YmxpYyBKZXJzZXkyQXBwbGljYXRpb24oKSB7CisgICAgICAgIC8vIGRvIHRoZSBwYWNrYWdlIHNjYW5uaW5nCisgICAgICAgIHBhY2thZ2VzKCJvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5wb3J0YWJpbGl0eSIpOworCisgICAgICAgIC8vIGV4cGxpY2l0bHkgYWRkIHVuYW5ub3RhdGVkIEplcnNleSAyIHNwZWNpZmljIHJlc291cmNlCisgICAgICAgIFJlc291cmNlLkJ1aWxkZXIgcmIgPSBSZXNvdXJjZS5idWlsZGVyKEplcnNleTJSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJlZ2lzdGVyUmVzb3VyY2VzKHJiLnBhdGgoImplcnNleSIpLmJ1aWxkKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5LWplcnNleS0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHkvSmVyc2V5MlJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS1qZXJzZXktMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5L0plcnNleTJSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NjgzZTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS1qZXJzZXktMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5L0plcnNleTJSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24ucG9ydGFiaWxpdHk7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKKy8qKgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK3B1YmxpYyBjbGFzcyBKZXJzZXkyUmVzb3VyY2UgeworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgcHVibGljIFN0cmluZyBnZXRKZXJzZXkyKCkgeworICAgICAgICByZXR1cm4gIlVzaW5nIEplcnNleSAyLngiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5LWplcnNleS0yL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS1qZXJzZXktMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjZDNlNGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS1qZXJzZXktMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi41IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIj4KKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5KZXJzZXkgV2ViIEFwcGxpY2F0aW9uPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQucG9ydGFiaWxpdHkuUG9ydGFibGVTZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmplcnNleTEjY29tLnN1bi5qZXJzZXkuY29uZmlnLnByb3BlcnR5LnJlc291cmNlQ29uZmlnQ2xhc3M8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24ucG9ydGFiaWxpdHkuSmVyc2V5MUFwcGxpY2F0aW9uPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmplcnNleTIjamF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24ucG9ydGFiaWxpdHkuSmVyc2V5MkFwcGxpY2F0aW9uPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5KZXJzZXkgV2ViIEFwcGxpY2F0aW9uPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS1qZXJzZXktMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5L1BvcnRhYmlsaXR5SVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9wb3J0YWJpbGl0eS1qZXJzZXktMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5L1BvcnRhYmlsaXR5SVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE1OGZkYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3BvcnRhYmlsaXR5LWplcnNleS0yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vcG9ydGFiaWxpdHkvUG9ydGFiaWxpdHlJVENhc2UuamF2YQpAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnBvcnRhYmlsaXR5OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIFBvcnRhYmlsaXR5SVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgLy8gZHVtbXkgcmVzb3VyY2UgY29uZmlnCisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhlbGxvV29ybGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHMgPSB0YXJnZXQoImhlbGxvd29ybGQiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiSGVsbG8gV29ybGQhIiwgcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SmVyc2V5KCkgeworICAgICAgICBSZXNwb25zZSByID0gdGFyZ2V0KCJqZXJzZXkiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHIuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlVzaW5nIEplcnNleSAyLngiLCByLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vcHJvcGVydHktY2hlY2svcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3Byb3BlcnR5LWNoZWNrL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZkN2U0YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3Byb3BlcnR5LWNoZWNrL3BvbS54bWwKQEAgLTAsMCArMSwxMDYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5wcm9wZXJ0eS1jaGVjazwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1wcm9wZXJ0eS1jaGVjazwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5Qcm9wZXJ0eSBvdmVybGFwcGluZy9kdXBsaWNhdGUgY2hlY2sgdGVzdDwvZGVzY3JpcHRpb24+CisgICAgPCEtLQorICAgIE5vdGUgdGhhdCB3aGVuZXZlciBuZXcgKlByb3BlcnRpZXMuamF2YSBmaWxlIGlzIGNyZWF0ZWQsIGl0IGhhcyB0byBiZSBhZGRlZCBpbiB0aGUgdGVzdCBzb3VyY2UgZmlsZQorICAgIGluIG9yZGVyIHRvIGJlIGNoZWNrZWQgZm9yIGR1cGxpY2F0ZXMvb3ZlcmxhcHBpbmcuCisKKyAgICBVc2UgZmluZCAuIC1uYW1lICIqUHJvcGVydGllcy5qYXZhIiBpbiB0aGUgSmVyc2V5IHJvb3QgcHJvamVjdCBmb2xkZXIgdG8gZmluZCBmaWxlcyB0byBhZGQuCisgICAgLS0+CisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbW1vbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY2xpZW50PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjQuMTE8L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb25uZWN0b3JzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWpldHR5LWNvbm5lY3RvcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbm5lY3RvcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktYXBhY2hlLWNvbm5lY3RvcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlY3VyaXR5PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+b2F1dGgxLXNlcnZlcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLW11bHRpcGFydDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLXNzZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vcHJvcGVydHktY2hlY2svc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9wcm9wZXJ0eWNoZWNrL1Byb3BlcnR5T3ZlcmxhcHBpbmdDaGVja1Rlc3QuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3Byb3BlcnR5LWNoZWNrL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vcHJvcGVydHljaGVjay9Qcm9wZXJ0eU92ZXJsYXBwaW5nQ2hlY2tUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY3MDcyZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3Byb3BlcnR5LWNoZWNrL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vcHJvcGVydHljaGVjay9Qcm9wZXJ0eU92ZXJsYXBwaW5nQ2hlY2tUZXN0LmphdmEKQEAgLTAsMCArMSwyMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24ucHJvcGVydHljaGVjazsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuQ29tbW9uUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5hcGFjaGUuY29ubmVjdG9yLkFwYWNoZUNsaWVudFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5Qcm9wZXJ0aWVzQ2xhc3M7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwudXRpbC5Qcm9wZXJ0eTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLlByb3BlcnR5QWxpYXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuamV0dHkuY29ubmVjdG9yLkpldHR5Q2xpZW50UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuTXVsdGlQYXJ0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5zc2UuU3NlRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLk1lc3NhZ2VQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5JbnRlcm5hbFNlcnZlclByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm9hdXRoMS5PQXV0aDFTZXJ2ZXJQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogVGVzdCwgdGhhdCB0aGVyZSBhcmUgbm8gcHJvcGVydGllcyB3aXRoIG92ZXJsYXBwaW5nIG5hbWVzIGluIGtub3duIEplcnNleSB7QGNvZGUgKlByb3BlcnRpZXN9IGFuZCB7QGNvZGUgKkZlYXR1cmV9CisgKiBjbGFzc2VzLgorICogPHA+CisgKiBGb3IgdGVjaG5pY2FsIHJlYXNvbnMsIHdlIGRvIG5vdCB3YW50IHRoZSBwcm9wZXJ0eSBuYW1lcyB0byA8aT5vdmVybGFwPC9pPi4KKyAqIEluIG90aGVyIHdvcmRzLCBubyBwcm9wZXJ0eSBzaG91bGQgY29udGFpbiBhIDxpPm5hbWVzcGFjZSBwcmVmaXg8L2k+LCB0aGF0IGlzIGFscmVhZHkgdXNlZCBhcyBhIGNvbmNyZXRlIHByb3BlcnR5IG5hbWUsCisgKiBzdWNoIGFzIHtAY29kZSBhLmJ9IGFuZCB7QGNvZGUgYS5iLmN9LgorICogPC9wPgorICogPHA+CisgKiBBZGRpdGlvbmFsbHksIHRoZSB0ZXN0IGFsc28gcmVwb3J0cyBhbGwgdGhlIGR1cGxpY2F0ZXMgcHJvcGVydHkgbmFtZXMgZm91bmQgdGhyb3VnaG91dCB0aGUgY2hlY2tlZCBmaWxlcy4KKyAqIDwvcD4KKyAqIDxwPgorICogTm90ZSB0aGF0IHRoZSBsaXN0IG9mIGZpbGVzIGlzIGhhcmRjb2RlZCBkaXJlY3RseSBpbiB0aGlzIHRlc3QgaW4gYSBzdGF0aWMgYXJyYXkKKyAqICh0byBhdm9pZCB0aGUgbmVjZXNzaXR5IG9mIHdyaXRpbmcgY3VzdG9tIGNsYXNzIGxvYWRlciBmb3IgdGhpcyB0ZXN0KS4KKyAqIElmIGEgamF2YSBjbGFzcyBjb250YWluaW5nIHByb3BlcnRpZXMgc2hvdWxkIGJ5IGluY2x1ZGVkIGluIHRoZSBjaGVjaywgaXQgaGFzIHRvIGJlIGFkZGVkIGhlcmUuCisgKiBBbHNvIG5vdGUgdGhhdCB0aGUgdGVzdCBpcyByZWx5aW5nIG9uIHtAbGluayBQcm9wZXJ0eX0sIHtAbGluayBQcm9wZXJ0aWVzQ2xhc3N9IGFuZCB7QGxpbmsgUHJvcGVydHlBbGlhc30gYW5ub3RhdGlvbnMKKyAqIHRvIHJlY29nbml6ZSBpbmRpdmlkdWFsIHByb3BlcnRpZXMuCisgKiA8L3A+CisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFByb3BlcnR5T3ZlcmxhcHBpbmdDaGVja1Rlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZyA9IExvZ2dlci5nZXRMb2dnZXIoUHJvcGVydHlPdmVybGFwcGluZ0NoZWNrVGVzdC5jbGFzcy5nZXROYW1lKCkpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2xhc3M8Pz5bXSBjbGFzc2VzID0gbmV3IENsYXNzW10geworICAgICAgICAgICAgSmV0dHlDbGllbnRQcm9wZXJ0aWVzLmNsYXNzLAorICAgICAgICAgICAgQXBhY2hlQ2xpZW50UHJvcGVydGllcy5jbGFzcywKKyAgICAgICAgICAgIE9BdXRoMVNlcnZlclByb3BlcnRpZXMuY2xhc3MsCisgICAgICAgICAgICBTZXJ2bGV0UHJvcGVydGllcy5jbGFzcywKKyAgICAgICAgICAgIENvbW1vblByb3BlcnRpZXMuY2xhc3MsCisgICAgICAgICAgICBNZXNzYWdlUHJvcGVydGllcy5jbGFzcywKKyAgICAgICAgICAgIFNlcnZlclByb3BlcnRpZXMuY2xhc3MsCisgICAgICAgICAgICBJbnRlcm5hbFNlcnZlclByb3BlcnRpZXMuY2xhc3MsCisgICAgICAgICAgICBDbGllbnRQcm9wZXJ0aWVzLmNsYXNzLAorICAgICAgICAgICAgTXVsdGlQYXJ0UHJvcGVydGllcy5jbGFzcywKKyAgICAgICAgICAgIFRlc3RQcm9wZXJ0aWVzLmNsYXNzLAorICAgICAgICAgICAgU3NlRmVhdHVyZS5jbGFzcworICAgIH07CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBQcm9ibGVtUmVwb3J0IHsKKworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBwYXJlbnRQcm9wZXJ0eTsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgY2xhc3NOYW1lUGFyZW50OworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBjaGlsZFByb3BlcnR5OworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBjbGFzc05hbWVDaGlsZDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIGR1cGxpY2F0ZTsKKworICAgICAgICBwcml2YXRlIFByb2JsZW1SZXBvcnQoU3RyaW5nIHBhcmVudFByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZVBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjaGlsZFByb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZUNoaWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBkdXBsaWNhdGUpIHsKKyAgICAgICAgICAgIHRoaXMucGFyZW50UHJvcGVydHkgPSBwYXJlbnRQcm9wZXJ0eTsKKyAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lUGFyZW50ID0gY2xhc3NOYW1lUGFyZW50OworICAgICAgICAgICAgdGhpcy5jaGlsZFByb3BlcnR5ID0gY2hpbGRQcm9wZXJ0eTsKKyAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lQ2hpbGQgPSBjbGFzc05hbWVDaGlsZDsKKyAgICAgICAgICAgIHRoaXMuZHVwbGljYXRlID0gZHVwbGljYXRlOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBQcm9ibGVtUmVwb3J0KFN0cmluZyBwYXJlbnRQcm9wZXJ0eSwgU3RyaW5nIGNsYXNzTmFtZVBhcmVudCwgU3RyaW5nIGNoaWxkUHJvcGVydHksIFN0cmluZyBjbGFzc05hbWVDaGlsZCkgeworICAgICAgICAgICAgdGhpcyhwYXJlbnRQcm9wZXJ0eSwgY2xhc3NOYW1lUGFyZW50LCBjaGlsZFByb3BlcnR5LCBjbGFzc05hbWVDaGlsZCwgZmFsc2UpOworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRQYXJlbnRQcm9wZXJ0eSgpIHsKKyAgICAgICAgICAgIHJldHVybiBwYXJlbnRQcm9wZXJ0eTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NOYW1lUGFyZW50KCkgeworICAgICAgICAgICAgcmV0dXJuIGNsYXNzTmFtZVBhcmVudDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hpbGRQcm9wZXJ0eSgpIHsKKyAgICAgICAgICAgIHJldHVybiBjaGlsZFByb3BlcnR5OworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRDbGFzc05hbWVDaGlsZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBjbGFzc05hbWVDaGlsZDsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzRHVwbGljYXRlKCkgeworICAgICAgICAgICAgcmV0dXJuIGR1cGxpY2F0ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdCgpIHRocm93cyBJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIHsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGFsbFByb3BlcnR5TmFtZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBwcm9wZXJ0eVRvQ2xhc3NNYXAgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIExpc3Q8UHJvYmxlbVJlcG9ydD4gcHJvYmxlbXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgICAgICAvLyBpdGVyYXRlIG92ZXIgYWxsIHRoZSBzdHJpbmcgZmllbGRzIG9mIGFib3ZlIGRlY2xhcmVkIGNsYXNzZXMKKyAgICAgICAgZm9yIChDbGFzczw/PiBjbGF6eiA6IGNsYXNzZXMpIHsKKyAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gY2hlY2tGaWVsZFByb3BlcnR5QW5ub3RhdGlvbiA9IGNsYXp6LmdldEFubm90YXRpb24oUHJvcGVydGllc0NsYXNzLmNsYXNzKSA9PSBudWxsOworICAgICAgICAgICAgRmllbGRbXSBmaWVsZHMgPSBjbGF6ei5nZXRGaWVsZHMoKTsKKyAgICAgICAgICAgIGZvciAoRmllbGQgZmllbGQgOiBmaWVsZHMpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2hlY2tGaWVsZFByb3BlcnR5QW5ub3RhdGlvbiAmJiBmaWVsZC5nZXRBbm5vdGF0aW9uKFByb3BlcnR5LmNsYXNzKSA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHNraXAgZmllbGRzIG5vdCBhbm5vdGF0ZWQgd2l0aCBAUHJvcGVydHkgaW4gY2xhc3NlcyBub3QgYW5ub3RhdGVkIHdpdGggQFByb3BlcnRpZXNDbGFzcworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGZpZWxkLmdldEFubm90YXRpb24oUHJvcGVydHlBbGlhcy5jbGFzcykgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAvLyBza2lwIHByb3BlcnR5IGFsaWFzZXMKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChmaWVsZC5nZXRUeXBlKCkuaXNBc3NpZ25hYmxlRnJvbShTdHJpbmcuY2xhc3MpKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eVZhbHVlID0gKFN0cmluZykgZmllbGQuZ2V0KG51bGwpOworICAgICAgICAgICAgICAgICAgICBhbGxQcm9wZXJ0eU5hbWVzLmFkZChwcm9wZXJ0eVZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgYWxyZWFkeSBzdWNoIHByb3BlcnR5IGluIHRoZSBtYXA7IHJlcG9ydCBhIHByb2JsZW0gaWYgdHJ1ZSBvciBzdG9yZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gcHJvcGVydHktdG8tY2xhc3MgcmVsYXRpb25zaGlwIGludG8gdGhlIG1hcCBmb3IgbGF0ZXIgdXNlCisgICAgICAgICAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eU1hcEVudHJ5ID0gcHJvcGVydHlUb0NsYXNzTWFwLmdldChwcm9wZXJ0eVZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5VG9DbGFzc01hcC5nZXQocHJvcGVydHlWYWx1ZSkgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICBsb2cuaW5mbygiRHVwbGljYXRlIHByb3BlcnR5IGZvdW5kOiAiICsgcHJvcGVydHlWYWx1ZSArICIgaW4gIiArCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9wZXJ0eU1hcEVudHJ5ICsgIiBhbmQgIgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY2xhenouZ2V0TmFtZSgpICsgIi4gVGVzdCB3b24ndCBmYWlsIGJlY2F1c2Ugb2YgdGhpcywgYXMgdGhlIGNoZWNrCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBjdXJyZW50bHkgZGlzYWJsZWQuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGNhbm5vdCBjYXVzZSB0aGUgdGVzdCB0byBmYWlsLCBhcyB0aGVyZSBhcmUgYWxpYXNlcyBpbiBDbGllbnRQcm9wZXJ0aWVzIGFuZCBTZXJ2ZXJQcm9wZXJ0aWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggYXJlIGJ5IGRlZmluaXRpb24gZXF1YWwgdG8gdGhvc2UgZGVmaW5lZCBpbiBDb21tb25Qcm9wZXJ0aWVzCisgICAgICAgICAgICAgICAgICAgICAgICBwcm9ibGVtcy5hZGQobmV3IFByb2JsZW1SZXBvcnQocHJvcGVydHlWYWx1ZSwgcHJvcGVydHlNYXBFbnRyeSwgcHJvcGVydHlWYWx1ZSwgY2xhenouZ2V0TmFtZSgpLCB0cnVlKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVRvQ2xhc3NNYXAucHV0KHByb3BlcnR5VmFsdWUsIGNsYXp6LmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gc29ydCB0aGUgcHJvcGVydGllcyBieSBuYW1lIChuYXR1cmFsKSwgc28gdGhhdCBpZiB0d28gcHJvcGVydGllcyBoYXZlIG92ZXJsYXBwaW5nIG5hbWVzLAorICAgICAgICAvLyB0aGV5IHdpbGwgYXBwZWFyIG9uZSBhZnRlciBhbm90aGVyCisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQoYWxsUHJvcGVydHlOYW1lcyk7CisKKyAgICAgICAgU3RyaW5nIHByZXZpb3VzUHJvcGVydHkgPSAiIjsKKyAgICAgICAgZm9yIChTdHJpbmcgcHJvcGVydHkgOiBhbGxQcm9wZXJ0eU5hbWVzKSB7CisgICAgICAgICAgICAvLyBpcyB0aGUgcHJvcGVydHkgb3ZlcmxhcHBpbmcgd2l0aCB0aGUgcHJldmlvdXMgb25lPworICAgICAgICAgICAgLy8gZG8gbm90IGNvbnNpZGVyIG92ZXJsYXBwaW5nIHN1Y2ggYXMgZm9vLmJhciB2cyBmb28uYmFyYmFyLCBqdXN0IGZvby5iYXIgdnMgZm9vLmJhci5iYXIKKyAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5zdGFydHNXaXRoKHByZXZpb3VzUHJvcGVydHkgKyAiLiIpKSB7CisgICAgICAgICAgICAgICAgcHJvYmxlbXMuYWRkKG5ldyBQcm9ibGVtUmVwb3J0KHByZXZpb3VzUHJvcGVydHksIHByb3BlcnR5VG9DbGFzc01hcC5nZXQocHJldmlvdXNQcm9wZXJ0eSksCisgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSwgcHJvcGVydHlUb0NsYXNzTWFwLmdldChwcm9wZXJ0eSkpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gdGhlICJwb2ludGVyIiBpcyBtb3ZlZCBvbmx5IGlmIHRoZXJlIHdhcyBubyBvdmVybGFwcGluZyBkZXRlY3RlZCBpbiB0aGlzIGl0ZXJhdGlvbgorICAgICAgICAgICAgICAgIC8vIGFzIHRoaXMgd291bGQgcG90ZW50aWFsbHkgaGlkZSB0aGUgMm5kIChvciBuLXRoKSBwcm9wZXJ0eSBvdmVybGFwcGluZyB3aXRoIHRoZSBzYW1lIG9uZQorICAgICAgICAgICAgICAgIHByZXZpb3VzUHJvcGVydHkgPSBwcm9wZXJ0eTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghcHJvYmxlbXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBsb2cuc2V2ZXJlKCJQcm9wZXJ0eSBuYW1pbmcgcHJvYmxlbXMgZGV0ZWN0ZWQ6ICIpOworICAgICAgICAgICAgZm9yIChQcm9ibGVtUmVwb3J0IHByb2JsZW0gOiBwcm9ibGVtcykgeworICAgICAgICAgICAgICAgIGlmIChwcm9ibGVtLmlzRHVwbGljYXRlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbG9nLnNldmVyZSgiRHVwbGljYXRlIHByb3BlcnR5IG5hbWU6IFxuICBwcm9wZXJ0eTogIiArIHByb2JsZW0uZ2V0UGFyZW50UHJvcGVydHkoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlxuICBjbGFzczE6ICIgKyBwcm9ibGVtLmdldENsYXNzTmFtZVBhcmVudCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiXG4gIGNsYXNzMjogIiArIHByb2JsZW0uZ2V0Q2xhc3NOYW1lQ2hpbGQoKSArICJcbiIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGxvZy5zZXZlcmUoIk92ZXJsYXBwaW5nIHByb3BlcnR5IG5hbWVzOiBcbiAgcHJvcGVydHkxOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwcm9ibGVtLmdldFBhcmVudFByb3BlcnR5KCkgKyAiXG4gIGluOiAiICsgcHJvYmxlbS5nZXRDbGFzc05hbWVQYXJlbnQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlxuICBwcm9wZXJ0eTI6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHByb2JsZW0uZ2V0Q2hpbGRQcm9wZXJ0eSgpICsgIlxuICBpbiAiICsgcHJvYmxlbS5nZXRDbGFzc05hbWVDaGlsZCgpICsgIlxuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIGZhaWwgaWYgcHJvYmxlbXMgZGV0ZWN0ZWQKKyAgICAgICAgYXNzZXJ0VHJ1ZShwcm9ibGVtcy5pc0VtcHR5KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlY3VyaXR5LWRpZ2VzdC9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VjdXJpdHktZGlnZXN0L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNmZmRmOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlY3VyaXR5LWRpZ2VzdC9wb20ueG1sCkBAIC0wLDAgKzEsNzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAgPHBhcmVudD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorICAgIDxhcnRpZmFjdElkPnNlY3VyaXR5LWRpZ2VzdDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1qZXJzZXktc2VjdXJpdHktZGlnZXN0PC9uYW1lPgorICAgIDx1cmw+aHR0cDovL21hdmVuLmFwYWNoZS5vcmc8L3VybD4KKworCisgICAgPGRlc2NyaXB0aW9uPlRlc3Qgb2YgRElHRVNUIGF1dGhlbnRpY2F0aW9uPC9kZXNjcmlwdGlvbj4KKworCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorCisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDwhLS0gZGVmaW5lIGxvZ2luIHNlcnZpY2UgZm9yIGpldHR5IGFuZCB0aGUgcmVhbG0gdG8gYmUgdXNlZCAtLT4KKyAgICAgICAgICAgICAgICAgICAgPGxvZ2luU2VydmljZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8bG9naW5TZXJ2aWNlIGltcGxlbWVudGF0aW9uPSJvcmcuZWNsaXBzZS5qZXR0eS5zZWN1cml0eS5IYXNoTG9naW5TZXJ2aWNlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5teS1yZWFsbTwvbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlnPiR7YmFzZWRpcn0vc3JjL21haW4vcmVzb3VyY2VzL2pldHR5L3JlYWxtLnByb3BlcnRpZXM8L2NvbmZpZz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbG9naW5TZXJ2aWNlPgorICAgICAgICAgICAgICAgICAgICA8L2xvZ2luU2VydmljZXM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisKKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZWN1cml0eS1kaWdlc3Qvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZWN1cml0eWRpZ2VzdC9NeUFwcGxpY2F0aW9uLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZWN1cml0eS1kaWdlc3Qvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZWN1cml0eWRpZ2VzdC9NeUFwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM0ODBhYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlY3VyaXR5LWRpZ2VzdC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlY3VyaXR5ZGlnZXN0L015QXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlY3VyaXR5ZGlnZXN0OworCitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzOworCisvKioKKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK0BBcHBsaWNhdGlvblBhdGgoIi9yZXN0LyoiKQorcHVibGljIGNsYXNzIE15QXBwbGljYXRpb24gZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisKKyAgICBwdWJsaWMgTXlBcHBsaWNhdGlvbigpIHsKKyAgICAgICAgcmVnaXN0ZXIoTXlSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VjdXJpdHktZGlnZXN0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VjdXJpdHlkaWdlc3QvTXlSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VjdXJpdHktZGlnZXN0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VjdXJpdHlkaWdlc3QvTXlSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYmZmNjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZWN1cml0eS1kaWdlc3Qvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZWN1cml0eWRpZ2VzdC9NeVJlc291cmNlLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZWN1cml0eWRpZ2VzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5TZWN1cml0eUNvbnRleHQ7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworCisvKioKKyAqIFRoaXMgcmVzb3VyY2UgY29udGFpbnMgbWV0aG9kcyB0aGF0IGFyZSBzZWN1cmVkIHVzaW5nIHdlYi54bWwgZGVjbGFyYXRpdmUgc2VjdXJpdHkuIE5hbWVzIG9mIG1ldGhvZHMKKyAqIGRlc2NyaWJlIHdoaWNoIHVzZXIgcm9sZXMgaGF2ZSBhY2Nlc3MgdG8gdGhlbS4KKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK0BQYXRoKCJyZXNvdXJjZSIpCitwdWJsaWMgY2xhc3MgTXlSZXNvdXJjZSB7CisgICAgQEluamVjdAorICAgIFNlY3VyaXR5Q29udGV4dCBzZWN1cml0eUNvbnRleHQ7CisKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBnZXRVc2VyQWRtaW4oKSB7CisgICAgICAgIHJldHVybiBzZWN1cml0eUNvbnRleHQuZ2V0VXNlclByaW5jaXBhbCgpLmdldE5hbWUoKSArIGdldEF1dGgoKTsKKyAgICB9CisKKyAgICBAUE9TVAorICAgIHB1YmxpYyBTdHJpbmcgcG9zdFVzZXJBZG1pbihTdHJpbmcgZW50aXR5KSB7CisgICAgICAgIHJldHVybiAicG9zdC0iICsgZW50aXR5ICsgIi0iICsgc2VjdXJpdHlDb250ZXh0LmdldFVzZXJQcmluY2lwYWwoKS5nZXROYW1lKCkgKyBnZXRBdXRoKCk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJzdWIiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0QWRtaW4oKSB7CisgICAgICAgIHJldHVybiAic3ViZ2V0LSIgKyBzZWN1cml0eUNvbnRleHQuZ2V0VXNlclByaW5jaXBhbCgpLmdldE5hbWUoKSArIGdldEF1dGgoKTsKKyAgICB9CisKKyAgICBAUGF0aCgibG9jYXRvciIpCisgICAgcHVibGljIENsYXNzPFN1YlJlc291cmNlPiBnZXRTdWJSZXNvdXJjZVVzZXJBZG1pbigpIHsKKyAgICAgICAgcmV0dXJuIFN1YlJlc291cmNlLmNsYXNzOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIGdldEF1dGgoKSB7CisgICAgICAgIHJldHVybiAiL3NjaGVtZToiICsgc2VjdXJpdHlDb250ZXh0LmdldEF1dGhlbnRpY2F0aW9uU2NoZW1lKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZWN1cml0eS1kaWdlc3Qvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZWN1cml0eWRpZ2VzdC9TdWJSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VjdXJpdHktZGlnZXN0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VjdXJpdHlkaWdlc3QvU3ViUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWM2ZWRjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VjdXJpdHktZGlnZXN0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VjdXJpdHlkaWdlc3QvU3ViUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlY3VyaXR5ZGlnZXN0OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5TZWN1cml0eUNvbnRleHQ7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworCisvKioKKyAqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK3B1YmxpYyBjbGFzcyBTdWJSZXNvdXJjZSB7CisgICAgQEluamVjdAorICAgIFNlY3VyaXR5Q29udGV4dCBzZWN1cml0eUNvbnRleHQ7CisKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBnZXRVc2VyQWRtaW4oKSB7CisgICAgICAgIHJldHVybiAibG9jYXRvci0iICsgc2VjdXJpdHlDb250ZXh0LmdldFVzZXJQcmluY2lwYWwoKS5nZXROYW1lKCkgKyBnZXRBdXRoKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QXV0aCgpIHsKKyAgICAgICAgcmV0dXJuICIvc2NoZW1lOiIgKyBzZWN1cml0eUNvbnRleHQuZ2V0QXV0aGVudGljYXRpb25TY2hlbWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZWN1cml0eS1kaWdlc3Qvc3JjL21haW4vcmVzb3VyY2VzL2pldHR5L3JlYWxtLnByb3BlcnRpZXMgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZWN1cml0eS1kaWdlc3Qvc3JjL21haW4vcmVzb3VyY2VzL2pldHR5L3JlYWxtLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUzMGRmMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlY3VyaXR5LWRpZ2VzdC9zcmMvbWFpbi9yZXNvdXJjZXMvamV0dHkvcmVhbG0ucHJvcGVydGllcwpAQCAtMCwwICsxLDE5IEBACisjCisjIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorIworIyBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisjIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyMgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisjIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyMKKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisjCisKK2hvbWVyOkhvbWVyLG15LXVzZXIKK21hcmdlOk1hcmdlLG15LWFkbWluCitiYXJ0OkJhcnQsbXktdXNlcixteS1hZG1pbgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VjdXJpdHktZGlnZXN0L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZWN1cml0eS1kaWdlc3Qvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzA0ZjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VjdXJpdHktZGlnZXN0L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSw3NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIyLjUiIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIj4KKworICAgIDxkaXNwbGF5LW5hbWU+QXJjaGV0eXBlIENyZWF0ZWQgV2ViIEFwcGxpY2F0aW9uPC9kaXNwbGF5LW5hbWU+CisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VjdXJpdHlkaWdlc3QuTXlBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VjdXJpdHlkaWdlc3QuTXlBcHBsaWNhdGlvbjwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VjdXJpdHlkaWdlc3QuTXlBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L3Jlc3QvKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisgICAgPHdlbGNvbWUtZmlsZS1saXN0PgorICAgICAgICA8d2VsY29tZS1maWxlPmluZGV4Lmh0bWw8L3dlbGNvbWUtZmlsZT4KKyAgICA8L3dlbGNvbWUtZmlsZS1saXN0PgorCisgICAgPHNlY3VyaXR5LWNvbnN0cmFpbnQ+CisgICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KKyAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT5yZXN0IGFwaTwvd2ViLXJlc291cmNlLW5hbWU+CisgICAgICAgICAgICA8dXJsLXBhdHRlcm4+L3Jlc3QvKjwvdXJsLXBhdHRlcm4+CisgICAgICAgIDwvd2ViLXJlc291cmNlLWNvbGxlY3Rpb24+CisgICAgICAgIDxhdXRoLWNvbnN0cmFpbnQ+CisgICAgICAgICAgICA8cm9sZS1uYW1lPm15LXVzZXI8L3JvbGUtbmFtZT4KKyAgICAgICAgICAgIDxyb2xlLW5hbWU+bXktYWRtaW48L3JvbGUtbmFtZT4KKyAgICAgICAgPC9hdXRoLWNvbnN0cmFpbnQ+CisgICAgPC9zZWN1cml0eS1jb25zdHJhaW50PgorCisgICAgPHNlY3VyaXR5LWNvbnN0cmFpbnQ+CisgICAgICAgIDx3ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KKyAgICAgICAgICAgIDx3ZWItcmVzb3VyY2UtbmFtZT5yZXN0IGFwaTwvd2ViLXJlc291cmNlLW5hbWU+CisgICAgICAgICAgICA8dXJsLXBhdHRlcm4+L3Jlc3QvcmVzb3VyY2Uvc3ViPC91cmwtcGF0dGVybj4KKyAgICAgICAgPC93ZWItcmVzb3VyY2UtY29sbGVjdGlvbj4KKyAgICAgICAgPGF1dGgtY29uc3RyYWludD4KKyAgICAgICAgICAgIDxyb2xlLW5hbWU+bXktYWRtaW48L3JvbGUtbmFtZT4KKyAgICAgICAgPC9hdXRoLWNvbnN0cmFpbnQ+CisgICAgPC9zZWN1cml0eS1jb25zdHJhaW50PgorCisgICAgPHNlY3VyaXR5LXJvbGU+CisgICAgICAgIDxyb2xlLW5hbWU+bXktdXNlcjwvcm9sZS1uYW1lPgorICAgIDwvc2VjdXJpdHktcm9sZT4KKyAgICA8c2VjdXJpdHktcm9sZT4KKyAgICAgICAgPHJvbGUtbmFtZT5teS1hZG1pbjwvcm9sZS1uYW1lPgorICAgIDwvc2VjdXJpdHktcm9sZT4KKworCisgICAgPGxvZ2luLWNvbmZpZz4KKyAgICAgICAgPGF1dGgtbWV0aG9kPkRJR0VTVDwvYXV0aC1tZXRob2Q+CisgICAgICAgIDxyZWFsbS1uYW1lPm15LXJlYWxtPC9yZWFsbS1uYW1lPgorICAgIDwvbG9naW4tY29uZmlnPgorCis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZWN1cml0eS1kaWdlc3Qvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZWN1cml0eWRpZ2VzdC9TZWN1cml0eURpZ2VzdEF1dGhlbnRpY2F0aW9uSVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZWN1cml0eS1kaWdlc3Qvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZWN1cml0eWRpZ2VzdC9TZWN1cml0eURpZ2VzdEF1dGhlbnRpY2F0aW9uSVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJiNDIyYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlY3VyaXR5LWRpZ2VzdC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlY3VyaXR5ZGlnZXN0L1NlY3VyaXR5RGlnZXN0QXV0aGVudGljYXRpb25JVENhc2UuamF2YQpAQCAtMCwwICsxLDE3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZWN1cml0eWRpZ2VzdDsKKworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuYXV0aGVudGljYXRpb24uSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIEBhdXRob3IgTWlyb3NsYXYgRnVrc2EKKyAqLworcHVibGljIGNsYXNzIFNlY3VyaXR5RGlnZXN0QXV0aGVudGljYXRpb25JVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoTXlBcHBsaWNhdGlvbi5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcucmVnaXN0ZXIobmV3IExvZ2dpbmdGZWF0dXJlKExvZ2dlci5nZXRMb2dnZXIoU2VjdXJpdHlEaWdlc3RBdXRoZW50aWNhdGlvbklUQ2FzZS5jbGFzcy5nZXROYW1lKCkpLAorICAgICAgICAgICAgICAgIExvZ2dpbmdGZWF0dXJlLlZlcmJvc2l0eS5QQVlMT0FEX0FOWSkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlR2V0KCkgeworICAgICAgICBfdGVzdFJlc291cmNlR2V0KEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUuZGlnZXN0KCJob21lciIsICJIb21lciIpKTsKKyAgICAgICAgX3Rlc3RSZXNvdXJjZUdldChIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLnVuaXZlcnNhbCgiaG9tZXIiLCAiSG9tZXIiKSk7CisgICAgICAgIF90ZXN0UmVzb3VyY2VHZXQoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS51bml2ZXJzYWxCdWlsZGVyKCkuY3JlZGVudGlhbHNGb3JEaWdlc3QoImhvbWVyIiwgIkhvbWVyIikuYnVpbGQoKSk7CisgICAgICAgIF90ZXN0UmVzb3VyY2VHZXQoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS51bml2ZXJzYWxCdWlsZGVyKCkuY3JlZGVudGlhbHNGb3JEaWdlc3QoImhvbWVyIiwgIkhvbWVyIikKKyAgICAgICAgICAgICAgICAuY3JlZGVudGlhbHNGb3JCYXNpYygiYWFhIiwgImJiYiIpLmJ1aWxkKCkpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIF90ZXN0UmVzb3VyY2VHZXQoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZSBmZWF0dXJlKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzdC9yZXNvdXJjZSIpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKGZlYXR1cmUpLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJob21lci9zY2hlbWU6RElHRVNUIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUdldDQwMSgpIHsKKyAgICAgICAgX3Rlc3RSZXNvdXJjZUdldDQwMShIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLmRpZ2VzdCgibm9uZXhpc3RpbmciLCAiZm9vIikpOworICAgICAgICBfdGVzdFJlc291cmNlR2V0NDAxKEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUudW5pdmVyc2FsQnVpbGRlcigpLmNyZWRlbnRpYWxzKCJub25leGlzdGluZyIsICJmb28iKS5idWlsZCgpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBfdGVzdFJlc291cmNlR2V0NDAxKEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUgZmVhdHVyZSkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc3QvcmVzb3VyY2UiKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihmZWF0dXJlKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MDEsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZVBvc3QoKSB7CisgICAgICAgIF90ZXN0UmVzb3VyY2VQb3N0KEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUuZGlnZXN0KCJob21lciIsICJIb21lciIpKTsKKyAgICAgICAgX3Rlc3RSZXNvdXJjZVBvc3QoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS51bml2ZXJzYWwoImhvbWVyIiwgIkhvbWVyIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIF90ZXN0UmVzb3VyY2VQb3N0KEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUgZmVhdHVyZSkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc3QvcmVzb3VyY2UiKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihmZWF0dXJlKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KCJoZWxsb3dvcmxkIiwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSkpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoInBvc3QtaGVsbG93b3JsZC1ob21lci9zY2hlbWU6RElHRVNUIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZVN1YkdldDQwMygpIHsKKyAgICAgICAgX3Rlc3RSZXNvdXJjZVN1YkdldDQwMyhIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLmRpZ2VzdCgiaG9tZXIiLCAiSG9tZXIiKSk7CisgICAgICAgIF90ZXN0UmVzb3VyY2VTdWJHZXQ0MDMoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS51bml2ZXJzYWwoImhvbWVyIiwgIkhvbWVyIikpOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIF90ZXN0UmVzb3VyY2VTdWJHZXQ0MDMoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZSBmZWF0dXJlKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzdC9yZXNvdXJjZS9zdWIiKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihmZWF0dXJlKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MDMsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZVN1YkdldCgpIHsKKyAgICAgICAgX3Rlc3RSZXNvdXJjZVN1YkdldDIoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS5kaWdlc3QoImJhcnQiLCAiQmFydCIpKTsKKyAgICAgICAgX3Rlc3RSZXNvdXJjZVN1YkdldDIoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZS51bml2ZXJzYWwoImJhcnQiLCAiQmFydCIpKTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBfdGVzdFJlc291cmNlU3ViR2V0MihIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlIGZlYXR1cmUpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXN0L3Jlc291cmNlL3N1YiIpCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKGZlYXR1cmUpLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJzdWJnZXQtYmFydC9zY2hlbWU6RElHRVNUIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUxvY2F0b3JHZXQoKSB7CisgICAgICAgIF90ZXN0UmVzb3VyY2VMb2NhdG9yR2V0KEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUuZGlnZXN0KCJiYXJ0IiwgIkJhcnQiKSk7CisgICAgICAgIF90ZXN0UmVzb3VyY2VMb2NhdG9yR2V0KEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUudW5pdmVyc2FsKCJiYXJ0IiwgIkJhcnQiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgX3Rlc3RSZXNvdXJjZUxvY2F0b3JHZXQoSHR0cEF1dGhlbnRpY2F0aW9uRmVhdHVyZSBmZWF0dXJlKSB7CisKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXN0L3Jlc291cmNlL2xvY2F0b3IiKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihmZWF0dXJlKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygibG9jYXRvci1iYXJ0L3NjaGVtZTpESUdFU1QiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlTXVsdGlwbGVSZXF1ZXN0c1dpdGhPbmVGaWx0ZXIoKSB7CisgICAgICAgIF90ZXN0UmVzb3VyY2VNdWx0aXBsZVJlcXVlc3RzV2l0aE9uZUZpbHRlcihIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLmRpZ2VzdCgiaG9tZXIiLCAiSG9tZXIiKSk7CisgICAgICAgIF90ZXN0UmVzb3VyY2VNdWx0aXBsZVJlcXVlc3RzV2l0aE9uZUZpbHRlcihIdHRwQXV0aGVudGljYXRpb25GZWF0dXJlLnVuaXZlcnNhbCgiaG9tZXIiLCAiSG9tZXIiKSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgX3Rlc3RSZXNvdXJjZU11bHRpcGxlUmVxdWVzdHNXaXRoT25lRmlsdGVyKEh0dHBBdXRoZW50aWNhdGlvbkZlYXR1cmUgaGFmKSB7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoKS5wYXRoKCJyZXN0L3Jlc291cmNlIikKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoaGFmKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoImhvbWVyL3NjaGVtZTpESUdFU1QiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiaG9tZXIvc2NoZW1lOkRJR0VTVCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQucGF0aCgic3ViIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQwMywgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0LnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiaG9tZXIvc2NoZW1lOkRJR0VTVCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgcmVzcG9uc2UgPSB0YXJnZXQucGF0aCgibG9jYXRvciIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygibG9jYXRvci1ob21lci9zY2hlbWU6RElHRVNUIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWF1dG9kaXNjb3ZlcnktMS9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtYXV0b2Rpc2NvdmVyeS0xL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVkODFmZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWF1dG9kaXNjb3ZlcnktMS9wb20ueG1sCkBAIC0wLDAgKzEsNjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LTIuNS1hdXRvZGlzY292ZXJ5LTE8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tc2VydmxldC0yLjUtYXV0b2Rpc2NvdmVyeS0xPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPlNlcnZsZXQgaW50ZWdyYXRpb24gdGVzdCAtIHNlcnZsZXQtMi41LWF1dG9kaXNjb3ZlcnktMSAtIGF1dG8tZGlzY292ZXJ5IG9mIFVyaUNvbm5lZ0ZpbHRlcjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWF1dG9kaXNjb3ZlcnktMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfYXV0b2Rpc2NvdmVyeV8xL0xhbmd1YWdlVmFyaWFudFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1hdXRvZGlzY292ZXJ5LTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2F1dG9kaXNjb3ZlcnlfMS9MYW5ndWFnZVZhcmlhbnRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMTYxYzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1hdXRvZGlzY292ZXJ5LTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2F1dG9kaXNjb3ZlcnlfMS9MYW5ndWFnZVZhcmlhbnRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9hdXRvZGlzY292ZXJ5XzE7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVxdWVzdDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVmFyaWFudDsKKworLyoqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUGF0aCgiL2FiYyIpCitwdWJsaWMgY2xhc3MgTGFuZ3VhZ2VWYXJpYW50UmVzb3VyY2UgeworCisgICAgQEdFVAorICAgIHB1YmxpYyBSZXNwb25zZSBkb0dldChAQ29udGV4dCBSZXF1ZXN0IHIpIHsKKyAgICAgICAgTGlzdDxWYXJpYW50PiB2cyA9IFZhcmlhbnQuVmFyaWFudExpc3RCdWlsZGVyLm5ld0luc3RhbmNlKCkKKyAgICAgICAgICAgICAgICAubWVkaWFUeXBlcyhNZWRpYVR5cGUudmFsdWVPZigiYXBwbGljYXRpb24vZm9vIikpCisgICAgICAgICAgICAgICAgLmxhbmd1YWdlcyhuZXcgTG9jYWxlKCJlbiIpKS5sYW5ndWFnZXMobmV3IExvY2FsZSgiZnIiKSkuYWRkKCkKKyAgICAgICAgICAgICAgICAubWVkaWFUeXBlcyhNZWRpYVR5cGUudmFsdWVPZigiYXBwbGljYXRpb24vYmFyIikpCisgICAgICAgICAgICAgICAgLmxhbmd1YWdlcyhuZXcgTG9jYWxlKCJlbiIpKS5sYW5ndWFnZXMobmV3IExvY2FsZSgiZnIiKSkuYWRkKCkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICBWYXJpYW50IHYgPSByLnNlbGVjdFZhcmlhbnQodnMpOworICAgICAgICBpZiAodiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzcG9uc2Uubm90QWNjZXB0YWJsZSh2cykuYnVpbGQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBSZXNwb25zZS5vayh2LmdldE1lZGlhVHlwZSgpLnRvU3RyaW5nKCkgKyAiLCAiICsgdi5nZXRMYW5ndWFnZSgpLCB2KS5idWlsZCgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtYXV0b2Rpc2NvdmVyeS0xL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1hdXRvZGlzY292ZXJ5LTEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDVkZTgzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtYXV0b2Rpc2NvdmVyeS0xL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSw0MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIyLjUiIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzJfNS54c2QiPgorICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPnRlc3RBdXRvRGlzY292ZXJ5MTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amVyc2V5LmNvbmZpZy5zZXJ2ZXIucHJvdmlkZXIucGFja2FnZXM8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9hdXRvZGlzY292ZXJ5XzE8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amVyc2V5LmNvbmZpZy5zZXJ2ZXIubWVkaWFUeXBlTWFwcGluZ3M8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+Zm9vIDogYXBwbGljYXRpb24vZm9vLCBiYXIgOiBhcHBsaWNhdGlvbi9iYXI8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amVyc2V5LmNvbmZpZy5zZXJ2ZXIubGFuZ3VhZ2VNYXBwaW5nczwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5lbmdsaXNoIDogZW4sIGZyZW5jaCA6IGZyPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT50ZXN0QXV0b0Rpc2NvdmVyeTE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWF1dG9kaXNjb3ZlcnktMS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfYXV0b2Rpc2NvdmVyeV8xL0xhbmd1YWdlVmFyaWFudFJlc291cmNlSVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1hdXRvZGlzY292ZXJ5LTEvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2F1dG9kaXNjb3ZlcnlfMS9MYW5ndWFnZVZhcmlhbnRSZXNvdXJjZUlUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNDVkOTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1hdXRvZGlzY292ZXJ5LTEvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2F1dG9kaXNjb3ZlcnlfMS9MYW5ndWFnZVZhcmlhbnRSZXNvdXJjZUlUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9hdXRvZGlzY292ZXJ5XzE7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgTGFuZ3VhZ2VWYXJpYW50UmVzb3VyY2VJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoTGFuZ3VhZ2VWYXJpYW50UmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWVkaWFUeXBlc0FuZExhbmd1YWdlcygpIHsKKyAgICAgICAgX3Rlc3QoImVuZ2xpc2giLCAiZm9vIiwgImVuIiwgImFwcGxpY2F0aW9uL2ZvbyIpOworICAgICAgICBfdGVzdCgiZnJlbmNoIiwgImZvbyIsICJmciIsICJhcHBsaWNhdGlvbi9mb28iKTsKKworICAgICAgICBfdGVzdCgiZW5nbGlzaCIsICJiYXIiLCAiZW4iLCAiYXBwbGljYXRpb24vYmFyIik7CisgICAgICAgIF90ZXN0KCJmcmVuY2giLCAiYmFyIiwgImZyIiwgImFwcGxpY2F0aW9uL2JhciIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBfdGVzdChTdHJpbmcgdWwsIFN0cmluZyB1bSwgU3RyaW5nIGwsIFN0cmluZyBtKSB7CisgICAgICAgIFJlc3BvbnNlIHIgPSB0YXJnZXQoKS5wYXRoKCJhYmMuIiArIHVsICsgIi4iICsgdW0pLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG0gKyAiLCAiICsgbCwgci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICBhc3NlcnRFcXVhbHMobCwgci5nZXRMYW5ndWFnZSgpLnRvU3RyaW5nKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMobSwgci5nZXRNZWRpYVR5cGUoKS50b1N0cmluZygpKTsKKworICAgICAgICByID0gdGFyZ2V0KCkucGF0aCgiYWJjLiIgKyB1bSArICIuIiArIHVsKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhtICsgIiwgIiArIGwsIHIucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGwsIHIuZ2V0TGFuZ3VhZ2UoKS50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG0sIHIuZ2V0TWVkaWFUeXBlKCkudG9TdHJpbmcoKSk7CisKKyAgICAgICAgciA9IHRhcmdldCgpLnBhdGgoImFiYyIpLnJlcXVlc3QobSkuaGVhZGVyKEh0dHBIZWFkZXJzLkFDQ0VQVF9MQU5HVUFHRSwgbCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyhtICsgIiwgIiArIGwsIHIucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGwsIHIuZ2V0TGFuZ3VhZ2UoKS50b1N0cmluZygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG0sIHIuZ2V0TWVkaWFUeXBlKCkudG9TdHJpbmcoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtYXV0b2Rpc2NvdmVyeS0yL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1hdXRvZGlzY292ZXJ5LTIvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzIyMGUzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtYXV0b2Rpc2NvdmVyeS0yL3BvbS54bWwKQEAgLTAsMCArMSw3MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtMi41LWF1dG9kaXNjb3ZlcnktMjwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1zZXJ2bGV0LTIuNS1hdXRvZGlzY292ZXJ5LTI8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+U2VydmxldCBpbnRlZ3JhdGlvbiB0ZXN0IC0gc2VydmxldC0yLjUtYXV0b2Rpc2NvdmVyeS0yIC0gYXV0by1kaXNjb3Zlcnkgb2YgQmVhbiBWYWxpZGF0aW9uIChKQVgtUlMgYnVuZGxlKTwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmJ1bmRsZXM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXhycy1yaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPmphcjwvdHlwZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1iZWFuLXZhbGlkYXRpb248L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1hdXRvZGlzY292ZXJ5LTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2F1dG9kaXNjb3ZlcnlfMi9WYWxpZGF0aW9uUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWF1dG9kaXNjb3ZlcnktMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfYXV0b2Rpc2NvdmVyeV8yL1ZhbGlkYXRpb25SZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMTU4ZTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1hdXRvZGlzY292ZXJ5LTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2F1dG9kaXNjb3ZlcnlfMi9WYWxpZGF0aW9uUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfYXV0b2Rpc2NvdmVyeV8yOworCitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworCitpbXBvcnQgamF2YXgudmFsaWRhdGlvbi5jb25zdHJhaW50cy5Ob3ROdWxsOworaW1wb3J0IGphdmF4LnZhbGlkYXRpb24uY29uc3RyYWludHMuU2l6ZTsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFBhdGgoIi8iKQorcHVibGljIGNsYXNzIFZhbGlkYXRpb25SZXNvdXJjZSB7CisKKyAgICBAUE9TVAorICAgIEBOb3ROdWxsCisgICAgcHVibGljIFN0cmluZyBwb3N0KEBOb3ROdWxsIEBTaXplKG1pbiA9IDEpIGZpbmFsIFN0cmluZyB2YWx1ZSkgeworICAgICAgICByZXR1cm4gdmFsdWUuaXNFbXB0eSgpIHx8ICJ8Ii5lcXVhbHModmFsdWUpID8gbnVsbCA6IHZhbHVlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWF1dG9kaXNjb3ZlcnktMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtYXV0b2Rpc2NvdmVyeS0yL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJhZGZjNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWF1dG9kaXNjb3ZlcnktMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi41IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIj4KKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT50ZXN0QXV0b0Rpc2NvdmVyeTI8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmplcnNleS5jb25maWcuc2VydmVyLnByb3ZpZGVyLnBhY2thZ2VzPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfYXV0b2Rpc2NvdmVyeV8yPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT50ZXN0QXV0b0Rpc2NvdmVyeTI8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWF1dG9kaXNjb3ZlcnktMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfYXV0b2Rpc2NvdmVyeV8yL1ZhbGlkYXRpb25SZXNvdXJjZUlUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtYXV0b2Rpc2NvdmVyeS0yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9hdXRvZGlzY292ZXJ5XzIvVmFsaWRhdGlvblJlc291cmNlSVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ2YWVkYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWF1dG9kaXNjb3ZlcnktMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfYXV0b2Rpc2NvdmVyeV8yL1ZhbGlkYXRpb25SZXNvdXJjZUlUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9hdXRvZGlzY292ZXJ5XzI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIFZhbGlkYXRpb25SZXNvdXJjZUlUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhWYWxpZGF0aW9uUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGlvblBvc2l0aXZlKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoInZhbHVlIiwgdGFyZ2V0KCkucmVxdWVzdCgpLnBvc3QoRW50aXR5LnRleHQoInZhbHVlIikpLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VmFsaWRhdGlvblJlcXVlc3ROZWdhdGl2ZSgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUwMCwgdGFyZ2V0KCkucmVxdWVzdCgpLnBvc3QoRW50aXR5LnRleHQoInwiKSkuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFZhbGlkYXRpb1Jlc3BvbnNlbk5lZ2F0aXZlKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoNDAwLCB0YXJnZXQoKS5yZXF1ZXN0KCkucG9zdChudWxsKS5nZXRTdGF0dXMoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtZmlsdGVyL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1maWx0ZXIvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDQxNmRiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtZmlsdGVyL3BvbS54bWwKQEAgLTAsMCArMSw2NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtMi41LWZpbHRlcjwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1zZXJ2bGV0LTIuNS1maWx0ZXI8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+U2VydmxldCBpbnRlZ3JhdGlvbiB0ZXN0IC0gc2VydmxldC0yLjUtZmlsdGVyPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldC1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWZpbHRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMl81X2ZpbHRlci9NeVJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1maWx0ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzJfNV9maWx0ZXIvTXlSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMGE4MDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1maWx0ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzJfNV9maWx0ZXIvTXlSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yXzVfZmlsdGVyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CisKKy8qKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgibXlyZXNvdXJjZSIpCitwdWJsaWMgY2xhc3MgTXlSZXNvdXJjZSB7CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgcmV0dXJuICJPSyI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtZmlsdGVyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1maWx0ZXIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjhhZWZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtZmlsdGVyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwzNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIyLjUiIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzJfNS54c2QiPgorICAgIDxmaWx0ZXI+CisgICAgICAgIDxmaWx0ZXItbmFtZT5KZXJzZXkgV2ViIEFwcGxpY2F0aW9uPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPGZpbHRlci1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L2ZpbHRlci1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qZXJzZXkuY29uZmlnLnNlcnZlci5wcm92aWRlci5wYWNrYWdlczwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzJfNV9maWx0ZXI8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amVyc2V5LmNvbmZpZy5zZXJ2bGV0LmZpbHRlci5jb250ZXh0UGF0aDwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT4vbXlhcHAvPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgIDwvZmlsdGVyPgorICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPkplcnNleSBXZWIgQXBwbGljYXRpb248L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L215YXBwLyo8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1maWx0ZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzJfNV9maWx0ZXIvTXlSZXNvdXJjZUlUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtZmlsdGVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yXzVfZmlsdGVyL015UmVzb3VyY2VJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjRhMDFjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtZmlsdGVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yXzVfZmlsdGVyL015UmVzb3VyY2VJVENhc2UuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMl81X2ZpbHRlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBNeVJlc291cmNlSVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByYyA9IG5ldyBSZXNvdXJjZUNvbmZpZygpOworICAgICAgICByZXR1cm4gcmMucGFja2FnZXMoTXlSZXNvdXJjZUlUQ2FzZS5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE15UmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJteWFwcCIpLnBhdGgoIm15cmVzb3VyY2UiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJPSyIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0V2FkbCgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJteWFwcC9hcHBsaWNhdGlvbi53YWRsIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydFRydWUocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLnN0YXJ0c1dpdGgoIjw/eG1sIHZlcnNpb249XCIxLjBcIiIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbmZsZWN0b3ItMS9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5mbGVjdG9yLTEvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWY5NjhjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5mbGVjdG9yLTEvcG9tLnhtbApAQCAtMCwwICsxLDczIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+c2VydmxldC0yLjUtaW5mbGVjdG9yLTE8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tc2VydmxldC0yLjUtaW5mbGVjdG9yLTE8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIFNlcnZsZXQgaW50ZWdyYXRpb24gdGVzdCAtIHNlcnZsZXQtMi41LWluZmxlY3Rvci0xIC0gQ2hlY2sgdGhhdCBpbmZsZWN0b3JzIGluIHByb2dyYW1tYXRpY2FsbHkgY3JlYXRlZCByZXNvdXJjZXMgYXJlCisgICAgICAgIHByb3Blcmx5IGluamVjdGVkLgorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7c2VydmxldDIudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbmZsZWN0b3ItMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5mbGVjdG9yXzEvTXlBcHBsaWNhdGlvbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5mbGVjdG9yLTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luZmxlY3Rvcl8xL015QXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzlkNWVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5mbGVjdG9yLTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luZmxlY3Rvcl8xL015QXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfaW5mbGVjdG9yXzE7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm1vZGVsLlJlc291cmNlOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgTXlBcHBsaWNhdGlvbiBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKworICAgIHB1YmxpYyBNeUFwcGxpY2F0aW9uKCkgeworICAgICAgICBmaW5hbCBSZXNvdXJjZS5CdWlsZGVyIHJlc291cmNlQnVpbGRlciA9IFJlc291cmNlLmJ1aWxkZXIoInJlc291cmNlIik7CisKKyAgICAgICAgcmVzb3VyY2VCdWlsZGVyLmFkZENoaWxkUmVzb3VyY2UoImNsYXNzIikKKyAgICAgICAgICAgICAgICAuYWRkTWV0aG9kKCJHRVQiKQorICAgICAgICAgICAgICAgIC5oYW5kbGVkQnkoTXlJbmZsZWN0b3IuY2xhc3MpOworICAgICAgICByZXNvdXJjZUJ1aWxkZXIuYWRkQ2hpbGRSZXNvdXJjZSgiaW5zdGFuY2UiKQorICAgICAgICAgICAgICAgIC5hZGRNZXRob2QoIkdFVCIpCisgICAgICAgICAgICAgICAgLmhhbmRsZWRCeShuZXcgTXlJbmZsZWN0b3IoKSk7CisKKyAgICAgICAgcmVnaXN0ZXJSZXNvdXJjZXMocmVzb3VyY2VCdWlsZGVyLmJ1aWxkKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluZmxlY3Rvci0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbmZsZWN0b3JfMS9NeUluZmxlY3Rvci5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5mbGVjdG9yLTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luZmxlY3Rvcl8xL015SW5mbGVjdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRjOWEzYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluZmxlY3Rvci0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbmZsZWN0b3JfMS9NeUluZmxlY3Rvci5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9pbmZsZWN0b3JfMTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuSW5mbGVjdG9yOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgTXlJbmZsZWN0b3IgaW1wbGVtZW50cyBJbmZsZWN0b3I8Q29udGFpbmVyUmVxdWVzdENvbnRleHQsIFJlc3BvbnNlPiB7CisKKyAgICBASW5qZWN0CisgICAgcHJpdmF0ZSBQcm92aWRlcjxIdHRwU2VydmxldFJlcXVlc3Q+IHJlcXVlc3RQcm92aWRlcjsKKyAgICBASW5qZWN0CisgICAgcHJpdmF0ZSBQcm92aWRlcjxIdHRwU2VydmxldFJlc3BvbnNlPiByZXNwb25zZVByb3ZpZGVyOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc3BvbnNlIGFwcGx5KGZpbmFsIENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB7CisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKyAgICAgICAgLy8gUmVxdWVzdCBwcm92aWRlciAmIHJlcXVlc3QuCisgICAgICAgIGlmIChyZXF1ZXN0UHJvdmlkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgc3RyaW5nQnVpbGRlci5hcHBlbmQoInJlcXVlc3RQcm92aWRlcl8iKTsKKyAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIuYXBwZW5kKHJlcXVlc3RQcm92aWRlci5nZXQoKSAhPSBudWxsID8gInJlcXVlc3QiIDogbnVsbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZCgibnVsbF9udWxsIik7CisgICAgICAgIH0KKworICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZCgnXycpOworCisgICAgICAgIC8vIFJlc3BvbnNlIHByb3ZpZGVyICYgcmVzcG9uc2UuCisgICAgICAgIGlmIChyZXNwb25zZVByb3ZpZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIuYXBwZW5kKCJyZXNwb25zZVByb3ZpZGVyXyIpOworICAgICAgICAgICAgc3RyaW5nQnVpbGRlci5hcHBlbmQocmVzcG9uc2VQcm92aWRlci5nZXQoKSAhPSBudWxsID8gInJlc3BvbnNlIiA6IG51bGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RyaW5nQnVpbGRlci5hcHBlbmQoIm51bGxfbnVsbCIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKHN0cmluZ0J1aWxkZXIudG9TdHJpbmcoKSkuYnVpbGQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbmZsZWN0b3ItMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5mbGVjdG9yLTEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODA2ZmU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5mbGVjdG9yLTEvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDM0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjIuNSIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI+CisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9pbmZsZWN0b3JfMS5NeUFwcGxpY2F0aW9uPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC53cy5ycy5BcHBsaWNhdGlvbjwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X2luZmxlY3Rvcl8xLk15QXBwbGljYXRpb248L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfaW5mbGVjdG9yXzEuTXlBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5mbGVjdG9yLTEvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luZmxlY3Rvcl8xL0luZmxlY3RvckluamVjdGlvblRlc3RJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluZmxlY3Rvci0xL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbmZsZWN0b3JfMS9JbmZsZWN0b3JJbmplY3Rpb25UZXN0SVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNjYjJjYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluZmxlY3Rvci0xL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbmZsZWN0b3JfMS9JbmZsZWN0b3JJbmplY3Rpb25UZXN0SVRDYXNlLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X2luZmxlY3Rvcl8xOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgSW5mbGVjdG9ySW5qZWN0aW9uVGVzdElUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNeUFwcGxpY2F0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbmZsZWN0b3JDbGFzc0luamVjdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdEluZmxlY3RvckluamVjdGlvbigiY2xhc3MiKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbmZsZWN0b3JJbnN0YW5jZUluamVjdGlvbigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBfdGVzdEluZmxlY3RvckluamVjdGlvbigiaW5zdGFuY2UiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3RJbmZsZWN0b3JJbmplY3Rpb24oZmluYWwgU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoInJlc291cmNlIikucGF0aChwYXRoKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoInJlcXVlc3RQcm92aWRlcl9yZXF1ZXN0X3Jlc3BvbnNlUHJvdmlkZXJfcmVzcG9uc2UiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtMS9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC0xL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFkZDdlNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtMS9wb20ueG1sCkBAIC0wLDAgKzEsNzIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LTIuNS1pbml0LTE8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tc2VydmxldC0yLjUtaW5pdC0xPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPlNlcnZsZXQgaW50ZWdyYXRpb24gdGVzdCAtIHNlcnZsZXQtMi41LWluaXQtMSAtIGNvbmZpZ3VyZWQgdmlhIGpheC1ycyBhcHBsaWNhdGlvbjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7c2VydmxldDIudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzEvQ2xpZW50VXNpbmdSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzEvQ2xpZW50VXNpbmdSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3Mjg1NzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfMS9DbGllbnRVc2luZ1Jlc291cmNlLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X2luaXRfMTsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CisKKy8qKgorICogQSByZXNvdXJjZSB0aGF0IGluc3RhbnRpYXRlZCAmIHVzZXMgSkFYLVJTL0plcnNleSBjbGllbnQgdG8gYWNjZXNzIGFub3RoZXIgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoInZpYWNsaWVudCIpCitwdWJsaWMgY2xhc3MgQ2xpZW50VXNpbmdSZXNvdXJjZSB7CisgICAgQFBhdGgoImhlbGxvd29ybGQiKQorICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdldFByb3hpZWRNZXNzYWdlKEBDb250ZXh0IFVyaUluZm8gdXJpSW5mbykgeworICAgICAgICByZXR1cm4gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKQorICAgICAgICAgICAgICAgIC50YXJnZXQodXJpSW5mby5yZXNvbHZlKFVSSS5jcmVhdGUoImhlbGxvd29ybGQiKSkpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoInRleHQvcGxhaW4iKQorICAgICAgICAgICAgICAgIC5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfMS9IZWxsb1dvcmxkUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF8xL0hlbGxvV29ybGRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYjZmNWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfMS9IZWxsb1dvcmxkUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfaW5pdF8xOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworCitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29uZmlnOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuV2ViQ29uZmlnOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworQFBhdGgoImhlbGxvd29ybGQiKQorcHVibGljIGNsYXNzIEhlbGxvV29ybGRSZXNvdXJjZSB7CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgcmV0dXJuICJIZWxsbyBXb3JsZCEgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiaW5qZWN0aW9uIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldEluamVjdGlvbihAQ29udGV4dCBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgQENvbnRleHQgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAQ29udGV4dCBXZWJDb25maWcgd2ViQ29uZmlnLCBAQ29udGV4dCBTZXJ2bGV0Q29uZmlnIHNlcnZsZXRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQENvbnRleHQgU2VydmxldENvbnRleHQgc2VydmxldENvbnRleHQpIHsKKyAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0TWV0aG9kKCkgKyAocmVzcG9uc2UgIT0gbnVsbCkgKyB3ZWJDb25maWcuZ2V0TmFtZSgpICsgc2VydmxldENvbmZpZy5nZXRTZXJ2bGV0TmFtZSgpCisgICAgICAgICAgICAgICAgKyBzZXJ2bGV0Q29udGV4dC5nZXRTZXJ2bGV0Q29udGV4dE5hbWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfMS9NdWx0aXBsZUxpbmtzUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF8xL011bHRpcGxlTGlua3NSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkY2FmZWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfMS9NdWx0aXBsZUxpbmtzUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfaW5pdF8xOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTGluazsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpSW5mbzsKKworLyoqCisgKiBSZXByb2R1Y2VyIGZvciBKRVJTRVktMTgwMS4gU2VlIGFsc28gRTJFIHtAY29kZSBMaW5rVGVzdH0uCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoImxpbmtzIikKK3B1YmxpYyBjbGFzcyBNdWx0aXBsZUxpbmtzUmVzb3VyY2UgeworCisgICAgQEdFVAorICAgIHB1YmxpYyBSZXNwb25zZSBnZXQoQENvbnRleHQgVXJpSW5mbyB1cmlJbmZvKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgVVJJIHRlc3QxID0gVVJJLmNyZWF0ZSh1cmlJbmZvLmdldEFic29sdXRlUGF0aCgpLnRvU3RyaW5nKCkgKyAidGVzdDEiKTsKKyAgICAgICAgVVJJIHRlc3QyID0gVVJJLmNyZWF0ZSh1cmlJbmZvLmdldEFic29sdXRlUGF0aCgpLnRvU3RyaW5nKCkgKyAidGVzdDIiKTsKKworICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soKQorICAgICAgICAgICAgICAgIC5saW5rKCJodHRwOi8vb3JhY2xlLmNvbSIsICJwYXJlbnQiKQorICAgICAgICAgICAgICAgIC5saW5rKG5ldyBVUkkoImh0dHA6Ly9qZXJzZXkuamF2YS5uZXQiKSwgImZyYW1ld29yayIpCisgICAgICAgICAgICAgICAgLmxpbmtzKAorICAgICAgICAgICAgICAgICAgICAgICAgTGluay5mcm9tVXJpKHVyaUluZm8ucmVsYXRpdml6ZSh0ZXN0MSkpLnJlbCgidGVzdDEiKS5idWlsZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgTGluay5mcm9tVXJpKHRlc3QyKS5yZWwoInRlc3QyIikuYnVpbGQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExpbmsuZnJvbVVyaSh1cmlJbmZvLnJlbGF0aXZpemUoVVJJLmNyZWF0ZSgibGlua3MvdGVzdDMiKSkpLnJlbCgidGVzdDMiKS5idWlsZCgpCisgICAgICAgICAgICAgICAgKS5idWlsZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF8xL1NlcnZsZXQyNWluaXQxLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfMS9TZXJ2bGV0MjVpbml0MS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2YWVjNjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfMS9TZXJ2bGV0MjVpbml0MS5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9pbml0XzE7CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLnN0cmVhbS5Db2xsZWN0b3JzOworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uU3RyZWFtOworCitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKKy8qKgorICogSkFYLVJTIGFwcGxpY2F0aW9uIGZvciB0aGUgU2VydmxldCAyLjUgaW5pdGlhbGl6YXRpb24gdGVzdCAjMDEuCisgKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uUGF0aCgiYXBwbGljYXRpb25fcGF0aCIpCitwdWJsaWMgY2xhc3MgU2VydmxldDI1aW5pdDEgZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisgICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQifSkKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICByZXR1cm4gbmV3IEhhc2hTZXQ8PigKKyAgICAgICAgICAgICAgICBBcnJheXMuYXNMaXN0KEhlbGxvV29ybGRSZXNvdXJjZS5jbGFzcywgTXVsdGlwbGVMaW5rc1Jlc291cmNlLmNsYXNzLCBDbGllbnRVc2luZ1Jlc291cmNlLmNsYXNzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzEvVW5yZWFjaGFibGVSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzEvVW5yZWFjaGFibGVSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZTA0MmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfMS9VbnJlYWNoYWJsZVJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X2luaXRfMTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKKy8qKgorICoKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitAUGF0aCgidW5yZWFjaGFibGUiKQorcHVibGljIGNsYXNzIFVucmVhY2hhYmxlUmVzb3VyY2UgeworICAgIEBHRVQKKyAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0KCkgeworICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soKS5idWlsZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC0xL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVhMDc5OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi41IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIj4KKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT50ZXN0U2VydmxldDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LndzLnJzLkFwcGxpY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfaW5pdF8xLlNlcnZsZXQyNWluaXQxPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT50ZXN0U2VydmxldDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9zZXJ2bGV0X3BhdGgvKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTEvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfMS9TZXJ2bGV0MjVJbml0MUlUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC0xL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzEvU2VydmxldDI1SW5pdDFJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWU2OTY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC0xL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzEvU2VydmxldDI1SW5pdDFJVENhc2UuamF2YQpAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X2luaXRfMTsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnVyaS5VcmlUZW1wbGF0ZTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBTZXJ2bGV0IDIuNSBpbml0aWFsaXphdGlvbiB0ZXN0ICMwMS4KKyAqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK3B1YmxpYyBjbGFzcyBTZXJ2bGV0MjVJbml0MUlUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTZXJ2bGV0MjVpbml0MSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVsbG9Xb3JsZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgcyA9IHRhcmdldCgpLnBhdGgoInNlcnZsZXRfcGF0aC9oZWxsb3dvcmxkIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkhlbGxvIFdvcmxkISAiICsgdGhpcy5nZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCksIHMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhlbGxvV29ybGRBdFdyb25nUGF0aCgpIHsKKyAgICAgICAgUmVzcG9uc2UgciA9IHRhcmdldCgpLnBhdGgoImFwcGxpY2F0aW9uX3BhdGgvaGVsbG93b3JsZCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICAiUmVxdWVzdCB0byBhcHBsaWNhdGlvbl9wYXRoL2hlbGxvd29ybGQgc2hvdWxkIGhhdmUgZmFpbGVkLCBidXQgZGlkIG5vdC4gVGhhdCBtZWFucyB0d28gYXBwbGljYXRpb25zIGFyZSAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJyZWdpc3RlcmVkLiIsCisgICAgICAgICAgICAgICAgci5nZXRTdGF0dXMoKSA+PSA0MDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhlbGxvV29ybGRWaWFDbGllbnRJblJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBzID0gdGFyZ2V0KCkucGF0aCgic2VydmxldF9wYXRoL3ZpYWNsaWVudC9oZWxsb3dvcmxkIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkhlbGxvIFdvcmxkISAiICsgdGhpcy5nZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCksIHMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFVucmVhY2hhYmxlUmVzb3VyY2UoKSB7CisgICAgICAgIFJlc3BvbnNlIHIgPSB0YXJnZXQoKS5wYXRoKCJzZXJ2bGV0X3BhdGgvdW5yZWFjaGFibGUiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRydWUoIk1hbmFnZWQgdG8gcmVhY2ggYSByZXNvdXJjZSB0aGF0IGlzIG5vdCByZWdpc3RlcmVkIGluIHRoZSBhcHBsaWNhdGlvbi4iLCByLmdldFN0YXR1cygpID49IDQwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5yZWFjaGFibGVSZXNvdXJjZUF0V3JvbmdQYXRoKCkgeworICAgICAgICBSZXNwb25zZSByID0gdGFyZ2V0KCkucGF0aCgiYXBwbGljYXRpb25fcGF0aC91bnJlYWNoYWJsZSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiTWFuYWdlZCB0byByZWFjaCBhIHJlc291cmNlIHRoYXQgaXMgbm90IHJlZ2lzdGVyZWQgaW4gdGhlIGFwcGxpY2F0aW9uLiIsIHIuZ2V0U3RhdHVzKCkgPj0gNDAwKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbmplY3Rpb24oKSB7CisgICAgICAgIFN0cmluZyBzID0gdGFyZ2V0KCkucGF0aCgic2VydmxldF9wYXRoL2hlbGxvd29ybGQvaW5qZWN0aW9uIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkdFVHRydWV0ZXN0U2VydmxldDF0ZXN0U2VydmxldDEvIiwgcyk7CisgICAgfQorCisgICAgLy8gUmVwcm9kdWNlciBmb3IgSkVSU0VZLTE4MDEKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIG11bHRpcGxlTGlua3NUZXN0KCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gdGFyZ2V0KCIvc2VydmxldF9wYXRoL2xpbmtzLyIpOworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGVxdWFsVG8oMjAwKSk7CisKKyAgICAgICAgZmluYWwgVVJJIHRhcmdldFVyaSA9IHRhcmdldC5nZXRVcmkoKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRMaW5rKCJwYXJlbnQiKS5nZXRVcmkoKSwgZXF1YWxUbyhVUkkuY3JlYXRlKCJodHRwOi8vb3JhY2xlLmNvbSIpKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0TGluaygiZnJhbWV3b3JrIikuZ2V0VXJpKCksIGVxdWFsVG8oVVJJLmNyZWF0ZSgiaHR0cDovL2plcnNleS5qYXZhLm5ldCIpKSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRMaW5rKCJ0ZXN0MSIpLmdldFVyaSgpLCBlcXVhbFRvKFVyaVRlbXBsYXRlLnJlc29sdmUodGFyZ2V0VXJpLCAidGVzdDEiKSkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLmdldExpbmsoInRlc3QyIikuZ2V0VXJpKCksIGVxdWFsVG8oVXJpVGVtcGxhdGUucmVzb2x2ZSh0YXJnZXRVcmksICJ0ZXN0MiIpKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0TGluaygidGVzdDMiKS5nZXRVcmkoKSwgZXF1YWxUbyhVcmlUZW1wbGF0ZS5yZXNvbHZlKHRhcmdldFVyaSwgInRlc3QzIikpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtMi9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC0yL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA2OWVmZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtMi9wb20ueG1sCkBAIC0wLDAgKzEsNjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LTIuNS1pbml0LTI8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tc2VydmxldC0yLjUtaW5pdC0yPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPlNlcnZsZXQgaW50ZWdyYXRpb24gdGVzdCAtIHNlcnZsZXQtMi41LWluaXQtMiAtIGNvbmZpZ3VyZWQgdXNpbmcgcGFja2FnZSBzY2FubmluZzwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF8yL0N1c3RvbUZlYXR1cmUuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF8yL0N1c3RvbUZlYXR1cmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjk5NzU4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzIvQ3VzdG9tRmVhdHVyZS5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9pbml0XzI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X2luaXRfMi5leHQuRXh0MVdyaXRlckludGVyY2VwdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfaW5pdF8yLmV4dC5FeHQyV3JpdGVySW50ZXJjZXB0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9pbml0XzIuZXh0LkV4dDNXcml0ZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X2luaXRfMi5leHQuRXh0NFdyaXRlckludGVyY2VwdG9yOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUHJvdmlkZXIKK3B1YmxpYyBjbGFzcyBDdXN0b21GZWF0dXJlIGltcGxlbWVudHMgRmVhdHVyZSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmUoZmluYWwgRmVhdHVyZUNvbnRleHQgY29udGV4dCkgeworICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKEV4dDNXcml0ZXJJbnRlcmNlcHRvci5jbGFzcywgMTAwMCk7CisgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoRXh0MldyaXRlckludGVyY2VwdG9yLmNsYXNzLCAxMDApOworICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKEV4dDFXcml0ZXJJbnRlcmNlcHRvci5JTlNUQU5DRSwgNTAwKTsKKyAgICAgICAgY29udGV4dC5yZWdpc3RlcihFeHQ0V3JpdGVySW50ZXJjZXB0b3IuSU5TVEFOQ0UsIDEpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfMi9IZWxsb1dvcmxkUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF8yL0hlbGxvV29ybGRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NjdjZDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfMi9IZWxsb1dvcmxkUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfaW5pdF8yOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CisKKy8qKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoImhlbGxvd29ybGQiKQorcHVibGljIGNsYXNzIEhlbGxvV29ybGRSZXNvdXJjZSB7CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgcmV0dXJuICJIZWxsbyBXb3JsZCEgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF8yL2V4dC9FeHQxV3JpdGVySW50ZXJjZXB0b3IuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF8yL2V4dC9FeHQxV3JpdGVySW50ZXJjZXB0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmY4ZTUzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzIvZXh0L0V4dDFXcml0ZXJJbnRlcmNlcHRvci5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9pbml0XzIuZXh0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yQ29udGV4dDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFByb3ZpZGVyCitwdWJsaWMgY2xhc3MgRXh0MVdyaXRlckludGVyY2VwdG9yIGltcGxlbWVudHMgV3JpdGVySW50ZXJjZXB0b3IgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFeHQxV3JpdGVySW50ZXJjZXB0b3IgSU5TVEFOQ0UgPSBuZXcgRXh0MVdyaXRlckludGVyY2VwdG9yKCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhcm91bmRXcml0ZVRvKGZpbmFsIFdyaXRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgY29udGV4dC5zZXRFbnRpdHkoY29udGV4dC5nZXRFbnRpdHkoKSArICItZXh0MSIpOworICAgICAgICBjb250ZXh0LnByb2NlZWQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfMi9leHQvRXh0MldyaXRlckludGVyY2VwdG9yLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfMi9leHQvRXh0MldyaXRlckludGVyY2VwdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBlZWJmZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF8yL2V4dC9FeHQyV3JpdGVySW50ZXJjZXB0b3IuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfaW5pdF8yLmV4dDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvckNvbnRleHQ7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BQcm92aWRlcgorcHVibGljIGNsYXNzIEV4dDJXcml0ZXJJbnRlcmNlcHRvciBpbXBsZW1lbnRzIFdyaXRlckludGVyY2VwdG9yIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFyb3VuZFdyaXRlVG8oZmluYWwgV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICBjb250ZXh0LnNldEVudGl0eShjb250ZXh0LmdldEVudGl0eSgpICsgIi1leHQyIik7CisgICAgICAgIGNvbnRleHQucHJvY2VlZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF8yL2V4dC9FeHQzV3JpdGVySW50ZXJjZXB0b3IuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF8yL2V4dC9FeHQzV3JpdGVySW50ZXJjZXB0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODVmMTUxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzIvZXh0L0V4dDNXcml0ZXJJbnRlcmNlcHRvci5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9pbml0XzIuZXh0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yQ29udGV4dDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFByb3ZpZGVyCitwdWJsaWMgY2xhc3MgRXh0M1dyaXRlckludGVyY2VwdG9yIGltcGxlbWVudHMgV3JpdGVySW50ZXJjZXB0b3IgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYXJvdW5kV3JpdGVUbyhmaW5hbCBXcml0ZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGNvbnRleHQuc2V0RW50aXR5KGNvbnRleHQuZ2V0RW50aXR5KCkgKyAiLWV4dDMiKTsKKyAgICAgICAgY29udGV4dC5wcm9jZWVkKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzIvZXh0L0V4dDRXcml0ZXJJbnRlcmNlcHRvci5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzIvZXh0L0V4dDRXcml0ZXJJbnRlcmNlcHRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MDk4OGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfMi9leHQvRXh0NFdyaXRlckludGVyY2VwdG9yLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X2luaXRfMi5leHQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0OworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUHJvdmlkZXIKK3B1YmxpYyBjbGFzcyBFeHQ0V3JpdGVySW50ZXJjZXB0b3IgaW1wbGVtZW50cyBXcml0ZXJJbnRlcmNlcHRvciB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEV4dDRXcml0ZXJJbnRlcmNlcHRvciBJTlNUQU5DRSA9IG5ldyBFeHQ0V3JpdGVySW50ZXJjZXB0b3IoKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFyb3VuZFdyaXRlVG8oZmluYWwgV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICBjb250ZXh0LnNldEVudGl0eShjb250ZXh0LmdldEVudGl0eSgpICsgIi1leHQ0Iik7CisgICAgICAgIGNvbnRleHQucHJvY2VlZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC0yL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA2NmM0YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtMi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi41IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIj4KKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT50ZXN0U2VydmxldDI8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmplcnNleS5jb25maWcuc2VydmVyLnByb3ZpZGVyLnBhY2thZ2VzPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfaW5pdF8yPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmplcnNleS5jb25maWcuc2VydmVyLnByb3ZpZGVyLnNjYW5uaW5nLnJlY3Vyc2l2ZTwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5mYWxzZTwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+dGVzdFNlcnZsZXQyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfMi9IZWxsb1dvcmxkUmVzb3VyY2VJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF8yL0hlbGxvV29ybGRSZXNvdXJjZUlUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MDcxYjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfMi9IZWxsb1dvcmxkUmVzb3VyY2VJVENhc2UuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfaW5pdF8yOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEhlbGxvV29ybGRSZXNvdXJjZUlUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhIZWxsb1dvcmxkUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVsbG9Xb3JsZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByID0gdGFyZ2V0KCkucGF0aCgiaGVsbG93b3JsZCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgci5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiSGVsbG8gV29ybGQhICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSArICItZXh0NC1leHQyLWV4dDEtZXh0MyIsCisgICAgICAgICAgICAgICAgci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtMy9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC0zL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI3MWIzZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtMy9wb20ueG1sCkBAIC0wLDAgKzEsNjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LTIuNS1pbml0LTM8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tc2VydmxldC0yLjUtaW5pdC0zPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPlNlcnZsZXQgaW50ZWdyYXRpb24gdGVzdCAtIHNlcnZsZXQtMi41LWluaXQtMyAtIGNvbmZpZ3VyZWQgYnkgZXhwbGljaXRseSBzZXQgcmVzb3VyY2UgY2xhc3NlczwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtMy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF8zL0hlbGxvV29ybGRSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC0zL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzMvSGVsbG9Xb3JsZFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RmOWJiZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtMy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF8zL0hlbGxvV29ybGRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9pbml0XzM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKKworLyoqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiaGVsbG93b3JsZCIpCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZFJlc291cmNlIHsKKworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICByZXR1cm4gIkhlbGxvIFdvcmxkISAiICsgdGhpcy5nZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC0zL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDRjOTk5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC0zL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwzNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIyLjUiIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzJfNS54c2QiPgorICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPnRlc3RTZXJ2bGV0Mzwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amVyc2V5LmNvbmZpZy5zZXJ2ZXIucHJvdmlkZXIuY2xhc3NuYW1lczwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X2luaXRfMy5IZWxsb1dvcmxkUmVzb3VyY2U8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPnRlc3RTZXJ2bGV0Mzwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC0zL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzMvSGVsbG9Xb3JsZFJlc291cmNlSVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfMy9IZWxsb1dvcmxkUmVzb3VyY2VJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYzJjNGZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC0zL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzMvSGVsbG9Xb3JsZFJlc291cmNlSVRDYXNlLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X2luaXRfMzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkUmVzb3VyY2VJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoSGVsbG9Xb3JsZFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhlbGxvV29ybGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHMgPSB0YXJnZXQoKS5wYXRoKCJoZWxsb3dvcmxkIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUcnVlKHMuZXF1YWxzKCJIZWxsbyBXb3JsZCEgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC00L3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTQvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjExOWYwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC00L3BvbS54bWwKQEAgLTAsMCArMSw2NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtMi41LWluaXQtNDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1zZXJ2bGV0LTIuNS1pbml0LTQ8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+U2VydmxldCBpbnRlZ3JhdGlvbiB0ZXN0IC0gc2VydmxldC0yLjUtaW5pdC00IC0gY29uZmlndXJlZCBieSBleHBsaWNpdGx5IHNldCByZXNvdXJjZSBhbmQgcHJvdmlkZXIgY2xhc3MgbmFtZTwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF80L0hlbGxvV29ybGRSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC00L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzQvSGVsbG9Xb3JsZFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJmN2I1YgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF80L0hlbGxvV29ybGRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9pbml0XzQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKKworLyoqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiaGVsbG93b3JsZCIpCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZFJlc291cmNlIHsKKworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBIZWxsbyBnZXQoKSB7CisgICAgICAgIHJldHVybiBuZXcgSGVsbG8oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEhlbGxvIHsKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF80L0hlbGxvV3JpdGVyLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfNC9IZWxsb1dyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MTEzZDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfNC9IZWxsb1dyaXRlci5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9pbml0XzQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKKworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTXVsdGl2YWx1ZWRNYXA7CitpbXBvcnQgamF2YXgud3MucnMuZXh0Lk1lc3NhZ2VCb2R5V3JpdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuTWVzc2FnZVV0aWxzOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQcm92aWRlcgorcHVibGljIGNsYXNzIEhlbGxvV3JpdGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8SGVsbG9Xb3JsZFJlc291cmNlLkhlbGxvPiB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHR5cGUuZXF1YWxzKEhlbGxvV29ybGRSZXNvdXJjZS5IZWxsby5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShmaW5hbCBIZWxsb1dvcmxkUmVzb3VyY2UuSGVsbG8gaGVsbG8sIGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oZmluYWwgSGVsbG9Xb3JsZFJlc291cmNlLkhlbGxvIGhlbGxvLCBmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLCBmaW5hbCBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZSgoIkhlbGxvIFdvcmxkISAiICsgdGhpcy5nZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpCisgICAgICAgICAgICAgICAgLmdldEJ5dGVzKE1lc3NhZ2VVdGlscy5nZXRDaGFyc2V0KG1lZGlhVHlwZSkpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtNC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYjE2OGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDM1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjIuNSIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI+CisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+dGVzdFNlcnZsZXQ0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qZXJzZXkuY29uZmlnLnNlcnZlci5wcm92aWRlci5jbGFzc25hbWVzPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfaW5pdF80LkhlbGxvV29ybGRSZXNvdXJjZTtvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X2luaXRfNC5IZWxsb1dyaXRlcjwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKworICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT50ZXN0U2VydmxldDQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF80L0hlbGxvV29ybGRSZXNvdXJjZUlUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC00L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzQvSGVsbG9Xb3JsZFJlc291cmNlSVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzE2YjVmZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF80L0hlbGxvV29ybGRSZXNvdXJjZUlUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9pbml0XzQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZFJlc291cmNlSVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEhlbGxvV29ybGRSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIZWxsb1dvcmxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBzID0gdGFyZ2V0KCkucGF0aCgiaGVsbG93b3JsZCIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzLmVxdWFscygiSGVsbG8gV29ybGQhICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtNS9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC01L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNlMzVmMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtNS9wb20ueG1sCkBAIC0wLDAgKzEsNjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LTIuNS1pbml0LTU8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tc2VydmxldC0yLjUtaW5pdC01PC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPlNlcnZsZXQgaW50ZWdyYXRpb24gdGVzdCAtIHNlcnZsZXQtMi41LWluaXQtNSAtIGZpbHRlciB3aXRoIHNwZWNpZmllZCBqYXggcnMgYXBwbGljYXRpb24gY2xhc3M8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfNS9IZWxsb1dvcmxkUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtNS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF81L0hlbGxvV29ybGRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MDAzZDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfNS9IZWxsb1dvcmxkUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfaW5pdF81OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CisKKy8qKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoImZpbHRlcl9wYXRoL2hlbGxvd29ybGQiKQorcHVibGljIGNsYXNzIEhlbGxvV29ybGRSZXNvdXJjZSB7CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgcmV0dXJuICJIZWxsbyBXb3JsZCEgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtNS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF81L1NlcnZsZXQyNWluaXQ1LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfNS9TZXJ2bGV0MjVpbml0NS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MmUwNzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfNS9TZXJ2bGV0MjVpbml0NS5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9pbml0XzU7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BBcHBsaWNhdGlvblBhdGgoImFwcGxpY2F0aW9uX3BhdGgiKQorcHVibGljIGNsYXNzIFNlcnZsZXQyNWluaXQ1IGV4dGVuZHMgQXBwbGljYXRpb257CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uKEhlbGxvV29ybGRSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC01L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzUvVW5yZWFjaGFibGVSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC01L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzUvVW5yZWFjaGFibGVSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0ZWVlMzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfNS9VbnJlYWNoYWJsZVJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X2luaXRfNTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKKy8qKgorICoKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitAUGF0aCgiZmlsdGVyX3BhdGgvdW5yZWFjaGFibGUiKQorcHVibGljIGNsYXNzIFVucmVhY2hhYmxlUmVzb3VyY2UgeworICAgIEBHRVQKKyAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0KCkgeworICAgICAgICByZXR1cm4gUmVzcG9uc2Uub2soKS5idWlsZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtNS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC01L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcxMTcwZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtNS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi41IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIj4KKyAgICA8ZmlsdGVyPgorICAgICAgICA8ZmlsdGVyLW5hbWU+dGVzdFNlcnZsZXQ1PC9maWx0ZXItbmFtZT4KKyAgICAgICAgPGZpbHRlci1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L2ZpbHRlci1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC53cy5ycy5BcHBsaWNhdGlvbjwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X2luaXRfNS5TZXJ2bGV0MjVpbml0NTwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICA8L2ZpbHRlcj4KKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT50ZXN0U2VydmxldDU8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L2ZpbHRlcl9wYXRoLyo8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfNS9IZWxsb1dvcmxkUmVzb3VyY2VJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtNS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF81L0hlbGxvV29ybGRSZXNvdXJjZUlUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MTQxMmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfNS9IZWxsb1dvcmxkUmVzb3VyY2VJVENhc2UuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfaW5pdF81OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuSWdub3JlOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkUmVzb3VyY2VJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoSGVsbG9Xb3JsZFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhlbGxvV29ybGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHMgPSB0YXJnZXQoKS5wYXRoKCJmaWx0ZXJfcGF0aC9oZWxsb3dvcmxkIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkhlbGxvIFdvcmxkISAiICsgdGhpcy5nZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCksIHMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhlbGxvV29ybGRBdFdyb25nUGF0aCgpIHsKKyAgICAgICAgUmVzcG9uc2UgciA9IHRhcmdldCgpLnBhdGgoImFwcGxpY2F0aW9uX3BhdGgvZmlsdGVyX3BhdGgvaGVsbG93b3JsZCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgKKyAgICAgICAgICAgICAgICAiUmVxdWVzdCB0byBhcHBsaWNhdGlvbl9wYXRoL2hlbGxvd29ybGQgc2hvdWxkIGhhdmUgZmFpbGVkLCBidXQgZGlkIG5vdC4gVGhhdCBtZWFucyB0d28gYXBwbGljYXRpb25zIGFyZSAiCisgICAgICAgICAgICAgICAgICAgICAgICArICJyZWdpc3RlcmVkLiIsCisgICAgICAgICAgICAgICAgci5nZXRTdGF0dXMoKSA+PSA0MDApOworICAgIH0KKworICAgIEBUZXN0CisgICAgQElnbm9yZQorICAgIHB1YmxpYyB2b2lkIHRlc3RVbnJlYWNoYWJsZVJlc291cmNlKCkgeworICAgICAgICBSZXNwb25zZSByID0gdGFyZ2V0KCkucGF0aCgiZmlsdGVyX3BhdGgvdW5yZWFjaGFibGUiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydFRydWUoIk1hbmFnZWQgdG8gcmVhY2ggYSByZXNvdXJjZSB0aGF0IGlzIG5vdCByZWdpc3RlcmVkIGluIHRoZSBhcHBsaWNhdGlvbi4iLCByLmdldFN0YXR1cygpID49IDQwMCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VW5yZWFjaGFibGVSZXNvdXJjZUF0V3JvbmdQYXRoKCkgeworICAgICAgICBSZXNwb25zZSByID0gdGFyZ2V0KCkucGF0aCgiYXBwbGljYXRpb25fcGF0aC9maWx0ZXJfcGF0aC91bnJlYWNoYWJsZSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiTWFuYWdlZCB0byByZWFjaCBhIHJlc291cmNlIHRoYXQgaXMgbm90IHJlZ2lzdGVyZWQgaW4gdGhlIGFwcGxpY2F0aW9uLiIsIHIuZ2V0U3RhdHVzKCkgPj0gNDAwKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTYvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtNi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhODk3NTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTYvcG9tLnhtbApAQCAtMCwwICsxLDY1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+c2VydmxldC0yLjUtaW5pdC02PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLXNlcnZsZXQtMi41LWluaXQtNjwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5TZXJ2bGV0IGludGVncmF0aW9uIHRlc3QgLSBzZXJ2bGV0LTIuNS1pbml0LTYgLSBmaWx0ZXIgLSBjb25maWd1cmVkIHVzaW5nIHBhY2thZ2Ugc2Nhbm5pbmc8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfNi9IZWxsb1dvcmxkUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtNi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF82L0hlbGxvV29ybGRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNWM2ZTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfNi9IZWxsb1dvcmxkUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfaW5pdF82OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CisKKy8qKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoImhlbGxvd29ybGQiKQorcHVibGljIGNsYXNzIEhlbGxvV29ybGRSZXNvdXJjZSB7CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgcmV0dXJuICJIZWxsbyBXb3JsZCEgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtNi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC02L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY0ZTg0ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtNi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi41IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIj4KKyAgICA8ZmlsdGVyPgorICAgICAgICA8ZmlsdGVyLW5hbWU+dGVzdFNlcnZsZXQ2PC9maWx0ZXItbmFtZT4KKyAgICAgICAgPGZpbHRlci1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L2ZpbHRlci1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qZXJzZXkuY29uZmlnLnNlcnZlci5wcm92aWRlci5wYWNrYWdlczwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X2luaXRfNjwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICA8L2ZpbHRlcj4KKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT50ZXN0U2VydmxldDY8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTYvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfNi9IZWxsb1dvcmxkUmVzb3VyY2VJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtNi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF82L0hlbGxvV29ybGRSZXNvdXJjZUlUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxMDA2M2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTYvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfNi9IZWxsb1dvcmxkUmVzb3VyY2VJVENhc2UuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfaW5pdF82OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEhlbGxvV29ybGRSZXNvdXJjZUlUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhIZWxsb1dvcmxkUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVsbG9Xb3JsZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgcyA9IHRhcmdldCgpLnBhdGgoImhlbGxvd29ybGQiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRydWUocy5lcXVhbHMoIkhlbGxvIFdvcmxkISAiICsgdGhpcy5nZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTcvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtNy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMWVmZTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTcvcG9tLnhtbApAQCAtMCwwICsxLDY1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+c2VydmxldC0yLjUtaW5pdC03PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLXNlcnZsZXQtMi41LWluaXQtNzwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5TZXJ2bGV0IGludGVncmF0aW9uIHRlc3QgLSBzZXJ2bGV0LTIuNS1pbml0LTcgLSBmaWx0ZXIgLSBjb25maWd1cmVkIGJ5IGV4cGxpY2l0bHkgc2V0IHJlc291cmNlIGNsYXNzZXM8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfNy9IZWxsb1dvcmxkUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtNy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF83L0hlbGxvV29ybGRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiOTI0ZDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfNy9IZWxsb1dvcmxkUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfaW5pdF83OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CisKKy8qKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoImhlbGxvd29ybGQiKQorcHVibGljIGNsYXNzIEhlbGxvV29ybGRSZXNvdXJjZSB7CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgcmV0dXJuICJIZWxsbyBXb3JsZCEgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtNy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC03L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODU5ZDUwNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtNy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi41IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIj4KKyAgICA8ZmlsdGVyPgorICAgICAgICA8ZmlsdGVyLW5hbWU+dGVzdFNlcnZsZXQ3PC9maWx0ZXItbmFtZT4KKyAgICAgICAgPGZpbHRlci1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L2ZpbHRlci1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qZXJzZXkuY29uZmlnLnNlcnZlci5wcm92aWRlci5jbGFzc25hbWVzPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfaW5pdF83LkhlbGxvV29ybGRSZXNvdXJjZTwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICA8L2ZpbHRlcj4KKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT50ZXN0U2VydmxldDc8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfNy9IZWxsb1dvcmxkUmVzb3VyY2VJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtNy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF83L0hlbGxvV29ybGRSZXNvdXJjZUlUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZWRmNzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfNy9IZWxsb1dvcmxkUmVzb3VyY2VJVENhc2UuamF2YQpAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfaW5pdF83OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEhlbGxvV29ybGRSZXNvdXJjZUlUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhIZWxsb1dvcmxkUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVsbG9Xb3JsZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgcyA9IHRhcmdldCgpLnBhdGgoImhlbGxvd29ybGQiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRydWUocy5lcXVhbHMoIkhlbGxvIFdvcmxkISAiICsgdGhpcy5nZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTgvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtOC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiOTE2Y2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTgvcG9tLnhtbApAQCAtMCwwICsxLDY1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+c2VydmxldC0yLjUtaW5pdC04PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLXNlcnZsZXQtMi41LWluaXQtODwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5TZXJ2bGV0IGludGVncmF0aW9uIHRlc3QgLSBzZXJ2bGV0LTIuNS1pbml0LTggLSBmaWx0ZXIgLSBjb25maWd1cmVkIGJ5IGV4cGxpY2l0bHkgc2V0IHJlc291cmNlIGFuZCBwcm92aWRlciBjbGFzcyBuYW1lPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldC1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC04L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzgvSGVsbG9Xb3JsZFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfOC9IZWxsb1dvcmxkUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjM5MTdkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC04L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzgvSGVsbG9Xb3JsZFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X2luaXRfODsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJoZWxsb3dvcmxkIikKK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkUmVzb3VyY2UgeworCisgICAgQEdFVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIEhlbGxvIGdldCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBIZWxsbygpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSGVsbG8geworCisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC04L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzgvSGVsbG9Xcml0ZXIuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtOC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF84L0hlbGxvV3JpdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJkY2I2ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtOC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfaW5pdF84L0hlbGxvV3JpdGVyLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X2luaXRfODsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworCitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuTWVzc2FnZVV0aWxzOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQcm92aWRlcgorcHVibGljIGNsYXNzIEhlbGxvV3JpdGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8SGVsbG9Xb3JsZFJlc291cmNlLkhlbGxvPiB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHR5cGUuZXF1YWxzKEhlbGxvV29ybGRSZXNvdXJjZS5IZWxsby5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShmaW5hbCBIZWxsb1dvcmxkUmVzb3VyY2UuSGVsbG8gaGVsbG8sIGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oZmluYWwgSGVsbG9Xb3JsZFJlc291cmNlLkhlbGxvIGhlbGxvLCBmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLCBmaW5hbCBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZSgoIkhlbGxvIFdvcmxkISAiICsgdGhpcy5nZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpCisgICAgICAgICAgICAgICAgLmdldEJ5dGVzKE1lc3NhZ2VVdGlscy5nZXRDaGFyc2V0KG1lZGlhVHlwZSkpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTgvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LWluaXQtOC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYWE2ZDMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTgvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDMzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjIuNSIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI+CisgICAgPGZpbHRlcj4KKyAgICAgICAgPGZpbHRlci1uYW1lPnRlc3RTZXJ2bGV0ODwvZmlsdGVyLW5hbWU+CisgICAgICAgIDxmaWx0ZXItY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9maWx0ZXItY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amVyc2V5LmNvbmZpZy5zZXJ2ZXIucHJvdmlkZXIuY2xhc3NuYW1lczwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X2luaXRfOC5IZWxsb1dvcmxkUmVzb3VyY2U7b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9pbml0XzguSGVsbG9Xcml0ZXI8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgPC9maWx0ZXI+CisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+dGVzdFNlcnZsZXQ4PC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC04L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzgvSGVsbG9Xb3JsZFJlc291cmNlSVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1pbml0LTgvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2luaXRfOC9IZWxsb1dvcmxkUmVzb3VyY2VJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTMwNGJhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtaW5pdC04L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9pbml0XzgvSGVsbG9Xb3JsZFJlc291cmNlSVRDYXNlLmphdmEKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X2luaXRfODsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkUmVzb3VyY2VJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoSGVsbG9Xb3JsZFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhlbGxvV29ybGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIHMgPSB0YXJnZXQoKS5wYXRoKCJoZWxsb3dvcmxkIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUcnVlKHMuZXF1YWxzKCJIZWxsbyBXb3JsZCEgIiArIHRoaXMuZ2V0Q2xhc3MoKS5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTEvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0xL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQyMzgwNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0xL3BvbS54bWwKQEAgLTAsMCArMSw3OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtMi41LW12Yy0xPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLXNlcnZsZXQtMi41LW12Yy0xPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPlNlcnZsZXQgaW50ZWdyYXRpb24gdGVzdCAtIHNlcnZsZXQtMi41LW12Yy0xIC0gZmlsdGVyIC0gTVZDPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldC1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW12YzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tdmMtanNwPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3NlcnZsZXQyLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18xL015QXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMS9NeUFwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTczZjNjZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMS9NeUFwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X212Y18xOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5qc3AuSnNwTXZjRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X212Y18xLnJlc291cmNlLkJvb2tzdG9yZTsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIE15QXBwbGljYXRpb24gZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisKKyAgICBwdWJsaWMgTXlBcHBsaWNhdGlvbigpIHsKKyAgICAgICAgLy8gUmVzb3VyY2VzLgorICAgICAgICBwYWNrYWdlcyhCb29rc3RvcmUuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7CisKKyAgICAgICAgLy8gTVZDLgorICAgICAgICByZWdpc3RlcihKc3BNdmNGZWF0dXJlLmNsYXNzKTsKKworICAgICAgICAvLyBMb2dnaW5nLgorICAgICAgICByZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18xL3Jlc291cmNlL0Jvb2suamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMS9yZXNvdXJjZS9Cb29rLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQwMTc1NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMS9yZXNvdXJjZS9Cb29rLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X212Y18xLnJlc291cmNlOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKK0BYbWxSb290RWxlbWVudAorQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQorcHVibGljIGNsYXNzIEJvb2sgZXh0ZW5kcyBJdGVtIHsKKworICAgIHB1YmxpYyBCb29rKCkgeworICAgIH0KKworICAgIHB1YmxpYyBCb29rKGZpbmFsIFN0cmluZyB0aXRsZSwgZmluYWwgU3RyaW5nIGF1dGhvcikgeworICAgICAgICBzdXBlcih0aXRsZSwgYXV0aG9yKTsKKyAgICB9CisKKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18xL3Jlc291cmNlL0Jvb2tzdG9yZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18xL3Jlc291cmNlL0Jvb2tzdG9yZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NmI3YjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzEvcmVzb3VyY2UvQm9va3N0b3JlLmphdmEKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X212Y18xLnJlc291cmNlOworCitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5Ob3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuVGVtcGxhdGU7CisKK0BQYXRoKCIvIikKK0BTaW5nbGV0b24KK0BUZW1wbGF0ZQorQFByb2R1Y2VzKCJ0ZXh0L2h0bWwiKQorQFhtbFJvb3RFbGVtZW50CitAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCitwdWJsaWMgY2xhc3MgQm9va3N0b3JlIHsKKworICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgSXRlbT4gaXRlbXMgPSBuZXcgVHJlZU1hcDxTdHJpbmcsIEl0ZW0+KCk7CisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgIHB1YmxpYyBCb29rc3RvcmUoKSB7CisgICAgICAgIHNldE5hbWUoIkN6ZWNoIEJvb2tzdG9yZSIpOworICAgICAgICBnZXRJdGVtcygpLnB1dCgiMSIsIG5ldyBCb29rKCJTdmVqayIsICJKYXJvc2xhdiBIYXNlayIpKTsKKyAgICAgICAgZ2V0SXRlbXMoKS5wdXQoIjIiLCBuZXcgQm9vaygiS3Jha2F0aXQiLCAiS2FyZWwgQ2FwZWsiKSk7CisgICAgfQorCisgICAgQFBhdGgoIml0ZW1zL3tpdGVtaWR9LyIpCisgICAgcHVibGljIEl0ZW0gZ2V0SXRlbShAUGF0aFBhcmFtKCJpdGVtaWQiKSBTdHJpbmcgaXRlbWlkKSB7CisgICAgICAgIEl0ZW0gaSA9IGdldEl0ZW1zKCkuZ2V0KGl0ZW1pZCk7CisgICAgICAgIGlmIChpID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihSZXNwb25zZQorICAgICAgICAgICAgICAgICAgICAuc3RhdHVzKFJlc3BvbnNlLlN0YXR1cy5OT1RfRk9VTkQpCisgICAgICAgICAgICAgICAgICAgIC5lbnRpdHkoIkl0ZW0sICIgKyBpdGVtaWQgKyAiLCBpcyBub3QgZm91bmQiKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gaTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKHtNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MLCBNZWRpYVR5cGUuVEVYVF9YTUwsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OfSkKKyAgICBwdWJsaWMgQm9va3N0b3JlIGdldFhtbCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIE1hcDxTdHJpbmcsIEl0ZW0+IGdldEl0ZW1zKCkgeworICAgICAgICByZXR1cm4gaXRlbXM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18xL3Jlc291cmNlL0l0ZW0uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMS9yZXNvdXJjZS9JdGVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEwMWI0MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMS9yZXNvdXJjZS9JdGVtLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X212Y18xLnJlc291cmNlOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLlRlbXBsYXRlOworCitAVGVtcGxhdGUKK0BQcm9kdWNlcygidGV4dC9odG1sIikKK0BYbWxSb290RWxlbWVudAorQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQorcHVibGljIGNsYXNzIEl0ZW0geworCisgICAgcHJpdmF0ZSBTdHJpbmcgdGl0bGU7CisgICAgcHJpdmF0ZSBTdHJpbmcgYXV0aG9yOworCisgICAgcHVibGljIEl0ZW0oKSB7CisgICAgfQorCisgICAgcHVibGljIEl0ZW0oZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgYXV0aG9yKSB7CisgICAgICAgIHRoaXMudGl0bGUgPSB0aXRsZTsKKyAgICAgICAgdGhpcy5hdXRob3IgPSBhdXRob3I7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUaXRsZSgpIHsKKyAgICAgICAgcmV0dXJuIHRpdGxlOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXV0aG9yKCkgeworICAgICAgICByZXR1cm4gYXV0aG9yOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoe01lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUwsIE1lZGlhVHlwZS5URVhUX1hNTCwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT059KQorICAgIHB1YmxpYyBJdGVtIGdldFhtbCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuICJJdGVteyIKKyAgICAgICAgICAgICAgICArICJ0aXRsZT0nIiArIHRpdGxlICsgJ1wnJworICAgICAgICAgICAgICAgICsgIiwgYXV0aG9yPSciICsgYXV0aG9yICsgJ1wnJworICAgICAgICAgICAgICAgICsgJ30nOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0xL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2OTI4MDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi41IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIj4KKyAgICA8ZmlsdGVyPgorICAgICAgICA8ZmlsdGVyLW5hbWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9tdmNfMS5NeUFwcGxpY2F0aW9uPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPGZpbHRlci1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L2ZpbHRlci1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC53cy5ycy5BcHBsaWNhdGlvbjwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X212Y18xLk15QXBwbGljYXRpb248L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDwhLS0gcGFzcyB0byBuZXh0IGZpbHRlciBpZiBKZXJzZXkvQXBwIHJldHVybnMgNDA0IC0tPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmplcnNleS5jb25maWcuc2VydmxldC5maWx0ZXIuZm9yd2FyZE9uNDA0PC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgPC9maWx0ZXI+CisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9tdmNfMS5NeUFwcGxpY2F0aW9uPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTEvc3JjL21haW4vd2ViYXBwL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzEvcmVzb3VyY2UvQm9vay9pbmRleC5qc3AgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMS9zcmMvbWFpbi93ZWJhcHAvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMS9yZXNvdXJjZS9Cb29rL2luZGV4LmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmY2MDIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTEvc3JjL21haW4vd2ViYXBwL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzEvcmVzb3VyY2UvQm9vay9pbmRleC5qc3AKQEAgLTAsMCArMSw0NiBAQAorPCUtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0lPgorCis8JUBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWwiJT4KKzwlQHBhZ2UgcGFnZUVuY29kaW5nPSJVVEYtOCIlPgorPCUtLQorVGhlIHRhZ2xpYiBkaXJlY3RpdmUgYmVsb3cgaW1wb3J0cyB0aGUgSlNUTCBsaWJyYXJ5LiBJZiB5b3UgdW5jb21tZW50IGl0LAoreW91IG11c3QgYWxzbyBhZGQgdGhlIEpTVEwgbGlicmFyeSB0byB0aGUgcHJvamVjdC4gVGhlIEFkZCBMaWJyYXJ5Li4uIGFjdGlvbgorb24gTGlicmFyaWVzIG5vZGUgaW4gUHJvamVjdHMgdmlldyBjYW4gYmUgdXNlZCB0byBhZGQgdGhlIEpTVEwgMS4xIGxpYnJhcnkuCistLSU+Cis8JUB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzcC9qc3RsL2NvcmUiIHByZWZpeD0iYyIlPgorPCVAdGFnbGliIHByZWZpeD0icmJ0IiB1cmk9InVybjpvcmc6Z2xhc3NmaXNoOmplcnNleTpzZXJ2bGV0Om12YyIgJT4KKworPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKKyJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorCis8aHRtbD4KKyAgICA8aGVhZD4KKyAgICAgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgorICAgICAgICA8dGl0bGU+Qm9vazwvdGl0bGU+CisgICAgPC9oZWFkPgorICAgIDxib2R5PgorCisgICAgICAgIDxoMT4ke2l0LnRpdGxlfTwvaDE+CisKKyAgICAgICAgQm9vayBmcm9tICR7aXQuYXV0aG9yfQorCisgICAgICAgIDxyYnQ6aW5jbHVkZSBwYWdlPSJmb290ZXIuanNwIi8+CisKKyAgICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMS9zcmMvbWFpbi93ZWJhcHAvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMS9yZXNvdXJjZS9Cb29rc3RvcmUvY291bnQuanNwIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTEvc3JjL21haW4vd2ViYXBwL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzEvcmVzb3VyY2UvQm9va3N0b3JlL2NvdW50LmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmU3NTQyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTEvc3JjL21haW4vd2ViYXBwL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzEvcmVzb3VyY2UvQm9va3N0b3JlL2NvdW50LmpzcApAQCAtMCwwICsxLDI3IEBACis8JS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLSU+CisKKzwlQHRhZ2xpYiBwcmVmaXg9ImZuIiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNwL2pzdGwvZnVuY3Rpb25zIiAlPgorPCUtLQorICBBbiBleGFtcGxlIG9mIGFub3RoZXIgc2lkZSBKU1AuCistLSU+Cis8aHRtbD4KKyAgPGJvZHk+CisgICAjIG9mIGl0ZW1zOiAke2ZuOmxlbmd0aChpdC5pdGVtcyl9IAorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMS9zcmMvbWFpbi93ZWJhcHAvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMS9yZXNvdXJjZS9Cb29rc3RvcmUvaW5kZXguanNwIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTEvc3JjL21haW4vd2ViYXBwL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzEvcmVzb3VyY2UvQm9va3N0b3JlL2luZGV4LmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGRiMjAyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTEvc3JjL21haW4vd2ViYXBwL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzEvcmVzb3VyY2UvQm9va3N0b3JlL2luZGV4LmpzcApAQCAtMCwwICsxLDU2IEBACis8JS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLSU+CisKKzwlQHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbCIlPgorPCVAcGFnZSBwYWdlRW5jb2Rpbmc9IlVURi04IiU+CisKKzwlQHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNwL2pzdGwvY29yZSIgcHJlZml4PSJjIiU+IAorCis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgorICAgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+CisKKzxodG1sPgorICAgIDxoZWFkPgorICAgICAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+CisgICAgICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9InNjcmVlbiI+CisgICAgICAgICAgQGltcG9ydCB1cmwoIDxjOnVybCB2YWx1ZT0iL2Nzcy9zdHlsZS5jc3MiLz4gKTsKKyAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgPHRpdGxlPlJFU1QgQm9va3N0b3JlIFNhbXBsZTwvdGl0bGU+CisgICAgPC9oZWFkPgorICAgIDxib2R5PgorCisgICAgPGgxPiR7aXQubmFtZX08L2gxPgorICAgIAorICAgIDxoMj5JdGVtIExpc3Q8L2gyPgorCisgICAgPHVsPgorICAgICAgICA8Yzpmb3JFYWNoIHZhcj0iaSIgaXRlbXM9IiR7aXQuaXRlbXN9Ij4KKyAgICAgICAgICAgIDxsaT48YSBocmVmPSJpdGVtcy8ke2kua2V5fS8iPiR7aS52YWx1ZS50aXRsZX08L2E+CisgICAgICAgIDwvYzpmb3JFYWNoPgorICAgIDwvdWw+CisgICAgCisgICAgPGgyPk90aGVyczwvaDI+CisgICAgPHA+CisgICAgICA8YSBocmVmPSJjb3VudCI+Y291bnQgaW52ZW50b3J5PC9hPgorICAgIDxwPgorICAgICAgPGEgaHJlZj0idGltZSI+Z2V0IHRoZSBzeXN0ZW0gdGltZTwvYT4KKyAgICA8cD4KKyAgICAgIDxhIGhyZWY9ImpzcC9oZWxwLmpzcCI+cmVndWxhciByZXNvdXJjZXM8L2E+CisgICAgPC9wPiAgICAKKyAgICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMS9zcmMvbWFpbi93ZWJhcHAvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMS9yZXNvdXJjZS9Cb29rc3RvcmUvdGltZS5qc3AgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMS9zcmMvbWFpbi93ZWJhcHAvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMS9yZXNvdXJjZS9Cb29rc3RvcmUvdGltZS5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI3ZTIyZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0xL3NyYy9tYWluL3dlYmFwcC9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18xL3Jlc291cmNlL0Jvb2tzdG9yZS90aW1lLmpzcApAQCAtMCwwICsxLDI0IEBACis8JS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLSU+CisKKzwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD1VVEYtOCIgbGFuZ3VhZ2U9ImphdmEiICU+Cis8aHRtbD4KKyAgPGJvZHk+CisgICAgQ3VycmVudCBzeXN0ZW0gdGltZSBpcyAke2l0LnN5c3RlbVRpbWV9CisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0xL3NyYy9tYWluL3dlYmFwcC9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18xL3Jlc291cmNlL0l0ZW0vZm9vdGVyLmpzcCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0xL3NyYy9tYWluL3dlYmFwcC9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18xL3Jlc291cmNlL0l0ZW0vZm9vdGVyLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGZmNzEwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTEvc3JjL21haW4vd2ViYXBwL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzEvcmVzb3VyY2UvSXRlbS9mb290ZXIuanNwCkBAIC0wLDAgKzEsMjQgQEAKKzwlLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tJT4KKworPHA+Cis8YSBocmVmPSIuLi8uLi8iPkJhY2s8L2E+Cis8aHI+Cis8ZGl2IGFsaWduPSJyaWdodCI+CisgICAgQ29tbW9uIGZvb3RlciAodGl0bGUgJHtpdC50aXRsZX0pCis8L2Rpdj4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0xL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMS9Cb29rc3RvcmVJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0xL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMS9Cb29rc3RvcmVJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzUxYjljCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTEvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18xL0Jvb2tzdG9yZUlUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9tdmNfMTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfbXZjXzEucmVzb3VyY2UuQm9va3N0b3JlOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworcHVibGljIGNsYXNzIEJvb2tzdG9yZUlUQ2FzZSBleHRlbmRzIFRlc3RTdXBwb3J0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlQXNIdG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIE5PVEU6IEh0dHBVcmxDb25uZWN0b3Igc2VuZHMgc2V2ZXJhbCBhY2NlcHRlZCB0eXBlcyBieSBkZWZhdWx0IHdoZW4gbm90IGV4cGxpY2l0bHkgc2V0IGJ5IHRoZSBjYWxsZXIuCisgICAgICAgIC8vIEluIHN1Y2ggY2FzZSwgdGhlIC5hY2NlcHQoInRleHQvaHRtbCIpIGNhbGwgaXMgbm90IG5lY2Vzc2FyeS4gSG93ZXZlciwgb3RoZXIgY29ubmVjdG9ycyBhY3QgaW4gYSBkaWZmZXJlbnQgd2F5IGFuZAorICAgICAgICAvLyB0aGlzIGxlYWRzIGluIGRpZmZlcmVudCBiZWhhdmlvdXIgd2hlbiBzZWxlY3RpbmcgdGhlIE1lc3NhZ2VCb2R5V3JpdGVyLiBMZWF2aW5nIHRoZSBkZWZpbml0aW9uIGV4cGxpY2l0IGZvciBicm9hZGVyCisgICAgICAgIC8vIGNvbXBhdGliaWxpdHkuCisgICAgICAgIGFzc2VydEJvb2tzdG9yZUh0bWxSZXNwb25zZSh0YXJnZXQoKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX0hUTUxfVFlQRSkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlQXNYbWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQm9va3N0b3JlIHJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgiYXBwbGljYXRpb24veG1sIikuZ2V0KEJvb2tzdG9yZS5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiU2hvdWxkIGhhdmUgcmV0dXJuZWQgYSBib29rc3RvcmUhIiwgcmVzcG9uc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoImJvb2tzdG9yZSBuYW1lIiwgIkN6ZWNoIEJvb2tzdG9yZSIsIHJlc3BvbnNlLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xlQ29udGVudFR5cGVBbmRDb250ZW50TGVuZ3RoVmFsdWVJblhtbFJlc3BvbnNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGFzc2VydFN0YXR1c0NvbnRlbnRUeXBlQW5kTGVuZ3RoKHRhcmdldCgpLnJlcXVlc3QoImFwcGxpY2F0aW9uL3htbCIpLmdldCgpKTsKKyAgICAgICAgYXNzZXJ0U3RhdHVzQ29udGVudFR5cGVBbmRMZW5ndGgodGFyZ2V0KCkKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgidGV4dC9odG1sIiwgImFwcGxpY2F0aW9uL3hodG1sK3htbCIsICJhcHBsaWNhdGlvbi94bWw7cT0wLjkiLCAiKi8qO3E9MC44IikuZ2V0KCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRTdGF0dXNDb250ZW50VHlwZUFuZExlbmd0aChSZXNwb25zZSByZXNwb25zZSkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIlNob3VsZCBoYXZlIHJldHVybmVkIGEgMjAwIHJlc3BvbnNlISIsIDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRUcnVlKCJTaG91bGQgY29udGFpbiBhIENvbnRlbnQtVHlwZSBoZWFkZXIhIiwgcmVzcG9uc2UuZ2V0SGVhZGVycygpLmNvbnRhaW5zS2V5KEh0dHBIZWFkZXJzLkNPTlRFTlRfVFlQRSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlNob3VsZCBoYXZlIGEgc2luZ2xlIENvbnRlbnQtVHlwZSBoZWFkZXIhIiwgMSwgcmVzcG9uc2UuZ2V0SGVhZGVycygpLmdldChIdHRwSGVhZGVycy5DT05URU5UX1RZUEUpLnNpemUoKSk7CisgICAgICAgIGFzc2VydFRydWUoIlNob3VsZCBjb250YWluIGEgQ29udGVudC1MZW5ndGggaGVhZGVyISIsIHJlc3BvbnNlLmdldEhlYWRlcnMoKS5jb250YWluc0tleShIdHRwSGVhZGVycy5DT05URU5UX0xFTkdUSCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlNob3VsZCBoYXZlIGEgc2luZ2xlIENvbnRlbnQtTGVuZ3RoIGhlYWRlciEiLAorICAgICAgICAgICAgICAgIDEsIHJlc3BvbnNlLmdldEhlYWRlcnMoKS5nZXQoSHR0cEhlYWRlcnMuQ09OVEVOVF9MRU5HVEgpLnNpemUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VBc0h0bWxVc2luZ1dlYktpdEFjY2VwdEhlYWRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgKKyAgICAgICAgICAgICAgICAidGV4dC9odG1sIiwKKyAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24veGh0bWwreG1sIiwKKyAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24veG1sO3E9MC45IiwKKyAgICAgICAgICAgICAgICAiKi8qO3E9MC44IikuZ2V0KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0Qm9va3N0b3JlSHRtbFJlc3BvbnNlKHJlc3BvbnNlKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRCb29rc3RvcmVIdG1sUmVzcG9uc2UoU3RyaW5nIHJlc3BvbnNlKSB7CisgICAgICAgIGFzc2VydEh0bWxSZXNwb25zZShyZXNwb25zZSk7CisgICAgICAgIGFzc2VydFJlc3BvbnNlQ29udGFpbnMocmVzcG9uc2UsICJCb29rc3RvcmUiKTsKKyAgICAgICAgYXNzZXJ0UmVzcG9uc2VDb250YWlucyhyZXNwb25zZSwgIkl0ZW0gTGlzdCIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0xL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMS9JdGVtSVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzEvSXRlbUlUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwZDkxMTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzEvSXRlbUlUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9tdmNfMTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X212Y18xLnJlc291cmNlLkJvb2s7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworCitwdWJsaWMgY2xhc3MgSXRlbUlUQ2FzZSBleHRlbmRzIFRlc3RTdXBwb3J0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlQXNIdG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIE5PVEU6IEh0dHBVcmxDb25uZWN0b3Igc2VuZHMgc2V2ZXJhbCBhY2NlcHRlZCB0eXBlcyBieSBkZWZhdWx0IHdoZW4gbm90IGV4cGxpY2l0bHkgc2V0IGJ5IHRoZSBjYWxsZXIuCisgICAgICAgIC8vIEluIHN1Y2ggY2FzZSwgdGhlIC5hY2NlcHQoInRleHQvaHRtbCIpIGNhbGwgaXMgbm90IG5lY2Vzc2FyeS4gSG93ZXZlciwgb3RoZXIgY29ubmVjdG9ycyBhY3QgaW4gYSBkaWZmZXJlbnQgd2F5IGFuZAorICAgICAgICAvLyB0aGlzIGxlYWRzIGluIGRpZmZlcmVudCBiZWhhdmlvdXIgd2hlbiBzZWxlY3RpbmcgdGhlIE1lc3NhZ2VCb2R5V3JpdGVyLiBMZWF2aW5nIHRoZSBkZWZpbml0aW9uIGV4cGxpY2l0IGZvciBicm9hZGVyCisgICAgICAgIC8vIGNvbXBhdGliaWxpdHkuCisgICAgICAgIGZpbmFsIFN0cmluZyByZXNwb25zZSA9IGl0ZW0xcmVzb3VyY2UoKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX0hUTUwpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRJdGVtSHRtbFJlc3BvbnNlKHJlc3BvbnNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUFzWG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyB0ZXh0ID0gaXRlbTFyZXNvdXJjZSgpLnJlcXVlc3QoImFwcGxpY2F0aW9uL3htbCIpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkl0ZW0gWE1MIGlzOiAiICsgdGV4dCk7CisKKyAgICAgICAgZmluYWwgQm9vayByZXNwb25zZSA9IGl0ZW0xcmVzb3VyY2UoKS5yZXF1ZXN0KCJhcHBsaWNhdGlvbi94bWwiKS5nZXQoQm9vay5jbGFzcyk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIlNob3VsZCBoYXZlIHJldHVybmVkIGFuIGl0ZW0hIiwgcmVzcG9uc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoIml0ZW0gdGl0bGUiLCAiU3ZlamsiLCByZXNwb25zZS5nZXRUaXRsZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUFzSHRtbFVzaW5nV2ViS2l0QWNjZXB0SGVhZGVycygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzcG9uc2UgPSBpdGVtMXJlc291cmNlKCkucmVxdWVzdCgKKyAgICAgICAgICAgICAgICAidGV4dC9odG1sIiwKKyAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24veGh0bWwreG1sIiwKKyAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24veG1sO3E9MC45IiwKKyAgICAgICAgICAgICAgICAiKi8qO3E9MC44IikuZ2V0KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0SXRlbUh0bWxSZXNwb25zZShyZXNwb25zZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0SXRlbUh0bWxSZXNwb25zZShTdHJpbmcgcmVzcG9uc2UpIHsKKyAgICAgICAgYXNzZXJ0SHRtbFJlc3BvbnNlKHJlc3BvbnNlKTsKKyAgICAgICAgYXNzZXJ0UmVzcG9uc2VDb250YWlucyhyZXNwb25zZSwgIjx0aXRsZT5Cb29rPC90aXRsZT4iKTsKKyAgICAgICAgYXNzZXJ0UmVzcG9uc2VDb250YWlucyhyZXNwb25zZSwgIjxoMT5TdmVqazwvaDE+Iik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFdlYlRhcmdldCBpdGVtMXJlc291cmNlKCkgeworICAgICAgICByZXR1cm4gdGFyZ2V0KCkucGF0aCgiL2l0ZW1zLzEiKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0xL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMS9UZXN0U3VwcG9ydC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTEvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18xL1Rlc3RTdXBwb3J0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFlOTU4ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0xL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMS9UZXN0U3VwcG9ydC5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9tdmNfMTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogQSBiYXNlIGNsYXNzIGZvciB0ZXN0IGNhc2VzIHdoaWNoIGJvb3RzIHVwIGEgR2xhc3NGaXNoIHNlcnZlciBmb3IgaW4gY29udGFpbmVyIHRlc3Rpbmcgb2YgUkVTVGZ1bCByZXNvdXJjZXMuCisgKgorICogQGF1dGhvciBKYW1lcyBTdHJhY2hhbgorICogQGF1dGhvciBOYXJlc2gKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFRlc3RTdXBwb3J0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IE15QXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydEh0bWxSZXNwb25zZShTdHJpbmcgcmVzcG9uc2UpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTm8gdGV4dCByZXR1cm5lZCEiLCByZXNwb25zZSk7CisKKyAgICAgICAgYXNzZXJ0UmVzcG9uc2VDb250YWlucyhyZXNwb25zZSwgIjxodG1sPiIpOworICAgICAgICBhc3NlcnRSZXNwb25zZUNvbnRhaW5zKHJlc3BvbnNlLCAiPC9odG1sPiIpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydFJlc3BvbnNlQ29udGFpbnMoU3RyaW5nIHJlc3BvbnNlLCBTdHJpbmcgdGV4dCkgeworICAgICAgICBhc3NlcnRUcnVlKCJSZXNwb25zZSBzaG91bGQgY29udGFpbiAiICsgdGV4dCArICIgYnV0IHdhczogIiArIHJlc3BvbnNlLCByZXNwb25zZS5jb250YWlucyh0ZXh0KSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTIvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0yL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTM0YzUwZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0yL3BvbS54bWwKQEAgLTAsMCArMSw3OSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtMi41LW12Yy0yPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLXNlcnZsZXQtMi41LW12Yy0yPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPlNlcnZsZXQgaW50ZWdyYXRpb24gdGVzdCAtIHNlcnZsZXQtMi41LW12Yy0yIC0gZmlsdGVyIC0gTVZDIC0gamVyc2V5LmNvbmZpZy5zZXJ2bGV0LmpzcC5kaXNhYmxlSnNwVGVtcGxhdGVQcm9jZXNzb3I8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbXZjPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW12Yy1qc3A8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7c2VydmxldDIudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzIvTXlBcHBsaWNhdGlvbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18yL015QXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2Y3MDY2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18yL015QXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfbXZjXzI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLmpzcC5Kc3BNdmNGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfbXZjXzIucmVzb3VyY2UuQm9va3N0b3JlOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgTXlBcHBsaWNhdGlvbiBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKworICAgIHB1YmxpYyBNeUFwcGxpY2F0aW9uKCkgeworICAgICAgICAvLyBSZXNvdXJjZXMuCisgICAgICAgIHBhY2thZ2VzKEJvb2tzdG9yZS5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKKworICAgICAgICAvLyBNVkMuCisgICAgICAgIHJlZ2lzdGVyKEpzcE12Y0ZlYXR1cmUuY2xhc3MpOworCisgICAgICAgIC8vIExvZ2dpbmcuCisgICAgICAgIHJlZ2lzdGVyKExvZ2dpbmdGZWF0dXJlLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzIvcmVzb3VyY2UvQm9vay5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18yL3Jlc291cmNlL0Jvb2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjY0ZTgzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18yL3Jlc291cmNlL0Jvb2suamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfbXZjXzIucmVzb3VyY2U7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworQFhtbFJvb3RFbGVtZW50CitAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCitwdWJsaWMgY2xhc3MgQm9vayBleHRlbmRzIEl0ZW0geworCisgICAgcHVibGljIEJvb2soKSB7CisgICAgfQorCisgICAgcHVibGljIEJvb2soZmluYWwgU3RyaW5nIHRpdGxlLCBmaW5hbCBTdHJpbmcgYXV0aG9yKSB7CisgICAgICAgIHN1cGVyKHRpdGxlLCBhdXRob3IpOworICAgIH0KKworCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzIvcmVzb3VyY2UvQm9va3N0b3JlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzIvcmVzb3VyY2UvQm9va3N0b3JlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWViMDgxMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMi9yZXNvdXJjZS9Cb29rc3RvcmUuamF2YQpAQCAtMCwwICsxLDg0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfbXZjXzIucmVzb3VyY2U7CisKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLk5vdEZvdW5kRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5UZW1wbGF0ZTsKKworQFBhdGgoIi8iKQorQFNpbmdsZXRvbgorQFRlbXBsYXRlCitAUHJvZHVjZXMoInRleHQvaHRtbCIpCitAWG1sUm9vdEVsZW1lbnQKK0BYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKK3B1YmxpYyBjbGFzcyBCb29rc3RvcmUgeworCisgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBJdGVtPiBpdGVtcyA9IG5ldyBUcmVlTWFwPFN0cmluZywgSXRlbT4oKTsKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworCisgICAgcHVibGljIEJvb2tzdG9yZSgpIHsKKyAgICAgICAgc2V0TmFtZSgiQ3plY2ggQm9va3N0b3JlIik7CisgICAgICAgIGdldEl0ZW1zKCkucHV0KCIxIiwgbmV3IEJvb2soIlN2ZWprIiwgIkphcm9zbGF2IEhhc2VrIikpOworICAgICAgICBnZXRJdGVtcygpLnB1dCgiMiIsIG5ldyBCb29rKCJLcmFrYXRpdCIsICJLYXJlbCBDYXBlayIpKTsKKyAgICB9CisKKyAgICBAUGF0aCgiaXRlbXMve2l0ZW1pZH0vIikKKyAgICBwdWJsaWMgSXRlbSBnZXRJdGVtKEBQYXRoUGFyYW0oIml0ZW1pZCIpIFN0cmluZyBpdGVtaWQpIHsKKyAgICAgICAgSXRlbSBpID0gZ2V0SXRlbXMoKS5nZXQoaXRlbWlkKTsKKyAgICAgICAgaWYgKGkgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IE5vdEZvdW5kRXhjZXB0aW9uKFJlc3BvbnNlCisgICAgICAgICAgICAgICAgICAgIC5zdGF0dXMoUmVzcG9uc2UuU3RhdHVzLk5PVF9GT1VORCkKKyAgICAgICAgICAgICAgICAgICAgLmVudGl0eSgiSXRlbSwgIiArIGl0ZW1pZCArICIsIGlzIG5vdCBmb3VuZCIpCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoe01lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUwsIE1lZGlhVHlwZS5URVhUX1hNTCwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT059KQorICAgIHB1YmxpYyBCb29rc3RvcmUgZ2V0WG1sKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBwdWJsaWMgTWFwPFN0cmluZywgSXRlbT4gZ2V0SXRlbXMoKSB7CisgICAgICAgIHJldHVybiBpdGVtczsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7CisgICAgICAgIHJldHVybiBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzIvcmVzb3VyY2UvSXRlbS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18yL3Jlc291cmNlL0l0ZW0uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmVmMDY2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18yL3Jlc291cmNlL0l0ZW0uamF2YQpAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfbXZjXzIucmVzb3VyY2U7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuVGVtcGxhdGU7CisKK0BUZW1wbGF0ZQorQFByb2R1Y2VzKCJ0ZXh0L2h0bWwiKQorQFhtbFJvb3RFbGVtZW50CitAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCitwdWJsaWMgY2xhc3MgSXRlbSB7CisKKyAgICBwcml2YXRlIFN0cmluZyB0aXRsZTsKKyAgICBwcml2YXRlIFN0cmluZyBhdXRob3I7CisKKyAgICBwdWJsaWMgSXRlbSgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgSXRlbShmaW5hbCBTdHJpbmcgdGl0bGUsIGZpbmFsIFN0cmluZyBhdXRob3IpIHsKKyAgICAgICAgdGhpcy50aXRsZSA9IHRpdGxlOworICAgICAgICB0aGlzLmF1dGhvciA9IGF1dGhvcjsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldFRpdGxlKCkgeworICAgICAgICByZXR1cm4gdGl0bGU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRBdXRob3IoKSB7CisgICAgICAgIHJldHVybiBhdXRob3I7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQcm9kdWNlcyh7TWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTCwgTWVkaWFUeXBlLlRFWFRfWE1MLCBNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTn0pCisgICAgcHVibGljIEl0ZW0gZ2V0WG1sKCkgeworICAgICAgICByZXR1cm4gdGhpczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIkl0ZW17IgorICAgICAgICAgICAgICAgICsgInRpdGxlPSciICsgdGl0bGUgKyAnXCcnCisgICAgICAgICAgICAgICAgKyAiLCBhdXRob3I9JyIgKyBhdXRob3IgKyAnXCcnCisgICAgICAgICAgICAgICAgKyAnfSc7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0yL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZhMDViYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0yL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSw0MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIyLjUiIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzJfNS54c2QiPgorICAgIDxmaWx0ZXI+CisgICAgICAgIDxmaWx0ZXItbmFtZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X212Y18yLk15QXBwbGljYXRpb248L2ZpbHRlci1uYW1lPgorICAgICAgICA8ZmlsdGVyLWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvZmlsdGVyLWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LndzLnJzLkFwcGxpY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfbXZjXzIuTXlBcHBsaWNhdGlvbjwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qZXJzZXkuY29uZmlnLnNlcnZlci5tdmMudGVtcGxhdGVCYXNlUGF0aC5qc3A8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPCEtLSBwYXNzIHRvIG5leHQgZmlsdGVyIGlmIEplcnNleS9BcHAgcmV0dXJucyA0MDQgLS0+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amVyc2V5LmNvbmZpZy5zZXJ2bGV0LmZpbHRlci5mb3J3YXJkT240MDQ8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgPC9maWx0ZXI+CisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9tdmNfMi5NeUFwcGxpY2F0aW9uPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTIvc3JjL21haW4vd2ViYXBwL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzIvcmVzb3VyY2UvQm9vay9pbmRleC5qc3AgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMi9zcmMvbWFpbi93ZWJhcHAvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMi9yZXNvdXJjZS9Cb29rL2luZGV4LmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmY2MDIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTIvc3JjL21haW4vd2ViYXBwL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzIvcmVzb3VyY2UvQm9vay9pbmRleC5qc3AKQEAgLTAsMCArMSw0NiBAQAorPCUtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0lPgorCis8JUBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWwiJT4KKzwlQHBhZ2UgcGFnZUVuY29kaW5nPSJVVEYtOCIlPgorPCUtLQorVGhlIHRhZ2xpYiBkaXJlY3RpdmUgYmVsb3cgaW1wb3J0cyB0aGUgSlNUTCBsaWJyYXJ5LiBJZiB5b3UgdW5jb21tZW50IGl0LAoreW91IG11c3QgYWxzbyBhZGQgdGhlIEpTVEwgbGlicmFyeSB0byB0aGUgcHJvamVjdC4gVGhlIEFkZCBMaWJyYXJ5Li4uIGFjdGlvbgorb24gTGlicmFyaWVzIG5vZGUgaW4gUHJvamVjdHMgdmlldyBjYW4gYmUgdXNlZCB0byBhZGQgdGhlIEpTVEwgMS4xIGxpYnJhcnkuCistLSU+Cis8JUB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzcC9qc3RsL2NvcmUiIHByZWZpeD0iYyIlPgorPCVAdGFnbGliIHByZWZpeD0icmJ0IiB1cmk9InVybjpvcmc6Z2xhc3NmaXNoOmplcnNleTpzZXJ2bGV0Om12YyIgJT4KKworPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKKyJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorCis8aHRtbD4KKyAgICA8aGVhZD4KKyAgICAgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiPgorICAgICAgICA8dGl0bGU+Qm9vazwvdGl0bGU+CisgICAgPC9oZWFkPgorICAgIDxib2R5PgorCisgICAgICAgIDxoMT4ke2l0LnRpdGxlfTwvaDE+CisKKyAgICAgICAgQm9vayBmcm9tICR7aXQuYXV0aG9yfQorCisgICAgICAgIDxyYnQ6aW5jbHVkZSBwYWdlPSJmb290ZXIuanNwIi8+CisKKyAgICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMi9zcmMvbWFpbi93ZWJhcHAvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMi9yZXNvdXJjZS9Cb29rc3RvcmUvY291bnQuanNwIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTIvc3JjL21haW4vd2ViYXBwL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzIvcmVzb3VyY2UvQm9va3N0b3JlL2NvdW50LmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmU3NTQyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTIvc3JjL21haW4vd2ViYXBwL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzIvcmVzb3VyY2UvQm9va3N0b3JlL2NvdW50LmpzcApAQCAtMCwwICsxLDI3IEBACis8JS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLSU+CisKKzwlQHRhZ2xpYiBwcmVmaXg9ImZuIiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNwL2pzdGwvZnVuY3Rpb25zIiAlPgorPCUtLQorICBBbiBleGFtcGxlIG9mIGFub3RoZXIgc2lkZSBKU1AuCistLSU+Cis8aHRtbD4KKyAgPGJvZHk+CisgICAjIG9mIGl0ZW1zOiAke2ZuOmxlbmd0aChpdC5pdGVtcyl9IAorICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMi9zcmMvbWFpbi93ZWJhcHAvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMi9yZXNvdXJjZS9Cb29rc3RvcmUvaW5kZXguanNwIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTIvc3JjL21haW4vd2ViYXBwL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzIvcmVzb3VyY2UvQm9va3N0b3JlL2luZGV4LmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGRiMjAyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTIvc3JjL21haW4vd2ViYXBwL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzIvcmVzb3VyY2UvQm9va3N0b3JlL2luZGV4LmpzcApAQCAtMCwwICsxLDU2IEBACis8JS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLSU+CisKKzwlQHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbCIlPgorPCVAcGFnZSBwYWdlRW5jb2Rpbmc9IlVURi04IiU+CisKKzwlQHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNwL2pzdGwvY29yZSIgcHJlZml4PSJjIiU+IAorCis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgorICAgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+CisKKzxodG1sPgorICAgIDxoZWFkPgorICAgICAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+CisgICAgICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9InNjcmVlbiI+CisgICAgICAgICAgQGltcG9ydCB1cmwoIDxjOnVybCB2YWx1ZT0iL2Nzcy9zdHlsZS5jc3MiLz4gKTsKKyAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgPHRpdGxlPlJFU1QgQm9va3N0b3JlIFNhbXBsZTwvdGl0bGU+CisgICAgPC9oZWFkPgorICAgIDxib2R5PgorCisgICAgPGgxPiR7aXQubmFtZX08L2gxPgorICAgIAorICAgIDxoMj5JdGVtIExpc3Q8L2gyPgorCisgICAgPHVsPgorICAgICAgICA8Yzpmb3JFYWNoIHZhcj0iaSIgaXRlbXM9IiR7aXQuaXRlbXN9Ij4KKyAgICAgICAgICAgIDxsaT48YSBocmVmPSJpdGVtcy8ke2kua2V5fS8iPiR7aS52YWx1ZS50aXRsZX08L2E+CisgICAgICAgIDwvYzpmb3JFYWNoPgorICAgIDwvdWw+CisgICAgCisgICAgPGgyPk90aGVyczwvaDI+CisgICAgPHA+CisgICAgICA8YSBocmVmPSJjb3VudCI+Y291bnQgaW52ZW50b3J5PC9hPgorICAgIDxwPgorICAgICAgPGEgaHJlZj0idGltZSI+Z2V0IHRoZSBzeXN0ZW0gdGltZTwvYT4KKyAgICA8cD4KKyAgICAgIDxhIGhyZWY9ImpzcC9oZWxwLmpzcCI+cmVndWxhciByZXNvdXJjZXM8L2E+CisgICAgPC9wPiAgICAKKyAgICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMi9zcmMvbWFpbi93ZWJhcHAvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMi9yZXNvdXJjZS9Cb29rc3RvcmUvdGltZS5qc3AgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMi9zcmMvbWFpbi93ZWJhcHAvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMi9yZXNvdXJjZS9Cb29rc3RvcmUvdGltZS5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI3ZTIyZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0yL3NyYy9tYWluL3dlYmFwcC9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18yL3Jlc291cmNlL0Jvb2tzdG9yZS90aW1lLmpzcApAQCAtMCwwICsxLDI0IEBACis8JS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLSU+CisKKzwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD1VVEYtOCIgbGFuZ3VhZ2U9ImphdmEiICU+Cis8aHRtbD4KKyAgPGJvZHk+CisgICAgQ3VycmVudCBzeXN0ZW0gdGltZSBpcyAke2l0LnN5c3RlbVRpbWV9CisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0yL3NyYy9tYWluL3dlYmFwcC9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18yL3Jlc291cmNlL0l0ZW0vZm9vdGVyLmpzcCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0yL3NyYy9tYWluL3dlYmFwcC9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18yL3Jlc291cmNlL0l0ZW0vZm9vdGVyLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZGZmNzEwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTIvc3JjL21haW4vd2ViYXBwL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzIvcmVzb3VyY2UvSXRlbS9mb290ZXIuanNwCkBAIC0wLDAgKzEsMjQgQEAKKzwlLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tJT4KKworPHA+Cis8YSBocmVmPSIuLi8uLi8iPkJhY2s8L2E+Cis8aHI+Cis8ZGl2IGFsaWduPSJyaWdodCI+CisgICAgQ29tbW9uIGZvb3RlciAodGl0bGUgJHtpdC50aXRsZX0pCis8L2Rpdj4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMi9Cb29rc3RvcmVJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMi9Cb29rc3RvcmVJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDIwOTcyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18yL0Jvb2tzdG9yZUlUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9tdmNfMjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X212Y18yLnJlc291cmNlLkJvb2tzdG9yZTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworCitwdWJsaWMgY2xhc3MgQm9va3N0b3JlSVRDYXNlIGV4dGVuZHMgVGVzdFN1cHBvcnQgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VBc1htbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBCb29rc3RvcmUgcmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCJhcHBsaWNhdGlvbi94bWwiKS5nZXQoQm9va3N0b3JlLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRCb29rc3RvcmVYbWxSZXNwb25zZShyZXNwb25zZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VBc0h0bWxVc2luZ1dlYktpdEFjY2VwdEhlYWRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KAorICAgICAgICAgICAgICAgICJ0ZXh0L2h0bWwiLAorICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi94aHRtbCt4bWwiLAorICAgICAgICAgICAgICAgICJhcHBsaWNhdGlvbi94bWw7cT0wLjkiLAorICAgICAgICAgICAgICAgICIqLyo7cT0wLjgiKS5nZXQoUmVzcG9uc2UuY2xhc3MpOworCisgICAgICAgIGFzc2VydEVxdWFscyg0MDQsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRCb29rc3RvcmVYbWxSZXNwb25zZShmaW5hbCBCb29rc3RvcmUgcmVzcG9uc2UpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiU2hvdWxkIGhhdmUgcmV0dXJuZWQgYSBib29rc3RvcmUhIiwgcmVzcG9uc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoImJvb2tzdG9yZSBuYW1lIiwgIkN6ZWNoIEJvb2tzdG9yZSIsIHJlc3BvbnNlLmdldE5hbWUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18yL0l0ZW1JVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMi9JdGVtSVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRhNzkzYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMi9JdGVtSVRDYXNlLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X212Y18yOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9tdmNfMi5yZXNvdXJjZS5Cb29rOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydE5vdE51bGw7CisKK3B1YmxpYyBjbGFzcyBJdGVtSVRDYXNlIGV4dGVuZHMgVGVzdFN1cHBvcnQgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VBc1htbCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgdGV4dCA9IGl0ZW0xcmVzb3VyY2UoKS5yZXF1ZXN0KCJhcHBsaWNhdGlvbi94bWwiKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJJdGVtIFhNTCBpczogIiArIHRleHQpOworCisgICAgICAgIGZpbmFsIEJvb2sgcmVzcG9uc2UgPSBpdGVtMXJlc291cmNlKCkucmVxdWVzdCgiYXBwbGljYXRpb24veG1sIikuZ2V0KEJvb2suY2xhc3MpOworICAgICAgICBhc3NlcnRJdGVtWG1sUmVzcG9uc2UocmVzcG9uc2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlQXNIdG1sVXNpbmdXZWJLaXRBY2NlcHRIZWFkZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gaXRlbTFyZXNvdXJjZSgpLnJlcXVlc3QoCisgICAgICAgICAgICAgICAgInRleHQvaHRtbCIsCisgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3hodG1sK3htbCIsCisgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3htbDtxPTAuOSIsCisgICAgICAgICAgICAgICAgIiovKjtxPTAuOCIpLmdldChSZXNwb25zZS5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwNCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBhc3NlcnRJdGVtWG1sUmVzcG9uc2UoZmluYWwgQm9vayByZXNwb25zZSkgeworICAgICAgICBhc3NlcnROb3ROdWxsKCJTaG91bGQgaGF2ZSByZXR1cm5lZCBhbiBpdGVtISIsIHJlc3BvbnNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJpdGVtIHRpdGxlIiwgIlN2ZWprIiwgcmVzcG9uc2UuZ2V0VGl0bGUoKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFdlYlRhcmdldCBpdGVtMXJlc291cmNlKCkgeworICAgICAgICByZXR1cm4gdGFyZ2V0KCkucGF0aCgiL2l0ZW1zLzEiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzIvVGVzdFN1cHBvcnQuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMi9UZXN0U3VwcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZDIwOTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzIvVGVzdFN1cHBvcnQuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfbXZjXzI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKKy8qKgorICogQSBiYXNlIGNsYXNzIGZvciB0ZXN0IGNhc2VzIHdoaWNoIGJvb3RzIHVwIGEgR2xhc3NGaXNoIHNlcnZlciBmb3IgaW4gY29udGFpbmVyIHRlc3Rpbmcgb2YgUkVTVGZ1bCByZXNvdXJjZXMuCisgKgorICogQGF1dGhvciBKYW1lcyBTdHJhY2hhbgorICogQGF1dGhvciBOYXJlc2gKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFRlc3RTdXBwb3J0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IE15QXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0zL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MmIyYmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMy9wb20ueG1sCkBAIC0wLDAgKzEsNzkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LTIuNS1tdmMtMzwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1zZXJ2bGV0LTIuNS1tdmMtMzwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5TZXJ2bGV0IGludGVncmF0aW9uIHRlc3QgLSBzZXJ2bGV0LTIuNS1tdmMtMyAtIGZpbHRlciAtIE1WQyAtIGplcnNleS5jb25maWcuc2VydmxldC5Kc3BUZW1wbGF0ZXNCYXNlUGF0aDwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tdmM8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbXZjLWpzcDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtzZXJ2bGV0Mi52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0zL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMy9NeUFwcGxpY2F0aW9uLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzMvTXlBcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5OGI1ZDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzMvTXlBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9tdmNfMzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuanNwLkpzcE12Y0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9tdmNfMy5yZXNvdXJjZS5Cb29rc3RvcmU7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBNeUFwcGxpY2F0aW9uIGV4dGVuZHMgUmVzb3VyY2VDb25maWcgeworCisgICAgcHVibGljIE15QXBwbGljYXRpb24oKSB7CisgICAgICAgIC8vIFJlc291cmNlcy4KKyAgICAgICAgcGFja2FnZXMoQm9va3N0b3JlLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOworCisgICAgICAgIC8vIE1WQy4KKyAgICAgICAgcmVnaXN0ZXIoSnNwTXZjRmVhdHVyZS5jbGFzcyk7CisKKyAgICAgICAgLy8gTG9nZ2luZy4KKyAgICAgICAgcmVnaXN0ZXIoTG9nZ2luZ0ZlYXR1cmUuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0zL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMy9yZXNvdXJjZS9Cb29rLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzMvcmVzb3VyY2UvQm9vay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0OWE4ZjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzMvcmVzb3VyY2UvQm9vay5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9tdmNfMy5yZXNvdXJjZTsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc29yVHlwZTsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCitAWG1sUm9vdEVsZW1lbnQKK0BYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKK3B1YmxpYyBjbGFzcyBCb29rIGV4dGVuZHMgSXRlbSB7CisKKyAgICBwdWJsaWMgQm9vaygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgQm9vayhmaW5hbCBTdHJpbmcgdGl0bGUsIGZpbmFsIFN0cmluZyBhdXRob3IpIHsKKyAgICAgICAgc3VwZXIodGl0bGUsIGF1dGhvcik7CisgICAgfQorCisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0zL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMy9yZXNvdXJjZS9Cb29rc3RvcmUuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0zL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMy9yZXNvdXJjZS9Cb29rc3RvcmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTI4ODhiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18zL3Jlc291cmNlL0Jvb2tzdG9yZS5qYXZhCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9tdmNfMy5yZXNvdXJjZTsKKworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sQWNjZXNzb3JUeXBlOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubXZjLlRlbXBsYXRlOworCitAUGF0aCgiLyIpCitAU2luZ2xldG9uCitAVGVtcGxhdGUKK0BQcm9kdWNlcygidGV4dC9odG1sIikKK0BYbWxSb290RWxlbWVudAorQFhtbEFjY2Vzc29yVHlwZShYbWxBY2Nlc3NUeXBlLkZJRUxEKQorcHVibGljIGNsYXNzIEJvb2tzdG9yZSB7CisKKyAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIEl0ZW0+IGl0ZW1zID0gbmV3IFRyZWVNYXA8U3RyaW5nLCBJdGVtPigpOworICAgIHByaXZhdGUgU3RyaW5nIG5hbWU7CisKKyAgICBwdWJsaWMgQm9va3N0b3JlKCkgeworICAgICAgICBzZXROYW1lKCJDemVjaCBCb29rc3RvcmUiKTsKKyAgICAgICAgZ2V0SXRlbXMoKS5wdXQoIjEiLCBuZXcgQm9vaygiU3ZlamsiLCAiSmFyb3NsYXYgSGFcdTAxNjFlayIpKTsKKyAgICAgICAgZ2V0SXRlbXMoKS5wdXQoIjIiLCBuZXcgQm9vaygiS3Jha2F0aXQiLCAiS2FyZWwgQ2FwZWsiKSk7CisgICAgfQorCisgICAgQFBhdGgoIml0ZW1zL3tpdGVtaWR9LyIpCisgICAgcHVibGljIEl0ZW0gZ2V0SXRlbShAUGF0aFBhcmFtKCJpdGVtaWQiKSBTdHJpbmcgaXRlbWlkKSB7CisgICAgICAgIEl0ZW0gaSA9IGdldEl0ZW1zKCkuZ2V0KGl0ZW1pZCk7CisgICAgICAgIGlmIChpID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBOb3RGb3VuZEV4Y2VwdGlvbihSZXNwb25zZQorICAgICAgICAgICAgICAgICAgICAuc3RhdHVzKFJlc3BvbnNlLlN0YXR1cy5OT1RfRk9VTkQpCisgICAgICAgICAgICAgICAgICAgIC5lbnRpdHkoIkl0ZW0sICIgKyBpdGVtaWQgKyAiLCBpcyBub3QgZm91bmQiKQorICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gaTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKHtNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MLCBNZWRpYVR5cGUuVEVYVF9YTUwsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OfSkKKyAgICBwdWJsaWMgQm9va3N0b3JlIGdldFhtbCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXM7CisgICAgfQorCisgICAgcHVibGljIE1hcDxTdHJpbmcsIEl0ZW0+IGdldEl0ZW1zKCkgeworICAgICAgICByZXR1cm4gaXRlbXM7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18zL3Jlc291cmNlL0l0ZW0uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0zL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMy9yZXNvdXJjZS9JdGVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODVlYjZjYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0zL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMy9yZXNvdXJjZS9JdGVtLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X212Y18zLnJlc291cmNlOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5tdmMuVGVtcGxhdGU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLm12Yy5WaWV3YWJsZTsKKworQFRlbXBsYXRlCitAUHJvZHVjZXMoInRleHQvaHRtbCIpCitAWG1sUm9vdEVsZW1lbnQKK0BYbWxBY2Nlc3NvclR5cGUoWG1sQWNjZXNzVHlwZS5GSUVMRCkKK3B1YmxpYyBjbGFzcyBJdGVtIHsKKworICAgIHByaXZhdGUgU3RyaW5nIHRpdGxlOworICAgIHByaXZhdGUgU3RyaW5nIGF1dGhvcjsKKworICAgIHB1YmxpYyBJdGVtKCkgeworICAgIH0KKworICAgIHB1YmxpYyBJdGVtKGZpbmFsIFN0cmluZyB0aXRsZSwgZmluYWwgU3RyaW5nIGF1dGhvcikgeworICAgICAgICB0aGlzLnRpdGxlID0gdGl0bGU7CisgICAgICAgIHRoaXMuYXV0aG9yID0gYXV0aG9yOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0VGl0bGUoKSB7CisgICAgICAgIHJldHVybiB0aXRsZTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEF1dGhvcigpIHsKKyAgICAgICAgcmV0dXJuIGF1dGhvcjsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKHtNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MLCBNZWRpYVR5cGUuVEVYVF9YTUwsIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OfSkKKyAgICBwdWJsaWMgSXRlbSBnZXRYbWwoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgidXRmIikKKyAgICBwdWJsaWMgVmlld2FibGUgZ2V0SXRlbVV0ZjgoKSB7CisgICAgICAgIHJldHVybiBuZXcgVmlld2FibGUoImluZGV4LnV0ZjguanNwIiwgdGhpcyk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJpc28iKQorICAgIHB1YmxpYyBWaWV3YWJsZSBnZXRJdGVtSXNvODg1OTIoKSB7CisgICAgICAgIHJldHVybiBuZXcgVmlld2FibGUoImluZGV4Lmlzbzg4NTkyLmpzcCIsIHRoaXMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAiSXRlbXsiCisgICAgICAgICAgICAgICAgKyAidGl0bGU9JyIgKyB0aXRsZSArICdcJycKKyAgICAgICAgICAgICAgICArICIsIGF1dGhvcj0nIiArIGF1dGhvciArICdcJycKKyAgICAgICAgICAgICAgICArICd9JzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2M1NTBlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDQyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjIuNSIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI+CisgICAgPGZpbHRlcj4KKyAgICAgICAgPGZpbHRlci1uYW1lPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfbXZjXzMuTXlBcHBsaWNhdGlvbjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDxmaWx0ZXItY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9maWx0ZXItY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9tdmNfMy5NeUFwcGxpY2F0aW9uPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmplcnNleS5jb25maWcuc2VydmVyLm12Yy50ZW1wbGF0ZUJhc2VQYXRoLmpzcDwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT4vanNwLzwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPCEtLSBwYXNzIHRvIG5leHQgZmlsdGVyIGlmIEplcnNleS9BcHAgcmV0dXJucyA0MDQgLS0+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amVyc2V5LmNvbmZpZy5zZXJ2bGV0LmZpbHRlci5mb3J3YXJkT240MDQ8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICA8L2ZpbHRlcj4KKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X212Y18zLk15QXBwbGljYXRpb248L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMy9zcmMvbWFpbi93ZWJhcHAvanNwL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzMvcmVzb3VyY2UvQm9vay9pbmRleC5pc284ODU5Mi5qc3AgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMy9zcmMvbWFpbi93ZWJhcHAvanNwL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzMvcmVzb3VyY2UvQm9vay9pbmRleC5pc284ODU5Mi5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc2NDNiNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0zL3NyYy9tYWluL3dlYmFwcC9qc3Avb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMy9yZXNvdXJjZS9Cb29rL2luZGV4Lmlzbzg4NTkyLmpzcApAQCAtMCwwICsxLDQ1IEBACis8JS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLSU+CisKKzwlQHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbCIlPgorPCVAcGFnZSBwYWdlRW5jb2Rpbmc9IklTTy04ODU5LTIiJT4KKzwlLS0KK1RoZSB0YWdsaWIgZGlyZWN0aXZlIGJlbG93IGltcG9ydHMgdGhlIEpTVEwgbGlicmFyeS4gSWYgeW91IHVuY29tbWVudCBpdCwKK3lvdSBtdXN0IGFsc28gYWRkIHRoZSBKU1RMIGxpYnJhcnkgdG8gdGhlIHByb2plY3QuIFRoZSBBZGQgTGlicmFyeS4uLiBhY3Rpb24KK29uIExpYnJhcmllcyBub2RlIGluIFByb2plY3RzIHZpZXcgY2FuIGJlIHVzZWQgdG8gYWRkIHRoZSBKU1RMIDEuMSBsaWJyYXJ5LgorLS0lPgorPCVAdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc3AvanN0bC9jb3JlIiBwcmVmaXg9ImMiJT4KKzwlQHRhZ2xpYiBwcmVmaXg9InJidCIgdXJpPSJ1cm46b3JnOmdsYXNzZmlzaDpqZXJzZXk6c2VydmxldDptdmMiICU+CisKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCisiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KKworPGh0bWw+CisgICAgPGhlYWQ+CisgICAgICAgIDx0aXRsZT5Cb29rPC90aXRsZT4KKyAgICA8L2hlYWQ+CisgICAgPGJvZHk+CisKKyAgICAgICAgPGgxPiR7aXQudGl0bGV9PC9oMT4KKworICAgICAgICBCb29rIGZyb20gJHtpdC5hdXRob3J9CisKKyAgICAgICAgPHJidDppbmNsdWRlIHBhZ2U9ImZvb3Rlci5qc3AiLz4KKworICAgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0zL3NyYy9tYWluL3dlYmFwcC9qc3Avb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMy9yZXNvdXJjZS9Cb29rL2luZGV4LmpzcCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0zL3NyYy9tYWluL3dlYmFwcC9qc3Avb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMy9yZXNvdXJjZS9Cb29rL2luZGV4LmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmY2MDIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTMvc3JjL21haW4vd2ViYXBwL2pzcC9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18zL3Jlc291cmNlL0Jvb2svaW5kZXguanNwCkBAIC0wLDAgKzEsNDYgQEAKKzwlLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tJT4KKworPCVAcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sIiU+Cis8JUBwYWdlIHBhZ2VFbmNvZGluZz0iVVRGLTgiJT4KKzwlLS0KK1RoZSB0YWdsaWIgZGlyZWN0aXZlIGJlbG93IGltcG9ydHMgdGhlIEpTVEwgbGlicmFyeS4gSWYgeW91IHVuY29tbWVudCBpdCwKK3lvdSBtdXN0IGFsc28gYWRkIHRoZSBKU1RMIGxpYnJhcnkgdG8gdGhlIHByb2plY3QuIFRoZSBBZGQgTGlicmFyeS4uLiBhY3Rpb24KK29uIExpYnJhcmllcyBub2RlIGluIFByb2plY3RzIHZpZXcgY2FuIGJlIHVzZWQgdG8gYWRkIHRoZSBKU1RMIDEuMSBsaWJyYXJ5LgorLS0lPgorPCVAdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc3AvanN0bC9jb3JlIiBwcmVmaXg9ImMiJT4KKzwlQHRhZ2xpYiBwcmVmaXg9InJidCIgdXJpPSJ1cm46b3JnOmdsYXNzZmlzaDpqZXJzZXk6c2VydmxldDptdmMiICU+CisKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCisiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KKworPGh0bWw+CisgICAgPGhlYWQ+CisgICAgICAgIDxtZXRhIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04Ij4KKyAgICAgICAgPHRpdGxlPkJvb2s8L3RpdGxlPgorICAgIDwvaGVhZD4KKyAgICA8Ym9keT4KKworICAgICAgICA8aDE+JHtpdC50aXRsZX08L2gxPgorCisgICAgICAgIEJvb2sgZnJvbSAke2l0LmF1dGhvcn0KKworICAgICAgICA8cmJ0OmluY2x1ZGUgcGFnZT0iZm9vdGVyLmpzcCIvPgorCisgICAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTMvc3JjL21haW4vd2ViYXBwL2pzcC9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18zL3Jlc291cmNlL0Jvb2svaW5kZXgudXRmOC5qc3AgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMy9zcmMvbWFpbi93ZWJhcHAvanNwL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzMvcmVzb3VyY2UvQm9vay9pbmRleC51dGY4LmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDEwYzYwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTMvc3JjL21haW4vd2ViYXBwL2pzcC9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18zL3Jlc291cmNlL0Jvb2svaW5kZXgudXRmOC5qc3AKQEAgLTAsMCArMSw0NSBAQAorPCUtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0lPgorCis8JUBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWwiJT4KKzwlQHBhZ2UgcGFnZUVuY29kaW5nPSJVVEYtOCIlPgorPCUtLQorVGhlIHRhZ2xpYiBkaXJlY3RpdmUgYmVsb3cgaW1wb3J0cyB0aGUgSlNUTCBsaWJyYXJ5LiBJZiB5b3UgdW5jb21tZW50IGl0LAoreW91IG11c3QgYWxzbyBhZGQgdGhlIEpTVEwgbGlicmFyeSB0byB0aGUgcHJvamVjdC4gVGhlIEFkZCBMaWJyYXJ5Li4uIGFjdGlvbgorb24gTGlicmFyaWVzIG5vZGUgaW4gUHJvamVjdHMgdmlldyBjYW4gYmUgdXNlZCB0byBhZGQgdGhlIEpTVEwgMS4xIGxpYnJhcnkuCistLSU+Cis8JUB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzcC9qc3RsL2NvcmUiIHByZWZpeD0iYyIlPgorPCVAdGFnbGliIHByZWZpeD0icmJ0IiB1cmk9InVybjpvcmc6Z2xhc3NmaXNoOmplcnNleTpzZXJ2bGV0Om12YyIgJT4KKworPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiIKKyJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNC9sb29zZS5kdGQiPgorCis8aHRtbD4KKyAgICA8aGVhZD4KKyAgICAgICAgPHRpdGxlPkJvb2s8L3RpdGxlPgorICAgIDwvaGVhZD4KKyAgICA8Ym9keT4KKworICAgICAgICA8aDE+JHtpdC50aXRsZX08L2gxPgorCisgICAgICAgIEJvb2sgZnJvbSAke2l0LmF1dGhvcn0KKworICAgICAgICA8cmJ0OmluY2x1ZGUgcGFnZT0iZm9vdGVyLmpzcCIvPgorCisgICAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTMvc3JjL21haW4vd2ViYXBwL2pzcC9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18zL3Jlc291cmNlL0Jvb2tzdG9yZS9jb3VudC5qc3AgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMy9zcmMvbWFpbi93ZWJhcHAvanNwL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzMvcmVzb3VyY2UvQm9va3N0b3JlL2NvdW50LmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZmU3NTQyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTMvc3JjL21haW4vd2ViYXBwL2pzcC9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18zL3Jlc291cmNlL0Jvb2tzdG9yZS9jb3VudC5qc3AKQEAgLTAsMCArMSwyNyBAQAorPCUtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0lPgorCis8JUB0YWdsaWIgcHJlZml4PSJmbiIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzcC9qc3RsL2Z1bmN0aW9ucyIgJT4KKzwlLS0KKyAgQW4gZXhhbXBsZSBvZiBhbm90aGVyIHNpZGUgSlNQLgorLS0lPgorPGh0bWw+CisgIDxib2R5PgorICAgIyBvZiBpdGVtczogJHtmbjpsZW5ndGgoaXQuaXRlbXMpfSAKKyAgPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTMvc3JjL21haW4vd2ViYXBwL2pzcC9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18zL3Jlc291cmNlL0Jvb2tzdG9yZS9pbmRleC5qc3AgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMy9zcmMvbWFpbi93ZWJhcHAvanNwL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzMvcmVzb3VyY2UvQm9va3N0b3JlL2luZGV4LmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTc5NmUyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTMvc3JjL21haW4vd2ViYXBwL2pzcC9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18zL3Jlc291cmNlL0Jvb2tzdG9yZS9pbmRleC5qc3AKQEAgLTAsMCArMSw1NiBAQAorPCUtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0lPgorCis8JUBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWwiJT4KKzwlQHBhZ2UgcGFnZUVuY29kaW5nPSJVVEYtOCIlPgorCis8JUB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzcC9qc3RsL2NvcmUiIHByZWZpeD0iYyIlPgorCis8IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgorICAgImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+CisKKzxodG1sPgorICAgIDxoZWFkPgorICAgICAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCI+CisgICAgICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9InNjcmVlbiI+CisgICAgICAgICAgQGltcG9ydCB1cmwoIDxjOnVybCB2YWx1ZT0iL2Nzcy9zdHlsZS5jc3MiLz4gKTsKKyAgICAgICAgPC9zdHlsZT4KKyAgICAgICAgPHRpdGxlPlJFU1QgQm9va3N0b3JlIFNhbXBsZTwvdGl0bGU+CisgICAgPC9oZWFkPgorICAgIDxib2R5PgorCisgICAgPGgxPiR7aXQubmFtZX08L2gxPgorCisgICAgPGgyPkl0ZW0gTGlzdDwvaDI+CisKKyAgICA8dWw+CisgICAgICAgIDxjOmZvckVhY2ggdmFyPSJpIiBpdGVtcz0iJHtpdC5pdGVtc30iPgorICAgICAgICAgICAgPGxpPjxhIGhyZWY9Iml0ZW1zLyR7aS5rZXl9LyI+JHtpLnZhbHVlLnRpdGxlfTwvYT4KKyAgICAgICAgPC9jOmZvckVhY2g+CisgICAgPC91bD4KKworICAgIDxoMj5PdGhlcnM8L2gyPgorICAgIDxwPgorICAgICAgPGEgaHJlZj0iY291bnQiPmNvdW50IGludmVudG9yeTwvYT4KKyAgICA8cD4KKyAgICAgIDxhIGhyZWY9InRpbWUiPmdldCB0aGUgc3lzdGVtIHRpbWU8L2E+CisgICAgPHA+CisgICAgICA8YSBocmVmPSJqc3AvaGVscC5qc3AiPnJlZ3VsYXIgcmVzb3VyY2VzPC9hPgorICAgIDwvcD4KKyAgICA8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMy9zcmMvbWFpbi93ZWJhcHAvanNwL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzMvcmVzb3VyY2UvQm9va3N0b3JlL3RpbWUuanNwIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTMvc3JjL21haW4vd2ViYXBwL2pzcC9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18zL3Jlc291cmNlL0Jvb2tzdG9yZS90aW1lLmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjdlMjJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTMvc3JjL21haW4vd2ViYXBwL2pzcC9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18zL3Jlc291cmNlL0Jvb2tzdG9yZS90aW1lLmpzcApAQCAtMCwwICsxLDI0IEBACis8JS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLSU+CisKKzwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD1VVEYtOCIgbGFuZ3VhZ2U9ImphdmEiICU+Cis8aHRtbD4KKyAgPGJvZHk+CisgICAgQ3VycmVudCBzeXN0ZW0gdGltZSBpcyAke2l0LnN5c3RlbVRpbWV9CisgIDwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0zL3NyYy9tYWluL3dlYmFwcC9qc3Avb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMy9yZXNvdXJjZS9JdGVtL2Zvb3Rlci5qc3AgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMy9zcmMvbWFpbi93ZWJhcHAvanNwL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzMvcmVzb3VyY2UvSXRlbS9mb290ZXIuanNwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZmY3MTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMy9zcmMvbWFpbi93ZWJhcHAvanNwL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzMvcmVzb3VyY2UvSXRlbS9mb290ZXIuanNwCkBAIC0wLDAgKzEsMjQgQEAKKzwlLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tJT4KKworPHA+Cis8YSBocmVmPSIuLi8uLi8iPkJhY2s8L2E+Cis8aHI+Cis8ZGl2IGFsaWduPSJyaWdodCI+CisgICAgQ29tbW9uIGZvb3RlciAodGl0bGUgJHtpdC50aXRsZX0pCis8L2Rpdj4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0zL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMy9Cb29rc3RvcmVJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0zL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMy9Cb29rc3RvcmVJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWY1N2U0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtbXZjLTMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X212Y18zL0Jvb2tzdG9yZUlUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9tdmNfMzsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9tdmNfMy5yZXNvdXJjZS5Cb29rc3RvcmU7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworCitwdWJsaWMgY2xhc3MgQm9va3N0b3JlSVRDYXNlIGV4dGVuZHMgVGVzdFN1cHBvcnQgeworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VBc0h0bWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gTk9URTogSHR0cFVybENvbm5lY3RvciBzZW5kcyBzZXZlcmFsIGFjY2VwdGVkIHR5cGVzIGJ5IGRlZmF1bHQgd2hlbiBub3QgZXhwbGljaXRseSBzZXQgYnkgdGhlIGNhbGxlci4KKyAgICAgICAgLy8gSW4gc3VjaCBjYXNlLCB0aGUgLmFjY2VwdCgidGV4dC9odG1sIikgY2FsbCBpcyBub3QgbmVjZXNzYXJ5LiBIb3dldmVyLCBvdGhlciBjb25uZWN0b3JzIGFjdCBpbiBhIGRpZmZlcmVudCB3YXkgYW5kCisgICAgICAgIC8vIHRoaXMgbGVhZHMgaW4gZGlmZmVyZW50IGJlaGF2aW91ciB3aGVuIHNlbGVjdGluZyB0aGUgTWVzc2FnZUJvZHlXcml0ZXIuIExlYXZpbmcgdGhlIGRlZmluaXRpb24gZXhwbGljaXQgZm9yIGJyb2FkZXIKKyAgICAgICAgLy8gY29tcGF0aWJpbGl0eS4KKyAgICAgICAgYXNzZXJ0Qm9va3N0b3JlSHRtbFJlc3BvbnNlKHRhcmdldCgpLnJlcXVlc3QoTWVkaWFUeXBlLlRFWFRfSFRNTCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlQXNYbWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQm9va3N0b3JlIHJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgiYXBwbGljYXRpb24veG1sIikuZ2V0KEJvb2tzdG9yZS5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiU2hvdWxkIGhhdmUgcmV0dXJuZWQgYSBib29rc3RvcmUhIiwgcmVzcG9uc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoImJvb2tzdG9yZSBuYW1lIiwgIkN6ZWNoIEJvb2tzdG9yZSIsIHJlc3BvbnNlLmdldE5hbWUoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VBc0h0bWxVc2luZ1dlYktpdEFjY2VwdEhlYWRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgKKyAgICAgICAgICAgICAgICAidGV4dC9odG1sIiwKKyAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24veGh0bWwreG1sIiwKKyAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24veG1sO3E9MC45IiwKKyAgICAgICAgICAgICAgICAiKi8qO3E9MC44IikuZ2V0KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0Qm9va3N0b3JlSHRtbFJlc3BvbnNlKHJlc3BvbnNlKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgdm9pZCBhc3NlcnRCb29rc3RvcmVIdG1sUmVzcG9uc2UoU3RyaW5nIHJlc3BvbnNlKSB7CisgICAgICAgIGFzc2VydEh0bWxSZXNwb25zZShyZXNwb25zZSk7CisgICAgICAgIGFzc2VydFJlc3BvbnNlQ29udGFpbnMocmVzcG9uc2UsICJCb29rc3RvcmUiKTsKKyAgICAgICAgYXNzZXJ0UmVzcG9uc2VDb250YWlucyhyZXNwb25zZSwgIkl0ZW0gTGlzdCIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0zL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMy9JdGVtSVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzMvSXRlbUlUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYzNlMzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzMvSXRlbUlUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsMTAwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfbXZjXzM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X212Y18zLnJlc291cmNlLkJvb2s7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworCitwdWJsaWMgY2xhc3MgSXRlbUlUQ2FzZSBleHRlbmRzIFRlc3RTdXBwb3J0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlQXNIdG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIC8vIE5PVEU6IEh0dHBVcmxDb25uZWN0b3Igc2VuZHMgc2V2ZXJhbCBhY2NlcHRlZCB0eXBlcyBieSBkZWZhdWx0IHdoZW4gbm90IGV4cGxpY2l0bHkgc2V0IGJ5IHRoZSBjYWxsZXIuCisgICAgICAgIC8vIEluIHN1Y2ggY2FzZSwgdGhlIC5hY2NlcHQoInRleHQvaHRtbCIpIGNhbGwgaXMgbm90IG5lY2Vzc2FyeS4gSG93ZXZlciwgb3RoZXIgY29ubmVjdG9ycyBhY3QgaW4gYSBkaWZmZXJlbnQgd2F5IGFuZAorICAgICAgICAvLyB0aGlzIGxlYWRzIGluIGRpZmZlcmVudCBiZWhhdmlvdXIgd2hlbiBzZWxlY3RpbmcgdGhlIE1lc3NhZ2VCb2R5V3JpdGVyLiBMZWF2aW5nIHRoZSBkZWZpbml0aW9uIGV4cGxpY2l0IGZvciBicm9hZGVyCisgICAgICAgIC8vIGNvbXBhdGliaWxpdHkuCisgICAgICAgIGZpbmFsIFN0cmluZyByZXNwb25zZSA9IGl0ZW0xcmVzb3VyY2UoKS5yZXF1ZXN0KE1lZGlhVHlwZS5URVhUX0hUTUwpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRJdGVtSHRtbFJlc3BvbnNlKHJlc3BvbnNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUFzSHRtbFV0ZjgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSBpdGVtMXJlc291cmNlKCkucGF0aCgidXRmIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBmaW5hbCBTdHJpbmcgaHRtbCA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRJdGVtSHRtbFJlc3BvbnNlKGh0bWwpOworICAgICAgICBhc3NlcnRSZXNwb25zZUNvbnRhaW5zKGh0bWwsICJIYVx1MDE2MWVrIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VBc0h0bWxJc284ODU5MigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IGl0ZW0xcmVzb3VyY2UoKS5wYXRoKCJpc28iKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIHJlc3BvbnNlLmJ1ZmZlckVudGl0eSgpOworCisgICAgICAgIGZpbmFsIFN0cmluZyBodG1sVXRmOCA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBhc3NlcnRJdGVtSHRtbFJlc3BvbnNlKGh0bWxVdGY4KTsKKyAgICAgICAgYXNzZXJ0RmFsc2UoIlJlc3BvbnNlIHNob3VsZG4ndCBjb250YWluIEhhXHUwMTYxZWsgYnV0IHdhczogIiArIGh0bWxVdGY4LCBodG1sVXRmOC5jb250YWlucygiSGFcdTAxNjFlayIpKTsKKworICAgICAgICBmaW5hbCBieXRlW10gYnl0ZXMgPSByZXNwb25zZS5yZWFkRW50aXR5KGJ5dGVbXS5jbGFzcyk7CisgICAgICAgIGZpbmFsIFN0cmluZyBodG1sSXNvID0gbmV3IFN0cmluZyhieXRlcywgIklTTy04ODU5LTIiKTsKKworICAgICAgICBhc3NlcnRJdGVtSHRtbFJlc3BvbnNlKGh0bWxJc28pOworICAgICAgICBhc3NlcnRGYWxzZSgiUmVzcG9uc2Ugc2hvdWxkbid0IGNvbnRhaW4gSGFcdTAxNjFlayBidXQgd2FzOiAiICsgaHRtbElzbywgaHRtbElzby5jb250YWlucygiSGFcdTAxNjFlayIpKTsKKyAgICAgICAgYXNzZXJ0UmVzcG9uc2VDb250YWlucyhodG1sSXNvLCBuZXcgU3RyaW5nKCJIYVx1MDE2MWVrIi5nZXRCeXRlcygpLCAiSVNPLTg4NTktMiIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUFzWG1sKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyB0ZXh0ID0gaXRlbTFyZXNvdXJjZSgpLnJlcXVlc3QoImFwcGxpY2F0aW9uL3htbCIpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkl0ZW0gWE1MIGlzOiAiICsgdGV4dCk7CisKKyAgICAgICAgZmluYWwgQm9vayByZXNwb25zZSA9IGl0ZW0xcmVzb3VyY2UoKS5yZXF1ZXN0KCJhcHBsaWNhdGlvbi94bWwiKS5nZXQoQm9vay5jbGFzcyk7CisgICAgICAgIGFzc2VydE5vdE51bGwoIlNob3VsZCBoYXZlIHJldHVybmVkIGFuIGl0ZW0hIiwgcmVzcG9uc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoIml0ZW0gdGl0bGUiLCAiU3ZlamsiLCByZXNwb25zZS5nZXRUaXRsZSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZUFzSHRtbFVzaW5nV2ViS2l0QWNjZXB0SGVhZGVycygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgcmVzcG9uc2UgPSBpdGVtMXJlc291cmNlKCkucmVxdWVzdCgKKyAgICAgICAgICAgICAgICAidGV4dC9odG1sIiwKKyAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24veGh0bWwreG1sIiwKKyAgICAgICAgICAgICAgICAiYXBwbGljYXRpb24veG1sO3E9MC45IiwKKyAgICAgICAgICAgICAgICAiKi8qO3E9MC44IikuZ2V0KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0SXRlbUh0bWxSZXNwb25zZShyZXNwb25zZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgYXNzZXJ0SXRlbUh0bWxSZXNwb25zZShmaW5hbCBTdHJpbmcgcmVzcG9uc2UpIHsKKyAgICAgICAgYXNzZXJ0SHRtbFJlc3BvbnNlKHJlc3BvbnNlKTsKKyAgICAgICAgYXNzZXJ0UmVzcG9uc2VDb250YWlucyhyZXNwb25zZSwgIjx0aXRsZT5Cb29rPC90aXRsZT4iKTsKKyAgICAgICAgYXNzZXJ0UmVzcG9uc2VDb250YWlucyhyZXNwb25zZSwgIjxoMT5TdmVqazwvaDE+Iik7CisgICAgfQorCisgICAgcHJvdGVjdGVkIFdlYlRhcmdldCBpdGVtMXJlc291cmNlKCkgeworICAgICAgICByZXR1cm4gdGFyZ2V0KCkucGF0aCgiL2l0ZW1zLzEiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzMvVGVzdFN1cHBvcnQuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LW12Yy0zL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9tdmNfMy9UZXN0U3VwcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MTIxZWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1tdmMtMy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfbXZjXzMvVGVzdFN1cHBvcnQuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfbXZjXzM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROb3ROdWxsOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogQSBiYXNlIGNsYXNzIGZvciB0ZXN0IGNhc2VzIHdoaWNoIGJvb3RzIHVwIGEgR2xhc3NGaXNoIHNlcnZlciBmb3IgaW4gY29udGFpbmVyIHRlc3Rpbmcgb2YgUkVTVGZ1bCByZXNvdXJjZXMuCisgKgorICogQGF1dGhvciBKYW1lcyBTdHJhY2hhbgorICogQGF1dGhvciBOYXJlc2gKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIFRlc3RTdXBwb3J0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuRFVNUF9FTlRJVFkpOworICAgICAgICByZXR1cm4gbmV3IE15QXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydEh0bWxSZXNwb25zZShmaW5hbCBTdHJpbmcgcmVzcG9uc2UpIHsKKyAgICAgICAgYXNzZXJ0Tm90TnVsbCgiTm8gdGV4dCByZXR1cm5lZCEiLCByZXNwb25zZSk7CisKKyAgICAgICAgYXNzZXJ0UmVzcG9uc2VDb250YWlucyhyZXNwb25zZSwgIjxodG1sPiIpOworICAgICAgICBhc3NlcnRSZXNwb25zZUNvbnRhaW5zKHJlc3BvbnNlLCAiPC9odG1sPiIpOworICAgIH0KKworICAgIHByb3RlY3RlZCB2b2lkIGFzc2VydFJlc3BvbnNlQ29udGFpbnMoZmluYWwgU3RyaW5nIHJlc3BvbnNlLCBmaW5hbCBTdHJpbmcgdGV4dCkgeworICAgICAgICBhc3NlcnRUcnVlKCJSZXNwb25zZSBzaG91bGQgY29udGFpbiAiICsgdGV4dCArICIgYnV0IHdhczogIiArIHJlc3BvbnNlLCByZXNwb25zZS5jb250YWlucyh0ZXh0KSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtcmVsb2FkL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1yZWxvYWQvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWRlODk3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtcmVsb2FkL3BvbS54bWwKQEAgLTAsMCArMSw2NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtMi41LXJlbG9hZDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1zZXJ2bGV0LTIuNS1yZWxvYWQ8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+U2VydmxldCBpbnRlZ3JhdGlvbiB0ZXN0IC0gc2VydmxldC0yLjUtcmVsb2FkIC0gcmVsb2FkIHJlc291cmNlIHRyaWdnZXJzIGFwcGxpY2F0aW9uIHJlbG9hZDwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LXJlbG9hZC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfY29uZmlnX3JlbG9hZC9Bbm90aGVyUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LXJlbG9hZC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfY29uZmlnX3JlbG9hZC9Bbm90aGVyUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWUyOGVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtcmVsb2FkL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9jb25maWdfcmVsb2FkL0Fub3RoZXJSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9jb25maWdfcmVsb2FkOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoImFub3RoZXIiKQorcHVibGljIGNsYXNzIEFub3RoZXJSZXNvdXJjZSB7CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgcmV0dXJuICJBbm90aGVyIHJlc291cmNlIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1yZWxvYWQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2NvbmZpZ19yZWxvYWQvSGVsbG9Xb3JsZFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1yZWxvYWQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2NvbmZpZ19yZWxvYWQvSGVsbG9Xb3JsZFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZkY2I2MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LXJlbG9hZC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfY29uZmlnX3JlbG9hZC9IZWxsb1dvcmxkUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfY29uZmlnX3JlbG9hZDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJoZWxsb3dvcmxkIikKK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkUmVzb3VyY2UgeworCisgICAgQEdFVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgIHJldHVybiAiSGVsbG8gV29ybGQhICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1yZWxvYWQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2NvbmZpZ19yZWxvYWQvUmVsb2FkQ29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXIuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LXJlbG9hZC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfY29uZmlnX3JlbG9hZC9SZWxvYWRDb250YWluZXJMaWZlY3ljbGVMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlZWUyMDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1yZWxvYWQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2NvbmZpZ19yZWxvYWQvUmVsb2FkQ29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfY29uZmlnX3JlbG9hZDsKKworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQWJzdHJhY3RDb250YWluZXJMaWZlY3ljbGVMaXN0ZW5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbnRhaW5lcjsKKworLyoqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKi8KK0BQcm92aWRlcgorcHVibGljIGNsYXNzIFJlbG9hZENvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyIGV4dGVuZHMgQWJzdHJhY3RDb250YWluZXJMaWZlY3ljbGVMaXN0ZW5lciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBDb250YWluZXIgY29udGFpbmVyOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25TdGFydHVwKGZpbmFsIENvbnRhaW5lciBjb250YWluZXIpIHsKKyAgICAgICAgUmVsb2FkQ29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXIuc2V0Q29udGFpbmVyKGNvbnRhaW5lcik7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBDb250YWluZXIgZ2V0Q29udGFpbmVyKCkgeworICAgICAgICByZXR1cm4gY29udGFpbmVyOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRDb250YWluZXIoZmluYWwgQ29udGFpbmVyIGNvbnRhaW5lcikgeworICAgICAgICBSZWxvYWRDb250YWluZXJMaWZlY3ljbGVMaXN0ZW5lci5jb250YWluZXIgPSBjb250YWluZXI7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1yZWxvYWQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2NvbmZpZ19yZWxvYWQvUmVsb2FkUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LXJlbG9hZC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfY29uZmlnX3JlbG9hZC9SZWxvYWRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyYzFjNDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1yZWxvYWQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzI1X2NvbmZpZ19yZWxvYWQvUmVsb2FkUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfY29uZmlnX3JlbG9hZDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCisvKioKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJyZWxvYWQiKQorcHVibGljIGNsYXNzIFJlbG9hZFJlc291cmNlIHsKKworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgUmVsb2FkQ29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXIuZ2V0Q29udGFpbmVyKCkucmVsb2FkKAorICAgICAgICAgICAgICAgICAgICBuZXcgUmVzb3VyY2VDb25maWcoSGVsbG9Xb3JsZFJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbG9hZFJlc291cmNlLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFub3RoZXJSZXNvdXJjZS5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWxvYWRDb250YWluZXJMaWZlY3ljbGVMaXN0ZW5lci5jbGFzcykKKyAgICAgICAgICAgICk7CisgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAiUmVsb2FkIHJlc291cmNlIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1yZWxvYWQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LXJlbG9hZC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0YTBmOWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTIuNS1yZWxvYWQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDM1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjIuNSIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCI+CisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SmVyc2V5UmVsb2FkU2VydmxldDwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amVyc2V5LmNvbmZpZy5zZXJ2ZXIucHJvdmlkZXIuY2xhc3NuYW1lczwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X2NvbmZpZ19yZWxvYWQuUmVsb2FkUmVzb3VyY2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9jb25maWdfcmVsb2FkLkhlbGxvV29ybGRSZXNvdXJjZQorICAgICAgICAgICAgICAgIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfMjVfY29uZmlnX3JlbG9hZC5SZWxvYWRSZXNvdXJjZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzI1X2NvbmZpZ19yZWxvYWQuUmVsb2FkQ29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXI8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkplcnNleVJlbG9hZFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LXJlbG9hZC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfY29uZmlnX3JlbG9hZC9SZWxvYWRUZXN0SVQuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMi41LXJlbG9hZC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfMjVfY29uZmlnX3JlbG9hZC9SZWxvYWRUZXN0SVQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjIyNjE3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0yLjUtcmVsb2FkL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8yNV9jb25maWdfcmVsb2FkL1JlbG9hZFRlc3RJVC5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8yNV9jb25maWdfcmVsb2FkOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgUmVsb2FkVGVzdElUIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEhlbGxvV29ybGRSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWxvYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJoZWxsb3dvcmxkIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiSGVsbG8gV29ybGQhICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoImFub3RoZXIiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDQsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKworICAgICAgICByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlbG9hZCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworCisgICAgICAgIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgiYW5vdGhlciIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1hc3luYy9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWFzeW5jL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk1OTQ5MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1hc3luYy9wb20ueG1sCkBAIC0wLDAgKzEsNjQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LTMtYXN5bmM8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tc2VydmxldC0zLWFzeW5jPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPlNlcnZsZXQgaW50ZWdyYXRpb24gdGVzdCAtIHNlcnZsZXQtMy1hc3luYyAtIGNvbmZpZ3VyZWQgdmlhIGpheC1ycyBhcHBsaWNhdGlvbiBhbm5vdGF0ZWQgd2l0aCBAamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtYXN5bmMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfYXN5bmMvQXN5bmNTZXJ2bGV0UmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1hc3luYy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19hc3luYy9Bc3luY1NlcnZsZXRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmOTYwNTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtYXN5bmMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfYXN5bmMvQXN5bmNTZXJ2bGV0UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDEwNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfYXN5bmM7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5BcnJheUJsb2NraW5nUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQmxvY2tpbmdRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQXN5bmNSZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuU3VzcGVuZGVkOworCisvKioKKyAqIEFzeW5jaHJvbm91cyBzZXJ2bGV0LWRlcGxveWVkIHJlc291cmNlLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJhc3luYyIpCitwdWJsaWMgY2xhc3MgQXN5bmNTZXJ2bGV0UmVzb3VyY2UgeworICAgIC8qKgorICAgICAqIEhlbGxvIHdvcmxkIG1lc3NhZ2UuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVMTE9fQVNZTkNfV09STEQgPSAiSGVsbG8gQXN5bmMgV29ybGQhIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQU5DRUxFRCA9ICJDYW5jZWxlZCI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBCbG9ja2luZ1F1ZXVlPENhbmNlbGVkUmVxdWVzdD4gY2FuY2VsaW5nUXVldWUgPSBuZXcgQXJyYXlCbG9ja2luZ1F1ZXVlPENhbmNlbGVkUmVxdWVzdD4oNSk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDYW5jZWxlZFJlcXVlc3QgeworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBpZDsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBBc3luY1Jlc3BvbnNlIGFzeW5jUmVzcG9uc2U7CisKKyAgICAgICAgcHJpdmF0ZSBDYW5jZWxlZFJlcXVlc3QoU3RyaW5nIGlkLCBBc3luY1Jlc3BvbnNlIGFzeW5jUmVzcG9uc2UpIHsKKyAgICAgICAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICAgICAgICAgIHRoaXMuYXN5bmNSZXNwb25zZSA9IGFzeW5jUmVzcG9uc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGFzeW5jICJIZWxsbyBXb3JsZCIgbWVzc2FnZS4KKyAgICAgKi8KKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgdm9pZCBnZXQoQFN1c3BlbmRlZCBmaW5hbCBBc3luY1Jlc3BvbnNlIGFyKSB7CisgICAgICAgIEV4ZWN1dG9ycy5uZXdTaW5nbGVUaHJlYWRFeGVjdXRvcigpLmV4ZWN1dGUobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMCk7CisgICAgICAgICAgICAgICAgICAgIGFyLnJlc3VtZShIRUxMT19BU1lOQ19XT1JMRCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgY2FuY2VsZWQgcmVxdWVzdC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpZCByZXF1ZXN0IGlkLgorICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaW4gY2FzZSBvZiBub3QgYmVpbmcgYWJsZSB0byBwdXQgdGhlIHJlcXVlc3QKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGFuIGludGVybmFsIHF1ZXVlIGZvciBjYW5jZWxpbmcuCisgICAgICovCisgICAgQEdFVAorICAgIEBQYXRoKCJjYW5jZWxlZCIpCisgICAgcHVibGljIHZvaWQgZ2V0Q2FuY2VsZWQoQFN1c3BlbmRlZCBmaW5hbCBBc3luY1Jlc3BvbnNlIGFyLCBAUXVlcnlQYXJhbSgiaWQiKSBmaW5hbCBTdHJpbmcgaWQpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGNhbmNlbGluZ1F1ZXVlLnB1dChuZXcgQ2FuY2VsZWRSZXF1ZXN0KGlkLCBhcikpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENhbmNlbCBhIHJlcXVlc3QgdGhhdCBpcyBvbiB0b3Agb2YgdGhlIGNhbmNlbGluZyBxdWV1ZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbm90aWZpY2F0aW9uIG1lc3NhZ2UgYWJvdXQgc3VjY2Vzc2Z1bCByZXF1ZXN0IGNhbmNlbGluZy4KKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGluIGNhc2Ugb2Ygbm90IGJlaW5nIGFibGUgdG8gdGFrZSBhIGNhbmNlbGxlZCByZXF1ZXN0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGFuIGludGVybmFsIGNhbmNlbGluZyBxdWV1ZS4KKyAgICAgKi8KKyAgICBAUE9TVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgQFBhdGgoImNhbmNlbGVkIikKKyAgICBwdWJsaWMgU3RyaW5nIGNhbmNlbChTdHJpbmcgcmVxdWVzdElkKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBDYW5jZWxlZFJlcXVlc3QgY2FuY2VsZWRSZXF1ZXN0ID0gY2FuY2VsaW5nUXVldWUudGFrZSgpOworICAgICAgICBjYW5jZWxlZFJlcXVlc3QuYXN5bmNSZXNwb25zZS5jYW5jZWwoKTsKKworICAgICAgICByZXR1cm4gQ0FOQ0VMRUQgKyAiICIgKyBjYW5jZWxlZFJlcXVlc3QuaWQgKyAiIGJ5IFBPU1QgIiArIHJlcXVlc3RJZDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1hc3luYy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19hc3luYy9Bc3luY1RpbWVvdXRSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWFzeW5jL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2FzeW5jL0FzeW5jVGltZW91dFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjNjMDAwYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1hc3luYy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19hc3luYy9Bc3luY1RpbWVvdXRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2FzeW5jOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQXJyYXlCbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkJsb2NraW5nUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Bc3luY1Jlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5TdXNwZW5kZWQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlRpbWVvdXRIYW5kbGVyOworCisvKioKKyAqIEFzeW5jaHJvbm91cyBzZXJ2bGV0LWRlcGxveWVkIHJlc291cmNlIGZvciB0ZXN0aW5nIHtAbGluayBqYXZheC53cy5ycy5jb250YWluZXIuQXN5bmNSZXNwb25zZSBhc3luYyByZXNwb25zZX0gdGltZW91dHMuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BQYXRoKCJ0aW1lb3V0IikKK3B1YmxpYyBjbGFzcyBBc3luY1RpbWVvdXRSZXNvdXJjZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCbG9ja2luZ1F1ZXVlPEFzeW5jUmVzcG9uc2U+IHF1ZXVlID0gbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxBc3luY1Jlc3BvbnNlPigxKTsKKworICAgIEBHRVQKKyAgICBAUGF0aCgic3VzcGVuZCIpCisgICAgcHVibGljIHZvaWQgc3VzcGVuZChAU3VzcGVuZGVkIGZpbmFsIEFzeW5jUmVzcG9uc2UgYXN5bmNSZXNwb25zZSkgeworICAgICAgICBxdWV1ZS5hZGQoYXN5bmNSZXNwb25zZSk7CisgICAgfQorCisgICAgQFBPU1QKKyAgICBAUGF0aCgidGltZW91dCIpCisgICAgcHVibGljIHZvaWQgc2V0VGltZU91dChmaW5hbCBJbnRlZ2VyIG1pbGxpcykgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQXN5bmNSZXNwb25zZSBhc3luY1Jlc3BvbnNlID0gcXVldWUudGFrZSgpOworCisgICAgICAgIGZpbmFsIGJvb2xlYW4gdGltZW91dDEgPSBhc3luY1Jlc3BvbnNlLnNldFRpbWVvdXQobWlsbGlzLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICBhc3luY1Jlc3BvbnNlLnNldFRpbWVvdXRIYW5kbGVyKG5ldyBUaW1lb3V0SGFuZGxlcigpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVUaW1lb3V0KGZpbmFsIEFzeW5jUmVzcG9uc2UgYXN5bmNSZXNwb25zZSkgeworICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gdGltZW91dDIgPSBhc3luY1Jlc3BvbnNlLnNldFRpbWVvdXQobWlsbGlzLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICAgICAgICAgIGFzeW5jUmVzcG9uc2Uuc2V0VGltZW91dEhhbmRsZXIobmV3IFRpbWVvdXRIYW5kbGVyKCkgeworCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVUaW1lb3V0KGZpbmFsIEFzeW5jUmVzcG9uc2UgYXN5bmNSZXNwb25zZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmNSZXNwb25zZS5yZXN1bWUoInRpbWVvdXQxPSIgKyB0aW1lb3V0MSArICJfdGltZW91dDI9IiArIHRpbWVvdXQyICsgIl9oYW5kbGVkIik7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3luY1Jlc3BvbnNlLmNhbmNlbCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1hc3luYy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19hc3luYy9TZXJ2bGV0M0FzeW5jLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtYXN5bmMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfYXN5bmMvU2VydmxldDNBc3luYy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ODdhMWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtYXN5bmMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfYXN5bmMvU2VydmxldDNBc3luYy5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2FzeW5jOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCisvKioKKyAqIEFzeW5jaHJvbm91cyBzZXJ2bGV0LWRlcGxveWVkIHJlc291cmNlIGFwcGxpY2F0aW9uLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK0BBcHBsaWNhdGlvblBhdGgoIi8iKQorcHVibGljIGNsYXNzIFNlcnZsZXQzQXN5bmMgZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IGhhc2hTZXQgPSBuZXcgSGFzaFNldDxDbGFzczw/Pj4oKTsKKyAgICAgICAgaGFzaFNldC5hZGQoQXN5bmNTZXJ2bGV0UmVzb3VyY2UuY2xhc3MpOworICAgICAgICBoYXNoU2V0LmFkZChBc3luY1RpbWVvdXRSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIHJldHVybiBoYXNoU2V0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1hc3luYy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19hc3luYy9Bc3luY1NlcnZsZXRSZXNvdXJjZUlUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWFzeW5jL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2FzeW5jL0FzeW5jU2VydmxldFJlc291cmNlSVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNkZmI5YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1hc3luYy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19hc3luYy9Bc3luY1NlcnZsZXRSZXNvdXJjZUlUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsMjk0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19hc3luYzsKKworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ29uY3VycmVudEhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5ndWF2YS5UaHJlYWRGYWN0b3J5QnVpbGRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuSmVyc2V5UHJvY2Vzc2luZ1VuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBBc3luY2hyb25vdXMgc2VydmxldC1kZXBsb3llZCByZXNvdXJjZSB0ZXN0LgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBBc3luY1NlcnZsZXRSZXNvdXJjZUlUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEFzeW5jU2VydmxldFJlc291cmNlSVRDYXNlLmNsYXNzLmdldE5hbWUoKSk7CisKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSZXNwb25zZVJlY29yZCB7CisgICAgICAgIGZpbmFsIGludCBzdGF0dXM7CisgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlOworCisgICAgICAgIHByaXZhdGUgUmVzcG9uc2VSZWNvcmQoaW50IHN0YXR1cywgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzOworICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1cyArICIgOiBcIiIgKyBtZXNzYWdlICsgJ1wiJzsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgQXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgYXN5bmNocm9ub3VzIHNlcnZsZXQtZGVwbG95ZWQgcmVzb3VyY2UuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGluIGNhc2UgdGhlIHdhaXRpbmcgZm9yIGFsbCByZXF1ZXN0cyB0byBjb21wbGV0ZSB3YXMgaW50ZXJydXB0ZWQuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNTZXJ2bGV0KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHJlc291cmNlVGFyZ2V0ID0gdGFyZ2V0KCJhc3luYyIpOworICAgICAgICByZXNvdXJjZVRhcmdldC5yZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIGZpbmFsIFN0cmluZyBleHBlY3RlZFJlc3BvbnNlID0gQXN5bmNTZXJ2bGV0UmVzb3VyY2UuSEVMTE9fQVNZTkNfV09STEQ7CisKKyAgICAgICAgZmluYWwgaW50IE1BWF9NRVNTQUdFUyA9IDUwOworICAgICAgICBmaW5hbCBpbnQgTEFUQ0hfV0FJVF9USU1FT1VUID0gMTAgKiBnZXRBc3luY1RpbWVvdXRNdWx0aXBsaWVyKCk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gZGVidWdNb2RlID0gZmFsc2U7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gc2VxdWVudGlhbEdldCA9IGZhbHNlOworICAgICAgICBmaW5hbCBPYmplY3Qgc2VxdWVudGlhbEdldExvY2sgPSBuZXcgT2JqZWN0KCk7CisKKyAgICAgICAgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGV4ZWN1dG9yID0gRXhlY3V0b3JzLm5ld0NhY2hlZFRocmVhZFBvb2wobmV3IFRocmVhZEZhY3RvcnlCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0TmFtZUZvcm1hdCgiYXN5bmMtcmVzb3VyY2UtdGVzdC0lZCIpCisgICAgICAgICAgICAgICAgLnNldFVuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcihuZXcgSmVyc2V5UHJvY2Vzc2luZ1VuY2F1Z2h0RXhjZXB0aW9uSGFuZGxlcigpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBmaW5hbCBNYXA8SW50ZWdlciwgUmVzcG9uc2VSZWNvcmQ+IGdldFJlc3BvbnNlcyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDxJbnRlZ2VyLCBSZXNwb25zZVJlY29yZD4oKTsKKworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBnZXRSZXF1ZXN0TGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goTUFYX01FU1NBR0VTKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfTUVTU0FHRVM7IGkrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCByZXF1ZXN0SWQgPSBpOworICAgICAgICAgICAgICAgIGV4ZWN1dG9yLnN1Ym1pdChuZXcgUnVubmFibGUoKSB7CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vbm9pbnNwZWN0aW9uIFBvaW50bGVzc0Jvb2xlYW5FeHByZXNzaW9uLENvbnN0YW50Q29uZGl0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnTW9kZSB8fCBzZXF1ZW50aWFsR2V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChzZXF1ZW50aWFsR2V0TG9jaykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIGdldCgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSByZXNvdXJjZVRhcmdldC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVzcG9uc2VzLnB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZXNwb25zZVJlY29yZChyZXNwb25zZS5nZXRTdGF0dXMoKSwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlcXVlc3RMYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvL25vaW5zcGVjdGlvbiBDb25zdGFudENvbmRpdGlvbnMKKyAgICAgICAgICAgIGlmIChkZWJ1Z01vZGUpIHsKKyAgICAgICAgICAgICAgICBnZXRSZXF1ZXN0TGF0Y2guYXdhaXQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiV2FpdGluZyBmb3IgYWxsIEdFVCByZXF1ZXN0cyB0byBjb21wbGV0ZSBoYXMgdGltZWQgb3V0LiIsIGdldFJlcXVlc3RMYXRjaC5hd2FpdChMQVRDSF9XQUlUX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgICAgICAgICBUaW1lVW5pdC5TRUNPTkRTKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBleGVjdXRvci5zaHV0ZG93bk5vdygpOworICAgICAgICB9CisKKyAgICAgICAgU3RyaW5nQnVpbGRlciBtZXNzYWdlQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIGZvciAoTWFwLkVudHJ5PEludGVnZXIsIFJlc3BvbnNlUmVjb3JkPiBnZXRSZXNwb25zZUVudHJ5IDogZ2V0UmVzcG9uc2VzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIG1lc3NhZ2VCdWlsZGVyLmFwcGVuZCgiR0VUIHJlc3BvbnNlIGZvciBtZXNzYWdlICIpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoZ2V0UmVzcG9uc2VFbnRyeS5nZXRLZXkoKSkuYXBwZW5kKCI6ICIpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoZ2V0UmVzcG9uc2VFbnRyeS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCkpLmFwcGVuZCgnXG4nKTsKKyAgICAgICAgfQorICAgICAgICBMT0dHRVIuaW5mbyhtZXNzYWdlQnVpbGRlci50b1N0cmluZygpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX01FU1NBR0VTLCBnZXRSZXNwb25zZXMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChNYXAuRW50cnk8SW50ZWdlciwgUmVzcG9uc2VSZWNvcmQ+IGVudHJ5IDogZ2V0UmVzcG9uc2VzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgIlVuZXhwZWN0ZWQgR0VUIHJlc3BvbnNlIHN0YXR1cyBmb3IgcmVxdWVzdCAiICsgZW50cnkuZ2V0S2V5KCksCisgICAgICAgICAgICAgICAgICAgIDIwMCwgZW50cnkuZ2V0VmFsdWUoKS5zdGF0dXMpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBHRVQgcmVzcG9uc2UgbWVzc2FnZSBmb3IgcmVxdWVzdCAiICsgZW50cnkuZ2V0S2V5KCksCisgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkUmVzcG9uc2UsIGVudHJ5LmdldFZhbHVlKCkubWVzc2FnZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IGNhbmNlbGluZyBvZiBhbiBhc3luYyByZXF1ZXN0IHRvIGEgc2VydmxldC1kZXBsb3llZCByZXNvdXJjZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaW4gY2FzZSB0aGUgd2FpdGluZyBmb3IgYWxsIHJlcXVlc3RzIHRvIGNvbXBsZXRlIHdhcyBpbnRlcnJ1cHRlZC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luY1JlcXVlc3RDYW5jZWxpbmcoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgcmVzb3VyY2VUYXJnZXQgPSB0YXJnZXQoImFzeW5jL2NhbmNlbGVkIik7CisgICAgICAgIHJlc291cmNlVGFyZ2V0LnJlZ2lzdGVyKExvZ2dpbmdGZWF0dXJlLmNsYXNzKTsKKworICAgICAgICBmaW5hbCBpbnQgTUFYX01FU1NBR0VTID0gMTA7CisgICAgICAgIGZpbmFsIGludCBMQVRDSF9XQUlUX1RJTUVPVVQgPSAxMCAqIGdldEFzeW5jVGltZW91dE11bHRpcGxpZXIoKTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBkZWJ1Z01vZGUgPSBmYWxzZTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBzZXF1ZW50aWFsR2V0ID0gZmFsc2U7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gc2VxdWVudGlhbFBvc3QgPSBmYWxzZTsKKyAgICAgICAgZmluYWwgT2JqZWN0IHNlcXVlbnRpYWxHZXRMb2NrID0gbmV3IE9iamVjdCgpOworICAgICAgICBmaW5hbCBPYmplY3Qgc2VxdWVudGlhbFBvc3RMb2NrID0gbmV3IE9iamVjdCgpOworCisgICAgICAgIGZpbmFsIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvciA9IEV4ZWN1dG9ycy5uZXdDYWNoZWRUaHJlYWRQb29sKG5ldyBUaHJlYWRGYWN0b3J5QnVpbGRlcigpCisgICAgICAgICAgICAgICAgLnNldE5hbWVGb3JtYXQoImFzeW5jLWNhbmNlbGVkLXJlc291cmNlLXRlc3QtJWQiKQorICAgICAgICAgICAgICAgIC5zZXRVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIobmV3IEplcnNleVByb2Nlc3NpbmdVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXIoKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgZmluYWwgTWFwPEludGVnZXIsIFN0cmluZz4gcG9zdFJlc3BvbnNlcyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+KCk7CisgICAgICAgIGZpbmFsIE1hcDxJbnRlZ2VyLCBTdHJpbmc+IGdldFJlc3BvbnNlcyA9IG5ldyBDb25jdXJyZW50SGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+KCk7CisKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggcG9zdFJlcXVlc3RMYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaChNQVhfTUVTU0FHRVMpOworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBnZXRSZXF1ZXN0TGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goTUFYX01FU1NBR0VTKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfTUVTU0FHRVM7IGkrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCByZXF1ZXN0SWQgPSBpOworICAgICAgICAgICAgICAgIGV4ZWN1dG9yLnN1Ym1pdChuZXcgUnVubmFibGUoKSB7CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vbm9pbnNwZWN0aW9uIFBvaW50bGVzc0Jvb2xlYW5FeHByZXNzaW9uLENvbnN0YW50Q29uZGl0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnTW9kZSB8fCBzZXF1ZW50aWFsR2V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChzZXF1ZW50aWFsR2V0TG9jaykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIGdldCgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJlc3BvbnNlID0gcmVzb3VyY2VUYXJnZXQucXVlcnlQYXJhbSgiaWQiLCByZXF1ZXN0SWQpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRSZXNwb25zZXMucHV0KHJlcXVlc3RJZCwgcmVzcG9uc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoV2ViQXBwbGljYXRpb25FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IGV4LmdldFJlc3BvbnNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVzcG9uc2VzLnB1dChyZXF1ZXN0SWQsIHJlc3BvbnNlLmdldFN0YXR1cygpICsgIjogIiArIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlcXVlc3RMYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIGV4ZWN1dG9yLnN1Ym1pdChuZXcgUnVubmFibGUoKSB7CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vbm9pbnNwZWN0aW9uIFBvaW50bGVzc0Jvb2xlYW5FeHByZXNzaW9uLENvbnN0YW50Q29uZGl0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnTW9kZSB8fCBzZXF1ZW50aWFsUG9zdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoc2VxdWVudGlhbFBvc3RMb2NrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgdm9pZCBwb3N0KCkgdGhyb3dzIFByb2Nlc3NpbmdFeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVzcG9uc2UgPSByZXNvdXJjZVRhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkudGV4dCgiIiArIHJlcXVlc3RJZCksIFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFJlc3BvbnNlcy5wdXQocmVxdWVzdElkLCByZXNwb25zZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RSZXF1ZXN0TGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9ub2luc3BlY3Rpb24gQ29uc3RhbnRDb25kaXRpb25zCisgICAgICAgICAgICBpZiAoZGVidWdNb2RlKSB7CisgICAgICAgICAgICAgICAgcG9zdFJlcXVlc3RMYXRjaC5hd2FpdCgpOworICAgICAgICAgICAgICAgIGdldFJlcXVlc3RMYXRjaC5hd2FpdCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJXYWl0aW5nIGZvciBhbGwgUE9TVCByZXF1ZXN0cyB0byBjb21wbGV0ZSBoYXMgdGltZWQgb3V0LiIsCisgICAgICAgICAgICAgICAgICAgICAgICBwb3N0UmVxdWVzdExhdGNoLmF3YWl0KExBVENIX1dBSVRfVElNRU9VVCwgVGltZVVuaXQuU0VDT05EUykpOworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIldhaXRpbmcgZm9yIGFsbCBHRVQgcmVxdWVzdHMgdG8gY29tcGxldGUgaGFzIHRpbWVkIG91dC4iLCBnZXRSZXF1ZXN0TGF0Y2guYXdhaXQoTEFUQ0hfV0FJVF9USU1FT1VULAorICAgICAgICAgICAgICAgICAgICAgICAgVGltZVVuaXQuU0VDT05EUykpOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZXhlY3V0b3Iuc2h1dGRvd25Ob3coKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZ0J1aWxkZXIgbWVzc2FnZUJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBmb3IgKE1hcC5FbnRyeTxJbnRlZ2VyLCBTdHJpbmc+IHBvc3RSZXNwb25zZUVudHJ5IDogcG9zdFJlc3BvbnNlcy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBtZXNzYWdlQnVpbGRlci5hcHBlbmQoIlBPU1QgcmVzcG9uc2UgZm9yIG1lc3NhZ2UgIikKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChwb3N0UmVzcG9uc2VFbnRyeS5nZXRLZXkoKSkuYXBwZW5kKCI6ICIpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQocG9zdFJlc3BvbnNlRW50cnkuZ2V0VmFsdWUoKSkuYXBwZW5kKCdcbicpOworICAgICAgICB9CisgICAgICAgIG1lc3NhZ2VCdWlsZGVyLmFwcGVuZCgnXG4nKTsKKyAgICAgICAgZm9yIChNYXAuRW50cnk8SW50ZWdlciwgU3RyaW5nPiBnZXRSZXNwb25zZUVudHJ5IDogZ2V0UmVzcG9uc2VzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIG1lc3NhZ2VCdWlsZGVyLmFwcGVuZCgiR0VUIHJlc3BvbnNlIGZvciBtZXNzYWdlICIpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoZ2V0UmVzcG9uc2VFbnRyeS5nZXRLZXkoKSkuYXBwZW5kKCI6ICIpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoZ2V0UmVzcG9uc2VFbnRyeS5nZXRWYWx1ZSgpKS5hcHBlbmQoJ1xuJyk7CisgICAgICAgIH0KKyAgICAgICAgTE9HR0VSLmluZm8obWVzc2FnZUJ1aWxkZXIudG9TdHJpbmcoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKE1BWF9NRVNTQUdFUywgcG9zdFJlc3BvbnNlcy5zaXplKCkpOworICAgICAgICBmb3IgKE1hcC5FbnRyeTxJbnRlZ2VyLCBTdHJpbmc+IHBvc3RSZXNwb25zZUVudHJ5IDogcG9zdFJlc3BvbnNlcy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJVbmV4cGVjdGVkIFBPU1Qgbm90aWZpY2F0aW9uIHJlc3BvbnNlIGZvciBtZXNzYWdlICIgKyBwb3N0UmVzcG9uc2VFbnRyeS5nZXRLZXkoKSwKKyAgICAgICAgICAgICAgICAgICAgcG9zdFJlc3BvbnNlRW50cnkuZ2V0VmFsdWUoKS5zdGFydHNXaXRoKEFzeW5jU2VydmxldFJlc291cmNlLkNBTkNFTEVEKSk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX01FU1NBR0VTLCBnZXRSZXNwb25zZXMuc2l6ZSgpKTsKKyAgICAgICAgZmluYWwgQ29sbGVjdGlvbjxJbnRlZ2VyPiBnZXRSZXNwb25zZUtleXMgPSBnZXRSZXNwb25zZXMua2V5U2V0KCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX01FU1NBR0VTOyBpKyspIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIkRldGVjdGVkIGEgR0VUIG1lc3NhZ2UgcmVzcG9uc2UgbG9zczogIiArIGksIGdldFJlc3BvbnNlS2V5cy5jb250YWlucyhpKSk7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZ2V0UmVzcG9uc2VFbnRyeSA9IGdldFJlc3BvbnNlcy5nZXQoaSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJVbmV4cGVjdGVkIGNhbmNlbGVkIEdFVCByZXNwb25zZSBzdGF0dXMgZm9yIHJlcXVlc3QgIiArIGksCisgICAgICAgICAgICAgICAgICAgIGdldFJlc3BvbnNlRW50cnkuc3RhcnRzV2l0aCgiNTAzOiAiKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtYXN5bmMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfYXN5bmMvQXN5bmNUaW1lb3V0UmVzb3VyY2VJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1hc3luYy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19hc3luYy9Bc3luY1RpbWVvdXRSZXNvdXJjZUlUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZmI2NDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtYXN5bmMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfYXN5bmMvQXN5bmNUaW1lb3V0UmVzb3VyY2VJVENhc2UuamF2YQpAQCAtMCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19hc3luYzsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBBc3luY2hyb25vdXMgc2VydmxldC1kZXBsb3llZCByZXNvdXJjZSBmb3IgdGVzdGluZyB7QGxpbmsgamF2YXgud3MucnMuY29udGFpbmVyLkFzeW5jUmVzcG9uc2UgYXN5bmMgcmVzcG9uc2V9IHRpbWVvdXRzLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgQXN5bmNUaW1lb3V0UmVzb3VyY2VJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgQXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRpbWVvdXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHJlc291cmNlVGFyZ2V0ID0gdGFyZ2V0KCJ0aW1lb3V0Iik7CisgICAgICAgIHJlc291cmNlVGFyZ2V0LnJlZ2lzdGVyKExvZ2dpbmdGZWF0dXJlLmNsYXNzKTsKKyAgICAgICAgZmluYWwgRnV0dXJlPFJlc3BvbnNlPiByZXNwb25zZUZ1dHVyZSA9IHJlc291cmNlVGFyZ2V0LnBhdGgoInN1c3BlbmQiKS5yZXF1ZXN0KCkuYXN5bmMoKS5nZXQoKTsKKworICAgICAgICAvLyBTZXQgdGltZW91dC4KKyAgICAgICAgYXNzZXJ0VGhhdChyZXNvdXJjZVRhcmdldC5wYXRoKCJ0aW1lb3V0IikucmVxdWVzdCgpLnBvc3QoRW50aXR5LnRleHQoIjUwMCIpKS5nZXRTdGF0dXMoKSwgZXF1YWxUbygyMDQpKTsKKworICAgICAgICAvLyBXYWl0IGZvciBpdC4KKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZUZ1dHVyZS5nZXQoKS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyksIGVxdWFsVG8oInRpbWVvdXQxPXRydWVfdGltZW91dDI9dHJ1ZV9oYW5kbGVkIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1jaHVua2VkLWlvL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtY2h1bmtlZC1pby9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYWE0YjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtY2h1bmtlZC1pby9wb20ueG1sCkBAIC0wLDAgKzEsNzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LTMtY2h1bmtlZC1pbzwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1zZXJ2bGV0LTMtY2h1bmtlZC1pbzwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5TZXJ2bGV0IGludGVncmF0aW9uIHRlc3QgLSBzZXJ2bGV0LTMtY2h1bmtlZC1pbzwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1tb3h5PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb25uZWN0b3JzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWdyaXp6bHktY29ubmVjdG9yPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWNodW5rZWQtaW8vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfY2h1bmtlZF9pby9BcHAuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1jaHVua2VkLWlvL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2NodW5rZWRfaW8vQXBwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ5NWM1MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1jaHVua2VkLWlvL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2NodW5rZWRfaW8vQXBwLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfY2h1bmtlZF9pbzsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CisKK2ltcG9ydCBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LkNvbnRleHRSZXNvbHZlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1veHkuanNvbi5Nb3h5SnNvbkNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKKy8qKgorICogQ2h1bmtlZCBJL08gdGVzdCBKQVgtUlMgYXBwbGljYXRpb24gY2xhc3MuCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uUGF0aCgicmVzb3VyY2VzIikKK3B1YmxpYyBjbGFzcyBBcHAgZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisKKyAgICAvKioKKyAgICAgKiBDaHVua2VkIEkvTyB0ZXN0IEpBWC1SUyBhcHBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQXBwKCkgeworICAgICAgICBzdXBlcihUZXN0UmVzb3VyY2UuY2xhc3MpOworCisgICAgICAgIHJlZ2lzdGVyKGNyZWF0ZU1veHlKc29uUmVzb2x2ZXIoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlIE1PWHkgSlNPTiBjb25maWcgY29udGV4dCByZXNvbHZlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gbmV3IE1PWHkgSlNPTiBjb25maWcgY29udGV4dCByZXNvbHZlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIENvbnRleHRSZXNvbHZlcjxNb3h5SnNvbkNvbmZpZz4gY3JlYXRlTW94eUpzb25SZXNvbHZlcigpIHsKKyAgICAgICAgZmluYWwgTWFwPFN0cmluZywgU3RyaW5nPiBuYW1lc3BhY2VQcmVmaXhNYXBwZXIgPSBuZXcgSGFzaE1hcDw+KDEpOworICAgICAgICBuYW1lc3BhY2VQcmVmaXhNYXBwZXIucHV0KCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIsICJ4c2kiKTsKKworICAgICAgICByZXR1cm4gbmV3IE1veHlKc29uQ29uZmlnKCkKKyAgICAgICAgICAgICAgICAuc2V0TmFtZXNwYWNlUHJlZml4TWFwcGVyKG5hbWVzcGFjZVByZWZpeE1hcHBlcikKKyAgICAgICAgICAgICAgICAuc2V0TmFtZXNwYWNlU2VwYXJhdG9yKCc6JykKKyAgICAgICAgICAgICAgICAucmVzb2x2ZXIoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1jaHVua2VkLWlvL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2NodW5rZWRfaW8vTWVzc2FnZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWNodW5rZWQtaW8vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfY2h1bmtlZF9pby9NZXNzYWdlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThiMzMwNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1jaHVua2VkLWlvL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2NodW5rZWRfaW8vTWVzc2FnZS5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2NodW5rZWRfaW87CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEFjY2Vzc1R5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxBY2Nlc3NvclR5cGU7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworLyoqCisgKiBNZXNzYWdlIFBPSk8uCisgKgorICogQGF1dGhvciBNYXJlayBQb3RvY2lhciAobWFyZWsucG90b2NpYXIgYXQgb3JhY2xlLmNvbSkKKyAqLworQFhtbFJvb3RFbGVtZW50CitAWG1sQWNjZXNzb3JUeXBlKFhtbEFjY2Vzc1R5cGUuRklFTEQpCitwdWJsaWMgY2xhc3MgTWVzc2FnZSB7CisKKyAgICAvKioKKyAgICAgKiBNZXNzYWdlIGlkLgorICAgICAqLworICAgIHB1YmxpYyBpbnQgaWQ7CisgICAgLyoqCisgICAgICogTWVzc2FnZSBjb250ZW50LgorICAgICAqLworICAgIHB1YmxpYyBTdHJpbmcgZGF0YTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgbWVzc2FnZS4KKyAgICAgKi8KKyAgICBwdWJsaWMgTWVzc2FnZSgpIHsKKyAgICAgICAgdGhpcy5pZCA9IC0xOworICAgICAgICB0aGlzLmRhdGEgPSAiIjsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IG1lc3NhZ2UuCisgICAgICogQHBhcmFtIGlkIG1lc3NhZ2UgaWQuCisgICAgICogQHBhcmFtIGRhdGEgbWVzc2FnZSBjb250ZW50LgorICAgICAqLworICAgIHB1YmxpYyBNZXNzYWdlKGludCBpZCwgU3RyaW5nIGRhdGEpIHsKKyAgICAgICAgaWYgKGRhdGEgPT0gbnVsbCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTWVzc2FnZSBkYXRhIG11c3Qgbm90IGJlIG51bGwuIik7CisgICAgICAgIH0KKworICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmICh0aGlzID09IG8pIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IChNZXNzYWdlKSBvOworCisgICAgICAgIGlmIChpZCAhPSBtZXNzYWdlLmlkKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFkYXRhLmVxdWFscyhtZXNzYWdlLmRhdGEpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgcmVzdWx0ID0gaWQ7CisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgZGF0YS5oYXNoQ29kZSgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiAie1wiaWRcIjoiICsgaWQgKyAiLFwiZGF0YVwiOlwiIiArIGRhdGEgKyAiXCJ9IjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtY2h1bmtlZC1pby9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19jaHVua2VkX2lvL1Rlc3RSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWNodW5rZWQtaW8vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfY2h1bmtlZF9pby9UZXN0UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDY5YTk5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWNodW5rZWQtaW8vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfY2h1bmtlZF9pby9UZXN0UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDIyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfY2h1bmtlZF9pbzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLkludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQXN5bmNSZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuU3VzcGVuZGVkOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNodW5rZWRPdXRwdXQ7CisKKy8qKgorICogVGVzdCByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiL3Rlc3QiKQorcHVibGljIGNsYXNzIFRlc3RSZXNvdXJjZSB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihUZXN0UmVzb3VyY2UuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIC8qKgorICAgICAqIEdldCBjaHVuayBzdHJlYW0gb2YgSlNPTiBkYXRhIC0gZnJvbSBKU09OIFBPSk9zLgorICAgICAqCisgICAgICogQHJldHVybiBjaHVuayBzdHJlYW0uCisgICAgICovCisgICAgQEdFVAorICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKyAgICBAUGF0aCgiZnJvbS1wb2pvIikKKyAgICBwdWJsaWMgQ2h1bmtlZE91dHB1dDxNZXNzYWdlPiBnZXRGcm9tUG9qbygpIHsKKyAgICAgICAgZmluYWwgQ2h1bmtlZE91dHB1dDxNZXNzYWdlPiBvdXRwdXQgPSBuZXcgQ2h1bmtlZE91dHB1dDw+KE1lc3NhZ2UuY2xhc3MsICJcclxuIik7CisKKyAgICAgICAgbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQud3JpdGUobmV3IE1lc3NhZ2UoaSwgInRlc3QiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMjAwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5TRVZFUkUsICJFcnJvciB3cml0aW5nIGNodW5rLiIsIGUpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5TRVZFUkUsICJTbGVlcCBpbnRlcnJ1cHRlZC4iLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuSU5GTywgIkVycm9yIGNsb3NpbmcgY2h1bmtlZCBvdXRwdXQuIiwgZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0uc3RhcnQoKTsKKworICAgICAgICByZXR1cm4gb3V0cHV0OworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBjaHVuayBzdHJlYW0gb2YgSlNPTiBkYXRhIC0gZnJvbSBzdHJpbmcuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGNodW5rIHN0cmVhbS4KKyAgICAgKi8KKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorICAgIEBQYXRoKCJmcm9tLXN0cmluZyIpCisgICAgcHVibGljIENodW5rZWRPdXRwdXQ8U3RyaW5nPiBnZXRGcm9tVGV4dCgpIHsKKyAgICAgICAgZmluYWwgQ2h1bmtlZE91dHB1dDxTdHJpbmc+IG91dHB1dCA9IG5ldyBDaHVua2VkT3V0cHV0PD4oU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC53cml0ZShuZXcgTWVzc2FnZShpLCAidGVzdCIpLnRvU3RyaW5nKCkgKyAiXHJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDIwMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuU0VWRVJFLCAiRXJyb3Igd3JpdGluZyBjaHVuay4iLCBlKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuU0VWRVJFLCAiU2xlZXAgaW50ZXJydXB0ZWQuIiwgZSk7CisgICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLklORk8sICJFcnJvciBjbG9zaW5nIGNodW5rZWQgb3V0cHV0LiIsIGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9LnN0YXJ0KCk7CisKKyAgICAgICAgcmV0dXJuIG91dHB1dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNodW5rZWRPdXRwdXQjY2xvc2UoKX0gaXMgY2FsbGVkIGJlZm9yZSBtZXRob2QgcmV0dXJucyBpdCdzIGVudGl0eS4gUmVzb3VyY2UgcmVwcm9kdWNlcworICAgICAqIEpFUlNFWS0yNTU4IGlzc3VlLgorICAgICAqCisgICAgICogQHJldHVybiAoY2xvc2VkKSBjaHVuayBzdHJlYW0uCisgICAgICovCisgICAgQEdFVAorICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKyAgICBAUGF0aCgiY2xvc2UtYmVmb3JlLXJldHVybiIpCisgICAgcHVibGljIENodW5rZWRPdXRwdXQ8TWVzc2FnZT4gY2xvc2VCZWZvcmVSZXR1cm4oKSB7CisgICAgICAgIGZpbmFsIENodW5rZWRPdXRwdXQ8TWVzc2FnZT4gb3V0cHV0ID0gbmV3IENodW5rZWRPdXRwdXQ8PihNZXNzYWdlLmNsYXNzLCAiXHJcbiIpOworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBsYXRjaCA9IG5ldyBDb3VudERvd25MYXRjaCgxKTsKKworICAgICAgICBuZXcgVGhyZWFkKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC53cml0ZShuZXcgTWVzc2FnZShpLCAidGVzdCIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgyMDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLlNFVkVSRSwgIkVycm9yIHdyaXRpbmcgY2h1bmsuIiwgZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLlNFVkVSRSwgIlNsZWVwIGludGVycnVwdGVkLiIsIGUpOworICAgICAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOworICAgICAgICAgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdvcmtlciB0aHJlYWQgY2FuIGNvbnRpbnVlLgorICAgICAgICAgICAgICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuSU5GTywgIkVycm9yIGNsb3NpbmcgY2h1bmtlZCBvdXRwdXQuIiwgZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0uc3RhcnQoKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgLy8gV2FpdCB0aWxsIG5ldyB0aHJlYWQgY2xvc2VzIHRoZSBjaHVua2VkIG91dHB1dC4KKyAgICAgICAgICAgIGxhdGNoLmF3YWl0KCk7CisgICAgICAgICAgICByZXR1cm4gb3V0cHV0OworICAgICAgICB9IGNhdGNoIChmaW5hbCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgY29tYmluYXRpb24gb2YgQXN5bmNSZXNwb25zZSBhbmQgQ2h1bmtlZE91dHB1dC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNwb25zZSBhc3luYyByZXNwb25zZS4KKyAgICAgKi8KKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorICAgIEBQYXRoKCJjaHVua2VkLWFzeW5jIikKKyAgICBwdWJsaWMgdm9pZCBjbG9zZUJlZm9yZVJldHVybkFzeW5jKEBTdXNwZW5kZWQgZmluYWwgQXN5bmNSZXNwb25zZSByZXNwb25zZSkgeworICAgICAgICAvLyBTZXQgdGltZW91dCB0byBhYmxlIHRvIHJlc3VtZSBidXQgbm90IHNlbmQgdGhlIGNodW5rcyAoc2V0dGluZyB0aGUgQ2h1bmtlZE91dHB1dCBzaG91bGQgcmVtb3ZlIHRoZSB0aW1lb3V0KS4KKyAgICAgICAgcmVzcG9uc2Uuc2V0VGltZW91dCgxNTAwLCBUaW1lVW5pdC5TRUNPTkRTKTsKKworICAgICAgICBuZXcgVGhyZWFkKCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBDaHVua2VkT3V0cHV0PE1lc3NhZ2U+IG91dHB1dCA9IG5ldyBDaHVua2VkT3V0cHV0PD4oTWVzc2FnZS5jbGFzcywgIlxyXG4iKTsKKworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIC8vIExldCB0aGUgbWV0aG9kIHJldHVybi4KKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDEwMDApOworICAgICAgICAgICAgICAgICAgICAvLyBSZXN1bWUuCisgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnJlc3VtZShvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAvLyBXYWl0IGZvciByZXN1bWUgdG8gY29tcGxldGUuCisgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDAwKTsKKworICAgICAgICAgICAgICAgICAgICBuZXcgVGhyZWFkKCkgeworCisgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LndyaXRlKG5ldyBNZXNzYWdlKGksICJ0ZXN0IikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDIwMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuU0VWRVJFLCAiRXJyb3Igd3JpdGluZyBjaHVuay4iLCBlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi5sb2coTGV2ZWwuU0VWRVJFLCAiU2xlZXAgaW50ZXJydXB0ZWQuIiwgZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLklORk8sICJFcnJvciBjbG9zaW5nIGNodW5rZWQgb3V0cHV0LiIsIGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9LnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMT0dHRVIubG9nKExldmVsLlNFVkVSRSwgIlNsZWVwIGludGVycnVwdGVkLiIsIGUpOworICAgICAgICAgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLmludGVycnVwdCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfS5zdGFydCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1jaHVua2VkLWlvL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2NodW5rZWRfaW8vQ2h1bmtlZElucHV0T3V0cHV0SVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtY2h1bmtlZC1pby9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19jaHVua2VkX2lvL0NodW5rZWRJbnB1dE91dHB1dElUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZDU3YWYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtY2h1bmtlZC1pby9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19jaHVua2VkX2lvL0NodW5rZWRJbnB1dE91dHB1dElUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsMTc4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19jaHVua2VkX2lvOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLm5ldC5VUkxDb25uZWN0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkdlbmVyaWNUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DaHVua2VkSW5wdXQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5LmNvbm5lY3Rvci5Hcml6emx5Q29ubmVjdG9yUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIENodW5rZWQgSS9PIGludGVncmF0aW9uIHRlc3RzLgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBDaHVua2VkSW5wdXRPdXRwdXRJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfTElTVEVORVJTID0gNTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgQXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChmaW5hbCBDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihBcHAuY3JlYXRlTW94eUpzb25SZXNvbHZlcigpKTsKKworICAgICAgICBjb25maWcucHJvcGVydHkoQ2xpZW50UHJvcGVydGllcy5DT05ORUNUX1RJTUVPVVQsIDE1MDAwKQorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLlJFQURfVElNRU9VVCwgNTAwMCkKKyAgICAgICAgICAgICAgICAucHJvcGVydHkoQ2xpZW50UHJvcGVydGllcy5BU1lOQ19USFJFQURQT09MX1NJWkUsIE1BWF9MSVNURU5FUlMgKyAxKQorICAgICAgICAgICAgICAgIC5jb25uZWN0b3JQcm92aWRlcihuZXcgR3JpenpseUNvbm5lY3RvclByb3ZpZGVyKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBVUkkgZ2V0QmFzZVVyaSgpIHsKKyAgICAgICAgZmluYWwgVXJpQnVpbGRlciBiYXNlVXJpQnVpbGRlciA9IFVyaUJ1aWxkZXIuZnJvbVVyaShzdXBlci5nZXRCYXNlVXJpKCkpOworICAgICAgICBmaW5hbCBib29sZWFuIGV4dGVybmFsRmFjdG9yeUluVXNlID0gZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSBpbnN0YW5jZW9mIEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CisgICAgICAgIHJldHVybiBleHRlcm5hbEZhY3RvcnlJblVzZSA/IGJhc2VVcmlCdWlsZGVyLnBhdGgoInJlc291cmNlcyIpLmJ1aWxkKCkgOiBiYXNlVXJpQnVpbGRlci5idWlsZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgcmV0cmlldmluZyBzdHJpbmctYmFzZWQgY2h1bmtlZCBzdHJlYW0gYXMgYSBzaW5nbGUgcmVzcG9uc2Ugc3RyaW5nLgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24gaW4gY2FzZSBvZiBhIGZhaWx1cmUgZHVyaW5nIHRoZSB0ZXN0IGV4ZWN1dGlvbi4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDaHVua2VkT3V0cHV0VG9TaW5nbGVTdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgidGVzdC9mcm9tLXN0cmluZyIpLnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSkuZ2V0KFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHZhbHVlIG9mIGNodW5rZWQgcmVzcG9uc2UgdW5tYXJzaGFsbGVkIGFzIGEgc2luZ2xlIHN0cmluZy4iLAorICAgICAgICAgICAgICAgICJ7XCJpZFwiOjAsXCJkYXRhXCI6XCJ0ZXN0XCJ9XHJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICsgIntcImlkXCI6MSxcImRhdGFcIjpcInRlc3RcIn1cclxuIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAie1wiaWRcIjoyLFwiZGF0YVwiOlwidGVzdFwifVxyXG4iLAorICAgICAgICAgICAgICAgIHJlc3BvbnNlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUZXN0IHJldHJpZXZpbmcgc3RyaW5nLWJhc2VkIGNodW5rZWQgc3RyZWFtIHNlcXVlbnRpYWxseSBhcyBpbmRpdmlkdWFsIGNodW5rcyB1c2luZyBjaHVua2VkIGlucHV0LgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24gaW4gY2FzZSBvZiBhIGZhaWx1cmUgZHVyaW5nIHRoZSB0ZXN0IGV4ZWN1dGlvbi4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDaHVua2VkT3V0cHV0VG9DaHVua0lucHV0RnJvbVN0cmluZygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBDaHVua2VkSW5wdXQ8TWVzc2FnZT4gaW5wdXQgPSB0YXJnZXQoKS5wYXRoKCJ0ZXN0L2Zyb20tc3RyaW5nIikucmVxdWVzdChNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTl9UWVBFKQorICAgICAgICAgICAgICAgIC5nZXQobmV3IEdlbmVyaWNUeXBlPENodW5rZWRJbnB1dDxNZXNzYWdlPj4oKSB7CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgaW50IGNvdW50ZXIgPSAwOworICAgICAgICBNZXNzYWdlIGNodW5rOworICAgICAgICB3aGlsZSAoKGNodW5rID0gaW5wdXQucmVhZCgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgdmFsdWUgb2YgY2h1bmsgIiArIGNvdW50ZXIsIG5ldyBNZXNzYWdlKGNvdW50ZXIsICJ0ZXN0IiksIGNodW5rKTsKKyAgICAgICAgICAgIGNvdW50ZXIrKzsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBudW1iZWQgb2YgcmVjZWl2ZWQgY2h1bmtzLiIsIDMsIGNvdW50ZXIpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgcmV0cmlldmluZyBQT0pPLWJhc2VkIGNodW5rZWQgc3RyZWFtIHNlcXVlbnRpYWxseSBhcyBpbmRpdmlkdWFsIGNodW5rcyB1c2luZyBjaHVua2VkIGlucHV0LgorICAgICAqCisgICAgICogQHRocm93cyBFeGNlcHRpb24gaW4gY2FzZSBvZiBhIGZhaWx1cmUgZHVyaW5nIHRoZSB0ZXN0IGV4ZWN1dGlvbi4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDaHVua2VkT3V0cHV0VG9DaHVua0lucHV0RnJvbVBvam8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ2h1bmtlZElucHV0PE1lc3NhZ2U+IGlucHV0ID0gdGFyZ2V0KCkucGF0aCgidGVzdC9mcm9tLXBvam8iKS5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OX1RZUEUpCisgICAgICAgICAgICAgICAgLmdldChuZXcgR2VuZXJpY1R5cGU8Q2h1bmtlZElucHV0PE1lc3NhZ2U+PigpIHsKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICBpbnQgY291bnRlciA9IDA7CisgICAgICAgIE1lc3NhZ2UgY2h1bms7CisgICAgICAgIHdoaWxlICgoY2h1bmsgPSBpbnB1dC5yZWFkKCkpICE9IG51bGwpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCB2YWx1ZSBvZiBjaHVuayAiICsgY291bnRlciwgbmV3IE1lc3NhZ2UoY291bnRlciwgInRlc3QiKSwgY2h1bmspOworICAgICAgICAgICAgY291bnRlcisrOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIG51bWJlZCBvZiByZWNlaXZlZCBjaHVua3MuIiwgMywgY291bnRlcik7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBjb21iaW5hdGlvbiBvZiBBc3luY1Jlc3BvbnNlIGFuZCBDaHVua2VkT3V0cHV0LgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgY2h1bmtlZE91dHB1dFdpdGhBc3luY1Jlc3BvbnNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIENodW5rZWRJbnB1dDxNZXNzYWdlPiBpbnB1dCA9IHRhcmdldCgpLnBhdGgoInRlc3QvY2h1bmtlZC1hc3luYyIpLnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSkKKyAgICAgICAgICAgICAgICAuZ2V0KG5ldyBHZW5lcmljVHlwZTxDaHVua2VkSW5wdXQ8TWVzc2FnZT4+KCkgeworICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgIGludCBjb3VudGVyID0gMDsKKyAgICAgICAgTWVzc2FnZSBjaHVuazsKKyAgICAgICAgd2hpbGUgKChjaHVuayA9IGlucHV0LnJlYWQoKSkgIT0gbnVsbCkgeworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJVbmV4cGVjdGVkIHZhbHVlIG9mIGNodW5rICIgKyBjb3VudGVyLCBuZXcgTWVzc2FnZShjb3VudGVyLCAidGVzdCIpLCBjaHVuayk7CisgICAgICAgICAgICBjb3VudGVyKys7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbnVtYmVkIG9mIHJlY2VpdmVkIGNodW5rcy4iLCAzLCBjb3VudGVyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXByb2R1Y2VyIGZvciBKRVJTRVktMjU1OC4gQ2hlY2tpbmcgdGhhdCB0aGUgY29ubmVjdGlvbiBpcyBwcm9wZXJseSBjbG9zZWQgZXZlbiB3aGVuIHRoZQorICAgICAqIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ2h1bmtlZE91dHB1dCNjbG9zZSgpfSBpcyBjYWxsZWQgYmVmb3JlIHRoZSByZXNwb25zZSBpcyBwcm9jZXNzZWQgYnkgdGhlIHJ1bnRpbWUuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBjaGVja0Nvbm5lY3Rpb25Jc0Nsb3NlZFVybENvbm5lY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgVVJJIHVyaSA9IFVyaUJ1aWxkZXIuZnJvbVVyaShzdXBlci5nZXRCYXNlVXJpKCkpLnBhdGgoInRlc3QvY2xvc2UtYmVmb3JlLXJldHVybiIpLmJ1aWxkKCk7CisgICAgICAgIGZpbmFsIFVSTENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IHVyaS50b1VSTCgpLm9wZW5Db25uZWN0aW9uKCk7CisKKyAgICAgICAgY29ubmVjdGlvbi5zZXRDb25uZWN0VGltZW91dCgxNTAwMCk7CisgICAgICAgIGNvbm5lY3Rpb24uc2V0UmVhZFRpbWVvdXQoMTUwMDApOworICAgICAgICBjb25uZWN0aW9uLmNvbm5lY3QoKTsKKworICAgICAgICBmaW5hbCBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGNvbm5lY3Rpb24uZ2V0SW5wdXRTdHJlYW0oKSkpOworCisgICAgICAgIFN0cmluZyBsaW5lOworICAgICAgICBpbnQgY291bnRlciA9IDA7CisgICAgICAgIHdoaWxlICgobGluZSA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgdmFsdWUgb2YgY2h1bmsgIiArIGNvdW50ZXIsIG5ldyBNZXNzYWdlKGNvdW50ZXIsICJ0ZXN0IikudG9TdHJpbmcoKSwgbGluZSk7CisgICAgICAgICAgICBjb3VudGVyKys7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgbnVtYmVkIG9mIHJlY2VpdmVkIGNodW5rcy4iLCAzLCBjb3VudGVyKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtZmlsdGVyL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtZmlsdGVyL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJiZTQyNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1maWx0ZXIvcG9tLnhtbApAQCAtMCwwICsxLDY0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+c2VydmxldC0zLWZpbHRlcjwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1zZXJ2bGV0LTMtZmlsdGVyPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPlNlcnZsZXQgaW50ZWdyYXRpb24gdGVzdCAtIHNlcnZsZXQtMy1maWx0ZXI8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1maWx0ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfZmlsdGVyL015UmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1maWx0ZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfZmlsdGVyL015UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTNjM2E3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWZpbHRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19maWx0ZXIvTXlSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2ZpbHRlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCisvKioKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIm15cmVzb3VyY2UiKQorcHVibGljIGNsYXNzIE15UmVzb3VyY2UgeworCisgICAgQEdFVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgIHJldHVybiAiT0siOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1maWx0ZXIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1maWx0ZXIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGNmNGU0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWZpbHRlci9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi41IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIj4KKyAgICA8ZmlsdGVyPgorICAgICAgICA8ZmlsdGVyLW5hbWU+SmVyc2V5IFdlYiBBcHBsaWNhdGlvbjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDxmaWx0ZXItY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9maWx0ZXItY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amVyc2V5LmNvbmZpZy5zZXJ2ZXIucHJvdmlkZXIucGFja2FnZXM8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2ZpbHRlcjwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICA8L2ZpbHRlcj4KKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5KZXJzZXkgV2ViIEFwcGxpY2F0aW9uPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9teWFwcC8qPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWZpbHRlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19maWx0ZXIvTXlSZXNvdXJjZUlUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWZpbHRlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19maWx0ZXIvTXlSZXNvdXJjZUlUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNmFjNzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtZmlsdGVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2ZpbHRlci9NeVJlc291cmNlSVRDYXNlLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfZmlsdGVyOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIE15UmVzb3VyY2VJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJjID0gbmV3IFJlc291cmNlQ29uZmlnKCk7CisgICAgICAgIHJldHVybiByYy5wYWNrYWdlcyhNeVJlc291cmNlSVRDYXNlLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXlSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoIm15YXBwIikucGF0aCgibXlyZXNvdXJjZSIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIk9LIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RXYWRsKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoIm15YXBwL2FwcGxpY2F0aW9uLndhZGwiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShyZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykuc3RhcnRzV2l0aCgiPD94bWwgdmVyc2lvbj1cIjEuMFwiIikpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1nZi1hc3luYy9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWdmLWFzeW5jL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ1MzkzNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1nZi1hc3luYy9wb20ueG1sCkBAIC0wLDAgKzEsNzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LTMtZ2YtYXN5bmM8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tc2VydmxldC0zLWdmLWFzeW5jPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPlNlcnZsZXQgKEdGKSBpbnRlZ3JhdGlvbiB0ZXN0IC0gc2VydmxldC0zLWdmLWFzeW5jIC0gY29uZmlndXJlZCB2aWEgamF4LXJzIGFwcGxpY2F0aW9uIGFubm90YXRlZCB3aXRoIEBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGg8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxmaW5hbE5hbWU+JHtwcm9qZWN0LmFydGlmYWN0SWR9PC9maW5hbE5hbWU+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxza2lwVGVzdHM+JHtza2lwVGVzdHN9PC9za2lwVGVzdHM+CisgICAgICAgICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk+JHt0ZXN0Q29udGFpbmVyRmFjdG9yeX08L2plcnNleS5jb25maWcudGVzdC5jb250YWluZXIuZmFjdG9yeT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+JHt0ZXN0Q29udGFpbmVyUG9ydH08L2plcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydD4KKyAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxmYWlsT25NaXNzaW5nV2ViWG1sPmZhbHNlPC9mYWlsT25NaXNzaW5nV2ViWG1sPgorICAgICAgICA8c2tpcFRlc3RzPnRydWU8L3NraXBUZXN0cz4KKyAgICAgICAgPHRlc3RDb250YWluZXJGYWN0b3J5Pm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTwvdGVzdENvbnRhaW5lckZhY3Rvcnk+CisgICAgICAgIDx0ZXN0Q29udGFpbmVyUG9ydD44MDgwPC90ZXN0Q29udGFpbmVyUG9ydD4KKyAgICA8L3Byb3BlcnRpZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtZ2YtYXN5bmMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfYXN5bmMvQXN5bmNDYW5jZWxUaW1lb3V0UmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1nZi1hc3luYy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19hc3luYy9Bc3luY0NhbmNlbFRpbWVvdXRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2N2Y4NTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtZ2YtYXN5bmMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfYXN5bmMvQXN5bmNDYW5jZWxUaW1lb3V0UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19hc3luYzsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkFycmF5QmxvY2tpbmdRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5CbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQXN5bmNSZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuU3VzcGVuZGVkOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5UaW1lb3V0SGFuZGxlcjsKKworLyoqCisgKiBBc3luY2hyb25vdXMgc2VydmxldC1kZXBsb3llZCByZXNvdXJjZSBmb3IgdGVzdGluZyB7QGxpbmsgamF2YXgud3MucnMuY29udGFpbmVyLkFzeW5jUmVzcG9uc2UgYXN5bmMgcmVzcG9uc2V9IHRpbWVvdXRzLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUGF0aCgiY2FuY2VsLXRpbWVvdXQiKQorcHVibGljIGNsYXNzIEFzeW5jQ2FuY2VsVGltZW91dFJlc291cmNlIHsKKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJsb2NraW5nUXVldWU8QXN5bmNSZXNwb25zZT5bXSBzdGFnZXMgPSBuZXcgQmxvY2tpbmdRdWV1ZVtdeworICAgICAgICAgICAgbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxBc3luY1Jlc3BvbnNlPigxKSwKKyAgICAgICAgICAgIG5ldyBBcnJheUJsb2NraW5nUXVldWU8QXN5bmNSZXNwb25zZT4oMSkKKyAgICB9OworCisgICAgQEdFVAorICAgIEBQYXRoKCJzdXNwZW5kIikKKyAgICBwdWJsaWMgdm9pZCBzdXNwZW5kKEBTdXNwZW5kZWQgZmluYWwgQXN5bmNSZXNwb25zZSBhc3luY1Jlc3BvbnNlKSB7CisgICAgICAgIHN0YWdlc1swXS5hZGQoYXN5bmNSZXNwb25zZSk7CisgICAgfQorCisgICAgQFBPU1QKKyAgICBAUGF0aCgidGltZW91dCIpCisgICAgcHVibGljIHZvaWQgc2V0VGltZW91dChmaW5hbCBTdHJpbmcgc3RhZ2UpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBBc3luY1Jlc3BvbnNlIGFzeW5jID0gc3RhZ2VzW0ludGVnZXIucGFyc2VJbnQoc3RhZ2UpXS50YWtlKCk7CisKKyAgICAgICAgYXN5bmMuc2V0VGltZW91dEhhbmRsZXIobmV3IFRpbWVvdXRIYW5kbGVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVUaW1lb3V0KGZpbmFsIEFzeW5jUmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgICAgICAgICByZXNwb25zZS5jYW5jZWwoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgICAgIGFzeW5jLnNldFRpbWVvdXQoMjAwTCwgVGltZVVuaXQuTUlMTElTRUNPTkRTKTsKKworICAgICAgICBzdGFnZXNbSW50ZWdlci5wYXJzZUludChzdGFnZSkgKyAxXS5hZGQoYXN5bmMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1nZi1hc3luYy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19hc3luYy9Bc3luY1Jlc3VtZVRpbWVvdXRSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWdmLWFzeW5jL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2FzeW5jL0FzeW5jUmVzdW1lVGltZW91dFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZhZDJkYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1nZi1hc3luYy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19hc3luYy9Bc3luY1Jlc3VtZVRpbWVvdXRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2FzeW5jOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQXJyYXlCbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkJsb2NraW5nUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Bc3luY1Jlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5TdXNwZW5kZWQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlRpbWVvdXRIYW5kbGVyOworCisvKioKKyAqIEFzeW5jaHJvbm91cyBzZXJ2bGV0LWRlcGxveWVkIHJlc291cmNlIGZvciB0ZXN0aW5nIHtAbGluayBqYXZheC53cy5ycy5jb250YWluZXIuQXN5bmNSZXNwb25zZSBhc3luYyByZXNwb25zZX0gdGltZW91dHMuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BQYXRoKCJyZXN1bWUtdGltZW91dCIpCitwdWJsaWMgY2xhc3MgQXN5bmNSZXN1bWVUaW1lb3V0UmVzb3VyY2UgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQmxvY2tpbmdRdWV1ZTxBc3luY1Jlc3BvbnNlPiBxdWV1ZSA9IG5ldyBBcnJheUJsb2NraW5nUXVldWU8PigxKTsKKworICAgIEBHRVQKKyAgICBAUGF0aCgic3VzcGVuZCIpCisgICAgcHVibGljIHZvaWQgc3VzcGVuZChAU3VzcGVuZGVkIGZpbmFsIEFzeW5jUmVzcG9uc2UgYXN5bmNSZXNwb25zZSkgeworICAgICAgICBxdWV1ZS5hZGQoYXN5bmNSZXNwb25zZSk7CisgICAgfQorCisgICAgQFBPU1QKKyAgICBAUGF0aCgidGltZW91dCIpCisgICAgcHVibGljIHZvaWQgc2V0VGltZU91dChmaW5hbCBJbnRlZ2VyIG1pbGxpcykgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQXN5bmNSZXNwb25zZSBhc3luY1Jlc3BvbnNlID0gcXVldWUudGFrZSgpOworCisgICAgICAgIGZpbmFsIGJvb2xlYW4gdGltZW91dDEgPSBhc3luY1Jlc3BvbnNlLnNldFRpbWVvdXQobWlsbGlzLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICBhc3luY1Jlc3BvbnNlLnNldFRpbWVvdXRIYW5kbGVyKG5ldyBUaW1lb3V0SGFuZGxlcigpIHsKKworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVUaW1lb3V0KGZpbmFsIEFzeW5jUmVzcG9uc2UgYXN5bmNSZXNwb25zZSkgeworICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gdGltZW91dDIgPSBhc3luY1Jlc3BvbnNlLnNldFRpbWVvdXQobWlsbGlzLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICAgICAgICAgIGFzeW5jUmVzcG9uc2Uuc2V0VGltZW91dEhhbmRsZXIobmV3IFRpbWVvdXRIYW5kbGVyKCkgeworCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVUaW1lb3V0KGZpbmFsIEFzeW5jUmVzcG9uc2UgYXN5bmNSZXNwb25zZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXN5bmNSZXNwb25zZS5yZXN1bWUoInRpbWVvdXQxPSIgKyB0aW1lb3V0MSArICJfdGltZW91dDI9IiArIHRpbWVvdXQyICsgIl9oYW5kbGVkIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWdmLWFzeW5jL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2FzeW5jL0FzeW5jU2VydmxldFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtZ2YtYXN5bmMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfYXN5bmMvQXN5bmNTZXJ2bGV0UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2Q0NWVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWdmLWFzeW5jL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2FzeW5jL0FzeW5jU2VydmxldFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwxMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2FzeW5jOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQXJyYXlCbG9ja2luZ1F1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkJsb2NraW5nUXVldWU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworCitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkFzeW5jUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlN1c3BlbmRlZDsKKworLyoqCisgKiBBc3luY2hyb25vdXMgc2VydmxldC1kZXBsb3llZCByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiYXN5bmMiKQorcHVibGljIGNsYXNzIEFzeW5jU2VydmxldFJlc291cmNlIHsKKyAgICAvKioKKyAgICAgKiBIZWxsbyB3b3JsZCBtZXNzYWdlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEhFTExPX0FTWU5DX1dPUkxEID0gIkhlbGxvIEFzeW5jIFdvcmxkISI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FOQ0VMRUQgPSAiQ2FuY2VsZWQiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgQmxvY2tpbmdRdWV1ZTxDYW5jZWxlZFJlcXVlc3Q+IGNhbmNlbGluZ1F1ZXVlID0gbmV3IEFycmF5QmxvY2tpbmdRdWV1ZTxDYW5jZWxlZFJlcXVlc3Q+KDUpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ2FuY2VsZWRSZXF1ZXN0IHsKKyAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgaWQ7CisgICAgICAgIHByaXZhdGUgZmluYWwgQXN5bmNSZXNwb25zZSBhc3luY1Jlc3BvbnNlOworCisgICAgICAgIHByaXZhdGUgQ2FuY2VsZWRSZXF1ZXN0KGZpbmFsIFN0cmluZyBpZCwgZmluYWwgQXN5bmNSZXNwb25zZSBhc3luY1Jlc3BvbnNlKSB7CisgICAgICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgICAgICAgICB0aGlzLmFzeW5jUmVzcG9uc2UgPSBhc3luY1Jlc3BvbnNlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogR2V0IHRoZSBhc3luYyAiSGVsbG8gV29ybGQiIG1lc3NhZ2UuCisgICAgICovCisgICAgQEdFVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIHZvaWQgZ2V0KEBTdXNwZW5kZWQgZmluYWwgQXN5bmNSZXNwb25zZSBhcikgeworICAgICAgICBFeGVjdXRvcnMubmV3U2luZ2xlVGhyZWFkRXhlY3V0b3IoKS5leGVjdXRlKG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIFRocmVhZC5zbGVlcCgxMDApOworICAgICAgICAgICAgICAgICAgICBhci5yZXN1bWUoSEVMTE9fQVNZTkNfV09STEQpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdldCBhIGNhbmNlbGVkIHJlcXVlc3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaWQgcmVxdWVzdCBpZC4KKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGluIGNhc2Ugb2Ygbm90IGJlaW5nIGFibGUgdG8gcHV0IHRoZSByZXF1ZXN0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBhbiBpbnRlcm5hbCBxdWV1ZSBmb3IgY2FuY2VsaW5nLgorICAgICAqLworICAgIEBHRVQKKyAgICBAUGF0aCgiY2FuY2VsZWQiKQorICAgIHB1YmxpYyB2b2lkIGdldENhbmNlbGVkKEBTdXNwZW5kZWQgZmluYWwgQXN5bmNSZXNwb25zZSBhciwgQFF1ZXJ5UGFyYW0oImlkIikgZmluYWwgU3RyaW5nIGlkKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBjYW5jZWxpbmdRdWV1ZS5wdXQobmV3IENhbmNlbGVkUmVxdWVzdChpZCwgYXIpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDYW5jZWwgYSByZXF1ZXN0IHRoYXQgaXMgb24gdG9wIG9mIHRoZSBjYW5jZWxpbmcgcXVldWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIG5vdGlmaWNhdGlvbiBtZXNzYWdlIGFib3V0IHN1Y2Nlc3NmdWwgcmVxdWVzdCBjYW5jZWxpbmcuCisgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpbiBjYXNlIG9mIG5vdCBiZWluZyBhYmxlIHRvIHRha2UgYSBjYW5jZWxsZWQgcmVxdWVzdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBhbiBpbnRlcm5hbCBjYW5jZWxpbmcgcXVldWUuCisgICAgICovCisgICAgQFBPU1QKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIEBQYXRoKCJjYW5jZWxlZCIpCisgICAgcHVibGljIFN0cmluZyBjYW5jZWwoZmluYWwgU3RyaW5nIHJlcXVlc3RJZCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ2FuY2VsZWRSZXF1ZXN0IGNhbmNlbGVkUmVxdWVzdCA9IGNhbmNlbGluZ1F1ZXVlLnRha2UoKTsKKyAgICAgICAgY2FuY2VsZWRSZXF1ZXN0LmFzeW5jUmVzcG9uc2UuY2FuY2VsKCk7CisKKyAgICAgICAgcmV0dXJuIENBTkNFTEVEICsgIiAiICsgY2FuY2VsZWRSZXF1ZXN0LmlkICsgIiBieSBQT1NUICIgKyByZXF1ZXN0SWQ7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtZ2YtYXN5bmMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfYXN5bmMvU2VydmxldDNBc3luYy5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWdmLWFzeW5jL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2FzeW5jL1NlcnZsZXQzQXN5bmMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGJlNDgyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWdmLWFzeW5jL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2FzeW5jL1NlcnZsZXQzQXN5bmMuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19hc3luYzsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworLyoqCisgKiBBc3luY2hyb25vdXMgc2VydmxldC1kZXBsb3llZCByZXNvdXJjZSBhcHBsaWNhdGlvbi4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitAQXBwbGljYXRpb25QYXRoKCIvIikKK3B1YmxpYyBjbGFzcyBTZXJ2bGV0M0FzeW5jIGV4dGVuZHMgQXBwbGljYXRpb24geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgZmluYWwgU2V0PENsYXNzPD8+PiBoYXNoU2V0ID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICBoYXNoU2V0LmFkZChBc3luY1NlcnZsZXRSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIGhhc2hTZXQuYWRkKEFzeW5jUmVzdW1lVGltZW91dFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgaGFzaFNldC5hZGQoQXN5bmNDYW5jZWxUaW1lb3V0UmVzb3VyY2UuY2xhc3MpOworICAgICAgICByZXR1cm4gaGFzaFNldDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtZ2YtYXN5bmMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfYXN5bmMvQXN5bmNDYW5jZWxUaW1lb3V0UmVzb3VyY2VUZXN0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtZ2YtYXN5bmMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfYXN5bmMvQXN5bmNDYW5jZWxUaW1lb3V0UmVzb3VyY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTczNTMxNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1nZi1hc3luYy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19hc3luYy9Bc3luY0NhbmNlbFRpbWVvdXRSZXNvdXJjZVRlc3QuamF2YQpAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19hc3luYzsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkRlcGxveW1lbnRDb250ZXh0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlNlcnZsZXREZXBsb3ltZW50Q29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuaXM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBBc3luY2hyb25vdXMgc2VydmxldC1kZXBsb3llZCByZXNvdXJjZSBmb3IgdGVzdGluZyB7QGxpbmsgamF2YXgud3MucnMuY29udGFpbmVyLkFzeW5jUmVzcG9uc2UgYXN5bmMgcmVzcG9uc2V9IHRpbWVvdXRzLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgQXN5bmNDYW5jZWxUaW1lb3V0UmVzb3VyY2VUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwdWJsaWMgQXN5bmNDYW5jZWxUaW1lb3V0UmVzb3VyY2VUZXN0KCkgeworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBEZXBsb3ltZW50Q29udGV4dCBjb25maWd1cmVEZXBsb3ltZW50KCkgeworICAgICAgICByZXR1cm4gU2VydmxldERlcGxveW1lbnRDb250ZXh0LmJ1aWxkZXIobmV3IEFwcGxpY2F0aW9uKCkpCisgICAgICAgICAgICAgICAgLmNvbnRleHRQYXRoKCJzZXJ2bGV0LTMtZ2YtYXN5bmMiKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZW91dCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgcmVzb3VyY2VUYXJnZXQgPSB0YXJnZXQoImNhbmNlbC10aW1lb3V0Iik7CisgICAgICAgIGZpbmFsIEZ1dHVyZTxSZXNwb25zZT4gc3VzcGVuZCA9IHJlc291cmNlVGFyZ2V0LnBhdGgoInN1c3BlbmQiKS5yZXF1ZXN0KCkuYXN5bmMoKS5nZXQoKTsKKyAgICAgICAgZmluYWwgRnV0dXJlPFJlc3BvbnNlPiB0aW1lb3V0ID0gcmVzb3VyY2VUYXJnZXQucGF0aCgidGltZW91dCIpLnJlcXVlc3QoKS5hc3luYygpLnBvc3QoRW50aXR5LnRleHQoMCkpOworCisgICAgICAgIGFzc2VydFRoYXQodGltZW91dC5nZXQoKS5nZXRTdGF0dXMoKSwgaXMoUmVzcG9uc2UuU3RhdHVzLk5PX0NPTlRFTlQuZ2V0U3RhdHVzQ29kZSgpKSk7CisgICAgICAgIGFzc2VydFRoYXQoc3VzcGVuZC5nZXQoKS5nZXRTdGF0dXMoKSwgaXMoUmVzcG9uc2UuU3RhdHVzLlNFUlZJQ0VfVU5BVkFJTEFCTEUuZ2V0U3RhdHVzQ29kZSgpKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWdmLWFzeW5jL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2FzeW5jL0FzeW5jUmVzdW1lVGltZW91dFJlc291cmNlVGVzdC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWdmLWFzeW5jL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2FzeW5jL0FzeW5jUmVzdW1lVGltZW91dFJlc291cmNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MDk3NmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtZ2YtYXN5bmMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfYXN5bmMvQXN5bmNSZXN1bWVUaW1lb3V0UmVzb3VyY2VUZXN0LmphdmEKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfYXN5bmM7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5EZXBsb3ltZW50Q29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5TZXJ2bGV0RGVwbG95bWVudENvbnRleHQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBBc3luY2hyb25vdXMgc2VydmxldC1kZXBsb3llZCByZXNvdXJjZSBmb3IgdGVzdGluZyB7QGxpbmsgamF2YXgud3MucnMuY29udGFpbmVyLkFzeW5jUmVzcG9uc2UgYXN5bmMgcmVzcG9uc2V9IHRpbWVvdXRzLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgQXN5bmNSZXN1bWVUaW1lb3V0UmVzb3VyY2VUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwdWJsaWMgQXN5bmNSZXN1bWVUaW1lb3V0UmVzb3VyY2VUZXN0KCkgeworICAgICAgICBlbmFibGUoVGVzdFByb3BlcnRpZXMuTE9HX1RSQUZGSUMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBEZXBsb3ltZW50Q29udGV4dCBjb25maWd1cmVEZXBsb3ltZW50KCkgeworICAgICAgICByZXR1cm4gU2VydmxldERlcGxveW1lbnRDb250ZXh0LmJ1aWxkZXIobmV3IEFwcGxpY2F0aW9uKCkpCisgICAgICAgICAgICAgICAgLmNvbnRleHRQYXRoKCJzZXJ2bGV0LTMtZ2YtYXN5bmMiKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGltZW91dCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgcmVzb3VyY2VUYXJnZXQgPSB0YXJnZXQoInJlc3VtZS10aW1lb3V0Iik7CisgICAgICAgIGZpbmFsIEZ1dHVyZTxSZXNwb25zZT4gcmVzcG9uc2VGdXR1cmUgPSByZXNvdXJjZVRhcmdldC5wYXRoKCJzdXNwZW5kIikucmVxdWVzdCgpLmFzeW5jKCkuZ2V0KCk7CisKKyAgICAgICAgLy8gU2V0IHRpbWVvdXQuCisgICAgICAgIGFzc2VydFRoYXQocmVzb3VyY2VUYXJnZXQucGF0aCgidGltZW91dCIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS50ZXh0KCI1MDAiKSkuZ2V0U3RhdHVzKCksIGVxdWFsVG8oMjA0KSk7CisKKyAgICAgICAgLy8gV2FpdCBmb3IgaXQuCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2VGdXR1cmUuZ2V0KCkucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBlcXVhbFRvKCJ0aW1lb3V0MT10cnVlX3RpbWVvdXQyPXRydWVfaGFuZGxlZCIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtZ2YtYXN5bmMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfYXN5bmMvQXN5bmNTZXJ2bGV0UmVzb3VyY2VUZXN0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtZ2YtYXN5bmMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfYXN5bmMvQXN5bmNTZXJ2bGV0UmVzb3VyY2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjlhYzE4ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1nZi1hc3luYy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19hc3luYy9Bc3luY1NlcnZsZXRSZXNvdXJjZVRlc3QuamF2YQpAQCAtMCwwICsxLDI5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfYXN5bmM7CisKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRIYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvdW50RG93bkxhdGNoOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yU2VydmljZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnM7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuZ3VhdmEuVGhyZWFkRmFjdG9yeUJ1aWxkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLkplcnNleVByb2Nlc3NpbmdVbmNhdWdodEV4Y2VwdGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5EZXBsb3ltZW50Q29udGV4dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5TZXJ2bGV0RGVwbG95bWVudENvbnRleHQ7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBBc3luY2hyb25vdXMgc2VydmxldC1kZXBsb3llZCByZXNvdXJjZSB0ZXN0LgorICoKKyAqIEBhdXRob3IgTWFyZWsgUG90b2NpYXIgKG1hcmVrLnBvdG9jaWFyIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBBc3luY1NlcnZsZXRSZXNvdXJjZVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEFzeW5jU2VydmxldFJlc291cmNlVGVzdC5jbGFzcy5nZXROYW1lKCkpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVzcG9uc2VSZWNvcmQgeworCisgICAgICAgIGZpbmFsIGludCBzdGF0dXM7CisgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlOworCisgICAgICAgIHByaXZhdGUgUmVzcG9uc2VSZWNvcmQoZmluYWwgaW50IHN0YXR1cywgZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzOworICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1cyArICIgOiBcIiIgKyBtZXNzYWdlICsgJ1wiJzsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBEZXBsb3ltZW50Q29udGV4dCBjb25maWd1cmVEZXBsb3ltZW50KCkgeworICAgICAgICByZXR1cm4gU2VydmxldERlcGxveW1lbnRDb250ZXh0LmJ1aWxkZXIobmV3IEFwcGxpY2F0aW9uKCkpCisgICAgICAgICAgICAgICAgLmNvbnRleHRQYXRoKCJzZXJ2bGV0LTMtZ2YtYXN5bmMiKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBhc3luY2hyb25vdXMgc2VydmxldC1kZXBsb3llZCByZXNvdXJjZS4KKyAgICAgKgorICAgICAqIEB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24gaW4gY2FzZSB0aGUgd2FpdGluZyBmb3IgYWxsIHJlcXVlc3RzIHRvIGNvbXBsZXRlIHdhcyBpbnRlcnJ1cHRlZC4KKyAgICAgKi8KKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RBc3luY1NlcnZsZXQoKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24geworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgcmVzb3VyY2VUYXJnZXQgPSB0YXJnZXQoImFzeW5jIik7CisgICAgICAgIHJlc291cmNlVGFyZ2V0LnJlZ2lzdGVyKExvZ2dpbmdGZWF0dXJlLmNsYXNzKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGV4cGVjdGVkUmVzcG9uc2UgPSBBc3luY1NlcnZsZXRSZXNvdXJjZS5IRUxMT19BU1lOQ19XT1JMRDsKKworICAgICAgICBmaW5hbCBpbnQgTUFYX01FU1NBR0VTID0gNTA7CisgICAgICAgIGZpbmFsIGludCBMQVRDSF9XQUlUX1RJTUVPVVQgPSAxMDsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBkZWJ1Z01vZGUgPSBmYWxzZTsKKyAgICAgICAgZmluYWwgYm9vbGVhbiBzZXF1ZW50aWFsR2V0ID0gZmFsc2U7CisgICAgICAgIGZpbmFsIE9iamVjdCBzZXF1ZW50aWFsR2V0TG9jayA9IG5ldyBPYmplY3QoKTsKKworICAgICAgICBmaW5hbCBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3IgPSBFeGVjdXRvcnMubmV3Q2FjaGVkVGhyZWFkUG9vbChuZXcgVGhyZWFkRmFjdG9yeUJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXROYW1lRm9ybWF0KCJhc3luYy1yZXNvdXJjZS10ZXN0LSVkIikKKyAgICAgICAgICAgICAgICAuc2V0VW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyKG5ldyBKZXJzZXlQcm9jZXNzaW5nVW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyKCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGZpbmFsIE1hcDxJbnRlZ2VyLCBSZXNwb25zZVJlY29yZD4gZ2V0UmVzcG9uc2VzID0gbmV3IENvbmN1cnJlbnRIYXNoTWFwPD4oKTsKKworICAgICAgICBmaW5hbCBDb3VudERvd25MYXRjaCBnZXRSZXF1ZXN0TGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goTUFYX01FU1NBR0VTKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfTUVTU0FHRVM7IGkrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIGludCByZXF1ZXN0SWQgPSBpOworICAgICAgICAgICAgICAgIGV4ZWN1dG9yLnN1Ym1pdChuZXcgUnVubmFibGUoKSB7CisKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vbm9pbnNwZWN0aW9uIFBvaW50bGVzc0Jvb2xlYW5FeHByZXNzaW9uLENvbnN0YW50Q29uZGl0aW9ucworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlYnVnTW9kZSB8fCBzZXF1ZW50aWFsR2V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChzZXF1ZW50aWFsR2V0TG9jaykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIGdldCgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSByZXNvdXJjZVRhcmdldC5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVzcG9uc2VzLnB1dChyZXF1ZXN0SWQsIG5ldyBSZXNwb25zZVJlY29yZChyZXNwb25zZS5nZXRTdGF0dXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZmluYWwgVGhyb3dhYmxlIHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRSZXF1ZXN0TGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy9ub2luc3BlY3Rpb24gQ29uc3RhbnRDb25kaXRpb25zCisgICAgICAgICAgICBpZiAoZGVidWdNb2RlKSB7CisgICAgICAgICAgICAgICAgZ2V0UmVxdWVzdExhdGNoLmF3YWl0KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIldhaXRpbmcgZm9yIGFsbCBHRVQgcmVxdWVzdHMgdG8gY29tcGxldGUgaGFzIHRpbWVkIG91dC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVxdWVzdExhdGNoLmF3YWl0KExBVENIX1dBSVRfVElNRU9VVCAqIGdldEFzeW5jVGltZW91dE11bHRpcGxpZXIoKSwgVGltZVVuaXQuU0VDT05EUykpOworICAgICAgICAgICAgfQorICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgZXhlY3V0b3Iuc2h1dGRvd25Ob3coKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgbWVzc2FnZUJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxJbnRlZ2VyLCBSZXNwb25zZVJlY29yZD4gZ2V0UmVzcG9uc2VFbnRyeSA6IGdldFJlc3BvbnNlcy5lbnRyeVNldCgpKSB7CisgICAgICAgICAgICBtZXNzYWdlQnVpbGRlci5hcHBlbmQoIkdFVCByZXNwb25zZSBmb3IgbWVzc2FnZSAiKS5hcHBlbmQoZ2V0UmVzcG9uc2VFbnRyeS5nZXRLZXkoKSkuYXBwZW5kKCI6ICIpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoZ2V0UmVzcG9uc2VFbnRyeS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCkpLmFwcGVuZCgnXG4nKTsKKyAgICAgICAgfQorICAgICAgICBMT0dHRVIuaW5mbyhtZXNzYWdlQnVpbGRlci50b1N0cmluZygpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX01FU1NBR0VTLCBnZXRSZXNwb25zZXMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8SW50ZWdlciwgUmVzcG9uc2VSZWNvcmQ+IGVudHJ5IDogZ2V0UmVzcG9uc2VzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiVW5leHBlY3RlZCBHRVQgcmVzcG9uc2Ugc3RhdHVzIGZvciByZXF1ZXN0ICIgKyBlbnRyeS5nZXRLZXkoKSwgMjAwLCBlbnRyeS5nZXRWYWx1ZSgpLnN0YXR1cyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlVuZXhwZWN0ZWQgR0VUIHJlc3BvbnNlIG1lc3NhZ2UgZm9yIHJlcXVlc3QgIiArIGVudHJ5LmdldEtleSgpLCBleHBlY3RlZFJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICBlbnRyeS5nZXRWYWx1ZSgpLm1lc3NhZ2UpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCBjYW5jZWxpbmcgb2YgYW4gYXN5bmMgcmVxdWVzdCB0byBhIHNlcnZsZXQtZGVwbG95ZWQgcmVzb3VyY2UuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIGluIGNhc2UgdGhlIHdhaXRpbmcgZm9yIGFsbCByZXF1ZXN0cyB0byBjb21wbGV0ZSB3YXMgaW50ZXJydXB0ZWQuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QXN5bmNSZXF1ZXN0Q2FuY2VsaW5nKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHJlc291cmNlVGFyZ2V0ID0gdGFyZ2V0KCJhc3luYy9jYW5jZWxlZCIpOworICAgICAgICByZXNvdXJjZVRhcmdldC5yZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcyk7CisKKyAgICAgICAgZmluYWwgaW50IE1BWF9NRVNTQUdFUyA9IDEwOworICAgICAgICBmaW5hbCBpbnQgTEFUQ0hfV0FJVF9USU1FT1VUID0gMTA7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gZGVidWdNb2RlID0gZmFsc2U7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gc2VxdWVudGlhbEdldCA9IGZhbHNlOworICAgICAgICBmaW5hbCBib29sZWFuIHNlcXVlbnRpYWxQb3N0ID0gZmFsc2U7CisgICAgICAgIGZpbmFsIE9iamVjdCBzZXF1ZW50aWFsR2V0TG9jayA9IG5ldyBPYmplY3QoKTsKKyAgICAgICAgZmluYWwgT2JqZWN0IHNlcXVlbnRpYWxQb3N0TG9jayA9IG5ldyBPYmplY3QoKTsKKworICAgICAgICBmaW5hbCBFeGVjdXRvclNlcnZpY2UgZXhlY3V0b3IgPSBFeGVjdXRvcnMubmV3Q2FjaGVkVGhyZWFkUG9vbChuZXcgVGhyZWFkRmFjdG9yeUJ1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXROYW1lRm9ybWF0KCJhc3luYy1jYW5jZWxlZC1yZXNvdXJjZS10ZXN0LSVkIikKKyAgICAgICAgICAgICAgICAuc2V0VW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyKG5ldyBKZXJzZXlQcm9jZXNzaW5nVW5jYXVnaHRFeGNlcHRpb25IYW5kbGVyKCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGZpbmFsIE1hcDxJbnRlZ2VyLCBTdHJpbmc+IHBvc3RSZXNwb25zZXMgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpOworICAgICAgICBmaW5hbCBNYXA8SW50ZWdlciwgU3RyaW5nPiBnZXRSZXNwb25zZXMgPSBuZXcgQ29uY3VycmVudEhhc2hNYXA8PigpOworCisgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIHBvc3RSZXF1ZXN0TGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goTUFYX01FU1NBR0VTKTsKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggZ2V0UmVxdWVzdExhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKE1BWF9NRVNTQUdFUyk7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX01FU1NBR0VTOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcmVxdWVzdElkID0gaTsKKyAgICAgICAgICAgICAgICBleGVjdXRvci5zdWJtaXQobmV3IFJ1bm5hYmxlKCkgeworCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL25vaW5zcGVjdGlvbiBQb2ludGxlc3NCb29sZWFuRXhwcmVzc2lvbixDb25zdGFudENvbmRpdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z01vZGUgfHwgc2VxdWVudGlhbEdldCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAoc2VxdWVudGlhbEdldExvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIHByaXZhdGUgdm9pZCBnZXQoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyByZXNwb25zZSA9IHJlc291cmNlVGFyZ2V0LnF1ZXJ5UGFyYW0oImlkIiwgcmVxdWVzdElkKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVzcG9uc2VzLnB1dChyZXF1ZXN0SWQsIHJlc3BvbnNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGZpbmFsIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSBleC5nZXRSZXNwb25zZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlc3BvbnNlcy5wdXQocmVxdWVzdElkLCByZXNwb25zZS5nZXRTdGF0dXMoKSArICI6ICIgKyByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRSZXF1ZXN0TGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICBleGVjdXRvci5zdWJtaXQobmV3IFJ1bm5hYmxlKCkgeworCisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvL25vaW5zcGVjdGlvbiBQb2ludGxlc3NCb29sZWFuRXhwcmVzc2lvbixDb25zdGFudENvbmRpdGlvbnMKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWJ1Z01vZGUgfHwgc2VxdWVudGlhbFBvc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHNlcXVlbnRpYWxQb3N0TG9jaykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwcml2YXRlIHZvaWQgcG9zdCgpIHRocm93cyBQcm9jZXNzaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJlc3BvbnNlID0gcmVzb3VyY2VUYXJnZXQucmVxdWVzdCgpLnBvc3QoRW50aXR5LnRleHQoIiIgKyByZXF1ZXN0SWQpLCBTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc3RSZXNwb25zZXMucHV0KHJlcXVlc3RJZCwgcmVzcG9uc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0UmVxdWVzdExhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vbm9pbnNwZWN0aW9uIENvbnN0YW50Q29uZGl0aW9ucworICAgICAgICAgICAgaWYgKGRlYnVnTW9kZSkgeworICAgICAgICAgICAgICAgIHBvc3RSZXF1ZXN0TGF0Y2guYXdhaXQoKTsKKyAgICAgICAgICAgICAgICBnZXRSZXF1ZXN0TGF0Y2guYXdhaXQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiV2FpdGluZyBmb3IgYWxsIFBPU1QgcmVxdWVzdHMgdG8gY29tcGxldGUgaGFzIHRpbWVkIG91dC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFJlcXVlc3RMYXRjaC5hd2FpdChMQVRDSF9XQUlUX1RJTUVPVVQgKiBnZXRBc3luY1RpbWVvdXRNdWx0aXBsaWVyKCksIFRpbWVVbml0LlNFQ09ORFMpKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJXYWl0aW5nIGZvciBhbGwgR0VUIHJlcXVlc3RzIHRvIGNvbXBsZXRlIGhhcyB0aW1lZCBvdXQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlcXVlc3RMYXRjaC5hd2FpdChMQVRDSF9XQUlUX1RJTUVPVVQgKiBnZXRBc3luY1RpbWVvdXRNdWx0aXBsaWVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVVbml0LlNFQ09ORFMpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGV4ZWN1dG9yLnNodXRkb3duTm93KCk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIG1lc3NhZ2VCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8SW50ZWdlciwgU3RyaW5nPiBwb3N0UmVzcG9uc2VFbnRyeSA6IHBvc3RSZXNwb25zZXMuZW50cnlTZXQoKSkgeworICAgICAgICAgICAgbWVzc2FnZUJ1aWxkZXIuYXBwZW5kKCJQT1NUIHJlc3BvbnNlIGZvciBtZXNzYWdlICIpLmFwcGVuZChwb3N0UmVzcG9uc2VFbnRyeS5nZXRLZXkoKSkuYXBwZW5kKCI6ICIpCisgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQocG9zdFJlc3BvbnNlRW50cnkuZ2V0VmFsdWUoKSkuYXBwZW5kKCdcbicpOworICAgICAgICB9CisgICAgICAgIG1lc3NhZ2VCdWlsZGVyLmFwcGVuZCgnXG4nKTsKKyAgICAgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8SW50ZWdlciwgU3RyaW5nPiBnZXRSZXNwb25zZUVudHJ5IDogZ2V0UmVzcG9uc2VzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIG1lc3NhZ2VCdWlsZGVyLmFwcGVuZCgiR0VUIHJlc3BvbnNlIGZvciBtZXNzYWdlICIpLmFwcGVuZChnZXRSZXNwb25zZUVudHJ5LmdldEtleSgpKS5hcHBlbmQoIjogIikKKyAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChnZXRSZXNwb25zZUVudHJ5LmdldFZhbHVlKCkpLmFwcGVuZCgnXG4nKTsKKyAgICAgICAgfQorICAgICAgICBMT0dHRVIuaW5mbyhtZXNzYWdlQnVpbGRlci50b1N0cmluZygpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoTUFYX01FU1NBR0VTLCBwb3N0UmVzcG9uc2VzLnNpemUoKSk7CisgICAgICAgIGZvciAoZmluYWwgTWFwLkVudHJ5PEludGVnZXIsIFN0cmluZz4gcG9zdFJlc3BvbnNlRW50cnkgOiBwb3N0UmVzcG9uc2VzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlVuZXhwZWN0ZWQgUE9TVCBub3RpZmljYXRpb24gcmVzcG9uc2UgZm9yIG1lc3NhZ2UgIiArIHBvc3RSZXNwb25zZUVudHJ5LmdldEtleSgpLAorICAgICAgICAgICAgICAgICAgICBwb3N0UmVzcG9uc2VFbnRyeS5nZXRWYWx1ZSgpLnN0YXJ0c1dpdGgoQXN5bmNTZXJ2bGV0UmVzb3VyY2UuQ0FOQ0VMRUQpKTsKKyAgICAgICAgfQorCisgICAgICAgIGFzc2VydEVxdWFscyhNQVhfTUVTU0FHRVMsIGdldFJlc3BvbnNlcy5zaXplKCkpOworICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPEludGVnZXI+IGdldFJlc3BvbnNlS2V5cyA9IGdldFJlc3BvbnNlcy5rZXlTZXQoKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfTUVTU0FHRVM7IGkrKykgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiRGV0ZWN0ZWQgYSBHRVQgbWVzc2FnZSByZXNwb25zZSBsb3NzOiAiICsgaSwgZ2V0UmVzcG9uc2VLZXlzLmNvbnRhaW5zKGkpKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBnZXRSZXNwb25zZUVudHJ5ID0gZ2V0UmVzcG9uc2VzLmdldChpKTsKKyAgICAgICAgICAgIGFzc2VydFRydWUoIlVuZXhwZWN0ZWQgY2FuY2VsZWQgR0VUIHJlc3BvbnNlIHN0YXR1cyBmb3IgcmVxdWVzdCAiICsgaSwgZ2V0UmVzcG9uc2VFbnRyeS5zdGFydHNXaXRoKCI1MDM6ICIpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbmZsZWN0b3ItMS9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluZmxlY3Rvci0xL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzEyZWMyMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbmZsZWN0b3ItMS9wb20ueG1sCkBAIC0wLDAgKzEsNzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LTMtaW5mbGVjdG9yLTE8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tc2VydmxldC0zLWluZmxlY3Rvci0xPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBTZXJ2bGV0IGludGVncmF0aW9uIHRlc3QgLSBzZXJ2bGV0LTMtaW5mbGVjdG9yLTEgLSBDaGVjayB0aGF0IGluZmxlY3RvcnMgaW4gcHJvZ3JhbW1hdGljYWxseSBjcmVhdGVkIHJlc291cmNlcyBhcmUKKyAgICAgICAgcHJvcGVybHkgaW5qZWN0ZWQuCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7c2VydmxldDMudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5mbGVjdG9yLTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5mbGVjdG9yXzEvTXlBcHBsaWNhdGlvbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluZmxlY3Rvci0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luZmxlY3Rvcl8xL015QXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzdhNzk3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluZmxlY3Rvci0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luZmxlY3Rvcl8xL015QXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbmZsZWN0b3JfMTsKKworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2U7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BBcHBsaWNhdGlvblBhdGgoIi8iKQorcHVibGljIGNsYXNzIE15QXBwbGljYXRpb24gZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisKKyAgICBwdWJsaWMgTXlBcHBsaWNhdGlvbigpIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2UuQnVpbGRlciByZXNvdXJjZUJ1aWxkZXIgPSBSZXNvdXJjZS5idWlsZGVyKCJyZXNvdXJjZSIpOworCisgICAgICAgIHJlc291cmNlQnVpbGRlci5hZGRDaGlsZFJlc291cmNlKCJjbGFzcyIpCisgICAgICAgICAgICAgICAgLmFkZE1ldGhvZCgiR0VUIikKKyAgICAgICAgICAgICAgICAuaGFuZGxlZEJ5KE15SW5mbGVjdG9yLmNsYXNzKTsKKyAgICAgICAgcmVzb3VyY2VCdWlsZGVyLmFkZENoaWxkUmVzb3VyY2UoImluc3RhbmNlIikKKyAgICAgICAgICAgICAgICAuYWRkTWV0aG9kKCJHRVQiKQorICAgICAgICAgICAgICAgIC5oYW5kbGVkQnkobmV3IE15SW5mbGVjdG9yKCkpOworCisgICAgICAgIHJlZ2lzdGVyUmVzb3VyY2VzKHJlc291cmNlQnVpbGRlci5idWlsZCgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5mbGVjdG9yLTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5mbGVjdG9yXzEvTXlJbmZsZWN0b3IuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbmZsZWN0b3ItMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbmZsZWN0b3JfMS9NeUluZmxlY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMTVhN2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5mbGVjdG9yLTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5mbGVjdG9yXzEvTXlJbmZsZWN0b3IuamF2YQpAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbmZsZWN0b3JfMTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuUHJvdmlkZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuSW5mbGVjdG9yOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgTXlJbmZsZWN0b3IgaW1wbGVtZW50cyBJbmZsZWN0b3I8Q29udGFpbmVyUmVxdWVzdENvbnRleHQsIFJlc3BvbnNlPiB7CisKKyAgICBASW5qZWN0CisgICAgcHJpdmF0ZSBQcm92aWRlcjxIdHRwU2VydmxldFJlcXVlc3Q+IHJlcXVlc3RQcm92aWRlcjsKKyAgICBASW5qZWN0CisgICAgcHJpdmF0ZSBQcm92aWRlcjxIdHRwU2VydmxldFJlc3BvbnNlPiByZXNwb25zZVByb3ZpZGVyOworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc3BvbnNlIGFwcGx5KGZpbmFsIENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB7CisgICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc3RyaW5nQnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisKKyAgICAgICAgLy8gUmVxdWVzdCBwcm92aWRlciAmIHJlcXVlc3QuCisgICAgICAgIGlmIChyZXF1ZXN0UHJvdmlkZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgc3RyaW5nQnVpbGRlci5hcHBlbmQoInJlcXVlc3RQcm92aWRlcl8iKTsKKyAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIuYXBwZW5kKHJlcXVlc3RQcm92aWRlci5nZXQoKSAhPSBudWxsID8gInJlcXVlc3QiIDogbnVsbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZCgibnVsbF9udWxsIik7CisgICAgICAgIH0KKworICAgICAgICBzdHJpbmdCdWlsZGVyLmFwcGVuZCgnXycpOworCisgICAgICAgIC8vIFJlc3BvbnNlIHByb3ZpZGVyICYgcmVzcG9uc2UuCisgICAgICAgIGlmIChyZXNwb25zZVByb3ZpZGVyICE9IG51bGwpIHsKKyAgICAgICAgICAgIHN0cmluZ0J1aWxkZXIuYXBwZW5kKCJyZXNwb25zZVByb3ZpZGVyXyIpOworICAgICAgICAgICAgc3RyaW5nQnVpbGRlci5hcHBlbmQocmVzcG9uc2VQcm92aWRlci5nZXQoKSAhPSBudWxsID8gInJlc3BvbnNlIiA6IG51bGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RyaW5nQnVpbGRlci5hcHBlbmQoIm51bGxfbnVsbCIpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKHN0cmluZ0J1aWxkZXIudG9TdHJpbmcoKSkuYnVpbGQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5mbGVjdG9yLTEvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5mbGVjdG9yXzEvSW5mbGVjdG9ySW5qZWN0aW9uVGVzdElUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluZmxlY3Rvci0xL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luZmxlY3Rvcl8xL0luZmxlY3RvckluamVjdGlvblRlc3RJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGZmMzc3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluZmxlY3Rvci0xL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luZmxlY3Rvcl8xL0luZmxlY3RvckluamVjdGlvblRlc3RJVENhc2UuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbmZsZWN0b3JfMTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEluZmxlY3RvckluamVjdGlvblRlc3RJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgTXlBcHBsaWNhdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5mbGVjdG9yQ2xhc3NJbmplY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RJbmZsZWN0b3JJbmplY3Rpb24oImNsYXNzIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5mbGVjdG9ySW5zdGFuY2VJbmplY3Rpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgX3Rlc3RJbmZsZWN0b3JJbmplY3Rpb24oImluc3RhbmNlIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIF90ZXN0SW5mbGVjdG9ySW5qZWN0aW9uKGZpbmFsIFN0cmluZyBwYXRoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJyZXNvdXJjZSIpLnBhdGgocGF0aCkucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJyZXF1ZXN0UHJvdmlkZXJfcmVxdWVzdF9yZXNwb25zZVByb3ZpZGVyX3Jlc3BvbnNlIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC0xL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC0xL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBhMWQwNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTEvcG9tLnhtbApAQCAtMCwwICsxLDY0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+c2VydmxldC0zLWluaXQtMTwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1zZXJ2bGV0LTMtaW5pdC0xPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPlNlcnZsZXQgaW50ZWdyYXRpb24gdGVzdCAtIHNlcnZsZXQtMy1pbml0LTEgLSBjb25maWd1cmVkIHZpYSBqYXgtcnMgYXBwbGljYXRpb24gYW5ub3RhdGVkIHdpdGggQGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzEvSGVsbG9Xb3JsZFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfMS9IZWxsb1dvcmxkUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTRkNTVmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzEvSGVsbG9Xb3JsZFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF8xOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CisKKy8qKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoImhlbGxvd29ybGQiKQorcHVibGljIGNsYXNzIEhlbGxvV29ybGRSZXNvdXJjZSB7CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgcmV0dXJuICJIZWxsbyBXb3JsZCEiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF8xL1NlcnZsZXQzaW5pdDEuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF8xL1NlcnZsZXQzaW5pdDEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2I3Yzg4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzEvU2VydmxldDNpbml0MS5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfMTsKKworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKKy8qKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uUGF0aCgiLyIpCitwdWJsaWMgY2xhc3MgU2VydmxldDNpbml0MSBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IGhhc2hTZXQgPSBuZXcgSGFzaFNldDxDbGFzczw/Pj4oKTsKKyAgICAgICAgaGFzaFNldC5hZGQoSGVsbG9Xb3JsZFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIGhhc2hTZXQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzEvVW5yZWFjaGFibGVSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzEvVW5yZWFjaGFibGVSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNTEyNjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfMS9VbnJlYWNoYWJsZVJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF8xOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworLyoqCisgKgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK0BQYXRoKCJ1bnJlYWNoYWJsZSIpCitwdWJsaWMgY2xhc3MgVW5yZWFjaGFibGVSZXNvdXJjZSB7CisgICAgQEdFVAorICAgIHB1YmxpYyBSZXNwb25zZSBnZXQoKSB7CisgICAgICAgIHJldHVybiBSZXNwb25zZS5vaygpLmJ1aWxkKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtMS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzEvSGVsbG9Xb3JsZFJlc291cmNlSVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC0xL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfMS9IZWxsb1dvcmxkUmVzb3VyY2VJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmVkYmY3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtMS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzEvSGVsbG9Xb3JsZFJlc291cmNlSVRDYXNlLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF8xOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5sb2dnaW5nLkxvZ2dpbmdGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkUmVzb3VyY2VJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgQXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEhlbGxvV29ybGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgV2ViVGFyZ2V0IHQgPSB0YXJnZXQoKTsKKyAgICAgICAgdC5yZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIFJlc3BvbnNlIHIgPSB0LnBhdGgoImhlbGxvd29ybGQiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHIuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkhlbGxvIFdvcmxkISIsIHIucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVbnJlYWNoYWJsZVJlc291cmNlKCkgeworICAgICAgICBSZXNwb25zZSByID0gdGFyZ2V0KCkucGF0aCgidW5yZWFjaGFibGUiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygiTWFuYWdlZCB0byByZWFjaCBhIHJlc291cmNlIHRoYXQgaXMgbm90IHJlZ2lzdGVyZWQgaW4gdGhlIGFwcGxpY2F0aW9uLiIsIDQwNCwgci5nZXRTdGF0dXMoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtMi9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtMi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMzdkMzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC0yL3BvbS54bWwKQEAgLTAsMCArMSw3MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtMy1pbml0LTI8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tc2VydmxldC0zLWluaXQtMjwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgU2VydmxldCBpbnRlZ3JhdGlvbiB0ZXN0IC0gc2VydmxldC0zLWluaXQtMiAtIGNvbmZpZ3VyZWQgdmlhIGpheC1ycyBhcHBsaWNhdGlvbiBhbm5vdGF0ZWQgd2l0aCBAamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoCisgICAgICAgIGFuZCBwcm92aWRlcnMgYW5ub3RhdGVkIHdpdGggQGphdmF4LndzLnJzLmV4dC5Qcm92aWRlci4KKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjQuMTA8L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzIvQ3VzdG9tRmVhdHVyZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzIvQ3VzdG9tRmVhdHVyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNmM1NTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfMi9DdXN0b21GZWF0dXJlLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF8yOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfMi5leHQuRXh0MVdyaXRlckludGVyY2VwdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0XzIuZXh0LkV4dDJXcml0ZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF8yLmV4dC5FeHQzV3JpdGVySW50ZXJjZXB0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfMi5leHQuRXh0NFdyaXRlckludGVyY2VwdG9yOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUHJvdmlkZXIKK3B1YmxpYyBjbGFzcyBDdXN0b21GZWF0dXJlIGltcGxlbWVudHMgRmVhdHVyZSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBjb25maWd1cmUoZmluYWwgRmVhdHVyZUNvbnRleHQgY29udGV4dCkgeworICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKEV4dDNXcml0ZXJJbnRlcmNlcHRvci5jbGFzcywgMTAwMCk7CisgICAgICAgIGNvbnRleHQucmVnaXN0ZXIoRXh0MldyaXRlckludGVyY2VwdG9yLmNsYXNzLCAxMDApOworICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKEV4dDFXcml0ZXJJbnRlcmNlcHRvci5JTlNUQU5DRSwgNTAwKTsKKyAgICAgICAgY29udGV4dC5yZWdpc3RlcihFeHQ0V3JpdGVySW50ZXJjZXB0b3IuSU5TVEFOQ0UsIDEpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfMi9IZWxsb1dvcmxkUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF8yL0hlbGxvV29ybGRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YjM3OTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfMi9IZWxsb1dvcmxkUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0XzI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKKworLyoqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiaGVsbG93b3JsZCIpCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZFJlc291cmNlIHsKKworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICByZXR1cm4gIkhlbGxvIFdvcmxkISI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzIvU2VydmxldDNpbml0Mi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzIvU2VydmxldDNpbml0Mi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMTI1NGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfMi9TZXJ2bGV0M2luaXQyLmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF8yOworCitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQEFwcGxpY2F0aW9uUGF0aCgiLyIpCitwdWJsaWMgY2xhc3MgU2VydmxldDNpbml0MiBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKworICAgIHB1YmxpYyBTZXJ2bGV0M2luaXQyKCkgeworICAgICAgICBwYWNrYWdlcyhmYWxzZSwgU2VydmxldDNpbml0Mi5jbGFzcy5nZXRQYWNrYWdlKCkuZ2V0TmFtZSgpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfMi9leHQvRXh0MVdyaXRlckludGVyY2VwdG9yLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfMi9leHQvRXh0MVdyaXRlckludGVyY2VwdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRlNGIwNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF8yL2V4dC9FeHQxV3JpdGVySW50ZXJjZXB0b3IuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0XzIuZXh0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yQ29udGV4dDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFByb3ZpZGVyCitwdWJsaWMgY2xhc3MgRXh0MVdyaXRlckludGVyY2VwdG9yIGltcGxlbWVudHMgV3JpdGVySW50ZXJjZXB0b3IgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBFeHQxV3JpdGVySW50ZXJjZXB0b3IgSU5TVEFOQ0UgPSBuZXcgRXh0MVdyaXRlckludGVyY2VwdG9yKCk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBhcm91bmRXcml0ZVRvKGZpbmFsIFdyaXRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgY29udGV4dC5zZXRFbnRpdHkoY29udGV4dC5nZXRFbnRpdHkoKSArICItZXh0MSIpOworICAgICAgICBjb250ZXh0LnByb2NlZWQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfMi9leHQvRXh0MldyaXRlckludGVyY2VwdG9yLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfMi9leHQvRXh0MldyaXRlckludGVyY2VwdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJjOWEwNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF8yL2V4dC9FeHQyV3JpdGVySW50ZXJjZXB0b3IuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0XzIuZXh0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yQ29udGV4dDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFByb3ZpZGVyCitwdWJsaWMgY2xhc3MgRXh0MldyaXRlckludGVyY2VwdG9yIGltcGxlbWVudHMgV3JpdGVySW50ZXJjZXB0b3IgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYXJvdW5kV3JpdGVUbyhmaW5hbCBXcml0ZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGNvbnRleHQuc2V0RW50aXR5KGNvbnRleHQuZ2V0RW50aXR5KCkgKyAiLWV4dDIiKTsKKyAgICAgICAgY29udGV4dC5wcm9jZWVkKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzIvZXh0L0V4dDNXcml0ZXJJbnRlcmNlcHRvci5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzIvZXh0L0V4dDNXcml0ZXJJbnRlcmNlcHRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMmIxYmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfMi9leHQvRXh0M1dyaXRlckludGVyY2VwdG9yLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF8yLmV4dDsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvckNvbnRleHQ7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BQcm92aWRlcgorcHVibGljIGNsYXNzIEV4dDNXcml0ZXJJbnRlcmNlcHRvciBpbXBsZW1lbnRzIFdyaXRlckludGVyY2VwdG9yIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFyb3VuZFdyaXRlVG8oZmluYWwgV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICBjb250ZXh0LnNldEVudGl0eShjb250ZXh0LmdldEVudGl0eSgpICsgIi1leHQzIik7CisgICAgICAgIGNvbnRleHQucHJvY2VlZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF8yL2V4dC9FeHQ0V3JpdGVySW50ZXJjZXB0b3IuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF8yL2V4dC9FeHQ0V3JpdGVySW50ZXJjZXB0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2JiNzM0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzIvZXh0L0V4dDRXcml0ZXJJbnRlcmNlcHRvci5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfMi5leHQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0OworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUHJvdmlkZXIKK3B1YmxpYyBjbGFzcyBFeHQ0V3JpdGVySW50ZXJjZXB0b3IgaW1wbGVtZW50cyBXcml0ZXJJbnRlcmNlcHRvciB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIEV4dDRXcml0ZXJJbnRlcmNlcHRvciBJTlNUQU5DRSA9IG5ldyBFeHQ0V3JpdGVySW50ZXJjZXB0b3IoKTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFyb3VuZFdyaXRlVG8oZmluYWwgV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICBjb250ZXh0LnNldEVudGl0eShjb250ZXh0LmdldEVudGl0eSgpICsgIi1leHQ0Iik7CisgICAgICAgIGNvbnRleHQucHJvY2VlZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF8yL0hlbGxvV29ybGRSZXNvdXJjZUlUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzIvSGVsbG9Xb3JsZFJlc291cmNlSVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBmYmRiMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF8yL0hlbGxvV29ybGRSZXNvdXJjZUlUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfMjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEhlbGxvV29ybGRSZXNvdXJjZUlUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBcHBsaWNhdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVsbG9Xb3JsZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByID0gdGFyZ2V0KCkucGF0aCgiaGVsbG93b3JsZCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgci5nZXRTdGF0dXMoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiSGVsbG8gV29ybGQhLWV4dDQtZXh0Mi1leHQxLWV4dDMiLCByLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC0zL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC0zL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFlYTQ2MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTMvcG9tLnhtbApAQCAtMCwwICsxLDcwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+c2VydmxldC0zLWluaXQtMzwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1zZXJ2bGV0LTMtaW5pdC0zPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPlNlcnZsZXQgaW50ZWdyYXRpb24gdGVzdCAtIHNlcnZsZXQtMy1pbml0LTMgLSBib3RoIEFwcGxpY2F0aW9uLmdldENsYXNzZXMgYW5kIEFwcGxpY2F0aW9uLmdldFNpbmdsZXRvbnMgcmV0dXJuIGFuIGVtcHR5IGNvbGxlY3Rpb248L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtzZXJ2bGV0My52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF8zL0VtcHR5QXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF8zL0VtcHR5QXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGYzNzgzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtMy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzMvRW1wdHlBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfMzsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBFbXB0eUFwcGxpY2F0aW9uIGV4dGVuZHMgQXBwbGljYXRpb24geworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtMy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzMvcmVzb3VyY2UvUmVzb3VyY2VPbmUuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF8zL3Jlc291cmNlL1Jlc291cmNlT25lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMxZTM5YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF8zL3Jlc291cmNlL1Jlc291cmNlT25lLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF8zLnJlc291cmNlOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BQYXRoKCJvbmUiKQorcHVibGljIGNsYXNzIFJlc291cmNlT25lIHsKKworICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgcmV0dXJuIFJlc291cmNlT25lLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC0zL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfMy9yZXNvdXJjZS9SZXNvdXJjZVR3by5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtMy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzMvcmVzb3VyY2UvUmVzb3VyY2VUd28uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmNlMjQ1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtMy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzMvcmVzb3VyY2UvUmVzb3VyY2VUd28uamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0XzMucmVzb3VyY2U7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFBhdGgoInR3byIpCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VUd28geworCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICByZXR1cm4gUmVzb3VyY2VUd28uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMWVkNTE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtMy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzNfMC54c2QiCisgICAgICAgICB2ZXJzaW9uPSIzLjAiPgorICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0XzMuRW1wdHlBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgIDwvc2VydmxldD4KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0XzMuRW1wdHlBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtMy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzMvRW1wdHlBcHBsaWNhdGlvblRlc3RJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF8zL0VtcHR5QXBwbGljYXRpb25UZXN0SVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc2MjU3NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF8zL0VtcHR5QXBwbGljYXRpb25UZXN0SVRDYXNlLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF8zOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0XzMucmVzb3VyY2UuUmVzb3VyY2VPbmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfMy5yZXNvdXJjZS5SZXNvdXJjZVR3bzsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEVtcHR5QXBwbGljYXRpb25UZXN0SVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IEVtcHR5QXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlT25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJvbmUiKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmVzb3VyY2VPbmUuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlVHdvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJ0d28iKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmVzb3VyY2VUd28uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTQvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTQvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzA2NjZkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtNC9wb20ueG1sCkBAIC0wLDAgKzEsNzMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LTMtaW5pdC00PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLXNlcnZsZXQtMy1pbml0LTQ8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIFNlcnZsZXQgaW50ZWdyYXRpb24gdGVzdCAtIHNlcnZsZXQtMy1pbml0LTQgLSBib3RoIEFwcGxpY2F0aW9uLmdldENsYXNzZXMgYW5kIEFwcGxpY2F0aW9uLmdldFNpbmdsZXRvbnMgcmV0dXJuIGFuIGVtcHR5CisgICAgICAgIGNvbGxlY3Rpb24sIEBBcHBsaWNhdGlvblBhdGggcHJlc2VudAorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguc2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3NlcnZsZXQzLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzQvRW1wdHlBcHBsaWNhdGlvbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzQvRW1wdHlBcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMjA0MmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC00L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfNC9FbXB0eUFwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF80OworCitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BBcHBsaWNhdGlvblBhdGgoIi8iKQorcHVibGljIGNsYXNzIEVtcHR5QXBwbGljYXRpb24gZXh0ZW5kcyBBcHBsaWNhdGlvbiB7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC00L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfNC9yZXNvdXJjZS9SZXNvdXJjZU9uZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzQvcmVzb3VyY2UvUmVzb3VyY2VPbmUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDNlNTBjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzQvcmVzb3VyY2UvUmVzb3VyY2VPbmUuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0XzQucmVzb3VyY2U7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFBhdGgoIm9uZSIpCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VPbmUgeworCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICByZXR1cm4gUmVzb3VyY2VPbmUuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF80L3Jlc291cmNlL1Jlc291cmNlVHdvLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC00L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfNC9yZXNvdXJjZS9SZXNvdXJjZVR3by5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZTlkZTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC00L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfNC9yZXNvdXJjZS9SZXNvdXJjZVR3by5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfNC5yZXNvdXJjZTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUGF0aCgidHdvIikKK3B1YmxpYyBjbGFzcyBSZXNvdXJjZVR3byB7CisKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgIHJldHVybiBSZXNvdXJjZVR3by5jbGFzcy5nZXRTaW1wbGVOYW1lKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzQvRW1wdHlBcHBsaWNhdGlvblRlc3RJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF80L0VtcHR5QXBwbGljYXRpb25UZXN0SVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGMzYjJiNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF80L0VtcHR5QXBwbGljYXRpb25UZXN0SVRDYXNlLmphdmEKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF80OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0XzQucmVzb3VyY2UuUmVzb3VyY2VPbmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfNC5yZXNvdXJjZS5SZXNvdXJjZVR3bzsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEVtcHR5QXBwbGljYXRpb25UZXN0SVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IEVtcHR5QXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlT25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJvbmUiKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmVzb3VyY2VPbmUuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlVHdvKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJ0d28iKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoUmVzb3VyY2VUd28uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTUvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTUvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTZhYWM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtNS9wb20ueG1sCkBAIC0wLDAgKzEsNzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LTMtaW5pdC01PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLXNlcnZsZXQtMy1pbml0LTU8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+U2VydmxldCBpbnRlZ3JhdGlvbiB0ZXN0IC0gc2VydmxldC0zLWluaXQtNSAtIG5vIEFwcGxpY2F0aW9uIHN1YmNsYXNzIGlzIHByZXNlbnQ7CisgICAgICAgIGR5bmFtaWNhbGx5IGFkZCBhIHNlcnZsZXQgYW5kIHNldCBpdHMgbmFtZSB0byBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7c2VydmxldDMudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF81L0hlbGxvV29ybGRSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtNS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzUvSGVsbG9Xb3JsZFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFkODA5MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF81L0hlbGxvV29ybGRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfNTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiaGVsbG93b3JsZCIpCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZFJlc291cmNlIHsKKworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBIZWxsbyBnZXQoKSB7CisgICAgICAgIHJldHVybiBuZXcgSGVsbG8oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEhlbGxvIHsKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF81L0hlbGxvV3JpdGVyLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC01L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfNS9IZWxsb1dyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MDU3M2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC01L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfNS9IZWxsb1dyaXRlci5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfNTsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworCitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5NZXNzYWdlVXRpbHM7CisKKy8qKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQcm92aWRlcgorcHVibGljIGNsYXNzIEhlbGxvV3JpdGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8SGVsbG9Xb3JsZFJlc291cmNlLkhlbGxvPiB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHR5cGUuZXF1YWxzKEhlbGxvV29ybGRSZXNvdXJjZS5IZWxsby5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShmaW5hbCBIZWxsb1dvcmxkUmVzb3VyY2UuSGVsbG8gaGVsbG8sIGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oZmluYWwgSGVsbG9Xb3JsZFJlc291cmNlLkhlbGxvIGhlbGxvLCBmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLCBmaW5hbCBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZSgoIkhlbGxvIFdvcmxkISAiICsgdGhpcy5nZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpCisgICAgICAgICAgICAgICAgLmdldEJ5dGVzKE1lc3NhZ2VVdGlscy5nZXRDaGFyc2V0KG1lZGlhVHlwZSkpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC01L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC01L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIwY2IzZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTUvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8zXzAueHNkIgorICAgICAgICAgdmVyc2lvbj0iMy4wIj4KKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5qYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uPC9zZXJ2bGV0LW5hbWU+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+amF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtNS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzUvSGVsbG9Xb3JsZFJlc291cmNlSVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC01L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfNS9IZWxsb1dvcmxkUmVzb3VyY2VJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjE0Mzc2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtNS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzUvSGVsbG9Xb3JsZFJlc291cmNlSVRDYXNlLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF81OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEhlbGxvV29ybGRSZXNvdXJjZUlUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKEhlbGxvV29ybGRSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIZWxsb1dvcmxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBzID0gdGFyZ2V0KCkucGF0aCgiaGVsbG93b3JsZCIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShzLmVxdWFscygiSGVsbG8gV29ybGQhICIgKyB0aGlzLmdldENsYXNzKCkuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTYvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTYvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDljODc1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtNi9wb20ueG1sCkBAIC0wLDAgKzEsNzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LTMtaW5pdC02PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLXNlcnZsZXQtMy1pbml0LTY8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+U2VydmxldCBpbnRlZ3JhdGlvbiB0ZXN0IC0gc2VydmxldC0zLWluaXQtNSAtIEFwcGxpY2F0aW9uIHN1YmNsYXNzIGlzIHByZXNlbnQ7CisgICAgICAgIHNlcnZsZXQtbWFwcGluZyBpbiB3ZWIueG1sPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7c2VydmxldDMudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF82L0VtcHR5QXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF82L0VtcHR5QXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjBmMWM1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtNi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzYvRW1wdHlBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfNjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBFbXB0eUFwcGxpY2F0aW9uIGV4dGVuZHMgQXBwbGljYXRpb24geworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtNi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzYvcmVzb3VyY2UvUmVzb3VyY2VPbmUuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF82L3Jlc291cmNlL1Jlc291cmNlT25lLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRkYThlYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTYvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF82L3Jlc291cmNlL1Jlc291cmNlT25lLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF82LnJlc291cmNlOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BQYXRoKCJvbmUiKQorcHVibGljIGNsYXNzIFJlc291cmNlT25lIHsKKworICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgcmV0dXJuIFJlc291cmNlT25lLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC02L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfNi9yZXNvdXJjZS9SZXNvdXJjZVR3by5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtNi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzYvcmVzb3VyY2UvUmVzb3VyY2VUd28uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDRlMjcwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtNi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzYvcmVzb3VyY2UvUmVzb3VyY2VUd28uamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0XzYucmVzb3VyY2U7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFBhdGgoInR3byIpCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VUd28geworCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICByZXR1cm4gUmVzb3VyY2VUd28uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTYvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTYvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWJmMTU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtNi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfM18wLnhzZCIKKyAgICAgICAgdmVyc2lvbj0iMy4wIj4KKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF82LkVtcHR5QXBwbGljYXRpb248L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0XzYuRW1wdHlBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtNi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzYvRW1wdHlBcHBsaWNhdGlvbklUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtNi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzYvRW1wdHlBcHBsaWNhdGlvbklUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NWQ4YmIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC02L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfNi9FbXB0eUFwcGxpY2F0aW9uSVRDYXNlLmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF82OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0XzYucmVzb3VyY2UuUmVzb3VyY2VPbmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfNi5yZXNvdXJjZS5SZXNvdXJjZVR3bzsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBFbXB0eUFwcGxpY2F0aW9uSVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IEVtcHR5QXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlT25lKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJvbmUiKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdChyZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBpcyhSZXNvdXJjZU9uZS5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZVR3bygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgidHdvIikucmVxdWVzdCgpLmdldCgpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoUmVzb3VyY2VUd28uY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtNy9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtNy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwODY5ZDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC03L3BvbS54bWwKQEAgLTAsMCArMSw3MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtMy1pbml0LTc8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tc2VydmxldC0zLWluaXQtNzwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5TZXJ2bGV0IGludGVncmF0aW9uIHRlc3QgLSBzZXJ2bGV0LTMtaW5pdC03IC0gbm8gQXBwbGljYXRpb24gc3ViY2xhc3MgaXMgcHJlc2VudDsKKyAgICAgICAgZHluYW1pY2FsbHkgYWRkIGEgc2VydmxldCBhbmQgc2V0IGl0cyBuYW1lIHRvIGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisgICAgICAgIHNlcnZsZXQtbWFwcGluZyBpbiB3ZWIueG1sPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7c2VydmxldDMudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF83L0hlbGxvV29ybGRSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtNy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzcvSGVsbG9Xb3JsZFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNhYWY5MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF83L0hlbGxvV29ybGRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfNzsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiaGVsbG93b3JsZCIpCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZFJlc291cmNlIHsKKworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBIZWxsbyBnZXQoKSB7CisgICAgICAgIHJldHVybiBuZXcgSGVsbG8oKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEhlbGxvIHsKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF83L0hlbGxvV3JpdGVyLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC03L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfNy9IZWxsb1dyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlOTg5OGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC03L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfNy9IZWxsb1dyaXRlci5qYXZhCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfNzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworCitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitAUHJvdmlkZXIKK3B1YmxpYyBjbGFzcyBIZWxsb1dyaXRlciBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5V3JpdGVyPEhlbGxvV29ybGRSZXNvdXJjZS5IZWxsbz4geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIHR5cGUuZXF1YWxzKEhlbGxvV29ybGRSZXNvdXJjZS5IZWxsby5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShmaW5hbCBIZWxsb1dvcmxkUmVzb3VyY2UuSGVsbG8gaGVsbG8sIGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oZmluYWwgSGVsbG9Xb3JsZFJlc291cmNlLkhlbGxvIGhlbGxvLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8Pz4gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT3V0cHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGVudGl0eVN0cmVhbS53cml0ZSgoIkhlbGxvIFdvcmxkISAiICsgdGhpcy5nZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpLmdldEJ5dGVzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTcvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTcvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODdmNDQxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtNy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzNfMC54c2QiCisgICAgICAgICB2ZXJzaW9uPSIzLjAiPgorICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPmphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb248L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPmphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb248L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF83L0hlbGxvV29ybGRSZXNvdXJjZUlUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtNy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzcvSGVsbG9Xb3JsZFJlc291cmNlSVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNmMzZlMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF83L0hlbGxvV29ybGRSZXNvdXJjZUlUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfNzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKKy8qKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkUmVzb3VyY2VJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoKSB7CisgICAgICAgIGVuYWJsZShUZXN0UHJvcGVydGllcy5MT0dfVFJBRkZJQyk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhIZWxsb1dvcmxkUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVsbG9Xb3JsZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBTdHJpbmcgcyA9IHRhcmdldCgpLnBhdGgoImhlbGxvd29ybGQiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRydWUocy5lcXVhbHMoIkhlbGxvIFdvcmxkISAiICsgdGhpcy5nZXRDbGFzcygpLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC04L3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC04L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDk0ZmNmYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTgvcG9tLnhtbApAQCAtMCwwICsxLDY2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+c2VydmxldC0zLWluaXQtODwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1zZXJ2bGV0LTMtaW5pdC04PC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPlNlcnZsZXQgaW50ZWdyYXRpb24gdGVzdCAtIHNlcnZsZXQtMy1pbml0LTggLSBtb3JlIGpheC1ycyBhcHBsaWNhdGlvbnMKKyAgICAgICAgKGFubm90YXRlZCB3aXRoIEBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGggYW5kL29yIGNvbmZpZ3VyZWQgaW4gd2ViLnhtbCkuCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtOC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzgvSGVsbG9Xb3JsZDFSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtOC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzgvSGVsbG9Xb3JsZDFSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MDQxMzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC04L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfOC9IZWxsb1dvcmxkMVJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF84OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CisKKy8qKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoImhlbGxvd29ybGQxIikKK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkMVJlc291cmNlIHsKKworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICByZXR1cm4gIkhlbGxvIFdvcmxkIDEhIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC04L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfOC9IZWxsb1dvcmxkMlJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC04L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfOC9IZWxsb1dvcmxkMlJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JhMWJkZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF84L0hlbGxvV29ybGQyUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0Xzg7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKKworLyoqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiaGVsbG93b3JsZDIiKQorcHVibGljIGNsYXNzIEhlbGxvV29ybGQyUmVzb3VyY2UgeworCisgICAgQEdFVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgIHJldHVybiAiSGVsbG8gV29ybGQgMiEiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF84L0hlbGxvV29ybGQzUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF84L0hlbGxvV29ybGQzUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTBhZTYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtOC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzgvSGVsbG9Xb3JsZDNSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfODsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCisvKioKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJoZWxsb3dvcmxkMyIpCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZDNSZXNvdXJjZSB7CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgcmV0dXJuICJIZWxsbyBXb3JsZCAzISI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtOC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzgvSGVsbG9Xb3JsZDRSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtOC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzgvSGVsbG9Xb3JsZDRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyOTM2YTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC04L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfOC9IZWxsb1dvcmxkNFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF84OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CisKKy8qKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoImhlbGxvd29ybGQ0IikKK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkNFJlc291cmNlIHsKKworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICByZXR1cm4gIkhlbGxvIFdvcmxkIDQhIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC04L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfOC9TZXJ2bGV0M0luaXQ4QXBwMS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtOC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzgvU2VydmxldDNJbml0OEFwcDEuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzJjNzE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtOC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzgvU2VydmxldDNJbml0OEFwcDEuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0Xzg7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKKy8qKgorICogVGhlIGFwcGxpY2F0aW9uIGlzIGZ1bGx5IGNvbmZpZ3VyZWQgaW4ge0Bjb2RlIHdlYi54bWx9ICh7QGNvZGUgc2VydmxldH0gYXMgd2VsbCBhcyB7QGNvZGUgc2VydmxldC1tYXBwaW5nfSkuCisgKiBJdCBtZWFucyB7QGNvZGUgQXBwbGljYXRpb25QYXRoLnZhbHVlfSAoe0Bjb2RlIC9hcHAxYW5ufSkgaXMgb3ZlcnJpZGRlbiB1c2luZyBhIHtAY29kZSBzZXJ2bGV0LW1hcHBpbmd9IGVsZW1lbnQuCisgKiBUaGUgYXBwbGljYXRpb24gYWxzbyBleHBsaWNpdGx5IHJlZ2lzdGVyIEpBWC1SUyByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitAQXBwbGljYXRpb25QYXRoKCIvYXBwMWFubiIpCitwdWJsaWMgY2xhc3MgU2VydmxldDNJbml0OEFwcDEgZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IGhhc2hTZXQgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgIGhhc2hTZXQuYWRkKEhlbGxvV29ybGQxUmVzb3VyY2UuY2xhc3MpOworICAgICAgICByZXR1cm4gaGFzaFNldDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC04L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfOC9TZXJ2bGV0M0luaXQ4QXBwMi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtOC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzgvU2VydmxldDNJbml0OEFwcDIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2E2ZWNmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtOC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzgvU2VydmxldDNJbml0OEFwcDIuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0Xzg7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKKy8qKgorICogVGhlIGFwcGxpY2F0aW9uIGlzIHBhcnRpYWxseSBjb25maWd1cmVkIGluIHtAY29kZSB3ZWIueG1sfSAoanVzdCB7QGNvZGUgc2VydmxldH0gZWxlbWVudCkuCisgKiBJdCBtZWFucyB7QGNvZGUgQXBwbGljYXRpb25QYXRoLnZhbHVlfSAoe0Bjb2RlIC9hcHAyYW5ufSkgaXMgdXNlZCBhcyBiYXNlIHNlcnZsZXQgVVJJLgorICogVGhlIGFwcGxpY2F0aW9uIGFsc28gZXhwbGljaXRseSByZWdpc3RlciBKQVgtUlMgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uUGF0aCgiL2FwcDJhbm4iKQorcHVibGljIGNsYXNzIFNlcnZsZXQzSW5pdDhBcHAyIGV4dGVuZHMgQXBwbGljYXRpb24geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgZmluYWwgU2V0PENsYXNzPD8+PiBoYXNoU2V0ID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICBoYXNoU2V0LmFkZChIZWxsb1dvcmxkMlJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIGhhc2hTZXQ7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC04L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfOC9TZXJ2bGV0M0luaXQ4QXBwMy5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtOC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzgvU2VydmxldDNJbml0OEFwcDMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzE2M2UxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtOC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzgvU2VydmxldDNJbml0OEFwcDMuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0Xzg7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKKy8qKgorICogVGhlIGFwcGxpY2F0aW9uIGlzIG5vdCBjb25maWd1cmVkIGluIHtAY29kZSB3ZWIueG1sfS4KKyAqIEl0IG1lYW5zIHtAY29kZSBBcHBsaWNhdGlvblBhdGgudmFsdWV9ICh7QGNvZGUgL2FwcDNhbm59KSBpcyB1c2VkIGFzIGJhc2Ugc2VydmxldCBVUkkuCisgKiBUaGUgYXBwbGljYXRpb24gYWxzbyBleHBsaWNpdGx5IHJlZ2lzdGVyIEpBWC1SUyByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitAQXBwbGljYXRpb25QYXRoKCIvYXBwM2FubiIpCitwdWJsaWMgY2xhc3MgU2VydmxldDNJbml0OEFwcDMgZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IGhhc2hTZXQgPSBuZXcgSGFzaFNldDw+KCk7CisgICAgICAgIGhhc2hTZXQuYWRkKEhlbGxvV29ybGQzUmVzb3VyY2UuY2xhc3MpOworICAgICAgICByZXR1cm4gaGFzaFNldDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF84L1NlcnZsZXQzSW5pdDhBcHA0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC04L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfOC9TZXJ2bGV0M0luaXQ4QXBwNC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMzY2N2MKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC04L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfOC9TZXJ2bGV0M0luaXQ4QXBwNC5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfODsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCisvKioKKyAqIFRoZSBhcHBsaWNhdGlvbiBpcyBmdWxseSBjb25maWd1cmVkIGluIHtAY29kZSB3ZWIueG1sfSAoe0Bjb2RlIHNlcnZsZXR9IGFzIHdlbGwgYXMge0Bjb2RlIHNlcnZsZXQtbWFwcGluZ30pLgorICogQW5kIHRoZXJlIGlzIG5vIHtAY29kZSBBcHBsaWNhdGlvblBhdGh9IGFubm90YXRpb24gb24gdGhlIGNsYXNzLgorICogVGhlIGFwcGxpY2F0aW9uIGFsc28gZXhwbGljaXRseSByZWdpc3RlciBKQVgtUlMgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFNlcnZsZXQzSW5pdDhBcHA0IGV4dGVuZHMgQXBwbGljYXRpb24geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgZmluYWwgU2V0PENsYXNzPD8+PiBoYXNoU2V0ID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICBoYXNoU2V0LmFkZChIZWxsb1dvcmxkNFJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIGhhc2hTZXQ7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC04L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfOC9TZXJ2bGV0M0luaXQ4QXBwNS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtOC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzgvU2VydmxldDNJbml0OEFwcDUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWYyZWE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtOC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzgvU2VydmxldDNJbml0OEFwcDUuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0Xzg7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCisvKioKKyAqIFRoZSBhcHBsaWNhdGlvbiBpcyBmdWxseSBjb25maWd1cmVkIGluIHtAY29kZSB3ZWIueG1sfSAoe0Bjb2RlIHNlcnZsZXR9IGFzIHdlbGwgYXMge0Bjb2RlIHNlcnZsZXQtbWFwcGluZ30pLgorICogQW5kIHRoZXJlIGlzIG5vIHtAY29kZSBBcHBsaWNhdGlvblBhdGh9IGFubm90YXRpb24gb24gdGhlIGNsYXNzLgorICogVGhlIGFwcGxpY2F0aW9uIGRvZXMgTk9UIGV4cGxpY2l0bHkgcmVnaXN0ZXIgYW55IEpBWC1SUyByZXNvdXJjZS4gQWxsIGF2YWlsYWJsZSByZXNvdXJjZXMgYXJlIGF1dG9tYXRpY2FsbHkgcmVnaXN0ZXJlZC4KKyAqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgU2VydmxldDNJbml0OEFwcDUgZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF84L1VucmVhY2hhYmxlUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTgvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF84L1VucmVhY2hhYmxlUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWY5NzEwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtOC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzgvVW5yZWFjaGFibGVSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfODsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKKy8qKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoInVucmVhY2hhYmxlIikKK3B1YmxpYyBjbGFzcyBVbnJlYWNoYWJsZVJlc291cmNlIHsKKworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICByZXR1cm4gIkhlbGxvIFVucmVhY2hhYmxlISI7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC04L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC04L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVjM2E2MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTgvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDUzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCisgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzNfMC54c2QiIHZlcnNpb249IjMuMCI+CisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfOC5TZXJ2bGV0M0luaXQ4QXBwMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfOC5TZXJ2bGV0M0luaXQ4QXBwMTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L2FwcDEvKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF84LlNlcnZsZXQzSW5pdDhBcHAyPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF84LlNlcnZsZXQzSW5pdDhBcHA0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF84LlNlcnZsZXQzSW5pdDhBcHA0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vYXBwNC8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0XzguU2VydmxldDNJbml0OEFwcDU8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgIDwvc2VydmxldD4KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0XzguU2VydmxldDNJbml0OEFwcDU8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9hcHA1Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtOC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzgvSGVsbG9Xb3JsZFJlc291cmNlSVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC04L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfOC9IZWxsb1dvcmxkUmVzb3VyY2VJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTU1NjgxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtOC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0XzgvSGVsbG9Xb3JsZFJlc291cmNlSVRDYXNlLmphdmEKQEAgLTAsMCArMSw5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF84OworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubG9nZ2luZy5Mb2dnaW5nRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdCByZWFjaGFibGUgcmVzb3VyY2VzLgorICoKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZFJlc291cmNlSVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBhcHBQYXRoOworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIHJlc291cmNlUGF0aDsKKyAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBoZWxsb05hbWU7CisKKyAgICBwdWJsaWMgSGVsbG9Xb3JsZFJlc291cmNlSVRDYXNlKFN0cmluZyBhcHBQYXRoLCBTdHJpbmcgcmVzb3VyY2VQYXRoLCBTdHJpbmcgaGVsbG9OYW1lKSB7CisgICAgICAgIHRoaXMuYXBwUGF0aCA9IGFwcFBhdGg7CisgICAgICAgIHRoaXMucmVzb3VyY2VQYXRoID0gcmVzb3VyY2VQYXRoOworICAgICAgICB0aGlzLmhlbGxvTmFtZSA9IGhlbGxvTmFtZTsKKyAgICB9CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKG5hbWUgPSAie2luZGV4fTogezB9L3sxfSBcInsyfVwiIikKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8T2JqZWN0W10+IHRlc3REYXRhKCkgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W11bXSB7CisgICAgICAgICAgICAgICAgeyIvYXBwMSIsICJoZWxsb3dvcmxkMSIsICJXb3JsZCAxIn0sIC8vYXBwMSAtIG92ZXJyaWRkZW4gdXNpbmcgYSBzZXJ2bGV0LW1hcHBpbmcgZWxlbWVudCBpbiB0aGUgd2ViLnhtbAorICAgICAgICAgICAgICAgIHsiL2FwcDJhbm4iLCAiaGVsbG93b3JsZDIiLCAiV29ybGQgMiJ9LCAvL2FwcDJhbm4gLSBubyBzZXJ2bGV0LW1hcHBpbmcgaW4gdGhlIHdlYi54bWwsIHVzZWQgQXBwbGljYXRpb25QYXRoLnZhbHVlCisgICAgICAgICAgICAgICAgeyIvYXBwM2FubiIsICJoZWxsb3dvcmxkMyIsICJXb3JsZCAzIn0sIC8vYXBwM2FubiAtIG5vIHNlcnZsZXQgaW4gdGhlIHdlYi54bWwsIHVzZWQgQXBwbGljYXRpb25QYXRoLnZhbHVlCisgICAgICAgICAgICAgICAgeyIvYXBwNCIsICJoZWxsb3dvcmxkNCIsICJXb3JsZCA0In0sIC8vYXBwNCAtIGZ1bGx5IGNvbmZpZ3VyZWQgaW4gd2ViLnhtbAorICAgICAgICAgICAgICAgIC8vYXBwNSAtICBhdXRvbWF0aWMgcmVnaXN0cmF0aW9uIG9mIGFsbCByZXNvdXJjZXMsIG5vIGV4cGxpY2l0IGNsYXNzZXMvc2luZ2xldG9ucyBwcm92aWRlZCBieSBTZXJ2bGV0M0luaXQ4QXBwNQorICAgICAgICAgICAgICAgIHsiL2FwcDUiLCAiaGVsbG93b3JsZDEiLCAiV29ybGQgMSJ9LAorICAgICAgICAgICAgICAgIHsiL2FwcDUiLCAiaGVsbG93b3JsZDIiLCAiV29ybGQgMiJ9LAorICAgICAgICAgICAgICAgIHsiL2FwcDUiLCAiaGVsbG93b3JsZDMiLCAiV29ybGQgMyJ9LAorICAgICAgICAgICAgICAgIHsiL2FwcDUiLCAiaGVsbG93b3JsZDQiLCAiV29ybGQgNCJ9LAorICAgICAgICAgICAgICAgIHsiL2FwcDUiLCAidW5yZWFjaGFibGUiLCAiVW5yZWFjaGFibGUifSwKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBcHBsaWNhdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SGVsbG9Xb3JsZCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBXZWJUYXJnZXQgdCA9IHRhcmdldChhcHBQYXRoKTsKKyAgICAgICAgdC5yZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIFJlc3BvbnNlIHIgPSB0LnBhdGgocmVzb3VyY2VQYXRoKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHIuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkhlbGxvICIgKyBoZWxsb05hbWUgKyAiISIsIHIucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LTgvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF84L0hlbGxvV29ybGRSZXNvdXJjZVVucmVhY2hhYmxlSVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC04L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfOC9IZWxsb1dvcmxkUmVzb3VyY2VVbnJlYWNoYWJsZUlUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNDY4N2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC04L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfOC9IZWxsb1dvcmxkUmVzb3VyY2VVbnJlYWNoYWJsZUlUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfODsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3QgdW5yZWFjaGFibGUgcmVzb3VyY2VzLgorICoKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZFJlc291cmNlVW5yZWFjaGFibGVJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGFwcFBhdGg7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcmVzb3VyY2VQYXRoOworCisgICAgcHVibGljIEhlbGxvV29ybGRSZXNvdXJjZVVucmVhY2hhYmxlSVRDYXNlKFN0cmluZyBhcHBQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVzb3VyY2VQYXRoKSB7CisgICAgICAgIHRoaXMuYXBwUGF0aCA9IGFwcFBhdGg7CisgICAgICAgIHRoaXMucmVzb3VyY2VQYXRoID0gcmVzb3VyY2VQYXRoOworICAgIH0KKworICAgIEBQYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMobmFtZSA9ICJ7aW5kZXh9OiB7MH0vezF9IikKKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8T2JqZWN0W10+IHRlc3REYXRhKCkgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W11bXSB7CisgICAgICAgICAgICAgICAgeyIvYXBwMSIsICJ1bnJlYWNoYWJsZSJ9LCAvL3VucmVhY2hhYmxlIC0gbm8gZXhwbGljaXRseSBtZW50aW9uZWQgcmVzb3VyY2UKKyAgICAgICAgICAgICAgICB7Ii9hcHAxYW5uIiwgImhlbGxvd29ybGQxIn0sIC8vYXBwMWFubiAtIG92ZXJyaWRkZW4gdXNpbmcgYSBzZXJ2bGV0LW1hcHBpbmcgZWxlbWVudCBpbiB0aGUgd2ViLnhtbAorICAgICAgICAgICAgICAgIHsiL2FwcDJhbm4iLCAidW5yZWFjaGFibGUifSwgLy91bnJlYWNoYWJsZSAtIG5vIGV4cGxpY2l0bHkgbWVudGlvbmVkIHJlc291cmNlCisgICAgICAgICAgICAgICAgeyIvYXBwM2FubiIsICJ1bnJlYWNoYWJsZSJ9LCAvL3VucmVhY2hhYmxlIC0gbm8gZXhwbGljaXRseSBtZW50aW9uZWQgcmVzb3VyY2UKKyAgICAgICAgICAgICAgICB7Ii9hcHA0IiwgInVucmVhY2hhYmxlIn0sIC8vdW5yZWFjaGFibGUgLSBubyBleHBsaWNpdGx5IG1lbnRpb25lZCByZXNvdXJjZQorICAgICAgICB9KTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IEFwcGxpY2F0aW9uKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RVbnJlYWNoYWJsZVJlc291cmNlKCkgeworICAgICAgICBXZWJUYXJnZXQgdCA9IHRhcmdldChhcHBQYXRoKTsKKyAgICAgICAgdC5yZWdpc3RlcihMb2dnaW5nRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIFJlc3BvbnNlIHIgPSB0LnBhdGgocmVzb3VyY2VQYXRoKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscyg0MDQsIHIuZ2V0U3RhdHVzKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LXByb3ZpZGVyL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU0MTdjYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LXByb3ZpZGVyL3BvbS54bWwKQEAgLTAsMCArMSw3NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtMy1pbml0LXByb3ZpZGVyPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLXNlcnZsZXQtMy1pbml0LXByb3ZpZGVyPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPlNlcnZsZXQgaW50ZWdyYXRpb24gdGVzdCAtIHNlcnZsZXQtMy1pbml0LXByb3ZpZGVyIC0gU2VydmxldENvbnRhaW5lclByb3ZpZGVyRmFjdG9yeSwgU2VydmxldENvbnRhaW5lclByb3ZpZGVyPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1zZXJ2bGV0LXBvcnRhYmlsaXR5PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtzZXJ2bGV0My52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci9BYnN0cmFjdEhlbGxvV29ybGRSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci9BYnN0cmFjdEhlbGxvV29ybGRSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4OWE1MGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0X3Byb3ZpZGVyL0Fic3RyYWN0SGVsbG9Xb3JsZFJlc291cmNlLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF9wcm92aWRlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKKworLyoqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RIZWxsb1dvcmxkUmVzb3VyY2UgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTlVNQkVSX09GX0FQUExJQ0FUSU9OUyA9IDU7CisKKyAgICBAR0VUCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgSGVsbG8gZ2V0KCkgeworICAgICAgICByZXR1cm4gbmV3IEhlbGxvKGNyZWF0ZU5hbWUoKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBjcmVhdGVOYW1lKCk7CisKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgSGVsbG8geworICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOworCisgICAgICAgIHB1YmxpYyBIZWxsbyhTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBuYW1lOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci9BcHBsaWNhdGlvbjEuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LXByb3ZpZGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfcHJvdmlkZXIvQXBwbGljYXRpb24xLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMxNmI0MAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LXByb3ZpZGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfcHJvdmlkZXIvQXBwbGljYXRpb24xLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF9wcm92aWRlcjsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKKy8qKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEFwcGxpY2F0aW9uMSBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgIGZpbmFsIFNldDxDbGFzczw/Pj4gaGFzaFNldCA9IG5ldyBIYXNoU2V0PENsYXNzPD8+PigpOworICAgICAgICBoYXNoU2V0LmFkZChIZWxsb1dvcmxkMVJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgaGFzaFNldC5hZGQoSGVsbG9Xcml0ZXIuY2xhc3MpOworICAgICAgICByZXR1cm4gaGFzaFNldDsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LXByb3ZpZGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfcHJvdmlkZXIvQXBwbGljYXRpb24yLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0X3Byb3ZpZGVyL0FwcGxpY2F0aW9uMi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5ZjE2ODMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0X3Byb3ZpZGVyL0FwcGxpY2F0aW9uMi5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfcHJvdmlkZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCisvKioKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbjIgZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IGhhc2hTZXQgPSBuZXcgSGFzaFNldDxDbGFzczw/Pj4oKTsKKyAgICAgICAgaGFzaFNldC5hZGQoSGVsbG9Xb3JsZDJSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIGhhc2hTZXQuYWRkKEhlbGxvV3JpdGVyLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIGhhc2hTZXQ7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0X3Byb3ZpZGVyL0FwcGxpY2F0aW9uMy5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci9BcHBsaWNhdGlvbjMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDkzMmM1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci9BcHBsaWNhdGlvbjMuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0X3Byb3ZpZGVyOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworLyoqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQXBwbGljYXRpb24zIGV4dGVuZHMgQXBwbGljYXRpb24geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgZmluYWwgU2V0PENsYXNzPD8+PiBoYXNoU2V0ID0gbmV3IEhhc2hTZXQ8Q2xhc3M8Pz4+KCk7CisgICAgICAgIGhhc2hTZXQuYWRkKEhlbGxvV29ybGQzUmVzb3VyY2UuY2xhc3MpOworICAgICAgICBoYXNoU2V0LmFkZChIZWxsb1dyaXRlci5jbGFzcyk7CisgICAgICAgIHJldHVybiBoYXNoU2V0OworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci9BcHBsaWNhdGlvbjQuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LXByb3ZpZGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfcHJvdmlkZXIvQXBwbGljYXRpb240LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg5NzY3ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LXByb3ZpZGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfcHJvdmlkZXIvQXBwbGljYXRpb240LmphdmEKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF9wcm92aWRlcjsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKKy8qKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uUGF0aCgiL2FwcGxpY2F0aW9uNC8qIikKK3B1YmxpYyBjbGFzcyBBcHBsaWNhdGlvbjQgZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IGhhc2hTZXQgPSBuZXcgSGFzaFNldDxDbGFzczw/Pj4oKTsKKyAgICAgICAgaGFzaFNldC5hZGQoSGVsbG9Xb3JsZDRSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIGhhc2hTZXQuYWRkKEhlbGxvV3JpdGVyLmNsYXNzKTsKKyAgICAgICAgcmV0dXJuIGhhc2hTZXQ7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0X3Byb3ZpZGVyL0hlbGxvV29ybGQxUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LXByb3ZpZGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfcHJvdmlkZXIvSGVsbG9Xb3JsZDFSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZmQzMTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0X3Byb3ZpZGVyL0hlbGxvV29ybGQxUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0X3Byb3ZpZGVyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworCisvKioKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJoZWxsb3dvcmxkMSIpCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZDFSZXNvdXJjZSBleHRlbmRzIEFic3RyYWN0SGVsbG9Xb3JsZFJlc291cmNlIHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgY3JlYXRlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICJXb3JsZCAjMSI7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJzZXJ2bGV0cyIpCisgICAgcHVibGljIGludCBnZXRTZXJ2bGV0c0NvdW50KCkgeworICAgICAgICByZXR1cm4gVGVzdFNlcnZsZXRDb250YWluZXJQcm92aWRlci5nZXRTZXJ2bGV0TmFtZXMoKS5zaXplKCk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJzZXJ2bGV0cy97bmFtZX0iKQorICAgIHB1YmxpYyBib29sZWFuIGhhc1NlcnZsZXROYW1lKEBQYXRoUGFyYW0oIm5hbWUiKSBTdHJpbmcgc2VydmxldE5hbWUpIHsKKyAgICAgICAgcmV0dXJuIFRlc3RTZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXIuZ2V0U2VydmxldE5hbWVzKCkuY29udGFpbnMoc2VydmxldE5hbWUpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiaW1tdXRhYmxlU2VydmxldE5hbWVzIikKKyAgICBwdWJsaWMgYm9vbGVhbiBpc0ltbXV0YWJsZVNlcnZsZXROYW1lcygpIHsKKyAgICAgICAgcmV0dXJuIFRlc3RTZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXIuaXNJbW11dGFibGVTZXJ2bGV0TmFtZXMoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LXByb3ZpZGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfcHJvdmlkZXIvSGVsbG9Xb3JsZDJSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci9IZWxsb1dvcmxkMlJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTljYzU3MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LXByb3ZpZGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfcHJvdmlkZXIvSGVsbG9Xb3JsZDJSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfcHJvdmlkZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworCisvKioKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJoZWxsb3dvcmxkMiIpCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZDJSZXNvdXJjZSBleHRlbmRzIEFic3RyYWN0SGVsbG9Xb3JsZFJlc291cmNlIHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgY3JlYXRlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICJXb3JsZCAjMiI7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0X3Byb3ZpZGVyL0hlbGxvV29ybGQzUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LXByb3ZpZGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfcHJvdmlkZXIvSGVsbG9Xb3JsZDNSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmNTEwZTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0X3Byb3ZpZGVyL0hlbGxvV29ybGQzUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0X3Byb3ZpZGVyOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CisKKy8qKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoImhlbGxvd29ybGQzIikKK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkM1Jlc291cmNlIGV4dGVuZHMgQWJzdHJhY3RIZWxsb1dvcmxkUmVzb3VyY2UgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmluZyBjcmVhdGVOYW1lKCkgeworICAgICAgICByZXR1cm4gIldvcmxkICMzIjsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoImNvbnRhaW5lcnMiKQorICAgIHB1YmxpYyBpbnQgZ2V0Q29udGFpbmVyc0NvdW50KCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIFRlc3RDb250YWluZXJMaWZlY3ljbGVMaXN0ZW5lci5nZXRTdGFydHVwQ291bnQoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LXByb3ZpZGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfcHJvdmlkZXIvSGVsbG9Xb3JsZDRSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci9IZWxsb1dvcmxkNFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjhkYjJlMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LXByb3ZpZGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfcHJvdmlkZXIvSGVsbG9Xb3JsZDRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfcHJvdmlkZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworCisvKioKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJoZWxsb3dvcmxkNCIpCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZDRSZXNvdXJjZSBleHRlbmRzIEFic3RyYWN0SGVsbG9Xb3JsZFJlc291cmNlIHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgY3JlYXRlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICJXb3JsZCAjNCI7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0X3Byb3ZpZGVyL0hlbGxvV29ybGQ1UmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LXByb3ZpZGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfcHJvdmlkZXIvSGVsbG9Xb3JsZDVSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhODM1MGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0X3Byb3ZpZGVyL0hlbGxvV29ybGQ1UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0X3Byb3ZpZGVyOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworCisvKioKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCJoZWxsb3dvcmxkNSIpCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZDVSZXNvdXJjZSBleHRlbmRzIEFic3RyYWN0SGVsbG9Xb3JsZFJlc291cmNlIHsKKworICAgIEBDb250ZXh0CisgICAgcHJpdmF0ZSBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdDsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgY3JlYXRlTmFtZSgpIHsKKyAgICAgICAgcmV0dXJuICJXb3JsZCAjNSI7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJmaWx0ZXIiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0RmlsdGVyKCkgeworICAgICAgICByZXR1cm4gKFN0cmluZykgcmVxdWVzdC5nZXRBdHRyaWJ1dGUoIkZJTFRFUiIpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci9IZWxsb1dyaXRlci5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci9IZWxsb1dyaXRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMDYxY2QKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0X3Byb3ZpZGVyL0hlbGxvV3JpdGVyLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF9wcm92aWRlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworCitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5NZXNzYWdlVXRpbHM7CisKKworLyoqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworQFByb3ZpZGVyCitwdWJsaWMgY2xhc3MgSGVsbG9Xcml0ZXIgaW1wbGVtZW50cyBNZXNzYWdlQm9keVdyaXRlcjxBYnN0cmFjdEhlbGxvV29ybGRSZXNvdXJjZS5IZWxsbz4geworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiB0eXBlLmVxdWFscyhBYnN0cmFjdEhlbGxvV29ybGRSZXNvdXJjZS5IZWxsby5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShmaW5hbCBBYnN0cmFjdEhlbGxvV29ybGRSZXNvdXJjZS5IZWxsbyBoZWxsbywgZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGVUbyhmaW5hbCBBYnN0cmFjdEhlbGxvV29ybGRSZXNvdXJjZS5IZWxsbyBoZWxsbywgZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgdmFsdWUgPSBTdHJpbmcuZm9ybWF0KCJIZWxsbyAlcyEiLCBoZWxsby5nZXROYW1lKCkpOworICAgICAgICBlbnRpdHlTdHJlYW0ud3JpdGUodmFsdWUuZ2V0Qnl0ZXMoTWVzc2FnZVV0aWxzLmdldENoYXJzZXQobWVkaWFUeXBlKSkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LXByb3ZpZGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfcHJvdmlkZXIvVGVzdENvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0X3Byb3ZpZGVyL1Rlc3RDb250YWluZXJMaWZlY3ljbGVMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4YTFiMGUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0X3Byb3ZpZGVyL1Rlc3RDb250YWluZXJMaWZlY3ljbGVMaXN0ZW5lci5qYXZhCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfcHJvdmlkZXI7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbnRhaW5lcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyOworCisvKioKKyAqIFRoaXMgaXMganVzdCB0ZXN0IHB1cnBvc2UgaW1wbGVtZW50YXRpb24gb2YgSmVyc2V5IFNQSSB7QGxpbmsgQ29udGFpbmVyTGlmZWN5Y2xlTGlzdGVuZXJ9LgorICogVGhlIGxpc3RlbmVyIGNsYXNzIGlzIHJlZ2lzdGVyZWQgaW4ge0BsaW5rIFRlc3RTZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXJ9IHRvIHtAbGluayBSZXNvdXJjZUNvbmZpZ30uCisgKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFRlc3RDb250YWluZXJMaWZlY3ljbGVMaXN0ZW5lciBpbXBsZW1lbnRzIENvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyIHsKKworICAgIHByaXZhdGUgc3RhdGljIGludCBzdGFydHVwQ291bnQgPSAwOworCisgICAgcHJpdmF0ZSBzdGF0aWMgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goQWJzdHJhY3RIZWxsb1dvcmxkUmVzb3VyY2UuTlVNQkVSX09GX0FQUExJQ0FUSU9OUyk7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBvblN0YXJ0dXAoQ29udGFpbmVyIGNvbnRhaW5lcikgeworICAgICAgICBsYXRjaC5jb3VudERvd24oKTsKKyAgICAgICAgc3RhcnR1cENvdW50Kys7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25SZWxvYWQoQ29udGFpbmVyIGNvbnRhaW5lcikgeworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIG9uU2h1dGRvd24oQ29udGFpbmVyIGNvbnRhaW5lcikgeworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFN0YXJ0dXBDb3VudCgpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiB7CisgICAgICAgIGxhdGNoLmF3YWl0KDUsIFRpbWVVbml0LlNFQ09ORFMpOworICAgICAgICByZXR1cm4gc3RhcnR1cENvdW50OworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci9UZXN0RmlsdGVyLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0X3Byb3ZpZGVyL1Rlc3RGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzA5M2MzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci9UZXN0RmlsdGVyLmphdmEKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF9wcm92aWRlcjsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlckNoYWluOworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ29uZmlnOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXF1ZXN0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlc3BvbnNlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CisKKy8qKgorICogVGhpcyBpcyBqdXN0IHRlc3QgcHVycG9zZSB7QGxpbmsgRmlsdGVyIHNlcnZsZXQgZmlsdGVyfSBpbXBsZW1lbnRhdGlvbiB0byBkZW1vbnN0cmF0ZSBob3cgdG8gcmVnaXN0ZXIgZmlsdGVyIGZvciBhbnkgSmVyc2V5CisgKiBTZXJ2bGV0LgorICogVGhlIGZpbHRlciBjbGFzcyBpcyBhZGRlZCBpbiB7QGxpbmsgVGVzdFNlcnZsZXRDb250YWluZXJQcm92aWRlcn0uCisgKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFRlc3RGaWx0ZXIgaW1wbGVtZW50cyBGaWx0ZXIgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaW5pdChGaWx0ZXJDb25maWcgZmlsdGVyQ29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZG9GaWx0ZXIoU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBGaWx0ZXJDaGFpbiBjaGFpbikKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIGlmICgoKEh0dHBTZXJ2bGV0UmVxdWVzdCkgcmVxdWVzdCkuZ2V0UmVxdWVzdFVSSSgpLnN0YXJ0c1dpdGgoIi9hcHBsaWNhdGlvbjUiKSkgeworICAgICAgICAgICAgcmVxdWVzdC5zZXRBdHRyaWJ1dGUoIkZJTFRFUiIsIFRlc3RTZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXIuVEVTVF9GSUxURVIpOworICAgICAgICB9CisKKyAgICAgICAgY2hhaW4uZG9GaWx0ZXIocmVxdWVzdCwgcmVzcG9uc2UpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci9UZXN0U2VydmxldENvbnRhaW5lclByb3ZpZGVyLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0X3Byb3ZpZGVyL1Rlc3RTZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmUxYTUwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci9UZXN0U2VydmxldENvbnRhaW5lclByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF9wcm92aWRlcjsKKworaW1wb3J0IGphdmEudXRpbC5FbnVtU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkRpc3BhdGNoZXJUeXBlOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldENvbnRleHQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuaW50ZXJuYWwuc3BpLlJlcXVlc3RTY29wZWRJbml0aWFsaXplclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuaW50ZXJuYWwuc3BpLlNlcnZsZXRDb250YWluZXJQcm92aWRlcjsKKworLyoqCisgKiBUaGlzIGlzIGp1c3QgdGVzdCBwdXJwb3NlIGltcGxlbWVudGF0aW9uIG9mIEplcnNleSBpbnRlcm5hbCBTUEkge0BsaW5rIFNlcnZsZXRDb250YWluZXJQcm92aWRlcn0uCisgKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFRlc3RTZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXIgaW1wbGVtZW50cyBTZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXIgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9GSUxURVIgPSAiVGVzdEZpbHRlciI7CisKKyAgICBwcml2YXRlIHN0YXRpYyBTZXQ8U3RyaW5nPiBTRVJWTEVUX05BTUVTOworICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaW1tdXRhYmxlU2VydmxldE5hbWVzID0gZmFsc2U7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBwcmVJbml0KGZpbmFsIFNlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0LCBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IGNsYXNzZXMpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgY2xhc3Nlcy5hZGQoQWJzdHJhY3RIZWxsb1dvcmxkUmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHBvc3RJbml0KGZpbmFsIFNlcnZsZXRDb250ZXh0IHNlcnZsZXRDb250ZXh0LCBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IGNsYXNzZXMsIGZpbmFsIFNldDxTdHJpbmc+IHNlcnZsZXROYW1lcykKKyAgICAgICAgICAgIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNlcnZsZXROYW1lcy5hZGQoIlRFU1QiKTsKKyAgICAgICAgfSBjYXRjaCAoZmluYWwgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIFRlc3RTZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXIuc2V0SW1tdXRhYmxlU2VydmxldE5hbWVzKHRydWUpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgb25SZWdpc3RlcihmaW5hbCBTZXJ2bGV0Q29udGV4dCBzZXJ2bGV0Q29udGV4dCwgZmluYWwgU2V0PFN0cmluZz4gc2VydmxldE5hbWVzKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIFRlc3RTZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXIuc2V0U2VydmxldE5hbWVzKHNlcnZsZXROYW1lcyk7CisKKyAgICAgICAgc2VydmxldENvbnRleHQuYWRkRmlsdGVyKFRFU1RfRklMVEVSLCBUZXN0RmlsdGVyLmNsYXNzKQorICAgICAgICAgICAgICAgIC5hZGRNYXBwaW5nRm9yU2VydmxldE5hbWVzKEVudW1TZXQuYWxsT2YoRGlzcGF0Y2hlclR5cGUuY2xhc3MpLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZsZXROYW1lcy50b0FycmF5KG5ldyBTdHJpbmdbc2VydmxldE5hbWVzLnNpemUoKV0pKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKCFyZXNvdXJjZUNvbmZpZy5pc1JlZ2lzdGVyZWQoVGVzdENvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyLmNsYXNzKSkgeworICAgICAgICAgICAgcmVzb3VyY2VDb25maWcucmVnaXN0ZXIoVGVzdENvbnRhaW5lckxpZmVjeWNsZUxpc3RlbmVyLmNsYXNzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgU2V0PFN0cmluZz4gZ2V0U2VydmxldE5hbWVzKCkgeworICAgICAgICByZXR1cm4gU0VSVkxFVF9OQU1FUzsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNJbW11dGFibGVTZXJ2bGV0TmFtZXMoKSB7CisgICAgICAgIHJldHVybiBpbW11dGFibGVTZXJ2bGV0TmFtZXM7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRTZXJ2bGV0TmFtZXMoZmluYWwgU2V0PFN0cmluZz4gc2VydmxldE5hbWVzKSB7CisgICAgICAgIFRlc3RTZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXIuU0VSVkxFVF9OQU1FUyA9IHNlcnZsZXROYW1lczsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0SW1tdXRhYmxlU2VydmxldE5hbWVzKGZpbmFsIGJvb2xlYW4gaW1tdXRhYmxlU2VydmxldE5hbWVzKSB7CisgICAgICAgIFRlc3RTZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXIuaW1tdXRhYmxlU2VydmxldE5hbWVzID0gaW1tdXRhYmxlU2VydmxldE5hbWVzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LXByb3ZpZGVyL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LmludGVybmFsLnNwaS5TZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXIgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5pbnRlcm5hbC5zcGkuU2VydmxldENvbnRhaW5lclByb3ZpZGVyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZmVkY2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5pbnRlcm5hbC5zcGkuU2VydmxldENvbnRhaW5lclByb3ZpZGVyCkBAIC0wLDAgKzEgQEAKK29yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0X3Byb3ZpZGVyLlRlc3RTZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTFmOWVhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDcxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8zXzAueHNkIgorICAgICAgICAgdmVyc2lvbj0iMy4wIj4KKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci5BcHBsaWNhdGlvbjE8L3NlcnZsZXQtbmFtZT4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+YXBwbGljYXRpb24yPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC53cy5ycy5BcHBsaWNhdGlvbjwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci5BcHBsaWNhdGlvbjI8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5hcHBsaWNhdGlvbjM8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5wb3J0YWJpbGl0eS5Qb3J0YWJsZVNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amVyc2V5MiNqYXZheC53cy5ycy5BcHBsaWNhdGlvbjwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci5BcHBsaWNhdGlvbjM8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5qYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amVyc2V5LmNvbmZpZy5zZXJ2ZXIucHJvdmlkZXIuY2xhc3NuYW1lczwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci5IZWxsb1dvcmxkNVJlc291cmNlLAorICAgICAgICAgICAgICAgIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0X3Byb3ZpZGVyLkhlbGxvV3JpdGVyCisgICAgICAgICAgICA8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfcHJvdmlkZXIuQXBwbGljYXRpb24xPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vYXBwbGljYXRpb24xLyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+YXBwbGljYXRpb24yPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vYXBwbGljYXRpb24yLyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+YXBwbGljYXRpb24zPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vYXBwbGljYXRpb24zLyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+amF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L2FwcGxpY2F0aW9uNS8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LXByb3ZpZGVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfcHJvdmlkZXIvQWJzdHJhY3RIZWxsb1dvcmxkUmVzb3VyY2VUZXN0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0X3Byb3ZpZGVyL0Fic3RyYWN0SGVsbG9Xb3JsZFJlc291cmNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlYzE4MzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0X3Byb3ZpZGVyL0Fic3RyYWN0SGVsbG9Xb3JsZFJlc291cmNlVGVzdC5qYXZhCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX2luaXRfcHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworCitpbXBvcnQgamF2YXgud3MucnMuTm90Rm91bmRFeGNlcHRpb247CisKKy8qKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SGVsbG9Xb3JsZFJlc291cmNlVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKGdldFJlc291cmNlQ2xhc3MoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RIZWxsb1dvcmxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IEFic3RyYWN0SGVsbG9Xb3JsZFJlc291cmNlLk5VTUJFUl9PRl9BUFBMSUNBVElPTlM7IGkrKykgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICBTdHJpbmcgYWN0dWFsID0gdGFyZ2V0KCJhcHBsaWNhdGlvbiIgKyBnZXRJbmRleCgpKS5wYXRoKCJoZWxsb3dvcmxkIiArIGkpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSBnZXRJbmRleCgpKSB7CisgICAgICAgICAgICAgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIkhlbGxvIFdvcmxkICMiICsgZ2V0SW5kZXgoKSArICIhIiwgYWN0dWFsKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuZmFpbCgiaTogIiArIGkgKyAiIHwgWyIgKyBhY3R1YWwgKyAiXSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKE5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICAgICAgaWYgKGkgIT0gZ2V0SW5kZXgoKSkgeworICAgICAgICAgICAgICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQwNCwgZXguZ2V0UmVzcG9uc2UoKS5nZXRTdGF0dXMoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LmZhaWwoIiEhISBpOiAiICsgaSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IENsYXNzPD8+IGdldFJlc291cmNlQ2xhc3MoKTsKKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBpbnQgZ2V0SW5kZXgoKTsKKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci9IZWxsb1dvcmxkMVJlc291cmNlSVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0X3Byb3ZpZGVyL0hlbGxvV29ybGQxUmVzb3VyY2VJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjk5MzkwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci9IZWxsb1dvcmxkMVJlc291cmNlSVRDYXNlLmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF9wcm92aWRlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkMVJlc291cmNlSVRDYXNlIGV4dGVuZHMgQWJzdHJhY3RIZWxsb1dvcmxkUmVzb3VyY2VUZXN0IHsKKworICAgIHByb3RlY3RlZCBDbGFzczw/PiBnZXRSZXNvdXJjZUNsYXNzKCkgeworICAgICAgICByZXR1cm4gSGVsbG9Xb3JsZDFSZXNvdXJjZS5jbGFzczsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgaW50IGdldEluZGV4KCkgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWdpc3RlcmVkU2VydmxldE5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoImFwcGxpY2F0aW9uIiArIGdldEluZGV4KCkpLnBhdGgoImhlbGxvd29ybGQiICsgZ2V0SW5kZXgoKSkucGF0aCgic2VydmxldHMiKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhBYnN0cmFjdEhlbGxvV29ybGRSZXNvdXJjZS5OVU1CRVJfT0ZfQVBQTElDQVRJT05TLCAoaW50KSB0YXJnZXQucmVxdWVzdCgpLmdldChJbnRlZ2VyLlRZUEUpKTsKKworICAgICAgICB0YXJnZXQgPSB0YXJnZXQucGF0aCgie25hbWV9Iik7CisgICAgICAgIHRlc3RSZWdpc3RlcmVkU2VydmxldE5hbWVzKHRhcmdldCwgIm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0X3Byb3ZpZGVyLkFwcGxpY2F0aW9uMSIpOworICAgICAgICB0ZXN0UmVnaXN0ZXJlZFNlcnZsZXROYW1lcyh0YXJnZXQsICJhcHBsaWNhdGlvbjIiKTsKKyAgICAgICAgdGVzdFJlZ2lzdGVyZWRTZXJ2bGV0TmFtZXModGFyZ2V0LCAiYXBwbGljYXRpb24zIik7CisgICAgICAgIHRlc3RSZWdpc3RlcmVkU2VydmxldE5hbWVzKHRhcmdldCwgIm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0X3Byb3ZpZGVyLkFwcGxpY2F0aW9uNCIpOworICAgICAgICB0ZXN0UmVnaXN0ZXJlZFNlcnZsZXROYW1lcyh0YXJnZXQsICJqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uIik7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3RSZWdpc3RlcmVkU2VydmxldE5hbWVzKFdlYlRhcmdldCB0YXJnZXQsIFN0cmluZyBzZXJ2bGV0TmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHRhcmdldC5yZXNvbHZlVGVtcGxhdGUoIm5hbWUiLCBzZXJ2bGV0TmFtZSkucmVxdWVzdCgpLmdldChCb29sZWFuLlRZUEUpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbW11dGFibGVTZXJ2bGV0TmFtZXMoKSB7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoImFwcGxpY2F0aW9uIiArIGdldEluZGV4KCkpLnBhdGgoImhlbGxvd29ybGQiICsgZ2V0SW5kZXgoKSkucGF0aCgiaW1tdXRhYmxlU2VydmxldE5hbWVzIik7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKHRhcmdldC5yZXF1ZXN0KCkuZ2V0KEJvb2xlYW4uVFlQRSkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci9IZWxsb1dvcmxkMlJlc291cmNlSVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0X3Byb3ZpZGVyL0hlbGxvV29ybGQyUmVzb3VyY2VJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzhhYzU5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci9IZWxsb1dvcmxkMlJlc291cmNlSVRDYXNlLmphdmEKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF9wcm92aWRlcjsKKworLyoqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZDJSZXNvdXJjZUlUQ2FzZSBleHRlbmRzIEFic3RyYWN0SGVsbG9Xb3JsZFJlc291cmNlVGVzdCB7CisKKyAgICBwcm90ZWN0ZWQgQ2xhc3M8Pz4gZ2V0UmVzb3VyY2VDbGFzcygpIHsKKyAgICAgICAgcmV0dXJuIEhlbGxvV29ybGQyUmVzb3VyY2UuY2xhc3M7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGludCBnZXRJbmRleCgpIHsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0X3Byb3ZpZGVyL0hlbGxvV29ybGQzUmVzb3VyY2VJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LXByb3ZpZGVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfcHJvdmlkZXIvSGVsbG9Xb3JsZDNSZXNvdXJjZUlUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhMTZlNDYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0X3Byb3ZpZGVyL0hlbGxvV29ybGQzUmVzb3VyY2VJVENhc2UuamF2YQpAQCAtMCwwICsxLDQzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0X3Byb3ZpZGVyOworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CisKKy8qKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEhlbGxvV29ybGQzUmVzb3VyY2VJVENhc2UgZXh0ZW5kcyBBYnN0cmFjdEhlbGxvV29ybGRSZXNvdXJjZVRlc3QgeworCisgICAgcHJvdGVjdGVkIENsYXNzPD8+IGdldFJlc291cmNlQ2xhc3MoKSB7CisgICAgICAgIHJldHVybiBIZWxsb1dvcmxkM1Jlc291cmNlLmNsYXNzOworICAgIH0KKworICAgIHByb3RlY3RlZCBpbnQgZ2V0SW5kZXgoKSB7CisgICAgICAgIHJldHVybiAzOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFN0YXJ0dXBDb250YWluZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQgPSB0YXJnZXQoImFwcGxpY2F0aW9uIiArIGdldEluZGV4KCkpLnBhdGgoImhlbGxvd29ybGQiICsgZ2V0SW5kZXgoKSkucGF0aCgiY29udGFpbmVycyIpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEFic3RyYWN0SGVsbG9Xb3JsZFJlc291cmNlLk5VTUJFUl9PRl9BUFBMSUNBVElPTlMsIChpbnQpIHRhcmdldC5yZXF1ZXN0KCkuZ2V0KEludGVnZXIuVFlQRSkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci9IZWxsb1dvcmxkNFJlc291cmNlSVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0X3Byb3ZpZGVyL0hlbGxvV29ybGQ0UmVzb3VyY2VJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDM5ZTI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLWluaXQtcHJvdmlkZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfaW5pdF9wcm92aWRlci9IZWxsb1dvcmxkNFJlc291cmNlSVRDYXNlLmphdmEKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfaW5pdF9wcm92aWRlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCisvKioKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBIZWxsb1dvcmxkNFJlc291cmNlSVRDYXNlIGV4dGVuZHMgQWJzdHJhY3RIZWxsb1dvcmxkUmVzb3VyY2VUZXN0IHsKKworICAgIHByb3RlY3RlZCBDbGFzczw/PiBnZXRSZXNvdXJjZUNsYXNzKCkgeworICAgICAgICByZXR1cm4gSGVsbG9Xb3JsZDRSZXNvdXJjZS5jbGFzczsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgaW50IGdldEluZGV4KCkgeworICAgICAgICByZXR1cm4gNDsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZWdpc3RlckZpbHRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiYXBwbGljYXRpb24iICsgZ2V0SW5kZXgoKSkucGF0aCgiaGVsbG93b3JsZCIgKyBnZXRJbmRleCgpKS5wYXRoKCJmaWx0ZXIiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDA0LCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0X3Byb3ZpZGVyL0hlbGxvV29ybGQ1UmVzb3VyY2VJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1pbml0LXByb3ZpZGVyL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX2luaXRfcHJvdmlkZXIvSGVsbG9Xb3JsZDVSZXNvdXJjZUlUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZGFlN2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtaW5pdC1wcm92aWRlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19pbml0X3Byb3ZpZGVyL0hlbGxvV29ybGQ1UmVzb3VyY2VJVENhc2UuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19pbml0X3Byb3ZpZGVyOworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZDVSZXNvdXJjZUlUQ2FzZSBleHRlbmRzIEFic3RyYWN0SGVsbG9Xb3JsZFJlc291cmNlVGVzdCB7CisKKyAgICBwcm90ZWN0ZWQgQ2xhc3M8Pz4gZ2V0UmVzb3VyY2VDbGFzcygpIHsKKyAgICAgICAgcmV0dXJuIEhlbGxvV29ybGQ1UmVzb3VyY2UuY2xhc3M7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGludCBnZXRJbmRleCgpIHsKKyAgICAgICAgcmV0dXJuIDU7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVnaXN0ZXJGaWx0ZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIGFjdHVhbCA9IHRhcmdldCgiYXBwbGljYXRpb24iICsgZ2V0SW5kZXgoKSkucGF0aCgiaGVsbG93b3JsZCIgKyBnZXRJbmRleCgpKS5wYXRoKCJmaWx0ZXIiKS5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdFNlcnZsZXRDb250YWluZXJQcm92aWRlci5URVNUX0ZJTFRFUiwgYWN0dWFsKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1wYXJhbXMvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1wYXJhbXMvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGE1Y2ViCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLXBhcmFtcy9wb20ueG1sCkBAIC0wLDAgKzEsNzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LTMtcGFyYW1zPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLXNlcnZsZXQtMy1wYXJhbXM8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+U2VydmxldCBpbnRlZ3JhdGlvbiB0ZXN0IC0gc2VydmxldC0zLXBhcmFtczwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguc2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3NlcnZsZXQzLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtcGFyYW1zL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX3BhcmFtcy9DdXN0b21Db250ZXh0TGlzdGVuZXIuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1wYXJhbXMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfcGFyYW1zL0N1c3RvbUNvbnRleHRMaXN0ZW5lci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYTU0YzgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtcGFyYW1zL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX3BhcmFtcy9DdXN0b21Db250ZXh0TGlzdGVuZXIuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfM19wYXJhbXM7CisKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0RXZlbnQ7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGV4dExpc3RlbmVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuYW5ub3RhdGlvbi5XZWJMaXN0ZW5lcjsKKworLyoqCisgKiBAYXV0aG9yIFBhdmVsIEJ1Y2VrIChwYXZlbC5idWNlayBhdCBvcmFjbGUuY29tKQorICovCitAV2ViTGlzdGVuZXIKK3B1YmxpYyBjbGFzcyBDdXN0b21Db250ZXh0TGlzdGVuZXIgaW1wbGVtZW50cyBTZXJ2bGV0Q29udGV4dExpc3RlbmVyIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNvbnRleHRJbml0aWFsaXplZChTZXJ2bGV0Q29udGV4dEV2ZW50IHNlcnZsZXRDb250ZXh0RXZlbnQpIHsKKyAgICAgICAgc2VydmxldENvbnRleHRFdmVudC5nZXRTZXJ2bGV0Q29udGV4dCgpLnNldEF0dHJpYnV0ZSgibXlDb250ZXh0UGFyYW0iLCAibXlWYWx1ZSIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNvbnRleHREZXN0cm95ZWQoU2VydmxldENvbnRleHRFdmVudCBzZXJ2bGV0Q29udGV4dEV2ZW50KSB7CisKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1wYXJhbXMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfcGFyYW1zL1BhcmFtUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1wYXJhbXMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfcGFyYW1zL1BhcmFtUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWVmN2E4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLXBhcmFtcy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19wYXJhbXMvUGFyYW1SZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX3BhcmFtczsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CisKKy8qKgorICogQGF1dGhvciBQYXZlbCBCdWNlayAocGF2ZWwuYnVjZWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoInBhcmFtcyIpCitwdWJsaWMgY2xhc3MgUGFyYW1SZXNvdXJjZSB7CisKKyAgICBAQ29udGV4dAorICAgIEFwcGxpY2F0aW9uIGFwcGxpY2F0aW9uOworCisgICAgQEdFVAorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIFN0cmluZyBnZXQoQFF1ZXJ5UGFyYW0oInBhcmFtLW5hbWUiKSBTdHJpbmcgcGFyYW1OYW1lKSB7CisgICAgICAgIHJldHVybiBhcHBsaWNhdGlvbi5nZXRQcm9wZXJ0aWVzKCkuZ2V0KHBhcmFtTmFtZSkudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtcGFyYW1zL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtcGFyYW1zL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYxMThhNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1wYXJhbXMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDQwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8zXzAueHNkIgorICAgICAgICAgdmVyc2lvbj0iMy4wIj4KKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT50ZXN0U2VydmxldDE8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmplcnNleS5jb25maWcuc2VydmVyLnByb3ZpZGVyLmNsYXNzbmFtZXM8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX3BhcmFtcy5QYXJhbVJlc291cmNlPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPm15SW5pdFBhcmFtPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm15VmFsdWU8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPnRlc3RTZXJ2bGV0MTwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLXBhcmFtcy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19wYXJhbXMvUGFyYW1zVGVzdElUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLXBhcmFtcy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19wYXJhbXMvUGFyYW1zVGVzdElUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkYzQxNTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtcGFyYW1zL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX3BhcmFtcy9QYXJhbXNUZXN0SVRDYXNlLmphdmEKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfcGFyYW1zOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEBhdXRob3IgUGF2ZWwgQnVjZWsgKHBhdmVsLmJ1Y2VrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBQYXJhbXNUZXN0SVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBcHBsaWNhdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgLy8gc2VlIHdlYi54bWwKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbml0UGFyYW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUmVzcG9uc2UgciA9IHRhcmdldCgpLnBhdGgoInBhcmFtcyIpLnF1ZXJ5UGFyYW0oInBhcmFtLW5hbWUiLCAibXlJbml0UGFyYW0iKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHIuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIm15VmFsdWUiLCByLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgLy8gc2VlIEN1c3RvbUNvbnRleHRMaXN0ZW5lci5qYXZhCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q29udGV4dFBhcmFtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFJlc3BvbnNlIHIgPSB0YXJnZXQoKS5wYXRoKCJwYXJhbXMiKS5xdWVyeVBhcmFtKCJwYXJhbS1uYW1lIiwgIm15Q29udGV4dFBhcmFtIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJteVZhbHVlIiwgci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1zc2UtMS9wb20ueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLXNzZS0xL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdlYTQwOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1zc2UtMS9wb20ueG1sCkBAIC0wLDAgKzEsMTA5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+c2VydmxldC0zLXNzZS0xPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLXNlcnZsZXQtMy1zc2UtMTwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5TZXJ2bGV0IGludGVncmF0aW9uIHRlc3QgLSBzZXJ2bGV0LTMtc3NlLTE8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1zc2U8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbm5lY3RvcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktZ3JpenpseS1jb25uZWN0b3I8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPCEtLXBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZWNsaXBzZS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxzY2FuSW50ZXJ2YWxTZWNvbmRzPjA8L3NjYW5JbnRlcnZhbFNlY29uZHM+CisgICAgICAgICAgICAgICAgICAgIDxzdG9wUG9ydD45OTk5PC9zdG9wUG9ydD4KKyAgICAgICAgICAgICAgICAgICAgPHN0b3BLZXk+U1RPUDwvc3RvcEtleT4KKyAgICAgICAgICAgICAgICAgICAgPGNvbnRleHRQYXRoPi88L2NvbnRleHRQYXRoPgorICAgICAgICAgICAgICAgICAgICA8d2ViQXBwPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbnRleHRQYXRoPi88L2NvbnRleHRQYXRoPgorICAgICAgICAgICAgICAgICAgICA8L3dlYkFwcD4KKyAgICAgICAgICAgICAgICAgICAgPHdhcj4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8ke3Byb2plY3QuYnVpbGQuZmluYWxOYW1lfS53YXI8L3dhcj4KKyAgICAgICAgICAgICAgICAgICAgPHN5c3RlbVByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+amV0dHkucG9ydDwvbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+JHtqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnR9PC92YWx1ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydGllcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+c3RhcnQtamV0dHk8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnByZS1pbnRlZ3JhdGlvbi10ZXN0PC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5ydW4td2FyPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkYWVtb24+dHJ1ZTwvZGFlbW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5zdG9wLWpldHR5PC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wb3N0LWludGVncmF0aW9uLXRlc3Q8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnN0b3A8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICA8L3BsdWdpbi0tPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1zc2UtMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19zc2VfMS9JdGVtU3RvcmVBcHAuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1zc2UtMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19zc2VfMS9JdGVtU3RvcmVBcHAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTM3MDI1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLXNzZS0xL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX3NzZV8xL0l0ZW1TdG9yZUFwcC5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX3NzZV8xOworCitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLlNzZUZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCisvKioKKyAqIFNTRSBpdGVtIHN0b3JlIEpBWC1SUyBhcHBsaWNhdGlvbiBjbGFzcy4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitAQXBwbGljYXRpb25QYXRoKCJyZXNvdXJjZXMiKQorcHVibGljIGNsYXNzIEl0ZW1TdG9yZUFwcCBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IFNTRSBJdGVtIFN0b3JlIEV4YW1wbGUgSkFYLVJTIGFwcGxpY2F0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBJdGVtU3RvcmVBcHAoKSB7CisgICAgICAgIHN1cGVyKEl0ZW1TdG9yZVJlc291cmNlLmNsYXNzLCBTc2VGZWF0dXJlLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtc3NlLTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfc3NlXzEvSXRlbVN0b3JlUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtMy1zc2UtMS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfM19zc2VfMS9JdGVtU3RvcmVSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiYmIyODUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtc3NlLTEvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfc3NlXzEvSXRlbVN0b3JlUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDIwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0XzNfc3NlXzE7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQubG9ja3MuUmVlbnRyYW50UmVhZFdyaXRlTG9jazsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5CYWRSZXF1ZXN0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLkRlZmF1bHRWYWx1ZTsKK2ltcG9ydCBqYXZheC53cy5ycy5Gb3JtUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLkhlYWRlclBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLkludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLlNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5FdmVudE91dHB1dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5zc2UuT3V0Ym91bmRFdmVudDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5zc2UuU3NlQnJvYWRjYXN0ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLlNzZUZlYXR1cmU7CisKKy8qKgorICogQSByZXNvdXJjZSBmb3Igc3RvcmluZyBuYW1lZCBpdGVtcy4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiaXRlbXMiKQorcHVibGljIGNsYXNzIEl0ZW1TdG9yZVJlc291cmNlIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgTE9HR0VSID0gTG9nZ2VyLmdldExvZ2dlcihJdGVtU3RvcmVSZXNvdXJjZS5jbGFzcy5nZXROYW1lKCkpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVlbnRyYW50UmVhZFdyaXRlTG9jayBzdG9yZUxvY2sgPSBuZXcgUmVlbnRyYW50UmVhZFdyaXRlTG9jaygpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExpbmtlZExpc3Q8U3RyaW5nPiBpdGVtU3RvcmUgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3NlQnJvYWRjYXN0ZXIgYnJvYWRjYXN0ZXIgPSBuZXcgU3NlQnJvYWRjYXN0ZXIoKTsKKworICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIGxvbmcgcmVjb25uZWN0RGVsYXkgPSAwOworCisgICAgLyoqCisgICAgICogTGlzdCBhbGwgc3RvcmVkIGl0ZW1zLgorICAgICAqCisgICAgICogQHJldHVybiBsaXN0IG9mIGFsbCBzdG9yZWQgaXRlbXMuCisgICAgICovCisgICAgQEdFVAorICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICBwdWJsaWMgU3RyaW5nIGxpc3RJdGVtcygpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN0b3JlTG9jay5yZWFkTG9jaygpLmxvY2soKTsKKyAgICAgICAgICAgIHJldHVybiBpdGVtU3RvcmUudG9TdHJpbmcoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHN0b3JlTG9jay5yZWFkTG9jaygpLnVubG9jaygpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVjZWl2ZSAmIHByb2Nlc3MgY29tbWFuZHMgc2VudCBieSB0aGUgdGVzdCBjbGllbnQgdGhhdCBjb250cm9sIHRoZSBpbnRlcm5hbCByZXNvdXJjZSBzdGF0ZS4KKyAgICAgKgorICAgICAqIEZvbGxvd2luZyBpcyB0aGUgbGlzdCBvZiByZWNvZ25pemVkIGNvbW1hbmRzOgorICAgICAqIDx1bD4KKyAgICAgKiA8bGk+PGI+ZGlzY29ubmVjdDwvYj4gLSBkaXNjb25uZWN0IGFsbCByZWdpc3RlcmVkIGV2ZW50IHN0cmVhbXMuPC9saT4KKyAgICAgKiA8bGk+PGI+cmVjb25uZWN0IG5vdzwvYj4gLSBlbmFibGUgY2xpZW50IHJlY29ubmVjdGluZy48L2xpPgorICAgICAqIDxsaT48Yj5yZWNvbm5lY3QgJmx0O3NlY29uZHMmZ3Q7PC9iPiAtIGRpc2FibGUgY2xpZW50IHJlY29ubmVjdGluZy4KKyAgICAgKiBSZWNvbm5lY3RpbmcgY2xpZW50cyB3aWxsIHJlY2VpdmUgYSBIVFRQIDUwMyByZXNwb25zZSB3aXRoCisgICAgICoge0B2YWx1ZSBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzI1JFVFJZX0FGVEVSfSBzZXQgdG8gdGhlIGFtb3VudCBvZgorICAgICAqIG1pbGxpc2Vjb25kcyBzcGVjaWZpZWQuPC9saT4KKyAgICAgKiA8L3VsPgorICAgICAqCisgICAgICogQHBhcmFtIGNvbW1hbmQgY29tbWFuZCB0byBiZSBwcm9jZXNzZWQuCisgICAgICogQHJldHVybiBtZXNzYWdlIGFib3V0IHByb2Nlc3NpbmcgcmVzdWx0LgorICAgICAqIEB0aHJvd3MgQmFkUmVxdWVzdEV4Y2VwdGlvbiBpbiBjYXNlIHRoZSBjb21tYW5kIGlzIG5vdCByZWNvZ25pemVkIG9yIG5vdCBzcGVjaWZpZWQuCisgICAgICovCisgICAgQFBPU1QKKyAgICBAUGF0aCgiY29tbWFuZHMiKQorICAgIHB1YmxpYyBTdHJpbmcgcHJvY2Vzc0NvbW1hbmQoU3RyaW5nIGNvbW1hbmQpIHsKKyAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCB8fCBjb21tYW5kLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oIk5vIGNvbW1hbmQgc3BlY2lmaWVkLiIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCJkaXNjb25uZWN0Ii5lcXVhbHMoY29tbWFuZCkpIHsKKyAgICAgICAgICAgIGJyb2FkY2FzdGVyLmNsb3NlQWxsKCk7CisgICAgICAgICAgICByZXR1cm4gIkRpc2Nvbm5lY3RlZC4iOworICAgICAgICB9IGVsc2UgaWYgKGNvbW1hbmQubGVuZ3RoKCkgPiAicmVjb25uZWN0ICIubGVuZ3RoKCkgJiYgY29tbWFuZC5zdGFydHNXaXRoKCJyZWNvbm5lY3QgIikpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyB3aGVuID0gY29tbWFuZC5zdWJzdHJpbmcoInJlY29ubmVjdCAiLmxlbmd0aCgpKTsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmVjb25uZWN0RGVsYXkgPSAibm93Ii5lcXVhbHMod2hlbikgPyAwIDogTG9uZy5wYXJzZUxvbmcod2hlbik7CisgICAgICAgICAgICAgICAgcmV0dXJuICJSZWNvbm5lY3Qgc3RyYXRlZ3kgdXBkYXRlZDogIiArIHdoZW47CisgICAgICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gaWdub3JlKSB7CisgICAgICAgICAgICAgICAgLy8gaWdub3JlZAorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oIkNvbW1hbmQgbm90IHJlY29nbml6ZWQ6ICciICsgY29tbWFuZCArICInIik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29ubmVjdCBvciByZS1jb25uZWN0IHRvIFNTRSBldmVudCBzdHJlYW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGFzdEV2ZW50SWQgVmFsdWUgb2YgY3VzdG9tIFNTRSBIVFRQIDx0dD57QHZhbHVlIFNzZUZlYXR1cmUjTEFTVF9FVkVOVF9JRF9IRUFERVJ9PC90dD4gaGVhZGVyLgorICAgICAqICAgICAgICAgICAgICAgICAgICBEZWZhdWx0cyB0byB7QGNvZGUgLTF9IGlmIG5vdCBzZXQuCisgICAgICogQHJldHVybiBuZXcgU1NFIGV2ZW50IG91dHB1dCBzdHJlYW0gcmVwcmVzZW50aW5nIHRoZSAocmUtKWVzdGFibGlzaGVkIFNTRSBjbGllbnQgY29ubmVjdGlvbi4KKyAgICAgKiBAdGhyb3dzIEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24gaW4gY2FzZSByZXBsYXlpbmcgbWlzc2VkIGV2ZW50cyB0byB0aGUgcmVjb25uZWN0ZWQgb3V0cHV0IHN0cmVhbSBmYWlscy4KKyAgICAgKiBAdGhyb3dzIFNlcnZpY2VVbmF2YWlsYWJsZUV4Y2VwdGlvbiAgaW4gY2FzZSB0aGUgcmVjb25uZWN0IGRlbGF5IGlzIHNldCB0byBhIHBvc2l0aXZlIHZhbHVlLgorICAgICAqLworICAgIEBHRVQKKyAgICBAUGF0aCgiZXZlbnRzIikKKyAgICBAUHJvZHVjZXMoU3NlRmVhdHVyZS5TRVJWRVJfU0VOVF9FVkVOVFMpCisgICAgcHVibGljIEV2ZW50T3V0cHV0IGl0ZW1FdmVudHMoCisgICAgICAgICAgICBASGVhZGVyUGFyYW0oU3NlRmVhdHVyZS5MQVNUX0VWRU5UX0lEX0hFQURFUikgQERlZmF1bHRWYWx1ZSgiLTEiKSBpbnQgbGFzdEV2ZW50SWQpIHsKKyAgICAgICAgZmluYWwgRXZlbnRPdXRwdXQgZXZlbnRPdXRwdXQgPSBuZXcgRXZlbnRPdXRwdXQoKTsKKworICAgICAgICBpZiAobGFzdEV2ZW50SWQgPj0gMCkgeworICAgICAgICAgICAgTE9HR0VSLmluZm8oIlJlY2VpdmVkIGxhc3QgZXZlbnQgaWQgOiIgKyBsYXN0RXZlbnRJZCk7CisKKyAgICAgICAgICAgIC8vIGRlY2lkZSB0aGUgcmVjb25uZWN0IGhhbmRsaW5nIHN0cmF0ZWd5IGJhc2VkIG9uIGN1cnJlbnQgcmVjb25uZWN0IGRlbGF5IHZhbHVlLgorICAgICAgICAgICAgZmluYWwgbG9uZyBkZWxheSA9IHJlY29ubmVjdERlbGF5OworICAgICAgICAgICAgaWYgKGRlbGF5ID4gMCkgeworICAgICAgICAgICAgICAgIExPR0dFUi5pbmZvKCJOb24temVybyByZWNvbm5lY3QgZGVsYXkgWyIgKyBkZWxheSArICJdIC0gcmVzcG9uZGluZyB3aXRoIEhUVFAgNTAzLiIpOworICAgICAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2aWNlVW5hdmFpbGFibGVFeGNlcHRpb24oZGVsYXkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0dHRVIuaW5mbygiWmVybyByZWNvbm5lY3QgZGVsYXkgLSByZWNvbm5lY3RpbmcuIik7CisgICAgICAgICAgICAgICAgcmVwbGF5TWlzc2VkRXZlbnRzKGxhc3RFdmVudElkLCBldmVudE91dHB1dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWJyb2FkY2FzdGVyLmFkZChldmVudE91dHB1dCkpIHsKKyAgICAgICAgICAgIExPR0dFUi5zZXZlcmUoIiEhISBVbmFibGUgdG8gYWRkIG5ldyBldmVudCBvdXRwdXQgdG8gdGhlIGJyb2FkY2FzdGVyICEhISIpOworICAgICAgICAgICAgLy8gbGV0J3MgdHJ5IHRvIGZvcmNlIGEgNXMgZGVsYXllZCBjbGllbnQgcmVjb25uZWN0IGF0dGVtcHQKKyAgICAgICAgICAgIHRocm93IG5ldyBTZXJ2aWNlVW5hdmFpbGFibGVFeGNlcHRpb24oNUwpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIGV2ZW50T3V0cHV0OworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCByZXBsYXlNaXNzZWRFdmVudHMoZmluYWwgaW50IGxhc3RFdmVudElkLCBmaW5hbCBFdmVudE91dHB1dCBldmVudE91dHB1dCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgc3RvcmVMb2NrLnJlYWRMb2NrKCkubG9jaygpOworICAgICAgICAgICAgZmluYWwgaW50IGZpcnN0VW5yZWNlaXZlZCA9IGxhc3RFdmVudElkICsgMTsKKyAgICAgICAgICAgIGZpbmFsIGludCBtaXNzaW5nQ291bnQgPSBpdGVtU3RvcmUuc2l6ZSgpIC0gZmlyc3RVbnJlY2VpdmVkOworICAgICAgICAgICAgaWYgKG1pc3NpbmdDb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICBMT0dHRVIuaW5mbygiUmVwbGF5aW5nIGV2ZW50cyAtIHN0YXJ0aW5nIHdpdGggaWQgIiArIGZpcnN0VW5yZWNlaXZlZCk7CisgICAgICAgICAgICAgICAgZmluYWwgTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXQgPSBpdGVtU3RvcmUuc3ViTGlzdChmaXJzdFVucmVjZWl2ZWQsIGl0ZW1TdG9yZS5zaXplKCkpLmxpc3RJdGVyYXRvcigpOworICAgICAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgZXZlbnRPdXRwdXQud3JpdGUoY3JlYXRlSXRlbUV2ZW50KGl0Lm5leHRJbmRleCgpICsgZmlyc3RVbnJlY2VpdmVkLCBpdC5uZXh0KCkpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExPR0dFUi5pbmZvKCJObyBldmVudHMgdG8gcmVwbGF5LiIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEludGVybmFsU2VydmVyRXJyb3JFeGNlcHRpb24oIkVycm9yIHJlcGxheWluZyBtaXNzZWQgZXZlbnRzIiwgZXgpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgc3RvcmVMb2NrLnJlYWRMb2NrKCkudW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGQgbmV3IGl0ZW0gdG8gdGhlIGl0ZW0gc3RvcmUuCisgICAgICoKKyAgICAgKiBJbnZva2luZyB0aGlzIG1ldGhvZCB3aWxsIGZpcmUgMiBuZXcgU1NFIGV2ZW50cyAtIDFzdCBhYm91dCBuZXdseSBhZGRlZCBpdGVtIGFuZCAybmQgYWJvdXQgdGhlIG5ldyBpdGVtIHN0b3JlIHNpemUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBpdGVtIG5hbWUuCisgICAgICovCisgICAgQFBPU1QKKyAgICBwdWJsaWMgdm9pZCBhZGRJdGVtKEBGb3JtUGFyYW0oIm5hbWUiKSBTdHJpbmcgbmFtZSkgeworICAgICAgICBmaW5hbCBpbnQgZXZlbnRJZDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHN0b3JlTG9jay53cml0ZUxvY2soKS5sb2NrKCk7CisgICAgICAgICAgICBldmVudElkID0gaXRlbVN0b3JlLnNpemUoKTsKKyAgICAgICAgICAgIGl0ZW1TdG9yZS5hZGQobmFtZSk7CisgICAgICAgICAgICAvLyBCcm9hZGNhc3RpbmcgYW4gdW4tbmFtZWQgZXZlbnQgd2l0aCB0aGUgbmFtZSBvZiB0aGUgbmV3bHkgYWRkZWQgaXRlbSBpbiBkYXRhCisgICAgICAgICAgICBicm9hZGNhc3Rlci5icm9hZGNhc3QoY3JlYXRlSXRlbUV2ZW50KGV2ZW50SWQsIG5hbWUpKTsKKyAgICAgICAgICAgIC8vIEJyb2FkY2FzdGluZyBhIG5hbWVkICJzaXplIiBldmVudCB3aXRoIHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIGl0ZW1zIGNvbGxlY3Rpb24gaW4gZGF0YQorICAgICAgICAgICAgYnJvYWRjYXN0ZXIuYnJvYWRjYXN0KG5ldyBPdXRib3VuZEV2ZW50LkJ1aWxkZXIoKS5uYW1lKCJzaXplIikuZGF0YShJbnRlZ2VyLmNsYXNzLCBldmVudElkICsgMSkuYnVpbGQoKSk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBzdG9yZUxvY2sud3JpdGVMb2NrKCkudW5sb2NrKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIE91dGJvdW5kRXZlbnQgY3JlYXRlSXRlbUV2ZW50KGZpbmFsIGludCBldmVudElkLCBmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICBMb2dnZXIuZ2V0TG9nZ2VyKEl0ZW1TdG9yZVJlc291cmNlLmNsYXNzLmdldE5hbWUoKSkuaW5mbygiQ3JlYXRpbmcgZXZlbnQgaWQgWyIgKyBldmVudElkICsgIl0gbmFtZSBbIiArIG5hbWUgKyAiXSIpOworICAgICAgICByZXR1cm4gbmV3IE91dGJvdW5kRXZlbnQuQnVpbGRlcigpLmlkKCIiICsgZXZlbnRJZCkuZGF0YShTdHJpbmcuY2xhc3MsIG5hbWUpLmJ1aWxkKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLXNzZS0xL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX3NzZV8xL0l0ZW1TdG9yZVJlc291cmNlSVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LTMtc3NlLTEvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0XzNfc3NlXzEvSXRlbVN0b3JlUmVzb3VyY2VJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGJkZDc2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC0zLXNzZS0xL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF8zX3NzZV8xL0l0ZW1TdG9yZVJlc291cmNlSVRDYXNlLmphdmEKQEAgLTAsMCArMSwyOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF8zX3NzZV8xOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlF1ZXVlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRMaW5rZWRRdWV1ZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3VudERvd25MYXRjaDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5hdG9taWMuQXRvbWljSW50ZWdlcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRm9ybTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseS5jb25uZWN0b3IuR3JpenpseUNvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5FdmVudExpc3RlbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5FdmVudFNvdXJjZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5zc2UuSW5ib3VuZEV2ZW50OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5JZ25vcmU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuY29udGFpbnNTdHJpbmc7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZGVzY3JpYmVkQXM7CitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5oYXNJdGVtczsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhhdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCisvKioKKyAqIEl0ZW0gc3RvcmUgdGVzdC4KKyAqCisgKiBAYXV0aG9yIE1hcmVrIFBvdG9jaWFyIChtYXJlay5wb3RvY2lhciBhdCBvcmFjbGUuY29tKQorICovCitASWdub3JlCitwdWJsaWMgY2xhc3MgSXRlbVN0b3JlUmVzb3VyY2VJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEl0ZW1TdG9yZVJlc291cmNlSVRDYXNlLmNsYXNzLmdldE5hbWUoKSk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9MSVNURU5FUlMgPSA1OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfSVRFTVMgPSAxMDsKKworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJdGVtU3RvcmVBcHAoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5wcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLkNPTk5FQ1RfVElNRU9VVCwgMTUwMDApCisgICAgICAgICAgICAgICAgLnByb3BlcnR5KENsaWVudFByb3BlcnRpZXMuUkVBRF9USU1FT1VULCAyMDAwKQorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShDbGllbnRQcm9wZXJ0aWVzLkFTWU5DX1RIUkVBRFBPT0xfU0laRSwgTUFYX0xJU1RFTkVSUyArIDEpCisgICAgICAgICAgICAgICAgLmNvbm5lY3RvclByb3ZpZGVyKG5ldyBHcml6emx5Q29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFVSSSBnZXRCYXNlVXJpKCkgeworICAgICAgICBmaW5hbCBVcmlCdWlsZGVyIGJhc2VVcmlCdWlsZGVyID0gVXJpQnVpbGRlci5mcm9tVXJpKHN1cGVyLmdldEJhc2VVcmkoKSk7CisgICAgICAgIGZpbmFsIGJvb2xlYW4gZXh0ZXJuYWxGYWN0b3J5SW5Vc2UgPSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIGluc3RhbmNlb2YgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKKyAgICAgICAgcmV0dXJuIGV4dGVybmFsRmFjdG9yeUluVXNlID8gYmFzZVVyaUJ1aWxkZXIucGF0aCgicmVzb3VyY2VzIikuYnVpbGQoKSA6IGJhc2VVcmlCdWlsZGVyLmJ1aWxkKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGVzdCB0aGUgaXRlbSBhZGRpdGlvbiwgYWRkaXRpb24gZXZlbnQgYnJvYWRjYXN0aW5nIGFuZCBpdGVtIHJldHJpZXZhbCBmcm9tIHtAbGluayBJdGVtU3RvcmVSZXNvdXJjZX0uCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGVzdCBmYWlsdXJlLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEl0ZW1zU3RvcmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGl0ZW1zID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgICAgICJmb28iLAorICAgICAgICAgICAgICAgICJiYXIiLAorICAgICAgICAgICAgICAgICJiYXoiKSk7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCBpdGVtc1RhcmdldCA9IHRhcmdldCgiaXRlbXMiKTsKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goaXRlbXMuc2l6ZSgpICogTUFYX0xJU1RFTkVSUyAqIDIpOyAvLyBjb3VudGRvd24gb24gYWxsIGV2ZW50cworICAgICAgICBmaW5hbCBMaXN0PFF1ZXVlPEludGVnZXI+PiBpbmRleFF1ZXVlcyA9IG5ldyBBcnJheUxpc3Q8UXVldWU8SW50ZWdlcj4+KE1BWF9MSVNURU5FUlMpOworICAgICAgICBmaW5hbCBFdmVudFNvdXJjZVtdIHNvdXJjZXMgPSBuZXcgRXZlbnRTb3VyY2VbTUFYX0xJU1RFTkVSU107CisgICAgICAgIGZpbmFsIEF0b21pY0ludGVnZXIgc2l6ZUV2ZW50c0NvdW50ID0gbmV3IEF0b21pY0ludGVnZXIoMCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfTElTVEVORVJTOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIGludCBpZCA9IGk7CisgICAgICAgICAgICBmaW5hbCBFdmVudFNvdXJjZSBlcyA9IEV2ZW50U291cmNlLnRhcmdldChpdGVtc1RhcmdldC5wYXRoKCJldmVudHMiKSkKKyAgICAgICAgICAgICAgICAgICAgLm5hbWVkKCJTT1VSQ0UgIiArIGlkKS5idWlsZCgpOworICAgICAgICAgICAgc291cmNlc1tpZF0gPSBlczsKKworICAgICAgICAgICAgZmluYWwgUXVldWU8SW50ZWdlcj4gaW5kZXhlcyA9IG5ldyBDb25jdXJyZW50TGlua2VkUXVldWU8SW50ZWdlcj4oKTsKKyAgICAgICAgICAgIGluZGV4UXVldWVzLmFkZChpbmRleGVzKTsKKworICAgICAgICAgICAgZXMucmVnaXN0ZXIobmV3IEV2ZW50TGlzdGVuZXIoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoIk1hZ2ljTnVtYmVyIikKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkV2ZW50KEluYm91bmRFdmVudCBpbmJvdW5kRXZlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmJvdW5kRXZlbnQuZ2V0TmFtZSgpID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgZGF0YSA9IGluYm91bmRFdmVudC5yZWFkRGF0YSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR0dFUi5pbmZvKCJbLWktXSBTT1VSQ0UgIiArIGlkICsgIjogUmVjZWl2ZWQgZXZlbnQgaWQ9IiArIGluYm91bmRFdmVudC5nZXRJZCgpICsgIiBkYXRhPSIgKyBkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleGVzLmFkZChpdGVtcy5pbmRleE9mKGRhdGEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoInNpemUiLmVxdWFscyhpbmJvdW5kRXZlbnQuZ2V0TmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVFdmVudHNDb3VudC5pbmNyZW1lbnRBbmRHZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUHJvY2Vzc2luZ0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5TRVZFUkUsICJbLXgtXSBTT1VSQ0UgIiArIGlkICsgIjogRXJyb3IgZ2V0dGluZyBldmVudCBkYXRhLiIsIGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ZXMuYWRkKC05OTkpOworICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGF0Y2guY291bnREb3duKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBvcGVuKHNvdXJjZXMpOworCisgICAgICAgICAgICBmb3IgKFN0cmluZyBpdGVtIDogaXRlbXMpIHsKKyAgICAgICAgICAgICAgICBwb3N0SXRlbShpdGVtc1RhcmdldCwgaXRlbSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGFzc2VydFRydWUoIldhaXRpbmcgdG8gcmVjZWl2ZSBhbGwgZXZlbnRzIGhhcyB0aW1lZCBvdXQuIiwKKyAgICAgICAgICAgICAgICAgICAgbGF0Y2guYXdhaXQoKDEwMDAgKyBNQVhfTElTVEVORVJTICogRXZlbnRTb3VyY2UuUkVDT05ORUNUX0RFRkFVTFQpICogZ2V0QXN5bmNUaW1lb3V0TXVsdGlwbGllcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVVbml0Lk1JTExJU0VDT05EUykpOworCisgICAgICAgICAgICAvLyBuZWVkIHRvIGZvcmNlIGRpc2Nvbm5lY3Qgb24gc2VydmVyIGluIG9yZGVyIGZvciBFdmVudFNvdXJjZS5jbG9zZSguLi4pIHRvIHN1Y2NlZWQgd2l0aCBIdHRwVXJsQ29ubmVjdGlvbgorICAgICAgICAgICAgc2VuZENvbW1hbmQoaXRlbXNUYXJnZXQsICJkaXNjb25uZWN0Iik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBjbG9zZShzb3VyY2VzKTsKKyAgICAgICAgfQorCisgICAgICAgIFN0cmluZyBwb3N0ZWRJdGVtcyA9IGl0ZW1zVGFyZ2V0LnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgZm9yIChTdHJpbmcgaXRlbSA6IGl0ZW1zKSB7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJJdGVtICciICsgaXRlbSArICInIG5vdCBzdG9yZWQgb24gc2VydmVyLiIsIHBvc3RlZEl0ZW1zLmNvbnRhaW5zKGl0ZW0pKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBxdWV1ZUlkID0gMDsKKyAgICAgICAgZm9yIChRdWV1ZTxJbnRlZ2VyPiBpbmRleGVzIDogaW5kZXhRdWV1ZXMpIHsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJFdmVudCBmb3IgJyIgKyBpdGVtcy5nZXQoaSkgKyAiJyBub3QgcmVjZWl2ZWQgaW4gcXVldWUgIiArIHF1ZXVlSWQsIGluZGV4ZXMuY29udGFpbnMoaSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJOb3QgcmVjZWl2ZWQgdGhlIGV4cGVjdGVkIG51bWJlciBvZiBldmVudHMgaW4gcXVldWUgIiArIHF1ZXVlSWQsIGl0ZW1zLnNpemUoKSwgaW5kZXhlcy5zaXplKCkpOworICAgICAgICAgICAgcXVldWVJZCsrOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJOdW1iZXIgb2YgcmVjZWl2ZWQgJ3NpemUnIGV2ZW50cyBkb2VzIG5vdCBtYXRjaC4iLCBpdGVtcy5zaXplKCkgKiBNQVhfTElTVEVORVJTLCBzaXplRXZlbnRzQ291bnQuZ2V0KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFRlc3QgdGhlIHtAbGluayBFdmVudFNvdXJjZX0gcmVjb25uZWN0IGZlYXR1cmUuCisgICAgICoKKyAgICAgKiBAdGhyb3dzIEV4Y2VwdGlvbiBpbiBjYXNlIG9mIGEgdGVzdCBmYWlsdXJlLgorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEV2ZW50U291cmNlUmVjb25uZWN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCBpdGVtc1RhcmdldCA9IHRhcmdldCgiaXRlbXMiKTsKKyAgICAgICAgZmluYWwgQ291bnREb3duTGF0Y2ggbGF0Y2ggPSBuZXcgQ291bnREb3duTGF0Y2goTUFYX0lURU1TICogTUFYX0xJU1RFTkVSUyAqIDIpOyAvLyBjb3VudGRvd24gb25seSBvbiBuZXcgaXRlbSBldmVudHMKKyAgICAgICAgZmluYWwgTGlzdDxRdWV1ZTxTdHJpbmc+PiByZWNlaXZlZFF1ZXVlcyA9IG5ldyBBcnJheUxpc3Q8UXVldWU8U3RyaW5nPj4oTUFYX0xJU1RFTkVSUyk7CisgICAgICAgIGZpbmFsIEV2ZW50U291cmNlW10gc291cmNlcyA9IG5ldyBFdmVudFNvdXJjZVtNQVhfTElTVEVORVJTXTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9MSVNURU5FUlM7IGkrKykgeworICAgICAgICAgICAgZmluYWwgaW50IGlkID0gaTsKKyAgICAgICAgICAgIGZpbmFsIEV2ZW50U291cmNlIGVzID0gRXZlbnRTb3VyY2UudGFyZ2V0KGl0ZW1zVGFyZ2V0LnBhdGgoImV2ZW50cyIpKS5uYW1lZCgiU09VUkNFICIgKyBpZCkuYnVpbGQoKTsKKyAgICAgICAgICAgIHNvdXJjZXNbaWRdID0gZXM7CisKKyAgICAgICAgICAgIGZpbmFsIFF1ZXVlPFN0cmluZz4gcmVjZWl2ZWQgPSBuZXcgQ29uY3VycmVudExpbmtlZFF1ZXVlPFN0cmluZz4oKTsKKyAgICAgICAgICAgIHJlY2VpdmVkUXVldWVzLmFkZChyZWNlaXZlZCk7CisKKyAgICAgICAgICAgIGVzLnJlZ2lzdGVyKG5ldyBFdmVudExpc3RlbmVyKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXZlbnQoSW5ib3VuZEV2ZW50IGluYm91bmRFdmVudCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluYm91bmRFdmVudC5nZXROYW1lKCkgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBkYXRhID0gaW5ib3VuZEV2ZW50LnJlYWREYXRhKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmluZm8oIlstaS1dIFNPVVJDRSAiICsgaWQgKyAiOiBSZWNlaXZlZCBldmVudCBpZD0iICsgaW5ib3VuZEV2ZW50LmdldElkKCkgKyAiIGRhdGE9IiArIGRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkLmFkZChkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoUHJvY2Vzc2luZ0V4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HR0VSLmxvZyhMZXZlbC5TRVZFUkUsICJbLXgtXSBTT1VSQ0UgIiArIGlkICsgIjogRXJyb3IgZ2V0dGluZyBldmVudCBkYXRhLiIsIGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY2VpdmVkLmFkZCgiW2RhdGEgcHJvY2Vzc2luZyBlcnJvcl0iKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisKKyAgICAgICAgZmluYWwgU3RyaW5nW10gcG9zdGVkSXRlbXMgPSBuZXcgU3RyaW5nW01BWF9JVEVNUyAqIDJdOworICAgICAgICB0cnkgeworICAgICAgICAgICAgb3Blbihzb3VyY2VzKTsKKworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfSVRFTVM7IGkrKykgeworICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpdGVtID0gU3RyaW5nLmZvcm1hdCgicm91bmQtMS0lMDJkIiwgaSk7CisgICAgICAgICAgICAgICAgcG9zdEl0ZW0oaXRlbXNUYXJnZXQsIGl0ZW0pOworICAgICAgICAgICAgICAgIHBvc3RlZEl0ZW1zW2ldID0gaXRlbTsKKyAgICAgICAgICAgICAgICBzZW5kQ29tbWFuZChpdGVtc1RhcmdldCwgImRpc2Nvbm5lY3QiKTsKKyAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluYWwgaW50IHJlY29ubmVjdERlbGF5ID0gMTsKKyAgICAgICAgICAgIHNlbmRDb21tYW5kKGl0ZW1zVGFyZ2V0LCAicmVjb25uZWN0ICIgKyByZWNvbm5lY3REZWxheSk7CisgICAgICAgICAgICBzZW5kQ29tbWFuZChpdGVtc1RhcmdldCwgImRpc2Nvbm5lY3QiKTsKKworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKHJlY29ubmVjdERlbGF5ICogMTAwMCk7CisKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0lURU1TOyBpKyspIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaXRlbSA9IFN0cmluZy5mb3JtYXQoInJvdW5kLTItJTAyZCIsIGkpOworICAgICAgICAgICAgICAgIHBvc3RlZEl0ZW1zW2kgKyBNQVhfSVRFTVNdID0gaXRlbTsKKyAgICAgICAgICAgICAgICBwb3N0SXRlbShpdGVtc1RhcmdldCwgaXRlbSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNlbmRDb21tYW5kKGl0ZW1zVGFyZ2V0LCAicmVjb25uZWN0IG5vdyIpOworCisgICAgICAgICAgICBhc3NlcnRUcnVlKCJXYWl0aW5nIHRvIHJlY2VpdmUgYWxsIGV2ZW50cyBoYXMgdGltZWQgb3V0LiIsCisgICAgICAgICAgICAgICAgICAgIGxhdGNoLmF3YWl0KCgxICsgTUFYX0xJU1RFTkVSUyAqIChNQVhfSVRFTVMgKyAxKSAqIHJlY29ubmVjdERlbGF5KSAqIGdldEFzeW5jVGltZW91dE11bHRpcGxpZXIoKSwgVGltZVVuaXQuU0VDT05EUykpOworCisgICAgICAgICAgICAvLyBuZWVkIHRvIGZvcmNlIGRpc2Nvbm5lY3Qgb24gc2VydmVyIGluIG9yZGVyIGZvciBFdmVudFNvdXJjZS5jbG9zZSguLi4pIHRvIHN1Y2NlZWQgd2l0aCBIdHRwVXJsQ29ubmVjdGlvbgorICAgICAgICAgICAgc2VuZENvbW1hbmQoaXRlbXNUYXJnZXQsICJkaXNjb25uZWN0Iik7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBjbG9zZShzb3VyY2VzKTsKKyAgICAgICAgfQorCisgICAgICAgIGZpbmFsIFN0cmluZyBzdG9yZWRJdGVtcyA9IGl0ZW1zVGFyZ2V0LnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgZm9yIChTdHJpbmcgaXRlbSA6IHBvc3RlZEl0ZW1zKSB7CisgICAgICAgICAgICBhc3NlcnRUaGF0KCJQb3N0ZWQgaXRlbSAnIiArIGl0ZW0gKyAiJyBzdG9yZWQgb24gc2VydmVyIiwgc3RvcmVkSXRlbXMsIGNvbnRhaW5zU3RyaW5nKGl0ZW0pKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBzb3VyY2VJZCA9IDA7CisgICAgICAgIGZvciAoUXVldWU8U3RyaW5nPiBxdWV1ZSA6IHJlY2VpdmVkUXVldWVzKSB7CisgICAgICAgICAgICBhc3NlcnRUaGF0KCJSZWNlaXZlZCBldmVudHMgaW4gc291cmNlICIgKyBzb3VyY2VJZCwgcXVldWUsCisgICAgICAgICAgICAgICAgICAgIGRlc2NyaWJlZEFzKCJDb2xsZWN0aW9uIGNvbnRhaW5pbmcgJTAiLCBoYXNJdGVtcyhwb3N0ZWRJdGVtcyksIEFycmF5cy5hc0xpc3QocG9zdGVkSXRlbXMpLnRvU3RyaW5nKCkpKTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQoIlNpemUgb2YgcmVjZWl2ZWQgcXVldWUgZm9yIHNvdXJjZSAiICsgc291cmNlSWQsIHF1ZXVlLnNpemUoKSwgZXF1YWxUbyhwb3N0ZWRJdGVtcy5sZW5ndGgpKTsKKyAgICAgICAgICAgIHNvdXJjZUlkKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHBvc3RJdGVtKGZpbmFsIFdlYlRhcmdldCBpdGVtc1RhcmdldCwgZmluYWwgU3RyaW5nIGl0ZW0pIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSBpdGVtc1RhcmdldC5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZm9ybShuZXcgRm9ybSgibmFtZSIsIGl0ZW0pKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiUG9zdGluZyBuZXcgaXRlbSBoYXMgZmFpbGVkLiIsIDIwNCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBMT0dHRVIuaW5mbygiWy1pLV0gUE9TVGVkIGl0ZW06ICciICsgaXRlbSArICInIik7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBvcGVuKGZpbmFsIEV2ZW50U291cmNlW10gc291cmNlcykgeworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIGZvciAoRXZlbnRTb3VyY2Ugc291cmNlIDogc291cmNlcykgeworICAgICAgICAgICAgc291cmNlLm9wZW4oKTsKKyAgICAgICAgICAgIExPR0dFUi5pbmZvKCJbLS0+XSBTT1VSQ0UgIiArIGkrKyArICIgb3BlbmVkLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjbG9zZShmaW5hbCBFdmVudFNvdXJjZVtdIHNvdXJjZXMpIHsKKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBmb3IgKEV2ZW50U291cmNlIHNvdXJjZSA6IHNvdXJjZXMpIHsKKyAgICAgICAgICAgIGlmIChzb3VyY2UuaXNPcGVuKCkpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJXYWl0aW5nIHRvIGNsb3NlIGEgc291cmNlIGhhcyB0aW1lZCBvdXQuIiwgc291cmNlLmNsb3NlKDEsIFRpbWVVbml0LlNFQ09ORFMpKTsKKy8vICAgICAgICAgICAgICAgICAgICBzb3VyY2UuY2xvc2UoMTAwLCBUaW1lVW5pdC5NSUxMSVNFQ09ORFMpOworICAgICAgICAgICAgICAgIExPR0dFUi5pbmZvKCJbPC0tXSBTT1VSQ0UgIiArIGkrKyArICIgY2xvc2VkLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZW5kQ29tbWFuZChmaW5hbCBXZWJUYXJnZXQgaXRlbXNUYXJnZXQsIGZpbmFsIFN0cmluZyBjb21tYW5kKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gaXRlbXNUYXJnZXQucGF0aCgiY29tbWFuZHMiKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkudGV4dChjb21tYW5kKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiJyIgKyBjb21tYW5kICsgIicgY29tbWFuZCBoYXMgZmFpbGVkLiIsIDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBMT0dHRVIuaW5mbygiWy0hLV0gQ09NTUFORCAnIiArIGNvbW1hbmQgKyAiJyBoYXMgYmVlbiBwcm9jZXNzZWQuIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZy0yL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXJlcXVlc3Qtd3JhcHBlci1iaW5kaW5nLTIvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDc1NjFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZy0yL3BvbS54bWwKQEAgLTAsMCArMSw4MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtcmVxdWVzdC13cmFwcHBlci1iaW5kaW5nLTI8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tc2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZy0yPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPlNlcnZsZXQgaW50ZWdyYXRpb24gdGVzdCAtIFJlcXVlc3Qgd3JhcHBlciBiaW5kaW5nIDIgLSBTZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXJGYWN0b3J5LCBTZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXI8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXNlcnZsZXQtcG9ydGFiaWxpdHk8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguc2VydmxldC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3NlcnZsZXQzLnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuaGFtY3Jlc3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5oYW1jcmVzdC1saWJyYXJ5PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXJlcXVlc3Qtd3JhcHBlci1iaW5kaW5nLTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlcl9iaW5kaW5nMi9KYXhSc0FwcGxpY2F0aW9uQXV0b2RldGVjdGVkLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXJlcXVlc3Qtd3JhcHBlci1iaW5kaW5nLTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlcl9iaW5kaW5nMi9KYXhSc0FwcGxpY2F0aW9uQXV0b2RldGVjdGVkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUzZjQ2NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtcmVxdWVzdC13cmFwcGVyLWJpbmRpbmctMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfcmVxdWVzdF93cmFwcGVyX2JpbmRpbmcyL0pheFJzQXBwbGljYXRpb25BdXRvZGV0ZWN0ZWQuamF2YQpAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfcmVxdWVzdF93cmFwcGVyX2JpbmRpbmcyOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCisvKioKKyAqIFRlc3QgYXBwbGljYXRpb24uIFRoaXMgb25lIGdldHMgcmVnaXN0ZXJlZCBhdXRvbWF0aWNhbGx5LgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BBcHBsaWNhdGlvblBhdGgoImF1dG9kZXRlY3RlZCIpCitwdWJsaWMgY2xhc3MgSmF4UnNBcHBsaWNhdGlvbkF1dG9kZXRlY3RlZCBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgIHJldHVybiBuZXcgSGFzaFNldDxDbGFzczw/Pj4oKSB7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWRkKFJlcXVlc3RSZXNwb25zZUluamVjdGVkUmVzb3VyY2UuY2xhc3MpOworICAgICAgICAgICAgICAgIGFkZChSZXF1ZXN0UmVzcG9uc2VJbmplY3RlZFNpbmdsZXRvblJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXJlcXVlc3Qtd3JhcHBlci1iaW5kaW5nLTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlcl9iaW5kaW5nMi9SZXF1ZXN0UmVzcG9uc2VJbmplY3RlZFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXJlcXVlc3Qtd3JhcHBlci1iaW5kaW5nLTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlcl9iaW5kaW5nMi9SZXF1ZXN0UmVzcG9uc2VJbmplY3RlZFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDczNzBiOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtcmVxdWVzdC13cmFwcGVyLWJpbmRpbmctMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfcmVxdWVzdF93cmFwcGVyX2JpbmRpbmcyL1JlcXVlc3RSZXNwb25zZUluamVjdGVkUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfcmVxdWVzdF93cmFwcGVyX2JpbmRpbmcyOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ2FsbGFibGU7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JTZXJ2aWNlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKKworLyoqCisgKiBUZXN0IHJlc291cmNlIHRoYXQgZ2V0cyBpbmplY3RlZCB3aXRoIHRoZSBhY3R1YWwge0BsaW5rIEh0dHBTZXJ2bGV0UmVxdWVzdH0gYW5kCisgKiB7QGxpbmsgSHR0cFNlcnZsZXRSZXNwb25zZX0gaW5zdGFuY2UsIHNvIHRoYXQgd2UgY291bGQgdGVzdGlmeSBjdXN0b20gaW1wbGVtZW50YXRpb25zCisgKiBoYXMgYmVlbiB1c2VkIHRoZXJlLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCIvIikKK3B1YmxpYyBjbGFzcyBSZXF1ZXN0UmVzcG9uc2VJbmplY3RlZFJlc291cmNlIHsKKworICAgIEV4ZWN1dG9yU2VydmljZSBleGVjdXRvciA9IEV4ZWN1dG9ycy5uZXdTaW5nbGVUaHJlYWRFeGVjdXRvcigpOworCisgICAgQENvbnRleHQKKyAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdDsKKworICAgIEBDb250ZXh0CisgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZTsKKworICAgIEBHRVQKKyAgICBAUGF0aCgicmVxdWVzdFR5cGUiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdFR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworICAgICAgICAvLyBtYWtlIHN1cmUgd2UgY2FuIGFjY2VzcyB1bmRlcmx5aW5nIHJlcXVlc3QgZnJvbSBhbm90aGVyIHRocmVhZAorICAgICAgICByZXR1cm4gZXhlY3V0b3Iuc3VibWl0KG5ldyBDYWxsYWJsZTxTdHJpbmc+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGNhbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKChIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyKSByZXF1ZXN0KS5nZXRSZXF1ZXN0KCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pLmdldCgpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgicmVzcG9uc2VUeXBlIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlc3BvbnNlVHlwZSgpIHsKKworICAgICAgICByZXR1cm4gKChIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlcikgcmVzcG9uc2UpLmdldFJlc3BvbnNlKCkuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZy0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF9yZXF1ZXN0X3dyYXBwZXJfYmluZGluZzIvUmVxdWVzdFJlc3BvbnNlSW5qZWN0ZWRTaW5nbGV0b25SZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZy0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF9yZXF1ZXN0X3dyYXBwZXJfYmluZGluZzIvUmVxdWVzdFJlc3BvbnNlSW5qZWN0ZWRTaW5nbGV0b25SZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5MTZmN2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXJlcXVlc3Qtd3JhcHBlci1iaW5kaW5nLTIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlcl9iaW5kaW5nMi9SZXF1ZXN0UmVzcG9uc2VJbmplY3RlZFNpbmdsZXRvblJlc291cmNlLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlcl9iaW5kaW5nMjsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXI7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworCisvKioKKyAqIFRlc3QgcmVzb3VyY2UgdGhhdCBnZXRzIGluamVjdGVkIHdpdGggdGhlIGFjdHVhbCB7QGxpbmsgSHR0cFNlcnZsZXRSZXF1ZXN0fSBhbmQKKyAqIHtAbGluayBIdHRwU2VydmxldFJlc3BvbnNlfSBpbnN0YW5jZSwgc28gdGhhdCB3ZSBjb3VsZCB0ZXN0aWZ5IGN1c3RvbSBpbXBsZW1lbnRhdGlvbnMKKyAqIGhhcyBiZWVuIHVzZWQgdGhlcmUuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIi9zaW5nbGV0b24iKQorQFNpbmdsZXRvbgorcHVibGljIGNsYXNzIFJlcXVlc3RSZXNwb25zZUluamVjdGVkU2luZ2xldG9uUmVzb3VyY2UgeworCisgICAgQENvbnRleHQKKyAgICBIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdDsKKworICAgIEBDb250ZXh0CisgICAgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZTsKKworICAgIEBHRVQKKyAgICBAUGF0aCgicmVxdWVzdFR5cGUiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0UmVxdWVzdFR5cGUoKSB7CisKKyAgICAgICAgcmV0dXJuICgoSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlcikgcmVxdWVzdCkuZ2V0UmVxdWVzdCgpLmdldENsYXNzKCkuZ2V0TmFtZSgpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgicmVxdWVzdC9wYXJhbSIpCisgICAgcHVibGljIFN0cmluZyBnZXRSZXF1ZXN0QXR0cigpIHsKKworICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXRQYXJhbWV0ZXIoInEiKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInJlc3BvbnNlVHlwZSIpCisgICAgcHVibGljIFN0cmluZyBnZXRSZXNwb25zZVR5cGUoKSB7CisKKyAgICAgICAgcmV0dXJuICgoSHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIpIHJlc3BvbnNlKS5nZXRSZXNwb25zZSgpLmdldENsYXNzKCkuZ2V0TmFtZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtcmVxdWVzdC13cmFwcGVyLWJpbmRpbmctMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfcmVxdWVzdF93cmFwcGVyX2JpbmRpbmcyL1JlcXVlc3RSZXNwb25zZVdyYXBwZXJQcm92aWRlci5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZy0yL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF9yZXF1ZXN0X3dyYXBwZXJfYmluZGluZzIvUmVxdWVzdFJlc3BvbnNlV3JhcHBlclByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI1MGE3MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtcmVxdWVzdC13cmFwcGVyLWJpbmRpbmctMi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfcmVxdWVzdF93cmFwcGVyX2JpbmRpbmcyL1JlcXVlc3RSZXNwb25zZVdyYXBwZXJQcm92aWRlci5qYXZhCkBAIC0wLDAgKzEsODM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfcmVxdWVzdF93cmFwcGVyX2JpbmRpbmcyOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkFubm90YXRpb247CitpbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuVHlwZTsKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LlByaW5jaXBhbDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CitpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlN1cHBsaWVyOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5HZW5lcmljVHlwZTsKKworaW1wb3J0IGphdmF4LmluamVjdC5JbmplY3Q7CitpbXBvcnQgamF2YXguaW5qZWN0LlByb3ZpZGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuQXN5bmNDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuRGlzcGF0Y2hlclR5cGU7CitpbXBvcnQgamF2YXguc2VydmxldC5SZXF1ZXN0RGlzcGF0Y2hlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRDb250ZXh0OworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuQ29va2llOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2Vzc2lvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuUGFydDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdC5oazIuRGVsYXllZEhrMkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0LmhrMi5JbW1lZGlhdGVIazJJbmplY3Rpb25NYW5hZ2VyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5BYnN0cmFjdEJpbmRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuSW5qZWN0aW9uTWFuYWdlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuUmVmZXJlbmNpbmdGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuY29sbGVjdGlvbi5SZWY7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkucHJvY2Vzcy5pbnRlcm5hbC5SZXF1ZXN0U2NvcGVkOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3BpLkNvbXBvbmVudFByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuUmVxdWVzdFNjb3BlZEluaXRpYWxpemVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuaW50ZXJuYWwuc3BpLk5vT3BTZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5pbnRlcm5hbC5zcGkuUmVxdWVzdENvbnRleHRQcm92aWRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LmludGVybmFsLnNwaS5SZXF1ZXN0U2NvcGVkSW5pdGlhbGl6ZXJQcm92aWRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLmFwaS5EZXNjcmlwdG9yVHlwZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi5hcGkuRGVzY3JpcHRvclZpc2liaWxpdHk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIuYXBpLlBlckxvb2t1cDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi5hcGkuU2VydmljZUhhbmRsZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi5hcGkuU2VydmljZUxvY2F0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIuYXBpLlR5cGVMaXRlcmFsOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLnV0aWxpdGllcy5BYnN0cmFjdEFjdGl2ZURlc2NyaXB0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIudXRpbGl0aWVzLlNlcnZpY2VMb2NhdG9yVXRpbGl0aWVzOworCitpbXBvcnQgb3JnLmp2bmV0LmhrMi5pbnRlcm5hbC5TZXJ2aWNlSGFuZGxlSW1wbDsKKworLyoqCisgKiBTZXJ2bGV0IGNvbnRhaW5lciBwcm92aWRlciB0aGF0IHdyYXBzIHRoZSBvcmlnaW5hbCBTZXJ2bGV0IHJlcXVlc3QvcmVzcG9uc2UuCisgKiBUaGUgcmVxdWVzdCB3cmFwcGVyIGNvbnRhaW5zIGEgZGlyZWN0IHJlZmVyZW5jZSB0byB0aGUgdW5kZXJseWluZyBjb250YWluZXIgcmVxdWVzdAorICogaW4gY2FzZSBpdCBnZXRzIGluamVjdGVkIGludG8gYSByZXF1ZXN0IHNjb3BlZCBjb21wb25lbnQuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFJlcXVlc3RSZXNwb25zZVdyYXBwZXJQcm92aWRlciBleHRlbmRzIE5vT3BTZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXIgeworCisgICAgcHJpdmF0ZSBmaW5hbCBUeXBlIFJFUVVFU1RfVFlQRSA9IChuZXcgVHlwZUxpdGVyYWw8UmVmPEh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXI+PigpIHsKKyAgICB9KS5nZXRUeXBlKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBUeXBlIFJFU1BPTlNFX1RZUEUgPSAobmV3IFR5cGVMaXRlcmFsPFJlZjxIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlcj4+KCkgeworICAgIH0pLmdldFR5cGUoKTsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGVzY3JpcHRvclByb3ZpZGVyIGltcGxlbWVudHMgQ29tcG9uZW50UHJvdmlkZXIgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKEluamVjdGlvbk1hbmFnZXIgaW5qZWN0aW9uTWFuYWdlcikgeworICAgICAgICAgICAgU2VydmljZUxvY2F0b3IgbG9jYXRvciA9IGdldFNlcnZpY2VMb2NhdG9yKGluamVjdGlvbk1hbmFnZXIpOworICAgICAgICAgICAgU2VydmljZUxvY2F0b3JVdGlsaXRpZXMuYWRkT25lRGVzY3JpcHRvcihsb2NhdG9yLCBuZXcgSHR0cFNlcnZsZXRSZXF1ZXN0RGVzY3JpcHRvcihsb2NhdG9yKSk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gYmluZChDbGFzczw/PiBjb21wb25lbnQsIFNldDxDbGFzczw/Pj4gcHJvdmlkZXJDb250cmFjdHMpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBkb25lKCkgeworICAgICAgICAgICAgLy8gbm9wCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdWJjbGFzcyBzdGFuZGFyZCB3cmFwcGVyIHNvIHRoYXQgd2UgbWFrZSAxMDAgJSBzdXJlIHdlIGFyZSBnZXR0aW5nIHRoZSByaWdodCB0eXBlLgorICAgICAqIEl0IGlzIGFsc28gZmluYWwsIGkuZS4gbm90IHByb3hpYWJsZSwgd2hpY2ggd2Ugd29ya2Fyb3VuZCBieSB1c2luZyBjdXN0b20gaHR0cCBzZXJ2bGV0IHJlcXVlc3QgaW1wbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJlcXVlc3RXcmFwcGVyIGV4dGVuZHMgSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlciB7CisKKyAgICAgICAgcHVibGljIFJlcXVlc3RXcmFwcGVyKEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0KSB7CisgICAgICAgICAgICBzdXBlcihyZXF1ZXN0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFN1YmNsYXNzIHN0YW5kYXJkIHdyYXBwZXIgc28gdGhhdCB3ZSBtYWtlIDEwMCAlIHN1cmUgd2UgYXJlIGdldHRpbmcgdGhlIHJpZ2h0IHR5cGUuCisgICAgICogSXQgaXMgYWxzbyBmaW5hbCwgaS5lLiBub3QgcHJveGlhYmxlLCB3aGljaCB3ZSB3b3JrYXJvdW5kIGJ5IHVzaW5nIGN1c3RvbSBodHRwIHNlcnZsZXQgcmVzcG9uc2UgaW1wbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJlc3BvbnNlV3JhcHBlciBleHRlbmRzIEh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyIHsKKworICAgICAgICBwdWJsaWMgUmVzcG9uc2VXcmFwcGVyKEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgICAgIHN1cGVyKHJlc3BvbnNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGJpbmRzU2VydmxldFJlcXVlc3RSZXNwb25zZSgpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlcXVlc3RTY29wZWRJbml0aWFsaXplclByb3ZpZGVyIGdldFJlcXVlc3RTY29wZWRJbml0aWFsaXplclByb3ZpZGVyKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlcXVlc3RTY29wZWRJbml0aWFsaXplclByb3ZpZGVyKCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBSZXF1ZXN0U2NvcGVkSW5pdGlhbGl6ZXIgZ2V0KGZpbmFsIFJlcXVlc3RDb250ZXh0UHJvdmlkZXIgY29udGV4dCkgeworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmVxdWVzdFNjb3BlZEluaXRpYWxpemVyKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VMb2NhdG9yIGxvY2F0b3IgPSBnZXRTZXJ2aWNlTG9jYXRvcihpbmplY3Rpb25NYW5hZ2VyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0b3IuPFJlZjxIdHRwU2VydmxldFJlcXVlc3Q+PmdldFNlcnZpY2UoUkVRVUVTVF9UWVBFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KGZpbmFsV3JhcChjb250ZXh0LmdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdG9yLjxSZWY8SHR0cFNlcnZsZXRSZXNwb25zZT4+Z2V0U2VydmljZShSRVNQT05TRV9UWVBFKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KGZpbmFsV3JhcChjb250ZXh0LmdldEh0dHBTZXJ2bGV0UmVzcG9uc2UoKSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBwcml2YXRlIGZpbmFsIGNsYXNzIEJpbmRlciBleHRlbmRzIEFic3RyYWN0QmluZGVyIHsKKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworCisgICAgICAgICAgICBiaW5kRmFjdG9yeShIdHRwU2VydmxldFJlcXVlc3RSZWZlcmVuY2luZ0ZhY3RvcnkuY2xhc3MpCisgICAgICAgICAgICAgICAgICAgIC50byhIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyLmNsYXNzKS5pbihSZXF1ZXN0U2NvcGVkLmNsYXNzKTsKKworICAgICAgICAgICAgYmluZEZhY3RvcnkoUmVmZXJlbmNpbmdGYWN0b3J5LjxIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyPnJlZmVyZW5jZUZhY3RvcnkoKSkKKyAgICAgICAgICAgICAgICAgICAgLnRvKG5ldyBHZW5lcmljVHlwZTxSZWY8SHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlcj4+KCkgeworICAgICAgICAgICAgICAgICAgICB9KS5pbihSZXF1ZXN0U2NvcGVkLmNsYXNzKTsKKworICAgICAgICAgICAgYmluZEZhY3RvcnkoSHR0cFNlcnZsZXRSZXNwb25zZUZhY3RvcnkuY2xhc3MpLnRvKEh0dHBTZXJ2bGV0UmVzcG9uc2UuY2xhc3MpOworCisgICAgICAgICAgICBiaW5kRmFjdG9yeShIdHRwU2VydmxldFJlc3BvbnNlUmVmZXJlbmNpbmdGYWN0b3J5LmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAudG8oSHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIuY2xhc3MpLmluKFJlcXVlc3RTY29wZWQuY2xhc3MpOworCisgICAgICAgICAgICBiaW5kRmFjdG9yeShSZWZlcmVuY2luZ0ZhY3RvcnkuPEh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyPnJlZmVyZW5jZUZhY3RvcnkoKSkKKyAgICAgICAgICAgICAgICAgICAgLnRvKG5ldyBHZW5lcmljVHlwZTxSZWY8SHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXI+PigpIHsKKyAgICAgICAgICAgICAgICAgICAgfSkuaW4oUmVxdWVzdFNjb3BlZC5jbGFzcyk7CisKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEh0dHBTZXJ2bGV0UmVxdWVzdERlc2NyaXB0b3IgZXh0ZW5kcyBBYnN0cmFjdEFjdGl2ZURlc2NyaXB0b3I8SHR0cFNlcnZsZXRSZXF1ZXN0PiB7CisKKyAgICAgICAgc3RhdGljIFNldDxUeXBlPiBhZHZlcnRpc2VkQ29udHJhY3RzID0gbmV3IEhhc2hTZXQ8VHlwZT4oKSB7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWRkKEh0dHBTZXJ2bGV0UmVxdWVzdC5jbGFzcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgZmluYWwgU2VydmljZUxvY2F0b3IgbG9jYXRvcjsKKyAgICAgICAgdm9sYXRpbGUgamF2YXguaW5qZWN0LlByb3ZpZGVyPFJlZjxIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyPj4gcmVxdWVzdDsKKworICAgICAgICBwdWJsaWMgSHR0cFNlcnZsZXRSZXF1ZXN0RGVzY3JpcHRvcihmaW5hbCBTZXJ2aWNlTG9jYXRvciBsb2NhdG9yKSB7CisgICAgICAgICAgICBzdXBlcihhZHZlcnRpc2VkQ29udHJhY3RzLAorICAgICAgICAgICAgICAgICAgICBQZXJMb29rdXAuY2xhc3MsCisgICAgICAgICAgICAgICAgICAgIG51bGwsIG5ldyBIYXNoU2V0PEFubm90YXRpb24+KCksCisgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JUeXBlLkNMQVNTLCBEZXNjcmlwdG9yVmlzaWJpbGl0eS5MT0NBTCwKKyAgICAgICAgICAgICAgICAgICAgMCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7CisgICAgICAgICAgICB0aGlzLmxvY2F0b3IgPSBsb2NhdG9yOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDbGFzczw/PiBnZXRJbXBsZW1lbnRhdGlvbkNsYXNzKCkgeworICAgICAgICAgICAgcmV0dXJuIEh0dHBTZXJ2bGV0UmVxdWVzdC5jbGFzczsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgVHlwZSBnZXRJbXBsZW1lbnRhdGlvblR5cGUoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SW1wbGVtZW50YXRpb25DbGFzcygpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgU3RyaW5nIGdldEltcGxlbWVudGF0aW9uKCkgeworICAgICAgICAgICAgcmV0dXJuIEh0dHBTZXJ2bGV0UmVxdWVzdC5jbGFzcy5nZXROYW1lKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEh0dHBTZXJ2bGV0UmVxdWVzdCBjcmVhdGUoU2VydmljZUhhbmRsZTw/PiBzZXJ2aWNlSGFuZGxlKSB7CisgICAgICAgICAgICBpZiAocmVxdWVzdCA9PSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmVxdWVzdCA9IGxvY2F0b3IuZ2V0U2VydmljZShuZXcgVHlwZUxpdGVyYWw8UHJvdmlkZXI8UmVmPEh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXI+Pj4oKSB7CisgICAgICAgICAgICAgICAgfS5nZXRUeXBlKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sZWFuIGRpcmVjdCA9IGZhbHNlOworCisgICAgICAgICAgICBpZiAoc2VydmljZUhhbmRsZSBpbnN0YW5jZW9mIFNlcnZpY2VIYW5kbGVJbXBsKSB7CisgICAgICAgICAgICAgICAgZmluYWwgU2VydmljZUhhbmRsZUltcGwgc2VydmljZUhhbmRsZUltcGwgPSAoU2VydmljZUhhbmRsZUltcGwpIHNlcnZpY2VIYW5kbGU7CisgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIEFubm90YXRpb24+IHNjb3BlQW5ub3RhdGlvbiA9CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlSGFuZGxlSW1wbC5nZXRPcmlnaW5hbFJlcXVlc3QoKS5nZXRJbmplY3RlZURlc2NyaXB0b3IoKS5nZXRTY29wZUFubm90YXRpb24oKTsKKworICAgICAgICAgICAgICAgIGlmIChzY29wZUFubm90YXRpb24gPT0gUmVxdWVzdFNjb3BlZC5jbGFzcyB8fCBzY29wZUFubm90YXRpb24gPT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBkaXJlY3QgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICByZXR1cm4gIWRpcmVjdCA/IG5ldyBIdHRwU2VydmxldFJlcXVlc3RXcmFwcGVyKG5ldyBNeUh0dHBTZXJ2bGV0UmVxdWVzdEltcGwoKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcXVlc3QuZ2V0KCkuZ2V0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBTZXJ2bGV0UmVxdWVzdCBnZXRSZXF1ZXN0KCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVxdWVzdC5nZXQoKS5nZXQoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgOiBuZXcgSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlcihyZXF1ZXN0LmdldCgpLmdldCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEh0dHBTZXJ2bGV0UmVzcG9uc2VGYWN0b3J5IGltcGxlbWVudHMgU3VwcGxpZXI8SHR0cFNlcnZsZXRSZXNwb25zZT4geworICAgICAgICBwcml2YXRlIGZpbmFsIGphdmF4LmluamVjdC5Qcm92aWRlcjxSZWY8SHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXI+PiByZXNwb25zZTsKKworICAgICAgICBASW5qZWN0CisgICAgICAgIHB1YmxpYyBIdHRwU2VydmxldFJlc3BvbnNlRmFjdG9yeShqYXZheC5pbmplY3QuUHJvdmlkZXI8UmVmPEh0dHBTZXJ2bGV0UmVzcG9uc2VXcmFwcGVyPj4gcmVzcG9uc2UpIHsKKyAgICAgICAgICAgIHRoaXMucmVzcG9uc2UgPSByZXNwb25zZTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBAUGVyTG9va3VwCisgICAgICAgIHB1YmxpYyBIdHRwU2VydmxldFJlc3BvbnNlIGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIobmV3IEh0dHBTZXJ2bGV0UmVzcG9uc2UoKSB7CisKKyAgICAgICAgICAgICAgICBwcml2YXRlIEh0dHBTZXJ2bGV0UmVzcG9uc2UgZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmdldCgpLmdldCgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFkZENvb2tpZShDb29raWUgY29va2llKSB7CisgICAgICAgICAgICAgICAgICAgIGdldEh0dHBTZXJ2bGV0UmVzcG9uc2UoKS5hZGRDb29raWUoY29va2llKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0hlYWRlcihTdHJpbmcgcykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLmNvbnRhaW5zSGVhZGVyKHMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZW5jb2RlVVJMKFN0cmluZyBzKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlc3BvbnNlKCkuZW5jb2RlVVJMKHMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZW5jb2RlUmVkaXJlY3RVUkwoU3RyaW5nIHMpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVzcG9uc2UoKS5lbmNvZGVSZWRpcmVjdFVSTChzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGVuY29kZVVybChTdHJpbmcgcykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLmVuY29kZVVybChzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGVuY29kZVJlZGlyZWN0VXJsKFN0cmluZyBzKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlc3BvbnNlKCkuZW5jb2RlUmVkaXJlY3RVcmwocyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VuZEVycm9yKGludCBpLCBTdHJpbmcgcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLnNlbmRFcnJvcihpLCBzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZW5kRXJyb3IoaW50IGkpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIGdldEh0dHBTZXJ2bGV0UmVzcG9uc2UoKS5zZW5kRXJyb3IoaSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2VuZFJlZGlyZWN0KFN0cmluZyBzKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAgICAgICAgICAgICBnZXRIdHRwU2VydmxldFJlc3BvbnNlKCkuc2VuZFJlZGlyZWN0KHMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldERhdGVIZWFkZXIoU3RyaW5nIHMsIGxvbmcgbCkgeworICAgICAgICAgICAgICAgICAgICBnZXRIdHRwU2VydmxldFJlc3BvbnNlKCkuc2V0RGF0ZUhlYWRlcihzLCBsKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBhZGREYXRlSGVhZGVyKFN0cmluZyBzLCBsb25nIGwpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLmFkZERhdGVIZWFkZXIocywgbCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0SGVhZGVyKFN0cmluZyBoLCBTdHJpbmcgdikgeworICAgICAgICAgICAgICAgICAgICBnZXRIdHRwU2VydmxldFJlc3BvbnNlKCkuc2V0SGVhZGVyKGgsIHYpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHB1YmxpYyBDb2xsZWN0aW9uPFN0cmluZz4gZ2V0SGVhZGVyTmFtZXMoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlc3BvbnNlKCkuZ2V0SGVhZGVyTmFtZXMoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwdWJsaWMgQ29sbGVjdGlvbjxTdHJpbmc+IGdldEhlYWRlcnMoU3RyaW5nIHMpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVzcG9uc2UoKS5nZXRIZWFkZXJzKHMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SGVhZGVyKFN0cmluZyBzKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlc3BvbnNlKCkuZ2V0SGVhZGVyKHMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGFkZEhlYWRlcihTdHJpbmcgaCwgU3RyaW5nIHYpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLmFkZEhlYWRlcihoLCB2KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRJbnRIZWFkZXIoU3RyaW5nIHMsIGludCBpKSB7CisgICAgICAgICAgICAgICAgICAgIGdldEh0dHBTZXJ2bGV0UmVzcG9uc2UoKS5zZXRJbnRIZWFkZXIocywgaSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgYWRkSW50SGVhZGVyKFN0cmluZyBzLCBpbnQgaSkgeworICAgICAgICAgICAgICAgICAgICBnZXRIdHRwU2VydmxldFJlc3BvbnNlKCkuYWRkSW50SGVhZGVyKHMsIGkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhpbnQgaSkgeworICAgICAgICAgICAgICAgICAgICBnZXRIdHRwU2VydmxldFJlc3BvbnNlKCkuc2V0U3RhdHVzKGkpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBpbnQgZ2V0U3RhdHVzKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLmdldFN0YXR1cygpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldFN0YXR1cyhpbnQgaSwgU3RyaW5nIHMpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLnNldFN0YXR1cyhpLCBzKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENoYXJhY3RlckVuY29kaW5nKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLmdldENoYXJhY3RlckVuY29kaW5nKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIFN0cmluZyBnZXRDb250ZW50VHlwZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVzcG9uc2UoKS5nZXRDb250ZW50VHlwZSgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyBTZXJ2bGV0T3V0cHV0U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlc3BvbnNlKCkuZ2V0T3V0cHV0U3RyZWFtKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIFByaW50V3JpdGVyIGdldFdyaXRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlc3BvbnNlKCkuZ2V0V3JpdGVyKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0Q2hhcmFjdGVyRW5jb2RpbmcoU3RyaW5nIHMpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLnNldENoYXJhY3RlckVuY29kaW5nKHMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldENvbnRlbnRMZW5ndGgoaW50IGkpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLnNldENvbnRlbnRMZW5ndGgoaSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgc2V0Q29udGVudFR5cGUoU3RyaW5nIHMpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLnNldENvbnRlbnRUeXBlKHMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHNldEJ1ZmZlclNpemUoaW50IGkpIHsKKyAgICAgICAgICAgICAgICAgICAgZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLnNldEJ1ZmZlclNpemUoaSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIGludCBnZXRCdWZmZXJTaXplKCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXNwb25zZSgpLmdldEJ1ZmZlclNpemUoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBmbHVzaEJ1ZmZlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICAgICAgICAgIGdldEh0dHBTZXJ2bGV0UmVzcG9uc2UoKS5mbHVzaEJ1ZmZlcigpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0QnVmZmVyKCkgeworICAgICAgICAgICAgICAgICAgICBnZXRIdHRwU2VydmxldFJlc3BvbnNlKCkucmVzZXRCdWZmZXIoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0NvbW1pdHRlZCgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVzcG9uc2UoKS5pc0NvbW1pdHRlZCgpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeworICAgICAgICAgICAgICAgICAgICBnZXRIdHRwU2VydmxldFJlc3BvbnNlKCkucmVzZXQoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRMb2NhbGUoTG9jYWxlIGxvY2FsZSkgeworICAgICAgICAgICAgICAgICAgICBnZXRIdHRwU2VydmxldFJlc3BvbnNlKCkuc2V0TG9jYWxlKGxvY2FsZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIExvY2FsZSBnZXRMb2NhbGUoKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlc3BvbnNlKCkuZ2V0TG9jYWxlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIFNlcnZsZXRSZXNwb25zZSBnZXRSZXNwb25zZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLmdldCgpLmdldCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgIH0KKworICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJKYXZhRG9jIikKKyAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBIdHRwU2VydmxldFJlcXVlc3RSZWZlcmVuY2luZ0ZhY3RvcnkgZXh0ZW5kcyBSZWZlcmVuY2luZ0ZhY3Rvcnk8SHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlcj4geworCisgICAgICAgIEBJbmplY3QKKyAgICAgICAgcHVibGljIEh0dHBTZXJ2bGV0UmVxdWVzdFJlZmVyZW5jaW5nRmFjdG9yeSgKKyAgICAgICAgICAgICAgICBmaW5hbCBqYXZheC5pbmplY3QuUHJvdmlkZXI8UmVmPEh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXI+PiByZWZlcmVuY2VGYWN0b3J5KSB7CisKKyAgICAgICAgICAgIHN1cGVyKHJlZmVyZW5jZUZhY3RvcnkpOworICAgICAgICB9CisgICAgfQorCisgICAgQFN1cHByZXNzV2FybmluZ3MoIkphdmFEb2MiKQorICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEh0dHBTZXJ2bGV0UmVzcG9uc2VSZWZlcmVuY2luZ0ZhY3RvcnkgZXh0ZW5kcyBSZWZlcmVuY2luZ0ZhY3Rvcnk8SHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXI+IHsKKworICAgICAgICBASW5qZWN0CisgICAgICAgIHB1YmxpYyBIdHRwU2VydmxldFJlc3BvbnNlUmVmZXJlbmNpbmdGYWN0b3J5KAorICAgICAgICAgICAgICAgIGZpbmFsIGphdmF4LmluamVjdC5Qcm92aWRlcjxSZWY8SHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXI+PiByZWZlcmVuY2VGYWN0b3J5KSB7CisKKyAgICAgICAgICAgIHN1cGVyKHJlZmVyZW5jZUZhY3RvcnkpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBjb25maWd1cmUoZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcpIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgcmVzb3VyY2VDb25maWcucmVnaXN0ZXIobmV3IEJpbmRlcigpKTsKKyAgICB9CisKKyAgICBwcml2YXRlIEh0dHBTZXJ2bGV0UmVxdWVzdCBmaW5hbFdyYXAoZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXF1ZXN0V3JhcHBlcihyZXF1ZXN0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIEh0dHBTZXJ2bGV0UmVzcG9uc2UgZmluYWxXcmFwKGZpbmFsIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZVdyYXBwZXIocmVzcG9uc2UpOworICAgIH0KKworICAgIHByaXZhdGUgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIE15SHR0cFNlcnZsZXRSZXF1ZXN0SW1wbCBpbXBsZW1lbnRzIEh0dHBTZXJ2bGV0UmVxdWVzdCB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXV0aFR5cGUoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0QXV0aFR5cGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBhdXRoZW50aWNhdGUoSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlcXVlc3QoKS5hdXRoZW50aWNhdGUocmVzcG9uc2UpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQXN5bmNTdXBwb3J0ZWQoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuaXNBc3luY1N1cHBvcnRlZCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzQXN5bmNTdGFydGVkKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmlzQXN5bmNTdGFydGVkKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEFzeW5jQ29udGV4dCBzdGFydEFzeW5jKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuc3RhcnRBc3luYygpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBBc3luY0NvbnRleHQgc3RhcnRBc3luYyhTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2UpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24geworICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLnN0YXJ0QXN5bmMocmVxdWVzdCwgcmVzcG9uc2UpOworICAgICAgICB9CisKKyAgICAgICAgYWJzdHJhY3QgSHR0cFNlcnZsZXRSZXF1ZXN0IGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpOworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQ29va2llW10gZ2V0Q29va2llcygpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlcXVlc3QoKS5nZXRDb29raWVzKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0RGF0ZUhlYWRlcihTdHJpbmcgcykgeworICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldERhdGVIZWFkZXIocyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFBhcnQgZ2V0UGFydChTdHJpbmcgcykgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlcXVlc3QoKS5nZXRQYXJ0KHMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBDb2xsZWN0aW9uPFBhcnQ+IGdldFBhcnRzKCkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlcXVlc3QoKS5nZXRQYXJ0cygpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SGVhZGVyKFN0cmluZyBzKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0SGVhZGVyKHMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRIZWFkZXJzKFN0cmluZyBzKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0SGVhZGVycyhzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0SGVhZGVyTmFtZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0SGVhZGVyTmFtZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGdldEludEhlYWRlcihTdHJpbmcgcykgeworICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldEludEhlYWRlcihzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1ldGhvZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlcXVlc3QoKS5nZXRNZXRob2QoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFBhdGhJbmZvKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldFBhdGhJbmZvKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRQYXRoVHJhbnNsYXRlZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlcXVlc3QoKS5nZXRQYXRoVHJhbnNsYXRlZCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q29udGV4dFBhdGgoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0Q29udGV4dFBhdGgoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFF1ZXJ5U3RyaW5nKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldFF1ZXJ5U3RyaW5nKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRSZW1vdGVVc2VyKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldFJlbW90ZVVzZXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1VzZXJJblJvbGUoU3RyaW5nIHMpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlcXVlc3QoKS5pc1VzZXJJblJvbGUocyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFByaW5jaXBhbCBnZXRVc2VyUHJpbmNpcGFsKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldFVzZXJQcmluY2lwYWwoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RlZFNlc3Npb25JZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlcXVlc3QoKS5nZXRSZXF1ZXN0ZWRTZXNzaW9uSWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RVUkkoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0UmVxdWVzdFVSSSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmdCdWZmZXIgZ2V0UmVxdWVzdFVSTCgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlcXVlc3QoKS5nZXRSZXF1ZXN0VVJMKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRTZXJ2bGV0UGF0aCgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlcXVlc3QoKS5nZXRTZXJ2bGV0UGF0aCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBIdHRwU2Vzc2lvbiBnZXRTZXNzaW9uKGJvb2xlYW4gYikgeworICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldFNlc3Npb24oYik7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEh0dHBTZXNzaW9uIGdldFNlc3Npb24oKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0U2Vzc2lvbigpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmVxdWVzdGVkU2Vzc2lvbklkVmFsaWQoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuaXNSZXF1ZXN0ZWRTZXNzaW9uSWRWYWxpZCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBib29sZWFuIGlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbUNvb2tpZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlcXVlc3QoKS5pc1JlcXVlc3RlZFNlc3Npb25JZEZyb21Db29raWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcXVlc3RlZFNlc3Npb25JZEZyb21VUkwoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuaXNSZXF1ZXN0ZWRTZXNzaW9uSWRGcm9tVVJMKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNSZXF1ZXN0ZWRTZXNzaW9uSWRGcm9tVXJsKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmlzUmVxdWVzdGVkU2Vzc2lvbklkRnJvbVVybCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0QXR0cmlidXRlKFN0cmluZyBzKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0QXR0cmlidXRlKHMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBFbnVtZXJhdGlvbiBnZXRBdHRyaWJ1dGVOYW1lcygpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlcXVlc3QoKS5nZXRBdHRyaWJ1dGVOYW1lcygpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0Q2hhcmFjdGVyRW5jb2RpbmcoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBzZXRDaGFyYWN0ZXJFbmNvZGluZyhTdHJpbmcgcykgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24geworICAgICAgICAgICAgZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuc2V0Q2hhcmFjdGVyRW5jb2Rpbmcocyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBnZXRDb250ZW50TGVuZ3RoKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldENvbnRlbnRMZW5ndGgoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldENvbnRlbnRUeXBlKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldENvbnRlbnRUeXBlKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFNlcnZsZXRJbnB1dFN0cmVhbSBnZXRJbnB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0SW5wdXRTdHJlYW0oKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFBhcmFtZXRlcihTdHJpbmcgcykgeworICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldFBhcmFtZXRlcihzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0UGFyYW1ldGVyTmFtZXMoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0UGFyYW1ldGVyTmFtZXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nW10gZ2V0UGFyYW1ldGVyVmFsdWVzKFN0cmluZyBzKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0UGFyYW1ldGVyVmFsdWVzKHMpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBNYXAgZ2V0UGFyYW1ldGVyTWFwKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldFBhcmFtZXRlck1hcCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvdG9jb2woKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0UHJvdG9jb2woKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFNjaGVtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlcXVlc3QoKS5nZXRTY2hlbWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFNlcnZlck5hbWUoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0U2VydmVyTmFtZSgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBpbnQgZ2V0U2VydmVyUG9ydCgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlcXVlc3QoKS5nZXRTZXJ2ZXJQb3J0KCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIEJ1ZmZlcmVkUmVhZGVyIGdldFJlYWRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0UmVhZGVyKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRSZW1vdGVBZGRyKCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldFJlbW90ZUFkZHIoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFJlbW90ZUhvc3QoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0UmVtb3RlSG9zdCgpOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgcywgT2JqZWN0IG8pIHsKKyAgICAgICAgICAgIGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLnNldEF0dHJpYnV0ZShzLCBvKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmVBdHRyaWJ1dGUoU3RyaW5nIHMpIHsKKyAgICAgICAgICAgIGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLnJlbW92ZUF0dHJpYnV0ZShzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTG9jYWxlIGdldExvY2FsZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlcXVlc3QoKS5nZXRMb2NhbGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRW51bWVyYXRpb24gZ2V0TG9jYWxlcygpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlcXVlc3QoKS5nZXRMb2NhbGVzKCk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTZWN1cmUoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuaXNTZWN1cmUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgUmVxdWVzdERpc3BhdGNoZXIgZ2V0UmVxdWVzdERpc3BhdGNoZXIoU3RyaW5nIHMpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlcXVlc3QoKS5nZXRSZXF1ZXN0RGlzcGF0Y2hlcihzKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFJlYWxQYXRoKFN0cmluZyBzKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0UmVhbFBhdGgocyk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIGludCBnZXRSZW1vdGVQb3J0KCkgeworICAgICAgICAgICAgcmV0dXJuIGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmdldFJlbW90ZVBvcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldExvY2FsTmFtZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlcXVlc3QoKS5nZXRMb2NhbE5hbWUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldExvY2FsQWRkcigpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlcXVlc3QoKS5nZXRMb2NhbEFkZHIoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgaW50IGdldExvY2FsUG9ydCgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlcXVlc3QoKS5nZXRMb2NhbFBvcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgRGlzcGF0Y2hlclR5cGUgZ2V0RGlzcGF0Y2hlclR5cGUoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0RGlzcGF0Y2hlclR5cGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgQXN5bmNDb250ZXh0IGdldEFzeW5jQ29udGV4dCgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRIdHRwU2VydmxldFJlcXVlc3QoKS5nZXRBc3luY0NvbnRleHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU2VydmxldENvbnRleHQgZ2V0U2VydmxldENvbnRleHQoKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0SHR0cFNlcnZsZXRSZXF1ZXN0KCkuZ2V0U2VydmxldENvbnRleHQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBsb2dvdXQoKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBnZXRIdHRwU2VydmxldFJlcXVlc3QoKS5sb2dvdXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgdm9pZCBsb2dpbihTdHJpbmcgdSwgU3RyaW5nIHApIHRocm93cyBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpLmxvZ2luKHUsIHApOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgU2VydmljZUxvY2F0b3IgZ2V0U2VydmljZUxvY2F0b3IoSW5qZWN0aW9uTWFuYWdlciBpbmplY3Rpb25NYW5hZ2VyKSB7CisgICAgICAgIGlmIChpbmplY3Rpb25NYW5hZ2VyIGluc3RhbmNlb2YgSW1tZWRpYXRlSGsySW5qZWN0aW9uTWFuYWdlcikgeworICAgICAgICAgICAgcmV0dXJuICAoKEltbWVkaWF0ZUhrMkluamVjdGlvbk1hbmFnZXIpIGluamVjdGlvbk1hbmFnZXIpLmdldFNlcnZpY2VMb2NhdG9yKCk7CisgICAgICAgIH0gZWxzZSBpZiAoaW5qZWN0aW9uTWFuYWdlciBpbnN0YW5jZW9mIERlbGF5ZWRIazJJbmplY3Rpb25NYW5hZ2VyKSB7CisgICAgICAgICAgICByZXR1cm4gICgoRGVsYXllZEhrMkluamVjdGlvbk1hbmFnZXIpIGluamVjdGlvbk1hbmFnZXIpLmdldFNlcnZpY2VMb2NhdG9yKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiSW52YWxpZCBJbmplY3Rpb25NYW5hZ2VyIik7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXJlcXVlc3Qtd3JhcHBlci1iaW5kaW5nLTIvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29tcG9uZW50UHJvdmlkZXIgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXJlcXVlc3Qtd3JhcHBlci1iaW5kaW5nLTIvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuQ29tcG9uZW50UHJvdmlkZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY3ODBmZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtcmVxdWVzdC13cmFwcGVyLWJpbmRpbmctMi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwaS5Db21wb25lbnRQcm92aWRlcgpAQCAtMCwwICsxIEBACitvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlcl9iaW5kaW5nMi5SZXF1ZXN0UmVzcG9uc2VXcmFwcGVyUHJvdmlkZXIkRGVzY3JpcHRvclByb3ZpZGVyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZy0yL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LmludGVybmFsLnNwaS5TZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXIgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXJlcXVlc3Qtd3JhcHBlci1iaW5kaW5nLTIvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuaW50ZXJuYWwuc3BpLlNlcnZsZXRDb250YWluZXJQcm92aWRlcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDM4NTFlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZy0yL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LmludGVybmFsLnNwaS5TZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXIKQEAgLTAsMCArMSBAQAorb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF9yZXF1ZXN0X3dyYXBwZXJfYmluZGluZzIuUmVxdWVzdFJlc3BvbnNlV3JhcHBlclByb3ZpZGVyClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZy0yL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXJlcXVlc3Qtd3JhcHBlci1iaW5kaW5nLTIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWIwNWM0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZy0yL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSw0MCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfM18wLnhzZCIKKyAgICAgICAgIHZlcnNpb249IjMuMCI+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5qZXJzZXlBcHA8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmplcnNleS5jb25maWcuc2VydmVyLnByb3ZpZGVyLmNsYXNzbmFtZXM8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF9yZXF1ZXN0X3dyYXBwZXJfYmluZGluZzIuUmVxdWVzdFJlc3BvbnNlSW5qZWN0ZWRSZXNvdXJjZSwKKyAgICAgICAgICAgICAgICBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlcl9iaW5kaW5nMi5SZXF1ZXN0UmVzcG9uc2VJbmplY3RlZFNpbmdsZXRvblJlc291cmNlCisgICAgICAgICAgICA8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKworICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+amVyc2V5QXBwPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vd2VieG1sY29uZmlndXJlZC8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtcmVxdWVzdC13cmFwcGVyLWJpbmRpbmctMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfcmVxdWVzdF93cmFwcGVyMi9BYnN0cmFjdFJlcXVlc3RSZXNwb25zZVR5cGVUZXN0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXJlcXVlc3Qtd3JhcHBlci1iaW5kaW5nLTIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlcjIvQWJzdHJhY3RSZXF1ZXN0UmVzcG9uc2VUeXBlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MzE0NTAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXJlcXVlc3Qtd3JhcHBlci1iaW5kaW5nLTIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlcjIvQWJzdHJhY3RSZXF1ZXN0UmVzcG9uc2VUeXBlVGVzdC5qYXZhCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF9yZXF1ZXN0X3dyYXBwZXIyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfcmVxdWVzdF93cmFwcGVyX2JpbmRpbmcyLlJlcXVlc3RSZXNwb25zZVdyYXBwZXJQcm92aWRlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5oYW1jcmVzdC5Db3JlTWF0Y2hlcnMuZXF1YWxUbzsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5pczsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0Lk1hdGNoZXJBc3NlcnQuYXNzZXJ0VGhhdDsKKworLyoqCisgKiBNYWtlIHN1cmUgdGhhdCBpbmplY3RlZCByZXF1ZXN0L3Jlc3BvbnNlIGluc3RhbmNlcworICogYXJlIG9mIHRoZSB0eXBlcyBpbmplY3RlZCBieSB7QGxpbmsgUmVxdWVzdFJlc3BvbnNlV3JhcHBlclByb3ZpZGVyfS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZXF1ZXN0UmVzcG9uc2VUeXBlVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1ZXN0VHlwZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgcmVxdWVzdFR5cGUgPSB0YXJnZXQoZ2V0QXBwQmFzZVBhdGgoKSkucGF0aCgicmVxdWVzdFR5cGUiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRoYXQocmVxdWVzdFR5cGUsIGlzKGVxdWFsVG8oUmVxdWVzdFJlc3BvbnNlV3JhcHBlclByb3ZpZGVyLlJlcXVlc3RXcmFwcGVyLmNsYXNzLmdldE5hbWUoKSkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNwb25zZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlcXVlc3RUeXBlID0gdGFyZ2V0KGdldEFwcEJhc2VQYXRoKCkpLnBhdGgoInJlc3BvbnNlVHlwZSIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXF1ZXN0VHlwZSwgaXMoZXF1YWxUbyhSZXF1ZXN0UmVzcG9uc2VXcmFwcGVyUHJvdmlkZXIuUmVzcG9uc2VXcmFwcGVyLmNsYXNzLmdldE5hbWUoKSkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGV0b25SZXF1ZXN0VHlwZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgcmVxdWVzdFR5cGUgPSB0YXJnZXQoZ2V0QXBwQmFzZVBhdGgoKSkucGF0aCgic2luZ2xldG9uL3JlcXVlc3RUeXBlIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KHJlcXVlc3RUeXBlLCBpcyhlcXVhbFRvKFJlcXVlc3RSZXNwb25zZVdyYXBwZXJQcm92aWRlci5SZXF1ZXN0V3JhcHBlci5jbGFzcy5nZXROYW1lKCkpKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2luZ2xldG9uUmVxdWVzdEF0dHIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZm9yIChTdHJpbmcgcSA6IG5ldyBTdHJpbmdbXSB7IjEiLCAiMiIsICIzIiwgIjk1IiwgIjk4IiwgIk5UIiwgIjIwMDAiLCAiWFAiLCAiVmlzdGEiLCAiNyIsICI4IiwgIjEwIn0pIHsKKyAgICAgICAgICAgIF90ZXN0U2luZ2xldG9uUmVxdWVzdEF0dHIoIm9uZSIpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIHZvaWQgX3Rlc3RTaW5nbGV0b25SZXF1ZXN0QXR0cihTdHJpbmcgcSkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXF1ZXN0VHlwZSA9IHRhcmdldChnZXRBcHBCYXNlUGF0aCgpKS5wYXRoKCJzaW5nbGV0b24vcmVxdWVzdC9wYXJhbSIpCisgICAgICAgICAgICAgICAgLnF1ZXJ5UGFyYW0oInEiLCBxKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRoYXQocmVxdWVzdFR5cGUsIGlzKGVxdWFsVG8ocSkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTaW5nbGV0b25SZXNwb25zZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlcXVlc3RUeXBlID0gdGFyZ2V0KGdldEFwcEJhc2VQYXRoKCkpLnBhdGgoInNpbmdsZXRvbi9yZXNwb25zZVR5cGUiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRoYXQocmVxdWVzdFR5cGUsIGlzKGVxdWFsVG8oUmVxdWVzdFJlc3BvbnNlV3JhcHBlclByb3ZpZGVyLlJlc3BvbnNlV3JhcHBlci5jbGFzcy5nZXROYW1lKCkpKSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyBnZXRBcHBCYXNlUGF0aCgpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZy0yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF9yZXF1ZXN0X3dyYXBwZXIyL0F1dG9kZXRlY3RlZEFwcFJlcXVlc3RSZXNwb25zZVR5cGVJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtcmVxdWVzdC13cmFwcGVyLWJpbmRpbmctMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfcmVxdWVzdF93cmFwcGVyMi9BdXRvZGV0ZWN0ZWRBcHBSZXF1ZXN0UmVzcG9uc2VUeXBlSVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNhNjA2MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtcmVxdWVzdC13cmFwcGVyLWJpbmRpbmctMi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfcmVxdWVzdF93cmFwcGVyMi9BdXRvZGV0ZWN0ZWRBcHBSZXF1ZXN0UmVzcG9uc2VUeXBlSVRDYXNlLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlcjI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfcmVxdWVzdF93cmFwcGVyX2JpbmRpbmcyLkpheFJzQXBwbGljYXRpb25BdXRvZGV0ZWN0ZWQ7CisKKy8qKgorICogVGVzdCBmb3IgdGhlIGF1dG9kZXRlY3RlZCBKQVgtUlMgYXBwLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBBdXRvZGV0ZWN0ZWRBcHBSZXF1ZXN0UmVzcG9uc2VUeXBlSVRDYXNlIGV4dGVuZHMgQWJzdHJhY3RSZXF1ZXN0UmVzcG9uc2VUeXBlVGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEFwcEJhc2VQYXRoKCkgeworICAgICAgICByZXR1cm4gImF1dG9kZXRlY3RlZCI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIFJlc291cmNlQ29uZmlnLmZvckFwcGxpY2F0aW9uQ2xhc3MoSmF4UnNBcHBsaWNhdGlvbkF1dG9kZXRlY3RlZC5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZy0yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF9yZXF1ZXN0X3dyYXBwZXIyL1dlYlhtbENvbmZpZ3VyZWRBcHBSZXF1ZXN0UmVzcG9uc2VUeXBlSVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXJlcXVlc3Qtd3JhcHBlci1iaW5kaW5nLTIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlcjIvV2ViWG1sQ29uZmlndXJlZEFwcFJlcXVlc3RSZXNwb25zZVR5cGVJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTAyOGRjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZy0yL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF9yZXF1ZXN0X3dyYXBwZXIyL1dlYlhtbENvbmZpZ3VyZWRBcHBSZXF1ZXN0UmVzcG9uc2VUeXBlSVRDYXNlLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlcjI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfcmVxdWVzdF93cmFwcGVyX2JpbmRpbmcyLlJlcXVlc3RSZXNwb25zZUluamVjdGVkUmVzb3VyY2U7CisKKy8qKgorICogVGVzdCBmb3IgdGhlIHdlYi54bWwgY29uZmlndXJlZCBKQVgtUlMgYXBwLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBXZWJYbWxDb25maWd1cmVkQXBwUmVxdWVzdFJlc3BvbnNlVHlwZUlUQ2FzZSBleHRlbmRzIEFic3RyYWN0UmVxdWVzdFJlc3BvbnNlVHlwZVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRBcHBCYXNlUGF0aCgpIHsKKyAgICAgICAgcmV0dXJuICJ3ZWJ4bWxjb25maWd1cmVkIjsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFJlcXVlc3RSZXNwb25zZUluamVjdGVkUmVzb3VyY2UuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtcmVxdWVzdC13cmFwcGVyLWJpbmRpbmcvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtcmVxdWVzdC13cmFwcGVyLWJpbmRpbmcvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTg2OWM0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZy9wb20ueG1sCkBAIC0wLDAgKzEsODEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LXJlcXVlc3Qtd3JhcHBwZXItYmluZGluZzwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1zZXJ2bGV0LXJlcXVlc3Qtd3JhcHBlci1iaW5kaW5nPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPlNlcnZsZXQgaW50ZWdyYXRpb24gdGVzdCAtIFJlcXVlc3Qgd3JhcHBlciBiaW5kaW5nIC0gU2VydmxldENvbnRhaW5lclByb3ZpZGVyRmFjdG9yeSwgU2VydmxldENvbnRhaW5lclByb3ZpZGVyPC9kZXNjcmlwdGlvbj4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1zZXJ2bGV0LXBvcnRhYmlsaXR5PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtzZXJ2bGV0My52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmhhbWNyZXN0PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGFtY3Jlc3QtbGlicmFyeTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfcmVxdWVzdF93cmFwcGVyX2JpbmRpbmcvSmF4UnNBcHBsaWNhdGlvbkF1dG9kZXRlY3RlZC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfcmVxdWVzdF93cmFwcGVyX2JpbmRpbmcvSmF4UnNBcHBsaWNhdGlvbkF1dG9kZXRlY3RlZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZTQxMjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXJlcXVlc3Qtd3JhcHBlci1iaW5kaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF9yZXF1ZXN0X3dyYXBwZXJfYmluZGluZy9KYXhSc0FwcGxpY2F0aW9uQXV0b2RldGVjdGVkLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlcl9iaW5kaW5nOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLkFwcGxpY2F0aW9uUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCisvKioKKyAqIFRlc3QgYXBwbGljYXRpb24uIFRoaXMgb25lIGdldHMgcmVnaXN0ZXJlZCBhdXRvbWF0aWNhbGx5LgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BBcHBsaWNhdGlvblBhdGgoImF1dG9kZXRlY3RlZCIpCitwdWJsaWMgY2xhc3MgSmF4UnNBcHBsaWNhdGlvbkF1dG9kZXRlY3RlZCBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgIHJldHVybiBuZXcgSGFzaFNldDxDbGFzczw/Pj4oKSB7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYWRkKFJlcXVlc3RSZXNwb25zZUluamVjdGVkUmVzb3VyY2UuY2xhc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtcmVxdWVzdC13cmFwcGVyLWJpbmRpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlcl9iaW5kaW5nL1JlcXVlc3RSZXNwb25zZUluamVjdGVkUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtcmVxdWVzdC13cmFwcGVyLWJpbmRpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlcl9iaW5kaW5nL1JlcXVlc3RSZXNwb25zZUluamVjdGVkUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGNjNjkwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfcmVxdWVzdF93cmFwcGVyX2JpbmRpbmcvUmVxdWVzdFJlc3BvbnNlSW5qZWN0ZWRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF9yZXF1ZXN0X3dyYXBwZXJfYmluZGluZzsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuaHR0cC5IdHRwU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKKworLyoqCisgKiBUZXN0IHJlc291cmNlIHRoYXQgZ2V0cyBpbmplY3RlZCB3aXRoIHRoZSBhY3R1YWwge0BsaW5rIEh0dHBTZXJ2bGV0UmVxdWVzdH0gYW5kCisgKiB7QGxpbmsgSHR0cFNlcnZsZXRSZXNwb25zZX0gaW5zdGFuY2UsIHNvIHRoYXQgd2UgY291bGQgdGVzdGlmeSBjdXN0b20gaW1wbGVtZW50YXRpb25zCisgKiBoYXMgYmVlbiB1c2VkIHRoZXJlLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCIvIikKK3B1YmxpYyBjbGFzcyBSZXF1ZXN0UmVzcG9uc2VJbmplY3RlZFJlc291cmNlIHsKKworICAgIEBDb250ZXh0CisgICAgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3Q7CisKKyAgICBAQ29udGV4dAorICAgIEh0dHBTZXJ2bGV0UmVzcG9uc2UgcmVzcG9uc2U7CisKKyAgICBAR0VUCisgICAgQFBhdGgoInJlcXVlc3RUeXBlIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlcXVlc3RUeXBlKCkgeworCisgICAgICAgIHJldHVybiByZXF1ZXN0LmdldENsYXNzKCkuZ2V0TmFtZSgpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgicmVzcG9uc2VUeXBlIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldFJlc3BvbnNlVHlwZSgpIHsKKworICAgICAgICByZXR1cm4gcmVzcG9uc2UuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfcmVxdWVzdF93cmFwcGVyX2JpbmRpbmcvUmVxdWVzdFJlc3BvbnNlV3JhcHBlclByb3ZpZGVyLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXJlcXVlc3Qtd3JhcHBlci1iaW5kaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF9yZXF1ZXN0X3dyYXBwZXJfYmluZGluZy9SZXF1ZXN0UmVzcG9uc2VXcmFwcGVyUHJvdmlkZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWY0MGE3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfcmVxdWVzdF93cmFwcGVyX2JpbmRpbmcvUmVxdWVzdFJlc3BvbnNlV3JhcHBlclByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlcl9iaW5kaW5nOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0V3JhcHBlcjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC51dGlsLmNvbGxlY3Rpb24uUmVmOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcGkuUmVxdWVzdFNjb3BlZEluaXRpYWxpemVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuaW50ZXJuYWwuc3BpLk5vT3BTZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5pbnRlcm5hbC5zcGkuUmVxdWVzdFNjb3BlZEluaXRpYWxpemVyUHJvdmlkZXI7CisKKy8qKgorICogU2VydmxldCBjb250YWluZXIgcHJvdmlkZXIgdGhhdCB3cmFwcyB0aGUgb3JpZ2luYWwgU2VydmxldCByZXF1ZXN0L3Jlc3BvbnNlLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBSZXF1ZXN0UmVzcG9uc2VXcmFwcGVyUHJvdmlkZXIgZXh0ZW5kcyBOb09wU2VydmxldENvbnRhaW5lclByb3ZpZGVyIHsKKworICAgIC8qKgorICAgICAqIFN1YmNsYXNzIHN0YW5kYXJkIHdyYXBwZXIgc28gdGhhdCB3ZSBtYWtlIDEwMCAlIHN1cmUgd2UgYXJlIGdldHRpbmcgdGhlIHJpZ2h0IHR5cGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXF1ZXN0V3JhcHBlciBleHRlbmRzIEh0dHBTZXJ2bGV0UmVxdWVzdFdyYXBwZXIgeworCisgICAgICAgIHB1YmxpYyBSZXF1ZXN0V3JhcHBlcihIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCkgeworICAgICAgICAgICAgc3VwZXIocmVxdWVzdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdWJjbGFzcyBzdGFuZGFyZCB3cmFwcGVyIHNvIHRoYXQgd2UgbWFrZSAxMDAgJSBzdXJlIHdlIGFyZSBnZXR0aW5nIHRoZSByaWdodCB0eXBlLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVzcG9uc2VXcmFwcGVyIGV4dGVuZHMgSHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXIgeworCisgICAgICAgIHB1YmxpYyBSZXNwb25zZVdyYXBwZXIoSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgeworICAgICAgICAgICAgc3VwZXIocmVzcG9uc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlcXVlc3RTY29wZWRJbml0aWFsaXplclByb3ZpZGVyIGdldFJlcXVlc3RTY29wZWRJbml0aWFsaXplclByb3ZpZGVyKCkgeworICAgICAgICByZXR1cm4gY29udGV4dCAtPiAoUmVxdWVzdFNjb3BlZEluaXRpYWxpemVyKSBpbmplY3Rpb25NYW5hZ2VyIC0+IHsKKyAgICAgICAgICAgIGluamVjdGlvbk1hbmFnZXIuPFJlZjxIdHRwU2VydmxldFJlcXVlc3Q+PmdldEluc3RhbmNlKEhUVFBfU0VSVkxFVF9SRVFVRVNUX1RZUEUpCisgICAgICAgICAgICAgICAgICAgIC5zZXQod3JhcHBlZChjb250ZXh0LmdldEh0dHBTZXJ2bGV0UmVxdWVzdCgpKSk7CisgICAgICAgICAgICBpbmplY3Rpb25NYW5hZ2VyLjxSZWY8SHR0cFNlcnZsZXRSZXNwb25zZT4+Z2V0SW5zdGFuY2UoSFRUUF9TRVJWTEVUX1JFU1BPTlNFX1RZUEUpCisgICAgICAgICAgICAgICAgICAgIC5zZXQod3JhcHBlZChjb250ZXh0LmdldEh0dHBTZXJ2bGV0UmVzcG9uc2UoKSkpOworICAgICAgICB9OworICAgIH0KKworICAgIHByaXZhdGUgSHR0cFNlcnZsZXRSZXF1ZXN0IHdyYXBwZWQoZmluYWwgSHR0cFNlcnZsZXRSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXF1ZXN0V3JhcHBlcihyZXF1ZXN0KTsKKyAgICB9CisKKyAgICBwcml2YXRlIEh0dHBTZXJ2bGV0UmVzcG9uc2Ugd3JhcHBlZChmaW5hbCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2VXcmFwcGVyKHJlc3BvbnNlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXJlcXVlc3Qtd3JhcHBlci1iaW5kaW5nL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LmludGVybmFsLnNwaS5TZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXIgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXJlcXVlc3Qtd3JhcHBlci1iaW5kaW5nL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LmludGVybmFsLnNwaS5TZXJ2bGV0Q29udGFpbmVyUHJvdmlkZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ1N2Y3YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtcmVxdWVzdC13cmFwcGVyLWJpbmRpbmcvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NlcnZpY2VzL29yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuaW50ZXJuYWwuc3BpLlNlcnZsZXRDb250YWluZXJQcm92aWRlcgpAQCAtMCwwICsxIEBACitvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlcl9iaW5kaW5nLlJlcXVlc3RSZXNwb25zZVdyYXBwZXJQcm92aWRlcgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtcmVxdWVzdC13cmFwcGVyLWJpbmRpbmcvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtcmVxdWVzdC13cmFwcGVyLWJpbmRpbmcvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2VlNTk1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzNfMC54c2QiCisgICAgICAgICB2ZXJzaW9uPSIzLjAiPgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+amVyc2V5QXBwPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qZXJzZXkuY29uZmlnLnNlcnZlci5wcm92aWRlci5jbGFzc25hbWVzPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfcmVxdWVzdF93cmFwcGVyX2JpbmRpbmcuUmVxdWVzdFJlc3BvbnNlSW5qZWN0ZWRSZXNvdXJjZTwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorCisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5qZXJzZXlBcHA8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi93ZWJ4bWxjb25maWd1cmVkLyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfcmVxdWVzdF93cmFwcGVyL0Fic3RyYWN0UmVxdWVzdFJlc3BvbnNlVHlwZVRlc3QuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtcmVxdWVzdC13cmFwcGVyLWJpbmRpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlci9BYnN0cmFjdFJlcXVlc3RSZXNwb25zZVR5cGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY0NzEwZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtcmVxdWVzdC13cmFwcGVyLWJpbmRpbmcvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlci9BYnN0cmFjdFJlcXVlc3RSZXNwb25zZVR5cGVUZXN0LmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlcl9iaW5kaW5nLlJlcXVlc3RSZXNwb25zZVdyYXBwZXJQcm92aWRlcjsKKworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuTWF0Y2hlckFzc2VydC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmVxdWFsVG87CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBNYWtlIHN1cmUgdGhhdCBpbmplY3RlZCByZXF1ZXN0L3Jlc3BvbnNlIGluc3RhbmNlcworICogYXJlIG9mIHRoZSB0eXBlcyBpbmplY3RlZCBieSB7QGxpbmsgUmVxdWVzdFJlc3BvbnNlV3JhcHBlclByb3ZpZGVyfS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RSZXF1ZXN0UmVzcG9uc2VUeXBlVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXF1ZXN0VHlwZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBTdHJpbmcgcmVxdWVzdFR5cGUgPSB0YXJnZXQoZ2V0QXBwQmFzZVBhdGgoKSkucGF0aCgicmVxdWVzdFR5cGUiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRoYXQocmVxdWVzdFR5cGUsIGlzKGVxdWFsVG8oUmVxdWVzdFJlc3BvbnNlV3JhcHBlclByb3ZpZGVyLlJlcXVlc3RXcmFwcGVyLmNsYXNzLmdldE5hbWUoKSkpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNwb25zZVR5cGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHJlcXVlc3RUeXBlID0gdGFyZ2V0KGdldEFwcEJhc2VQYXRoKCkpLnBhdGgoInJlc3BvbnNlVHlwZSIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VGhhdChyZXF1ZXN0VHlwZSwgaXMoZXF1YWxUbyhSZXF1ZXN0UmVzcG9uc2VXcmFwcGVyUHJvdmlkZXIuUmVzcG9uc2VXcmFwcGVyLmNsYXNzLmdldE5hbWUoKSkpKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgU3RyaW5nIGdldEFwcEJhc2VQYXRoKCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXJlcXVlc3Qtd3JhcHBlci1iaW5kaW5nL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF9yZXF1ZXN0X3dyYXBwZXIvQXV0b2RldGVjdGVkQXBwUmVxdWVzdFJlc3BvbnNlVHlwZUlUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfcmVxdWVzdF93cmFwcGVyL0F1dG9kZXRlY3RlZEFwcFJlcXVlc3RSZXNwb25zZVR5cGVJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Yjc0MDNhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfcmVxdWVzdF93cmFwcGVyL0F1dG9kZXRlY3RlZEFwcFJlcXVlc3RSZXNwb25zZVR5cGVJVENhc2UuamF2YQpAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXRfcmVxdWVzdF93cmFwcGVyOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlcl9iaW5kaW5nLkpheFJzQXBwbGljYXRpb25BdXRvZGV0ZWN0ZWQ7CisKKy8qKgorICogVGVzdCBmb3IgdGhlIGF1dG9kZXRlY3RlZCBKQVgtUlMgYXBwLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBBdXRvZGV0ZWN0ZWRBcHBSZXF1ZXN0UmVzcG9uc2VUeXBlSVRDYXNlIGV4dGVuZHMgQWJzdHJhY3RSZXF1ZXN0UmVzcG9uc2VUeXBlVGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldEFwcEJhc2VQYXRoKCkgeworICAgICAgICByZXR1cm4gImF1dG9kZXRlY3RlZCI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIFJlc291cmNlQ29uZmlnLmZvckFwcGxpY2F0aW9uQ2xhc3MoSmF4UnNBcHBsaWNhdGlvbkF1dG9kZXRlY3RlZC5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfcmVxdWVzdF93cmFwcGVyL1dlYlhtbENvbmZpZ3VyZWRBcHBSZXF1ZXN0UmVzcG9uc2VUeXBlSVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXJlcXVlc3Qtd3JhcHBlci1iaW5kaW5nL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldF9yZXF1ZXN0X3dyYXBwZXIvV2ViWG1sQ29uZmlndXJlZEFwcFJlcXVlc3RSZXNwb25zZVR5cGVJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmE4NWFkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC1yZXF1ZXN0LXdyYXBwZXItYmluZGluZy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXRfcmVxdWVzdF93cmFwcGVyL1dlYlhtbENvbmZpZ3VyZWRBcHBSZXF1ZXN0UmVzcG9uc2VUeXBlSVRDYXNlLmphdmEKQEAgLTAsMCArMSw0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0X3JlcXVlc3Rfd3JhcHBlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldF9yZXF1ZXN0X3dyYXBwZXJfYmluZGluZy5SZXF1ZXN0UmVzcG9uc2VJbmplY3RlZFJlc291cmNlOworCisvKioKKyAqIFRlc3QgZm9yIHRoZSB3ZWIueG1sIGNvbmZpZ3VyZWQgSkFYLVJTIGFwcC4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgV2ViWG1sQ29uZmlndXJlZEFwcFJlcXVlc3RSZXNwb25zZVR5cGVJVENhc2UgZXh0ZW5kcyBBYnN0cmFjdFJlcXVlc3RSZXNwb25zZVR5cGVUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0QXBwQmFzZVBhdGgoKSB7CisgICAgICAgIHJldHVybiAid2VieG1sY29uZmlndXJlZCI7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhSZXF1ZXN0UmVzcG9uc2VJbmplY3RlZFJlc291cmNlLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3BvbS54bWwgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE1ODUyZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvcG9tLnhtbApAQCAtMCwwICsxLDcxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+c2VydmxldC10ZXN0czwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1pbnRlZ3JhdGlvbi1zZXJ2bGV0LXRlc3RzPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPlNldCBvZiBzbWFsbGVyIHVucmVsYXRlZCBzZXJ2bGV0LXNwZWNpZmljIHRlc3RzLjwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7c2VydmxldDIudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0dGVzdHMvQ2FjaGVDb250cm9sT240MDRSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXR0ZXN0cy9DYWNoZUNvbnRyb2xPbjQwNFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZjYTQ2NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0dGVzdHMvQ2FjaGVDb250cm9sT240MDRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldHRlc3RzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5DYWNoZUNvbnRyb2w7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworLyoqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworQFBhdGgoIjQwNCIpCitwdWJsaWMgY2xhc3MgQ2FjaGVDb250cm9sT240MDRSZXNvdXJjZSB7CisgICAgQEdFVAorICAgIHB1YmxpYyBSZXNwb25zZSBnZXQ0MDQoKSB7CisgICAgICAgIENhY2hlQ29udHJvbCBjYyA9IG5ldyBDYWNoZUNvbnRyb2woKTsKKyAgICAgICAgY2Muc2V0TWF4QWdlKDEwKTsKKyAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnN0YXR1cyhSZXNwb25zZS5TdGF0dXMuTk9UX0ZPVU5EKS5jYWNoZUNvbnRyb2woY2MpLnR5cGUoInRleHQvcGxhaW4iKS5lbnRpdHkoIjQwNCBOb3QgRm91bmQiKS5idWlsZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0dGVzdHMvQ3VzdG9tTWVkaWFUeXBlQW5kNDA0UmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0dGVzdHMvQ3VzdG9tTWVkaWFUeXBlQW5kNDA0UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGQyOTUyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXR0ZXN0cy9DdXN0b21NZWRpYVR5cGVBbmQ0MDRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldHRlc3RzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworLyoqCisgKgorICogQGF1dGhvciBNaXJvc2xhdiBGdWtzYQorICovCitAUGF0aCgicmVzb3VyY2U0MDQiKQorcHVibGljIGNsYXNzIEN1c3RvbU1lZGlhVHlwZUFuZDQwNFJlc291cmNlIHsKKyAgICBAUGF0aCgiY29udGVudC10eXBlLWVudGl0eSIpCisgICAgQEdFVAorICAgIHB1YmxpYyBSZXNwb25zZSBnZXRTcGVjaWFsQ29udGVudFR5cGUoKSB7CisgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoUmVzcG9uc2UuU3RhdHVzLk5PVF9GT1VORCkudHlwZSgiYXBwbGljYXRpb24vc29tZXRoaW5nIikuZW50aXR5KCJub3QgZm91bmQgY3VzdG9tIGVudGl0eSIpLmJ1aWxkKCk7CisgICAgfQorCisgICAgQFBhdGgoImNvbnRlbnQtdHlwZS1lbXB0eS1lbnRpdHkiKQorICAgIEBHRVQKKyAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0U3BlY2lhbENvbnRlbnRUeXBlV2l0aEVtcHR5RW50aXR5U3RyaW5nKCkgeworICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKFJlc3BvbnNlLlN0YXR1cy5OT1RfRk9VTkQpLnR5cGUoImFwcGxpY2F0aW9uL3NvbWV0aGluZyIpLmVudGl0eSgiIikuYnVpbGQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldHRlc3RzL0ZpbHRlckNvbnRleHRQYXRoUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0dGVzdHMvRmlsdGVyQ29udGV4dFBhdGhSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExYjVjMmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldHRlc3RzL0ZpbHRlckNvbnRleHRQYXRoUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXR0ZXN0czsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworCisvKioKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitAUGF0aCgiY29udGV4dFBhdGhSZXNvdXJjZSIpCitwdWJsaWMgY2xhc3MgRmlsdGVyQ29udGV4dFBhdGhSZXNvdXJjZSB7CisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICByZXR1cm4gImNvbnRleHRQYXRoUmVzb3VyY2UiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0dGVzdHMvRmlsdGVyRm9yd2FyZE9uNDA0UmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0dGVzdHMvRmlsdGVyRm9yd2FyZE9uNDA0UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTZiMDA3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXR0ZXN0cy9GaWx0ZXJGb3J3YXJkT240MDRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldHRlc3RzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CisKKy8qKgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK0BQYXRoKCJmb3J3YXJkaW5nRmlsdGVyL3Jlc291cmNlIikKK3B1YmxpYyBjbGFzcyBGaWx0ZXJGb3J3YXJkT240MDRSZXNvdXJjZSB7CisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICByZXR1cm4gImZvcndhcmRpbmdGaWx0ZXIvcmVzb3VyY2UiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0dGVzdHMvRmlsdGVyTm9Db250ZXh0UGF0aFJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldHRlc3RzL0ZpbHRlck5vQ29udGV4dFBhdGhSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczOWEyZDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldHRlc3RzL0ZpbHRlck5vQ29udGV4dFBhdGhSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldHRlc3RzOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CisKKy8qKgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK0BQYXRoKCJmaWx0ZXIvcmVzb3VyY2UiKQorcHVibGljIGNsYXNzIEZpbHRlck5vQ29udGV4dFBhdGhSZXNvdXJjZSB7CisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICByZXR1cm4gImZpbHRlci9yZXNvdXJjZSI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXR0ZXN0cy9GaWx0ZXJTdGF0aWNDb250ZW50UmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0dGVzdHMvRmlsdGVyU3RhdGljQ29udGVudFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU2YWI0MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0dGVzdHMvRmlsdGVyU3RhdGljQ29udGVudFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0dGVzdHM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworLyoqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworQFBhdGgoInN0YXRpY0NvbnRlbnRGaWx0ZXIvcmVzb3VyY2UiKQorcHVibGljIGNsYXNzIEZpbHRlclN0YXRpY0NvbnRlbnRSZXNvdXJjZSB7CisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICByZXR1cm4gInN0YXRpY0NvbnRlbnRGaWx0ZXIvcmVzb3VyY2UiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0dGVzdHMvRm9ybUNvbnN1bXB0aW9uRmlsdGVyLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldHRlc3RzL0Zvcm1Db25zdW1wdGlvbkZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYTBkM2EKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldHRlc3RzL0Zvcm1Db25zdW1wdGlvbkZpbHRlci5qYXZhCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldHRlc3RzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyOworaW1wb3J0IGphdmF4LnNlcnZsZXQuRmlsdGVyQ2hhaW47CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXJDb25maWc7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0RXhjZXB0aW9uOworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldFJlcXVlc3Q7CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVzcG9uc2U7CisKKy8qKgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK3B1YmxpYyBjbGFzcyBGb3JtQ29uc3VtcHRpb25GaWx0ZXIgaW1wbGVtZW50cyBGaWx0ZXIgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgaW5pdChGaWx0ZXJDb25maWcgZmlsdGVyQ29uZmlnKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZG9GaWx0ZXIoU2VydmxldFJlcXVlc3Qgc2VydmxldFJlcXVlc3QsIFNlcnZsZXRSZXNwb25zZSBzZXJ2bGV0UmVzcG9uc2UsIEZpbHRlckNoYWluIGZpbHRlckNoYWluKQorICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uLCBTZXJ2bGV0RXhjZXB0aW9uIHsKKyAgICAgICAgLy8gY29uc3VtZSBlbnRpdHkKKyAgICAgICAgc2VydmxldFJlcXVlc3QuZ2V0UGFyYW1ldGVyKCJ0ZXh0Iik7CisgICAgICAgIGZpbHRlckNoYWluLmRvRmlsdGVyKHNlcnZsZXRSZXF1ZXN0LCBzZXJ2bGV0UmVzcG9uc2UpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXR0ZXN0cy9Gb3JtQ29uc3VtcHRpb25SZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXR0ZXN0cy9Gb3JtQ29uc3VtcHRpb25SZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwOTEwZmQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldHRlc3RzL0Zvcm1Db25zdW1wdGlvblJlc291cmNlLmphdmEKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0dGVzdHM7CisKK2ltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247CitpbXBvcnQgamF2YS5uZXQuVVJMRGVjb2RlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkVuY29kZWQ7CitpbXBvcnQgamF2YXgud3MucnMuRm9ybVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUFVUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKKy8qKgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK0BQYXRoKCJmb3JtLWNvbnN1bXB0aW9uIikKK3B1YmxpYyBjbGFzcyBGb3JtQ29uc3VtcHRpb25SZXNvdXJjZSB7CisgICAgQFBPU1QKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9GT1JNX1VSTEVOQ09ERUQpCisgICAgcHVibGljIFN0cmluZyBwb3N0SXQoQEZvcm1QYXJhbSgidGV4dCIpIFN0cmluZyB0ZXh0KSB7CisgICAgICAgIHJldHVybiB0ZXh0OworICAgIH0KKworCisgICAgQFBPU1QKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9GT1JNX1VSTEVOQ09ERUQpCisgICAgQFBhdGgoImVuY29kaW5nIikKKyAgICBwdWJsaWMgU3RyaW5nIHBvc3RFbmNvZGluZyhARW5jb2RlZCBARm9ybVBhcmFtKCJ0ZXh0IikgU3RyaW5nIHRleHQpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIFVSTERlY29kZXIuZGVjb2RlKHRleHQsICJVVEYtOCIpOworICAgIH0KKworICAgIEBQVVQKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9GT1JNX1VSTEVOQ09ERUQpCisgICAgcHVibGljIFN0cmluZyBwdXRJdChARm9ybVBhcmFtKCJ0ZXh0IikgU3RyaW5nIHRleHQpIHsKKyAgICAgICAgcmV0dXJuIHRleHQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC10ZXN0cy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXR0ZXN0cy9TZWN1cmVkUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0dGVzdHMvU2VjdXJlZFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjEzNzY3NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0dGVzdHMvU2VjdXJlZFJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0dGVzdHM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uc2VjdXJpdHkuUm9sZXNBbGxvd2VkOworCisvKioKKyAqIEBhdXRob3IgUGV0ciBCb3VkYQorICovCitAUGF0aCgiYWRtaW4iKQorcHVibGljIGNsYXNzIFNlY3VyZWRSZXNvdXJjZSB7CisKKyAgICBAR0VUCisgICAgQFJvbGVzQWxsb3dlZCgiYWRtaW4iKQorICAgIHB1YmxpYyBTdHJpbmcgc2VjdXJlZCgpIHsKKyAgICAgICAgcmV0dXJuICJTZWN1cmVkIjsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0dGVzdHMvU3VwcHJlc3NDb250ZW50TGVuZ3RoRmlsdGVyLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldHRlc3RzL1N1cHByZXNzQ29udGVudExlbmd0aEZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiYjJhYzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldHRlc3RzL1N1cHByZXNzQ29udGVudExlbmd0aEZpbHRlci5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0dGVzdHM7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXI7CitpbXBvcnQgamF2YXguc2VydmxldC5GaWx0ZXJDaGFpbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LkZpbHRlckNvbmZpZzsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRFeGNlcHRpb247CitpbXBvcnQgamF2YXguc2VydmxldC5TZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0LlNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZVdyYXBwZXI7CisKKy8qKgorICogSkVSU0VZLTI5MzYgcmVwcm9kdWNlciBmaWx0ZXIuCisgKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFN1cHByZXNzQ29udGVudExlbmd0aEZpbHRlciBpbXBsZW1lbnRzIEZpbHRlciB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBQQVJBTUVURVJfTkFNRV9TVVBQUkVTU19DT05URU5UX0xFTkdUSCA9ICJTdXBwcmVzc0NvbnRlbnRMZW5ndGgiOworCisgICAgcHVibGljIHZvaWQgZG9GaWx0ZXIoZmluYWwgU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlLCBmaW5hbCBGaWx0ZXJDaGFpbiBjaGFpbikKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU2VydmxldEV4Y2VwdGlvbiB7CisgICAgICAgIGlmIChCb29sZWFuLnBhcnNlQm9vbGVhbihyZXF1ZXN0LmdldFBhcmFtZXRlcihQQVJBTUVURVJfTkFNRV9TVVBQUkVTU19DT05URU5UX0xFTkdUSCkpKSB7CisgICAgICAgICAgICByZXNwb25zZSA9IG5ldyBIdHRwU2VydmxldFJlc3BvbnNlV3JhcHBlcigoSHR0cFNlcnZsZXRSZXNwb25zZSkgcmVzcG9uc2UpIHsKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBzZXRDb250ZW50TGVuZ3RoKGludCBsZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90IGRlbGVnYXRlIHRvIG9yaWdpbmFsIFNlcnZsZXRSZXNwb25zZSAtPiByZXNwb25zZSBpcyBOT1QgY29tbWl0dGVkCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorICAgICAgICBjaGFpbi5kb0ZpbHRlcihyZXF1ZXN0LCByZXNwb25zZSk7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW5pdChGaWx0ZXJDb25maWcgZmlsdGVyQ29uZmlnKSB7CisgICAgICAgIC8vTk9PUAorICAgIH0KKworICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3koKSB7CisgICAgICAgIC8vTk9PUAorICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC10ZXN0cy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC10ZXN0cy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkOWQ5OWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwxNjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi41IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIj4KKworICAgIDwhLS0gc2VydmxldCBmb3IgZ2VuZXJpYyB1c2UgKGhhcyBhbGwgcmVzb3VyY2VzKSAtLT4KKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT50ZXN0U2VydmxldDwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amVyc2V5LmNvbmZpZy5zZXJ2ZXIucHJvdmlkZXIucGFja2FnZXM8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldHRlc3RzPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmplcnNleS5jb25maWcuc2VydmVyLnByb3ZpZGVyLmNsYXNzbmFtZXM8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmZpbHRlci5Sb2xlc0FsbG93ZWREeW5hbWljRmVhdHVyZTwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+dGVzdFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9zZXJ2bGV0Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorCisgICAgPCEtLSBmaWx0ZXIgdG8gdGVzdCBOT1QgY29tbWl0ZWQgcmVzcG9uc2VzIC0tPgorICAgIDxmaWx0ZXI+CisgICAgICAgIDxmaWx0ZXItbmFtZT5TdXBwcmVzc0NvbnRlbnRMZW5ndGhGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8ZmlsdGVyLWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXR0ZXN0cy5TdXBwcmVzc0NvbnRlbnRMZW5ndGhGaWx0ZXI8L2ZpbHRlci1jbGFzcz4KKyAgICA8L2ZpbHRlcj4KKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT5TdXBwcmVzc0NvbnRlbnRMZW5ndGhGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8IS0tIGZpbHRlciBmb3IgZ2VuZXJpYyB1c2UgKGhhcyBhbGwgcmVzb3VyY2VzKSAtLT4KKyAgICA8ZmlsdGVyPgorICAgICAgICA8ZmlsdGVyLW5hbWU+dGVzdEZpbHRlcjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDxmaWx0ZXItY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9maWx0ZXItY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amVyc2V5LmNvbmZpZy5zZXJ2ZXIucHJvdmlkZXIucGFja2FnZXM8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldHRlc3RzPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgIDwvZmlsdGVyPgorICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPnRlc3RGaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L2ZpbHRlci8qPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPCEtLSBmaWx0ZXIgY29udGV4dCBwYXRoIC0tPgorICAgIDxmaWx0ZXI+CisgICAgICAgIDxmaWx0ZXItbmFtZT50ZXN0RmlsdGVyMjwvZmlsdGVyLW5hbWU+CisgICAgICAgIDxmaWx0ZXItY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9maWx0ZXItY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amVyc2V5LmNvbmZpZy5zZXJ2ZXIucHJvdmlkZXIuY2xhc3NuYW1lczwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0dGVzdHMuRmlsdGVyQ29udGV4dFBhdGhSZXNvdXJjZQorICAgICAgICAgICAgICAgIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXR0ZXN0cy5GaWx0ZXJOb0NvbnRleHRQYXRoUmVzb3VyY2U8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amVyc2V5LmNvbmZpZy5zZXJ2bGV0LmZpbHRlci5jb250ZXh0UGF0aDwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT4vY29udGV4dFBhdGhGaWx0ZXIvPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgIDwvZmlsdGVyPgorICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPnRlc3RGaWx0ZXIyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9jb250ZXh0UGF0aEZpbHRlci8qPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPCEtLSBmb3J3YXJkIG9uIDQwNCAtLT4KKyAgICA8ZmlsdGVyPgorICAgICAgICA8ZmlsdGVyLW5hbWU+dGVzdEZpbHRlcjM8L2ZpbHRlci1uYW1lPgorICAgICAgICA8ZmlsdGVyLWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvZmlsdGVyLWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmplcnNleS5jb25maWcuc2VydmVyLnByb3ZpZGVyLmNsYXNzbmFtZXM8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldHRlc3RzLkZpbHRlckZvcndhcmRPbjQwNFJlc291cmNlPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmplcnNleS5jb25maWcuc2VydmxldC5maWx0ZXIuZm9yd2FyZE9uNDA0PC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgPC9maWx0ZXI+CisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+dGVzdEZpbHRlcjM8L2ZpbHRlci1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L2ZvcndhcmRpbmdGaWx0ZXIvKjwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKworICAgIDwhLS0gc3RhdGljIGNvbnRlbnQgcmVnZXggLS0+CisgICAgPGZpbHRlcj4KKyAgICAgICAgPGZpbHRlci1uYW1lPnRlc3RGaWx0ZXI0PC9maWx0ZXItbmFtZT4KKyAgICAgICAgPGZpbHRlci1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L2ZpbHRlci1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qZXJzZXkuY29uZmlnLnNlcnZlci5wcm92aWRlci5jbGFzc25hbWVzPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXR0ZXN0cy5GaWx0ZXJTdGF0aWNDb250ZW50UmVzb3VyY2U8L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amVyc2V5LmNvbmZpZy5zZXJ2bGV0LmZpbHRlci5zdGF0aWNDb250ZW50UmVnZXg8L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+L3N0YXRpY0NvbnRlbnRGaWx0ZXIvLipcLmpzcDwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICA8L2ZpbHRlcj4KKyAgICA8ZmlsdGVyLW1hcHBpbmc+CisgICAgICAgIDxmaWx0ZXItbmFtZT50ZXN0RmlsdGVyNDwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vc3RhdGljQ29udGVudEZpbHRlci8qPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorCisgICAgPCEtLSBmb3JtIGNvbnN1bXB0aW9uIC0tPgorICAgIDxmaWx0ZXI+CisgICAgICAgIDxmaWx0ZXItbmFtZT5Gb3JtQ29uc3VtcHRpb25GaWx0ZXI8L2ZpbHRlci1uYW1lPgorICAgICAgICA8ZmlsdGVyLWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXR0ZXN0cy5Gb3JtQ29uc3VtcHRpb25GaWx0ZXI8L2ZpbHRlci1jbGFzcz4KKyAgICA8L2ZpbHRlcj4KKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5Gb3JtQ29uc3VtcHRpb25TZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qZXJzZXkuY29uZmlnLnNlcnZlci5wcm92aWRlci5jbGFzc25hbWVzPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXR0ZXN0cy5Gb3JtQ29uc3VtcHRpb25SZXNvdXJjZTwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+Rm9ybUNvbnN1bXB0aW9uU2VydmxldDwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+L2Zvcm0tY29uc3VtcHRpb24vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+Rm9ybUNvbnN1bXB0aW9uRmlsdGVyPC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi9mb3JtLWNvbnN1bXB0aW9uLyo8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+CisKKyAgICA8IS0tIDQwNCAtLT4KKyAgICA8ZmlsdGVyPgorICAgICAgICA8ZmlsdGVyLW5hbWU+Y3VzdG9tNDA0PC9maWx0ZXItbmFtZT4KKyAgICAgICAgPGZpbHRlci1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L2ZpbHRlci1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qZXJzZXkuY29uZmlnLnNlcnZlci5wcm92aWRlci5jbGFzc25hbWVzPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXR0ZXN0cy5DdXN0b21NZWRpYVR5cGVBbmQ0MDRSZXNvdXJjZTwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qZXJzZXkuY29uZmlnLnNlcnZsZXQuZmlsdGVyLmNvbnRleHRQYXRoPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPi9jdXN0b200MDQvPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgIDwvZmlsdGVyPgorICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPmN1c3RvbTQwNDwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vY3VzdG9tNDA0Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvZmlsdGVyLW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3NyYy9tYWluL3dlYmFwcC9maWx0ZXIvaW5kZXguanNwIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC10ZXN0cy9zcmMvbWFpbi93ZWJhcHAvZmlsdGVyL2luZGV4LmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDE3ZDk0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC10ZXN0cy9zcmMvbWFpbi93ZWJhcHAvZmlsdGVyL2luZGV4LmpzcApAQCAtMCwwICsxLDI3IEBACis8JS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLSU+CisKKzwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD1VVEYtOCIgbGFuZ3VhZ2U9ImphdmEiICU+Cis8aHRtbD4KKzxoZWFkPgorICAgIDx0aXRsZT48L3RpdGxlPgorPC9oZWFkPgorPGJvZHk+CisKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL21haW4vd2ViYXBwL2ZvcndhcmRpbmdGaWx0ZXIvaW5kZXguanNwIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC10ZXN0cy9zcmMvbWFpbi93ZWJhcHAvZm9yd2FyZGluZ0ZpbHRlci9pbmRleC5qc3AKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAxN2Q5NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL21haW4vd2ViYXBwL2ZvcndhcmRpbmdGaWx0ZXIvaW5kZXguanNwCkBAIC0wLDAgKzEsMjcgQEAKKzwlLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tJT4KKworPCVAIHBhZ2UgY29udGVudFR5cGU9InRleHQvaHRtbDtjaGFyc2V0PVVURi04IiBsYW5ndWFnZT0iamF2YSIgJT4KKzxodG1sPgorPGhlYWQ+CisgICAgPHRpdGxlPjwvdGl0bGU+Cis8L2hlYWQ+Cis8Ym9keT4KKworPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC10ZXN0cy9zcmMvbWFpbi93ZWJhcHAvc3RhdGljQ29udGVudEZpbHRlci9pbmRleC5qc3AgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3NyYy9tYWluL3dlYmFwcC9zdGF0aWNDb250ZW50RmlsdGVyL2luZGV4LmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDE3ZDk0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC10ZXN0cy9zcmMvbWFpbi93ZWJhcHAvc3RhdGljQ29udGVudEZpbHRlci9pbmRleC5qc3AKQEAgLTAsMCArMSwyNyBAQAorPCUtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0lPgorCis8JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9VVRGLTgiIGxhbmd1YWdlPSJqYXZhIiAlPgorPGh0bWw+Cis8aGVhZD4KKyAgICA8dGl0bGU+PC90aXRsZT4KKzwvaGVhZD4KKzxib2R5PgorCis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldHRlc3RzL0NhY2hlQ29udHJvbE9uNDA0SVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldHRlc3RzL0NhY2hlQ29udHJvbE9uNDA0SVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY5N2UzOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0dGVzdHMvQ2FjaGVDb250cm9sT240MDRJVENhc2UuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXR0ZXN0czsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0IGNsYXNzIHJlbGF0ZWQgdG8gaXNzdWUgSkVSU0VZLTExODkuCisgKiBDb25maXJtcyB0aGF0IGlmIG9uZSBzZW5kcyBhbiBlbnRpdHkgd2l0aCB0aGUgZXJyb3Igc3RhdHVzLCB0aGUgY2FjaGUgY29udHJvbAorICogaGVhZGVycyBkb24ndCBnZXQgcmVzZXQgYnkgdGhlIGNvbnRhaW5lci4KKyAqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBDYWNoZUNvbnRyb2xPbjQwNElUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZyhDYWNoZUNvbnRyb2xPbjQwNFJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdDQwNCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0ZXN0NDA0SW1wbChmYWxzZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0NDA0U3VwcHJlc3NDb250ZW50TGVuZ3RoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHRlc3Q0MDRJbXBsKHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0NDA0SW1wbChmaW5hbCBib29sZWFuIHN1cHByZXNzQ29udGVudExlbmd0aCkgeworICAgICAgICBSZXNwb25zZSByID0gdGFyZ2V0KCJzZXJ2bGV0IikucGF0aCgiNDA0IikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbShTdXBwcmVzc0NvbnRlbnRMZW5ndGhGaWx0ZXIuUEFSQU1FVEVSX05BTUVfU1VQUFJFU1NfQ09OVEVOVF9MRU5HVEgsIHN1cHByZXNzQ29udGVudExlbmd0aCkKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDA0LCByLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCI0MDQgTm90IEZvdW5kIiwgci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgICAgICBmaW5hbCBTdHJpbmdbXSB2YWx1ZXMgPSByLmdldEhlYWRlclN0cmluZyhIdHRwSGVhZGVycy5DQUNIRV9DT05UUk9MKS5zcGxpdCgiLCIpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgdmFsdWVzLmxlbmd0aCk7CisgICAgICAgIGFzc2VydEVxdWFscygibm8tdHJhbnNmb3JtIiwgdmFsdWVzWzBdLnRyaW0oKSk7CisgICAgICAgIGFzc2VydEVxdWFscygibWF4LWFnZT0xMCIsIHZhbHVlc1sxXS50cmltKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXR0ZXN0cy9DdXN0b200MDRNZWRpYVR5cGVJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0dGVzdHMvQ3VzdG9tNDA0TWVkaWFUeXBlSVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE5ZDViYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0dGVzdHMvQ3VzdG9tNDA0TWVkaWFUeXBlSVRDYXNlLmphdmEKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0dGVzdHM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBAYXV0aG9yIE1pcm9zbGF2IEZ1a3NhCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgQ3VzdG9tNDA0TWVkaWFUeXBlSVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICAvLyBkdW1teSByZXNvdXJjZSBjb25maWcKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tNDA0KCkgeworICAgICAgICB0ZXN0Q3VzdG9tNDA0SW1wbChmYWxzZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tNDA0V2l0aEVtdHB5RW50aXR5U3RyaW5nKCkgeworICAgICAgICB0ZXN0Q3VzdG9tNDA0V2l0aEVtdHB5RW50aXR5U3RyaW5nSW1wbChmYWxzZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tNDA0U3VwcHJlc3NDb250ZW50TGVuZ3RoKCkgeworICAgICAgICB0ZXN0Q3VzdG9tNDA0SW1wbCh0cnVlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RDdXN0b200MDRXaXRoRW10cHlFbnRpdHlTdHJpbmdTdXBwcmVzc0NvbnRlbnRMZW5ndGgoKSB7CisgICAgICAgIHRlc3RDdXN0b200MDRXaXRoRW10cHlFbnRpdHlTdHJpbmdJbXBsKHRydWUpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0Q3VzdG9tNDA0SW1wbChmaW5hbCBib29sZWFuIHN1cHByZXNzQ29udGVudExlbmd0aCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoImN1c3RvbTQwNC9yZXNvdXJjZTQwNC9jb250ZW50LXR5cGUtZW50aXR5IikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbShTdXBwcmVzc0NvbnRlbnRMZW5ndGhGaWx0ZXIuUEFSQU1FVEVSX05BTUVfU1VQUFJFU1NfQ09OVEVOVF9MRU5HVEgsIHN1cHByZXNzQ29udGVudExlbmd0aCkKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgLmdldCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQwNCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJhcHBsaWNhdGlvbi9zb21ldGhpbmciLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKS50b1N0cmluZygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygibm90IGZvdW5kIGN1c3RvbSBlbnRpdHkiLCByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0Q3VzdG9tNDA0V2l0aEVtdHB5RW50aXR5U3RyaW5nSW1wbChmaW5hbCBib29sZWFuIHN1cHByZXNzQ29udGVudExlbmd0aCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoImN1c3RvbTQwNC9yZXNvdXJjZTQwNC9jb250ZW50LXR5cGUtZW1wdHktZW50aXR5IikKKyAgICAgICAgICAgICAgICAucXVlcnlQYXJhbShTdXBwcmVzc0NvbnRlbnRMZW5ndGhGaWx0ZXIuUEFSQU1FVEVSX05BTUVfU1VQUFJFU1NfQ09OVEVOVF9MRU5HVEgsIHN1cHByZXNzQ29udGVudExlbmd0aCkKKyAgICAgICAgICAgICAgICAucmVxdWVzdCgpLmdldCgpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQwNCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJhcHBsaWNhdGlvbi9zb21ldGhpbmciLCByZXNwb25zZS5nZXRNZWRpYVR5cGUoKS50b1N0cmluZygpKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0dGVzdHMvRHVwbGljYXRlSGVhZGVySVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldHRlc3RzL0R1cGxpY2F0ZUhlYWRlcklUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NTZlY2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldHRlc3RzL0R1cGxpY2F0ZUhlYWRlcklUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldHRlc3RzOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuSHR0cEhlYWRlcnM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgRHVwbGljYXRlSGVhZGVySVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgLy8gZHVtbXkgcmVzb3VyY2UgY29uZmlnCisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdER1cGxpY2F0ZUhlYWRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRlc3REdXBsaWNhdGVIZWFkZXJJbXBsKCJjb250ZXh0UGF0aEZpbHRlci9jb250ZXh0UGF0aFJlc291cmNlIik7CisgICAgICAgIHRlc3REdXBsaWNhdGVIZWFkZXJJbXBsKCJzZXJ2bGV0L2NvbnRleHRQYXRoUmVzb3VyY2UiKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgdGVzdER1cGxpY2F0ZUhlYWRlckltcGwoZmluYWwgU3RyaW5nIHBhdGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRlc3REdXBsaWNhdGVIZWFkZXJJbXBsKDAsIEh0dHBVUkxDb25uZWN0aW9uLkhUVFBfT0ssIHBhdGgpOworICAgICAgICB0ZXN0RHVwbGljYXRlSGVhZGVySW1wbCgxLCBIdHRwVVJMQ29ubmVjdGlvbi5IVFRQX09LLCBwYXRoKTsKKyAgICAgICAgdGVzdER1cGxpY2F0ZUhlYWRlckltcGwoMiwgSHR0cFVSTENvbm5lY3Rpb24uSFRUUF9CQURfUkVRVUVTVCwgcGF0aCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHRlc3REdXBsaWNhdGVIZWFkZXJJbXBsKGZpbmFsIGludCBoZWFkZXJDb3VudCwgaW50IGV4cGVjdGVkUmVzcG9uc2VDb2RlLCBmaW5hbCBTdHJpbmcgcGF0aCkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyBoZWFkZXJOYW1lID0gSHR0cEhlYWRlcnMuQ09OVEVOVF9UWVBFOworICAgICAgICBVUkwgZ2V0VXJsID0gVXJpQnVpbGRlci5mcm9tVXJpKGdldEJhc2VVcmkoKSkucGF0aChwYXRoKS5idWlsZCgpLnRvVVJMKCk7CisgICAgICAgIEh0dHBVUkxDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSAoSHR0cFVSTENvbm5lY3Rpb24pIGdldFVybC5vcGVuQ29ubmVjdGlvbigpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgY29ubmVjdGlvbi5zZXRSZXF1ZXN0TWV0aG9kKCJHRVQiKTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGVhZGVyQ291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uYWRkUmVxdWVzdFByb3BlcnR5KGhlYWRlck5hbWUsICJOL0EiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbm5lY3Rpb24uY29ubmVjdCgpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHBhdGggKyAiIFsiICsgaGVhZGVyTmFtZSArICI6IiArIGhlYWRlckNvdW50ICsgInhdIiwgZXhwZWN0ZWRSZXNwb25zZUNvZGUsIGNvbm5lY3Rpb24uZ2V0UmVzcG9uc2VDb2RlKCkpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgY29ubmVjdGlvbi5kaXNjb25uZWN0KCk7CisgICAgICAgIH0KKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0dGVzdHMvRmlsdGVyQ29udGV4dFBhdGhJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0dGVzdHMvRmlsdGVyQ29udGV4dFBhdGhJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGU5OWQzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXR0ZXN0cy9GaWx0ZXJDb250ZXh0UGF0aElUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc2VydmxldHRlc3RzOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIE1hcnRpbiBNYXR1bGEKKyAqLworcHVibGljIGNsYXNzIEZpbHRlckNvbnRleHRQYXRoSVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgLy8gZHVtbXkgcmVzb3VyY2UgY29uZmlnCisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdENvbnRleHRQYXRoUmVzb3VyY2UoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiY29udGV4dFBhdGhSZXNvdXJjZSIsIHRhcmdldCgiY29udGV4dFBhdGhGaWx0ZXIvY29udGV4dFBhdGhSZXNvdXJjZSIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9Db250ZXh0UGF0aFJlc291cmNlKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoImZpbHRlci9yZXNvdXJjZSIsIHRhcmdldCgiZmlsdGVyL3Jlc291cmNlIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RPdGhlclJlc291cmNlVW5yZWFjaGFibGUoKSB7CisgICAgICAgIFJlc3BvbnNlIHIgPSB0YXJnZXQoImZpbHRlci9jb250ZXh0UGF0aFJlc291cmNlIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDA0LCByLmdldFN0YXR1cygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldHRlc3RzL0Zvcm1Db25zdW1wdGlvbklUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXR0ZXN0cy9Gb3JtQ29uc3VtcHRpb25JVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjdhNWY5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXR0ZXN0cy9Gb3JtQ29uc3VtcHRpb25JVENhc2UuamF2YQpAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXR0ZXN0czsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZvcm07CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitwdWJsaWMgY2xhc3MgRm9ybUNvbnN1bXB0aW9uSVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgLy8gZHVtbXkgcmVzb3VyY2UgY29uZmlnCisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFB1dCgpIHsKKyAgICAgICAgRm9ybSBmb3JtID0gbmV3IEZvcm0oKTsKKyAgICAgICAgZm9ybS5wYXJhbSgidGV4dCIsICJ0aGlzIGlzIGEgdGVzdCIpOworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gdGFyZ2V0KCJmb3JtLWNvbnN1bXB0aW9uL2Zvcm0tY29uc3VtcHRpb24iKS5yZXF1ZXN0KCkucHV0KEVudGl0eS5mb3JtKGZvcm0pLCBTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoZm9ybS5hc01hcCgpLmdldEZpcnN0KCJ0ZXh0IiksIHJlc3VsdCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdCgpIHsKKyAgICAgICAgRm9ybSBmb3JtID0gbmV3IEZvcm0oKTsKKyAgICAgICAgZm9ybS5wYXJhbSgidGV4dCIsICJ0aGlzIGlzIGEgdGVzdCIpOworICAgICAgICBTdHJpbmcgcmVzdWx0ID0gdGFyZ2V0KCJmb3JtLWNvbnN1bXB0aW9uL2Zvcm0tY29uc3VtcHRpb24iKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuZm9ybShmb3JtKSwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZvcm0uYXNNYXAoKS5nZXRGaXJzdCgidGV4dCIpLCByZXN1bHQpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc3RXaXRoRW5jb2RpbmcoKSB7CisgICAgICAgIEZvcm0gZm9ybSA9IG5ldyBGb3JtKCk7CisgICAgICAgIGZvcm0ucGFyYW0oInRleHQiLCAidGhpcyBpcyBhbiBlbmNvZGluZyB0ZXN0ICstKi89Iik7CisgICAgICAgIFN0cmluZyByZXN1bHQgPSB0YXJnZXQoImZvcm0tY29uc3VtcHRpb24vZm9ybS1jb25zdW1wdGlvbi9lbmNvZGluZyIpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS5mb3JtKGZvcm0pLCBTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoZm9ybS5hc01hcCgpLmdldEZpcnN0KCJ0ZXh0IiksIHJlc3VsdCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXR0ZXN0cy9Gb3J3YXJkT240MDRJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0dGVzdHMvRm9yd2FyZE9uNDA0SVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJjOTllOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0dGVzdHMvRm9yd2FyZE9uNDA0SVRDYXNlLmphdmEKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0dGVzdHM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIEBhdXRob3IgTWFydGluIE1hdHVsYQorICovCitwdWJsaWMgY2xhc3MgRm9yd2FyZE9uNDA0SVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgLy8gZHVtbXkgcmVzb3VyY2UgY29uZmlnCisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlUmVhY2hhYmxlKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoImZvcndhcmRpbmdGaWx0ZXIvcmVzb3VyY2UiLCB0YXJnZXQoImZvcndhcmRpbmdGaWx0ZXIvcmVzb3VyY2UiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcykpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEluZGV4UmVhY2hhYmxlKCkgeworICAgICAgICBSZXNwb25zZSByID0gdGFyZ2V0KCJmb3J3YXJkaW5nRmlsdGVyL2luZGV4LmpzcCIpLnJlcXVlc3QoKS5nZXQoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwMCwgci5nZXRTdGF0dXMoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXR0ZXN0cy9JbnZhbGlkUmVxdWVzdFVyaUlUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXR0ZXN0cy9JbnZhbGlkUmVxdWVzdFVyaUlUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiNjdlOTUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldHRlc3RzL0ludmFsaWRSZXF1ZXN0VXJpSVRDYXNlLmphdmEKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0dGVzdHM7CisKK2ltcG9ydCBqYXZhLm5ldC5IdHRwVVJMQ29ubmVjdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkw7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3QgY2xhc3MgcmVsYXRlZCB0byBpc3N1ZSBKRVJTRVktMjY4MC4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEludmFsaWRSZXF1ZXN0VXJpSVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkUmVxdWVzdFVyaUZpbHRlcigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBpbnZhbGlkUmVxdWVzdFVyaSgiZmlsdGVyIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFJlcXVlc3RVcmlTZXJ2bGV0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGludmFsaWRSZXF1ZXN0VXJpKCJzZXJ2bGV0Iik7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgaW52YWxpZFJlcXVlc3RVcmkoZmluYWwgU3RyaW5nIHBhdGgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBVUkwgdXJsID0gbmV3IFVSTChnZXRCYXNlVXJpKCkudG9TdHJpbmcoKSArIHBhdGggKyAiL3Jlc291cmNleyIpOworICAgICAgICBmaW5hbCBIdHRwVVJMQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gKEh0dHBVUkxDb25uZWN0aW9uKSB1cmwub3BlbkNvbm5lY3Rpb24oKTsKKworICAgICAgICBjb25uZWN0aW9uLnNldFJlcXVlc3RNZXRob2QoIkdFVCIpOworICAgICAgICBjb25uZWN0aW9uLnNldFJlcXVlc3RQcm9wZXJ0eSgiQWNjZXB0IiwgInRleHQvcGxhaW4iKTsKKyAgICAgICAgY29ubmVjdGlvbi5jb25uZWN0KCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDQwMCwgY29ubmVjdGlvbi5nZXRSZXNwb25zZUNvZGUoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXR0ZXN0cy9Sb2xlc0FsbG93ZWRGaWx0ZXJJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0dGVzdHMvUm9sZXNBbGxvd2VkRmlsdGVySVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIyZjBjOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXQtdGVzdHMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0dGVzdHMvUm9sZXNBbGxvd2VkRmlsdGVySVRDYXNlLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi5zZXJ2bGV0dGVzdHM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBAYXV0aG9yIFBldHIgQm91ZGEKKyAqLworcHVibGljIGNsYXNzIFJvbGVzQWxsb3dlZEZpbHRlcklUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgLy8gRHVtbXkgcmVzb3VyY2UgY29uZmlnCisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdDQwMygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBSZXNwb25zZSByID0gdGFyZ2V0KCJzZXJ2bGV0L2FkbWluIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDAzLCByLmdldFN0YXR1cygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zZXJ2bGV0LXRlc3RzL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldHRlc3RzL1N0YXRpY0NvbnRlbnRSZWdleElUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXR0ZXN0cy9TdGF0aWNDb250ZW50UmVnZXhJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDY0N2UyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc2VydmxldC10ZXN0cy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NlcnZsZXR0ZXN0cy9TdGF0aWNDb250ZW50UmVnZXhJVENhc2UuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnNlcnZsZXR0ZXN0czsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQGF1dGhvciBNYXJ0aW4gTWF0dWxhCisgKi8KK3B1YmxpYyBjbGFzcyBTdGF0aWNDb250ZW50UmVnZXhJVENhc2UgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICAvLyBkdW1teSByZXNvdXJjZSBjb25maWcKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZUNvbmZpZygpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW5kZXhVbnJlYWNoYWJsZSgpIHsKKyAgICAgICAgUmVzcG9uc2UgciA9IHRhcmdldCgiZmlsdGVyIikucGF0aCgiaW5kZXguanNwIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDA0LCByLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbmRleFJlYWNoYWJsZSgpIHsKKyAgICAgICAgUmVzcG9uc2UgciA9IHRhcmdldCgic3RhdGljQ29udGVudEZpbHRlci9pbmRleC5qc3AiKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHIuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlUmVhY2hhYmxlKCkgeworICAgICAgICBSZXNwb25zZSByID0gdGFyZ2V0KCJzdGF0aWNDb250ZW50RmlsdGVyL3Jlc291cmNlIikucmVxdWVzdCgpLmdldCgpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjAwLCByLmdldFN0YXR1cygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJzdGF0aWNDb250ZW50RmlsdGVyL3Jlc291cmNlIiwgci5yZWFkRW50aXR5KFN0cmluZy5jbGFzcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NvbmFyLXRlc3QvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NvbmFyLXRlc3QvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODk3YmU4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc29uYXItdGVzdC9wb20ueG1sCkBAIC0wLDAgKzEsNjcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5zb25hci10ZXN0PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLXNvbmFyLXRlc3Q8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIFRoZSBwdXJwb3NlIG9mIHRoaXMgbW9kdWxlIGlzIHRvIHByb3ZpZGUgYW4gYWJpbGl0eSB0byBjaGVjayB3aGV0aGVyIFNvbmFyJ3MgY29kZSBjb3ZlcmFnZSBpbmNsdWRlcworICAgICAgICBsaW5lcyBvZiBjb2RlIGV4ZWN1dGVkIGZyb20gYW4gZXh0ZXJuYWxseSBleGVjdXRlZCBKVk0sIEpldHR5IHdlYiBzZXJ2ZXIgaW4gdGhpcyBjYXNlLgorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NvbmFyLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zb25hci9UZXN0QXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NvbmFyLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zb25hci9UZXN0QXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWI2N2U3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc29uYXItdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NvbmFyL1Rlc3RBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc29uYXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5BcHBsaWNhdGlvblBhdGg7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKKy8qKgorICogSmVyc2V5IGFwcGxpY2F0aW9uIGZvciBjb2RlIGNvdmVyYWdlIHRlc3RpbmcuCisgKgorICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYSBhdCBvcmFjbGUuY29tKQorICovCitAQXBwbGljYXRpb25QYXRoKCIvIikKK3B1YmxpYyBjbGFzcyBUZXN0QXBwbGljYXRpb24gZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisKKyAgICBwdWJsaWMgVGVzdEFwcGxpY2F0aW9uKCkgeworICAgICAgICByZWdpc3RlcihUZXN0UmVzb3VyY2UuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NvbmFyLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zb25hci9UZXN0UmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NvbmFyLXRlc3Qvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zb25hci9UZXN0UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGJmYWFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc29uYXItdGVzdC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NvbmFyL1Rlc3RSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc29uYXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnNvbmFyLlNvbmFySmVyc2V5Q29tbW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5zb25hci5Tb25hckplcnNleVNlcnZlcjsKKworLyoqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCIvIikKK0BQcm9kdWNlcygidGV4dC9wbGFpbiIpCitwdWJsaWMgY2xhc3MgVGVzdFJlc291cmNlIHsKKworICAgIEBHRVQKKyAgICBAUGF0aCgidGVzdCIpCisgICAgcHVibGljIFN0cmluZyBoZWxsb1NlcnZlcigpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBTb25hckplcnNleUNvbW1vbigpLmludGVncmF0aW9uU2VydmVySnZtKCkgKyAiICIgKyBuZXcgU29uYXJKZXJzZXlTZXJ2ZXIoKS5pbnRlZ3JhdGlvblNlcnZlckp2bSgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc29uYXItdGVzdC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc29uYXItdGVzdC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNjAxNGEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zb25hci10ZXN0L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIyLjUiIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzJfNS54c2QiPgorICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPmplcnNleTwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc29uYXIuVGVzdEFwcGxpY2F0aW9uPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5qZXJzZXk8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NvbmFyLXRlc3Qvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zb25hci9KZXJzZXlTb25hcklUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc29uYXItdGVzdC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3NvbmFyL0plcnNleVNvbmFySVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM5ZjA3OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NvbmFyLXRlc3Qvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi9zb25hci9KZXJzZXlTb25hcklUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24uc29uYXI7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuc29uYXIuU29uYXJKZXJzZXlDb21tb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5zb25hci5Tb25hckplcnNleVNlcnZlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuQXNzZXJ0OworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEplcnNleVNvbmFySVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RJbnRlZ3JhdGlvblNlcnZlckp2bSgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIHN0cmluZyA9IHRhcmdldCgidGVzdCIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJjb21tb24gc2VydmVyIGp2bSBzZXJ2ZXIgc2VydmVyIGp2bSIsIHN0cmluZyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0SW50ZWdyYXRpb25UZXN0SnZtKCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgc3RyaW5nID0gbmV3IFNvbmFySmVyc2V5Q29tbW9uKCkuaW50ZWdyYXRpb25UZXN0SnZtKCkgKyAiICIgKyBuZXcgU29uYXJKZXJzZXlTZXJ2ZXIoKS5pbnRlZ3JhdGlvblRlc3RKdm0oKTsKKworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJjb21tb24gdGVzdCBqdm0gc2VydmVyIHRlc3QganZtIiwgc3RyaW5nKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IFJlc291cmNlQ29uZmlnKFRlc3RBcHBsaWNhdGlvbi5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvUkVBRE1FLnR4dCBiL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTEwNWY3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9SRUFETUUudHh0CkBAIC0wLDAgKzEsMzAgQEAKKwordGVzdHMKKz09PT09CisKK1Rlc3RzIGFyZSBsb2NhdGVkIGluIGplcnNleS1zcHJpbmctdGVzdCBtb2R1bGUuCitUaGUgbW9kdWxlIGNvbnRhaW5zIGEgdGVzdCB3ZWJhcHAgYW5kIHRlc3QgY29kZS4KK1RoZSB0ZXN0cyBjYW4gYmUgcnVuIGluIEplcnNleSB0ZXN0IGNvbnRhaW5lciBvciBhbiBleHRlcm5hbCBjb250YWluZXIuCisKKy0gUnVubmluZyB0ZXN0cyBpbiBKZXJzZXkgdGVzdCBjb250YWluZXIKKyAgICBtdm4gY2xlYW4gdGVzdAorCistIFJ1bm5pbmcgdGVzdHMgaW4gYW4gZXh0ZXJuYWwgY29udGFpbmVyCisgIGJ1aWxkIHRoZSB0ZXN0IGFwcAorICBkZXBsb3kgdG8gYW4gZXh0ZXJuYWwgY29udGFpbmVyCisgIGNvbmZpZ3VyZSBjb250YWluZXIgY29ubmVjdGlvbiBpbmZvIGluIGplcnNleS1zcHJpbmctdGVzdC9wb20ueG1sLCBpZiBuZWVkZWQKKyAgcnVuIHRlc3RzIGluIGludGVncmF0aW9uIHRlc3QgbW9kZToKKyAgICBtdm4gLVBpdCB2ZXJpZnkKKworLSBSdW5uaW5nIHRlc3RzIGluIGVtYmVkZGVkIEpldHR5IGluc3RhbmNlCisgIGJ1aWxkIHRoZSB0ZXN0IGFwcAorICBkZXBsb3kgdG8gSmV0dHk6CisgICAgbXZuIC1QamV0dHkgamV0dHk6cnVuCisgIHJ1biB0ZXN0cyBpbiBpbnRlZ3JhdGlvbiB0ZXN0IG1vZGUgaW4gYW5vdGhlciBjb25zb2xlIHNlc3Npb246CisgICAgbXZuIC1QaXQgdmVyaWZ5CisKK3Rlc3QgY2xhc3MgbmFtaW5nIGNvbnZlbnRpb25zCistICpJVFRlc3QuamF2YTogcnVuIGluIHVuaXQgYW5kIElUIHRlc3QgbW9kZQorLSAqVGVzdC5qYXZhOiBydW4gYXMgdW5pdCB0ZXN0cworLSAqSVQuamF2YTogcnVuIGFzIElUIHRlc3RzCisKZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNWU5M2FiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9wb20ueG1sCkBAIC0wLDAgKzEsMTMyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorCisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb248L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjYtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5zcHJpbmc0PC9hcnRpZmFjdElkPgorCisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtaW50ZWdyYXRpb24tc3ByaW5nNDwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgSmVyc2V5IHRlc3RzIGZvciBTcHJpbmcgNCBpbnRlZ3JhdGlvbgorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHtzZXJ2bGV0Mi52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LndzLnJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXgud3MucnMtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktc3ByaW5nNDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcms8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWxvZ2dpbmc8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxvZ2dpbmc8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHdlYkFwcD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxjb250ZXh0UGF0aD4vPC9jb250ZXh0UGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx3ZWJJbmZJbmNsdWRlSmFyUGF0dGVybj4uKlwuamFyJDwvd2ViSW5mSW5jbHVkZUphclBhdHRlcm4+CisgICAgICAgICAgICAgICAgICAgIDwvd2ViQXBwPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+ZGVsYXllZC1zdHJhdGVneS1za2lwLXRlc3Q8L2lkPgorICAgICAgICAgICAgPGFjdGl2YXRpb24+CisgICAgICAgICAgICAgICAgPHByb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICA8bmFtZT5vcmcuZ2xhc3NmaXNoLmplcnNleS5pbmplY3Rpb24ubWFuYWdlci5zdHJhdGVneTwvbmFtZT4KKyAgICAgICAgICAgICAgICAgICAgPHZhbHVlPmRlbGF5ZWQ8L3ZhbHVlPgorICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+CisgICAgICAgICAgICA8L2FjdGl2YXRpb24+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1mYWlsc2FmZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2tpcFRlc3RzPnRydWU8L3NraXBUZXN0cz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy90ZXN0L0FjY291bnRKZXJzZXlSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9BY2NvdW50SmVyc2V5UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGFmN2JiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9BY2NvdW50SmVyc2V5UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDE2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLnRlc3Q7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QVVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuSW5qZWN0OworaW1wb3J0IGphdmF4LmluamVjdC5OYW1lZDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXF1ZXN0OworCitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5iZWFucy5mYWN0b3J5LmFubm90YXRpb24uQXV0b3dpcmVkOworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLlF1YWxpZmllcjsKKworLyoqCisgKiBKZXJzZXkgbWFuYWdlZCBKQVgtUlMgcmVzb3VyY2UgZm9yIHRlc3RpbmcgamVyc2V5LXNwcmluZy4KKyAqCisgKiBAYXV0aG9yIE1hcmtvIEFzcGx1bmQgKG1hcmtvLmFzcGx1bmQgYXQgeWFob28uY29tKQorICovCitAUGF0aCgiL2plcnNleS9hY2NvdW50IikKK3B1YmxpYyBjbGFzcyBBY2NvdW50SmVyc2V5UmVzb3VyY2UgeworCisgICAgQEluamVjdAorICAgIEBOYW1lZCgiQWNjb3VudFNlcnZpY2Utc2luZ2xldG9uIikKKyAgICBwcml2YXRlIEFjY291bnRTZXJ2aWNlIGFjY291bnRTZXJ2aWNlSW5qZWN0OworCisgICAgQEF1dG93aXJlZAorICAgIEBRdWFsaWZpZXIoIkFjY291bnRTZXJ2aWNlLXNpbmdsZXRvbiIpCisgICAgcHJpdmF0ZSBBY2NvdW50U2VydmljZSBhY2NvdW50U2VydmljZUF1dG93aXJlZDsKKworICAgIEBJbmplY3QKKyAgICBATmFtZWQoIkFjY291bnRTZXJ2aWNlLXJlcXVlc3QtMSIpCisgICAgcHJpdmF0ZSBBY2NvdW50U2VydmljZSBhY2NvdW50U2VydmljZVJlcXVlc3QxOworCisgICAgQEF1dG93aXJlZAorICAgIEBRdWFsaWZpZXIoIkFjY291bnRTZXJ2aWNlLXJlcXVlc3QtMSIpCisgICAgcHJpdmF0ZSBBY2NvdW50U2VydmljZSBhY2NvdW50U2VydmljZVJlcXVlc3QyOworCisgICAgQEF1dG93aXJlZAorICAgIEBRdWFsaWZpZXIoIkFjY291bnRTZXJ2aWNlLXByb3RvdHlwZS0xIikKKyAgICBwcml2YXRlIEFjY291bnRTZXJ2aWNlIGFjY291bnRTZXJ2aWNlUHJvdG90eXBlMTsKKworICAgIEBBdXRvd2lyZWQKKyAgICBAUXVhbGlmaWVyKCJBY2NvdW50U2VydmljZS1wcm90b3R5cGUtMSIpCisgICAgcHJpdmF0ZSBBY2NvdW50U2VydmljZSBhY2NvdW50U2VydmljZVByb3RvdHlwZTI7CisKKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBIdHRwU2VydmxldFJlcXVlc3QgaHR0cFNlcnZsZXRSZXF1ZXN0OworCisgICAgQEluamVjdAorICAgIHByaXZhdGUgSEsyU2VydmljZVNpbmdsZXRvbiBoazJTaW5nbGV0b247CisKKyAgICBASW5qZWN0CisgICAgcHJpdmF0ZSBISzJTZXJ2aWNlUmVxdWVzdFNjb3BlZCBoazJSZXF1ZXN0U2NvcGVkOworCisgICAgQEluamVjdAorICAgIHByaXZhdGUgSEsyU2VydmljZVBlckxvb2t1cCBoazJQZXJMb29rdXA7CisKKyAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlID0gIm4vYSI7CisKKyAgICAvLyByZXNvdXJjZSBtZXRob2RzIGZvciB0ZXN0aW5nIHJlc291cmNlIGNsYXNzIHNjb3BlCisgICAgQEdFVAorICAgIEBQYXRoKCJtZXNzYWdlIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlOworICAgIH0KKworICAgIEBQVVQKKyAgICBAUGF0aCgibWVzc2FnZSIpCisgICAgQENvbnN1bWVzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgIHB1YmxpYyBTdHJpbmcgc2V0TWVzc2FnZShmaW5hbCBTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICB9CisKKyAgICAvLyBKRVJTRVktMjUwNiBGSVggVkVSSUZJQ0FUSU9OCisgICAgQEdFVAorICAgIEBQYXRoKCJzZXJ2ZXIiKQorICAgIHB1YmxpYyBTdHJpbmcgdmVyaWZ5U2VydmxldFJlcXVlc3RJbmplY3Rpb24oKSB7CisgICAgICAgIHJldHVybiAiUEFTU0VEOiAiICsgaHR0cFNlcnZsZXRSZXF1ZXN0LmdldFNlcnZlck5hbWUoKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInNpbmdsZXRvbi9zZXJ2ZXIiKQorICAgIHB1YmxpYyBTdHJpbmcgdmVyaWZ5U2VydmxldFJlcXVlc3RJbmplY3Rpb25JbnRvU2luZ2xldG9uKCkgeworICAgICAgICByZXR1cm4gYWNjb3VudFNlcnZpY2VJbmplY3QudmVyaWZ5U2VydmxldFJlcXVlc3RJbmplY3Rpb24oKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInNpbmdsZXRvbi9hdXRvd2lyZWQvc2VydmVyIikKKyAgICBwdWJsaWMgU3RyaW5nIHZlcmlmeVNlcnZsZXRSZXF1ZXN0SW5qZWN0aW9uSW50b0F1dG93aXJlZFNpbmdsZXRvbigpIHsKKyAgICAgICAgcmV0dXJuIGFjY291bnRTZXJ2aWNlQXV0b3dpcmVkLnZlcmlmeVNlcnZsZXRSZXF1ZXN0SW5qZWN0aW9uKCk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJyZXF1ZXN0L3NlcnZlciIpCisgICAgcHVibGljIFN0cmluZyB2ZXJpZnlTZXJ2bGV0UmVxdWVzdEluamVjdGlvbkludG9SZXF1ZXN0U2NvcGVkQmVhbigpIHsKKyAgICAgICAgcmV0dXJuIGFjY291bnRTZXJ2aWNlUmVxdWVzdDEudmVyaWZ5U2VydmxldFJlcXVlc3RJbmplY3Rpb24oKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInByb3RvdHlwZS9zZXJ2ZXIiKQorICAgIHB1YmxpYyBTdHJpbmcgdmVyaWZ5U2VydmxldFJlcXVlc3RJbmplY3Rpb25JbnRvUHJvdG90eXBlU2NvcGVkQmVhbigpIHsKKyAgICAgICAgcmV0dXJuIGFjY291bnRTZXJ2aWNlUHJvdG90eXBlMS52ZXJpZnlTZXJ2bGV0UmVxdWVzdEluamVjdGlvbigpOworICAgIH0KKworICAgIC8vIHJlc291cmNlIG1ldGhvZHMgZm9yIHRlc3Rpbmcgc2luZ2xldG9uIHNjb3BlZCBiZWFucworICAgIEBHRVQKKyAgICBAUGF0aCgic2luZ2xldG9uL2luamVjdC97YWNjb3VudElkfSIpCisgICAgcHVibGljIEJpZ0RlY2ltYWwgZ2V0QWNjb3VudEJhbGFuY2VTaW5nbGV0b25JbmplY3QoQFBhdGhQYXJhbSgiYWNjb3VudElkIikgZmluYWwgU3RyaW5nIGFjY291bnRJZCkgeworICAgICAgICByZXR1cm4gYWNjb3VudFNlcnZpY2VJbmplY3QuZ2V0QWNjb3VudEJhbGFuY2UoYWNjb3VudElkKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInNpbmdsZXRvbi9hdXRvd2lyZWQve2FjY291bnRJZH0iKQorICAgIHB1YmxpYyBCaWdEZWNpbWFsIGdldEFjY291bnRCYWxhbmNlU2luZ2xldG9uQXV0b3dpcmVkKEBQYXRoUGFyYW0oImFjY291bnRJZCIpIGZpbmFsIFN0cmluZyBhY2NvdW50SWQpIHsKKyAgICAgICAgcmV0dXJuIGFjY291bnRTZXJ2aWNlQXV0b3dpcmVkLmdldEFjY291bnRCYWxhbmNlKGFjY291bnRJZCk7CisgICAgfQorCisgICAgQFBVVAorICAgIEBQYXRoKCJzaW5nbGV0b24ve2FjY291bnRJZH0iKQorICAgIEBDb25zdW1lcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICBwdWJsaWMgdm9pZCBzZXRBY2NvdW50QmFsYW5jZVNpbmdsZXRvbihAUGF0aFBhcmFtKCJhY2NvdW50SWQiKSBmaW5hbCBTdHJpbmcgYWNjb3VudElkLCBmaW5hbCBTdHJpbmcgYmFsYW5jZSkgeworICAgICAgICBhY2NvdW50U2VydmljZUluamVjdC5zZXRBY2NvdW50QmFsYW5jZShhY2NvdW50SWQsIG5ldyBCaWdEZWNpbWFsKGJhbGFuY2UpKTsKKyAgICB9CisKKyAgICAvLyByZXNvdXJjZSBtZXRob2RzIGZvciB0ZXN0aW5nIHJlcXVlc3Qgc2NvcGVkIGJlYW5zCisgICAgQFBVVAorICAgIEBQYXRoKCJyZXF1ZXN0L3thY2NvdW50SWR9IikKKyAgICBAQ29uc3VtZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgcHVibGljIEJpZ0RlY2ltYWwgc2V0QWNjb3VudEJhbGFuY2VSZXF1ZXN0KEBQYXRoUGFyYW0oImFjY291bnRJZCIpIGZpbmFsIFN0cmluZyBhY2NvdW50SWQsIGZpbmFsIFN0cmluZyBiYWxhbmNlKSB7CisgICAgICAgIGFjY291bnRTZXJ2aWNlUmVxdWVzdDEuc2V0QWNjb3VudEJhbGFuY2UoYWNjb3VudElkLCBuZXcgQmlnRGVjaW1hbChiYWxhbmNlKSk7CisgICAgICAgIHJldHVybiBhY2NvdW50U2VydmljZVJlcXVlc3QyLmdldEFjY291bnRCYWxhbmNlKGFjY291bnRJZCk7CisgICAgfQorCisgICAgLy8gcmVzb3VyY2UgbWV0aG9kcyBmb3IgdGVzdGluZyBwcm90b3R5cGUgc2NvcGVkIGJlYW5zCisgICAgQFBVVAorICAgIEBQYXRoKCJwcm90b3R5cGUve2FjY291bnRJZH0iKQorICAgIEBDb25zdW1lcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICBwdWJsaWMgQmlnRGVjaW1hbCBzZXRBY2NvdW50QmFsYW5jZVByb3RvdHlwZShAUGF0aFBhcmFtKCJhY2NvdW50SWQiKSBmaW5hbCBTdHJpbmcgYWNjb3VudElkLCBmaW5hbCBTdHJpbmcgYmFsYW5jZSkgeworICAgICAgICBhY2NvdW50U2VydmljZVByb3RvdHlwZTEuc2V0QWNjb3VudEJhbGFuY2UoYWNjb3VudElkLCBuZXcgQmlnRGVjaW1hbChiYWxhbmNlKSk7CisgICAgICAgIHJldHVybiBhY2NvdW50U2VydmljZVByb3RvdHlwZTIuZ2V0QWNjb3VudEJhbGFuY2UoYWNjb3VudElkKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy90ZXN0L0FjY291bnRTZXJ2aWNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy90ZXN0L0FjY291bnRTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUxZTIxNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvQWNjb3VudFNlcnZpY2UuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmcudGVzdDsKKworaW1wb3J0IGphdmEubWF0aC5CaWdEZWNpbWFsOworCisvKioKKyAqIFNpbXBsZSBhY2NvdW50IHNlcnZpY2UgdG8gdGVzdGlmeSBpbmplY3Rpb24gaW50byBkaWZmZXJlbnQgc2NvcGVzLgorICoKKyAqIEBhdXRob3IgTWFya28gQXNwbHVuZCAobWFya28uYXNwbHVuZCBhdCB5YWhvby5jb20pCisgKi8KK3B1YmxpYyBpbnRlcmZhY2UgQWNjb3VudFNlcnZpY2UgeworCisgICAgdm9pZCBzZXRBY2NvdW50QmFsYW5jZShTdHJpbmcgYWNjb3VudElkLCBCaWdEZWNpbWFsIGJhbGFuY2UpOworCisgICAgQmlnRGVjaW1hbCBnZXRBY2NvdW50QmFsYW5jZShTdHJpbmcgYWNjb3VudElkKTsKKworICAgIFN0cmluZyB2ZXJpZnlTZXJ2bGV0UmVxdWVzdEluamVjdGlvbigpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9BY2NvdW50U2VydmljZUltcGwuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvQWNjb3VudFNlcnZpY2VJbXBsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI5OWU2MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvQWNjb3VudFNlcnZpY2VJbXBsLmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLnRlc3Q7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKKworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKKworLyoqCisgKiBBY2NvdW50U2VydmljZSBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiBAYXV0aG9yIE1hcmtvIEFzcGx1bmQgKG1hcmtvLmFzcGx1bmQgYXQgeWFob28uY29tKQorICovCitwdWJsaWMgY2xhc3MgQWNjb3VudFNlcnZpY2VJbXBsIGltcGxlbWVudHMgQWNjb3VudFNlcnZpY2UgeworCisgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBCaWdEZWNpbWFsPiBhY2NvdW50cyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICBwcml2YXRlIEJpZ0RlY2ltYWwgZGVmYXVsdEFjY291bnRCYWxhbmNlOworCisgICAgLy8gSkVSU0VZLTI1MDYgRklYIFZFUklGSUNBVElPTgorICAgIEBBdXRvd2lyZWQKKyAgICBwcml2YXRlIEh0dHBTZXJ2bGV0UmVxdWVzdCBodHRwU2VydmxldFJlcXVlc3Q7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBzZXRBY2NvdW50QmFsYW5jZShTdHJpbmcgYWNjb3VudElkLCBCaWdEZWNpbWFsIGJhbGFuY2UpIHsKKyAgICAgICAgYWNjb3VudHMucHV0KGFjY291bnRJZCwgYmFsYW5jZSk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIEJpZ0RlY2ltYWwgZ2V0QWNjb3VudEJhbGFuY2UoU3RyaW5nIGFjY291bnRJZCkgeworICAgICAgICBCaWdEZWNpbWFsIGJhbGFuY2UgPSBhY2NvdW50cy5nZXQoYWNjb3VudElkKTsKKyAgICAgICAgaWYgKGJhbGFuY2UgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRBY2NvdW50QmFsYW5jZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYmFsYW5jZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZWZhdWx0QWNjb3VudEJhbGFuY2UoU3RyaW5nIGRlZmF1bHRBY2NvdW50QmFsYW5jZSkgeworICAgICAgICB0aGlzLmRlZmF1bHRBY2NvdW50QmFsYW5jZSA9IG5ldyBCaWdEZWNpbWFsKGRlZmF1bHRBY2NvdW50QmFsYW5jZSk7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyB2ZXJpZnlTZXJ2bGV0UmVxdWVzdEluamVjdGlvbigpIHsKKyAgICAgICAgcmV0dXJuICJQQVNTRUQ6ICIgKyBodHRwU2VydmxldFJlcXVlc3QuZ2V0U2VydmVyTmFtZSgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9BY2NvdW50U3ByaW5nUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvQWNjb3VudFNwcmluZ1Jlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE2ZTZjMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvQWNjb3VudFNwcmluZ1Jlc291cmNlLmphdmEKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy50ZXN0OworCitpbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUFVUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuTmFtZWQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKKworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDsKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5RdWFsaWZpZXI7CitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLkNvbXBvbmVudDsKKworLyoqCisgKiBTcHJpbmcgbWFuYWdlZCBKQVgtUlMgcmVzb3VyY2UgZm9yIHRlc3RpbmcgamVyc2V5LXNwcmluZy4KKyAqCisgKiBAYXV0aG9yIE1hcmtvIEFzcGx1bmQgKG1hcmtvLmFzcGx1bmQgYXQgeWFob28uY29tKQorICovCitAUGF0aCgiL3NwcmluZy9hY2NvdW50IikKK0BDb21wb25lbnQKK3B1YmxpYyBjbGFzcyBBY2NvdW50U3ByaW5nUmVzb3VyY2UgeworCisgICAgQEluamVjdAorICAgIEBOYW1lZCgiQWNjb3VudFNlcnZpY2Utc2luZ2xldG9uIikKKyAgICBwcml2YXRlIEFjY291bnRTZXJ2aWNlIGFjY291bnRTZXJ2aWNlSW5qZWN0OworCisgICAgQEF1dG93aXJlZAorICAgIEBRdWFsaWZpZXIoIkFjY291bnRTZXJ2aWNlLXNpbmdsZXRvbiIpCisgICAgcHJpdmF0ZSBBY2NvdW50U2VydmljZSBhY2NvdW50U2VydmljZUF1dG93aXJlZDsKKworICAgIEBJbmplY3QKKyAgICBATmFtZWQoIkFjY291bnRTZXJ2aWNlLXJlcXVlc3QtMSIpCisgICAgcHJpdmF0ZSBBY2NvdW50U2VydmljZSBhY2NvdW50U2VydmljZVJlcXVlc3QxOworCisgICAgQEF1dG93aXJlZAorICAgIEBRdWFsaWZpZXIoIkFjY291bnRTZXJ2aWNlLXJlcXVlc3QtMSIpCisgICAgcHJpdmF0ZSBBY2NvdW50U2VydmljZSBhY2NvdW50U2VydmljZVJlcXVlc3QyOworCisgICAgQEF1dG93aXJlZAorICAgIEBRdWFsaWZpZXIoIkFjY291bnRTZXJ2aWNlLXByb3RvdHlwZS0xIikKKyAgICBwcml2YXRlIEFjY291bnRTZXJ2aWNlIGFjY291bnRTZXJ2aWNlUHJvdG90eXBlMTsKKworICAgIEBBdXRvd2lyZWQKKyAgICBAUXVhbGlmaWVyKCJBY2NvdW50U2VydmljZS1wcm90b3R5cGUtMSIpCisgICAgcHJpdmF0ZSBBY2NvdW50U2VydmljZSBhY2NvdW50U2VydmljZVByb3RvdHlwZTI7CisKKyAgICBAQXV0b3dpcmVkCisgICAgcHJpdmF0ZSBIdHRwU2VydmxldFJlcXVlc3QgaHR0cFNlcnZsZXRSZXF1ZXN0OworCisgICAgQEluamVjdAorICAgIHByaXZhdGUgSEsyU2VydmljZVNpbmdsZXRvbiBoazJTaW5nbGV0b247CisKKyAgICBASW5qZWN0CisgICAgcHJpdmF0ZSBISzJTZXJ2aWNlUmVxdWVzdFNjb3BlZCBoazJSZXF1ZXN0U2NvcGVkOworCisgICAgQEluamVjdAorICAgIHByaXZhdGUgSEsyU2VydmljZVBlckxvb2t1cCBoazJQZXJMb29rdXA7CisKKyAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlID0gIm4vYSI7CisKKyAgICAvLyByZXNvdXJjZSBtZXRob2RzIGZvciB0ZXN0aW5nIHJlc291cmNlIGNsYXNzIHNjb3BlCisgICAgQEdFVAorICAgIEBQYXRoKCJtZXNzYWdlIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlOworICAgIH0KKworICAgIEBQVVQKKyAgICBAUGF0aCgibWVzc2FnZSIpCisgICAgQENvbnN1bWVzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgIHB1YmxpYyBTdHJpbmcgc2V0TWVzc2FnZShTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICB9CisKKyAgICAvLyBKRVJTRVktMjUwNiBGSVggVkVSSUZJQ0FUSU9OCisgICAgQEdFVAorICAgIEBQYXRoKCJzZXJ2ZXIiKQorICAgIHB1YmxpYyBTdHJpbmcgdmVyaWZ5U2VydmxldFJlcXVlc3RJbmplY3Rpb24oKSB7CisgICAgICAgIHJldHVybiAiUEFTU0VEOiAiICsgaHR0cFNlcnZsZXRSZXF1ZXN0LmdldFNlcnZlck5hbWUoKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInNpbmdsZXRvbi9zZXJ2ZXIiKQorICAgIHB1YmxpYyBTdHJpbmcgdmVyaWZ5U2VydmxldFJlcXVlc3RJbmplY3Rpb25JbnRvU2luZ2xldG9uKCkgeworICAgICAgICByZXR1cm4gYWNjb3VudFNlcnZpY2VJbmplY3QudmVyaWZ5U2VydmxldFJlcXVlc3RJbmplY3Rpb24oKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInNpbmdsZXRvbi9hdXRvd2lyZWQvc2VydmVyIikKKyAgICBwdWJsaWMgU3RyaW5nIHZlcmlmeVNlcnZsZXRSZXF1ZXN0SW5qZWN0aW9uSW50b0F1dG93aXJlZFNpbmdsZXRvbigpIHsKKyAgICAgICAgcmV0dXJuIGFjY291bnRTZXJ2aWNlQXV0b3dpcmVkLnZlcmlmeVNlcnZsZXRSZXF1ZXN0SW5qZWN0aW9uKCk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJyZXF1ZXN0L3NlcnZlciIpCisgICAgcHVibGljIFN0cmluZyB2ZXJpZnlTZXJ2bGV0UmVxdWVzdEluamVjdGlvbkludG9SZXF1ZXN0U2NvcGVkQmVhbigpIHsKKyAgICAgICAgcmV0dXJuIGFjY291bnRTZXJ2aWNlUmVxdWVzdDEudmVyaWZ5U2VydmxldFJlcXVlc3RJbmplY3Rpb24oKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInByb3RvdHlwZS9zZXJ2ZXIiKQorICAgIHB1YmxpYyBTdHJpbmcgdmVyaWZ5U2VydmxldFJlcXVlc3RJbmplY3Rpb25JbnRvUHJvdG90eXBlU2NvcGVkQmVhbigpIHsKKyAgICAgICAgcmV0dXJuIGFjY291bnRTZXJ2aWNlUHJvdG90eXBlMS52ZXJpZnlTZXJ2bGV0UmVxdWVzdEluamVjdGlvbigpOworICAgIH0KKworICAgIC8vIHJlc291cmNlIG1ldGhvZHMgZm9yIHRlc3Rpbmcgc2luZ2xldG9uIHNjb3BlZCBiZWFucworICAgIEBHRVQKKyAgICBAUGF0aCgic2luZ2xldG9uL2luamVjdC97YWNjb3VudElkfSIpCisgICAgcHVibGljIEJpZ0RlY2ltYWwgZ2V0QWNjb3VudEJhbGFuY2VTaW5nbGV0b25JbmplY3QoQFBhdGhQYXJhbSgiYWNjb3VudElkIikgU3RyaW5nIGFjY291bnRJZCkgeworICAgICAgICByZXR1cm4gYWNjb3VudFNlcnZpY2VJbmplY3QuZ2V0QWNjb3VudEJhbGFuY2UoYWNjb3VudElkKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoInNpbmdsZXRvbi9hdXRvd2lyZWQve2FjY291bnRJZH0iKQorICAgIHB1YmxpYyBCaWdEZWNpbWFsIGdldEFjY291bnRCYWxhbmNlU2luZ2xldG9uQXV0b3dpcmVkKEBQYXRoUGFyYW0oImFjY291bnRJZCIpIFN0cmluZyBhY2NvdW50SWQpIHsKKyAgICAgICAgcmV0dXJuIGFjY291bnRTZXJ2aWNlQXV0b3dpcmVkLmdldEFjY291bnRCYWxhbmNlKGFjY291bnRJZCk7CisgICAgfQorCisgICAgQFBVVAorICAgIEBQYXRoKCJzaW5nbGV0b24ve2FjY291bnRJZH0iKQorICAgIEBDb25zdW1lcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICBwdWJsaWMgdm9pZCBzZXRBY2NvdW50QmFsYW5jZVNpbmdsZXRvbihAUGF0aFBhcmFtKCJhY2NvdW50SWQiKSBTdHJpbmcgYWNjb3VudElkLCBTdHJpbmcgYmFsYW5jZSkgeworICAgICAgICBhY2NvdW50U2VydmljZUluamVjdC5zZXRBY2NvdW50QmFsYW5jZShhY2NvdW50SWQsIG5ldyBCaWdEZWNpbWFsKGJhbGFuY2UpKTsKKyAgICB9CisKKyAgICAvLyByZXNvdXJjZSBtZXRob2RzIGZvciB0ZXN0aW5nIHJlcXVlc3Qgc2NvcGVkIGJlYW5zCisgICAgQFBVVAorICAgIEBQYXRoKCJyZXF1ZXN0L3thY2NvdW50SWR9IikKKyAgICBAQ29uc3VtZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgcHVibGljIEJpZ0RlY2ltYWwgc2V0QWNjb3VudEJhbGFuY2VSZXF1ZXN0KEBQYXRoUGFyYW0oImFjY291bnRJZCIpIFN0cmluZyBhY2NvdW50SWQsIFN0cmluZyBiYWxhbmNlKSB7CisgICAgICAgIGFjY291bnRTZXJ2aWNlUmVxdWVzdDEuc2V0QWNjb3VudEJhbGFuY2UoYWNjb3VudElkLCBuZXcgQmlnRGVjaW1hbChiYWxhbmNlKSk7CisgICAgICAgIHJldHVybiBhY2NvdW50U2VydmljZVJlcXVlc3QyLmdldEFjY291bnRCYWxhbmNlKGFjY291bnRJZCk7CisgICAgfQorCisgICAgLy8gcmVzb3VyY2UgbWV0aG9kcyBmb3IgdGVzdGluZyBwcm90b3R5cGUgc2NvcGVkIGJlYW5zCisgICAgQFBVVAorICAgIEBQYXRoKCJwcm90b3R5cGUve2FjY291bnRJZH0iKQorICAgIEBDb25zdW1lcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICBwdWJsaWMgQmlnRGVjaW1hbCBzZXRBY2NvdW50QmFsYW5jZVByb3RvdHlwZShAUGF0aFBhcmFtKCJhY2NvdW50SWQiKSBTdHJpbmcgYWNjb3VudElkLCBTdHJpbmcgYmFsYW5jZSkgeworICAgICAgICBhY2NvdW50U2VydmljZVByb3RvdHlwZTEuc2V0QWNjb3VudEJhbGFuY2UoYWNjb3VudElkLCBuZXcgQmlnRGVjaW1hbChiYWxhbmNlKSk7CisgICAgICAgIHJldHVybiBhY2NvdW50U2VydmljZVByb3RvdHlwZTIuZ2V0QWNjb3VudEJhbGFuY2UoYWNjb3VudElkKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvQ29udHJvbGxlclJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy90ZXN0L0NvbnRyb2xsZXJSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3MTRjMjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy90ZXN0L0NvbnRyb2xsZXJSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy50ZXN0OworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBVVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLkNvbnRyb2xsZXI7CisKKy8qKgorICogQGF1dGhvciBLb25yYWQgR2FydXMgKGtvbnJhZC5nYXJ1cyBhdCBnbWFpbC5jb20pCisgKi8KK0BDb250cm9sbGVyCitAUGF0aCgiL3NwcmluZy9jb250cm9sbGVyIikKK3B1YmxpYyBjbGFzcyBDb250cm9sbGVyUmVzb3VyY2UgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZTsKKworICAgIEBQVVQKKyAgICBAUGF0aCgibWVzc2FnZSIpCisgICAgQENvbnN1bWVzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgIHB1YmxpYyBTdHJpbmcgc2V0TWVzc2FnZShmaW5hbCBTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoIm1lc3NhZ2UiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9FbmRwb2ludC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9FbmRwb2ludC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhOWYxNzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy90ZXN0L0VuZHBvaW50LmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLnRlc3Q7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworaW1wb3J0IG9yZy5zcHJpbmdmcmFtZXdvcmsuc3RlcmVvdHlwZS5Db21wb25lbnQ7CisKKy8qKgorICogQGF1dGhvciBLb25yYWQgR2FydXMgKGtvbnJhZC5nYXJ1cyBhdCBnbWFpbC5jb20pCisgKi8KK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitAVGFyZ2V0KEVsZW1lbnRUeXBlLlRZUEUpCitAQ29tcG9uZW50CitwdWJsaWMgQGludGVyZmFjZSBFbmRwb2ludCB7CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvRW5kcG9pbnRSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9FbmRwb2ludFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFmMDg1OAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvRW5kcG9pbnRSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy50ZXN0OworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBVVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCisvKioKKyAqIEBhdXRob3IgS29ucmFkIEdhcnVzIChrb25yYWQuZ2FydXMgYXQgZ21haWwuY29tKQorICovCitARW5kcG9pbnQKK0BQYXRoKCIvc3ByaW5nL2VuZHBvaW50IikKK3B1YmxpYyBjbGFzcyBFbmRwb2ludFJlc291cmNlIHsKKworICAgIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2U7CisKKyAgICBAUFVUCisgICAgQFBhdGgoIm1lc3NhZ2UiKQorICAgIEBDb25zdW1lcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICBwdWJsaWMgU3RyaW5nIHNldE1lc3NhZ2UoZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJtZXNzYWdlIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKSB7CisgICAgICAgIHJldHVybiBtZXNzYWdlOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvSEsyU2VydmljZVBlckxvb2t1cC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9ISzJTZXJ2aWNlUGVyTG9va3VwLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY2ODljNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvSEsyU2VydmljZVBlckxvb2t1cC5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy50ZXN0OworCisvKioKKyAqIFR5cGUgdG8gYmUgaGFuZGxlZCBhcyBISzIgcGVyLWxvb2t1cCBiZWFuLgorICoKKyAqIEBhdXRob3IgTWFya28gQXNwbHVuZCAobWFya28uYXNwbHVuZCBhdCB5YWhvby5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBISzJTZXJ2aWNlUGVyTG9va3VwIHsKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvSEsyU2VydmljZVJlcXVlc3RTY29wZWQuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvSEsyU2VydmljZVJlcXVlc3RTY29wZWQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTQ1YWVhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9ISzJTZXJ2aWNlUmVxdWVzdFNjb3BlZC5qYXZhCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy50ZXN0OworCisvKioKKyAqIFR5cGUgdG8gYmUgaGFuZGxlZCBhcyBISzIgcmVxdWVzdCBzY29wZWQgYmVhbi4KKyAqCisgKiBAYXV0aG9yIE1hcmtvIEFzcGx1bmQgKG1hcmtvLmFzcGx1bmQgYXQgeWFob28uY29tKQorICovCitwdWJsaWMgY2xhc3MgSEsyU2VydmljZVJlcXVlc3RTY29wZWQgeworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9ISzJTZXJ2aWNlU2luZ2xldG9uLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy90ZXN0L0hLMlNlcnZpY2VTaW5nbGV0b24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2I4ZmE4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9ISzJTZXJ2aWNlU2luZ2xldG9uLmphdmEKQEAgLTAsMCArMSwyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLnRlc3Q7CisKKy8qKgorICogVHlwZSB0byBiZSBoYW5kbGVkIGFzIEhLMiBzaW5nbGV0b24uCisgKgorICogQGF1dGhvciBNYXJrbyBBc3BsdW5kIChtYXJrby5hc3BsdW5kIGF0IHlhaG9vLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEhLMlNlcnZpY2VTaW5nbGV0b24geworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9NeUFwcGxpY2F0aW9uLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy90ZXN0L015QXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjhmMzBmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9NeUFwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLnRlc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkFic3RyYWN0QmluZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5CaW5kZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LkluamVjdGlvbk1hbmFnZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuaW50ZXJuYWwuaW5qZWN0LlBlckxvb2t1cDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5wcm9jZXNzLmludGVybmFsLlJlcXVlc3RTY29wZWQ7CisKKy8qKgorICogSkFYLVJTIGFwcGxpY2F0aW9uIGNsYXNzIGZvciBjb25maWd1cmluZyBpbmplY3RhYmxlIHNlcnZpY2VzIGluIEhLMiByZWdpc3RyeSBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KKyAqCisgKiBAYXV0aG9yIE1hcmtvIEFzcGx1bmQgKG1hcmtvLmFzcGx1bmQgYXQgeWFob28uY29tKQorICovCitwdWJsaWMgY2xhc3MgTXlBcHBsaWNhdGlvbiBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKworICAgIEBJbmplY3QKKyAgICBwdWJsaWMgTXlBcHBsaWNhdGlvbihmaW5hbCBJbmplY3Rpb25NYW5hZ2VyIGluamVjdGlvbk1hbmFnZXIpIHsKKyAgICAgICAgQmluZGVyIGJpbmRlciA9IG5ldyBBYnN0cmFjdEJpbmRlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICAgICAgICAgIGJpbmRBc0NvbnRyYWN0KEhLMlNlcnZpY2VTaW5nbGV0b24uY2xhc3MpLmluKFNpbmdsZXRvbi5jbGFzcyk7CisgICAgICAgICAgICAgICAgYmluZEFzQ29udHJhY3QoSEsyU2VydmljZVJlcXVlc3RTY29wZWQuY2xhc3MpLmluKFJlcXVlc3RTY29wZWQuY2xhc3MpOworICAgICAgICAgICAgICAgIGJpbmRBc0NvbnRyYWN0KEhLMlNlcnZpY2VQZXJMb29rdXAuY2xhc3MpLmluKFBlckxvb2t1cC5jbGFzcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgaW5qZWN0aW9uTWFuYWdlci5yZWdpc3RlcihiaW5kZXIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvUmVwb3NpdG9yeVJlc291cmNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy90ZXN0L1JlcG9zaXRvcnlSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjM2I1NjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy90ZXN0L1JlcG9zaXRvcnlSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy50ZXN0OworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBVVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCitpbXBvcnQgb3JnLnNwcmluZ2ZyYW1ld29yay5zdGVyZW90eXBlLlJlcG9zaXRvcnk7CisKKy8qKgorICogQGF1dGhvciBLb25yYWQgR2FydXMgKGtvbnJhZC5nYXJ1cyBhdCBnbWFpbC5jb20pCisgKi8KK0BSZXBvc2l0b3J5CitAUGF0aCgiL3NwcmluZy9yZXBvc2l0b3J5IikKK3B1YmxpYyBjbGFzcyBSZXBvc2l0b3J5UmVzb3VyY2UgeworCisgICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZTsKKworICAgIEBQVVQKKyAgICBAUGF0aCgibWVzc2FnZSIpCisgICAgQENvbnN1bWVzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgIHB1YmxpYyBTdHJpbmcgc2V0TWVzc2FnZShmaW5hbCBTdHJpbmcgbWVzc2FnZSkgeworICAgICAgICB0aGlzLm1lc3NhZ2UgPSBtZXNzYWdlOworICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoIm1lc3NhZ2UiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKKyAgICAgICAgcmV0dXJuIG1lc3NhZ2U7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9TZXJ2aWNlUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvU2VydmljZVJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUxNmRjZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvU2VydmljZVJlc291cmNlLmphdmEKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLnRlc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUFVUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CisKK2ltcG9ydCBvcmcuc3ByaW5nZnJhbWV3b3JrLnN0ZXJlb3R5cGUuU2VydmljZTsKKworLyoqCisgKiBAYXV0aG9yIEtvbnJhZCBHYXJ1cyAoa29ucmFkLmdhcnVzIGF0IGdtYWlsLmNvbSkKKyAqLworQFNlcnZpY2UKK0BQYXRoKCIvc3ByaW5nL3NlcnZpY2UiKQorcHVibGljIGNsYXNzIFNlcnZpY2VSZXNvdXJjZSB7CisKKyAgICBwcml2YXRlIFN0cmluZyBtZXNzYWdlOworCisgICAgQFBVVAorICAgIEBQYXRoKCJtZXNzYWdlIikKKyAgICBAQ29uc3VtZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgcHVibGljIFN0cmluZyBzZXRNZXNzYWdlKGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7CisgICAgICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7CisgICAgICAgIHJldHVybiBtZXNzYWdlOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgibWVzc2FnZSIpCisgICAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgeworICAgICAgICByZXR1cm4gbWVzc2FnZTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L3NyYy9tYWluL3Jlc291cmNlcy9hcHBsaWNhdGlvbkNvbnRleHQueG1sIGIvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvbWFpbi9yZXNvdXJjZXMvYXBwbGljYXRpb25Db250ZXh0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2M5MTI3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvbWFpbi9yZXNvdXJjZXMvYXBwbGljYXRpb25Db250ZXh0LnhtbApAQCAtMCwwICsxLDYwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxiZWFucyB4bWxucz0iaHR0cDovL3d3dy5zcHJpbmdmcmFtZXdvcmsub3JnL3NjaGVtYS9iZWFucyIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgeG1sbnM6YW9wPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2FvcCIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2JlYW5zCisgICAgICAgIGh0dHA6Ly93d3cuc3ByaW5nZnJhbWV3b3JrLm9yZy9zY2hlbWEvYmVhbnMvc3ByaW5nLWJlYW5zLnhzZCBodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2FvcAorICAgICAgICBodHRwOi8vd3d3LnNwcmluZ2ZyYW1ld29yay5vcmcvc2NoZW1hL2FvcC9zcHJpbmctYW9wLnhzZCI+CisKKyAgICA8IS0tPGJlYW4gY2xhc3M9Im9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZEFubm90YXRpb25CZWFuUG9zdFByb2Nlc3NvciIvPi0tPgorICAgIDxiZWFuIGNsYXNzPSJvcmcuc3ByaW5nZnJhbWV3b3JrLmJlYW5zLmZhY3RvcnkuYW5ub3RhdGlvbi5BdXRvd2lyZWRBbm5vdGF0aW9uQmVhblBvc3RQcm9jZXNzb3IiPgorICAgICAgICA8cHJvcGVydHkgbmFtZT0iYXV0b3dpcmVkQW5ub3RhdGlvblR5cGVzIj4KKyAgICAgICAgICAgIDxzZXQ+CisgICAgICAgICAgICAgICAgPHZhbHVlPm9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLkF1dG93aXJlZDwvdmFsdWU+CisgICAgICAgICAgICAgICAgPHZhbHVlPm9yZy5zcHJpbmdmcmFtZXdvcmsuYmVhbnMuZmFjdG9yeS5hbm5vdGF0aW9uLlZhbHVlPC92YWx1ZT4KKyAgICAgICAgICAgIDwvc2V0PgorICAgICAgICA8L3Byb3BlcnR5PgorICAgIDwvYmVhbj4KKworICAgIDxiZWFuIG5hbWU9IkFjY291bnRTZXJ2aWNlLXNpbmdsZXRvbiIgY2xhc3M9Im9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmcudGVzdC5BY2NvdW50U2VydmljZUltcGwiIC8+CisKKyAgICA8YmVhbiBuYW1lPSJBY2NvdW50U2VydmljZS1yZXF1ZXN0LTEiIGNsYXNzPSJvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLnRlc3QuQWNjb3VudFNlcnZpY2VJbXBsIiBzY29wZT0icmVxdWVzdCI+CisgICAgICAgIDxhb3A6c2NvcGVkLXByb3h5Lz4KKyAgICA8L2JlYW4+CisKKyAgICA8YmVhbiBuYW1lPSJBY2NvdW50U2VydmljZS1yZXF1ZXN0LTIiIGNsYXNzPSJvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLnRlc3QuQWNjb3VudFNlcnZpY2VJbXBsIiBzY29wZT0icmVxdWVzdCIvPgorCisgICAgPGJlYW4gbmFtZT0iQWNjb3VudFNlcnZpY2UtcHJvdG90eXBlLTEiIGNsYXNzPSJvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLnRlc3QuQWNjb3VudFNlcnZpY2VJbXBsIiBzY29wZT0icHJvdG90eXBlIj4KKyAgICAgICAgPHByb3BlcnR5IG5hbWU9ImRlZmF1bHRBY2NvdW50QmFsYW5jZSIgdmFsdWU9Ijk4Ny42NSIvPgorICAgIDwvYmVhbj4KKworICAgIDxiZWFuIG5hbWU9IkFjY291bnRTZXJ2aWNlLXByb3RvdHlwZS0yIiBjbGFzcz0ib3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy50ZXN0LkFjY291bnRTZXJ2aWNlSW1wbCIgc2NvcGU9InByb3RvdHlwZSIvPgorCisgICAgPCEtLSBTcHJpbmcgbWFuYWdlZCBKQVgtUlMgcmVzb3VyY2VzIC0tPgorICAgIDxiZWFuIGNsYXNzPSJvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLnRlc3QuQWNjb3VudFNwcmluZ1Jlc291cmNlIi8+CisKKyAgICA8YmVhbiBjbGFzcz0ib3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy50ZXN0LlNlcnZpY2VSZXNvdXJjZSIvPgorCisgICAgPGJlYW4gY2xhc3M9Im9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmcudGVzdC5Db250cm9sbGVyUmVzb3VyY2UiLz4KKworICAgIDxiZWFuIGNsYXNzPSJvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLnRlc3QuUmVwb3NpdG9yeVJlc291cmNlIi8+CisKKyAgICA8YmVhbiBjbGFzcz0ib3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy50ZXN0LkVuZHBvaW50UmVzb3VyY2UiLz4KKworPC9iZWFucz4KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2NmZjlkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsNTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMy4wIiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgorICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8zXzAueHNkIj4KKworICA8bW9kdWxlLW5hbWU+amVyc2V5LXNwcmluZy10ZXN0PC9tb2R1bGUtbmFtZT4KKworICAgIDwhLS0gdXNlIHRoaXMgdG8gZXhwbGljaXRseSBjb25maWd1cmUgU3ByaW5nIC0tPgorICAgIDwhLS0KKyAgICA8bGlzdGVuZXI+CisgICAgICAgIDxsaXN0ZW5lci1jbGFzcz5vcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5jb250ZXh0LkNvbnRleHRMb2FkZXJMaXN0ZW5lcjwvbGlzdGVuZXItY2xhc3M+CisgICAgPC9saXN0ZW5lcj4KKyAgICA8bGlzdGVuZXI+CisgICAgICAgIDxsaXN0ZW5lci1jbGFzcz5vcmcuc3ByaW5nZnJhbWV3b3JrLndlYi5jb250ZXh0LnJlcXVlc3QuUmVxdWVzdENvbnRleHRMaXN0ZW5lcjwvbGlzdGVuZXItY2xhc3M+CisgICAgPC9saXN0ZW5lcj4KKyAgICA8Y29udGV4dC1wYXJhbT4KKyAgICAgICAgPHBhcmFtLW5hbWU+Y29udGV4dENvbmZpZ0xvY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICA8cGFyYW0tdmFsdWU+Y2xhc3NwYXRoOi9hcHBsaWNhdGlvbkNvbnRleHQueG1sPC9wYXJhbS12YWx1ZT4KKyAgICA8L2NvbnRleHQtcGFyYW0+CisgICAgLS0+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLnRlc3QuTXlBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgIDwvc2VydmxldD4KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmcudGVzdC5NeUFwcGxpY2F0aW9uPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+CisKKworPC93ZWItYXBwPgorCmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy90ZXN0L0FjY291bnRSZXNvdXJjZUlUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9BY2NvdW50UmVzb3VyY2VJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWY5ZjE3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9BY2NvdW50UmVzb3VyY2VJVENhc2UuamF2YQpAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmcudGVzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckV4Y2VwdGlvbjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworcHVibGljIGNsYXNzIEFjY291bnRSZXNvdXJjZUlUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBBcHBsaWNhdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFN0cmluZyByID0gdGFyZ2V0KCkucGF0aCgiL2plcnNleS9hY2NvdW50L21lc3NhZ2UiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhyLCAibi9hIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9BY2NvdW50UmVzb3VyY2VUZXN0QmFzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9BY2NvdW50UmVzb3VyY2VUZXN0QmFzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjNzc3NGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy90ZXN0L0FjY291bnRSZXNvdXJjZVRlc3RCYXNlLmphdmEKQEAgLTAsMCArMSw4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLnRlc3Q7CisKK2ltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLnN0YXJ0c1dpdGg7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogQmFzZSBjbGFzcyBmb3IgSkFYLVJTIHJlc291cmNlIHRlc3RzLgorICoKKyAqIEBhdXRob3IgTWFya28gQXNwbHVuZCAobWFya28uYXNwbHVuZCBhdCB5YWhvby5jb20pCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBBY2NvdW50UmVzb3VyY2VUZXN0QmFzZSBleHRlbmRzIFJlc291cmNlVGVzdEJhc2UgeworCisgICAgLy8gdGVzdCBzaW5nbGV0b24gc2NvcGVkIFNwcmluZyBiZWFuIGluamVjdGlvbiB1c2luZyBASW5qZWN0ICsgQEF1dG93aXJlZAorICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbmdsZXRvblNjb3BlZFNwcmluZ1NlcnZpY2UoKSB7CisgICAgICAgIGZpbmFsIEJpZ0RlY2ltYWwgbmV3QmFsYW5jZSA9IG5ldyBCaWdEZWNpbWFsKE1hdGgucmFuZG9tKCkpOworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdCA9IHRhcmdldChnZXRSZXNvdXJjZUZ1bGxQYXRoKCkpOworCisgICAgICAgIHQucGF0aCgiL3NpbmdsZXRvbi94eXoxMjMiKS5yZXF1ZXN0KCkucHV0KEVudGl0eS5lbnRpdHkobmV3QmFsYW5jZS50b1N0cmluZygpLCBNZWRpYVR5cGUuVEVYVF9QTEFJTl9UWVBFKSk7CisgICAgICAgIGZpbmFsIEJpZ0RlY2ltYWwgYmFsYW5jZSA9IHQucGF0aCgiL3NpbmdsZXRvbi9hdXRvd2lyZWQveHl6MTIzIikucmVxdWVzdCgpLmdldChCaWdEZWNpbWFsLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG5ld0JhbGFuY2UsIGJhbGFuY2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlcXVlc3RTY29wZWRTcHJpbmdTZXJ2aWNlKCkgeworICAgICAgICBmaW5hbCBCaWdEZWNpbWFsIG5ld0JhbGFuY2UgPSBuZXcgQmlnRGVjaW1hbChNYXRoLnJhbmRvbSgpKTsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHQgPSB0YXJnZXQoZ2V0UmVzb3VyY2VGdWxsUGF0aCgpKTsKKyAgICAgICAgZmluYWwgQmlnRGVjaW1hbCBiYWxhbmNlID0gdC5wYXRoKCJyZXF1ZXN0L2FiYzQ1NiIpLnJlcXVlc3QoKS5wdXQoRW50aXR5LnRleHQobmV3QmFsYW5jZSksIEJpZ0RlY2ltYWwuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3QmFsYW5jZSwgYmFsYW5jZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHJvdG90eXBlU2NvcGVkU3ByaW5nU2VydmljZSgpIHsKKyAgICAgICAgZmluYWwgQmlnRGVjaW1hbCBuZXdCYWxhbmNlID0gbmV3IEJpZ0RlY2ltYWwoTWF0aC5yYW5kb20oKSk7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0ID0gdGFyZ2V0KGdldFJlc291cmNlRnVsbFBhdGgoKSk7CisgICAgICAgIGZpbmFsIEJpZ0RlY2ltYWwgYmFsYW5jZSA9IHQucGF0aCgicHJvdG90eXBlL2FiYzQ1NiIpLnJlcXVlc3QoKS5wdXQoRW50aXR5LnRleHQobmV3QmFsYW5jZSksIEJpZ0RlY2ltYWwuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEJpZ0RlY2ltYWwoIjk4Ny42NSIpLCBiYWxhbmNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTZXJ2bGV0SW5qZWN0aW9uKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdCA9IHRhcmdldChnZXRSZXNvdXJjZUZ1bGxQYXRoKCkpOworCisgICAgICAgIFN0cmluZyBzZXJ2ZXIgPSB0LnBhdGgoInNlcnZlciIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzZXJ2ZXIsIHN0YXJ0c1dpdGgoIlBBU1NFRDogIikpOworCisgICAgICAgIHNlcnZlciA9IHQucGF0aCgic2luZ2xldG9uL3NlcnZlciIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0VGhhdChzZXJ2ZXIsIHN0YXJ0c1dpdGgoIlBBU1NFRDogIikpOworCisgICAgICAgIHNlcnZlciA9IHQucGF0aCgic2luZ2xldG9uL2F1dG93aXJlZC9zZXJ2ZXIiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydFRoYXQoc2VydmVyLCBzdGFydHNXaXRoKCJQQVNTRUQ6ICIpKTsKKworICAgICAgICBzZXJ2ZXIgPSB0LnBhdGgoInJlcXVlc3Qvc2VydmVyIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KHNlcnZlciwgc3RhcnRzV2l0aCgiUEFTU0VEOiAiKSk7CisKKyAgICAgICAgc2VydmVyID0gdC5wYXRoKCJwcm90b3R5cGUvc2VydmVyIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRUaGF0KHNlcnZlciwgc3RhcnRzV2l0aCgiUEFTU0VEOiAiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9KZXJzZXlNYW5hZ2VkSVRDYXNlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy90ZXN0L0plcnNleU1hbmFnZWRJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODE1ZTBlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9KZXJzZXlNYW5hZ2VkSVRDYXNlLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLnRlc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdHMgZm9yIEplcnNleSBtYW5hZ2VkIEpBWC1SUyByZXNvdXJjZXMuCisgKgorICogQGF1dGhvciBNYXJrbyBBc3BsdW5kIChtYXJrby5hc3BsdW5kIGF0IHlhaG9vLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEplcnNleU1hbmFnZWRJVENhc2UgZXh0ZW5kcyBBY2NvdW50UmVzb3VyY2VUZXN0QmFzZSB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKGZpbmFsIFJlc291cmNlQ29uZmlnIHJjKSB7CisgICAgICAgIHJldHVybiByYy5yZWdpc3RlcihBY2NvdW50SmVyc2V5UmVzb3VyY2UuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0UmVzb3VyY2VQYXRoKCkgeworICAgICAgICByZXR1cm4gIi9qZXJzZXkvYWNjb3VudCI7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VTY29wZSgpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHQgPSB0YXJnZXQoZ2V0UmVzb3VyY2VGdWxsUGF0aCgpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSAiaGVsbG8sIHdvcmxkIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIGVjaG8gPSB0LnBhdGgoIm1lc3NhZ2UiKS5yZXF1ZXN0KCkucHV0KEVudGl0eS50ZXh0KG1lc3NhZ2UpLCBTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMobWVzc2FnZSwgZWNobyk7CisgICAgICAgIGZpbmFsIFN0cmluZyBtc2cgPSB0LnBhdGgoIm1lc3NhZ2UiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygibi9hIiwgbXNnKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvUmVzb3VyY2VUZXN0QmFzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9SZXNvdXJjZVRlc3RCYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ2MGQ3ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvUmVzb3VyY2VUZXN0QmFzZS5qYXZhCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy50ZXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLlNwcmluZ0xpZmVjeWNsZUxpc3RlbmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmcuc2NvcGUuUmVxdWVzdENvbnRleHRGaWx0ZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKKy8qKgorICogQmFzZSBjbGFzcyBmb3IgSkFYLVJTIHJlc291cmNlIHRlc3RzLgorICoKKyAqIEBhdXRob3IgTWFya28gQXNwbHVuZCAobWFya28uYXNwbHVuZCBhdCB5YWhvby5jb20pCisgKi8KK3B1YmxpYyBhYnN0cmFjdCBjbGFzcyBSZXNvdXJjZVRlc3RCYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEVTVF9XRUJBUFBfQ09OVEVYVF9QQVRIID0gImplcnNleS5zcHJpbmcudGVzdC5jb250ZXh0UGF0aCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfQ09OVEFJTkVSX0ZBQ1RPUllfRVhURVJOQUwgPSAib3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbCIKKyAgICAgICAgICAgICsgIi5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5IjsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBUZXN0Q29udGFpbmVyRmFjdG9yeSBnZXRUZXN0Q29udGFpbmVyRmFjdG9yeSgpIHRocm93cyBUZXN0Q29udGFpbmVyRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIG5ldyBFeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmMgPSBuZXcgUmVzb3VyY2VDb25maWcoKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihTcHJpbmdMaWZlY3ljbGVMaXN0ZW5lci5jbGFzcykKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXIoUmVxdWVzdENvbnRleHRGaWx0ZXIuY2xhc3MpOworICAgICAgICBUZXN0VXRpbC5yZWdpc3RlckhLMlNlcnZpY2VzKHJjKTsKKyAgICAgICAgcmMucHJvcGVydHkoImNvbnRleHRDb25maWdMb2NhdGlvbiIsICJjbGFzc3BhdGg6YXBwbGljYXRpb25Db250ZXh0LnhtbCIpOworICAgICAgICByZXR1cm4gY29uZmlndXJlKHJjKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgUmVzb3VyY2VDb25maWcgY29uZmlndXJlKFJlc291cmNlQ29uZmlnIHJjKTsKKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBTdHJpbmcgZ2V0UmVzb3VyY2VQYXRoKCk7CisKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlRnVsbFBhdGgoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBjb250YWluZXJGYWN0b3J5ID0gU3lzdGVtLmdldFByb3BlcnR5KFRlc3RQcm9wZXJ0aWVzLkNPTlRBSU5FUl9GQUNUT1JZKTsKKyAgICAgICAgaWYgKFRFU1RfQ09OVEFJTkVSX0ZBQ1RPUllfRVhURVJOQUwuZXF1YWxzKGNvbnRhaW5lckZhY3RvcnkpKSB7CisgICAgICAgICAgICByZXR1cm4gU3lzdGVtLmdldFByb3BlcnR5KFRFU1RfV0VCQVBQX0NPTlRFWFRfUEFUSCkgKyBnZXRSZXNvdXJjZVBhdGgoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZ2V0UmVzb3VyY2VQYXRoKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9TcHJpbmdNYW5hZ2VkQ29udHJvbGxlcklUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9TcHJpbmdNYW5hZ2VkQ29udHJvbGxlcklUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiZTQyYzYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy90ZXN0L1NwcmluZ01hbmFnZWRDb250cm9sbGVySVRDYXNlLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLnRlc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdHMgZm9yIFNwcmluZyBtYW5hZ2VkIEpBWC1SUyByZXNvdXJjZXMgd2l0aCBAQ29udHJvbGxlciBhcmNoZXR5cGUuCisgKgorICogQGF1dGhvciBLb25yYWQgR2FydXMgKGtvbnJhZC5nYXJ1cyBhdCBnbWFpbC5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBTcHJpbmdNYW5hZ2VkQ29udHJvbGxlcklUQ2FzZSBleHRlbmRzIFJlc291cmNlVGVzdEJhc2UgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZShmaW5hbCBSZXNvdXJjZUNvbmZpZyByYykgeworICAgICAgICByZXR1cm4gcmMucmVnaXN0ZXIoQ29udHJvbGxlclJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlUGF0aCgpIHsKKyAgICAgICAgcmV0dXJuICIvc3ByaW5nL2NvbnRyb2xsZXIiOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlU2NvcGUoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0ID0gdGFyZ2V0KGdldFJlc291cmNlRnVsbFBhdGgoKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gImhlbGxvLCB3b3JsZCI7CisgICAgICAgIGZpbmFsIFN0cmluZyBlY2hvID0gdC5wYXRoKCJtZXNzYWdlIikucmVxdWVzdCgpLnB1dChFbnRpdHkudGV4dChtZXNzYWdlKSwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIGVjaG8pOworICAgICAgICBmaW5hbCBTdHJpbmcgbXNnID0gdC5wYXRoKCJtZXNzYWdlIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMobWVzc2FnZSwgbXNnKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy90ZXN0L1NwcmluZ01hbmFnZWRFbmRwb2ludElUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9TcHJpbmdNYW5hZ2VkRW5kcG9pbnRJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTk2MDkwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9TcHJpbmdNYW5hZ2VkRW5kcG9pbnRJVENhc2UuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmcudGVzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0cyBmb3IgU3ByaW5nIG1hbmFnZWQgSkFYLVJTIHJlc291cmNlcyB3aXRoIGN1c3RvbSBjb21wb3NpdGUKKyAqIGFubm90YXRpb24gdGhhdCBkZXJpdmVzIGZyb20gQENvbXBvbmVudC4KKyAqCisgKiBAYXV0aG9yIEtvbnJhZCBHYXJ1cyAoa29ucmFkLmdhcnVzIGF0IGdtYWlsLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFNwcmluZ01hbmFnZWRFbmRwb2ludElUQ2FzZSBleHRlbmRzIFJlc291cmNlVGVzdEJhc2UgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZShmaW5hbCBSZXNvdXJjZUNvbmZpZyByYykgeworICAgICAgICByZXR1cm4gcmMucmVnaXN0ZXIoRW5kcG9pbnRSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZXNvdXJjZVBhdGgoKSB7CisgICAgICAgIHJldHVybiAiL3NwcmluZy9lbmRwb2ludCI7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VTY29wZSgpIHsKKyAgICAgICAgZmluYWwgV2ViVGFyZ2V0IHQgPSB0YXJnZXQoZ2V0UmVzb3VyY2VGdWxsUGF0aCgpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSAiaGVsbG8sIHdvcmxkIjsKKyAgICAgICAgZmluYWwgU3RyaW5nIGVjaG8gPSB0LnBhdGgoIm1lc3NhZ2UiKS5yZXF1ZXN0KCkucHV0KEVudGl0eS50ZXh0KG1lc3NhZ2UpLCBTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMobWVzc2FnZSwgZWNobyk7CisgICAgICAgIGZpbmFsIFN0cmluZyBtc2cgPSB0LnBhdGgoIm1lc3NhZ2UiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLCBtc2cpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvU3ByaW5nTWFuYWdlZElUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9TcHJpbmdNYW5hZ2VkSVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWVlYTQyOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvU3ByaW5nTWFuYWdlZElUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy50ZXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3RzIGZvciBTcHJpbmcgbWFuYWdlZCBKQVgtUlMgcmVzb3VyY2VzLgorICoKKyAqIEBhdXRob3IgTWFya28gQXNwbHVuZCAobWFya28uYXNwbHVuZCBhdCB5YWhvby5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBTcHJpbmdNYW5hZ2VkSVRDYXNlIGV4dGVuZHMgQWNjb3VudFJlc291cmNlVGVzdEJhc2UgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZShmaW5hbCBSZXNvdXJjZUNvbmZpZyByYykgeworICAgICAgICByZXR1cm4gcmMucmVnaXN0ZXIoQWNjb3VudFNwcmluZ1Jlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlUGF0aCgpIHsKKyAgICAgICAgcmV0dXJuICIvc3ByaW5nL2FjY291bnQiOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlU2NvcGUoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0ID0gdGFyZ2V0KGdldFJlc291cmNlRnVsbFBhdGgoKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gImhlbGxvLCB3b3JsZCI7CisgICAgICAgIGZpbmFsIFN0cmluZyBlY2hvID0gdC5wYXRoKCJtZXNzYWdlIikucmVxdWVzdCgpLnB1dChFbnRpdHkudGV4dChtZXNzYWdlKSwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIGVjaG8pOworICAgICAgICBmaW5hbCBTdHJpbmcgbXNnID0gdC5wYXRoKCJtZXNzYWdlIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMobWVzc2FnZSwgbXNnKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvU3ByaW5nTWFuYWdlZFJlcG9zaXRvcnlJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvU3ByaW5nTWFuYWdlZFJlcG9zaXRvcnlJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzAyYTllCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9TcHJpbmdNYW5hZ2VkUmVwb3NpdG9yeUlUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLnNwcmluZy50ZXN0OworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3RzIGZvciBTcHJpbmcgbWFuYWdlZCBKQVgtUlMgcmVzb3VyY2VzIHdpdGggQFJlcG9zaXRvcnkgYXJjaGV0eXBlLgorICoKKyAqIEBhdXRob3IgS29ucmFkIEdhcnVzIChrb25yYWQuZ2FydXMgYXQgZ21haWwuY29tKQorICovCitwdWJsaWMgY2xhc3MgU3ByaW5nTWFuYWdlZFJlcG9zaXRvcnlJVENhc2UgZXh0ZW5kcyBSZXNvdXJjZVRlc3RCYXNlIHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBSZXNvdXJjZUNvbmZpZyBjb25maWd1cmUoZmluYWwgUmVzb3VyY2VDb25maWcgcmMpIHsKKyAgICAgICAgcmV0dXJuIHJjLnJlZ2lzdGVyKFJlcG9zaXRvcnlSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSZXNvdXJjZVBhdGgoKSB7CisgICAgICAgIHJldHVybiAiL3NwcmluZy9yZXBvc2l0b3J5IjsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSZXNvdXJjZVNjb3BlKCkgeworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdCA9IHRhcmdldChnZXRSZXNvdXJjZUZ1bGxQYXRoKCkpOworICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSA9ICJoZWxsbywgd29ybGQiOworICAgICAgICBmaW5hbCBTdHJpbmcgZWNobyA9IHQucGF0aCgibWVzc2FnZSIpLnJlcXVlc3QoKS5wdXQoRW50aXR5LnRleHQobWVzc2FnZSksIFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLCBlY2hvKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIG1zZyA9IHQucGF0aCgibWVzc2FnZSIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIG1zZyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9TcHJpbmdNYW5hZ2VkU2VydmljZUlUQ2FzZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vc3ByaW5nNC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9zcHJpbmcvdGVzdC9TcHJpbmdNYW5hZ2VkU2VydmljZUlUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzM2NlZWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy90ZXN0L1NwcmluZ01hbmFnZWRTZXJ2aWNlSVRDYXNlLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuc3ByaW5nLnRlc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdHMgZm9yIFNwcmluZyBtYW5hZ2VkIEpBWC1SUyByZXNvdXJjZXMgd2l0aCBAU2VydmljZSBhcmNoZXR5cGUuCisgKgorICogQGF1dGhvciBLb25yYWQgR2FydXMgKGtvbnJhZC5nYXJ1cyBhdCBnbWFpbC5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBTcHJpbmdNYW5hZ2VkU2VydmljZUlUQ2FzZSBleHRlbmRzIFJlc291cmNlVGVzdEJhc2UgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZShmaW5hbCBSZXNvdXJjZUNvbmZpZyByYykgeworICAgICAgICByZXR1cm4gcmMucmVnaXN0ZXIoU2VydmljZVJlc291cmNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgU3RyaW5nIGdldFJlc291cmNlUGF0aCgpIHsKKyAgICAgICAgcmV0dXJuICIvc3ByaW5nL3NlcnZpY2UiOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlU2NvcGUoKSB7CisgICAgICAgIGZpbmFsIFdlYlRhcmdldCB0ID0gdGFyZ2V0KGdldFJlc291cmNlRnVsbFBhdGgoKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBtZXNzYWdlID0gImhlbGxvLCB3b3JsZCI7CisgICAgICAgIGZpbmFsIFN0cmluZyBlY2hvID0gdC5wYXRoKCJtZXNzYWdlIikucmVxdWVzdCgpLnB1dChFbnRpdHkudGV4dChtZXNzYWdlKSwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIGVjaG8pOworICAgICAgICBmaW5hbCBTdHJpbmcgbXNnID0gdC5wYXRoKCJtZXNzYWdlIikucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMobWVzc2FnZSwgbXNnKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy90ZXN0L1Rlc3RVdGlsLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi9zcHJpbmc0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL3NwcmluZy90ZXN0L1Rlc3RVdGlsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRiNDE0MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3NwcmluZzQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9zZXJ2ZXIvc3ByaW5nL3Rlc3QvVGVzdFV0aWwuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5zcHJpbmcudGVzdDsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuUGVyTG9va3VwOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnByb2Nlc3MuaW50ZXJuYWwuUmVxdWVzdFNjb3BlZDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi51dGlsaXRpZXMuQnVpbGRlckhlbHBlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi51dGlsaXRpZXMuYmluZGluZy5BYnN0cmFjdEJpbmRlcjsKKworY2xhc3MgVGVzdFV0aWwgeworCisgICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZUNvbmZpZyByZWdpc3RlckhLMlNlcnZpY2VzKGZpbmFsIFJlc291cmNlQ29uZmlnIHJjKSB7CisgICAgICAgIHJjCisgICAgICAgICAgICAgICAgLnJlZ2lzdGVyKG5ldyBBYnN0cmFjdEJpbmRlcigpIHsKKyAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJpbmQoQnVpbGRlckhlbHBlci5saW5rKEhLMlNlcnZpY2VTaW5nbGV0b24uY2xhc3MpLmluKFNpbmdsZXRvbi5jbGFzcykuYnVpbGQoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihuZXcgQWJzdHJhY3RCaW5kZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKEJ1aWxkZXJIZWxwZXIubGluayhISzJTZXJ2aWNlUmVxdWVzdFNjb3BlZC5jbGFzcykuaW4oUmVxdWVzdFNjb3BlZC5jbGFzcykuYnVpbGQoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihuZXcgQWJzdHJhY3RCaW5kZXIoKSB7CisgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBiaW5kKEJ1aWxkZXJIZWxwZXIubGluayhISzJTZXJ2aWNlUGVyTG9va3VwLmNsYXNzKS5pbihQZXJMb29rdXAuY2xhc3MpLmJ1aWxkKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIHJldHVybiByYzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvcG9tLnhtbCBiL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyZTA4ZWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvcG9tLnhtbApAQCAtMCwwICsxLDg3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+dHJhY2luZy1zdXBwb3J0PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLWludGVncmF0aW9uLXRyYWNpbmctc3VwcG9ydDwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5UcmFjaW5nIHN1cHBvcnQgaW50ZWdyYXRpb24gdGVzdDwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1leHRlcm5hbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGNsaWVudCBzaWRlIGNvbmZpZyB3b3JrcyAtIGZhaWxzYWZlIHBsdWdpbiBmb3JrcyBqdm0gLS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8amF2YS51dGlsLmxvZ2dpbmcuY29uZmlnLmZpbGU+JHtwcm9qZWN0LmJ1aWxkLnRlc3RPdXRwdXREaXJlY3Rvcnl9L2xvZ2dpbmcucHJvcGVydGllczwvamF2YS51dGlsLmxvZ2dpbmcuY29uZmlnLmZpbGU+CisgICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGNvbm5lY3RvcnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29ubmVjdG9yPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXNwb25zZUhlYWRlclNpemU+MTYxOTI8L3Jlc3BvbnNlSGVhZGVyU2l6ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29ubmVjdG9yPgorICAgICAgICAgICAgICAgICAgICA8L2Nvbm5lY3RvcnM+CisgICAgICAgICAgICAgICAgICAgIDwhLS0gc2VydmVyIHNpZGUgY29uZmlnIGRvZXMgbm90IGZvcmsgd2l0aCBqZXR0eTpydW4gZ29hbCAtIGl0IHVzZXMgc2FtZSBqdm0KKyAgICAgICAgICAgICAgICAgICAgICAgICB1c2UgbWF2ZW4gJy1EJyBvcHRpb24gaW5zdGVhZDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXZuIF9nb2FsXyAtRGphdmEudXRpbC5sb2dnaW5nLmNvbmZpZy5maWxlPXRhcmdldC90ZXN0LWNsYXNzZXMvbG9nZ2luZy5wcm9wZXJ0aWVzCisgICAgICAgICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPHN5c3RlbVByb3BlcnR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPmphdmEudXRpbC5sb2dnaW5nLmNvbmZpZy5maWxlPC9uYW1lPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT4ke3Byb2plY3QuYnVpbGQudGVzdE91dHB1dERpcmVjdG9yeX0vbG9nZ2luZy5wcm9wZXJ0aWVzPC92YWx1ZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydGllcz4KKyAgICAgICAgICAgICAgICAgICAgLS0+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9BbGxUcmFjaW5nU3VwcG9ydC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9BbGxUcmFjaW5nU3VwcG9ydC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNjBhMzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL0FsbFRyYWNpbmdTdXBwb3J0LmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi50cmFjaW5nOworCitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlRyYWNpbmdDb25maWc7CisKKy8qKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uUGF0aCgiL0FMTCIpCitwdWJsaWMgY2xhc3MgQWxsVHJhY2luZ1N1cHBvcnQgZXh0ZW5kcyBUcmFjaW5nU3VwcG9ydCB7CisKKyAgICBwdWJsaWMgQWxsVHJhY2luZ1N1cHBvcnQoKSB7CisgICAgICAgIHN1cGVyKFRyYWNpbmdDb25maWcuQUxMKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvQXN5bmNSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9Bc3luY1Jlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM4MTcyYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvQXN5bmNSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24udHJhY2luZzsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Bc3luY1Jlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5TdXNwZW5kZWQ7CisKKy8qKgorKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorKi8KK0BQYXRoKCIvYXN5bmMiKQorcHVibGljIGNsYXNzIEFzeW5jUmVzb3VyY2UgeworCisgICAgQFBhdGgoIntuYW1lfSIpCisgICAgQEdFVAorICAgIHB1YmxpYyB2b2lkIGdldChAUGF0aFBhcmFtKCJuYW1lIikgU3RyaW5nIG5hbWUsIEBTdXNwZW5kZWQgZmluYWwgQXN5bmNSZXNwb25zZSBhc3luY1Jlc3BvbnNlKSB7CisgICAgICAgIGFzeW5jUmVzcG9uc2UucmVzdW1lKG5ldyBNZXNzYWdlKG5ldyBTdHJpbmdCdWZmZXIobmFtZSkucmV2ZXJzZSgpLnRvU3RyaW5nKCkpKTsKKyAgICB9CisKKyAgICBAUE9TVAorICAgIHB1YmxpYyB2b2lkIHBvc3QoTWVzc2FnZSBwb3N0LCBAU3VzcGVuZGVkIGZpbmFsIEFzeW5jUmVzcG9uc2UgYXN5bmNSZXNwb25zZSkgeworICAgICAgICBhc3luY1Jlc3BvbnNlLnJlc3VtZShuZXcgTWVzc2FnZShuZXcgU3RyaW5nQnVmZmVyKHBvc3QuZ2V0VGV4dCgpKS5yZXZlcnNlKCkudG9TdHJpbmcoKSkpOworICAgIH0KKworICAgIEBQYXRoKCJzdWItcmVzb3VyY2UtbWV0aG9kIikKKyAgICBAUE9TVAorICAgIHB1YmxpYyB2b2lkIHBvc3RTdWIoTWVzc2FnZSBwb3N0LCBAU3VzcGVuZGVkIGZpbmFsIEFzeW5jUmVzcG9uc2UgYXN5bmNSZXNwb25zZSkgeworICAgICAgICBhc3luY1Jlc3BvbnNlLnJlc3VtZShuZXcgTWVzc2FnZShuZXcgU3RyaW5nQnVmZmVyKHBvc3QuZ2V0VGV4dCgpKS5yZXZlcnNlKCkudG9TdHJpbmcoKSkpOworICAgIH0KKworICAgIEBQYXRoKCJzdWItcmVzb3VyY2UtbG9jYXRvciIpCisgICAgcHVibGljIEFzeW5jU3ViUmVzb3VyY2UgZ2V0U3ViTG9jKCkgeworICAgICAgICByZXR1cm4gbmV3IEFzeW5jU3ViUmVzb3VyY2UoKTsKKyAgICB9CisKKyAgICBAUGF0aCgic3ViLXJlc291cmNlLWxvY2F0b3ItbnVsbCIpCisgICAgcHVibGljIEFzeW5jU3ViUmVzb3VyY2UgZ2V0U3ViTG9jTnVsbCgpIHsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJydW50aW1lLWV4Y2VwdGlvbiIpCisgICAgcHVibGljIHZvaWQgZ2V0UnVudGltZUV4Y2VwdGlvbihAU3VzcGVuZGVkIGZpbmFsIEFzeW5jUmVzcG9uc2UgYXN5bmNSZXNwb25zZSkgeworICAgICAgICBhc3luY1Jlc3BvbnNlLnJlc3VtZShuZXcgUnVudGltZUV4Y2VwdGlvbigiU29tZXRoaW5nIGRvZXMgbm90IHdvcmsgLi4uIikpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgibWFwcGVkLWV4Y2VwdGlvbiIpCisgICAgcHVibGljIHZvaWQgZ2V0TWFwcGVkRXhjZXB0aW9uKEBTdXNwZW5kZWQgZmluYWwgQXN5bmNSZXNwb25zZSBhc3luY1Jlc3BvbnNlKSB7CisgICAgICAgIGFzeW5jUmVzcG9uc2UucmVzdW1lKG5ldyBUZXN0RXhjZXB0aW9uKCJUaGlzIGNvdWxkIGJlIGNsaWVudCBmYXVsdCAuLi4iKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL0FzeW5jU3ViUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvQXN5bmNTdWJSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NjY0NDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL0FzeW5jU3ViUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnRyYWNpbmc7CisKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkFzeW5jUmVzcG9uc2U7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLlN1c3BlbmRlZDsKKworLyoqCisqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisqLworQFBhdGgoIi8iKQorcHVibGljIGNsYXNzIEFzeW5jU3ViUmVzb3VyY2UgeworICAgIEBQT1NUCisgICAgcHVibGljIHZvaWQgcG9zdChNZXNzYWdlIHBvc3QsIEBTdXNwZW5kZWQgZmluYWwgQXN5bmNSZXNwb25zZSBhc3luY1Jlc3BvbnNlKSB7CisgICAgICAgIGFzeW5jUmVzcG9uc2UucmVzdW1lKG5ldyBNZXNzYWdlKG5ldyBTdHJpbmdCdWZmZXIocG9zdC5nZXRUZXh0KCkpLnJldmVyc2UoKS50b1N0cmluZygpKSk7CisgICAgfQorCisgICAgQFBhdGgoInN1Yi1yZXNvdXJjZS1tZXRob2QiKQorICAgIEBQT1NUCisgICAgcHVibGljIHZvaWQgcG9zdFN1YihNZXNzYWdlIHBvc3QsIEBTdXNwZW5kZWQgZmluYWwgQXN5bmNSZXNwb25zZSBhc3luY1Jlc3BvbnNlKSB7CisgICAgICAgIGFzeW5jUmVzcG9uc2UucmVzdW1lKG5ldyBNZXNzYWdlKG5ldyBTdHJpbmdCdWZmZXIocG9zdC5nZXRUZXh0KCkpLnJldmVyc2UoKS50b1N0cmluZygpKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9Db250YWluZXJSZXF1ZXN0RmlsdGVyNjguamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvQ29udGFpbmVyUmVxdWVzdEZpbHRlcjY4LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJmNjg4YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvQ29udGFpbmVyUmVxdWVzdEZpbHRlcjY4LmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi50cmFjaW5nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKKy8qKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworQFByb3ZpZGVyCitAUHJpb3JpdHkoNjgpCitwdWJsaWMgY2xhc3MgQ29udGFpbmVyUmVxdWVzdEZpbHRlcjY4IGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiKioqIENvbnRhaW5lclJlcXVlc3RGaWx0ZXI2OC5maWx0ZXIiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL0NvbnRhaW5lclJlcXVlc3RGaWx0ZXJOb1ByaW9yaXR5LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL0NvbnRhaW5lclJlcXVlc3RGaWx0ZXJOb1ByaW9yaXR5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODBjMDk1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvQ29udGFpbmVyUmVxdWVzdEZpbHRlck5vUHJpb3JpdHkuamF2YQpAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnRyYWNpbmc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKKy8qKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworQFByb3ZpZGVyCitwdWJsaWMgY2xhc3MgQ29udGFpbmVyUmVxdWVzdEZpbHRlck5vUHJpb3JpdHkgaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCIqKiogQ29udGFpbmVyUmVxdWVzdEZpbHRlck5vUHJpb3JpdHkuZmlsdGVyIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9Db250YWluZXJSZXNwb25zZUZpbHRlcjUwMDEuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXI1MDAxLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY3NDM1NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXI1MDAxLmphdmEKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi50cmFjaW5nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKKy8qKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworQFByb3ZpZGVyCitAUHJpb3JpdHkoNTAwMSkKK3B1YmxpYyBjbGFzcyBDb250YWluZXJSZXNwb25zZUZpbHRlcjUwMDEgaW1wbGVtZW50cyBDb250YWluZXJSZXNwb25zZUZpbHRlciB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0LCBDb250YWluZXJSZXNwb25zZUNvbnRleHQgcmVzcG9uc2VDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiKioqIENvbnRhaW5lclJlc3BvbnNlRmlsdGVyNTAwMS5maWx0ZXIiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL0NvbnRhaW5lclJlc3BvbnNlRmlsdGVyTm9Qcmlvcml0eS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9Db250YWluZXJSZXNwb25zZUZpbHRlck5vUHJpb3JpdHkuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODFkYTE3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9Db250YWluZXJSZXNwb25zZUZpbHRlck5vUHJpb3JpdHkuamF2YQpAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnRyYWNpbmc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKKy8qKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworQFByb3ZpZGVyCitwdWJsaWMgY2xhc3MgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXJOb1ByaW9yaXR5IGltcGxlbWVudHMgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXIgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCwgQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIioqKiBDb250YWluZXJSZXNwb25zZUZpbHRlck5vUHJpb3JpdHkuZmlsdGVyIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9NZXNzYWdlLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL01lc3NhZ2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGY0ZjZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9NZXNzYWdlLmphdmEKQEAgLTAsMCArMSw2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi50cmFjaW5nOworCisvKioKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBNZXNzYWdlIHsKKworICAgIHByaXZhdGUgU3RyaW5nIHRleHQ7CisKKyAgICBwdWJsaWMgTWVzc2FnZSgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVzc2FnZShTdHJpbmcgdGV4dCkgeworICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiKioqIE1lc3NhZ2U6IHwiICsgdGV4dCArICJ8Iik7CisgICAgICAgIHRoaXMudGV4dCA9IHRleHQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUZXh0KCkgeworICAgICAgICByZXR1cm4gdGV4dDsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUZXh0KFN0cmluZyB0ZXh0KSB7CisgICAgICAgIHRoaXMudGV4dCA9IHRleHQ7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7CisgICAgICAgIGlmICh0aGlzID09IG8pIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChvID09IG51bGwgfHwgZ2V0Q2xhc3MoKSAhPSBvLmdldENsYXNzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IChNZXNzYWdlKSBvOworCisgICAgICAgIGlmICh0ZXh0ICE9IG51bGwgPyAhdGV4dC5lcXVhbHMobWVzc2FnZS50ZXh0KSA6IG1lc3NhZ2UudGV4dCAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICByZXR1cm4gdGV4dCAhPSBudWxsID8gdGV4dC5oYXNoQ29kZSgpIDogMDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL01lc3NhZ2VCb2R5UmVhZGVyR2VuZXJpYy5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9NZXNzYWdlQm9keVJlYWRlckdlbmVyaWMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDkzMzM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9NZXNzYWdlQm9keVJlYWRlckdlbmVyaWMuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnRyYWNpbmc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCisvKioKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQcm92aWRlcgorQENvbnN1bWVzKCIqLyoiKQorcHVibGljIGNsYXNzIE1lc3NhZ2VCb2R5UmVhZGVyR2VuZXJpYyBpbXBsZW1lbnRzIE1lc3NhZ2VCb2R5UmVhZGVyPE1lc3NhZ2U+IHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgTWVzc2FnZSByZWFkRnJvbShDbGFzczxNZXNzYWdlPiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgZ2VuZXJpY1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtZWRpYVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBTdHJpbmc+IGh0dHBIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGVudGl0eVN0cmVhbSkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvTWVzc2FnZUJvZHlSZWFkZXJUZXN0Rm9ybWF0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL01lc3NhZ2VCb2R5UmVhZGVyVGVzdEZvcm1hdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZDA5NDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL01lc3NhZ2VCb2R5UmVhZGVyVGVzdEZvcm1hdC5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24udHJhY2luZzsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlSZWFkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5NZXNzYWdlVXRpbHM7CisKKy8qKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworQFByb3ZpZGVyCitAQ29uc3VtZXMoVXRpbHMuQVBQTElDQVRJT05fWF9KRVJTRVlfVEVTVCkKK3B1YmxpYyBjbGFzcyBNZXNzYWdlQm9keVJlYWRlclRlc3RGb3JtYXQgaW1wbGVtZW50cyBNZXNzYWdlQm9keVJlYWRlcjxNZXNzYWdlPiB7CisKKyAgICBib29sZWFuIHNlcnZlclNpZGUgPSB0cnVlOworCisgICAgcHVibGljIE1lc3NhZ2VCb2R5UmVhZGVyVGVzdEZvcm1hdCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVzc2FnZUJvZHlSZWFkZXJUZXN0Rm9ybWF0KGZpbmFsIGJvb2xlYW4gc2VydmVyU2lkZSkgeworICAgICAgICB0aGlzLnNlcnZlclNpZGUgPSBzZXJ2ZXJTaWRlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoZmluYWwgQ2xhc3M8Pz4gdHlwZSwgZmluYWwgVHlwZSBnZW5lcmljVHlwZSwgZmluYWwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFUeXBlIG1lZGlhVHlwZSkgeworICAgICAgICByZXR1cm4gdHlwZS5pc0Fzc2lnbmFibGVGcm9tKE1lc3NhZ2UuY2xhc3MpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBNZXNzYWdlIHJlYWRGcm9tKGZpbmFsIENsYXNzPE1lc3NhZ2U+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLCBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIFN0cmluZz4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQnVmZmVyZWRSZWFkZXIgcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBJbnB1dFN0cmVhbVJlYWRlcihlbnRpdHlTdHJlYW0sIE1lc3NhZ2VVdGlscy5nZXRDaGFyc2V0KG1lZGlhVHlwZSkpKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgbGluZSA9IHJlYWRlci5yZWFkTGluZSgpOworICAgICAgICBpZiAobGluZSA9PSBudWxsIHx8ICFsaW5lLnN0YXJ0c1dpdGgoVXRpbHMuRk9STUFUX1BSRUZJWCkgfHwgIWxpbmUuZW5kc1dpdGgoVXRpbHMuRk9STUFUX1NVRkZJWCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW5wdXQgY29udGVudCAnIiArIGxpbmUgKyAiJyBpcyBub3QgaW4gYSB2YWxpZCBmb3JtYXQhIikpOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFN0cmluZyB0ZXh0ID0gbGluZS5zdWJzdHJpbmcoVXRpbHMuRk9STUFUX1BSRUZJWC5sZW5ndGgoKSwgbGluZS5sZW5ndGgoKSAtIFV0aWxzLkZPUk1BVF9TVUZGSVgubGVuZ3RoKCkpOworCisgICAgICAgIGlmIChzZXJ2ZXJTaWRlKSB7CisgICAgICAgICAgICBVdGlscy50aHJvd0V4Y2VwdGlvbih0ZXh0LCB0aGlzLAorICAgICAgICAgICAgICAgICAgICBVdGlscy5UZXN0QWN0aW9uLk1FU1NBR0VfQk9EWV9SRUFERVJfVEhST1dfV0VCX0FQUExJQ0FUSU9OLAorICAgICAgICAgICAgICAgICAgICBVdGlscy5UZXN0QWN0aW9uLk1FU1NBR0VfQk9EWV9SRUFERVJfVEhST1dfUFJPQ0VTU0lORywKKyAgICAgICAgICAgICAgICAgICAgVXRpbHMuVGVzdEFjdGlvbi5NRVNTQUdFX0JPRFlfUkVBREVSX1RIUk9XX0FOWSk7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3IE1lc3NhZ2UodGV4dCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9NZXNzYWdlQm9keVdyaXRlckdlbmVyaWMuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvTWVzc2FnZUJvZHlXcml0ZXJHZW5lcmljLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUyOTViYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvTWVzc2FnZUJvZHlXcml0ZXJHZW5lcmljLmphdmEKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi50cmFjaW5nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVdyaXRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKKy8qKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworQFByb3ZpZGVyCitAUHJvZHVjZXMoIiovKiIpCitwdWJsaWMgY2xhc3MgTWVzc2FnZUJvZHlXcml0ZXJHZW5lcmljIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8TWVzc2FnZT4geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gaXNXcml0ZWFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgbG9uZyBnZXRTaXplKE1lc3NhZ2UgbWVzc2FnZSwgQ2xhc3M8Pz4gdHlwZSwgVHlwZSBnZW5lcmljVHlwZSwgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKE1lc3NhZ2UgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBUeXBlIGdlbmVyaWNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFubm90YXRpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG1lZGlhVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgT2JqZWN0PiBodHRwSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgIE91dHB1dFN0cmVhbSBlbnRpdHlTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvTWVzc2FnZUJvZHlXcml0ZXJUZXN0Rm9ybWF0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL01lc3NhZ2VCb2R5V3JpdGVyVGVzdEZvcm1hdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5ODNkMTgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL01lc3NhZ2VCb2R5V3JpdGVyVGVzdEZvcm1hdC5qYXZhCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24udHJhY2luZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uQW5ub3RhdGlvbjsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5UeXBlOworCitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NdWx0aXZhbHVlZE1hcDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5NZXNzYWdlVXRpbHM7CisKKy8qKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworQFByb3ZpZGVyCitAUHJvZHVjZXMoVXRpbHMuQVBQTElDQVRJT05fWF9KRVJTRVlfVEVTVCkKK3B1YmxpYyBjbGFzcyBNZXNzYWdlQm9keVdyaXRlclRlc3RGb3JtYXQgaW1wbGVtZW50cyBNZXNzYWdlQm9keVdyaXRlcjxNZXNzYWdlPiB7CisKKyAgICBib29sZWFuIHNlcnZlclNpZGUgPSB0cnVlOworCisgICAgcHVibGljIE1lc3NhZ2VCb2R5V3JpdGVyVGVzdEZvcm1hdCgpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgTWVzc2FnZUJvZHlXcml0ZXJUZXN0Rm9ybWF0KGZpbmFsIGJvb2xlYW4gc2VydmVyU2lkZSkgeworICAgICAgICB0aGlzLnNlcnZlclNpZGUgPSBzZXJ2ZXJTaWRlOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzV3JpdGVhYmxlKGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlKSB7CisgICAgICAgIHJldHVybiB0eXBlLmlzQXNzaWduYWJsZUZyb20oTWVzc2FnZS5jbGFzcyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShmaW5hbCBNZXNzYWdlIG1lc3NhZ2UsIGZpbmFsIENsYXNzPD8+IHR5cGUsIGZpbmFsIFR5cGUgZ2VuZXJpY1R5cGUsIGZpbmFsIEFubm90YXRpb25bXSBhbm5vdGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhVHlwZSBtZWRpYVR5cGUpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oZmluYWwgTWVzc2FnZSBtZXNzYWdlLCBmaW5hbCBDbGFzczw/PiB0eXBlLCBmaW5hbCBUeXBlIGdlbmVyaWNUeXBlLCBmaW5hbCBBbm5vdGF0aW9uW10gYW5ub3RhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVR5cGUgbWVkaWFUeXBlLCBmaW5hbCBNdWx0aXZhbHVlZE1hcDxTdHJpbmcsIE9iamVjdD4gaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW0gZW50aXR5U3RyZWFtKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHNlcnZlclNpZGUpIHsKKyAgICAgICAgICAgIFV0aWxzLnRocm93RXhjZXB0aW9uKG1lc3NhZ2UuZ2V0VGV4dCgpLCB0aGlzLAorICAgICAgICAgICAgICAgICAgICBVdGlscy5UZXN0QWN0aW9uLk1FU1NBR0VfQk9EWV9XUklURVJfVEhST1dfV0VCX0FQUExJQ0FUSU9OLAorICAgICAgICAgICAgICAgICAgICBVdGlscy5UZXN0QWN0aW9uLk1FU1NBR0VfQk9EWV9XUklURVJfVEhST1dfUFJPQ0VTU0lORywKKyAgICAgICAgICAgICAgICAgICAgVXRpbHMuVGVzdEFjdGlvbi5NRVNTQUdFX0JPRFlfV1JJVEVSX1RIUk9XX0FOWSk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBPdXRwdXRTdHJlYW1Xcml0ZXIgd3JpdGVyID0gbmV3IE91dHB1dFN0cmVhbVdyaXRlcihlbnRpdHlTdHJlYW0sIE1lc3NhZ2VVdGlscy5nZXRDaGFyc2V0KG1lZGlhVHlwZSkpOworICAgICAgICB3cml0ZXIud3JpdGUoVXRpbHMuRk9STUFUX1BSRUZJWCk7CisgICAgICAgIHdyaXRlci53cml0ZShtZXNzYWdlLmdldFRleHQoKSk7CisgICAgICAgIHdyaXRlci53cml0ZShVdGlscy5GT1JNQVRfU1VGRklYKTsKKyAgICAgICAgd3JpdGVyLmZsdXNoKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9PbkRlbWFuZFRyYWNpbmdTdXBwb3J0LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL09uRGVtYW5kVHJhY2luZ1N1cHBvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTE1MjY4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9PbkRlbWFuZFRyYWNpbmdTdXBwb3J0LmphdmEKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi50cmFjaW5nOworCitpbXBvcnQgamF2YXgud3MucnMuQXBwbGljYXRpb25QYXRoOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlRyYWNpbmdDb25maWc7CisKKy8qKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworQEFwcGxpY2F0aW9uUGF0aCgiL09OX0RFTUFORCIpCitwdWJsaWMgY2xhc3MgT25EZW1hbmRUcmFjaW5nU3VwcG9ydCBleHRlbmRzIFRyYWNpbmdTdXBwb3J0IHsKKworICAgIHB1YmxpYyBPbkRlbWFuZFRyYWNpbmdTdXBwb3J0KCkgeworICAgICAgICBzdXBlcihUcmFjaW5nQ29uZmlnLk9OX0RFTUFORCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL1ByZU1hdGNoaW5nQ29udGFpbmVyUmVxdWVzdEZpbHRlcjIzLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL1ByZU1hdGNoaW5nQ29udGFpbmVyUmVxdWVzdEZpbHRlcjIzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNjMzJhOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvUHJlTWF0Y2hpbmdDb250YWluZXJSZXF1ZXN0RmlsdGVyMjMuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnRyYWNpbmc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJpb3JpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5QcmVNYXRjaGluZzsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKKy8qKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworQFByb3ZpZGVyCitAUHJlTWF0Y2hpbmcKK0BQcmlvcml0eSgyMykKK3B1YmxpYyBjbGFzcyBQcmVNYXRjaGluZ0NvbnRhaW5lclJlcXVlc3RGaWx0ZXIyMyBpbXBsZW1lbnRzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIioqKiBQcmVNYXRjaGluZ0NvbnRhaW5lclJlcXVlc3RGaWx0ZXIyMy5maWx0ZXIiKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL1ByZU1hdGNoaW5nQ29udGFpbmVyUmVxdWVzdEZpbHRlcjQyLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL1ByZU1hdGNoaW5nQ29udGFpbmVyUmVxdWVzdEZpbHRlcjQyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE4Mzk4MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvUHJlTWF0Y2hpbmdDb250YWluZXJSZXF1ZXN0RmlsdGVyNDIuamF2YQpAQCAtMCwwICsxLDQxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnRyYWNpbmc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJpb3JpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5QcmVNYXRjaGluZzsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKKy8qKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworQFByb3ZpZGVyCitAUHJlTWF0Y2hpbmcKK0BQcmlvcml0eSg0MikKK3B1YmxpYyBjbGFzcyBQcmVNYXRjaGluZ0NvbnRhaW5lclJlcXVlc3RGaWx0ZXI0MiBpbXBsZW1lbnRzIENvbnRhaW5lclJlcXVlc3RGaWx0ZXIgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIioqKiBQcmVNYXRjaGluZ0NvbnRhaW5lclJlcXVlc3RGaWx0ZXI0Mi5maWx0ZXIiKTsKKyAgICAgICAgVXRpbHMudGhyb3dFeGNlcHRpb24ocmVxdWVzdENvbnRleHQsIHRoaXMsCisgICAgICAgICAgICAgICAgVXRpbHMuVGVzdEFjdGlvbi5QUkVfTUFUQ0hJTkdfUkVRVUVTVF9GSUxURVJfVEhST1dfV0VCX0FQUExJQ0FUSU9OLAorICAgICAgICAgICAgICAgIFV0aWxzLlRlc3RBY3Rpb24uUFJFX01BVENISU5HX1JFUVVFU1RfRklMVEVSX1RIUk9XX1BST0NFU1NJTkcsCisgICAgICAgICAgICAgICAgVXRpbHMuVGVzdEFjdGlvbi5QUkVfTUFUQ0hJTkdfUkVRVUVTVF9GSUxURVJfVEhST1dfQU5ZKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL1JlYWRlckludGVyY2VwdG9yMTQuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvUmVhZGVySW50ZXJjZXB0b3IxNC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNzk3MWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL1JlYWRlckludGVyY2VwdG9yMTQuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnRyYWNpbmc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJpb3JpdHk7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SZWFkZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0OworCisvKioKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQcm92aWRlcgorQFByaW9yaXR5KDE0KQorcHVibGljIGNsYXNzIFJlYWRlckludGVyY2VwdG9yMTQgaW1wbGVtZW50cyBSZWFkZXJJbnRlcmNlcHRvciB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdCBhcm91bmRSZWFkRnJvbShSZWFkZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCIqKiogUmVhZGVySW50ZXJjZXB0b3IxNC5hcm91bmRSZWFkRnJvbTogQkVGT1JFIik7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNDIpOworICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgIH0KKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0LnByb2NlZWQoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDQyKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCIqKiogUmVhZGVySW50ZXJjZXB0b3IxNC5hcm91bmRSZWFkRnJvbTogQUZURVIiKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvUmVhZGVySW50ZXJjZXB0b3IxOC5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9SZWFkZXJJbnRlcmNlcHRvcjE4LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QzZjQ0NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvUmVhZGVySW50ZXJjZXB0b3IxOC5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24udHJhY2luZzsKKworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YXguYW5ub3RhdGlvbi5Qcmlvcml0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJlYWRlckludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SZWFkZXJJbnRlcmNlcHRvckNvbnRleHQ7CisKKy8qKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworQFByb3ZpZGVyCitAUHJpb3JpdHkoMTgpCitwdWJsaWMgY2xhc3MgUmVhZGVySW50ZXJjZXB0b3IxOCBpbXBsZW1lbnRzIFJlYWRlckludGVyY2VwdG9yIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgT2JqZWN0IGFyb3VuZFJlYWRGcm9tKFJlYWRlckludGVyY2VwdG9yQ29udGV4dCBjb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIioqKiBSZWFkZXJJbnRlcmNlcHRvcjE4LmFyb3VuZFJlYWRGcm9tOiBCRUZPUkUiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHJldHVybiBjb250ZXh0LnByb2NlZWQoKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCIqKiogUmVhZGVySW50ZXJjZXB0b3IxOC5hcm91bmRSZWFkRnJvbTogQUZURVIiKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvUmVzb3VyY2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTNiNTdkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9SZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24udHJhY2luZzsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aFBhcmFtOworCisvKioKKyogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyovCitAUGF0aCgiL3Jvb3QiKQorcHVibGljIGNsYXNzIFJlc291cmNlIHsKKworICAgIEBQYXRoKCJ7bmFtZX0iKQorICAgIEBHRVQKKyAgICBwdWJsaWMgTWVzc2FnZSBnZXQoQFBhdGhQYXJhbSgibmFtZSIpIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHJldHVybiBuZXcgTWVzc2FnZShuZXcgU3RyaW5nQnVmZmVyKG5hbWUpLnJldmVyc2UoKS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAUE9TVAorICAgIHB1YmxpYyBNZXNzYWdlIHBvc3QoTWVzc2FnZSBwb3N0KSB7CisgICAgICAgIHJldHVybiBuZXcgTWVzc2FnZShuZXcgU3RyaW5nQnVmZmVyKHBvc3QuZ2V0VGV4dCgpKS5yZXZlcnNlKCkudG9TdHJpbmcoKSk7CisgICAgfQorCisgICAgQFBhdGgoInN1Yi1yZXNvdXJjZS1tZXRob2QiKQorICAgIEBQT1NUCisgICAgcHVibGljIE1lc3NhZ2UgcG9zdFN1YihNZXNzYWdlIHBvc3QpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNZXNzYWdlKG5ldyBTdHJpbmdCdWZmZXIocG9zdC5nZXRUZXh0KCkpLnJldmVyc2UoKS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAUGF0aCgic3ViLXJlc291cmNlLWxvY2F0b3IiKQorICAgIHB1YmxpYyBTdWJSZXNvdXJjZSBnZXRTdWJMb2MoKSB7CisgICAgICAgIHJldHVybiBuZXcgU3ViUmVzb3VyY2UoKTsKKyAgICB9CisKKyAgICBAUGF0aCgic3ViLXJlc291cmNlLWxvY2F0b3ItbnVsbCIpCisgICAgcHVibGljIFN1YlJlc291cmNlIGdldFN1YkxvY051bGwoKSB7CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgicnVudGltZS1leGNlcHRpb24iKQorICAgIHB1YmxpYyBNZXNzYWdlIGdldFJ1bnRpbWVFeGNlcHRpb24oKSB7CisgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJTb21ldGhpbmcgZG9lcyBub3Qgd29yayAuLi4iKTsKKyAgICB9CisKKyAgICBAR0VUCisgICAgQFBhdGgoIm1hcHBlZC1leGNlcHRpb24iKQorICAgIHB1YmxpYyBNZXNzYWdlIGdldE1hcHBlZEV4Y2VwdGlvbigpIHsKKyAgICAgICAgdGhyb3cgbmV3IFRlc3RFeGNlcHRpb24oIlRoaXMgY291bGQgYmUgY2xpZW50IGZhdWx0IC4uLiIpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9TdWJSZXNvdXJjZS5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9TdWJSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MDNjM2UKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL1N1YlJlc291cmNlLmphdmEKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi50cmFjaW5nOworCitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworCisvKioKKyogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyovCitAUGF0aCgiLyIpCitwdWJsaWMgY2xhc3MgU3ViUmVzb3VyY2UgeworICAgIEBQT1NUCisgICAgcHVibGljIE1lc3NhZ2UgcG9zdChNZXNzYWdlIHBvc3QpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBNZXNzYWdlKG5ldyBTdHJpbmdCdWZmZXIocG9zdC5nZXRUZXh0KCkpLnJldmVyc2UoKS50b1N0cmluZygpKTsKKyAgICB9CisKKyAgICBAUGF0aCgic3ViLXJlc291cmNlLW1ldGhvZCIpCisgICAgQFBPU1QKKyAgICBwdWJsaWMgTWVzc2FnZSBwb3N0U3ViKE1lc3NhZ2UgcG9zdCkgeworICAgICAgICByZXR1cm4gbmV3IE1lc3NhZ2UobmV3IFN0cmluZ0J1ZmZlcihwb3N0LmdldFRleHQoKSkucmV2ZXJzZSgpLnRvU3RyaW5nKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvVGVzdEV4Y2VwdGlvbi5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9UZXN0RXhjZXB0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZkY2NmZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvVGVzdEV4Y2VwdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24udHJhY2luZzsKKworLyoqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgVGVzdEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworCisgICAgcHVibGljIFRlc3RFeGNlcHRpb24oKSB7CisgICAgICAgIHN1cGVyKCk7CisgICAgfQorCisgICAgcHVibGljIFRlc3RFeGNlcHRpb24oU3RyaW5nIG1lc3NhZ2UpIHsKKyAgICAgICAgc3VwZXIobWVzc2FnZSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL1Rlc3RFeGNlcHRpb25NYXBwZXIuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvVGVzdEV4Y2VwdGlvbk1hcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZDZkZWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL1Rlc3RFeGNlcHRpb25NYXBwZXIuamF2YQpAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnRyYWNpbmc7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5OworaW1wb3J0IGphdmF4LndzLnJzLlByaW9yaXRpZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuRXhjZXB0aW9uTWFwcGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworLyoqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitAUHJpb3JpdHkoUHJpb3JpdGllcy5VU0VSKQorQFByb3ZpZGVyCitwdWJsaWMgY2xhc3MgVGVzdEV4Y2VwdGlvbk1hcHBlciBpbXBsZW1lbnRzIEV4Y2VwdGlvbk1hcHBlcjxUZXN0RXhjZXB0aW9uPiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzcG9uc2UgdG9SZXNwb25zZShUZXN0RXhjZXB0aW9uIHRocm93YWJsZSkgeworICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDUwMSkuYnVpbGQoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvVGVzdEV4dGVuZGVkRXhjZXB0aW9uTWFwcGVyR2VuZXJpYy5qYXZhIGIvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9UZXN0RXh0ZW5kZWRFeGNlcHRpb25NYXBwZXJHZW5lcmljLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEwY2M5ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvVGVzdEV4dGVuZGVkRXhjZXB0aW9uTWFwcGVyR2VuZXJpYy5qYXZhCkBAIC0wLDAgKzEsNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24udHJhY2luZzsKKworaW1wb3J0IGphdmF4LndzLnJzLlByaW9yaXRpZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc3BpLkV4dGVuZGVkRXhjZXB0aW9uTWFwcGVyOworCisvKioKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQcmlvcml0eShQcmlvcml0aWVzLlVTRVIgKyAxKQorQFByb3ZpZGVyCitwdWJsaWMgY2xhc3MgVGVzdEV4dGVuZGVkRXhjZXB0aW9uTWFwcGVyR2VuZXJpYyBpbXBsZW1lbnRzIEV4dGVuZGVkRXhjZXB0aW9uTWFwcGVyPEV4Y2VwdGlvbj4geworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFJlc3BvbnNlIHRvUmVzcG9uc2UoRXhjZXB0aW9uIHRocm93YWJsZSkgeworICAgICAgICByZXR1cm4gUmVzcG9uc2Uuc3RhdHVzKDUwMCkuYnVpbGQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc01hcHBhYmxlKEV4Y2VwdGlvbiB0aHJvd2FibGUpIHsKKyAgICAgICAgcmV0dXJuICEodGhyb3dhYmxlIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9UZXN0RXh0ZW5kZWRFeGNlcHRpb25NYXBwZXJSdW50aW1lLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL1Rlc3RFeHRlbmRlZEV4Y2VwdGlvbk1hcHBlclJ1bnRpbWUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTYxYjM3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9UZXN0RXh0ZW5kZWRFeGNlcHRpb25NYXBwZXJSdW50aW1lLmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi50cmFjaW5nOworCitpbXBvcnQgamF2YXgud3MucnMuUHJpb3JpdGllczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJpb3JpdHk7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zcGkuRXh0ZW5kZWRFeGNlcHRpb25NYXBwZXI7CisKKy8qKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworQFByaW9yaXR5KFByaW9yaXRpZXMuVVNFUiArIDIpCitAUHJvdmlkZXIKK3B1YmxpYyBjbGFzcyBUZXN0RXh0ZW5kZWRFeGNlcHRpb25NYXBwZXJSdW50aW1lIGltcGxlbWVudHMgRXh0ZW5kZWRFeGNlcHRpb25NYXBwZXI8VGhyb3dhYmxlPiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgUmVzcG9uc2UgdG9SZXNwb25zZShUaHJvd2FibGUgdGhyb3dhYmxlKSB7CisgICAgICAgIHJldHVybiBSZXNwb25zZS5zdGF0dXMoNTAwKS5idWlsZCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzTWFwcGFibGUoVGhyb3dhYmxlIHRocm93YWJsZSkgeworICAgICAgICByZXR1cm4gKHRocm93YWJsZSBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pICYmICEodGhyb3dhYmxlIGluc3RhbmNlb2YgV2ViQXBwbGljYXRpb25FeGNlcHRpb24pOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvVHJhY2luZ1N1cHBvcnQuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvVHJhY2luZ1N1cHBvcnQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWJiN2EyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9UcmFjaW5nU3VwcG9ydC5qYXZhCkBAIC0wLDAgKzEsMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMuaW50ZWdyYXRpb24udHJhY2luZzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuVHJhY2luZ0NvbmZpZzsKKworLyoqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgVHJhY2luZ1N1cHBvcnQgZXh0ZW5kcyBSZXNvdXJjZUNvbmZpZyB7CisKKyAgICBwdWJsaWMgVHJhY2luZ1N1cHBvcnQoVHJhY2luZ0NvbmZpZyB0eXBlKSB7CisgICAgICAgIFV0aWxzLmNvbmZpZ3VyZSh0aGlzKTsKKyAgICAgICAgcHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5UUkFDSU5HLCB0eXBlLm5hbWUoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL1V0aWxzLmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL1V0aWxzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE5YjQ1ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvVXRpbHMuamF2YQpAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi50cmFjaW5nOworCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuUHJvY2Vzc2luZ0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdENvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db25maWd1cmFibGU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmxvZ2dpbmcuTG9nZ2luZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCisvKioKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBVdGlscyB7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBIRUFERVJfVFJBQ0lOR19QUkVGSVggPSAiWC1KZXJzZXktVHJhY2luZy0iOworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVBQTElDQVRJT05fWF9KRVJTRVlfVEVTVCA9ICJhcHBsaWNhdGlvbi94LWplcnNleS10ZXN0IjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGT1JNQVRfUFJFRklYID0gIi09I1siOworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPUk1BVF9TVUZGSVggPSAiXSM9LSI7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEVBREVSX1RFU1RfQUNUSU9OID0gInRlc3QtYWN0aW9uIjsKKworICAgIHByaXZhdGUgVXRpbHMoKSB7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNvbmZpZ3VyZShSZXNvdXJjZUNvbmZpZyBjb25maWd1cmFibGUpIHsKKyAgICAgICAgY29uZmlndXJhYmxlLnBhY2thZ2VzKFV0aWxzLmNsYXNzLmdldFBhY2thZ2UoKS5nZXROYW1lKCkpOworLy8gICAgICAgIE9SOgorLy8gICAgICAgIGNvbmZpZ3VyZSgoQ29uZmlndXJhYmxlKWNvbmZpZ3VyYWJsZSk7CisvLyAgICAgICAgY29uZmlndXJhYmxlLnJlZ2lzdGVyKFByZU1hdGNoaW5nQ29udGFpbmVyUmVxdWVzdEZpbHRlcjIzLmNsYXNzKTsKKy8vICAgICAgICBjb25maWd1cmFibGUucmVnaXN0ZXIoUHJlTWF0Y2hpbmdDb250YWluZXJSZXF1ZXN0RmlsdGVyNDIuY2xhc3MpOworLy8gICAgICAgIGNvbmZpZ3VyYWJsZS5yZWdpc3RlcihDb250YWluZXJSZXF1ZXN0RmlsdGVyNjguY2xhc3MpOworLy8gICAgICAgIGNvbmZpZ3VyYWJsZS5yZWdpc3RlcihDb250YWluZXJSZXF1ZXN0RmlsdGVyTm9Qcmlvcml0eS5jbGFzcyk7CisvLyAgICAgICAgY29uZmlndXJhYmxlLnJlZ2lzdGVyKENvbnRhaW5lclJlc3BvbnNlRmlsdGVyNTAwMS5jbGFzcyk7CisvLyAgICAgICAgY29uZmlndXJhYmxlLnJlZ2lzdGVyKENvbnRhaW5lclJlc3BvbnNlRmlsdGVyTm9Qcmlvcml0eS5jbGFzcyk7CisvLyAgICAgICAgY29uZmlndXJhYmxlLnJlZ2lzdGVyKFRlc3RFeGNlcHRpb25NYXBwZXIuY2xhc3MpOworLy8gICAgICAgIGNvbmZpZ3VyYWJsZS5yZWdpc3RlcihUZXN0RXh0ZW5kZWRFeGNlcHRpb25NYXBwZXJHZW5lcmljLmNsYXNzKTsKKy8vICAgICAgICBjb25maWd1cmFibGUucmVnaXN0ZXIoVGVzdEV4dGVuZGVkRXhjZXB0aW9uTWFwcGVyUnVudGltZS5jbGFzcyk7CisvLyAgICAgICAgY29uZmlndXJhYmxlLnJlZ2lzdGVyKFJlc291cmNlLmNsYXNzKTsKKy8vICAgICAgICBjb25maWd1cmFibGUucmVnaXN0ZXIoU3ViUmVzb3VyY2UuY2xhc3MpOworICAgICAgICBjb25maWd1cmFibGUucmVnaXN0ZXIobmV3IExvZ2dpbmdGZWF0dXJlKExvZ2dlci5nZXRBbm9ueW1vdXNMb2dnZXIoKSwgTG9nZ2luZ0ZlYXR1cmUuVmVyYm9zaXR5LlBBWUxPQURfQU5ZKSk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGNvbmZpZ3VyZShDbGllbnRDb25maWcgY29uZmlndXJhYmxlKSB7CisgICAgICAgIGNvbmZpZ3VyZSgoQ29uZmlndXJhYmxlKSBjb25maWd1cmFibGUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjb25maWd1cmUoQ29uZmlndXJhYmxlIGNvbmZpZ3VyYWJsZSkgeworICAgICAgICBjb25maWd1cmFibGUucmVnaXN0ZXIoUmVhZGVySW50ZXJjZXB0b3IxNC5jbGFzcyk7CisgICAgICAgIGNvbmZpZ3VyYWJsZS5yZWdpc3RlcihSZWFkZXJJbnRlcmNlcHRvcjE4LmNsYXNzKTsKKyAgICAgICAgY29uZmlndXJhYmxlLnJlZ2lzdGVyKFdyaXRlckludGVyY2VwdG9yMzkuY2xhc3MpOworICAgICAgICBjb25maWd1cmFibGUucmVnaXN0ZXIoV3JpdGVySW50ZXJjZXB0b3I0NS5jbGFzcyk7CisgICAgICAgIGNvbmZpZ3VyYWJsZS5yZWdpc3RlcihuZXcgTWVzc2FnZUJvZHlSZWFkZXJUZXN0Rm9ybWF0KGZhbHNlKSk7CisgICAgICAgIGNvbmZpZ3VyYWJsZS5yZWdpc3RlcihNZXNzYWdlQm9keVJlYWRlckdlbmVyaWMuY2xhc3MpOworICAgICAgICBjb25maWd1cmFibGUucmVnaXN0ZXIobmV3IE1lc3NhZ2VCb2R5V3JpdGVyVGVzdEZvcm1hdChmYWxzZSkpOworICAgICAgICBjb25maWd1cmFibGUucmVnaXN0ZXIoTWVzc2FnZUJvZHlXcml0ZXJHZW5lcmljLmNsYXNzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGhyb3dFeGNlcHRpb24oZmluYWwgQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBmcm9tQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVGVzdEFjdGlvbiB0aHJvd1dlYkFwcGxpY2F0aW9uRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUZXN0QWN0aW9uIHRocm93UHJvY2Vzc2luZ0V4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVGVzdEFjdGlvbiB0aHJvd0FueUV4Y2VwdGlvbikgeworICAgICAgICBmaW5hbCBVdGlscy5UZXN0QWN0aW9uIHRlc3RBY3Rpb24gPSBVdGlscy5nZXRUZXN0QWN0aW9uKHJlcXVlc3RDb250ZXh0KTsKKyAgICAgICAgdGhyb3dFeGNlcHRpb25JbXBsKHRlc3RBY3Rpb24sIGZyb21Db250ZXh0LCB0aHJvd1dlYkFwcGxpY2F0aW9uRXhjZXB0aW9uLCB0aHJvd1Byb2Nlc3NpbmdFeGNlcHRpb24sIHRocm93QW55RXhjZXB0aW9uKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgdGhyb3dFeGNlcHRpb24oZmluYWwgU3RyaW5nIHRlc3RBY3Rpb25OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgZnJvbUNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFRlc3RBY3Rpb24gdGhyb3dXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVGVzdEFjdGlvbiB0aHJvd1Byb2Nlc3NpbmdFeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFRlc3RBY3Rpb24gdGhyb3dBbnlFeGNlcHRpb24pIHsKKyAgICAgICAgVXRpbHMuVGVzdEFjdGlvbiB0ZXN0QWN0aW9uOworICAgICAgICB0cnkgeworICAgICAgICAgICAgdGVzdEFjdGlvbiA9IFRlc3RBY3Rpb24udmFsdWVPZih0ZXN0QWN0aW9uTmFtZSk7CisgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICB0ZXN0QWN0aW9uID0gVGVzdEFjdGlvbi52YWx1ZU9mKG5ldyBTdHJpbmdCdWZmZXIodGVzdEFjdGlvbk5hbWUpLnJldmVyc2UoKS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleDIpIHsKKyAgICAgICAgICAgICAgICB0ZXN0QWN0aW9uID0gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB0aHJvd0V4Y2VwdGlvbkltcGwodGVzdEFjdGlvbiwgZnJvbUNvbnRleHQsIHRocm93V2ViQXBwbGljYXRpb25FeGNlcHRpb24sIHRocm93UHJvY2Vzc2luZ0V4Y2VwdGlvbiwgdGhyb3dBbnlFeGNlcHRpb24pOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgdGhyb3dFeGNlcHRpb25JbXBsKGZpbmFsIFV0aWxzLlRlc3RBY3Rpb24gdGVzdEFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgZnJvbUNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVGVzdEFjdGlvbiB0aHJvd1dlYkFwcGxpY2F0aW9uRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFRlc3RBY3Rpb24gdGhyb3dQcm9jZXNzaW5nRXhjZXB0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFRlc3RBY3Rpb24gdGhyb3dBbnlFeGNlcHRpb24pIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIG1lc3NhZ2UgPSAiVGVzdCBFeGNlcHRpb24gZnJvbSAiICsgZnJvbUNvbnRleHQuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7CisgICAgICAgIGlmICh0ZXN0QWN0aW9uID09IG51bGwpIHsKKyAgICAgICAgICAgIC8vIGRvIG5vdGhpbmcKKyAgICAgICAgfSBlbHNlIGlmICh0ZXN0QWN0aW9uID09IHRocm93V2ViQXBwbGljYXRpb25FeGNlcHRpb24pIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbihtZXNzYWdlKTsKKyAgICAgICAgfSBlbHNlIGlmICh0ZXN0QWN0aW9uID09IHRocm93UHJvY2Vzc2luZ0V4Y2VwdGlvbikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFByb2Nlc3NpbmdFeGNlcHRpb24obWVzc2FnZSk7CisgICAgICAgIH0gZWxzZSBpZiAodGVzdEFjdGlvbiA9PSB0aHJvd0FueUV4Y2VwdGlvbikgeworICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24obWVzc2FnZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIFRlc3RBY3Rpb24gZ2V0VGVzdEFjdGlvbihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCkgeworICAgICAgICBTdHJpbmcgdGVzdEFjdGlvbkhlYWRlciA9IHJlcXVlc3RDb250ZXh0LmdldEhlYWRlclN0cmluZyhIRUFERVJfVEVTVF9BQ1RJT04pOworICAgICAgICBUZXN0QWN0aW9uIHRlc3RBY3Rpb24gPSBudWxsOworICAgICAgICBpZiAodGVzdEFjdGlvbkhlYWRlciAhPSBudWxsKSB7CisgICAgICAgICAgICB0ZXN0QWN0aW9uID0gVGVzdEFjdGlvbi52YWx1ZU9mKHRlc3RBY3Rpb25IZWFkZXIpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0ZXN0QWN0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgZW51bSBUZXN0QWN0aW9uIHsKKyAgICAgICAgUFJFX01BVENISU5HX1JFUVVFU1RfRklMVEVSX1RIUk9XX1dFQl9BUFBMSUNBVElPTiwKKyAgICAgICAgUFJFX01BVENISU5HX1JFUVVFU1RfRklMVEVSX1RIUk9XX1BST0NFU1NJTkcsCisgICAgICAgIFBSRV9NQVRDSElOR19SRVFVRVNUX0ZJTFRFUl9USFJPV19BTlksCisgICAgICAgIE1FU1NBR0VfQk9EWV9SRUFERVJfVEhST1dfV0VCX0FQUExJQ0FUSU9OLAorICAgICAgICBNRVNTQUdFX0JPRFlfUkVBREVSX1RIUk9XX1BST0NFU1NJTkcsCisgICAgICAgIE1FU1NBR0VfQk9EWV9SRUFERVJfVEhST1dfQU5ZLAorICAgICAgICBNRVNTQUdFX0JPRFlfV1JJVEVSX1RIUk9XX1dFQl9BUFBMSUNBVElPTiwKKyAgICAgICAgTUVTU0FHRV9CT0RZX1dSSVRFUl9USFJPV19QUk9DRVNTSU5HLAorICAgICAgICBNRVNTQUdFX0JPRFlfV1JJVEVSX1RIUk9XX0FOWTsKKyAgICAgICAgLy9UT0RPIGFkZCBvdGhlciAqX1RIUk9XXyogYWN0aW9ucyB0byB0aHJvdyBleGNlcHRpb24gZnJvbSBvdGhlciBzdGFnZXMKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL1dyaXRlckludGVyY2VwdG9yMzkuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvV3JpdGVySW50ZXJjZXB0b3IzOS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MjU3ZGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL1dyaXRlckludGVyY2VwdG9yMzkuamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnRyYWNpbmc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5EYXRlOworaW1wb3J0IGphdmF4LmFubm90YXRpb24uUHJpb3JpdHk7CitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0OworCisvKioKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQcm92aWRlcgorQFByaW9yaXR5KDM5KQorcHVibGljIGNsYXNzIFdyaXRlckludGVyY2VwdG9yMzkgaW1wbGVtZW50cyBXcml0ZXJJbnRlcmNlcHRvciB7CisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYXJvdW5kV3JpdGVUbyhXcml0ZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCIqKiogV3JpdGVySW50ZXJjZXB0b3IzOS5hcm91bmRXcml0ZVRvOiBCRUZPUkUiKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcCg0Mik7CisgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgfQorICAgICAgICBjb250ZXh0LmdldEhlYWRlcnMoKS5wdXRTaW5nbGUoV3JpdGVySW50ZXJjZXB0b3IzOS5jbGFzcy5nZXRTaW1wbGVOYW1lKCksIG5ldyBEYXRlKCkpOworICAgICAgICBjb250ZXh0LnByb2NlZWQoKTsKKyAgICAgICAgLy9TeXN0ZW0ub3V0LnByaW50bG4oIioqKiBXcml0ZXJJbnRlcmNlcHRvcjM5LmFyb3VuZFdyaXRlVG86IEFGVEVSIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9Xcml0ZXJJbnRlcmNlcHRvcjQ1LmphdmEgYi90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL1dyaXRlckludGVyY2VwdG9yNDUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzZmMTNmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9Xcml0ZXJJbnRlcmNlcHRvcjQ1LmphdmEKQEAgLTAsMCArMSw0NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi50cmFjaW5nOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZheC5hbm5vdGF0aW9uLlByaW9yaXR5OworaW1wb3J0IGphdmF4LndzLnJzLldlYkFwcGxpY2F0aW9uRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3I7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yQ29udGV4dDsKKworLyoqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitAUHJvdmlkZXIKK0BQcmlvcml0eSg0NSkKK3B1YmxpYyBjbGFzcyBXcml0ZXJJbnRlcmNlcHRvcjQ1IGltcGxlbWVudHMgV3JpdGVySW50ZXJjZXB0b3IgeworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFyb3VuZFdyaXRlVG8oV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICAvL1N5c3RlbS5vdXQucHJpbnRsbigiKioqIFdyaXRlckludGVyY2VwdG9yNDUuYXJvdW5kV3JpdGVUbzogQkVGT1JFIik7CisgICAgICAgIGNvbnRleHQuZ2V0SGVhZGVycygpLnB1dFNpbmdsZShXcml0ZXJJbnRlcmNlcHRvcjQ1LmNsYXNzLmdldFNpbXBsZU5hbWUoKSwgbmV3IERhdGUoKSk7CisgICAgICAgIGNvbnRleHQucHJvY2VlZCgpOworICAgICAgICB0cnkgeworICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDQyKTsKKyAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICB9CisgICAgICAgIC8vU3lzdGVtLm91dC5wcmludGxuKCIqKiogV3JpdGVySW50ZXJjZXB0b3I0NS5hcm91bmRXcml0ZVRvOiBBRlRFUiIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvQWxsVHJhY2luZ1N1cHBvcnRJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvQWxsVHJhY2luZ1N1cHBvcnRJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzA3ODllCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy9BbGxUcmFjaW5nU3VwcG9ydElUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsMjE2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLmludGVncmF0aW9uLnRyYWNpbmc7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5JbnZvY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5UcmFjaW5nQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5TZXJ2ZXJUcmFjZUV2ZW50OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuZXh0ZXJuYWwuRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnNwaS5UZXN0Q29udGFpbmVyRXhjZXB0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJGYWN0b3J5OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqICdBTEwnIHRyYWNpbmcgc3VwcG9ydCB0ZXN0IHRoYXQgaXMgcnVubmluZyBpbiBleHRlcm5hbCBKZXR0eSBjb250YWluZXIuCisgKgorICogQGF1dGhvciBMaWJvciBLcmFtb2xpcyAobGlib3Iua3JhbW9saXMgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBBbGxUcmFjaW5nU3VwcG9ydElUQ2FzZSBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgcmVzb3VyY2VQYXRoOworCisgICAgcHVibGljIEFsbFRyYWNpbmdTdXBwb3J0SVRDYXNlKFN0cmluZyByZXNvdXJjZVBhdGgpIHsKKyAgICAgICAgdGhpcy5yZXNvdXJjZVBhdGggPSByZXNvdXJjZVBhdGg7CisgICAgfQorCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycyhuYW1lID0gIntpbmRleH06IHswfSIpCisgICAgcHVibGljIHN0YXRpYyBMaXN0PE9iamVjdFtdPiB0ZXN0RGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW10geworICAgICAgICAgICAgICAgIHsiL3Jvb3QifSwKKyAgICAgICAgICAgICAgICB7Ii9hc3luYyJ9LAorICAgICAgICB9KTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIEplcnNleVRlc3QKKyAgICAvLworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKTsKKworICAgICAgICByZXR1cm4gbmV3IEFsbFRyYWNpbmdTdXBwb3J0KCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlQ2xpZW50KENsaWVudENvbmZpZyBjbGllbnRDb25maWcpIHsKKyAgICAgICAgVXRpbHMuY29uZmlndXJlKGNsaWVudENvbmZpZyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFRlc3RDb250YWluZXJGYWN0b3J5IGdldFRlc3RDb250YWluZXJGYWN0b3J5KCkgdGhyb3dzIFRlc3RDb250YWluZXJFeGNlcHRpb24geworICAgICAgICByZXR1cm4gbmV3IEV4dGVybmFsVGVzdENvbnRhaW5lckZhY3RvcnkoKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIHRlc3RzCisgICAgLy8KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldCgpIHsKKyAgICAgICAgSW52b2NhdGlvbi5CdWlsZGVyIGJ1aWxkZXIgPSByZXNvdXJjZShyZXNvdXJjZVBhdGgpLnBhdGgoIk5BTUUiKS5yZXF1ZXN0KCk7CisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gYnVpbGRlci5nZXQoKTsKKyAgICAgICAgYXNzZXJ0WEplcnNleVRyYWNlKHJlc3BvbnNlLCBmYWxzZSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDAsIHJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RSdW50aW1lRXhjZXB0aW9uKCkgeworICAgICAgICBJbnZvY2F0aW9uLkJ1aWxkZXIgYnVpbGRlciA9IHJlc291cmNlKHJlc291cmNlUGF0aCkucGF0aCgicnVudGltZS1leGNlcHRpb24iKS5yZXF1ZXN0KCk7CisKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSBidWlsZGVyLmdldCgpOworICAgICAgICBhc3NlcnRYSmVyc2V5VHJhY2UocmVzcG9uc2UsIHRydWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoNTAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TWFwcGVkRXhjZXB0aW9uKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEludm9jYXRpb24uQnVpbGRlciBidWlsZGVyID0gcmVzb3VyY2UocmVzb3VyY2VQYXRoKS5wYXRoKCJtYXBwZWQtZXhjZXB0aW9uIikucmVxdWVzdCgpOworCisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gYnVpbGRlci5nZXQoKTsKKyAgICAgICAgYXNzZXJ0WEplcnNleVRyYWNlKHJlc3BvbnNlLCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDUwMSwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldDQwNSgpIHsKKyAgICAgICAgSW52b2NhdGlvbi5CdWlsZGVyIGJ1aWxkZXIgPSByZXNvdXJjZShyZXNvdXJjZVBhdGgpLnJlcXVlc3QoKTsKKworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IGJ1aWxkZXIuZ2V0KCk7CisgICAgICAgIGFzc2VydFhKZXJzZXlUcmFjZShyZXNwb25zZSwgZmFsc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDA1LCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdFN1YlJlc291cmNlTWV0aG9kKCkgeworICAgICAgICBJbnZvY2F0aW9uLkJ1aWxkZXIgYnVpbGRlciA9IHJlc291cmNlKHJlc291cmNlUGF0aCkucGF0aCgic3ViLXJlc291cmNlLW1ldGhvZCIpLnJlcXVlc3QoKTsKKworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IGJ1aWxkZXIucG9zdChFbnRpdHkuZW50aXR5KG5ldyBNZXNzYWdlKCJQT1NUIiksIFV0aWxzLkFQUExJQ0FUSU9OX1hfSkVSU0VZX1RFU1QpKTsKKyAgICAgICAgYXNzZXJ0WEplcnNleVRyYWNlKHJlc3BvbnNlLCBmYWxzZSk7CisgICAgICAgIGFzc2VydEVxdWFscygiVFNPUCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoTWVzc2FnZS5jbGFzcykuZ2V0VGV4dCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0U3ViUmVzb3VyY2VMb2NhdG9yKCkgeworICAgICAgICBJbnZvY2F0aW9uLkJ1aWxkZXIgYnVpbGRlciA9IHJlc291cmNlKHJlc291cmNlUGF0aCkucGF0aCgic3ViLXJlc291cmNlLWxvY2F0b3IiKS5yZXF1ZXN0KCk7CisKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSBidWlsZGVyLnBvc3QoRW50aXR5LmVudGl0eShuZXcgTWVzc2FnZSgiUE9TVCIpLCBVdGlscy5BUFBMSUNBVElPTl9YX0pFUlNFWV9URVNUKSk7CisgICAgICAgIGFzc2VydFhKZXJzZXlUcmFjZShyZXNwb25zZSwgZmFsc2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlRTT1AiLCByZXNwb25zZS5yZWFkRW50aXR5KE1lc3NhZ2UuY2xhc3MpLmdldFRleHQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdFN1YlJlc291cmNlTG9jYXRvck51bGwoKSB7CisgICAgICAgIEludm9jYXRpb24uQnVpbGRlciBidWlsZGVyID0gcmVzb3VyY2UocmVzb3VyY2VQYXRoKS5wYXRoKCJzdWItcmVzb3VyY2UtbG9jYXRvci1udWxsIikucmVxdWVzdCgpOworCisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gYnVpbGRlci5wb3N0KEVudGl0eS5lbnRpdHkobmV3IE1lc3NhZ2UoIlBPU1QiKSwgVXRpbHMuQVBQTElDQVRJT05fWF9KRVJTRVlfVEVTVCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNDA0LCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdFN1YlJlc291cmNlTG9jYXRvclN1YlJlc291cmNlTWV0aG9kKCkgeworICAgICAgICBJbnZvY2F0aW9uLkJ1aWxkZXIgYnVpbGRlciA9IHJlc291cmNlKHJlc291cmNlUGF0aCkucGF0aCgic3ViLXJlc291cmNlLWxvY2F0b3IiKS5wYXRoKCJzdWItcmVzb3VyY2UtbWV0aG9kIikucmVxdWVzdCgpOworCisgICAgICAgIFJlc3BvbnNlIHJlc3BvbnNlID0gYnVpbGRlci5wb3N0KEVudGl0eS5lbnRpdHkobmV3IE1lc3NhZ2UoIlBPU1QiKSwgVXRpbHMuQVBQTElDQVRJT05fWF9KRVJTRVlfVEVTVCkpOworICAgICAgICBhc3NlcnRYSmVyc2V5VHJhY2UocmVzcG9uc2UsIGZhbHNlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUU09QIiwgcmVzcG9uc2UucmVhZEVudGl0eShNZXNzYWdlLmNsYXNzKS5nZXRUZXh0KCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRyYWNlSW5uZXJFeGNlcHRpb24oKSB7CisgICAgICAgIC8vIFBSRV9NQVRDSElOR19SRVFVRVNUX0ZJTFRFUgorICAgICAgICB0ZXN0VHJhY2VJbm5lckV4Y2VwdGlvbkltcGwoVXRpbHMuVGVzdEFjdGlvbi5QUkVfTUFUQ0hJTkdfUkVRVUVTVF9GSUxURVJfVEhST1dfV0VCX0FQUExJQ0FUSU9OLCA1MDAsIGZhbHNlKTsKKyAgICAgICAgdGVzdFRyYWNlSW5uZXJFeGNlcHRpb25JbXBsKFV0aWxzLlRlc3RBY3Rpb24uUFJFX01BVENISU5HX1JFUVVFU1RfRklMVEVSX1RIUk9XX1BST0NFU1NJTkcsIDUwMCwgdHJ1ZSk7CisgICAgICAgIHRlc3RUcmFjZUlubmVyRXhjZXB0aW9uSW1wbChVdGlscy5UZXN0QWN0aW9uLlBSRV9NQVRDSElOR19SRVFVRVNUX0ZJTFRFUl9USFJPV19BTlksIDUwMCwgdHJ1ZSk7CisgICAgICAgIC8vIE1FU1NBR0VfQk9EWV9XUklURVIKKyAgICAgICAgdGVzdFRyYWNlSW5uZXJFeGNlcHRpb25JbXBsKFV0aWxzLlRlc3RBY3Rpb24uTUVTU0FHRV9CT0RZX1dSSVRFUl9USFJPV19XRUJfQVBQTElDQVRJT04sIDUwMCwgZmFsc2UpOworICAgICAgICB0ZXN0VHJhY2VJbm5lckV4Y2VwdGlvbkltcGwoVXRpbHMuVGVzdEFjdGlvbi5NRVNTQUdFX0JPRFlfV1JJVEVSX1RIUk9XX1BST0NFU1NJTkcsIDUwMCwgdHJ1ZSk7CisgICAgICAgIHRlc3RUcmFjZUlubmVyRXhjZXB0aW9uSW1wbChVdGlscy5UZXN0QWN0aW9uLk1FU1NBR0VfQk9EWV9XUklURVJfVEhST1dfQU5ZLCA1MDAsIHRydWUpOworICAgICAgICAvLyBNRVNTQUdFX0JPRFlfUkVBREVSCisgICAgICAgIHRlc3RUcmFjZUlubmVyRXhjZXB0aW9uSW1wbChVdGlscy5UZXN0QWN0aW9uLk1FU1NBR0VfQk9EWV9SRUFERVJfVEhST1dfV0VCX0FQUExJQ0FUSU9OLCA1MDAsIGZhbHNlKTsKKyAgICAgICAgdGVzdFRyYWNlSW5uZXJFeGNlcHRpb25JbXBsKFV0aWxzLlRlc3RBY3Rpb24uTUVTU0FHRV9CT0RZX1JFQURFUl9USFJPV19QUk9DRVNTSU5HLCA1MDAsIHRydWUpOworICAgICAgICB0ZXN0VHJhY2VJbm5lckV4Y2VwdGlvbkltcGwoVXRpbHMuVGVzdEFjdGlvbi5NRVNTQUdFX0JPRFlfUkVBREVSX1RIUk9XX0FOWSwgNTAwLCB0cnVlKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIHV0aWxzCisgICAgLy8KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0VHJhY2VJbm5lckV4Y2VwdGlvbkltcGwoVXRpbHMuVGVzdEFjdGlvbiB0ZXN0QWN0aW9uLCBpbnQgZXhwZWN0ZWRTdGF0dXMsIGJvb2xlYW4gZXhjZXB0aW9uRXhwZWN0ZWQpIHsKKyAgICAgICAgSW52b2NhdGlvbi5CdWlsZGVyIGJ1aWxkZXIgPSByZXNvdXJjZShyZXNvdXJjZVBhdGgpLnJlcXVlc3QoKTsKKyAgICAgICAgYnVpbGRlci5oZWFkZXIoVXRpbHMuSEVBREVSX1RFU1RfQUNUSU9OLCB0ZXN0QWN0aW9uKTsKKworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IGJ1aWxkZXIucG9zdChFbnRpdHkuZW50aXR5KG5ldyBNZXNzYWdlKHRlc3RBY3Rpb24ubmFtZSgpKSwgVXRpbHMuQVBQTElDQVRJT05fWF9KRVJTRVlfVEVTVCkpOworICAgICAgICBhc3NlcnRYSmVyc2V5VHJhY2UocmVzcG9uc2UsIGV4Y2VwdGlvbkV4cGVjdGVkKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkU3RhdHVzLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIGFzc2VydFhKZXJzZXlUcmFjZShSZXNwb25zZSByZXNwb25zZSwgYm9vbGVhbiBleGNlcHRpb25FeHBlY3RlZCkgeworICAgICAgICBpbnQgZmluaXNoZWQgPSAwOworICAgICAgICBpbnQgZXhjZXB0aW9uTWFwcGluZyA9IDA7CisKKyAgICAgICAgZm9yIChTdHJpbmcgayA6IHJlc3BvbnNlLmdldEhlYWRlcnMoKS5rZXlTZXQoKSkgeworICAgICAgICAgICAgaWYgKGsudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKFV0aWxzLkhFQURFUl9UUkFDSU5HX1BSRUZJWC50b0xvd2VyQ2FzZSgpKSkgeworICAgICAgICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IHJlc3BvbnNlLmdldEhlYWRlclN0cmluZyhrKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUuc3RhcnRzV2l0aChTZXJ2ZXJUcmFjZUV2ZW50LkZJTklTSEVELmNhdGVnb3J5KCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkKys7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5zdGFydHNXaXRoKFNlcnZlclRyYWNlRXZlbnQuRVhDRVBUSU9OX01BUFBJTkcuY2F0ZWdvcnkoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uTWFwcGluZysrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhc3NlcnRFcXVhbHMoIkp1c3Qgb25lIEZJTklTSEVEIGV4cGVjdGVkISIsIDEsIGZpbmlzaGVkKTsKKyAgICAgICAgaWYgKGV4Y2VwdGlvbkV4cGVjdGVkKSB7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkVYQ0VQVElPTiBleHBlY3RlZCEiLCAxLCBleGNlcHRpb25NYXBwaW5nKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiRVhDRVBUSU9OIE5PVCBleHBlY3RlZCEiLCAwLCBleGNlcHRpb25NYXBwaW5nKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgV2ViVGFyZ2V0IHJlc291cmNlKFN0cmluZyBwYXRoKSB7CisgICAgICAgIHJldHVybiB0YXJnZXQoIi8iICsgVHJhY2luZ0NvbmZpZy5BTEwpLnBhdGgocGF0aCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL09uRGVtYW5kVHJhY2luZ1N1cHBvcnRJVENhc2UuamF2YSBiL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmcvT25EZW1hbmRUcmFjaW5nU3VwcG9ydElUQ2FzZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZWNjZWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nLXN1cHBvcnQvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9pbnRlZ3JhdGlvbi90cmFjaW5nL09uRGVtYW5kVHJhY2luZ1N1cHBvcnRJVENhc2UuamF2YQpAQCAtMCwwICsxLDEyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5pbnRlZ3JhdGlvbi50cmFjaW5nOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuSW52b2NhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuaW50ZXJuYWwuVHJhY2luZ0xvZ2dlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlRyYWNpbmdDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5leHRlcm5hbC5FeHRlcm5hbFRlc3RDb250YWluZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3Quc3BpLlRlc3RDb250YWluZXJFeGNlcHRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5zcGkuVGVzdENvbnRhaW5lckZhY3Rvcnk7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RmFsc2U7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworLyoqCisgKiAnT05fREVNQU5EJyB0cmFjaW5nIHN1cHBvcnQgdGVzdCB0aGF0IGlzIHJ1bm5pbmcgaW4gZXh0ZXJuYWwgSmV0dHkgY29udGFpbmVyLgorICoKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBPbkRlbWFuZFRyYWNpbmdTdXBwb3J0SVRDYXNlIGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICAvLworICAgIC8vIEplcnNleVRlc3QKKyAgICAvLworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkRVTVBfRU5USVRZKTsKKworICAgICAgICByZXR1cm4gbmV3IE9uRGVtYW5kVHJhY2luZ1N1cHBvcnQoKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNsaWVudENvbmZpZykgeworICAgICAgICBVdGlscy5jb25maWd1cmUoY2xpZW50Q29uZmlnKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgVGVzdENvbnRhaW5lckZhY3RvcnkgZ2V0VGVzdENvbnRhaW5lckZhY3RvcnkoKSB0aHJvd3MgVGVzdENvbnRhaW5lckV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBuZXcgRXh0ZXJuYWxUZXN0Q29udGFpbmVyRmFjdG9yeSgpOworICAgIH0KKworICAgIC8vCisgICAgLy8gdGVzdHMKKyAgICAvLworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0Tm9UcmFjaW5nKCkgeworICAgICAgICBJbnZvY2F0aW9uLkJ1aWxkZXIgYnVpbGRlciA9IHJlc291cmNlKCIvcm9vdCIpLnJlcXVlc3QoKTsKKyAgICAgICAgUmVzcG9uc2UgcmVzcG9uc2UgPSBidWlsZGVyLnBvc3QoRW50aXR5LmVudGl0eShuZXcgTWVzc2FnZSgiUE9TVCIpLCBVdGlscy5BUFBMSUNBVElPTl9YX0pFUlNFWV9URVNUKSk7CisgICAgICAgIGFzc2VydEZhbHNlKGhhc1hfSmVyc2V5X1RyYWNlKHJlc3BvbnNlKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiVFNPUCIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoTWVzc2FnZS5jbGFzcykuZ2V0VGV4dCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUcmFjZUFjY2VwdEVtcHR5KCkgeworICAgICAgICB0ZXN0VHJhY2VBY2NlcHQoIiIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRyYWNlQWNjZXB0VHJ1ZSgpIHsKKyAgICAgICAgdGVzdFRyYWNlQWNjZXB0KCJ0cnVlIik7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VHJhY2VBY2NlcHRXaGF0ZXZlcigpIHsKKyAgICAgICAgdGVzdFRyYWNlQWNjZXB0KCJ3aGF0ZXZlciIpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCB0ZXN0VHJhY2VBY2NlcHQoU3RyaW5nIGFjY2VwdFZhbHVlKSB7CisgICAgICAgIEludm9jYXRpb24uQnVpbGRlciBidWlsZGVyID0gcmVzb3VyY2UoIi9yb290IikucmVxdWVzdCgpOworICAgICAgICBSZXNwb25zZSByZXNwb25zZSA9IGJ1aWxkZXIuaGVhZGVyKFRyYWNpbmdMb2dnZXIuSEVBREVSX0FDQ0VQVCwgYWNjZXB0VmFsdWUpCisgICAgICAgICAgICAgICAgLnBvc3QoRW50aXR5LmVudGl0eShuZXcgTWVzc2FnZSgiUE9TVCIpLCBVdGlscy5BUFBMSUNBVElPTl9YX0pFUlNFWV9URVNUKSk7CisgICAgICAgIGFzc2VydFRydWUoaGFzWF9KZXJzZXlfVHJhY2UocmVzcG9uc2UpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJUU09QIiwgcmVzcG9uc2UucmVhZEVudGl0eShNZXNzYWdlLmNsYXNzKS5nZXRUZXh0KCkpOworICAgIH0KKworICAgIC8vCisgICAgLy8gdXRpbHMKKyAgICAvLworCisgICAgcHJpdmF0ZSBib29sZWFuIGhhc1hfSmVyc2V5X1RyYWNlKFJlc3BvbnNlIHJlc3BvbnNlKSB7CisgICAgICAgIGZvciAoU3RyaW5nIGsgOiByZXNwb25zZS5nZXRIZWFkZXJzKCkua2V5U2V0KCkpIHsKKyAgICAgICAgICAgIGlmIChrLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChVdGlscy5IRUFERVJfVFJBQ0lOR19QUkVGSVgudG9Mb3dlckNhc2UoKSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcHJpdmF0ZSBXZWJUYXJnZXQgcmVzb3VyY2UoU3RyaW5nIHBhdGgpIHsKKyAgICAgICAgcmV0dXJuIHRhcmdldCgiLyIgKyBUcmFjaW5nQ29uZmlnLk9OX0RFTUFORCkucGF0aChwYXRoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvdGVzdC9yZXNvdXJjZXMvbG9nZ2luZy5wcm9wZXJ0aWVzIGIvdGVzdHMvaW50ZWdyYXRpb24vdHJhY2luZy1zdXBwb3J0L3NyYy90ZXN0L3Jlc291cmNlcy9sb2dnaW5nLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJhNzM5NQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL2ludGVncmF0aW9uL3RyYWNpbmctc3VwcG9ydC9zcmMvdGVzdC9yZXNvdXJjZXMvbG9nZ2luZy5wcm9wZXJ0aWVzCkBAIC0wLDAgKzEsMjUgQEAKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisjCisjIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyMgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorIyBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyMgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorIworIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyMKKworI0FsbCBhdHRyaWJ1dGVzIGRldGFpbHMKK2hhbmRsZXJzPWphdmEudXRpbC5sb2dnaW5nLkNvbnNvbGVIYW5kbGVyCitqYXZhLnV0aWwubG9nZ2luZy5Db25zb2xlSGFuZGxlci5sZXZlbD1GSU5FU1QKK2phdmEudXRpbC5sb2dnaW5nLlNpbXBsZUZvcm1hdHRlci5mb3JtYXQ9JTQkLTdzIFslMyRzXSAlNSRzJTYkcyVuCisKKyNBbGwgbG9nIGxldmVsIGRldGFpbHMKKy5sZXZlbD1JTkZPCitvcmcuZ2xhc3NmaXNoLmplcnNleS5sZXZlbD1DT05GSUcKK29yZy5nbGFzc2Zpc2guamVyc2V5LnRyYWNpbmcubGV2ZWw9RklORVNUCmRpZmYgLS1naXQgYS90ZXN0cy9tZW0tbGVha3MvcG9tLnhtbCBiL3Rlc3RzL21lbS1sZWFrcy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNmI0YzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tZW0tbGVha3MvcG9tLnhtbApAQCAtMCwwICsxLDMzNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0czwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLm1lbWxlYWtzPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtbWVtbGVhazwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgTWVtb3J5IGxlYWtzIHRlc3QgbWF2ZW4gcGFyZW50IG1vZHVsZS4KKworICAgICAgICBUaGlzIG1vZHVsZSBhZ2dyZWdhdGVzIG1hdmVuIGJhc2VkIGNvbmZpZ3VyYXRpb24gZm9yIGFsbCBtZW1vcnkgbGVhayByZWxhdGVkIG1vZHVsZXMuCisKKyAgICAgICAgTm90ZSB0aGF0IHRoZSBtYWpvcml0eSBvZiBwbHVnaW4gZXhlY3V0aW9uIGluIG1hdmVuIHN1Yi1tb2R1bGVzIGlzIGJvdW5kIHRvIHBoYXNlIG5vbmUgYnkgZGVmYXVsdC4gVGhlIHJlYXNvbiBpcyB0aGF0CisgICAgICAgIG1lbW9yeSBsZWFrIHRlc3RzIGFyZSBleGVjdXRlZCBvbmx5IGlmIG9uZSBvZiBtZW1vcnkgbGVhayBtYXZlbiBwcm9maWxlcyBhcmUgYWN0aXZhdGVkLgorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8cHJvcGVydGllcz4KKworICAgICAgICA8bWVtbGVhay5qZXJzZXkudmVyc2lvbj4yLjI4LVNOQVBTSE9UPC9tZW1sZWFrLmplcnNleS52ZXJzaW9uPgorCisgICAgICAgIDxtZW1sZWFrLnRtcGRpcj4vdG1wPC9tZW1sZWFrLnRtcGRpcj4KKworICAgICAgICA8bWVtbGVhay5qdm0ubWF4aGVhcD41MTJtPC9tZW1sZWFrLmp2bS5tYXhoZWFwPgorICAgICAgICA8bWVtbGVhay5qdm0uaGVhcGR1bXBkaXI+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX08L21lbWxlYWsuanZtLmhlYXBkdW1wZGlyPgorCisgICAgICAgIDxleHRlcm5hbC5jb250YWluZXIuZmFjdG9yeT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LmV4dGVybmFsLkV4dGVybmFsVGVzdENvbnRhaW5lckZhY3Rvcnk8L2V4dGVybmFsLmNvbnRhaW5lci5mYWN0b3J5PgorICAgICAgICA8ZXh0ZXJuYWwuY29udGFpbmVyLnBvcnQ+JHtleHRlcm5hbC5jb250YWluZXIucG9ydC5keW5hbWljfTwvZXh0ZXJuYWwuY29udGFpbmVyLnBvcnQ+CisgICAgICAgIDxleHRlcm5hbC5jb250YWluZXIuY29udGV4dFJvb3Q+JHtwcm9qZWN0LmFydGlmYWN0SWR9LSR7cHJvamVjdC52ZXJzaW9ufTwvZXh0ZXJuYWwuY29udGFpbmVyLmNvbnRleHRSb290PgorICAgICAgICA8ZXh0ZXJuYWwuY29udGFpbmVyLndhclBhdGg+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vJHtwcm9qZWN0LmJ1aWxkLmZpbmFsTmFtZX0uJHtwcm9qZWN0LnBhY2thZ2luZ30KKyAgICAgICAgPC9leHRlcm5hbC5jb250YWluZXIud2FyUGF0aD4KKyAgICAgICAgPGV4dGVybmFsLmNvbnRhaW5lci5sb2dGaWxlPiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2NvbnRhaW5lci5sb2c8L2V4dGVybmFsLmNvbnRhaW5lci5sb2dGaWxlPgorCisgICAgICAgIDxtYXZlbi5idWlsZC50aW1lc3RhbXAuZm9ybWF0Pnl5eXktTU0tZGQ8L21hdmVuLmJ1aWxkLnRpbWVzdGFtcC5mb3JtYXQ+CisgICAgICAgIDxtZW1sZWFrLnRpbWVzdGFtcD4ke21hdmVuLmJ1aWxkLnRpbWVzdGFtcH08L21lbWxlYWsudGltZXN0YW1wPgorCisgICAgICAgIDxtZW1sZWFrLmdsYXNzZmlzaC56aXA+JHttZW1sZWFrLnRtcGRpcn0vbWVtbGVhay10ZXN0LWdsYXNzZmlzaC0ke21lbWxlYWsudGltZXN0YW1wfS56aXA8L21lbWxlYWsuZ2xhc3NmaXNoLnppcD4KKyAgICAgICAgPG1lbWxlYWsuZ2xhc3NmaXNoLmFkbWluUG9ydD4ke21lbWxlYWsuZ2xhc3NmaXNoLmFkbWluUG9ydC5keW5hbWljfTwvbWVtbGVhay5nbGFzc2Zpc2guYWRtaW5Qb3J0PgorICAgICAgICA8bWVtbGVhay5nbGFzc2Zpc2gudXJsPiR7amVyc2V5LnJ1bm5lci5kaXN0VXJsfTwvbWVtbGVhay5nbGFzc2Zpc2gudXJsPgorICAgICAgICA8bWVtbGVhay5nbGFzc2Zpc2gubWF4aGVhcD4ke21lbWxlYWsuanZtLm1heGhlYXB9PC9tZW1sZWFrLmdsYXNzZmlzaC5tYXhoZWFwPgorCisgICAgICAgIDxtZW1sZWFrLndscy5qYXI+JHttZW1sZWFrLnRtcGRpcn0vbWVtbGVhay10ZXN0LXdscy0ke21lbWxlYWsudGltZXN0YW1wfS5qYXI8L21lbWxlYWsud2xzLmphcj4KKyAgICAgICAgPG1lbWxlYWsud2xzLnVybD4ke2plcnNleS5ydW5uZXIuZGlzdFVybH08L21lbWxlYWsud2xzLnVybD4KKyAgICAgICAgPG1lbWxlYWsud2xzLm1heGhlYXA+JHttZW1sZWFrLmp2bS5tYXhoZWFwfTwvbWVtbGVhay53bHMubWF4aGVhcD4KKworICAgICAgICA8bWVtbGVhay50b21jYXQudmVyc2lvbj44LjAuMjM8L21lbWxlYWsudG9tY2F0LnZlcnNpb24+CisgICAgICAgIDxtZW1sZWFrLnRvbWNhdC51cmw+CisgICAgICAgICAgICBodHRwOi8vYXJjaGl2ZS5hcGFjaGUub3JnL2Rpc3QvdG9tY2F0L3RvbWNhdC04L3Yke21lbWxlYWsudG9tY2F0LnZlcnNpb259L2Jpbi9hcGFjaGUtdG9tY2F0LSR7bWVtbGVhay50b21jYXQudmVyc2lvbn0uemlwCisgICAgICAgIDwvbWVtbGVhay50b21jYXQudXJsPgorICAgICAgICA8bWVtbGVhay50b21jYXQuemlwPiR7bWVtbGVhay50bXBkaXJ9L21lbWxlYWstdGVzdC10b21jYXQtJHttZW1sZWFrLnRvbWNhdC52ZXJzaW9ufS0ke21lbWxlYWsudGltZXN0YW1wfS56aXAKKyAgICAgICAgPC9tZW1sZWFrLnRvbWNhdC56aXA+CisgICAgICAgIDxtZW1sZWFrLnRvbWNhdC5tYXhoZWFwPiR7bWVtbGVhay5qdm0ubWF4aGVhcH08L21lbWxlYWsudG9tY2F0Lm1heGhlYXA+CisKKyAgICAgICAgPCEtLSBieSBkZWZhdWx0LCBhbGwgY29tbW9uIGV4ZWN1dGlvbnMgYXJlIGJvdW5kIHRvIHRoZSBwYWhzZSAnbm9uZScgc28gdGhhdCB0aGV5J3JlIG5vdCBleGVjdXRlZCAtLT4KKyAgICAgICAgPHBoYXNlLmNvbW1vbi5wcmUtaW50ZWdyYXRpb24tdGVzdD5ub25lPC9waGFzZS5jb21tb24ucHJlLWludGVncmF0aW9uLXRlc3Q+CisgICAgICAgIDxwaGFzZS5jb21tb24ucG9zdC1pbnRlZ3JhdGlvbi10ZXN0Pm5vbmU8L3BoYXNlLmNvbW1vbi5wb3N0LWludGVncmF0aW9uLXRlc3Q+CisKKyAgICAgICAgPCEtLSBieSBkZWZhdWx0LCByZWRlcGxveW1lbnQgZXhlY3V0aW9ucyBhcmUgYm91bmQgdG8gdGhlIHBoYXNlICdub25lJyBzbyB0aGF0IHRoZXkncmUgbm90IGV4ZWN1dGVkIC0tPgorICAgICAgICA8cGhhc2UucmVkZXBsb3ltZW50LnByZS1pbnRlZ3JhdGlvbi10ZXN0Pm5vbmU8L3BoYXNlLnJlZGVwbG95bWVudC5wcmUtaW50ZWdyYXRpb24tdGVzdD4KKyAgICAgICAgPHBoYXNlLnJlZGVwbG95bWVudC5pbnRlZ3JhdGlvbi10ZXN0Pm5vbmU8L3BoYXNlLnJlZGVwbG95bWVudC5pbnRlZ3JhdGlvbi10ZXN0PgorICAgICAgICA8cGhhc2UucmVkZXBsb3ltZW50LnBvc3QtaW50ZWdyYXRpb24tdGVzdD5ub25lPC9waGFzZS5yZWRlcGxveW1lbnQucG9zdC1pbnRlZ3JhdGlvbi10ZXN0PgorCisgICAgICAgIDwhLS0gYnkgZGVmYXVsdCwgdGVzdC1jYXNlcyBleGVjdXRpb25zIGFyZSBib3VuZCB0byB0aGUgcGhhc2UgJ25vbmUnIHNvIHRoYXQgdGhleSdyZSBub3QgZXhlY3V0ZWQgLS0+CisgICAgICAgIDxwaGFzZS50ZXN0cy50ZXN0Pm5vbmU8L3BoYXNlLnRlc3RzLnRlc3Q+CisgICAgICAgIDxwaGFzZS50ZXN0cy5wcmUtaW50ZWdyYXRpb24tdGVzdD5ub25lPC9waGFzZS50ZXN0cy5wcmUtaW50ZWdyYXRpb24tdGVzdD4KKyAgICAgICAgPHBoYXNlLnRlc3RzLmludGVncmF0aW9uLXRlc3Q+bm9uZTwvcGhhc2UudGVzdHMuaW50ZWdyYXRpb24tdGVzdD4KKyAgICAgICAgPHBoYXNlLnRlc3RzLnBvc3QtaW50ZWdyYXRpb24tdGVzdD5ub25lPC9waGFzZS50ZXN0cy5wb3N0LWludGVncmF0aW9uLXRlc3Q+CisgICAgICAgIDxwaGFzZS50ZXN0cy52ZXJpZnk+bm9uZTwvcGhhc2UudGVzdHMudmVyaWZ5PgorICAgIDwvcHJvcGVydGllcz4KKworICAgIDxtb2R1bGVzPgorICAgICAgICA8bW9kdWxlPnJlZGVwbG95bWVudDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnRlc3QtY2FzZXM8L21vZHVsZT4KKyAgICA8L21vZHVsZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5NYW5hZ2VtZW50PgorICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJ1aWxkLWhlbHBlci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+cmVzZXJ2ZS1uZXR3b3JrLXBvcnRzPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJlc2VydmUtbmV0d29yay1wb3J0PC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPiR7cGhhc2UuY29tbW9uLnByZS1pbnRlZ3JhdGlvbi10ZXN0fTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwb3J0TmFtZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cG9ydE5hbWU+ZXh0ZXJuYWwuY29udGFpbmVyLnBvcnQuZHluYW1pYzwvcG9ydE5hbWU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcG9ydE5hbWVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsubWF2ZW48L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPHdhclBhdGg+JHtleHRlcm5hbC5jb250YWluZXIud2FyUGF0aH08L3dhclBhdGg+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29udGV4dFJvb3Q+JHtleHRlcm5hbC5jb250YWluZXIuY29udGV4dFJvb3R9PC9jb250ZXh0Um9vdD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwb3J0PiR7ZXh0ZXJuYWwuY29udGFpbmVyLnBvcnR9PC9wb3J0PgorICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KKworICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPmdmNDwvaWQ+CisgICAgICAgICAgICA8cHJvcGVydGllcz4KKyAgICAgICAgICAgICAgICA8ZXh0ZXJuYWwuY29udGFpbmVyLmxvZ0ZpbGU+CisgICAgICAgICAgICAgICAgICAgICR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2dsYXNzZmlzaDQvZ2xhc3NmaXNoL2RvbWFpbnMvbWVtbGVha190ZXN0X2RvbWFpbi9sb2dzL3NlcnZlci5sb2cKKyAgICAgICAgICAgICAgICA8L2V4dGVybmFsLmNvbnRhaW5lci5sb2dGaWxlPgorICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5NYW5hZ2VtZW50PgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YnVpbGQtaGVscGVyLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvcnROYW1lcyBjb21iaW5lLmNoaWxkcmVuPSJhcHBlbmQiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBvcnROYW1lPm1lbWxlYWsuZ2xhc3NmaXNoLmFkbWluUG9ydC5keW5hbWljPC9wb3J0TmFtZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9wb3J0TmFtZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLm1hdmVuPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFkbWluUG9ydD4ke21lbWxlYWsuZ2xhc3NmaXNoLmFkbWluUG9ydH08L2FkbWluUG9ydD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpc3RVcmw+JHttZW1sZWFrLmdsYXNzZmlzaC51cmx9PC9kaXN0VXJsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGlzdFRhcmdldExvY2F0aW9uPiR7bWVtbGVhay5nbGFzc2Zpc2guemlwfTwvZGlzdFRhcmdldExvY2F0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGlzdFN1YmRpcj5nbGFzc2Zpc2g0PC9kaXN0U3ViZGlyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF4SGVhcD4ke21lbWxlYWsuZ2xhc3NmaXNoLm1heGhlYXB9PC9tYXhIZWFwPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5nZjQtZG93bmxvYWQ8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmRvd25sb2FkR2Y0PC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT4ke3BoYXNlLmNvbW1vbi5wcmUtaW50ZWdyYXRpb24tdGVzdH08L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5nZjQtc3RhcnQtYW5kLWRlcGxveTwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+c3RhcnRBbmREZXBsb3lHZjQ8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPiR7cGhhc2UuY29tbW9uLnByZS1pbnRlZ3JhdGlvbi10ZXN0fTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmdmNC11bmRlcGxveS1hbmQtc3RvcDwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+c3RvcEdmNDwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+JHtwaGFzZS5jb21tb24ucG9zdC1pbnRlZ3JhdGlvbi10ZXN0fTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5NYW5hZ2VtZW50PgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD53bHM8L2lkPgorICAgICAgICAgICAgPHByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgPGV4dGVybmFsLmNvbnRhaW5lci5sb2dGaWxlPgorICAgICAgICAgICAgICAgICAgICAke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS93bHMxMjIxMC9tZW1sZWFrX3Rlc3RfZG9tYWluL3dscy5sb2cKKyAgICAgICAgICAgICAgICA8L2V4dGVybmFsLmNvbnRhaW5lci5sb2dGaWxlPgorICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5NYW5hZ2VtZW50PgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsubWF2ZW48L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXN0VXJsPiR7bWVtbGVhay53bHMudXJsfTwvZGlzdFVybD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpc3RUYXJnZXRMb2NhdGlvbj4ke21lbWxlYWsud2xzLmphcn08L2Rpc3RUYXJnZXRMb2NhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpc3RTdWJkaXI+d2xzMTIyMTA8L2Rpc3RTdWJkaXI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXhIZWFwPiR7bWVtbGVhay53bHMubWF4aGVhcH08L21heEhlYXA+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPndscy1kb3dubG9hZDwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+ZG93bmxvYWRXbHM8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPiR7cGhhc2UuY29tbW9uLnByZS1pbnRlZ3JhdGlvbi10ZXN0fTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPndscy1kZXBsb3k8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnN0YXJ0QW5kRGVwbG95V2xzPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT4ke3BoYXNlLmNvbW1vbi5wcmUtaW50ZWdyYXRpb24tdGVzdH08L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD53bHMtc3RvcDwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+c3RvcFdsczwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+JHtwaGFzZS5jb21tb24ucG9zdC1pbnRlZ3JhdGlvbi10ZXN0fTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5NYW5hZ2VtZW50PgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD50b21jYXQ8L2lkPgorICAgICAgICAgICAgPHByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgPGV4dGVybmFsLmNvbnRhaW5lci5sb2dGaWxlPgorICAgICAgICAgICAgICAgICAgICAke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9hcGFjaGUtdG9tY2F0LSR7bWVtbGVhay50b21jYXQudmVyc2lvbn0vbG9ncy9jYXRhbGluYS5vdXQKKyAgICAgICAgICAgICAgICA8L2V4dGVybmFsLmNvbnRhaW5lci5sb2dGaWxlPgorICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5NYW5hZ2VtZW50PgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsubWF2ZW48L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXN0VXJsPiR7bWVtbGVhay50b21jYXQudXJsfTwvZGlzdFVybD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpc3RUYXJnZXRMb2NhdGlvbj4ke21lbWxlYWsudG9tY2F0LnppcH08L2Rpc3RUYXJnZXRMb2NhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpc3RTdWJkaXI+YXBhY2hlLXRvbWNhdC0ke21lbWxlYWsudG9tY2F0LnZlcnNpb259PC9kaXN0U3ViZGlyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF4SGVhcD4ke21lbWxlYWsudG9tY2F0Lm1heGhlYXB9PC9tYXhIZWFwPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD50b21jYXQtZG93bmxvYWQ8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmRvd25sb2FkVG9tY2F0PC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT4ke3BoYXNlLmNvbW1vbi5wcmUtaW50ZWdyYXRpb24tdGVzdH08L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD50b21jYXQtZGVwbG95PC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5zdGFydEFuZERlcGxveVRvbWNhdDwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+JHtwaGFzZS5jb21tb24ucHJlLWludGVncmF0aW9uLXRlc3R9PC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+dG9tY2F0LXN0b3A8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnN0b3BUb21jYXQ8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPiR7cGhhc2UuY29tbW9uLnBvc3QtaW50ZWdyYXRpb24tdGVzdH08L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKworCisgICAgICAgIDwhLS0gcHJvZmlsZXMgdGhhdCBoZWxwIHNldCAke21lbWxlYWsudG1wZGlyfSBiYXNlZCBvbiBlbnZpcm9ubWVudCAtLT4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+bWVtbGVhay1lbnYtdG1wZGlyPC9pZD4KKyAgICAgICAgICAgIDxhY3RpdmF0aW9uPgorICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KKyAgICAgICAgICAgICAgICAgICAgPG5hbWU+ZW52LlRNUERJUjwvbmFtZT4KKyAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgorICAgICAgICAgICAgPC9hY3RpdmF0aW9uPgorICAgICAgICAgICAgPHByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgPG1lbWxlYWsudG1wZGlyPiR7ZW52LlRNUERJUn08L21lbWxlYWsudG1wZGlyPgorICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPm1lbWxlYWstZW52LXRtcDwvaWQ+CisgICAgICAgICAgICA8YWN0aXZhdGlvbj4KKyAgICAgICAgICAgICAgICA8cHJvcGVydHk+CisgICAgICAgICAgICAgICAgICAgIDxuYW1lPmVudi5UTVA8L25hbWU+CisgICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KKyAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KKyAgICAgICAgICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgIDxtZW1sZWFrLnRtcGRpcj4ke2Vudi5UTVB9PC9tZW1sZWFrLnRtcGRpcj4KKyAgICAgICAgICAgIDwvcHJvcGVydGllcz4KKyAgICAgICAgPC9wcm9maWxlPgorCisgICAgPC9wcm9maWxlcz4KKworICAgIDxkZXBlbmRlbmN5TWFuYWdlbWVudD4KKyAgICAgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1lbWxlYWstdGVzdC1jb21tb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXk8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWJvbTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke21lbWxlYWsuamVyc2V5LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgICAgICA8c2NvcGU+aW1wb3J0PC9zY29wZT4KKyAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPC9kZXBlbmRlbmNpZXM+CisgICAgPC9kZXBlbmRlbmN5TWFuYWdlbWVudD4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvbWVtLWxlYWtzL3JlZGVwbG95bWVudC9wb20ueG1sIGIvdGVzdHMvbWVtLWxlYWtzL3JlZGVwbG95bWVudC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMmY4NzIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tZW0tbGVha3MvcmVkZXBsb3ltZW50L3BvbS54bWwKQEAgLTAsMCArMSwxODcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMubWVtbGVha3M8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5tZW1sZWFrcy5yZWRlcGxveW1lbnQ8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1tZW1sZWFrLXJlZGVwbG95bWVudDwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgTWVtb3J5IGxlYWtzIHJlZGVwbG95bWVudCB0ZXN0LgorCisgICAgICAgIFRoaXMgbW9kdWxlIChhbmQgYWxsIHN1Yi1tb2R1bGVzKSBjb21iaW5lIGNvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luIGdvYWxzICgnZG93bmxvYWQnLCAnc3RhcnRBbmREZXBsb3knLCAnc3RvcCcpIHdpdGgKKyAgICAgICAgJ3JlZGVwbG95JyBnb2FsIHdoaWNoIHJlcGV0aXRpdmVseSByZWRlcGxveXMgYW5kIHRlc3RzIHdpdGggYSBzaW5nbGUgaHR0cCByZXF1ZXN0IHRoZSBkZXBsb3llZCBhcHBsaWNhdGlvbi4KKworICAgICAgICBUbyBidWlsZCBhbGwgdGhlIG1vZHVsZXMgaW4gdGhlIHJlZGVwbG95bWVudCBzdWItbW9kdWxlLCBydW46CisKKyAgICAgICAgbXZuIGNsZWFuIGluc3RhbGwgLWFtZCAtcGwgdGVzdHMvbWVtLWxlYWtzLyAtUCB0b21jYXQsbWVtbGVhay1yZWRlcGxveW1lbnQgLWZhZQorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPCEtLSBieSBkZWZhdWx0LCBib3VuZCB0byAnbm9uZScgcGhhc2U7IGlmICdtZW1sZWFrLXJlZGVwbG95bWVudCcgcHJvZmlsZSBhY3RpdmUsIHRoZXkncmUgYWN0aXZhdGVkIC0tPgorICAgICAgICA8cGhhc2UuY29tbW9uLnByZS1pbnRlZ3JhdGlvbi10ZXN0PiR7cGhhc2UucmVkZXBsb3ltZW50LnByZS1pbnRlZ3JhdGlvbi10ZXN0fTwvcGhhc2UuY29tbW9uLnByZS1pbnRlZ3JhdGlvbi10ZXN0PgorICAgICAgICA8cGhhc2UuY29tbW9uLnBvc3QtaW50ZWdyYXRpb24tdGVzdD4ke3BoYXNlLnJlZGVwbG95bWVudC5wb3N0LWludGVncmF0aW9uLXRlc3R9PC9waGFzZS5jb21tb24ucG9zdC1pbnRlZ3JhdGlvbi10ZXN0PgorICAgIDwvcHJvcGVydGllcz4KKworICAgIDxtb2R1bGVzPgorICAgICAgICA8bW9kdWxlPnJlZGVwbG95bWVudC1sZWFraW5nLXRlc3QtYXBwPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+cmVkZXBsb3ltZW50LWhlbGxvLXdvcmxkLWFwcC1yZWY8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5yZWRlcGxveW1lbnQtbm8tamVyc2V5LWFwcDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnJlZGVwbG95bWVudC10aHJlYWRsb2NhbHMtYXBwPC9tb2R1bGU+CisgICAgPC9tb2R1bGVzPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5tZW1sZWFrLXJlZGVwbG95bWVudDwvaWQ+CisgICAgICAgICAgICA8cHJvcGVydGllcz4KKyAgICAgICAgICAgICAgICA8IS0tIHNldCBhbGwgdGhlIHBoYXNlcyBmb3IgdGhpcyBzdWItbW9kdWxlIHRyZWUgc28gdGhhdCB0aGUgZXhlY3V0aW9ucyBhcmUgdW4tYm91bmQgZnJvbSB0aGUgJ25vbmUnIHBoYXNlIC0tPgorICAgICAgICAgICAgICAgIDxwaGFzZS5yZWRlcGxveW1lbnQucHJlLWludGVncmF0aW9uLXRlc3Q+cHJlLWludGVncmF0aW9uLXRlc3Q8L3BoYXNlLnJlZGVwbG95bWVudC5wcmUtaW50ZWdyYXRpb24tdGVzdD4KKyAgICAgICAgICAgICAgICA8cGhhc2UucmVkZXBsb3ltZW50LmludGVncmF0aW9uLXRlc3Q+aW50ZWdyYXRpb24tdGVzdDwvcGhhc2UucmVkZXBsb3ltZW50LmludGVncmF0aW9uLXRlc3Q+CisgICAgICAgICAgICAgICAgPHBoYXNlLnJlZGVwbG95bWVudC5wb3N0LWludGVncmF0aW9uLXRlc3Q+cG9zdC1pbnRlZ3JhdGlvbi10ZXN0PC9waGFzZS5yZWRlcGxveW1lbnQucG9zdC1pbnRlZ3JhdGlvbi10ZXN0PgorICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5NYW5hZ2VtZW50PgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsubWF2ZW48L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gdGhlc2UgdGhyZWUgbWVtbGVhay5yZWRlcGxveS4qIHByb3BlcnRpZXMgc2hvdWxkIGJlIGluaXRpYWxpemVkIGJ5IHN1Yi1tb2R1bGVzIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhwZWN0ZWRTdGF0dXM+JHttZW1sZWFrLnJlZGVwbG95LmV4cGVjdGVkU3RhdHVzfTwvZXhwZWN0ZWRTdGF0dXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWRlcGxveUNvdW50PiR7bWVtbGVhay5yZWRlcGxveS5jb3VudH08L3JlZGVwbG95Q291bnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZXF1ZXN0UGF0aFF1ZXJ5PiR7bWVtbGVhay5yZWRlcGxveS5yZXF1ZXN0UGF0aFF1ZXJ5fTwvcmVxdWVzdFBhdGhRdWVyeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWVuZm9yY2VyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLm1hdmVuPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y3VzdG9tLWVuZm9yY2VyLXJ1bGVzPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+ZW5mb3JjZS1vdXQtb2YtbWVtb3J5LWRpZC1ub3Qtb2NjdXI8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmVuZm9yY2U8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPiR7cGhhc2UucmVkZXBsb3ltZW50LnBvc3QtaW50ZWdyYXRpb24tdGVzdH08L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJ1bGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cnVsZSBpbXBsZW1lbnRhdGlvbj0ib3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5tYXZlbi5ydWxlLkZpbGVQYXR0ZXJuRG9lc05vdEV4aXN0UnVsZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGU+JHttZW1sZWFrLmp2bS5oZWFwZHVtcGRpcn0vamF2YV9waWQqLmhwcm9mPC9maWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9maWxlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ydWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cnVsZSBpbXBsZW1lbnRhdGlvbj0ib3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5tYXZlbi5ydWxlLlBhdHRlcm5Ob3RNYXRjaGVkSW5GaWxlUnVsZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsZT4ke2V4dGVybmFsLmNvbnRhaW5lci5sb2dGaWxlfTwvZmlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwYXR0ZXJuPi4qamF2YVwubGFuZ1wuT3V0T2ZNZW1vcnlFcnJvci4qPC9wYXR0ZXJuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3J1bGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ydWxlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmFpbD50cnVlPC9mYWlsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKworICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD53bHM8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5NYW5hZ2VtZW50PgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsubWF2ZW48L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+d2xzLXJlZGVwbG95PC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5yZWRlcGxveVdsczwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+JHtwaGFzZS5yZWRlcGxveW1lbnQuaW50ZWdyYXRpb24tdGVzdH08L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+Z2Y0PC9pZD4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLm1hdmVuPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmdmNC1yZWRlcGxveTwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cmVkZXBsb3lHZjQ8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPiR7cGhhc2UucmVkZXBsb3ltZW50LmludGVncmF0aW9uLXRlc3R9PC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnRvbWNhdDwvaWQ+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5tYXZlbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD50b21jYXQtcmVkZXBsb3k8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPnJlZGVwbG95VG9tY2F0PC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT4ke3BoYXNlLnJlZGVwbG95bWVudC5pbnRlZ3JhdGlvbi10ZXN0fTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5NYW5hZ2VtZW50PgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL21lbS1sZWFrcy9yZWRlcGxveW1lbnQvcmVkZXBsb3ltZW50LWhlbGxvLXdvcmxkLWFwcC1yZWYvcG9tLnhtbCBiL3Rlc3RzL21lbS1sZWFrcy9yZWRlcGxveW1lbnQvcmVkZXBsb3ltZW50LWhlbGxvLXdvcmxkLWFwcC1yZWYvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjJmYjZiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWVtLWxlYWtzL3JlZGVwbG95bWVudC9yZWRlcGxveW1lbnQtaGVsbG8td29ybGQtYXBwLXJlZi9wb20ueG1sCkBAIC0wLDAgKzEsMTM5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLm1lbWxlYWtzLnJlZGVwbG95bWVudDwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPnJlZGVwbG95bWVudC1oZWxsby13b3JsZC1hcHAtcmVmPC9hcnRpZmFjdElkPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1tZW1sZWFrLXJlZGVwbG95bWVudC1oZWxsby13b3JsZC1hcHAtcmVmPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBNYXZlbiBtb2R1bGUgdGhhdCB0ZXN0cyA6aGVsbG93b3JsZC13ZWJhcHA6d2FyIGluIG9yZGVyIHRvIHByZXZlbnQgcmVncmVzc2lvbiBvZiBhIHByb2JsZW0gd2hlcmUgYSByZXBldGl0aXZlIHJlZGVwbG95bWVudAorICAgICAgICBtYXkgaGF2ZSBjYXVzZWQgbWVtb3J5IGxlYWtzLgorCisgICAgICAgIFRvIHJ1biB0aGlzIHRlc3QsIGV4ZWN1dGUgZnJvbSBKZXJzZXkgcm9vdCBkaXI6CisKKyAgICAgICAgWzFdIEdsYXNzZmlzaDogbXZuIGluc3RhbGwgLWFtIC1wbCA6cmVkZXBsb3ltZW50LWhlbGxvLXdvcmxkLWFwcC1yZWYgLVAgZ2Y0LG1lbWxlYWstcmVkZXBsb3ltZW50CisKKyAgICAgICAgWzJdIFdlYmxvZ2ljOiBtdm4gaW5zdGFsbCAtYW0gLXBsIDpyZWRlcGxveW1lbnQtaGVsbG8td29ybGQtYXBwLXJlZiAtUCB3bHMsbWVtbGVhay1yZWRlcGxveW1lbnQKKworICAgICAgICBbM10gVG9tY2F0OiBtdm4gaW5zdGFsbCAtYW0gLXBsIDpyZWRlcGxveW1lbnQtaGVsbG8td29ybGQtYXBwLXJlZiAtUCB0b21jYXQsbWVtbGVhay1yZWRlcGxveW1lbnQKKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxtZW1sZWFrLmp2bS5tYXhoZWFwPjI1Nm08L21lbWxlYWsuanZtLm1heGhlYXA+CisgICAgICAgIDxtZW1sZWFrLnRvbWNhdC5tYXhoZWFwPjU2bTwvbWVtbGVhay50b21jYXQubWF4aGVhcD4KKworICAgICAgICA8ZXh0ZXJuYWwuY29udGFpbmVyLndhclBhdGg+JHtvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlczpoZWxsb3dvcmxkLXdlYmFwcDp3YXJ9PC9leHRlcm5hbC5jb250YWluZXIud2FyUGF0aD4KKyAgICAgICAgPGV4dGVybmFsLmNvbnRhaW5lci5jb250ZXh0Um9vdD5oZWxsb3dvcmxkLXdlYmFwcDwvZXh0ZXJuYWwuY29udGFpbmVyLmNvbnRleHRSb290PgorCisgICAgICAgIDxtZW1sZWFrLnJlZGVwbG95LmNvdW50PjIwMDwvbWVtbGVhay5yZWRlcGxveS5jb3VudD4KKyAgICAgICAgPG1lbWxlYWsucmVkZXBsb3kuZXhwZWN0ZWRTdGF0dXM+MjAwPC9tZW1sZWFrLnJlZGVwbG95LmV4cGVjdGVkU3RhdHVzPgorICAgICAgICA8bWVtbGVhay5yZWRlcGxveS5yZXF1ZXN0UGF0aFF1ZXJ5PiR7ZXh0ZXJuYWwuY29udGFpbmVyLmNvbnRleHRSb290fS9oZWxsb3dvcmxkPC9tZW1sZWFrLnJlZGVwbG95LnJlcXVlc3RQYXRoUXVlcnk+CisgICAgPC9wcm9wZXJ0aWVzPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD50b21jYXQ8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZW5mb3JjZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmVuZm9yY2UtdGhyZWFkbG9jYWxzLWxlZnQtY2xlYW5lZDwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmVuZm9yY2U8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT4ke3BoYXNlLnJlZGVwbG95bWVudC5wb3N0LWludGVncmF0aW9uLXRlc3R9PC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGFzc3VyZSB0aGF0IFRvbWNhdCBUaHJlYWRMb2NhbCBtZW1vcnkgbGVhayBkZXRlY3Rpb24gbWVzc2FnZXMgd2VyZW4ndCBpbmNsdWRlZCBpbiB0aGUgVG9tY2F0IG91dHB1dC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHNvLCBUaHJlYWRMb2NhbHMgYXJlbid0IGtlcHQgY2xlYW4gYW5kIHRoYXQncyB3aGF0IHVzZXJzIGRvIG5vdCBsaWtlIChzZWUgSkVSU0VZLTI4OTApLiAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxydWxlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cnVsZSBpbXBsZW1lbnRhdGlvbj0ib3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5tYXZlbi5ydWxlLlBhdHRlcm5Ob3RNYXRjaGVkSW5GaWxlUnVsZSI+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlPiR7ZXh0ZXJuYWwuY29udGFpbmVyLmxvZ0ZpbGV9PC9maWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0dGVybj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhW0NEQVRBWy4qU0VWRVJFLipUaGUgd2ViIGFwcGxpY2F0aW9uLipjcmVhdGVkIGEgVGhyZWFkTG9jYWwgd2l0aCBrZXkuKmF2b2lkIGEgcHJvYmFibGUgbWVtb3J5IGxlYWsuKl1dPjwvcGF0dGVybj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1heE1hdGNoZWRMaW5lcz4zPC9tYXhNYXRjaGVkTGluZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ydWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ydWxlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmYWlsPnRydWU8L2ZhaWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5tZW1sZWFrLXJlcHJvZHVjZXI8L2lkPgorICAgICAgICAgICAgPHByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgPG1lbWxlYWsuamVyc2V5LnZlcnNpb24+Mi4xOTwvbWVtbGVhay5qZXJzZXkudmVyc2lvbj4KKyAgICAgICAgICAgIDwvcHJvcGVydGllcz4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5idWlsZC1oZWxwZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLm1hdmVuPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1lbmZvcmNlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKworICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBlbmRlbmN5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5yZXNvbHZlLW1hdmVuLWRlcGVuZGVuY2llczwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cHJvcGVydGllczwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorCisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4YW1wbGVzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGVsbG93b3JsZC13ZWJhcHA8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dHlwZT53YXI8L3R5cGU+CisgICAgICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL21lbS1sZWFrcy9yZWRlcGxveW1lbnQvcmVkZXBsb3ltZW50LWxlYWtpbmctdGVzdC1hcHAvcG9tLnhtbCBiL3Rlc3RzL21lbS1sZWFrcy9yZWRlcGxveW1lbnQvcmVkZXBsb3ltZW50LWxlYWtpbmctdGVzdC1hcHAvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTFiNTcyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWVtLWxlYWtzL3JlZGVwbG95bWVudC9yZWRlcGxveW1lbnQtbGVha2luZy10ZXN0LWFwcC9wb20ueG1sCkBAIC0wLDAgKzEsMTQzIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLm1lbWxlYWtzLnJlZGVwbG95bWVudDwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPnJlZGVwbG95bWVudC1sZWFraW5nLXRlc3QtYXBwPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLW1lbWxlYWstcmVkZXBsb3ltZW50LWxlYWtpbmctdGVzdC1hcHA8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIEFuIGV4YW1wbGUgYXBwbGljYXRpb24gdGhhdCBjYXVzZXMgYSBtZW1vcnkgbGVhayBpbiB0aGUgY29udGFpbmVyIHdoZXJlIGl0J3MgYmVpbmcgcmVwZXRpdGl2ZWx5IHJlZGVwbG95ZWQuCisKKworICAgICAgICBUbyBydW4gdGhpcyBleGFtcGxlLCBleGVjdXRlIGZyb20gamVyc2V5IHJvb3QgZGlyOgorCisgICAgICAgIFsxXSBHbGFzc2Zpc2g6IG12biBjbGVhbiBpbnN0YWxsIC1wbCA6cmVkZXBsb3ltZW50LWxlYWtpbmctdGVzdC1hcHAgLVAgZ2Y0LG1lbWxlYWstbGVha2luZy10ZXN0LG1lbWxlYWstcmVkZXBsb3ltZW50CisKKyAgICAgICAgWzJdIFdlYmxvZ2ljOiBtdm4gY2xlYW4gaW5zdGFsbCAtcGwgOnJlZGVwbG95bWVudC1sZWFraW5nLXRlc3QtYXBwIC1QIHdscyxtZW1sZWFrLWxlYWtpbmctdGVzdCxtZW1sZWFrLXJlZGVwbG95bWVudAorCisgICAgICAgIFszXSBUb21jYXQ6IG12biBjbGVhbiBpbnN0YWxsIC1wbCA6cmVkZXBsb3ltZW50LWxlYWtpbmctdGVzdC1hcHAgLVAgdG9tY2F0LG1lbWxlYWstbGVha2luZy10ZXN0LG1lbWxlYWstcmVkZXBsb3ltZW50CisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8bWVtbGVhay5qdm0ubWF4aGVhcD4yNTZtPC9tZW1sZWFrLmp2bS5tYXhoZWFwPgorCisgICAgICAgIDxtZW1sZWFrLnJlZGVwbG95LmNvdW50PjEwMDwvbWVtbGVhay5yZWRlcGxveS5jb3VudD4KKyAgICAgICAgPG1lbWxlYWsucmVkZXBsb3kuZXhwZWN0ZWRTdGF0dXM+MjAwPC9tZW1sZWFrLnJlZGVwbG95LmV4cGVjdGVkU3RhdHVzPgorICAgICAgICA8bWVtbGVhay5yZWRlcGxveS5yZXF1ZXN0UGF0aFF1ZXJ5PiR7ZXh0ZXJuYWwuY29udGFpbmVyLmNvbnRleHRSb290fS9pbnZva2U/c2l6ZT0yMDAwMDAwMDwvbWVtbGVhay5yZWRlcGxveS5yZXF1ZXN0UGF0aFF1ZXJ5PgorCisgICAgPC9wcm9wZXJ0aWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLm1hdmVuPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8bWV0aG9kPlBPU1Q8L21ldGhvZD4KKyAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+CisKKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1lbmZvcmNlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+ZW5mb3JjZS1vdXQtb2YtbWVtb3J5LWRpZC1ub3Qtb2NjdXI8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPm5vbmU8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZ3JpenpseTI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWVtbGVhay10ZXN0LWNvbW1vbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5ndWF2YTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmd1YXZhPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+bWVtbGVhay1sZWFraW5nLXRlc3Q8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5idWlsZC1oZWxwZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLm1hdmVuPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZW5mb3JjZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmVuZm9yY2Utb3V0LW9mLW1lbW9yeS1kaWQtbm90LW9jY3VyPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPiR7cGhhc2UucmVkZXBsb3ltZW50LnBvc3QtaW50ZWdyYXRpb24tdGVzdH08L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvbWVtLWxlYWtzL3JlZGVwbG95bWVudC9yZWRlcGxveW1lbnQtbGVha2luZy10ZXN0LWFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL21lbWxlYWtzL3Rlc3RsZWFrL0RhZW1vblRocmVhZE1lbW9yeUxlYWtpbmdSZXNvdXJjZS5qYXZhIGIvdGVzdHMvbWVtLWxlYWtzL3JlZGVwbG95bWVudC9yZWRlcGxveW1lbnQtbGVha2luZy10ZXN0LWFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL21lbWxlYWtzL3Rlc3RsZWFrL0RhZW1vblRocmVhZE1lbW9yeUxlYWtpbmdSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NWRlNGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tZW0tbGVha3MvcmVkZXBsb3ltZW50L3JlZGVwbG95bWVudC1sZWFraW5nLXRlc3QtYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvbWVtbGVha3MvdGVzdGxlYWsvRGFlbW9uVGhyZWFkTWVtb3J5TGVha2luZ1Jlc291cmNlLmphdmEKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5tZW1sZWFrcy50ZXN0bGVhazsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yczsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5GdXR1cmU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5EZWZhdWx0VmFsdWU7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnV0aWwuY29uY3VycmVudC5UaHJlYWRGYWN0b3J5QnVpbGRlcjsKKworLyoqCisgKiBSZXNvdXJjZSB0aGF0IGNhdXNlcyB7QGxpbmsgT3V0T2ZNZW1vcnlFcnJvcn0gZXhjZXB0aW9uIHVwb24gcmVwZXRpdGl2ZSBjYWxsIG9mIHtAbGluayAjaW52b2tlKGludCl9IG9mIGFuIGFwcGxpY2F0aW9uIHRoYXQgaXMKKyAqIGJlaW5nIHJlZGVwbG95ZWQuCisgKiA8cC8+CisgKiBUaGUgcHVycG9zZSBvZiB0aGlzIHJlc291cmNlIChhbmQgdGhlIGFwcCkgaXMgdG8gdGVzdCB3aGV0aGVyIHRoZSBtZW1vcnkgbGVha2luZyBpbmZyYXN0cnVjdHVyZSBmb3IgcmVkZXBsb3ltZW50IHNjZW5hcmlvcworICogd29ya3MuCisgKgorICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYSBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiLyIpCitAU2luZ2xldG9uCitwdWJsaWMgY2xhc3MgRGFlbW9uVGhyZWFkTWVtb3J5TGVha2luZ1Jlc291cmNlIHsKKworICAgIEBQT1NUCisgICAgQFBhdGgoImludm9rZSIpCisgICAgcHVibGljIFN0cmluZyBpbnZva2UoQERlZmF1bHRWYWx1ZSgiMTA0ODU3NiIpIEBRdWVyeVBhcmFtKCJzaXplIikgZmluYWwgaW50IHNpemUpIHsKKworICAgICAgICBmaW5hbCBGdXR1cmU8Pz4gZnV0dXJlID0gRXhlY3V0b3JzLm5ld1NpbmdsZVRocmVhZEV4ZWN1dG9yKG5ldyBUaHJlYWRGYWN0b3J5QnVpbGRlcigpLnNldERhZW1vbih0cnVlKS5idWlsZCgpKQorICAgICAgICAgICAgICAgIC5zdWJtaXQobmV3IFJ1bm5hYmxlKCkgeworICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJ1bm5pbmcgYSBUaHJlYWQhIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG1ieXRlcyA9IHNpemUgLyAoMTAyNCAqIDEwMjQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJ5dGVbXVtdIGJ5dGVzID0gbmV3IGJ5dGVbbWJ5dGVzXVtdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG1ieXRlczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzW2kgLSAxXSA9IG5ldyBieXRlWzEwMjQgKiAxMDI0XTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJBbGxvY2F0ZWQ6ICIgKyBpICsgIk1CISIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiTWVtb3J5IGFsbG9jYXRlZCEgVG90YWw6ICIgKyBtYnl0ZXMgKyAiTUIhIFNsZWVwaW5nLi4uIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwMDAwOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUaHJlYWQgIiArIFRocmVhZC5jdXJyZW50VGhyZWFkKCkgKyAiIHNsZWVwaW5nISIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwMDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZyZWVpbmc6ICIgKyBzaXplICsgIiBvZiBieXRlcy4gIiArIGJ5dGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaHJlYWQgSW50ZXJydXB0ZWQhIiwgZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJUcnlpbmcgdG8gYWxsb2NhdGUgYnl0ZXMgZnJvbSB0aGUgdGhyZWFkIGl0c2VsZi4iKTsKKyAgICAgICAgZmluYWwgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbc2l6ZV07CisgICAgICAgIHJldHVybiAiRnV0dXJlIHN1Ym1pdHRlZDogIiArIGZ1dHVyZSArICIgYnl0ZXMgYWxsb2NhdGVkOiAiICsgYnl0ZXM7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJoZWxsbyIpCisgICAgQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKKyAgICBwdWJsaWMgU3RyaW5nIGhlbGxvV29ybGQoKSB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSEVMTE8gV09STEQhIik7CisgICAgICAgIHJldHVybiAiSEVMTE8gV09STEQhIjsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21lbS1sZWFrcy9yZWRlcGxveW1lbnQvcmVkZXBsb3ltZW50LWxlYWtpbmctdGVzdC1hcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9tZW1sZWFrcy90ZXN0bGVhay9UZXN0QXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL21lbS1sZWFrcy9yZWRlcGxveW1lbnQvcmVkZXBsb3ltZW50LWxlYWtpbmctdGVzdC1hcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9tZW1sZWFrcy90ZXN0bGVhay9UZXN0QXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDY4NzEzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWVtLWxlYWtzL3JlZGVwbG95bWVudC9yZWRlcGxveW1lbnQtbGVha2luZy10ZXN0LWFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL21lbWxlYWtzL3Rlc3RsZWFrL1Rlc3RBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMubWVtbGVha3MudGVzdGxlYWs7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKKy8qKgorICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYSBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgVGVzdEFwcGxpY2F0aW9uIGV4dGVuZHMgUmVzb3VyY2VDb25maWcgeworCisgICAgcHVibGljIFRlc3RBcHBsaWNhdGlvbigpIHsKKyAgICAgICAgcmVnaXN0ZXIoRGFlbW9uVGhyZWFkTWVtb3J5TGVha2luZ1Jlc291cmNlLmNsYXNzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tZW0tbGVha3MvcmVkZXBsb3ltZW50L3JlZGVwbG95bWVudC1sZWFraW5nLXRlc3QtYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9tZW0tbGVha3MvcmVkZXBsb3ltZW50L3JlZGVwbG95bWVudC1sZWFraW5nLXRlc3QtYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIyOWJkMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21lbS1sZWFrcy9yZWRlcGxveW1lbnQvcmVkZXBsb3ltZW50LWxlYWtpbmctdGVzdC1hcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDM3IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjIuNSIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1hcHBfMl81LnhzZCIKKyAgICAgICAgbWV0YWRhdGEtY29tcGxldGU9InRydWUiPgorCisgICAgPGZpbHRlcj4KKyAgICAgICAgPGZpbHRlci1uYW1lPmplcnNleTwvZmlsdGVyLW5hbWU+CisgICAgICAgIDxmaWx0ZXItY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9maWx0ZXItY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMubWVtbGVha3MudGVzdGxlYWsuVGVzdEFwcGxpY2F0aW9uPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgIDwvZmlsdGVyPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+amVyc2V5PC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvbWVtLWxlYWtzL3JlZGVwbG95bWVudC9yZWRlcGxveW1lbnQtbm8tamVyc2V5LWFwcC9wb20ueG1sIGIvdGVzdHMvbWVtLWxlYWtzL3JlZGVwbG95bWVudC9yZWRlcGxveW1lbnQtbm8tamVyc2V5LWFwcC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2ZjkyNGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tZW0tbGVha3MvcmVkZXBsb3ltZW50L3JlZGVwbG95bWVudC1uby1qZXJzZXktYXBwL3BvbS54bWwKQEAgLTAsMCArMSwxNDUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisKKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5tZW1sZWFrcy5yZWRlcGxveW1lbnQ8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5yZWRlcGxveW1lbnQtbm8tamVyc2V5LWFwcDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1tZW1sZWFrLXJlZGVwbG95bWVudC1uby1qZXJzZXktYXBwPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBSZXByb2R1Y2VyIG9mIEhLMi0yNDcsIEhLMi0yNjQKKworICAgICAgICBPbiBzb21lIHBsYXRmb3JtcywgcmVkZXBsb3ltZW50IG9mIHRoaXMgYXBwbGljYXRpb24gZG9lcyBub3QgY2F1c2UgYSBtZW1vcnkgbGVhay4gSG93ZXZlciwgc2V2ZXJhbCBISzIgaW5zdGFuY2VzIGFyZSBsZWZ0CisgICAgICAgIGluIHRoZSBjb250YWluZXIgKHJlZmVyZW5jZWQgZnJvbSBUaHJlYWRMb2NhbHMpLCB3aGljaCBpcyB3aGF0IGlzIHRlc3RlZCAob24gVG9tY2F0IG9ubHkpLgorCisgICAgICAgIFtFeGVjdXRpb24gY29tbWFuZHNdCisKKyAgICAgICAgU2hvdWxkIG5vdCBmYWlsOiBtdm4gLXBsIDpyZWRlcGxveW1lbnQtbm8tamVyc2V5LWFwcCBjbGVhbiBpbnN0YWxsIC1QIHRvbWNhdCxtZW1sZWFrLXJlZGVwbG95bWVudAorCisgICAgICAgIFNob3VsZCBmYWlsOiBtdm4gLXBsIDpyZWRlcGxveW1lbnQtbm8tamVyc2V5LWFwcCBjbGVhbiBpbnN0YWxsIC1QIHRvbWNhdCxtZW1sZWFrLXJlZGVwbG95bWVudCxtZW1sZWFrLXJlcHJvZHVjZXIKKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxtZW1sZWFrLmp2bS5tYXhoZWFwPjE5Mm08L21lbWxlYWsuanZtLm1heGhlYXA+CisgICAgICAgIDxleHRlcm5hbC5jb250YWluZXIuY29udGV4dFJvb3Q+bm8tamVyc2V5LXNlcnZpY2U8L2V4dGVybmFsLmNvbnRhaW5lci5jb250ZXh0Um9vdD4KKworICAgICAgICA8bWVtbGVhay5yZWRlcGxveS5jb3VudD41MDA8L21lbWxlYWsucmVkZXBsb3kuY291bnQ+CisgICAgICAgIDxtZW1sZWFrLnJlZGVwbG95LmV4cGVjdGVkU3RhdHVzPjIwMDwvbWVtbGVhay5yZWRlcGxveS5leHBlY3RlZFN0YXR1cz4KKyAgICAgICAgPG1lbWxlYWsucmVkZXBsb3kucmVxdWVzdFBhdGhRdWVyeT4ke2V4dGVybmFsLmNvbnRhaW5lci5jb250ZXh0Um9vdH08L21lbWxlYWsucmVkZXBsb3kucmVxdWVzdFBhdGhRdWVyeT4KKyAgICA8L3Byb3BlcnRpZXM+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnRvbWNhdDwvaWQ+CisgICAgICAgICAgICA8cHJvcGVydGllcz4KKyAgICAgICAgICAgICAgICA8bWVtbGVhay5qdm0ubWF4aGVhcD40Mm08L21lbWxlYWsuanZtLm1heGhlYXA+CisgICAgICAgICAgICAgICAgPCEtLSBvbiBUb21jYXQsIHdlIGNhbiByZWx5IG9uIHRoZSBsb2cgcmVjb3JkIHdoaWNoIGlzIGRldGVjdGVkIGJlbGxvdyBieSBtYXZlbi1lbmZvcmNlci1wbHVnaW4gLS0+CisgICAgICAgICAgICAgICAgPG1lbWxlYWsucmVkZXBsb3kuY291bnQ+MTwvbWVtbGVhay5yZWRlcGxveS5jb3VudD4KKyAgICAgICAgICAgIDwvcHJvcGVydGllcz4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1lbmZvcmNlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+ZW5mb3JjZS10aHJlYWRsb2NhbHMtbGVmdC1jbGVhbmVkPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5lbmZvcmNlPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT4ke3BoYXNlLnJlZGVwbG95bWVudC5wb3N0LWludGVncmF0aW9uLXRlc3R9PC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gYXNzdXJlIHRoYXQgVG9tY2F0IFRocmVhZExvY2FsIG1lbW9yeSBsZWFrIGRldGVjdGlvbiBtZXNzYWdlcyB3ZXJlbid0IGluY2x1ZGVkIGluIHRoZSBUb21jYXQgb3V0cHV0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElmIHNvLCBUaHJlYWRMb2NhbHMgYXJlbid0IGtlcHQgY2xlYW4gYW5kIHRoYXQncyB3aGF0IHVzZXJzIGRvIG5vdCBsaWtlIChzZWUgSkVSU0VZLTI4OTApLiAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cnVsZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxydWxlIGltcGxlbWVudGF0aW9uPSJvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0Lm1hdmVuLnJ1bGUuUGF0dGVybk5vdE1hdGNoZWRJbkZpbGVSdWxlIj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlPiR7ZXh0ZXJuYWwuY29udGFpbmVyLmxvZ0ZpbGV9PC9maWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdHRlcm4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCFbQ0RBVEFbLipTRVZFUkUuKlRoZSB3ZWIgYXBwbGljYXRpb24uKmNyZWF0ZWQgYSBUaHJlYWRMb2NhbCB3aXRoIGtleS4qYXZvaWQgYSBwcm9iYWJsZSBtZW1vcnkgbGVhay4qXV0+PC9wYXR0ZXJuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1heE1hdGNoZWRMaW5lcz4zPC9tYXhNYXRjaGVkTGluZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcnVsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3J1bGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmYWlsPnRydWU8L2ZhaWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5NYW5hZ2VtZW50PgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5tZW1sZWFrLXJlcHJvZHVjZXI8L2lkPgorICAgICAgICAgICAgPHByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgPGhrMi52ZXJzaW9uPjIuNS4wLWIzMDwvaGsyLnZlcnNpb24+CisgICAgICAgICAgICA8L3Byb3BlcnRpZXM+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICA8L3Byb2ZpbGVzPgorCisgICAgPGJ1aWxkPgorCisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMubW9qbzwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5idWlsZC1oZWxwZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLm1hdmVuPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1lbmZvcmNlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorCisgICAgPC9idWlsZD4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+Mi41PC92ZXJzaW9uPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guaGsyPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGsyLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guaGsyPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+aGsyLWxvY2F0b3I8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmhrMjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmhrMi11dGlsczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9tZW0tbGVha3MvcmVkZXBsb3ltZW50L3JlZGVwbG95bWVudC1uby1qZXJzZXktYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvbWVtbGVha3Mvbm9qZXJzZXkvR3JlZXRpbmdTZXJ2aWNlLmphdmEgYi90ZXN0cy9tZW0tbGVha3MvcmVkZXBsb3ltZW50L3JlZGVwbG95bWVudC1uby1qZXJzZXktYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvbWVtbGVha3Mvbm9qZXJzZXkvR3JlZXRpbmdTZXJ2aWNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRjNDIzNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21lbS1sZWFrcy9yZWRlcGxveW1lbnQvcmVkZXBsb3ltZW50LW5vLWplcnNleS1hcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9tZW1sZWFrcy9ub2plcnNleS9HcmVldGluZ1NlcnZpY2UuamF2YQpAQCAtMCwwICsxLDI3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLm1lbWxlYWtzLm5vamVyc2V5OworCitpbXBvcnQgb3JnLmp2bmV0LmhrMi5hbm5vdGF0aW9ucy5Db250cmFjdDsKKworLyoqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK0BDb250cmFjdAorcHVibGljIGludGVyZmFjZSBHcmVldGluZ1NlcnZpY2UgeworICAgIFN0cmluZyBnZXRHcmVldGluZygpOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbWVtLWxlYWtzL3JlZGVwbG95bWVudC9yZWRlcGxveW1lbnQtbm8tamVyc2V5LWFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL21lbWxlYWtzL25vamVyc2V5L0dyZWV0aW5nV3JhcHBlci5qYXZhIGIvdGVzdHMvbWVtLWxlYWtzL3JlZGVwbG95bWVudC9yZWRlcGxveW1lbnQtbm8tamVyc2V5LWFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL21lbWxlYWtzL25vamVyc2V5L0dyZWV0aW5nV3JhcHBlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0ZDBjOWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tZW0tbGVha3MvcmVkZXBsb3ltZW50L3JlZGVwbG95bWVudC1uby1qZXJzZXktYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvbWVtbGVha3Mvbm9qZXJzZXkvR3JlZXRpbmdXcmFwcGVyLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5tZW1sZWFrcy5ub2plcnNleTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLmFwaS5TZXJ2aWNlTG9jYXRvcjsKKworLyoqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBHcmVldGluZ1dyYXBwZXIgeworICAgIEdyZWV0aW5nU2VydmljZSBzZXJ2aWNlOworCisgICAgcHVibGljIEdyZWV0aW5nV3JhcHBlcihTZXJ2aWNlTG9jYXRvciBsb2NhdG9yKSB7CisgICAgICAgIHNlcnZpY2UgPSBsb2NhdG9yLmdldFNlcnZpY2UoR3JlZXRpbmdTZXJ2aWNlLmNsYXNzKTsKKyAgICB9CisKKyAgICBwdWJsaWMgU3RyaW5nIGdldEluamVjdGVkR3JlZXRpbmcoKSB7CisgICAgICAgIHJldHVybiBzZXJ2aWNlLmdldEdyZWV0aW5nKCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9tZW0tbGVha3MvcmVkZXBsb3ltZW50L3JlZGVwbG95bWVudC1uby1qZXJzZXktYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvbWVtbGVha3Mvbm9qZXJzZXkvSGVsbG9TZXJ2aWNlSW1wbC5qYXZhIGIvdGVzdHMvbWVtLWxlYWtzL3JlZGVwbG95bWVudC9yZWRlcGxveW1lbnQtbm8tamVyc2V5LWFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL21lbWxlYWtzL25vamVyc2V5L0hlbGxvU2VydmljZUltcGwuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGFhMmJmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWVtLWxlYWtzL3JlZGVwbG95bWVudC9yZWRlcGxveW1lbnQtbm8tamVyc2V5LWFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL21lbWxlYWtzL25vamVyc2V5L0hlbGxvU2VydmljZUltcGwuamF2YQpAQCAtMCwwICsxLDMwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLm1lbWxlYWtzLm5vamVyc2V5OworCitpbXBvcnQgb3JnLmp2bmV0LmhrMi5hbm5vdGF0aW9ucy5TZXJ2aWNlOworCisvKioKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworQFNlcnZpY2UKK3B1YmxpYyBjbGFzcyBIZWxsb1NlcnZpY2VJbXBsIGltcGxlbWVudHMgR3JlZXRpbmdTZXJ2aWNlIHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIGdldEdyZWV0aW5nKCkgeworICAgICAgICByZXR1cm4gIkhlbGxvIGZyb20gTXlTZXJ2aWNlIjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tZW0tbGVha3MvcmVkZXBsb3ltZW50L3JlZGVwbG95bWVudC1uby1qZXJzZXktYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvbWVtbGVha3Mvbm9qZXJzZXkvTWFpbi5qYXZhIGIvdGVzdHMvbWVtLWxlYWtzL3JlZGVwbG95bWVudC9yZWRlcGxveW1lbnQtbm8tamVyc2V5LWFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL21lbWxlYWtzL25vamVyc2V5L01haW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNThiNGM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWVtLWxlYWtzL3JlZGVwbG95bWVudC9yZWRlcGxveW1lbnQtbm8tamVyc2V5LWFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL21lbWxlYWtzL25vamVyc2V5L01haW4uamF2YQpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLm1lbWxlYWtzLm5vamVyc2V5OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIuYXBpLkR5bmFtaWNDb25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLmFwaS5EeW5hbWljQ29uZmlndXJhdGlvblNlcnZpY2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIuYXBpLlNlcnZpY2VMb2NhdG9yOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guaGsyLmFwaS5TZXJ2aWNlTG9jYXRvckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIudXRpbGl0aWVzLmJpbmRpbmcuQWJzdHJhY3RCaW5kZXI7CisKKy8qKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgTWFpbiB7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB7CisgICAgICAgIFNlcnZpY2VMb2NhdG9yRmFjdG9yeSBmYWN0b3J5ID0gU2VydmljZUxvY2F0b3JGYWN0b3J5LmdldEluc3RhbmNlKCk7CisgICAgICAgIFNlcnZpY2VMb2NhdG9yIGxvY2F0b3IgPSBmYWN0b3J5LmNyZWF0ZSgibXlMb2NhdG9yIik7CisKKyAgICAgICAgRHluYW1pY0NvbmZpZ3VyYXRpb25TZXJ2aWNlIGRjcyA9IGxvY2F0b3IuZ2V0U2VydmljZShEeW5hbWljQ29uZmlndXJhdGlvblNlcnZpY2UuY2xhc3MpOworICAgICAgICBEeW5hbWljQ29uZmlndXJhdGlvbiBkYyA9IGRjcy5jcmVhdGVEeW5hbWljQ29uZmlndXJhdGlvbigpOworCisgICAgICAgIEFic3RyYWN0QmluZGVyIGJpbmRlciA9IG5ldyBBYnN0cmFjdEJpbmRlcigpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgY29uZmlndXJlKCkgeworICAgICAgICAgICAgICAgIGJpbmQoSGVsbG9TZXJ2aWNlSW1wbC5jbGFzcykudG8oR3JlZXRpbmdTZXJ2aWNlLmNsYXNzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKworICAgICAgICBsb2NhdG9yLmluamVjdChiaW5kZXIpOworICAgICAgICBiaW5kZXIuYmluZChkYyk7CisKKyAgICAgICAgZGMuY29tbWl0KCk7CisKKyAgICAgICAgR3JlZXRpbmdXcmFwcGVyIHdyYXBwZXIgPSBuZXcgR3JlZXRpbmdXcmFwcGVyKGxvY2F0b3IpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oInJlc3VsdDogIiArIHdyYXBwZXIuZ2V0SW5qZWN0ZWRHcmVldGluZygpKTsKKworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21lbS1sZWFrcy9yZWRlcGxveW1lbnQvcmVkZXBsb3ltZW50LW5vLWplcnNleS1hcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9tZW1sZWFrcy9ub2plcnNleS9NeVNlcnZsZXQuamF2YSBiL3Rlc3RzL21lbS1sZWFrcy9yZWRlcGxveW1lbnQvcmVkZXBsb3ltZW50LW5vLWplcnNleS1hcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9tZW1sZWFrcy9ub2plcnNleS9NeVNlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDZhMjY2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWVtLWxlYWtzL3JlZGVwbG95bWVudC9yZWRlcGxveW1lbnQtbm8tamVyc2V5LWFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL21lbWxlYWtzL25vamVyc2V5L015U2VydmxldC5qYXZhCkBAIC0wLDAgKzEsNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMubWVtbGVha3Mubm9qZXJzZXk7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi5hcGkuRHluYW1pY0NvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIuYXBpLkR5bmFtaWNDb25maWd1cmF0aW9uU2VydmljZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi5hcGkuU2VydmljZUxvY2F0b3I7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5oazIuYXBpLlNlcnZpY2VMb2NhdG9yRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmhrMi51dGlsaXRpZXMuYmluZGluZy5BYnN0cmFjdEJpbmRlcjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKioKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIE15U2VydmxldCBleHRlbmRzIEh0dHBTZXJ2bGV0IHsKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBkb0dldChIdHRwU2VydmxldFJlcXVlc3QgcmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSByZXNwb25zZSkgdGhyb3dzIFNlcnZsZXRFeGNlcHRpb24sIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU2VydmljZUxvY2F0b3JGYWN0b3J5IGZhY3RvcnkgPSBTZXJ2aWNlTG9jYXRvckZhY3RvcnkuZ2V0SW5zdGFuY2UoKTsKKyAgICAgICAgU2VydmljZUxvY2F0b3IgbG9jYXRvciA9IGZhY3RvcnkuY3JlYXRlKCJteUxvY2F0b3IiKTsKKworICAgICAgICBEeW5hbWljQ29uZmlndXJhdGlvblNlcnZpY2UgZGNzID0gbG9jYXRvci5nZXRTZXJ2aWNlKER5bmFtaWNDb25maWd1cmF0aW9uU2VydmljZS5jbGFzcyk7CisgICAgICAgIER5bmFtaWNDb25maWd1cmF0aW9uIGRjID0gZGNzLmNyZWF0ZUR5bmFtaWNDb25maWd1cmF0aW9uKCk7CisKKyAgICAgICAgQWJzdHJhY3RCaW5kZXIgYmluZGVyID0gbmV3IEFic3RyYWN0QmluZGVyKCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmUoKSB7CisgICAgICAgICAgICAgICAgYmluZChIZWxsb1NlcnZpY2VJbXBsLmNsYXNzKS50byhHcmVldGluZ1NlcnZpY2UuY2xhc3MpOworICAgICAgICAgICAgfQorICAgICAgICB9OworCisgICAgICAgIGJpbmRlci5iaW5kKGRjKTsKKworICAgICAgICBkYy5jb21taXQoKTsKKworICAgICAgICBHcmVldGluZ1dyYXBwZXIgd3JhcHBlciA9IG5ldyBHcmVldGluZ1dyYXBwZXIobG9jYXRvcik7CisgICAgICAgIHJlc3BvbnNlLmdldFdyaXRlcigpLndyaXRlKCJHcmVldGluZzogIiArIHdyYXBwZXIuZ2V0SW5qZWN0ZWRHcmVldGluZygpKTsKKyAgICAgICAgbG9jYXRvci5zaHV0ZG93bigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21lbS1sZWFrcy9yZWRlcGxveW1lbnQvcmVkZXBsb3ltZW50LW5vLWplcnNleS1hcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL21lbS1sZWFrcy9yZWRlcGxveW1lbnQvcmVkZXBsb3ltZW50LW5vLWplcnNleS1hcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDYyNWI2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWVtLWxlYWtzL3JlZGVwbG95bWVudC9yZWRlcGxveW1lbnQtbm8tamVyc2V5LWFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi41IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIj4KKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5NeVNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMubWVtbGVha3Mubm9qZXJzZXkuTXlTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmplcnNleS5jb25maWcuc2VydmVyLnByb3ZpZGVyLnBhY2thZ2VzPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLm1lbWxlYWtzLm5vamVyc2V5PC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5NeVNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL21lbS1sZWFrcy9yZWRlcGxveW1lbnQvcmVkZXBsb3ltZW50LW5vLWplcnNleS1hcHAvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcCBiL3Rlc3RzL21lbS1sZWFrcy9yZWRlcGxveW1lbnQvcmVkZXBsb3ltZW50LW5vLWplcnNleS1hcHAvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Nzc5ZDlkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWVtLWxlYWtzL3JlZGVwbG95bWVudC9yZWRlcGxveW1lbnQtbm8tamVyc2V5LWFwcC9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwCkBAIC0wLDAgKzEsMjUgQEAKKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorPGh0bWw+Cis8Ym9keT4KKyAgICA8aDI+SmVyc2V5IFJFU1RmdWwgV2ViIEFwcGxpY2F0aW9uITwvaDI+CisgICAgPHA+PGEgaHJlZj0id2ViYXBpL215cmVzb3VyY2UiPkplcnNleSByZXNvdXJjZTwvYT4KKyAgICA8cD5WaXNpdCA8YSBocmVmPSJodHRwOi8vamVyc2V5LmphdmEubmV0Ij5Qcm9qZWN0IEplcnNleSB3ZWJzaXRlPC9hPgorICAgIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIEplcnNleSEKKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3Rlc3RzL21lbS1sZWFrcy9yZWRlcGxveW1lbnQvcmVkZXBsb3ltZW50LXRocmVhZGxvY2Fscy1hcHAvcG9tLnhtbCBiL3Rlc3RzL21lbS1sZWFrcy9yZWRlcGxveW1lbnQvcmVkZXBsb3ltZW50LXRocmVhZGxvY2Fscy1hcHAvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTE4OGRmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWVtLWxlYWtzL3JlZGVwbG95bWVudC9yZWRlcGxveW1lbnQtdGhyZWFkbG9jYWxzLWFwcC9wb20ueG1sCkBAIC0wLDAgKzEsMTE1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgorCisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMubWVtbGVha3MucmVkZXBsb3ltZW50PC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+cmVkZXBsb3ltZW50LXRocmVhZGxvY2Fscy1hcHA8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtbWVtbGVhay1yZWRlcGxveW1lbnQtdGhyZWFkbG9jYWxzLWFwcDwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj4KKworICAgICAgICBUaGlzIHByb2plY3Qgc2hvd3MgdGhhdCBub3QgY2FyZWZ1bCB1c2Ugb2YgVGhyZWFkTG9jYWwgaW4gYSB0aHJlYWQtcG9vbCBlbnZpcm9ubWVudCBpcyBhIHJpc2suIEluIHRoaXMgY2FzZSwgbWVtb3J5IGxlYWtzCisgICAgICAgIG1heSBvY2N1ciB1bmRlciBjZXJ0YWluIGNpcmN1bXN0YW5jZXMuCisKKyAgICAgICAgS25vd24gY2FzZXMgd2hlbiBtZW1vcnkgbGVha3MgZG8gaGFwcGVuOgorCisgICAgICAgIFsxXSBUb21jYXQgd2l0aCBkZXBsb3ltZW50IGJ5IHVzaW5nIGl0cyBhZG1pbiBSRVNUIEFQSSAoY29weWluZyB0byB3ZWJhcHBzIGRpciBkb2VzIG5vdCBjYXVzZSBhIG1lbW9yeSBsZWFrIHNpbmNlIHRoZQorICAgICAgICBpbml0aWFsaXphdGlvbiBvZiB0aGUgYXBwbGljYXRpb24gaXMgZG9uZSBieSBhIGRpZmZlcmVudCB0aHJlYWQsIHdoaWNoIG1pZ2h0IGdldCBldmVudHVhbGx5IGRpc2NhcmRlZC4pCisKKyAgICAgICAgWzJdIEdsYXNzZmlzaCAtIHByb2JhYmx5IHdvcmtzIGR1ZSB0byBhIGZhY3QsIHRoYXQgSEsyIGlzIG5vdCB1c2VkIChhcyBvcHBvc2VkIHRvIHJlZGVwbG95bWVudC1uby1qZXJzZXktdGVzdC1hcHApIGFuZCB0aGUKKyAgICAgICAgY2xhc3NlcyB0aGF0IHBhcnRpY2lwYXRlIG9uIHN0cm9uZyByZWZlcmVuY2VzIHRvIGEgR0Mgcm9vdCBhcmUgbG9hZGVkIGJ5IHdlYmFwcCBjbGFzc2xvYWRlci4KKworCisgICAgICAgIFRvIHJ1biB0aGlzIHRlc3QgdGhyZWFkbG9jYWxzIGNsYXNzbG9hZGVyIG1lbW9yeSBsZWFrIGV4YW1wbGUsIGV4ZWN1dGUgZnJvbSBqZXJzZXkgcm9vdCBkaXI6CisKKyAgICAgICAgWzFdIEdsYXNzZmlzaDogbXZuIGNsZWFuIGluc3RhbGwgLXBsIDpyZWRlcGxveW1lbnQtdGhyZWFkbG9jYWxzLWFwcCAtUCBnZjQsbWVtbGVhay1sZWFraW5nLXRlc3QsbWVtbGVhay1yZWRlcGxveW1lbnQKKworICAgICAgICBbMl0gV2VibG9naWM6IG12biBjbGVhbiBpbnN0YWxsIC1wbCA6cmVkZXBsb3ltZW50LXRocmVhZGxvY2Fscy1hcHAgLVAgd2xzLG1lbWxlYWstbGVha2luZy10ZXN0LG1lbWxlYWstcmVkZXBsb3ltZW50CisKKyAgICAgICAgWzNdIFRvbWNhdDogbXZuIGNsZWFuIGluc3RhbGwgLXBsIDpyZWRlcGxveW1lbnQtdGhyZWFkbG9jYWxzLWFwcCAtUCB0b21jYXQsbWVtbGVhay1sZWFraW5nLXRlc3QsbWVtbGVhay1yZWRlcGxveW1lbnQKKworICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPG1lbWxlYWsuanZtLm1heGhlYXA+MTI4bTwvbWVtbGVhay5qdm0ubWF4aGVhcD4KKyAgICAgICAgPGV4dGVybmFsLmNvbnRhaW5lci5jb250ZXh0Um9vdD5oZWxsbzwvZXh0ZXJuYWwuY29udGFpbmVyLmNvbnRleHRSb290PgorCisgICAgICAgIDxtZW1sZWFrLnJlZGVwbG95LmNvdW50PjEwMDAwPC9tZW1sZWFrLnJlZGVwbG95LmNvdW50PgorICAgICAgICA8bWVtbGVhay5yZWRlcGxveS5leHBlY3RlZFN0YXR1cz4yMDA8L21lbWxlYWsucmVkZXBsb3kuZXhwZWN0ZWRTdGF0dXM+CisgICAgICAgIDxtZW1sZWFrLnJlZGVwbG95LnJlcXVlc3RQYXRoUXVlcnk+JHtleHRlcm5hbC5jb250YWluZXIuY29udGV4dFJvb3R9PC9tZW1sZWFrLnJlZGVwbG95LnJlcXVlc3RQYXRoUXVlcnk+CisgICAgPC9wcm9wZXJ0aWVzPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD50b21jYXQ8L2lkPgorICAgICAgICAgICAgPHByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgPG1lbWxlYWsuanZtLm1heGhlYXA+NDhtPC9tZW1sZWFrLmp2bS5tYXhoZWFwPgorICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPm1lbWxlYWstbGVha2luZy10ZXN0PC9pZD4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YnVpbGQtaGVscGVyLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5tYXZlbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWVuZm9yY2VyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5lbmZvcmNlLW91dC1vZi1tZW1vcnktZGlkLW5vdC1vY2N1cjwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT4ke3BoYXNlLnJlZGVwbG95bWVudC5wb3N0LWludGVncmF0aW9uLXRlc3R9PC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5zZXJ2bGV0LWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjIuNTwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9tZW0tbGVha3MvcmVkZXBsb3ltZW50L3JlZGVwbG95bWVudC10aHJlYWRsb2NhbHMtYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvbWVtbGVha3MvdGhyZWFkbG9jYWwvU29tZUNsYXNzLmphdmEgYi90ZXN0cy9tZW0tbGVha3MvcmVkZXBsb3ltZW50L3JlZGVwbG95bWVudC10aHJlYWRsb2NhbHMtYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvbWVtbGVha3MvdGhyZWFkbG9jYWwvU29tZUNsYXNzLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YzNmU1MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21lbS1sZWFrcy9yZWRlcGxveW1lbnQvcmVkZXBsb3ltZW50LXRocmVhZGxvY2Fscy1hcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9tZW1sZWFrcy90aHJlYWRsb2NhbC9Tb21lQ2xhc3MuamF2YQpAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLm1lbWxlYWtzLnRocmVhZGxvY2FsOworCisvKioKKyAqIEEgc2ltcGxlIGNsYXNzIHRoYXQgcGFydGljaXBhdGVzIGluIHRoZSBjbGFzcy9vYmplY3QgcmVmZXJlbmNlIGNpcmNsZSB0aGF0IGNhdXNlcyBhIG1lbW9yeSBsZWFrLgorICoKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFNvbWVDbGFzcyB7CisKKyAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBoZWxsbygpIHsKKyAgICAgICAgcmV0dXJuICJoZWxsbyI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbWVtLWxlYWtzL3JlZGVwbG95bWVudC9yZWRlcGxveW1lbnQtdGhyZWFkbG9jYWxzLWFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL21lbWxlYWtzL3RocmVhZGxvY2FsL1N0YXRpY1JlZmVyZW5jZUNsYXNzLmphdmEgYi90ZXN0cy9tZW0tbGVha3MvcmVkZXBsb3ltZW50L3JlZGVwbG95bWVudC10aHJlYWRsb2NhbHMtYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvbWVtbGVha3MvdGhyZWFkbG9jYWwvU3RhdGljUmVmZXJlbmNlQ2xhc3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjYyZTc5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWVtLWxlYWtzL3JlZGVwbG95bWVudC9yZWRlcGxveW1lbnQtdGhyZWFkbG9jYWxzLWFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL21lbWxlYWtzL3RocmVhZGxvY2FsL1N0YXRpY1JlZmVyZW5jZUNsYXNzLmphdmEKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5tZW1sZWFrcy50aHJlYWRsb2NhbDsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkNvbmN1cnJlbnRMaW5rZWREZXF1ZTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGlzIGEga2V5IHRvIHRoZSBjbGFzc2xvYWRlciBtZW1vcnkgbGVhayBzaW5jZSBpdCBoYXMgYSBzdGF0aWMgcmVmZXJlbmNlIHRvIGFuIG9iamVjdCB3aGljaCB3aWxsIHJlZmVyIGEge0BsaW5rCisgKiBUaHJlYWRMb2NhbH0gaW5zdGFuY2Ugd2hpY2ggcmVmZXJzIGEgY2xhc3Mgb2JqZWN0LgorICoKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFN0YXRpY1JlZmVyZW5jZUNsYXNzIHsKKworICAgIHN0YXRpYyBmaW5hbCBDb25jdXJyZW50TGlua2VkRGVxdWU8VGhyZWFkTG9jYWw8Q2xhc3M+PiBTVEFUSUNfSE9MREVSID0gbmV3IENvbmN1cnJlbnRMaW5rZWREZXF1ZTw+KCk7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9tZW0tbGVha3MvcmVkZXBsb3ltZW50L3JlZGVwbG95bWVudC10aHJlYWRsb2NhbHMtYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvbWVtbGVha3MvdGhyZWFkbG9jYWwvVGhyZWFkTG9jYWxNZW1vcnlMZWFrU2VydmxldC5qYXZhIGIvdGVzdHMvbWVtLWxlYWtzL3JlZGVwbG95bWVudC9yZWRlcGxveW1lbnQtdGhyZWFkbG9jYWxzLWFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL21lbWxlYWtzL3RocmVhZGxvY2FsL1RocmVhZExvY2FsTWVtb3J5TGVha1NlcnZsZXQuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTVjODVhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWVtLWxlYWtzL3JlZGVwbG95bWVudC9yZWRlcGxveW1lbnQtdGhyZWFkbG9jYWxzLWFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL21lbWxlYWtzL3RocmVhZGxvY2FsL1RocmVhZExvY2FsTWVtb3J5TGVha1NlcnZsZXQuamF2YQpAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLm1lbWxlYWtzLnRocmVhZGxvY2FsOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKKworaW1wb3J0IGphdmF4LnNlcnZsZXQuU2VydmxldEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXQ7CitpbXBvcnQgamF2YXguc2VydmxldC5odHRwLkh0dHBTZXJ2bGV0UmVxdWVzdDsKK2ltcG9ydCBqYXZheC5zZXJ2bGV0Lmh0dHAuSHR0cFNlcnZsZXRSZXNwb25zZTsKKworLyoqCisgKiBBIHNlcnZsZXQgdGhhdCBpbnRyb2R1Y2VzIGEgbWVtb3J5IGxlYWsgd2l0aCBhIHNpbmdsZSBjYWxsLiBBbGwgdGhlIGNsYXNzZXMgbG9hZGVkIGJ5IGN1cnJlbnQgY2xhc3Nsb2FkZXIgd29uJ3QgZ2V0IEdDZWQgZXZlbgorICogYWZ0ZXIgdGhpcyBhcHBsaWNhdGlvbiBpcyB1bmRlcGxveWVkLgorICogPHAvPgorICogVGhpcyBzZXJ2bGV0IGRlbW9uc3RyYXRlcyB0aGF0IGZpeCBISzItMjQ3IHdoZW4ge0BsaW5rIFRocmVhZExvY2FsfSByZWZlcmVuY2UgaXMgY2hhbmdlZCBmcm9tIGEgc3RhdGljIHRvIGFuIGluc3RhbmNlLCBpdCBkb2VzCisgKiBub3QgYWx3YXlzIHNvbHZlIG1lbW9yeSBsZWFrIGlzc3VlcyBhcyBsb25nIGFzIGEgc3RhdGljIHJlZmVyZW5jZSAoaW4gdGhpcyBjYXNlIHtAbGluayBTdGF0aWNSZWZlcmVuY2VDbGFzcyNTVEFUSUNfSE9MREVSfSkKKyAqIGhvbGRzIChldmVuIHRyYW5zaXRpdmVseSkgdGhlIHtAbGluayBUaHJlYWRMb2NhbH0gaW5zdGFuY2UuCisgKiA8cC8+CisgKiBUbyByZXZlcnQgdGhpcyBjYXNlIHRvIHRoZSBzaW1wbGUgb25lICh0aGUgb3JpZ2luYWwgb25lKSwgY2hhbmdlIHRoZSB7QGxpbmsgI3RocmVhZExvY2FsfSBpbnN0YW5jZSBzaG91bGQgYmUgc3RhdGljIGFuZCB0aGFuIG5vCisgKiB7QGxpbmsgU3RhdGljUmVmZXJlbmNlQ2xhc3MjU1RBVElDX0hPTERFUn0gaXMgbmVlZGVkLiBUaGUgbWVtb3J5IGxlYWsgb2NjdXJzIHdpdGhvdXQgYW55IG90aGVyIHNwZWNpYWwgYWN0aW9ucy4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBUaHJlYWRMb2NhbE1lbW9yeUxlYWtTZXJ2bGV0IGV4dGVuZHMgSHR0cFNlcnZsZXQgeworCisgICAgLyoqCisgICAgICogVGhpcyB7QGxpbmsgVGhyZWFkTG9jYWx9IHJlZmVyZW5jZSBpcyBoZWxkIGJ5IGluc3RhbmNlIHJlZmVyZW5jZSBhbmQgbWlnaHQgYmUgR0NlZDsgaG93ZXZlciwgdGhlIGNsYXNzIHtAbGluayBTb21lQ2xhc3N9CisgICAgICogaGFzIGEgcmVmZXJlbmNlIHRvIGl0cyBjbGFzc2xvYWRlciB3aGljaCBoYXMgYSByZWZlcmVuY2UgdG8ge0BsaW5rIFN0YXRpY1JlZmVyZW5jZUNsYXNzfSBjbGFzcyB3aGljaCBoYXMgYSBzdGF0aWMgcmVmZXJlbmNlCisgICAgICogdG8gdGhpcyBpbnN0YW5jZS4gQXMgYSByZXN1bHQsIHRoaXMge0BsaW5rIFRocmVhZExvY2FsfSBpbnN0YW5jZSBpcyBuZXZlciBHQ2VkIGluIGEgdGhyZWFkIHBvb2wgZW52aXJvbm1lbnQuCisgICAgICogPHAvPgorICAgICAqIElmIHRoaXMgZmllbGQgd2FzIGNoYW5nZWQgdG8gYSBzdGF0aWMgcmVmZXJlbmNlLCB0aGUgbWVtb3J5IGxlYWsgd291bGQgb2NjdXIgZXZlbiB3aXRob3V0IHRoZSB7QGxpbmsKKyAgICAgKiBTdGF0aWNSZWZlcmVuY2VDbGFzcyNTVEFUSUNfSE9MREVSfSBob2xkaW5nIHRoaXMgaW5zdGFuY2UgKHNlZSB7QGxpbmsgI2RvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCwgSHR0cFNlcnZsZXRSZXNwb25zZSl9CisgICAgICogbWV0aG9kIGJlbGxvdykuCisgICAgICovCisgICAgZmluYWwgVGhyZWFkTG9jYWw8Q2xhc3M+IHRocmVhZExvY2FsID0gbmV3IFRocmVhZExvY2FsPENsYXNzPigpIHsKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHByb3RlY3RlZCBDbGFzcyBpbml0aWFsVmFsdWUoKSB7CisgICAgICAgICAgICByZXR1cm4gU29tZUNsYXNzLmNsYXNzOworICAgICAgICB9CisgICAgfTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGRvR2V0KEh0dHBTZXJ2bGV0UmVxdWVzdCByZXF1ZXN0LCBIdHRwU2VydmxldFJlc3BvbnNlIHJlc3BvbnNlKSB0aHJvd3MgU2VydmxldEV4Y2VwdGlvbiwgSU9FeGNlcHRpb24geworICAgICAgICBTdGF0aWNSZWZlcmVuY2VDbGFzcy5TVEFUSUNfSE9MREVSLmFkZCh0aHJlYWRMb2NhbCk7CisgICAgICAgIHJlc3BvbnNlLmdldFdyaXRlcigpLndyaXRlKCJHcmVldGluZzogIiArIFNvbWVDbGFzcy5oZWxsbygpICsgIlxuIik7CisgICAgICAgIHJlc3BvbnNlLmdldFdyaXRlcigpLndyaXRlKCJUaHJlYWQgTG9jYWxzIENvbnRlbnQ6ICIgKyB0aHJlYWRMb2NhbC5nZXQoKS5nZXRDYW5vbmljYWxOYW1lKCkgKyAiXG4iKTsKKyAgICAgICAgcmVzcG9uc2UuZ2V0V3JpdGVyKCkud3JpdGUoIkhvbGRlciBzaXplOiAiICsgU3RhdGljUmVmZXJlbmNlQ2xhc3MuU1RBVElDX0hPTERFUi5zaXplKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21lbS1sZWFrcy9yZWRlcGxveW1lbnQvcmVkZXBsb3ltZW50LXRocmVhZGxvY2Fscy1hcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL21lbS1sZWFrcy9yZWRlcGxveW1lbnQvcmVkZXBsb3ltZW50LXRocmVhZGxvY2Fscy1hcHAvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzM0MTgwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWVtLWxlYWtzL3JlZGVwbG95bWVudC9yZWRlcGxveW1lbnQtdGhyZWFkbG9jYWxzLWFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi41IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIj4KKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5NeVNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMubWVtbGVha3MudGhyZWFkbG9jYWwuVGhyZWFkTG9jYWxNZW1vcnlMZWFrU2VydmxldDwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+TXlTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9tZW0tbGVha3MvdGVzdC1jYXNlcy9iZWFuLXBhcmFtLWxlYWsvcG9tLnhtbCBiL3Rlc3RzL21lbS1sZWFrcy90ZXN0LWNhc2VzL2JlYW4tcGFyYW0tbGVhay9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwNmVlMjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tZW0tbGVha3MvdGVzdC1jYXNlcy9iZWFuLXBhcmFtLWxlYWsvcG9tLnhtbApAQCAtMCwwICsxLDEyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5tZW1sZWFrcy50ZXN0Y2FzZXM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5iZWFuLXBhcmFtLWxlYWs8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtbWVtbGVhay10ZXN0Y2FzZS1iZWFuLXBhcmFtLWxlYWs8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIFJlcHJvZHVjZXIgb2YgSkVSU0VZLTI4MDAKKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxtZW1sZWFrLmp2bS5tYXhoZWFwPjk2bTwvbWVtbGVhay5qdm0ubWF4aGVhcD4KKworICAgICAgICA8bWVtbGVhay53bHMubWF4aGVhcD4xMjhtPC9tZW1sZWFrLndscy5tYXhoZWFwPgorICAgICAgICA8bWVtbGVhay50b21jYXQubWF4aGVhcD40Mm08L21lbWxlYWsudG9tY2F0Lm1heGhlYXA+CisgICAgICAgIDxtZW1sZWFrLmpldHR5Lm1heGhlYXA+NzBtPC9tZW1sZWFrLmpldHR5Lm1heGhlYXA+CisKKyAgICAgICAgPG1lbWxlYWsudGVzdC50aW1lb3V0PjIwMDAwMDwvbWVtbGVhay50ZXN0LnRpbWVvdXQ+CisKKyAgICAgICAgPG1lbWxlYWsud2xzLnBhY2thZ2luZ0V4Y2x1ZGVzLndlYmxvZ2ljLnhtbD5XRUItSU5GL3dlYmxvZ2ljLnhtbDwvbWVtbGVhay53bHMucGFja2FnaW5nRXhjbHVkZXMud2VibG9naWMueG1sPgorICAgIDwvcHJvcGVydGllcz4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWV4dGVybmFsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWdyaXp6bHkyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yazwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm1lbWxlYWstdGVzdC1jb21tb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXdhci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxwYWNrYWdpbmdFeGNsdWRlcz4ke21lbWxlYWsud2xzLnBhY2thZ2luZ0V4Y2x1ZGVzLndlYmxvZ2ljLnhtbH08L3BhY2thZ2luZ0V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorCisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmJ1aWxkLWhlbHBlci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsubWF2ZW48L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29udGFpbmVyLXJ1bm5lci1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWVuZm9yY2VyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+bWVtbGVhay1yZXByb2R1Y2VyPC9pZD4KKyAgICAgICAgICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgIDxtZW1sZWFrLmplcnNleS52ZXJzaW9uPjIuMTY8L21lbWxlYWsuamVyc2V5LnZlcnNpb24+CisgICAgICAgICAgICAgICAgPG1lbWxlYWsud2xzLnBhY2thZ2luZ0V4Y2x1ZGVzLndlYmxvZ2ljLnhtbCAvPgorICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPm1lbWxlYWstb3ZlcnJpZGUtbGlicmFyaWVzPC9pZD4KKyAgICAgICAgICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgIDxtZW1sZWFrLndscy5wYWNrYWdpbmdFeGNsdWRlcy53ZWJsb2dpYy54bWwgLz4KKyAgICAgICAgICAgIDwvcHJvcGVydGllcz4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL21lbS1sZWFrcy90ZXN0LWNhc2VzL2JlYW4tcGFyYW0tbGVhay9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL21lbWxlYWtzL2JlYW5wYXJhbS9CZWFuUGFyYW1MZWFrUmVzb3VyY2UuamF2YSBiL3Rlc3RzL21lbS1sZWFrcy90ZXN0LWNhc2VzL2JlYW4tcGFyYW0tbGVhay9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL21lbWxlYWtzL2JlYW5wYXJhbS9CZWFuUGFyYW1MZWFrUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzhmNjRjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWVtLWxlYWtzL3Rlc3QtY2FzZXMvYmVhbi1wYXJhbS1sZWFrL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvbWVtbGVha3MvYmVhbnBhcmFtL0JlYW5QYXJhbUxlYWtSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMubWVtbGVha3MuYmVhbnBhcmFtOworCitpbXBvcnQgamF2YXgud3MucnMuQmVhblBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5JbnZvY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5Db250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVxdWVzdDsKKworaW1wb3J0IGphdmF4LmluamVjdC5TaW5nbGV0b247CisKKy8qKgorICogVGhpcyByZXNvdXJjZSByZXByb2R1Y2VzIEpFUlNFWS0yODAwIHdoZW4ge0BsaW5rICNpbnZva2VCZWFuUGFyYW1JbmplY3QoKX0gY2FsbGVkIHJlcGV0aXRpdmVseS4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCIvYmVhbnBhcmFtIikKK3B1YmxpYyBjbGFzcyBCZWFuUGFyYW1MZWFrUmVzb3VyY2UgeworCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXJhbWV0ZXJCZWFuIHsKKyAgICAgICAgQENvbnRleHQKKyAgICAgICAgUmVxdWVzdCByZXF1ZXN0OworCisgICAgICAgIEBRdWVyeVBhcmFtKCJxIikKKyAgICAgICAgU3RyaW5nIHE7CisgICAgfQorCisgICAgQEJlYW5QYXJhbQorICAgIFBhcmFtZXRlckJlYW4gYmVhbjsKKworICAgIEBQT1NUCisgICAgQFBhdGgoImludm9rZSIpCisgICAgcHVibGljIFN0cmluZyBpbnZva2VCZWFuUGFyYW1JbmplY3QoKSB7CisgICAgICAgIHJldHVybiBiZWFuLnE7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJoZWxsb3dvcmxkIikKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBTdHJpbmcgaGVsbG9Xb3JsZCgpIHsKKyAgICAgICAgcmV0dXJuICJIRUxMTyBXT1JMRCEiOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbWVtLWxlYWtzL3Rlc3QtY2FzZXMvYmVhbi1wYXJhbS1sZWFrL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvbWVtbGVha3MvYmVhbnBhcmFtL1Rlc3RBcHBsaWNhdGlvbi5qYXZhIGIvdGVzdHMvbWVtLWxlYWtzL3Rlc3QtY2FzZXMvYmVhbi1wYXJhbS1sZWFrL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvbWVtbGVha3MvYmVhbnBhcmFtL1Rlc3RBcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMzNjNDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tZW0tbGVha3MvdGVzdC1jYXNlcy9iZWFuLXBhcmFtLWxlYWsvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9tZW1sZWFrcy9iZWFucGFyYW0vVGVzdEFwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5tZW1sZWFrcy5iZWFucGFyYW07CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKKy8qKgorICogSkFYLVJTIEFwcGxpY2F0aW9uIHRoYXQgc2VydmVzIHtAbGluayBCZWFuUGFyYW1MZWFrUmVzb3VyY2V9IGNsYXNzLgorICoKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFRlc3RBcHBsaWNhdGlvbiBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKworICAgIHB1YmxpYyBUZXN0QXBwbGljYXRpb24oKSB7CisgICAgICAgIHJlZ2lzdGVyKEJlYW5QYXJhbUxlYWtSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbWVtLWxlYWtzL3Rlc3QtY2FzZXMvYmVhbi1wYXJhbS1sZWFrL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9tZW0tbGVha3MvdGVzdC1jYXNlcy9iZWFuLXBhcmFtLWxlYWsvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjMxYmRiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWVtLWxlYWtzL3Rlc3QtY2FzZXMvYmVhbi1wYXJhbS1sZWFrL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwzNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIyLjUiIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzJfNS54c2QiCisgICAgICAgIG1ldGFkYXRhLWNvbXBsZXRlPSJ0cnVlIiA+CisKKyAgICA8ZmlsdGVyPgorICAgICAgICA8ZmlsdGVyLW5hbWU+amVyc2V5PC9maWx0ZXItbmFtZT4KKyAgICAgICAgPGZpbHRlci1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L2ZpbHRlci1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC53cy5ycy5BcHBsaWNhdGlvbjwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5tZW1sZWFrcy5iZWFucGFyYW0uVGVzdEFwcGxpY2F0aW9uPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgIDwvZmlsdGVyPgorCisgICAgPGZpbHRlci1tYXBwaW5nPgorICAgICAgICA8ZmlsdGVyLW5hbWU+amVyc2V5PC9maWx0ZXItbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L2ZpbHRlci1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvbWVtLWxlYWtzL3Rlc3QtY2FzZXMvYmVhbi1wYXJhbS1sZWFrL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYmxvZ2ljLnhtbCBiL3Rlc3RzL21lbS1sZWFrcy90ZXN0LWNhc2VzL2JlYW4tcGFyYW0tbGVhay9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWJsb2dpYy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDczZTcxZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21lbS1sZWFrcy90ZXN0LWNhc2VzL2JlYW4tcGFyYW0tbGVhay9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWJsb2dpYy54bWwKQEAgLTAsMCArMSw1OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2xzOndlYmxvZ2ljLXdlYi1hcHAgeG1sbnM6d2xzPSJodHRwOi8veG1sbnMub3JhY2xlLmNvbS93ZWJsb2dpYy93ZWJsb2dpYy13ZWItYXBwIgorICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly94bWxucy5vcmFjbGUuY29tL3dlYmxvZ2ljL3dlYmxvZ2ljLXdlYi1hcHAgaHR0cDovL3htbG5zLm9yYWNsZS5jb20vd2VibG9naWMvd2VibG9naWMtd2ViLWFwcC8xLjAvd2VibG9naWMtd2ViLWFwcC54c2QiPgorCisgICAgPHdsczpjb250YWluZXItZGVzY3JpcHRvcj4KKyAgICAgICAgPHdsczpwcmVmZXItYXBwbGljYXRpb24tcGFja2FnZXM+CisgICAgICAgICAgICA8IS0tIGpzcjMxMSAtLT4KKyAgICAgICAgICAgIDx3bHM6cGFja2FnZS1uYW1lPmphdmF4LndzLnJzLio8L3dsczpwYWNrYWdlLW5hbWU+CisgICAgICAgICAgICA8IS0tIGphdmFzc2lzdCAtLT4KKyAgICAgICAgICAgIDx3bHM6cGFja2FnZS1uYW1lPmphdmFzc2lzdC4qPC93bHM6cGFja2FnZS1uYW1lPgorICAgICAgICAgICAgPCEtLSBhb3AgcmVwYWNrYWdlZCAtLT4KKyAgICAgICAgICAgIDx3bHM6cGFja2FnZS1uYW1lPm9yZy5hb3BhbGxpYW5jZS4qPC93bHM6cGFja2FnZS1uYW1lPgorCisgICAgICAgICAgICA8IS0tIGplcnNleSAyIC0tPgorICAgICAgICAgICAgPHdsczpwYWNrYWdlLW5hbWU+amVyc2V5LnJlcGFja2FnZWQuKjwvd2xzOnBhY2thZ2UtbmFtZT4KKyAgICAgICAgICAgIDx3bHM6cGFja2FnZS1uYW1lPm9yZy5nbGFzc2Zpc2guamVyc2V5Lio8L3dsczpwYWNrYWdlLW5hbWU+CisgICAgICAgICAgICA8d2xzOnBhY2thZ2UtbmFtZT5jb20uc3VuLnJlc2VhcmNoLndzLndhZGwuKjwvd2xzOnBhY2thZ2UtbmFtZT4KKworICAgICAgICAgICAgPCEtLSBoazIgLS0+CisgICAgICAgICAgICA8d2xzOnBhY2thZ2UtbmFtZT5vcmcuZ2xhc3NmaXNoLmhrMi4qPC93bHM6cGFja2FnZS1uYW1lPgorICAgICAgICAgICAgPHdsczpwYWNrYWdlLW5hbWU+b3JnLmp2bmV0LmhrMi4qPC93bHM6cGFja2FnZS1uYW1lPgorICAgICAgICAgICAgPHdsczpwYWNrYWdlLW5hbWU+b3JnLmp2bmV0LnRpZ2VyX3R5cGVzLio8L3dsczpwYWNrYWdlLW5hbWU+CisgICAgICAgIDwvd2xzOnByZWZlci1hcHBsaWNhdGlvbi1wYWNrYWdlcz4KKworICAgICAgICA8d2xzOnByZWZlci1hcHBsaWNhdGlvbi1yZXNvdXJjZXM+CisgICAgICAgICAgICA8d2xzOnJlc291cmNlLW5hbWU+TUVUQS1JTkYvc2VydmljZXMvamF2YXguc2VydmxldC5TZXJ2bGV0Q29udGFpbmVySW5pdGlhbGl6ZXI8L3dsczpyZXNvdXJjZS1uYW1lPgorICAgICAgICAgICAgPHdsczpyZXNvdXJjZS1uYW1lPk1FVEEtSU5GL3NlcnZpY2VzL2phdmF4LndzLnJzLmV4dC5SdW50aW1lRGVsZWdhdGU8L3dsczpyZXNvdXJjZS1uYW1lPgorCisgICAgICAgICAgICA8IS0tIGplcnNleSAtLT4KKyAgICAgICAgICAgIDx3bHM6cmVzb3VyY2UtbmFtZT5NRVRBLUlORi9zZXJ2aWNlcy9vcmcuZ2xhc3NmaXNoLmplcnNleS4qPC93bHM6cmVzb3VyY2UtbmFtZT4KKyAgICAgICAgICAgIDx3bHM6cmVzb3VyY2UtbmFtZT5vcmcuZ2xhc3NmaXNoLmplcnNleS4qPC93bHM6cmVzb3VyY2UtbmFtZT4KKyAgICAgICAgICAgIDx3bHM6cmVzb3VyY2UtbmFtZT5qZXJzZXkucmVwYWNrYWdlZC4qPC93bHM6cmVzb3VyY2UtbmFtZT4KKworICAgICAgICAgICAgPCEtLSBoazIgLS0+CisgICAgICAgICAgICA8d2xzOnJlc291cmNlLW5hbWU+TUVUQS1JTkYvc2VydmljZXMvb3JnLmdsYXNzZmlzaC5oazIuKjwvd2xzOnJlc291cmNlLW5hbWU+CisgICAgICAgIDwvd2xzOnByZWZlci1hcHBsaWNhdGlvbi1yZXNvdXJjZXM+CisgICAgPC93bHM6Y29udGFpbmVyLWRlc2NyaXB0b3I+CisKKzwvd2xzOndlYmxvZ2ljLXdlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9tZW0tbGVha3MvdGVzdC1jYXNlcy9iZWFuLXBhcmFtLWxlYWsvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9tZW1sZWFrcy9iZWFucGFyYW0vQmVhblBhcmFtTGVha1Jlc291cmNlSVRDYXNlLmphdmEgYi90ZXN0cy9tZW0tbGVha3MvdGVzdC1jYXNlcy9iZWFuLXBhcmFtLWxlYWsvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9tZW1sZWFrcy9iZWFucGFyYW0vQmVhblBhcmFtTGVha1Jlc291cmNlSVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlmZmIxNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21lbS1sZWFrcy90ZXN0LWNhc2VzL2JlYW4tcGFyYW0tbGVhay9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL21lbWxlYWtzL2JlYW5wYXJhbS9CZWFuUGFyYW1MZWFrUmVzb3VyY2VJVENhc2UuamF2YQpAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLm1lbWxlYWtzLmJlYW5wYXJhbTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QubWVtbGVhay5jb21tb24uQWJzdHJhY3RNZW1vcnlMZWFrV2ViQXBwVGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0Lm1lbWxlYWsuY29tbW9uLk1lbW9yeUxlYWtTdWNjZWVkaW5nVGltZW91dDsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRpbWVvdXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmZhaWw7CisKKy8qKgorICogVGhpcyBpcyBhbiBpbnRlZ3JhdGlvbiB0ZXN0IHRoYXQgcmVwcm9kdWNlcyBKRVJTRVktMjgwMCBieSBjYWxsaW5nIFJFU1RmdWwgcmVzb3VyY2Uge0BsaW5rIEJlYW5QYXJhbUxlYWtSZXNvdXJjZX0KKyAqIHJlcGV0aXRpdmVseS4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBCZWFuUGFyYW1MZWFrUmVzb3VyY2VJVENhc2UgZXh0ZW5kcyBBYnN0cmFjdE1lbW9yeUxlYWtXZWJBcHBUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgVGVzdEFwcGxpY2F0aW9uKCk7CisgICAgfQorCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgVGltZW91dCBnbG9iYWxUaW1lb3V0ID0gbmV3IE1lbW9yeUxlYWtTdWNjZWVkaW5nVGltZW91dCgzMDBfMDAwKTsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRoZUxlYWtSZXNvdXJjZU9uY2UoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJiZWFucGFyYW0vaW52b2tlIikucXVlcnlQYXJhbSgicSIsICJoZWxsbyIpLnJlcXVlc3QoKS5wb3N0KG51bGwpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImhlbGxvIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUaGVMZWFrRW5kbGVzcygpIHsKKworICAgICAgICBmb3IgKGxvbmcgaSA9IDA7OyBpKyspIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIlxyUmVxdWVzdHMgbWFkZTogIiArIGkpOworCisgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiYmVhbnBhcmFtL2ludm9rZSIpLnF1ZXJ5UGFyYW0oInEiLCBpKS5yZXF1ZXN0KCkucG9zdChudWxsKTsKKyAgICAgICAgICAgIGlmIChyZXNwb25zZS5nZXRTdGF0dXMoKSAhPSAyMDApIHsKKyAgICAgICAgICAgICAgICBmYWlsKCJUaGUgc2VydmVyIHdhcyB1bmFibGUgdG8gZnVsZmlsbCB0aGUgcmVxdWVzdCEgVGhpcyBtYXkgaW5kaWNhdGUgdGhhdCBPdXRPZk1lbW9yeSBleGNlcHRpb24gb2NjdXJyZWQuIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoTG9uZy50b1N0cmluZyhpKSwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpKTsKKworICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9tZW0tbGVha3MvdGVzdC1jYXNlcy9sZWFraW5nLXRlc3QtYXBwL3BvbS54bWwgYi90ZXN0cy9tZW0tbGVha3MvdGVzdC1jYXNlcy9sZWFraW5nLXRlc3QtYXBwL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I3Zjc2ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21lbS1sZWFrcy90ZXN0LWNhc2VzL2xlYWtpbmctdGVzdC1hcHAvcG9tLnhtbApAQCAtMCwwICsxLDEwNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5tZW1sZWFrcy50ZXN0Y2FzZXM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5sZWFraW5nLXRlc3QtYXBwPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLW1lbWxlYWstdGVzdGNhc2UtbGVha2luZy10ZXN0LWFwcDwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgVGhlIHB1cnBvc2Ugb2YgdGhpcyB0ZXN0IGFwcGxpY2F0aW9uIGlzIHRvIHRlc3QgdGhlIHRlc3QgaW5mcmFzdHJ1Y3R1cmUgd2hldGhlciBtZW1vcnkgbGVha3MgYXJlIGNvcnJlY3RseSBkZXRlY3RlZCBhbmQKKyAgICAgICAgcmVwb3J0ZWQuCisKKyAgICAgICAgVGhpcyBtb2R1bGUgc2hvdWxkIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgc3RhbmRhcmQgcmVncmVzc2lvbiB0ZXN0IHN1aXRlIHNpbmNlIHRoaXMgYXBwbGljYXRpb24gaW50ZW50aW9uYWxseSBjYXVzZXMgbWVtb3J5CisgICAgICAgIGxlYWtzLgorCisgICAgICAgIEluIG9yZGVyIHRvIGluY2x1ZGUgdGVzdCBvZiB0aGlzIG1vZHVsZSBwcm9maWxlICdtZW1sZWFrLWxlYWtpbmctdGVzdCcgbXVzdCB0byBiZSBlbmFibGVkLgorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPG1lbWxlYWsuanZtLm1heGhlYXA+MjU2bTwvbWVtbGVhay5qdm0ubWF4aGVhcD4KKyAgICAgICAgPG1lbWxlYWsudGVzdC50aW1lb3V0PjQwMDAwPC9tZW1sZWFrLnRlc3QudGltZW91dD4KKyAgICA8L3Byb3BlcnRpZXM+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktY29udGFpbmVyLXNlcnZsZXQ8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZ3JpenpseTI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWVtbGVhay10ZXN0LWNvbW1vbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5ndWF2YTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmd1YXZhPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+bWVtbGVhay1sZWFraW5nLXRlc3Q8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5idWlsZC1oZWxwZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWZhaWxzYWZlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5tYXZlbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWVuZm9yY2VyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL21lbS1sZWFrcy90ZXN0LWNhc2VzL2xlYWtpbmctdGVzdC1hcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9tZW1sZWFrcy90ZXN0bGVhay9NZW1vcnlMZWFraW5nUmVzb3VyY2UuamF2YSBiL3Rlc3RzL21lbS1sZWFrcy90ZXN0LWNhc2VzL2xlYWtpbmctdGVzdC1hcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9tZW1sZWFrcy90ZXN0bGVhay9NZW1vcnlMZWFraW5nUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmNlNDZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWVtLWxlYWtzL3Rlc3QtY2FzZXMvbGVha2luZy10ZXN0LWFwcC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL21lbWxlYWtzL3Rlc3RsZWFrL01lbW9yeUxlYWtpbmdSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMubWVtbGVha3MudGVzdGxlYWs7CisKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkRlZmF1bHRWYWx1ZTsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLlF1ZXJ5UGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworCitpbXBvcnQgamF2YXguaW5qZWN0LlNpbmdsZXRvbjsKKworLyoqCisgKiBSZXNvdXJjZSB0aGF0IGNhdXNlcyB7QGxpbmsgT3V0T2ZNZW1vcnlFcnJvcn0gZXhjZXB0aW9uIHVwb24gcmVwZXRpdGl2ZSBjYWxsIG9mIHtAbGluayAjaW52b2tlKGludCl9LgorICoKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIi8iKQorQFNpbmdsZXRvbgorcHVibGljIGNsYXNzIE1lbW9yeUxlYWtpbmdSZXNvdXJjZSB7CisKKyAgICBmaW5hbCBMaXN0PE9iamVjdD4gbGVha2luZ0xpc3QgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisKKyAgICBAUE9TVAorICAgIEBQYXRoKCJpbnZva2UiKQorICAgIHB1YmxpYyBTdHJpbmcgaW52b2tlKEBEZWZhdWx0VmFsdWUoIjEwNDg1NzYiKSBAUXVlcnlQYXJhbSgic2l6ZSIpIGludCBzaXplKSB7CisgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW3NpemVdOworICAgICAgICBsZWFraW5nTGlzdC5hZGQoYnl0ZXMpOworCisgICAgICAgIHJldHVybiBTdHJpbmcudmFsdWVPZihsZWFraW5nTGlzdC5zaXplKCkpOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgiaGVsbG8iKQorICAgIEBQcm9kdWNlcygidGV4dC9wbGFpbiIpCisgICAgcHVibGljIFN0cmluZyBoZWxsb1dvcmxkKCkgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkhFTExPIFdPUkxEISIpOworICAgICAgICByZXR1cm4gIkhFTExPIFdPUkxEISI7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9tZW0tbGVha3MvdGVzdC1jYXNlcy9sZWFraW5nLXRlc3QtYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvbWVtbGVha3MvdGVzdGxlYWsvVGVzdEFwcGxpY2F0aW9uLmphdmEgYi90ZXN0cy9tZW0tbGVha3MvdGVzdC1jYXNlcy9sZWFraW5nLXRlc3QtYXBwL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvbWVtbGVha3MvdGVzdGxlYWsvVGVzdEFwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA0MzVlNQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21lbS1sZWFrcy90ZXN0LWNhc2VzL2xlYWtpbmctdGVzdC1hcHAvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9tZW1sZWFrcy90ZXN0bGVhay9UZXN0QXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDI5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLm1lbWxlYWtzLnRlc3RsZWFrOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCisvKioKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFRlc3RBcHBsaWNhdGlvbiBleHRlbmRzIFJlc291cmNlQ29uZmlnIHsKKworICAgIHB1YmxpYyBUZXN0QXBwbGljYXRpb24oKSB7CisgICAgICAgIHJlZ2lzdGVyKE1lbW9yeUxlYWtpbmdSZXNvdXJjZS5jbGFzcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbWVtLWxlYWtzL3Rlc3QtY2FzZXMvbGVha2luZy10ZXN0LWFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvbWVtLWxlYWtzL3Rlc3QtY2FzZXMvbGVha2luZy10ZXN0LWFwcC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmOTBjOWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tZW0tbGVha3MvdGVzdC1jYXNlcy9sZWFraW5nLXRlc3QtYXBwL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwzOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIyLjUiIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItYXBwXzJfNS54c2QiCisgICAgICAgIG1ldGFkYXRhLWNvbXBsZXRlPSJ0cnVlIiA+CisKKyAgICA8ZmlsdGVyPgorICAgICAgICA8ZmlsdGVyLW5hbWU+amVyc2V5PC9maWx0ZXItbmFtZT4KKyAgICAgICAgPGZpbHRlci1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L2ZpbHRlci1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC53cy5ycy5BcHBsaWNhdGlvbjwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5tZW1sZWFrcy50ZXN0bGVhay5UZXN0QXBwbGljYXRpb248L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgPC9maWx0ZXI+CisKKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPmplcnNleTwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL21lbS1sZWFrcy90ZXN0LWNhc2VzL2xlYWtpbmctdGVzdC1hcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9tZW1sZWFrcy90ZXN0bGVhay9NZW1vcnlMZWFraW5nUmVzb3VyY2VJVENhc2UuamF2YSBiL3Rlc3RzL21lbS1sZWFrcy90ZXN0LWNhc2VzL2xlYWtpbmctdGVzdC1hcHAvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9tZW1sZWFrcy90ZXN0bGVhay9NZW1vcnlMZWFraW5nUmVzb3VyY2VJVENhc2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjdiOWFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWVtLWxlYWtzL3Rlc3QtY2FzZXMvbGVha2luZy10ZXN0LWFwcC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL21lbWxlYWtzL3Rlc3RsZWFrL01lbW9yeUxlYWtpbmdSZXNvdXJjZUlUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMubWVtbGVha3MudGVzdGxlYWs7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuV2ViVGFyZ2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QubWVtbGVhay5jb21tb24uQWJzdHJhY3RNZW1vcnlMZWFrV2ViQXBwVGVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0Lm1lbWxlYWsuY29tbW9uLk1lbW9yeUxlYWtTdWNjZWVkaW5nVGltZW91dDsKKworaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7CitpbXBvcnQgb3JnLmp1bml0LlJ1bGU7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bGVzLlRpbWVvdXQ7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKKworLyoqCisgKiBQZXJmb3JtcyB0aGUgdGVzdCBvZiBhIG1lbW9yeSBsZWFraW5nIFJFU1RmdWwgcmVzb3VyY2UuCisgKiA8cC8+CisgKiBUaGlzIHRlc3QgY2xhc3Mgc2hvdWxkIGJlIHVzZWQgdG8gdGVzdCB0aGUgbWVtb3J5IGxlYWtpbmcgdGVzdCBpbmZyYXN0cnVjdHVyZS4KKyAqLworcHVibGljIGNsYXNzIE1lbW9yeUxlYWtpbmdSZXNvdXJjZUlUQ2FzZSBleHRlbmRzIEFic3RyYWN0TWVtb3J5TGVha1dlYkFwcFRlc3QgeworCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgVGltZW91dCBnbG9iYWxUaW1lb3V0ID0gbmV3IE1lbW9yeUxlYWtTdWNjZWVkaW5nVGltZW91dCgxMDBfMDAwKTsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgVGVzdEFwcGxpY2F0aW9uKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyB0ZXN0IHJ1bnMgaSBzaW5nbGUgcmVxdWVzdDsgYXMgc3VjaCwgaXQgbWF5IG9yIG1heSBub3QgY2F1c2UgYSBtZW1vcnkgbGVhayAoYW5kIGVuZCB3aXRoIGEgZmFpbHVyZSkuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGhlTGVhaygpIHsKKworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgd2ViVGFyZ2V0ID0gdGFyZ2V0KCJpbnZva2UiKS5xdWVyeVBhcmFtKCJzaXplIiwgMTAyNCAqIDEwMjQpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4od2ViVGFyZ2V0LmdldFVyaSgpKTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB3ZWJUYXJnZXQucmVxdWVzdCgpLnBvc3QobnVsbCk7CisgICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAwLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyB0ZXN0IHNob3VsZCBmYWlsIGFmdGVyIGNlcnRhaW4gcGVyaW9kIG9mIHRpbWUgKGRlcGVuZGluZyBvbiB0aGUgSlZNIHNldHRpbmdzIHRvbykuCisgICAgICovCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0VGhlTGVha0VuZGxlc3MoKSB7CisKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnQoIi4iKTsKKyAgICAgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCJpbnZva2UiKS5xdWVyeVBhcmFtKCJzaXplIiwgMTAyNCAqIDEwMjQpLnJlcXVlc3QoKS5wb3N0KG51bGwpOworCisgICAgICAgICAgICBpZiAocmVzcG9uc2UuZ2V0U3RhdHVzKCkgIT0gMjAwKSB7CisgICAgICAgICAgICAgICAgZmFpbCgiVGhlIHNlcnZlciB3YXMgdW5hYmxlIHRvIGZ1bGZpbGwgdGhlIHJlcXVlc3QhIFRoaXMgbWF5IGluZGljYXRlIHRoYXQgT3V0T2ZNZW1vcnkgZXhjZXB0aW9uIG9jY3VycmVkLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9tZW0tbGVha3MvdGVzdC1jYXNlcy9wb20ueG1sIGIvdGVzdHMvbWVtLWxlYWtzL3Rlc3QtY2FzZXMvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2ZjZTYxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWVtLWxlYWtzL3Rlc3QtY2FzZXMvcG9tLnhtbApAQCAtMCwwICsxLDI4NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5tZW1sZWFrczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLm1lbWxlYWtzLnRlc3RjYXNlczwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLW1lbWxlYWstdGVzdGNhc2U8L25hbWU+CisKKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIE1lbW9yeSBsZWFrcyB0ZXN0IGNhc2VzLgorCisgICAgICAgIFRlc3RzIGluIHRoaXMgbWF2ZW4gc3VibW9kdWxlIGNhbiBiZSBlaXRoZXI6CisKKyAgICAgICAgWzFdIFNpbXBsZSB0ZXN0cyBleGVjdXRlZCBieSBtYXZlbi1zdXJlZmlyZS1wbHVnaW4gaW4gYSBkZWRpY2F0ZWQgSlZNLiBUaGVzZSB0ZXN0cyBzaG91bGQgYXR0ZW1wdCB0byBjYXVzZSBhIG1lbW9yeSBsZWFrCisgICAgICAgIGRpcmVjdGx5LiBUaGUgaGVhcCBjYW4gYmUgY29uZmlndXJlZCBieSBtZWFucyBvZiAnbWVtbGVhay5qdm0ubWF4aGVhcCcgcHJvcGVydHkuIEl0IGNhbiBiZSBjb21iaW5lZCB3aXRoIG90aGVyCisgICAgICAgIGluZnJhc3RydWN0dXJlIHdoaWNoIGlzIGRlc2NyaWJlZCBiZWxsb3cuCisKKyAgICAgICAgWzJdIEludGVncmF0aW9uIHRlc3RzIGV4ZWN1dGVkIGJ5IG1hdmVuLXN1cmVmaXJlLXBsdWdpbi4gVGhlc2UgdGVzdHMgc2hvdWxkIHRlc3QgYWdhaW5zdCBKZXJzZXkgYXBwbGljYXRpb24gZGVwbG95ZWQgdG8gYQorICAgICAgICBzZXJ2bGV0IGNvbnRhaW5lci4gVGhlIHN0YXRlIG9mIHRoZSBzZXJ2bGV0IGNvbnRhaW5lciAoZS5nLiwgd2hldGhlciBPdXRPZk1lbW9yeUVycm9yIG9jY3VycmVkKSBzaG91bGQgYmUgaW5zcGVjdGVkIGJ5CisgICAgICAgIGluZnJhc3RydWN0dXJlIGRlc2NyaWJlZCBiZWxsb3cuCisKKyAgICAgICAgVEVTVCBJTkZSQVNUUlVDVFVSRQorCisgICAgICAgIFRoZSB0ZXN0IGluZnJhc3RydWN0dXJlIGlzIGNvbmZpZ3VyZWQgZnJvbSBNYXZlbiBhbmQgdGhlIHRlc3RzIHNob3VsZCBiZSBleGVjdXRlZCBieSBNYXZlbi4gTm9ybWFsbHksIHRlc3QtY2FzZXMgc2hhbGwKKyAgICAgICAgb3ZlcnJpZGUgbWF2ZW4gcHJvcGVydGllcyBkZWZpbmVkIGluIHRoaXMgcG9tIGFuZCBkZWNsYXJlIHJlcXVpcmVkIG1hdmVuIHBsdWdpbnMgaW4gdGhlaXIgYnVpbGQgc2VjdGlvbi4gQWxsIHRoZSBtYXZlbgorICAgICAgICBwbHVnaW4gZXhlY3V0aW9ucyB3aWxsIGJlIGNvbmZpZ3VyZWQgZnJvbSB0aGlzIHBvbS4KKworICAgICAgICBbYV0gQ29udGFpbmVyIFJ1bm5lcnMgKG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLm1hdmVuOmNvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luKSBmZWF0dXJlIFdlYmxvZ2ljIGFuZAorICAgICAgICBHbGFzc2Zpc2g0IHdpdGggZnVuY3Rpb25hbGl0eTogZG93bmxvYWQsIHN0YXJ0LCBkZXBsb3kgYW5kIHN0b3AuCisKKyAgICAgICAgW2JdIE1hdmVuIEVuZm9yY2UgQ3VzdG9tIFJ1bGVzIChvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5tYXZlbjpjdXN0b20tZW5mb3JjZXItcnVsZXMpIHRoYXQgY2FuIGVuZm9yY2UKKyAgICAgICAgbm9uLWV4aXN0ZW50IEphdmEgSGVhcCBkdW1wcyBmaWxlcyBpbiBhIGNlcnRhaW4gcGF0aCBvciBubyBPdXRPZk1lbW9yeUVycm9yIGVycm9ycyBpbiBhIGxvZyBmaWxlLgorCisgICAgICAgIFtjXSBKZXR0eSBleGVjdXRpb24gaW4gYSBkZWRpY2F0ZWQgSlZNIHdpdGggY29uZmlndXJlZCB0byBkdW1wIGhlYXAgb24gT3V0T2ZNZW1vcnlFcnJvciBlcnJvcnMuCisKKyAgICAgICAgW2RdIENvbW1vbiBNZW1sZWFrIEpVbml0IHRlc3QgaW5mcmFzdHJ1Y3R1cmUgdGhhdCBwcm92aWRlcyBtZWFucyB0byBzdG9wIGEgdGVzdCBhZnRlciBhIGNlcnRhaW4gcGVyaW9kIG9mIHRpbWUgYW5kIG1hcmsKKyAgICAgICAgdGhlIHRlc3QgYXMgc3VjY2Vzc2Z1bCBhcyB3ZWxsIGFzIHRvIHBlcmZvcm0gaGVhcCBkdW1wcyBmcm9tIHRoZSBKYXZhIGNvZGUgb3IgdG8gaW5zcGVjdCBsb2cgZmlsZXMgZm9yIE91dE9mTWVtb3J5RXJyb3IKKyAgICAgICAgZXJyb3JzLgorCisgICAgICAgIEVYQU1QTEUgT0YgRVhFQ1VUSU9OCisKKyAgICAgICAgKGV4ZWN1dGVzIGFsbCBtZW1sZWFrIHRlc3QgY2FzZXMpCisgICAgICAgIG12biBjbGVhbiBpbnN0YWxsIC1hbWQgLXBsIHRlc3RzL21lbS1sZWFrcyAtUCBnZjQsbWVtbGVhay10ZXN0LWNhc2VzIC1mYWUKKworICAgICAgICAoZXhlY3V0ZXMgc2h1dGRvd24gaG9vayBsZWFrIHNpbmdsZSB0ZXN0IGNhc2UpCisgICAgICAgIG12biBjbGVhbiBpbnN0YWxsIC1hbSAtcGwgdGVzdHMvbWVtLWxlYWtzL3Rlc3QtY2FzZXMvc2h1dGRvd24taG9vay1sZWFrIC1QIGdmNCxtZW1sZWFrLXRlc3QtY2FzZXMgLWZhZQorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8bW9kdWxlcz4KKyAgICAgICAgPG1vZHVsZT5iZWFuLXBhcmFtLWxlYWs8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5zaHV0ZG93bi1ob29rLWxlYWs8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5zaHV0ZG93bi1ob29rLWxlYWstY2xpZW50PC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+bGVha2luZy10ZXN0LWFwcDwvbW9kdWxlPgorICAgIDwvbW9kdWxlcz4KKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8bWVtbGVhay50ZXN0LnRpbWVvdXQ+MzAwMDAwPC9tZW1sZWFrLnRlc3QudGltZW91dD4KKyAgICAgICAgPG1lbWxlYWsuamV0dHkubWF4aGVhcD4ke21lbWxlYWsuanZtLm1heGhlYXB9PC9tZW1sZWFrLmpldHR5Lm1heGhlYXA+CisKKyAgICAgICAgPCEtLSBieSBkZWZhdWx0LCBib3VuZCB0byAnbm9uZScgcGhhc2U7IGlmICdtZW1sZWFrLXRlc3QtY2FzZXMnIHByb2ZpbGUgYWN0aXZlLCB0aGV5J3JlIGFjdGl2YXRlZCAtLT4KKyAgICAgICAgPHBoYXNlLmNvbW1vbi5wcmUtaW50ZWdyYXRpb24tdGVzdD4ke3BoYXNlLnRlc3RzLnByZS1pbnRlZ3JhdGlvbi10ZXN0fTwvcGhhc2UuY29tbW9uLnByZS1pbnRlZ3JhdGlvbi10ZXN0PgorICAgICAgICA8cGhhc2UuY29tbW9uLnBvc3QtaW50ZWdyYXRpb24tdGVzdD4ke3BoYXNlLnRlc3RzLnBvc3QtaW50ZWdyYXRpb24tdGVzdH08L3BoYXNlLmNvbW1vbi5wb3N0LWludGVncmF0aW9uLXRlc3Q+CisKKyAgICAgICAgPHBoYXNlLnRlc3RzLnByZS1pbnRlZ3JhdGlvbi10ZXN0LmpldHR5PiR7cGhhc2UudGVzdHMucHJlLWludGVncmF0aW9uLXRlc3R9PC9waGFzZS50ZXN0cy5wcmUtaW50ZWdyYXRpb24tdGVzdC5qZXR0eT4KKyAgICAgICAgPHBoYXNlLnRlc3RzLnBvc3QtaW50ZWdyYXRpb24tdGVzdC5qZXR0eT4ke3BoYXNlLnRlc3RzLnBvc3QtaW50ZWdyYXRpb24tdGVzdH08L3BoYXNlLnRlc3RzLnBvc3QtaW50ZWdyYXRpb24tdGVzdC5qZXR0eT4KKyAgICA8L3Byb3BlcnRpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5NYW5hZ2VtZW50PgorICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0Lm1lbWxlYWsudGltZW91dD4ke21lbWxlYWsudGVzdC50aW1lb3V0fTwvamVyc2V5LmNvbmZpZy50ZXN0Lm1lbWxlYWsudGltZW91dD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5mYWN0b3J5PiR7ZXh0ZXJuYWwuY29udGFpbmVyLmZhY3Rvcnl9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIucG9ydD4ke2V4dGVybmFsLmNvbnRhaW5lci5wb3J0fTwvamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmNvbnRleHRSb290PiR7ZXh0ZXJuYWwuY29udGFpbmVyLmNvbnRleHRSb290fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvamVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5jb250ZXh0Um9vdD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5sb2dmaWxlPiR7ZXh0ZXJuYWwuY29udGFpbmVyLmxvZ0ZpbGV9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmxvZ2ZpbGU+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3N5c3RlbVByb3BlcnR5VmFyaWFibGVzPgorICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHRoZSAnZGVmYXVsdCcgaWQgaXMgYm91bmQgdG8gJ25vbmUnIGJlY2F1c2UgaXQncyBub3QgcG9zc2libGUgdG8gc3BsaXQgdGhlIGdvYWxzIGFuZCByZS1iaW5kIHRoZW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSBrZWVwaW5nIHRoZSAnZGVmYXVsdCcgaWQgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPmRlZmF1bHQ8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5ub25lPC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+cmUtYm91bmQtaW50ZWdyYXRpb24tdGVzdDwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5pbnRlZ3JhdGlvbi10ZXN0PC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPiR7cGhhc2UudGVzdHMuaW50ZWdyYXRpb24tdGVzdH08L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5yZS1ib3VuZC12ZXJpZnk8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+dmVyaWZ5PC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPiR7cGhhc2UudGVzdHMudmVyaWZ5fTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydHlWYXJpYWJsZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGplcnNleS5jb25maWcudGVzdC5tZW1sZWFrLnRpbWVvdXQ+JHttZW1sZWFrLnRlc3QudGltZW91dH08L2plcnNleS5jb25maWcudGVzdC5tZW1sZWFrLnRpbWVvdXQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGplcnNleS5jb25maWcudGVzdC5tZW1sZWFrLmhlYXBEdW1wUGF0aD4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvamVyc2V5LmNvbmZpZy50ZXN0Lm1lbWxlYWsuaGVhcER1bXBQYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxqZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmZhY3Rvcnk+JHtleHRlcm5hbC5jb250YWluZXIuZmFjdG9yeX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2plcnNleS5jb25maWcudGVzdC5jb250YWluZXIuZmFjdG9yeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8amVyc2V5LmNvbmZpZy50ZXN0LmNvbnRhaW5lci5wb3J0PiR7ZXh0ZXJuYWwuY29udGFpbmVyLnBvcnR9PC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLnBvcnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGplcnNleS5jb25maWcudGVzdC5jb250YWluZXIuY29udGV4dFJvb3Q+JHtleHRlcm5hbC5jb250YWluZXIuY29udGV4dFJvb3R9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9qZXJzZXkuY29uZmlnLnRlc3QuY29udGFpbmVyLmNvbnRleHRSb290PgorICAgICAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0eVZhcmlhYmxlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxhcmdMaW5lPi1YbXgke21lbWxlYWsuanZtLm1heGhlYXB9IC1YWDorSGVhcER1bXBPbk91dE9mTWVtb3J5RXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtWFg6SGVhcER1bXBQYXRoPSR7bWVtbGVhay5qdm0uaGVhcGR1bXBkaXJ9IC1YWDpHQ1RpbWVMaW1pdD0yMCAtWFg6R0NIZWFwRnJlZUxpbWl0PTMwCisgICAgICAgICAgICAgICAgICAgICAgICA8L2FyZ0xpbmU+CisgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5kZWZhdWx0LXRlc3Q8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+dGVzdDwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT4ke3BoYXNlLnRlc3RzLnRlc3R9PC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KKyAgICA8L2J1aWxkPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5tZW1sZWFrLXRlc3QtY2FzZXM8L2lkPgorICAgICAgICAgICAgPHByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgPCEtLSBzZXQgYWxsIHRoZSBwaGFzZXMgZm9yIHRoaXMgc3ViLW1vZHVsZSB0cmVlIHNvIHRoYXQgdGhlIGV4ZWN1dGlvbnMgYXJlIHVuLWJvdW5kIGZyb20gdGhlICdub25lJyBwaGFzZSAtLT4KKyAgICAgICAgICAgICAgICA8cGhhc2UudGVzdHMudGVzdD50ZXN0PC9waGFzZS50ZXN0cy50ZXN0PgorICAgICAgICAgICAgICAgIDxwaGFzZS50ZXN0cy5wcmUtaW50ZWdyYXRpb24tdGVzdD5wcmUtaW50ZWdyYXRpb24tdGVzdDwvcGhhc2UudGVzdHMucHJlLWludGVncmF0aW9uLXRlc3Q+CisgICAgICAgICAgICAgICAgPHBoYXNlLnRlc3RzLmludGVncmF0aW9uLXRlc3Q+aW50ZWdyYXRpb24tdGVzdDwvcGhhc2UudGVzdHMuaW50ZWdyYXRpb24tdGVzdD4KKyAgICAgICAgICAgICAgICA8cGhhc2UudGVzdHMucG9zdC1pbnRlZ3JhdGlvbi10ZXN0PnBvc3QtaW50ZWdyYXRpb24tdGVzdDwvcGhhc2UudGVzdHMucG9zdC1pbnRlZ3JhdGlvbi10ZXN0PgorICAgICAgICAgICAgICAgIDxwaGFzZS50ZXN0cy52ZXJpZnk+dmVyaWZ5PC9waGFzZS50ZXN0cy52ZXJpZnk+CisgICAgICAgICAgICA8L3Byb3BlcnRpZXM+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eS1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxza2lwPiR7c2tpcC50ZXN0c308L3NraXA+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzY2FuSW50ZXJ2YWxTZWNvbmRzPjEwPC9zY2FuSW50ZXJ2YWxTZWNvbmRzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3RvcFBvcnQ+OTk5OTwvc3RvcFBvcnQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdG9wS2V5PlNUT1A8L3N0b3BLZXk+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb250ZXh0UGF0aD4vJHtleHRlcm5hbC5jb250YWluZXIuY29udGV4dFJvb3R9PC9jb250ZXh0UGF0aD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGp2bUFyZ3M+LVhtczY0bSAtWG14JHttZW1sZWFrLmpldHR5Lm1heGhlYXB9IC1YWDpQZXJtU2l6ZT0xMjhtIC1YWDpNYXhQZXJtU2l6ZT0yNTZtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtWFg6K0hlYXBEdW1wT25PdXRPZk1lbW9yeUVycm9yIC1YWDpIZWFwRHVtcFBhdGg9JHttZW1sZWFrLmp2bS5oZWFwZHVtcGRpcn0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1EamV0dHkucG9ydD0ke2V4dGVybmFsLmNvbnRhaW5lci5wb3J0fSAtRGplcnNleS5jb25maWcudGVzdC5tZW1sZWFrLmpldHR5Lm1hZ2ljUnVubmVySWRlbnRpZmllcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLURvcmcuc2xmNGouc2ltcGxlTG9nZ2VyLmxvZ0ZpbGU9JHtleHRlcm5hbC5jb250YWluZXIubG9nRmlsZX0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9qdm1BcmdzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8d2FpdEZvckNoaWxkPmZhbHNlPC93YWl0Rm9yQ2hpbGQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPnN0YXJ0LWpldHR5PC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT4ke3BoYXNlLnRlc3RzLnByZS1pbnRlZ3JhdGlvbi10ZXN0LmpldHR5fTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+cnVuLWZvcmtlZDwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlkPnN0b3AtamV0dHk8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPiR7cGhhc2UudGVzdHMucG9zdC1pbnRlZ3JhdGlvbi10ZXN0LmpldHR5fTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+c3RvcDwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPnNsZjRqLXNpbXBsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuNy41PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKworICAgICAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZW5mb3JjZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsubWF2ZW48L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jdXN0b20tZW5mb3JjZXItcnVsZXM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY2llcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5lbmZvcmNlLW91dC1vZi1tZW1vcnktZGlkLW5vdC1vY2N1cjwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+ZW5mb3JjZTwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+JHtwaGFzZS50ZXN0cy5wb3N0LWludGVncmF0aW9uLXRlc3R9PC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxydWxlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJ1bGUgaW1wbGVtZW50YXRpb249Im9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QubWF2ZW4ucnVsZS5GaWxlUGF0dGVybkRvZXNOb3RFeGlzdFJ1bGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWxlPiR7bWVtbGVhay5qdm0uaGVhcGR1bXBkaXJ9L2phdmFfcGlkKi5ocHJvZjwvZmlsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcnVsZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHJ1bGUgaW1wbGVtZW50YXRpb249Im9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QubWF2ZW4ucnVsZS5QYXR0ZXJuTm90TWF0Y2hlZEluRmlsZVJ1bGUiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbGU+JHtleHRlcm5hbC5jb250YWluZXIubG9nRmlsZX08L2ZpbGU+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cGF0dGVybj4uKmphdmFcLmxhbmdcLk91dE9mTWVtb3J5RXJyb3IuKjwvcGF0dGVybj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9ydWxlPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvcnVsZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZhaWw+dHJ1ZTwvZmFpbD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLm1hdmVuPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbnRhaW5lci1ydW5uZXItbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisKKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+Z2Y0PC9pZD4KKyAgICAgICAgICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICAgICAgICAgIDxwaGFzZS50ZXN0cy5wcmUtaW50ZWdyYXRpb24tdGVzdC5qZXR0eT5ub25lPC9waGFzZS50ZXN0cy5wcmUtaW50ZWdyYXRpb24tdGVzdC5qZXR0eT4KKyAgICAgICAgICAgICAgICA8cGhhc2UudGVzdHMucG9zdC1pbnRlZ3JhdGlvbi10ZXN0LmpldHR5Pm5vbmU8L3BoYXNlLnRlc3RzLnBvc3QtaW50ZWdyYXRpb24tdGVzdC5qZXR0eT4KKyAgICAgICAgICAgIDwvcHJvcGVydGllcz4KKyAgICAgICAgPC9wcm9maWxlPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD53bHM8L2lkPgorICAgICAgICAgICAgPHByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgPHBoYXNlLnRlc3RzLnByZS1pbnRlZ3JhdGlvbi10ZXN0LmpldHR5Pm5vbmU8L3BoYXNlLnRlc3RzLnByZS1pbnRlZ3JhdGlvbi10ZXN0LmpldHR5PgorICAgICAgICAgICAgICAgIDxwaGFzZS50ZXN0cy5wb3N0LWludGVncmF0aW9uLXRlc3QuamV0dHk+bm9uZTwvcGhhc2UudGVzdHMucG9zdC1pbnRlZ3JhdGlvbi10ZXN0LmpldHR5PgorICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnRvbWNhdDwvaWQ+CisgICAgICAgICAgICA8cHJvcGVydGllcz4KKyAgICAgICAgICAgICAgICA8cGhhc2UudGVzdHMucHJlLWludGVncmF0aW9uLXRlc3QuamV0dHk+bm9uZTwvcGhhc2UudGVzdHMucHJlLWludGVncmF0aW9uLXRlc3QuamV0dHk+CisgICAgICAgICAgICAgICAgPHBoYXNlLnRlc3RzLnBvc3QtaW50ZWdyYXRpb24tdGVzdC5qZXR0eT5ub25lPC9waGFzZS50ZXN0cy5wb3N0LWludGVncmF0aW9uLXRlc3QuamV0dHk+CisgICAgICAgICAgICA8L3Byb3BlcnRpZXM+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICA8L3Byb2ZpbGVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9tZW0tbGVha3MvdGVzdC1jYXNlcy9zaHV0ZG93bi1ob29rLWxlYWstY2xpZW50L3BvbS54bWwgYi90ZXN0cy9tZW0tbGVha3MvdGVzdC1jYXNlcy9zaHV0ZG93bi1ob29rLWxlYWstY2xpZW50L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU1NGIwNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21lbS1sZWFrcy90ZXN0LWNhc2VzL3NodXRkb3duLWhvb2stbGVhay1jbGllbnQvcG9tLnhtbApAQCAtMCwwICsxLDYyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLm1lbWxlYWtzLnRlc3RjYXNlczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPnNodXRkb3duLWhvb2stbGVhay1jbGllbnQ8L2FydGlmYWN0SWQ+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLW1lbWxlYWstdGVzdGNhc2Utc2h1dGRvd24taG9vay1sZWFrLWNsaWVudDwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgVGhpcyB3ZWIgcHJvamVjdCByZXByb2R1Y2VzIHRpY2tldHM6IEpFUlNFWS0yNjg4IEpFUlNFWS0yNzg2CisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8bWVtbGVhay5qdm0ubWF4aGVhcD4xMjhtPC9tZW1sZWFrLmp2bS5tYXhoZWFwPgorICAgICAgICA8bWVtbGVhay50ZXN0LnRpbWVvdXQ+MzAwMDA8L21lbWxlYWsudGVzdC50aW1lb3V0PgorICAgIDwvcHJvcGVydGllcz4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcms8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tZW1sZWFrLXRlc3QtY29tbW9uPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPm1lbWxlYWstcmVwcm9kdWNlcjwvaWQ+CisgICAgICAgICAgICA8cHJvcGVydGllcz4KKyAgICAgICAgICAgICAgICA8bWVtbGVhay5qZXJzZXkudmVyc2lvbj4yLjE3PC9tZW1sZWFrLmplcnNleS52ZXJzaW9uPgorICAgICAgICAgICAgPC9wcm9wZXJ0aWVzPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgPC9wcm9maWxlcz4KKworPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvbWVtLWxlYWtzL3Rlc3QtY2FzZXMvc2h1dGRvd24taG9vay1sZWFrLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL21lbWxlYWtzL3NodXRkb3dubGVhay9jbGllbnQvRW5kbGVzc1NodXRkb3duSG9va0xlYWtUZXN0LmphdmEgYi90ZXN0cy9tZW0tbGVha3MvdGVzdC1jYXNlcy9zaHV0ZG93bi1ob29rLWxlYWstY2xpZW50L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvbWVtbGVha3Mvc2h1dGRvd25sZWFrL2NsaWVudC9FbmRsZXNzU2h1dGRvd25Ib29rTGVha1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzBiNzZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWVtLWxlYWtzL3Rlc3QtY2FzZXMvc2h1dGRvd24taG9vay1sZWFrLWNsaWVudC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL21lbWxlYWtzL3NodXRkb3dubGVhay9jbGllbnQvRW5kbGVzc1NodXRkb3duSG9va0xlYWtUZXN0LmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5tZW1sZWFrcy5zaHV0ZG93bmxlYWsuY2xpZW50OworCitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuSW52b2NhdGlvbi5CdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0Lm1lbWxlYWsuY29tbW9uLkFic3RyYWN0TWVtb3J5TGVha1NpbXBsZVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5tZW1sZWFrLmNvbW1vbi5NZW1vcnlMZWFrU3VjY2VlZGluZ1RpbWVvdXQ7CisKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGltZW91dDsKKworLyoqCisgKiBSZXByb2R1Y2VyIGZvciBKRVJTRVktMjc4Ni4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBFbmRsZXNzU2h1dGRvd25Ib29rTGVha1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdE1lbW9yeUxlYWtTaW1wbGVUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBMT0dHRVIgPSBMb2dnZXIuZ2V0TG9nZ2VyKEVuZGxlc3NTaHV0ZG93bkhvb2tMZWFrVGVzdC5jbGFzcy5nZXROYW1lKCkpOworCisgICAgQFJ1bGUKKyAgICBwdWJsaWMgVGltZW91dCBnbG9iYWxUaW1lb3V0ID0gbmV3IE1lbW9yeUxlYWtTdWNjZWVkaW5nVGltZW91dCgpOworCisgICAgZmluYWwgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KCk7CisgICAgZmluYWwgV2ViVGFyZ2V0IHRhcmdldCA9IGNsaWVudC50YXJnZXQoImh0dHA6Ly9leGFtcGxlLmNvbSIpOworCisgICAgcHVibGljIEVuZGxlc3NTaHV0ZG93bkhvb2tMZWFrVGVzdCgpIHsKKyAgICAgICAgTE9HR0VSLmZpbmUoIlByZXBhcmluZy4uLiIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDA7ICsraSkgeworICAgICAgICAgICAgc2h1dGRvd25Ib29rTGVha0l0ZXJhdGlvbigpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2h1dGRvd25Ib29rRG9lc05vdExlYWsoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIHNodXRkb3duSG9va0xlYWtJdGVyYXRpb24oKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBzaHV0ZG93bkhvb2tMZWFrSXRlcmF0aW9uKCkgeworICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIuIik7CisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQyID0gdGFyZ2V0LnByb3BlcnR5KCJXYXNoaW5ndG9uIiwgIklydmluZyIpOworICAgICAgICBCdWlsZGVyIHJlcSA9IHRhcmdldDIucmVxdWVzdCgpLnByb3BlcnR5KCJob3ciLCAibm93Iik7CisgICAgICAgIHJlcS5idWlsZEdldCgpLnByb3BlcnR5KCJJcnZpbmciLCAiV2FzaGluZ3RvbiIpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbWVtLWxlYWtzL3Rlc3QtY2FzZXMvc2h1dGRvd24taG9vay1sZWFrL3BvbS54bWwgYi90ZXN0cy9tZW0tbGVha3MvdGVzdC1jYXNlcy9zaHV0ZG93bi1ob29rLWxlYWsvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDM4NmJjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvbWVtLWxlYWtzL3Rlc3QtY2FzZXMvc2h1dGRvd24taG9vay1sZWFrL3BvbS54bWwKQEAgLTAsMCArMSw5NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5tZW1sZWFrcy50ZXN0Y2FzZXM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5zaHV0ZG93bi1ob29rLWxlYWs8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtbWVtbGVhay10ZXN0Y2FzZS1zaHV0ZG93bi1ob29rLWxlYWs8L25hbWU+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPG1lbWxlYWsuanZtLm1heGhlYXA+MTI4bTwvbWVtbGVhay5qdm0ubWF4aGVhcD4KKyAgICAgICAgPG1lbWxlYWsudG9tY2F0Lm1heGhlYXA+MTI4bTwvbWVtbGVhay50b21jYXQubWF4aGVhcD4KKyAgICAgICAgPG1lbWxlYWsudGVzdC50aW1lb3V0PjEyMDAwMDwvbWVtbGVhay50ZXN0LnRpbWVvdXQ+CisgICAgPC9wcm9wZXJ0aWVzPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZXh0ZXJuYWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZ3JpenpseTI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWVtbGVhay10ZXN0LWNvbW1vbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+YnVpbGQtaGVscGVyLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZmFpbHNhZmUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmpldHR5LW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5tYXZlbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb250YWluZXItcnVubmVyLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZW5mb3JjZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5tZW1sZWFrLXJlcHJvZHVjZXI8L2lkPgorICAgICAgICAgICAgPHByb3BlcnRpZXM+CisgICAgICAgICAgICAgICAgPG1lbWxlYWsuamVyc2V5LnZlcnNpb24+Mi4xNTwvbWVtbGVhay5qZXJzZXkudmVyc2lvbj4KKyAgICAgICAgICAgIDwvcHJvcGVydGllcz4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL21lbS1sZWFrcy90ZXN0LWNhc2VzL3NodXRkb3duLWhvb2stbGVhay9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL21lbWxlYWtzL3NodXRkb3duaG9vay9DbGllbnRTaHV0ZG93bkxlYWtSZXNvdXJjZS5qYXZhIGIvdGVzdHMvbWVtLWxlYWtzL3Rlc3QtY2FzZXMvc2h1dGRvd24taG9vay1sZWFrL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvbWVtbGVha3Mvc2h1dGRvd25ob29rL0NsaWVudFNodXRkb3duTGVha1Jlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYyYThkYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21lbS1sZWFrcy90ZXN0LWNhc2VzL3NodXRkb3duLWhvb2stbGVhay9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL21lbWxlYWtzL3NodXRkb3duaG9vay9DbGllbnRTaHV0ZG93bkxlYWtSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMubWVtbGVha3Muc2h1dGRvd25ob29rOworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5JbnZvY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5XZWJUYXJnZXQ7CisKK2ltcG9ydCBqYXZheC5pbmplY3QuU2luZ2xldG9uOworCisvKioKKyAqIFRoaXMgcmVzb3VyY2UgcmVwcm9kdWNlcyBKRVJTRVktMjc4NiB3aGVuIHtAbGluayAjaW52b2tlQ2xpZW50KCl9IGNhbGxlZCByZXBldGl0aXZlbHkuCisgKgorICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYSBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiY2xpZW50IikKK0BTaW5nbGV0b24KK3B1YmxpYyBjbGFzcyBDbGllbnRTaHV0ZG93bkxlYWtSZXNvdXJjZSB7CisKKyAgICBmaW5hbCBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKTsKKyAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gY2xpZW50LnRhcmdldCgiaHR0cDovL2V4YW1wbGUuY29tIik7CisKKyAgICBAUE9TVAorICAgIEBQYXRoKCJpbnZva2UiKQorICAgIHB1YmxpYyBTdHJpbmcgaW52b2tlQ2xpZW50KCkgeworCisgICAgICAgIFdlYlRhcmdldCB0YXJnZXQyID0gdGFyZ2V0LnByb3BlcnR5KCJXYXNoaW5ndG9uIiwgIklydmluZyIpOworICAgICAgICBJbnZvY2F0aW9uLkJ1aWxkZXIgcmVxID0gdGFyZ2V0Mi5yZXF1ZXN0KCkucHJvcGVydHkoImhvdyIsICJub3ciKTsKKyAgICAgICAgcmVxLmJ1aWxkR2V0KCkucHJvcGVydHkoIklydmluZyIsICJXYXNoaW5ndG9uIik7CisKKyAgICAgICAgcmV0dXJuIHRhcmdldC50b1N0cmluZygpOworCisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJoZWxsb3dvcmxkIikKKyAgICBAUHJvZHVjZXMoInRleHQvcGxhaW4iKQorICAgIHB1YmxpYyBTdHJpbmcgaGVsbG9Xb3JsZCgpIHsKKyAgICAgICAgcmV0dXJuICJIRUxMTyBXT1JMRCEiOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvbWVtLWxlYWtzL3Rlc3QtY2FzZXMvc2h1dGRvd24taG9vay1sZWFrL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvbWVtbGVha3Mvc2h1dGRvd25ob29rL1Rlc3RBcHBsaWNhdGlvbi5qYXZhIGIvdGVzdHMvbWVtLWxlYWtzL3Rlc3QtY2FzZXMvc2h1dGRvd24taG9vay1sZWFrL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvbWVtbGVha3Mvc2h1dGRvd25ob29rL1Rlc3RBcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZGRiMzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9tZW0tbGVha3MvdGVzdC1jYXNlcy9zaHV0ZG93bi1ob29rLWxlYWsvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9tZW1sZWFrcy9zaHV0ZG93bmhvb2svVGVzdEFwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSwyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5tZW1sZWFrcy5zaHV0ZG93bmhvb2s7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKKy8qKgorICogQGF1dGhvciBTdGVwYW4gVmF2cmEgKHN0ZXBhbi52YXZyYSBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgVGVzdEFwcGxpY2F0aW9uIGV4dGVuZHMgUmVzb3VyY2VDb25maWcgeworCisgICAgcHVibGljIFRlc3RBcHBsaWNhdGlvbigpIHsKKyAgICAgICAgcmVnaXN0ZXIoQ2xpZW50U2h1dGRvd25MZWFrUmVzb3VyY2UuY2xhc3MpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL21lbS1sZWFrcy90ZXN0LWNhc2VzL3NodXRkb3duLWhvb2stbGVhay9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvbWVtLWxlYWtzL3Rlc3QtY2FzZXMvc2h1dGRvd24taG9vay1sZWFrL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM2YThkMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21lbS1sZWFrcy90ZXN0LWNhc2VzL3NodXRkb3duLWhvb2stbGVhay9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzcgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMi41IiB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8yXzUueHNkIgorICAgICAgICBtZXRhZGF0YS1jb21wbGV0ZT0idHJ1ZSIgPgorCisgICAgPGZpbHRlcj4KKyAgICAgICAgPGZpbHRlci1uYW1lPmplcnNleTwvZmlsdGVyLW5hbWU+CisgICAgICAgIDxmaWx0ZXItY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9maWx0ZXItY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMubWVtbGVha3Muc2h1dGRvd25ob29rLlRlc3RBcHBsaWNhdGlvbjwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICA8L2ZpbHRlcj4KKworICAgIDxmaWx0ZXItbWFwcGluZz4KKyAgICAgICAgPGZpbHRlci1uYW1lPmplcnNleTwvZmlsdGVyLW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9maWx0ZXItbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL21lbS1sZWFrcy90ZXN0LWNhc2VzL3NodXRkb3duLWhvb2stbGVhay9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL21lbWxlYWtzL3NodXRkb3duaG9vay9TaHV0ZG93bkxlYWtSZXNvdXJjZUlUQ2FzZS5qYXZhIGIvdGVzdHMvbWVtLWxlYWtzL3Rlc3QtY2FzZXMvc2h1dGRvd24taG9vay1sZWFrL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvbWVtbGVha3Mvc2h1dGRvd25ob29rL1NodXRkb3duTGVha1Jlc291cmNlSVRDYXNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ1NTU0ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL21lbS1sZWFrcy90ZXN0LWNhc2VzL3NodXRkb3duLWhvb2stbGVhay9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL21lbWxlYWtzL3NodXRkb3duaG9vay9TaHV0ZG93bkxlYWtSZXNvdXJjZUlUQ2FzZS5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMubWVtbGVha3Muc2h1dGRvd25ob29rOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5tZW1sZWFrLmNvbW1vbi5BYnN0cmFjdE1lbW9yeUxlYWtXZWJBcHBUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QubWVtbGVhay5jb21tb24uTWVtb3J5TGVha1N1Y2NlZWRpbmdUaW1lb3V0OworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGltZW91dDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5mYWlsOworCisvKioKKyAqIFRoaXMgaXMgYW4gaW50ZWdyYXRpb24gdGVzdCB0aGF0IHJlcHJvZHVjZXMgSkVSU0VZLTI3ODYgYnkgY2FsbGluZyBSRVNUZnVsIHJlc291cmNlIHtAbGluayBDbGllbnRTaHV0ZG93bkxlYWtSZXNvdXJjZX0KKyAqIHJlcGV0aXRpdmVseS4KKyAqCisgKiBAYXV0aG9yIFN0ZXBhbiBWYXZyYSAoc3RlcGFuLnZhdnJhIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBTaHV0ZG93bkxlYWtSZXNvdXJjZUlUQ2FzZSBleHRlbmRzIEFic3RyYWN0TWVtb3J5TGVha1dlYkFwcFRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUZXN0QXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAUnVsZQorICAgIHB1YmxpYyBUaW1lb3V0IGdsb2JhbFRpbWVvdXQgPSBuZXcgTWVtb3J5TGVha1N1Y2NlZWRpbmdUaW1lb3V0KDIwXzAwMCk7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RUaGVMZWFrUmVzb3VyY2VPbmNlKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiY2xpZW50L2ludm9rZSIpLnJlcXVlc3QoKS5wb3N0KG51bGwpOworICAgICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMCwgcmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFRoZUxlYWtFbmRsZXNzKCkgeworCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50KCIuIik7CisgICAgICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgiY2xpZW50L2ludm9rZSIpLnJlcXVlc3QoKS5wb3N0KG51bGwpOworCisgICAgICAgICAgICBpZiAocmVzcG9uc2UuZ2V0U3RhdHVzKCkgIT0gMjAwKSB7CisgICAgICAgICAgICAgICAgZmFpbCgiVGhlIHNlcnZlciB3YXMgdW5hYmxlIHRvIGZ1bGZpbGwgdGhlIHJlcXVlc3QhIFRoaXMgbWF5IGluZGljYXRlIHRoYXQgT3V0T2ZNZW1vcnkgZXhjZXB0aW9uIG9jY3VycmVkLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9vc2dpL2Z1bmN0aW9uYWwvcG9tLnhtbCBiL3Rlc3RzL29zZ2kvZnVuY3Rpb25hbC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlYjFiYTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9vc2dpL2Z1bmN0aW9uYWwvcG9tLnhtbApAQCAtMCwwICsxLDQxNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KKworICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLm9zZ2k8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdHMtb3NnaS1mdW5jdGlvbmFsPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLW9zZ2ktZnVuY3Rpb25hbDwvbmFtZT4KKyAgICA8ZGVzY3JpcHRpb24+CisgICAgICAgIEZ1bmN0aW9uYWwgSmVyc2V5IE9TR2kgdGVzdHMKKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxpZD50ZXN0LWNvbXBpbGU8L2lkPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnRlc3QtY29tcGlsZTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+dGVzdENvbXBpbGU8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVzb3VyY2VzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wcm9jZXNzLXRlc3QtcmVzb3VyY2VzPC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD50ZXN0UmVzb3VyY2VzPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGZvcmtDb3VudD4xPC9mb3JrQ291bnQ+CisgICAgICAgICAgICAgICAgICAgIDxyZXVzZUZvcmtzPmZhbHNlPC9yZXVzZUZvcmtzPgorICAgICAgICAgICAgICAgICAgICA8ZW5hYmxlQXNzZXJ0aW9ucz5mYWxzZTwvZW5hYmxlQXNzZXJ0aW9ucz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+dGVzdDwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+dGVzdDwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+dGVzdDwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPCEtLSB1c2UgcGF4IGV4YW0gbWF2ZW4gcGx1Z2luIC0tPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcub3BzNGoucGF4LmV4YW08L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGF4ZXhhbS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+Z2VuZXJhdGUtY29uZmlnPC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5nZW5lcmF0ZS1kZXBlbmRzLWZpbGU8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICA8L3BsdWdpbj4KKworICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguYW5ub3RhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LmFubm90YXRpb24tYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm9wczRqLnBheC5leGFtPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGF4LWV4YW08L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcub3BzNGoucGF4LmV4YW08L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5wYXgtZXhhbS1qdW5pdDQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgICAgICA8ZXhjbHVzaW9ucz4KKyAgICAgICAgICAgICAgICA8ZXhjbHVzaW9uPgorICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWxvZ2dpbmc8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbG9nZ2luZzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8L2V4Y2x1c2lvbj4KKyAgICAgICAgICAgIDwvZXhjbHVzaW9ucz4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtbG9nZ2luZzwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbG9nZ2luZzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5vcHM0ai5wYXguZXhhbTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnBheC1leGFtLWNvbnRhaW5lci1mb3JrZWQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcub3BzNGoucGF4LmV4YW08L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5wYXgtZXhhbS1qdW5pdC1leHRlbmRlci1pbXBsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5mZWxpeDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm9yZy5hcGFjaGUuZmVsaXguZnJhbWV3b3JrPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm9wczRqLnBheC5leGFtPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+cGF4LWV4YW0tbGluay1tdm48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcub3BzNGoucGF4LnVybDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnBheC11cmwtYWV0aGVyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+MS42LjA8L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1ncml6emx5Mi1odHRwPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItZ3JpenpseTItc2VydmxldDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guZ3JpenpseTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmdyaXp6bHktaHR0cC1zZXJ2bGV0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jbGllbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8IS0tIGRlcGVuZGVjaWVzIGZvciBPU0dpIHRlc3Qgd2l0aCBBcGFjaGUgY29ubmVjdG9yIC0tPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbm5lY3RvcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktYXBhY2hlLWNvbm5lY3RvcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5vcHM0ai5wYXgubG9nZ2luZzwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnBheC1sb2dnaW5nLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjEuOC4zPC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5odHRwY29tcG9uZW50czwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmh0dHBjb3JlLW9zZ2k8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgICAgICA8dmVyc2lvbj40LjQuMzwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5odHRwY2xpZW50LW9zZ2k8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgICAgICA8dmVyc2lvbj4ke2h0dHBjbGllbnQudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLWpzb24tamFja3NvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLWpzb24tamFja3NvbjE8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1qc29uLWpldHRpc29uPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtbW94eTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLWpzb24tcHJvY2Vzc2luZzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1iZWFuLXZhbGlkYXRpb248L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5leHQ8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktZW50aXR5LWZpbHRlcmluZzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLW11bHRpcGFydDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLXNzZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1wcm94eS1jbGllbnQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yazwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuYnVuZGxlczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmpheHJzLXJpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXR0eTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amV0dHktdXRpbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGktMi41PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgudmFsaWRhdGlvbjwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnZhbGlkYXRpb24tYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmhpYmVybmF0ZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmhpYmVybmF0ZS12YWxpZGF0b3I8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuamJvc3MubG9nZ2luZzwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmpib3NzLWxvZ2dpbmc8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZmFzdGVyeG1sPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y2xhc3NtYXRlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguZWw8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC5lbC1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXguanNvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2g8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc29ucC1qYXhyczwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guaGsyLmV4dGVybmFsPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+YW9wYWxsaWFuY2UtcmVwYWNrYWdlZDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5qYXZhc3Npc3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZhc3Npc3Q8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amFja3Nvbi1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmZhc3RlcnhtbC5qYWNrc29uLmNvcmU8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYWNrc29uLWRhdGFiaW5kPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmZhc3RlcnhtbC5qYWNrc29uLm1vZHVsZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphY2tzb24tbW9kdWxlLWpheGItYW5ub3RhdGlvbnM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZmFzdGVyeG1sLmphY2tzb24uY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphY2tzb24tYW5ub3RhdGlvbnM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZmFzdGVyeG1sLmphY2tzb24uamF4cnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYWNrc29uLWpheHJzLWJhc2U8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5jb20uZmFzdGVyeG1sLmphY2tzb24uamF4cnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYWNrc29uLWpheHJzLWpzb24tcHJvdmlkZXI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5qYWNrc29uPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amFja3Nvbi1jb3JlLWFzbDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5qYWNrc29uPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amFja3Nvbi1tYXBwZXItYXNsPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLmphY2tzb248L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYWNrc29uLWpheHJzPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLmphY2tzb248L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYWNrc29uLXhjPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPCEtLSBsb2dnaW5nIC0tPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5zbGY0ajwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPnNsZjRqLWxvZzRqMTI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjYuNDwvdmVyc2lvbj4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD50ZXN0c1NraXBKZGs2PC9pZD4KKyAgICAgICAgICAgIDxhY3RpdmF0aW9uPgorICAgICAgICAgICAgICAgIDxqZGs+MS42PC9qZGs+CisgICAgICAgICAgICA8L2FjdGl2YXRpb24+CisgICAgICAgICAgICA8YnVpbGQ+CisgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGNsdWRlPioqL1BhY2thZ2VTY2FubmluZ1Rlc3QuamF2YTwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICA8L2J1aWxkPgorICAgICAgICA8L3Byb2ZpbGU+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnNvbmFyPC9pZD4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZGlzYWJsZSBKYUNvQ28gbGlzdGVuZXIgYmVjYXVzZSBpdCdzIG5vdCB3b3JraW5nIHdpdGggPGZvcmtNb2RlPmFsd2F5czwvZm9yaz4gKDxyZXVzZUZvcmtzPmZhbHNlPC9yZXVzZUZvcmtzPiByZXNwZWN0aXZlbHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBzOi8vamlyYS5zb25hcnNvdXJjZS5jb20vYnJvd3NlL1NPTkFSSkFWQS03MjggKGh0dHBzOi8vZ2l0aHViLmNvbS9Tb25hclNvdXJjZS9zb25hci1qYXZhL3B1bGwvMzI0KSAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnRpZXMgY29tYmluZS5zZWxmPSJvdmVycmlkZSIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICA8L3Byb2ZpbGVzPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9vc2dpL2Z1bmN0aW9uYWwvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vc2dpL3Rlc3QvYmFzaWMvQWJzdHJhY3RKc29uT3NnaUludGVncmF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L2Jhc2ljL0Fic3RyYWN0SnNvbk9zZ2lJbnRlZ3JhdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDNhNWRjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L2Jhc2ljL0Fic3RyYWN0SnNvbk9zZ2lJbnRlZ3JhdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9zZ2kudGVzdC5iYXNpYzsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkyLmh0dHBzZXJ2ZXIuR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9zZ2kudGVzdC51dGlsLkhlbHBlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmdyaXp6bHkuaHR0cC5zZXJ2ZXIuSHR0cFNlcnZlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcub3BzNGoucGF4LmV4YW0uanVuaXQuUGF4RXhhbTsKK2ltcG9ydCBzdGF0aWMgb3JnLmhhbWNyZXN0LkNvcmVNYXRjaGVycy5jb250YWluc1N0cmluZzsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUaGF0OworCisvKioKKyAqIEFic3RyYWN0IEpTT04gT1NHaSBpbnRlZ3JhdGlvbiB0ZXN0LgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUnVuV2l0aChQYXhFeGFtLmNsYXNzKQorcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0SnNvbk9zZ2lJbnRlZ3JhdGlvblRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFWFQgPSAiL2plcnNleSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIGJhc2VVcmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3QiKS5wb3J0KEhlbHBlci5nZXRQb3J0KCkpLnBhdGgoQ09OVEVYVCkuYnVpbGQoKTsKKworICAgIHByb3RlY3RlZCBhYnN0cmFjdCBGZWF0dXJlIGdldEpzb25Qcm92aWRlckZlYXR1cmUoKTsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpzb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgRmVhdHVyZSBqc29uUHJvdmlkZXJGZWF0dXJlID0gZ2V0SnNvblByb3ZpZGVyRmVhdHVyZSgpOworICAgICAgICBmaW5hbCBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKTsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoSnNvblJlc291cmNlLmNsYXNzKTsKKworICAgICAgICBpZiAoanNvblByb3ZpZGVyRmVhdHVyZSAhPSBudWxsKSB7CisgICAgICAgICAgICBjbGllbnQucmVnaXN0ZXIoanNvblByb3ZpZGVyRmVhdHVyZSk7CisgICAgICAgICAgICByZXNvdXJjZUNvbmZpZy5yZWdpc3Rlcihqc29uUHJvdmlkZXJGZWF0dXJlKTsKKyAgICAgICAgfQorCisgICAgICAgIEh0dHBTZXJ2ZXIgc2VydmVyID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIHNlcnZlciA9IEdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeS5jcmVhdGVIdHRwU2VydmVyKGJhc2VVcmksIHJlc291cmNlQ29uZmlnKTsKKworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IGNsaWVudC50YXJnZXQoYmFzZVVyaSkucGF0aCgiL2pzb24iKS5yZXF1ZXN0KE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKS5nZXQoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSRVNVTFQgPSAiICsgcmVzdWx0KTsKKyAgICAgICAgICAgIGFzc2VydFRoYXQocmVzdWx0LCBjb250YWluc1N0cmluZygiSmltIikpOworICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgaWYgKHNlcnZlciAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgc2VydmVyLnNodXRkb3duTm93KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9vc2dpL2Z1bmN0aW9uYWwvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vc2dpL3Rlc3QvYmFzaWMvQXBhY2hlT3NnaUludGVncmF0aW9uVGVzdC5qYXZhIGIvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L2Jhc2ljL0FwYWNoZU9zZ2lJbnRlZ3JhdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2UzNzZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L2Jhc2ljL0FwYWNoZU9zZ2lJbnRlZ3JhdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDkxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9zZ2kudGVzdC5iYXNpYzsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmdyaXp6bHkuaHR0cC5zZXJ2ZXIuSHR0cFNlcnZlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5hcGFjaGUuY29ubmVjdG9yLkFwYWNoZUNvbm5lY3RvclByb3ZpZGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseTIuaHR0cHNlcnZlci5Hcml6emx5SHR0cFNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkub3NnaS50ZXN0LnV0aWwuSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcub3BzNGoucGF4LmV4YW0uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcub3BzNGoucGF4LmV4YW0uT3B0aW9uOworaW1wb3J0IG9yZy5vcHM0ai5wYXguZXhhbS5qdW5pdC5QYXhFeGFtOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcub3BzNGoucGF4LmV4YW0uQ29yZU9wdGlvbnMubWF2ZW5CdW5kbGU7CisKKy8qKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitAUnVuV2l0aChQYXhFeGFtLmNsYXNzKQorcHVibGljIGNsYXNzIEFwYWNoZU9zZ2lJbnRlZ3JhdGlvblRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIGJhc2VVcmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3QiKS5wb3J0KEhlbHBlci5nZXRQb3J0KCkpLnBhdGgoIi9qZXJzZXkiKS5idWlsZCgpOworCisgICAgQENvbmZpZ3VyYXRpb24KKyAgICBwdWJsaWMgc3RhdGljIE9wdGlvbltdIGNvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgIGZpbmFsIExpc3Q8T3B0aW9uPiBvcHRpb25zID0gSGVscGVyLmdldENvbW1vbk9zZ2lPcHRpb25zKCk7CisgICAgICAgIG9wdGlvbnMuYWRkQWxsKEhlbHBlci5leHBhbmRlZExpc3QoCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcub3BzNGoucGF4LmxvZ2dpbmciKS5hcnRpZmFjdElkKCJwYXgtbG9nZ2luZy1hcGkiKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5hcGFjaGUuaHR0cGNvbXBvbmVudHMiKS5hcnRpZmFjdElkKCJodHRwY29yZS1vc2dpIikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuYXBhY2hlLmh0dHBjb21wb25lbnRzIikuYXJ0aWZhY3RJZCgiaHR0cGNsaWVudC1vc2dpIikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuZ2xhc3NmaXNoLmplcnNleS5jb25uZWN0b3JzIikuYXJ0aWZhY3RJZCgiamVyc2V5LWFwYWNoZS1jb25uZWN0b3IiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnZlcnNpb25Bc0luUHJvamVjdCgpCisKKyAgICAgICAgKSk7CisgICAgICAgIHJldHVybiBIZWxwZXIuYXNBcnJheShvcHRpb25zKTsKKyAgICB9CisKKyAgICBAUGF0aCgiL2FwYWNoZU9zZ2lUZXN0IikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEFwYWNoZU9zZ2lUZXN0UmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRNZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAiT0siOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlUmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoQXBhY2hlT3NnaVRlc3RSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIGZpbmFsIEh0dHBTZXJ2ZXIgc2VydmVyID0gR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5LmNyZWF0ZUh0dHBTZXJ2ZXIoYmFzZVVyaSwgcmVzb3VyY2VDb25maWcpOworCisgICAgICAgIGZpbmFsIENsaWVudENvbmZpZyBjbGllbnRDb25maWcgPSBuZXcgQ2xpZW50Q29uZmlnKCk7CisgICAgICAgIGNsaWVudENvbmZpZy5jb25uZWN0b3JQcm92aWRlcihuZXcgQXBhY2hlQ29ubmVjdG9yUHJvdmlkZXIoKSk7CisgICAgICAgIGZpbmFsIENsaWVudCBjID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoY2xpZW50Q29uZmlnKTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IGMudGFyZ2V0KGJhc2VVcmkpLnBhdGgoIi9hcGFjaGVPc2dpVGVzdCIpLnJlcXVlc3QoKS5idWlsZEdldCgpLmludm9rZSgpOworCisgICAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQgPSByZXNwb25zZS5yZWFkRW50aXR5KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiT0siLCByZXN1bHQpOworICAgICAgICBzZXJ2ZXIuc2h1dGRvd25Ob3coKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9vc2dpL2Z1bmN0aW9uYWwvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vc2dpL3Rlc3QvYmFzaWMvQmFzaWNPc2dpSW50ZWdyYXRpb25UZXN0LmphdmEgYi90ZXN0cy9vc2dpL2Z1bmN0aW9uYWwvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vc2dpL3Rlc3QvYmFzaWMvQmFzaWNPc2dpSW50ZWdyYXRpb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA0MzQ3ZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL29zZ2kvZnVuY3Rpb25hbC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29zZ2kvdGVzdC9iYXNpYy9CYXNpY09zZ2lJbnRlZ3JhdGlvblRlc3QuamF2YQpAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9zZ2kudGVzdC5iYXNpYzsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5Mi5odHRwc2VydmVyLkdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5vc2dpLnRlc3QudXRpbC5IZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5ncml6emx5Lmh0dHAuc2VydmVyLkh0dHBTZXJ2ZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLm9wczRqLnBheC5leGFtLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wczRqLnBheC5leGFtLk9wdGlvbjsKK2ltcG9ydCBvcmcub3BzNGoucGF4LmV4YW0uanVuaXQuUGF4RXhhbTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUnVuV2l0aChQYXhFeGFtLmNsYXNzKQorcHVibGljIGNsYXNzIEJhc2ljT3NnaUludGVncmF0aW9uVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVYVCA9ICIvamVyc2V5IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVSSSBiYXNlVXJpID0gVXJpQnVpbGRlcgorICAgICAgICAgICAgLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3QiKQorICAgICAgICAgICAgLnBvcnQoSGVscGVyLmdldFBvcnQoKSkKKyAgICAgICAgICAgIC5wYXRoKENPTlRFWFQpLmJ1aWxkKCk7CisKKyAgICBAQ29uZmlndXJhdGlvbgorICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uW10gY29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgTGlzdDxPcHRpb24+IG9wdGlvbnMgPSBIZWxwZXIuZ2V0Q29tbW9uT3NnaU9wdGlvbnMoKTsKKyAgICAgICAgcmV0dXJuIEhlbHBlci5hc0FycmF5KG9wdGlvbnMpOworICAgIH0KKworICAgIEBQYXRoKCIvc3VwZXItc2ltcGxlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFN1cGVyU2ltcGxlUmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRNZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAiT0siOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2ltcGxlUmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoU3VwZXJTaW1wbGVSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgIGZpbmFsIEh0dHBTZXJ2ZXIgc2VydmVyID0gR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5LmNyZWF0ZUh0dHBTZXJ2ZXIoYmFzZVVyaSwgcmVzb3VyY2VDb25maWcpOworCisgICAgICAgIENsaWVudCBjID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKTsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSBjLnRhcmdldChiYXNlVXJpKS5wYXRoKCIvc3VwZXItc2ltcGxlIikucmVxdWVzdCgpLmJ1aWxkR2V0KCkuaW52b2tlKCk7CisKKyAgICAgICAgU3RyaW5nIHJlc3VsdCA9IHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSRVNVTFQgPSAiICsgcmVzdWx0KTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIk9LIiwgcmVzdWx0KTsKKworICAgICAgICBzZXJ2ZXIuc2h1dGRvd25Ob3coKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9vc2dpL2Z1bmN0aW9uYWwvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vc2dpL3Rlc3QvYmFzaWMvQmVhblZhbGlkYXRpb25SZXNvdXJjZS5qYXZhIGIvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L2Jhc2ljL0JlYW5WYWxpZGF0aW9uUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjdkOGQ0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L2Jhc2ljL0JlYW5WYWxpZGF0aW9uUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9zZ2kudGVzdC5iYXNpYzsKKworaW1wb3J0IGphdmF4LndzLnJzLkZvcm1QYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CisKK2ltcG9ydCBqYXZheC52YWxpZGF0aW9uLmNvbnN0cmFpbnRzLk5vdE51bGw7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BQYXRoKCJiZWFuLXZhbGlkYXRpb24iKQorcHVibGljIGNsYXNzIEJlYW5WYWxpZGF0aW9uUmVzb3VyY2UgeworCisgICAgQFBPU1QKKyAgICBwdWJsaWMgU3RyaW5nIHBvc3QoQE5vdE51bGwgQEZvcm1QYXJhbSgiZm9ybVBhcmFtIikgZmluYWwgU3RyaW5nIGZvcm1QYXJhbSkgeworICAgICAgICByZXR1cm4gZm9ybVBhcmFtOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL29zZ2kvZnVuY3Rpb25hbC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29zZ2kvdGVzdC9iYXNpYy9CZWFuVmFsaWRhdGlvblRlc3QuamF2YSBiL3Rlc3RzL29zZ2kvZnVuY3Rpb25hbC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29zZ2kvdGVzdC9iYXNpYy9CZWFuVmFsaWRhdGlvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYzgwNzZhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L2Jhc2ljL0JlYW5WYWxpZGF0aW9uVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9zZ2kudGVzdC5iYXNpYzsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZvcm07CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5Mi5odHRwc2VydmVyLkdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5vc2dpLnRlc3QudXRpbC5IZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci52YWxpZGF0aW9uLlZhbGlkYXRpb25GZWF0dXJlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5ncml6emx5Lmh0dHAuc2VydmVyLkh0dHBTZXJ2ZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLm9wczRqLnBheC5leGFtLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wczRqLnBheC5leGFtLk9wdGlvbjsKK2ltcG9ydCBvcmcub3BzNGoucGF4LmV4YW0uanVuaXQuUGF4RXhhbTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5vcHM0ai5wYXguZXhhbS5Db3JlT3B0aW9ucy5tYXZlbkJ1bmRsZTsKKworLyoqCisgKiBCYXNpYyB0ZXN0IG9mIEJlYW4gVmFsaWRhdGlvbi4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSdW5XaXRoKFBheEV4YW0uY2xhc3MpCitwdWJsaWMgY2xhc3MgQmVhblZhbGlkYXRpb25UZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URVhUID0gIi9qZXJzZXkiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIGJhc2VVcmkgPSBVcmlCdWlsZGVyLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3QiKQorICAgICAgICAgICAgLnBvcnQoSGVscGVyLmdldFBvcnQoKSkKKyAgICAgICAgICAgIC5wYXRoKENPTlRFWFQpLmJ1aWxkKCk7CisKKyAgICBAQ29uZmlndXJhdGlvbgorICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uW10gY29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgTGlzdDxPcHRpb24+IG9wdGlvbnMgPSBIZWxwZXIuZ2V0Q29tbW9uT3NnaU9wdGlvbnMoKTsKKworICAgICAgICBvcHRpb25zLmFkZEFsbChIZWxwZXIuZXhwYW5kZWRMaXN0KAorICAgICAgICAgICAgICAgIC8vIGZvciBkZWJ1ZyBwdXJwb3NlcworICAgICAgICAgICAgICAgIC8vIFBheFJ1bm5lck9wdGlvbnMudm1PcHRpb24oIi1YcnVuamR3cDp0cmFuc3BvcnQ9ZHRfc29ja2V0LHNlcnZlcj15LHN1c3BlbmQ9eSxhZGRyZXNzPTUwMDUiKSwKKworICAgICAgICAgICAgICAgIC8vIHZhbGlkYXRpb24KKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dCIpLmFydGlmYWN0SWQoImplcnNleS1iZWFuLXZhbGlkYXRpb24iKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5oaWJlcm5hdGUiKS5hcnRpZmFjdElkKCJoaWJlcm5hdGUtdmFsaWRhdG9yIikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuamJvc3MubG9nZ2luZyIpLmFydGlmYWN0SWQoImpib3NzLWxvZ2dpbmciKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoImNvbS5mYXN0ZXJ4bWwiKS5hcnRpZmFjdElkKCJjbGFzc21hdGUiKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoImphdmF4LmVsIikuYXJ0aWZhY3RJZCgiamF2YXguZWwtYXBpIikudmVyc2lvbkFzSW5Qcm9qZWN0KCkKKyAgICAgICAgKSk7CisKKyAgICAgICAgb3B0aW9ucyA9IEhlbHBlci5hZGRQYXhFeGFtTWF2ZW5Mb2NhbFJlcG9zaXRvcnlQcm9wZXJ0eShvcHRpb25zKTsKKyAgICAgICAgcmV0dXJuIEhlbHBlci5hc0FycmF5KG9wdGlvbnMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJlYW5WYWxpZGF0aW9uUmVzb3VyY2VGZWF0dXJlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KDQwMCwgdHJ1ZSwgZmFsc2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJlYW5WYWxpZGF0aW9uUmVzb3VyY2VBdXRvRGlzY292ZXJ5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KDQwMCwgZmFsc2UsIGZhbHNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RCZWFuVmFsaWRhdGlvblJlc291cmNlTWFudWFsUmVnaXN0cmF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIF90ZXN0KDQwMCwgdHJ1ZSwgdHJ1ZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0QmVhblZhbGlkYXRpb25SZXNvdXJjZU5vVmFsaWRhdGlvbkZlYXR1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gRXZlbiB0aG91Z2ggcHJvcGVydGllcyBhcmUgZGlzYWJsZWQgQlYgaXMgcmVnaXN0ZXJlZC4KKyAgICAgICAgX3Rlc3QoNDAwLCBmYWxzZSwgdHJ1ZSk7CisgICAgfQorCisgICAgcHJvdGVjdGVkIHZvaWQgX3Rlc3QoZmluYWwgaW50IGV4cGVjdGVkUmVzcG9uc2VDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmVnaXN0ZXJGZWF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gZGlzYWJsZU1ldGFpbmZTZXJ2aWNlc0xvb2t1cCkgeworICAgICAgICBmaW5hbCBSZXNvdXJjZUNvbmZpZyByZXNvdXJjZUNvbmZpZyA9IG5ldyBSZXNvdXJjZUNvbmZpZyhCZWFuVmFsaWRhdGlvblJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgaWYgKHJlZ2lzdGVyRmVhdHVyZSkgeworICAgICAgICAgICAgcmVzb3VyY2VDb25maWcucmVnaXN0ZXIoVmFsaWRhdGlvbkZlYXR1cmUuY2xhc3MpOworICAgICAgICB9CisgICAgICAgIGlmIChkaXNhYmxlTWV0YWluZlNlcnZpY2VzTG9va3VwKSB7CisgICAgICAgICAgICByZXNvdXJjZUNvbmZpZy5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLk1FVEFJTkZfU0VSVklDRVNfTE9PS1VQX0RJU0FCTEUsIEJvb2xlYW4uVFJVRSk7CisKKyAgICAgICAgICAgIHJlc291cmNlQ29uZmlnLnJlZ2lzdGVyKG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkyLmh0dHBzZXJ2ZXIuR3JpenpseUh0dHBDb250YWluZXJQcm92aWRlci5jbGFzcyk7CisgICAgICAgIH0KKworICAgICAgICBmaW5hbCBIdHRwU2VydmVyIHNlcnZlciA9IEdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeS5jcmVhdGVIdHRwU2VydmVyKGJhc2VVcmksIHJlc291cmNlQ29uZmlnKTsKKworICAgICAgICBmaW5hbCBGb3JtIGZvcm0gPSBuZXcgRm9ybSgpOworICAgICAgICBmaW5hbCBTdHJpbmcgZm9ybVZhbHVlID0gImZvcm1WYWx1ZSI7CisgICAgICAgIGZvcm0uYXNNYXAoKS5hZGQoImZvcm1QYXJhbSIsIGZvcm1WYWx1ZSk7CisKKyAgICAgICAgZmluYWwgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBlbnRpdHkgPSBjbGllbnQudGFyZ2V0KGJhc2VVcmkpCisgICAgICAgICAgICAgICAgLnBhdGgoIi9iZWFuLXZhbGlkYXRpb24iKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCkKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuZW50aXR5KGZvcm0sIE1lZGlhVHlwZS5BUFBMSUNBVElPTl9GT1JNX1VSTEVOQ09ERURfVFlQRSksIFN0cmluZy5jbGFzcyk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGZvcm1WYWx1ZSwgZW50aXR5KTsKKworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IGNsaWVudC50YXJnZXQoYmFzZVVyaSkKKyAgICAgICAgICAgICAgICAucGF0aCgiL2JlYW4tdmFsaWRhdGlvbiIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkobmV3IEZvcm0oKSwgTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0ZPUk1fVVJMRU5DT0RFRF9UWVBFKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkUmVzcG9uc2VDb2RlLCByZXNwb25zZS5nZXRTdGF0dXMoKSk7CisKKyAgICAgICAgc2VydmVyLnNodXRkb3duTm93KCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9vc2dpL2Z1bmN0aW9uYWwvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vc2dpL3Rlc3QvYmFzaWMvSmF4UnNSaUJ1bmRsZVRlc3QuamF2YSBiL3Rlc3RzL29zZ2kvZnVuY3Rpb25hbC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29zZ2kvdGVzdC9iYXNpYy9KYXhSc1JpQnVuZGxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0Yzk5NzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9vc2dpL2Z1bmN0aW9uYWwvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vc2dpL3Rlc3QvYmFzaWMvSmF4UnNSaUJ1bmRsZVRlc3QuamF2YQpAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9zZ2kudGVzdC5iYXNpYzsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseTIuaHR0cHNlcnZlci5Hcml6emx5SHR0cFNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkub3NnaS50ZXN0LnV0aWwuSGVscGVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guZ3JpenpseS5odHRwLnNlcnZlci5IdHRwU2VydmVyOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5vcHM0ai5wYXguZXhhbS5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5vcHM0ai5wYXguZXhhbS5PcHRpb247CitpbXBvcnQgb3JnLm9wczRqLnBheC5leGFtLmp1bml0LlBheEV4YW07CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcub3BzNGoucGF4LmV4YW0uQ29yZU9wdGlvbnMubWF2ZW5CdW5kbGU7CisKKy8qKgorICogQmFzaWMgdGVzdCBvZiBKQVgtUlMgUkkgYnVuZGxlLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUnVuV2l0aChQYXhFeGFtLmNsYXNzKQorcHVibGljIGNsYXNzIEpheFJzUmlCdW5kbGVUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URVhUID0gIi9qZXJzZXkiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIGJhc2VVcmkgPSBVcmlCdWlsZGVyCisgICAgICAgICAgICAuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdCIpCisgICAgICAgICAgICAucG9ydChIZWxwZXIuZ2V0UG9ydCgpKQorICAgICAgICAgICAgLnBhdGgoQ09OVEVYVCkuYnVpbGQoKTsKKworICAgIEBDb25maWd1cmF0aW9uCisgICAgcHVibGljIHN0YXRpYyBPcHRpb25bXSBjb25maWd1cmF0aW9uKCkgeworICAgICAgICBMaXN0PE9wdGlvbj4gb3B0aW9ucyA9IEhlbHBlci5nZXRDb21tb25Pc2dpT3B0aW9ucyhmYWxzZSk7CisKKyAgICAgICAgb3B0aW9ucy5hZGRBbGwoSGVscGVyLmV4cGFuZGVkTGlzdCgKKyAgICAgICAgICAgICAgICAvLyB2bU9wdGlvbigiLVhydW5qZHdwOnRyYW5zcG9ydD1kdF9zb2NrZXQsc2VydmVyPXksc3VzcGVuZD15LGFkZHJlc3M9NTAwNSIpLAorCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuZ2xhc3NmaXNoLmplcnNleS5idW5kbGVzIikuYXJ0aWZhY3RJZCgiamF4cnMtcmkiKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKworICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLm1vcnRiYXkuamV0dHkiKS5hcnRpZmFjdElkKCJzZXJ2bGV0LWFwaS0yLjUiKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5nbGFzc2Zpc2guZ3JpenpseSIpLmFydGlmYWN0SWQoImdyaXp6bHktaHR0cC1zZXJ2bGV0IikudmVyc2lvbkFzSW5Qcm9qZWN0KCkKKyAgICAgICAgKSk7CisKKyAgICAgICAgb3B0aW9ucyA9IEhlbHBlci5hZGRQYXhFeGFtTWF2ZW5Mb2NhbFJlcG9zaXRvcnlQcm9wZXJ0eShvcHRpb25zKTsKKyAgICAgICAgcmV0dXJuIEhlbHBlci5hc0FycmF5KG9wdGlvbnMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZVJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKFNpbXBsZVJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgZmluYWwgSHR0cFNlcnZlciBzZXJ2ZXIgPSBHcml6emx5SHR0cFNlcnZlckZhY3RvcnkuY3JlYXRlSHR0cFNlcnZlcihiYXNlVXJpLCByZXNvdXJjZUNvbmZpZyk7CisKKyAgICAgICAgZmluYWwgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KCk7CisgICAgICAgIGZpbmFsIFN0cmluZyByZXNwb25zZSA9IGNsaWVudC50YXJnZXQoYmFzZVVyaSkucGF0aCgiL3NpbXBsZSIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJFU1VMVCA9ICIgKyByZXNwb25zZSk7CisgICAgICAgIGFzc2VydEVxdWFscygiT0siLCByZXNwb25zZSk7CisKKyAgICAgICAgc2VydmVyLnNodXRkb3duTm93KCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9vc2dpL2Z1bmN0aW9uYWwvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vc2dpL3Rlc3QvYmFzaWMvSnNvbkphY2tzb24xVGVzdC5qYXZhIGIvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L2Jhc2ljL0pzb25KYWNrc29uMVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTUyZmMxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L2Jhc2ljL0pzb25KYWNrc29uMVRlc3QuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9zZ2kudGVzdC5iYXNpYzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uMS5KYWNrc29uMUZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkub3NnaS50ZXN0LnV0aWwuSGVscGVyOworCitpbXBvcnQgb3JnLm9wczRqLnBheC5leGFtLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wczRqLnBheC5leGFtLk9wdGlvbjsKK2ltcG9ydCBzdGF0aWMgb3JnLm9wczRqLnBheC5leGFtLkNvcmVPcHRpb25zLm1hdmVuQnVuZGxlOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgSnNvbkphY2tzb24xVGVzdCBleHRlbmRzIEFic3RyYWN0SnNvbk9zZ2lJbnRlZ3JhdGlvblRlc3QgeworCisgICAgQENvbmZpZ3VyYXRpb24KKyAgICBwdWJsaWMgc3RhdGljIE9wdGlvbltdIGNvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgIGZpbmFsIExpc3Q8T3B0aW9uPiBvcHRpb25zID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICAgICAgb3B0aW9ucy5hZGRBbGwoSGVscGVyLmdldENvbW1vbk9zZ2lPcHRpb25zKCkpOworICAgICAgICBvcHRpb25zLmFkZEFsbChIZWxwZXIuZXhwYW5kZWRMaXN0KAorICAgICAgICAgICAgICAgIC8vIHZtT3B0aW9uKCItWHJ1bmpkd3A6dHJhbnNwb3J0PWR0X3NvY2tldCxzZXJ2ZXI9eSxzdXNwZW5kPXksYWRkcmVzcz01MDA1IiksCisKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhIikuYXJ0aWZhY3RJZCgiamVyc2V5LW1lZGlhLWpzb24tamFja3NvbjEiKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKworICAgICAgICAgICAgICAgIC8vIGplcnNleS1qc29uIGRlcGVuZGVuY2llcworICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmNvZGVoYXVzLmphY2tzb24iKS5hcnRpZmFjdElkKCJqYWNrc29uLWNvcmUtYXNsIikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuY29kZWhhdXMuamFja3NvbiIpLmFydGlmYWN0SWQoImphY2tzb24tbWFwcGVyLWFzbCIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmNvZGVoYXVzLmphY2tzb24iKS5hcnRpZmFjdElkKCJqYWNrc29uLWpheHJzIikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuY29kZWhhdXMuamFja3NvbiIpLmFydGlmYWN0SWQoImphY2tzb24teGMiKS52ZXJzaW9uQXNJblByb2plY3QoKQorICAgICAgICApKTsKKworICAgICAgICByZXR1cm4gSGVscGVyLmFzQXJyYXkob3B0aW9ucyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEZlYXR1cmUgZ2V0SnNvblByb3ZpZGVyRmVhdHVyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKYWNrc29uMUZlYXR1cmUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9vc2dpL2Z1bmN0aW9uYWwvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vc2dpL3Rlc3QvYmFzaWMvSnNvbkphY2tzb25UZXN0LmphdmEgYi90ZXN0cy9vc2dpL2Z1bmN0aW9uYWwvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vc2dpL3Rlc3QvYmFzaWMvSnNvbkphY2tzb25UZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQ0ZDA1MwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL29zZ2kvZnVuY3Rpb25hbC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29zZ2kvdGVzdC9iYXNpYy9Kc29uSmFja3NvblRlc3QuamF2YQpAQCAtMCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9zZ2kudGVzdC5iYXNpYzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uLkphY2tzb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9zZ2kudGVzdC51dGlsLkhlbHBlcjsKKworaW1wb3J0IG9yZy5vcHM0ai5wYXguZXhhbS5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5vcHM0ai5wYXguZXhhbS5PcHRpb247CitpbXBvcnQgc3RhdGljIG9yZy5vcHM0ai5wYXguZXhhbS5Db3JlT3B0aW9ucy5tYXZlbkJ1bmRsZTsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEpzb25KYWNrc29uVGVzdCBleHRlbmRzIEFic3RyYWN0SnNvbk9zZ2lJbnRlZ3JhdGlvblRlc3QgeworCisgICAgQENvbmZpZ3VyYXRpb24KKyAgICBwdWJsaWMgc3RhdGljIE9wdGlvbltdIGNvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgIGZpbmFsIExpc3Q8T3B0aW9uPiBvcHRpb25zID0gbmV3IEFycmF5TGlzdDw+KCk7CisKKyAgICAgICAgb3B0aW9ucy5hZGRBbGwoSGVscGVyLmdldENvbW1vbk9zZ2lPcHRpb25zKCkpOworICAgICAgICBvcHRpb25zLmFkZEFsbChIZWxwZXIuZXhwYW5kZWRMaXN0KAorICAgICAgICAgICAgICAgIC8vIHZtT3B0aW9uKCItWHJ1bmpkd3A6dHJhbnNwb3J0PWR0X3NvY2tldCxzZXJ2ZXI9eSxzdXNwZW5kPXksYWRkcmVzcz01MDA1IiksCisKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhIikuYXJ0aWZhY3RJZCgiamVyc2V5LW1lZGlhLWpzb24tamFja3NvbiIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmdsYXNzZmlzaC5qZXJzZXkuZXh0IikuYXJ0aWZhY3RJZCgiamVyc2V5LWVudGl0eS1maWx0ZXJpbmciKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKworICAgICAgICAgICAgICAgIC8vIGplcnNleS1qc29uIGRlcGVuZGVuY2llcworICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgiY29tLmZhc3RlcnhtbC5qYWNrc29uLmNvcmUiKS5hcnRpZmFjdElkKCJqYWNrc29uLWNvcmUiKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoImNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5jb3JlIikuYXJ0aWZhY3RJZCgiamFja3Nvbi1kYXRhYmluZCIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgiY29tLmZhc3RlcnhtbC5qYWNrc29uLmNvcmUiKS5hcnRpZmFjdElkKCJqYWNrc29uLWFubm90YXRpb25zIikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJjb20uZmFzdGVyeG1sLmphY2tzb24uamF4cnMiKS5hcnRpZmFjdElkKCJqYWNrc29uLWpheHJzLWJhc2UiKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoImNvbS5mYXN0ZXJ4bWwuamFja3Nvbi5qYXhycyIpLmFydGlmYWN0SWQoImphY2tzb24tamF4cnMtanNvbi1wcm92aWRlciIpCisgICAgICAgICAgICAgICAgICAgICAgICAudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJjb20uZmFzdGVyeG1sLmphY2tzb24ubW9kdWxlIikuYXJ0aWZhY3RJZCgiamFja3Nvbi1tb2R1bGUtamF4Yi1hbm5vdGF0aW9ucyIpCisgICAgICAgICAgICAgICAgICAgICAgICAudmVyc2lvbkFzSW5Qcm9qZWN0KCkKKyAgICAgICAgKSk7CisKKyAgICAgICAgcmV0dXJuIEhlbHBlci5hc0FycmF5KG9wdGlvbnMpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBGZWF0dXJlIGdldEpzb25Qcm92aWRlckZlYXR1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgSmFja3NvbkZlYXR1cmUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9vc2dpL2Z1bmN0aW9uYWwvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vc2dpL3Rlc3QvYmFzaWMvSnNvbkpldHRpc29uVGVzdC5qYXZhIGIvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L2Jhc2ljL0pzb25KZXR0aXNvblRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmE1Y2MwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L2Jhc2ljL0pzb25KZXR0aXNvblRlc3QuamF2YQpAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9zZ2kudGVzdC5iYXNpYzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qZXR0aXNvbi5KZXR0aXNvbkZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkub3NnaS50ZXN0LnV0aWwuSGVscGVyOworCitpbXBvcnQgb3JnLm9wczRqLnBheC5leGFtLk9wdGlvbjsKK2ltcG9ydCBvcmcub3BzNGoucGF4LmV4YW0uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBzdGF0aWMgb3JnLm9wczRqLnBheC5leGFtLkNvcmVPcHRpb25zLm1hdmVuQnVuZGxlOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgSnNvbkpldHRpc29uVGVzdCBleHRlbmRzIEFic3RyYWN0SnNvbk9zZ2lJbnRlZ3JhdGlvblRlc3QgeworCisgICAgQENvbmZpZ3VyYXRpb24KKyAgICBwdWJsaWMgc3RhdGljIE9wdGlvbltdIGNvbmZpZ3VyYXRpb24oKSB7CisgICAgICAgIExpc3Q8T3B0aW9uPiBvcHRpb25zID0gbmV3IEFycmF5TGlzdDxPcHRpb24+KCk7CisKKyAgICAgICAgb3B0aW9ucy5hZGRBbGwoSGVscGVyLmdldENvbW1vbk9zZ2lPcHRpb25zKCkpOworICAgICAgICBvcHRpb25zLmFkZEFsbChIZWxwZXIuZXhwYW5kZWRMaXN0KAorICAgICAgICAgICAgICAgIC8vIGplcnNleS1qc29uIGRlcGVuZGVuY2llcworICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEiKS5hcnRpZmFjdElkKCJqZXJzZXktbWVkaWEtanNvbi1qZXR0aXNvbiIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmNvZGVoYXVzLmpldHRpc29uIikuYXJ0aWZhY3RJZCgiamV0dGlzb24iKS52ZXJzaW9uQXNJblByb2plY3QoKQorICAgICAgICApKTsKKworICAgICAgICByZXR1cm4gSGVscGVyLmFzQXJyYXkob3B0aW9ucyk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEZlYXR1cmUgZ2V0SnNvblByb3ZpZGVyRmVhdHVyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKZXR0aXNvbkZlYXR1cmUoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9vc2dpL2Z1bmN0aW9uYWwvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vc2dpL3Rlc3QvYmFzaWMvSnNvbk1veHlUZXN0LmphdmEgYi90ZXN0cy9vc2dpL2Z1bmN0aW9uYWwvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vc2dpL3Rlc3QvYmFzaWMvSnNvbk1veHlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhiYzFmMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL29zZ2kvZnVuY3Rpb25hbC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29zZ2kvdGVzdC9iYXNpYy9Kc29uTW94eVRlc3QuamF2YQpAQCAtMCwwICsxLDg4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9zZ2kudGVzdC5iYXNpYzsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkZlYXR1cmU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlQ29udGV4dDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1veHkuanNvbi5Nb3h5SnNvbkNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tb3h5Lmpzb24uTW94eUpzb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9zZ2kudGVzdC51dGlsLkhlbHBlcjsKKworaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpheGIuQmVhblZhbGlkYXRpb25Nb2RlOworaW1wb3J0IG9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLmpheGIuTWFyc2hhbGxlclByb3BlcnRpZXM7CitpbXBvcnQgb3JnLm9wczRqLnBheC5leGFtLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wczRqLnBheC5leGFtLk9wdGlvbjsKK2ltcG9ydCBzdGF0aWMgb3JnLm9wczRqLnBheC5leGFtLkNvcmVPcHRpb25zLmJvb3REZWxlZ2F0aW9uUGFja2FnZTsKK2ltcG9ydCBzdGF0aWMgb3JnLm9wczRqLnBheC5leGFtLkNvcmVPcHRpb25zLm1hdmVuQnVuZGxlOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgSnNvbk1veHlUZXN0IGV4dGVuZHMgQWJzdHJhY3RKc29uT3NnaUludGVncmF0aW9uVGVzdCB7CisKKyAgICBAQ29uZmlndXJhdGlvbgorICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uW10gY29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgZmluYWwgTGlzdDxPcHRpb24+IG9wdGlvbnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKworICAgICAgICBvcHRpb25zLmFkZEFsbChIZWxwZXIuZ2V0Q29tbW9uT3NnaU9wdGlvbnMoKSk7CisgICAgICAgIG9wdGlvbnMuYWRkQWxsKEhlbHBlci5leHBhbmRlZExpc3QoCisgICAgICAgICAgICAgICAgLy8gdm1PcHRpb24oIi1YcnVuamR3cDp0cmFuc3BvcnQ9ZHRfc29ja2V0LHNlcnZlcj15LHN1c3BlbmQ9eSxhZGRyZXNzPTUwMDUiKSwKKworICAgICAgICAgICAgICAgIGJvb3REZWxlZ2F0aW9uUGFja2FnZSgiamF2YXgueG1sLmJpbmQiKSwKKyAgICAgICAgICAgICAgICBib290RGVsZWdhdGlvblBhY2thZ2UoImphdmF4LnhtbC5iaW5kLioiKSwKKyAgICAgICAgICAgICAgICAvLyB2YWxpZGF0aW9uCisgICAgICAgICAgICAgICAgYm9vdERlbGVnYXRpb25QYWNrYWdlKCJqYXZheC54bWwucGFyc2VycyIpLAorICAgICAgICAgICAgICAgIGJvb3REZWxlZ2F0aW9uUGFja2FnZSgiamF2YXgueG1sLnBhcnNlcnMuKiIpLAorCisgICAgICAgICAgICAgICAgLy8gbW94eSBkZXBlbmRlbmNpZXMKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhIikuYXJ0aWZhY3RJZCgiamVyc2V5LW1lZGlhLW1veHkiKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dCIpLmFydGlmYWN0SWQoImplcnNleS1lbnRpdHktZmlsdGVyaW5nIikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZSIpLmFydGlmYWN0SWQoIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlLm1veHkiKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5lY2xpcHNlLnBlcnNpc3RlbmNlIikuYXJ0aWZhY3RJZCgib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UuY29yZSIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmVjbGlwc2UucGVyc2lzdGVuY2UiKS5hcnRpZmFjdElkKCJvcmcuZWNsaXBzZS5wZXJzaXN0ZW5jZS5hc20iKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5nbGFzc2Zpc2giKS5hcnRpZmFjdElkKCJqYXZheC5qc29uIikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisKKyAgICAgICAgICAgICAgICAvLyB2YWxpZGF0aW9uCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuaGliZXJuYXRlIikuYXJ0aWZhY3RJZCgiaGliZXJuYXRlLXZhbGlkYXRvciIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmpib3NzLmxvZ2dpbmciKS5hcnRpZmFjdElkKCJqYm9zcy1sb2dnaW5nIikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJjb20uZmFzdGVyeG1sIikuYXJ0aWZhY3RJZCgiY2xhc3NtYXRlIikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJqYXZheC5lbCIpLmFydGlmYWN0SWQoImphdmF4LmVsLWFwaSIpLnZlcnNpb25Bc0luUHJvamVjdCgpCisgICAgICAgICkpOworCisgICAgICAgIHJldHVybiBIZWxwZXIuYXNBcnJheShvcHRpb25zKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgRmVhdHVyZSBnZXRKc29uUHJvdmlkZXJGZWF0dXJlKCkgeworICAgICAgICAvLyBUdXJuIG9mZiBCViBvdGhlcndpc2UgdGhlIHRlc3QgaXMgbm90IHN0YWJsZS4KKyAgICAgICAgcmV0dXJuIG5ldyBGZWF0dXJlKCkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGNvbmZpZ3VyZShmaW5hbCBGZWF0dXJlQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihuZXcgTW94eUpzb25Db25maWcoKQorICAgICAgICAgICAgICAgICAgICAgICAgLnByb3BlcnR5KE1hcnNoYWxsZXJQcm9wZXJ0aWVzLkJFQU5fVkFMSURBVElPTl9NT0RFLCBCZWFuVmFsaWRhdGlvbk1vZGUuTk9ORSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5yZXNvbHZlcigpKTsKKworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL29zZ2kvZnVuY3Rpb25hbC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29zZ2kvdGVzdC9iYXNpYy9Kc29uUHJvY2Vzc2luZ1Rlc3QuamF2YSBiL3Rlc3RzL29zZ2kvZnVuY3Rpb25hbC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29zZ2kvdGVzdC9iYXNpYy9Kc29uUHJvY2Vzc2luZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWI0YzU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L2Jhc2ljL0pzb25Qcm9jZXNzaW5nVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9zZ2kudGVzdC5iYXNpYzsKKworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50OworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnRCdWlsZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgamF2YXguanNvbi5Kc29uOworaW1wb3J0IGphdmF4Lmpzb24uSnNvbk9iamVjdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkyLmh0dHBzZXJ2ZXIuR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9zZ2kudGVzdC51dGlsLkhlbHBlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmdyaXp6bHkuaHR0cC5zZXJ2ZXIuSHR0cFNlcnZlcjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcub3BzNGoucGF4LmV4YW0uQ29uZmlndXJhdGlvbjsKK2ltcG9ydCBvcmcub3BzNGoucGF4LmV4YW0uT3B0aW9uOworaW1wb3J0IG9yZy5vcHM0ai5wYXguZXhhbS5qdW5pdC5QYXhFeGFtOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBzdGF0aWMgb3JnLm9wczRqLnBheC5leGFtLkNvcmVPcHRpb25zLm1hdmVuQnVuZGxlOworCisvKioKKyAqIEJhc2ljIHRlc3Qgb2YgSnNvbiBQcm9jZXNzaW5nLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUnVuV2l0aChQYXhFeGFtLmNsYXNzKQorcHVibGljIGNsYXNzIEpzb25Qcm9jZXNzaW5nVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVYVCA9ICIvamVyc2V5IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVSSSBiYXNlVXJpID0gVXJpQnVpbGRlcgorICAgICAgICAgICAgLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3QiKQorICAgICAgICAgICAgLnBvcnQoSGVscGVyLmdldFBvcnQoKSkKKyAgICAgICAgICAgIC5wYXRoKENPTlRFWFQpLmJ1aWxkKCk7CisKKyAgICBAQ29uZmlndXJhdGlvbgorICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uW10gY29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgTGlzdDxPcHRpb24+IG9wdGlvbnMgPSBIZWxwZXIuZ2V0Q29tbW9uT3NnaU9wdGlvbnMoKTsKKworICAgICAgICBvcHRpb25zLmFkZEFsbChIZWxwZXIuZXhwYW5kZWRMaXN0KAorICAgICAgICAgICAgICAgIC8vIHZtT3B0aW9uKCItWHJ1bmpkd3A6dHJhbnNwb3J0PWR0X3NvY2tldCxzZXJ2ZXI9eSxzdXNwZW5kPXksYWRkcmVzcz01MDA1IiksCisKKyAgICAgICAgICAgICAgICAvLyBKU09OIHByb2Nlc3NpbmcuCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYSIpLmFydGlmYWN0SWQoImplcnNleS1tZWRpYS1qc29uLXByb2Nlc3NpbmciKQorICAgICAgICAgICAgICAgICAgICAgICAgLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmdsYXNzZmlzaCIpLmFydGlmYWN0SWQoImphdmF4Lmpzb24iKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5nbGFzc2Zpc2giKS5hcnRpZmFjdElkKCJqc29ucC1qYXhycyIpLnZlcnNpb25Bc0luUHJvamVjdCgpCisgICAgICAgICkpOworCisgICAgICAgIG9wdGlvbnMgPSBIZWxwZXIuYWRkUGF4RXhhbU1hdmVuTG9jYWxSZXBvc2l0b3J5UHJvcGVydHkob3B0aW9ucyk7CisgICAgICAgIHJldHVybiBIZWxwZXIuYXNBcnJheShvcHRpb25zKTsKKyAgICB9CisKKyAgICBAUGF0aCgiLyIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBSZXNvdXJjZSB7CisKKyAgICAgICAgQFBPU1QKKyAgICAgICAgcHVibGljIEpzb25PYmplY3QgcG9zdEpzb25PYmplY3QoZmluYWwgSnNvbk9iamVjdCBqc29uT2JqZWN0KSB7CisgICAgICAgICAgICByZXR1cm4ganNvbk9iamVjdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEpzb25PYmplY3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoUmVzb3VyY2UuY2xhc3MpOworICAgICAgICBmaW5hbCBIdHRwU2VydmVyIHNlcnZlciA9IEdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeS5jcmVhdGVIdHRwU2VydmVyKGJhc2VVcmksIHJlc291cmNlQ29uZmlnKTsKKyAgICAgICAgZmluYWwgSnNvbk9iamVjdCBqc29uT2JqZWN0ID0gSnNvbi5jcmVhdGVPYmplY3RCdWlsZGVyKCkuYWRkKCJmb28iLCAiYmFyIikuYnVpbGQoKTsKKworICAgICAgICBmaW5hbCBDbGllbnQgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoKTsKKyAgICAgICAgZmluYWwgSnNvbk9iamVjdCBlbnRpdHkgPSBjbGllbnQKKyAgICAgICAgICAgICAgICAudGFyZ2V0KGJhc2VVcmkpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT05fVFlQRSkKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkuanNvbihqc29uT2JqZWN0KSwgSnNvbk9iamVjdC5jbGFzcyk7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJSRVNVTFQgPSAiICsgZW50aXR5KTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKGpzb25PYmplY3QsIGVudGl0eSk7CisKKyAgICAgICAgc2VydmVyLnNodXRkb3duTm93KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L2Jhc2ljL0pzb25SZXNvdXJjZS5qYXZhIGIvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L2Jhc2ljL0pzb25SZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5YzNiZGQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9vc2dpL2Z1bmN0aW9uYWwvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vc2dpL3Rlc3QvYmFzaWMvSnNvblJlc291cmNlLmphdmEKQEAgLTAsMCArMSw0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5vc2dpLnRlc3QuYmFzaWM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKKy8qKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoImpzb24iKQorcHVibGljIGNsYXNzIEpzb25SZXNvdXJjZSB7CisKKyAgICBAWG1sUm9vdEVsZW1lbnQKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE5hbWVCZWFuIHsKKworICAgICAgICBwdWJsaWMgU3RyaW5nIG5hbWUgPSAiSGFycmlzb24iOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCisgICAgcHVibGljIE5hbWVCZWFuIGdldEJlYW4oKSB7CisgICAgICAgIE5hbWVCZWFuIHJlc3VsdCA9IG5ldyBOYW1lQmVhbigpOworICAgICAgICByZXN1bHQubmFtZSA9ICJKaW0iOworCisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L2Jhc2ljL011bHRpUGFydFRlc3QuamF2YSBiL3Rlc3RzL29zZ2kvZnVuY3Rpb25hbC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29zZ2kvdGVzdC9iYXNpYy9NdWx0aVBhcnRUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IxN2NhMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL29zZ2kvZnVuY3Rpb25hbC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29zZ2kvdGVzdC9iYXNpYy9NdWx0aVBhcnRUZXN0LmphdmEKQEAgLTAsMCArMSwxMjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkub3NnaS50ZXN0LmJhc2ljOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOworaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOworaW1wb3J0IGphdmEubmV0LlVSSTsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkyLmh0dHBzZXJ2ZXIuR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLm11bHRpcGFydC5Cb2R5UGFydDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuQm9keVBhcnRFbnRpdHk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEubXVsdGlwYXJ0Lk11bHRpUGFydDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5tdWx0aXBhcnQuTXVsdGlQYXJ0RmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5vc2dpLnRlc3QudXRpbC5IZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5ncml6emx5Lmh0dHAuc2VydmVyLkh0dHBTZXJ2ZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLm9wczRqLnBheC5leGFtLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wczRqLnBheC5leGFtLk9wdGlvbjsKK2ltcG9ydCBvcmcub3BzNGoucGF4LmV4YW0uanVuaXQuUGF4RXhhbTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5vcHM0ai5wYXguZXhhbS5Db3JlT3B0aW9ucy5tYXZlbkJ1bmRsZTsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFJ1bldpdGgoUGF4RXhhbS5jbGFzcykKK3B1YmxpYyBjbGFzcyBNdWx0aVBhcnRUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URVhUID0gIi9qZXJzZXkiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIGJhc2VVcmkgPSBVcmlCdWlsZGVyCisgICAgICAgICAgICAuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdCIpCisgICAgICAgICAgICAucG9ydChIZWxwZXIuZ2V0UG9ydCgpKQorICAgICAgICAgICAgLnBhdGgoQ09OVEVYVCkuYnVpbGQoKTsKKworICAgIEBDb25maWd1cmF0aW9uCisgICAgcHVibGljIHN0YXRpYyBPcHRpb25bXSBjb25maWd1cmF0aW9uKCkgeworICAgICAgICBMaXN0PE9wdGlvbj4gb3B0aW9ucyA9IEhlbHBlci5nZXRDb21tb25Pc2dpT3B0aW9ucygpOworCisgICAgICAgIG9wdGlvbnMuYWRkQWxsKEhlbHBlci5leHBhbmRlZExpc3QoCisgICAgICAgICAgICAgICAgLy8gamVyc2V5LW11bHRpcGFydCBkZXBlbmRlbmNpZXMKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhIikuYXJ0aWZhY3RJZCgiamVyc2V5LW1lZGlhLW11bHRpcGFydCIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmp2bmV0Lm1pbWVwdWxsIikuYXJ0aWZhY3RJZCgibWltZXB1bGwiKS52ZXJzaW9uQXNJblByb2plY3QoKSkpOworCisgICAgICAgIG9wdGlvbnMgPSBIZWxwZXIuYWRkUGF4RXhhbU1hdmVuTG9jYWxSZXBvc2l0b3J5UHJvcGVydHkob3B0aW9ucyk7CisgICAgICAgIHJldHVybiBIZWxwZXIuYXNBcnJheShvcHRpb25zKTsKKyAgICB9CisKKyAgICBAUGF0aCgiL211bHRpcGFydC1zaW1wbGUiKQorICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXVsdGlQYXJ0UmVzb3VyY2UgeworCisgICAgICAgIEBHRVQKKyAgICAgICAgQFByb2R1Y2VzKCJtdWx0aXBhcnQvbWl4ZWQiKQorICAgICAgICBwdWJsaWMgUmVzcG9uc2Ugb25lKCkgeworICAgICAgICAgICAgTXVsdGlQYXJ0IGVudGl0eSA9IG5ldyBNdWx0aVBhcnQoKTsKKyAgICAgICAgICAgIEJvZHlQYXJ0IHBhcnQgPSBuZXcgQm9keVBhcnQoIlRoaXMgaXMgdGhlIG9ubHkgc2VnbWVudCIsIG5ldyBNZWRpYVR5cGUoInRleHQiLCAicGxhaW4iKSk7CisgICAgICAgICAgICBlbnRpdHkuZ2V0Qm9keVBhcnRzKCkuYWRkKHBhcnQpOworICAgICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLm9rKGVudGl0eSkudHlwZSgibXVsdGlwYXJ0L21peGVkIikuYnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TXVsdGlQYXJ0UmVzb3VyY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoTXVsdGlQYXJ0UmVzb3VyY2UuY2xhc3MpLnJlZ2lzdGVyKG5ldyBNdWx0aVBhcnRGZWF0dXJlKCkpOworICAgICAgICBmaW5hbCBIdHRwU2VydmVyIHNlcnZlciA9IEdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeS5jcmVhdGVIdHRwU2VydmVyKGJhc2VVcmksIHJlc291cmNlQ29uZmlnKTsKKworICAgICAgICBDbGllbnQgYyA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KG5ldyBDbGllbnRDb25maWcoKS5yZWdpc3RlcihNdWx0aVBhcnRGZWF0dXJlLmNsYXNzKSk7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gYy50YXJnZXQoYmFzZVVyaSkucGF0aCgiL211bHRpcGFydC1zaW1wbGUiKS5yZXF1ZXN0KCkuYnVpbGRHZXQoKS5pbnZva2UoKTsKKworICAgICAgICBNdWx0aVBhcnQgcmVzdWx0ID0gcmVzcG9uc2UucmVhZEVudGl0eShNdWx0aVBhcnQuY2xhc3MpOworICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlJFU1VMVCA9ICIgKyByZXN1bHQpOworCisgICAgICAgIGNoZWNrRW50aXR5KCJUaGlzIGlzIHRoZSBvbmx5IHNlZ21lbnQiLCAoQm9keVBhcnRFbnRpdHkpIHJlc3VsdC5nZXRCb2R5UGFydHMoKS5nZXQoMCkuZ2V0RW50aXR5KCkpOworCisgICAgICAgIHNlcnZlci5zaHV0ZG93bk5vdygpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBjaGVja0VudGl0eShTdHJpbmcgZXhwZWN0ZWQsIEJvZHlQYXJ0RW50aXR5IGVudGl0eSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgLy8gQ29udmVydCB0aGUgcmF3IGJ5dGVzIGludG8gYSBTdHJpbmcKKyAgICAgICAgSW5wdXRTdHJlYW1SZWFkZXIgc3IgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIoZW50aXR5LmdldElucHV0U3RyZWFtKCkpOworICAgICAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBpbnQgY2ggPSBzci5yZWFkKCk7CisgICAgICAgICAgICBpZiAoY2ggPCAwKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdy5hcHBlbmQoKGNoYXIpIGNoKTsKKyAgICAgICAgfQorICAgICAgICAvLyBQZXJmb3JtIHRoZSBjb21wYXJpc29uCisgICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgc3cudG9TdHJpbmcoKSk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9vc2dpL2Z1bmN0aW9uYWwvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vc2dpL3Rlc3QvYmFzaWMvUGFja2FnZVNjYW5uaW5nVGVzdC5qYXZhIGIvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L2Jhc2ljL1BhY2thZ2VTY2FubmluZ1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODQ4MGIyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L2Jhc2ljL1BhY2thZ2VTY2FubmluZ1Rlc3QuamF2YQpAQCAtMCwwICsxLDEyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5vc2dpLnRlc3QuYmFzaWM7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseTIuaHR0cHNlcnZlci5Hcml6emx5SHR0cFNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseTIuc2VydmxldC5Hcml6emx5V2ViQ29udGFpbmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5vc2dpLnRlc3QudXRpbC5IZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guZ3JpenpseS5odHRwLnNlcnZlci5IdHRwU2VydmVyOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5vcHM0ai5wYXguZXhhbS5Db25maWd1cmF0aW9uOworaW1wb3J0IG9yZy5vcHM0ai5wYXguZXhhbS5PcHRpb247CitpbXBvcnQgb3JnLm9wczRqLnBheC5leGFtLmp1bml0LlBheEV4YW07CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcub3BzNGoucGF4LmV4YW0uQ29yZU9wdGlvbnMubWF2ZW5CdW5kbGU7CisKKy8qKgorICogTk9URTogVGhpcyB0ZXN0IGlzIGV4Y2x1ZGVkIG9uIEpESzYgYXMgaXQgcmVxdWlyZXMgU2VydmxldCAzLjEgQVBJIHRoYXQgaXMgYnVpbHQgYWdhaW5zdCBKREsgNy4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BSdW5XaXRoKFBheEV4YW0uY2xhc3MpCitwdWJsaWMgY2xhc3MgUGFja2FnZVNjYW5uaW5nVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVYVCA9ICIvamVyc2V5IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVSSSBiYXNlVXJpID0gVXJpQnVpbGRlcgorICAgICAgICAgICAgLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3QiKQorICAgICAgICAgICAgLnBvcnQoSGVscGVyLmdldFBvcnQoKSkKKyAgICAgICAgICAgIC5wYXRoKENPTlRFWFQpLmJ1aWxkKCk7CisKKyAgICBAQ29uZmlndXJhdGlvbgorICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uW10gY29uZmlndXJhdGlvbigpIHsKKyAgICAgICAgTGlzdDxPcHRpb24+IG9wdGlvbnMgPSBIZWxwZXIuZ2V0Q29tbW9uT3NnaU9wdGlvbnMoKTsKKworICAgICAgICBvcHRpb25zLmFkZEFsbChIZWxwZXIuZXhwYW5kZWRMaXN0KAorICAgICAgICAgICAgICAgIC8vIHZtT3B0aW9uKCItWHJ1bmpkd3A6dHJhbnNwb3J0PWR0X3NvY2tldCxzZXJ2ZXI9eSxzdXNwZW5kPXksYWRkcmVzcz01MDA1IiksCisKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhIikuYXJ0aWZhY3RJZCgiamVyc2V5LW1lZGlhLXNzZSIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJqYXZheC5zZXJ2bGV0IikuYXJ0aWZhY3RJZCgiamF2YXguc2VydmxldC1hcGkiKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5nbGFzc2Zpc2guZ3JpenpseSIpLmFydGlmYWN0SWQoImdyaXp6bHktaHR0cC1zZXJ2bGV0IikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzIikuYXJ0aWZhY3RJZCgiamVyc2V5LWNvbnRhaW5lci1zZXJ2bGV0LWNvcmUiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVycyIpLmFydGlmYWN0SWQoImplcnNleS1jb250YWluZXItZ3JpenpseTItc2VydmxldCIpCisgICAgICAgICAgICAgICAgICAgICAgICAudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisKKyAgICAgICAgICAgICAgICAvLyBNQlIvTUJXIGZvciBKU09OLVAgaXMgb24gdGhlIGNsYXNzcGF0aC4KKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5nbGFzc2Zpc2giKS5hcnRpZmFjdElkKCJqYXZheC5qc29uIikudmVyc2lvbkFzSW5Qcm9qZWN0KCkKKyAgICAgICAgKSk7CisKKyAgICAgICAgb3B0aW9ucyA9IEhlbHBlci5hZGRQYXhFeGFtTWF2ZW5Mb2NhbFJlcG9zaXRvcnlQcm9wZXJ0eShvcHRpb25zKTsKKyAgICAgICAgcmV0dXJuIEhlbHBlci5hc0FycmF5KG9wdGlvbnMpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZVJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKCkucGFja2FnZXMoU2ltcGxlUmVzb3VyY2UuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7CisgICAgICAgIGZpbmFsIEh0dHBTZXJ2ZXIgc2VydmVyID0gR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5LmNyZWF0ZUh0dHBTZXJ2ZXIoYmFzZVVyaSwgcmVzb3VyY2VDb25maWcpOworCisgICAgICAgIF90ZXN0U2Nhbm5lZFJlc291cmNlcyhzZXJ2ZXIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNpbXBsZVJlc291cmNlSW5pdFBhcmFtZXRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBpbml0UGFyYW1zID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+KCk7CisgICAgICAgIGluaXRQYXJhbXMucHV0KAorICAgICAgICAgICAgICAgIFNlcnZlclByb3BlcnRpZXMuUFJPVklERVJfUEFDS0FHRVMsCisgICAgICAgICAgICAgICAgU2ltcGxlUmVzb3VyY2UuY2xhc3MuZ2V0UGFja2FnZSgpLmdldE5hbWUoKSk7CisKKyAgICAgICAgLy8gVE9ETyAtIHRlbXBvcmFyeSB3b3JrYXJvdW5kCisgICAgICAgIC8vIFRoaXMgaXMgYSB3b3JrYXJvdW5kIHJlbGF0ZWQgdG8gaXNzdWUgSkVSU0VZLTIwOTM7IGdyaXp6bHkgKDEuOS41KSBuZWVkcyB0byBoYXZlIHRoZSBjb3JyZWN0IGNvbnRleHQKKyAgICAgICAgLy8gY2xhc3Nsb2FkZXIgc2V0CisgICAgICAgIENsYXNzTG9hZGVyIG15Q2xhc3NMb2FkZXIgPSBnZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCk7CisgICAgICAgIENsYXNzTG9hZGVyIG9yaWdpbmFsQ29udGV4dENsYXNzTG9hZGVyID0gVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKKyAgICAgICAgSHR0cFNlcnZlciBzZXJ2ZXIgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5zZXRDb250ZXh0Q2xhc3NMb2FkZXIobXlDbGFzc0xvYWRlcik7CisgICAgICAgICAgICBzZXJ2ZXIgPSBHcml6emx5V2ViQ29udGFpbmVyRmFjdG9yeS5jcmVhdGUoYmFzZVVyaSwgU2VydmxldENvbnRhaW5lci5jbGFzcywgaW5pdFBhcmFtcyk7CisgICAgICAgIH0gZmluYWxseSB7CisgICAgICAgICAgICBUaHJlYWQuY3VycmVudFRocmVhZCgpLnNldENvbnRleHRDbGFzc0xvYWRlcihvcmlnaW5hbENvbnRleHRDbGFzc0xvYWRlcik7CisgICAgICAgIH0KKyAgICAgICAgLy8gRU5EIG9mIHdvcmthcm91bmQgLSB3aGVuIGdyaXp6bHkgdXBkYXRlZCB0byBtb3JlIHJlY2VudCB2ZXJzaW9uLCBvbmx5IHRoZSBpbm5lciBsaW5lIG9mIHRyeSBjbGF1c2Ugc2hvdWxkIHJlbWFpbjoKKworICAgICAgICBfdGVzdFNjYW5uZWRSZXNvdXJjZXMoc2VydmVyKTsKKyAgICB9CisKKyAgICBwcml2YXRlIHZvaWQgX3Rlc3RTY2FubmVkUmVzb3VyY2VzKGZpbmFsIEh0dHBTZXJ2ZXIgc2VydmVyKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgQ2xpZW50IGNsaWVudCA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KCk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJPSyIsIGNsaWVudC50YXJnZXQoYmFzZVVyaSkucGF0aCgiL3NpbXBsZSIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisgICAgICAgIC8vIHJlc291cmNlcyBpbiBzdWJwYWNrYWdlcyBhcmVuJ3Qgc3VwcG9ydGVkIHlldCBiZWNhdXNlIHRoZSBvc2dpIHJlY3Vyc2l2ZSBzY2FubmluZyBpcyBzZXQgdG8gZmFsc2UKKy8vICAgICAgICBhc3NlcnRFcXVhbHMoInN1Yi1PSyIsIGNsaWVudC50YXJnZXQoYmFzZVVyaSkucGF0aCgiL3N1Yi1wYWNrYWdlZCIpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKSk7CisKKyAgICAgICAgc2VydmVyLnNodXRkb3duTm93KCk7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9vc2dpL2Z1bmN0aW9uYWwvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vc2dpL3Rlc3QvYmFzaWMvUmVzb3VyY2VCdW5kbGVUZXN0LmphdmEgYi90ZXN0cy9vc2dpL2Z1bmN0aW9uYWwvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vc2dpL3Rlc3QvYmFzaWMvUmVzb3VyY2VCdW5kbGVUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y2YzZmYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL29zZ2kvZnVuY3Rpb25hbC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29zZ2kvdGVzdC9iYXNpYy9SZXNvdXJjZUJ1bmRsZVRlc3QuamF2YQpAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5vc2dpLnRlc3QuYmFzaWM7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkhhbmRsZXI7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nTWFuYWdlcjsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5TaW1wbGVGb3JtYXR0ZXI7CitpbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuU3RyZWFtSGFuZGxlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuVXJpQnVpbGRlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkyLmh0dHBzZXJ2ZXIuR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLkVycm9yczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5vc2dpLnRlc3QudXRpbC5IZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLm9wczRqLnBheC5leGFtLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wczRqLnBheC5leGFtLk9wdGlvbjsKK2ltcG9ydCBvcmcub3BzNGoucGF4LmV4YW0uanVuaXQuUGF4RXhhbTsKKworLyoqCisgKiBFbnN1cmVzIHNlcnZlciBsb2NhbGl6YXRpb24gcmVzb3VyY2UgYnVuZGxlIGdldHMgbG9hZGVkIGZpbmUgaW4gT1NHaSBydW50aW1lLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSdW5XaXRoKFBheEV4YW0uY2xhc3MpCitwdWJsaWMgY2xhc3MgUmVzb3VyY2VCdW5kbGVUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URVhUID0gIi9qZXJzZXkiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIGJhc2VVcmkgPSBVcmlCdWlsZGVyCisgICAgICAgICAgICAuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdCIpCisgICAgICAgICAgICAucG9ydChIZWxwZXIuZ2V0UG9ydCgpKQorICAgICAgICAgICAgLnBhdGgoQ09OVEVYVCkuYnVpbGQoKTsKKworICAgIEBDb25maWd1cmF0aW9uCisgICAgcHVibGljIHN0YXRpYyBPcHRpb25bXSBjb25maWd1cmF0aW9uKCkgeworICAgICAgICBMaXN0PE9wdGlvbj4gb3B0aW9ucyA9IEhlbHBlci5nZXRDb21tb25Pc2dpT3B0aW9ucygpOworICAgICAgICBvcHRpb25zLmFkZEFsbChIZWxwZXIuZXhwYW5kZWRMaXN0KAorICAgICAgICAgICAgICAgIC8vIFBheFJ1bm5lck9wdGlvbnMudm1PcHRpb24oIi1YcnVuamR3cDp0cmFuc3BvcnQ9ZHRfc29ja2V0LHNlcnZlcj15LHN1c3BlbmQ9eSxhZGRyZXNzPTUwMDUiKQorICAgICAgICApKTsKKworICAgICAgICByZXR1cm4gSGVscGVyLmFzQXJyYXkob3B0aW9ucyk7CisgICAgfQorCisgICAgQFBhdGgoIi9ub24tZGVwbG95YWJsZSIpCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCYWRSZXNvdXJjZSB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBwcml2YXRlIFN0cmluZyBnZXRNZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAibm8gd2F5IjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEJhZFJlc291cmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKEJhZFJlc291cmNlLmNsYXNzKTsKKworICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gbG9nT3V0cHV0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOworICAgICAgICBIYW5kbGVyIGxvZ0hhbmRsZXIgPSBuZXcgU3RyZWFtSGFuZGxlcihsb2dPdXRwdXQsIG5ldyBTaW1wbGVGb3JtYXR0ZXIoKSk7CisKKyAgICAgICAgR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5LmNyZWF0ZUh0dHBTZXJ2ZXIoYmFzZVVyaSwgcmVzb3VyY2VDb25maWcsIGZhbHNlKTsKKworICAgICAgICAvLyBUT0RPOiB0aGVyZSBzaG91bGQgYmUgYSBiZXR0ZXIgd2F5IHRvIGdldCB0aGUgbG9nIG91dHB1dCEKKyAgICAgICAgZmluYWwgRW51bWVyYXRpb248U3RyaW5nPiBsb2dnZXJOYW1lcyA9IExvZ01hbmFnZXIuZ2V0TG9nTWFuYWdlcigpLmdldExvZ2dlck5hbWVzKCk7CisgICAgICAgIHdoaWxlIChsb2dnZXJOYW1lcy5oYXNNb3JlRWxlbWVudHMoKSkgeworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBsb2dnZXJOYW1lcy5uZXh0RWxlbWVudCgpOworICAgICAgICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aCgib3JnLmdsYXNzZmlzaCIpKSB7CisgICAgICAgICAgICAgICAgTG9nTWFuYWdlci5nZXRMb2dNYW5hZ2VyKCkuZ2V0TG9nZ2VyKEVycm9ycy5jbGFzcy5nZXROYW1lKCkpLmFkZEhhbmRsZXIobG9nSGFuZGxlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5LmNyZWF0ZUh0dHBTZXJ2ZXIoYmFzZVVyaSwgcmVzb3VyY2VDb25maWcsIGZhbHNlKTsKKyAgICAgICAgbG9nT3V0cHV0LmZsdXNoKCk7CisgICAgICAgIGZpbmFsIFN0cmluZyBsb2dPdXRwdXRBc1N0cmluZyA9IGxvZ091dHB1dC50b1N0cmluZygpOworCisgICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShsb2dPdXRwdXRBc1N0cmluZy5jb250YWlucygiW2ZhaWxlZCB0byBsb2NhbGl6ZV0iKSk7CisgICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKGxvZ091dHB1dEFzU3RyaW5nLmNvbnRhaW5zKCJCYWRSZXNvdXJjZSIpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9vc2dpL2Z1bmN0aW9uYWwvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vc2dpL3Rlc3QvYmFzaWMvU2ltcGxlUmVzb3VyY2UuamF2YSBiL3Rlc3RzL29zZ2kvZnVuY3Rpb25hbC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29zZ2kvdGVzdC9iYXNpYy9TaW1wbGVSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiNjcyY2IKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9vc2dpL2Z1bmN0aW9uYWwvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vc2dpL3Rlc3QvYmFzaWMvU2ltcGxlUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5Lm9zZ2kudGVzdC5iYXNpYzsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworCisvKioKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQYXRoKCIvc2ltcGxlIikKK3B1YmxpYyBjbGFzcyBTaW1wbGVSZXNvdXJjZSB7CisKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBnZXRNZSgpIHsKKyAgICAgICAgcmV0dXJuICJPSyI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L2Jhc2ljL1NzZVRlc3QuamF2YSBiL3Rlc3RzL29zZ2kvZnVuY3Rpb25hbC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29zZ2kvdGVzdC9iYXNpYy9Tc2VUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU1OGYzMgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL29zZ2kvZnVuY3Rpb25hbC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L29zZ2kvdGVzdC9iYXNpYy9Tc2VUZXN0LmphdmEKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkub3NnaS50ZXN0LmJhc2ljOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuQ291bnREb3duTGF0Y2g7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9jZXNzaW5nRXhjZXB0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlCdWlsZGVyOworCitpbXBvcnQgamF2YXguaW5qZWN0LkluamVjdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkyLmh0dHBzZXJ2ZXIuR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhLnNzZS5FdmVudE91dHB1dDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5zc2UuRXZlbnRTb3VyY2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEuc3NlLkluYm91bmRFdmVudDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5zc2UuT3V0Ym91bmRFdmVudDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYS5zc2UuU3NlRmVhdHVyZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5vc2dpLnRlc3QudXRpbC5IZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5ncml6emx5Lmh0dHAuc2VydmVyLkh0dHBTZXJ2ZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLm9wczRqLnBheC5leGFtLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wczRqLnBheC5leGFtLk9wdGlvbjsKK2ltcG9ydCBvcmcub3BzNGoucGF4LmV4YW0uanVuaXQuUGF4RXhhbTsKK2ltcG9ydCBvcmcub3NnaS5mcmFtZXdvcmsuQnVuZGxlQ29udGV4dDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLm9wczRqLnBheC5leGFtLkNvcmVPcHRpb25zLm1hdmVuQnVuZGxlOworCisvKioKKyAqIEJhc2ljIHRlc3QgZm9yIFNTRSBtb2R1bGUgT1NHaWZpY2F0aW9uLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BSdW5XaXRoKFBheEV4YW0uY2xhc3MpCitwdWJsaWMgY2xhc3MgU3NlVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09OVEVYVCA9ICIvamVyc2V5IjsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFVSSSBiYXNlVXJpID0gVXJpQnVpbGRlcgorICAgICAgICAgICAgLmZyb21VcmkoImh0dHA6Ly9sb2NhbGhvc3QiKQorICAgICAgICAgICAgLnBvcnQoSGVscGVyLmdldFBvcnQoKSkKKyAgICAgICAgICAgIC5wYXRoKENPTlRFWFQpLmJ1aWxkKCk7CisKKyAgICBASW5qZWN0CisgICAgcHJvdGVjdGVkIEJ1bmRsZUNvbnRleHQgYnVuZGxlQ29udGV4dDsKKworICAgIEBDb25maWd1cmF0aW9uCisgICAgcHVibGljIHN0YXRpYyBPcHRpb25bXSBjb25maWd1cmF0aW9uKCkgeworICAgICAgICBMaXN0PE9wdGlvbj4gb3B0aW9ucyA9IEhlbHBlci5nZXRDb21tb25Pc2dpT3B0aW9ucygpOworCisgICAgICAgIG9wdGlvbnMuYWRkQWxsKEhlbHBlci5leHBhbmRlZExpc3QoCisgICAgICAgICAgICAgICAgLy8gSmVyc2V5IFNTRSBkZXBlbmRlbmNpZXMKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhIikuYXJ0aWZhY3RJZCgiamVyc2V5LW1lZGlhLXNzZSIpLnZlcnNpb25Bc0luUHJvamVjdCgpKSk7CisKKyAgICAgICAgb3B0aW9ucyA9IEhlbHBlci5hZGRQYXhFeGFtTWF2ZW5Mb2NhbFJlcG9zaXRvcnlQcm9wZXJ0eShvcHRpb25zKTsKKyAgICAgICAgcmV0dXJuIEhlbHBlci5hc0FycmF5KG9wdGlvbnMpOworICAgIH0KKworICAgIEBQYXRoKCIvc3NlIikKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFNzZVJlc291cmNlIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcyhTc2VGZWF0dXJlLlNFUlZFUl9TRU5UX0VWRU5UUykKKyAgICAgICAgcHVibGljIEV2ZW50T3V0cHV0IGdldEl0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgICAgIGZpbmFsIEV2ZW50T3V0cHV0IHJlc3VsdCA9IG5ldyBFdmVudE91dHB1dCgpOworICAgICAgICAgICAgcmVzdWx0LndyaXRlKG5ldyBPdXRib3VuZEV2ZW50LkJ1aWxkZXIoKS5uYW1lKCJldmVudDEiKS5kYXRhKFN0cmluZy5jbGFzcywgInBpbmciKS5idWlsZCgpKTsKKyAgICAgICAgICAgIHJlc3VsdC53cml0ZShuZXcgT3V0Ym91bmRFdmVudC5CdWlsZGVyKCkubmFtZSgiZXZlbnQyIikuZGF0YShTdHJpbmcuY2xhc3MsICJwb25nIikuYnVpbGQoKSk7CisgICAgICAgICAgICByZXN1bHQuY2xvc2UoKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgUmVzb3VyY2VDb25maWcgcmVzb3VyY2VDb25maWcgPSBuZXcgUmVzb3VyY2VDb25maWcoU3NlUmVzb3VyY2UuY2xhc3MsIFNzZUZlYXR1cmUuY2xhc3MpOworICAgICAgICBmaW5hbCBIdHRwU2VydmVyIHNlcnZlciA9IEdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeS5jcmVhdGVIdHRwU2VydmVyKGJhc2VVcmksIHJlc291cmNlQ29uZmlnKTsKKworICAgICAgICBDbGllbnQgYyA9IENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KCk7CisgICAgICAgIGMucmVnaXN0ZXIoU3NlRmVhdHVyZS5jbGFzcyk7CisKKyAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGRhdGEgPSBuZXcgTGlua2VkTGlzdDxTdHJpbmc+KCk7CisgICAgICAgIGZpbmFsIENvdW50RG93bkxhdGNoIGxhdGNoID0gbmV3IENvdW50RG93bkxhdGNoKDIpOworCisgICAgICAgIGZpbmFsIEV2ZW50U291cmNlIGV2ZW50U291cmNlID0gbmV3IEV2ZW50U291cmNlKGMudGFyZ2V0KGJhc2VVcmkpLnBhdGgoIi9zc2UiKSkgeworCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXZlbnQoSW5ib3VuZEV2ZW50IGV2ZW50KSB7CisgICAgICAgICAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgICAgICAgICAgZGF0YS5hZGQoZXZlbnQucmVhZERhdGEoKSk7CisgICAgICAgICAgICAgICAgICAgIGxhdGNoLmNvdW50RG93bigpOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFByb2Nlc3NpbmdFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBpZ25vcmUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH07CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShsYXRjaC5hd2FpdCgyLCBUaW1lVW5pdC5TRUNPTkRTKSk7CisKKyAgICAgICAgZXZlbnRTb3VyY2UuY2xvc2UoKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIGRhdGEuc2l6ZSgpKTsKKworICAgICAgICBzZXJ2ZXIuc2h1dGRvd25Ob3coKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9vc2dpL2Z1bmN0aW9uYWwvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vc2dpL3Rlc3QvYmFzaWMvV2ViUmVzb3VyY2VGYWN0b3J5VGVzdC5qYXZhIGIvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L2Jhc2ljL1dlYlJlc291cmNlRmFjdG9yeVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjk5MzkzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L2Jhc2ljL1dlYlJlc291cmNlRmFjdG9yeVRlc3QuamF2YQpAQCAtMCwwICsxLDE5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5vc2dpLnRlc3QuYmFzaWM7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoUGFyYW07CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuUXVlcnlQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuQ2xpZW50QnVpbGRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUJ1aWxkZXI7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LnByb3h5LldlYlJlc291cmNlRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5ncml6emx5Mi5odHRwc2VydmVyLkdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5vc2dpLnRlc3QudXRpbC5IZWxwZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5ncml6emx5Lmh0dHAuc2VydmVyLkh0dHBTZXJ2ZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLm9wczRqLnBheC5leGFtLkNvbmZpZ3VyYXRpb247CitpbXBvcnQgb3JnLm9wczRqLnBheC5leGFtLk9wdGlvbjsKK2ltcG9ydCBvcmcub3BzNGoucGF4LmV4YW0uanVuaXQuUGF4RXhhbTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5vcHM0ai5wYXguZXhhbS5Db3JlT3B0aW9ucy5tYXZlbkJ1bmRsZTsKKworLyoqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFJ1bldpdGgoUGF4RXhhbS5jbGFzcykKK3B1YmxpYyBjbGFzcyBXZWJSZXNvdXJjZUZhY3RvcnlUZXN0IHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05URVhUID0gIi9qZXJzZXkiOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVVJJIGJhc2VVcmkgPSBVcmlCdWlsZGVyCisgICAgICAgICAgICAuZnJvbVVyaSgiaHR0cDovL2xvY2FsaG9zdCIpCisgICAgICAgICAgICAucG9ydChIZWxwZXIuZ2V0UG9ydCgpKQorICAgICAgICAgICAgLnBhdGgoQ09OVEVYVCkuYnVpbGQoKTsKKworICAgIEBDb25maWd1cmF0aW9uCisgICAgcHVibGljIHN0YXRpYyBPcHRpb25bXSBjb25maWd1cmF0aW9uKCkgeworICAgICAgICBMaXN0PE9wdGlvbj4gb3B0aW9ucyA9IEhlbHBlci5nZXRDb21tb25Pc2dpT3B0aW9ucygpOworCisgICAgICAgIG9wdGlvbnMuYWRkQWxsKEhlbHBlci5leHBhbmRlZExpc3QoCisgICAgICAgICAgICAgICAgLy8gamVyc2V5LW11bHRpcGFydCBkZXBlbmRlbmNpZXMKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dCIpLmFydGlmYWN0SWQoImplcnNleS1wcm94eS1jbGllbnQiKS52ZXJzaW9uQXNJblByb2plY3QoKSkpOworCisgICAgICAgIG9wdGlvbnMgPSBIZWxwZXIuYWRkUGF4RXhhbU1hdmVuTG9jYWxSZXBvc2l0b3J5UHJvcGVydHkob3B0aW9ucyk7CisgICAgICAgIHJldHVybiBIZWxwZXIuYXNBcnJheShvcHRpb25zKTsKKyAgICB9CisKKyAgICBAWG1sUm9vdEVsZW1lbnQKKyAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE15QmVhbiB7CisgICAgICAgIHB1YmxpYyBTdHJpbmcgbmFtZTsKKyAgICB9CisKKyAgICBAUGF0aCgibXlyZXNvdXJjZSIpCisgICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgTXlSZXNvdXJjZUlmYyB7CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgICAgIFN0cmluZyBnZXRJdCgpOworCisgICAgICAgIEBQT1NUCisgICAgICAgIEBDb25zdW1lcyh7TWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTH0pCisgICAgICAgIEBQcm9kdWNlcyh7TWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTH0pCisgICAgICAgIExpc3Q8TXlCZWFuPiBwb3N0SXQoTGlzdDxNeUJlYW4+IGVudGl0eSk7CisKKyAgICAgICAgQFBhdGgoIntpZH0iKQorICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICAgICAgU3RyaW5nIGdldElkKEBQYXRoUGFyYW0oImlkIikgU3RyaW5nIGlkKTsKKworICAgICAgICBAUGF0aCgicXVlcnkiKQorICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKKyAgICAgICAgU3RyaW5nIGdldEJ5TmFtZShAUXVlcnlQYXJhbSgibmFtZSIpIFN0cmluZyBuYW1lKTsKKworICAgICAgICBAUGF0aCgic3VicmVzb3VyY2UiKQorICAgICAgICBNeVN1YlJlc291cmNlSWZjIGdldFN1YlJlc291cmNlKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBNeVJlc291cmNlIGltcGxlbWVudHMgTXlSZXNvdXJjZUlmYyB7CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SXQoKSB7CisgICAgICAgICAgICByZXR1cm4gIkdvdCBpdCEiOworICAgICAgICB9CisKKyAgICAgICAgQE92ZXJyaWRlCisgICAgICAgIHB1YmxpYyBMaXN0PE15QmVhbj4gcG9zdEl0KExpc3Q8TXlCZWFuPiBlbnRpdHkpIHsKKyAgICAgICAgICAgIHJldHVybiBlbnRpdHk7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIFN0cmluZyBnZXRJZChTdHJpbmcgaWQpIHsKKyAgICAgICAgICAgIHJldHVybiBpZDsKKyAgICAgICAgfQorCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgU3RyaW5nIGdldEJ5TmFtZShTdHJpbmcgbmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgICAgIH0KKworICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgcHVibGljIE15U3ViUmVzb3VyY2VJZmMgZ2V0U3ViUmVzb3VyY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IE15U3ViUmVzb3VyY2UoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXlTdWJSZXNvdXJjZSBpbXBsZW1lbnRzIE15U3ViUmVzb3VyY2VJZmMgeworCisgICAgICAgIEBPdmVycmlkZQorICAgICAgICBwdWJsaWMgTXlCZWFuIGdldE15QmVhbigpIHsKKyAgICAgICAgICAgIE15QmVhbiBiZWFuID0gbmV3IE15QmVhbigpOworICAgICAgICAgICAgYmVhbi5uYW1lID0gIkdvdCBpdCEiOworICAgICAgICAgICAgcmV0dXJuIGJlYW47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBNeVN1YlJlc291cmNlSWZjIHsKKworICAgICAgICBAR0VUCisgICAgICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fWE1MKQorICAgICAgICBwdWJsaWMgTXlCZWFuIGdldE15QmVhbigpOworICAgIH0KKworICAgIHByaXZhdGUgSHR0cFNlcnZlciBzZXJ2ZXI7CisgICAgcHJpdmF0ZSBNeVJlc291cmNlSWZjIHJlc291cmNlOworCisgICAgQEJlZm9yZQorICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gbmV3IFJlc291cmNlQ29uZmlnKE15UmVzb3VyY2UuY2xhc3MpOworICAgICAgICBzZXJ2ZXIgPSBHcml6emx5SHR0cFNlcnZlckZhY3RvcnkuY3JlYXRlSHR0cFNlcnZlcihiYXNlVXJpLCByZXNvdXJjZUNvbmZpZyk7CisgICAgICAgIHJlc291cmNlID0gV2ViUmVzb3VyY2VGYWN0b3J5Lm5ld1Jlc291cmNlKE15UmVzb3VyY2VJZmMuY2xhc3MsIENsaWVudEJ1aWxkZXIubmV3Q2xpZW50KCkudGFyZ2V0KGJhc2VVcmkpKTsKKyAgICB9CisKKyAgICBAQWZ0ZXIKKyAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBzZXJ2ZXIuc2h1dGRvd25Ob3coKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXRJdCgpIHsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJHb3QgaXQhIiwgcmVzb3VyY2UuZ2V0SXQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdEl0KCkgeworICAgICAgICBNeUJlYW4gYmVhbiA9IG5ldyBNeUJlYW4oKTsKKyAgICAgICAgYmVhbi5uYW1lID0gIkZvbyI7CisgICAgICAgIGFzc2VydEVxdWFscygiRm9vIiwgcmVzb3VyY2UucG9zdEl0KENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoYmVhbikpLmdldCgwKS5uYW1lKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYXRoUGFyYW0oKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiQmFyIiwgcmVzb3VyY2UuZ2V0SWQoIkJhciIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RRdWVyeVBhcmFtKCkgeworICAgICAgICBhc3NlcnRFcXVhbHMoIkplcnNleTIiLCByZXNvdXJjZS5nZXRCeU5hbWUoIkplcnNleTIiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U3ViUmVzb3VyY2UoKSB7CisgICAgICAgIGFzc2VydEVxdWFscygiR290IGl0ISIsIHJlc291cmNlLmdldFN1YlJlc291cmNlKCkuZ2V0TXlCZWFuKCkubmFtZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L2Jhc2ljL3N1YnBhY2thZ2UvU2ltcGxlUmVzb3VyY2VTdWJwYWNrYWdlZC5qYXZhIGIvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L2Jhc2ljL3N1YnBhY2thZ2UvU2ltcGxlUmVzb3VyY2VTdWJwYWNrYWdlZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NDM0ZWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9vc2dpL2Z1bmN0aW9uYWwvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vc2dpL3Rlc3QvYmFzaWMvc3VicGFja2FnZS9TaW1wbGVSZXNvdXJjZVN1YnBhY2thZ2VkLmphdmEKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS5vc2dpLnRlc3QuYmFzaWMuc3VicGFja2FnZTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworCisvKioKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIi9zdWItcGFja2FnZWQiKQorcHVibGljIGNsYXNzIFNpbXBsZVJlc291cmNlU3VicGFja2FnZWQgeworICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdldE1lKCkgeworICAgICAgICByZXR1cm4gInN1Yi1PSyI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L3V0aWwvSGVscGVyLmphdmEgYi90ZXN0cy9vc2dpL2Z1bmN0aW9uYWwvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS9vc2dpL3Rlc3QvdXRpbC9IZWxwZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2Q5NjcwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvb3NnaS9mdW5jdGlvbmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvb3NnaS90ZXN0L3V0aWwvSGVscGVyLmphdmEKQEAgLTAsMCArMSwxODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTAsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkub3NnaS50ZXN0LnV0aWw7CisKK2ltcG9ydCBqYXZhLnNlY3VyaXR5LkFjY2Vzc0NvbnRyb2xsZXI7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLnV0aWwuUHJvcGVydGllc0hlbHBlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LlRlc3RQcm9wZXJ0aWVzOworCitpbXBvcnQgb3JnLm9wczRqLnBheC5leGFtLk9wdGlvbjsKK2ltcG9ydCBzdGF0aWMgb3JnLm9wczRqLnBheC5leGFtLkNvcmVPcHRpb25zLmp1bml0QnVuZGxlczsKK2ltcG9ydCBzdGF0aWMgb3JnLm9wczRqLnBheC5leGFtLkNvcmVPcHRpb25zLm1hdmVuQnVuZGxlOworaW1wb3J0IHN0YXRpYyBvcmcub3BzNGoucGF4LmV4YW0uQ29yZU9wdGlvbnMub3B0aW9uczsKK2ltcG9ydCBzdGF0aWMgb3JnLm9wczRqLnBheC5leGFtLkNvcmVPcHRpb25zLnN5c3RlbVBhY2thZ2U7CitpbXBvcnQgc3RhdGljIG9yZy5vcHM0ai5wYXguZXhhbS5Db3JlT3B0aW9ucy5zeXN0ZW1Qcm9wZXJ0eTsKKworLyoqCisgKiBIZWxwZXIgY2xhc3MgdG8gYmUgdXNlZCBieSBpbmRpdmlkdWFsIHRlc3RzLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworcHVibGljIGNsYXNzIEhlbHBlciB7CisKKyAgICAvKioKKyAgICAgKiBKZXJzZXkgSFRUUCBwb3J0LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBwb3J0ID0gZ2V0RW52VmFyaWFibGUoVGVzdFByb3BlcnRpZXMuQ09OVEFJTkVSX1BPUlQsIDgwODApOworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhbiBpbnRlZ2VyIHZhbHVlIG9mIGdpdmVuIHN5c3RlbSBwcm9wZXJ0eSwgb3IgYSBkZWZhdWx0IHZhbHVlCisgICAgICogYXMgZGVmaW5lZCBieSB0aGUgb3RoZXIgbWV0aG9kIHBhcmFtZXRlciwgaWYgdGhlIHN5c3RlbSBwcm9wZXJ0eSBjYW4KKyAgICAgKiBub3QgYmUgdXNlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSB2YXJOYW1lICAgICAgbmFtZSBvZiB0aGUgc3lzdGVtIHZhcmlhYmxlLgorICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgdGhlIGRlZmF1bHQgdmFsdWUgdG8gcmV0dXJuIGlmIHRoZSBzeXN0ZW0gdmFyaWFibGUgaXMgbWlzc2luZyBvciBjYW4gbm90IGJlIHBhcnNlZCBhcyBhbiBpbnRlZ2VyLgorICAgICAqIEByZXR1cm4gYW4gaW50ZWdlciB2YWx1ZSB0YWtlbiBlaXRoZXIgZnJvbSB0aGUgc3lzdGVtIHByb3BlcnR5IG9yIHRoZSBkZWZhdWx0IHZhbHVlIGFzIGRlZmluZWQgYnkgdGhlIGRlZmF1bHRWYWx1ZSBwYXJhbWV0ZXIuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0RW52VmFyaWFibGUoZmluYWwgU3RyaW5nIHZhck5hbWUsIGludCBkZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgaWYgKG51bGwgPT0gdmFyTmFtZSkgeworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmcgdmFyVmFsdWUgPSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChQcm9wZXJ0aWVzSGVscGVyLmdldFN5c3RlbVByb3BlcnR5KHZhck5hbWUpKTsKKyAgICAgICAgaWYgKG51bGwgIT0gdmFyVmFsdWUpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQodmFyVmFsdWUpOworICAgICAgICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAvLyB3aWxsIHJldHVybiBkZWZhdWx0IHZhbHVlIGJlbG93CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgdmFsdWUgb2Yge0B2YWx1ZSBUZXN0UHJvcGVydGllcyNDT05UQUlORVJfUE9SVH0gcHJvcGVydHkgd2hpY2ggc2hvdWxkIGJlIHVzZWQgYXMgcG9ydCBudW1iZXIgZm9yIHRlc3QgY29udGFpbmVyLgorICAgICAqCisgICAgICogQHJldHVybiBwb3J0IG51bWJlci4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludCBnZXRQb3J0KCkgeworICAgICAgICByZXR1cm4gcG9ydDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgc3lzdGVtIHByb3BlcnR5IGZvciBNYXZlbiBsb2NhbCByZXBvc2l0b3J5IGxvY2F0aW9uIHRvIHRoZSBQYXhFeGFtIE9TR2kgcnVudGltZSBpZiBhICJsb2NhbFJlcG9zaXRvcnkiIHByb3BlcnR5CisgICAgICogaXMgcHJlc2VudCBpbiB0aGUgbWFwIG9mIHRoZSBzeXN0ZW0gcHJvcGVydGllcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvcHRpb25zIGxpc3Qgb2Ygb3B0aW9ucyB0byBhZGQgdGhlIGxvY2FsIHJlcG9zaXRvcnkgcHJvcGVydHkgdG8uCisgICAgICogQHJldHVybiBsaXN0IG9mIG9wdGlvbnMgZW5oYW5jZWQgYnkgdGhlIGxvY2FsIHJlcG9zaXRvcnkgcHJvcGVydHkgaWYgdGhpcyBwcm9wZXJ0eSBpcyBzZXQgb3IgdGhlIGdpdmVuIGxpc3QgaWYgdGhlCisgICAgICogICAgICAgICBwcmV2aW91cyBjb25kaXRpb24gaXMgbm90IG1ldC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8T3B0aW9uPiBhZGRQYXhFeGFtTWF2ZW5Mb2NhbFJlcG9zaXRvcnlQcm9wZXJ0eShMaXN0PE9wdGlvbj4gb3B0aW9ucykgeworICAgICAgICBmaW5hbCBTdHJpbmcgbG9jYWxSZXBvc2l0b3J5ID0gQWNjZXNzQ29udHJvbGxlci5kb1ByaXZpbGVnZWQoUHJvcGVydGllc0hlbHBlci5nZXRTeXN0ZW1Qcm9wZXJ0eSgibG9jYWxSZXBvc2l0b3J5IikpOworCisgICAgICAgIGlmIChsb2NhbFJlcG9zaXRvcnkgIT0gbnVsbCkgeworICAgICAgICAgICAgb3B0aW9ucy5hZGRBbGwoZXhwYW5kZWRMaXN0KHN5c3RlbVByb3BlcnR5KCJvcmcub3BzNGoucGF4LnVybC5tdm4ubG9jYWxSZXBvc2l0b3J5IikudmFsdWUobG9jYWxSZXBvc2l0b3J5KSkpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIG9wdGlvbnM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCBsaXN0IG9mIE9TR2kgb3B0aW9ucyB0byBhbiBhcnJheS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBvcHRpb25zIGxpc3Qgb2YgT1NHaSBvcHRpb25zLgorICAgICAqIEByZXR1cm4gYXJyYXkgb2YgT1NHaSBvcHRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgT3B0aW9uW10gYXNBcnJheShmaW5hbCBMaXN0PE9wdGlvbj4gb3B0aW9ucykgeworICAgICAgICByZXR1cm4gb3B0aW9ucy50b0FycmF5KG5ldyBPcHRpb25bb3B0aW9ucy5zaXplKCldKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgbmV3IGxpc3Qgb2YgY29tbW9uIE9TR2kgaW50ZWdyYXRpb24gdGVzdCBvcHRpb25zLgorICAgICAqCisgICAgICogQHJldHVybiBsaXN0IG9mIGNvbW1vbiBPU0dpIGludGVncmF0aW9uIHRlc3Qgb3B0aW9ucy4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8T3B0aW9uPiBnZXRDb21tb25Pc2dpT3B0aW9ucygpIHsKKyAgICAgICAgcmV0dXJuIGdldENvbW1vbk9zZ2lPcHRpb25zKHRydWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBuZXcgbGlzdCBvZiBjb21tb24gT1NHaSBpbnRlZ3JhdGlvbiB0ZXN0IG9wdGlvbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5jbHVkZUplcnNleUpheFJzTGlicyBpbmRpY2F0ZXMgd2hldGhlciBKYXhScyBhbmQgSmVyc2V5IGJ1bmRsZXMgc2hvdWxkIGJlIGFkZGVkIGludG8gdGhlIHJlc3VsdGluZyBsaXN0IG9mCisgICAgICogb3B0aW9ucy4KKyAgICAgKiBAcmV0dXJuIGxpc3Qgb2YgY29tbW9uIE9TR2kgaW50ZWdyYXRpb24gdGVzdCBvcHRpb25zLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPcHRpb24+IGdldENvbW1vbk9zZ2lPcHRpb25zKGZpbmFsIGJvb2xlYW4gaW5jbHVkZUplcnNleUpheFJzTGlicykgeworICAgICAgICBmaW5hbCBMaXN0PE9wdGlvbj4gb3B0aW9ucyA9IG5ldyBMaW5rZWRMaXN0PE9wdGlvbj4oZXhwYW5kZWRMaXN0KAorICAgICAgICAgICAgICAgIC8vIHN5c3RlbVByb3BlcnR5KCJvcmcub3BzNGoucGF4LmxvZ2dpbmcuRGVmYXVsdFNlcnZpY2VMb2cubGV2ZWwiKS52YWx1ZSgiRklORVNUIiksCisgICAgICAgICAgICAgICAgc3lzdGVtUHJvcGVydHkoIm9yZy5vc2dpLnNlcnZpY2UuaHR0cC5wb3J0IikudmFsdWUoU3RyaW5nLnZhbHVlT2YocG9ydCkpLAorICAgICAgICAgICAgICAgIHN5c3RlbVByb3BlcnR5KFRlc3RQcm9wZXJ0aWVzLkNPTlRBSU5FUl9QT1JUKS52YWx1ZShTdHJpbmcudmFsdWVPZihwb3J0KSksCisgICAgICAgICAgICAgICAgc3lzdGVtUHJvcGVydHkoIm9yZy5vc2dpLmZyYW1ld29yay5zeXN0ZW0ucGFja2FnZXMuZXh0cmEiKS52YWx1ZSgiamF2YXguYW5ub3RhdGlvbiIpLAorCisgICAgICAgICAgICAgICAgLy8gamF2YXguYW5ub3RhdGlvbiBoYXMgdG8gZ28gZmlyc3QhCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJqYXZheC5hbm5vdGF0aW9uIikuYXJ0aWZhY3RJZCgiamF2YXguYW5ub3RhdGlvbi1hcGkiKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKworICAgICAgICAgICAgICAgIGp1bml0QnVuZGxlcygpLAorCisgICAgICAgICAgICAgICAgLy8gSEsyCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuZ2xhc3NmaXNoLmhrMiIpLmFydGlmYWN0SWQoImhrMi1hcGkiKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5nbGFzc2Zpc2guaGsyIikuYXJ0aWZhY3RJZCgib3NnaS1yZXNvdXJjZS1sb2NhdG9yIikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuZ2xhc3NmaXNoLmhrMiIpLmFydGlmYWN0SWQoImhrMi1sb2NhdG9yIikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuZ2xhc3NmaXNoLmhrMiIpLmFydGlmYWN0SWQoImhrMi11dGlscyIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmdsYXNzZmlzaC5oazIuZXh0ZXJuYWwiKS5hcnRpZmFjdElkKCJqYXZheC5pbmplY3QiKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKyAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5nbGFzc2Zpc2guaGsyLmV4dGVybmFsIikuYXJ0aWZhY3RJZCgiYW9wYWxsaWFuY2UtcmVwYWNrYWdlZCIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmphdmFzc2lzdCIpLmFydGlmYWN0SWQoImphdmFzc2lzdCIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorCisgICAgICAgICAgICAgICAgLy8gR3JpenpseQorICAgICAgICAgICAgICAgIHN5c3RlbVBhY2thZ2UoInN1bi5taXNjIiksCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuZ2xhc3NmaXNoLmdyaXp6bHkiKS5hcnRpZmFjdElkKCJncml6emx5LWZyYW1ld29yayIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmdsYXNzZmlzaC5ncml6emx5IikuYXJ0aWZhY3RJZCgiZ3JpenpseS1odHRwIikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuZ2xhc3NmaXNoLmdyaXp6bHkiKS5hcnRpZmFjdElkKCJncml6emx5LWh0dHAtc2VydmVyIikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisKKyAgICAgICAgICAgICAgICAvLyBqYXZheC52YWxpZGF0aW9uCisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJqYXZheC52YWxpZGF0aW9uIikuYXJ0aWZhY3RJZCgidmFsaWRhdGlvbi1hcGkiKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKworICAgICAgICAgICAgICAgIC8vIEplcnNleSBHcml6emx5CisgICAgICAgICAgICAgICAgbWF2ZW5CdW5kbGUoKS5ncm91cElkKCJvcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzIikuYXJ0aWZhY3RJZCgiamVyc2V5LWNvbnRhaW5lci1ncml6emx5Mi1odHRwIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC52ZXJzaW9uQXNJblByb2plY3QoKQorICAgICAgICApKTsKKworICAgICAgICBpZiAoaW5jbHVkZUplcnNleUpheFJzTGlicykgeworICAgICAgICAgICAgb3B0aW9ucy5hZGRBbGwoZXhwYW5kZWRMaXN0KAorICAgICAgICAgICAgICAgICAgICAvLyBKQVgtUlMgQVBJCisgICAgICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgiamF2YXgud3MucnMiKS5hcnRpZmFjdElkKCJqYXZheC53cy5ycy1hcGkiKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKworICAgICAgICAgICAgICAgICAgICAvLyBKZXJzZXkgYnVuZGxlcworICAgICAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmUiKS5hcnRpZmFjdElkKCJqZXJzZXktY29tbW9uIikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisgICAgICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWEiKS5hcnRpZmFjdElkKCJqZXJzZXktbWVkaWEtamF4YiIpLnZlcnNpb25Bc0luUHJvamVjdCgpLAorICAgICAgICAgICAgICAgICAgICBtYXZlbkJ1bmRsZSgpLmdyb3VwSWQoIm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvcmUiKS5hcnRpZmFjdElkKCJqZXJzZXktc2VydmVyIikudmVyc2lvbkFzSW5Qcm9qZWN0KCksCisgICAgICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZSIpLmFydGlmYWN0SWQoImplcnNleS1jbGllbnQiKS52ZXJzaW9uQXNJblByb2plY3QoKSwKKworICAgICAgICAgICAgICAgICAgICAvLyBKZXJzZXkgSW5qZWN0aW9uIHByb3ZpZGVyCisgICAgICAgICAgICAgICAgICAgIG1hdmVuQnVuZGxlKCkuZ3JvdXBJZCgib3JnLmdsYXNzZmlzaC5qZXJzZXkuaW5qZWN0IikuYXJ0aWZhY3RJZCgiamVyc2V5LWhrMiIpLnZlcnNpb25Bc0luUHJvamVjdCgpCisgICAgICAgICAgICApKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBhZGRQYXhFeGFtTWF2ZW5Mb2NhbFJlcG9zaXRvcnlQcm9wZXJ0eShvcHRpb25zKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgZXhwYW5kZWQgb3B0aW9ucyBsaXN0IGZyb20gdGhlIHN1cHBsaWVkIG9wdGlvbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb3B0aW9ucyBvcHRpb25zIHRvIGJlIGV4cGFuZGVkIGludG8gdGhlIG9wdGlvbiBsaXN0LgorICAgICAqIEByZXR1cm4gZXhwYW5kZWQgb3B0aW9ucyBsaXN0LgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgTGlzdDxPcHRpb24+IGV4cGFuZGVkTGlzdChPcHRpb24uLi4gb3B0aW9ucykgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChvcHRpb25zKG9wdGlvbnMpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9vc2dpL2Z1bmN0aW9uYWwvc3JjL3Rlc3QvcmVzb3VyY2VzL2xvZzRqLnByb3BlcnRpZXMgYi90ZXN0cy9vc2dpL2Z1bmN0aW9uYWwvc3JjL3Rlc3QvcmVzb3VyY2VzL2xvZzRqLnByb3BlcnRpZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNkNTZmOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL29zZ2kvZnVuY3Rpb25hbC9zcmMvdGVzdC9yZXNvdXJjZXMvbG9nNGoucHJvcGVydGllcwpAQCAtMCwwICsxLDIwIEBACisjCisjIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorIworIyBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisjIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyMgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisjIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyMKKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisjCisKK2xvZzRqLnJvb3RDYXRlZ29yeT1FUlJPUiwgc3Rkb3V0Citsb2c0ai5hcHBlbmRlci5zdGRvdXQ9b3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXIKK2xvZzRqLmFwcGVuZGVyLnN0ZG91dC5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49WyUzMC4zMGN7MX1dIC0gJW0lbgorbG9nNGouYXBwZW5kZXIuc3Rkb3V0LmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKZGlmZiAtLWdpdCBhL3Rlc3RzL29zZ2kvcG9tLnhtbCBiL3Rlc3RzL29zZ2kvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTVmYzhhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvb3NnaS9wb20ueG1sCkBAIC0wLDAgKzEsNDEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5vc2dpPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtb3NnaTwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgVGVzdCBtb2R1bGVzIGNvbnRhaW5pbmcgdGVzdCBzY2VuYXJpbyB0eXBlcyB0aGF0IGNvdmVyIE9TR2kuCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxtb2R1bGVzPgorICAgICAgICA8bW9kdWxlPmZ1bmN0aW9uYWw8L21vZHVsZT4KKyAgICA8L21vZHVsZXM+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmtzL1JFQURNRS5tZCBiL3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFya3MvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MTY4OTYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmtzL1JFQURNRS5tZApAQCAtMCwwICsxLDI5IEBACitbLy9dOiAjICIgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuICIKK1svL106ICMgIiAgIgorWy8vXTogIyAiIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSAiCitbLy9dOiAjICIgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQgIgorWy8vXTogIyAiIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4gIgorWy8vXTogIyAiICAiCitbLy9dOiAjICIgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeSAiCitbLy9dOiAjICIgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZSAiCitbLy9dOiAjICIgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsICIKK1svL106ICMgIiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdCAiCitbLy9dOiAjICIgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLiAiCitbLy9dOiAjICIgICIKK1svL106ICMgIiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAgIgorCisjIyBIb3cgdG8gcnVuPworCitUbyBydW4gYWxsIGJlbmNobWFya3MgZXhlY3V0ZToKKworYG12biBjbGVhbiBpbnN0YWxsIGV4ZWM6ZXhlY2Agb3IgYG12biBjbGVhbiBpbnN0YWxsICYmIGphdmEgLWphciB0YXJnZXQvYmVuY2htYXJrcy5qYXJgCisKK1RvIHJ1biBzcGVjaWZpYyBiZW5jaG1hcmssIGUuZy4gYEphY2tzb25CZW5jaG1hcmtgOgorCitgbXZuIGNsZWFuIGluc3RhbGwgJiYgamF2YSAtY3AgdGFyZ2V0L2JlbmNobWFya3MuamFyIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmJlbmNobWFyay5KYWNrc29uQmVuY2htYXJrYAorCisjIyBXaGVyZSB0byBmaW5kIG1vcmUgaW5mby9leGFtcGxlcz8KKworSk1IIHBhZ2U6IGh0dHA6Ly9vcGVuamRrLmphdmEubmV0L3Byb2plY3RzL2NvZGUtdG9vbHMvam1oLworCitKTUggZXhhbXBsZXM6IGh0dHA6Ly9oZy5vcGVuamRrLmphdmEubmV0L2NvZGUtdG9vbHMvam1oL2ZpbGUvdGlwL2ptaC1zYW1wbGVzL3NyYy9tYWluL2phdmEvb3JnL29wZW5qZGsvam1oL3NhbXBsZXMvCmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmtzL3BvbS54bWwgYi90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmtzL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDAzMTRhMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFya3MvcG9tLnhtbApAQCAtMCwwICsxLDE2NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZTwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPnBlcmZvcm1hbmNlLXRlc3QtYmVuY2htYXJrczwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorICAgIDxuYW1lPnBlcmZvcm1hbmNlLXRlc3QtYmVuY2htYXJrczwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj5NaWNyby1iZW5jaG1hcmtzIHRvIHNlZSBwZXJmb3JtYW5jZSBvZiBKZXJzZXkgYW5kIGl0J3MgZmVhdHVyZXM8L2Rlc2NyaXB0aW9uPgorCisgICAgPGRlcGVuZGVuY2llcz4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb3JlPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXNlcnZlcjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLWpzb24tamFja3NvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItZ3JpenpseTItaHR0cDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbm5lY3RvcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktZ3JpenpseS1jb25uZWN0b3I8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXV0aWw8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5vcGVuamRrLmptaDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmptaC1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm9wZW5qZGsuam1oPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+am1oLWdlbmVyYXRvci1hbm5wcm9jZXNzPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWJ1bmRsZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx0eXBlPnBvbTwvdHlwZT4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhlYy1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRhYmxlPmphdmE8L2V4ZWN1dGFibGU+CisgICAgICAgICAgICAgICAgICAgIDxhcmd1bWVudHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJndW1lbnQ+LWNsYXNzcGF0aDwvYXJndW1lbnQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y2xhc3NwYXRoIC8+CisgICAgICAgICAgICAgICAgICAgICAgICA8YXJndW1lbnQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuYmVuY2htYXJrLkFsbEJlbmNobWFya3M8L2FyZ3VtZW50PgorICAgICAgICAgICAgICAgICAgICA8L2FyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNoYWRlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPG1pbmltaXplSmFyPmZhbHNlPC9taW5pbWl6ZUphcj4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+c2hhZGUtYXJjaGl2ZTwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+c2hhZGU8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgorICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZpbmFsTmFtZT4ke3ViZXJqYXIubmFtZX08L2ZpbmFsTmFtZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHJhbnNmb3JtZXJzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dHJhbnNmb3JtZXIgaW1wbGVtZW50YXRpb249Im9yZy5hcGFjaGUubWF2ZW4ucGx1Z2lucy5zaGFkZS5yZXNvdXJjZS5NYW5pZmVzdFJlc291cmNlVHJhbnNmb3JtZXIiPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1haW5DbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5iZW5jaG1hcmsuQWxsQmVuY2htYXJrczwvbWFpbkNsYXNzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3RyYW5zZm9ybWVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdHJhbnNmb3JtZXJzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmaWx0ZXJzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmlsdGVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNoYWRpbmcgc2lnbmVkIEpBUnMgd2lsbCBmYWlsIHdpdGhvdXQgdGhpcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzk5OTQ4OS9pbnZhbGlkLXNpZ25hdHVyZS1maWxlLXdoZW4tYXR0ZW1wdGluZy10by1ydW4tYS1qYXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0Pio6KjwvYXJ0aWZhY3Q+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+TUVUQS1JTkYvKi5TRjwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5NRVRBLUlORi8qLkRTQTwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhjbHVkZT5NRVRBLUlORi8qLlJTQTwvZXhjbHVkZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhjbHVkZXM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsdGVyPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmlsdGVycz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+CisgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxmb3JrTW9kZT5hbHdheXM8L2ZvcmtNb2RlPgorICAgICAgICAgICAgICAgICAgICA8ZW5hYmxlQXNzZXJ0aW9ucz5mYWxzZTwvZW5hYmxlQXNzZXJ0aW9ucz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvZmlsZXM+CisgICAgICAgIDxwcm9maWxlPgorICAgICAgICAgICAgPGlkPnNvbmFyPC9pZD4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gZGlzYWJsZSBKYUNvQ28gbGlzdGVuZXIgYmVjYXVzZSBpdCdzIG5vdCB3b3JraW5nIHdpdGggPGZvcmtNb2RlPmFsd2F5czwvZm9yaz4gKDxyZXVzZUZvcmtzPmZhbHNlPC9yZXVzZUZvcmtzPiByZXNwZWN0aXZlbHkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0dHBzOi8vamlyYS5zb25hcnNvdXJjZS5jb20vYnJvd3NlL1NPTkFSSkFWQS03MjggKGh0dHBzOi8vZ2l0aHViLmNvbS9Tb25hclNvdXJjZS9zb25hci1qYXZhL3B1bGwvMzI0KSAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb3BlcnRpZXMgY29tYmluZS5zZWxmPSJvdmVycmlkZSIgLz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW5zPgorICAgICAgICAgICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICA8L3Byb2ZpbGVzPgorCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDx1YmVyamFyLm5hbWU+YmVuY2htYXJrPC91YmVyamFyLm5hbWU+CisgICAgPC9wcm9wZXJ0aWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrcy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFyay9BbGxCZW5jaG1hcmtzLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmtzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrL0FsbEJlbmNobWFya3MuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWRjM2VlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrcy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFyay9BbGxCZW5jaG1hcmtzLmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5iZW5jaG1hcms7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5Nb2RlOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5ydW5uZXIuUnVubmVyOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5ydW5uZXIub3B0aW9ucy5PcHRpb25zOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5ydW5uZXIub3B0aW9ucy5PcHRpb25zQnVpbGRlcjsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWgucnVubmVyLm9wdGlvbnMuVGltZVZhbHVlOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgQWxsQmVuY2htYXJrcyB7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihmaW5hbCBTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgT3B0aW9ucyBvcHQgPSBuZXcgT3B0aW9uc0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC8vIFJlZ2lzdGVyIG91ciBiZW5jaG1hcmtzLgorICAgICAgICAgICAgICAgIC5pbmNsdWRlKENsaWVudEJlbmNobWFyay5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpCisgICAgICAgICAgICAgICAgLmluY2x1ZGUoSmFja3NvbkJlbmNobWFyay5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpCisgICAgICAgICAgICAgICAgLmluY2x1ZGUoTG9jYXRvckJlbmNobWFyay5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpCisgICAgICAgICAgICAgICAgLmluY2x1ZGUoSmVyc2V5VXJpQnVpbGRlckJlbmNobWFyay5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpCisgICAgICAgICAgICAgICAgLy8gTWVhc3VyZSB0aHJvdWdocHV0IGluIHNlY29uZHMgKG9wcy9zKS4KKyAgICAgICAgICAgICAgICAubW9kZShNb2RlLlRocm91Z2hwdXQpCisgICAgICAgICAgICAgICAgLnRpbWVVbml0KFRpbWVVbml0LlNFQ09ORFMpCisgICAgICAgICAgICAgICAgLy8gV2FybS11cCBzZXR1cC4KKyAgICAgICAgICAgICAgICAud2FybXVwSXRlcmF0aW9ucygxNikKKyAgICAgICAgICAgICAgICAud2FybXVwVGltZShUaW1lVmFsdWUubWlsbGlzZWNvbmRzKDI1MDApKQorICAgICAgICAgICAgICAgIC8vIE1lYXN1cmVtZW50IHNldHVwLgorICAgICAgICAgICAgICAgIC5tZWFzdXJlbWVudEl0ZXJhdGlvbnMoMTYpCisgICAgICAgICAgICAgICAgLm1lYXN1cmVtZW50VGltZShUaW1lVmFsdWUubWlsbGlzZWNvbmRzKDI1MDApKQorICAgICAgICAgICAgICAgIC8vIEZvcmshIChJbnZva2UgYmVuY2htYXJrcyBpbiBzZXBhcmF0ZSBKVk0pCisgICAgICAgICAgICAgICAgLmZvcmtzKDEpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAgICAgbmV3IFJ1bm5lcihvcHQpLnJ1bigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFya3Mvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmsvQ2xpZW50QmVuY2htYXJrLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmtzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrL0NsaWVudEJlbmNobWFyay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNTVkZjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmtzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrL0NsaWVudEJlbmNobWFyay5qYXZhCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmJlbmNobWFyazsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkZ1dHVyZTsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuSW52b2NhdGlvbkNhbGxiYWNrOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnV0aWwuY2xpZW50Lkxvb3BCYWNrQ29ubmVjdG9yUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuQmVuY2htYXJrOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5CZW5jaG1hcmtNb2RlOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5Gb3JrOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5NZWFzdXJlbWVudDsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuTW9kZTsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuT3V0cHV0VGltZVVuaXQ7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLlNjb3BlOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5TZXR1cDsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuU3RhdGU7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLlRlYXJEb3duOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5XYXJtdXA7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLnJ1bm5lci5SdW5uZXI7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLnJ1bm5lci5vcHRpb25zLk9wdGlvbnM7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLnJ1bm5lci5vcHRpb25zLk9wdGlvbnNCdWlsZGVyOworCisvKioKKyAqIExvY2F0b3Ige0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXJ9IGJlbmNobWFyay4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQEJlbmNobWFya01vZGUoTW9kZS5UaHJvdWdocHV0KQorQE91dHB1dFRpbWVVbml0KFRpbWVVbml0LlNFQ09ORFMpCitAV2FybXVwKGl0ZXJhdGlvbnMgPSAxNiwgdGltZSA9IDEsIHRpbWVVbml0ID0gVGltZVVuaXQuU0VDT05EUykKK0BNZWFzdXJlbWVudChpdGVyYXRpb25zID0gMTYsIHRpbWUgPSAxLCB0aW1lVW5pdCA9IFRpbWVVbml0LlNFQ09ORFMpCitARm9yaygxKQorQFN0YXRlKFNjb3BlLkJlbmNobWFyaykKK3B1YmxpYyBjbGFzcyBDbGllbnRCZW5jaG1hcmsgeworCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBDbGllbnQgY2xpZW50OworCisgICAgQFNldHVwCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgY2xpZW50ID0gQ2xpZW50QnVpbGRlci5uZXdDbGllbnQoTG9vcEJhY2tDb25uZWN0b3JQcm92aWRlci5nZXRDbGllbnRDb25maWcoKSk7CisgICAgfQorCisgICAgQFRlYXJEb3duCisgICAgcHVibGljIHZvaWQgc2h1dGRvd24oKSB7CisgICAgICAgIGNsaWVudC5jbG9zZSgpOworICAgIH0KKworICAgIEBCZW5jaG1hcmsKKyAgICBwdWJsaWMgUmVzcG9uc2UgZ2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjbGllbnQudGFyZ2V0KCJmb28iKS5yZXF1ZXN0KCkuZ2V0KCk7CisgICAgfQorCisgICAgQEJlbmNobWFyaworICAgIHB1YmxpYyBSZXNwb25zZSBwb3N0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiBjbGllbnQudGFyZ2V0KCJmb28iKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkudGV4dCgiYmFyIikpOworICAgIH0KKworICAgIEBCZW5jaG1hcmsKKyAgICAgcHVibGljIFJlc3BvbnNlIGFzeW5jQmxvY2soKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGNsaWVudC50YXJnZXQoImZvbyIpLnJlcXVlc3QoKS5hc3luYygpLmdldCgpLmdldCgpOworICAgIH0KKworICAgIEBCZW5jaG1hcmsKKyAgICBwdWJsaWMgRnV0dXJlPFJlc3BvbnNlPiBhc3luY0lnbm9yZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXR1cm4gY2xpZW50LnRhcmdldCgiZm9vIikucmVxdWVzdCgpLmFzeW5jKCkuZ2V0KG5ldyBJbnZvY2F0aW9uQ2FsbGJhY2s8UmVzcG9uc2U+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBjb21wbGV0ZWQoZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgICAgICAgICAvLyBOT09QCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgZmFpbGVkKGZpbmFsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKKyAgICAgICAgICAgICAgICAvLyBOT09QCisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIEBCZW5jaG1hcmsKKyAgICBwdWJsaWMgRnV0dXJlPFJlc3BvbnNlPiBhc3luY0VudGl0eUlnbm9yZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXR1cm4gY2xpZW50LnRhcmdldCgiZm9vIikucmVxdWVzdCgpLmFzeW5jKCkucG9zdChFbnRpdHkudGV4dCgiYmFyIiksIG5ldyBJbnZvY2F0aW9uQ2FsbGJhY2s8UmVzcG9uc2U+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgdm9pZCBjb21wbGV0ZWQoZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UpIHsKKyAgICAgICAgICAgICAgICAvLyBOT09QCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgZmFpbGVkKGZpbmFsIFRocm93YWJsZSB0aHJvd2FibGUpIHsKKyAgICAgICAgICAgICAgICAvLyBOT09QCisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGZpbmFsIFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBPcHRpb25zIG9wdCA9IG5ldyBPcHRpb25zQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLy8gUmVnaXN0ZXIgb3VyIGJlbmNobWFya3MuCisgICAgICAgICAgICAgICAgLmluY2x1ZGUoQ2xpZW50QmVuY2htYXJrLmNsYXNzLmdldFNpbXBsZU5hbWUoKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICBuZXcgUnVubmVyKG9wdCkucnVuKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrcy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFyay9KYWNrc29uQmVuY2htYXJrLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmtzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrL0phY2tzb25CZW5jaG1hcmsuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjUyN2ZmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrcy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFyay9KYWNrc29uQmVuY2htYXJrLmphdmEKQEAgLTAsMCArMSw5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5iZW5jaG1hcms7CisKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlcXVlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkNvbnRhaW5lclJlc3BvbnNlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QudXRpbC5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdEJ1aWxkZXI7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuYmVuY2htYXJrLmVudGl0eS5qc29uLkphY2tzb25BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5CZW5jaG1hcms7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLkJlbmNobWFya01vZGU7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLkZvcms7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLkxldmVsOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5NZWFzdXJlbWVudDsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuTW9kZTsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuT3V0cHV0VGltZVVuaXQ7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLlBhcmFtOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5TY29wZTsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuU2V0dXA7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLlN0YXRlOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5UZWFyRG93bjsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuV2FybXVwOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5ydW5uZXIuUnVubmVyOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5ydW5uZXIub3B0aW9ucy5PcHRpb25zOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5ydW5uZXIub3B0aW9ucy5PcHRpb25zQnVpbGRlcjsKKworLyoqCisgKiBKYWNrc29uIEVudGl0eSBGaWx0ZXJpbmcge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXJ9IGJlbmNobWFyay4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQEJlbmNobWFya01vZGUoTW9kZS5UaHJvdWdocHV0KQorQE91dHB1dFRpbWVVbml0KFRpbWVVbml0LlNFQ09ORFMpCitAV2FybXVwKGl0ZXJhdGlvbnMgPSAxNiwgdGltZSA9IDI1MDAsIHRpbWVVbml0ID0gVGltZVVuaXQuTUlMTElTRUNPTkRTKQorQE1lYXN1cmVtZW50KGl0ZXJhdGlvbnMgPSAxNiwgdGltZSA9IDI1MDAsIHRpbWVVbml0ID0gVGltZVVuaXQuTUlMTElTRUNPTkRTKQorQEZvcmsoMSkKK0BTdGF0ZShTY29wZS5CZW5jaG1hcmspCitwdWJsaWMgY2xhc3MgSmFja3NvbkJlbmNobWFyayB7CisKKyAgICBAUGFyYW0odmFsdWUgPSB7InByb2plY3RzL2Jhc2ljIiwgInByb2plY3RzL2RldGFpbGVkIn0pCisgICAgcHJpdmF0ZSBTdHJpbmcgcGF0aDsKKworICAgIEBQYXJhbSh2YWx1ZSA9IHsiZmFsc2UiLCAidHJ1ZSJ9KQorICAgIHByaXZhdGUgU3RyaW5nIGZpbHRlcmluZzsKKworICAgIHByaXZhdGUgdm9sYXRpbGUgQXBwbGljYXRpb25IYW5kbGVyIGhhbmRsZXI7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBDb250YWluZXJSZXF1ZXN0IHJlcXVlc3Q7CisKKyAgICBAU2V0dXAKKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBoYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihuZXcgSmFja3NvbkFwcGxpY2F0aW9uKEJvb2xlYW4udmFsdWVPZihmaWx0ZXJpbmcpKSk7CisgICAgfQorCisgICAgQFNldHVwKExldmVsLkl0ZXJhdGlvbikKKyAgICBwdWJsaWMgdm9pZCByZXF1ZXN0KCkgeworICAgICAgICByZXF1ZXN0ID0gQ29udGFpbmVyUmVxdWVzdEJ1aWxkZXIKKyAgICAgICAgICAgICAgICAuZnJvbShwYXRoLCAiR0VUIikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICB9CisKKyAgICBAVGVhckRvd24KKyAgICBwdWJsaWMgdm9pZCBzaHV0ZG93bigpIHsKKyAgICB9CisKKyAgICBAQmVuY2htYXJrCisgICAgcHVibGljIENvbnRhaW5lclJlc3BvbnNlIG1lYXN1cmVSZXNvdXJjZSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXR1cm4gaGFuZGxlci5hcHBseShyZXF1ZXN0KS5nZXQoKTsKKyAgICB9CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihmaW5hbCBTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgZmluYWwgT3B0aW9ucyBvcHQgPSBuZXcgT3B0aW9uc0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC8vIFJlZ2lzdGVyIG91ciBiZW5jaG1hcmtzLgorICAgICAgICAgICAgICAgIC5pbmNsdWRlKEphY2tzb25CZW5jaG1hcmsuY2xhc3MuZ2V0U2ltcGxlTmFtZSgpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpOworCisgICAgICAgIG5ldyBSdW5uZXIob3B0KS5ydW4oKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmtzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrL0plcnNleVVyaUJ1aWxkZXJCZW5jaG1hcmsuamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFya3Mvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmsvSmVyc2V5VXJpQnVpbGRlckJlbmNobWFyay5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwMjU3MGMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmtzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrL0plcnNleVVyaUJ1aWxkZXJCZW5jaG1hcmsuamF2YQpAQCAtMCwwICsxLDc0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE3LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmJlbmNobWFyazsKKworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudXJpLmludGVybmFsLkplcnNleVVyaUJ1aWxkZXI7CisKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuQmVuY2htYXJrOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5CZW5jaG1hcmtNb2RlOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5Gb3JrOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5NZWFzdXJlbWVudDsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuTW9kZTsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuT3V0cHV0VGltZVVuaXQ7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLlBhcmFtOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5TY29wZTsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuU2V0dXA7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLlN0YXRlOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5XYXJtdXA7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLnJ1bm5lci5SdW5uZXI7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLnJ1bm5lci5vcHRpb25zLk9wdGlvbnM7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLnJ1bm5lci5vcHRpb25zLk9wdGlvbnNCdWlsZGVyOworCisvKioKKyAqIHtAbGluayBKZXJzZXlVcmlCdWlsZGVyfSBiZW5jaG1hcmsgZm9yIHBhcnNpbmcgdGVtcGxhdGVzLgorICoKKyAqIEBhdXRob3IgRGF2aWQgU2NobG9zbmFnbGUKKyAqLworQEJlbmNobWFya01vZGUoTW9kZS5UaHJvdWdocHV0KQorQE91dHB1dFRpbWVVbml0KFRpbWVVbml0LlNFQ09ORFMpCitAV2FybXVwKGl0ZXJhdGlvbnMgPSAxNiwgdGltZSA9IDI1MDAsIHRpbWVVbml0ID0gVGltZVVuaXQuTUlMTElTRUNPTkRTKQorQE1lYXN1cmVtZW50KGl0ZXJhdGlvbnMgPSAxNiwgdGltZSA9IDI1MDAsIHRpbWVVbml0ID0gVGltZVVuaXQuTUlMTElTRUNPTkRTKQorQEZvcmsoMSkKK0BTdGF0ZShTY29wZS5CZW5jaG1hcmspCitwdWJsaWMgY2xhc3MgSmVyc2V5VXJpQnVpbGRlckJlbmNobWFyayB7CisKKyAgICBAUGFyYW0odmFsdWUgPSB7Imh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC9hL2IvYyIsICJodHRwczovL2xvY2FsaG9zdDo0NDMve2F9L3tifS97YzouK30ifSkKKyAgICBwcml2YXRlIFN0cmluZyB1cmlUZW1wbGF0ZTsKKworICAgIHByaXZhdGUgdm9sYXRpbGUgSmVyc2V5VXJpQnVpbGRlciB1cmlCdWlsZGVyOworCisgICAgQFNldHVwCisgICAgcHVibGljIHZvaWQgc3RhcnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdXJpQnVpbGRlciA9IG5ldyBKZXJzZXlVcmlCdWlsZGVyKCk7CisgICAgfQorCisgICAgQEJlbmNobWFyaworICAgIHB1YmxpYyBKZXJzZXlVcmlCdWlsZGVyIHVyaSgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXR1cm4gdXJpQnVpbGRlci51cmkodXJpVGVtcGxhdGUpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKGZpbmFsIFN0cmluZ1tdIGFyZ3MpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBmaW5hbCBPcHRpb25zIG9wdCA9IG5ldyBPcHRpb25zQnVpbGRlcigpCisgICAgICAgICAgICAgICAgLy8gUmVnaXN0ZXIgb3VyIGJlbmNobWFya3MuCisgICAgICAgICAgICAgICAgLmluY2x1ZGUoSmVyc2V5VXJpQnVpbGRlckJlbmNobWFyay5jbGFzcy5nZXRTaW1wbGVOYW1lKCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisKKyAgICAgICAgbmV3IFJ1bm5lcihvcHQpLnJ1bigpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFya3Mvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmsvTG9jYXRvckJlbmNobWFyay5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrcy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFyay9Mb2NhdG9yQmVuY2htYXJrLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRjOWRhOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFya3Mvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmsvTG9jYXRvckJlbmNobWFyay5qYXZhCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuYmVuY2htYXJrOworCitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRnV0dXJlOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVxdWVzdDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQ29udGFpbmVyUmVzcG9uc2U7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC51dGlsLnNlcnZlci5Db250YWluZXJSZXF1ZXN0QnVpbGRlcjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5iZW5jaG1hcmsuc2VydmVyLkxvY2F0b3JBcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5CZW5jaG1hcms7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLkJlbmNobWFya01vZGU7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLkZvcms7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLkxldmVsOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5NZWFzdXJlbWVudDsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuTW9kZTsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuT3V0cHV0VGltZVVuaXQ7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLlBhcmFtOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5TY29wZTsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuU2V0dXA7CitpbXBvcnQgb3JnLm9wZW5qZGsuam1oLmFubm90YXRpb25zLlN0YXRlOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5hbm5vdGF0aW9ucy5UZWFyRG93bjsKK2ltcG9ydCBvcmcub3Blbmpkay5qbWguYW5ub3RhdGlvbnMuV2FybXVwOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5ydW5uZXIuUnVubmVyOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5ydW5uZXIub3B0aW9ucy5PcHRpb25zOworaW1wb3J0IG9yZy5vcGVuamRrLmptaC5ydW5uZXIub3B0aW9ucy5PcHRpb25zQnVpbGRlcjsKKworLyoqCisgKiBMb2NhdG9yIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyfSBiZW5jaG1hcmsuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BCZW5jaG1hcmtNb2RlKE1vZGUuVGhyb3VnaHB1dCkKK0BPdXRwdXRUaW1lVW5pdChUaW1lVW5pdC5TRUNPTkRTKQorQFdhcm11cChpdGVyYXRpb25zID0gMTYsIHRpbWUgPSAyNTAwLCB0aW1lVW5pdCA9IFRpbWVVbml0Lk1JTExJU0VDT05EUykKK0BNZWFzdXJlbWVudChpdGVyYXRpb25zID0gMTYsIHRpbWUgPSAyNTAwLCB0aW1lVW5pdCA9IFRpbWVVbml0Lk1JTExJU0VDT05EUykKK0BGb3JrKDEpCitAU3RhdGUoU2NvcGUuQmVuY2htYXJrKQorcHVibGljIGNsYXNzIExvY2F0b3JCZW5jaG1hcmsgeworCisgICAgQFBhcmFtKHZhbHVlID0geyJoZWxsb3dvcmxkIiwgImhlbGxvd29ybGQvbG9jYXRvciJ9KQorICAgIHByaXZhdGUgU3RyaW5nIHBhdGg7CisKKyAgICBAUGFyYW0odmFsdWUgPSB7IkdFVCIsICJQT1NUIiwgIlBVVCJ9KQorICAgIHByaXZhdGUgU3RyaW5nIG1ldGhvZDsKKworICAgIHByaXZhdGUgdm9sYXRpbGUgQXBwbGljYXRpb25IYW5kbGVyIGhhbmRsZXI7CisgICAgcHJpdmF0ZSB2b2xhdGlsZSBDb250YWluZXJSZXF1ZXN0IHJlcXVlc3Q7CisKKyAgICBAU2V0dXAKKyAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBoYW5kbGVyID0gbmV3IEFwcGxpY2F0aW9uSGFuZGxlcihuZXcgTG9jYXRvckFwcGxpY2F0aW9uKCkpOworICAgIH0KKworICAgIEBTZXR1cChMZXZlbC5JdGVyYXRpb24pCisgICAgcHVibGljIHZvaWQgcmVxdWVzdCgpIHsKKyAgICAgICAgcmVxdWVzdCA9IENvbnRhaW5lclJlcXVlc3RCdWlsZGVyCisgICAgICAgICAgICAgICAgLmZyb20ocGF0aCwgbWV0aG9kKQorICAgICAgICAgICAgICAgIC5lbnRpdHkoIkdFVCIuZXF1YWxzKG1ldGhvZCkgPyBudWxsIDogIkhlbGxvIFdvcmxkISIsIGhhbmRsZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgfQorCisgICAgQFRlYXJEb3duCisgICAgcHVibGljIHZvaWQgc2h1dGRvd24oKSB7CisgICAgfQorCisgICAgQEJlbmNobWFyaworICAgIHB1YmxpYyBGdXR1cmU8Q29udGFpbmVyUmVzcG9uc2U+IG1lYXN1cmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGhhbmRsZXIuYXBwbHkocmVxdWVzdCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oZmluYWwgU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIGZpbmFsIE9wdGlvbnMgb3B0ID0gbmV3IE9wdGlvbnNCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAvLyBSZWdpc3RlciBvdXIgYmVuY2htYXJrcy4KKyAgICAgICAgICAgICAgICAuaW5jbHVkZShMb2NhdG9yQmVuY2htYXJrLmNsYXNzLmdldFNpbXBsZU5hbWUoKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKworICAgICAgICBuZXcgUnVubmVyKG9wdCkucnVuKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrcy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFyay9lbnRpdHkvanNvbi9KYWNrc29uQXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFya3Mvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmsvZW50aXR5L2pzb24vSmFja3NvbkFwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJjZTAwMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFya3Mvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmsvZW50aXR5L2pzb24vSmFja3NvbkFwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5iZW5jaG1hcmsuZW50aXR5Lmpzb247CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5qYWNrc29uLkphY2tzb25GZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lc3NhZ2UuZmlsdGVyaW5nLkVudGl0eUZpbHRlcmluZ0ZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgSmFja3NvbkFwcGxpY2F0aW9uIGV4dGVuZHMgUmVzb3VyY2VDb25maWcgeworCisgICAgcHVibGljIEphY2tzb25BcHBsaWNhdGlvbihmaW5hbCBib29sZWFuIGVudGl0eUZpbHRlcmluZ0VuYWJsZWQpIHsKKyAgICAgICAgcmVnaXN0ZXIoUHJvamVjdHNSZXNvdXJjZS5jbGFzcyk7CisKKyAgICAgICAgaWYgKGVudGl0eUZpbHRlcmluZ0VuYWJsZWQpIHsKKyAgICAgICAgICAgIHJlZ2lzdGVyKEVudGl0eUZpbHRlcmluZ0ZlYXR1cmUuY2xhc3MpOworICAgICAgICB9CisgICAgICAgIHJlZ2lzdGVyKEphY2tzb25GZWF0dXJlLmNsYXNzKTsKKworICAgICAgICAvLyBUdXJuIG9mZiBNb25pdG9yaW5nIHRvIG5vdCBhZmZlY3QgYmVuY2htYXJrcy4KKyAgICAgICAgcHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5NT05JVE9SSU5HX0VOQUJMRUQsIGZhbHNlKTsKKyAgICAgICAgcHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5NT05JVE9SSU5HX1NUQVRJU1RJQ1NfRU5BQkxFRCwgZmFsc2UpOworICAgICAgICBwcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLk1PTklUT1JJTkdfU1RBVElTVElDU19NQkVBTlNfRU5BQkxFRCwgZmFsc2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFya3Mvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmsvZW50aXR5L2pzb24vUHJvamVjdC5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrcy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFyay9lbnRpdHkvanNvbi9Qcm9qZWN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUzM2Q5YQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFya3Mvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmsvZW50aXR5L2pzb24vUHJvamVjdC5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuYmVuY2htYXJrLmVudGl0eS5qc29uOworCitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCisvKioKKyAqIFByb2plY3QgZW50aXR5IGNsYXNzLiBGaWVsZHMge0Bjb2RlIHRhc2tzfSBhbmQge0Bjb2RlIHVzZXJzfSBhcmUgYXZhaWxhYmxlIG9ubHkgaW4gZGV0YWlsZWQgdmlldyAoZGVmaW5lZCB2aWEKKyAqIHtAbGluayBQcm9qZWN0RGV0YWlsZWRWaWV3fSkuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKHsiSmF2YURvYyIsICJVbnVzZWREZWNsYXJhdGlvbiJ9KQorQFhtbFJvb3RFbGVtZW50CitwdWJsaWMgY2xhc3MgUHJvamVjdCB7CisKKyAgICBwcml2YXRlIExvbmcgaWQ7CisKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworCisgICAgcHJpdmF0ZSBTdHJpbmcgZGVzY3JpcHRpb247CisKKyAgICBAUHJvamVjdERldGFpbGVkVmlldworICAgIHByaXZhdGUgTGlzdDxUYXNrPiB0YXNrczsKKworICAgIEBQcm9qZWN0RGV0YWlsZWRWaWV3CisgICAgcHJpdmF0ZSBMaXN0PFVzZXI+IHVzZXJzOworCisgICAgcHVibGljIFByb2plY3QoKSB7CisgICAgfQorCisgICAgcHVibGljIFByb2plY3QoZmluYWwgTG9uZyBpZCwgZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbikgeworICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgTG9uZyBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIGlkOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldElkKGZpbmFsIExvbmcgaWQpIHsKKyAgICAgICAgdGhpcy5pZCA9IGlkOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKKyAgICAgICAgcmV0dXJuIG5hbWU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0TmFtZShmaW5hbCBTdHJpbmcgbmFtZSkgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKSB7CisgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbihmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKKyAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBMaXN0PFRhc2s+IGdldFRhc2tzKCkgeworICAgICAgICByZXR1cm4gdGFza3M7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0VGFza3MoZmluYWwgTGlzdDxUYXNrPiB0YXNrcykgeworICAgICAgICB0aGlzLnRhc2tzID0gdGFza3M7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8VXNlcj4gZ2V0VXNlcnMoKSB7CisgICAgICAgIHJldHVybiB1c2VyczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VycyhmaW5hbCBMaXN0PFVzZXI+IHVzZXJzKSB7CisgICAgICAgIHRoaXMudXNlcnMgPSB1c2VyczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmtzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrL2VudGl0eS9qc29uL1Byb2plY3REZXRhaWxlZFZpZXcuamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFya3Mvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmsvZW50aXR5L2pzb24vUHJvamVjdERldGFpbGVkVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MGVkZWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmtzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrL2VudGl0eS9qc29uL1Byb2plY3REZXRhaWxlZFZpZXcuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmJlbmNobWFyay5lbnRpdHkuanNvbjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQW5ub3RhdGlvbkxpdGVyYWw7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuRW50aXR5RmlsdGVyaW5nOworCisvKioKKyAqIEVudGl0eS1maWx0ZXJpbmcgYW5ub3RhdGlvbiB1c2VkIHRvIGRlZmluZSBkZXRhaWxlZCB2aWV3IG9uIHJldHVybmVkIHtAbGluayBQcm9qZWN0fSBlbnRpdGllcy4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFRhcmdldCh7RWxlbWVudFR5cGUuVFlQRSwgRWxlbWVudFR5cGUuTUVUSE9ELCBFbGVtZW50VHlwZS5GSUVMRH0pCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorQERvY3VtZW50ZWQKK0BFbnRpdHlGaWx0ZXJpbmcKK3B1YmxpYyBAaW50ZXJmYWNlIFByb2plY3REZXRhaWxlZFZpZXcgeworCisgICAgLyoqCisgICAgICogRmFjdG9yeSBjbGFzcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzIG9mIHtAY29kZSBQcm9qZWN0RGV0YWlsZWRWaWV3fSBhbm5vdGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeSBleHRlbmRzIEFubm90YXRpb25MaXRlcmFsPFByb2plY3REZXRhaWxlZFZpZXc+IGltcGxlbWVudHMgUHJvamVjdERldGFpbGVkVmlldyB7CisKKyAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBQcm9qZWN0RGV0YWlsZWRWaWV3IGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRmFjdG9yeSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrcy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFyay9lbnRpdHkvanNvbi9Qcm9qZWN0c1Jlc291cmNlLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmtzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrL2VudGl0eS9qc29uL1Byb2plY3RzUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTUwZjRiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrcy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFyay9lbnRpdHkvanNvbi9Qcm9qZWN0c1Jlc291cmNlLmphdmEKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5iZW5jaG1hcmsuZW50aXR5Lmpzb247CisKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CisKKy8qKgorICogUmVzb3VyY2UgY2xhc3MgZm9yIHtAbGluayBQcm9qZWN0IHByb2plY3RzfS4gUHJvdmlkZXMgbWV0aG9kcyB0byByZXRyaWV2ZSBwcm9qZWN0cyBpbiAiZGVmYXVsdCIgdmlldyAoe0BsaW5rICNnZXRQcm9qZWN0cygpfQorICogYW5kIGluICJkZXRhaWxlZCIgdmlldyAoe0BsaW5rICNnZXREZXRhaWxlZFByb2plY3RzKCl9LgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUGF0aCgicHJvamVjdHMiKQorQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9qc29uIikKK3B1YmxpYyBjbGFzcyBQcm9qZWN0c1Jlc291cmNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExpc3Q8UHJvamVjdD4gcHJvamVjdHM7CisKKyAgICBzdGF0aWMgeworICAgICAgICBmaW5hbCBQcm9qZWN0IHByb2plY3QgPSBuZXcgUHJvamVjdCgxTCwgImZvbyIsICJiYXIiKTsKKyAgICAgICAgZmluYWwgVXNlciB1c2VyID0gbmV3IFVzZXIoMUwsICJmb28iLCAiZm9vQGJhci5iYXoiKTsKKyAgICAgICAgZmluYWwgVGFzayB0YXNrID0gbmV3IFRhc2soMUwsICJmb28iLCAiYmFyIik7CisKKyAgICAgICAgcHJvamVjdC5zZXRVc2VycyhBcnJheXMuYXNMaXN0KHVzZXIpKTsKKyAgICAgICAgcHJvamVjdC5zZXRUYXNrcyhBcnJheXMuYXNMaXN0KHRhc2ssIHRhc2spKTsKKworICAgICAgICBwcm9qZWN0cyA9IEFycmF5cy5hc0xpc3QocHJvamVjdCwgcHJvamVjdCk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJiYXNpYyIpCisgICAgcHVibGljIExpc3Q8UHJvamVjdD4gZ2V0UHJvamVjdHMoKSB7CisgICAgICAgIHJldHVybiBnZXREZXRhaWxlZFByb2plY3RzKCk7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJkZXRhaWxlZCIpCisgICAgQFByb2plY3REZXRhaWxlZFZpZXcKKyAgICBwdWJsaWMgTGlzdDxQcm9qZWN0PiBnZXREZXRhaWxlZFByb2plY3RzKCkgeworICAgICAgICByZXR1cm4gcHJvamVjdHM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrcy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFyay9lbnRpdHkvanNvbi9UYXNrLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmtzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrL2VudGl0eS9qc29uL1Rhc2suamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWEyZjVjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrcy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFyay9lbnRpdHkvanNvbi9UYXNrLmphdmEKQEAgLTAsMCArMSw5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5iZW5jaG1hcmsuZW50aXR5Lmpzb247CisKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbFJvb3RFbGVtZW50OworCisvKioKKyAqIFRhc2sgZW50aXR5IGNsYXNzLiBGaWVsZHMge0Bjb2RlIHByb2plY3R9IGFuZCB7QGNvZGUgdXNlcn0gYXJlIGF2YWlsYWJsZSBvbmx5IGluIGRldGFpbGVkIHZpZXcgKGRlZmluZWQgdmlhCisgKiB7QGxpbmsgVGFza0RldGFpbGVkVmlld30pLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAU3VwcHJlc3NXYXJuaW5ncyh7IlVudXNlZERlY2xhcmF0aW9uIiwgIkphdmFEb2MifSkKK0BYbWxSb290RWxlbWVudAorcHVibGljIGNsYXNzIFRhc2sgeworCisgICAgcHJpdmF0ZSBMb25nIGlkOworCisgICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKKworICAgIHByaXZhdGUgU3RyaW5nIGRlc2NyaXB0aW9uOworCisgICAgQFRhc2tEZXRhaWxlZFZpZXcKKyAgICBwcml2YXRlIFByb2plY3QgcHJvamVjdDsKKworICAgIEBUYXNrRGV0YWlsZWRWaWV3CisgICAgcHJpdmF0ZSBVc2VyIHVzZXI7CisKKyAgICBwdWJsaWMgVGFzaygpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgVGFzayhmaW5hbCBMb25nIGlkLCBmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBMb25nIGdldElkKCkgeworICAgICAgICByZXR1cm4gaWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SWQoZmluYWwgTG9uZyBpZCkgeworICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldERlc2NyaXB0aW9uKGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbikgeworICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247CisgICAgfQorCisgICAgcHVibGljIFByb2plY3QgZ2V0UHJvamVjdCgpIHsKKyAgICAgICAgcmV0dXJuIHByb2plY3Q7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0UHJvamVjdChmaW5hbCBQcm9qZWN0IHByb2plY3QpIHsKKyAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKKyAgICB9CisKKyAgICBwdWJsaWMgVXNlciBnZXRVc2VyKCkgeworICAgICAgICByZXR1cm4gdXNlcjsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRVc2VyKGZpbmFsIFVzZXIgdXNlcikgeworICAgICAgICB0aGlzLnVzZXIgPSB1c2VyOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFya3Mvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmsvZW50aXR5L2pzb24vVGFza0RldGFpbGVkVmlldy5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrcy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFyay9lbnRpdHkvanNvbi9UYXNrRGV0YWlsZWRWaWV3LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNhZjAyMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFya3Mvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmsvZW50aXR5L2pzb24vVGFza0RldGFpbGVkVmlldy5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuYmVuY2htYXJrLmVudGl0eS5qc29uOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmluamVjdC5Bbm5vdGF0aW9uTGl0ZXJhbDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5tZXNzYWdlLmZpbHRlcmluZy5FbnRpdHlGaWx0ZXJpbmc7CisKKy8qKgorICogRW50aXR5LWZpbHRlcmluZyBhbm5vdGF0aW9uIHVzZWQgdG8gZGVmaW5lIGRldGFpbGVkIHZpZXcgb24gcmV0dXJuZWQge0BsaW5rIFRhc2t9IGVudGl0aWVzLgorICoKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAVGFyZ2V0KHtFbGVtZW50VHlwZS5UWVBFLCBFbGVtZW50VHlwZS5NRVRIT0QsIEVsZW1lbnRUeXBlLkZJRUxEfSkKK0BSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlJVTlRJTUUpCitARG9jdW1lbnRlZAorQEVudGl0eUZpbHRlcmluZworcHVibGljIEBpbnRlcmZhY2UgVGFza0RldGFpbGVkVmlldyB7CisKKyAgICAvKioKKyAgICAgKiBGYWN0b3J5IGNsYXNzIGZvciBjcmVhdGluZyBpbnN0YW5jZXMgb2Yge0Bjb2RlIFRhc2tEZXRhaWxlZFZpZXd9IGFubm90YXRpb24uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBGYWN0b3J5IGV4dGVuZHMgQW5ub3RhdGlvbkxpdGVyYWw8VGFza0RldGFpbGVkVmlldz4gaW1wbGVtZW50cyBUYXNrRGV0YWlsZWRWaWV3IHsKKworICAgICAgICBwcml2YXRlIEZhY3RvcnkoKSB7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgc3RhdGljIFRhc2tEZXRhaWxlZFZpZXcgZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBGYWN0b3J5KCk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmtzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrL2VudGl0eS9qc29uL1VzZXIuamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFya3Mvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmsvZW50aXR5L2pzb24vVXNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNTJiMjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmtzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrL2VudGl0eS9qc29uL1VzZXIuamF2YQpAQCAtMCwwICsxLDkzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmJlbmNobWFyay5lbnRpdHkuanNvbjsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworLyoqCisgKiBVc2VyIGVudGl0eSBjbGFzcy4gRmllbGRzIHtAY29kZSBwcm9qZWN0c30gYW5kIHtAY29kZSB0YXNrc30gYXJlIGF2YWlsYWJsZSBvbmx5IGluIGRldGFpbGVkIHZpZXcgKGRlZmluZWQgdmlhCisgKiB7QGxpbmsgVXNlckRldGFpbGVkVmlld30gb24gZ2V0dGVycykuCisgKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BTdXBwcmVzc1dhcm5pbmdzKHsiVW51c2VkRGVjbGFyYXRpb24iLCAiSmF2YURvYyJ9KQorQFhtbFJvb3RFbGVtZW50CitwdWJsaWMgY2xhc3MgVXNlciB7CisKKyAgICBwcml2YXRlIExvbmcgaWQ7CisKKyAgICBwcml2YXRlIFN0cmluZyBuYW1lOworCisgICAgcHJpdmF0ZSBTdHJpbmcgZW1haWw7CisKKyAgICBwcml2YXRlIExpc3Q8UHJvamVjdD4gcHJvamVjdHM7CisKKyAgICBwcml2YXRlIExpc3Q8VGFzaz4gdGFza3M7CisKKyAgICBwdWJsaWMgVXNlcigpIHsKKyAgICB9CisKKyAgICBwdWJsaWMgVXNlcihmaW5hbCBMb25nIGlkLCBmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIGVtYWlsKSB7CisgICAgICAgIHRoaXMuaWQgPSBpZDsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5lbWFpbCA9IGVtYWlsOworICAgIH0KKworICAgIHB1YmxpYyBMb25nIGdldElkKCkgeworICAgICAgICByZXR1cm4gaWQ7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0SWQoZmluYWwgTG9uZyBpZCkgeworICAgICAgICB0aGlzLmlkID0gaWQ7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeworICAgICAgICByZXR1cm4gbmFtZTsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXROYW1lKGZpbmFsIFN0cmluZyBuYW1lKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRFbWFpbCgpIHsKKyAgICAgICAgcmV0dXJuIGVtYWlsOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldEVtYWlsKGZpbmFsIFN0cmluZyBlbWFpbCkgeworICAgICAgICB0aGlzLmVtYWlsID0gZW1haWw7CisgICAgfQorCisgICAgQFVzZXJEZXRhaWxlZFZpZXcKKyAgICBwdWJsaWMgTGlzdDxQcm9qZWN0PiBnZXRQcm9qZWN0cygpIHsKKyAgICAgICAgcmV0dXJuIHByb2plY3RzOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFByb2plY3RzKGZpbmFsIExpc3Q8UHJvamVjdD4gcHJvamVjdHMpIHsKKyAgICAgICAgdGhpcy5wcm9qZWN0cyA9IHByb2plY3RzOworICAgIH0KKworICAgIEBVc2VyRGV0YWlsZWRWaWV3CisgICAgcHVibGljIExpc3Q8VGFzaz4gZ2V0VGFza3MoKSB7CisgICAgICAgIHJldHVybiB0YXNrczsKKyAgICB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXRUYXNrcyhmaW5hbCBMaXN0PFRhc2s+IHRhc2tzKSB7CisgICAgICAgIHRoaXMudGFza3MgPSB0YXNrczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmtzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrL2VudGl0eS9qc29uL1VzZXJEZXRhaWxlZFZpZXcuamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFya3Mvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmsvZW50aXR5L2pzb24vVXNlckRldGFpbGVkVmlldy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3M2ZlOGYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmtzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrL2VudGl0eS9qc29uL1VzZXJEZXRhaWxlZFZpZXcuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmJlbmNobWFyay5lbnRpdHkuanNvbjsKKworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOworaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5pbnRlcm5hbC5pbmplY3QuQW5ub3RhdGlvbkxpdGVyYWw7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubWVzc2FnZS5maWx0ZXJpbmcuRW50aXR5RmlsdGVyaW5nOworCisvKioKKyAqIEVudGl0eS1maWx0ZXJpbmcgYW5ub3RhdGlvbiB1c2VkIHRvIGRlZmluZSBkZXRhaWxlZCB2aWV3IG9uIHJldHVybmVkIHtAbGluayBVc2VyfSBlbnRpdGllcy4KKyAqCisgKiBAYXV0aG9yIE1pY2hhbCBHYWpkb3MKKyAqLworQFRhcmdldCh7RWxlbWVudFR5cGUuVFlQRSwgRWxlbWVudFR5cGUuTUVUSE9ELCBFbGVtZW50VHlwZS5GSUVMRH0pCitAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5SVU5USU1FKQorQERvY3VtZW50ZWQKK0BFbnRpdHlGaWx0ZXJpbmcKK3B1YmxpYyBAaW50ZXJmYWNlIFVzZXJEZXRhaWxlZFZpZXcgeworCisgICAgLyoqCisgICAgICogRmFjdG9yeSBjbGFzcyBmb3IgY3JlYXRpbmcgaW5zdGFuY2VzIG9mIHtAY29kZSBVc2VyRGV0YWlsZWRWaWV3fSBhbm5vdGF0aW9uLgorICAgICAqLworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmFjdG9yeSBleHRlbmRzIEFubm90YXRpb25MaXRlcmFsPFVzZXJEZXRhaWxlZFZpZXc+IGltcGxlbWVudHMgVXNlckRldGFpbGVkVmlldyB7CisKKyAgICAgICAgcHJpdmF0ZSBGYWN0b3J5KCkgeworICAgICAgICB9CisKKyAgICAgICAgcHVibGljIHN0YXRpYyBVc2VyRGV0YWlsZWRWaWV3IGdldCgpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgRmFjdG9yeSgpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrcy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFyay9zZXJ2ZXIvTG9jYXRvckFwcGxpY2F0aW9uLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmtzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrL3NlcnZlci9Mb2NhdG9yQXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTI0Y2I3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrcy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFyay9zZXJ2ZXIvTG9jYXRvckFwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5iZW5jaG1hcmsuc2VydmVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLlJlc291cmNlQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5TZXJ2ZXJQcm9wZXJ0aWVzOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgTG9jYXRvckFwcGxpY2F0aW9uIGV4dGVuZHMgUmVzb3VyY2VDb25maWcgeworCisgICAgcHVibGljIExvY2F0b3JBcHBsaWNhdGlvbigpIHsKKyAgICAgICAgcmVnaXN0ZXIoTG9jYXRvclJlc291cmNlLmNsYXNzKTsKKworICAgICAgICAvLyBUdXJuIG9mZiBNb25pdG9yaW5nIHRvIG5vdCBhZmZlY3QgYmVuY2htYXJrcy4KKyAgICAgICAgcHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5NT05JVE9SSU5HX0VOQUJMRUQsIGZhbHNlKTsKKyAgICAgICAgcHJvcGVydHkoU2VydmVyUHJvcGVydGllcy5NT05JVE9SSU5HX1NUQVRJU1RJQ1NfRU5BQkxFRCwgZmFsc2UpOworICAgICAgICBwcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLk1PTklUT1JJTkdfU1RBVElTVElDU19NQkVBTlNfRU5BQkxFRCwgZmFsc2UpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFya3Mvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmsvc2VydmVyL0xvY2F0b3JSZXNvdXJjZS5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrcy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFyay9zZXJ2ZXIvTG9jYXRvclJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQyMjhhOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFya3Mvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmsvc2VydmVyL0xvY2F0b3JSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuYmVuY2htYXJrLnNlcnZlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBVVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitAUGF0aCgicmVzb3VyY2UiKQorQFByb2R1Y2VzKCJ0ZXh0L3BsYWluIikKK3B1YmxpYyBjbGFzcyBMb2NhdG9yUmVzb3VyY2UgeworCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICByZXR1cm4gIkhlbGxvIFdvcmxkISI7CisgICAgfQorCisgICAgQFBPU1QKKyAgICBwdWJsaWMgU3RyaW5nIHBvc3QoZmluYWwgU3RyaW5nIGVudGl0eSkgeworICAgICAgICByZXR1cm4gZW50aXR5OworICAgIH0KKworICAgIEBQVVQKKyAgICBwdWJsaWMgdm9pZCBwdXQoZmluYWwgU3RyaW5nIGVudGl0eSkgeworICAgICAgICAvLyBOT09QCisgICAgfQorCisgICAgQFBhdGgoImxvY2F0b3IiKQorICAgIHB1YmxpYyBDbGFzczw/PiBsb2NhdG9yKCkgeworICAgICAgICByZXR1cm4gTG9jYXRvclJlc291cmNlLmNsYXNzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFya3Mvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmsvc2VydmVyL0phY2tzb25UZXN0LmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmtzL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrL3NlcnZlci9KYWNrc29uVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MTFkMzQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmtzL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrL3NlcnZlci9KYWNrc29uVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuYmVuY2htYXJrLnNlcnZlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuUmVzb3VyY2VDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuVGVzdFByb3BlcnRpZXM7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuYmVuY2htYXJrLmVudGl0eS5qc29uLkphY2tzb25BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBKYWNrc29uVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKworICAgICAgICByZXR1cm4gbmV3IEphY2tzb25BcHBsaWNhdGlvbihmYWxzZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UmVzb3VyY2VNZXRob2QoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicHJvamVjdHMvYmFzaWMiKS5yZXF1ZXN0KCkuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdCgiV3JvbmcgSFRUUCByZXNwb25zZSBjb2RlIHJldHVybmVkLiIsIHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcygyMDApKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJSZXNvdXJjZU1ldGhvZCgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJwcm9qZWN0cy9kZXRhaWxlZCIpLnJlcXVlc3QoKS5nZXQoKTsKKworICAgICAgICBhc3NlcnRUaGF0KCJXcm9uZyBIVFRQIHJlc3BvbnNlIGNvZGUgcmV0dXJuZWQuIiwgcmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwMCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL2JlbmNobWFya3Mvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmsvc2VydmVyL0xvY2F0b3JUZXN0LmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmtzL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrL3NlcnZlci9Mb2NhdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNzAxNTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS9iZW5jaG1hcmtzL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvYmVuY2htYXJrL3NlcnZlci9Mb2NhdG9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuYmVuY2htYXJrLnNlcnZlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5UZXN0UHJvcGVydGllczsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuaGFtY3Jlc3QuQ29yZU1hdGNoZXJzLmlzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRoYXQ7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK3B1YmxpYyBjbGFzcyBMb2NhdG9yVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIFJlc291cmNlQ29uZmlnIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgZW5hYmxlKFRlc3RQcm9wZXJ0aWVzLkxPR19UUkFGRklDKTsKKworICAgICAgICByZXR1cm4gbmV3IExvY2F0b3JBcHBsaWNhdGlvbigpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFJlc291cmNlTWV0aG9kKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIikucmVxdWVzdCgidGV4dC9wbGFpbiIpLmdldCgpOworCisgICAgICAgIGFzc2VydFRoYXQoIldyb25nIEhUVFAgcmVzcG9uc2UgY29kZSByZXR1cm5lZC4iLCByZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQoIlVuZXhwZWN0ZWQgcmVzcG9uc2UgZW50aXR5LiIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoIkhlbGxvIFdvcmxkISIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RTdWJSZXNvdXJjZU1ldGhvZCgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZSIpLnBhdGgoImxvY2F0b3IiKS5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikuZ2V0KCk7CisKKyAgICAgICAgYXNzZXJ0VGhhdCgiV3JvbmcgSFRUUCByZXNwb25zZSBjb2RlIHJldHVybmVkLiIsIHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcygyMDApKTsKKyAgICAgICAgYXNzZXJ0VGhhdCgiVW5leHBlY3RlZCByZXNwb25zZSBlbnRpdHkuIiwgcmVzcG9uc2UucmVhZEVudGl0eShTdHJpbmcuY2xhc3MpLCBpcygiSGVsbG8gV29ybGQhIikpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc3QoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkudGV4dCgiSGVsbG8gV29ybGQhIikpOworCisgICAgICAgIGFzc2VydFRoYXQoIldyb25nIEhUVFAgcmVzcG9uc2UgY29kZSByZXR1cm5lZC4iLCByZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQoIlVuZXhwZWN0ZWQgcmVzcG9uc2UgZW50aXR5LiIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoIkhlbGxvIFdvcmxkISIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0TG9jYXRvcigpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJyZXNvdXJjZSIpLnBhdGgoImxvY2F0b3IiKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikKKyAgICAgICAgICAgICAgICAucG9zdChFbnRpdHkudGV4dCgiSGVsbG8gV29ybGQhIikpOworCisgICAgICAgIGFzc2VydFRoYXQoIldyb25nIEhUVFAgcmVzcG9uc2UgY29kZSByZXR1cm5lZC4iLCByZXNwb25zZS5nZXRTdGF0dXMoKSwgaXMoMjAwKSk7CisgICAgICAgIGFzc2VydFRoYXQoIlVuZXhwZWN0ZWQgcmVzcG9uc2UgZW50aXR5LiIsIHJlc3BvbnNlLnJlYWRFbnRpdHkoU3RyaW5nLmNsYXNzKSwgaXMoIkhlbGxvIFdvcmxkISIpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQdXQoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgicmVzb3VyY2UiKQorICAgICAgICAgICAgICAgIC5yZXF1ZXN0KCJ0ZXh0L3BsYWluIikKKyAgICAgICAgICAgICAgICAucHV0KEVudGl0eS50ZXh0KCJIZWxsbyBXb3JsZCEiKSk7CisKKyAgICAgICAgYXNzZXJ0VGhhdCgiV3JvbmcgSFRUUCByZXNwb25zZSBjb2RlIHJldHVybmVkLiIsIHJlc3BvbnNlLmdldFN0YXR1cygpLCBpcygyMDQpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQdXRMb2NhdG9yKCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSByZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInJlc291cmNlIikucGF0aCgibG9jYXRvciIpCisgICAgICAgICAgICAgICAgLnJlcXVlc3QoInRleHQvcGxhaW4iKQorICAgICAgICAgICAgICAgIC5wdXQoRW50aXR5LnRleHQoIkhlbGxvIFdvcmxkISIpKTsKKworICAgICAgICBhc3NlcnRUaGF0KCJXcm9uZyBIVFRQIHJlc3BvbnNlIGNvZGUgcmV0dXJuZWQuIiwgcmVzcG9uc2UuZ2V0U3RhdHVzKCksIGlzKDIwNCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL2V0Yy9jbGllbnQvanNvbi1wb3N0Lmx1YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL2V0Yy9jbGllbnQvanNvbi1wb3N0Lmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGI1MDRjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvZXRjL2NsaWVudC9qc29uLXBvc3QubHVhCkBAIC0wLDAgKzEsMjEgQEAKKy0tW1sKKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tXV0KK3dyay5tZXRob2QgPSAiUE9TVCIKK2lvLmlucHV0KCJqc29uLmRhdCIpCit3cmsuYm9keSA9IGlvLnJlYWQoIiphbGwiKQord3JrLmhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdID0gImFwcGxpY2F0aW9uL2pzb24iCmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS9ldGMvY2xpZW50L2pzb24tcHV0Lmx1YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL2V0Yy9jbGllbnQvanNvbi1wdXQubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMmQ2ODYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS9ldGMvY2xpZW50L2pzb24tcHV0Lmx1YQpAQCAtMCwwICsxLDIxIEBACistLVtbCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLV1dCit3cmsubWV0aG9kID0gIlBVVCIKK2lvLmlucHV0KCJqc29uLmRhdCIpCit3cmsuYm9keSA9IGlvLnJlYWQoIiphbGwiKQord3JrLmhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdID0gImFwcGxpY2F0aW9uL2pzb24iCmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS9ldGMvY2xpZW50L2pzb24uZGF0IGIvdGVzdHMvcGVyZm9ybWFuY2UvZXRjL2NsaWVudC9qc29uLmRhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjFjOTMwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvZXRjL2NsaWVudC9qc29uLmRhdApAQCAtMCwwICsxIEBACit7Im5hbWUiOiJXb2xmZ2FuZyIsImFnZSI6MjEsImFkZHJlc3MiOiJTYWx6YnVyZyJ9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS9ldGMvY2xpZW50L2tyeW8tcG9zdC5sdWEgYi90ZXN0cy9wZXJmb3JtYW5jZS9ldGMvY2xpZW50L2tyeW8tcG9zdC5sdWEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdjNGZhMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL2V0Yy9jbGllbnQva3J5by1wb3N0Lmx1YQpAQCAtMCwwICsxLDIxIEBACistLVtbCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLV1dCit3cmsubWV0aG9kID0gIlBPU1QiCitpby5pbnB1dCgia3J5by5kYXQiKQord3JrLmJvZHkgPSBpby5yZWFkKCIqYWxsIikKK3dyay5oZWFkZXJzWyJDb250ZW50LVR5cGUiXSA9ICJhcHBsaWNhdGlvbi94LWtyeW8iCmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS9ldGMvY2xpZW50L2tyeW8tcHV0Lmx1YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL2V0Yy9jbGllbnQva3J5by1wdXQubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZDk2ZmEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS9ldGMvY2xpZW50L2tyeW8tcHV0Lmx1YQpAQCAtMCwwICsxLDIxIEBACistLVtbCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLV1dCit3cmsubWV0aG9kID0gIlBVVCIKK2lvLmlucHV0KCJrcnlvLmRhdCIpCit3cmsuYm9keSA9IGlvLnJlYWQoIiphbGwiKQord3JrLmhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdID0gImFwcGxpY2F0aW9uL3gta3J5byIKZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL2V0Yy9jbGllbnQva3J5by5kYXQgYi90ZXN0cy9wZXJmb3JtYW5jZS9ldGMvY2xpZW50L2tyeW8uZGF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNDViYzMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS9ldGMvY2xpZW50L2tyeW8uZGF0CkBAIC0wLDAgKzEgQEAKKwEBUGFyafMYAUp1bGXzClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvZXRjL2NsaWVudC9wZXJzb24tcG9zdC5sdWEgYi90ZXN0cy9wZXJmb3JtYW5jZS9ldGMvY2xpZW50L3BlcnNvbi1wb3N0Lmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjU2NjM1Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvZXRjL2NsaWVudC9wZXJzb24tcG9zdC5sdWEKQEAgLTAsMCArMSwyMSBAQAorLS1bWworCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS1dXQord3JrLm1ldGhvZCA9ICJQT1NUIgoraW8uaW5wdXQoInBlcnNvbi5kYXQiKQord3JrLmJvZHkgPSBpby5yZWFkKCIqYWxsIikKK3dyay5oZWFkZXJzWyJDb250ZW50LVR5cGUiXSA9ICJhcHBsaWNhdGlvbi9wZXJzb24iCmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS9ldGMvY2xpZW50L3BlcnNvbi1wdXQubHVhIGIvdGVzdHMvcGVyZm9ybWFuY2UvZXRjL2NsaWVudC9wZXJzb24tcHV0Lmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YmZjNGJiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvZXRjL2NsaWVudC9wZXJzb24tcHV0Lmx1YQpAQCAtMCwwICsxLDIxIEBACistLVtbCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLV1dCit3cmsubWV0aG9kID0gIlBVVCIKK2lvLmlucHV0KCJwZXJzb24uZGF0IikKK3dyay5ib2R5ID0gaW8ucmVhZCgiKmFsbCIpCit3cmsuaGVhZGVyc1siQ29udGVudC1UeXBlIl0gPSAiYXBwbGljYXRpb24vcGVyc29uIgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvZXRjL2NsaWVudC9wZXJzb24uZGF0IGIvdGVzdHMvcGVyZm9ybWFuY2UvZXRjL2NsaWVudC9wZXJzb24uZGF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMDk1NWIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS9ldGMvY2xpZW50L3BlcnNvbi5kYXQKQEAgLTAsMCArMSw0IEBACituYW1lOiBNb3phcnQKK2FnZTogMjEKK2FkZHJlc3M6IFNhbHpidXJnCisKZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL2V0Yy9jbGllbnQvdGV4dC1wb3N0Lmx1YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL2V0Yy9jbGllbnQvdGV4dC1wb3N0Lmx1YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGI2ZmE5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvZXRjL2NsaWVudC90ZXh0LXBvc3QubHVhCkBAIC0wLDAgKzEsMjEgQEAKKy0tW1sKKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tXV0KK3dyay5tZXRob2QgPSAiUE9TVCIKK2lvLmlucHV0KCJ0ZXh0LmRhdCIpCit3cmsuYm9keSA9IGlvLnJlYWQoIiphbGwiKQord3JrLmhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdID0gInRleHQvcGxhaW4iCmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS9ldGMvY2xpZW50L3RleHQtcHV0Lmx1YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL2V0Yy9jbGllbnQvdGV4dC1wdXQubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmOTEwMDEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS9ldGMvY2xpZW50L3RleHQtcHV0Lmx1YQpAQCAtMCwwICsxLDIxIEBACistLVtbCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLV1dCit3cmsubWV0aG9kID0gIlBVVCIKK2lvLmlucHV0KCJ0ZXh0LmRhdCIpCit3cmsuYm9keSA9IGlvLnJlYWQoIiphbGwiKQord3JrLmhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdID0gInRleHQvcGxhaW4iCmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS9ldGMvY2xpZW50L3RleHQuZGF0IGIvdGVzdHMvcGVyZm9ybWFuY2UvZXRjL2NsaWVudC90ZXh0LmRhdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzQzY2FjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvZXRjL2NsaWVudC90ZXh0LmRhdApAQCAtMCwwICsxIEBACitQcmFndWUgKCAvy4hwcsmRy5DJoS87IEN6ZWNoOiBQcmFoYSBwcm9ub3VuY2VkIFvLiHByYcmmYV0gKCBsaXN0ZW4pKSBpcyB0aGUgY2FwaXRhbCBhbmQgbGFyZ2VzdCBjaXR5IG9mIHRoZSBDemVjaCBSZXB1YmxpYy4gSXQgaXMgdGhlIGZvdXJ0ZWVudGgtbGFyZ2VzdCBjaXR5IGluIHRoZSBFdXJvcGVhbiBVbmlvbi5bNV0gSXQgaXMgYWxzbyB0aGUgaGlzdG9yaWNhbCBjYXBpdGFsIG9mIEJvaGVtaWEgcHJvcGVyLiBTaXR1YXRlZCBpbiB0aGUgbm9ydGgtd2VzdCBvZiB0aGUgY291bnRyeSBvbiB0aGUgVmx0YXZhIHJpdmVyLCB0aGUgY2l0eSBpcyBob21lIHRvIGFib3V0IDEuMyBtaWxsaW9uIHBlb3BsZSwgd2hpbGUgaXRzIGxhcmdlciB1cmJhbiB6b25lIGlzIGVzdGltYXRlZCB0byBoYXZlIGEgcG9wdWxhdGlvbiBvZiBuZWFybHkgMiBtaWxsaW9uLlszXSBUaGUgY2l0eSBoYXMgYSB0ZW1wZXJhdGUgb2NlYW5pYyBjbGltYXRlLCB3aXRoIHdhcm0gc3VtbWVycyBhbmQgY2hpbGx5IHdpbnRlcnMuCmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS9ldGMvY2xpZW50L3htbC1wb3N0Lmx1YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL2V0Yy9jbGllbnQveG1sLXBvc3QubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNjVlZTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS9ldGMvY2xpZW50L3htbC1wb3N0Lmx1YQpAQCAtMCwwICsxLDIxIEBACistLVtbCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLV1dCit3cmsubWV0aG9kID0gIlBPU1QiCitpby5pbnB1dCgieG1sLmRhdCIpCit3cmsuYm9keSA9IGlvLnJlYWQoIiphbGwiKQord3JrLmhlYWRlcnNbIkNvbnRlbnQtVHlwZSJdID0gImFwcGxpY2F0aW9uL3htbCIKZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL2V0Yy9jbGllbnQveG1sLXB1dC5sdWEgYi90ZXN0cy9wZXJmb3JtYW5jZS9ldGMvY2xpZW50L3htbC1wdXQubHVhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhYTExYzkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS9ldGMvY2xpZW50L3htbC1wdXQubHVhCkBAIC0wLDAgKzEsMjEgQEAKKy0tW1sKKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tXV0KK3dyay5tZXRob2QgPSAiUFVUIgoraW8uaW5wdXQoInhtbC5kYXQiKQord3JrLmJvZHkgPSBpby5yZWFkKCIqYWxsIikKK3dyay5oZWFkZXJzWyJDb250ZW50LVR5cGUiXSA9ICJhcHBsaWNhdGlvbi94bWwiCmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS9ldGMvY2xpZW50L3htbC5kYXQgYi90ZXN0cy9wZXJmb3JtYW5jZS9ldGMvY2xpZW50L3htbC5kYXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI2MjRhMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL2V0Yy9jbGllbnQveG1sLmRhdApAQCAtMCwwICsxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+PHBlcnNvbj48bmFtZT5Xb2xmZ2FuZzwvbmFtZT48YWdlPjIxPC9hZ2U+PGFkZHJlc3M+U2FsemJ1cmc8L2FkZHJlc3M+PC9wZXJzb24+CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS9ldGMvZGF0YS9NRUFTVVJFTUVOVF9EQVRBIGIvdGVzdHMvcGVyZm9ybWFuY2UvZXRjL2RhdGEvTUVBU1VSRU1FTlRfREFUQQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzI4NjM4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvZXRjL2RhdGEvTUVBU1VSRU1FTlRfREFUQQpAQCAtMCwwICsxLDc5IEBACisjCisjIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorIworIyBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisjIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyMgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisjIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyMKKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisjCisKKyMKKyMgRmlsZSBmb3JtYXQ6CisjIGFwcGxpY2F0aW9uIGRpcmVjdG9yeSBuYW1lfGNvbW1hbmQgbGluZSB0byBnZW5lcmF0ZSBsb2FkIG9uIGNsaWVudCBtYWNoaW5lc3xKTVggVVJJIGZvciB0aGUgYXBwbGljYXRpb258TUJlYW4gbmFtZXxvdXRwdXQgZmlsZW5hbWUKKyMKKworbWJ3LXRleHQtcGxhaW58d3JrIC1jNjQgLXQxNiAtZDgwMHMgIGh0dHA6Ly9TRVJWRVJfTUFDSElORTpTRVJWRVJfUE9SVC9BUFBfQ09OVEVYVC98b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UubWJ3LnRleHQuSmF4UnNBcHBsaWNhdGlvbnx8bWV0cmljczpuYW1lPW9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXIuaGFuZGxlfG1idy10ZXh0LWdldC5wcm9wZXJ0aWVzCittYnctdGV4dC1wbGFpbnx3cmsgLWM2NCAtdDE2IC1kODAwcyAtcyB0ZXh0LXB1dC5sdWEgaHR0cDovL1NFUlZFUl9NQUNISU5FOlNFUlZFUl9QT1JUL0FQUF9DT05URVhUL3xvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5tYncudGV4dC5KYXhSc0FwcGxpY2F0aW9ufHxtZXRyaWNzOm5hbWU9b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlci5oYW5kbGV8bWJ3LXRleHQtcHV0LnByb3BlcnRpZXMKK21idy10ZXh0LXBsYWlufHdyayAtYzY0IC10MTYgLWQ4MDBzIC1zIHRleHQtcG9zdC5sdWEgaHR0cDovL1NFUlZFUl9NQUNISU5FOlNFUlZFUl9QT1JUL0FQUF9DT05URVhUL3xvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5tYncudGV4dC5KYXhSc0FwcGxpY2F0aW9ufHxtZXRyaWNzOm5hbWU9b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlci5oYW5kbGV8bWJ3LXRleHQtcG9zdC5wcm9wZXJ0aWVzCisKK21idy1qc29uLW1veHl8d3JrIC1jNjQgLXQxNiAtZDgwMHMgIGh0dHA6Ly9TRVJWRVJfTUFDSElORTpTRVJWRVJfUE9SVC9BUFBfQ09OVEVYVC98b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UubWJ3Lmpzb24uSmF4UnNBcHBsaWNhdGlvbnx8bWV0cmljczpuYW1lPW9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXIuaGFuZGxlfG1idy1qc29uLW1veHktZ2V0LnByb3BlcnRpZXMKK21idy1qc29uLW1veHl8d3JrIC1jNjQgLXQxNiAtZDgwMHMgLXMganNvbi1wdXQubHVhIGh0dHA6Ly9TRVJWRVJfTUFDSElORTpTRVJWRVJfUE9SVC9BUFBfQ09OVEVYVC98b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UubWJ3Lmpzb24uSmF4UnNBcHBsaWNhdGlvbnx8bWV0cmljczpuYW1lPW9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXIuaGFuZGxlfG1idy1qc29uLW1veHktcHV0LnByb3BlcnRpZXMKK21idy1qc29uLW1veHl8d3JrIC1jNjQgLXQxNiAtZDgwMHMgLXMganNvbi1wb3N0Lmx1YSBodHRwOi8vU0VSVkVSX01BQ0hJTkU6U0VSVkVSX1BPUlQvQVBQX0NPTlRFWFQvfG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLm1idy5qc29uLkpheFJzQXBwbGljYXRpb258fG1ldHJpY3M6bmFtZT1vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyLmhhbmRsZXxtYnctanNvbi1tb3h5LXBvc3QucHJvcGVydGllcworCittYnctanNvbi1qYWNrc29ufHdyayAtYzY0IC10MTYgLWQ4MDBzICBodHRwOi8vU0VSVkVSX01BQ0hJTkU6U0VSVkVSX1BPUlQvQVBQX0NPTlRFWFQvfG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLm1idy5qc29uLkpheFJzQXBwbGljYXRpb258fG1ldHJpY3M6bmFtZT1vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyLmhhbmRsZXxtYnctanNvbi1qYWNrc29uLWdldC5wcm9wZXJ0aWVzCittYnctanNvbi1qYWNrc29ufHdyayAtYzY0IC10MTYgLWQ4MDBzIC1zIGpzb24tcHV0Lmx1YSBodHRwOi8vU0VSVkVSX01BQ0hJTkU6U0VSVkVSX1BPUlQvQVBQX0NPTlRFWFQvfG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLm1idy5qc29uLkpheFJzQXBwbGljYXRpb258fG1ldHJpY3M6bmFtZT1vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyLmhhbmRsZXxtYnctanNvbi1qYWNrc29uLXB1dC5wcm9wZXJ0aWVzCittYnctanNvbi1qYWNrc29ufHdyayAtYzY0IC10MTYgLWQ4MDBzIC1zIGpzb24tcG9zdC5sdWEgaHR0cDovL1NFUlZFUl9NQUNISU5FOlNFUlZFUl9QT1JUL0FQUF9DT05URVhUL3xvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5tYncuanNvbi5KYXhSc0FwcGxpY2F0aW9ufHxtZXRyaWNzOm5hbWU9b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlci5oYW5kbGV8bWJ3LWpzb24tamFja3Nvbi1wb3N0LnByb3BlcnRpZXMKKworbWJ3LWtyeW98d3JrIC1jNjQgLXQxNiAtZDgwMHMgIGh0dHA6Ly9TRVJWRVJfTUFDSElORTpTRVJWRVJfUE9SVC9BUFBfQ09OVEVYVC98b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UubWJ3LmtyeW8uSmF4UnNBcHBsaWNhdGlvbnx8bWV0cmljczpuYW1lPW9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXIuaGFuZGxlfG1idy1rcnlvLWdldC5wcm9wZXJ0aWVzCittYncta3J5b3x3cmsgLWM2NCAtdDE2IC1kODAwcyAtcyBrcnlvLXB1dC5sdWEgaHR0cDovL1NFUlZFUl9NQUNISU5FOlNFUlZFUl9QT1JUL0FQUF9DT05URVhUL3xvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5tYncua3J5by5KYXhSc0FwcGxpY2F0aW9ufHxtZXRyaWNzOm5hbWU9b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlci5oYW5kbGV8bWJ3LWtyeW8tcHV0LnByb3BlcnRpZXMKK21idy1rcnlvfHdyayAtYzY0IC10MTYgLWQ4MDBzIC1zIGtyeW8tcG9zdC5sdWEgaHR0cDovL1NFUlZFUl9NQUNISU5FOlNFUlZFUl9QT1JUL0FQUF9DT05URVhUL3xvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5tYncua3J5by5KYXhSc0FwcGxpY2F0aW9ufHxtZXRyaWNzOm5hbWU9b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlci5oYW5kbGV8bWJ3LWtyeW8tcG9zdC5wcm9wZXJ0aWVzCisKK21idy14bWwtbW94eXx3cmsgLWM2NCAtdDE2IC1kODAwcyAgaHR0cDovL1NFUlZFUl9NQUNISU5FOlNFUlZFUl9QT1JUL0FQUF9DT05URVhUL3xvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5tYncueG1sLkpheFJzQXBwbGljYXRpb258fG1ldHJpY3M6bmFtZT1vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyLmhhbmRsZXxtYncteG1sLW1veHktZ2V0LnByb3BlcnRpZXMKK21idy14bWwtbW94eXx3cmsgLWM2NCAtdDE2IC1kODAwcyAtcyB4bWwtcG9zdC5sdWEgaHR0cDovL1NFUlZFUl9NQUNISU5FOlNFUlZFUl9QT1JUL0FQUF9DT05URVhUL3xvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5tYncueG1sLkpheFJzQXBwbGljYXRpb258fG1ldHJpY3M6bmFtZT1vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyLmhhbmRsZXxtYncteG1sLW1veHktcG9zdC5wcm9wZXJ0aWVzCittYncteG1sLW1veHl8d3JrIC1jNjQgLXQxNiAtZDgwMHMgLXMgeG1sLXB1dC5sdWEgaHR0cDovL1NFUlZFUl9NQUNISU5FOlNFUlZFUl9QT1JUL0FQUF9DT05URVhUL3xvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5tYncueG1sLkpheFJzQXBwbGljYXRpb258fG1ldHJpY3M6bmFtZT1vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyLmhhbmRsZXxtYncteG1sLW1veHktcHV0LnByb3BlcnRpZXMKKworbWJ3LXhtbC1qYXhifHdyayAtYzY0IC10MTYgLWQ4MDBzIGh0dHA6Ly9TRVJWRVJfTUFDSElORTpTRVJWRVJfUE9SVC9BUFBfQ09OVEVYVC98b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UubWJ3LnhtbC5KYXhSc0FwcGxpY2F0aW9ufHxtZXRyaWNzOm5hbWU9b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlci5oYW5kbGV8bWJ3LXhtbC1qYXhiLWdldC5wcm9wZXJ0aWVzCittYncteG1sLWpheGJ8d3JrIC1jNjQgLXQxNiAtZDgwMHMgLXMgeG1sLXBvc3QubHVhIGh0dHA6Ly9TRVJWRVJfTUFDSElORTpTRVJWRVJfUE9SVC9BUFBfQ09OVEVYVC98b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UubWJ3LnhtbC5KYXhSc0FwcGxpY2F0aW9ufHxtZXRyaWNzOm5hbWU9b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlci5oYW5kbGV8bWJ3LXhtbC1qYXhiLXBvc3QucHJvcGVydGllcworbWJ3LXhtbC1qYXhifHdyayAtYzY0IC10MTYgLWQ4MDBzIC1zIHhtbC1wdXQubHVhIGh0dHA6Ly9TRVJWRVJfTUFDSElORTpTRVJWRVJfUE9SVC9BUFBfQ09OVEVYVC98b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UubWJ3LnhtbC5KYXhSc0FwcGxpY2F0aW9ufHxtZXRyaWNzOm5hbWU9b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlci5oYW5kbGV8bWJ3LXhtbC1qYXhiLXB1dC5wcm9wZXJ0aWVzCisKK21idy1jdXN0b20tcHJvdmlkZXJ8d3JrIC1jNjQgLXQxNiAtZDgwMHMgLXMgcGVyc29uLXBvc3QubHVhIGh0dHA6Ly9TRVJWRVJfTUFDSElORTpTRVJWRVJfUE9SVC9BUFBfQ09OVEVYVC98b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UubWJ3LmN1c3RvbS5KYXhSc0FwcGxpY2F0aW9ufHxtZXRyaWNzOm5hbWU9b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlci5oYW5kbGV8bWJ3LWN1c3RvbS1wb3N0LnByb3BlcnRpZXMKK21idy1jdXN0b20tcHJvdmlkZXJ8d3JrIC1jNjQgLXQxNiAtZDgwMHMgLXMgcGVyc29uLXB1dC5sdWEgaHR0cDovL1NFUlZFUl9NQUNISU5FOlNFUlZFUl9QT1JUL0FQUF9DT05URVhUL3xvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5tYncuY3VzdG9tLkpheFJzQXBwbGljYXRpb258fG1ldHJpY3M6bmFtZT1vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyLmhhbmRsZXxtYnctY3VzdG9tLXB1dC5wcm9wZXJ0aWVzCittYnctY3VzdG9tLXByb3ZpZGVyfHdyayAtYzY0IC10MTYgLWQ4MDBzIGh0dHA6Ly9TRVJWRVJfTUFDSElORTpTRVJWRVJfUE9SVC9BUFBfQ09OVEVYVC98b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UubWJ3LmN1c3RvbS5KYXhSc0FwcGxpY2F0aW9ufHxtZXRyaWNzOm5hbWU9b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlci5oYW5kbGV8bWJ3LWN1c3RvbS1nZXQucHJvcGVydGllcworCitwYXJhbS1zcmx8d3JrIC1jNjQgLXQxNiAtZDgwMHMgaHR0cDovL1NFUlZFUl9NQUNISU5FOlNFUlZFUl9QT1JUL0FQUF9DT05URVhUL3NybC9qZWRuYUJlZG5hXDttPWJlZG5hXD9xPWplZG5hfG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLnBhcmFtLnNybC5KYXhSc0FwcGxpY2F0aW9ufHxtZXRyaWNzOm5hbWU9b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlci5oYW5kbGV8cGFyYW0tc3JsLWdldC5wcm9wZXJ0aWVzCitwYXJhbS1zcmx8d3JrIC1jNjQgLXQxNiAtZDgwMHMgaHR0cDovL1NFUlZFUl9NQUNISU5FOlNFUlZFUl9QT1JUL0FQUF9DT05URVhUL3NybS9qZWRuYUJlZG5hXDttPWJlZG5hXD9xPWplZG5hfG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLnBhcmFtLnNybC5KYXhSc0FwcGxpY2F0aW9ufHxtZXRyaWNzOm5hbWU9b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlci5oYW5kbGV8cGFyYW0tc3JtLWdldC5wcm9wZXJ0aWVzCisKK2ZpbHRlci1nbG9iYWx8d3JrIC1jNjQgLXQxNiAtZDgwMHMgaHR0cDovL1NFUlZFUl9NQUNISU5FOlNFUlZFUl9QT1JUL0FQUF9DT05URVhUL3xvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5maWx0ZXIuZ2xvYmFsLkpheFJzQXBwbGljYXRpb258fG1ldHJpY3M6bmFtZT1vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyLmhhbmRsZXxmaWx0ZXItZ2xvYmFsLWdldC5wcm9wZXJ0aWVzCitmaWx0ZXItZ2xvYmFsfHdyayAtYzY0IC10MTYgLWQ4MDBzIC1zIHRleHQtcHV0Lmx1YSBodHRwOi8vU0VSVkVSX01BQ0hJTkU6U0VSVkVSX1BPUlQvQVBQX0NPTlRFWFQvfG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmZpbHRlci5nbG9iYWwuSmF4UnNBcHBsaWNhdGlvbnx8bWV0cmljczpuYW1lPW9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXIuaGFuZGxlfGZpbHRlci1nbG9iYWwtcHV0LnByb3BlcnRpZXMKK2ZpbHRlci1nbG9iYWx8d3JrIC1jNjQgLXQxNiAtZDgwMHMgLXMgdGV4dC1wb3N0Lmx1YSBodHRwOi8vU0VSVkVSX01BQ0hJTkU6U0VSVkVSX1BPUlQvQVBQX0NPTlRFWFQvfG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmZpbHRlci5nbG9iYWwuSmF4UnNBcHBsaWNhdGlvbnx8bWV0cmljczpuYW1lPW9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXIuaGFuZGxlfGZpbHRlci1nbG9iYWwtcG9zdC5wcm9wZXJ0aWVzCisKK2ZpbHRlci1uYW1lfHdyayAtYzY0IC10MTYgLWQ4MDBzIC1zIHRleHQtcG9zdC5sdWEgaHR0cDovL1NFUlZFUl9NQUNISU5FOlNFUlZFUl9QT1JUL0FQUF9DT05URVhUL3xvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5maWx0ZXIubmFtZS5KYXhSc0FwcGxpY2F0aW9ufHxtZXRyaWNzOm5hbWU9b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlci5oYW5kbGV8ZmlsdGVyLW5hbWUtcG9zdC5wcm9wZXJ0aWVzCitmaWx0ZXItbmFtZXx3cmsgLWM2NCAtdDE2IC1kODAwcyAtcyB0ZXh0LXB1dC5sdWEgaHR0cDovL1NFUlZFUl9NQUNISU5FOlNFUlZFUl9QT1JUL0FQUF9DT05URVhUL3xvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5maWx0ZXIubmFtZS5KYXhSc0FwcGxpY2F0aW9ufHxtZXRyaWNzOm5hbWU9b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlci5oYW5kbGV8ZmlsdGVyLW5hbWUtcHV0LnByb3BlcnRpZXMKK2ZpbHRlci1uYW1lfHdyayAtYzY0IC10MTYgLWQ4MDBzIGh0dHA6Ly9TRVJWRVJfTUFDSElORTpTRVJWRVJfUE9SVC9BUFBfQ09OVEVYVC98b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuZmlsdGVyLm5hbWUuSmF4UnNBcHBsaWNhdGlvbnx8bWV0cmljczpuYW1lPW9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXIuaGFuZGxlfGZpbHRlci1uYW1lLWdldC5wcm9wZXJ0aWVzCisKK2ZpbHRlci1keW5hbWljfHdyayAtYzY0IC10MTYgLWQ4MDBzIC1zIHRleHQtcG9zdC5sdWEgaHR0cDovL1NFUlZFUl9NQUNISU5FOlNFUlZFUl9QT1JUL0FQUF9DT05URVhUL3xvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5maWx0ZXIuZHluYW1pYy5KYXhSc0FwcGxpY2F0aW9ufHxtZXRyaWNzOm5hbWU9b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlci5oYW5kbGV8ZmlsdGVyLWR5bmFtaWMtcG9zdC5wcm9wZXJ0aWVzCitmaWx0ZXItZHluYW1pY3x3cmsgLWM2NCAtdDE2IC1kODAwcyAtcyB0ZXh0LXB1dC5sdWEgaHR0cDovL1NFUlZFUl9NQUNISU5FOlNFUlZFUl9QT1JUL0FQUF9DT05URVhUL3xvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5maWx0ZXIuZHluYW1pYy5KYXhSc0FwcGxpY2F0aW9ufHxtZXRyaWNzOm5hbWU9b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlci5oYW5kbGV8ZmlsdGVyLWR5bmFtaWMtcHV0LnByb3BlcnRpZXMKK2ZpbHRlci1keW5hbWljfHdyayAtYzY0IC10MTYgLWQ4MDBzIGh0dHA6Ly9TRVJWRVJfTUFDSElORTpTRVJWRVJfUE9SVC9BUFBfQ09OVEVYVC98b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuZmlsdGVyLmR5bmFtaWMuSmF4UnNBcHBsaWNhdGlvbnx8bWV0cmljczpuYW1lPW9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXIuaGFuZGxlfGZpbHRlci1keW5hbWljLWdldC5wcm9wZXJ0aWVzCisKK2ludGVyY2VwdG9yLWdsb2JhbHx3cmsgLWM2NCAtdDE2IC1kODAwcyAtcyB0ZXh0LXBvc3QubHVhIGh0dHA6Ly9TRVJWRVJfTUFDSElORTpTRVJWRVJfUE9SVC9BUFBfQ09OVEVYVC98b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuaW50ZXJjZXB0b3IuZ2xvYmFsLkpheFJzQXBwbGljYXRpb258fG1ldHJpY3M6bmFtZT1vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyLmhhbmRsZXxpbnRlcmNlcHRvci1nbG9iYWwtcG9zdC5wcm9wZXJ0aWVzCitpbnRlcmNlcHRvci1nbG9iYWx8d3JrIC1jNjQgLXQxNiAtZDgwMHMgLXMgdGV4dC1wdXQubHVhIGh0dHA6Ly9TRVJWRVJfTUFDSElORTpTRVJWRVJfUE9SVC9BUFBfQ09OVEVYVC98b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuaW50ZXJjZXB0b3IuZ2xvYmFsLkpheFJzQXBwbGljYXRpb258fG1ldHJpY3M6bmFtZT1vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyLmhhbmRsZXxpbnRlcmNlcHRvci1nbG9iYWwtcHV0LnByb3BlcnRpZXMKK2ludGVyY2VwdG9yLWdsb2JhbHx3cmsgLWM2NCAtdDE2IC1kODAwcyBodHRwOi8vU0VSVkVSX01BQ0hJTkU6U0VSVkVSX1BPUlQvQVBQX0NPTlRFWFQvfG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmludGVyY2VwdG9yLmdsb2JhbC5KYXhSc0FwcGxpY2F0aW9ufHxtZXRyaWNzOm5hbWU9b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlci5oYW5kbGV8aW50ZXJjZXB0b3ItZ2xvYmFsLWdldC5wcm9wZXJ0aWVzCisKK2ludGVyY2VwdG9yLW5hbWV8d3JrIC1jNjQgLXQxNiAtZDgwMHMgLXMgdGV4dC1wb3N0Lmx1YSBodHRwOi8vU0VSVkVSX01BQ0hJTkU6U0VSVkVSX1BPUlQvQVBQX0NPTlRFWFQvfG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmludGVyY2VwdG9yLm5hbWUuSmF4UnNBcHBsaWNhdGlvbnx8bWV0cmljczpuYW1lPW9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXIuaGFuZGxlfGludGVyY2VwdG9yLW5hbWUtcG9zdC5wcm9wZXJ0aWVzCitpbnRlcmNlcHRvci1uYW1lfHdyayAtYzY0IC10MTYgLWQ4MDBzIC1zIHRleHQtcHV0Lmx1YSBodHRwOi8vU0VSVkVSX01BQ0hJTkU6U0VSVkVSX1BPUlQvQVBQX0NPTlRFWFQvfG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmludGVyY2VwdG9yLm5hbWUuSmF4UnNBcHBsaWNhdGlvbnx8bWV0cmljczpuYW1lPW9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXIuaGFuZGxlfGludGVyY2VwdG9yLW5hbWUtcHV0LnByb3BlcnRpZXMKK2ludGVyY2VwdG9yLW5hbWV8d3JrIC1jNjQgLXQxNiAtZDgwMHMgaHR0cDovL1NFUlZFUl9NQUNISU5FOlNFUlZFUl9QT1JUL0FQUF9DT05URVhUL3xvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5pbnRlcmNlcHRvci5uYW1lLkpheFJzQXBwbGljYXRpb258fG1ldHJpY3M6bmFtZT1vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyLmhhbmRsZXxpbnRlcmNlcHRvci1uYW1lLWdldC5wcm9wZXJ0aWVzCisKK2ludGVyY2VwdG9yLWR5bmFtaWN8d3JrIC1jNjQgLXQxNiAtZDgwMHMgLXMgdGV4dC1wb3N0Lmx1YSBodHRwOi8vU0VSVkVSX01BQ0hJTkU6U0VSVkVSX1BPUlQvQVBQX0NPTlRFWFQvfG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmludGVyY2VwdG9yLmR5bmFtaWMuSmF4UnNBcHBsaWNhdGlvbnx8bWV0cmljczpuYW1lPW9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXIuaGFuZGxlfGludGVyY2VwdG9yLWR5bmFtaWMtcG9zdC5wcm9wZXJ0aWVzCitpbnRlcmNlcHRvci1keW5hbWljfHdyayAtYzY0IC10MTYgLWQ4MDBzIC1zIHRleHQtcHV0Lmx1YSBodHRwOi8vU0VSVkVSX01BQ0hJTkU6U0VSVkVSX1BPUlQvQVBQX0NPTlRFWFQvfG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmludGVyY2VwdG9yLmR5bmFtaWMuSmF4UnNBcHBsaWNhdGlvbnx8bWV0cmljczpuYW1lPW9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXIuaGFuZGxlfGludGVyY2VwdG9yLWR5bmFtaWMtcHV0LnByb3BlcnRpZXMKK2ludGVyY2VwdG9yLWR5bmFtaWN8d3JrIC1jNjQgLXQxNiAtZDgwMHMgaHR0cDovL1NFUlZFUl9NQUNISU5FOlNFUlZFUl9QT1JUL0FQUF9DT05URVhUL3xvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5pbnRlcmNlcHRvci5keW5hbWljLkpheFJzQXBwbGljYXRpb258fG1ldHJpY3M6bmFtZT1vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuQXBwbGljYXRpb25IYW5kbGVyLmhhbmRsZXxpbnRlcmNlcHRvci1keW5hbWljLWdldC5wcm9wZXJ0aWVzCisKK3Byb3h5LWluamVjdGlvbnx3cmsgLWM2NCAtdDE2IC1kODAwcyBodHRwOi8vU0VSVkVSX01BQ0hJTkU6U0VSVkVSX1BPUlQvQVBQX0NPTlRFWFQvbWV0aG9kLWluamVjdGVkL3dpdGhvdXQtcGFyYW1ldGVyc3xvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5wcm94eS5pbmplY3Rpb24uSmF4UnNBcHBsaWNhdGlvbnx8bWV0cmljczpuYW1lPW9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXIuaGFuZGxlfHByb3h5LWluamVjdGlvbi1yYXctZ2V0cy5wcm9wZXJ0aWVzCitwcm94eS1pbmplY3Rpb258d3JrIC1jNjQgLXQxNiAtZDgwMHMgaHR0cDovL1NFUlZFUl9NQUNISU5FOlNFUlZFUl9QT1JUL0FQUF9DT05URVhUL21ldGhvZC1pbmplY3RlZC9hbGwtcGFyYW1ldGVyc3xvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5wcm94eS5pbmplY3Rpb24uSmF4UnNBcHBsaWNhdGlvbnx8bWV0cmljczpuYW1lPW9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXIuaGFuZGxlfHByb3h5LWluamVjdGlvbi1tZXRob2QtcGFyYW1zLnByb3BlcnRpZXMKK3Byb3h5LWluamVjdGlvbnx3cmsgLWM2NCAtdDE2IC1kODAwcyBodHRwOi8vU0VSVkVSX01BQ0hJTkU6U0VSVkVSX1BPUlQvQVBQX0NPTlRFWFQvZmllbGQtaW5qZWN0ZWQvd2l0aG91dC1wYXJhbWV0ZXJzfG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLnByb3h5LmluamVjdGlvbi5KYXhSc0FwcGxpY2F0aW9ufHxtZXRyaWNzOm5hbWU9b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLkFwcGxpY2F0aW9uSGFuZGxlci5oYW5kbGV8cHJveHktaW5qZWN0aW9uLWZpZWxkLXBhcmFtcy5wcm9wZXJ0aWVzCmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS9ldGMvaHVkc29uL2plcnNleS1wZXJmb3JtYW5jZS10ZXN0LWNvbW1vbi5zaCBiL3Rlc3RzL3BlcmZvcm1hbmNlL2V0Yy9odWRzb24vamVyc2V5LXBlcmZvcm1hbmNlLXRlc3QtY29tbW9uLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNGY4YzEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS9ldGMvaHVkc29uL2plcnNleS1wZXJmb3JtYW5jZS10ZXN0LWNvbW1vbi5zaApAQCAtMCwwICsxLDI2NCBAQAorIyEvYmluL2Jhc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisjCisjIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyMgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorIyBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyMgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorIworIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyMKKworQVBQX0xJU1Q9KG1idy10ZXh0LXBsYWluIFwKKyAgICAgICAgICBtYnctanNvbi1tb3h5IG1idy1qc29uLWphY2tzb24gXAorICAgICAgICAgIG1idy14bWwtbW94eSBtYncteG1sLWpheGIgXAorICAgICAgICAgIG1idy1jdXN0b20tcHJvdmlkZXIgXAorICAgICAgICAgIG1idy1rcnlvIFwKKyAgICAgICAgICBwYXJhbS1zcmwgXAorICAgICAgICAgIGZpbHRlci1nbG9iYWwgZmlsdGVyLW5hbWUgZmlsdGVyLWR5bmFtaWMgXAorICAgICAgICAgIGludGVyY2VwdG9yLWdsb2JhbCBpbnRlcmNlcHRvci1uYW1lIGludGVyY2VwdG9yLWR5bmFtaWMgXAorICAgICAgICAgIHByb3h5LWluamVjdGlvbikKKworV0FSTV9VUF9TRUNPTkRTPTMwMAorV0FJVF9GT1JfQVBQX1NUQVJUVVBfU0VDPTUKK1dBSVRfRk9SX0FQUF9SVU5OSU5HX1NFQz02MAorQ0hFQ0tfUlVOTkVSX0lOVEVSVkFMPTUKK0NIRUNLX1RFUk1fSU5URVJWQUw9MTAKKworSk1YX1VSSV9URU1QTEFURT0ic2VydmljZTpqbXg6cm1pOi8vL2puZGkvcm1pOi8vU0VSVkVSX01BQ0hJTkU6MTExMTIvam14cm1pIgorU0FNUExFUz0zMAorCisjdW5jb21tZW50IGZvciBkZWJ1ZyBwdXJwb3NlczoKKyNXQVJNX1VQX1NFQ09ORFM9MworI1dBSVRfRk9SX0FQUF9TVEFSVFVQX1NFQz0yCisjV0FJVF9GT1JfQVBQX1JVTk5JTkdfU0VDPTEKKyNDSEVDS19SVU5ORVJfSU5URVJWQUw9MQorI0NIRUNLX1RFUk1fSU5URVJWQUw9MgorI1NBTVBMRVM9MworIy9kZWJ1ZworCitNT0RVTEVTX1RPX0JVSUxEPSIiCitmb3IgYXBwIGluICR7QVBQX0xJU1RbKl19OyBkbworICBNT0RVTEVTX1RPX0JVSUxEPSIkTU9EVUxFU19UT19CVUlMRCx0ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzLyRhcHAiCitkb25lCitNT0RVTEVTX1RPX0JVSUxEPWBlY2hvICRNT0RVTEVTX1RPX0JVSUxEfHNlZCAtZSdzLywvLydgCisKK1NFUlZFUl9MSVNUPSgpCitDTElFTlRfTElTVF9BTEw9KCkKKworCitmdW5jdGlvbiB3YWl0Rm9yR3JvdXBTdGF0dXMoKSB7CisgIGVjaG8gIiMjIyMjIyMjIyMjIFdhaXRpbmcgZm9yIGdyb3VwIHN0YXR1czogJCoiCisgIFJVTk5FUl9JRD0kMQorICBzaGlmdAorICBHUk9VUF9JRD0kMQorICBzaGlmdAorICBTVEFUVVM9JDEKKworICBlY2hvICIjYGRhdGVgIiA+ICRTVEFUVVNfRElSLy5ydW5uZXIuJFJVTk5FUl9JRC53YWl0aW5nLiRHUk9VUF9JRC4kU1RBVFVTCisgIEZJTEU9IiRTVEFUVVNfRElSLy5ncm91cC4kR1JPVVBfSUQucnVubmluZy4kUlVOTkVSX0lELiRTVEFUVVMiCisKKyAgcm0gLWYgJFNUQVRVU19ESVIvLmdyb3VwLiRHUk9VUF9JRC5ydW5uaW5nLiRSVU5ORVJfSUQuKgorCisgIGF2YWlsYWJsZT1mYWxzZQorICB3aGlsZSBbICIkYXZhaWxhYmxlIiAhPSB0cnVlIF07IGRvCisgICAgaWYgWyAtZSAiJEZJTEUiIF07IHRoZW4KKyAgICAgIGF2YWlsYWJsZT10cnVlCisgICAgZWxzZQorICAgICAgc2xlZXAgMQorICAgIGZpCisgIGRvbmUKK30KKworZnVuY3Rpb24gcmVsZWFzZVJ1bm5lckFuZEdyb3VwKCkgeworICBlY2hvICIjIyMjIyMjIyMjIyBSZWxlYXNlIFJ1bm5lciBhbmQgR3JvdXA6ICQqIgorICBSVU5ORVJfSUQ9JDEKKyAgc2hpZnQKKyAgR1JPVVBfSUQ9JDEKKworICBlY2hvICIjYGRhdGVgIiA+ICRTVEFUVVNfRElSLy5ydW5uZXIuJFJVTk5FUl9JRC5hdmFpbGFibGUKKyAgcm0gLWYgJFNUQVRVU19ESVIvLmdyb3VwLiRHUk9VUF9JRC5ydW5uaW5nLiRSVU5ORVJfSUQuKiAkU1RBVFVTX0RJUi8ucnVubmVyLiRSVU5ORVJfSUQucnVubmluZworfQorCitmdW5jdGlvbiBjaGVja1dhaXRpbmdSdW5uZXJzKCkgeworICBlY2hvICIjIyMjIyMjIyMjIyBDaGVjayBXYWl0aW5nIFJ1bm5lcnMiCisgIGZvciB3YWl0aW5nX2ZpbGUgaW4gYGxzICRTVEFUVVNfRElSLy5ydW5uZXIuKi53YWl0aW5nLioubG9jayAyPiAvZGV2L251bGxgOyBkbworICAgIGZpbGVuYW1lX2FycmF5PShgYmFzZW5hbWUgJHdhaXRpbmdfZmlsZSB8IHRyICIuIiAiICJgKQorCisgICAgcnVubmVyX2lkPSR7ZmlsZW5hbWVfYXJyYXlbMV19CisgICAgZ3JvdXBfaWQ9JHtmaWxlbmFtZV9hcnJheVszXX0KKyAgICBzdGF0dXM9JHtmaWxlbmFtZV9hcnJheVs0XX0KKworICAgIF9maWxlcz0oJFNUQVRVU19ESVIvLmdyb3VwLiRncm91cF9pZC5ydW5uaW5nLiopCisgICAgaWYgWyAhIC1mICIke19maWxlc30iIF07IHRoZW4KKyAgICAgIGVjaG8gIiNgZGF0ZWAiID4gIiRTVEFUVVNfRElSLy5ncm91cC4kZ3JvdXBfaWQucnVubmluZy4kcnVubmVyX2lkLmxvY2siCisgICAgICBybSAkd2FpdGluZ19maWxlCisgICAgZmkKKyAgZG9uZQorCisgIGZvciB3YWl0aW5nX2ZpbGUgaW4gYGxzICRTVEFUVVNfRElSLy5ydW5uZXIuKi53YWl0aW5nLioub3BlbiAyPiAvZGV2L251bGxgOyBkbworICAgIGZpbGVuYW1lX2FycmF5PShgYmFzZW5hbWUgJHdhaXRpbmdfZmlsZSB8IHRyICIuIiAiICJgKQorCisgICAgcnVubmVyX2lkPSR7ZmlsZW5hbWVfYXJyYXlbMV19CisgICAgZ3JvdXBfaWQ9JHtmaWxlbmFtZV9hcnJheVszXX0KKyAgICBzdGF0dXM9JHtmaWxlbmFtZV9hcnJheVs0XX0KKworICAgIF9maWxlcz0oJFNUQVRVU19ESVIvLmdyb3VwLiRncm91cF9pZC5ydW5uaW5nLioubG9jaykKKyAgICBpZiBbICEgLWYgIiR7X2ZpbGVzfSIgXTsgdGhlbgorICAgICAgZWNobyAiI2BkYXRlYCIgPiAiJFNUQVRVU19ESVIvLmdyb3VwLiRncm91cF9pZC5ydW5uaW5nLiRydW5uZXJfaWQub3BlbiIKKyAgICAgIHJtICR3YWl0aW5nX2ZpbGUKKyAgICBmaQorICBkb25lCit9CisKK2Z1bmN0aW9uIGNyZWF0ZU1hY2hpbmVGaWxlcyB7CisgIGVjaG8gIiMjIyMjIyMjIyMjIENyZWF0aW5nIG1hY2hpbmUgZmlsZXMgaW4gJFNUQVRVU19ESVIgZm9yOiAkKiIKKyAgUlVOTkVSX0lEPSQxCisgIHNoaWZ0CisgIEdST1VQX0lEPSQxCisgIHNoaWZ0CisgIFNFUlZFUl9NQUNISU5FPSQxCisgIHNoaWZ0CisgIENMSUVOVF9MSVNUPSgkQCkKKworICBlY2hvICR7R1JPVVBfSUR9ID4gJFNUQVRVU19ESVIvLnJ1bm5lci4kUlVOTkVSX0lELmdyb3VwCisgIGVjaG8gIiNgZGF0ZWAiID4gJFNUQVRVU19ESVIvLnJ1bm5lci4kUlVOTkVSX0lELmF2YWlsYWJsZQorICBlY2hvICR7U0VSVkVSX01BQ0hJTkV9ID4gJFNUQVRVU19ESVIvLnJ1bm5lci4kUlVOTkVSX0lELnNlcnZlcgorICBlY2hvICR7Q0xJRU5UX0xJU1RbQF19ID4gJFNUQVRVU19ESVIvLnJ1bm5lci4kUlVOTkVSX0lELmNsaWVudHMKKworICBTRVJWRVJfTElTVD0oIiR7U0VSVkVSX0xJU1RbQF19IiAiJFNFUlZFUl9NQUNISU5FIikKKyAgQ0xJRU5UX0xJU1RfQUxMPSgiJHtDTElFTlRfTElTVF9BTExbQF19IiAiJHtDTElFTlRfTElTVFtAXX0iKQorfQorCitmdW5jdGlvbiB3YWl0Rm9yVGVybWluYXRvciB7CisgIGVjaG8gIiMjIyMjIyMjIyMjIFdhaXRpbmcgZm9yIGZpbmlzaCIKKyAgIyB3YWl0IGZvciB0aGUgbGFzdCByb3VuZCB0byBmaW5pc2gKKyAgdGVybWluYXRlZD1mYWxzZQorICB3aGlsZSBbICIkdGVybWluYXRlZCIgIT0gdHJ1ZSBdOyBkbworICAgIGNoZWNrV2FpdGluZ1J1bm5lcnMKKyAgICBfZmlsZXM9KCRTVEFUVVNfRElSLy5ydW5uZXIuKi5ydW5uaW5nKQorICAgIGlmIFsgISAtZiAiJHtfZmlsZXN9IiBdOyB0aGVuCisgICAgICB0ZXJtaW5hdGVkPXRydWUKKyAgICBmaQorICAgIGlmIFsgIiR0ZXJtaW5hdGVkIiAhPSB0cnVlIF07IHRoZW4KKyAgICAgIGVjaG8gIiMjIyMjIyMjIyMjIFRlcm1pbmF0ZWQgdGVzdHM6ICR0ZXJtaW5hdGVkLCB3YWl0aW5nICRDSEVDS19URVJNX0lOVEVSVkFMIHNlYy4uLiIKKyAgICAgIHNsZWVwICRDSEVDS19URVJNX0lOVEVSVkFMCisgICAgZmkKKyAgZG9uZQorCisgIGVjaG8gIkRPTkUhIgorCisgIHdhaXQKKyAgc2xlZXAgNAorICB3YWl0Cit9CisKK2Z1bmN0aW9uIHRlc3RMb29wIHsKKyAgIyBGb2xsb3dpbmcgaXMgdGhlIG1haW4gbWVhc3VyZW1lbnQgbG9vcAorICAjIE1FQVNVUkVNRU5UX0RBVEEgaXMgdGhlIGlucHV0IGRhdGEgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisgICMgYXBwbGljYXRpb24gZGlyZWN0b3J5IG5hbWV8Y29tbWFuZCBsaW5lIHRvIGdlbmVyYXRlIGxvYWQgb24gY2xpZW50IG1hY2hpbmVzfEpNWCBVUkkgZm9yIHRoZSBhcHBsaWNhdGlvbnxNQmVhbiBuYW1lfG91dHB1dCBmaWxlbmFtZQorCisgIGVjaG8gIiMjIyMjIyMjIyMjIExldCdzIHRlc3QgaXQsIHJlYWRpbmcgZnJvbSAkTUVBU1VSRU1FTlRfREFUQSBmaWxlIgorCisgIFRPVEFMX0NPVU5UPWBjYXQgJE1FQVNVUkVNRU5UX0RBVEEgfCBncmVwIC12ICJeIyIgfCBncmVwICJeLiIgfCB3YyAtbCB8IHNlZCAtZSAncy8gKi8vZydgCisgIElOREVYPTAKKyAgY2F0ICRNRUFTVVJFTUVOVF9EQVRBIHwgZ3JlcCAtdiAiXiMiIHwgZ3JlcCAiXi4iIHwgd2hpbGUgSUZTPSJcfCIgcmVhZCBhcHAgYWJfY21kbGluZSBhcHBfY2xhc3MgYWdlbnRfcGFyYW0gbWJlYW4gZmlsZW5hbWUKKyAgZG8KKyAgICBJTkRFWD1gZXhwciAkSU5ERVggKyAxYAorICAgIGVjaG8gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IERBVEEgWyRJTkRFWC8kVE9UQUxfQ09VTlRdID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iCisgICAgZWNobyAiYXBwICAgICAgID0gJGFwcCIKKyAgICBlY2hvICJhcHBfY2xhc3MgPSAkYXBwX2NsYXNzIgorICAgIGVjaG8gImFiX2NtZGxpbmU9ICRhYl9jbWRsaW5lIgorCisgICAgc3Bhd25lZD1mYWxzZQorICAgIHdoaWxlIFsgIiRzcGF3bmVkIiAhPSB0cnVlIF07IGRvCisgICAgICBmb3IgcnVubmVyX2ZpbGUgaW4gYGxzICRTVEFUVVNfRElSLy5ydW5uZXIuKi5hdmFpbGFibGUgMj4gL2Rldi9udWxsYDsgZG8KKyAgICAgICAgaWYgWyAiJHNwYXduZWQiICE9IHRydWUgXTsgdGhlbgorICAgICAgICAgIGZpbGVuYW1lX2FycmF5PShgYmFzZW5hbWUgJHJ1bm5lcl9maWxlIHwgdHIgIi4iICIgImApCisgICAgICAgICAgYWN0dWFsX3J1bm5lcj0ke2ZpbGVuYW1lX2FycmF5WzFdfQorICAgICAgICAgIGVjaG8gIiNgZGF0ZWAiID4gJFNUQVRVU19ESVIvLnJ1bm5lci4kYWN0dWFsX3J1bm5lci5ydW5uaW5nCisgICAgICAgICAgcm0gJHJ1bm5lcl9maWxlCisKKyAgICAgICAgICBTRVJWRVJfTUFDSElORT1gY2F0ICRTVEFUVVNfRElSLy5ydW5uZXIuJGFjdHVhbF9ydW5uZXIuc2VydmVyYAorICAgICAgICAgIEFQUF9DT05URVhUPSRhcHAKKyAgICAgICAgICBDTElFTlRfTElTVD0oYGNhdCAkU1RBVFVTX0RJUi8ucnVubmVyLiRhY3R1YWxfcnVubmVyLmNsaWVudHNgKQorICAgICAgICAgIGFiX2NtZGxpbmU9YGVjaG8gJGFiX2NtZGxpbmUgfCBzZWQgLWUicy9TRVJWRVJfTUFDSElORS8kU0VSVkVSX01BQ0hJTkUvIiB8IHNlZCAtZSJzL1NFUlZFUl9QT1JULyRTRVJWRVJfUE9SVC8iIHwgc2VkIC1lInMvQVBQX0NPTlRFWFQvJEFQUF9DT05URVhULyJgCisgICAgICAgICAgSk1YX1VSST1gZWNobyAkSk1YX1VSSV9URU1QTEFURSB8IHNlZCAtZSJzL1NFUlZFUl9NQUNISU5FLyRTRVJWRVJfTUFDSElORS8iYAorICAgICAgICAgIGdyb3VwX2lkPWBjYXQgJFNUQVRVU19ESVIvLnJ1bm5lci4kYWN0dWFsX3J1bm5lci5ncm91cGAKKworICAgICAgICAgIGVjaG8gIiNbJElOREVYLyRUT1RBTF9DT1VOVF0iID4+ICRTVEFUVVNfRElSLy5ydW5uZXIuJGFjdHVhbF9ydW5uZXIucnVubmluZworICAgICAgICAgIGVjaG8gIiRhcHAiID4+ICRTVEFUVVNfRElSLy5ydW5uZXIuJGFjdHVhbF9ydW5uZXIucnVubmluZworICAgICAgICAgIGVjaG8gIiRhcHBfY2xhc3MiID4+ICRTVEFUVVNfRElSLy5ydW5uZXIuJGFjdHVhbF9ydW5uZXIucnVubmluZworICAgICAgICAgIGVjaG8gIiRhYl9jbWRsaW5lIiA+PiAkU1RBVFVTX0RJUi8ucnVubmVyLiRhY3R1YWxfcnVubmVyLnJ1bm5pbmcKKyAgICAgICAgICBlY2hvICIkZmlsZW5hbWUiID4+ICRTVEFUVVNfRElSLy5ydW5uZXIuJGFjdHVhbF9ydW5uZXIucnVubmluZworICAgICAgICAgIGVjaG8gIiRtYmVhbiIgPj4gJFNUQVRVU19ESVIvLnJ1bm5lci4kYWN0dWFsX3J1bm5lci5ydW5uaW5nCisgICAgICAgICAgZWNobyAiJGFnZW50X3BhcmFtIiA+PiAkU1RBVFVTX0RJUi8ucnVubmVyLiRhY3R1YWxfcnVubmVyLnJ1bm5pbmcKKworICAgICAgICAgIHNwYXduZWQ9dHJ1ZQorICAgICAgICAgIHNpbmdsZVRlc3QgJgorICAgICAgICBmaQorICAgICAgZG9uZQorICAgICAgY2hlY2tXYWl0aW5nUnVubmVycworICAgICAgaWYgWyAiJHNwYXduZWQiICE9IHRydWUgXTsgdGhlbgorICAgICAgICBzbGVlcCAkQ0hFQ0tfUlVOTkVSX0lOVEVSVkFMCisgICAgICBmaQorICAgIGRvbmUKKyAgZG9uZQorfQorCitmdW5jdGlvbiByZW1vdmVPbGRDYXB0dXJlZERhdGEgeworICBybSAtZiAkV09SS1NQQUNFLyoucHJvcGVydGllcworfQorCitmdW5jdGlvbiByZXRyaWV2ZUpteENsaWVudCB7CisgIGVjaG8gIiMjIyMjIyMjIyMjIFJldHJpZXZpbmcgSk1YIGNsaWVudCIKKyAgc2NwIGplcnNleXJvYm90QCR7U0VSVkVSX0xJU1RbMF19OmpteGNsaWVudC5qYXIgLgorfQorCitmdW5jdGlvbiBwcmVwYXJlQ2xpZW50cyB7CisgIGVjaG8gIiMjIyMjIyMjIyMjIENvcHkgY2xpZW50IGZpbGVzIHRvIGVhY2ggY2xpZW50IgorICBmb3IgQ0xJRU5UX01BQ0hJTkUgaW4gJHtDTElFTlRfTElTVF9BTExbQF19OyBkbworICAgIGVjaG8gIi4uLiBjb3B5IGNsaWVudCBmaWxlcyB0byAke0NMSUVOVF9NQUNISU5FfSIKKyAgICBzY3AgJFdPUktTUEFDRS9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvZXRjL2NsaWVudC8qIGplcnNleXJvYm90QCR7Q0xJRU5UX01BQ0hJTkV9Oi4gJgorICBkb25lCisKKyAgd2FpdAorfQorCitmdW5jdGlvbiBidWlsZFRlc3RBcHBPblNlcnZlcnMgeworICBlY2hvICIjIyMjIyMjIyMjIyBCdWlsZGluZyB0ZXN0IGFwcGxpY2F0aW9ucyBvbiBlYWNoIHNlcnZlciIKKyAgIyBnaXQgZmV0Y2ggamVyc2V5IG9uIHRoZSBzZXJ2ZXIgbWFjaGluZSBhbmQgYnVpbGQgYWxsIGFwcHMgdGhlcmU6CisgIGZvciBTRVJWRVJfTUFDSElORSBpbiAke1NFUlZFUl9MSVNUW0BdfTsgZG8KKyAgICBzc2ggLW4gamVyc2V5cm9ib3RAJHtTRVJWRVJfTUFDSElORX0gJyhjZCAkSE9NRS93b3Jrc3BhY2UvamVyc2V5ICYmICckR0lUX0ZFVENIX0NPTU1BTkQnICYmIG12biAtcGwgJyRNT0RVTEVTX1RPX0JVSUxEJyAtYW0gLURza2lwLnRlc3RzPXRydWUgY2xlYW4gaW5zdGFsbCknICYKKyAgZG9uZQorCisgIHdhaXQKK30KKworZnVuY3Rpb24gY2xlYW51cEh1ZHNvblNsYXZlIHsKKyAgcm0gLWYgJFNUQVRVU19ESVIvLnJ1bm5lci4qICRTVEFUVVNfRElSLy5ncm91cC4qCit9CisKK2Z1bmN0aW9uIGNsZWFudXBTZXJ2ZXIgeworICBlY2hvICIjIyMjIyMjIyMjIyBLaWxsIGphdmEgcHJvY2Vzc2VzIG9uIHNlcnZlciAkMSIKKyAgc3NoIC1uIGplcnNleXJvYm90QCQxICdpZiAhIHRlc3QgLWUgYHBzIGggbyBwaWQgLUNqYXZhYDsgdGhlbiBraWxsIC1zIFRFUk0gYHBzIGggbyBwaWQgLUNqYXZhYCA7IGZpJworfQorCitmdW5jdGlvbiBjbGVhbnVwU2VydmVycyB7CisgIGVjaG8gIiMjIyMjIyMjIyMjIEtpbGwgYWxsIGphdmEgcHJvY2Vzc2VzIG9uIGVhY2ggc2VydmVyIgorICBmb3IgU0VSVkVSX01BQ0hJTkUgaW4gJHtTRVJWRVJfTElTVFtAXX07IGRvCisgICAgY2xlYW51cFNlcnZlciAke1NFUlZFUl9NQUNISU5FfQorICBkb25lCit9CisKKwordHJhcCAiY2xlYW51cEh1ZHNvblNsYXZlOyBjbGVhbnVwU2VydmVycyIgRVhJVCBTSUdURVJNIFNJR0lOVAorCisjdW5jb21tZW50IGZvciBkZWJ1ZyBwdXJwb3NlczoKKyN0cmFwICdlY2hvICJbJEJBU0hfU09VUkNFOiRMSU5FTk9dICRCQVNIX0NPTU1BTkQiID4+IC5kZWJ1ZzsgdGFpbCAtMTAgLmRlYnVnID4gLmRlYnVnLnN3YXA7IG12IC5kZWJ1Zy5zd2FwIC5kZWJ1ZycgREVCVUcKZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL2V0Yy9odWRzb24vamVyc2V5LXBlcmZvcm1hbmNlLXRlc3QtZ3JpenpseS5zaCBiL3Rlc3RzL3BlcmZvcm1hbmNlL2V0Yy9odWRzb24vamVyc2V5LXBlcmZvcm1hbmNlLXRlc3QtZ3JpenpseS5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yY2YyYTIyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvZXRjL2h1ZHNvbi9qZXJzZXktcGVyZm9ybWFuY2UtdGVzdC1ncml6emx5LnNoCkBAIC0wLDAgKzEsMTE5IEBACisjIS9iaW4vYmFzaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisjIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyMKKyMgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorIyBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisjIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorIyB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisjCisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorIworCisjCisjIEVudmlyb25tZW50IHNldHVwOgorIworIyBHSVRfRkVUQ0hfQ09NTUFORCAtIHNwZWNpZnkgR0lUIGNvbW1hbmQgdG8gZ2V0IHNvdXJjZXMgdG8gdGVzdCwgZS5nLiBnaXQgY2hlY2tvdXQgbWFzdGVyICYmIGdpdCBwdWxsCisjCisjIFNUQVRVU19ESVI9JEhPTUUvLmh1ZHNvbi1qZXJzZXkzLXBlcmZvcm1hbmNlLXRlc3QKKyMgbWtkaXIgLXAgJFNUQVRVU19ESVIKKyMgc291cmNlIGplcnNleS1wZXJmb3JtYW5jZS10ZXN0LWNvbW1vbi5zaAorIyB0ZXN0IG1hY2hpbmUgc2V0czogY2ZnIywgZ3JvdXAsIHNlcnZlciwgY2xpZW50cworIyBjcmVhdGVNYWNoaW5lRmlsZXMgMSAxIHNlcnZlcjEgY2xpZW50MWEgY2xpZW50MWIKKyMgY3JlYXRlTWFjaGluZUZpbGVzIDEgMiBzZXJ2ZXIyIGNsaWVudDJhIGNsaWVudDJiCisjIE1FQVNVUkVNRU5UX0RBVEE9fi9NRUFTVVJFTUVOVF9EQVRBCisjCisKK1NFUlZFUl9QT1JUPTgwODAKKworZnVuY3Rpb24gc2luZ2xlVGVzdCgpIHsKKyAgZWNobyAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgorICBlY2hvICI9PT09PSBTSU5HTEUgVEVTVCBSVU4sIFNFUlZFUj0kU0VSVkVSX01BQ0hJTkUsIGxvYWRlcj0kYWJfY21kbGluZSwgYXBwPSRhcHAsIEpNWF9VUkk9JEpNWF9VUkksIGdyb3VwX2lkPSRncm91cF9pZCA9PT09PSIKKyAgZWNobyAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgorCisgIGVjaG8gIiMjIyMjIyMjIyMjIGdvaW5nIHRvIHN0YXJ0IHRoZSB0ZXN0IGFwcCAkYXBwIgorICBzc2ggLW4gamVyc2V5cm9ib3RAJHtTRVJWRVJfTUFDSElORX0gJyhjZCB3b3Jrc3BhY2UvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3J1bm5lcnMvamVyc2V5LWdyaXp6bHktcnVubmVyOyBybSAtcmYgYXBwOyBta2RpciAtcCBhcHA7IGNwICRIT01FL3dvcmtzcGFjZS9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy8nJGFwcCcvdGFyZ2V0L3J1bm5lci9saWIvKiBhcHAvOyBKQVZBX09QVElPTlM9Ii1qYXZhYWdlbnQ6JEhPTUUvamVyc2V5LXBlcmZ0ZXN0LWFnZW50LmphciIgLi9zdGFydC5zaCAnJGFwcF9jbGFzcycgaHR0cDovLzAuMC4wLjA6ODA4MC8nJGFwcCcvIDQgOCknICYKKworICB3YWl0Rm9yR3JvdXBTdGF0dXMgJGFjdHVhbF9ydW5uZXIgJGdyb3VwX2lkICJvcGVuIgorCisgIGZvciBjbGllbnRfbWFjaGluZSBpbiAke0NMSUVOVF9MSVNUWypdfTsgZG8KKyAgICBlY2hvICIjIyMjIyMjIyMjIyBnb2luZyB0byBzdGFydCBsb2FkIGdlbmVyYXRvciBhdCAkY2xpZW50X21hY2hpbmUiCisgICAgKHNsZWVwICRXQUlUX0ZPUl9BUFBfU1RBUlRVUF9TRUM7IHNzaCAtbiBqZXJzZXlyb2JvdEAkY2xpZW50X21hY2hpbmUgIm5vaHVwICRhYl9jbWRsaW5lIiAmICkgJgorICBkb25lCisKKyAgZWNobyAiIyMjIyMjIyMjIyMgd2FpdGluZyAkV0FSTV9VUF9TRUNPTkRTIHNlYyB0byB3YXJtIHVwIHNlcnZlciIKKyAgc2xlZXAgJFdBUk1fVVBfU0VDT05EUworCisgIGVjaG8gIiMjIyMjIyMjIyMjIHdhcm0gdXAgZmluaXNoZWQsIHRlcm1pbmF0aW5nIGFiIGNsaWVudHMuLi4iCisgIGZvciBjbGllbnRfbWFjaGluZSBpbiAke0NMSUVOVF9MSVNUWypdfTsgZG8KKyAgICBlY2hvIC1uICIjIyMjIyMjIyMjIyB3YXJtIHVwIGZpbmlzaGVkLCBnb2luZyB0byBzdG9wIGxvYWQgZ2VuZXJhdG9yIGF0ICRjbGllbnRfbWFjaGluZS4uLiIKKyAgICBzc2ggLW4gamVyc2V5cm9ib3RAJGNsaWVudF9tYWNoaW5lICdpZiAhIHRlc3QgLWUgYHBzIGggbyBwaWQgLUN3cmtgOyB0aGVuIGtpbGwgLXMgSU5UIGBwcyBoIG8gcGlkIC1Dd3JrYCA7IGZpJworICAgIGVjaG8gIiBkb25lLiIKKyAgZG9uZQorCisgIHdhaXRGb3JHcm91cFN0YXR1cyAkYWN0dWFsX3J1bm5lciAkZ3JvdXBfaWQgImxvY2siCisKKyAgZm9yIGNsaWVudF9tYWNoaW5lIGluICR7Q0xJRU5UX0xJU1RbKl19OyBkbworICAgIGVjaG8gIiMjIyMjIyMjIyMjIGdvaW5nIHRvIHN0YXJ0IGxvYWQgZ2VuZXJhdG9yIGF0ICRjbGllbnRfbWFjaGluZSBhZ2FpbiIKKyAgICAoc3NoIC1uIGplcnNleXJvYm90QCRjbGllbnRfbWFjaGluZSAibm9odXAgJGFiX2NtZGxpbmUiICYgKSAmCisgIGRvbmUKKworICBlY2hvICIjIyMjIyMjIyMjIyB3YWl0aW5nIGJlZm9yZSBzdGFydCBjYXB0dXJpbmcgam14IGRhdGEiCisgIHNsZWVwICRXQUlUX0ZPUl9BUFBfUlVOTklOR19TRUMKKworICBlY2hvICIjIyMjIyMjIyMjIyBzdGFydGluZyBqbXggY2xpZW50IHRvIGNhcHR1cmUgZGF0YSIKKyAgaWYgISBqYXZhIC1jcCBqbXhjbGllbnQuamFyIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmpteGNsaWVudC5NYWluICRKTVhfVVJJICIkbWJlYW4iIE9uZU1pbnV0ZVJhdGUgJFNBTVBMRVMgJGZpbGVuYW1lOyB0aGVuCisgICAgZWNobyAiIyMjIyMjIyMjIyMgRVJST1IgV0hFTiBQUk9DRVNTSU5HIExJTkUjJHtMSU5FX05VTUJFUn0sIHRlc3QtY2FzZTogJHthcHB9LCBtYmVhbjogJHttYmVhbn0sIGZpbGVuYW1lOiAke2ZpbGVuYW1lfSEiCisgIGZpCisKKyAgZWNobyAiIyMjIyMjIyMjIyMgam14IGNsaWVudCBmaW5pc2hlZCwgdGVybWluYXRpbmcgYWIgY2xpZW50cy4uLiIKKyAgZm9yIGNsaWVudF9tYWNoaW5lIGluICR7Q0xJRU5UX0xJU1RbKl19OyBkbworICAgIGVjaG8gLW4gIiMjIyMjIyMjIyMjIGdvaW5nIHRvIHN0b3AgbG9hZCBnZW5lcmF0b3IgYXQgJGNsaWVudF9tYWNoaW5lLi4uIgorICAgIHNzaCAtbiBqZXJzZXlyb2JvdEAkY2xpZW50X21hY2hpbmUgJ2lmICEgdGVzdCAtZSBgcHMgaCBvIHBpZCAtQ3dya2A7IHRoZW4ga2lsbCAtcyBJTlQgYHBzIGggbyBwaWQgLUN3cmtgIDsgZmknCisgICAgZWNobyAiIGRvbmUuIgorICBkb25lCisKKyAgZWNobyAiIyMjIyMjIyMjIyMgdGVybWluYXRpbmcgdGVzdCBhcHAuLi4iCisgIHNzaCBqZXJzZXlyb2JvdEAke1NFUlZFUl9NQUNISU5FfSAnKGNkIHdvcmtzcGFjZS9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvcnVubmVycy9qZXJzZXktZ3JpenpseS1ydW5uZXIgJiYgLi9zdG9wLnNoKScKKworICBjbGVhbnVwU2VydmVyICRTRVJWRVJfTUFDSElORQorCisgIHJlbGVhc2VSdW5uZXJBbmRHcm91cCAkYWN0dWFsX3J1bm5lciAkZ3JvdXBfaWQKK30KKworIworIyB0ZXN0IHByb2Nlc3Mgc3RhcnQKKyMKKworcmVtb3ZlT2xkQ2FwdHVyZWREYXRhCisKK3JldHJpZXZlSm14Q2xpZW50CisKK3ByZXBhcmVDbGllbnRzCisKK2J1aWxkVGVzdEFwcE9uU2VydmVycworCitlY2hvICIjIyMjIyMjIyMjIyBQYWNrYWdlIChsaWIgZGlyKSBhbGwgdGVzdCBjYXNlIGFwcGxpY2F0aW9ucyIKK2ZvciBTRVJWRVJfTUFDSElORSBpbiAke1NFUlZFUl9MSVNUW0BdfTsgZG8KKyAgZm9yIGFwcCBpbiAke0FQUF9MSVNUWypdfTsgZG8KKyAgICBzc2ggamVyc2V5cm9ib3RAJHtTRVJWRVJfTUFDSElORX0gJyhjZCB3b3Jrc3BhY2UvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvJyRhcHAnOyBta2RpciAtcCB0YXJnZXQvcnVubmVyL2xpYjsgY2QgdGFyZ2V0L3J1bm5lci9saWI7IHVuemlwIC4uLy4uLyouemlwKScKKyAgZG9uZQorZG9uZQorCitlY2hvICIjIyMjIyMjIyMjIyBCdWlsZCBhbmQgcGFja2FnZSAobGliIGRpcikgdGVzdCBydW5uZXIiCitmb3IgU0VSVkVSX01BQ0hJTkUgaW4gJHtTRVJWRVJfTElTVFtAXX07IGRvCisgIHNzaCAtbiBqZXJzZXlyb2JvdEAke1NFUlZFUl9NQUNISU5FfSAnKGNkIHdvcmtzcGFjZS9qZXJzZXk7IG12biAtcGwgdGVzdHMvcGVyZm9ybWFuY2UvcnVubmVycy9qZXJzZXktZ3JpenpseS1ydW5uZXIgY2xlYW4gaW5zdGFsbDsgY2QgdGVzdHMvcGVyZm9ybWFuY2UvcnVubmVycy9qZXJzZXktZ3JpenpseS1ydW5uZXI7IG1rZGlyIC1wIGxpYjsgcm0gLWYgbGliLyouamFyOyBjZCBsaWI7IHVuemlwIC4uL3RhcmdldC8qLnppcCknICYKK2RvbmUKKword2FpdAorCitjbGVhbnVwU2VydmVycworCit0ZXN0TG9vcAorCit3YWl0Rm9yVGVybWluYXRvcgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvZXRjL2h1ZHNvbi9qZXJzZXktcGVyZm9ybWFuY2UtdGVzdC13bHMuc2ggYi90ZXN0cy9wZXJmb3JtYW5jZS9ldGMvaHVkc29uL2plcnNleS1wZXJmb3JtYW5jZS10ZXN0LXdscy5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjc2MjI3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvZXRjL2h1ZHNvbi9qZXJzZXktcGVyZm9ybWFuY2UtdGVzdC13bHMuc2gKQEAgLTAsMCArMSwxMzkgQEAKKyMhL2Jpbi9iYXNoCisjCisjIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorIworIyBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisjIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyMgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisjIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyMKKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisjCisKKyMKKyMgRW52aXJvbm1lbnQgc2V0dXA6CisjCisjIEdJVF9GRVRDSF9DT01NQU5EIC0gc3BlY2lmeSBHSVQgY29tbWFuZCB0byBnZXQgc291cmNlcyB0byB0ZXN0LCBlLmcuIGdpdCBjaGVja291dCBtYXN0ZXIgJiYgZ2l0IHB1bGwKKyMgV0VCTE9HSUNfT1VJX1VSTCAtIFVSTCB0byBkb3dubG9hZCBXTFMgaW5zdGFsbGF0aW9uIGphciBmcm9tCisjCisjIFNUQVRVU19ESVI9JEhPTUUvLmh1ZHNvbi1qZXJzZXkzLXBlcmZvcm1hbmNlLXRlc3QKKyMgbWtkaXIgLXAgJFNUQVRVU19ESVIKKyMgc291cmNlIGplcnNleS1wZXJmb3JtYW5jZS10ZXN0LWNvbW1vbi5zaAorIyB0ZXN0IG1hY2hpbmUgc2V0czogY2ZnIywgZ3JvdXAsIHNlcnZlciwgY2xpZW50cworIyBjcmVhdGVNYWNoaW5lRmlsZXMgMSAxIHNlcnZlcjEgY2xpZW50MWEgY2xpZW50MWIKKyMgY3JlYXRlTWFjaGluZUZpbGVzIDEgMiBzZXJ2ZXIyIGNsaWVudDJhIGNsaWVudDJiCisjIE1FQVNVUkVNRU5UX0RBVEE9fi9NRUFTVVJFTUVOVF9EQVRBCisjCisKK0xPR1NfRElSPSRXT1JLU1BBQ0UvbG9ncworCitTRVJWRVJfUE9SVD03MDAxCisKK2Z1bmN0aW9uIHNpbmdsZVRlc3QoKSB7CisgIGVjaG8gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKKyAgZWNobyAiPT09PT0gU0lOR0xFIFRFU1QgUlVOLCBTRVJWRVI9JFNFUlZFUl9NQUNISU5FLCBsb2FkZXI9JGFiX2NtZGxpbmUsIGFwcD0kYXBwLCBKTVhfVVJJPSRKTVhfVVJJLCBncm91cF9pZD0kZ3JvdXBfaWQgPT09PT0iCisgIGVjaG8gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKKworICBlY2hvICIjIyMjIyMjIyMjIyBTdGFydCBXTFMgc2VydmVyIgorICBzc2ggLW4gamVyc2V5cm9ib3RAJHtTRVJWRVJfTUFDSElORX0gJyhjZCB3b3Jrc3BhY2UvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3J1bm5lcnMvamVyc2V5LXdscy1ydW5uZXI7IC4vc3RhcnQuc2gpJyAmCisKKyAgZWNobyAiIyMjIyMjIyMjIyMgd2FpdGluZyBmb3IgV0xTIHNlcnZlciBzdGFydCIKKyAgd2hpbGUgWyAhIGB3Z2V0IC1xIC0tc2VydmVyLXJlc3BvbnNlIC0tbm8tcHJveHkgaHR0cDovLyR7U0VSVkVSX01BQ0hJTkV9OjcwMDEgMj4mMSB8IGF3ayAnL14gIEhUVFAve3ByaW50ICQyfSdgIF07IGRvCisgICAgc2xlZXAgNQorICAgIGVjaG8gIiMgJHtTRVJWRVJfTUFDSElORX0iCisgIGRvbmUKKworICBlY2hvICIjIyMjIyMjIyMjIyBnb2luZyB0byBkZXBsb3kvc3RhcnQgdGhlIHRlc3QgYXBwICRhcHAiCisgIHNzaCAtbiBqZXJzZXlyb2JvdEAke1NFUlZFUl9NQUNISU5FfSAnKGNkIHdvcmtzcGFjZS9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvcnVubmVycy9qZXJzZXktd2xzLXJ1bm5lcjsgLi9kZXBsb3kuc2ggJFBXRC8uLi8uLi90ZXN0LWNhc2VzLyckYXBwJy90YXJnZXQvcnVubmVyLyckYXBwJy53YXIpJworCisgIHdhaXRGb3JHcm91cFN0YXR1cyAkYWN0dWFsX3J1bm5lciAkZ3JvdXBfaWQgIm9wZW4iCisKKyAgZm9yIGNsaWVudF9tYWNoaW5lIGluICR7Q0xJRU5UX0xJU1RbKl19OyBkbworICAgIGVjaG8gIiMjIyMjIyMjIyMjIGdvaW5nIHRvIHN0YXJ0IGxvYWQgZ2VuZXJhdG9yIGF0ICRjbGllbnRfbWFjaGluZSIKKyAgICAoc2xlZXAgJFdBSVRfRk9SX0FQUF9TVEFSVFVQX1NFQzsgc3NoIC1uIGplcnNleXJvYm90QCRjbGllbnRfbWFjaGluZSAibm9odXAgJGFiX2NtZGxpbmUiICYgKSAmCisgIGRvbmUKKworICBlY2hvICIjIyMjIyMjIyMjIyB3YWl0aW5nICRXQVJNX1VQX1NFQ09ORFMgc2VjIHRvIHdhcm0gdXAgc2VydmVyIgorICBzbGVlcCAkV0FSTV9VUF9TRUNPTkRTCisKKyAgZWNobyAiIyMjIyMjIyMjIyMgd2FybSB1cCBmaW5pc2hlZCwgdGVybWluYXRpbmcgYWIgY2xpZW50cy4uLiIKKyAgZm9yIGNsaWVudF9tYWNoaW5lIGluICR7Q0xJRU5UX0xJU1RbKl19OyBkbworICAgIGVjaG8gLW4gIiMjIyMjIyMjIyMjIHdhcm0gdXAgZmluaXNoZWQsIGdvaW5nIHRvIHN0b3AgbG9hZCBnZW5lcmF0b3IgYXQgJGNsaWVudF9tYWNoaW5lLi4uIgorICAgIHNzaCAtbiBqZXJzZXlyb2JvdEAkY2xpZW50X21hY2hpbmUgJ2lmICEgdGVzdCAtZSBgcHMgaCBvIHBpZCAtQ3dya2A7IHRoZW4ga2lsbCAtcyBJTlQgYHBzIGggbyBwaWQgLUN3cmtgIDsgZmknCisgICAgZWNobyAiIGRvbmUuIgorICBkb25lCisKKyAgd2FpdEZvckdyb3VwU3RhdHVzICRhY3R1YWxfcnVubmVyICRncm91cF9pZCAibG9jayIKKworICBmb3IgY2xpZW50X21hY2hpbmUgaW4gJHtDTElFTlRfTElTVFsqXX07IGRvCisgICAgZWNobyAiIyMjIyMjIyMjIyMgZ29pbmcgdG8gc3RhcnQgbG9hZCBnZW5lcmF0b3IgYXQgJGNsaWVudF9tYWNoaW5lIGFnYWluIgorICAgIChzc2ggLW4gamVyc2V5cm9ib3RAJGNsaWVudF9tYWNoaW5lICJub2h1cCAkYWJfY21kbGluZSIgJiApICYKKyAgZG9uZQorCisgIGVjaG8gIiMjIyMjIyMjIyMjIHdhaXRpbmcgYmVmb3JlIHN0YXJ0IGNhcHR1cmluZyBqbXggZGF0YSIKKyAgc2xlZXAgJFdBSVRfRk9SX0FQUF9SVU5OSU5HX1NFQworCisgIGVjaG8gIiMjIyMjIyMjIyMjIHN0YXJ0aW5nIGpteCBjbGllbnQgdG8gY2FwdHVyZSBkYXRhIgorICBpZiAhIGphdmEgLWNwIGpteGNsaWVudC5qYXIgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2Uuam14Y2xpZW50Lk1haW4gJEpNWF9VUkkgIiRtYmVhbiIgT25lTWludXRlUmF0ZSAkU0FNUExFUyAkZmlsZW5hbWU7IHRoZW4KKyAgICBlY2hvICIjIyMjIyMjIyMjIyBFUlJPUiBXSEVOIFBST0NFU1NJTkcgTElORSMke0xJTkVfTlVNQkVSfSwgdGVzdC1jYXNlOiAke2FwcH0sIG1iZWFuOiAke21iZWFufSwgZmlsZW5hbWU6ICR7ZmlsZW5hbWV9ISIKKyAgZmkKKworICBlY2hvICIjIyMjIyMjIyMjIyBqbXggY2xpZW50IGZpbmlzaGVkLCB0ZXJtaW5hdGluZyBhYiBjbGllbnRzLi4uIgorICBmb3IgY2xpZW50X21hY2hpbmUgaW4gJHtDTElFTlRfTElTVFsqXX07IGRvCisgICAgZWNobyAtbiAiIyMjIyMjIyMjIyMgZ29pbmcgdG8gc3RvcCBsb2FkIGdlbmVyYXRvciBhdCAkY2xpZW50X21hY2hpbmUuLi4iCisgICAgc3NoIC1uIGplcnNleXJvYm90QCRjbGllbnRfbWFjaGluZSAnaWYgISB0ZXN0IC1lIGBwcyBoIG8gcGlkIC1Dd3JrYDsgdGhlbiBraWxsIC1zIElOVCBgcHMgaCBvIHBpZCAtQ3dya2AgOyBmaScKKyAgICBlY2hvICIgZG9uZS4iCisgIGRvbmUKKworICBlY2hvICIjIyMjIyMjIyMjIyB0ZXJtaW5hdGluZyB0ZXN0IGFwcC4uLiIKKyAgc3NoIGplcnNleXJvYm90QCR7U0VSVkVSX01BQ0hJTkV9ICcoY2Qgd29ya3NwYWNlL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9ydW5uZXJzL2plcnNleS13bHMtcnVubmVyICYmIC4vc3RvcC5zaCknCisKKyAgZWNobyAiIyMjIyMjIyMjIyMgY29weSBzZXJ2ZXIgYW5kIGRvbWFpbiBsb2dzIHRvIGh1ZHNvbiBzbGF2ZS4uLiIKKyAganVzdF9maWxlbmFtZT1gZWNobyAke2ZpbGVuYW1lfSB8IHNlZCAtZSAncy9cLlteLl0qJC8vJ2AKKyAgc2NwIGplcnNleXJvYm90QCR7U0VSVkVSX01BQ0hJTkV9OndvcmtzcGFjZS9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvcnVubmVycy9qZXJzZXktd2xzLXJ1bm5lci90YXJnZXQvc2VydmVyLmxvZyAkTE9HU19ESVIvJHtqdXN0X2ZpbGVuYW1lfS1zZXJ2ZXIubG9nCisgIHNjcCBqZXJzZXlyb2JvdEAke1NFUlZFUl9NQUNISU5FfTp3b3Jrc3BhY2UvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3J1bm5lcnMvamVyc2V5LXdscy1ydW5uZXIvdGFyZ2V0L2RvbWFpbi5sb2cgJExPR1NfRElSLyR7anVzdF9maWxlbmFtZX0tZG9tYWluLmxvZworCisgIGNsZWFudXBTZXJ2ZXIgJFNFUlZFUl9NQUNISU5FCisKKyAgcmVsZWFzZVJ1bm5lckFuZEdyb3VwICRhY3R1YWxfcnVubmVyICRncm91cF9pZAorfQorCisjCisjIHRlc3QgcHJvY2VzcyBzdGFydAorIworCitta2RpciAtcCAkTE9HU19ESVIKK3JtIC1mICRMT0dTX0RJUi8qCisKK3JlbW92ZU9sZENhcHR1cmVkRGF0YQorCityZXRyaWV2ZUpteENsaWVudAorCitwcmVwYXJlQ2xpZW50cworCitidWlsZFRlc3RBcHBPblNlcnZlcnMKKworZWNobyAiIyMjIyMjIyMjIyMgUHJlcGFyZSB3YXIgZmlsZXMgb2YgYWxsIHRlc3QgY2FzZSBhcHBsaWNhdGlvbnMiCitmb3IgU0VSVkVSX01BQ0hJTkUgaW4gJHtTRVJWRVJfTElTVFtAXX07IGRvCisgIGZvciBhcHAgaW4gJHtBUFBfTElTVFsqXX07IGRvCisgICAgc3NoIGplcnNleXJvYm90QCR7U0VSVkVSX01BQ0hJTkV9ICcoY2Qgd29ya3NwYWNlL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzLyckYXBwJzsgbWtkaXIgLXAgdGFyZ2V0L3J1bm5lcjsgY3AgdGFyZ2V0Lyoud2FyIHRhcmdldC9ydW5uZXIvJyRhcHAnLndhciknCisgIGRvbmUKK2RvbmUKKworZWNobyAiIyMjIyMjIyMjIyMgSW5zdGFsbCBXTFMgc2VydmVyIgorZm9yIFNFUlZFUl9NQUNISU5FIGluICR7U0VSVkVSX0xJU1RbQF19OyBkbworICBzc2ggLW4gamVyc2V5cm9ib3RAJHtTRVJWRVJfTUFDSElORX0gJyhjZCB3b3Jrc3BhY2UvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3J1bm5lcnMvamVyc2V5LXdscy1ydW5uZXI7IC4vaW5zdGFsbC5zaCAnJFdFQkxPR0lDX09VSV9VUkwnKScgJgorZG9uZQorCit3YWl0CisKK2NsZWFudXBTZXJ2ZXJzCisKK3Rlc3RMb29wCisKK3dhaXRGb3JUZXJtaW5hdG9yCmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS9qbXgtY2xpZW50L3BvbS54bWwgYi90ZXN0cy9wZXJmb3JtYW5jZS9qbXgtY2xpZW50L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ5Nzg3OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL2pteC1jbGllbnQvcG9tLnhtbApAQCAtMCwwICsxLDM1IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEwLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5wZXJmb3JtYW5jZTwvZ3JvdXBJZD4KKyAgPGFydGlmYWN0SWQ+am14Y2xpZW50PC9hcnRpZmFjdElkPgorICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+CisgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisKKyAgPG5hbWU+Sm14Q2xpZW50PC9uYW1lPgorCisgIDxwcm9wZXJ0aWVzPgorICAgIDxwcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPlVURi04PC9wcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPgorICA8L3Byb3BlcnRpZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL2pteC1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9qbXhjbGllbnQvTWFpbi5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2Uvam14LWNsaWVudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2pteGNsaWVudC9NYWluLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWNmYWZiNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL2pteC1jbGllbnQvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9qbXhjbGllbnQvTWFpbi5qYXZhCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2Uuam14Y2xpZW50OworCitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLlByb3BlcnRpZXM7CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5NQmVhblNlcnZlckNvbm5lY3Rpb247CitpbXBvcnQgamF2YXgubWFuYWdlbWVudC5PYmplY3ROYW1lOworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQucmVtb3RlLkpNWENvbm5lY3RvcjsKK2ltcG9ydCBqYXZheC5tYW5hZ2VtZW50LnJlbW90ZS5KTVhDb25uZWN0b3JGYWN0b3J5OworaW1wb3J0IGphdmF4Lm1hbmFnZW1lbnQucmVtb3RlLkpNWFNlcnZpY2VVUkw7CisKKy8qKgorICogSk1YIENsaWVudCBlbnRyeSBwb2ludC4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgTWFpbiB7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKworLy8gICAgICBlLmcuICJzZXJ2aWNlOmpteDpybWk6Ly8vam5kaS9ybWk6Ly9zeXNpZm9zLmN6Lm9yYWNsZS5jb206MTExMTIvam14cm1pIgorICAgICAgICBmaW5hbCBTdHJpbmcgam14VXJsID0gYXJnc1swXTsKKy8vICAgICAgZS5nLiAib3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5wZXJmb3JtYW5jZS5pbnRlcmNlcHRvci5keW5hbWljOnR5cGU9RHluYW1pY2FsbHlCb3VuZEludGVyY2VwdG9yUmVzb3VyY2UsbmFtZT1nZXRzIgorICAgICAgICBmaW5hbCBTdHJpbmcgbUJlYW5OYW1lID0gYXJnc1sxXTsKKy8vICAgICAgZS5nLiAiT25lTWludXRlUmF0ZSIKKyAgICAgICAgZmluYWwgU3RyaW5nIG1CZWFuQXR0ck5hbWUgPSBhcmdzWzJdOworLy8gICAgICBlLmcuIDUwCisgICAgICAgIGZpbmFsIGludCBzYW1wbGVDb3VudCA9IEludGVnZXIucGFyc2VJbnQoYXJnc1szXSk7CisvLyAgICAgIGUuZy4gInBoaXNoaW5nLnByb3BlcnRpZXMiCisgICAgICAgIGZpbmFsIFN0cmluZyBwcm9wZXJ0aWVzRmlsZSA9IGFyZ3NbNF07CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGYoIkpNWCBVUkwgPSAlc1xuTUJlYW4gPSAlc1xuYXR0cmlidXRlID0gJXNcbnNhbXBsZXMgPSAlZFxuZmlsZW5hbWUgPSAlc1xuIgorICAgICAgICAgICAgICAgICsgIkdvaW5nIHRvIGNvbm5lY3QuLi5cbiIsCisgICAgICAgICAgICAgICAgam14VXJsLCBtQmVhbk5hbWUsIG1CZWFuQXR0ck5hbWUsIHNhbXBsZUNvdW50LCBwcm9wZXJ0aWVzRmlsZSk7CisKKyAgICAgICAgZmluYWwgSk1YU2VydmljZVVSTCB1cmwgPSBuZXcgSk1YU2VydmljZVVSTChqbXhVcmwpOworICAgICAgICBmaW5hbCBKTVhDb25uZWN0b3Igam14YyA9IEpNWENvbm5lY3RvckZhY3RvcnkuY29ubmVjdCh1cmwsIG51bGwpOworICAgICAgICBmaW5hbCBNQmVhblNlcnZlckNvbm5lY3Rpb24gbUJlYW5TZXJ2ZXIgPSBqbXhjLmdldE1CZWFuU2VydmVyQ29ubmVjdGlvbigpOworICAgICAgICBmaW5hbCBPYmplY3ROYW1lIG1CZWFuT2JqZWN0TmFtZSA9IG5ldyBPYmplY3ROYW1lKG1CZWFuTmFtZSk7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJDb25uZWN0ZWQuLi4iKTsKKworICAgICAgICBkb3VibGUgdG90YWxTdW0gPSAwOworICAgICAgICBpbnQgc2FtcGxlc1Rha2VuID0gMDsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNhbXBsZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIFRocmVhZC5zbGVlcCg1MDAwKTsKKworICAgICAgICAgICAgRG91YmxlIHNhbXBsZSA9IChEb3VibGUpIG1CZWFuU2VydmVyLmdldEF0dHJpYnV0ZShtQmVhbk9iamVjdE5hbWUsIG1CZWFuQXR0ck5hbWUpOworCisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiT01SWyVkXT0lZlxuIiwgaSwgc2FtcGxlKTsKKworICAgICAgICAgICAgdG90YWxTdW0gKz0gc2FtcGxlOworICAgICAgICAgICAgc2FtcGxlc1Rha2VuKys7CisgICAgICAgIH0KKworICAgICAgICBqbXhjLmNsb3NlKCk7CisKKyAgICAgICAgZmluYWwgZG91YmxlIHJlc3VsdCA9IHRvdGFsU3VtIC8gc2FtcGxlc1Rha2VuOworICAgICAgICB3cml0ZVJlc3VsdChyZXN1bHQsIHByb3BlcnRpZXNGaWxlKTsKKworICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiXG5BdmVyYWdlPSVmXG4iLCByZXN1bHQpOworICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVSZXN1bHQoZG91YmxlIHJlc3VsdFZhbHVlLCBTdHJpbmcgcHJvcGVydGllc0ZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFByb3BlcnRpZXMgcmVzdWx0UHJvcHMgPSBuZXcgUHJvcGVydGllcygpOworICAgICAgICByZXN1bHRQcm9wcy5wdXQoIllWQUxVRSIsIERvdWJsZS50b1N0cmluZyhyZXN1bHRWYWx1ZSkpOworICAgICAgICByZXN1bHRQcm9wcy5zdG9yZShuZXcgRmlsZU91dHB1dFN0cmVhbShwcm9wZXJ0aWVzRmlsZSksIG51bGwpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3BvbS54bWwgYi90ZXN0cy9wZXJmb3JtYW5jZS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MzRjZjIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS9wb20ueG1sCkBAIC0wLDAgKzEsNDUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZTwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLXBlcmZvcm1hbmNlPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBQZXJmb3JtYW5jZSB0ZXN0cy4KKyAgICA8L2Rlc2NyaXB0aW9uPgorCisgICAgPG1vZHVsZXM+CisgICAgICAgIDxtb2R1bGU+YmVuY2htYXJrczwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPnJ1bm5lcnM8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT50ZXN0LWNhc2VzPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+dG9vbHM8L21vZHVsZT4KKyAgICA8L21vZHVsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3J1bm5lcnMvamVyc2V5LWdyaXp6bHktcnVubmVyL3BvbS54bWwgYi90ZXN0cy9wZXJmb3JtYW5jZS9ydW5uZXJzL2plcnNleS1ncml6emx5LXJ1bm5lci9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MTg4NjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS9ydW5uZXJzL2plcnNleS1ncml6emx5LXJ1bm5lci9wb20ueG1sCkBAIC0wLDAgKzEsOTQgQEAKKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5ydW5uZXJzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisKKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktZ3JpenpseS1ydW5uZXI8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKworICAgIDxuYW1lPmplcnNleS1ncml6emx5LXJ1bm5lcjwvbmFtZT4KKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8cHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz5VVEYtODwvcHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz4KKyAgICA8L3Byb3BlcnRpZXM+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItZ3JpenpseTItaHR0cDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjQ8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxhcmNoaXZlPgorICAgICAgICAgICAgICAgICAgICAgICAgPGluZGV4PnRydWU8L2luZGV4PgorICAgICAgICAgICAgICAgICAgICAgICAgPG1hbmlmZXN0PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhZGRDbGFzc3BhdGg+dHJ1ZTwvYWRkQ2xhc3NwYXRoPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYWluQ2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UucnVubmVycy5KZXJzZXlHcml6emx5UnVubmVyPC9tYWluQ2xhc3M+CisgICAgICAgICAgICAgICAgICAgICAgICA8L21hbmlmZXN0PgorICAgICAgICAgICAgICAgICAgICA8L2FyY2hpdmU+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5tb2pvPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmV4ZWMtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8bWFpbkNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLnJ1bm5lcnMuSmVyc2V5R3JpenpseVJ1bm5lcjwvbWFpbkNsYXNzPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvbWFpbi9hc3NlbWJseS96aXAtd2l0aC1qYXJzLnhtbDwvZGVzY3JpcHRvcj4KKyAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+bWFrZS1hc3NlbWJseTwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHRoaXMgaXMgdXNlZCBmb3IgaW5oZXJpdGFuY2UgbWVyZ2VzIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBhcHBlbmQgdG8gdGhlIHBhY2thZ2luZyBwaGFzZS4gLS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+YXR0YWNoZWQ8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBnb2FscyA9PSBtb2pvcyAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorCisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvcnVubmVycy9qZXJzZXktZ3JpenpseS1ydW5uZXIvc3JjL21haW4vYXNzZW1ibHkvemlwLXdpdGgtamFycy54bWwgYi90ZXN0cy9wZXJmb3JtYW5jZS9ydW5uZXJzL2plcnNleS1ncml6emx5LXJ1bm5lci9zcmMvbWFpbi9hc3NlbWJseS96aXAtd2l0aC1qYXJzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmEyYTczCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvcnVubmVycy9qZXJzZXktZ3JpenpseS1ydW5uZXIvc3JjL21haW4vYXNzZW1ibHkvemlwLXdpdGgtamFycy54bWwKQEAgLTAsMCArMSwzNSBAQAorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxhc3NlbWJseSB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiCisgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgorICAgIDxpZD56aXAtd2l0aC1qYXJzPC9pZD4KKyAgICA8Zm9ybWF0cz4KKyAgICAgICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KKyAgICA8L2Zvcm1hdHM+CisgICAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KKyAgICA8ZGVwZW5kZW5jeVNldHM+CisgICAgICAgIDxkZXBlbmRlbmN5U2V0PgorICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4vPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICA8dXNlUHJvamVjdEFydGlmYWN0PnRydWU8L3VzZVByb2plY3RBcnRpZmFjdD4KKyAgICAgICAgICAgIDx1bnBhY2s+ZmFsc2U8L3VucGFjaz4KKyAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5U2V0PgorICAgIDwvZGVwZW5kZW5jeVNldHM+Cis8L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvcnVubmVycy9qZXJzZXktZ3JpenpseS1ydW5uZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9ydW5uZXJzL0plcnNleUdyaXp6bHlSdW5uZXIuamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3J1bm5lcnMvamVyc2V5LWdyaXp6bHktcnVubmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvcnVubmVycy9KZXJzZXlHcml6emx5UnVubmVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM2NTFjYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3J1bm5lcnMvamVyc2V5LWdyaXp6bHktcnVubmVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvcnVubmVycy9KZXJzZXlHcml6emx5UnVubmVyLmphdmEKQEAgLTAsMCArMSw2NSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5ydW5uZXJzOworCitpbXBvcnQgamF2YS5uZXQuVVJJOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkyLmh0dHBzZXJ2ZXIuR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guZ3JpenpseS5odHRwLnNlcnZlci5IdHRwU2VydmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guZ3JpenpseS5uaW8udHJhbnNwb3J0LlRDUE5JT1RyYW5zcG9ydDsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmdyaXp6bHkudGhyZWFkcG9vbC5UaHJlYWRQb29sQ29uZmlnOworCisvKioKKyAqIEFwcGxpY2F0aW9uIGNsYXNzIHRvIHN0YXJ0IHBlcmZvcm1hbmNlIHRlc3Qgd2ViIHNlcnZpY2UgYXQgaHR0cDovL2xvY2FsaG9zdDo4MDgwLyBpZiB0aGUgYmFzZSBVUkkKKyAqIGlzIG5vdCBwYXNzZWQgdmlhIHRoZSBzZWNvbmQgY29tbWFuZCBsaW5lIGFyZ3VtZW50LgorICovCitwdWJsaWMgY2xhc3MgSmVyc2V5R3JpenpseVJ1bm5lciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgQkFTRV9VUkkgPSBVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvIik7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9TRUxFQ1RPUlMgPSA0OworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1dPUktFUlMgPSA4OworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiSmVyc2V5IHBlcmZvcm1hbmNlIHRlc3Qgd2ViIHNlcnZpY2UgYXBwbGljYXRpb24iKTsKKworICAgICAgICBmaW5hbCBTdHJpbmcgamF4UnNBcHAgPSBhcmdzLmxlbmd0aCA+IDAgPyBhcmdzWzBdIDogbnVsbDsKKyAgICAgICAgLy9ub2luc3BlY3Rpb24gdW5jaGVja2VkCisgICAgICAgIGZpbmFsIFJlc291cmNlQ29uZmlnIHJlc291cmNlQ29uZmlnID0gUmVzb3VyY2VDb25maWcKKyAgICAgICAgICAgICAgICAuZm9yQXBwbGljYXRpb25DbGFzcygoQ2xhc3M8PyBleHRlbmRzIEFwcGxpY2F0aW9uPikgQ2xhc3MuZm9yTmFtZShqYXhSc0FwcCkpOworICAgICAgICBVUkkgYmFzZVVyaSA9IGFyZ3MubGVuZ3RoID4gMSA/IFVSSS5jcmVhdGUoYXJnc1sxXSkgOiBCQVNFX1VSSTsKKyAgICAgICAgaW50IHNlbGVjdG9ycyA9IGFyZ3MubGVuZ3RoID4gMiA/IEludGVnZXIucGFyc2VJbnQoYXJnc1syXSkgOiBERUZBVUxUX1NFTEVDVE9SUzsKKyAgICAgICAgaW50IHdvcmtlcnMgPSBhcmdzLmxlbmd0aCA+IDMgPyBJbnRlZ2VyLnBhcnNlSW50KGFyZ3NbM10pIDogREVGQVVMVF9XT1JLRVJTOworICAgICAgICBmaW5hbCBIdHRwU2VydmVyIHNlcnZlciA9IEdyaXp6bHlIdHRwU2VydmVyRmFjdG9yeS5jcmVhdGVIdHRwU2VydmVyKGJhc2VVcmksIHJlc291cmNlQ29uZmlnLCBmYWxzZSk7CisgICAgICAgIGZpbmFsIFRDUE5JT1RyYW5zcG9ydCB0cmFuc3BvcnQgPSBzZXJ2ZXIuZ2V0TGlzdGVuZXIoImdyaXp6bHkiKS5nZXRUcmFuc3BvcnQoKTsKKyAgICAgICAgdHJhbnNwb3J0LnNldFNlbGVjdG9yUnVubmVyc0NvdW50KHNlbGVjdG9ycyk7CisgICAgICAgIHRyYW5zcG9ydC5zZXRXb3JrZXJUaHJlYWRQb29sQ29uZmlnKFRocmVhZFBvb2xDb25maWcuZGVmYXVsdENvbmZpZygpLnNldENvcmVQb29sU2l6ZSh3b3JrZXJzKS5zZXRNYXhQb29sU2l6ZSh3b3JrZXJzKSk7CisKKyAgICAgICAgc2VydmVyLnN0YXJ0KCk7CisKKyAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFN0cmluZy5mb3JtYXQoIkFwcGxpY2F0aW9uIHN0YXJ0ZWQuXG5Ucnkgb3V0ICVzXG5IaXQgQ3RybC1DIHRvIHN0b3AgaXQuLi4iLAorICAgICAgICAgICAgICAgIGJhc2VVcmkpKTsKKworICAgICAgICB3aGlsZSAoc2VydmVyLmlzU3RhcnRlZCgpKSB7CisgICAgICAgICAgICBUaHJlYWQuc2xlZXAoNjAwMDAwKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3J1bm5lcnMvamVyc2V5LWdyaXp6bHktcnVubmVyL3N0YXJ0LnNoIGIvdGVzdHMvcGVyZm9ybWFuY2UvcnVubmVycy9qZXJzZXktZ3JpenpseS1ydW5uZXIvc3RhcnQuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZkNDVlNAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3J1bm5lcnMvamVyc2V5LWdyaXp6bHktcnVubmVyL3N0YXJ0LnNoCkBAIC0wLDAgKzEsMzYgQEAKKyMhL2Jpbi9iYXNoCisjCisjIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorIworIyBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisjIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyMgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisjIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyMKKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisjCisKK0xJQlM9JChmb3IgbCBpbiBgbHMgbGliYDsgZG8gZWNobyAtbiBsaWIvJGwiOiI7ZG9uZSkKK0xJQlM9YGVjaG8gJExJQlMgfCBzZWQgLWVzJy86JC8vJ2AKKworQVBQPSQoZm9yIGwgaW4gYGxzIGFwcGA7IGRvIGVjaG8gLW4gYXBwLyRsIjoiO2RvbmUpCitBUFA9YGVjaG8gJEFQUCB8IHNlZCAtZXMnLzokLy8nYAorCitub2h1cCBqYXZhIC1zZXJ2ZXIgLVhtczUxMm0gLVhteDEwMjRtIC1YWDpQZXJtU2l6ZT0yNTZtIC1YWDpNYXhQZXJtU2l6ZT01MTJtIFwKKyAgICAgIC1YWDorVXNlUGFyYWxsZWxHQyAtWFg6K0FnZ3Jlc3NpdmVPcHRzIC1YWDorVXNlRmFzdEFjY2Vzc29yTWV0aG9kcyBcCisgICAgICAtY3AgJEFQUDokTElCUyBcCisgICAgICAtRGphdmEubmV0LnByZWZlcklQdjRTdGFjaz10cnVlIFwKKyAgICAgIC1EY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZSBcCisgICAgICAtRGNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUucG9ydD0xMTExMiBcCisgICAgICAtRGNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUuYXV0aGVudGljYXRlPWZhbHNlIFwKKyAgICAgIC1EY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZS5zc2w9ZmFsc2UgXAorICAgICAgLURjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLmxvY2FsLm9ubHk9ZmFsc2UgXAorICAgICAgJEpBVkFfT1BUSU9OUyBcCisgICAgICBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5ydW5uZXJzLkplcnNleUdyaXp6bHlSdW5uZXIgJCogJgorZWNobyAkISA+IGdyaXp6bHkucGlkCit3YWl0CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS9ydW5uZXJzL2plcnNleS1ncml6emx5LXJ1bm5lci9zdG9wLnNoIGIvdGVzdHMvcGVyZm9ybWFuY2UvcnVubmVycy9qZXJzZXktZ3JpenpseS1ydW5uZXIvc3RvcC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGVhNDljCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvcnVubmVycy9qZXJzZXktZ3JpenpseS1ydW5uZXIvc3RvcC5zaApAQCAtMCwwICsxLDIyIEBACisjIS9iaW4vYmFzaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisjIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyMKKyMgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorIyBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisjIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorIyB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisjCisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorIworCitpZiB0ZXN0IC1mIGdyaXp6bHkucGlkOyB0aGVuCisgIGtpbGwgLTkgYGNhdCBncml6emx5LnBpZGAKKyAgcm0gZ3JpenpseS5waWQKK2ZpCisKZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3J1bm5lcnMvamVyc2V5LXdscy1ydW5uZXIvZGVwbG95LnNoIGIvdGVzdHMvcGVyZm9ybWFuY2UvcnVubmVycy9qZXJzZXktd2xzLXJ1bm5lci9kZXBsb3kuc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjYxMDMwYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3J1bm5lcnMvamVyc2V5LXdscy1ydW5uZXIvZGVwbG95LnNoCkBAIC0wLDAgKzEsMjUgQEAKKyMhL2Jpbi9iYXNoCisjCisjIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorIworIyBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyMgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorIworIyBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisjIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyMgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisjIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyMKKyMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisjCisKK0ZJTEU9JDEKKworVEFSR0VUPSRQV0QvdGFyZ2V0CitURVNUX0RPTUFJTj1gY2F0ICRUQVJHRVQvdGVzdF9kb21haW4udHh0YAorCisuICRURVNUX0RPTUFJTi9iaW4vc2V0RG9tYWluRW52LnNoCisKK2phdmEgd2VibG9naWMuRGVwbG95ZXIgLXVzZXJuYW1lIHdlYmxvZ2ljIC1wYXNzd29yZCB3ZWJsb2dpYzEgLWRlcGxveSAkRklMRQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvcnVubmVycy9qZXJzZXktd2xzLXJ1bm5lci9pbnN0YWxsLnNoIGIvdGVzdHMvcGVyZm9ybWFuY2UvcnVubmVycy9qZXJzZXktd2xzLXJ1bm5lci9pbnN0YWxsLnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyOWVmZDgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS9ydW5uZXJzL2plcnNleS13bHMtcnVubmVyL2luc3RhbGwuc2gKQEAgLTAsMCArMSw0MyBAQAorIyEvYmluL2Jhc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisjCisjIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyMgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorIyBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyMgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorIworIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyMKKworV0VCTE9HSUNfVVJMPSQxCisKK1RBUkdFVD0kUFdEL3RhcmdldAorT1BUPSRUQVJHRVQvb3B0CisKK3JtIC1yZiAkVEFSR0VUCitta2RpciAtcCAkT1BUCisKK2NkICRUQVJHRVQKK3JtIC1mIHdscy5qYXIKK3dnZXQgLS1uby1wcm94eSAkV0VCTE9HSUNfVVJMIC1PIHdscy5qYXIKKworY2QgJE9QVAoramF2YSAtamFyICRUQVJHRVQvd2xzLmphcgorY2Qgd2xzKgorCitNV19IT01FPWBwd2RgCitlY2hvICRNV19IT01FID4gJFRBUkdFVC9td19ob21lLnR4dAorCisuICRNV19IT01FL3dsc2VydmVyL3NlcnZlci9iaW4vc2V0V0xTRW52LnNoCisKK1RFU1RfRE9NQUlOPSRNV19IT01FL2h1ZHNvbl90ZXN0X2RvbWFpbgorCitta2RpciAtcCAkVEVTVF9ET01BSU4KK2NkICRURVNUX0RPTUFJTgorCmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS9ydW5uZXJzL2plcnNleS13bHMtcnVubmVyL3N0YXJ0LnNoIGIvdGVzdHMvcGVyZm9ybWFuY2UvcnVubmVycy9qZXJzZXktd2xzLXJ1bm5lci9zdGFydC5zaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDhmN2VmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvcnVubmVycy9qZXJzZXktd2xzLXJ1bm5lci9zdGFydC5zaApAQCAtMCwwICsxLDcxIEBACisjIS9iaW4vYmFzaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisjIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyMKKyMgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorIyBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisjIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorIyB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisjCisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorIworCitUQVJHRVQ9JFBXRC90YXJnZXQKK01XX0hPTUU9YGNhdCAkVEFSR0VUL213X2hvbWUudHh0YAorVEVTVF9ET01BSU49JE1XX0hPTUUvaHVkc29uX3Rlc3RfZG9tYWluCitET01BSU5fTkFNRT1IdWRzb25UZXN0RG9tYWluCitTRVJWRVJfTkFNRT1IdWRzb25UZXN0U2VydmVyCitQSURfRklMRT0kVEFSR0VUL3dscy5waWQKKworZWNobyAkVEVTVF9ET01BSU4gPiAkVEFSR0VUL3Rlc3RfZG9tYWluLnR4dAorCitjZCAkTVdfSE9NRQorLiAkTVdfSE9NRS93bHNlcnZlci9zZXJ2ZXIvYmluL3NldFdMU0Vudi5zaAorCitybSAtcmYgJFRFU1RfRE9NQUlOCitta2RpciAtcCAkVEVTVF9ET01BSU4KK2NkICRURVNUX0RPTUFJTgorCitybSAtZiAkVEFSR0VUL2F1dG9kZXBsb3kKK2xuIC1zICRURVNUX0RPTUFJTi9hdXRvZGVwbG95ICRUQVJHRVQvYXV0b2RlcGxveQorCitybSAtZiAkVEFSR0VUL3NlcnZlci5sb2cKK3JtIC1mICRUQVJHRVQvZG9tYWluLmxvZworbG4gLXMgJFRFU1RfRE9NQUlOL3NlcnZlcnMvJFNFUlZFUl9OQU1FL2xvZ3MvJFNFUlZFUl9OQU1FLmxvZyAkVEFSR0VUL3NlcnZlci5sb2cKK2xuIC1zICRURVNUX0RPTUFJTi9zZXJ2ZXJzLyRTRVJWRVJfTkFNRS9sb2dzLyRET01BSU5fTkFNRS5sb2cgJFRBUkdFVC9kb21haW4ubG9nCisKK0pBVkFfT1BUSU9OUz0iLWphdmFhZ2VudDokSE9NRS9qZXJzZXktcGVyZnRlc3QtYWdlbnQuamFyIgorCit5ZXMgfCBub2h1cCBqYXZhIC1zZXJ2ZXIgXAorICAgICAgLVhtczEwMjRtIFwKKyAgICAgIC1YbXgxMDI0bSBcCisgICAgICAtWFg6TWF4UGVybVNpemU9MjU2bSBcCisgICAgICAtRHdlYmxvZ2ljLkRvbWFpbj0kRE9NQUlOX05BTUUgXAorICAgICAgLUR3ZWJsb2dpYy5OYW1lPSRTRVJWRVJfTkFNRSBcCisgICAgICAtRHdlYmxvZ2ljLm1hbmFnZW1lbnQudXNlcm5hbWU9d2VibG9naWMgXAorICAgICAgLUR3ZWJsb2dpYy5tYW5hZ2VtZW50LnBhc3N3b3JkPXdlYmxvZ2ljMSBcCisgICAgICAtRHdlYmxvZ2ljLkxpc3RlblBvcnQ9NzAwMSBcCisgICAgICAtRGphdmEuc2VjdXJpdHkuZWdkPWZpbGU6L2Rldi8uL3VyYW5kb20gXAorICAgICAgLURqYXZhLm5ldC5wcmVmZXJJUHY0U3RhY2s9dHJ1ZSBcCisgICAgICAtRGNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUgXAorICAgICAgLURjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLnBvcnQ9MTExMTIgXAorICAgICAgLURjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLmF1dGhlbnRpY2F0ZT1mYWxzZSBcCisgICAgICAtRGNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUuc3NsPWZhbHNlIFwKKyAgICAgIC1EY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZS5sb2NhbC5vbmx5PWZhbHNlIFwKKyAgICAgICRKQVZBX09QVElPTlMgXAorICAgICAgd2VibG9naWMuU2VydmVyICYKKworZWNobyAkISA+ICRQSURfRklMRQorCisjIHdhaXQgZm9yIHNlcnZlciB0byBzdGFydAorZWNobyAiKioqKioqKiogV0FJVElORyBGT1IgU0VSVkVSIFRPIFNUQVJUIgord2hpbGUgWyAhIGB3Z2V0IC1xIC0tc2VydmVyLXJlc3BvbnNlIC0tbm8tcHJveHkgaHR0cDovL2xvY2FsaG9zdDo3MDAxIDI+JjEgfCBhd2sgJy9eICBIVFRQL3twcmludCAkMn0nYCBdOyBkbworICBzbGVlcCA1CisgIGVjaG8gIioiCitkb25lCitlY2hvICIqKioqKioqKiBTRVJWRVIgSVMgUkVBRFkiCmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS9ydW5uZXJzL2plcnNleS13bHMtcnVubmVyL3N0b3Auc2ggYi90ZXN0cy9wZXJmb3JtYW5jZS9ydW5uZXJzL2plcnNleS13bHMtcnVubmVyL3N0b3Auc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI3NjkxYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3J1bm5lcnMvamVyc2V5LXdscy1ydW5uZXIvc3RvcC5zaApAQCAtMCwwICsxLDI0IEBACisjIS9iaW4vYmFzaAorIworIyBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMKKyMgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisjIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisjIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyMKKyMgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorIyBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisjIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorIyB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisjCisjIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorIworCitUQVJHRVQ9JFBXRC90YXJnZXQKK1BJRF9GSUxFPSRUQVJHRVQvd2xzLnBpZAorCitpZiB0ZXN0IC1mICRQSURfRklMRTsgdGhlbgorICAgIGtpbGwgLTkgYGNhdCAkUElEX0ZJTEVgCisgICAgcm0gJFBJRF9GSUxFCitmaQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvcnVubmVycy9wb20ueG1sIGIvdGVzdHMvcGVyZm9ybWFuY2UvcnVubmVycy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwZGM0ZDAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS9ydW5uZXJzL3BvbS54bWwKQEAgLTAsMCArMSw0MSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZTwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLnJ1bm5lcnM8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgorICAgIDxuYW1lPmplcnNleS10ZXN0cy1wZXJmb3JtYW5jZS1ydW5uZXJzPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBQZXJmb3JtYW5jZSB0ZXN0IHJ1bm5lcnMuCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxtb2R1bGVzPgorICAgICAgICA8bW9kdWxlPmplcnNleS1ncml6emx5LXJ1bm5lcjwvbW9kdWxlPgorICAgIDwvbW9kdWxlcz4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvYXNzZW1ibGllcy9wb20ueG1sIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9hc3NlbWJsaWVzL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RkMmM0NgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvYXNzZW1ibGllcy9wb20ueG1sCkBAIC0wLDAgKzEsMzUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UudGVzdGNhc2VzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+YXNzZW1ibGllczwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorCisgICAgPG5hbWU+amVyc2V5LXRlc3RzLXBlcmZvcm1hbmNlLWFzc2VtYmxpZXM8L25hbWU+CisgICAgPGRlc2NyaXB0aW9uPkplcnNleSBwZXJmb3JtYW5jZSB0ZXN0LWNhc2VzIHNoYXJlZCBhc3NlbWJseSB0eXBlcy48L2Rlc2NyaXB0aW9uPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2Fzc2VtYmxpZXMvc3JjL21haW4vcmVzb3VyY2VzL2Fzc2VtYmxpZXMvd2FyLnhtbCBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvYXNzZW1ibGllcy9zcmMvbWFpbi9yZXNvdXJjZXMvYXNzZW1ibGllcy93YXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3Y2M2MjgKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2Fzc2VtYmxpZXMvc3JjL21haW4vcmVzb3VyY2VzL2Fzc2VtYmxpZXMvd2FyLnhtbApAQCAtMCwwICsxLDQyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxhc3NlbWJseSB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAiCisgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvcGx1Z2lucy9tYXZlbi1hc3NlbWJseS1wbHVnaW4vYXNzZW1ibHkvMS4xLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL2Fzc2VtYmx5LTEuMS4wLnhzZCI+CisgICAgPGlkPndhcjwvaWQ+CisgICAgPGZvcm1hdHM+CisgICAgICAgIDxmb3JtYXQ+d2FyPC9mb3JtYXQ+CisgICAgPC9mb3JtYXRzPgorICAgIDxpbmNsdWRlQmFzZURpcmVjdG9yeT5mYWxzZTwvaW5jbHVkZUJhc2VEaXJlY3Rvcnk+CisgICAgPGRlcGVuZGVuY3lTZXRzPgorICAgICAgICA8ZGVwZW5kZW5jeVNldD4KKyAgICAgICAgICAgIDxvdXRwdXREaXJlY3Rvcnk+L1dFQi1JTkYvbGliPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICA8dXNlUHJvamVjdEFydGlmYWN0PnRydWU8L3VzZVByb2plY3RBcnRpZmFjdD4KKyAgICAgICAgICAgIDx1bnBhY2s+ZmFsc2U8L3VucGFjaz4KKyAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5U2V0PgorICAgIDwvZGVwZW5kZW5jeVNldHM+CisgICAgPGZpbGVTZXRzPgorICAgICAgICA8ZmlsZVNldD4KKyAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vd2ViYXBwPC9kaXJlY3Rvcnk+CisgICAgICAgICAgICA8b3V0cHV0RGlyZWN0b3J5Pi88L291dHB1dERpcmVjdG9yeT4KKyAgICAgICAgPC9maWxlU2V0PgorICAgIDwvZmlsZVNldHM+Cis8L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9hc3NlbWJsaWVzL3NyYy9tYWluL3Jlc291cmNlcy9hc3NlbWJsaWVzL3ppcC13aXRoLWphcnMueG1sIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9hc3NlbWJsaWVzL3NyYy9tYWluL3Jlc291cmNlcy9hc3NlbWJsaWVzL3ppcC13aXRoLWphcnMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NWY4ZjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2Fzc2VtYmxpZXMvc3JjL21haW4vcmVzb3VyY2VzL2Fzc2VtYmxpZXMvemlwLXdpdGgtamFycy54bWwKQEAgLTAsMCArMSwzNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8YXNzZW1ibHkgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIgorICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3BsdWdpbnMvbWF2ZW4tYXNzZW1ibHktcGx1Z2luL2Fzc2VtYmx5LzEuMS4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9hc3NlbWJseS0xLjEuMC54c2QiPgorICAgIDxpZD56aXAtd2l0aC1qYXJzPC9pZD4KKyAgICA8Zm9ybWF0cz4KKyAgICAgICAgPGZvcm1hdD56aXA8L2Zvcm1hdD4KKyAgICA8L2Zvcm1hdHM+CisgICAgPGluY2x1ZGVCYXNlRGlyZWN0b3J5PmZhbHNlPC9pbmNsdWRlQmFzZURpcmVjdG9yeT4KKyAgICA8ZGVwZW5kZW5jeVNldHM+CisgICAgICAgIDxkZXBlbmRlbmN5U2V0PgorICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4vPC9vdXRwdXREaXJlY3Rvcnk+CisgICAgICAgICAgICA8dXNlUHJvamVjdEFydGlmYWN0PnRydWU8L3VzZVByb2plY3RBcnRpZmFjdD4KKyAgICAgICAgICAgIDx1bnBhY2s+ZmFsc2U8L3VucGFjaz4KKyAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5U2V0PgorICAgIDwvZGVwZW5kZW5jeVNldHM+Cis8L2Fzc2VtYmx5PgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9maWx0ZXItZHluYW1pYy9wb20ueG1sIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9maWx0ZXItZHluYW1pYy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMjA4ZTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ZpbHRlci1keW5hbWljL3BvbS54bWwKQEAgLTAsMCArMSw2MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS50ZXN0Y2FzZXM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5maWx0ZXItZHluYW1pYzwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorCisgICAgPG5hbWU+amVyc2V5LXRlc3RzLXBlcmZvcm1hbmNlLWZpbHRlci1keW5hbWljLXRlc3Q8L25hbWU+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPHByb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+VVRGLTg8L3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+CisgICAgPC9wcm9wZXJ0aWVzPgorCisgICAgPGRlcGVuZGVuY2llcz4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LndzLnJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXgud3MucnMtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWdyaXp6bHkyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ZpbHRlci1keW5hbWljL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvZmlsdGVyL2R5bmFtaWMvRHluYW1pY0ZpbHRlckZlYXR1cmUuamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvZmlsdGVyLWR5bmFtaWMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9maWx0ZXIvZHluYW1pYy9EeW5hbWljRmlsdGVyRmVhdHVyZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1MzkxNDkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ZpbHRlci1keW5hbWljL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvZmlsdGVyL2R5bmFtaWMvRHluYW1pY0ZpbHRlckZlYXR1cmUuamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmZpbHRlci5keW5hbWljOworCitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkR5bmFtaWNGZWF0dXJlOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5SZXNvdXJjZUluZm87CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5GZWF0dXJlQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKKworLyoqCisgKiBEeW5hbWljIGZlYXR1cmUgdG8gcmVnaXN0ZXIgY3VzdG9tIGZpbHRlci4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUHJvdmlkZXIKK3B1YmxpYyBjbGFzcyBEeW5hbWljRmlsdGVyRmVhdHVyZSBpbXBsZW1lbnRzIER5bmFtaWNGZWF0dXJlIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShSZXNvdXJjZUluZm8gcmVzb3VyY2VJbmZvLCBGZWF0dXJlQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGlmIChEeW5hbWljYWxseUJvdW5kRmlsdGVyUmVzb3VyY2UuY2xhc3MgPT0gcmVzb3VyY2VJbmZvLmdldFJlc291cmNlQ2xhc3MoKSkgeworICAgICAgICAgICAgY29udGV4dC5yZWdpc3RlcihEeW5hbWljYWxseUJvdW5kRmlsdGVyLmNsYXNzKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvZmlsdGVyLWR5bmFtaWMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9maWx0ZXIvZHluYW1pYy9EeW5hbWljYWxseUJvdW5kRmlsdGVyLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ZpbHRlci1keW5hbWljL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvZmlsdGVyL2R5bmFtaWMvRHluYW1pY2FsbHlCb3VuZEZpbHRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzZGE1OTEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ZpbHRlci1keW5hbWljL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvZmlsdGVyL2R5bmFtaWMvRHluYW1pY2FsbHlCb3VuZEZpbHRlci5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuZmlsdGVyLmR5bmFtaWM7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5TZXF1ZW5jZUlucHV0U3RyZWFtOworCitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlc3BvbnNlRmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworLyoqCisgKiBDdXN0b20gZmlsdGVyLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQcm92aWRlcgorcHVibGljIGNsYXNzIER5bmFtaWNhbGx5Qm91bmRGaWx0ZXIgaW1wbGVtZW50cyBDb250YWluZXJSZXF1ZXN0RmlsdGVyLCBDb250YWluZXJSZXNwb25zZUZpbHRlciB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChyZXF1ZXN0Q29udGV4dC5oYXNFbnRpdHkoKSkgeworICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuc2V0RW50aXR5U3RyZWFtKG5ldyBTZXF1ZW5jZUlucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgiRFlOX01BVENIX0lOIi5nZXRCeXRlcygpKSwKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdENvbnRleHQuZ2V0RW50aXR5U3RyZWFtKCkpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGZpbHRlcihDb250YWluZXJSZXF1ZXN0Q29udGV4dCByZXF1ZXN0Q29udGV4dCwgQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0IHJlc3BvbnNlQ29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgaWYgKHJlc3BvbnNlQ29udGV4dC5oYXNFbnRpdHkoKSkgeworICAgICAgICAgICAgcmVzcG9uc2VDb250ZXh0LnNldEVudGl0eSgiIiArIHJlc3BvbnNlQ29udGV4dC5nZXRFbnRpdHkoKSArICJEWU5fTUFUQ0hfT1VUIiwgbnVsbCwgTWVkaWFUeXBlLlRFWFRfUExBSU5fVFlQRSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ZpbHRlci1keW5hbWljL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvZmlsdGVyL2R5bmFtaWMvRHluYW1pY2FsbHlCb3VuZEZpbHRlclJlc291cmNlLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ZpbHRlci1keW5hbWljL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvZmlsdGVyL2R5bmFtaWMvRHluYW1pY2FsbHlCb3VuZEZpbHRlclJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE2NDdjOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvZmlsdGVyLWR5bmFtaWMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9maWx0ZXIvZHluYW1pYy9EeW5hbWljYWxseUJvdW5kRmlsdGVyUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmZpbHRlci5keW5hbWljOworCisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5NZWRpYVR5cGU7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBVVDsKKworLyoqCisgKiBGaWx0ZXJlZCByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiLyIpCitAQ29uc3VtZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCitAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCitwdWJsaWMgY2xhc3MgRHluYW1pY2FsbHlCb3VuZEZpbHRlclJlc291cmNlIHsKKworICAgIEBQT1NUCisgICAgcHVibGljIFN0cmluZyBlY2hvKGZpbmFsIFN0cmluZyB0ZXh0KSB7CisgICAgICAgIHJldHVybiB0ZXh0OworICAgIH0KKworICAgIEBQVVQKKyAgICBwdWJsaWMgdm9pZCBwdXQoZmluYWwgU3RyaW5nIHRleHQpIHsKKyAgICB9CisKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgIHJldHVybiAidGV4dCI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9maWx0ZXItZHluYW1pYy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ZpbHRlci9keW5hbWljL0pheFJzQXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvZmlsdGVyLWR5bmFtaWMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9maWx0ZXIvZHluYW1pYy9KYXhSc0FwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU2OGMxNgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvZmlsdGVyLWR5bmFtaWMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9maWx0ZXIvZHluYW1pYy9KYXhSc0FwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5maWx0ZXIuZHluYW1pYzsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCisvKioKKyAqIFRlc3QgY2FzZSBKQVgtUlMgYXBwbGljYXRpb24uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEpheFJzQXBwbGljYXRpb24gZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKyAgICBzdGF0aWMgZmluYWwgU2V0PENsYXNzPD8+PiBBUFBfQ0xBU1NFUyA9IG5ldyBIYXNoU2V0PENsYXNzPD8+PigpeworICAgICAgICB7CisgICAgICAgICBhZGQoRHluYW1pY2FsbHlCb3VuZEZpbHRlclJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgIGFkZChEeW5hbWljRmlsdGVyRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgcmV0dXJuIEFQUF9DTEFTU0VTOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvZmlsdGVyLWR5bmFtaWMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvZmlsdGVyLWR5bmFtaWMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWM1M2ZlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9maWx0ZXItZHluYW1pYy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMy4xIgorICAgICAgICAgeG1sbnM9Imh0dHA6Ly94bWxucy5qY3Aub3JnL3htbC9ucy9qYXZhZWUiCisgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8veG1sbnMuamNwLm9yZy94bWwvbnMvamF2YWVlIGh0dHA6Ly94bWxucy5qY3Aub3JnL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8zXzEueHNkIj4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkpheFJzQXBwbGljYXRpb248L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LndzLnJzLkFwcGxpY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmZpbHRlci5keW5hbWljLkpheFJzQXBwbGljYXRpb248L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkpheFJzQXBwbGljYXRpb248L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvZmlsdGVyLWR5bmFtaWMvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9maWx0ZXIvZHluYW1pYy9GaWx0ZXJUZXN0LmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ZpbHRlci1keW5hbWljL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvZmlsdGVyL2R5bmFtaWMvRmlsdGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhMzEwOTMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ZpbHRlci1keW5hbWljL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvZmlsdGVyL2R5bmFtaWMvRmlsdGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuZmlsdGVyLmR5bmFtaWM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBUZXN0IGZvciBpbnRlcmNlcHRlZCB0ZXh0IHBsYWluIHJlc291cmNlLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBGaWx0ZXJUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IEpheFJzQXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXQoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBnZXRSZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0RFlOX01BVENIX09VVCIsIGdldFJlc3BvbnNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0KCkgeworICAgICAgICBmaW5hbCBTdHJpbmdbXSB0ZXN0RGF0YSA9IG5ldyBTdHJpbmdbXSB7Im9uZSIsICJ0d28iLCAidGhyZWUiIH07CisgICAgICAgIGZvciAoU3RyaW5nIG9yaWdpbmFsIDogdGVzdERhdGEpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwb3N0UmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkudGV4dChvcmlnaW5hbCksIFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkRZTl9NQVRDSF9JTiIgKyBvcmlnaW5hbCArICJEWU5fTUFUQ0hfT1VUIiwgcG9zdFJlc3BvbnNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFB1dCgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcHV0UmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkucHV0KEVudGl0eS50ZXh0KCJ0ZXh0IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjA0LCBwdXRSZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9maWx0ZXItZ2xvYmFsL3BvbS54bWwgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ZpbHRlci1nbG9iYWwvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWMwMGVhCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9maWx0ZXItZ2xvYmFsL3BvbS54bWwKQEAgLTAsMCArMSw2MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS50ZXN0Y2FzZXM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5maWx0ZXItZ2xvYmFsPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisKKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtcGVyZm9ybWFuY2UtZmlsdGVyLWdsb2JhbC10ZXN0PC9uYW1lPgorCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxwcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPlVURi04PC9wcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPgorICAgIDwvcHJvcGVydGllcz4KKworICAgIDxkZXBlbmRlbmNpZXM+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC53cy5yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LndzLnJzLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1ncml6emx5MjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9maWx0ZXItZ2xvYmFsL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvZmlsdGVyL2dsb2JhbC9HbG9iYWxGaWx0ZXIuamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvZmlsdGVyLWdsb2JhbC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ZpbHRlci9nbG9iYWwvR2xvYmFsRmlsdGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU0NDQ4MgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvZmlsdGVyLWdsb2JhbC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ZpbHRlci9nbG9iYWwvR2xvYmFsRmlsdGVyLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5maWx0ZXIuZ2xvYmFsOworCitpbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uU2VxdWVuY2VJbnB1dFN0cmVhbTsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVxdWVzdEZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuQ29udGFpbmVyUmVzcG9uc2VDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUZpbHRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CisKKy8qKgorICogR2xvYmFsIGN1c3RvbSBmaWx0ZXIuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFByb3ZpZGVyCitwdWJsaWMgY2xhc3MgR2xvYmFsRmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciwgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXIgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAocmVxdWVzdENvbnRleHQuaGFzRW50aXR5KCkpIHsKKyAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LnNldEVudGl0eVN0cmVhbShuZXcgU2VxdWVuY2VJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oIlBSRV9NQVRDSF9JTiIuZ2V0Qnl0ZXMoKSksCisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LmdldEVudGl0eVN0cmVhbSgpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsIENvbnRhaW5lclJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChyZXNwb25zZUNvbnRleHQuaGFzRW50aXR5KCkpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlQ29udGV4dC5zZXRFbnRpdHkoIiIgKyByZXNwb25zZUNvbnRleHQuZ2V0RW50aXR5KCkgKyAiUFJFX01BVENIX09VVCIsIG51bGwsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9maWx0ZXItZ2xvYmFsL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvZmlsdGVyL2dsb2JhbC9KYXhSc0FwcGxpY2F0aW9uLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ZpbHRlci1nbG9iYWwvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9maWx0ZXIvZ2xvYmFsL0pheFJzQXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWViMDdkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9maWx0ZXItZ2xvYmFsL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvZmlsdGVyL2dsb2JhbC9KYXhSc0FwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5maWx0ZXIuZ2xvYmFsOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKKy8qKgorICogVGVzdCBjYXNlIEpBWC1SUyBhcHBsaWNhdGlvbi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSmF4UnNBcHBsaWNhdGlvbiBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKworICAgIHN0YXRpYyBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IEFQUF9DTEFTU0VTID0gbmV3IEhhc2hTZXQ8Q2xhc3M8Pz4+KCl7CisgICAgICAgIHsKKyAgICAgICAgIGFkZChUZXh0RW50aXR5UmVzb3VyY2UuY2xhc3MpOworICAgICAgICAgYWRkKEdsb2JhbEZpbHRlci5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgcmV0dXJuIEFQUF9DTEFTU0VTOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvZmlsdGVyLWdsb2JhbC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ZpbHRlci9nbG9iYWwvVGV4dEVudGl0eVJlc291cmNlLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ZpbHRlci1nbG9iYWwvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9maWx0ZXIvZ2xvYmFsL1RleHRFbnRpdHlSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMWNlNzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ZpbHRlci1nbG9iYWwvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9maWx0ZXIvZ2xvYmFsL1RleHRFbnRpdHlSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuZmlsdGVyLmdsb2JhbDsKKworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QVVQ7CisKKy8qKgorICogVGVzdCByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiLyIpCitAQ29uc3VtZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCitAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCitwdWJsaWMgY2xhc3MgVGV4dEVudGl0eVJlc291cmNlIHsKKworICAgIEBQT1NUCisgICAgcHVibGljIFN0cmluZyBlY2hvKGZpbmFsIFN0cmluZyB0ZXh0KSB7CisgICAgICAgIHJldHVybiB0ZXh0OworICAgIH0KKworICAgIEBQVVQKKyAgICBwdWJsaWMgdm9pZCBwdXQoZmluYWwgU3RyaW5nIHRleHQpIHsKKyAgICB9CisKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgIHJldHVybiAidGV4dCI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9maWx0ZXItZ2xvYmFsL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ZpbHRlci1nbG9iYWwvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzIzNzNiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9maWx0ZXItZ2xvYmFsL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwzOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIzLjEiCisgICAgICAgICB4bWxucz0iaHR0cDovL3htbG5zLmpjcC5vcmcveG1sL25zL2phdmFlZSIKKyAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly94bWxucy5qY3Aub3JnL3htbC9ucy9qYXZhZWUgaHR0cDovL3htbG5zLmpjcC5vcmcveG1sL25zL2phdmFlZS93ZWItYXBwXzNfMS54c2QiPgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SmF4UnNBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuZmlsdGVyLmdsb2JhbC5KYXhSc0FwcGxpY2F0aW9uPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5KYXhSc0FwcGxpY2F0aW9uPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ZpbHRlci1nbG9iYWwvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9maWx0ZXIvZ2xvYmFsL0ZpbHRlclRlc3QuamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvZmlsdGVyLWdsb2JhbC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ZpbHRlci9nbG9iYWwvRmlsdGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZmU1YWQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ZpbHRlci1nbG9iYWwvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9maWx0ZXIvZ2xvYmFsL0ZpbHRlclRlc3QuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmZpbHRlci5nbG9iYWw7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBUZXN0IGZvciBpbnRlcmNlcHRlZCB0ZXh0IHBsYWluIHJlc291cmNlLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBGaWx0ZXJUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IEpheFJzQXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXQoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBnZXRSZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0UFJFX01BVENIX09VVCIsIGdldFJlc3BvbnNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0KCkgeworICAgICAgICBmaW5hbCBTdHJpbmdbXSB0ZXN0RGF0YSA9IG5ldyBTdHJpbmdbXSB7Im9uZSIsICJ0d28iLCAidGhyZWUiIH07CisgICAgICAgIGZvciAoU3RyaW5nIG9yaWdpbmFsIDogdGVzdERhdGEpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwb3N0UmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkudGV4dChvcmlnaW5hbCksIFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIlBSRV9NQVRDSF9JTiIgKyBvcmlnaW5hbCArICJQUkVfTUFUQ0hfT1VUIiwgcG9zdFJlc3BvbnNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFB1dCgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcHV0UmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkucHV0KEVudGl0eS50ZXh0KCJ0ZXh0IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjA0LCBwdXRSZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9maWx0ZXItbmFtZS9wb20ueG1sIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9maWx0ZXItbmFtZS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNzczOWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ZpbHRlci1uYW1lL3BvbS54bWwKQEAgLTAsMCArMSw2MiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS50ZXN0Y2FzZXM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5maWx0ZXItbmFtZTwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorCisgICAgPG5hbWU+amVyc2V5LXRlc3RzLXBlcmZvcm1hbmNlLWZpbHRlci1uYW1lLXRlc3Q8L25hbWU+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPHByb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+VVRGLTg8L3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+CisgICAgPC9wcm9wZXJ0aWVzPgorCisgICAgPGRlcGVuZGVuY2llcz4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LndzLnJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXgud3MucnMtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWdyaXp6bHkyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ZpbHRlci1uYW1lL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvZmlsdGVyL25hbWUvRmlsdGVyZWQuamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvZmlsdGVyLW5hbWUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9maWx0ZXIvbmFtZS9GaWx0ZXJlZC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MjhiNjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ZpbHRlci1uYW1lL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvZmlsdGVyL25hbWUvRmlsdGVyZWQuamF2YQpAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmZpbHRlci5uYW1lOworCitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OworCitpbXBvcnQgamF2YXgud3MucnMuTmFtZUJpbmRpbmc7CisKKy8qKgorICogQ3VzdG9tIGJpbmRpbmcgYW5ub3RhdGlvbi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitATmFtZUJpbmRpbmcKK0BUYXJnZXQoe0VsZW1lbnRUeXBlLlRZUEUsIEVsZW1lbnRUeXBlLk1FVEhPRH0pCitwdWJsaWMgQGludGVyZmFjZSBGaWx0ZXJlZCB7fQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9maWx0ZXItbmFtZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ZpbHRlci9uYW1lL0pheFJzQXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvZmlsdGVyLW5hbWUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9maWx0ZXIvbmFtZS9KYXhSc0FwcGxpY2F0aW9uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQxZWNjNwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvZmlsdGVyLW5hbWUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9maWx0ZXIvbmFtZS9KYXhSc0FwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5maWx0ZXIubmFtZTsKKworaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCisvKioKKyAqIFRlc3QgY2FzZSBKQVgtUlMgYXBwbGljYXRpb24uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEpheFJzQXBwbGljYXRpb24gZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKyAgICBzdGF0aWMgZmluYWwgU2V0PENsYXNzPD8+PiBBUFBfQ0xBU1NFUyA9IG5ldyBIYXNoU2V0PENsYXNzPD8+PigpeworICAgICAgICB7CisgICAgICAgICBhZGQoTmFtZUJvdW5kRmlsdGVyUmVzb3VyY2UuY2xhc3MpOworICAgICAgICAgYWRkKE5hbWVCb3VuZEZpbHRlci5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgcmV0dXJuIEFQUF9DTEFTU0VTOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvZmlsdGVyLW5hbWUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9maWx0ZXIvbmFtZS9OYW1lQm91bmRGaWx0ZXIuamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvZmlsdGVyLW5hbWUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9maWx0ZXIvbmFtZS9OYW1lQm91bmRGaWx0ZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzA0YzZmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9maWx0ZXItbmFtZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ZpbHRlci9uYW1lL05hbWVCb3VuZEZpbHRlci5qYXZhCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuZmlsdGVyLm5hbWU7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5TZXF1ZW5jZUlucHV0U3RyZWFtOworCitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlcXVlc3RDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXF1ZXN0RmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5Db250YWluZXJSZXNwb25zZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29udGFpbmVyLkNvbnRhaW5lclJlc3BvbnNlRmlsdGVyOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Qcm92aWRlcjsKKworLyoqCisgKiBDdXN0b20gZmlsdGVyLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQcm92aWRlcgorQEZpbHRlcmVkCitwdWJsaWMgY2xhc3MgTmFtZUJvdW5kRmlsdGVyIGltcGxlbWVudHMgQ29udGFpbmVyUmVxdWVzdEZpbHRlciwgQ29udGFpbmVyUmVzcG9uc2VGaWx0ZXIgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgZmlsdGVyKENvbnRhaW5lclJlcXVlc3RDb250ZXh0IHJlcXVlc3RDb250ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAocmVxdWVzdENvbnRleHQuaGFzRW50aXR5KCkpIHsKKyAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LnNldEVudGl0eVN0cmVhbShuZXcgU2VxdWVuY2VJbnB1dFN0cmVhbShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0oIk5BTV9NQVRDSF9JTiIuZ2V0Qnl0ZXMoKSksCisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RDb250ZXh0LmdldEVudGl0eVN0cmVhbSgpKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgdm9pZCBmaWx0ZXIoQ29udGFpbmVyUmVxdWVzdENvbnRleHQgcmVxdWVzdENvbnRleHQsIENvbnRhaW5lclJlc3BvbnNlQ29udGV4dCByZXNwb25zZUNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChyZXNwb25zZUNvbnRleHQuaGFzRW50aXR5KCkpIHsKKyAgICAgICAgICAgIHJlc3BvbnNlQ29udGV4dC5zZXRFbnRpdHkoIiIgKyByZXNwb25zZUNvbnRleHQuZ2V0RW50aXR5KCkgKyAiTkFNX01BVENIX09VVCIsIG51bGwsIE1lZGlhVHlwZS5URVhUX1BMQUlOX1RZUEUpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9maWx0ZXItbmFtZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ZpbHRlci9uYW1lL05hbWVCb3VuZEZpbHRlclJlc291cmNlLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ZpbHRlci1uYW1lL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvZmlsdGVyL25hbWUvTmFtZUJvdW5kRmlsdGVyUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OGM0OWFmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9maWx0ZXItbmFtZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ZpbHRlci9uYW1lL05hbWVCb3VuZEZpbHRlclJlc291cmNlLmphdmEKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5maWx0ZXIubmFtZTsKKworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QVVQ7CisKKy8qKgorICogRmlsdGVyZWQgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIi8iKQorQENvbnN1bWVzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorQEZpbHRlcmVkCitwdWJsaWMgY2xhc3MgTmFtZUJvdW5kRmlsdGVyUmVzb3VyY2UgeworCisgICAgQFBPU1QKKyAgICBwdWJsaWMgU3RyaW5nIGVjaG8oZmluYWwgU3RyaW5nIHRleHQpIHsKKyAgICAgICAgcmV0dXJuIHRleHQ7CisgICAgfQorCisgICAgQFBVVAorICAgIHB1YmxpYyB2b2lkIHB1dChmaW5hbCBTdHJpbmcgdGV4dCkgeworICAgIH0KKworICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgcmV0dXJuICJ0ZXh0IjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ZpbHRlci1uYW1lL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ZpbHRlci1uYW1lL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJlNDEyMQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvZmlsdGVyLW5hbWUvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDM4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjMuMSIKKyAgICAgICAgIHhtbG5zPSJodHRwOi8veG1sbnMuamNwLm9yZy94bWwvbnMvamF2YWVlIgorICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3htbG5zLmpjcC5vcmcveG1sL25zL2phdmFlZSBodHRwOi8veG1sbnMuamNwLm9yZy94bWwvbnMvamF2YWVlL3dlYi1hcHBfM18xLnhzZCI+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5KYXhSc0FwcGxpY2F0aW9uPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC53cy5ycy5BcHBsaWNhdGlvbjwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5maWx0ZXIubmFtZS5KYXhSc0FwcGxpY2F0aW9uPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5KYXhSc0FwcGxpY2F0aW9uPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ZpbHRlci1uYW1lL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvZmlsdGVyL25hbWUvRmlsdGVyVGVzdC5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9maWx0ZXItbmFtZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ZpbHRlci9uYW1lL0ZpbHRlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzZkMGFmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9maWx0ZXItbmFtZS9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ZpbHRlci9uYW1lL0ZpbHRlclRlc3QuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmZpbHRlci5uYW1lOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGVzdCBmb3IgaW50ZXJjZXB0ZWQgdGV4dCBwbGFpbiByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgRmlsdGVyVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKYXhSc0FwcGxpY2F0aW9uKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgZ2V0UmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygidGV4dE5BTV9NQVRDSF9PVVQiLCBnZXRSZXNwb25zZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdCgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nW10gdGVzdERhdGEgPSBuZXcgU3RyaW5nW10geyJvbmUiLCAidHdvIiwgInRocmVlIiB9OworICAgICAgICBmb3IgKFN0cmluZyBvcmlnaW5hbCA6IHRlc3REYXRhKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcG9zdFJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLnBvc3QoRW50aXR5LnRleHQob3JpZ2luYWwpLCBTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJOQU1fTUFUQ0hfSU4iICsgb3JpZ2luYWwgKyAiTkFNX01BVENIX09VVCIsIHBvc3RSZXNwb25zZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQdXQoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHB1dFJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLnB1dChFbnRpdHkudGV4dCgidGV4dCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwNCwgcHV0UmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvaW50ZXJjZXB0b3ItZHluYW1pYy9wb20ueG1sIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9pbnRlcmNlcHRvci1keW5hbWljL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk2MmUwMwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvaW50ZXJjZXB0b3ItZHluYW1pYy9wb20ueG1sCkBAIC0wLDAgKzEsNjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UudGVzdGNhc2VzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+aW50ZXJjZXB0b3ItZHluYW1pYzwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorCisgICAgPG5hbWU+amVyc2V5LXRlc3RzLXBlcmZvcm1hbmNlLWludGVyY2VwdG9yLWR5bmFtaWMtdGVzdDwvbmFtZT4KKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8cHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz5VVEYtODwvcHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz4KKyAgICA8L3Byb3BlcnRpZXM+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgud3MucnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC53cy5ycy1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZ3JpenpseTI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvaW50ZXJjZXB0b3ItZHluYW1pYy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ludGVyY2VwdG9yL2R5bmFtaWMvRHluYW1pY0ludGVyY2VwdG9yRmVhdHVyZS5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9pbnRlcmNlcHRvci1keW5hbWljL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvaW50ZXJjZXB0b3IvZHluYW1pYy9EeW5hbWljSW50ZXJjZXB0b3JGZWF0dXJlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTkwM2IwOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvaW50ZXJjZXB0b3ItZHluYW1pYy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ludGVyY2VwdG9yL2R5bmFtaWMvRHluYW1pY0ludGVyY2VwdG9yRmVhdHVyZS5qYXZhCkBAIC0wLDAgKzEsMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuaW50ZXJjZXB0b3IuZHluYW1pYzsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvbnRhaW5lci5EeW5hbWljRmVhdHVyZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb250YWluZXIuUmVzb3VyY2VJbmZvOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuRmVhdHVyZUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworCisvKioKKyAqIEN1c3RvbSBmZWF0dXJlIHRvIHJlZ2lzdGVyIGludGVyY2VwdG9yLgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFByb3ZpZGVyCitwdWJsaWMgY2xhc3MgRHluYW1pY0ludGVyY2VwdG9yRmVhdHVyZSBpbXBsZW1lbnRzIER5bmFtaWNGZWF0dXJlIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZShSZXNvdXJjZUluZm8gcmVzb3VyY2VJbmZvLCBGZWF0dXJlQ29udGV4dCBjb250ZXh0KSB7CisgICAgICAgIGlmIChEeW5hbWljYWxseUJvdW5kSW50ZXJjZXB0b3JSZXNvdXJjZS5jbGFzcyA9PSByZXNvdXJjZUluZm8uZ2V0UmVzb3VyY2VDbGFzcygpKSB7CisgICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyKER5bmFtaWNhbGx5Qm91bmRJbnRlcmNlcHRvci5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ludGVyY2VwdG9yLWR5bmFtaWMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9pbnRlcmNlcHRvci9keW5hbWljL0R5bmFtaWNhbGx5Qm91bmRJbnRlcmNlcHRvci5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9pbnRlcmNlcHRvci1keW5hbWljL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvaW50ZXJjZXB0b3IvZHluYW1pYy9EeW5hbWljYWxseUJvdW5kSW50ZXJjZXB0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2UxMTNlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9pbnRlcmNlcHRvci1keW5hbWljL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvaW50ZXJjZXB0b3IvZHluYW1pYy9EeW5hbWljYWxseUJvdW5kSW50ZXJjZXB0b3IuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmludGVyY2VwdG9yLmR5bmFtaWM7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5TZXF1ZW5jZUlucHV0U3RyZWFtOworCitpbXBvcnQgamF2YXgud3MucnMuV2ViQXBwbGljYXRpb25FeGNlcHRpb247CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlByb3ZpZGVyOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SZWFkZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0OworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0OworCisvKioKKyAqIEN1c3RvbSBpbnRlcmNlcHRvci4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUHJvdmlkZXIKK3B1YmxpYyBjbGFzcyBEeW5hbWljYWxseUJvdW5kSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBSZWFkZXJJbnRlcmNlcHRvciwgV3JpdGVySW50ZXJjZXB0b3IgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdCBhcm91bmRSZWFkRnJvbShSZWFkZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGNvbnRleHQuc2V0SW5wdXRTdHJlYW0obmV3IFNlcXVlbmNlSW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKCJSRUFEICIuZ2V0Qnl0ZXMoKSksIGNvbnRleHQuZ2V0SW5wdXRTdHJlYW0oKSkpOworICAgICAgICByZXR1cm4gY29udGV4dC5wcm9jZWVkKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYXJvdW5kV3JpdGVUbyhXcml0ZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgY29udGV4dC5nZXRPdXRwdXRTdHJlYW0oKS53cml0ZSgiV1JJVEUgIi5nZXRCeXRlcygpKTsKKyAgICAgICAgY29udGV4dC5wcm9jZWVkKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9pbnRlcmNlcHRvci1keW5hbWljL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvaW50ZXJjZXB0b3IvZHluYW1pYy9EeW5hbWljYWxseUJvdW5kSW50ZXJjZXB0b3JSZXNvdXJjZS5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9pbnRlcmNlcHRvci1keW5hbWljL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvaW50ZXJjZXB0b3IvZHluYW1pYy9EeW5hbWljYWxseUJvdW5kSW50ZXJjZXB0b3JSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5OWQ0MjYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ludGVyY2VwdG9yLWR5bmFtaWMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9pbnRlcmNlcHRvci9keW5hbWljL0R5bmFtaWNhbGx5Qm91bmRJbnRlcmNlcHRvclJlc291cmNlLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5pbnRlcmNlcHRvci5keW5hbWljOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QVVQ7CisKKy8qKgorICogSW50ZXJjZXB0ZWQgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIi8iKQorQENvbnN1bWVzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorcHVibGljIGNsYXNzIER5bmFtaWNhbGx5Qm91bmRJbnRlcmNlcHRvclJlc291cmNlIHsKKworICAgIEBQT1NUCisgICAgcHVibGljIFN0cmluZyBlY2hvKGZpbmFsIFN0cmluZyB0ZXh0KSB7CisgICAgICAgIHJldHVybiB0ZXh0OworICAgIH0KKworICAgIEBQVVQKKyAgICBwdWJsaWMgdm9pZCBwdXQoZmluYWwgU3RyaW5nIHRleHQpIHsKKyAgICB9CisKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgIHJldHVybiAidGV4dCI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9pbnRlcmNlcHRvci1keW5hbWljL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvaW50ZXJjZXB0b3IvZHluYW1pYy9KYXhSc0FwcGxpY2F0aW9uLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ludGVyY2VwdG9yLWR5bmFtaWMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9pbnRlcmNlcHRvci9keW5hbWljL0pheFJzQXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDFkMmFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9pbnRlcmNlcHRvci1keW5hbWljL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvaW50ZXJjZXB0b3IvZHluYW1pYy9KYXhSc0FwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5pbnRlcmNlcHRvci5keW5hbWljOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKKy8qKgorICogVGVzdCBjYXNlIEpBWC1SUyBhcHBsaWNhdGlvbi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSmF4UnNBcHBsaWNhdGlvbiBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKworICAgIHN0YXRpYyBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IEFQUF9DTEFTU0VTID0gbmV3IEhhc2hTZXQ8Q2xhc3M8Pz4+KCl7CisgICAgICAgIHsKKyAgICAgICAgIGFkZChEeW5hbWljYWxseUJvdW5kSW50ZXJjZXB0b3JSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgICBhZGQoRHluYW1pY0ludGVyY2VwdG9yRmVhdHVyZS5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgcmV0dXJuIEFQUF9DTEFTU0VTOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvaW50ZXJjZXB0b3ItZHluYW1pYy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9pbnRlcmNlcHRvci1keW5hbWljL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMzZWQ5NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvaW50ZXJjZXB0b3ItZHluYW1pYy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMy4xIgorICAgICAgICAgeG1sbnM9Imh0dHA6Ly94bWxucy5qY3Aub3JnL3htbC9ucy9qYXZhZWUiCisgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8veG1sbnMuamNwLm9yZy94bWwvbnMvamF2YWVlIGh0dHA6Ly94bWxucy5qY3Aub3JnL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8zXzEueHNkIj4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkpheFJzQXBwbGljYXRpb248L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LndzLnJzLkFwcGxpY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmludGVyY2VwdG9yLmR5bmFtaWMuSmF4UnNBcHBsaWNhdGlvbjwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SmF4UnNBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9pbnRlcmNlcHRvci1keW5hbWljL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvaW50ZXJjZXB0b3IvZHluYW1pYy9JbnRlcmNlcHRvclRlc3QuamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvaW50ZXJjZXB0b3ItZHluYW1pYy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ludGVyY2VwdG9yL2R5bmFtaWMvSW50ZXJjZXB0b3JUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkzMTc0YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvaW50ZXJjZXB0b3ItZHluYW1pYy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ludGVyY2VwdG9yL2R5bmFtaWMvSW50ZXJjZXB0b3JUZXN0LmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5pbnRlcmNlcHRvci5keW5hbWljOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGVzdCBmb3IgaW50ZXJjZXB0ZWQgdGV4dCBwbGFpbiByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSW50ZXJjZXB0b3JUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IEpheFJzQXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXQoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBnZXRSZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJXUklURSB0ZXh0IiwgZ2V0UmVzcG9uc2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc3QoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZ1tdIHRlc3REYXRhID0gbmV3IFN0cmluZ1tdIHsib25lIiwgInR3byIsICJ0aHJlZSIgfTsKKyAgICAgICAgZm9yIChTdHJpbmcgb3JpZ2luYWwgOiB0ZXN0RGF0YSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBvc3RSZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS50ZXh0KG9yaWdpbmFsKSwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiV1JJVEUgUkVBRCAiICsgb3JpZ2luYWwsIHBvc3RSZXNwb25zZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQdXQoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHB1dFJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLnB1dChFbnRpdHkudGV4dCgidGV4dCIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwNCwgcHV0UmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvaW50ZXJjZXB0b3ItZ2xvYmFsL3BvbS54bWwgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ludGVyY2VwdG9yLWdsb2JhbC9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NGRkMDIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ludGVyY2VwdG9yLWdsb2JhbC9wb20ueG1sCkBAIC0wLDAgKzEsNjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UudGVzdGNhc2VzPC9ncm91cElkPgorICAgICAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjI4LVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDwvcGFyZW50PgorCisgICAgPGFydGlmYWN0SWQ+aW50ZXJjZXB0b3ItZ2xvYmFsPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisKKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtcGVyZm9ybWFuY2UtaW50ZXJjZXB0b3ItZ2xvYmFsLXRlc3Q8L25hbWU+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPHByb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+VVRGLTg8L3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+CisgICAgPC9wcm9wZXJ0aWVzPgorCisgICAgPGRlcGVuZGVuY2llcz4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LndzLnJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXgud3MucnMtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWdyaXp6bHkyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ludGVyY2VwdG9yLWdsb2JhbC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ludGVyY2VwdG9yL2dsb2JhbC9DdXN0b21JbnRlcmNlcHRvci5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9pbnRlcmNlcHRvci1nbG9iYWwvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9pbnRlcmNlcHRvci9nbG9iYWwvQ3VzdG9tSW50ZXJjZXB0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmQxYmIxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9pbnRlcmNlcHRvci1nbG9iYWwvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9pbnRlcmNlcHRvci9nbG9iYWwvQ3VzdG9tSW50ZXJjZXB0b3IuamF2YQpAQCAtMCwwICsxLDQ5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmludGVyY2VwdG9yLmdsb2JhbDsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlNlcXVlbmNlSW5wdXRTdHJlYW07CisKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJlYWRlckludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SZWFkZXJJbnRlcmNlcHRvckNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvckNvbnRleHQ7CisKKy8qKgorICogQ3VzdG9tIGludGVyY2VwdG9yLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQcm92aWRlcgorcHVibGljIGNsYXNzIEN1c3RvbUludGVyY2VwdG9yIGltcGxlbWVudHMgUmVhZGVySW50ZXJjZXB0b3IsIFdyaXRlckludGVyY2VwdG9yIHsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBPYmplY3QgYXJvdW5kUmVhZEZyb20oUmVhZGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgICAgICBjb250ZXh0LnNldElucHV0U3RyZWFtKG5ldyBTZXF1ZW5jZUlucHV0U3RyZWFtKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbSgiUkVBRCAiLmdldEJ5dGVzKCkpLCBjb250ZXh0LmdldElucHV0U3RyZWFtKCkpKTsKKyAgICAgICAgcmV0dXJuIGNvbnRleHQucHJvY2VlZCgpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGFyb3VuZFdyaXRlVG8oV3JpdGVySW50ZXJjZXB0b3JDb250ZXh0IGNvbnRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiwgV2ViQXBwbGljYXRpb25FeGNlcHRpb24geworICAgIGNvbnRleHQuZ2V0T3V0cHV0U3RyZWFtKCkud3JpdGUoIldSSVRFICIuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIGNvbnRleHQucHJvY2VlZCgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvaW50ZXJjZXB0b3ItZ2xvYmFsL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvaW50ZXJjZXB0b3IvZ2xvYmFsL0pheFJzQXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvaW50ZXJjZXB0b3ItZ2xvYmFsL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvaW50ZXJjZXB0b3IvZ2xvYmFsL0pheFJzQXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWQ3MzA4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9pbnRlcmNlcHRvci1nbG9iYWwvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9pbnRlcmNlcHRvci9nbG9iYWwvSmF4UnNBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuaW50ZXJjZXB0b3IuZ2xvYmFsOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKKy8qKgorICogVGVzdCBjYXNlIEpBWC1SUyBhcHBsaWNhdGlvbi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSmF4UnNBcHBsaWNhdGlvbiBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKworICAgIHN0YXRpYyBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IEFQUF9DTEFTU0VTID0gbmV3IEhhc2hTZXQ8Q2xhc3M8Pz4+KCl7CisgICAgICAgIHsKKyAgICAgICAgIGFkZChUZXh0RW50aXR5UmVzb3VyY2UuY2xhc3MpOworICAgICAgICAgYWRkKEN1c3RvbUludGVyY2VwdG9yLmNsYXNzKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICByZXR1cm4gQVBQX0NMQVNTRVM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9pbnRlcmNlcHRvci1nbG9iYWwvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9pbnRlcmNlcHRvci9nbG9iYWwvVGV4dEVudGl0eVJlc291cmNlLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ludGVyY2VwdG9yLWdsb2JhbC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ludGVyY2VwdG9yL2dsb2JhbC9UZXh0RW50aXR5UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWI1NzEwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9pbnRlcmNlcHRvci1nbG9iYWwvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9pbnRlcmNlcHRvci9nbG9iYWwvVGV4dEVudGl0eVJlc291cmNlLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5pbnRlcmNlcHRvci5nbG9iYWw7CisKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUFVUOworCisvKioKKyAqIFRlc3QgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIi8iKQorQENvbnN1bWVzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorcHVibGljIGNsYXNzIFRleHRFbnRpdHlSZXNvdXJjZSB7CisKKyAgICBAUE9TVAorICAgIHB1YmxpYyBTdHJpbmcgZWNobyhmaW5hbCBTdHJpbmcgdGV4dCkgeworICAgICAgICByZXR1cm4gdGV4dDsKKyAgICB9CisKKyAgICBAUFVUCisgICAgcHVibGljIHZvaWQgcHV0KGZpbmFsIFN0cmluZyB0ZXh0KSB7CisgICAgfQorCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICByZXR1cm4gInRleHQiOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvaW50ZXJjZXB0b3ItZ2xvYmFsL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ludGVyY2VwdG9yLWdsb2JhbC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNjQ3ODYKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ludGVyY2VwdG9yLWdsb2JhbC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMy4xIgorICAgICAgICAgeG1sbnM9Imh0dHA6Ly94bWxucy5qY3Aub3JnL3htbC9ucy9qYXZhZWUiCisgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8veG1sbnMuamNwLm9yZy94bWwvbnMvamF2YWVlIGh0dHA6Ly94bWxucy5qY3Aub3JnL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8zXzEueHNkIj4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkpheFJzQXBwbGljYXRpb248L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LndzLnJzLkFwcGxpY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmludGVyY2VwdG9yLmdsb2JhbC5KYXhSc0FwcGxpY2F0aW9uPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5KYXhSc0FwcGxpY2F0aW9uPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ludGVyY2VwdG9yLWdsb2JhbC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ludGVyY2VwdG9yL2dsb2JhbC9JbnRlcmNlcHRvclRlc3QuamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvaW50ZXJjZXB0b3ItZ2xvYmFsL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvaW50ZXJjZXB0b3IvZ2xvYmFsL0ludGVyY2VwdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMDA3NjQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ludGVyY2VwdG9yLWdsb2JhbC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ludGVyY2VwdG9yL2dsb2JhbC9JbnRlcmNlcHRvclRlc3QuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmludGVyY2VwdG9yLmdsb2JhbDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFRlc3QgZm9yIGludGVyY2VwdGVkIHRleHQgcGxhaW4gcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEludGVyY2VwdG9yVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKYXhSc0FwcGxpY2F0aW9uKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgeworICAgICAgICBmaW5hbCBTdHJpbmcgZ2V0UmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiV1JJVEUgdGV4dCIsIGdldFJlc3BvbnNlKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0KCkgeworICAgICAgICBmaW5hbCBTdHJpbmdbXSB0ZXN0RGF0YSA9IG5ldyBTdHJpbmdbXSB7Im9uZSIsICJ0d28iLCAidGhyZWUiIH07CisgICAgICAgIGZvciAoU3RyaW5nIG9yaWdpbmFsIDogdGVzdERhdGEpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwb3N0UmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkudGV4dChvcmlnaW5hbCksIFN0cmluZy5jbGFzcyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIldSSVRFIFJFQUQgIiArIG9yaWdpbmFsLCBwb3N0UmVzcG9uc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0KCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSBwdXRSZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5wdXQoRW50aXR5LnRleHQoInRleHQiKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDQsIHB1dFJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ludGVyY2VwdG9yLW5hbWUvcG9tLnhtbCBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvaW50ZXJjZXB0b3ItbmFtZS9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwOGZlY2YKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ludGVyY2VwdG9yLW5hbWUvcG9tLnhtbApAQCAtMCwwICsxLDYyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLnRlc3RjYXNlczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmludGVyY2VwdG9yLW5hbWU8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKworICAgIDxuYW1lPmplcnNleS10ZXN0cy1wZXJmb3JtYW5jZS1pbnRlcmNlcHRvci1uYW1lLXRlc3Q8L25hbWU+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPHByb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+VVRGLTg8L3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+CisgICAgPC9wcm9wZXJ0aWVzPgorCisgICAgPGRlcGVuZGVuY2llcz4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LndzLnJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXgud3MucnMtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWdyaXp6bHkyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ludGVyY2VwdG9yLW5hbWUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9pbnRlcmNlcHRvci9uYW1lL0ludGVyY2VwdGVkLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ludGVyY2VwdG9yLW5hbWUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9pbnRlcmNlcHRvci9uYW1lL0ludGVyY2VwdGVkLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE4NWEwZgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvaW50ZXJjZXB0b3ItbmFtZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ludGVyY2VwdG9yL25hbWUvSW50ZXJjZXB0ZWQuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmludGVyY2VwdG9yLm5hbWU7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7CisKK2ltcG9ydCBqYXZheC53cy5ycy5OYW1lQmluZGluZzsKKworCisvKioKKyAqIEN1c3RvbSBhbm5vdGF0aW9uIHRvIGJpbmQgaW50ZXJjZXB0b3IuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQE5hbWVCaW5kaW5nCitAVGFyZ2V0KHtFbGVtZW50VHlwZS5UWVBFLCBFbGVtZW50VHlwZS5NRVRIT0R9KQorcHVibGljIEBpbnRlcmZhY2UgSW50ZXJjZXB0ZWQge30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvaW50ZXJjZXB0b3ItbmFtZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ludGVyY2VwdG9yL25hbWUvSW50ZXJjZXB0ZWRCeU5hbWVSZXNvdXJjZS5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9pbnRlcmNlcHRvci1uYW1lL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvaW50ZXJjZXB0b3IvbmFtZS9JbnRlcmNlcHRlZEJ5TmFtZVJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVmYzM2ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvaW50ZXJjZXB0b3ItbmFtZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ludGVyY2VwdG9yL25hbWUvSW50ZXJjZXB0ZWRCeU5hbWVSZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuaW50ZXJjZXB0b3IubmFtZTsKKworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuUE9TVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QVVQ7CisKKy8qKgorICogVGVzdCByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiLyIpCitAQ29uc3VtZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCitAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCitASW50ZXJjZXB0ZWQKK3B1YmxpYyBjbGFzcyBJbnRlcmNlcHRlZEJ5TmFtZVJlc291cmNlIHsKKworICAgIEBQT1NUCisgICAgcHVibGljIFN0cmluZyBlY2hvKGZpbmFsIFN0cmluZyB0ZXh0KSB7CisgICAgICAgIHJldHVybiB0ZXh0OworICAgIH0KKworICAgIEBQVVQKKyAgICBwdWJsaWMgdm9pZCBwdXQoZmluYWwgU3RyaW5nIHRleHQpIHsKKyAgICB9CisKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgIHJldHVybiAidGV4dCI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9pbnRlcmNlcHRvci1uYW1lL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvaW50ZXJjZXB0b3IvbmFtZS9KYXhSc0FwcGxpY2F0aW9uLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ludGVyY2VwdG9yLW5hbWUvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9pbnRlcmNlcHRvci9uYW1lL0pheFJzQXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzEzMzRlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9pbnRlcmNlcHRvci1uYW1lL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvaW50ZXJjZXB0b3IvbmFtZS9KYXhSc0FwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5pbnRlcmNlcHRvci5uYW1lOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKKy8qKgorICogVGVzdCBjYXNlIEpBWC1SUyBhcHBsaWNhdGlvbi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSmF4UnNBcHBsaWNhdGlvbiBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKworICAgIHN0YXRpYyBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IEFQUF9DTEFTU0VTID0gbmV3IEhhc2hTZXQ8Q2xhc3M8Pz4+KCl7CisgICAgICAgIHsKKyAgICAgICAgIGFkZChJbnRlcmNlcHRlZEJ5TmFtZVJlc291cmNlLmNsYXNzKTsKKyAgICAgICAgIGFkZChOYW1lQm91bmRJbnRlcmNlcHRvci5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgcmV0dXJuIEFQUF9DTEFTU0VTOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvaW50ZXJjZXB0b3ItbmFtZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ludGVyY2VwdG9yL25hbWUvTmFtZUJvdW5kSW50ZXJjZXB0b3IuamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvaW50ZXJjZXB0b3ItbmFtZS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL2ludGVyY2VwdG9yL25hbWUvTmFtZUJvdW5kSW50ZXJjZXB0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzE3ODExCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9pbnRlcmNlcHRvci1uYW1lL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvaW50ZXJjZXB0b3IvbmFtZS9OYW1lQm91bmRJbnRlcmNlcHRvci5qYXZhCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTMsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuaW50ZXJjZXB0b3IubmFtZTsKKworaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLlNlcXVlbmNlSW5wdXRTdHJlYW07CisKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuUHJvdmlkZXI7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LlJlYWRlckludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5SZWFkZXJJbnRlcmNlcHRvckNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuZXh0LldyaXRlckludGVyY2VwdG9yOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5Xcml0ZXJJbnRlcmNlcHRvckNvbnRleHQ7CisKKy8qKgorICogQ3VzdG9tIGludGVyY2VwdG9yLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BQcm92aWRlcgorQEludGVyY2VwdGVkCitwdWJsaWMgY2xhc3MgTmFtZUJvdW5kSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBSZWFkZXJJbnRlcmNlcHRvciwgV3JpdGVySW50ZXJjZXB0b3IgeworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIE9iamVjdCBhcm91bmRSZWFkRnJvbShSZWFkZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGNvbnRleHQuc2V0SW5wdXRTdHJlYW0obmV3IFNlcXVlbmNlSW5wdXRTdHJlYW0obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKCJSRUFEICIuZ2V0Qnl0ZXMoKSksIGNvbnRleHQuZ2V0SW5wdXRTdHJlYW0oKSkpOworICAgICAgICByZXR1cm4gY29udGV4dC5wcm9jZWVkKCk7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgYXJvdW5kV3JpdGVUbyhXcml0ZXJJbnRlcmNlcHRvckNvbnRleHQgY29udGV4dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgY29udGV4dC5nZXRPdXRwdXRTdHJlYW0oKS53cml0ZSgiV1JJVEUgIi5nZXRCeXRlcygpKTsKKyAgICAgICAgY29udGV4dC5wcm9jZWVkKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9pbnRlcmNlcHRvci1uYW1lL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ludGVyY2VwdG9yLW5hbWUvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmZhNDMzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9pbnRlcmNlcHRvci1uYW1lL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwzOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIzLjEiCisgICAgICAgICB4bWxucz0iaHR0cDovL3htbG5zLmpjcC5vcmcveG1sL25zL2phdmFlZSIKKyAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly94bWxucy5qY3Aub3JnL3htbC9ucy9qYXZhZWUgaHR0cDovL3htbG5zLmpjcC5vcmcveG1sL25zL2phdmFlZS93ZWItYXBwXzNfMS54c2QiPgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SmF4UnNBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UuaW50ZXJjZXB0b3IubmFtZS5KYXhSc0FwcGxpY2F0aW9uPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5KYXhSc0FwcGxpY2F0aW9uPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL2ludGVyY2VwdG9yLW5hbWUvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9pbnRlcmNlcHRvci9uYW1lL0ludGVyY2VwdG9yVGVzdC5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9pbnRlcmNlcHRvci1uYW1lL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvaW50ZXJjZXB0b3IvbmFtZS9JbnRlcmNlcHRvclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGM1MjFlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9pbnRlcmNlcHRvci1uYW1lL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvaW50ZXJjZXB0b3IvbmFtZS9JbnRlcmNlcHRvclRlc3QuamF2YQpAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLmludGVyY2VwdG9yLm5hbWU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBUZXN0IGZvciBpbnRlcmNlcHRlZCB0ZXh0IHBsYWluIHJlc291cmNlLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBJbnRlcmNlcHRvclRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgSmF4UnNBcHBsaWNhdGlvbigpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldCgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nIGdldFJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIldSSVRFIHRleHQiLCBnZXRSZXNwb25zZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdCgpIHsKKyAgICAgICAgZmluYWwgU3RyaW5nW10gdGVzdERhdGEgPSBuZXcgU3RyaW5nW10geyJvbmUiLCAidHdvIiwgInRocmVlIiB9OworICAgICAgICBmb3IgKFN0cmluZyBvcmlnaW5hbCA6IHRlc3REYXRhKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcG9zdFJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLnBvc3QoRW50aXR5LnRleHQob3JpZ2luYWwpLCBTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKCJXUklURSBSRUFEICIgKyBvcmlnaW5hbCwgcG9zdFJlc3BvbnNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFB1dCgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcHV0UmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkucHV0KEVudGl0eS50ZXh0KCJ0ZXh0IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjA0LCBwdXRSZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctY3VzdG9tLXByb3ZpZGVyL3BvbS54bWwgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy1jdXN0b20tcHJvdmlkZXIvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDc3ZTQyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctY3VzdG9tLXByb3ZpZGVyL3BvbS54bWwKQEAgLTAsMCArMSw2MSBAQAorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLnRlc3RjYXNlczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPmN1c3RvbS1wcm92aWRlcjwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorCisgICAgPG5hbWU+amVyc2V5LXRlc3RzLXBlcmZvcm1hbmNlLWN1c3RvbS1wcm92aWRlci10ZXN0PC9uYW1lPgorCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxwcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPlVURi04PC9wcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPgorICAgIDwvcHJvcGVydGllcz4KKworICAgIDxkZXBlbmRlbmNpZXM+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC53cy5yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LndzLnJzLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1ncml6emx5MjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctY3VzdG9tLXByb3ZpZGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L2N1c3RvbS9KYXhSc0FwcGxpY2F0aW9uLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy1jdXN0b20tcHJvdmlkZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncvY3VzdG9tL0pheFJzQXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODY1Mjk4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctY3VzdG9tLXByb3ZpZGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L2N1c3RvbS9KYXhSc0FwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSw0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5tYncuY3VzdG9tOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKKy8qKgorICogVGVzdCBjYXNlIEpBWC1SUyBhcHBsaWNhdGlvbi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSmF4UnNBcHBsaWNhdGlvbiBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKworICAgIHN0YXRpYyBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IEFQUF9DTEFTU0VTID0gbmV3IEhhc2hTZXQ8Q2xhc3M8Pz4+KCl7CisgICAgICAgIHsKKyAgICAgICAgIGFkZChQZXJzb25SZXNvdXJjZS5jbGFzcyk7CisgICAgICAgICBhZGQoUGVyc29uUHJvdmlkZXIuY2xhc3MpOworICAgICAgICB9CisgICAgfTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgIHJldHVybiBBUFBfQ0xBU1NFUzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy1jdXN0b20tcHJvdmlkZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncvY3VzdG9tL1BlcnNvbi5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctY3VzdG9tLXByb3ZpZGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L2N1c3RvbS9QZXJzb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDVkYmI3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctY3VzdG9tLXByb3ZpZGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L2N1c3RvbS9QZXJzb24uamF2YQpAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLm1idy5jdXN0b207CisKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKKworLyoqCisgKiBUZXN0IGRhdGEgYmVhbi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgUGVyc29uIHsKKworICAgIHB1YmxpYyBTdHJpbmcgbmFtZTsKKyAgICBwdWJsaWMgaW50IGFnZTsKKyAgICBwdWJsaWMgU3RyaW5nIGFkZHJlc3M7CisKKyAgICBwdWJsaWMgUGVyc29uKFN0cmluZyBuYW1lLCBpbnQgYWdlLCBTdHJpbmcgYWRkcmVzcykgeworICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOworICAgICAgICB0aGlzLmFnZSA9IGFnZTsKKyAgICAgICAgdGhpcy5hZGRyZXNzID0gYWRkcmVzczsKKyAgICB9CisKKyAgICBwdWJsaWMgUGVyc29uKCkgeworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7CisgICAgICAgIGludCBoYXNoID0gNzsKKyAgICAgICAgaGFzaCA9IDE5ICogaGFzaCArIE9iamVjdHMuaGFzaENvZGUodGhpcy5uYW1lKTsKKyAgICAgICAgaGFzaCA9IDE5ICogaGFzaCArIHRoaXMuYWdlOworICAgICAgICBoYXNoID0gMTkgKiBoYXNoICsgT2JqZWN0cy5oYXNoQ29kZSh0aGlzLmFkZHJlc3MpOworICAgICAgICByZXR1cm4gaGFzaDsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgeworICAgICAgICBpZiAob2JqID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0Q2xhc3MoKSAhPSBvYmouZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZpbmFsIFBlcnNvbiBvdGhlciA9IChQZXJzb24pIG9iajsKKyAgICAgICAgaWYgKCFPYmplY3RzLmVxdWFscyh0aGlzLm5hbWUsIG90aGVyLm5hbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRoaXMuYWdlICE9IG90aGVyLmFnZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoT2JqZWN0cy5lcXVhbHModGhpcy5hZGRyZXNzLCBvdGhlci5hZGRyZXNzKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctY3VzdG9tLXByb3ZpZGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L2N1c3RvbS9QZXJzb25Qcm92aWRlci5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctY3VzdG9tLXByb3ZpZGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L2N1c3RvbS9QZXJzb25Qcm92aWRlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMjkzOTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy1jdXN0b20tcHJvdmlkZXIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncvY3VzdG9tL1BlcnNvblByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5tYncuY3VzdG9tOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcjsKK2ltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Bbm5vdGF0aW9uOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LlR5cGU7CisKK2ltcG9ydCBqYXZheC53cy5ycy5Db25zdW1lczsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5XZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk11bHRpdmFsdWVkTWFwOworaW1wb3J0IGphdmF4LndzLnJzLmV4dC5NZXNzYWdlQm9keVJlYWRlcjsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuTWVzc2FnZUJvZHlXcml0ZXI7CisKKy8qKgorICogQ3VzdG9tIG1lc3NhZ2UgYm9keSB3b3JrZXIuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFByb2R1Y2VzKCJhcHBsaWNhdGlvbi9wZXJzb24iKQorQENvbnN1bWVzKCJhcHBsaWNhdGlvbi9wZXJzb24iKQorcHVibGljIGNsYXNzIFBlcnNvblByb3ZpZGVyIGltcGxlbWVudHMgTWVzc2FnZUJvZHlXcml0ZXI8UGVyc29uPiwgTWVzc2FnZUJvZHlSZWFkZXI8UGVyc29uPiB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBpc1dyaXRlYWJsZShDbGFzczw/PiB0eXBlLCBUeXBlIHR5cGUxLCBBbm5vdGF0aW9uW10gYW50bnMsIE1lZGlhVHlwZSBtdCkgeworICAgICAgICByZXR1cm4gdHlwZSA9PSBQZXJzb24uY2xhc3M7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZ2V0U2l6ZShQZXJzb24gdCwgQ2xhc3M8Pz4gdHlwZSwgVHlwZSB0eXBlMSwgQW5ub3RhdGlvbltdIGFudG5zLCBNZWRpYVR5cGUgbXQpIHsKKyAgICAgICAgcmV0dXJuIGdldEJ5dGVSZXByZXNlbnRhdGlvbih0KS5sZW5ndGg7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHZvaWQgd3JpdGVUbyhQZXJzb24gdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzPD8+IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBUeXBlIHR5cGUxLAorICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbltdIGFudG5zLAorICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFUeXBlIG10LAorICAgICAgICAgICAgICAgICAgICAgICAgTXVsdGl2YWx1ZWRNYXA8U3RyaW5nLCBPYmplY3Q+IG1tLAorICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0U3RyZWFtIG91dCkgdGhyb3dzIElPRXhjZXB0aW9uLCBXZWJBcHBsaWNhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIG91dC53cml0ZShnZXRCeXRlUmVwcmVzZW50YXRpb24odCkpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGlzUmVhZGFibGUoQ2xhc3M8Pz4gdHlwZSwgVHlwZSB0eXBlMSwgQW5ub3RhdGlvbltdIGFudG5zLCBNZWRpYVR5cGUgbXQpIHsKKyAgICAgICAgcmV0dXJuIHR5cGUgPT0gUGVyc29uLmNsYXNzOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBQZXJzb24gcmVhZEZyb20oQ2xhc3M8UGVyc29uPiB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSB0eXBlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25bXSBhbnRucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhVHlwZSBtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpdmFsdWVkTWFwPFN0cmluZywgU3RyaW5nPiBtbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24sIFdlYkFwcGxpY2F0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgUGVyc29uIHJlc3VsdCA9IG5ldyBQZXJzb24oKTsKKworICAgICAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IElucHV0U3RyZWFtUmVhZGVyKGluKSk7CisgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lTGluZSA9IHJlYWRlci5yZWFkTGluZSgpOworICAgICAgICByZXN1bHQubmFtZSA9IG5hbWVMaW5lLnN1YnN0cmluZyhuYW1lTGluZS5pbmRleE9mKCI6ICIpICsgMik7CisgICAgICAgIGZpbmFsIFN0cmluZyBhZ2VMaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7CisgICAgICAgIHJlc3VsdC5hZ2UgPSBJbnRlZ2VyLnBhcnNlSW50KGFnZUxpbmUuc3Vic3RyaW5nKGFnZUxpbmUuaW5kZXhPZigiOiAiKSArIDIpKTsKKyAgICAgICAgZmluYWwgU3RyaW5nIGFkZHJlc3NMaW5lID0gcmVhZGVyLnJlYWRMaW5lKCk7CisgICAgICAgIHJlc3VsdC5hZGRyZXNzID0gYWRkcmVzc0xpbmUuc3Vic3RyaW5nKGFkZHJlc3NMaW5lLmluZGV4T2YoIjogIikgKyAyKTsKKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHByaXZhdGUgYnl0ZVtdIGdldEJ5dGVSZXByZXNlbnRhdGlvbihQZXJzb24gdCkgeworICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgibmFtZTogJXNcbmFnZTogJWRcbmFkZHJlc3M6ICVzIiwgdC5uYW1lLCB0LmFnZSwgdC5hZGRyZXNzKS5nZXRCeXRlcygpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWN1c3RvbS1wcm92aWRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy9jdXN0b20vUGVyc29uUmVzb3VyY2UuamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWN1c3RvbS1wcm92aWRlci9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy9jdXN0b20vUGVyc29uUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTE5NmMxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctY3VzdG9tLXByb3ZpZGVyL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L2N1c3RvbS9QZXJzb25SZXNvdXJjZS5qYXZhCkBAIC0wLDAgKzEsNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UubWJ3LmN1c3RvbTsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUFVUOworCisvKioKKyAqIFBlcnNvbiByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiLyIpCitAQ29uc3VtZXMoImFwcGxpY2F0aW9uL3BlcnNvbiIpCitAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3BlcnNvbiIpCitwdWJsaWMgY2xhc3MgUGVyc29uUmVzb3VyY2UgeworCisgICAgQFBPU1QKKyAgICBwdWJsaWMgUGVyc29uIGVjaG8oZmluYWwgUGVyc29uIHBlcnNvbikgeworICAgICAgICByZXR1cm4gcGVyc29uOworICAgIH0KKworICAgIEBQVVQKKyAgICBwdWJsaWMgdm9pZCBwdXQoZmluYWwgUGVyc29uIHRleHQpIHsKKyAgICB9CisKKyAgICBAR0VUCisgICAgcHVibGljIFBlcnNvbiBnZXQoKSB7CisgICAgICAgIHJldHVybiBuZXcgUGVyc29uKCJNb3phcnQiLCAyMSwgIlNhbHpidXJnIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctY3VzdG9tLXByb3ZpZGVyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy1jdXN0b20tcHJvdmlkZXIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjJjODRiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctY3VzdG9tLXByb3ZpZGVyL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwzOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIzLjEiCisgICAgICAgICB4bWxucz0iaHR0cDovL3htbG5zLmpjcC5vcmcveG1sL25zL2phdmFlZSIKKyAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly94bWxucy5qY3Aub3JnL3htbC9ucy9qYXZhZWUgaHR0cDovL3htbG5zLmpjcC5vcmcveG1sL25zL2phdmFlZS93ZWItYXBwXzNfMS54c2QiPgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SmF4UnNBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UubWJ3LmN1c3RvbS5KYXhSc0FwcGxpY2F0aW9uPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5KYXhSc0FwcGxpY2F0aW9uPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy1jdXN0b20tcHJvdmlkZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncvY3VzdG9tL1BlcnNvbkVudGl0eVRlc3QuamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWN1c3RvbS1wcm92aWRlci9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy9jdXN0b20vUGVyc29uRW50aXR5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YWFmMzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy1jdXN0b20tcHJvdmlkZXIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncvY3VzdG9tL1BlcnNvbkVudGl0eVRlc3QuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLm1idy5jdXN0b207CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmNsaWVudC5DbGllbnRDb25maWc7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3QgZm9yIGpzb24gcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFBlcnNvbkVudGl0eVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgSmF4UnNBcHBsaWNhdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihQZXJzb25Qcm92aWRlci5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgeworICAgICAgICBmaW5hbCBQZXJzb24gZ2V0UmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkuZ2V0KFBlcnNvbi5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiTW96YXJ0IiwgZ2V0UmVzcG9uc2UubmFtZSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMSwgZ2V0UmVzcG9uc2UuYWdlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTYWx6YnVyZyIsIGdldFJlc3BvbnNlLmFkZHJlc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc3QoKSB7CisgICAgICAgIGZpbmFsIFBlcnNvbltdIHRlc3REYXRhID0gbmV3IFBlcnNvbltdIHtuZXcgUGVyc29uKCJKb3NlcGgiLCAyMywgIk5hemFyZXRoIiksIG5ldyBQZXJzb24oIk1hcnkiLCAxOCwgIk5hemFyZXRoIil9OworICAgICAgICBmb3IgKFBlcnNvbiBvcmlnaW5hbCA6IHRlc3REYXRhKSB7CisgICAgICAgICAgICBmaW5hbCBQZXJzb24gcG9zdFJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLnBvc3QoRW50aXR5LmVudGl0eShvcmlnaW5hbCwgImFwcGxpY2F0aW9uL3BlcnNvbiIpLCBQZXJzb24uY2xhc3MpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLCBwb3N0UmVzcG9uc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0KCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSBwdXRSZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5wdXQoRW50aXR5LmVudGl0eShuZXcgUGVyc29uKCJKdWxlcyIsIDEyLCAiUGFyaXMiKSwgImFwcGxpY2F0aW9uL3BlcnNvbiIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwNCwgcHV0UmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWpzb24tamFja3Nvbi9wb20ueG1sIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctanNvbi1qYWNrc29uL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEyMWIyOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWpzb24tamFja3Nvbi9wb20ueG1sCkBAIC0wLDAgKzEsNjUgQEAKKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS50ZXN0Y2FzZXM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qc29uLWphY2tzb248L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKworICAgIDxuYW1lPmplcnNleS10ZXN0cy1wZXJmb3JtYW5jZS1qc29uLWphY2tzb24tdGVzdDwvbmFtZT4KKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8cHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz5VVEYtODwvcHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz4KKyAgICA8L3Byb3BlcnRpZXM+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgud3MucnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC53cy5ycy1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZ3JpenpseTI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LW1lZGlhLWpzb24tamFja3NvbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWpzb24tamFja3Nvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy9qc29uL0pheFJzQXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWpzb24tamFja3Nvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy9qc29uL0pheFJzQXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODU3MDlkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L2pzb24vSmF4UnNBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UubWJ3Lmpzb247CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uSmFja3NvbkZlYXR1cmU7CisKKy8qKgorICogVGVzdCBjYXNlIEpBWC1SUyBhcHBsaWNhdGlvbi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSmF4UnNBcHBsaWNhdGlvbiBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKworICAgIHN0YXRpYyBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IEFQUF9DTEFTU0VTID0gbmV3IEhhc2hTZXQ8Q2xhc3M8Pz4+KCl7CisgICAgICAgIHsKKyAgICAgICAgIGFkZChKc29uRW50aXR5UmVzb3VyY2UuY2xhc3MpOworICAgICAgICAgYWRkKEphY2tzb25GZWF0dXJlLmNsYXNzKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICByZXR1cm4gQVBQX0NMQVNTRVM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L2pzb24vSnNvbkVudGl0eVJlc291cmNlLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy1qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncvanNvbi9Kc29uRW50aXR5UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTQ1MjkxCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctanNvbi1qYWNrc29uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L2pzb24vSnNvbkVudGl0eVJlc291cmNlLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5tYncuanNvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QVVQ7CisKKy8qKgorICogVGVzdCByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiLyIpCitAQ29uc3VtZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCitAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX0pTT04pCitwdWJsaWMgY2xhc3MgSnNvbkVudGl0eVJlc291cmNlIHsKKworICAgIEBQT1NUCisgICAgcHVibGljIFBlcnNvbiBlY2hvKGZpbmFsIFBlcnNvbiBwZXJzb24pIHsKKyAgICAgICAgcmV0dXJuIHBlcnNvbjsKKyAgICB9CisKKyAgICBAUFVUCisgICAgcHVibGljIHZvaWQgcHV0KGZpbmFsIFBlcnNvbiBwZXJzb24pIHsKKyAgICB9CisKKyAgICBAR0VUCisgICAgcHVibGljIFBlcnNvbiBnZXQoKSB7CisgICAgICAgIHJldHVybiBuZXcgUGVyc29uKCJXb2xmZ2FuZyIsIDIxLCAiU2FsemJ1cmciKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy1qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncvanNvbi9QZXJzb24uamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWpzb24tamFja3Nvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy9qc29uL1BlcnNvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYWYyYjAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy1qc29uLWphY2tzb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncvanNvbi9QZXJzb24uamF2YQpAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLm1idy5qc29uOworCitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CisKKy8qKgorICogVGVzdCBkYXRhIGJlYW4uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFBlcnNvbiB7CisKKyAgICBwdWJsaWMgU3RyaW5nIG5hbWU7CisgICAgcHVibGljIGludCBhZ2U7CisgICAgcHVibGljIFN0cmluZyBhZGRyZXNzOworCisgICAgcHVibGljIFBlcnNvbihTdHJpbmcgbmFtZSwgaW50IGFnZSwgU3RyaW5nIGFkZHJlc3MpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5hZ2UgPSBhZ2U7CisgICAgICAgIHRoaXMuYWRkcmVzcyA9IGFkZHJlc3M7CisgICAgfQorCisgICAgcHVibGljIFBlcnNvbigpIHsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgaGFzaCA9IDc7CisgICAgICAgIGhhc2ggPSAxOSAqIGhhc2ggKyBPYmplY3RzLmhhc2hDb2RlKHRoaXMubmFtZSk7CisgICAgICAgIGhhc2ggPSAxOSAqIGhhc2ggKyB0aGlzLmFnZTsKKyAgICAgICAgaGFzaCA9IDE5ICogaGFzaCArIE9iamVjdHMuaGFzaENvZGUodGhpcy5hZGRyZXNzKTsKKyAgICAgICAgcmV0dXJuIGhhc2g7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKKyAgICAgICAgaWYgKG9iaiA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldENsYXNzKCkgIT0gb2JqLmdldENsYXNzKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmaW5hbCBQZXJzb24gb3RoZXIgPSAoUGVyc29uKSBvYmo7CisgICAgICAgIGlmICghT2JqZWN0cy5lcXVhbHModGhpcy5uYW1lLCBvdGhlci5uYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICh0aGlzLmFnZSAhPSBvdGhlci5hZ2UpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKE9iamVjdHMuZXF1YWxzKHRoaXMuYWRkcmVzcywgb3RoZXIuYWRkcmVzcykpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWpzb24tamFja3Nvbi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctanNvbi1qYWNrc29uL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhlZWE2YwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWpzb24tamFja3Nvbi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMy4xIgorICAgICAgICAgeG1sbnM9Imh0dHA6Ly94bWxucy5qY3Aub3JnL3htbC9ucy9qYXZhZWUiCisgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8veG1sbnMuamNwLm9yZy94bWwvbnMvamF2YWVlIGh0dHA6Ly94bWxucy5qY3Aub3JnL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8zXzEueHNkIj4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkpheFJzQXBwbGljYXRpb248L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LndzLnJzLkFwcGxpY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLm1idy5qc29uLkpheFJzQXBwbGljYXRpb248L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkpheFJzQXBwbGljYXRpb248L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWpzb24tamFja3Nvbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy9qc29uL0pzb25FbnRpdHlUZXN0LmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy1qc29uLWphY2tzb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncvanNvbi9Kc29uRW50aXR5VGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhMjVkYjMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy1qc29uLWphY2tzb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncvanNvbi9Kc29uRW50aXR5VGVzdC5qYXZhCkBAIC0wLDAgKzEsNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UubWJ3Lmpzb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmphY2tzb24uSmFja3NvbkZlYXR1cmU7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKKy8qKgorICogVGVzdCBmb3IganNvbiByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSnNvbkVudGl0eVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgSmF4UnNBcHBsaWNhdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihKYWNrc29uRmVhdHVyZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgeworICAgICAgICBmaW5hbCBQZXJzb24gZ2V0UmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkuZ2V0KFBlcnNvbi5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiV29sZmdhbmciLCBnZXRSZXNwb25zZS5uYW1lKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIxLCBnZXRSZXNwb25zZS5hZ2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlNhbHpidXJnIiwgZ2V0UmVzcG9uc2UuYWRkcmVzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdCgpIHsKKyAgICAgICAgZmluYWwgUGVyc29uW10gdGVzdERhdGEgPSBuZXcgUGVyc29uW10ge25ldyBQZXJzb24oIkpvc2VwaCIsIDIzLCAiTmF6YXJldGgiKSwgbmV3IFBlcnNvbigiTWFyeSIsIDE4LCAiTmF6YXJldGgiKSB9OworICAgICAgICBmb3IgKFBlcnNvbiBvcmlnaW5hbCA6IHRlc3REYXRhKSB7CisgICAgICAgICAgICBmaW5hbCBQZXJzb24gcG9zdFJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLnBvc3QoRW50aXR5Lmpzb24ob3JpZ2luYWwpLCBQZXJzb24uY2xhc3MpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLCBwb3N0UmVzcG9uc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0KCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSBwdXRSZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5wdXQoRW50aXR5Lmpzb24obmV3IFBlcnNvbigiSnVsZXMiLCAxMiwgIlBhcmlzIikpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwNCwgcHV0UmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWpzb24tbW94eS9wb20ueG1sIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctanNvbi1tb3h5L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGRkODI0NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWpzb24tbW94eS9wb20ueG1sCkBAIC0wLDAgKzEsNjEgQEAKKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS50ZXN0Y2FzZXM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5qc29uLW1veHk8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKworICAgIDxuYW1lPmplcnNleS10ZXN0cy1wZXJmb3JtYW5jZS1qc29uLW1veHktdGVzdDwvbmFtZT4KKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8cHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz5VVEYtODwvcHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz4KKyAgICA8L3Byb3BlcnRpZXM+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWdyaXp6bHkyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1tb3h5PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWpzb24tbW94eS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy9qc29uL0pheFJzQXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWpzb24tbW94eS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy9qc29uL0pheFJzQXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NmY5NmRjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctanNvbi1tb3h5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L2pzb24vSmF4UnNBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UubWJ3Lmpzb247CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1veHkuanNvbi5Nb3h5SnNvbkZlYXR1cmU7CisKKworLyoqCisgKiBUZXN0IGNhc2UgSkFYLVJTIGFwcGxpY2F0aW9uLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBKYXhSc0FwcGxpY2F0aW9uIGV4dGVuZHMgQXBwbGljYXRpb24geworCisgICAgc3RhdGljIGZpbmFsIFNldDxDbGFzczw/Pj4gQVBQX0NMQVNTRVMgPSBuZXcgSGFzaFNldDxDbGFzczw/Pj4oKXsKKyAgICAgICAgeworICAgICAgICAgYWRkKEpzb25FbnRpdHlSZXNvdXJjZS5jbGFzcyk7CisgICAgICAgICBhZGQoTW94eUpzb25GZWF0dXJlLmNsYXNzKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICByZXR1cm4gQVBQX0NMQVNTRVM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctanNvbi1tb3h5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L2pzb24vSnNvbkVudGl0eVJlc291cmNlLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy1qc29uLW1veHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncvanNvbi9Kc29uRW50aXR5UmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iN2FmYzM2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctanNvbi1tb3h5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L2pzb24vSnNvbkVudGl0eVJlc291cmNlLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5tYncuanNvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUFVUOworCisvKioKKyAqIFRlc3QgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIi8iKQorQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9KU09OKQorcHVibGljIGNsYXNzIEpzb25FbnRpdHlSZXNvdXJjZSB7CisKKyAgICBAUE9TVAorICAgIHB1YmxpYyBQZXJzb24gZWNobyhmaW5hbCBQZXJzb24gcGVyc29uKSB7CisgICAgICAgIHJldHVybiBwZXJzb247CisgICAgfQorCisgICAgQFBVVAorICAgIHB1YmxpYyB2b2lkIHB1dChmaW5hbCBQZXJzb24gcGVyc29uKSB7CisgICAgfQorCisgICAgQEdFVAorICAgIHB1YmxpYyBQZXJzb24gZ2V0KCkgeworICAgICAgICByZXR1cm4gbmV3IFBlcnNvbigiV29sZmdhbmciLCAyMSwgIlNhbHpidXJnIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctanNvbi1tb3h5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L2pzb24vUGVyc29uLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy1qc29uLW1veHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncvanNvbi9QZXJzb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2FmMmIwCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctanNvbi1tb3h5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L2pzb24vUGVyc29uLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5tYncuanNvbjsKKworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworCisvKioKKyAqIFRlc3QgZGF0YSBiZWFuLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBQZXJzb24geworCisgICAgcHVibGljIFN0cmluZyBuYW1lOworICAgIHB1YmxpYyBpbnQgYWdlOworICAgIHB1YmxpYyBTdHJpbmcgYWRkcmVzczsKKworICAgIHB1YmxpYyBQZXJzb24oU3RyaW5nIG5hbWUsIGludCBhZ2UsIFN0cmluZyBhZGRyZXNzKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuYWdlID0gYWdlOworICAgICAgICB0aGlzLmFkZHJlc3MgPSBhZGRyZXNzOworICAgIH0KKworICAgIHB1YmxpYyBQZXJzb24oKSB7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGhhc2ggPSA3OworICAgICAgICBoYXNoID0gMTkgKiBoYXNoICsgT2JqZWN0cy5oYXNoQ29kZSh0aGlzLm5hbWUpOworICAgICAgICBoYXNoID0gMTkgKiBoYXNoICsgdGhpcy5hZ2U7CisgICAgICAgIGhhc2ggPSAxOSAqIGhhc2ggKyBPYmplY3RzLmhhc2hDb2RlKHRoaXMuYWRkcmVzcyk7CisgICAgICAgIHJldHVybiBoYXNoOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgUGVyc29uIG90aGVyID0gKFBlcnNvbikgb2JqOworICAgICAgICBpZiAoIU9iamVjdHMuZXF1YWxzKHRoaXMubmFtZSwgb3RoZXIubmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5hZ2UgIT0gb3RoZXIuYWdlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChPYmplY3RzLmVxdWFscyh0aGlzLmFkZHJlc3MsIG90aGVyLmFkZHJlc3MpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy1qc29uLW1veHkvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWpzb24tbW94eS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZWVhNmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy1qc29uLW1veHkvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDM4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjMuMSIKKyAgICAgICAgIHhtbG5zPSJodHRwOi8veG1sbnMuamNwLm9yZy94bWwvbnMvamF2YWVlIgorICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3htbG5zLmpjcC5vcmcveG1sL25zL2phdmFlZSBodHRwOi8veG1sbnMuamNwLm9yZy94bWwvbnMvamF2YWVlL3dlYi1hcHBfM18xLnhzZCI+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5KYXhSc0FwcGxpY2F0aW9uPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC53cy5ycy5BcHBsaWNhdGlvbjwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5tYncuanNvbi5KYXhSc0FwcGxpY2F0aW9uPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5KYXhSc0FwcGxpY2F0aW9uPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy1qc29uLW1veHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncvanNvbi9Kc29uRW50aXR5VGVzdC5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctanNvbi1tb3h5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L2pzb24vSnNvbkVudGl0eVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2YyYzQyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctanNvbi1tb3h5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L2pzb24vSnNvbkVudGl0eVRlc3QuamF2YQpAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLm1idy5qc29uOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1veHkuanNvbi5Nb3h5SnNvbkZlYXR1cmU7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFRlc3QgZm9yIGpzb24gcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEpzb25FbnRpdHlUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IEpheFJzQXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgICAgICBjb25maWcucmVnaXN0ZXIoTW94eUpzb25GZWF0dXJlLmNsYXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXQoKSB7CisgICAgICAgIGZpbmFsIFBlcnNvbiBnZXRSZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5nZXQoUGVyc29uLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJXb2xmZ2FuZyIsIGdldFJlc3BvbnNlLm5hbWUpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjEsIGdldFJlc3BvbnNlLmFnZSk7CisgICAgICAgIGFzc2VydEVxdWFscygiU2FsemJ1cmciLCBnZXRSZXNwb25zZS5hZGRyZXNzKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQb3N0KCkgeworICAgICAgICBmaW5hbCBQZXJzb25bXSB0ZXN0RGF0YSA9IG5ldyBQZXJzb25bXSB7bmV3IFBlcnNvbigiSm9zZXBoIiwgMjMsICJOYXphcmV0aCIpLCBuZXcgUGVyc29uKCJNYXJ5IiwgMTgsICJOYXphcmV0aCIpIH07CisgICAgICAgIGZvciAoUGVyc29uIG9yaWdpbmFsIDogdGVzdERhdGEpIHsKKyAgICAgICAgICAgIGZpbmFsIFBlcnNvbiBwb3N0UmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkucG9zdChFbnRpdHkuanNvbihvcmlnaW5hbCksIFBlcnNvbi5jbGFzcyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMob3JpZ2luYWwsIHBvc3RSZXNwb25zZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQdXQoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHB1dFJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLnB1dChFbnRpdHkuanNvbihuZXcgUGVyc29uKCJKdWxlcyIsIDEyLCAiUGFyaXMiKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjA0LCBwdXRSZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYncta3J5by9wb20ueG1sIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYncta3J5by9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZDg5YzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy1rcnlvL3BvbS54bWwKQEAgLTAsMCArMSw2MSBAQAorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLnRlc3RjYXNlczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPm1idy1rcnlvPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisKKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtcGVyZm9ybWFuY2UtbWJ3LWtyeW8tdGVzdDwvbmFtZT4KKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8cHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz5VVEYtODwvcHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz4KKyAgICA8L3Byb3BlcnRpZXM+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWdyaXp6bHkyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1rcnlvPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWtyeW8vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncva3J5by9KYXhSc0FwcGxpY2F0aW9uLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy1rcnlvL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L2tyeW8vSmF4UnNBcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2ZWVmMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy1rcnlvL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L2tyeW8vSmF4UnNBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UubWJ3LmtyeW87CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworLyoqCisgKiBUZXN0IGNhc2UgSkFYLVJTIGFwcGxpY2F0aW9uLgorICoKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBKYXhSc0FwcGxpY2F0aW9uIGV4dGVuZHMgQXBwbGljYXRpb24geworCisgICAgc3RhdGljIGZpbmFsIFNldDxDbGFzczw/Pj4gQVBQX0NMQVNTRVMgPSBuZXcgSGFzaFNldDxDbGFzczw/Pj4oKSB7eworICAgICAgICBhZGQoUGVyc29uUmVzb3VyY2UuY2xhc3MpOworICAgIH19OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgcmV0dXJuIEFQUF9DTEFTU0VTOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYncta3J5by9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy9rcnlvL1BlcnNvbi5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYncta3J5by9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy9rcnlvL1BlcnNvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYzhkOWUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy1rcnlvL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L2tyeW8vUGVyc29uLmphdmEKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5tYncua3J5bzsKKworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworCisvKioKKyAqIFRlc3QgZGF0YSBiZWFuLgorICoKKyAqIEBhdXRob3IgTGlib3IgS3JhbW9saXMgKGxpYm9yLmtyYW1vbGlzIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBQZXJzb24geworCisgICAgcHVibGljIFN0cmluZyBuYW1lOworICAgIHB1YmxpYyBpbnQgYWdlOworICAgIHB1YmxpYyBTdHJpbmcgYWRkcmVzczsKKworICAgIHB1YmxpYyBQZXJzb24oU3RyaW5nIG5hbWUsIGludCBhZ2UsIFN0cmluZyBhZGRyZXNzKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuYWdlID0gYWdlOworICAgICAgICB0aGlzLmFkZHJlc3MgPSBhZGRyZXNzOworICAgIH0KKworICAgIHB1YmxpYyBQZXJzb24oKSB7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGhhc2ggPSA3OworICAgICAgICBoYXNoID0gMTkgKiBoYXNoICsgT2JqZWN0cy5oYXNoQ29kZSh0aGlzLm5hbWUpOworICAgICAgICBoYXNoID0gMTkgKiBoYXNoICsgdGhpcy5hZ2U7CisgICAgICAgIGhhc2ggPSAxOSAqIGhhc2ggKyBPYmplY3RzLmhhc2hDb2RlKHRoaXMuYWRkcmVzcyk7CisgICAgICAgIHJldHVybiBoYXNoOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgUGVyc29uIG90aGVyID0gKFBlcnNvbikgb2JqOworICAgICAgICBpZiAoIU9iamVjdHMuZXF1YWxzKHRoaXMubmFtZSwgb3RoZXIubmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5hZ2UgIT0gb3RoZXIuYWdlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChPYmplY3RzLmVxdWFscyh0aGlzLmFkZHJlc3MsIG90aGVyLmFkZHJlc3MpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy1rcnlvL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L2tyeW8vUGVyc29uUmVzb3VyY2UuamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LWtyeW8vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncva3J5by9QZXJzb25SZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0NjUzNjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy1rcnlvL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L2tyeW8vUGVyc29uUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLm1idy5rcnlvOworCitpbXBvcnQgamF2YXgud3MucnMuQ29uc3VtZXM7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUFVUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CisKKy8qKgorICogVGVzdCByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiLyIpCitAQ29uc3VtZXMoImFwcGxpY2F0aW9uL3gta3J5byIpCitAUHJvZHVjZXMoImFwcGxpY2F0aW9uL3gta3J5byIpCitwdWJsaWMgY2xhc3MgUGVyc29uUmVzb3VyY2UgeworCisgICAgQFBPU1QKKyAgICBwdWJsaWMgUGVyc29uIGVjaG8oZmluYWwgUGVyc29uIHBlcnNvbikgeworICAgICAgICByZXR1cm4gcGVyc29uOworICAgIH0KKworICAgIEBQVVQKKyAgICBwdWJsaWMgdm9pZCBwdXQoZmluYWwgUGVyc29uIHBlcnNvbikgeworICAgIH0KKworICAgIEBHRVQKKyAgICBwdWJsaWMgUGVyc29uIGdldCgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQZXJzb24oIldvbGZnYW5nIiwgMjEsICJTYWx6YnVyZyIpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYncta3J5by9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYncta3J5by9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NzViNzAKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy1rcnlvL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwzOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIzLjEiCisgICAgICAgICB4bWxucz0iaHR0cDovL3htbG5zLmpjcC5vcmcveG1sL25zL2phdmFlZSIKKyAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly94bWxucy5qY3Aub3JnL3htbC9ucy9qYXZhZWUgaHR0cDovL3htbG5zLmpjcC5vcmcveG1sL25zL2phdmFlZS93ZWItYXBwXzNfMS54c2QiPgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SmF4UnNBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UubWJ3LmtyeW8uSmF4UnNBcHBsaWNhdGlvbjwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SmF4UnNBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYncta3J5by9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy9rcnlvL1BlcnNvblJlc291cmNlVGVzdC5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYncta3J5by9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy9rcnlvL1BlcnNvblJlc291cmNlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMDNlOGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy1rcnlvL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L2tyeW8vUGVyc29uUmVzb3VyY2VUZXN0LmphdmEKQEAgLTAsMCArMSw3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5tYncua3J5bzsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuY2xpZW50LkNsaWVudENvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LkplcnNleVRlc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogVGVzdCBmb3Iga3J5byByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIExpYm9yIEtyYW1vbGlzIChsaWJvci5rcmFtb2xpcyBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgUGVyc29uUmVzb3VyY2VUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IEpheFJzQXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgdm9pZCBjb25maWd1cmVDbGllbnQoZmluYWwgQ2xpZW50Q29uZmlnIGNvbmZpZykgeworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldCgpIHsKKyAgICAgICAgZmluYWwgUGVyc29uIGdldFJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLmdldChQZXJzb24uY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIldvbGZnYW5nIiwgZ2V0UmVzcG9uc2UubmFtZSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMSwgZ2V0UmVzcG9uc2UuYWdlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTYWx6YnVyZyIsIGdldFJlc3BvbnNlLmFkZHJlc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc3QoKSB7CisgICAgICAgIGZpbmFsIFBlcnNvbltdIHRlc3REYXRhID0gbmV3IFBlcnNvbltdIHtuZXcgUGVyc29uKCJKb3NlcGgiLCAyMywgIk5hemFyZXRoIiksIG5ldyBQZXJzb24oIk1hcnkiLCAxOCwgIk5hemFyZXRoIil9OworICAgICAgICBmb3IgKFBlcnNvbiBvcmlnaW5hbCA6IHRlc3REYXRhKSB7CisgICAgICAgICAgICBmaW5hbCBQZXJzb24gcG9zdFJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpCisgICAgICAgICAgICAgICAgICAgIC5wb3N0KEVudGl0eS5lbnRpdHkob3JpZ2luYWwsICJhcHBsaWNhdGlvbi94LWtyeW8iKSwgUGVyc29uLmNsYXNzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhvcmlnaW5hbCwgcG9zdFJlc3BvbnNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFB1dCgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcHV0UmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkucHV0KEVudGl0eS5lbnRpdHkobmV3IFBlcnNvbigiSnVsZXMiLCAxMiwgIlBhcmlzIiksCisgICAgICAgICAgICAgICAgImFwcGxpY2F0aW9uL3gta3J5byIpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIwNCwgcHV0UmVzcG9uc2UuZ2V0U3RhdHVzKCkpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctdGV4dC1wbGFpbi9wb20ueG1sIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctdGV4dC1wbGFpbi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5N2Q0YzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy10ZXh0LXBsYWluL3BvbS54bWwKQEAgLTAsMCArMSw2MSBAQAorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLnRlc3RjYXNlczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPnRleHQtcGxhaW48L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKworICAgIDxuYW1lPmplcnNleS10ZXN0cy1wZXJmb3JtYW5jZS10ZXh0LXBsYWluLXRlc3Q8L25hbWU+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPHByb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+VVRGLTg8L3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+CisgICAgPC9wcm9wZXJ0aWVzPgorCisgICAgPGRlcGVuZGVuY2llcz4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmphdmF4LndzLnJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amF2YXgud3MucnMtYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWdyaXp6bHkyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy10ZXh0LXBsYWluL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L3RleHQvSmF4UnNBcHBsaWNhdGlvbi5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctdGV4dC1wbGFpbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy90ZXh0L0pheFJzQXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjY1MWU2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctdGV4dC1wbGFpbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy90ZXh0L0pheFJzQXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLm1idy50ZXh0OworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKKy8qKgorICogVGVzdCBjYXNlIEpBWC1SUyBhcHBsaWNhdGlvbi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSmF4UnNBcHBsaWNhdGlvbiBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKworICAgIHN0YXRpYyBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IEFQUF9DTEFTU0VTID0gbmV3IEhhc2hTZXQ8Q2xhc3M8Pz4+KCkge3sKKyAgICAgICAgYWRkKFRleHRFbnRpdHlSZXNvdXJjZS5jbGFzcyk7CisgICAgfX07CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICByZXR1cm4gQVBQX0NMQVNTRVM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctdGV4dC1wbGFpbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy90ZXh0L1RleHRFbnRpdHlSZXNvdXJjZS5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctdGV4dC1wbGFpbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy90ZXh0L1RleHRFbnRpdHlSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1YWY3MmMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy10ZXh0LXBsYWluL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L3RleHQvVGV4dEVudGl0eVJlc291cmNlLmphdmEKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5tYncudGV4dDsKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QVVQ7CisKKy8qKgorICogVGVzdCByZXNvdXJjZS4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgiLyIpCitAQ29uc3VtZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCitAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCitwdWJsaWMgY2xhc3MgVGV4dEVudGl0eVJlc291cmNlIHsKKworICAgIEBQT1NUCisgICAgcHVibGljIFN0cmluZyBlY2hvKGZpbmFsIFN0cmluZyB0ZXh0KSB7CisgICAgICAgIHJldHVybiB0ZXh0OworICAgIH0KKworICAgIEBQVVQKKyAgICBwdWJsaWMgdm9pZCBwdXQoZmluYWwgU3RyaW5nIHRleHQpIHsKKyAgICB9CisKKyAgICBAR0VUCisgICAgcHVibGljIFN0cmluZyBnZXQoKSB7CisgICAgICAgIHJldHVybiAidGV4dCI7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctdGV4dC1wbGFpbi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctdGV4dC1wbGFpbi9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0NzY5MDUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy10ZXh0LXBsYWluL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwzOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIzLjEiCisgICAgICAgICB4bWxucz0iaHR0cDovL3htbG5zLmpjcC5vcmcveG1sL25zL2phdmFlZSIKKyAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly94bWxucy5qY3Aub3JnL3htbC9ucy9qYXZhZWUgaHR0cDovL3htbG5zLmpjcC5vcmcveG1sL25zL2phdmFlZS93ZWItYXBwXzNfMS54c2QiPgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SmF4UnNBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UubWJ3LnRleHQuSmF4UnNBcHBsaWNhdGlvbjwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SmF4UnNBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctdGV4dC1wbGFpbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy90ZXh0L1RleHRFbnRpdHlUZXN0LmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy10ZXh0LXBsYWluL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L3RleHQvVGV4dEVudGl0eVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjZlY2I0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYnctdGV4dC1wbGFpbi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy90ZXh0L1RleHRFbnRpdHlUZXN0LmphdmEKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5tYncudGV4dDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5FbnRpdHk7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlc3BvbnNlOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworCisvKioKKyAqIFRlc3QgZm9yIHRleHQgcGxhaW4gcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFRleHRFbnRpdHlUZXN0IGV4dGVuZHMgSmVyc2V5VGVzdCB7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwcm90ZWN0ZWQgQXBwbGljYXRpb24gY29uZmlndXJlKCkgeworICAgICAgICByZXR1cm4gbmV3IEpheFJzQXBwbGljYXRpb24oKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RHZXQoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBnZXRSZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJ0ZXh0IiwgZ2V0UmVzcG9uc2UpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc3QoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZ1tdIHRlc3REYXRhID0gbmV3IFN0cmluZ1tdIHsib25lIiwgInR3byIsICJ0aHJlZSIgfTsKKyAgICAgICAgZm9yIChTdHJpbmcgb3JpZ2luYWwgOiB0ZXN0RGF0YSkgeworICAgICAgICAgICAgZmluYWwgU3RyaW5nIHBvc3RSZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS50ZXh0KG9yaWdpbmFsKSwgU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhvcmlnaW5hbCwgcG9zdFJlc3BvbnNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFB1dCgpIHsKKyAgICAgICAgZmluYWwgUmVzcG9uc2UgcHV0UmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkucHV0KEVudGl0eS50ZXh0KCJ0ZXh0IikpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjA0LCBwdXRSZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYncteG1sLWpheGIvcG9tLnhtbCBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LXhtbC1qYXhiL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY0NDQ3MQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LXhtbC1qYXhiL3BvbS54bWwKQEAgLTAsMCArMSw2MCBAQAorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLnRlc3RjYXNlczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPnhtbC1qYXhiPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisKKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtcGVyZm9ybWFuY2UteG1sLWpheGItdGVzdDwvbmFtZT4KKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8cHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz5VVEYtODwvcHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz4KKyAgICA8L3Byb3BlcnRpZXM+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgud3MucnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC53cy5ycy1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZ3JpenpseTI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy14bWwtamF4Yi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy94bWwvSmF4UnNBcHBsaWNhdGlvbi5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYncteG1sLWpheGIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncveG1sL0pheFJzQXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGE0N2VlCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYncteG1sLWpheGIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncveG1sL0pheFJzQXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDM5IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLm1idy54bWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworLyoqCisgKiBUZXN0IGNhc2UgSkFYLVJTIGFwcGxpY2F0aW9uLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBKYXhSc0FwcGxpY2F0aW9uIGV4dGVuZHMgQXBwbGljYXRpb24geworCisgICAgc3RhdGljIGZpbmFsIFNldDxDbGFzczw/Pj4gQVBQX0NMQVNTRVMgPSBuZXcgSGFzaFNldDxDbGFzczw/Pj4oKSB7eworICAgICAgICBhZGQoWG1sRW50aXR5UmVzb3VyY2UuY2xhc3MpOworICAgIH19OworCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFNldDxDbGFzczw/Pj4gZ2V0Q2xhc3NlcygpIHsKKyAgICAgICAgcmV0dXJuIEFQUF9DTEFTU0VTOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LXhtbC1qYXhiL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L3htbC9QZXJzb24uamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LXhtbC1qYXhiL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L3htbC9QZXJzb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDlmNmZmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYncteG1sLWpheGIvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncveG1sL1BlcnNvbi5qYXZhCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTIsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UubWJ3LnhtbDsKKworaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOworCitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworLyoqCisgKiBUZXN0IGRhdGEgYmVhbi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAWG1sUm9vdEVsZW1lbnQKK3B1YmxpYyBjbGFzcyBQZXJzb24geworCisgICAgcHVibGljIFN0cmluZyBuYW1lOworICAgIHB1YmxpYyBpbnQgYWdlOworICAgIHB1YmxpYyBTdHJpbmcgYWRkcmVzczsKKworICAgIHB1YmxpYyBQZXJzb24oU3RyaW5nIG5hbWUsIGludCBhZ2UsIFN0cmluZyBhZGRyZXNzKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuYWdlID0gYWdlOworICAgICAgICB0aGlzLmFkZHJlc3MgPSBhZGRyZXNzOworICAgIH0KKworICAgIHB1YmxpYyBQZXJzb24oKSB7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGhhc2ggPSA3OworICAgICAgICBoYXNoID0gMTkgKiBoYXNoICsgT2JqZWN0cy5oYXNoQ29kZSh0aGlzLm5hbWUpOworICAgICAgICBoYXNoID0gMTkgKiBoYXNoICsgdGhpcy5hZ2U7CisgICAgICAgIGhhc2ggPSAxOSAqIGhhc2ggKyBPYmplY3RzLmhhc2hDb2RlKHRoaXMuYWRkcmVzcyk7CisgICAgICAgIHJldHVybiBoYXNoOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgUGVyc29uIG90aGVyID0gKFBlcnNvbikgb2JqOworICAgICAgICBpZiAoIU9iamVjdHMuZXF1YWxzKHRoaXMubmFtZSwgb3RoZXIubmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5hZ2UgIT0gb3RoZXIuYWdlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChPYmplY3RzLmVxdWFscyh0aGlzLmFkZHJlc3MsIG90aGVyLmFkZHJlc3MpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy14bWwtamF4Yi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy94bWwvWG1sRW50aXR5UmVzb3VyY2UuamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LXhtbC1qYXhiL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L3htbC9YbWxFbnRpdHlSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhZjYyNWMKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy14bWwtamF4Yi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy94bWwvWG1sRW50aXR5UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLm1idy54bWw7CisKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUFVUOworCisvKioKKyAqIFRlc3QgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIi8iKQorQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUwpCitAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTCkKK3B1YmxpYyBjbGFzcyBYbWxFbnRpdHlSZXNvdXJjZSB7CisKKyAgICBAUE9TVAorICAgIHB1YmxpYyBQZXJzb24gZWNobyhmaW5hbCBQZXJzb24gcGVyc29uKSB7CisgICAgICAgIHJldHVybiBwZXJzb247CisgICAgfQorCisgICAgQFBVVAorICAgIHB1YmxpYyB2b2lkIHB1dChmaW5hbCBQZXJzb24gcGVyc29uKSB7CisgICAgfQorCisgICAgQEdFVAorICAgIHB1YmxpYyBQZXJzb24gZ2V0KCkgeworICAgICAgICByZXR1cm4gbmV3IFBlcnNvbigiV29sZmdhbmciLCAyMSwgIlNhbHpidXJnIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYncteG1sLWpheGIvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LXhtbC1qYXhiL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE4MDAxOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LXhtbC1qYXhiL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwzOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIzLjEiCisgICAgICAgICB4bWxucz0iaHR0cDovL3htbG5zLmpjcC5vcmcveG1sL25zL2phdmFlZSIKKyAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly94bWxucy5qY3Aub3JnL3htbC9ucy9qYXZhZWUgaHR0cDovL3htbG5zLmpjcC5vcmcveG1sL25zL2phdmFlZS93ZWItYXBwXzNfMS54c2QiPgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SmF4UnNBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UubWJ3LnhtbC5KYXhSc0FwcGxpY2F0aW9uPC9wYXJhbS12YWx1ZT4KKyAgICAgICAgPC9pbml0LXBhcmFtPgorICAgICAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KKyAgICA8L3NlcnZsZXQ+CisgICAgPHNlcnZsZXQtbWFwcGluZz4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5KYXhSc0FwcGxpY2F0aW9uPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDx1cmwtcGF0dGVybj4vKjwvdXJsLXBhdHRlcm4+CisgICAgPC9zZXJ2bGV0LW1hcHBpbmc+Cis8L3dlYi1hcHA+CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy14bWwtamF4Yi9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy94bWwvWG1sRW50aXR5VGVzdC5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYncteG1sLWpheGIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncveG1sL1htbEVudGl0eVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTgyOTAyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYncteG1sLWpheGIvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncveG1sL1htbEVudGl0eVRlc3QuamF2YQpAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLm1idy54bWw7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jbGllbnQuRW50aXR5OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5SZXNwb25zZTsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBUZXN0IGZvciBYTUwgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFhtbEVudGl0eVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgSmF4UnNBcHBsaWNhdGlvbigpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdEdldCgpIHsKKyAgICAgICAgZmluYWwgUGVyc29uIGdldFJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLmdldChQZXJzb24uY2xhc3MpOworICAgICAgICBhc3NlcnRFcXVhbHMoIldvbGZnYW5nIiwgZ2V0UmVzcG9uc2UubmFtZSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMSwgZ2V0UmVzcG9uc2UuYWdlKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJTYWx6YnVyZyIsIGdldFJlc3BvbnNlLmFkZHJlc3MpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBvc3QoKSB7CisgICAgICAgIGZpbmFsIFBlcnNvbltdIHRlc3REYXRhID0gbmV3IFBlcnNvbltdIHtuZXcgUGVyc29uKCJKb3NlcGgiLCAyMywgIk5hemFyZXRoIiksIG5ldyBQZXJzb24oIk1hcnkiLCAxOCwgIk5hemFyZXRoIikgfTsKKyAgICAgICAgZm9yIChQZXJzb24gb3JpZ2luYWwgOiB0ZXN0RGF0YSkgeworICAgICAgICAgICAgZmluYWwgUGVyc29uIHBvc3RSZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5wb3N0KEVudGl0eS54bWwob3JpZ2luYWwpLCBQZXJzb24uY2xhc3MpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKG9yaWdpbmFsLCBwb3N0UmVzcG9uc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UHV0KCkgeworICAgICAgICBmaW5hbCBSZXNwb25zZSBwdXRSZXNwb25zZSA9IHRhcmdldCgpLnJlcXVlc3QoKS5wdXQoRW50aXR5LnhtbChuZXcgUGVyc29uKCJKdWxlcyIsIDEyLCAiUGFyaXMiKSkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMjA0LCBwdXRSZXNwb25zZS5nZXRTdGF0dXMoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYncteG1sLW1veHkvcG9tLnhtbCBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LXhtbC1tb3h5L3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI0MGI4NAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LXhtbC1tb3h5L3BvbS54bWwKQEAgLTAsMCArMSw2MCBAQAorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLnRlc3RjYXNlczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPnhtbC1tb3h5PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisKKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtcGVyZm9ybWFuY2UteG1sLW1veHktdGVzdDwvbmFtZT4KKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8cHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz5VVEYtODwvcHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz4KKyAgICA8L3Byb3BlcnRpZXM+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC1mcmFtZXdvcmsucHJvdmlkZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXByb3ZpZGVyLWdyaXp6bHkyPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5tZWRpYTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1tZWRpYS1tb3h5PC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy14bWwtbW94eS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy94bWwvSmF4UnNBcHBsaWNhdGlvbi5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYncteG1sLW1veHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncveG1sL0pheFJzQXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGU1MWIzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYncteG1sLW1veHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncveG1sL0pheFJzQXBwbGljYXRpb24uamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLm1idy54bWw7CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1veHkueG1sLk1veHlYbWxGZWF0dXJlOworCisvKioKKyAqIFRlc3QgY2FzZSBKQVgtUlMgYXBwbGljYXRpb24uCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEpheFJzQXBwbGljYXRpb24gZXh0ZW5kcyBBcHBsaWNhdGlvbiB7CisKKyAgICBzdGF0aWMgZmluYWwgU2V0PENsYXNzPD8+PiBBUFBfQ0xBU1NFUyA9IG5ldyBIYXNoU2V0PENsYXNzPD8+PigpeworICAgICAgICB7CisgICAgICAgICAgICBhZGQoWG1sRW50aXR5UmVzb3VyY2UuY2xhc3MpOworICAgICAgICAgICAgYWRkKE1veHlYbWxGZWF0dXJlLmNsYXNzKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU2V0PENsYXNzPD8+PiBnZXRDbGFzc2VzKCkgeworICAgICAgICByZXR1cm4gQVBQX0NMQVNTRVM7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYncteG1sLW1veHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncveG1sL1BlcnNvbi5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYncteG1sLW1veHkvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncveG1sL1BlcnNvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MDlhYzUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy14bWwtbW94eS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy94bWwvUGVyc29uLmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMiwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5tYncueG1sOworCitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CitpbXBvcnQgamF2YXgueG1sLmJpbmQuYW5ub3RhdGlvbi5YbWxSb290RWxlbWVudDsKKworLyoqCisgKiBUZXN0IGRhdGEgYmVhbi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAWG1sUm9vdEVsZW1lbnQKK3B1YmxpYyBjbGFzcyBQZXJzb24geworCisgICAgcHVibGljIFN0cmluZyBuYW1lOworICAgIHB1YmxpYyBpbnQgYWdlOworICAgIHB1YmxpYyBTdHJpbmcgYWRkcmVzczsKKworICAgIHB1YmxpYyBQZXJzb24oU3RyaW5nIG5hbWUsIGludCBhZ2UsIFN0cmluZyBhZGRyZXNzKSB7CisgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CisgICAgICAgIHRoaXMuYWdlID0gYWdlOworICAgICAgICB0aGlzLmFkZHJlc3MgPSBhZGRyZXNzOworICAgIH0KKworICAgIHB1YmxpYyBQZXJzb24oKSB7CisgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKKyAgICAgICAgaW50IGhhc2ggPSA3OworICAgICAgICBoYXNoID0gMTkgKiBoYXNoICsgT2JqZWN0cy5oYXNoQ29kZSh0aGlzLm5hbWUpOworICAgICAgICBoYXNoID0gMTkgKiBoYXNoICsgdGhpcy5hZ2U7CisgICAgICAgIGhhc2ggPSAxOSAqIGhhc2ggKyBPYmplY3RzLmhhc2hDb2RlKHRoaXMuYWRkcmVzcyk7CisgICAgICAgIHJldHVybiBoYXNoOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7CisgICAgICAgIGlmIChvYmogPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChnZXRDbGFzcygpICE9IG9iai5nZXRDbGFzcygpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZmluYWwgUGVyc29uIG90aGVyID0gKFBlcnNvbikgb2JqOworICAgICAgICBpZiAoIU9iamVjdHMuZXF1YWxzKHRoaXMubmFtZSwgb3RoZXIubmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodGhpcy5hZ2UgIT0gb3RoZXIuYWdlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChPYmplY3RzLmVxdWFscyh0aGlzLmFkZHJlc3MsIG90aGVyLmFkZHJlc3MpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy14bWwtbW94eS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy94bWwvWG1sRW50aXR5UmVzb3VyY2UuamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LXhtbC1tb3h5L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L3htbC9YbWxFbnRpdHlSZXNvdXJjZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyOGFiZTcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy14bWwtbW94eS9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21idy94bWwvWG1sRW50aXR5UmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLm1idy54bWw7CisKKworaW1wb3J0IGphdmF4LndzLnJzLkNvbnN1bWVzOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUFVUOworCisvKioKKyAqIFRlc3QgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIi8iKQorQENvbnN1bWVzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUwpCitAUHJvZHVjZXMoTWVkaWFUeXBlLkFQUExJQ0FUSU9OX1hNTCkKK3B1YmxpYyBjbGFzcyBYbWxFbnRpdHlSZXNvdXJjZSB7CisKKyAgICBAUE9TVAorICAgIHB1YmxpYyBQZXJzb24gZWNobyhmaW5hbCBQZXJzb24gcGVyc29uKSB7CisgICAgICAgIHJldHVybiBwZXJzb247CisgICAgfQorCisgICAgQFBVVAorICAgIHB1YmxpYyB2b2lkIHB1dChmaW5hbCBQZXJzb24gcGVyc29uKSB7CisgICAgfQorCisgICAgQEdFVAorICAgIHB1YmxpYyBQZXJzb24gZ2V0KCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBQZXJzb24oIldvbGZnYW5nIiwgMjEsICJTYWx6YnVyZyIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LXhtbC1tb3h5L3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy14bWwtbW94eS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhODAwMTkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21idy14bWwtbW94eS9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCkBAIC0wLDAgKzEsMzggQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHdlYi1hcHAgdmVyc2lvbj0iMy4xIgorICAgICAgICAgeG1sbnM9Imh0dHA6Ly94bWxucy5qY3Aub3JnL3htbC9ucy9qYXZhZWUiCisgICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8veG1sbnMuamNwLm9yZy94bWwvbnMvamF2YWVlIGh0dHA6Ly94bWxucy5qY3Aub3JnL3htbC9ucy9qYXZhZWUvd2ViLWFwcF8zXzEueHNkIj4KKworICAgIDxzZXJ2bGV0PgorICAgICAgICA8c2VydmxldC1uYW1lPkpheFJzQXBwbGljYXRpb248L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHNlcnZsZXQtY2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmxldC5TZXJ2bGV0Q29udGFpbmVyPC9zZXJ2bGV0LWNsYXNzPgorICAgICAgICA8aW5pdC1wYXJhbT4KKyAgICAgICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LndzLnJzLkFwcGxpY2F0aW9uPC9wYXJhbS1uYW1lPgorICAgICAgICAgICAgPHBhcmFtLXZhbHVlPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLm1idy54bWwuSmF4UnNBcHBsaWNhdGlvbjwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SmF4UnNBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tYncteG1sLW1veHkvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tYncveG1sL1htbEVudGl0eVRlc3QuamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LXhtbC1tb3h5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L3htbC9YbWxFbnRpdHlUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZhYmM4OQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbWJ3LXhtbC1tb3h5L3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbWJ3L3htbC9YbWxFbnRpdHlUZXN0LmphdmEKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5tYncueG1sOworCitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkVudGl0eTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVzcG9uc2U7CisKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5jbGllbnQuQ2xpZW50Q29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5Lm1veHkueG1sLk1veHlYbWxGZWF0dXJlOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworLyoqCisgKiBUZXN0IGZvciBYTUwgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFhtbEVudGl0eVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgSmF4UnNBcHBsaWNhdGlvbigpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCB2b2lkIGNvbmZpZ3VyZUNsaWVudChDbGllbnRDb25maWcgY29uZmlnKSB7CisgICAgICAgIGNvbmZpZy5yZWdpc3RlcihNb3h5WG1sRmVhdHVyZS5jbGFzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgeworICAgICAgICBmaW5hbCBQZXJzb24gZ2V0UmVzcG9uc2UgPSB0YXJnZXQoKS5yZXF1ZXN0KCkuZ2V0KFBlcnNvbi5jbGFzcyk7CisgICAgICAgIGFzc2VydEVxdWFscygiV29sZmdhbmciLCBnZXRSZXNwb25zZS5uYW1lKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDIxLCBnZXRSZXNwb25zZS5hZ2UpOworICAgICAgICBhc3NlcnRFcXVhbHMoIlNhbHpidXJnIiwgZ2V0UmVzcG9uc2UuYWRkcmVzcyk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UG9zdCgpIHsKKyAgICAgICAgZmluYWwgUGVyc29uW10gdGVzdERhdGEgPSBuZXcgUGVyc29uW10ge25ldyBQZXJzb24oIkpvc2VwaCIsIDIzLCAiTmF6YXJldGgiKSwgbmV3IFBlcnNvbigiTWFyeSIsIDE4LCAiTmF6YXJldGgiKSB9OworICAgICAgICBmb3IgKFBlcnNvbiBvcmlnaW5hbCA6IHRlc3REYXRhKSB7CisgICAgICAgICAgICBmaW5hbCBQZXJzb24gcG9zdFJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLnBvc3QoRW50aXR5LnhtbChvcmlnaW5hbCksIFBlcnNvbi5jbGFzcyk7CisgICAgICAgICAgICBhc3NlcnRFcXVhbHMob3JpZ2luYWwsIHBvc3RSZXNwb25zZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQdXQoKSB7CisgICAgICAgIGZpbmFsIFJlc3BvbnNlIHB1dFJlc3BvbnNlID0gdGFyZ2V0KCkucmVxdWVzdCgpLnB1dChFbnRpdHkueG1sKG5ldyBQZXJzb24oIkp1bGVzIiwgMTIsICJQYXJpcyIpKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMDQsIHB1dFJlc3BvbnNlLmdldFN0YXR1cygpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21vbml0b3JpbmcvcG9tLnhtbCBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbW9uaXRvcmluZy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMTQwNGIKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21vbml0b3JpbmcvcG9tLnhtbApAQCAtMCwwICsxLDExNyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5wZXJmb3JtYW5jZS5tb25pdG9yaW5nPC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPm1vbml0b3Jpbmc8L2FydGlmYWN0SWQ+CisgICAgPHZlcnNpb24+MS4wLVNOQVBTSE9UPC92ZXJzaW9uPgorICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+CisKKyAgICA8bmFtZT5tb25pdG9yaW5nLXRlc3Q8L25hbWU+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPHByb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+VVRGLTg8L3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+CisgICAgPC9wcm9wZXJ0aWVzPgorCisgICAgPGRlcGVuZGVuY2llcz4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS55YW1tZXIubWV0cmljczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm1ldHJpY3MtY29yZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjIuMS4yPC92ZXJzaW9uPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+My44LjE8L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbW1vbnMtbGFuZzwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbGFuZzwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjIuNjwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1jb2RlYzwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtY29kZWM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjU8L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZ3VhdmE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5ndWF2YTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjE0LjAuMTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNsZjRqPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+c2xmNGotamRrMTQ8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4xLjYuMTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS5jb250YWluZXJzPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LWNvbnRhaW5lci1ncml6emx5Mi1odHRwPC9hcnRpZmFjdElkPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvcj5zcmMvbWFpbi9hc3NlbWJseS96aXAtd2l0aC1qYXJzLnhtbDwvZGVzY3JpcHRvcj4KKyAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9ycz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+bWFrZS1hc3NlbWJseTwvaWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHRoaXMgaXMgdXNlZCBmb3IgaW5oZXJpdGFuY2UgbWVyZ2VzIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPHBoYXNlPnBhY2thZ2U8L3BoYXNlPgorICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBhcHBlbmQgdG8gdGhlIHBhY2thZ2luZyBwaGFzZS4gLS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+YXR0YWNoZWQ8L2dvYWw+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBnb2FscyA9PSBtb2pvcyAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjMuMTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPHNvdXJjZT4xLjc8L3NvdXJjZT4KKyAgICAgICAgICAgICAgICAgICAgPHRhcmdldD4xLjc8L3RhcmdldD4KKyAgICAgICAgICAgICAgICAgICAgPHNob3dXYXJuaW5ncz5mYWxzZTwvc2hvd1dhcm5pbmdzPgorICAgICAgICAgICAgICAgICAgICA8Zm9yaz5mYWxzZTwvZm9yaz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21vbml0b3Jpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tb25pdG9yaW5nL0plcnNleUFwcC5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tb25pdG9yaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbW9uaXRvcmluZy9KZXJzZXlBcHAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWU5N2I0Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tb25pdG9yaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbW9uaXRvcmluZy9KZXJzZXlBcHAuamF2YQpAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLm1vbml0b3Jpbmc7CisKK2ltcG9ydCBqYXZhLm5ldC5VUkk7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guZ3JpenpseS5odHRwLnNlcnZlci5IdHRwU2VydmVyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmdyaXp6bHkyLmh0dHBzZXJ2ZXIuR3JpenpseUh0dHBTZXJ2ZXJGYWN0b3J5OworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIuU2VydmVyUHJvcGVydGllczsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuKjsKK2ltcG9ydCBvcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2ZXIubW9kZWwuUmVzb3VyY2U7CisKKy8qKgorICogQXBwbGljYXRpb24gY2xhc3MgdG8gc3RhcnQgcGVyZm9ybWFuY2UgdGVzdCB3ZWIgc2VydmljZSBhdCBodHRwOi8vbG9jYWxob3N0OjgwODAvIGlmIHRoZSBiYXNlIFVSSQorICogaXMgbm90IHBhc3NlZCB2aWEgdGhlIGZpcnN0IGNvbW1hbmQgbGluZSBhcmd1bWVudC4KKyAqLworcHVibGljIGNsYXNzIEplcnNleUFwcCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgQkFTRV9VUkkgPSBVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvIik7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUk9PVF9QQVRIID0gInRleHQiOworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oZmluYWwgU3RyaW5nW10gYXJncykgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkplcnNleSBwZXJmb3JtYW5jZSB0ZXN0IHdlYiBzZXJ2aWNlIGFwcGxpY2F0aW9uIik7CisKKyAgICAgICAgICAgIGZpbmFsIFVSSSBiYXNlVXJpID0gYXJncy5sZW5ndGggPiAwID8gVVJJLmNyZWF0ZShhcmdzWzBdKSA6IEJBU0VfVVJJOworICAgICAgICAgICAgZmluYWwgSHR0cFNlcnZlciBzZXJ2ZXIgPSBHcml6emx5SHR0cFNlcnZlckZhY3RvcnkuY3JlYXRlSHR0cFNlcnZlcihiYXNlVXJpLCBjcmVhdGVSZXNvdXJjZUNvbmZpZygpKTsKKworICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKFN0cmluZy5mb3JtYXQoIkFwcGxpY2F0aW9uIHN0YXJ0ZWQuXG5Ucnkgb3V0ICVzJXNcbkhpdCBDdHJsLUMgdG8gc3RvcCBpdC4uLiIsCisgICAgICAgICAgICAgICAgICAgIGJhc2VVcmksIFJPT1RfUEFUSCkpOworCisgICAgICAgICAgICB3aGlsZSAoc2VydmVyLmlzU3RhcnRlZCgpKSB7CisgICAgICAgICAgICAgICAgVGhyZWFkLnNsZWVwKDYwMDAwMCk7CisgICAgICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgUmVzb3VyY2VDb25maWcgY3JlYXRlUmVzb3VyY2VDb25maWcoKSB7CisgICAgICAgIGZpbmFsIFNldDxSZXNvdXJjZT4gcmVzb3VyY2VzID0gbmV3IEhhc2hTZXQ8PigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICAgICAgICAgIHJlc291cmNlcy5hZGQoUmVzb3VyY2UuYnVpbGRlcihvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5tb25pdG9yaW5nLlJlc291cmNlLmNsYXNzKQorICAgICAgICAgICAgICAgICAgICAucGF0aCgiIiArIGkpCisgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoKQorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLk1PTklUT1JJTkdfU1RBVElTVElDU19FTkFCTEVELCB0cnVlKQorICAgICAgICAgICAgICAgIC5wcm9wZXJ0eShTZXJ2ZXJQcm9wZXJ0aWVzLk1PTklUT1JJTkdfU1RBVElTVElDU19NQkVBTlNfRU5BQkxFRCwgdHJ1ZSkKKyAgICAgICAgICAgICAgICAucmVnaXN0ZXJSZXNvdXJjZXMocmVzb3VyY2VzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21vbml0b3Jpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tb25pdG9yaW5nL1Jlc291cmNlLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21vbml0b3Jpbmcvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9tb25pdG9yaW5nL1Jlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk1NmVjOAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbW9uaXRvcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21vbml0b3JpbmcvUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLm1vbml0b3Jpbmc7CisKK2ltcG9ydCBqYXZheC53cy5ycy5ERUxFVEU7CitpbXBvcnQgamF2YXgud3MucnMuR0VUOworaW1wb3J0IGphdmF4LndzLnJzLlBPU1Q7CitpbXBvcnQgamF2YXgud3MucnMuUFVUOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGg7CitpbXBvcnQgamF2YXgud3MucnMuUHJvZHVjZXM7CisKKy8qKgorICogQGF1dGhvciBNaWNoYWwgR2FqZG9zCisgKi8KK0BQYXRoKCIvIikKK0BQcm9kdWNlcygidGV4dC9wbGFpbiIpCitwdWJsaWMgY2xhc3MgUmVzb3VyY2UgeworCisgICAgQEdFVAorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KCkgeworICAgICAgICByZXR1cm4gImdldCI7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJzdWIiKQorICAgIHB1YmxpYyBTdHJpbmcgc3ViZ2V0KCkgeworICAgICAgICByZXR1cm4gInN1Yi1nZXQiOworICAgIH0KKworICAgIEBQT1NUCisgICAgcHVibGljIFN0cmluZyBwb3N0KGZpbmFsIFN0cmluZyBwb3N0KSB7CisgICAgICAgIHJldHVybiBwb3N0OworICAgIH0KKworICAgIEBQT1NUCisgICAgQFBhdGgoInN1YiIpCisgICAgcHVibGljIFN0cmluZyBzdWJwb3N0KGZpbmFsIFN0cmluZyBwb3N0KSB7CisgICAgICAgIHJldHVybiBwb3N0OworICAgIH0KKworICAgIEBQVVQKKyAgICBwdWJsaWMgU3RyaW5nIHB1dChmaW5hbCBTdHJpbmcgcHV0KSB7CisgICAgICAgIHJldHVybiBwdXQ7CisgICAgfQorCisgICAgQFBVVAorICAgIEBQYXRoKCJzdWIiKQorICAgIHB1YmxpYyBTdHJpbmcgc3VicHV0KGZpbmFsIFN0cmluZyBwdXQpIHsKKyAgICAgICAgcmV0dXJuIHB1dDsKKyAgICB9CisKKyAgICBAREVMRVRFCisgICAgQFBhdGgoIntpZH0iKQorICAgIHB1YmxpYyBTdHJpbmcgZGVsZXRlKGZpbmFsIFN0cmluZyBkZWxldGUpIHsKKyAgICAgICAgcmV0dXJuIGRlbGV0ZTsKKyAgICB9CisKKyAgICBAREVMRVRFCisgICAgQFBhdGgoInN1Yi97aWR9IikKKyAgICBwdWJsaWMgU3RyaW5nIHN1YmRlbGV0ZShmaW5hbCBTdHJpbmcgZGVsZXRlKSB7CisgICAgICAgIHJldHVybiBkZWxldGU7CisgICAgfQorCisgICAgQFBhdGgoImxvY2F0b3IiKQorICAgIHB1YmxpYyBDbGFzczxTdWJSZXNvdXJjZUxvY2F0b3I+IGxvY2F0b3IoKSB7CisgICAgICAgIHJldHVybiBTdWJSZXNvdXJjZUxvY2F0b3IuY2xhc3M7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tb25pdG9yaW5nL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvbW9uaXRvcmluZy9TdWJSZXNvdXJjZUxvY2F0b3IuamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbW9uaXRvcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21vbml0b3JpbmcvU3ViUmVzb3VyY2VMb2NhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDE3MjkzMAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvbW9uaXRvcmluZy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL21vbml0b3JpbmcvU3ViUmVzb3VyY2VMb2NhdG9yLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5tb25pdG9yaW5nOworCitpbXBvcnQgamF2YXgud3MucnMuREVMRVRFOworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QT1NUOworaW1wb3J0IGphdmF4LndzLnJzLlBVVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworCisvKioKKyAqIEBhdXRob3IgTWljaGFsIEdhamRvcworICovCitwdWJsaWMgY2xhc3MgU3ViUmVzb3VyY2VMb2NhdG9yIHsKKworICAgIEBHRVQKKyAgICBwdWJsaWMgU3RyaW5nIGdldCgpIHsKKyAgICAgICAgcmV0dXJuICJnZXQiOworICAgIH0KKworICAgIEBQT1NUCisgICAgcHVibGljIFN0cmluZyBwb3N0KGZpbmFsIFN0cmluZyBwb3N0KSB7CisgICAgICAgIHJldHVybiBwb3N0OworICAgIH0KKworICAgIEBQVVQKKyAgICBwdWJsaWMgU3RyaW5nIHB1dChmaW5hbCBTdHJpbmcgcHV0KSB7CisgICAgICAgIHJldHVybiBwdXQ7CisgICAgfQorCisgICAgQERFTEVURQorICAgIEBQYXRoKCJ7aWR9IikKKyAgICBwdWJsaWMgU3RyaW5nIGRlbGV0ZShmaW5hbCBTdHJpbmcgZGVsZXRlKSB7CisgICAgICAgIHJldHVybiBkZWxldGU7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tb25pdG9yaW5nL3N0YXJ0LnNoIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9tb25pdG9yaW5nL3N0YXJ0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NTQ1NDQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL21vbml0b3Jpbmcvc3RhcnQuc2gKQEAgLTAsMCArMSwzMCBAQAorIyEvYmluL2Jhc2gKKyMKKyMgQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjCisjIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorIyB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorIyBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisjCisjIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyMgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorIyBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyMgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyMgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorIworIyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyMKKworTElCUz0kKGZvciBsIGluIGBscyBsaWJgOyBkbyBlY2hvIC1uIGxpYi8kbCI6Ijtkb25lKQorTElCUz1gZWNobyAkTElCUyB8IHNlZCAtZXMnLzokLy8nYAorCitqYXZhIC1zZXJ2ZXIgLVhtczUxMm0gLVhteDEwMjRtIC1YWDpQZXJtU2l6ZT0yNTZtIC1YWDpNYXhQZXJtU2l6ZT01MTJtIFwKKyAgICAgIC1YWDorVXNlUGFyYWxsZWxHQyAtWFg6K0FnZ3Jlc3NpdmVPcHRzIC1YWDorVXNlRmFzdEFjY2Vzc29yTWV0aG9kcyBcCisgICAgICAtY3AgJExJQlMgXAorICAgICAgLURqYXZhLm5ldC5wcmVmZXJJUHY0U3RhY2s9dHJ1ZSBcCisgICAgICAtRGNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUgXAorICAgICAgLURjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLnBvcnQ9MTExMTIgXAorICAgICAgLURjb20uc3VuLm1hbmFnZW1lbnQuam14cmVtb3RlLmF1dGhlbnRpY2F0ZT1mYWxzZSBcCisgICAgICAtRGNvbS5zdW4ubWFuYWdlbWVudC5qbXhyZW1vdGUuc3NsPWZhbHNlIFwKKyAgICAgIC1EY29tLnN1bi5tYW5hZ2VtZW50LmpteHJlbW90ZS5sb2NhbC5vbmx5PWZhbHNlIFwKKyAgICAgIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLm1vbml0b3JpbmcuSmVyc2V5QXBwICQxCmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL3BhcmFtLXNybC9wb20ueG1sIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9wYXJhbS1zcmwvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmFkZGZkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9wYXJhbS1zcmwvcG9tLnhtbApAQCAtMCwwICsxLDYyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEyLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLnRlc3RjYXNlczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPnBhcmFtLXNybDwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorCisgICAgPG5hbWU+amVyc2V5LXRlc3RzLXBlcmZvcm1hbmNlLXBhcmFtLXNybDwvbmFtZT4KKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8cHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz5VVEYtODwvcHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz4KKyAgICA8L3Byb3BlcnRpZXM+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXgud3MucnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZheC53cy5ycy1hcGk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgorICAgICAgICA8L2RlcGVuZGVuY3k+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yay5wcm92aWRlcnM8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktdGVzdC1mcmFtZXdvcmstcHJvdmlkZXItZ3JpenpseTI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFzc2VtYmx5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICA8L3BsdWdpbnM+CisgICAgPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvcGFyYW0tc3JsL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvcGFyYW0vc3JsL0pheFJzQXBwbGljYXRpb24uamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvcGFyYW0tc3JsL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvcGFyYW0vc3JsL0pheFJzQXBwbGljYXRpb24uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmRjNzhkCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9wYXJhbS1zcmwvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9wYXJhbS9zcmwvSmF4UnNBcHBsaWNhdGlvbi5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UucGFyYW0uc3JsOworCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKKy8qKgorICogVGVzdCBjYXNlIEpBWC1SUyBhcHBsaWNhdGlvbi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSmF4UnNBcHBsaWNhdGlvbiBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKworICAgIHN0YXRpYyBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IEFQUF9DTEFTU0VTID0gbmV3IEhhc2hTZXQ8Q2xhc3M8Pz4+KCkge3sKKyAgICAgICAgYWRkKFNybFJlc291cmNlLmNsYXNzKTsKKyAgICB9fTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgIHJldHVybiBBUFBfQ0xBU1NFUzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL3BhcmFtLXNybC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3BhcmFtL3NybC9TcmxSZXNvdXJjZS5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9wYXJhbS1zcmwvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9wYXJhbS9zcmwvU3JsUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjA2ZTYyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9wYXJhbS1zcmwvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9wYXJhbS9zcmwvU3JsUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLnBhcmFtLnNybDsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5NYXRyaXhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlBhdGhQYXJhbTsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5RdWVyeVBhcmFtOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworCisvKioKKyAqIFRlc3QgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoIi8iKQorcHVibGljIGNsYXNzIFNybFJlc291cmNlIHsKKworICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3ViUmVzb3VyY2UgeworCisgICAgICAgIFN0cmluZyBwOworCisgICAgICAgIFN1YlJlc291cmNlKFN0cmluZyBwKSB7CisgICAgICAgICAgICB0aGlzLnAgPSBwOworICAgICAgICB9CisKKyAgICAgICAgQEdFVAorICAgICAgICBAUHJvZHVjZXMoTWVkaWFUeXBlLlRFWFRfUExBSU4pCisgICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0KEBNYXRyaXhQYXJhbSgibSIpIGZpbmFsIFN0cmluZyBtLCBAUXVlcnlQYXJhbSgicSIpIGZpbmFsIFN0cmluZyBxKSB7CisgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgicD0lcywgbT0lcywgcT0lcyIsIHAsIG0sIHEpOworICAgICAgICB9CisgICAgfQorCisgICAgQFBhdGgoInNybC97cH0iKQorICAgIHB1YmxpYyBTdWJSZXNvdXJjZSBsb2NhdG9yKEBQYXRoUGFyYW0oInAiKSBTdHJpbmcgcCkgeworICAgICAgICByZXR1cm4gbmV3IFN1YlJlc291cmNlKHApOworICAgIH0KKworICAgIEBHRVQKKyAgICBAUGF0aCgic3JtL3twfSIpCisgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5URVhUX1BMQUlOKQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0KEBQYXRoUGFyYW0oInAiKSBmaW5hbCBTdHJpbmcgcCwgQE1hdHJpeFBhcmFtKCJtIikgZmluYWwgU3RyaW5nIG0sIEBRdWVyeVBhcmFtKCJxIikgZmluYWwgU3RyaW5nIHEpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoInA9JXMsIG09JXMsIHE9JXMiLCBwLCBtLCBxKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL3BhcmFtLXNybC9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9wYXJhbS1zcmwvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTI3YjNiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9wYXJhbS1zcmwvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbApAQCAtMCwwICsxLDM4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzx3ZWItYXBwIHZlcnNpb249IjMuMSIKKyAgICAgICAgIHhtbG5zPSJodHRwOi8veG1sbnMuamNwLm9yZy94bWwvbnMvamF2YWVlIgorICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL3htbG5zLmpjcC5vcmcveG1sL25zL2phdmFlZSBodHRwOi8veG1sbnMuamNwLm9yZy94bWwvbnMvamF2YWVlL3dlYi1hcHBfM18xLnhzZCI+CisKKyAgICA8c2VydmxldD4KKyAgICAgICAgPHNlcnZsZXQtbmFtZT5KYXhSc0FwcGxpY2F0aW9uPC9zZXJ2bGV0LW5hbWU+CisgICAgICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZsZXQuU2VydmxldENvbnRhaW5lcjwvc2VydmxldC1jbGFzcz4KKyAgICAgICAgPGluaXQtcGFyYW0+CisgICAgICAgICAgICA8cGFyYW0tbmFtZT5qYXZheC53cy5ycy5BcHBsaWNhdGlvbjwvcGFyYW0tbmFtZT4KKyAgICAgICAgICAgIDxwYXJhbS12YWx1ZT5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5wYXJhbS5zcmwuSmF4UnNBcHBsaWNhdGlvbjwvcGFyYW0tdmFsdWU+CisgICAgICAgIDwvaW5pdC1wYXJhbT4KKyAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+CisgICAgPC9zZXJ2bGV0PgorICAgIDxzZXJ2bGV0LW1hcHBpbmc+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SmF4UnNBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8dXJsLXBhdHRlcm4+Lyo8L3VybC1wYXR0ZXJuPgorICAgIDwvc2VydmxldC1tYXBwaW5nPgorPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9wYXJhbS1zcmwvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9wYXJhbS9zcmwvU3JsU3JtVGVzdC5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9wYXJhbS1zcmwvc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9wYXJhbS9zcmwvU3JsU3JtVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0YWQ5MzcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL3BhcmFtLXNybC9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3BhcmFtL3NybC9TcmxTcm1UZXN0LmphdmEKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5wYXJhbS5zcmw7CisKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkFwcGxpY2F0aW9uOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdC5KZXJzZXlUZXN0OworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCisvKioKKyAqIFRlc3QgZm9yIFNSTC9TUk0gcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFNybFNybVRlc3QgZXh0ZW5kcyBKZXJzZXlUZXN0IHsKKworICAgIEBPdmVycmlkZQorICAgIHByb3RlY3RlZCBBcHBsaWNhdGlvbiBjb25maWd1cmUoKSB7CisgICAgICAgIHJldHVybiBuZXcgSmF4UnNBcHBsaWNhdGlvbigpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFNybVNybCgpIHsKKyAgICAgICAgU3RyaW5nW11bXSB0ZXN0RGF0YSA9IG5ldyBTdHJpbmdbXVtdIHsKKyAgICAgICAgICAgICAgICB7Im9uZSIsICJ0d28iLCAidGhyZWUifSwKKyAgICAgICAgICAgICAgICB7ImZvdXIiLCAiZ3JlZW4iLCAidG9wIn0sCisgICAgICAgICAgICAgICAgeyJib3R0b20iLCAiYmVhdXR5IiwgIm1hc2gifSwKKyAgICAgICAgfTsKKworICAgICAgICBmb3IgKFN0cmluZ1tdIGlucHV0IDogdGVzdERhdGEpIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzcmxSZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInNybCIpLnBhdGgoaW5wdXRbMF0pLm1hdHJpeFBhcmFtKCJtIiwgaW5wdXRbMV0pLnF1ZXJ5UGFyYW0oInEiLCBpbnB1dFsyXSkKKyAgICAgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzcm1SZXNwb25zZSA9IHRhcmdldCgpLnBhdGgoInNybSIpLnBhdGgoaW5wdXRbMF0pLm1hdHJpeFBhcmFtKCJtIiwgaW5wdXRbMV0pLnF1ZXJ5UGFyYW0oInEiLCBpbnB1dFsyXSkKKyAgICAgICAgICAgICAgICAgICAgLnJlcXVlc3QoKS5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhzcmxSZXNwb25zZSwgc3JtUmVzcG9uc2UpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9wb20ueG1sIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMjkwMjkKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL3BvbS54bWwKQEAgLTAsMCArMSw5NSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8cGFyZW50PgorICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZTwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLnRlc3RjYXNlczwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzLXBlcmZvcm1hbmNlLXRlc3RjYXNlPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBQZXJmb3JtYW5jZSB0ZXN0IGNhc2VzLgorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8bW9kdWxlcz4KKyAgICAgICAgPG1vZHVsZT5hc3NlbWJsaWVzPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+ZmlsdGVyLWR5bmFtaWM8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5maWx0ZXItZ2xvYmFsPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+ZmlsdGVyLW5hbWU8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5pbnRlcmNlcHRvci1keW5hbWljPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+aW50ZXJjZXB0b3ItZ2xvYmFsPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+aW50ZXJjZXB0b3ItbmFtZTwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPm1idy1jdXN0b20tcHJvdmlkZXI8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5tYnctanNvbi1qYWNrc29uPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+bWJ3LWpzb24tbW94eTwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPm1idy1rcnlvPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+bWJ3LXRleHQtcGxhaW48L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5tYncteG1sLWpheGI8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5tYncteG1sLW1veHk8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5wYXJhbS1zcmw8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5wcm94eS1pbmplY3Rpb248L21vZHVsZT4KKyAgICA8L21vZHVsZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5NYW5hZ2VtZW50PgorICAgICAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hc3NlbWJseS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIENvbnRhaW5zIHNoYXJlZCBwZXJmb3JtYW5jZSB0ZXN0LWNhc2VzIGFzc2VtYmx5IGRlc2NyaXB0b3JzIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UudGVzdGNhc2VzPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmFzc2VtYmxpZXM8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY2llcz4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5tYWtlLWFzc2VtYmx5PC9pZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIHRoaXMgaXMgdXNlZCBmb3IgaW5oZXJpdGFuY2UgbWVyZ2VzIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGFwcGVuZCB0byB0aGUgcGFja2FnaW5nIHBoYXNlLiAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmF0dGFjaGVkPC9nb2FsPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGdvYWxzID09IG1vam9zIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yUmVmcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gUmVmZXJlbmNlIHRvIGEgZGVzY3JpcHRvciBpbiBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS50ZXN0Y2FzZXM6YXNzZW1ibGllcyBtb2R1bGUgLS0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRvclJlZj56aXAtd2l0aC1qYXJzPC9kZXNjcmlwdG9yUmVmPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRlc2NyaXB0b3JSZWY+d2FyPC9kZXNjcmlwdG9yUmVmPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rlc2NyaXB0b3JSZWZzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KKyAgICA8L2J1aWxkPgorCis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL3Byb3h5LWluamVjdGlvbi9wb20ueG1sIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9wcm94eS1pbmplY3Rpb24vcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTY0MDUyCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9wcm94eS1pbmplY3Rpb24vcG9tLnhtbApAQCAtMCwwICsxLDYyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL3hzZC9tYXZlbi00LjAuMC54c2QiPgorICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KKworICAgIDxwYXJlbnQ+CisgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLnRlc3RjYXNlczwvZ3JvdXBJZD4KKyAgICAgICAgPGFydGlmYWN0SWQ+cHJvamVjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPHZlcnNpb24+Mi4yOC1TTkFQU0hPVDwvdmVyc2lvbj4KKyAgICA8L3BhcmVudD4KKworICAgIDxhcnRpZmFjdElkPnByb3h5LWluamVjdGlvbjwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorCisgICAgPG5hbWU+amVyc2V5LXRlc3RzLXBlcmZvcm1hbmNlLXByb3h5LWluamVjdGlvbi10ZXN0PC9uYW1lPgorCisgICAgPHByb3BlcnRpZXM+CisgICAgICAgIDxwcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPlVURi04PC9wcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPgorICAgIDwvcHJvcGVydGllcz4KKworICAgIDxkZXBlbmRlbmNpZXM+CisKKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC53cy5yczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmphdmF4LndzLnJzLWFwaTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1ncml6emx5MjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPC9kZXBlbmRlbmNpZXM+CisKKyAgICA8YnVpbGQ+CisgICAgICAgIDxwbHVnaW5zPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9wcm94eS1pbmplY3Rpb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9wcm94eS9pbmplY3Rpb24vRmllbGRJbmplY3RlZFJlc291cmNlLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL3Byb3h5LWluamVjdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3Byb3h5L2luamVjdGlvbi9GaWVsZEluamVjdGVkUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjAyNGY3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9wcm94eS1pbmplY3Rpb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9wcm94eS9pbmplY3Rpb24vRmllbGRJbmplY3RlZFJlc291cmNlLmphdmEKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5wcm94eS5pbmplY3Rpb247CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5IdHRwSGVhZGVyczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlJlcXVlc3Q7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5TZWN1cml0eUNvbnRleHQ7CitpbXBvcnQgamF2YXgud3MucnMuY29yZS5VcmlJbmZvOworCisvKioKKyAqIFRlc3QgcmVzb3VyY2UgdG8gdGVzdCBmaWVsZCBpbmplY3RlZCBwcm94eS1hYmxlIHBhcmFtZXRlcnMuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworQFBhdGgoImZpZWxkLWluamVjdGVkIikKK0BQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKK3B1YmxpYyBjbGFzcyBGaWVsZEluamVjdGVkUmVzb3VyY2UgeworCisgICAgQENvbnRleHQKKyAgICBTZWN1cml0eUNvbnRleHQgc2VjdXJpdHlDb250ZXh0OworICAgIEBDb250ZXh0CisgICAgVXJpSW5mbyB1cmlJbmZvOworICAgIEBDb250ZXh0CisgICAgSHR0cEhlYWRlcnMgaHR0cEhlYWRlcnM7CisgICAgQENvbnRleHQKKyAgICBSZXF1ZXN0IHJlcXVlc3Q7CisKKyAgICBAR0VUCisgICAgQFBhdGgoIndpdGhvdXQtcGFyYW1ldGVycyIpCisgICAgcHVibGljIFN0cmluZyBnZXRQcm94eSgpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoInNjOiAlc1xudWk6ICVzXG5oaDogJXNcbnJlcTogJXMiLAorICAgICAgICAgICAgICAgIHNlY3VyaXR5Q29udGV4dC5nZXRDbGFzcygpLCB1cmlJbmZvLmdldENsYXNzKCksIGh0dHBIZWFkZXJzLmdldENsYXNzKCksIHJlcXVlc3QuZ2V0Q2xhc3MoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9wcm94eS1pbmplY3Rpb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9wcm94eS9pbmplY3Rpb24vSmF4UnNBcHBsaWNhdGlvbi5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9wcm94eS1pbmplY3Rpb24vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9wcm94eS9pbmplY3Rpb24vSmF4UnNBcHBsaWNhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzOTZhMWEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL3Byb3h5LWluamVjdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3Byb3h5L2luamVjdGlvbi9KYXhSc0FwcGxpY2F0aW9uLmphdmEKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS5wcm94eS5pbmplY3Rpb247CisKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQXBwbGljYXRpb247CisKKy8qKgorICogVGVzdCBjYXNlIEpBWC1SUyBhcHBsaWNhdGlvbi4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgSmF4UnNBcHBsaWNhdGlvbiBleHRlbmRzIEFwcGxpY2F0aW9uIHsKKworICAgIHN0YXRpYyBmaW5hbCBTZXQ8Q2xhc3M8Pz4+IEFQUF9DTEFTU0VTID0gbmV3IEhhc2hTZXQ8Q2xhc3M8Pz4+KCl7CisgICAgICAgIHsKKyAgICAgICAgICAgIGFkZChGaWVsZEluamVjdGVkUmVzb3VyY2UuY2xhc3MpOworICAgICAgICAgICAgYWRkKE1ldGhvZEluamVjdGVkUmVzb3VyY2UuY2xhc3MpOworICAgICAgICB9CisgICAgfTsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTZXQ8Q2xhc3M8Pz4+IGdldENsYXNzZXMoKSB7CisgICAgICAgIHJldHVybiBBUFBfQ0xBU1NFUzsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL3Byb3h5LWluamVjdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3Byb3h5L2luamVjdGlvbi9NZXRob2RJbmplY3RlZFJlc291cmNlLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90ZXN0LWNhc2VzL3Byb3h5LWluamVjdGlvbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3Byb3h5L2luamVjdGlvbi9NZXRob2RJbmplY3RlZFJlc291cmNlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYyZThmZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvcHJveHktaW5qZWN0aW9uL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvcHJveHkvaW5qZWN0aW9uL01ldGhvZEluamVjdGVkUmVzb3VyY2UuamF2YQpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLnByb3h5LmluamVjdGlvbjsKKworaW1wb3J0IGphdmF4LndzLnJzLkdFVDsKK2ltcG9ydCBqYXZheC53cy5ycy5QYXRoOworaW1wb3J0IGphdmF4LndzLnJzLlByb2R1Y2VzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuQ29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLkh0dHBIZWFkZXJzOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuTWVkaWFUeXBlOworaW1wb3J0IGphdmF4LndzLnJzLmNvcmUuUmVxdWVzdDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlNlY3VyaXR5Q29udGV4dDsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLlVyaUluZm87CisKKy8qKgorICogVGVzdCByZXNvdXJjZSB0byBjb21wYXJlIHJlc291cmNlIG1ldGhvZCB3aXRoIGFuZCB3aXRob3V0IGluamVjdGVkIG1ldGhvZCBwcm94aWFibGUgcGFyYW1ldGVycy4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitAUGF0aCgibWV0aG9kLWluamVjdGVkIikKK0BQcm9kdWNlcyhNZWRpYVR5cGUuVEVYVF9QTEFJTikKK3B1YmxpYyBjbGFzcyBNZXRob2RJbmplY3RlZFJlc291cmNlIHsKKworICAgIEBHRVQKKyAgICBAUGF0aCgid2l0aG91dC1wYXJhbWV0ZXJzIikKKyAgICBwdWJsaWMgU3RyaW5nIGdldE5vUHJveHkoKSB7CisgICAgICAgIHJldHVybiAidGV4dCI7CisgICAgfQorCisgICAgQEdFVAorICAgIEBQYXRoKCJhbGwtcGFyYW1ldGVycyIpCisgICAgcHVibGljIFN0cmluZyBnZXRQcm94eShAQ29udGV4dCBTZWN1cml0eUNvbnRleHQgc2VjdXJpdHlDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQENvbnRleHQgVXJpSW5mbyB1cmlJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQENvbnRleHQgSHR0cEhlYWRlcnMgaHR0cEhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBAQ29udGV4dCBSZXF1ZXN0IHJlcXVlc3QpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoInNjOiAlc1xudWk6ICVzXG5oaDogJXNcbnJlcTogJXMiLAorICAgICAgICAgICAgICAgIHNlY3VyaXR5Q29udGV4dC5nZXRDbGFzcygpLCB1cmlJbmZvLmdldENsYXNzKCksIGh0dHBIZWFkZXJzLmdldENsYXNzKCksIHJlcXVlc3QuZ2V0Q2xhc3MoKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9wcm94eS1pbmplY3Rpb24vc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvcHJveHktaW5qZWN0aW9uL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEzMzMxZAotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvcHJveHktaW5qZWN0aW9uL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKQEAgLTAsMCArMSwzOCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNSwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8d2ViLWFwcCB2ZXJzaW9uPSIzLjEiCisgICAgICAgICB4bWxucz0iaHR0cDovL3htbG5zLmpjcC5vcmcveG1sL25zL2phdmFlZSIKKyAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly94bWxucy5qY3Aub3JnL3htbC9ucy9qYXZhZWUgaHR0cDovL3htbG5zLmpjcC5vcmcveG1sL25zL2phdmFlZS93ZWItYXBwXzNfMS54c2QiPgorCisgICAgPHNlcnZsZXQ+CisgICAgICAgIDxzZXJ2bGV0LW5hbWU+SmF4UnNBcHBsaWNhdGlvbjwvc2VydmxldC1uYW1lPgorICAgICAgICA8c2VydmxldC1jbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5zZXJ2bGV0LlNlcnZsZXRDb250YWluZXI8L3NlcnZsZXQtY2xhc3M+CisgICAgICAgIDxpbml0LXBhcmFtPgorICAgICAgICAgICAgPHBhcmFtLW5hbWU+amF2YXgud3MucnMuQXBwbGljYXRpb248L3BhcmFtLW5hbWU+CisgICAgICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UucHJveHkuaW5qZWN0aW9uLkpheFJzQXBwbGljYXRpb248L3BhcmFtLXZhbHVlPgorICAgICAgICA8L2luaXQtcGFyYW0+CisgICAgICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgorICAgIDwvc2VydmxldD4KKyAgICA8c2VydmxldC1tYXBwaW5nPgorICAgICAgICA8c2VydmxldC1uYW1lPkpheFJzQXBwbGljYXRpb248L3NlcnZsZXQtbmFtZT4KKyAgICAgICAgPHVybC1wYXR0ZXJuPi8qPC91cmwtcGF0dGVybj4KKyAgICA8L3NlcnZsZXQtbWFwcGluZz4KKzwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvcHJveHktaW5qZWN0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvcHJveHkvaW5qZWN0aW9uL0luamVjdGVkUmVzb3VyY2VzVGVzdC5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdGVzdC1jYXNlcy9wcm94eS1pbmplY3Rpb24vc3JjL3Rlc3QvamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS9wcm94eS9pbmplY3Rpb24vSW5qZWN0ZWRSZXNvdXJjZXNUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM5YWViYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rlc3QtY2FzZXMvcHJveHktaW5qZWN0aW9uL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvcHJveHkvaW5qZWN0aW9uL0luamVjdGVkUmVzb3VyY2VzVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UucHJveHkuaW5qZWN0aW9uOworCitpbXBvcnQgamF2YXgud3MucnMuY29yZS5BcHBsaWNhdGlvbjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QuSmVyc2V5VGVzdDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworLyoqCisgKiBUZXN0IGZvciBmaWVsZC9tZXRob2QgaW5qZWN0ZWQgcmVzb3VyY2UuCisgKgorICogQGF1dGhvciBKYWt1YiBQb2RsZXNhayAoamFrdWIucG9kbGVzYWsgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIEluamVjdGVkUmVzb3VyY2VzVGVzdCBleHRlbmRzIEplcnNleVRlc3QgeworCisgICAgQE92ZXJyaWRlCisgICAgcHJvdGVjdGVkIEFwcGxpY2F0aW9uIGNvbmZpZ3VyZSgpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBKYXhSc0FwcGxpY2F0aW9uKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0U2FtZVR5cGVzSW5qZWN0ZWQoKSB7CisgICAgICAgIGZpbmFsIFN0cmluZyBtZXRob2RJbmplY3RlZFJlc3BvbnNlID0gdGFyZ2V0KCkucGF0aCgibWV0aG9kLWluamVjdGVkIikucGF0aCgiYWxsLXBhcmFtZXRlcnMiKS5yZXF1ZXN0KCkuZ2V0KFN0cmluZy5jbGFzcyk7CisgICAgICAgIGZpbmFsIFN0cmluZyBmaWVsZEluamVjdGVkUmVzcG9uc2UgPSB0YXJnZXQoKS5wYXRoKCJmaWVsZC1pbmplY3RlZCIpLnBhdGgoIndpdGhvdXQtcGFyYW1ldGVycyIpLnJlcXVlc3QoKQorICAgICAgICAgICAgICAgIC5nZXQoU3RyaW5nLmNsYXNzKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKG1ldGhvZEluamVjdGVkUmVzcG9uc2UsIGZpZWxkSW5qZWN0ZWRSZXNwb25zZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvUkVBRE1FLmh0bWwgYi90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9SRUFETUUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjQ0ODQ5Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvUkVBRE1FLmh0bWwKQEAgLTAsMCArMSw3MSBAQAorPCFET0NUWVBFIEhUTUwgUFVCTElDICItLy9XM0MvL0RURCBIVE1MIDQuMDEgVHJhbnNpdGlvbmFsLy9FTiI+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPCFkb2N0eXBlIGh0bWw+Cis8aHRtbCBsYW5nPSJlbiI+Cis8aGVhZD4KKyAgICA8bWV0YSBjaGFyc2V0PSJ1dGYtOCI+CisgICAgPG1ldGEgaHR0cC1lcXVpdj0iWC1VQS1Db21wYXRpYmxlIiBjb250ZW50PSJJRT1lZGdlLGNocm9tZT0xIj4KKworICAgIDx0aXRsZT5UZXN0IGRhdGEgZ2VuZXJhdGlvbiB0b29sIGZvciBKZXJzZXkgcGVyZm9ybWFuY2UgdGVzdHM8L3RpdGxlPgorCisgICAgPCEtLSBCb290c3RyYXAgLS0+CisgICAgPGxpbmsgaHJlZj0iaHR0cDovL25ldGRuYS5ib290c3RyYXBjZG4uY29tL2Jvb3RzdHJhcC8zLjAuMC9jc3MvYm9vdHN0cmFwLm1pbi5jc3MiIHJlbD0ic3R5bGVzaGVldCI+Cis8L2hlYWQ+Cis8Ym9keT4KKworPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KKyAgICA8ZGl2IGNsYXNzPSJyb3ciPgorICAgICAgICA8ZGl2IGNsYXNzPSJjb2wtbGctb2Zmc2V0LTEgY29sLWxnLTEwIj4KKyAgICAgICAgICAgIDxoZWFkZXIgY2xhc3M9InBhZ2UtaGVhZGVyIj4KKyAgICAgICAgICAgICAgICA8aDE+VGVzdCBkYXRhIGdlbmVyYXRpb24gdG9vbCBmb3IgSmVyc2V5IHBlcmZvcm1hbmNlIHRlc3RzPC9zbWFsbD48L2gxPgorICAgICAgICAgICAgPC9oZWFkZXI+CisKKyAgICAgICAgICAgIDxwPgorICAgICAgICAgICAgICAgIFRoaXMgbW9kdWxlIGNvbnRhaW5zIGEgc2ltcGxlIHRvb2wgdG8gZ2VuZXJhdGUgZGF0YSBzZXRzIGZvciBwZXJmb3JtYW5jZSB0ZXN0aW5nLiBJdCBnZW5lcmF0ZXMgdGhyZWUKKyAgICAgICAgICAgICAgICBkaXN0aW5jdCBtZWRpYSB0eXBlczogeG1sLCBqc29uIGFuZCBwbGFpbiB0ZXh0LCBlYWNoIGluIGEgdmFyaWV0eSBvZiBwcmVkZWZpbmVkIGRhdGEgc2V0IHNpemVzICgxa0IsCisgICAgICAgICAgICAgICAgNWtCLCAxMGtCLCAxTUIgYW5kIG9wdGlvbmFsbHkgMUdCKS4KKyAgICAgICAgICAgIDwvcD4KKworICAgICAgICAgICAgPHA+CisgICAgICAgICAgICAgICAgVGhlIGdlbmVyYXRpb24gb2YgdGhlIGxhcmdlc3QgZmlsZXMgKDFHQikgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCB0byBzYXZlIGRpc2sgc3BhY2UgYW5kIHNob3J0ZW4gdGhlCisgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbiB0aW1lLiBUbyBlbmFibGUgaXQsIGNoYW5nZSB0aGUgdmFsdWUgb2YgdGhlIDxwcmU+R0VORVJBVEVfQUxTT19HSUdBQllURV9EQVRBU0VUUzwvcHJlPgorICAgICAgICAgICAgY29uc3RhbnQgaW4gdGhlIDxwcmU+VGVzdERhdGFHZW5lcmF0b3JBcHA8L3ByZT4gY2xhc3MgdG8gdHJ1ZS4KKyAgICAgICAgICAgIDwvcD4KKworICAgICAgICAgICAgPGgyPlJ1bm5pbmcgdGhlIEV4YW1wbGU8L2gyPgorCisgICAgICAgICAgICA8cD5SdW4gdGhlIGV4YW1wbGUgYXMgZm9sbG93czo8L3A+CisgICAgICAgICAgICA8YmxvY2txdW90ZT4KKyAgICAgICAgICAgICAgICA8cHJlPm12biBjbGVhbiBjb21waWxlIGV4ZWM6amF2YTwvcHJlPgorICAgICAgICAgICAgPC9ibG9ja3F1b3RlPgorCisgICAgICAgICAgICA8cD4KKyAgICAgICAgICAgICAgICBZb3UgY2FuIHR3ZWFrIHRoZSB2YWx1ZXMgb2Ygc2V2ZXJhbCBjb25zdGFudHMgaW4gdGhlIDxwcmU+VGVzdERhdGFHZW5lcmF0b3JBcHA8L3ByZT4gY2xhc3MgYmVmb3JlCisgICAgICAgICAgICBsYXVuY2hpbmcgdGhlIGdlbmVyYXRpb24uIEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2Ugc2VlIHRoZSBqYXZhZG9jcy4KKyAgICAgICAgICAgIFRoZSBhYm92ZSBjb21tYW5kIGxhdW5jaGVzIGEgR3JpenpseSBzZXJ2ZXIgd2l0aCB0aGUgZ2VuZXJhdGlvbiBzZXJ2ZXItc2lkZSBhcHAgYW5kIHJ1bnMgYSBjbGllbnQgd2l0aAorICAgICAgICAgICAgcHJlZGVmaW5lZCBwYXJhbWV0ZXJzIGFnYWluc3QgaXQuCisgICAgICAgICAgICA8L3A+CisgICAgICAgIDwvZGl2PgorICAgIDwvZGl2PgorPC9kaXY+CisKKzxzY3JpcHQgc3JjPSJodHRwOi8vbmV0ZG5hLmJvb3RzdHJhcGNkbi5jb20vYm9vdHN0cmFwLzMuMC4wL2pzL2Jvb3RzdHJhcC5taW4uanMiPjwvc2NyaXB0PgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvcG9tLnhtbCBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVhM2EzYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL3BvbS54bWwKQEAgLTAsMCArMSw2NyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2U8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UudG9vbHM8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+cGVyZm9ybWFuY2UtdGVzdC10b29sczwvYXJ0aWZhY3RJZD4KKyAgICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgorCisgICAgPG5hbWU+cGVyZm9ybWFuY2UtdGVzdC10b29sczwvbmFtZT4KKworICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29udGFpbmVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1jb250YWluZXItZ3JpenpseTItaHR0cDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkubWVkaWE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktbWVkaWEtbW94eTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorCisgICAgICAgIDxkZXBlbmRlbmN5PgorICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZTwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1zZXJ2ZXI8L2FydGlmYWN0SWQ+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+ZXhlYy1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxtYWluQ2xhc3M+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UudG9vbHMuVGVzdERhdGFHZW5lcmF0b3JBcHA8L21haW5DbGFzcz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorCisgICAgPC9idWlsZD4KKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvQ29uc3RhbnRUZXN0VmFsdWVHZW5lcmF0b3IuamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvQ29uc3RhbnRUZXN0VmFsdWVHZW5lcmF0b3IuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmE0ZTFiCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9Db25zdGFudFRlc3RWYWx1ZUdlbmVyYXRvci5qYXZhCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLnRvb2xzOworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS50b29scy5UZXN0VmFsdWVHZW5lcmF0b3J9IHByb2R1Y2luZyBjb25zdGFudCByZXN1bHRzLgorICoKKyAqIER1ZSB0byBpdHMgY29uc3RhbnQgbmF0dXJlLCB0aGlzIHN0cmF0ZWd5IGlzIG5vdCBzdWl0YWJsZSBmb3IgdXNlIHdpdGgge0BsaW5rIGphdmEudXRpbC5TZXR9LgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIENvbnN0YW50VGVzdFZhbHVlR2VuZXJhdG9yIGV4dGVuZHMgVGVzdFZhbHVlR2VuZXJhdG9yIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgaW50Q29uc3RhbnQgPSAxMjM0NTY3ODk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGNoYXJDb25zdGFudCA9ICd4JzsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgc3RyaW5nQ29uc3RhbnQgPSAiSGVsbG8sIHdvcmxkISI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBsb25nQ29uc3RhbnQgPSA5ODc2NTQzMjFMOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IGZsb2F0Q29uc3RhbnQgPSAzLjE0MTVmOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBkb3VibGVDb25zdGFudCA9IDMuMTQxNTkyNjUzNTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBieXRlIGJ5dGVDb25zdGFudCA9IChieXRlKSAxMjc7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgc2hvcnQgc2hvcnRDb25zdGFudCA9IChzaG9ydCkgMTAyNDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGJvb2xlYW5Db25zdGFudCA9IHRydWU7CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGludCBnZXRJbnQoKSB7CisgICAgICAgIHJldHVybiBpbnRDb25zdGFudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGNoYXIgZ2V0Q2hhcigpIHsKKyAgICAgICAgcmV0dXJuIGNoYXJDb25zdGFudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyBnZXRTdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBzdHJpbmdDb25zdGFudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGxvbmcgZ2V0TG9uZygpIHsKKyAgICAgICAgcmV0dXJuIGxvbmdDb25zdGFudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZsb2F0IGdldEZsb2F0KCkgeworICAgICAgICByZXR1cm4gZmxvYXRDb25zdGFudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGRvdWJsZSBnZXREb3VibGUoKSB7CisgICAgICAgIHJldHVybiBkb3VibGVDb25zdGFudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJ5dGUgZ2V0Qnl0ZSgpIHsKKyAgICAgICAgcmV0dXJuIGJ5dGVDb25zdGFudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHNob3J0IGdldFNob3J0KCkgeworICAgICAgICByZXR1cm4gc2hvcnRDb25zdGFudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhbigpIHsKKyAgICAgICAgcmV0dXJuIGJvb2xlYW5Db25zdGFudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxUPiBUIGdldEVudW0oQ2xhc3M8VD4gZW51bVR5cGUpIHsKKyAgICAgICAgVFtdIHZhbHVlcyA9IGVudW1UeXBlLmdldEVudW1Db25zdGFudHMoKTsKKyAgICAgICAgaWYgKHZhbHVlcyAhPSBudWxsICYmIHZhbHVlcy5sZW5ndGggPiAwKSB7CisgICAgICAgICAgICByZXR1cm4gdmFsdWVzWzBdOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvR2VuZXJhdGVGb3JUZXN0LmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL0dlbmVyYXRlRm9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNmZiMjcKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL0dlbmVyYXRlRm9yVGVzdC5qYXZhCkBAIC0wLDAgKzEsMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UudG9vbHM7CisKK2ltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247CitpbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OworCisvKioKKyAqIEFubm90YXRpb24gdG8gbWFyayBmaWVsZHMgb2YgYSBiZWFuIHRvIGJlIHBvcHVsYXRlZCBieQorICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLnRvb2xzLlRlc3RWYWx1ZUdlbmVyYXRvcn0gZHVyaW5nIHRoZSB0ZXN0IGRhdGEgZ2VuZXJhdGlvbiBwcm9jZXNzLgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuUlVOVElNRSkKK3B1YmxpYyBAaW50ZXJmYWNlIEdlbmVyYXRlRm9yVGVzdCB7CisgICAgLyoqIHNwZWNpZmllcyBob3cgbWFueSBlbGVtZW50cyBzaG91bGQgYmUgY3JlYXRlZCBhbmQgYWRkZWQgdG8gYW4gYXJyYXkvY29sbGVjdGlvbiAqLworICAgIGludCBsZW5ndGgoKSBkZWZhdWx0IDE7CisKKyAgICAvKiogZHVlIHRvIGphdmEgdHlwZSBlcmFzdXJlLCB0aGUgdHlwZSBvZiB0aGUgY29sbGVjdGlvbiBoYXMgdG8gYmUgZXhwbGljaXRseSBzcGVjaWZpZWQgKi8KKyAgICBDbGFzczw/PiBjb2xsZWN0aW9uTWVtYmVyVHlwZSgpIGRlZmF1bHQgT2JqZWN0LmNsYXNzOworCisgICAgLyoqIGlmIHRoZSBiZWFuIGNvbnRhaW5zIGEgY29sbGVjdGlvbiBkZWNsYXJlZCB2aWEgaXRzIGludGVyZmFjZSwgdGhlIGRlc2lyZWQgaW1wbGVtZW50aW5nIGNsYXNzIGhhcyB0byBiZSBzcGVjaWZpZWQgKi8KKyAgICBDbGFzczw/PiBpbXBsZW1lbnRpbmdDbGFzcygpIGRlZmF1bHQgT2JqZWN0LmNsYXNzOworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9QZXJzb24uamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvUGVyc29uLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZhZmEyYwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvUGVyc29uLmphdmEKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS50b29sczsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKKy8qKgorICogUGVyc29uIGRhdGEgYmVhbiwgY29waWVkIGZyb20gbWJ3IHRlc3RzIGFuZCBhbm5vdGF0ZWQgZm9yIHRoZSB0ZXN0IGRhdGEgZ2VuZXJhdGlvbiB0b29sLgorICoKKyAqIEBhdXRob3IgSmFrdWIgUG9kbGVzYWsgKGpha3ViLnBvZGxlc2FrIGF0IG9yYWNsZS5jb20pCisgKi8KK0BYbWxSb290RWxlbWVudAorcHVibGljIGNsYXNzIFBlcnNvbiB7CisKKyAgICBAR2VuZXJhdGVGb3JUZXN0CisgICAgcHVibGljIFN0cmluZyBuYW1lOworICAgIEBHZW5lcmF0ZUZvclRlc3QKKyAgICBwdWJsaWMgaW50IGFnZTsKKyAgICBAR2VuZXJhdGVGb3JUZXN0CisgICAgcHVibGljIFN0cmluZyBhZGRyZXNzOworCisgICAgcHVibGljIFBlcnNvbihTdHJpbmcgbmFtZSwgaW50IGFnZSwgU3RyaW5nIGFkZHJlc3MpIHsKKyAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKKyAgICAgICAgdGhpcy5hZ2UgPSBhZ2U7CisgICAgICAgIHRoaXMuYWRkcmVzcyA9IGFkZHJlc3M7CisgICAgfQorCisgICAgcHVibGljIFBlcnNvbigpIHsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gIlBlcnNvbkAiICsgSW50ZWdlci50b0hleFN0cmluZyhoYXNoQ29kZSgpKSArICJcbm5hbWU9IiArIG5hbWUgKyAiXG5hZ2U9IiArIGFnZSArICJcbmFkcmVzcz0iICsgYWRkcmVzczsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKKyAgICAgICAgaWYgKHRoaXMgPT0gbykgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG8gPT0gbnVsbCB8fCBnZXRDbGFzcygpICE9IG8uZ2V0Q2xhc3MoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgUGVyc29uIHBlcnNvbiA9IChQZXJzb24pIG87CisKKyAgICAgICAgaWYgKGFnZSAhPSBwZXJzb24uYWdlKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFkZHJlc3MgIT0gbnVsbCA/ICFhZGRyZXNzLmVxdWFscyhwZXJzb24uYWRkcmVzcykgOiBwZXJzb24uYWRkcmVzcyAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5hbWUgIT0gbnVsbCA/ICFuYW1lLmVxdWFscyhwZXJzb24ubmFtZSkgOiBwZXJzb24ubmFtZSAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgeworICAgICAgICBpbnQgcmVzdWx0ID0gbmFtZSAhPSBudWxsID8gbmFtZS5oYXNoQ29kZSgpIDogMDsKKyAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyBhZ2U7CisgICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgKGFkZHJlc3MgIT0gbnVsbCA/IGFkZHJlc3MuaGFzaENvZGUoKSA6IDApOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvUmFuZG9tVGVzdFZhbHVlR2VuZXJhdG9yLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL1JhbmRvbVRlc3RWYWx1ZUdlbmVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMGY5NjEKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL1JhbmRvbVRlc3RWYWx1ZUdlbmVyYXRvci5qYXZhCkBAIC0wLDAgKzEsMTIxIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLnRvb2xzOworCitpbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UudG9vbHMuVGVzdFZhbHVlR2VuZXJhdG9yfSBwcm9kdWNpbmcgcmFuZG9tIHJlc3VsdHMuCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgUmFuZG9tVGVzdFZhbHVlR2VuZXJhdG9yIGV4dGVuZHMgVGVzdFZhbHVlR2VuZXJhdG9yIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1NUUklOR19MRU5HVEggPSA1MDsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFJhbmRvbSByYW5kb20gPSBuZXcgUmFuZG9tKCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGNoYXJhY3RlcnMgPSAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejEyMzQ1Njc4OTAgXyI7CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIDxUPiBUIGdldEVudW0oQ2xhc3M8VD4gZW51bVR5cGUpIHsKKyAgICAgICAgVFtdIGVudW1WYWx1ZXMgPSBlbnVtVHlwZS5nZXRFbnVtQ29uc3RhbnRzKCk7CisgICAgICAgIHJldHVybiBlbnVtVmFsdWVzW3JhbmRvbS5uZXh0SW50KGVudW1WYWx1ZXMubGVuZ3RoKV07CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBpbnQgZ2V0SW50KCkgeworICAgICAgICByZXR1cm4gcmFuZG9tLm5leHRJbnQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGNoYXIgZ2V0Q2hhcigpIHsKKyAgICAgICAgcmV0dXJuIChjaGFyKSByYW5kb20ubmV4dEludChDaGFyYWN0ZXIuTUFYX1ZBTFVFICsgMSk7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nKCkgeworICAgICAgICByZXR1cm4gcmFuZG9tU3RyaW5nKHJhbmRvbS5uZXh0SW50KE1BWF9TVFJJTkdfTEVOR1RIKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBsb25nIGdldExvbmcoKSB7CisgICAgICAgIHJldHVybiByYW5kb20ubmV4dExvbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGZsb2F0IGdldEZsb2F0KCkgeworICAgICAgICByZXR1cm4gcmFuZG9tLm5leHRGbG9hdCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIHtAaW5oZXJpdERvY30KKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgZG91YmxlIGdldERvdWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIHJhbmRvbS5uZXh0RG91YmxlKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICoge0Bpbmhlcml0RG9jfQorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBieXRlIGdldEJ5dGUoKSB7CisgICAgICAgIHJldHVybiAoYnl0ZSkgcmFuZG9tLm5leHRJbnQoQnl0ZS5NQVhfVkFMVUUgKyAxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIHNob3J0IGdldFNob3J0KCkgeworICAgICAgICByZXR1cm4gKHNob3J0KSByYW5kb20ubmV4dEludChTaG9ydC5NQVhfVkFMVUUgKyAxKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiB7QGluaGVyaXREb2N9CisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhbigpIHsKKyAgICAgICAgcmV0dXJuIHJhbmRvbS5uZXh0Qm9vbGVhbigpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nIHJhbmRvbVN0cmluZyhpbnQgbGVuZ3RoKSB7CisgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQoY2hhcmFjdGVycy5jaGFyQXQocmFuZG9tLm5leHRJbnQoY2hhcmFjdGVycy5sZW5ndGgoKSkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKKyAgICB9CisKK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvVGVzdEJlYW4uamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvVGVzdEJlYW4uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iM2YwMzE3Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9UZXN0QmVhbi5qYXZhCkBAIC0wLDAgKzEsMTcwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLnRvb2xzOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuRGF0ZTsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sRWxlbWVudDsKK2ltcG9ydCBqYXZheC54bWwuYmluZC5hbm5vdGF0aW9uLlhtbEVsZW1lbnRXcmFwcGVyOworaW1wb3J0IGphdmF4LnhtbC5iaW5kLmFubm90YXRpb24uWG1sUm9vdEVsZW1lbnQ7CisKKy8qKgorICogRXhhbXBsZSBvZiBhIGNvbXBsZXggdGVzdGluZyBiZWFuLgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworQFhtbFJvb3RFbGVtZW50CitwdWJsaWMgY2xhc3MgVGVzdEJlYW4geworCisgICAgLyogcHJpbWl0aXZlcyAqLworICAgIEBHZW5lcmF0ZUZvclRlc3QKKyAgICBwdWJsaWMgYnl0ZSBidDsKKyAgICBAR2VuZXJhdGVGb3JUZXN0CisgICAgcHVibGljIHNob3J0IHNoOworICAgIEBHZW5lcmF0ZUZvclRlc3QKKyAgICBwdWJsaWMgaW50IGk7CisgICAgQEdlbmVyYXRlRm9yVGVzdAorICAgIHB1YmxpYyBsb25nIGw7CisgICAgQEdlbmVyYXRlRm9yVGVzdAorICAgIHB1YmxpYyBmbG9hdCBmOworICAgIEBHZW5lcmF0ZUZvclRlc3QKKyAgICBwdWJsaWMgZG91YmxlIGQ7CisgICAgQEdlbmVyYXRlRm9yVGVzdAorICAgIHB1YmxpYyBib29sZWFuIGJsOworICAgIEBHZW5lcmF0ZUZvclRlc3QKKyAgICBwdWJsaWMgY2hhciBjOworCisgICAgLyogcHJpbWl0aXZlIHdyYXBwZXJzICovCisgICAgQEdlbmVyYXRlRm9yVGVzdAorICAgIHB1YmxpYyBCeXRlIHdyYXBCdDsKKyAgICBAR2VuZXJhdGVGb3JUZXN0CisgICAgcHVibGljIFNob3J0IHdyYXBTaDsKKyAgICBAR2VuZXJhdGVGb3JUZXN0CisgICAgcHVibGljIEludGVnZXIgd3JhcEk7CisgICAgQEdlbmVyYXRlRm9yVGVzdAorICAgIHB1YmxpYyBMb25nIHdyYXBMOworICAgIEBHZW5lcmF0ZUZvclRlc3QKKyAgICBwdWJsaWMgRmxvYXQgd3JhcEY7CisgICAgQEdlbmVyYXRlRm9yVGVzdAorICAgIHB1YmxpYyBEb3VibGUgd3JhcEQ7CisgICAgQEdlbmVyYXRlRm9yVGVzdAorICAgIHB1YmxpYyBCb29sZWFuIHdyYXBCbDsKKyAgICBAR2VuZXJhdGVGb3JUZXN0CisgICAgcHVibGljIENoYXJhY3RlciB3cmFwQzsKKworICAgIC8qIGFycmF5cyAqLworICAgIEBHZW5lcmF0ZUZvclRlc3QobGVuZ3RoID0gNykKKyAgICBwdWJsaWMgSW50ZWdlcltdIGFycmF5OworCisgICAgQEdlbmVyYXRlRm9yVGVzdAorICAgIHB1YmxpYyBEYXRlIGRhdGU7CisKKyAgICAvKiAxRCAtIGNvbGxlY3Rpb25zICovCisgICAgQFhtbEVsZW1lbnRXcmFwcGVyKG5hbWUgPSAiU3RyaW5nRWxlbWVudHMiKQorICAgIEBYbWxFbGVtZW50KG5hbWUgPSAiU3RyaW5nRWxlbWVudCIpCisgICAgQEdlbmVyYXRlRm9yVGVzdChjb2xsZWN0aW9uTWVtYmVyVHlwZSA9IFN0cmluZy5jbGFzcywgaW1wbGVtZW50aW5nQ2xhc3MgPSBBcnJheUxpc3QuY2xhc3MsIGxlbmd0aCA9IDEwKQorICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gc3RyaW5nTGlzdDsKKworICAgIEBYbWxFbGVtZW50V3JhcHBlcihuYW1lID0gIkludGVnZXJFbGVtZW50cyIpCisgICAgQFhtbEVsZW1lbnQobmFtZSA9ICJJbnRlZ2VyRWxlbWVudCIpCisgICAgQEdlbmVyYXRlRm9yVGVzdChjb2xsZWN0aW9uTWVtYmVyVHlwZSA9IEludGVnZXIuY2xhc3MsIGxlbmd0aCA9IDUpCisgICAgcHVibGljIEhhc2hTZXQ8SW50ZWdlcj4gaW50ZWdlclNldDsKKworICAgIC8qIGVudW1zICovCisgICAgQEdlbmVyYXRlRm9yVGVzdAorICAgIHB1YmxpYyBUZXN0QmVhbkVudW0gZW47CisKKyAgICAvKiBjdXN0b20gdHlwZXMgKi8KKyAgICBAR2VuZXJhdGVGb3JUZXN0CisgICAgcHVibGljIFRlc3RCZWFuSW5mbyBpbm5lcjsKKworICAgIC8qIHJlY3Vyc2l2ZSAqLworICAgIEBHZW5lcmF0ZUZvclRlc3QKKyAgICBwdWJsaWMgVGVzdEJlYW4gbmV4dEJlYW47CisKKyAgICAvKiBhbmQgd2hhdCBhYm91dCB0aG9zZT8gKi8KKyAgICAvLyBDaGFyU2VxdWVuY2UgY3M7CisgICAgLy8gT2JqZWN0IG87CisgICAgLy8gTWFwPFN0cmluZywgU3RyaW5nPiBtYXA7CisKKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgeworICAgICAgICByZXR1cm4gcHJpbnRDb250ZW50KDApOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgcHJpbnRDb250ZW50KGludCBsZXZlbCkgeworICAgICAgICBTdHJpbmcgcGFkID0gbGV2ZWwgPT0gMCA/ICIiIDogU3RyaW5nLmZvcm1hdCgiJTEkIiArIGxldmVsICsgInMiLCAiIik7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGJ1Zi5hcHBlbmQocGFkICsgIiMgVGVzdEJlYW5bbGV2ZWw9IiArIGxldmVsICsgIl1AIiArIEludGVnZXIudG9IZXhTdHJpbmcoaGFzaENvZGUoKSkpLmFwcGVuZCgiXG4iKTsKKworICAgICAgICBidWYuYXBwZW5kKHBhZCArICIjIFByaW1pdGl2ZXMiKS5hcHBlbmQoIlxuIik7CisgICAgICAgIGJ1Zi5hcHBlbmQocGFkICsgIlsiICsgYnQgKyAiLCAiICsgc2ggKyAiLCAiICsgaSArICIsICIgKyBsICsgIiwgIiArIGYgKyAiLCAiICsgZCArICIsICIgKyBibCArICIsICIgKyBjICsgIl0iKQorICAgICAgICAgICAgICAgIC5hcHBlbmQoIlxuIik7CisKKyAgICAgICAgYnVmLmFwcGVuZChwYWQgKyAiIyBQcmltaXRpdmVzIHdyYXBwZXJzIikuYXBwZW5kKCJcbiIpOworICAgICAgICBidWYuYXBwZW5kKHBhZCArICJbIiArIHdyYXBCdCArICIsICIgKyB3cmFwU2ggKyAiLCAiICsgd3JhcEkgKyAiLCAiICsgd3JhcEwgKyAiLCAiICsgd3JhcEYgKyAiLCAiICsgd3JhcEQgKyAiLCAiCisgICAgICAgICAgICAgICAgKyB3cmFwQmwgKyAiLCAiICsgd3JhcEMgKyAiXSIpLmFwcGVuZCgiXG4iKTsKKworICAgICAgICBidWYuYXBwZW5kKHBhZCArICIjIEFycmF5cyIpLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgaWYgKGFycmF5ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQocGFkICsgImFycmF5OiAiKTsKKyAgICAgICAgICAgIGZvciAoSW50ZWdlciBpIDogYXJyYXkpIHsKKyAgICAgICAgICAgICAgICBidWYuYXBwZW5kKGkgKyAiLCAiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQoIlxuIik7CisgICAgICAgIH0KKworICAgICAgICBidWYuYXBwZW5kKHBhZCArICIjIENvbGxlY3Rpb25zIikuYXBwZW5kKCJcbiIpOworICAgICAgICBpZiAoc3RyaW5nTGlzdCAhPSBudWxsKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKHBhZCArICJzdHJpbmdMaXN0OiAiKTsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIHMgOiBzdHJpbmdMaXN0KSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChzICsgIiwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWYuYXBwZW5kKCJcbiIpOworICAgICAgICB9CisgICAgICAgIGlmIChpbnRlZ2VyU2V0ICE9IG51bGwpIHsKKyAgICAgICAgICAgIGJ1Zi5hcHBlbmQocGFkICsgImludGVnZXJTZXQ6ICIpOworICAgICAgICAgICAgZm9yIChJbnRlZ2VyIGkgOiBpbnRlZ2VyU2V0KSB7CisgICAgICAgICAgICAgICAgYnVmLmFwcGVuZChpICsgIiwgIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWYuYXBwZW5kKCJcbiIpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRhdGUgIT0gbnVsbCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZChwYWQgKyAiZGF0ZTogIiArIGRhdGUpLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGJ1Zi5hcHBlbmQocGFkICsgIiMgRW51bXMiKS5hcHBlbmQoIlxuIik7CisgICAgICAgIGlmIChlbiAhPSBudWxsKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKHBhZCArICJlbj0iICsgZW4pLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgfQorICAgICAgICBidWYuYXBwZW5kKHBhZCArICIjIElubmVyIGJlYW4iKS5hcHBlbmQoIlxuIik7CisgICAgICAgIGlmIChpbm5lciAhPSBudWxsKSB7CisgICAgICAgICAgICBidWYuYXBwZW5kKGlubmVyLnByaW50Q29udGVudChsZXZlbCArIDEpKTsKKyAgICAgICAgfQorICAgICAgICBidWYuYXBwZW5kKCJcbiIpOworICAgICAgICBidWYuYXBwZW5kKHBhZCArICIjIFJlY3Vyc2l2ZSBiZWFuIikuYXBwZW5kKCJcbiIpOworICAgICAgICBpZiAobmV4dEJlYW4gIT0gbnVsbCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZChuZXh0QmVhbi5wcmludENvbnRlbnQobGV2ZWwgKyAxKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJ1Zi50b1N0cmluZygpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9UZXN0QmVhbkNvb3JkaW5hdGVzLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL1Rlc3RCZWFuQ29vcmRpbmF0ZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzI2Yjk4Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9UZXN0QmVhbkNvb3JkaW5hdGVzLmphdmEKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS50b29sczsKKworLyoqCisgKiBQYXJ0IG9mIGEgY29tcGxleCB0ZXN0IGJlYW4gZXhhbXBsZSwgY29udGFpbmVkIGluIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS50b29scy5UZXN0QmVhbkluZm99CisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgVGVzdEJlYW5Db29yZGluYXRlcyB7CisgICAgQEdlbmVyYXRlRm9yVGVzdAorICAgIHB1YmxpYyBpbnQgeDsKKyAgICBAR2VuZXJhdGVGb3JUZXN0CisgICAgcHVibGljIGludCB5OworCisgICAgcHVibGljIFN0cmluZyBwcmludENvbnRlbnQoaW50IGxldmVsKSB7CisgICAgICAgIFN0cmluZyBwYWQgPSBTdHJpbmcuZm9ybWF0KCIlMSQiICsgbGV2ZWwgKyAicyIsICIiKTsKKyAgICAgICAgcmV0dXJuIChwYWQgKyAiIyAiICsgdGhpcyArICJcbiIgKyBwYWQgKyAieDp5PSIgKyB4ICsgIjoiICsgeSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9UZXN0QmVhbkVudW0uamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvVGVzdEJlYW5FbnVtLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJhNGRjOQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvVGVzdEJlYW5FbnVtLmphdmEKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS50b29sczsKKworLyoqCisgKiBOZXN0ZWQgdHlwZSBvZiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UudG9vbHMuVGVzdEJlYW59CisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgZW51bSBUZXN0QmVhbkVudW0geworICAgIFZBTFVFXzEsIFZBTFVFXzIsIFZBTFVFXzM7Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL1Rlc3RCZWFuSW5mby5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9UZXN0QmVhbkluZm8uamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGQ2Y2NjCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9UZXN0QmVhbkluZm8uamF2YQpAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLnRvb2xzOworCisvKioKKyAqIE5lc3RlZCB0ZXN0aW5nIGJlYW4sIGNvbnRhaW5lZCBpbiB7QGxpbmsgb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UudG9vbHMuVGVzdEJlYW59CisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgVGVzdEJlYW5JbmZvIHsKKworICAgIEBHZW5lcmF0ZUZvclRlc3QKKyAgICBwdWJsaWMgSW50ZWdlciBzb21lTnVtYmVyOworICAgIEBHZW5lcmF0ZUZvclRlc3QKKyAgICBwdWJsaWMgaW50IGk7IC8vIHNhbWUgbmFtZSBhcyBpbiB0aGUgbWFpbiBiZWFuLCBvbiBwdXJwb3NlCisgICAgQEdlbmVyYXRlRm9yVGVzdAorICAgIHB1YmxpYyBUZXN0QmVhbkNvb3JkaW5hdGVzIGNvb3JkczsgLy8gYW5vdGhlciBuZXN0ZWQgbGV2ZWwKKworICAgIHB1YmxpYyBTdHJpbmcgcHJpbnRDb250ZW50KGludCBsZXZlbCkgeworICAgICAgICBTdHJpbmcgcGFkID0gU3RyaW5nLmZvcm1hdCgiJTEkIiArIGxldmVsICsgInMiLCAiIik7CisgICAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBuZXcgU3RyaW5nQnVmZmVyKCk7CisgICAgICAgIGJ1Zi5hcHBlbmQocGFkICsgIiMgIiArIHRoaXMpLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgYnVmLmFwcGVuZChwYWQgKyAic29tZU51bWJlcj0iICsgc29tZU51bWJlcikuYXBwZW5kKCJcbiIpOworICAgICAgICBidWYuYXBwZW5kKHBhZCArICJpPSIgKyBpKS5hcHBlbmQoIlxuIik7CisgICAgICAgIGlmIChjb29yZHMgIT0gbnVsbCkgeworICAgICAgICAgICAgYnVmLmFwcGVuZChjb29yZHMucHJpbnRDb250ZW50KGxldmVsICsgMSkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL1Rlc3REYXRhR2VuZXJhdGlvblN0cmF0ZWd5LmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL1Rlc3REYXRhR2VuZXJhdGlvblN0cmF0ZWd5LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI2ZGM0NwotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvVGVzdERhdGFHZW5lcmF0aW9uU3RyYXRlZ3kuamF2YQpAQCAtMCwwICsxLDI3IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLnRvb2xzOworCisvKioKKyAqIEVudW0gZm9yIHRlc3QgZGF0YSBnZW5lcmF0aW9uIHN0cmF0ZWdpZXMuCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgZW51bSBUZXN0RGF0YUdlbmVyYXRpb25TdHJhdGVneSB7CisgICAgQ09OU1RBTlQsCisgICAgUkFORE9NLAorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9UZXN0RGF0YUdlbmVyYXRvci5qYXZhIGIvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9UZXN0RGF0YUdlbmVyYXRvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMGVmYTQKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL1Rlc3REYXRhR2VuZXJhdG9yLmphdmEKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxNCwgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS50b29sczsKKworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOworaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247CisKKy8qKgorICogSW5zdGFudGlhdGVzIGFuZCBwb3B1bGF0ZXMgYSBiZWFuIHdpdGggdGVzdGluZyBkYXRhLgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIFRlc3REYXRhR2VuZXJhdG9yIHsKKworICAgIC8qKgorICAgICAqCisgICAgICogQHBhcmFtIGJlYW4gYmVhbiB0byBiZSBwb3B1bGF0ZWQKKyAgICAgKiBAcGFyYW0gPFQ+IHR5cGUgb2YgdGhlIHRlc3RpbmcgYmVhbgorICAgICAqIEB0aHJvd3MgQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbgorICAgICAqIEB0aHJvd3MgTm9TdWNoTWV0aG9kRXhjZXB0aW9uCisgICAgICogQHRocm93cyBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uCisgICAgICogQHRocm93cyBJbnN0YW50aWF0aW9uRXhjZXB0aW9uCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyA8VD4gdm9pZCBwb3B1bGF0ZUJlYW5CeUFubm90YXRpb25zKFQgYmVhbikgdGhyb3dzIFJlZmxlY3RpdmVPcGVyYXRpb25FeGNlcHRpb24geworICAgICAgICBGaWVsZFtdIGZpZWxkcyA9IGJlYW4uZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZEZpZWxkcygpOworICAgICAgICBUZXN0VmFsdWVHZW5lcmF0b3IgZ2VuZXJhdG9yID0gVGVzdFZhbHVlR2VuZXJhdG9yRmFjdG9yeS5nZXRHZW5lcmF0b3IoVGVzdERhdGFHZW5lcmF0aW9uU3RyYXRlZ3kuUkFORE9NKTsKKyAgICAgICAgZm9yIChGaWVsZCBmaWVsZCA6IGZpZWxkcykgeworICAgICAgICAgICAgR2VuZXJhdGVGb3JUZXN0IGFubm90YXRpb24gPSBmaWVsZC5nZXRBbm5vdGF0aW9uKEdlbmVyYXRlRm9yVGVzdC5jbGFzcyk7CisgICAgICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKKyAgICAgICAgICAgICAgICBmaWVsZC5zZXQoYmVhbiwgZ2VuZXJhdG9yLmdldFZhbHVlRm9yVHlwZShmaWVsZC5nZXRUeXBlKCksIGFubm90YXRpb24pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvVGVzdERhdGFHZW5lcmF0b3JBcHAuamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvVGVzdERhdGFHZW5lcmF0b3JBcHAuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTdjNDVmCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9UZXN0RGF0YUdlbmVyYXRvckFwcC5qYXZhCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLnRvb2xzOworCitpbXBvcnQgamF2YS5pby5CdWZmZXJlZFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7CitpbXBvcnQgamF2YS5uZXQuVVJJOworaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxldmVsOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IGphdmF4LndzLnJzLmNsaWVudC5DbGllbnQ7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LkNsaWVudEJ1aWxkZXI7CitpbXBvcnQgamF2YXgud3MucnMuY2xpZW50LldlYlRhcmdldDsKK2ltcG9ydCBqYXZheC53cy5ycy5leHQuQ29udGV4dFJlc29sdmVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuZ3JpenpseTIuaHR0cHNlcnZlci5Hcml6emx5SHR0cFNlcnZlckZhY3Rvcnk7CitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkubW94eS5qc29uLk1veHlKc29uQ29uZmlnOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5SZXNvdXJjZUNvbmZpZzsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guZ3JpenpseS5odHRwLnNlcnZlci5IdHRwU2VydmVyOworCisvKioKKyAqIEFwcGxpY2F0aW9uIGZvciBnZW5lcmF0aW5nIGN1c3RvbSB0ZXN0aW5nIGRhdGEgZmlsZXMgZm9yIEplcnNleSBwZXJmb3JtYW5jZSB0ZXN0cy4KKyAqCisgKiA8cD5DcmVhdGVzIHNldCBvZiBmaWxlcyBjb250YWluaW5nIHBsYWluIHRleHQsIGpzb24gYW5kIHhtbCBpbiB2YXJpb3VzIHByZWRlZmluZWQgc2l6ZXM6CisgKiAxa0IsIDVrQiwgMTBrQiwgMU1CIGFuZCBvcHRpb25hbGx5IDFHQi4gVGhlIDFHQiBmaWxlIGhhcyB0byBiZSBlbmFibGVkIGJ5IGNoYW5naW5nIHRoZSBjb25zdGFudAorICoge0Bjb2RlIEdFTkVSQVRFX0FMU09fR0lHQUJZVEVfREFUQVNFVFN9IHRvIHRydWUuPC9wPgorICoKKyAqIDxwPlRoZSBzaXplcyBhcmUgdGhlIE1JTklNQUwgc2l6ZXMsIHRoZSBnZW5lcmF0aW9uIHN0b3BzIGFmdGVyIHJlYWNoaW5nIHRoZSBnaXZlbiBzaXplLAorICogYnV0IGRvZXMgbm90IHRydW5jYXRlIHRoZSBtb3N0IHJlY2VudGx5CisgKiBnZW5lcmF0ZWQgZW50aXR5LiBGb3Igc2ltcGxlIHRlc3RpbmcgYmVhbnMgdGhlIHNpemUgZGlmZmVyZW5jZSBmcm9tIHRoZSBwcmVkZWZpbmVkIHRyZXNob2xkIGlzIG1pbmltYWwsCisgKiB3aGVyZWFzIGZvciB2ZXJ5IGNvbXBsZXggdGVzdGluZyBiZWFucyB0aGUgZGlmZmVyZW5jZSBjYW4gYmUgc2lnbmlmaWNhbnQuPC9wPgorICoKKyAqIDxwPk1PWHkgaXMgdXNlZCBmb3IgY3JlYXRpbmcgWE1MIGFuZCBKU09OIGZyb20gdGhlIHRlc3RpbmcgYmVhbnMuPC9wPgorICoKKyAqIDxwPlJ1biB0aGUgZ2VuZXJhdGlvbiBieSBpbnZva2luZyB7QGNvZGUgbXZuIGNsZWFuIGNvbXBpbGV9IGFuZCB7QGNvZGUgbXZuIGV4ZWM6amF2YX0gY29tbWFuZHMgaW4gdGhlIG1vZHVsZSByb290IGZvbGRlci48L3A+CisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgVGVzdERhdGFHZW5lcmF0b3JBcHAgeworCisgICAgLyoqIGNoYW5nZSB0aGUgdmFsdWUgdG8gdHJ1ZSB0byBnZW5lcmF0ZSBhbHNvIDFHQiBmaWxlczsgY2FuIGJlIHRpbWUgY29uc3VtaW5nIGFuZCB0YWtlcyBhZGRpdGlvbmFsIDNHQiBvZiBkaXNrCisgICAgICogc3BhY2UgKDFHQiBqc29uLCAxR0IgeG1sIGFuZCAxR0IgdGV4dCkgKi8KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIEdFTkVSQVRFX0FMU09fR0lHQUJZVEVfREFUQVNFVFMgPSBmYWxzZTsKKworICAgIC8qKiBwYXRoIHdoZXJlIHRoZSBnZW5lcmF0ZWQgZmlsZXMgc2hvdWxkIGJlIHN0b3JlZCwgaW5jbHVkaW5nIHRoZSBmaW5hbCBzbGFzaCAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUxFX1BBVEggPSAiIjsKKworICAgIC8qKiBzcGVjaWZpZXMgaG93IHRoZSBvdXRwdXRzIGdlbmVyYXRlZCBmcm9tIG9uZSBiZWFuIHNob3VsZCBiZSBzZXBhcmF0ZWQgZnJvbSBlYWNoIG90aGVyIGluIHRoZSBvdXRwdXQgZmlsZXMgKi8KKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTlRJVFlfU0VQQVJBVE9SID0gIlxuXG4iOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPRyA9IExvZ2dlci5nZXRMb2dnZXIoVGVzdERhdGFHZW5lcmF0b3JBcHAuY2xhc3MuZ2V0TmFtZSgpKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVUkkgQkFTRV9VUkkgPSBVUkkuY3JlYXRlKCJodHRwOi8vbG9jYWxob3N0OjgwODAvIik7CisgICAgcHJpdmF0ZSBzdGF0aWMgVVJJIGJhc2VVcmk7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihmaW5hbCBTdHJpbmdbXSBhcmdzKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgYmFzZVVyaSA9IGFyZ3MubGVuZ3RoID4gMCA/IFVSSS5jcmVhdGUoYXJnc1swXSkgOiBCQVNFX1VSSTsKKyAgICAgICAgZmluYWwgSHR0cFNlcnZlciBzZXJ2ZXIgPSBHcml6emx5SHR0cFNlcnZlckZhY3RvcnkuY3JlYXRlSHR0cFNlcnZlcihiYXNlVXJpLCBjcmVhdGVBcHAoKSk7CisKKyAgICAgICAgTE9HLmluZm8oIkplcnNleSBwZXJmb3JtYW5jZSB0ZXN0IGRhdGEgZ2VuZXJhdGlvbiAtIGFwcGxpY2F0aW9uIHN0YXJ0ZWQuIik7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIC8vIGdlbmVyYXRlIHRleHQgZmlsZXMgLSAxa2IsIDVrYiwgMTBrYiwgMU1CIGFuZCBvcHRpb25hbGx5IDFHQgorICAgICAgICAgICAgZ2VuZXJhdGVGaWxlKCJzaW1wbGUvdGV4dCIsIDEwMjQsIEZJTEVfUEFUSCArICJjdXN0b20tMWtiLnRleHQiKTsKKyAgICAgICAgICAgIGdlbmVyYXRlRmlsZSgic2ltcGxlL3RleHQiLCA1ICogMTAyNCwgRklMRV9QQVRIICsgImN1c3RvbS01a2IudGV4dCIpOworICAgICAgICAgICAgZ2VuZXJhdGVGaWxlKCJzaW1wbGUvdGV4dCIsIDEwICogMTAyNCwgRklMRV9QQVRIICsgImN1c3RvbS0xMGtiLnRleHQiKTsKKyAgICAgICAgICAgIGdlbmVyYXRlRmlsZSgic2ltcGxlL3RleHQiLCAxMDI0ICogMTAyNCwgRklMRV9QQVRIICsgImN1c3RvbS0xTUIudGV4dCIpOworICAgICAgICAgICAgaWYgKEdFTkVSQVRFX0FMU09fR0lHQUJZVEVfREFUQVNFVFMpIHsKKyAgICAgICAgICAgICAgICBnZW5lcmF0ZUZpbGUoInRleHQiLCAxMDI0ICogMTAyNCAqIDEwMjQsIEZJTEVfUEFUSCArICJjdXN0b20tMUdCLnRleHQiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gZ2VuZXJhdGUganNvbiBmaWxlcyAtIDFrYiwgNWtiLCAxMGtiLCAxTUIgYW5kIG9wdGlvbmFsbHkgMUdCCisgICAgICAgICAgICBnZW5lcmF0ZUZpbGUoInNpbXBsZS9qc29uIiwgMTAyNCwgRklMRV9QQVRIICsgImN1c3RvbS0xa2IuanNvbiIpOworICAgICAgICAgICAgZ2VuZXJhdGVGaWxlKCJzaW1wbGUvanNvbiIsIDUgKiAxMDI0LCBGSUxFX1BBVEggKyAiY3VzdG9tLTVrYi5qc29uIik7CisgICAgICAgICAgICBnZW5lcmF0ZUZpbGUoInNpbXBsZS9qc29uIiwgMTAgKiAxMDI0LCBGSUxFX1BBVEggKyAiY3VzdG9tLTEwa2IuanNvbiIpOworICAgICAgICAgICAgZ2VuZXJhdGVGaWxlKCJzaW1wbGUvanNvbiIsIDEwMjQgKiAxMDI0LCBGSUxFX1BBVEggKyAiY3VzdG9tLTFNQi5qc29uIik7CisgICAgICAgICAgICBpZiAoR0VORVJBVEVfQUxTT19HSUdBQllURV9EQVRBU0VUUykgeworICAgICAgICAgICAgICAgIGdlbmVyYXRlRmlsZSgic2ltcGxlL2pzb24iLCAxMDI0ICogMTAyNCAqIDEwMjQsIEZJTEVfUEFUSCArICJjdXN0b20tMUdCLmpzb24iKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gZ2VuZXJhdGUgeG1sIGZpbGVzIC0gMWtiLCA1a2IsIDEwa2IsIDFNQiBhbmQgb3B0aW9uYWxseSAxR0IKKyAgICAgICAgICAgIGdlbmVyYXRlRmlsZSgic2ltcGxlL3htbCIsIDEwMjQsIEZJTEVfUEFUSCArICJjdXN0b20tMWtiLnhtbCIpOworICAgICAgICAgICAgZ2VuZXJhdGVGaWxlKCJzaW1wbGUveG1sIiwgNSAqIDEwMjQsIEZJTEVfUEFUSCArICJjdXN0b20tNWtiLnhtbCIpOworICAgICAgICAgICAgZ2VuZXJhdGVGaWxlKCJzaW1wbGUveG1sIiwgMTAgKiAxMDI0LCBGSUxFX1BBVEggKyAiY3VzdG9tLTEwa2IueG1sIik7CisgICAgICAgICAgICBnZW5lcmF0ZUZpbGUoInNpbXBsZS94bWwiLCAxMDI0ICogMTAyNCwgRklMRV9QQVRIICsgImN1c3RvbS0xTUIueG1sIik7CisgICAgICAgICAgICBpZiAoR0VORVJBVEVfQUxTT19HSUdBQllURV9EQVRBU0VUUykgeworICAgICAgICAgICAgICAgIGdlbmVyYXRlRmlsZSgic2ltcGxlL3htbCIsIDEwMjQgKiAxMDI0ICogMTAyNCwgRklMRV9QQVRIICsgImN1c3RvbS0xR0IuanNvbiIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwgIkFuIGVycm9yIG9jY3VycmVkIGR1cmluZyB0ZXN0IGRhdGEgZ2VuZXJhdGlvbi4gIiwgZSk7CisgICAgICAgIH0KKyAgICAgICAgc2VydmVyLnNodXRkb3duKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyBSZXNvdXJjZUNvbmZpZyBjcmVhdGVBcHAoKSB7CisgICAgICAgIHJldHVybiBuZXcgUmVzb3VyY2VDb25maWcoKQorICAgICAgICAgICAgICAgIC5wYWNrYWdlcygib3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UudG9vbHMiKQorICAgICAgICAgICAgICAgIC5yZWdpc3RlcihjcmVhdGVNb3h5SnNvblJlc29sdmVyKCkpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgQ29udGV4dFJlc29sdmVyPE1veHlKc29uQ29uZmlnPiBjcmVhdGVNb3h5SnNvblJlc29sdmVyKCkgeworICAgICAgICBmaW5hbCBNb3h5SnNvbkNvbmZpZyBtb3h5SnNvbkNvbmZpZyA9IG5ldyBNb3h5SnNvbkNvbmZpZygpOworICAgICAgICBmaW5hbCBNYXA8U3RyaW5nLCBTdHJpbmc+IG5hbWVzcGFjZVByZWZpeE1hcHBlciA9IG5ldyBIYXNoTWFwPD4oMSk7CisgICAgICAgIG5hbWVzcGFjZVByZWZpeE1hcHBlci5wdXQoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiwgInhzaSIpOworICAgICAgICBtb3h5SnNvbkNvbmZpZy5zZXROYW1lc3BhY2VQcmVmaXhNYXBwZXIobmFtZXNwYWNlUHJlZml4TWFwcGVyKS5zZXROYW1lc3BhY2VTZXBhcmF0b3IoJzonKTsKKyAgICAgICAgcmV0dXJuIG1veHlKc29uQ29uZmlnLnJlc29sdmVyKCk7CisgICAgfQorCisgICAgcHVibGljIHN0YXRpYyB2b2lkIGdlbmVyYXRlRmlsZShmaW5hbCBTdHJpbmcgcmVzb3VyY2VSZWxhdGl2ZVVybCwgZmluYWwgaW50IG1pbmltYWxTaXplLCBmaW5hbCBTdHJpbmcgZmlsZU5hbWUpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBMT0cuaW5mbygiR2VuZXJhdGluZyBmaWxlICIgKyBmaWxlTmFtZSk7CisgICAgICAgIGZpbmFsIENsaWVudCBjbGllbnQgPSBDbGllbnRCdWlsZGVyLm5ld0NsaWVudCgpOworICAgICAgICBmaW5hbCBXZWJUYXJnZXQgdGFyZ2V0ID0gY2xpZW50LnRhcmdldChiYXNlVXJpKS5wYXRoKCJnZW5lcmF0ZSIpLnBhdGgocmVzb3VyY2VSZWxhdGl2ZVVybCk7CisKKyAgICAgICAgZmluYWwgRmlsZSBmaWxlID0gbmV3IEZpbGUoZmlsZU5hbWUpOworICAgICAgICBmaW5hbCBCdWZmZXJlZFdyaXRlciB3cml0ZXIgPSBuZXcgQnVmZmVyZWRXcml0ZXIobmV3IE91dHB1dFN0cmVhbVdyaXRlcigKKyAgICAgICAgICAgICAgICBuZXcgRmlsZU91dHB1dFN0cmVhbShmaWxlKSwgQ2hhcnNldC5mb3JOYW1lKCJVVEYtOCIpKSk7CisKKyAgICAgICAgaW50IGFjdHVhbFNpemUgPSAwOworICAgICAgICB3aGlsZSAoYWN0dWFsU2l6ZSA8IG1pbmltYWxTaXplKSB7CisgICAgICAgICAgICBmaW5hbCBTdHJpbmcgcmVzcG9uc2UgPSB0YXJnZXQucmVxdWVzdCgpLmdldChTdHJpbmcuY2xhc3MpOworICAgICAgICAgICAgd3JpdGVyLndyaXRlKHJlc3BvbnNlICsgRU5USVRZX1NFUEFSQVRPUik7CisgICAgICAgICAgICBhY3R1YWxTaXplICs9IHJlc3BvbnNlLmxlbmd0aCgpOworICAgICAgICB9CisKKyAgICAgICAgd3JpdGVyLmZsdXNoKCk7CisgICAgICAgIHdyaXRlci5jbG9zZSgpOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9UZXN0RGF0YUdlbmVyYXRvclJlc291cmNlLmphdmEgYi90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL1Rlc3REYXRhR2VuZXJhdG9yUmVzb3VyY2UuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOWQ3MmI2Ci0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9UZXN0RGF0YUdlbmVyYXRvclJlc291cmNlLmphdmEKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UudG9vbHM7CisKK2ltcG9ydCBqYXZheC53cy5ycy5HRVQ7CitpbXBvcnQgamF2YXgud3MucnMuUGF0aDsKK2ltcG9ydCBqYXZheC53cy5ycy5Qcm9kdWNlczsKK2ltcG9ydCBqYXZheC53cy5ycy5jb3JlLk1lZGlhVHlwZTsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5MZXZlbDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8qKgorICogUmVzb3VyY2UgZm9yIGdlbmVyYXRpbmcgZGF0YSBmb3IgcGVyZm9ybWFuY2UgdGVzdHMuCisgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHtAbGluayBUZXN0RGF0YUdlbmVyYXRvckFwcH0KKyAqLworQFBhdGgoImdlbmVyYXRlIikKK3B1YmxpYyBjbGFzcyBUZXN0RGF0YUdlbmVyYXRvclJlc291cmNlIHsKKworICAgIHByaXZhdGUgc3RhdGljIExvZ2dlciBMT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFRlc3REYXRhR2VuZXJhdG9yUmVzb3VyY2UuY2xhc3MuZ2V0TmFtZSgpKTsKKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyBwbGFpbiB0ZXh0IGJhc2VkIGRhdGEgZnJvbSBhIGNvbXBsZXggdGVzdGluZyBiZWFuLgorICAgICAqIEByZXR1cm4gcmVzdWx0IG9mIGEgY2FsbCB0byBhIHtAbGluayBPYmplY3QjdG9TdHJpbmcoKX0gbWV0aG9kIG9mIHRoZSBwb3B1bGF0ZWQgYmVhbi4KKyAgICAgKi8KKyAgICBAR0VUCisgICAgQFBhdGgoImNvbXBsZXgvdGV4dCIpCisgICAgcHVibGljIFN0cmluZyBnZW5lcmF0ZUNvbXBsZXhUZXh0KCkgeworICAgICAgICByZXR1cm4gZ2V0Q29tcGxleFRlc3RCZWFuKCkudG9TdHJpbmcoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBHZW5lcmF0ZXMganNvbiBiYXNlZCBkYXRhIGZyb20gYSBjb21wbGV4IHRlc3RpbmcgYmVhbi4KKyAgICAgKiBAcmV0dXJuIHRoZSBiZWFuIHRvIGJlIGNvbnZlcnRlZCB0byBqc29uCisgICAgICovCisgICAgQEdFVAorICAgIEBQYXRoKCJjb21wbGV4L2pzb24iKQorICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKyAgICBwdWJsaWMgVGVzdEJlYW4gZ2VuZXJhdGVDb21wbGV4SnNvbigpIHsKKyAgICAgICAgcmV0dXJuIGdldENvbXBsZXhUZXN0QmVhbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyB4bWwgYmFzZWQgZGF0YSBmcm9tIGEgY29tcGxleCB0ZXN0aW5nIGJlYW4uCisgICAgICogQHJldHVybiB0aGUgYmVhbiB0byBiZSBjb252ZXJ0ZWQgdG8geG1sCisgICAgICovCisgICAgQEdFVAorICAgIEBQYXRoKCJjb21wbGV4L3htbCIpCisgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUwpCisgICAgcHVibGljIFRlc3RCZWFuIGdlbmVyYXRlQ29tcGxleFhtbCgpIHsKKyAgICAgICAgcmV0dXJuIGdldENvbXBsZXhUZXN0QmVhbigpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyBwbGFpbiB0ZXh0IGJhc2VkIGRhdGEgZnJvbSBhIHNpbXBsZSB0ZXN0aW5nIGJlYW4uCisgICAgICogQHJldHVybiByZXN1bHQgb2YgYSBjYWxsIHRvIGEge0BsaW5rIE9iamVjdCN0b1N0cmluZygpfSBtZXRob2Qgb2YgdGhlIHBvcHVsYXRlZCBiZWFuLgorICAgICAqLworICAgIEBHRVQKKyAgICBAUGF0aCgic2ltcGxlL3RleHQiKQorICAgIHB1YmxpYyBTdHJpbmcgZ2VuZXJhdGVTaW1wbGVUZXh0KCkgeworICAgICAgICByZXR1cm4gZ2V0U2ltcGxlVGVzdEJlYW4oKS50b1N0cmluZygpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEdlbmVyYXRlcyBqc29uIGJhc2VkIGRhdGEgZnJvbSBhIHNpbXBsZSB0ZXN0aW5nIGJlYW4uCisgICAgICogQHJldHVybiB0aGUgYmVhbiB0byBiZSBjb252ZXJ0ZWQgdG8ganNvbgorICAgICAqLworICAgIEBHRVQKKyAgICBAUGF0aCgic2ltcGxlL2pzb24iKQorICAgIEBQcm9kdWNlcyhNZWRpYVR5cGUuQVBQTElDQVRJT05fSlNPTikKKyAgICBwdWJsaWMgUGVyc29uIGdlbmVyYXRlU2ltcGxlSnNvbigpIHsKKyAgICAgICAgcmV0dXJuIGdldFNpbXBsZVRlc3RCZWFuKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogR2VuZXJhdGVzIHhtbCBiYXNlZCBkYXRhIGZyb20gYSBzaW1wbGUgdGVzdGluZyBiZWFuLgorICAgICAqIEByZXR1cm4gdGhlIGJlYW4gdG8gYmUgY29udmVydGVkIHRvIHhtbAorICAgICAqLworICAgIEBHRVQKKyAgICBAUGF0aCgic2ltcGxlL3htbCIpCisgICAgQFByb2R1Y2VzKE1lZGlhVHlwZS5BUFBMSUNBVElPTl9YTUwpCisgICAgcHVibGljIFBlcnNvbiBnZW5lcmF0ZVNpbXBsZVhtbCgpIHsKKyAgICAgICAgcmV0dXJuIGdldFNpbXBsZVRlc3RCZWFuKCk7CisgICAgfQorCisgICAgcHJpdmF0ZSBUZXN0QmVhbiBnZXRDb21wbGV4VGVzdEJlYW4oKSB7CisgICAgICAgIFRlc3RCZWFuIGJlYW4gPSBuZXcgVGVzdEJlYW4oKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIFRlc3REYXRhR2VuZXJhdG9yLnBvcHVsYXRlQmVhbkJ5QW5ub3RhdGlvbnMoYmVhbik7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMT0cubG9nKExldmVsLlNFVkVSRSwgIkVycm9yIHdoaWxlIHBvcHVsYXRpbmcgdGhlIHRlc3RpbmcgYmVhbi4iLCBlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYmVhbjsKKyAgICB9CisKKyAgICBwcml2YXRlIFBlcnNvbiBnZXRTaW1wbGVUZXN0QmVhbigpIHsKKyAgICAgICAgUGVyc29uIGJlYW4gPSBuZXcgUGVyc29uKCk7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBUZXN0RGF0YUdlbmVyYXRvci5wb3B1bGF0ZUJlYW5CeUFubm90YXRpb25zKGJlYW4pOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgTE9HLmxvZyhMZXZlbC5TRVZFUkUsICJFcnJvciB3aGlsZSBwb3B1bGF0aW5nIHRoZSB0ZXN0aW5nIGJlYW4uIiwgZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGJlYW47CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9UZXN0VmFsdWVHZW5lcmF0b3IuamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvVGVzdFZhbHVlR2VuZXJhdG9yLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc5YWNmYgotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvVGVzdFZhbHVlR2VuZXJhdG9yLmphdmEKQEAgLTAsMCArMSwyMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTQsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisgKgorICogVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICogTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICogRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgKiB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorICoKKyAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorICovCisKK3BhY2thZ2Ugb3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHMucGVyZm9ybWFuY2UudG9vbHM7CisKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKK2ltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7CisKKy8qKgorICogQWJzdHJhY3QgY2xhc3MgZm9yIHRlc3QgZGF0YSBnZW5lcmF0aW9uLgorICoKKyAqIDxwPkNyZWF0ZXMgdGhlIHBhdHRlcm4gZm9yIGRpZmZlcmVudCBnZW5lcmF0aW9uIHN0cmF0ZWdpZXMuCisgKiBDb250YWlucyB0aGUgKGxpbWl0ZWQpIGxvZ2ljIGZvciBjbGFzcyBncmFwaCB3YWxrLXRocm91Z2guPHAvPgorICogPHA+RXZlcnkgZmllbGQgd2hpY2ggc2hvdWxkIGJlIHBvcHVsYXRlZCBtdXN0IGJlIGFubm90YXRlZCBieQorICoge0BsaW5rIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLnRvb2xzLkdlbmVyYXRlRm9yVGVzdH08L3A+CisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgYWJzdHJhY3QgY2xhc3MgVGVzdFZhbHVlR2VuZXJhdG9yIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfUkVDVVJTSU9OX0xFVkVMID0gNTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2cgPSBMb2dnZXIuZ2V0TG9nZ2VyKFRlc3RWYWx1ZUdlbmVyYXRvci5jbGFzcy5nZXROYW1lKCkpOworCisgICAgLyoqIHJldHVybnMgdGVzdGluZyBkYXRhIGludCB2YWx1ZSAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0SW50KCk7CisKKyAgICAvKiogcmV0dXJucyB0ZXN0aW5nIGRhdGEgY2hhciB2YWx1ZSAqLworICAgIHB1YmxpYyBhYnN0cmFjdCBjaGFyIGdldENoYXIoKTsKKworICAgIC8qKiByZXR1cm5zIHRlc3RpbmcgZGF0YSBTdHJpbmcgdmFsdWUgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldFN0cmluZygpOworCisgICAgLyoqIHJldHVybnMgdGVzdGluZyBkYXRhIGxvbmcgdmFsdWUgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgbG9uZyBnZXRMb25nKCk7CisKKyAgICAvKiogcmV0dXJucyB0ZXN0aW5nIGRhdGEgZmxvYXQgdmFsdWUgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgZmxvYXQgZ2V0RmxvYXQoKTsKKworICAgIC8qKiByZXR1cm5zIHRlc3RpbmcgZGF0YSBkb3VibGUgdmFsdWUgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgZG91YmxlIGdldERvdWJsZSgpOworCisgICAgLyoqIHJldHVybnMgdGVzdGluZyBkYXRhIGJ5dGUgdmFsdWUgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgYnl0ZSBnZXRCeXRlKCk7CisKKyAgICAvKiogcmV0dXJucyB0ZXN0aW5nIGRhdGEgc2hvcnQgdmFsdWUgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3Qgc2hvcnQgZ2V0U2hvcnQoKTsKKworICAgIC8qKiByZXR1cm5zIHRlc3RpbmcgZGF0YSBib29sZWFuIHZhbHVlICovCisgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gZ2V0Qm9vbGVhbigpOworCisgICAgLyoqIHJldHVybnMgdGVzdGluZyBkYXRhIGVudW0gdmFsdWUgKi8KKyAgICBwdWJsaWMgYWJzdHJhY3QgPFQ+IFQgZ2V0RW51bShDbGFzczxUPiBlbnVtVHlwZSk7CisKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGhhbmRsZVByaW1pdGl2ZXNBbmRXcmFwcGVycyhDbGFzczw/PiB0eXBlKSB7CisgICAgICAgIGlmICh0eXBlLmlzQXNzaWduYWJsZUZyb20oU3RyaW5nLmNsYXNzKSkgeworICAgICAgICAgICAgcmV0dXJuIGdldFN0cmluZygpOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlLmlzQXNzaWduYWJsZUZyb20oSW50ZWdlci5jbGFzcykgfHwgdHlwZS5pc0Fzc2lnbmFibGVGcm9tKGludC5jbGFzcykpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRJbnQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHlwZS5pc0Fzc2lnbmFibGVGcm9tKENoYXJhY3Rlci5jbGFzcykgfHwgdHlwZS5pc0Fzc2lnbmFibGVGcm9tKGNoYXIuY2xhc3MpKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0Q2hhcigpOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlLmlzQXNzaWduYWJsZUZyb20oRmxvYXQuY2xhc3MpIHx8IHR5cGUuaXNBc3NpZ25hYmxlRnJvbShmbG9hdC5jbGFzcykpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRGbG9hdCgpOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlLmlzQXNzaWduYWJsZUZyb20oTG9uZy5jbGFzcykgfHwgdHlwZS5pc0Fzc2lnbmFibGVGcm9tKGxvbmcuY2xhc3MpKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0TG9uZygpOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlLmlzQXNzaWduYWJsZUZyb20oRG91YmxlLmNsYXNzKSB8fCB0eXBlLmlzQXNzaWduYWJsZUZyb20oZG91YmxlLmNsYXNzKSkgeworICAgICAgICAgICAgcmV0dXJuIGdldERvdWJsZSgpOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlLmlzQXNzaWduYWJsZUZyb20oQnl0ZS5jbGFzcykgfHwgdHlwZS5pc0Fzc2lnbmFibGVGcm9tKGJ5dGUuY2xhc3MpKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0Qnl0ZSgpOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlLmlzQXNzaWduYWJsZUZyb20oU2hvcnQuY2xhc3MpIHx8IHR5cGUuaXNBc3NpZ25hYmxlRnJvbShzaG9ydC5jbGFzcykpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRTaG9ydCgpOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlLmlzQXNzaWduYWJsZUZyb20oQm9vbGVhbi5jbGFzcykgfHwgdHlwZS5pc0Fzc2lnbmFibGVGcm9tKGJvb2xlYW4uY2xhc3MpKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0Qm9vbGVhbigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxsOworICAgIH0KKworICAgIHByb3RlY3RlZCBPYmplY3QgaGFuZGxlQ29sbGVjdGlvbnMoQ2xhc3M8Pz4gdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlRm9yVGVzdCBhbm5vdGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlY3Vyc2lvbkxldmVsKSB0aHJvd3MgUmVmbGVjdGl2ZU9wZXJhdGlvbkV4Y2VwdGlvbiB7CisgICAgICAgIGludCB0ZXN0RGF0YUxlbmd0aCA9IGFubm90YXRpb24ubGVuZ3RoKCk7CisgICAgICAgIENsYXNzPD8+IGNvbGxlY3Rpb25NZW1iZXJUeXBlID0gYW5ub3RhdGlvbi5jb2xsZWN0aW9uTWVtYmVyVHlwZSgpOworICAgICAgICBDbGFzczw/PiBjb2xsZWN0aW9uVHlwZSA9IHR5cGU7CisgICAgICAgIGlmIChjb2xsZWN0aW9uVHlwZS5pc0ludGVyZmFjZSgpKSB7CisgICAgICAgICAgICBjb2xsZWN0aW9uVHlwZSA9IGFubm90YXRpb24uaW1wbGVtZW50aW5nQ2xhc3MoKTsKKyAgICAgICAgICAgIGlmIChjb2xsZWN0aW9uVHlwZS5lcXVhbHMoT2JqZWN0LmNsYXNzKSkgeworICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuYWJsZSB0byBpbnN0YW50aWF0ZSBjb2xsZWN0aW9uIC0gaW50ZXJmYWNlIHdhcyB1c2VkIGZvciB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiZGVjbGFyYXRpb24gYW5kIHBhcmFtZXRlciAnaW1wbGVtZW50aW5nQ2xhc3MnIG5vdCBzZXQuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgT2JqZWN0IGNvbGxlY3Rpb24gPSBjb2xsZWN0aW9uVHlwZS5uZXdJbnN0YW5jZSgpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRlc3REYXRhTGVuZ3RoOyBpKyspIHsKKyAgICAgICAgICAgIC8vIHJlY3Vyc2l2ZWx5IHJlc29sdmUgdmFsdWUgZm9yIGNvbGxlY3Rpb24gbWVtYmVycworICAgICAgICAgICAgT2JqZWN0IG8gPSBnZXRWYWx1ZUZvclR5cGUoY29sbGVjdGlvbk1lbWJlclR5cGUsIG51bGwsIHJlY3Vyc2lvbkxldmVsICsgMSk7CisgICAgICAgICAgICAvLyBhbmQgYWRkIGl0IHRvIHRoZSBjb2xsZWN0aW9uIGluc3RhbmNlCisgICAgICAgICAgICBNZXRob2QgYWRkTWV0aG9kID0gdHlwZS5nZXREZWNsYXJlZE1ldGhvZCgiYWRkIiwgT2JqZWN0LmNsYXNzKTsKKyAgICAgICAgICAgIGFkZE1ldGhvZC5pbnZva2UoY29sbGVjdGlvbiwgbyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb247CisgICAgfQorCisgICAgcHJvdGVjdGVkIE9iamVjdCBoYW5kbGVBcnJheXMoQ2xhc3M8Pz4gdHlwZSwgR2VuZXJhdGVGb3JUZXN0IGFubm90YXRpb24sIGludCByZWN1cnNpb25MZXZlbCkKKyAgICAgICAgICAgIHRocm93cyBSZWZsZWN0aXZlT3BlcmF0aW9uRXhjZXB0aW9uIHsKKworICAgICAgICBpbnQgdGVzdERhdGFMZW5ndGggPSBhbm5vdGF0aW9uLmxlbmd0aCgpOworICAgICAgICBDbGFzczw/PiBhcnJheU1lbWJlclR5cGUgPSB0eXBlLmdldENvbXBvbmVudFR5cGUoKTsKKyAgICAgICAgT2JqZWN0IGFycmF5ID0gQXJyYXkubmV3SW5zdGFuY2UoYXJyYXlNZW1iZXJUeXBlLCB0ZXN0RGF0YUxlbmd0aCk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVzdERhdGFMZW5ndGg7IGkrKykgeworICAgICAgICAgICAgT2JqZWN0IG8gPSBnZXRWYWx1ZUZvclR5cGUoYXJyYXlNZW1iZXJUeXBlLCBudWxsLCByZWN1cnNpb25MZXZlbCArIDEpOworICAgICAgICAgICAgQXJyYXkuc2V0KGFycmF5LCBpLCBvKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYXJyYXk7CisgICAgfQorCisgICAgcHVibGljIE9iamVjdCBnZXRWYWx1ZUZvclR5cGUoQ2xhc3M8Pz4gdHlwZSwgR2VuZXJhdGVGb3JUZXN0IGFubm90YXRpb24pIHRocm93cyBSZWZsZWN0aXZlT3BlcmF0aW9uRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIGdldFZhbHVlRm9yVHlwZSh0eXBlLCBhbm5vdGF0aW9uLCAwKTsKKyAgICB9CisKKyAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldFZhbHVlRm9yVHlwZShDbGFzczw/PiB0eXBlLCBHZW5lcmF0ZUZvclRlc3QgYW5ub3RhdGlvbiwgaW50IHJlY3Vyc2lvbkxldmVsKQorICAgICAgICAgICAgdGhyb3dzIFJlZmxlY3RpdmVPcGVyYXRpb25FeGNlcHRpb24geworCisgICAgICAgIC8vIGhhbmRsZSBwcmltaXRpdmVzIGFuZCB3cmFwcGVyIGNsYXNzZXMKKyAgICAgICAgT2JqZWN0IHByaW1pdGl2ZU9yV3JhcHBlciA9IGhhbmRsZVByaW1pdGl2ZXNBbmRXcmFwcGVycyh0eXBlKTsKKyAgICAgICAgaWYgKHByaW1pdGl2ZU9yV3JhcHBlciAhPSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gcHJpbWl0aXZlT3JXcmFwcGVyOworICAgICAgICB9CisKKyAgICAgICAgLy8gSGFuZGxlIGNvbGxlY3Rpb25zCisgICAgICAgIGlmIChDb2xsZWN0aW9uLmNsYXNzLmlzQXNzaWduYWJsZUZyb20odHlwZSkpIHsKKyAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlQ29sbGVjdGlvbnModHlwZSwgYW5ub3RhdGlvbiwgcmVjdXJzaW9uTGV2ZWwpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGhhbmRsZSBtYXBzICh1bnN1cHBvcnRlZCkKKyAgICAgICAgaWYgKE1hcC5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHR5cGUpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJNYXBzIGFyZSBub3Qgc3VwcG9ydGVkLiIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gaGFuZGxlIGVudW1zCisgICAgICAgIGlmICh0eXBlLmlzRW51bSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0RW51bSh0eXBlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGhhbmRsZSBhcnJheXMKKyAgICAgICAgaWYgKHR5cGUuaXNBcnJheSgpKSB7CisgICAgICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZUFycmF5cyh0eXBlLCBhbm5vdGF0aW9uLCByZWN1cnNpb25MZXZlbCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gYWZ0ZXIgc2VsZWN0aW5nLW91dCAiYWxsIiB0aGUgb3RoZXIgcG9zc2liaWxpdGllcywgd2UgYXJlIHByb2JhYmx5IGhhbmRsaW5nIGEgY3VzdG9tIGlubmVyLWJlYW4KKyAgICAgICAgLy8gY3JlYXRlIHRoZSBpbm5lciB0eXBlCisgICAgICAgIGlmIChyZWN1cnNpb25MZXZlbCA9PSBNQVhfUkVDVVJTSU9OX0xFVkVMKSB7CisgICAgICAgICAgICBsb2cuZmluZSgiTWF4aW11bSByZWN1cnNpb24gbGV2ZWwgKCIgKyByZWN1cnNpb25MZXZlbCArICIpIHJlYWNoZWQuIElnbm9yaW5nIHRoZSBmaWVsZC4iKTsKKyAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICB9CisgICAgICAgIE9iamVjdCBpbm5lckJlYW4gPSB0eXBlLm5ld0luc3RhbmNlKCk7CisgICAgICAgIEZpZWxkW10gZmllbGRzID0gdHlwZS5nZXREZWNsYXJlZEZpZWxkcygpOworICAgICAgICBmb3IgKEZpZWxkIGZpZWxkIDogZmllbGRzKSB7CisgICAgICAgICAgICBHZW5lcmF0ZUZvclRlc3Qgc3ViRmllbGRBbm5vdGF0aW9uID0gZmllbGQuZ2V0QW5ub3RhdGlvbihHZW5lcmF0ZUZvclRlc3QuY2xhc3MpOworICAgICAgICAgICAgaWYgKHN1YkZpZWxkQW5ub3RhdGlvbiAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKKyAgICAgICAgICAgICAgICAvLyByZWN1cnNpdmVseSBnYXRoZXIgdGhlIHZhbHVlcyBmb3IgdGhlIGNvbnRhaW5pbmcgZmllbGRzIGFuZCBzZXQgaXQKKyAgICAgICAgICAgICAgICBmaWVsZC5zZXQoaW5uZXJCZWFuLCBnZXRWYWx1ZUZvclR5cGUoZmllbGQuZ2V0VHlwZSgpLCBzdWJGaWVsZEFubm90YXRpb24sIHJlY3Vyc2lvbkxldmVsICsgMSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBpbm5lckJlYW47CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL1Rlc3RWYWx1ZUdlbmVyYXRvckZhY3RvcnkuamF2YSBiL3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdGVzdHMvcGVyZm9ybWFuY2UvdG9vbHMvVGVzdFZhbHVlR2VuZXJhdG9yRmFjdG9yeS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiMjY4YjUKLS0tIC9kZXYvbnVsbAorKysgYi90ZXN0cy9wZXJmb3JtYW5jZS90b29scy9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rlc3RzL3BlcmZvcm1hbmNlL3Rvb2xzL1Rlc3RWYWx1ZUdlbmVyYXRvckZhY3RvcnkuamF2YQpAQCAtMCwwICsxLDM4IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE0LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3RzLnBlcmZvcm1hbmNlLnRvb2xzOworCisvKioKKyAqIEZhY3RvcnkgZm9yIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS50b29scy5UZXN0VmFsdWVHZW5lcmF0b3J9IGltcGxlbWVudGF0aW9ucy4KKyAqCisgKiBAYXV0aG9yIEFkYW0gTGluZGVudGhhbCAoYWRhbS5saW5kZW50aGFsIGF0IG9yYWNsZS5jb20pCisgKi8KK3B1YmxpYyBjbGFzcyBUZXN0VmFsdWVHZW5lcmF0b3JGYWN0b3J5IHsKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGluc3RhbmNlIG9mIHtAbGluayBvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0cy5wZXJmb3JtYW5jZS50b29scy5UZXN0VmFsdWVHZW5lcmF0b3J9CisgICAgICogQHBhcmFtIHN0cmF0ZWd5IGRhdGEgZ2VuZXJhdGlvbiBzdHJhdGVneQorICAgICAqIEByZXR1cm4gZ2VuZXJhdG9yIGluc3RhbmNlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBUZXN0VmFsdWVHZW5lcmF0b3IgZ2V0R2VuZXJhdG9yKFRlc3REYXRhR2VuZXJhdGlvblN0cmF0ZWd5IHN0cmF0ZWd5KSB7CisgICAgICAgIGlmIChzdHJhdGVneSA9PSBUZXN0RGF0YUdlbmVyYXRpb25TdHJhdGVneS5DT05TVEFOVCkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBDb25zdGFudFRlc3RWYWx1ZUdlbmVyYXRvcigpOworICAgICAgICB9IGVsc2UgaWYgKHN0cmF0ZWd5ID09IFRlc3REYXRhR2VuZXJhdGlvblN0cmF0ZWd5LlJBTkRPTSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5kb21UZXN0VmFsdWVHZW5lcmF0b3IoKTsKKyAgICAgICAgfQorICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJSZXF1ZXN0ZWQgVGVzdERhdGFHZW5lcmF0aW9uU3RyYXRlZ3kgZG9lcyBub3QgZXhpc3QuIik7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdGVzdHMvcG9tLnhtbCBiL3Rlc3RzL3BvbS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ2ZTkyYQotLS0gL2Rldi9udWxsCisrKyBiL3Rlc3RzL3BvbS54bWwKQEAgLTAsMCArMSwxMDkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTEsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXk8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0czwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5wcm9qZWN0PC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+CisgICAgPG5hbWU+amVyc2V5LXRlc3RzPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPgorICAgICAgICBUZXN0IG1vZHVsZXMgY29udGFpbmluZyB0ZXN0IHNjZW5hcmlvIHR5cGVzIHRoYXQgaW52b2x2ZSBtdWx0aXBsZSBpbXBsZW1lbnRhdGlvbgorICAgICAgICBtb2R1bGVzIChpbnRlZ3JhdGlvbiwgZnVuY3Rpb25hbCwgZXRjLiB0ZXN0cykuCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxtb2R1bGVzPgorICAgICAgICA8bW9kdWxlPmUyZTwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmUyZS1jbGllbnQ8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5lMmUtY29yZS1jb21tb248L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5lMmUtZW50aXR5PC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+ZTJlLWluamVjdDwvbW9kdWxlPgorICAgICAgICA8bW9kdWxlPmUyZS1zZXJ2ZXI8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5lMmUtdGVzdG5nPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+aW50ZWdyYXRpb248L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5tZW0tbGVha3M8L21vZHVsZT4KKyAgICAgICAgPG1vZHVsZT5vc2dpPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+c3RyZXNzPC9tb2R1bGU+CisgICAgICAgIDxtb2R1bGU+cGVyZm9ybWFuY2U8L21vZHVsZT4KKyAgICA8L21vZHVsZXM+CisKKyAgICA8ZGVwZW5kZW5jeU1hbmFnZW1lbnQ+CisgICAgICAgIDxkZXBlbmRlbmNpZXM+CisgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleTwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qZXJzZXktYm9tPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8dHlwZT5wb208L3R5cGU+CisgICAgICAgICAgICAgICAgPHNjb3BlPmltcG9ydDwvc2NvcGU+CisgICAgICAgICAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIDwvZGVwZW5kZW5jaWVzPgorICAgIDwvZGVwZW5kZW5jeU1hbmFnZW1lbnQ+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LmluamVjdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS1oazI8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4ke3Byb2plY3QudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1kZXBsb3ktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8c2tpcD50cnVlPC9za2lwPgorICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4taW5zdGFsbC1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxza2lwPnRydWU8L3NraXA+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisgICAgICAgIDwvcGx1Z2lucz4KKyAgICA8L2J1aWxkPgorCisgICAgPHByb2ZpbGVzPgorICAgICAgICA8cHJvZmlsZT4KKyAgICAgICAgICAgIDxpZD5yZWxlYXNlPC9pZD4KKyAgICAgICAgICAgIDxidWlsZD4KKyAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5zb25hdHlwZS5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bmV4dXMtc3RhZ2luZy1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2tpcE5leHVzU3RhZ2luZ0RlcGxveU1vam8+dHJ1ZTwvc2tpcE5leHVzU3RhZ2luZ0RlcGxveU1vam8+CisgICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KKyAgICAgICAgICAgIDwvYnVpbGQ+CisgICAgICAgIDwvcHJvZmlsZT4KKyAgICA8L3Byb2ZpbGVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdGVzdHMvc3RyZXNzL3BvbS54bWwgYi90ZXN0cy9zdHJlc3MvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWMzNTljCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RyZXNzL3BvbS54bWwKQEAgLTAsMCArMSwxMDkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tCisKKyAgICBDb3B5cmlnaHQgKGMpIDIwMTUsIDIwMTggT3JhY2xlIGFuZC9vciBpdHMgYWZmaWxpYXRlcy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKworICAgIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICAgIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorCisgICAgVGhpcyBTb3VyY2UgQ29kZSBtYXkgYWxzbyBiZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgZm9sbG93aW5nIFNlY29uZGFyeQorICAgIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAgICBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAgICB2ZXJzaW9uIDIgd2l0aCB0aGUgR05VIENsYXNzcGF0aCBFeGNlcHRpb24sIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKworICAgIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wIE9SIEdQTC0yLjAgV0lUSCBDbGFzc3BhdGgtZXhjZXB0aW9uLTIuMAorCistLT4KKworPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcveHNkL21hdmVuLTQuMC4wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPHBhcmVudD4KKyAgICAgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudGVzdHM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPnByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjgtU05BUFNIT1Q8L3ZlcnNpb24+CisgICAgPC9wYXJlbnQ+CisKKyAgICA8YXJ0aWZhY3RJZD5zdHJlc3M8L2FydGlmYWN0SWQ+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKyAgICA8bmFtZT5qZXJzZXktdGVzdHMtc3RyZXNzPC9uYW1lPgorCisgICAgPGRlc2NyaXB0aW9uPgorCisgICAgICAgIEplcnNleSBzdHJlc3MgdGVzdHMKKworICAgICAgICBUaGlzIG1vZHVsZSBtYXkgY29udGFpbiB0ZXN0cyB3aGljaCBleGVjdXRpb24gaXMgbGltaXRlZCBieSB0aW1lIChvciBhIGZhdWx0KS4gVGhpcyBtYXkgbGVhZCB0byBhIGNvbnNpZGVyYWJsZSBsb25nZXIKKyAgICAgICAgYnVpbGQgb2YgSmVyc2V5LgorCisgICAgPC9kZXNjcmlwdGlvbj4KKworICAgIDxidWlsZD4KKyAgICAgICAgPHBsdWdpbnM+CisgICAgICAgICAgICA8cGx1Z2luPgorICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb21waWxlci1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgPGFyZ0xpbmU+LVhteDIwNDhtICR7c3VyZWZpcmUuY292ZXJhZ2UuYXJnbGluZX08L2FyZ0xpbmU+CisgICAgICAgICAgICAgICAgICAgIDxmb3JrTW9kZT5hbHdheXM8L2ZvcmtNb2RlPgorICAgICAgICAgICAgICAgICAgICA8ZW5hYmxlQXNzZXJ0aW9ucz5mYWxzZTwvZW5hYmxlQXNzZXJ0aW9ucz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVyczwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmplcnNleS10ZXN0LWZyYW1ld29yay1wcm92aWRlci1idW5kbGU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dHlwZT5wb208L3R5cGU+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPmNvbS5nb29nbGUuZ3VhdmE8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5ndWF2YTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7Z3VhdmEudmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrPC9ncm91cElkPgorICAgICAgICAgICAgPGFydGlmYWN0SWQ+amVyc2V5LXRlc3QtZnJhbWV3b3JrLXV0aWw8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKworICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5oYW1jcmVzdDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPmhhbWNyZXN0LWxpYnJhcnk8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8L2RlcGVuZGVuY2llcz4KKworICAgIDxwcm9maWxlcz4KKyAgICAgICAgPHByb2ZpbGU+CisgICAgICAgICAgICA8aWQ+c29uYXI8L2lkPgorICAgICAgICAgICAgPGJ1aWxkPgorICAgICAgICAgICAgICAgIDxwbHVnaW5NYW5hZ2VtZW50PgorICAgICAgICAgICAgICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXN1cmVmaXJlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBkaXNhYmxlIEphQ29DbyBsaXN0ZW5lciBiZWNhdXNlIGl0J3Mgbm90IHdvcmtpbmcgd2l0aCA8Zm9ya01vZGU+YWx3YXlzPC9mb3JrPiAoPHJldXNlRm9ya3M+ZmFsc2U8L3JldXNlRm9ya3M+IHJlc3BlY3RpdmVseSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHR0cHM6Ly9qaXJhLnNvbmFyc291cmNlLmNvbS9icm93c2UvU09OQVJKQVZBLTcyOCAoaHR0cHM6Ly9naXRodWIuY29tL1NvbmFyU291cmNlL3NvbmFyLWphdmEvcHVsbC8zMjQpIC0tPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cHJvcGVydGllcyBjb21iaW5lLnNlbGY9Im92ZXJyaWRlIiAvPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgorICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbnM+CisgICAgICAgICAgICAgICAgPC9wbHVnaW5NYW5hZ2VtZW50PgorICAgICAgICAgICAgPC9idWlsZD4KKyAgICAgICAgPC9wcm9maWxlPgorICAgIDwvcHJvZmlsZXM+CisKKzwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL3Rlc3RzL3N0cmVzcy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL011bHRpVGhyZWFkaW5nQWdncmVnYXRlZFJlc2Vydm9pclRlc3QuamF2YSBiL3Rlc3RzL3N0cmVzcy9zcmMvdGVzdC9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3NlcnZlci9pbnRlcm5hbC9tb25pdG9yaW5nL011bHRpVGhyZWFkaW5nQWdncmVnYXRlZFJlc2Vydm9pclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NWZmZjgzCi0tLSAvZGV2L251bGwKKysrIGIvdGVzdHMvc3RyZXNzL3NyYy90ZXN0L2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvc2VydmVyL2ludGVybmFsL21vbml0b3JpbmcvTXVsdGlUaHJlYWRpbmdBZ2dyZWdhdGVkUmVzZXJ2b2lyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjE0IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5tb25pdG9yaW5nOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5Db3B5T25Xcml0ZUFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvclNlcnZpY2U7CitpbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3JzOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRocmVhZExvY2FsUmFuZG9tOworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LlRpbWVVbml0OworaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LmF0b21pYy5BdG9taWNJbnRlZ2VyOworaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKKworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LmludGVybmFsLmd1YXZhLlRocmVhZEZhY3RvcnlCdWlsZGVyOworCitpbXBvcnQgb3JnLmdsYXNzZmlzaC5qZXJzZXkuc2VydmVyLmludGVybmFsLm1vbml0b3JpbmcuY29yZS5UaW1lUmVzZXJ2b2lyOworaW1wb3J0IG9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5pbnRlcm5hbC5tb25pdG9yaW5nLmNvcmUuVW5pZm9ybVRpbWVTbmFwc2hvdDsKK2ltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7CitpbXBvcnQgb3JnLmp1bml0LkFzc2VydDsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKKy8qKgorICogTXVsdGkgVGhyZWFkaW5nIGNvbmN1cnJlbmN5IHRlc3Qgb2YgSmVyc2V5IG1vbml0b3JpbmcgaW50ZXJuYWxzLgorICoKKyAqIEBhdXRob3IgU3RlcGFuIFZhdnJhIChzdGVwYW4udmF2cmEgYXQgb3JhY2xlLmNvbSkKKyAqLworcHVibGljIGNsYXNzIE11bHRpVGhyZWFkaW5nQWdncmVnYXRlZFJlc2Vydm9pclRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIExPR0dFUiA9IExvZ2dlci5nZXRMb2dnZXIoTXVsdGlUaHJlYWRpbmdBZ2dyZWdhdGVkUmVzZXJ2b2lyVGVzdC5jbGFzcy5nZXROYW1lKCkpOworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBST0RVQ0VSX0NPVU5UID0gNTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQ09OU1VNRVJfQ09VTlQgPSA1OworCisgICAgLyoqCisgICAgICogTm90ZSB0aGF0IG1vcmUgdGhhbiA1IHNlY29uZHMgbWF5IHJlcXVpcmUgbW9yZSB0aGFuIDFHIGhlYXAgbWVtb3J5LgorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBURVNUX0RVUkFUSU9OX01JTExJUyA9IDEwXzAwMDsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0hVVERPV05fVElNRU9VVF9TRUNPTkRTID0gMTIwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGRvdWJsZSBERUxUQSA9IDAuMDAwMTsKKworICAgIHByaXZhdGUgZmluYWwgQXRvbWljSW50ZWdlciBpbmNyZW1lbnRlciA9IG5ldyBBdG9taWNJbnRlZ2VyKDApOworCisgICAgcHJpdmF0ZSBmaW5hbCBFeGVjdXRvclNlcnZpY2UgcHJvZHVjZXJFeGVjdXRvclNlcnZpY2UgPSBFeGVjdXRvcnMKKyAgICAgICAgICAgIC5uZXdGaXhlZFRocmVhZFBvb2woUFJPRFVDRVJfQ09VTlQsIG5ldyBUaHJlYWRGYWN0b3J5QnVpbGRlcigpLnNldERhZW1vbih0cnVlKS5idWlsZCgpKTsKKworICAgIHByaXZhdGUgZmluYWwgRXhlY3V0b3JTZXJ2aWNlIGNvbnN1bWVyRXhlY3V0b3JTZXJ2aWNlID0gRXhlY3V0b3JzCisgICAgICAgICAgICAubmV3Rml4ZWRUaHJlYWRQb29sKENPTlNVTUVSX0NPVU5ULCBuZXcgVGhyZWFkRmFjdG9yeUJ1aWxkZXIoKS5zZXREYWVtb24odHJ1ZSkuYnVpbGQoKSk7CisKKyAgICBwcml2YXRlIGZpbmFsIGxvbmcgc3RhcnRUaW1lID0gU3lzdGVtLm5hbm9UaW1lKCk7CisgICAgcHJpdmF0ZSBmaW5hbCBUaW1lVW5pdCBzdGFydFVuaXRUaW1lID0gVGltZVVuaXQuTkFOT1NFQ09ORFM7CisKKyAgICBwcml2YXRlIGZpbmFsIEFnZ3JlZ2F0aW5nVHJpbW1lciB0cmltbWVyID0KKyAgICAgICAgICAgIG5ldyBBZ2dyZWdhdGluZ1RyaW1tZXIoc3RhcnRUaW1lKCksIHN0YXJ0VW5pdFRpbWUsIDEwLCBUaW1lVW5pdC5NSUNST1NFQ09ORFMpOworICAgIHByaXZhdGUgZmluYWwgU2xpZGluZ1dpbmRvd1RpbWVSZXNlcnZvaXIgdGltZTEwdXNSZXNlcnZvaXIgPQorICAgICAgICAgICAgbmV3IFNsaWRpbmdXaW5kb3dUaW1lUmVzZXJ2b2lyKDEwLCBUaW1lVW5pdC5NSUNST1NFQ09ORFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lKCksIHN0YXJ0VW5pdFRpbWUsIHRyaW1tZXIpOworICAgIHByaXZhdGUgZmluYWwgQWdncmVnYXRlZFNsaWRpbmdXaW5kb3dUaW1lUmVzZXJ2b2lyIHRpbWUxRGF5QWdncmVnYXRlZFJlc2Vydm9pciA9CisgICAgICAgICAgICBuZXcgQWdncmVnYXRlZFNsaWRpbmdXaW5kb3dUaW1lUmVzZXJ2b2lyKDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVVbml0LkRBWVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSgpLCBzdGFydFVuaXRUaW1lLCB0cmltbWVyKTsKKyAgICBwcml2YXRlIGZpbmFsIEFnZ3JlZ2F0ZWRTbGlkaW5nV2luZG93VGltZVJlc2Vydm9pciB0aW1lMTBEYXlzQWdncmVnYXRlZFJlc2Vydm9pciA9CisgICAgICAgICAgICBuZXcgQWdncmVnYXRlZFNsaWRpbmdXaW5kb3dUaW1lUmVzZXJ2b2lyKAorICAgICAgICAgICAgICAgICAgICAxMCwgVGltZVVuaXQuREFZUywKKyAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lKCksIHN0YXJ0VW5pdFRpbWUsIHRyaW1tZXIpOworICAgIHByaXZhdGUgZmluYWwgTGlzdDxBZ2dyZWdhdGVkU2xpZGluZ1dpbmRvd1RpbWVSZXNlcnZvaXI+IGFnZ3JlZ2F0ZWRUaW1lUmVzZXJ2b2lycyA9CisgICAgICAgICAgICBuZXcgQ29weU9uV3JpdGVBcnJheUxpc3Q8PigKKyAgICAgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQWdncmVnYXRlZFNsaWRpbmdXaW5kb3dUaW1lUmVzZXJ2b2lyKDEsIFRpbWVVbml0LlNFQ09ORFMsIHN0YXJ0VGltZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRVbml0VGltZSwgdHJpbW1lciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZTFEYXlBZ2dyZWdhdGVkUmVzZXJ2b2lyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWUxMERheXNBZ2dyZWdhdGVkUmVzZXJ2b2lyCisgICAgICAgICAgICAgICAgICAgICkpOworCisgICAgLyoqCisgICAgICogRGV0ZXJtaW5lcyB0aGUgc3RhcnQgdGltZSBvZiB0aGUgdGVzdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIHN0YXJ0IHRpbWUgb2YgdGhlIHRlc3QuIE11c3QgYmUgYSBjb25zdGFudCB2YWx1ZS4KKyAgICAgKi8KKyAgICBwcm90ZWN0ZWQgbG9uZyBzdGFydFRpbWUoKSB7CisgICAgICAgIHJldHVybiBzdGFydFRpbWU7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGRvU2h1dGRvd24gPSBmYWxzZTsKKworICAgIC8qKgorICAgICAqIFJ1bnMge0BsaW5rICNQUk9EVUNFUl9DT1VOVH0gcHJvZHVjZXJzIHRoYXQgdXBkYXRlIHtAbGluayAjdGltZTEwdXNSZXNlcnZvaXJ9IDEwIG1pY3Jvc2Vjb25kcyBzbGlkaW5nIHdpbmRvdyByZXNlcnZvaXIgd2l0aAorICAgICAqIHNlcXVlbnRpYWxseSBpbmNyZWFzaW5nIHZhbHVlcyBnZW5lcmF0ZWQgYnkge0BsaW5rIEBpbmNyZW1lbnRlcn0uIFRoaXMgc2xpZGluZyB3aW5kb3cgdXBkYXRlcyAxIGRheSBhZ2dyZWdhdGVkIHNsaWRpbmcKKyAgICAgKiB3aW5kb3cgYW5kIGFsc28gMTAgZGF5cyBhZ2dyZWdhdGVkIHNsaWRpbmcgd2luZG93ICh7QGxpbmsgI3RpbWUxRGF5QWdncmVnYXRlZFJlc2Vydm9pcn0gYW5kIHtAbGluaworICAgICAqICN0aW1lMTBEYXlzQWdncmVnYXRlZFJlc2Vydm9pcn0gcmVzcGVjdGl2ZWx5KS4gSW4gdGhlIG1lYW50aW1lLCB7QGxpbmsgI0NPTlNVTUVSX0NPVU5UfSBjb25zdW1lcnMgcmV0cmlldmUgc25hcHNob3RzIGZyb20KKyAgICAgKiB0aGUgYWdncmVnYXRlZCB3aW5kb3cgaW4gb3JkZXIgdG8gaW5jcmVhc2UgdGhlIGxldmVsIG9mIGNvbmN1cnJlbmN5LgorICAgICAqCisgICAgICogQHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBJZiBhbnkgb2YgdGhlIHRocmVhZCB3YXMgaW50ZXJydXB0ZWQgYW5kIHRoZSB0ZXN0IHJlc3VsdCB3b24ndCBiZSByZWxpYWJsZQorICAgICAqLworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgcGFyYWxsZWxQcm9kdWNlcnNBbmRDb25zdW1lcnNUZXN0aW5nQWdncmVnYXRlZFNsaWRpbmdXaW5kb3dzKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uIHsKKworICAgICAgICBleGVjdXRlSW5QYXJhbGxlbChjb25zdW1lckV4ZWN1dG9yU2VydmljZSwgQ09OU1VNRVJfQ09VTlQsIG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIExPR0dFUi5pbmZvKCJDb25zdW1lciBzdGFydGluZy4iKTsKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCFkb1NodXRkb3duICYmICFUaHJlYWQuY3VycmVudFRocmVhZCgpLmlzSW50ZXJydXB0ZWQoKSkgeworCisgICAgICAgICAgICAgICAgICAgICAgICBhZ2dyZWdhdGVkVGltZVJlc2Vydm9pcnMuZ2V0KFRocmVhZExvY2FsUmFuZG9tLmN1cnJlbnQoKS5uZXh0SW50KGFnZ3JlZ2F0ZWRUaW1lUmVzZXJ2b2lycy5zaXplKCkpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFNuYXBzaG90KFN5c3RlbS5uYW5vVGltZSgpLCBUaW1lVW5pdC5OQU5PU0VDT05EUyk7CisgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWQuc2xlZXAoMTAwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgVGhyZWFkLmN1cnJlbnRUaHJlYWQoKS5pbnRlcnJ1cHQoKTsKKyAgICAgICAgICAgICAgICB9IGZpbmFsbHkgeworICAgICAgICAgICAgICAgICAgICBMT0dHRVIuaW5mbygiQ29uc3VtZXIgdGVybWluYXRpbmcuIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICBleGVjdXRlSW5QYXJhbGxlbChwcm9kdWNlckV4ZWN1dG9yU2VydmljZSwgUFJPRFVDRVJfQ09VTlQsIG5ldyBSdW5uYWJsZSgpIHsKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgIExPR0dFUi5pbmZvKCJQcm9kdWNlciBzdGFydGluZy4iKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoIWRvU2h1dGRvd24pIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHZhbHVlID0gaW5jcmVtZW50ZXIuaW5jcmVtZW50QW5kR2V0KCk7CisgICAgICAgICAgICAgICAgICAgIHRpbWUxMHVzUmVzZXJ2b2lyLnVwZGF0ZSgobG9uZykgdmFsdWUsIFN5c3RlbS5uYW5vVGltZSgpLCBUaW1lVW5pdC5OQU5PU0VDT05EUyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIExPR0dFUi5pbmZvKCJQcm9kdWNlciB0ZXJtaW5hdGluZy4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSk7CisKKyAgICAgICAgVGhyZWFkLnNsZWVwKFRFU1RfRFVSQVRJT05fTUlMTElTKTsKKyAgICAgICAgTE9HR0VSLmluZm8oIlNodXR0aW5nIGRvd24uLi4iKTsKKworICAgICAgICBkb1NodXRkb3duID0gdHJ1ZTsKKyAgICAgICAgcHJvZHVjZXJFeGVjdXRvclNlcnZpY2Uuc2h1dGRvd24oKTsKKyAgICAgICAgY29uc3VtZXJFeGVjdXRvclNlcnZpY2Uuc2h1dGRvd24oKTsKKyAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUoIkNvbnN1bWVyIHRhc2tzIGRpZG4ndCB0ZXJtaW5hdGVkIHBlYWNlZnVsbHksIGFib3J0aW5nIHRoaXMgdGVzdC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lckV4ZWN1dG9yU2VydmljZS5hd2FpdFRlcm1pbmF0aW9uKFNIVVRET1dOX1RJTUVPVVRfU0VDT05EUywgVGltZVVuaXQuU0VDT05EUykpOworICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgiUHJvZHVjZXIgdGFza3MgZGlkbid0IHRlcm1pbmF0ZWQgcGVhY2VmdWxseSwgYWJvcnRpbmcgdGhpcyB0ZXN0LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y2VyRXhlY3V0b3JTZXJ2aWNlLmF3YWl0VGVybWluYXRpb24oU0hVVERPV05fVElNRU9VVF9TRUNPTkRTLCBUaW1lVW5pdC5TRUNPTkRTKSk7CisKKyAgICAgICAgZmluYWwgbG9uZyBzbmFwc2hvdFRpbWUgPSBTeXN0ZW0ubmFub1RpbWUoKTsKKyAgICAgICAgZmluYWwgbG9uZyBzdW0gPSAobG9uZykgaW5jcmVtZW50ZXIuZ2V0KCkgKiAoaW5jcmVtZW50ZXIuZ2V0KCkgKyAxKSAvIDI7CisKKyAgICAgICAgTE9HR0VSLmluZm8oIkludGVnZXIgcmVhY2hlZDogIiArIGluY3JlbWVudGVyLmdldCgpKTsKKworICAgICAgICBjaGVja0luTmFub3ModGltZTFEYXlBZ2dyZWdhdGVkUmVzZXJ2b2lyLCBzbmFwc2hvdFRpbWUsIGluY3JlbWVudGVyLmdldCgpLCAxLCBpbmNyZW1lbnRlci5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgIChkb3VibGUpIHN1bSAvIGluY3JlbWVudGVyLmdldCgpLCBzbmFwc2hvdFRpbWUgLSBzdGFydFRpbWUoKSk7CisgICAgICAgIGNoZWNrSW5OYW5vcyh0aW1lMTBEYXlzQWdncmVnYXRlZFJlc2Vydm9pciwgc25hcHNob3RUaW1lLCBpbmNyZW1lbnRlci5nZXQoKSwgMSwgaW5jcmVtZW50ZXIuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKSBzdW0gLyBpbmNyZW1lbnRlci5nZXQoKSwgc25hcHNob3RUaW1lIC0gc3RhcnRUaW1lKCkpOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBleGVjdXRlSW5QYXJhbGxlbChmaW5hbCBFeGVjdXRvciBjb25zdW1lckV4ZWN1dG9yU2VydmljZSwgZmluYWwgaW50IGNvdW50LCBmaW5hbCBSdW5uYWJsZSBydW5uYWJsZSkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIGNvbnN1bWVyRXhlY3V0b3JTZXJ2aWNlLmV4ZWN1dGUocnVubmFibGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogU2h1dGRvd24gdGhlIHByb2R1Y2VyIGV4ZWN1dG9yIHNlcnZpY2UuCisgICAgICovCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgc2h1dGRvd25Qcm9kdWNlcnMoKSB7CisgICAgICAgIHByb2R1Y2VyRXhlY3V0b3JTZXJ2aWNlLnNodXRkb3duTm93KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2h1dGRvd24gdGhlIGNvbnN1bWVyIGV4ZWN1dG9yIHNlcnZpY2UuCisgICAgICovCisgICAgQEFmdGVyCisgICAgcHVibGljIHZvaWQgc2h1dGRvd25Db25zdW1lcnMoKSB7CisgICAgICAgIGNvbnN1bWVyRXhlY3V0b3JTZXJ2aWNlLnNodXRkb3duTm93KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHNuYXBzaG90IG9mIGdpdmVuIHJlc2Vydm9pciBleGhpYml0cyB3aXRoIGV4cGVjdGVkIG1lYXN1cmVtZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZXNlcnZvaXIgICAgICAgIFRoZSByZXNlcnZvaXIgdG8gYXNzZXJ0LgorICAgICAqIEBwYXJhbSBzbmFwc2hvdFRpbWUgICAgIFRoZSB0aW1lIGZvciB3aGljaCB0byBnZXQgdGhlIHNuYXBzaG90CisgICAgICogQHBhcmFtIGV4cGVjdGVkU2l6ZSAgICAgRXhwZWN0ZWQgc2l6ZSBvZiB0aGUgc25hcHNob3QKKyAgICAgKiBAcGFyYW0gZXhwZWN0ZWRNaW4gICAgICBFeHBlY3RlZCBtaW5pbXVtCisgICAgICogQHBhcmFtIGV4cGVjdGVkTWF4ICAgICAgRXhwZWN0ZWQgbWF4aW11bQorICAgICAqIEBwYXJhbSBleHBlY3RlZE1lYW4gICAgIEV4cGVjdGVkIG1lYW4KKyAgICAgKiBAcGFyYW0gZXhwZWN0ZWRJbnRlcnZhbCBFeHBlY3RlZCBpbnRlcnZhbAorICAgICAqLworICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tJbk5hbm9zKGZpbmFsIFRpbWVSZXNlcnZvaXIgcmVzZXJ2b2lyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgc25hcHNob3RUaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgZXhwZWN0ZWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgZXhwZWN0ZWRNaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBleHBlY3RlZE1heCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBkb3VibGUgZXhwZWN0ZWRNZWFuLCBmaW5hbCBsb25nIGV4cGVjdGVkSW50ZXJ2YWwpIHsKKyAgICAgICAgZmluYWwgVW5pZm9ybVRpbWVTbmFwc2hvdCBzbmFwc2hvdCA9IHJlc2Vydm9pci5nZXRTbmFwc2hvdChzbmFwc2hvdFRpbWUsIFRpbWVVbml0Lk5BTk9TRUNPTkRTKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoIlRvdGFsIGNvdW50IGRvZXMgbm90IG1hdGNoISIsIGV4cGVjdGVkU2l6ZSwgc25hcHNob3Quc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJNaW4gZXhlYyB0aW1lIGRvZXMgbm90IG1hdGNoISIsIGV4cGVjdGVkTWluLCBzbmFwc2hvdC5nZXRNaW4oKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiTWF4IGV4ZWMgdGltZSBkb2VzIG5vdCBtYXRjaCEiLCBleHBlY3RlZE1heCwgc25hcHNob3QuZ2V0TWF4KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkF2ZXJhZ2UgZXhlYyB0aW1lIGRvZXMgbm90IG1hdGNoISIsIGV4cGVjdGVkTWVhbiwgc25hcHNob3QuZ2V0TWVhbigpLCBERUxUQSk7CisgICAgICAgIGFzc2VydEVxdWFscygiRXhwZWN0ZWQgaW50ZXJ2YWwgZG9lcyBub3QgbWF0Y2ghIiwgZXhwZWN0ZWRJbnRlcnZhbCwgc25hcHNob3QuZ2V0VGltZUludGVydmFsKFRpbWVVbml0Lk5BTk9TRUNPTkRTKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvUkVBRE1FIGIvdG9vbHMvUkVBRE1FCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0N2I3MjUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9SRUFETUUKQEAgLTAsMCArMSwxOSBAQAorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKK1RoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIEplcnNleSAmIEpBWC1SUyB0b29scyAtIGFudCB0YXNrcywgbWF2ZW4gcGx1Z2lucywgc2hlbGwgc2NyaXB0cyBldGMuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvamVyc2V5LWRvYy1tb2R1bGVsaXN0LW1hdmVuLXBsdWdpbi9wb20ueG1sIGIvdG9vbHMvamVyc2V5LWRvYy1tb2R1bGVsaXN0LW1hdmVuLXBsdWdpbi9wb20ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhNzA1MjAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9qZXJzZXktZG9jLW1vZHVsZWxpc3QtbWF2ZW4tcGx1Z2luL3BvbS54bWwKQEAgLTAsMCArMSw4NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0KKworICAgIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorCisgICAgVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgICAgdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC0yLjAuCisKKyAgICBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgICAgTGljZW5zZXMgd2hlbiB0aGUgY29uZGl0aW9ucyBmb3Igc3VjaCBhdmFpbGFiaWxpdHkgc2V0IGZvcnRoIGluIHRoZQorICAgIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICAgIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgICAgaHR0cHM6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9jbGFzc3BhdGgvbGljZW5zZS5odG1sLgorCisgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisKKy0tPgorCis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+CisgICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgICAgPGdyb3VwSWQ+b3JnLmdsYXNzZmlzaC5qZXJzZXkudG9vbHMucGx1Z2luczwvZ3JvdXBJZD4KKyAgICA8YXJ0aWZhY3RJZD5qZXJzZXktZG9jLW1vZHVsZWxpc3QtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgIDxwYWNrYWdpbmc+bWF2ZW4tcGx1Z2luPC9wYWNrYWdpbmc+CisgICAgPHZlcnNpb24+MS4wLjE8L3ZlcnNpb24+CisgICAgPG5hbWU+amVyc2V5LWRvYy1tb2R1bGVsaXN0LW1hdmVuLXBsdWdpbjwvbmFtZT4KKworICAgIDxkZXNjcmlwdGlvbj4KKyAgICAgICAgV2Fsa3MgdGhyb3VnaCB0aGUgZGVwZW5kZW5jeSB0cmVlIGFuZCBjcmVhdGVzIHRoZSBjYXRlZ29yaXplZCBsaXN0IG9mIG1hdmVuIG1vZHVsZXMgaW4gdGhlCisgICAgICAgIGRvY2Jvb2sgZm9ybWF0LgorICAgIDwvZGVzY3JpcHRpb24+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHttYXZlbi52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1jb3JlPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgPHZlcnNpb24+JHttYXZlbi52ZXJzaW9ufTwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hcnRpZmFjdDwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPiR7bWF2ZW4udmVyc2lvbn08L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnNoYXJlZDwvZ3JvdXBJZD4KKyAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlcGVuZGVuY3ktdHJlZTwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgIDx2ZXJzaW9uPjIuMDwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgorICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4zLjE8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxzb3VyY2U+JHtqYXZhLnZlcnNpb259PC9zb3VyY2U+CisgICAgICAgICAgICAgICAgICAgIDx0YXJnZXQ+JHtqYXZhLnZlcnNpb259PC90YXJnZXQ+CisgICAgICAgICAgICAgICAgICAgIDxjb21waWxlckFyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwhLS08V2Vycm9yIC8+LS0+CisgICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFRPRE8gd29yayB0b3dhcmRzIGVsaW1pbmF0aW5nIGFsbCB3YXJuaW5ncyBpbiBvcmRlciB0byBiZSBhYmxlIHRvIGVuYWJsZSB0aGUgLVhsaW50IG9wdGlvbiAtLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1YbGludC8tLT4KKyAgICAgICAgICAgICAgICAgICAgPC9jb21waWxlckFyZ3VtZW50cz4KKyAgICAgICAgICAgICAgICAgICAgPHNob3dXYXJuaW5ncz5mYWxzZTwvc2hvd1dhcm5pbmdzPgorICAgICAgICAgICAgICAgICAgICA8Zm9yaz5mYWxzZTwvZm9yaz4KKyAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+CisKKyAgICA8cHJvcGVydGllcz4KKyAgICAgICAgPGphdmEudmVyc2lvbj4xLjg8L2phdmEudmVyc2lvbj4KKyAgICAgICAgPG1hdmVuLnZlcnNpb24+My4xLjE8L21hdmVuLnZlcnNpb24+CisgICAgPC9wcm9wZXJ0aWVzPgorPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvdG9vbHMvamVyc2V5LWRvYy1tb2R1bGVsaXN0LW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rvb2xzL3BsdWdpbnMvQ29uZmlndXJhdGlvbi5qYXZhIGIvdG9vbHMvamVyc2V5LWRvYy1tb2R1bGVsaXN0LW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rvb2xzL3BsdWdpbnMvQ29uZmlndXJhdGlvbi5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZWYxNjIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9qZXJzZXktZG9jLW1vZHVsZWxpc3QtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdG9vbHMvcGx1Z2lucy9Db25maWd1cmF0aW9uLmphdmEKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50b29scy5wbHVnaW5zOworCisvKioKKyAqIENvbnRhaW5lciBjbGFzcyBmb3IgcGx1Z2luIGNvbmZpZ3VyYXRpb24uCisgKiBIb2xkcyB0aGUgY29udGVudCBvZiB0aGUgbG9hZGVkIHRlbXBsYXRlIGZpbGVzLgorICoKKyAqIEBhdXRob3IgQWRhbSBMaW5kZW50aGFsIChhZGFtLmxpbmRlbnRoYWwgYXQgb3JhY2xlLmNvbSkKKyAqLworY2xhc3MgQ29uZmlndXJhdGlvbiB7CisgICAgcHJpdmF0ZSBTdHJpbmcgc2VjdGlvblRlbXBsYXRlOworICAgIHByaXZhdGUgU3RyaW5nIHRhYmxlSGVhZGVyOworICAgIHByaXZhdGUgU3RyaW5nIHRhYmxlUm93OworICAgIHByaXZhdGUgU3RyaW5nIHRhYmxlRm9vdGVyOworCisgICAgcHVibGljIFN0cmluZyBnZXRUYWJsZUZvb3RlcigpIHsKKyAgICAgICAgcmV0dXJuIHRhYmxlRm9vdGVyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRhYmxlRm9vdGVyKFN0cmluZyB0YWJsZUZvb3RlcikgeworICAgICAgICB0aGlzLnRhYmxlRm9vdGVyID0gdGFibGVGb290ZXI7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUYWJsZVJvdygpIHsKKyAgICAgICAgcmV0dXJuIHRhYmxlUm93OworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRhYmxlUm93KFN0cmluZyB0YWJsZVJvdykgeworICAgICAgICB0aGlzLnRhYmxlUm93ID0gdGFibGVSb3c7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRUYWJsZUhlYWRlcigpIHsKKyAgICAgICAgcmV0dXJuIHRhYmxlSGVhZGVyOworICAgIH0KKworICAgIHB1YmxpYyB2b2lkIHNldFRhYmxlSGVhZGVyKFN0cmluZyB0YWJsZUhlYWRlcikgeworICAgICAgICB0aGlzLnRhYmxlSGVhZGVyID0gdGFibGVIZWFkZXI7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRTZWN0aW9uVGVtcGxhdGUoKSB7CisgICAgICAgIHJldHVybiBzZWN0aW9uVGVtcGxhdGU7CisgICAgfQorCisgICAgcHVibGljIHZvaWQgc2V0U2VjdGlvblRlbXBsYXRlKFN0cmluZyBzZWN0aW9uVGVtcGxhdGUpIHsKKyAgICAgICAgdGhpcy5zZWN0aW9uVGVtcGxhdGUgPSBzZWN0aW9uVGVtcGxhdGU7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90b29scy9qZXJzZXktZG9jLW1vZHVsZWxpc3QtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdG9vbHMvcGx1Z2lucy9HZW5lcmF0ZUplcnNleU1vZHVsZUxpc3RNb2pvLmphdmEgYi90b29scy9qZXJzZXktZG9jLW1vZHVsZWxpc3QtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdG9vbHMvcGx1Z2lucy9HZW5lcmF0ZUplcnNleU1vZHVsZUxpc3RNb2pvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGExZGUyYwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2plcnNleS1kb2MtbW9kdWxlbGlzdC1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90b29scy9wbHVnaW5zL0dlbmVyYXRlSmVyc2V5TW9kdWxlTGlzdE1vam8uamF2YQpAQCAtMCwwICsxLDMyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50b29scy5wbHVnaW5zOworCitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5leGVjdXRpb24uTWF2ZW5TZXNzaW9uOworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uZXhlY3V0aW9uLlByb2plY3REZXBlbmRlbmN5R3JhcGg7CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uQWJzdHJhY3RNb2pvOworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4ubG9nZ2luZy5Mb2c7CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKKworaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7CitpbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5GaWxlUmVhZGVyOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CitpbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7CitpbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLk1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKioKKyAqIFRoZSBwbHVnaW5zIG1haW4gTU9KTyBjbGFzcy4KKyAqIFdhbGtzIHRocm91Z2ggdGhlIG1hdmVuIGRlcGVuZGVuY3kgdHJlZSBhbmQgY3JlYXRlcyB0aGUgZG9jYm9vayBvdXRwdXQgZmlsZS4KKyAqCisgKiBAZ29hbCBnZW5lcmF0ZQorICogQHBoYXNlIHByb2Nlc3Mtc291cmNlcworICogQGFnZ3JlZ2F0b3IKKyAqLworcHVibGljIGNsYXNzIEdlbmVyYXRlSmVyc2V5TW9kdWxlTGlzdE1vam8gZXh0ZW5kcyBBYnN0cmFjdE1vam8geworCisgICAgLyoqCisgICAgICogUGxhY2Vob2xkZXIgaW4gYSB0YWJsZSByb3cgdGVtcGxhdGUsIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIG1vZHVsZSBuYW1lCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfTkFNRV9QTEFDRUhPTERFUiA9ICIlTkFNRSI7CisKKyAgICAvKioKKyAgICAgKiBQbGFjZWhvbGRlciBpbiBhIHRhYmxlIHJvdyB0ZW1wbGF0ZSwgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgbW9kdWxlIGRlc2NyaXB0aW9uCisgICAgICovCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfREVTQ1JJUFRJT05fUExBQ0VIT0xERVIgPSAiJURFU0NSSVBUSU9OIjsKKworICAgIC8qKgorICAgICAqIFBsYWNlaG9sZGVyIGluIGEgaGVhZGVyIHRlbXBsYXRlLCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBjYXRlZ29yeSBuYW1lLgorICAgICAqLworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FURUdPUllfQ0FQVElPTl9QTEFDRUhPTERFUiA9ICIlQ0FQVElPTiI7CisKKyAgICAvKioKKyAgICAgKiBQbGFjZWhvbGRlciBpbiBhIGhlYWRlciB0ZW1wbGF0ZSwgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgZ3JvdXBJZCB0byBjcmVhdGUgYSB1bmlxdWUgZWxlbWVudCBpZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JZX0dST1VQX0lEX1BMQUNFSE9MREVSID0gIiVHUk9VUF9JRCI7CisKKyAgICAvKioKKyAgICAgKiBQbGFjZWhvbGRlciBpbiBhIHRlbXBsYXRlIGZpbGUsIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIGdlbmVyYXRlZCB0YWJsZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRFTlRfUExBQ0VIT0xERVIgPSAiJUNPTlRFTlQiOworCisgICAgLyoqCisgICAgICogUGxhY2Vob2xkZXIgaW4gYSB0YWJsZSByb3cgdGVtcGxhdGUsIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIHJlbGF0aXZlIHBhdGggdG8gdGhlIGxpbmsgb2YgcHJvamVjdC1pbmZvIG9uIGphdmEubmV0CisgICAgICovCisgICAgc3RhdGljIGZpbmFsIFN0cmluZyBNT0RVTEVfTElOS19QQVRIX1BMQUNFSE9MREVSID0gIiVMSU5LX1BBVEgiOworCisgICAgLyoqCisgICAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSIke3Byb2plY3R9CisgICAgICogQHJlcXVpcmVkCisgICAgICogQHJlYWRvbmx5CisgICAgICovCisgICAgcHJpdmF0ZSBNYXZlblByb2plY3QgbWF2ZW5Qcm9qZWN0OworCisgICAgLyoqCisgICAgICogQGNvbXBvbmVudAorICAgICAqIEByZXF1aXJlZAorICAgICAqIEByZWFkb25seQorICAgICAqLworICAgIHByaXZhdGUgTWF2ZW5TZXNzaW9uIG1hdmVuU2Vzc2lvbjsKKworICAgIC8qKgorICAgICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZT0ibW9kdWxlcy54bWwiCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgb3V0cHV0RmlsZU5hbWU7CisKKyAgICAvKioKKyAgICAgKiBOYW1lIG9mIGEgInRlbXBsYXRlIiBmaWxlLgorICAgICAqIFRoZSBmaWxlIHNob3VsZCBjb250YWluIGFsbCB0aGUgc3RhdGljIGNvbnRlbnQgZnJvbSB0aGUgZG9jYm9vayBzZWN0aW9uIHJlbGF0ZWQgdG8gbW9kdWxlcy4KKyAgICAgKiBUaGUgZmlsZSBzaG91bGQgY29udGFpbiBhIHBsYWNlaG9sZGVyIHtAc2VlIENPTlRFTlRfUExBQ0VIT0xERVJ9LCB3aGljaCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBnZW5lcmF0ZWQgdGFibGUuCisgICAgICoKKyAgICAgKiBAcGFyYW1ldGVyCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdGVtcGxhdGVGaWxlTmFtZTsKKworICAgIC8qKgorICAgICAqIFRlbXBsYXRlIGZvciBhIGhlYWRlciBwYXJ0IG9mIGVhY2ggY2F0ZWdvcnkuCisgICAgICogV3JpdHRlbiB0byB0aGUgb3V0cHV0IG9uY2UgcGVyIGNhdGVnb3J5LgorICAgICAqIFN1cHBvcnRlZCBwbGFjZWhvbGRlcnMgYXJlIHtAc2VlIENBVEVHT1JZX0NBUFRJT05fUExBQ0VIT0xERVJ9IGFuZCB7QHNlZSBDQVRFR09SWV9HUk9VUF9JRF9QTEFDRUhPTERFUn0uCisgICAgICoKKyAgICAgKiBAcGFyYW1ldGVyCisgICAgICovCisgICAgcHJpdmF0ZSBTdHJpbmcgdGFibGVIZWFkZXJGaWxlTmFtZTsKKworICAgIC8qKgorICAgICAqIFRlbXBsYXRlIGZvciBhIGZvb3RlciBwYXJ0IG9mIGVhY2ggY2F0ZWdvcnkuCisgICAgICogV3JpdHRlbiB0byB0aGUgb3V0cHV0IG9uY2UgcGVyIGNhdGVnb3J5LiBObyBwbGFjZWhvbGRlcnMgc3VwcG9ydGVkLgorICAgICAqCisgICAgICogQHBhcmFtZXRlcgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHRhYmxlRm9vdGVyRmlsZU5hbWU7CisKKyAgICAvKioKKyAgICAgKiBUZW1wbGF0ZSBmb3IgYSB0YWJsZSByb3cgaW4gdGhlIG1vZHVsZSBsaXN0aW5nLgorICAgICAqIFdyaXR0ZW4gdG8gdGhlIG91dHB1dCBvbmNlIHBlciBtb2R1bGUuCisgICAgICogU3VwcG9ydGVkIHBsYWNlaG9sZGVycyBhcmUge0BzZWUgTU9EVUxFX05BTUVfUExBQ0VIT0xERVJ9IGFuZCB7QHNlZSBNT0RVTEVfREVTQ1JJUFRJT05fUExBQ0VIT0xERVJ9LgorICAgICAqCisgICAgICogQHBhcmFtZXRlcgorICAgICAqLworICAgIHByaXZhdGUgU3RyaW5nIHRhYmxlUm93RmlsZU5hbWU7CisKKyAgICAvKioKKyAgICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9ImZhbHNlIgorICAgICAqLworICAgIHByaXZhdGUgYm9vbGVhbiBvdXRwdXRVbm1hdGNoZWQ7CisKKyAgICBwcml2YXRlIENvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbjsKKworICAgIHByaXZhdGUgTG9nIGxvZzsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiB7CisKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNvbmZpZ3VyYXRpb24gPSBwcmVwYXJlUGFyYW1ldGVycygpOworICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiUGx1Z2luIGluaXRpYWxpemF0aW9uIGZhaWxlZC4gUHJvYmxlbSByZWFkaW5nIGlucHV0IGZpbGVzLiIsIGUpOworICAgICAgICB9CisKKyAgICAgICAgUHJvamVjdERlcGVuZGVuY3lHcmFwaCBncmFwaCA9IG1hdmVuU2Vzc2lvbi5nZXRQcm9qZWN0RGVwZW5kZW5jeUdyYXBoKCk7CisgICAgICAgIExpc3Q8TWF2ZW5Qcm9qZWN0PiBwcm9qZWN0cyA9IGdyYXBoLmdldERvd25zdHJlYW1Qcm9qZWN0cyhtYXZlblByb2plY3QsIHRydWUpOworCisKKyAgICAgICAgLy8gY2F0ZWdvcml6ZSBtb2R1bGVzIGJhc2VkIG9uIHByZWRlZmluZWQgY2F0ZWdvcmllcworICAgICAgICBNYXA8U3RyaW5nLCBMaXN0PE1hdmVuUHJvamVjdD4+IGNhdGVnb3JpemVkUHJvamVjdHMgPSBjYXRlZ29yaXplTW9kdWxlcyhwcm9qZWN0cyk7CisKKyAgICAgICAgLy8gbGlzdCBvZiBhbHJlYWR5ICJ1c2VkIiBjYXRlZ29yaWVzIChtYWludGFpbmVkIGluIG9yZGVyIHRvIGlkZW50aWZpZWQgdW5tYXRjaGVkIG1vZHVsZXMgbGF0ZXIpCisgICAgICAgIFNldDxTdHJpbmc+IGFsbEdyb3VwcyA9IG5ldyBIYXNoU2V0PD4oKTsKKworICAgICAgICAvLyBUaGUgZW50aXJlIG1vZHVsZSBsaXN0IHRhYmxlIGNvbnRlbnQgLSB3aWxsIHJlcGxhY2UgdGhlIHBsYWNlaG9sZGVyIGluIHRoZSB0ZW1wbGF0ZQorICAgICAgICBTdHJpbmdCdWlsZGVyIGNvbnRlbnQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOworCisgICAgICAgIC8vIGl0ZXJhdGUgb3ZlciBrbm93biBjYXRlZ29yaWVzCisgICAgICAgIGZvciAoUHJlZGVmaW5lZENhdGVnb3JpZXMgY2F0ZWdvcnkgOiBQcmVkZWZpbmVkQ2F0ZWdvcmllcy52YWx1ZXMoKSkgeworICAgICAgICAgICAgU3RyaW5nIGdyb3VwSWQgPSBjYXRlZ29yeS5nZXRHcm91cElkKCk7CisKKyAgICAgICAgICAgIGFsbEdyb3Vwcy5hZGQoZ3JvdXBJZCk7CisgICAgICAgICAgICAvLyBpZ25vcmUgdGVzdHMsIGJ1dCBzdGlsbCBrZWVwIHRoZW0gYW1vbmcgdGhlIHVzZWQgY2F0ZWdvcmllcyAoc28gdGhhdCB0aGV5IGRvIG5vdCBhcHBlYXIgaW4gdGhlIHVubWF0Y2hlZCBsaXN0KQorICAgICAgICAgICAgaWYgKGdyb3VwSWQuY29udGFpbnMoInRlc3RzIikpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExpc3Q8TWF2ZW5Qcm9qZWN0PiBwcm9qZWN0c0luQ2F0ZWdvcnkgPSBuZXcgTGlua2VkTGlzdDw+KCk7CisgICAgICAgICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxTdHJpbmcsIExpc3Q8TWF2ZW5Qcm9qZWN0Pj4gZW50cnkgOiBjYXRlZ29yaXplZFByb2plY3RzLmVudHJ5U2V0KCkpIHsKKyAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcga2V5ID0gZW50cnkuZ2V0S2V5KCk7CisKKyAgICAgICAgICAgICAgICBpZiAoa2V5LnN0YXJ0c1dpdGgoZ3JvdXBJZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYWxsR3JvdXBzLmFkZChrZXkpOworICAgICAgICAgICAgICAgICAgICBwcm9qZWN0c0luQ2F0ZWdvcnkuYWRkQWxsKGVudHJ5LmdldFZhbHVlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29udGVudC5hcHBlbmQocHJvY2Vzc0NhdGVnb3J5KGNhdGVnb3J5LCBwcm9qZWN0c0luQ2F0ZWdvcnkpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGdldCB0aGUgbGlzdCBvZiB1bm1hdGNoZWQgbW9kdWxlcworICAgICAgICBMaXN0PE1hdmVuUHJvamVjdD4gdW5tYXRjaGVkID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgICAgICBmb3IgKFN0cmluZyBncm91cElkIDogY2F0ZWdvcml6ZWRQcm9qZWN0cy5rZXlTZXQoKSkgeworICAgICAgICAgICAgaWYgKCFhbGxHcm91cHMuY29udGFpbnMoZ3JvdXBJZCkpIHsKKyAgICAgICAgICAgICAgICB1bm1hdGNoZWQuYWRkQWxsKGNhdGVnb3JpemVkUHJvamVjdHMuZ2V0KGdyb3VwSWQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICh1bm1hdGNoZWQuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgbG9nLndhcm4oIlRoZXJlIGFyZSB1bm1hdGNoZWQgbW9kdWxlcyAoIiArIHVubWF0Y2hlZC5zaXplKCkgKyAiKS4iKTsKKyAgICAgICAgICAgIGlmICghb3V0cHV0VW5tYXRjaGVkKSB7CisgICAgICAgICAgICAgICAgbG9nLndhcm4oIllvdSBjYW4gY29uZmlndXJlIHRoZSBwbHVnaW4gdG8gb3V0cHV0IHVubWF0Y2hlZCBtb2R1bGVzIGJ5IGFkZGluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICArICI8b3V0cHV0VW5tYXRjaGVkPnRydWU8L291dHB1dFVubWF0Y2hlZD4gaW4gdGhlIGNvbmZpZ3VyYXRpb24uIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAob3V0cHV0VW5tYXRjaGVkKSB7CisgICAgICAgICAgICBjb250ZW50LmFwcGVuZChwcm9jZXNzVW5tYXRjaGVkKHVubWF0Y2hlZCkpOworICAgICAgICB9CisKKworICAgICAgICBQcmludFdyaXRlciB3cml0ZXIgPSBudWxsOworICAgICAgICB0cnkgeworICAgICAgICAgICAgd3JpdGVyID0gbmV3IFByaW50V3JpdGVyKG91dHB1dEZpbGVOYW1lKTsKKyAgICAgICAgICAgIHdyaXRlci5wcmludGxuKGNvbmZpZ3VyYXRpb24uZ2V0U2VjdGlvblRlbXBsYXRlKCkucmVwbGFjZShDT05URU5UX1BMQUNFSE9MREVSLCBjb250ZW50LnRvU3RyaW5nKCkpKTsKKyAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJGaWxlIG5vdCBmb3VuZCBleGNlcHRpb24iKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIGlmICh3cml0ZXIgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHdyaXRlci5jbG9zZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGxvZy5pbmZvKCJPdXRwdXQgd3JpdHRlbiB0bzogIiArIG91dHB1dEZpbGVOYW1lKTsKKyAgICB9CisKKyAgICBwcml2YXRlIE1hcDxTdHJpbmcsIExpc3Q8TWF2ZW5Qcm9qZWN0Pj4gY2F0ZWdvcml6ZU1vZHVsZXMoTGlzdDxNYXZlblByb2plY3Q+IHByb2plY3RzKSB7CisgICAgICAgIE1hcDxTdHJpbmcsIExpc3Q8TWF2ZW5Qcm9qZWN0Pj4gY2F0ZWdvcml6ZWRQcm9qZWN0cyA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgZm9yIChNYXZlblByb2plY3QgcHJvamVjdCA6IHByb2plY3RzKSB7CisgICAgICAgICAgICBTdHJpbmcgZ3JvdXBJZCA9IHByb2plY3QuZ2V0R3JvdXBJZCgpOworICAgICAgICAgICAgaWYgKGNhdGVnb3JpemVkUHJvamVjdHMuY29udGFpbnNLZXkoZ3JvdXBJZCkpIHsKKyAgICAgICAgICAgICAgICBjYXRlZ29yaXplZFByb2plY3RzLmdldChncm91cElkKS5hZGQocHJvamVjdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIExpc3Q8TWF2ZW5Qcm9qZWN0PiBhY3R1YWxMaXN0ID0gbmV3IExpbmtlZExpc3Q8PigpOworICAgICAgICAgICAgICAgIGFjdHVhbExpc3QuYWRkKHByb2plY3QpOworICAgICAgICAgICAgICAgIGNhdGVnb3JpemVkUHJvamVjdHMucHV0KGdyb3VwSWQsIGFjdHVhbExpc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBjYXRlZ29yaXplZFByb2plY3RzOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nQnVpbGRlciBwcm9jZXNzVW5tYXRjaGVkKExpc3Q8TWF2ZW5Qcm9qZWN0PiB1bm1hdGNoZWRNb2R1bGVzKSB7CisgICAgICAgIHJldHVybiBwcm9jZXNzTW9kdWxlTGlzdCgiT3RoZXIiLCAib3RoZXIiLCB1bm1hdGNoZWRNb2R1bGVzKTsKKyAgICB9CisKKyAgICBwcml2YXRlIFN0cmluZ0J1aWxkZXIgcHJvY2Vzc0NhdGVnb3J5KFByZWRlZmluZWRDYXRlZ29yaWVzIGNhdGVnb3J5LCBMaXN0PE1hdmVuUHJvamVjdD4gcHJvamVjdHNJbkNhdGVnb3J5KSB7CisgICAgICAgIHJldHVybiBwcm9jZXNzTW9kdWxlTGlzdChjYXRlZ29yeS5nZXRDYXB0aW9uKCksIGNhdGVnb3J5LmdldEdyb3VwSWQoKSwKKyAgICAgICAgICAgICAgICBwcm9qZWN0c0luQ2F0ZWdvcnkpOworICAgIH0KKworICAgIHByaXZhdGUgU3RyaW5nQnVpbGRlciBwcm9jZXNzTW9kdWxlTGlzdChTdHJpbmcgY2F0ZWdvcnlDYXB0aW9uLCBTdHJpbmcgY2F0ZWdvcnlJZCwgTGlzdDxNYXZlblByb2plY3Q+IHByb2plY3RzSW5DYXRlZ29yeSkgeworCisgICAgICAgIFN0cmluZ0J1aWxkZXIgY2F0ZWdvcnlDb250ZW50ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKKyAgICAgICAgLy8gT3V0cHV0IHRhYmxlIGhlYWRlciBmb3IgdGhlIGNhdGVnb3J5CisgICAgICAgIGNhdGVnb3J5Q29udGVudC5hcHBlbmQoY29uZmlndXJhdGlvbi5nZXRUYWJsZUhlYWRlcigpCisgICAgICAgICAgICAgICAgLnJlcGxhY2UoQ0FURUdPUllfQ0FQVElPTl9QTEFDRUhPTERFUiwgY2F0ZWdvcnlDYXB0aW9uKQorICAgICAgICAgICAgICAgIC5yZXBsYWNlKENBVEVHT1JZX0dST1VQX0lEX1BMQUNFSE9MREVSLCBjYXRlZ29yeUlkKSk7CisKKyAgICAgICAgLy8gU29ydCBwcm9qZWN0cyBpbiBlYWNoIGNhdGVnb3J5IGFscGhhYmV0aWNhbGx5CisgICAgICAgIENvbGxlY3Rpb25zLnNvcnQocHJvamVjdHNJbkNhdGVnb3J5LCBuZXcgQ29tcGFyYXRvcjxNYXZlblByb2plY3Q+KCkgeworICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoTWF2ZW5Qcm9qZWN0IG8xLCBNYXZlblByb2plY3QgbzIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbzEuZ2V0QXJ0aWZhY3RJZCgpLmNvbXBhcmVUbyhvMi5nZXRBcnRpZmFjdElkKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKworICAgICAgICAvLyBPdXRwdXQgcHJvamVjdHMgaW4gYSBjYXRlZ29yeQorICAgICAgICBmb3IgKE1hdmVuUHJvamVjdCBwcm9qZWN0IDogcHJvamVjdHNJbkNhdGVnb3J5KSB7CisgICAgICAgICAgICAvLyBza2lwIHRoZSAicGFyZW50IiB0eXBlIHByb2plY3RzCisgICAgICAgICAgICBpZiAocHJvamVjdC5nZXRBcnRpZmFjdElkKCkuZXF1YWxzKCJwcm9qZWN0IikpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworCisgICAgICAgICAgICBTdHJpbmcgbGlua1ByZWZpeCA9IGdldExpbmtQYXRoKHByb2plY3QpOworCisgICAgICAgICAgICBjYXRlZ29yeUNvbnRlbnQuYXBwZW5kKGNvbmZpZ3VyYXRpb24uZ2V0VGFibGVSb3coKQorICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShNT0RVTEVfTkFNRV9QTEFDRUhPTERFUiwgcHJvamVjdC5nZXRBcnRpZmFjdElkKCkpCisgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKE1PRFVMRV9ERVNDUklQVElPTl9QTEFDRUhPTERFUiwgcHJvamVjdC5nZXREZXNjcmlwdGlvbigpKQorICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShNT0RVTEVfTElOS19QQVRIX1BMQUNFSE9MREVSLCBsaW5rUHJlZml4ICsgcHJvamVjdC5nZXRBcnRpZmFjdElkKCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIGNhdGVnb3J5Q29udGVudC5hcHBlbmQoY29uZmlndXJhdGlvbi5nZXRUYWJsZUZvb3RlcigpKTsKKyAgICAgICAgcmV0dXJuIGNhdGVnb3J5Q29udGVudDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBCdWlsZCB0aGUgcHJvamVjdC1pbmZvIGxpbmsgcGF0aCBieSBpbmNsdWRpbmcgYWxsIHRoZSBhcnRpZmFjdElkIHVwIHRvIChleGNsdWRpbmcpIHRoZSByb290IHBhcmVudAorICAgICAqIEBwYXJhbSBwcm9qZWN0IHByb2plY3QgZm9yIHdoaWNoIHRoZSBwYXRoIHNob3VsZCBiZSBkZXRlcm1pbmVkLgorICAgICAqIEByZXR1cm4gcGF0aCBjb25zaXN0aW5nIG9mIGhpZXJhcmNoaWNhbGx5IG5lc3RlZCBtYXZlbiBhcnRpZmFjdCBJRHMuIFVzZWQgZm9yIHJlZmVyZW5jaW5nIHRvIHRoZSBwcm9qZWN0LWluZm8gb24gamF2YS5uZXQKKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBnZXRMaW5rUGF0aChNYXZlblByb2plY3QgcHJvamVjdCkgeworICAgICAgICBTdHJpbmcgcGF0aCA9ICIiOworICAgICAgICBNYXZlblByb2plY3QgcGFyZW50ID0gcHJvamVjdC5nZXRQYXJlbnQoKTsKKyAgICAgICAgd2hpbGUgKHBhcmVudCAhPSBudWxsCisgICAgICAgICAgICAgICAgJiYgIShwYXJlbnQuZ2V0QXJ0aWZhY3RJZCgpLmVxdWFscygicHJvamVjdCIpICYmIHBhcmVudC5nZXRHcm91cElkKCkuZXF1YWxzKCJvcmcuZ2xhc3NmaXNoLmplcnNleSIpKSkgeworICAgICAgICAgICAgcGF0aCA9IHBhcmVudC5nZXRBcnRpZmFjdElkKCkgKyAiLyIgKyBwYXRoOworICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LmdldFBhcmVudCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwYXRoOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldExvZyhvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5sb2dnaW5nLkxvZyBsb2cpIHsKKyAgICAgICAgdGhpcy5sb2cgPSBsb2c7CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyByZWFkRmlsZShTdHJpbmcgZmlsZU5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEJ1ZmZlcmVkUmVhZGVyIHJlYWRlciA9IG5ldyBCdWZmZXJlZFJlYWRlcihuZXcgRmlsZVJlYWRlcihmaWxlTmFtZSkpOworICAgICAgICBTdHJpbmcgczsKKyAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7CisgICAgICAgIHdoaWxlICgocyA9IHJlYWRlci5yZWFkTGluZSgpKSAhPSBudWxsKSB7CisgICAgICAgICAgICBzYi5hcHBlbmQocyk7IHNiLmFwcGVuZCgiXG4iKTsKKyAgICAgICAgfQorICAgICAgICByZWFkZXIuY2xvc2UoKTsKKyAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7CisgICAgfQorCisgICAgcHVibGljIENvbmZpZ3VyYXRpb24gcHJlcGFyZVBhcmFtZXRlcnMoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBDb25maWd1cmF0aW9uIGNvbmZpZ3VyYXRpb24gPSBuZXcgQ29uZmlndXJhdGlvbigpOworICAgICAgICBjb25maWd1cmF0aW9uLnNldFNlY3Rpb25UZW1wbGF0ZShyZWFkRmlsZSh0ZW1wbGF0ZUZpbGVOYW1lKSk7CisgICAgICAgIGNvbmZpZ3VyYXRpb24uc2V0VGFibGVIZWFkZXIocmVhZEZpbGUodGFibGVIZWFkZXJGaWxlTmFtZSkpOworICAgICAgICBjb25maWd1cmF0aW9uLnNldFRhYmxlUm93KHJlYWRGaWxlKHRhYmxlUm93RmlsZU5hbWUpKTsKKyAgICAgICAgY29uZmlndXJhdGlvbi5zZXRUYWJsZUZvb3RlcihyZWFkRmlsZSh0YWJsZUZvb3RlckZpbGVOYW1lKSk7CisgICAgICAgIHJldHVybiBjb25maWd1cmF0aW9uOworICAgIH0KKworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvamVyc2V5LWRvYy1tb2R1bGVsaXN0LW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rvb2xzL3BsdWdpbnMvSGVscE1vam8uamF2YSBiL3Rvb2xzL2plcnNleS1kb2MtbW9kdWxlbGlzdC1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90b29scy9wbHVnaW5zL0hlbHBNb2pvLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhjOGI1NgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2plcnNleS1kb2MtbW9kdWxlbGlzdC1tYXZlbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvZ2xhc3NmaXNoL2plcnNleS90b29scy9wbHVnaW5zL0hlbHBNb2pvLmphdmEKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoYykgMjAxMywgMjAxOCBPcmFjbGUgYW5kL29yIGl0cyBhZmZpbGlhdGVzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZQorICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKyAqCisgKiBUaGlzIFNvdXJjZSBDb2RlIG1heSBhbHNvIGJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBmb2xsb3dpbmcgU2Vjb25kYXJ5CisgKiBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgKiBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYuIDIuMCBhcmUgc2F0aXNmaWVkOiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwKKyAqIHZlcnNpb24gMiB3aXRoIHRoZSBHTlUgQ2xhc3NwYXRoIEV4Y2VwdGlvbiwgd2hpY2ggaXMgYXZhaWxhYmxlIGF0CisgKiBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisgKgorICogU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjAgT1IgR1BMLTIuMCBXSVRIIENsYXNzcGF0aC1leGNlcHRpb24tMi4wCisgKi8KKworcGFja2FnZSBvcmcuZ2xhc3NmaXNoLmplcnNleS50b29scy5wbHVnaW5zOworCitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uQWJzdHJhY3RNb2pvOworaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0ZhaWx1cmVFeGNlcHRpb247CitpbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4ubG9nZ2luZy5Mb2c7CisKKy8qKgorICogRGlzcGxheXMgdGhlIHBsdWdpbiBoZWxwIG1lc3NhZ2UuCisgKgorICogQGdvYWwgaGVscAorICogQHBoYXNlIHByb2Nlc3Mtc291cmNlcworICogQGFnZ3JlZ2F0b3IKKyAqLworcHVibGljIGNsYXNzIEhlbHBNb2pvIGV4dGVuZHMgQWJzdHJhY3RNb2pvIHsKKworICAgIHByaXZhdGUgTG9nIGxvZzsKKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiwgTW9qb0ZhaWx1cmVFeGNlcHRpb24geworICAgICAgICBsb2cuaW5mbygiamVyc2V5LWRvYy1tb2R1bGVsaXN0LW1hdmVuLXBsdWdpbiBoZWxwIik7CisgICAgICAgIGxvZy5pbmZvKCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iKTsKKyAgICAgICAgbG9nLmluZm8oIldhbGtzIHRocm91Z2ggdGhlIGRlcGVuZGVuY3kgdHJlZSBhbmQgY3JlYXRlcyBhIGxpc3Qgb2YgbWF2ZW4gbW9kdWxlcyBpbiB0aGUgZG9jYm9vayBmb3JtYXQuIik7CisgICAgICAgIGxvZy5pbmZvKCJUaGUgcGx1Z2luIGNvbnRhaW5zIGEgcHJlZGVmaW5lZCBsaXN0IG9mIGtub3duIGNhdGVnb3JpZXMgKGJhc2VkIG9uIGdyb3VwSWQpLCAiCisgICAgICAgICAgICAgICAgKyAiZWFjaCBvbmUgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIHNlcGFyYXRlIHRhYmxlIGluIHRoZSBkb2Nib29rIG91dHB1dC4iKTsKKyAgICAgICAgbG9nLmluZm8oIiIpOworICAgICAgICBsb2cuaW5mbygiUGx1Z2luIG5lZWRzIHNvbWUgZXh0ZXJuYWwgZmlsZXMgdG8gYmUgYWJsZSB0byBjb3JyZWN0bHkgZm9ybWF0IHRoZSBvdXRwdXQuIik7CisgICAgICAgIGxvZy5pbmZvKCIiKTsKKyAgICAgICAgbG9nLmluZm8oIkNvbmZpZ3VyYXRpb246ICIpOworICAgICAgICBsb2cuaW5mbygiICA8b3V0cHV0RmlsZU5hbWU+ICAgICAgICBzcGVjaWZpZXMgd2hlcmUgdGhlIGZpbmFsIG91dHB1dCAoZG9jYm9vayBzZWN0aW9uKSBzaG91bGQgYmUgd3JpdHRlbiIpOworICAgICAgICBsb2cuaW5mbygiICA8dGVtcGxhdGVGaWxlTmFtZT4gICAgICB0aGUgbWFpbiB0ZW1wbGF0ZSAtIGNvbnRhaW5zIHRoZSBlbnRpcmUgc2VjdGlvbiBhbmQgYSBwbGFjZWhvbGRlciAiCisgICAgICAgICAgICAgICAgKyBHZW5lcmF0ZUplcnNleU1vZHVsZUxpc3RNb2pvLkNPTlRFTlRfUExBQ0VIT0xERVIgKyAiIHRvIGJlIHJlcGxhY2VkIGJ5IHRoZSBnZW5lcmF0ZWQgdGFibGUiKTsKKyAgICAgICAgbG9nLmluZm8oIiAgPHRhYmxlSGVhZGVyRmlsZU5hbWU+ICAgdGhlIGhlYWRlciBvZiBhIGNhdGVnb3J5IHRhYmxlIC0gdXNlZCBvbmNlIHBlciBjYXRlZ29yeTsgY29udGFpbnMgdHdvIHBsYWNlaG9sZGVyczoiKTsKKyAgICAgICAgbG9nLmluZm8oIiAgICAgICAgICAgICAgIiArIEdlbmVyYXRlSmVyc2V5TW9kdWxlTGlzdE1vam8uQ0FURUdPUllfQ0FQVElPTl9QTEFDRUhPTERFUiArICIgLSB1c2VkIGZvciB0aGUgY2FwdGlvbiBvZiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiZWFjaCBjYXRlZ29yeSB0YWJsZSIpOworICAgICAgICBsb2cuaW5mbygiICAgICAgICAgICAgICAiICsgR2VuZXJhdGVKZXJzZXlNb2R1bGVMaXN0TW9qby5DQVRFR09SWV9HUk9VUF9JRF9QTEFDRUhPTERFUiArICIgLSB1c2VkIHRvIGNyZWF0ZSBhIHVuaXF1ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiaWQgb2YgYSB0YWJsZSIpOworICAgICAgICBsb2cuaW5mbygiICA8dGFibGVGb290ZXJGaWxlTmFtZT4gICB0aGUgZm9vdGVyIG9mIGEgY2F0ZWdvcnkgdGFibGUsIHVzZWQgb25jZSBwZXIgY2F0ZWdvcnkiKTsKKyAgICAgICAgbG9nLmluZm8oIiAgPHRhYmxlUm93RmlsZU5hbWU+ICAgICAgYSB0ZW1wbGF0ZSBmb3IgYSB0YWJsZSByb3csIHVzZWQgb25jZSBwZXIgbW9kdWxlLiBUaGUgdGVtcGxhdGUgc2hvdWxkIGNvbnRhaW4gdHdvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAicGxhY2Vob2xkZXJzOiIpOworICAgICAgICBsb2cuaW5mbygiICAgICAgICAgICAgICAiICsgR2VuZXJhdGVKZXJzZXlNb2R1bGVMaXN0TW9qby5NT0RVTEVfTkFNRV9QTEFDRUhPTERFUiArICIgLSByZXBsYWNlZCBieSB0aGUgbmFtZSBvZiB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJtb2R1bGUiKTsKKyAgICAgICAgbG9nLmluZm8oIiAgICAgICAgICAgICAgIiArIEdlbmVyYXRlSmVyc2V5TW9kdWxlTGlzdE1vam8uTU9EVUxFX0RFU0NSSVBUSU9OX1BMQUNFSE9MREVSICsgIiAtIHJlcGxhY2VkIGJ5IHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJkZXNjcmlwdGlvbiBvZiB0aGUgbW9kdWxlIGZyb20gdGhlIG1vZHVsZSdzIHBvbS54bWwgZmlsZSIpOworICAgICAgICBsb2cuaW5mbygiICAgICAgICAgICAgICAiICsgR2VuZXJhdGVKZXJzZXlNb2R1bGVMaXN0TW9qby5NT0RVTEVfTElOS19QQVRIX1BMQUNFSE9MREVSICsgIiAtIHJlcGxhY2VkIGJ5IHRoZSByZWxhdGl2ZSAiCisgICAgICAgICAgICAgICAgKyAicGF0aCBvZiB0aGUgcHJvamVjdC1kZXNjcmlwdGlvbiBwYWdlIG9uIGphdmEubmV0Iik7CisgICAgICAgIGxvZy5pbmZvKCIgIDxvdXRwdXRVbm1hdGNoZWQ+ICAgICAgIHNwZWNpZmllcywgaWYgdGhlIG1vZHVsZXMgbm90IG1hdGNoaW5nIGFueSBwcmVkZWZpbmVkIGNhdGVnb3J5IHNob3VsZCBiZSBhbHNvIGEgIgorICAgICAgICAgICAgICAgICsgInBhcnQgb2YgdGhlIG91dHB1dC4gSWYgc2V0IHRvIHRydWUsIHBsdWdpbiBnZW5lcmF0ZXMgYSB0YWJsZSBmb3IgY2F0ZWdvcnkgY2FsbGVkICdPdGhlcicgYXQgdGhlIGVuZC4iKTsKKyAgICAgICAgbG9nLmluZm8oIiIpOworICAgICAgICBsb2cuaW5mbygiIik7CisgICAgICAgIGxvZy5pbmZvKCJUQVJHRVRTOiIpOworICAgICAgICBsb2cuaW5mbygiICBnZW5lcmF0ZSAtIG1haW4gdGFyZ2V0LCBnZW5lcmF0ZXMgdGhlIGRvY2Jvb2sgb3V0cHV0IGZpbGUiKTsKKyAgICAgICAgbG9nLmluZm8oIiAgaGVscCAgICAgLSBkaXNwbGF5cyB0aGlzIGhlbHAgbWVzc2FnZSIpOworICAgIH0KKworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyB2b2lkIHNldExvZyhvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5sb2dnaW5nLkxvZyBsb2cpIHsKKyAgICAgICAgdGhpcy5sb2cgPSBsb2c7CisgICAgfQorCit9CmRpZmYgLS1naXQgYS90b29scy9qZXJzZXktZG9jLW1vZHVsZWxpc3QtbWF2ZW4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvdG9vbHMvcGx1Z2lucy9QcmVkZWZpbmVkQ2F0ZWdvcmllcy5qYXZhIGIvdG9vbHMvamVyc2V5LWRvYy1tb2R1bGVsaXN0LW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rvb2xzL3BsdWdpbnMvUHJlZGVmaW5lZENhdGVnb3JpZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGM2YTJlCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvamVyc2V5LWRvYy1tb2R1bGVsaXN0LW1hdmVuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3Rvb2xzL3BsdWdpbnMvUHJlZGVmaW5lZENhdGVnb3JpZXMuamF2YQpAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDEzLCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnRvb2xzLnBsdWdpbnM7CisKKy8qKgorICogSmVyc2V5IG1vZHVsZSBjYXRlZ29yaWVzIGRlZmluaXRpb24uCisgKiBUaGUgY2F0ZWdvcmllcyBhcmUgYmFzZWQgb24gbWF2ZW4gZ3JvdXBJZCwgdGhpcyBlbnVtIGFzc2lnbnMgdG8gZWFjaCAia25vd24iIGdyb3VwSWQgYSBodW1hbi1yZWFkYWJsZSBjYXB0aW9uCisgKgorICogQGF1dGhvciBBZGFtIExpbmRlbnRoYWwgKGFkYW0ubGluZGVudGhhbCBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgZW51bSBQcmVkZWZpbmVkQ2F0ZWdvcmllcyB7CisgICAgQ09SRSgib3JnLmdsYXNzZmlzaC5qZXJzZXkuY29yZSIsICJKZXJzZXkgQ29yZSIpLAorICAgIENPTlRBSU5FUlMoIm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnMiLCAiSmVyc2V5IENvbnRhaW5lcnMiKSwKKyAgICBDT05ORUNUT1JTKCJvcmcuZ2xhc3NmaXNoLmplcnNleS5jb25uZWN0b3JzIiwgIkplcnNleSBDb25uZWN0b3JzIiksCisgICAgTUVESUEoIm9yZy5nbGFzc2Zpc2guamVyc2V5Lm1lZGlhIiwgIkplcnNleSBNZWRpYSIpLAorICAgIEVYVEVOU0lPTlMoIm9yZy5nbGFzc2Zpc2guamVyc2V5LmV4dCIsICJKZXJzZXkgRXh0ZW5zaW9ucyIpLAorICAgIFRFU1RfRlJBTUVXT1JLKCJvcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LWZyYW1ld29yayIsICJKZXJzZXkgVGVzdCBGcmFtZXdvcmsiKSwKKyAgICBURVNUX0ZSQU1FV09SS19QUk9WSURFUlMoIm9yZy5nbGFzc2Zpc2guamVyc2V5LnRlc3QtZnJhbWV3b3JrLnByb3ZpZGVycyIsICJKZXJzZXkgVGVzdCBGcmFtZXdvcmsgUHJvdmlkZXJzIiksCisgICAgR0xBU1NGSVNIX0JVTkRMRVMoIm9yZy5nbGFzc2Zpc2guamVyc2V5LmNvbnRhaW5lcnMuZ2xhc3NmaXNoIiwgIkplcnNleSBHbGFzc2Zpc2ggQnVuZGxlcyIpLAorICAgIFNFQ1VSSVRZKCJvcmcuZ2xhc3NmaXNoLmplcnNleS5zZWN1cml0eSIsICJTZWN1cml0eSIpLAorICAgIEVYQU1QTEVTKCJvcmcuZ2xhc3NmaXNoLmplcnNleS5leGFtcGxlcyIsICJKZXJzZXkgRXhhbXBsZXMiKTsKKworICAgIHByaXZhdGUgU3RyaW5nIGdyb3VwSWQ7CisgICAgcHJpdmF0ZSBTdHJpbmcgY2FwdGlvbjsKKworICAgIHByaXZhdGUgUHJlZGVmaW5lZENhdGVnb3JpZXMoU3RyaW5nIGdyb3VwSWQsIFN0cmluZyBjYXB0aW9uKSB7CisgICAgICAgIHRoaXMuZ3JvdXBJZCA9IGdyb3VwSWQ7CisgICAgICAgIHRoaXMuY2FwdGlvbiA9IGNhcHRpb247CisgICAgfQorCisgICAgcHVibGljIFN0cmluZyBnZXRDYXB0aW9uKCkgeworICAgICAgICByZXR1cm4gdGhpcy5jYXB0aW9uOworICAgIH0KKworICAgIHB1YmxpYyBTdHJpbmcgZ2V0R3JvdXBJZCgpIHsKKyAgICAgICAgcmV0dXJuIHRoaXMuZ3JvdXBJZDsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmdGVzdC1hZ2VudC9wb20ueG1sIGIvdG9vbHMvcGVyZnRlc3QtYWdlbnQvcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTZjNTU2Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZnRlc3QtYWdlbnQvcG9tLnhtbApAQCAtMCwwICsxLDk0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLQorCisgICAgQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisKKyAgICBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUKKyAgICB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICAgIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLTIuMC4KKworICAgIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAgICBMaWNlbnNlcyB3aGVuIHRoZSBjb25kaXRpb25zIGZvciBzdWNoIGF2YWlsYWJpbGl0eSBzZXQgZm9ydGggaW4gdGhlCisgICAgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAgYXJlIHNhdGlzZmllZDogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCisgICAgdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAgICBodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2NsYXNzcGF0aC9saWNlbnNlLmh0bWwuCisKKyAgICBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKworLS0+CisKKzxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KKyAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+CisKKyAgICA8Z3JvdXBJZD5vcmcuZ2xhc3NmaXNoLmplcnNleS50ZXN0LnBlcmZvcm1hbmNlLmFnZW50PC9ncm91cElkPgorICAgIDxhcnRpZmFjdElkPmplcnNleS1wZXJmdGVzdC1hZ2VudDwvYXJ0aWZhY3RJZD4KKyAgICA8dmVyc2lvbj4wLjE8L3ZlcnNpb24+CisgICAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KKworICAgIDxuYW1lPmplcnNleS1wZXJmdGVzdC1hZ2VudDwvbmFtZT4KKworICAgIDxwcm9wZXJ0aWVzPgorICAgICAgICA8cHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz5VVEYtODwvcHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz4KKyAgICA8L3Byb3BlcnRpZXM+CisKKyAgICA8ZGVwZW5kZW5jaWVzPgorICAgICAgICA8ZGVwZW5kZW5jeT4KKyAgICAgICAgICAgIDxncm91cElkPm9yZy5qYXZhc3Npc3Q8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qYXZhc3Npc3Q8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4zLjE0LjAtR0E8L3ZlcnNpb24+CisgICAgICAgIDwvZGVwZW5kZW5jeT4KKyAgICAgICAgPGRlcGVuZGVuY3k+CisgICAgICAgICAgICA8Z3JvdXBJZD5pby5kcm9wd2l6YXJkLm1ldHJpY3M8L2dyb3VwSWQ+CisgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tZXRyaWNzLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICAgICAgICA8dmVyc2lvbj4zLjEuMDwvdmVyc2lvbj4KKyAgICAgICAgPC9kZXBlbmRlbmN5PgorICAgIDwvZGVwZW5kZW5jaWVzPgorCisgICAgPGJ1aWxkPgorICAgICAgICA8cGx1Z2lucz4KKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamFyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KKyAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjU8L3ZlcnNpb24+CisgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+CisgICAgICAgICAgICAgICAgICAgIDxhcmNoaXZlPgorICAgICAgICAgICAgICAgICAgICAgICAgPG1hbmlmZXN0RW50cmllcz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8UHJlbWFpbi1DbGFzcz5vcmcuZ2xhc3NmaXNoLmplcnNleS5wZXJmdGVzdC5hZ2VudC5QZXJmVGVzdEFnZW50PC9QcmVtYWluLUNsYXNzPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDYW4tUmV0cmFuc2Zvcm0tQ2xhc3Nlcz50cnVlPC9DYW4tUmV0cmFuc2Zvcm0tQ2xhc3Nlcz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvbWFuaWZlc3RFbnRyaWVzPgorICAgICAgICAgICAgICAgICAgICA8L2FyY2hpdmU+CisgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgPC9wbHVnaW4+CisKKyAgICAgICAgICAgIDxwbHVnaW4+CisgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc2hhZGUtcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KKyAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5wYWNrYWdlPC9waGFzZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5zaGFkZTwvZ29hbD4KKyAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+CisgICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cmVsb2NhdGlvbnM+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWxvY2F0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdHRlcm4+b3JnLnNsZjRqPC9wYXR0ZXJuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYWRlZFBhdHRlcm4+YWdlbnQub3JnLnNsZjRqPC9zaGFkZWRQYXR0ZXJuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlbG9jYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWxvY2F0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdHRlcm4+Y29tLmNvZGFoYWxlLm1ldHJpY3M8L3BhdHRlcm4+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hhZGVkUGF0dGVybj5hZ2VudC5tZXRyaWNzPC9zaGFkZWRQYXR0ZXJuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlbG9jYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyZWxvY2F0aW9uPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhdHRlcm4+amF2YXNzaXN0PC9wYXR0ZXJuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNoYWRlZFBhdHRlcm4+YWdlbnQuamF2YXNzaXN0PC9zaGFkZWRQYXR0ZXJuPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3JlbG9jYXRpb24+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9yZWxvY2F0aW9ucz4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Y3JlYXRlRGVwZW5kZW5jeVJlZHVjZWRQb20+ZmFsc2U8L2NyZWF0ZURlcGVuZGVuY3lSZWR1Y2VkUG9tPgorICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KKyAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+CisgICAgICAgICAgICA8L3BsdWdpbj4KKyAgICAgICAgPC9wbHVnaW5zPgorICAgIDwvYnVpbGQ+Cis8L3Byb2plY3Q+CmRpZmYgLS1naXQgYS90b29scy9wZXJmdGVzdC1hZ2VudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3BlcmZ0ZXN0L2FnZW50L1BlcmZUZXN0QWdlbnQuamF2YSBiL3Rvb2xzL3BlcmZ0ZXN0LWFnZW50L3NyYy9tYWluL2phdmEvb3JnL2dsYXNzZmlzaC9qZXJzZXkvcGVyZnRlc3QvYWdlbnQvUGVyZlRlc3RBZ2VudC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1NzRmNzMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmdGVzdC1hZ2VudC9zcmMvbWFpbi9qYXZhL29yZy9nbGFzc2Zpc2gvamVyc2V5L3BlcmZ0ZXN0L2FnZW50L1BlcmZUZXN0QWdlbnQuamF2YQpAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IChjKSAyMDE1LCAyMDE4IE9yYWNsZSBhbmQvb3IgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisgKgorICogVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlCisgKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2LiAyLjAsIHdoaWNoIGlzIGF2YWlsYWJsZSBhdAorICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtMi4wLgorICoKKyAqIFRoaXMgU291cmNlIENvZGUgbWF5IGFsc28gYmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIGZvbGxvd2luZyBTZWNvbmRhcnkKKyAqIExpY2Vuc2VzIHdoZW4gdGhlIGNvbmRpdGlvbnMgZm9yIHN1Y2ggYXZhaWxhYmlsaXR5IHNldCBmb3J0aCBpbiB0aGUKKyAqIEVjbGlwc2UgUHVibGljIExpY2Vuc2Ugdi4gMi4wIGFyZSBzYXRpc2ZpZWQ6IEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLAorICogdmVyc2lvbiAyIHdpdGggdGhlIEdOVSBDbGFzc3BhdGggRXhjZXB0aW9uLCB3aGljaCBpcyBhdmFpbGFibGUgYXQKKyAqIGh0dHBzOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvY2xhc3NwYXRoL2xpY2Vuc2UuaHRtbC4KKyAqCisgKiBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMCBPUiBHUEwtMi4wIFdJVEggQ2xhc3NwYXRoLWV4Y2VwdGlvbi0yLjAKKyAqLworCitwYWNrYWdlIG9yZy5nbGFzc2Zpc2guamVyc2V5LnBlcmZ0ZXN0LmFnZW50OworCitpbXBvcnQgamF2YS5sYW5nLmluc3RydW1lbnQuQ2xhc3NGaWxlVHJhbnNmb3JtZXI7CitpbXBvcnQgamF2YS5sYW5nLmluc3RydW1lbnQuSWxsZWdhbENsYXNzRm9ybWF0RXhjZXB0aW9uOworaW1wb3J0IGphdmEubGFuZy5pbnN0cnVtZW50Lkluc3RydW1lbnRhdGlvbjsKKworaW1wb3J0IGphdmEuc2VjdXJpdHkuUHJvdGVjdGlvbkRvbWFpbjsKKworaW1wb3J0IGphdmFzc2lzdC5DbGFzc1Bvb2w7CitpbXBvcnQgamF2YXNzaXN0LkN0Q2xhc3M7CitpbXBvcnQgamF2YXNzaXN0LkN0RmllbGQ7CitpbXBvcnQgamF2YXNzaXN0LkN0TWV0aG9kOworCisvKioKKyAqIEphdmEgYWdlbnQgdGhhdCBpbnN0cnVtZW50cyBhbnkgSmVyc2V5IDIgQXBwbGljYXRpb25IYW5kbGVyIGZvdW5kIHdpdGggYSBuZXcKKyAqIE1ldHJpY3MgdGltZXIuIElmIHBhcmFtZXRlciBpcyBnaXZlbiwgaXQgd2lsbCBiZSB1bmRlcnN0b29kIGFzIGFub3RoZXIgY2xhc3MubWV0aG9kCisgKiAoZGVsaW1pdGVkIGJ5IGEgc2luZ2xlIGRvdCkgdGhhdCBoYXMgdG8gYmUgaW5zdHJ1bWVudGVkIGluc3RlYWQgb2YgdGhlIEplcnNleSBoYW5kbGVyLgorICoKKyAqIFRoaXMgb25lIGhhcyBiZWVuIHRlc3RlZCB3aXRoIEdyaXp6bHkgMiwgQ2F0YWxpbmEgYW5kIFdMUy4KKyAqCisgKiBAYXV0aG9yIEpha3ViIFBvZGxlc2FrIChqYWt1Yi5wb2RsZXNhayBhdCBvcmFjbGUuY29tKQorICovCitwdWJsaWMgY2xhc3MgUGVyZlRlc3RBZ2VudCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSEFORExFUl9DTEFTU19OQU1FID0gIm9yZy5nbGFzc2Zpc2guamVyc2V5LnNlcnZlci5BcHBsaWNhdGlvbkhhbmRsZXIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBIQU5ETEVSX01FVEhPRF9OQU1FID0gImhhbmRsZSI7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgcHJlbWFpbihTdHJpbmcgYWdlbnRBcmdzLCBJbnN0cnVtZW50YXRpb24gaW5zdHJ1bWVudGF0aW9uKSB7CisKKyAgICAgICAgZmluYWwgU3RyaW5nIGhhbmRsZXJDbGFzc05hbWUgPSAoYWdlbnRBcmdzICE9IG51bGwgJiYgIWFnZW50QXJncy5pc0VtcHR5KCkpID8gYWdlbnRBcmdzLnN1YnN0cmluZygwLCBhZ2VudEFyZ3MubGFzdEluZGV4T2YoJy4nKSkgOiBIQU5ETEVSX0NMQVNTX05BTUU7CisgICAgICAgIGZpbmFsIFN0cmluZyBoYW5kbGVyTWV0aG9kTmFtZSA9IChhZ2VudEFyZ3MgIT0gbnVsbCAmJiAhYWdlbnRBcmdzLmlzRW1wdHkoKSkgPyBhZ2VudEFyZ3Muc3Vic3RyaW5nKGFnZW50QXJncy5sYXN0SW5kZXhPZignLicpICsgMSkgOiBIQU5ETEVSX01FVEhPRF9OQU1FOworCisgICAgICAgIGluc3RydW1lbnRhdGlvbi5hZGRUcmFuc2Zvcm1lcihuZXcgQ2xhc3NGaWxlVHJhbnNmb3JtZXIoKSB7CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJ5dGVbXSB0cmFuc2Zvcm0oQ2xhc3NMb2FkZXIgbG9hZGVyLCBTdHJpbmcgY2xhc3NOYW1lLCBDbGFzczw/PiBhQ2xhc3MsIFByb3RlY3Rpb25Eb21haW4gcHJvdGVjdGlvbkRvbWFpbiwgYnl0ZVtdIGJ5dGVzKSB0aHJvd3MgSWxsZWdhbENsYXNzRm9ybWF0RXhjZXB0aW9uIHsKKyAgICAgICAgICAgICAgICBpZiAoaGFuZGxlckNsYXNzTmFtZS5yZXBsYWNlQWxsKCJcXC4iLCAiLyIpLmVxdWFscyhjbGFzc05hbWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc1Bvb2wgY3AgPSBDbGFzc1Bvb2wuZ2V0RGVmYXVsdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgY3AuYXBwZW5kU3lzdGVtUGF0aCgpOworICAgICAgICAgICAgICAgICAgICAgICAgQ3RDbGFzcyBjYyA9IGNwLm1ha2VDbGFzcyhuZXcgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcykpOworCisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDdEZpZWxkIGN0eEZpZWxkID0gQ3RGaWVsZC5tYWtlKCJwdWJsaWMgc3RhdGljIGZpbmFsIGFnZW50Lm1ldHJpY3MuVGltZXIuQ29udGV4dCBhZ2VudFRpbWVyQ3R4OyIsIGNjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEN0RmllbGQgcmVnaXN0cnlGaWVsZCA9IEN0RmllbGQubWFrZSgicHVibGljIHN0YXRpYyBmaW5hbCBhZ2VudC5tZXRyaWNzLk1ldHJpY1JlZ2lzdHJ5IGFnZW50UkVHID0gbmV3IGFnZW50Lm1ldHJpY3MuTWV0cmljUmVnaXN0cnkoKTsiLCBjYyk7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDdEZpZWxkIHJlcG9ydGVyRmllbGQgPSBDdEZpZWxkLm1ha2UoInB1YmxpYyBzdGF0aWMgZmluYWwgYWdlbnQubWV0cmljcy5KbXhSZXBvcnRlciBhZ2VudFJlcG9ydGVyID0gYWdlbnQubWV0cmljcy5KbXhSZXBvcnRlci5mb3JSZWdpc3RyeShhZ2VudFJFRykuYnVpbGQoKTsiLCBjYyk7CisgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDdEZpZWxkIHRpbWVyRmllbGQgPSBDdEZpZWxkLm1ha2UoInB1YmxpYyBzdGF0aWMgZmluYWwgYWdlbnQubWV0cmljcy5UaW1lciBhZ2VudFRpbWVyID0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJhZ2VudFJFRy50aW1lcihhZ2VudC5tZXRyaWNzLk1ldHJpY1JlZ2lzdHJ5Lm5hbWUoXCIiICsgaGFuZGxlckNsYXNzTmFtZSArICJcIiwgbmV3IFN0cmluZ1tdIHtcIiIgKyBoYW5kbGVyTWV0aG9kTmFtZSArICJcIn0pKTsiLCBjYyk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYy5hZGRGaWVsZChyZWdpc3RyeUZpZWxkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNjLmFkZEZpZWxkKHJlcG9ydGVyRmllbGQpOworICAgICAgICAgICAgICAgICAgICAgICAgY2MuYWRkRmllbGQodGltZXJGaWVsZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjYy5tYWtlQ2xhc3NJbml0aWFsaXplcigpLmluc2VydEFmdGVyKCJhZ2VudFJlcG9ydGVyLnN0YXJ0KCk7Iik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIEN0TWV0aG9kIG0gPSBjYy5nZXREZWNsYXJlZE1ldGhvZChoYW5kbGVyTWV0aG9kTmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtLmFkZExvY2FsVmFyaWFibGUoImFnZW50Q3R4IiwgY3R4RmllbGQuZ2V0VHlwZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG0uaW5zZXJ0QmVmb3JlKCJhZ2VudEN0eCA9IGFnZW50VGltZXIudGltZSgpOyIpOworICAgICAgICAgICAgICAgICAgICAgICAgbS5pbnNlcnRBZnRlcigiYWdlbnRDdHguc3RvcCgpOyIsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGJ5dGVDb2RlID0gY2MudG9CeXRlY29kZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgY2MuZGV0YWNoKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW0ub3V0LnByaW50ZigiSmVyc2V5IFBlcmYgQWdlbnQgSW5zdHJ1bWVudGF0aW9uIERvbmUhIChpbnN0cnVtZW50ZWQgbWV0aG9kOiAlcylcbiIsIG0uZ2V0TG9uZ05hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnl0ZUNvZGU7CisgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXgucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KK30K